From 2a1485a2855c9c4dd76021e7cc7e37e5c13a79c2 Mon Sep 17 00:00:00 2001 From: tharangar Date: Thu, 7 Feb 2019 16:16:07 +0530 Subject: [PATCH 1/7] Convert webmail to https --- copper-server/core/README.md | 66 + copper-server/core/homail.yaml | 77 + copper-server/core/ingress.yaml | 42 + copper-server/core/rainloop/Dockerfile | 152 + copper-server/core/rainloop/README.md | 57 + .../core/rainloop/app/data/INSTALLED | 1 + copper-server/core/rainloop/app/data/SALT.php | 1 + copper-server/core/rainloop/app/data/VERSION | 1 + .../23e3d58cd184245411d2a84bf33e57162799021f} | 0 .../3e18609e097b6278b6c17fa9dd6de9db3a729b67 | 1 + .../5b1c51ed23b96bde49c865e074352dc9b29808f0 | 1 + .../9c2bfd930fad89419786b5bc0199a4eafd8fe4c8 | 1 + .../b82792fad72d7b38639e5fc82c113102969af8b7} | 2 +- .../_data_/_default_/configs/application.ini | 356 + .../plugin-directadmin-change-password.ini | 6 + .../configs/plugin-ldap-change-password.ini | 9 + .../domains/copper.opensource.lk.ini | 16 + .../domains/coppermail.dyndns.org.ini | 16 + .../data/_data_/_default_/domains/disabled | 1 + .../_data_/_default_/domains/gmail.com.ini | 7 + .../_data_/_default_/domains/outlook.com.ini | 7 + .../data/_data_/_default_/domains/qq.com.ini | 7 + .../_data_/_default_/domains/yahoo.com.ini | 7 + .../ChangePasswordLdapDriver.php | 230 + .../plugins/ldap-change-password/LICENSE | 20 + .../plugins/ldap-change-password/README | 1 + .../plugins/ldap-change-password/VERSION | 1 + .../plugins/ldap-change-password/index.php | 79 + .../settings_local | 1 + .../settings_local | 1 + .../settings_local | 1 + .../settings_local | 1 + .../settings_local | 1 + .../lsf@copper.opensource.lk/settings_local | 1 + .../cfg/ls/lsf@coppermail.dyndns.org/settings | 1 + .../lsf@coppermail.dyndns.org/settings_local | 1 + .../settings_local | 1 + .../supun@copper.opensource.lk/settings_local | 1 + .../test@copper.opensource.lk/settings_local | 1 + .../test@coppermail.dyndns.org/settings_local | 1 + .../settings_local | 1 + .../ef/efaeb36a60ef9682802c6a704c2d784d | 1 + .../38871f9f7a2ad0d70b1e51991143db90bfbbb3c2 | 1 + .../aa6bc308dedb13d95e120aafb590f4645301f8cd | 1 + .../core/rainloop/app/data/index.html | 1 + .../core/rainloop/app/data/index.php | 1 + copper-server/core/rainloop/app/index.php | 19 + .../v/1.12.0/app/domains/default.ini.dist | 7 + .../rainloop/v/1.12.0/app/domains/disabled | 1 + .../v/1.12.0/app/domains/gmail.com.ini | 7 + .../v/1.12.0/app/domains/outlook.com.ini | 7 + .../rainloop/v/1.12.0/app/domains/qq.com.ini | 7 + .../v/1.12.0/app/domains/yahoo.com.ini | 7 + .../app/rainloop/v/1.12.0/app/handle.php | 103 + .../Facebook/Authentication/AccessToken.php | 160 + .../Authentication/AccessTokenMetadata.php | 390 + .../Facebook/Authentication/OAuth2Client.php | 292 + .../FacebookAuthenticationException.php | 33 + .../FacebookAuthorizationException.php | 33 + .../Exceptions/FacebookClientException.php | 33 + .../Exceptions/FacebookOtherException.php | 33 + .../Exceptions/FacebookResponseException.php | 208 + .../Exceptions/FacebookSDKException.php | 33 + .../Exceptions/FacebookServerException.php | 33 + .../Exceptions/FacebookThrottleException.php | 33 + .../app/libraries/Facebook/Facebook.php | 589 + .../app/libraries/Facebook/FacebookApp.php | 101 + .../Facebook/FacebookBatchRequest.php | 303 + .../Facebook/FacebookBatchResponse.php | 154 + .../app/libraries/Facebook/FacebookClient.php | 250 + .../libraries/Facebook/FacebookRequest.php | 536 + .../libraries/Facebook/FacebookResponse.php | 410 + .../Facebook/FileUpload/FacebookFile.php | 135 + .../Facebook/FileUpload/FacebookVideo.php | 33 + .../Facebook/FileUpload/Mimetypes.php | 987 ++ .../Facebook/GraphNodes/Collection.php | 242 + .../Facebook/GraphNodes/GraphAchievement.php | 113 + .../Facebook/GraphNodes/GraphAlbum.php | 183 + .../Facebook/GraphNodes/GraphApplication.php | 43 + .../Facebook/GraphNodes/GraphCoverPhoto.php | 72 + .../Facebook/GraphNodes/GraphEdge.php | 260 + .../Facebook/GraphNodes/GraphEvent.php | 242 + .../Facebook/GraphNodes/GraphGroup.php | 171 + .../Facebook/GraphNodes/GraphList.php | 36 + .../Facebook/GraphNodes/GraphLocation.php | 102 + .../Facebook/GraphNodes/GraphNode.php | 185 + .../Facebook/GraphNodes/GraphNodeFactory.php | 392 + .../Facebook/GraphNodes/GraphObject.php | 36 + .../GraphNodes/GraphObjectFactory.php | 86 + .../Facebook/GraphNodes/GraphPage.php | 125 + .../Facebook/GraphNodes/GraphPicture.php | 72 + .../Facebook/GraphNodes/GraphSessionInfo.php | 102 + .../Facebook/GraphNodes/GraphUser.php | 162 + .../Facebook/Helpers/FacebookCanvasHelper.php | 52 + .../Helpers/FacebookJavaScriptHelper.php | 42 + .../Helpers/FacebookPageTabHelper.php | 95 + .../Helpers/FacebookRedirectLoginHelper.php | 360 + .../FacebookSignedRequestFromInputHelper.php | 166 + .../Facebook/Http/GraphRawResponse.php | 137 + .../Facebook/Http/RequestBodyInterface.php | 39 + .../Facebook/Http/RequestBodyMultipart.php | 170 + .../Facebook/Http/RequestBodyUrlEncoded.php | 55 + .../Facebook/HttpClients/FacebookCurl.php | 129 + .../HttpClients/FacebookCurlHttpClient.php | 210 + .../HttpClients/FacebookGuzzleHttpClient.php | 97 + .../FacebookHttpClientInterface.php | 47 + .../Facebook/HttpClients/FacebookStream.php | 80 + .../HttpClients/FacebookStreamHttpClient.php | 94 + .../certs/DigiCertHighAssuranceEVRootCA.pem | 23 + .../FacebookMemoryPersistentDataHandler.php | 53 + .../FacebookSessionPersistentDataHandler.php | 76 + .../PersistentDataInterface.php | 49 + .../McryptPseudoRandomStringGenerator.php | 68 + .../OpenSslPseudoRandomStringGenerator.php | 67 + .../PseudoRandomStringGeneratorInterface.php | 45 + .../PseudoRandomStringGeneratorTrait.php | 58 + .../UrandomPseudoRandomStringGenerator.php | 89 + .../app/libraries/Facebook/SignedRequest.php | 332 + .../Url/FacebookUrlDetectionHandler.php | 163 + .../Facebook/Url/FacebookUrlManipulator.php | 167 + .../Facebook/Url/UrlDetectionInterface.php | 39 + .../app/libraries/Facebook/autoload.php | 79 + .../GuzzleHttp/Adapter/AdapterInterface.php | 23 + .../GuzzleHttp/Adapter/Curl/BatchContext.php | 158 + .../GuzzleHttp/Adapter/Curl/CurlAdapter.php | 142 + .../GuzzleHttp/Adapter/Curl/CurlFactory.php | 331 + .../GuzzleHttp/Adapter/Curl/MultiAdapter.php | 284 + .../Adapter/Curl/RequestMediator.php | 130 + .../Adapter/FakeParallelAdapter.php | 34 + .../GuzzleHttp/Adapter/MockAdapter.php | 60 + .../Adapter/ParallelAdapterInterface.php | 23 + .../GuzzleHttp/Adapter/StreamAdapter.php | 347 + .../Adapter/StreamingProxyAdapter.php | 36 + .../GuzzleHttp/Adapter/Transaction.php | 49 + .../Adapter/TransactionInterface.php | 35 + .../Adapter/TransactionIterator.php | 73 + .../app/libraries/GuzzleHttp/Client.php | 364 + .../libraries/GuzzleHttp/ClientInterface.php | 179 + .../app/libraries/GuzzleHttp/Collection.php | 265 + .../libraries/GuzzleHttp/Cookie/CookieJar.php | 249 + .../GuzzleHttp/Cookie/CookieJarInterface.php | 76 + .../GuzzleHttp/Cookie/FileCookieJar.php | 85 + .../GuzzleHttp/Cookie/SessionCookieJar.php | 65 + .../libraries/GuzzleHttp/Cookie/SetCookie.php | 410 + .../GuzzleHttp/Event/AbstractEvent.php | 21 + .../GuzzleHttp/Event/AbstractRequestEvent.php | 49 + .../Event/AbstractTransferEvent.php | 83 + .../GuzzleHttp/Event/BeforeEvent.php | 26 + .../GuzzleHttp/Event/CompleteEvent.php | 35 + .../libraries/GuzzleHttp/Event/Emitter.php | 147 + .../GuzzleHttp/Event/EmitterInterface.php | 88 + .../libraries/GuzzleHttp/Event/ErrorEvent.php | 65 + .../GuzzleHttp/Event/EventInterface.php | 24 + .../GuzzleHttp/Event/HasEmitterInterface.php | 16 + .../GuzzleHttp/Event/HasEmitterTrait.php | 21 + .../GuzzleHttp/Event/HeadersEvent.php | 39 + .../Event/ListenerAttacherTrait.php | 89 + .../GuzzleHttp/Event/RequestEvents.php | 162 + .../GuzzleHttp/Event/SubscriberInterface.php | 31 + .../GuzzleHttp/Exception/AdapterException.php | 5 + .../Exception/BadResponseException.php | 8 + .../GuzzleHttp/Exception/ClientException.php | 8 + .../CouldNotRewindStreamException.php | 5 + .../GuzzleHttp/Exception/ParseException.php | 32 + .../GuzzleHttp/Exception/RequestException.php | 124 + .../GuzzleHttp/Exception/ServerException.php | 8 + .../Exception/TooManyRedirectsException.php | 5 + .../Exception/TransferException.php | 5 + .../app/libraries/GuzzleHttp/HasDataTrait.php | 76 + .../GuzzleHttp/Message/AbstractMessage.php | 237 + .../GuzzleHttp/Message/MessageFactory.php | 345 + .../Message/MessageFactoryInterface.php | 71 + .../GuzzleHttp/Message/MessageInterface.php | 148 + .../GuzzleHttp/Message/MessageParser.php | 172 + .../libraries/GuzzleHttp/Message/Request.php | 216 + .../GuzzleHttp/Message/RequestInterface.php | 150 + .../libraries/GuzzleHttp/Message/Response.php | 202 + .../GuzzleHttp/Message/ResponseInterface.php | 86 + .../app/libraries/GuzzleHttp/Mimetypes.php | 964 ++ .../GuzzleHttp/Post/MultipartBody.php | 292 + .../libraries/GuzzleHttp/Post/PostBody.php | 282 + .../GuzzleHttp/Post/PostBodyInterface.php | 129 + .../libraries/GuzzleHttp/Post/PostFile.php | 138 + .../GuzzleHttp/Post/PostFileInterface.php | 42 + .../1.12.0/app/libraries/GuzzleHttp/Query.php | 226 + .../GuzzleHttp/Subscriber/Cookie.php | 59 + .../GuzzleHttp/Subscriber/History.php | 138 + .../GuzzleHttp/Subscriber/HttpError.php | 34 + .../libraries/GuzzleHttp/Subscriber/Mock.php | 143 + .../GuzzleHttp/Subscriber/Prepare.php | 136 + .../GuzzleHttp/Subscriber/Redirect.php | 172 + .../libraries/GuzzleHttp/ToArrayInterface.php | 16 + .../app/libraries/GuzzleHttp/UriTemplate.php | 242 + .../v/1.12.0/app/libraries/GuzzleHttp/Url.php | 585 + .../app/libraries/GuzzleHttp/cacert.pem | 3866 ++++++ .../app/libraries/GuzzleHttp/functions.php | 325 + .../Imagine/Draw/DrawerInterface.php | 149 + .../Imagine/Effects/EffectsInterface.php | 80 + .../libraries/Imagine/Exception/Exception.php | 19 + .../Exception/InvalidArgumentException.php | 19 + .../Exception/NotSupportedException.php | 19 + .../Exception/OutOfBoundsException.php | 19 + .../Imagine/Exception/RuntimeException.php | 19 + .../Imagine/Filter/Advanced/Border.php | 98 + .../Imagine/Filter/Advanced/Canvas.php | 74 + .../Imagine/Filter/Advanced/Grayscale.php | 30 + .../Imagine/Filter/Advanced/OnPixelBased.php | 57 + .../Filter/Advanced/RelativeResize.php | 50 + .../Imagine/Filter/Basic/ApplyMask.php | 42 + .../Imagine/Filter/Basic/Autorotate.php | 87 + .../libraries/Imagine/Filter/Basic/Copy.php | 29 + .../libraries/Imagine/Filter/Basic/Crop.php | 54 + .../libraries/Imagine/Filter/Basic/Fill.php | 43 + .../Imagine/Filter/Basic/FlipHorizontally.php | 29 + .../Imagine/Filter/Basic/FlipVertically.php | 29 + .../libraries/Imagine/Filter/Basic/Paste.php | 53 + .../libraries/Imagine/Filter/Basic/Resize.php | 48 + .../libraries/Imagine/Filter/Basic/Rotate.php | 52 + .../libraries/Imagine/Filter/Basic/Save.php | 51 + .../libraries/Imagine/Filter/Basic/Show.php | 51 + .../libraries/Imagine/Filter/Basic/Strip.php | 29 + .../Imagine/Filter/Basic/Thumbnail.php | 59 + .../Imagine/Filter/Basic/WebOptimization.php | 57 + .../Imagine/Filter/FilterInterface.php | 30 + .../libraries/Imagine/Filter/ImagineAware.php | 54 + .../Imagine/Filter/Transformation.php | 240 + .../app/libraries/Imagine/Gd/Drawer.php | 333 + .../app/libraries/Imagine/Gd/Effects.php | 109 + .../1.12.0/app/libraries/Imagine/Gd/Font.php | 41 + .../1.12.0/app/libraries/Imagine/Gd/Image.php | 735 + .../app/libraries/Imagine/Gd/Imagine.php | 195 + .../app/libraries/Imagine/Gd/Layers.php | 144 + .../app/libraries/Imagine/Gmagick/Drawer.php | 356 + .../app/libraries/Imagine/Gmagick/Effects.php | 106 + .../app/libraries/Imagine/Gmagick/Font.php | 63 + .../app/libraries/Imagine/Gmagick/Image.php | 786 ++ .../app/libraries/Imagine/Gmagick/Imagine.php | 167 + .../app/libraries/Imagine/Gmagick/Layers.php | 272 + .../libraries/Imagine/Image/AbstractFont.php | 75 + .../libraries/Imagine/Image/AbstractImage.php | 120 + .../Imagine/Image/AbstractImagine.php | 79 + .../Imagine/Image/AbstractLayers.php | 61 + .../app/libraries/Imagine/Image/Box.php | 122 + .../libraries/Imagine/Image/BoxInterface.php | 94 + .../Imagine/Image/Fill/FillInterface.php | 30 + .../Image/Fill/Gradient/Horizontal.php | 28 + .../Imagine/Image/Fill/Gradient/Linear.php | 95 + .../Imagine/Image/Fill/Gradient/Vertical.php | 28 + .../libraries/Imagine/Image/FontInterface.php | 51 + .../Imagine/Image/Histogram/Bucket.php | 56 + .../Imagine/Image/Histogram/Range.php | 56 + .../Imagine/Image/ImageInterface.php | 173 + .../Imagine/Image/ImagineInterface.php | 83 + .../Imagine/Image/LayersInterface.php | 107 + .../Imagine/Image/ManipulatorInterface.php | 181 + .../Image/Metadata/AbstractMetadataReader.php | 101 + .../Image/Metadata/DefaultMetadataReader.php | 42 + .../Image/Metadata/ExifMetadataReader.php | 114 + .../Imagine/Image/Metadata/MetadataBag.php | 97 + .../Metadata/MetadataReaderInterface.php | 48 + .../libraries/Imagine/Image/Palette/CMYK.php | 118 + .../Imagine/Image/Palette/Color/CMYK.php | 219 + .../Image/Palette/Color/ColorInterface.php | 95 + .../Imagine/Image/Palette/Color/Gray.php | 164 + .../Imagine/Image/Palette/Color/RGB.php | 214 + .../Imagine/Image/Palette/ColorParser.php | 153 + .../Imagine/Image/Palette/Grayscale.php | 123 + .../Image/Palette/PaletteInterface.php | 87 + .../libraries/Imagine/Image/Palette/RGB.php | 129 + .../app/libraries/Imagine/Image/Point.php | 88 + .../libraries/Imagine/Image/Point/Center.php | 77 + .../Imagine/Image/PointInterface.php | 56 + .../app/libraries/Imagine/Image/Profile.php | 60 + .../Imagine/Image/ProfileInterface.php | 29 + .../app/libraries/Imagine/Imagick/Drawer.php | 404 + .../app/libraries/Imagine/Imagick/Effects.php | 113 + .../app/libraries/Imagine/Imagick/Font.php | 68 + .../app/libraries/Imagine/Imagick/Image.php | 880 ++ .../app/libraries/Imagine/Imagick/Imagine.php | 176 + .../app/libraries/Imagine/Imagick/Layers.php | 271 + .../app/libraries/MailSo/Base/Collection.php | 192 + .../app/libraries/MailSo/Base/Crypt.php | 189 + .../libraries/MailSo/Base/DateTimeHelper.php | 154 + .../MailSo/Base/Enumerations/Charset.php | 38 + .../MailSo/Base/Enumerations/Encoding.php | 33 + .../MailSo/Base/Exceptions/Exception.php | 33 + .../Exceptions/InvalidArgumentException.php | 19 + .../app/libraries/MailSo/Base/HtmlUtils.php | 1610 +++ .../1.12.0/app/libraries/MailSo/Base/Http.php | 800 ++ .../app/libraries/MailSo/Base/LinkFinder.php | 298 + .../app/libraries/MailSo/Base/Loader.php | 137 + .../MailSo/Base/ResourceRegistry.php | 125 + .../MailSo/Base/StreamWrappers/Binary.php | 411 + .../MailSo/Base/StreamWrappers/Literal.php | 194 + .../MailSo/Base/StreamWrappers/SubStreams.php | 250 + .../MailSo/Base/StreamWrappers/TempFile.php | 164 + .../MailSo/Base/StreamWrappers/Test.php | 138 + .../app/libraries/MailSo/Base/Utils.php | 2536 ++++ .../app/libraries/MailSo/Base/Validator.php | 100 + .../libraries/MailSo/Cache/CacheClient.php | 215 + .../MailSo/Cache/DriverInterface.php | 48 + .../libraries/MailSo/Cache/Drivers/APC.php | 107 + .../libraries/MailSo/Cache/Drivers/File.php | 153 + .../MailSo/Cache/Drivers/Memcache.php | 144 + .../libraries/MailSo/Cache/Drivers/Redis.php | 160 + .../v/1.12.0/app/libraries/MailSo/Config.php | 113 + .../v/1.12.0/app/libraries/MailSo/Hooks.php | 55 + .../libraries/MailSo/Imap/BodyStructure.php | 963 ++ .../MailSo/Imap/Enumerations/FetchType.php | 127 + .../Enumerations/FolderResponseStatus.php | 27 + .../MailSo/Imap/Enumerations/FolderStatus.php | 27 + .../MailSo/Imap/Enumerations/FolderType.php | 30 + .../MailSo/Imap/Enumerations/MessageFlag.php | 27 + .../Imap/Enumerations/ResponseStatus.php | 26 + .../MailSo/Imap/Enumerations/ResponseType.php | 25 + .../MailSo/Imap/Enumerations/StoreAction.php | 34 + .../MailSo/Imap/Exceptions/Exception.php | 19 + .../Exceptions/InvalidResponseException.php | 19 + .../LoginBadCredentialsException.php | 19 + .../Exceptions/LoginBadMethodException.php | 19 + .../MailSo/Imap/Exceptions/LoginException.php | 19 + .../Exceptions/NegativeResponseException.php | 37 + .../Imap/Exceptions/ResponseException.php | 57 + .../Exceptions/ResponseNotFoundException.php | 19 + .../Imap/Exceptions/RuntimeException.php | 19 + .../libraries/MailSo/Imap/FetchResponse.php | 273 + .../app/libraries/MailSo/Imap/Folder.php | 193 + .../MailSo/Imap/FolderInformation.php | 112 + .../app/libraries/MailSo/Imap/ImapClient.php | 2667 ++++ .../libraries/MailSo/Imap/NamespaceResult.php | 132 + .../app/libraries/MailSo/Imap/Response.php | 104 + .../v/1.12.0/app/libraries/MailSo/LICENSE | 21 + .../app/libraries/MailSo/Log/Driver.php | 408 + .../libraries/MailSo/Log/Drivers/Callback.php | 83 + .../app/libraries/MailSo/Log/Drivers/File.php | 91 + .../libraries/MailSo/Log/Drivers/Inline.php | 89 + .../libraries/MailSo/Log/Drivers/Syslog.php | 81 + .../MailSo/Log/Enumerations/Type.php | 34 + .../app/libraries/MailSo/Log/Logger.php | 431 + .../app/libraries/MailSo/Mail/Attachment.php | 239 + .../MailSo/Mail/AttachmentCollection.php | 74 + .../MailSo/Mail/Exceptions/Exception.php | 19 + .../MailSo/Mail/Exceptions/NonEmptyFolder.php | 19 + .../Mail/Exceptions/RuntimeException.php | 19 + .../app/libraries/MailSo/Mail/Folder.php | 317 + .../MailSo/Mail/FolderCollection.php | 279 + .../app/libraries/MailSo/Mail/MailClient.php | 2677 ++++ .../app/libraries/MailSo/Mail/Message.php | 890 ++ .../MailSo/Mail/MessageCollection.php | 123 + .../v/1.12.0/app/libraries/MailSo/MailSo.php | 40 + .../app/libraries/MailSo/Mime/Attachment.php | 197 + .../MailSo/Mime/AttachmentCollection.php | 71 + .../app/libraries/MailSo/Mime/Email.php | 315 + .../libraries/MailSo/Mime/EmailCollection.php | 243 + .../app/libraries/MailSo/Mime/EmailDep.php | 339 + .../MailSo/Mime/Enumerations/Constants.php | 25 + .../MailSo/Mime/Enumerations/DkimStatus.php | 57 + .../MailSo/Mime/Enumerations/Header.php | 71 + .../Mime/Enumerations/MessagePriority.php | 24 + .../MailSo/Mime/Enumerations/MimeType.php | 36 + .../MailSo/Mime/Enumerations/Parameter.php | 27 + .../MailSo/Mime/Enumerations/Sensitivity.php | 25 + .../app/libraries/MailSo/Mime/Header.php | 319 + .../MailSo/Mime/HeaderCollection.php | 480 + .../app/libraries/MailSo/Mime/Message.php | 937 ++ .../app/libraries/MailSo/Mime/Parameter.php | 141 + .../MailSo/Mime/ParameterCollection.php | 213 + .../MailSo/Mime/Parser/ParserEmpty.php | 81 + .../MailSo/Mime/Parser/ParserInterface.php | 66 + .../MailSo/Mime/Parser/ParserMemory.php | 53 + .../1.12.0/app/libraries/MailSo/Mime/Part.php | 665 + .../libraries/MailSo/Mime/PartCollection.php | 65 + .../Enumerations/ConnectionSecurityType.php | 70 + .../Net/Exceptions/ConnectionException.php | 19 + .../MailSo/Net/Exceptions/Exception.php | 19 + .../Exceptions/InvalidArgumentException.php | 19 + .../SocketAlreadyConnectedException.php | 19 + .../SocketCanNotConnectToHostException.php | 61 + ...ketConnectionDoesNotAvailableException.php | 19 + .../Net/Exceptions/SocketReadException.php | 19 + .../Exceptions/SocketReadTimeoutException.php | 19 + .../SocketUnreadBufferException.php | 19 + ...etUnsuppoterdSecureConnectionException.php | 19 + .../Net/Exceptions/SocketWriteException.php | 19 + .../app/libraries/MailSo/Net/NetClient.php | 629 + .../MailSo/Pop3/Exceptions/Exception.php | 19 + .../LoginBadCredentialsException.php | 19 + .../Exceptions/NegativeResponseException.php | 19 + .../Pop3/Exceptions/ResponseException.php | 57 + .../Pop3/Exceptions/RuntimeException.php | 19 + .../app/libraries/MailSo/Pop3/Pop3Client.php | 373 + .../MailSo/Poppassd/Exceptions/Exception.php | 19 + .../LoginBadCredentialsException.php | 19 + .../Exceptions/NegativeResponseException.php | 19 + .../Poppassd/Exceptions/ResponseException.php | 57 + .../Poppassd/Exceptions/RuntimeException.php | 19 + .../MailSo/Poppassd/PoppassdClient.php | 296 + .../MailSo/Sieve/Exceptions/Exception.php | 19 + .../LoginBadCredentialsException.php | 19 + .../Exceptions/LoginBadMethodException.php | 19 + .../Sieve/Exceptions/LoginException.php | 19 + .../Exceptions/NegativeResponseException.php | 19 + .../Sieve/Exceptions/ResponseException.php | 57 + .../Sieve/Exceptions/RuntimeException.php | 19 + .../MailSo/Sieve/ManageSieveClient.php | 653 + .../MailSo/Smtp/Exceptions/Exception.php | 19 + .../LoginBadCredentialsException.php | 19 + .../Exceptions/LoginBadMethodException.php | 19 + .../MailSo/Smtp/Exceptions/LoginException.php | 19 + .../Exceptions/NegativeResponseException.php | 19 + .../Smtp/Exceptions/ResponseException.php | 57 + .../Smtp/Exceptions/RuntimeException.php | 19 + .../app/libraries/MailSo/Smtp/SmtpClient.php | 838 ++ .../libraries/MailSo/Vendors/Net/IDNA2.php | 3404 +++++ .../Vendors/Net/IDNA2CustomExceptions.php | 18 + .../v/1.12.0/app/libraries/MailSo/Version.php | 59 + .../app/libraries/Mobile_Detect/LICENSE.txt | 48 + .../Mobile_Detect/Mobile_Detect.json | 1 + .../libraries/Mobile_Detect/Mobile_Detect.php | 1460 ++ .../app/libraries/Mobile_Detect/README.md | 283 + .../app/libraries/Mobile_Detect/composer.json | 28 + .../namespaced/Detection/MobileDetect.php | 22 + .../app/libraries/Mobile_Detect/ruleset.xml | 187 + .../app/libraries/PHP-OAuth2/Client.php | 513 + .../GrantType/AuthorizationCode.php | 41 + .../GrantType/ClientCredentials.php | 25 + .../PHP-OAuth2/GrantType/IGrantType.php | 15 + .../PHP-OAuth2/GrantType/Password.php | 41 + .../PHP-OAuth2/GrantType/RefreshToken.php | 34 + .../v/1.12.0/app/libraries/PHP-OAuth2/README | 117 + .../PHPGangsta/GoogleAuthenticator.php | 201 + .../v/1.12.0/app/libraries/PHPThumb/GD.php | 1417 ++ .../app/libraries/PHPThumb/PHPThumb.php | 143 + .../libraries/PHPThumb/PluginInterface.php | 12 + .../libraries/PHPThumb/Plugins/Reflection.php | 261 + .../app/libraries/Predis/Autoloader.php | 62 + .../v/1.12.0/app/libraries/Predis/Client.php | 523 + .../Predis/ClientContextInterface.php | 189 + .../app/libraries/Predis/ClientException.php | 21 + .../app/libraries/Predis/ClientInterface.php | 230 + .../Predis/Cluster/ClusterStrategy.php | 398 + .../Distributor/DistributorInterface.php | 82 + .../Distributor/EmptyRingException.php | 21 + .../Predis/Cluster/Distributor/HashRing.php | 270 + .../Predis/Cluster/Distributor/KetamaRing.php | 71 + .../libraries/Predis/Cluster/Hash/CRC16.php | 72 + .../Cluster/Hash/HashGeneratorInterface.php | 30 + .../Predis/Cluster/PredisStrategy.php | 79 + .../Predis/Cluster/RedisStrategy.php | 58 + .../Predis/Cluster/StrategyInterface.php | 53 + .../Iterator/CursorBasedIterator.php | 191 + .../Predis/Collection/Iterator/HashKey.php | 56 + .../Predis/Collection/Iterator/Keyspace.php | 43 + .../Predis/Collection/Iterator/ListKey.php | 176 + .../Predis/Collection/Iterator/SetKey.php | 47 + .../Collection/Iterator/SortedSetKey.php | 60 + .../app/libraries/Predis/Command/Command.php | 129 + .../Predis/Command/CommandInterface.php | 81 + .../Predis/Command/ConnectionAuth.php | 28 + .../Predis/Command/ConnectionEcho.php | 28 + .../Predis/Command/ConnectionPing.php | 28 + .../Predis/Command/ConnectionQuit.php | 28 + .../Predis/Command/ConnectionSelect.php | 28 + .../libraries/Predis/Command/HashDelete.php | 36 + .../libraries/Predis/Command/HashExists.php | 36 + .../app/libraries/Predis/Command/HashGet.php | 28 + .../libraries/Predis/Command/HashGetAll.php | 42 + .../Predis/Command/HashGetMultiple.php | 36 + .../Predis/Command/HashIncrementBy.php | 28 + .../Predis/Command/HashIncrementByFloat.php | 28 + .../app/libraries/Predis/Command/HashKeys.php | 28 + .../libraries/Predis/Command/HashLength.php | 28 + .../app/libraries/Predis/Command/HashScan.php | 85 + .../app/libraries/Predis/Command/HashSet.php | 36 + .../Predis/Command/HashSetMultiple.php | 48 + .../Predis/Command/HashSetPreserve.php | 36 + .../Predis/Command/HashStringLength.php | 28 + .../libraries/Predis/Command/HashValues.php | 28 + .../Predis/Command/HyperLogLogAdd.php | 44 + .../Predis/Command/HyperLogLogCount.php | 36 + .../Predis/Command/HyperLogLogMerge.php | 36 + .../libraries/Predis/Command/KeyDelete.php | 36 + .../app/libraries/Predis/Command/KeyDump.php | 28 + .../libraries/Predis/Command/KeyExists.php | 36 + .../libraries/Predis/Command/KeyExpire.php | 36 + .../libraries/Predis/Command/KeyExpireAt.php | 36 + .../app/libraries/Predis/Command/KeyKeys.php | 28 + .../libraries/Predis/Command/KeyMigrate.php | 50 + .../app/libraries/Predis/Command/KeyMove.php | 36 + .../libraries/Predis/Command/KeyPersist.php | 36 + .../Predis/Command/KeyPreciseExpire.php | 28 + .../Predis/Command/KeyPreciseExpireAt.php | 28 + .../Predis/Command/KeyPreciseTimeToLive.php | 28 + .../libraries/Predis/Command/KeyRandom.php | 36 + .../libraries/Predis/Command/KeyRename.php | 28 + .../Predis/Command/KeyRenamePreserve.php | 36 + .../libraries/Predis/Command/KeyRestore.php | 28 + .../app/libraries/Predis/Command/KeyScan.php | 66 + .../app/libraries/Predis/Command/KeySort.php | 83 + .../Predis/Command/KeyTimeToLive.php | 28 + .../app/libraries/Predis/Command/KeyType.php | 28 + .../libraries/Predis/Command/ListIndex.php | 28 + .../libraries/Predis/Command/ListInsert.php | 28 + .../libraries/Predis/Command/ListLength.php | 28 + .../libraries/Predis/Command/ListPopFirst.php | 28 + .../Predis/Command/ListPopFirstBlocking.php | 41 + .../libraries/Predis/Command/ListPopLast.php | 28 + .../Predis/Command/ListPopLastBlocking.php | 28 + .../Predis/Command/ListPopLastPushHead.php | 28 + .../Command/ListPopLastPushHeadBlocking.php | 28 + .../libraries/Predis/Command/ListPushHead.php | 28 + .../Predis/Command/ListPushHeadX.php | 28 + .../libraries/Predis/Command/ListPushTail.php | 36 + .../Predis/Command/ListPushTailX.php | 28 + .../libraries/Predis/Command/ListRange.php | 28 + .../libraries/Predis/Command/ListRemove.php | 28 + .../app/libraries/Predis/Command/ListSet.php | 28 + .../app/libraries/Predis/Command/ListTrim.php | 28 + .../Command/PrefixableCommandInterface.php | 27 + .../Command/Processor/KeyPrefixProcessor.php | 415 + .../Command/Processor/ProcessorChain.php | 130 + .../Command/Processor/ProcessorInterface.php | 29 + .../Predis/Command/PubSubPublish.php | 28 + .../libraries/Predis/Command/PubSubPubsub.php | 61 + .../Predis/Command/PubSubSubscribe.php | 36 + .../Command/PubSubSubscribeByPattern.php | 28 + .../Predis/Command/PubSubUnsubscribe.php | 36 + .../Command/PubSubUnsubscribeByPattern.php | 28 + .../libraries/Predis/Command/RawCommand.php | 131 + .../Predis/Command/ScriptCommand.php | 77 + .../Command/ServerBackgroundRewriteAOF.php | 36 + .../Predis/Command/ServerBackgroundSave.php | 36 + .../libraries/Predis/Command/ServerClient.php | 74 + .../Predis/Command/ServerCommand.php | 28 + .../libraries/Predis/Command/ServerConfig.php | 49 + .../Predis/Command/ServerDatabaseSize.php | 28 + .../libraries/Predis/Command/ServerEval.php | 38 + .../Predis/Command/ServerEvalSHA.php | 38 + .../Predis/Command/ServerFlushAll.php | 28 + .../Predis/Command/ServerFlushDatabase.php | 28 + .../libraries/Predis/Command/ServerInfo.php | 111 + .../Predis/Command/ServerInfoV26x.php | 56 + .../Predis/Command/ServerLastSave.php | 28 + .../Predis/Command/ServerMonitor.php | 28 + .../libraries/Predis/Command/ServerObject.php | 28 + .../libraries/Predis/Command/ServerSave.php | 28 + .../libraries/Predis/Command/ServerScript.php | 28 + .../Predis/Command/ServerSentinel.php | 66 + .../Predis/Command/ServerShutdown.php | 28 + .../Predis/Command/ServerSlaveOf.php | 40 + .../Predis/Command/ServerSlowlog.php | 51 + .../libraries/Predis/Command/ServerTime.php | 28 + .../app/libraries/Predis/Command/SetAdd.php | 36 + .../Predis/Command/SetCardinality.php | 28 + .../Predis/Command/SetDifference.php | 28 + .../Predis/Command/SetDifferenceStore.php | 28 + .../Predis/Command/SetIntersection.php | 36 + .../Predis/Command/SetIntersectionStore.php | 40 + .../libraries/Predis/Command/SetIsMember.php | 36 + .../libraries/Predis/Command/SetMembers.php | 28 + .../app/libraries/Predis/Command/SetMove.php | 36 + .../app/libraries/Predis/Command/SetPop.php | 28 + .../Predis/Command/SetRandomMember.php | 28 + .../libraries/Predis/Command/SetRemove.php | 36 + .../app/libraries/Predis/Command/SetScan.php | 66 + .../app/libraries/Predis/Command/SetUnion.php | 28 + .../Predis/Command/SetUnionStore.php | 28 + .../libraries/Predis/Command/StringAppend.php | 28 + .../Predis/Command/StringBitCount.php | 28 + .../libraries/Predis/Command/StringBitOp.php | 42 + .../libraries/Predis/Command/StringBitPos.php | 28 + .../Predis/Command/StringDecrement.php | 28 + .../Predis/Command/StringDecrementBy.php | 28 + .../libraries/Predis/Command/StringGet.php | 28 + .../libraries/Predis/Command/StringGetBit.php | 28 + .../Predis/Command/StringGetMultiple.php | 36 + .../Predis/Command/StringGetRange.php | 28 + .../libraries/Predis/Command/StringGetSet.php | 28 + .../Predis/Command/StringIncrement.php | 28 + .../Predis/Command/StringIncrementBy.php | 28 + .../Predis/Command/StringIncrementByFloat.php | 28 + .../Predis/Command/StringPreciseSetExpire.php | 28 + .../libraries/Predis/Command/StringSet.php | 28 + .../libraries/Predis/Command/StringSetBit.php | 28 + .../Predis/Command/StringSetExpire.php | 28 + .../Predis/Command/StringSetMultiple.php | 48 + .../Command/StringSetMultiplePreserve.php | 36 + .../Predis/Command/StringSetPreserve.php | 36 + .../Predis/Command/StringSetRange.php | 28 + .../libraries/Predis/Command/StringStrlen.php | 28 + .../libraries/Predis/Command/StringSubstr.php | 28 + .../Predis/Command/TransactionDiscard.php | 28 + .../Predis/Command/TransactionExec.php | 28 + .../Predis/Command/TransactionMulti.php | 28 + .../Predis/Command/TransactionUnwatch.php | 28 + .../Predis/Command/TransactionWatch.php | 40 + .../app/libraries/Predis/Command/ZSetAdd.php | 43 + .../Predis/Command/ZSetCardinality.php | 28 + .../libraries/Predis/Command/ZSetCount.php | 28 + .../Predis/Command/ZSetIncrementBy.php | 28 + .../Predis/Command/ZSetIntersectionStore.php | 28 + .../libraries/Predis/Command/ZSetLexCount.php | 28 + .../libraries/Predis/Command/ZSetRange.php | 105 + .../Predis/Command/ZSetRangeByLex.php | 55 + .../Predis/Command/ZSetRangeByScore.php | 68 + .../app/libraries/Predis/Command/ZSetRank.php | 28 + .../libraries/Predis/Command/ZSetRemove.php | 36 + .../Predis/Command/ZSetRemoveRangeByLex.php | 28 + .../Predis/Command/ZSetRemoveRangeByRank.php | 28 + .../Predis/Command/ZSetRemoveRangeByScore.php | 28 + .../Predis/Command/ZSetReverseRange.php | 28 + .../Predis/Command/ZSetReverseRangeByLex.php | 23 + .../Command/ZSetReverseRangeByScore.php | 28 + .../Predis/Command/ZSetReverseRank.php | 28 + .../app/libraries/Predis/Command/ZSetScan.php | 85 + .../libraries/Predis/Command/ZSetScore.php | 28 + .../Predis/Command/ZSetUnionStore.php | 78 + .../Predis/CommunicationException.php | 80 + .../Predis/Configuration/ClusterOption.php | 76 + .../Configuration/ConnectionFactoryOption.php | 54 + .../Predis/Configuration/ExceptionsOption.php | 37 + .../Predis/Configuration/OptionInterface.php | 40 + .../Predis/Configuration/Options.php | 122 + .../Predis/Configuration/OptionsInterface.php | 64 + .../Predis/Configuration/PrefixOption.php | 44 + .../Predis/Configuration/ProfileOption.php | 69 + .../Configuration/ReplicationOption.php | 61 + .../Predis/Connection/AbstractConnection.php | 239 + .../Connection/Aggregate/ClusterInterface.php | 24 + .../Aggregate/MasterSlaveReplication.php | 264 + .../Connection/Aggregate/PredisCluster.php | 235 + .../Connection/Aggregate/RedisCluster.php | 553 + .../Aggregate/ReplicationInterface.php | 52 + .../AggregateConnectionInterface.php | 57 + .../CompositeConnectionInterface.php | 49 + .../Connection/CompositeStreamConnection.php | 125 + .../Predis/Connection/ConnectionException.php | 23 + .../Predis/Connection/ConnectionInterface.php | 66 + .../libraries/Predis/Connection/Factory.php | 151 + .../Predis/Connection/FactoryInterface.php | 52 + .../Connection/NodeConnectionInterface.php | 58 + .../Predis/Connection/Parameters.php | 176 + .../Predis/Connection/ParametersInterface.php | 62 + .../Connection/PhpiredisSocketConnection.php | 393 + .../Connection/PhpiredisStreamConnection.php | 228 + .../Predis/Connection/StreamConnection.php | 292 + .../Predis/Connection/WebdisConnection.php | 353 + .../app/libraries/Predis/Monitor/Consumer.php | 173 + .../Predis/NotSupportedException.php | 22 + .../app/libraries/Predis/Pipeline/Atomic.php | 119 + .../Predis/Pipeline/ConnectionErrorProof.php | 130 + .../Predis/Pipeline/FireAndForget.php | 36 + .../libraries/Predis/Pipeline/Pipeline.php | 247 + .../app/libraries/Predis/PredisException.php | 21 + .../app/libraries/Predis/Profile/Factory.php | 100 + .../Predis/Profile/ProfileInterface.php | 59 + .../libraries/Predis/Profile/RedisProfile.php | 146 + .../Predis/Profile/RedisUnstable.php | 41 + .../Predis/Profile/RedisVersion200.php | 173 + .../Predis/Profile/RedisVersion220.php | 202 + .../Predis/Profile/RedisVersion240.php | 207 + .../Predis/Profile/RedisVersion260.php | 235 + .../Predis/Profile/RedisVersion280.php | 267 + .../Predis/Profile/RedisVersion300.php | 270 + .../Predis/Protocol/ProtocolException.php | 24 + .../Protocol/ProtocolProcessorInterface.php | 41 + .../Protocol/RequestSerializerInterface.php | 31 + .../Protocol/ResponseReaderInterface.php | 32 + .../Text/CompositeProtocolProcessor.php | 107 + .../Protocol/Text/Handler/BulkResponse.php | 55 + .../Protocol/Text/Handler/ErrorResponse.php | 34 + .../Protocol/Text/Handler/IntegerResponse.php | 45 + .../Text/Handler/MultiBulkResponse.php | 68 + .../Text/Handler/ResponseHandlerInterface.php | 33 + .../Protocol/Text/Handler/StatusResponse.php | 35 + .../Handler/StreamableMultiBulkResponse.php | 47 + .../Protocol/Text/ProtocolProcessor.php | 122 + .../Protocol/Text/RequestSerializer.php | 47 + .../Predis/Protocol/Text/ResponseReader.php | 116 + .../Predis/PubSub/AbstractConsumer.php | 219 + .../app/libraries/Predis/PubSub/Consumer.php | 158 + .../Predis/PubSub/DispatcherLoop.php | 170 + .../Replication/ReplicationStrategy.php | 237 + .../app/libraries/Predis/Response/Error.php | 59 + .../Predis/Response/ErrorInterface.php | 35 + .../Predis/Response/Iterator/MultiBulk.php | 77 + .../Response/Iterator/MultiBulkIterator.php | 104 + .../Response/Iterator/MultiBulkTuple.php | 90 + .../Predis/Response/ResponseInterface.php | 21 + .../Predis/Response/ServerException.php | 44 + .../app/libraries/Predis/Response/Status.php | 79 + .../app/libraries/Predis/Session/Handler.php | 142 + .../Transaction/AbortedMultiExecException.php | 45 + .../Predis/Transaction/MultiExec.php | 461 + .../Predis/Transaction/MultiExecState.php | 166 + .../1.12.0/app/libraries/RainLoop/Actions.php | 10269 ++++++++++++++ .../v/1.12.0/app/libraries/RainLoop/Api.php | 275 + .../Common/BackwardCapability/Account.php | 5 + .../FacebookRainLoopPersistentDataHandler.php | 81 + .../libraries/RainLoop/Common/MbStringFix.php | 464 + .../libraries/RainLoop/Common/PdoAbstract.php | 603 + .../RainLoopFacebookRedirectLoginHelper.php | 127 + .../RainLoop/Config/AbstractConfig.php | 343 + .../libraries/RainLoop/Config/Application.php | 471 + .../app/libraries/RainLoop/Config/Plugin.php | 59 + .../libraries/RainLoop/Enumerations/Capa.php | 35 + .../RainLoop/Enumerations/Layout.php | 10 + .../Enumerations/PluginPropertyType.php | 13 + .../RainLoop/Enumerations/SignMeType.php | 10 + .../RainLoop/Enumerations/TimeFormat.php | 9 + .../Enumerations/UploadClientError.php | 16 + .../RainLoop/Enumerations/UploadError.php | 13 + .../RainLoop/Exceptions/ClientException.php | 67 + .../RainLoop/Exceptions/Exception.php | 5 + .../Exceptions/InvalidArgumentException.php | 9 + .../RainLoop/Exceptions/RuntimeException.php | 9 + .../app/libraries/RainLoop/KeyPathHelper.php | 144 + .../app/libraries/RainLoop/Model/Account.php | 585 + .../app/libraries/RainLoop/Model/Domain.php | 590 + .../app/libraries/RainLoop/Model/Identity.php | 205 + .../app/libraries/RainLoop/Model/Template.php | 154 + .../app/libraries/RainLoop/Notifications.php | 153 + .../RainLoop/Plugins/AbstractPlugin.php | 436 + .../app/libraries/RainLoop/Plugins/Helper.php | 73 + .../libraries/RainLoop/Plugins/Manager.php | 770 + .../libraries/RainLoop/Plugins/Property.php | 205 + .../RainLoop/Providers/AbstractProvider.php | 51 + .../RainLoop/Providers/AddressBook.php | 377 + .../AddressBook/AddressBookInterface.php | 11 + .../Providers/AddressBook/Classes/Contact.php | 662 + .../AddressBook/Classes/Property.php | 169 + .../Providers/AddressBook/Classes/Tag.php | 33 + .../AddressBook/Enumerations/PropertyType.php | 35 + .../Providers/AddressBook/PdoAddressBook.php | 2012 +++ .../RainLoop/Providers/ChangePassword.php | 102 + .../ChangePasswordInterface.php | 22 + .../libraries/RainLoop/Providers/Domain.php | 297 + .../Providers/Domain/DefaultDomain.php | 410 + .../Providers/Domain/DomainAdminInterface.php | 56 + .../Providers/Domain/DomainInterface.php | 7 + .../libraries/RainLoop/Providers/Files.php | 137 + .../RainLoop/Providers/Files/FileStorage.php | 247 + .../RainLoop/Providers/Files/IFiles.php | 80 + .../libraries/RainLoop/Providers/Filters.php | 84 + .../Providers/Filters/Classes/Filter.php | 300 + .../Filters/Classes/FilterCondition.php | 134 + .../Filters/Enumerations/ActionType.php | 13 + .../Filters/Enumerations/ConditionField.php | 12 + .../Filters/Enumerations/ConditionType.php | 14 + .../Filters/Enumerations/ConditionsType.php | 9 + .../Providers/Filters/FiltersInterface.php | 22 + .../Providers/Filters/SieveStorage.php | 564 + .../libraries/RainLoop/Providers/Settings.php | 52 + .../Providers/Settings/DefaultSettings.php | 79 + .../RainLoop/Providers/Settings/ISettings.php | 28 + .../libraries/RainLoop/Providers/Storage.php | 116 + .../Storage/Enumerations/StorageType.php | 10 + .../Providers/Storage/FileStorage.php | 203 + .../RainLoop/Providers/Storage/IStorage.php | 40 + .../Providers/Storage/TemproryApcStorage.php | 78 + .../RainLoop/Providers/Suggestions.php | 73 + .../Providers/Suggestions/ISuggestions.php | 15 + .../Suggestions/OwnCloudSuggestions.php | 116 + .../Providers/Suggestions/TestSuggestions.php | 21 + .../RainLoop/Providers/TwoFactorAuth.php | 73 + .../TwoFactorAuth/AbstractTwoFactorAuth.php | 24 + .../TwoFactorAuth/GoogleTwoFactorAuth.php | 33 + .../TwoFactorAuth/TwoFactorAuthInterface.php | 14 + .../1.12.0/app/libraries/RainLoop/Service.php | 328 + .../app/libraries/RainLoop/ServiceActions.php | 1389 ++ .../app/libraries/RainLoop/Settings.php | 78 + .../1.12.0/app/libraries/RainLoop/Social.php | 792 ++ .../v/1.12.0/app/libraries/RainLoop/Utils.php | 735 + .../CalDAV/Backend/AbstractBackend.php | 155 + .../CalDAV/Backend/BackendInterface.php | 233 + .../CalDAV/Backend/NotificationSupport.php | 47 + .../SabreForRainLoop/CalDAV/Backend/PDO.php | 691 + .../CalDAV/Backend/SharingSupport.php | 243 + .../SabreForRainLoop/CalDAV/Calendar.php | 376 + .../CalDAV/CalendarObject.php | 279 + .../CalDAV/CalendarQueryParser.php | 298 + .../CalDAV/CalendarQueryValidator.php | 392 + .../CalDAV/CalendarRootNode.php | 77 + .../CalDAV/Exception/InvalidComponentType.php | 35 + .../CalDAV/ICSExportPlugin.php | 142 + .../SabreForRainLoop/CalDAV/ICalendar.php | 36 + .../CalDAV/ICalendarObject.php | 21 + .../CalDAV/IShareableCalendar.php | 48 + .../CalDAV/ISharedCalendar.php | 36 + .../CalDAV/Notifications/Collection.php | 173 + .../CalDAV/Notifications/ICollection.php | 24 + .../CalDAV/Notifications/INode.php | 38 + .../Notifications/INotificationType.php | 44 + .../CalDAV/Notifications/Node.php | 192 + .../Notifications/Notification/Invite.php | 324 + .../Notification/InviteReply.php | 218 + .../Notification/SystemStatus.php | 182 + .../SabreForRainLoop/CalDAV/Plugin.php | 1338 ++ .../CalDAV/Principal/Collection.php | 32 + .../CalDAV/Principal/IProxyRead.php | 19 + .../CalDAV/Principal/IProxyWrite.php | 19 + .../CalDAV/Principal/ProxyRead.php | 180 + .../CalDAV/Principal/ProxyWrite.php | 180 + .../CalDAV/Principal/User.php | 134 + .../CalDAV/Property/AllowedSharingModes.php | 74 + .../CalDAV/Property/Invite.php | 227 + .../Property/ScheduleCalendarTransp.php | 102 + .../SupportedCalendarComponentSet.php | 88 + .../CalDAV/Property/SupportedCalendarData.php | 40 + .../CalDAV/Property/SupportedCollationSet.php | 45 + .../SabreForRainLoop/CalDAV/Schedule/IMip.php | 111 + .../CalDAV/Schedule/IOutbox.php | 16 + .../CalDAV/Schedule/Outbox.php | 163 + .../CalDAV/ShareableCalendar.php | 72 + .../CalDAV/SharedCalendar.php | 116 + .../SabreForRainLoop/CalDAV/SharingPlugin.php | 526 + .../SabreForRainLoop/CalDAV/UserCalendars.php | 342 + .../SabreForRainLoop/CalDAV/Version.php | 24 + .../SabreForRainLoop/CardDAV/AddressBook.php | 315 + .../CardDAV/AddressBookQueryParser.php | 221 + .../CardDAV/AddressBookRoot.php | 80 + .../CardDAV/Backend/AbstractBackend.php | 18 + .../CardDAV/Backend/BackendInterface.php | 166 + .../SabreForRainLoop/CardDAV/Backend/PDO.php | 333 + .../SabreForRainLoop/CardDAV/Card.php | 260 + .../SabreForRainLoop/CardDAV/IAddressBook.php | 20 + .../SabreForRainLoop/CardDAV/ICard.php | 20 + .../SabreForRainLoop/CardDAV/IDirectory.php | 21 + .../SabreForRainLoop/CardDAV/Plugin.php | 706 + .../CardDAV/Property/SupportedAddressData.php | 72 + .../CardDAV/UserAddressBooks.php | 260 + .../CardDAV/VCFExportPlugin.php | 108 + .../SabreForRainLoop/CardDAV/Version.php | 26 + .../DAV/Auth/Backend/AbstractBasic.php | 87 + .../DAV/Auth/Backend/AbstractDigest.php | 101 + .../DAV/Auth/Backend/Apache.php | 63 + .../DAV/Auth/Backend/BackendInterface.php | 36 + .../DAV/Auth/Backend/File.php | 77 + .../SabreForRainLoop/DAV/Auth/Backend/PDO.php | 65 + .../SabreForRainLoop/DAV/Auth/Plugin.php | 112 + .../DAV/Browser/GuessContentType.php | 99 + .../DAV/Browser/MapGetToPropFind.php | 57 + .../SabreForRainLoop/DAV/Browser/Plugin.php | 491 + .../DAV/Browser/assets/favicon.ico | Bin 0 -> 4286 bytes .../DAV/Browser/assets/icons/addressbook.png | Bin 0 -> 7232 bytes .../DAV/Browser/assets/icons/calendar.png | Bin 0 -> 4388 bytes .../DAV/Browser/assets/icons/card.png | Bin 0 -> 5695 bytes .../DAV/Browser/assets/icons/collection.png | Bin 0 -> 3474 bytes .../DAV/Browser/assets/icons/file.png | Bin 0 -> 2837 bytes .../DAV/Browser/assets/icons/parent.png | Bin 0 -> 3474 bytes .../DAV/Browser/assets/icons/principal.png | Bin 0 -> 5480 bytes .../libraries/SabreForRainLoop/DAV/Client.php | 641 + .../SabreForRainLoop/DAV/Collection.php | 110 + .../SabreForRainLoop/DAV/Exception.php | 64 + .../DAV/Exception/BadRequest.php | 28 + .../DAV/Exception/Conflict.php | 28 + .../DAV/Exception/ConflictingLock.php | 37 + .../DAV/Exception/FileNotFound.php | 19 + .../DAV/Exception/Forbidden.php | 27 + .../DAV/Exception/InsufficientStorage.php | 27 + .../DAV/Exception/InvalidResourceType.php | 33 + .../Exception/LockTokenMatchesRequestUri.php | 41 + .../SabreForRainLoop/DAV/Exception/Locked.php | 73 + .../DAV/Exception/MethodNotAllowed.php | 45 + .../DAV/Exception/NotAuthenticated.php | 30 + .../DAV/Exception/NotFound.php | 28 + .../DAV/Exception/NotImplemented.php | 27 + .../DAV/Exception/PaymentRequired.php | 30 + .../DAV/Exception/PreconditionFailed.php | 71 + .../DAV/Exception/ReportNotSupported.php | 32 + .../RequestedRangeNotSatisfiable.php | 31 + .../DAV/Exception/ServiceUnavailable.php | 30 + .../DAV/Exception/UnsupportedMediaType.php | 28 + .../SabreForRainLoop/DAV/FS/Directory.php | 140 + .../SabreForRainLoop/DAV/FS/File.php | 91 + .../SabreForRainLoop/DAV/FS/Node.php | 82 + .../SabreForRainLoop/DAV/FSExt/Directory.php | 159 + .../SabreForRainLoop/DAV/FSExt/File.php | 118 + .../SabreForRainLoop/DAV/FSExt/Node.php | 214 + .../libraries/SabreForRainLoop/DAV/File.php | 85 + .../SabreForRainLoop/DAV/ICollection.php | 77 + .../DAV/IExtendedCollection.php | 28 + .../libraries/SabreForRainLoop/DAV/IFile.php | 77 + .../libraries/SabreForRainLoop/DAV/INode.php | 46 + .../SabreForRainLoop/DAV/IProperties.php | 71 + .../libraries/SabreForRainLoop/DAV/IQuota.php | 27 + .../DAV/Locks/Backend/AbstractBackend.php | 21 + .../DAV/Locks/Backend/BackendInterface.php | 51 + .../SabreForRainLoop/DAV/Locks/Backend/FS.php | 193 + .../DAV/Locks/Backend/File.php | 183 + .../DAV/Locks/Backend/PDO.php | 167 + .../SabreForRainLoop/DAV/Locks/LockInfo.php | 81 + .../SabreForRainLoop/DAV/Locks/Plugin.php | 642 + .../SabreForRainLoop/DAV/Mount/Plugin.php | 83 + .../libraries/SabreForRainLoop/DAV/Node.php | 55 + .../SabreForRainLoop/DAV/ObjectTree.php | 159 + .../DAV/PartialUpdate/IFile.php | 40 + .../DAV/PartialUpdate/Plugin.php | 212 + .../SabreForRainLoop/DAV/Property.php | 31 + .../DAV/Property/GetLastModified.php | 78 + .../SabreForRainLoop/DAV/Property/Href.php | 99 + .../DAV/Property/HrefList.php | 105 + .../SabreForRainLoop/DAV/Property/IHref.php | 25 + .../DAV/Property/LockDiscovery.php | 104 + .../DAV/Property/ResourceType.php | 127 + .../DAV/Property/Response.php | 157 + .../DAV/Property/ResponseList.php | 59 + .../DAV/Property/SupportedLock.php | 78 + .../DAV/Property/SupportedReportSet.php | 111 + .../DAV/PropertyInterface.php | 21 + .../libraries/SabreForRainLoop/DAV/Server.php | 2175 +++ .../SabreForRainLoop/DAV/ServerPlugin.php | 90 + .../SabreForRainLoop/DAV/SimpleCollection.php | 108 + .../SabreForRainLoop/DAV/SimpleFile.php | 121 + .../SabreForRainLoop/DAV/StringUtil.php | 91 + .../DAV/TemporaryFileFilterPlugin.php | 289 + .../libraries/SabreForRainLoop/DAV/Tree.php | 193 + .../SabreForRainLoop/DAV/Tree/Filesystem.php | 133 + .../SabreForRainLoop/DAV/URLUtil.php | 121 + .../SabreForRainLoop/DAV/UUIDUtil.php | 64 + .../SabreForRainLoop/DAV/Version.php | 24 + .../SabreForRainLoop/DAV/XMLUtil.php | 187 + .../DAVACL/AbstractPrincipalCollection.php | 155 + .../DAVACL/Exception/AceConflict.php | 35 + .../DAVACL/Exception/NeedPrivileges.php | 83 + .../DAVACL/Exception/NoAbstract.php | 35 + .../Exception/NotRecognizedPrincipal.php | 35 + .../Exception/NotSupportedPrivilege.php | 35 + .../SabreForRainLoop/DAVACL/IACL.php | 74 + .../SabreForRainLoop/DAVACL/IPrincipal.php | 77 + .../DAVACL/IPrincipalCollection.php | 42 + .../SabreForRainLoop/DAVACL/Plugin.php | 1402 ++ .../SabreForRainLoop/DAVACL/Principal.php | 281 + .../PrincipalBackend/AbstractBackend.php | 18 + .../PrincipalBackend/BackendInterface.php | 153 + .../DAVACL/PrincipalBackend/PDO.php | 428 + .../DAVACL/PrincipalCollection.php | 33 + .../SabreForRainLoop/DAVACL/Property/Acl.php | 211 + .../DAVACL/Property/AclRestrictions.php | 34 + .../Property/CurrentUserPrivilegeSet.php | 124 + .../DAVACL/Property/Principal.php | 161 + .../DAVACL/Property/SupportedPrivilegeSet.php | 94 + .../SabreForRainLoop/DAVACL/Version.php | 24 + .../SabreForRainLoop/HTTP/AWSAuth.php | 227 + .../SabreForRainLoop/HTTP/AbstractAuth.php | 111 + .../SabreForRainLoop/HTTP/BasicAuth.php | 67 + .../SabreForRainLoop/HTTP/DigestAuth.php | 240 + .../SabreForRainLoop/HTTP/Request.php | 284 + .../SabreForRainLoop/HTTP/Response.php | 175 + .../libraries/SabreForRainLoop/HTTP/Util.php | 82 + .../SabreForRainLoop/HTTP/Version.php | 24 + .../SabreForRainLoop/VObject/Cli.php | 735 + .../SabreForRainLoop/VObject/Component.php | 473 + .../VObject/Component/VAlarm.php | 108 + .../VObject/Component/VCalendar.php | 369 + .../VObject/Component/VCard.php | 353 + .../VObject/Component/VEvent.php | 70 + .../VObject/Component/VFreeBusy.php | 68 + .../VObject/Component/VJournal.php | 46 + .../VObject/Component/VTodo.php | 68 + .../VObject/DateTimeParser.php | 415 + .../SabreForRainLoop/VObject/Document.php | 261 + .../SabreForRainLoop/VObject/ElementList.php | 172 + .../SabreForRainLoop/VObject/EofException.php | 13 + .../VObject/FreeBusyGenerator.php | 322 + .../SabreForRainLoop/VObject/Node.php | 201 + .../SabreForRainLoop/VObject/Parameter.php | 343 + .../VObject/ParseException.php | 12 + .../SabreForRainLoop/VObject/Parser/Json.php | 188 + .../VObject/Parser/MimeDir.php | 602 + .../VObject/Parser/Parser.php | 77 + .../SabreForRainLoop/VObject/Property.php | 502 + .../VObject/Property/Binary.php | 127 + .../VObject/Property/Boolean.php | 63 + .../VObject/Property/FlatText.php | 49 + .../VObject/Property/Float.php | 101 + .../VObject/Property/ICalendar/CalAddress.php | 41 + .../VObject/Property/ICalendar/Date.php | 24 + .../VObject/Property/ICalendar/DateTime.php | 308 + .../VObject/Property/ICalendar/Duration.php | 86 + .../VObject/Property/ICalendar/Period.php | 126 + .../VObject/Property/ICalendar/Recur.php | 189 + .../VObject/Property/Integer.php | 72 + .../VObject/Property/Text.php | 330 + .../VObject/Property/Time.php | 94 + .../VObject/Property/Unknown.php | 50 + .../SabreForRainLoop/VObject/Property/Uri.php | 70 + .../VObject/Property/UtcOffset.php | 37 + .../VObject/Property/VCard/Date.php | 33 + .../VObject/Property/VCard/DateAndOrTime.php | 144 + .../VObject/Property/VCard/DateTime.php | 33 + .../VObject/Property/VCard/LanguageTag.php | 59 + .../VObject/Property/VCard/TimeStamp.php | 69 + .../SabreForRainLoop/VObject/Reader.php | 73 + .../VObject/RecurrenceIterator.php | 1153 ++ .../VObject/Splitter/ICalendar.php | 114 + .../VObject/Splitter/SplitterInterface.php | 39 + .../VObject/Splitter/VCard.php | 74 + .../SabreForRainLoop/VObject/StringUtil.php | 61 + .../SabreForRainLoop/VObject/TimeZoneUtil.php | 482 + .../VObject/VCardConverter.php | 382 + .../SabreForRainLoop/VObject/Version.php | 19 + .../SabreForRainLoop/VObject/includes.php | 66 + .../v/1.12.0/app/libraries/lessphp/LICENSE | 660 + .../v/1.12.0/app/libraries/lessphp/README.md | 96 + .../v/1.12.0/app/libraries/lessphp/ctype.php | 40 + .../app/libraries/lessphp/lessc.inc.php | 3479 +++++ .../app/libraries/pclzip/_pclzip.lib.php | 5693 ++++++++ .../1.12.0/app/libraries/pclzip/gnu-lgpl.txt | 504 + .../app/libraries/pclzip/pclzip.lib.php | 5719 ++++++++ .../v/1.12.0/app/libraries/pclzip/readme.txt | 421 + .../app/libraries/phpseclib/Crypt/AES.php | 207 + .../app/libraries/phpseclib/Crypt/Base.php | 2011 +++ .../libraries/phpseclib/Crypt/Blowfish.php | 644 + .../app/libraries/phpseclib/Crypt/DES.php | 1506 ++ .../app/libraries/phpseclib/Crypt/Hash.php | 841 ++ .../app/libraries/phpseclib/Crypt/RC2.php | 652 + .../app/libraries/phpseclib/Crypt/RC4.php | 329 + .../app/libraries/phpseclib/Crypt/RSA.php | 2997 ++++ .../app/libraries/phpseclib/Crypt/Random.php | 300 + .../libraries/phpseclib/Crypt/Rijndael.php | 1348 ++ .../libraries/phpseclib/Crypt/TripleDES.php | 428 + .../app/libraries/phpseclib/Crypt/Twofish.php | 895 ++ .../app/libraries/phpseclib/File/ANSI.php | 559 + .../app/libraries/phpseclib/File/ASN1.php | 1358 ++ .../app/libraries/phpseclib/File/X509.php | 4583 ++++++ .../libraries/phpseclib/Math/BigInteger.php | 3758 +++++ .../app/libraries/phpseclib/Net/SCP.php | 360 + .../app/libraries/phpseclib/Net/SFTP.php | 2778 ++++ .../libraries/phpseclib/Net/SFTP/Stream.php | 801 ++ .../app/libraries/phpseclib/Net/SSH1.php | 1651 +++ .../app/libraries/phpseclib/Net/SSH2.php | 3878 ++++++ .../libraries/phpseclib/System/SSH/Agent.php | 313 + .../libraries/phpseclib/System/SSH_Agent.php | 39 + .../app/libraries/phpseclib/openssl.cnf | 6 + .../v/1.12.0/app/libraries/spyc/COPYING | 21 + .../v/1.12.0/app/libraries/spyc/README.md | 30 + .../v/1.12.0/app/libraries/spyc/Spyc.php | 1155 ++ .../v/1.12.0/app/libraries/spyc/composer.json | 30 + .../v/1.12.0/app/libraries/tmhOAuth/LICENSE | 202 + .../v/1.12.0/app/libraries/tmhOAuth/README.md | 211 + .../1.12.0/app/libraries/tmhOAuth/cacert.pem | 3376 +++++ .../app/libraries/tmhOAuth/tmhOAuth.php | 724 + .../app/libraries/tmhOAuth/tmhUtilities.php | 280 + .../rainloop/v/1.12.0/app/localization/README | 1 + .../v/1.12.0/app/localization/admin/README | 1 + .../app/localization/admin/_source.en.yml | 324 + .../v/1.12.0/app/localization/admin/cs_CZ.yml | 316 + .../v/1.12.0/app/localization/admin/da_DK.yml | 323 + .../v/1.12.0/app/localization/admin/de_DE.yml | 325 + .../v/1.12.0/app/localization/admin/en_US.yml | 322 + .../v/1.12.0/app/localization/admin/es_ES.yml | 321 + .../v/1.12.0/app/localization/admin/fa_IR.yml | 325 + .../v/1.12.0/app/localization/admin/fi_FI.yml | 322 + .../v/1.12.0/app/localization/admin/fr_FR.yml | 326 + .../v/1.12.0/app/localization/admin/hu_HU.yml | 322 + .../v/1.12.0/app/localization/admin/it_IT.yml | 326 + .../v/1.12.0/app/localization/admin/ja_JP.yml | 321 + .../v/1.12.0/app/localization/admin/lt_LT.yml | 323 + .../v/1.12.0/app/localization/admin/nb_NO.yml | 323 + .../v/1.12.0/app/localization/admin/nl_NL.yml | 321 + .../v/1.12.0/app/localization/admin/pl_PL.yml | 326 + .../v/1.12.0/app/localization/admin/pt_BR.yml | 323 + .../v/1.12.0/app/localization/admin/ru_RU.yml | 323 + .../v/1.12.0/app/localization/admin/sk_SK.yml | 204 + .../v/1.12.0/app/localization/admin/sl_SI.yml | 323 + .../v/1.12.0/app/localization/admin/sv_SE.yml | 324 + .../v/1.12.0/app/localization/admin/zh_CN.yml | 317 + .../v/1.12.0/app/localization/langs.yml | 91 + .../v/1.12.0/app/localization/moment/af.js | 72 + .../v/1.12.0/app/localization/moment/ar-dz.js | 58 + .../v/1.12.0/app/localization/moment/ar-kw.js | 58 + .../v/1.12.0/app/localization/moment/ar-ly.js | 121 + .../v/1.12.0/app/localization/moment/ar-ma.js | 58 + .../v/1.12.0/app/localization/moment/ar-sa.js | 103 + .../v/1.12.0/app/localization/moment/ar-tn.js | 58 + .../v/1.12.0/app/localization/moment/ar.js | 134 + .../v/1.12.0/app/localization/moment/az.js | 104 + .../v/1.12.0/app/localization/moment/be.js | 131 + .../v/1.12.0/app/localization/moment/bg.js | 89 + .../v/1.12.0/app/localization/moment/bm.js | 57 + .../v/1.12.0/app/localization/moment/bn.js | 118 + .../v/1.12.0/app/localization/moment/bo.js | 118 + .../v/1.12.0/app/localization/moment/br.js | 107 + .../v/1.12.0/app/localization/moment/bs.js | 150 + .../v/1.12.0/app/localization/moment/ca.js | 87 + .../v/1.12.0/app/localization/moment/cs.js | 178 + .../v/1.12.0/app/localization/moment/cv.js | 62 + .../v/1.12.0/app/localization/moment/cy.js | 79 + .../v/1.12.0/app/localization/moment/da.js | 59 + .../v/1.12.0/app/localization/moment/de-at.js | 75 + .../v/1.12.0/app/localization/moment/de-ch.js | 75 + .../v/1.12.0/app/localization/moment/de.js | 75 + .../v/1.12.0/app/localization/moment/dv.js | 98 + .../v/1.12.0/app/localization/moment/el.js | 99 + .../v/1.12.0/app/localization/moment/en-au.js | 66 + .../v/1.12.0/app/localization/moment/en-ca.js | 62 + .../v/1.12.0/app/localization/moment/en-gb.js | 66 + .../v/1.12.0/app/localization/moment/en-ie.js | 66 + .../v/1.12.0/app/localization/moment/en-il.js | 61 + .../v/1.12.0/app/localization/moment/en-nz.js | 66 + .../v/1.12.0/app/localization/moment/eo.js | 70 + .../v/1.12.0/app/localization/moment/es-do.js | 91 + .../v/1.12.0/app/localization/moment/es-us.js | 82 + .../v/1.12.0/app/localization/moment/es.js | 91 + .../v/1.12.0/app/localization/moment/et.js | 79 + .../v/1.12.0/app/localization/moment/eu.js | 65 + .../v/1.12.0/app/localization/moment/fa.js | 105 + .../v/1.12.0/app/localization/moment/fi.js | 108 + .../v/1.12.0/app/localization/moment/fo.js | 59 + .../v/1.12.0/app/localization/moment/fr-ca.js | 73 + .../v/1.12.0/app/localization/moment/fr-ch.js | 77 + .../v/1.12.0/app/localization/moment/fr.js | 82 + .../v/1.12.0/app/localization/moment/fy.js | 74 + .../v/1.12.0/app/localization/moment/gd.js | 75 + .../v/1.12.0/app/localization/moment/gl.js | 76 + .../app/localization/moment/gom-latn.js | 122 + .../v/1.12.0/app/localization/moment/gu.js | 123 + .../v/1.12.0/app/localization/moment/he.js | 96 + .../v/1.12.0/app/localization/moment/hi.js | 123 + .../v/1.12.0/app/localization/moment/hr.js | 153 + .../v/1.12.0/app/localization/moment/hu.js | 109 + .../v/1.12.0/app/localization/moment/hy-am.js | 94 + .../v/1.12.0/app/localization/moment/id.js | 81 + .../v/1.12.0/app/localization/moment/is.js | 131 + .../v/1.12.0/app/localization/moment/it.js | 68 + .../v/1.12.0/app/localization/moment/ja.js | 91 + .../v/1.12.0/app/localization/moment/jv.js | 81 + .../v/1.12.0/app/localization/moment/ka.js | 88 + .../v/1.12.0/app/localization/moment/kk.js | 86 + .../v/1.12.0/app/localization/moment/km.js | 109 + .../v/1.12.0/app/localization/moment/kn.js | 125 + .../v/1.12.0/app/localization/moment/ko.js | 80 + .../v/1.12.0/app/localization/moment/ky.js | 86 + .../v/1.12.0/app/localization/moment/lb.js | 135 + .../v/1.12.0/app/localization/moment/lo.js | 69 + .../v/1.12.0/app/localization/moment/lt.js | 117 + .../v/1.12.0/app/localization/moment/lv.js | 96 + .../v/1.12.0/app/localization/moment/me.js | 111 + .../v/1.12.0/app/localization/moment/mi.js | 63 + .../v/1.12.0/app/localization/moment/mk.js | 89 + .../v/1.12.0/app/localization/moment/ml.js | 80 + .../v/1.12.0/app/localization/moment/mn.js | 103 + .../v/1.12.0/app/localization/moment/mr.js | 159 + .../v/1.12.0/app/localization/moment/ms-my.js | 81 + .../v/1.12.0/app/localization/moment/ms.js | 81 + .../v/1.12.0/app/localization/moment/mt.js | 59 + .../v/1.12.0/app/localization/moment/my.js | 92 + .../v/1.12.0/app/localization/moment/nb.js | 61 + .../v/1.12.0/app/localization/moment/ne.js | 122 + .../v/1.12.0/app/localization/moment/nl-be.js | 86 + .../v/1.12.0/app/localization/moment/nl.js | 86 + .../v/1.12.0/app/localization/moment/nn.js | 59 + .../v/1.12.0/app/localization/moment/pa-in.js | 123 + .../v/1.12.0/app/localization/moment/pl.js | 125 + .../v/1.12.0/app/localization/moment/pt-br.js | 60 + .../v/1.12.0/app/localization/moment/pt.js | 64 + .../v/1.12.0/app/localization/moment/ro.js | 74 + .../v/1.12.0/app/localization/moment/ru.js | 181 + .../v/1.12.0/app/localization/moment/sd.js | 97 + .../v/1.12.0/app/localization/moment/se.js | 59 + .../v/1.12.0/app/localization/moment/si.js | 70 + .../v/1.12.0/app/localization/moment/sk.js | 155 + .../v/1.12.0/app/localization/moment/sl.js | 172 + .../v/1.12.0/app/localization/moment/sq.js | 67 + .../1.12.0/app/localization/moment/sr-cyrl.js | 110 + .../v/1.12.0/app/localization/moment/sr.js | 110 + .../v/1.12.0/app/localization/moment/ss.js | 87 + .../v/1.12.0/app/localization/moment/sv.js | 68 + .../v/1.12.0/app/localization/moment/sw.js | 58 + .../v/1.12.0/app/localization/moment/ta.js | 128 + .../v/1.12.0/app/localization/moment/te.js | 88 + .../v/1.12.0/app/localization/moment/tet.js | 66 + .../v/1.12.0/app/localization/moment/tg.js | 115 + .../v/1.12.0/app/localization/moment/th.js | 66 + .../v/1.12.0/app/localization/moment/tl-ph.js | 61 + .../v/1.12.0/app/localization/moment/tlh.js | 121 + .../v/1.12.0/app/localization/moment/tr.js | 93 + .../v/1.12.0/app/localization/moment/tzl.js | 90 + .../app/localization/moment/tzm-latn.js | 57 + .../v/1.12.0/app/localization/moment/tzm.js | 57 + .../v/1.12.0/app/localization/moment/ug-cn.js | 118 + .../v/1.12.0/app/localization/moment/uk.js | 150 + .../v/1.12.0/app/localization/moment/ur.js | 97 + .../1.12.0/app/localization/moment/uz-latn.js | 57 + .../v/1.12.0/app/localization/moment/uz.js | 57 + .../v/1.12.0/app/localization/moment/vi.js | 78 + .../app/localization/moment/x-pseudo.js | 67 + .../v/1.12.0/app/localization/moment/yo.js | 59 + .../v/1.12.0/app/localization/moment/zh-cn.js | 109 + .../v/1.12.0/app/localization/moment/zh-hk.js | 102 + .../v/1.12.0/app/localization/moment/zh-tw.js | 102 + .../v/1.12.0/app/localization/webmail/README | 1 + .../app/localization/webmail/_source.en.yml | 713 + .../1.12.0/app/localization/webmail/ar_SA.yml | 695 + .../1.12.0/app/localization/webmail/bg_BG.yml | 713 + .../1.12.0/app/localization/webmail/cs_CZ.yml | 704 + .../1.12.0/app/localization/webmail/da_DK.yml | 710 + .../1.12.0/app/localization/webmail/de_DE.yml | 715 + .../1.12.0/app/localization/webmail/el_GR.yml | 547 + .../1.12.0/app/localization/webmail/en_GB.yml | 713 + .../1.12.0/app/localization/webmail/en_US.yml | 713 + .../1.12.0/app/localization/webmail/es_ES.yml | 716 + .../1.12.0/app/localization/webmail/et_EE.yml | 710 + .../1.12.0/app/localization/webmail/fa_IR.yml | 713 + .../1.12.0/app/localization/webmail/fi_FI.yml | 708 + .../1.12.0/app/localization/webmail/fr_FR.yml | 717 + .../1.12.0/app/localization/webmail/hu_HU.yml | 717 + .../1.12.0/app/localization/webmail/id_ID.yml | 713 + .../1.12.0/app/localization/webmail/is_IS.yml | 706 + .../1.12.0/app/localization/webmail/it_IT.yml | 713 + .../1.12.0/app/localization/webmail/ja_JP.yml | 709 + .../1.12.0/app/localization/webmail/ko_KR.yml | 685 + .../1.12.0/app/localization/webmail/lt_LT.yml | 711 + .../1.12.0/app/localization/webmail/lv_LV.yml | 709 + .../1.12.0/app/localization/webmail/nb_NO.yml | 712 + .../1.12.0/app/localization/webmail/nl_NL.yml | 714 + .../1.12.0/app/localization/webmail/pl_PL.yml | 712 + .../1.12.0/app/localization/webmail/pt_BR.yml | 714 + .../1.12.0/app/localization/webmail/pt_PT.yml | 704 + .../1.12.0/app/localization/webmail/ro_RO.yml | 711 + .../1.12.0/app/localization/webmail/ru_RU.yml | 713 + .../1.12.0/app/localization/webmail/sk_SK.yml | 710 + .../1.12.0/app/localization/webmail/sl_SI.yml | 710 + .../1.12.0/app/localization/webmail/sv_SE.yml | 713 + .../1.12.0/app/localization/webmail/tr_TR.yml | 710 + .../1.12.0/app/localization/webmail/uk_UA.yml | 704 + .../1.12.0/app/localization/webmail/zh_CN.yml | 708 + .../1.12.0/app/localization/webmail/zh_TW.yml | 697 + .../v/1.12.0/app/resources/RainLoop.asc | 18 + .../app/resources/images/empty-contact.png | Bin 0 -> 1881 bytes .../resources/images/services/amazon.com.png | Bin 0 -> 18032 bytes .../resources/images/services/apple.com.png | Bin 0 -> 2461 bytes .../resources/images/services/asana.com.png | Bin 0 -> 995 bytes .../resources/images/services/battle.net.png | Bin 0 -> 3194 bytes .../images/services/blizzard.com.png | Bin 0 -> 3194 bytes .../images/services/cnet.online.com.png | Bin 0 -> 6623 bytes .../images/services/connect.asana.com.png | Bin 0 -> 995 bytes .../images/services/e.paypal.com.png | Bin 0 -> 4545 bytes .../app/resources/images/services/ea.com.png | Bin 0 -> 6157 bytes .../resources/images/services/ebay.com.png | Bin 0 -> 4621 bytes .../resources/images/services/em.ea.com.png | Bin 0 -> 6157 bytes .../images/services/email.blizzard.com.png | Bin 0 -> 3194 bytes .../images/services/email.microsoft.com.png | Bin 0 -> 8348 bytes .../images/services/email.skype.com.png | Bin 0 -> 3435 bytes .../images/services/facebook.com.png | Bin 0 -> 10088 bytes .../images/services/facebookmail.com.png | Bin 0 -> 10088 bytes .../resources/images/services/github.com.png | Bin 0 -> 1884 bytes .../resources/images/services/google.com.png | Bin 0 -> 5949 bytes .../images/services/id.apple.com.png | Bin 0 -> 2461 bytes .../images/services/intl.paypal.com.png | Bin 0 -> 4545 bytes .../images/services/microsoft.com.png | Bin 0 -> 8348 bytes .../images/services/microsoftonline.com.png | Bin 0 -> 8348 bytes .../resources/images/services/myspace.com.png | Bin 0 -> 7553 bytes .../images/services/news.myspace.com.png | Bin 0 -> 7553 bytes .../images/services/news.onlive.com.png | Bin 0 -> 5000 bytes .../resources/images/services/onlive.com.png | Bin 0 -> 5000 bytes .../resources/images/services/paypal.com.png | Bin 0 -> 4545 bytes .../images/services/plus.google.com.png | Bin 0 -> 2952 bytes .../services/postmaster.twitter.com.png | Bin 0 -> 1104 bytes .../images/services/reply.ebay.com.png | Bin 0 -> 4621 bytes .../images/services/reply1.ebay.com.png | Bin 0 -> 4621 bytes .../images/services/reply2.ebay.com.png | Bin 0 -> 4621 bytes .../images/services/reply3.ebay.com.png | Bin 0 -> 4621 bytes .../resources/images/services/skype.com.png | Bin 0 -> 3435 bytes .../images/services/steampowered.com.png | Bin 0 -> 2697 bytes .../app/resources/images/services/ted.com.png | Bin 0 -> 1248 bytes .../resources/images/services/twitter.com.png | Bin 0 -> 1104 bytes .../resources/images/services/youtube.com.png | Bin 0 -> 2336 bytes .../v/1.12.0/app/templates/BadBrowser.html | 70 + .../v/1.12.0/app/templates/Error.html | 56 + .../v/1.12.0/app/templates/Index.html | 30 + .../v/1.12.0/app/templates/Social.html | 20 + .../1.12.0/app/templates/Themes/template.less | 357 + .../v/1.12.0/app/templates/Themes/values.less | 69 + .../app/templates/Views/Admin/AdminLogin.html | 50 + .../app/templates/Views/Admin/AdminMenu.html | 24 + .../app/templates/Views/Admin/AdminPane.html | 28 + .../Views/Admin/AdminSettingsAbout.html | 87 + .../Views/Admin/AdminSettingsBranding.html | 250 + .../Views/Admin/AdminSettingsContacts.html | 111 + .../Admin/AdminSettingsDomainListItem.html | 21 + .../Views/Admin/AdminSettingsDomains.html | 30 + .../Views/Admin/AdminSettingsGeneral.html | 181 + .../Views/Admin/AdminSettingsLicensing.html | 87 + .../Views/Admin/AdminSettingsLogin.html | 35 + .../Views/Admin/AdminSettingsPackages.html | 32 + .../Admin/AdminSettingsPackagesListItem.html | 20 + .../Admin/AdminSettingsPackagesTable.html | 9 + .../Admin/AdminSettingsPluginListItem.html | 11 + .../Admin/AdminSettingsPluginProperty.html | 32 + .../Views/Admin/AdminSettingsPlugins.html | 41 + .../Views/Admin/AdminSettingsSecurity.html | 143 + .../Views/Admin/AdminSettingsSocial.html | 194 + .../templates/Views/Admin/PopupsActivate.html | 50 + .../templates/Views/Admin/PopupsDomain.html | 271 + .../Views/Admin/PopupsDomainAlias.html | 53 + .../templates/Views/Admin/PopupsPlugin.html | 41 + .../app/templates/Views/Common/Cmd.html | 10 + .../app/templates/Views/Common/Pagenator.html | 5 + .../app/templates/Views/Common/PopupsAsk.html | 26 + .../Common/PopupsKeyboardShortcutsHelp.html | 90 + .../Views/Common/PopupsLanguages.html | 22 + .../Views/Common/PopupsWelcomePage.html | 22 + .../templates/Views/Components/Checkbox.html | 10 + .../Views/Components/CheckboxClassic.html | 7 + .../Components/CheckboxMaterialDesign.html | 10 + .../app/templates/Views/Components/Date.html | 14 + .../app/templates/Views/Components/Input.html | 14 + .../app/templates/Views/Components/Radio.html | 7 + .../Views/Components/SaveTrigger.html | 3 + .../templates/Views/Components/Select.html | 20 + .../templates/Views/Components/TextArea.html | 9 + .../app/templates/Views/User/About.html | 6 + .../Views/User/ComposeAttachment.html | 19 + .../app/templates/Views/User/Login.html | 149 + .../templates/Views/User/LoginWelcome.html | 5 + .../templates/Views/User/MailFolderList.html | 39 + .../Views/User/MailFolderListItem.html | 12 + .../Views/User/MailFolderListSystemItem.html | 12 + .../templates/Views/User/MailMessageList.html | 218 + .../Views/User/MailMessageListItem.html | 49 + .../MailMessageListItemNoPreviewPane.html | 50 + .../templates/Views/User/MailMessageView.html | 447 + .../app/templates/Views/User/PhotoSwipe.html | 33 + .../templates/Views/User/PopupsAccount.html | 50 + .../Views/User/PopupsAddOpenPgpKey.html | 27 + .../Views/User/PopupsAdvancedSearch.html | 107 + .../templates/Views/User/PopupsCompose.html | 218 + .../Views/User/PopupsComposeOpenPgp.html | 119 + .../templates/Views/User/PopupsContacts.html | 275 + .../templates/Views/User/PopupsFilter.html | 64 + .../Views/User/PopupsFolderClear.html | 34 + .../Views/User/PopupsFolderCreate.html | 42 + .../Views/User/PopupsFolderSystem.html | 63 + .../templates/Views/User/PopupsIdentity.html | 99 + .../Views/User/PopupsMessageOpenPgp.html | 54 + .../Views/User/PopupsNewOpenPgpKey.html | 58 + .../templates/Views/User/PopupsTemplate.html | 44 + .../User/PopupsTwoFactorConfiguration.html | 106 + .../Views/User/PopupsTwoFactorTest.html | 34 + .../Views/User/PopupsViewOpenPgpKey.html | 31 + .../Views/User/PopupsWindowSimpleMessage.html | 121 + .../Views/User/SettingsAccounts.html | 101 + .../Views/User/SettingsChangePassword.html | 48 + .../Views/User/SettingsContacts.html | 64 + .../templates/Views/User/SettingsCustom.html | 3 + .../templates/Views/User/SettingsFilters.html | 106 + .../User/SettingsFiltersActionDiscard.html | 0 .../User/SettingsFiltersActionForward.html | 24 + .../SettingsFiltersActionMoveToFolder.html | 17 + .../Views/User/SettingsFiltersActionNone.html | 0 .../User/SettingsFiltersActionReject.html | 6 + .../User/SettingsFiltersActionVacation.html | 45 + .../User/SettingsFiltersConditionDefault.html | 12 + .../User/SettingsFiltersConditionMore.html | 14 + .../User/SettingsFiltersConditionSize.html | 12 + .../Views/User/SettingsFolderItem.html | 37 + .../templates/Views/User/SettingsFolders.html | 45 + .../templates/Views/User/SettingsGeneral.html | 158 + .../templates/Views/User/SettingsMenu.html | 28 + .../templates/Views/User/SettingsOpenPGP.html | 99 + .../templates/Views/User/SettingsPane.html | 28 + .../Views/User/SettingsSecurity.html | 34 + .../templates/Views/User/SettingsSocial.html | 101 + .../Views/User/SettingsTemplates.html | 48 + .../templates/Views/User/SettingsThemes.html | 44 + .../templates/Views/User/SystemDropDown.html | 101 + .../rainloop/app/rainloop/v/1.12.0/check.php | 42 + .../app/rainloop/v/1.12.0/include.php | 234 + .../rainloop/app/rainloop/v/1.12.0/index.php | 0 .../app/rainloop/v/1.12.0/index.php.root | 19 + .../rainloop/v/1.12.0/static/android-icon.png | Bin 0 -> 5522 bytes .../v/1.12.0/static/apple-touch-icon.png | Bin 0 -> 832 bytes .../v/1.12.0/static/browsers/chrome.gif | Bin 0 -> 3803 bytes .../v/1.12.0/static/browsers/firefox.gif | Bin 0 -> 4202 bytes .../v/1.12.0/static/browsers/opera.gif | Bin 0 -> 3508 bytes .../v/1.12.0/static/browsers/safari.gif | Bin 0 -> 4876 bytes .../v/1.12.0/static/ckeditor/FIXES.txt | 12 + .../v/1.12.0/static/ckeditor/build-config.js | 152 + .../v/1.12.0/static/ckeditor/ckeditor.js | 1010 ++ .../v/1.12.0/static/ckeditor/ckeditor.orig.js | 1010 ++ .../v/1.12.0/static/ckeditor/config.js | 34 + .../v/1.12.0/static/ckeditor/contents.css | 208 + .../v/1.12.0/static/ckeditor/lang/af.js | 5 + .../v/1.12.0/static/ckeditor/lang/ar.js | 5 + .../v/1.12.0/static/ckeditor/lang/az.js | 5 + .../v/1.12.0/static/ckeditor/lang/bg.js | 5 + .../v/1.12.0/static/ckeditor/lang/bn.js | 5 + .../v/1.12.0/static/ckeditor/lang/bs.js | 5 + .../v/1.12.0/static/ckeditor/lang/ca.js | 5 + .../v/1.12.0/static/ckeditor/lang/cs.js | 5 + .../v/1.12.0/static/ckeditor/lang/cy.js | 5 + .../v/1.12.0/static/ckeditor/lang/da.js | 5 + .../v/1.12.0/static/ckeditor/lang/de-ch.js | 5 + .../v/1.12.0/static/ckeditor/lang/de.js | 5 + .../v/1.12.0/static/ckeditor/lang/el.js | 5 + .../v/1.12.0/static/ckeditor/lang/en-au.js | 5 + .../v/1.12.0/static/ckeditor/lang/en-ca.js | 5 + .../v/1.12.0/static/ckeditor/lang/en-gb.js | 5 + .../v/1.12.0/static/ckeditor/lang/en.js | 5 + .../v/1.12.0/static/ckeditor/lang/eo.js | 5 + .../v/1.12.0/static/ckeditor/lang/es.js | 5 + .../v/1.12.0/static/ckeditor/lang/et.js | 5 + .../v/1.12.0/static/ckeditor/lang/eu.js | 5 + .../v/1.12.0/static/ckeditor/lang/fa.js | 5 + .../v/1.12.0/static/ckeditor/lang/fi.js | 5 + .../v/1.12.0/static/ckeditor/lang/fo.js | 5 + .../v/1.12.0/static/ckeditor/lang/fr-ca.js | 5 + .../v/1.12.0/static/ckeditor/lang/fr.js | 5 + .../v/1.12.0/static/ckeditor/lang/gl.js | 5 + .../v/1.12.0/static/ckeditor/lang/gu.js | 5 + .../v/1.12.0/static/ckeditor/lang/he.js | 5 + .../v/1.12.0/static/ckeditor/lang/hi.js | 5 + .../v/1.12.0/static/ckeditor/lang/hr.js | 5 + .../v/1.12.0/static/ckeditor/lang/hu.js | 5 + .../v/1.12.0/static/ckeditor/lang/id.js | 5 + .../v/1.12.0/static/ckeditor/lang/is.js | 5 + .../v/1.12.0/static/ckeditor/lang/it.js | 5 + .../v/1.12.0/static/ckeditor/lang/ja.js | 5 + .../v/1.12.0/static/ckeditor/lang/ka.js | 5 + .../v/1.12.0/static/ckeditor/lang/km.js | 5 + .../v/1.12.0/static/ckeditor/lang/ko.js | 5 + .../v/1.12.0/static/ckeditor/lang/ku.js | 5 + .../v/1.12.0/static/ckeditor/lang/lt.js | 5 + .../v/1.12.0/static/ckeditor/lang/lv.js | 5 + .../v/1.12.0/static/ckeditor/lang/mk.js | 5 + .../v/1.12.0/static/ckeditor/lang/mn.js | 5 + .../v/1.12.0/static/ckeditor/lang/ms.js | 5 + .../v/1.12.0/static/ckeditor/lang/nb.js | 5 + .../v/1.12.0/static/ckeditor/lang/nl.js | 5 + .../v/1.12.0/static/ckeditor/lang/no.js | 5 + .../v/1.12.0/static/ckeditor/lang/oc.js | 5 + .../v/1.12.0/static/ckeditor/lang/pl.js | 5 + .../v/1.12.0/static/ckeditor/lang/pt-br.js | 5 + .../v/1.12.0/static/ckeditor/lang/pt.js | 5 + .../v/1.12.0/static/ckeditor/lang/ro.js | 5 + .../v/1.12.0/static/ckeditor/lang/ru.js | 5 + .../v/1.12.0/static/ckeditor/lang/si.js | 5 + .../v/1.12.0/static/ckeditor/lang/sk.js | 5 + .../v/1.12.0/static/ckeditor/lang/sl.js | 5 + .../v/1.12.0/static/ckeditor/lang/sq.js | 5 + .../v/1.12.0/static/ckeditor/lang/sr-latn.js | 5 + .../v/1.12.0/static/ckeditor/lang/sr.js | 5 + .../v/1.12.0/static/ckeditor/lang/sv.js | 5 + .../v/1.12.0/static/ckeditor/lang/th.js | 5 + .../v/1.12.0/static/ckeditor/lang/tr.js | 5 + .../v/1.12.0/static/ckeditor/lang/tt.js | 5 + .../v/1.12.0/static/ckeditor/lang/ug.js | 5 + .../v/1.12.0/static/ckeditor/lang/uk.js | 5 + .../v/1.12.0/static/ckeditor/lang/vi.js | 5 + .../v/1.12.0/static/ckeditor/lang/zh-cn.js | 5 + .../v/1.12.0/static/ckeditor/lang/zh.js | 5 + .../ckeditor/plugins/about/dialogs/about.js | 8 + .../about/dialogs/hidpi/logo_ckeditor.png | Bin 0 -> 13339 bytes .../plugins/about/dialogs/logo_ckeditor.png | Bin 0 -> 6757 bytes .../ckeditor/plugins/base64image/LICENSE.md | 1243 ++ .../ckeditor/plugins/base64image/README.md | 21 + .../base64image/dialogs/base64image.js | 16 + .../plugins/clipboard/dialogs/paste.js | 12 + .../colordialog/dialogs/colordialog.css | 20 + .../colordialog/dialogs/colordialog.js | 14 + .../plugins/dialog/dialogDefinition.js | 4 + .../1.12.0/static/ckeditor/plugins/icons.png | Bin 0 -> 5775 bytes .../static/ckeditor/plugins/icons_hidpi.png | Bin 0 -> 17424 bytes .../ckeditor/plugins/image/dialogs/image.js | 44 + .../ckeditor/plugins/image/images/noimage.png | Bin 0 -> 1610 bytes .../ckeditor/plugins/image2/dialogs/image2.js | 15 + .../ckeditor/plugins/link/dialogs/anchor.js | 7 + .../ckeditor/plugins/link/dialogs/link.js | 28 + .../ckeditor/plugins/link/images/anchor.png | Bin 0 -> 752 bytes .../plugins/link/images/hidpi/anchor.png | Bin 0 -> 1109 bytes .../plugins/plain/icons/hidpi/plain-rtl.png | Bin 0 -> 1968 bytes .../plugins/plain/icons/hidpi/plain.png | Bin 0 -> 1999 bytes .../plugins/plain/icons/plain-rtl.png | Bin 0 -> 762 bytes .../ckeditor/plugins/plain/icons/plain.png | Bin 0 -> 764 bytes .../static/ckeditor/plugins/plain/plugin.js | 216 + .../ckeditor/plugins/quicktable/CHANGELOG.md | 38 + .../ckeditor/plugins/quicktable/Gruntfile.js | 5 + .../ckeditor/plugins/quicktable/LICENSE | 339 + .../ckeditor/plugins/quicktable/README.md | 52 + .../ckeditor/plugins/quicktable/package.json | 31 + .../ckeditor/plugins/quicktable/template.jst | 469 + .../ckeditor/plugins/signature/plugin.js | 141 + .../ckeditor/plugins/table/dialogs/table.js | 21 + .../ckeditor/plugins/widget/images/handle.png | Bin 0 -> 220 bytes .../ckeditor/skins/moono-lisa/dialog.css | 5 + .../ckeditor/skins/moono-lisa/dialog_ie.css | 5 + .../ckeditor/skins/moono-lisa/dialog_ie8.css | 5 + .../skins/moono-lisa/dialog_iequirks.css | 5 + .../ckeditor/skins/moono-lisa/editor.css | 5 + .../skins/moono-lisa/editor_gecko.css | 5 + .../ckeditor/skins/moono-lisa/editor_ie.css | 5 + .../ckeditor/skins/moono-lisa/editor_ie8.css | 5 + .../skins/moono-lisa/editor_iequirks.css | 5 + .../ckeditor/skins/moono-lisa/icons.png | Bin 0 -> 5775 bytes .../ckeditor/skins/moono-lisa/icons_hidpi.png | Bin 0 -> 17424 bytes .../skins/moono-lisa/images/arrow.png | Bin 0 -> 191 bytes .../skins/moono-lisa/images/close.png | Bin 0 -> 615 bytes .../skins/moono-lisa/images/hidpi/close.png | Bin 0 -> 1238 bytes .../moono-lisa/images/hidpi/lock-open.png | Bin 0 -> 1071 bytes .../skins/moono-lisa/images/hidpi/lock.png | Bin 0 -> 1062 bytes .../skins/moono-lisa/images/hidpi/refresh.png | Bin 0 -> 1623 bytes .../skins/moono-lisa/images/lock-open.png | Bin 0 -> 511 bytes .../ckeditor/skins/moono-lisa/images/lock.png | Bin 0 -> 506 bytes .../skins/moono-lisa/images/refresh.png | Bin 0 -> 757 bytes .../skins/moono-lisa/images/spinner.gif | Bin 0 -> 2984 bytes .../ckeditor/skins/moono-lisa/readme.md | 46 + .../v/1.12.0/static/ckeditor/styles.js | 137 + .../app/rainloop/v/1.12.0/static/css/app.css | 11581 ++++++++++++++++ .../rainloop/v/1.12.0/static/css/app.min.css | 7 + .../v/1.12.0/static/css/default-skin.png | Bin 0 -> 1088 bytes .../v/1.12.0/static/css/default-skin.svg | 38 + .../rainloop/v/1.12.0/static/css/flags.png | Bin 0 -> 78832 bytes .../rainloop/v/1.12.0/static/css/fonts/lg.eot | Bin 0 -> 2904 bytes .../rainloop/v/1.12.0/static/css/fonts/lg.svg | 42 + .../rainloop/v/1.12.0/static/css/fonts/lg.ttf | Bin 0 -> 2760 bytes .../v/1.12.0/static/css/fonts/lg.woff | Bin 0 -> 2836 bytes .../v/1.12.0/static/css/fonts/rainloop.eot | Bin 0 -> 19960 bytes .../v/1.12.0/static/css/fonts/rainloop.svg | 127 + .../v/1.12.0/static/css/fonts/rainloop.ttf | Bin 0 -> 19792 bytes .../v/1.12.0/static/css/fonts/rainloop.woff | Bin 0 -> 14128 bytes .../v/1.12.0/static/css/images/editor.png | Bin 0 -> 8395 bytes .../static/css/images/empty-contact.png | Bin 0 -> 1881 bytes .../v/1.12.0/static/css/images/grey.png | Bin 0 -> 109 bytes .../css/images/icom-message-notification.png | Bin 0 -> 832 bytes .../v/1.12.0/static/css/images/loading.gif | Bin 0 -> 869 bytes .../static/css/images/rainloop-logo.png | Bin 0 -> 4750 bytes .../v/1.12.0/static/css/images/sync.gif | Bin 0 -> 847 bytes .../v/1.12.0/static/css/images/sync.png | Bin 0 -> 356 bytes .../v/1.12.0/static/css/images/white.png | Bin 0 -> 110 bytes .../v/1.12.0/static/css/img/loading.gif | Bin 0 -> 869 bytes .../rainloop/v/1.12.0/static/css/loading.gif | Bin 0 -> 869 bytes .../v/1.12.0/static/css/preloader.gif | Bin 0 -> 869 bytes .../rainloop/v/1.12.0/static/css/social.css | 448 + .../v/1.12.0/static/css/social.min.css | 1 + .../v/1.12.0/static/favicon-light.ico | Bin 0 -> 1150 bytes .../v/1.12.0/static/favicon-light.png | Bin 0 -> 866 bytes .../app/rainloop/v/1.12.0/static/favicon.ico | Bin 0 -> 1150 bytes .../app/rainloop/v/1.12.0/static/favicon.png | Bin 0 -> 832 bytes .../app/rainloop/v/1.12.0/static/js/admin.js | 1105 ++ .../app/rainloop/v/1.12.0/static/js/app.js | 1412 ++ .../app/rainloop/v/1.12.0/static/js/boot.js | 494 + .../app/rainloop/v/1.12.0/static/js/libs.js | 4521 ++++++ .../v/1.12.0/static/js/min/admin.min.js | 1 + .../v/1.12.0/static/js/min/app.min.js | 1 + .../v/1.12.0/static/js/min/boot.min.js | 1 + .../v/1.12.0/static/js/min/libs.min.js | 1 + .../v/1.12.0/static/js/min/openpgp.min.js | 2 + .../static/js/min/openpgp.worker.min.js | 2 + .../rainloop/v/1.12.0/static/manifest.json | 16 + .../v/1.12.0/static/sounds/new-mail.mp3 | Bin 0 -> 15288 bytes .../v/1.12.0/static/sounds/new-mail.ogg | Bin 0 -> 15090 bytes .../v/1.12.0/themes/A/images/background.jpg | Bin 0 -> 75508 bytes .../v/1.12.0/themes/A/images/preview.png | Bin 0 -> 5569 bytes .../rainloop/v/1.12.0/themes/A/styles.less | 55 + .../themes/Blurred/images/background.jpg | Bin 0 -> 47451 bytes .../1.12.0/themes/Blurred/images/preview.png | Bin 0 -> 6399 bytes .../v/1.12.0/themes/Blurred/styles.less | 58 + .../v/1.12.0/themes/Clear/images/preview.png | Bin 0 -> 961 bytes .../v/1.12.0/themes/Clear/styles.less | 3 + .../themes/DarkShine/images/background.jpg | Bin 0 -> 73258 bytes .../themes/DarkShine/images/preview.png | Bin 0 -> 5322 bytes .../v/1.12.0/themes/DarkShine/styles.less | 58 + .../themes/Default/images/background.jpg | Bin 0 -> 4988 bytes .../themes/Default/images/background.png | Bin 0 -> 37162 bytes .../1.12.0/themes/Default/images/preview.png | Bin 0 -> 5804 bytes .../v/1.12.0/themes/Default/styles.less | 57 + .../1.12.0/themes/Linen/images/background.jpg | Bin 0 -> 7258 bytes .../1.12.0/themes/Linen/images/background.png | Bin 0 -> 15597 bytes .../v/1.12.0/themes/Linen/images/preview.png | Bin 0 -> 3142 bytes .../v/1.12.0/themes/Linen/styles.less | 54 + .../1.12.0/themes/Love/images/background.jpg | Bin 0 -> 84413 bytes .../v/1.12.0/themes/Love/images/preview.png | Bin 0 -> 6458 bytes .../rainloop/v/1.12.0/themes/Love/styles.less | 57 + .../rainloop/v/1.12.0/themes/Mobile/ext.less | 18 + .../v/1.12.0/themes/Mobile/images/preview.png | Bin 0 -> 961 bytes .../v/1.12.0/themes/Mobile/styles.less | 3 + .../1.12.0/themes/Snow/images/background.jpg | Bin 0 -> 115505 bytes .../v/1.12.0/themes/Snow/images/preview.png | Bin 0 -> 5660 bytes .../rainloop/v/1.12.0/themes/Snow/styles.less | 57 + .../themes/Squares/images/background.jpg | Bin 0 -> 33347 bytes .../themes/Squares/images/background.png | Bin 0 -> 58585 bytes .../1.12.0/themes/Squares/images/preview.png | Bin 0 -> 6293 bytes .../v/1.12.0/themes/Squares/styles.less | 56 + .../themes/SquaresDark/images/background.jpg | Bin 0 -> 19418 bytes .../themes/SquaresDark/images/background.png | Bin 0 -> 33147 bytes .../themes/SquaresDark/images/preview.png | Bin 0 -> 4767 bytes .../v/1.12.0/themes/SquaresDark/styles.less | 57 + .../themes/Stripes/images/background.jpg | Bin 0 -> 58007 bytes .../1.12.0/themes/Stripes/images/preview.png | Bin 0 -> 3586 bytes .../v/1.12.0/themes/Stripes/styles.less | 56 + .../1.12.0/themes/Wood/images/background.jpg | Bin 0 -> 39327 bytes .../1.12.0/themes/Wood/images/background.png | Bin 0 -> 150200 bytes .../v/1.12.0/themes/Wood/images/preview.png | Bin 0 -> 11171 bytes .../rainloop/v/1.12.0/themes/Wood/styles.less | 57 + .../v/1.12.0/themes/Xv/images/background.jpg | Bin 0 -> 8556 bytes .../v/1.12.0/themes/Xv/images/background.png | Bin 0 -> 37310 bytes .../v/1.12.0/themes/Xv/images/preview.png | Bin 0 -> 6221 bytes .../rainloop/v/1.12.0/themes/Xv/styles.less | 54 + .../core/rainloop/config/apache-config.conf | 32 + .../config/conf-available/security.conf | 74 + .../rainloop/config/copper.opensource.lk.conf | 31 + copper-server/core/rainloop/config/hosts | 8 + .../config/mods-available/proxy_html.conf | 62 + copper-server/core/rainloop/config/ports.conf | 16 + .../core/rainloop/config/scripts/index.html | 6 + .../config/scripts/init_letsencrypt.sh | 6 + .../rainloop/config/scripts/run_apache.sh | 22 + .../config/scripts/run_letsencrypt.sh | 8 + copper-server/core/rainloop/hosts | 8 + copper-server/core/rainloop/tls/cert.pem | 18 + copper-server/core/rainloop/tls/dhparam.pem | 8 + copper-server/core/rainloop/tls/fullchain.pem | 1 + copper-server/core/rainloop/tls/privkey.pem | 6 + copper-server/core/svc-ingress-nginx-lb.yaml | 25 + copper-server/core/tls/cert.pem | 18 + copper-server/core/tls/dhparam.pem | 8 + copper-server/core/tls/fullchain.pem | 1 + copper-server/core/tls/privkey.pem | 6 + copper-server/kubernetes/README.md | 10 +- .../kubernetes/copperclient/Dockerfile | 185 +- .../kubernetes/copperclient/INFORMATION.md | 141 + copper-server/kubernetes/copperclient/LICENSE | 201 + .../kubernetes/copperclient/README.md | 54 + .../copperclient/apache-config.conf | 16 - .../kubernetes/copperclient/apache2.conf | 223 - .../23e3d58cd184245411d2a84bf33e57162799021f | 1 + .../3e18609e097b6278b6c17fa9dd6de9db3a729b67 | 1 + .../5b1c51ed23b96bde49c865e074352dc9b29808f0 | 1 + .../0ee7ef0223f943a6f3f62cd089a59644f980d5f8 | 1 - .../97cc368e9e119a3cd54352632cd5ec8a61129f2d | 1 - .../9c2bfd930fad89419786b5bc0199a4eafd8fe4c8 | 2 +- .../b82792fad72d7b38639e5fc82c113102969af8b7 | 1 + .../_data_/_default_/configs/application.ini | 21 +- .../ef/efaeb36a60ef9682802c6a704c2d784d | 2 +- .../1.12.0/app/libraries/RainLoop/Actions.php | 3 +- .../copperclient/config/copper.https.conf | 35 + .../config/copper.opensource.lk.conf | 33 + .../kubernetes/copperclient/config/hosts | 8 + .../config/mods-available/proxy_html.conf | 62 + .../kubernetes/copperclient/config/ports.conf | 17 + .../copperclient/config/scripts/index.html | 6 + .../config/scripts/init_letsencrypt.sh | 6 + .../copperclient/config/scripts/run_apache.sh | 22 + .../config/scripts/run_letsencrypt.sh | 8 + copper-server/kubernetes/copperclient/fqdn | 1 - copper-server/kubernetes/copperclient/hosts | 2 - .../kubernetes/copperclient/servername.conf | 1 - .../kubernetes/copperclient/tls/cert.pem | 18 + .../copperclient/tls/copper.opensource.lk.crt | 22 + .../copperclient/tls/copper.opensource.lk.csr | 18 + .../copperclient/tls/copper.opensource.lk.key | 28 + .../kubernetes/copperclient/tls/dhparam.pem | 8 + .../kubernetes/copperclient/tls/fullchain.pem | 1 + .../kubernetes/copperclient/tls/privkey.pem | 6 + .../kubernetes/copperclient/webmail.yaml | 25 +- copper-server/kubernetes/deployment/README.md | 4 +- .../kubernetes/deployment/undeploy.sh | 4 + 1659 files changed, 285707 insertions(+), 296 deletions(-) create mode 100644 copper-server/core/README.md create mode 100644 copper-server/core/homail.yaml create mode 100644 copper-server/core/ingress.yaml create mode 100755 copper-server/core/rainloop/Dockerfile create mode 100755 copper-server/core/rainloop/README.md create mode 100644 copper-server/core/rainloop/app/data/INSTALLED create mode 100644 copper-server/core/rainloop/app/data/SALT.php create mode 100644 copper-server/core/rainloop/app/data/VERSION rename copper-server/{kubernetes/copperclient/app/data/_data_/_default_/cache/5f/26/5f2674bb150fb78914507337015f9200efb9b841 => core/rainloop/app/data/_data_/_default_/cache/23/e3/23e3d58cd184245411d2a84bf33e57162799021f} (100%) create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/cache/3e/18/3e18609e097b6278b6c17fa9dd6de9db3a729b67 create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/cache/5b/1c/5b1c51ed23b96bde49c865e074352dc9b29808f0 create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/cache/__/th/ar/tharanga_copper_opensource_lk/9c/2b/9c2bfd930fad89419786b5bc0199a4eafd8fe4c8 rename copper-server/{kubernetes/copperclient/app/data/_data_/_default_/cache/50/3e/503e54026fccf1a1067721a87a146f95fa142c55 => core/rainloop/app/data/_data_/_default_/cache/b8/27/b82792fad72d7b38639e5fc82c113102969af8b7} (95%) create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/configs/application.ini create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/configs/plugin-directadmin-change-password.ini create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/configs/plugin-ldap-change-password.ini create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/domains/copper.opensource.lk.ini create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/domains/coppermail.dyndns.org.ini create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/domains/disabled create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/domains/gmail.com.ini create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/domains/outlook.com.ini create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/domains/qq.com.ini create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/domains/yahoo.com.ini create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/ChangePasswordLdapDriver.php create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/LICENSE create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/README create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/VERSION create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/index.php create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin@coppermail.dyndns.org/settings_local create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin_horde@copper.opensource.lk/settings_local create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin_horde@coppermail.dyndns.org/settings_local create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/an/anushka@copper.opensource.lk/settings_local create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ba/bandara@copper.opensource.lk/settings_local create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@copper.opensource.lk/settings_local create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@coppermail.dyndns.org/settings create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@coppermail.dyndns.org/settings_local create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/s_/s_admin@coppermail.dyndns.org/settings_local create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/su/supun@copper.opensource.lk/settings_local create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/te/test@copper.opensource.lk/settings_local create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/te/test@coppermail.dyndns.org/settings_local create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/th/tharanga@copper.opensource.lk/settings_local create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/data/__nobody__/ef/efaeb36a60ef9682802c6a704c2d784d create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/files/ls/lsf@coppermail.dyndns.org/38/87/38871f9f7a2ad0d70b1e51991143db90bfbbb3c2 create mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/files/ls/lsf@coppermail.dyndns.org/aa/6b/aa6bc308dedb13d95e120aafb590f4645301f8cd create mode 100644 copper-server/core/rainloop/app/data/index.html create mode 100644 copper-server/core/rainloop/app/data/index.php create mode 100755 copper-server/core/rainloop/app/index.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/domains/default.ini.dist create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/domains/disabled create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/domains/gmail.com.ini create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/domains/outlook.com.ini create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/domains/qq.com.ini create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/domains/yahoo.com.ini create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/handle.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Authentication/AccessToken.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Authentication/AccessTokenMetadata.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Authentication/OAuth2Client.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookAuthenticationException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookAuthorizationException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookClientException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookOtherException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookResponseException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookSDKException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookServerException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookThrottleException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Facebook.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookApp.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookBatchRequest.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookBatchResponse.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookClient.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookRequest.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookResponse.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FileUpload/FacebookFile.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FileUpload/FacebookVideo.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FileUpload/Mimetypes.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/Collection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphAchievement.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphAlbum.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphApplication.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphCoverPhoto.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphEdge.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphEvent.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphGroup.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphList.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphLocation.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphNode.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphNodeFactory.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphObject.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphObjectFactory.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphPage.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphPicture.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphSessionInfo.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphUser.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookCanvasHelper.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookJavaScriptHelper.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookPageTabHelper.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookRedirectLoginHelper.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookSignedRequestFromInputHelper.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/GraphRawResponse.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/RequestBodyInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/RequestBodyMultipart.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/RequestBodyUrlEncoded.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookCurl.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookCurlHttpClient.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookGuzzleHttpClient.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookHttpClientInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookStream.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookStreamHttpClient.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/certs/DigiCertHighAssuranceEVRootCA.pem create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/FacebookMemoryPersistentDataHandler.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/FacebookSessionPersistentDataHandler.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/PersistentDataInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/McryptPseudoRandomStringGenerator.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/OpenSslPseudoRandomStringGenerator.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/PseudoRandomStringGeneratorInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/PseudoRandomStringGeneratorTrait.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/UrandomPseudoRandomStringGenerator.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/SignedRequest.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/FacebookUrlDetectionHandler.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/FacebookUrlManipulator.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/UrlDetectionInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/autoload.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/AdapterInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/BatchContext.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlAdapter.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlFactory.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/MultiAdapter.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/RequestMediator.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/FakeParallelAdapter.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/MockAdapter.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/ParallelAdapterInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/StreamAdapter.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/StreamingProxyAdapter.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Transaction.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/TransactionInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/TransactionIterator.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Client.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/ClientInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Collection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/CookieJar.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/CookieJarInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/FileCookieJar.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/SessionCookieJar.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/SetCookie.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractEvent.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractRequestEvent.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractTransferEvent.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/BeforeEvent.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/CompleteEvent.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/Emitter.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/EmitterInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/ErrorEvent.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/EventInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/HasEmitterInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/HasEmitterTrait.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/HeadersEvent.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/ListenerAttacherTrait.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/RequestEvents.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/SubscriberInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/AdapterException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/BadResponseException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/ClientException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/CouldNotRewindStreamException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/ParseException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/RequestException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/ServerException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/TooManyRedirectsException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/TransferException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/HasDataTrait.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/AbstractMessage.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageFactory.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageFactoryInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageParser.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/Request.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/RequestInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/Response.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/ResponseInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Mimetypes.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/MultipartBody.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostBody.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostBodyInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostFile.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostFileInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Query.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Cookie.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/History.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/HttpError.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Mock.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Prepare.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Redirect.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/ToArrayInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/UriTemplate.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Url.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/cacert.pem create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/functions.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Draw/DrawerInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Effects/EffectsInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/Exception.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/InvalidArgumentException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/NotSupportedException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/OutOfBoundsException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/RuntimeException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Border.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Canvas.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Grayscale.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/OnPixelBased.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/RelativeResize.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/ApplyMask.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Autorotate.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Copy.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Crop.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Fill.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/FlipHorizontally.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/FlipVertically.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Paste.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Resize.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Rotate.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Save.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Show.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Strip.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Thumbnail.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/WebOptimization.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/FilterInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/ImagineAware.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Transformation.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Drawer.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Effects.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Font.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Image.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Imagine.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Layers.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Drawer.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Effects.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Font.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Image.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Imagine.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Layers.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractFont.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractImage.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractImagine.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractLayers.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Box.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/BoxInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/FillInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Horizontal.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Linear.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Vertical.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/FontInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Histogram/Bucket.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Histogram/Range.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ImageInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ImagineInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/LayersInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ManipulatorInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/AbstractMetadataReader.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/DefaultMetadataReader.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/ExifMetadataReader.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/MetadataBag.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/MetadataReaderInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/CMYK.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/CMYK.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/ColorInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/Gray.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/RGB.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/ColorParser.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Grayscale.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/PaletteInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/RGB.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Point.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Point/Center.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/PointInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Profile.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ProfileInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Drawer.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Effects.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Font.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Image.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Imagine.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Layers.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Collection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Crypt.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/DateTimeHelper.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Enumerations/Charset.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Enumerations/Encoding.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Exceptions/Exception.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Exceptions/InvalidArgumentException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/HtmlUtils.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Http.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/LinkFinder.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Loader.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/ResourceRegistry.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/Binary.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/Literal.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/SubStreams.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/TempFile.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/Test.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Utils.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Validator.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/CacheClient.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/DriverInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/APC.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/File.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/Memcache.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/Redis.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Config.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Hooks.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/BodyStructure.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/FetchType.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/FolderResponseStatus.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/FolderStatus.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/FolderType.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/MessageFlag.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/ResponseStatus.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/ResponseType.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/StoreAction.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/Exception.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/InvalidResponseException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/LoginBadCredentialsException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/LoginBadMethodException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/LoginException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/NegativeResponseException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/ResponseException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/ResponseNotFoundException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/RuntimeException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/FetchResponse.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Folder.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/FolderInformation.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/ImapClient.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/NamespaceResult.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Response.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/LICENSE create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Driver.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Callback.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/File.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Inline.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Syslog.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Enumerations/Type.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Logger.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Attachment.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/AttachmentCollection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Exceptions/Exception.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Exceptions/NonEmptyFolder.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Exceptions/RuntimeException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Folder.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/FolderCollection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/MailClient.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Message.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/MessageCollection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/MailSo.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Attachment.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/AttachmentCollection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Email.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/EmailCollection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/EmailDep.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Enumerations/Constants.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Enumerations/DkimStatus.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Enumerations/Header.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Enumerations/MessagePriority.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Enumerations/MimeType.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Enumerations/Parameter.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Enumerations/Sensitivity.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Header.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/HeaderCollection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Message.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Parameter.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/ParameterCollection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Parser/ParserEmpty.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Parser/ParserInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Parser/ParserMemory.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Part.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/PartCollection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Enumerations/ConnectionSecurityType.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/ConnectionException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/Exception.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/InvalidArgumentException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketAlreadyConnectedException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketCanNotConnectToHostException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketConnectionDoesNotAvailableException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketReadException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketReadTimeoutException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketUnreadBufferException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketUnsuppoterdSecureConnectionException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketWriteException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/NetClient.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/Exception.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/LoginBadCredentialsException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/NegativeResponseException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/ResponseException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/RuntimeException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Pop3Client.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/Exception.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/LoginBadCredentialsException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/NegativeResponseException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/ResponseException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/RuntimeException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/PoppassdClient.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/Exception.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/LoginBadCredentialsException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/LoginBadMethodException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/LoginException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/NegativeResponseException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/ResponseException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/RuntimeException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/ManageSieveClient.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/Exception.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/LoginBadCredentialsException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/LoginBadMethodException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/LoginException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/NegativeResponseException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/ResponseException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/RuntimeException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/SmtpClient.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Vendors/Net/IDNA2.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Vendors/Net/IDNA2CustomExceptions.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Version.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/LICENSE.txt create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/Mobile_Detect.json create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/Mobile_Detect.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/README.md create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/composer.json create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/namespaced/Detection/MobileDetect.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/ruleset.xml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/Client.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/GrantType/AuthorizationCode.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/GrantType/ClientCredentials.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/GrantType/IGrantType.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/GrantType/Password.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/GrantType/RefreshToken.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/README create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPGangsta/GoogleAuthenticator.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/GD.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/PHPThumb.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/PluginInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/Plugins/Reflection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Autoloader.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Client.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientContextInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/ClusterStrategy.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/DistributorInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/EmptyRingException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/HashRing.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/KetamaRing.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Hash/CRC16.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Hash/HashGeneratorInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/PredisStrategy.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/RedisStrategy.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/StrategyInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/CursorBasedIterator.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/HashKey.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/Keyspace.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/ListKey.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/SetKey.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/SortedSetKey.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Command.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/CommandInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionAuth.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionEcho.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionPing.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionQuit.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionSelect.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashDelete.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashExists.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGet.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGetAll.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGetMultiple.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashIncrementBy.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashIncrementByFloat.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashKeys.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashLength.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashScan.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSet.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSetMultiple.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSetPreserve.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashStringLength.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashValues.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogAdd.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogCount.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogMerge.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyDelete.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyDump.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExists.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExpire.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExpireAt.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyKeys.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyMigrate.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyMove.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPersist.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseExpire.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseExpireAt.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseTimeToLive.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRandom.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRename.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRenamePreserve.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRestore.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyScan.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeySort.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyTimeToLive.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyType.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListIndex.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListInsert.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListLength.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopFirst.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopFirstBlocking.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLast.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastBlocking.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastPushHead.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastPushHeadBlocking.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushHead.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushHeadX.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushTail.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushTailX.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListRange.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListRemove.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListSet.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListTrim.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PrefixableCommandInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/KeyPrefixProcessor.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/ProcessorChain.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/ProcessorInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubPublish.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubPubsub.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubSubscribe.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubSubscribeByPattern.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubUnsubscribe.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubUnsubscribeByPattern.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/RawCommand.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ScriptCommand.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerBackgroundRewriteAOF.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerBackgroundSave.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerClient.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerCommand.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerConfig.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerDatabaseSize.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerEval.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerEvalSHA.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerFlushAll.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerFlushDatabase.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerInfo.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerInfoV26x.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerLastSave.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerMonitor.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerObject.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSave.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerScript.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSentinel.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerShutdown.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSlaveOf.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSlowlog.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerTime.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetAdd.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetCardinality.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetDifference.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetDifferenceStore.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIntersection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIntersectionStore.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIsMember.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetMembers.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetMove.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetPop.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetRandomMember.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetRemove.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetScan.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetUnion.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetUnionStore.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringAppend.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitCount.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitOp.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitPos.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringDecrement.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringDecrementBy.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGet.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetBit.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetMultiple.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetRange.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetSet.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrement.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrementBy.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrementByFloat.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringPreciseSetExpire.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSet.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetBit.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetExpire.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetMultiple.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetMultiplePreserve.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetPreserve.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetRange.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringStrlen.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSubstr.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionDiscard.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionExec.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionMulti.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionUnwatch.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionWatch.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetAdd.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetCardinality.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetCount.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetIncrementBy.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetIntersectionStore.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetLexCount.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRange.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRangeByLex.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRangeByScore.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRank.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemove.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByLex.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByRank.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByScore.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRange.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRangeByLex.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRangeByScore.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRank.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetScan.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetScore.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetUnionStore.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/CommunicationException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ClusterOption.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ConnectionFactoryOption.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ExceptionsOption.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/OptionInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/Options.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/OptionsInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/PrefixOption.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ProfileOption.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ReplicationOption.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/AbstractConnection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/ClusterInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/MasterSlaveReplication.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/PredisCluster.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/RedisCluster.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/ReplicationInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/AggregateConnectionInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/CompositeConnectionInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/CompositeStreamConnection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ConnectionException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ConnectionInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Factory.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/FactoryInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/NodeConnectionInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Parameters.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ParametersInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/PhpiredisSocketConnection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/PhpiredisStreamConnection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/StreamConnection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/WebdisConnection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Monitor/Consumer.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/NotSupportedException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/Atomic.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/ConnectionErrorProof.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/FireAndForget.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/Pipeline.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PredisException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/Factory.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/ProfileInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisProfile.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisUnstable.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion200.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion220.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion240.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion260.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion280.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion300.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ProtocolException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ProtocolProcessorInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/RequestSerializerInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ResponseReaderInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/CompositeProtocolProcessor.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/BulkResponse.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/ErrorResponse.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/IntegerResponse.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/MultiBulkResponse.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/ResponseHandlerInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/StatusResponse.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/StreamableMultiBulkResponse.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/ProtocolProcessor.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/RequestSerializer.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/ResponseReader.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/AbstractConsumer.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/Consumer.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/DispatcherLoop.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Replication/ReplicationStrategy.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Error.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ErrorInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulk.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulkIterator.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulkTuple.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ResponseInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ServerException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Status.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Session/Handler.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/AbortedMultiExecException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/MultiExec.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/MultiExecState.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Actions.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Api.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Common/BackwardCapability/Account.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Common/FacebookRainLoopPersistentDataHandler.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Common/MbStringFix.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Common/PdoAbstract.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Common/RainLoopFacebookRedirectLoginHelper.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Config/AbstractConfig.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Config/Application.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Config/Plugin.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Enumerations/Capa.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Enumerations/Layout.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Enumerations/PluginPropertyType.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Enumerations/SignMeType.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Enumerations/TimeFormat.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Enumerations/UploadClientError.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Enumerations/UploadError.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Exceptions/ClientException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Exceptions/Exception.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Exceptions/InvalidArgumentException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Exceptions/RuntimeException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/KeyPathHelper.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Model/Account.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Model/Domain.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Model/Identity.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Model/Template.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Notifications.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Plugins/AbstractPlugin.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Plugins/Helper.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Plugins/Manager.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Plugins/Property.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/AbstractProvider.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/AddressBook.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/AddressBook/AddressBookInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/AddressBook/Classes/Contact.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/AddressBook/Classes/Property.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/AddressBook/Classes/Tag.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/AddressBook/Enumerations/PropertyType.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/AddressBook/PdoAddressBook.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/ChangePassword.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/ChangePassword/ChangePasswordInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Domain.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Domain/DefaultDomain.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Domain/DomainAdminInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Domain/DomainInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Files.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Files/FileStorage.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Files/IFiles.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Filters.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Filters/Classes/Filter.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Filters/Classes/FilterCondition.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ActionType.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ConditionField.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ConditionType.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ConditionsType.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Filters/FiltersInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Filters/SieveStorage.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Settings.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Settings/DefaultSettings.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Settings/ISettings.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Storage.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Storage/Enumerations/StorageType.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Storage/FileStorage.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Storage/IStorage.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Storage/TemproryApcStorage.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Suggestions.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Suggestions/ISuggestions.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Suggestions/OwnCloudSuggestions.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Suggestions/TestSuggestions.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/TwoFactorAuth.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/TwoFactorAuth/AbstractTwoFactorAuth.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/TwoFactorAuth/GoogleTwoFactorAuth.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/TwoFactorAuth/TwoFactorAuthInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Service.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/ServiceActions.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Settings.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Social.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Utils.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/AbstractBackend.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/BackendInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/NotificationSupport.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/PDO.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/SharingSupport.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Calendar.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarObject.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarQueryParser.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarQueryValidator.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarRootNode.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Exception/InvalidComponentType.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ICSExportPlugin.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ICalendar.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ICalendarObject.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/IShareableCalendar.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ISharedCalendar.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Collection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/ICollection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/INode.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/INotificationType.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Node.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/Invite.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/InviteReply.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/SystemStatus.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Plugin.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/Collection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/IProxyRead.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/IProxyWrite.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/ProxyRead.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/ProxyWrite.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/User.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/AllowedSharingModes.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/Invite.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/ScheduleCalendarTransp.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCalendarComponentSet.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCalendarData.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCollationSet.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Schedule/IMip.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Schedule/IOutbox.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Schedule/Outbox.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ShareableCalendar.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/SharedCalendar.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/SharingPlugin.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/UserCalendars.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Version.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/AddressBook.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/AddressBookQueryParser.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/AddressBookRoot.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Backend/AbstractBackend.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Backend/BackendInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Backend/PDO.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Card.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/IAddressBook.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/ICard.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/IDirectory.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Plugin.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Property/SupportedAddressData.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/UserAddressBooks.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/VCFExportPlugin.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Version.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/AbstractBasic.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/AbstractDigest.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/Apache.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/BackendInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/File.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/PDO.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Plugin.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/GuessContentType.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/MapGetToPropFind.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/Plugin.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/favicon.ico create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/addressbook.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/calendar.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/card.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/collection.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/file.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/parent.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/principal.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Client.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Collection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/BadRequest.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/Conflict.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/ConflictingLock.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/FileNotFound.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/Forbidden.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/InsufficientStorage.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/InvalidResourceType.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/LockTokenMatchesRequestUri.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/Locked.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/MethodNotAllowed.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/NotAuthenticated.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/NotFound.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/NotImplemented.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/PaymentRequired.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/PreconditionFailed.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/ReportNotSupported.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/RequestedRangeNotSatisfiable.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/ServiceUnavailable.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/UnsupportedMediaType.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FS/Directory.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FS/File.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FS/Node.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/Directory.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/File.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/Node.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/File.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/ICollection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/IExtendedCollection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/IFile.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/INode.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/IProperties.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/IQuota.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/AbstractBackend.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/BackendInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/FS.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/File.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/PDO.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/LockInfo.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Plugin.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Mount/Plugin.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Node.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/ObjectTree.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/PartialUpdate/IFile.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/PartialUpdate/Plugin.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/GetLastModified.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/Href.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/HrefList.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/IHref.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/LockDiscovery.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/ResourceType.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/Response.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/ResponseList.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/SupportedLock.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/SupportedReportSet.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/PropertyInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Server.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/ServerPlugin.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/SimpleCollection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/SimpleFile.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/StringUtil.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/TemporaryFileFilterPlugin.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Tree.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Tree/Filesystem.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/URLUtil.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/UUIDUtil.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Version.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/XMLUtil.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/AbstractPrincipalCollection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/AceConflict.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NeedPrivileges.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NoAbstract.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NotRecognizedPrincipal.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NotSupportedPrivilege.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/IACL.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/IPrincipal.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/IPrincipalCollection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Plugin.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Principal.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalBackend/AbstractBackend.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalBackend/BackendInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalBackend/PDO.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalCollection.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/Acl.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/AclRestrictions.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/CurrentUserPrivilegeSet.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/Principal.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/SupportedPrivilegeSet.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Version.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/AWSAuth.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/AbstractAuth.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/BasicAuth.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/DigestAuth.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Request.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Response.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Util.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Version.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Cli.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VAlarm.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VCalendar.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VCard.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VEvent.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VFreeBusy.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VJournal.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VTodo.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/DateTimeParser.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Document.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/ElementList.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/EofException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/FreeBusyGenerator.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Node.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parameter.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/ParseException.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parser/Json.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parser/MimeDir.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parser/Parser.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Binary.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Boolean.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/FlatText.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Float.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/CalAddress.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Date.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/DateTime.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Duration.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Period.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Recur.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Integer.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Text.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Time.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Unknown.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Uri.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/UtcOffset.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/Date.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/DateAndOrTime.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/DateTime.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/LanguageTag.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/TimeStamp.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Reader.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/RecurrenceIterator.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Splitter/ICalendar.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Splitter/SplitterInterface.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Splitter/VCard.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/StringUtil.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/TimeZoneUtil.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/VCardConverter.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Version.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/includes.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/lessphp/LICENSE create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/lessphp/README.md create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/lessphp/ctype.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/lessphp/lessc.inc.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/_pclzip.lib.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/gnu-lgpl.txt create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/pclzip.lib.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/readme.txt create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/AES.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Base.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Blowfish.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/DES.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Hash.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RC2.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RC4.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RSA.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Random.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Rijndael.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/TripleDES.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Twofish.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/ANSI.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/ASN1.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/X509.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Math/BigInteger.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SCP.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SFTP.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SFTP/Stream.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SSH1.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SSH2.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/System/SSH/Agent.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/System/SSH_Agent.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/openssl.cnf create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/COPYING create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/README.md create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/Spyc.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/composer.json create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/LICENSE create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/README.md create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/cacert.pem create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/tmhOAuth.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/tmhUtilities.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/README create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/README create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/_source.en.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/cs_CZ.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/da_DK.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/de_DE.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/en_US.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/es_ES.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fa_IR.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fi_FI.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fr_FR.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/hu_HU.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/it_IT.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/ja_JP.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/lt_LT.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/nb_NO.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/nl_NL.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/pl_PL.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/pt_BR.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/ru_RU.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sk_SK.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sl_SI.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sv_SE.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/zh_CN.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/langs.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/af.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-dz.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-kw.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-ly.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-ma.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-sa.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-tn.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/az.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/be.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bg.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bm.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bn.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bo.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/br.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bs.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ca.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cs.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cv.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cy.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/da.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de-at.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de-ch.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/dv.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/el.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-au.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-ca.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-gb.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-ie.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-il.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-nz.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/eo.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es-do.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es-us.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/et.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/eu.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fa.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fi.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fo.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr-ca.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr-ch.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fy.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gd.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gl.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gom-latn.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gu.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/he.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hi.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hr.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hu.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hy-am.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/id.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/is.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/it.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ja.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/jv.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ka.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/kk.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/km.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/kn.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ko.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ky.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lb.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lo.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lt.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lv.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/me.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mi.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mk.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ml.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mn.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mr.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ms-my.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ms.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mt.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/my.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nb.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ne.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nl-be.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nl.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nn.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pa-in.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pl.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pt-br.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pt.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ro.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ru.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sd.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/se.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/si.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sk.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sl.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sq.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sr-cyrl.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sr.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ss.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sv.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sw.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ta.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/te.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tet.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tg.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/th.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tl-ph.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tlh.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tr.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzl.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzm-latn.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzm.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ug-cn.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uk.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ur.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uz-latn.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uz.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/vi.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/x-pseudo.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/yo.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-cn.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-hk.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-tw.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/README create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/_source.en.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ar_SA.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/bg_BG.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/cs_CZ.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/da_DK.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/de_DE.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/el_GR.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/en_GB.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/en_US.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/es_ES.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/et_EE.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fa_IR.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fi_FI.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fr_FR.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/hu_HU.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/id_ID.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/is_IS.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/it_IT.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ja_JP.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ko_KR.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/lt_LT.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/lv_LV.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/nb_NO.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/nl_NL.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pl_PL.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pt_BR.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pt_PT.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ro_RO.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ru_RU.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sk_SK.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sl_SI.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sv_SE.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/tr_TR.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/uk_UA.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/zh_CN.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/zh_TW.yml create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/RainLoop.asc create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/empty-contact.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/amazon.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/apple.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/asana.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/battle.net.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/blizzard.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/cnet.online.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/connect.asana.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/e.paypal.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/ea.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/ebay.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/em.ea.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/email.blizzard.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/email.microsoft.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/email.skype.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/facebook.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/facebookmail.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/github.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/google.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/id.apple.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/intl.paypal.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/microsoft.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/microsoftonline.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/myspace.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/news.myspace.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/news.onlive.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/onlive.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/paypal.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/plus.google.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/postmaster.twitter.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/reply.ebay.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/reply1.ebay.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/reply2.ebay.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/reply3.ebay.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/skype.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/steampowered.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/ted.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/twitter.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/youtube.com.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/BadBrowser.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Error.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Index.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Social.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Themes/template.less create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Themes/values.less create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminLogin.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminMenu.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminPane.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsAbout.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsBranding.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsContacts.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsDomainListItem.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsDomains.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsGeneral.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsLicensing.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsLogin.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsPackages.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsPackagesListItem.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsPackagesTable.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsPluginListItem.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsPluginProperty.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsPlugins.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsSecurity.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsSocial.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/PopupsActivate.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/PopupsDomain.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/PopupsDomainAlias.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/PopupsPlugin.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Common/Cmd.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Common/Pagenator.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Common/PopupsAsk.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Common/PopupsKeyboardShortcutsHelp.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Common/PopupsLanguages.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Common/PopupsWelcomePage.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Components/Checkbox.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Components/CheckboxClassic.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Components/CheckboxMaterialDesign.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Components/Date.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Components/Input.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Components/Radio.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Components/SaveTrigger.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Components/Select.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Components/TextArea.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/About.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/ComposeAttachment.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/Login.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/LoginWelcome.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/MailFolderList.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/MailFolderListItem.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/MailFolderListSystemItem.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/MailMessageList.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/MailMessageListItem.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/MailMessageListItemNoPreviewPane.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/MailMessageView.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PhotoSwipe.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsAccount.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsAddOpenPgpKey.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsAdvancedSearch.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsCompose.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsComposeOpenPgp.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsContacts.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsFilter.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsFolderClear.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsFolderCreate.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsFolderSystem.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsIdentity.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsMessageOpenPgp.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsNewOpenPgpKey.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsTemplate.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsTwoFactorConfiguration.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsTwoFactorTest.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsViewOpenPgpKey.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsWindowSimpleMessage.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsAccounts.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsChangePassword.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsContacts.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsCustom.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFilters.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFiltersActionDiscard.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFiltersActionForward.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFiltersActionMoveToFolder.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFiltersActionNone.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFiltersActionReject.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFiltersActionVacation.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFiltersConditionDefault.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFiltersConditionMore.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFiltersConditionSize.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFolderItem.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFolders.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsGeneral.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsMenu.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsOpenPGP.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsPane.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsSecurity.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsSocial.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsTemplates.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsThemes.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SystemDropDown.html create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/check.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/include.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/index.php create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/index.php.root create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/android-icon.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/apple-touch-icon.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/browsers/chrome.gif create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/browsers/firefox.gif create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/browsers/opera.gif create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/browsers/safari.gif create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/FIXES.txt create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/build-config.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/ckeditor.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/ckeditor.orig.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/config.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/contents.css create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/af.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/ar.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/az.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/bg.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/bn.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/bs.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/ca.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/cs.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/cy.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/da.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/de-ch.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/de.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/el.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/en-au.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/en-ca.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/en-gb.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/en.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/eo.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/es.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/et.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/eu.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/fa.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/fi.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/fo.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/fr-ca.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/fr.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/gl.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/gu.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/he.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/hi.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/hr.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/hu.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/id.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/is.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/it.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/ja.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/ka.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/km.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/ko.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/ku.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/lt.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/lv.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/mk.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/mn.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/ms.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/nb.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/nl.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/no.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/oc.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/pl.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/pt-br.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/pt.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/ro.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/ru.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/si.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/sk.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/sl.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/sq.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/sr-latn.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/sr.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/sv.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/th.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/tr.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/tt.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/ug.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/uk.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/vi.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/zh-cn.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/zh.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/about/dialogs/about.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/about/dialogs/hidpi/logo_ckeditor.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/about/dialogs/logo_ckeditor.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/base64image/LICENSE.md create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/base64image/README.md create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/base64image/dialogs/base64image.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/clipboard/dialogs/paste.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/colordialog/dialogs/colordialog.css create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/colordialog/dialogs/colordialog.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/dialog/dialogDefinition.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/icons.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/icons_hidpi.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/image/dialogs/image.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/image/images/noimage.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/image2/dialogs/image2.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/link/dialogs/anchor.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/link/dialogs/link.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/link/images/anchor.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/link/images/hidpi/anchor.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/plain/icons/hidpi/plain-rtl.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/plain/icons/hidpi/plain.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/plain/icons/plain-rtl.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/plain/icons/plain.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/plain/plugin.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/quicktable/CHANGELOG.md create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/quicktable/Gruntfile.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/quicktable/LICENSE create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/quicktable/README.md create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/quicktable/package.json create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/quicktable/template.jst create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/signature/plugin.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/table/dialogs/table.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/widget/images/handle.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog.css create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_ie.css create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_ie8.css create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_iequirks.css create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor.css create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_gecko.css create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_ie.css create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_ie8.css create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_iequirks.css create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/icons.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/icons_hidpi.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/arrow.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/close.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/hidpi/close.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/hidpi/lock-open.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/hidpi/lock.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/hidpi/refresh.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/lock-open.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/lock.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/refresh.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/spinner.gif create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/readme.md create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/styles.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/app.css create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/app.min.css create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/default-skin.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/default-skin.svg create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/flags.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/lg.eot create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/lg.svg create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/lg.ttf create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/lg.woff create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.eot create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.svg create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.ttf create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.woff create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/editor.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/empty-contact.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/grey.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/icom-message-notification.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/loading.gif create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/rainloop-logo.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/sync.gif create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/sync.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/white.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/img/loading.gif create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/loading.gif create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/preloader.gif create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/social.css create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/social.min.css create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/favicon-light.ico create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/favicon-light.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/favicon.ico create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/favicon.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/admin.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/app.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/boot.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/libs.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/admin.min.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/app.min.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/boot.min.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/libs.min.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/openpgp.min.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/openpgp.worker.min.js create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/manifest.json create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/sounds/new-mail.mp3 create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/sounds/new-mail.ogg create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/A/images/background.jpg create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/A/images/preview.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/A/styles.less create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Blurred/images/background.jpg create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Blurred/images/preview.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Blurred/styles.less create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Clear/images/preview.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Clear/styles.less create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/DarkShine/images/background.jpg create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/DarkShine/images/preview.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/DarkShine/styles.less create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Default/images/background.jpg create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Default/images/background.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Default/images/preview.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Default/styles.less create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Linen/images/background.jpg create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Linen/images/background.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Linen/images/preview.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Linen/styles.less create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Love/images/background.jpg create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Love/images/preview.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Love/styles.less create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Mobile/ext.less create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Mobile/images/preview.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Mobile/styles.less create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Snow/images/background.jpg create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Snow/images/preview.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Snow/styles.less create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Squares/images/background.jpg create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Squares/images/background.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Squares/images/preview.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Squares/styles.less create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/SquaresDark/images/background.jpg create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/SquaresDark/images/background.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/SquaresDark/images/preview.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/SquaresDark/styles.less create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Stripes/images/background.jpg create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Stripes/images/preview.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Stripes/styles.less create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Wood/images/background.jpg create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Wood/images/background.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Wood/images/preview.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Wood/styles.less create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Xv/images/background.jpg create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Xv/images/background.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Xv/images/preview.png create mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Xv/styles.less create mode 100755 copper-server/core/rainloop/config/apache-config.conf create mode 100755 copper-server/core/rainloop/config/conf-available/security.conf create mode 100755 copper-server/core/rainloop/config/copper.opensource.lk.conf create mode 100644 copper-server/core/rainloop/config/hosts create mode 100755 copper-server/core/rainloop/config/mods-available/proxy_html.conf create mode 100644 copper-server/core/rainloop/config/ports.conf create mode 100644 copper-server/core/rainloop/config/scripts/index.html create mode 100755 copper-server/core/rainloop/config/scripts/init_letsencrypt.sh create mode 100755 copper-server/core/rainloop/config/scripts/run_apache.sh create mode 100755 copper-server/core/rainloop/config/scripts/run_letsencrypt.sh create mode 100644 copper-server/core/rainloop/hosts create mode 100644 copper-server/core/rainloop/tls/cert.pem create mode 100644 copper-server/core/rainloop/tls/dhparam.pem create mode 120000 copper-server/core/rainloop/tls/fullchain.pem create mode 100644 copper-server/core/rainloop/tls/privkey.pem create mode 100644 copper-server/core/svc-ingress-nginx-lb.yaml create mode 100644 copper-server/core/tls/cert.pem create mode 100644 copper-server/core/tls/dhparam.pem create mode 120000 copper-server/core/tls/fullchain.pem create mode 100644 copper-server/core/tls/privkey.pem create mode 100644 copper-server/kubernetes/copperclient/INFORMATION.md create mode 100644 copper-server/kubernetes/copperclient/LICENSE create mode 100644 copper-server/kubernetes/copperclient/README.md delete mode 100755 copper-server/kubernetes/copperclient/apache-config.conf delete mode 100644 copper-server/kubernetes/copperclient/apache2.conf create mode 100644 copper-server/kubernetes/copperclient/app/data/_data_/_default_/cache/23/e3/23e3d58cd184245411d2a84bf33e57162799021f create mode 100644 copper-server/kubernetes/copperclient/app/data/_data_/_default_/cache/3e/18/3e18609e097b6278b6c17fa9dd6de9db3a729b67 create mode 100644 copper-server/kubernetes/copperclient/app/data/_data_/_default_/cache/5b/1c/5b1c51ed23b96bde49c865e074352dc9b29808f0 delete mode 100644 copper-server/kubernetes/copperclient/app/data/_data_/_default_/cache/__/th/ar/tharanga_copper_opensource_lk/0e/e7/0ee7ef0223f943a6f3f62cd089a59644f980d5f8 delete mode 100644 copper-server/kubernetes/copperclient/app/data/_data_/_default_/cache/__/th/ar/tharanga_copper_opensource_lk/97/cc/97cc368e9e119a3cd54352632cd5ec8a61129f2d create mode 100644 copper-server/kubernetes/copperclient/app/data/_data_/_default_/cache/b8/27/b82792fad72d7b38639e5fc82c113102969af8b7 create mode 100755 copper-server/kubernetes/copperclient/config/copper.https.conf create mode 100755 copper-server/kubernetes/copperclient/config/copper.opensource.lk.conf create mode 100644 copper-server/kubernetes/copperclient/config/hosts create mode 100755 copper-server/kubernetes/copperclient/config/mods-available/proxy_html.conf create mode 100644 copper-server/kubernetes/copperclient/config/ports.conf create mode 100644 copper-server/kubernetes/copperclient/config/scripts/index.html create mode 100755 copper-server/kubernetes/copperclient/config/scripts/init_letsencrypt.sh create mode 100755 copper-server/kubernetes/copperclient/config/scripts/run_apache.sh create mode 100755 copper-server/kubernetes/copperclient/config/scripts/run_letsencrypt.sh delete mode 100644 copper-server/kubernetes/copperclient/fqdn delete mode 100644 copper-server/kubernetes/copperclient/hosts delete mode 100644 copper-server/kubernetes/copperclient/servername.conf create mode 100644 copper-server/kubernetes/copperclient/tls/cert.pem create mode 100644 copper-server/kubernetes/copperclient/tls/copper.opensource.lk.crt create mode 100644 copper-server/kubernetes/copperclient/tls/copper.opensource.lk.csr create mode 100644 copper-server/kubernetes/copperclient/tls/copper.opensource.lk.key create mode 100644 copper-server/kubernetes/copperclient/tls/dhparam.pem create mode 120000 copper-server/kubernetes/copperclient/tls/fullchain.pem create mode 100644 copper-server/kubernetes/copperclient/tls/privkey.pem diff --git a/copper-server/core/README.md b/copper-server/core/README.md new file mode 100644 index 00000000..eaf12ad9 --- /dev/null +++ b/copper-server/core/README.md @@ -0,0 +1,66 @@ + +## Creating frontend https server with ingress + + '''kubectl create -f frontend.yaml''' + +### TLS secreet creation ###### +'''kubectl create secret generic tls-certs --from-file=tls/'''' + + +// kubernetes with postfix +https://www.tauceti.blog/post/run-postfix-in-kubernetes/ + +# Apache web server with https with docker and kubernetes +https://manual.seafile.com/deploy/https_with_apache.html + + +// building new docker for +docker build -t homail . + +// run the homail image as homail container +docker run --name homail -d homail + +//login to server for further modifications. +docker exec -it homail /bin/bash + +## Port congiguration +// if you want to change to port use +nano /etc/apache2/ports.conf +By default, Apache web server is instructed to listen for incoming connection and bind on port 80. If you opt for the TLS configuration, the server will listen for secure connections on port 443. + +In order to instruct Apache web server to bind and listen for web traffic on other ports than the standard web ports, you need to add a new statement containing the newly port for future bindings. + +''' + nano /etc/apache2/ports.conf [On Debian/Ubuntu] + nano /etc/httpd/conf/httpd.conf [On RHEL/CentOS] +''' + + add 89 for listning port + + After you’ve added the above line, you need to create or alter an Apache virtual host in Debian/Ubuntu based distribution in order to start the binding process, specific to your own vhost requirements. + +In CentOS/RHEL distributions, the change is applied directly into default virtual host. In the below sample, we’ll modify the default virtual host of the web server and instruct Apache to listen for web traffic from 80 port to 8081 port. + +'''nano /etc/apache2/sites-enabled/000-default.conf ''' + +*** After correct configuration in ports.conf and vertual hosts you may access these sites from curl command + +// get ports.conf +docker cp homail:/etc/apache2/ports.conf ~/Documents/copper/copper/copper-server/core/rainloop/config + + + +// coppy files from docer container to machine. (like host file) +docker cp homail:/etc/hosts ~/Documents/copper/copper/copper-server/core/rainloop + + + +// docker file you should have expose the port + + +// And when you run the container use bellow command you have to bind docker EXPOSED port to host port ( EXPOSE 89). + +Ex : + +'''docker run -p 89:89 --name homail -d homail''' + diff --git a/copper-server/core/homail.yaml b/copper-server/core/homail.yaml new file mode 100644 index 00000000..0728079c --- /dev/null +++ b/copper-server/core/homail.yaml @@ -0,0 +1,77 @@ +kind: Service +apiVersion: v1 +metadata: + name: homail + namespace: monitoring +spec: + type: LoadBalancer + selector: + app: homail + ports: + - protocol: "TCP" + port: 88 + #targetPort: 80 + targetPort: http + #clusterIP: None + name: webmail + #nodePort: 30080 + #type: NodePort +--- +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: homail + namespace: monitoring +spec: + replicas: 1 + template: + metadata: + labels: + app: webmail + track: stable + spec: + containers: + - name: homail + #image: "udacity/example-auth:1.0.0" + image: webmail + imagePullPolicy: Never + ports: + - name: http + containerPort: 80 + - name: health + containerPort: 81 + volumeMounts: + - name: "tls-certs" + mountPath: "/etc/tls" + resources: + limits: + cpu: "1" + memory: 2Gi + requests: + cpu: 200m + memory: 1Gi + volumes: + - name: "tls-certs" + secret: + secretName: "tls-certs" + #dnsPolicy: ClusterFirst # errors with this version + #restartPolicy: Never # errors with this version + #resources: + # limits: + # cpu: 0.9 + # memory: "5500Mi" + #livenessProbe: + # httpGet: + # path: /healthz + # port: 81 + # scheme: HTTP + # initialDelaySeconds: 5 + # periodSeconds: 15 + # timeoutSeconds: 5 + #readinessProbe: + # httpGet: + # path: /readiness + # port: 81 + # scheme: HTTP + # initialDelaySeconds: 5 + # timeoutSeconds: 1 \ No newline at end of file diff --git a/copper-server/core/ingress.yaml b/copper-server/core/ingress.yaml new file mode 100644 index 00000000..5fa23e16 --- /dev/null +++ b/copper-server/core/ingress.yaml @@ -0,0 +1,42 @@ +apiVersion: v1 +data: + tls.crt: base64 encoded cert + tls.key: base64 encoded key +kind: Secret +metadata: + name: testsecret-tls + namespace: default +type: Opaque +--- +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: tls-example-ingress +spec: + tls: + - hosts: + #- sslexample.foo.com + - localhost.com + secretName: testsecret-tls + rules: + - host: sslexample.foo.com + http: + paths: + - path: / + backend: + serviceName: service1 + servicePort: 80 + - host: sslexample.foo.com + http: + paths: + - path: / + backend: + serviceName: service1 + servicePort: 80 + - host: sslexample.foo.com + http: + paths: + - path: / + backend: + serviceName: service1 + servicePort: 80 diff --git a/copper-server/core/rainloop/Dockerfile b/copper-server/core/rainloop/Dockerfile new file mode 100755 index 00000000..3bdd4216 --- /dev/null +++ b/copper-server/core/rainloop/Dockerfile @@ -0,0 +1,152 @@ +#https://medium.com/@meeramarygeorge/create-php-mysql-apache-development-environment-using-docker-in-windows-9beeba6985 +#https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-18-04 +FROM ubuntu:latest +#FROM ubuntu:14.04 + +MAINTAINER Name + +ENV DEBIAN_FRONTEND noninteractive +ENV DOMAIN=${DOMAIN} + +# Install basics + +RUN apt-get update + +RUN apt-get install -y software-properties-common && \ + +add-apt-repository ppa:ondrej/php && apt-get update + +#RUN apt-get install -y — force-yes curl +RUN apt-get install -y curl + +# installing ping command +RUN apt-get install -y iputils-ping + +RUN apt-get update + +# Install PHP 5.6 + +#RUN apt-get install -y — allow-unauthenticated php5.6 php5.6-mysql php5.6-mcrypt php5.6-cli php5.6-gd php5.6-curl +RUN apt-get install -y php5.6 php5.6-mysql php5.6-mcrypt php5.6-cli php5.6-gd php5.6-curl + +# Enable apache mods. + +RUN a2enmod php5.6 + +RUN a2enmod rewrite + +# Update the PHP.ini file, enable tags and quieten logging. + +RUN sed -i "s/short_open_tag = Off/short_open_tag = On/" /etc/php/5.6/apache2/php.ini + +RUN sed -i "s/error_reporting = .*$/error_reporting = E_ERROR | E_WARNING | E_PARSE/" /etc/php/5.6/apache2/php.ini + + + +# Manually set up the apache environment variables + +ENV APACHE_LOG_DIR /var/log/apache2 + +ENV APACHE_LOCK_DIR /var/lock/apache2 + +ENV APACHE_PID_FILE /var/run/apache2.pid + +# Manually set up the apache environment variables +ENV APACHE_RUN_USER www-data + +ENV APACHE_RUN_GROUP www-data + + + +# Expose apache. + +EXPOSE 89 +EXPOSE 443 +#EXPOSE 8080 + +EXPOSE 4343 + + + +#EXPOSE 3306 + +# Update the default apache site with the config we created. + +#ADD ./config/apache-config.conf /etc/apache2/sites-enabled/000-default.conf +ADD ./config/hosts /etc/hosts + +# Copy site into place. + +ADD ./app/ /var/www/html/site/ +#RUN copy cert files +ADD ./tls/cert.pem /etc/ssl/certs/copper.opensource.lk.cert.pem +ADD ./tls/privkey.pem /etc/ssl/private/copper.opensource.lk.privkey.pem + +#RUN chmod -R 777 /var/www/html/site/app + + RUN chown -R www-data:www-data /var/www/html/site/ + + # Update the default apache site with the config we created. +#ADD ./config/apache-config.conf /etc/apache2/sites-enabled/example.com.conf + +RUN apt-get -y install nano + +# Lets encript + +# First, add the repository: +RUN add-apt-repository -y ppa:certbot/certbot + +#Install Certbot's Apache package with apt: +RUN apt install -y python-certbot-apache + +# reload the configuration +#RUN systemctl reload apache2 + +# manual lets encript key generation tool +#certbot --apache -d example.com -d www.example.com +#CMD certbot --apache -d copper.opensource.lk -d copper.opensource.lk + + +# with certbot-auto +#https://www.exratione.com/2016/06/a-simple-setup-and-installation-script-for-lets-encrypt-ssl-certificates/ +RUN apt-get install -y wget +RUN wget https://dl.eff.org/certbot-auto +RUN chmod a+x certbot-auto +RUN mv certbot-auto /usr/local/bin +RUN certbot-auto --noninteractive --os-packages-only +# Use this command if a webserver is already running with the webroot +# at /var/www/html. +RUN certbot-auto certonly \ +RUN certbot-auto \ + --non-interactive \ + --agree-tos \ + --text \ + --rsa-key-size 4096 \ + --email admin@copper.opensource.lk \ + --webroot-path /var/www/html/site/ \ + --apache \ + --help plugins \ + --domains "copper.opensource.lk" + + + + +#RUN cp /etc/letsencrypt/live/copper.opensource.lk/fullchain.pem /etc/ssl/certs/copper.opensource.lk.fullchain.pem +#RUN cp /etc/letsencrypt/live/copper.opensource.lk/privkey.pem /etc/ssl/private/copper.opensource.lk.privkey.pem +#RUN cp ./tls/cert.pem /etc/ssl/certs/copper.opensource.lk.cert.pem +#RUN cp ./tls/privkey.pem /etc/ssl/private/copper.opensource.lk.privkey.pem + +# this for copper live server +ADD ./config/copper.opensource.lk.conf /etc/apache2/sites-enabled/copper.opensource.lk.conf + +# adding ports.conf file to the image +ADD ./config/ports.conf /etc/apache2/ + +# adding host file +ADD ./config/hosts /etc/hosts + +RUN certbot renew --dry-run +# By default start up apache in the foreground, override with /bin/bash for interative. +#CMD chmod -R 777 /var/www/html/data/ +CMD /usr/sbin/apache2ctl -D FOREGROUND + diff --git a/copper-server/core/rainloop/README.md b/copper-server/core/rainloop/README.md new file mode 100755 index 00000000..b2ba3221 --- /dev/null +++ b/copper-server/core/rainloop/README.md @@ -0,0 +1,57 @@ +# Docker - Apache with Let's Encrypt + +This is a debian-based image which runs an apache and get's it SSL-certificates automatically from Let's Encrypt. + +## Instructions + +### Prepare your apache-config + +There are some things you have to care about in your apache-config if you want to use it with certbot: + +- for every domain given in `DOMAINS` there must be a apache-vhost which uses this domain as `ServerName` or `ServerAlias`. Else certbot won't get a certificate for this domain. +- this image contains a simple apache webserver. Therefore you can configure your vhosts like you ever did. + +### Run it + +For an easy test-startup you just have to: + +``` +$ docker run -d --name apache-ssl birgerk/apache-letsencrypt +``` + +Now you have locally an apache running, which gets it SSL-certificates from Let's Encrypt. + +The image will get letsencrypt-certificates on first boot. A cron-job renews the existing certificates automatically, so you don't have to care about it. + +If you want to expand your certificate and you can remove the existing docker-container and start new one with the updated `DOMAINS`-list. If you don't want to recreate the container you can execute the following commands: + +``` +$ UPDATED_DOMAINS="example.org,more.example.org" +$ docker exec -it apache-ssl /run_letsencrypt.sh --domains $UPDATED_DOMAINS +``` + +### Configuring docker-container + +It's possible to configure the docker-container by setting the following environment-variables at container-startup: + +- `DOMAINS`, configures which for which domains a SSL-certificate shall be requested from Let's Encrypt, default is `""`. Must be given as comma-seperated list, f.e.: `"example.com,my-internet.org,more.example.com"`. +- `WEBMASTER_MAIL`, Let's Encrypt needs a mail-address from the webmaster of the requested domain. You have to set it, otherwise Let's Encrypt won't give the certificates. Default is `""`. Must be given as simple mail-address, f.e.: `"webmaster@example.com"`. +- `STAGING`, if set with a not-null string use Let's Encrypt Staging environment to avoid rate limits during development. + +### Location of letsencrypt-certs + +After letsencrypt did authenticate your domains and you got your certificates, you'll find your certificates under `/etc/letsencrypt/live//`. + +So your https-virtualhost should like: + +``` + + ServerName example.com + ServerAdmin webmaster@somewhere.org + DocumentRoot /var/www/html + + SSLCertificateFile /etc/letsencrypt/live/${VIRTUAL_HOST}/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/${VIRTUAL_HOST}/privkey.pem + Include /etc/letsencrypt/options-ssl-apache.conf + +``` diff --git a/copper-server/core/rainloop/app/data/INSTALLED b/copper-server/core/rainloop/app/data/INSTALLED new file mode 100644 index 00000000..32bd932f --- /dev/null +++ b/copper-server/core/rainloop/app/data/INSTALLED @@ -0,0 +1 @@ +1.12.0 \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/SALT.php b/copper-server/core/rainloop/app/data/SALT.php new file mode 100644 index 00000000..d6623d10 --- /dev/null +++ b/copper-server/core/rainloop/app/data/SALT.php @@ -0,0 +1 @@ +The image could not be loaded.","PREVIEW_POPUP/AJAX_ERROR":"The content could not be loaded.","FOLDER_LIST/BUTTON_COMPOSE":"Compose","FOLDER_LIST/BUTTON_CONTACTS":"Contacts","FOLDER_LIST/BUTTON_NEW_MESSAGE":"New message","FOLDER_LIST/INBOX_NAME":"Inbox","FOLDER_LIST/SENT_NAME":"Sent","FOLDER_LIST/DRAFTS_NAME":"Drafts","FOLDER_LIST/SPAM_NAME":"Spam","FOLDER_LIST/TRASH_NAME":"Trash","FOLDER_LIST/ARCHIVE_NAME":"Archive","QUOTA/TITLE":"Quota usage","MESSAGE_LIST/BUTTON_RELOAD":"Reload Message List","MESSAGE_LIST/BUTTON_MOVE_TO":"Move To","MESSAGE_LIST/BUTTON_DELETE":"Delete","MESSAGE_LIST/BUTTON_ARCHIVE":"Archive","MESSAGE_LIST/BUTTON_SPAM":"Spam","MESSAGE_LIST/BUTTON_NOT_SPAM":"Not Spam","MESSAGE_LIST/BUTTON_EMPTY_FOLDER":"Clear Folder","MESSAGE_LIST/BUTTON_MULTY_FORWARD":"Forward as attachment(s)","MESSAGE_LIST/BUTTON_DELETE_WITHOUT_MOVE":"Delete permanently","MESSAGE_LIST/BUTTON_MORE":"More","MESSAGE_LIST/MENU_SET_SEEN":"Mark as read","MESSAGE_LIST/MENU_SET_ALL_SEEN":"Mark all as read","MESSAGE_LIST/MENU_UNSET_SEEN":"Mark as unread","MESSAGE_LIST/MENU_SET_FLAG":"Flag","MESSAGE_LIST/MENU_UNSET_FLAG":"Unflag","MESSAGE_LIST/MENU_SELECT_ALL":"All","MESSAGE_LIST/MENU_SELECT_NONE":"None","MESSAGE_LIST/MENU_SELECT_INVERT":"Invert","MESSAGE_LIST/MENU_SELECT_UNSEEN":"Unread","MESSAGE_LIST/MENU_SELECT_SEEN":"Read","MESSAGE_LIST/MENU_SELECT_FLAGGED":"Flagged","MESSAGE_LIST/MENU_SELECT_UNFLAGGED":"Unflagged","MESSAGE_LIST/EMPTY_LIST":"Empty list.","MESSAGE_LIST/EMPTY_SEARCH_LIST":"No messages matched your search.","MESSAGE_LIST/SEARCH_RESULT_FOR":"Search results for \"%SEARCH%\"","MESSAGE_LIST/BACK_TO_MESSAGE_LIST":"back to message list","MESSAGE_LIST/LIST_LOADING":"Loading","MESSAGE_LIST/EMPTY_SUBJECT_TEXT":"(No subject)","MESSAGE_LIST/PUT_MESSAGE_HERE":"Drop message here to view it in the list","MESSAGE_LIST/TODAY_AT":"today at %TIME%","MESSAGE_LIST/YESTERDAY_AT":"yesterday at %TIME%","MESSAGE_LIST/SEARCH_PLACEHOLDER":"Search","MESSAGE_LIST/NEW_MESSAGE_NOTIFICATION":"You have %COUNT% new messages!","MESSAGE_LIST/QUOTA_SIZE":"Using %SIZE% (%PROC%%) of your %LIMIT%","MESSAGE/BUTTON_EDIT":"Edit","MESSAGE/BUTTON_BACK":"Back","MESSAGE/BUTTON_CLOSE":"Close","MESSAGE/BUTTON_DELETE":"Delete","MESSAGE/BUTTON_UNSUBSCRIBE":"Unsubscribe from this list","MESSAGE/BUTTON_ARCHIVE":"Archive","MESSAGE/BUTTON_SPAM":"Spam","MESSAGE/BUTTON_NOT_SPAM":"Not Spam","MESSAGE/BUTTON_MOVE_TO":"Move To","MESSAGE/BUTTON_MORE":"More","MESSAGE/BUTTON_REPLY":"Reply","MESSAGE/BUTTON_REPLY_ALL":"Reply All","MESSAGE/BUTTON_FORWARD":"Forward","MESSAGE/BUTTON_FORWARD_AS_ATTACHMENT":"Forward as attachment","MESSAGE/BUTTON_EDIT_AS_NEW":"Edit as New","MESSAGE/BUTTON_SHOW_IMAGES":"Display external images","MESSAGE/BUTTON_NOTIFY_READ_RECEIPT":"The sender has asked to be notified when you read this message.","MESSAGE/BUTTON_IN_NEW_WINDOW":"View in separate window","MESSAGE/BUTTON_THREAD_LIST":"Thread list","MESSAGE/BUTTON_THREAD_PREV":"Previous","MESSAGE/BUTTON_THREAD_NEXT":"Next","MESSAGE/BUTTON_THREAD_MORE":"More messages","MESSAGE/MENU_HEADERS":"Show message headers","MESSAGE/MENU_VIEW_ORIGINAL":"Show Source","MESSAGE/MENU_DOWNLOAD_ORIGINAL":"Download as .eml file","MESSAGE/MENU_FILTER_SIMILAR":"Filter messages like this","MESSAGE/MENU_PRINT":"Print","MESSAGE/EMPTY_SUBJECT_TEXT":"(No subject)","MESSAGE/LABEL_SUBJECT":"Subject","MESSAGE/LABEL_DATE":"Date","MESSAGE/LABEL_FROM":"From","MESSAGE/LABEL_FROM_SHORT":"from","MESSAGE/LABEL_TO":"To","MESSAGE/LABEL_TO_SHORT":"to","MESSAGE/LABEL_CC":"CC","MESSAGE/LABEL_BCC":"BCC","MESSAGE/LABEL_REPLY_TO":"Reply-To","MESSAGE/PRINT_LABEL_FROM":"From","MESSAGE/PRINT_LABEL_TO":"To","MESSAGE/PRINT_LABEL_CC":"CC","MESSAGE/PRINT_LABEL_BCC":"BCC","MESSAGE/PRINT_LABEL_REPLY_TO":"Reply-To","MESSAGE/PRINT_LABEL_DATE":"Date","MESSAGE/PRINT_LABEL_SUBJECT":"Subject","MESSAGE/PRINT_LABEL_ATTACHMENTS":"Attachments","MESSAGE/MESSAGE_LOADING":"Loading","MESSAGE/MESSAGE_VIEW_DESC":"Select any message in the list to view it here.","MESSAGE/MESSAGE_VIEW_MOVE_DESC":"Click folder name in the left panel to select the destination.","MESSAGE/PGP_PASSWORD_INPUT_PLACEHOLDER":"Password","MESSAGE/PGP_SIGNED_MESSAGE_DESC":"OpenPGP signed message (click to verify)","MESSAGE/PGP_ENCRYPTED_MESSAGE_DESC":"OpenPGP encrypted message (click to decrypt)","MESSAGE/LINK_DOWNLOAD_AS_ZIP":"Download as zip","MESSAGE/LINK_SAVE_TO_OWNCLOUD":"Save to ownCloud","MESSAGE/LINK_SAVE_TO_CLOUD":"Save to Cloud","MESSAGE/LINK_SAVE_TO_DROPBOX":"Save to Dropbox","READ_RECEIPT/SUBJECT":"Return Receipt (displayed) - %SUBJECT%","READ_RECEIPT/BODY":"This is a Return Receipt for the mail that you sent to %READ-RECEIPT%.\n\nNote: \"This Return Receipt only acknowledges that the message was displayed on the recipient's computer.\"\nThere is no guarantee that the recipient has read or understood the message contents.","SUGGESTIONS/SEARCHING_DESC":"Searching...","CONTACTS/LEGEND_CONTACTS":"Contacts","CONTACTS/SEARCH_INPUT_PLACEHOLDER":"Search","CONTACTS/BUTTON_ADD_CONTACT":"Add Contact","CONTACTS/BUTTON_CREATE_CONTACT":"Create","CONTACTS/BUTTON_UPDATE_CONTACT":"Update","CONTACTS/BUTTON_IMPORT":"Import (csv, vcf, vCard)","CONTACTS/BUTTON_EXPORT_VCARD":"Export (vcf, vCard)","CONTACTS/BUTTON_EXPORT_CSV":"Export (csv)","CONTACTS/ERROR_IMPORT_FILE":"Import error (invalid file format)","CONTACTS/LIST_LOADING":"Loading","CONTACTS/EMPTY_LIST":"No contacts here","CONTACTS/EMPTY_SEARCH":"No contacts found","CONTACTS/CLEAR_SEARCH":"Clear search","CONTACTS/CONTACT_VIEW_DESC":"Select contact in the list to view it here.","CONTACTS/LABEL_DISPLAY_NAME":"Display name","CONTACTS/LABEL_EMAIL":"Email","CONTACTS/LABEL_PHONE":"Phone","CONTACTS/LABEL_WEB":"Web","CONTACTS/LABEL_BIRTHDAY":"Birthday","CONTACTS/LINK_ADD_EMAIL":"Add an email address","CONTACTS/LINK_ADD_PHONE":"Add a phone","CONTACTS/LINK_BIRTHDAY":"Birthday","CONTACTS/PLACEHOLDER_ENTER_DISPLAY_NAME":"Enter display name","CONTACTS/PLACEHOLDER_ENTER_LAST_NAME":"Enter last name","CONTACTS/PLACEHOLDER_ENTER_FIRST_NAME":"Enter first name","CONTACTS/PLACEHOLDER_ENTER_NICK_NAME":"Enter nickname","CONTACTS/LABEL_READ_ONLY":"Read only","CONTACTS/LABEL_SHARE":"Share","CONTACTS/ADD_MENU_LABEL":"Add","CONTACTS/ADD_MENU_NICKNAME":"Nickname","CONTACTS/ADD_MENU_NOTES":"Notes","CONTACTS/ADD_MENU_EMAIL":"Email","CONTACTS/ADD_MENU_PHONE":"Phone","CONTACTS/ADD_MENU_URL":"URL","CONTACTS/ADD_MENU_ADDRESS":"Address","CONTACTS/ADD_MENU_BIRTHDAY":"Birthday","CONTACTS/ADD_MENU_TAGS":"Tags","CONTACTS/BUTTON_SHARE_NONE":"None","CONTACTS/BUTTON_SHARE_ALL":"Everyone","CONTACTS/BUTTON_SYNC":"Synchronization (CardDAV)","COMPOSE/TITLE_FROM":"From","COMPOSE/TITLE_TO":"To","COMPOSE/TITLE_CC":"CC","COMPOSE/TITLE_BCC":"BCC","COMPOSE/TITLE_REPLY_TO":"Reply-To","COMPOSE/TITLE_SUBJECT":"Subject","COMPOSE/LINK_SHOW_INPUTS":"show all fields","COMPOSE/BUTTON_SEND":"Send","COMPOSE/BUTTON_SAVE":"Save","COMPOSE/BUTTON_DELETE":"Delete","COMPOSE/BUTTON_CANCEL":"Cancel","COMPOSE/BUTTON_MINIMIZE":"Minimize","COMPOSE/SAVED_TIME":"Saved at %TIME%","COMPOSE/SAVED_ERROR_ON_SEND":"Message was sent but not saved to sent items folder","COMPOSE/DISCARD_UNSAVED_DATA":"Discard unsaved data?","COMPOSE/ATTACH_FILES":"Attach files","COMPOSE/ATTACH_DROP_FILES_DESC":"Drop files here","COMPOSE/ATTACH_ITEM_CANCEL":"Cancel","COMPOSE/DROPBOX":"Dropbox","COMPOSE/GOOGLE_DRIVE":"Google Drive","COMPOSE/REPLY_MESSAGE_TITLE":"%DATETIME%, %EMAIL% wrote","COMPOSE/FORWARD_MESSAGE_TOP_TITLE":"-------- Forwarded message -------","COMPOSE/FORWARD_MESSAGE_TOP_FROM":"From","COMPOSE/FORWARD_MESSAGE_TOP_TO":"To","COMPOSE/FORWARD_MESSAGE_TOP_CC":"CC","COMPOSE/FORWARD_MESSAGE_TOP_SENT":"Sent","COMPOSE/FORWARD_MESSAGE_TOP_SUBJECT":"Subject","COMPOSE/EMPTY_TO_ERROR_DESC":"Please specify at least one recipient","COMPOSE/NO_ATTACHMENTS_HERE_DESC":"No attachments here.","COMPOSE/ATTACHMENTS_ERROR_DESC":"Warning! Not all attachments have been uploaded.","COMPOSE/ATTACHMENTS_UPLOAD_ERROR_DESC":"Not all attachments have been uploaded yet.","COMPOSE/BUTTON_REQUEST_READ_RECEIPT":"Request a read receipt","COMPOSE/BUTTON_MARK_AS_IMPORTANT":"Mark as important","COMPOSE/BUTTON_OPEN_PGP":"OpenPGP (Plain Text Only)","COMPOSE/BUTTON_REQUEST_DSN":"Request a delivery receipt","POPUPS_WELCOME_PAGE/BUTTON_CLOSE":"Close","POPUPS_ASK/BUTTON_YES":"Yes","POPUPS_ASK/BUTTON_NO":"No","POPUPS_ASK/DESC_WANT_CLOSE_THIS_WINDOW":"Are you sure you want to close this window?","POPUPS_ASK/DESC_WANT_DELETE_MESSAGES":"Are you sure you want to delete the message(s)?","POPUPS_LANGUAGES/TITLE_LANGUAGES":"Choose your language","POPUPS_ADD_ACCOUNT/TITLE_ADD_ACCOUNT":"Add Account?","POPUPS_ADD_ACCOUNT/BUTTON_ADD_ACCOUNT":"Add","POPUPS_ADD_ACCOUNT/TITLE_UPDATE_ACCOUNT":"Update Account?","POPUPS_ADD_ACCOUNT/BUTTON_UPDATE_ACCOUNT":"Update","POPUPS_IDENTITY/TITLE_ADD_IDENTITY":"Add Identity?","POPUPS_IDENTITY/TITLE_UPDATE_IDENTITY":"Update Identity?","POPUPS_IDENTITY/BUTTON_ADD_IDENTITY":"Add","POPUPS_IDENTITY/BUTTON_UPDATE_IDENTITY":"Update","POPUPS_IDENTITY/LABEL_EMAIL":"Email","POPUPS_IDENTITY/LABEL_NAME":"Name","POPUPS_IDENTITY/LABEL_REPLY_TO":"Reply-To","POPUPS_IDENTITY/LABEL_SIGNATURE":"Signature","POPUPS_IDENTITY/LABEL_CC":"Cc","POPUPS_IDENTITY/LABEL_BCC":"Bcc","POPUPS_IDENTITY/LABEL_SIGNATURE_INSERT_BEFORE":"Insert this signature before quoted text in replies","POPUPS_CREATE_FOLDER/TITLE_CREATE_FOLDER":"Create a folder?","POPUPS_CREATE_FOLDER/LABEL_NAME":"Folder name","POPUPS_CREATE_FOLDER/LABEL_PARENT":"Parent folder","POPUPS_CREATE_FOLDER/BUTTON_CREATE":"Create","POPUPS_CREATE_FOLDER/BUTTON_CANCEL":"Cancel","POPUPS_CREATE_FOLDER/BUTTON_CLOSE":"Close","POPUPS_CREATE_FOLDER/TITLE_CREATING_PROCESS":"Creating a folder","POPUPS_CLEAR_FOLDER/TITLE_CLEAR_FOLDER":"Purge all messages from the folder?","POPUPS_CLEAR_FOLDER/BUTTON_CLEAR":"Clear","POPUPS_CLEAR_FOLDER/BUTTON_CANCEL":"Cancel","POPUPS_CLEAR_FOLDER/BUTTON_CLOSE":"Close","POPUPS_CLEAR_FOLDER/DANGER_DESC_WARNING":"Warning!","POPUPS_CLEAR_FOLDER/DANGER_DESC_HTML_1":"This action will result in removing all mails from %FOLDER% folder completely.","POPUPS_CLEAR_FOLDER/DANGER_DESC_HTML_2":"Once started, the process cannot be aborted or cancelled.","POPUPS_CLEAR_FOLDER/TITLE_CLEARING_PROCESS":"Purging the folder...","POPUPS_IMPORT_OPEN_PGP_KEY/TITLE_IMPORT_OPEN_PGP_KEY":"Import OpenPGP key","POPUPS_IMPORT_OPEN_PGP_KEY/BUTTON_IMPORT_OPEN_PGP_KEY":"Import","POPUPS_VIEW_OPEN_PGP_KEY/TITLE_VIEW_OPEN_PGP_KEY":"View OpenPGP key","POPUPS_VIEW_OPEN_PGP_KEY/BUTTON_SELECT":"Select","POPUPS_VIEW_OPEN_PGP_KEY/BUTTON_CLOSE":"Close","POPUPS_GENERATE_OPEN_PGP_KEYS/TITLE_GENERATE_OPEN_PGP_KEYS":"Generate OpenPGP keys","POPUPS_GENERATE_OPEN_PGP_KEYS/LABEL_EMAIL":"Email","POPUPS_GENERATE_OPEN_PGP_KEYS/LABEL_NAME":"Name","POPUPS_GENERATE_OPEN_PGP_KEYS/LABEL_PASSWORD":"Password","POPUPS_GENERATE_OPEN_PGP_KEYS/LABEL_KEY_BIT_LENGTH":"Key length","POPUPS_GENERATE_OPEN_PGP_KEYS/BUTTON_GENERATE_OPEN_PGP_KEYS":"Generate","POPUPS_COMPOSE_OPEN_PGP/TITLE_COMPOSE_OPEN_PGP":"OpenPGP Sign/Encrypt","POPUPS_COMPOSE_OPEN_PGP/LABEL_SIGN":"Sign","POPUPS_COMPOSE_OPEN_PGP/LABEL_ENCRYPT":"Encrypt","POPUPS_COMPOSE_OPEN_PGP/LABEL_PASSWORD":"Password","POPUPS_COMPOSE_OPEN_PGP/BUTTON_SIGN":"Sign","POPUPS_COMPOSE_OPEN_PGP/BUTTON_ENCRYPT":"Encrypt","POPUPS_COMPOSE_OPEN_PGP/BUTTON_SIGN_AND_ENCRYPT":"Sign and encrypt","POPUPS_MESSAGE_OPEN_PGP/TITLE_MESSAGE_OPEN_PGP":"OpenPGP Decrypt","POPUPS_MESSAGE_OPEN_PGP/LABEL_KEY":"Private Key","POPUPS_MESSAGE_OPEN_PGP/LABEL_PASSWORD":"Password","POPUPS_MESSAGE_OPEN_PGP/BUTTON_DECRYPT":"Decrypt","POPUPS_TWO_FACTOR_TEST/TITLE_TEST_CODE":"2-Step verification test","POPUPS_TWO_FACTOR_TEST/LABEL_CODE":"Code","POPUPS_TWO_FACTOR_TEST/BUTTON_TEST":"Test","POPUPS_FILTER/TITLE_CREATE_FILTER":"Create a filter?","POPUPS_FILTER/TITLE_EDIT_FILTER":"Update filter?","POPUPS_FILTER/FILTER_NAME":"Name","POPUPS_FILTER/LEGEND_CONDITIONS":"Conditions","POPUPS_FILTER/LEGEND_ACTIONS":"Actions","POPUPS_FILTER/BUTTON_DONE":"Done","POPUPS_FILTER/BUTTON_ADD_CONDITION":"Add a Condition","POPUPS_FILTER/SELECT_ACTION_NONE":"None","POPUPS_FILTER/SELECT_ACTION_MOVE_TO":"Move to","POPUPS_FILTER/SELECT_ACTION_FORWARD_TO":"Forward to","POPUPS_FILTER/SELECT_ACTION_REJECT":"Reject","POPUPS_FILTER/SELECT_ACTION_VACATION_MESSAGE":"Vacation message","POPUPS_FILTER/SELECT_ACTION_DISCARD":"Discard","POPUPS_FILTER/SELECT_FIELD_FROM":"From","POPUPS_FILTER/SELECT_FIELD_RECIPIENTS":"Recipients (To or CC)","POPUPS_FILTER/SELECT_FIELD_SUBJECT":"Subject","POPUPS_FILTER/SELECT_FIELD_HEADER":"Header","POPUPS_FILTER/SELECT_FIELD_SIZE":"Size","POPUPS_FILTER/SELECT_TYPE_CONTAINS":"Contains","POPUPS_FILTER/SELECT_TYPE_NOT_CONTAINS":"Not Contains","POPUPS_FILTER/SELECT_TYPE_MATCHES":"Matches (* and ? supported)","POPUPS_FILTER/SELECT_TYPE_NOT_MATCHES":"Not Matches (* and ? supported)","POPUPS_FILTER/SELECT_TYPE_REGEXP":"Regexp","POPUPS_FILTER/SELECT_TYPE_NOT_REGEXP":"Not Regexp","POPUPS_FILTER/SELECT_TYPE_EQUAL_TO":"Equal To","POPUPS_FILTER/SELECT_TYPE_NOT_EQUAL_TO":"Not Equal To","POPUPS_FILTER/SELECT_TYPE_OVER":"Over","POPUPS_FILTER/SELECT_TYPE_UNDER":"Under","POPUPS_FILTER/SELECT_MATCH_ANY":"Matching ANY of the following rules","POPUPS_FILTER/SELECT_MATCH_ALL":"Matching ALL of the following rules","POPUPS_FILTER/MARK_AS_READ_LABEL":"Mark as read","POPUPS_FILTER/REPLY_INTERVAL_LABEL":"Reply interval (days)","POPUPS_FILTER/KEEP_LABEL":"Keep","POPUPS_FILTER/STOP_LABEL":"Don't stop processing rules","POPUPS_FILTER/EMAIL_LABEL":"Email","POPUPS_FILTER/VACATION_SUBJECT_LABEL":"Subject (optional)","POPUPS_FILTER/VACATION_MESSAGE_LABEL":"Message","POPUPS_FILTER/VACATION_RECIPIENTS_LABEL":"Recipients (comma separated)","POPUPS_FILTER/REJECT_MESSAGE_LABEL":"Reject message","POPUPS_FILTER/ALL_INCOMING_MESSAGES_DESC":"All incoming messages","POPUPS_SYSTEM_FOLDERS/TITLE_SYSTEM_FOLDERS":"Select system folders","POPUPS_SYSTEM_FOLDERS/SELECT_CHOOSE_ONE":"Choose one","POPUPS_SYSTEM_FOLDERS/SELECT_UNUSE_NAME":"Do not use","POPUPS_SYSTEM_FOLDERS/LABEL_SENT":"Sent","POPUPS_SYSTEM_FOLDERS/LABEL_DRAFTS":"Drafts","POPUPS_SYSTEM_FOLDERS/LABEL_SPAM":"Spam","POPUPS_SYSTEM_FOLDERS/LABEL_TRASH":"Trash","POPUPS_SYSTEM_FOLDERS/LABEL_ARCHIVE":"Archive","POPUPS_SYSTEM_FOLDERS/BUTTON_CANCEL":"Cancel","POPUPS_SYSTEM_FOLDERS/BUTTON_CLOSE":"Close","POPUPS_SYSTEM_FOLDERS/NOTIFICATION_SENT":"You haven't selected \"Sent\" system folder messages are put to after sending.\nIf you don't want to save sent message, please select \"Do not use\" option.","POPUPS_SYSTEM_FOLDERS/NOTIFICATION_DRAFTS":"You haven't selected \"Drafts\" system folder messages are saved to while composing.","POPUPS_SYSTEM_FOLDERS/NOTIFICATION_SPAM":"You haven't selected \"Spam\" system folder spamed messages are placed to.\nIf you wish to remove messages permanently, please select \"Do not use\" option.","POPUPS_SYSTEM_FOLDERS/NOTIFICATION_TRASH":"You haven't selected \"Trash\" system folder deleted messages are placed to.\nIf you wish to remove messages permanently, please select \"Do not use\" option.","POPUPS_SYSTEM_FOLDERS/NOTIFICATION_ARCHIVE":"You haven't selected \"Archive\" system folder achived messages are placed to.","POPUPS_TWO_FACTOR_CFG/LEGEND_TWO_FACTOR_AUTH":"2-Step Verification (TOTP)","POPUPS_TWO_FACTOR_CFG/LABEL_ENABLE_TWO_FACTOR":"Enable 2-Step verification","POPUPS_TWO_FACTOR_CFG/LABEL_TWO_FACTOR_USER":"User","POPUPS_TWO_FACTOR_CFG/LABEL_TWO_FACTOR_STATUS":"Status","POPUPS_TWO_FACTOR_CFG/LABEL_TWO_FACTOR_SECRET":"Secret","POPUPS_TWO_FACTOR_CFG/LABEL_TWO_FACTOR_BACKUP_CODES":"Backup codes","POPUPS_TWO_FACTOR_CFG/BUTTON_CREATE":"Create a secret","POPUPS_TWO_FACTOR_CFG/BUTTON_ACTIVATE":"Activate","POPUPS_TWO_FACTOR_CFG/BUTTON_CLEAR":"Clear","POPUPS_TWO_FACTOR_CFG/BUTTON_LOGOUT":"Logout","POPUPS_TWO_FACTOR_CFG/BUTTON_DONE":"Done","POPUPS_TWO_FACTOR_CFG/BUTTON_TEST":"Test","POPUPS_TWO_FACTOR_CFG/LINK_TEST":"test","POPUPS_TWO_FACTOR_CFG/BUTTON_SHOW_SECRET":"Show Secret","POPUPS_TWO_FACTOR_CFG/BUTTON_HIDE_SECRET":"Hide Secret","POPUPS_TWO_FACTOR_CFG/TWO_FACTOR_REQUIRE_DESC":"Your account requires 2-Step verification configuration.","POPUPS_TWO_FACTOR_CFG/TWO_FACTOR_SECRET_CONFIGURED_DESC":"Configured","POPUPS_TWO_FACTOR_CFG/TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC":"Not configured","POPUPS_TWO_FACTOR_CFG/TWO_FACTOR_SECRET_DESC":"Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually.","POPUPS_TWO_FACTOR_CFG/TWO_FACTOR_BACKUP_CODES_DESC":"If you can't receive codes via Google Authenticator (or other TOTP client), you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive.","POPUPS_TWO_FACTOR_CFG/TWO_FACTOR_SECRET_TEST_BEFORE_DESC":"You can't change this setting before test.","TITLES/LOADING":"Loading","TITLES/LOGIN":"Login","TITLES/MAILBOX":"MailBox","TITLES/SETTINGS":"Settings","TITLES/COMPOSE":"Compose","UPLOAD/ERROR_FILE_IS_TOO_BIG":"File is too big","UPLOAD/ERROR_FILE_PARTIALLY_UPLOADED":"File was partially uploaded due to unknown error","UPLOAD/ERROR_NO_FILE_UPLOADED":"No file uploaded","UPLOAD/ERROR_MISSING_TEMP_FOLDER":"The temporary file is missing","UPLOAD/ERROR_ON_SAVING_FILE":"An unknown file upload error occurred","UPLOAD/ERROR_FILE_TYPE":"Invalid file type","UPLOAD/ERROR_UNKNOWN":"An unknown file upload error occurred","EDITOR/TEXT_SWITCHER_PLAINT_TEXT":"HTML <-> TEXT","EDITOR/TEXT_SWITCHER_RICH_FORMATTING":"Rich formatting","EDITOR/TEXT_SWITCHER_CONFIRM":"Text formatting and images will be lost. Are you sure you want to continue?","SETTINGS_LABELS/LABEL_PERSONAL_NAME":"Personal","SETTINGS_LABELS/LABEL_GENERAL_NAME":"General","SETTINGS_LABELS/LABEL_CONTACTS_NAME":"Contacts","SETTINGS_LABELS/LABEL_FOLDERS_NAME":"Folders","SETTINGS_LABELS/LABEL_ACCOUNTS_NAME":"Accounts","SETTINGS_LABELS/LABEL_IDENTITY_NAME":"Identity","SETTINGS_LABELS/LABEL_IDENTITIES_NAME":"Identities","SETTINGS_LABELS/LABEL_FILTERS_NAME":"Filters","SETTINGS_LABELS/LABEL_TEMPLATES_NAME":"Templates","SETTINGS_LABELS/LABEL_SECURITY_NAME":"Security","SETTINGS_LABELS/LABEL_SOCIAL_NAME":"Social","SETTINGS_LABELS/LABEL_THEMES_NAME":"Themes","SETTINGS_LABELS/LABEL_CHANGE_PASSWORD_NAME":"Password","SETTINGS_LABELS/LABEL_OPEN_PGP_NAME":"OpenPGP","SETTINGS_LABELS/BUTTON_BACK":"Back","SETTINGS_FILTERS/LEGEND_FILTERS":"Filters","SETTINGS_FILTERS/BUTTON_SAVE":"Save","SETTINGS_FILTERS/BUTTON_ADD_FILTER":"Add a Filter","SETTINGS_FILTERS/BUTTON_DELETE":"Delete","SETTINGS_FILTERS/BUTTON_RAW_SCRIPT":"Use Custom User Script","SETTINGS_FILTERS/SUBNAME_NONE":"None","SETTINGS_FILTERS/SUBNAME_MOVE_TO":"Move to \"%FOLDER%\"","SETTINGS_FILTERS/SUBNAME_FORWARD_TO":"Forward to \"%EMAIL%\"","SETTINGS_FILTERS/SUBNAME_REJECT":"Reject","SETTINGS_FILTERS/SUBNAME_VACATION_MESSAGE":"Vacation message","SETTINGS_FILTERS/SUBNAME_DISCARD":"Discard","SETTINGS_FILTERS/CAPABILITY_LABEL":"Capability","SETTINGS_FILTERS/LOADING_PROCESS":"Updating filter list","SETTINGS_FILTERS/DELETING_ASK":"Are you sure?","SETTINGS_FILTERS/CHACHES_NEED_TO_BE_SAVED_DESC":"These changes need to be saved to the server.","SETTINGS_IDENTITY/LEGEND_IDENTITY":"Identity","SETTINGS_IDENTITY/LABEL_DISPLAY_NAME":"Name","SETTINGS_IDENTITY/LABEL_REPLY_TO":"Reply-To","SETTINGS_IDENTITY/LABEL_SIGNATURE":"Signature","SETTINGS_IDENTITY/LABEL_ADD_SIGNATURE_TO_ALL":"Add your signature to all the outgoing messages","SETTINGS_SECURITY/LEGEND_SECURITY":"Security","SETTINGS_SECURITY/LABEL_CONFIGURE_TWO_FACTOR":"Configure 2-Step verification","SETTINGS_SECURITY/LABEL_AUTOLOGOUT":"Auto Logout","SETTINGS_SECURITY/AUTOLOGIN_NEVER_OPTION_NAME":"Never","SETTINGS_SECURITY/AUTOLOGIN_MINUTES_OPTION_NAME":"%MINUTES% minute(s)","SETTINGS_SECURITY/AUTOLOGIN_HOURS_OPTION_NAME":"%HOURS% hour(s)","SETTINGS_GENERAL/LEGEND_GENERAL":"General","SETTINGS_GENERAL/LABEL_LANGUAGE":"Language","SETTINGS_GENERAL/LABEL_IDENTITY":"Identity","SETTINGS_GENERAL/LABEL_LAYOUT":"Layout","SETTINGS_GENERAL/LABEL_LAYOUT_NO_SPLIT":"No Split","SETTINGS_GENERAL/LABEL_LAYOUT_VERTICAL_SPLIT":"Vertical Split","SETTINGS_GENERAL/LABEL_LAYOUT_HORIZONTAL_SPLIT":"Horizontal Split","SETTINGS_GENERAL/LABEL_EDITOR":"Default text editor","SETTINGS_GENERAL/LABEL_EDITOR_HTML":"Html","SETTINGS_GENERAL/LABEL_EDITOR_PLAIN":"Plain","SETTINGS_GENERAL/LABEL_EDITOR_HTML_FORCED":"Html (forced)","SETTINGS_GENERAL/LABEL_EDITOR_PLAIN_FORCED":"Plain (forced)","SETTINGS_GENERAL/LABEL_ANIMATION":"Interface animation","SETTINGS_GENERAL/LABEL_ANIMATION_FULL":"Full","SETTINGS_GENERAL/LABEL_ANIMATION_NORMAL":"Normal","SETTINGS_GENERAL/LABEL_ANIMATION_NONE":"None","SETTINGS_GENERAL/LABEL_VIEW_OPTIONS":"View options","SETTINGS_GENERAL/LABEL_USE_PREVIEW_PANE":"Use preview pane","SETTINGS_GENERAL/LABEL_USE_CHECKBOXES_IN_LIST":"Display checkboxes in list","SETTINGS_GENERAL/LABEL_USE_THREADS":"Use threads","SETTINGS_GENERAL/LABEL_REPLY_SAME_FOLDER":"Place replies in the folder of the message being replied to","SETTINGS_GENERAL/LABEL_SHOW_IMAGES":"Always display external images in message body","SETTINGS_GENERAL/LABEL_SHOW_ANIMATION":"Show animation","SETTINGS_GENERAL/LABEL_MESSAGE_PER_PAGE":"Messages on page","SETTINGS_GENERAL/LABEL_NOTIFICATIONS":"Notifications","SETTINGS_GENERAL/LABEL_SOUND_NOTIFICATION":"Sound notification","SETTINGS_GENERAL/LABEL_CHROME_NOTIFICATION_DESC":"Show new messages notification popups","SETTINGS_GENERAL/LABEL_CHROME_NOTIFICATION_DESC_DENIED":"(Blocked by the browser)","SETTINGS_CONTACTS/LEGEND_CONTACTS":"Contacts","SETTINGS_CONTACTS/LABEL_CONTACTS_AUTOSAVE":"Automatically add recipients to your address book","SETTINGS_CONTACTS/LEGEND_CONTACTS_SYNC":"Remote Synchronization (CardDAV)","SETTINGS_CONTACTS/LABEL_CONTACTS_SYNC_ENABLE":"Enable remote synchronization","SETTINGS_CONTACTS/LABEL_CONTACTS_SYNC_SERVER":"Server","SETTINGS_CONTACTS/LABEL_CONTACTS_SYNC_AB_URL":"Addressbook URL","SETTINGS_CONTACTS/LABEL_CONTACTS_SYNC_USER":"User","SETTINGS_CONTACTS/LABEL_CONTACTS_SYNC_PASSWORD":"Password","SETTINGS_THEMES/LEGEND_THEMES":"Themes","SETTINGS_THEMES/LEGEND_THEMES_CUSTOM":"Custom Theme Configuration","SETTINGS_THEMES/LABEL_CUSTOM_TYPE":"Type","SETTINGS_THEMES/LABEL_CUSTOM_TYPE_LIGHT":"Light","SETTINGS_THEMES/LABEL_CUSTOM_TYPE_DARK":"Dark","SETTINGS_THEMES/LABEL_CUSTOM_BACKGROUND_IMAGE":"Background","SETTINGS_THEMES/BUTTON_UPLOAD_BACKGROUND_IMAGE":"Upload background image (JPG, PNG)","SETTINGS_THEMES/ERROR_FILE_IS_TOO_BIG":"File is too big","SETTINGS_THEMES/ERROR_FILE_TYPE_ERROR":"Invalid file type (JPG and PNG only)","SETTINGS_THEMES/ERROR_UNKNOWN":"An unknown file upload error occurred","SETTINGS_SOCIAL/LEGEND_GOOGLE":"Google","SETTINGS_SOCIAL/BUTTON_GOOGLE_CONNECT":"Connect Google","SETTINGS_SOCIAL/BUTTON_GOOGLE_DISCONNECT":"Disconnect Google","SETTINGS_SOCIAL/MAIN_GOOGLE_DESC":"After enabling login via Google, you can log into this account using Google button on the login screen.","SETTINGS_SOCIAL/LEGEND_FACEBOOK":"Facebook","SETTINGS_SOCIAL/BUTTON_FACEBOOK_CONNECT":"Connect Facebook","SETTINGS_SOCIAL/BUTTON_FACEBOOK_DISCONNECT":"Disconnect Facebook","SETTINGS_SOCIAL/MAIN_FACEBOOK_DESC":"After enabling login via Facebook, you can log into this account using Facebook button on the login screen.","SETTINGS_SOCIAL/LEGEND_TWITTER":"Twitter","SETTINGS_SOCIAL/BUTTON_TWITTER_CONNECT":"Connect Twitter","SETTINGS_SOCIAL/BUTTON_TWITTER_DISCONNECT":"Disconnect Twitter","SETTINGS_SOCIAL/MAIN_TWITTER_DESC":"After enabling login via Twitter, you can log into this account using Twitter button on the login screen.","SETTINGS_FOLDERS/LEGEND_FOLDERS":"Folder List","SETTINGS_FOLDERS/BUTTON_CREATE":"Create Folder","SETTINGS_FOLDERS/BUTTON_SYSTEM":"System Folders","SETTINGS_FOLDERS/BUTTON_DELETE":"Delete","SETTINGS_FOLDERS/BUTTON_SUBSCRIBE":"Subscribe","SETTINGS_FOLDERS/BUTTON_UNSUBSCRIBE":"Unsubscribe","SETTINGS_FOLDERS/LOADING_PROCESS":"Updating folder list","SETTINGS_FOLDERS/CREATING_PROCESS":"Creating a folder","SETTINGS_FOLDERS/DELETING_PROCESS":"Deleting a folder","SETTINGS_FOLDERS/RENAMING_PROCESS":"Renaming a folder","SETTINGS_FOLDERS/DELETING_ASK":"Are you sure?","SETTINGS_FOLDERS/TO_MANY_FOLDERS_DESC_1":"You have too many folders!","SETTINGS_FOLDERS/TO_MANY_FOLDERS_DESC_2":"We have shown only a part of them, to avoid performance problems.","SETTINGS_FOLDERS/HELP_DELETE_FOLDER":"Delete folder","SETTINGS_FOLDERS/HELP_SHOW_HIDE_FOLDER":"Show/hide folder","SETTINGS_FOLDERS/HELP_CHECK_FOR_NEW_MESSAGES":"Check/don't check for new messages","SETTINGS_ACCOUNTS/LEGEND_ACCOUNTS":"Accounts","SETTINGS_ACCOUNTS/LEGEND_IDENTITIES":"Identities","SETTINGS_ACCOUNTS/LEGEND_ACCOUNTS_AND_IDENTITIES":"Accounts and Identities","SETTINGS_ACCOUNTS/BUTTON_ADD_ACCOUNT":"Add an Account","SETTINGS_ACCOUNTS/BUTTON_ADD_IDENTITY":"Add an Identity","SETTINGS_ACCOUNTS/BUTTON_DELETE":"Delete","SETTINGS_ACCOUNTS/LOADING_PROCESS":"Updating...","SETTINGS_ACCOUNTS/DELETING_ASK":"Are you sure?","SETTINGS_ACCOUNTS/DEFAULT_IDENTITY_LABEL":"default","SETTINGS_IDENTITIES/LEGEND_IDENTITY":"Identity","SETTINGS_IDENTITIES/LEGEND_IDENTITIES":"Additional Identities","SETTINGS_IDENTITIES/LABEL_DEFAULT":"Default","SETTINGS_IDENTITIES/LABEL_DISPLAY_NAME":"Name","SETTINGS_IDENTITIES/LABEL_REPLY_TO":"Reply-To","SETTINGS_IDENTITIES/LABEL_SIGNATURE":"Signature","SETTINGS_IDENTITIES/LABEL_ADD_SIGNATURE_TO_ALL":"Add your signature to all the outgoing messages","SETTINGS_IDENTITIES/BUTTON_ADD_IDENTITY":"Add Identity","SETTINGS_IDENTITIES/BUTTON_DELETE":"Delete","SETTINGS_IDENTITIES/LOADING_PROCESS":"Updating identity list","SETTINGS_IDENTITIES/DELETING_ASK":"Are you sure?","SETTINGS_CHANGE_PASSWORD/LEGEND_CHANGE_PASSWORD":"Change Password","SETTINGS_CHANGE_PASSWORD/LABEL_CURRENT_PASSWORD":"Current password","SETTINGS_CHANGE_PASSWORD/LABEL_NEW_PASSWORD":"New password","SETTINGS_CHANGE_PASSWORD/LABEL_REPEAT_PASSWORD":"Confirm New Password","SETTINGS_CHANGE_PASSWORD/BUTTON_UPDATE_PASSWORD":"Set New Password","SETTINGS_CHANGE_PASSWORD/ERROR_PASSWORD_MISMATCH":"Passwords do not match, please try again","SETTINGS_OPEN_PGP/LEGEND_OPEN_PGP":"OpenPGP","SETTINGS_OPEN_PGP/BUTTON_ADD_OPEN_PGP_KEY":"Import OpenPGP Key","SETTINGS_OPEN_PGP/BUTTON_GENERATE_OPEN_PGP_KEYS":"Generate OpenPGP Keys","SETTINGS_OPEN_PGP/TITLE_PRIVATE":"Private","SETTINGS_OPEN_PGP/TITLE_PUBLIC":"Public","SETTINGS_OPEN_PGP/DELETING_ASK":"Are you sure?","SETTINGS_OPEN_PGP/GENERATE_ONLY_HTTPS":"HTTPS only","SETTINGS_OPEN_PGP/LABEL_ALLOW_DRAFT_AUTOSAVE":"Automatically save draft","SHORTCUTS_HELP/LEGEND_SHORTCUTS_HELP":"Keyboard shortcuts help","SHORTCUTS_HELP/TAB_MAILBOX":"Mailbox","SHORTCUTS_HELP/TAB_MESSAGE_LIST":"Message list","SHORTCUTS_HELP/TAB_MESSAGE_VIEW":"Message view","SHORTCUTS_HELP/TAB_COMPOSE":"Compose","SHORTCUTS_HELP/LABEL_OPEN_USER_DROPDOWN":"Open user dropdown","SHORTCUTS_HELP/LABEL_REPLY":"Reply","SHORTCUTS_HELP/LABEL_REPLY_ALL":"Reply All","SHORTCUTS_HELP/LABEL_FORWARD":"Forward","SHORTCUTS_HELP/LABEL_FORWARD_MULTIPLY":"Forward as attachment(s)","SHORTCUTS_HELP/LABEL_HELP":"Help","SHORTCUTS_HELP/LABEL_CHECK_ALL":"Select all messages","SHORTCUTS_HELP/LABEL_ARCHIVE":"Archive","SHORTCUTS_HELP/LABEL_DELETE":"Delete","SHORTCUTS_HELP/LABEL_OPEN_THREAD":"Open selected thread","SHORTCUTS_HELP/LABEL_MOVE":"Move","SHORTCUTS_HELP/LABEL_READ":"Read selected messages","SHORTCUTS_HELP/LABEL_UNREAD":"Unread selected messages","SHORTCUTS_HELP/LABEL_IMPORTANT":"Important, flag selected messages","SHORTCUTS_HELP/LABEL_SEARCH":"Search","SHORTCUTS_HELP/LABEL_CANCEL_SEARCH":"Cancel search","SHORTCUTS_HELP/LABEL_FULLSCREEN_ENTER":"Fullscreen (Preview pane layout)","SHORTCUTS_HELP/LABEL_VIEW_MESSAGE_ENTER":"View message (No preview pane layout)","SHORTCUTS_HELP/LABEL_SWITCH_TO_MESSAGE":"Switch focus to selected message","SHORTCUTS_HELP/LABEL_SWITCH_TO_FOLDER_LIST":"Switch focus to folder list","SHORTCUTS_HELP/LABEL_FULLSCREEN_TOGGLE":"Toggle fullscreen mode","SHORTCUTS_HELP/LABEL_BLOCKQUOTES_TOGGLE":"Toggle message blockquotes","SHORTCUTS_HELP/LABEL_THREAD_NEXT":"Next message in thread","SHORTCUTS_HELP/LABEL_THREAD_PREV":"Previous message in thread","SHORTCUTS_HELP/LABEL_PRINT":"Print","SHORTCUTS_HELP/LABEL_EXIT_FULLSCREEN":"Exit fullscreen mode","SHORTCUTS_HELP/LABEL_CLOSE_MESSAGE":"Close message (No preview pane layout)","SHORTCUTS_HELP/LABEL_SWITCH_TO_LIST":"Switch focus back to message list","SHORTCUTS_HELP/LABEL_OPEN_COMPOSE_POPUP":"Open compose popup","SHORTCUTS_HELP/LABEL_MINIMIZE_COMPOSE_POPUP":"Minimize compose popup","SHORTCUTS_HELP/LABEL_OPEN_IDENTITIES_DROPDOWN":"Open identities dropdown","SHORTCUTS_HELP/LABEL_SAVE_MESSAGE":"Save message","SHORTCUTS_HELP/LABEL_SEND_MESSAGE":"Send message","SHORTCUTS_HELP/LABEL_CLOSE_COMPOSE":"Close compose","PGP_NOTIFICATIONS/NO_PUBLIC_KEYS_FOUND":"No public keys found","PGP_NOTIFICATIONS/NO_PUBLIC_KEYS_FOUND_FOR":"No public keys found for \"%EMAIL%\" email","PGP_NOTIFICATIONS/NO_PRIVATE_KEY_FOUND":"No private key found","PGP_NOTIFICATIONS/NO_PRIVATE_KEY_FOUND_FOR":"No private key found for \"%EMAIL%\" email","PGP_NOTIFICATIONS/ADD_A_PUBLICK_KEY":"Add a public key","PGP_NOTIFICATIONS/SELECT_A_PRIVATE_KEY":"Select a private key","PGP_NOTIFICATIONS/UNVERIFIRED_SIGNATURE":"Unverified signature","PGP_NOTIFICATIONS/DECRYPTION_ERROR":"OpenPGP decryption error","PGP_NOTIFICATIONS/GOOD_SIGNATURE":"Good signature from %USER%","PGP_NOTIFICATIONS/PGP_ERROR":"OpenPGP error: %ERROR%","PGP_NOTIFICATIONS/SPECIFY_FROM_EMAIL":"Please specify FROM email address","PGP_NOTIFICATIONS/SPECIFY_AT_LEAST_ONE_RECIPIENT":"Please specify at least one recipient","NOTIFICATIONS/INVALID_TOKEN":"Invalid token","NOTIFICATIONS/AUTH_ERROR":"Authentication failed","NOTIFICATIONS/ACCESS_ERROR":"Access error","NOTIFICATIONS/CONNECTION_ERROR":"Can't connect to server","NOTIFICATIONS/CAPTCHA_ERROR":"Incorrect CAPTCHA.","NOTIFICATIONS/SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE":"This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings.","NOTIFICATIONS/SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE":"This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings.","NOTIFICATIONS/SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE":"This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings.","NOTIFICATIONS/DOMAIN_NOT_ALLOWED":"Domain is not allowed","NOTIFICATIONS/ACCOUNT_NOT_ALLOWED":"Account is not allowed","NOTIFICATIONS/ACCOUNT_TWO_FACTOR_AUTH_REQUIRED":"Two factor verification required","NOTIFICATIONS/ACCOUNT_TWO_FACTOR_AUTH_ERROR":"Two factor verification error","NOTIFICATIONS/COULD_NOT_SAVE_NEW_PASSWORD":"Could not save new password","NOTIFICATIONS/CURRENT_PASSWORD_INCORRECT":"Current password incorrect","NOTIFICATIONS/NEW_PASSWORD_SHORT":"Password is too short","NOTIFICATIONS/NEW_PASSWORD_WEAK":"Password is too easy","NOTIFICATIONS/NEW_PASSWORD_FORBIDDENT":"Password contains forbidden characters","NOTIFICATIONS/CONTACTS_SYNC_ERROR":"Contacts synchronization error","NOTIFICATIONS/CANT_GET_MESSAGE_LIST":"Can't get message list","NOTIFICATIONS/CANT_GET_MESSAGE":"Can't get message","NOTIFICATIONS/CANT_DELETE_MESSAGE":"Can't delete message","NOTIFICATIONS/CANT_MOVE_MESSAGE":"Can't move message","NOTIFICATIONS/CANT_SAVE_MESSAGE":"Can't save message","NOTIFICATIONS/CANT_SEND_MESSAGE":"Can't send message","NOTIFICATIONS/INVALID_RECIPIENTS":"Invalid recipients","NOTIFICATIONS/CANT_SAVE_FILTERS":"Can't save filters","NOTIFICATIONS/CANT_GET_FILTERS":"Can't get filters","NOTIFICATIONS/FILTERS_ARE_NOT_CORRECT":"Filters are not correct","NOTIFICATIONS/CANT_CREATE_FOLDER":"Can't create folder","NOTIFICATIONS/CANT_RENAME_FOLDER":"Can't rename folder","NOTIFICATIONS/CANT_DELETE_FOLDER":"Can't delete folder","NOTIFICATIONS/CANT_DELETE_NON_EMPTY_FOLDER":"Can't delete non-empty directory","NOTIFICATIONS/CANT_SUBSCRIBE_FOLDER":"Can't subscribe folder","NOTIFICATIONS/CANT_UNSUBSCRIBE_FOLDER":"Can't unsubscribe folder","NOTIFICATIONS/CANT_SAVE_SETTINGS":"Can't save settings","NOTIFICATIONS/CANT_SAVE_PLUGIN_SETTINGS":"Can't save settings","NOTIFICATIONS/DOMAIN_ALREADY_EXISTS":"Domain already exists","NOTIFICATIONS/CANT_INSTALL_PACKAGE":"Failed to install package","NOTIFICATIONS/CANT_DELETE_PACKAGE":"Failed to remove package","NOTIFICATIONS/INVALID_PLUGIN_PACKAGE":"Invalid plugin package","NOTIFICATIONS/UNSUPPORTED_PLUGIN_PACKAGE":"Unsupported plugin package","NOTIFICATIONS/LICENSING_SERVER_IS_UNAVAILABLE":"Subscription server is unvailable","NOTIFICATIONS/LICENSING_DOMAIN_EXPIRED":"Subscription for this domain has expired.","NOTIFICATIONS/LICENSING_DOMAIN_BANNED":"Subscription for this domain is banned.","NOTIFICATIONS/DEMO_SEND_MESSAGE_ERROR":"For security purposes, this account is not allowed to send messages to external e-mail addresses!","NOTIFICATIONS/DEMO_ACCOUNT_ERROR":"For security purposes, this account is not allowed for this action!","NOTIFICATIONS/ACCOUNT_ALREADY_EXISTS":"Account already exists","NOTIFICATIONS/ACCOUNT_DOES_NOT_EXIST":"Account doesn't exist","NOTIFICATIONS/MAIL_SERVER_ERROR":"An error has occured while accessing mail server","NOTIFICATIONS/INVALID_INPUT_ARGUMENT":"Invalid input argument","NOTIFICATIONS/UNKNOWN_ERROR":"Unknown error","STATIC/BACK_LINK":"Reload","STATIC/DOMAIN_LIST_DESC":"List of domains webmail is allowed to access.","STATIC/PHP_EXSTENSIONS_ERROR_DESC":"Required PHP extension are not available in your PHP configuration!","STATIC/PHP_VERSION_ERROR_DESC":"Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!","STATIC/NO_SCRIPT_TITLE":"JavaScript is required for this application.","STATIC/NO_SCRIPT_DESC":"JavaScript support is not available in your browser.\nPlease enable JavaScript support in your browser settings and retry.","STATIC/NO_COOKIE_TITLE":"Cookies support is required for this application.","STATIC/NO_COOKIE_DESC":"Cookies support is not available in your browser.\nPlease enable Cookie support in your browser settings and retry.","STATIC/BAD_BROWSER_TITLE":"Your browser is outdated.","STATIC/BAD_BROWSER_DESC":"To use all the features of the application,\ndownload and install one of these browsers:"};window.moment && window.moment.locale && window.moment.locale('en'); \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/cache/5b/1c/5b1c51ed23b96bde49c865e074352dc9b29808f0 b/copper-server/core/rainloop/app/data/_data_/_default_/cache/5b/1c/5b1c51ed23b96bde49c865e074352dc9b29808f0 new file mode 100644 index 00000000..2efb8672 --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/cache/5b/1c/5b1c51ed23b96bde49c865e074352dc9b29808f0 @@ -0,0 +1 @@ +window.rainloopTEMPLATES=[" \ No newline at end of file +
\ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/configs/application.ini b/copper-server/core/rainloop/app/data/_data_/_default_/configs/application.ini new file mode 100644 index 00000000..5a977b34 --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/configs/application.ini @@ -0,0 +1,356 @@ +; RainLoop Webmail configuration file +; Please don't add custom parameters here, those will be overwritten + +[webmail] +; Text displayed as page title +title = "Copper Webmail" + +; Text displayed on startup +loading_description = "COPPER" +favicon_url = "" + +; Theme used by default +theme = "Default" + +; Allow theme selection on settings screen +allow_themes = On +allow_user_background = Off + +; Language used by default +language = "en" + +; Admin Panel interface language +language_admin = "en" + +; Allow language selection on settings screen +allow_languages_on_settings = On +allow_additional_accounts = On +allow_additional_identities = On + +; Number of messages displayed on page by default +messages_per_page = 30 + +; File size limit (MB) for file upload on compose screen +; 0 for unlimited. +attachment_size_limit = 25 + +[interface] +show_attachment_thumbnail = On +use_native_scrollbars = Off +new_move_to_folder_button = On + +[branding] +login_logo = "" +login_background = "" +login_desc = "" +login_css = "" +login_powered = On +user_css = "" +user_logo = "" +user_logo_title = "" +user_logo_message = "" +user_iframe_message = "" +welcome_page_url = "" +welcome_page_display = "none" + +[contacts] +; Enable contacts +enable = On +allow_sync = On +sync_interval = 30 +type = "mysql" +pdo_dsn = "mysql:host=172.19.0.19;port=3306;dbname=rainloop" +pdo_user = "rainloop" +pdo_password = "rainloop" +suggestions_limit = 05 + +[security] +; Enable CSRF protection (http://en.wikipedia.org/wiki/Cross-site_request_forgery) +csrf_protection = On +custom_server_signature = "RainLoop" +x_frame_options_header = "" +openpgp = Off + +; Login and password for web admin panel +admin_login = "admin" +admin_password = "12345" + +; Access settings +allow_admin_panel = On +allow_two_factor_auth = Off +force_two_factor_auth = Off +hide_x_mailer_header = Off +admin_panel_host = "" +admin_panel_key = "admin" +content_security_policy = "" +core_install_access_domain = "" + +[ssl] +; Require verification of SSL certificate used. +verify_certificate = Off + +; Allow self-signed certificates. Requires verify_certificate. +allow_self_signed = On + +; Location of Certificate Authority file on local filesystem (/etc/ssl/certs/ca-certificates.crt) +cafile = "" + +; capath must be a correctly hashed certificate directory. (/etc/ssl/certs/) +capath = "" + +[capa] +folders = On +composer = On +contacts = On +settings = On +quota = On +help = On +reload = On +search = On +search_adv = On +filters = On +x-templates = Off +dangerous_actions = On +message_actions = On +messagelist_actions = On +attachments_actions = On + +[login] +default_domain = "copper.opensource.lk" + +; Allow language selection on webmail login screen +allow_languages_on_login = On +determine_user_language = On +determine_user_domain = Off +welcome_page = On +hide_submit_button = On +forgot_password_link_url = "" +registration_link_url = "" +login_lowercase = On + +; This option allows webmail to remember the logged in user +; once they closed the browser window. +; +; Values: +; "DefaultOff" - can be used, disabled by default; +; "DefaultOn" - can be used, enabled by default; +; "Unused" - cannot be used +sign_me_auto = "DefaultOff" + +[plugins] +; Enable plugin support +enable = On + +; List of enabled plugins +enabled_list = "ldap-change-password" + +[defaults] +; Editor mode used by default (Plain, Html, HtmlForced or PlainForced) +view_editor_type = "Html" + +; layout: 0 - no preview, 1 - side preview, 2 - bottom preview +view_layout = 1 +view_use_checkboxes = On +autologout = 30 +show_images = Off +contacts_autosave = On +mail_use_threads = Off +allow_draft_autosave = On +mail_reply_same_folder = Off + +[logs] +; Enable logging +enable = Off + +; Logs entire request only if error occured (php requred) +write_on_error_only = Off + +; Logs entire request only if php error occured +write_on_php_error_only = Off + +; Logs entire request only if request timeout (in seconds) occured. +write_on_timeout_only = 0 + +; Required for development purposes only. +; Disabling this option is not recommended. +hide_passwords = On +#time_offset = "0" +time_offset = "1" +session_filter = "" + +; Log filename. +; For security reasons, some characters are removed from filename. +; Allows for pattern-based folder creation (see examples below). +; +; Patterns: +; {date:Y-m-d} - Replaced by pattern-based date +; Detailed info: http://www.php.net/manual/en/function.date.php +; {user:email} - Replaced by user's email address +; If user is not logged in, value is set to "unknown" +; {user:login} - Replaced by user's login (the user part of an email) +; If user is not logged in, value is set to "unknown" +; {user:domain} - Replaced by user's domain name (the domain part of an email) +; If user is not logged in, value is set to "unknown" +; {user:uid} - Replaced by user's UID regardless of account currently used +; +; {user:ip} +; {request:ip} - Replaced by user's IP address +; +; Others: +; {imap:login} {imap:host} {imap:port} +; {smtp:login} {smtp:host} {smtp:port} +; +; Examples: +; filename = "log-{date:Y-m-d}.txt" +; filename = "{date:Y-m-d}/{user:domain}/{user:email}_{user:uid}.log" +; filename = "{user:email}-{date:Y-m-d}.txt" +filename = "log-{date:Y-m-d}.txt" + +; Enable auth logging in a separate file (for fail2ban) +auth_logging = Off +auth_logging_filename = "fail2ban/auth-{date:Y-m-d}.txt" +auth_logging_format = "[{date:Y-m-d H:i:s}] Auth failed: ip={request:ip} user={imap:login} host={imap:host} port={imap:port}" + +[debug] +; Special option required for development purposes +enable = Off + +[social] +; Google +google_enable = On +google_enable_auth = Off +google_enable_auth_fast = Off +google_enable_drive = Off +google_enable_preview = Off +google_client_id = "" +google_client_secret = "" +google_api_key = "" + +; Facebook +fb_enable = Off +fb_app_id = "" +fb_app_secret = "" + +; Twitter +twitter_enable = Off +twitter_consumer_key = "" +twitter_consumer_secret = "" + +; Dropbox +dropbox_enable = Off +dropbox_api_key = "" + +[cache] +; The section controls caching of the entire application. +; +; Enables caching in the system +enable = On + +; Additional caching key. If changed, cache is purged +index = "v1" + +; Can be: files, APC, memcache, redis (beta) +fast_cache_driver = "files" + +; Additional caching key. If changed, fast cache is purged +fast_cache_index = "v1" + +; Browser-level cache. If enabled, caching is maintainted without using files +http = On + +; Browser-level cache time (seconds, Expires header) +http_expires = 3600 + +; Caching message UIDs when searching and sorting (threading) +server_uids = On + +[labs] +; Experimental settings. Handle with care. +; +allow_mobile_version = On +ignore_folders_subscription = Off +check_new_password_strength = On +update_channel = "stable" +allow_gravatar = On +allow_prefetch = On +allow_smart_html_links = On +cache_system_data = On +date_from_headers = On +autocreate_system_folders = On +allow_message_append = Off +disable_iconv_if_mbstring_supported = Off +login_fault_delay = 1 +log_ajax_response_write_limit = 300 +allow_html_editor_source_button = Off +allow_html_editor_biti_buttons = Off +allow_ctrl_enter_on_compose = On +try_to_detect_hidden_images = Off +hide_dangerous_actions = Off +use_app_debug_js = Off +use_mobile_version_for_tablets = Off +use_app_debug_css = Off +use_imap_sort = On +use_imap_force_selection = Off +use_imap_list_subscribe = On +use_imap_thread = On +use_imap_move = Off +use_imap_expunge_all_on_delete = Off +imap_forwarded_flag = "$Forwarded" +imap_read_receipt_flag = "$ReadReceipt" +imap_body_text_limit = 555000 +imap_message_list_fast_simple_search = On +imap_message_list_count_limit_trigger = 0 +imap_message_list_date_filter = 0 +imap_message_list_permanent_filter = "" +imap_message_all_headers = Off +imap_large_thread_limit = 50 +imap_folder_list_limit = 200 +imap_show_login_alert = On +imap_use_auth_plain = On +imap_use_auth_cram_md5 = Off +smtp_show_server_errors = Off +smtp_use_auth_plain = On +smtp_use_auth_cram_md5 = Off +sieve_allow_raw_script = Off +sieve_utf8_folder_name = On +sieve_auth_plain_initial = On +sieve_allow_fileinto_inbox = Off +imap_timeout = 300 +smtp_timeout = 60 +sieve_timeout = 10 +domain_list_limit = 99 +mail_func_clear_headers = On +mail_func_additional_parameters = Off +favicon_status = On +folders_spec_limit = 50 +owncloud_save_folder = "Attachments" +owncloud_suggestions = On +curl_proxy = "" +curl_proxy_auth = "" +in_iframe = Off +force_https = Off +custom_login_link = "" +custom_logout_link = "" +allow_external_login = Off +allow_external_sso = Off +external_sso_key = "" +http_client_ip_check_proxy = Off +fast_cache_memcache_host = "127.0.0.1" +fast_cache_memcache_port = 11211 +fast_cache_redis_host = "127.0.0.1" +fast_cache_redis_port = 6379 +use_local_proxy_for_external_images = Off +detect_image_exif_orientation = On +cookie_default_path = "" +cookie_default_secure = Off +check_new_messages = On +replace_env_in_configuration = "" +startup_url = "" +strict_html_parser = Off +allow_cmd = Off +dev_email = "" +dev_password = "" + +[version] +current = "1.12.0" +saved = "Fri, 26 Oct 2018 10:29:57 +0000" \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/configs/plugin-directadmin-change-password.ini b/copper-server/core/rainloop/app/data/_data_/_default_/configs/plugin-directadmin-change-password.ini new file mode 100644 index 00000000..df508a97 --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/configs/plugin-directadmin-change-password.ini @@ -0,0 +1,6 @@ +; RainLoop Webmail plugin (directadmin-change-password) + +[plugin] +direct_admin_host = "" +direct_admin_port = 2222 +allowed_emails = "*" \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/configs/plugin-ldap-change-password.ini b/copper-server/core/rainloop/app/data/_data_/_default_/configs/plugin-ldap-change-password.ini new file mode 100644 index 00000000..c6da5458 --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/configs/plugin-ldap-change-password.ini @@ -0,0 +1,9 @@ +; RainLoop Webmail plugin (ldap-change-password) + +[plugin] +hostname = "172.19.0.22" +port = 389 +user_dn_format = "mail={email},ou=users,domainName=coppermail.dyndns.org, dc=coppermail,dc=dyndns,dc=org" +password_field = "userPassword" +password_enc_type = "SSHA" +allowed_emails = "*" \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/domains/copper.opensource.lk.ini b/copper-server/core/rainloop/app/data/_data_/_default_/domains/copper.opensource.lk.ini new file mode 100644 index 00000000..37d8d4e1 --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/domains/copper.opensource.lk.ini @@ -0,0 +1,16 @@ +imap_host = "172.19.0.17" +imap_port = 143 +imap_secure = "TLS" +imap_short_login = On +sieve_use = Off +sieve_allow_raw = Off +sieve_host = "" +sieve_port = 4190 +sieve_secure = "None" +smtp_host = "172.19.0.17" +smtp_port = 587 +smtp_secure = "TLS" +smtp_short_login = On +smtp_auth = On +smtp_php_mail = Off +white_list = "" \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/domains/coppermail.dyndns.org.ini b/copper-server/core/rainloop/app/data/_data_/_default_/domains/coppermail.dyndns.org.ini new file mode 100644 index 00000000..37d8d4e1 --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/domains/coppermail.dyndns.org.ini @@ -0,0 +1,16 @@ +imap_host = "172.19.0.17" +imap_port = 143 +imap_secure = "TLS" +imap_short_login = On +sieve_use = Off +sieve_allow_raw = Off +sieve_host = "" +sieve_port = 4190 +sieve_secure = "None" +smtp_host = "172.19.0.17" +smtp_port = 587 +smtp_secure = "TLS" +smtp_short_login = On +smtp_auth = On +smtp_php_mail = Off +white_list = "" \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/domains/disabled b/copper-server/core/rainloop/app/data/_data_/_default_/domains/disabled new file mode 100644 index 00000000..b641ea75 --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/domains/disabled @@ -0,0 +1 @@ +outlook.com,qq.com,yahoo.com diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/domains/gmail.com.ini b/copper-server/core/rainloop/app/data/_data_/_default_/domains/gmail.com.ini new file mode 100644 index 00000000..950f7059 --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/domains/gmail.com.ini @@ -0,0 +1,7 @@ +imap_host = "imap.gmail.com" +imap_port = 993 +imap_secure = "SSL" +smtp_host = "smtp.gmail.com" +smtp_port = 587 +smtp_secure = "TLS" +smtp_auth = On diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/domains/outlook.com.ini b/copper-server/core/rainloop/app/data/_data_/_default_/domains/outlook.com.ini new file mode 100644 index 00000000..ece6da4b --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/domains/outlook.com.ini @@ -0,0 +1,7 @@ +imap_host = "imap-mail.outlook.com" +imap_port = 993 +imap_secure = "SSL" +smtp_host = "smtp-mail.outlook.com" +smtp_port = 587 +smtp_secure = "TLS" +smtp_auth = On \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/domains/qq.com.ini b/copper-server/core/rainloop/app/data/_data_/_default_/domains/qq.com.ini new file mode 100644 index 00000000..c9be4e79 --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/domains/qq.com.ini @@ -0,0 +1,7 @@ +imap_host = "imap.qq.com" +imap_port = 993 +imap_secure = "SSL" +smtp_host = "smtp.qq.com" +smtp_port = 465 +smtp_secure = "SSL" +smtp_auth = On diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/domains/yahoo.com.ini b/copper-server/core/rainloop/app/data/_data_/_default_/domains/yahoo.com.ini new file mode 100644 index 00000000..682664ca --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/domains/yahoo.com.ini @@ -0,0 +1,7 @@ +imap_host = "imap.mail.yahoo.com" +imap_port = 993 +imap_secure = "SSL" +smtp_host = "smtp.mail.yahoo.com" +smtp_port = 587 +smtp_secure = "TLS" +smtp_auth = On diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/ChangePasswordLdapDriver.php b/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/ChangePasswordLdapDriver.php new file mode 100644 index 00000000..69b6b665 --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/ChangePasswordLdapDriver.php @@ -0,0 +1,230 @@ +sHostName = $sHostName; + $this->iHostPort = $iHostPort; + $this->sUserDnFormat = $sUserDnFormat; + $this->sPasswordField = $sPasswordField; + $this->sPasswordEncType = $sPasswordEncType; + + return $this; + } + + /** + * @param string $sAllowedEmails + * + * @return \ChangePasswordLdapDriver + */ + public function SetAllowedEmails($sAllowedEmails) + { + $this->sAllowedEmails = $sAllowedEmails; + + return $this; + } + + /** + * @param \MailSo\Log\Logger $oLogger + * + * @return \ChangePasswordLdapDriver + */ + public function SetLogger($oLogger) + { + if ($oLogger instanceof \MailSo\Log\Logger) + { + $this->oLogger = $oLogger; + } + + return $this; + } + + /** + * @param \RainLoop\Account $oAccount + * + * @return bool + */ + public function PasswordChangePossibility($oAccount) + { + return $oAccount && $oAccount->Email() && + \RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails); + } + + /** + * @param \RainLoop\Model\Account $oAccount + * @param string $sPrevPassword + * @param string $sNewPassword + * + * @return bool + */ + public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) + { + $bResult = false; + + try + { + $sDomain = \MailSo\Base\Utils::GetDomainFromEmail($oAccount->Email()); + $sUserDn = \strtr($this->sUserDnFormat, array( + '{domain}' => $sDomain, + '{domain:dc}' => 'dc='.\strtr($sDomain, array('.' => ',dc=')), + '{email}' => $oAccount->Email(), + '{email:user}' => \MailSo\Base\Utils::GetAccountNameFromEmail($oAccount->Email()), + '{email:domain}' => $sDomain, + '{login}' => $oAccount->Login(), + '{imap:login}' => $oAccount->Login(), + '{imap:host}' => $oAccount->DomainIncHost(), + '{imap:port}' => $oAccount->DomainIncPort() + )); + + $oCon = @\ldap_connect($this->sHostName, $this->iHostPort); + if ($oCon) + { + @\ldap_set_option($oCon, LDAP_OPT_PROTOCOL_VERSION, 3); + + if (!@\ldap_bind($oCon, $sUserDn, $sPrevPassword)) + { + if ($this->oLogger) + { + $sError = $oCon ? @\ldap_error($oCon) : ''; + $iErrno = $oCon ? @\ldap_errno($oCon) : 0; + + $this->oLogger->Write('ldap_bind error: '.$sError.' ('.$iErrno.')', + \MailSo\Log\Enumerations\Type::WARNING, 'LDAP'); + } + + return false; + } + } + else + { + return false; + } + + $sSshaSalt = ''; + $sShaPrefix = '{SHA}'; + $sEncodedNewPassword = $sNewPassword; + switch (\strtolower($this->sPasswordEncType)) + { + case 'ssha': + $sSshaSalt = $this->getSalt(4); + $sShaPrefix = '{SSHA}'; + case 'sha': + switch (true) + { + default: + case \function_exists('sha1'): + $sEncodedNewPassword = $sShaPrefix.\base64_encode(\sha1($sNewPassword.$sSshaSalt, true).$sSshaSalt); + break; + case \function_exists('hash'): + $sEncodedNewPassword = $sShaPrefix.\base64_encode(\hash('sha1', $sNewPassword, true).$sSshaSalt); + break; + case \function_exists('mhash') && defined('MHASH_SHA1'): + $sEncodedNewPassword = $sShaPrefix.\base64_encode(\mhash(MHASH_SHA1, $sNewPassword).$sSshaSalt); + break; + } + break; + case 'md5': + $sEncodedNewPassword = '{MD5}'.\base64_encode(\pack('H*', \md5($sNewPassword))); + break; + case 'crypt': + $sEncodedNewPassword = '{CRYPT}'.\crypt($sNewPassword, $this->getSalt(2)); + break; + } + + $aEntry = array(); + $aEntry[$this->sPasswordField] = (string) $sEncodedNewPassword; + + if (!!@\ldap_modify($oCon, $sUserDn, $aEntry)) + { + $bResult = true; + } + else + { + if ($this->oLogger) + { + $sError = $oCon ? @\ldap_error($oCon) : ''; + $iErrno = $oCon ? @\ldap_errno($oCon) : 0; + + $this->oLogger->Write('ldap_modify error: '.$sError.' ('.$iErrno.')', + \MailSo\Log\Enumerations\Type::WARNING, 'LDAP'); + } + } + } + catch (\Exception $oException) + { + if ($this->oLogger) + { + $this->oLogger->WriteException($oException, + \MailSo\Log\Enumerations\Type::WARNING, 'LDAP'); + } + + $bResult = false; + } + + return $bResult; + } + + /** + * @param int $iLength + * + * @return string + */ + private function getSalt($iLength) + { + $sChars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + $iCharsLength = \strlen($sChars); + + $sResult = ''; + while (\strlen($sResult) < $iLength) + { + $sResult .= \substr($sChars, \rand() % $iCharsLength, 1); + } + + return $sResult; + } +} diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/LICENSE b/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/LICENSE new file mode 100644 index 00000000..3c3305e3 --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2015 RainLoop Team + +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. diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/README b/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/README new file mode 100644 index 00000000..53c1abf7 --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/README @@ -0,0 +1 @@ +Plugin that adds functionality to change the email account password (LDAP Password). diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/VERSION b/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/VERSION new file mode 100644 index 00000000..b123147e --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/VERSION @@ -0,0 +1 @@ +1.1 \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/index.php b/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/index.php new file mode 100644 index 00000000..cb92f865 --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/index.php @@ -0,0 +1,79 @@ +addHook('main.fabrica', 'MainFabrica'); + } + + /** + * @return string + */ + public function Supported() + { + if (!\function_exists('ldap_connect')) + { + return 'The LDAP PHP exention must be installed to use this plugin'; + } + + return ''; + } + + /** + * @param string $sName + * @param mixed $oProvider + */ + public function MainFabrica($sName, &$oProvider) + { + switch ($sName) + { + case 'change-password': + + $sHostName = \trim($this->Config()->Get('plugin', 'hostname', '')); + $iHostPort = (int) $this->Config()->Get('plugin', 'port', 389); + $sUserDnFormat = \trim($this->Config()->Get('plugin', 'user_dn_format', '')); + $sPasswordField = \trim($this->Config()->Get('plugin', 'password_field', '')); + $sPasswordEncType = \trim($this->Config()->Get('plugin', 'password_enc_type', '')); + + if (!empty($sHostName) && 0 < $iHostPort && !empty($sUserDnFormat) && !empty($sPasswordField) && !empty($sPasswordEncType)) + { + include_once __DIR__.'/ChangePasswordLdapDriver.php'; + + $oProvider = new \ChangePasswordLdapDriver(); + + $oProvider + ->SetConfig($sHostName, $iHostPort, $sUserDnFormat, $sPasswordField, $sPasswordEncType) + ->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', '')))) + ->SetLogger($this->Manager()->Actions()->Logger()) + ; + } + break; + } + } + + /** + * @return array + */ + public function configMapping() + { + return array( + \RainLoop\Plugins\Property::NewInstance('hostname')->SetLabel('LDAP hostname') + ->SetDefaultValue('127.0.0.1'), + \RainLoop\Plugins\Property::NewInstance('port')->SetLabel('LDAP port') + ->SetType(\RainLoop\Enumerations\PluginPropertyType::INT) + ->SetDefaultValue(389), + \RainLoop\Plugins\Property::NewInstance('user_dn_format')->SetLabel('User DN format') + ->SetDescription('LDAP user dn format. Supported tokens: {email}, {login}, {domain}, {domain:dc}, {imap:login}, {imap:host}, {imap:port}') + ->SetDefaultValue('uid={imap:login},ou=Users,{domain:dc}'), + \RainLoop\Plugins\Property::NewInstance('password_field')->SetLabel('Password field') + ->SetDefaultValue('userPassword'), + \RainLoop\Plugins\Property::NewInstance('password_enc_type')->SetLabel('Encryption type') + ->SetType(\RainLoop\Enumerations\PluginPropertyType::SELECTION) + ->SetDefaultValue(array('SHA', 'SSHA', 'MD5', 'Crypt', 'Clear')), + \RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') + ->SetDescription('Allowed emails, space as delimiter, wildcard supported. Example: user1@domain1.net user2@domain1.net *@domain2.net') + ->SetDefaultValue('*') + ); + } +} diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin@coppermail.dyndns.org/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin@coppermail.dyndns.org/settings_local new file mode 100644 index 00000000..0bf23f3d --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin@coppermail.dyndns.org/settings_local @@ -0,0 +1 @@ +{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin_horde@copper.opensource.lk/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin_horde@copper.opensource.lk/settings_local new file mode 100644 index 00000000..0bf23f3d --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin_horde@copper.opensource.lk/settings_local @@ -0,0 +1 @@ +{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin_horde@coppermail.dyndns.org/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin_horde@coppermail.dyndns.org/settings_local new file mode 100644 index 00000000..0bf23f3d --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin_horde@coppermail.dyndns.org/settings_local @@ -0,0 +1 @@ +{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/an/anushka@copper.opensource.lk/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/an/anushka@copper.opensource.lk/settings_local new file mode 100644 index 00000000..0bf23f3d --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/an/anushka@copper.opensource.lk/settings_local @@ -0,0 +1 @@ +{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ba/bandara@copper.opensource.lk/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ba/bandara@copper.opensource.lk/settings_local new file mode 100644 index 00000000..0bf23f3d --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ba/bandara@copper.opensource.lk/settings_local @@ -0,0 +1 @@ +{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@copper.opensource.lk/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@copper.opensource.lk/settings_local new file mode 100644 index 00000000..0bf23f3d --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@copper.opensource.lk/settings_local @@ -0,0 +1 @@ +{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@coppermail.dyndns.org/settings b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@coppermail.dyndns.org/settings new file mode 100644 index 00000000..59367b3c --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@coppermail.dyndns.org/settings @@ -0,0 +1 @@ +{"DesktopNotifications":false} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@coppermail.dyndns.org/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@coppermail.dyndns.org/settings_local new file mode 100644 index 00000000..4f255d84 --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@coppermail.dyndns.org/settings_local @@ -0,0 +1 @@ +{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Spam","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/s_/s_admin@coppermail.dyndns.org/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/s_/s_admin@coppermail.dyndns.org/settings_local new file mode 100644 index 00000000..0bf23f3d --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/s_/s_admin@coppermail.dyndns.org/settings_local @@ -0,0 +1 @@ +{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/su/supun@copper.opensource.lk/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/su/supun@copper.opensource.lk/settings_local new file mode 100644 index 00000000..0bf23f3d --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/su/supun@copper.opensource.lk/settings_local @@ -0,0 +1 @@ +{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/te/test@copper.opensource.lk/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/te/test@copper.opensource.lk/settings_local new file mode 100644 index 00000000..0bf23f3d --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/te/test@copper.opensource.lk/settings_local @@ -0,0 +1 @@ +{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/te/test@coppermail.dyndns.org/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/te/test@coppermail.dyndns.org/settings_local new file mode 100644 index 00000000..0bf23f3d --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/te/test@coppermail.dyndns.org/settings_local @@ -0,0 +1 @@ +{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/th/tharanga@copper.opensource.lk/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/th/tharanga@copper.opensource.lk/settings_local new file mode 100644 index 00000000..0bf23f3d --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/th/tharanga@copper.opensource.lk/settings_local @@ -0,0 +1 @@ +{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/data/__nobody__/ef/efaeb36a60ef9682802c6a704c2d784d b/copper-server/core/rainloop/app/data/_data_/_default_/storage/data/__nobody__/ef/efaeb36a60ef9682802c6a704c2d784d new file mode 100644 index 00000000..d71cd81b --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/storage/data/__nobody__/ef/efaeb36a60ef9682802c6a704c2d784d @@ -0,0 +1 @@ +1541995875,1541995875,1541995875 \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/files/ls/lsf@coppermail.dyndns.org/38/87/38871f9f7a2ad0d70b1e51991143db90bfbbb3c2 b/copper-server/core/rainloop/app/data/_data_/_default_/storage/files/ls/lsf@coppermail.dyndns.org/38/87/38871f9f7a2ad0d70b1e51991143db90bfbbb3c2 new file mode 100644 index 00000000..a2463df6 --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/storage/files/ls/lsf@coppermail.dyndns.org/38/87/38871f9f7a2ad0d70b1e51991143db90bfbbb3c2 @@ -0,0 +1 @@ +X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/files/ls/lsf@coppermail.dyndns.org/aa/6b/aa6bc308dedb13d95e120aafb590f4645301f8cd b/copper-server/core/rainloop/app/data/_data_/_default_/storage/files/ls/lsf@coppermail.dyndns.org/aa/6b/aa6bc308dedb13d95e120aafb590f4645301f8cd new file mode 100644 index 00000000..a2463df6 --- /dev/null +++ b/copper-server/core/rainloop/app/data/_data_/_default_/storage/files/ls/lsf@coppermail.dyndns.org/aa/6b/aa6bc308dedb13d95e120aafb590f4645301f8cd @@ -0,0 +1 @@ +X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/index.html b/copper-server/core/rainloop/app/data/index.html new file mode 100644 index 00000000..c466910c --- /dev/null +++ b/copper-server/core/rainloop/app/data/index.html @@ -0,0 +1 @@ +Forbidden \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/index.php b/copper-server/core/rainloop/app/data/index.php new file mode 100644 index 00000000..c466910c --- /dev/null +++ b/copper-server/core/rainloop/app/data/index.php @@ -0,0 +1 @@ +Forbidden \ No newline at end of file diff --git a/copper-server/core/rainloop/app/index.php b/copper-server/core/rainloop/app/index.php new file mode 100755 index 00000000..91bc1257 --- /dev/null +++ b/copper-server/core/rainloop/app/index.php @@ -0,0 +1,19 @@ +value = $accessToken; + if ($expiresAt) { + $this->setExpiresAtFromTimeStamp($expiresAt); + } + } + + /** + * Generate an app secret proof to sign a request to Graph. + * + * @param string $appSecret The app secret. + * + * @return string + */ + public function getAppSecretProof($appSecret) + { + return hash_hmac('sha256', $this->value, $appSecret); + } + + /** + * Getter for expiresAt. + * + * @return \DateTime|null + */ + public function getExpiresAt() + { + return $this->expiresAt; + } + + /** + * Determines whether or not this is an app access token. + * + * @return bool + */ + public function isAppAccessToken() + { + return strpos($this->value, '|') !== false; + } + + /** + * Determines whether or not this is a long-lived token. + * + * @return bool + */ + public function isLongLived() + { + if ($this->expiresAt) { + return $this->expiresAt->getTimestamp() > time() + (60 * 60 * 2); + } + + if ($this->isAppAccessToken()) { + return true; + } + + return false; + } + + /** + * Checks the expiration of the access token. + * + * @return boolean|null + */ + public function isExpired() + { + if ($this->getExpiresAt() instanceof \DateTime) { + return $this->getExpiresAt()->getTimestamp() < time(); + } + + if ($this->isAppAccessToken()) { + return false; + } + + return null; + } + + /** + * Returns the access token as a string. + * + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * Returns the access token as a string. + * + * @return string + */ + public function __toString() + { + return $this->getValue(); + } + + /** + * Setter for expires_at. + * + * @param int $timeStamp + */ + protected function setExpiresAtFromTimeStamp($timeStamp) + { + $dt = new \DateTime(); + $dt->setTimestamp($timeStamp); + $this->expiresAt = $dt; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Authentication/AccessTokenMetadata.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Authentication/AccessTokenMetadata.php new file mode 100755 index 00000000..f302a6d2 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Authentication/AccessTokenMetadata.php @@ -0,0 +1,390 @@ +metadata = $metadata['data']; + + $this->castTimestampsToDateTime(); + } + + /** + * Returns a value from the metadata. + * + * @param string $field The property to retrieve. + * @param mixed $default The default to return if the property doesn't exist. + * + * @return mixed + */ + public function getField($field, $default = null) + { + if (isset($this->metadata[$field])) { + return $this->metadata[$field]; + } + + return $default; + } + + /** + * Returns a value from the metadata. + * + * @param string $field The property to retrieve. + * @param mixed $default The default to return if the property doesn't exist. + * + * @return mixed + * + * @deprecated 5.0.0 getProperty() has been renamed to getField() + * @todo v6: Remove this method + */ + public function getProperty($field, $default = null) + { + return $this->getField($field, $default); + } + + /** + * Returns a value from a child property in the metadata. + * + * @param string $parentField The parent property. + * @param string $field The property to retrieve. + * @param mixed $default The default to return if the property doesn't exist. + * + * @return mixed + */ + public function getChildProperty($parentField, $field, $default = null) + { + if (!isset($this->metadata[$parentField])) { + return $default; + } + + if (!isset($this->metadata[$parentField][$field])) { + return $default; + } + + return $this->metadata[$parentField][$field]; + } + + /** + * Returns a value from the error metadata. + * + * @param string $field The property to retrieve. + * @param mixed $default The default to return if the property doesn't exist. + * + * @return mixed + */ + public function getErrorProperty($field, $default = null) + { + return $this->getChildProperty('error', $field, $default); + } + + /** + * Returns a value from the "metadata" metadata. *Brain explodes* + * + * @param string $field The property to retrieve. + * @param mixed $default The default to return if the property doesn't exist. + * + * @return mixed + */ + public function getMetadataProperty($field, $default = null) + { + return $this->getChildProperty('metadata', $field, $default); + } + + /** + * The ID of the application this access token is for. + * + * @return string|null + */ + public function getAppId() + { + return $this->getField('app_id'); + } + + /** + * Name of the application this access token is for. + * + * @return string|null + */ + public function getApplication() + { + return $this->getField('application'); + } + + /** + * Any error that a request to the graph api + * would return due to the access token. + * + * @return bool|null + */ + public function isError() + { + return $this->getField('error') !== null; + } + + /** + * The error code for the error. + * + * @return int|null + */ + public function getErrorCode() + { + return $this->getErrorProperty('code'); + } + + /** + * The error message for the error. + * + * @return string|null + */ + public function getErrorMessage() + { + return $this->getErrorProperty('message'); + } + + /** + * The error subcode for the error. + * + * @return int|null + */ + public function getErrorSubcode() + { + return $this->getErrorProperty('subcode'); + } + + /** + * DateTime when this access token expires. + * + * @return \DateTime|null + */ + public function getExpiresAt() + { + return $this->getField('expires_at'); + } + + /** + * Whether the access token is still valid or not. + * + * @return boolean|null + */ + public function getIsValid() + { + return $this->getField('is_valid'); + } + + /** + * DateTime when this access token was issued. + * + * Note that the issued_at field is not returned + * for short-lived access tokens. + * + * @see https://developers.facebook.com/docs/facebook-login/access-tokens#debug + * + * @return \DateTime|null + */ + public function getIssuedAt() + { + return $this->getField('issued_at'); + } + + /** + * General metadata associated with the access token. + * Can contain data like 'sso', 'auth_type', 'auth_nonce'. + * + * @return array|null + */ + public function getMetadata() + { + return $this->getField('metadata'); + } + + /** + * The 'sso' child property from the 'metadata' parent property. + * + * @return string|null + */ + public function getSso() + { + return $this->getMetadataProperty('sso'); + } + + /** + * The 'auth_type' child property from the 'metadata' parent property. + * + * @return string|null + */ + public function getAuthType() + { + return $this->getMetadataProperty('auth_type'); + } + + /** + * The 'auth_nonce' child property from the 'metadata' parent property. + * + * @return string|null + */ + public function getAuthNonce() + { + return $this->getMetadataProperty('auth_nonce'); + } + + /** + * For impersonated access tokens, the ID of + * the page this token contains. + * + * @return string|null + */ + public function getProfileId() + { + return $this->getField('profile_id'); + } + + /** + * List of permissions that the user has granted for + * the app in this access token. + * + * @return array + */ + public function getScopes() + { + return $this->getField('scopes'); + } + + /** + * The ID of the user this access token is for. + * + * @return string|null + */ + public function getUserId() + { + return $this->getField('user_id'); + } + + /** + * Ensures the app ID from the access token + * metadata is what we expect. + * + * @param string $appId + * + * @throws FacebookSDKException + */ + public function validateAppId($appId) + { + if ($this->getAppId() !== $appId) { + throw new FacebookSDKException('Access token metadata contains unexpected app ID.', 401); + } + } + + /** + * Ensures the user ID from the access token + * metadata is what we expect. + * + * @param string $userId + * + * @throws FacebookSDKException + */ + public function validateUserId($userId) + { + if ($this->getUserId() !== $userId) { + throw new FacebookSDKException('Access token metadata contains unexpected user ID.', 401); + } + } + + /** + * Ensures the access token has not expired yet. + * + * @throws FacebookSDKException + */ + public function validateExpiration() + { + if (!$this->getExpiresAt() instanceof \DateTime) { + return; + } + + if ($this->getExpiresAt()->getTimestamp() < time()) { + throw new FacebookSDKException('Inspection of access token metadata shows that the access token has expired.', 401); + } + } + + /** + * Converts a unix timestamp into a DateTime entity. + * + * @param int $timestamp + * + * @return \DateTime + */ + private function convertTimestampToDateTime($timestamp) + { + $dt = new \DateTime(); + $dt->setTimestamp($timestamp); + + return $dt; + } + + /** + * Casts the unix timestamps as DateTime entities. + */ + private function castTimestampsToDateTime() + { + foreach (static::$dateProperties as $key) { + if (isset($this->metadata[$key])) { + $this->metadata[$key] = $this->convertTimestampToDateTime($this->metadata[$key]); + } + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Authentication/OAuth2Client.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Authentication/OAuth2Client.php new file mode 100755 index 00000000..8e364ec8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Authentication/OAuth2Client.php @@ -0,0 +1,292 @@ +app = $app; + $this->client = $client; + $this->graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION; + } + + /** + * Returns the last FacebookRequest that was sent. + * Useful for debugging and testing. + * + * @return FacebookRequest|null + */ + public function getLastRequest() + { + return $this->lastRequest; + } + + /** + * Get the metadata associated with the access token. + * + * @param AccessToken|string $accessToken The access token to debug. + * + * @return AccessTokenMetadata + */ + public function debugToken($accessToken) + { + $accessToken = $accessToken instanceof AccessToken ? $accessToken->getValue() : $accessToken; + $params = ['input_token' => $accessToken]; + + $this->lastRequest = new FacebookRequest( + $this->app, + $this->app->getAccessToken(), + 'GET', + '/debug_token', + $params, + null, + $this->graphVersion + ); + $response = $this->client->sendRequest($this->lastRequest); + $metadata = $response->getDecodedBody(); + + return new AccessTokenMetadata($metadata); + } + + /** + * Generates an authorization URL to begin the process of authenticating a user. + * + * @param string $redirectUrl The callback URL to redirect to. + * @param array $scope An array of permissions to request. + * @param string $state The CSPRNG-generated CSRF value. + * @param array $params An array of parameters to generate URL. + * @param string $separator The separator to use in http_build_query(). + * + * @return string + */ + public function getAuthorizationUrl($redirectUrl, $state, array $scope = [], array $params = [], $separator = '&') + { + $params += [ + 'client_id' => $this->app->getId(), + 'state' => $state, + 'response_type' => 'code', + 'sdk' => 'php-sdk-' . Facebook::VERSION, + 'redirect_uri' => $redirectUrl, + 'scope' => implode(',', $scope) + ]; + + return static::BASE_AUTHORIZATION_URL . '/' . $this->graphVersion . '/dialog/oauth?' . http_build_query($params, null, $separator); + } + + /** + * Get a valid access token from a code. + * + * @param string $code + * @param string $redirectUri + * + * @return AccessToken + * + * @throws FacebookSDKException + */ + public function getAccessTokenFromCode($code, $redirectUri = '') + { + $params = [ + 'code' => $code, + 'redirect_uri' => $redirectUri, + ]; + + return $this->requestAnAccessToken($params); + } + + /** + * Exchanges a short-lived access token with a long-lived access token. + * + * @param AccessToken|string $accessToken + * + * @return AccessToken + * + * @throws FacebookSDKException + */ + public function getLongLivedAccessToken($accessToken) + { + $accessToken = $accessToken instanceof AccessToken ? $accessToken->getValue() : $accessToken; + $params = [ + 'grant_type' => 'fb_exchange_token', + 'fb_exchange_token' => $accessToken, + ]; + + return $this->requestAnAccessToken($params); + } + + /** + * Get a valid code from an access token. + * + * @param AccessToken|string $accessToken + * @param string $redirectUri + * + * @return AccessToken + * + * @throws FacebookSDKException + */ + public function getCodeFromLongLivedAccessToken($accessToken, $redirectUri = '') + { + $params = [ + 'redirect_uri' => $redirectUri, + ]; + + $response = $this->sendRequestWithClientParams('/oauth/client_code', $params, $accessToken); + $data = $response->getDecodedBody(); + + if (!isset($data['code'])) { + throw new FacebookSDKException('Code was not returned from Graph.', 401); + } + + return $data['code']; + } + + /** + * Send a request to the OAuth endpoint. + * + * @param array $params + * + * @return AccessToken + * + * @throws FacebookSDKException + */ + protected function requestAnAccessToken(array $params) + { + $response = $this->sendRequestWithClientParams('/oauth/access_token', $params); + $data = $response->getDecodedBody(); + + if (!isset($data['access_token'])) { + throw new FacebookSDKException('Access token was not returned from Graph.', 401); + } + + // Graph returns two different key names for expiration time + // on the same endpoint. Doh! :/ + $expiresAt = 0; + if (isset($data['expires'])) { + // For exchanging a short lived token with a long lived token. + // The expiration time in seconds will be returned as "expires". + $expiresAt = time() + $data['expires']; + } elseif (isset($data['expires_in'])) { + // For exchanging a code for a short lived access token. + // The expiration time in seconds will be returned as "expires_in". + // See: https://developers.facebook.com/docs/facebook-login/access-tokens#long-via-code + $expiresAt = time() + $data['expires_in']; + } + + return new AccessToken($data['access_token'], $expiresAt); + } + + /** + * Send a request to Graph with an app access token. + * + * @param string $endpoint + * @param array $params + * @param string|null $accessToken + * + * @return FacebookResponse + * + * @throws FacebookResponseException + */ + protected function sendRequestWithClientParams($endpoint, array $params, $accessToken = null) + { + $params += $this->getClientParams(); + + $accessToken = $accessToken ?: $this->app->getAccessToken(); + + $this->lastRequest = new FacebookRequest( + $this->app, + $accessToken, + 'GET', + $endpoint, + $params, + null, + $this->graphVersion + ); + + return $this->client->sendRequest($this->lastRequest); + } + + /** + * Returns the client_* params for OAuth requests. + * + * @return array + */ + protected function getClientParams() + { + return [ + 'client_id' => $this->app->getId(), + 'client_secret' => $this->app->getSecret(), + ]; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookAuthenticationException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookAuthenticationException.php new file mode 100755 index 00000000..449cf93e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookAuthenticationException.php @@ -0,0 +1,33 @@ +response = $response; + $this->responseData = $response->getDecodedBody(); + + $errorMessage = $this->get('message', 'Unknown error from Graph.'); + $errorCode = $this->get('code', -1); + + parent::__construct($errorMessage, $errorCode, $previousException); + } + + /** + * A factory for creating the appropriate exception based on the response from Graph. + * + * @param FacebookResponse $response The response that threw the exception. + * + * @return FacebookResponseException + */ + public static function create(FacebookResponse $response) + { + $data = $response->getDecodedBody(); + + if (!isset($data['error']['code']) && isset($data['code'])) { + $data = ['error' => $data]; + } + + $code = isset($data['error']['code']) ? $data['error']['code'] : null; + $message = isset($data['error']['message']) ? $data['error']['message'] : 'Unknown error from Graph.'; + + $previousException = null; + + if (isset($data['error']['error_subcode'])) { + switch ($data['error']['error_subcode']) { + // Other authentication issues + case 458: + case 459: + case 460: + case 463: + case 464: + case 467: + return new static($response, new FacebookAuthenticationException($message, $code)); + } + } + + switch ($code) { + // Login status or token expired, revoked, or invalid + case 100: + case 102: + case 190: + return new static($response, new FacebookAuthenticationException($message, $code)); + + // Server issue, possible downtime + case 1: + case 2: + return new static($response, new FacebookServerException($message, $code)); + + // API Throttling + case 4: + case 17: + case 341: + return new static($response, new FacebookThrottleException($message, $code)); + + // Duplicate Post + case 506: + return new static($response, new FacebookClientException($message, $code)); + } + + // Missing Permissions + if ($code == 10 || ($code >= 200 && $code <= 299)) { + return new static($response, new FacebookAuthorizationException($message, $code)); + } + + // OAuth authentication error + if (isset($data['error']['type']) && $data['error']['type'] === 'OAuthException') { + return new static($response, new FacebookAuthenticationException($message, $code)); + } + + // All others + return new static($response, new FacebookOtherException($message, $code)); + } + + /** + * Checks isset and returns that or a default value. + * + * @param string $key + * @param mixed $default + * + * @return mixed + */ + private function get($key, $default = null) + { + if (isset($this->responseData['error'][$key])) { + return $this->responseData['error'][$key]; + } + + return $default; + } + + /** + * Returns the HTTP status code + * + * @return int + */ + public function getHttpStatusCode() + { + return $this->response->getHttpStatusCode(); + } + + /** + * Returns the sub-error code + * + * @return int + */ + public function getSubErrorCode() + { + return $this->get('error_subcode', -1); + } + + /** + * Returns the error type + * + * @return string + */ + public function getErrorType() + { + return $this->get('type', ''); + } + + /** + * Returns the raw response used to create the exception. + * + * @return string + */ + public function getRawResponse() + { + return $this->response->getBody(); + } + + /** + * Returns the decoded response used to create the exception. + * + * @return array + */ + public function getResponseData() + { + return $this->responseData; + } + + /** + * Returns the response entity used to create the exception. + * + * @return FacebookResponse + */ + public function getResponse() + { + return $this->response; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookSDKException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookSDKException.php new file mode 100755 index 00000000..03219b0e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookSDKException.php @@ -0,0 +1,33 @@ +app = new FacebookApp($appId, $appSecret); + + $httpClientHandler = null; + if (isset($config['http_client_handler'])) { + if ($config['http_client_handler'] instanceof FacebookHttpClientInterface) { + $httpClientHandler = $config['http_client_handler']; + } elseif ($config['http_client_handler'] === 'curl') { + $httpClientHandler = new FacebookCurlHttpClient(); + } elseif ($config['http_client_handler'] === 'stream') { + $httpClientHandler = new FacebookStreamHttpClient(); + } elseif ($config['http_client_handler'] === 'guzzle') { + $httpClientHandler = new FacebookGuzzleHttpClient(); + } else { + throw new \InvalidArgumentException('The http_client_handler must be set to "curl", "stream", "guzzle", or be an instance of Facebook\HttpClients\FacebookHttpClientInterface'); + } + } + + $enableBeta = isset($config['enable_beta_mode']) && $config['enable_beta_mode'] === true; + $this->client = new FacebookClient($httpClientHandler, $enableBeta); + + if (isset($config['url_detection_handler'])) { + if ($config['url_detection_handler'] instanceof UrlDetectionInterface) { + $this->urlDetectionHandler = $config['url_detection_handler']; + } else { + throw new \InvalidArgumentException('The url_detection_handler must be an instance of Facebook\Url\UrlDetectionInterface'); + } + } + + if (isset($config['pseudo_random_string_generator'])) { + if ($config['pseudo_random_string_generator'] instanceof PseudoRandomStringGeneratorInterface) { + $this->pseudoRandomStringGenerator = $config['pseudo_random_string_generator']; + } elseif ($config['pseudo_random_string_generator'] === 'mcrypt') { + $this->pseudoRandomStringGenerator = new McryptPseudoRandomStringGenerator(); + } elseif ($config['pseudo_random_string_generator'] === 'openssl') { + $this->pseudoRandomStringGenerator = new OpenSslPseudoRandomStringGenerator(); + } elseif ($config['pseudo_random_string_generator'] === 'urandom') { + $this->pseudoRandomStringGenerator = new UrandomPseudoRandomStringGenerator(); + } else { + throw new \InvalidArgumentException('The pseudo_random_string_generator must be set to "mcrypt", "openssl", or "urandom", or be an instance of Facebook\PseudoRandomString\PseudoRandomStringGeneratorInterface'); + } + } + + if (isset($config['persistent_data_handler'])) { + if ($config['persistent_data_handler'] instanceof PersistentDataInterface) { + $this->persistentDataHandler = $config['persistent_data_handler']; + } elseif ($config['persistent_data_handler'] === 'session') { + $this->persistentDataHandler = new FacebookSessionPersistentDataHandler(); + } elseif ($config['persistent_data_handler'] === 'memory') { + $this->persistentDataHandler = new FacebookMemoryPersistentDataHandler(); + } else { + throw new \InvalidArgumentException('The persistent_data_handler must be set to "session", "memory", or be an instance of Facebook\PersistentData\PersistentDataInterface'); + } + } + + if (isset($config['default_access_token'])) { + $this->setDefaultAccessToken($config['default_access_token']); + } + + if (isset($config['default_graph_version'])) { + $this->defaultGraphVersion = $config['default_graph_version']; + } else { + // @todo v6: Throw an InvalidArgumentException if "default_graph_version" is not set + $this->defaultGraphVersion = static::DEFAULT_GRAPH_VERSION; + } + } + + /** + * Returns the FacebookApp entity. + * + * @return FacebookApp + */ + public function getApp() + { + return $this->app; + } + + /** + * Returns the FacebookClient service. + * + * @return FacebookClient + */ + public function getClient() + { + return $this->client; + } + + /** + * Returns the OAuth 2.0 client service. + * + * @return OAuth2Client + */ + public function getOAuth2Client() + { + if (!$this->oAuth2Client instanceof OAuth2Client) { + $app = $this->getApp(); + $client = $this->getClient(); + $this->oAuth2Client = new OAuth2Client($app, $client, $this->defaultGraphVersion); + } + + return $this->oAuth2Client; + } + + /** + * Returns the last response returned from Graph. + * + * @return FacebookResponse|FacebookBatchResponse|null + */ + public function getLastResponse() + { + return $this->lastResponse; + } + + /** + * Returns the URL detection handler. + * + * @return UrlDetectionInterface + */ + public function getUrlDetectionHandler() + { + if (!$this->urlDetectionHandler instanceof UrlDetectionInterface) { + $this->urlDetectionHandler = new FacebookUrlDetectionHandler(); + } + + return $this->urlDetectionHandler; + } + + /** + * Returns the default AccessToken entity. + * + * @return AccessToken|null + */ + public function getDefaultAccessToken() + { + return $this->defaultAccessToken; + } + + /** + * Sets the default access token to use with requests. + * + * @param AccessToken|string $accessToken The access token to save. + * + * @throws \InvalidArgumentException + */ + public function setDefaultAccessToken($accessToken) + { + if (is_string($accessToken)) { + $this->defaultAccessToken = new AccessToken($accessToken); + + return; + } + + if ($accessToken instanceof AccessToken) { + $this->defaultAccessToken = $accessToken; + + return; + } + + throw new \InvalidArgumentException('The default access token must be of type "string" or Facebook\AccessToken'); + } + + /** + * Returns the default Graph version. + * + * @return string + */ + public function getDefaultGraphVersion() + { + return $this->defaultGraphVersion; + } + + /** + * Returns the redirect login helper. + * + * @return FacebookRedirectLoginHelper + */ + public function getRedirectLoginHelper() + { + return new FacebookRedirectLoginHelper( + $this->getOAuth2Client(), + $this->persistentDataHandler, + $this->urlDetectionHandler, + $this->pseudoRandomStringGenerator + ); + } + + /** + * Returns the JavaScript helper. + * + * @return FacebookJavaScriptHelper + */ + public function getJavaScriptHelper() + { + return new FacebookJavaScriptHelper($this->app, $this->client, $this->defaultGraphVersion); + } + + /** + * Returns the canvas helper. + * + * @return FacebookCanvasHelper + */ + public function getCanvasHelper() + { + return new FacebookCanvasHelper($this->app, $this->client, $this->defaultGraphVersion); + } + + /** + * Returns the page tab helper. + * + * @return FacebookPageTabHelper + */ + public function getPageTabHelper() + { + return new FacebookPageTabHelper($this->app, $this->client, $this->defaultGraphVersion); + } + + /** + * Sends a GET request to Graph and returns the result. + * + * @param string $endpoint + * @param AccessToken|string|null $accessToken + * @param string|null $eTag + * @param string|null $graphVersion + * + * @return FacebookResponse + * + * @throws FacebookSDKException + */ + public function get($endpoint, $accessToken = null, $eTag = null, $graphVersion = null) + { + return $this->sendRequest( + 'GET', + $endpoint, + $params = [], + $accessToken, + $eTag, + $graphVersion + ); + } + + /** + * Sends a POST request to Graph and returns the result. + * + * @param string $endpoint + * @param array $params + * @param AccessToken|string|null $accessToken + * @param string|null $eTag + * @param string|null $graphVersion + * + * @return FacebookResponse + * + * @throws FacebookSDKException + */ + public function post($endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) + { + return $this->sendRequest( + 'POST', + $endpoint, + $params, + $accessToken, + $eTag, + $graphVersion + ); + } + + /** + * Sends a DELETE request to Graph and returns the result. + * + * @param string $endpoint + * @param array $params + * @param AccessToken|string|null $accessToken + * @param string|null $eTag + * @param string|null $graphVersion + * + * @return FacebookResponse + * + * @throws FacebookSDKException + */ + public function delete($endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) + { + return $this->sendRequest( + 'DELETE', + $endpoint, + $params, + $accessToken, + $eTag, + $graphVersion + ); + } + + /** + * Sends a request to Graph for the next page of results. + * + * @param GraphEdge $graphEdge The GraphEdge to paginate over. + * + * @return GraphEdge|null + * + * @throws FacebookSDKException + */ + public function next(GraphEdge $graphEdge) + { + return $this->getPaginationResults($graphEdge, 'next'); + } + + /** + * Sends a request to Graph for the previous page of results. + * + * @param GraphEdge $graphEdge The GraphEdge to paginate over. + * + * @return GraphEdge|null + * + * @throws FacebookSDKException + */ + public function previous(GraphEdge $graphEdge) + { + return $this->getPaginationResults($graphEdge, 'previous'); + } + + /** + * Sends a request to Graph for the next page of results. + * + * @param GraphEdge $graphEdge The GraphEdge to paginate over. + * @param string $direction The direction of the pagination: next|previous. + * + * @return GraphEdge|null + * + * @throws FacebookSDKException + */ + public function getPaginationResults(GraphEdge $graphEdge, $direction) + { + $paginationRequest = $graphEdge->getPaginationRequest($direction); + if (!$paginationRequest) { + return null; + } + + $this->lastResponse = $this->client->sendRequest($paginationRequest); + + // Keep the same GraphNode subclass + $subClassName = $graphEdge->getSubClassName(); + $graphEdge = $this->lastResponse->getGraphEdge($subClassName, false); + + return count($graphEdge) > 0 ? $graphEdge : null; + } + + /** + * Sends a request to Graph and returns the result. + * + * @param string $method + * @param string $endpoint + * @param array $params + * @param AccessToken|string|null $accessToken + * @param string|null $eTag + * @param string|null $graphVersion + * + * @return FacebookResponse + * + * @throws FacebookSDKException + */ + public function sendRequest($method, $endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) + { + $accessToken = $accessToken ?: $this->defaultAccessToken; + $graphVersion = $graphVersion ?: $this->defaultGraphVersion; + $request = $this->request($method, $endpoint, $params, $accessToken, $eTag, $graphVersion); + + return $this->lastResponse = $this->client->sendRequest($request); + } + + /** + * Sends a batched request to Graph and returns the result. + * + * @param array $requests + * @param AccessToken|string|null $accessToken + * @param string|null $graphVersion + * + * @return FacebookBatchResponse + * + * @throws FacebookSDKException + */ + public function sendBatchRequest(array $requests, $accessToken = null, $graphVersion = null) + { + $accessToken = $accessToken ?: $this->defaultAccessToken; + $graphVersion = $graphVersion ?: $this->defaultGraphVersion; + $batchRequest = new FacebookBatchRequest( + $this->app, + $requests, + $accessToken, + $graphVersion + ); + + return $this->lastResponse = $this->client->sendBatchRequest($batchRequest); + } + + /** + * Instantiates a new FacebookRequest entity. + * + * @param string $method + * @param string $endpoint + * @param array $params + * @param AccessToken|string|null $accessToken + * @param string|null $eTag + * @param string|null $graphVersion + * + * @return FacebookRequest + * + * @throws FacebookSDKException + */ + public function request($method, $endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) + { + $accessToken = $accessToken ?: $this->defaultAccessToken; + $graphVersion = $graphVersion ?: $this->defaultGraphVersion; + + return new FacebookRequest( + $this->app, + $accessToken, + $method, + $endpoint, + $params, + $eTag, + $graphVersion + ); + } + + /** + * Factory to create FacebookFile's. + * + * @param string $pathToFile + * + * @return FacebookFile + * + * @throws FacebookSDKException + */ + public function fileToUpload($pathToFile) + { + return new FacebookFile($pathToFile); + } + + /** + * Factory to create FacebookVideo's. + * + * @param string $pathToFile + * + * @return FacebookVideo + * + * @throws FacebookSDKException + */ + public function videoToUpload($pathToFile) + { + return new FacebookVideo($pathToFile); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookApp.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookApp.php new file mode 100755 index 00000000..84956ce9 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookApp.php @@ -0,0 +1,101 @@ +id = $id; + $this->secret = $secret; + } + + /** + * Returns the app ID. + * + * @return string + */ + public function getId() + { + return $this->id; + } + + /** + * Returns the app secret. + * + * @return string + */ + public function getSecret() + { + return $this->secret; + } + + /** + * Returns an app access token. + * + * @return AccessToken + */ + public function getAccessToken() + { + return new AccessToken($this->id . '|' . $this->secret); + } + + /** + * Serializes the FacebookApp entity as a string. + * + * @return string + */ + public function serialize() + { + return serialize([$this->id, $this->secret]); + } + + /** + * Unserializes a string as a FacebookApp entity. + * + * @param string $serialized + */ + public function unserialize($serialized) + { + list($id, $secret) = unserialize($serialized); + + $this->__construct($id, $secret); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookBatchRequest.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookBatchRequest.php new file mode 100755 index 00000000..33c489cf --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookBatchRequest.php @@ -0,0 +1,303 @@ +add($requests); + } + + /** + * A a new request to the array. + * + * @param FacebookRequest|array $request + * @param string|null $name + * + * @return FacebookBatchRequest + * + * @throws \InvalidArgumentException + */ + public function add($request, $name = null) + { + if (is_array($request)) { + foreach ($request as $key => $req) { + $this->add($req, $key); + } + + return $this; + } + + if (!$request instanceof FacebookRequest) { + throw new \InvalidArgumentException('Argument for add() must be of type array or FacebookRequest.'); + } + + $this->addFallbackDefaults($request); + $requestToAdd = [ + 'name' => $name, + 'request' => $request, + ]; + + // File uploads + $attachedFiles = $this->extractFileAttachments($request); + if ($attachedFiles) { + $requestToAdd['attached_files'] = $attachedFiles; + } + $this->requests[] = $requestToAdd; + + return $this; + } + + /** + * Ensures that the FacebookApp and access token fall back when missing. + * + * @param FacebookRequest $request + * + * @throws FacebookSDKException + */ + public function addFallbackDefaults(FacebookRequest $request) + { + if (!$request->getApp()) { + $app = $this->getApp(); + if (!$app) { + throw new FacebookSDKException('Missing FacebookApp on FacebookRequest and no fallback detected on FacebookBatchRequest.'); + } + $request->setApp($app); + } + + if (!$request->getAccessToken()) { + $accessToken = $this->getAccessToken(); + if (!$accessToken) { + throw new FacebookSDKException('Missing access token on FacebookRequest and no fallback detected on FacebookBatchRequest.'); + } + $request->setAccessToken($accessToken); + } + } + + /** + * Extracts the files from a request. + * + * @param FacebookRequest $request + * + * @return string|null + * + * @throws FacebookSDKException + */ + public function extractFileAttachments(FacebookRequest $request) + { + if (!$request->containsFileUploads()) { + return null; + } + + $files = $request->getFiles(); + $fileNames = []; + foreach ($files as $file) { + $fileName = uniqid(); + $this->addFile($fileName, $file); + $fileNames[] = $fileName; + } + + $request->resetFiles(); + + // @TODO Does Graph support multiple uploads on one endpoint? + return implode(',', $fileNames); + } + + /** + * Return the FacebookRequest entities. + * + * @return array + */ + public function getRequests() + { + return $this->requests; + } + + /** + * Prepares the requests to be sent as a batch request. + * + * @return string + */ + public function prepareRequestsForBatch() + { + $this->validateBatchRequestCount(); + + $params = [ + 'batch' => $this->convertRequestsToJson(), + 'include_headers' => true, + ]; + $this->setParams($params); + } + + /** + * Converts the requests into a JSON(P) string. + * + * @return string + */ + public function convertRequestsToJson() + { + $requests = []; + foreach ($this->requests as $request) { + $attachedFiles = isset($request['attached_files']) ? $request['attached_files'] : null; + $requests[] = $this->requestEntityToBatchArray($request['request'], $request['name'], $attachedFiles); + } + + return json_encode($requests); + } + + /** + * Validate the request count before sending them as a batch. + * + * @throws FacebookSDKException + */ + public function validateBatchRequestCount() + { + $batchCount = count($this->requests); + if ($batchCount === 0) { + throw new FacebookSDKException('There are no batch requests to send.'); + } elseif ($batchCount > 50) { + // Per: https://developers.facebook.com/docs/graph-api/making-multiple-requests#limits + throw new FacebookSDKException('You cannot send more than 50 batch requests at a time.'); + } + } + + /** + * Converts a Request entity into an array that is batch-friendly. + * + * @param FacebookRequest $request The request entity to convert. + * @param string|null $requestName The name of the request. + * @param string|null $attachedFiles Names of files associated with the request. + * + * @return array + */ + public function requestEntityToBatchArray(FacebookRequest $request, $requestName = null, $attachedFiles = null) + { + $compiledHeaders = []; + $headers = $request->getHeaders(); + foreach ($headers as $name => $value) { + $compiledHeaders[] = $name . ': ' . $value; + } + + $batch = [ + 'headers' => $compiledHeaders, + 'method' => $request->getMethod(), + 'relative_url' => $request->getUrl(), + ]; + + // Since file uploads are moved to the root request of a batch request, + // the child requests will always be URL-encoded. + $body = $request->getUrlEncodedBody()->getBody(); + if ($body) { + $batch['body'] = $body; + } + + if (isset($requestName)) { + $batch['name'] = $requestName; + } + + if (isset($attachedFiles)) { + $batch['attached_files'] = $attachedFiles; + } + + // @TODO Add support for "omit_response_on_success" + // @TODO Add support for "depends_on" + // @TODO Add support for JSONP with "callback" + + return $batch; + } + + /** + * Get an iterator for the items. + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->requests); + } + + /** + * @inheritdoc + */ + public function offsetSet($offset, $value) + { + $this->add($value, $offset); + } + + /** + * @inheritdoc + */ + public function offsetExists($offset) + { + return isset($this->requests[$offset]); + } + + /** + * @inheritdoc + */ + public function offsetUnset($offset) + { + unset($this->requests[$offset]); + } + + /** + * @inheritdoc + */ + public function offsetGet($offset) + { + return isset($this->requests[$offset]) ? $this->requests[$offset] : null; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookBatchResponse.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookBatchResponse.php new file mode 100755 index 00000000..5ea765e3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookBatchResponse.php @@ -0,0 +1,154 @@ +batchRequest = $batchRequest; + + $request = $response->getRequest(); + $body = $response->getBody(); + $httpStatusCode = $response->getHttpStatusCode(); + $headers = $response->getHeaders(); + parent::__construct($request, $body, $httpStatusCode, $headers); + + $responses = $response->getDecodedBody(); + $this->setResponses($responses); + } + + /** + * Returns an array of FacebookResponse entities. + * + * @return array + */ + public function getResponses() + { + return $this->responses; + } + + /** + * The main batch response will be an array of requests so + * we need to iterate over all the responses. + * + * @param array $responses + */ + public function setResponses(array $responses) + { + $this->responses = []; + + foreach ($responses as $key => $graphResponse) { + $this->addResponse($key, $graphResponse); + } + } + + /** + * Add a response to the list. + * + * @param int $key + * @param array|null $response + */ + public function addResponse($key, $response) + { + $originalRequestName = isset($this->batchRequest[$key]['name']) ? $this->batchRequest[$key]['name'] : $key; + $originalRequest = isset($this->batchRequest[$key]['request']) ? $this->batchRequest[$key]['request'] : null; + + $httpResponseBody = isset($response['body']) ? $response['body'] : null; + $httpResponseCode = isset($response['code']) ? $response['code'] : null; + $httpResponseHeaders = isset($response['headers']) ? $response['headers'] : []; + + $this->responses[$originalRequestName] = new FacebookResponse( + $originalRequest, + $httpResponseBody, + $httpResponseCode, + $httpResponseHeaders + ); + } + + /** + * @inheritdoc + */ + public function getIterator() + { + return new ArrayIterator($this->responses); + } + + /** + * @inheritdoc + */ + public function offsetSet($offset, $value) + { + $this->addResponse($offset, $value); + } + + /** + * @inheritdoc + */ + public function offsetExists($offset) + { + return isset($this->responses[$offset]); + } + + /** + * @inheritdoc + */ + public function offsetUnset($offset) + { + unset($this->responses[$offset]); + } + + /** + * @inheritdoc + */ + public function offsetGet($offset) + { + return isset($this->responses[$offset]) ? $this->responses[$offset] : null; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookClient.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookClient.php new file mode 100755 index 00000000..b10762f1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookClient.php @@ -0,0 +1,250 @@ +httpClientHandler = $httpClientHandler ?: $this->detectHttpClientHandler(); + $this->enableBetaMode = $enableBeta; + } + + /** + * Sets the HTTP client handler. + * + * @param FacebookHttpClientInterface $httpClientHandler + */ + public function setHttpClientHandler(FacebookHttpClientInterface $httpClientHandler) + { + $this->httpClientHandler = $httpClientHandler; + } + + /** + * Returns the HTTP client handler. + * + * @return FacebookHttpClientInterface + */ + public function getHttpClientHandler() + { + return $this->httpClientHandler; + } + + /** + * Detects which HTTP client handler to use. + * + * @return FacebookHttpClientInterface + */ + public function detectHttpClientHandler() + { + return function_exists('curl_init') ? new FacebookCurlHttpClient() : new FacebookStreamHttpClient(); + } + + /** + * Toggle beta mode. + * + * @param boolean $betaMode + */ + public function enableBetaMode($betaMode = true) + { + $this->enableBetaMode = $betaMode; + } + + /** + * Returns the base Graph URL. + * + * @param boolean $postToVideoUrl Post to the video API if videos are being uploaded. + * + * @return string + */ + public function getBaseGraphUrl($postToVideoUrl = false) + { + if ($postToVideoUrl) { + return $this->enableBetaMode ? static::BASE_GRAPH_VIDEO_URL_BETA : static::BASE_GRAPH_VIDEO_URL; + } + + return $this->enableBetaMode ? static::BASE_GRAPH_URL_BETA : static::BASE_GRAPH_URL; + } + + /** + * Prepares the request for sending to the client handler. + * + * @param FacebookRequest $request + * + * @return array + */ + public function prepareRequestMessage(FacebookRequest $request) + { + $postToVideoUrl = $request->containsVideoUploads(); + $url = $this->getBaseGraphUrl($postToVideoUrl) . $request->getUrl(); + + // If we're sending files they should be sent as multipart/form-data + if ($request->containsFileUploads()) { + $requestBody = $request->getMultipartBody(); + $request->setHeaders([ + 'Content-Type' => 'multipart/form-data; boundary=' . $requestBody->getBoundary(), + ]); + } else { + $requestBody = $request->getUrlEncodedBody(); + $request->setHeaders([ + 'Content-Type' => 'application/x-www-form-urlencoded', + ]); + } + + return [ + $url, + $request->getMethod(), + $request->getHeaders(), + $requestBody->getBody(), + ]; + } + + /** + * Makes the request to Graph and returns the result. + * + * @param FacebookRequest $request + * + * @return FacebookResponse + * + * @throws FacebookSDKException + */ + public function sendRequest(FacebookRequest $request) + { + if (get_class($request) === 'FacebookRequest') { + $request->validateAccessToken(); + } + + list($url, $method, $headers, $body) = $this->prepareRequestMessage($request); + + // Since file uploads can take a while, we need to give more time for uploads + $timeOut = static::DEFAULT_REQUEST_TIMEOUT; + if ($request->containsFileUploads()) { + $timeOut = static::DEFAULT_FILE_UPLOAD_REQUEST_TIMEOUT; + } elseif ($request->containsVideoUploads()) { + $timeOut = static::DEFAULT_VIDEO_UPLOAD_REQUEST_TIMEOUT; + } + + // Should throw `FacebookSDKException` exception on HTTP client error. + // Don't catch to allow it to bubble up. + $rawResponse = $this->httpClientHandler->send($url, $method, $body, $headers, $timeOut); + + static::$requestCount++; + + $returnResponse = new FacebookResponse( + $request, + $rawResponse->getBody(), + $rawResponse->getHttpResponseCode(), + $rawResponse->getHeaders() + ); + + if ($returnResponse->isError()) { + throw $returnResponse->getThrownException(); + } + + return $returnResponse; + } + + /** + * Makes a batched request to Graph and returns the result. + * + * @param FacebookBatchRequest $request + * + * @return FacebookBatchResponse + * + * @throws FacebookSDKException + */ + public function sendBatchRequest(FacebookBatchRequest $request) + { + $request->prepareRequestsForBatch(); + $facebookResponse = $this->sendRequest($request); + + return new FacebookBatchResponse($request, $facebookResponse); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookRequest.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookRequest.php new file mode 100755 index 00000000..5e4083f8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookRequest.php @@ -0,0 +1,536 @@ +setApp($app); + $this->setAccessToken($accessToken); + $this->setMethod($method); + $this->setEndpoint($endpoint); + $this->setParams($params); + $this->setETag($eTag); + $this->graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION; + } + + /** + * Set the access token for this request. + * + * @param AccessToken|string + * + * @return FacebookRequest + */ + public function setAccessToken($accessToken) + { + $this->accessToken = $accessToken; + if ($accessToken instanceof AccessToken) { + $this->accessToken = $accessToken->getValue(); + } + + return $this; + } + + /** + * Sets the access token with one harvested from a URL or POST params. + * + * @param string $accessToken The access token. + * + * @return FacebookRequest + * + * @throws FacebookSDKException + */ + public function setAccessTokenFromParams($accessToken) + { + $existingAccessToken = $this->getAccessToken(); + if (!$existingAccessToken) { + $this->setAccessToken($accessToken); + } elseif ($accessToken !== $existingAccessToken) { + throw new FacebookSDKException('Access token mismatch. The access token provided in the FacebookRequest and the one provided in the URL or POST params do not match.'); + } + + return $this; + } + + /** + * Return the access token for this request. + * + * @return string|null + */ + public function getAccessToken() + { + return $this->accessToken; + } + + /** + * Return the access token for this request an an AccessToken entity. + * + * @return AccessToken|null + */ + public function getAccessTokenEntity() + { + return $this->accessToken ? new AccessToken($this->accessToken) : null; + } + + /** + * Set the FacebookApp entity used for this request. + * + * @param FacebookApp|null $app + */ + public function setApp(FacebookApp $app = null) + { + $this->app = $app; + } + + /** + * Return the FacebookApp entity used for this request. + * + * @return FacebookApp + */ + public function getApp() + { + return $this->app; + } + + /** + * Generate an app secret proof to sign this request. + * + * @return string|null + */ + public function getAppSecretProof() + { + if (!$accessTokenEntity = $this->getAccessTokenEntity()) { + return null; + } + + return $accessTokenEntity->getAppSecretProof($this->app->getSecret()); + } + + /** + * Validate that an access token exists for this request. + * + * @throws FacebookSDKException + */ + public function validateAccessToken() + { + $accessToken = $this->getAccessToken(); + if (!$accessToken) { + throw new FacebookSDKException('You must provide an access token.'); + } + } + + /** + * Set the HTTP method for this request. + * + * @param string + * + * @return FacebookRequest + */ + public function setMethod($method) + { + $this->method = strtoupper($method); + } + + /** + * Return the HTTP method for this request. + * + * @return string + */ + public function getMethod() + { + return $this->method; + } + + /** + * Validate that the HTTP method is set. + * + * @throws FacebookSDKException + */ + public function validateMethod() + { + if (!$this->method) { + throw new FacebookSDKException('HTTP method not specified.'); + } + + if (!in_array($this->method, ['GET', 'POST', 'DELETE'])) { + throw new FacebookSDKException('Invalid HTTP method specified.'); + } + } + + /** + * Set the endpoint for this request. + * + * @param string + * + * @return FacebookRequest + * + * @throws FacebookSDKException + */ + public function setEndpoint($endpoint) + { + // Harvest the access token from the endpoint to keep things in sync + $params = FacebookUrlManipulator::getParamsAsArray($endpoint); + if (isset($params['access_token'])) { + $this->setAccessTokenFromParams($params['access_token']); + } + + // Clean the token & app secret proof from the endpoint. + $filterParams = ['access_token', 'appsecret_proof']; + $this->endpoint = FacebookUrlManipulator::removeParamsFromUrl($endpoint, $filterParams); + + return $this; + } + + /** + * Return the HTTP method for this request. + * + * @return string + */ + public function getEndpoint() + { + // For batch requests, this will be empty + return $this->endpoint; + } + + /** + * Generate and return the headers for this request. + * + * @return array + */ + public function getHeaders() + { + $headers = static::getDefaultHeaders(); + + if ($this->eTag) { + $headers['If-None-Match'] = $this->eTag; + } + + return array_merge($this->headers, $headers); + } + + /** + * Set the headers for this request. + * + * @param array $headers + */ + public function setHeaders(array $headers) + { + $this->headers = array_merge($this->headers, $headers); + } + + /** + * Sets the eTag value. + * + * @param string $eTag + */ + public function setETag($eTag) + { + $this->eTag = $eTag; + } + + /** + * Set the params for this request. + * + * @param array $params + * + * @return FacebookRequest + * + * @throws FacebookSDKException + */ + public function setParams(array $params = []) + { + if (isset($params['access_token'])) { + $this->setAccessTokenFromParams($params['access_token']); + } + + // Don't let these buggers slip in. + unset($params['access_token'], $params['appsecret_proof']); + + // @TODO Refactor code above with this + //$params = $this->sanitizeAuthenticationParams($params); + $params = $this->sanitizeFileParams($params); + $this->dangerouslySetParams($params); + + return $this; + } + + /** + * Set the params for this request without filtering them first. + * + * @param array $params + * + * @return FacebookRequest + */ + public function dangerouslySetParams(array $params = []) + { + $this->params = array_merge($this->params, $params); + + return $this; + } + + /** + * Iterate over the params and pull out the file uploads. + * + * @param array $params + * + * @return array + */ + public function sanitizeFileParams(array $params) + { + foreach ($params as $key => $value) { + if ($value instanceof FacebookFile) { + $this->addFile($key, $value); + unset($params[$key]); + } + } + + return $params; + } + + /** + * Add a file to be uploaded. + * + * @param string $key + * @param FacebookFile $file + */ + public function addFile($key, FacebookFile $file) + { + $this->files[$key] = $file; + } + + /** + * Removes all the files from the upload queue. + */ + public function resetFiles() + { + $this->files = []; + } + + /** + * Get the list of files to be uploaded. + * + * @return array + */ + public function getFiles() + { + return $this->files; + } + + /** + * Let's us know if there is a file upload with this request. + * + * @return boolean + */ + public function containsFileUploads() + { + return !empty($this->files); + } + + /** + * Let's us know if there is a video upload with this request. + * + * @return boolean + */ + public function containsVideoUploads() + { + foreach ($this->files as $file) { + if ($file instanceof FacebookVideo) { + return true; + } + } + + return false; + } + + /** + * Returns the body of the request as multipart/form-data. + * + * @return RequestBodyMultipart + */ + public function getMultipartBody() + { + $params = $this->getPostParams(); + + return new RequestBodyMultipart($params, $this->files); + } + + /** + * Returns the body of the request as URL-encoded. + * + * @return RequestBodyUrlEncoded + */ + public function getUrlEncodedBody() + { + $params = $this->getPostParams(); + + return new RequestBodyUrlEncoded($params); + } + + /** + * Generate and return the params for this request. + * + * @return array + */ + public function getParams() + { + $params = $this->params; + + $accessToken = $this->getAccessToken(); + if ($accessToken) { + $params['access_token'] = $accessToken; + $params['appsecret_proof'] = $this->getAppSecretProof(); + } + + return $params; + } + + /** + * Only return params on POST requests. + * + * @return array + */ + public function getPostParams() + { + if ($this->getMethod() === 'POST') { + return $this->getParams(); + } + + return []; + } + + /** + * The graph version used for this request. + * + * @return string + */ + public function getGraphVersion() + { + return $this->graphVersion; + } + + /** + * Generate and return the URL for this request. + * + * @return string + */ + public function getUrl() + { + $this->validateMethod(); + + $graphVersion = FacebookUrlManipulator::forceSlashPrefix($this->graphVersion); + $endpoint = FacebookUrlManipulator::forceSlashPrefix($this->getEndpoint()); + + $url = $graphVersion . $endpoint; + + if ($this->getMethod() !== 'POST') { + $params = $this->getParams(); + $url = FacebookUrlManipulator::appendParamsToUrl($url, $params); + } + + return $url; + } + + /** + * Return the default headers that every request should use. + * + * @return array + */ + public static function getDefaultHeaders() + { + return [ + 'User-Agent' => 'fb-php-' . Facebook::VERSION, + 'Accept-Encoding' => '*', + ]; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookResponse.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookResponse.php new file mode 100755 index 00000000..ce55b143 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookResponse.php @@ -0,0 +1,410 @@ +request = $request; + $this->body = $body; + $this->httpStatusCode = $httpStatusCode; + $this->headers = $headers; + + $this->decodeBody(); + } + + /** + * Return the original request that returned this response. + * + * @return FacebookRequest + */ + public function getRequest() + { + return $this->request; + } + + /** + * Return the FacebookApp entity used for this response. + * + * @return FacebookApp + */ + public function getApp() + { + return $this->request->getApp(); + } + + /** + * Return the access token that was used for this response. + * + * @return string|null + */ + public function getAccessToken() + { + return $this->request->getAccessToken(); + } + + /** + * Return the HTTP status code for this response. + * + * @return int + */ + public function getHttpStatusCode() + { + return $this->httpStatusCode; + } + + /** + * Return the HTTP headers for this response. + * + * @return array + */ + public function getHeaders() + { + return $this->headers; + } + + /** + * Return the raw body response. + * + * @return string + */ + public function getBody() + { + return $this->body; + } + + /** + * Return the decoded body response. + * + * @return array + */ + public function getDecodedBody() + { + return $this->decodedBody; + } + + /** + * Get the app secret proof that was used for this response. + * + * @return string|null + */ + public function getAppSecretProof() + { + return $this->request->getAppSecretProof(); + } + + /** + * Get the ETag associated with the response. + * + * @return string|null + */ + public function getETag() + { + return isset($this->headers['ETag']) ? $this->headers['ETag'] : null; + } + + /** + * Get the version of Graph that returned this response. + * + * @return string|null + */ + public function getGraphVersion() + { + return isset($this->headers['Facebook-API-Version']) ? $this->headers['Facebook-API-Version'] : null; + } + + /** + * Returns true if Graph returned an error message. + * + * @return boolean + */ + public function isError() + { + return isset($this->decodedBody['error']); + } + + /** + * Throws the exception. + * + * @throws FacebookSDKException + */ + public function throwException() + { + throw $this->thrownException; + } + + /** + * Instantiates an exception to be thrown later. + */ + public function makeException() + { + $this->thrownException = FacebookResponseException::create($this); + } + + /** + * Returns the exception that was thrown for this request. + * + * @return FacebookSDKException|null + */ + public function getThrownException() + { + return $this->thrownException; + } + + /** + * Convert the raw response into an array if possible. + * + * Graph will return 2 types of responses: + * - JSON(P) + * Most responses from Grpah are JSON(P) + * - application/x-www-form-urlencoded key/value pairs + * Happens on the `/oauth/access_token` endpoint when exchanging + * a short-lived access token for a long-lived access token + * - And sometimes nothing :/ but that'd be a bug. + */ + public function decodeBody() + { + $this->decodedBody = json_decode($this->body, true); + + if ($this->decodedBody === null) { + $this->decodedBody = []; + parse_str($this->body, $this->decodedBody); + } elseif (is_bool($this->decodedBody)) { + // Backwards compatibility for Graph < 2.1. + // Mimics 2.1 responses. + // @TODO Remove this after Graph 2.0 is no longer supported + $this->decodedBody = ['success' => $this->decodedBody]; + } elseif (is_numeric($this->decodedBody)) { + $this->decodedBody = ['id' => $this->decodedBody]; + } + + if (!is_array($this->decodedBody)) { + $this->decodedBody = []; + } + + if ($this->isError()) { + $this->makeException(); + } + } + + /** + * Instantiate a new GraphObject from response. + * + * @param string|null $subclassName The GraphNode sub class to cast to. + * + * @return \Facebook\GraphNodes\GraphObject + * + * @throws FacebookSDKException + * + * @deprecated 5.0.0 getGraphObject() has been renamed to getGraphNode() + * @todo v6: Remove this method + */ + public function getGraphObject($subclassName = null) + { + return $this->getGraphNode($subclassName); + } + + /** + * Instantiate a new GraphNode from response. + * + * @param string|null $subclassName The GraphNode sub class to cast to. + * + * @return \Facebook\GraphNodes\GraphNode + * + * @throws FacebookSDKException + */ + public function getGraphNode($subclassName = null) + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphNode($subclassName); + } + + /** + * Convenience method for creating a GraphAlbum collection. + * + * @return \Facebook\GraphNodes\GraphAlbum + * + * @throws FacebookSDKException + */ + public function getGraphAlbum() + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphAlbum(); + } + + /** + * Convenience method for creating a GraphPage collection. + * + * @return \Facebook\GraphNodes\GraphPage + * + * @throws FacebookSDKException + */ + public function getGraphPage() + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphPage(); + } + + /** + * Convenience method for creating a GraphSessionInfo collection. + * + * @return \Facebook\GraphNodes\GraphSessionInfo + * + * @throws FacebookSDKException + */ + public function getGraphSessionInfo() + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphSessionInfo(); + } + + /** + * Convenience method for creating a GraphUser collection. + * + * @return \Facebook\GraphNodes\GraphUser + * + * @throws FacebookSDKException + */ + public function getGraphUser() + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphUser(); + } + + /** + * Convenience method for creating a GraphEvent collection. + * + * @return \Facebook\GraphNodes\GraphEvent + * + * @throws FacebookSDKException + */ + public function getGraphEvent() + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphEvent(); + } + + /** + * Convenience method for creating a GraphGroup collection. + * + * @return \Facebook\GraphNodes\GraphGroup + * + * @throws FacebookSDKException + */ + public function getGraphGroup() + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphGroup(); + } + + /** + * Instantiate a new GraphList from response. + * + * @param string|null $subclassName The GraphNode sub class to cast list items to. + * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. + * + * @return \Facebook\GraphNodes\GraphList + * + * @throws FacebookSDKException + * + * @deprecated 5.0.0 getGraphList() has been renamed to getGraphEdge() + * @todo v6: Remove this method + */ + public function getGraphList($subclassName = null, $auto_prefix = true) + { + return $this->getGraphEdge($subclassName, $auto_prefix); + } + + /** + * Instantiate a new GraphEdge from response. + * + * @param string|null $subclassName The GraphNode sub class to cast list items to. + * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. + * + * @return \Facebook\GraphNodes\GraphEdge + * + * @throws FacebookSDKException + */ + public function getGraphEdge($subclassName = null, $auto_prefix = true) + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphEdge($subclassName, $auto_prefix); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FileUpload/FacebookFile.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FileUpload/FacebookFile.php new file mode 100755 index 00000000..f8b99054 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FileUpload/FacebookFile.php @@ -0,0 +1,135 @@ +path = $filePath; + $this->open(); + } + + /** + * Closes the stream when destructed. + */ + public function __destruct() + { + $this->close(); + } + + /** + * Opens a stream for the file. + * + * @throws FacebookSDKException + */ + public function open() + { + if (!$this->isRemoteFile($this->path) && !is_readable($this->path)) { + throw new FacebookSDKException('Failed to create FacebookFile entity. Unable to read resource: ' . $this->path . '.'); + } + + $this->stream = fopen($this->path, 'r'); + + if (!$this->stream) { + throw new FacebookSDKException('Failed to create FacebookFile entity. Unable to open resource: ' . $this->path . '.'); + } + } + + /** + * Stops the file stream. + */ + public function close() + { + if (is_resource($this->stream)) { + fclose($this->stream); + } + } + + /** + * Return the contents of the file. + * + * @return string + */ + public function getContents() + { + return stream_get_contents($this->stream); + } + + /** + * Return the name of the file. + * + * @return string + */ + public function getFileName() + { + return basename($this->path); + } + + /** + * Return the mimetype of the file. + * + * @return string + */ + public function getMimetype() + { + return Mimetypes::getInstance()->fromFilename($this->path) ?: 'text/plain'; + } + + /** + * Returns true if the path to the file is remote. + * + * @param string $pathToFile + * + * @return boolean + */ + protected function isRemoteFile($pathToFile) + { + return preg_match('/^(https?|ftp):\/\/.*/', $pathToFile) === 1; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FileUpload/FacebookVideo.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FileUpload/FacebookVideo.php new file mode 100755 index 00000000..1e8c55aa --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FileUpload/FacebookVideo.php @@ -0,0 +1,33 @@ + 'text/vnd.in3d.3dml', + '3g2' => 'video/3gpp2', + '3gp' => 'video/3gpp', + '7z' => 'application/x-7z-compressed', + 'aab' => 'application/x-authorware-bin', + 'aac' => 'audio/x-aac', + 'aam' => 'application/x-authorware-map', + 'aas' => 'application/x-authorware-seg', + 'abw' => 'application/x-abiword', + 'ac' => 'application/pkix-attr-cert', + 'acc' => 'application/vnd.americandynamics.acc', + 'ace' => 'application/x-ace-compressed', + 'acu' => 'application/vnd.acucobol', + 'acutc' => 'application/vnd.acucorp', + 'adp' => 'audio/adpcm', + 'aep' => 'application/vnd.audiograph', + 'afm' => 'application/x-font-type1', + 'afp' => 'application/vnd.ibm.modcap', + 'ahead' => 'application/vnd.ahead.space', + 'ai' => 'application/postscript', + 'aif' => 'audio/x-aiff', + 'aifc' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'air' => 'application/vnd.adobe.air-application-installer-package+zip', + 'ait' => 'application/vnd.dvb.ait', + 'ami' => 'application/vnd.amiga.ami', + 'apk' => 'application/vnd.android.package-archive', + 'application' => 'application/x-ms-application', + 'apr' => 'application/vnd.lotus-approach', + 'asa' => 'text/plain', + 'asax' => 'application/octet-stream', + 'asc' => 'application/pgp-signature', + 'ascx' => 'text/plain', + 'asf' => 'video/x-ms-asf', + 'ashx' => 'text/plain', + 'asm' => 'text/x-asm', + 'asmx' => 'text/plain', + 'aso' => 'application/vnd.accpac.simply.aso', + 'asp' => 'text/plain', + 'aspx' => 'text/plain', + 'asx' => 'video/x-ms-asf', + 'atc' => 'application/vnd.acucorp', + 'atom' => 'application/atom+xml', + 'atomcat' => 'application/atomcat+xml', + 'atomsvc' => 'application/atomsvc+xml', + 'atx' => 'application/vnd.antix.game-component', + 'au' => 'audio/basic', + 'avi' => 'video/x-msvideo', + 'aw' => 'application/applixware', + 'axd' => 'text/plain', + 'azf' => 'application/vnd.airzip.filesecure.azf', + 'azs' => 'application/vnd.airzip.filesecure.azs', + 'azw' => 'application/vnd.amazon.ebook', + 'bat' => 'application/x-msdownload', + 'bcpio' => 'application/x-bcpio', + 'bdf' => 'application/x-font-bdf', + 'bdm' => 'application/vnd.syncml.dm+wbxml', + 'bed' => 'application/vnd.realvnc.bed', + 'bh2' => 'application/vnd.fujitsu.oasysprs', + 'bin' => 'application/octet-stream', + 'bmi' => 'application/vnd.bmi', + 'bmp' => 'image/bmp', + 'book' => 'application/vnd.framemaker', + 'box' => 'application/vnd.previewsystems.box', + 'boz' => 'application/x-bzip2', + 'bpk' => 'application/octet-stream', + 'btif' => 'image/prs.btif', + 'bz' => 'application/x-bzip', + 'bz2' => 'application/x-bzip2', + 'c' => 'text/x-c', + 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', + 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', + 'c4d' => 'application/vnd.clonk.c4group', + 'c4f' => 'application/vnd.clonk.c4group', + 'c4g' => 'application/vnd.clonk.c4group', + 'c4p' => 'application/vnd.clonk.c4group', + 'c4u' => 'application/vnd.clonk.c4group', + 'cab' => 'application/vnd.ms-cab-compressed', + 'car' => 'application/vnd.curl.car', + 'cat' => 'application/vnd.ms-pki.seccat', + 'cc' => 'text/x-c', + 'cct' => 'application/x-director', + 'ccxml' => 'application/ccxml+xml', + 'cdbcmsg' => 'application/vnd.contact.cmsg', + 'cdf' => 'application/x-netcdf', + 'cdkey' => 'application/vnd.mediastation.cdkey', + 'cdmia' => 'application/cdmi-capability', + 'cdmic' => 'application/cdmi-container', + 'cdmid' => 'application/cdmi-domain', + 'cdmio' => 'application/cdmi-object', + 'cdmiq' => 'application/cdmi-queue', + 'cdx' => 'chemical/x-cdx', + 'cdxml' => 'application/vnd.chemdraw+xml', + 'cdy' => 'application/vnd.cinderella', + 'cer' => 'application/pkix-cert', + 'cfc' => 'application/x-coldfusion', + 'cfm' => 'application/x-coldfusion', + 'cgm' => 'image/cgm', + 'chat' => 'application/x-chat', + 'chm' => 'application/vnd.ms-htmlhelp', + 'chrt' => 'application/vnd.kde.kchart', + 'cif' => 'chemical/x-cif', + 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', + 'cil' => 'application/vnd.ms-artgalry', + 'cla' => 'application/vnd.claymore', + 'class' => 'application/java-vm', + 'clkk' => 'application/vnd.crick.clicker.keyboard', + 'clkp' => 'application/vnd.crick.clicker.palette', + 'clkt' => 'application/vnd.crick.clicker.template', + 'clkw' => 'application/vnd.crick.clicker.wordbank', + 'clkx' => 'application/vnd.crick.clicker', + 'clp' => 'application/x-msclip', + 'cmc' => 'application/vnd.cosmocaller', + 'cmdf' => 'chemical/x-cmdf', + 'cml' => 'chemical/x-cml', + 'cmp' => 'application/vnd.yellowriver-custom-menu', + 'cmx' => 'image/x-cmx', + 'cod' => 'application/vnd.rim.cod', + 'com' => 'application/x-msdownload', + 'conf' => 'text/plain', + 'cpio' => 'application/x-cpio', + 'cpp' => 'text/x-c', + 'cpt' => 'application/mac-compactpro', + 'crd' => 'application/x-mscardfile', + 'crl' => 'application/pkix-crl', + 'crt' => 'application/x-x509-ca-cert', + 'cryptonote' => 'application/vnd.rig.cryptonote', + 'cs' => 'text/plain', + 'csh' => 'application/x-csh', + 'csml' => 'chemical/x-csml', + 'csp' => 'application/vnd.commonspace', + 'css' => 'text/css', + 'cst' => 'application/x-director', + 'csv' => 'text/csv', + 'cu' => 'application/cu-seeme', + 'curl' => 'text/vnd.curl', + 'cww' => 'application/prs.cww', + 'cxt' => 'application/x-director', + 'cxx' => 'text/x-c', + 'dae' => 'model/vnd.collada+xml', + 'daf' => 'application/vnd.mobius.daf', + 'dataless' => 'application/vnd.fdsn.seed', + 'davmount' => 'application/davmount+xml', + 'dcr' => 'application/x-director', + 'dcurl' => 'text/vnd.curl.dcurl', + 'dd2' => 'application/vnd.oma.dd2+xml', + 'ddd' => 'application/vnd.fujixerox.ddd', + 'deb' => 'application/x-debian-package', + 'def' => 'text/plain', + 'deploy' => 'application/octet-stream', + 'der' => 'application/x-x509-ca-cert', + 'dfac' => 'application/vnd.dreamfactory', + 'dic' => 'text/x-c', + 'dir' => 'application/x-director', + 'dis' => 'application/vnd.mobius.dis', + 'dist' => 'application/octet-stream', + 'distz' => 'application/octet-stream', + 'djv' => 'image/vnd.djvu', + 'djvu' => 'image/vnd.djvu', + 'dll' => 'application/x-msdownload', + 'dmg' => 'application/octet-stream', + 'dms' => 'application/octet-stream', + 'dna' => 'application/vnd.dna', + 'doc' => 'application/msword', + 'docm' => 'application/vnd.ms-word.document.macroenabled.12', + 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'dot' => 'application/msword', + 'dotm' => 'application/vnd.ms-word.template.macroenabled.12', + 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', + 'dp' => 'application/vnd.osgi.dp', + 'dpg' => 'application/vnd.dpgraph', + 'dra' => 'audio/vnd.dra', + 'dsc' => 'text/prs.lines.tag', + 'dssc' => 'application/dssc+der', + 'dtb' => 'application/x-dtbook+xml', + 'dtd' => 'application/xml-dtd', + 'dts' => 'audio/vnd.dts', + 'dtshd' => 'audio/vnd.dts.hd', + 'dump' => 'application/octet-stream', + 'dvi' => 'application/x-dvi', + 'dwf' => 'model/vnd.dwf', + 'dwg' => 'image/vnd.dwg', + 'dxf' => 'image/vnd.dxf', + 'dxp' => 'application/vnd.spotfire.dxp', + 'dxr' => 'application/x-director', + 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', + 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', + 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', + 'ecma' => 'application/ecmascript', + 'edm' => 'application/vnd.novadigm.edm', + 'edx' => 'application/vnd.novadigm.edx', + 'efif' => 'application/vnd.picsel', + 'ei6' => 'application/vnd.pg.osasli', + 'elc' => 'application/octet-stream', + 'eml' => 'message/rfc822', + 'emma' => 'application/emma+xml', + 'eol' => 'audio/vnd.digital-winds', + 'eot' => 'application/vnd.ms-fontobject', + 'eps' => 'application/postscript', + 'epub' => 'application/epub+zip', + 'es3' => 'application/vnd.eszigno3+xml', + 'esf' => 'application/vnd.epson.esf', + 'et3' => 'application/vnd.eszigno3+xml', + 'etx' => 'text/x-setext', + 'exe' => 'application/x-msdownload', + 'exi' => 'application/exi', + 'ext' => 'application/vnd.novadigm.ext', + 'ez' => 'application/andrew-inset', + 'ez2' => 'application/vnd.ezpix-album', + 'ez3' => 'application/vnd.ezpix-package', + 'f' => 'text/x-fortran', + 'f4v' => 'video/x-f4v', + 'f77' => 'text/x-fortran', + 'f90' => 'text/x-fortran', + 'fbs' => 'image/vnd.fastbidsheet', + 'fcs' => 'application/vnd.isac.fcs', + 'fdf' => 'application/vnd.fdf', + 'fe_launch' => 'application/vnd.denovo.fcselayout-link', + 'fg5' => 'application/vnd.fujitsu.oasysgp', + 'fgd' => 'application/x-director', + 'fh' => 'image/x-freehand', + 'fh4' => 'image/x-freehand', + 'fh5' => 'image/x-freehand', + 'fh7' => 'image/x-freehand', + 'fhc' => 'image/x-freehand', + 'fig' => 'application/x-xfig', + 'fli' => 'video/x-fli', + 'flo' => 'application/vnd.micrografx.flo', + 'flv' => 'video/x-flv', + 'flw' => 'application/vnd.kde.kivio', + 'flx' => 'text/vnd.fmi.flexstor', + 'fly' => 'text/vnd.fly', + 'fm' => 'application/vnd.framemaker', + 'fnc' => 'application/vnd.frogans.fnc', + 'for' => 'text/x-fortran', + 'fpx' => 'image/vnd.fpx', + 'frame' => 'application/vnd.framemaker', + 'fsc' => 'application/vnd.fsc.weblaunch', + 'fst' => 'image/vnd.fst', + 'ftc' => 'application/vnd.fluxtime.clip', + 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', + 'fvt' => 'video/vnd.fvt', + 'fxp' => 'application/vnd.adobe.fxp', + 'fxpl' => 'application/vnd.adobe.fxp', + 'fzs' => 'application/vnd.fuzzysheet', + 'g2w' => 'application/vnd.geoplan', + 'g3' => 'image/g3fax', + 'g3w' => 'application/vnd.geospace', + 'gac' => 'application/vnd.groove-account', + 'gdl' => 'model/vnd.gdl', + 'geo' => 'application/vnd.dynageo', + 'gex' => 'application/vnd.geometry-explorer', + 'ggb' => 'application/vnd.geogebra.file', + 'ggt' => 'application/vnd.geogebra.tool', + 'ghf' => 'application/vnd.groove-help', + 'gif' => 'image/gif', + 'gim' => 'application/vnd.groove-identity-message', + 'gmx' => 'application/vnd.gmx', + 'gnumeric' => 'application/x-gnumeric', + 'gph' => 'application/vnd.flographit', + 'gqf' => 'application/vnd.grafeq', + 'gqs' => 'application/vnd.grafeq', + 'gram' => 'application/srgs', + 'gre' => 'application/vnd.geometry-explorer', + 'grv' => 'application/vnd.groove-injector', + 'grxml' => 'application/srgs+xml', + 'gsf' => 'application/x-font-ghostscript', + 'gtar' => 'application/x-gtar', + 'gtm' => 'application/vnd.groove-tool-message', + 'gtw' => 'model/vnd.gtw', + 'gv' => 'text/vnd.graphviz', + 'gxt' => 'application/vnd.geonext', + 'h' => 'text/x-c', + 'h261' => 'video/h261', + 'h263' => 'video/h263', + 'h264' => 'video/h264', + 'hal' => 'application/vnd.hal+xml', + 'hbci' => 'application/vnd.hbci', + 'hdf' => 'application/x-hdf', + 'hh' => 'text/x-c', + 'hlp' => 'application/winhlp', + 'hpgl' => 'application/vnd.hp-hpgl', + 'hpid' => 'application/vnd.hp-hpid', + 'hps' => 'application/vnd.hp-hps', + 'hqx' => 'application/mac-binhex40', + 'hta' => 'application/octet-stream', + 'htc' => 'text/html', + 'htke' => 'application/vnd.kenameaapp', + 'htm' => 'text/html', + 'html' => 'text/html', + 'hvd' => 'application/vnd.yamaha.hv-dic', + 'hvp' => 'application/vnd.yamaha.hv-voice', + 'hvs' => 'application/vnd.yamaha.hv-script', + 'i2g' => 'application/vnd.intergeo', + 'icc' => 'application/vnd.iccprofile', + 'ice' => 'x-conference/x-cooltalk', + 'icm' => 'application/vnd.iccprofile', + 'ico' => 'image/x-icon', + 'ics' => 'text/calendar', + 'ief' => 'image/ief', + 'ifb' => 'text/calendar', + 'ifm' => 'application/vnd.shana.informed.formdata', + 'iges' => 'model/iges', + 'igl' => 'application/vnd.igloader', + 'igm' => 'application/vnd.insors.igm', + 'igs' => 'model/iges', + 'igx' => 'application/vnd.micrografx.igx', + 'iif' => 'application/vnd.shana.informed.interchange', + 'imp' => 'application/vnd.accpac.simply.imp', + 'ims' => 'application/vnd.ms-ims', + 'in' => 'text/plain', + 'ini' => 'text/plain', + 'ipfix' => 'application/ipfix', + 'ipk' => 'application/vnd.shana.informed.package', + 'irm' => 'application/vnd.ibm.rights-management', + 'irp' => 'application/vnd.irepository.package+xml', + 'iso' => 'application/octet-stream', + 'itp' => 'application/vnd.shana.informed.formtemplate', + 'ivp' => 'application/vnd.immervision-ivp', + 'ivu' => 'application/vnd.immervision-ivu', + 'jad' => 'text/vnd.sun.j2me.app-descriptor', + 'jam' => 'application/vnd.jam', + 'jar' => 'application/java-archive', + 'java' => 'text/x-java-source', + 'jisp' => 'application/vnd.jisp', + 'jlt' => 'application/vnd.hp-jlyt', + 'jnlp' => 'application/x-java-jnlp-file', + 'joda' => 'application/vnd.joost.joda-archive', + 'jpe' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'jpgm' => 'video/jpm', + 'jpgv' => 'video/jpeg', + 'jpm' => 'video/jpm', + 'js' => 'text/javascript', + 'json' => 'application/json', + 'kar' => 'audio/midi', + 'karbon' => 'application/vnd.kde.karbon', + 'kfo' => 'application/vnd.kde.kformula', + 'kia' => 'application/vnd.kidspiration', + 'kml' => 'application/vnd.google-earth.kml+xml', + 'kmz' => 'application/vnd.google-earth.kmz', + 'kne' => 'application/vnd.kinar', + 'knp' => 'application/vnd.kinar', + 'kon' => 'application/vnd.kde.kontour', + 'kpr' => 'application/vnd.kde.kpresenter', + 'kpt' => 'application/vnd.kde.kpresenter', + 'ksp' => 'application/vnd.kde.kspread', + 'ktr' => 'application/vnd.kahootz', + 'ktx' => 'image/ktx', + 'ktz' => 'application/vnd.kahootz', + 'kwd' => 'application/vnd.kde.kword', + 'kwt' => 'application/vnd.kde.kword', + 'lasxml' => 'application/vnd.las.las+xml', + 'latex' => 'application/x-latex', + 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', + 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', + 'les' => 'application/vnd.hhe.lesson-player', + 'lha' => 'application/octet-stream', + 'link66' => 'application/vnd.route66.link66+xml', + 'list' => 'text/plain', + 'list3820' => 'application/vnd.ibm.modcap', + 'listafp' => 'application/vnd.ibm.modcap', + 'log' => 'text/plain', + 'lostxml' => 'application/lost+xml', + 'lrf' => 'application/octet-stream', + 'lrm' => 'application/vnd.ms-lrm', + 'ltf' => 'application/vnd.frogans.ltf', + 'lvp' => 'audio/vnd.lucent.voice', + 'lwp' => 'application/vnd.lotus-wordpro', + 'lzh' => 'application/octet-stream', + 'm13' => 'application/x-msmediaview', + 'm14' => 'application/x-msmediaview', + 'm1v' => 'video/mpeg', + 'm21' => 'application/mp21', + 'm2a' => 'audio/mpeg', + 'm2v' => 'video/mpeg', + 'm3a' => 'audio/mpeg', + 'm3u' => 'audio/x-mpegurl', + 'm3u8' => 'application/vnd.apple.mpegurl', + 'm4a' => 'audio/mp4', + 'm4u' => 'video/vnd.mpegurl', + 'm4v' => 'video/mp4', + 'ma' => 'application/mathematica', + 'mads' => 'application/mads+xml', + 'mag' => 'application/vnd.ecowin.chart', + 'maker' => 'application/vnd.framemaker', + 'man' => 'text/troff', + 'mathml' => 'application/mathml+xml', + 'mb' => 'application/mathematica', + 'mbk' => 'application/vnd.mobius.mbk', + 'mbox' => 'application/mbox', + 'mc1' => 'application/vnd.medcalcdata', + 'mcd' => 'application/vnd.mcd', + 'mcurl' => 'text/vnd.curl.mcurl', + 'mdb' => 'application/x-msaccess', + 'mdi' => 'image/vnd.ms-modi', + 'me' => 'text/troff', + 'mesh' => 'model/mesh', + 'meta4' => 'application/metalink4+xml', + 'mets' => 'application/mets+xml', + 'mfm' => 'application/vnd.mfmp', + 'mgp' => 'application/vnd.osgeo.mapguide.package', + 'mgz' => 'application/vnd.proteus.magazine', + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mif' => 'application/vnd.mif', + 'mime' => 'message/rfc822', + 'mj2' => 'video/mj2', + 'mjp2' => 'video/mj2', + 'mlp' => 'application/vnd.dolby.mlp', + 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', + 'mmf' => 'application/vnd.smaf', + 'mmr' => 'image/vnd.fujixerox.edmics-mmr', + 'mny' => 'application/x-msmoney', + 'mobi' => 'application/x-mobipocket-ebook', + 'mods' => 'application/mods+xml', + 'mov' => 'video/quicktime', + 'movie' => 'video/x-sgi-movie', + 'mp2' => 'audio/mpeg', + 'mp21' => 'application/mp21', + 'mp2a' => 'audio/mpeg', + 'mp3' => 'audio/mpeg', + 'mp4' => 'video/mp4', + 'mp4a' => 'audio/mp4', + 'mp4s' => 'application/mp4', + 'mp4v' => 'video/mp4', + 'mpc' => 'application/vnd.mophun.certificate', + 'mpe' => 'video/mpeg', + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mpg4' => 'video/mp4', + 'mpga' => 'audio/mpeg', + 'mpkg' => 'application/vnd.apple.installer+xml', + 'mpm' => 'application/vnd.blueice.multipass', + 'mpn' => 'application/vnd.mophun.application', + 'mpp' => 'application/vnd.ms-project', + 'mpt' => 'application/vnd.ms-project', + 'mpy' => 'application/vnd.ibm.minipay', + 'mqy' => 'application/vnd.mobius.mqy', + 'mrc' => 'application/marc', + 'mrcx' => 'application/marcxml+xml', + 'ms' => 'text/troff', + 'mscml' => 'application/mediaservercontrol+xml', + 'mseed' => 'application/vnd.fdsn.mseed', + 'mseq' => 'application/vnd.mseq', + 'msf' => 'application/vnd.epson.msf', + 'msh' => 'model/mesh', + 'msi' => 'application/x-msdownload', + 'msl' => 'application/vnd.mobius.msl', + 'msty' => 'application/vnd.muvee.style', + 'mts' => 'model/vnd.mts', + 'mus' => 'application/vnd.musician', + 'musicxml' => 'application/vnd.recordare.musicxml+xml', + 'mvb' => 'application/x-msmediaview', + 'mwf' => 'application/vnd.mfer', + 'mxf' => 'application/mxf', + 'mxl' => 'application/vnd.recordare.musicxml', + 'mxml' => 'application/xv+xml', + 'mxs' => 'application/vnd.triscape.mxs', + 'mxu' => 'video/vnd.mpegurl', + 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', + 'n3' => 'text/n3', + 'nb' => 'application/mathematica', + 'nbp' => 'application/vnd.wolfram.player', + 'nc' => 'application/x-netcdf', + 'ncx' => 'application/x-dtbncx+xml', + 'ngdat' => 'application/vnd.nokia.n-gage.data', + 'nlu' => 'application/vnd.neurolanguage.nlu', + 'nml' => 'application/vnd.enliven', + 'nnd' => 'application/vnd.noblenet-directory', + 'nns' => 'application/vnd.noblenet-sealer', + 'nnw' => 'application/vnd.noblenet-web', + 'npx' => 'image/vnd.net-fpx', + 'nsf' => 'application/vnd.lotus-notes', + 'oa2' => 'application/vnd.fujitsu.oasys2', + 'oa3' => 'application/vnd.fujitsu.oasys3', + 'oas' => 'application/vnd.fujitsu.oasys', + 'obd' => 'application/x-msbinder', + 'oda' => 'application/oda', + 'odb' => 'application/vnd.oasis.opendocument.database', + 'odc' => 'application/vnd.oasis.opendocument.chart', + 'odf' => 'application/vnd.oasis.opendocument.formula', + 'odft' => 'application/vnd.oasis.opendocument.formula-template', + 'odg' => 'application/vnd.oasis.opendocument.graphics', + 'odi' => 'application/vnd.oasis.opendocument.image', + 'odm' => 'application/vnd.oasis.opendocument.text-master', + 'odp' => 'application/vnd.oasis.opendocument.presentation', + 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', + 'odt' => 'application/vnd.oasis.opendocument.text', + 'oga' => 'audio/ogg', + 'ogg' => 'audio/ogg', + 'ogv' => 'video/ogg', + 'ogx' => 'application/ogg', + 'onepkg' => 'application/onenote', + 'onetmp' => 'application/onenote', + 'onetoc' => 'application/onenote', + 'onetoc2' => 'application/onenote', + 'opf' => 'application/oebps-package+xml', + 'oprc' => 'application/vnd.palm', + 'org' => 'application/vnd.lotus-organizer', + 'osf' => 'application/vnd.yamaha.openscoreformat', + 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', + 'otc' => 'application/vnd.oasis.opendocument.chart-template', + 'otf' => 'application/x-font-otf', + 'otg' => 'application/vnd.oasis.opendocument.graphics-template', + 'oth' => 'application/vnd.oasis.opendocument.text-web', + 'oti' => 'application/vnd.oasis.opendocument.image-template', + 'otp' => 'application/vnd.oasis.opendocument.presentation-template', + 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', + 'ott' => 'application/vnd.oasis.opendocument.text-template', + 'oxt' => 'application/vnd.openofficeorg.extension', + 'p' => 'text/x-pascal', + 'p10' => 'application/pkcs10', + 'p12' => 'application/x-pkcs12', + 'p7b' => 'application/x-pkcs7-certificates', + 'p7c' => 'application/pkcs7-mime', + 'p7m' => 'application/pkcs7-mime', + 'p7r' => 'application/x-pkcs7-certreqresp', + 'p7s' => 'application/pkcs7-signature', + 'p8' => 'application/pkcs8', + 'pas' => 'text/x-pascal', + 'paw' => 'application/vnd.pawaafile', + 'pbd' => 'application/vnd.powerbuilder6', + 'pbm' => 'image/x-portable-bitmap', + 'pcf' => 'application/x-font-pcf', + 'pcl' => 'application/vnd.hp-pcl', + 'pclxl' => 'application/vnd.hp-pclxl', + 'pct' => 'image/x-pict', + 'pcurl' => 'application/vnd.curl.pcurl', + 'pcx' => 'image/x-pcx', + 'pdb' => 'application/vnd.palm', + 'pdf' => 'application/pdf', + 'pfa' => 'application/x-font-type1', + 'pfb' => 'application/x-font-type1', + 'pfm' => 'application/x-font-type1', + 'pfr' => 'application/font-tdpfr', + 'pfx' => 'application/x-pkcs12', + 'pgm' => 'image/x-portable-graymap', + 'pgn' => 'application/x-chess-pgn', + 'pgp' => 'application/pgp-encrypted', + 'php' => 'text/x-php', + 'phps' => 'application/x-httpd-phps', + 'pic' => 'image/x-pict', + 'pkg' => 'application/octet-stream', + 'pki' => 'application/pkixcmp', + 'pkipath' => 'application/pkix-pkipath', + 'plb' => 'application/vnd.3gpp.pic-bw-large', + 'plc' => 'application/vnd.mobius.plc', + 'plf' => 'application/vnd.pocketlearn', + 'pls' => 'application/pls+xml', + 'pml' => 'application/vnd.ctc-posml', + 'png' => 'image/png', + 'pnm' => 'image/x-portable-anymap', + 'portpkg' => 'application/vnd.macports.portpkg', + 'pot' => 'application/vnd.ms-powerpoint', + 'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12', + 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', + 'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12', + 'ppd' => 'application/vnd.cups-ppd', + 'ppm' => 'image/x-portable-pixmap', + 'pps' => 'application/vnd.ms-powerpoint', + 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12', + 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', + 'ppt' => 'application/vnd.ms-powerpoint', + 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12', + 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'pqa' => 'application/vnd.palm', + 'prc' => 'application/x-mobipocket-ebook', + 'pre' => 'application/vnd.lotus-freelance', + 'prf' => 'application/pics-rules', + 'ps' => 'application/postscript', + 'psb' => 'application/vnd.3gpp.pic-bw-small', + 'psd' => 'image/vnd.adobe.photoshop', + 'psf' => 'application/x-font-linux-psf', + 'pskcxml' => 'application/pskc+xml', + 'ptid' => 'application/vnd.pvi.ptid1', + 'pub' => 'application/x-mspublisher', + 'pvb' => 'application/vnd.3gpp.pic-bw-var', + 'pwn' => 'application/vnd.3m.post-it-notes', + 'pya' => 'audio/vnd.ms-playready.media.pya', + 'pyv' => 'video/vnd.ms-playready.media.pyv', + 'qam' => 'application/vnd.epson.quickanime', + 'qbo' => 'application/vnd.intu.qbo', + 'qfx' => 'application/vnd.intu.qfx', + 'qps' => 'application/vnd.publishare-delta-tree', + 'qt' => 'video/quicktime', + 'qwd' => 'application/vnd.quark.quarkxpress', + 'qwt' => 'application/vnd.quark.quarkxpress', + 'qxb' => 'application/vnd.quark.quarkxpress', + 'qxd' => 'application/vnd.quark.quarkxpress', + 'qxl' => 'application/vnd.quark.quarkxpress', + 'qxt' => 'application/vnd.quark.quarkxpress', + 'ra' => 'audio/x-pn-realaudio', + 'ram' => 'audio/x-pn-realaudio', + 'rar' => 'application/x-rar-compressed', + 'ras' => 'image/x-cmu-raster', + 'rb' => 'text/plain', + 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', + 'rdf' => 'application/rdf+xml', + 'rdz' => 'application/vnd.data-vision.rdz', + 'rep' => 'application/vnd.businessobjects', + 'res' => 'application/x-dtbresource+xml', + 'resx' => 'text/xml', + 'rgb' => 'image/x-rgb', + 'rif' => 'application/reginfo+xml', + 'rip' => 'audio/vnd.rip', + 'rl' => 'application/resource-lists+xml', + 'rlc' => 'image/vnd.fujixerox.edmics-rlc', + 'rld' => 'application/resource-lists-diff+xml', + 'rm' => 'application/vnd.rn-realmedia', + 'rmi' => 'audio/midi', + 'rmp' => 'audio/x-pn-realaudio-plugin', + 'rms' => 'application/vnd.jcp.javame.midlet-rms', + 'rnc' => 'application/relax-ng-compact-syntax', + 'roff' => 'text/troff', + 'rp9' => 'application/vnd.cloanto.rp9', + 'rpss' => 'application/vnd.nokia.radio-presets', + 'rpst' => 'application/vnd.nokia.radio-preset', + 'rq' => 'application/sparql-query', + 'rs' => 'application/rls-services+xml', + 'rsd' => 'application/rsd+xml', + 'rss' => 'application/rss+xml', + 'rtf' => 'application/rtf', + 'rtx' => 'text/richtext', + 's' => 'text/x-asm', + 'saf' => 'application/vnd.yamaha.smaf-audio', + 'sbml' => 'application/sbml+xml', + 'sc' => 'application/vnd.ibm.secure-container', + 'scd' => 'application/x-msschedule', + 'scm' => 'application/vnd.lotus-screencam', + 'scq' => 'application/scvp-cv-request', + 'scs' => 'application/scvp-cv-response', + 'scurl' => 'text/vnd.curl.scurl', + 'sda' => 'application/vnd.stardivision.draw', + 'sdc' => 'application/vnd.stardivision.calc', + 'sdd' => 'application/vnd.stardivision.impress', + 'sdkd' => 'application/vnd.solent.sdkm+xml', + 'sdkm' => 'application/vnd.solent.sdkm+xml', + 'sdp' => 'application/sdp', + 'sdw' => 'application/vnd.stardivision.writer', + 'see' => 'application/vnd.seemail', + 'seed' => 'application/vnd.fdsn.seed', + 'sema' => 'application/vnd.sema', + 'semd' => 'application/vnd.semd', + 'semf' => 'application/vnd.semf', + 'ser' => 'application/java-serialized-object', + 'setpay' => 'application/set-payment-initiation', + 'setreg' => 'application/set-registration-initiation', + 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', + 'sfs' => 'application/vnd.spotfire.sfs', + 'sgl' => 'application/vnd.stardivision.writer-global', + 'sgm' => 'text/sgml', + 'sgml' => 'text/sgml', + 'sh' => 'application/x-sh', + 'shar' => 'application/x-shar', + 'shf' => 'application/shf+xml', + 'sig' => 'application/pgp-signature', + 'silo' => 'model/mesh', + 'sis' => 'application/vnd.symbian.install', + 'sisx' => 'application/vnd.symbian.install', + 'sit' => 'application/x-stuffit', + 'sitx' => 'application/x-stuffitx', + 'skd' => 'application/vnd.koan', + 'skm' => 'application/vnd.koan', + 'skp' => 'application/vnd.koan', + 'skt' => 'application/vnd.koan', + 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', + 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', + 'slt' => 'application/vnd.epson.salt', + 'sm' => 'application/vnd.stepmania.stepchart', + 'smf' => 'application/vnd.stardivision.math', + 'smi' => 'application/smil+xml', + 'smil' => 'application/smil+xml', + 'snd' => 'audio/basic', + 'snf' => 'application/x-font-snf', + 'so' => 'application/octet-stream', + 'spc' => 'application/x-pkcs7-certificates', + 'spf' => 'application/vnd.yamaha.smaf-phrase', + 'spl' => 'application/x-futuresplash', + 'spot' => 'text/vnd.in3d.spot', + 'spp' => 'application/scvp-vp-response', + 'spq' => 'application/scvp-vp-request', + 'spx' => 'audio/ogg', + 'src' => 'application/x-wais-source', + 'sru' => 'application/sru+xml', + 'srx' => 'application/sparql-results+xml', + 'sse' => 'application/vnd.kodak-descriptor', + 'ssf' => 'application/vnd.epson.ssf', + 'ssml' => 'application/ssml+xml', + 'st' => 'application/vnd.sailingtracker.track', + 'stc' => 'application/vnd.sun.xml.calc.template', + 'std' => 'application/vnd.sun.xml.draw.template', + 'stf' => 'application/vnd.wt.stf', + 'sti' => 'application/vnd.sun.xml.impress.template', + 'stk' => 'application/hyperstudio', + 'stl' => 'application/vnd.ms-pki.stl', + 'str' => 'application/vnd.pg.format', + 'stw' => 'application/vnd.sun.xml.writer.template', + 'sub' => 'image/vnd.dvb.subtitle', + 'sus' => 'application/vnd.sus-calendar', + 'susp' => 'application/vnd.sus-calendar', + 'sv4cpio' => 'application/x-sv4cpio', + 'sv4crc' => 'application/x-sv4crc', + 'svc' => 'application/vnd.dvb.service', + 'svd' => 'application/vnd.svd', + 'svg' => 'image/svg+xml', + 'svgz' => 'image/svg+xml', + 'swa' => 'application/x-director', + 'swf' => 'application/x-shockwave-flash', + 'swi' => 'application/vnd.aristanetworks.swi', + 'sxc' => 'application/vnd.sun.xml.calc', + 'sxd' => 'application/vnd.sun.xml.draw', + 'sxg' => 'application/vnd.sun.xml.writer.global', + 'sxi' => 'application/vnd.sun.xml.impress', + 'sxm' => 'application/vnd.sun.xml.math', + 'sxw' => 'application/vnd.sun.xml.writer', + 't' => 'text/troff', + 'tao' => 'application/vnd.tao.intent-module-archive', + 'tar' => 'application/x-tar', + 'tcap' => 'application/vnd.3gpp2.tcap', + 'tcl' => 'application/x-tcl', + 'teacher' => 'application/vnd.smart.teacher', + 'tei' => 'application/tei+xml', + 'teicorpus' => 'application/tei+xml', + 'tex' => 'application/x-tex', + 'texi' => 'application/x-texinfo', + 'texinfo' => 'application/x-texinfo', + 'text' => 'text/plain', + 'tfi' => 'application/thraud+xml', + 'tfm' => 'application/x-tex-tfm', + 'thmx' => 'application/vnd.ms-officetheme', + 'tif' => 'image/tiff', + 'tiff' => 'image/tiff', + 'tmo' => 'application/vnd.tmobile-livetv', + 'torrent' => 'application/x-bittorrent', + 'tpl' => 'application/vnd.groove-tool-template', + 'tpt' => 'application/vnd.trid.tpt', + 'tr' => 'text/troff', + 'tra' => 'application/vnd.trueapp', + 'trm' => 'application/x-msterminal', + 'tsd' => 'application/timestamped-data', + 'tsv' => 'text/tab-separated-values', + 'ttc' => 'application/x-font-ttf', + 'ttf' => 'application/x-font-ttf', + 'ttl' => 'text/turtle', + 'twd' => 'application/vnd.simtech-mindmapper', + 'twds' => 'application/vnd.simtech-mindmapper', + 'txd' => 'application/vnd.genomatix.tuxedo', + 'txf' => 'application/vnd.mobius.txf', + 'txt' => 'text/plain', + 'u32' => 'application/x-authorware-bin', + 'udeb' => 'application/x-debian-package', + 'ufd' => 'application/vnd.ufdl', + 'ufdl' => 'application/vnd.ufdl', + 'umj' => 'application/vnd.umajin', + 'unityweb' => 'application/vnd.unity', + 'uoml' => 'application/vnd.uoml+xml', + 'uri' => 'text/uri-list', + 'uris' => 'text/uri-list', + 'urls' => 'text/uri-list', + 'ustar' => 'application/x-ustar', + 'utz' => 'application/vnd.uiq.theme', + 'uu' => 'text/x-uuencode', + 'uva' => 'audio/vnd.dece.audio', + 'uvd' => 'application/vnd.dece.data', + 'uvf' => 'application/vnd.dece.data', + 'uvg' => 'image/vnd.dece.graphic', + 'uvh' => 'video/vnd.dece.hd', + 'uvi' => 'image/vnd.dece.graphic', + 'uvm' => 'video/vnd.dece.mobile', + 'uvp' => 'video/vnd.dece.pd', + 'uvs' => 'video/vnd.dece.sd', + 'uvt' => 'application/vnd.dece.ttml+xml', + 'uvu' => 'video/vnd.uvvu.mp4', + 'uvv' => 'video/vnd.dece.video', + 'uvva' => 'audio/vnd.dece.audio', + 'uvvd' => 'application/vnd.dece.data', + 'uvvf' => 'application/vnd.dece.data', + 'uvvg' => 'image/vnd.dece.graphic', + 'uvvh' => 'video/vnd.dece.hd', + 'uvvi' => 'image/vnd.dece.graphic', + 'uvvm' => 'video/vnd.dece.mobile', + 'uvvp' => 'video/vnd.dece.pd', + 'uvvs' => 'video/vnd.dece.sd', + 'uvvt' => 'application/vnd.dece.ttml+xml', + 'uvvu' => 'video/vnd.uvvu.mp4', + 'uvvv' => 'video/vnd.dece.video', + 'uvvx' => 'application/vnd.dece.unspecified', + 'uvx' => 'application/vnd.dece.unspecified', + 'vcd' => 'application/x-cdlink', + 'vcf' => 'text/x-vcard', + 'vcg' => 'application/vnd.groove-vcard', + 'vcs' => 'text/x-vcalendar', + 'vcx' => 'application/vnd.vcx', + 'vis' => 'application/vnd.visionary', + 'viv' => 'video/vnd.vivo', + 'vor' => 'application/vnd.stardivision.writer', + 'vox' => 'application/x-authorware-bin', + 'vrml' => 'model/vrml', + 'vsd' => 'application/vnd.visio', + 'vsf' => 'application/vnd.vsf', + 'vss' => 'application/vnd.visio', + 'vst' => 'application/vnd.visio', + 'vsw' => 'application/vnd.visio', + 'vtu' => 'model/vnd.vtu', + 'vxml' => 'application/voicexml+xml', + 'w3d' => 'application/x-director', + 'wad' => 'application/x-doom', + 'wav' => 'audio/x-wav', + 'wax' => 'audio/x-ms-wax', + 'wbmp' => 'image/vnd.wap.wbmp', + 'wbs' => 'application/vnd.criticaltools.wbs+xml', + 'wbxml' => 'application/vnd.wap.wbxml', + 'wcm' => 'application/vnd.ms-works', + 'wdb' => 'application/vnd.ms-works', + 'weba' => 'audio/webm', + 'webm' => 'video/webm', + 'webp' => 'image/webp', + 'wg' => 'application/vnd.pmi.widget', + 'wgt' => 'application/widget', + 'wks' => 'application/vnd.ms-works', + 'wm' => 'video/x-ms-wm', + 'wma' => 'audio/x-ms-wma', + 'wmd' => 'application/x-ms-wmd', + 'wmf' => 'application/x-msmetafile', + 'wml' => 'text/vnd.wap.wml', + 'wmlc' => 'application/vnd.wap.wmlc', + 'wmls' => 'text/vnd.wap.wmlscript', + 'wmlsc' => 'application/vnd.wap.wmlscriptc', + 'wmv' => 'video/x-ms-wmv', + 'wmx' => 'video/x-ms-wmx', + 'wmz' => 'application/x-ms-wmz', + 'woff' => 'application/x-font-woff', + 'wpd' => 'application/vnd.wordperfect', + 'wpl' => 'application/vnd.ms-wpl', + 'wps' => 'application/vnd.ms-works', + 'wqd' => 'application/vnd.wqd', + 'wri' => 'application/x-mswrite', + 'wrl' => 'model/vrml', + 'wsdl' => 'application/wsdl+xml', + 'wspolicy' => 'application/wspolicy+xml', + 'wtb' => 'application/vnd.webturbo', + 'wvx' => 'video/x-ms-wvx', + 'x32' => 'application/x-authorware-bin', + 'x3d' => 'application/vnd.hzn-3d-crossword', + 'xap' => 'application/x-silverlight-app', + 'xar' => 'application/vnd.xara', + 'xbap' => 'application/x-ms-xbap', + 'xbd' => 'application/vnd.fujixerox.docuworks.binder', + 'xbm' => 'image/x-xbitmap', + 'xdf' => 'application/xcap-diff+xml', + 'xdm' => 'application/vnd.syncml.dm+xml', + 'xdp' => 'application/vnd.adobe.xdp+xml', + 'xdssc' => 'application/dssc+xml', + 'xdw' => 'application/vnd.fujixerox.docuworks', + 'xenc' => 'application/xenc+xml', + 'xer' => 'application/patch-ops-error+xml', + 'xfdf' => 'application/vnd.adobe.xfdf', + 'xfdl' => 'application/vnd.xfdl', + 'xht' => 'application/xhtml+xml', + 'xhtml' => 'application/xhtml+xml', + 'xhvml' => 'application/xv+xml', + 'xif' => 'image/vnd.xiff', + 'xla' => 'application/vnd.ms-excel', + 'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12', + 'xlc' => 'application/vnd.ms-excel', + 'xlm' => 'application/vnd.ms-excel', + 'xls' => 'application/vnd.ms-excel', + 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12', + 'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12', + 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'xlt' => 'application/vnd.ms-excel', + 'xltm' => 'application/vnd.ms-excel.template.macroenabled.12', + 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', + 'xlw' => 'application/vnd.ms-excel', + 'xml' => 'application/xml', + 'xo' => 'application/vnd.olpc-sugar', + 'xop' => 'application/xop+xml', + 'xpi' => 'application/x-xpinstall', + 'xpm' => 'image/x-xpixmap', + 'xpr' => 'application/vnd.is-xpr', + 'xps' => 'application/vnd.ms-xpsdocument', + 'xpw' => 'application/vnd.intercon.formnet', + 'xpx' => 'application/vnd.intercon.formnet', + 'xsl' => 'application/xml', + 'xslt' => 'application/xslt+xml', + 'xsm' => 'application/vnd.syncml+xml', + 'xspf' => 'application/xspf+xml', + 'xul' => 'application/vnd.mozilla.xul+xml', + 'xvm' => 'application/xv+xml', + 'xvml' => 'application/xv+xml', + 'xwd' => 'image/x-xwindowdump', + 'xyz' => 'chemical/x-xyz', + 'yaml' => 'text/yaml', + 'yang' => 'application/yang', + 'yin' => 'application/yin+xml', + 'yml' => 'text/yaml', + 'zaz' => 'application/vnd.zzazz.deck+xml', + 'zip' => 'application/zip', + 'zir' => 'application/vnd.zul', + 'zirz' => 'application/vnd.zul', + 'zmm' => 'application/vnd.handheld-entertainment+xml' + ]; + + /** + * Get a singleton instance of the class + * + * @return self + * @codeCoverageIgnore + */ + public static function getInstance() + { + if (!self::$instance) { + self::$instance = new self(); + } + + return self::$instance; + } + + /** + * Get a mimetype value from a file extension + * + * @param string $extension File extension + * + * @return string|null + */ + public function fromExtension($extension) + { + $extension = strtolower($extension); + + return isset($this->mimetypes[$extension]) ? $this->mimetypes[$extension] : null; + } + + /** + * Get a mimetype from a filename + * + * @param string $filename Filename to generate a mimetype from + * + * @return string|null + */ + public function fromFilename($filename) + { + return $this->fromExtension(pathinfo($filename, PATHINFO_EXTENSION)); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/Collection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/Collection.php new file mode 100755 index 00000000..cac010ba --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/Collection.php @@ -0,0 +1,242 @@ +items = $items; + } + + /** + * Gets the value of a field from the Graph node. + * + * @param string $name The field to retrieve. + * @param mixed $default The default to return if the field doesn't exist. + * + * @return mixed + */ + public function getField($name, $default = null) + { + if (isset($this->items[$name])) { + return $this->items[$name]; + } + + return $default ?: null; + } + + /** + * Gets the value of the named property for this graph object. + * + * @param string $name The property to retrieve. + * @param mixed $default The default to return if the property doesn't exist. + * + * @return mixed + * + * @deprecated 5.0.0 getProperty() has been renamed to getField() + * @todo v6: Remove this method + */ + public function getProperty($name, $default = null) + { + return $this->getField($name, $default); + } + + /** + * Returns a list of all fields set on the object. + * + * @return array + */ + public function getFieldNames() + { + return array_keys($this->items); + } + + /** + * Returns a list of all properties set on the object. + * + * @return array + * + * @deprecated 5.0.0 getPropertyNames() has been renamed to getFieldNames() + * @todo v6: Remove this method + */ + public function getPropertyNames() + { + return $this->getFieldNames(); + } + + /** + * Get all of the items in the collection. + * + * @return array + */ + public function all() + { + return $this->items; + } + + /** + * Get the collection of items as a plain array. + * + * @return array + */ + public function asArray() + { + return array_map(function ($value) { + return $value instanceof Collection ? $value->asArray() : $value; + }, $this->items); + } + + /** + * Run a map over each of the items. + * + * @param \Closure $callback + * + * @return static + */ + public function map(\Closure $callback) + { + return new static(array_map($callback, $this->items, array_keys($this->items))); + } + + /** + * Get the collection of items as JSON. + * + * @param int $options + * + * @return string + */ + public function asJson($options = 0) + { + return json_encode($this->asArray(), $options); + } + + /** + * Count the number of items in the collection. + * + * @return int + */ + public function count() + { + return count($this->items); + } + + /** + * Get an iterator for the items. + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->items); + } + + /** + * Determine if an item exists at an offset. + * + * @param mixed $key + * + * @return bool + */ + public function offsetExists($key) + { + return array_key_exists($key, $this->items); + } + + /** + * Get an item at a given offset. + * + * @param mixed $key + * + * @return mixed + */ + public function offsetGet($key) + { + return $this->items[$key]; + } + + /** + * Set the item at a given offset. + * + * @param mixed $key + * @param mixed $value + * + * @return void + */ + public function offsetSet($key, $value) + { + if (is_null($key)) { + $this->items[] = $value; + } else { + $this->items[$key] = $value; + } + } + + /** + * Unset the item at a given offset. + * + * @param string $key + * + * @return void + */ + public function offsetUnset($key) + { + unset($this->items[$key]); + } + + /** + * Convert the collection to its string representation. + * + * @return string + */ + public function __toString() + { + return $this->asJson(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphAchievement.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphAchievement.php new file mode 100755 index 00000000..3fba815c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphAchievement.php @@ -0,0 +1,113 @@ + '\Facebook\GraphNodes\GraphUser', + 'application' => '\Facebook\GraphNodes\GraphApplication', + ]; + + /** + * Returns the ID for the achievement. + * + * @return string|null + */ + public function getId() + { + return $this->getField('id'); + } + + /** + * Returns the user who achieved this. + * + * @return GraphUser|null + */ + public function getFrom() + { + return $this->getField('from'); + } + + /** + * Returns the time at which this was achieved. + * + * @return \DateTime|null + */ + public function getPublishTime() + { + return $this->getField('publish_time'); + } + + /** + * Returns the app in which the user achieved this. + * + * @return GraphApplication|null + */ + public function getApplication() + { + return $this->getField('application'); + } + + /** + * Returns information about the achievement type this instance is connected with. + * + * @return array|null + */ + public function getData() + { + return $this->getField('data'); + } + + /** + * Returns the type of achievement. + * + * @see https://developers.facebook.com/docs/graph-api/reference/v2.2/achievement + * + * @return string + */ + public function getType() + { + return 'game.achievement'; + } + + /** + * Indicates whether gaining the achievement published a feed story for the user. + * + * @return boolean|null + */ + public function isNoFeedStory() + { + return $this->getField('no_feed_story'); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphAlbum.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphAlbum.php new file mode 100755 index 00000000..50d1f2c3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphAlbum.php @@ -0,0 +1,183 @@ + '\Facebook\GraphNodes\GraphUser', + 'place' => '\Facebook\GraphNodes\GraphPage', + ]; + + /** + * Returns the ID for the album. + * + * @return string|null + */ + public function getId() + { + return $this->getField('id'); + } + + /** + * Returns whether the viewer can upload photos to this album. + * + * @return boolean|null + */ + public function getCanUpload() + { + return $this->getField('can_upload'); + } + + /** + * Returns the number of photos in this album. + * + * @return int|null + */ + public function getCount() + { + return $this->getField('count'); + } + + /** + * Returns the ID of the album's cover photo. + * + * @return string|null + */ + public function getCoverPhoto() + { + return $this->getField('cover_photo'); + } + + /** + * Returns the time the album was initially created. + * + * @return \DateTime|null + */ + public function getCreatedTime() + { + return $this->getField('created_time'); + } + + /** + * Returns the time the album was updated. + * + * @return \DateTime|null + */ + public function getUpdatedTime() + { + return $this->getField('updated_time'); + } + + /** + * Returns the description of the album. + * + * @return string|null + */ + public function getDescription() + { + return $this->getField('description'); + } + + /** + * Returns profile that created the album. + * + * @return GraphUser|null + */ + public function getFrom() + { + return $this->getField('from'); + } + + /** + * Returns profile that created the album. + * + * @return GraphPage|null + */ + public function getPlace() + { + return $this->getField('place'); + } + + /** + * Returns a link to this album on Facebook. + * + * @return string|null + */ + public function getLink() + { + return $this->getField('link'); + } + + /** + * Returns the textual location of the album. + * + * @return string|null + */ + public function getLocation() + { + return $this->getField('location'); + } + + /** + * Returns the title of the album. + * + * @return string|null + */ + public function getName() + { + return $this->getField('name'); + } + + /** + * Returns the privacy settings for the album. + * + * @return string|null + */ + public function getPrivacy() + { + return $this->getField('privacy'); + } + + /** + * Returns the type of the album. + * + * enum{ profile, mobile, wall, normal, album } + * + * @return string|null + */ + public function getType() + { + return $this->getField('type'); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphApplication.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphApplication.php new file mode 100755 index 00000000..69b09bb5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphApplication.php @@ -0,0 +1,43 @@ +getField('id'); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphCoverPhoto.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphCoverPhoto.php new file mode 100755 index 00000000..ee607507 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphCoverPhoto.php @@ -0,0 +1,72 @@ +getField('id'); + } + + /** + * Returns the source of cover if it exists + * + * @return string|null + */ + public function getSource() + { + return $this->getField('source'); + } + + /** + * Returns the offset_x of cover if it exists + * + * @return int|null + */ + public function getOffsetX() + { + return $this->getField('offset_x'); + } + + /** + * Returns the offset_y of cover if it exists + * + * @return int|null + */ + public function getOffsetY() + { + return $this->getField('offset_y'); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphEdge.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphEdge.php new file mode 100755 index 00000000..95f32849 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphEdge.php @@ -0,0 +1,260 @@ +request = $request; + $this->metaData = $metaData; + $this->parentEdgeEndpoint = $parentEdgeEndpoint; + $this->subclassName = $subclassName; + + parent::__construct($data); + } + + /** + * Gets the parent Graph edge endpoint that generated the list. + * + * @return string|null + */ + public function getParentGraphEdge() + { + return $this->parentEdgeEndpoint; + } + + /** + * Gets the subclass name that the child GraphNode's are cast as. + * + * @return string|null + */ + public function getSubClassName() + { + return $this->subclassName; + } + + /** + * Returns the raw meta data associated with this GraphEdge. + * + * @return array + */ + public function getMetaData() + { + return $this->metaData; + } + + /** + * Returns the next cursor if it exists. + * + * @return string|null + */ + public function getNextCursor() + { + return $this->getCursor('after'); + } + + /** + * Returns the previous cursor if it exists. + * + * @return string|null + */ + public function getPreviousCursor() + { + return $this->getCursor('before'); + } + + /** + * Returns the cursor for a specific direction if it exists. + * + * @param string $direction The direction of the page: after|before + * + * @return string|null + */ + public function getCursor($direction) + { + if (isset($this->metaData['paging']['cursors'][$direction])) { + return $this->metaData['paging']['cursors'][$direction]; + } + + return null; + } + + /** + * Generates a pagination URL based on a cursor. + * + * @param string $direction The direction of the page: next|previous + * + * @return string|null + * + * @throws FacebookSDKException + */ + public function getPaginationUrl($direction) + { + $this->validateForPagination(); + + // Do we have a paging URL? + if (isset($this->metaData['paging'][$direction])) { + // Graph returns the full URL with all the original params. + // We just want the endpoint though. + $pageUrl = $this->metaData['paging'][$direction]; + + return FacebookUrlManipulator::baseGraphUrlEndpoint($pageUrl); + } + + // Do we have a cursor to work with? + $cursorDirection = $direction === 'next' ? 'after' : 'before'; + $cursor = $this->getCursor($cursorDirection); + if (!$cursor) { + return null; + } + + // If we don't know the ID of the parent node, this ain't gonna work. + if (!$this->parentEdgeEndpoint) { + return null; + } + + // We have the parent node ID, paging cursor & original request. + // These were the ingredients chosen to create the perfect little URL. + $pageUrl = $this->parentEdgeEndpoint . '?' . $cursorDirection . '=' . urlencode($cursor); + + // Pull in the original params + $originalUrl = $this->request->getUrl(); + $pageUrl = FacebookUrlManipulator::mergeUrlParams($originalUrl, $pageUrl); + + return FacebookUrlManipulator::forceSlashPrefix($pageUrl); + } + + /** + * Validates whether or not we can paginate on this request. + * + * @throws FacebookSDKException + */ + public function validateForPagination() + { + if ($this->request->getMethod() !== 'GET') { + throw new FacebookSDKException('You can only paginate on a GET request.', 720); + } + } + + /** + * Gets the request object needed to make a next|previous page request. + * + * @param string $direction The direction of the page: next|previous + * + * @return FacebookRequest|null + * + * @throws FacebookSDKException + */ + public function getPaginationRequest($direction) + { + $pageUrl = $this->getPaginationUrl($direction); + if (!$pageUrl) { + return null; + } + + $newRequest = clone $this->request; + $newRequest->setEndpoint($pageUrl); + + return $newRequest; + } + + /** + * Gets the request object needed to make a "next" page request. + * + * @return FacebookRequest|null + * + * @throws FacebookSDKException + */ + public function getNextPageRequest() + { + return $this->getPaginationRequest('next'); + } + + /** + * Gets the request object needed to make a "previous" page request. + * + * @return FacebookRequest|null + * + * @throws FacebookSDKException + */ + public function getPreviousPageRequest() + { + return $this->getPaginationRequest('previous'); + } + + /** + * The total number of results according to Graph if it exists. + * + * This will be returned if the summary=true modifier is present in the request. + * + * @return int|null + */ + public function getTotalCount() + { + if (isset($this->metaData['summary']['total_count'])) { + return $this->metaData['summary']['total_count']; + } + + return null; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphEvent.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphEvent.php new file mode 100755 index 00000000..19ff2fb4 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphEvent.php @@ -0,0 +1,242 @@ + '\Facebook\GraphNodes\GraphCoverPhoto', + 'place' => '\Facebook\GraphNodes\GraphPage', + 'picture' => '\Facebook\GraphNodes\GraphPicture', + 'parent_group' => '\Facebook\GraphNodes\GraphGroup', + ]; + + /** + * Returns the `id` (The event ID) as string if present. + * + * @return string|null + */ + public function getId() + { + return $this->getField('id'); + } + + /** + * Returns the `cover` (Cover picture) as GraphCoverPhoto if present. + * + * @return GraphCoverPhoto|null + */ + public function getCover() + { + return $this->getField('cover'); + } + + /** + * Returns the `description` (Long-form description) as string if present. + * + * @return string|null + */ + public function getDescription() + { + return $this->getField('description'); + } + + /** + * Returns the `end_time` (End time, if one has been set) as DateTime if present. + * + * @return \DateTime|null + */ + public function getEndTime() + { + return $this->getField('end_time'); + } + + /** + * Returns the `is_date_only` (Whether the event only has a date specified, but no time) as bool if present. + * + * @return bool|null + */ + public function getIsDateOnly() + { + return $this->getField('is_date_only'); + } + + /** + * Returns the `name` (Event name) as string if present. + * + * @return string|null + */ + public function getName() + { + return $this->getField('name'); + } + + /** + * Returns the `owner` (The profile that created the event) as GraphNode if present. + * + * @return GraphNode|null + */ + public function getOwner() + { + return $this->getField('owner'); + } + + /** + * Returns the `parent_group` (The group the event belongs to) as GraphGroup if present. + * + * @return GraphGroup|null + */ + public function getParentGroup() + { + return $this->getField('parent_group'); + } + + /** + * Returns the `place` (Event Place information) as GraphPage if present. + * + * @return GraphPage|null + */ + public function getPlace() + { + return $this->getField('place'); + } + + /** + * Returns the `privacy` (Who can see the event) as string if present. + * + * @return string|null + */ + public function getPrivacy() + { + return $this->getField('privacy'); + } + + /** + * Returns the `start_time` (Start time) as DateTime if present. + * + * @return \DateTime|null + */ + public function getStartTime() + { + return $this->getField('start_time'); + } + + /** + * Returns the `ticket_uri` (The link users can visit to buy a ticket to this event) as string if present. + * + * @return string|null + */ + public function getTicketUri() + { + return $this->getField('ticket_uri'); + } + + /** + * Returns the `timezone` (Timezone) as string if present. + * + * @return string|null + */ + public function getTimezone() + { + return $this->getField('timezone'); + } + + /** + * Returns the `updated_time` (Last update time) as DateTime if present. + * + * @return \DateTime|null + */ + public function getUpdatedTime() + { + return $this->getField('updated_time'); + } + + /** + * Returns the `picture` (Event picture) as GraphPicture if present. + * + * @return GraphPicture|null + */ + public function getPicture() + { + return $this->getField('picture'); + } + + /** + * Returns the `attending_count` (Number of people attending the event) as int if present. + * + * @return int|null + */ + public function getAttendingCount() + { + return $this->getField('attending_count'); + } + + /** + * Returns the `declined_count` (Number of people who declined the event) as int if present. + * + * @return int|null + */ + public function getDeclinedCount() + { + return $this->getField('declined_count'); + } + + /** + * Returns the `maybe_count` (Number of people who maybe going to the event) as int if present. + * + * @return int|null + */ + public function getMaybeCount() + { + return $this->getField('maybe_count'); + } + + /** + * Returns the `noreply_count` (Number of people who did not reply to the event) as int if present. + * + * @return int|null + */ + public function getNoreplyCount() + { + return $this->getField('noreply_count'); + } + + /** + * Returns the `invited_count` (Number of people invited to the event) as int if present. + * + * @return int|null + */ + public function getInvitedCount() + { + return $this->getField('invited_count'); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphGroup.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphGroup.php new file mode 100755 index 00000000..07a4dbd7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphGroup.php @@ -0,0 +1,171 @@ + '\Facebook\GraphNodes\GraphCoverPhoto', + 'venue' => '\Facebook\GraphNodes\GraphLocation', + ]; + + /** + * Returns the `id` (The Group ID) as string if present. + * + * @return string|null + */ + public function getId() + { + return $this->getField('id'); + } + + /** + * Returns the `cover` (The cover photo of the Group) as GraphCoverPhoto if present. + * + * @return GraphCoverPhoto|null + */ + public function getCover() + { + return $this->getField('cover'); + } + + /** + * Returns the `description` (A brief description of the Group) as string if present. + * + * @return string|null + */ + public function getDescription() + { + return $this->getField('description'); + } + + /** + * Returns the `email` (The email address to upload content to the Group. Only current members of the Group can use this) as string if present. + * + * @return string|null + */ + public function getEmail() + { + return $this->getField('email'); + } + + /** + * Returns the `icon` (The URL for the Group's icon) as string if present. + * + * @return string|null + */ + public function getIcon() + { + return $this->getField('icon'); + } + + /** + * Returns the `link` (The Group's website) as string if present. + * + * @return string|null + */ + public function getLink() + { + return $this->getField('link'); + } + + /** + * Returns the `name` (The name of the Group) as string if present. + * + * @return string|null + */ + public function getName() + { + return $this->getField('name'); + } + + /** + * Returns the `member_request_count` (Number of people asking to join the group.) as int if present. + * + * @return int|null + */ + public function getMemberRequestCount() + { + return $this->getField('member_request_count'); + } + + /** + * Returns the `owner` (The profile that created this Group) as GraphNode if present. + * + * @return GraphNode|null + */ + public function getOwner() + { + return $this->getField('owner'); + } + + /** + * Returns the `parent` (The parent Group of this Group, if it exists) as GraphNode if present. + * + * @return GraphNode|null + */ + public function getParent() + { + return $this->getField('parent'); + } + + /** + * Returns the `privacy` (The privacy setting of the Group) as string if present. + * + * @return string|null + */ + public function getPrivacy() + { + return $this->getField('privacy'); + } + + /** + * Returns the `updated_time` (The last time the Group was updated (this includes changes in the Group's properties and changes in posts and comments if user can see them)) as \DateTime if present. + * + * @return \DateTime|null + */ + public function getUpdatedTime() + { + return $this->getField('updated_time'); + } + + /** + * Returns the `venue` (The location for the Group) as GraphLocation if present. + * + * @return GraphLocation|null + */ + public function getVenue() + { + return $this->getField('venue'); + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphList.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphList.php new file mode 100755 index 00000000..a60a07a7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphList.php @@ -0,0 +1,36 @@ +getField('street'); + } + + /** + * Returns the city component of the location + * + * @return string|null + */ + public function getCity() + { + return $this->getField('city'); + } + + /** + * Returns the state component of the location + * + * @return string|null + */ + public function getState() + { + return $this->getField('state'); + } + + /** + * Returns the country component of the location + * + * @return string|null + */ + public function getCountry() + { + return $this->getField('country'); + } + + /** + * Returns the zipcode component of the location + * + * @return string|null + */ + public function getZip() + { + return $this->getField('zip'); + } + + /** + * Returns the latitude component of the location + * + * @return float|null + */ + public function getLatitude() + { + return $this->getField('latitude'); + } + + /** + * Returns the street component of the location + * + * @return float|null + */ + public function getLongitude() + { + return $this->getField('longitude'); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphNode.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphNode.php new file mode 100755 index 00000000..0d2f504c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphNode.php @@ -0,0 +1,185 @@ +castItems($data)); + } + + /** + * Iterates over an array and detects the types each node + * should be cast to and returns all the items as an array. + * + * @TODO Add auto-casting to AccessToken entities. + * + * @param array $data The array to iterate over. + * + * @return array + */ + public function castItems(array $data) + { + $items = []; + + foreach ($data as $k => $v) { + if ($this->shouldCastAsDateTime($k) + && (is_numeric($v) + || $k === 'birthday' + || $this->isIso8601DateString($v)) + ) { + $items[$k] = $this->castToDateTime($v); + } else { + $items[$k] = $v; + } + } + + return $items; + } + + /** + * Uncasts any auto-casted datatypes. + * Basically the reverse of castItems(). + * + * @return array + */ + public function uncastItems() + { + $items = $this->asArray(); + + return array_map(function ($v) { + if ($v instanceof \DateTime) { + return $v->format(\DateTime::ISO8601); + } + + return $v; + }, $items); + } + + /** + * Get the collection of items as JSON. + * + * @param int $options + * + * @return string + */ + public function asJson($options = 0) + { + return json_encode($this->uncastItems(), $options); + } + + /** + * Detects an ISO 8601 formatted string. + * + * @param string $string + * + * @return boolean + * + * @see https://developers.facebook.com/docs/graph-api/using-graph-api/#readmodifiers + * @see http://www.cl.cam.ac.uk/~mgk25/iso-time.html + * @see http://en.wikipedia.org/wiki/ISO_8601 + */ + public function isIso8601DateString($string) + { + // This insane regex was yoinked from here: + // http://www.pelagodesign.com/blog/2009/05/20/iso-8601-date-validation-that-doesnt-suck/ + // ...and I'm all like: + // http://thecodinglove.com/post/95378251969/when-code-works-and-i-dont-know-why + $crazyInsaneRegexThatSomehowDetectsIso8601 = '/^([\+-]?\d{4}(?!\d{2}\b))' + . '((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?' + . '|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d' + . '|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])' + . '((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d' + . '([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/'; + + return preg_match($crazyInsaneRegexThatSomehowDetectsIso8601, $string) === 1; + } + + /** + * Determines if a value from Graph should be cast to DateTime. + * + * @param string $key + * + * @return boolean + */ + public function shouldCastAsDateTime($key) + { + return in_array($key, [ + 'created_time', + 'updated_time', + 'start_time', + 'end_time', + 'backdated_time', + 'issued_at', + 'expires_at', + 'birthday', + 'publish_time' + ], true); + } + + /** + * Casts a date value from Graph to DateTime. + * + * @param int|string $value + * + * @return \DateTime + */ + public function castToDateTime($value) + { + if (is_int($value)) { + $dt = new \DateTime(); + $dt->setTimestamp($value); + } else { + $dt = new \DateTime($value); + } + + return $dt; + } + + /** + * Getter for $graphObjectMap. + * + * @return array + */ + public static function getObjectMap() + { + return static::$graphObjectMap; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphNodeFactory.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphNodeFactory.php new file mode 100755 index 00000000..e1bedd91 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphNodeFactory.php @@ -0,0 +1,392 @@ +response = $response; + $this->decodedBody = $response->getDecodedBody(); + } + + /** + * Tries to convert a FacebookResponse entity into a GraphNode. + * + * @param string|null $subclassName The GraphNode sub class to cast to. + * + * @return GraphNode + * + * @throws FacebookSDKException + */ + public function makeGraphNode($subclassName = null) + { + $this->validateResponseAsArray(); + $this->validateResponseCastableAsGraphNode(); + + return $this->castAsGraphNodeOrGraphEdge($this->decodedBody, $subclassName); + } + + /** + * Convenience method for creating a GraphAchievement collection. + * + * @return GraphAchievement + * + * @throws FacebookSDKException + */ + public function makeGraphAchievement() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphAchievement'); + } + + /** + * Convenience method for creating a GraphAlbum collection. + * + * @return GraphAlbum + * + * @throws FacebookSDKException + */ + public function makeGraphAlbum() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphAlbum'); + } + + /** + * Convenience method for creating a GraphPage collection. + * + * @return GraphPage + * + * @throws FacebookSDKException + */ + public function makeGraphPage() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphPage'); + } + + /** + * Convenience method for creating a GraphSessionInfo collection. + * + * @return GraphSessionInfo + * + * @throws FacebookSDKException + */ + public function makeGraphSessionInfo() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphSessionInfo'); + } + + /** + * Convenience method for creating a GraphUser collection. + * + * @return GraphUser + * + * @throws FacebookSDKException + */ + public function makeGraphUser() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphUser'); + } + + /** + * Convenience method for creating a GraphEvent collection. + * + * @return GraphEvent + * + * @throws FacebookSDKException + */ + public function makeGraphEvent() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphEvent'); + } + + /** + * Convenience method for creating a GraphGroup collection. + * + * @return GraphGroup + * + * @throws FacebookSDKException + */ + public function makeGraphGroup() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphGroup'); + } + + /** + * Tries to convert a FacebookResponse entity into a GraphEdge. + * + * @param string|null $subclassName The GraphNode sub class to cast the list items to. + * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. + * + * @return GraphEdge + * + * @throws FacebookSDKException + */ + public function makeGraphEdge($subclassName = null, $auto_prefix = true) + { + $this->validateResponseAsArray(); + $this->validateResponseCastableAsGraphEdge(); + + if ($subclassName && $auto_prefix) { + $subclassName = static::BASE_GRAPH_OBJECT_PREFIX . $subclassName; + } + + return $this->castAsGraphNodeOrGraphEdge($this->decodedBody, $subclassName); + } + + /** + * Validates the decoded body. + * + * @throws FacebookSDKException + */ + public function validateResponseAsArray() + { + if (!is_array($this->decodedBody)) { + throw new FacebookSDKException('Unable to get response from Graph as array.', 620); + } + } + + /** + * Validates that the return data can be cast as a GraphNode. + * + * @throws FacebookSDKException + */ + public function validateResponseCastableAsGraphNode() + { + if (isset($this->decodedBody['data']) && static::isCastableAsGraphEdge($this->decodedBody['data'])) { + throw new FacebookSDKException( + 'Unable to convert response from Graph to a GraphNode because the response looks like a GraphEdge. Try using GraphNodeFactory::makeGraphEdge() instead.', + 620 + ); + } + } + + /** + * Validates that the return data can be cast as a GraphEdge. + * + * @throws FacebookSDKException + */ + public function validateResponseCastableAsGraphEdge() + { + if (!(isset($this->decodedBody['data']) && static::isCastableAsGraphEdge($this->decodedBody['data']))) { + throw new FacebookSDKException( + 'Unable to convert response from Graph to a GraphEdge because the response does not look like a GraphEdge. Try using GraphNodeFactory::makeGraphNode() instead.', + 620 + ); + } + } + + /** + * Safely instantiates a GraphNode of $subclassName. + * + * @param array $data The array of data to iterate over. + * @param string|null $subclassName The subclass to cast this collection to. + * + * @return GraphNode + * + * @throws FacebookSDKException + */ + public function safelyMakeGraphNode(array $data, $subclassName = null) + { + $subclassName = $subclassName ?: static::BASE_GRAPH_NODE_CLASS; + static::validateSubclass($subclassName); + + // Remember the parent node ID + $parentNodeId = isset($data['id']) ? $data['id'] : null; + + $items = []; + + foreach ($data as $k => $v) { + // Array means could be recurable + if (is_array($v)) { + // Detect any smart-casting from the $graphObjectMap array. + // This is always empty on the GraphNode collection, but subclasses can define + // their own array of smart-casting types. + $graphObjectMap = $subclassName::getObjectMap(); + $objectSubClass = isset($graphObjectMap[$k]) + ? $graphObjectMap[$k] + : null; + + // Could be a GraphEdge or GraphNode + $items[$k] = $this->castAsGraphNodeOrGraphEdge($v, $objectSubClass, $k, $parentNodeId); + } else { + $items[$k] = $v; + } + } + + return new $subclassName($items); + } + + /** + * Takes an array of values and determines how to cast each node. + * + * @param array $data The array of data to iterate over. + * @param string|null $subclassName The subclass to cast this collection to. + * @param string|null $parentKey The key of this data (Graph edge). + * @param string|null $parentNodeId The parent Graph node ID. + * + * @return GraphNode|GraphEdge + * + * @throws FacebookSDKException + */ + public function castAsGraphNodeOrGraphEdge(array $data, $subclassName = null, $parentKey = null, $parentNodeId = null) + { + if (isset($data['data'])) { + // Create GraphEdge + if (static::isCastableAsGraphEdge($data['data'])) { + return $this->safelyMakeGraphEdge($data, $subclassName, $parentKey, $parentNodeId); + } + // Sometimes Graph is a weirdo and returns a GraphNode under the "data" key + $data = $data['data']; + } + + // Create GraphNode + return $this->safelyMakeGraphNode($data, $subclassName); + } + + /** + * Return an array of GraphNode's. + * + * @param array $data The array of data to iterate over. + * @param string|null $subclassName The GraphNode subclass to cast each item in the list to. + * @param string|null $parentKey The key of this data (Graph edge). + * @param string|null $parentNodeId The parent Graph node ID. + * + * @return GraphEdge + * + * @throws FacebookSDKException + */ + public function safelyMakeGraphEdge(array $data, $subclassName = null, $parentKey = null, $parentNodeId = null) + { + if (!isset($data['data'])) { + throw new FacebookSDKException('Cannot cast data to GraphEdge. Expected a "data" key.', 620); + } + + $dataList = []; + foreach ($data['data'] as $graphNode) { + $dataList[] = $this->safelyMakeGraphNode($graphNode, $subclassName, $parentKey, $parentNodeId); + } + + $metaData = $this->getMetaData($data); + + // We'll need to make an edge endpoint for this in case it's a GraphEdge (for cursor pagination) + $parentGraphEdgeEndpoint = $parentNodeId && $parentKey ? '/' . $parentNodeId . '/' . $parentKey : null; + $className = static::BASE_GRAPH_EDGE_CLASS; + + return new $className($this->response->getRequest(), $dataList, $metaData, $parentGraphEdgeEndpoint, $subclassName); + } + + /** + * Get the meta data from a list in a Graph response. + * + * @param array $data The Graph response. + * + * @return array + */ + public function getMetaData(array $data) + { + unset($data['data']); + + return $data; + } + + /** + * Determines whether or not the data should be cast as a GraphEdge. + * + * @param array $data + * + * @return boolean + */ + public static function isCastableAsGraphEdge(array $data) + { + if ($data === []) { + return true; + } + + // Checks for a sequential numeric array which would be a GraphEdge + return array_keys($data) === range(0, count($data) - 1); + } + + /** + * Ensures that the subclass in question is valid. + * + * @param string $subclassName The GraphNode subclass to validate. + * + * @throws FacebookSDKException + */ + public static function validateSubclass($subclassName) + { + if ($subclassName == static::BASE_GRAPH_NODE_CLASS || is_subclass_of($subclassName, static::BASE_GRAPH_NODE_CLASS)) { + return; + } + + throw new FacebookSDKException('The given subclass "' . $subclassName . '" is not valid. Cannot cast to an object that is not a GraphNode subclass.', 620); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphObject.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphObject.php new file mode 100755 index 00000000..bb8f8e40 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphObject.php @@ -0,0 +1,36 @@ +makeGraphNode($subclassName); + } + + /** + * Convenience method for creating a GraphEvent collection. + * + * @return GraphEvent + * + * @throws FacebookSDKException + */ + public function makeGraphEvent() + { + return $this->makeGraphObject(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphEvent'); + } + + /** + * Tries to convert a FacebookResponse entity into a GraphEdge. + * + * @param string|null $subclassName The GraphNode sub class to cast the list items to. + * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. + * + * @return GraphEdge + * + * @deprecated 5.0.0 GraphObjectFactory has been renamed to GraphNodeFactory + */ + public function makeGraphList($subclassName = null, $auto_prefix = true) + { + return $this->makeGraphEdge($subclassName, $auto_prefix); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphPage.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphPage.php new file mode 100755 index 00000000..ab8e31a6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphPage.php @@ -0,0 +1,125 @@ + '\Facebook\GraphNodes\GraphPage', + 'global_brand_parent_page' => '\Facebook\GraphNodes\GraphPage', + 'location' => '\Facebook\GraphNodes\GraphLocation', + ]; + + /** + * Returns the ID for the user's page as a string if present. + * + * @return string|null + */ + public function getId() + { + return $this->getField('id'); + } + + /** + * Returns the Category for the user's page as a string if present. + * + * @return string|null + */ + public function getCategory() + { + return $this->getField('category'); + } + + /** + * Returns the Name of the user's page as a string if present. + * + * @return string|null + */ + public function getName() + { + return $this->getField('name'); + } + + /** + * Returns the best available Page on Facebook. + * + * @return GraphPage|null + */ + public function getBestPage() + { + return $this->getField('best_page'); + } + + /** + * Returns the brand's global (parent) Page. + * + * @return GraphPage|null + */ + public function getGlobalBrandParentPage() + { + return $this->getField('global_brand_parent_page'); + } + + /** + * Returns the location of this place. + * + * @return GraphLocation|null + */ + public function getLocation() + { + return $this->getField('location'); + } + + /** + * Returns the page access token for the admin user. + * + * Only available in the `/me/accounts` context. + * + * @return string|null + */ + public function getAccessToken() + { + return $this->getField('access_token'); + } + + /** + * Returns the roles of the page admin user. + * + * Only available in the `/me/accounts` context. + * + * @return array|null + */ + public function getPerms() + { + return $this->getField('perms'); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphPicture.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphPicture.php new file mode 100755 index 00000000..bfd37fab --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphPicture.php @@ -0,0 +1,72 @@ +getField('is_silhouette'); + } + + /** + * Returns the url of user picture if it exists + * + * @return string|null + */ + public function getUrl() + { + return $this->getField('url'); + } + + /** + * Returns the width of user picture if it exists + * + * @return int|null + */ + public function getWidth() + { + return $this->getField('width'); + } + + /** + * Returns the height of user picture if it exists + * + * @return int|null + */ + public function getHeight() + { + return $this->getField('height'); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphSessionInfo.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphSessionInfo.php new file mode 100755 index 00000000..3c9e2ff4 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphSessionInfo.php @@ -0,0 +1,102 @@ +getField('app_id'); + } + + /** + * Returns the application name the token was issued for. + * + * @return string|null + */ + public function getApplication() + { + return $this->getField('application'); + } + + /** + * Returns the date & time that the token expires. + * + * @return \DateTime|null + */ + public function getExpiresAt() + { + return $this->getField('expires_at'); + } + + /** + * Returns whether the token is valid. + * + * @return boolean + */ + public function getIsValid() + { + return $this->getField('is_valid'); + } + + /** + * Returns the date & time the token was issued at. + * + * @return \DateTime|null + */ + public function getIssuedAt() + { + return $this->getField('issued_at'); + } + + /** + * Returns the scope permissions associated with the token. + * + * @return array + */ + public function getScopes() + { + return $this->getField('scopes'); + } + + /** + * Returns the login id of the user associated with the token. + * + * @return string|null + */ + public function getUserId() + { + return $this->getField('user_id'); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphUser.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphUser.php new file mode 100755 index 00000000..cb9ddbb5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphUser.php @@ -0,0 +1,162 @@ + '\Facebook\GraphNodes\GraphPage', + 'location' => '\Facebook\GraphNodes\GraphPage', + 'significant_other' => '\Facebook\GraphNodes\GraphUser', + 'picture' => '\Facebook\GraphNodes\GraphPicture', + ]; + + /** + * Returns the ID for the user as a string if present. + * + * @return string|null + */ + public function getId() + { + return $this->getField('id'); + } + + /** + * Returns the name for the user as a string if present. + * + * @return string|null + */ + public function getName() + { + return $this->getField('name'); + } + + /** + * Returns the first name for the user as a string if present. + * + * @return string|null + */ + public function getFirstName() + { + return $this->getField('first_name'); + } + + /** + * Returns the middle name for the user as a string if present. + * + * @return string|null + */ + public function getMiddleName() + { + return $this->getField('middle_name'); + } + + /** + * Returns the last name for the user as a string if present. + * + * @return string|null + */ + public function getLastName() + { + return $this->getField('last_name'); + } + + /** + * Returns the gender for the user as a string if present. + * + * @return string|null + */ + public function getGender() + { + return $this->getField('gender'); + } + + /** + * Returns the Facebook URL for the user as a string if available. + * + * @return string|null + */ + public function getLink() + { + return $this->getField('link'); + } + + /** + * Returns the users birthday, if available. + * + * @return \DateTime|null + */ + public function getBirthday() + { + return $this->getField('birthday'); + } + + /** + * Returns the current location of the user as a GraphPage. + * + * @return GraphPage|null + */ + public function getLocation() + { + return $this->getField('location'); + } + + /** + * Returns the current location of the user as a GraphPage. + * + * @return GraphPage|null + */ + public function getHometown() + { + return $this->getField('hometown'); + } + + /** + * Returns the current location of the user as a GraphUser. + * + * @return GraphUser|null + */ + public function getSignificantOther() + { + return $this->getField('significant_other'); + } + + /** + * Returns the picture of the user as a GraphPicture + * + * @return GraphPicture|null + */ + public function getPicture() + { + return $this->getField('picture'); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookCanvasHelper.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookCanvasHelper.php new file mode 100755 index 00000000..8068526a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookCanvasHelper.php @@ -0,0 +1,52 @@ +signedRequest ? $this->signedRequest->get('app_data') : null; + } + + /** + * Get raw signed request from POST. + * + * @return string|null + */ + public function getRawSignedRequest() + { + return $this->getRawSignedRequestFromPost() ?: null; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookJavaScriptHelper.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookJavaScriptHelper.php new file mode 100755 index 00000000..5d406b53 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookJavaScriptHelper.php @@ -0,0 +1,42 @@ +getRawSignedRequestFromCookie(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookPageTabHelper.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookPageTabHelper.php new file mode 100755 index 00000000..ee43f5e8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookPageTabHelper.php @@ -0,0 +1,95 @@ +signedRequest) { + return; + } + + $this->pageData = $this->signedRequest->get('page'); + } + + /** + * Returns a value from the page data. + * + * @param string $key + * @param mixed|null $default + * + * @return mixed|null + */ + public function getPageData($key, $default = null) + { + if (isset($this->pageData[$key])) { + return $this->pageData[$key]; + } + + return $default; + } + + /** + * Returns true if the user is an admin. + * + * @return boolean + */ + public function isAdmin() + { + return $this->getPageData('admin') === true; + } + + /** + * Returns the page id if available. + * + * @return string|null + */ + public function getPageId() + { + return $this->getPageData('id'); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookRedirectLoginHelper.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookRedirectLoginHelper.php new file mode 100755 index 00000000..144a5b45 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookRedirectLoginHelper.php @@ -0,0 +1,360 @@ +oAuth2Client = $oAuth2Client; + $this->persistentDataHandler = $persistentDataHandler ?: new FacebookSessionPersistentDataHandler(); + $this->urlDetectionHandler = $urlHandler ?: new FacebookUrlDetectionHandler(); + $this->pseudoRandomStringGenerator = $prsg ?: $this->detectPseudoRandomStringGenerator(); + } + + /** + * Returns the persistent data handler. + * + * @return PersistentDataInterface + */ + public function getPersistentDataHandler() + { + return $this->persistentDataHandler; + } + + /** + * Returns the URL detection handler. + * + * @return UrlDetectionInterface + */ + public function getUrlDetectionHandler() + { + return $this->urlDetectionHandler; + } + + /** + * Returns the cryptographically secure pseudo-random string generator. + * + * @return PseudoRandomStringGeneratorInterface + */ + public function getPseudoRandomStringGenerator() + { + return $this->pseudoRandomStringGenerator; + } + + /** + * Detects which pseudo-random string generator to use. + * + * @return PseudoRandomStringGeneratorInterface + * + * @throws FacebookSDKException + */ + public function detectPseudoRandomStringGenerator() + { + // Since openssl_random_pseudo_bytes() can sometimes return non-cryptographically + // secure pseudo-random strings (in rare cases), we check for mcrypt_create_iv() first. + if (function_exists('mcrypt_create_iv')) { + return new McryptPseudoRandomStringGenerator(); + } + + if (function_exists('openssl_random_pseudo_bytes')) { + return new OpenSslPseudoRandomStringGenerator(); + } + + if (!ini_get('open_basedir') && is_readable('/dev/urandom')) { + return new UrandomPseudoRandomStringGenerator(); + } + + throw new FacebookSDKException('Unable to detect a cryptographically secure pseudo-random string generator.'); + } + + /** + * Stores CSRF state and returns a URL to which the user should be sent to in order to continue the login process with Facebook. + * + * @param string $redirectUrl The URL Facebook should redirect users to after login. + * @param array $scope List of permissions to request during login. + * @param array $params An array of parameters to generate URL. + * @param string $separator The separator to use in http_build_query(). + * + * @return string + */ + private function makeUrl($redirectUrl, array $scope, array $params = [], $separator = '&') + { + $state = $this->pseudoRandomStringGenerator->getPseudoRandomString(static::CSRF_LENGTH); + $this->persistentDataHandler->set('state', $state); + + return $this->oAuth2Client->getAuthorizationUrl($redirectUrl, $state, $scope, $params, $separator); + } + + /** + * Returns the URL to send the user in order to login to Facebook. + * + * @param string $redirectUrl The URL Facebook should redirect users to after login. + * @param array $scope List of permissions to request during login. + * @param string $separator The separator to use in http_build_query(). + * + * @return string + */ + public function getLoginUrl($redirectUrl, array $scope = [], $separator = '&') + { + return $this->makeUrl($redirectUrl, $scope, [], $separator); + } + + /** + * Returns the URL to send the user in order to log out of Facebook. + * + * @param AccessToken|string $accessToken The access token that will be logged out. + * @param string $next The url Facebook should redirect the user to after a successful logout. + * @param string $separator The separator to use in http_build_query(). + * + * @return string + * + * @throws FacebookSDKException + */ + public function getLogoutUrl($accessToken, $next, $separator = '&') + { + if (!$accessToken instanceof AccessToken) { + $accessToken = new AccessToken($accessToken); + } + + if ($accessToken->isAppAccessToken()) { + throw new FacebookSDKException('Cannot generate a logout URL with an app access token.', 722); + } + + $params = [ + 'next' => $next, + 'access_token' => $accessToken->getValue(), + ]; + + return 'https://www.facebook.com/logout.php?' . http_build_query($params, null, $separator); + } + + /** + * Returns the URL to send the user in order to login to Facebook with permission(s) to be re-asked. + * + * @param string $redirectUrl The URL Facebook should redirect users to after login. + * @param array $scope List of permissions to request during login. + * @param string $separator The separator to use in http_build_query(). + * + * @return string + */ + public function getReRequestUrl($redirectUrl, array $scope = [], $separator = '&') + { + $params = ['auth_type' => 'rerequest']; + + return $this->makeUrl($redirectUrl, $scope, $params, $separator); + } + + /** + * Returns the URL to send the user in order to login to Facebook with user to be re-authenticated. + * + * @param string $redirectUrl The URL Facebook should redirect users to after login. + * @param array $scope List of permissions to request during login. + * @param string $separator The separator to use in http_build_query(). + * + * @return string + */ + public function getReAuthenticationUrl($redirectUrl, array $scope = [], $separator = '&') + { + $params = ['auth_type' => 'reauthenticate']; + + return $this->makeUrl($redirectUrl, $scope, $params, $separator); + } + + /** + * Takes a valid code from a login redirect, and returns an AccessToken entity. + * + * @param string|null $redirectUrl The redirect URL. + * + * @return AccessToken|null + * + * @throws FacebookSDKException + */ + public function getAccessToken($redirectUrl = null) + { + if (!$code = $this->getCode()) { + return null; + } + + $this->validateCsrf(); + + $redirectUrl = $redirectUrl ?: $this->urlDetectionHandler->getCurrentUrl(); + // At minimum we need to remove the state param + $redirectUrl = FacebookUrlManipulator::removeParamsFromUrl($redirectUrl, ['state']); + + return $this->oAuth2Client->getAccessTokenFromCode($code, $redirectUrl); + } + + /** + * Validate the request against a cross-site request forgery. + * + * @throws FacebookSDKException + */ + protected function validateCsrf() + { + $state = $this->getState(); + $savedState = $this->persistentDataHandler->get('state'); + + if (!$state || !$savedState) { + throw new FacebookSDKException('Cross-site request forgery validation failed. Required param "state" missing.'); + } + + $savedLen = strlen($savedState); + $givenLen = strlen($state); + + if ($savedLen !== $givenLen) { + throw new FacebookSDKException('Cross-site request forgery validation failed. The "state" param from the URL and session do not match.'); + } + + $result = 0; + for ($i = 0; $i < $savedLen; $i++) { + $result |= ord($state[$i]) ^ ord($savedState[$i]); + } + + if ($result !== 0) { + throw new FacebookSDKException('Cross-site request forgery validation failed. The "state" param from the URL and session do not match.'); + } + } + + /** + * Return the code. + * + * @return string|null + */ + protected function getCode() + { + return $this->getInput('code'); + } + + /** + * Return the state. + * + * @return string|null + */ + protected function getState() + { + return $this->getInput('state'); + } + + /** + * Return the error code. + * + * @return string|null + */ + public function getErrorCode() + { + return $this->getInput('error_code'); + } + + /** + * Returns the error. + * + * @return string|null + */ + public function getError() + { + return $this->getInput('error'); + } + + /** + * Returns the error reason. + * + * @return string|null + */ + public function getErrorReason() + { + return $this->getInput('error_reason'); + } + + /** + * Returns the error description. + * + * @return string|null + */ + public function getErrorDescription() + { + return $this->getInput('error_description'); + } + + /** + * Returns a value from a GET param. + * + * @param string $key + * + * @return string|null + */ + private function getInput($key) + { + return isset($_GET[$key]) ? $_GET[$key] : null; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookSignedRequestFromInputHelper.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookSignedRequestFromInputHelper.php new file mode 100755 index 00000000..aafa2464 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookSignedRequestFromInputHelper.php @@ -0,0 +1,166 @@ +app = $app; + $graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION; + $this->oAuth2Client = new OAuth2Client($this->app, $client, $graphVersion); + + $this->instantiateSignedRequest(); + } + + /** + * Instantiates a new SignedRequest entity. + * + * @param string|null + */ + public function instantiateSignedRequest($rawSignedRequest = null) + { + $rawSignedRequest = $rawSignedRequest ?: $this->getRawSignedRequest(); + + if (!$rawSignedRequest) { + return; + } + + $this->signedRequest = new SignedRequest($this->app, $rawSignedRequest); + } + + /** + * Returns an AccessToken entity from the signed request. + * + * @return AccessToken|null + * + * @throws \Facebook\Exceptions\FacebookSDKException + */ + public function getAccessToken() + { + if ($this->signedRequest && $this->signedRequest->hasOAuthData()) { + $code = $this->signedRequest->get('code'); + $accessToken = $this->signedRequest->get('oauth_token'); + + if ($code && !$accessToken) { + return $this->oAuth2Client->getAccessTokenFromCode($code); + } + + $expiresAt = $this->signedRequest->get('expires', 0); + + return new AccessToken($accessToken, $expiresAt); + } + + return null; + } + + /** + * Returns the SignedRequest entity. + * + * @return SignedRequest|null + */ + public function getSignedRequest() + { + return $this->signedRequest; + } + + /** + * Returns the user_id if available. + * + * @return string|null + */ + public function getUserId() + { + return $this->signedRequest ? $this->signedRequest->getUserId() : null; + } + + /** + * Get raw signed request from input. + * + * @return string|null + */ + abstract public function getRawSignedRequest(); + + /** + * Get raw signed request from POST input. + * + * @return string|null + */ + public function getRawSignedRequestFromPost() + { + if (isset($_POST['signed_request'])) { + return $_POST['signed_request']; + } + + return null; + } + + /** + * Get raw signed request from cookie set from the Javascript SDK. + * + * @return string|null + */ + public function getRawSignedRequestFromCookie() + { + if (isset($_COOKIE['fbsr_' . $this->app->getId()])) { + return $_COOKIE['fbsr_' . $this->app->getId()]; + } + + return null; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/GraphRawResponse.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/GraphRawResponse.php new file mode 100755 index 00000000..583d3033 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/GraphRawResponse.php @@ -0,0 +1,137 @@ +httpResponseCode = (int)$httpStatusCode; + } + + if (is_array($headers)) { + $this->headers = $headers; + } else { + $this->setHeadersFromString($headers); + } + + $this->body = $body; + } + + /** + * Return the response headers. + * + * @return array + */ + public function getHeaders() + { + return $this->headers; + } + + /** + * Return the body of the response. + * + * @return string + */ + public function getBody() + { + return $this->body; + } + + /** + * Return the HTTP response code. + * + * @return int + */ + public function getHttpResponseCode() + { + return $this->httpResponseCode; + } + + /** + * Sets the HTTP response code from a raw header. + * + * @param string $rawResponseHeader + */ + public function setHttpResponseCodeFromHeader($rawResponseHeader) + { + preg_match('|HTTP/\d\.\d\s+(\d+)\s+.*|', $rawResponseHeader, $match); + $this->httpResponseCode = (int)$match[1]; + } + + /** + * Parse the raw headers and set as an array. + * + * @param string $rawHeaders The raw headers from the response. + */ + protected function setHeadersFromString($rawHeaders) + { + // Normalize line breaks + $rawHeaders = str_replace("\r\n", "\n", $rawHeaders); + + // There will be multiple headers if a 301 was followed + // or a proxy was followed, etc + $headerCollection = explode("\n\n", trim($rawHeaders)); + // We just want the last response (at the end) + $rawHeader = array_pop($headerCollection); + + $headerComponents = explode("\n", $rawHeader); + foreach ($headerComponents as $line) { + if (strpos($line, ': ') === false) { + $this->setHttpResponseCodeFromHeader($line); + } else { + list($key, $value) = explode(': ', $line); + $this->headers[$key] = $value; + } + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/RequestBodyInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/RequestBodyInterface.php new file mode 100755 index 00000000..97e0a2e8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/RequestBodyInterface.php @@ -0,0 +1,39 @@ +params = $params; + $this->files = $files; + $this->boundary = $boundary ?: uniqid(); + } + + /** + * @inheritdoc + */ + public function getBody() + { + $body = ''; + + // Compile normal params + $params = $this->getNestedParams($this->params); + foreach ($params as $k => $v) { + $body .= $this->getParamString($k, $v); + } + + // Compile files + foreach ($this->files as $k => $v) { + $body .= $this->getFileString($k, $v); + } + + // Peace out + $body .= "--{$this->boundary}--\r\n"; + + return $body; + } + + /** + * Get the boundary + * + * @return string + */ + public function getBoundary() + { + return $this->boundary; + } + + /** + * Get the string needed to transfer a file. + * + * @param string $name + * @param FacebookFile $file + * + * @return string + */ + private function getFileString($name, FacebookFile $file) + { + return sprintf( + "--%s\r\nContent-Disposition: form-data; name=\"%s\"; filename=\"%s\"%s\r\n\r\n%s\r\n", + $this->boundary, + $name, + $file->getFileName(), + $this->getFileHeaders($file), + $file->getContents() + ); + } + + /** + * Get the string needed to transfer a POST field. + * + * @param string $name + * @param string $value + * + * @return string + */ + private function getParamString($name, $value) + { + return sprintf( + "--%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n", + $this->boundary, + $name, + $value + ); + } + + /** + * Returns the params as an array of nested params. + * + * @param array $params + * + * @return array + */ + private function getNestedParams(array $params) + { + $query = http_build_query($params, null, '&'); + $params = explode('&', $query); + $result = []; + + foreach ($params as $param) { + list($key, $value) = explode('=', $param, 2); + $result[urldecode($key)] = urldecode($value); + } + + return $result; + } + + /** + * Get the headers needed before transferring the content of a POST file. + * + * @param FacebookFile $file + * + * @return string + */ + protected function getFileHeaders(FacebookFile $file) + { + return "\r\nContent-Type: {$file->getMimetype()}"; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/RequestBodyUrlEncoded.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/RequestBodyUrlEncoded.php new file mode 100755 index 00000000..77c2b649 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/RequestBodyUrlEncoded.php @@ -0,0 +1,55 @@ +params = $params; + } + + /** + * @inheritdoc + */ + public function getBody() + { + return http_build_query($this->params, null, '&'); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookCurl.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookCurl.php new file mode 100755 index 00000000..e5d124ac --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookCurl.php @@ -0,0 +1,129 @@ +curl = curl_init(); + } + + /** + * Set a curl option + * + * @param $key + * @param $value + */ + public function setopt($key, $value) + { + curl_setopt($this->curl, $key, $value); + } + + /** + * Set an array of options to a curl resource + * + * @param array $options + */ + public function setoptArray(array $options) + { + curl_setopt_array($this->curl, $options); + } + + /** + * Send a curl request + * + * @return mixed + */ + public function exec() + { + return curl_exec($this->curl); + } + + /** + * Return the curl error number + * + * @return int + */ + public function errno() + { + return curl_errno($this->curl); + } + + /** + * Return the curl error message + * + * @return string + */ + public function error() + { + return curl_error($this->curl); + } + + /** + * Get info from a curl reference + * + * @param $type + * + * @return mixed + */ + public function getinfo($type) + { + return curl_getinfo($this->curl, $type); + } + + /** + * Get the currently installed curl version + * + * @return array + */ + public function version() + { + return curl_version(); + } + + /** + * Close the resource connection to curl + */ + public function close() + { + curl_close($this->curl); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookCurlHttpClient.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookCurlHttpClient.php new file mode 100755 index 00000000..955ac062 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookCurlHttpClient.php @@ -0,0 +1,210 @@ +facebookCurl = $facebookCurl ?: new FacebookCurl(); + } + + /** + * @inheritdoc + */ + public function send($url, $method, $body, array $headers, $timeOut) + { + $this->openConnection($url, $method, $body, $headers, $timeOut); + $this->sendRequest(); + + if ($curlErrorCode = $this->facebookCurl->errno()) { + throw new FacebookSDKException($this->facebookCurl->error(), $curlErrorCode); + } + + // Separate the raw headers from the raw body + list($rawHeaders, $rawBody) = $this->extractResponseHeadersAndBody(); + + $this->closeConnection(); + + return new GraphRawResponse($rawHeaders, $rawBody); + } + + /** + * Opens a new curl connection. + * + * @param string $url The endpoint to send the request to. + * @param string $method The request method. + * @param string $body The body of the request. + * @param array $headers The request headers. + * @param int $timeOut The timeout in seconds for the request. + */ + public function openConnection($url, $method, $body, array $headers, $timeOut) + { + $options = [ + CURLOPT_CUSTOMREQUEST => $method, + CURLOPT_HTTPHEADER => $this->compileRequestHeaders($headers), + CURLOPT_URL => $url, + CURLOPT_CONNECTTIMEOUT => 10, + CURLOPT_TIMEOUT => $timeOut, + CURLOPT_RETURNTRANSFER => true, // Follow 301 redirects + CURLOPT_HEADER => true, // Enable header processing + CURLOPT_SSL_VERIFYHOST => 2, + CURLOPT_SSL_VERIFYPEER => true, + CURLOPT_CAINFO => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem', + ]; + + if ($method !== "GET") { + $options[CURLOPT_POSTFIELDS] = $body; + } + + $this->facebookCurl->init(); + $this->facebookCurl->setoptArray($options); + } + + /** + * Closes an existing curl connection + */ + public function closeConnection() + { + $this->facebookCurl->close(); + } + + /** + * Send the request and get the raw response from curl + */ + public function sendRequest() + { + $this->rawResponse = $this->facebookCurl->exec(); + } + + /** + * Compiles the request headers into a curl-friendly format. + * + * @param array $headers The request headers. + * + * @return array + */ + public function compileRequestHeaders(array $headers) + { + $return = []; + + foreach ($headers as $key => $value) { + $return[] = $key . ': ' . $value; + } + + return $return; + } + + /** + * Extracts the headers and the body into a two-part array + * + * @return array + */ + public function extractResponseHeadersAndBody() + { + $headerSize = $this->getHeaderSize(); + + $rawHeaders = mb_substr($this->rawResponse, 0, $headerSize); + $rawBody = mb_substr($this->rawResponse, $headerSize); + + return [trim($rawHeaders), trim($rawBody)]; + } + + /** + * Return proper header size + * + * @return integer + */ + private function getHeaderSize() + { + $headerSize = $this->facebookCurl->getinfo(CURLINFO_HEADER_SIZE); + // This corrects a Curl bug where header size does not account + // for additional Proxy headers. + if ($this->needsCurlProxyFix()) { + // Additional way to calculate the request body size. + if (preg_match('/Content-Length: (\d+)/', $this->rawResponse, $m)) { + $headerSize = mb_strlen($this->rawResponse) - $m[1]; + } elseif (stripos($this->rawResponse, self::CONNECTION_ESTABLISHED) !== false) { + $headerSize += mb_strlen(self::CONNECTION_ESTABLISHED); + } + } + + return $headerSize; + } + + /** + * Detect versions of Curl which report incorrect header lengths when + * using Proxies. + * + * @return boolean + */ + private function needsCurlProxyFix() + { + $ver = $this->facebookCurl->version(); + $version = $ver['version_number']; + + return $version < self::CURL_PROXY_QUIRK_VER; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookGuzzleHttpClient.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookGuzzleHttpClient.php new file mode 100755 index 00000000..6f2a1c6f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookGuzzleHttpClient.php @@ -0,0 +1,97 @@ +guzzleClient = $guzzleClient ?: new Client(); + } + + /** + * @inheritdoc + */ + public function send($url, $method, $body, array $headers, $timeOut) + { + $options = [ + 'headers' => $headers, + 'body' => $body, + 'timeout' => $timeOut, + 'connect_timeout' => 10, + 'verify' => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem', + ]; + $request = $this->guzzleClient->createRequest($method, $url, $options); + + try { + $rawResponse = $this->guzzleClient->send($request); + } catch (RequestException $e) { + $rawResponse = $e->getResponse(); + + if ($e->getPrevious() instanceof RingException || !$rawResponse instanceof ResponseInterface) { + throw new FacebookSDKException($e->getMessage(), $e->getCode()); + } + } + + $rawHeaders = $this->getHeadersAsString($rawResponse); + $rawBody = $rawResponse->getBody(); + $httpStatusCode = $rawResponse->getStatusCode(); + + return new GraphRawResponse($rawHeaders, $rawBody, $httpStatusCode); + } + + /** + * Returns the Guzzle array of headers as a string. + * + * @param ResponseInterface $response The Guzzle response. + * + * @return string + */ + public function getHeadersAsString(ResponseInterface $response) + { + $headers = $response->getHeaders(); + $rawHeaders = []; + foreach ($headers as $name => $values) { + $rawHeaders[] = $name . ": " . implode(", ", $values); + } + + return implode("\r\n", $rawHeaders); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookHttpClientInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookHttpClientInterface.php new file mode 100755 index 00000000..0029bc02 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookHttpClientInterface.php @@ -0,0 +1,47 @@ +stream = stream_context_create($options); + } + + /** + * The response headers from the stream wrapper + * + * @return array|null + */ + public function getResponseHeaders() + { + return $this->responseHeaders; + } + + /** + * Send a stream wrapped request + * + * @param string $url + * + * @return mixed + */ + public function fileGetContents($url) + { + $rawResponse = file_get_contents($url, false, $this->stream); + $this->responseHeaders = $http_response_header; + + return $rawResponse; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookStreamHttpClient.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookStreamHttpClient.php new file mode 100755 index 00000000..b1575143 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookStreamHttpClient.php @@ -0,0 +1,94 @@ +facebookStream = $facebookStream ?: new FacebookStream(); + } + + /** + * @inheritdoc + */ + public function send($url, $method, $body, array $headers, $timeOut) + { + $options = [ + 'http' => [ + 'method' => $method, + 'header' => $this->compileHeader($headers), + 'content' => $body, + 'timeout' => $timeOut, + 'ignore_errors' => true + ], + 'ssl' => [ + 'verify_peer' => true, + 'verify_peer_name' => true, + 'allow_self_signed' => true, // All root certificates are self-signed + 'cafile' => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem', + ], + ]; + + $this->facebookStream->streamContextCreate($options); + $rawBody = $this->facebookStream->fileGetContents($url); + $rawHeaders = $this->facebookStream->getResponseHeaders(); + + if ($rawBody === false || !$rawHeaders) { + throw new FacebookSDKException('Stream returned an empty response', 660); + } + + $rawHeaders = implode("\r\n", $rawHeaders); + + return new GraphRawResponse($rawHeaders, $rawBody); + } + + /** + * Formats the headers for use in the stream wrapper. + * + * @param array $headers The request headers. + * + * @return string + */ + public function compileHeader(array $headers) + { + $header = []; + foreach ($headers as $k => $v) { + $header[] = $k . ': ' . $v; + } + + return implode("\r\n", $header); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/certs/DigiCertHighAssuranceEVRootCA.pem b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/certs/DigiCertHighAssuranceEVRootCA.pem new file mode 100755 index 00000000..9e6810ab --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/certs/DigiCertHighAssuranceEVRootCA.pem @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/FacebookMemoryPersistentDataHandler.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/FacebookMemoryPersistentDataHandler.php new file mode 100755 index 00000000..93a66861 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/FacebookMemoryPersistentDataHandler.php @@ -0,0 +1,53 @@ +sessionData[$key]) ? $this->sessionData[$key] : null; + } + + /** + * @inheritdoc + */ + public function set($key, $value) + { + $this->sessionData[$key] = $value; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/FacebookSessionPersistentDataHandler.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/FacebookSessionPersistentDataHandler.php new file mode 100755 index 00000000..698bfd04 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/FacebookSessionPersistentDataHandler.php @@ -0,0 +1,76 @@ +sessionPrefix . $key])) { + return $_SESSION[$this->sessionPrefix . $key]; + } + + return null; + } + + /** + * @inheritdoc + */ + public function set($key, $value) + { + $_SESSION[$this->sessionPrefix . $key] = $value; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/PersistentDataInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/PersistentDataInterface.php new file mode 100755 index 00000000..bd7e072a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/PersistentDataInterface.php @@ -0,0 +1,49 @@ +validateLength($length); + + $binaryString = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); + + if ($binaryString === false) { + throw new FacebookSDKException( + static::ERROR_MESSAGE . + 'mcrypt_create_iv() returned an error.' + ); + } + + return $this->binToHex($binaryString, $length); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/OpenSslPseudoRandomStringGenerator.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/OpenSslPseudoRandomStringGenerator.php new file mode 100755 index 00000000..f4ea6b87 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/OpenSslPseudoRandomStringGenerator.php @@ -0,0 +1,67 @@ +validateLength($length); + + $wasCryptographicallyStrong = false; + $binaryString = openssl_random_pseudo_bytes($length, $wasCryptographicallyStrong); + + if ($binaryString === false) { + throw new FacebookSDKException(static::ERROR_MESSAGE . 'openssl_random_pseudo_bytes() returned an unknown error.'); + } + + if ($wasCryptographicallyStrong !== true) { + throw new FacebookSDKException(static::ERROR_MESSAGE . 'openssl_random_pseudo_bytes() returned a pseudo-random string but it was not cryptographically secure and cannot be used.'); + } + + return $this->binToHex($binaryString, $length); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/PseudoRandomStringGeneratorInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/PseudoRandomStringGeneratorInterface.php new file mode 100755 index 00000000..970330c8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/PseudoRandomStringGeneratorInterface.php @@ -0,0 +1,45 @@ +validateLength($length); + + $stream = fopen('/dev/urandom', 'rb'); + if (!is_resource($stream)) { + throw new FacebookSDKException( + static::ERROR_MESSAGE . + 'Unable to open stream to /dev/urandom.' + ); + } + + if (!defined('HHVM_VERSION')) { + stream_set_read_buffer($stream, 0); + } + + $binaryString = fread($stream, $length); + fclose($stream); + + if (!$binaryString) { + throw new FacebookSDKException( + static::ERROR_MESSAGE . + 'Stream to /dev/urandom returned no data.' + ); + } + + return $this->binToHex($binaryString, $length); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/SignedRequest.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/SignedRequest.php new file mode 100755 index 00000000..77099a34 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/SignedRequest.php @@ -0,0 +1,332 @@ +app = $facebookApp; + + if (!$rawSignedRequest) { + return; + } + + $this->rawSignedRequest = $rawSignedRequest; + + $this->parse(); + } + + /** + * Returns the raw signed request data. + * + * @return string|null + */ + public function getRawSignedRequest() + { + return $this->rawSignedRequest; + } + + /** + * Returns the parsed signed request data. + * + * @return array|null + */ + public function getPayload() + { + return $this->payload; + } + + /** + * Returns a property from the signed request data if available. + * + * @param string $key + * @param mixed|null $default + * + * @return mixed|null + */ + public function get($key, $default = null) + { + if (isset($this->payload[$key])) { + return $this->payload[$key]; + } + + return $default; + } + + /** + * Returns user_id from signed request data if available. + * + * @return string|null + */ + public function getUserId() + { + return $this->get('user_id'); + } + + /** + * Checks for OAuth data in the payload. + * + * @return boolean + */ + public function hasOAuthData() + { + return $this->get('oauth_token') || $this->get('code'); + } + + /** + * Creates a signed request from an array of data. + * + * @param array $payload + * + * @return string + */ + public function make(array $payload) + { + $payload['algorithm'] = isset($payload['algorithm']) ? $payload['algorithm'] : 'HMAC-SHA256'; + $payload['issued_at'] = isset($payload['issued_at']) ? $payload['issued_at'] : time(); + $encodedPayload = $this->base64UrlEncode(json_encode($payload)); + + $hashedSig = $this->hashSignature($encodedPayload); + $encodedSig = $this->base64UrlEncode($hashedSig); + + return $encodedSig . '.' . $encodedPayload; + } + + /** + * Validates and decodes a signed request and saves + * the payload to an array. + */ + protected function parse() + { + list($encodedSig, $encodedPayload) = $this->split(); + + // Signature validation + $sig = $this->decodeSignature($encodedSig); + $hashedSig = $this->hashSignature($encodedPayload); + $this->validateSignature($hashedSig, $sig); + + $this->payload = $this->decodePayload($encodedPayload); + + // Payload validation + $this->validateAlgorithm(); + } + + /** + * Splits a raw signed request into signature and payload. + * + * @returns array + * + * @throws FacebookSDKException + */ + protected function split() + { + if (strpos($this->rawSignedRequest, '.') === false) { + throw new FacebookSDKException('Malformed signed request.', 606); + } + + return explode('.', $this->rawSignedRequest, 2); + } + + /** + * Decodes the raw signature from a signed request. + * + * @param string $encodedSig + * + * @returns string + * + * @throws FacebookSDKException + */ + protected function decodeSignature($encodedSig) + { + $sig = $this->base64UrlDecode($encodedSig); + + if (!$sig) { + throw new FacebookSDKException('Signed request has malformed encoded signature data.', 607); + } + + return $sig; + } + + /** + * Decodes the raw payload from a signed request. + * + * @param string $encodedPayload + * + * @returns array + * + * @throws FacebookSDKException + */ + protected function decodePayload($encodedPayload) + { + $payload = $this->base64UrlDecode($encodedPayload); + + if ($payload) { + $payload = json_decode($payload, true); + } + + if (!is_array($payload)) { + throw new FacebookSDKException('Signed request has malformed encoded payload data.', 607); + } + + return $payload; + } + + /** + * Validates the algorithm used in a signed request. + * + * @throws FacebookSDKException + */ + protected function validateAlgorithm() + { + if ($this->get('algorithm') !== 'HMAC-SHA256') { + throw new FacebookSDKException('Signed request is using the wrong algorithm.', 605); + } + } + + /** + * Hashes the signature used in a signed request. + * + * @param string $encodedData + * + * @return string + * + * @throws FacebookSDKException + */ + protected function hashSignature($encodedData) + { + $hashedSig = hash_hmac( + 'sha256', + $encodedData, + $this->app->getSecret(), + $raw_output = true + ); + + if (!$hashedSig) { + throw new FacebookSDKException('Unable to hash signature from encoded payload data.', 602); + } + + return $hashedSig; + } + + /** + * Validates the signature used in a signed request. + * + * @param string $hashedSig + * @param string $sig + * + * @throws FacebookSDKException + */ + protected function validateSignature($hashedSig, $sig) + { + if (mb_strlen($hashedSig) === mb_strlen($sig)) { + $validate = 0; + for ($i = 0; $i < mb_strlen($sig); $i++) { + $validate |= ord($hashedSig[$i]) ^ ord($sig[$i]); + } + if ($validate === 0) { + return; + } + } + + throw new FacebookSDKException('Signed request has an invalid signature.', 602); + } + + /** + * Base64 decoding which replaces characters: + * + instead of - + * / instead of _ + * + * @link http://en.wikipedia.org/wiki/Base64#URL_applications + * + * @param string $input base64 url encoded input + * + * @return string decoded string + */ + public function base64UrlDecode($input) + { + $urlDecodedBase64 = strtr($input, '-_', '+/'); + $this->validateBase64($urlDecodedBase64); + + return base64_decode($urlDecodedBase64); + } + + /** + * Base64 encoding which replaces characters: + * + instead of - + * / instead of _ + * + * @link http://en.wikipedia.org/wiki/Base64#URL_applications + * + * @param string $input string to encode + * + * @return string base64 url encoded input + */ + public function base64UrlEncode($input) + { + return strtr(base64_encode($input), '+/', '-_'); + } + + /** + * Validates a base64 string. + * + * @param string $input base64 value to validate + * + * @throws FacebookSDKException + */ + protected function validateBase64($input) + { + if (!preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $input)) { + throw new FacebookSDKException('Signed request contains malformed base64 encoding.', 608); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/FacebookUrlDetectionHandler.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/FacebookUrlDetectionHandler.php new file mode 100755 index 00000000..5fbb9ce4 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/FacebookUrlDetectionHandler.php @@ -0,0 +1,163 @@ +getHttpScheme() . '://' . $this->getHostName() . $this->getServerVar('REQUEST_URI'); + } + + /** + * Get the currently active URL scheme. + * + * @return string + */ + protected function getHttpScheme() + { + return $this->isBehindSsl() ? 'https' : 'http'; + } + + /** + * Tries to detect if the server is running behind an SSL. + * + * @return boolean + */ + protected function isBehindSsl() + { + // Check for proxy first + $protocol = $this->getHeader('X_FORWARDED_PROTO'); + if ($protocol) { + return $this->protocolWithActiveSsl($protocol); + } + + $protocol = $this->getServerVar('HTTPS'); + if ($protocol) { + return $this->protocolWithActiveSsl($protocol); + } + + return (string)$this->getServerVar('SERVER_PORT') === '443'; + } + + /** + * Detects an active SSL protocol value. + * + * @param string $protocol + * + * @return boolean + */ + protected function protocolWithActiveSsl($protocol) + { + $protocol = strtolower((string)$protocol); + + return in_array($protocol, ['on', '1', 'https', 'ssl'], true); + } + + /** + * Tries to detect the host name of the server. + * + * Some elements adapted from + * + * @see https://github.com/symfony/HttpFoundation/blob/master/Request.php + * + * @return string + */ + protected function getHostName() + { + // Check for proxy first + if ($host = $this->getHeader('X_FORWARDED_HOST')) { + $elements = explode(',', $host); + $host = $elements[count($elements) - 1]; + } elseif (!$host = $this->getHeader('HOST')) { + if (!$host = $this->getServerVar('SERVER_NAME')) { + $host = $this->getServerVar('SERVER_ADDR'); + } + } + + // trim and remove port number from host + // host is lowercase as per RFC 952/2181 + $host = strtolower(preg_replace('/:\d+$/', '', trim($host))); + + // Port number + $scheme = $this->getHttpScheme(); + $port = $this->getCurrentPort(); + $appendPort = ':' . $port; + + // Don't append port number if a normal port. + if (($scheme == 'http' && $port == '80') || ($scheme == 'https' && $port == '443')) { + $appendPort = ''; + } + + return $host . $appendPort; + } + + protected function getCurrentPort() + { + // Check for proxy first + $port = $this->getHeader('X_FORWARDED_PORT'); + if ($port) { + return (string)$port; + } + + $protocol = (string)$this->getHeader('X_FORWARDED_PROTO'); + if ($protocol === 'https') { + return '443'; + } + + return (string)$this->getServerVar('SERVER_PORT'); + } + + /** + * Returns the a value from the $_SERVER super global. + * + * @param string $key + * + * @return string + */ + protected function getServerVar($key) + { + return isset($_SERVER[$key]) ? $_SERVER[$key] : ''; + } + + /** + * Gets a value from the HTTP request headers. + * + * @param string $key + * + * @return string + */ + protected function getHeader($key) + { + return $this->getServerVar('HTTP_' . $key); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/FacebookUrlManipulator.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/FacebookUrlManipulator.php new file mode 100755 index 00000000..20a0299e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/FacebookUrlManipulator.php @@ -0,0 +1,167 @@ + 0) { + $query = '?' . http_build_query($params, null, '&'); + } + } + + $scheme = isset($parts['scheme']) ? $parts['scheme'] . '://' : ''; + $host = isset($parts['host']) ? $parts['host'] : ''; + $port = isset($parts['port']) ? ':' . $parts['port'] : ''; + $path = isset($parts['path']) ? $parts['path'] : ''; + $fragment = isset($parts['fragment']) ? '#' . $parts['fragment'] : ''; + + return $scheme . $host . $port . $path . $query . $fragment; + } + + /** + * Gracefully appends params to the URL. + * + * @param string $url The URL that will receive the params. + * @param array $newParams The params to append to the URL. + * + * @return string + */ + public static function appendParamsToUrl($url, array $newParams = []) + { + if (!$newParams) { + return $url; + } + + if (strpos($url, '?') === false) { + return $url . '?' . http_build_query($newParams, null, '&'); + } + + list($path, $query) = explode('?', $url, 2); + $existingParams = []; + parse_str($query, $existingParams); + + // Favor params from the original URL over $newParams + $newParams = array_merge($newParams, $existingParams); + + // Sort for a predicable order + ksort($newParams); + + return $path . '?' . http_build_query($newParams, null, '&'); + } + + /** + * Returns the params from a URL in the form of an array. + * + * @param string $url The URL to parse the params from. + * + * @return array + */ + public static function getParamsAsArray($url) + { + $query = parse_url($url, PHP_URL_QUERY); + if (!$query) { + return []; + } + $params = []; + parse_str($query, $params); + + return $params; + } + + /** + * Adds the params of the first URL to the second URL. + * + * Any params that already exist in the second URL will go untouched. + * + * @param string $urlToStealFrom The URL harvest the params from. + * @param string $urlToAddTo The URL that will receive the new params. + * + * @return string The $urlToAddTo with any new params from $urlToStealFrom. + */ + public static function mergeUrlParams($urlToStealFrom, $urlToAddTo) + { + $newParams = static::getParamsAsArray($urlToStealFrom); + // Nothing new to add, return as-is + if (!$newParams) { + return $urlToAddTo; + } + + return static::appendParamsToUrl($urlToAddTo, $newParams); + } + + /** + * Check for a "/" prefix and prepend it if not exists. + * + * @param string|null $string + * + * @return string|null + */ + public static function forceSlashPrefix($string) + { + if (!$string) { + return $string; + } + + return strpos($string, '/') === 0 ? $string : '/' . $string; + } + + /** + * Trims off the hostname and Graph version from a URL. + * + * @param string $urlToTrim The URL the needs the surgery. + * + * @return string The $urlToTrim with the hostname and Graph version removed. + */ + public static function baseGraphUrlEndpoint($urlToTrim) + { + return '/' . preg_replace('/^https:\/\/.+\.facebook\.com(\/v.+?)?\//', '', $urlToTrim); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/UrlDetectionInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/UrlDetectionInterface.php new file mode 100755 index 00000000..764a606e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/UrlDetectionInterface.php @@ -0,0 +1,39 @@ +multi = $multiHandle; + $this->handles = new \SplObjectStorage(); + $this->throwsExceptions = $throwsExceptions; + $this->pending = $pending; + } + + /** + * Find a transaction for a given curl handle + * + * @param resource $handle Curl handle + * + * @return TransactionInterface + * @throws AdapterException if a transaction is not found + */ + public function findTransaction($handle) + { + foreach ($this->handles as $transaction) { + if ($this->handles[$transaction] === $handle) { + return $transaction; + } + } + + throw new AdapterException('No curl handle was found'); + } + + /** + * Returns true if there are any remaining pending transactions + * + * @return bool + */ + public function hasPending() + { + return $this->pending && $this->pending->valid(); + } + + /** + * Pop the next transaction from the transaction queue + * + * @return TransactionInterface|null + */ + public function nextPending() + { + if (!$this->hasPending()) { + return null; + } + + $current = $this->pending->current(); + $this->pending->next(); + + return $current; + } + + /** + * Checks if the batch is to throw exceptions on error + * + * @return bool + */ + public function throwsExceptions() + { + return $this->throwsExceptions; + } + + /** + * Get the curl_multi handle + * + * @return resource + */ + public function getMultiHandle() + { + return $this->multi; + } + + /** + * Add a transaction to the multi handle + * + * @param TransactionInterface $transaction Transaction to add + * @param resource $handle Resource to use with the handle + * + * @throws AdapterException If the handle is already registered + */ + public function addTransaction(TransactionInterface $transaction, $handle) + { + if (isset($this->handles[$transaction])) { + throw new AdapterException('Transaction already registered'); + } + + $code = curl_multi_add_handle($this->multi, $handle); + if ($code != CURLM_OK) { + MultiAdapter::throwMultiError($code); + } + + $this->handles[$transaction] = $handle; + } + + /** + * Remove a transaction and associated handle from the context + * + * @param TransactionInterface $transaction Transaction to remove + * + * @return array Returns the curl_getinfo array + * @throws AdapterException if the transaction is not found + */ + public function removeTransaction(TransactionInterface $transaction) + { + if (!isset($this->handles[$transaction])) { + throw new AdapterException('Transaction not registered'); + } + + $handle = $this->handles[$transaction]; + + $code = curl_multi_remove_handle($this->multi, $handle); + if ($code != CURLM_OK) { + MultiAdapter::throwMultiError($code); + } + + $info = curl_getinfo($handle); + curl_close($handle); + unset($this->handles[$transaction]); + + return $info; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlAdapter.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlAdapter.php new file mode 100755 index 00000000..0f120353 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlAdapter.php @@ -0,0 +1,142 @@ +handles = $this->ownedHandles = []; + $this->messageFactory = $messageFactory; + $this->curlFactory = isset($options['handle_factory']) + ? $options['handle_factory'] + : new CurlFactory(); + $this->maxHandles = isset($options['max_handles']) + ? $options['max_handles'] + : 5; + } + + public function __destruct() + { + foreach ($this->handles as $handle) { + if (is_resource($handle)) { + curl_close($handle); + } + } + } + + public function send(TransactionInterface $transaction) + { + RequestEvents::emitBefore($transaction); + if ($response = $transaction->getResponse()) { + return $response; + } + + $factory = $this->curlFactory; + $handle = $factory( + $transaction, + $this->messageFactory, + $this->checkoutEasyHandle() + ); + + curl_exec($handle); + $info = curl_getinfo($handle); + $info['curl_result'] = curl_errno($handle); + + if ($info['curl_result']) { + $this->handleError($transaction, $info, $handle); + } else { + $this->releaseEasyHandle($handle); + RequestEvents::emitComplete($transaction, $info); + } + + return $transaction->getResponse(); + } + + private function handleError( + TransactionInterface $transaction, + $info, + $handle + ) { + $error = curl_error($handle); + $this->releaseEasyHandle($handle); + RequestEvents::emitError( + $transaction, + new AdapterException("cURL error {$info['curl_result']}: {$error}"), + $info + ); + } + + private function checkoutEasyHandle() + { + // Find an unused handle in the cache + if (false !== ($key = array_search(false, $this->ownedHandles, true))) { + $this->ownedHandles[$key] = true; + return $this->handles[$key]; + } + + // Add a new handle + $handle = curl_init(); + $id = (int) $handle; + $this->handles[$id] = $handle; + $this->ownedHandles[$id] = true; + + return $handle; + } + + private function releaseEasyHandle($handle) + { + $id = (int) $handle; + if (count($this->ownedHandles) > $this->maxHandles) { + curl_close($this->handles[$id]); + unset($this->handles[$id], $this->ownedHandles[$id]); + } else { + curl_reset($handle); + $this->ownedHandles[$id] = false; + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlFactory.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlFactory.php new file mode 100755 index 00000000..f1cb393a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlFactory.php @@ -0,0 +1,331 @@ +getRequest(); + $mediator = new RequestMediator($transaction, $messageFactory); + $options = $this->getDefaultOptions($request, $mediator); + $this->applyMethod($request, $options); + $this->applyTransferOptions($request, $mediator, $options); + $this->applyHeaders($request, $options); + unset($options['_headers']); + + // Add adapter options from the request's configuration options + if ($config = $request->getConfig()['curl']) { + $options = $this->applyCustomCurlOptions($config, $options); + } + + if (!$handle) { + $handle = curl_init(); + } + + curl_setopt_array($handle, $options); + + return $handle; + } + + protected function getDefaultOptions( + RequestInterface $request, + RequestMediator $mediator + ) { + $url = $request->getUrl(); + + // Strip fragment from URL. See: + // https://github.com/guzzle/guzzle/issues/453 + if (($pos = strpos($url, '#')) !== false) { + $url = substr($url, 0, $pos); + } + + $config = $request->getConfig(); + $options = array( + CURLOPT_URL => $url, + CURLOPT_CONNECTTIMEOUT => $config['connect_timeout'] ?: 150, + CURLOPT_RETURNTRANSFER => false, + CURLOPT_HEADER => false, + CURLOPT_WRITEFUNCTION => array($mediator, 'writeResponseBody'), + CURLOPT_HEADERFUNCTION => array($mediator, 'receiveResponseHeader'), + CURLOPT_READFUNCTION => array($mediator, 'readRequestBody'), + CURLOPT_HTTP_VERSION => $request->getProtocolVersion() === '1.0' + ? CURL_HTTP_VERSION_1_0 : CURL_HTTP_VERSION_1_1, + CURLOPT_SSL_VERIFYPEER => 1, + CURLOPT_SSL_VERIFYHOST => 2, + '_headers' => $request->getHeaders() + ); + + if (defined('CURLOPT_PROTOCOLS')) { + // Allow only HTTP and HTTPS protocols + $options[CURLOPT_PROTOCOLS] = CURLPROTO_HTTP | CURLPROTO_HTTPS; + } + + // Add CURLOPT_ENCODING if Accept-Encoding header is provided + if ($request->hasHeader('Accept-Encoding')) { + $options[CURLOPT_ENCODING] = $request->getHeader('Accept-Encoding'); + // Let cURL set the Accept-Encoding header. Without this change + // curl could add a duplicate value. + $this->removeHeader('Accept-Encoding', $options); + } + + return $options; + } + + private function applyMethod(RequestInterface $request, array &$options) + { + $method = $request->getMethod(); + if ($method == 'HEAD') { + $options[CURLOPT_NOBODY] = true; + unset($options[CURLOPT_WRITEFUNCTION], $options[CURLOPT_READFUNCTION]); + } else { + $options[CURLOPT_CUSTOMREQUEST] = $method; + if (!$request->getBody()) { + unset($options[CURLOPT_READFUNCTION]); + } else { + $this->applyBody($request, $options); + } + } + } + + private function applyBody(RequestInterface $request, array &$options) + { + if ($request->hasHeader('Content-Length')) { + $size = (int) $request->getHeader('Content-Length'); + } else { + $size = null; + } + + $request->getBody()->seek(0); + + // You can send the body as a string using curl's CURLOPT_POSTFIELDS + if (($size !== null && $size < 32768) || + isset($request->getConfig()['curl']['body_as_string']) + ) { + $options[CURLOPT_POSTFIELDS] = $request->getBody()->getContents(); + // Don't duplicate the Content-Length header + $this->removeHeader('Content-Length', $options); + $this->removeHeader('Transfer-Encoding', $options); + } else { + $options[CURLOPT_UPLOAD] = true; + // Let cURL handle setting the Content-Length header + if ($size !== null) { + $options[CURLOPT_INFILESIZE] = $size; + $this->removeHeader('Content-Length', $options); + } + } + + // If the Expect header is not present, prevent curl from adding it + if (!$request->hasHeader('Expect')) { + $options[CURLOPT_HTTPHEADER][] = 'Expect:'; + } + } + + private function applyHeaders(RequestInterface $request, array &$options) + { + foreach ($options['_headers'] as $name => $values) { + $options[CURLOPT_HTTPHEADER][] = $name . ': ' . implode(', ', $values); + } + + // Remove the Expect header if one was not set + if (!$request->hasHeader('Accept')) { + $options[CURLOPT_HTTPHEADER][] = 'Accept:'; + } + } + + private function applyTransferOptions( + RequestInterface $request, + RequestMediator $mediator, + array &$options + ) { + static $methods; + if (!$methods) { + $methods = array_flip(get_class_methods(__CLASS__)); + } + + foreach ($request->getConfig()->toArray() as $key => $value) { + $method = "add_{$key}"; + if (isset($methods[$method])) { + $this->{$method}($request, $mediator, $options, $value); + } + } + } + + private function add_debug( + RequestInterface $request, + RequestMediator $mediator, + &$options, + $value + ) { + if ($value) { + $options[CURLOPT_STDERR] = is_resource($value) ? $value : STDOUT; + $options[CURLOPT_VERBOSE] = true; + } + } + + private function add_proxy( + RequestInterface $request, + RequestMediator $mediator, + &$options, + $value + ) { + if (!is_array($value)) { + $options[CURLOPT_PROXY] = $value; + } else { + $scheme = $request->getScheme(); + if (isset($value[$scheme])) { + $options[CURLOPT_PROXY] = $value[$scheme]; + } + } + } + + private function add_timeout( + RequestInterface $request, + RequestMediator $mediator, + &$options, + $value + ) { + $options[CURLOPT_TIMEOUT_MS] = $value * 1000; + } + + private function add_connect_timeout( + RequestInterface $request, + RequestMediator $mediator, + &$options, + $value + ) { + $options[CURLOPT_CONNECTTIMEOUT_MS] = $value * 1000; + } + + private function add_verify( + RequestInterface $request, + RequestMediator $mediator, + &$options, + $value + ) { + if ($value === false) { + unset($options[CURLOPT_CAINFO]); + $options[CURLOPT_SSL_VERIFYHOST] = 0; + $options[CURLOPT_SSL_VERIFYPEER] = false; + } elseif ($value === true || is_string($value)) { + $options[CURLOPT_SSL_VERIFYHOST] = 2; + $options[CURLOPT_SSL_VERIFYPEER] = true; + if ($value !== true) { + if (!file_exists($value)) { + throw new AdapterException('SSL certificate authority file' + . " not found: {$value}"); + } + $options[CURLOPT_CAINFO] = $value; + } + } + } + + private function add_cert( + RequestInterface $request, + RequestMediator $mediator, + &$options, + $value + ) { + if (!file_exists($value)) { + throw new AdapterException("SSL certificate not found: {$value}"); + } + + $options[CURLOPT_SSLCERT] = $value; + } + + private function add_ssl_key( + RequestInterface $request, + RequestMediator $mediator, + &$options, + $value + ) { + if (is_array($value)) { + $options[CURLOPT_SSLKEYPASSWD] = $value[1]; + $value = $value[0]; + } + + if (!file_exists($value)) { + throw new AdapterException("SSL private key not found: {$value}"); + } + + $options[CURLOPT_SSLKEY] = $value; + } + + private function add_save_to( + RequestInterface $request, + RequestMediator $mediator, + &$options, + $value + ) { + $mediator->setResponseBody(is_string($value) + ? Stream\create(fopen($value, 'w')) + : Stream\create($value)); + } + + /** + * Takes an array of curl options specified in the 'curl' option of a + * request's configuration array and maps them to CURLOPT_* options. + * + * This method is only called when a request has a 'curl' config setting. + * Array key strings that start with CURL that have a matching constant + * value will be automatically converted to the matching constant. + * + * @param array $config Configuration array of custom curl option + * @param array $options Array of existing curl options + * + * @return array Returns a new array of curl options + */ + private function applyCustomCurlOptions(array $config, array $options) + { + unset($config['body_as_string']); + $curlOptions = []; + + // Map curl constant strings to defined values + foreach ($config as $key => $value) { + if (defined($key) && substr($key, 0, 4) === 'CURL') { + $key = constant($key); + } + $curlOptions[$key] = $value; + } + + return $curlOptions + $options; + } + + /** + * Remove a header from the options array + * + * @param string $name Case-insensitive header to remove + * @param array $options Array of options to modify + */ + private function removeHeader($name, array &$options) + { + foreach (array_keys($options['_headers']) as $key) { + if (!strcasecmp($key, $name)) { + unset($options['_headers'][$key]); + return; + } + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/MultiAdapter.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/MultiAdapter.php new file mode 100755 index 00000000..30645956 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/MultiAdapter.php @@ -0,0 +1,284 @@ +messageFactory = $messageFactory; + $this->curlFactory = isset($options['handle_factory']) + ? $options['handle_factory'] + : new CurlFactory(); + + if (isset($options['select_timeout'])) { + $this->selectTimeout = $options['select_timeout']; + } elseif (isset($_SERVER[self::ENV_SELECT_TIMEOUT])) { + $this->selectTimeout = $_SERVER[self::ENV_SELECT_TIMEOUT]; + } else { + $this->selectTimeout = 1; + } + } + + public function __destruct() + { + foreach ($this->multiHandles as $handle) { + if (is_resource($handle)) { + curl_multi_close($handle); + } + } + } + + /** + * Throw an exception for a cURL multi response + * + * @param int $code Curl response code + * @throws AdapterException + */ + public static function throwMultiError($code) + { + $buffer = function_exists('curl_multi_strerror') + ? curl_multi_strerror($code) + : self::ERROR_STR; + + throw new AdapterException(sprintf('cURL error %s: %s', $code, $buffer)); + } + + public function send(TransactionInterface $transaction) + { + $context = new BatchContext($this->checkoutMultiHandle(), true); + $this->addHandle($transaction, $context); + $this->perform($context); + + return $transaction->getResponse(); + } + + public function sendAll(\Iterator $transactions, $parallel) + { + $context = new BatchContext( + $this->checkoutMultiHandle(), + false, + $transactions + ); + + foreach (new \LimitIterator($transactions, 0, $parallel) as $trans) { + $this->addHandle($trans, $context); + } + + $this->perform($context); + } + + private function perform(BatchContext $context) + { + // The first curl_multi_select often times out no matter what, but is + // usually required for fast transfers. + $active = false; + $multi = $context->getMultiHandle(); + + do { + while (($mrc = curl_multi_exec($multi, $active)) == CURLM_CALL_MULTI_PERFORM); + if ($mrc != CURLM_OK && $mrc != CURLM_CALL_MULTI_PERFORM) { + self::throwMultiError($mrc); + } + // Need to check if there are pending transactions before processing + // them so that we don't bail from the loop too early. + $pending = $context->hasPending(); + $this->processMessages($context); + if ($active && curl_multi_select($multi, $this->selectTimeout) === -1) { + // Perform a usleep if a select returns -1. + // See: https://bugs.php.net/bug.php?id=61141 + usleep(250); + } + } while ($active || $pending); + + $this->releaseMultiHandle($multi); + } + + private function processMessages(BatchContext $context) + { + $multi = $context->getMultiHandle(); + + while ($done = curl_multi_info_read($multi)) { + $transaction = $context->findTransaction($done['handle']); + $this->processResponse($transaction, $done, $context); + // Add the next transaction if there are more in the queue + if ($next = $context->nextPending()) { + $this->addHandle($next, $context); + } + } + } + + private function processResponse( + TransactionInterface $transaction, + array $curl, + BatchContext $context + ) { + $info = $context->removeTransaction($transaction); + + try { + if (!$this->isCurlException($transaction, $curl, $context, $info)) { + RequestEvents::emitComplete($transaction, $info); + } + } catch (RequestException $e) { + $this->throwException($e, $context); + } + } + + private function addHandle( + TransactionInterface $transaction, + BatchContext $context + ) { + try { + RequestEvents::emitBefore($transaction); + // Only transfer if the request was not intercepted + if (!$transaction->getResponse()) { + $factory = $this->curlFactory; + $context->addTransaction( + $transaction, + $factory($transaction, $this->messageFactory) + ); + } + } catch (RequestException $e) { + $this->throwException($e, $context); + } + } + + private function isCurlException( + TransactionInterface $transaction, + array $curl, + BatchContext $context, + array $info + ) { + if (CURLM_OK == $curl['result'] || + CURLM_CALL_MULTI_PERFORM == $curl['result'] + ) { + return false; + } + + $request = $transaction->getRequest(); + try { + // Send curl stats along if they are available + $stats = ['curl_result' => $curl['result']] + $info; + RequestEvents::emitError( + $transaction, + new RequestException( + sprintf( + '[curl] (#%s) %s [url] %s', + $curl['result'], + function_exists('curl_strerror') + ? curl_strerror($curl['result']) + : self::ERROR_STR, + $request->getUrl() + ), + $request + ), + $stats + ); + } catch (RequestException $e) { + $this->throwException($e, $context); + } + + return true; + } + + private function throwException(RequestException $e, BatchContext $context) + { + if ($context->throwsExceptions()) { + $this->releaseMultiHandle($context->getMultiHandle()); + throw $e; + } + } + + /** + * Returns a curl_multi handle from the cache or creates a new one + * + * @return resource + */ + private function checkoutMultiHandle() + { + // Find an unused handle in the cache + $key = array_search(false, $this->multiOwned, true); + if (false !== $key) { + $this->multiOwned[$key] = true; + return $this->multiHandles[$key]; + } + + // Add a new handle + $handle = curl_multi_init(); + $id = (int) $handle; + $this->multiHandles[$id] = $handle; + $this->multiOwned[$id] = true; + + return $handle; + } + + /** + * Releases a curl_multi handle back into the cache and removes excess cache + * + * @param resource $handle Curl multi handle to remove + */ + private function releaseMultiHandle($handle) + { + $id = (int) $handle; + + if (count($this->multiHandles) <= 3) { + $this->multiOwned[$id] = false; + } else { + // Prune excessive handles + curl_multi_close($this->multiHandles[$id]); + unset($this->multiHandles[$id], $this->multiOwned[$id]); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/RequestMediator.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/RequestMediator.php new file mode 100755 index 00000000..19cbcfd0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/RequestMediator.php @@ -0,0 +1,130 @@ +transaction = $transaction; + $this->messageFactory = $messageFactory; + } + + /** + * Set the body that will hold the response body + * + * @param StreamInterface $body Response body + */ + public function setResponseBody(StreamInterface $body = null) + { + $this->body = $body; + } + + /** + * Receive a response header from curl + * + * @param resource $curl Curl handle + * @param string $header Received header + * + * @return int + */ + public function receiveResponseHeader($curl, $header) + { + static $normalize = ["\r", "\n"]; + $length = strlen($header); + $header = str_replace($normalize, '', $header); + + if (strpos($header, 'HTTP/') === 0) { + $startLine = explode(' ', $header, 3); + // Only download the body to a target body when a successful + // response is received. + if ($startLine[1][0] != '2') { + $this->body = null; + } + $this->statusCode = $startLine[1]; + $this->reasonPhrase = isset($startLine[2]) ? $startLine[2] : null; + $this->protocolVersion = substr($startLine[0], -3); + $this->headers = []; + } elseif ($pos = strpos($header, ':')) { + $this->headers[substr($header, 0, $pos)][] = substr($header, $pos + 1); + } elseif ($header == '' && $this->statusCode >= 200) { + $response = $this->messageFactory->createResponse( + $this->statusCode, + $this->headers, + $this->body, + [ + 'protocol_version' => $this->protocolVersion, + 'reason_phrase' => $this->reasonPhrase + ] + ); + $this->headers = $this->body = null; + $this->transaction->setResponse($response); + // Allows events to react before downloading any of the body + RequestEvents::emitHeaders($this->transaction); + } + + return $length; + } + + /** + * Write data to the response body of a request + * + * @param resource $curl + * @param string $write + * + * @return int + */ + public function writeResponseBody($curl, $write) + { + if (!($response = $this->transaction->getResponse())) { + return 0; + } + + // Add a default body on the response if one was not found + if (!($body = $response->getBody())) { + $body = new Stream(fopen('php://temp', 'r+')); + $response->setBody($body); + } + + return $body->write($write); + } + + /** + * Read data from the request body and send it to curl + * + * @param resource $ch Curl handle + * @param resource $fd File descriptor + * @param int $length Amount of data to read + * + * @return string + */ + public function readRequestBody($ch, $fd, $length) + { + return (string) $this->transaction->getRequest()->getBody()->read($length); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/FakeParallelAdapter.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/FakeParallelAdapter.php new file mode 100755 index 00000000..30265683 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/FakeParallelAdapter.php @@ -0,0 +1,34 @@ +adapter = $adapter; + } + + public function sendAll(\Iterator $transactions, $parallel) + { + foreach ($transactions as $transaction) { + try { + $this->adapter->send($transaction); + } catch (RequestException $e) { + // no op for batch transaction + } + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/MockAdapter.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/MockAdapter.php new file mode 100755 index 00000000..3e8020e6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/MockAdapter.php @@ -0,0 +1,60 @@ +setResponse($response); + } + + /** + * Set the response that will be served by the adapter + * + * @param ResponseInterface|callable $response Response to serve or + * function to invoke that handles a transaction + */ + public function setResponse($response) + { + $this->response = $response; + } + + public function send(TransactionInterface $transaction) + { + RequestEvents::emitBefore($transaction); + if (!$transaction->getResponse()) { + + // Read the request body if it is present + if ($transaction->getRequest()->getBody()) { + $transaction->getRequest()->getBody()->__toString(); + } + + $response = is_callable($this->response) + ? call_user_func($this->response, $transaction) + : $this->response; + if (!$response instanceof ResponseInterface) { + throw new \RuntimeException('Invalid mocked response'); + } + + $transaction->setResponse($response); + RequestEvents::emitHeaders($transaction); + RequestEvents::emitComplete($transaction); + } + + return $transaction->getResponse(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/ParallelAdapterInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/ParallelAdapterInterface.php new file mode 100755 index 00000000..79a25b7e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/ParallelAdapterInterface.php @@ -0,0 +1,23 @@ +messageFactory = $messageFactory; + } + + public function send(TransactionInterface $transaction) + { + // HTTP/1.1 streams using the PHP stream wrapper require a + // Connection: close header. Setting here so that it is added before + // emitting the request.before_send event. + $request = $transaction->getRequest(); + if ($request->getProtocolVersion() == '1.1' && + !$request->hasHeader('Connection') + ) { + $transaction->getRequest()->setHeader('Connection', 'close'); + } + + RequestEvents::emitBefore($transaction); + if (!$transaction->getResponse()) { + $this->createResponse($transaction); + RequestEvents::emitComplete($transaction); + } + + return $transaction->getResponse(); + } + + private function createResponse(TransactionInterface $transaction) + { + $request = $transaction->getRequest(); + $stream = $this->createStream($request, $http_response_header); + + if (!$request->getConfig()['stream']) { + $stream = $this->getSaveToBody($request, $stream); + } + + // Track the response headers of the request + $this->createResponseObject($http_response_header, $transaction, $stream); + } + + /** + * Drain the steam into the destination stream + */ + private function getSaveToBody(RequestInterface $request, $stream) + { + if ($saveTo = $request->getConfig()['save_to']) { + // Stream the response into the destination stream + $saveTo = is_string($saveTo) + ? Stream\create(fopen($saveTo, 'r+')) + : Stream\create($saveTo); + } else { + // Stream into the default temp stream + $saveTo = Stream\create(); + } + + while (!feof($stream)) { + $saveTo->write(fread($stream, 8096)); + } + + fclose($stream); + $saveTo->seek(0); + + return $saveTo; + } + + private function createResponseObject( + array $headers, + TransactionInterface $transaction, + $stream + ) { + $parts = explode(' ', array_shift($headers), 3); + $options = ['protocol_version' => substr($parts[0], -3)]; + if (isset($parts[2])) { + $options['reason_phrase'] = $parts[2]; + } + + // Set the size on the stream if it was returned in the response + $responseHeaders = []; + foreach ($headers as $header) { + $headerParts = explode(':', $header, 2); + $responseHeaders[$headerParts[0]] = isset($headerParts[1]) + ? $headerParts[1] + : ''; + } + + $response = $this->messageFactory->createResponse( + $parts[1], + $responseHeaders, + $stream, + $options + ); + + $transaction->setResponse($response); + RequestEvents::emitHeaders($transaction); + + return $response; + } + + /** + * Create a resource and check to ensure it was created successfully + * + * @param callable $callback Callable that returns stream resource + * @param RequestInterface $request Request used when throwing exceptions + * @param array $options Options used when throwing exceptions + * + * @return resource + * @throws RequestException on error + */ + private function createResource(callable $callback, RequestInterface $request, $options) + { + // Turn off error reporting while we try to initiate the request + $level = error_reporting(0); + $resource = call_user_func($callback); + error_reporting($level); + + // If the resource could not be created, then grab the last error and + // throw an exception. + if (!is_resource($resource)) { + $message = 'Error creating resource. [url] ' . $request->getUrl() . ' '; + if (isset($options['http']['proxy'])) { + $message .= "[proxy] {$options['http']['proxy']} "; + } + foreach (error_get_last() as $key => $value) { + $message .= "[{$key}] {$value} "; + } + throw new RequestException(trim($message), $request); + } + + return $resource; + } + + /** + * Create the stream for the request with the context options. + * + * @param RequestInterface $request Request being sent + * @param mixed $http_response_header Populated by stream wrapper + * + * @return resource + */ + private function createStream( + RequestInterface $request, + &$http_response_header + ) { + static $methods; + if (!$methods) { + $methods = array_flip(get_class_methods(__CLASS__)); + } + + $params = []; + $options = $this->getDefaultOptions($request); + foreach ($request->getConfig()->toArray() as $key => $value) { + $method = "add_{$key}"; + if (isset($methods[$method])) { + $this->{$method}($request, $options, $value, $params); + } + } + + $this->applyCustomOptions($request, $options); + $context = $this->createStreamContext($request, $options, $params); + + return $this->createStreamResource( + $request, + $options, + $context, + $http_response_header + ); + } + + private function getDefaultOptions(RequestInterface $request) + { + $headers = ''; + foreach ($request->getHeaders() as $name => $values) { + $headers .= $name . ': ' . implode(', ', $values) . "\r\n"; + } + + return [ + 'http' => [ + 'method' => $request->getMethod(), + 'header' => trim($headers), + 'protocol_version' => $request->getProtocolVersion(), + 'ignore_errors' => true, + 'follow_location' => 0, + 'content' => (string) $request->getBody() + ] + ]; + } + + private function add_proxy(RequestInterface $request, &$options, $value, &$params) + { + if (!is_array($value)) { + $options['http']['proxy'] = $value; + $options['http']['request_fulluri'] = true; + } else { + $scheme = $request->getScheme(); + if (isset($value[$scheme])) { + $options['http']['proxy'] = $value[$scheme]; + $options['http']['request_fulluri'] = true; + } + } + } + + private function add_timeout(RequestInterface $request, &$options, $value, &$params) + { + $options['http']['timeout'] = $value; + } + + private function add_verify(RequestInterface $request, &$options, $value, &$params) + { + if ($value === true || is_string($value)) { + $options['http']['verify_peer'] = true; + if ($value !== true) { + if (!file_exists($value)) { + throw new \RuntimeException("SSL certificate authority file not found: {$value}"); + } + $options['http']['allow_self_signed'] = true; + $options['http']['cafile'] = $value; + } + } elseif ($value === false) { + $options['http']['verify_peer'] = false; + } + } + + private function add_cert(RequestInterface $request, &$options, $value, &$params) + { + if (is_array($value)) { + $options['http']['passphrase'] = $value[1]; + $value = $value[0]; + } + + if (!file_exists($value)) { + throw new \RuntimeException("SSL certificate not found: {$value}"); + } + + $options['http']['local_cert'] = $value; + } + + private function add_debug(RequestInterface $request, &$options, $value, &$params) + { + static $map = [ + STREAM_NOTIFY_CONNECT => 'CONNECT', + STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED', + STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT', + STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS', + STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS', + STREAM_NOTIFY_REDIRECTED => 'REDIRECTED', + STREAM_NOTIFY_PROGRESS => 'PROGRESS', + STREAM_NOTIFY_FAILURE => 'FAILURE', + STREAM_NOTIFY_COMPLETED => 'COMPLETED', + STREAM_NOTIFY_RESOLVE => 'RESOLVE' + ]; + + static $args = ['severity', 'message', 'message_code', + 'bytes_transferred', 'bytes_max']; + + if (!is_resource($value)) { + $value = fopen('php://output', 'w'); + } + + $params['notification'] = function () use ($request, $value, $map, $args) { + $passed = func_get_args(); + $code = array_shift($passed); + fprintf($value, '<%s> [%s] ', $request->getUrl(), $map[$code]); + foreach (array_filter($passed) as $i => $v) { + fwrite($value, $args[$i] . ': "' . $v . '" '); + } + fwrite($value, "\n"); + }; + } + + private function applyCustomOptions( + RequestInterface $request, + array &$options + ) { + // Overwrite any generated options with custom options + if ($custom = $request->getConfig()['stream_context']) { + if (!is_array($custom)) { + throw new AdapterException('stream_context must be an array'); + } + $options = array_replace_recursive($options, $custom); + } + } + + private function createStreamContext( + RequestInterface $request, + array $options, + array $params + ) { + return $this->createResource(function () use ( + $request, + $options, + $params + ) { + return stream_context_create($options, $params); + }, $request, $options); + } + + private function createStreamResource( + RequestInterface $request, + array $options, + $context, + &$http_response_header + ) { + $url = $request->getUrl(); + // Add automatic gzip decompression + if (strpos($request->getHeader('Accept-Encoding'), 'gzip') !== false) { + $url = 'compress.zlib://' . $url; + } + + return $this->createResource(function () use ( + $url, + &$http_response_header, + $context + ) { + if (false === strpos($url, 'http')) { + trigger_error("URL is invalid: {$url}", E_USER_WARNING); + return null; + } + return fopen($url, 'r', null, $context); + }, $request, $options); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/StreamingProxyAdapter.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/StreamingProxyAdapter.php new file mode 100755 index 00000000..128eb1d1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/StreamingProxyAdapter.php @@ -0,0 +1,36 @@ +defaultAdapter = $defaultAdapter; + $this->streamingAdapter = $streamingAdapter; + } + + public function send(TransactionInterface $transaction) + { + return $transaction->getRequest()->getConfig()['stream'] + ? $this->streamingAdapter->send($transaction) + : $this->defaultAdapter->send($transaction); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Transaction.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Transaction.php new file mode 100755 index 00000000..74bb6b44 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Transaction.php @@ -0,0 +1,49 @@ +client = $client; + $this->request = $request; + } + + public function getRequest() + { + return $this->request; + } + + public function getResponse() + { + return $this->response; + } + + public function setResponse(ResponseInterface $response) + { + $this->response = $response; + } + + public function getClient() + { + return $this->client; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/TransactionInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/TransactionInterface.php new file mode 100755 index 00000000..b9bf50cb --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/TransactionInterface.php @@ -0,0 +1,35 @@ +client = $client; + $this->eventListeners = $this->prepareListeners( + $options, + ['before', 'complete', 'error'] + ); + if ($source instanceof \Iterator) { + $this->source = $source; + } elseif (is_array($source)) { + $this->source = new \ArrayIterator($source); + } else { + throw new \InvalidArgumentException('Expected an Iterator or array'); + } + } + + public function current() + { + $request = $this->source->current(); + if (!$request instanceof RequestInterface) { + throw new \RuntimeException('All must implement RequestInterface'); + } + + $this->attachListeners($request, $this->eventListeners); + + return new Transaction($this->client, $request); + } + + public function next() + { + $this->source->next(); + } + + public function key() + { + return $this->source->key(); + } + + public function valid() + { + return $this->source->valid(); + } + + public function rewind() {} +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Client.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Client.php new file mode 100755 index 00000000..898157e1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Client.php @@ -0,0 +1,364 @@ + [ + * 'http://www.foo.com/{version}/', + * ['version' => '123'] + * ], + * 'defaults' => [ + * 'timeout' => 10, + * 'allow_redirects' => false, + * 'proxy' => '192.168.16.1:10' + * ] + * ]); + * + * @param array $config Client configuration settings + * - base_url: Base URL of the client that is merged into relative URLs. + * Can be a string or an array that contains a URI template followed + * by an associative array of expansion variables to inject into the + * URI template. + * - adapter: Adapter used to transfer requests + * - parallel_adapter: Adapter used to transfer requests in parallel + * - message_factory: Factory used to create request and response object + * - defaults: Default request options to apply to each request + * - emitter: Event emitter used for request events + */ + public function __construct(array $config = []) + { + $this->configureBaseUrl($config); + $this->configureDefaults($config); + $this->configureAdapter($config); + if (isset($config['emitter'])) { + $this->emitter = $config['emitter']; + } + } + + /** + * Get the default User-Agent string to use with Guzzle + * + * @return string + */ + public static function getDefaultUserAgent() + { + static $defaultAgent = ''; + if (!$defaultAgent) { + $defaultAgent = 'Guzzle/' . self::VERSION; + if (extension_loaded('curl')) { + $defaultAgent .= ' curl/' . curl_version()['version']; + } + $defaultAgent .= ' PHP/' . PHP_VERSION; + } + + return $defaultAgent; + } + + public function __call($name, $arguments) + { + return \GuzzleHttp\deprecation_proxy( + $this, + $name, + $arguments, + ['getEventDispatcher' => 'getEmitter'] + ); + } + + public function getDefaultOption($keyOrPath = null) + { + return $keyOrPath === null + ? $this->defaults + : \GuzzleHttp\get_path($this->defaults, $keyOrPath); + } + + public function setDefaultOption($keyOrPath, $value) + { + \GuzzleHttp\set_path($this->defaults, $keyOrPath, $value); + } + + public function getBaseUrl() + { + return (string) $this->baseUrl; + } + + public function createRequest($method, $url = null, array $options = []) + { + // Merge in default options + $options = array_replace_recursive($this->defaults, $options); + + // Use a clone of the client's emitter + $options['config']['emitter'] = clone $this->getEmitter(); + + $request = $this->messageFactory->createRequest( + $method, + $url ? (string) $this->buildUrl($url) : (string) $this->baseUrl, + $options + ); + + return $request; + } + + public function get($url = null, $options = []) + { + return $this->send($this->createRequest('GET', $url, $options)); + } + + public function head($url = null, array $options = []) + { + return $this->send($this->createRequest('HEAD', $url, $options)); + } + + public function delete($url = null, array $options = []) + { + return $this->send($this->createRequest('DELETE', $url, $options)); + } + + public function put($url = null, array $options = []) + { + return $this->send($this->createRequest('PUT', $url, $options)); + } + + public function patch($url = null, array $options = []) + { + return $this->send($this->createRequest('PATCH', $url, $options)); + } + + public function post($url = null, array $options = []) + { + return $this->send($this->createRequest('POST', $url, $options)); + } + + public function options($url = null, array $options = []) + { + return $this->send($this->createRequest('OPTIONS', $url, $options)); + } + + public function send(RequestInterface $request) + { + $transaction = new Transaction($this, $request); + try { + if ($response = $this->adapter->send($transaction)) { + return $response; + } + throw new \LogicException('No response was associated with the transaction'); + } catch (RequestException $e) { + throw $e; + } catch (\Exception $e) { + // Wrap exceptions in a RequestException to adhere to the interface + throw new RequestException($e->getMessage(), $request, null, $e); + } + } + + public function sendAll($requests, array $options = []) + { + if (!($requests instanceof TransactionIterator)) { + $requests = new TransactionIterator($requests, $this, $options); + } + + $this->parallelAdapter->sendAll( + $requests, + isset($options['parallel']) + ? $options['parallel'] + : self::DEFAULT_CONCURRENCY + ); + } + + /** + * Get an array of default options to apply to the client + * + * @return array + */ + protected function getDefaultOptions() + { + $settings = [ + 'allow_redirects' => true, + 'exceptions' => true, + 'verify' => __DIR__ . '/cacert.pem' + ]; + + // Use the bundled cacert if it is a regular file, or set to true if + // using a phar file (because curL and the stream wrapper can't read + // cacerts from the phar stream wrapper). Favor the ini setting over + // the system's cacert. + if (substr(__FILE__, 0, 7) == 'phar://') { + $settings['verify'] = ini_get('openssl.cafile') ?: true; + } + + // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set + if (isset($_SERVER['HTTP_PROXY'])) { + $settings['proxy']['http'] = $_SERVER['HTTP_PROXY']; + } + + if (isset($_SERVER['HTTPS_PROXY'])) { + $settings['proxy']['https'] = $_SERVER['HTTPS_PROXY']; + } + + return $settings; + } + + /** + * Expand a URI template and inherit from the base URL if it's relative + * + * @param string|array $url URL or URI template to expand + * + * @return string + */ + private function buildUrl($url) + { + if (!is_array($url)) { + if (strpos($url, '://')) { + return (string) $url; + } + return (string) $this->baseUrl->combine($url); + } elseif (strpos($url[0], '://')) { + return \GuzzleHttp\uri_template($url[0], $url[1]); + } + + return (string) $this->baseUrl->combine( + \GuzzleHttp\uri_template($url[0], $url[1]) + ); + } + + /** + * Get a default parallel adapter to use based on the environment + * + * @return ParallelAdapterInterface + */ + private function getDefaultParallelAdapter() + { + return extension_loaded('curl') + ? new MultiAdapter($this->messageFactory) + : new FakeParallelAdapter($this->adapter); + } + + /** + * Create a default adapter to use based on the environment + * @throws \RuntimeException + */ + private function getDefaultAdapter() + { + if (extension_loaded('curl')) { + $this->parallelAdapter = new MultiAdapter($this->messageFactory); + $this->adapter = function_exists('curl_reset') + ? new CurlAdapter($this->messageFactory) + : $this->parallelAdapter; + if (ini_get('allow_url_fopen')) { + $this->adapter = new StreamingProxyAdapter( + $this->adapter, + new StreamAdapter($this->messageFactory) + ); + } + } elseif (ini_get('allow_url_fopen')) { + $this->adapter = new StreamAdapter($this->messageFactory); + } else { + throw new \RuntimeException('Guzzle requires cURL, the ' + . 'allow_url_fopen ini setting, or a custom HTTP adapter.'); + } + } + + private function configureBaseUrl(&$config) + { + if (!isset($config['base_url'])) { + $this->baseUrl = new Url('', ''); + } elseif (is_array($config['base_url'])) { + $this->baseUrl = Url::fromString( + \GuzzleHttp\uri_template( + $config['base_url'][0], + $config['base_url'][1] + ) + ); + $config['base_url'] = (string) $this->baseUrl; + } else { + $this->baseUrl = Url::fromString($config['base_url']); + } + } + + private function configureDefaults($config) + { + if (!isset($config['defaults'])) { + $this->defaults = $this->getDefaultOptions(); + } else { + $this->defaults = array_replace( + $this->getDefaultOptions(), + $config['defaults'] + ); + } + + // Add the default user-agent header + if (!isset($this->defaults['headers'])) { + $this->defaults['headers'] = [ + 'User-Agent' => static::getDefaultUserAgent() + ]; + } elseif (!isset(array_change_key_case($this->defaults['headers'])['user-agent'])) { + // Add the User-Agent header if one was not already set + $this->defaults['headers']['User-Agent'] = static::getDefaultUserAgent(); + } + } + + private function configureAdapter(&$config) + { + if (isset($config['message_factory'])) { + $this->messageFactory = $config['message_factory']; + } else { + $this->messageFactory = new MessageFactory(); + } + if (isset($config['adapter'])) { + $this->adapter = $config['adapter']; + } else { + $this->getDefaultAdapter(); + } + // If no parallel adapter was explicitly provided and one was not + // defaulted when creating the default adapter, then create one now. + if (isset($config['parallel_adapter'])) { + $this->parallelAdapter = $config['parallel_adapter']; + } elseif (!$this->parallelAdapter) { + $this->parallelAdapter = $this->getDefaultParallelAdapter(); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/ClientInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/ClientInterface.php new file mode 100755 index 00000000..b0e4cba7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/ClientInterface.php @@ -0,0 +1,179 @@ +data = $data; + } + + /** + * Create a new collection from an array, validate the keys, and add default + * values where missing + * + * @param array $config Configuration values to apply. + * @param array $defaults Default parameters + * @param array $required Required parameter names + * + * @return self + * @throws \InvalidArgumentException if a parameter is missing + */ + public static function fromConfig( + array $config = [], + array $defaults = [], + array $required = [] + ) { + $data = $config + $defaults; + + if ($missing = array_diff($required, array_keys($data))) { + throw new \InvalidArgumentException( + 'Config is missing the following keys: ' . + implode(', ', $missing)); + } + + return new self($data); + } + + /** + * Removes all key value pairs + * + * @return Collection + */ + public function clear() + { + $this->data = []; + + return $this; + } + + /** + * Get a specific key value. + * + * @param string $key Key to retrieve. + * + * @return mixed|null Value of the key or NULL + */ + public function get($key) + { + return isset($this->data[$key]) ? $this->data[$key] : null; + } + + /** + * Set a key value pair + * + * @param string $key Key to set + * @param mixed $value Value to set + * + * @return Collection Returns a reference to the object + */ + public function set($key, $value) + { + $this->data[$key] = $value; + + return $this; + } + + /** + * Add a value to a key. If a key of the same name has already been added, + * the key value will be converted into an array and the new value will be + * pushed to the end of the array. + * + * @param string $key Key to add + * @param mixed $value Value to add to the key + * + * @return Collection Returns a reference to the object. + */ + public function add($key, $value) + { + if (!array_key_exists($key, $this->data)) { + $this->data[$key] = $value; + } elseif (is_array($this->data[$key])) { + $this->data[$key][] = $value; + } else { + $this->data[$key] = array($this->data[$key], $value); + } + + return $this; + } + + /** + * Remove a specific key value pair + * + * @param string $key A key to remove + * + * @return Collection + */ + public function remove($key) + { + unset($this->data[$key]); + + return $this; + } + + /** + * Get all keys in the collection + * + * @return array + */ + public function getKeys() + { + return array_keys($this->data); + } + + /** + * Returns whether or not the specified key is present. + * + * @param string $key The key for which to check the existence. + * + * @return bool + */ + public function hasKey($key) + { + return array_key_exists($key, $this->data); + } + + /** + * Checks if any keys contains a certain value + * + * @param string $value Value to search for + * + * @return mixed Returns the key if the value was found FALSE if the value + * was not found. + */ + public function hasValue($value) + { + return array_search($value, $this->data, true); + } + + /** + * Replace the data of the object with the value of an array + * + * @param array $data Associative array of data + * + * @return Collection Returns a reference to the object + */ + public function replace(array $data) + { + $this->data = $data; + + return $this; + } + + /** + * Add and merge in a Collection or array of key value pair data. + * + * @param Collection|array $data Associative array of key value pair data + * + * @return Collection Returns a reference to the object. + */ + public function merge($data) + { + foreach ($data as $key => $value) { + $this->add($key, $value); + } + + return $this; + } + + /** + * Over write key value pairs in this collection with all of the data from + * an array or collection. + * + * @param array|\Traversable $data Values to override over this config + * + * @return self + */ + public function overwriteWith($data) + { + if (is_array($data)) { + $this->data = $data + $this->data; + } elseif ($data instanceof Collection) { + $this->data = $data->toArray() + $this->data; + } else { + foreach ($data as $key => $value) { + $this->data[$key] = $value; + } + } + + return $this; + } + + /** + * Returns a Collection containing all the elements of the collection after + * applying the callback function to each one. + * + * The callable should accept three arguments: + * - (string) $key + * - (string) $value + * - (array) $context + * + * The callable must return a the altered or unaltered value. + * + * @param callable $closure Map function to apply + * @param array $context Context to pass to the callable + * + * @return Collection + */ + public function map(callable $closure, array $context = []) + { + $collection = new static(); + foreach ($this as $key => $value) { + $collection[$key] = $closure($key, $value, $context); + } + + return $collection; + } + + /** + * Iterates over each key value pair in the collection passing them to the + * callable. If the callable returns true, the current value from input is + * returned into the result Collection. + * + * The callable must accept two arguments: + * - (string) $key + * - (string) $value + * + * @param callable $closure Evaluation function + * + * @return Collection + */ + public function filter(callable $closure) + { + $collection = new static(); + foreach ($this->data as $key => $value) { + if ($closure($key, $value)) { + $collection[$key] = $value; + } + } + + return $collection; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/CookieJar.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/CookieJar.php new file mode 100755 index 00000000..41348578 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/CookieJar.php @@ -0,0 +1,249 @@ +strictMode = $strictMode; + + foreach ($cookieArray as $cookie) { + if (!($cookieArray instanceof SetCookie)) { + $cookie = new SetCookie($cookie); + } + $this->setCookie($cookie); + } + } + + /** + * Create a new Cookie jar from an associative array and domain. + * + * @param array $cookies Cookies to create the jar from + * @param string $domain Domain to set the cookies to + * + * @return self + */ + public static function fromArray(array $cookies, $domain) + { + $cookieJar = new self(); + foreach ($cookies as $name => $value) { + $cookieJar->setCookie(new SetCookie([ + 'Domain' => $domain, + 'Name' => $name, + 'Value' => $value, + 'Discard' => true + ])); + } + + return $cookieJar; + } + + /** + * Quote the cookie value if it is not already quoted and it contains + * problematic characters. + * + * @param string $value Value that may or may not need to be quoted + * + * @return string + */ + public static function getCookieValue($value) + { + if (substr($value, 0, 1) !== '"' && + substr($value, -1, 1) !== '"' && + strpbrk($value, ';,') + ) { + $value = '"' . $value . '"'; + } + + return $value; + } + + public function toArray() + { + return array_map(function (SetCookie $cookie) { + return $cookie->toArray(); + }, $this->getIterator()->getArrayCopy()); + } + + public function clear($domain = null, $path = null, $name = null) + { + if (!$domain) { + $this->cookies = []; + return; + } elseif (!$path) { + $this->cookies = array_filter( + $this->cookies, + function (SetCookie $cookie) use ($path, $domain) { + return !$cookie->matchesDomain($domain); + } + ); + } elseif (!$name) { + $this->cookies = array_filter( + $this->cookies, + function (SetCookie $cookie) use ($path, $domain) { + return !($cookie->matchesPath($path) && + $cookie->matchesDomain($domain)); + } + ); + } else { + $this->cookies = array_filter( + $this->cookies, + function (SetCookie $cookie) use ($path, $domain, $name) { + return !($cookie->getName() == $name && + $cookie->matchesPath($path) && + $cookie->matchesDomain($domain)); + } + ); + } + } + + public function clearSessionCookies() + { + $this->cookies = array_filter( + $this->cookies, + function (SetCookie $cookie) { + return !$cookie->getDiscard() && $cookie->getExpires(); + } + ); + } + + public function setCookie(SetCookie $cookie) + { + // Only allow cookies with set and valid domain, name, value + $result = $cookie->validate(); + if ($result !== true) { + if ($this->strictMode) { + throw new \RuntimeException('Invalid cookie: ' . $result); + } else { + $this->removeCookieIfEmpty($cookie); + return false; + } + } + + // Resolve conflicts with previously set cookies + foreach ($this->cookies as $i => $c) { + + // Two cookies are identical, when their path, and domain are + // identical. + if ($c->getPath() != $cookie->getPath() || + $c->getDomain() != $cookie->getDomain() || + $c->getName() != $cookie->getName() + ) { + continue; + } + + // The previously set cookie is a discard cookie and this one is + // not so allow the new cookie to be set + if (!$cookie->getDiscard() && $c->getDiscard()) { + unset($this->cookies[$i]); + continue; + } + + // If the new cookie's expiration is further into the future, then + // replace the old cookie + if ($cookie->getExpires() > $c->getExpires()) { + unset($this->cookies[$i]); + continue; + } + + // If the value has changed, we better change it + if ($cookie->getValue() !== $c->getValue()) { + unset($this->cookies[$i]); + continue; + } + + // The cookie exists, so no need to continue + return false; + } + + $this->cookies[] = $cookie; + + return true; + } + + public function count() + { + return count($this->cookies); + } + + public function getIterator() + { + return new \ArrayIterator(array_values($this->cookies)); + } + + public function extractCookies( + RequestInterface $request, + ResponseInterface $response + ) { + if ($cookieHeader = $response->getHeader('Set-Cookie', true)) { + foreach ($cookieHeader as $cookie) { + $sc = SetCookie::fromString($cookie); + if (!$sc->getDomain()) { + $sc->setDomain($request->getHost()); + } + $this->setCookie($sc); + } + } + } + + public function addCookieHeader(RequestInterface $request) + { + $values = []; + $scheme = $request->getScheme(); + $host = $request->getHost(); + $path = $request->getPath(); + + foreach ($this->cookies as $cookie) { + if ($cookie->matchesPath($path) && + $cookie->matchesDomain($host) && + !$cookie->isExpired() && + (!$cookie->getSecure() || $scheme == 'https') + ) { + $values[] = $cookie->getName() . '=' + . self::getCookieValue($cookie->getValue()); + } + } + + if ($values) { + $request->setHeader('Cookie', implode(';', $values)); + } + } + + /** + * If a cookie already exists and the server asks to set it again with a + * null value, the cookie must be deleted. + * + * @param SetCookie $cookie + */ + private function removeCookieIfEmpty(SetCookie $cookie) + { + $cookieValue = $cookie->getValue(); + if ($cookieValue === null || $cookieValue === '') { + $this->clear( + $cookie->getDomain(), + $cookie->getPath(), + $cookie->getName() + ); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/CookieJarInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/CookieJarInterface.php new file mode 100755 index 00000000..6cafce8c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/CookieJarInterface.php @@ -0,0 +1,76 @@ +filename = $cookieFile; + + if (file_exists($cookieFile)) { + $this->load($cookieFile); + } + } + + /** + * Saves the file when shutting down + */ + public function __destruct() + { + $this->save($this->filename); + } + + /** + * Saves the cookies to a file. + * + * @param string $filename File to save + * @throws \RuntimeException if the file cannot be found or created + */ + public function save($filename) + { + $json = []; + foreach ($this as $cookie) { + if ($cookie->getExpires() && !$cookie->getDiscard()) { + $json[] = $cookie->toArray(); + } + } + + if (false === file_put_contents($filename, json_encode($json))) { + // @codeCoverageIgnoreStart + throw new \RuntimeException("Unable to save file {$filename}"); + // @codeCoverageIgnoreEnd + } + } + + /** + * Load cookies from a JSON formatted file. + * + * Old cookies are kept unless overwritten by newly loaded ones. + * + * @param string $filename Cookie file to load. + * @throws \RuntimeException if the file cannot be loaded. + */ + public function load($filename) + { + $json = file_get_contents($filename); + if (false === $json) { + // @codeCoverageIgnoreStart + throw new \RuntimeException("Unable to load file {$filename}"); + // @codeCoverageIgnoreEnd + } + + $data = \GuzzleHttp\json_decode($json, true); + if (is_array($data)) { + foreach (\GuzzleHttp\json_decode($json, true) as $cookie) { + $this->setCookie(new SetCookie($cookie)); + } + } elseif (strlen($data)) { + throw new \RuntimeException("Invalid cookie file: {$filename}"); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/SessionCookieJar.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/SessionCookieJar.php new file mode 100755 index 00000000..2f708d74 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/SessionCookieJar.php @@ -0,0 +1,65 @@ +sessionKey = $sessionKey; + $this->load(); + } + + /** + * Saves cookies to session when shutting down + */ + public function __destruct() + { + $this->save(); + } + + /** + * Save cookies to the client session + */ + public function save() + { + $json = []; + foreach ($this as $cookie) { + if ($cookie->getExpires() && !$cookie->getDiscard()) { + $json[] = $cookie->toArray(); + } + } + + $_SESSION[$this->sessionKey] = json_encode($json); + } + + /** + * Load the contents of the client session into the data array + */ + protected function load() + { + $cookieJar = isset($_SESSION[$this->sessionKey]) + ? $_SESSION[$this->sessionKey] + : null; + + $data = \GuzzleHttp\json_decode($cookieJar, true); + if (is_array($data)) { + foreach ($data as $cookie) { + $this->setCookie(new SetCookie($cookie)); + } + } elseif (strlen($data)) { + throw new \RuntimeException("Invalid cookie data"); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/SetCookie.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/SetCookie.php new file mode 100755 index 00000000..76f6f8d1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/SetCookie.php @@ -0,0 +1,410 @@ + null, + 'Value' => null, + 'Domain' => null, + 'Path' => '/', + 'Max-Age' => null, + 'Expires' => null, + 'Secure' => false, + 'Discard' => false, + 'HttpOnly' => false + ]; + + /** @var array Cookie data */ + private $data; + + /** + * Create a new SetCookie object from a string + * + * @param string $cookie Set-Cookie header string + * + * @return self + */ + public static function fromString($cookie) + { + // Create the default return array + $data = self::$defaults; + // Explode the cookie string using a series of semicolons + $pieces = array_filter(array_map('trim', explode(';', $cookie))); + // The name of the cookie (first kvp) must include an equal sign. + if (empty($pieces) || !strpos($pieces[0], '=')) { + return new self($data); + } + + // Add the cookie pieces into the parsed data array + foreach ($pieces as $part) { + + $cookieParts = explode('=', $part, 2); + $key = trim($cookieParts[0]); + $value = isset($cookieParts[1]) + ? trim($cookieParts[1], " \n\r\t\0\x0B\"") + : true; + + // Only check for non-cookies when cookies have been found + if (empty($data['Name'])) { + $data['Name'] = $key; + $data['Value'] = $value; + } else { + foreach (array_keys(self::$defaults) as $search) { + if (!strcasecmp($search, $key)) { + $data[$search] = $value; + continue 2; + } + } + $data[$key] = $value; + } + } + + return new self($data); + } + + /** + * @param array $data Array of cookie data provided by a Cookie parser + */ + public function __construct(array $data = []) + { + $this->data = array_replace(self::$defaults, $data); + // Extract the Expires value and turn it into a UNIX timestamp if needed + if (!$this->getExpires() && $this->getMaxAge()) { + // Calculate the Expires date + $this->setExpires(time() + $this->getMaxAge()); + } elseif ($this->getExpires() && !is_numeric($this->getExpires())) { + $this->setExpires($this->getExpires()); + } + } + + public function __toString() + { + $str = $this->data['Name'] . '=' . $this->data['Value'] . '; '; + foreach ($this->data as $k => $v) { + if ($k != 'Name' && $k != 'Value'&& $v !== null && $v !== false) { + if ($k == 'Expires') { + $str .= 'Expires=' . gmdate('D, d M Y H:i:s \G\M\T', $v) . '; '; + } else { + $str .= ($v === true ? $k : "{$k}={$v}") . '; '; + } + } + } + + return rtrim($str, '; '); + } + + public function toArray() + { + return $this->data; + } + + /** + * Get the cookie name + * + * @return string + */ + public function getName() + { + return $this->data['Name']; + } + + /** + * Set the cookie name + * + * @param string $name Cookie name + * + * @return self + */ + public function setName($name) + { + $this->data['Name'] = $name; + + return $this; + } + + /** + * Get the cookie value + * + * @return string + */ + public function getValue() + { + return $this->data['Value']; + } + + /** + * Set the cookie value + * + * @param string $value Cookie value + * + * @return self + */ + public function setValue($value) + { + $this->data['Value'] = $value; + + return $this; + } + + /** + * Get the domain + * + * @return string|null + */ + public function getDomain() + { + return $this->data['Domain']; + } + + /** + * Set the domain of the cookie + * + * @param string $domain + * + * @return self + */ + public function setDomain($domain) + { + $this->data['Domain'] = $domain; + + return $this; + } + + /** + * Get the path + * + * @return string + */ + public function getPath() + { + return $this->data['Path']; + } + + /** + * Set the path of the cookie + * + * @param string $path Path of the cookie + * + * @return self + */ + public function setPath($path) + { + $this->data['Path'] = $path; + + return $this; + } + + /** + * Maximum lifetime of the cookie in seconds + * + * @return int|null + */ + public function getMaxAge() + { + return $this->data['Max-Age']; + } + + /** + * Set the max-age of the cookie + * + * @param int $maxAge Max age of the cookie in seconds + * + * @return self + */ + public function setMaxAge($maxAge) + { + $this->data['Max-Age'] = $maxAge; + + return $this; + } + + /** + * The UNIX timestamp when the cookie Expires + * + * @return mixed + */ + public function getExpires() + { + return $this->data['Expires']; + } + + /** + * Set the unix timestamp for which the cookie will expire + * + * @param int $timestamp Unix timestamp + * + * @return self + */ + public function setExpires($timestamp) + { + $this->data['Expires'] = is_numeric($timestamp) + ? (int) $timestamp + : strtotime($timestamp); + + return $this; + } + + /** + * Get whether or not this is a secure cookie + * + * @return null|bool + */ + public function getSecure() + { + return $this->data['Secure']; + } + + /** + * Set whether or not the cookie is secure + * + * @param bool $secure Set to true or false if secure + * + * @return self + */ + public function setSecure($secure) + { + $this->data['Secure'] = $secure; + + return $this; + } + + /** + * Get whether or not this is a session cookie + * + * @return null|bool + */ + public function getDiscard() + { + return $this->data['Discard']; + } + + /** + * Set whether or not this is a session cookie + * + * @param bool $discard Set to true or false if this is a session cookie + * + * @return self + */ + public function setDiscard($discard) + { + $this->data['Discard'] = $discard; + + return $this; + } + + /** + * Get whether or not this is an HTTP only cookie + * + * @return bool + */ + public function getHttpOnly() + { + return $this->data['HttpOnly']; + } + + /** + * Set whether or not this is an HTTP only cookie + * + * @param bool $httpOnly Set to true or false if this is HTTP only + * + * @return self + */ + public function setHttpOnly($httpOnly) + { + $this->data['HttpOnly'] = $httpOnly; + + return $this; + } + + /** + * Check if the cookie matches a path value + * + * @param string $path Path to check against + * + * @return bool + */ + public function matchesPath($path) + { + return !$this->getPath() || 0 === stripos($path, $this->getPath()); + } + + /** + * Check if the cookie matches a domain value + * + * @param string $domain Domain to check against + * + * @return bool + */ + public function matchesDomain($domain) + { + // Remove the leading '.' as per spec in RFC 6265. + // http://tools.ietf.org/html/rfc6265#section-5.2.3 + $cookieDomain = ltrim($this->getDomain(), '.'); + + // Domain not set or exact match. + if (!$cookieDomain || !strcasecmp($domain, $cookieDomain)) { + return true; + } + + // Matching the subdomain according to RFC 6265. + // http://tools.ietf.org/html/rfc6265#section-5.1.3 + if (filter_var($domain, FILTER_VALIDATE_IP)) { + return false; + } + + return (bool) preg_match('/\.' . preg_quote($cookieDomain) . '$/i', $domain); + } + + /** + * Check if the cookie is expired + * + * @return bool + */ + public function isExpired() + { + return $this->getExpires() && time() > $this->getExpires(); + } + + /** + * Check if the cookie is valid according to RFC 6265 + * + * @return bool|string Returns true if valid or an error message if invalid + */ + public function validate() + { + // Names must not be empty, but can be 0 + $name = $this->getName(); + if (empty($name) && !is_numeric($name)) { + return 'The cookie name must not be empty'; + } + + // Check if any of the invalid characters are present in the cookie name + if (preg_match("/[=,; \t\r\n\013\014]/", $name)) { + return "Cookie name must not cannot invalid characters: =,; \\t\\r\\n\\013\\014"; + } + + // Value must not be empty, but can be 0 + $value = $this->getValue(); + if (empty($value) && !is_numeric($value)) { + return 'The cookie value must not be empty'; + } + + // Domains must not be empty, but can be 0 + // A "0" is not a valid internet domain, but may be used as server name + // in a private network. + $domain = $this->getDomain(); + if (empty($domain) && !is_numeric($domain)) { + return 'The cookie domain must not be empty'; + } + + return true; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractEvent.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractEvent.php new file mode 100755 index 00000000..fa1453c8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractEvent.php @@ -0,0 +1,21 @@ +propagationStopped; + } + + public function stopPropagation() + { + $this->propagationStopped = true; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractRequestEvent.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractRequestEvent.php new file mode 100755 index 00000000..d188248a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractRequestEvent.php @@ -0,0 +1,49 @@ +transaction = $transaction; + } + + /** + * Get the client associated with the event + * + * @return ClientInterface + */ + public function getClient() + { + return $this->transaction->getClient(); + } + + /** + * Get the request object + * + * @return RequestInterface + */ + public function getRequest() + { + return $this->transaction->getRequest(); + } + + /** + * @return TransactionInterface + */ + protected function getTransaction() + { + return $this->transaction; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractTransferEvent.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractTransferEvent.php new file mode 100755 index 00000000..dba1f98e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractTransferEvent.php @@ -0,0 +1,83 @@ +transferInfo = $transferInfo; + } + + /** + * Get all transfer information as an associative array if no $name + * argument is supplied, or gets a specific transfer statistic if + * a $name attribute is supplied (e.g., 'total_time'). + * + * @param string $name Name of the transfer stat to retrieve + * + * @return mixed|null|array + */ + public function getTransferInfo($name = null) + { + if (!$name) { + return $this->transferInfo; + } + + return isset($this->transferInfo[$name]) + ? $this->transferInfo[$name] + : null; + } + + /** + * Get the response + * + * @return ResponseInterface|null + */ + abstract public function getResponse(); + + /** + * Intercept the request and associate a response + * + * @param ResponseInterface $response Response to set + */ + abstract public function intercept(ResponseInterface $response); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/BeforeEvent.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/BeforeEvent.php new file mode 100755 index 00000000..34a7811d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/BeforeEvent.php @@ -0,0 +1,26 @@ +getTransaction()->setResponse($response); + $this->stopPropagation(); + RequestEvents::emitComplete($this->getTransaction()); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/CompleteEvent.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/CompleteEvent.php new file mode 100755 index 00000000..34457600 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/CompleteEvent.php @@ -0,0 +1,35 @@ +stopPropagation(); + $this->getTransaction()->setResponse($response); + } + + /** + * Get the response of the request + * + * @return ResponseInterface + */ + public function getResponse() + { + return $this->getTransaction()->getResponse(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/Emitter.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/Emitter.php new file mode 100755 index 00000000..49172bcb --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/Emitter.php @@ -0,0 +1,147 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * @link https://github.com/symfony/symfony/tree/master/src/Symfony/Component/EventDispatcher + */ +class Emitter implements EmitterInterface +{ + /** @var array */ + private $listeners = []; + + /** @var array */ + private $sorted = []; + + public function on($eventName, callable $listener, $priority = 0) + { + if ($priority === 'first') { + $priority = isset($this->listeners[$eventName]) + ? max(array_keys($this->listeners[$eventName])) + 1 + : 1; + } elseif ($priority === 'last') { + $priority = isset($this->listeners[$eventName]) + ? min(array_keys($this->listeners[$eventName])) - 1 + : -1; + } + + $this->listeners[$eventName][$priority][] = $listener; + unset($this->sorted[$eventName]); + } + + public function once($eventName, callable $listener, $priority = 0) + { + $onceListener = function ( + EventInterface $event, + $eventName + ) use (&$onceListener, $eventName, $listener, $priority) { + $this->removeListener($eventName, $onceListener); + $listener($event, $eventName, $this); + }; + + $this->on($eventName, $onceListener, $priority); + } + + public function removeListener($eventName, callable $listener) + { + if (!isset($this->listeners[$eventName])) { + return; + } + + foreach ($this->listeners[$eventName] as $priority => $listeners) { + if (false !== ($key = array_search($listener, $listeners, true))) { + unset( + $this->listeners[$eventName][$priority][$key], + $this->sorted[$eventName] + ); + } + } + } + + public function listeners($eventName = null) + { + // Return all events in a sorted priority order + if ($eventName === null) { + foreach (array_keys($this->listeners) as $eventName) { + if (!isset($this->sorted[$eventName])) { + $this->listeners($eventName); + } + } + return $this->sorted; + } + + // Return the listeners for a specific event, sorted in priority order + if (!isset($this->sorted[$eventName])) { + if (!isset($this->listeners[$eventName])) { + return []; + } else { + krsort($this->listeners[$eventName]); + $this->sorted[$eventName] = call_user_func_array( + 'array_merge', + $this->listeners[$eventName] + ); + } + } + + return $this->sorted[$eventName]; + } + + public function emit($eventName, EventInterface $event) + { + if (isset($this->listeners[$eventName])) { + foreach ($this->listeners($eventName) as $listener) { + $listener($event, $eventName); + if ($event->isPropagationStopped()) { + break; + } + } + } + + return $event; + } + + public function attach(SubscriberInterface $subscriber) + { + foreach ($subscriber->getEvents() as $eventName => $listener) { + $this->on( + $eventName, + array($subscriber, $listener[0]), + isset($listener[1]) ? $listener[1] : 0 + ); + } + } + + public function detach(SubscriberInterface $subscriber) + { + foreach ($subscriber->getEvents() as $eventName => $listener) { + $this->removeListener($eventName, array($subscriber, $listener[0])); + } + } + + public function __call($name, $arguments) + { + return \GuzzleHttp\deprecation_proxy( + $this, + $name, + $arguments, + [ + 'addSubscriber' => 'attach', + 'removeSubscriber' => 'detach', + 'addListener' => 'on', + 'dispatch' => 'emit' + ] + ); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/EmitterInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/EmitterInterface.php new file mode 100755 index 00000000..0181e7fe --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/EmitterInterface.php @@ -0,0 +1,88 @@ +exception = $e; + } + + /** + * Intercept the exception and inject a response + * + * @param ResponseInterface $response Response to set + */ + public function intercept(ResponseInterface $response) + { + $this->stopPropagation(); + $this->getTransaction()->setResponse($response); + RequestEvents::emitComplete($this->getTransaction()); + } + + /** + * Get the exception that was encountered + * + * @return RequestException + */ + public function getException() + { + return $this->exception; + } + + /** + * Get the response the was received (if any) + * + * @return ResponseInterface|null + */ + public function getResponse() + { + return $this->getException()->getResponse(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/EventInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/EventInterface.php new file mode 100755 index 00000000..bf58f8b5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/EventInterface.php @@ -0,0 +1,24 @@ +emitter) { + $this->emitter = new Emitter(); + } + + return $this->emitter; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/HeadersEvent.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/HeadersEvent.php new file mode 100755 index 00000000..81274ff8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/HeadersEvent.php @@ -0,0 +1,39 @@ +getResponse()) { + throw new \RuntimeException('A response must be present'); + } + } + + /** + * Get the response the was received + * + * @return ResponseInterface + */ + public function getResponse() + { + return $this->getTransaction()->getResponse(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/ListenerAttacherTrait.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/ListenerAttacherTrait.php new file mode 100755 index 00000000..637cdaea --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/ListenerAttacherTrait.php @@ -0,0 +1,89 @@ +getEmitter(); + foreach ($listeners as $el) { + if ($el['once']) { + $emitter->once($el['name'], $el['fn'], $el['priority']); + } else { + $emitter->on($el['name'], $el['fn'], $el['priority']); + } + } + } + + /** + * Extracts the allowed events from the provided array, and ignores anything + * else in the array. The event listener must be specified as a callable or + * as an array of event listener data ("name", "fn", "priority", "once"). + * + * @param array $source Array containing callables or hashes of data to be + * prepared as event listeners. + * @param array $events Names of events to look for in the provided $source + * array. Other keys are ignored. + * @return array + */ + private function prepareListeners(array $source, array $events) + { + $listeners = []; + foreach ($events as $name) { + if (isset($source[$name])) { + $this->buildListener($name, $source[$name], $listeners); + } + } + + return $listeners; + } + + /** + * Creates a complete event listener definition from the provided array of + * listener data. Also works recursively if more than one listeners are + * contained in the provided array. + * + * @param string $name Name of the event the listener is for. + * @param array|callable $data Event listener data to prepare. + * @param array $listeners Array of listeners, passed by reference. + * + * @throws \InvalidArgumentException if the event data is malformed. + */ + private function buildListener($name, $data, &$listeners) + { + static $defaults = ['priority' => 0, 'once' => false]; + + // If a callable is provided, normalize it to the array format. + if (is_callable($data)) { + $data = ['fn' => $data]; + } + + // Prepare the listener and add it to the array, recursively. + if (isset($data['fn'])) { + $data['name'] = $name; + $listeners[] = $data + $defaults; + } elseif (is_array($data)) { + foreach ($data as $listenerData) { + $this->buildListener($name, $listenerData, $listeners); + } + } else { + throw new \InvalidArgumentException('Each event listener must be a ' + . 'callable or an associative array containing a "fn" key.'); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/RequestEvents.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/RequestEvents.php new file mode 100755 index 00000000..654e8ad0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/RequestEvents.php @@ -0,0 +1,162 @@ +getRequest(); + try { + $request->getEmitter()->emit( + 'before', + new BeforeEvent($transaction) + ); + } catch (RequestException $e) { + // When a RequestException has been emitted through emitError, the + // exception is marked as "emitted". This means that the exception + // had a chance to be rescued but was not. In this case, this method + // must not emit the error again, but rather throw the exception. + // This prevents RequestExceptions encountered during the before + // event from being emitted to listeners twice. + if ($e->emittedError()) { + throw $e; + } + self::emitError($transaction, $e); + } catch (\Exception $e) { + self::emitError($transaction, $e); + } + } + + /** + * Emits the complete event for a request and emits an error + * event if an error is encountered during the after send. + * + * @param TransactionInterface $transaction Transaction to emit for + * @param array $stats Transfer stats + * + * @throws RequestException + */ + public static function emitComplete( + TransactionInterface $transaction, + array $stats = [] + ) { + $request = $transaction->getRequest(); + $transaction->getResponse()->setEffectiveUrl($request->getUrl()); + try { + $request->getEmitter()->emit( + 'complete', + new CompleteEvent($transaction, $stats) + ); + } catch (RequestException $e) { + self::emitError($transaction, $e, $stats); + } + } + + /** + * Emits the headers event for a request. + * + * @param TransactionInterface $transaction Transaction to emit for + */ + public static function emitHeaders(TransactionInterface $transaction) + { + $transaction->getRequest()->getEmitter()->emit( + 'headers', + new HeadersEvent($transaction) + ); + } + + /** + * Emits an error event for a request and accounts for the propagation + * of an error event being stopped to prevent the exception from being + * thrown. + * + * @param TransactionInterface $transaction + * @param \Exception $e + * @param array $stats + * + * @throws \GuzzleHttp\Exception\RequestException + */ + public static function emitError( + TransactionInterface $transaction, + \Exception $e, + array $stats = [] + ) { + $request = $transaction->getRequest(); + + // Convert non-request exception to a wrapped exception + if (!($e instanceof RequestException)) { + $e = new RequestException($e->getMessage(), $request, null, $e); + } + + // Mark the exception as having been emitted for an error event. This + // works in tandem with the emitBefore method to prevent the error + // event from being triggered twice for the same exception. + $e->emittedError(true); + + // Dispatch an event and allow interception + if (!$request->getEmitter()->emit( + 'error', + new ErrorEvent($transaction, $e, $stats) + )->isPropagationStopped()) { + throw $e; + } + } + + /** + * Converts an array of event options into a formatted array of valid event + * configuration. + * + * @param array $options Event array to convert + * @param array $events Event names to convert in the options array. + * @param mixed $handler Event handler to utilize + * + * @return array + * @throws \InvalidArgumentException if the event config is invalid + * @internal + */ + public static function convertEventArray( + array $options, + array $events, + $handler + ) { + foreach ($events as $name) { + if (!isset($options[$name])) { + $options[$name] = $handler; + } elseif (is_callable($options[$name])) { + $options[$name] = [['fn' => $options[$name]], $handler]; + } elseif (is_array($options[$name])) { + $options[$name][] = $handler; + } else { + throw new \InvalidArgumentException('Invalid event format'); + } + } + + return $options; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/SubscriberInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/SubscriberInterface.php new file mode 100755 index 00000000..22c73119 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/SubscriberInterface.php @@ -0,0 +1,31 @@ + ['methodName']] + * - ['eventName' => ['methodName', $priority]] + * + * @return array + */ + public function getEvents(); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/AdapterException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/AdapterException.php new file mode 100755 index 00000000..55334c46 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/AdapterException.php @@ -0,0 +1,5 @@ +response = $response; + } + /** + * Get the associated response + * + * @return ResponseInterface|null + */ + public function getResponse() + { + return $this->response; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/RequestException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/RequestException.php new file mode 100755 index 00000000..ee953a9c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/RequestException.php @@ -0,0 +1,124 @@ +getStatusCode() : 0; + parent::__construct($message, $code, $previous); + $this->request = $request; + $this->response = $response; + } + + /** + * Factory method to create a new exception with a normalized error message + * + * @param RequestInterface $request Request + * @param ResponseInterface $response Response received + * @param \Exception $previous Previous exception + * + * @return self + */ + public static function create( + RequestInterface $request, + ResponseInterface $response = null, + \Exception $previous = null + ) { + if (!$response) { + return new self('Error completing request', $request, null, $previous); + } + + $level = $response->getStatusCode()[0]; + if ($level == '4') { + $label = 'Client error response'; + $className = __NAMESPACE__ . '\\ClientException'; + } elseif ($level == '5') { + $label = 'Server error response'; + $className = __NAMESPACE__ . '\\ServerException'; + } else { + $label = 'Unsuccessful response'; + $className = __CLASS__; + } + + $message = $label . ' [url] ' . $request->getUrl() + . ' [status code] ' . $response->getStatusCode() + . ' [reason phrase] ' . $response->getReasonPhrase(); + + return new $className($message, $request, $response, $previous); + } + + /** + * Get the request that caused the exception + * + * @return RequestInterface + */ + public function getRequest() + { + return $this->request; + } + + /** + * Get the associated response + * + * @return ResponseInterface|null + */ + public function getResponse() + { + return $this->response; + } + + /** + * Check if a response was received + * + * @return bool + */ + public function hasResponse() + { + return $this->response !== null; + } + + /** + * Check or set if the exception was emitted in an error event. + * + * This value is used in the RequestEvents::emitBefore() method to check + * to see if an exception has already been emitted in an error event. + * + * @param bool|null Set to true to set the exception as having emitted an + * error. Leave null to retrieve the current setting. + * + * @return null|bool + * @throws \InvalidArgumentException if you attempt to set the value to false + */ + public function emittedError($value = null) + { + if ($value === null) { + return $this->emittedErrorEvent; + } elseif ($value === true) { + return $this->emittedErrorEvent = true; + } else { + throw new \InvalidArgumentException('You cannot set the emitted ' + . 'error value to false.'); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/ServerException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/ServerException.php new file mode 100755 index 00000000..d67ed27e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/ServerException.php @@ -0,0 +1,8 @@ +data); + } + + public function offsetGet($offset) + { + return isset($this->data[$offset]) ? $this->data[$offset] : null; + } + + public function offsetSet($offset, $value) + { + $this->data[$offset] = $value; + } + + public function offsetExists($offset) + { + return isset($this->data[$offset]); + } + + public function offsetUnset($offset) + { + unset($this->data[$offset]); + } + + public function toArray() + { + return $this->data; + } + + public function count() + { + return count($this->data); + } + + /** + * Get a value from the collection using a path syntax to retrieve nested + * data. + * + * @param string $path Path to traverse and retrieve a value from + * + * @return mixed|null + */ + public function getPath($path) + { + return \GuzzleHttp\get_path($this->data, $path); + } + + /** + * Set a value into a nested array key. Keys will be created as needed to + * set the value. + * + * @param string $path Path to set + * @param mixed $value Value to set at the key + * + * @throws \RuntimeException when trying to setPath using a nested path + * that travels through a scalar value + */ + public function setPath($path, $value) + { + \GuzzleHttp\set_path($this->data, $path, $value); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/AbstractMessage.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/AbstractMessage.php new file mode 100755 index 00000000..6037a70e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/AbstractMessage.php @@ -0,0 +1,237 @@ +getStartLine(); + foreach ($this->getHeaders() as $name => $values) { + $result .= "\r\n{$name}: " . implode(', ', $values); + } + + return $result . "\r\n\r\n" . $this->body; + } + + public function getProtocolVersion() + { + return $this->protocolVersion; + } + + public function getBody() + { + return $this->body; + } + + public function setBody(StreamInterface $body = null) + { + if ($body === null) { + // Setting a null body will remove the body of the request + $this->removeHeader('Content-Length') + ->removeHeader('Transfer-Encoding'); + } + + $this->body = $body; + + return $this; + } + + public function addHeader($header, $value) + { + static $valid = ['string' => true, 'integer' => true, + 'double' => true, 'array' => true]; + + $type = gettype($value); + if (!isset($valid[$type])) { + throw new \InvalidArgumentException('Invalid header value'); + } + + if ($type == 'array') { + $current = array_merge($this->getHeader($header, true), $value); + } else { + $current = $this->getHeader($header, true); + $current[] = $value; + } + + return $this->setHeader($header, $current); + } + + public function addHeaders(array $headers) + { + foreach ($headers as $name => $header) { + $this->addHeader($name, $header); + } + } + + public function getHeader($header, $asArray = false) + { + $name = strtolower($header); + + if (!isset($this->headers[$name])) { + return $asArray ? [] : ''; + } + + return $asArray + ? $this->headers[$name] + : implode(', ', $this->headers[$name]); + } + + public function getHeaders() + { + $headers = []; + foreach ($this->headers as $name => $values) { + $headers[$this->headerNames[$name]] = $values; + } + + return $headers; + } + + public function setHeader($header, $value) + { + $header = trim($header); + $name = strtolower($header); + $this->headerNames[$name] = $header; + + switch (gettype($value)) { + case 'string': + $this->headers[$name] = [trim($value)]; + break; + case 'integer': + case 'double': + $this->headers[$name] = [(string) $value]; + break; + case 'array': + foreach ($value as &$v) { + $v = trim($v); + } + $this->headers[$name] = $value; + break; + default: + throw new \InvalidArgumentException('Invalid header value ' + . 'provided: ' . var_export($value, true)); + } + + return $this; + } + + public function setHeaders(array $headers) + { + $this->headers = $this->headerNames = []; + foreach ($headers as $key => $value) { + $this->setHeader($key, $value); + } + + return $this; + } + + public function hasHeader($header) + { + return isset($this->headers[strtolower($header)]); + } + + public function removeHeader($header) + { + $name = strtolower($header); + unset($this->headers[$name], $this->headerNames[$name]); + + return $this; + } + + /** + * Parse an array of header values containing ";" separated data into an + * array of associative arrays representing the header key value pair + * data of the header. When a parameter does not contain a value, but just + * contains a key, this function will inject a key with a '' string value. + * + * @param MessageInterface $message That contains the header + * @param string $header Header to retrieve from the message + * + * @return array Returns the parsed header values. + */ + public static function parseHeader(MessageInterface $message, $header) + { + static $trimmed = "\"' \n\t\r"; + $params = $matches = []; + + foreach (self::normalizeHeader($message, $header) as $val) { + $part = []; + foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) { + if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) { + $m = $matches[0]; + if (isset($m[1])) { + $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed); + } else { + $part[] = trim($m[0], $trimmed); + } + } + } + if ($part) { + $params[] = $part; + } + } + + return $params; + } + + /** + * Converts an array of header values that may contain comma separated + * headers into an array of headers with no comma separated values. + * + * @param MessageInterface $message That contains the header + * @param string $header Header to retrieve from the message + * + * @return array Returns the normalized header field values. + */ + public static function normalizeHeader(MessageInterface $message, $header) + { + $h = $message->getHeader($header, true); + for ($i = 0, $total = count($h); $i < $total; $i++) { + if (strpos($h[$i], ',') === false) { + continue; + } + foreach (preg_split('/,(?=([^"]*"[^"]*")*[^"]*$)/', $h[$i]) as $v) { + $h[] = trim($v); + } + unset($h[$i]); + } + + return $h; + } + + /** + * Returns the start line of a message. + * + * @return string + */ + abstract protected function getStartLine(); + + /** + * Accepts and modifies the options provided to the message in the + * constructor. + * + * Can be overridden in subclasses as necessary. + * + * @param array $options Options array passed by reference. + */ + protected function handleOptions(array &$options) + { + if (isset($options['protocol_version'])) { + $this->protocolVersion = $options['protocol_version']; + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageFactory.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageFactory.php new file mode 100755 index 00000000..da67c385 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageFactory.php @@ -0,0 +1,345 @@ +errorPlugin = new HttpError(); + $this->redirectPlugin = new Redirect(); + } + + public function createResponse( + $statusCode, + array $headers = [], + $body = null, + array $options = [] + ) { + if (null !== $body) { + $body = Stream\create($body); + } + + return new Response($statusCode, $headers, $body, $options); + } + + public function createRequest($method, $url, array $options = []) + { + // Handle the request protocol version option that needs to be + // specified in the request constructor. + if (isset($options['version'])) { + $options['config']['protocol_version'] = $options['version']; + unset($options['version']); + } + + $request = new Request($method, $url, [], null, + isset($options['config']) ? $options['config'] : []); + + unset($options['config']); + + // Use a POST body by default + if ($method == 'POST' && + !isset($options['body']) && + !isset($options['json']) + ) { + $options['body'] = []; + } + + if ($options) { + $this->applyOptions($request, $options); + } + + return $request; + } + + /** + * Create a request or response object from an HTTP message string + * + * @param string $message Message to parse + * + * @return RequestInterface|ResponseInterface + * @throws \InvalidArgumentException if unable to parse a message + */ + public function fromMessage($message) + { + static $parser; + if (!$parser) { + $parser = new MessageParser(); + } + + // Parse a response + if (strtoupper(substr($message, 0, 4)) == 'HTTP') { + $data = $parser->parseResponse($message); + return $this->createResponse( + $data['code'], + $data['headers'], + $data['body'] === '' ? null : $data['body'], + $data + ); + } + + // Parse a request + if (!($data = ($parser->parseRequest($message)))) { + throw new \InvalidArgumentException('Unable to parse request'); + } + + return $this->createRequest( + $data['method'], + Url::buildUrl($data['request_url']), + [ + 'headers' => $data['headers'], + 'body' => $data['body'] === '' ? null : $data['body'], + 'config' => [ + 'protocol_version' => $data['protocol_version'] + ] + ] + ); + } + + /** + * Apply POST fields and files to a request to attempt to give an accurate + * representation. + * + * @param RequestInterface $request Request to update + * @param array $body Body to apply + */ + protected function addPostData(RequestInterface $request, array $body) + { + static $fields = ['string' => true, 'array' => true, 'NULL' => true, + 'boolean' => true, 'double' => true, 'integer' => true]; + + $post = new PostBody(); + foreach ($body as $key => $value) { + if (isset($fields[gettype($value)])) { + $post->setField($key, $value); + } elseif ($value instanceof PostFileInterface) { + $post->addFile($value); + } else { + $post->addFile(new PostFile($key, $value)); + } + } + + $request->setBody($post); + $post->applyRequestHeaders($request); + } + + protected function applyOptions( + RequestInterface $request, + array $options = [] + ) { + // Values specified in the config map are passed to request options + static $configMap = ['connect_timeout' => 1, 'timeout' => 1, + 'verify' => 1, 'ssl_key' => 1, 'cert' => 1, 'proxy' => 1, + 'debug' => 1, 'save_to' => 1, 'stream' => 1, 'expect' => 1]; + + // Take the class of the instance, not the parent + $selfClass = get_class($this); + + // Check if we already took it's class methods and had them saved + if (!isset(self::$classMethods[$selfClass])) { + self::$classMethods[$selfClass] = array_flip(get_class_methods($this)); + } + + // Take class methods of this particular instance + $methods = self::$classMethods[$selfClass]; + + // Iterate over each key value pair and attempt to apply a config using + // double dispatch. + $config = $request->getConfig(); + foreach ($options as $key => $value) { + $method = "add_{$key}"; + if (isset($methods[$method])) { + $this->{$method}($request, $value); + } elseif (isset($configMap[$key])) { + $config[$key] = $value; + } else { + throw new \InvalidArgumentException("No method is configured " + . "to handle the {$key} config key"); + } + } + } + + private function add_body(RequestInterface $request, $value) + { + if ($value !== null) { + if (is_array($value)) { + $this->addPostData($request, $value); + } else { + $request->setBody(Stream\create($value)); + } + } + } + + private function add_allow_redirects(RequestInterface $request, $value) + { + static $defaultRedirect = [ + 'max' => 5, + 'strict' => false, + 'referer' => false + ]; + + if ($value === false) { + return; + } + + if ($value === true) { + $value = $defaultRedirect; + } elseif (!isset($value['max'])) { + throw new \InvalidArgumentException('allow_redirects must be ' + . 'true, false, or an array that contains the \'max\' key'); + } else { + // Merge the default settings with the provided settings + $value += $defaultRedirect; + } + + $request->getConfig()['redirect'] = $value; + $request->getEmitter()->attach($this->redirectPlugin); + } + + private function add_exceptions(RequestInterface $request, $value) + { + if ($value === true) { + $request->getEmitter()->attach($this->errorPlugin); + } + } + + private function add_auth(RequestInterface $request, $value) + { + if (!$value) { + return; + } elseif (is_array($value)) { + $authType = isset($value[2]) ? strtolower($value[2]) : 'basic'; + } else { + $authType = strtolower($value); + } + + $request->getConfig()->set('auth', $value); + + if ($authType == 'basic') { + $request->setHeader( + 'Authorization', + 'Basic ' . base64_encode("$value[0]:$value[1]") + ); + } elseif ($authType == 'digest') { + // Currently only implemented by the cURL adapter. + // @todo: Need an event listener solution that does not rely on cURL + $config = $request->getConfig(); + $config->setPath('curl/' . CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); + $config->setPath('curl/' . CURLOPT_USERPWD, "$value[0]:$value[1]"); + } + } + + private function add_query(RequestInterface $request, $value) + { + if ($value instanceof Query) { + $original = $request->getQuery(); + // Do not overwrite existing query string variables by overwriting + // the object with the query string data passed in the URL + $request->setQuery($value->overwriteWith($original->toArray())); + } elseif (is_array($value)) { + // Do not overwrite existing query string variables + $query = $request->getQuery(); + foreach ($value as $k => $v) { + if (!isset($query[$k])) { + $query[$k] = $v; + } + } + } else { + throw new \InvalidArgumentException('query value must be an array ' + . 'or Query object'); + } + } + + private function add_headers(RequestInterface $request, $value) + { + if (!is_array($value)) { + throw new \InvalidArgumentException('header value must be an array'); + } + + // Do not overwrite existing headers + foreach ($value as $k => $v) { + if (!$request->hasHeader($k)) { + $request->setHeader($k, $v); + } + } + } + + private function add_cookies(RequestInterface $request, $value) + { + if ($value === true) { + static $cookie = null; + if (!$cookie) { + $cookie = new Cookie(); + } + $request->getEmitter()->attach($cookie); + } elseif (is_array($value)) { + $request->getEmitter()->attach( + new Cookie(CookieJar::fromArray($value, $request->getHost())) + ); + } elseif ($value instanceof CookieJarInterface) { + $request->getEmitter()->attach(new Cookie($value)); + } elseif ($value !== false) { + throw new \InvalidArgumentException('cookies must be an array, ' + . 'true, or a CookieJarInterface object'); + } + } + + private function add_events(RequestInterface $request, $value) + { + if (!is_array($value)) { + throw new \InvalidArgumentException('events value must be an array'); + } + + $this->attachListeners($request, $this->prepareListeners($value, + ['before', 'complete', 'error', 'headers'] + )); + } + + private function add_subscribers(RequestInterface $request, $value) + { + if (!is_array($value)) { + throw new \InvalidArgumentException('subscribers must be an array'); + } + + $emitter = $request->getEmitter(); + foreach ($value as $subscribers) { + $emitter->attach($subscribers); + } + } + + private function add_json(RequestInterface $request, $value) + { + if (!$request->hasHeader('Content-Type')) { + $request->setHeader('Content-Type', 'application/json'); + } + + $request->setBody(Stream\create(json_encode($value))); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageFactoryInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageFactoryInterface.php new file mode 100755 index 00000000..daab0427 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageFactoryInterface.php @@ -0,0 +1,71 @@ +getHeaders() as $name => $values) { + * echo $name . ": " . implode(", ", $values); + * } + * + * @return array Returns an associative array of the message's headers. + */ + public function getHeaders(); + + /** + * Retrieve a header by the given case-insensitive name. + * + * By default, this method returns all of the header values of the given + * case-insensitive header name as a string concatenated together using + * a comma. Because some header should not be concatenated together using a + * comma, this method provides a Boolean argument that can be used to + * retrieve the associated header values as an array of strings. + * + * @param string $header Case-insensitive header name. + * @param bool $asArray Set to true to retrieve the header value as an + * array of strings. + * + * @return array|string + */ + public function getHeader($header, $asArray = false); + + /** + * Checks if a header exists by the given case-insensitive name. + * + * @param string $header Case-insensitive header name. + * + * @return bool Returns true if any header names match the given header + * name using a case-insensitive string comparison. Returns false if + * no matching header name is found in the message. + */ + public function hasHeader($header); + + /** + * Remove a specific header by case-insensitive name. + * + * @param string $header Case-insensitive header name. + * + * @return self + */ + public function removeHeader($header); + + /** + * Appends a header value to any existing values associated with the + * given header name. + * + * @param string $header Header name to add + * @param string $value Value of the header + * + * @return self + */ + public function addHeader($header, $value); + + /** + * Merges in an associative array of headers. + * + * Each array key MUST be a string representing the case-insensitive name + * of a header. Each value MUST be either a string or an array of strings. + * For each value, the value is appended to any existing header of the same + * name, or, if a header does not already exist by the given name, then the + * header is added. + * + * @param array $headers Associative array of headers to add to the message + * + * @return self + */ + public function addHeaders(array $headers); + + /** + * Sets a header, replacing any existing values of any headers with the + * same case-insensitive name. + * + * The header values MUST be a string or an array of strings. + * + * @param string $header Header name + * @param string|array $value Header value(s) + * + * @return self Returns the message. + */ + public function setHeader($header, $value); + + /** + * Sets headers, replacing any headers that have already been set on the + * message. + * + * The array keys MUST be a string. The array values must be either a + * string or an array of strings. + * + * @param array $headers Headers to set. + * + * @return self Returns the message. + */ + public function setHeaders(array $headers); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageParser.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageParser.php new file mode 100755 index 00000000..777ce26e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageParser.php @@ -0,0 +1,172 @@ +parseMessage($message))) { + return false; + } + + // Parse the protocol and protocol version + if (isset($parts['start_line'][2])) { + $startParts = explode('/', $parts['start_line'][2]); + $protocol = strtoupper($startParts[0]); + $version = isset($startParts[1]) ? $startParts[1] : '1.1'; + } else { + $protocol = 'HTTP'; + $version = '1.1'; + } + + $parsed = [ + 'method' => strtoupper($parts['start_line'][0]), + 'protocol' => $protocol, + 'protocol_version' => $version, + 'headers' => $parts['headers'], + 'body' => $parts['body'] + ]; + + $parsed['request_url'] = $this->getUrlPartsFromMessage( + (isset($parts['start_line'][1]) ? $parts['start_line'][1] : ''), $parsed); + + return $parsed; + } + + /** + * Parse an HTTP response message into an associative array of parts. + * + * @param string $message HTTP response to parse + * + * @return array|bool Returns false if the message is invalid + */ + public function parseResponse($message) + { + if (!($parts = $this->parseMessage($message))) { + return false; + } + + list($protocol, $version) = explode('/', trim($parts['start_line'][0])); + + return [ + 'protocol' => $protocol, + 'protocol_version' => $version, + 'code' => $parts['start_line'][1], + 'reason_phrase' => isset($parts['start_line'][2]) ? $parts['start_line'][2] : '', + 'headers' => $parts['headers'], + 'body' => $parts['body'] + ]; + } + + /** + * Parse a message into parts + * + * @param string $message Message to parse + * + * @return array|bool + */ + private function parseMessage($message) + { + if (!$message) { + return false; + } + + $startLine = null; + $headers = []; + $body = ''; + + // Iterate over each line in the message, accounting for line endings + $lines = preg_split('/(\\r?\\n)/', $message, -1, PREG_SPLIT_DELIM_CAPTURE); + for ($i = 0, $totalLines = count($lines); $i < $totalLines; $i += 2) { + + $line = $lines[$i]; + + // If two line breaks were encountered, then this is the end of body + if (empty($line)) { + if ($i < $totalLines - 1) { + $body = implode('', array_slice($lines, $i + 2)); + } + break; + } + + // Parse message headers + if (!$startLine) { + $startLine = explode(' ', $line, 3); + } elseif (strpos($line, ':')) { + $parts = explode(':', $line, 2); + $key = trim($parts[0]); + $value = isset($parts[1]) ? trim($parts[1]) : ''; + if (!isset($headers[$key])) { + $headers[$key] = $value; + } elseif (!is_array($headers[$key])) { + $headers[$key] = [$headers[$key], $value]; + } else { + $headers[$key][] = $value; + } + } + } + + return [ + 'start_line' => $startLine, + 'headers' => $headers, + 'body' => $body + ]; + } + + /** + * Create URL parts from HTTP message parts + * + * @param string $requestUrl Associated URL + * @param array $parts HTTP message parts + * + * @return array + */ + private function getUrlPartsFromMessage($requestUrl, array $parts) + { + // Parse the URL information from the message + $urlParts = ['path' => $requestUrl, 'scheme' => 'http']; + + // Check for the Host header + if (isset($parts['headers']['Host'])) { + $urlParts['host'] = $parts['headers']['Host']; + } elseif (isset($parts['headers']['host'])) { + $urlParts['host'] = $parts['headers']['host']; + } else { + $urlParts['host'] = null; + } + + if (false === strpos($urlParts['host'], ':')) { + $urlParts['port'] = ''; + } else { + $hostParts = explode(':', $urlParts['host']); + $urlParts['host'] = trim($hostParts[0]); + $urlParts['port'] = (int) trim($hostParts[1]); + if ($urlParts['port'] == 443) { + $urlParts['scheme'] = 'https'; + } + } + + // Check if a query is present + $path = $urlParts['path']; + $qpos = strpos($path, '?'); + if ($qpos) { + $urlParts['query'] = substr($path, $qpos + 1); + $urlParts['path'] = substr($path, 0, $qpos); + } else { + $urlParts['query'] = ''; + } + + return $urlParts; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/Request.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/Request.php new file mode 100755 index 00000000..5c0e0aef --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/Request.php @@ -0,0 +1,216 @@ +setUrl($url); + $this->method = strtoupper($method); + $this->handleOptions($options); + $this->transferOptions = new Collection($options); + $this->addPrepareEvent(); + + if ($body !== null) { + $this->setBody($body); + } + + if ($headers) { + foreach ($headers as $key => $value) { + $this->setHeader($key, $value); + } + } + } + + public function __clone() + { + if ($this->emitter) { + $this->emitter = clone $this->emitter; + } + $this->transferOptions = clone $this->transferOptions; + $this->url = clone $this->url; + } + + public function setUrl($url) + { + $this->url = $url instanceof Url ? $url : Url::fromString($url); + $this->updateHostHeaderFromUrl(); + + return $this; + } + + public function getUrl() + { + return (string) $this->url; + } + + public function setQuery($query) + { + $this->url->setQuery($query); + + return $this; + } + + public function getQuery() + { + return $this->url->getQuery(); + } + + public function setMethod($method) + { + $this->method = strtoupper($method); + + return $this; + } + + public function getMethod() + { + return $this->method; + } + + public function getScheme() + { + return $this->url->getScheme(); + } + + public function setScheme($scheme) + { + $this->url->setScheme($scheme); + + return $this; + } + + public function getPort() + { + return $this->url->getPort(); + } + + public function setPort($port) + { + $this->url->setPort($port); + $this->updateHostHeaderFromUrl(); + + return $this; + } + + public function getHost() + { + return $this->url->getHost(); + } + + public function setHost($host) + { + $this->url->setHost($host); + $this->updateHostHeaderFromUrl(); + + return $this; + } + + public function getPath() + { + return '/' . ltrim($this->url->getPath(), '/'); + } + + public function setPath($path) + { + $this->url->setPath($path); + + return $this; + } + + public function getResource() + { + $resource = $this->getPath(); + if ($query = (string) $this->url->getQuery()) { + $resource .= '?' . $query; + } + + return $resource; + } + + public function getConfig() + { + return $this->transferOptions; + } + + protected function handleOptions(array &$options) + { + parent::handleOptions($options); + // Use a custom emitter if one is specified, and remove it from + // options that are exposed through getConfig() + if (isset($options['emitter'])) { + $this->emitter = $options['emitter']; + unset($options['emitter']); + } + } + + protected function getStartLine() + { + return trim($this->method . ' ' . $this->getResource()) + . ' HTTP/' . $this->getProtocolVersion(); + } + + /** + * Adds a subscriber that ensures a request's body is prepared before + * sending. + */ + private function addPrepareEvent() + { + static $subscriber; + if (!$subscriber) { + $subscriber = new Prepare(); + } + + $this->getEmitter()->attach($subscriber); + } + + private function updateHostHeaderFromUrl() + { + $port = $this->url->getPort(); + $scheme = $this->url->getScheme(); + if ($host = $this->url->getHost()) { + if (($port == 80 && $scheme == 'http') || + ($port == 443 && $scheme == 'https') + ) { + $this->setHeader('Host', $host); + } else { + $this->setHeader('Host', "{$host}:{$port}"); + } + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/RequestInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/RequestInterface.php new file mode 100755 index 00000000..8cd5de7b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/RequestInterface.php @@ -0,0 +1,150 @@ + 'Continue', + 101 => 'Switching Protocols', + 102 => 'Processing', + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + 207 => 'Multi-Status', + 208 => 'Already Reported', + 226 => 'IM Used', + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 307 => 'Temporary Redirect', + 308 => 'Permanent Redirect', + 400 => 'Bad Request', + 401 => 'Unauthorized', + 402 => 'Payment Required', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Timeout', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Request Entity Too Large', + 414 => 'Request-URI Too Long', + 415 => 'Unsupported Media Type', + 416 => 'Requested Range Not Satisfiable', + 417 => 'Expectation Failed', + 422 => 'Unprocessable Entity', + 423 => 'Locked', + 424 => 'Failed Dependency', + 425 => 'Reserved for WebDAV advanced collections expired proposal', + 426 => 'Upgrade required', + 428 => 'Precondition Required', + 429 => 'Too Many Requests', + 431 => 'Request Header Fields Too Large', + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Timeout', + 505 => 'HTTP Version Not Supported', + 506 => 'Variant Also Negotiates (Experimental)', + 507 => 'Insufficient Storage', + 508 => 'Loop Detected', + 510 => 'Not Extended', + 511 => 'Network Authentication Required', + ); + + /** @var string The reason phrase of the response (human readable code) */ + private $reasonPhrase; + + /** @var string The status code of the response */ + private $statusCode; + + /** @var string The effective URL that returned this response */ + private $effectiveUrl; + + /** + * @param string $statusCode The response status code (e.g. 200) + * @param array $headers The response headers + * @param StreamInterface $body The body of the response + * @param array $options Response message options + * - reason_phrase: Set a custom reason phrase + * - protocol_version: Set a custom protocol version + */ + public function __construct( + $statusCode, + array $headers = [], + StreamInterface $body = null, + array $options = [] + ) { + $this->statusCode = (string) $statusCode; + $this->handleOptions($options); + + // Assume a reason phrase if one was not applied as an option + if (!$this->reasonPhrase && + isset(self::$statusTexts[$this->statusCode]) + ) { + $this->reasonPhrase = self::$statusTexts[$this->statusCode]; + } + + if ($headers) { + $this->setHeaders($headers); + } + + if ($body) { + $this->setBody($body); + } + } + + public function getStatusCode() + { + return $this->statusCode; + } + + public function getReasonPhrase() + { + return $this->reasonPhrase; + } + + public function json(array $config = []) + { + try { + return \GuzzleHttp\json_decode( + (string) $this->getBody(), + isset($config['object']) ? !$config['object'] : true, + 512, + isset($config['big_int_strings']) ? JSON_BIGINT_AS_STRING : 0 + ); + } catch (\InvalidArgumentException $e) { + throw new ParseException( + $e->getMessage(), + $this + ); + } + } + + public function xml(array $config = []) + { + $disableEntities = libxml_disable_entity_loader(true); + $internalErrors = libxml_use_internal_errors(true); + + try { + // Allow XML to be retrieved even if there is no response body + $xml = new \SimpleXMLElement( + (string) $this->getBody() ?: '', + LIBXML_NONET, + isset($config['ns']) ? $config['ns'] : '', + isset($config['ns_is_prefix']) ? $config['ns_is_prefix'] : false + ); + libxml_disable_entity_loader($disableEntities); + libxml_use_internal_errors($internalErrors); + } catch (\Exception $e) { + libxml_disable_entity_loader($disableEntities); + libxml_use_internal_errors($internalErrors); + throw new ParseException( + 'Unable to parse response body into XML: ' . $e->getMessage(), + $this + ); + } + + return $xml; + } + + public function getEffectiveUrl() + { + return $this->effectiveUrl; + } + + public function setEffectiveUrl($url) + { + $this->effectiveUrl = $url; + + return $this; + } + + /** + * Accepts and modifies the options provided to the response in the + * constructor. + * + * @param array $options Options array passed by reference. + */ + protected function handleOptions(array &$options = []) + { + parent::handleOptions($options); + if (isset($options['reason_phrase'])) { + $this->reasonPhrase = $options['reason_phrase']; + } + } + + protected function getStartLine() + { + return 'HTTP/' . $this->getProtocolVersion() + . " {$this->statusCode} {$this->reasonPhrase}"; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/ResponseInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/ResponseInterface.php new file mode 100755 index 00000000..db8252c6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/ResponseInterface.php @@ -0,0 +1,86 @@ + 'text/vnd.in3d.3dml', + '3g2' => 'video/3gpp2', + '3gp' => 'video/3gpp', + '7z' => 'application/x-7z-compressed', + 'aab' => 'application/x-authorware-bin', + 'aac' => 'audio/x-aac', + 'aam' => 'application/x-authorware-map', + 'aas' => 'application/x-authorware-seg', + 'abw' => 'application/x-abiword', + 'ac' => 'application/pkix-attr-cert', + 'acc' => 'application/vnd.americandynamics.acc', + 'ace' => 'application/x-ace-compressed', + 'acu' => 'application/vnd.acucobol', + 'acutc' => 'application/vnd.acucorp', + 'adp' => 'audio/adpcm', + 'aep' => 'application/vnd.audiograph', + 'afm' => 'application/x-font-type1', + 'afp' => 'application/vnd.ibm.modcap', + 'ahead' => 'application/vnd.ahead.space', + 'ai' => 'application/postscript', + 'aif' => 'audio/x-aiff', + 'aifc' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'air' => 'application/vnd.adobe.air-application-installer-package+zip', + 'ait' => 'application/vnd.dvb.ait', + 'ami' => 'application/vnd.amiga.ami', + 'apk' => 'application/vnd.android.package-archive', + 'application' => 'application/x-ms-application', + 'apr' => 'application/vnd.lotus-approach', + 'asa' => 'text/plain', + 'asax' => 'application/octet-stream', + 'asc' => 'application/pgp-signature', + 'ascx' => 'text/plain', + 'asf' => 'video/x-ms-asf', + 'ashx' => 'text/plain', + 'asm' => 'text/x-asm', + 'asmx' => 'text/plain', + 'aso' => 'application/vnd.accpac.simply.aso', + 'asp' => 'text/plain', + 'aspx' => 'text/plain', + 'asx' => 'video/x-ms-asf', + 'atc' => 'application/vnd.acucorp', + 'atom' => 'application/atom+xml', + 'atomcat' => 'application/atomcat+xml', + 'atomsvc' => 'application/atomsvc+xml', + 'atx' => 'application/vnd.antix.game-component', + 'au' => 'audio/basic', + 'avi' => 'video/x-msvideo', + 'aw' => 'application/applixware', + 'axd' => 'text/plain', + 'azf' => 'application/vnd.airzip.filesecure.azf', + 'azs' => 'application/vnd.airzip.filesecure.azs', + 'azw' => 'application/vnd.amazon.ebook', + 'bat' => 'application/x-msdownload', + 'bcpio' => 'application/x-bcpio', + 'bdf' => 'application/x-font-bdf', + 'bdm' => 'application/vnd.syncml.dm+wbxml', + 'bed' => 'application/vnd.realvnc.bed', + 'bh2' => 'application/vnd.fujitsu.oasysprs', + 'bin' => 'application/octet-stream', + 'bmi' => 'application/vnd.bmi', + 'bmp' => 'image/bmp', + 'book' => 'application/vnd.framemaker', + 'box' => 'application/vnd.previewsystems.box', + 'boz' => 'application/x-bzip2', + 'bpk' => 'application/octet-stream', + 'btif' => 'image/prs.btif', + 'bz' => 'application/x-bzip', + 'bz2' => 'application/x-bzip2', + 'c' => 'text/x-c', + 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', + 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', + 'c4d' => 'application/vnd.clonk.c4group', + 'c4f' => 'application/vnd.clonk.c4group', + 'c4g' => 'application/vnd.clonk.c4group', + 'c4p' => 'application/vnd.clonk.c4group', + 'c4u' => 'application/vnd.clonk.c4group', + 'cab' => 'application/vnd.ms-cab-compressed', + 'car' => 'application/vnd.curl.car', + 'cat' => 'application/vnd.ms-pki.seccat', + 'cc' => 'text/x-c', + 'cct' => 'application/x-director', + 'ccxml' => 'application/ccxml+xml', + 'cdbcmsg' => 'application/vnd.contact.cmsg', + 'cdf' => 'application/x-netcdf', + 'cdkey' => 'application/vnd.mediastation.cdkey', + 'cdmia' => 'application/cdmi-capability', + 'cdmic' => 'application/cdmi-container', + 'cdmid' => 'application/cdmi-domain', + 'cdmio' => 'application/cdmi-object', + 'cdmiq' => 'application/cdmi-queue', + 'cdx' => 'chemical/x-cdx', + 'cdxml' => 'application/vnd.chemdraw+xml', + 'cdy' => 'application/vnd.cinderella', + 'cer' => 'application/pkix-cert', + 'cfc' => 'application/x-coldfusion', + 'cfm' => 'application/x-coldfusion', + 'cgm' => 'image/cgm', + 'chat' => 'application/x-chat', + 'chm' => 'application/vnd.ms-htmlhelp', + 'chrt' => 'application/vnd.kde.kchart', + 'cif' => 'chemical/x-cif', + 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', + 'cil' => 'application/vnd.ms-artgalry', + 'cla' => 'application/vnd.claymore', + 'class' => 'application/java-vm', + 'clkk' => 'application/vnd.crick.clicker.keyboard', + 'clkp' => 'application/vnd.crick.clicker.palette', + 'clkt' => 'application/vnd.crick.clicker.template', + 'clkw' => 'application/vnd.crick.clicker.wordbank', + 'clkx' => 'application/vnd.crick.clicker', + 'clp' => 'application/x-msclip', + 'cmc' => 'application/vnd.cosmocaller', + 'cmdf' => 'chemical/x-cmdf', + 'cml' => 'chemical/x-cml', + 'cmp' => 'application/vnd.yellowriver-custom-menu', + 'cmx' => 'image/x-cmx', + 'cod' => 'application/vnd.rim.cod', + 'com' => 'application/x-msdownload', + 'conf' => 'text/plain', + 'cpio' => 'application/x-cpio', + 'cpp' => 'text/x-c', + 'cpt' => 'application/mac-compactpro', + 'crd' => 'application/x-mscardfile', + 'crl' => 'application/pkix-crl', + 'crt' => 'application/x-x509-ca-cert', + 'cryptonote' => 'application/vnd.rig.cryptonote', + 'cs' => 'text/plain', + 'csh' => 'application/x-csh', + 'csml' => 'chemical/x-csml', + 'csp' => 'application/vnd.commonspace', + 'css' => 'text/css', + 'cst' => 'application/x-director', + 'csv' => 'text/csv', + 'cu' => 'application/cu-seeme', + 'curl' => 'text/vnd.curl', + 'cww' => 'application/prs.cww', + 'cxt' => 'application/x-director', + 'cxx' => 'text/x-c', + 'dae' => 'model/vnd.collada+xml', + 'daf' => 'application/vnd.mobius.daf', + 'dataless' => 'application/vnd.fdsn.seed', + 'davmount' => 'application/davmount+xml', + 'dcr' => 'application/x-director', + 'dcurl' => 'text/vnd.curl.dcurl', + 'dd2' => 'application/vnd.oma.dd2+xml', + 'ddd' => 'application/vnd.fujixerox.ddd', + 'deb' => 'application/x-debian-package', + 'def' => 'text/plain', + 'deploy' => 'application/octet-stream', + 'der' => 'application/x-x509-ca-cert', + 'dfac' => 'application/vnd.dreamfactory', + 'dic' => 'text/x-c', + 'dir' => 'application/x-director', + 'dis' => 'application/vnd.mobius.dis', + 'dist' => 'application/octet-stream', + 'distz' => 'application/octet-stream', + 'djv' => 'image/vnd.djvu', + 'djvu' => 'image/vnd.djvu', + 'dll' => 'application/x-msdownload', + 'dmg' => 'application/octet-stream', + 'dms' => 'application/octet-stream', + 'dna' => 'application/vnd.dna', + 'doc' => 'application/msword', + 'docm' => 'application/vnd.ms-word.document.macroenabled.12', + 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'dot' => 'application/msword', + 'dotm' => 'application/vnd.ms-word.template.macroenabled.12', + 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', + 'dp' => 'application/vnd.osgi.dp', + 'dpg' => 'application/vnd.dpgraph', + 'dra' => 'audio/vnd.dra', + 'dsc' => 'text/prs.lines.tag', + 'dssc' => 'application/dssc+der', + 'dtb' => 'application/x-dtbook+xml', + 'dtd' => 'application/xml-dtd', + 'dts' => 'audio/vnd.dts', + 'dtshd' => 'audio/vnd.dts.hd', + 'dump' => 'application/octet-stream', + 'dvi' => 'application/x-dvi', + 'dwf' => 'model/vnd.dwf', + 'dwg' => 'image/vnd.dwg', + 'dxf' => 'image/vnd.dxf', + 'dxp' => 'application/vnd.spotfire.dxp', + 'dxr' => 'application/x-director', + 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', + 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', + 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', + 'ecma' => 'application/ecmascript', + 'edm' => 'application/vnd.novadigm.edm', + 'edx' => 'application/vnd.novadigm.edx', + 'efif' => 'application/vnd.picsel', + 'ei6' => 'application/vnd.pg.osasli', + 'elc' => 'application/octet-stream', + 'eml' => 'message/rfc822', + 'emma' => 'application/emma+xml', + 'eol' => 'audio/vnd.digital-winds', + 'eot' => 'application/vnd.ms-fontobject', + 'eps' => 'application/postscript', + 'epub' => 'application/epub+zip', + 'es3' => 'application/vnd.eszigno3+xml', + 'esf' => 'application/vnd.epson.esf', + 'et3' => 'application/vnd.eszigno3+xml', + 'etx' => 'text/x-setext', + 'exe' => 'application/x-msdownload', + 'exi' => 'application/exi', + 'ext' => 'application/vnd.novadigm.ext', + 'ez' => 'application/andrew-inset', + 'ez2' => 'application/vnd.ezpix-album', + 'ez3' => 'application/vnd.ezpix-package', + 'f' => 'text/x-fortran', + 'f4v' => 'video/x-f4v', + 'f77' => 'text/x-fortran', + 'f90' => 'text/x-fortran', + 'fbs' => 'image/vnd.fastbidsheet', + 'fcs' => 'application/vnd.isac.fcs', + 'fdf' => 'application/vnd.fdf', + 'fe_launch' => 'application/vnd.denovo.fcselayout-link', + 'fg5' => 'application/vnd.fujitsu.oasysgp', + 'fgd' => 'application/x-director', + 'fh' => 'image/x-freehand', + 'fh4' => 'image/x-freehand', + 'fh5' => 'image/x-freehand', + 'fh7' => 'image/x-freehand', + 'fhc' => 'image/x-freehand', + 'fig' => 'application/x-xfig', + 'fli' => 'video/x-fli', + 'flo' => 'application/vnd.micrografx.flo', + 'flv' => 'video/x-flv', + 'flw' => 'application/vnd.kde.kivio', + 'flx' => 'text/vnd.fmi.flexstor', + 'fly' => 'text/vnd.fly', + 'fm' => 'application/vnd.framemaker', + 'fnc' => 'application/vnd.frogans.fnc', + 'for' => 'text/x-fortran', + 'fpx' => 'image/vnd.fpx', + 'frame' => 'application/vnd.framemaker', + 'fsc' => 'application/vnd.fsc.weblaunch', + 'fst' => 'image/vnd.fst', + 'ftc' => 'application/vnd.fluxtime.clip', + 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', + 'fvt' => 'video/vnd.fvt', + 'fxp' => 'application/vnd.adobe.fxp', + 'fxpl' => 'application/vnd.adobe.fxp', + 'fzs' => 'application/vnd.fuzzysheet', + 'g2w' => 'application/vnd.geoplan', + 'g3' => 'image/g3fax', + 'g3w' => 'application/vnd.geospace', + 'gac' => 'application/vnd.groove-account', + 'gdl' => 'model/vnd.gdl', + 'geo' => 'application/vnd.dynageo', + 'gex' => 'application/vnd.geometry-explorer', + 'ggb' => 'application/vnd.geogebra.file', + 'ggt' => 'application/vnd.geogebra.tool', + 'ghf' => 'application/vnd.groove-help', + 'gif' => 'image/gif', + 'gim' => 'application/vnd.groove-identity-message', + 'gmx' => 'application/vnd.gmx', + 'gnumeric' => 'application/x-gnumeric', + 'gph' => 'application/vnd.flographit', + 'gqf' => 'application/vnd.grafeq', + 'gqs' => 'application/vnd.grafeq', + 'gram' => 'application/srgs', + 'gre' => 'application/vnd.geometry-explorer', + 'grv' => 'application/vnd.groove-injector', + 'grxml' => 'application/srgs+xml', + 'gsf' => 'application/x-font-ghostscript', + 'gtar' => 'application/x-gtar', + 'gtm' => 'application/vnd.groove-tool-message', + 'gtw' => 'model/vnd.gtw', + 'gv' => 'text/vnd.graphviz', + 'gxt' => 'application/vnd.geonext', + 'h' => 'text/x-c', + 'h261' => 'video/h261', + 'h263' => 'video/h263', + 'h264' => 'video/h264', + 'hal' => 'application/vnd.hal+xml', + 'hbci' => 'application/vnd.hbci', + 'hdf' => 'application/x-hdf', + 'hh' => 'text/x-c', + 'hlp' => 'application/winhlp', + 'hpgl' => 'application/vnd.hp-hpgl', + 'hpid' => 'application/vnd.hp-hpid', + 'hps' => 'application/vnd.hp-hps', + 'hqx' => 'application/mac-binhex40', + 'hta' => 'application/octet-stream', + 'htc' => 'text/html', + 'htke' => 'application/vnd.kenameaapp', + 'htm' => 'text/html', + 'html' => 'text/html', + 'hvd' => 'application/vnd.yamaha.hv-dic', + 'hvp' => 'application/vnd.yamaha.hv-voice', + 'hvs' => 'application/vnd.yamaha.hv-script', + 'i2g' => 'application/vnd.intergeo', + 'icc' => 'application/vnd.iccprofile', + 'ice' => 'x-conference/x-cooltalk', + 'icm' => 'application/vnd.iccprofile', + 'ico' => 'image/x-icon', + 'ics' => 'text/calendar', + 'ief' => 'image/ief', + 'ifb' => 'text/calendar', + 'ifm' => 'application/vnd.shana.informed.formdata', + 'iges' => 'model/iges', + 'igl' => 'application/vnd.igloader', + 'igm' => 'application/vnd.insors.igm', + 'igs' => 'model/iges', + 'igx' => 'application/vnd.micrografx.igx', + 'iif' => 'application/vnd.shana.informed.interchange', + 'imp' => 'application/vnd.accpac.simply.imp', + 'ims' => 'application/vnd.ms-ims', + 'in' => 'text/plain', + 'ini' => 'text/plain', + 'ipfix' => 'application/ipfix', + 'ipk' => 'application/vnd.shana.informed.package', + 'irm' => 'application/vnd.ibm.rights-management', + 'irp' => 'application/vnd.irepository.package+xml', + 'iso' => 'application/octet-stream', + 'itp' => 'application/vnd.shana.informed.formtemplate', + 'ivp' => 'application/vnd.immervision-ivp', + 'ivu' => 'application/vnd.immervision-ivu', + 'jad' => 'text/vnd.sun.j2me.app-descriptor', + 'jam' => 'application/vnd.jam', + 'jar' => 'application/java-archive', + 'java' => 'text/x-java-source', + 'jisp' => 'application/vnd.jisp', + 'jlt' => 'application/vnd.hp-jlyt', + 'jnlp' => 'application/x-java-jnlp-file', + 'joda' => 'application/vnd.joost.joda-archive', + 'jpe' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'jpgm' => 'video/jpm', + 'jpgv' => 'video/jpeg', + 'jpm' => 'video/jpm', + 'js' => 'text/javascript', + 'json' => 'application/json', + 'kar' => 'audio/midi', + 'karbon' => 'application/vnd.kde.karbon', + 'kfo' => 'application/vnd.kde.kformula', + 'kia' => 'application/vnd.kidspiration', + 'kml' => 'application/vnd.google-earth.kml+xml', + 'kmz' => 'application/vnd.google-earth.kmz', + 'kne' => 'application/vnd.kinar', + 'knp' => 'application/vnd.kinar', + 'kon' => 'application/vnd.kde.kontour', + 'kpr' => 'application/vnd.kde.kpresenter', + 'kpt' => 'application/vnd.kde.kpresenter', + 'ksp' => 'application/vnd.kde.kspread', + 'ktr' => 'application/vnd.kahootz', + 'ktx' => 'image/ktx', + 'ktz' => 'application/vnd.kahootz', + 'kwd' => 'application/vnd.kde.kword', + 'kwt' => 'application/vnd.kde.kword', + 'lasxml' => 'application/vnd.las.las+xml', + 'latex' => 'application/x-latex', + 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', + 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', + 'les' => 'application/vnd.hhe.lesson-player', + 'lha' => 'application/octet-stream', + 'link66' => 'application/vnd.route66.link66+xml', + 'list' => 'text/plain', + 'list3820' => 'application/vnd.ibm.modcap', + 'listafp' => 'application/vnd.ibm.modcap', + 'log' => 'text/plain', + 'lostxml' => 'application/lost+xml', + 'lrf' => 'application/octet-stream', + 'lrm' => 'application/vnd.ms-lrm', + 'ltf' => 'application/vnd.frogans.ltf', + 'lvp' => 'audio/vnd.lucent.voice', + 'lwp' => 'application/vnd.lotus-wordpro', + 'lzh' => 'application/octet-stream', + 'm13' => 'application/x-msmediaview', + 'm14' => 'application/x-msmediaview', + 'm1v' => 'video/mpeg', + 'm21' => 'application/mp21', + 'm2a' => 'audio/mpeg', + 'm2v' => 'video/mpeg', + 'm3a' => 'audio/mpeg', + 'm3u' => 'audio/x-mpegurl', + 'm3u8' => 'application/vnd.apple.mpegurl', + 'm4a' => 'audio/mp4', + 'm4u' => 'video/vnd.mpegurl', + 'm4v' => 'video/mp4', + 'ma' => 'application/mathematica', + 'mads' => 'application/mads+xml', + 'mag' => 'application/vnd.ecowin.chart', + 'maker' => 'application/vnd.framemaker', + 'man' => 'text/troff', + 'mathml' => 'application/mathml+xml', + 'mb' => 'application/mathematica', + 'mbk' => 'application/vnd.mobius.mbk', + 'mbox' => 'application/mbox', + 'mc1' => 'application/vnd.medcalcdata', + 'mcd' => 'application/vnd.mcd', + 'mcurl' => 'text/vnd.curl.mcurl', + 'mdb' => 'application/x-msaccess', + 'mdi' => 'image/vnd.ms-modi', + 'me' => 'text/troff', + 'mesh' => 'model/mesh', + 'meta4' => 'application/metalink4+xml', + 'mets' => 'application/mets+xml', + 'mfm' => 'application/vnd.mfmp', + 'mgp' => 'application/vnd.osgeo.mapguide.package', + 'mgz' => 'application/vnd.proteus.magazine', + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mif' => 'application/vnd.mif', + 'mime' => 'message/rfc822', + 'mj2' => 'video/mj2', + 'mjp2' => 'video/mj2', + 'mlp' => 'application/vnd.dolby.mlp', + 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', + 'mmf' => 'application/vnd.smaf', + 'mmr' => 'image/vnd.fujixerox.edmics-mmr', + 'mny' => 'application/x-msmoney', + 'mobi' => 'application/x-mobipocket-ebook', + 'mods' => 'application/mods+xml', + 'mov' => 'video/quicktime', + 'movie' => 'video/x-sgi-movie', + 'mp2' => 'audio/mpeg', + 'mp21' => 'application/mp21', + 'mp2a' => 'audio/mpeg', + 'mp3' => 'audio/mpeg', + 'mp4' => 'video/mp4', + 'mp4a' => 'audio/mp4', + 'mp4s' => 'application/mp4', + 'mp4v' => 'video/mp4', + 'mpc' => 'application/vnd.mophun.certificate', + 'mpe' => 'video/mpeg', + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mpg4' => 'video/mp4', + 'mpga' => 'audio/mpeg', + 'mpkg' => 'application/vnd.apple.installer+xml', + 'mpm' => 'application/vnd.blueice.multipass', + 'mpn' => 'application/vnd.mophun.application', + 'mpp' => 'application/vnd.ms-project', + 'mpt' => 'application/vnd.ms-project', + 'mpy' => 'application/vnd.ibm.minipay', + 'mqy' => 'application/vnd.mobius.mqy', + 'mrc' => 'application/marc', + 'mrcx' => 'application/marcxml+xml', + 'ms' => 'text/troff', + 'mscml' => 'application/mediaservercontrol+xml', + 'mseed' => 'application/vnd.fdsn.mseed', + 'mseq' => 'application/vnd.mseq', + 'msf' => 'application/vnd.epson.msf', + 'msh' => 'model/mesh', + 'msi' => 'application/x-msdownload', + 'msl' => 'application/vnd.mobius.msl', + 'msty' => 'application/vnd.muvee.style', + 'mts' => 'model/vnd.mts', + 'mus' => 'application/vnd.musician', + 'musicxml' => 'application/vnd.recordare.musicxml+xml', + 'mvb' => 'application/x-msmediaview', + 'mwf' => 'application/vnd.mfer', + 'mxf' => 'application/mxf', + 'mxl' => 'application/vnd.recordare.musicxml', + 'mxml' => 'application/xv+xml', + 'mxs' => 'application/vnd.triscape.mxs', + 'mxu' => 'video/vnd.mpegurl', + 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', + 'n3' => 'text/n3', + 'nb' => 'application/mathematica', + 'nbp' => 'application/vnd.wolfram.player', + 'nc' => 'application/x-netcdf', + 'ncx' => 'application/x-dtbncx+xml', + 'ngdat' => 'application/vnd.nokia.n-gage.data', + 'nlu' => 'application/vnd.neurolanguage.nlu', + 'nml' => 'application/vnd.enliven', + 'nnd' => 'application/vnd.noblenet-directory', + 'nns' => 'application/vnd.noblenet-sealer', + 'nnw' => 'application/vnd.noblenet-web', + 'npx' => 'image/vnd.net-fpx', + 'nsf' => 'application/vnd.lotus-notes', + 'oa2' => 'application/vnd.fujitsu.oasys2', + 'oa3' => 'application/vnd.fujitsu.oasys3', + 'oas' => 'application/vnd.fujitsu.oasys', + 'obd' => 'application/x-msbinder', + 'oda' => 'application/oda', + 'odb' => 'application/vnd.oasis.opendocument.database', + 'odc' => 'application/vnd.oasis.opendocument.chart', + 'odf' => 'application/vnd.oasis.opendocument.formula', + 'odft' => 'application/vnd.oasis.opendocument.formula-template', + 'odg' => 'application/vnd.oasis.opendocument.graphics', + 'odi' => 'application/vnd.oasis.opendocument.image', + 'odm' => 'application/vnd.oasis.opendocument.text-master', + 'odp' => 'application/vnd.oasis.opendocument.presentation', + 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', + 'odt' => 'application/vnd.oasis.opendocument.text', + 'oga' => 'audio/ogg', + 'ogg' => 'audio/ogg', + 'ogv' => 'video/ogg', + 'ogx' => 'application/ogg', + 'onepkg' => 'application/onenote', + 'onetmp' => 'application/onenote', + 'onetoc' => 'application/onenote', + 'onetoc2' => 'application/onenote', + 'opf' => 'application/oebps-package+xml', + 'oprc' => 'application/vnd.palm', + 'org' => 'application/vnd.lotus-organizer', + 'osf' => 'application/vnd.yamaha.openscoreformat', + 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', + 'otc' => 'application/vnd.oasis.opendocument.chart-template', + 'otf' => 'application/x-font-otf', + 'otg' => 'application/vnd.oasis.opendocument.graphics-template', + 'oth' => 'application/vnd.oasis.opendocument.text-web', + 'oti' => 'application/vnd.oasis.opendocument.image-template', + 'otp' => 'application/vnd.oasis.opendocument.presentation-template', + 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', + 'ott' => 'application/vnd.oasis.opendocument.text-template', + 'oxt' => 'application/vnd.openofficeorg.extension', + 'p' => 'text/x-pascal', + 'p10' => 'application/pkcs10', + 'p12' => 'application/x-pkcs12', + 'p7b' => 'application/x-pkcs7-certificates', + 'p7c' => 'application/pkcs7-mime', + 'p7m' => 'application/pkcs7-mime', + 'p7r' => 'application/x-pkcs7-certreqresp', + 'p7s' => 'application/pkcs7-signature', + 'p8' => 'application/pkcs8', + 'pas' => 'text/x-pascal', + 'paw' => 'application/vnd.pawaafile', + 'pbd' => 'application/vnd.powerbuilder6', + 'pbm' => 'image/x-portable-bitmap', + 'pcf' => 'application/x-font-pcf', + 'pcl' => 'application/vnd.hp-pcl', + 'pclxl' => 'application/vnd.hp-pclxl', + 'pct' => 'image/x-pict', + 'pcurl' => 'application/vnd.curl.pcurl', + 'pcx' => 'image/x-pcx', + 'pdb' => 'application/vnd.palm', + 'pdf' => 'application/pdf', + 'pfa' => 'application/x-font-type1', + 'pfb' => 'application/x-font-type1', + 'pfm' => 'application/x-font-type1', + 'pfr' => 'application/font-tdpfr', + 'pfx' => 'application/x-pkcs12', + 'pgm' => 'image/x-portable-graymap', + 'pgn' => 'application/x-chess-pgn', + 'pgp' => 'application/pgp-encrypted', + 'php' => 'text/x-php', + 'phps' => 'application/x-httpd-phps', + 'pic' => 'image/x-pict', + 'pkg' => 'application/octet-stream', + 'pki' => 'application/pkixcmp', + 'pkipath' => 'application/pkix-pkipath', + 'plb' => 'application/vnd.3gpp.pic-bw-large', + 'plc' => 'application/vnd.mobius.plc', + 'plf' => 'application/vnd.pocketlearn', + 'pls' => 'application/pls+xml', + 'pml' => 'application/vnd.ctc-posml', + 'png' => 'image/png', + 'pnm' => 'image/x-portable-anymap', + 'portpkg' => 'application/vnd.macports.portpkg', + 'pot' => 'application/vnd.ms-powerpoint', + 'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12', + 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', + 'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12', + 'ppd' => 'application/vnd.cups-ppd', + 'ppm' => 'image/x-portable-pixmap', + 'pps' => 'application/vnd.ms-powerpoint', + 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12', + 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', + 'ppt' => 'application/vnd.ms-powerpoint', + 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12', + 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'pqa' => 'application/vnd.palm', + 'prc' => 'application/x-mobipocket-ebook', + 'pre' => 'application/vnd.lotus-freelance', + 'prf' => 'application/pics-rules', + 'ps' => 'application/postscript', + 'psb' => 'application/vnd.3gpp.pic-bw-small', + 'psd' => 'image/vnd.adobe.photoshop', + 'psf' => 'application/x-font-linux-psf', + 'pskcxml' => 'application/pskc+xml', + 'ptid' => 'application/vnd.pvi.ptid1', + 'pub' => 'application/x-mspublisher', + 'pvb' => 'application/vnd.3gpp.pic-bw-var', + 'pwn' => 'application/vnd.3m.post-it-notes', + 'pya' => 'audio/vnd.ms-playready.media.pya', + 'pyv' => 'video/vnd.ms-playready.media.pyv', + 'qam' => 'application/vnd.epson.quickanime', + 'qbo' => 'application/vnd.intu.qbo', + 'qfx' => 'application/vnd.intu.qfx', + 'qps' => 'application/vnd.publishare-delta-tree', + 'qt' => 'video/quicktime', + 'qwd' => 'application/vnd.quark.quarkxpress', + 'qwt' => 'application/vnd.quark.quarkxpress', + 'qxb' => 'application/vnd.quark.quarkxpress', + 'qxd' => 'application/vnd.quark.quarkxpress', + 'qxl' => 'application/vnd.quark.quarkxpress', + 'qxt' => 'application/vnd.quark.quarkxpress', + 'ra' => 'audio/x-pn-realaudio', + 'ram' => 'audio/x-pn-realaudio', + 'rar' => 'application/x-rar-compressed', + 'ras' => 'image/x-cmu-raster', + 'rb' => 'text/plain', + 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', + 'rdf' => 'application/rdf+xml', + 'rdz' => 'application/vnd.data-vision.rdz', + 'rep' => 'application/vnd.businessobjects', + 'res' => 'application/x-dtbresource+xml', + 'resx' => 'text/xml', + 'rgb' => 'image/x-rgb', + 'rif' => 'application/reginfo+xml', + 'rip' => 'audio/vnd.rip', + 'rl' => 'application/resource-lists+xml', + 'rlc' => 'image/vnd.fujixerox.edmics-rlc', + 'rld' => 'application/resource-lists-diff+xml', + 'rm' => 'application/vnd.rn-realmedia', + 'rmi' => 'audio/midi', + 'rmp' => 'audio/x-pn-realaudio-plugin', + 'rms' => 'application/vnd.jcp.javame.midlet-rms', + 'rnc' => 'application/relax-ng-compact-syntax', + 'roff' => 'text/troff', + 'rp9' => 'application/vnd.cloanto.rp9', + 'rpss' => 'application/vnd.nokia.radio-presets', + 'rpst' => 'application/vnd.nokia.radio-preset', + 'rq' => 'application/sparql-query', + 'rs' => 'application/rls-services+xml', + 'rsd' => 'application/rsd+xml', + 'rss' => 'application/rss+xml', + 'rtf' => 'application/rtf', + 'rtx' => 'text/richtext', + 's' => 'text/x-asm', + 'saf' => 'application/vnd.yamaha.smaf-audio', + 'sbml' => 'application/sbml+xml', + 'sc' => 'application/vnd.ibm.secure-container', + 'scd' => 'application/x-msschedule', + 'scm' => 'application/vnd.lotus-screencam', + 'scq' => 'application/scvp-cv-request', + 'scs' => 'application/scvp-cv-response', + 'scurl' => 'text/vnd.curl.scurl', + 'sda' => 'application/vnd.stardivision.draw', + 'sdc' => 'application/vnd.stardivision.calc', + 'sdd' => 'application/vnd.stardivision.impress', + 'sdkd' => 'application/vnd.solent.sdkm+xml', + 'sdkm' => 'application/vnd.solent.sdkm+xml', + 'sdp' => 'application/sdp', + 'sdw' => 'application/vnd.stardivision.writer', + 'see' => 'application/vnd.seemail', + 'seed' => 'application/vnd.fdsn.seed', + 'sema' => 'application/vnd.sema', + 'semd' => 'application/vnd.semd', + 'semf' => 'application/vnd.semf', + 'ser' => 'application/java-serialized-object', + 'setpay' => 'application/set-payment-initiation', + 'setreg' => 'application/set-registration-initiation', + 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', + 'sfs' => 'application/vnd.spotfire.sfs', + 'sgl' => 'application/vnd.stardivision.writer-global', + 'sgm' => 'text/sgml', + 'sgml' => 'text/sgml', + 'sh' => 'application/x-sh', + 'shar' => 'application/x-shar', + 'shf' => 'application/shf+xml', + 'sig' => 'application/pgp-signature', + 'silo' => 'model/mesh', + 'sis' => 'application/vnd.symbian.install', + 'sisx' => 'application/vnd.symbian.install', + 'sit' => 'application/x-stuffit', + 'sitx' => 'application/x-stuffitx', + 'skd' => 'application/vnd.koan', + 'skm' => 'application/vnd.koan', + 'skp' => 'application/vnd.koan', + 'skt' => 'application/vnd.koan', + 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', + 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', + 'slt' => 'application/vnd.epson.salt', + 'sm' => 'application/vnd.stepmania.stepchart', + 'smf' => 'application/vnd.stardivision.math', + 'smi' => 'application/smil+xml', + 'smil' => 'application/smil+xml', + 'snd' => 'audio/basic', + 'snf' => 'application/x-font-snf', + 'so' => 'application/octet-stream', + 'spc' => 'application/x-pkcs7-certificates', + 'spf' => 'application/vnd.yamaha.smaf-phrase', + 'spl' => 'application/x-futuresplash', + 'spot' => 'text/vnd.in3d.spot', + 'spp' => 'application/scvp-vp-response', + 'spq' => 'application/scvp-vp-request', + 'spx' => 'audio/ogg', + 'src' => 'application/x-wais-source', + 'sru' => 'application/sru+xml', + 'srx' => 'application/sparql-results+xml', + 'sse' => 'application/vnd.kodak-descriptor', + 'ssf' => 'application/vnd.epson.ssf', + 'ssml' => 'application/ssml+xml', + 'st' => 'application/vnd.sailingtracker.track', + 'stc' => 'application/vnd.sun.xml.calc.template', + 'std' => 'application/vnd.sun.xml.draw.template', + 'stf' => 'application/vnd.wt.stf', + 'sti' => 'application/vnd.sun.xml.impress.template', + 'stk' => 'application/hyperstudio', + 'stl' => 'application/vnd.ms-pki.stl', + 'str' => 'application/vnd.pg.format', + 'stw' => 'application/vnd.sun.xml.writer.template', + 'sub' => 'image/vnd.dvb.subtitle', + 'sus' => 'application/vnd.sus-calendar', + 'susp' => 'application/vnd.sus-calendar', + 'sv4cpio' => 'application/x-sv4cpio', + 'sv4crc' => 'application/x-sv4crc', + 'svc' => 'application/vnd.dvb.service', + 'svd' => 'application/vnd.svd', + 'svg' => 'image/svg+xml', + 'svgz' => 'image/svg+xml', + 'swa' => 'application/x-director', + 'swf' => 'application/x-shockwave-flash', + 'swi' => 'application/vnd.aristanetworks.swi', + 'sxc' => 'application/vnd.sun.xml.calc', + 'sxd' => 'application/vnd.sun.xml.draw', + 'sxg' => 'application/vnd.sun.xml.writer.global', + 'sxi' => 'application/vnd.sun.xml.impress', + 'sxm' => 'application/vnd.sun.xml.math', + 'sxw' => 'application/vnd.sun.xml.writer', + 't' => 'text/troff', + 'tao' => 'application/vnd.tao.intent-module-archive', + 'tar' => 'application/x-tar', + 'tcap' => 'application/vnd.3gpp2.tcap', + 'tcl' => 'application/x-tcl', + 'teacher' => 'application/vnd.smart.teacher', + 'tei' => 'application/tei+xml', + 'teicorpus' => 'application/tei+xml', + 'tex' => 'application/x-tex', + 'texi' => 'application/x-texinfo', + 'texinfo' => 'application/x-texinfo', + 'text' => 'text/plain', + 'tfi' => 'application/thraud+xml', + 'tfm' => 'application/x-tex-tfm', + 'thmx' => 'application/vnd.ms-officetheme', + 'tif' => 'image/tiff', + 'tiff' => 'image/tiff', + 'tmo' => 'application/vnd.tmobile-livetv', + 'torrent' => 'application/x-bittorrent', + 'tpl' => 'application/vnd.groove-tool-template', + 'tpt' => 'application/vnd.trid.tpt', + 'tr' => 'text/troff', + 'tra' => 'application/vnd.trueapp', + 'trm' => 'application/x-msterminal', + 'tsd' => 'application/timestamped-data', + 'tsv' => 'text/tab-separated-values', + 'ttc' => 'application/x-font-ttf', + 'ttf' => 'application/x-font-ttf', + 'ttl' => 'text/turtle', + 'twd' => 'application/vnd.simtech-mindmapper', + 'twds' => 'application/vnd.simtech-mindmapper', + 'txd' => 'application/vnd.genomatix.tuxedo', + 'txf' => 'application/vnd.mobius.txf', + 'txt' => 'text/plain', + 'u32' => 'application/x-authorware-bin', + 'udeb' => 'application/x-debian-package', + 'ufd' => 'application/vnd.ufdl', + 'ufdl' => 'application/vnd.ufdl', + 'umj' => 'application/vnd.umajin', + 'unityweb' => 'application/vnd.unity', + 'uoml' => 'application/vnd.uoml+xml', + 'uri' => 'text/uri-list', + 'uris' => 'text/uri-list', + 'urls' => 'text/uri-list', + 'ustar' => 'application/x-ustar', + 'utz' => 'application/vnd.uiq.theme', + 'uu' => 'text/x-uuencode', + 'uva' => 'audio/vnd.dece.audio', + 'uvd' => 'application/vnd.dece.data', + 'uvf' => 'application/vnd.dece.data', + 'uvg' => 'image/vnd.dece.graphic', + 'uvh' => 'video/vnd.dece.hd', + 'uvi' => 'image/vnd.dece.graphic', + 'uvm' => 'video/vnd.dece.mobile', + 'uvp' => 'video/vnd.dece.pd', + 'uvs' => 'video/vnd.dece.sd', + 'uvt' => 'application/vnd.dece.ttml+xml', + 'uvu' => 'video/vnd.uvvu.mp4', + 'uvv' => 'video/vnd.dece.video', + 'uvva' => 'audio/vnd.dece.audio', + 'uvvd' => 'application/vnd.dece.data', + 'uvvf' => 'application/vnd.dece.data', + 'uvvg' => 'image/vnd.dece.graphic', + 'uvvh' => 'video/vnd.dece.hd', + 'uvvi' => 'image/vnd.dece.graphic', + 'uvvm' => 'video/vnd.dece.mobile', + 'uvvp' => 'video/vnd.dece.pd', + 'uvvs' => 'video/vnd.dece.sd', + 'uvvt' => 'application/vnd.dece.ttml+xml', + 'uvvu' => 'video/vnd.uvvu.mp4', + 'uvvv' => 'video/vnd.dece.video', + 'uvvx' => 'application/vnd.dece.unspecified', + 'uvx' => 'application/vnd.dece.unspecified', + 'vcd' => 'application/x-cdlink', + 'vcf' => 'text/x-vcard', + 'vcg' => 'application/vnd.groove-vcard', + 'vcs' => 'text/x-vcalendar', + 'vcx' => 'application/vnd.vcx', + 'vis' => 'application/vnd.visionary', + 'viv' => 'video/vnd.vivo', + 'vor' => 'application/vnd.stardivision.writer', + 'vox' => 'application/x-authorware-bin', + 'vrml' => 'model/vrml', + 'vsd' => 'application/vnd.visio', + 'vsf' => 'application/vnd.vsf', + 'vss' => 'application/vnd.visio', + 'vst' => 'application/vnd.visio', + 'vsw' => 'application/vnd.visio', + 'vtu' => 'model/vnd.vtu', + 'vxml' => 'application/voicexml+xml', + 'w3d' => 'application/x-director', + 'wad' => 'application/x-doom', + 'wav' => 'audio/x-wav', + 'wax' => 'audio/x-ms-wax', + 'wbmp' => 'image/vnd.wap.wbmp', + 'wbs' => 'application/vnd.criticaltools.wbs+xml', + 'wbxml' => 'application/vnd.wap.wbxml', + 'wcm' => 'application/vnd.ms-works', + 'wdb' => 'application/vnd.ms-works', + 'weba' => 'audio/webm', + 'webm' => 'video/webm', + 'webp' => 'image/webp', + 'wg' => 'application/vnd.pmi.widget', + 'wgt' => 'application/widget', + 'wks' => 'application/vnd.ms-works', + 'wm' => 'video/x-ms-wm', + 'wma' => 'audio/x-ms-wma', + 'wmd' => 'application/x-ms-wmd', + 'wmf' => 'application/x-msmetafile', + 'wml' => 'text/vnd.wap.wml', + 'wmlc' => 'application/vnd.wap.wmlc', + 'wmls' => 'text/vnd.wap.wmlscript', + 'wmlsc' => 'application/vnd.wap.wmlscriptc', + 'wmv' => 'video/x-ms-wmv', + 'wmx' => 'video/x-ms-wmx', + 'wmz' => 'application/x-ms-wmz', + 'woff' => 'application/x-font-woff', + 'wpd' => 'application/vnd.wordperfect', + 'wpl' => 'application/vnd.ms-wpl', + 'wps' => 'application/vnd.ms-works', + 'wqd' => 'application/vnd.wqd', + 'wri' => 'application/x-mswrite', + 'wrl' => 'model/vrml', + 'wsdl' => 'application/wsdl+xml', + 'wspolicy' => 'application/wspolicy+xml', + 'wtb' => 'application/vnd.webturbo', + 'wvx' => 'video/x-ms-wvx', + 'x32' => 'application/x-authorware-bin', + 'x3d' => 'application/vnd.hzn-3d-crossword', + 'xap' => 'application/x-silverlight-app', + 'xar' => 'application/vnd.xara', + 'xbap' => 'application/x-ms-xbap', + 'xbd' => 'application/vnd.fujixerox.docuworks.binder', + 'xbm' => 'image/x-xbitmap', + 'xdf' => 'application/xcap-diff+xml', + 'xdm' => 'application/vnd.syncml.dm+xml', + 'xdp' => 'application/vnd.adobe.xdp+xml', + 'xdssc' => 'application/dssc+xml', + 'xdw' => 'application/vnd.fujixerox.docuworks', + 'xenc' => 'application/xenc+xml', + 'xer' => 'application/patch-ops-error+xml', + 'xfdf' => 'application/vnd.adobe.xfdf', + 'xfdl' => 'application/vnd.xfdl', + 'xht' => 'application/xhtml+xml', + 'xhtml' => 'application/xhtml+xml', + 'xhvml' => 'application/xv+xml', + 'xif' => 'image/vnd.xiff', + 'xla' => 'application/vnd.ms-excel', + 'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12', + 'xlc' => 'application/vnd.ms-excel', + 'xlm' => 'application/vnd.ms-excel', + 'xls' => 'application/vnd.ms-excel', + 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12', + 'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12', + 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'xlt' => 'application/vnd.ms-excel', + 'xltm' => 'application/vnd.ms-excel.template.macroenabled.12', + 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', + 'xlw' => 'application/vnd.ms-excel', + 'xml' => 'application/xml', + 'xo' => 'application/vnd.olpc-sugar', + 'xop' => 'application/xop+xml', + 'xpi' => 'application/x-xpinstall', + 'xpm' => 'image/x-xpixmap', + 'xpr' => 'application/vnd.is-xpr', + 'xps' => 'application/vnd.ms-xpsdocument', + 'xpw' => 'application/vnd.intercon.formnet', + 'xpx' => 'application/vnd.intercon.formnet', + 'xsl' => 'application/xml', + 'xslt' => 'application/xslt+xml', + 'xsm' => 'application/vnd.syncml+xml', + 'xspf' => 'application/xspf+xml', + 'xul' => 'application/vnd.mozilla.xul+xml', + 'xvm' => 'application/xv+xml', + 'xvml' => 'application/xv+xml', + 'xwd' => 'image/x-xwindowdump', + 'xyz' => 'chemical/x-xyz', + 'yaml' => 'text/yaml', + 'yang' => 'application/yang', + 'yin' => 'application/yin+xml', + 'yml' => 'text/yaml', + 'zaz' => 'application/vnd.zzazz.deck+xml', + 'zip' => 'application/zip', + 'zir' => 'application/vnd.zul', + 'zirz' => 'application/vnd.zul', + 'zmm' => 'application/vnd.handheld-entertainment+xml' + ); + + /** + * Get a singleton instance of the class + * + * @return self + * @codeCoverageIgnore + */ + public static function getInstance() + { + if (!self::$instance) { + self::$instance = new self(); + } + + return self::$instance; + } + + /** + * Get a mimetype value from a file extension + * + * @param string $extension File extension + * + * @return string|null + * + */ + public function fromExtension($extension) + { + $extension = strtolower($extension); + + return isset($this->mimetypes[$extension]) + ? $this->mimetypes[$extension] + : null; + } + + /** + * Get a mimetype from a filename + * + * @param string $filename Filename to generate a mimetype from + * + * @return string|null + */ + public function fromFilename($filename) + { + return $this->fromExtension(pathinfo($filename, PATHINFO_EXTENSION)); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/MultipartBody.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/MultipartBody.php new file mode 100755 index 00000000..72ce6e12 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/MultipartBody.php @@ -0,0 +1,292 @@ +boundary = $boundary ?: uniqid(); + $this->fields = $fields; + $this->files = $files; + + // Ensure each file is a PostFileInterface + foreach ($this->files as $file) { + if (!$file instanceof PostFileInterface) { + throw new \InvalidArgumentException('All POST fields must ' + . 'implement PostFieldInterface'); + } + } + } + + public function __toString() + { + $this->seek(0); + + return $this->getContents(); + } + + public function getContents($maxLength = -1) + { + $buffer = ''; + + while (!$this->eof()) { + if ($maxLength === -1) { + $read = 1048576; + } else { + $len = strlen($buffer); + if ($len == $maxLength) { + break; + } + $read = min(1048576, $maxLength - $len); + } + $buffer .= $this->read($read); + } + + return $buffer; + } + + /** + * Get the boundary + * + * @return string + */ + public function getBoundary() + { + return $this->boundary; + } + + public function close() + { + $this->detach(); + } + + public function detach() + { + $this->fields = $this->files = []; + } + + /** + * The stream has reached an EOF when all of the fields and files have been + * read. + * {@inheritdoc} + */ + public function eof() + { + return $this->currentField == count($this->fields) && + $this->currentFile == count($this->files); + } + + public function tell() + { + return $this->pos; + } + + public function isReadable() + { + return true; + } + + public function isWritable() + { + return false; + } + + /** + * The steam is seekable by default, but all attached files must be + * seekable too. + * {@inheritdoc} + */ + public function isSeekable() + { + foreach ($this->files as $file) { + if (!$file->getContent()->isSeekable()) { + return false; + } + } + + return true; + } + + public function getSize() + { + if ($this->size === null) { + foreach ($this->files as $file) { + // We must be able to ascertain the size of each attached file + if (null === ($size = $file->getContent()->getSize())) { + return null; + } + $this->size += strlen($this->getFileHeaders($file)) + $size; + } + foreach (array_keys($this->fields) as $key) { + $this->size += strlen($this->getFieldString($key)); + } + $this->size += strlen("\r\n--{$this->boundary}--"); + } + + return $this->size; + } + + public function read($length) + { + $content = ''; + if ($this->buffer && !$this->buffer->eof()) { + $content .= $this->buffer->read($length); + } + if ($delta = $length - strlen($content)) { + $content .= $this->readData($delta); + } + + if ($content === '' && !$this->sentLast) { + $this->sentLast = true; + $content = "\r\n--{$this->boundary}--"; + } + + return $content; + } + + public function seek($offset, $whence = SEEK_SET) + { + if ($offset != 0 || $whence != SEEK_SET || !$this->isSeekable()) { + return false; + } + + foreach ($this->files as $file) { + if (!$file->getContent()->seek(0)) { + throw new \RuntimeException('Rewind on multipart file failed ' + . 'even though it shouldn\'t have'); + } + } + + $this->buffer = $this->sentLast = null; + $this->pos = $this->currentField = $this->currentFile = 0; + $this->bufferedHeaders = []; + + return true; + } + + public function write($string) + { + return false; + } + + /** + * No data is in the read buffer, so more needs to be pulled in from fields + * and files. + * + * @param int $length Amount of data to read + * + * @return string + */ + private function readData($length) + { + $result = ''; + + if ($this->currentField < count($this->fields)) { + $result = $this->readField($length); + } + + if ($result === '' && $this->currentFile < count($this->files)) { + $result = $this->readFile($length); + } + + return $result; + } + + /** + * Create a new stream buffer and inject form-data + * + * @param int $length Amount of data to read from the stream buffer + * + * @return string + */ + private function readField($length) + { + $name = array_keys($this->fields)[++$this->currentField - 1]; + $this->buffer = Stream\create($this->getFieldString($name)); + + return $this->buffer->read($length); + } + + /** + * Read data from a POST file, fill the read buffer with any overflow + * + * @param int $length Amount of data to read from the file + * + * @return string + */ + private function readFile($length) + { + $current = $this->files[$this->currentFile]; + + // Got to the next file and recursively return the read value, or bail + // if no more data can be read. + if ($current->getContent()->eof()) { + return ++$this->currentFile == count($this->files) + ? '' + : $this->readFile($length); + } + + // If this is the start of a file, then send the headers to the read + // buffer. + if (!isset($this->bufferedHeaders[$this->currentFile])) { + $this->buffer = Stream\create($this->getFileHeaders($current)); + $this->bufferedHeaders[$this->currentFile] = true; + } + + // More data needs to be read to meet the limit, so pull from the file + $content = $this->buffer ? $this->buffer->read($length) : ''; + if (($remaining = $length - strlen($content)) > 0) { + $content .= $current->getContent()->read($remaining); + } + + return $content; + } + + private function getFieldString($key) + { + return sprintf( + "--%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n", + $this->boundary, + $key, + $this->fields[$key] + ); + } + + private function getFileHeaders(PostFileInterface $file) + { + $headers = ''; + foreach ($file->getHeaders() as $key => $value) { + $headers .= "{$key}: {$value}\r\n"; + } + + return "--{$this->boundary}\r\n" . trim($headers) . "\r\n\r\n"; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostBody.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostBody.php new file mode 100755 index 00000000..6ba253be --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostBody.php @@ -0,0 +1,282 @@ +files || $this->forceMultipart) { + $request->setHeader( + 'Content-Type', + 'multipart/form-data; boundary=' . $this->getBody()->getBoundary() + ); + } elseif ($this->fields) { + $request->setHeader('Content-Type', 'application/x-www-form-urlencoded'); + } + + if ($size = $this->getSize()) { + $request->setHeader('Content-Length', $size); + } + } + + public function forceMultipartUpload($force) + { + $this->forceMultipart = $force; + + return $this; + } + + public function setAggregator(callable $aggregator) + { + $this->aggregator = $aggregator; + } + + public function setField($name, $value) + { + $this->fields[$name] = $value; + $this->mutate(); + + return $this; + } + + public function replaceFields(array $fields) + { + $this->fields = $fields; + $this->mutate(); + + return $this; + } + + public function getField($name) + { + return isset($this->fields[$name]) ? $this->fields[$name] : null; + } + + public function removeField($name) + { + unset($this->fields[$name]); + $this->mutate(); + + return $this; + } + + public function getFields($asString = false) + { + if (!$asString) { + return $this->fields; + } + + return (string) (new Query($this->fields)) + ->setEncodingType(Query::RFC1738) + ->setAggregator($this->getAggregator()); + } + + public function hasField($name) + { + return isset($this->fields[$name]); + } + + public function getFile($name) + { + foreach ($this->files as $file) { + if ($file->getName() == $name) { + return $file; + } + } + + return null; + } + + public function getFiles() + { + return $this->files; + } + + public function addFile(PostFileInterface $file) + { + $this->files[] = $file; + $this->mutate(); + + return $this; + } + + public function clearFiles() + { + $this->files = []; + $this->mutate(); + + return $this; + } + + /** + * Returns the numbers of fields + files + * + * @return int + */ + public function count() + { + return count($this->files) + count($this->fields); + } + + public function __toString() + { + return (string) $this->getBody(); + } + + public function getContents($maxLength = -1) + { + return $this->getBody()->getContents(); + } + + public function close() + { + return $this->body ? $this->body->close() : true; + } + + public function detach() + { + $this->body = null; + $this->fields = $this->files = []; + + return $this; + } + + public function eof() + { + return $this->getBody()->eof(); + } + + public function tell() + { + return $this->body ? $this->body->tell() : 0; + } + + public function isSeekable() + { + return true; + } + + public function isReadable() + { + return true; + } + + public function isWritable() + { + return false; + } + + public function getSize() + { + return $this->getBody()->getSize(); + } + + public function seek($offset, $whence = SEEK_SET) + { + return $this->getBody()->seek($offset, $whence); + } + + public function read($length) + { + return $this->getBody()->read($length); + } + + public function write($string) + { + return false; + } + + /** + * Return a stream object that is built from the POST fields and files. + * + * If one has already been created, the previously created stream will be + * returned. + */ + private function getBody() + { + if ($this->body) { + return $this->body; + } elseif ($this->files || $this->forceMultipart) { + return $this->body = $this->createMultipart(); + } elseif ($this->fields) { + return $this->body = $this->createUrlEncoded(); + } else { + return $this->body = Stream\create(); + } + } + + /** + * Get the aggregator used to join multi-valued field parameters + * + * @return callable + */ + final protected function getAggregator() + { + if (!$this->aggregator) { + $this->aggregator = Query::phpAggregator(); + } + + return $this->aggregator; + } + + /** + * Creates a multipart/form-data body stream + * + * @return MultipartBody + */ + private function createMultipart() + { + // Flatten the nested query string values using the correct aggregator + $query = (string) (new Query($this->fields)) + ->setEncodingType(false) + ->setAggregator($this->getAggregator()); + // Convert the flattened query string back into an array + $fields = Query::fromString($query)->toArray(); + + return new MultipartBody($fields, $this->files); + } + + /** + * Creates an application/x-www-form-urlencoded stream body + * + * @return Stream\StreamInterface + */ + private function createUrlEncoded() + { + return Stream\create($this->getFields(true)); + } + + /** + * Get rid of any cached data + */ + private function mutate() + { + $this->body = null; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostBodyInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostBodyInterface.php new file mode 100755 index 00000000..4405ce21 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostBodyInterface.php @@ -0,0 +1,129 @@ +headers = $headers; + $this->name = $name; + $this->prepareContent($content); + $this->prepareFilename($filename); + $this->prepareDefaultHeaders(); + } + + public function getName() + { + return $this->name; + } + + public function getFilename() + { + return $this->filename; + } + + public function getContent() + { + return $this->content; + } + + public function getHeaders() + { + return $this->headers; + } + + /** + * Prepares the contents of a POST file. + * + * @param mixed $content Content of the POST file + */ + private function prepareContent($content) + { + $this->content = $content; + + if (!($this->content instanceof StreamInterface)) { + $this->content = \GuzzleHttp\Stream\create($this->content); + } elseif ($this->content instanceof MultipartBody) { + if (!$this->hasHeader('Content-Disposition')) { + $disposition = 'form-data; name="' . $this->name .'"'; + $this->headers['Content-Disposition'] = $disposition; + } + + if (!$this->hasHeader('Content-Type')) { + $this->headers['Content-Type'] = sprintf( + "multipart/form-data; boundary=%s", + $this->content->getBoundary() + ); + } + } + } + + /** + * Applies a file name to the POST file based on various checks. + * + * @param string|null $filename Filename to apply (or null to guess) + */ + private function prepareFilename($filename) + { + $this->filename = $filename; + + if (!$this->filename && + $this->content instanceof MetadataStreamInterface + ) { + $this->filename = $this->content->getMetadata('uri'); + } + + if (!$this->filename || substr($this->filename, 0, 6) === 'php://') { + $this->filename = $this->name; + } + } + + /** + * Applies default Content-Disposition and Content-Type headers if needed. + */ + private function prepareDefaultHeaders() + { + // Set a default content-disposition header if one was no provided + if (!$this->hasHeader('Content-Disposition')) { + $this->headers['Content-Disposition'] = sprintf( + 'form-data; filename="%s"; name="%s"', + basename($this->filename), + $this->name + ); + } + + // Set a default Content-Type if one was not supplied + if (!$this->hasHeader('Content-Type')) { + $this->headers['Content-Type'] = Mimetypes::getInstance() + ->fromFilename($this->filename) ?: 'text/plain'; + } + } + + /** + * Check if a specific header exists on the POST file by name. + * + * @param string $name Case-insensitive header to check + * + * @return bool + */ + private function hasHeader($name) + { + return isset(array_change_key_case($this->headers)[strtolower($name)]); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostFileInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostFileInterface.php new file mode 100755 index 00000000..205dd967 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostFileInterface.php @@ -0,0 +1,42 @@ +add($key, $value); + $foundDuplicates = true; + } elseif ($paramIsPhpStyleArray) { + $q[$key] = array($value); + } else { + $q[$key] = $value; + } + } else { + $q->add($key, null); + } + } + + // Use the duplicate aggregator if duplicates were found and not using + // PHP style arrays. + if ($foundDuplicates && !$foundPhpStyle) { + $q->setAggregator(self::duplicateAggregator()); + } + + return $q; + } + + /** + * Convert the query string parameters to a query string string + * + * @return string + */ + public function __toString() + { + if (!$this->data) { + return ''; + } + + // The default aggregator is statically cached + static $defaultAggregator; + + if (!$this->aggregator) { + if (!$defaultAggregator) { + $defaultAggregator = self::phpAggregator(); + } + $this->aggregator = $defaultAggregator; + } + + $result = ''; + $aggregator = $this->aggregator; + + foreach ($aggregator($this->data) as $key => $values) { + foreach ($values as $value) { + if ($result) { + $result .= '&'; + } + if ($this->encoding == self::RFC1738) { + $result .= urlencode($key); + if ($value !== null) { + $result .= '=' . urlencode($value); + } + } elseif ($this->encoding == self::RFC3986) { + $result .= rawurlencode($key); + if ($value !== null) { + $result .= '=' . rawurlencode($value); + } + } else { + $result .= $key; + if ($value !== null) { + $result .= '=' . $value; + } + } + } + } + + return $result; + } + + /** + * Controls how multi-valued query string parameters are aggregated into a + * string. + * + * $query->setAggregator($query::duplicateAggregator()); + * + * @param callable $aggregator Callable used to convert a deeply nested + * array of query string variables into a flattened array of key value + * pairs. The callable accepts an array of query data and returns a + * flattened array of key value pairs where each value is an array of + * strings. + * + * @return self + */ + public function setAggregator(callable $aggregator) + { + $this->aggregator = $aggregator; + + return $this; + } + + /** + * Specify how values are URL encoded + * + * @param string|bool $type One of 'RFC1738', 'RFC3986', or false to disable encoding + * + * @return self + * @throws \InvalidArgumentException + */ + public function setEncodingType($type) + { + if ($type === false || $type === self::RFC1738 || $type === self::RFC3986) { + $this->encoding = $type; + } else { + throw new \InvalidArgumentException('Invalid URL encoding type'); + } + + return $this; + } + + /** + * Query string aggregator that does not aggregate nested query string + * values and allows duplicates in the resulting array. + * + * Example: http://test.com?q=1&q=2 + * + * @return callable + */ + public static function duplicateAggregator() + { + return function (array $data) { + return self::walkQuery($data, '', function ($key, $prefix) { + return is_int($key) ? $prefix : "{$prefix}[{$key}]"; + }); + }; + } + + /** + * Aggregates nested query string variables using the same technique as + * ``http_build_query()``. + * + * @param bool $numericIndices Pass false to not include numeric indices + * when multi-values query string parameters are present. + * + * @return callable + */ + public static function phpAggregator($numericIndices = true) + { + return function (array $data) use ($numericIndices) { + return self::walkQuery( + $data, + '', + function ($key, $prefix) use ($numericIndices) { + return !$numericIndices && is_int($key) + ? "{$prefix}[]" + : "{$prefix}[{$key}]"; + } + ); + }; + } + + /** + * Easily create query aggregation functions by providing a key prefix + * function to this query string array walker. + * + * @param array $query Query string to walk + * @param string $keyPrefix Key prefix (start with '') + * @param callable $prefixer Function used to create a key prefix + * + * @return array + */ + public static function walkQuery(array $query, $keyPrefix, callable $prefixer) + { + $result = []; + foreach ($query as $key => $value) { + if ($keyPrefix) { + $key = $prefixer($key, $keyPrefix); + } + if (is_array($value)) { + $result += self::walkQuery($value, $key, $prefixer); + } elseif (isset($result[$key])) { + $result[$key][] = $value; + } else { + $result[$key] = array($value); + } + } + + return $result; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Cookie.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Cookie.php new file mode 100755 index 00000000..4b8a2c08 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Cookie.php @@ -0,0 +1,59 @@ +cookieJar = $cookieJar ?: new CookieJar(); + } + + public function getEvents() + { + // Fire the cookie plugin complete event before redirecting + return [ + 'before' => ['onBefore'], + 'complete' => ['onComplete', RequestEvents::REDIRECT_RESPONSE + 10] + ]; + } + + /** + * Get the cookie cookieJar + * + * @return CookieJarInterface + */ + public function getCookieJar() + { + return $this->cookieJar; + } + + public function onBefore(BeforeEvent $event) + { + $this->cookieJar->addCookieHeader($event->getRequest()); + } + + public function onComplete(CompleteEvent $event) + { + $this->cookieJar->extractCookies( + $event->getRequest(), + $event->getResponse() + ); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/History.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/History.php new file mode 100755 index 00000000..b2a49e04 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/History.php @@ -0,0 +1,138 @@ +limit = $limit; + } + + public function getEvents() + { + return [ + 'complete' => ['onComplete', RequestEvents::EARLY], + 'error' => ['onError', RequestEvents::EARLY], + ]; + } + + /** + * Convert to a string that contains all request and response headers + * + * @return string + */ + public function __toString() + { + $lines = array(); + foreach ($this->transactions as $entry) { + $response = isset($entry['response']) ? $entry['response'] : ''; + $lines[] = '> ' . trim($entry['request']) . "\n\n< " . trim($response) . "\n"; + } + + return implode("\n", $lines); + } + + public function onComplete(CompleteEvent $event) + { + $this->add($event->getRequest(), $event->getResponse()); + } + + public function onError(ErrorEvent $event) + { + $this->add($event->getRequest(), $event->getResponse()); + } + + /** + * Returns an Iterator that yields associative array values where each + * associative array contains a 'request' and 'response' key. + * + * @return \Iterator + */ + public function getIterator() + { + return new \ArrayIterator($this->transactions); + } + + /** + * Get all of the requests sent through the plugin + * + * @return RequestInterface[] + */ + public function getRequests() + { + return array_map(function ($t) { + return $t['request']; + }, $this->transactions); + } + + /** + * Get the number of requests in the history + * + * @return int + */ + public function count() + { + return count($this->transactions); + } + + /** + * Get the last request sent + * + * @return RequestInterface + */ + public function getLastRequest() + { + return end($this->transactions)['request']; + } + + /** + * Get the last response in the history + * + * @return ResponseInterface|null + */ + public function getLastResponse() + { + return end($this->transactions)['response']; + } + + /** + * Clears the history + */ + public function clear() + { + $this->transactions = array(); + } + + /** + * Add a request to the history + * + * @param RequestInterface $request Request to add + * @param ResponseInterface $response Response of the request + */ + private function add( + RequestInterface $request, + ResponseInterface $response = null + ) { + $this->transactions[] = ['request' => $request, 'response' => $response]; + if (count($this->transactions) > $this->limit) { + array_shift($this->transactions); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/HttpError.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/HttpError.php new file mode 100755 index 00000000..f2f72f15 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/HttpError.php @@ -0,0 +1,34 @@ + ['onComplete', RequestEvents::VERIFY_RESPONSE]]; + } + + /** + * Throw a RequestException on an HTTP protocol error + * + * @param CompleteEvent $event Emitted event + * @throws RequestException + */ + public function onComplete(CompleteEvent $event) + { + $code = (string) $event->getResponse()->getStatusCode(); + // Throw an exception for an unsuccessful response + if ($code[0] === '4' || $code[0] === '5') { + throw RequestException::create($event->getRequest(), $event->getResponse()); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Mock.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Mock.php new file mode 100755 index 00000000..99a3d18d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Mock.php @@ -0,0 +1,143 @@ +factory = new MessageFactory(); + $this->readBodies = $readBodies; + $this->addMultiple($items); + } + + public function getEvents() + { + // Fire the event last, after signing + return ['before' => ['onBefore', RequestEvents::SIGN_REQUEST - 10]]; + } + + /** + * @throws \OutOfBoundsException|\Exception + */ + public function onBefore(BeforeEvent $event) + { + if (!$item = array_shift($this->queue)) { + throw new \OutOfBoundsException('Mock queue is empty'); + } elseif ($item instanceof RequestException) { + throw $item; + } + + // Emulate the receiving of the response headers + $request = $event->getRequest(); + $transaction = new Transaction($event->getClient(), $request); + $transaction->setResponse($item); + $request->getEmitter()->emit( + 'headers', + new HeadersEvent($transaction) + ); + + // Emulate reading a response body + if ($this->readBodies && $request->getBody()) { + while (!$request->getBody()->eof()) { + $request->getBody()->read(8096); + } + } + + $event->intercept($item); + } + + public function count() + { + return count($this->queue); + } + + /** + * Add a response to the end of the queue + * + * @param string|ResponseInterface $response Response or path to response file + * + * @return self + * @throws \InvalidArgumentException if a string or Response is not passed + */ + public function addResponse($response) + { + if (is_string($response)) { + $response = file_exists($response) + ? $this->factory->fromMessage(file_get_contents($response)) + : $this->factory->fromMessage($response); + } elseif (!($response instanceof ResponseInterface)) { + throw new \InvalidArgumentException('Response must a message ' + . 'string, response object, or path to a file'); + } + + $this->queue[] = $response; + + return $this; + } + + /** + * Add an exception to the end of the queue + * + * @param RequestException $e Exception to throw when the request is executed + * + * @return self + */ + public function addException(RequestException $e) + { + $this->queue[] = $e; + + return $this; + } + + /** + * Add multiple items to the queue + * + * @param array $items Items to add + */ + public function addMultiple(array $items) + { + foreach ($items as $item) { + if ($item instanceof RequestException) { + $this->addException($item); + } else { + $this->addResponse($item); + } + } + } + + /** + * Clear the queue + */ + public function clearQueue() + { + $this->queue = []; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Prepare.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Prepare.php new file mode 100755 index 00000000..2d82acd6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Prepare.php @@ -0,0 +1,136 @@ + ['onBefore', RequestEvents::PREPARE_REQUEST]]; + } + + public function onBefore(BeforeEvent $event) + { + $request = $event->getRequest(); + + // Set the appropriate Content-Type for a request if one is not set and + // there are form fields + if (!($body = $request->getBody())) { + return; + } + + $this->addContentLength($request, $body); + + if ($body instanceof PostBodyInterface) { + // Synchronize the POST body with the request's headers + $body->applyRequestHeaders($request); + } elseif (!$request->hasHeader('Content-Type')) { + $this->addContentType($request, $body); + } + + $this->addExpectHeader($request, $body); + } + + private function addContentType( + RequestInterface $request, + StreamInterface $body + ) { + if (!($body instanceof MetadataStreamInterface)) { + return; + } + + if (!($uri = $body->getMetadata('uri'))) { + return; + } + + // Guess the content-type based on the stream's "uri" metadata value. + // The file extension is used to determine the appropriate mime-type. + if ($contentType = Mimetypes::getInstance()->fromFilename($uri)) { + $request->setHeader('Content-Type', $contentType); + } + } + + private function addContentLength( + RequestInterface $request, + StreamInterface $body + ) { + // Set the Content-Length header if it can be determined, and never + // send a Transfer-Encoding: chunked and Content-Length header in + // the same request. + if ($request->hasHeader('Content-Length')) { + // Remove transfer-encoding if content-length is set. + $request->removeHeader('Transfer-Encoding'); + return; + } + + if ($request->hasHeader('Transfer-Encoding')) { + return; + } + + if (null !== ($size = $body->getSize())) { + $request->setHeader('Content-Length', $size) + ->removeHeader('Transfer-Encoding'); + } elseif ('1.1' == $request->getProtocolVersion()) { + // Use chunked Transfer-Encoding if there is no determinable + // content-length header and we're using HTTP/1.1. + $request->setHeader('Transfer-Encoding', 'chunked') + ->removeHeader('Content-Length'); + } + } + + private function addExpectHeader( + RequestInterface $request, + StreamInterface $body + ) { + // Determine if the Expect header should be used + if ($request->hasHeader('Expect')) { + return; + } + + $expect = $request->getConfig()['expect']; + + // Return if disabled or if you're not using HTTP/1.1 + if ($expect === false || $request->getProtocolVersion() !== '1.1') { + return; + } + + // The expect header is unconditionally enabled + if ($expect === true) { + $request->setHeader('Expect', '100-Continue'); + return; + } + + // By default, send the expect header when the payload is > 1mb + if ($expect === null) { + $expect = 1048576; + } + + // Always add if the body cannot be rewound, the size cannot be + // determined, or the size is greater than the cutoff threshold + $size = $body->getSize(); + if ($size === null || $size >= (int) $expect || !$body->isSeekable()) { + $request->setHeader('Expect', '100-Continue'); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Redirect.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Redirect.php new file mode 100755 index 00000000..bd8988d8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Redirect.php @@ -0,0 +1,172 @@ + ['onComplete', RequestEvents::REDIRECT_RESPONSE]]; + } + + /** + * Rewind the entity body of the request if needed + * + * @param RequestInterface $redirectRequest + * @throws CouldNotRewindStreamException + */ + public static function rewindEntityBody(RequestInterface $redirectRequest) + { + // Rewind the entity body of the request if needed + if ($redirectRequest->getBody()) { + $body = $redirectRequest->getBody(); + // Only rewind the body if some of it has been read already, and + // throw an exception if the rewind fails + if ($body->tell() && !$body->seek(0)) { + throw new CouldNotRewindStreamException( + 'Unable to rewind the non-seekable request body after redirecting', + $redirectRequest + ); + } + } + } + + /** + * Called when a request receives a redirect response + * + * @param CompleteEvent $event Event emitted + * @throws TooManyRedirectsException + */ + public function onComplete(CompleteEvent $event) + { + $response = $event->getResponse(); + + if (substr($response->getStatusCode(), 0, 1) != '3' || + !$response->hasHeader('Location') + ) { + return; + } + + $redirectCount = 0; + $request = $event->getRequest(); + $redirectResponse = $response; + $max = $request->getConfig()->getPath('redirect/max') ?: 5; + + do { + if (++$redirectCount > $max) { + throw new TooManyRedirectsException( + "Will not follow more than {$redirectCount} redirects", + $request + ); + } + $redirectRequest = $this->createRedirectRequest($request, $redirectResponse); + $redirectResponse = $event->getClient()->send($redirectRequest); + } while (substr($redirectResponse->getStatusCode(), 0, 1) == '3' && + $redirectResponse->hasHeader('Location') + ); + + if ($redirectResponse !== $response) { + $event->intercept($redirectResponse); + } + } + + /** + * Create a redirect request for a specific request object + * + * Takes into account strict RFC compliant redirection (e.g. redirect POST + * with POST) vs doing what most clients do (e.g. redirect POST with GET). + * + * @param RequestInterface $request + * @param ResponseInterface $response + * + * @return RequestInterface Returns a new redirect request + * @throws CouldNotRewindStreamException If the body cannot be rewound. + */ + private function createRedirectRequest( + RequestInterface $request, + ResponseInterface $response + ) { + $config = $request->getConfig(); + + // Use a GET request if this is an entity enclosing request and we are + // not forcing RFC compliance, but rather emulating what all browsers + // would do. Be sure to disable redirects on the clone. + $redirectRequest = clone $request; + $redirectRequest->getEmitter()->detach($this); + $statusCode = $response->getStatusCode(); + + if ($statusCode == 303 || + ($statusCode <= 302 && $request->getBody() && + !$config->getPath('redirect/strict')) + ) { + $redirectRequest->setMethod('GET'); + $redirectRequest->setBody(null); + } + + $this->setRedirectUrl($redirectRequest, $response); + $this->rewindEntityBody($redirectRequest); + + // Add the Referer header if it is told to do so and only + // add the header if we are not redirecting from https to http. + if ($config->getPath('redirect/referer') && ( + $redirectRequest->getScheme() == 'https' || + $redirectRequest->getScheme() == $request->getScheme() + )) { + $url = Url::fromString($request->getUrl()); + $url->setUsername(null)->setPassword(null); + $redirectRequest->setHeader('Referer', (string) $url); + } + + return $redirectRequest; + } + + /** + * Set the appropriate URL on the request based on the location header + * + * @param RequestInterface $redirectRequest + * @param ResponseInterface $response + */ + private function setRedirectUrl( + RequestInterface $redirectRequest, + ResponseInterface $response + ) { + $location = $response->getHeader('Location'); + $location = Url::fromString($location); + + // Combine location with the original URL if it is not absolute. + if (!$location->isAbsolute()) { + $originalUrl = Url::fromString($redirectRequest->getUrl()); + // Remove query string parameters and just take what is present on + // the redirect Location header + $originalUrl->getQuery()->clear(); + $location = $originalUrl->combine($location); + } + + $redirectRequest->setUrl($location); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/ToArrayInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/ToArrayInterface.php new file mode 100755 index 00000000..7c4120fb --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/ToArrayInterface.php @@ -0,0 +1,16 @@ + array('prefix' => '', 'joiner' => ',', 'query' => false), + '+' => array('prefix' => '', 'joiner' => ',', 'query' => false), + '#' => array('prefix' => '#', 'joiner' => ',', 'query' => false), + '.' => array('prefix' => '.', 'joiner' => '.', 'query' => false), + '/' => array('prefix' => '/', 'joiner' => '/', 'query' => false), + ';' => array('prefix' => ';', 'joiner' => ';', 'query' => true), + '?' => array('prefix' => '?', 'joiner' => '&', 'query' => true), + '&' => array('prefix' => '&', 'joiner' => '&', 'query' => true) + ); + + /** @var array Delimiters */ + private static $delims = array(':', '/', '?', '#', '[', ']', '@', '!', '$', + '&', '\'', '(', ')', '*', '+', ',', ';', '='); + + /** @var array Percent encoded delimiters */ + private static $delimsPct = array('%3A', '%2F', '%3F', '%23', '%5B', '%5D', + '%40', '%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C', + '%3B', '%3D'); + + public function expand($template, array $variables) + { + if (false === strpos($template, '{')) { + return $template; + } + + $this->template = $template; + $this->variables = $variables; + + return preg_replace_callback( + '/\{([^\}]+)\}/', + [$this, 'expandMatch'], + $this->template + ); + } + + /** + * Parse an expression into parts + * + * @param string $expression Expression to parse + * + * @return array Returns an associative array of parts + */ + private function parseExpression($expression) + { + $result = array(); + + if (isset(self::$operatorHash[$expression[0]])) { + $result['operator'] = $expression[0]; + $expression = substr($expression, 1); + } else { + $result['operator'] = ''; + } + + foreach (explode(',', $expression) as $value) { + $value = trim($value); + $varspec = array(); + if ($colonPos = strpos($value, ':')) { + $varspec['value'] = substr($value, 0, $colonPos); + $varspec['modifier'] = ':'; + $varspec['position'] = (int) substr($value, $colonPos + 1); + } elseif (substr($value, -1) == '*') { + $varspec['modifier'] = '*'; + $varspec['value'] = substr($value, 0, -1); + } else { + $varspec['value'] = (string) $value; + $varspec['modifier'] = ''; + } + $result['values'][] = $varspec; + } + + return $result; + } + + /** + * Process an expansion + * + * @param array $matches Matches met in the preg_replace_callback + * + * @return string Returns the replacement string + */ + private function expandMatch(array $matches) + { + static $rfc1738to3986 = array('+' => '%20', '%7e' => '~'); + + $replacements = array(); + $parsed = self::parseExpression($matches[1]); + $prefix = self::$operatorHash[$parsed['operator']]['prefix']; + $joiner = self::$operatorHash[$parsed['operator']]['joiner']; + $useQuery = self::$operatorHash[$parsed['operator']]['query']; + + foreach ($parsed['values'] as $value) { + + if (!isset($this->variables[$value['value']])) { + continue; + } + + $variable = $this->variables[$value['value']]; + $actuallyUseQuery = $useQuery; + $expanded = ''; + + if (is_array($variable)) { + + $isAssoc = $this->isAssoc($variable); + $kvp = array(); + foreach ($variable as $key => $var) { + + if ($isAssoc) { + $key = rawurlencode($key); + $isNestedArray = is_array($var); + } else { + $isNestedArray = false; + } + + if (!$isNestedArray) { + $var = rawurlencode($var); + if ($parsed['operator'] == '+' || + $parsed['operator'] == '#' + ) { + $var = $this->decodeReserved($var); + } + } + + if ($value['modifier'] == '*') { + if ($isAssoc) { + if ($isNestedArray) { + // Nested arrays must allow for deeply nested + // structures. + $var = strtr( + http_build_query([$key => $var]), + $rfc1738to3986 + ); + } else { + $var = $key . '=' . $var; + } + } elseif ($key > 0 && $actuallyUseQuery) { + $var = $value['value'] . '=' . $var; + } + } + + $kvp[$key] = $var; + } + + if (empty($variable)) { + $actuallyUseQuery = false; + } elseif ($value['modifier'] == '*') { + $expanded = implode($joiner, $kvp); + if ($isAssoc) { + // Don't prepend the value name when using the explode + // modifier with an associative array. + $actuallyUseQuery = false; + } + } else { + if ($isAssoc) { + // When an associative array is encountered and the + // explode modifier is not set, then the result must be + // a comma separated list of keys followed by their + // respective values. + foreach ($kvp as $k => &$v) { + $v = $k . ',' . $v; + } + } + $expanded = implode(',', $kvp); + } + + } else { + if ($value['modifier'] == ':') { + $variable = substr($variable, 0, $value['position']); + } + $expanded = rawurlencode($variable); + if ($parsed['operator'] == '+' || $parsed['operator'] == '#') { + $expanded = $this->decodeReserved($expanded); + } + } + + if ($actuallyUseQuery) { + if (!$expanded && $joiner != '&') { + $expanded = $value['value']; + } else { + $expanded = $value['value'] . '=' . $expanded; + } + } + + $replacements[] = $expanded; + } + + $ret = implode($joiner, $replacements); + if ($ret && $prefix) { + return $prefix . $ret; + } + + return $ret; + } + + /** + * Determines if an array is associative. + * + * This makes the assumption that input arrays are sequences or hashes. + * This assumption is a tradeoff for accuracy in favor of speed, but it + * should work in almost every case where input is supplied for a URI + * template. + * + * @param array $array Array to check + * + * @return bool + */ + private function isAssoc(array $array) + { + return $array && array_keys($array)[0] !== 0; + } + + /** + * Removes percent encoding on reserved characters (used with + and # + * modifiers). + * + * @param string $string String to fix + * + * @return string + */ + private function decodeReserved($string) + { + return str_replace(self::$delimsPct, self::$delims, $string); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Url.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Url.php new file mode 100755 index 00000000..a305a768 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Url.php @@ -0,0 +1,585 @@ + 80, 'https' => 443, 'ftp' => 21]; + + /** @var Query Query part of the URL */ + private $query; + + /** + * Factory method to create a new URL from a URL string + * + * @param string $url Full URL used to create a Url object + * + * @return Url + * @throws \InvalidArgumentException + */ + public static function fromString($url) + { + static $defaults = array('scheme' => null, 'host' => null, + 'path' => null, 'port' => null, 'query' => null, + 'user' => null, 'pass' => null, 'fragment' => null); + + if (false === ($parts = parse_url($url))) { + throw new \InvalidArgumentException('Unable to parse malformed ' + . 'url: ' . $url); + } + + $parts += $defaults; + + // Convert the query string into a Query object + if ($parts['query'] || 0 !== strlen($parts['query'])) { + $parts['query'] = Query::fromString($parts['query']); + } + + return new static($parts['scheme'], $parts['host'], $parts['user'], + $parts['pass'], $parts['port'], $parts['path'], $parts['query'], + $parts['fragment']); + } + + /** + * Build a URL from parse_url parts. The generated URL will be a relative + * URL if a scheme or host are not provided. + * + * @param array $parts Array of parse_url parts + * + * @return string + */ + public static function buildUrl(array $parts) + { + $url = $scheme = ''; + + if (!empty($parts['scheme'])) { + $scheme = $parts['scheme']; + $url .= $scheme . ':'; + } + + if (!empty($parts['host'])) { + $url .= '//'; + if (isset($parts['user'])) { + $url .= $parts['user']; + if (isset($parts['pass'])) { + $url .= ':' . $parts['pass']; + } + $url .= '@'; + } + + $url .= $parts['host']; + + // Only include the port if it is not the default port of the scheme + if (isset($parts['port']) && + (!isset(self::$defaultPorts[$scheme]) || + $parts['port'] != self::$defaultPorts[$scheme]) + ) { + $url .= ':' . $parts['port']; + } + } + + // Add the path component if present + if (isset($parts['path']) && strlen($parts['path'])) { + // Always ensure that the path begins with '/' if set and something + // is before the path + if (isset($parts['host']) && $parts['path'][0] != '/') { + $url .= '/'; + } + $url .= $parts['path']; + } + + // Add the query string if present + if (isset($parts['query'])) { + $queryStr = (string) $parts['query']; + if ($queryStr || $queryStr === '0') { + $url .= '?' . $queryStr; + } + } + + // Ensure that # is only added to the url if fragment contains anything. + if (isset($parts['fragment'])) { + $url .= '#' . $parts['fragment']; + } + + return $url; + } + + /** + * Create a new URL from URL parts + * + * @param string $scheme Scheme of the URL + * @param string $host Host of the URL + * @param string $username Username of the URL + * @param string $password Password of the URL + * @param int $port Port of the URL + * @param string $path Path of the URL + * @param Query|array|string $query Query string of the URL + * @param string $fragment Fragment of the URL + */ + public function __construct( + $scheme, + $host, + $username = null, + $password = null, + $port = null, + $path = null, + Query $query = null, + $fragment = null + ) { + $this->scheme = $scheme; + $this->host = $host; + $this->port = $port; + $this->username = $username; + $this->password = $password; + $this->fragment = $fragment; + if (!$query) { + $this->query = new Query(); + } else { + $this->setQuery($query); + } + $this->setPath($path); + } + + /** + * Clone the URL + */ + public function __clone() + { + $this->query = clone $this->query; + } + + /** + * Returns the URL as a URL string + * + * @return string + */ + public function __toString() + { + return static::buildUrl($this->getParts()); + } + + /** + * Get the parts of the URL as an array + * + * @return array + */ + public function getParts() + { + return array( + 'scheme' => $this->scheme, + 'user' => $this->username, + 'pass' => $this->password, + 'host' => $this->host, + 'port' => $this->port, + 'path' => $this->path, + 'query' => $this->query, + 'fragment' => $this->fragment, + ); + } + + /** + * Set the host of the request. + * + * @param string $host Host to set (e.g. www.yahoo.com, yahoo.com) + * + * @return Url + */ + public function setHost($host) + { + if (strpos($host, ':') === false) { + $this->host = $host; + } else { + list($host, $port) = explode(':', $host); + $this->host = $host; + $this->setPort($port); + } + + return $this; + } + + /** + * Get the host part of the URL + * + * @return string + */ + public function getHost() + { + return $this->host; + } + + /** + * Set the scheme part of the URL (http, https, ftp, etc.) + * + * @param string $scheme Scheme to set + * + * @return Url + */ + public function setScheme($scheme) + { + // Remove the default port if one is specified + if ($this->port && isset(self::$defaultPorts[$this->scheme]) && + self::$defaultPorts[$this->scheme] == $this->port + ) { + $this->port = null; + } + + $this->scheme = $scheme; + + return $this; + } + + /** + * Get the scheme part of the URL + * + * @return string + */ + public function getScheme() + { + return $this->scheme; + } + + /** + * Set the port part of the URL + * + * @param int $port Port to set + * + * @return Url + */ + public function setPort($port) + { + $this->port = $port; + + return $this; + } + + /** + * Get the port part of the URl. + * + * If no port was set, this method will return the default port for the + * scheme of the URI. + * + * @return int|null + */ + public function getPort() + { + if ($this->port) { + return $this->port; + } elseif (isset(self::$defaultPorts[$this->scheme])) { + return self::$defaultPorts[$this->scheme]; + } + + return null; + } + + /** + * Set the path part of the URL + * + * @param string $path Path string to set + * + * @return Url + */ + public function setPath($path) + { + static $search = [' ', '?']; + static $replace = ['%20', '%3F']; + $this->path = str_replace($search, $replace, $path); + + return $this; + } + + /** + * Removes dot segments from a URL + * + * @return Url + * @link http://tools.ietf.org/html/rfc3986#section-5.2.4 + */ + public function removeDotSegments() + { + static $noopPaths = ['' => true, '/' => true, '*' => true]; + static $ignoreSegments = ['' => true, '.' => true, '..' => true]; + + if (isset($noopPaths[$this->path])) { + return $this; + } + + $results = []; + $segments = $this->getPathSegments(); + foreach ($segments as $segment) { + if ($segment == '..') { + array_pop($results); + } elseif (!isset($ignoreSegments[$segment])) { + $results[] = $segment; + } + } + + // Combine the normalized parts and add the leading slash if needed + if ($this->path[0] == '/') { + $this->path = '/' . implode('/', $results); + } else { + $this->path = implode('/', $results); + } + + // Add the trailing slash if necessary + if ($this->path != '/' && isset($ignoreSegments[end($segments)])) { + $this->path .= '/'; + } + + return $this; + } + + /** + * Add a relative path to the currently set path. + * + * @param string $relativePath Relative path to add + * + * @return Url + */ + public function addPath($relativePath) + { + if ($relativePath != '/' && + is_string($relativePath) && + strlen($relativePath) > 0 + ) { + // Add a leading slash if needed + if ($relativePath[0] != '/') { + $relativePath = '/' . $relativePath; + } + $this->setPath(str_replace('//', '/', $this->path . $relativePath)); + } + + return $this; + } + + /** + * Get the path part of the URL + * + * @return string + */ + public function getPath() + { + return $this->path; + } + + /** + * Get the path segments of the URL as an array + * + * @return array + */ + public function getPathSegments() + { + return explode('/', $this->path); + } + + /** + * Set the password part of the URL + * + * @param string $password Password to set + * + * @return Url + */ + public function setPassword($password) + { + $this->password = $password; + + return $this; + } + + /** + * Get the password part of the URL + * + * @return null|string + */ + public function getPassword() + { + return $this->password; + } + + /** + * Set the username part of the URL + * + * @param string $username Username to set + * + * @return Url + */ + public function setUsername($username) + { + $this->username = $username; + + return $this; + } + + /** + * Get the username part of the URl + * + * @return null|string + */ + public function getUsername() + { + return $this->username; + } + + /** + * Get the query part of the URL as a Query object + * + * @return Query + */ + public function getQuery() + { + return $this->query; + } + + /** + * Set the query part of the URL + * + * @param Query|string|array $query Query string value to set. Can + * be a string that will be parsed into a Query object, an array + * of key value pairs, or a Query object. + * + * @return Url + * @throws \InvalidArgumentException + */ + public function setQuery($query) + { + if ($query instanceof Query) { + $this->query = $query; + } elseif (is_string($query)) { + $this->query = Query::fromString($query); + } elseif (is_array($query)) { + $this->query = new Query($query); + } else { + throw new \InvalidArgumentException('Query must be a ' + . 'QueryInterface, array, or string'); + } + + return $this; + } + + /** + * Get the fragment part of the URL + * + * @return null|string + */ + public function getFragment() + { + return $this->fragment; + } + + /** + * Set the fragment part of the URL + * + * @param string $fragment Fragment to set + * + * @return Url + */ + public function setFragment($fragment) + { + $this->fragment = $fragment; + + return $this; + } + + /** + * Check if this is an absolute URL + * + * @return bool + */ + public function isAbsolute() + { + return $this->scheme && $this->host; + } + + /** + * Combine the URL with another URL and return a new URL instance. + * + * Follows the rules specific in RFC 3986 section 5.4. + * + * @param string $url Relative URL to combine with + * + * @return Url + * @throws \InvalidArgumentException + * @link http://tools.ietf.org/html/rfc3986#section-5.4 + */ + public function combine($url) + { + $url = static::fromString($url); + + // Use the more absolute URL as the base URL + if (!$this->isAbsolute() && $url->isAbsolute()) { + $url = $url->combine($this); + } + + $parts = $url->getParts(); + + // Passing a URL with a scheme overrides everything + if ($parts['scheme']) { + return new static( + $parts['scheme'], + $parts['host'], + $parts['user'], + $parts['pass'], + $parts['port'], + $parts['path'], + clone $parts['query'], + $parts['fragment'] + ); + } + + // Setting a host overrides the entire rest of the URL + if ($parts['host']) { + return new static( + $this->scheme, + $parts['host'], + $parts['user'], + $parts['pass'], + $parts['port'], + $parts['path'], + clone $parts['query'], + $parts['fragment'] + ); + } + + if (!$parts['path']) { + // The relative URL has no path, so check if it is just a query + $path = $this->path ?: ''; + $query = count($parts['query']) ? $parts['query'] : $this->query; + } else { + $query = $parts['query']; + if ($parts['path'][0] == '/' || !$this->path) { + // Overwrite the existing path if the rel path starts with "/" + $path = $parts['path']; + } else { + // If the relative URL does not have a path or the base URL + // path does not end in a "/" then overwrite the existing path + // up to the last "/" + $path = substr($this->path, 0, strrpos($this->path, '/') + 1) . $parts['path']; + } + } + + $result = new self( + $this->scheme, + $this->host, + $this->username, + $this->password, + $this->port, + $path, + clone $query, + $parts['fragment'] + ); + + if ($path) { + $result->removeDotSegments(); + } + + return $result; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/cacert.pem b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/cacert.pem new file mode 100755 index 00000000..9794dfb7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/cacert.pem @@ -0,0 +1,3866 @@ +## +## ca-bundle.crt -- Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Tue Apr 22 08:29:31 2014 +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## http://mxr.mozilla.org/mozilla-release/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## + + +GTE CyberTrust Global Root +========================== +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg +Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG +A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz +MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL +Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 +IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u +sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql +HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID +AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW +M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF +NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +Thawte Server CA +================ +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE +AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j +b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV +BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u +c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG +A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 +ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl +/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 +1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J +GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ +GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +Thawte Premium Server CA +======================== +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE +AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl +ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU +VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 +aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ +cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 +aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh +Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ +qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm +SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf +8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t +UCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +Equifax Secure CA +================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE +ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT +B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR +fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW +8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE +CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS +spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 +zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB +BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 +70+sB3c4 +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA +TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah +WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf +Tqj/ZA1k +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO +FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 +lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT +1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD +Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 +-----END CERTIFICATE----- + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +GlobalSign Root CA - R2 +======================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 +ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp +s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN +S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL +TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C +ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i +YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN +BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp +9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu +01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 +9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +ValiCert Class 1 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy +MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi +GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm +DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG +lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX +icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP +Orf1LXLI +-----END CERTIFICATE----- + +ValiCert Class 2 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC +CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf +ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ +SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV +UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 +W9ViH0Pd +-----END CERTIFICATE----- + +RSA Root Certificate 1 +====================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td +3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H +BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs +3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF +V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r +on+jjBXu +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 +EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc +cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw +EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj +055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 +xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa +t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Verisign Class 4 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS +tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM +8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW +Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX +Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt +mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd +RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG +UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- + +Entrust.net Secure Server CA +============================ +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg +cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl +ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG +A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi +eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p +dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ +aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 +gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw +ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw +CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l +dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw +NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow +HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA +BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN +Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 +n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ +KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy +T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT +J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e +nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +Equifax Secure Global eBusiness CA +================================== +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp +bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx +HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds +b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV +PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN +qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn +hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j +BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs +MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN +I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY +NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 1 +============================= +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB +LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE +ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz +IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ +1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a +IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk +MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW +Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF +AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 +lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ +KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +AddTrust Low-Value Services Root +================================ +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU +cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw +CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO +ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 +54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr +oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 +Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui +GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w +HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw +HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt +ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph +iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr +mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj +ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +AddTrust External Root +====================== +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD +VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw +NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU +cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg +Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 ++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw +Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo +aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy +2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 +7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL +VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk +VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 +e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u +G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +AddTrust Public Services Root +============================= +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU +cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ +BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l +dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu +nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i +d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG +Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw +HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G +A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G +A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 +JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL ++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 +Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H +EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +AddTrust Qualified Certificates Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU +cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx +CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ +IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx +64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 +KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o +L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR +wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU +MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE +BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y +azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG +GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze +RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB +iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +RSA Security 2048 v3 +==================== +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK +ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy +MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb +BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 +Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb +WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH +KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP ++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E +FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY +v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj +0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj +VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 +nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA +pKnXwiJPZ9d37CAFYd4= +-----END CERTIFICATE----- + +GeoTrust Global CA +================== +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw +MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo +BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet +8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc +T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU +vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk +DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q +zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 +d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 +mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p +XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- + +GeoTrust Global CA 2 +==================== +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw +MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ +NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k +LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA +Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b +HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH +K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 +srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh +ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL +OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC +x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF +H4z1Ir+rzoPz4iIprn2DQKi6bA== +-----END CERTIFICATE----- + +GeoTrust Universal CA +===================== +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 +MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu +Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t +JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e +RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs +7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d +8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V +qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga +Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB +Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu +KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 +ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 +XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB +hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 +qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL +oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK +xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF +KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 +DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK +xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU +p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI +P/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +GeoTrust Universal CA 2 +======================= +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 +MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg +SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 +DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 +j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q +JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a +QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 +WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP +20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn +ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC +SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG +8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 ++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E +BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ +4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ +mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq +A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg +Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP +pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d +FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp +gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm +X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +America Online Root Certification Authority 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG +v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z +DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh +sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP +8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z +o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf +GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF +VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft +3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g +Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- + +America Online Root Certification Authority 2 +============================================= +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en +fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 +f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO +qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN +RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 +gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn +6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid +FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 +Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj +B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op +aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY +T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p ++DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg +JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy +zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO +ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh +1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf +GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff +Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP +cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= +-----END CERTIFICATE----- + +Visa eCommerce Root +=================== +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG +EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug +QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 +WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm +VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL +F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b +RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 +TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI +/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs +GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc +CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW +YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz +zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu +YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +Certum Root CA +============== +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK +ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla +Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u +by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x +wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL +kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ +89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K +Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P +NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ +GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg +GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ +0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS +qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +Comodo Secure Services root +=========================== +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw +MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu +Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi +BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP +9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc +rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC +oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V +p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E +FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj +YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm +aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm +4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL +DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw +pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H +RR3B7Hzs/Sk= +-----END CERTIFICATE----- + +Comodo Trusted Services root +============================ +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw +MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h +bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw +IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 +3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y +/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 +juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS +ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud +DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp +ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl +cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw +uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA +BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l +R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O +9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +QuoVadis Root CA +================ +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE +ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz +MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp +cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD +EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk +J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL +F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL +YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen +AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w +PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y +ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 +MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj +YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW +Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu +BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw +FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 +tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo +fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul +LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x +gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi +5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi +5nrQNiOKSnQ2+Q== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx +ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 +XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk +lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB +lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy +lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt +66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn +wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh +D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy +BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie +J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud +DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU +a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv +Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 +UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm +VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK ++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW +IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 +WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X +f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II +4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 +VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx +OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg +DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij +KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K +DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv +BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp +p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 +nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX +MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM +Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz +uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT +BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj +YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB +BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD +VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 +ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE +AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV +qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s +hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z +POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 +Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp +8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC +bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu +g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p +vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr +qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +Sonera Class 2 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw +NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 +/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT +dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG +f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P +tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH +nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT +XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt +0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI +cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph +Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx +EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH +llpwrN9M +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA +============================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE +ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w +HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh +bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt +vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P +jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca +C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth +vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 +22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV +HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v +dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN +BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR +EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw +MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y +nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- + +TDC Internet Root CA +==================== +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE +ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx +NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu +ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j +xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL +znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc +5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 +otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI +AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM +VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM +MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC +AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe +UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G +CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m +gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb +O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU +Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- + +UTN DATACorp SGC Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ +BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa +MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w +HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy +dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys +raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo +wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA +9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv +33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud +DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 +BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD +LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 +DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 +I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx +EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP +DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- + +UTN USERFirst Hardware Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd +BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx +OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 +eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz +ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI +wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd +tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 +i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf +Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw +gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF +lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF +UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF +BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW +XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 +lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn +iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 +nfhmqA== +-----END CERTIFICATE----- + +Camerfirma Chambers of Commerce Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx +NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp +cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn +MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC +AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU +xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH +NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW +DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV +d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud +EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v +cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P +AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh +bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD +VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi +fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD +L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN +UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n +ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 +erfutGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +Camerfirma Global Chambersign Root +================================== +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx +NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt +YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg +MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw +ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J +1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O +by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl +6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c +8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ +BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j +aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B +Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj +aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y +ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA +PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y +gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ +PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 +IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes +t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +NetLock Notary (Class A) Root +============================= +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI +EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j +ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX +DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH +EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD +VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz +cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM +D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ +z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC +/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 +tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 +4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG +A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC +Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv +bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn +LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 +ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz +IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh +IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu +b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg +Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp +bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 +ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP +ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB +CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr +KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM +8CgHrTwXZoi1/baI +-----END CERTIFICATE----- + +NetLock Business (Class B) Root +=============================== +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg +VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD +VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv +bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg +VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S +o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr +1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV +HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ +RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh +dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 +ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv +c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg +YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz +Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA +bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl +IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 +YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj +cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM +43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR +stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +NetLock Express (Class C) Root +============================== +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ +BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j +ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z +W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 +euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw +DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN +RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn +YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB +IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i +aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 +ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y +emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k +IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ +UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg +YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 +xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW +gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj +YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH +AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw +Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg +U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 +LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh +cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT +dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC +AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh +3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm +vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk +fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 +fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ +EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl +1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ +lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro +g14= +-----END CERTIFICATE----- + +Taiwan GRCA +=========== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG +EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X +DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv +dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN +w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 +BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O +1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO +htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov +J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 +Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t +B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB +O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 +lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV +HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 +09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj +Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 +Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU +D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz +DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk +Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk +7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ +CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy ++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS +-----END CERTIFICATE----- + +Swisscom Root CA 1 +================== +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG +EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy +dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4 +MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln +aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC +IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM +MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF +NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe +AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC +b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn +7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN +cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp +WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5 +haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY +MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw +HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j +BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9 +MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn +jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ +MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H +VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl +vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl +OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3 +1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq +nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy +x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW +NY6E0F/6MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +Certplus Class 2 Primary CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE +BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN +OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy +dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR +5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ +Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO +YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e +e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME +CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ +YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t +L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD +P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R +TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ +7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW +//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +DST Root CA X3 +============== +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK +ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X +DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 +cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT +rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 +UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy +xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d +utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ +MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug +dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE +GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw +RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS +fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +DST ACES CA X6 +============== +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT +MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha +MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE +CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI +DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa +pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow +GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy +MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu +Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy +dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU +CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 +5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t +Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs +vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 +oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 1 +============================================== +-----BEGIN CERTIFICATE----- +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP +MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 +acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx +MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg +U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB +TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC +aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX +yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i +Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ +8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 +W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME +BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 +sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE +q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY +nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 2 +============================================== +-----BEGIN CERTIFICATE----- +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP +MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN +MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr +dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G +A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls +acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe +LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI +x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g +QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr +5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB +AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt +Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ +hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P +9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 +UrbnBEI= +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw +EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN +MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp +c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq +t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C +jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg +vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF +ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR +AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend +jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO +peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR +7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi +GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 +OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm +5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr +44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf +Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m +Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp +mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk +vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf +KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br +NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj +viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT +BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X +DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 +aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG +9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 +N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm ++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH +6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu +MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h +qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 +FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs +ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc +celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X +CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB +tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P +4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F +kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L +3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx +/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa +DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP +e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu +WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ +DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub +DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN +b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 +nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge +RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt +tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI +hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K +Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN +NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa +Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG +1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +thawte Primary Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 +MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg +SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv +KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT +FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs +oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ +1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc +q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K +aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p +afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF +AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE +uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 +jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH +z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G5 +============================================================ +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh +dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz +j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD +Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ +Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r +fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv +Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG +SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ +X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE +KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC +Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE +ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +Network Solutions Certificate Authority +======================================= +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG +EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr +IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx +MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx +jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT +aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT +crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc +/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB +AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv +bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA +A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q +4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ +GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD +ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +WellsSecure Public Root Certificate Authority +============================================= +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM +F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw +NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl +bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD +VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 +iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 +i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 +bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB +K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB +AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu +cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm +lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB +i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww +GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI +K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 +bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj +qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es +E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ +tylv2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +IGC/A +===== +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD +VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE +Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy +MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI +EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT +STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 +TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW +So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy +HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd +frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ +tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB +egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC +iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK +q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q +MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI +lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF +0mBWWg== +-----END CERTIFICATE----- + +Security Communication EV RootCA1 +================================= +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE +BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl +Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO +/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX +WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z +ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 +bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK +9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm +iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG +Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW +mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW +T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GA CA +=============================== +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE +BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG +A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH +bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD +VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw +IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 +IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 +Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg +Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD +d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ +/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R +LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm +MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 ++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY +okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE +BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL +EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 +MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz +dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT +GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG +d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N +oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc +QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ +PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb +MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG +IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD +VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 +LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A +dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA +4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg +AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA +egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 +Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO +PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv +c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h +cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw +IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT +WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV +MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER +MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp +Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal +HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT +nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE +aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK +yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB +S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. +====================================== +-----BEGIN CERTIFICATE----- +MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT +AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg +LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w +HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ +U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh +IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN +yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU +2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 +4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP +2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm +8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf +HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa +Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK +5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b +czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g +ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF +BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug +cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf +AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX +EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v +/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 +MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 +3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk +eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f +/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h +RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU +Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 2 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw +MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw +IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 +xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ +Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u +SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G +dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ +KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj +TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP +JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk +vQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 3 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw +MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W +yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo +6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ +uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk +2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE +O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 +yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 +IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal +092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc +5A== +-----END CERTIFICATE----- + +TC TrustCenter Universal CA I +============================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy +IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN +MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg +VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw +JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC +qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv +xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw +ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O +gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j +BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG +1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy +vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 +ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a +7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY +-----END CERTIFICATE----- + +Deutsche Telekom Root CA 2 +========================== +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT +RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG +A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 +MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G +A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS +b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 +bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI +KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY +AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK +Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV +jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV +HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr +E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy +zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 +rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G +dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +ComSign Secured CA +================== +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE +AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w +NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD +QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs +49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH +7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB +kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 +9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw +AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t +U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA +j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC +AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a +BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp +FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP +51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz +OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== +-----END CERTIFICATE----- + +Cybertrust Global Root +====================== +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li +ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 +MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD +ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA ++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW +0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL +AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin +89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT +8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 +MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G +A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO +lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi +5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 +hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T +X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 +============================================================================================================================= +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH +DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q +aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry +b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV +BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg +S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 +MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl +IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF +n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl +IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft +dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl +cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO +Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 +xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR +6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd +BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 +N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT +y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh +LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M +dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= +-----END CERTIFICATE----- + +Buypass Class 2 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 +MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M +cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 +0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 +0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R +uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV +1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt +7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 +fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w +wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- + +Buypass Class 3 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 +MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx +ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 +n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia +AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c +1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 +pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA +EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 +htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj +el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 +-----END CERTIFICATE----- + +EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 +========================================================================== +-----BEGIN CERTIFICATE----- +MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg +QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe +Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p +ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt +IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by +X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b +gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr +eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ +TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy +Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn +uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI +qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm +ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0 +Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW +Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t +FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm +zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k +XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT +bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU +RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK +1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt +2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ +Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9 +AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +CNNIC ROOT +========== +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE +ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw +OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD +o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz +VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT +VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or +czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK +y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC +wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S +lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 +Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM +O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 +BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 +G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m +mxE= +-----END CERTIFICATE----- + +ApplicationCA - Japanese Government +=================================== +-----BEGIN CERTIFICATE----- +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT +SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw +MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl +cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 +fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN +wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE +jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu +nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU +WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV +BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD +vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs +o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g +/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD +io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW +dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G3 +============================================= +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz +NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo +YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT +LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j +K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE +c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C +IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu +dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr +2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 +cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE +Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s +t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +thawte Primary Root CA - G2 +=========================== +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC +VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu +IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg +Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV +MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG +b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt +IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS +LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 +8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU +mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN +G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K +rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +thawte Primary Root CA - G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w +ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD +VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG +A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At +P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC ++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY +7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW +vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ +KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK +A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC +8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm +er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G2 +============================================= +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 +OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl +b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG +BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc +KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ +EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m +ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 +npaqBA+K +-----END CERTIFICATE----- + +VeriSign Universal Root Certification Authority +=============================================== +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj +1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP +MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 +9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I +AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR +tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G +CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O +a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 +Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx +Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx +P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P +wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 +mJO37M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G4 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC +VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 +b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz +ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo +b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 +Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz +rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw +HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u +Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD +A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx +AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +============================================ +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G2 +================================== +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC +TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l +ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ +5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn +vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj +CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil +e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR +OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI +CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 +48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi +trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 +qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB +AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC +ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA +A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz ++51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj +f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN +kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk +CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF +URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb +CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h +oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV +IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm +66+KAQ== +-----END CERTIFICATE----- + +CA Disig +======== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK +QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw +MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz +bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm +GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD +Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo +hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt +ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w +gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P +AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz +aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff +ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa +BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t +WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 +mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ +CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K +ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA +4Z7CRneC9VkGjCFMhwnN5ag= +-----END CERTIFICATE----- + +Juur-SK +======= +-----BEGIN CERTIFICATE----- +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA +c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw +DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG +SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy +aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf +TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC ++Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw +UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa +Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF +MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD +HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh +AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA +cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr +AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw +cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G +A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo +ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL +abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 +IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh +Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 +yyqcjg== +-----END CERTIFICATE----- + +Hongkong Post Root CA 1 +======================= +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT +DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx +NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n +IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 +ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr +auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh +qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY +V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV +HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i +h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio +l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei +IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps +T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT +c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +ACEDICOM Root +============= +-----BEGIN CERTIFICATE----- +MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD +T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4 +MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG +A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk +WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD +YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew +MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb +m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk +HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT +xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2 +3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9 +2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq +TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz +4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU +9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv +bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg +aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP +eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk +zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1 +ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI +KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq +nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE +I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp +MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o +tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA== +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky +CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX +bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ +D/xwzoiQ +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi +=================================================== +-----BEGIN CERTIFICATE----- +MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz +ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 +MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 +cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u +aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY +8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y +jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI +JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk +9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG +SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d +F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq +D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 +Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq +fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG +EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz +MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu +QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ +03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK +ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU ++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC +PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT +OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK +F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK +0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ +0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB +leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID +AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ +SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG +NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l +Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga +kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q +hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs +g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 +aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 +nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC +ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo +Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z +WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +Chambers of Commerce Root - 2008 +================================ +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy +Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl +ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF +EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl +cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA +XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj +h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ +ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk +NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g +D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 +lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ +0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 +EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI +G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ +BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh +bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh +bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC +CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH +AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 +wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH +3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU +RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 +M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 +YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF +9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK +zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG +nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ +-----END CERTIFICATE----- + +Global Chambersign Root - 2008 +============================== +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx +NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg +Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ +QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf +VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf +XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 +ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB +/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA +TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M +H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe +Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF +HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB +AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT +BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE +BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm +aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm +aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp +1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 +dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG +/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 +ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s +dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg +9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH +foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du +qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr +P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq +c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +Certinomis - Autorité Racine +============================= +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg +LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG +A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw +JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa +wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly +Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw +2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N +jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q +c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC +lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb +xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g +530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna +4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x +WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva +R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 +nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B +CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv +JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE +qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b +WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE +wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ +vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +Root CA Generalitat Valenciana +============================== +-----BEGIN CERTIFICATE----- +MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE +ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 +IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 +WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE +CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 +F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B +ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ +D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte +JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB +AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n +dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB +ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl +AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA +YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy +AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA +aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt +AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA +YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu +AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA +OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 +dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV +BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G +A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S +b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh +TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz +Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 +NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH +iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt ++GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= +-----END CERTIFICATE----- + +A-Trust-nQual-03 +================ +-----BEGIN CERTIFICATE----- +MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE +Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy +a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R +dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw +RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 +ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 +c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA +zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n +yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE +SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 +iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V +cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV +eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 +ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr +sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd +JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS +mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 +ahq97BvIxYSazQ== +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +EC-ACC +====== +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE +BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w +ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD +VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE +CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT +BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 +MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt +SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl +Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh +cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK +w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT +ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 +HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a +E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw +0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD +VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 +Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l +dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ +lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa +Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe +l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 +E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D +5EI= +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2011 +======================================================= +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT +O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y +aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT +AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo +IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI +1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa +71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u +8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH +3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ +MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 +MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu +b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt +XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD +/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N +7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM +BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE +AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky +MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz +IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ +wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa +by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 +zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f +YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 +oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l +EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 +hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 +EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 +jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY +iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI +WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 +JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx +K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ +Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC +4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo +2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz +lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem +OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 +vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +Trustis FPS Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 +IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV +BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ +RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk +H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa +cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt +o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA +AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd +BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c +GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC +yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P +8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV +l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl +iB6XzCGcKQENZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ +Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 +dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu +c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv +bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 +aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 +fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm +N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN +Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T +tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX +e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA +2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs +HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib +D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +StartCom Certification Authority G2 +=================================== +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE +ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O +o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG +4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi +Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul +Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs +O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H +vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L +nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS +FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa +z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ +KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk +J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ +JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG +/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc +nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld +blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc +l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm +7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm +obp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +EE Certification Centre Root CA +=============================== +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy +dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw +MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB +UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy +ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM +TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 +rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw +93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN +P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ +MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF +BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj +xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM +lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU +3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM +dcGWxZ0= +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 2007 +================================================= +-----BEGIN CERTIFICATE----- +MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP +MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X +DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl +a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN +BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp +bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N +YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv +KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya +KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT +rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC +AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s +Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I +aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO +Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb +BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK +poRq0Tl9 +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 EV 2009 +================================= +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv +w9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +PSCProcert +========== +-----BEGIN CERTIFICATE----- +MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk +ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ +MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz +dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl +cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw +IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw +MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w +DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD +ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp +Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC +wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA +3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh +RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO +EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2 +0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH +0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU +td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw +Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp +r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/ +AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz +Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId +xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp +ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH +EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h +Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k +ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG +9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG +MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG +LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52 +ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy +YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v +Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o +dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq +T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN +g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q +uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1 +n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn +FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo +5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq +3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5 +poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y +eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km +-----END CERTIFICATE----- + +China Internet Network Information Center EV Certificates Root +============================================================== +-----BEGIN CERTIFICATE----- +MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D +aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg +Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG +A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM +PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl +cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y +jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV +98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H +klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23 +KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC +7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD +glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5 +0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM +7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws +ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0 +5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8= +-----END CERTIFICATE----- + +Swisscom Root CA 2 +================== +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG +EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy +dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2 +MjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln +aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC +IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM +LgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo +ysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ +wDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH +Wrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a +SgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS +NLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab +mbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY +Ypqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3 +qPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw +HQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O +BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu +MA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO +v2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ +82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz +o9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs +a0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx +OQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW +mA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o ++sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC +rvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX +5OfNeOI5wSsSnqaeG8XmDtkx2Q== +-----END CERTIFICATE----- + +Swisscom Root EV CA 2 +===================== +-----BEGIN CERTIFICATE----- +MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAwZzELMAkGA1UE +BhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdpdGFsIENlcnRpZmljYXRlIFNl +cnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcN +MzEwNjI1MDg0NTA4WjBnMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT +HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYg +Q0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7BxUglgRCgz +o3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD1ycfMQ4jFrclyxy0uYAy +Xhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPHoCE2G3pXKSinLr9xJZDzRINpUKTk4Rti +GZQJo/PDvO/0vezbE53PnUgJUmfANykRHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8Li +qG12W0OfvrSdsyaGOx9/5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaH +Za0zKcQvidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHLOdAG +alNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaCNYGu+HuB5ur+rPQa +m3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f46Fq9mDU5zXNysRojddxyNMkM3Ox +bPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCBUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDi +xzgHcgplwLa7JSnaFp6LNYth7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED +MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWBbj2ITY1x0kbB +bkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6xXCX5145v9Ydkn+0UjrgEjihL +j6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98TPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbU +wp4wLh/vx3rEUMfqe9pQy3omywC0Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7 +XwgiG/W9mR4U9s70WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH +59yLGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm7JFe3VE/ +23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4Snr8PyQUQ3nqjsTzyP6Wq +J3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VNvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyA +HmBR3NdUIR7KYndP+tiPsys6DXhyyWhBWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/gi +uMod89a2GQ+fYWVq6nTIfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuW +l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc= +-----END CERTIFICATE----- + +CA Disig Root R1 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy +3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8 +u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2 +m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk +CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa +YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6 +vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL +LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX +ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is +XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ +04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR +xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B +LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM +CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb +VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85 +YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS +ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix +lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N +UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ +a7+h89n07eLw4+1knj0vllJPgFOL +-----END CERTIFICATE----- + +CA Disig Root R2 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV +7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +ACCVRAIZ1 +========= +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p +EfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +TWCA Global Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= +-----END CERTIFICATE----- + +TeliaSonera Root CA v1 +====================== +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE +CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 +MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW +VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ +6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA +3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k +B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn +Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH +oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 +F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ +oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 +gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc +TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB +AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW +DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm +zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW +pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV +G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc +c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT +JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 +qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 +Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems +WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +E-Tugra Certification Authority +=============================== +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w +DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls +ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw +NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx +QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl +cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD +DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd +hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K +CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g +ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ +BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 +E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz +rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq +jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 +dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB +/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG +MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK +kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO +XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 +VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo +a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc +dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV +KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT +Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 +8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G +C7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 2 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx +MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ +SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F +vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 +2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV +WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy +YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 +r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf +vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR +3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== +-----END CERTIFICATE----- + +Atos TrustedRoot 2011 +===================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU +cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 +MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG +A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV +hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr +54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ +DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 +HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR +z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R +l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ +bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h +k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh +TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 +61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G +3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/functions.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/functions.php new file mode 100755 index 00000000..9dcce36e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/functions.php @@ -0,0 +1,325 @@ +send($client->createRequest($method, $url, $options)); +} + +/** + * Send a GET request + * + * @param string $url URL of the request + * @param array $options Array of request options + * + * @return ResponseInterface + */ +function get($url, array $options = []) +{ + return request('GET', $url, $options); +} + +/** + * Send a HEAD request + * + * @param string $url URL of the request + * @param array $options Array of request options + * + * @return ResponseInterface + */ +function head($url, array $options = []) +{ + return request('HEAD', $url, $options); +} + +/** + * Send a DELETE request + * + * @param string $url URL of the request + * @param array $options Array of request options + * + * @return ResponseInterface + */ +function delete($url, array $options = []) +{ + return request('DELETE', $url, $options); +} + +/** + * Send a POST request + * + * @param string $url URL of the request + * @param array $options Array of request options + * + * @return ResponseInterface + */ +function post($url, array $options = []) +{ + return request('POST', $url, $options); +} + +/** + * Send a PUT request + * + * @param string $url URL of the request + * @param array $options Array of request options + * + * @return ResponseInterface + */ +function put($url, array $options = []) +{ + return request('PUT', $url, $options); +} + +/** + * Send a PATCH request + * + * @param string $url URL of the request + * @param array $options Array of request options + * + * @return ResponseInterface + */ +function patch($url, array $options = []) +{ + return request('PATCH', $url, $options); +} + +/** + * Send an OPTIONS request + * + * @param string $url URL of the request + * @param array $options Array of request options + * + * @return ResponseInterface + */ +function options($url, array $options = []) +{ + return request('OPTIONS', $url, $options); +} + +/** + * Convenience method for sending multiple requests in parallel and retrieving + * a hash map of requests to response objects or RequestException objects. + * + * Note: This method keeps every request and response in memory, and as such is + * NOT recommended when sending a large number or an indeterminable number of + * requests in parallel. + * + * @param ClientInterface $client Client used to send the requests + * @param array|\Iterator $requests Requests to send in parallel + * @param array $options Passes through the options available in + * {@see GuzzleHttp\ClientInterface::sendAll()} + * @return \SplObjectStorage Requests are the key and each value is a + * {@see GuzzleHttp\Message\ResponseInterface} if the request succeeded or + * a {@see GuzzleHttp\Exception\RequestException} if it failed. + * @throws \InvalidArgumentException if the event format is incorrect. + */ +function batch(ClientInterface $client, $requests, array $options = []) +{ + $hash = new \SplObjectStorage(); + foreach ($requests as $request) { + $hash->attach($request); + } + + // Merge the necessary complete and error events to the event listeners so + // that as each request succeeds or fails, it is added to the result hash. + $options = RequestEvents::convertEventArray( + $options, + ['complete', 'error'], + [ + 'priority' => RequestEvents::EARLY, + 'once' => true, + 'fn' => function ($e) use ($hash) { $hash[$e->getRequest()] = $e; } + ] + ); + + // Send the requests in parallel and aggregate the results. + $client->sendAll($requests, $options); + + // Update the received value for any of the intercepted requests. + foreach ($hash as $request) { + if ($hash[$request] instanceof CompleteEvent) { + $hash[$request] = $hash[$request]->getResponse(); + } elseif ($hash[$request] instanceof ErrorEvent) { + $hash[$request] = $hash[$request]->getException(); + } + } + + return $hash; +} + +/** + * Gets a value from an array using a path syntax to retrieve nested data. + * + * This method does not allow for keys that contain "/". You must traverse + * the array manually or using something more advanced like JMESPath to + * work with keys that contain "/". + * + * // Get the bar key of a set of nested arrays. + * // This is equivalent to $collection['foo']['baz']['bar'] but won't + * // throw warnings for missing keys. + * GuzzleHttp\get_path($data, 'foo/baz/bar'); + * + * @param array $data Data to retrieve values from + * @param string $path Path to traverse and retrieve a value from + * + * @return mixed|null + */ +function get_path($data, $path) +{ + $path = explode('/', $path); + + while (null !== ($part = array_shift($path))) { + if (!is_array($data) || !isset($data[$part])) { + return null; + } + $data = $data[$part]; + } + + return $data; +} + +/** + * Set a value in a nested array key. Keys will be created as needed to set the + * value. + * + * This function does not support keys that contain "/" or "[]" characters + * because these are special tokens used when traversing the data structure. + * A value may be prepended to an existing array by using "[]" as the final + * key of a path. + * + * GuzzleHttp\get_path($data, 'foo/baz'); // null + * GuzzleHttp\set_path($data, 'foo/baz/[]', 'a'); + * GuzzleHttp\set_path($data, 'foo/baz/[]', 'b'); + * GuzzleHttp\get_path($data, 'foo/baz'); + * // Returns ['a', 'b'] + * + * @param array $data Data to modify by reference + * @param string $path Path to set + * @param mixed $value Value to set at the key + * @throws \RuntimeException when trying to setPath using a nested path that + * travels through a scalar value. + */ +function set_path(&$data, $path, $value) +{ + $current =& $data; + $queue = explode('/', $path); + while (null !== ($key = array_shift($queue))) { + if (!is_array($current)) { + throw new \RuntimeException("Trying to setPath {$path}, but " + . "{$key} is set and is not an array"); + } elseif (!$queue) { + if ($key == '[]') { + $current[] = $value; + } else { + $current[$key] = $value; + } + } elseif (isset($current[$key])) { + $current =& $current[$key]; + } else { + $current[$key] = []; + $current =& $current[$key]; + } + } +} + +/** + * Expands a URI template + * + * @param string $template URI template + * @param array $variables Template variables + * + * @return string + */ +function uri_template($template, array $variables) +{ + if (function_exists('\\uri_template')) { + return \uri_template($template, $variables); + } + + static $uriTemplate; + if (!$uriTemplate) { + $uriTemplate = new UriTemplate(); + } + + return $uriTemplate->expand($template, $variables); +} + +/** + * Wrapper for JSON decode that implements error detection with helpful error + * messages. + * + * @param string $json JSON data to parse + * @param bool $assoc When true, returned objects will be converted into + * associative arrays. + * @param int $depth User specified recursion depth. + * @param int $options Bitmask of JSON decode options. + * + * @return mixed + * @throws \InvalidArgumentException if the JSON cannot be parsed. + * @link http://www.php.net/manual/en/function.json-decode.php + */ +function json_decode($json, $assoc = false, $depth = 512, $options = 0) +{ + static $jsonErrors = [ + JSON_ERROR_DEPTH => 'JSON_ERROR_DEPTH - Maximum stack depth exceeded', + JSON_ERROR_STATE_MISMATCH => 'JSON_ERROR_STATE_MISMATCH - Underflow or the modes mismatch', + JSON_ERROR_CTRL_CHAR => 'JSON_ERROR_CTRL_CHAR - Unexpected control character found', + JSON_ERROR_SYNTAX => 'JSON_ERROR_SYNTAX - Syntax error, malformed JSON', + JSON_ERROR_UTF8 => 'JSON_ERROR_UTF8 - Malformed UTF-8 characters, possibly incorrectly encoded' + ]; + + $data = \json_decode($json, $assoc, $depth, $options); + + if (JSON_ERROR_NONE !== json_last_error()) { + $last = json_last_error(); + throw new \InvalidArgumentException( + 'Unable to parse JSON data: ' + . (isset($jsonErrors[$last]) ? $jsonErrors[$last] : 'Unknown error') + ); + } + + return $data; +} + +/** + * @internal + */ +function deprecation_proxy($object, $name, $arguments, $map) +{ + if (!isset($map[$name])) { + throw new \BadMethodCallException('Unknown method, ' . $name); + } + + $message = sprintf('%s is deprecated and will be removed in a future ' + . 'version. Update your code to use the equivalent %s method ' + . 'instead to avoid breaking changes when this shim is removed.', + get_class($object) . '::' . $name . '()', + get_class($object) . '::' . $map[$name] . '()' + ); + + trigger_error($message, E_USER_DEPRECATED); + + return call_user_func_array([$object, $map[$name]], $arguments); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Draw/DrawerInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Draw/DrawerInterface.php new file mode 100755 index 00000000..c48dff87 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Draw/DrawerInterface.php @@ -0,0 +1,149 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Draw; + +use Imagine\Image\AbstractFont; +use Imagine\Image\BoxInterface; +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Image\PointInterface; +use Imagine\Exception\RuntimeException; + +/** + * Interface for the drawer + */ +interface DrawerInterface +{ + /** + * Draws an arc on a starting at a given x, y coordinates under a given + * start and end angles + * + * @param PointInterface $center + * @param BoxInterface $size + * @param integer $start + * @param integer $end + * @param ColorInterface $color + * @param integer $thickness + * + * @throws RuntimeException + * + * @return DrawerInterface + */ + public function arc(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $thickness = 1); + + /** + * Same as arc, but also connects end points with a straight line + * + * @param PointInterface $center + * @param BoxInterface $size + * @param integer $start + * @param integer $end + * @param ColorInterface $color + * @param Boolean $fill + * @param integer $thickness + * + * @throws RuntimeException + * + * @return DrawerInterface + */ + public function chord(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1); + + /** + * Draws and ellipse with center at the given x, y coordinates, and given + * width and height + * + * @param PointInterface $center + * @param BoxInterface $size + * @param ColorInterface $color + * @param Boolean $fill + * @param integer $thickness + * + * @throws RuntimeException + * + * @return DrawerInterface + */ + public function ellipse(PointInterface $center, BoxInterface $size, ColorInterface $color, $fill = false, $thickness = 1); + + /** + * Draws a line from start(x, y) to end(x, y) coordinates + * + * @param PointInterface $start + * @param PointInterface $end + * @param ColorInterface $outline + * @param integer $thickness + * + * @return DrawerInterface + */ + public function line(PointInterface $start, PointInterface $end, ColorInterface $outline, $thickness = 1); + + /** + * Same as arc, but connects end points and the center + * + * @param PointInterface $center + * @param BoxInterface $size + * @param integer $start + * @param integer $end + * @param ColorInterface $color + * @param Boolean $fill + * @param integer $thickness + * + * @throws RuntimeException + * + * @return DrawerInterface + */ + public function pieSlice(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1); + + /** + * Places a one pixel point at specific coordinates and fills it with + * specified color + * + * @param PointInterface $position + * @param ColorInterface $color + * + * @throws RuntimeException + * + * @return DrawerInterface + */ + public function dot(PointInterface $position, ColorInterface $color); + + /** + * Draws a polygon using array of x, y coordinates. Must contain at least + * three coordinates + * + * @param array $coordinates + * @param ColorInterface $color + * @param Boolean $fill + * @param integer $thickness + * + * @throws RuntimeException + * + * @return DrawerInterface + */ + public function polygon(array $coordinates, ColorInterface $color, $fill = false, $thickness = 1); + + /** + * Annotates image with specified text at a given position starting on the + * top left of the final text box + * + * The rotation is done CW + * + * @param string $string + * @param AbstractFont $font + * @param PointInterface $position + * @param integer $angle + * @param integer $width + * + * @throws RuntimeException + * + * @return DrawerInterface + */ + public function text($string, AbstractFont $font, PointInterface $position, $angle = 0, $width = null); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Effects/EffectsInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Effects/EffectsInterface.php new file mode 100755 index 00000000..3593d75d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Effects/EffectsInterface.php @@ -0,0 +1,80 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Effects; + +use Imagine\Exception\RuntimeException; +use Imagine\Image\Palette\Color\ColorInterface; + +/** + * Interface for the effects + */ +interface EffectsInterface +{ + /** + * Apply gamma correction + * + * @param float $correction + * @return EffectsInterface + * + * @throws RuntimeException + */ + public function gamma($correction); + + /** + * Invert the colors of the image + * + * @return EffectsInterface + * + * @throws RuntimeException + */ + public function negative(); + + /** + * Grayscale the image + * + * @return EffectsInterface + * + * @throws RuntimeException + */ + public function grayscale(); + + /** + * Colorize the image + * + * @param ColorInterface $color + * + * @return EffectsInterface + * + * @throws RuntimeException + */ + public function colorize(ColorInterface $color); + + /** + * Sharpens the image + * + * @return EffectsInterface + * + * @throws RuntimeException + */ + public function sharpen(); + + /** + * Blur the image + * + * @param float|int $sigma + * + * @return EffectsInterface + * + * @throws RuntimeException + */ + public function blur($sigma); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/Exception.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/Exception.php new file mode 100755 index 00000000..39a67afe --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/Exception.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Exception; + +/** + * Imagine-specific exception + */ +interface Exception +{ +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/InvalidArgumentException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/InvalidArgumentException.php new file mode 100755 index 00000000..5ac13967 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/InvalidArgumentException.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Exception; + +/** + * Imagine-specific invalid argument exception + */ +class InvalidArgumentException extends \InvalidArgumentException implements Exception +{ +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/NotSupportedException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/NotSupportedException.php new file mode 100755 index 00000000..fd68ce7c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/NotSupportedException.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Exception; + +/** + * Should be used when a driver does not support an operation. + */ +class NotSupportedException extends RuntimeException implements Exception +{ +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/OutOfBoundsException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/OutOfBoundsException.php new file mode 100755 index 00000000..f51cc9b4 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/OutOfBoundsException.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Exception; + +/** + * Imagine-specific out of bounds exception + */ +class OutOfBoundsException extends \OutOfBoundsException implements Exception +{ +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/RuntimeException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/RuntimeException.php new file mode 100755 index 00000000..205ad85e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/RuntimeException.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Exception; + +/** + * Imagine-specific runtime exception + */ +class RuntimeException extends \RuntimeException implements Exception +{ +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Border.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Border.php new file mode 100755 index 00000000..47a3ceb1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Border.php @@ -0,0 +1,98 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter\Advanced; + +use Imagine\Filter\FilterInterface; +use Imagine\Image\ImageInterface; +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Image\Point; + +/** + * A border filter + */ +class Border implements FilterInterface +{ + /** + * @var ColorInterface + */ + private $color; + + /** + * @var integer + */ + private $width; + + /** + * @var integer + */ + private $height; + + /** + * Constructs Border filter with given color, width and height + * + * @param ColorInterface $color + * @param integer $width Width of the border on the left and right sides of the image + * @param integer $height Height of the border on the top and bottom sides of the image + */ + public function __construct(ColorInterface $color, $width = 1, $height = 1) + { + $this->color = $color; + $this->width = $width; + $this->height = $height; + } + + /** + * {@inheritdoc} + */ + public function apply(ImageInterface $image) + { + $size = $image->getSize(); + $width = $size->getWidth(); + $height = $size->getHeight(); + + $draw = $image->draw(); + + // Draw top and bottom lines + $draw + ->line( + new Point(0, 0), + new Point($width - 1, 0), + $this->color, + $this->height + ) + ->line( + new Point($width - 1, $height - 1), + new Point(0, $height - 1), + $this->color, + $this->height + ) + ; + + // Draw sides + $draw + ->line( + new Point(0, 0), + new Point(0, $height - 1), + $this->color, + $this->width + ) + ->line( + new Point($width - 1, 0), + new Point($width - 1, $height - 1), + $this->color, + $this->width + ) + ; + + return $image; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Canvas.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Canvas.php new file mode 100755 index 00000000..685b8ae7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Canvas.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter\Advanced; + +use Imagine\Filter\FilterInterface; +use Imagine\Image\ImageInterface; +use Imagine\Image\BoxInterface; +use Imagine\Image\Point; +use Imagine\Image\PointInterface; +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Image\ImagineInterface; + +/** + * A canvas filter + */ +class Canvas implements FilterInterface +{ + /** + * @var BoxInterface + */ + private $size; + + /** + * @var PointInterface + */ + private $placement; + + /** + * @var ColorInterface + */ + private $background; + + /** + * @var ImagineInterface + */ + private $imagine; + + /** + * Constructs Canvas filter with given width and height and the placement of the current image + * inside the new canvas + * + * @param ImagineInterface $imagine + * @param BoxInterface $size + * @param PointInterface $placement + * @param ColorInterface $background + */ + public function __construct(ImagineInterface $imagine, BoxInterface $size, PointInterface $placement = null, ColorInterface $background = null) + { + $this->imagine = $imagine; + $this->size = $size; + $this->placement = $placement ?: new Point(0, 0); + $this->background = $background; + } + + /** + * {@inheritdoc} + */ + public function apply(ImageInterface $image) + { + $canvas = $this->imagine->create($this->size, $this->background); + $canvas->paste($image, $this->placement); + + return $canvas; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Grayscale.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Grayscale.php new file mode 100755 index 00000000..b3a08b40 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Grayscale.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter\Advanced; + +use Imagine\Filter\FilterInterface; +use Imagine\Image\ImageInterface; +use Imagine\Image\Point; + +/** + * The Grayscale filter calculates the gray-value based on RGB. + */ +class Grayscale extends OnPixelBased implements FilterInterface +{ + public function __construct() + { + parent::__construct(function (ImageInterface $image, Point $point) { + $color = $image->getColorAt($point); + $image->draw()->dot($point, $color->grayscale()); + }); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/OnPixelBased.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/OnPixelBased.php new file mode 100755 index 00000000..ef297eaf --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/OnPixelBased.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter\Advanced; + +use Imagine\Exception\InvalidArgumentException; +use Imagine\Filter\FilterInterface; +use Imagine\Image\ImageInterface; +use Imagine\Image\Point; + +/** + * The OnPixelBased takes a callable, and for each pixel, this callable is called with the + * image (\Imagine\Image\ImageInterface) and the current point (\Imagine\Image\Point) + */ +class OnPixelBased implements FilterInterface +{ + protected $callback; + + public function __construct($callback) + { + if (!is_callable($callback)) { + throw new InvalidArgumentException('$callback has to be callable'); + } + + $this->callback = $callback; + } + + /** + * Applies scheduled transformation to ImageInterface instance + * Returns processed ImageInterface instance + * + * @param ImageInterface $image + * + * @return ImageInterface + */ + public function apply(ImageInterface $image) + { + $w = $image->getSize()->getWidth(); + $h = $image->getSize()->getHeight(); + + for ($x = 0; $x < $w; $x++) { + for ($y = 0; $y < $h; $y++) { + call_user_func($this->callback, $image, new Point($x, $y)); + } + } + + return $image; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/RelativeResize.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/RelativeResize.php new file mode 100755 index 00000000..954587ad --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/RelativeResize.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter\Advanced; + +use Imagine\Exception\InvalidArgumentException; +use Imagine\Filter\FilterInterface; +use Imagine\Image\ImageInterface; + +/** + * The RelativeResize filter allows images to be resized relative to their + * existing dimensions. + */ +class RelativeResize implements FilterInterface +{ + private $method; + private $parameter; + + /** + * Constructs a RelativeResize filter with the given method and argument. + * + * @param string $method BoxInterface method + * @param mixed $parameter Parameter for BoxInterface method + */ + public function __construct($method, $parameter) + { + if (!in_array($method, array('heighten', 'increase', 'scale', 'widen'))) { + throw new InvalidArgumentException(sprintf('Unsupported method: ', $method)); + } + + $this->method = $method; + $this->parameter = $parameter; + } + + /** + * {@inheritdoc} + */ + public function apply(ImageInterface $image) + { + return $image->resize(call_user_func(array($image->getSize(), $this->method), $this->parameter)); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/ApplyMask.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/ApplyMask.php new file mode 100755 index 00000000..2be2786f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/ApplyMask.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter\Basic; + +use Imagine\Filter\FilterInterface; +use Imagine\Image\ImageInterface; + +/** + * An apply mask filter + */ +class ApplyMask implements FilterInterface +{ + /** + * @var ImageInterface + */ + private $mask; + + /** + * @param ImageInterface $mask + */ + public function __construct(ImageInterface $mask) + { + $this->mask = $mask; + } + + /** + * {@inheritdoc} + */ + public function apply(ImageInterface $image) + { + return $image->applyMask($this->mask); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Autorotate.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Autorotate.php new file mode 100755 index 00000000..3ef7cbec --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Autorotate.php @@ -0,0 +1,87 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter\Basic; + +use Imagine\Filter\FilterInterface; +use Imagine\Image\ImageInterface; +use Imagine\Image\Palette\Color\ColorInterface; + +/** + * Rotates an image automatically based on exif information. + * + * Your attention please: This filter requires the use of the + * ExifMetadataReader to work. + * + * @see https://imagine.readthedocs.org/en/latest/usage/metadata.html + */ +class Autorotate implements FilterInterface +{ + private $color; + + /** + * @param string|array|ColorInterface $color A color + */ + public function __construct($color = '000000') + { + $this->color = $color; + } + + /** + * {@inheritdoc} + */ + public function apply(ImageInterface $image) + { + $metadata = $image->metadata(); + + switch (isset($metadata['ifd0.Orientation']) ? $metadata['ifd0.Orientation'] : null) { + case 1: // top-left + break; + case 2: // top-right + $image->flipHorizontally(); + break; + case 3: // bottom-right + $image->rotate(180, $this->getColor($image)); + break; + case 4: // bottom-left + $image->flipHorizontally(); + $image->rotate(180, $this->getColor($image)); + break; + case 5: // left-top + $image->flipHorizontally(); + $image->rotate(-90, $this->getColor($image)); + break; + case 6: // right-top + $image->rotate(90, $this->getColor($image)); + break; + case 7: // right-bottom + $image->flipHorizontally(); + $image->rotate(90, $this->getColor($image)); + break; + case 8: // left-bottom + $image->rotate(-90, $this->getColor($image)); + break; + default: // Invalid orientation + break; + } + + return $image; + } + + private function getColor(ImageInterface $image) + { + if ($this->color instanceof ColorInterface) { + return $this->color; + } + + return $image->palette()->color($this->color); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Copy.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Copy.php new file mode 100755 index 00000000..781b23a7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Copy.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter\Basic; + +use Imagine\Filter\FilterInterface; +use Imagine\Image\ImageInterface; + +/** + * A copy filter + */ +class Copy implements FilterInterface +{ + /** + * {@inheritdoc} + */ + public function apply(ImageInterface $image) + { + return $image->copy(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Crop.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Crop.php new file mode 100755 index 00000000..6559e229 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Crop.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter\Basic; + +use Imagine\Image\ImageInterface; +use Imagine\Image\BoxInterface; +use Imagine\Image\PointInterface; +use Imagine\Filter\FilterInterface; + +/** + * A crop filter + */ +class Crop implements FilterInterface +{ + /** + * @var PointInterface + */ + private $start; + + /** + * @var BoxInterface + */ + private $size; + + /** + * Constructs a Crop filter with given x, y, coordinates and crop width and + * height values + * + * @param PointInterface $start + * @param BoxInterface $size + */ + public function __construct(PointInterface $start, BoxInterface $size) + { + $this->start = $start; + $this->size = $size; + } + + /** + * {@inheritdoc} + */ + public function apply(ImageInterface $image) + { + return $image->crop($this->start, $this->size); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Fill.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Fill.php new file mode 100755 index 00000000..4be0d0f2 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Fill.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter\Basic; + +use Imagine\Filter\FilterInterface; +use Imagine\Image\Fill\FillInterface; +use Imagine\Image\ImageInterface; + +/** + * A fill filter + */ +class Fill implements FilterInterface +{ + /** + * @var FillInterface + */ + private $fill; + + /** + * @param FillInterface $fill + */ + public function __construct(FillInterface $fill) + { + $this->fill = $fill; + } + + /** + * {@inheritdoc} + */ + public function apply(ImageInterface $image) + { + return $image->fill($this->fill); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/FlipHorizontally.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/FlipHorizontally.php new file mode 100755 index 00000000..50203748 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/FlipHorizontally.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter\Basic; + +use Imagine\Image\ImageInterface; +use Imagine\Filter\FilterInterface; + +/** + * A "flip horizontally" filter + */ +class FlipHorizontally implements FilterInterface +{ + /** + * {@inheritdoc} + */ + public function apply(ImageInterface $image) + { + return $image->flipHorizontally(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/FlipVertically.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/FlipVertically.php new file mode 100755 index 00000000..684c31b3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/FlipVertically.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter\Basic; + +use Imagine\Image\ImageInterface; +use Imagine\Filter\FilterInterface; + +/** + * A "flip vertically" filter + */ +class FlipVertically implements FilterInterface +{ + /** + * {@inheritdoc} + */ + public function apply(ImageInterface $image) + { + return $image->flipVertically(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Paste.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Paste.php new file mode 100755 index 00000000..bd274a17 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Paste.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter\Basic; + +use Imagine\Image\ImageInterface; +use Imagine\Image\PointInterface; +use Imagine\Filter\FilterInterface; + +/** + * A paste filter + */ +class Paste implements FilterInterface +{ + /** + * @var ImageInterface + */ + private $image; + + /** + * @var PointInterface + */ + private $start; + + /** + * Constructs a Paste filter with given ImageInterface to paste and x, y + * coordinates of target position + * + * @param ImageInterface $image + * @param PointInterface $start + */ + public function __construct(ImageInterface $image, PointInterface $start) + { + $this->image = $image; + $this->start = $start; + } + + /** + * {@inheritdoc} + */ + public function apply(ImageInterface $image) + { + return $image->paste($this->image, $this->start); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Resize.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Resize.php new file mode 100755 index 00000000..934cfe2f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Resize.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter\Basic; + +use Imagine\Filter\FilterInterface; +use Imagine\Image\ImageInterface; +use Imagine\Image\BoxInterface; + +/** + * A resize filter + */ +class Resize implements FilterInterface +{ + /** + * @var BoxInterface + */ + private $size; + private $filter; + + /** + * Constructs Resize filter with given width and height + * + * @param BoxInterface $size + * @param string $filter + */ + public function __construct(BoxInterface $size, $filter = ImageInterface::FILTER_UNDEFINED) + { + $this->size = $size; + $this->filter = $filter; + } + + /** + * {@inheritdoc} + */ + public function apply(ImageInterface $image) + { + return $image->resize($this->size, $this->filter); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Rotate.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Rotate.php new file mode 100755 index 00000000..7b5553ff --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Rotate.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter\Basic; + +use Imagine\Image\ImageInterface; +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Filter\FilterInterface; + +/** + * A rotate filter + */ +class Rotate implements FilterInterface +{ + /** + * @var integer + */ + private $angle; + + /** + * @var ColorInterface + */ + private $background; + + /** + * Constructs Rotate filter with given angle and background color + * + * @param integer $angle + * @param ColorInterface $background + */ + public function __construct($angle, ColorInterface $background = null) + { + $this->angle = $angle; + $this->background = $background; + } + + /** + * {@inheritdoc} + */ + public function apply(ImageInterface $image) + { + return $image->rotate($this->angle, $this->background); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Save.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Save.php new file mode 100755 index 00000000..0f76625a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Save.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter\Basic; + +use Imagine\Image\ImageInterface; +use Imagine\Filter\FilterInterface; + +/** + * A save filter + */ +class Save implements FilterInterface +{ + /** + * @var string + */ + private $path; + + /** + * @var array + */ + private $options; + + /** + * Constructs Save filter with given path and options + * + * @param string $path + * @param array $options + */ + public function __construct($path = null, array $options = array()) + { + $this->path = $path; + $this->options = $options; + } + + /** + * {@inheritdoc} + */ + public function apply(ImageInterface $image) + { + return $image->save($this->path, $this->options); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Show.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Show.php new file mode 100755 index 00000000..a7d4cbc4 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Show.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter\Basic; + +use Imagine\Image\ImageInterface; +use Imagine\Filter\FilterInterface; + +/** + * A show filter + */ +class Show implements FilterInterface +{ + /** + * @var string + */ + private $format; + + /** + * @var array + */ + private $options; + + /** + * Constructs the Show filter with given format and options + * + * @param string $format + * @param array $options + */ + public function __construct($format, array $options = array()) + { + $this->format = $format; + $this->options = $options; + } + + /** + * {@inheritdoc} + */ + public function apply(ImageInterface $image) + { + return $image->show($this->format, $this->options); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Strip.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Strip.php new file mode 100755 index 00000000..c096a51b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Strip.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter\Basic; + +use Imagine\Image\ImageInterface; +use Imagine\Filter\FilterInterface; + +/** + * A strip filter + */ +class Strip implements FilterInterface +{ + /** + * {@inheritdoc} + */ + public function apply(ImageInterface $image) + { + return $image->strip(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Thumbnail.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Thumbnail.php new file mode 100755 index 00000000..3176f1c3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Thumbnail.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter\Basic; + +use Imagine\Image\ImageInterface; +use Imagine\Image\BoxInterface; +use Imagine\Filter\FilterInterface; + +/** + * A thumbnail filter + */ +class Thumbnail implements FilterInterface +{ + /** + * @var BoxInterface + */ + private $size; + + /** + * @var string + */ + private $mode; + + /** + * @var string + */ + private $filter; + + /** + * Constructs the Thumbnail filter with given width, height and mode + * + * @param BoxInterface $size + * @param string $mode + * @param string $filter + */ + public function __construct(BoxInterface $size, $mode = ImageInterface::THUMBNAIL_INSET, $filter = ImageInterface::FILTER_UNDEFINED) + { + $this->size = $size; + $this->mode = $mode; + $this->filter = $filter; + } + + /** + * {@inheritdoc} + */ + public function apply(ImageInterface $image) + { + return $image->thumbnail($this->size, $this->mode, $this->filter); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/WebOptimization.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/WebOptimization.php new file mode 100755 index 00000000..37f5f3f1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/WebOptimization.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter\Basic; + +use Imagine\Image\ImageInterface; +use Imagine\Image\Palette\RGB; +use Imagine\Filter\FilterInterface; + +/** + * A filter to render web-optimized images + */ +class WebOptimization implements FilterInterface +{ + private $palette; + private $path; + private $options; + + public function __construct($path = null, array $options = array()) + { + $this->path = $path; + $this->options = array_replace(array( + 'resolution-units' => ImageInterface::RESOLUTION_PIXELSPERINCH, + 'resolution-y' => 72, + 'resolution-x' => 72, + ), $options); + $this->palette = new RGB(); + } + + /** + * {@inheritdoc} + */ + public function apply(ImageInterface $image) + { + $image + ->usePalette($this->palette) + ->strip(); + + if (is_callable($this->path)) { + $path = call_user_func($this->path, $image); + } elseif (null !== $this->path) { + $path = $this->path; + } else { + return $image; + } + + return $image->save($path, $this->options); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/FilterInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/FilterInterface.php new file mode 100755 index 00000000..e23ab70e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/FilterInterface.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter; + +use Imagine\Image\ImageInterface; + +/** + * Interface for imagine filters + */ +interface FilterInterface +{ + /** + * Applies scheduled transformation to ImageInterface instance + * Returns processed ImageInterface instance + * + * @param ImageInterface $image + * + * @return ImageInterface + */ + public function apply(ImageInterface $image); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/ImagineAware.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/ImagineAware.php new file mode 100755 index 00000000..606c5254 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/ImagineAware.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter; + +use Imagine\Exception\InvalidArgumentException; +use Imagine\Image\ImagineInterface; + +/** + * ImagineAware base class + */ +abstract class ImagineAware implements FilterInterface +{ + /** + * An ImagineInterface instance. + * + * @var ImagineInterface + */ + private $imagine; + + /** + * Set ImagineInterface instance. + * + * @param ImagineInterface $imagine An ImagineInterface instance + */ + public function setImagine(ImagineInterface $imagine) + { + $this->imagine = $imagine; + } + + /** + * Get ImagineInterface instance. + * + * @return ImagineInterface + * + * @throws InvalidArgumentException + */ + public function getImagine() + { + if (!$this->imagine instanceof ImagineInterface) { + throw new InvalidArgumentException(sprintf('In order to use %s pass an Imagine\Image\ImagineInterface instance to filter constructor', get_class($this))); + } + + return $this->imagine; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Transformation.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Transformation.php new file mode 100755 index 00000000..26c023a0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Transformation.php @@ -0,0 +1,240 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Filter; + +use Imagine\Exception\InvalidArgumentException; +use Imagine\Filter\Basic\ApplyMask; +use Imagine\Filter\Basic\Copy; +use Imagine\Filter\Basic\Crop; +use Imagine\Filter\Basic\Fill; +use Imagine\Filter\Basic\FlipVertically; +use Imagine\Filter\Basic\FlipHorizontally; +use Imagine\Filter\Basic\Paste; +use Imagine\Filter\Basic\Resize; +use Imagine\Filter\Basic\Rotate; +use Imagine\Filter\Basic\Save; +use Imagine\Filter\Basic\Show; +use Imagine\Filter\Basic\Strip; +use Imagine\Filter\Basic\Thumbnail; +use Imagine\Image\ImageInterface; +use Imagine\Image\ImagineInterface; +use Imagine\Image\BoxInterface; +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Image\Fill\FillInterface; +use Imagine\Image\ManipulatorInterface; +use Imagine\Image\PointInterface; + +/** + * A transformation filter + */ +final class Transformation implements FilterInterface, ManipulatorInterface +{ + /** + * @var array + */ + private $filters = array(); + + /** + * @var array + */ + private $sorted; + + /** + * An ImagineInterface instance. + * + * @var ImagineInterface + */ + private $imagine; + + /** + * Class constructor. + * + * @param ImagineInterface $imagine An ImagineInterface instance + */ + public function __construct(ImagineInterface $imagine = null) + { + $this->imagine = $imagine; + } + + /** + * Applies a given FilterInterface onto given ImageInterface and returns + * modified ImageInterface + * + * @param ImageInterface $image + * @param FilterInterface $filter + * + * @return ImageInterface + * @throws InvalidArgumentException + */ + public function applyFilter(ImageInterface $image, FilterInterface $filter) + { + if ($filter instanceof ImagineAware) { + if ($this->imagine === null) { + throw new InvalidArgumentException(sprintf('In order to use %s pass an Imagine\Image\ImagineInterface instance to Transformation constructor', get_class($filter))); + } + $filter->setImagine($this->imagine); + } + + return $filter->apply($image); + } + + /** + * Returns a list of filters sorted by their priority. Filters with same priority will be returned in the order they were added. + * + * @return array + */ + public function getFilters() + { + if (null === $this->sorted) { + if (!empty($this->filters)) { + ksort($this->filters); + $this->sorted = call_user_func_array('array_merge', $this->filters); + } else { + $this->sorted = array(); + } + } + + return $this->sorted; + } + + /** + * {@inheritdoc} + */ + public function apply(ImageInterface $image) + { + return array_reduce( + $this->getFilters(), + array($this, 'applyFilter'), + $image + ); + } + + /** + * {@inheritdoc} + */ + public function copy() + { + return $this->add(new Copy()); + } + + /** + * {@inheritdoc} + */ + public function crop(PointInterface $start, BoxInterface $size) + { + return $this->add(new Crop($start, $size)); + } + + /** + * {@inheritdoc} + */ + public function flipHorizontally() + { + return $this->add(new FlipHorizontally()); + } + + /** + * {@inheritdoc} + */ + public function flipVertically() + { + return $this->add(new FlipVertically()); + } + + /** + * {@inheritdoc} + */ + public function strip() + { + return $this->add(new Strip()); + } + + /** + * {@inheritdoc} + */ + public function paste(ImageInterface $image, PointInterface $start) + { + return $this->add(new Paste($image, $start)); + } + + /** + * {@inheritdoc} + */ + public function applyMask(ImageInterface $mask) + { + return $this->add(new ApplyMask($mask)); + } + + /** + * {@inheritdoc} + */ + public function fill(FillInterface $fill) + { + return $this->add(new Fill($fill)); + } + + /** + * {@inheritdoc} + */ + public function resize(BoxInterface $size, $filter = ImageInterface::FILTER_UNDEFINED) + { + return $this->add(new Resize($size, $filter)); + } + + /** + * {@inheritdoc} + */ + public function rotate($angle, ColorInterface $background = null) + { + return $this->add(new Rotate($angle, $background)); + } + + /** + * {@inheritdoc} + */ + public function save($path = null, array $options = array()) + { + return $this->add(new Save($path, $options)); + } + + /** + * {@inheritdoc} + */ + public function show($format, array $options = array()) + { + return $this->add(new Show($format, $options)); + } + + /** + * {@inheritdoc} + */ + public function thumbnail(BoxInterface $size, $mode = ImageInterface::THUMBNAIL_INSET, $filter = ImageInterface::FILTER_UNDEFINED) + { + return $this->add(new Thumbnail($size, $mode, $filter)); + } + + /** + * Registers a given FilterInterface in an internal array of filters for + * later application to an instance of ImageInterface + * + * @param FilterInterface $filter + * @param int $priority + * @return Transformation + */ + public function add(FilterInterface $filter, $priority = 0) + { + $this->filters[$priority][] = $filter; + $this->sorted = null; + + return $this; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Drawer.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Drawer.php new file mode 100755 index 00000000..e5d74e0d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Drawer.php @@ -0,0 +1,333 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Gd; + +use Imagine\Draw\DrawerInterface; +use Imagine\Exception\InvalidArgumentException; +use Imagine\Exception\RuntimeException; +use Imagine\Image\AbstractFont; +use Imagine\Image\BoxInterface; +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Image\Palette\Color\RGB as RGBColor; +use Imagine\Image\PointInterface; + +/** + * Drawer implementation using the GD library + */ +final class Drawer implements DrawerInterface +{ + /** + * @var resource + */ + private $resource; + + /** + * @var array + */ + private $info; + + /** + * Constructs Drawer with a given gd image resource + * + * @param resource $resource + */ + public function __construct($resource) + { + $this->loadGdInfo(); + $this->resource = $resource; + } + + /** + * {@inheritdoc} + */ + public function arc(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $thickness = 1) + { + imagesetthickness($this->resource, max(1, (int) $thickness)); + + if (false === imagealphablending($this->resource, true)) { + throw new RuntimeException('Draw arc operation failed'); + } + + if (false === imagearc($this->resource, $center->getX(), $center->getY(), $size->getWidth(), $size->getHeight(), $start, $end, $this->getColor($color))) { + imagealphablending($this->resource, false); + throw new RuntimeException('Draw arc operation failed'); + } + + if (false === imagealphablending($this->resource, false)) { + throw new RuntimeException('Draw arc operation failed'); + } + + return $this; + } + + /** + * This function does not work properly because of a bug in GD + * + * {@inheritdoc} + */ + public function chord(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1) + { + imagesetthickness($this->resource, max(1, (int) $thickness)); + + if ($fill) { + $style = IMG_ARC_CHORD; + } else { + $style = IMG_ARC_CHORD | IMG_ARC_NOFILL; + } + + if (false === imagealphablending($this->resource, true)) { + throw new RuntimeException('Draw chord operation failed'); + } + + if (false === imagefilledarc($this->resource, $center->getX(), $center->getY(), $size->getWidth(), $size->getHeight(), $start, $end, $this->getColor($color), $style)) { + imagealphablending($this->resource, false); + throw new RuntimeException('Draw chord operation failed'); + } + + if (false === imagealphablending($this->resource, false)) { + throw new RuntimeException('Draw chord operation failed'); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function ellipse(PointInterface $center, BoxInterface $size, ColorInterface $color, $fill = false, $thickness = 1) + { + imagesetthickness($this->resource, max(1, (int) $thickness)); + + if ($fill) { + $callback = 'imagefilledellipse'; + } else { + $callback = 'imageellipse'; + } + + if (false === imagealphablending($this->resource, true)) { + throw new RuntimeException('Draw ellipse operation failed'); + } + + if (false === $callback($this->resource, $center->getX(), $center->getY(), $size->getWidth(), $size->getHeight(), $this->getColor($color))) { + imagealphablending($this->resource, false); + throw new RuntimeException('Draw ellipse operation failed'); + } + + if (false === imagealphablending($this->resource, false)) { + throw new RuntimeException('Draw ellipse operation failed'); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function line(PointInterface $start, PointInterface $end, ColorInterface $color, $thickness = 1) + { + imagesetthickness($this->resource, max(1, (int) $thickness)); + + if (false === imagealphablending($this->resource, true)) { + throw new RuntimeException('Draw line operation failed'); + } + + if (false === imageline($this->resource, $start->getX(), $start->getY(), $end->getX(), $end->getY(), $this->getColor($color))) { + imagealphablending($this->resource, false); + throw new RuntimeException('Draw line operation failed'); + } + + if (false === imagealphablending($this->resource, false)) { + throw new RuntimeException('Draw line operation failed'); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function pieSlice(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1) + { + imagesetthickness($this->resource, max(1, (int) $thickness)); + + if ($fill) { + $style = IMG_ARC_EDGED; + } else { + $style = IMG_ARC_EDGED | IMG_ARC_NOFILL; + } + + if (false === imagealphablending($this->resource, true)) { + throw new RuntimeException('Draw chord operation failed'); + } + + if (false === imagefilledarc($this->resource, $center->getX(), $center->getY(), $size->getWidth(), $size->getHeight(), $start, $end, $this->getColor($color), $style)) { + imagealphablending($this->resource, false); + throw new RuntimeException('Draw chord operation failed'); + } + + if (false === imagealphablending($this->resource, false)) { + throw new RuntimeException('Draw chord operation failed'); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function dot(PointInterface $position, ColorInterface $color) + { + if (false === imagealphablending($this->resource, true)) { + throw new RuntimeException('Draw point operation failed'); + } + + if (false === imagesetpixel($this->resource, $position->getX(), $position->getY(), $this->getColor($color))) { + imagealphablending($this->resource, false); + throw new RuntimeException('Draw point operation failed'); + } + + if (false === imagealphablending($this->resource, false)) { + throw new RuntimeException('Draw point operation failed'); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function polygon(array $coordinates, ColorInterface $color, $fill = false, $thickness = 1) + { + imagesetthickness($this->resource, max(1, (int) $thickness)); + + if (count($coordinates) < 3) { + throw new InvalidArgumentException(sprintf('A polygon must consist of at least 3 points, %d given', count($coordinates))); + } + + $points = call_user_func_array('array_merge', array_map(function (PointInterface $p) { + return array($p->getX(), $p->getY()); + }, $coordinates)); + + if ($fill) { + $callback = 'imagefilledpolygon'; + } else { + $callback = 'imagepolygon'; + } + + if (false === imagealphablending($this->resource, true)) { + throw new RuntimeException('Draw polygon operation failed'); + } + + if (false === $callback($this->resource, $points, count($coordinates), $this->getColor($color))) { + imagealphablending($this->resource, false); + throw new RuntimeException('Draw polygon operation failed'); + } + + if (false === imagealphablending($this->resource, false)) { + throw new RuntimeException('Draw polygon operation failed'); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function text($string, AbstractFont $font, PointInterface $position, $angle = 0, $width = null) + { + if (!$this->info['FreeType Support']) { + throw new RuntimeException('GD is not compiled with FreeType support'); + } + + $angle = -1 * $angle; + $fontsize = $font->getSize(); + $fontfile = $font->getFile(); + $x = $position->getX(); + $y = $position->getY() + $fontsize; + + if ($width !== null) { + $string = $this->wrapText($string, $font, $angle, $width); + } + + if (false === imagealphablending($this->resource, true)) { + throw new RuntimeException('Font mask operation failed'); + } + + if (false === imagefttext($this->resource, $fontsize, $angle, $x, $y, $this->getColor($font->getColor()), $fontfile, $string)) { + imagealphablending($this->resource, false); + throw new RuntimeException('Font mask operation failed'); + } + + if (false === imagealphablending($this->resource, false)) { + throw new RuntimeException('Font mask operation failed'); + } + + return $this; + } + + /** + * Internal + * + * Generates a GD color from Color instance + * + * @param ColorInterface $color + * + * @return resource + * + * @throws RuntimeException + * @throws InvalidArgumentException + */ + private function getColor(ColorInterface $color) + { + if (!$color instanceof RGBColor) { + throw new InvalidArgumentException('GD driver only supports RGB colors'); + } + + $gdColor = imagecolorallocatealpha($this->resource, $color->getRed(), $color->getGreen(), $color->getBlue(), (100 - $color->getAlpha()) * 127 / 100); + if (false === $gdColor) { + throw new RuntimeException(sprintf('Unable to allocate color "RGB(%s, %s, %s)" with transparency of %d percent', $color->getRed(), $color->getGreen(), $color->getBlue(), $color->getAlpha())); + } + + return $gdColor; + } + + private function loadGdInfo() + { + if (!function_exists('gd_info')) { + throw new RuntimeException('Gd not installed'); + } + + $this->info = gd_info(); + } + + /** + * Internal + * + * Fits a string into box with given width + */ + private function wrapText($string, AbstractFont $font, $angle, $width) + { + $result = ''; + $words = explode(' ', $string); + foreach ($words as $word) { + $teststring = $result . ' ' . $word; + $testbox = imagettfbbox($font->getSize(), $angle, $font->getFile(), $teststring); + if ($testbox[2] > $width) { + $result .= ($result == '' ? '' : "\n") . $word; + } else { + $result .= ($result == '' ? '' : ' ') . $word; + } + } + + return $result; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Effects.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Effects.php new file mode 100755 index 00000000..d86c4f8a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Effects.php @@ -0,0 +1,109 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Gd; + +use Imagine\Effects\EffectsInterface; +use Imagine\Exception\RuntimeException; +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Image\Palette\Color\RGB as RGBColor; + +/** + * Effects implementation using the GD library + */ +class Effects implements EffectsInterface +{ + private $resource; + + public function __construct($resource) + { + $this->resource = $resource; + } + + /** + * {@inheritdoc} + */ + public function gamma($correction) + { + if (false === imagegammacorrect($this->resource, 1.0, $correction)) { + throw new RuntimeException('Failed to apply gamma correction to the image'); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function negative() + { + if (false === imagefilter($this->resource, IMG_FILTER_NEGATE)) { + throw new RuntimeException('Failed to negate the image'); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function grayscale() + { + if (false === imagefilter($this->resource, IMG_FILTER_GRAYSCALE)) { + throw new RuntimeException('Failed to grayscale the image'); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function colorize(ColorInterface $color) + { + if (!$color instanceof RGBColor) { + throw new RuntimeException('Colorize effects only accepts RGB color in GD context'); + } + + if (false === imagefilter($this->resource, IMG_FILTER_COLORIZE, $color->getRed(), $color->getGreen(), $color->getBlue())) { + throw new RuntimeException('Failed to colorize the image'); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function sharpen() + { + $sharpenMatrix = array(array(-1,-1,-1), array(-1,16,-1), array(-1,-1,-1)); + $divisor = array_sum(array_map('array_sum', $sharpenMatrix)); + + if (false === imageconvolution($this->resource, $sharpenMatrix, $divisor, 0)) { + throw new RuntimeException('Failed to sharpen the image'); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function blur($sigma = 1) + { + if (false === imagefilter($this->resource, IMG_FILTER_GAUSSIAN_BLUR)) { + throw new RuntimeException('Failed to blur the image'); + } + + return $this; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Font.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Font.php new file mode 100755 index 00000000..8bc2b04d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Font.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Gd; + +use Imagine\Exception\RuntimeException; +use Imagine\Image\AbstractFont; +use Imagine\Image\Box; + +/** + * Font implementation using the GD library + */ +final class Font extends AbstractFont +{ + /** + * {@inheritdoc} + */ + public function box($string, $angle = 0) + { + if (!function_exists('imageftbbox')) { + throw new RuntimeException('GD must have been compiled with `--with-freetype-dir` option to use the Font feature.'); + } + + $angle = -1 * $angle; + $info = imageftbbox($this->size, $angle, $this->file, $string); + $xs = array($info[0], $info[2], $info[4], $info[6]); + $ys = array($info[1], $info[3], $info[5], $info[7]); + $width = abs(max($xs) - min($xs)); + $height = abs(max($ys) - min($ys)); + + return new Box($width, $height); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Image.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Image.php new file mode 100755 index 00000000..73d7b950 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Image.php @@ -0,0 +1,735 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Gd; + +use Imagine\Image\AbstractImage; +use Imagine\Image\ImageInterface; +use Imagine\Image\Box; +use Imagine\Image\BoxInterface; +use Imagine\Image\Metadata\MetadataBag; +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Image\Fill\FillInterface; +use Imagine\Image\Point; +use Imagine\Image\PointInterface; +use Imagine\Image\Palette\PaletteInterface; +use Imagine\Image\Palette\Color\RGB as RGBColor; +use Imagine\Image\ProfileInterface; +use Imagine\Image\Palette\RGB; +use Imagine\Exception\InvalidArgumentException; +use Imagine\Exception\OutOfBoundsException; +use Imagine\Exception\RuntimeException; + +/** + * Image implementation using the GD library + */ +final class Image extends AbstractImage +{ + /** + * @var resource + */ + private $resource; + + /** + * @var Layers|null + */ + private $layers; + + /** + * @var PaletteInterface + */ + private $palette; + + /** + * Constructs a new Image instance + * + * @param resource $resource + * @param PaletteInterface $palette + * @param MetadataBag $metadata + */ + public function __construct($resource, PaletteInterface $palette, MetadataBag $metadata) + { + $this->metadata = $metadata; + $this->palette = $palette; + $this->resource = $resource; + } + + /** + * Makes sure the current image resource is destroyed + */ + public function __destruct() + { + if (is_resource($this->resource) && 'gd' === get_resource_type($this->resource)) { + imagedestroy($this->resource); + } + } + + /** + * Returns Gd resource + * + * @return resource + */ + public function getGdResource() + { + return $this->resource; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + final public function copy() + { + $size = $this->getSize(); + $copy = $this->createImage($size, 'copy'); + + if (false === imagecopy($copy, $this->resource, 0, 0, 0, 0, $size->getWidth(), $size->getHeight())) { + throw new RuntimeException('Image copy operation failed'); + } + + return new Image($copy, $this->palette, $this->metadata); + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + final public function crop(PointInterface $start, BoxInterface $size) + { + if (!$start->in($this->getSize())) { + throw new OutOfBoundsException('Crop coordinates must start at minimum 0, 0 position from top left corner, crop height and width must be positive integers and must not exceed the current image borders'); + } + + $width = $size->getWidth(); + $height = $size->getHeight(); + + $dest = $this->createImage($size, 'crop'); + + if (false === imagecopy($dest, $this->resource, 0, 0, $start->getX(), $start->getY(), $width, $height)) { + throw new RuntimeException('Image crop operation failed'); + } + + imagedestroy($this->resource); + + $this->resource = $dest; + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + final public function paste(ImageInterface $image, PointInterface $start) + { + if (!$image instanceof self) { + throw new InvalidArgumentException(sprintf('Gd\Image can only paste() Gd\Image instances, %s given', get_class($image))); + } + + $size = $image->getSize(); + if (!$this->getSize()->contains($size, $start)) { + throw new OutOfBoundsException('Cannot paste image of the given size at the specified position, as it moves outside of the current image\'s box'); + } + + imagealphablending($this->resource, true); + imagealphablending($image->resource, true); + + if (false === imagecopy($this->resource, $image->resource, $start->getX(), $start->getY(), 0, 0, $size->getWidth(), $size->getHeight())) { + throw new RuntimeException('Image paste operation failed'); + } + + imagealphablending($this->resource, false); + imagealphablending($image->resource, false); + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + final public function resize(BoxInterface $size, $filter = ImageInterface::FILTER_UNDEFINED) + { + if (ImageInterface::FILTER_UNDEFINED !== $filter) { + throw new InvalidArgumentException('Unsupported filter type, GD only supports ImageInterface::FILTER_UNDEFINED filter'); + } + + $width = $size->getWidth(); + $height = $size->getHeight(); + + $dest = $this->createImage($size, 'resize'); + + imagealphablending($this->resource, true); + imagealphablending($dest, true); + + if (false === imagecopyresampled($dest, $this->resource, 0, 0, 0, 0, $width, $height, imagesx($this->resource), imagesy($this->resource))) { + throw new RuntimeException('Image resize operation failed'); + } + + imagealphablending($this->resource, false); + imagealphablending($dest, false); + + imagedestroy($this->resource); + + $this->resource = $dest; + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + final public function rotate($angle, ColorInterface $background = null) + { + $color = $background ? $background : $this->palette->color('fff'); + $resource = imagerotate($this->resource, -1 * $angle, $this->getColor($color)); + + if (false === $resource) { + throw new RuntimeException('Image rotate operation failed'); + } + + imagedestroy($this->resource); + $this->resource = $resource; + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + final public function save($path = null, array $options = array()) + { + $path = null === $path ? (isset($this->metadata['filepath']) ? $this->metadata['filepath'] : $path) : $path; + + if (null === $path) { + throw new RuntimeException('You can omit save path only if image has been open from a file'); + } + + if (isset($options['format'])) { + $format = $options['format']; + } elseif ('' !== $extension = pathinfo($path, \PATHINFO_EXTENSION)) { + $format = $extension; + } else { + $originalPath = isset($this->metadata['filepath']) ? $this->metadata['filepath'] : null; + $format = pathinfo($originalPath, \PATHINFO_EXTENSION); + } + + $this->saveOrOutput($format, $options, $path); + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function show($format, array $options = array()) + { + header('Content-type: '.$this->getMimeType($format)); + + $this->saveOrOutput($format, $options); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function get($format, array $options = array()) + { + ob_start(); + $this->saveOrOutput($format, $options); + + return ob_get_clean(); + } + + /** + * {@inheritdoc} + */ + public function __toString() + { + return $this->get('png'); + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + final public function flipHorizontally() + { + $size = $this->getSize(); + $width = $size->getWidth(); + $height = $size->getHeight(); + $dest = $this->createImage($size, 'flip'); + + for ($i = 0; $i < $width; $i++) { + if (false === imagecopy($dest, $this->resource, $i, 0, ($width - 1) - $i, 0, 1, $height)) { + throw new RuntimeException('Horizontal flip operation failed'); + } + } + + imagedestroy($this->resource); + + $this->resource = $dest; + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + final public function flipVertically() + { + $size = $this->getSize(); + $width = $size->getWidth(); + $height = $size->getHeight(); + $dest = $this->createImage($size, 'flip'); + + for ($i = 0; $i < $height; $i++) { + if (false === imagecopy($dest, $this->resource, 0, $i, 0, ($height - 1) - $i, $width, 1)) { + throw new RuntimeException('Vertical flip operation failed'); + } + } + + imagedestroy($this->resource); + + $this->resource = $dest; + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + final public function strip() + { + // GD strips profiles and comment, so there's nothing to do here + return $this; + } + + /** + * {@inheritdoc} + */ + public function draw() + { + return new Drawer($this->resource); + } + + /** + * {@inheritdoc} + */ + public function effects() + { + return new Effects($this->resource); + } + + /** + * {@inheritdoc} + */ + public function getSize() + { + return new Box(imagesx($this->resource), imagesy($this->resource)); + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function applyMask(ImageInterface $mask) + { + if (!$mask instanceof self) { + throw new InvalidArgumentException('Cannot mask non-gd images'); + } + + $size = $this->getSize(); + $maskSize = $mask->getSize(); + + if ($size != $maskSize) { + throw new InvalidArgumentException(sprintf('The given mask doesn\'t match current image\'s size, Current mask\'s dimensions are %s, while image\'s dimensions are %s', $maskSize, $size)); + } + + for ($x = 0, $width = $size->getWidth(); $x < $width; $x++) { + for ($y = 0, $height = $size->getHeight(); $y < $height; $y++) { + $position = new Point($x, $y); + $color = $this->getColorAt($position); + $maskColor = $mask->getColorAt($position); + $round = (int) round(max($color->getAlpha(), (100 - $color->getAlpha()) * $maskColor->getRed() / 255)); + + if (false === imagesetpixel($this->resource, $x, $y, $this->getColor($color->dissolve($round - $color->getAlpha())))) { + throw new RuntimeException('Apply mask operation failed'); + } + } + } + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function fill(FillInterface $fill) + { + $size = $this->getSize(); + + for ($x = 0, $width = $size->getWidth(); $x < $width; $x++) { + for ($y = 0, $height = $size->getHeight(); $y < $height; $y++) { + if (false === imagesetpixel($this->resource, $x, $y, $this->getColor($fill->getColor(new Point($x, $y))))) { + throw new RuntimeException('Fill operation failed'); + } + } + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function mask() + { + $mask = $this->copy(); + + if (false === imagefilter($mask->resource, IMG_FILTER_GRAYSCALE)) { + throw new RuntimeException('Mask operation failed'); + } + + return $mask; + } + + /** + * {@inheritdoc} + */ + public function histogram() + { + $size = $this->getSize(); + $colors = array(); + + for ($x = 0, $width = $size->getWidth(); $x < $width; $x++) { + for ($y = 0, $height = $size->getHeight(); $y < $height; $y++) { + $colors[] = $this->getColorAt(new Point($x, $y)); + } + } + + return array_unique($colors); + } + + /** + * {@inheritdoc} + */ + public function getColorAt(PointInterface $point) + { + if (!$point->in($this->getSize())) { + throw new RuntimeException(sprintf('Error getting color at point [%s,%s]. The point must be inside the image of size [%s,%s]', $point->getX(), $point->getY(), $this->getSize()->getWidth(), $this->getSize()->getHeight())); + } + + $index = imagecolorat($this->resource, $point->getX(), $point->getY()); + $info = imagecolorsforindex($this->resource, $index); + + return $this->palette->color(array($info['red'], $info['green'], $info['blue']), max(min(100 - (int) round($info['alpha'] / 127 * 100), 100), 0)); + } + + /** + * {@inheritdoc} + */ + public function layers() + { + if (null === $this->layers) { + $this->layers = new Layers($this, $this->palette, $this->resource); + } + + return $this->layers; + } + + /** + * {@inheritdoc} + **/ + public function interlace($scheme) + { + static $supportedInterlaceSchemes = array( + ImageInterface::INTERLACE_NONE => 0, + ImageInterface::INTERLACE_LINE => 1, + ImageInterface::INTERLACE_PLANE => 1, + ImageInterface::INTERLACE_PARTITION => 1, + ); + + if (!array_key_exists($scheme, $supportedInterlaceSchemes)) { + throw new InvalidArgumentException('Unsupported interlace type'); + } + + imageinterlace($this->resource, $supportedInterlaceSchemes[$scheme]); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function palette() + { + return $this->palette; + } + + /** + * {@inheritdoc} + */ + public function profile(ProfileInterface $profile) + { + throw new RuntimeException('GD driver does not support color profiles'); + } + + /** + * {@inheritdoc} + */ + public function usePalette(PaletteInterface $palette) + { + if (!$palette instanceof RGB) { + throw new RuntimeException('GD driver only supports RGB palette'); + } + + $this->palette = $palette; + + return $this; + } + + /** + * Internal + * + * Performs save or show operation using one of GD's image... functions + * + * @param string $format + * @param array $options + * @param string $filename + * + * @throws InvalidArgumentException + * @throws RuntimeException + */ + private function saveOrOutput($format, array $options, $filename = null) + { + $format = $this->normalizeFormat($format); + + if (!$this->supported($format)) { + throw new InvalidArgumentException(sprintf('Saving image in "%s" format is not supported, please use one of the following extensions: "%s"', $format, implode('", "', $this->supported()))); + } + + $save = 'image'.$format; + $args = array(&$this->resource, $filename); + + // Preserve BC until version 1.0 + if (isset($options['quality']) && !isset($options['png_compression_level'])) { + $options['png_compression_level'] = round((100 - $options['quality']) * 9 / 100); + } + if (isset($options['filters']) && !isset($options['png_compression_filter'])) { + $options['png_compression_filter'] = $options['filters']; + } + + $options = $this->updateSaveOptions($options); + + if ($format === 'jpeg' && isset($options['jpeg_quality'])) { + $args[] = $options['jpeg_quality']; + } + + if ($format === 'png') { + if (isset($options['png_compression_level'])) { + if ($options['png_compression_level'] < 0 || $options['png_compression_level'] > 9) { + throw new InvalidArgumentException('png_compression_level option should be an integer from 0 to 9'); + } + $args[] = $options['png_compression_level']; + } else { + $args[] = -1; // use default level + } + + if (isset($options['png_compression_filter'])) { + if (~PNG_ALL_FILTERS & $options['png_compression_filter']) { + throw new InvalidArgumentException('png_compression_filter option should be a combination of the PNG_FILTER_XXX constants'); + } + $args[] = $options['png_compression_filter']; + } + } + + if (($format === 'wbmp' || $format === 'xbm') && isset($options['foreground'])) { + $args[] = $options['foreground']; + } + + $this->setExceptionHandler(); + + if (false === call_user_func_array($save, $args)) { + throw new RuntimeException('Save operation failed'); + } + + $this->resetExceptionHandler(); + } + + /** + * Internal + * + * Generates a GD image + * + * @param BoxInterface $size + * @param string the operation initiating the creation + * + * @return resource + * + * @throws RuntimeException + * + */ + private function createImage(BoxInterface $size, $operation) + { + $resource = imagecreatetruecolor($size->getWidth(), $size->getHeight()); + + if (false === $resource) { + throw new RuntimeException('Image '.$operation.' failed'); + } + + if (false === imagealphablending($resource, false) || false === imagesavealpha($resource, true)) { + throw new RuntimeException('Image '.$operation.' failed'); + } + + if (function_exists('imageantialias')) { + imageantialias($resource, true); + } + + $transparent = imagecolorallocatealpha($resource, 255, 255, 255, 127); + imagefill($resource, 0, 0, $transparent); + imagecolortransparent($resource, $transparent); + + return $resource; + } + + /** + * Internal + * + * Generates a GD color from Color instance + * + * @param ColorInterface $color + * + * @return integer A color identifier + * + * @throws RuntimeException + * @throws InvalidArgumentException + */ + private function getColor(ColorInterface $color) + { + if (!$color instanceof RGBColor) { + throw new InvalidArgumentException('GD driver only supports RGB colors'); + } + + $index = imagecolorallocatealpha($this->resource, $color->getRed(), $color->getGreen(), $color->getBlue(), round(127 * (100 - $color->getAlpha()) / 100)); + + if (false === $index) { + throw new RuntimeException(sprintf('Unable to allocate color "RGB(%s, %s, %s)" with transparency of %d percent', $color->getRed(), $color->getGreen(), $color->getBlue(), $color->getAlpha())); + } + + return $index; + } + + /** + * Internal + * + * Normalizes a given format name + * + * @param string $format + * + * @return string + */ + private function normalizeFormat($format) + { + $format = strtolower($format); + + if ('jpg' === $format || 'pjpeg' === $format) { + $format = 'jpeg'; + } + + return $format; + } + + /** + * Internal + * + * Checks whether a given format is supported by GD library + * + * @param string $format + * + * @return Boolean + */ + private function supported($format = null) + { + $formats = array('gif', 'jpeg', 'png', 'wbmp', 'xbm'); + + if (null === $format) { + return $formats; + } + + return in_array($format, $formats); + } + + private function setExceptionHandler() + { + set_error_handler(function ($errno, $errstr, $errfile, $errline) { + if (0 === error_reporting()) { + return; + } + + throw new RuntimeException($errstr, $errno, new \ErrorException($errstr, 0, $errno, $errfile, $errline)); + }, E_WARNING | E_NOTICE); + } + + private function resetExceptionHandler() + { + restore_error_handler(); + } + + /** + * Internal + * + * Get the mime type based on format. + * + * @param string $format + * + * @return string mime-type + * + * @throws RuntimeException + */ + private function getMimeType($format) + { + $format = $this->normalizeFormat($format); + + if (!$this->supported($format)) { + throw new RuntimeException('Invalid format'); + } + + static $mimeTypes = array( + 'jpeg' => 'image/jpeg', + 'gif' => 'image/gif', + 'png' => 'image/png', + 'wbmp' => 'image/vnd.wap.wbmp', + 'xbm' => 'image/xbm', + ); + + return $mimeTypes[$format]; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Imagine.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Imagine.php new file mode 100755 index 00000000..f9e95087 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Imagine.php @@ -0,0 +1,195 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Gd; + +use Imagine\Image\AbstractImagine; +use Imagine\Image\Metadata\MetadataBag; +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Image\Palette\RGB; +use Imagine\Image\Palette\PaletteInterface; +use Imagine\Image\BoxInterface; +use Imagine\Image\Palette\Color\RGB as RGBColor; +use Imagine\Exception\InvalidArgumentException; +use Imagine\Exception\RuntimeException; + +/** + * Imagine implementation using the GD library + */ +final class Imagine extends AbstractImagine +{ + /** + * @var array + */ + private $info; + + /** + * @throws RuntimeException + */ + public function __construct() + { + $this->loadGdInfo(); + $this->requireGdVersion('2.0.1'); + } + + /** + * {@inheritdoc} + */ + public function create(BoxInterface $size, ColorInterface $color = null) + { + $width = $size->getWidth(); + $height = $size->getHeight(); + + $resource = imagecreatetruecolor($width, $height); + + if (false === $resource) { + throw new RuntimeException('Create operation failed'); + } + + $palette = null !== $color ? $color->getPalette() : new RGB(); + $color = $color ? $color : $palette->color('fff'); + + if (!$color instanceof RGBColor) { + throw new InvalidArgumentException('GD driver only supports RGB colors'); + } + + $index = imagecolorallocatealpha($resource, $color->getRed(), $color->getGreen(), $color->getBlue(), round(127 * (100 - $color->getAlpha()) / 100)); + + if (false === $index) { + throw new RuntimeException('Unable to allocate color'); + } + + if (false === imagefill($resource, 0, 0, $index)) { + throw new RuntimeException('Could not set background color fill'); + } + + if ($color->getAlpha() >= 95) { + imagecolortransparent($resource, $index); + } + + return $this->wrap($resource, $palette, new MetadataBag()); + } + + /** + * {@inheritdoc} + */ + public function open($path) + { + $path = $this->checkPath($path); + $data = @file_get_contents($path); + + if (false === $data) { + throw new RuntimeException(sprintf('Failed to open file %s', $path)); + } + + $resource = @imagecreatefromstring($data); + + if (!is_resource($resource)) { + throw new RuntimeException(sprintf('Unable to open image %s', $path)); + } + + return $this->wrap($resource, new RGB(), $this->getMetadataReader()->readFile($path)); + } + + /** + * {@inheritdoc} + */ + public function load($string) + { + return $this->doLoad($string, $this->getMetadataReader()->readData($string)); + } + + /** + * {@inheritdoc} + */ + public function read($resource) + { + if (!is_resource($resource)) { + throw new InvalidArgumentException('Variable does not contain a stream resource'); + } + + $content = stream_get_contents($resource); + + if (false === $content) { + throw new InvalidArgumentException('Cannot read resource content'); + } + + return $this->doLoad($content, $this->getMetadataReader()->readStream($resource)); + } + + /** + * {@inheritdoc} + */ + public function font($file, $size, ColorInterface $color) + { + if (!$this->info['FreeType Support']) { + throw new RuntimeException('GD is not compiled with FreeType support'); + } + + return new Font($file, $size, $color); + } + + private function wrap($resource, PaletteInterface $palette, MetadataBag $metadata) + { + if (!imageistruecolor($resource)) { + list($width, $height) = array(imagesx($resource), imagesy($resource)); + + // create transparent truecolor canvas + $truecolor = imagecreatetruecolor($width, $height); + $transparent = imagecolorallocatealpha($truecolor, 255, 255, 255, 127); + + imagefill($truecolor, 0, 0, $transparent); + imagecolortransparent($truecolor, $transparent); + + imagecopymerge($truecolor, $resource, 0, 0, 0, 0, $width, $height, 100); + + imagedestroy($resource); + $resource = $truecolor; + } + + if (false === imagealphablending($resource, false) || false === imagesavealpha($resource, true)) { + throw new RuntimeException('Could not set alphablending, savealpha and antialias values'); + } + + if (function_exists('imageantialias')) { + imageantialias($resource, true); + } + + return new Image($resource, $palette, $metadata); + } + + private function loadGdInfo() + { + if (!function_exists('gd_info')) { + throw new RuntimeException('Gd not installed'); + } + + $this->info = gd_info(); + } + + private function requireGdVersion($version) + { + if (version_compare(GD_VERSION, $version, '<')) { + throw new RuntimeException(sprintf('GD2 version %s or higher is required', $version)); + } + } + + private function doLoad($string, MetadataBag $metadata) + { + $resource = @imagecreatefromstring($string); + + if (!is_resource($resource)) { + throw new RuntimeException('An image could not be created from the given input'); + } + + return $this->wrap($resource, new RGB(), $metadata); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Layers.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Layers.php new file mode 100755 index 00000000..93c7a269 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Layers.php @@ -0,0 +1,144 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Gd; + +use Imagine\Image\AbstractLayers; +use Imagine\Exception\RuntimeException; +use Imagine\Image\Metadata\MetadataBag; +use Imagine\Image\Palette\PaletteInterface; +use Imagine\Exception\NotSupportedException; + +class Layers extends AbstractLayers +{ + private $image; + private $offset; + private $resource; + private $palette; + + public function __construct(Image $image, PaletteInterface $palette, $resource) + { + if (!is_resource($resource)) { + throw new RuntimeException('Invalid Gd resource provided'); + } + + $this->image = $image; + $this->resource = $resource; + $this->offset = 0; + $this->palette = $palette; + } + + /** + * {@inheritdoc} + */ + public function merge() + { + } + + /** + * {@inheritdoc} + */ + public function coalesce() + { + } + + /** + * {@inheritdoc} + */ + public function animate($format, $delay, $loops) + { + return $this; + } + + /** + * {@inheritdoc} + */ + public function current() + { + return new Image($this->resource, $this->palette, new MetadataBag()); + } + + /** + * {@inheritdoc} + */ + public function key() + { + return $this->offset; + } + + /** + * {@inheritdoc} + */ + public function next() + { + ++$this->offset; + } + + /** + * {@inheritdoc} + */ + public function rewind() + { + $this->offset = 0; + } + + /** + * {@inheritdoc} + */ + public function valid() + { + return $this->offset < 1; + } + + /** + * {@inheritdoc} + */ + public function count() + { + return 1; + } + + /** + * {@inheritdoc} + */ + public function offsetExists($offset) + { + return 0 === $offset; + } + + /** + * {@inheritdoc} + */ + public function offsetGet($offset) + { + if (0 === $offset) { + return new Image($this->resource, $this->palette, new MetadataBag()); + } + + throw new RuntimeException('GD only supports one layer at offset 0'); + } + + /** + * {@inheritdoc} + */ + public function offsetSet($offset, $value) + { + throw new NotSupportedException('GD does not support layer set'); + } + + /** + * {@inheritdoc} + */ + public function offsetUnset($offset) + { + throw new NotSupportedException('GD does not support layer unset'); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Drawer.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Drawer.php new file mode 100755 index 00000000..de6cc904 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Drawer.php @@ -0,0 +1,356 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Gmagick; + +use Imagine\Draw\DrawerInterface; +use Imagine\Exception\InvalidArgumentException; +use Imagine\Exception\NotSupportedException; +use Imagine\Exception\RuntimeException; +use Imagine\Image\AbstractFont; +use Imagine\Image\BoxInterface; +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Image\Point; +use Imagine\Image\PointInterface; + +/** + * Drawer implementation using the Gmagick PHP extension + */ +final class Drawer implements DrawerInterface +{ + /** + * @var \Gmagick + */ + private $gmagick; + + /** + * @param \Gmagick $gmagick + */ + public function __construct(\Gmagick $gmagick) + { + $this->gmagick = $gmagick; + } + + /** + * {@inheritdoc} + */ + public function arc(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $thickness = 1) + { + $x = $center->getX(); + $y = $center->getY(); + $width = $size->getWidth(); + $height = $size->getHeight(); + + try { + $pixel = $this->getColor($color); + $arc = new \GmagickDraw(); + + $arc->setstrokecolor($pixel); + $arc->setstrokewidth(max(1, (int) $thickness)); + $arc->setfillcolor('transparent'); + $arc->arc( + $x - $width / 2, + $y - $height / 2, + $x + $width / 2, + $y + $height / 2, + $start, + $end + ); + + $this->gmagick->drawImage($arc); + + $pixel = null; + + $arc = null; + } catch (\GmagickException $e) { + throw new RuntimeException('Draw arc operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function chord(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1) + { + $x = $center->getX(); + $y = $center->getY(); + $width = $size->getWidth(); + $height = $size->getHeight(); + + try { + $pixel = $this->getColor($color); + $chord = new \GmagickDraw(); + + $chord->setstrokecolor($pixel); + $chord->setstrokewidth(max(1, (int) $thickness)); + + if ($fill) { + $chord->setfillcolor($pixel); + } else { + $x1 = round($x + $width / 2 * cos(deg2rad($start))); + $y1 = round($y + $height / 2 * sin(deg2rad($start))); + $x2 = round($x + $width / 2 * cos(deg2rad($end))); + $y2 = round($y + $height / 2 * sin(deg2rad($end))); + + $this->line(new Point($x1, $y1), new Point($x2, $y2), $color); + + $chord->setfillcolor('transparent'); + } + + $chord->arc($x - $width / 2, $y - $height / 2, $x + $width / 2, $y + $height / 2, $start, $end); + + $this->gmagick->drawImage($chord); + + $pixel = null; + + $chord = null; + } catch (\GmagickException $e) { + throw new RuntimeException('Draw chord operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function ellipse(PointInterface $center, BoxInterface $size, ColorInterface $color, $fill = false, $thickness = 1) + { + $width = $size->getWidth(); + $height = $size->getHeight(); + + try { + $pixel = $this->getColor($color); + $ellipse = new \GmagickDraw(); + + $ellipse->setstrokecolor($pixel); + $ellipse->setstrokewidth(max(1, (int) $thickness)); + + if ($fill) { + $ellipse->setfillcolor($pixel); + } else { + $ellipse->setfillcolor('transparent'); + } + + $ellipse->ellipse( + $center->getX(), + $center->getY(), + $width / 2, + $height / 2, + 0, 360 + ); + + $this->gmagick->drawImage($ellipse); + + $pixel = null; + + $ellipse = null; + } catch (\GmagickException $e) { + throw new RuntimeException('Draw ellipse operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function line(PointInterface $start, PointInterface $end, ColorInterface $color, $thickness = 1) + { + try { + $pixel = $this->getColor($color); + $line = new \GmagickDraw(); + + $line->setstrokecolor($pixel); + $line->setstrokewidth(max(1, (int) $thickness)); + $line->setfillcolor($pixel); + $line->line( + $start->getX(), + $start->getY(), + $end->getX(), + $end->getY() + ); + + $this->gmagick->drawImage($line); + + $pixel = null; + + $line = null; + } catch (\GmagickException $e) { + throw new RuntimeException('Draw line operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function pieSlice(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1) + { + $width = $size->getWidth(); + $height = $size->getHeight(); + + $x1 = round($center->getX() + $width / 2 * cos(deg2rad($start))); + $y1 = round($center->getY() + $height / 2 * sin(deg2rad($start))); + $x2 = round($center->getX() + $width / 2 * cos(deg2rad($end))); + $y2 = round($center->getY() + $height / 2 * sin(deg2rad($end))); + + if ($fill) { + $this->chord($center, $size, $start, $end, $color, true, $thickness); + $this->polygon( + array( + $center, + new Point($x1, $y1), + new Point($x2, $y2), + ), + $color, + true, + $thickness + ); + } else { + $this->arc($center, $size, $start, $end, $color, $thickness); + $this->line($center, new Point($x1, $y1), $color, $thickness); + $this->line($center, new Point($x2, $y2), $color, $thickness); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function dot(PointInterface $position, ColorInterface $color) + { + $x = $position->getX(); + $y = $position->getY(); + + try { + $pixel = $this->getColor($color); + $point = new \GmagickDraw(); + + $point->setfillcolor($pixel); + $point->point($x, $y); + + $this->gmagick->drawimage($point); + + $pixel = null; + $point = null; + } catch (\GmagickException $e) { + throw new RuntimeException('Draw point operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function polygon(array $coordinates, ColorInterface $color, $fill = false, $thickness = 1) + { + if (count($coordinates) < 3) { + throw new InvalidArgumentException(sprintf('Polygon must consist of at least 3 coordinates, %d given', count($coordinates))); + } + + $points = array_map(function (PointInterface $p) { + return array('x' => $p->getX(), 'y' => $p->getY()); + }, $coordinates); + + try { + $pixel = $this->getColor($color); + $polygon = new \GmagickDraw(); + + $polygon->setstrokecolor($pixel); + $polygon->setstrokewidth(max(1, (int) $thickness)); + + if ($fill) { + $polygon->setfillcolor($pixel); + } else { + $polygon->setfillcolor('transparent'); + } + + $polygon->polygon($points); + + $this->gmagick->drawImage($polygon); + + unset($pixel, $polygon); + } catch (\GmagickException $e) { + throw new RuntimeException('Draw polygon operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function text($string, AbstractFont $font, PointInterface $position, $angle = 0, $width = null) + { + try { + $pixel = $this->getColor($font->getColor()); + $text = new \GmagickDraw(); + + $text->setfont($font->getFile()); + /** + * @see http://www.php.net/manual/en/imagick.queryfontmetrics.php#101027 + * + * ensure font resolution is the same as GD's hard-coded 96 + */ + $text->setfontsize((int) ($font->getSize() * (96 / 72))); + $text->setfillcolor($pixel); + + $info = $this->gmagick->queryfontmetrics($text, $string); + $rad = deg2rad($angle); + $cos = cos($rad); + $sin = sin($rad); + + $x1 = round(0 * $cos - 0 * $sin); + $x2 = round($info['textWidth'] * $cos - $info['textHeight'] * $sin); + $y1 = round(0 * $sin + 0 * $cos); + $y2 = round($info['textWidth'] * $sin + $info['textHeight'] * $cos); + + $xdiff = 0 - min($x1, $x2); + $ydiff = 0 - min($y1, $y2); + + if ($width !== null) { + throw new NotSupportedException('Gmagick doesn\'t support queryfontmetrics function for multiline text', 1); + } + + $this->gmagick->annotateimage($text, $position->getX() + $x1 + $xdiff, $position->getY() + $y2 + $ydiff, $angle, $string); + + unset($pixel, $text); + } catch (\GmagickException $e) { + throw new RuntimeException('Draw text operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * Gets specifically formatted color string from Color instance + * + * @param ColorInterface $color + * + * @return \GmagickPixel + * + * @throws InvalidArgumentException In case a non-opaque color is passed + */ + private function getColor(ColorInterface $color) + { + if (!$color->isOpaque()) { + throw new InvalidArgumentException('Gmagick doesn\'t support transparency'); + } + + return new \GmagickPixel((string) $color); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Effects.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Effects.php new file mode 100755 index 00000000..3f9c5cd0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Effects.php @@ -0,0 +1,106 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Gmagick; + +use Imagine\Effects\EffectsInterface; +use Imagine\Exception\RuntimeException; +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Exception\NotSupportedException; + +/** + * Effects implementation using the Gmagick PHP extension + */ +class Effects implements EffectsInterface +{ + private $gmagick; + + public function __construct(\Gmagick $gmagick) + { + $this->gmagick = $gmagick; + } + + /** + * {@inheritdoc} + */ + public function gamma($correction) + { + try { + $this->gmagick->gammaimage($correction); + } catch (\GmagickException $e) { + throw new RuntimeException('Failed to apply gamma correction to the image'); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function negative() + { + if (!method_exists($this->gmagick, 'negateimage')) { + throw new NotSupportedException('Gmagick version 1.1.0 RC3 is required for negative effect'); + } + + try { + $this->gmagick->negateimage(false, \Gmagick::CHANNEL_ALL); + } catch (\GmagickException $e) { + throw new RuntimeException('Failed to negate the image'); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function grayscale() + { + try { + $this->gmagick->setImageType(2); + } catch (\GmagickException $e) { + throw new RuntimeException('Failed to grayscale the image'); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function colorize(ColorInterface $color) + { + throw new NotSupportedException('Gmagick does not support colorize'); + } + + /** + * {@inheritdoc} + */ + public function sharpen() + { + throw new NotSupportedException('Gmagick does not support sharpen yet'); + } + + /** + * {@inheritdoc} + */ + public function blur($sigma = 1) + { + try { + $this->gmagick->blurImage(0, $sigma); + } catch (\GmagickException $e) { + throw new RuntimeException('Failed to blur the image', $e->getCode(), $e); + } + + return $this; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Font.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Font.php new file mode 100755 index 00000000..ad67c564 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Font.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Gmagick; + +use Imagine\Image\AbstractFont; +use Imagine\Image\Box; +use Imagine\Image\Palette\Color\ColorInterface; + +/** + * Font implementation using the Gmagick PHP extension + */ +final class Font extends AbstractFont +{ + /** + * @var \Gmagick + */ + private $gmagick; + + /** + * @param \Gmagick $gmagick + * @param string $file + * @param integer $size + * @param ColorInterface $color + */ + public function __construct(\Gmagick $gmagick, $file, $size, ColorInterface $color) + { + $this->gmagick = $gmagick; + + parent::__construct($file, $size, $color); + } + + /** + * {@inheritdoc} + */ + public function box($string, $angle = 0) + { + $text = new \GmagickDraw(); + + $text->setfont($this->file); + /** + * @see http://www.php.net/manual/en/imagick.queryfontmetrics.php#101027 + * + * ensure font resolution is the same as GD's hard-coded 96 + */ + $text->setfontsize((int) ($this->size * (96 / 72))); + $text->setfontstyle(\Gmagick::STYLE_OBLIQUE); + + $info = $this->gmagick->queryfontmetrics($text, $string); + + $box = new Box($info['textWidth'], $info['textHeight']); + + return $box; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Image.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Image.php new file mode 100755 index 00000000..61ef858c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Image.php @@ -0,0 +1,786 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Gmagick; + +use Imagine\Exception\OutOfBoundsException; +use Imagine\Exception\InvalidArgumentException; +use Imagine\Exception\RuntimeException; +use Imagine\Image\AbstractImage; +use Imagine\Image\Metadata\MetadataBag; +use Imagine\Image\Palette\PaletteInterface; +use Imagine\Image\ImageInterface; +use Imagine\Image\Box; +use Imagine\Image\BoxInterface; +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Image\Fill\FillInterface; +use Imagine\Image\Point; +use Imagine\Image\PointInterface; +use Imagine\Image\ProfileInterface; + +/** + * Image implementation using the Gmagick PHP extension + */ +final class Image extends AbstractImage +{ + /** + * @var \Gmagick + */ + private $gmagick; + /** + * @var Layers + */ + private $layers; + + /** + * @var PaletteInterface + */ + private $palette; + + private static $colorspaceMapping = array( + PaletteInterface::PALETTE_CMYK => \Gmagick::COLORSPACE_CMYK, + PaletteInterface::PALETTE_RGB => \Gmagick::COLORSPACE_RGB, + ); + + /** + * Constructs a new Image instance + * + * @param \Gmagick $gmagick + * @param PaletteInterface $palette + * @param MetadataBag $metadata + */ + public function __construct(\Gmagick $gmagick, PaletteInterface $palette, MetadataBag $metadata) + { + $this->metadata = $metadata; + $this->gmagick = $gmagick; + $this->setColorspace($palette); + $this->layers = new Layers($this, $this->palette, $this->gmagick); + } + + /** + * Destroys allocated gmagick resources + */ + public function __destruct() + { + if ($this->gmagick instanceof \Gmagick) { + $this->gmagick->clear(); + $this->gmagick->destroy(); + } + } + + /** + * Returns gmagick instance + * + * @return Gmagick + */ + public function getGmagick() + { + return $this->gmagick; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function copy() + { + return new self(clone $this->gmagick, $this->palette, clone $this->metadata); + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function crop(PointInterface $start, BoxInterface $size) + { + if (!$start->in($this->getSize())) { + throw new OutOfBoundsException('Crop coordinates must start at minimum 0, 0 position from top left corner, crop height and width must be positive integers and must not exceed the current image borders'); + } + + try { + $this->gmagick->cropimage($size->getWidth(), $size->getHeight(), $start->getX(), $start->getY()); + } catch (\GmagickException $e) { + throw new RuntimeException('Crop operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function flipHorizontally() + { + try { + $this->gmagick->flopimage(); + } catch (\GmagickException $e) { + throw new RuntimeException('Horizontal flip operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function flipVertically() + { + try { + $this->gmagick->flipimage(); + } catch (\GmagickException $e) { + throw new RuntimeException('Vertical flip operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function strip() + { + try { + try { + $this->profile($this->palette->profile()); + } catch (\Exception $e) { + // here we discard setting the profile as the previous incorporated profile + // is corrupted, let's now strip the image + } + $this->gmagick->stripimage(); + } catch (\GmagickException $e) { + throw new RuntimeException('Strip operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function paste(ImageInterface $image, PointInterface $start) + { + if (!$image instanceof self) { + throw new InvalidArgumentException(sprintf('Gmagick\Image can only paste() Gmagick\Image instances, %s given', get_class($image))); + } + + if (!$this->getSize()->contains($image->getSize(), $start)) { + throw new OutOfBoundsException('Cannot paste image of the given size at the specified position, as it moves outside of the current image\'s box'); + } + + try { + $this->gmagick->compositeimage($image->gmagick, \Gmagick::COMPOSITE_DEFAULT, $start->getX(), $start->getY()); + } catch (\GmagickException $e) { + throw new RuntimeException('Paste operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function resize(BoxInterface $size, $filter = ImageInterface::FILTER_UNDEFINED) + { + static $supportedFilters = array( + ImageInterface::FILTER_UNDEFINED => \Gmagick::FILTER_UNDEFINED, + ImageInterface::FILTER_BESSEL => \Gmagick::FILTER_BESSEL, + ImageInterface::FILTER_BLACKMAN => \Gmagick::FILTER_BLACKMAN, + ImageInterface::FILTER_BOX => \Gmagick::FILTER_BOX, + ImageInterface::FILTER_CATROM => \Gmagick::FILTER_CATROM, + ImageInterface::FILTER_CUBIC => \Gmagick::FILTER_CUBIC, + ImageInterface::FILTER_GAUSSIAN => \Gmagick::FILTER_GAUSSIAN, + ImageInterface::FILTER_HANNING => \Gmagick::FILTER_HANNING, + ImageInterface::FILTER_HAMMING => \Gmagick::FILTER_HAMMING, + ImageInterface::FILTER_HERMITE => \Gmagick::FILTER_HERMITE, + ImageInterface::FILTER_LANCZOS => \Gmagick::FILTER_LANCZOS, + ImageInterface::FILTER_MITCHELL => \Gmagick::FILTER_MITCHELL, + ImageInterface::FILTER_POINT => \Gmagick::FILTER_POINT, + ImageInterface::FILTER_QUADRATIC => \Gmagick::FILTER_QUADRATIC, + ImageInterface::FILTER_SINC => \Gmagick::FILTER_SINC, + ImageInterface::FILTER_TRIANGLE => \Gmagick::FILTER_TRIANGLE + ); + + if (!array_key_exists($filter, $supportedFilters)) { + throw new InvalidArgumentException('Unsupported filter type'); + } + + try { + $this->gmagick->resizeimage($size->getWidth(), $size->getHeight(), $supportedFilters[$filter], 1); + } catch (\GmagickException $e) { + throw new RuntimeException('Resize operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function rotate($angle, ColorInterface $background = null) + { + try { + $background = $background ?: $this->palette->color('fff'); + $pixel = $this->getColor($background); + + $this->gmagick->rotateimage($pixel, $angle); + + unset($pixel); + } catch (\GmagickException $e) { + throw new RuntimeException('Rotate operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * Internal + * + * Applies options before save or output + * + * @param \Gmagick $image + * @param array $options + * @param string $path + * + * @throws InvalidArgumentException + */ + private function applyImageOptions(\Gmagick $image, array $options, $path) + { + if (isset($options['format'])) { + $format = $options['format']; + } elseif ('' !== $extension = pathinfo($path, \PATHINFO_EXTENSION)) { + $format = $extension; + } else { + $format = pathinfo($image->getImageFilename(), \PATHINFO_EXTENSION); + } + + $format = strtolower($format); + + $options = $this->updateSaveOptions($options); + + if (isset($options['jpeg_quality']) && in_array($format, array('jpeg', 'jpg', 'pjpeg'))) { + $image->setCompressionQuality($options['jpeg_quality']); + } + + if ((isset($options['png_compression_level']) || isset($options['png_compression_filter'])) && $format === 'png') { + // first digit: compression level (default: 7) + if (isset($options['png_compression_level'])) { + if ($options['png_compression_level'] < 0 || $options['png_compression_level'] > 9) { + throw new InvalidArgumentException('png_compression_level option should be an integer from 0 to 9'); + } + $compression = $options['png_compression_level'] * 10; + } else { + $compression = 70; + } + + // second digit: compression filter (default: 5) + if (isset($options['png_compression_filter'])) { + if ($options['png_compression_filter'] < 0 || $options['png_compression_filter'] > 9) { + throw new InvalidArgumentException('png_compression_filter option should be an integer from 0 to 9'); + } + $compression += $options['png_compression_filter']; + } else { + $compression += 5; + } + + $image->setCompressionQuality($compression); + } + + if (isset($options['resolution-units']) && isset($options['resolution-x']) && isset($options['resolution-y'])) { + if ($options['resolution-units'] == ImageInterface::RESOLUTION_PIXELSPERCENTIMETER) { + $image->setimageunits(\Gmagick::RESOLUTION_PIXELSPERCENTIMETER); + } elseif ($options['resolution-units'] == ImageInterface::RESOLUTION_PIXELSPERINCH) { + $image->setimageunits(\Gmagick::RESOLUTION_PIXELSPERINCH); + } else { + throw new InvalidArgumentException('Unsupported image unit format'); + } + + $image->setimageresolution($options['resolution-x'], $options['resolution-y']); + } + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function save($path = null, array $options = array()) + { + $path = null === $path ? $this->gmagick->getImageFilename() : $path; + + if ('' === trim($path)) { + throw new RuntimeException('You can omit save path only if image has been open from a file'); + } + + try { + $this->prepareOutput($options, $path); + $allFrames = !isset($options['animated']) || false === $options['animated']; + $this->gmagick->writeimage($path, $allFrames); + } catch (\GmagickException $e) { + throw new RuntimeException('Save operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function show($format, array $options = array()) + { + header('Content-type: '.$this->getMimeType($format)); + echo $this->get($format, $options); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function get($format, array $options = array()) + { + try { + $options['format'] = $format; + $this->prepareOutput($options); + } catch (\GmagickException $e) { + throw new RuntimeException('Get operation failed', $e->getCode(), $e); + } + + return $this->gmagick->getimagesblob(); + } + + /** + * @param array $options + * @param string $path + */ + private function prepareOutput(array $options, $path = null) + { + if (isset($options['format'])) { + $this->gmagick->setimageformat($options['format']); + } + + if (isset($options['animated']) && true === $options['animated']) { + $format = isset($options['format']) ? $options['format'] : 'gif'; + $delay = isset($options['animated.delay']) ? $options['animated.delay'] : null; + $loops = isset($options['animated.loops']) ? $options['animated.loops'] : 0; + + $options['flatten'] = false; + + $this->layers->animate($format, $delay, $loops); + } else { + $this->layers->merge(); + } + $this->applyImageOptions($this->gmagick, $options, $path); + + // flatten only if image has multiple layers + if ((!isset($options['flatten']) || $options['flatten'] === true) && count($this->layers) > 1) { + $this->flatten(); + } + } + + /** + * {@inheritdoc} + */ + public function __toString() + { + return $this->get('png'); + } + + /** + * {@inheritdoc} + */ + public function draw() + { + return new Drawer($this->gmagick); + } + + /** + * {@inheritdoc} + */ + public function effects() + { + return new Effects($this->gmagick); + } + + /** + * {@inheritdoc} + */ + public function getSize() + { + try { + $i = $this->gmagick->getimageindex(); + $this->gmagick->setimageindex(0); //rewind + $width = $this->gmagick->getimagewidth(); + $height = $this->gmagick->getimageheight(); + $this->gmagick->setimageindex($i); + } catch (\GmagickException $e) { + throw new RuntimeException('Get size operation failed', $e->getCode(), $e); + } + + return new Box($width, $height); + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function applyMask(ImageInterface $mask) + { + if (!$mask instanceof self) { + throw new InvalidArgumentException('Can only apply instances of Imagine\Gmagick\Image as masks'); + } + + $size = $this->getSize(); + $maskSize = $mask->getSize(); + + if ($size != $maskSize) { + throw new InvalidArgumentException(sprintf('The given mask doesn\'t match current image\'s size, current mask\'s dimensions are %s, while image\'s dimensions are %s', $maskSize, $size)); + } + + try { + $mask = $mask->copy(); + $this->gmagick->compositeimage($mask->gmagick, \Gmagick::COMPOSITE_DEFAULT, 0, 0); + } catch (\GmagickException $e) { + throw new RuntimeException('Apply mask operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function mask() + { + $mask = $this->copy(); + + try { + $mask->gmagick->modulateimage(100, 0, 100); + } catch (\GmagickException $e) { + throw new RuntimeException('Mask operation failed', $e->getCode(), $e); + } + + return $mask; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function fill(FillInterface $fill) + { + try { + $draw = new \GmagickDraw(); + $size = $this->getSize(); + + $w = $size->getWidth(); + $h = $size->getHeight(); + + for ($x = 0; $x <= $w; $x++) { + for ($y = 0; $y <= $h; $y++) { + $pixel = $this->getColor($fill->getColor(new Point($x, $y))); + + $draw->setfillcolor($pixel); + $draw->point($x, $y); + + $pixel = null; + } + } + + $this->gmagick->drawimage($draw); + + $draw = null; + } catch (\GmagickException $e) { + throw new RuntimeException('Fill operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function histogram() + { + try { + $pixels = $this->gmagick->getimagehistogram(); + } catch (\GmagickException $e) { + throw new RuntimeException('Error while fetching histogram', $e->getCode(), $e); + } + + $image = $this; + + return array_map(function (\GmagickPixel $pixel) use ($image) { + return $image->pixelToColor($pixel); + }, $pixels); + } + + /** + * {@inheritdoc} + */ + public function getColorAt(PointInterface $point) + { + if (!$point->in($this->getSize())) { + throw new InvalidArgumentException(sprintf('Error getting color at point [%s,%s]. The point must be inside the image of size [%s,%s]', $point->getX(), $point->getY(), $this->getSize()->getWidth(), $this->getSize()->getHeight())); + } + + try { + $cropped = clone $this->gmagick; + $histogram = $cropped + ->cropImage(1, 1, $point->getX(), $point->getY()) + ->getImageHistogram(); + } catch (\GmagickException $e) { + throw new RuntimeException('Unable to get the pixel'); + } + + $pixel = array_shift($histogram); + + unset($histogram, $cropped); + + return $this->pixelToColor($pixel); + } + + /** + * Returns a color given a pixel, depending the Palette context + * + * Note : this method is public for PHP 5.3 compatibility + * + * @param \GmagickPixel $pixel + * + * @return ColorInterface + * + * @throws InvalidArgumentException In case a unknown color is requested + */ + public function pixelToColor(\GmagickPixel $pixel) + { + static $colorMapping = array( + ColorInterface::COLOR_RED => \Gmagick::COLOR_RED, + ColorInterface::COLOR_GREEN => \Gmagick::COLOR_GREEN, + ColorInterface::COLOR_BLUE => \Gmagick::COLOR_BLUE, + ColorInterface::COLOR_CYAN => \Gmagick::COLOR_CYAN, + ColorInterface::COLOR_MAGENTA => \Gmagick::COLOR_MAGENTA, + ColorInterface::COLOR_YELLOW => \Gmagick::COLOR_YELLOW, + ColorInterface::COLOR_KEYLINE => \Gmagick::COLOR_BLACK, + // There is no gray component in \Gmagick, let's use one of the RGB comp + ColorInterface::COLOR_GRAY => \Gmagick::COLOR_RED, + ); + + if ($this->palette->supportsAlpha()) { + try { + $alpha = (int) round($pixel->getcolorvalue(\Gmagick::COLOR_ALPHA) * 100); + } catch (\GmagickPixelException $e) { + $alpha = null; + } + } else { + $alpha = null; + } + + $palette = $this->palette(); + + return $this->palette->color(array_map(function ($color) use ($palette, $pixel, $colorMapping) { + if (!isset($colorMapping[$color])) { + throw new InvalidArgumentException(sprintf('Color %s is not mapped in Gmagick', $color)); + } + $multiplier = 255; + if ($palette->name() === PaletteInterface::PALETTE_CMYK) { + $multiplier = 100; + } + + return $pixel->getcolorvalue($colorMapping[$color]) * $multiplier; + }, $this->palette->pixelDefinition()), $alpha); + } + + /** + * {@inheritdoc} + */ + public function layers() + { + return $this->layers; + } + + /** + * {@inheritdoc} + */ + public function interlace($scheme) + { + static $supportedInterlaceSchemes = array( + ImageInterface::INTERLACE_NONE => \Gmagick::INTERLACE_NO, + ImageInterface::INTERLACE_LINE => \Gmagick::INTERLACE_LINE, + ImageInterface::INTERLACE_PLANE => \Gmagick::INTERLACE_PLANE, + ImageInterface::INTERLACE_PARTITION => \Gmagick::INTERLACE_PARTITION, + ); + + if (!array_key_exists($scheme, $supportedInterlaceSchemes)) { + throw new InvalidArgumentException('Unsupported interlace type'); + } + + $this->gmagick->setInterlaceScheme($supportedInterlaceSchemes[$scheme]); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function usePalette(PaletteInterface $palette) + { + if (!isset(static::$colorspaceMapping[$palette->name()])) { + throw new InvalidArgumentException(sprintf('The palette %s is not supported by Gmagick driver',$palette->name())); + } + + if ($this->palette->name() === $palette->name()) { + return $this; + } + + try { + try { + $hasICCProfile = (Boolean) $this->gmagick->getimageprofile('ICM'); + } catch (\GmagickException $e) { + $hasICCProfile = false; + } + + if (!$hasICCProfile) { + $this->profile($this->palette->profile()); + } + + $this->profile($palette->profile()); + + $this->setColorspace($palette); + $this->palette = $palette; + } catch (\GmagickException $e) { + throw new RuntimeException('Failed to set colorspace', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function palette() + { + return $this->palette; + } + + /** + * {@inheritdoc} + */ + public function profile(ProfileInterface $profile) + { + try { + $this->gmagick->profileimage('ICM', $profile->data()); + } catch (\GmagickException $e) { + throw new RuntimeException(sprintf('Unable to add profile %s to image', $profile->name()), $e->getCode(), $e); + } + + return $this; + } + + /** + * Internal + * + * Flatten the image. + */ + private function flatten() + { + /** + * @see http://pecl.php.net/bugs/bug.php?id=22435 + */ + if (method_exists($this->gmagick, 'flattenImages')) { + try { + $this->gmagick = $this->gmagick->flattenImages(); + } catch (\GmagickException $e) { + throw new RuntimeException('Flatten operation failed', $e->getCode(), $e); + } + } + } + + /** + * Gets specifically formatted color string from Color instance + * + * @param ColorInterface $color + * + * @return \GmagickPixel + * + * @throws InvalidArgumentException + */ + private function getColor(ColorInterface $color) + { + if (!$color->isOpaque()) { + throw new InvalidArgumentException('Gmagick doesn\'t support transparency'); + } + + return new \GmagickPixel((string) $color); + } + + /** + * Internal + * + * Get the mime type based on format. + * + * @param string $format + * + * @return string mime-type + * + * @throws InvalidArgumentException + */ + private function getMimeType($format) + { + static $mimeTypes = array( + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'gif' => 'image/gif', + 'png' => 'image/png', + 'wbmp' => 'image/vnd.wap.wbmp', + 'xbm' => 'image/xbm', + ); + + if (!isset($mimeTypes[$format])) { + throw new InvalidArgumentException(sprintf('Unsupported format given. Only %s are supported, %s given', implode(", ", array_keys($mimeTypes)), $format)); + } + + return $mimeTypes[$format]; + } + + /** + * Sets colorspace and image type, assigns the palette. + * + * @param PaletteInterface $palette + * + * @throws InvalidArgumentException + */ + private function setColorspace(PaletteInterface $palette) + { + if (!isset(static::$colorspaceMapping[$palette->name()])) { + throw new InvalidArgumentException(sprintf('The palette %s is not supported by Gmagick driver', $palette->name())); + } + + $this->gmagick->setimagecolorspace(static::$colorspaceMapping[$palette->name()]); + $this->palette = $palette; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Imagine.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Imagine.php new file mode 100755 index 00000000..ce4d4ed6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Imagine.php @@ -0,0 +1,167 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Gmagick; + +use Imagine\Image\AbstractImagine; +use Imagine\Exception\NotSupportedException; +use Imagine\Image\BoxInterface; +use Imagine\Image\Metadata\MetadataBag; +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Image\Palette\Grayscale; +use Imagine\Image\Palette\CMYK; +use Imagine\Image\Palette\RGB; +use Imagine\Image\Palette\Color\CMYK as CMYKColor; +use Imagine\Exception\InvalidArgumentException; +use Imagine\Exception\RuntimeException; + +/** + * Imagine implementation using the Gmagick PHP extension + */ +class Imagine extends AbstractImagine +{ + /** + * @throws RuntimeException + */ + public function __construct() + { + if (!class_exists('Gmagick')) { + throw new RuntimeException('Gmagick not installed'); + } + } + + /** + * {@inheritdoc} + */ + public function open($path) + { + $path = $this->checkPath($path); + + try { + $gmagick = new \Gmagick($path); + $image = new Image($gmagick, $this->createPalette($gmagick), $this->getMetadataReader()->readFile($path)); + } catch (\GmagickException $e) { + throw new RuntimeException(sprintf('Unable to open image %s', $path), $e->getCode(), $e); + } + + return $image; + } + + /** + * {@inheritdoc} + */ + public function create(BoxInterface $size, ColorInterface $color = null) + { + $width = $size->getWidth(); + $height = $size->getHeight(); + + $palette = null !== $color ? $color->getPalette() : new RGB(); + $color = null !== $color ? $color : $palette->color('fff'); + + try { + $gmagick = new \Gmagick(); + // Gmagick does not support creation of CMYK GmagickPixel + // see https://bugs.php.net/bug.php?id=64466 + if ($color instanceof CMYKColor) { + $switchPalette = $palette; + $palette = new RGB(); + $pixel = new \GmagickPixel($palette->color((string) $color)); + } else { + $switchPalette = null; + $pixel = new \GmagickPixel((string) $color); + } + + if ($color->getPalette()->supportsAlpha() && $color->getAlpha() < 100) { + throw new NotSupportedException('alpha transparency is not supported'); + } + + $gmagick->newimage($width, $height, $pixel->getcolor(false)); + $gmagick->setimagecolorspace(\Gmagick::COLORSPACE_TRANSPARENT); + $gmagick->setimagebackgroundcolor($pixel); + + $image = new Image($gmagick, $palette, new MetadataBag()); + + if ($switchPalette) { + $image->usePalette($switchPalette); + } + + return $image; + } catch (\GmagickException $e) { + throw new RuntimeException('Could not create empty image', $e->getCode(), $e); + } + } + + /** + * {@inheritdoc} + */ + public function load($string) + { + return $this->doLoad($string, $this->getMetadataReader()->readData($string)); + } + + /** + * {@inheritdoc} + */ + public function read($resource) + { + if (!is_resource($resource)) { + throw new InvalidArgumentException('Variable does not contain a stream resource'); + } + + $content = stream_get_contents($resource); + + if (false === $content) { + throw new InvalidArgumentException('Couldn\'t read given resource'); + } + + return $this->doLoad($content, $this->getMetadataReader()->readStream($resource)); + } + + /** + * {@inheritdoc} + */ + public function font($file, $size, ColorInterface $color) + { + $gmagick = new \Gmagick(); + $gmagick->newimage(1, 1, 'transparent'); + + return new Font($gmagick, $file, $size, $color); + } + + private function createPalette(\Gmagick $gmagick) + { + switch ($gmagick->getimagecolorspace()) { + case \Gmagick::COLORSPACE_SRGB: + case \Gmagick::COLORSPACE_RGB: + return new RGB(); + case \Gmagick::COLORSPACE_CMYK: + return new CMYK(); + case \Gmagick::COLORSPACE_GRAY: + return new Grayscale(); + default: + throw new NotSupportedException('Only RGB and CMYK colorspace are currently supported'); + } + } + + private function doLoad($content, MetadataBag $metadata) + { + try { + $gmagick = new \Gmagick(); + $gmagick->readimageblob($content); + } catch (\GmagickException $e) { + throw new RuntimeException( + 'Could not load image from string', $e->getCode(), $e + ); + } + + return new Image($gmagick, $this->createPalette($gmagick), $metadata); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Layers.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Layers.php new file mode 100755 index 00000000..d708812a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Layers.php @@ -0,0 +1,272 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Gmagick; + +use Imagine\Image\AbstractLayers; +use Imagine\Exception\RuntimeException; +use Imagine\Exception\NotSupportedException; +use Imagine\Exception\OutOfBoundsException; +use Imagine\Exception\InvalidArgumentException; +use Imagine\Image\Metadata\MetadataBag; +use Imagine\Image\Palette\PaletteInterface; + +class Layers extends AbstractLayers +{ + /** + * @var Image + */ + private $image; + + /** + * @var \Gmagick + */ + private $resource; + + /** + * @var integer + */ + private $offset = 0; + + /** + * @var array + */ + private $layers = array(); + + /** + * @var PaletteInterface + */ + private $palette; + + public function __construct(Image $image, PaletteInterface $palette, \Gmagick $resource) + { + $this->image = $image; + $this->resource = $resource; + $this->palette = $palette; + } + + /** + * {@inheritdoc} + */ + public function merge() + { + foreach ($this->layers as $offset => $image) { + try { + $this->resource->setimageindex($offset); + $this->resource->setimage($image->getGmagick()); + } catch (\GmagickException $e) { + throw new RuntimeException('Failed to substitute layer', $e->getCode(), $e); + } + } + } + + /** + * {@inheritdoc} + */ + public function coalesce() + { + throw new NotSupportedException('Gmagick does not support coalescing'); + } + + /** + * {@inheritdoc} + */ + public function animate($format, $delay, $loops) + { + if ('gif' !== strtolower($format)) { + throw new NotSupportedException('Animated picture is currently only supported on gif'); + } + + if (!is_int($loops) || $loops < 0) { + throw new InvalidArgumentException('Loops must be a positive integer.'); + } + + if (null !== $delay && (!is_int($delay) || $delay < 0)) { + throw new InvalidArgumentException('Delay must be either null or a positive integer.'); + } + + try { + foreach ($this as $offset => $layer) { + $this->resource->setimageindex($offset); + $this->resource->setimageformat($format); + + if (null !== $delay) { + $this->resource->setimagedelay($delay / 10); + } + + $this->resource->setimageiterations($loops); + } + } catch (\GmagickException $e) { + throw new RuntimeException('Failed to animate layers', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function current() + { + return $this->extractAt($this->offset); + } + + /** + * Tries to extract layer at given offset + * + * @param integer $offset + * @return Image + * @throws RuntimeException + */ + private function extractAt($offset) + { + if (!isset($this->layers[$offset])) { + try { + $this->resource->setimageindex($offset); + $this->layers[$offset] = new Image($this->resource->getimage(), $this->palette, new MetadataBag()); + } catch (\GmagickException $e) { + throw new RuntimeException(sprintf('Failed to extract layer %d', $offset), $e->getCode(), $e); + } + } + + return $this->layers[$offset]; + } + + /** + * {@inheritdoc} + */ + public function key() + { + return $this->offset; + } + + /** + * {@inheritdoc} + */ + public function next() + { + ++$this->offset; + } + + /** + * {@inheritdoc} + */ + public function rewind() + { + $this->offset = 0; + } + + /** + * {@inheritdoc} + */ + public function valid() + { + return $this->offset < count($this); + } + + /** + * {@inheritdoc} + */ + public function count() + { + try { + return $this->resource->getnumberimages(); + } catch (\GmagickException $e) { + throw new RuntimeException('Failed to count the number of layers', $e->getCode(), $e); + } + } + + /** + * {@inheritdoc} + */ + public function offsetExists($offset) + { + return is_int($offset) && $offset >= 0 && $offset < count($this); + } + + /** + * {@inheritdoc} + */ + public function offsetGet($offset) + { + return $this->extractAt($offset); + } + + /** + * {@inheritdoc} + */ + public function offsetSet($offset, $image) + { + if (!$image instanceof Image) { + throw new InvalidArgumentException('Only a Gmagick Image can be used as layer'); + } + + if (null === $offset) { + $offset = count($this) - 1; + } else { + if (!is_int($offset)) { + throw new InvalidArgumentException('Invalid offset for layer, it must be an integer'); + } + + if (count($this) < $offset || 0 > $offset) { + throw new OutOfBoundsException(sprintf('Invalid offset for layer, it must be a value between 0 and %d, %d given', count($this), $offset)); + } + + if (isset($this[$offset])) { + unset($this[$offset]); + $offset = $offset - 1; + } + } + + $frame = $image->getGmagick(); + + try { + if (count($this) > 0) { + $this->resource->setimageindex($offset); + $this->resource->nextimage(); + } + $this->resource->addimage($frame); + + /** + * ugly hack to bypass issue https://bugs.php.net/bug.php?id=64623 + */ + if (count($this) == 2) { + $this->resource->setimageindex($offset+1); + $this->resource->nextimage(); + $this->resource->addimage($frame); + unset($this[0]); + } + } catch (\GmagickException $e) { + throw new RuntimeException('Unable to set the layer', $e->getCode(), $e); + } + + $this->layers = array(); + } + + /** + * {@inheritdoc} + */ + public function offsetUnset($offset) + { + try { + $this->extractAt($offset); + } catch (RuntimeException $e) { + return; + } + + try { + $this->resource->setimageindex($offset); + $this->resource->removeimage(); + } catch (\GmagickException $e) { + throw new RuntimeException('Unable to remove layer', $e->getCode(), $e); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractFont.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractFont.php new file mode 100755 index 00000000..59e9a45b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractFont.php @@ -0,0 +1,75 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image; + +use Imagine\Image\Palette\Color\ColorInterface; + +/** + * Abstract font base class + */ +abstract class AbstractFont implements FontInterface +{ + /** + * @var string + */ + protected $file; + + /** + * @var integer + */ + protected $size; + + /** + * @var ColorInterface + */ + protected $color; + + /** + * Constructs a font with specified $file, $size and $color + * + * The font size is to be specified in points (e.g. 10pt means 10) + * + * @param string $file + * @param integer $size + * @param ColorInterface $color + */ + public function __construct($file, $size, ColorInterface $color) + { + $this->file = $file; + $this->size = $size; + $this->color = $color; + } + + /** + * {@inheritdoc} + */ + final public function getFile() + { + return $this->file; + } + + /** + * {@inheritdoc} + */ + final public function getSize() + { + return $this->size; + } + + /** + * {@inheritdoc} + */ + final public function getColor() + { + return $this->color; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractImage.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractImage.php new file mode 100755 index 00000000..5c85769f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractImage.php @@ -0,0 +1,120 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image; + +use Imagine\Exception\InvalidArgumentException; +use Imagine\Image\Metadata\MetadataBag; + +abstract class AbstractImage implements ImageInterface +{ + /** + * @var MetadataBag + */ + protected $metadata; + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function thumbnail(BoxInterface $size, $mode = ImageInterface::THUMBNAIL_INSET, $filter = ImageInterface::FILTER_UNDEFINED) + { + if ($mode !== ImageInterface::THUMBNAIL_INSET && + $mode !== ImageInterface::THUMBNAIL_OUTBOUND) { + throw new InvalidArgumentException('Invalid mode specified'); + } + + $imageSize = $this->getSize(); + $ratios = array( + $size->getWidth() / $imageSize->getWidth(), + $size->getHeight() / $imageSize->getHeight() + ); + + $thumbnail = $this->copy(); + + $thumbnail->usePalette($this->palette()); + $thumbnail->strip(); + // if target width is larger than image width + // AND target height is longer than image height + if ($size->contains($imageSize)) { + return $thumbnail; + } + + if ($mode === ImageInterface::THUMBNAIL_INSET) { + $ratio = min($ratios); + } else { + $ratio = max($ratios); + } + + if ($mode === ImageInterface::THUMBNAIL_OUTBOUND) { + if (!$imageSize->contains($size)) { + $size = new Box( + min($imageSize->getWidth(), $size->getWidth()), + min($imageSize->getHeight(), $size->getHeight()) + ); + } else { + $imageSize = $thumbnail->getSize()->scale($ratio); + $thumbnail->resize($imageSize, $filter); + } + $thumbnail->crop(new Point( + max(0, round(($imageSize->getWidth() - $size->getWidth()) / 2)), + max(0, round(($imageSize->getHeight() - $size->getHeight()) / 2)) + ), $size); + } else { + if (!$imageSize->contains($size)) { + $imageSize = $imageSize->scale($ratio); + $thumbnail->resize($imageSize, $filter); + } else { + $imageSize = $thumbnail->getSize()->scale($ratio); + $thumbnail->resize($imageSize, $filter); + } + } + + return $thumbnail; + } + + /** + * Updates a given array of save options for backward compatibility with legacy names + * + * @param array $options + * + * @return array + */ + protected function updateSaveOptions(array $options) + { + // Preserve BC until version 1.0 + if (isset($options['quality']) && !isset($options['jpeg_quality'])) { + $options['jpeg_quality'] = $options['quality']; + } + + return $options; + } + + /** + * {@inheritdoc} + */ + public function metadata() + { + return $this->metadata; + } + + /** + * Assures the metadata instance will be cloned, too + */ + public function __clone() + { + if ($this->metadata !== null) { + $this->metadata = clone $this->metadata; + } + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractImagine.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractImagine.php new file mode 100755 index 00000000..fcb1a3d6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractImagine.php @@ -0,0 +1,79 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image; + +use Imagine\Image\Metadata\DefaultMetadataReader; +use Imagine\Image\Metadata\ExifMetadataReader; +use Imagine\Image\Metadata\MetadataReaderInterface; +use Imagine\Exception\InvalidArgumentException; + +abstract class AbstractImagine implements ImagineInterface +{ + /** @var MetadataReaderInterface */ + private $metadataReader; + + /** + * @param MetadataReaderInterface $metadataReader + * + * @return ImagineInterface + */ + public function setMetadataReader(MetadataReaderInterface $metadataReader) + { + $this->metadataReader = $metadataReader; + + return $this; + } + + /** + * @return MetadataReaderInterface + */ + public function getMetadataReader() + { + if (null === $this->metadataReader) { + if (ExifMetadataReader::isSupported()) { + $this->metadataReader = new ExifMetadataReader(); + } else { + $this->metadataReader = new DefaultMetadataReader(); + } + } + + return $this->metadataReader; + } + + /** + * Checks a path that could be used with ImagineInterface::open and returns + * a proper string. + * + * @param string|object $path + * + * @return string + * + * @throws InvalidArgumentException In case the given path is invalid. + */ + protected function checkPath($path) + { + // provide compatibility with objects such as \SplFileInfo + if (is_object($path) && method_exists($path, '__toString')) { + $path = (string) $path; + } + + $handle = @fopen($path, 'r'); + + if (false === $handle) { + throw new InvalidArgumentException(sprintf('File %s does not exist.', $path)); + } + + fclose($handle); + + return $path; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractLayers.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractLayers.php new file mode 100755 index 00000000..486a7222 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractLayers.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image; + +abstract class AbstractLayers implements LayersInterface +{ + /** + * {@inheritdoc} + */ + public function add(ImageInterface $image) + { + $this[] = $image; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function set($offset, ImageInterface $image) + { + $this[$offset] = $image; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function remove($offset) + { + unset($this[$offset]); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function get($offset) + { + return $this[$offset]; + } + + /** + * {@inheritdoc} + */ + public function has($offset) + { + return isset($this[$offset]); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Box.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Box.php new file mode 100755 index 00000000..37b85135 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Box.php @@ -0,0 +1,122 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image; + +use Imagine\Exception\InvalidArgumentException; + +/** + * A box implementation + */ +final class Box implements BoxInterface +{ + /** + * @var integer + */ + private $width; + + /** + * @var integer + */ + private $height; + + /** + * Constructs the Size with given width and height + * + * @param integer $width + * @param integer $height + * + * @throws InvalidArgumentException + */ + public function __construct($width, $height) + { + if ($height < 1 || $width < 1) { + throw new InvalidArgumentException(sprintf('Length of either side cannot be 0 or negative, current size is %sx%s', $width, $height)); + } + + $this->width = (int) $width; + $this->height = (int) $height; + } + + /** + * {@inheritdoc} + */ + public function getWidth() + { + return $this->width; + } + + /** + * {@inheritdoc} + */ + public function getHeight() + { + return $this->height; + } + + /** + * {@inheritdoc} + */ + public function scale($ratio) + { + return new Box(round($ratio * $this->width), round($ratio * $this->height)); + } + + /** + * {@inheritdoc} + */ + public function increase($size) + { + return new Box((int) $size + $this->width, (int) $size + $this->height); + } + + /** + * {@inheritdoc} + */ + public function contains(BoxInterface $box, PointInterface $start = null) + { + $start = $start ? $start : new Point(0, 0); + + return $start->in($this) && $this->width >= $box->getWidth() + $start->getX() && $this->height >= $box->getHeight() + $start->getY(); + } + + /** + * {@inheritdoc} + */ + public function square() + { + return $this->width * $this->height; + } + + /** + * {@inheritdoc} + */ + public function __toString() + { + return sprintf('%dx%d px', $this->width, $this->height); + } + + /** + * {@inheritdoc} + */ + public function widen($width) + { + return $this->scale($width / $this->width); + } + + /** + * {@inheritdoc} + */ + public function heighten($height) + { + return $this->scale($height / $this->height); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/BoxInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/BoxInterface.php new file mode 100755 index 00000000..4a086c39 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/BoxInterface.php @@ -0,0 +1,94 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image; + +/** + * Interface for a box + */ +interface BoxInterface +{ + /** + * Gets current image height + * + * @return integer + */ + public function getHeight(); + + /** + * Gets current image width + * + * @return integer + */ + public function getWidth(); + + /** + * Creates new BoxInterface instance with ratios applied to both sides + * + * @param float $ratio + * + * @return BoxInterface + */ + public function scale($ratio); + + /** + * Creates new BoxInterface, adding given size to both sides + * + * @param integer $size + * + * @return BoxInterface + */ + public function increase($size); + + /** + * Checks whether current box can fit given box at a given start position, + * start position defaults to top left corner xy(0,0) + * + * @param BoxInterface $box + * @param PointInterface $start + * + * @return Boolean + */ + public function contains(BoxInterface $box, PointInterface $start = null); + + /** + * Gets current box square, useful for getting total number of pixels in a + * given box + * + * @return integer + */ + public function square(); + + /** + * Returns a string representation of the current box + * + * @return string + */ + public function __toString(); + + /** + * Resizes box to given width, constraining proportions and returns the new box + * + * @param integer $width + * + * @return BoxInterface + */ + public function widen($width); + + /** + * Resizes box to given height, constraining proportions and returns the new box + * + * @param integer $height + * + * @return BoxInterface + */ + public function heighten($height); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/FillInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/FillInterface.php new file mode 100755 index 00000000..c8d69e5d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/FillInterface.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Fill; + +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Image\PointInterface; + +/** + * Interface for the fill + */ +interface FillInterface +{ + /** + * Gets color of the fill for the given position + * + * @param PointInterface $position + * + * @return ColorInterface + */ + public function getColor(PointInterface $position); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Horizontal.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Horizontal.php new file mode 100755 index 00000000..4a423067 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Horizontal.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Fill\Gradient; + +use Imagine\Image\PointInterface; + +/** + * Horizontal gradient fill + */ +final class Horizontal extends Linear +{ + /** + * {@inheritdoc} + */ + public function getDistance(PointInterface $position) + { + return $position->getX(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Linear.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Linear.php new file mode 100755 index 00000000..9bf2cf6c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Linear.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Fill\Gradient; + +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Image\Fill\FillInterface; +use Imagine\Image\PointInterface; + +/** + * Linear gradient fill + */ +abstract class Linear implements FillInterface +{ + /** + * @var integer + */ + private $length; + + /** + * @var ColorInterface + */ + private $start; + + /** + * @var ColorInterface + */ + private $end; + + /** + * Constructs a linear gradient with overall gradient length, and start and + * end shades, which default to 0 and 255 accordingly + * + * @param integer $length + * @param ColorInterface $start + * @param ColorInterface $end + */ + final public function __construct($length, ColorInterface $start, ColorInterface $end) + { + $this->length = $length; + $this->start = $start; + $this->end = $end; + } + + /** + * {@inheritdoc} + */ + final public function getColor(PointInterface $position) + { + $l = $this->getDistance($position); + + if ($l >= $this->length) { + return $this->end; + } + + if ($l < 0) { + return $this->start; + } + + return $this->start->getPalette()->blend($this->start, $this->end, $l / $this->length); + } + + /** + * @return ColorInterface + */ + final public function getStart() + { + return $this->start; + } + + /** + * @return ColorInterface + */ + final public function getEnd() + { + return $this->end; + } + + /** + * Get the distance of the position relative to the beginning of the gradient + * + * @param PointInterface $position + * + * @return integer + */ + abstract protected function getDistance(PointInterface $position); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Vertical.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Vertical.php new file mode 100755 index 00000000..9a26b778 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Vertical.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Fill\Gradient; + +use Imagine\Image\PointInterface; + +/** + * Vertical gradient fill + */ +final class Vertical extends Linear +{ + /** + * {@inheritdoc} + */ + public function getDistance(PointInterface $position) + { + return $position->getY(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/FontInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/FontInterface.php new file mode 100755 index 00000000..59d4a265 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/FontInterface.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image; + +use Imagine\Image\Palette\Color\ColorInterface; + +/** + * The font interface + */ +interface FontInterface +{ + /** + * Gets the fontfile for current font + * + * @return string + */ + public function getFile(); + + /** + * Gets font's integer point size + * + * @return integer + */ + public function getSize(); + + /** + * Gets font's color + * + * @return ColorInterface + */ + public function getColor(); + + /** + * Gets BoxInterface of font size on the image based on string and angle + * + * @param string $string + * @param integer $angle + * + * @return BoxInterface + */ + public function box($string, $angle = 0); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Histogram/Bucket.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Histogram/Bucket.php new file mode 100755 index 00000000..34dad5ee --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Histogram/Bucket.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Histogram; + +/** + * Bucket histogram + */ +final class Bucket implements \Countable +{ + /** + * @var Range + */ + private $range; + + /** + * @var integer + */ + private $count; + + /** + * @param Range $range + * @param integer $count + */ + public function __construct(Range $range, $count = 0) + { + $this->range = $range; + $this->count = $count; + } + + /** + * @param integer $value + */ + public function add($value) + { + if ($this->range->contains($value)) { + $this->count++; + } + } + + /** + * @return integer The number of elements in the bucket. + */ + public function count() + { + return $this->count; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Histogram/Range.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Histogram/Range.php new file mode 100755 index 00000000..9dc9f992 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Histogram/Range.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Histogram; + +use Imagine\Exception\OutOfBoundsException; + +/** + * Range histogram + */ +final class Range +{ + /** + * @var integer + */ + private $start; + + /** + * @var integer + */ + private $end; + + /** + * @param integer $start + * @param integer $end + * + * @throws OutOfBoundsException + */ + public function __construct($start, $end) + { + if ($end <= $start) { + throw new OutOfBoundsException(sprintf('Range end cannot be bigger than start, %d %d given accordingly', $this->start, $this->end)); + } + + $this->start = $start; + $this->end = $end; + } + + /** + * @param integer $value + * + * @return Boolean + */ + public function contains($value) + { + return $value >= $this->start && $value < $this->end; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ImageInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ImageInterface.php new file mode 100755 index 00000000..6cf1dd87 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ImageInterface.php @@ -0,0 +1,173 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image; + +use Imagine\Draw\DrawerInterface; +use Imagine\Effects\EffectsInterface; +use Imagine\Image\Palette\PaletteInterface; +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Exception\RuntimeException; +use Imagine\Exception\OutOfBoundsException; + +/** + * The image interface + */ +interface ImageInterface extends ManipulatorInterface +{ + const RESOLUTION_PIXELSPERINCH = 'ppi'; + const RESOLUTION_PIXELSPERCENTIMETER = 'ppc'; + + const INTERLACE_NONE = 'none'; + const INTERLACE_LINE = 'line'; + const INTERLACE_PLANE = 'plane'; + const INTERLACE_PARTITION = 'partition'; + + const FILTER_UNDEFINED = 'undefined'; + const FILTER_POINT = 'point'; + const FILTER_BOX = 'box'; + const FILTER_TRIANGLE = 'triangle'; + const FILTER_HERMITE = 'hermite'; + const FILTER_HANNING = 'hanning'; + const FILTER_HAMMING = 'hamming'; + const FILTER_BLACKMAN = 'blackman'; + const FILTER_GAUSSIAN = 'gaussian'; + const FILTER_QUADRATIC = 'quadratic'; + const FILTER_CUBIC = 'cubic'; + const FILTER_CATROM = 'catrom'; + const FILTER_MITCHELL = 'mitchell'; + const FILTER_LANCZOS = 'lanczos'; + const FILTER_BESSEL = 'bessel'; + const FILTER_SINC = 'sinc'; + + /** + * Returns the image content as a binary string + * + * @param string $format + * @param array $options + * + * @throws RuntimeException + * + * @return string binary + */ + public function get($format, array $options = array()); + + /** + * Returns the image content as a PNG binary string + * + * @throws RuntimeException + * + * @return string binary + */ + public function __toString(); + + /** + * Instantiates and returns a DrawerInterface instance for image drawing + * + * @return DrawerInterface + */ + public function draw(); + + /** + * @return EffectsInterface + */ + public function effects(); + + /** + * Returns current image size + * + * @return BoxInterface + */ + public function getSize(); + + /** + * Transforms creates a grayscale mask from current image, returns a new + * image, while keeping the existing image unmodified + * + * @return ImageInterface + */ + public function mask(); + + /** + * Returns array of image colors as Imagine\Image\Palette\Color\ColorInterface instances + * + * @return array + */ + public function histogram(); + + /** + * Returns color at specified positions of current image + * + * @param PointInterface $point + * + * @throws RuntimeException + * + * @return ColorInterface + */ + public function getColorAt(PointInterface $point); + + /** + * Returns the image layers when applicable. + * + * @throws RuntimeException In case the layer can not be returned + * @throws OutOfBoundsException In case the index is not a valid value + * + * @return LayersInterface + */ + public function layers(); + + /** + * Enables or disables interlacing + * + * @param string $scheme + * + * @throws InvalidArgumentException When an unsupported Interface type is supplied + * + * @return ImageInterface + */ + public function interlace($scheme); + + /** + * Return the current color palette + * + * @return PaletteInterface + */ + public function palette(); + + /** + * Set a palette for the image. Useful to change colorspace. + * + * @param PaletteInterface $palette + * + * @return ImageInterface + * + * @throws RuntimeException + */ + public function usePalette(PaletteInterface $palette); + + /** + * Applies a color profile on the Image + * + * @param ProfileInterface $profile + * + * @return ImageInterface + * + * @throws RuntimeException + */ + public function profile(ProfileInterface $profile); + + /** + * Returns the Image's meta data + * + * @return Metadata\MetadataInterface + */ + public function metadata(); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ImagineInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ImagineInterface.php new file mode 100755 index 00000000..b5c942c7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ImagineInterface.php @@ -0,0 +1,83 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image; + +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Exception\InvalidArgumentException; +use Imagine\Exception\RuntimeException; + +/** + * The imagine interface + */ +interface ImagineInterface +{ + const VERSION = '0.7-dev'; + + /** + * Creates a new empty image with an optional background color + * + * @param BoxInterface $size + * @param ColorInterface $color + * + * @throws InvalidArgumentException + * @throws RuntimeException + * + * @return ImageInterface + */ + public function create(BoxInterface $size, ColorInterface $color = null); + + /** + * Opens an existing image from $path + * + * @param string $path + * + * @throws RuntimeException + * + * @return ImageInterface + */ + public function open($path); + + /** + * Loads an image from a binary $string + * + * @param string $string + * + * @throws RuntimeException + * + * @return ImageInterface + */ + public function load($string); + + /** + * Loads an image from a resource $resource + * + * @param resource $resource + * + * @throws RuntimeException + * + * @return ImageInterface + */ + public function read($resource); + + /** + * Constructs a font with specified $file, $size and $color + * + * The font size is to be specified in points (e.g. 10pt means 10) + * + * @param string $file + * @param integer $size + * @param ColorInterface $color + * + * @return FontInterface + */ + public function font($file, $size, ColorInterface $color); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/LayersInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/LayersInterface.php new file mode 100755 index 00000000..44df4236 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/LayersInterface.php @@ -0,0 +1,107 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image; + +use Imagine\Exception\RuntimeException; +use Imagine\Exception\InvalidArgumentException; +use Imagine\Exception\OutOfBoundsException; + +/** + * The layers interface + */ +interface LayersInterface extends \Iterator, \Countable, \ArrayAccess +{ + /** + * Merge layers into the original objects + * + * @throws RuntimeException + */ + public function merge(); + + /** + * Animates layers + * + * @param string $format The output output format + * @param integer $delay The delay in milliseconds between two frames + * @param integer $loops The number of loops, 0 means infinite + * + * @return LayersInterface + * + * @throws InvalidArgumentException In case an invalid argument is provided + * @throws RuntimeException In case the driver fails to animate + */ + public function animate($format, $delay, $loops); + + /** + * Coalesce layers. Each layer in the sequence is the same size as the first and composited with the next layer in + * the sequence. + */ + public function coalesce(); + + /** + * Adds an image at the end of the layers stack + * + * @param ImageInterface $image + * + * @return LayersInterface + * + * @throws RuntimeException + */ + public function add(ImageInterface $image); + + /** + * Set an image at offset + * + * @param integer $offset + * @param ImageInterface $image + * + * @return LayersInterface + * + * @throws RuntimeException + * @throws InvalidArgumentException + * @throws OutOfBoundsException + */ + public function set($offset, ImageInterface $image); + + /** + * Removes the image at offset + * + * @param integer $offset + * + * @return LayersInterface + * + * @throws RuntimeException + * @throws InvalidArgumentException + */ + public function remove($offset); + + /** + * Returns the image at offset + * + * @param integer $offset + * + * @return ImageInterface + * + * @throws RuntimeException + * @throws InvalidArgumentException + */ + public function get($offset); + + /** + * Returns true if a layer at offset is preset + * + * @param integer $offset + * + * @return Boolean + */ + public function has($offset); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ManipulatorInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ManipulatorInterface.php new file mode 100755 index 00000000..392b9082 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ManipulatorInterface.php @@ -0,0 +1,181 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image; + +use Imagine\Exception\InvalidArgumentException; +use Imagine\Exception\OutOfBoundsException; +use Imagine\Exception\RuntimeException; +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Image\Fill\FillInterface; + +/** + * The manipulator interface + */ +interface ManipulatorInterface +{ + const THUMBNAIL_INSET = 'inset'; + const THUMBNAIL_OUTBOUND = 'outbound'; + + /** + * Copies current source image into a new ImageInterface instance + * + * @throws RuntimeException + * + * @return static + */ + public function copy(); + + /** + * Crops a specified box out of the source image (modifies the source image) + * Returns cropped self + * + * @param PointInterface $start + * @param BoxInterface $size + * + * @throws OutOfBoundsException + * @throws RuntimeException + * + * @return static + */ + public function crop(PointInterface $start, BoxInterface $size); + + /** + * Resizes current image and returns self + * + * @param BoxInterface $size + * @param string $filter + * + * @throws RuntimeException + * + * @return static + */ + public function resize(BoxInterface $size, $filter = ImageInterface::FILTER_UNDEFINED); + + /** + * Rotates an image at the given angle. + * Optional $background can be used to specify the fill color of the empty + * area of rotated image. + * + * @param integer $angle + * @param ColorInterface $background + * + * @throws RuntimeException + * + * @return static + */ + public function rotate($angle, ColorInterface $background = null); + + /** + * Pastes an image into a parent image + * Throws exceptions if image exceeds parent image borders or if paste + * operation fails + * + * Returns source image + * + * @param ImageInterface $image + * @param PointInterface $start + * + * @throws InvalidArgumentException + * @throws OutOfBoundsException + * @throws RuntimeException + * + * @return static + */ + public function paste(ImageInterface $image, PointInterface $start); + + /** + * Saves the image at a specified path, the target file extension is used + * to determine file format, only jpg, jpeg, gif, png, wbmp and xbm are + * supported + * + * @param string $path + * @param array $options + * + * @throws RuntimeException + * + * @return static + */ + public function save($path = null, array $options = array()); + + /** + * Outputs the image content + * + * @param string $format + * @param array $options + * + * @throws RuntimeException + * + * @return static + */ + public function show($format, array $options = array()); + + /** + * Flips current image using horizontal axis + * + * @throws RuntimeException + * + * @return static + */ + public function flipHorizontally(); + + /** + * Flips current image using vertical axis + * + * @throws RuntimeException + * + * @return static + */ + public function flipVertically(); + + /** + * Remove all profiles and comments + * + * @throws RuntimeException + * + * @return static + */ + public function strip(); + + /** + * Generates a thumbnail from a current image + * Returns it as a new image, doesn't modify the current image + * + * @param BoxInterface $size + * @param string $mode + * @param string $filter The filter to use for resizing, one of ImageInterface::FILTER_* + * + * @throws RuntimeException + * + * @return static + */ + public function thumbnail(BoxInterface $size, $mode = self::THUMBNAIL_INSET, $filter = ImageInterface::FILTER_UNDEFINED); + + /** + * Applies a given mask to current image's alpha channel + * + * @param ImageInterface $mask + * + * @return static + */ + public function applyMask(ImageInterface $mask); + + /** + * Fills image with provided filling, by replacing each pixel's color in + * the current image with corresponding color from FillInterface, and + * returns modified image + * + * @param FillInterface $fill + * + * @return static + */ + public function fill(FillInterface $fill); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/AbstractMetadataReader.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/AbstractMetadataReader.php new file mode 100755 index 00000000..a709655b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/AbstractMetadataReader.php @@ -0,0 +1,101 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Metadata; + +use Imagine\Exception\InvalidArgumentException; + +abstract class AbstractMetadataReader implements MetadataReaderInterface +{ + /** + * {@inheritdoc} + */ + public function readFile($file) + { + if (stream_is_local($file)) { + if (!is_file($file)) { + throw new InvalidArgumentException(sprintf('File %s does not exist.', $file)); + } + + return new MetadataBag(array_merge(array('filepath' => realpath($file), 'uri' => $file), $this->extractFromFile($file))); + } + + return new MetadataBag(array_merge(array('uri' => $file), $this->extractFromFile($file))); + } + + /** + * {@inheritdoc} + */ + public function readData($data) + { + return new MetadataBag($this->extractFromData($data)); + } + + /** + * {@inheritdoc} + */ + public function readStream($resource) + { + if (!is_resource($resource)) { + throw new InvalidArgumentException('Invalid resource provided.'); + } + + return new MetadataBag(array_merge($this->getStreamMetadata($resource), $this->extractFromStream($resource))); + } + + /** + * Gets the URI from a stream resource + * + * @param resource $resource + * + * @return string|null The URI f ava + */ + private function getStreamMetadata($resource) + { + $metadata = array(); + + if (false !== $data = @stream_get_meta_data($resource)) { + $metadata['uri'] = $data['uri']; + if (stream_is_local($resource)) { + $metadata['filepath'] = realpath($data['uri']); + } + } + + return $metadata; + } + + /** + * Extracts metadata from a file + * + * @param $file + * + * @return array An associative array of metadata + */ + abstract protected function extractFromFile($file); + + /** + * Extracts metadata from raw data + * + * @param $data + * + * @return array An associative array of metadata + */ + abstract protected function extractFromData($data); + + /** + * Extracts metadata from a stream + * + * @param $resource + * + * @return array An associative array of metadata + */ + abstract protected function extractFromStream($resource); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/DefaultMetadataReader.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/DefaultMetadataReader.php new file mode 100755 index 00000000..349366e0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/DefaultMetadataReader.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Metadata; + +/** + * Default metadata reader + */ +class DefaultMetadataReader extends AbstractMetadataReader +{ + /** + * {@inheritdoc} + */ + protected function extractFromFile($file) + { + return array(); + } + + /** + * {@inheritdoc} + */ + protected function extractFromData($data) + { + return array(); + } + + /** + * {@inheritdoc} + */ + protected function extractFromStream($resource) + { + return array(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/ExifMetadataReader.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/ExifMetadataReader.php new file mode 100755 index 00000000..dd8e7d09 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/ExifMetadataReader.php @@ -0,0 +1,114 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Metadata; + +use Imagine\Exception\InvalidArgumentException; +use Imagine\Exception\NotSupportedException; + +/** + * Metadata driven by Exif information + */ +class ExifMetadataReader extends AbstractMetadataReader +{ + public function __construct() + { + if (!self::isSupported()) { + throw new NotSupportedException('PHP exif extension is required to use the ExifMetadataReader'); + } + } + + public static function isSupported() + { + return function_exists('exif_read_data'); + } + + /** + * {@inheritdoc} + */ + protected function extractFromFile($file) + { + if (false === $data = @file_get_contents($file)) { + throw new InvalidArgumentException(sprintf('File %s is not readable.', $file)); + } + + return $this->doReadData($data); + } + + /** + * {@inheritdoc} + */ + protected function extractFromData($data) + { + return $this->doReadData($data); + } + + /** + * {@inheritdoc} + */ + protected function extractFromStream($resource) + { + if (0 < ftell($resource)) { + $metadata = stream_get_meta_data($resource); + if ($metadata['seekable']) { + rewind($resource); + } + } + + return $this->doReadData(stream_get_contents($resource)); + } + + /** + * Extracts metadata from raw data, merges with existing metadata + * + * @param string $data + * + * @return MetadataBag + */ + private function doReadData($data) + { + if (substr($data, 0, 2) === 'II') { + $mime = 'image/tiff'; + } else { + $mime = 'image/jpeg'; + } + + return $this->extract('data://' . $mime . ';base64,' . base64_encode($data)); + } + + /** + * Performs the exif data extraction given a path or data-URI representation. + * + * @param string $path The path to the file or the data-URI representation. + * + * @return MetadataBag + */ + private function extract($path) + { + if (false === $exifData = @exif_read_data($path, null, true, false)) { + return array(); + } + + $metadata = array(); + $sources = array('EXIF' => 'exif', 'IFD0' => 'ifd0'); + + foreach ($sources as $name => $prefix) { + if (!isset($exifData[$name])) { + continue; + } + foreach ($exifData[$name] as $prop => $value) { + $metadata[$prefix.'.'.$prop] = $value; + } + } + + return $metadata; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/MetadataBag.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/MetadataBag.php new file mode 100755 index 00000000..b7e917a3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/MetadataBag.php @@ -0,0 +1,97 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Metadata; + +/** + * An interface for Image Metadata + */ +class MetadataBag implements \ArrayAccess, \IteratorAggregate, \Countable +{ + /** @var array */ + private $data; + + public function __construct(array $data = array()) + { + $this->data = $data; + } + + /** + * Returns the metadata key, default value if it does not exist + * + * @param string $key + * @param mixed|null $default + * + * @return mixed + */ + public function get($key, $default = null) + { + return array_key_exists($key, $this->data) ? $this->data[$key] : $default; + } + + /** + * {@inheritdoc} + */ + public function count() + { + return count($this->data); + } + + /** + * {@inheritdoc} + */ + public function getIterator() + { + return new \ArrayIterator($this->data); + } + + /** + * {@inheritdoc} + */ + public function offsetExists($offset) + { + return array_key_exists($offset, $this->data); + } + + /** + * {@inheritdoc} + */ + public function offsetSet($offset, $value) + { + $this->data[$offset] = $value; + } + + /** + * {@inheritdoc} + */ + public function offsetUnset($offset) + { + unset($this->data[$offset]); + } + + /** + * {@inheritdoc} + */ + public function offsetGet($offset) + { + return $this->get($offset); + } + + /** + * Returns metadata as an array + * + * @return array An associative array + */ + public function toArray() + { + return $this->data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/MetadataReaderInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/MetadataReaderInterface.php new file mode 100755 index 00000000..62fcc881 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/MetadataReaderInterface.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Metadata; + +use Imagine\Exception\InvalidArgumentException; + +interface MetadataReaderInterface +{ + /** + * Reads metadata from a file. + * + * @param $file The path to the file where to read metadata. + * + * @throws InvalidArgumentException In case the file does not exist. + * + * @return MetadataBag + */ + public function readFile($file); + + /** + * Reads metadata from a binary string. + * + * @param $data The binary string to read. + * + * @return MetadataBag + */ + public function readData($data); + + /** + * Reads metadata from a stream. + * + * @param $resource The stream to read. + * + * @throws InvalidArgumentException In case the resource is not valid. + * + * @return MetadataBag + */ + public function readStream($resource); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/CMYK.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/CMYK.php new file mode 100755 index 00000000..2beecf28 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/CMYK.php @@ -0,0 +1,118 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Palette; + +use Imagine\Image\Palette\Color\CMYK as CMYKColor; +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Exception\RuntimeException; +use Imagine\Exception\InvalidArgumentException; +use Imagine\Image\Profile; +use Imagine\Image\ProfileInterface; + +class CMYK implements PaletteInterface +{ + private $parser; + private $profile; + private static $colors = array(); + + public function __construct() + { + $this->parser = new ColorParser(); + } + + /** + * {@inheritdoc} + */ + public function name() + { + return PaletteInterface::PALETTE_CMYK; + } + + /** + * {@inheritdoc} + */ + public function pixelDefinition() + { + return array( + ColorInterface::COLOR_CYAN, + ColorInterface::COLOR_MAGENTA, + ColorInterface::COLOR_YELLOW, + ColorInterface::COLOR_KEYLINE, + ); + } + + /** + * {@inheritdoc} + */ + public function supportsAlpha() + { + return false; + } + + /** + * {@inheritdoc} + */ + public function color($color, $alpha = null) + { + if (null !== $alpha) { + throw new InvalidArgumentException('CMYK palette does not support alpha'); + } + + $color = $this->parser->parseToCMYK($color); + $index = sprintf('cmyk(%d, %d, %d, %d)', $color[0], $color[1], $color[2], $color[3]); + + if (false === array_key_exists($index, self::$colors)) { + self::$colors[$index] = new CMYKColor($this, $color); + } + + return self::$colors[$index]; + } + + /** + * {@inheritdoc} + */ + public function blend(ColorInterface $color1, ColorInterface $color2, $amount) + { + if (!$color1 instanceof CMYKColor || ! $color2 instanceof CMYKColor) { + throw new RuntimeException('CMYK palette can only blend CMYK colors'); + } + + return $this->color(array( + min(100, $color1->getCyan() + $color2->getCyan() * $amount), + min(100, $color1->getMagenta() + $color2->getMagenta() * $amount), + min(100, $color1->getYellow() + $color2->getYellow() * $amount), + min(100, $color1->getKeyline() + $color2->getKeyline() * $amount), + )); + } + + /** + * {@inheritdoc} + */ + public function useProfile(ProfileInterface $profile) + { + $this->profile = $profile; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function profile() + { + if (!$this->profile) { + $this->profile = Profile::fromPath(__DIR__ . '/../../resources/Adobe/CMYK/USWebUncoated.icc'); + } + + return $this->profile; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/CMYK.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/CMYK.php new file mode 100755 index 00000000..31654335 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/CMYK.php @@ -0,0 +1,219 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Palette\Color; + +use Imagine\Image\Palette\CMYK as CMYKPalette; +use Imagine\Exception\RuntimeException; +use Imagine\Exception\InvalidArgumentException; + +final class CMYK implements ColorInterface +{ + /** + * @var integer + */ + private $c; + + /** + * @var integer + */ + private $m; + + /** + * @var integer + */ + private $y; + + /** + * @var integer + */ + private $k; + + /** + * + * @var CMYK + */ + private $palette; + + public function __construct(CMYKPalette $palette, array $color) + { + $this->palette = $palette; + $this->setColor($color); + } + + /** + * {@inheritdoc} + */ + public function getValue($component) + { + switch ($component) { + case ColorInterface::COLOR_CYAN: + return $this->getCyan(); + case ColorInterface::COLOR_MAGENTA: + return $this->getMagenta(); + case ColorInterface::COLOR_YELLOW: + return $this->getYellow(); + case ColorInterface::COLOR_KEYLINE: + return $this->getKeyline(); + default: + throw new InvalidArgumentException(sprintf('Color component %s is not valid', $component)); + } + } + + /** + * Returns Cyan value of the color + * + * @return integer + */ + public function getCyan() + { + return $this->c; + } + + /** + * Returns Magenta value of the color + * + * @return integer + */ + public function getMagenta() + { + return $this->m; + } + + /** + * Returns Yellow value of the color + * + * @return integer + */ + public function getYellow() + { + return $this->y; + } + + /** + * Returns Key value of the color + * + * @return integer + */ + public function getKeyline() + { + return $this->k; + } + + /** + * {@inheritdoc} + */ + public function getPalette() + { + return $this->palette; + } + + /** + * {@inheritdoc} + */ + public function getAlpha() + { + return null; + } + + /** + * {@inheritdoc} + */ + public function dissolve($alpha) + { + throw new RuntimeException('CMYK does not support dissolution'); + } + + /** + * {@inheritdoc} + */ + public function lighten($shade) + { + return $this->palette->color( + array( + $this->c, + $this->m, + $this->y, + max(0, $this->k - $shade), + ) + ); + } + + /** + * {@inheritdoc} + */ + public function darken($shade) + { + return $this->palette->color( + array( + $this->c, + $this->m, + $this->y, + min(100, $this->k + $shade), + ) + ); + } + + /** + * {@inheritdoc} + */ + public function grayscale() + { + $color = array( + $this->c * (1 - $this->k / 100) + $this->k, + $this->m * (1 - $this->k / 100) + $this->k, + $this->y * (1 - $this->k / 100) + $this->k, + ); + + $gray = min(100, round(0.299 * $color[0] + 0.587 * $color[1] + 0.114 * $color[2])); + + return $this->palette->color(array($gray, $gray, $gray, $this->k)); + } + + /** + * {@inheritdoc} + */ + public function isOpaque() + { + return true; + } + + /** + * Returns hex representation of the color + * + * @return string + */ + public function __toString() + { + return sprintf('cmyk(%d%%, %d%%, %d%%, %d%%)', $this->c, $this->m, $this->y, $this->k); + } + + /** + * Internal, Performs checks for color validity (an of array(C, M, Y, K)) + * + * @param array $color + * + * @throws InvalidArgumentException + */ + private function setColor(array $color) + { + if (count($color) !== 4) { + throw new InvalidArgumentException('Color argument must look like array(C, M, Y, K), where C, M, Y, K are the integer values between 0 and 255 for cyan, magenta, yellow and black color indexes accordingly'); + } + + $colors = array_values($color); + array_walk($colors, function ($color) { + return max(0, min(100, $color)); + }); + + list($this->c, $this->m, $this->y, $this->k) = $colors; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/ColorInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/ColorInterface.php new file mode 100755 index 00000000..8784c4ed --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/ColorInterface.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Palette\Color; + +use Imagine\Image\Palette\PaletteInterface; + +interface ColorInterface +{ + const COLOR_RED = 'red'; + const COLOR_GREEN = 'green'; + const COLOR_BLUE = 'blue'; + + const COLOR_CYAN = 'cyan'; + const COLOR_MAGENTA = 'magenta'; + const COLOR_YELLOW = 'yellow'; + const COLOR_KEYLINE = 'keyline'; + + const COLOR_GRAY = 'gray'; + + /** + * Return the value of one of the component. + * + * @param string $component One of the ColorInterface::COLOR_* component + * + * @return Integer + */ + public function getValue($component); + + /** + * Returns percentage of transparency of the color + * + * @return integer + */ + public function getAlpha(); + + /** + * Returns the palette attached to the current color + * + * @return PaletteInterface + */ + public function getPalette(); + + /** + * Returns a copy of current color, incrementing the alpha channel by the + * given amount + * + * @param integer $alpha + * + * @return ColorInterface + */ + public function dissolve($alpha); + + /** + * Returns a copy of the current color, lightened by the specified number + * of shades + * + * @param integer $shade + * + * @return ColorInterface + */ + public function lighten($shade); + + /** + * Returns a copy of the current color, darkened by the specified number of + * shades + * + * @param integer $shade + * + * @return ColorInterface + */ + public function darken($shade); + + /** + * Returns a gray related to the current color + * + * @return ColorInterface + */ + public function grayscale(); + + /** + * Checks if the current color is opaque + * + * @return Boolean + */ + public function isOpaque(); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/Gray.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/Gray.php new file mode 100755 index 00000000..c8096450 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/Gray.php @@ -0,0 +1,164 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Palette\Color; + +use Imagine\Image\Palette\Grayscale; +use Imagine\Exception\InvalidArgumentException; + +final class Gray implements ColorInterface +{ + /** + * @var integer + */ + private $gray; + + /** + * @var integer + */ + private $alpha; + + /** + * + * @var Grayscale + */ + private $palette; + + public function __construct(Grayscale $palette, array $color, $alpha) + { + $this->palette = $palette; + $this->setColor($color); + $this->setAlpha($alpha); + } + + /** + * {@inheritdoc} + */ + public function getValue($component) + { + switch ($component) { + case ColorInterface::COLOR_GRAY: + return $this->getGray(); + default: + throw new InvalidArgumentException(sprintf('Color component %s is not valid', $component)); + } + } + + /** + * Returns Gray value of the color + * + * @return integer + */ + public function getGray() + { + return $this->gray; + } + + /** + * {@inheritdoc} + */ + public function getPalette() + { + return $this->palette; + } + + /** + * {@inheritdoc} + */ + public function getAlpha() + { + return $this->alpha; + } + + /** + * {@inheritdoc} + */ + public function dissolve($alpha) + { + return $this->palette->color( + array($this->gray), $this->alpha + $alpha + ); + } + + /** + * {@inheritdoc} + */ + public function lighten($shade) + { + return $this->palette->color(array(min(255, $this->gray + $shade)), $this->alpha); + } + + /** + * {@inheritdoc} + */ + public function darken($shade) + { + return $this->palette->color(array(max(0, $this->gray - $shade)), $this->alpha); + } + + /** + * {@inheritdoc} + */ + public function grayscale() + { + return $this; + } + + /** + * {@inheritdoc} + */ + public function isOpaque() + { + return 100 === $this->alpha; + } + + /** + * Returns hex representation of the color + * + * @return string + */ + public function __toString() + { + return sprintf('#%02x%02x%02x', $this->gray, $this->gray, $this->gray); + } + + /** + * Performs checks for validity of given alpha value and sets it + * + * @param integer $alpha + * + * @throws InvalidArgumentException + */ + private function setAlpha($alpha) + { + if (!is_int($alpha) || $alpha < 0 || $alpha > 100) { + throw new InvalidArgumentException(sprintf('Alpha must be an integer between 0 and 100, %s given', $alpha)); + } + + $this->alpha = $alpha; + } + + /** + * Performs checks for color validity (array of array(gray)) + * + * @param array $color + * + * @throws InvalidArgumentException + */ + private function setColor(array $color) + { + if (count($color) !== 1) { + throw new InvalidArgumentException('Color argument must look like array(gray), where gray is the integer value between 0 and 255 for the grayscale'); + } + + list($this->gray) = array_values($color); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/RGB.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/RGB.php new file mode 100755 index 00000000..a0b4f0d0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/RGB.php @@ -0,0 +1,214 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Palette\Color; + +use Imagine\Image\Palette\RGB as RGBPalette; +use Imagine\Exception\InvalidArgumentException; + +final class RGB implements ColorInterface +{ + /** + * @var integer + */ + private $r; + + /** + * @var integer + */ + private $g; + + /** + * @var integer + */ + private $b; + + /** + * @var integer + */ + private $alpha; + + /** + * + * @var RGBPalette + */ + private $palette; + + public function __construct(RGBPalette $palette, array $color, $alpha) + { + $this->palette = $palette; + $this->setColor($color); + $this->setAlpha($alpha); + } + + /** + * {@inheritdoc} + */ + public function getValue($component) + { + switch ($component) { + case ColorInterface::COLOR_RED: + return $this->getRed(); + case ColorInterface::COLOR_GREEN: + return $this->getGreen(); + case ColorInterface::COLOR_BLUE: + return $this->getBlue(); + default: + throw new InvalidArgumentException(sprintf('Color component %s is not valid', $component)); + } + } + + /** + * Returns RED value of the color + * + * @return integer + */ + public function getRed() + { + return $this->r; + } + + /** + * Returns GREEN value of the color + * + * @return integer + */ + public function getGreen() + { + return $this->g; + } + + /** + * Returns BLUE value of the color + * + * @return integer + */ + public function getBlue() + { + return $this->b; + } + + /** + * {@inheritdoc} + */ + public function getPalette() + { + return $this->palette; + } + + /** + * {@inheritdoc} + */ + public function getAlpha() + { + return $this->alpha; + } + + /** + * {@inheritdoc} + */ + public function dissolve($alpha) + { + return $this->palette->color(array($this->r, $this->g, $this->b), $this->alpha + $alpha); + } + + /** + * {@inheritdoc} + */ + public function lighten($shade) + { + return $this->palette->color( + array( + min(255, $this->r + $shade), + min(255, $this->g + $shade), + min(255, $this->b + $shade), + ), $this->alpha + ); + } + + /** + * {@inheritdoc} + */ + public function darken($shade) + { + return $this->palette->color( + array( + max(0, $this->r - $shade), + max(0, $this->g - $shade), + max(0, $this->b - $shade), + ), $this->alpha + ); + } + + /** + * {@inheritdoc} + */ + public function grayscale() + { + $gray = min(255, round(0.299 * $this->getRed() + 0.114 * $this->getBlue() + 0.587 * $this->getGreen())); + + return $this->palette->color(array($gray, $gray, $gray), $this->alpha); + } + + /** + * {@inheritdoc} + */ + public function isOpaque() + { + return 100 === $this->alpha; + } + + /** + * Returns hex representation of the color + * + * @return string + */ + public function __toString() + { + return sprintf('#%02x%02x%02x', $this->r, $this->g, $this->b); + } + + /** + * Internal + * + * Performs checks for validity of given alpha value and sets it + * + * @param integer $alpha + * + * @throws InvalidArgumentException + */ + private function setAlpha($alpha) + { + if (!is_int($alpha) || $alpha < 0 || $alpha > 100) { + throw new InvalidArgumentException(sprintf('Alpha must be an integer between 0 and 100, %s given', $alpha)); + } + + $this->alpha = $alpha; + } + + /** + * Internal + * + * Performs checks for color validity (array of array(R, G, B)) + * + * @param array $color + * + * @throws InvalidArgumentException + */ + private function setColor(array $color) + { + if (count($color) !== 3) { + throw new InvalidArgumentException('Color argument must look like array(R, G, B), where R, G, B are the integer values between 0 and 255 for red, green and blue color indexes accordingly'); + } + + list($this->r, $this->g, $this->b) = array_values($color); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/ColorParser.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/ColorParser.php new file mode 100755 index 00000000..35cf4e95 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/ColorParser.php @@ -0,0 +1,153 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Palette; + +use Imagine\Exception\InvalidArgumentException; + +class ColorParser +{ + /** + * Parses a color to a RGB tuple + * + * @param string|array|integer $color + * + * @return array + * + * @throws InvalidArgumentException + */ + public function parseToRGB($color) + { + $color = $this->parse($color); + + if (4 === count($color)) { + $color = array( + 255 * (1 - $color[0] / 100) * (1 - $color[3] / 100), + 255 * (1 - $color[1] / 100) * (1 - $color[3] / 100), + 255 * (1 - $color[2] / 100) * (1 - $color[3] / 100), + ); + } + + return $color; + } + + /** + * Parses a color to a CMYK tuple + * + * @param string|array|integer $color + * + * @return array + * + * @throws InvalidArgumentException + */ + public function parseToCMYK($color) + { + $color = $this->parse($color); + + if (3 === count($color)) { + $r = $color[0] / 255; + $g = $color[1] / 255; + $b = $color[2] / 255; + + $k = 1 - max($r, $g, $b); + + $color = array( + 1 === $k ? 0 : round((1 - $r - $k) / (1- $k) * 100), + 1 === $k ? 0 : round((1 - $g - $k) / (1- $k) * 100), + 1 === $k ? 0 : round((1 - $b - $k) / (1- $k) * 100), + round($k * 100) + ); + } + + return $color; + } + + /** + * Parses a color to a grayscale value + * + * @param string|array|integer $color + * + * @return array + * + * @throws InvalidArgumentException + */ + public function parseToGrayscale($color) + { + if (is_array($color) && 1 === count($color)) { + return array_values($color); + } + + $color = array_unique($this->parse($color)); + + if (1 !== count($color)) { + throw new InvalidArgumentException('The provided color has different values of red, green and blue components. Grayscale colors must have the same values for these.'); + } + + return $color; + } + + /** + * Parses a color + * + * @param string|array|integer $color + * + * @return array + * + * @throws InvalidArgumentException + */ + private function parse($color) + { + if (!is_string($color) && !is_array($color) && !is_int($color)) { + throw new InvalidArgumentException(sprintf('Color must be specified as a hexadecimal string, array or integer, %s given', gettype($color))); + } + + if (is_array($color)) { + if (3 === count($color) || 4 === count($color)) { + return array_values($color); + } + throw new InvalidArgumentException('Color argument if array, must look like array(R, G, B), or array(C, M, Y, K) where R, G, B are the integer values between 0 and 255 for red, green and blue or cyan, magenta, yellow and black color indexes accordingly'); + } + + if (is_string($color)) { + if (0 === strpos($color, 'cmyk(')) { + $substrColor = substr($color, 5, strlen($color) - 6); + + $components = array_map(function ($component) { + return round(trim($component, ' %')); + }, explode(',', $substrColor)); + + if (count($components) !== 4) { + throw new InvalidArgumentException(sprintf('Unable to parse color %s', $color)); + } + + return $components; + } else { + $color = ltrim($color, '#'); + + if (strlen($color) !== 3 && strlen($color) !== 6) { + throw new InvalidArgumentException(sprintf('Color must be a hex value in regular (6 characters) or short (3 characters) notation, "%s" given', $color)); + } + + if (strlen($color) === 3) { + $color = $color[0] . $color[0] . $color[1] . $color[1] . $color[2] . $color[2]; + } + + $color = array_map('hexdec', str_split($color, 2)); + } + } + + if (is_int($color)) { + $color = array(255 & ($color >> 16), 255 & ($color >> 8), 255 & $color); + } + + return $color; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Grayscale.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Grayscale.php new file mode 100755 index 00000000..088b7909 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Grayscale.php @@ -0,0 +1,123 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Palette; + +use Imagine\Image\Palette\Color\Gray as GrayColor; +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Image\ProfileInterface; +use Imagine\Image\Profile; +use Imagine\Exception\RuntimeException; + +class Grayscale implements PaletteInterface +{ + /** + * @var ColorParser + */ + private $parser; + + /** + * @var ProfileInterface + */ + private $profile; + + /** + * @var array + */ + protected static $colors = array(); + + public function __construct() + { + $this->parser = new ColorParser(); + } + + /** + * {@inheritdoc} + */ + public function name() + { + return PaletteInterface::PALETTE_GRAYSCALE; + } + + /** + * {@inheritdoc} + */ + public function pixelDefinition() + { + return array(ColorInterface::COLOR_GRAY); + } + + /** + * {@inheritdoc} + */ + public function supportsAlpha() + { + return true; + } + + /** + * {@inheritdoc} + */ + public function useProfile(ProfileInterface $profile) + { + $this->profile = $profile; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function profile() + { + if (!$this->profile) { + $this->profile = Profile::fromPath(__DIR__ . '/../../resources/colormanagement.org/ISOcoated_v2_grey1c_bas.ICC'); + } + + return $this->profile; + } + + /** + * {@inheritdoc} + */ + public function color($color, $alpha = null) + { + if (null === $alpha) { + $alpha = 0; + } + + $color = $this->parser->parseToGrayscale($color); + $index = sprintf('#%02x%02x%02x-%d', $color[0], $color[0], $color[0], $alpha); + + if (false === array_key_exists($index, static::$colors)) { + static::$colors[$index] = new GrayColor($this, $color, $alpha); + } + + return static::$colors[$index]; + } + + /** + * {@inheritdoc} + */ + public function blend(ColorInterface $color1, ColorInterface $color2, $amount) + { + if (!$color1 instanceof GrayColor || ! $color2 instanceof GrayColor) { + throw new RuntimeException('Grayscale palette can only blend Grayscale colors'); + } + + return $this->color( + array( + (int) min(255, min($color1->getGray(), $color2->getGray()) + round(abs($color2->getGray() - $color1->getGray()) * $amount)), + ), + (int) min(100, min($color1->getAlpha(), $color2->getAlpha()) + round(abs($color2->getAlpha() - $color1->getAlpha()) * $amount)) + ); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/PaletteInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/PaletteInterface.php new file mode 100755 index 00000000..855c244c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/PaletteInterface.php @@ -0,0 +1,87 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Palette; + +use Imagine\Image\ProfileInterface; +use Imagine\Image\Palette\Color\ColorInterface; + +interface PaletteInterface +{ + const PALETTE_GRAYSCALE = 'gray'; + const PALETTE_RGB = 'rgb'; + const PALETTE_CMYK = 'cmyk'; + + /** + * Returns a color given some values + * + * @param string|array|integer $color A color + * @param integer|null $alpha Set alpha to null to disable it + * + * @return ColorInterface + * + * @throws InvalidArgumentException In case you pass an alpha value to a + * Palette that does not support alpha + */ + public function color($color, $alpha = null); + + /** + * Blend two colors given an amount + * + * @param ColorInterface $color1 + * @param ColorInterface $color2 + * @param float $amount The amount of color2 in color1 + * + * @return ColorInterface + */ + public function blend(ColorInterface $color1, ColorInterface $color2, $amount); + + /** + * Attachs an ICC profile to this Palette. + * + * (A default profile is provided by default) + * + * @param ProfileInterface $profile + * + * @return PaletteInterface + */ + public function useProfile(ProfileInterface $profile); + + /** + * Returns the ICC profile attached to this Palette. + * + * @return ProfileInterface + */ + public function profile(); + + /** + * Returns the name of this Palette, one of PaletteInterface::PALETTE_* + * constants + * + * @return String + */ + public function name(); + + /** + * Returns an array containing ColorInterface::COLOR_* constants that + * define the structure of colors for a pixel. + * + * @return array + */ + public function pixelDefinition(); + + /** + * Tells if alpha channel is supported in this palette + * + * @return Boolean + */ + public function supportsAlpha(); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/RGB.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/RGB.php new file mode 100755 index 00000000..0462ca4d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/RGB.php @@ -0,0 +1,129 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Palette; + +use Imagine\Image\Palette\Color\RGB as RGBColor; +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Image\ProfileInterface; +use Imagine\Image\Profile; +use Imagine\Exception\RuntimeException; + +class RGB implements PaletteInterface +{ + /** + * @var ColorParser + */ + private $parser; + + /** + * @var ProfileInterface + */ + private $profile; + + /** + * @var array + */ + protected static $colors = array(); + + public function __construct() + { + $this->parser = new ColorParser(); + } + + /** + * {@inheritdoc} + */ + public function name() + { + return PaletteInterface::PALETTE_RGB; + } + + /** + * {@inheritdoc} + */ + public function pixelDefinition() + { + return array( + ColorInterface::COLOR_RED, + ColorInterface::COLOR_GREEN, + ColorInterface::COLOR_BLUE, + ); + } + + /** + * {@inheritdoc} + */ + public function supportsAlpha() + { + return true; + } + + /** + * {@inheritdoc} + */ + public function useProfile(ProfileInterface $profile) + { + $this->profile = $profile; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function profile() + { + if (!$this->profile) { + $this->profile = Profile::fromPath(__DIR__ . '/../../resources/color.org/sRGB_IEC61966-2-1_black_scaled.icc'); + } + + return $this->profile; + } + + /** + * {@inheritdoc} + */ + public function color($color, $alpha = null) + { + if (null === $alpha) { + $alpha = 100; + } + + $color = $this->parser->parseToRGB($color); + $index = sprintf('#%02x%02x%02x-%d', $color[0], $color[1], $color[2], $alpha); + + if (false === array_key_exists($index, static::$colors)) { + static::$colors[$index] = new RGBColor($this, $color, $alpha); + } + + return static::$colors[$index]; + } + + /** + * {@inheritdoc} + */ + public function blend(ColorInterface $color1, ColorInterface $color2, $amount) + { + if (!$color1 instanceof RGBColor || ! $color2 instanceof RGBColor) { + throw new RuntimeException('RGB palette can only blend RGB colors'); + } + + return $this->color( + array( + (int) min(255, min($color1->getRed(), $color2->getRed()) + round(abs($color2->getRed() - $color1->getRed()) * $amount)), + (int) min(255, min($color1->getGreen(), $color2->getGreen()) + round(abs($color2->getGreen() - $color1->getGreen()) * $amount)), + (int) min(255, min($color1->getBlue(), $color2->getBlue()) + round(abs($color2->getBlue() - $color1->getBlue()) * $amount)), + ), + (int) min(100, min($color1->getAlpha(), $color2->getAlpha()) + round(abs($color2->getAlpha() - $color1->getAlpha()) * $amount)) + ); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Point.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Point.php new file mode 100755 index 00000000..abfc7c3a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Point.php @@ -0,0 +1,88 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image; + +use Imagine\Exception\InvalidArgumentException; + +/** + * The point class + */ +final class Point implements PointInterface +{ + /** + * @var integer + */ + private $x; + + /** + * @var integer + */ + private $y; + + /** + * Constructs a point of coordinates + * + * @param integer $x + * @param integer $y + * + * @throws InvalidArgumentException + */ + public function __construct($x, $y) + { + if ($x < 0 || $y < 0) { + throw new InvalidArgumentException(sprintf('A coordinate cannot be positioned outside of a bounding box (x: %s, y: %s given)', $x, $y)); + } + + $this->x = $x; + $this->y = $y; + } + + /** + * {@inheritdoc} + */ + public function getX() + { + return $this->x; + } + + /** + * {@inheritdoc} + */ + public function getY() + { + return $this->y; + } + + /** + * {@inheritdoc} + */ + public function in(BoxInterface $box) + { + return $this->x < $box->getWidth() && $this->y < $box->getHeight(); + } + + /** + * {@inheritdoc} + */ + public function move($amount) + { + return new Point($this->x + $amount, $this->y + $amount); + } + + /** + * {@inheritdoc} + */ + public function __toString() + { + return sprintf('(%d, %d)', $this->x, $this->y); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Point/Center.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Point/Center.php new file mode 100755 index 00000000..0e60349e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Point/Center.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image\Point; + +use Imagine\Image\BoxInterface; +use Imagine\Image\Point as OriginalPoint; +use Imagine\Image\PointInterface; + +/** + * Point center + */ +final class Center implements PointInterface +{ + /** + * @var BoxInterface + */ + private $box; + + /** + * Constructs coordinate with size instance, it needs to be relative to + * + * @param BoxInterface $box + */ + public function __construct(BoxInterface $box) + { + $this->box = $box; + } + + /** + * {@inheritdoc} + */ + public function getX() + { + return ceil($this->box->getWidth() / 2); + } + + /** + * {@inheritdoc} + */ + public function getY() + { + return ceil($this->box->getHeight() / 2); + } + + /** + * {@inheritdoc} + */ + public function in(BoxInterface $box) + { + return $this->getX() < $box->getWidth() && $this->getY() < $box->getHeight(); + } + + /** + * {@inheritdoc} + */ + public function move($amount) + { + return new OriginalPoint($this->getX() + $amount, $this->getY() + $amount); + } + + /** + * {@inheritdoc} + */ + public function __toString() + { + return sprintf('(%d, %d)', $this->getX(), $this->getY()); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/PointInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/PointInterface.php new file mode 100755 index 00000000..f35fa80d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/PointInterface.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image; + +/** + * The point interface + */ +interface PointInterface +{ + /** + * Gets points x coordinate + * + * @return integer + */ + public function getX(); + + /** + * Gets points y coordinate + * + * @return integer + */ + public function getY(); + + /** + * Checks if current coordinate is inside a given bo + * + * @param BoxInterface $box + * + * @return Boolean + */ + public function in(BoxInterface $box); + + /** + * Returns another point, moved by a given amount from current coordinates + * + * @param integer $amount + * @return ImageInterface + */ + public function move($amount); + + /** + * Gets a string representation for the current point + * + * @return string + */ + public function __toString(); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Profile.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Profile.php new file mode 100755 index 00000000..fda5415a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Profile.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image; + +use Imagine\Exception\InvalidArgumentException; + +class Profile implements ProfileInterface +{ + private $data; + private $name; + + public function __construct($name, $data) + { + $this->name = $name; + $this->data = $data; + } + + /** + * {@inheritdoc} + */ + public function name() + { + return $this->name; + } + + /** + * {@inheritdoc} + */ + public function data() + { + return $this->data; + } + + /** + * Creates a profile from a path to a file + * + * @param String $path + * + * @return Profile + * + * @throws InvalidArgumentException In case the provided path is not valid + */ + public static function fromPath($path) + { + if (!file_exists($path) || !is_file($path) || !is_readable($path)) { + throw new InvalidArgumentException(sprintf('Path %s is an invalid profile file or is not readable', $path)); + } + + return new static(basename($path), file_get_contents($path)); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ProfileInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ProfileInterface.php new file mode 100755 index 00000000..b2caa9c9 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ProfileInterface.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Image; + +interface ProfileInterface +{ + /** + * Returns the name of the profile + * + * @return String + */ + public function name(); + + /** + * Returns the profile data + * + * @return String + */ + public function data(); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Drawer.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Drawer.php new file mode 100755 index 00000000..2f863649 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Drawer.php @@ -0,0 +1,404 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Imagick; + +use Imagine\Draw\DrawerInterface; +use Imagine\Exception\InvalidArgumentException; +use Imagine\Exception\RuntimeException; +use Imagine\Image\AbstractFont; +use Imagine\Image\BoxInterface; +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Image\Point; +use Imagine\Image\PointInterface; + +/** + * Drawer implementation using the Imagick PHP extension + */ +final class Drawer implements DrawerInterface +{ + /** + * @var Imagick + */ + private $imagick; + + /** + * @param \Imagick $imagick + */ + public function __construct(\Imagick $imagick) + { + $this->imagick = $imagick; + } + + /** + * {@inheritdoc} + */ + public function arc(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $thickness = 1) + { + $x = $center->getX(); + $y = $center->getY(); + $width = $size->getWidth(); + $height = $size->getHeight(); + + try { + $pixel = $this->getColor($color); + $arc = new \ImagickDraw(); + + $arc->setStrokeColor($pixel); + $arc->setStrokeWidth(max(1, (int) $thickness)); + $arc->setFillColor('transparent'); + $arc->arc($x - $width / 2, $y - $height / 2, $x + $width / 2, $y + $height / 2, $start, $end); + + $this->imagick->drawImage($arc); + + $pixel->clear(); + $pixel->destroy(); + + $arc->clear(); + $arc->destroy(); + } catch (\ImagickException $e) { + throw new RuntimeException('Draw arc operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function chord(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1) + { + $x = $center->getX(); + $y = $center->getY(); + $width = $size->getWidth(); + $height = $size->getHeight(); + + try { + $pixel = $this->getColor($color); + $chord = new \ImagickDraw(); + + $chord->setStrokeColor($pixel); + $chord->setStrokeWidth(max(1, (int) $thickness)); + + if ($fill) { + $chord->setFillColor($pixel); + } else { + $this->line( + new Point(round($x + $width / 2 * cos(deg2rad($start))), round($y + $height / 2 * sin(deg2rad($start)))), + new Point(round($x + $width / 2 * cos(deg2rad($end))), round($y + $height / 2 * sin(deg2rad($end)))), + $color + ); + + $chord->setFillColor('transparent'); + } + + $chord->arc( + $x - $width / 2, + $y - $height / 2, + $x + $width / 2, + $y + $height / 2, + $start, + $end + ); + + $this->imagick->drawImage($chord); + + $pixel->clear(); + $pixel->destroy(); + + $chord->clear(); + $chord->destroy(); + } catch (\ImagickException $e) { + throw new RuntimeException('Draw chord operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function ellipse(PointInterface $center, BoxInterface $size, ColorInterface $color, $fill = false, $thickness = 1) + { + $width = $size->getWidth(); + $height = $size->getHeight(); + + try { + $pixel = $this->getColor($color); + $ellipse = new \ImagickDraw(); + + $ellipse->setStrokeColor($pixel); + $ellipse->setStrokeWidth(max(1, (int) $thickness)); + + if ($fill) { + $ellipse->setFillColor($pixel); + } else { + $ellipse->setFillColor('transparent'); + } + + $ellipse->ellipse( + $center->getX(), + $center->getY(), + $width / 2, + $height / 2, + 0, 360 + ); + + if (false === $this->imagick->drawImage($ellipse)) { + throw new RuntimeException('Ellipse operation failed'); + } + + $pixel->clear(); + $pixel->destroy(); + + $ellipse->clear(); + $ellipse->destroy(); + } catch (\ImagickException $e) { + throw new RuntimeException('Draw ellipse operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function line(PointInterface $start, PointInterface $end, ColorInterface $color, $thickness = 1) + { + try { + $pixel = $this->getColor($color); + $line = new \ImagickDraw(); + + $line->setStrokeColor($pixel); + $line->setStrokeWidth(max(1, (int) $thickness)); + $line->setFillColor($pixel); + $line->line( + $start->getX(), + $start->getY(), + $end->getX(), + $end->getY() + ); + + $this->imagick->drawImage($line); + + $pixel->clear(); + $pixel->destroy(); + + $line->clear(); + $line->destroy(); + } catch (\ImagickException $e) { + throw new RuntimeException('Draw line operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function pieSlice(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1) + { + $width = $size->getWidth(); + $height = $size->getHeight(); + + $x1 = round($center->getX() + $width / 2 * cos(deg2rad($start))); + $y1 = round($center->getY() + $height / 2 * sin(deg2rad($start))); + $x2 = round($center->getX() + $width / 2 * cos(deg2rad($end))); + $y2 = round($center->getY() + $height / 2 * sin(deg2rad($end))); + + if ($fill) { + $this->chord($center, $size, $start, $end, $color, true, $thickness); + $this->polygon( + array( + $center, + new Point($x1, $y1), + new Point($x2, $y2), + ), + $color, + true, + $thickness + ); + } else { + $this->arc($center, $size, $start, $end, $color, $thickness); + $this->line($center, new Point($x1, $y1), $color, $thickness); + $this->line($center, new Point($x2, $y2), $color, $thickness); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function dot(PointInterface $position, ColorInterface $color) + { + $x = $position->getX(); + $y = $position->getY(); + + try { + $pixel = $this->getColor($color); + $point = new \ImagickDraw(); + + $point->setFillColor($pixel); + $point->point($x, $y); + + $this->imagick->drawimage($point); + + $pixel->clear(); + $pixel->destroy(); + + $point->clear(); + $point->destroy(); + } catch (\ImagickException $e) { + throw new RuntimeException('Draw point operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function polygon(array $coordinates, ColorInterface $color, $fill = false, $thickness = 1) + { + if (count($coordinates) < 3) { + throw new InvalidArgumentException(sprintf('Polygon must consist of at least 3 coordinates, %d given', count($coordinates))); + } + + $points = array_map(function (PointInterface $p) { + return array('x' => $p->getX(), 'y' => $p->getY()); + }, $coordinates); + + try { + $pixel = $this->getColor($color); + $polygon = new \ImagickDraw(); + + $polygon->setStrokeColor($pixel); + $polygon->setStrokeWidth(max(1, (int) $thickness)); + + if ($fill) { + $polygon->setFillColor($pixel); + } else { + $polygon->setFillColor('transparent'); + } + + $polygon->polygon($points); + $this->imagick->drawImage($polygon); + + $pixel->clear(); + $pixel->destroy(); + + $polygon->clear(); + $polygon->destroy(); + } catch (\ImagickException $e) { + throw new RuntimeException('Draw polygon operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function text($string, AbstractFont $font, PointInterface $position, $angle = 0, $width = null) + { + try { + $pixel = $this->getColor($font->getColor()); + $text = new \ImagickDraw(); + + $text->setFont($font->getFile()); + /** + * @see http://www.php.net/manual/en/imagick.queryfontmetrics.php#101027 + * + * ensure font resolution is the same as GD's hard-coded 96 + */ + if (version_compare(phpversion("imagick"), "3.0.2", ">=")) { + $text->setResolution(96, 96); + $text->setFontSize($font->getSize()); + } else { + $text->setFontSize((int) ($font->getSize() * (96 / 72))); + } + $text->setFillColor($pixel); + $text->setTextAntialias(true); + + $info = $this->imagick->queryFontMetrics($text, $string); + $rad = deg2rad($angle); + $cos = cos($rad); + $sin = sin($rad); + + // round(0 * $cos - 0 * $sin) + $x1 = 0; + $x2 = round($info['characterWidth'] * $cos - $info['characterHeight'] * $sin); + // round(0 * $sin + 0 * $cos) + $y1 = 0; + $y2 = round($info['characterWidth'] * $sin + $info['characterHeight'] * $cos); + + $xdiff = 0 - min($x1, $x2); + $ydiff = 0 - min($y1, $y2); + + if ($width !== null) { + $string = $this->wrapText($string, $text, $angle, $width); + } + + $this->imagick->annotateImage( + $text, $position->getX() + $x1 + $xdiff, + $position->getY() + $y2 + $ydiff, $angle, $string + ); + + $pixel->clear(); + $pixel->destroy(); + + $text->clear(); + $text->destroy(); + } catch (\ImagickException $e) { + throw new RuntimeException('Draw text operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * Gets specifically formatted color string from ColorInterface instance + * + * @param ColorInterface $color + * + * @return string + */ + private function getColor(ColorInterface $color) + { + $pixel = new \ImagickPixel((string) $color); + $pixel->setColorValue(\Imagick::COLOR_ALPHA, $color->getAlpha() / 100); + + return $pixel; + } + + /** + * Internal + * + * Fits a string into box with given width + */ + private function wrapText($string, $text, $angle, $width) + { + $result = ''; + $words = explode(' ', $string); + foreach ($words as $word) { + $teststring = $result . ' ' . $word; + $testbox = $this->imagick->queryFontMetrics($text, $teststring, true); + if ($testbox['textWidth'] > $width) { + $result .= ($result == '' ? '' : "\n") . $word; + } else { + $result .= ($result == '' ? '' : ' ') . $word; + } + } + + return $result; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Effects.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Effects.php new file mode 100755 index 00000000..debe32a6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Effects.php @@ -0,0 +1,113 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Imagick; + +use Imagine\Effects\EffectsInterface; +use Imagine\Exception\RuntimeException; +use Imagine\Image\Palette\Color\ColorInterface; + +/** + * Effects implementation using the Imagick PHP extension + */ +class Effects implements EffectsInterface +{ + private $imagick; + + public function __construct(\Imagick $imagick) + { + $this->imagick = $imagick; + } + + /** + * {@inheritdoc} + */ + public function gamma($correction) + { + try { + $this->imagick->gammaImage($correction, \Imagick::CHANNEL_ALL); + } catch (\ImagickException $e) { + throw new RuntimeException('Failed to apply gamma correction to the image'); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function negative() + { + try { + $this->imagick->negateImage(false, \Imagick::CHANNEL_ALL); + } catch (\ImagickException $e) { + throw new RuntimeException('Failed to negate the image'); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function grayscale() + { + try { + $this->imagick->setImageType(\Imagick::IMGTYPE_GRAYSCALE); + } catch (\ImagickException $e) { + throw new RuntimeException('Failed to grayscale the image'); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function colorize(ColorInterface $color) + { + try { + $this->imagick->colorizeImage((string) $color, 1); + } catch (\ImagickException $e) { + throw new RuntimeException('Failed to colorize the image'); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function sharpen() + { + try { + $this->imagick->sharpenImage(2, 1); + } catch (\ImagickException $e) { + throw new RuntimeException('Failed to sharpen the image'); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function blur($sigma = 1) + { + try { + $this->imagick->gaussianBlurImage(0, $sigma); + } catch (\ImagickException $e) { + throw new RuntimeException('Failed to blur the image', $e->getCode(), $e); + } + + return $this; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Font.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Font.php new file mode 100755 index 00000000..3fc41dd2 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Font.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Imagick; + +use Imagine\Image\AbstractFont; +use Imagine\Image\Box; +use Imagine\Image\Palette\Color\ColorInterface; + +/** + * Font implementation using the Imagick PHP extension + */ +final class Font extends AbstractFont +{ + /** + * @var \Imagick + */ + private $imagick; + + /** + * @param \Imagick $imagick + * @param string $file + * @param integer $size + * @param ColorInterface $color + */ + public function __construct(\Imagick $imagick, $file, $size, ColorInterface $color) + { + $this->imagick = $imagick; + + parent::__construct($file, $size, $color); + } + + /** + * {@inheritdoc} + */ + public function box($string, $angle = 0) + { + $text = new \ImagickDraw(); + + $text->setFont($this->file); + + /** + * @see http://www.php.net/manual/en/imagick.queryfontmetrics.php#101027 + * + * ensure font resolution is the same as GD's hard-coded 96 + */ + if (version_compare(phpversion("imagick"), "3.0.2", ">=")) { + $text->setResolution(96, 96); + $text->setFontSize($this->size); + } else { + $text->setFontSize((int) ($this->size * (96 / 72))); + } + + $info = $this->imagick->queryFontMetrics($text, $string); + + $box = new Box($info['textWidth'], $info['textHeight']); + + return $box; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Image.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Image.php new file mode 100755 index 00000000..c94f605d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Image.php @@ -0,0 +1,880 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Imagick; + +use Imagine\Exception\OutOfBoundsException; +use Imagine\Exception\InvalidArgumentException; +use Imagine\Exception\RuntimeException; +use Imagine\Image\AbstractImage; +use Imagine\Image\Box; +use Imagine\Image\BoxInterface; +use Imagine\Image\Metadata\MetadataBag; +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Image\Fill\FillInterface; +use Imagine\Image\Fill\Gradient\Horizontal; +use Imagine\Image\Fill\Gradient\Linear; +use Imagine\Image\Point; +use Imagine\Image\PointInterface; +use Imagine\Image\ProfileInterface; +use Imagine\Image\ImageInterface; +use Imagine\Image\Palette\PaletteInterface; + +/** + * Image implementation using the Imagick PHP extension + */ +final class Image extends AbstractImage +{ + /** + * @var \Imagick + */ + private $imagick; + /** + * @var Layers + */ + private $layers; + /** + * @var PaletteInterface + */ + private $palette; + + /** + * @var Boolean + */ + private static $supportsColorspaceConversion; + + private static $colorspaceMapping = array( + PaletteInterface::PALETTE_CMYK => \Imagick::COLORSPACE_CMYK, + PaletteInterface::PALETTE_RGB => \Imagick::COLORSPACE_RGB, + PaletteInterface::PALETTE_GRAYSCALE => \Imagick::COLORSPACE_GRAY, + ); + + /** + * Constructs a new Image instance + * + * @param \Imagick $imagick + * @param PaletteInterface $palette + * @param MetadataBag $metadata + */ + public function __construct(\Imagick $imagick, PaletteInterface $palette, MetadataBag $metadata) + { + $this->metadata = $metadata; + $this->detectColorspaceConversionSupport(); + $this->imagick = $imagick; + if (static::$supportsColorspaceConversion) { + $this->setColorspace($palette); + } + $this->palette = $palette; + $this->layers = new Layers($this, $this->palette, $this->imagick); + } + + /** + * Destroys allocated imagick resources + */ + public function __destruct() + { + if ($this->imagick instanceof \Imagick) { + $this->imagick->clear(); + $this->imagick->destroy(); + } + } + + /** + * Returns the underlying \Imagick instance + * + * @return \Imagick + */ + public function getImagick() + { + return $this->imagick; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function copy() + { + try { + if (version_compare(phpversion("imagick"), "3.1.0b1", ">=") || defined("HHVM_VERSION")) { + $clone = clone $this->imagick; + } else { + $clone = $this->imagick->clone(); + } + } catch (\ImagickException $e) { + throw new RuntimeException('Copy operation failed', $e->getCode(), $e); + } + + return new self($clone, $this->palette, clone $this->metadata); + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function crop(PointInterface $start, BoxInterface $size) + { + if (!$start->in($this->getSize())) { + throw new OutOfBoundsException('Crop coordinates must start at minimum 0, 0 position from top left corner, crop height and width must be positive integers and must not exceed the current image borders'); + } + + try { + $this->imagick->cropImage($size->getWidth(), $size->getHeight(), $start->getX(), $start->getY()); + // Reset canvas for gif format + $this->imagick->setImagePage(0, 0, 0, 0); + } catch (\ImagickException $e) { + throw new RuntimeException('Crop operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function flipHorizontally() + { + try { + $this->imagick->flopImage(); + } catch (\ImagickException $e) { + throw new RuntimeException('Horizontal Flip operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function flipVertically() + { + try { + $this->imagick->flipImage(); + } catch (\ImagickException $e) { + throw new RuntimeException('Vertical flip operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function strip() + { + try { + try { + $this->profile($this->palette->profile()); + } catch (\Exception $e) { + // here we discard setting the profile as the previous incorporated profile + // is corrupted, let's now strip the image + } + $this->imagick->stripImage(); + } catch (\ImagickException $e) { + throw new RuntimeException('Strip operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function paste(ImageInterface $image, PointInterface $start) + { + if (!$image instanceof self) { + throw new InvalidArgumentException(sprintf('Imagick\Image can only paste() Imagick\Image instances, %s given', get_class($image))); + } + + if (!$this->getSize()->contains($image->getSize(), $start)) { + throw new OutOfBoundsException('Cannot paste image of the given size at the specified position, as it moves outside of the current image\'s box'); + } + + try { + $this->imagick->compositeImage($image->imagick, \Imagick::COMPOSITE_DEFAULT, $start->getX(), $start->getY()); + } catch (\ImagickException $e) { + throw new RuntimeException('Paste operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function resize(BoxInterface $size, $filter = ImageInterface::FILTER_UNDEFINED) + { + try { + $this->imagick->resizeImage($size->getWidth(), $size->getHeight(), $this->getFilter($filter), 1); + } catch (\ImagickException $e) { + throw new RuntimeException('Resize operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function rotate($angle, ColorInterface $background = null) + { + $color = $background ? $background : $this->palette->color('fff'); + + try { + $pixel = $this->getColor($color); + + $this->imagick->rotateimage($pixel, $angle); + + $pixel->clear(); + $pixel->destroy(); + } catch (\ImagickException $e) { + throw new RuntimeException('Rotate operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function save($path = null, array $options = array()) + { + $path = null === $path ? $this->imagick->getImageFilename() : $path; + if (null === $path) { + throw new RuntimeException('You can omit save path only if image has been open from a file'); + } + + try { + $this->prepareOutput($options, $path); + $this->imagick->writeImages($path, true); + } catch (\ImagickException $e) { + throw new RuntimeException('Save operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function show($format, array $options = array()) + { + header('Content-type: '.$this->getMimeType($format)); + echo $this->get($format, $options); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function get($format, array $options = array()) + { + try { + $options['format'] = $format; + $this->prepareOutput($options); + } catch (\ImagickException $e) { + throw new RuntimeException('Get operation failed', $e->getCode(), $e); + } + + return $this->imagick->getImagesBlob(); + } + + /** + * {@inheritdoc} + */ + public function interlace($scheme) + { + static $supportedInterlaceSchemes = array( + ImageInterface::INTERLACE_NONE => \Imagick::INTERLACE_NO, + ImageInterface::INTERLACE_LINE => \Imagick::INTERLACE_LINE, + ImageInterface::INTERLACE_PLANE => \Imagick::INTERLACE_PLANE, + ImageInterface::INTERLACE_PARTITION => \Imagick::INTERLACE_PARTITION, + ); + + if (!array_key_exists($scheme, $supportedInterlaceSchemes)) { + throw new InvalidArgumentException('Unsupported interlace type'); + } + + $this->imagick->setInterlaceScheme($supportedInterlaceSchemes[$scheme]); + + return $this; + } + + /** + * @param array $options + * @param string $path + */ + private function prepareOutput(array $options, $path = null) + { + if (isset($options['format'])) { + $this->imagick->setImageFormat($options['format']); + } + + if (isset($options['animated']) && true === $options['animated']) { + $format = isset($options['format']) ? $options['format'] : 'gif'; + $delay = isset($options['animated.delay']) ? $options['animated.delay'] : null; + $loops = isset($options['animated.loops']) ? $options['animated.loops'] : 0; + + $options['flatten'] = false; + + $this->layers->animate($format, $delay, $loops); + } else { + $this->layers->merge(); + } + $this->applyImageOptions($this->imagick, $options, $path); + + // flatten only if image has multiple layers + if ((!isset($options['flatten']) || $options['flatten'] === true) && count($this->layers) > 1) { + $this->flatten(); + } + } + + /** + * {@inheritdoc} + */ + public function __toString() + { + return $this->get('png'); + } + + /** + * {@inheritdoc} + */ + public function draw() + { + return new Drawer($this->imagick); + } + + /** + * {@inheritdoc} + */ + public function effects() + { + return new Effects($this->imagick); + } + + /** + * {@inheritdoc} + */ + public function getSize() + { + try { + $i = $this->imagick->getIteratorIndex(); + $this->imagick->rewind(); + $width = $this->imagick->getImageWidth(); + $height = $this->imagick->getImageHeight(); + $this->imagick->setIteratorIndex($i); + } catch (\ImagickException $e) { + throw new RuntimeException('Could not get size', $e->getCode(), $e); + } + + return new Box($width, $height); + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function applyMask(ImageInterface $mask) + { + if (!$mask instanceof self) { + throw new InvalidArgumentException('Can only apply instances of Imagine\Imagick\Image as masks'); + } + + $size = $this->getSize(); + $maskSize = $mask->getSize(); + + if ($size != $maskSize) { + throw new InvalidArgumentException(sprintf('The given mask doesn\'t match current image\'s size, Current mask\'s dimensions are %s, while image\'s dimensions are %s', $maskSize, $size)); + } + + $mask = $mask->mask(); + $mask->imagick->negateImage(true); + + try { + // remove transparent areas of the original from the mask + $mask->imagick->compositeImage($this->imagick, \Imagick::COMPOSITE_DSTIN, 0, 0); + $this->imagick->compositeImage($mask->imagick, \Imagick::COMPOSITE_COPYOPACITY, 0, 0); + + $mask->imagick->clear(); + $mask->imagick->destroy(); + } catch (\ImagickException $e) { + throw new RuntimeException('Apply mask operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function mask() + { + $mask = $this->copy(); + + try { + $mask->imagick->modulateImage(100, 0, 100); + $mask->imagick->setImageMatte(false); + } catch (\ImagickException $e) { + throw new RuntimeException('Mask operation failed', $e->getCode(), $e); + } + + return $mask; + } + + /** + * {@inheritdoc} + * + * @return ImageInterface + */ + public function fill(FillInterface $fill) + { + try { + if ($this->isLinearOpaque($fill)) { + $this->applyFastLinear($fill); + } else { + $iterator = $this->imagick->getPixelIterator(); + + foreach ($iterator as $y => $pixels) { + foreach ($pixels as $x => $pixel) { + $color = $fill->getColor(new Point($x, $y)); + + $pixel->setColor((string) $color); + $pixel->setColorValue(\Imagick::COLOR_ALPHA, $color->getAlpha() / 100); + } + + $iterator->syncIterator(); + } + } + } catch (\ImagickException $e) { + throw new RuntimeException('Fill operation failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function histogram() + { + try { + $pixels = $this->imagick->getImageHistogram(); + } catch (\ImagickException $e) { + throw new RuntimeException('Error while fetching histogram', $e->getCode(), $e); + } + + $image = $this; + + return array_map(function (\ImagickPixel $pixel) use ($image) { + return $image->pixelToColor($pixel); + },$pixels); + } + + /** + * {@inheritdoc} + */ + public function getColorAt(PointInterface $point) + { + if (!$point->in($this->getSize())) { + throw new RuntimeException(sprintf('Error getting color at point [%s,%s]. The point must be inside the image of size [%s,%s]', $point->getX(), $point->getY(), $this->getSize()->getWidth(), $this->getSize()->getHeight())); + } + + try { + $pixel = $this->imagick->getImagePixelColor($point->getX(), $point->getY()); + } catch (\ImagickException $e) { + throw new RuntimeException('Error while getting image pixel color', $e->getCode(), $e); + } + + return $this->pixelToColor($pixel); + } + + /** + * Returns a color given a pixel, depending the Palette context + * + * Note : this method is public for PHP 5.3 compatibility + * + * @param \ImagickPixel $pixel + * + * @return ColorInterface + * + * @throws InvalidArgumentException In case a unknown color is requested + */ + public function pixelToColor(\ImagickPixel $pixel) + { + static $colorMapping = array( + ColorInterface::COLOR_RED => \Imagick::COLOR_RED, + ColorInterface::COLOR_GREEN => \Imagick::COLOR_GREEN, + ColorInterface::COLOR_BLUE => \Imagick::COLOR_BLUE, + ColorInterface::COLOR_CYAN => \Imagick::COLOR_CYAN, + ColorInterface::COLOR_MAGENTA => \Imagick::COLOR_MAGENTA, + ColorInterface::COLOR_YELLOW => \Imagick::COLOR_YELLOW, + ColorInterface::COLOR_KEYLINE => \Imagick::COLOR_BLACK, + // There is no gray component in \Imagick, let's use one of the RGB comp + ColorInterface::COLOR_GRAY => \Imagick::COLOR_RED, + ); + + $alpha = $this->palette->supportsAlpha() ? (int) round($pixel->getColorValue(\Imagick::COLOR_ALPHA) * 100) : null; + $palette = $this->palette(); + + return $this->palette->color(array_map(function ($color) use ($palette, $pixel, $colorMapping) { + if (!isset($colorMapping[$color])) { + throw new InvalidArgumentException(sprintf('Color %s is not mapped in Imagick', $color)); + } + $multiplier = 255; + if ($palette->name() === PaletteInterface::PALETTE_CMYK) { + $multiplier = 100; + } + + return $pixel->getColorValue($colorMapping[$color]) * $multiplier; + }, $this->palette->pixelDefinition()), $alpha); + } + + /** + * {@inheritdoc} + */ + public function layers() + { + return $this->layers; + } + + /** + * {@inheritdoc} + */ + public function usePalette(PaletteInterface $palette) + { + if (!isset(static::$colorspaceMapping[$palette->name()])) { + throw new InvalidArgumentException(sprintf('The palette %s is not supported by Imagick driver', $palette->name())); + } + + if ($this->palette->name() === $palette->name()) { + return $this; + } + + if (!static::$supportsColorspaceConversion) { + throw new RuntimeException('Your version of Imagick does not support colorspace conversions.'); + } + + try { + try { + $hasICCProfile = (Boolean) $this->imagick->getImageProfile('icc'); + } catch (\ImagickException $e) { + $hasICCProfile = false; + } + + if (!$hasICCProfile) { + $this->profile($this->palette->profile()); + } + + $this->profile($palette->profile()); + $this->setColorspace($palette); + } catch (\ImagickException $e) { + throw new RuntimeException('Failed to set colorspace', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function palette() + { + return $this->palette; + } + + /** + * {@inheritdoc} + */ + public function profile(ProfileInterface $profile) + { + try { + $this->imagick->profileImage('icc', $profile->data()); + } catch (\ImagickException $e) { + throw new RuntimeException(sprintf('Unable to add profile %s to image', $profile->name()), $e->getCode(), $e); + } + + return $this; + } + + /** + * Internal + * + * Flatten the image. + */ + private function flatten() + { + /** + * @see https://github.com/mkoppanen/imagick/issues/45 + */ + try { + if (method_exists($this->imagick, 'mergeImageLayers') && defined('Imagick::LAYERMETHOD_UNDEFINED')) { + $this->imagick = $this->imagick->mergeImageLayers(\Imagick::LAYERMETHOD_UNDEFINED); + } elseif (method_exists($this->imagick, 'flattenImages')) { + $this->imagick = $this->imagick->flattenImages(); + } + } catch (\ImagickException $e) { + throw new RuntimeException('Flatten operation failed', $e->getCode(), $e); + } + } + + /** + * Internal + * + * Applies options before save or output + * + * @param \Imagick $image + * @param array $options + * @param string $path + * + * @throws InvalidArgumentException + * @throws RuntimeException + */ + private function applyImageOptions(\Imagick $image, array $options, $path) + { + if (isset($options['format'])) { + $format = $options['format']; + } elseif ('' !== $extension = pathinfo($path, \PATHINFO_EXTENSION)) { + $format = $extension; + } else { + $format = pathinfo($image->getImageFilename(), \PATHINFO_EXTENSION); + } + + $format = strtolower($format); + + $options = $this->updateSaveOptions($options); + + if (isset($options['jpeg_quality']) && in_array($format, array('jpeg', 'jpg', 'pjpeg'))) { + $image->setImageCompressionQuality($options['jpeg_quality']); + } + + if ((isset($options['png_compression_level']) || isset($options['png_compression_filter'])) && $format === 'png') { + // first digit: compression level (default: 7) + if (isset($options['png_compression_level'])) { + if ($options['png_compression_level'] < 0 || $options['png_compression_level'] > 9) { + throw new InvalidArgumentException('png_compression_level option should be an integer from 0 to 9'); + } + $compression = $options['png_compression_level'] * 10; + } else { + $compression = 70; + } + + // second digit: compression filter (default: 5) + if (isset($options['png_compression_filter'])) { + if ($options['png_compression_filter'] < 0 || $options['png_compression_filter'] > 9) { + throw new InvalidArgumentException('png_compression_filter option should be an integer from 0 to 9'); + } + $compression += $options['png_compression_filter']; + } else { + $compression += 5; + } + + $image->setImageCompressionQuality($compression); + } + + if (isset($options['resolution-units']) && isset($options['resolution-x']) && isset($options['resolution-y'])) { + if ($options['resolution-units'] == ImageInterface::RESOLUTION_PIXELSPERCENTIMETER) { + $image->setImageUnits(\Imagick::RESOLUTION_PIXELSPERCENTIMETER); + } elseif ($options['resolution-units'] == ImageInterface::RESOLUTION_PIXELSPERINCH) { + $image->setImageUnits(\Imagick::RESOLUTION_PIXELSPERINCH); + } else { + throw new RuntimeException('Unsupported image unit format'); + } + + $filter = ImageInterface::FILTER_UNDEFINED; + if (!empty($options['resampling-filter'])) { + $filter = $options['resampling-filter']; + } + + $image->setImageResolution($options['resolution-x'], $options['resolution-y']); + $image->resampleImage($options['resolution-x'], $options['resolution-y'], $this->getFilter($filter), 0); + } + } + + /** + * Gets specifically formatted color string from Color instance + * + * @param ColorInterface $color + * + * @return \ImagickPixel + */ + private function getColor(ColorInterface $color) + { + $pixel = new \ImagickPixel((string) $color); + $pixel->setColorValue(\Imagick::COLOR_ALPHA, $color->getAlpha() / 100); + + return $pixel; + } + + /** + * Checks whether given $fill is linear and opaque + * + * @param FillInterface $fill + * + * @return Boolean + */ + private function isLinearOpaque(FillInterface $fill) + { + return $fill instanceof Linear && $fill->getStart()->isOpaque() && $fill->getEnd()->isOpaque(); + } + + /** + * Performs optimized gradient fill for non-opaque linear gradients + * + * @param Linear $fill + */ + private function applyFastLinear(Linear $fill) + { + $gradient = new \Imagick(); + $size = $this->getSize(); + $color = sprintf('gradient:%s-%s', (string) $fill->getStart(), (string) $fill->getEnd()); + + if ($fill instanceof Horizontal) { + $gradient->newPseudoImage($size->getHeight(), $size->getWidth(), $color); + $gradient->rotateImage(new \ImagickPixel(), 90); + } else { + $gradient->newPseudoImage($size->getWidth(), $size->getHeight(), $color); + } + + $this->imagick->compositeImage($gradient, \Imagick::COMPOSITE_OVER, 0, 0); + $gradient->clear(); + $gradient->destroy(); + } + + /** + * Internal + * + * Get the mime type based on format. + * + * @param string $format + * + * @return string mime-type + * + * @throws RuntimeException + */ + private function getMimeType($format) + { + static $mimeTypes = array( + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'gif' => 'image/gif', + 'png' => 'image/png', + 'wbmp' => 'image/vnd.wap.wbmp', + 'xbm' => 'image/xbm', + ); + + if (!isset($mimeTypes[$format])) { + throw new RuntimeException(sprintf('Unsupported format given. Only %s are supported, %s given', implode(", ", array_keys($mimeTypes)), $format)); + } + + return $mimeTypes[$format]; + } + + /** + * Sets colorspace and image type, assigns the palette. + * + * @param PaletteInterface $palette + * + * @throws InvalidArgumentException + */ + private function setColorspace(PaletteInterface $palette) + { + static $typeMapping = array( + // We use Matte variants to preserve alpha + PaletteInterface::PALETTE_CMYK => \Imagick::IMGTYPE_TRUECOLORMATTE, + PaletteInterface::PALETTE_RGB => \Imagick::IMGTYPE_TRUECOLORMATTE, + PaletteInterface::PALETTE_GRAYSCALE => \Imagick::IMGTYPE_GRAYSCALEMATTE, + ); + + if (!isset(static::$colorspaceMapping[$palette->name()])) { + throw new InvalidArgumentException(sprintf('The palette %s is not supported by Imagick driver', $palette->name())); + } + + $this->imagick->setType($typeMapping[$palette->name()]); + $this->imagick->setColorspace(static::$colorspaceMapping[$palette->name()]); + $this->palette = $palette; + } + + /** + * Older imagemagick versions does not support colorspace conversions. + * Let's detect if it is supported. + * + * @return Boolean + */ + private function detectColorspaceConversionSupport() + { + if (null !== static::$supportsColorspaceConversion) { + return static::$supportsColorspaceConversion; + } + + return static::$supportsColorspaceConversion = method_exists('Imagick', 'setColorspace'); + } + + /** + * Returns the filter if it's supported. + * + * @param string $filter + * + * @return string + * + * @throws InvalidArgumentException If the filter is unsupported. + */ + private function getFilter($filter = ImageInterface::FILTER_UNDEFINED) + { + static $supportedFilters = array( + ImageInterface::FILTER_UNDEFINED => \Imagick::FILTER_UNDEFINED, + ImageInterface::FILTER_BESSEL => \Imagick::FILTER_BESSEL, + ImageInterface::FILTER_BLACKMAN => \Imagick::FILTER_BLACKMAN, + ImageInterface::FILTER_BOX => \Imagick::FILTER_BOX, + ImageInterface::FILTER_CATROM => \Imagick::FILTER_CATROM, + ImageInterface::FILTER_CUBIC => \Imagick::FILTER_CUBIC, + ImageInterface::FILTER_GAUSSIAN => \Imagick::FILTER_GAUSSIAN, + ImageInterface::FILTER_HANNING => \Imagick::FILTER_HANNING, + ImageInterface::FILTER_HAMMING => \Imagick::FILTER_HAMMING, + ImageInterface::FILTER_HERMITE => \Imagick::FILTER_HERMITE, + ImageInterface::FILTER_LANCZOS => \Imagick::FILTER_LANCZOS, + ImageInterface::FILTER_MITCHELL => \Imagick::FILTER_MITCHELL, + ImageInterface::FILTER_POINT => \Imagick::FILTER_POINT, + ImageInterface::FILTER_QUADRATIC => \Imagick::FILTER_QUADRATIC, + ImageInterface::FILTER_SINC => \Imagick::FILTER_SINC, + ImageInterface::FILTER_TRIANGLE => \Imagick::FILTER_TRIANGLE + ); + + if (!array_key_exists($filter, $supportedFilters)) { + throw new InvalidArgumentException(sprintf( + 'The resampling filter "%s" is not supported by Imagick driver.', + $filter + )); + } + + return $supportedFilters[$filter]; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Imagine.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Imagine.php new file mode 100755 index 00000000..aa6e9264 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Imagine.php @@ -0,0 +1,176 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Imagick; + +use Imagine\Exception\NotSupportedException; +use Imagine\Image\AbstractImagine; +use Imagine\Image\BoxInterface; +use Imagine\Image\Metadata\MetadataBag; +use Imagine\Image\Palette\Color\ColorInterface; +use Imagine\Exception\InvalidArgumentException; +use Imagine\Exception\RuntimeException; +use Imagine\Image\Palette\CMYK; +use Imagine\Image\Palette\RGB; +use Imagine\Image\Palette\Grayscale; + +/** + * Imagine implementation using the Imagick PHP extension + */ +final class Imagine extends AbstractImagine +{ + /** + * @throws RuntimeException + */ + public function __construct() + { + if (!class_exists('Imagick')) { + throw new RuntimeException('Imagick not installed'); + } + + if (version_compare('6.2.9', $this->getVersion(new \Imagick())) > 0) { + throw new RuntimeException('ImageMagick version 6.2.9 or higher is required'); + } + } + + /** + * {@inheritdoc} + */ + public function open($path) + { + $path = $this->checkPath($path); + + try { + $imagick = new \Imagick($path); + $image = new Image($imagick, $this->createPalette($imagick), $this->getMetadataReader()->readFile($path)); + } catch (\Exception $e) { + throw new RuntimeException(sprintf('Unable to open image %s', $path), $e->getCode(), $e); + } + + return $image; + } + + /** + * {@inheritdoc} + */ + public function create(BoxInterface $size, ColorInterface $color = null) + { + $width = $size->getWidth(); + $height = $size->getHeight(); + + $palette = null !== $color ? $color->getPalette() : new RGB(); + $color = null !== $color ? $color : $palette->color('fff'); + + try { + $pixel = new \ImagickPixel((string) $color); + $pixel->setColorValue(\Imagick::COLOR_ALPHA, $color->getAlpha() / 100); + + $imagick = new \Imagick(); + $imagick->newImage($width, $height, $pixel); + $imagick->setImageMatte(true); + $imagick->setImageBackgroundColor($pixel); + + if (version_compare('6.3.1', $this->getVersion($imagick)) < 0) { + $imagick->setImageOpacity($pixel->getColorValue(\Imagick::COLOR_ALPHA)); + } + + $pixel->clear(); + $pixel->destroy(); + + return new Image($imagick, $palette, new MetadataBag()); + } catch (\ImagickException $e) { + throw new RuntimeException('Could not create empty image', $e->getCode(), $e); + } + } + + /** + * {@inheritdoc} + */ + public function load($string) + { + try { + $imagick = new \Imagick(); + + $imagick->readImageBlob($string); + $imagick->setImageMatte(true); + + return new Image($imagick, $this->createPalette($imagick), $this->getMetadataReader()->readData($string)); + } catch (\ImagickException $e) { + throw new RuntimeException('Could not load image from string', $e->getCode(), $e); + } + } + + /** + * {@inheritdoc} + */ + public function read($resource) + { + if (!is_resource($resource)) { + throw new InvalidArgumentException('Variable does not contain a stream resource'); + } + + try { + $imagick = new \Imagick(); + $imagick->readImageFile($resource); + } catch (\ImagickException $e) { + throw new RuntimeException('Could not read image from resource', $e->getCode(), $e); + } + + return new Image($imagick, $this->createPalette($imagick), $this->getMetadataReader()->readStream($resource)); + } + + /** + * {@inheritdoc} + */ + public function font($file, $size, ColorInterface $color) + { + return new Font(new \Imagick(), $file, $size, $color); + } + + /** + * Returns the palette corresponding to an \Imagick resource colorspace + * + * @param \Imagick $imagick + * + * @return CMYK|Grayscale|RGB + * + * @throws NotSupportedException + */ + private function createPalette(\Imagick $imagick) + { + switch ($imagick->getImageColorspace()) { + case \Imagick::COLORSPACE_RGB: + case \Imagick::COLORSPACE_SRGB: + return new RGB(); + case \Imagick::COLORSPACE_CMYK: + return new CMYK(); + case \Imagick::COLORSPACE_GRAY: + return new Grayscale(); + default: + throw new NotSupportedException('Only RGB and CMYK colorspace are currently supported'); + } + } + + /** + * Returns ImageMagick version + * + * @param \Imagick $imagick + * + * @return string + */ + private function getVersion(\Imagick $imagick) + { + $v = $imagick->getVersion(); + list($version) = sscanf($v['versionString'], 'ImageMagick %s %04d-%02d-%02d %s %s'); + + return $version; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Layers.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Layers.php new file mode 100755 index 00000000..7809447a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Layers.php @@ -0,0 +1,271 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Imagine\Imagick; + +use Imagine\Image\AbstractLayers; +use Imagine\Image\Metadata\MetadataBag; +use Imagine\Exception\RuntimeException; +use Imagine\Exception\OutOfBoundsException; +use Imagine\Exception\InvalidArgumentException; +use Imagine\Image\Palette\PaletteInterface; + +class Layers extends AbstractLayers +{ + /** + * @var Image + */ + private $image; + /** + * @var \Imagick + */ + private $resource; + /** + * @var integer + */ + private $offset = 0; + /** + * @var array + */ + private $layers = array(); + + private $palette; + + public function __construct(Image $image, PaletteInterface $palette, \Imagick $resource) + { + $this->image = $image; + $this->resource = $resource; + $this->palette = $palette; + } + + /** + * {@inheritdoc} + */ + public function merge() + { + foreach ($this->layers as $offset => $image) { + try { + $this->resource->setIteratorIndex($offset); + $this->resource->setImage($image->getImagick()); + } catch (\ImagickException $e) { + throw new RuntimeException('Failed to substitute layer', $e->getCode(), $e); + } + } + } + + /** + * {@inheritdoc} + */ + public function animate($format, $delay, $loops) + { + if ('gif' !== strtolower($format)) { + throw new InvalidArgumentException('Animated picture is currently only supported on gif'); + } + + if (!is_int($loops) || $loops < 0) { + throw new InvalidArgumentException('Loops must be a positive integer.'); + } + + if (null !== $delay && (!is_int($delay) || $delay < 0)) { + throw new InvalidArgumentException('Delay must be either null or a positive integer.'); + } + + try { + foreach ($this as $offset => $layer) { + $this->resource->setIteratorIndex($offset); + $this->resource->setFormat($format); + + if (null !== $delay) { + $layer->getImagick()->setImageDelay($delay / 10); + $layer->getImagick()->setImageTicksPerSecond(100); + } + $layer->getImagick()->setImageIterations($loops); + + $this->resource->setImage($layer->getImagick()); + } + } catch (\ImagickException $e) { + throw new RuntimeException('Failed to animate layers', $e->getCode(), $e); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function coalesce() + { + try { + $coalescedResource = $this->resource->coalesceImages(); + } catch (\ImagickException $e) { + throw new RuntimeException('Failed to coalesce layers', $e->getCode(), $e); + } + + $count = $coalescedResource->getNumberImages(); + for ($offset = 0; $offset < $count; $offset++) { + try { + $coalescedResource->setIteratorIndex($offset); + $this->layers[$offset] = new Image($coalescedResource->getImage(), $this->palette, new MetadataBag()); + } catch (\ImagickException $e) { + throw new RuntimeException('Failed to retrieve layer', $e->getCode(), $e); + } + } + } + + /** + * {@inheritdoc} + */ + public function current() + { + return $this->extractAt($this->offset); + } + + /** + * Tries to extract layer at given offset + * + * @param integer $offset + * + * @return Image + * @throws RuntimeException + */ + private function extractAt($offset) + { + if (!isset($this->layers[$offset])) { + try { + $this->resource->setIteratorIndex($offset); + $this->layers[$offset] = new Image($this->resource->getImage(), $this->palette, new MetadataBag()); + } catch (\ImagickException $e) { + throw new RuntimeException(sprintf('Failed to extract layer %d', $offset), $e->getCode(), $e); + } + } + + return $this->layers[$offset]; + } + + /** + * {@inheritdoc} + */ + public function key() + { + return $this->offset; + } + + /** + * {@inheritdoc} + */ + public function next() + { + ++$this->offset; + } + + /** + * {@inheritdoc} + */ + public function rewind() + { + $this->offset = 0; + } + + /** + * {@inheritdoc} + */ + public function valid() + { + return $this->offset < count($this); + } + + /** + * {@inheritdoc} + */ + public function count() + { + try { + return $this->resource->getNumberImages(); + } catch (\ImagickException $e) { + throw new RuntimeException('Failed to count the number of layers', $e->getCode(), $e); + } + } + + /** + * {@inheritdoc} + */ + public function offsetExists($offset) + { + return is_int($offset) && $offset >= 0 && $offset < count($this); + } + + /** + * {@inheritdoc} + */ + public function offsetGet($offset) + { + return $this->extractAt($offset); + } + + /** + * {@inheritdoc} + */ + public function offsetSet($offset, $image) + { + if (!$image instanceof Image) { + throw new InvalidArgumentException('Only an Imagick Image can be used as layer'); + } + + if (null === $offset) { + $offset = count($this) - 1; + } else { + if (!is_int($offset)) { + throw new InvalidArgumentException('Invalid offset for layer, it must be an integer'); + } + + if (count($this) < $offset || 0 > $offset) { + throw new OutOfBoundsException(sprintf('Invalid offset for layer, it must be a value between 0 and %d, %d given', count($this), $offset)); + } + + if (isset($this[$offset])) { + unset($this[$offset]); + $offset = $offset - 1; + } + } + + $frame = $image->getImagick(); + + try { + if (count($this) > 0) { + $this->resource->setIteratorIndex($offset); + } + $this->resource->addImage($frame); + } catch (\ImagickException $e) { + throw new RuntimeException('Unable to set the layer', $e->getCode(), $e); + } + + $this->layers = array(); + } + + /** + * {@inheritdoc} + */ + public function offsetUnset($offset) + { + try { + $this->extractAt($offset); + } catch (RuntimeException $e) { + return; + } + + try { + $this->resource->setIteratorIndex($offset); + $this->resource->removeImage(); + } catch (\ImagickException $e) { + throw new RuntimeException('Unable to remove layer', $e->getCode(), $e); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Collection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Collection.php new file mode 100755 index 00000000..61dcbeb1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Collection.php @@ -0,0 +1,192 @@ +aItems = array(); + } + + /** + * @param mixed $mItem + * @param bool $bToTop = false + * @return self + */ + public function Add($mItem, $bToTop = false) + { + if ($bToTop) + { + \array_unshift($this->aItems, $mItem); + } + else + { + \array_push($this->aItems, $mItem); + } + + return $this; + } + + /** + * @param array $aItems + * @return self + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public function AddArray($aItems) + { + if (!\is_array($aItems)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + foreach ($aItems as $mItem) + { + $this->Add($mItem); + } + + return $this; + } + + /** + * @return self + */ + public function Clear() + { + $this->aItems = array(); + + return $this; + } + + /** + * @return array + */ + public function CloneAsArray() + { + return $this->aItems; + } + + /** + * @return int + */ + public function Count() + { + return \count($this->aItems); + } + + /** + * @return array + */ + public function &GetAsArray() + { + return $this->aItems; + } + + /** + * @param mixed $mCallback + */ + public function MapList($mCallback) + { + $aResult = array(); + if (\is_callable($mCallback)) + { + foreach ($this->aItems as $oItem) + { + $aResult[] = \call_user_func($mCallback, $oItem); + } + } + + return $aResult; + } + + /** + * @param mixed $mCallback + * @return array + */ + public function FilterList($mCallback) + { + $aResult = array(); + if (\is_callable($mCallback)) + { + foreach ($this->aItems as $oItem) + { + if (\call_user_func($mCallback, $oItem)) + { + $aResult[] = $oItem; + } + } + } + + return $aResult; + } + + /** + * @param mixed $mCallback + * @return void + */ + public function ForeachList($mCallback) + { + if (\is_callable($mCallback)) + { + foreach ($this->aItems as $oItem) + { + \call_user_func($mCallback, $oItem); + } + } + } + + /** + * @return mixed | null + * @return mixed + */ + public function &GetByIndex($iIndex) + { + $mResult = null; + if (\key_exists($iIndex, $this->aItems)) + { + $mResult = $this->aItems[$iIndex]; + } + + return $mResult; + } + + /** + * @param array $aItems + * @return self + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public function SetAsArray($aItems) + { + if (!\is_array($aItems)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $this->aItems = $aItems; + + return $this; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Crypt.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Crypt.php new file mode 100755 index 00000000..f21bdbca --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Crypt.php @@ -0,0 +1,189 @@ +> 2 & 3; + for ($iPIndex = 0; $iPIndex < $iN; $iPIndex++) + { + $iY = $aV[$iPIndex + 1]; + $iMx = self::int32((($iZ >> 5 & 0x07ffffff) ^ $iY << 2) + + (($iY >> 3 & 0x1fffffff) ^ $iZ << 4)) ^ self::int32(($iSum ^ $iY) + ($aK[$iPIndex & 3 ^ $iE] ^ $iZ)); + $iZ = $aV[$iPIndex] = self::int32($aV[$iPIndex] + $iMx); + } + $iY = $aV[0]; + $iMx = self::int32((($iZ >> 5 & 0x07ffffff) ^ $iY << 2) + + (($iY >> 3 & 0x1fffffff) ^ $iZ << 4)) ^ self::int32(($iSum ^ $iY) + ($aK[$iPIndex & 3 ^ $iE] ^ $iZ)); + $iZ = $aV[$iN] = self::int32($aV[$iN] + $iMx); + } + + return self::long2str($aV, false); + } + + /** + * @param string $sEncriptedString + * @param string $sKey + * + * @return string + */ + public static function XxteaDecrypt($sEncriptedString, $sKey) + { + if (0 === \strlen($sEncriptedString)) + { + return ''; + } + + $aV = self::str2long($sEncriptedString, false); + $aK = self::str2long($sKey, false); + + if (\count($aK) < 4) + { + for ($iIndex = \count($aK); $iIndex < 4; $iIndex++) + { + $aK[$iIndex] = 0; + } + } + + $iN = \count($aV) - 1; + + $iZ = $aV[$iN]; + $iY = $aV[0]; + $iDelta = 0x9E3779B9; + $iQ = \floor(6 + 52 / ($iN + 1)); + $iSum = self::int32($iQ * $iDelta); + while ($iSum != 0) + { + $iE = $iSum >> 2 & 3; + for ($iPIndex = $iN; $iPIndex > 0; $iPIndex--) + { + $iZ = $aV[$iPIndex - 1]; + $iMx = self::int32((($iZ >> 5 & 0x07ffffff) ^ $iY << 2) + + (($iY >> 3 & 0x1fffffff) ^ $iZ << 4)) ^ self::int32(($iSum ^ $iY) + ($aK[$iPIndex & 3 ^ $iE] ^ $iZ)); + $iY = $aV[$iPIndex] = self::int32($aV[$iPIndex] - $iMx); + } + $iZ = $aV[$iN]; + $iMx = self::int32((($iZ >> 5 & 0x07ffffff) ^ $iY << 2) + + (($iY >> 3 & 0x1fffffff) ^ $iZ << 4)) ^ self::int32(($iSum ^ $iY) + ($aK[$iPIndex & 3 ^ $iE] ^ $iZ)); + $iY = $aV[0] = self::int32($aV[0] - $iMx); + $iSum = self::int32($iSum - $iDelta); + } + + return self::long2str($aV, true); + } + + /** + * @param array $aV + * @param array $aW + * + * @return string + */ + private static function long2str($aV, $aW) + { + $iLen = \count($aV); + $iN = ($iLen - 1) << 2; + if ($aW) + { + $iM = $aV[$iLen - 1]; + if (($iM < $iN - 3) || ($iM > $iN)) + { + return false; + } + $iN = $iM; + } + $aS = array(); + for ($iIndex = 0; $iIndex < $iLen; $iIndex++) + { + $aS[$iIndex] = \pack('V', $aV[$iIndex]); + } + if ($aW) + { + return \substr(\join('', $aS), 0, $iN); + } + else + { + return \join('', $aS); + } + } + + /** + * @param string $sS + * @param string $sW + * + * @return array + */ + private static function str2long($sS, $sW) + { + $aV = \unpack('V*', $sS . \str_repeat("\0", (4 - \strlen($sS) % 4) & 3)); + $aV = \array_values($aV); + if ($sW) + { + $aV[\count($aV)] = \strlen($sS); + } + return $aV; + } + + /** + * @param int $iN + * + * @return int + */ + private static function int32($iN) + { + while ($iN >= 2147483648) + { + $iN -= 4294967296; + } + while ($iN <= -2147483649) + { + $iN += 4294967296; + } + return (int) $iN; + } +} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/DateTimeHelper.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/DateTimeHelper.php new file mode 100755 index 00000000..66028b31 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/DateTimeHelper.php @@ -0,0 +1,154 @@ +getTimestamp() : 0; + } + + /** + * Parse date string formated as "10-Jan-2012 01:58:17 -0800" + * IMAP INTERNALDATE Format + * + * @param string $sDateTime + * + * @return int + */ + public static function ParseInternalDateString($sDateTime) + { + $sDateTime = \trim($sDateTime); + if (empty($sDateTime)) + { + return 0; + } + + if (\preg_match('/^[a-z]{2,4}, /i', $sDateTime)) // RFC2822 ~ "Thu, 10 Jun 2010 08:58:33 -0700 (PDT)" + { + return \MailSo\Base\DateTimeHelper::ParseRFC2822DateString($sDateTime); + } + + $oDateTime = \DateTime::createFromFormat('d-M-Y H:i:s O', $sDateTime, \MailSo\Base\DateTimeHelper::GetUtcTimeZoneObject()); + return $oDateTime ? $oDateTime->getTimestamp() : 0; + } + + /** + * Parse date string formated as "2011-06-14 23:59:59 +0400" + * + * @param string $sDateTime + * + * @return int + */ + public static function ParseDateStringType1($sDateTime) + { + $sDateTime = \trim($sDateTime); + if (empty($sDateTime)) + { + return 0; + } + + $oDateTime = \DateTime::createFromFormat('Y-m-d H:i:s O', $sDateTime, \MailSo\Base\DateTimeHelper::GetUtcTimeZoneObject()); + return $oDateTime ? $oDateTime->getTimestamp() : 0; + } + + /** + * Parse date string formated as "2015-05-08T14:32:18.483-07:00" + * + * @param string $sDateTime + * + * @return int + */ + public static function TryToParseSpecEtagFormat($sDateTime) + { + $sDateTime = \trim(\preg_replace('/ \([a-zA-Z0-9]+\)$/', '', \trim($sDateTime))); + $sDateTime = \trim(\preg_replace('/(:[\d]{2})\.[\d]{3}/', '$1', \trim($sDateTime))); + $sDateTime = \trim(\preg_replace('/(-[\d]{2})T([\d]{2}:)/', '$1 $2', \trim($sDateTime))); + $sDateTime = \trim(\preg_replace('/([\-+][\d]{2}):([\d]{2})$/', ' $1$2', \trim($sDateTime))); + + return \MailSo\Base\DateTimeHelper::ParseDateStringType1($sDateTime); + } + + /** + * @param string $sTime + * + * @return int + */ + public static function TimeToSec($sTime) + { + $iMod = 1; + $sTime = \trim($sTime); + if ('-' === \substr($sTime, 0, 1)) + { + $iMod = -1; + $sTime = \substr($sTime, 1); + } + + $aParts = \preg_split('/[:.,]/', (string) $sTime); + + $iResult = 0; + if (isset($aParts[0]) && \is_numeric($aParts[0])) + { + $iResult += 3600 * ((int) $aParts[0]); + } + + if (isset($aParts[1]) && \is_numeric($aParts[1])) + { + $iResult += 60 * ((int) $aParts[1]); + } + + return $iResult * $iMod; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Enumerations/Charset.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Enumerations/Charset.php new file mode 100755 index 00000000..85132e6e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Enumerations/Charset.php @@ -0,0 +1,38 @@ +getFile()).' ~ '.$this->getLine().')' : $sMessage; + + parent::__construct($sMessage, $iCode, $oPrevious); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Exceptions/InvalidArgumentException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Exceptions/InvalidArgumentException.php new file mode 100755 index 00000000..a366b639 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Exceptions/InvalidArgumentException.php @@ -0,0 +1,19 @@ +hasAttributes() && isset($oElement->attributes) && $oElement->attributes) + { + foreach ($oElement->attributes as $oAttr) + { + if ($oAttr && !empty($oAttr->nodeName)) + { + $sAttrName = \trim(\strtolower($oAttr->nodeName)); + $aResult[$sAttrName] = $oAttr->nodeValue; + } + } + } + } + + return $aResult; + } + + /** + * @param string $sText + * + * @return \DOMDocument|bool + */ + public static function GetDomFromText($sText) + { + $bState = true; + if (\MailSo\Base\Utils::FunctionExistsAndEnabled('libxml_use_internal_errors')) + { + $bState = \libxml_use_internal_errors(true); + } + + $sHtmlAttrs = $sBodyAttrs = ''; + + $sText = \MailSo\Base\HtmlUtils::FixSchemas($sText); + $sText = \MailSo\Base\HtmlUtils::ClearFastTags($sText); + $sText = \MailSo\Base\HtmlUtils::ClearBodyAndHtmlTag($sText, $sHtmlAttrs, $sBodyAttrs); + + $oDom = self::createDOMDocument(); + @$oDom->loadHTML('<'.'?xml version="1.0" encoding="utf-8"?'.'>'. + ''. + ''. + ''.\MailSo\Base\Utils::Utf8Clear($sText).''); + + @$oDom->normalizeDocument(); + + if (\MailSo\Base\Utils::FunctionExistsAndEnabled('libxml_clear_errors')) + { + @\libxml_clear_errors(); + } + + if (\MailSo\Base\Utils::FunctionExistsAndEnabled('libxml_use_internal_errors')) + { + \libxml_use_internal_errors($bState); + } + + return $oDom; + } + + /** + * @return \DOMDocument + */ + private static function createDOMDocument() + { + $oDoc = new \DOMDocument('1.0', 'UTF-8'); + $oDoc->encoding = 'UTF-8'; + $oDoc->strictErrorChecking = false; + $oDoc->formatOutput = false; + $oDoc->preserveWhiteSpace = false; + + return $oDoc; + } + + /** + * @return boolean + */ + private static function comparedVersion() + { + return \version_compare(PHP_VERSION, '5.3.6') >= 0; + } + + /** + * @param \DOMDocument|\DOMElement $oElem + * + * @return string + */ + private static function domToString($oElem, $oDom = null) + { + $sResult = ''; + if ($oElem instanceof \DOMDocument) + { + if (isset($oElem->documentElement) && self::comparedVersion()) + { + $sResult = $oElem->saveHTML($oElem->documentElement); + } + else + { + $sResult = $oElem->saveHTML(); + } + } + else if ($oElem) + { + if ($oDom && self::comparedVersion()) + { + $sResult = $oDom->saveHTML($oElem); + } + else + { + $oTempDoc = self::createDOMDocument(); + $oTempDoc->appendChild($oTempDoc->importNode($oElem->cloneNode(true), true)); + $sResult = $oTempDoc->saveHTML(); + } + } + + return \trim($sResult); + } + + /** + * @param \DOMDocument $oDom + * @param bool $bWrapByFakeHtmlAndBodyDiv = true + * + * @return string + */ + public static function GetTextFromDom_($oDom, $bWrapByFakeHtmlAndBodyDiv = true) + { + $sResult = ''; + + $aHtmlAttrs = $aBodylAttrs = array(); + if ($bWrapByFakeHtmlAndBodyDiv) + { + $oHtml = $oDom->getElementsByTagName('html')->item(0); + $oBody = $oDom->getElementsByTagName('body')->item(0); + + $aHtmlAttrs = \MailSo\Base\HtmlUtils::GetElementAttributesAsArray($oHtml); + $aBodylAttrs = \MailSo\Base\HtmlUtils::GetElementAttributesAsArray($oBody); + } + + $oDiv = $oDom->getElementsByTagName('div')->item(0); + if ($oDiv && $oDiv->hasAttribute('data-wrp') && 'rainloop' === $oDiv->getAttribute('data-wrp')) + { + $oDiv->removeAttribute('data-wrp'); + if ($bWrapByFakeHtmlAndBodyDiv) + { + $oWrap = $oDom->createElement('div'); + + $oWrap->setAttribute('data-x-div-type', 'html'); + foreach ($aHtmlAttrs as $sKey => $sValue) + { + $oWrap->setAttribute($sKey, $sValue); + } + + $oDiv->setAttribute('data-x-div-type', 'body'); + foreach ($aBodylAttrs as $sKey => $sValue) + { + $oDiv->setAttribute($sKey, $sValue); + } + + $oWrap->appendChild($oDiv); + $sResult = self::domToString($oWrap, $oDom); + } + else + { + $sResult = self::domToString($oDiv, $oDom); + } + } + else + { + $sResult = self::domToString($oDom); + } + + $sResult = \str_replace(\MailSo\Base\HtmlUtils::$KOS, ':', $sResult); + $sResult = \MailSo\Base\Utils::StripSpaces($sResult); + + return $sResult; + } + + /** + * @param \DOMDocument $oDom + * @param bool $bWrapByFakeHtmlAndBodyDiv = true + * + * @return string + */ + public static function GetTextFromDom($oDom, $bWrapByFakeHtmlAndBodyDiv = true) + { + $sResult = ''; + + $oHtml = $oDom->getElementsByTagName('html')->item(0); + $oBody = $oDom->getElementsByTagName('body')->item(0); + + foreach ($oBody->childNodes as $oChild) + { + $sResult .= $oDom->saveHTML($oChild); + } + + if ($bWrapByFakeHtmlAndBodyDiv) + { + $aHtmlAttrs = \MailSo\Base\HtmlUtils::GetElementAttributesAsArray($oHtml); + $aBodylAttrs = \MailSo\Base\HtmlUtils::GetElementAttributesAsArray($oBody); + + $oWrapHtml = $oDom->createElement('div'); + $oWrapHtml->setAttribute('data-x-div-type', 'html'); + foreach ($aHtmlAttrs as $sKey => $sValue) + { + $oWrapHtml->setAttribute($sKey, $sValue); + } + + $oWrapDom = $oDom->createElement('div', '___xxx___'); + $oWrapDom->setAttribute('data-x-div-type', 'body'); + foreach ($aBodylAttrs as $sKey => $sValue) + { + $oWrapDom->setAttribute($sKey, $sValue); + } + + $oWrapHtml->appendChild($oWrapDom); + + $sWrp = $oDom->saveHTML($oWrapHtml); + + $sResult = \str_replace('___xxx___', $sResult, $sWrp); + } + + $sResult = \str_replace(\MailSo\Base\HtmlUtils::$KOS, ':', $sResult); + $sResult = \MailSo\Base\Utils::StripSpaces($sResult); + + return $sResult; + } + + /** + * @param string $sHtml + * @param string $sHtmlAttrs = '' + * @param string $sBodyAttrs = '' + * + * @return string + */ + public static function ClearBodyAndHtmlTag($sHtml, &$sHtmlAttrs = '', &$sBodyAttrs = '') + { + $aMatch = array(); + if (\preg_match('/]+)>/im', $sHtml, $aMatch) && !empty($aMatch[1])) + { + $sHtmlAttrs = $aMatch[1]; + } + + $aMatch = array(); + if (\preg_match('/]+)>/im', $sHtml, $aMatch) && !empty($aMatch[1])) + { + $sBodyAttrs = $aMatch[1]; + } + + $sHtml = \preg_replace('/]*)>/si', '', $sHtml); + $sHtml = \preg_replace('/]*)>/si', '', $sHtml); + $sHtml = \preg_replace('/<\/body>/i', '', $sHtml); + $sHtml = \preg_replace('/]*)>/i', '', $sHtml); + $sHtml = \preg_replace('/<\/html>/i', '', $sHtml); + + $sHtmlAttrs = \preg_replace('/xmlns:[a-z]="[^"]*"/i', '', $sHtmlAttrs); + $sHtmlAttrs = \preg_replace('/xmlns:[a-z]=\'[^\']*\'/i', '', $sHtmlAttrs); + $sHtmlAttrs = \preg_replace('/xmlns="[^"]*"/i', '', $sHtmlAttrs); + $sHtmlAttrs = \preg_replace('/xmlns=\'[^\']*\'/i', '', $sHtmlAttrs); + $sBodyAttrs = \preg_replace('/xmlns:[a-z]="[^"]*"/i', '', $sBodyAttrs); + $sBodyAttrs = \preg_replace('/xmlns:[a-z]=\'[^\']*\'/i', '', $sBodyAttrs); + + $sHtmlAttrs = trim($sHtmlAttrs); + $sBodyAttrs = trim($sBodyAttrs); + + return $sHtml; + } + + /** + * @param string $sHtml + * @param bool $bClearEmpty = true + * + * @return string + */ + public static function FixSchemas($sHtml, $bClearEmpty = true) + { + if ($bClearEmpty) + { + $sHtml = \str_replace('', '', $sHtml); + } + + $sHtml = \str_replace('', '', $sHtml); + $sHtml = \str_replace('', '', $sHtml); + + return $sHtml; + } + + /** + * @param string $sHtml + * + * @return string + */ + public static function ClearFastTags($sHtml) + { + return \preg_replace(array( + '/]*><\/p>/i', + '/]*>/i', + '/<\?xml [^>]*\?>/i' + ), '', $sHtml); + } + + /** + * @param mixed $oDom + */ + public static function ClearComments(&$oDom) + { + $aRemove = array(); + + $oXpath = new \DOMXpath($oDom); + $oComments = $oXpath->query('//comment()'); + if ($oComments) + { + foreach ($oComments as $oComment) + { + $aRemove[] = $oComment; + } + } + + unset($oXpath, $oComments); + + foreach ($aRemove as /* @var $oElement \DOMElement */ $oElement) + { + if (isset($oElement->parentNode)) + { + @$oElement->parentNode->removeChild($oElement); + } + } + } + + /** + * @param mixed $oDom + * @param bool $bClearStyleAndHead = true + */ + public static function ClearTags(&$oDom, $bClearStyleAndHead = true) + { + $aRemoveTags = array( + 'svg', 'link', 'base', 'meta', 'title', 'x-script', 'script', 'bgsound', 'keygen', 'source', + 'object', 'embed', 'applet', 'mocha', 'iframe', 'frame', 'frameset', 'video', 'audio', 'area', 'map' + ); + + if ($bClearStyleAndHead) + { + $aRemoveTags[] = 'head'; + $aRemoveTags[] = 'style'; + } + + $aHtmlAllowedTags = isset(\MailSo\Config::$HtmlStrictAllowedTags) && + \is_array(\MailSo\Config::$HtmlStrictAllowedTags) && 0 < \count(\MailSo\Config::$HtmlStrictAllowedTags) ? + \MailSo\Config::$HtmlStrictAllowedTags : null; + + $aRemove = array(); + $aNodes = $oDom->getElementsByTagName('*'); + foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement) + { + if ($oElement) + { + $sTagNameLower = \trim(\strtolower($oElement->tagName)); + if ('' !== $sTagNameLower) + { + if (\in_array($sTagNameLower, $aRemoveTags) || ($aHtmlAllowedTags && !\in_array($sTagNameLower, $aHtmlAllowedTags))) + { + $aRemove[] = @$oElement; + } + } + } + } + + foreach ($aRemove as /* @var $oElement \DOMElement */ $oElement) + { + if (isset($oElement->parentNode)) + { + @$oElement->parentNode->removeChild($oElement); + } + } + } + +/* +// public static function ClearStyleUrlValueParserHelper($oUrlValue, $oRule, $oRuleSet, +// $oElem = null, +// &$bHasExternals = false, &$aFoundCIDs = array(), +// $aContentLocationUrls = array(), &$aFoundedContentLocationUrls = array(), +// $bDoNotReplaceExternalUrl = false, $fAdditionalExternalFilter = null +// ) +// { +// if ($oUrlValue instanceof \Sabberworm\CSS\Value\URL) +// { +// $oNewRule = new \Sabberworm\CSS\Rule\Rule('x-rl-orig-'.$oRule->getRule()); +// $oNewRule->setValue((string) $oRule->getValue()); +// $oNewRule->setIsImportant($oRule->getIsImportant()); +// +// $oRuleSet->addRule($oNewRule); +// +// $oUrl = $oUrlValue->getURL(); +// $sUrl = $oUrl ? $oUrl->getString() : ''; +// +// if ('cid:' === \strtolower(\substr($sUrl, 0, 4))) +// { +// $aFoundCIDs[] = \substr($sUrl, 4); +// +// $oRule->setRule('x-rl-mod-'.$oRule->getRule()); +// +// if ($oElem) +// { +// $oElem->setAttribute('data-x-style-mod', '1'); +// } +// } +// else +// { +// if (\preg_match('/http[s]?:\/\//i', $sUrl) || '//' === \substr($sUrl, 0, 2)) +// { +// $oRule->setRule('x-rl-mod-'.$oRule->getRule()); +// +// if (\in_array($sUrl, $aContentLocationUrls)) +// { +// $aFoundedContentLocationUrls[] = $sUrl; +// } +// else +// { +// $bHasExternals = true; +// if (!$bDoNotReplaceExternalUrl) +// { +// if ($fAdditionalExternalFilter) +// { +// $sAdditionalResult = \call_user_func($fAdditionalExternalFilter, $sUrl); +// if (0 < \strlen($sAdditionalResult) && $oUrl) +// { +// $oUrl->setString($sAdditionalResult); +// } +// } +// } +// } +// +// if ($oElem) +// { +// $oElem->setAttribute('data-x-style-mod', '1'); +// } +// } +// else if ('data:image/' !== \strtolower(\substr(\trim($sUrl), 0, 11))) +// { +// $oRuleSet->removeRule($oRule); +// } +// } +// } +// else if ($oRule instanceof \Sabberworm\CSS\Rule\Rule) +// { +// if ('x-rl-' !== \substr($oRule->getRule(), 0, 5)) +// { +// $oValue = $oRule->getValue(); +// if ($oValue instanceof \Sabberworm\CSS\Value\URL) +// { +// \MailSo\Base\HtmlUtils::ClearStyleUrlValueParserHelper($oValue, $oRule, $oRuleSet, $oElem, +// $bHasExternals, $aFoundCIDs, +// $aContentLocationUrls, $aFoundedContentLocationUrls, +// $bDoNotReplaceExternalUrl, $fAdditionalExternalFilter); +// } +// else if ($oValue instanceof \Sabberworm\CSS\Value\RuleValueList) +// { +// $aComps = $oValue->getListComponents(); +// foreach ($aComps as $oValue) +// { +// if ($oValue instanceof \Sabberworm\CSS\Value\URL) +// { +// \MailSo\Base\HtmlUtils::ClearStyleUrlValueParserHelper($oValue, $oRule, $oRuleSet, $oElem, +// $bHasExternals, $aFoundCIDs, +// $aContentLocationUrls, $aFoundedContentLocationUrls, +// $bDoNotReplaceExternalUrl, $fAdditionalExternalFilter); +// } +// } +// } +// } +// } +// } +// +// public static function ClearStyleSmart($sStyle, $oElement = null, +// &$bHasExternals = false, &$aFoundCIDs = array(), +// $aContentLocationUrls = array(), &$aFoundedContentLocationUrls = array(), +// $bDoNotReplaceExternalUrl = false, $fAdditionalExternalFilter = null, +// $sSelectorPrefix = '') +// { +// $mResult = false; +// $oCss = null; +// +// if (!\class_exists('Sabberworm\CSS\Parser')) +// { +// return $mResult; +// } +// +// $sStyle = \trim($sStyle); +// if (empty($sStyle)) +// { +// return ''; +// } +// +// $sStyle = \trim(\preg_replace('/[\r\n\t\s]+/', ' ', $sStyle)); +// +// try +// { +// $oSettings = \Sabberworm\CSS\Settings::create(); +// $oSettings->beStrict(); +// $oSettings->withMultibyteSupport(false); +// +// $oCssParser = new \Sabberworm\CSS\Parser($sStyle, $oSettings); +// $oCss = $oCssParser->parse(); +// } +// catch (\Exception $oEception) +// { +// unset($oEception); +// $mResult = false; +// } +// +// if ($oCss) +// { +// foreach ($oCss->getAllDeclarationBlocks() as $oBlock) +// { +// foreach($oBlock->getSelectors() as $oSelector) +// { +// $sS = ' '.\trim($oSelector->getSelector()).' '; +// $sS = \preg_replace('/ body([\.# ])/i', ' [data-x-div-type="body"]$1', $sS); +// $sS = \preg_replace('/ html([\.# ])/i', ' [data-x-div-type="html"]$1', $sS); +// +// if (0 < \strlen($sSelectorPrefix)) +// { +// $sS = \trim($sSelectorPrefix.' '.\trim($sS)); +// } +// +// $oSelector->setSelector(\trim($sS)); +// } +// } +// +// $aRulesToRemove = array( +// 'pointer-events', 'content', 'behavior', 'cursor', +// ); +// +// foreach($oCss->getAllRuleSets() as $oRuleSet) +// { +// foreach ($aRulesToRemove as $sRuleToRemove) +// { +// $oRuleSet->removeRule($sRuleToRemove); +// } +// +// // position: fixed -> position: fixed -> absolute +// $aRules = $oRuleSet->getRules('position'); +// if (\is_array($aRules)) +// { +// foreach ($aRules as $oRule) +// { +// $mValue = $oRule->getValue(); +// if (\is_string($mValue) && 'fixed' === \trim(\strtolower($mValue))) +// { +// $oRule->setValue('absolute'); +// } +// } +// } +// } +// +// foreach($oCss->getAllDeclarationBlocks() as $oRuleSet) +// { +// if ($oRuleSet instanceof \Sabberworm\CSS\RuleSet\RuleSet) +// { +// if ($oRuleSet instanceof \Sabberworm\CSS\RuleSet\DeclarationBlock) +// { +// $oRuleSet->expandBackgroundShorthand(); +// $oRuleSet->expandListStyleShorthand(); +// } +// +// $aRules = $oRuleSet->getRules(); +// if (\is_array($aRules) && 0 < \count($aRules)) +// { +// foreach ($aRules as $oRule) +// { +// if ($oRule instanceof \Sabberworm\CSS\Rule\Rule) +// { +// \MailSo\Base\HtmlUtils::ClearStyleUrlValueParserHelper(null, $oRule, $oRuleSet, +// $oElement, +// $bHasExternals, $aFoundCIDs, +// $aContentLocationUrls, $aFoundedContentLocationUrls, +// $bDoNotReplaceExternalUrl, $fAdditionalExternalFilter +// ); +// } +// } +// } +// } +// } +// +// try +// { +// $mResult = $oCss->render(\Sabberworm\CSS\OutputFormat::createCompact()); +// } +// catch (\Exception $oEception) +// { +// unset($oEception); +// $mResult = false; +// } +// } +// +// return $mResult; +// } +*/ + + /** + * + * @param string $sStyle + * @param \DOMElement $oElement + * @param bool $bHasExternals + * @param array $aFoundCIDs + * @param array $aContentLocationUrls + * @param array $aFoundedContentLocationUrls + * @param bool $bDoNotReplaceExternalUrl = false + * @param callback|null $fAdditionalExternalFilter = null + * + * @return string + */ + public static function ClearStyle($sStyle, $oElement, &$bHasExternals, &$aFoundCIDs, + $aContentLocationUrls, &$aFoundedContentLocationUrls, $bDoNotReplaceExternalUrl = false, $fAdditionalExternalFilter = null) + { + $sStyle = \trim($sStyle); + $aOutStyles = array(); + $aStyles = \explode(';', $sStyle); + + if ($fAdditionalExternalFilter && !\is_callable($fAdditionalExternalFilter)) + { + $fAdditionalExternalFilter = null; + } + + $aMatch = array(); + foreach ($aStyles as $sStyleItem) + { + $aStyleValue = \explode(':', $sStyleItem, 2); + $sName = \trim(\strtolower($aStyleValue[0])); + $sValue = isset($aStyleValue[1]) ? \trim($aStyleValue[1]) : ''; + + if ('position' === $sName && 'fixed' === \strtolower($sValue)) + { + $sValue = 'absolute'; + } + + if (0 === \strlen($sName) || 0 === \strlen($sValue)) + { + continue; + } + + $sStyleItem = $sName.': '.$sValue; + $aStyleValue = array($sName, $sValue); + + /*if (\in_array($sName, array('position', 'left', 'right', 'top', 'bottom', 'behavior', 'cursor'))) + { + // skip + } + else */if (\in_array($sName, array('behavior', 'pointer-events')) || + ('cursor' === $sName && !\in_array(\strtolower($sValue), array('none', 'cursor'))) || + ('display' === $sName && 'none' === \strtolower($sValue)) || + \preg_match('/expression/i', $sValue) || + ('text-indent' === $sName && '-' === \substr(trim($sValue), 0, 1)) + ) + { + // skip + } + else if (\in_array($sName, array('background-image', 'background', 'list-style', 'list-style-image', 'content')) + && \preg_match('/url[\s]?\(([^)]+)\)/im', $sValue, $aMatch) && !empty($aMatch[1])) + { + $sFullUrl = \trim($aMatch[0], '"\' '); + $sUrl = \trim($aMatch[1], '"\' '); + $sStyleValue = \trim(\preg_replace('/[\s]+/', ' ', \str_replace($sFullUrl, '', $sValue))); + $sStyleItem = empty($sStyleValue) ? '' : $sName.': '.$sStyleValue; + + if ('cid:' === \strtolower(\substr($sUrl, 0, 4))) + { + if ($oElement) + { + $oElement->setAttribute('data-x-style-cid-name', + 'background' === $sName ? 'background-image' : $sName); + + $oElement->setAttribute('data-x-style-cid', \substr($sUrl, 4)); + + $aFoundCIDs[] = \substr($sUrl, 4); + } + } + else + { + if ($oElement) + { + if (\preg_match('/http[s]?:\/\//i', $sUrl) || '//' === \substr($sUrl, 0, 2)) + { + $bHasExternals = true; + if (!$bDoNotReplaceExternalUrl) + { + if (\in_array($sName, array('background-image', 'list-style-image', 'content'))) + { + $sStyleItem = ''; + } + + $sTemp = ''; + if ($oElement->hasAttribute('data-x-style-url')) + { + $sTemp = \trim($oElement->getAttribute('data-x-style-url')); + } + + $sTemp = empty($sTemp) ? '' : (';' === \substr($sTemp, -1) ? $sTemp.' ' : $sTemp.'; '); + + $oElement->setAttribute('data-x-style-url', \trim($sTemp. + ('background' === $sName ? 'background-image' : $sName).': '.$sFullUrl, ' ;')); + + if ($fAdditionalExternalFilter) + { + $sAdditionalResult = \call_user_func($fAdditionalExternalFilter, $sUrl); + if (0 < \strlen($sAdditionalResult)) + { + $oElement->setAttribute('data-x-additional-style-url', + ('background' === $sName ? 'background-image' : $sName).': url('.$sAdditionalResult.')'); + } + } + } + } + else if ('data:image/' !== \strtolower(\substr(\trim($sUrl), 0, 11))) + { + $oElement->setAttribute('data-x-broken-style-src', $sFullUrl); + } + } + } + + if (!empty($sStyleItem)) + { + $aOutStyles[] = $sStyleItem; + } + } + else if ('height' === $sName) + { +// $aOutStyles[] = 'min-'.ltrim($sStyleItem); + $aOutStyles[] = $sStyleItem; + } + else + { + $aOutStyles[] = $sStyleItem; + } + } + + return \implode(';', $aOutStyles); + } + + /** + * @param \DOMDocument $oDom + */ + public static function FindLinksInDOM(&$oDom) + { + $aNodes = $oDom->getElementsByTagName('*'); + foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement) + { + $sTagNameLower = \strtolower($oElement->tagName); + $sParentTagNameLower = isset($oElement->parentNode) && isset($oElement->parentNode->tagName) ? + \strtolower($oElement->parentNode->tagName) : ''; + + if (!\in_array($sTagNameLower, array('html', 'meta', 'head', 'style', 'script', 'img', 'button', 'input', 'textarea', 'a')) && + 'a' !== $sParentTagNameLower && $oElement->childNodes && 0 < $oElement->childNodes->length) + { + $oSubItem = null; + $aTextNodes = array(); + $iIndex = $oElement->childNodes->length - 1; + while ($iIndex > -1) + { + $oSubItem = $oElement->childNodes->item($iIndex); + if ($oSubItem && XML_TEXT_NODE === $oSubItem->nodeType) + { + $aTextNodes[] = $oSubItem; + } + + $iIndex--; + } + + unset($oSubItem); + + foreach ($aTextNodes as $oTextNode) + { + if ($oTextNode && 0 < \strlen($oTextNode->wholeText)/* && \preg_match('/http[s]?:\/\//i', $oTextNode->wholeText)*/) + { + $sText = \MailSo\Base\LinkFinder::NewInstance() + ->Text($oTextNode->wholeText) + ->UseDefaultWrappers(true) + ->CompileText() + ; + + $oSubDom = \MailSo\Base\HtmlUtils::GetDomFromText($sText); + if ($oSubDom) + { + $oBodyNodes = $oSubDom->getElementsByTagName('body'); + if ($oBodyNodes && 0 < $oBodyNodes->length) + { + $oBodyChildNodes = $oBodyNodes->item(0)->childNodes; + if ($oBodyChildNodes && $oBodyChildNodes->length) + { + for ($iIndex = 0, $iLen = $oBodyChildNodes->length; $iIndex < $iLen; $iIndex++) + { + $oSubItem = $oBodyChildNodes->item($iIndex); + if ($oSubItem) + { + if (XML_ELEMENT_NODE === $oSubItem->nodeType && + 'a' === \strtolower($oSubItem->tagName)) + { + $oLink = $oDom->createElement('a', + \str_replace(':', \MailSo\Base\HtmlUtils::$KOS, \htmlspecialchars($oSubItem->nodeValue))); + + $sHref = $oSubItem->getAttribute('href'); + if ($sHref) + { + $oLink->setAttribute('href', $sHref); + } + + $oElement->insertBefore($oLink, $oTextNode); + } + else + { + $oElement->insertBefore($oDom->importNode($oSubItem), $oTextNode); + } + } + } + + $oElement->removeChild($oTextNode); + } + } + + unset($oBodyNodes); + } + + unset($oSubDom, $sText); + } + } + } + } + + unset($aNodes); + } + + /** + * @param string $sHtml + * @param bool $bDoNotReplaceExternalUrl = false + * @param bool $bFindLinksInHtml = false + * @param bool $bWrapByFakeHtmlAndBodyDiv = true + * + * @return string + */ + public static function ClearHtmlSimple($sHtml, $bDoNotReplaceExternalUrl = false, $bFindLinksInHtml = false, $bWrapByFakeHtmlAndBodyDiv = true) + { + $bHasExternals = false; + $aFoundCIDs = array(); + $aContentLocationUrls = array(); + $aFoundedContentLocationUrls = array(); + $fAdditionalExternalFilter = null; + $fAdditionalDomReader = null; + $bTryToDetectHiddenImages = false; + + return \MailSo\Base\HtmlUtils::ClearHtml($sHtml, $bHasExternals, $aFoundCIDs, + $aContentLocationUrls, $aFoundedContentLocationUrls, $bDoNotReplaceExternalUrl, $bFindLinksInHtml, + $fAdditionalExternalFilter, $fAdditionalDomReader, $bTryToDetectHiddenImages, + $bWrapByFakeHtmlAndBodyDiv); + } + + /** + * @param string $sHtml + * @param bool $bHasExternals = false + * @param array $aFoundCIDs = array() + * @param array $aContentLocationUrls = array() + * @param array $aFoundedContentLocationUrls = array() + * @param bool $bDoNotReplaceExternalUrl = false + * @param bool $bFindLinksInHtml = false + * @param callback|null $fAdditionalExternalFilter = null + * @param callback|null $fAdditionalDomReader = null + * @param bool $bTryToDetectHiddenImages = false + * @param bool $bWrapByFakeHtmlAndBodyDiv = true + * + * @return string + */ + public static function ClearHtml($sHtml, &$bHasExternals = false, &$aFoundCIDs = array(), + $aContentLocationUrls = array(), &$aFoundedContentLocationUrls = array(), + $bDoNotReplaceExternalUrl = false, $bFindLinksInHtml = false, + $fAdditionalExternalFilter = null, $fAdditionalDomReader = false, + $bTryToDetectHiddenImages = false, $bWrapByFakeHtmlAndBodyDiv = true) + { + $sResult = ''; + + $sHtml = null === $sHtml ? '' : (string) $sHtml; + $sHtml = \trim($sHtml); + if (0 === \strlen($sHtml)) + { + return ''; + } + + if ($fAdditionalExternalFilter && !\is_callable($fAdditionalExternalFilter)) + { + $fAdditionalExternalFilter = null; + } + + if ($fAdditionalDomReader && !\is_callable($fAdditionalDomReader)) + { + $fAdditionalDomReader = null; + } + + $bHasExternals = false; + + // Dom Part + $oDom = \MailSo\Base\HtmlUtils::GetDomFromText($sHtml); + unset($sHtml); + + if (!$oDom) + { + return ''; + } + + if ($fAdditionalDomReader) + { + $oResDom = \call_user_func($fAdditionalDomReader, $oDom); + if ($oResDom) + { + $oDom = $oResDom; + } + + unset($oResDom); + } + + if ($bFindLinksInHtml) + { + \MailSo\Base\HtmlUtils::FindLinksInDOM($oDom); + } + + \MailSo\Base\HtmlUtils::ClearComments($oDom); + \MailSo\Base\HtmlUtils::ClearTags($oDom); + + $sLinkColor = ''; + $aNodes = $oDom->getElementsByTagName('*'); + foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement) + { + $aRemovedAttrs = array(); + $sTagNameLower = \strtolower($oElement->tagName); + + // convert body attributes to styles + if ('body' === $sTagNameLower) + { + $aAttrs = array( + 'link' => '', + 'text' => '', + 'topmargin' => '', + 'leftmargin' => '', + 'bottommargin' => '', + 'rightmargin' => '' + ); + + if (isset($oElement->attributes)) + { + foreach ($oElement->attributes as $sAttrName => /* @var $oAttributeNode \DOMNode */ $oAttributeNode) + { + if ($oAttributeNode && isset($oAttributeNode->nodeValue)) + { + $sAttrNameLower = \trim(\strtolower($sAttrName)); + if (isset($aAttrs[$sAttrNameLower]) && '' === $aAttrs[$sAttrNameLower]) + { + $aAttrs[$sAttrNameLower] = array($sAttrName, \trim($oAttributeNode->nodeValue)); + } + } + } + } + + $aStyles = array(); + foreach ($aAttrs as $sIndex => $aItem) + { + if (\is_array($aItem)) + { + $oElement->removeAttribute($aItem[0]); + + switch ($sIndex) + { + case 'link': + $sLinkColor = \trim($aItem[1]); + if (!\preg_match('/^#[abcdef0-9]{3,6}$/i', $sLinkColor)) + { + $sLinkColor = ''; + } + break; + case 'text': + $aStyles[] = 'color: '.$aItem[1]; + break; + case 'topmargin': + $aStyles[] = 'margin-top: '.((int) $aItem[1]).'px'; + break; + case 'leftmargin': + $aStyles[] = 'margin-left: '.((int) $aItem[1]).'px'; + break; + case 'bottommargin': + $aStyles[] = 'margin-bottom: '.((int) $aItem[1]).'px'; + break; + case 'rightmargin': + $aStyles[] = 'margin-right: '.((int) $aItem[1]).'px'; + break; + } + } + } + + if (0 < \count($aStyles)) + { + $sStyles = $oElement->hasAttribute('style') ? \trim(\trim(\trim($oElement->getAttribute('style')), ';')) : ''; + $oElement->setAttribute('style', (empty($sStyles) ? '' : $sStyles.'; ').\implode('; ', $aStyles)); + } + } + + if ('iframe' === $sTagNameLower || 'frame' === $sTagNameLower) + { + $oElement->setAttribute('src', 'javascript:false'); + } + + if ('a' === $sTagNameLower && !empty($sLinkColor)) + { + $sStyles = $oElement->hasAttribute('style') + ? \trim(\trim(\trim($oElement->getAttribute('style')), ';')) : ''; + + $oElement->setAttribute('style', + 'color: '.$sLinkColor.\trim((empty($sStyles) ? '' : '; '.$sStyles))); + } + + if ($oElement->hasAttributes() && isset($oElement->attributes) && $oElement->attributes) + { + $aHtmlAllowedAttributes = isset(\MailSo\Config::$HtmlStrictAllowedAttributes) && + \is_array(\MailSo\Config::$HtmlStrictAllowedAttributes) && 0 < \count(\MailSo\Config::$HtmlStrictAllowedAttributes) ? + \MailSo\Config::$HtmlStrictAllowedAttributes : null; + + $sAttrsForRemove = array(); + foreach ($oElement->attributes as $sAttrName => $oAttr) + { + if ($sAttrName && $oAttr) + { + $sAttrNameLower = \trim(\strtolower($sAttrName)); + if ($aHtmlAllowedAttributes && !\in_array($sAttrNameLower, $aHtmlAllowedAttributes)) + { + $sAttrsForRemove[] = $sAttrName; + } + else if ('on' === \substr($sAttrNameLower, 0, 2) || in_array($sAttrNameLower, array( + 'id', 'class', 'contenteditable', 'designmode', 'formaction', 'manifest', 'action', + 'data-bind', 'data-reactid', 'xmlns', 'srcset', 'data-x-skip-style', + 'fscommand', 'seeksegmenttime' + ))) + { + $sAttrsForRemove[] = $sAttrName; + } + } + } + + if (0 < \count($sAttrsForRemove)) + { + foreach ($sAttrsForRemove as $sName) + { + @$oElement->removeAttribute($sName); + $aRemovedAttrs[\trim(\strtolower($sName))] = true; + } + } + + unset($sAttrsForRemove); + } + + if ($oElement->hasAttribute('href')) + { + $sHref = \trim($oElement->getAttribute('href')); + if (!\preg_match('/^(http[s]?|ftp|skype|mailto):/i', $sHref) && '//' !== \substr($sHref, 0, 2)) + { + $oElement->setAttribute('data-x-broken-href', $sHref); + $oElement->setAttribute('href', 'javascript:false'); + } + + if ('a' === $sTagNameLower) + { + $oElement->setAttribute('rel', 'external nofollow noopener noreferrer'); + } + } + + if (\in_array($sTagNameLower, array('a', 'form', 'area'))) + { + $oElement->setAttribute('target', '_blank'); + } + + if (\in_array($sTagNameLower, array('a', 'form', 'area', 'input', 'button', 'textarea'))) + { + $oElement->setAttribute('tabindex', '-1'); + } + + if ($bTryToDetectHiddenImages && 'img' === $sTagNameLower) + { + $sAlt = $oElement->hasAttribute('alt') + ? \trim($oElement->getAttribute('alt')) : ''; + + if ($oElement->hasAttribute('src') && '' === $sAlt) + { + $aH = array( + 'email.microsoftemail.com/open', + 'github.com/notifications/beacon/', + 'mandrillapp.com/track/open', + 'list-manage.com/track/open' + ); + + $sH = $oElement->hasAttribute('height') + ? \trim($oElement->getAttribute('height')) : ''; + +// $sW = $oElement->hasAttribute('width') +// ? \trim($oElement->getAttribute('width')) : ''; + + $sStyles = $oElement->hasAttribute('style') + ? \preg_replace('/[\s]+/', '', \trim(\trim(\trim($oElement->getAttribute('style')), ';'))) : ''; + + $sSrc = \trim($oElement->getAttribute('src')); + + $bC = \in_array($sH, array('1', '0', '1px', '0px')) || + \preg_match('/(display:none|visibility:hidden|height:0|height:[01][a-z][a-z])/i', $sStyles); + + if (!$bC) + { + $sSrcLower = \strtolower($sSrc); + foreach ($aH as $sLine) + { + if (false !== \strpos($sSrcLower, $sLine)) + { + $bC = true; + break; + } + } + } + + if ($bC) + { + $oElement->setAttribute('style', 'display:none'); + $oElement->setAttribute('data-x-skip-style', 'true'); + $oElement->setAttribute('data-x-hidden-src', $sSrc); + + $oElement->removeAttribute('src'); + } + } + } + + if ($oElement->hasAttribute('src')) + { + $sSrc = \trim($oElement->getAttribute('src')); + $oElement->removeAttribute('src'); + + if (\in_array($sSrc, $aContentLocationUrls)) + { + $oElement->setAttribute('data-x-src-location', $sSrc); + $aFoundedContentLocationUrls[] = $sSrc; + } + else if ('cid:' === \strtolower(\substr($sSrc, 0, 4))) + { + $oElement->setAttribute('data-x-src-cid', \substr($sSrc, 4)); + $aFoundCIDs[] = \substr($sSrc, 4); + } + else + { + if (\preg_match('/^http[s]?:\/\//i', $sSrc) || '//' === \substr($sSrc, 0, 2)) + { + if ($bDoNotReplaceExternalUrl) + { + $oElement->setAttribute('src', $sSrc); + } + else + { + $oElement->setAttribute('data-x-src', $sSrc); + if ($fAdditionalExternalFilter) + { + $sCallResult = \call_user_func($fAdditionalExternalFilter, $sSrc); + if (0 < \strlen($sCallResult)) + { + $oElement->setAttribute('data-x-additional-src', $sCallResult); + } + } + } + + $bHasExternals = true; + } + else if ('data:image/' === \strtolower(\substr($sSrc, 0, 11))) + { + $oElement->setAttribute('src', $sSrc); + } + else + { + $oElement->setAttribute('data-x-broken-src', $sSrc); + } + } + } + + $sBackground = $oElement->hasAttribute('background') + ? \trim($oElement->getAttribute('background')) : ''; + $sBackgroundColor = $oElement->hasAttribute('bgcolor') + ? \trim($oElement->getAttribute('bgcolor')) : ''; + + if (!empty($sBackground) || !empty($sBackgroundColor)) + { + $aStyles = array(); + $sStyles = $oElement->hasAttribute('style') + ? \trim(\trim(\trim($oElement->getAttribute('style')), ';')) : ''; + + if (!empty($sBackground)) + { + $aStyles[] = 'background-image: url(\''.$sBackground.'\')'; + $oElement->removeAttribute('background'); + } + + if (!empty($sBackgroundColor)) + { + $aStyles[] = 'background-color: '.$sBackgroundColor; + $oElement->removeAttribute('bgcolor'); + } + + $oElement->setAttribute('style', (empty($sStyles) ? '' : $sStyles.'; ').\implode('; ', $aStyles)); + } + + if ($oElement->hasAttribute('style') && !$oElement->hasAttribute('data-x-skip-style')) + { + $oElement->setAttribute('style', + \MailSo\Base\HtmlUtils::ClearStyle($oElement->getAttribute('style'), $oElement, $bHasExternals, + $aFoundCIDs, $aContentLocationUrls, $aFoundedContentLocationUrls, $bDoNotReplaceExternalUrl, $fAdditionalExternalFilter)); + } + + $oElement->removeAttribute('data-x-skip-style'); + + if (\MailSo\Config::$HtmlStrictDebug && 0 < \count($aRemovedAttrs)) + { + unset($aRemovedAttrs['class'], $aRemovedAttrs['target'], $aRemovedAttrs['id'], $aRemovedAttrs['name'], + $aRemovedAttrs['itemprop'], $aRemovedAttrs['itemscope'], $aRemovedAttrs['itemtype']); + + $aRemovedAttrs = \array_keys($aRemovedAttrs); + if (0 < \count($aRemovedAttrs)) + { + $oElement->setAttribute('data-removed-attrs', \implode(',', $aRemovedAttrs)); + } + } + } + + $sResult = \MailSo\Base\HtmlUtils::GetTextFromDom($oDom, $bWrapByFakeHtmlAndBodyDiv); + unset($oDom); + + return $sResult; + } + + /** + * @param string $sHtml + * @param array $aFoundCids = array() + * @param array|null $mFoundDataURL = null + * @param array $aFoundedContentLocationUrls = array() + * + * @return string + */ + public static function BuildHtml($sHtml, &$aFoundCids = array(), &$mFoundDataURL = null, &$aFoundedContentLocationUrls = array()) + { + $oDom = \MailSo\Base\HtmlUtils::GetDomFromText($sHtml); + + \MailSo\Base\HtmlUtils::ClearTags($oDom); + unset($sHtml); + + $aNodes = $oDom->getElementsByTagName('*'); + foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement) + { + $sTagNameLower = \strtolower($oElement->tagName); + + if ($oElement->hasAttribute('data-x-src-cid')) + { + $sCid = $oElement->getAttribute('data-x-src-cid'); + $oElement->removeAttribute('data-x-src-cid'); + + if (!empty($sCid)) + { + $aFoundCids[] = $sCid; + + @$oElement->removeAttribute('src'); + $oElement->setAttribute('src', 'cid:'.$sCid); + } + } + + if ($oElement->hasAttribute('data-x-src-location')) + { + $sSrc = $oElement->getAttribute('data-x-src-location'); + $oElement->removeAttribute('data-x-src-location'); + + if (!empty($sSrc)) + { + $aFoundedContentLocationUrls[] = $sSrc; + + @$oElement->removeAttribute('src'); + $oElement->setAttribute('src', $sSrc); + } + } + + if ($oElement->hasAttribute('data-x-broken-src')) + { + $oElement->setAttribute('src', $oElement->getAttribute('data-x-broken-src')); + $oElement->removeAttribute('data-x-broken-src'); + } + + if ($oElement->hasAttribute('data-x-src')) + { + $oElement->setAttribute('src', $oElement->getAttribute('data-x-src')); + $oElement->removeAttribute('data-x-src'); + } + + if ($oElement->hasAttribute('data-x-href')) + { + $oElement->setAttribute('href', $oElement->getAttribute('data-x-href')); + $oElement->removeAttribute('data-x-href'); + } + + if ($oElement->hasAttribute('data-x-style-cid-name') && $oElement->hasAttribute('data-x-style-cid')) + { + $sCidName = $oElement->getAttribute('data-x-style-cid-name'); + $sCid = $oElement->getAttribute('data-x-style-cid'); + + $oElement->removeAttribute('data-x-style-cid-name'); + $oElement->removeAttribute('data-x-style-cid'); + if (!empty($sCidName) && !empty($sCid) && \in_array($sCidName, + array('background-image', 'background', 'list-style-image', 'content'))) + { + $sStyles = ''; + if ($oElement->hasAttribute('style')) + { + $sStyles = \trim(\trim($oElement->getAttribute('style')), ';'); + } + + $sBack = $sCidName.': url(cid:'.$sCid.')'; + $sStyles = \preg_replace('/'.\preg_quote($sCidName, '/').':\s?[^;]+/i', $sBack, $sStyles); + if (false === \strpos($sStyles, $sBack)) + { + $sStyles .= empty($sStyles) ? '': '; '; + $sStyles .= $sBack; + } + + $oElement->setAttribute('style', $sStyles); + $aFoundCids[] = $sCid; + } + } + + foreach (array( + 'data-x-additional-src', 'data-x-additional-style-url', 'data-removed-attrs', + 'data-original', 'data-x-div-type', 'data-wrp', 'data-bind' + ) as $sName) + { + if ($oElement->hasAttribute($sName)) + { + $oElement->removeAttribute($sName); + } + } + + if ($oElement->hasAttribute('data-x-style-url')) + { + $sAddStyles = $oElement->getAttribute('data-x-style-url'); + $oElement->removeAttribute('data-x-style-url'); + + if (!empty($sAddStyles)) + { + $sStyles = ''; + if ($oElement->hasAttribute('style')) + { + $sStyles = \trim(\trim($oElement->getAttribute('style')), ';'); + } + + $oElement->setAttribute('style', (empty($sStyles) ? '' : $sStyles.'; ').$sAddStyles); + } + } + + if ('img' === $sTagNameLower && \is_array($mFoundDataURL)) + { + $sSrc = $oElement->getAttribute('src'); + if ('data:image/' === \strtolower(\substr($sSrc, 0, 11))) + { + $sHash = \md5($sSrc); + $mFoundDataURL[$sHash] = $sSrc; + + $oElement->setAttribute('src', 'cid:'.$sHash); + } + } + } + + $sResult = \MailSo\Base\HtmlUtils::GetTextFromDom($oDom, false); + unset($oDom); + + return ''. + ''.$sResult.''; + } + + /** + * @param string $sText + * @param bool $bLinksWithTargetBlank = true + * + * @return string + */ + public static function ConvertPlainToHtml($sText, $bLinksWithTargetBlank = true) + { + $sText = \trim($sText); + if (0 === \strlen($sText)) + { + return ''; + } + + $sText = \MailSo\Base\LinkFinder::NewInstance() + ->Text($sText) + ->UseDefaultWrappers($bLinksWithTargetBlank) + ->CompileText() + ; + + $sText = \str_replace("\r", '', $sText); + + $aText = \explode("\n", $sText); + unset($sText); + + $bIn = false; + $bDo = true; + do + { + $bDo = false; + $aNextText = array(); + foreach ($aText as $sTextLine) + { + $bStart = 0 === \strpos(\ltrim($sTextLine), '>'); + if ($bStart && !$bIn) + { + $bDo = true; + $bIn = true; + $aNextText[] = '
'; + $aNextText[] = \substr(\ltrim($sTextLine), 4); + } + else if (!$bStart && $bIn) + { + $bIn = false; + $aNextText[] = '
'; + $aNextText[] = $sTextLine; + } + else if ($bStart && $bIn) + { + $aNextText[] = \substr(\ltrim($sTextLine), 4); + } + else + { + $aNextText[] = $sTextLine; + } + } + + if ($bIn) + { + $bIn = false; + $aNextText[] = ''; + } + + $aText = $aNextText; + } + while ($bDo); + + $sText = \join("\n", $aText); + unset($aText); + + $sText = \preg_replace('/[\n][ ]+/', "\n", $sText); +// $sText = \preg_replace('/[\s]+([\s])/', '\\1', $sText); + + $sText = \preg_replace('/
[\s]+/i', '
', $sText); + $sText = \preg_replace('/[\s]+<\/blockquote>/i', '
', $sText); + + $sText = \preg_replace('/<\/blockquote>([\n]{0,2})
/i', '\\1', $sText); + $sText = \preg_replace('/[\n]{3,}/', "\n\n", $sText); + + $sText = \strtr($sText, array( + "\n" => "
", + "\t" => '   ', + ' ' => '  ' + )); + + return $sText; + } + + /** + * @param string $sText + * + * @return string + */ + public static function ConvertHtmlToPlain($sText) + { + $sText = \trim(\stripslashes($sText)); + $sText = \MailSo\Base\Utils::StripSpaces($sText); + + $sText = \preg_replace(array( + "/\r/", + "/[\n\t]+/", + '/]*>.*?<\/script>/i', + '/]*>.*?<\/style>/i', + '/]*>.*?<\/title>/i', + '/]*>(.+?)<\/h[123]>/i', + '/]*>(.+?)<\/h[456]>/i', + '/]*>/i', + '/]*>/i', + '/]*>(.+?)<\/b>/i', + '/]*>(.+?)<\/i>/i', + '/(]*>|<\/ul>)/i', + '/(]*>|<\/ol>)/i', + '/]*>/i', + '/]*href="([^"]+)"[^>]*>(.+?)<\/a>/i', + '/]*>/i', + '/(]*>|<\/table>)/i', + '/(]*>|<\/tr>)/i', + '/]*>(.+?)<\/td>/i', + '/]*>(.+?)<\/th>/i', + '/ /i', + '/"/i', + '/&/i', + '/©/i', + '/™/i', + '/“/', + '/”/', + '/–/', + '/’/', + '/&/', + '/©/', + '/™/', + '/—/', + '/“/', + '/”/', + '/•/', + '/®/i', + '/•/i', + '/&[&;]+;/i', + '/'/', + '/ /' + ), array( + '', + ' ', + '', + '', + '', + "\n\n\\1\n\n", + "\n\n\\1\n\n", + "\n\n\t", + "\n", + '\\1', + '\\1', + "\n\n", + "\n\n", + "\n\t* ", + '\\2 (\\1)', + "\n------------------------------------\n", + "\n", + "\n", + "\t\\1\n", + "\t\\1\n", + ' ', + '"', + '&', + '(c)', + '(tm)', + '"', + '"', + '-', + "'", + '&', + '(c)', + '(tm)', + '--', + '"', + '"', + '*', + '(R)', + '*', + '', + '\'', + '' + ), $sText); + + $sText = \str_ireplace('
',"\n
", $sText); + $sText = \strip_tags($sText, ''); + $sText = \preg_replace("/\n\\s+\n/", "\n", $sText); + $sText = \preg_replace("/[\n]{3,}/", "\n\n", $sText); + + $sText = \preg_replace(array( + '/>/i', + '/</i' + ), array( + '>', + '<' + ), $sText); + + return \trim($sText); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Http.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Http.php new file mode 100755 index 00000000..a851dbf8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Http.php @@ -0,0 +1,800 @@ +bIsMagicQuotesOn = (bool) @\ini_get('magic_quotes_gpc'); + } + + /** + * @return \MailSo\Base\Http + */ + public static function NewInstance() + { + return new self(); + } + + /** + * @staticvar \MailSo\Base\Http $oInstance; + * + * @return \MailSo\Base\Http + */ + public static function SingletonInstance() + { + static $oInstance = null; + if (null === $oInstance) + { + $oInstance = self::NewInstance(); + } + + return $oInstance; + } + + /** + * @param string $sKey + * + * @return bool + */ + public function HasQuery($sKey) + { + return isset($_GET[$sKey]); + } + + /** + * @param string $sKey + * @param mixed $mDefault = null + * @param bool $bClearPercZeroZero = true + * + * @return mixed + */ + public function GetQuery($sKey, $mDefault = null, $bClearPercZeroZero = true) + { + return isset($_GET[$sKey]) ? \MailSo\Base\Utils::StripSlashesValue($_GET[$sKey], $bClearPercZeroZero) : $mDefault; + } + + /** + * @return array|null + */ + public function GetQueryAsArray() + { + return isset($_GET) && \is_array($_GET) ? \MailSo\Base\Utils::StripSlashesValue($_GET, true) : null; + } + + /** + * @param string $sKey + * + * @return bool + */ + public function HasPost($sKey) + { + return isset($_POST[$sKey]); + } + + /** + * @param string $sKey + * @param mixed $mDefault = null + * @param bool $bClearPercZeroZero = false + * + * @return mixed + */ + public function GetPost($sKey, $mDefault = null, $bClearPercZeroZero = false) + { + return isset($_POST[$sKey]) ? \MailSo\Base\Utils::StripSlashesValue($_POST[$sKey], $bClearPercZeroZero) : $mDefault; + } + + /** + * @return array|null + */ + public function GetPostAsArray() + { + return isset($_POST) && \is_array($_POST) ? \MailSo\Base\Utils::StripSlashesValue($_POST, false) : null; + } + + /** + * @param string $sKey + * + * @return bool + */ + public function HasRequest($sKey) + { + return isset($_REQUEST[$sKey]); + } + + /** + * @param string $sKey + * @param mixed $mDefault = null + * + * @return mixed + */ + public function GetRequest($sKey, $mDefault = null) + { + return isset($_REQUEST[$sKey]) ? \MailSo\Base\Utils::StripSlashesValue($_REQUEST[$sKey]) : $mDefault; + } + + /** + * @param string $sKey + * + * @return bool + */ + public function HasServer($sKey) + { + return isset($_SERVER[$sKey]); + } + + /** + * @param string $sKey + * @param mixed $mDefault = null + * + * @return mixed + */ + public function GetServer($sKey, $mDefault = null) + { + return isset($_SERVER[$sKey]) ? $_SERVER[$sKey] : $mDefault; + } + + /** + * @param string $sKey + * + * @return bool + */ + public function HasEnv($sKey) + { + return isset($_ENV[$sKey]); + } + + /** + * @param string $sKey + * @param mixed $mDefault = null + * + * @return mixed + */ + public function GetEnv($sKey, $mDefault = null) + { + return isset($_ENV[$sKey]) ? $_ENV[$sKey] : $mDefault; + } + + /** + * @return string + */ + public function ServerProtocol() + { + return $this->GetServer('SERVER_PROTOCOL', 'HTTP/1.0'); + } + + /** + * @return string + */ + public function GetMethod() + { + return $this->GetServer('REQUEST_METHOD', ''); + } + + /** + * @return bool + */ + public function IsPost() + { + return ('POST' === $this->GetMethod()); + } + + /** + * @return bool + */ + public function IsGet() + { + return ('GET' === $this->GetMethod()); + } + + /** + * @return string + */ + public function GetQueryString() + { + return $this->GetServer('QUERY_STRING', ''); + } + + /** + * @return bool + */ + public function CheckLocalhost($sServer) + { + return \in_array(\strtolower(\trim($sServer)), array( + 'localhost', '127.0.0.1', '::1', '::1/128', '0:0:0:0:0:0:0:1' + )); + } + + /** + * @param string $sValueToCheck = '' + * + * @return bool + */ + public function IsLocalhost($sValueToCheck = '') + { + if (empty($sValueToCheck)) + { + $sValueToCheck = $this->GetServer('REMOTE_ADDR', ''); + } + + return $this->CheckLocalhost($sValueToCheck); + } + + /** + * @return string + */ + public function GetRawBody() + { + static $sRawBody = null; + if (null === $sRawBody) + { + $sBody = @\file_get_contents('php://input'); + $sRawBody = (false !== $sBody) ? $sBody : ''; + } + return $sRawBody; + } + + /** + * @param string $sHeader + * + * @return string + */ + public function GetHeader($sHeader) + { + $sServerKey = 'HTTP_'.\strtoupper(\str_replace('-', '_', $sHeader)); + $sResultHeader = $this->GetServer($sServerKey, ''); + + if (0 === \strlen($sResultHeader) && + \MailSo\Base\Utils::FunctionExistsAndEnabled('apache_request_headers')) + { + $sHeaders = \apache_request_headers(); + if (isset($sHeaders[$sHeader])) + { + $sResultHeader = $sHeaders[$sHeader]; + } + } + + return $sResultHeader; + } + + /** + * @param bool $bCheckProxy = true + * + * @return string + */ + public function GetScheme($bCheckProxy = true) + { + return $this->IsSecure($bCheckProxy) ? 'https' : 'http'; + } + + /** + * @param bool $bCheckProxy = true + * + * @return bool + */ + public function IsSecure($bCheckProxy = true) + { + $sHttps = \strtolower($this->GetServer('HTTPS', '')); + if ('on' === $sHttps || ('' === $sHttps && '443' === (string) $this->GetServer('SERVER_PORT', ''))) + { + return true; + } + + if ($bCheckProxy && ( + ('https' === \strtolower($this->GetServer('HTTP_X_FORWARDED_PROTO', ''))) || + ('on' === \strtolower($this->GetServer('HTTP_X_FORWARDED_SSL', ''))) + )) + { + return true; + } + + return false; + } + + /** + * @param bool $bWithRemoteUserData = false + * @param bool $bWithoutWWW = true + * @param bool $bWithoutPort = false + * + * @return string + */ + public function GetHost($bWithRemoteUserData = false, $bWithoutWWW = true, $bWithoutPort = false) + { + $sHost = $this->GetServer('HTTP_HOST', ''); + if (0 === \strlen($sHost)) + { + $sName = $this->GetServer('SERVER_NAME'); + $iPort = (int) $this->GetServer('SERVER_PORT', 80); + + $sHost = (\in_array($iPort, array(80, 433))) ? $sName : $sName.':'.$iPort; + } + + if ($bWithoutWWW) + { + $sHost = 'www.' === \substr(\strtolower($sHost), 0, 4) ? \substr($sHost, 4) : $sHost; + } + + if ($bWithRemoteUserData) + { + $sUser = \trim($this->HasServer('REMOTE_USER') ? $this->GetServer('REMOTE_USER', '') : ''); + $sHost = (0 < \strlen($sUser) ? $sUser.'@' : '').$sHost; + } + + if ($bWithoutPort) + { + $sHost = \preg_replace('/:[\d]+$/', '', $sHost); + } + + return $sHost; + } + + /** + * @param bool $bCheckProxy = false + * + * @return string + */ + public function GetClientIp($bCheckProxy = false) + { + $sIp = ''; + if ($bCheckProxy && null !== $this->GetServer('HTTP_CLIENT_IP', null)) + { + $sIp = $this->GetServer('HTTP_CLIENT_IP', ''); + } + else if ($bCheckProxy && null !== $this->GetServer('HTTP_X_FORWARDED_FOR', null)) + { + $sIp = $this->GetServer('HTTP_X_FORWARDED_FOR', ''); + } + else + { + $sIp = $this->GetServer('REMOTE_ADDR', ''); + } + + return $sIp; + } + + /** + * @param string $sUrl + * @param array $aPost = array() + * @param string $sCustomUserAgent = 'MailSo Http User Agent (v1)' + * @param int $iCode = 0 + * @param \MailSo\Log\Logger $oLogger = null + * @param int $iTimeout = 20 + * @param string $sProxy = '' + * @param string $sProxyAuth = '' + * + * @return string|bool + */ + public function SendPostRequest($sUrl, $aPost = array(), $sCustomUserAgent = 'MailSo Http User Agent (v1)', &$iCode = 0, + $oLogger = null, $iTimeout = 20, $sProxy = '', $sProxyAuth = '') + { + $aOptions = array( + CURLOPT_URL => $sUrl, + CURLOPT_HEADER => false, + CURLOPT_FAILONERROR => true, + CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => \http_build_query($aPost, '', '&'), + CURLOPT_TIMEOUT => (int) $iTimeout + ); + + if (0 < \strlen($sCustomUserAgent)) + { + $aOptions[CURLOPT_USERAGENT] = $sCustomUserAgent; + } + + if (0 < \strlen($sProxy)) + { + $aOptions[CURLOPT_PROXY] = $sProxy; + if (0 < \strlen($sProxyAuth)) + { + $aOptions[CURLOPT_PROXYUSERPWD] = $sProxyAuth; + } + } + + $oCurl = \curl_init(); + \curl_setopt_array($oCurl, $aOptions); + + if ($oLogger) + { + $oLogger->Write('cURL: Send post request: '.$sUrl); + } + + $mResult = \curl_exec($oCurl); + + $iCode = (int) \curl_getinfo($oCurl, CURLINFO_HTTP_CODE); + $sContentType = (string) \curl_getinfo($oCurl, CURLINFO_CONTENT_TYPE); + + if ($oLogger) + { + $oLogger->Write('cURL: Post request result: (Status: '.$iCode.', ContentType: '.$sContentType.')'); + if (false === $mResult || 200 !== $iCode) + { + $oLogger->Write('cURL: Error: '.\curl_error($oCurl), \MailSo\Log\Enumerations\Type::WARNING); + } + } + + if (\is_resource($oCurl)) + { + \curl_close($oCurl); + } + + return $mResult; + } + + /** + * @param string $sUrl + * @param array $aOptions + * @param \MailSo\Log\Logger $oLogger = null + * + * @return string + */ + static public function DetectAndHackFollowLocationUrl($sUrl, &$aOptions, $oLogger = null) + { + $sSafeMode = \strtolower(\trim(@\ini_get('safe_mode'))); + $bSafeMode = 'on' === $sSafeMode || '1' === $sSafeMode; + + $sNewUrl = null; + $sUrl = isset($aOptions[CURLOPT_URL]) ? $aOptions[CURLOPT_URL] : $sUrl; + + if (isset($aOptions[CURLOPT_FOLLOWLOCATION]) && $aOptions[CURLOPT_FOLLOWLOCATION] && 0 < \strlen($sUrl) && + ($bSafeMode || \ini_get('open_basedir') !== '')) + { + $aOptions[CURLOPT_FOLLOWLOCATION] = false; + + $iMaxRedirects = isset($aOptions[CURLOPT_MAXREDIRS]) ? $aOptions[CURLOPT_MAXREDIRS] : 5; + $iRedirectLimit = $iMaxRedirects; + + if ($iRedirectLimit > 0) + { + $sNewUrl = $sUrl; + + $oCurl = \curl_init($sUrl); + + $aAddOptions = array( + CURLOPT_URL => $sUrl, + CURLOPT_HEADER => true, + CURLOPT_NOBODY => true, + CURLOPT_FAILONERROR => false, + CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_FOLLOWLOCATION => false, + CURLOPT_FORBID_REUSE => false, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_TIMEOUT => 5 + ); + + if (isset($aOptions[CURLOPT_HTTPHEADER]) && \is_array($aOptions[CURLOPT_HTTPHEADER]) && 0 < \count($aOptions[CURLOPT_HTTPHEADER])) + { + $aAddOptions[CURLOPT_HTTPHEADER] = $aOptions[CURLOPT_HTTPHEADER]; + } + + \curl_setopt_array($oCurl, $aAddOptions); + + do + { + \curl_setopt($oCurl, CURLOPT_URL, $sNewUrl); + + $sHeader = \curl_exec($oCurl); + if (\curl_errno($oCurl)) + { + $iCode = 0; + } + else + { + $iCode = \curl_getinfo($oCurl, CURLINFO_HTTP_CODE); + if ($iCode === 301 || $iCode === 302) + { + $aMatches = array(); + \preg_match('/Location:(.*?)\n/', $sHeader, $aMatches); + $sNewUrl = \trim(\array_pop($aMatches)); + + if ($oLogger) + { + $oLogger->Write('cUrl: Location URL: '.$sNewUrl); + } + } + else + { + $iCode = 0; + } + } + + } while ($iCode && --$iRedirectLimit); + + \curl_close($oCurl); + if ($iRedirectLimit > 0 && 0 < \strlen($sNewUrl)) + { + $aOptions[CURLOPT_URL] = $sNewUrl; + } + } + } + + return null === $sNewUrl ? $sUrl : $sNewUrl; + } + + /** + * @param string $sUrl + * @param resource $rFile + * @param string $sCustomUserAgent = 'MailSo Http User Agent (v1)' + * @param string $sContentType = '' + * @param int $iCode = 0 + * @param \MailSo\Log\Logger $oLogger = null + * @param int $iTimeout = 10 + * @param string $sProxy = '' + * @param string $sProxyAuth = '' + * @param array $aHttpHeaders = array() + * @param bool $bFollowLocation = true + * + * @return bool + */ + public function SaveUrlToFile($sUrl, $rFile, $sCustomUserAgent = 'MailSo Http User Agent (v1)', &$sContentType = '', &$iCode = 0, + $oLogger = null, $iTimeout = 10, $sProxy = '', $sProxyAuth = '', $aHttpHeaders = array(), $bFollowLocation = true) + { + if (null === $sCustomUserAgent) + { + $sCustomUserAgent = 'MailSo Http User Agent (v1)'; + } + + if (!is_resource($rFile)) + { + if ($oLogger) + { + $oLogger->Write('cURL: input resource invalid.', \MailSo\Log\Enumerations\Type::WARNING); + } + + return false; + } + + $sUrl = \trim($sUrl); + if ('//' === substr($sUrl, 0, 2)) + { + $sUrl = 'http:'.$sUrl; + } + + $aOptions = array( + CURLOPT_URL => $sUrl, + CURLOPT_HEADER => false, + CURLOPT_FAILONERROR => true, + CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_FOLLOWLOCATION => !!$bFollowLocation, + CURLOPT_MAXREDIRS => 7, + CURLOPT_FILE => $rFile, + CURLOPT_TIMEOUT => (int) $iTimeout + ); + + if (0 < \strlen($sCustomUserAgent)) + { + $aOptions[CURLOPT_USERAGENT] = $sCustomUserAgent; + } + + if (0 < \strlen($sProxy)) + { + $aOptions[CURLOPT_PROXY] = $sProxy; + if (0 < \strlen($sProxyAuth)) + { + $aOptions[CURLOPT_PROXYUSERPWD] = $sProxyAuth; + } + } + + if (\is_array($aHttpHeaders) && 0 < \count($aHttpHeaders)) + { + $aOptions[CURLOPT_HTTPHEADER] = $aHttpHeaders; + } + + if ($oLogger) + { + $oLogger->Write('cUrl: URL: '.$sUrl); +// if (isset($aOptions[CURLOPT_HTTPHEADER]) && \is_array($aOptions[CURLOPT_HTTPHEADER]) && 0 < \count($aOptions[CURLOPT_HTTPHEADER])) +// { +// $oLogger->Write('cUrl: Headers: '.\print_r($aOptions[CURLOPT_HTTPHEADER], true)); +// } + } + + \MailSo\Base\Http::DetectAndHackFollowLocationUrl($sUrl, $aOptions, $oLogger); + + $oCurl = \curl_init(); + \curl_setopt_array($oCurl, $aOptions); + + $bResult = \curl_exec($oCurl); + + $iCode = (int) \curl_getinfo($oCurl, CURLINFO_HTTP_CODE); + $sContentType = (string) \curl_getinfo($oCurl, CURLINFO_CONTENT_TYPE); + + if ($oLogger) + { + $oLogger->Write('cUrl: Request result: '.($bResult ? 'true' : 'false').' (Status: '.$iCode.', ContentType: '.$sContentType.')'); + if (!$bResult || 200 !== $iCode) + { + $oLogger->Write('cUrl: Error: '.\curl_error($oCurl), \MailSo\Log\Enumerations\Type::WARNING); + } + } + + if (\is_resource($oCurl)) + { + \curl_close($oCurl); + } + + return $bResult; + } + + /** + * @param string $sUrl + * @param string $sCustomUserAgent = 'MailSo Http User Agent (v1)' + * @param string $sContentType = '' + * @param int $iCode = 0 + * @param \MailSo\Log\Logger $oLogger = null + * @param int $iTimeout = 10 + * @param string $sProxy = '' + * @param string $sProxyAuth = '' + * @param array $aHttpHeaders = array() + * @param bool $bFollowLocation = true + * + * @return string|bool + */ + public function GetUrlAsString($sUrl, $sCustomUserAgent = 'MailSo Http User Agent (v1)', &$sContentType = '', &$iCode = 0, + $oLogger = null, $iTimeout = 10, $sProxy = '', $sProxyAuth = '', $aHttpHeaders = array(), $bFollowLocation = true) + { + $rMemFile = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); + if ($this->SaveUrlToFile($sUrl, $rMemFile, $sCustomUserAgent, $sContentType, $iCode, $oLogger, $iTimeout, $sProxy, $sProxyAuth, $aHttpHeaders, $bFollowLocation) && \is_resource($rMemFile)) + { + \rewind($rMemFile); + return \stream_get_contents($rMemFile); + } + + return false; + } + + /** + * @param int $iExpireTime + * @param bool $bSetCacheHeader = true + * @param string $sEtag = '' + * + * @return bool + */ + public function ServerNotModifiedCache($iExpireTime, $bSetCacheHeader = true, $sEtag = '') + { + $bResult = false; + if (0 < $iExpireTime) + { + $iUtcTimeStamp = \time(); + $sIfModifiedSince = $this->GetHeader('If-Modified-Since', ''); + if (0 === \strlen($sIfModifiedSince)) + { + if ($bSetCacheHeader) + { + @\header('Cache-Control: public', true); + @\header('Pragma: public', true); + @\header('Last-Modified: '.\gmdate('D, d M Y H:i:s', $iUtcTimeStamp - $iExpireTime).' UTC', true); + @\header('Expires: '.\gmdate('D, j M Y H:i:s', $iUtcTimeStamp + $iExpireTime).' UTC', true); + + if (0 < strlen($sEtag)) + { + \header('Etag: '.$sEtag, true); + } + } + } + else + { + $this->StatusHeader(304); + $bResult = true; + } + } + + return $bResult; + } + + /** + * @staticvar boolean $bCache + */ + public function ServerNoCache() + { + static $bCache = false; + if (false === $bCache) + { + $bCache = true; + @\header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); + @\header('Last-Modified: '.\gmdate('D, d M Y H:i:s').' GMT'); + @\header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0'); + @\header('Cache-Control: post-check=0, pre-check=0', false); + @\header('Pragma: no-cache'); + } + } + + /** + * @staticvar boolean $bCache + * @param string $sEtag + * @param int $iLastModified + * @param int $iExpires + */ + public function ServerUseCache($sEtag, $iLastModified, $iExpires) + { + static $bCache = false; + if (false === $bCache) + { + $bCache = true; + @\header('Cache-Control: private', true); + @\header('ETag: '.$sEtag, true); + @\header('Last-Modified: '.\gmdate('D, d M Y H:i:s', $iLastModified).' UTC', true); + @\header('Expires: '.\gmdate('D, j M Y H:i:s', $iExpires).' UTC', true); + } + } + + /** + * @param int $iStatus + * + * @return void + */ + public function StatusHeader($iStatus, $sCustomStatusText = '') + { + $iStatus = (int) $iStatus; + if (99 < $iStatus) + { + $aStatus = array( + 200 => 'OK', + 206 => 'Partial Content', + 301 => 'Moved Permanently', + 304 => 'Not Modified', + 400 => 'Bad Request', + 401 => 'Unauthorized', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 416 => 'Requested range not satisfiable' + ); + + $sCustomStatusText = \trim($sCustomStatusText); + $sHeaderHead = \ini_get('cgi.rfc2616_headers') && false !== \strpos(\strtolower(\php_sapi_name()), 'cgi') ? 'Status:' : $this->ServerProtocol(); + $sHeaderText = (0 === \strlen($sCustomStatusText) && isset($aStatus[$iStatus]) ? $aStatus[$iStatus] : $sCustomStatusText); + + \header(\trim($sHeaderHead.' '.$iStatus.' '.$sHeaderText), true, $iStatus); + } + } + + /** + * @return string + */ + public function GetPath() + { + $sUrl = \ltrim(\substr($this->GetServer('SCRIPT_NAME', ''), 0, \strrpos($this->GetServer('SCRIPT_NAME', ''), '/')), '/'); + return '' === $sUrl ? '/' : '/'.$sUrl.'/'; + } + + /** + * @return string + */ + public function GetUrl() + { + return $this->GetServer('REQUEST_URI', ''); + } + + /** + * @return string + */ + public function GetFullUrl() + { + return $this->GetScheme().'://'.$this->GetHost(true, false).$this->GetPath(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/LinkFinder.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/LinkFinder.php new file mode 100755 index 00000000..73f92787 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/LinkFinder.php @@ -0,0 +1,298 @@ +iHtmlSpecialCharsFlags = (\defined('ENT_QUOTES') && \defined('ENT_SUBSTITUTE') && \defined('ENT_HTML401')) + ? ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 : ENT_QUOTES; + + if (\defined('ENT_IGNORE')) + { + $this->iHtmlSpecialCharsFlags |= ENT_IGNORE; + } + + $this->iOptimizationLimit = 300000; + + $this->Clear(); + } + + /** + * @return \MailSo\Base\LinkFinder + */ + public static function NewInstance() + { + return new self(); + } + + /** + * @return \MailSo\Base\LinkFinder + */ + public function Clear() + { + $this->aPrepearPlainStringUrls = array(); + $this->fLinkWrapper = null; + $this->fMailWrapper = null; + $this->sText = ''; + + return $this; + } + + /** + * @param string $sText + * + * @return \MailSo\Base\LinkFinder + */ + public function Text($sText) + { + $this->sText = $sText; + + return $this; + } + + /** + * @param mixed $fLinkWrapper + * + * @return \MailSo\Base\LinkFinder + */ + public function LinkWrapper($fLinkWrapper) + { + $this->fLinkWrapper = $fLinkWrapper; + + return $this; + } + + /** + * @param mixed $fMailWrapper + * + * @return \MailSo\Base\LinkFinder + */ + public function MailWrapper($fMailWrapper) + { + $this->fMailWrapper = $fMailWrapper; + + return $this; + } + + /** + * @param bool $bAddTargetBlank = false + * + * @return \MailSo\Base\LinkFinder + */ + public function UseDefaultWrappers($bAddTargetBlank = false) + { + $this->fLinkWrapper = function ($sLink) use ($bAddTargetBlank) { + + $sNameLink = $sLink; + if (!\preg_match('/^[a-z]{3,5}\:\/\//i', \ltrim($sLink))) + { + $sLink = 'http://'.\ltrim($sLink); + } + + return ''.$sNameLink.''; + }; + + $this->fMailWrapper = function ($sEmail) use ($bAddTargetBlank) { + return ''.$sEmail.''; + }; + + return $this; + } + + /** + * @param bool $bUseHtmlSpecialChars = true + * + * @return string + */ + public function CompileText($bUseHtmlSpecialChars = true) + { + $sText = \substr($this->sText, 0, $this->iOptimizationLimit); + $sSubText = \substr($this->sText, $this->iOptimizationLimit); + + $this->aPrepearPlainStringUrls = array(); + if (null !== $this->fLinkWrapper && \is_callable($this->fLinkWrapper)) + { + $sText = $this->findLinks($sText, $this->fLinkWrapper); + } + + if (null !== $this->fMailWrapper && \is_callable($this->fMailWrapper)) + { + $sText = $this->findMails($sText, $this->fMailWrapper); + } + + $sResult = ''; + if ($bUseHtmlSpecialChars) + { + $sResult = @\htmlentities($sText.$sSubText, $this->iHtmlSpecialCharsFlags, 'UTF-8'); + } + else + { + $sResult = $sText.$sSubText; + } + + unset($sText, $sSubText); + + if (0 < \count($this->aPrepearPlainStringUrls)) + { + $aPrepearPlainStringUrls = $this->aPrepearPlainStringUrls; + $sResult = \preg_replace_callback('/'.\preg_quote(\MailSo\Base\LinkFinder::OPEN_LINK, '/'). + '([\d]+)'.\preg_quote(\MailSo\Base\LinkFinder::CLOSE_LINK, '/').'/', + function ($aMatches) use ($aPrepearPlainStringUrls) { + $iIndex = (int) $aMatches[1]; + return isset($aPrepearPlainStringUrls[$iIndex]) ? $aPrepearPlainStringUrls[$iIndex] : ''; + }, $sResult); + + $this->aPrepearPlainStringUrls = array(); + } + + return $sResult; + } + + /** + * @param string $sText + * @param mixed $fWrapper + * + * @return string + */ + private function findLinks($sText, $fWrapper) + { + $sPattern = '/([\W]|^)((?:https?:\/\/)|(?:svn:\/\/)|(?:git:\/\/)|(?:s?ftps?:\/\/)|(?:www\.))'. + '((\S+?)(\\/)?)((?:>)?|[^\w\=\\/;\(\)\[\]]*?)(?=<|\s|$)/imu'; + + $aPrepearPlainStringUrls = $this->aPrepearPlainStringUrls; + $sText = \preg_replace_callback($sPattern, function ($aMatch) use ($fWrapper, &$aPrepearPlainStringUrls) { + + if (\is_array($aMatch) && 6 < \count($aMatch)) + { + while (\in_array($sChar = \substr($aMatch[3], -1), array(']', ')'))) + { + if (\substr_count($aMatch[3], ']' === $sChar ? '[': '(') - \substr_count($aMatch[3], $sChar) < 0) + { + $aMatch[3] = \substr($aMatch[3], 0, -1); + $aMatch[6] = (']' === $sChar ? ']': ')').$aMatch[6]; + } + else + { + break; + } + } + + $sLinkWithWrap = \call_user_func($fWrapper, $aMatch[2].$aMatch[3]); + if (\is_string($sLinkWithWrap) && 0 < \strlen($sLinkWithWrap)) + { + $aPrepearPlainStringUrls[] = \stripslashes($sLinkWithWrap); + return $aMatch[1]. + \MailSo\Base\LinkFinder::OPEN_LINK. + (\count($aPrepearPlainStringUrls) - 1). + \MailSo\Base\LinkFinder::CLOSE_LINK. + $aMatch[6]; + } + + return $aMatch[0]; + } + + return ''; + + }, $sText); + + if (0 < \count($aPrepearPlainStringUrls)) + { + $this->aPrepearPlainStringUrls = $aPrepearPlainStringUrls; + } + + return $sText; + } + + /** + * @param string $sText + * @param mixed $fWrapper + * + * @return string + */ + private function findMails($sText, $fWrapper) + { + $sPattern = '/([\w\.!#\$%\-+.]+@[A-Za-z0-9\-]+(\.[A-Za-z0-9\-]+)+)/'; + + $aPrepearPlainStringUrls = $this->aPrepearPlainStringUrls; + $sText = \preg_replace_callback($sPattern, function ($aMatch) use ($fWrapper, &$aPrepearPlainStringUrls) { + + if (\is_array($aMatch) && isset($aMatch[1])) + { + $sMailWithWrap = \call_user_func($fWrapper, $aMatch[1]); + if (\is_string($sMailWithWrap) && 0 < \strlen($sMailWithWrap)) + { + $aPrepearPlainStringUrls[] = \stripslashes($sMailWithWrap); + return \MailSo\Base\LinkFinder::OPEN_LINK. + (\count($aPrepearPlainStringUrls) - 1). + \MailSo\Base\LinkFinder::CLOSE_LINK; + } + + return $aMatch[1]; + } + + return ''; + + }, $sText); + + if (0 < \count($aPrepearPlainStringUrls)) + { + $this->aPrepearPlainStringUrls = $aPrepearPlainStringUrls; + } + + return $sText; + } +} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Loader.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Loader.php new file mode 100755 index 00000000..0a58e551 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Loader.php @@ -0,0 +1,137 @@ + array( + 'phpversion' => PHP_VERSION, + 'ssl' => (int) \function_exists('openssl_open'), + 'iconv' => (int) \function_exists('iconv') + )); + + if (\MailSo\Base\Utils::FunctionExistsAndEnabled('memory_get_usage') && + \MailSo\Base\Utils::FunctionExistsAndEnabled('memory_get_peak_usage')) + { + $aResult['php']['memory_get_usage'] = + Utils::FormatFileSize(\memory_get_usage(true), 2); + $aResult['php']['memory_get_peak_usage'] = + Utils::FormatFileSize(\memory_get_peak_usage(true), 2); + } + + $iTimeDelta = \microtime(true) - self::GetStatistic('Inited'); + self::SetStatistic('TimeDelta', $iTimeDelta); + + $aResult['statistic'] = self::$aSetStatistic; + $aResult['counts'] = self::$aIncStatistic; + $aResult['time'] = $iTimeDelta; + } + + return $aResult; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/ResourceRegistry.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/ResourceRegistry.php new file mode 100755 index 00000000..6e73ee79 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/ResourceRegistry.php @@ -0,0 +1,125 @@ + \MailSo\Mime\Enumerations\Constants::LINE_LENGTH, + 'line-break-chars' => \MailSo\Mime\Enumerations\Constants::CRLF + )); + + return \is_resource($rFilter) ? $rStream : false; + } + + self::$aStreams[$sHashName] = + array($rStream, $sUtilsDecodeOrEncodeFunctionName, $sFromEncoding, $sToEncoding); + + \MailSo\Base\Loader::IncStatistic('CreateStream/Binary'); + + return \fopen(self::STREAM_NAME.'://'.$sHashName, 'rb'); + } + + /** + * @param string $sPath + * + * @return bool + */ + public function stream_open($sPath) + { + $this->iPos = 0; + $this->sBuffer = ''; + $this->sReadEndBuffer = ''; + $this->rStream = false; + $this->sFromEncoding = null; + $this->sToEncoding = null; + $this->sFunctionName = null; + + $bResult = false; + $aPath = parse_url($sPath); + + if (isset($aPath['host']) && isset($aPath['scheme']) && + 0 < strlen($aPath['host']) && 0 < strlen($aPath['scheme']) && + self::STREAM_NAME === $aPath['scheme']) + { + $sHashName = $aPath['host']; + if (isset(self::$aStreams[$sHashName]) && + is_array(self::$aStreams[$sHashName]) && + 4 === count(self::$aStreams[$sHashName])) + { + $this->rStream = self::$aStreams[$sHashName][0]; + $this->sFunctionName = self::$aStreams[$sHashName][1]; + $this->sFromEncoding = self::$aStreams[$sHashName][2]; + $this->sToEncoding = self::$aStreams[$sHashName][3]; + } + + $bResult = is_resource($this->rStream); + } + + return $bResult; + } + + /** + * @param int $iCount + * + * @return string + */ + public function stream_read($iCount) + { + $sReturn = ''; + $sFunctionName = $this->sFunctionName; + + if ($iCount > 0) + { + if ($iCount < strlen($this->sBuffer)) + { + $sReturn = substr($this->sBuffer, 0, $iCount); + $this->sBuffer = substr($this->sBuffer, $iCount); + } + else + { + $sReturn = $this->sBuffer; + while ($iCount > 0) + { + if (feof($this->rStream)) + { + if (0 === strlen($this->sBuffer.$sReturn)) + { + return false; + } + + if (0 < strlen($this->sReadEndBuffer)) + { + $sReturn .= self::$sFunctionName($this->sReadEndBuffer, + $this->sReadEndBuffer, $this->sFromEncoding, $this->sToEncoding); + + $iDecodeLen = strlen($sReturn); + } + + $iCount = 0; + $this->sBuffer = ''; + } + else + { + $sReadResult = fread($this->rStream, 8192); + if (false === $sReadResult) + { + return false; + } + + $sReturn .= self::$sFunctionName($this->sReadEndBuffer.$sReadResult, + $this->sReadEndBuffer, $this->sFromEncoding, $this->sToEncoding); + + $iDecodeLen = strlen($sReturn); + if ($iCount < $iDecodeLen) + { + $this->sBuffer = substr($sReturn, $iCount); + $sReturn = substr($sReturn, 0, $iCount); + $iCount = 0; + } + else + { + $iCount -= $iDecodeLen; + } + } + } + } + + $this->iPos += strlen($sReturn); + return $sReturn; + } + + return false; + } + + /** + * @return int + */ + public function stream_write() + { + return 0; + } + + /** + * @return int + */ + public function stream_tell() + { + return $this->iPos; + } + + /** + * @return bool + */ + public function stream_eof() + { + return 0 === strlen($this->sBuffer) && feof($this->rStream); + } + + /** + * + * @return array + */ + public function stream_stat() + { + return array( + 'dev' => 2, + 'ino' => 0, + 'mode' => 33206, + 'nlink' => 1, + 'uid' => 0, + 'gid' => 0, + 'rdev' => 2, + 'size' => 0, + 'atime' => 1061067181, + 'mtime' => 1056136526, + 'ctime' => 1056136526, + 'blksize' => -1, + 'blocks' => -1 + ); + } + + /** + * @return bool + */ + public function stream_seek() + { + return false; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/Literal.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/Literal.php new file mode 100755 index 00000000..e92077ba --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/Literal.php @@ -0,0 +1,194 @@ +iPos = 0; + $this->iSize = 0; + $this->rStream = false; + + $bResult = false; + $aPath = parse_url($sPath); + + if (isset($aPath['host']) && isset($aPath['scheme']) && + 0 < strlen($aPath['host']) && 0 < strlen($aPath['scheme']) && + self::STREAM_NAME === $aPath['scheme']) + { + $sHashName = $aPath['host']; + if (isset(self::$aStreams[$sHashName]) && + is_array(self::$aStreams[$sHashName]) && + 2 === count(self::$aStreams[$sHashName])) + { + $this->rStream = self::$aStreams[$sHashName][0]; + $this->iSize = self::$aStreams[$sHashName][1]; + } + + $bResult = is_resource($this->rStream); + } + + return $bResult; + } + + /** + * @param int $iCount + * + * @return string + */ + public function stream_read($iCount) + { + $sResult = false; + if ($this->iSize < $this->iPos + $iCount) + { + $iCount = $this->iSize - $this->iPos; + } + + if ($iCount > 0) + { + $sReadResult = ''; + $iRead = $iCount; + while (0 < $iRead) + { + $sAddRead = @fread($this->rStream, $iRead); + if (false === $sAddRead) + { + $sReadResult = false; + break; + } + + $sReadResult .= $sAddRead; + $iRead -= strlen($sAddRead); + $this->iPos += strlen($sAddRead); + } + + if (false !== $sReadResult) + { + $sResult = $sReadResult; + } + } + + return $sResult; + } + + /** + * @return int + */ + public function stream_write() + { + return 0; + } + + /** + * @return int + */ + public function stream_tell() + { + return $this->iPos; + } + + /** + * @return bool + */ + public function stream_eof() + { + return $this->iPos >= $this->iSize; + } + + /** + * @return array + */ + public function stream_stat() + { + return array( + 'dev' => 2, + 'ino' => 0, + 'mode' => 33206, + 'nlink' => 1, + 'uid' => 0, + 'gid' => 0, + 'rdev' => 2, + 'size' => $this->iSize, + 'atime' => 1061067181, + 'mtime' => 1056136526, + 'ctime' => 1056136526, + 'blksize' => -1, + 'blocks' => -1 + ); + } + + /** + * @return bool + */ + public function stream_seek() + { + return false; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/SubStreams.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/SubStreams.php new file mode 100755 index 00000000..d82929bd --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/SubStreams.php @@ -0,0 +1,250 @@ +aSubStreams[$this->iIndex])) + { + return $this->aSubStreams[$this->iIndex]; + } + + return $nNull; + } + + /** + * @param string $sPath + * + * @return bool + */ + public function stream_open($sPath) + { + $this->aSubStreams = array(); + + $bResult = false; + $aPath = \parse_url($sPath); + + if (isset($aPath['host'], $aPath['scheme']) && + 0 < \strlen($aPath['host']) && 0 < \strlen($aPath['scheme']) && + self::STREAM_NAME === $aPath['scheme']) + { + $sHashName = $aPath['host']; + if (isset(self::$aStreams[$sHashName]) && + \is_array(self::$aStreams[$sHashName]) && + 0 < \count(self::$aStreams[$sHashName])) + { + $this->iIndex = 0; + $this->iPos = 0; + $this->bIsEnd = false; + $this->sBuffer = ''; + $this->aSubStreams = self::$aStreams[$sHashName]; + } + + $bResult = 0 < \count($this->aSubStreams); + } + + return $bResult; + } + + /** + * @param int $iCount + * + * @return string + */ + public function stream_read($iCount) + { + $sReturn = ''; + $mCurrentPart = null; + if ($iCount > 0) + { + if ($iCount < \strlen($this->sBuffer)) + { + $sReturn = \substr($this->sBuffer, 0, $iCount); + $this->sBuffer = \substr($this->sBuffer, $iCount); + } + else + { + $sReturn = $this->sBuffer; + while ($iCount > 0) + { + $mCurrentPart =& $this->getPart(); + if (null === $mCurrentPart) + { + $this->bIsEnd = true; + $this->sBuffer = ''; + $iCount = 0; + break; + } + + if (\is_resource($mCurrentPart)) + { + if (!\feof($mCurrentPart)) + { + $sReadResult = @\fread($mCurrentPart, 8192); + if (false === $sReadResult) + { + return false; + } + + $sReturn .= $sReadResult; + + $iLen = \strlen($sReturn); + if ($iCount < $iLen) + { + $this->sBuffer = \substr($sReturn, $iCount); + $sReturn = \substr($sReturn, 0, $iCount); + $iCount = 0; + } + else + { + $iCount -= $iLen; + } + } + else + { + $this->iIndex++; + } + } + } + } + + $this->iPos += \strlen($sReturn); + return $sReturn; + } + + return false; + } + + /** + * @return int + */ + public function stream_write() + { + return 0; + } + + /** + * @return int + */ + public function stream_tell() + { + return $this->iPos; + } + + /** + * @return bool + */ + public function stream_eof() + { + return $this->bIsEnd; + } + + /** + * @return array + */ + public function stream_stat() + { + return array( + 'dev' => 2, + 'ino' => 0, + 'mode' => 33206, + 'nlink' => 1, + 'uid' => 0, + 'gid' => 0, + 'rdev' => 2, + 'size' => 0, + 'atime' => 1061067181, + 'mtime' => 1056136526, + 'ctime' => 1056136526, + 'blksize' => -1, + 'blocks' => -1 + ); + } + + /** + * @return bool + */ + public function stream_seek() + { + return false; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/TempFile.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/TempFile.php new file mode 100755 index 00000000..196b2b5f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/TempFile.php @@ -0,0 +1,164 @@ +rSream = self::$aStreams[$sHashName]; + \fseek($this->rSream, 0); + $bResult = true; + } + else + { + $this->rSream = fopen('php://memory', 'r+b'); + self::$aStreams[$sHashName] = $this->rSream; + + $bResult = true; + + \MailSo\Base\Loader::IncStatistic('CreateStream/TempFile'); + } + } + + return $bResult; + } + + /** + * @return bool + */ + public function stream_close() + { + return true; + } + + /** + * @return bool + */ + public function stream_flush() + { + return fflush($this->rSream); + } + + /** + * @param int $iLen + * + * @return string + */ + public function stream_read($iLen) + { + return fread($this->rSream, $iLen); + } + + /** + * @param string $sInputString + * + * @return int + */ + public function stream_write($sInputString) + { + return fwrite($this->rSream, $sInputString); + } + + /** + * @return int + */ + public function stream_tell() + { + return ftell($this->rSream); + } + + /** + * @return bool + */ + public function stream_eof() + { + return feof($this->rSream); + } + + /** + * @return array + */ + public function stream_stat() + { + return fstat($this->rSream); + } + + /** + * @param int $iOffset + * @param int $iWhence = SEEK_SET + * + * @return int + */ + public function stream_seek($iOffset, $iWhence = SEEK_SET) + { + return fseek($this->rSream, $iOffset, $iWhence); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/Test.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/Test.php new file mode 100755 index 00000000..6e8c46e4 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/Test.php @@ -0,0 +1,138 @@ +rReadSream = self::$aStreams[$sHashName]; + $bResult = true; + } + } + + return $bResult; + } + + /** + * @param int $iCount + * + * @return string + */ + public function stream_read($iCount) + { + return fread($this->rReadSream, $iCount); + } + + /** + * @param string $sInputString + * + * @return int + */ + public function stream_write($sInputString) + { + return strlen($sInputString); + } + + /** + * @return int + */ + public function stream_tell() + { + return ftell($this->rReadSream); + } + + /** + * @return bool + */ + public function stream_eof() + { + return feof($this->rReadSream); + } + + /** + * @return array + */ + public function stream_stat() + { + return fstat($this->rReadSream); + } + + /** + * @return bool + */ + public function stream_seek() + { + return false; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Utils.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Utils.php new file mode 100755 index 00000000..2a8b8ef6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Utils.php @@ -0,0 +1,2536 @@ + 'utf-8', + '.20127' => 'iso-8859-1', + + '.1250' => 'windows-1250', + '.cp1250' => 'windows-1250', + '.cp-1250' => 'windows-1250', + '.1251' => 'windows-1251', + '.cp1251' => 'windows-1251', + '.cp-1251' => 'windows-1251', + '.1252' => 'windows-1252', + '.cp1252' => 'windows-1252', + '.cp-1252' => 'windows-1252', + '.1253' => 'windows-1253', + '.cp1253' => 'windows-1253', + '.cp-1253' => 'windows-1253', + '.1254' => 'windows-1254', + '.cp1254' => 'windows-1254', + '.cp-1254' => 'windows-1254', + '.1255' => 'windows-1255', + '.cp1255' => 'windows-1255', + '.cp-1255' => 'windows-1255', + '.1256' => 'windows-1256', + '.cp1256' => 'windows-1256', + '.cp-1256' => 'windows-1256', + '.1257' => 'windows-1257', + '.cp1257' => 'windows-1257', + '.cp-1257' => 'windows-1257', + '.1258' => 'windows-1258', + '.cp1258' => 'windows-1258', + '.cp-1258' => 'windows-1258', + + '.28591' => 'iso-8859-1', + '.28592' => 'iso-8859-2', + '.28593' => 'iso-8859-3', + '.28594' => 'iso-8859-4', + '.28595' => 'iso-8859-5', + '.28596' => 'iso-8859-6', + '.28597' => 'iso-8859-7', + '.28598' => 'iso-8859-8', + '.28599' => 'iso-8859-9', + '.28603' => 'iso-8859-13', + '.28605' => 'iso-8859-15', + + '.1125' => 'cp1125', + '.20866' => 'koi8-r', + '.21866' => 'koi8-u', + '.950' => 'big5', + '.936' => 'euc-cn', + '.20932' => 'euc-js', + '.949' => 'euc-kr', + ); + + /** + * @access private + */ + private function __construct() + { + } + + /** + * @return string + */ + public static function DetectSystemCharset() + { + $sResult = ''; + $sLocale = @\setlocale(LC_ALL, ''); + $sLocaleLower = \strtolower(\trim($sLocale)); + + foreach (\MailSo\Base\Utils::$aLocaleMapping as $sKey => $sValue) + { + if (false !== \strpos($sLocaleLower, $sKey) || + false !== \strpos($sLocaleLower, '.'.$sValue)) + { + $sResult = $sValue; + break; + } + } + + return $sResult; + } + + /** + * @return string + */ + public static function ConvertSystemString($sSrt) + { + $sSrt = \trim($sSrt); + if (!empty($sSrt) && !\MailSo\Base\Utils::IsUtf8($sSrt)) + { + $sCharset = \MailSo\Base\Utils::DetectSystemCharset(); + if (!empty($sCharset)) + { + $sSrt = \MailSo\Base\Utils::ConvertEncoding( + $sSrt, $sCharset, \MailSo\Base\Enumerations\Charset::UTF_8); + } + else + { + $sSrt = @\utf8_encode($sSrt); + } + } + + return $sSrt; + } + + /** + * @param string $sEncoding + * @param bool $bAsciAsUtf8 = false + * + * @return string + */ + public static function NormalizeCharset($sEncoding, $bAsciAsUtf8 = false) + { + $sEncoding = \strtolower($sEncoding); + + $sEncoding = \preg_replace('/^iso8/', 'iso-8', $sEncoding); + $sEncoding = \preg_replace('/^cp-([\d])/', 'cp$1', $sEncoding); + $sEncoding = \preg_replace('/^windows?12/', 'windows-12', $sEncoding); + + switch ($sEncoding) + { + case 'asci': + case 'ascii': + case 'us-asci': + case 'us-ascii': + $sEncoding = $bAsciAsUtf8 ? \MailSo\Base\Enumerations\Charset::UTF_8 : + \MailSo\Base\Enumerations\Charset::ISO_8859_1; + break; + case 'unicode-1-1-utf-7': + case 'unicode-1-utf-7': + case 'unicode-utf-7': + $sEncoding = \MailSo\Base\Enumerations\Charset::UTF_7; + break; + case 'utf8': + case 'utf-8': + $sEncoding = \MailSo\Base\Enumerations\Charset::UTF_8; + break; + case 'utf7imap': + case 'utf-7imap': + case 'utf7-imap': + case 'utf-7-imap': + $sEncoding = \MailSo\Base\Enumerations\Charset::UTF_7_IMAP; + break; + case 'ks-c-5601-1987': + case 'ks_c_5601-1987': + case 'ks_c_5601_1987': + $sEncoding = 'euc-kr'; + break; + case 'x-gbk': + $sEncoding = 'gb2312'; + break; + case 'iso-8859-i': + case 'iso-8859-8-i': + $sEncoding = \MailSo\Base\Enumerations\Charset::ISO_8859_8; + break; + } + + return $sEncoding; + } + + /** + * @param string $sCharset + * @param string $sValue + * + * @return string + */ + public static function NormalizeCharsetByValue($sCharset, $sValue) + { + $sCharset = \MailSo\Base\Utils::NormalizeCharset($sCharset); + + if (\MailSo\Base\Enumerations\Charset::UTF_8 !== $sCharset && + \MailSo\Base\Utils::IsUtf8($sValue) && + false === \strpos($sCharset, \MailSo\Base\Enumerations\Charset::ISO_2022_JP) + ) + { + $sCharset = \MailSo\Base\Enumerations\Charset::UTF_8; + } + + return $sCharset; + } + + /** + * @param string $sFilePath + * @param function $fFileExistsCallback = null + * + * @return string + */ + public static function SmartFileExists($sFilePath, $fFileExistsCallback = null) + { + $sFilePath = \str_replace('\\', '/', \trim($sFilePath)); + if (!$fFileExistsCallback) + { + $fFileExistsCallback = function ($sPath) { + return \file_exists($sPath); + }; + } + + if (!\call_user_func($fFileExistsCallback, $sFilePath)) + { + return $sFilePath; + } + + $aFileInfo = \pathinfo($sFilePath); + + $iIndex = 0; + + do + { + $iIndex++; + + $sFilePathNew = $aFileInfo['dirname'].'/'. + \preg_replace('/\(\d{1,2}\)$/', '', $aFileInfo['filename']). + ' ('.$iIndex.')'. + (empty($aFileInfo['extension']) ? '' : '.'.$aFileInfo['extension']) + ; + + if (!\call_user_func($fFileExistsCallback, $sFilePathNew)) + { + $sFilePath = $sFilePathNew; + break; + } + else if (10 < $iIndex) + { + break; + } + } + while (true); + + return $sFilePath; + } + + /** + * @return bool + */ + public static function IsMbStringSupported() + { + return \MailSo\Config::$MBSTRING && + \MailSo\Base\Utils::FunctionExistsAndEnabled('mb_convert_encoding'); + } + + /** + * @return bool + */ + public static function IsIconvSupported() + { + return \MailSo\Config::$ICONV && + \MailSo\Base\Utils::FunctionExistsAndEnabled('iconv'); + } + + /** + * @return bool + */ + public static function IsIconvIgnoreSupported() + { + static $bCache = null; + if (null !== $bCache) + { + return $bCache; + } + + $bCache = false; + if (\MailSo\Base\Utils::IsIconvSupported()) + { + if (false !== @\iconv('', '//IGNORE', '')) + { + $bCache = true; + } + } + + return $bCache; + } + + /** + * @return bool + */ + public static function IsIconvTranslitSupported() + { + static $bCache = null; + if (null !== $bCache) + { + return $bCache; + } + + $bCache = false; + if (\MailSo\Base\Utils::IsIconvSupported()) + { + if (false !== @\iconv('', '//TRANSLIT', '')) + { + $bCache = true; + } + } + + return $bCache; + } + + /** + * @param string $sCharset + * + * @return bool + */ + public static function ValidateCharsetName($sCharset) + { + $sCharset = \strtolower(\MailSo\Base\Utils::NormalizeCharset($sCharset)); + return 0 < \strlen($sCharset) && (\in_array($sCharset, array(\MailSo\Base\Enumerations\Charset::UTF_7_IMAP)) || + \in_array($sCharset, \MailSo\Base\Utils::$SuppostedCharsets)); + } + + /** + * @param string $sInputString + * @param string $sInputFromEncoding + * @param string $sInputToEncoding + * + * @return string|bool + */ + public static function IconvConvertEncoding($sInputString, $sInputFromEncoding, $sInputToEncoding) + { + $sIconvOptions = ''; + if (\MailSo\Base\Utils::IsIconvIgnoreSupported()) + { + $sIconvOptions .= '//IGNORE'; + } +// if (\MailSo\Base\Utils::IsIconvTranslitSupported()) +// { +// $sIconvOptions .= '//TRANSLIT'; +// } + + $mResult = @\iconv(\strtoupper($sInputFromEncoding), \strtoupper($sInputToEncoding).$sIconvOptions, $sInputString); + if (false === $mResult) + { + if (\MailSo\Log\Logger::IsSystemEnabled()) + { + \MailSo\Log\Logger::SystemLog(array( + 'inc' => \strtoupper($sInputFromEncoding), + 'out' => \strtoupper($sInputToEncoding).$sIconvOptions, + 'val' => 500 < \strlen($sInputString) ? \substr($sInputString, 0, 500) : $sInputString, + 'hex' => 500 < \strlen($sInputString) ? '-- to long --' : \bin2hex($sInputString) + ), \MailSo\Log\Enumerations\Type::NOTICE); + } + + if (\MailSo\Config::$FixIconvByMbstring && \MailSo\Base\Utils::IsMbStringSupported()) + { + $mResult = \MailSo\Base\Utils::MbConvertEncoding($sInputString, $sInputFromEncoding, $sInputToEncoding); + } + } + return $mResult; + } + + /** + * @param string $sInputString + * @param string $sInputFromEncoding + * @param string $sInputToEncoding + * + * @return string|bool + */ + public static function MbConvertEncoding($sInputString, $sInputFromEncoding, $sInputToEncoding) + { + static $sMbstringSubCh = null; + if (null === $sMbstringSubCh) + { + $sMbstringSubCh = \mb_substitute_character(); + } + + \mb_substitute_character('none'); + $sResult = @\mb_convert_encoding($sInputString, \strtoupper($sInputToEncoding), \strtoupper($sInputFromEncoding)); + \mb_substitute_character($sMbstringSubCh); + + return $sResult; + } + + /** + * @param string $sInputString + * @param string $sInputFromEncoding + * @param string $sInputToEncoding + * + * @return string + */ + public static function ConvertEncoding($sInputString, $sInputFromEncoding, $sInputToEncoding) + { + $sResult = $sInputString; + + $sFromEncoding = \MailSo\Base\Utils::NormalizeCharset($sInputFromEncoding); + $sToEncoding = \MailSo\Base\Utils::NormalizeCharset($sInputToEncoding); + + if ('' === \trim($sResult) || ($sFromEncoding === $sToEncoding && \MailSo\Base\Enumerations\Charset::UTF_8 !== $sFromEncoding)) + { + return $sResult; + } + + $bUnknown = false; + switch (true) + { + default: + $bUnknown = true; + break; + + case ($sFromEncoding === \MailSo\Base\Enumerations\Charset::ISO_8859_1 && + $sToEncoding === \MailSo\Base\Enumerations\Charset::UTF_8 && + \function_exists('utf8_encode')): + + $sResult = \utf8_encode($sResult); + break; + + case ($sFromEncoding === \MailSo\Base\Enumerations\Charset::UTF_8 && + $sToEncoding === \MailSo\Base\Enumerations\Charset::ISO_8859_1 && + \function_exists('utf8_decode')): + + $sResult = \utf8_decode($sResult); + break; + + case ($sFromEncoding === \MailSo\Base\Enumerations\Charset::UTF_7_IMAP && + $sToEncoding === \MailSo\Base\Enumerations\Charset::UTF_8): + + $sResult = \MailSo\Base\Utils::Utf7ModifiedToUtf8($sResult); + if (false === $sResult) + { + $sResult = $sInputString; + } + break; + + case ($sFromEncoding === \MailSo\Base\Enumerations\Charset::UTF_8 && + $sToEncoding === \MailSo\Base\Enumerations\Charset::UTF_7_IMAP): + + $sResult = \MailSo\Base\Utils::Utf8ToUtf7Modified($sResult); + if (false === $sResult) + { + $sResult = $sInputString; + } + break; + + case ($sFromEncoding === \MailSo\Base\Enumerations\Charset::UTF_7_IMAP): + + $sResult = \MailSo\Base\Utils::ConvertEncoding( + \MailSo\Base\Utils::ModifiedToPlainUtf7($sResult), + \MailSo\Base\Enumerations\Charset::UTF_7, + $sToEncoding + ); + break; + + case (\in_array(\strtolower($sFromEncoding), \MailSo\Base\Utils::$SuppostedCharsets)): + + if (\MailSo\Base\Utils::IsIconvSupported()) + { + $sResult = \MailSo\Base\Utils::IconvConvertEncoding($sResult, $sFromEncoding, $sToEncoding); + } + else if (\MailSo\Base\Utils::IsMbStringSupported()) + { + $sResult = \MailSo\Base\Utils::MbConvertEncoding($sResult, $sFromEncoding, $sToEncoding); + } + + $sResult = (false !== $sResult) ? $sResult : $sInputString; + break; + } + + if ($bUnknown && \MailSo\Base\Utils::IsMbStringSupported()) + { + $sResult = @\mb_convert_encoding($sResult, $sToEncoding); + } + + return $sResult; + } + + /** + * @param string $sValue + * + * @return bool + */ + public static function IsAscii($sValue) + { + if ('' === \trim($sValue)) + { + return true; + } + + return !\preg_match('/[^\x09\x10\x13\x0A\x0D\x20-\x7E]/', $sValue); + } + + /** + * @param string $sValue + * + * @return string + */ + public static function StrToLowerIfAscii($sValue) + { + return \MailSo\Base\Utils::IsAscii($sValue) ? \strtolower($sValue) : $sValue; + } + + /** + * @param string $sValue + * + * @return string + */ + public static function StrToUpperIfAscii($sValue) + { + return \MailSo\Base\Utils::IsAscii($sValue) ? \strtoupper($sValue) : $sValue; + } + + /** + * @param string $sValue + * + * @return string + */ + public static function StrMailDomainToLowerIfAscii($sValue) + { + $aParts = \explode('@', $sValue, 2); + if (!empty($aParts[1])) + { + $aParts[1] = \MailSo\Base\Utils::IsAscii($aParts[1]) ? \strtolower($aParts[1]) : $aParts[1]; + } + + return \implode('@', $aParts); + } + + /** + * @param string $sValue + * + * @return string + */ + public static function StripSpaces($sValue) + { + return \MailSo\Base\Utils::Trim( + \preg_replace('/[\s]+/u', ' ', $sValue)); + } + + /** + * @param string $sValue + * + * @return bool + */ + public static function IsUtf8($sValue) + { + return (bool) (\function_exists('mb_check_encoding') ? + \mb_check_encoding($sValue, 'UTF-8') : \preg_match('//u', $sValue)); + } + + /** + * @param int $iSize + * @param int $iRound + * + * @return string + */ + public static function FormatFileSize($iSize, $iRound = 0) + { + $aSizes = array('B', 'KB', 'MB'); + for ($iIndex = 0; $iSize > 1024 && isset($aSizes[$iIndex + 1]); $iIndex++) + { + $iSize /= 1024; + } + return \round($iSize, $iRound).$aSizes[$iIndex]; + } + + /** + * @param string $sEncodedValue + * @param string $sEncodeingType + * + * @return string + */ + public static function DecodeEncodingValue($sEncodedValue, $sEncodeingType) + { + $sResult = $sEncodedValue; + switch (\strtolower($sEncodeingType)) + { + case 'q': + case 'quoted_printable': + case 'quoted-printable': + $sResult = \quoted_printable_decode($sResult); + break; + case 'b': + case 'base64': + $sResult = \MailSo\Base\Utils::Base64Decode($sResult); + break; + } + return $sResult; + } + + /** + * @param string $sInputValue + * + * @return string + */ + public static function DecodeFlowedFormat($sInputValue) + { + return \preg_replace('/ ([\r]?[\n])/m', ' ', $sInputValue); + } + + /** + * @param string $sEncodedValue + * @param string $sIncomingCharset = '' + * @param string $sForcedIncomingCharset = '' + * + * @return string + */ + public static function DecodeHeaderValue($sEncodedValue, $sIncomingCharset = '', $sForcedIncomingCharset = '') + { + $sValue = $sEncodedValue; + if (0 < \strlen($sIncomingCharset)) + { + $sIncomingCharset = \MailSo\Base\Utils::NormalizeCharsetByValue($sIncomingCharset, $sValue); + + $sValue = \MailSo\Base\Utils::ConvertEncoding($sValue, $sIncomingCharset, + \MailSo\Base\Enumerations\Charset::UTF_8); + } + + $sValue = \preg_replace('/\?=[\n\r\t\s]{1,5}=\?/m', '?==?', $sValue); + $sValue = \preg_replace('/[\r\n\t]+/m', ' ', $sValue); + + $aEncodeArray = array(''); + $aMatch = array(); +// \preg_match_all('/=\?[^\?]+\?[q|b|Q|B]\?[^\?]*?\?=/', $sValue, $aMatch); + \preg_match_all('/=\?[^\?]+\?[q|b|Q|B]\?.*?\?=/', $sValue, $aMatch); + + if (isset($aMatch[0]) && \is_array($aMatch[0])) + { + for ($iIndex = 0, $iLen = \count($aMatch[0]); $iIndex < $iLen; $iIndex++) + { + if (isset($aMatch[0][$iIndex])) + { + $iPos = @\strpos($aMatch[0][$iIndex], '*'); + if (false !== $iPos) + { + $aMatch[0][$iIndex][0] = \substr($aMatch[0][$iIndex][0], 0, $iPos); + } + } + } + + $aEncodeArray = $aMatch[0]; + } + + $aParts = array(); + + $sMainCharset = ''; + $bOneCharset = true; + + for ($iIndex = 0, $iLen = \count($aEncodeArray); $iIndex < $iLen; $iIndex++) + { + $aTempArr = array('', $aEncodeArray[$iIndex]); + if ('=?' === \substr(\trim($aTempArr[1]), 0, 2)) + { + $iPos = \strpos($aTempArr[1], '?', 2); + $aTempArr[0] = \substr($aTempArr[1], 2, $iPos - 2); + $sEncType = \strtoupper($aTempArr[1]{$iPos + 1}); + switch ($sEncType) + { + case 'Q': + $sHeaderValuePart = \str_replace('_', ' ', $aTempArr[1]); + $aTempArr[1] = \quoted_printable_decode(\substr( + $sHeaderValuePart, $iPos + 3, \strlen($sHeaderValuePart) - $iPos - 5)); + break; + case 'B': + $sHeaderValuePart = $aTempArr[1]; + $aTempArr[1] = \MailSo\Base\Utils::Base64Decode(\substr( + $sHeaderValuePart, $iPos + 3, \strlen($sHeaderValuePart) - $iPos - 5)); + break; + } + } + + if (0 < \strlen($aTempArr[0])) + { + $sCharset = 0 === \strlen($sForcedIncomingCharset) ? $aTempArr[0] : $sForcedIncomingCharset; + $sCharset = \MailSo\Base\Utils::NormalizeCharset($sCharset, true); + + if ('' === $sMainCharset) + { + $sMainCharset = $sCharset; + } + else if ($sMainCharset !== $sCharset) + { + $bOneCharset = false; + } + } + + $aParts[] = array( + $aEncodeArray[$iIndex], + $aTempArr[1], + $sCharset + ); + + unset($aTempArr); + } + + for ($iIndex = 0, $iLen = \count($aParts); $iIndex < $iLen; $iIndex++) + { + if ($bOneCharset) + { + $sValue = \str_replace($aParts[$iIndex][0], $aParts[$iIndex][1], $sValue); + } + else + { + $aParts[$iIndex][2] = \MailSo\Base\Utils::NormalizeCharsetByValue($aParts[$iIndex][2], $aParts[$iIndex][1]); + + $sValue = \str_replace($aParts[$iIndex][0], + \MailSo\Base\Utils::ConvertEncoding($aParts[$iIndex][1], $aParts[$iIndex][2], \MailSo\Base\Enumerations\Charset::UTF_8), + $sValue); + } + } + + if ($bOneCharset && 0 < \strlen($sMainCharset)) + { + $sMainCharset = \MailSo\Base\Utils::NormalizeCharsetByValue($sMainCharset, $sValue); + $sValue = \MailSo\Base\Utils::ConvertEncoding($sValue, $sMainCharset, \MailSo\Base\Enumerations\Charset::UTF_8); + } + + return $sValue; + } + + /** + * @param string $sIncHeaders + * @param string $aHeadersToRemove = array() + * + * @return string + */ + public static function RemoveHeaderFromHeaders($sIncHeaders, $aHeadersToRemove = array()) + { + $sResultHeaders = $sIncHeaders; + + if (\is_array($aHeadersToRemove) && 0 < \count($aHeadersToRemove)) + { + $aHeadersToRemove = \array_map('strtolower', $aHeadersToRemove); + + $sIncHeaders = \preg_replace('/[\r\n]+/', "\n", $sIncHeaders); + $aHeaders = \explode("\n", $sIncHeaders); + + $bSkip = false; + $aResult = array(); + + foreach ($aHeaders as $sLine) + { + if (0 < \strlen($sLine)) + { + $sFirst = \substr($sLine,0,1); + if (' ' === $sFirst || "\t" === $sFirst) + { + if (!$bSkip) + { + $aResult[] = $sLine; + } + } + else + { + $bSkip = false; + $aParts = \explode(':', $sLine, 2); + + if (!empty($aParts) && !empty($aParts[0])) + { + if (\in_array(\strtolower(\trim($aParts[0])), $aHeadersToRemove)) + { + $bSkip = true; + } + else + { + $aResult[] = $sLine; + } + } + } + } + } + + $sResultHeaders = \implode("\r\n", $aResult); + } + + return $sResultHeaders; + } + + /** + * @param string $sEncodeType + * @param string $sValue + * + * @return string + */ + public static function EncodeUnencodedValue($sEncodeType, $sValue) + { + $sValue = \trim($sValue); + if (0 < \strlen($sValue) && !\MailSo\Base\Utils::IsAscii($sValue)) + { + switch (\strtoupper($sEncodeType)) + { + case 'B': + $sValue = '=?'.\strtolower(\MailSo\Base\Enumerations\Charset::UTF_8). + '?B?'.\base64_encode($sValue).'?='; + break; + + case 'Q': + $sValue = '=?'.\strtolower(\MailSo\Base\Enumerations\Charset::UTF_8). + '?Q?'.\str_replace(array('?', ' ', '_'), array('=3F', '_', '=5F'), + \quoted_printable_encode($sValue)).'?='; + break; + } + } + + return $sValue; + } + + /** + * @unused + * + * @param string $sEncodeType + * @param string $sEncodeCharset + * @param string $sValue + * + * @return string + */ + public static function EncodeHeaderValue($sEncodeType, $sEncodeCharset, $sValue) + { + $sValue = \trim($sValue); + if (0 < \strlen($sValue) && !\MailSo\Base\Utils::IsAscii($sValue)) + { + switch (\strtoupper($sEncodeType)) + { + case 'B': + $sValue = '=?'.\strtolower($sEncodeCharset).'?B?'.\base64_encode($sValue).'?='; + break; + + case 'Q': + $sValue = '=?'.\strtolower($sEncodeCharset).'?Q?'.\str_replace( + array('?', ' ', '_'), array('=3F', '_', '=5F'), + \quoted_printable_encode($sValue)).'?='; + break; + } + } + + return \trim($sValue); + } + + /** + * @param string $sAttrName + * @param string $sValue = 'utf-8' + * @param string $sCharset = '' + * @param string $sLang = '' + * @param int $iLen = 78 + * + * @return string|bool + */ + public static function AttributeRfc2231Encode($sAttrName, $sValue, $sCharset = 'utf-8', $sLang = '', $iLen = 1000) + { + $sValue = \strtoupper($sCharset).'\''.$sLang.'\''. + \preg_replace_callback('/[\x00-\x20*\'%()<>@,;:\\\\"\/[\]?=\x80-\xFF]/', function ($match) { + return \rawurlencode($match[0]); + }, $sValue); + + $iNlen = \strlen($sAttrName); + $iVlen = \strlen($sValue); + + if (\strlen($sAttrName) + $iVlen > $iLen - 3) + { + $sections = array(); + $section = 0; + + for ($i = 0, $j = 0; $i < $iVlen; $i += $j) + { + $j = $iLen - $iNlen - \strlen($section) - 4; + $sections[$section++] = \substr($sValue, $i, $j); + } + + for ($i = 0, $n = $section; $i < $n; $i++) + { + $sections[$i] = ' '.$sAttrName.'*'.$i.'*='.$sections[$i]; + } + + return \implode(";\r\n", $sections); + } + else + { + return $sAttrName.'*='.$sValue; + } + } + /** + * @param string $sAttrName + * @param string $sValue + * + * @return string + */ + public static function EncodeHeaderUtf8AttributeValue($sAttrName, $sValue) + { + $sAttrName = \trim($sAttrName); + $sValue = \trim($sValue); + + if (0 < \strlen($sValue) && !\MailSo\Base\Utils::IsAscii($sValue)) + { + if (!empty($_SERVER['HTTP_USER_AGENT']) && 0 < \strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE')) + { + $sValue = $sAttrName.'="'.\preg_replace('/[+\s]+/', '%20', \urlencode($sValue)).'"'; + } + else + { + $sValue = \MailSo\Base\Utils::AttributeRfc2231Encode($sAttrName, $sValue); + } + } + else + { + $sValue = $sAttrName.'="'.\str_replace('"', '\\"', $sValue).'"'; + } + + return \trim($sValue); + } + + /** + * @param string $sEmail + * + * @return string + */ + public static function GetAccountNameFromEmail($sEmail) + { + $sResult = ''; + if (0 < \strlen($sEmail)) + { + $iPos = \strrpos($sEmail, '@'); + $sResult = (false === $iPos) ? $sEmail : \substr($sEmail, 0, $iPos); + } + + return $sResult; + } + + /** + * @param string $sEmail + * + * @return string + */ + public static function GetDomainFromEmail($sEmail) + { + $sResult = ''; + if (0 < \strlen($sEmail)) + { + $iPos = \strrpos($sEmail, '@'); + if (false !== $iPos && 0 < $iPos) + { + $sResult = \substr($sEmail, $iPos + 1); + } + } + + return $sResult; + } + + /** + * @param string $sDomain + * + * @return string + */ + public static function GetClearDomainName($sDomain) + { + $sResultDomain = \preg_replace( + '/^(webmail|email|mail|www|imap4|pop3|imap|pop|demo|client|ssl|secure|test|cloud|box|m)\./i', + '', $sDomain); + + return false === \strpos($sResultDomain, '.') ? $sDomain : $sResultDomain; + } + + /** + * @param string $sFileName + * + * @return string + */ + public static function GetFileExtension($sFileName) + { + $iLast = \strrpos($sFileName, '.'); + return false === $iLast ? '' : \strtolower(\substr($sFileName, $iLast + 1)); + } + + /** + * @param string $sFileName + * + * @return string + */ + public static function MimeContentType($sFileName) + { + $sResult = 'application/octet-stream'; + $sFileName = \trim(\strtolower($sFileName)); + + if ('winmail.dat' === $sFileName) + { + return 'application/ms-tnef'; + } + + $aMimeTypes = array( + + 'eml' => 'message/rfc822', + 'mime' => 'message/rfc822', + 'txt' => 'text/plain', + 'text' => 'text/plain', + 'def' => 'text/plain', + 'list' => 'text/plain', + 'in' => 'text/plain', + 'ini' => 'text/plain', + 'log' => 'text/plain', + 'sql' => 'text/plain', + 'cfg' => 'text/plain', + 'conf' => 'text/plain', + 'asc' => 'text/plain', + 'rtx' => 'text/richtext', + 'vcard' => 'text/vcard', + 'vcf' => 'text/vcard', + 'htm' => 'text/html', + 'html' => 'text/html', + 'csv' => 'text/csv', + 'ics' => 'text/calendar', + 'ifb' => 'text/calendar', + 'xml' => 'text/xml', + 'json' => 'application/json', + 'swf' => 'application/x-shockwave-flash', + 'hlp' => 'application/winhlp', + 'wgt' => 'application/widget', + 'chm' => 'application/vnd.ms-htmlhelp', + 'p10' => 'application/pkcs10', + 'p7c' => 'application/pkcs7-mime', + 'p7m' => 'application/pkcs7-mime', + 'p7s' => 'application/pkcs7-signature', + 'torrent' => 'application/x-bittorrent', + + // scripts + 'js' => 'application/javascript', + 'pl' => 'text/perl', + 'css' => 'text/css', + 'asp' => 'text/asp', + 'php' => 'application/x-httpd-php', + 'php3' => 'application/x-httpd-php', + 'php4' => 'application/x-httpd-php', + 'php5' => 'application/x-httpd-php', + 'phtml' => 'application/x-httpd-php', + + // images + 'png' => 'image/png', + 'jpg' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'jpe' => 'image/jpeg', + 'jfif' => 'image/jpeg', + 'gif' => 'image/gif', + 'bmp' => 'image/bmp', + 'cgm' => 'image/cgm', + 'ief' => 'image/ief', + 'ico' => 'image/x-icon', + 'tif' => 'image/tiff', + 'tiff' => 'image/tiff', + 'svg' => 'image/svg+xml', + 'svgz' => 'image/svg+xml', + 'djv' => 'image/vnd.djvu', + 'djvu' => 'image/vnd.djvu', + 'webp' => 'image/webp', + + // archives + 'zip' => 'application/zip', + '7z' => 'application/x-7z-compressed', + 'rar' => 'application/x-rar-compressed', + 'exe' => 'application/x-msdownload', + 'dll' => 'application/x-msdownload', + 'scr' => 'application/x-msdownload', + 'com' => 'application/x-msdownload', + 'bat' => 'application/x-msdownload', + 'msi' => 'application/x-msdownload', + 'cab' => 'application/vnd.ms-cab-compressed', + 'gz' => 'application/x-gzip', + 'tgz' => 'application/x-gzip', + 'bz' => 'application/x-bzip', + 'bz2' => 'application/x-bzip2', + 'deb' => 'application/x-debian-package', + + // fonts + 'psf' => 'application/x-font-linux-psf', + 'otf' => 'application/x-font-otf', + 'pcf' => 'application/x-font-pcf', + 'snf' => 'application/x-font-snf', + 'ttf' => 'application/x-font-ttf', + 'ttc' => 'application/x-font-ttf', + + // audio + 'mp3' => 'audio/mpeg', + 'amr' => 'audio/amr', + 'aac' => 'audio/x-aac', + 'aif' => 'audio/x-aiff', + 'aifc' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'wav' => 'audio/x-wav', + 'wma' => 'audio/x-ms-wma', + 'wax' => 'audio/x-ms-wax', + 'midi' => 'audio/midi', + 'mp4a' => 'audio/mp4', + 'ogg' => 'audio/ogg', + 'weba' => 'audio/webm', + 'ra' => 'audio/x-pn-realaudio', + 'ram' => 'audio/x-pn-realaudio', + 'rmp' => 'audio/x-pn-realaudio-plugin', + 'm3u' => 'audio/x-mpegurl', + + // video + 'flv' => 'video/x-flv', + 'qt' => 'video/quicktime', + 'mov' => 'video/quicktime', + 'avi' => 'video/x-msvideo', + 'mpg' => 'video/mpeg', + 'mpeg' => 'video/mpeg', + 'mpe' => 'video/mpeg', + 'm1v' => 'video/mpeg', + 'm2v' => 'video/mpeg', + '3gp' => 'video/3gpp', + '3g2' => 'video/3gpp2', + 'h261' => 'video/h261', + 'h263' => 'video/h263', + 'h264' => 'video/h264', + 'jpgv' => 'video/jpgv', + 'mp4' => 'video/mp4', + 'mp4v' => 'video/mp4', + 'mpg4' => 'video/mp4', + 'ogv' => 'video/ogg', + 'webm' => 'video/webm', + 'm4v' => 'video/x-m4v', + 'asf' => 'video/x-ms-asf', + 'asx' => 'video/x-ms-asf', + 'wm' => 'video/x-ms-wm', + 'wmv' => 'video/x-ms-wmv', + 'wmx' => 'video/x-ms-wmx', + 'wvx' => 'video/x-ms-wvx', + 'movie' => 'video/x-sgi-movie', + + // adobe + 'pdf' => 'application/pdf', + 'psd' => 'image/vnd.adobe.photoshop', + 'ai' => 'application/postscript', + 'eps' => 'application/postscript', + 'ps' => 'application/postscript', + + // ms office + 'doc' => 'application/msword', + 'dot' => 'application/msword', + 'rtf' => 'application/rtf', + 'xls' => 'application/vnd.ms-excel', + 'ppt' => 'application/vnd.ms-powerpoint', + 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', + 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + + // open office + 'odt' => 'application/vnd.oasis.opendocument.text', + 'ods' => 'application/vnd.oasis.opendocument.spreadsheet' + + ); + + $sExt = \MailSo\Base\Utils::GetFileExtension($sFileName); + if (0 < \strlen($sExt) && isset($aMimeTypes[$sExt])) + { + $sResult = $aMimeTypes[$sExt]; + } + + return $sResult; + } + + /** + * @param string $sContentType + * @param string $sFileName + * + * @return string + */ + public static function ContentTypeType($sContentType, $sFileName) + { + $sResult = ''; + $sContentType = \strtolower($sContentType); + if (0 === \strpos($sContentType, 'image/')) + { + $sResult = 'image'; + } + else + { + switch ($sContentType) + { + case 'application/zip': + case 'application/x-7z-compressed': + case 'application/x-rar-compressed': + case 'application/x-msdownload': + case 'application/vnd.ms-cab-compressed': + case 'application/x-gzip': + case 'application/x-bzip': + case 'application/x-bzip2': + case 'application/x-debian-package': + $sResult = 'archive'; + break; + case 'application/msword': + case 'application/rtf': + case 'application/vnd.ms-excel': + case 'application/vnd.ms-powerpoint': + case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': + case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': + case 'application/vnd.openxmlformats-officedocument.wordprocessingml.template': + case 'application/vnd.openxmlformats-officedocument.presentationml.presentation': + case 'application/vnd.oasis.opendocument.text': + case 'application/vnd.oasis.opendocument.spreadsheet': + $sResult = 'doc'; + break; + case 'application/pdf': + case 'application/x-pdf': + $sResult = 'pdf'; + break; + } + + if ('' === $sResult) + { + switch (\strtolower(\MailSo\Base\Utils::GetFileExtension($sFileName))) + { + case 'zip': + case '7z': + case 'rar': + $sResult = 'archive'; + break; + } + } + } + + return $sResult; + } + + /** + * @staticvar bool $bValidateAction + * + * @param int $iTimeToReset = 15 + * @param int $iTimeToAdd = 120 + * + * @return bool + */ + public static function ResetTimeLimit($iTimeToReset = 15, $iTimeToAdd = 120) + { + $iTime = \time(); + if ($iTime < \MailSo\Base\Loader::$InitTime + 5) + { + // do nothing first 5s + return true; + } + + static $bValidateAction = null; + static $iResetTimer = null; + + if (null === $bValidateAction) + { + $iResetTimer = 0; + + $sSafeMode = \strtolower(\trim(@\ini_get('safe_mode'))); + $bSafeMode = 'on' === $sSafeMode || '1' === $sSafeMode || 'true' === $sSafeMode; + + $bValidateAction = !$bSafeMode && \MailSo\Base\Utils::FunctionExistsAndEnabled('set_time_limit'); + } + + if ($bValidateAction && $iTimeToReset < $iTime - $iResetTimer) + { + $iResetTimer = $iTime; + if (!@\set_time_limit($iTimeToAdd)) + { + $bValidateAction = false; + return false; + } + + return true; + } + + return false; + } + + /** + * @param string $sText + * + * @return string + */ + public static function InlineRebuildStringToJsString($sText) + { + static $aJsonReplaces = array( + array('\\', "\n", "\t", "\r", '\b', "\f", '"'), + array('\\\\', '\\n', '\\t', '\\r', '\\b', '\\f', '\"') + ); + + return \str_replace('', '<\/script>', + \str_replace($aJsonReplaces[0], $aJsonReplaces[1], $sText)); + } + + /** + * @param array $aInput + */ + public static function ClearArrayUtf8Values(&$aInput) + { + if (\is_array($aInput)) + { + foreach ($aInput as $mKey => $mItem) + { + if (\is_string($mItem)) + { + $aInput[$mKey] = \MailSo\Base\Utils::Utf8Clear($mItem); + } + else if (\is_array($mItem)) + { + \MailSo\Base\Utils::ClearArrayUtf8Values($mItem); + $aInput[$mKey] = $mItem; + } + } + } + } + + /** + * @param mixed $mInput + * @param \MailSo\Log\Logger|null $oLogger = null + * + * @return string + */ + public static function Php2js($mInput, $oLogger = null) + { + static $iOpt = null; + if (null === $iOpt) + { + $iOpt = \defined('JSON_UNESCAPED_UNICODE') ? JSON_UNESCAPED_UNICODE : 0; + } + + $sResult = @\json_encode($mInput, $iOpt); + if (!\is_string($sResult) || '' === $sResult) + { + if (!$oLogger && \MailSo\Log\Logger::IsSystemEnabled()) + { + $oLogger = \MailSo\Config::$SystemLogger; + } + + if (!($oLogger instanceof \MailSo\Log\Logger)) + { + $oLogger = null; + } + + if ($oLogger) + { + $oLogger->Write('json_encode: '.\trim( + (\MailSo\Base\Utils::FunctionExistsAndEnabled('json_last_error') ? ' [Error Code: '.\json_last_error().']' : ''). + (\MailSo\Base\Utils::FunctionExistsAndEnabled('json_last_error_msg') ? ' [Error Message: '.\json_last_error_msg().']' : '') + ), \MailSo\Log\Enumerations\Type::WARNING, 'JSON' + ); + } + + if (\is_array($mInput)) + { + if ($oLogger) + { + $oLogger->WriteDump($mInput, \MailSo\Log\Enumerations\Type::INFO, 'JSON'); + $oLogger->Write('Trying to clear Utf8 before json_encode', \MailSo\Log\Enumerations\Type::INFO, 'JSON'); + } + + \MailSo\Base\Utils::ClearArrayUtf8Values($mInput); + $sResult = @\json_encode($mInput, $iOpt); + } + } + + return $sResult; + } + + /** + * @param string $sFileName + * + * @return string + */ + public static function ClearFileName($sFileName) + { + return \MailSo\Base\Utils::Trim(\MailSo\Base\Utils::ClearNullBite( + \MailSo\Base\Utils::StripSpaces( + \str_replace(array('"', '/', '\\', '*', '?', '<', '>', '|', ':'), ' ', $sFileName)))); + } + + /** + * @param string $sValue + * + * @return string + */ + public static function ClearXss($sValue) + { + return \MailSo\Base\Utils::Trim(\MailSo\Base\Utils::ClearNullBite( + \str_replace(array('"', '/', '\\', '*', '?', '<', '>', '|', ':'), ' ', $sValue))); + } + + /** + * @param string $sValue + * + * @return string + */ + public static function Trim($sValue) + { + return \trim(\preg_replace('/^[\x00-\x1F]+/u', '', + \preg_replace('/[\x00-\x1F]+$/u', '', \trim($sValue)))); + } + + /** + * @param string $sDir + * + * @return bool + */ + public static function RecRmDir($sDir) + { + if (@\is_dir($sDir)) + { + $aObjects = \scandir($sDir); + foreach ($aObjects as $sObject) + { + if ('.' !== $sObject && '..' !== $sObject) + { +// if ('dir' === \filetype($sDir.'/'.$sObject)) + if (\is_dir($sDir.'/'.$sObject)) + { + self::RecRmDir($sDir.'/'.$sObject); + } + else + { + @\unlink($sDir.'/'.$sObject); + } + } + } + + return @\rmdir($sDir); + } + + return false; + } + + /** + * @param string $sSource + * @param string $sDestination + */ + public static function CopyDir($sSource, $sDestination) + { + if (\is_dir($sSource)) + { + if (!\is_dir($sDestination)) + { + \mkdir($sDestination); + } + + $oDirectory = \dir($sSource); + if ($oDirectory) + { + while (false !== ($sRead = $oDirectory->read())) + { + if ('.' === $sRead || '..' === $sRead) + { + continue; + } + + $sPathDir = $sSource.'/'.$sRead; + if (\is_dir($sPathDir)) + { + \MailSo\Base\Utils::CopyDir($sPathDir, $sDestination.'/'.$sRead); + continue; + } + + \copy($sPathDir, $sDestination.'/'.$sRead); + } + + $oDirectory->close(); + } + } + } + + /** + * @param string $sTempPath + * @param int $iTime2Kill + * @param int $iNow + * + * @return bool + */ + public static function RecTimeDirRemove($sTempPath, $iTime2Kill, $iNow) + { + $iFileCount = 0; + + $sTempPath = rtrim($sTempPath, '\\/'); + if (@\is_dir($sTempPath)) + { + $rDirH = @\opendir($sTempPath); + if ($rDirH) + { + $bRemoveAllDirs = true; + while (($sFile = @\readdir($rDirH)) !== false) + { + if ('.' !== $sFile && '..' !== $sFile) + { + if (@\is_dir($sTempPath.'/'.$sFile)) + { + if (!\MailSo\Base\Utils::RecTimeDirRemove($sTempPath.'/'.$sFile, $iTime2Kill, $iNow)) + { + $bRemoveAllDirs = false; + } + } + else + { + $iFileCount++; + } + } + } + + @\closedir($rDirH); + } + + if ($iFileCount > 0) + { + if (\MailSo\Base\Utils::TimeFilesRemove($sTempPath, $iTime2Kill, $iNow)) + { + return @\rmdir($sTempPath); + } + } + else + { + return $bRemoveAllDirs ? @\rmdir($sTempPath) : false; + } + + return false; + } + + return true; + } + + /** + * @param string $sTempPath + * @param int $iTime2Kill + * @param int $iNow + */ + public static function TimeFilesRemove($sTempPath, $iTime2Kill, $iNow) + { + $bResult = true; + + $sTempPath = rtrim($sTempPath, '\\/'); + if (@\is_dir($sTempPath)) + { + $rDirH = @\opendir($sTempPath); + if ($rDirH) + { + while (($sFile = @\readdir($rDirH)) !== false) + { + if ($sFile !== '.' && $sFile !== '..') + { + if ($iNow - \filemtime($sTempPath.'/'.$sFile) > $iTime2Kill) + { + @\unlink($sTempPath.'/'.$sFile); + } + else + { + $bResult = false; + } + } + } + + @\closedir($rDirH); + } + } + + return $bResult; + } + + /** + * @param string $sUtfString + * @param int $iLength + * + * @return string + */ + public static function Utf8Truncate($sUtfString, $iLength) + { + if (\strlen($sUtfString) <= $iLength) + { + return $sUtfString; + } + + while ($iLength >= 0) + { + if ((\ord($sUtfString[$iLength]) < 0x80) || (\ord($sUtfString[$iLength]) >= 0xC0)) + { + return \substr($sUtfString, 0, $iLength); + } + + $iLength--; + } + + return ''; + } + + /** + * @param string $sUtfString + * @param string $sReplaceOn = '' + * + * @return string + */ + public static function Utf8Clear($sUtfString, $sReplaceOn = '') + { + if ('' === $sUtfString) + { + return $sUtfString; + } + + $sUtfString = \preg_replace(\MailSo\Base\Utils::$sValidUtf8Regexp, '$1', $sUtfString); + + $sUtfString = \preg_replace( + '/\xE0[\x80-\x9F][\x80-\xBF]'. + '|\xEF\xBF\xBF'. + '|\xED[\xA0-\xBF][\x80-\xBF]/S', $sReplaceOn, $sUtfString); + + $sUtfString = \preg_replace('/\xEF\xBF\xBD/', '?', $sUtfString); + + $sNewUtfString = false; + if (false === $sNewUtfString && \MailSo\Base\Utils::IsMbStringSupported()) + { + $sNewUtfString = \MailSo\Base\Utils::MbConvertEncoding($sUtfString, 'UTF-8', 'UTF-8'); + } + + if (false === $sNewUtfString && \MailSo\Base\Utils::IsIconvSupported()) + { + $sNewUtfString = \MailSo\Base\Utils::IconvConvertEncoding($sUtfString, 'UTF-8', 'UTF-8'); + } + + if (false !== $sNewUtfString) + { + $sUtfString = $sNewUtfString; + } + + return $sUtfString; + } + + /** + * @param string $sUtfString + * + * @return bool + */ + public static function IsRTL($sUtfString) + { + // \x{0591}-\x{05F4} - Hebrew + // \x{0600}-\x{068F} - Arabic + // \x{0750}-\x{077F} - Arabic + // \x{08A0}-\x{08FF} - Arabic + // \x{103A0}-\x{103DF} - Old Persian + return 0 < (int) preg_match('/[\x{0591}-\x{05F4}\x{0600}-\x{068F}\x{0750}-\x{077F}\x{08A0}-\x{08FF}\x{103A0}-\x{103DF}]/u', $sUtfString); + } + + /** + * @param string $sString + * + * @return string + */ + public static function Base64Decode($sString) + { + $sResultString = \base64_decode($sString, true); + if (false === $sResultString) + { + $sString = \str_replace(array(' ', "\r", "\n", "\t"), '', $sString); + $sString = \preg_replace('/[^a-zA-Z0-9=+\/](.*)$/', '', $sString); + + if (false !== \strpos(\trim(\trim($sString), '='), '=')) + { + $sString = \preg_replace('/=([^=])/', '= $1', $sString); + $aStrings = \explode(' ', $sString); + foreach ($aStrings as $iIndex => $sParts) + { + $aStrings[$iIndex] = \base64_decode($sParts); + } + + $sResultString = \implode('', $aStrings); + } + else + { + $sResultString = \base64_decode($sString); + } + } + + return $sResultString; + } + + /** + * @param string $sValue + * + * @return string + */ + public static function UrlSafeBase64Encode($sValue) + { + return \rtrim(\strtr(\base64_encode($sValue), '+/', '-_'), '='); + } + + /** + * @param string $sValue + * + * @return string + */ + public static function UrlSafeBase64Decode($sValue) + { + $sValue = \rtrim(\strtr($sValue, '-_.', '+/='), '='); + return \MailSo\Base\Utils::Base64Decode(\str_pad($sValue, \strlen($sValue) + (\strlen($sValue) % 4), '=', STR_PAD_RIGHT)); + } + + /** + * @param string $sSequence + * + * @return array + */ + public static function ParseFetchSequence($sSequence) + { + $aResult = array(); + $sSequence = \trim($sSequence); + if (0 < \strlen($sSequence)) + { + $aSequence = \explode(',', $sSequence); + foreach ($aSequence as $sItem) + { + if (false === \strpos($sItem, ':')) + { + $aResult[] = (int) $sItem; + } + else + { + $aItems = \explode(':', $sItem); + $iMax = \max($aItems[0], $aItems[1]); + + for ($iIndex = $aItems[0]; $iIndex <= $iMax; $iIndex++) + { + $aResult[] = (int) $iIndex; + } + } + } + } + + return $aResult; + } + /** + * @param array $aSequence + * + * @return string + */ + public static function PrepearFetchSequence($aSequence) + { + $aResult = array(); + if (\is_array($aSequence) && 0 < \count($aSequence)) + { + $iStart = null; + $iPrev = null; + + foreach ($aSequence as $sItem) + { + // simple protection + if (false !== \strpos($sItem, ':')) + { + $aResult[] = $sItem; + continue; + } + + $iItem = (int) $sItem; + if (null === $iStart || null === $iPrev) + { + $iStart = $iItem; + $iPrev = $iItem; + continue; + } + + if ($iPrev === $iItem - 1) + { + $iPrev = $iItem; + } + else + { + $aResult[] = $iStart === $iPrev ? $iStart : $iStart.':'.$iPrev; + $iStart = $iItem; + $iPrev = $iItem; + } + } + + if (null !== $iStart && null !== $iPrev) + { + $aResult[] = $iStart === $iPrev ? $iStart : $iStart.':'.$iPrev; + } + } + + return \implode(',', $aResult); + } + + /** + * + * @param resource $fResource + * @param int $iBufferLen = 8192 + * + * @return bool + */ + public static function FpassthruWithTimeLimitReset($fResource, $iBufferLen = 8192) + { + $bResult = false; + if (\is_resource($fResource)) + { + while (!\feof($fResource)) + { + $sBuffer = @\fread($fResource, $iBufferLen); + if (false !== $sBuffer) + { + echo $sBuffer; + \MailSo\Base\Utils::ResetTimeLimit(); + continue; + } + + break; + } + + $bResult = true; + } + + return $bResult; + } + + /** + * @param resource $rRead + * @param array $aWrite + * @param int $iBufferLen = 8192 + * @param bool $bResetTimeLimit = true + * @param bool $bFixCrLf = false + * @param bool $bRewindOnComplete = false + * + * @return int|bool + */ + public static function MultipleStreamWriter($rRead, $aWrite, $iBufferLen = 8192, $bResetTimeLimit = true, $bFixCrLf = false, $bRewindOnComplete = false) + { + $mResult = false; + if ($rRead && \is_array($aWrite) && 0 < \count($aWrite)) + { + $mResult = 0; + while (!\feof($rRead)) + { + $sBuffer = \fread($rRead, $iBufferLen); + if (false === $sBuffer) + { + $mResult = false; + break; + } + + if (0 === $iBufferLen || '' === $sBuffer) + { + break; + } + + if ($bFixCrLf) + { + $sBuffer = \str_replace("\n", "\r\n", \str_replace("\r", '', $sBuffer)); + } + + $mResult += \strlen($sBuffer); + + foreach ($aWrite as $rWriteStream) + { + $mWriteResult = \fwrite($rWriteStream, $sBuffer); + if (false === $mWriteResult) + { + $mResult = false; + break 2; + } + } + + if ($bResetTimeLimit) + { + \MailSo\Base\Utils::ResetTimeLimit(); + } + } + } + + if ($mResult && $bRewindOnComplete) + { + foreach ($aWrite as $rWriteStream) + { + if (\is_resource($rWriteStream)) + { + @\rewind($rWriteStream); + } + } + } + + return $mResult; + } + + /** + * @param string $sUtfModifiedString + * + * @return string + */ + public static function ModifiedToPlainUtf7($sUtfModifiedString) + { + $sUtf = ''; + $bBase = false; + + for ($iIndex = 0, $iLen = \strlen($sUtfModifiedString); $iIndex < $iLen; $iIndex++) + { + if ('&' === $sUtfModifiedString[$iIndex]) + { + if (isset($sUtfModifiedString[$iIndex+1]) && '-' === $sUtfModifiedString[$iIndex + 1]) + { + $sUtf .= '&'; + $iIndex++; + } + else + { + $sUtf .= '+'; + $bBase = true; + } + } + else if ($sUtfModifiedString[$iIndex] == '-' && $bBase) + { + $bBase = false; + } + else + { + if ($bBase && ',' === $sUtfModifiedString[$iIndex]) + { + $sUtf .= '/'; + } + else if (!$bBase && '+' === $sUtfModifiedString[$iIndex]) + { + $sUtf .= '+-'; + } + else + { + $sUtf .= $sUtfModifiedString[$iIndex]; + } + } + } + + return $sUtf; + } + + /** + * @param string $sStr + * + * @return string|bool + */ + public static function Utf7ModifiedToUtf8($sStr) + { + $aArray = array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,62, 63,-1,-1,-1,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9, + 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, + 41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1); + + $sResult = ''; + $bError = false; + $iLen = \strlen($sStr); + + for ($iIndex = 0; $iLen > 0; $iIndex++, $iLen--) + { + $sChar = $sStr{$iIndex}; + if ($sChar == '&') + { + $iIndex++; + $iLen--; + + $sChar = isset($sStr{$iIndex}) ? $sStr{$iIndex} : null; + if ($sChar === null) + { + break; + } + + if ($iLen && $sChar == '-') + { + $sResult .= '&'; + continue; + } + + $iCh = 0; + $iK = 10; + for (; $iLen > 0; $iIndex++, $iLen--) + { + $sChar = $sStr{$iIndex}; + + $iB = $aArray[\ord($sChar)]; + if ((\ord($sChar) & 0x80) || $iB == -1) + { + break; + } + + if ($iK > 0) + { + $iCh |= $iB << $iK; + $iK -= 6; + } + else + { + $iCh |= $iB >> (-$iK); + if ($iCh < 0x80) + { + if (0x20 <= $iCh && $iCh < 0x7f) + { + return $bError; + } + + $sResult .= \chr($iCh); + } + else if ($iCh < 0x800) + { + $sResult .= \chr(0xc0 | ($iCh >> 6)); + $sResult .= \chr(0x80 | ($iCh & 0x3f)); + } + else + { + $sResult .= \chr(0xe0 | ($iCh >> 12)); + $sResult .= \chr(0x80 | (($iCh >> 6) & 0x3f)); + $sResult .= \chr(0x80 | ($iCh & 0x3f)); + } + + $iCh = ($iB << (16 + $iK)) & 0xffff; + $iK += 10; + } + } + + if (($iCh || $iK < 6) || + (!$iLen || $sChar != '-') || + ($iLen > 2 && '&' === $sStr{$iIndex+1} && '-' !== $sStr{$iIndex+2})) + { + return $bError; + } + } + else if (\ord($sChar) < 0x20 || \ord($sChar) >= 0x7f) + { + return $bError; + } + else + { + $sResult .= $sChar; + } + } + + return $sResult; + } + + /** + * @param string $sStr + * + * @return string|bool + */ + public static function Utf8ToUtf7Modified($sStr) + { + $sArray = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S', + 'T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o', + 'p','q','r','s','t','u','v','w','x','y','z', '0','1','2','3','4','5','6','7','8','9','+',','); + + $sLen = \strlen($sStr); + $bIsB = false; + $iIndex = $iN = 0; + $sReturn = ''; + $bError = false; + $iCh = $iB = $iK = 0; + + while ($sLen) + { + $iC = \ord($sStr{$iIndex}); + if ($iC < 0x80) + { + $iCh = $iC; + $iN = 0; + } + else if ($iC < 0xc2) + { + return $bError; + } + else if ($iC < 0xe0) + { + $iCh = $iC & 0x1f; + $iN = 1; + } + else if ($iC < 0xf0) + { + $iCh = $iC & 0x0f; + $iN = 2; + } + else if ($iC < 0xf8) + { + $iCh = $iC & 0x07; + $iN = 3; + } + else if ($iC < 0xfc) + { + $iCh = $iC & 0x03; + $iN = 4; + } + else if ($iC < 0xfe) + { + $iCh = $iC & 0x01; + $iN = 5; + } + else + { + return $bError; + } + + $iIndex++; + $sLen--; + + if ($iN > $sLen) + { + return $bError; + } + + for ($iJ = 0; $iJ < $iN; $iJ++) + { + $iO = \ord($sStr{$iIndex+$iJ}); + if (($iO & 0xc0) != 0x80) + { + return $bError; + } + + $iCh = ($iCh << 6) | ($iO & 0x3f); + } + + if ($iN > 1 && !($iCh >> ($iN * 5 + 1))) + { + return $bError; + } + + $iIndex += $iN; + $sLen -= $iN; + + if ($iCh < 0x20 || $iCh >= 0x7f) + { + if (!$bIsB) + { + $sReturn .= '&'; + $bIsB = true; + $iB = 0; + $iK = 10; + } + + if ($iCh & ~0xffff) + { + $iCh = 0xfffe; + } + + $sReturn .= $sArray[($iB | $iCh >> $iK)]; + $iK -= 6; + for (; $iK >= 0; $iK -= 6) + { + $sReturn .= $sArray[(($iCh >> $iK) & 0x3f)]; + } + + $iB = ($iCh << (-$iK)) & 0x3f; + $iK += 16; + } + else + { + if ($bIsB) + { + if ($iK > 10) + { + $sReturn .= $sArray[$iB]; + } + $sReturn .= '-'; + $bIsB = false; + } + + $sReturn .= \chr($iCh); + if ('&' === \chr($iCh)) + { + $sReturn .= '-'; + } + } + } + + if ($bIsB) + { + if ($iK > 10) + { + $sReturn .= $sArray[$iB]; + } + + $sReturn .= '-'; + } + + return $sReturn; + } + + /** + * @param string|array $mFunctionNameOrNames + * + * @return bool + */ + public static function FunctionExistsAndEnabled($mFunctionNameOrNames) + { + static $aCache = null; + + if (\is_array($mFunctionNameOrNames)) + { + foreach ($mFunctionNameOrNames as $sFunctionName) + { + if (!\MailSo\Base\Utils::FunctionExistsAndEnabled($sFunctionName)) + { + return false; + } + } + + return true; + } + + if (empty($mFunctionNameOrNames) || !\function_exists($mFunctionNameOrNames) || !\is_callable($mFunctionNameOrNames)) + { + return false; + } + + if (null === $aCache) + { + $sDisableFunctions = @\ini_get('disable_functions'); + $sDisableFunctions = \is_string($sDisableFunctions) && 0 < \strlen($sDisableFunctions) ? $sDisableFunctions : ''; + + $aCache = \explode(',', $sDisableFunctions); + $aCache = \is_array($aCache) && 0 < \count($aCache) ? $aCache : array(); + + if (\extension_loaded('suhosin')) + { + $sSuhosin = @\ini_get('suhosin.executor.func.blacklist'); + $sSuhosin = \is_string($sSuhosin) && 0 < \strlen($sSuhosin) ? $sSuhosin : ''; + + $aSuhosinCache = \explode(',', $sSuhosin); + $aSuhosinCache = \is_array($aSuhosinCache) && 0 < \count($aSuhosinCache) ? $aSuhosinCache : array(); + + if (0 < \count($aSuhosinCache)) + { + $aCache = \array_merge($aCache, $aSuhosinCache); + $aCache = \array_unique($aCache); + } + } + } + + return !\in_array($mFunctionNameOrNames, $aCache); + } + + /** + * @param string $mValue + * + * @return string + */ + public static function ClearNullBite($mValue) + { + return \str_replace('%00', '', $mValue); + } + + /** + * @param mixed $mValue + * @param bool $bClearNullBite = false + * + * @return mixed + */ + public static function StripSlashesValue($mValue, $bClearNullBite = false) + { + static $bIsMagicQuotesOn = null; + if (null === $bIsMagicQuotesOn) + { + $bIsMagicQuotesOn = (bool) @\ini_get('magic_quotes_gpc'); + } + + if (!$bIsMagicQuotesOn) + { + return $bClearNullBite && \is_string($mValue) ? \MailSo\Base\Utils::ClearNullBite($mValue) : $mValue; + } + + $sType = \gettype($mValue); + if ('string' === $sType) + { + return \stripslashes($bClearNullBite ? \MailSo\Base\Utils::ClearNullBite($mValue) : $mValue); + } + else if ('array' === $sType) + { + $aReturnValue = array(); + $mValueKeys = \array_keys($mValue); + foreach ($mValueKeys as $sKey) + { + $aReturnValue[$sKey] = \MailSo\Base\Utils::StripSlashesValue($mValue[$sKey], $bClearNullBite); + } + + return $aReturnValue; + } + + return $mValue; + } + + /** + * @param string $sStr + * + * @return string + */ + public static function CharsetDetect($sStr) + { + $mResult = ''; + if (!\MailSo\Base\Utils::IsAscii($sStr)) + { + $mResult = \MailSo\Base\Utils::IsMbStringSupported() && + \MailSo\Base\Utils::FunctionExistsAndEnabled('mb_detect_encoding') ? + @\mb_detect_encoding($sStr, 'auto', true) : false; + + if (false === $mResult && \MailSo\Base\Utils::IsIconvSupported()) + { + $mResult = \md5(@\iconv('utf-8', 'utf-8//IGNORE', $sStr)) === \md5($sStr) ? 'utf-8' : ''; + } + } + + return \is_string($mResult) && 0 < \strlen($mResult) ? $mResult : ''; + } + + /** + * @param string $sAdditionalSalt = '' + * + * @return string + */ + public static function Md5Rand($sAdditionalSalt = '') + { + return \md5(\microtime(true).\rand(10000, 99999). + \md5($sAdditionalSalt).\rand(10000, 99999).\microtime(true)); + } + + /** + * @param string $sAdditionalSalt = '' + * + * @return string + */ + public static function Sha1Rand($sAdditionalSalt = '') + { + return \sha1(\microtime(true).\rand(10000, 99999). + \sha1($sAdditionalSalt).\rand(10000, 99999).\microtime(true)); + } + + /** + * @param string $sData + * @param string $sKey + * + * @return string + */ + public static function Hmac($sData, $sKey) + { + if (\function_exists('hash_hmac')) + { + return \hash_hmac('md5', $sData, $sKey); + } + + $iLen = 64; + if ($iLen < \strlen($sKey)) + { + $sKey = \pack('H*', \md5($sKey)); + } + + $sKey = \str_pad($sKey, $iLen, \chr(0x00)); + $sIpad = \str_pad('', $iLen, \chr(0x36)); + $sOpad = \str_pad('', $iLen, \chr(0x5c)); + + return \md5(($sKey ^ $sOpad).\pack('H*', \md5(($sKey ^ $sIpad).$sData))); + } + + /** + * @param string $sDomain + * @param bool $bSimple = false + * + * @return bool + */ + public static function ValidateDomain($sDomain, $bSimple = false) + { + $aMatch = array(); + if ($bSimple) + { + return \preg_match('/.+(\.[a-zA-Z]+)$/', $sDomain, $aMatch) && !empty($aMatch[1]); + } + + return \preg_match('/.+(\.[a-zA-Z]+)$/', $sDomain, $aMatch) && !empty($aMatch[1]) && \in_array($aMatch[1], \explode(' ', + '.academy .actor .agency .audio .bar .beer .bike .blue .boutique .cab .camera .camp .capital .cards .careers .cash .catering .center .cheap .city .cleaning .clinic .clothing .club .coffee .community .company .computer .construction .consulting .contractors .cool .credit .dance .dating .democrat .dental .diamonds .digital .direct .directory .discount .domains .education .email .energy .equipment .estate .events .expert .exposed .fail .farm .fish .fitness .florist .fund .futbol .gallery .gift .glass .graphics .guru .help .holdings .holiday .host .hosting .house .institute .international .kitchen .land .life .lighting .limo .link .management .market .marketing .media .menu .moda .partners .parts .photo .photography .photos .pics .pink .press .productions .pub .red .rentals .repair .report .rest .sexy .shoes .social .solar .solutions .space .support .systems .tattoo .tax .technology .tips .today .tools .town .toys .trade .training .university .uno .vacations .vision .vodka .voyage .watch .webcam .wiki .work .works .wtf .zone .aero .asia .biz .cat .com .coop .edu .gov .info .int .jobs .mil .mobi .museum .name .net .org .pro .tel .travel .xxx .xyz '. + '.ac .ad .ae .af .ag .ai .al .am .an .ao .aq .ar .as .at .au .aw .ax .az .ba .bb .bd .be .bf .bg .bh .bi .bj .bm .bn .bo .br .bs .bt .bv .bw .by .bz .ca .cc .cd .cf .cg .ch .ci .ck .cl .cm .cn .co .cr .cs .cu .cv .cx .cy .cz .dd .de .dj .dk .dm .do .dz .ec .ee .eg .er .es .et .eu .fi .fj .fk .fm .fo .fr .ga .gb .gd .ge .gf .gg .gh .gi .gl .gm .gn .gp .gq .gr .gs .gt .gu .gw .gy .hk .hm .hn .hr .ht .hu .id .ie .il .im .in .io .iq .ir .is .it .je .jm .jo .jp .ke .kg .kh .ki .km .kn .kp .kr .kw .ky .kz .la .lb .lc .li .lk .lr .ls .lt .lu .lv .ly .ma .mc .md .me .mg .mh .mk .ml .mm .mn .mo .mp .mq .mr .ms .mt .mu .mv .mw .mx .my .mz .na .nc .ne .nf .ng .ni .nl .no .np .nr .nu .nz .om .pa .pe .pf .pg .ph .pk .pl .pm .pn .pr .ps .pt .pw .py .qa .re .ro .rs .ru . .rw .sa .sb .sc .sd .se .sg .sh .si .sj .sk .sl .sm .sn .so .sr .st .su .sv .sy .sz .tc .td .tf .tg .th .tj .tk .tl .tm .tn .to .tp .tr .tt .tv .tw .tz .ua .ug .uk .us .uy .uz .va .vc .ve .vg .vi .vn .vu .wf .ws .ye .yt .za .zm .zw' + )); + } + + /** + * @param string $sIp + * + * @return bool + */ + public static function ValidateIP($sIp) + { + return !empty($sIp) && $sIp === @\filter_var($sIp, FILTER_VALIDATE_IP); + } + + /** + * @return \Net_IDNA2 + */ + private static function idn() + { + static $oIdn = null; + if (null === $oIdn) + { + include_once MAILSO_LIBRARY_ROOT_PATH.'Vendors/Net/IDNA2.php'; + $oIdn = new \Net_IDNA2(); + $oIdn->setParams('utf8', true); + } + + return $oIdn; + } + + /** + * @param string $sStr + * @param bool $bLowerIfAscii = false + * + * @return string + */ + public static function IdnToUtf8($sStr, $bLowerIfAscii = false) + { + if (0 < \strlen($sStr) && \preg_match('/(^|\.|@)xn--/i', $sStr)) + { + try + { + $sStr = self::idn()->decode($sStr); + } + catch (\Exception $oException) {} + } + + return $bLowerIfAscii ? \MailSo\Base\Utils::StrMailDomainToLowerIfAscii($sStr) : $sStr; + } + + /** + * @param string $sStr + * @param bool $bLowerIfAscii = false + * + * @return string + */ + public static function IdnToAscii($sStr, $bLowerIfAscii = false) + { + $sStr = $bLowerIfAscii ? \MailSo\Base\Utils::StrMailDomainToLowerIfAscii($sStr) : $sStr; + + $sUser = ''; + $sDomain = $sStr; + if (false !== \strpos($sStr, '@')) + { + $sUser = \MailSo\Base\Utils::GetAccountNameFromEmail($sStr); + $sDomain = \MailSo\Base\Utils::GetDomainFromEmail($sStr); + } + + if (0 < \strlen($sDomain) && \preg_match('/[^\x20-\x7E]/', $sDomain)) + { + try + { + $sDomain = self::idn()->encode($sDomain); + } + catch (\Exception $oException) {} + } + + return ('' === $sUser ? '' : $sUser.'@').$sDomain; + } + + /** + * @param string $sHash + * @param string $sSalt + * + * @return int + */ + public static function HashToId($sHash, $sSalt = '') + { + $sData = $sHash ? @\MailSo\Base\Crypt::XxteaDecrypt(\hex2bin($sHash), \md5($sSalt)) : null; + + $aMatch = array(); + if ($sData && preg_match('/^id:(\d+)$/', $sData, $aMatch) && isset($aMatch[1])) + { + return is_numeric($aMatch[1]) ? (int) $aMatch[1] : null; + } + + return null; + } + + /** + * @param int $iID + * @param string $sSalt + * + * @return string + */ + public static function IdToHash($iID, $sSalt = '') + { + return is_int($iID) ? + \bin2hex(\MailSo\Base\Crypt::XxteaEncrypt('id:'.$iID, \md5($sSalt))) : null + ; + } + + /** + * @param string $sPassword + * + * @return bool + */ + public static function PasswordWeaknessCheck($sPassword) + { + $sPassword = \trim($sPassword); + if (6 > \strlen($sPassword)) + { + return false; + } + + $sLine = 'password 123.456 12345678 abc123 qwerty monkey letmein dragon 111.111 baseball iloveyou trustno1 1234567 sunshine master 123.123 welcome shadow ashley football jesus michael ninja mustang password1 123456 123456789 qwerty 111111 1234567 666666 12345678 7777777 123321 654321 1234567890 123123 555555 vkontakte gfhjkm 159753 777777 temppassword qazwsx 1q2w3e 1234 112233 121212 qwertyuiop qq18ww899 987654321 12345 zxcvbn zxcvbnm 999999 samsung ghbdtn 1q2w3e4r 1111111 123654 159357 131313 qazwsxedc 123qwe 222222 asdfgh 333333 9379992 asdfghjkl 4815162342 12344321 88888888 11111111 knopka 789456 qwertyu 1q2w3e4r5t iloveyou vfhbyf marina password qweasdzxc 10203 987654 yfnfif cjkysirj nikita 888888 vfrcbv k.,jdm qwertyuiop[] qwe123 qweasd natasha 123123123 fylhtq q1w2e3 stalker 1111111111 q1w2e3r4 nastya 147258369 147258 fyfcnfcbz 1234554321 1qaz2wsx andrey 111222 147852 genius sergey 7654321 232323 123789 fktrcfylh spartak admin test 123 azerty abc123 lol123 easytocrack1 hello saravn holysh!t test123 tundra_cool2 456 dragon thomas killer root 1111 pass master aaaaaa a monkey daniel asdasd e10adc3949ba59abbe56e057f20f883e changeme computer jessica letmein mirage loulou lol superman shadow admin123 secret administrator sophie kikugalanetroot doudou liverpool hallo sunshine charlie parola 100827092 michael andrew password1 fuckyou matrix cjmasterinf internet hallo123 eminem demo gewinner pokemon abcd1234 guest ngockhoa martin sandra asdf hejsan george qweqwe lollipop lovers q1q1q1 tecktonik naruto 12 password12 password123 password1234 password12345 password123456 password1234567 password12345678 password123456789 000000 maximius 123abc baseball1 football1 soccer princess slipknot 11111 nokia super star 666999 12341234 1234321 135790 159951 212121 zzzzzz 121314 134679 142536 19921992 753951 7007 1111114 124578 19951995 258456 qwaszx zaqwsx 55555 77777 54321 qwert 22222 33333 99999 88888 66666'; + return false === \strpos($sLine, \strtolower($sPassword)); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Validator.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Validator.php new file mode 100755 index 00000000..dbaf2ffd --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Validator.php @@ -0,0 +1,100 @@ += $iMin || null === $iMin) && + (null !== $iMax && $iNumber <= $iMax || null === $iMax); + } + + /** + * @param int $iPort + * + * @return bool + */ + public static function PortInt($iPort) + { + return \MailSo\Base\Validator::RangeInt($iPort, 0, 65535); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/CacheClient.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/CacheClient.php new file mode 100755 index 00000000..e72f56ea --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/CacheClient.php @@ -0,0 +1,215 @@ +oDriver = null; + $this->sCacheIndex = ''; + } + + /** + * @return \MailSo\Cache\CacheClient + */ + public static function NewInstance() + { + return new self(); + } + + /** + * @param string $sKey + * @param string $sValue + * + * @return bool + */ + public function Set($sKey, $sValue) + { + return $this->oDriver ? $this->oDriver->Set($sKey.$this->sCacheIndex, $sValue) : false; + } + + /** + * @param string $sKey + * + * @return bool + */ + public function SetTimer($sKey) + { + return $this->Set($sKey.'/TIMER', time()); + } + + /** + * @param string $sKey + * + * @return bool + */ + public function SetLock($sKey) + { + return $this->Set($sKey.'/LOCK', '1'); + } + + /** + * @param string $sKey + * + * @return bool + */ + public function RemoveLock($sKey) + { + return $this->Set($sKey.'/LOCK', '0'); + } + + /** + * @param string $sKey + * + * @return bool + */ + public function GetLock($sKey) + { + return '1' === $this->Get($sKey.'/LOCK'); + } + + /** + * @param string $sKey + * @param string $bClearAfterGet = false + * + * @return string + */ + public function Get($sKey, $bClearAfterGet = false) + { + $sValue = ''; + + if ($this->oDriver) + { + $sValue = $this->oDriver->Get($sKey.$this->sCacheIndex); + } + + if ($bClearAfterGet) + { + $this->Delete($sKey); + } + + return $sValue; + } + + /** + * @param string $sKey + * + * @return int + */ + public function GetTimer($sKey) + { + $iTimer = 0; + $sValue = $this->Get($sKey.'/TIMER'); + if (0 < strlen($sValue) && is_numeric($sValue)) + { + $iTimer = (int) $sValue; + } + + return $iTimer; + } + + /** + * @param string $sKey + * + * @return \MailSo\Cache\CacheClient + */ + public function Delete($sKey) + { + if ($this->oDriver) + { + $this->oDriver->Delete($sKey.$this->sCacheIndex); + } + + return $this; + } + + /** + * @param \MailSo\Cache\DriverInterface $oDriver + * + * @return \MailSo\Cache\CacheClient + */ + public function SetDriver(\MailSo\Cache\DriverInterface $oDriver) + { + $this->oDriver = $oDriver; + + return $this; + } + + /** + * @param int $iTimeToClearInHours = 24 + * + * @return bool + */ + public function GC($iTimeToClearInHours = 24) + { + return $this->oDriver ? $this->oDriver->GC($iTimeToClearInHours) : false; + } + + /** + * @return bool + */ + public function IsInited() + { + return $this->oDriver instanceof \MailSo\Cache\DriverInterface; + } + + /** + * @param string $sCacheIndex + * + * @return \MailSo\Cache\CacheClient + */ + public function SetCacheIndex($sCacheIndex) + { + $this->sCacheIndex = 0 < \strlen($sCacheIndex) ? "\x0".$sCacheIndex : ''; + + return $this; + } + + /** + * @param bool $bCache = false + * + * @return bool + */ + public function Verify($bCache = false) + { + if ($this->oDriver) + { + $sCacheData = \gmdate('Y-m-d-H'); + if ($bCache && $sCacheData === $this->Get('__verify_key__')) + { + return true; + } + + return $this->Set('__verify_key__', $sCacheData); + } + + return false; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/DriverInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/DriverInterface.php new file mode 100755 index 00000000..4789cd6c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/DriverInterface.php @@ -0,0 +1,48 @@ +sKeyPrefix = $sKeyPrefix; + if (!empty($this->sKeyPrefix)) + { + $this->sKeyPrefix = + \preg_replace('/[^a-zA-Z0-9_]/', '_', rtrim(trim($this->sKeyPrefix), '\\/')).'/'; + } + } + + /** + * @param string $sKeyPrefix = '' + * + * @return \MailSo\Cache\Drivers\APC + */ + public static function NewInstance($sKeyPrefix = '') + { + return new self($sKeyPrefix); + } + + /** + * @param string $sKey + * @param string $sValue + * + * @return bool + */ + public function Set($sKey, $sValue) + { + return \apc_store($this->generateCachedKey($sKey), (string) $sValue); + } + + /** + * @param string $sKey + * + * @return string + */ + public function Get($sKey) + { + $sValue = \apc_fetch($this->generateCachedKey($sKey)); + return \is_string($sValue) ? $sValue : ''; + } + + /** + * @param string $sKey + * + * @return void + */ + public function Delete($sKey) + { + \apc_delete($this->generateCachedKey($sKey)); + } + + /** + * @param int $iTimeToClearInHours = 24 + * + * @return bool + */ + public function GC($iTimeToClearInHours = 24) + { + if (0 === $iTimeToClearInHours) + { + return \apc_clear_cache('user'); + } + + return false; + } + + /** + * @param string $sKey + * + * @return string + */ + private function generateCachedKey($sKey) + { + return $this->sKeyPrefix.\sha1($sKey); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/File.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/File.php new file mode 100755 index 00000000..bee1c51b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/File.php @@ -0,0 +1,153 @@ +sCacheFolder = $sCacheFolder; + $this->sCacheFolder = rtrim(trim($this->sCacheFolder), '\\/').'/'; + + $this->sKeyPrefix = $sKeyPrefix; + if (!empty($this->sKeyPrefix)) + { + $this->sKeyPrefix = \str_pad(\preg_replace('/[^a-zA-Z0-9_]/', '_', + rtrim(trim($this->sKeyPrefix), '\\/')), 5, '_'); + + $this->sKeyPrefix = '__/'. + \substr($this->sKeyPrefix, 0, 2).'/'.\substr($this->sKeyPrefix, 2, 2).'/'. + $this->sKeyPrefix.'/'; + } + } + + /** + * @param string $sCacheFolder + * @param string $sKeyPrefix = '' + * + * @return \MailSo\Cache\Drivers\File + */ + public static function NewInstance($sCacheFolder, $sKeyPrefix = '') + { + return new self($sCacheFolder, $sKeyPrefix); + } + + /** + * @param string $sKey + * @param string $sValue + * + * @return bool + */ + public function Set($sKey, $sValue) + { + $sPath = $this->generateCachedFileName($sKey, true); + return '' === $sPath ? false : false !== \file_put_contents($sPath, $sValue); + } + + /** + * @param string $sKey + * + * @return string + */ + public function Get($sKey) + { + $sValue = ''; + $sPath = $this->generateCachedFileName($sKey); + if ('' !== $sPath && \file_exists($sPath)) + { + $sValue = \file_get_contents($sPath); + } + + return \is_string($sValue) ? $sValue : ''; + } + + /** + * @param string $sKey + * + * @return void + */ + public function Delete($sKey) + { + $sPath = $this->generateCachedFileName($sKey); + if ('' !== $sPath && \file_exists($sPath)) + { + \unlink($sPath); + } + } + + /** + * @param int $iTimeToClearInHours = 24 + * + * @return bool + */ + public function GC($iTimeToClearInHours = 24) + { + if (0 < $iTimeToClearInHours) + { + \MailSo\Base\Utils::RecTimeDirRemove($this->sCacheFolder, 60 * 60 * $iTimeToClearInHours, \time()); + return true; + } + + return false; + } + + /** + * @param string $sKey + * @param bool $bMkDir = false + * + * @return string + */ + private function generateCachedFileName($sKey, $bMkDir = false) + { + $sFilePath = ''; + if (3 < \strlen($sKey)) + { + $sKeyPath = \sha1($sKey); + $sKeyPath = \substr($sKeyPath, 0, 2).'/'.\substr($sKeyPath, 2, 2).'/'.$sKeyPath; + + $sFilePath = $this->sCacheFolder.$this->sKeyPrefix.$sKeyPath; + if ($bMkDir && !\is_dir(\dirname($sFilePath))) + { + if (!@\mkdir(\dirname($sFilePath), 0755, true)) + { + if (!@\mkdir(\dirname($sFilePath), 0755, true)) + { + $sFilePath = ''; + } + } + } + } + + return $sFilePath; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/Memcache.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/Memcache.php new file mode 100755 index 00000000..35094b48 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/Memcache.php @@ -0,0 +1,144 @@ +sHost = $sHost; + $this->iPost = $iPost; + $this->iExpire = 0 < $iExpire ? $iExpire : 43200; + + $this->oMem = new \Memcache(); + if (!$this->oMem->connect($this->sHost, $this->iPost)) + { + $this->oMem = null; + } + + $this->sKeyPrefix = $sKeyPrefix; + if (!empty($this->sKeyPrefix)) + { + $this->sKeyPrefix = + \preg_replace('/[^a-zA-Z0-9_]/', '_', rtrim(trim($this->sKeyPrefix), '\\/')).'/'; + } + } + + /** + * @param string $sHost = '127.0.0.1' + * @param int $iPost = 11211 + * @param int $iExpire = 43200 + * @param string $sKeyPrefix = '' + * + * @return \MailSo\Cache\Drivers\APC + */ + public static function NewInstance($sHost = '127.0.0.1', $iPost = 11211, $iExpire = 43200, $sKeyPrefix = '') + { + return new self($sHost, $iPost, $iExpire, $sKeyPrefix); + } + + /** + * @param string $sKey + * @param string $sValue + * + * @return bool + */ + public function Set($sKey, $sValue) + { + return $this->oMem ? $this->oMem->set($this->generateCachedKey($sKey), $sValue, 0, $this->iExpire) : false; + } + + /** + * @param string $sKey + * + * @return string + */ + public function Get($sKey) + { + $sValue = $this->oMem ? $this->oMem->get($this->generateCachedKey($sKey)) : ''; + return \is_string($sValue) ? $sValue : ''; + } + + /** + * @param string $sKey + * + * @return void + */ + public function Delete($sKey) + { + if ($this->oMem) + { + $this->oMem->delete($this->generateCachedKey($sKey)); + } + } + + /** + * @param int $iTimeToClearInHours = 24 + * + * @return bool + */ + public function GC($iTimeToClearInHours = 24) + { + if (0 === $iTimeToClearInHours && $this->oMem) + { + return $this->oMem->flush(); + } + + return false; + } + + /** + * @param string $sKey + * + * @return string + */ + private function generateCachedKey($sKey) + { + return $this->sKeyPrefix.\sha1($sKey); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/Redis.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/Redis.php new file mode 100755 index 00000000..638f8688 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/Redis.php @@ -0,0 +1,160 @@ +sHost = $sHost; + $this->iPost = $iPost; + $this->iExpire = 0 < $iExpire ? $iExpire : 43200; + + $this->oRedis = null; + + try + { + $this->oRedis = new \Predis\Client('unix:' === substr($sHost, 0, 5) ? $sHost : array( + 'host' => $sHost, + 'port' => $iPost + )); + + $this->oRedis->connect(); + + if (!$this->oRedis->isConnected()) + { + $this->oRedis = null; + } + } + catch (\Exception $oExc) + { + $this->oRedis = null; + unset($oExc); + } + + $this->sKeyPrefix = $sKeyPrefix; + if (!empty($this->sKeyPrefix)) + { + $this->sKeyPrefix = + \preg_replace('/[^a-zA-Z0-9_]/', '_', rtrim(trim($this->sKeyPrefix), '\\/')).'/'; + } + } + + /** + * @param string $sHost = '127.0.0.1' + * @param int $iPost = 11211 + * @param int $iExpire = 43200 + * @param string $sKeyPrefix = '' + * + * @return \MailSo\Cache\Drivers\APC + */ + public static function NewInstance($sHost = '127.0.0.1', $iPost = 6379, $iExpire = 43200, $sKeyPrefix = '') + { + return new self($sHost, $iPost, $iExpire, $sKeyPrefix); + } + + /** + * @param string $sKey + * @param string $sValue + * + * @return bool + */ + public function Set($sKey, $sValue) + { + return $this->oRedis ? $this->oRedis->setex($this->generateCachedKey($sKey), $this->iExpire, $sValue) : false; + } + + /** + * @param string $sKey + * + * @return string + */ + public function Get($sKey) + { + $sValue = $this->oRedis ? $this->oRedis->get($this->generateCachedKey($sKey)) : ''; + return \is_string($sValue) ? $sValue : ''; + } + + /** + * @param string $sKey + * + * @return void + */ + public function Delete($sKey) + { + if ($this->oRedis) + { + $this->oRedis->del($this->generateCachedKey($sKey)); + } + } + + /** + * @param int $iTimeToClearInHours = 24 + * + * @return bool + */ + public function GC($iTimeToClearInHours = 24) + { + if (0 === $iTimeToClearInHours && $this->oRedis) + { + return $this->oRedis->flushdb(); + } + + return false; + } + + /** + * @param string $sKey + * + * @return string + */ + private function generateCachedKey($sKey) + { + return $this->sKeyPrefix.\sha1($sKey); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Config.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Config.php new file mode 100755 index 00000000..9901feb1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Config.php @@ -0,0 +1,113 @@ +sContentType = $sContentType; + $this->sCharset = $sCharset; + $this->aBodyParams = $aBodyParams; + $this->sContentID = $sContentID; + $this->sDescription = $sDescription; + $this->sMailEncodingName = $sMailEncodingName; + $this->sDisposition = $sDisposition; + $this->aDispositionParams = $aDispositionParams; + $this->sFileName = $sFileName; + $this->sLanguage = $sLanguage; + $this->sLocation = $sLocation; + $this->iSize = $iSize; + $this->iTextLineCount = $iTextLineCount; + $this->sPartID = $sPartID; + $this->aSubParts = $aSubParts; + } + + /** + * return string + */ + public function MailEncodingName() + { + return $this->sMailEncodingName; + } + + /** + * return string + */ + public function PartID() + { + return (string) $this->sPartID; + } + + /** + * return string + */ + public function FileName() + { + return $this->sFileName; + } + + /** + * return string + */ + public function ContentType() + { + return $this->sContentType; + } + + /** + * return int + */ + public function Size() + { + return (int) $this->iSize; + } + + /** + * return int + */ + public function EstimatedSize() + { + $fCoefficient = 1; + switch (\strtolower($this->MailEncodingName())) + { + case 'base64': + $fCoefficient = 0.75; + break; + case 'quoted-printable': + $fCoefficient = 0.44; + break; + } + + return (int) ($this->Size() * $fCoefficient); + } + + /** + * return string + */ + public function Charset() + { + return $this->sCharset; + } + + + /** + * return string + */ + public function ContentID() + { + return (null === $this->sContentID) ? '' : $this->sContentID; + } + + /** + * return string + */ + public function ContentLocation() + { + return (null === $this->sLocation) ? '' : $this->sLocation; + } + + /** + * return bool + */ + public function IsInline() + { + return (null === $this->sDisposition) ? + (0 < \strlen($this->ContentID())) : ('inline' === strtolower($this->sDisposition)); + } + + /** + * return bool + */ + public function IsImage() + { + return 'image' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); + } + + /** + * return bool + */ + public function IsArchive() + { + return 'archive' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); + } + + /** + * @return bool + */ + public function IsPdf() + { + return 'pdf' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); + } + + /** + * @return bool + */ + public function IsDoc() + { + return 'doc' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); + } + + /** + * @return bool + */ + public function IsPgpSignature() + { + return \in_array(\strtolower($this->ContentType()), + array('application/pgp-signature', 'application/pkcs7-signature')); + } + + /** + * @return bool + */ + public function IsAttachBodyPart() + { + $bResult = ( + (null !== $this->sDisposition && 'attachment' === \strtolower($this->sDisposition)) + ); + + if (!$bResult && null !== $this->sContentType) + { + $sContentType = \strtolower($this->sContentType); + $bResult = false === \strpos($sContentType, 'multipart/') && + 'text/html' !== $sContentType && 'text/plain' !== $sContentType; + } + + return $bResult; + } + + /** + * @return bool + */ + public function IsFlowedFormat() + { + $bResult = !empty($this->aBodyParams['format']) && + 'flowed' === \strtolower(\trim($this->aBodyParams['format'])); + + if ($bResult && \in_array(\strtolower($this->MailEncodingName()), array('base64', 'quoted-printable'))) + { + $bResult = false; + } + + return $bResult; + } + + /** + * @return array|null + */ + public function SearchPlainParts() + { + $aReturn = array(); + $aParts = $this->SearchByContentType('text/plain'); + foreach ($aParts as $oPart) + { + if (!$oPart->IsAttachBodyPart()) + { + $aReturn[] = $oPart; + } + } + return $aReturn; + } + + /** + * @return array|null + */ + public function SearchHtmlParts() + { + $aReturn = array(); + $aParts = $this->SearchByContentType('text/html'); + + foreach ($aParts as $oPart) + { + if (!$oPart->IsAttachBodyPart()) + { + $aReturn[] = $oPart; + } + } + + return $aReturn; + } + + /** + * @return \MailSo\Imap\BodyStructure|null + */ + public function SearchInlineEncryptedPart() + { + if ('multipart/encrypted' === \strtolower($this->ContentType())) + { + $aSearchParts = $this->SearchByCallback(function ($oItem) { + return $oItem->IsInline(); + }); + + if (is_array($aSearchParts) && 1 === \count($aSearchParts) && isset($aSearchParts[0])) + { + return $aSearchParts[0]; + } + } + + return null; + } + + /** + * @return array|null + */ + public function SearchHtmlOrPlainParts() + { + $mResult = $this->SearchHtmlParts(); + if (null === $mResult || (\is_array($mResult) && 0 === count($mResult))) + { + $mResult = $this->SearchPlainParts(); + } + + if (null === $mResult || (\is_array($mResult) && 0 === count($mResult))) + { + $oPart = $this->SearchInlineEncryptedPart(); + if ($oPart instanceof \MailSo\Imap\BodyStructure) + { + $mResult = array($oPart); + } + } + + return $mResult; + } + + /** + * @return string + */ + public function SearchCharset() + { + $sResult = ''; + $mParts = array(); + + $mHtmlParts = $this->SearchHtmlParts(); + $mPlainParts = $this->SearchPlainParts(); + + if (\is_array($mHtmlParts) && 0 < \count($mHtmlParts)) + { + $mParts = \array_merge($mParts, $mHtmlParts); + } + + if (\is_array($mPlainParts) && 0 < \count($mPlainParts)) + { + $mParts = \array_merge($mParts, $mPlainParts); + } + + foreach ($mParts as $oPart) + { + $sResult = $oPart ? $oPart->Charset() : ''; + if (!empty($sResult)) + { + break; + } + } + + if (0 === strlen($sResult)) + { + $aParts = $this->SearchAttachmentsParts(); + foreach ($aParts as $oPart) + { + if (0 === \strlen($sResult)) + { + $sResult = $oPart ? $oPart->Charset() : ''; + } + else + { + break; + } + } + } + + return $sResult; + } + + /** + * @param mixed $fCallback + * + * @return array + */ + public function SearchByCallback($fCallback) + { + $aReturn = array(); + if (\call_user_func($fCallback, $this)) + { + $aReturn[] = $this; + } + + if (\is_array($this->aSubParts) && 0 < \count($this->aSubParts)) + { + foreach ($this->aSubParts as /* @var $oSubPart \MailSo\Imap\BodyStructure */ &$oSubPart) + { + $aReturn = \array_merge($aReturn, $oSubPart->SearchByCallback($fCallback)); + } + } + + return $aReturn; + } + + /** + * @return array + */ + public function SearchAttachmentsParts() + { + return $this->SearchByCallback(function ($oItem) { + return $oItem->IsAttachBodyPart(); + }); + } + + /** + * @param string $sContentType + * + * @return array + */ + public function SearchByContentType($sContentType) + { + $sContentType = \strtolower($sContentType); + return $this->SearchByCallback(function ($oItem) use ($sContentType) { + return $sContentType === $oItem->ContentType(); + }); + } + + /** + * @param string $sMimeIndex + * + * @return \MailSo\Imap\BodyStructure + */ + public function GetPartByMimeIndex($sMimeIndex) + { + $oPart = null; + if (0 < \strlen($sMimeIndex)) + { + if ($sMimeIndex === $this->sPartID) + { + $oPart = $this; + } + + if (null === $oPart && is_array($this->aSubParts) && 0 < count($this->aSubParts)) + { + foreach ($this->aSubParts as /* @var $oSubPart \MailSo\Imap\BodyStructure */ &$oSubPart) + { + $oPart = $oSubPart->GetPartByMimeIndex($sMimeIndex); + if (null !== $oPart) + { + break; + } + } + } + } + + return $oPart; + } + + /** + * @param array $aParams + * @param string $sParamName + * @param string $sCharset = \MailSo\Base\Enumerations\Charset::UTF_8 + * + * @return string + */ + private static function decodeAttrParamenter($aParams, $sParamName, $sCharset = \MailSo\Base\Enumerations\Charset::UTF_8) + { + $sResult = ''; + if (isset($aParams[$sParamName])) + { + $sResult = \MailSo\Base\Utils::DecodeHeaderValue($aParams[$sParamName], $sCharset); + } + else if (isset($aParams[$sParamName.'*'])) + { + $aValueParts = \explode("''", $aParams[$sParamName.'*'], 2); + if (\is_array($aValueParts) && 2 === \count($aValueParts)) + { + $sCharset = isset($aValueParts[0]) ? $aValueParts[0] : \MailSo\Base\Enumerations\Charset::UTF_8; + + $sResult = \MailSo\Base\Utils::ConvertEncoding( + \urldecode($aValueParts[1]), $sCharset, \MailSo\Base\Enumerations\Charset::UTF_8); + } + else + { + $sResult = \urldecode($aParams[$sParamName.'*']); + } + } + else + { + $sCharset = ''; + $sCharsetIndex = -1; + + $aFileNames = array(); + foreach ($aParams as $sName => $sValue) + { + $aMatches = array(); + if (\preg_match('/^'.\preg_quote($sParamName, '/').'\*([0-9]+)\*$/i', $sName, $aMatches)) + { + $iIndex = (int) $aMatches[1]; + if ($sCharsetIndex < $iIndex && false !== \strpos($sValue, "''")) + { + $aValueParts = \explode("''", $sValue, 2); + if (\is_array($aValueParts) && 2 === \count($aValueParts) && 0 < \strlen($aValueParts[0])) + { + $sCharsetIndex = $iIndex; + $sCharset = $aValueParts[0]; + $sValue = $aValueParts[1]; + } + } + + $aFileNames[$iIndex] = $sValue; + } + } + + if (0 < \count($aFileNames)) + { + \ksort($aFileNames, SORT_NUMERIC); + $sResult = \implode(\array_values($aFileNames)); + $sResult = \urldecode($sResult); + + if (0 < \strlen($sCharset)) + { + $sResult = \MailSo\Base\Utils::ConvertEncoding($sResult, + $sCharset, \MailSo\Base\Enumerations\Charset::UTF_8); + } + } + } + + return $sResult; + } + + /** + * @param array $aBodyStructure + * @param string $sPartID = '' + * + * @return \MailSo\Imap\BodyStructure + */ + public static function NewInstance(array $aBodyStructure, $sPartID = '') + { + if (!\is_array($aBodyStructure) || 2 > \count($aBodyStructure)) + { + return null; + } + else + { + $sBodyMainType = null; + if (\is_string($aBodyStructure[0]) && 'NIL' !== $aBodyStructure[0]) + { + $sBodyMainType = $aBodyStructure[0]; + } + + $sBodySubType = null; + $sContentType = ''; + $aSubParts = null; + $aBodyParams = array(); + $sName = null; + $sCharset = null; + $sContentID = null; + $sDescription = null; + $sMailEncodingName = null; + $iSize = 0; + $iTextLineCount = 0; // valid for rfc822/message and text parts + $iExtraItemPos = 0; // list index of items which have no well-established position (such as 0, 1, 5, etc). + + if (null === $sBodyMainType) + { + // Process multipart body structure + if (!\is_array($aBodyStructure[0])) + { + return null; + } + else + { + $sBodyMainType = 'multipart'; + $sSubPartIDPrefix = ''; + if (0 === \strlen($sPartID) || '.' === $sPartID[\strlen($sPartID) - 1]) + { + // This multi-part is root part of message. + $sSubPartIDPrefix = $sPartID; + $sPartID .= 'TEXT'; + } + else if (0 < \strlen($sPartID)) + { + // This multi-part is a part of another multi-part. + $sSubPartIDPrefix = $sPartID.'.'; + } + + $aSubParts = array(); + $iIndex = 1; + + while ($iExtraItemPos < \count($aBodyStructure) && \is_array($aBodyStructure[$iExtraItemPos])) + { + $oPart = self::NewInstance($aBodyStructure[$iExtraItemPos], $sSubPartIDPrefix.$iIndex); + if (null === $oPart) + { + return null; + } + else + { + // For multipart, we have no charset info in the part itself. Thus, + // obtain charset from nested parts. + if ($sCharset == null) + { + $sCharset = $oPart->Charset(); + } + + $aSubParts[] = $oPart; + $iExtraItemPos++; + $iIndex++; + } + } + } + + if ($iExtraItemPos < \count($aBodyStructure)) + { + if (!\is_string($aBodyStructure[$iExtraItemPos]) || 'NIL' === $aBodyStructure[$iExtraItemPos]) + { + return null; + } + + $sBodySubType = \strtolower($aBodyStructure[$iExtraItemPos]); + $iExtraItemPos++; + } + + if ($iExtraItemPos < \count($aBodyStructure)) + { + $sBodyParamList = $aBodyStructure[$iExtraItemPos]; + if (\is_array($sBodyParamList)) + { + $aBodyParams = self::getKeyValueListFromArrayList($sBodyParamList); + } + } + + $iExtraItemPos++; + } + else + { + // Process simple (singlepart) body structure + if (7 > \count($aBodyStructure)) + { + return null; + } + + $sBodyMainType = \strtolower($sBodyMainType); + if (!\is_string($aBodyStructure[1]) || 'NIL' === $aBodyStructure[1]) + { + return null; + } + + $sBodySubType = \strtolower($aBodyStructure[1]); + + $aBodyParamList = $aBodyStructure[2]; + if (\is_array($aBodyParamList)) + { + $aBodyParams = self::getKeyValueListFromArrayList($aBodyParamList); + if (isset($aBodyParams['charset'])) + { + $sCharset = $aBodyParams['charset']; + } + + if (\is_array($aBodyParams)) + { + $sName = self::decodeAttrParamenter($aBodyParams, 'name', $sContentType); + } + } + + if (null !== $aBodyStructure[3] && 'NIL' !== $aBodyStructure[3]) + { + if (!\is_string($aBodyStructure[3])) + { + return null; + } + + $sContentID = $aBodyStructure[3]; + } + + if (null !== $aBodyStructure[4] && 'NIL' !== $aBodyStructure[4]) + { + if (!\is_string($aBodyStructure[4])) + { + return null; + } + + $sDescription = $aBodyStructure[4]; + } + + if (null !== $aBodyStructure[5] && 'NIL' !== $aBodyStructure[5]) + { + if (!\is_string($aBodyStructure[5])) + { + return null; + } + $sMailEncodingName = $aBodyStructure[5]; + } + + if (\is_numeric($aBodyStructure[6])) + { + $iSize = (int) $aBodyStructure[6]; + } + else + { + $iSize = -1; + } + + if (0 === \strlen($sPartID) || '.' === $sPartID[\strlen($sPartID) - 1]) + { + // This is the only sub-part of the message (otherwise, it would be + // one of sub-parts of a multi-part, and partID would already be fully set up). + $sPartID .= '1'; + } + + $iExtraItemPos = 7; + if ('text' === $sBodyMainType) + { + if ($iExtraItemPos < \count($aBodyStructure)) + { + if (\is_numeric($aBodyStructure[$iExtraItemPos])) + { + $iTextLineCount = (int) $aBodyStructure[$iExtraItemPos]; + } + else + { + $iTextLineCount = -1; + } + } + else + { + $iTextLineCount = -1; + } + + $iExtraItemPos++; + } + else if ('message' === $sBodyMainType && 'rfc822' === $sBodySubType) + { + if ($iExtraItemPos + 2 < \count($aBodyStructure)) + { + if (\is_numeric($aBodyStructure[$iExtraItemPos + 2])) + { + $iTextLineCount = (int) $aBodyStructure[$iExtraItemPos + 2]; + } + else + { + $iTextLineCount = -1; + } + } + else + { + $iTextLineCount = -1; + } + + $iExtraItemPos += 3; + } + + $iExtraItemPos++; // skip MD5 digest of the body because most mail servers leave it NIL anyway + } + + $sContentType = $sBodyMainType.'/'.$sBodySubType; + + $sDisposition = null; + $aDispositionParams = null; + $sFileName = null; + + if ($iExtraItemPos < \count($aBodyStructure)) + { + $aDispList = $aBodyStructure[$iExtraItemPos]; + if (\is_array($aDispList) && 1 < \count($aDispList)) + { + if (null !== $aDispList[0]) + { + if (\is_string($aDispList[0]) && 'NIL' !== $aDispList[0]) + { + $sDisposition = $aDispList[0]; + } + else + { + return null; + } + } + } + + $aDispParamList = $aDispList[1]; + if (\is_array($aDispParamList)) + { + $aDispositionParams = self::getKeyValueListFromArrayList($aDispParamList); + if (\is_array($aDispositionParams)) + { + $sFileName = self::decodeAttrParamenter($aDispositionParams, 'filename', $sCharset); + } + } + } + + $iExtraItemPos++; + + $sLanguage = null; + if ($iExtraItemPos < count($aBodyStructure)) + { + if (null !== $aBodyStructure[$iExtraItemPos] && 'NIL' !== $aBodyStructure[$iExtraItemPos]) + { + if (\is_array($aBodyStructure[$iExtraItemPos])) + { + $sLanguage = \implode(',', $aBodyStructure[$iExtraItemPos]); + } + else if (\is_string($aBodyStructure[$iExtraItemPos])) + { + $sLanguage = $aBodyStructure[$iExtraItemPos]; + } + } + $iExtraItemPos++; + } + + $sLocation = null; + if ($iExtraItemPos < \count($aBodyStructure)) + { + if (null !== $aBodyStructure[$iExtraItemPos] && 'NIL' !== $aBodyStructure[$iExtraItemPos]) + { + if (\is_string($aBodyStructure[$iExtraItemPos])) + { + $sLocation = $aBodyStructure[$iExtraItemPos]; + } + } + $iExtraItemPos++; + } + + return new self( + $sContentType, + $sCharset, + $aBodyParams, + $sContentID, + $sDescription, + $sMailEncodingName, + $sDisposition, + $aDispositionParams, + \MailSo\Base\Utils::Utf8Clear((null === $sFileName || 0 === \strlen($sFileName)) ? $sName : $sFileName), + $sLanguage, + $sLocation, + $iSize, + $iTextLineCount, + $sPartID, + $aSubParts + ); + } + } + + /** + * @param array $aBodyStructure + * @param string $sSubPartID + * + * @return \MailSo\Imap\BodyStructure|null + */ + public static function NewInstanceFromRfc822SubPart(array $aBodyStructure, $sSubPartID) + { + $oBody = null; + $aBodySubStructure = self::findPartByIndexInArray($aBodyStructure, $sSubPartID); + if ($aBodySubStructure && \is_array($aBodySubStructure) && isset($aBodySubStructure[8])) + { + $oBody = self::NewInstance($aBodySubStructure[8], $sSubPartID); + } + + return $oBody; + } + + /** + * @param array $aList + * @param string $sPartID + * + * @return array|null + */ + private static function findPartByIndexInArray(array $aList, $sPartID) + { + $bFind = false; + $aPath = \explode('.', ''.$sPartID); + $aCurrentPart = $aList; + + foreach ($aPath as $iPos => $iNum) + { + $iIndex = \intval($iNum) - 1; + if (0 <= $iIndex && 0 < $iPos ? isset($aCurrentPart[8][$iIndex]) : isset($aCurrentPart[$iIndex])) + { + $aCurrentPart = 0 < $iPos ? $aCurrentPart[8][$iIndex] : $aCurrentPart[$iIndex]; + $bFind = true; + } + } + + return $bFind ? $aCurrentPart : null; + } + + /** + * Returns dict with key="charset" and value="US-ASCII" for array ("CHARSET" "US-ASCII"). + * Keys are lowercased (StringDictionary itself does this), values are not altered. + * + * @param array $aList + * + * @return array + */ + private static function getKeyValueListFromArrayList(array $aList) + { + $aDict = null; + if (0 === \count($aList) % 2) + { + $aDict = array(); + for ($iIndex = 0, $iLen = \count($aList); $iIndex < $iLen; $iIndex += 2) + { + if (\is_string($aList[$iIndex]) && isset($aList[$iIndex + 1]) && \is_string($aList[$iIndex + 1])) + { + $aDict[\strtolower($aList[$iIndex])] = $aList[$iIndex + 1]; + } + } + } + + return $aDict; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/FetchType.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/FetchType.php new file mode 100755 index 00000000..fe6a36e1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/FetchType.php @@ -0,0 +1,127 @@ +GetLastResponse(); + if ($oResponse && $oResponse->IsStatusResponse && !empty($oResponse->HumanReadable) && + isset($oResponse->OptionalResponse[0]) && 'ALERT' === $oResponse->OptionalResponse[0]) + { + $sResult = $oResponse->HumanReadable; + } + + return $sResult; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/ResponseException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/ResponseException.php new file mode 100755 index 00000000..24f0d8ca --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/ResponseException.php @@ -0,0 +1,57 @@ +aResponses = $aResponses; + } + } + + /** + * @return array + */ + public function GetResponses() + { + return $this->aResponses; + } + + /** + * @return \MailSo\Imap\Response|null + */ + public function GetLastResponse() + { + return 0 < count($this->aResponses) ? $this->aResponses[count($this->aResponses) - 1] : null; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/ResponseNotFoundException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/ResponseNotFoundException.php new file mode 100755 index 00000000..2d4d0296 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/ResponseNotFoundException.php @@ -0,0 +1,19 @@ +oImapResponse = $oImapResponse; + $this->aEnvelopeCache = null; + } + + /** + * @param \MailSo\Imap\Response $oImapResponse + * @return \MailSo\Imap\FetchResponse + */ + public static function NewInstance($oImapResponse) + { + return new self($oImapResponse); + } + + /** + * @param bool $bForce = false + * + * @return array|null + */ + public function GetEnvelope($bForce = false) + { + if (null === $this->aEnvelopeCache || $bForce) + { + $this->aEnvelopeCache = $this->GetFetchValue(Enumerations\FetchType::ENVELOPE); + } + return $this->aEnvelopeCache; + } + + /** + * @param int $iIndex + * @param mixed $mNullResult = null + * + * @return mixed + */ + public function GetFetchEnvelopeValue($iIndex, $mNullResult) + { + return self::findEnvelopeIndex($this->GetEnvelope(), $iIndex, $mNullResult); + } + + /** + * @param int $iIndex + * @param string $sParentCharset = \MailSo\Base\Enumerations\Charset::ISO_8859_1 + * + * @return \MailSo\Mime\EmailCollection|null + */ + public function GetFetchEnvelopeEmailCollection($iIndex, $sParentCharset = \MailSo\Base\Enumerations\Charset::ISO_8859_1) + { + $oResult = null; + $aEmails = $this->GetFetchEnvelopeValue($iIndex, null); + if (is_array($aEmails) && 0 < count($aEmails)) + { + $oResult = \MailSo\Mime\EmailCollection::NewInstance(); + foreach ($aEmails as $aEmailItem) + { + if (is_array($aEmailItem) && 4 === count($aEmailItem)) + { + $sDisplayName = \MailSo\Base\Utils::DecodeHeaderValue( + self::findEnvelopeIndex($aEmailItem, 0, ''), $sParentCharset); + +// $sRemark = \MailSo\Base\Utils::DecodeHeaderValue( +// self::findEnvelopeIndex($aEmailItem, 1, ''), $sParentCharset); + + $sLocalPart = self::findEnvelopeIndex($aEmailItem, 2, ''); + $sDomainPart = self::findEnvelopeIndex($aEmailItem, 3, ''); + + if (0 < strlen($sLocalPart) && 0 < strlen($sDomainPart)) + { + $oResult->Add( + \MailSo\Mime\Email::NewInstance($sLocalPart.'@'.$sDomainPart, $sDisplayName) + ); + } + } + } + } + + return $oResult; + } + + /** + * @param string $sRfc822SubMimeIndex = '' + * + * @return \MailSo\Imap\BodyStructure|null + */ + public function GetFetchBodyStructure($sRfc822SubMimeIndex = '') + { + $oBodyStructure = null; + $aBodyStructureArray = $this->GetFetchValue(Enumerations\FetchType::BODYSTRUCTURE); + + if (is_array($aBodyStructureArray)) + { + if (0 < strlen($sRfc822SubMimeIndex)) + { + $oBodyStructure = BodyStructure::NewInstanceFromRfc822SubPart($aBodyStructureArray, $sRfc822SubMimeIndex); + } + else + { + $oBodyStructure = BodyStructure::NewInstance($aBodyStructureArray); + } + } + + return $oBodyStructure; + } + + /** + * @param string $sFetchItemName + * + * @return mixed + */ + public function GetFetchValue($sFetchItemName) + { + $mReturn = null; + $bNextIsValue = false; + + if (Enumerations\FetchType::INDEX === $sFetchItemName) + { + $mReturn = $this->oImapResponse->ResponseList[1]; + } + else if (isset($this->oImapResponse->ResponseList[3]) && \is_array($this->oImapResponse->ResponseList[3])) + { + foreach ($this->oImapResponse->ResponseList[3] as $mItem) + { + if ($bNextIsValue) + { + $mReturn = $mItem; + break; + } + + if ($sFetchItemName === $mItem) + { + $bNextIsValue = true; + } + } + } + + return $mReturn; + } + + /** + * @param string $sRfc822SubMimeIndex = '' + * + * @return string + */ + public function GetHeaderFieldsValue($sRfc822SubMimeIndex = '') + { + $sReturn = ''; + $bNextIsValue = false; + + $sRfc822SubMimeIndex = 0 < \strlen($sRfc822SubMimeIndex) ? ''.$sRfc822SubMimeIndex.'.' : ''; + + if (isset($this->oImapResponse->ResponseList[3]) && \is_array($this->oImapResponse->ResponseList[3])) + { + foreach ($this->oImapResponse->ResponseList[3] as $mItem) + { + if ($bNextIsValue) + { + $sReturn = (string) $mItem; + break; + } + + if (\is_string($mItem) && ( + $mItem === 'BODY['.$sRfc822SubMimeIndex.'HEADER]' || + 0 === \strpos($mItem, 'BODY['.$sRfc822SubMimeIndex.'HEADER.FIELDS') || + $mItem === 'BODY['.$sRfc822SubMimeIndex.'MIME]')) + { + $bNextIsValue = true; + } + } + } + + return $sReturn; + } + + private static function findFetchUidAndSize($aList) + { + $bUid = false; + $bSize = false; + if (is_array($aList)) + { + foreach ($aList as $mItem) + { + if (\MailSo\Imap\Enumerations\FetchType::UID === $mItem) + { + $bUid = true; + } + else if (\MailSo\Imap\Enumerations\FetchType::RFC822_SIZE === $mItem) + { + $bSize = true; + } + } + } + + return $bUid && $bSize; + } + + /** + * @param \MailSo\Imap\Response $oImapResponse + * + * @return bool + */ + public static function IsValidFetchImapResponse($oImapResponse) + { + return ( + $oImapResponse + && true !== $oImapResponse->IsStatusResponse + && \MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType + && 3 < count($oImapResponse->ResponseList) && 'FETCH' === $oImapResponse->ResponseList[2] + && is_array($oImapResponse->ResponseList[3]) + ); + } + + /** + * @param \MailSo\Imap\Response $oImapResponse + * + * @return bool + */ + public static function IsNotEmptyFetchImapResponse($oImapResponse) + { + return ( + $oImapResponse + && self::IsValidFetchImapResponse($oImapResponse) + && isset($oImapResponse->ResponseList[3]) + && self::findFetchUidAndSize($oImapResponse->ResponseList[3]) + ); + } + + /** + * @param array $aEnvelope + * @param int $iIndex + * @param mixed $mNullResult = null + * + * @return mixed + */ + private static function findEnvelopeIndex($aEnvelope, $iIndex, $mNullResult) + { + return (isset($aEnvelope[$iIndex]) && 'NIL' !== $aEnvelope[$iIndex] && '' !== $aEnvelope[$iIndex]) + ? $aEnvelope[$iIndex] : $mNullResult; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Folder.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Folder.php new file mode 100755 index 00000000..50fd4233 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Folder.php @@ -0,0 +1,193 @@ +sNameRaw = ''; + $this->sFullNameRaw = ''; + $this->sDelimiter = ''; + $this->aFlags = array(); + $this->aExtended = array(); + + $sDelimiter = 'NIL' === \strtoupper($sDelimiter) ? '' : $sDelimiter; + if (empty($sDelimiter)) + { + $sDelimiter = '.'; // default delimiter + } + + if (!\is_array($aFlags) || + !\is_string($sDelimiter) || 1 < \strlen($sDelimiter) || + !\is_string($sFullNameRaw) || 0 === \strlen($sFullNameRaw)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $this->sFullNameRaw = $sFullNameRaw; + $this->sDelimiter = $sDelimiter; + $this->aFlags = $aFlags; + $this->aFlagsLowerCase = \array_map('strtolower', $this->aFlags); + + $this->sFullNameRaw = 'INBOX'.$this->sDelimiter === \substr(\strtoupper($this->sFullNameRaw), 0, 5 + \strlen($this->sDelimiter)) ? + 'INBOX'.\substr($this->sFullNameRaw, 5) : $this->sFullNameRaw; + + if ($this->IsInbox()) + { + $this->sFullNameRaw = 'INBOX'; + } + + $this->sNameRaw = $this->sFullNameRaw; + if (0 < \strlen($this->sDelimiter)) + { + $aNames = \explode($this->sDelimiter, $this->sFullNameRaw); + if (false !== \array_search('', $aNames)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $this->sNameRaw = \end($aNames); + } + } + + /** + * @param string $sFullNameRaw + * @param string $sDelimiter = '.' + * @param array $aFlags = array() + * + * @return \MailSo\Imap\Folder + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public static function NewInstance($sFullNameRaw, $sDelimiter = '.', $aFlags = array()) + { + return new self($sFullNameRaw, $sDelimiter, $aFlags); + } + + /** + * @return string + */ + public function NameRaw() + { + return $this->sNameRaw; + } + + /** + * @return string + */ + public function FullNameRaw() + { + return $this->sFullNameRaw; + } + + /** + * @return string | null + */ + public function Delimiter() + { + return $this->sDelimiter; + } + + /** + * @return array + */ + public function Flags() + { + return $this->aFlags; + } + + /** + * @return array + */ + public function FlagsLowerCase() + { + return $this->aFlagsLowerCase; + } + + /** + * @return bool + */ + public function IsSelectable() + { + return !\in_array('\noselect', $this->aFlagsLowerCase); + } + + /** + * @return bool + */ + public function IsInbox() + { + return 'INBOX' === \strtoupper($this->sFullNameRaw) || \in_array('\inbox', $this->aFlagsLowerCase); + } + + /** + * @param string $sName + * @param mixed $mData + */ + public function SetExtended($sName, $mData) + { + $this->aExtended[$sName] = $mData; + } + + /** + * @param string $sName + * @return mixed + */ + public function GetExtended($sName) + { + return isset($this->aExtended[$sName]) ? $this->aExtended[$sName] : null; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/FolderInformation.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/FolderInformation.php new file mode 100755 index 00000000..bc7118d5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/FolderInformation.php @@ -0,0 +1,112 @@ +FolderName = $sFolderName; + $this->IsWritable = $bIsWritable; + $this->Exists = null; + $this->Recent = null; + $this->Flags = array(); + $this->PermanentFlags = array(); + + $this->Unread = null; + $this->Uidnext = null; + $this->HighestModSeq = null; + } + + /** + * @param string $sFolderName + * @param bool $bIsWritable + * + * @return \MailSo\Imap\FolderInformation + */ + public static function NewInstance($sFolderName, $bIsWritable) + { + return new self($sFolderName, $bIsWritable); + } + + /** + * @param string $sFlag + * + * @return bool + */ + public function IsFlagSupported($sFlag) + { + return \in_array('\\*', $this->PermanentFlags) || + \in_array($sFlag, $this->PermanentFlags) || + \in_array($sFlag, $this->Flags); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/ImapClient.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/ImapClient.php new file mode 100755 index 00000000..9e01e2c1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/ImapClient.php @@ -0,0 +1,2667 @@ +iTagCount = 0; + $this->aCapabilityItems = null; + $this->oCurrentFolderInfo = null; + $this->aFetchCallbacks = null; + $this->iResponseBufParsedPos = 0; + + $this->aLastResponse = array(); + $this->bNeedNext = true; + $this->aPartialResponses = array(); + + $this->aTagTimeouts = array(); + + $this->bIsLoggined = false; + $this->bIsSelected = false; + $this->sLogginedUser = ''; + + $this->__FORCE_SELECT_ON_EXAMINE__ = false; + + @\ini_set('xdebug.max_nesting_level', 500); + } + + /** + * @return \MailSo\Imap\ImapClient + */ + public static function NewInstance() + { + return new self(); + } + + /** + * @return string + */ + public function GetLogginedUser() + { + return $this->sLogginedUser; + } + + /** + * @param string $sServerName + * @param int $iPort = 143 + * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT + * @param bool $bVerifySsl = false + * @param bool $bAllowSelfSigned = true + * + * @return \MailSo\Imap\ImapClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function Connect($sServerName, $iPort = 143, + $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT, + $bVerifySsl = false, $bAllowSelfSigned = true) + { + $this->aTagTimeouts['*'] = \microtime(true); + + parent::Connect($sServerName, $iPort, $iSecurityType, $bVerifySsl, $bAllowSelfSigned); + + $this->parseResponseWithValidation('*', true); + + if (\MailSo\Net\Enumerations\ConnectionSecurityType::UseStartTLS( + $this->IsSupported('STARTTLS'), $this->iSecurityType)) + { + $this->SendRequestWithCheck('STARTTLS'); + $this->EnableCrypto(); + + $this->aCapabilityItems = null; + } + else if (\MailSo\Net\Enumerations\ConnectionSecurityType::STARTTLS === $this->iSecurityType) + { + $this->writeLogException( + new \MailSo\Net\Exceptions\SocketUnsuppoterdSecureConnectionException('STARTTLS is not supported'), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + return $this; + } + + protected function _xor($string, $string2) + { + $result = ''; + $size = strlen($string); + for ($i=0; $i<$size; $i++) { + $result .= chr(ord($string[$i]) ^ ord($string2[$i])); + } + return $result; + } + + /** + * @param string $sLogin + * @param string $sPassword + * @param string $sProxyAuthUser = '' + * @param bool $bUseAuthPlainIfSupported = true + * @param bool $bUseAuthCramMd5IfSupported = true + * + * @return \MailSo\Imap\ImapClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function Login($sLogin, $sPassword, $sProxyAuthUser = '', + $bUseAuthPlainIfSupported = true, $bUseAuthCramMd5IfSupported = true) + { + if (!\MailSo\Base\Validator::NotEmptyString($sLogin, true) || + !\MailSo\Base\Validator::NotEmptyString($sPassword, true)) + { + $this->writeLogException( + new \MailSo\Base\Exceptions\InvalidArgumentException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + $sLogin = \MailSo\Base\Utils::IdnToAscii(\MailSo\Base\Utils::Trim($sLogin)); + + $sPassword = $sPassword; + + $this->sLogginedUser = $sLogin; + + try + { + if ($bUseAuthCramMd5IfSupported && $this->IsSupported('AUTH=CRAM-MD5')) + { + $this->SendRequest('AUTHENTICATE', array('CRAM-MD5')); + + $aResponse = $this->parseResponseWithValidation(); + if ($aResponse && \is_array($aResponse) && 0 < \count($aResponse) && + \MailSo\Imap\Enumerations\ResponseType::CONTINUATION === $aResponse[\count($aResponse) - 1]->ResponseType) + { + $oContinuationResponse = null; + foreach ($aResponse as $oResponse) + { + if ($oResponse && \MailSo\Imap\Enumerations\ResponseType::CONTINUATION === $oResponse->ResponseType) + { + $oContinuationResponse = $oResponse; + } + } + + if ($oContinuationResponse && !empty($oContinuationResponse->ResponseList[1])) + { + $sTicket = @\base64_decode($oContinuationResponse->ResponseList[1]); + $this->oLogger->Write('ticket: '.$sTicket); + + $sToken = \base64_encode($sLogin.' '.\MailSo\Base\Utils::Hmac($sTicket, $sPassword)); + + if ($this->oLogger) + { + $this->oLogger->AddSecret($sToken); + } + + $this->sendRaw($sToken, true, '*******'); + $this->parseResponseWithValidation(); + } + else + { + $this->writeLogException( + new \MailSo\Imap\Exceptions\LoginException(), + \MailSo\Log\Enumerations\Type::NOTICE, true); + } + } + else + { + $this->writeLogException( + new \MailSo\Imap\Exceptions\LoginException(), + \MailSo\Log\Enumerations\Type::NOTICE, true); + } + } + else if ($bUseAuthPlainIfSupported && $this->IsSupported('AUTH=PLAIN')) + { + $sToken = \base64_encode("\0".$sLogin."\0".$sPassword); + if ($this->oLogger) + { + $this->oLogger->AddSecret($sToken); + } + + if ($this->IsSupported('AUTH=SASL-IR') && false) + { + $this->SendRequestWithCheck('AUTHENTICATE', array('PLAIN', $sToken)); + } + else + { + $this->SendRequest('AUTHENTICATE', array('PLAIN')); + $this->parseResponseWithValidation(); + + $this->sendRaw($sToken, true, '*******'); + $this->parseResponseWithValidation(); + } + } + else + { + if ($this->oLogger) + { + $this->oLogger->AddSecret($this->EscapeString($sPassword)); + } + + $this->SendRequestWithCheck('LOGIN', + array( + $this->EscapeString($sLogin), + $this->EscapeString($sPassword) + )); + } +// else +// { +// $this->writeLogException( +// new \MailSo\Imap\Exceptions\LoginBadMethodException(), +// \MailSo\Log\Enumerations\Type::NOTICE, true); +// } + + if (0 < \strlen($sProxyAuthUser)) + { + $this->SendRequestWithCheck('PROXYAUTH', array($this->EscapeString($sProxyAuthUser))); + } + } + catch (\MailSo\Imap\Exceptions\NegativeResponseException $oException) + { + $this->writeLogException( + new \MailSo\Imap\Exceptions\LoginBadCredentialsException( + $oException->GetResponses(), '', 0, $oException), + \MailSo\Log\Enumerations\Type::NOTICE, true); + } + + $this->bIsLoggined = true; + $this->aCapabilityItems = null; + + return $this; + } + + /** + * @param string $sXOAuth2Token + * + * @return \MailSo\Imap\ImapClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function LoginWithXOauth2($sXOAuth2Token) + { + if (!\MailSo\Base\Validator::NotEmptyString($sXOAuth2Token, true)) + { + $this->writeLogException( + new \MailSo\Base\Exceptions\InvalidArgumentException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + if (!$this->IsSupported('AUTH=XOAUTH2')) + { + $this->writeLogException( + new \MailSo\Imap\Exceptions\LoginBadMethodException(), + \MailSo\Log\Enumerations\Type::NOTICE, true); + } + + try + { + $this->SendRequest('AUTHENTICATE', array('XOAUTH2', \trim($sXOAuth2Token))); + $aR = $this->parseResponseWithValidation(); + + if (\is_array($aR) && 0 < \count($aR) && isset($aR[\count($aR) - 1])) + { + $oR = $aR[\count($aR) - 1]; + if (\MailSo\Imap\Enumerations\ResponseType::CONTINUATION === $oR->ResponseType) + { + if (!empty($oR->ResponseList[1]) && preg_match('/^[a-zA-Z0-9=+\/]+$/', $oR->ResponseList[1])) + { + $this->Logger()->Write(\base64_decode($oR->ResponseList[1]), + \MailSo\Log\Enumerations\Type::WARNING); + } + + $this->sendRaw(''); + $this->parseResponseWithValidation(); + } + } + } + catch (\MailSo\Imap\Exceptions\NegativeResponseException $oException) + { + $this->writeLogException( + new \MailSo\Imap\Exceptions\LoginBadCredentialsException( + $oException->GetResponses(), '', 0, $oException), + \MailSo\Log\Enumerations\Type::NOTICE, true); + } + + $this->bIsLoggined = true; + $this->aCapabilityItems = null; + + return $this; + } + + /** + * @return \MailSo\Imap\ImapClient + * + * @throws \MailSo\Net\Exceptions\Exception + */ + public function Logout() + { + if ($this->bIsLoggined) + { + $this->bIsLoggined = false; + $this->SendRequestWithCheck('LOGOUT', array()); + } + + return $this; + } + + /** + * @return \MailSo\Imap\ImapClient + */ + public function ForceCloseConnection() + { + $this->Disconnect(); + + return $this; + } + + /** + * @return bool + */ + public function IsLoggined() + { + return $this->IsConnected() && $this->bIsLoggined; + } + + /** + * @return bool + */ + public function IsSelected() + { + return $this->IsLoggined() && $this->bIsSelected; + } + + /** + * @return array|null + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function Capability() + { + $this->SendRequestWithCheck('CAPABILITY', array(), true); + return $this->aCapabilityItems; + } + + /** + * @param string $sExtentionName + * @return bool + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function IsSupported($sExtentionName) + { + $bResult = \MailSo\Base\Validator::NotEmptyString($sExtentionName, true); + if ($bResult && null === $this->aCapabilityItems) + { + $this->aCapabilityItems = $this->Capability(); + } + + return $bResult && \is_array($this->aCapabilityItems) && + \in_array(\strtoupper($sExtentionName), $this->aCapabilityItems); + } + + /** + * @return \MailSo\Imap\NamespaceResult|null + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function GetNamespace() + { + if (!$this->IsSupported('NAMESPACE')) + { + return null; + } + + $oReturn = false; + + $this->SendRequest('NAMESPACE'); + $aResult = $this->parseResponseWithValidation(); + + $oImapResponse = null; + foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) + { + if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType && + 'NAMESPACE' === $oImapResponse->StatusOrIndex) + { + $oReturn = NamespaceResult::NewInstance(); + $oReturn->InitByImapResponse($oImapResponse); + break; + } + } + + if (false === $oReturn) + { + $this->writeLogException( + new \MailSo\Imap\Exceptions\ResponseException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + return $oReturn; + } + + /** + * @return \MailSo\Imap\ImapClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function Noop() + { + return $this->SendRequestWithCheck('NOOP'); + } + + /** + * @param string $sFolderName + * + * @return \MailSo\Imap\ImapClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function FolderCreate($sFolderName) + { + return $this->SendRequestWithCheck('CREATE', + array($this->EscapeString($sFolderName))); + } + + /** + * @param string $sFolderName + * + * @return \MailSo\Imap\ImapClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function FolderDelete($sFolderName) + { + return $this->SendRequestWithCheck('DELETE', + array($this->EscapeString($sFolderName))); + } + + /** + * @param string $sFolderName + * + * @return \MailSo\Imap\ImapClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function FolderSubscribe($sFolderName) + { + return $this->SendRequestWithCheck('SUBSCRIBE', + array($this->EscapeString($sFolderName))); + } + + /** + * @param string $sFolderName + * + * @return \MailSo\Imap\ImapClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function FolderUnSubscribe($sFolderName) + { + return $this->SendRequestWithCheck('UNSUBSCRIBE', + array($this->EscapeString($sFolderName))); + } + + /** + * @param string $sOldFolderName + * @param string $sNewFolderName + * + * @return \MailSo\Imap\ImapClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function FolderRename($sOldFolderName, $sNewFolderName) + { + return $this->SendRequestWithCheck('RENAME', array( + $this->EscapeString($sOldFolderName), + $this->EscapeString($sNewFolderName))); + } + + /** + * @param array $aResult + * + * @return array + */ + protected function getStatusFolderInformation($aResult) + { + $aReturn = array(); + + if (\is_array($aResult)) + { + $oImapResponse = null; + foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) + { + if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType && + 'STATUS' === $oImapResponse->StatusOrIndex && isset($oImapResponse->ResponseList[3]) && + \is_array($oImapResponse->ResponseList[3])) + { + $sName = null; + foreach ($oImapResponse->ResponseList[3] as $sArrayItem) + { + if (null === $sName) + { + $sName = $sArrayItem; + } + else + { + $aReturn[$sName] = $sArrayItem; + $sName = null; + } + } + } + } + } + + return $aReturn; + } + + /** + * @param string $sFolderName + * @param array $aStatusItems + * + * @return array|bool + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function FolderStatus($sFolderName, array $aStatusItems) + { + $aResult = false; + if (\count($aStatusItems) > 0) + { + $this->SendRequest('STATUS', + array($this->EscapeString($sFolderName), $aStatusItems)); + + $aResult = $this->getStatusFolderInformation( + $this->parseResponseWithValidation()); + } + + return $aResult; + } + + /** + * @param array $aResult + * @param string $sStatus + * @param bool $bUseListStatus = false + * + * @return array + */ + private function getFoldersFromResult(array $aResult, $sStatus, $bUseListStatus = false) + { + $aReturn = array(); + + $sDelimiter = ''; + $bInbox = false; + + $oImapResponse = null; + foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) + { + if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType && + $sStatus === $oImapResponse->StatusOrIndex && 5 === count($oImapResponse->ResponseList)) + { + try + { + $oFolder = Folder::NewInstance($oImapResponse->ResponseList[4], + $oImapResponse->ResponseList[3], $oImapResponse->ResponseList[2]); + + if ($oFolder->IsInbox()) + { + $bInbox = true; + } + + if (empty($sDelimiter)) + { + $sDelimiter = $oFolder->Delimiter(); + } + + $aReturn[] = $oFolder; + } + catch (\MailSo\Base\Exceptions\InvalidArgumentException $oException) + { + $this->writeLogException($oException, \MailSo\Log\Enumerations\Type::WARNING, false); + } + } + } + + if (!$bInbox && !empty($sDelimiter)) + { + $aReturn[] = Folder::NewInstance('INBOX', $sDelimiter); + } + + if ($bUseListStatus) + { + foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) + { + if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType && + 'STATUS' === $oImapResponse->StatusOrIndex && + isset($oImapResponse->ResponseList[2]) && + isset($oImapResponse->ResponseList[3]) && + \is_array($oImapResponse->ResponseList[3])) + { + $sFolderNameRaw = $oImapResponse->ResponseList[2]; + + $oCurrentFolder = null; + foreach ($aReturn as &$oFolder) + { + if ($oFolder && $sFolderNameRaw === $oFolder->FullNameRaw()) + { + $oCurrentFolder =& $oFolder; + break; + } + } + + if (null !== $oCurrentFolder) + { + $sName = null; + $aStatus = array(); + + foreach ($oImapResponse->ResponseList[3] as $sArrayItem) + { + if (null === $sName) + { + $sName = $sArrayItem; + } + else + { + $aStatus[$sName] = $sArrayItem; + $sName = null; + } + } + + if (0 < count($aStatus)) + { + $oCurrentFolder->SetExtended('STATUS', $aStatus); + } + } + + unset($oCurrentFolder); + } + } + } + + return $aReturn; + } + + /** + * @param bool $bIsSubscribeList + * @param string $sParentFolderName = '' + * @param string $sListPattern = '*' + * @param bool $bUseListStatus = false + * + * @return array + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + private function specificFolderList($bIsSubscribeList, $sParentFolderName = '', $sListPattern = '*', $bUseListStatus = false) + { + $sCmd = 'LSUB'; + if (!$bIsSubscribeList) + { + $sCmd = 'LIST'; + } + + $sListPattern = 0 === strlen(trim($sListPattern)) ? '*' : $sListPattern; + + $aParameters = array( + $this->EscapeString($sParentFolderName), + $this->EscapeString($sListPattern) + ); + + if ($bUseListStatus && !$bIsSubscribeList && $this->IsSupported('LIST-STATUS')) + { + $aL = array( + \MailSo\Imap\Enumerations\FolderStatus::MESSAGES, + \MailSo\Imap\Enumerations\FolderStatus::UNSEEN, + \MailSo\Imap\Enumerations\FolderStatus::UIDNEXT + ); + +// if ($this->IsSupported('CONDSTORE')) +// { +// $aL[] = \MailSo\Imap\Enumerations\FolderStatus::HIGHESTMODSEQ; +// } + + $aParameters[] = 'RETURN'; + $aParameters[] = array('STATUS', $aL); + } + else + { + $bUseListStatus = false; + } + + $this->SendRequest($sCmd, $aParameters); + + return $this->getFoldersFromResult( + $this->parseResponseWithValidation(), $sCmd, $bUseListStatus); + } + + /** + * @param string $sParentFolderName = '' + * @param string $sListPattern = '*' + * + * @return array + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function FolderList($sParentFolderName = '', $sListPattern = '*') + { + return $this->specificFolderList(false, $sParentFolderName, $sListPattern); + } + + /** + * @param string $sParentFolderName = '' + * @param string $sListPattern = '*' + * + * @return array + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function FolderSubscribeList($sParentFolderName = '', $sListPattern = '*') + { + return $this->specificFolderList(true, $sParentFolderName, $sListPattern); + } + + /** + * @param string $sParentFolderName = '' + * @param string $sListPattern = '*' + * + * @return array + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function FolderStatusList($sParentFolderName = '', $sListPattern = '*') + { + return $this->specificFolderList(false, $sParentFolderName, $sListPattern, true); + } + + /** + * @param array $aResult + * @param string $sFolderName + * @param bool $bIsWritable + * + * @return void + */ + protected function initCurrentFolderInformation($aResult, $sFolderName, $bIsWritable) + { + if (\is_array($aResult)) + { + $oImapResponse = null; + $oResult = FolderInformation::NewInstance($sFolderName, $bIsWritable); + + foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) + { + if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType) + { + if (\count($oImapResponse->ResponseList) > 2 && + 'FLAGS' === $oImapResponse->ResponseList[1] && \is_array($oImapResponse->ResponseList[2])) + { + $oResult->Flags = $oImapResponse->ResponseList[2]; + } + + if (is_array($oImapResponse->OptionalResponse) && \count($oImapResponse->OptionalResponse) > 1) + { + if ('PERMANENTFLAGS' === $oImapResponse->OptionalResponse[0] && + is_array($oImapResponse->OptionalResponse[1])) + { + $oResult->PermanentFlags = $oImapResponse->OptionalResponse[1]; + } + else if ('UIDVALIDITY' === $oImapResponse->OptionalResponse[0] && + isset($oImapResponse->OptionalResponse[1])) + { + $oResult->Uidvalidity = $oImapResponse->OptionalResponse[1]; + } + else if ('UNSEEN' === $oImapResponse->OptionalResponse[0] && + isset($oImapResponse->OptionalResponse[1]) && + is_numeric($oImapResponse->OptionalResponse[1])) + { + $oResult->Unread = (int) $oImapResponse->OptionalResponse[1]; + } + else if ('UIDNEXT' === $oImapResponse->OptionalResponse[0] && + isset($oImapResponse->OptionalResponse[1])) + { + $oResult->Uidnext = $oImapResponse->OptionalResponse[1]; + } + else if ('HIGHESTMODSEQ' === $oImapResponse->OptionalResponse[0] && + isset($oImapResponse->OptionalResponse[1]) && + \is_numeric($oImapResponse->OptionalResponse[1])) + { + $oResult->HighestModSeq = \trim($oImapResponse->OptionalResponse[1]); + } + } + + if (\count($oImapResponse->ResponseList) > 2 && + \is_string($oImapResponse->ResponseList[2]) && + \is_numeric($oImapResponse->ResponseList[1])) + { + switch($oImapResponse->ResponseList[2]) + { + case 'EXISTS': + $oResult->Exists = (int) $oImapResponse->ResponseList[1]; + break; + case 'RECENT': + $oResult->Recent = (int) $oImapResponse->ResponseList[1]; + break; + } + } + } + } + + $this->oCurrentFolderInfo = $oResult; + } + } + + /** + * @param string $sFolderName + * @param bool $bIsWritable + * @param bool $bReSelectSameFolders + * + * @return \MailSo\Imap\ImapClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + protected function selectOrExamineFolder($sFolderName, $bIsWritable, $bReSelectSameFolders) + { + if (!$bReSelectSameFolders) + { + if ($this->oCurrentFolderInfo && + $sFolderName === $this->oCurrentFolderInfo->FolderName && + $bIsWritable === $this->oCurrentFolderInfo->IsWritable) + { + return $this; + } + } + + if (!\MailSo\Base\Validator::NotEmptyString($sFolderName, true)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $this->SendRequest(($bIsWritable) ? 'SELECT' : 'EXAMINE', + array($this->EscapeString($sFolderName))); + + $this->initCurrentFolderInformation( + $this->parseResponseWithValidation(), $sFolderName, $bIsWritable); + + $this->bIsSelected = true; + + return $this; + } + + /** + * @param string $sFolderName + * @param bool $bReSelectSameFolders = false + * + * @return \MailSo\Imap\ImapClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function FolderSelect($sFolderName, $bReSelectSameFolders = false) + { + return $this->selectOrExamineFolder($sFolderName, true, $bReSelectSameFolders); + } + + /** + * @param string $sFolderName + * @param bool $bReSelectSameFolders = false + * + * @return \MailSo\Imap\ImapClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function FolderExamine($sFolderName, $bReSelectSameFolders = false) + { + return $this->selectOrExamineFolder($sFolderName, $this->__FORCE_SELECT_ON_EXAMINE__, $bReSelectSameFolders); + } + + /** + * @return \MailSo\Imap\ImapClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function FolderUnSelect() + { + if ($this->IsSelected() && $this->IsSupported('UNSELECT')) + { + $this->SendRequestWithCheck('UNSELECT'); + $this->bIsSelected = false; + } + + return $this; + } + + /** + * @param array $aInputFetchItems + * @param string $sIndexRange + * @param bool $bIndexIsUid + * + * @return array + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function Fetch(array $aInputFetchItems, $sIndexRange, $bIndexIsUid) + { + $sIndexRange = (string) $sIndexRange; + if (!\MailSo\Base\Validator::NotEmptyString($sIndexRange, true)) + { + $this->writeLogException( + new \MailSo\Base\Exceptions\InvalidArgumentException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + $aFetchItems = \MailSo\Imap\Enumerations\FetchType::ChangeFetchItemsBefourRequest($aInputFetchItems); + foreach ($aFetchItems as $sName => $mItem) + { + if (0 < \strlen($sName) && '' !== $mItem) + { + if (null === $this->aFetchCallbacks) + { + $this->aFetchCallbacks = array(); + } + + $this->aFetchCallbacks[$sName] = $mItem; + } + } + + $this->SendRequest((($bIndexIsUid) ? 'UID ' : '').'FETCH', array($sIndexRange, \array_keys($aFetchItems))); + $aResult = $this->validateResponse($this->parseResponse()); + $this->aFetchCallbacks = null; + + $aReturn = array(); + $oImapResponse = null; + foreach ($aResult as $oImapResponse) + { + if (FetchResponse::IsValidFetchImapResponse($oImapResponse)) + { + if (FetchResponse::IsNotEmptyFetchImapResponse($oImapResponse)) + { + $aReturn[] = FetchResponse::NewInstance($oImapResponse); + } + else + { + if ($this->oLogger) + { + $this->oLogger->Write('Skipped Imap Response! ['.$oImapResponse->ToLine().']', \MailSo\Log\Enumerations\Type::NOTICE); + } + } + } + } + + return $aReturn; + } + + + /** + * @return array|false + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function Quota() + { + $aReturn = false; + if ($this->IsSupported('QUOTA')) + { + $this->SendRequest('GETQUOTAROOT "INBOX"'); + $aResult = $this->parseResponseWithValidation(); + + $aReturn = array(0, 0); + $oImapResponse = null; + foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) + { + if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType + && 'QUOTA' === $oImapResponse->StatusOrIndex + && \is_array($oImapResponse->ResponseList) + && isset($oImapResponse->ResponseList[3]) + && \is_array($oImapResponse->ResponseList[3]) + && 2 < \count($oImapResponse->ResponseList[3]) + && 'STORAGE' === \strtoupper($oImapResponse->ResponseList[3][0]) + && \is_numeric($oImapResponse->ResponseList[3][1]) + && \is_numeric($oImapResponse->ResponseList[3][2]) + ) + { + $aReturn = array( + (int) $oImapResponse->ResponseList[3][1], + (int) $oImapResponse->ResponseList[3][2], + 0, + 0 + ); + + if (5 < \count($oImapResponse->ResponseList[3]) + && 'MESSAGE' === \strtoupper($oImapResponse->ResponseList[3][3]) + && \is_numeric($oImapResponse->ResponseList[3][4]) + && \is_numeric($oImapResponse->ResponseList[3][5]) + ) + { + $aReturn[2] = (int) $oImapResponse->ResponseList[3][4]; + $aReturn[3] = (int) $oImapResponse->ResponseList[3][5]; + } + } + } + } + + return $aReturn; + } + + /** + * @param array $aSortTypes + * @param string $sSearchCriterias + * @param bool $bReturnUid + * + * @return array + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function MessageSimpleSort($aSortTypes, $sSearchCriterias = 'ALL', $bReturnUid = true) + { + $sCommandPrefix = ($bReturnUid) ? 'UID ' : ''; + $sSearchCriterias = !\MailSo\Base\Validator::NotEmptyString($sSearchCriterias, true) || '*' === $sSearchCriterias + ? 'ALL' : $sSearchCriterias; + + if (!\is_array($aSortTypes) || 0 === \count($aSortTypes)) + { + $this->writeLogException( + new \MailSo\Base\Exceptions\InvalidArgumentException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + else if (!$this->IsSupported('SORT')) + { + $this->writeLogException( + new \MailSo\Base\Exceptions\InvalidArgumentException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + $aRequest = array(); + $aRequest[] = $aSortTypes; + $aRequest[] = \MailSo\Base\Utils::IsAscii($sSearchCriterias) ? 'US-ASCII' : 'UTF-8'; + $aRequest[] = $sSearchCriterias; + + $sCmd = 'SORT'; + + $this->SendRequest($sCommandPrefix.$sCmd, $aRequest); + $aResult = $this->parseResponseWithValidation(); + + $aReturn = array(); + $oImapResponse = null; + foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) + { + if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType + && ($sCmd === $oImapResponse->StatusOrIndex || + ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex) && !empty($oImapResponse->ResponseList[2]) && + $sCmd === $oImapResponse->ResponseList[2]) + && \is_array($oImapResponse->ResponseList) + && 2 < \count($oImapResponse->ResponseList)) + { + $iStart = 2; + if ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex && + !empty($oImapResponse->ResponseList[2]) && + $sCmd === $oImapResponse->ResponseList[2]) + { + $iStart = 3; + } + + for ($iIndex = $iStart, $iLen = \count($oImapResponse->ResponseList); $iIndex < $iLen; $iIndex++) + { + $aReturn[] = (int) $oImapResponse->ResponseList[$iIndex]; + } + } + } + + return $aReturn; + } + + /** + * @param bool $bSort = false + * @param string $sSearchCriterias = 'ALL' + * @param array $aSearchOrSortReturn = null + * @param bool $bReturnUid = true + * @param string $sLimit = '' + * @param string $sCharset = '' + * @param array $aSortTypes = null + * + * @return array + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + private function simpleESearchOrESortHelper($bSort = false, $sSearchCriterias = 'ALL', $aSearchOrSortReturn = null, $bReturnUid = true, $sLimit = '', $sCharset = '', $aSortTypes = null) + { + $sCommandPrefix = ($bReturnUid) ? 'UID ' : ''; + $sSearchCriterias = 0 === \strlen($sSearchCriterias) || '*' === $sSearchCriterias + ? 'ALL' : $sSearchCriterias; + + $sCmd = $bSort ? 'SORT': 'SEARCH'; + if ($bSort && (!\is_array($aSortTypes) || 0 === \count($aSortTypes) || !$this->IsSupported('SORT'))) + { + $this->writeLogException( + new \MailSo\Base\Exceptions\InvalidArgumentException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + if (!$this->IsSupported($bSort ? 'ESORT' : 'ESEARCH')) + { + $this->writeLogException( + new \MailSo\Base\Exceptions\InvalidArgumentException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + if (!\is_array($aSearchOrSortReturn) || 0 === \count($aSearchOrSortReturn)) + { + $aSearchOrSortReturn = array('ALL'); + } + + $aRequest = array(); + if ($bSort) + { + $aRequest[] = 'RETURN'; + $aRequest[] = $aSearchOrSortReturn; + + $aRequest[] = $aSortTypes; + $aRequest[] = \MailSo\Base\Utils::IsAscii($sSearchCriterias) ? 'US-ASCII' : 'UTF-8'; + } + else + { + if (0 < \strlen($sCharset)) + { + $aRequest[] = 'CHARSET'; + $aRequest[] = \strtoupper($sCharset); + } + + $aRequest[] = 'RETURN'; + $aRequest[] = $aSearchOrSortReturn; + } + + $aRequest[] = $sSearchCriterias; + + if (0 < \strlen($sLimit)) + { + $aRequest[] = $sLimit; + } + + $this->SendRequest($sCommandPrefix.$sCmd, $aRequest); + $sRequestTag = $this->getCurrentTag(); + + $aResult = array(); + $aResponse = $this->parseResponseWithValidation(); + + if (\is_array($aResponse)) + { + $oImapResponse = null; + foreach ($aResponse as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) + { + if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType + && ('ESEARCH' === $oImapResponse->StatusOrIndex || 'ESORT' === $oImapResponse->StatusOrIndex) + && \is_array($oImapResponse->ResponseList) + && isset($oImapResponse->ResponseList[2], $oImapResponse->ResponseList[2][0], $oImapResponse->ResponseList[2][1]) + && 'TAG' === $oImapResponse->ResponseList[2][0] && $sRequestTag === $oImapResponse->ResponseList[2][1] + && (!$bReturnUid || ($bReturnUid && !empty($oImapResponse->ResponseList[3]) && 'UID' === $oImapResponse->ResponseList[3])) + ) + { + $iStart = 3; + foreach ($oImapResponse->ResponseList as $iIndex => $mItem) + { + if ($iIndex >= $iStart) + { + switch ($mItem) + { + case 'ALL': + case 'MAX': + case 'MIN': + case 'COUNT': + if (isset($oImapResponse->ResponseList[$iIndex + 1])) + { + $aResult[$mItem] = $oImapResponse->ResponseList[$iIndex + 1]; + } + break; + } + } + } + } + } + } + + return $aResult; + } + + /** + * @param string $sSearchCriterias = 'ALL' + * @param array $aSearchReturn = null + * @param bool $bReturnUid = true + * @param string $sLimit = '' + * @param string $sCharset = '' + * + * @return array + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function MessageSimpleESearch($sSearchCriterias = 'ALL', $aSearchReturn = null, $bReturnUid = true, $sLimit = '', $sCharset = '') + { + return $this->simpleESearchOrESortHelper(false, $sSearchCriterias, $aSearchReturn, $bReturnUid, $sLimit, $sCharset); + } + + /** + * @param array $aSortTypes + * @param string $sSearchCriterias = 'ALL' + * @param array $aSearchReturn = null + * @param bool $bReturnUid = true + * @param string $sLimit = '' + * + * @return array + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function MessageSimpleESort($aSortTypes, $sSearchCriterias = 'ALL', $aSearchReturn = null, $bReturnUid = true, $sLimit = '') + { + return $this->simpleESearchOrESortHelper(true, $sSearchCriterias, $aSearchReturn, $bReturnUid, $sLimit, '', $aSortTypes); + } + + /** + * @param array $aResult + * @return \MailSo\Imap\Response + */ + private function findLastResponse($aResult) + { + $oResult = null; + if (\is_array($aResult) && 0 < \count($aResult)) + { + $oResult = $aResult[\count($aResult) - 1]; + if (!($oResult instanceof \MailSo\Imap\Response)) + { + $oResult = null; + } + } + + return $oResult; + } + + /** + * @param string $sSearchCriterias + * @param bool $bReturnUid = true + * @param string $sCharset = '' + * + * @return array + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function MessageSimpleSearch($sSearchCriterias = 'ALL', $bReturnUid = true, $sCharset = '') + { + $sCommandPrefix = ($bReturnUid) ? 'UID ' : ''; + $sSearchCriterias = 0 === \strlen($sSearchCriterias) || '*' === $sSearchCriterias + ? 'ALL' : $sSearchCriterias; + + $aRequest = array(); + if (0 < \strlen($sCharset)) + { + $aRequest[] = 'CHARSET'; + $aRequest[] = \strtoupper($sCharset); + } + + $aRequest[] = $sSearchCriterias; + + $sCmd = 'SEARCH'; + + $sCont = $this->SendRequest($sCommandPrefix.$sCmd, $aRequest, true); + if ('' !== $sCont) + { + $aResult = $this->parseResponseWithValidation(); + $oItem = $this->findLastResponse($aResult); + + if ($oItem && \MailSo\Imap\Enumerations\ResponseType::CONTINUATION === $oItem->ResponseType) + { + $aParts = explode("\r\n", $sCont); + foreach ($aParts as $sLine) + { + $this->sendRaw($sLine); + + $aResult = $this->parseResponseWithValidation(); + $oItem = $this->findLastResponse($aResult); + if ($oItem && \MailSo\Imap\Enumerations\ResponseType::CONTINUATION === $oItem->ResponseType) + { + continue; + } + } + } + } + else + { + $aResult = $this->parseResponseWithValidation(); + } + + $aReturn = array(); + $oImapResponse = null; + foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) + { + if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType + && ($sCmd === $oImapResponse->StatusOrIndex || + ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex) && !empty($oImapResponse->ResponseList[2]) && + $sCmd === $oImapResponse->ResponseList[2]) + && \is_array($oImapResponse->ResponseList) + && 2 < count($oImapResponse->ResponseList)) + { + $iStart = 2; + if ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex && + !empty($oImapResponse->ResponseList[2]) && + $sCmd === $oImapResponse->ResponseList[2]) + { + $iStart = 3; + } + + for ($iIndex = $iStart, $iLen = \count($oImapResponse->ResponseList); $iIndex < $iLen; $iIndex++) + { + $aReturn[] = (int) $oImapResponse->ResponseList[$iIndex]; + } + } + } + + $aReturn = \array_reverse($aReturn); + return $aReturn; + } + + /** + * @param mixed $aValue + * + * @return mixed + */ + private function validateThreadItem($aValue) + { + $mResult = false; + if (\is_numeric($aValue)) + { + $mResult = (int) $aValue; + if (0 >= $mResult) + { + $mResult = false; + } + } + else if (\is_array($aValue)) + { + if (1 === \count($aValue) && \is_numeric($aValue[0])) + { + $mResult = (int) $aValue[0]; + if (0 >= $mResult) + { + $mResult = false; + } + } + else + { + $mResult = array(); + foreach ($aValue as $aValueItem) + { + $mTemp = $this->validateThreadItem($aValueItem); + if (false !== $mTemp) + { + $mResult[] = $mTemp; + } + } + } + } + + return $mResult; + } + + /** + * @param string $sSearchCriterias = 'ALL' + * @param bool $bReturnUid = true + * @param string $sCharset = \MailSo\Base\Enumerations\Charset::UTF_8 + * + * @return array + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function MessageSimpleThread($sSearchCriterias = 'ALL', $bReturnUid = true, $sCharset = \MailSo\Base\Enumerations\Charset::UTF_8) + { + $sCommandPrefix = ($bReturnUid) ? 'UID ' : ''; + $sSearchCriterias = !\MailSo\Base\Validator::NotEmptyString($sSearchCriterias, true) || '*' === $sSearchCriterias + ? 'ALL' : $sSearchCriterias; + + $sThreadType = ''; + switch (true) + { + case $this->IsSupported('THREAD=REFS'): + $sThreadType = 'REFS'; + break; + case $this->IsSupported('THREAD=REFERENCES'): + $sThreadType = 'REFERENCES'; + break; + case $this->IsSupported('THREAD=ORDEREDSUBJECT'): + $sThreadType = 'ORDEREDSUBJECT'; + break; + default: + $this->writeLogException( + new Exceptions\RuntimeException('Thread is not supported'), + \MailSo\Log\Enumerations\Type::ERROR, true); + break; + } + + $aRequest = array(); + $aRequest[] = $sThreadType; + $aRequest[] = \strtoupper($sCharset); + $aRequest[] = $sSearchCriterias; + + $sCmd = 'THREAD'; + + $this->SendRequest($sCommandPrefix.$sCmd, $aRequest); + $aResult = $this->parseResponseWithValidation(); + + $aReturn = array(); + $oImapResponse = null; + + foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) + { + if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType + && ($sCmd === $oImapResponse->StatusOrIndex || + ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex) && !empty($oImapResponse->ResponseList[2]) && + $sCmd === $oImapResponse->ResponseList[2]) + && \is_array($oImapResponse->ResponseList) + && 2 < \count($oImapResponse->ResponseList)) + { + $iStart = 2; + if ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex && + !empty($oImapResponse->ResponseList[2]) && + $sCmd === $oImapResponse->ResponseList[2]) + { + $iStart = 3; + } + + for ($iIndex = $iStart, $iLen = \count($oImapResponse->ResponseList); $iIndex < $iLen; $iIndex++) + { + $aNewValue = $this->validateThreadItem($oImapResponse->ResponseList[$iIndex]); + if (false !== $aNewValue) + { + $aReturn[] = $aNewValue; + } + } + } + } + + return $aReturn; + } + + /** + * @param string $sToFolder + * @param string $sIndexRange + * @param bool $bIndexIsUid + * + * @return \MailSo\Imap\ImapClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function MessageCopy($sToFolder, $sIndexRange, $bIndexIsUid) + { + if (0 === \strlen($sIndexRange)) + { + $this->writeLogException( + new \MailSo\Base\Exceptions\InvalidArgumentException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + $sCommandPrefix = ($bIndexIsUid) ? 'UID ' : ''; + return $this->SendRequestWithCheck($sCommandPrefix.'COPY', + array($sIndexRange, $this->EscapeString($sToFolder))); + } + + /** + * @param string $sToFolder + * @param string $sIndexRange + * @param bool $bIndexIsUid + * + * @return \MailSo\Imap\ImapClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function MessageMove($sToFolder, $sIndexRange, $bIndexIsUid) + { + if (0 === \strlen($sIndexRange)) + { + $this->writeLogException( + new \MailSo\Base\Exceptions\InvalidArgumentException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + if (!$this->IsSupported('MOVE')) + { + $this->writeLogException( + new Exceptions\RuntimeException('Move is not supported'), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + $sCommandPrefix = ($bIndexIsUid) ? 'UID ' : ''; + return $this->SendRequestWithCheck($sCommandPrefix.'MOVE', + array($sIndexRange, $this->EscapeString($sToFolder))); + } + + /** + * @param string $sUidRangeIfSupported = '' + * @param bool $bForceUidExpunge = false + * @param bool $bExpungeAll = false + * + * @return \MailSo\Imap\ImapClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function MessageExpunge($sUidRangeIfSupported = '', $bForceUidExpunge = false, $bExpungeAll = false) + { + $sUidRangeIfSupported = \trim($sUidRangeIfSupported); + + $sCmd = 'EXPUNGE'; + $aArguments = array(); + + if (!$bExpungeAll && $bForceUidExpunge && 0 < \strlen($sUidRangeIfSupported) && $this->IsSupported('UIDPLUS')) + { + $sCmd = 'UID '.$sCmd; + $aArguments = array($sUidRangeIfSupported); + } + + return $this->SendRequestWithCheck($sCmd, $aArguments); + } + + /** + * @param string $sIndexRange + * @param bool $bIndexIsUid + * @param array $aInputStoreItems + * @param string $sStoreAction + * + * @return \MailSo\Imap\ImapClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function MessageStoreFlag($sIndexRange, $bIndexIsUid, $aInputStoreItems, $sStoreAction) + { + if (!\MailSo\Base\Validator::NotEmptyString($sIndexRange, true) || + !\MailSo\Base\Validator::NotEmptyString($sStoreAction, true) || + 0 === \count($aInputStoreItems)) + { + return false; + } + + $sCmd = ($bIndexIsUid) ? 'UID STORE' : 'STORE'; + return $this->SendRequestWithCheck($sCmd, array($sIndexRange, $sStoreAction, $aInputStoreItems)); + } + + /** + * @param string $sFolderName + * @param resource $rMessageAppendStream + * @param int $iStreamSize + * @param array $aAppendFlags = null + * @param int $iUid = null + * @param int $sDateTime = 0 + * + * @return \MailSo\Imap\ImapClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function MessageAppendStream($sFolderName, $rMessageAppendStream, $iStreamSize, $aAppendFlags = null, &$iUid = null, $sDateTime = 0) + { + $aData = array($this->EscapeString($sFolderName), $aAppendFlags); + if (0 < $sDateTime) + { + $aData[] = $this->EscapeString(\gmdate('d-M-Y H:i:s', $sDateTime).' +0000'); + } + + $aData[] = '{'.$iStreamSize.'}'; + + $this->SendRequest('APPEND', $aData); + $this->parseResponseWithValidation(); + + $this->writeLog('Write to connection stream', \MailSo\Log\Enumerations\Type::NOTE); + + \MailSo\Base\Utils::MultipleStreamWriter($rMessageAppendStream, array($this->rConnect)); + + $this->sendRaw(''); + $this->parseResponseWithValidation(); + + if (null !== $iUid) + { + $aLastResponse = $this->GetLastResponse(); + if (\is_array($aLastResponse) && 0 < \count($aLastResponse) && $aLastResponse[\count($aLastResponse) - 1]) + { + $oLast = $aLastResponse[count($aLastResponse) - 1]; + if ($oLast && \MailSo\Imap\Enumerations\ResponseType::TAGGED === $oLast->ResponseType && \is_array($oLast->OptionalResponse)) + { + if (0 < \strlen($oLast->OptionalResponse[0]) && + 0 < \strlen($oLast->OptionalResponse[2]) && + 'APPENDUID' === strtoupper($oLast->OptionalResponse[0]) && + \is_numeric($oLast->OptionalResponse[2]) + ) + { + $iUid = (int) $oLast->OptionalResponse[2]; + } + } + } + } + + return $this; + } + + /** + * @return \MailSo\Imap\FolderInformation + */ + public function FolderCurrentInformation() + { + return $this->oCurrentFolderInfo; + } + + /** + * @param string $sCommand + * @param array $aParams = array() + * @param bool $bBreakOnLiteral = false + * + * @return string + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + */ + public function SendRequest($sCommand, $aParams = array(), $bBreakOnLiteral = false) + { + if (!\MailSo\Base\Validator::NotEmptyString($sCommand, true) || !\is_array($aParams)) + { + $this->writeLogException( + new \MailSo\Base\Exceptions\InvalidArgumentException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + $this->IsConnected(true); + + $sTag = $this->getNewTag(); + + $sCommand = \trim($sCommand); + $sRealCommand = $sTag.' '.$sCommand.$this->prepearParamLine($aParams); + + $sFakeCommand = ''; + $aFakeParams = $this->secureRequestParams($sCommand, $aParams); + if (null !== $aFakeParams) + { + $sFakeCommand = $sTag.' '.$sCommand.$this->prepearParamLine($aFakeParams); + } + + $this->aTagTimeouts[$sTag] = \microtime(true); + + if ($bBreakOnLiteral && !\preg_match('/\d\+\}\r\n/', $sRealCommand)) + { + $iPos = \strpos($sRealCommand, "}\r\n"); + if (false !== $iPos) + { + $iFakePos = \strpos($sFakeCommand, "}\r\n"); + + $this->sendRaw(\substr($sRealCommand, 0, $iPos + 1), true, + false !== $iFakePos ? \substr($sFakeCommand, 0, $iFakePos + 3) : ''); + + return \substr($sRealCommand, $iPos + 3); + } + } + + $this->sendRaw($sRealCommand, true, $sFakeCommand); + return ''; + } + + /** + * @param string $sCommand + * @param array $aParams + * + * @return array|null + */ + private function secureRequestParams($sCommand, $aParams) + { + $aResult = null; + switch ($sCommand) + { + case 'LOGIN': + $aResult = $aParams; + if (\is_array($aResult) && 2 === count($aResult)) + { + $aResult[1] = '"********"'; + } + break; + } + + return $aResult; + } + + /** + * @param string $sCommand + * @param array $aParams = array() + * @param bool $bFindCapa = false + * + * @return \MailSo\Imap\ImapClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function SendRequestWithCheck($sCommand, $aParams = array(), $bFindCapa = false) + { + $this->SendRequest($sCommand, $aParams); + $this->parseResponseWithValidation(null, $bFindCapa); + + return $this; + } + + /** + * @return array + */ + public function GetLastResponse() + { + return $this->aLastResponse; + } + + /** + * @param mixed $aResult + * + * @return array + * + * @throws \MailSo\Imap\Exceptions\ResponseNotFoundException + * @throws \MailSo\Imap\Exceptions\InvalidResponseException + * @throws \MailSo\Imap\Exceptions\NegativeResponseException + */ + private function validateResponse($aResult) + { + if (!\is_array($aResult) || 0 === $iCnt = \count($aResult)) + { + $this->writeLogException( + new Exceptions\ResponseNotFoundException(), + \MailSo\Log\Enumerations\Type::WARNING, true); + } + + if ($aResult[$iCnt - 1]->ResponseType !== \MailSo\Imap\Enumerations\ResponseType::CONTINUATION) + { + if (!$aResult[$iCnt - 1]->IsStatusResponse) + { + $this->writeLogException( + new Exceptions\InvalidResponseException($aResult), + \MailSo\Log\Enumerations\Type::WARNING, true); + } + + if (\MailSo\Imap\Enumerations\ResponseStatus::OK !== $aResult[$iCnt - 1]->StatusOrIndex) + { + $this->writeLogException( + new Exceptions\NegativeResponseException($aResult), + \MailSo\Log\Enumerations\Type::WARNING, true); + } + } + + return $aResult; + } + + /** + * @param string $sEndTag = null + * @param bool $bFindCapa = false + * + * @return array|bool + */ + protected function parseResponse($sEndTag = null, $bFindCapa = false) + { + if (\is_resource($this->rConnect)) + { + $oImapResponse = null; + $sEndTag = (null === $sEndTag) ? $this->getCurrentTag() : $sEndTag; + + while (true) + { + $oImapResponse = Response::NewInstance(); + + $this->partialParseResponseBranch($oImapResponse); + + if ($oImapResponse) + { + if (\MailSo\Imap\Enumerations\ResponseType::UNKNOWN === $oImapResponse->ResponseType) + { + return false; + } + + if ($bFindCapa) + { + $this->initCapabilityImapResponse($oImapResponse); + } + + $this->aPartialResponses[] = $oImapResponse; + if ($sEndTag === $oImapResponse->Tag || \MailSo\Imap\Enumerations\ResponseType::CONTINUATION === $oImapResponse->ResponseType) + { + if (isset($this->aTagTimeouts[$sEndTag])) + { + $this->writeLog((\microtime(true) - $this->aTagTimeouts[$sEndTag]).' ('.$sEndTag.')', + \MailSo\Log\Enumerations\Type::TIME); + + unset($this->aTagTimeouts[$sEndTag]); + } + + break; + } + } + else + { + return false; + } + + unset($oImapResponse); + } + } + + $this->iResponseBufParsedPos = 0; + $this->aLastResponse = $this->aPartialResponses; + $this->aPartialResponses = array(); + + return $this->aLastResponse; + } + + /** + * @param string $sEndTag = null + * @param bool $bFindCapa = false + * + * @return array + */ + private function parseResponseWithValidation($sEndTag = null, $bFindCapa = false) + { + return $this->validateResponse($this->parseResponse($sEndTag, $bFindCapa)); + } + + /** + * @param \MailSo\Imap\Response $oImapResponse + * + * @return void + */ + private function initCapabilityImapResponse($oImapResponse) + { + if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType + && \is_array($oImapResponse->ResponseList)) + { + $aList = null; + if (isset($oImapResponse->ResponseList[1]) && \is_string($oImapResponse->ResponseList[1]) && + 'CAPABILITY' === \strtoupper($oImapResponse->ResponseList[1])) + { + $aList = \array_slice($oImapResponse->ResponseList, 2); + } + else if ($oImapResponse->OptionalResponse && \is_array($oImapResponse->OptionalResponse) && + 1 < \count($oImapResponse->OptionalResponse) && \is_string($oImapResponse->OptionalResponse[0]) && + 'CAPABILITY' === \strtoupper($oImapResponse->OptionalResponse[0])) + { + $aList = \array_slice($oImapResponse->OptionalResponse, 1); + } + + if (\is_array($aList) && 0 < \count($aList)) + { + $this->aCapabilityItems = \array_map('strtoupper', $aList); + } + } + } + + /** + * @return array|string + * + * @throws \MailSo\Net\Exceptions\Exception + */ + private function partialParseResponseBranch(&$oImapResponse, $iStackIndex = -1, + $bTreatAsAtom = false, $sParentToken = '', $sOpenBracket = '') + { + $mNull = null; + + $iStackIndex++; + $iPos = $this->iResponseBufParsedPos; + + $sPreviousAtomUpperCase = null; + $bIsEndOfList = false; + $bIsClosingBracketSquare = false; + $iLiteralLen = 0; + $iBufferEndIndex = 0; + $iDebugCount = 0; + + $rImapLiteralStream = null; + + $bIsGotoDefault = false; + $bIsGotoLiteral = false; + $bIsGotoLiteralEnd = false; + $bIsGotoAtomBracket = false; + $bIsGotoNotAtomBracket = false; + + $bCountOneInited = false; + $bCountTwoInited = false; + + $sAtomBuilder = $bTreatAsAtom ? '' : null; + $aList = array(); + if (null !== $oImapResponse) + { + $aList =& $oImapResponse->ResponseList; + } + + while (!$bIsEndOfList) + { + $iDebugCount++; + if (100000 === $iDebugCount) + { + $this->Logger()->Write('PartialParseOver: '.$iDebugCount, \MailSo\Log\Enumerations\Type::ERROR); + } + + if ($this->bNeedNext) + { + $iPos = 0; + $this->getNextBuffer(); + $this->iResponseBufParsedPos = $iPos; + $this->bNeedNext = false; + } + + $sChar = null; + if ($bIsGotoDefault) + { + $sChar = 'GOTO_DEFAULT'; + $bIsGotoDefault = false; + } + else if ($bIsGotoLiteral) + { + $bIsGotoLiteral = false; + $bIsGotoLiteralEnd = true; + + if ($this->partialResponseLiteralCallbackCallable( + $sParentToken, null === $sPreviousAtomUpperCase ? '' : \strtoupper($sPreviousAtomUpperCase), $this->rConnect, $iLiteralLen)) + { + if (!$bTreatAsAtom) + { + $aList[] = ''; + } + } + else + { + $sLiteral = ''; + $iRead = $iLiteralLen; + + while (0 < $iRead) + { + $sAddRead = \fread($this->rConnect, $iRead); + if (false === $sAddRead) + { + $sLiteral = false; + break; + } + + $sLiteral .= $sAddRead; + $iRead -= \strlen($sAddRead); + + \MailSo\Base\Utils::ResetTimeLimit(); + } + + if (false !== $sLiteral) + { + $iLiteralSize = \strlen($sLiteral); + \MailSo\Base\Loader::IncStatistic('NetRead', $iLiteralSize); + if ($iLiteralLen !== $iLiteralSize) + { + $this->writeLog('Literal stream read warning "read '.$iLiteralSize.' of '. + $iLiteralLen.'" bytes', \MailSo\Log\Enumerations\Type::WARNING); + } + + if (!$bTreatAsAtom) + { + $aList[] = $sLiteral; + + if (\MailSo\Config::$LogSimpleLiterals) + { + $this->writeLog('{'.\strlen($sLiteral).'} '.$sLiteral, \MailSo\Log\Enumerations\Type::INFO); + } + } + } + else + { + $this->writeLog('Can\'t read imap stream', \MailSo\Log\Enumerations\Type::NOTE); + } + + unset($sLiteral); + } + + continue; + } + else if ($bIsGotoLiteralEnd) + { + $rImapLiteralStream = null; + $sPreviousAtomUpperCase = null; + $this->bNeedNext = true; + $bIsGotoLiteralEnd = false; + + continue; + } + else if ($bIsGotoAtomBracket) + { + if ($bTreatAsAtom) + { + $sAtomBlock = $this->partialParseResponseBranch($mNull, $iStackIndex, true, + null === $sPreviousAtomUpperCase ? '' : \strtoupper($sPreviousAtomUpperCase), $sOpenBracket); + + $sAtomBuilder .= $sAtomBlock; + $iPos = $this->iResponseBufParsedPos; + $sAtomBuilder .= ($bIsClosingBracketSquare) ? ']' : ')'; + } + + $sPreviousAtomUpperCase = null; + $bIsGotoAtomBracket = false; + + continue; + } + else if ($bIsGotoNotAtomBracket) + { + $aSubItems = $this->partialParseResponseBranch($mNull, $iStackIndex, false, + null === $sPreviousAtomUpperCase ? '' : \strtoupper($sPreviousAtomUpperCase), $sOpenBracket); + + $aList[] = $aSubItems; + $iPos = $this->iResponseBufParsedPos; + $sPreviousAtomUpperCase = null; + if (null !== $oImapResponse && $oImapResponse->IsStatusResponse) + { + $oImapResponse->OptionalResponse = $aSubItems; + + $bIsGotoDefault = true; + $bIsGotoNotAtomBracket = false; + continue; + } + $bIsGotoNotAtomBracket = false; + + continue; + } + else + { + $iBufferEndIndex = \strlen($this->sResponseBuffer) - 3; + $this->bResponseBufferChanged = false; + + if ($iPos > $iBufferEndIndex) + { + break; + } + + $sChar = $this->sResponseBuffer[$iPos]; + } + + switch (true) + { + case ']' === $sChar: + $iPos++; + $sPreviousAtomUpperCase = null; + $bIsEndOfList = true; + break; + case ')' === $sChar: + $iPos++; + $sPreviousAtomUpperCase = null; + $bIsEndOfList = true; + break; + case ' ' === $sChar: + if ($bTreatAsAtom) + { + $sAtomBuilder .= ' '; + } + $iPos++; + break; + case '[' === $sChar: + $bIsClosingBracketSquare = true; + case '(' === $sChar: + if ('(' === $sChar) + { + $bIsClosingBracketSquare = false; + } + + if ($bTreatAsAtom) + { + $sAtomBuilder .= $bIsClosingBracketSquare ? '[' : '('; + } + $iPos++; + + $this->iResponseBufParsedPos = $iPos; + if ($bTreatAsAtom) + { + $bIsGotoAtomBracket = true; + $sOpenBracket = $bIsClosingBracketSquare ? '[' : '('; + } + else + { + $bIsGotoNotAtomBracket = true; + $sOpenBracket = $bIsClosingBracketSquare ? '[' : '('; + } + break; + case '{' === $sChar: + $bIsLiteralParsed = false; + $mLiteralEndPos = \strpos($this->sResponseBuffer, '}', $iPos); + if (false !== $mLiteralEndPos && $mLiteralEndPos > $iPos) + { + $sLiteralLenAsString = \substr($this->sResponseBuffer, $iPos + 1, $mLiteralEndPos - $iPos - 1); + if (\is_numeric($sLiteralLenAsString)) + { + $iLiteralLen = (int) $sLiteralLenAsString; + $bIsLiteralParsed = true; + $iPos = $mLiteralEndPos + 3; + $bIsGotoLiteral = true; + break; + } + } + if (!$bIsLiteralParsed) + { + $iPos = $iBufferEndIndex; + } + $sPreviousAtomUpperCase = null; + break; + case '"' === $sChar: + $bIsQuotedParsed = false; + while (true) + { + $iClosingPos = $iPos + 1; + if ($iClosingPos > $iBufferEndIndex) + { + break; + } + + while (true) + { + $iClosingPos = \strpos($this->sResponseBuffer, '"', $iClosingPos); + if (false === $iClosingPos) + { + break; + } + + // TODO + $iClosingPosNext = $iClosingPos + 1; + if ( + isset($this->sResponseBuffer[$iClosingPosNext]) && + ' ' !== $this->sResponseBuffer[$iClosingPosNext] && + "\r" !== $this->sResponseBuffer[$iClosingPosNext] && + "\n" !== $this->sResponseBuffer[$iClosingPosNext] && + ']' !== $this->sResponseBuffer[$iClosingPosNext] && + ')' !== $this->sResponseBuffer[$iClosingPosNext] + ) + { + $iClosingPos++; + continue; + } + + $iSlashCount = 0; + while ('\\' === $this->sResponseBuffer[$iClosingPos - $iSlashCount - 1]) + { + $iSlashCount++; + } + + if ($iSlashCount % 2 == 1) + { + $iClosingPos++; + continue; + } + else + { + break; + } + } + + if (false === $iClosingPos) + { + break; + } + else + { +// $iSkipClosingPos = 0; + $bIsQuotedParsed = true; + if ($bTreatAsAtom) + { + $sAtomBuilder .= \strtr( + \substr($this->sResponseBuffer, $iPos, $iClosingPos - $iPos + 1), + array('\\\\' => '\\', '\\"' => '"') + ); + } + else + { + $aList[] = \strtr( + \substr($this->sResponseBuffer, $iPos + 1, $iClosingPos - $iPos - 1), + array('\\\\' => '\\', '\\"' => '"') + ); + } + + $iPos = $iClosingPos + 1; + break; + } + } + + if (!$bIsQuotedParsed) + { + $iPos = $iBufferEndIndex; + } + + $sPreviousAtomUpperCase = null; + break; + + case 'GOTO_DEFAULT' === $sChar: + default: + $iCharBlockStartPos = $iPos; + + if (null !== $oImapResponse && $oImapResponse->IsStatusResponse) + { + $iPos = $iBufferEndIndex; + + while ($iPos > $iCharBlockStartPos && $this->sResponseBuffer[$iCharBlockStartPos] === ' ') + { + $iCharBlockStartPos++; + } + } + + $bIsAtomDone = false; + while (!$bIsAtomDone && ($iPos <= $iBufferEndIndex)) + { + $sCharDef = $this->sResponseBuffer[$iPos]; + switch (true) + { + case '[' === $sCharDef: + if (null === $sAtomBuilder) + { + $sAtomBuilder = ''; + } + + $sAtomBuilder .= \substr($this->sResponseBuffer, $iCharBlockStartPos, $iPos - $iCharBlockStartPos + 1); + + $iPos++; + $this->iResponseBufParsedPos = $iPos; + + $sListBlock = $this->partialParseResponseBranch($mNull, $iStackIndex, true, + null === $sPreviousAtomUpperCase ? '' : \strtoupper($sPreviousAtomUpperCase), '['); + + if (null !== $sListBlock) + { + $sAtomBuilder .= $sListBlock.']'; + } + + $iPos = $this->iResponseBufParsedPos; + $iCharBlockStartPos = $iPos; + break; + case ' ' === $sCharDef: + case ')' === $sCharDef && '(' === $sOpenBracket: + case ']' === $sCharDef && '[' === $sOpenBracket: + $bIsAtomDone = true; + break; + default: + $iPos++; + break; + } + } + + if ($iPos > $iCharBlockStartPos || null !== $sAtomBuilder) + { + $sLastCharBlock = \substr($this->sResponseBuffer, $iCharBlockStartPos, $iPos - $iCharBlockStartPos); + if (null === $sAtomBuilder) + { + $aList[] = $sLastCharBlock; + $sPreviousAtomUpperCase = $sLastCharBlock; + } + else + { + $sAtomBuilder .= $sLastCharBlock; + + if (!$bTreatAsAtom) + { + $aList[] = $sAtomBuilder; + $sPreviousAtomUpperCase = $sAtomBuilder; + $sAtomBuilder = null; + } + } + + if (null !== $oImapResponse) + { +// if (1 === \count($aList)) + if (!$bCountOneInited && 1 === \count($aList)) +// if (isset($aList[0]) && !isset($aList[1])) // fast 1 === \count($aList) + { + $bCountOneInited = true; + + $oImapResponse->Tag = $aList[0]; + if ('+' === $oImapResponse->Tag) + { + $oImapResponse->ResponseType = \MailSo\Imap\Enumerations\ResponseType::CONTINUATION; + } + else if ('*' === $oImapResponse->Tag) + { + $oImapResponse->ResponseType = \MailSo\Imap\Enumerations\ResponseType::UNTAGGED; + } + else if ($this->getCurrentTag() === $oImapResponse->Tag) + { + $oImapResponse->ResponseType = \MailSo\Imap\Enumerations\ResponseType::TAGGED; + } + else + { + $oImapResponse->ResponseType = \MailSo\Imap\Enumerations\ResponseType::UNKNOWN; + } + } +// else if (2 === \count($aList)) + else if (!$bCountTwoInited && 2 === \count($aList)) +// else if (isset($aList[1]) && !isset($aList[2])) // fast 2 === \count($aList) + { + $bCountTwoInited = true; + + $oImapResponse->StatusOrIndex = strtoupper($aList[1]); + + if ($oImapResponse->StatusOrIndex == \MailSo\Imap\Enumerations\ResponseStatus::OK || + $oImapResponse->StatusOrIndex == \MailSo\Imap\Enumerations\ResponseStatus::NO || + $oImapResponse->StatusOrIndex == \MailSo\Imap\Enumerations\ResponseStatus::BAD || + $oImapResponse->StatusOrIndex == \MailSo\Imap\Enumerations\ResponseStatus::BYE || + $oImapResponse->StatusOrIndex == \MailSo\Imap\Enumerations\ResponseStatus::PREAUTH) + { + $oImapResponse->IsStatusResponse = true; + } + } + else if (\MailSo\Imap\Enumerations\ResponseType::CONTINUATION === $oImapResponse->ResponseType) + { + $oImapResponse->HumanReadable = $sLastCharBlock; + } + else if ($oImapResponse->IsStatusResponse) + { + $oImapResponse->HumanReadable = $sLastCharBlock; + } + } + } + } + } + + $this->iResponseBufParsedPos = $iPos; + if (null !== $oImapResponse) + { + $this->bNeedNext = true; + $this->iResponseBufParsedPos = 0; + } + + if (100000 < $iDebugCount) + { + $this->Logger()->Write('PartialParseOverResult: '.$iDebugCount, \MailSo\Log\Enumerations\Type::ERROR); + } + + return $bTreatAsAtom ? $sAtomBuilder : $aList; + } + + /** + * @param string $sParent + * @param string $sLiteralAtomUpperCase + * @param resource $rImapStream + * @param int $iLiteralLen + * + * @return bool + */ + private function partialResponseLiteralCallbackCallable($sParent, $sLiteralAtomUpperCase, $rImapStream, $iLiteralLen) + { + $sLiteralAtomUpperCasePeek = ''; + if (0 === \strpos($sLiteralAtomUpperCase, 'BODY')) + { + $sLiteralAtomUpperCasePeek = \str_replace('BODY', 'BODY.PEEK', $sLiteralAtomUpperCase); + } + + $sFetchKey = ''; + if (\is_array($this->aFetchCallbacks)) + { + if (0 < \strlen($sLiteralAtomUpperCasePeek) && isset($this->aFetchCallbacks[$sLiteralAtomUpperCasePeek])) + { + $sFetchKey = $sLiteralAtomUpperCasePeek; + } + else if (0 < \strlen($sLiteralAtomUpperCase) && isset($this->aFetchCallbacks[$sLiteralAtomUpperCase])) + { + $sFetchKey = $sLiteralAtomUpperCase; + } + } + + $bResult = false; + if (0 < \strlen($sFetchKey) && '' !== $this->aFetchCallbacks[$sFetchKey] && + \is_callable($this->aFetchCallbacks[$sFetchKey])) + { + $rImapLiteralStream = + \MailSo\Base\StreamWrappers\Literal::CreateStream($rImapStream, $iLiteralLen); + + $bResult = true; + $this->writeLog('Start Callback for '.$sParent.' / '.$sLiteralAtomUpperCase. + ' - try to read '.$iLiteralLen.' bytes.', \MailSo\Log\Enumerations\Type::NOTE); + + $this->bRunningCallback = true; + + try + { + \call_user_func($this->aFetchCallbacks[$sFetchKey], + $sParent, $sLiteralAtomUpperCase, $rImapLiteralStream); + } + catch (\Exception $oException) + { + $this->writeLog('Callback Exception', \MailSo\Log\Enumerations\Type::NOTICE); + $this->writeLogException($oException); + } + + if (\is_resource($rImapLiteralStream)) + { + $iNotReadLiteralLen = 0; + + $bFeof = \feof($rImapLiteralStream); + $this->writeLog('End Callback for '.$sParent.' / '.$sLiteralAtomUpperCase. + ' - feof = '.($bFeof ? 'good' : 'BAD'), $bFeof ? + \MailSo\Log\Enumerations\Type::NOTE : \MailSo\Log\Enumerations\Type::WARNING); + + if (!$bFeof) + { + while (!@\feof($rImapLiteralStream)) + { + $sBuf = @\fread($rImapLiteralStream, 1024 * 1024); + if (false === $sBuf || 0 === \strlen($sBuf) || null === $sBuf) + { + break; + } + + \MailSo\Base\Utils::ResetTimeLimit(); + $iNotReadLiteralLen += \strlen($sBuf); + } + + if (\is_resource($rImapLiteralStream) && !@\feof($rImapLiteralStream)) + { + @\stream_get_contents($rImapLiteralStream); + } + } + + if (\is_resource($rImapLiteralStream)) + { + @\fclose($rImapLiteralStream); + } + + if ($iNotReadLiteralLen > 0) + { + $this->writeLog('Not read literal size is '.$iNotReadLiteralLen.' bytes.', + \MailSo\Log\Enumerations\Type::WARNING); + } + } + else + { + $this->writeLog('Literal stream is not resource after callback.', + \MailSo\Log\Enumerations\Type::WARNING); + } + + \MailSo\Base\Loader::IncStatistic('NetRead', $iLiteralLen); + + $this->bRunningCallback = false; + } + + return $bResult; + } + + /** + * @param array $aParams = null + * + * @return string + */ + private function prepearParamLine($aParams = array()) + { + $sReturn = ''; + if (\is_array($aParams) && 0 < \count($aParams)) + { + foreach ($aParams as $mParamItem) + { + if (\is_array($mParamItem) && 0 < \count($mParamItem)) + { + $sReturn .= ' ('.\trim($this->prepearParamLine($mParamItem)).')'; + } + else if (\is_string($mParamItem)) + { + $sReturn .= ' '.$mParamItem; + } + } + } + return $sReturn; + } + + /** + * @return string + */ + private function getNewTag() + { + $this->iTagCount++; + return $this->getCurrentTag(); + } + + /** + * @return string + */ + private function getCurrentTag() + { + return self::TAG_PREFIX.$this->iTagCount; + } + + /** + * @param string $sStringForEscape + * + * @return string + */ + public function EscapeString($sStringForEscape) + { + return '"'.\str_replace(array('\\', '"'), array('\\\\', '\\"'), $sStringForEscape).'"'; + } + + /** + * @return string + */ + protected function getLogName() + { + return 'IMAP'; + } + + /** + * @param \MailSo\Log\Logger $oLogger + * + * @return \MailSo\Imap\ImapClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public function SetLogger($oLogger) + { + parent::SetLogger($oLogger); + + return $this; + } + + /** + * @param resource $rConnect + * @param array $aCapabilityItems = array() + * + * @return \MailSo\Imap\ImapClient + */ + public function TestSetValues($rConnect, $aCapabilityItems = array()) + { + $this->rConnect = $rConnect; + $this->aCapabilityItems = $aCapabilityItems; + + return $this; + } + + /** + * @param string $sEndTag = null + * @param string $bFindCapa = false + * + * @return array + */ + public function TestParseResponseWithValidationProxy($sEndTag = null, $bFindCapa = false) + { + return $this->parseResponseWithValidation($sEndTag, $bFindCapa); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/NamespaceResult.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/NamespaceResult.php new file mode 100755 index 00000000..f53bd74f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/NamespaceResult.php @@ -0,0 +1,132 @@ +sPersonal = ''; + $this->sPersonalDelimiter = ''; + $this->sOtherUser = ''; + $this->sOtherUserDelimiter = ''; + $this->sShared = ''; + $this->sSharedDelimiter = ''; + } + + /** + * @return \MailSo\Imap\NamespaceResult + */ + public static function NewInstance() + { + return new self(); + } + + /** + * @param \MailSo\Imap\Response $oImapResponse + * + * @return \MailSo\Imap\NamespaceResult + */ + public function InitByImapResponse($oImapResponse) + { + if ($oImapResponse && $oImapResponse instanceof \MailSo\Imap\Response) + { + if (isset($oImapResponse->ResponseList[2][0]) && + \is_array($oImapResponse->ResponseList[2][0]) && + 2 <= \count($oImapResponse->ResponseList[2][0])) + { + $this->sPersonal = $oImapResponse->ResponseList[2][0][0]; + $this->sPersonalDelimiter = $oImapResponse->ResponseList[2][0][1]; + + $this->sPersonal = 'INBOX'.$this->sPersonalDelimiter === \substr(\strtoupper($this->sPersonal), 0, 6) ? + 'INBOX'.$this->sPersonalDelimiter.\substr($this->sPersonal, 6) : $this->sPersonal; + } + + if (isset($oImapResponse->ResponseList[3][0]) && + \is_array($oImapResponse->ResponseList[3][0]) && + 2 <= \count($oImapResponse->ResponseList[3][0])) + { + $this->sOtherUser = $oImapResponse->ResponseList[3][0][0]; + $this->sOtherUserDelimiter = $oImapResponse->ResponseList[3][0][1]; + + $this->sOtherUser = 'INBOX'.$this->sOtherUserDelimiter === \substr(\strtoupper($this->sOtherUser), 0, 6) ? + 'INBOX'.$this->sOtherUserDelimiter.\substr($this->sOtherUser, 6) : $this->sOtherUser; + } + + if (isset($oImapResponse->ResponseList[4][0]) && + \is_array($oImapResponse->ResponseList[4][0]) && + 2 <= \count($oImapResponse->ResponseList[4][0])) + { + $this->sShared = $oImapResponse->ResponseList[4][0][0]; + $this->sSharedDelimiter = $oImapResponse->ResponseList[4][0][1]; + + $this->sShared = 'INBOX'.$this->sSharedDelimiter === \substr(\strtoupper($this->sShared), 0, 6) ? + 'INBOX'.$this->sSharedDelimiter.\substr($this->sShared, 6) : $this->sShared; + } + } + + return $this; + } + + /** + * @return string + */ + public function GetPersonalNamespace() + { + return $this->sPersonal; + } + + /** + * @return string + */ + public function GetPersonalNamespaceDelimiter() + { + return $this->sPersonalDelimiter; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Response.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Response.php new file mode 100755 index 00000000..fb787ba3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Response.php @@ -0,0 +1,104 @@ +ResponseList = array(); + $this->OptionalResponse = null; + $this->StatusOrIndex = ''; + $this->HumanReadable = ''; + $this->IsStatusResponse = false; + $this->ResponseType = \MailSo\Imap\Enumerations\ResponseType::UNKNOWN; + $this->Tag = ''; + } + + /** + * @return \MailSo\Imap\Response + */ + public static function NewInstance() + { + return new self(); + } + + /** + * @param string $aList + * + * @return string + */ + private function recToLine($aList) + { + $aResult = array(); + if (\is_array($aList)) + { + foreach ($aList as $mItem) + { + $aResult[] = \is_array($mItem) ? '('.$this->recToLine($mItem).')' : (string) $mItem; + } + } + + return \implode(' ', $aResult); + } + + + /** + * @return string + */ + public function ToLine() + { + return $this->recToLine($this->ResponseList); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/LICENSE b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/LICENSE new file mode 100755 index 00000000..6229c40e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Usenko Timur + +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. \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Driver.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Driver.php new file mode 100755 index 00000000..457b78c4 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Driver.php @@ -0,0 +1,408 @@ +sDatePattern = 'H:i:s'; + $this->sName = 'INFO'; + $this->sNewLine = "\r\n"; + $this->bTimePrefix = true; + $this->bTypedPrefix = true; + $this->bGuidPrefix = true; + + $this->sTimeOffset = '0'; + + $this->iWriteOnTimeoutOnly = 0; + $this->bWriteOnErrorOnly = false; + $this->bWriteOnPhpErrorOnly = false; + $this->bFlushCache = false; + $this->aCache = array(); + + $this->aPrefixes = array( + \MailSo\Log\Enumerations\Type::INFO => '[DATA]', + \MailSo\Log\Enumerations\Type::SECURE => '[SECURE]', + \MailSo\Log\Enumerations\Type::NOTE => '[NOTE]', + \MailSo\Log\Enumerations\Type::TIME => '[TIME]', + \MailSo\Log\Enumerations\Type::TIME_DELTA => '[TIME]', + \MailSo\Log\Enumerations\Type::MEMORY => '[MEMORY]', + \MailSo\Log\Enumerations\Type::NOTICE => '[NOTICE]', + \MailSo\Log\Enumerations\Type::WARNING => '[WARNING]', + \MailSo\Log\Enumerations\Type::ERROR => '[ERROR]', + + \MailSo\Log\Enumerations\Type::NOTICE_PHP => '[NOTICE]', + \MailSo\Log\Enumerations\Type::WARNING_PHP => '[WARNING]', + \MailSo\Log\Enumerations\Type::ERROR_PHP => '[ERROR]', + ); + } + + /** + * @param string $sTimeOffset + * + * @return \MailSo\Log\Driver + */ + public function SetTimeOffset($sTimeOffset) + { + $this->sTimeOffset = (string) $sTimeOffset; + return $this; + } + + /** + * @return \MailSo\Log\Driver + */ + public function DisableGuidPrefix() + { + $this->bGuidPrefix = false; + return $this; + } + + /** + * @return \MailSo\Log\Driver + */ + public function DisableTimePrefix() + { + $this->bTimePrefix = false; + return $this; + } + + /** + * @param bool $bValue + * + * @return \MailSo\Log\Driver + */ + public function WriteOnErrorOnly($bValue) + { + $this->bWriteOnErrorOnly = !!$bValue; + return $this; + } + + /** + * @param bool $bValue + * + * @return \MailSo\Log\Driver + */ + public function WriteOnPhpErrorOnly($bValue) + { + $this->bWriteOnPhpErrorOnly = !!$bValue; + return $this; + } + + /** + * @param int $iTimeout + * + * @return \MailSo\Log\Driver + */ + public function WriteOnTimeoutOnly($iTimeout) + { + $this->iWriteOnTimeoutOnly = (int) $iTimeout; + if (0 > $this->iWriteOnTimeoutOnly) + { + $this->iWriteOnTimeoutOnly = 0; + } + + return $this; + } + + /** + * @return \MailSo\Log\Driver + */ + public function DisableTypedPrefix() + { + $this->bTypedPrefix = false; + return $this; + } + + /** + * @param string|array $mDesc + * @return bool + */ + abstract protected function writeImplementation($mDesc); + + /** + * @return bool + */ + protected function writeEmptyLineImplementation() + { + return $this->writeImplementation(''); + } + + /** + * @param string $sTimePrefix + * @param string $sDesc + * @param int $iType = \MailSo\Log\Enumerations\Type::INFO + * @param array $sName = '' + * + * @return string + */ + protected function loggerLineImplementation($sTimePrefix, $sDesc, + $iType = \MailSo\Log\Enumerations\Type::INFO, $sName = '') + { + return \ltrim( + ($this->bTimePrefix ? '['.$sTimePrefix.']' : ''). + ($this->bGuidPrefix ? '['.\MailSo\Log\Logger::Guid().']' : ''). + ($this->bTypedPrefix ? ' '.$this->getTypedPrefix($iType, $sName) : '') + ).$sDesc; + } + + /** + * @return bool + */ + protected function clearImplementation() + { + return true; + } + + /** + * @return string + */ + protected function getTimeWithMicroSec() + { + $aMicroTimeItems = \explode(' ', \microtime()); + return \MailSo\Log\Logger::DateHelper($this->sDatePattern, $this->sTimeOffset, $aMicroTimeItems[1]).'.'. + \str_pad((int) ($aMicroTimeItems[0] * 1000), 3, '0', STR_PAD_LEFT); + } + + /** + * @param int $iType + * @param string $sName = '' + * + * @return string + */ + protected function getTypedPrefix($iType, $sName = '') + { + $sName = 0 < \strlen($sName) ? $sName : $this->sName; + return isset($this->aPrefixes[$iType]) ? $sName.$this->aPrefixes[$iType].': ' : ''; + } + + /** + * @param string|array $mDesc + * @param bool $bDiplayCrLf = false + * + * @return string + */ + protected function localWriteImplementation($mDesc, $bDiplayCrLf = false) + { + if ($bDiplayCrLf) + { + if (\is_array($mDesc)) + { + foreach ($mDesc as &$sLine) + { + $sLine = \strtr($sLine, array("\r" => '\r', "\n" => '\n'.$this->sNewLine)); + $sLine = \rtrim($sLine); + } + } + else + { + $mDesc = \strtr($mDesc, array("\r" => '\r', "\n" => '\n'.$this->sNewLine)); + $mDesc = \rtrim($mDesc); + } + } + + return $this->writeImplementation($mDesc); + } + + /** + * @final + * @param string $sDesc + * @param int $iType = \MailSo\Log\Enumerations\Type::INFO + * @param string $sName = '' + * @param bool $bDiplayCrLf = false + * + * @return bool + */ + final public function Write($sDesc, $iType = \MailSo\Log\Enumerations\Type::INFO, $sName = '', $bDiplayCrLf = false) + { + $bResult = true; + if (!$this->bFlushCache && ($this->bWriteOnErrorOnly || $this->bWriteOnPhpErrorOnly || 0 < $this->iWriteOnTimeoutOnly)) + { + $bErrorPhp = false; + + $bError = $this->bWriteOnErrorOnly && \in_array($iType, array( + \MailSo\Log\Enumerations\Type::NOTICE, + \MailSo\Log\Enumerations\Type::NOTICE_PHP, + \MailSo\Log\Enumerations\Type::WARNING, + \MailSo\Log\Enumerations\Type::WARNING_PHP, + \MailSo\Log\Enumerations\Type::ERROR, + \MailSo\Log\Enumerations\Type::ERROR_PHP + )); + + if (!$bError) + { + $bErrorPhp = $this->bWriteOnPhpErrorOnly && \in_array($iType, array( + \MailSo\Log\Enumerations\Type::NOTICE_PHP, + \MailSo\Log\Enumerations\Type::WARNING_PHP, + \MailSo\Log\Enumerations\Type::ERROR_PHP + )); + } + + if ($bError || $bErrorPhp) + { + $sFlush = '--- FlushLogCache: '.($bError ? 'WriteOnErrorOnly' : 'WriteOnPhpErrorOnly'); + if (isset($this->aCache[0]) && empty($this->aCache[0])) + { + $this->aCache[0] = $sFlush; + \array_unshift($this->aCache, ''); + } + else + { + \array_unshift($this->aCache, $sFlush); + } + + $this->aCache[] = '--- FlushLogCache: Trigger'; + $this->aCache[] = $this->loggerLineImplementation($this->getTimeWithMicroSec(), $sDesc, $iType, $sName); + + $this->bFlushCache = true; + $bResult = $this->localWriteImplementation($this->aCache, $bDiplayCrLf); + $this->aCache = array(); + } + else if (0 < $this->iWriteOnTimeoutOnly && \time() - APP_START_TIME > $this->iWriteOnTimeoutOnly) + { + $sFlush = '--- FlushLogCache: WriteOnTimeoutOnly ['.(\time() - APP_START_TIME).'sec]'; + if (isset($this->aCache[0]) && empty($this->aCache[0])) + { + $this->aCache[0] = $sFlush; + \array_unshift($this->aCache, ''); + } + else + { + \array_unshift($this->aCache, $sFlush); + } + + $this->aCache[] = '--- FlushLogCache: Trigger'; + $this->aCache[] = $this->loggerLineImplementation($this->getTimeWithMicroSec(), $sDesc, $iType, $sName); + + $this->bFlushCache = true; + $bResult = $this->localWriteImplementation($this->aCache, $bDiplayCrLf); + $this->aCache = array(); + } + else + { + $this->aCache[] = $this->loggerLineImplementation($this->getTimeWithMicroSec(), $sDesc, $iType, $sName); + } + } + else + { + $bResult = $this->localWriteImplementation( + $this->loggerLineImplementation($this->getTimeWithMicroSec(), $sDesc, $iType, $sName), $bDiplayCrLf); + } + + return $bResult; + } + + /** + * @return string + */ + public function GetNewLine() + { + return $this->sNewLine; + } + + /** + * @final + * @return bool + */ + final public function Clear() + { + return $this->clearImplementation(); + } + + /** + * @final + * @return void + */ + final public function WriteEmptyLine() + { + if (!$this->bFlushCache && ($this->bWriteOnErrorOnly || $this->bWriteOnPhpErrorOnly || 0 < $this->iWriteOnTimeoutOnly)) + { + $this->aCache[] = ''; + } + else + { + $this->writeEmptyLineImplementation(); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Callback.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Callback.php new file mode 100755 index 00000000..021d7e82 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Callback.php @@ -0,0 +1,83 @@ +fWriteCallback = \is_callable($fWriteCallback) ? $fWriteCallback : null; + $this->fClearCallback = \is_callable($fClearCallback) ? $fClearCallback : null; + } + + /** + * @param mixed $fWriteCallback + * @param mixed $fClearCallback = null + * + * @return \MailSo\Log\Drivers\Callback + */ + public static function NewInstance($fWriteCallback, $fClearCallback = null) + { + return new self($fWriteCallback, $fClearCallback); + } + + /** + * @param string|array $mDesc + * + * @return bool + */ + protected function writeImplementation($mDesc) + { + if ($this->fWriteCallback) + { + \call_user_func_array($this->fWriteCallback, array($mDesc)); + } + + return true; + } + + /** + * @return bool + */ + protected function clearImplementation() + { + if ($this->fClearCallback) + { + \call_user_func($this->fClearCallback); + } + + return true; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/File.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/File.php new file mode 100755 index 00000000..b3c3678c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/File.php @@ -0,0 +1,91 @@ +sLoggerFileName = $sLoggerFileName; + $this->sNewLine = $sNewLine; + } + + /** + * @param string $sLoggerFileName + */ + public function SetLoggerFileName($sLoggerFileName) + { + $this->sLoggerFileName = $sLoggerFileName; + } + + /** + * @param string $sLoggerFileName + * @param string $sNewLine = "\r\n" + * + * @return \MailSo\Log\Drivers\File + */ + public static function NewInstance($sLoggerFileName, $sNewLine = "\r\n") + { + return new self($sLoggerFileName, $sNewLine); + } + + /** + * @param string|array $mDesc + * + * @return bool + */ + protected function writeImplementation($mDesc) + { + return $this->writeToLogFile($mDesc); + } + + /** + * @return bool + */ + protected function clearImplementation() + { + return \unlink($this->sLoggerFileName); + } + + /** + * @param string|array $mDesc + * + * @return bool + */ + private function writeToLogFile($mDesc) + { + if (\is_array($mDesc)) + { + $mDesc = \implode($this->sNewLine, $mDesc); + } + + return \error_log($mDesc.$this->sNewLine, 3, $this->sLoggerFileName); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Inline.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Inline.php new file mode 100755 index 00000000..817ffbb5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Inline.php @@ -0,0 +1,89 @@ +sNewLine = $sNewLine; + $this->bHtmlEncodeSpecialChars = $bHtmlEncodeSpecialChars; + } + + /** + * @param string $sNewLine = "\r\n" + * @param bool $bHtmlEncodeSpecialChars = false + * + * @return \MailSo\Log\Drivers\Inline + */ + public static function NewInstance($sNewLine = "\r\n", $bHtmlEncodeSpecialChars = false) + { + return new self($sNewLine, $bHtmlEncodeSpecialChars); + } + + /** + * @param string $mDesc + * + * @return bool + */ + protected function writeImplementation($mDesc) + { + if (\is_array($mDesc)) + { + if ($this->bHtmlEncodeSpecialChars) + { + $mDesc = \array_map(function ($sItem) { + return \htmlspecialchars($sItem); + }, $mDesc); + } + + $mDesc = \implode($this->sNewLine, $mDesc); + } + else + { + echo ($this->bHtmlEncodeSpecialChars) ? \htmlspecialchars($mDesc).$this->sNewLine : $mDesc.$this->sNewLine; + } + + return true; + } + + /** + * @return bool + */ + protected function clearImplementation() + { + if (\defined('PHP_SAPI') && 'cli' === PHP_SAPI && \MailSo\Base\Utils::FunctionExistsAndEnabled('system')) + { + \system('clear'); + } + + return true; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Syslog.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Syslog.php new file mode 100755 index 00000000..f1895067 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Syslog.php @@ -0,0 +1,81 @@ +iLogLevel = \defined('LOG_INFO') ? LOG_INFO : 6; + + if (\function_exists('openlog') && \function_exists('closelog') && \defined('LOG_ODELAY') && \defined('LOG_USER')) + { + \openlog('rainloop', LOG_ODELAY, LOG_USER); + + \register_shutdown_function(function () { + @\closelog(); + }); + } + else + { + $this->iLogLevel = null; + } + } + + /** + * @return \MailSo\Log\Drivers\Syslog + */ + public static function NewInstance() + { + return new self(); + } + + /** + * @param string|array $mDesc + * + * @return bool + */ + protected function writeImplementation($mDesc) + { + if (null === $this->iLogLevel) + { + return false; + } + + if (\is_array($mDesc)) + { + $mDesc = \implode($this->sNewLine, $mDesc); + } + + return \syslog($this->iLogLevel, $mDesc); + } + + /** + * @return bool + */ + protected function clearImplementation() + { + return true; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Enumerations/Type.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Enumerations/Type.php new file mode 100755 index 00000000..6c3db90d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Enumerations/Type.php @@ -0,0 +1,34 @@ +bUsed = false; + $this->aForbiddenTypes = array(); + $this->aSecretWords = array(); + $this->bShowSecter = false; + $this->bHideErrorNotices = false; + + if ($bRegPhpErrorHandler) + { + \set_error_handler(array(&$this, '__phpErrorHandler')); + } + + \register_shutdown_function(array(&$this, '__loggerShutDown')); + } + + /** + * @param bool $bRegPhpErrorHandler = false + * + * @return \MailSo\Log\Logger + */ + public static function NewInstance($bRegPhpErrorHandler = false) + { + return new self($bRegPhpErrorHandler); + } + + /** + * @staticvar \MailSo\Log\Logger $oInstance; + * + * @return \MailSo\Log\Logger + */ + public static function SingletonInstance() + { + static $oInstance = null; + if (null === $oInstance) + { + $oInstance = self::NewInstance(); + } + + return $oInstance; + } + + /** + * @param string $sFormat + * @param string $sTimeOffset = '0' + * @param int $iTimestamp = 0 + * + * @return string + */ + public static function DateHelper($sFormat, $sTimeOffset = '0', $iTimestamp = null) + { + $iTimestamp = null === $iTimestamp ? \time() : (int) $iTimestamp; + return \gmdate($sFormat, $iTimestamp + \MailSo\Base\DateTimeHelper::TimeToSec((string) $sTimeOffset)); + } + + /** + * @return bool + */ + public static function IsSystemEnabled() + { + return !!(\MailSo\Config::$SystemLogger instanceof \MailSo\Log\Logger); + } + + /** + * @param mixed $mData + * @param int $iType = \MailSo\Log\Enumerations\Type::INFO + */ + public static function SystemLog($mData, $iType = \MailSo\Log\Enumerations\Type::INFO) + { + if (\MailSo\Config::$SystemLogger instanceof \MailSo\Log\Logger) + { + \MailSo\Config::$SystemLogger->WriteMixed($mData, $iType); + } + } + + /** + * @staticvar string $sCache; + * + * @return string + */ + public static function Guid() + { + static $sCache = null; + if (null === $sCache) + { + $sCache = \substr(\MailSo\Base\Utils::Md5Rand(), -8); + } + + return $sCache; + } + + /** + * @return bool + */ + public function Ping() + { + return true; + } + + /** + * @return bool + */ + public function IsEnabled() + { + return 0 < $this->Count(); + } + + /** + * @param string $sWord + * + * @return bool + */ + public function AddSecret($sWord) + { + if (\is_string($sWord) && 0 < \strlen(\trim($sWord))) + { + $this->aSecretWords[] = $sWord; + $this->aSecretWords = \array_unique($this->aSecretWords); + } + } + + /** + * @param bool $bShow + * + * @return \MailSo\Log\Logger + */ + public function SetShowSecter($bShow) + { + $this->bShowSecter = !!$bShow; + return $this; + } + + /** + * @param bool $bValue + * + * @return \MailSo\Log\Logger + */ + public function HideErrorNotices($bValue) + { + $this->bHideErrorNotices = !!$bValue; + return $this; + } + + /** + * @return bool + */ + public function IsShowSecter() + { + return $this->bShowSecter; + } + + /** + * @param int $iType + * + * @return \MailSo\Log\Logger + */ + public function AddForbiddenType($iType) + { + $this->aForbiddenTypes[$iType] = true; + + return $this; + } + + /** + * @param int $iType + * + * @return \MailSo\Log\Logger + */ + public function RemoveForbiddenType($iType) + { + $this->aForbiddenTypes[$iType] = false; + return $this; + } + + /** + * @param int $iErrNo + * @param string $sErrStr + * @param string $sErrFile + * @param int $iErrLine + * + * @return bool + */ + public function __phpErrorHandler($iErrNo, $sErrStr, $sErrFile, $iErrLine) + { + $iType = \MailSo\Log\Enumerations\Type::NOTICE_PHP; + switch ($iErrNo) + { + case E_USER_ERROR: + $iType = \MailSo\Log\Enumerations\Type::ERROR_PHP; + break; + case E_USER_WARNING: + $iType = \MailSo\Log\Enumerations\Type::WARNING_PHP; + break; + } + + $this->Write($sErrFile.' [line:'.$iErrLine.', code:'.$iErrNo.']', $iType, 'PHP'); + $this->Write('Error: '.$sErrStr, $iType, 'PHP'); + + return !!(\MailSo\Log\Enumerations\Type::NOTICE === $iType && $this->bHideErrorNotices); + } + + /** + * @return void + */ + public function __loggerShutDown() + { + if ($this->bUsed) + { + $aStatistic = \MailSo\Base\Loader::Statistic(); + if (\is_array($aStatistic)) + { + if (isset($aStatistic['php']['memory_get_peak_usage'])) + { + $this->Write('Memory peak usage: '.$aStatistic['php']['memory_get_peak_usage'], + \MailSo\Log\Enumerations\Type::MEMORY); + } + + if (isset($aStatistic['time'])) + { + $this->Write('Time delta: '.$aStatistic['time'], \MailSo\Log\Enumerations\Type::TIME_DELTA); + } + } + } + } + + /** + * @return bool + */ + public function WriteEmptyLine() + { + $iResult = 1; + + $aLoggers =& $this->GetAsArray(); + foreach ($aLoggers as /* @var $oLogger \MailSo\Log\Driver */ &$oLogger) + { + $iResult &= $oLogger->WriteEmptyLine(); + } + + return (bool) $iResult; + } + + /** + * @param string $sDesc + * @param int $iType = \MailSo\Log\Enumerations\Type::INFO + * @param string $sName = '' + * @param bool $bSearchSecretWords = true + * @param bool $bDiplayCrLf = false + * + * @return bool + */ + public function Write($sDesc, $iType = \MailSo\Log\Enumerations\Type::INFO, + $sName = '', $bSearchSecretWords = true, $bDiplayCrLf = false) + { + if (isset($this->aForbiddenTypes[$iType]) && true === $this->aForbiddenTypes[$iType]) + { + return true; + } + + $this->bUsed = true; + + $oLogger = null; + $aLoggers = array(); + $iResult = 1; + + if ($bSearchSecretWords && !$this->bShowSecter && 0 < \count($this->aSecretWords)) + { + $sDesc = \str_replace($this->aSecretWords, '*******', $sDesc); + } + + $aLoggers =& $this->GetAsArray(); + foreach ($aLoggers as /* @var $oLogger \MailSo\Log\Driver */ $oLogger) + { + $iResult &= $oLogger->Write($sDesc, $iType, $sName, $bDiplayCrLf); + } + + return (bool) $iResult; + } + + /** + * @param mixed $oValue + * @param int $iType = \MailSo\Log\Enumerations\Type::INFO + * @param string $sName = '' + * @param bool $bSearchSecretWords = false + * @param bool $bDiplayCrLf = false + * + * @return bool + */ + public function WriteDump($oValue, $iType = \MailSo\Log\Enumerations\Type::INFO, $sName = '', + $bSearchSecretWords = false, $bDiplayCrLf = false) + { + return $this->Write(\print_r($oValue, true), $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); + } + + /** + * @param \Exception $oException + * @param int $iType = \MailSo\Log\Enumerations\Type::NOTICE + * @param string $sName = '' + * @param bool $bSearchSecretWords = true + * @param bool $bDiplayCrLf = false + * + * @return bool + */ + public function WriteException($oException, $iType = \MailSo\Log\Enumerations\Type::NOTICE, $sName = '', + $bSearchSecretWords = true, $bDiplayCrLf = false) + { + if ($oException instanceof \Exception) + { + if (isset($oException->__LOGINNED__)) + { + return true; + } + + $oException->__LOGINNED__ = true; + + return $this->Write((string) $oException, $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); + } + + return false; + } + + /** + * @param \Exception $oException + * @param int $iType = \MailSo\Log\Enumerations\Type::NOTICE + * @param string $sName = '' + * @param bool $bSearchSecretWords = true + * @param bool $bDiplayCrLf = false + * + * @return bool + */ + public function WriteExceptionShort($oException, $iType = \MailSo\Log\Enumerations\Type::NOTICE, $sName = '', + $bSearchSecretWords = true, $bDiplayCrLf = false) + { + if ($oException instanceof \Exception) + { + if (isset($oException->__LOGINNED__)) + { + return true; + } + + $oException->__LOGINNED__ = true; + + return $this->Write($oException->getMessage(), $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); + } + + return false; + } + + /** + * @param mixed $mData + * @param int $iType = \MailSo\Log\Enumerations\Type::NOTICE + * @param string $sName = '' + * @param bool $bSearchSecretWords = true + * @param bool $bDiplayCrLf = false + * + * @return bool + */ + public function WriteMixed($mData, $iType = null, $sName = '', + $bSearchSecretWords = true, $bDiplayCrLf = false) + { + $iType = null === $iType ? \MailSo\Log\Enumerations\Type::INFO : $iType; + if (\is_array($mData) || \is_object($mData)) + { + if ($mData instanceof \Exception) + { + $iType = null === $iType ? \MailSo\Log\Enumerations\Type::NOTICE : $iType; + return $this->WriteException($mData, $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); + } + else + { + return $this->WriteDump($mData, $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); + } + } + else + { + return $this->Write($mData, $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); + } + + return false; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Attachment.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Attachment.php new file mode 100755 index 00000000..51def4ef --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Attachment.php @@ -0,0 +1,239 @@ +Clear(); + } + + /** + * @return \MailSo\Mail\Attachment + */ + public function Clear() + { + $this->sFolder = ''; + $this->iUid = 0; + $this->oBodyStructure = null; + + return $this; + } + + /** + * @return string + */ + public function Folder() + { + return $this->sFolder; + } + + /** + * @return int + */ + public function Uid() + { + return $this->iUid; + } + + /** + * @return string + */ + public function MimeIndex() + { + return $this->oBodyStructure ? $this->oBodyStructure->PartID() : ''; + } + + /** + * @param bool $bCalculateOnEmpty = false + * + * @return string + */ + public function FileName($bCalculateOnEmpty = false) + { + $sFileName = ''; + if ($this->oBodyStructure) + { + $sFileName = $this->oBodyStructure->FileName(); + if ($bCalculateOnEmpty && 0 === \strlen(trim($sFileName))) + { + $sMimeType = \strtolower(\trim($this->MimeType())); + if ('message/rfc822' === $sMimeType) + { + $sFileName = 'message'.$this->MimeIndex().'.eml'; + } + else if ('text/calendar' === $sMimeType) + { + $sFileName = 'calendar'.$this->MimeIndex().'.ics'; + } + else if (0 < \strlen($sMimeType)) + { + $sFileName = \str_replace('/', $this->MimeIndex().'.', $sMimeType); + } + } + } + + return $sFileName; + } + + /** + * @return string + */ + public function MimeType() + { + return $this->oBodyStructure ? $this->oBodyStructure->ContentType() : ''; + } + + /** + * @return string + */ + public function ContentTransferEncoding() + { + return $this->oBodyStructure ? $this->oBodyStructure->MailEncodingName() : ''; + } + + /** + * @return int + */ + public function EncodedSize() + { + return $this->oBodyStructure ? $this->oBodyStructure->Size() : 0; + } + + /** + * @return int + */ + public function EstimatedSize() + { + return $this->oBodyStructure ? $this->oBodyStructure->EstimatedSize() : 0; + } + + /** + * @return string + */ + public function Cid() + { + return $this->oBodyStructure ? $this->oBodyStructure->ContentID() : ''; + } + + /** + * @return string + */ + public function ContentLocation() + { + return $this->oBodyStructure ? $this->oBodyStructure->ContentLocation() : ''; + } + + /** + * @return bool + */ + public function IsInline() + { + return $this->oBodyStructure ? $this->oBodyStructure->IsInline() : false; + } + + /** + * @return bool + */ + public function IsImage() + { + return $this->oBodyStructure ? $this->oBodyStructure->IsImage() : false; + } + + /** + * @return bool + */ + public function IsArchive() + { + return $this->oBodyStructure ? $this->oBodyStructure->IsArchive() : false; + } + + /** + * @return bool + */ + public function IsPdf() + { + return $this->oBodyStructure ? $this->oBodyStructure->IsPdf() : false; + } + + /** + * @return bool + */ + public function IsDoc() + { + return $this->oBodyStructure ? $this->oBodyStructure->IsDoc() : false; + } + + /** + * @return bool + */ + public function IsPgpSignature() + { + return $this->oBodyStructure ? $this->oBodyStructure->IsPgpSignature() : false; + } + + /** + * @return \MailSo\Mail\Attachment + */ + public static function NewInstance() + { + return new self(); + } + + /** + * @param string $sFolder + * @param int $iUid + * @param \MailSo\Imap\BodyStructure $oBodyStructure + * @return \MailSo\Mail\Attachment + */ + public static function NewBodyStructureInstance($sFolder, $iUid, $oBodyStructure) + { + return self::NewInstance()->InitByBodyStructure($sFolder, $iUid, $oBodyStructure); + } + + /** + * @param string $sFolder + * @param int $iUid + * @param \MailSo\Imap\BodyStructure $oBodyStructure + * @return \MailSo\Mail\Attachment + */ + public function InitByBodyStructure($sFolder, $iUid, $oBodyStructure) + { + $this->sFolder = $sFolder; + $this->iUid = $iUid; + $this->oBodyStructure = $oBodyStructure; + return $this; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/AttachmentCollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/AttachmentCollection.php new file mode 100755 index 00000000..5cc64b57 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/AttachmentCollection.php @@ -0,0 +1,74 @@ +FilterList(function ($oAttachment) { + return $oAttachment && $oAttachment->IsInline(); + }); + + return \is_array($aList) ? \count($aList) : 0; + } + + /** + * @return int + */ + public function NonInlineCount() + { + $aList = $this->FilterList(function ($oAttachment) { + return $oAttachment && !$oAttachment->IsInline(); + }); + + return \is_array($aList) ? \count($aList) : 0; + } + + /** + * @return array + */ + public function SpecData() + { + return $this->MapList(function ($oAttachment) { + if ($oAttachment) + { + return array($oAttachment->FileName(true), $oAttachment->MimeType()); + } + + return null; + }); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Exceptions/Exception.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Exceptions/Exception.php new file mode 100755 index 00000000..9bf1c421 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Exceptions/Exception.php @@ -0,0 +1,19 @@ +oImapFolder = $oImapFolder; + $this->oSubFolders = null; + + $aNames = \explode($this->oImapFolder->Delimiter(), $this->oImapFolder->FullNameRaw()); + $this->iNestingLevel = \count($aNames); + + $this->sParentFullNameRaw = ''; + if (1 < $this->iNestingLevel) + { + \array_pop($aNames); + $this->sParentFullNameRaw = \implode($this->oImapFolder->Delimiter(), $aNames); + } + + $this->bSubscribed = $bSubscribed; + $this->bExisten = $bExisten; + } + else + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + } + + /** + * @param \MailSo\Imap\Folder $oImapFolder + * @param bool $bSubscribed = true + * @param bool $bExisten = true + * + * @return \MailSo\Mail\Folder + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public static function NewInstance($oImapFolder, $bSubscribed = true, $bExisten = true) + { + return new self($oImapFolder, $bSubscribed, $bExisten); + } + + /** + * @param string $sFullNameRaw + * @param string $sDelimiter + * + * @return \MailSo\Mail\Folder + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public static function NewNonExistenInstance($sFullNameRaw, $sDelimiter) + { + return self::NewInstance( + \MailSo\Imap\Folder::NewInstance($sFullNameRaw, $sDelimiter, array('\NoSelect')), true, false); + } + + /** + * @return string + */ + public function Name() + { + return \MailSo\Base\Utils::ConvertEncoding($this->NameRaw(), + \MailSo\Base\Enumerations\Charset::UTF_7_IMAP, + \MailSo\Base\Enumerations\Charset::UTF_8); + } + + /** + * @return string + */ + public function FullName() + { + return \MailSo\Base\Utils::ConvertEncoding($this->FullNameRaw(), + \MailSo\Base\Enumerations\Charset::UTF_7_IMAP, + \MailSo\Base\Enumerations\Charset::UTF_8); + } + + /** + * @return string + */ + public function NameRaw() + { + return $this->oImapFolder->NameRaw(); + } + + /** + * @return string + */ + public function FullNameRaw() + { + return $this->oImapFolder->FullNameRaw(); + } + + /** + * @return string + */ + public function ParentFullName() + { + return \MailSo\Base\Utils::ConvertEncoding($this->sParentFullNameRaw, + \MailSo\Base\Enumerations\Charset::UTF_7_IMAP, + \MailSo\Base\Enumerations\Charset::UTF_8); + } + + /** + * @return string + */ + public function ParentFullNameRaw() + { + return $this->sParentFullNameRaw; + } + + /** + * @return string + */ + public function Delimiter() + { + return $this->oImapFolder->Delimiter(); + } + + /** + * @return array + */ + public function Flags() + { + return $this->oImapFolder->Flags(); + } + + /** + * @return array + */ + public function FlagsLowerCase() + { + return $this->oImapFolder->FlagsLowerCase(); + } + + /** + * @param bool $bCreateIfNull = false + * @return \MailSo\Mail\FolderCollection + */ + public function SubFolders($bCreateIfNull = false) + { + if ($bCreateIfNull && !$this->oSubFolders) + { + $this->oSubFolders = FolderCollection::NewInstance(); + } + + return $this->oSubFolders; + } + + /** + * @return bool + */ + public function HasSubFolders() + { + return $this->oSubFolders && 0 < $this->oSubFolders->Count(); + } + + /** + * @return bool + */ + public function HasVisibleSubFolders() + { + $sList = array(); + if ($this->oSubFolders) + { + $sList = $this->oSubFolders->FilterList(function (\MailSo\Mail\Folder $oFolder) { + return $oFolder->IsSubscribed(); + }); + } + + return 0 < \count($sList); + } + + /** + * @return bool + */ + public function IsSubscribed() + { + return $this->bSubscribed; + } + + /** + * @return bool + */ + public function IsExists() + { + return $this->bExisten; + } + + /** + * @return bool + */ + public function IsSelectable() + { + return $this->IsExists() && $this->oImapFolder->IsSelectable(); + } + + /** + * @return mixed + */ + public function Status() + { + return $this->oImapFolder->GetExtended('STATUS'); + } + + /** + * @return bool + */ + public function IsInbox() + { + return $this->oImapFolder->IsInbox(); + } + + /** + * @return int + */ + public function GetFolderListType() + { + $aFlags = $this->oImapFolder->FlagsLowerCase(); + $iListType = \MailSo\Imap\Enumerations\FolderType::USER; + + if (\is_array($aFlags)) + { + switch (true) + { + case \in_array('\inbox', $aFlags) || 'INBOX' === \strtoupper($this->FullNameRaw()): + $iListType = \MailSo\Imap\Enumerations\FolderType::INBOX; + break; + case \in_array('\sent', $aFlags): + case \in_array('\sentmail', $aFlags): + $iListType = \MailSo\Imap\Enumerations\FolderType::SENT; + break; + case \in_array('\drafts', $aFlags): + $iListType = \MailSo\Imap\Enumerations\FolderType::DRAFTS; + break; + case \in_array('\junk', $aFlags): + case \in_array('\spam', $aFlags): + $iListType = \MailSo\Imap\Enumerations\FolderType::JUNK; + break; + case \in_array('\trash', $aFlags): + case \in_array('\bin', $aFlags): + $iListType = \MailSo\Imap\Enumerations\FolderType::TRASH; + break; + case \in_array('\important', $aFlags): + $iListType = \MailSo\Imap\Enumerations\FolderType::IMPORTANT; + break; + case \in_array('\flagged', $aFlags): + case \in_array('\starred', $aFlags): + $iListType = \MailSo\Imap\Enumerations\FolderType::FLAGGED; + break; + case \in_array('\all', $aFlags): + case \in_array('\allmail', $aFlags): + case \in_array('\archive', $aFlags): + $iListType = \MailSo\Imap\Enumerations\FolderType::ALL; + break; + } + } + + return $iListType; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/FolderCollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/FolderCollection.php new file mode 100755 index 00000000..9f0c00a0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/FolderCollection.php @@ -0,0 +1,279 @@ +Namespace = ''; + $this->FoldersHash = ''; + $this->SystemFolders = array(); + $this->IsThreadsSupported = false; + $this->Optimized = false; + } + + /** + * @return \MailSo\Mail\FolderCollection + */ + public static function NewInstance() + { + return new self(); + } + + /** + * @param string $sFullNameRaw + * + * @return \MailSo\Mail\Folder|null + */ + public function GetByFullNameRaw($sFullNameRaw) + { + $mResult = null; + foreach ($this->aItems as /* @var $oFolder \MailSo\Mail\Folder */ $oFolder) + { + if ($oFolder->FullNameRaw() === $sFullNameRaw) + { + $mResult = $oFolder; + break; + } + else if ($oFolder->HasSubFolders()) + { + $mResult = $oFolder->SubFolders(true)->GetByFullNameRaw($sFullNameRaw); + if ($mResult) + { + break; + } + else + { + $mResult = null; + } + } + } + + return $mResult; + } + + /** + * @return int + */ + public function CountRec() + { + $iResult = $this->Count(); + foreach ($this->aItems as /* @var $oFolder \MailSo\Mail\Folder */ $oFolder) + { + if ($oFolder) + { + $oSub = $oFolder->SubFolders(); + $iResult += $oSub ? $oSub->CountRec() : 0; + } + } + + return $iResult; + } + + /** + * @return string + */ + public function GetNamespace() + { + return $this->Namespace; + } + + /** + * @return string + */ + public function FindDelimiter() + { + $sDelimiter = '/'; + + $oFolder = $this->GetByFullNameRaw('INBOX'); + if (!$oFolder) + { + $oFolder = $this->GetByIndex(0); + } + + if ($oFolder) + { + $sDelimiter = $oFolder->Delimiter(); + } + + return $sDelimiter; + } + + /** + * @param string $sNamespace + * + * @return \MailSo\Mail\FolderCollection + */ + public function SetNamespace($sNamespace) + { + $this->Namespace = $sNamespace; + + return $this; + } + + /** + * @param array $aUnsortedMailFolders + * + * @return void + */ + public function InitByUnsortedMailFolderArray($aUnsortedMailFolders) + { + $this->Clear(); + + $aSortedByLenImapFolders = array(); + foreach ($aUnsortedMailFolders as /* @var $oMailFolder \MailSo\Mail\Folder */ &$oMailFolder) + { + $aSortedByLenImapFolders[$oMailFolder->FullNameRaw()] =& $oMailFolder; + unset($oMailFolder); + } + unset($aUnsortedMailFolders); + + $aAddedFolders = array(); + foreach ($aSortedByLenImapFolders as /* @var $oMailFolder \MailSo\Mail\Folder */ $oMailFolder) + { + $sDelimiter = $oMailFolder->Delimiter(); + $aFolderExplode = \explode($sDelimiter, $oMailFolder->FullNameRaw()); + + if (1 < \count($aFolderExplode)) + { + \array_pop($aFolderExplode); + + $sNonExistenFolderFullNameRaw = ''; + foreach ($aFolderExplode as $sFolderExplodeItem) + { + $sNonExistenFolderFullNameRaw .= (0 < \strlen($sNonExistenFolderFullNameRaw)) + ? $sDelimiter.$sFolderExplodeItem : $sFolderExplodeItem; + + if (!isset($aSortedByLenImapFolders[$sNonExistenFolderFullNameRaw])) + { + try + { + $aAddedFolders[$sNonExistenFolderFullNameRaw] = + Folder::NewNonExistenInstance($sNonExistenFolderFullNameRaw, $sDelimiter); + } + catch (\Exception $oExc) + { + unset($oExc); + } + } + } + } + } + + $aSortedByLenImapFolders = \array_merge($aSortedByLenImapFolders, $aAddedFolders); + unset($aAddedFolders); + + \uasort($aSortedByLenImapFolders, function ($oFolderA, $oFolderB) { + return \strnatcmp($oFolderA->FullNameRaw(), $oFolderB->FullNameRaw()); + }); + + foreach ($aSortedByLenImapFolders as /* @var $oMailFolder \MailSo\Mail\Folder */ &$oMailFolder) + { + $this->AddWithPositionSearch($oMailFolder); + unset($oMailFolder); + } + + unset($aSortedByLenImapFolders); + } + + /** + * @param \MailSo\Mail\Folder $oMailFolder + * + * @return bool + */ + public function AddWithPositionSearch($oMailFolder) + { + $oItemFolder = null; + $bIsAdded = false; + $aList =& $this->GetAsArray(); + + foreach ($aList as /* @var $oItemFolder \MailSo\Mail\Folder */ $oItemFolder) + { + if ($oMailFolder instanceof \MailSo\Mail\Folder && + 0 === \strpos($oMailFolder->FullNameRaw(), $oItemFolder->FullNameRaw().$oItemFolder->Delimiter())) + { + if ($oItemFolder->SubFolders(true)->AddWithPositionSearch($oMailFolder)) + { + $bIsAdded = true; + } + + break; + } + } + + if (!$bIsAdded && $oMailFolder instanceof \MailSo\Mail\Folder) + { + $bIsAdded = true; + $this->Add($oMailFolder); + } + + return $bIsAdded; + } + + /** + * @param callable $fCallback + * + * @return void + */ + public function SortByCallback($fCallback) + { + if (\is_callable($fCallback)) + { + $aList =& $this->GetAsArray(); + + \usort($aList, $fCallback); + + foreach ($aList as &$oItemFolder) + { + if ($oItemFolder->HasSubFolders()) + { + $oItemFolder->SubFolders()->SortByCallback($fCallback); + } + } + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/MailClient.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/MailClient.php new file mode 100755 index 00000000..1e95e251 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/MailClient.php @@ -0,0 +1,2677 @@ +oLogger = null; + + $this->oImapClient = \MailSo\Imap\ImapClient::NewInstance(); + $this->oImapClient->SetTimeOuts(10, \MailSo\Config::$ImapTimeout); + } + + /** + * @return \MailSo\Mail\MailClient + */ + public static function NewInstance() + { + return new self(); + } + + /** + * @return \MailSo\Imap\ImapClient + */ + public function ImapClient() + { + return $this->oImapClient; + } + + /** + * @param string $sServerName + * @param int $iPort = 143 + * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT + * @param bool $bVerifySsl = false + * + * @return \MailSo\Mail\MailClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function Connect($sServerName, $iPort = 143, + $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT, $bVerifySsl = false) + { + $this->oImapClient->Connect($sServerName, $iPort, $iSecurityType, $bVerifySsl); + return $this; + } + + /** + * @param string $sLogin + * @param string $sPassword + * @param string $sProxyAuthUser = '' + * @param bool $bUseAuthPlainIfSupported = true + * @param bool $bUseAuthCramMd5IfSupported = true + * + * @return \MailSo\Mail\MailClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\LoginException + */ + public function Login($sLogin, $sPassword, $sProxyAuthUser = '', + $bUseAuthPlainIfSupported = true, $bUseAuthCramMd5IfSupported = true) + { + $this->oImapClient->Login($sLogin, $sPassword, $sProxyAuthUser, $bUseAuthPlainIfSupported, $bUseAuthCramMd5IfSupported); + return $this; + } + + /** + * @param string $sXOAuth2Token + * + * @return \MailSo\Mail\MailClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\LoginException + */ + public function LoginWithXOauth2($sXOAuth2Token) + { + $this->oImapClient->LoginWithXOauth2($sXOAuth2Token); + return $this; + } + + /** + * @return \MailSo\Mail\MailClient + * + * @throws \MailSo\Net\Exceptions\Exception + */ + public function Logout() + { + $this->oImapClient->Logout(); + return $this; + } + + /** + * @return \MailSo\Mail\MailClient + * + * @throws \MailSo\Net\Exceptions\Exception + */ + public function Disconnect() + { + $this->oImapClient->Disconnect(); + return $this; + } + + /** + * @return \MailSo\Mail\MailClient + * + * @throws \MailSo\Net\Exceptions\Exception + */ + public function LogoutAndDisconnect() + { + return $this->Logout()->Disconnect(); + } + + /** + * @return bool + */ + public function IsConnected() + { + return $this->oImapClient->IsConnected(); + } + + /** + * @return bool + */ + public function IsLoggined() + { + return $this->oImapClient->IsLoggined(); + } + + /** + * @return string + */ + private function getEnvelopeOrHeadersRequestStringForSimpleList() + { + return \MailSo\Imap\Enumerations\FetchType::BuildBodyCustomHeaderRequest(array( + \MailSo\Mime\Enumerations\Header::RETURN_PATH, + \MailSo\Mime\Enumerations\Header::RECEIVED, + \MailSo\Mime\Enumerations\Header::MIME_VERSION, + \MailSo\Mime\Enumerations\Header::FROM_, + \MailSo\Mime\Enumerations\Header::TO_, + \MailSo\Mime\Enumerations\Header::CC, + \MailSo\Mime\Enumerations\Header::SENDER, + \MailSo\Mime\Enumerations\Header::REPLY_TO, + \MailSo\Mime\Enumerations\Header::DATE, + \MailSo\Mime\Enumerations\Header::SUBJECT, + \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, + \MailSo\Mime\Enumerations\Header::LIST_UNSUBSCRIBE, + ), true); + } + + /** + * @return string + */ + private function getEnvelopeOrHeadersRequestString() + { + if (\MailSo\Config::$MessageAllHeaders) + { + return \MailSo\Imap\Enumerations\FetchType::BODY_HEADER_PEEK; + } + + return \MailSo\Imap\Enumerations\FetchType::BuildBodyCustomHeaderRequest(array( + \MailSo\Mime\Enumerations\Header::RETURN_PATH, + \MailSo\Mime\Enumerations\Header::RECEIVED, + \MailSo\Mime\Enumerations\Header::MIME_VERSION, + \MailSo\Mime\Enumerations\Header::MESSAGE_ID, + \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, + \MailSo\Mime\Enumerations\Header::FROM_, + \MailSo\Mime\Enumerations\Header::TO_, + \MailSo\Mime\Enumerations\Header::CC, + \MailSo\Mime\Enumerations\Header::BCC, + \MailSo\Mime\Enumerations\Header::SENDER, + \MailSo\Mime\Enumerations\Header::REPLY_TO, + \MailSo\Mime\Enumerations\Header::DELIVERED_TO, + \MailSo\Mime\Enumerations\Header::IN_REPLY_TO, + \MailSo\Mime\Enumerations\Header::REFERENCES, + \MailSo\Mime\Enumerations\Header::DATE, + \MailSo\Mime\Enumerations\Header::SUBJECT, + \MailSo\Mime\Enumerations\Header::SENSITIVITY, + \MailSo\Mime\Enumerations\Header::X_MSMAIL_PRIORITY, + \MailSo\Mime\Enumerations\Header::IMPORTANCE, + \MailSo\Mime\Enumerations\Header::X_PRIORITY, + \MailSo\Mime\Enumerations\Header::X_DRAFT_INFO, + \MailSo\Mime\Enumerations\Header::RETURN_RECEIPT_TO, + \MailSo\Mime\Enumerations\Header::DISPOSITION_NOTIFICATION_TO, + \MailSo\Mime\Enumerations\Header::X_CONFIRM_READING_TO, + \MailSo\Mime\Enumerations\Header::AUTHENTICATION_RESULTS, + \MailSo\Mime\Enumerations\Header::X_DKIM_AUTHENTICATION_RESULTS, + \MailSo\Mime\Enumerations\Header::LIST_UNSUBSCRIBE, + ), true); +// +// return \MailSo\Imap\Enumerations\FetchType::ENVELOPE; + } + + /** + * @param string $sFolderName + * @param string $sMessageFlag + * @param bool $bSetAction = true + * @param bool $sSkipUnsupportedFlag = false + * @param array $aCustomUids = null + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + * @throws \MailSo\Mail\Exceptions\Exception + */ + public function MessageSetFlagToAll($sFolderName, $sMessageFlag, $bSetAction = true, $sSkipUnsupportedFlag = false, $aCustomUids = null) + { + $this->oImapClient->FolderSelect($sFolderName); + + $oFolderInfo = $this->oImapClient->FolderCurrentInformation(); + if (!$oFolderInfo || !$oFolderInfo->IsFlagSupported($sMessageFlag)) + { + if (!$sSkipUnsupportedFlag) + { + throw new \MailSo\Mail\Exceptions\RuntimeException('Message flag "'.$sMessageFlag.'" is not supported.'); + } + } + + if ($oFolderInfo && 0 < $oFolderInfo->Exists) + { + $sStoreAction = $bSetAction + ? \MailSo\Imap\Enumerations\StoreAction::ADD_FLAGS_SILENT + : \MailSo\Imap\Enumerations\StoreAction::REMOVE_FLAGS_SILENT + ; + + if (is_array($aCustomUids)) + { + if (0 < count($aCustomUids)) + { + $this->oImapClient->MessageStoreFlag(implode(',', $aCustomUids), true, array($sMessageFlag), $sStoreAction); + } + } + else + { + $this->oImapClient->MessageStoreFlag('1:*', false, array($sMessageFlag), $sStoreAction); + } + } + } + + /** + * @param string $sFolderName + * @param array $aIndexRange + * @param bool $bIndexIsUid + * @param string $sMessageFlag + * @param bool $bSetAction = true + * @param bool $sSkipUnsupportedFlag = false + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + * @throws \MailSo\Mail\Exceptions\Exception + */ + public function MessageSetFlag($sFolderName, $aIndexRange, $bIndexIsUid, $sMessageFlag, $bSetAction = true, $sSkipUnsupportedFlag = false) + { + $this->oImapClient->FolderSelect($sFolderName); + + $oFolderInfo = $this->oImapClient->FolderCurrentInformation(); + if (!$oFolderInfo || !$oFolderInfo->IsFlagSupported($sMessageFlag)) + { + if (!$sSkipUnsupportedFlag) + { + throw new \MailSo\Mail\Exceptions\RuntimeException('Message flag "'.$sMessageFlag.'" is not supported.'); + } + } + else + { + $sStoreAction = $bSetAction + ? \MailSo\Imap\Enumerations\StoreAction::ADD_FLAGS_SILENT + : \MailSo\Imap\Enumerations\StoreAction::REMOVE_FLAGS_SILENT + ; + + $this->oImapClient->MessageStoreFlag(\MailSo\Base\Utils::PrepearFetchSequence($aIndexRange), + $bIndexIsUid, array($sMessageFlag), $sStoreAction); + } + } + + /** + * @param string $sFolderName + * @param array $aIndexRange + * @param bool $bIndexIsUid + * @param bool $bSetAction = true + * @param bool $sSkipUnsupportedFlag = false + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function MessageSetFlagged($sFolderName, $aIndexRange, $bIndexIsUid, $bSetAction = true, $sSkipUnsupportedFlag = false) + { + $this->MessageSetFlag($sFolderName, $aIndexRange, $bIndexIsUid, + \MailSo\Imap\Enumerations\MessageFlag::FLAGGED, $bSetAction, $sSkipUnsupportedFlag); + } + + /** + * @param string $sFolderName + * @param bool $bSetAction = true + * @param array $aCustomUids = null + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function MessageSetSeenToAll($sFolderName, $bSetAction = true, $aCustomUids = null) + { + $this->MessageSetFlagToAll($sFolderName, \MailSo\Imap\Enumerations\MessageFlag::SEEN, $bSetAction, true, $aCustomUids); + } + + /** + * @param string $sFolderName + * @param array $aIndexRange + * @param bool $bIndexIsUid + * @param bool $bSetAction = true + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function MessageSetSeen($sFolderName, $aIndexRange, $bIndexIsUid, $bSetAction = true) + { + $this->MessageSetFlag($sFolderName, $aIndexRange, $bIndexIsUid, + \MailSo\Imap\Enumerations\MessageFlag::SEEN, $bSetAction, true); + } + + /** + * @param string $sFolderName + * @param int $iIndex + * @param bool $bIndexIsUid = true + * @param \MailSo\Cache\CacheClient $oCacher = null + * @param int $iBodyTextLimit = null + * + * @return \MailSo\Mail\Message|false + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function Message($sFolderName, $iIndex, $bIndexIsUid = true, $oCacher = null, $iBodyTextLimit = null) + { + if (!\MailSo\Base\Validator::RangeInt($iIndex, 1)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $this->oImapClient->FolderSelect($sFolderName); + + $oBodyStructure = null; + $oMessage = false; + + $aBodyPeekMimeIndexes = array(); + $aSignatureMimeIndexes = array(); + + $aFetchResponse = $this->oImapClient->Fetch(array(\MailSo\Imap\Enumerations\FetchType::BODYSTRUCTURE), $iIndex, $bIndexIsUid); + if (0 < \count($aFetchResponse) && isset($aFetchResponse[0])) + { + $oBodyStructure = $aFetchResponse[0]->GetFetchBodyStructure(); + if ($oBodyStructure) + { + $aTextParts = $oBodyStructure->SearchHtmlOrPlainParts(); + if (is_array($aTextParts) && 0 < \count($aTextParts)) + { + foreach ($aTextParts as $oPart) + { + $aBodyPeekMimeIndexes[] = array($oPart->PartID(), $oPart->Size()); + } + } + + $aSignatureParts = $oBodyStructure->SearchByContentType('application/pgp-signature'); + if (is_array($aSignatureParts) && 0 < \count($aSignatureParts)) + { + foreach ($aSignatureParts as $oPart) + { + $aSignatureMimeIndexes[] = $oPart->PartID(); + } + } + } + } + + $aFetchItems = array( + \MailSo\Imap\Enumerations\FetchType::INDEX, + \MailSo\Imap\Enumerations\FetchType::UID, + \MailSo\Imap\Enumerations\FetchType::RFC822_SIZE, + \MailSo\Imap\Enumerations\FetchType::INTERNALDATE, + \MailSo\Imap\Enumerations\FetchType::FLAGS, + $this->getEnvelopeOrHeadersRequestString() + ); + + if (0 < \count($aBodyPeekMimeIndexes)) + { + foreach ($aBodyPeekMimeIndexes as $aTextMimeData) + { + $sLine = \MailSo\Imap\Enumerations\FetchType::BODY_PEEK.'['.$aTextMimeData[0].']'; + if (\is_numeric($iBodyTextLimit) && 0 < $iBodyTextLimit && $iBodyTextLimit < $aTextMimeData[1]) + { + $sLine .= '<0.'.((int) $iBodyTextLimit).'>'; + } + + $aFetchItems[] = $sLine; + } + } + + if (0 < \count($aSignatureMimeIndexes)) + { + foreach ($aSignatureMimeIndexes as $sTextMimeIndex) + { + $aFetchItems[] = \MailSo\Imap\Enumerations\FetchType::BODY_PEEK.'['.$sTextMimeIndex.']'; + } + } + + if (!$oBodyStructure) + { + $aFetchItems[] = \MailSo\Imap\Enumerations\FetchType::BODYSTRUCTURE; + } + + $aFetchResponse = $this->oImapClient->Fetch($aFetchItems, $iIndex, $bIndexIsUid); + if (0 < \count($aFetchResponse)) + { + $oMessage = \MailSo\Mail\Message::NewFetchResponseInstance( + $sFolderName, $aFetchResponse[0], $oBodyStructure); + } + + return $oMessage; + } + + /** + * @param mixed $mCallback + * @param string $sFolderName + * @param int $iIndex + * @param bool $bIndexIsUid = true, + * @param string $sMimeIndex = '' + * + * @return bool + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function MessageMimeStream($mCallback, $sFolderName, $iIndex, $bIndexIsUid = true, $sMimeIndex = '') + { + if (!is_callable($mCallback)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $this->oImapClient->FolderSelect($sFolderName); + + $sFileName = ''; + $sContentType = ''; + $sMailEncodingName = ''; + + $sMimeIndex = trim($sMimeIndex); + $aFetchResponse = $this->oImapClient->Fetch(array( + 0 === \strlen($sMimeIndex) + ? \MailSo\Imap\Enumerations\FetchType::BODY_HEADER_PEEK + : \MailSo\Imap\Enumerations\FetchType::BODY_PEEK.'['.$sMimeIndex.'.MIME]' + ), $iIndex, $bIndexIsUid); + + if (0 < \count($aFetchResponse)) + { + $sMime = $aFetchResponse[0]->GetFetchValue( + 0 === \strlen($sMimeIndex) + ? \MailSo\Imap\Enumerations\FetchType::BODY_HEADER + : \MailSo\Imap\Enumerations\FetchType::BODY.'['.$sMimeIndex.'.MIME]' + ); + + if (0 < \strlen($sMime)) + { + $oHeaders = \MailSo\Mime\HeaderCollection::NewInstance()->Parse($sMime); + + if (0 < \strlen($sMimeIndex)) + { + $sFileName = $oHeaders->ParameterValue( + \MailSo\Mime\Enumerations\Header::CONTENT_DISPOSITION, + \MailSo\Mime\Enumerations\Parameter::FILENAME); + + if (0 === \strlen($sFileName)) + { + $sFileName = $oHeaders->ParameterValue( + \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, + \MailSo\Mime\Enumerations\Parameter::NAME); + } + + $sMailEncodingName = $oHeaders->ValueByName( + \MailSo\Mime\Enumerations\Header::CONTENT_TRANSFER_ENCODING); + + $sContentType = $oHeaders->ValueByName( + \MailSo\Mime\Enumerations\Header::CONTENT_TYPE); + } + else + { + $sSubject = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::SUBJECT); + + $sFileName = 0 === \strlen($sSubject) ? (string) $iIndex : $sSubject; + $sFileName .= '.eml'; + + $sContentType = 'message/rfc822'; + } + } + } + + $aFetchResponse = $this->oImapClient->Fetch(array( + array(\MailSo\Imap\Enumerations\FetchType::BODY_PEEK.'['.$sMimeIndex.']', + function ($sParent, $sLiteralAtomUpperCase, $rImapLiteralStream) use ($mCallback, $sMimeIndex, $sMailEncodingName, $sContentType, $sFileName) + { + if (0 < \strlen($sLiteralAtomUpperCase)) + { + if (is_resource($rImapLiteralStream) && 'FETCH' === $sParent) + { + $rMessageMimeIndexStream = (0 === \strlen($sMailEncodingName)) + ? $rImapLiteralStream + : \MailSo\Base\StreamWrappers\Binary::CreateStream($rImapLiteralStream, + \MailSo\Base\StreamWrappers\Binary::GetInlineDecodeOrEncodeFunctionName( + $sMailEncodingName, true)); + + \call_user_func($mCallback, $rMessageMimeIndexStream, $sContentType, $sFileName, $sMimeIndex); + } + } + } + )), $iIndex, $bIndexIsUid); + + return ($aFetchResponse && 1 === \count($aFetchResponse)); + } + + /** + * @param string $sFolder + * @param array $aIndexRange + * @param bool $bIndexIsUid + * @param bool $bUseExpunge = true + * @param bool $bExpungeAll = false + * + * @return \MailSo\Mail\MailClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function MessageDelete($sFolder, $aIndexRange, $bIndexIsUid, $bUseExpunge = true, $bExpungeAll = false) + { + if (0 === \strlen($sFolder) || !\is_array($aIndexRange) || 0 === \count($aIndexRange)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $this->oImapClient->FolderSelect($sFolder); + + $sIndexRange = \MailSo\Base\Utils::PrepearFetchSequence($aIndexRange); + + $this->oImapClient->MessageStoreFlag($sIndexRange, $bIndexIsUid, + array(\MailSo\Imap\Enumerations\MessageFlag::DELETED), + \MailSo\Imap\Enumerations\StoreAction::ADD_FLAGS_SILENT + ); + + if ($bUseExpunge) + { + $this->oImapClient->MessageExpunge($bIndexIsUid ? $sIndexRange : '', $bIndexIsUid, $bExpungeAll); + } + + return $this; + } + + /** + * @param string $sFromFolder + * @param string $sToFolder + * @param array $aIndexRange + * @param bool $bIndexIsUid + * @param bool $bUseMoveSupported = false + * @param bool $bExpungeAll = false + * + * @return \MailSo\Mail\MailClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function MessageMove($sFromFolder, $sToFolder, $aIndexRange, $bIndexIsUid, $bUseMoveSupported = false, $bExpungeAll = false) + { + if (0 === \strlen($sFromFolder) || 0 === \strlen($sToFolder) || + !\is_array($aIndexRange) || 0 === \count($aIndexRange)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $this->oImapClient->FolderSelect($sFromFolder); + + if ($bUseMoveSupported && $this->oImapClient->IsSupported('MOVE')) + { + $this->oImapClient->MessageMove($sToFolder, + \MailSo\Base\Utils::PrepearFetchSequence($aIndexRange), $bIndexIsUid); + } + else + { + $this->oImapClient->MessageCopy($sToFolder, + \MailSo\Base\Utils::PrepearFetchSequence($aIndexRange), $bIndexIsUid); + + $this->MessageDelete($sFromFolder, $aIndexRange, $bIndexIsUid, true, $bExpungeAll); + } + + return $this; + } + + /** + * @param string $sFromFolder + * @param string $sToFolder + * @param array $aIndexRange + * @param bool $bIndexIsUid + * + * @return \MailSo\Mail\MailClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function MessageCopy($sFromFolder, $sToFolder, $aIndexRange, $bIndexIsUid) + { + if (0 === \strlen($sFromFolder) || 0 === \strlen($sToFolder) || + !\is_array($aIndexRange) || 0 === \count($aIndexRange)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $this->oImapClient->FolderSelect($sFromFolder); + $this->oImapClient->MessageCopy($sToFolder, + \MailSo\Base\Utils::PrepearFetchSequence($aIndexRange), $bIndexIsUid); + + return $this; + } + + /** + * @return \MailSo\Mail\MailClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function FolderUnSelect() + { + if ($this->oImapClient->IsSelected()) + { + $this->oImapClient->FolderUnSelect(); + } + + return $this; + } + + /** + * @param resource $rMessageStream + * @param int $iMessageStreamSize + * @param string $sFolderToSave + * @param array $aAppendFlags = null + * @param int $iUid = null + * + * @return \MailSo\Mail\MailClient + */ + public function MessageAppendStream($rMessageStream, $iMessageStreamSize, $sFolderToSave, $aAppendFlags = null, &$iUid = null) + { + if (!\is_resource($rMessageStream) || 0 === \strlen($sFolderToSave)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $this->oImapClient->MessageAppendStream( + $sFolderToSave, $rMessageStream, $iMessageStreamSize, $aAppendFlags, $iUid); + + return $this; + } + + /** + * @param string $sMessageFileName + * @param string $sFolderToSave + * @param array $aAppendFlags = null + * @param int &$iUid = null + * + * @return \MailSo\Mail\MailClient + */ + public function MessageAppendFile($sMessageFileName, $sFolderToSave, $aAppendFlags = null, &$iUid = null) + { + if (!@\is_file($sMessageFileName) || !@\is_readable($sMessageFileName)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $iMessageStreamSize = \filesize($sMessageFileName); + $rMessageStream = \fopen($sMessageFileName, 'rb'); + + $this->MessageAppendStream($rMessageStream, $iMessageStreamSize, $sFolderToSave, $aAppendFlags, $iUid); + + if (\is_resource($rMessageStream)) + { + @fclose($rMessageStream); + } + + return $this; + } + + /** + * @param string $sFolderName + * @param int $iCount + * @param int $iUnseenCount + * @param string $sUidNext + * @param string $sHighestModSeq + * + * @return void + */ + protected function initFolderValues($sFolderName, &$iCount, &$iUnseenCount, + &$sUidNext, &$sHighestModSeq = '') + { + $aTypes = array( + \MailSo\Imap\Enumerations\FolderResponseStatus::MESSAGES, + \MailSo\Imap\Enumerations\FolderResponseStatus::UNSEEN, + \MailSo\Imap\Enumerations\FolderResponseStatus::UIDNEXT + ); + + if ($this->oImapClient->IsSupported('CONDSTORE')) + { + $aTypes[] = \MailSo\Imap\Enumerations\FolderResponseStatus::HIGHESTMODSEQ; + } + + $aFolderStatus = $this->oImapClient->FolderStatus($sFolderName, $aTypes); + + $iCount = isset($aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::MESSAGES]) + ? (int) $aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::MESSAGES] : 0; + + $iUnseenCount = isset($aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::UNSEEN]) + ? (int) $aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::UNSEEN] : 0; + + $sUidNext = isset($aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::UIDNEXT]) + ? (string) $aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::UIDNEXT] : '0'; + + $sHighestModSeq = isset($aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::HIGHESTMODSEQ]) + ? (string) $aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::HIGHESTMODSEQ] : ''; + + if ($this->IsGmail() && + ('INBOX' === $sFolderName || '[gmail]' === \strtolower(\substr($sFolderName, 0, 7)))) + { + $oFolder = $this->oImapClient->FolderCurrentInformation(); + if ($oFolder && null !== $oFolder->Exists && $oFolder->FolderName === $sFolderName) + { + $iSubCount = (int) $oFolder->Exists; + if (0 < $iSubCount && $iSubCount < $iCount) + { + $iCount = $iSubCount; + } + } + } + } + + /** + * @return string + */ + public function GenerateImapClientHash() + { + return \md5('ImapClientHash/'. + $this->oImapClient->GetLogginedUser().'@'. + $this->oImapClient->GetConnectedHost().':'. + $this->oImapClient->GetConnectedPort() + ); + } + + /** + * @param string $sFolder + * @param int $iCount + * @param int $iUnseenCount + * @param string $sUidNext + * @param string $sHighestModSeq = '' + * + * @return string + */ + public function GenerateFolderHash($sFolder, $iCount, $iUnseenCount, $sUidNext, $sHighestModSeq = '') + { + $iUnseenCount = 0; // unneccessery + return \md5('FolderHash/'.$sFolder.'-'.$iCount.'-'.$iUnseenCount.'-'.$sUidNext.'-'. + $sHighestModSeq.'-'.$this->GenerateImapClientHash().'-'. + \MailSo\Config::$MessageListPermanentFilter + ); + } + + /** + * @param string $sFolderName + * @param string $sPrevUidNext + * @param string $sCurrentUidNext + * + * @return array + */ + private function getFolderNextMessageInformation($sFolderName, $sPrevUidNext, $sCurrentUidNext) + { + $aNewMessages = array(); + + if (0 < \strlen($sPrevUidNext) && (string) $sPrevUidNext !== (string) $sCurrentUidNext) + { + $this->oImapClient->FolderSelect($sFolderName); + + $aFetchResponse = $this->oImapClient->Fetch(array( + \MailSo\Imap\Enumerations\FetchType::INDEX, + \MailSo\Imap\Enumerations\FetchType::UID, + \MailSo\Imap\Enumerations\FetchType::FLAGS, + \MailSo\Imap\Enumerations\FetchType::BuildBodyCustomHeaderRequest(array( + \MailSo\Mime\Enumerations\Header::FROM_, + \MailSo\Mime\Enumerations\Header::SUBJECT, + \MailSo\Mime\Enumerations\Header::CONTENT_TYPE + )) + ), $sPrevUidNext.':*', true); + + if (\is_array($aFetchResponse) && 0 < \count($aFetchResponse)) + { + foreach ($aFetchResponse as /* @var $oFetchResponse \MailSo\Imap\FetchResponse */ $oFetchResponse) + { + $aFlags = \array_map('strtolower', $oFetchResponse->GetFetchValue( + \MailSo\Imap\Enumerations\FetchType::FLAGS)); + + if (!\in_array(\strtolower(\MailSo\Imap\Enumerations\MessageFlag::SEEN), $aFlags)) + { + $sUid = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::UID); + $sHeaders = $oFetchResponse->GetHeaderFieldsValue(); + + $oHeaders = \MailSo\Mime\HeaderCollection::NewInstance()->Parse($sHeaders); + + $sContentTypeCharset = $oHeaders->ParameterValue( + \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, + \MailSo\Mime\Enumerations\Parameter::CHARSET + ); + + $sCharset = ''; + if (0 < \strlen($sContentTypeCharset)) + { + $sCharset = $sContentTypeCharset; + } + + if (0 < \strlen($sCharset)) + { + $oHeaders->SetParentCharset($sCharset); + } + + $aNewMessages[] = array( + 'Folder' => $sFolderName, + 'Uid' => $sUid, + 'Subject' => $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::SUBJECT, 0 === \strlen($sCharset)), + 'From' => $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::FROM_, 0 === \strlen($sCharset)) + ); + } + } + } + } + + return $aNewMessages; + } + + /** + * @param string $sFolderName + * @param string $sPrevUidNext = '' + * @param array $aUids = '' + * + * @return string + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function FolderInformation($sFolderName, $sPrevUidNext = '', $aUids = array()) + { + $aFlags = array(); + + $bSelect = false; + if ($this->IsGmail() && + ('INBOX' === $sFolderName || '[gmail]' === \strtolower(\substr($sFolderName, 0, 7)))) + { + $this->oImapClient->FolderSelect($sFolderName); + $bSelect = true; + } + + if (\is_array($aUids) && 0 < \count($aUids)) + { + if (!$bSelect) + { + $this->oImapClient->FolderSelect($sFolderName); + } + + $aFetchResponse = $this->oImapClient->Fetch(array( + \MailSo\Imap\Enumerations\FetchType::INDEX, + \MailSo\Imap\Enumerations\FetchType::UID, + \MailSo\Imap\Enumerations\FetchType::FLAGS + ), \MailSo\Base\Utils::PrepearFetchSequence($aUids), true); + + if (\is_array($aFetchResponse) && 0 < \count($aFetchResponse)) + { + foreach ($aFetchResponse as $oFetchResponse) + { + $sUid = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::UID); + $aFlags[(\is_numeric($sUid) ? (int) $sUid : 0)] = + $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::FLAGS); + } + } + } + + $iCount = 0; + $iUnseenCount = 0; + $sUidNext = '0'; + $sHighestModSeq = ''; + + $this->initFolderValues($sFolderName, $iCount, $iUnseenCount, $sUidNext, $sHighestModSeq); + + $aResult = array( + 'Folder' => $sFolderName, + 'Hash' => $this->GenerateFolderHash($sFolderName, $iCount, $iUnseenCount, $sUidNext, $sHighestModSeq), + 'MessageCount' => $iCount, + 'MessageUnseenCount' => $iUnseenCount, + 'UidNext' => $sUidNext, + 'Flags' => $aFlags, + 'HighestModSeq' => $sHighestModSeq, + 'NewMessages' => 'INBOX' === $sFolderName && \MailSo\Config::$CheckNewMessages ? + $this->getFolderNextMessageInformation($sFolderName, $sPrevUidNext, $sUidNext) : array() + ); + + return $aResult; + } + + /** + * @param string $sFolderName + * + * @return string + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function FolderHash($sFolderName) + { + $iCount = 0; + $iUnseenCount = 0; + $sUidNext = '0'; + $sHighestModSeq = ''; + + $this->initFolderValues($sFolderName, $iCount, $iUnseenCount, $sUidNext, $sHighestModSeq); + + return $this->GenerateFolderHash($sFolderName, $iCount, $iUnseenCount, $sUidNext, $sHighestModSeq); + } + + /** + * @return int + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function InboxUnreadCount() + { + $aFolderStatus = $this->oImapClient->FolderStatus('INBOX', array( + \MailSo\Imap\Enumerations\FolderResponseStatus::UNSEEN + )); + + $iResult = isset($aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::UNSEEN]) ? + (int) $aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::UNSEEN] : 0; + + return 0 < $iResult ? $iResult : 0; + } + + /** + * @return bool + */ + public function IsGmail() + { + return 'ssl://imap.gmail.com' === \strtolower($this->oImapClient->GetConnectedHost()); + } + + /** + * @param string $sSearch + * @param bool $bDetectGmail = true + * + * @return string + */ + private function escapeSearchString($sSearch, $bDetectGmail = true) + { + return !\MailSo\Base\Utils::IsAscii($sSearch) + ? '{'.\strlen($sSearch).'}'."\r\n".$sSearch : $this->oImapClient->EscapeString($sSearch); +// return ($bDetectGmail && !\MailSo\Base\Utils::IsAscii($sSearch) && $this->IsGmail()) +// ? '{'.\strlen($sSearch).'+}'."\r\n".$sSearch : $this->oImapClient->EscapeString($sSearch); + } + + /** + * @param string $sDate + * @param int $iTimeZoneOffset + * + * @return int + */ + private function parseSearchDate($sDate, $iTimeZoneOffset) + { + $iResult = 0; + if (0 < \strlen($sDate)) + { + $oDateTime = \DateTime::createFromFormat('Y.m.d', $sDate, \MailSo\Base\DateTimeHelper::GetUtcTimeZoneObject()); + return $oDateTime ? $oDateTime->getTimestamp() - $iTimeZoneOffset : 0; + } + + return $iResult; + } + + /** + * @param string $sSize + * + * @return int + */ + private function parseFriendlySize($sSize) + { + $sSize = preg_replace('/[^0-9bBkKmM]/', '', $sSize); + + $iResult = 0; + $aMatch = array(); + + if (\preg_match('/([\d]+)(B|KB|M|MB|G|GB)$/i', $sSize, $aMatch) && isset($aMatch[1], $aMatch[2])) + { + $iResult = (int) $aMatch[1]; + switch (\strtoupper($aMatch[2])) + { + case 'K': + case 'KB': + $iResult *= 1024; + case 'M': + case 'MB': + $iResult *= 1024; + case 'G': + case 'GB': + $iResult *= 1024; + } + } + else + { + $iResult = (int) $sSize; + } + + return $iResult; + } + + /** + * @param string $sSearch + * + * @return array + */ + private function parseSearchString($sSearch) + { + $aResult = array( + 'OTHER' => '' + ); + + $aCache = array(); + + $sReg = 'e?mail|from|to|subject|has|is|date|text|body|size|larger|bigger|smaller|maxsize|minsize'; + + $sSearch = \MailSo\Base\Utils::StripSpaces($sSearch); + $sSearch = \trim(\preg_replace('/('.$sReg.'): /i', '\\1:', $sSearch)); + + $mMatch = array(); + \preg_match_all('/".*?(? $sName) + { + if (isset($mMatch[2][$iIndex]) && 0 < \strlen($mMatch[2][$iIndex])) + { + $sName = \strtoupper($sName); + $sValue = $mMatch[2][$iIndex]; + switch ($sName) + { + case 'TEXT': + case 'BODY': + case 'EMAIL': + case 'MAIL': + case 'FROM': + case 'TO': + case 'SUBJECT': + case 'IS': + case 'HAS': + case 'SIZE': + case 'SMALLER': + case 'LARGER': + case 'BIGGER': + case 'MAXSIZE': + case 'MINSIZE': + case 'DATE': + if ('MAIL' === $sName) + { + $sName = 'EMAIL'; + } + if ('BODY' === $sName) + { + $sName = 'TEXT'; + } + if ('SIZE' === $sName || 'BIGGER' === $sName || 'MINSIZE' === $sName) + { + $sName = 'LARGER'; + } + if ('MAXSIZE' === $sName) + { + $sName = 'SMALLER'; + } + $aResult[$sName] = $sValue; + break; + } + } + } + } + + $aResult['OTHER'] = $sSearch; + foreach ($aResult as $sName => $sValue) + { + if (isset($aCache[$sValue])) + { + $aResult[$sName] = \trim($aCache[$sValue], '"\' '); + } + } + + return $aResult; + } + + /** + * @param string $sSearch + * @param string $sFilter + * @param int $iTimeZoneOffset = 0 + * @param bool $bUseCache = true + * + * @return string + */ + private function getImapSearchCriterias($sSearch, $sFilter, $iTimeZoneOffset = 0, &$bUseCache = true) + { + $bUseCache = true; + $iTimeFilter = 0; + $aCriteriasResult = array(); + + if (0 < \MailSo\Config::$MessageListDateFilter) + { + $iD = \time() - 3600 * 24 * 30 * \MailSo\Config::$MessageListDateFilter; + $iTimeFilter = \gmmktime(1, 1, 1, \gmdate('n', $iD), 1, \gmdate('Y', $iD)); + } + + if (0 < \strlen(\trim($sSearch))) + { + $sGmailRawSearch = ''; + $sResultBodyTextSearch = ''; + + $aLines = $this->parseSearchString($sSearch); + $bIsGmail = $this->oImapClient->IsSupported('X-GM-EXT-1'); + + if (1 === \count($aLines) && isset($aLines['OTHER'])) + { + $sValue = $this->escapeSearchString($aLines['OTHER']); + + if (\MailSo\Config::$MessageListFastSimpleSearch) + { + $aCriteriasResult[] = 'OR OR OR'; + $aCriteriasResult[] = 'FROM'; + $aCriteriasResult[] = $sValue; + $aCriteriasResult[] = 'TO'; + $aCriteriasResult[] = $sValue; + $aCriteriasResult[] = 'CC'; + $aCriteriasResult[] = $sValue; + $aCriteriasResult[] = 'SUBJECT'; + $aCriteriasResult[] = $sValue; + } + else + { + $aCriteriasResult[] = 'TEXT'; + $aCriteriasResult[] = $sValue; + } + } + else + { + if (isset($aLines['EMAIL'])) + { + $sValue = $this->escapeSearchString($aLines['EMAIL']); + + $aCriteriasResult[] = 'OR OR'; + $aCriteriasResult[] = 'FROM'; + $aCriteriasResult[] = $sValue; + $aCriteriasResult[] = 'TO'; + $aCriteriasResult[] = $sValue; + $aCriteriasResult[] = 'CC'; + $aCriteriasResult[] = $sValue; + + unset($aLines['EMAIL']); + } + + if (isset($aLines['TO'])) + { + $sValue = $this->escapeSearchString($aLines['TO']); + + $aCriteriasResult[] = 'OR'; + $aCriteriasResult[] = 'TO'; + $aCriteriasResult[] = $sValue; + $aCriteriasResult[] = 'CC'; + $aCriteriasResult[] = $sValue; + + unset($aLines['TO']); + } + + $sMainText = ''; + foreach ($aLines as $sName => $sRawValue) + { + if ('' === \trim($sRawValue)) + { + continue; + } + + $sValue = $this->escapeSearchString($sRawValue); + switch ($sName) + { + case 'FROM': + $aCriteriasResult[] = 'FROM'; + $aCriteriasResult[] = $sValue; + break; + case 'SUBJECT': + $aCriteriasResult[] = 'SUBJECT'; + $aCriteriasResult[] = $sValue; + break; + case 'OTHER': + case 'TEXT': + $sMainText .= ' '.$sRawValue; + break; + case 'HAS': + $aValue = \explode(',', \strtolower($sRawValue)); + $aValue = \array_map('trim', $aValue); + + $aCompareArray = array('file', 'files', 'attach', 'attachs', 'attachment', 'attachments'); + if (\count($aCompareArray) > \count(\array_diff($aCompareArray, $aValue))) + { + if ($bIsGmail) + { + $sGmailRawSearch .= ' has:attachment'; + } + else + { + // Simple, is not detailed search (Sometimes doesn't work) + $aCriteriasResult[] = 'OR OR OR'; + $aCriteriasResult[] = 'HEADER Content-Type application/'; + $aCriteriasResult[] = 'HEADER Content-Type multipart/m'; + $aCriteriasResult[] = 'HEADER Content-Type multipart/signed'; + $aCriteriasResult[] = 'HEADER Content-Type multipart/report'; + } + } + + case 'IS': + $aValue = \explode(',', \strtolower($sRawValue)); + $aValue = \array_map('trim', $aValue); + + $aCompareArray = array('flag', 'flagged', 'star', 'starred', 'pinned'); + $aCompareArray2 = array('unflag', 'unflagged', 'unstar', 'unstarred', 'unpinned'); + if (\count($aCompareArray) > \count(\array_diff($aCompareArray, $aValue))) + { + $aCriteriasResult[] = 'FLAGGED'; + $bUseCache = false; + } + else if (\count($aCompareArray2) > \count(\array_diff($aCompareArray2, $aValue))) + { + $aCriteriasResult[] = 'UNFLAGGED'; + $bUseCache = false; + } + + $aCompareArray = array('unread', 'unseen'); + $aCompareArray2 = array('read', 'seen'); + if (\count($aCompareArray) > \count(\array_diff($aCompareArray, $aValue))) + { + $aCriteriasResult[] = 'UNSEEN'; + $bUseCache = false; + } + else if (\count($aCompareArray2) > \count(\array_diff($aCompareArray2, $aValue))) + { + $aCriteriasResult[] = 'SEEN'; + $bUseCache = false; + } + break; + + case 'LARGER': + $aCriteriasResult[] = 'LARGER'; + $aCriteriasResult[] = $this->parseFriendlySize($sRawValue); + break; + case 'SMALLER': + $aCriteriasResult[] = 'SMALLER'; + $aCriteriasResult[] = $this->parseFriendlySize($sRawValue); + break; + case 'DATE': + $iDateStampFrom = $iDateStampTo = 0; + + $sDate = $sRawValue; + $aDate = \explode('/', $sDate); + + if (\is_array($aDate) && 2 === \count($aDate)) + { + if (0 < \strlen($aDate[0])) + { + $iDateStampFrom = $this->parseSearchDate($aDate[0], $iTimeZoneOffset); + } + + if (0 < \strlen($aDate[1])) + { + $iDateStampTo = $this->parseSearchDate($aDate[1], $iTimeZoneOffset); + $iDateStampTo += 60 * 60 * 24; + } + } + else + { + if (0 < \strlen($sDate)) + { + $iDateStampFrom = $this->parseSearchDate($sDate, $iTimeZoneOffset); + $iDateStampTo = $iDateStampFrom + 60 * 60 * 24; + } + } + + if (0 < $iDateStampFrom) + { + $aCriteriasResult[] = 'SINCE'; + $aCriteriasResult[] = \gmdate('j-M-Y', $iTimeFilter > $iDateStampFrom ? + $iTimeFilter : $iDateStampFrom); + + $iTimeFilter = 0; + } + + if (0 < $iDateStampTo) + { + $aCriteriasResult[] = 'BEFORE'; + $aCriteriasResult[] = \gmdate('j-M-Y', $iDateStampTo); + } + break; + } + } + + if ('' !== \trim($sMainText)) + { + $sMainText = \trim(\MailSo\Base\Utils::StripSpaces($sMainText), '"'); + if ($bIsGmail) + { + $sGmailRawSearch .= ' '.$sMainText; + } + else + { + $sResultBodyTextSearch .= ' '.$sMainText; + } + } + } + + $sGmailRawSearch = \trim($sGmailRawSearch); + if ($bIsGmail && 0 < \strlen($sGmailRawSearch)) + { + $aCriteriasResult[] = 'X-GM-RAW'; + $aCriteriasResult[] = $this->escapeSearchString($sGmailRawSearch, false); + } + + $sResultBodyTextSearch = \trim($sResultBodyTextSearch); + if (0 < \strlen($sResultBodyTextSearch)) + { + $aCriteriasResult[] = 'BODY'; + $aCriteriasResult[] = $this->escapeSearchString($sResultBodyTextSearch); + } + } + + $sCriteriasResult = \trim(\implode(' ', $aCriteriasResult)); + + if (0 < $iTimeFilter) + { + $sCriteriasResult .= ' SINCE '.\gmdate('j-M-Y', $iTimeFilter); + } + + $sCriteriasResult = \trim($sCriteriasResult); + if (\MailSo\Config::$MessageListUndeletedOnly) + { + $sCriteriasResult = \trim($sCriteriasResult.' UNDELETED'); + } + + $sFilter = \trim($sFilter); + if ('' !== $sFilter) + { + $sCriteriasResult .= ' '.$sFilter; + } + + $sCriteriasResult = \trim($sCriteriasResult); + if ('' !== \MailSo\Config::$MessageListPermanentFilter) + { + $sCriteriasResult = \trim($sCriteriasResult.' '.\MailSo\Config::$MessageListPermanentFilter); + } + + $sCriteriasResult = \trim($sCriteriasResult); + if ('' === $sCriteriasResult) + { + $sCriteriasResult = 'ALL'; + } + + return $sCriteriasResult; + } + + /** + * @param array $aThreads + * @return array + */ + private function threadArrayMap($aThreads) + { + $aNew = array(); + foreach ($aThreads as $mItem) + { + if (!\is_array($mItem)) + { + $aNew[] = $mItem; + } + else + { + $mMap = $this->threadArrayMap($mItem); + if (\is_array($mMap) && 0 < \count($mMap)) + { + $aNew = \array_merge($aNew, $mMap); + } + } + } + + return $aNew; + } + + /** + * @param array $aThreads + * + * @return array + */ + private function compileThreadArray($aThreads) + { + $aResult = array(); + foreach ($aThreads as $mItem) + { + if (\is_array($mItem)) + { + $aMap = $this->threadArrayMap($mItem); + if (\is_array($aMap)) + { + if (1 < \count($aMap)) + { + $aResult[] = $aMap; + } + else if (0 < \count($aMap)) + { + $aResult[] = $aMap[0]; + } + } + } + else + { + $aResult[] = $mItem; + } + } + + return $aResult; + } + + /** + * @param string $sFolderName + * @param string $sFolderHash + * @param array $aIndexOrUids + * @param \MailSo\Cache\CacheClient $oCacher + * @param bool $bCacheOnly = false + * + * @return array + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function MessageListThreadsMap($sFolderName, $sFolderHash, $aIndexOrUids, $oCacher, $bCacheOnly = false) + { + $iThreadLimit = \MailSo\Config::$LargeThreadLimit; + + $sSearchHash = ''; + if (0 < \MailSo\Config::$MessageListDateFilter) + { + $iD = \time() - 3600 * 24 * 30 * \MailSo\Config::$MessageListDateFilter; + $iTimeFilter = \gmmktime(1, 1, 1, \gmdate('n', $iD), 1, \gmdate('Y', $iD)); + + $sSearchHash .= ' SINCE '.\gmdate('j-M-Y', $iTimeFilter); + } + + if ('' === \trim($sSearchHash)) + { + $sSearchHash = 'ALL'; + } + + if ($oCacher && $oCacher->IsInited()) + { + $sSerializedHashKey = + 'ThreadsMapSorted/'.$sSearchHash.'/'. + 'Limit='.$iThreadLimit.'/'.$sFolderName.'/'.$sFolderHash; + + if ($this->oLogger) + { + $this->oLogger->Write($sSerializedHashKey); + } + + $sSerializedUids = $oCacher->Get($sSerializedHashKey); + if (!empty($sSerializedUids)) + { + $aSerializedUids = @\json_decode($sSerializedUids, true); + if (isset($aSerializedUids['ThreadsUids']) && \is_array($aSerializedUids['ThreadsUids'])) + { + if ($this->oLogger) + { + $this->oLogger->Write('Get Serialized Thread UIDS from cache ("'.$sFolderName.'" / '.$sSearchHash.') [count:'.\count($aSerializedUids['ThreadsUids']).']'); + } + + return $aSerializedUids['ThreadsUids']; + } + } + } + + if ($bCacheOnly) + { + return null; + } + + $this->oImapClient->FolderExamine($sFolderName); + + $aThreadUids = array(); + try + { + $aThreadUids = $this->oImapClient->MessageSimpleThread($sSearchHash); + } + catch (\MailSo\Imap\Exceptions\RuntimeException $oException) + { + unset($oException); + $aThreadUids = array(); + } + + $aResult = array(); + $aCompiledThreads = $this->compileThreadArray($aThreadUids); + + foreach ($aCompiledThreads as $mData) + { + if (\is_array($mData)) + { + foreach ($mData as $mSubData) + { + $aResult[(int) $mSubData] = + \array_diff($mData, array((int) $mSubData)); + } + } + else if (\is_int($mData) || \is_string($mData)) + { + $aResult[(int) $mData] = (int) $mData; + } + } + + $aParentsMap = array(); + foreach ($aIndexOrUids as $iUid) + { + if (isset($aResult[$iUid]) && \is_array($aResult[$iUid])) + { + foreach ($aResult[$iUid] as $iTempUid) + { + $aParentsMap[$iTempUid] = $iUid; + if (isset($aResult[$iTempUid])) + { + unset($aResult[$iTempUid]); + } + } + } + } + + $aSortedThreads = array(); + foreach ($aIndexOrUids as $iUid) + { + if (isset($aResult[$iUid])) + { + $aSortedThreads[$iUid] = $iUid; + } + } + + foreach ($aIndexOrUids as $iUid) + { + if (!isset($aSortedThreads[$iUid]) && + isset($aParentsMap[$iUid]) && + isset($aSortedThreads[$aParentsMap[$iUid]])) + { + if (!\is_array($aSortedThreads[$aParentsMap[$iUid]])) + { + $aSortedThreads[$aParentsMap[$iUid]] = array(); + } + + $aSortedThreads[$aParentsMap[$iUid]][] = $iUid; + } + } + + $aResult = $aSortedThreads; + unset($aParentsMap, $aSortedThreads); + + $aTemp = array(); + foreach ($aResult as $iUid => $mValue) + { + if (0 < $iThreadLimit && \is_array($mValue) && $iThreadLimit < \count($mValue)) + { + $aParts = \array_chunk($mValue, $iThreadLimit); + if (0 < count($aParts)) + { + foreach ($aParts as $iIndex => $aItem) + { + if (0 === $iIndex) + { + $aResult[$iUid] = $aItem; + } + else if (0 < $iIndex && \is_array($aItem)) + { + $mFirst = \array_shift($aItem); + if (!empty($mFirst)) + { + $aTemp[$mFirst] = 0 < \count($aItem) ? $aItem : $mFirst; + } + } + } + } + } + } + + foreach ($aTemp as $iUid => $mValue) + { + $aResult[$iUid] = $mValue; + } + + unset($aTemp); + + $aLastResult = array(); + foreach ($aIndexOrUids as $iUid) + { + if (isset($aResult[$iUid])) + { + $aLastResult[$iUid] = $aResult[$iUid]; + } + } + + $aResult = $aLastResult; + unset($aLastResult); + + if ($oCacher && $oCacher->IsInited() && !empty($sSerializedHashKey)) + { + $oCacher->Set($sSerializedHashKey, @\json_encode(array( + 'ThreadsUids' => $aResult + ))); + + if ($this->oLogger) + { + $this->oLogger->Write('Save Serialized Thread UIDS to cache ("'.$sFolderName.'" / '.$sSearchHash.') [count:'.\count($aResult).']'); + } + } + + return $aResult; + } + + /** + * @param \MailSo\Mail\MessageCollection &$oMessageCollection + * @param array $aRequestIndexOrUids + * @param bool $bIndexAsUid + * @param bool $bSimple = false + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function MessageListByRequestIndexOrUids(&$oMessageCollection, $aRequestIndexOrUids, $bIndexAsUid, $bSimple = false) + { + if (\is_array($aRequestIndexOrUids) && 0 < \count($aRequestIndexOrUids)) + { + $aFetchResponse = $this->oImapClient->Fetch(array( + \MailSo\Imap\Enumerations\FetchType::INDEX, + \MailSo\Imap\Enumerations\FetchType::UID, + \MailSo\Imap\Enumerations\FetchType::RFC822_SIZE, + \MailSo\Imap\Enumerations\FetchType::INTERNALDATE, + \MailSo\Imap\Enumerations\FetchType::FLAGS, + \MailSo\Imap\Enumerations\FetchType::BODYSTRUCTURE, + $bSimple ? + $this->getEnvelopeOrHeadersRequestStringForSimpleList() : + $this->getEnvelopeOrHeadersRequestString() + ), \MailSo\Base\Utils::PrepearFetchSequence($aRequestIndexOrUids), $bIndexAsUid); + + if (\is_array($aFetchResponse) && 0 < \count($aFetchResponse)) + { + $aFetchIndexArray = array(); + $oFetchResponseItem = null; + foreach ($aFetchResponse as /* @var $oFetchResponseItem \MailSo\Imap\FetchResponse */ &$oFetchResponseItem) + { + $aFetchIndexArray[($bIndexAsUid) + ? $oFetchResponseItem->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::UID) + : $oFetchResponseItem->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::INDEX)] =& $oFetchResponseItem; + + unset($oFetchResponseItem); + } + + foreach ($aRequestIndexOrUids as $iFUid) + { + if (isset($aFetchIndexArray[$iFUid])) + { + $oMessageCollection->Add( + Message::NewFetchResponseInstance( + $oMessageCollection->FolderName, $aFetchIndexArray[$iFUid])); + } + } + } + } + } + + /** + * @return bool + * + * @throws \MailSo\Net\Exceptions\Exception + */ + public function IsThreadsSupported() + { + return $this->oImapClient->IsSupported('THREAD=REFS') || + $this->oImapClient->IsSupported('THREAD=REFERENCES') || + $this->oImapClient->IsSupported('THREAD=ORDEREDSUBJECT'); + } + + /** + * @param string $sFolderName + * @param array $aUids + * + * @return \MailSo\Mail\MessageCollection + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function MessageListSimple($sFolderName, $aUids) + { + if (0 === \strlen($sFolderName) || !\MailSo\Base\Validator::NotEmptyArray($aUids)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $this->oImapClient->FolderExamine($sFolderName); + + $oMessageCollection = \MailSo\Mail\MessageCollection::NewInstance(); + $oMessageCollection->FolderName = $sFolderName; + + $this->MessageListByRequestIndexOrUids($oMessageCollection, $aUids, true, true); + + return $oMessageCollection->GetAsArray(); + } + + /** + * @param \MailSo\Cache\CacheClient|null $oCacher + * @param string $sSearch + * @param string $sFilter + * @param string $sFolderName + * @param string $sFolderHash + * @param bool $bUseSortIfSupported = false + * + * @return array + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function GetUids($oCacher, $sSearch, $sFilter, $sFolderName, $sFolderHash, $bUseSortIfSupported = false) + { + $aResultUids = false; + $bUidsFromCacher = false; + $bUseCacheAfterSearch = true; + + $sSerializedHash = ''; + $sSerializedLog = ''; + + $bUseSortIfSupported = $bUseSortIfSupported ? !!$this->oImapClient->IsSupported('SORT') : false; + + if (0 < \strlen($sSearch)) + { + $bUseSortIfSupported = false; + } + + $sSearchCriterias = $this->getImapSearchCriterias($sSearch, $sFilter, 0, $bUseCacheAfterSearch); + if ($bUseCacheAfterSearch && $oCacher && $oCacher->IsInited()) + { + $sSerializedHash = 'GetUids/'. + ($bUseSortIfSupported ? 'S': 'N').'/'. + $this->GenerateImapClientHash().'/'. + $sFolderName.'/'.$sSearchCriterias; + + $sSerializedLog = '"'.$sFolderName.'" / '.$sSearchCriterias.''; + + $sSerialized = $oCacher->Get($sSerializedHash); + if (!empty($sSerialized)) + { + $aSerialized = @\json_decode($sSerialized, true); + if (\is_array($aSerialized) && isset($aSerialized['FolderHash'], $aSerialized['Uids']) && + $sFolderHash === $aSerialized['FolderHash'] && + \is_array($aSerialized['Uids']) + ) + { + if ($this->oLogger) + { + $this->oLogger->Write('Get Serialized UIDS from cache ('.$sSerializedLog.') [count:'.\count($aSerialized['Uids']).']'); + } + + $aResultUids = $aSerialized['Uids']; + $bUidsFromCacher = true; + } + } + } + + if (!\is_array($aResultUids)) + { + $aResultUids = $bUseSortIfSupported ? + $this->oImapClient->MessageSimpleSort(array('REVERSE ARRIVAL'), $sSearchCriterias, true) : + $this->oImapClient->MessageSimpleSearch($sSearchCriterias, true, \MailSo\Base\Utils::IsAscii($sSearchCriterias) ? '' : 'UTF-8') + ; + + if (!$bUidsFromCacher && $bUseCacheAfterSearch && \is_array($aResultUids) && $oCacher && $oCacher->IsInited() && 0 < \strlen($sSerializedHash)) + { + $oCacher->Set($sSerializedHash, @\json_encode(array( + 'FolderHash' => $sFolderHash, + 'Uids' => $aResultUids + ))); + + if ($this->oLogger) + { + $this->oLogger->Write('Save Serialized UIDS to cache ('.$sSerializedLog.') [count:'.\count($aResultUids).']'); + } + } + } + + return \is_array($aResultUids) ? $aResultUids : array(); + } + + /** + * @param string $sFolderName + * @param int $iOffset = 0 + * @param int $iLimit = 10 + * @param string $sSearch = '' + * @param string $sPrevUidNext = '' + * @param \MailSo\Cache\CacheClient|null $oCacher = null + * @param bool $bUseSortIfSupported = false + * @param bool $bUseThreadSortIfSupported = false + * @param bool $bUseESearchOrESortRequest = false + * @param string $sThreadUid = '' + * @param string $sFilter = '' + * + * @return \MailSo\Mail\MessageCollection + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function MessageList($sFolderName, $iOffset = 0, $iLimit = 10, $sSearch = '', $sPrevUidNext = '', $oCacher = null, + $bUseSortIfSupported = false, $bUseThreadSortIfSupported = false, $sThreadUid = '', $sFilter = '') + { + $sFilter = \trim($sFilter); + $sSearch = \trim($sSearch); + if (!\MailSo\Base\Validator::RangeInt($iOffset, 0) || + !\MailSo\Base\Validator::RangeInt($iLimit, 0, 999)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $bUseFilter = '' !== $sFilter; + + $this->oImapClient->FolderSelect($sFolderName); + + $oMessageCollection = MessageCollection::NewInstance(); + $oMessageCollection->FolderName = $sFolderName; + $oMessageCollection->Offset = $iOffset; + $oMessageCollection->Limit = $iLimit; + $oMessageCollection->Search = $sSearch; + $oMessageCollection->ThreadUid = $sThreadUid; + $oMessageCollection->Filtered = '' !== \MailSo\Config::$MessageListPermanentFilter; + + $aUids = array(); + $mAllSortedUids = null; + $mAllThreads = null; + + $iThreadUid = empty($sThreadUid) ? 0 : (int) $sThreadUid; + + $iMessageRealCount = 0; + $iMessageUnseenCount = 0; + $sUidNext = '0'; + $sHighestModSeq = ''; + + $bUseSortIfSupported = $bUseSortIfSupported ? $this->oImapClient->IsSupported('SORT') : false; + + $bUseThreadSortIfSupported = $bUseThreadSortIfSupported ? + ($this->oImapClient->IsSupported('THREAD=REFS') || $this->oImapClient->IsSupported('THREAD=REFERENCES') || $this->oImapClient->IsSupported('THREAD=ORDEREDSUBJECT')) : false; + + if (!empty($sThreadUid) && !$bUseThreadSortIfSupported) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + if (!$oCacher || !($oCacher instanceof \MailSo\Cache\CacheClient)) + { + $oCacher = null; + } + + $this->initFolderValues($sFolderName, $iMessageRealCount, $iMessageUnseenCount, $sUidNext, $sHighestModSeq); + + if ($bUseFilter) + { + $iMessageUnseenCount = 0; + } + + $oMessageCollection->FolderHash = $this->GenerateFolderHash( + $sFolderName, $iMessageRealCount, $iMessageUnseenCount, $sUidNext, $sHighestModSeq); + + $oMessageCollection->UidNext = $sUidNext; + + if (empty($sThreadUid) && 0 < \strlen($sPrevUidNext) && 'INBOX' === $sFolderName) + { + $oMessageCollection->NewMessages = $this->getFolderNextMessageInformation( + $sFolderName, $sPrevUidNext, $sUidNext); + } + + $bSearch = false; + $bMessageListOptimization = 0 < \MailSo\Config::$MessageListCountLimitTrigger && + \MailSo\Config::$MessageListCountLimitTrigger < $iMessageRealCount; + + if ($bMessageListOptimization) + { + $bUseSortIfSupported = false; + $bUseThreadSortIfSupported = false; + } + + if (0 < $iMessageRealCount && !$bMessageListOptimization) + { + $mAllSortedUids = $this->GetUids($oCacher, '', $sFilter, + $oMessageCollection->FolderName, $oMessageCollection->FolderHash, $bUseSortIfSupported); + + $mAllThreads = $bUseThreadSortIfSupported ? $this->MessageListThreadsMap( + $oMessageCollection->FolderName, $oMessageCollection->FolderHash, $mAllSortedUids, $oCacher) : null; + + if ($bUseThreadSortIfSupported && 0 < $iThreadUid && \is_array($mAllThreads)) + { + $aUids = array(); + $iResultRootUid = 0; + + if (isset($mAllThreads[$iThreadUid])) + { + $iResultRootUid = $iThreadUid; + if (\is_array($mAllThreads[$iThreadUid])) + { + $aUids = $mAllThreads[$iThreadUid]; + } + } + else + { + foreach ($mAllThreads as $iRootUid => $mSubUids) + { + if (\is_array($mSubUids) && \in_array($iThreadUid, $mSubUids)) + { + $iResultRootUid = $iRootUid; + $aUids = $mSubUids; + continue; + } + } + } + + if (0 < $iResultRootUid && \in_array($iResultRootUid, $mAllSortedUids)) + { + \array_unshift($aUids, $iResultRootUid); + } + } + else if ($bUseThreadSortIfSupported && \is_array($mAllThreads)) + { + $aUids = \array_keys($mAllThreads); + } + else + { + $bUseThreadSortIfSupported = false; + $aUids = $mAllSortedUids; + } + + if (0 < \strlen($sSearch) && \is_array($aUids)) + { + $aSearchedUids = $this->GetUids($oCacher, $sSearch, $sFilter, + $oMessageCollection->FolderName, $oMessageCollection->FolderHash); + + if (\is_array($aSearchedUids) && 0 < \count($aSearchedUids)) + { + $aFlippedSearchedUids = \array_flip($aSearchedUids); + + $bSearch = true; + $aNewUids = array(); + + foreach ($aUids as $iUid) + { + if (isset($aFlippedSearchedUids[$iUid])) + { + $aNewUids[] = $iUid; + } + else if ($bUseThreadSortIfSupported && 0 === $iThreadUid && isset($mAllThreads[$iUid]) && \is_array($mAllThreads[$iUid])) + { + foreach ($mAllThreads[$iUid] as $iSubUid) + { + if (isset($aFlippedSearchedUids[$iSubUid])) + { + $aNewUids[] = $iUid; + continue; + } + } + } + } + + $aUids = \array_unique($aNewUids); + unset($aNewUids); + } + else + { + $aUids = array(); + } + } + + if (\is_array($aUids)) + { + $oMessageCollection->MessageCount = $iMessageRealCount; + $oMessageCollection->MessageUnseenCount = $iMessageUnseenCount; + $oMessageCollection->MessageResultCount = \count($aUids); + + if (0 < \count($aUids)) + { + $aRequestUids = \array_slice($aUids, $iOffset, $iLimit); + $this->MessageListByRequestIndexOrUids($oMessageCollection, $aRequestUids, true); + } + } + } + else if (0 < $iMessageRealCount) + { + if ($this->oLogger) + { + $this->oLogger->Write('List optimization (count: '.$iMessageRealCount. + ', limit:'.\MailSo\Config::$MessageListCountLimitTrigger.')'); + } + + $oMessageCollection->MessageCount = $iMessageRealCount; + $oMessageCollection->MessageUnseenCount = $iMessageUnseenCount; + + if (0 < \strlen($sSearch) || $bUseFilter) + { + $aUids = $this->GetUids($oCacher, $sSearch, $sFilter, + $oMessageCollection->FolderName, $oMessageCollection->FolderHash); + + if (0 < \count($aUids)) + { + $oMessageCollection->MessageResultCount = \count($aUids); + + $aRequestUids = \array_slice($aUids, $iOffset, $iLimit); + $this->MessageListByRequestIndexOrUids($oMessageCollection, $aRequestUids, true); + } + else + { + $oMessageCollection->MessageResultCount = 0; + } + } + else + { + $oMessageCollection->MessageResultCount = $iMessageRealCount; + + if (1 < $iMessageRealCount) + { + $aRequestIndexes = \array_slice(array_reverse(range(1, $iMessageRealCount)), $iOffset, $iLimit); + } + else + { + $aRequestIndexes = \array_slice(array(1), $iOffset, $iLimit); + } + + $this->MessageListByRequestIndexOrUids($oMessageCollection, $aRequestIndexes, false); + } + } + + if ($bUseThreadSortIfSupported && 0 === $iThreadUid && \is_array($mAllThreads) && 0 < \count($mAllThreads)) + { + $oMessageCollection->ForeachList(function (/* @var $oMessage \MailSo\Mail\Message */ $oMessage) use ($mAllThreads) { + + $iUid = $oMessage->Uid(); + if (isset($mAllThreads[$iUid]) && \is_array($mAllThreads[$iUid]) && 0 < \count($mAllThreads[$iUid])) + { + $aSubThreads = $mAllThreads[$iUid]; + \array_unshift($aSubThreads, $iUid); + + $oMessage->SetThreads(\array_map('trim', $aSubThreads)); + unset($aSubThreads); + } + }); + } + + return $oMessageCollection; + } + + /** + * @return array|false + */ + public function Quota() + { + return $this->oImapClient->Quota(); + } + + /** + * @param string $sFolderName + * @param string $sMessageId + * + * @return int|null + */ + public function FindMessageUidByMessageId($sFolderName, $sMessageId) + { + if (0 === \strlen($sMessageId)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $this->oImapClient->FolderExamine($sFolderName); + + $aUids = $this->oImapClient->MessageSimpleSearch( + 'HEADER Message-ID '.$sMessageId, true); + + return \is_array($aUids) && 1 === \count($aUids) && \is_numeric($aUids[0]) ? (int) $aUids[0] : null; + } + + /** + * @param array $aMailFoldersHelper + * @param int $iOptimizationLimit = 0 + * + * @return array + */ + public function folderListOptimization($aMailFoldersHelper, $iOptimizationLimit = 0) + { + // optimization + if (10 < $iOptimizationLimit && \is_array($aMailFoldersHelper) && $iOptimizationLimit < \count($aMailFoldersHelper)) + { + if ($this->oLogger) + { + $this->oLogger->Write('Start optimization (limit:'.$iOptimizationLimit.') for '.\count($aMailFoldersHelper).' folders'); + } + + $iForeachLimit = 1; + + $aFilteredNames = array( + 'inbox', + 'sent', 'send', 'outbox', 'sentmail', 'sendmail', + 'drafts', 'draft', + 'junk', 'spam', 'spambucket', + 'trash', 'bin', 'deleted', + 'archives', 'archive', 'allmail', 'all', + 'starred', 'flagged', 'important', + 'contacts', 'chats' + ); + + $aNewMailFoldersHelper = array(); + + $iCountLimit = $iForeachLimit; + + foreach ($aMailFoldersHelper as $iIndex => /* @var $oImapFolder \MailSo\Mail\Folder */ $oFolder) + { + // mandatory folders + if ($oFolder && \in_array(\str_replace(' ', '', \strtolower($oFolder->NameRaw())), $aFilteredNames)) + { + $aNewMailFoldersHelper[] = $oFolder; + $aMailFoldersHelper[$iIndex] = null; + } + } + + foreach ($aMailFoldersHelper as $iIndex => /* @var $oImapFolder \MailSo\Mail\Folder */ $oFolder) + { + // subscribed folders + if ($oFolder && $oFolder->IsSubscribed()) + { + $aNewMailFoldersHelper[] = $oFolder; + + $aMailFoldersHelper[$iIndex] = null; + $iCountLimit--; + } + + if (0 > $iCountLimit) + { + if ($iOptimizationLimit < \count($aNewMailFoldersHelper)) + { + break; + } + else + { + $iCountLimit = $iForeachLimit; + } + } + } + + $iCountLimit = $iForeachLimit; + if ($iOptimizationLimit >= \count($aNewMailFoldersHelper)) + { + // name filter + foreach ($aMailFoldersHelper as $iIndex => /* @var $oImapFolder \MailSo\Mail\Folder */ $oFolder) + { + if ($oFolder && !\preg_match('/[{}\[\]]/', $oFolder->NameRaw())) + { + $aNewMailFoldersHelper[] = $oFolder; + + $aMailFoldersHelper[$iIndex] = null; + $iCountLimit--; + } + + if (0 > $iCountLimit) + { + if ($iOptimizationLimit < \count($aNewMailFoldersHelper)) + { + break; + } + else + { + $iCountLimit = $iForeachLimit; + } + } + } + } + + $iCountLimit = $iForeachLimit; + if ($iOptimizationLimit >= \count($aNewMailFoldersHelper)) + { + // other + foreach ($aMailFoldersHelper as $iIndex => /* @var $oImapFolder \MailSo\Mail\Folder */ $oFolder) + { + if ($oFolder) + { + $aNewMailFoldersHelper[] = $oFolder; + + $aMailFoldersHelper[$iIndex] = null; + $iCountLimit--; + } + + if (0 > $iCountLimit) + { + if ($iOptimizationLimit < \count($aNewMailFoldersHelper)) + { + break; + } + else + { + $iCountLimit = $iForeachLimit; + } + } + } + } + + $aMailFoldersHelper = $aNewMailFoldersHelper; + + if ($this->oLogger) + { + $this->oLogger->Write('Result optimization: '.\count($aMailFoldersHelper).' folders'); + } + } + + return $aMailFoldersHelper; + } + + /** + * @param string $sParent = '' + * @param string $sListPattern = '*' + * @param bool $bUseListSubscribeStatus = false + * @param int $iOptimizationLimit = 0 + * + * @return \MailSo\Mail\FolderCollection|false + */ + public function Folders($sParent = '', $sListPattern = '*', $bUseListSubscribeStatus = true, $iOptimizationLimit = 0) + { + $oFolderCollection = false; + + $aSubscribedFolders = null; + if ($bUseListSubscribeStatus) + { + try + { + $aSubscribedFolders = $this->oImapClient->FolderSubscribeList($sParent, $sListPattern); + } + catch (\Exception $oException) + { + unset($oException); + } + } + + $aImapSubscribedFoldersHelper = null; + if (\is_array($aSubscribedFolders)) + { + $aImapSubscribedFoldersHelper = array(); + foreach ($aSubscribedFolders as /* @var $oImapFolder \MailSo\Imap\Folder */ $oImapFolder) + { + $aImapSubscribedFoldersHelper[] = $oImapFolder->FullNameRaw(); + } + } + + $aFolders = $this->oImapClient->FolderList($sParent, $sListPattern); + + $bOptimized = false; + $aMailFoldersHelper = null; + + if (\is_array($aFolders)) + { + $aMailFoldersHelper = array(); + + foreach ($aFolders as /* @var $oImapFolder \MailSo\Imap\Folder */ $oImapFolder) + { + $aMailFoldersHelper[] = Folder::NewInstance($oImapFolder, + (null === $aImapSubscribedFoldersHelper || \in_array($oImapFolder->FullNameRaw(), $aImapSubscribedFoldersHelper)) || + $oImapFolder->IsInbox() + ); + } + + $iCount = \count($aMailFoldersHelper); + $aMailFoldersHelper = $this->folderListOptimization($aMailFoldersHelper, $iOptimizationLimit); + + $bOptimized = $iCount !== \count($aMailFoldersHelper); + } + + if (\is_array($aMailFoldersHelper)) + { + $oFolderCollection = FolderCollection::NewInstance(); + $oFolderCollection->InitByUnsortedMailFolderArray($aMailFoldersHelper); + + $oFolderCollection->Optimized = $bOptimized; + } + + if ($oFolderCollection) + { + $oFolderCollection->SortByCallback(function ($oFolderA, $oFolderB) { + $sA = \strtoupper($oFolderA->FullNameRaw()); + $sB = \strtoupper($oFolderB->FullNameRaw()); + switch (true) + { + case 'INBOX' === $sA: + return -1; + case 'INBOX' === $sB: + return 1; + case '[GMAIL]' === $sA: + return -1; + case '[GMAIL]' === $sB: + return 1; + } + + return \strnatcasecmp($oFolderA->FullName(), $oFolderB->FullName()); + }); + + $oNamespace = $this->oImapClient->GetNamespace(); + if ($oNamespace) + { + $oFolderCollection->SetNamespace($oNamespace->GetPersonalNamespace()); + } + + $oFolderCollection->IsThreadsSupported = $this->IsThreadsSupported(); + } + + return $oFolderCollection; + } + + /** + * @param string $sFolderNameInUtf8 + * @param string $sFolderParentFullNameRaw = '' + * @param bool $bSubscribeOnCreation = true + * @param string $sDelimiter = '' + * + * @return \MailSo\Mail\MailClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public function FolderCreate($sFolderNameInUtf8, $sFolderParentFullNameRaw = '', $bSubscribeOnCreation = true, $sDelimiter = '') + { + if (!\MailSo\Base\Validator::NotEmptyString($sFolderNameInUtf8, true) || + !\is_string($sFolderParentFullNameRaw)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $sFolderNameInUtf8 = \trim($sFolderNameInUtf8); + + if (0 === \strlen($sDelimiter) || 0 < \strlen(\trim($sFolderParentFullNameRaw))) + { + $aFolders = $this->oImapClient->FolderList('', 0 === \strlen(\trim($sFolderParentFullNameRaw)) ? 'INBOX' : $sFolderParentFullNameRaw); + if (!\is_array($aFolders) || !isset($aFolders[0])) + { + // TODO + throw new \MailSo\Mail\Exceptions\RuntimeException( + 0 === \strlen(trim($sFolderParentFullNameRaw)) + ? 'Cannot get folder delimiter' + : 'Cannot create folder in non-existen parent folder'); + } + + $sDelimiter = $aFolders[0]->Delimiter(); + if (0 < \strlen($sDelimiter) && 0 < \strlen(\trim($sFolderParentFullNameRaw))) + { + $sFolderParentFullNameRaw .= $sDelimiter; + } + } + + $sFullNameRawToCreate = \MailSo\Base\Utils::ConvertEncoding($sFolderNameInUtf8, + \MailSo\Base\Enumerations\Charset::UTF_8, + \MailSo\Base\Enumerations\Charset::UTF_7_IMAP); + + if (0 < \strlen($sDelimiter) && false !== \strpos($sFullNameRawToCreate, $sDelimiter)) + { + // TODO + throw new \MailSo\Mail\Exceptions\RuntimeException( + 'New folder name contains delimiter'); + } + + $sFullNameRawToCreate = $sFolderParentFullNameRaw.$sFullNameRawToCreate; + + $this->oImapClient->FolderCreate($sFullNameRawToCreate); + + if ($bSubscribeOnCreation) + { + $this->oImapClient->FolderSubscribe($sFullNameRawToCreate); + } + + return $this; + } + + /** + * @param string $sPrevFolderFullNameRaw + * @param string $sNextFolderFullNameInUtf + * @param bool $bSubscribeOnMove = true + * + * @return \MailSo\Mail\MailClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public function FolderMove($sPrevFolderFullNameRaw, $sNextFolderFullNameInUtf, $bSubscribeOnMove = true) + { + return $this->folderModify($sPrevFolderFullNameRaw, $sNextFolderFullNameInUtf, false, $bSubscribeOnMove); + } + + /** + * @param string $sPrevFolderFullNameRaw + * @param string $sNewTopFolderNameInUtf + * @param bool $bSubscribeOnRename = true + * + * @return \MailSo\Mail\MailClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public function FolderRename($sPrevFolderFullNameRaw, $sNewTopFolderNameInUtf, $bSubscribeOnRename = true) + { + return $this->folderModify($sPrevFolderFullNameRaw, $sNewTopFolderNameInUtf, true, $bSubscribeOnRename); + } + + /** + * @param string $sPrevFolderFullNameRaw + * @param string $sNextFolderNameInUtf + * @param bool $bRenameOrMove + * @param bool $bSubscribeOnModify + * + * @return \MailSo\Mail\MailClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public function folderModify($sPrevFolderFullNameRaw, $sNextFolderNameInUtf, $bRenameOrMove, $bSubscribeOnModify) + { + if (0 === \strlen($sPrevFolderFullNameRaw) || 0 === \strlen($sNextFolderNameInUtf)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $aFolders = $this->oImapClient->FolderList('', $sPrevFolderFullNameRaw); + if (!\is_array($aFolders) || !isset($aFolders[0])) + { + // TODO + throw new \MailSo\Mail\Exceptions\RuntimeException('Cannot rename non-existen folder'); + } + + $sDelimiter = $aFolders[0]->Delimiter(); + $iLast = \strrpos($sPrevFolderFullNameRaw, $sDelimiter); + + $mSubscribeFolders = null; + if ($bSubscribeOnModify) + { + $mSubscribeFolders = $this->oImapClient->FolderSubscribeList($sPrevFolderFullNameRaw, '*'); + if (\is_array($mSubscribeFolders) && 0 < count($mSubscribeFolders)) + { + foreach ($mSubscribeFolders as /* @var $oFolder \MailSo\Imap\Folder */ $oFolder) + { + $this->oImapClient->FolderUnSubscribe($oFolder->FullNameRaw()); + } + } + } + + $sNewFolderFullNameRaw = \MailSo\Base\Utils::ConvertEncoding($sNextFolderNameInUtf, + \MailSo\Base\Enumerations\Charset::UTF_8, + \MailSo\Base\Enumerations\Charset::UTF_7_IMAP); + + if($bRenameOrMove) + { + if (0 < \strlen($sDelimiter) && false !== \strpos($sNewFolderFullNameRaw, $sDelimiter)) + { + // TODO + throw new \MailSo\Mail\Exceptions\RuntimeException('New folder name contains delimiter'); + } + + $sFolderParentFullNameRaw = false === $iLast ? '' : \substr($sPrevFolderFullNameRaw, 0, $iLast + 1); + $sNewFolderFullNameRaw = $sFolderParentFullNameRaw.$sNewFolderFullNameRaw; + } + + $this->oImapClient->FolderRename($sPrevFolderFullNameRaw, $sNewFolderFullNameRaw); + + if (\is_array($mSubscribeFolders) && 0 < count($mSubscribeFolders)) + { + foreach ($mSubscribeFolders as /* @var $oFolder \MailSo\Imap\Folder */ $oFolder) + { + $sFolderFullNameRawForResubscrine = $oFolder->FullNameRaw(); + if (0 === \strpos($sFolderFullNameRawForResubscrine, $sPrevFolderFullNameRaw)) + { + $sNewFolderFullNameRawForResubscrine = $sNewFolderFullNameRaw. + \substr($sFolderFullNameRawForResubscrine, \strlen($sPrevFolderFullNameRaw)); + + $this->oImapClient->FolderSubscribe($sNewFolderFullNameRawForResubscrine); + } + } + } + + return $this; + } + + /** + * @param string $sFolderFullNameRaw + * @param bool $bUnsubscribeOnDeletion = true + * + * @return \MailSo\Mail\MailClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Mail\Exceptions\RuntimeException + */ + public function FolderDelete($sFolderFullNameRaw, $bUnsubscribeOnDeletion = true) + { + if (0 === \strlen($sFolderFullNameRaw) || 'INBOX' === $sFolderFullNameRaw) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $this->oImapClient->FolderExamine($sFolderFullNameRaw); + + $aIndexOrUids = $this->oImapClient->MessageSimpleSearch('ALL'); + if (0 < \count($aIndexOrUids)) + { + throw new \MailSo\Mail\Exceptions\NonEmptyFolder(); + } + + $this->oImapClient->FolderExamine('INBOX'); + + if ($bUnsubscribeOnDeletion) + { + $this->oImapClient->FolderUnSubscribe($sFolderFullNameRaw); + } + + $this->oImapClient->FolderDelete($sFolderFullNameRaw); + + return $this; + } + + /** + * @param string $sFolderFullNameRaw + * + * @return \MailSo\Mail\MailClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public function FolderClear($sFolderFullNameRaw) + { + $this->oImapClient->FolderSelect($sFolderFullNameRaw); + + $oFolderInformation = $this->oImapClient->FolderCurrentInformation(); + if ($oFolderInformation && $oFolderInformation->Exists && 0 < $oFolderInformation->Exists) // STATUS? + { + $this->oImapClient->MessageStoreFlag('1:*', false, + array(\MailSo\Imap\Enumerations\MessageFlag::DELETED), + \MailSo\Imap\Enumerations\StoreAction::ADD_FLAGS_SILENT + ); + + $this->oImapClient->MessageExpunge(); + } + + return $this; + } + + /** + * @param string $sFolderFullNameRaw + * @param bool $bSubscribe + * + * @return \MailSo\Mail\MailClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public function FolderSubscribe($sFolderFullNameRaw, $bSubscribe) + { + if (0 === \strlen($sFolderFullNameRaw)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $this->oImapClient->{($bSubscribe) ? 'FolderSubscribe' : 'FolderUnSubscribe'}($sFolderFullNameRaw); + + return $this; + } + + /** + * @param \MailSo\Log\Logger $oLogger + * + * @return \MailSo\Mail\MailClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public function SetLogger($oLogger) + { + if (!($oLogger instanceof \MailSo\Log\Logger)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $this->oLogger = $oLogger; + $this->oImapClient->SetLogger($this->oLogger); + + return $this; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Message.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Message.php new file mode 100755 index 00000000..9c1c5251 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Message.php @@ -0,0 +1,890 @@ +Clear(); + } + + /** + * @return \MailSo\Mail\Message + */ + public function Clear() + { + $this->sFolder = ''; + $this->iUid = 0; + $this->sSubject = ''; + $this->sMessageId = ''; + $this->sContentType = ''; + $this->iSize = 0; + $this->iInternalTimeStampInUTC = 0; + $this->iHeaderTimeStampInUTC = 0; + $this->sHeaderDate = ''; + $this->aFlags = array(); + $this->aFlagsLowerCase = array(); + + $this->oFrom = null; + $this->oSender = null; + $this->oReplyTo = null; + $this->oDeliveredTo = null; + $this->oTo = null; + $this->oCc = null; + $this->oBcc = null; + + $this->sPlain = ''; + $this->sHtml = ''; + + $this->oAttachments = null; + $this->aDraftInfo = null; + + $this->sInReplyTo = ''; + $this->sReferences = ''; + $this->aUnsubsribeLinks = array(); + + $this->iSensitivity = \MailSo\Mime\Enumerations\Sensitivity::NOTHING; + $this->iPriority = \MailSo\Mime\Enumerations\MessagePriority::NORMAL; + $this->sDeliveryReceipt = ''; + $this->sReadReceipt = ''; + + $this->aThreads = array(); + + $this->bTextPartIsTrimmed = false; + + $this->sPgpSignature = ''; + $this->bPgpSigned = false; + $this->bPgpEncrypted = false; + + return $this; + } + + /** + * @return \MailSo\Mail\Message + */ + public static function NewInstance() + { + return new self(); + } + + /** + * @return string + */ + public function Plain() + { + return $this->sPlain; + } + + /** + * @return string + */ + public function Html() + { + return $this->sHtml; + } + + /** + * @return string + */ + public function PgpSignature() + { + return $this->sPgpSignature; + } + + /** + * @return bool + */ + public function PgpSigned() + { + return $this->bPgpSigned; + } + + /** + * @return bool + */ + public function PgpEncrypted() + { + return $this->bPgpEncrypted; + } + + /** + * @param string $sHtml + * + * @retun void + */ + public function SetHtml($sHtml) + { + $this->sHtml = $sHtml; + } + + /** + * @return string + */ + public function Folder() + { + return $this->sFolder; + } + + /** + * @return int + */ + public function Uid() + { + return $this->iUid; + } + + /** + * @return string + */ + public function MessageId() + { + return $this->sMessageId; + } + + /** + * @return string + */ + public function Subject() + { + return $this->sSubject; + } + + /** + * @return string + */ + public function ContentType() + { + return $this->sContentType; + } + + /** + * @return int + */ + public function Size() + { + return $this->iSize; + } + + /** + * @return int + */ + public function InternalTimeStampInUTC() + { + return $this->iInternalTimeStampInUTC; + } + + /** + * @return int + */ + public function HeaderTimeStampInUTC() + { + return $this->iHeaderTimeStampInUTC; + } + + /** + * @return string + */ + public function HeaderDate() + { + return $this->sHeaderDate; + } + + /** + * @return array + */ + public function Flags() + { + return $this->aFlags; + } + + /** + * @return array + */ + public function FlagsLowerCase() + { + return $this->aFlagsLowerCase; + } + + /** + * @return \MailSo\Mime\EmailCollection + */ + public function From() + { + return $this->oFrom; + } + + /** + * @return int + */ + public function Sensitivity() + { + return $this->iSensitivity; + } + + /** + * @return int + */ + public function Priority() + { + return $this->iPriority; + } + + /** + * @return \MailSo\Mime\EmailCollection + */ + public function Sender() + { + return $this->oSender; + } + + /** + * @return \MailSo\Mime\EmailCollection + */ + public function ReplyTo() + { + return $this->oReplyTo; + } + + /** + * @return \MailSo\Mime\EmailCollection + */ + public function DeliveredTo() + { + return $this->oDeliveredTo; + } + + /** + * @return \MailSo\Mime\EmailCollection + */ + public function To() + { + return $this->oTo; + } + + /** + * @return \MailSo\Mime\EmailCollection + */ + public function Cc() + { + return $this->oCc; + } + + /** + * @return \MailSo\Mime\EmailCollection + */ + public function Bcc() + { + return $this->oBcc; + } + + /** + * @return \MailSo\Mail\AttachmentCollection + */ + public function Attachments() + { + return $this->oAttachments; + } + + /** + * @return string + */ + public function InReplyTo() + { + return $this->sInReplyTo; + } + + /** + * @return string + */ + public function References() + { + return $this->sReferences; + } + + /** + * @return string + */ + public function DeliveryReceipt() + { + return $this->sDeliveryReceipt; + } + + /** + * @return string + */ + public function ReadReceipt() + { + return $this->sReadReceipt; + } + + /** + * @return array + */ + public function UnsubsribeLinks() + { + return $this->aUnsubsribeLinks; + } + + /** + * @return string + */ + public function ReadingConfirmation() + { + return $this->ReadReceipt(); + } + + /** + * @return array | null + */ + public function DraftInfo() + { + return $this->aDraftInfo; + } + + /** + * @return array + */ + public function Threads() + { + return $this->aThreads; + } + + /** + * @param array $aThreads + */ + public function SetThreads($aThreads) + { + $this->aThreads = \is_array($aThreads) ? $aThreads : array(); + } + + /** + * @return boole + */ + public function TextPartIsTrimmed() + { + return $this->bTextPartIsTrimmed; + } + + /** + * @param string $sFolder + * @param \MailSo\Imap\FetchResponse $oFetchResponse + * @param \MailSo\Imap\BodyStructure $oBodyStructure = null + * + * @return \MailSo\Mail\Message + */ + public static function NewFetchResponseInstance($sFolder, $oFetchResponse, $oBodyStructure = null) + { + return self::NewInstance()->InitByFetchResponse($sFolder, $oFetchResponse, $oBodyStructure); + } + + /** + * @param string $sFolder + * @param \MailSo\Imap\FetchResponse $oFetchResponse + * @param \MailSo\Imap\BodyStructure $oBodyStructure = null + * + * @return \MailSo\Mail\Message + */ + public function InitByFetchResponse($sFolder, $oFetchResponse, $oBodyStructure = null) + { + if (!$oBodyStructure) + { + $oBodyStructure = $oFetchResponse->GetFetchBodyStructure(); + } + + $sUid = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::UID); + $sSize = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::RFC822_SIZE); + $sInternalDate = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::INTERNALDATE); + $aFlags = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::FLAGS); + + $this->sFolder = $sFolder; + $this->iUid = \is_numeric($sUid) ? (int) $sUid : 0; + $this->iSize = \is_numeric($sSize) ? (int) $sSize : 0; + $this->aFlags = \is_array($aFlags) ? $aFlags : array(); + $this->aFlagsLowerCase = \array_map('strtolower', $this->aFlags); + + $this->iInternalTimeStampInUTC = + \MailSo\Base\DateTimeHelper::ParseInternalDateString($sInternalDate); + + $sCharset = $oBodyStructure ? $oBodyStructure->SearchCharset() : ''; + $sCharset = \MailSo\Base\Utils::NormalizeCharset($sCharset); + + $sHeaders = $oFetchResponse->GetHeaderFieldsValue(); + if (0 < \strlen($sHeaders)) + { + $oHeaders = \MailSo\Mime\HeaderCollection::NewInstance()->Parse($sHeaders, false, $sCharset); + + $sContentTypeCharset = $oHeaders->ParameterValue( + \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, + \MailSo\Mime\Enumerations\Parameter::CHARSET + ); + + if (0 < \strlen($sContentTypeCharset)) + { + $sCharset = $sContentTypeCharset; + $sCharset = \MailSo\Base\Utils::NormalizeCharset($sCharset); + } + + if (0 < \strlen($sCharset)) + { + $oHeaders->SetParentCharset($sCharset); + } + + $bCharsetAutoDetect = 0 === \strlen($sCharset); + + $this->sSubject = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::SUBJECT, $bCharsetAutoDetect); + $this->sMessageId = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::MESSAGE_ID); + $this->sContentType = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE); + + $this->oFrom = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::FROM_, $bCharsetAutoDetect); + $this->oTo = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::TO_, $bCharsetAutoDetect); + $this->oCc = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::CC, $bCharsetAutoDetect); + $this->oBcc = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::BCC, $bCharsetAutoDetect); + + $oHeaders->PopulateEmailColectionByDkim($this->oFrom); + + $this->oSender = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::SENDER, $bCharsetAutoDetect); + $this->oReplyTo = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::REPLY_TO, $bCharsetAutoDetect); + $this->oDeliveredTo = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::DELIVERED_TO, $bCharsetAutoDetect); + + $this->sInReplyTo = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::IN_REPLY_TO); + $this->sReferences = \MailSo\Base\Utils::StripSpaces( + $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::REFERENCES)); + + $sHeaderDate = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::DATE); + $this->sHeaderDate = $sHeaderDate; + $this->iHeaderTimeStampInUTC = \MailSo\Base\DateTimeHelper::ParseRFC2822DateString($sHeaderDate); + + // Sensitivity + $this->iSensitivity = \MailSo\Mime\Enumerations\Sensitivity::NOTHING; + $sSensitivity = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::SENSITIVITY); + switch (\strtolower($sSensitivity)) + { + case 'personal': + $this->iSensitivity = \MailSo\Mime\Enumerations\Sensitivity::PERSONAL; + break; + case 'private': + $this->iSensitivity = \MailSo\Mime\Enumerations\Sensitivity::PRIVATE_; + break; + case 'company-confidential': + $this->iSensitivity = \MailSo\Mime\Enumerations\Sensitivity::CONFIDENTIAL; + break; + } + + // Priority + $this->iPriority = \MailSo\Mime\Enumerations\MessagePriority::NORMAL; + $sPriority = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_MSMAIL_PRIORITY); + if (0 === \strlen($sPriority)) + { + $sPriority = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::IMPORTANCE); + } + if (0 === \strlen($sPriority)) + { + $sPriority = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_PRIORITY); + } + if (0 < \strlen($sPriority)) + { + switch (\str_replace(' ', '', \strtolower($sPriority))) + { + case 'high': + case '1(highest)': + case '2(high)': + case '1': + case '2': + $this->iPriority = \MailSo\Mime\Enumerations\MessagePriority::HIGH; + break; + + case 'low': + case '4(low)': + case '5(lowest)': + case '4': + case '5': + $this->iPriority = \MailSo\Mime\Enumerations\MessagePriority::LOW; + break; + } + } + + // Delivery Receipt + $this->sDeliveryReceipt = \trim($oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::RETURN_RECEIPT_TO)); + + // Read Receipt + $this->sReadReceipt = \trim($oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::DISPOSITION_NOTIFICATION_TO)); + if (empty($this->sReadReceipt)) + { + $this->sReadReceipt = \trim($oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_CONFIRM_READING_TO)); + } + + //Unsubscribe links + $this->aUnsubsribeLinks = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::LIST_UNSUBSCRIBE); + if (empty($this->aUnsubsribeLinks)) + { + $this->aUnsubsribeLinks = array(); + } + else + { + $this->aUnsubsribeLinks = explode(',', $this->aUnsubsribeLinks); + $this->aUnsubsribeLinks = array_map( + function ($link) { + return trim($link, ' <>'); + }, + $this->aUnsubsribeLinks + ); + } + + $sDraftInfo = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_DRAFT_INFO); + if (0 < \strlen($sDraftInfo)) + { + $sType = ''; + $sFolder = ''; + $sUid = ''; + + \MailSo\Mime\ParameterCollection::NewInstance($sDraftInfo) + ->ForeachList(function ($oParameter) use (&$sType, &$sFolder, &$sUid) { + + switch (\strtolower($oParameter->Name())) + { + case 'type': + $sType = $oParameter->Value(); + break; + case 'uid': + $sUid = $oParameter->Value(); + break; + case 'folder': + $sFolder = \base64_decode($oParameter->Value()); + break; + } + }) + ; + + if (0 < \strlen($sType) && 0 < \strlen($sFolder) && 0 < \strlen($sUid)) + { + $this->aDraftInfo = array($sType, $sUid, $sFolder); + } + } + } + else if ($oFetchResponse->GetEnvelope()) + { + if (0 === \strlen($sCharset) && $oBodyStructure) + { + $sCharset = $oBodyStructure->SearchCharset(); + $sCharset = \MailSo\Base\Utils::NormalizeCharset($sCharset); + } + + if (0 === \strlen($sCharset)) + { + $sCharset = \MailSo\Base\Enumerations\Charset::ISO_8859_1; + } + + // date, subject, from, sender, reply-to, to, cc, bcc, in-reply-to, message-id + $this->sMessageId = $oFetchResponse->GetFetchEnvelopeValue(9, ''); + $this->sSubject = \MailSo\Base\Utils::DecodeHeaderValue($oFetchResponse->GetFetchEnvelopeValue(1, ''), $sCharset); + + $this->oFrom = $oFetchResponse->GetFetchEnvelopeEmailCollection(2, $sCharset); + $this->oSender = $oFetchResponse->GetFetchEnvelopeEmailCollection(3, $sCharset); + $this->oReplyTo = $oFetchResponse->GetFetchEnvelopeEmailCollection(4, $sCharset); + $this->oTo = $oFetchResponse->GetFetchEnvelopeEmailCollection(5, $sCharset); + $this->oCc = $oFetchResponse->GetFetchEnvelopeEmailCollection(6, $sCharset); + $this->oBcc = $oFetchResponse->GetFetchEnvelopeEmailCollection(7, $sCharset); + $this->sInReplyTo = $oFetchResponse->GetFetchEnvelopeValue(8, ''); + } + + $aTextParts = $oBodyStructure ? $oBodyStructure->SearchHtmlOrPlainParts() : null; + if (\is_array($aTextParts) && 0 < \count($aTextParts)) + { + if (0 === \strlen($sCharset)) + { + $sCharset = \MailSo\Base\Enumerations\Charset::UTF_8; + } + + $aHtmlParts = array(); + $aPlainParts = array(); + + foreach ($aTextParts as $oPart) + { + $sText = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::BODY.'['.$oPart->PartID().']'); + if (null === $sText) + { + $sText = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::BODY.'['.$oPart->PartID().']<0>'); + if (\is_string($sText) && 0 < \strlen($sText)) + { + $this->bTextPartIsTrimmed = true; + } + } + + if (\is_string($sText) && 0 < \strlen($sText)) + { + $sTextCharset = $oPart->Charset(); + if (empty($sTextCharset)) + { + $sTextCharset = $sCharset; + } + + $sTextCharset = \MailSo\Base\Utils::NormalizeCharset($sTextCharset, true); + + $sText = \MailSo\Base\Utils::DecodeEncodingValue($sText, $oPart->MailEncodingName()); + $sText = \MailSo\Base\Utils::ConvertEncoding($sText, $sTextCharset, \MailSo\Base\Enumerations\Charset::UTF_8); + $sText = \MailSo\Base\Utils::Utf8Clear($sText); + + if ('text/html' === $oPart->ContentType()) + { + $aHtmlParts[] = $sText; + } + else + { + if ($oPart->IsFlowedFormat()) + { + $sText = \MailSo\Base\Utils::DecodeFlowedFormat($sText); + } + + $aPlainParts[] = $sText; + } + } + } + + if (0 < \count($aHtmlParts)) + { + $this->sHtml = \implode('
', $aHtmlParts); + } + else + { + $this->sPlain = \trim(\implode("\n", $aPlainParts)); + } + + $aMatch = array(); + if (\preg_match('/-----BEGIN PGP SIGNATURE-----(.+)-----END PGP SIGNATURE-----/ism', $this->sPlain, $aMatch) && !empty($aMatch[0])) + { + $this->sPgpSignature = \trim($aMatch[0]); + $this->bPgpSigned = true; + } + + $aMatch = array(); + if (\preg_match('/-----BEGIN PGP MESSAGE-----/ism', $this->sPlain, $aMatch) && !empty($aMatch[0])) + { + $this->bPgpEncrypted = true; + } + + unset($aHtmlParts, $aPlainParts, $aMatch); + } + +// if (empty($this->sPgpSignature) && 'multipart/signed' === \strtolower($this->sContentType) && +// 'application/pgp-signature' === \strtolower($oHeaders->ParameterValue( +// \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, +// \MailSo\Mime\Enumerations\Parameter::PROTOCOL +// ))) +// { +// $aPgpSignatureParts = $oBodyStructure ? $oBodyStructure->SearchByContentType('application/pgp-signature') : null; +// if (\is_array($aPgpSignatureParts) && 0 < \count($aPgpSignatureParts) && isset($aPgpSignatureParts[0])) +// { +// $sPgpSignatureText = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::BODY.'['.$aPgpSignatureParts[0]->PartID().']'); +// if (\is_string($sPgpSignatureText) && 0 < \strlen($sPgpSignatureText) && 0 < \strpos($sPgpSignatureText, 'BEGIN PGP SIGNATURE')) +// { +// $this->sPgpSignature = \trim($sPgpSignatureText); +// $this->bPgpSigned = true; +// } +// } +// } + + if ($oBodyStructure) + { + $aAttachmentsParts = $oBodyStructure->SearchAttachmentsParts(); + if ($aAttachmentsParts && 0 < count($aAttachmentsParts)) + { + $this->oAttachments = AttachmentCollection::NewInstance(); + foreach ($aAttachmentsParts as /* @var $oAttachmentItem \MailSo\Imap\BodyStructure */ $oAttachmentItem) + { + $this->oAttachments->Add( + \MailSo\Mail\Attachment::NewBodyStructureInstance($this->sFolder, $this->iUid, $oAttachmentItem) + ); + } + } + } + + return $this; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/MessageCollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/MessageCollection.php new file mode 100755 index 00000000..427a18ca --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/MessageCollection.php @@ -0,0 +1,123 @@ +Clear(); + } + + /** + * @return \MailSo\Mail\MessageCollection + */ + public static function NewInstance() + { + return new self(); + } + + /** + * @return \MailSo\Mail\MessageCollection + */ + public function Clear() + { + parent::Clear(); + + $this->FolderHash = ''; + + $this->MessageCount = 0; + $this->MessageUnseenCount = 0; + $this->MessageResultCount = 0; + + $this->FolderName = ''; + $this->Offset = 0; + $this->Limit = 0; + $this->Search = ''; + $this->UidNext = ''; + $this->ThreadUid = ''; + $this->NewMessages = array(); + + $this->Filtered = false; + + return $this; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/MailSo.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/MailSo.php new file mode 100755 index 00000000..aa294dca --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/MailSo.php @@ -0,0 +1,40 @@ +rResource = $rResource; + $this->sFileName = $sFileName; + $this->iFileSize = $iFileSize; + $this->bIsInline = $bIsInline; + $this->bIsLinked = $bIsLinked; + $this->sCID = $sCID; + $this->aCustomContentTypeParams = $aCustomContentTypeParams; + $this->sContentLocation = $sContentLocation; + } + + /** + * @param resource $rResource + * @param string $sFileName = '' + * @param int $iFileSize = 0 + * @param bool $bIsInline = false + * @param bool $bIsLinked = false + * @param string $sCID = '' + * @param array $aCustomContentTypeParams = array() + * @param string $sContentLocation = '' + * + * @return \MailSo\Mime\Attachment + */ + public static function NewInstance($rResource, $sFileName = '', $iFileSize = 0, $bIsInline = false, + $bIsLinked = false, $sCID = '', $aCustomContentTypeParams = array(), $sContentLocation = '') + { + return new self($rResource, $sFileName, $iFileSize, $bIsInline, $bIsLinked, $sCID, $aCustomContentTypeParams, $sContentLocation); + } + + /** + * @return resource + */ + public function Resource() + { + return $this->rResource; + } + + /** + * @return string + */ + public function ContentType() + { + return \MailSo\Base\Utils::MimeContentType($this->sFileName); + } + + /** + * @return array + */ + public function CustomContentTypeParams() + { + return $this->aCustomContentTypeParams; + } + + /** + * @return string + */ + public function CID() + { + return $this->sCID; + } + + /** + * @return string + */ + public function ContentLocation() + { + return $this->sContentLocation; + } + + /** + * @return string + */ + public function FileName() + { + return $this->sFileName; + } + + /** + * @return int + */ + public function FileSize() + { + return $this->iFileSize; + } + + /** + * @return bool + */ + public function IsInline() + { + return $this->bIsInline; + } + + /** + * @return bool + */ + public function IsImage() + { + return 'image' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); + } + + /** + * @return bool + */ + public function IsArchive() + { + return 'archive' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); + } + + /** + * @return bool + */ + public function IsPdf() + { + return 'pdf' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); + } + + /** + * @return bool + */ + public function IsDoc() + { + return 'doc' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); + } + + /** + * @return bool + */ + public function IsLinked() + { + return $this->bIsLinked && 0 < \strlen($this->sCID); + } +} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/AttachmentCollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/AttachmentCollection.php new file mode 100755 index 00000000..68376fd7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/AttachmentCollection.php @@ -0,0 +1,71 @@ +FilterList(function ($oItem) { + return $oItem && $oItem->IsLinked(); + }); + } + + /** + * @return array + */ + public function UnlinkedAttachments() + { + return $this->FilterList(function ($oItem) { + return $oItem && !$oItem->IsLinked(); + }); + } + + /** + * @return int + */ + public function SizeOfAttachments() + { + $iResult = 0; + $this->ForeachList(function ($oItem) use (&$iResult) { + if ($oItem) + { + $iResult += $oItem->FileSize(); + } + }); + + return $iResult; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Email.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Email.php new file mode 100755 index 00000000..9dd393f5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Email.php @@ -0,0 +1,315 @@ +sEmail = \MailSo\Base\Utils::IdnToAscii( + \MailSo\Base\Utils::Trim($sEmail), true); + + $this->sDisplayName = \MailSo\Base\Utils::Trim($sDisplayName); + + $this->sDkimStatus = \MailSo\Mime\Enumerations\DkimStatus::NONE; + $this->sDkimValue = ''; + } + + /** + * @param string $sEmail + * @param string $sDisplayName = '' + * + * @return \MailSo\Mime\Email + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public static function NewInstance($sEmail, $sDisplayName = '') + { + return new self($sEmail, $sDisplayName); + } + + /** + * @param string $sEmailAddress + * @return \MailSo\Mime\Email + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public static function Parse($sEmailAddress) + { + $sEmailAddress = \MailSo\Base\Utils::Trim($sEmailAddress); + if (!\MailSo\Base\Validator::NotEmptyString($sEmailAddress, true)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $sName = ''; + $sEmail = ''; + $sComment = ''; + + $bInName = false; + $bInAddress = false; + $bInComment = false; + + $iStartIndex = 0; + $iEndIndex = 0; + $iCurrentIndex = 0; + + while ($iCurrentIndex < \strlen($sEmailAddress)) + { + switch ($sEmailAddress{$iCurrentIndex}) + { +// case '\'': + case '"': +// $sQuoteChar = $sEmailAddress{$iCurrentIndex}; + if ((!$bInName) && (!$bInAddress) && (!$bInComment)) + { + $bInName = true; + $iStartIndex = $iCurrentIndex; + } + else if ((!$bInAddress) && (!$bInComment)) + { + $iEndIndex = $iCurrentIndex; + $sName = \substr($sEmailAddress, $iStartIndex + 1, $iEndIndex - $iStartIndex - 1); + $sEmailAddress = \substr_replace($sEmailAddress, '', $iStartIndex, $iEndIndex - $iStartIndex + 1); + $iEndIndex = 0; + $iCurrentIndex = 0; + $iStartIndex = 0; + $bInName = false; + } + break; + case '<': + if ((!$bInName) && (!$bInAddress) && (!$bInComment)) + { + if ($iCurrentIndex > 0 && \strlen($sName) === 0) + { + $sName = \substr($sEmailAddress, 0, $iCurrentIndex); + } + + $bInAddress = true; + $iStartIndex = $iCurrentIndex; + } + break; + case '>': + if ($bInAddress) + { + $iEndIndex = $iCurrentIndex; + $sEmail = \substr($sEmailAddress, $iStartIndex + 1, $iEndIndex - $iStartIndex - 1); + $sEmailAddress = \substr_replace($sEmailAddress, '', $iStartIndex, $iEndIndex - $iStartIndex + 1); + $iEndIndex = 0; + $iCurrentIndex = 0; + $iStartIndex = 0; + $bInAddress = false; + } + break; + case '(': + if ((!$bInName) && (!$bInAddress) && (!$bInComment)) + { + $bInComment = true; + $iStartIndex = $iCurrentIndex; + } + break; + case ')': + if ($bInComment) + { + $iEndIndex = $iCurrentIndex; + $sComment = \substr($sEmailAddress, $iStartIndex + 1, $iEndIndex - $iStartIndex - 1); + $sEmailAddress = \substr_replace($sEmailAddress, '', $iStartIndex, $iEndIndex - $iStartIndex + 1); + $iEndIndex = 0; + $iCurrentIndex = 0; + $iStartIndex = 0; + $bInComment = false; + } + break; + case '\\': + $iCurrentIndex++; + break; + } + + $iCurrentIndex++; + } + + if (\strlen($sEmail) === 0) + { + $aRegs = array(''); + if (\preg_match('/[^@\s]+@\S+/i', $sEmailAddress, $aRegs) && isset($aRegs[0])) + { + $sEmail = $aRegs[0]; + } + else + { + $sName = $sEmailAddress; + } + } + + if ((\strlen($sEmail) > 0) && (\strlen($sName) == 0) && (\strlen($sComment) == 0)) + { + $sName = \str_replace($sEmail, '', $sEmailAddress); + } + + $sEmail = \trim(\trim($sEmail), '<>'); + $sEmail = \rtrim(\trim($sEmail), '.'); + $sEmail = \trim($sEmail); + + $sName = \trim(\trim($sName), '"'); + $sName = \trim($sName, '\''); + $sComment = \trim(\trim($sComment), '()'); + + // Remove backslash + $sName = \preg_replace('/\\\\(.)/s', '$1', $sName); + $sComment = \preg_replace('/\\\\(.)/s', '$1', $sComment); + + return Email::NewInstance($sEmail, $sName); + } + + /** + * @param bool $bIdn = false + * + * @return string + */ + public function GetEmail($bIdn = false) + { + return $bIdn ? \MailSo\Base\Utils::IdnToUtf8($this->sEmail) : $this->sEmail; + } + + /** + * @return string + */ + public function GetDisplayName() + { + return $this->sDisplayName; + } + + /** + * @return string + */ + public function GetDkimStatus() + { + return $this->sDkimStatus; + } + + /** + * @return string + */ + public function GetDkimValue() + { + return $this->sDkimValue; + } + + /** + * @return string + */ + public function GetAccountName() + { + return \MailSo\Base\Utils::GetAccountNameFromEmail($this->GetEmail(false)); + } + + /** + * @param bool $bIdn = false + * + * @return string + */ + public function GetDomain($bIdn = false) + { + return \MailSo\Base\Utils::GetDomainFromEmail($this->GetEmail($bIdn)); + } + + /** + * @param string $sDkimStatus + * @param string $sDkimValue = '' + */ + public function SetDkimStatusAndValue($sDkimStatus, $sDkimValue = '') + { + $this->sDkimStatus = \MailSo\Mime\Enumerations\DkimStatus::normalizeValue($sDkimStatus); + $this->sDkimValue = $sDkimValue; + } + + /** + * @param bool $bIdn = false + * @param bool $bDkim = true + * + * @return array + */ + public function ToArray($bIdn = false, $bDkim = true) + { + return $bDkim ? + array($this->sDisplayName, $this->GetEmail($bIdn), $this->sDkimStatus, $this->sDkimValue) : + array($this->sDisplayName, $this->GetEmail($bIdn)); + } + + /** + * @param bool $bConvertSpecialsName = false + * @param bool $bIdn = false + * + * @return string + */ + public function ToString($bConvertSpecialsName = false, $bIdn = false) + { + $sReturn = ''; + + $sDisplayName = \str_replace('"', '\"', $this->sDisplayName); + if ($bConvertSpecialsName) + { + $sDisplayName = 0 === \strlen($sDisplayName) ? '' : \MailSo\Base\Utils::EncodeUnencodedValue( + \MailSo\Base\Enumerations\Encoding::BASE64_SHORT, + $sDisplayName); + } + + $sDisplayName = 0 === \strlen($sDisplayName) ? '' : '"'.$sDisplayName.'"'; + if (0 < \strlen($this->sEmail)) + { + $sReturn = $this->GetEmail($bIdn); + if (0 < \strlen($sDisplayName)) + { + $sReturn = $sDisplayName.' <'.$sReturn.'>'; + } + } + + return \trim($sReturn); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/EmailCollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/EmailCollection.php new file mode 100755 index 00000000..53e5db39 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/EmailCollection.php @@ -0,0 +1,243 @@ +parseEmailAddresses($sEmailAddresses); + } + } + + /** + * @param string $sEmailAddresses = '' + * + * @return \MailSo\Mime\EmailCollection + */ + public static function NewInstance($sEmailAddresses = '') + { + return new self($sEmailAddresses); + } + + /** + * @param string $sEmailAddresses + * + * @return \MailSo\Mime\EmailCollection + */ + public static function Parse($sEmailAddresses) + { + return self::NewInstance($sEmailAddresses); + } + + /** + * @return array + */ + public function ToArray() + { + $aReturn = $aEmails = array(); + $aEmails =& $this->GetAsArray(); + foreach ($aEmails as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) + { + $aReturn[] = $oEmail->ToArray(); + } + + return $aReturn; + } + + /** + * @param \MailSo\Mime\EmailCollection $oEmails + * + * @return \MailSo\Mime\EmailCollection + */ + public function MergeWithOtherCollection(\MailSo\Mime\EmailCollection $oEmails) + { + $aEmails =& $oEmails->GetAsArray(); + foreach ($aEmails as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) + { + $this->Add($oEmail); + } + + return $this; + } + + /** + * @return \MailSo\Mime\EmailCollection + */ + public function Unique() + { + $aCache = array(); + $aReturn = array(); + + $aEmails =& $this->GetAsArray(); + foreach ($aEmails as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) + { + $sEmail = $oEmail->GetEmail(); + if (!isset($aCache[$sEmail])) + { + $aCache[$sEmail] = true; + $aReturn[] = $oEmail; + } + } + + $this->SetAsArray($aReturn); + + return $this; + } + + /** + * @param bool $bConvertSpecialsName = false + * @param bool $bIdn = false + * + * @return string + */ + public function ToString($bConvertSpecialsName = false, $bIdn = false) + { + $aReturn = $aEmails = array(); + $aEmails =& $this->GetAsArray(); + foreach ($aEmails as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) + { + $aReturn[] = $oEmail->ToString($bConvertSpecialsName, $bIdn); + } + + return \implode(', ', $aReturn); + } + + /** + * @param string $sRawEmails + * + * @return \MailSo\Mime\EmailCollection + */ + private function parseEmailAddresses($sRawEmails) + { + $this->Clear(); + + $sWorkingRecipients = \trim($sRawEmails); + + if (0 === \strlen($sWorkingRecipients)) + { + return $this; + } + + $iEmailStartPos = 0; + $iEmailEndPos = 0; + + $bIsInQuotes = false; + $sChQuote = '"'; + $bIsInAngleBrackets = false; + $bIsInBrackets = false; + + $iCurrentPos = 0; + + $sWorkingRecipientsLen = \strlen($sWorkingRecipients); + + while ($iCurrentPos < $sWorkingRecipientsLen) + { + switch ($sWorkingRecipients{$iCurrentPos}) + { + case '\'': + case '"': + if (!$bIsInQuotes) + { + $sChQuote = $sWorkingRecipients{$iCurrentPos}; + $bIsInQuotes = true; + } + else if ($sChQuote == $sWorkingRecipients{$iCurrentPos}) + { + $bIsInQuotes = false; + } + break; + + case '<': + if (!$bIsInAngleBrackets) + { + $bIsInAngleBrackets = true; + if ($bIsInQuotes) + { + $bIsInQuotes = false; + } + } + break; + + case '>': + if ($bIsInAngleBrackets) + { + $bIsInAngleBrackets = false; + } + break; + + case '(': + if (!$bIsInBrackets) + { + $bIsInBrackets = true; + } + break; + + case ')': + if ($bIsInBrackets) + { + $bIsInBrackets = false; + } + break; + + case ',': + case ';': + if (!$bIsInAngleBrackets && !$bIsInBrackets && !$bIsInQuotes) + { + $iEmailEndPos = $iCurrentPos; + + try + { + $this->Add( + \MailSo\Mime\Email::Parse(\substr($sWorkingRecipients, $iEmailStartPos, $iEmailEndPos - $iEmailStartPos)) + ); + + $iEmailStartPos = $iCurrentPos + 1; + } + catch (\MailSo\Base\Exceptions\InvalidArgumentException $oException) + { + } + } + break; + } + + $iCurrentPos++; + } + + if ($iEmailStartPos < $iCurrentPos) + { + try + { + $this->Add( + \MailSo\Mime\Email::Parse(\substr($sWorkingRecipients, $iEmailStartPos, $iCurrentPos - $iEmailStartPos)) + ); + } + catch (\MailSo\Base\Exceptions\InvalidArgumentException $oException) {} + } + + return $this; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/EmailDep.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/EmailDep.php new file mode 100755 index 00000000..64173bed --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/EmailDep.php @@ -0,0 +1,339 @@ +sEmail = \MailSo\Base\Utils::IdnToAscii( + \MailSo\Base\Utils::Trim($sEmail), true); + + $this->sDisplayName = \MailSo\Base\Utils::Trim($sDisplayName); + $this->sRemark = \MailSo\Base\Utils::Trim($sRemark); + + $this->sDkimStatus = \MailSo\Mime\Enumerations\DkimStatus::NONE; + $this->sDkimValue = ''; + } + + /** + * @param string $sEmail + * @param string $sDisplayName = '' + * @param string $sRemark = '' + * + * @return \MailSo\Mime\Email + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public static function NewInstance($sEmail, $sDisplayName = '', $sRemark = '') + { + return new self($sEmail, $sDisplayName, $sRemark); + } + + /** + * @param string $sEmailAddress + * @return \MailSo\Mime\Email + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public static function Parse($sEmailAddress) + { + $sEmailAddress = \MailSo\Base\Utils::Trim($sEmailAddress); + if (!\MailSo\Base\Validator::NotEmptyString($sEmailAddress, true)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $sName = ''; + $sEmail = ''; + $sComment = ''; + + $bInName = false; + $bInAddress = false; + $bInComment = false; + + $iStartIndex = 0; + $iEndIndex = 0; + $iCurrentIndex = 0; + + while ($iCurrentIndex < \strlen($sEmailAddress)) + { + switch ($sEmailAddress{$iCurrentIndex}) + { +// case '\'': + case '"': +// $sQuoteChar = $sEmailAddress{$iCurrentIndex}; + if ((!$bInName) && (!$bInAddress) && (!$bInComment)) + { + $bInName = true; + $iStartIndex = $iCurrentIndex; + } + else if ((!$bInAddress) && (!$bInComment)) + { + $iEndIndex = $iCurrentIndex; + $sName = \substr($sEmailAddress, $iStartIndex + 1, $iEndIndex - $iStartIndex - 1); + $sEmailAddress = \substr_replace($sEmailAddress, '', $iStartIndex, $iEndIndex - $iStartIndex + 1); + $iEndIndex = 0; + $iCurrentIndex = 0; + $iStartIndex = 0; + $bInName = false; + } + break; + case '<': + if ((!$bInName) && (!$bInAddress) && (!$bInComment)) + { + if ($iCurrentIndex > 0 && \strlen($sName) === 0) + { + $sName = \substr($sEmailAddress, 0, $iCurrentIndex); + } + + $bInAddress = true; + $iStartIndex = $iCurrentIndex; + } + break; + case '>': + if ($bInAddress) + { + $iEndIndex = $iCurrentIndex; + $sEmail = \substr($sEmailAddress, $iStartIndex + 1, $iEndIndex - $iStartIndex - 1); + $sEmailAddress = \substr_replace($sEmailAddress, '', $iStartIndex, $iEndIndex - $iStartIndex + 1); + $iEndIndex = 0; + $iCurrentIndex = 0; + $iStartIndex = 0; + $bInAddress = false; + } + break; + case '(': + if ((!$bInName) && (!$bInAddress) && (!$bInComment)) + { + $bInComment = true; + $iStartIndex = $iCurrentIndex; + } + break; + case ')': + if ($bInComment) + { + $iEndIndex = $iCurrentIndex; + $sComment = \substr($sEmailAddress, $iStartIndex + 1, $iEndIndex - $iStartIndex - 1); + $sEmailAddress = \substr_replace($sEmailAddress, '', $iStartIndex, $iEndIndex - $iStartIndex + 1); + $iEndIndex = 0; + $iCurrentIndex = 0; + $iStartIndex = 0; + $bInComment = false; + } + break; + case '\\': + $iCurrentIndex++; + break; + } + + $iCurrentIndex++; + } + + if (\strlen($sEmail) === 0) + { + $aRegs = array(''); + if (\preg_match('/[^@\s]+@\S+/i', $sEmailAddress, $aRegs) && isset($aRegs[0])) + { + $sEmail = $aRegs[0]; + } + else + { + $sName = $sEmailAddress; + } + } + + if ((\strlen($sEmail) > 0) && (\strlen($sName) == 0) && (\strlen($sComment) == 0)) + { + $sName = \str_replace($sEmail, '', $sEmailAddress); + } + + $sEmail = \trim(\trim($sEmail), '<>'); + $sEmail = \rtrim(\trim($sEmail), '.'); + $sEmail = \trim($sEmail); + + $sName = \trim(\trim($sName), '"'); + $sName = \trim($sName, '\''); + $sComment = \trim(\trim($sComment), '()'); + + // Remove backslash + $sName = \preg_replace('/\\\\(.)/s', '$1', $sName); + $sComment = \preg_replace('/\\\\(.)/s', '$1', $sComment); + + return Email::NewInstance($sEmail, $sName, $sComment); + } + + /** + * @param bool $bIdn = false + * + * @return string + */ + public function GetEmail($bIdn = false) + { + return $bIdn ? \MailSo\Base\Utils::IdnToUtf8($this->sEmail) : $this->sEmail; + } + + /** + * @return string + */ + public function GetDisplayName() + { + return $this->sDisplayName; + } + + /** + * @return string + */ + public function GetRemark() + { + return $this->sRemark; + } + + /** + * @return string + */ + public function GetDkimStatus() + { + return $this->sDkimStatus; + } + + /** + * @return string + */ + public function GetDkimValue() + { + return $this->sDkimValue; + } + + /** + * @return string + */ + public function GetAccountName() + { + return \MailSo\Base\Utils::GetAccountNameFromEmail($this->GetEmail(false)); + } + + /** + * @param bool $bIdn = false + * + * @return string + */ + public function GetDomain($bIdn = false) + { + return \MailSo\Base\Utils::GetDomainFromEmail($this->GetEmail($bIdn)); + } + + /** + * @param string $sDkimStatus + * @param string $sDkimValue = '' + */ + public function SetDkimStatusAndValue($sDkimStatus, $sDkimValue = '') + { + $this->sDkimStatus = \MailSo\Mime\Enumerations\DkimStatus::normalizeValue($sDkimStatus); + $this->sDkimValue = $sDkimValue; + } + + /** + * @param bool $bIdn = false + * @param bool $bDkim = true + * + * @return array + */ + public function ToArray($bIdn = false, $bDkim = true) + { + return $bDkim ? array($this->sDisplayName, $this->GetEmail($bIdn), $this->sRemark, $this->sDkimStatus, $this->sDkimValue) : + array($this->sDisplayName, $this->GetEmail($bIdn), $this->sRemark); + } + + /** + * @param bool $bConvertSpecialsName = false + * @param bool $bIdn = false + * + * @return string + */ + public function ToString($bConvertSpecialsName = false, $bIdn = false) + { + $sReturn = ''; + + $sRemark = \str_replace(')', '\)', $this->sRemark); + $sDisplayName = \str_replace('"', '\"', $this->sDisplayName); + + if ($bConvertSpecialsName) + { + $sDisplayName = 0 === \strlen($sDisplayName) ? '' : \MailSo\Base\Utils::EncodeUnencodedValue( + \MailSo\Base\Enumerations\Encoding::BASE64_SHORT, + $sDisplayName); + + $sRemark = 0 === \strlen($sRemark) ? '' : \MailSo\Base\Utils::EncodeUnencodedValue( + \MailSo\Base\Enumerations\Encoding::BASE64_SHORT, + $sRemark); + } + + $sDisplayName = 0 === \strlen($sDisplayName) ? '' : '"'.$sDisplayName.'"'; + $sRemark = 0 === \strlen($sRemark) ? '' : '('.$sRemark.')'; + + if (0 < \strlen($this->sEmail)) + { + $sReturn = $this->GetEmail($bIdn); + if (0 < \strlen($sDisplayName.$sRemark)) + { + $sReturn = $sDisplayName.' <'.$sReturn.'> '.$sRemark; + } + } + + return \trim($sReturn); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Enumerations/Constants.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Enumerations/Constants.php new file mode 100755 index 00000000..7f52ee89 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Enumerations/Constants.php @@ -0,0 +1,25 @@ +sParentCharset = $sParentCharset; + + $this->initInputData($sName, $sValue, $sEncodedValueForReparse); + } + + /** + * @param string $sName + * @param string $sValue + * @param string $sEncodedValueForReparse + * + * @return void + */ + private function initInputData($sName, $sValue, $sEncodedValueForReparse) + { + $this->sName = trim($sName); + $this->sFullValue = trim($sValue); + $this->sEncodedValueForReparse = ''; + + $this->oParameters = null; + if (0 < \strlen($sEncodedValueForReparse) && $this->IsReparsed()) + { + $this->sEncodedValueForReparse = \trim($sEncodedValueForReparse); + } + + if (0 < \strlen($this->sFullValue) && $this->IsParameterized()) + { + $aRawExplode = \explode(';', $this->sFullValue, 2); + if (2 === \count($aRawExplode)) + { + $this->sValue = $aRawExplode[0]; + $this->oParameters = + \MailSo\Mime\ParameterCollection::NewInstance($aRawExplode[1]); + } + else + { + $this->sValue = $this->sFullValue; + } + } + else + { + $this->sValue = $this->sFullValue; + } + } + + /** + * @param string $sName + * @param string $sValue = '' + * @param string $sEncodedValueForReparse = '' + * @param string $sParentCharset = '' + * + * @return \MailSo\Mime\Header + */ + public static function NewInstance($sName, $sValue = '', $sEncodedValueForReparse = '', $sParentCharset = '') + { + return new self($sName, $sValue, $sEncodedValueForReparse, $sParentCharset); + } + + /** + * @param string $sEncodedLines + * @param string $sIncomingCharset = \MailSo\Base\Enumerations\Charset::ISO_8859_1 + * + * @return \MailSo\Mime\Header | false + */ + public static function NewInstanceFromEncodedString($sEncodedLines, $sIncomingCharset = \MailSo\Base\Enumerations\Charset::ISO_8859_1) + { + if (empty($sIncomingCharset)) + { + $sIncomingCharset = \MailSo\Base\Enumerations\Charset::ISO_8859_1; + } + + $aParts = \explode(':', \str_replace("\r", '', $sEncodedLines), 2); + if (isset($aParts[0]) && isset($aParts[1]) && 0 < \strlen($aParts[0]) && 0 < \strlen($aParts[1])) + { + return self::NewInstance( + \trim($aParts[0]), + \trim(\MailSo\Base\Utils::DecodeHeaderValue(\trim($aParts[1]), $sIncomingCharset)), + \trim($aParts[1]), + $sIncomingCharset + ); + } + + return false; + } + + /** + * @return string + */ + public function Name() + { + return $this->sName; + } + + /** + * @return string + */ + public function NameWithDelimitrom() + { + return $this->Name().': '; + } + + /** + * @return string + */ + public function Value() + { + return $this->sValue; + } + + /** + * @return string + */ + public function FullValue() + { + return $this->sFullValue; + } + + /** + * @param string $sParentCharset + * @return \MailSo\Mime\Header + */ + public function SetParentCharset($sParentCharset) + { + if ($this->sParentCharset !== $sParentCharset && $this->IsReparsed() && 0 < \strlen($this->sEncodedValueForReparse)) + { + $this->initInputData( + $this->sName, + \trim(\MailSo\Base\Utils::DecodeHeaderValue($this->sEncodedValueForReparse, $sParentCharset)), + $this->sEncodedValueForReparse + ); + } + + $this->sParentCharset = $sParentCharset; + + return $this; + } + + /** + * @return \MailSo\Mime\ParameterCollection | null + */ + public function Parameters() + { + return $this->oParameters; + } + + /** + * @param string $sValue + * @return string + */ + private function wordWrapHelper($sValue, $sGlue = "\r\n ") + { + return \trim(substr(wordwrap($this->NameWithDelimitrom().$sValue, + \MailSo\Mime\Enumerations\Constants::LINE_LENGTH, $sGlue + ), \strlen($this->NameWithDelimitrom()))); + } + + /** + * @return string + */ + public function EncodedValue() + { + $sResult = $this->sFullValue; + + if ($this->IsSubject()) + { + if (!\MailSo\Base\Utils::IsAscii($sResult) && + \MailSo\Base\Utils::IsIconvSupported() && + \function_exists('iconv_mime_encode')) + { + $aPreferences = array( +// 'scheme' => \MailSo\Base\Enumerations\Encoding::QUOTED_PRINTABLE_SHORT, + 'scheme' => \MailSo\Base\Enumerations\Encoding::BASE64_SHORT, + 'input-charset' => \MailSo\Base\Enumerations\Charset::UTF_8, + 'output-charset' => \MailSo\Base\Enumerations\Charset::UTF_8, + 'line-length' => \MailSo\Mime\Enumerations\Constants::LINE_LENGTH, + 'line-break-chars' => \MailSo\Mime\Enumerations\Constants::CRLF + ); + + return \iconv_mime_encode($this->Name(), $sResult, $aPreferences); + } + } + else if ($this->IsParameterized() && $this->oParameters && 0 < $this->oParameters->Count()) + { + $sResult = $this->sValue.'; '.$this->oParameters->ToString(true); + } + else if ($this->IsEmail()) + { + $oEmailCollection = \MailSo\Mime\EmailCollection::NewInstance($this->sFullValue); + if ($oEmailCollection && 0 < $oEmailCollection->Count()) + { + $sResult = $oEmailCollection->ToString(true, false); + } + } + + return $this->NameWithDelimitrom().$this->wordWrapHelper($sResult); + } + + /** + * @return bool + */ + public function IsSubject() + { + return \strtolower(\MailSo\Mime\Enumerations\Header::SUBJECT) === \strtolower($this->Name()); + } + + /** + * @return bool + */ + public function IsParameterized() + { + return \in_array(\strtolower($this->sName), array( + \strtolower(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE), + \strtolower(\MailSo\Mime\Enumerations\Header::CONTENT_DISPOSITION) + )); + } + + /** + * @return bool + */ + public function IsEmail() + { + return \in_array(\strtolower($this->sName), array( + \strtolower(\MailSo\Mime\Enumerations\Header::FROM_), + \strtolower(\MailSo\Mime\Enumerations\Header::TO_), + \strtolower(\MailSo\Mime\Enumerations\Header::CC), + \strtolower(\MailSo\Mime\Enumerations\Header::BCC), + \strtolower(\MailSo\Mime\Enumerations\Header::REPLY_TO), + \strtolower(\MailSo\Mime\Enumerations\Header::RETURN_PATH), + \strtolower(\MailSo\Mime\Enumerations\Header::SENDER) + )); + } + + /** + * @return string + */ + public function ValueWithCharsetAutoDetect() + { + $sValue = $this->Value(); + if (!\MailSo\Base\Utils::IsAscii($sValue) && + 0 < \strlen($this->sEncodedValueForReparse) && + !\MailSo\Base\Utils::IsAscii($this->sEncodedValueForReparse)) + { + $sValueCharset = \MailSo\Base\Utils::CharsetDetect($this->sEncodedValueForReparse); + if (0 < \strlen($sValueCharset)) + { + $this->SetParentCharset($sValueCharset); + $sValue = $this->Value(); + } + } + + return $sValue; + } + + /** + * @return bool + */ + public function IsReparsed() + { + return $this->IsEmail() || $this->IsSubject() || $this->IsParameterized(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/HeaderCollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/HeaderCollection.php new file mode 100755 index 00000000..180d5d57 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/HeaderCollection.php @@ -0,0 +1,480 @@ +sRawHeaders = ''; + $this->sParentCharset = ''; + + if (0 < \strlen($sRawHeaders)) + { + $this->Parse($sRawHeaders, $bStoreRawHeaders); + } + } + + /** + * @param string $sRawHeaders = '' + * @param bool $bStoreRawHeaders = true + * + * @return \MailSo\Mime\HeaderCollection + */ + public static function NewInstance($sRawHeaders = '', $bStoreRawHeaders = true) + { + return new self($sRawHeaders, $bStoreRawHeaders); + } + + /** + * @param string $sName + * @param string $sValue + * @param bool $bToTop = false + * + * @return \MailSo\Mime\HeaderCollection + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public function AddByName($sName, $sValue, $bToTop = false) + { + return $this->Add(Header::NewInstance($sName, $sValue), $bToTop); + } + + /** + * @param string $sName + * @param string $sValue + * @param bool $bToTop = false + * + * @return \MailSo\Mime\HeaderCollection + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public function SetByName($sName, $sValue, $bToTop = false) + { + return $this->RemoveByName($sName)->Add(Header::NewInstance($sName, $sValue), $bToTop); + } + + /** + * @return \MailSo\Mime\Header | null + */ + public function &GetByIndex($iIndex) + { + $mResult = null; + $mResult =& parent::GetByIndex($iIndex); + return $mResult; + } + + /** + * @param string $sHeaderName + * @param bool $bCharsetAutoDetect = false + * @return string + */ + public function ValueByName($sHeaderName, $bCharsetAutoDetect = false) + { + $oHeader = null; + $oHeader =& $this->GetByName($sHeaderName); + return (null !== $oHeader) ? ($bCharsetAutoDetect ? $oHeader->ValueWithCharsetAutoDetect() : $oHeader->Value()) : ''; + } + + /** + * @param string $sHeaderName + * @param bool $bCharsetAutoDetect = false + * @return array + */ + public function ValuesByName($sHeaderName, $bCharsetAutoDetect = false) + { + $aResult = array(); + $oHeader = null; + + $sHeaderNameLower = \strtolower($sHeaderName); + $aHeaders =& $this->GetAsArray(); + foreach ($aHeaders as /* @var $oHeader \MailSo\Mime\Header */ &$oHeader) + { + if ($sHeaderNameLower === \strtolower($oHeader->Name())) + { + $aResult[] = $bCharsetAutoDetect ? $oHeader->ValueWithCharsetAutoDetect() : $oHeader->Value(); + } + } + + return $aResult; + } + + /** + * @param string $sHeaderName + * + * @return \MailSo\Mime\HeaderCollection + */ + public function RemoveByName($sHeaderName) + { + $aResult = $this->FilterList(function ($oHeader) use ($sHeaderName) { + return $oHeader && \strtolower($oHeader->Name()) !== \strtolower($sHeaderName); + }); + + return $this->SetAsArray($aResult); + } + + /** + * @param string $sHeaderName + * @param bool $bCharsetAutoDetect = false + * + * @return \MailSo\Mime\EmailCollection|null + */ + public function GetAsEmailCollection($sHeaderName, $bCharsetAutoDetect = false) + { + $oResult = null; + $sValue = $this->ValueByName($sHeaderName, $bCharsetAutoDetect); + if (0 < \strlen($sValue)) + { + $oResult = \MailSo\Mime\EmailCollection::NewInstance($sValue); + } + + return $oResult && 0 < $oResult->Count() ? $oResult : null; + } + + /** + * @param string $sHeaderName + * @return \MailSo\Mime\ParameterCollection|null + */ + public function ParametersByName($sHeaderName) + { + $oParameters = $oHeader = null; + $oHeader =& $this->GetByName($sHeaderName); + if ($oHeader) + { + $oParameters = $oHeader->Parameters(); + } + + return $oParameters; + } + + /** + * @param string $sHeaderName + * @param string $sParamName + * @return string + */ + public function ParameterValue($sHeaderName, $sParamName) + { + $oParameters = $this->ParametersByName($sHeaderName); + return (null !== $oParameters) ? $oParameters->ParameterValueByName($sParamName) : ''; + } + + /** + * @param string $sHeaderName + * @return \MailSo\Mime\Header | false + */ + public function &GetByName($sHeaderName) + { + $oResult = $oHeader = null; + + $sHeaderNameLower = \strtolower($sHeaderName); + $aHeaders =& $this->GetAsArray(); + foreach ($aHeaders as /* @var $oHeader \MailSo\Mime\Header */ &$oHeader) + { + if ($sHeaderNameLower === \strtolower($oHeader->Name())) + { + $oResult =& $oHeader; + break; + } + } + + return $oResult; + } + + /** + * @param array $aList + * @return \MailSo\Mime\HeaderCollection + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public function SetAsArray($aList) + { + parent::SetAsArray($aList); + + return $this; + } + + /** + * @param string $sParentCharset + * @return \MailSo\Mime\HeaderCollection + */ + public function SetParentCharset($sParentCharset) + { + if (0 < \strlen($sParentCharset)) + { + if ($this->sParentCharset !== $sParentCharset) + { + $oHeader = null; + $aHeaders =& $this->GetAsArray(); + + foreach ($aHeaders as /* @var $oHeader \MailSo\Mime\Header */ &$oHeader) + { + $oHeader->SetParentCharset($sParentCharset); + } + + $this->sParentCharset = $sParentCharset; + } + } + + return $this; + } + + /** + * @return void + */ + public function Clear() + { + parent::Clear(); + + $this->sRawHeaders = ''; + } + + /** + * @param string $sRawHeaders + * @param bool $bStoreRawHeaders = false + * @param string $sParentCharset = '' + * + * @return \MailSo\Mime\HeaderCollection + */ + public function Parse($sRawHeaders, $bStoreRawHeaders = false, $sParentCharset = '') + { + $this->Clear(); + + if ($bStoreRawHeaders) + { + $this->sRawHeaders = $sRawHeaders; + } + + if (0 === \strlen($this->sParentCharset)) + { + $this->sParentCharset = $sParentCharset; + } + + $aHeaders = \explode("\n", \str_replace("\r", '', $sRawHeaders)); + + $sName = null; + $sValue = null; + foreach ($aHeaders as $sHeadersValue) + { + if (0 === strlen($sHeadersValue)) + { + continue; + } + + $sFirstChar = \substr($sHeadersValue, 0, 1); + if ($sFirstChar !== ' ' && $sFirstChar !== "\t" && false === \strpos($sHeadersValue, ':')) + { + continue; + } + else if (null !== $sName && ($sFirstChar === ' ' || $sFirstChar === "\t")) + { + $sValue = \is_null($sValue) ? '' : $sValue; + + if ('?=' === \substr(\rtrim($sHeadersValue), -2)) + { + $sHeadersValue = \rtrim($sHeadersValue); + } + + if ('=?' === \substr(\ltrim($sHeadersValue), 0, 2)) + { + $sHeadersValue = \ltrim($sHeadersValue); + } + + if ('=?' === \substr($sHeadersValue, 0, 2)) + { + $sValue .= $sHeadersValue; + } + else + { + $sValue .= "\n".$sHeadersValue; + } + } + else + { + if (null !== $sName) + { + $oHeader = Header::NewInstanceFromEncodedString($sName.': '.$sValue, $this->sParentCharset); + if ($oHeader) + { + $this->Add($oHeader); + } + + $sName = null; + $sValue = null; + } + + $aHeaderParts = \explode(':', $sHeadersValue, 2); + $sName = $aHeaderParts[0]; + $sValue = isset($aHeaderParts[1]) ? $aHeaderParts[1] : ''; + + if ('?=' === \substr(\rtrim($sValue), -2)) + { + $sValue = \rtrim($sValue); + } + } + } + + if (null !== $sName) + { + $oHeader = Header::NewInstanceFromEncodedString($sName.': '.$sValue, $this->sParentCharset); + if ($oHeader) + { + $this->Add($oHeader); + } + } + + return $this; + } + + /** + * @return int + */ + public function DkimStatuses() + { + $aResult = array(); + + $aHeaders = $this->ValuesByName(\MailSo\Mime\Enumerations\Header::AUTHENTICATION_RESULTS); + if (\is_array($aHeaders) && 0 < \count($aHeaders)) + { + foreach ($aHeaders as $sHeaderValue) + { + $sStatus = ''; + $sHeader = ''; + $sDkimLine = ''; + + $aMatch = array(); + + $sHeaderValue = \preg_replace('/[\r\n\t\s]+/', ' ', $sHeaderValue); + + if (\preg_match('/dkim=.+/i', $sHeaderValue, $aMatch) && !empty($aMatch[0])) + { + $sDkimLine = $aMatch[0]; + + $aMatch = array(); + if (\preg_match('/dkim=([a-zA-Z0-9]+)/i', $sDkimLine, $aMatch) && !empty($aMatch[1])) + { + $sStatus = $aMatch[1]; + } + + $aMatch = array(); + if (\preg_match('/header\.(d|i|from)=([^\s;]+)/i', $sDkimLine, $aMatch) && !empty($aMatch[2])) + { + $sHeader = \trim($aMatch[2]); + } + + if (!empty($sStatus) && !empty($sHeader)) + { + $aResult[] = array($sStatus, $sHeader, $sDkimLine); + } + } + } + } + else + { + // X-DKIM-Authentication-Results: signer="hostinger.com" status="pass" + $aHeaders = $this->ValuesByName(\MailSo\Mime\Enumerations\Header::X_DKIM_AUTHENTICATION_RESULTS); + if (\is_array($aHeaders) && 0 < \count($aHeaders)) + { + foreach ($aHeaders as $sHeaderValue) + { + $sStatus = ''; + $sHeader = ''; + + $aMatch = array(); + + $sHeaderValue = \preg_replace('/[\r\n\t\s]+/', ' ', $sHeaderValue); + + if (\preg_match('/status[\s]?=[\s]?"([a-zA-Z0-9]+)"/i', $sHeaderValue, $aMatch) && !empty($aMatch[1])) + { + $sStatus = $aMatch[1]; + } + + if (\preg_match('/signer[\s]?=[\s]?"([^";]+)"/i', $sHeaderValue, $aMatch) && !empty($aMatch[1])) + { + $sHeader = \trim($aMatch[1]); + } + + if (!empty($sStatus) && !empty($sHeader)) + { + $aResult[] = array($sStatus, $sHeader, $sHeaderValue); + } + } + } + } + + return $aResult; + } + + /** + * @return int + */ + public function PopulateEmailColectionByDkim($oEmails) + { + if ($oEmails && $oEmails instanceof \MailSo\Mime\EmailCollection) + { + $aDkimStatuses = $this->DkimStatuses(); + if (\is_array($aDkimStatuses) && 0 < \count($aDkimStatuses)) + { + $oEmails->ForeachList(function (/* @var $oItem \MailSo\Mime\Email */ $oItem) use ($aDkimStatuses) { + if ($oItem && $oItem instanceof \MailSo\Mime\Email) + { + $sEmail = $oItem->GetEmail(); + foreach ($aDkimStatuses as $aDkimData) + { + if (isset($aDkimData[0], $aDkimData[1]) && + $aDkimData[1] === \strstr($sEmail, $aDkimData[1])) + { + $oItem->SetDkimStatusAndValue($aDkimData[0], empty($aDkimData[2]) ? '' : $aDkimData[2]); + } + } + } + }); + } + } + } + + /** + * @return string + */ + public function ToEncodedString() + { + $aResult = array(); + $aHeaders =& $this->GetAsArray(); + foreach ($aHeaders as /* @var $oHeader \MailSo\Mime\Header */ &$oHeader) + { + $aResult[] = $oHeader->EncodedValue(); + } + + return \implode(\MailSo\Mime\Enumerations\Constants::CRLF, $aResult); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Message.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Message.php new file mode 100755 index 00000000..44dfa80b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Message.php @@ -0,0 +1,937 @@ +aHeadersValue = array(); + $this->aAlternativeParts = array(); + $this->oAttachmentCollection = AttachmentCollection::NewInstance(); + $this->bAddEmptyTextPart = true; + $this->bAddDefaultXMailer = true; + } + + /** + * @return \MailSo\Mime\Message + */ + public static function NewInstance() + { + return new self(); + } + + /** + * @return \MailSo\Mime\Message + */ + public function DoesNotCreateEmptyTextPart() + { + $this->bAddEmptyTextPart = false; + + return $this; + } + + /** + * @return \MailSo\Mime\Message + */ + public function DoesNotAddDefaultXMailer() + { + $this->bAddDefaultXMailer = false; + + return $this; + } + + /** + * @return string + */ + public function MessageId() + { + $sResult = ''; + if (!empty($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::MESSAGE_ID])) + { + $sResult = $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::MESSAGE_ID]; + } + return $sResult; + } + + /** + * @param string $sMessageId + * + * @return void + */ + public function SetMessageId($sMessageId) + { + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::MESSAGE_ID] = $sMessageId; + } + + /** + * @param string $sHostName = '' + * + * @return void + */ + public function RegenerateMessageId($sHostName = '') + { + $this->SetMessageId($this->generateNewMessageId($sHostName)); + } + + /** + * @return \MailSo\Mime\AttachmentCollection + */ + public function Attachments() + { + return $this->oAttachmentCollection; + } + + /** + * @return string + */ + public function GetSubject() + { + return isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::SUBJECT]) ? + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::SUBJECT] : ''; + } + + /** + * @return \MailSo\Mime\Email|null + */ + public function GetFrom() + { + $oResult = null; + + if (isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::FROM_]) && + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::FROM_] instanceof \MailSo\Mime\Email) + { + $oResult = $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::FROM_]; + } + + return $oResult; + } + + /** + * @return \MailSo\Mime\EmailCollection + */ + public function GetTo() + { + $oResult = \MailSo\Mime\EmailCollection::NewInstance(); + + if (isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::TO_]) && + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::TO_] instanceof \MailSo\Mime\EmailCollection) + { + $oResult->MergeWithOtherCollection($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::TO_]); + } + + return $oResult->Unique(); + } + + /** + * @return \MailSo\Mime\EmailCollection|null + */ + public function GetBcc() + { + $oResult = null; + + if (isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC]) && + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC] instanceof \MailSo\Mime\EmailCollection) + { + $oResult = $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC]; + } + + return $oResult ? $oResult->Unique() : null; + } + + /** + * @return \MailSo\Mime\EmailCollection + */ + public function GetRcpt() + { + $oResult = \MailSo\Mime\EmailCollection::NewInstance(); + + if (isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::TO_]) && + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::TO_] instanceof \MailSo\Mime\EmailCollection) + { + $oResult->MergeWithOtherCollection($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::TO_]); + } + + if (isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::CC]) && + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::CC] instanceof \MailSo\Mime\EmailCollection) + { + $oResult->MergeWithOtherCollection($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::CC]); + } + + if (isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC]) && + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC] instanceof \MailSo\Mime\EmailCollection) + { + $oResult->MergeWithOtherCollection($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC]); + } + + return $oResult->Unique(); + } + + /** + * @param string $sHeaderName + * @param string $sValue + * + * @return \MailSo\Mime\Message + */ + public function SetCustomHeader($sHeaderName, $sValue) + { + $sHeaderName = \trim($sHeaderName); + if (0 < \strlen($sHeaderName)) + { + $this->aHeadersValue[$sHeaderName] = $sValue; + } + + return $this; + } + + /** + * @param string $sSubject + * + * @return \MailSo\Mime\Message + */ + public function SetSubject($sSubject) + { + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::SUBJECT] = $sSubject; + + return $this; + } + + /** + * @param string $sInReplyTo + * + * @return \MailSo\Mime\Message + */ + public function SetInReplyTo($sInReplyTo) + { + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::IN_REPLY_TO] = $sInReplyTo; + + return $this; + } + + /** + * @param string $sReferences + * + * @return \MailSo\Mime\Message + */ + public function SetReferences($sReferences) + { + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::REFERENCES] = + \MailSo\Base\Utils::StripSpaces($sReferences); + + return $this; + } + + /** + * @param string $sEmail + * + * @return \MailSo\Mime\Message + */ + public function SetReadReceipt($sEmail) + { + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::DISPOSITION_NOTIFICATION_TO] = $sEmail; + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::X_CONFIRM_READING_TO] = $sEmail; + + return $this; + } + + /** + * @param string $sEmail + * + * @return \MailSo\Mime\Message + */ + public function SetReadConfirmation($sEmail) + { + return $this->SetReadReceipt($sEmail); + } + + /** + * @param int $iValue + * + * @return \MailSo\Mime\Message + */ + public function SetPriority($iValue) + { + $sResult = ''; + switch ($iValue) + { + case \MailSo\Mime\Enumerations\MessagePriority::HIGH: + $sResult = \MailSo\Mime\Enumerations\MessagePriority::HIGH.' (Highest)'; + break; + case \MailSo\Mime\Enumerations\MessagePriority::NORMAL: + $sResult = \MailSo\Mime\Enumerations\MessagePriority::NORMAL.' (Normal)'; + break; + case \MailSo\Mime\Enumerations\MessagePriority::LOW: + $sResult = \MailSo\Mime\Enumerations\MessagePriority::LOW.' (Lowest)'; + break; + } + + if (0 < \strlen($sResult)) + { + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::X_PRIORITY] = $sResult; + } + + return $this; + } + + /** + * @param int $iValue + * + * @return \MailSo\Mime\Message + */ + public function SetSensitivity($iValue) + { + $sResult = ''; + switch ($iValue) + { + case \MailSo\Mime\Enumerations\Sensitivity::CONFIDENTIAL: + $sResult = 'Company-Confidential'; + break; + case \MailSo\Mime\Enumerations\Sensitivity::PERSONAL: + $sResult = 'Personal'; + break; + case \MailSo\Mime\Enumerations\Sensitivity::PRIVATE_: + $sResult = 'Private'; + break; + } + + if (0 < \strlen($sResult)) + { + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::SENSITIVITY] = $sResult; + } + + return $this; + } + + /** + * @param string $sXMailer + * + * @return \MailSo\Mime\Message + */ + public function SetXMailer($sXMailer) + { + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::X_MAILER] = $sXMailer; + + return $this; + } + + /** + * @param \MailSo\Mime\Email $oEmail + * + * @return \MailSo\Mime\Message + */ + public function SetFrom(\MailSo\Mime\Email $oEmail) + { + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::FROM_] = $oEmail; + + return $this; + } + + /** + * @param \MailSo\Mime\EmailCollection $oEmails + * + * @return \MailSo\Mime\Message + */ + public function SetTo(\MailSo\Mime\EmailCollection $oEmails) + { + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::TO_] = $oEmails; + + return $this; + } + + /** + * @param int $iDateTime + * + * @return \MailSo\Mime\Message + */ + public function SetDate($iDateTime) + { + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::DATE] = gmdate('r', $iDateTime); + + return $this; + } + + /** + * @param \MailSo\Mime\EmailCollection $oEmails + * + * @return \MailSo\Mime\Message + */ + public function SetReplyTo(\MailSo\Mime\EmailCollection $oEmails) + { + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::REPLY_TO] = $oEmails; + + return $this; + } + + /** + * @param \MailSo\Mime\EmailCollection $oEmails + * + * @return \MailSo\Mime\Message + */ + public function SetCc(\MailSo\Mime\EmailCollection $oEmails) + { + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::CC] = $oEmails; + + return $this; + } + + /** + * @param \MailSo\Mime\EmailCollection $oEmails + * + * @return \MailSo\Mime\Message + */ + public function SetBcc(\MailSo\Mime\EmailCollection $oEmails) + { + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC] = $oEmails; + + return $this; + } + + /** + * @param \MailSo\Mime\EmailCollection $oEmails + * + * @return \MailSo\Mime\Message + */ + public function SetSender(\MailSo\Mime\EmailCollection $oEmails) + { + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::SENDER] = $oEmails; + + return $this; + } + + /** + * @param string $sType + * @param string $sUid + * @param string $sFolder + * + * @return \MailSo\Mime\Message + */ + public function SetDraftInfo($sType, $sUid, $sFolder) + { + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::X_DRAFT_INFO] = \MailSo\Mime\ParameterCollection::NewInstance() + ->Add(\MailSo\Mime\Parameter::NewInstance('type', $sType)) + ->Add(\MailSo\Mime\Parameter::NewInstance('uid', $sUid)) + ->Add(\MailSo\Mime\Parameter::NewInstance('folder', base64_encode($sFolder))) + ; + + return $this; + } + + /** + * @param string $sPlain + * + * @return \MailSo\Mime\Message + */ + public function AddPlain($sPlain) + { + return $this->AddAlternative( + \MailSo\Mime\Enumerations\MimeType::TEXT_PLAIN, trim($sPlain), + \MailSo\Base\Enumerations\Encoding::QUOTED_PRINTABLE_LOWER); + } + /** + * @param string $sHtml + * + * @return \MailSo\Mime\Message + */ + public function AddHtml($sHtml) + { + return $this->AddAlternative( + \MailSo\Mime\Enumerations\MimeType::TEXT_HTML, trim($sHtml), + \MailSo\Base\Enumerations\Encoding::QUOTED_PRINTABLE_LOWER); + } + + /** + * @param string $sHtmlOrPlainText + * @param bool $bIsHtml = false + * + * @return \MailSo\Mime\Message + */ + public function AddText($sHtmlOrPlainText, $bIsHtml = false) + { + return $bIsHtml ? $this->AddHtml($sHtmlOrPlainText) : $this->AddPlain($sHtmlOrPlainText); + } + + /** + * @param string $sContentType + * @param string|resource $mData + * @param string $sContentTransferEncoding = '' + * @param array $aCustomContentTypeParams = array() + * + * @return \MailSo\Mime\Message + */ + public function AddAlternative($sContentType, $mData, $sContentTransferEncoding = '', $aCustomContentTypeParams = array()) + { + $this->aAlternativeParts[] = array($sContentType, $mData, $sContentTransferEncoding, $aCustomContentTypeParams); + + return $this; + } + + /** + * @return string + */ + private function generateNewBoundary() + { + return '--='.\MailSo\Config::$BoundaryPrefix. + \rand(100, 999).'_'.rand(100000000, 999999999).'.'.\time(); + } + + /** + * @param string $sHostName = '' + * + * @return string + */ + private function generateNewMessageId($sHostName = '') + { + if (0 === \strlen($sHostName)) + { + $sHostName = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : ''; + } + + if (empty($sHostName) && \MailSo\Base\Utils::FunctionExistsAndEnabled('php_uname')) + { + $sHostName = \php_uname('n'); + } + + if (empty($sHostName)) + { + $sHostName = 'localhost'; + } + + return '<'. + \MailSo\Base\Utils::Md5Rand($sHostName. + (\MailSo\Base\Utils::FunctionExistsAndEnabled('getmypid') ? @\getmypid() : '')).'@'.$sHostName.'>'; + } + + /** + * @param \MailSo\Mime\Attachment $oAttachment + * + * @return \MailSo\Mime\Part + */ + private function createNewMessageAttachmentBody($oAttachment) + { + $oAttachmentPart = Part::NewInstance(); + + $sFileName = $oAttachment->FileName(); + $sCID = $oAttachment->CID(); + $sContentLocation = $oAttachment->ContentLocation(); + + $oContentTypeParameters = null; + $oContentDispositionParameters = null; + + if (0 < strlen(trim($sFileName))) + { + $oContentTypeParameters = + ParameterCollection::NewInstance()->Add(Parameter::NewInstance( + \MailSo\Mime\Enumerations\Parameter::NAME, $sFileName)); + + $oContentDispositionParameters = + ParameterCollection::NewInstance()->Add(Parameter::NewInstance( + \MailSo\Mime\Enumerations\Parameter::FILENAME, $sFileName)); + } + + $oAttachmentPart->Headers->Add( + Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE, + $oAttachment->ContentType().';'. + (($oContentTypeParameters) ? ' '.$oContentTypeParameters->ToString() : '') + ) + ); + + $oAttachmentPart->Headers->Add( + Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_DISPOSITION, + ($oAttachment->IsInline() ? 'inline' : 'attachment').';'. + (($oContentDispositionParameters) ? ' '.$oContentDispositionParameters->ToString() : '') + ) + ); + + if (0 < strlen($sCID)) + { + $oAttachmentPart->Headers->Add( + Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_ID, $sCID) + ); + } + + if (0 < strlen($sContentLocation)) + { + $oAttachmentPart->Headers->Add( + Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_LOCATION, $sContentLocation) + ); + } + + $oAttachmentPart->Body = $oAttachment->Resource(); + + if ('message/rfc822' !== strtolower($oAttachment->ContentType())) + { + $oAttachmentPart->Headers->Add( + Header::NewInstance( + \MailSo\Mime\Enumerations\Header::CONTENT_TRANSFER_ENCODING, + \MailSo\Base\Enumerations\Encoding::BASE64_LOWER + ) + ); + + if (is_resource($oAttachmentPart->Body)) + { + if (!\MailSo\Base\StreamWrappers\Binary::IsStreamRemembed($oAttachmentPart->Body)) + { + $oAttachmentPart->Body = + \MailSo\Base\StreamWrappers\Binary::CreateStream($oAttachmentPart->Body, + \MailSo\Base\StreamWrappers\Binary::GetInlineDecodeOrEncodeFunctionName( + \MailSo\Base\Enumerations\Encoding::BASE64, false)); + + \MailSo\Base\StreamWrappers\Binary::RememberStream($oAttachmentPart->Body); + } + } + } + + return $oAttachmentPart; + } + + /** + * @param array $aAlternativeData + * + * @return \MailSo\Mime\Part + */ + private function createNewMessageAlternativePartBody($aAlternativeData) + { + $oAlternativePart = null; + + if (is_array($aAlternativeData) && isset($aAlternativeData[0])) + { + $oAlternativePart = Part::NewInstance(); + $oParameters = ParameterCollection::NewInstance(); + $oParameters->Add( + Parameter::NewInstance( + \MailSo\Mime\Enumerations\Parameter::CHARSET, + \MailSo\Base\Enumerations\Charset::UTF_8) + ); + + if (isset($aAlternativeData[3]) && \is_array($aAlternativeData[3]) && 0 < \count($aAlternativeData[3])) + { + foreach ($aAlternativeData[3] as $sName => $sValue) + { + $oParameters->Add(Parameter::NewInstance($sName, $sValue)); + } + } + + $oAlternativePart->Headers->Add( + Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE, + $aAlternativeData[0].'; '.$oParameters->ToString()) + ); + + $oAlternativePart->Body = null; + if (isset($aAlternativeData[1])) + { + if (is_resource($aAlternativeData[1])) + { + $oAlternativePart->Body = $aAlternativeData[1]; + } + else if (is_string($aAlternativeData[1]) && 0 < strlen($aAlternativeData[1])) + { + $oAlternativePart->Body = + \MailSo\Base\ResourceRegistry::CreateMemoryResourceFromString($aAlternativeData[1]); + } + } + + if (isset($aAlternativeData[2]) && 0 < strlen($aAlternativeData[2])) + { + $oAlternativePart->Headers->Add( + Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_TRANSFER_ENCODING, + $aAlternativeData[2] + ) + ); + + if (is_resource($oAlternativePart->Body)) + { + if (!\MailSo\Base\StreamWrappers\Binary::IsStreamRemembed($oAlternativePart->Body)) + { + $oAlternativePart->Body = + \MailSo\Base\StreamWrappers\Binary::CreateStream($oAlternativePart->Body, + \MailSo\Base\StreamWrappers\Binary::GetInlineDecodeOrEncodeFunctionName( + $aAlternativeData[2], false)); + + \MailSo\Base\StreamWrappers\Binary::RememberStream($oAlternativePart->Body); + } + } + } + + if (!is_resource($oAlternativePart->Body)) + { + $oAlternativePart->Body = + \MailSo\Base\ResourceRegistry::CreateMemoryResourceFromString(''); + } + } + + return $oAlternativePart; + } + + /** + * @param \MailSo\Mime\Part $oPlainPart + * @param \MailSo\Mime\Part $oHtmlPart + * + * @return \MailSo\Mime\Part + */ + private function createNewMessageSimpleOrAlternativeBody() + { + $oResultPart = null; + if (1 < count($this->aAlternativeParts)) + { + $oResultPart = Part::NewInstance(); + + $oResultPart->Headers->Add( + Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE, + \MailSo\Mime\Enumerations\MimeType::MULTIPART_ALTERNATIVE.'; '. + ParameterCollection::NewInstance()->Add( + Parameter::NewInstance( + \MailSo\Mime\Enumerations\Parameter::BOUNDARY, + $this->generateNewBoundary()) + )->ToString() + ) + ); + + foreach ($this->aAlternativeParts as $aAlternativeData) + { + $oAlternativePart = $this->createNewMessageAlternativePartBody($aAlternativeData); + if ($oAlternativePart) + { + $oResultPart->SubParts->Add($oAlternativePart); + } + + unset($oAlternativePart); + } + + } + else if (1 === count($this->aAlternativeParts)) + { + $oAlternativePart = $this->createNewMessageAlternativePartBody($this->aAlternativeParts[0]); + if ($oAlternativePart) + { + $oResultPart = $oAlternativePart; + } + } + + if (!$oResultPart) + { + if ($this->bAddEmptyTextPart) + { + $oResultPart = $this->createNewMessageAlternativePartBody(array( + \MailSo\Mime\Enumerations\MimeType::TEXT_PLAIN, null + )); + } + else + { + $aAttachments = $this->oAttachmentCollection->CloneAsArray(); + if (\is_array($aAttachments) && 1 === count($aAttachments) && isset($aAttachments[0])) + { + $this->oAttachmentCollection->Clear(); + + $oResultPart = $this->createNewMessageAlternativePartBody(array( + $aAttachments[0]->ContentType(), $aAttachments[0]->Resource(), + '', $aAttachments[0]->CustomContentTypeParams() + )); + } + } + } + + return $oResultPart; + } + + /** + * @param \MailSo\Mime\Part $oIncPart + * + * @return \MailSo\Mime\Part + */ + private function createNewMessageRelatedBody($oIncPart) + { + $oResultPart = null; + + $aAttachments = $this->oAttachmentCollection->LinkedAttachments(); + if (0 < count($aAttachments)) + { + $oResultPart = Part::NewInstance(); + + $oResultPart->Headers->Add( + Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE, + \MailSo\Mime\Enumerations\MimeType::MULTIPART_RELATED.'; '. + ParameterCollection::NewInstance()->Add( + Parameter::NewInstance( + \MailSo\Mime\Enumerations\Parameter::BOUNDARY, + $this->generateNewBoundary()) + )->ToString() + ) + ); + + $oResultPart->SubParts->Add($oIncPart); + + foreach ($aAttachments as $oAttachment) + { + $oResultPart->SubParts->Add($this->createNewMessageAttachmentBody($oAttachment)); + } + } + else + { + $oResultPart = $oIncPart; + } + + return $oResultPart; + } + + /** + * @param \MailSo\Mime\Part $oIncPart + * + * @return \MailSo\Mime\Part + */ + private function createNewMessageMixedBody($oIncPart) + { + $oResultPart = null; + + $aAttachments = $this->oAttachmentCollection->UnlinkedAttachments(); + if (0 < count($aAttachments)) + { + $oResultPart = Part::NewInstance(); + + $oResultPart->Headers->AddByName(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE, + \MailSo\Mime\Enumerations\MimeType::MULTIPART_MIXED.'; '. + ParameterCollection::NewInstance()->Add( + Parameter::NewInstance( + \MailSo\Mime\Enumerations\Parameter::BOUNDARY, + $this->generateNewBoundary()) + )->ToString() + ); + + $oResultPart->SubParts->Add($oIncPart); + + foreach ($aAttachments as $oAttachment) + { + $oResultPart->SubParts->Add($this->createNewMessageAttachmentBody($oAttachment)); + } + } + else + { + $oResultPart = $oIncPart; + } + + return $oResultPart; + } + + /** + * @param \MailSo\Mime\Part $oIncPart + * @param bool $bWithoutBcc = false + * + * @return \MailSo\Mime\Part + */ + private function setDefaultHeaders($oIncPart, $bWithoutBcc = false) + { + if (!isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::DATE])) + { + $oIncPart->Headers->SetByName(\MailSo\Mime\Enumerations\Header::DATE, \gmdate('r'), true); + } + + if (!isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::MESSAGE_ID])) + { + $oIncPart->Headers->SetByName(\MailSo\Mime\Enumerations\Header::MESSAGE_ID, $this->generateNewMessageId(), true); + } + + if (!isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::X_MAILER]) && $this->bAddDefaultXMailer) + { + $oIncPart->Headers->SetByName(\MailSo\Mime\Enumerations\Header::X_MAILER, \MailSo\Version::XMailer(), true); + } + + if (!isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::MIME_VERSION])) + { + $oIncPart->Headers->SetByName(\MailSo\Mime\Enumerations\Header::MIME_VERSION, '1.0', true); + } + + foreach ($this->aHeadersValue as $sName => $mValue) + { + if (\is_object($mValue)) + { + if ($mValue instanceof \MailSo\Mime\EmailCollection || $mValue instanceof \MailSo\Mime\Email || + $mValue instanceof \MailSo\Mime\ParameterCollection) + { + $mValue = $mValue->ToString(); + } + } + + if (!($bWithoutBcc && \strtolower(\MailSo\Mime\Enumerations\Header::BCC) === \strtolower($sName))) + { + $oIncPart->Headers->SetByName($sName, (string) $mValue); + } + } + + return $oIncPart; + } + + /** + * @param bool $bWithoutBcc = false + * + * @return \MailSo\Mime\Part + */ + public function ToPart($bWithoutBcc = false) + { + $oPart = $this->createNewMessageSimpleOrAlternativeBody(); + $oPart = $this->createNewMessageRelatedBody($oPart); + $oPart = $this->createNewMessageMixedBody($oPart); + $oPart = $this->setDefaultHeaders($oPart, $bWithoutBcc); + + return $oPart; + } + + /** + * @param bool $bWithoutBcc = false + * + * @return resource + */ + public function ToStream($bWithoutBcc = false) + { + return $this->ToPart($bWithoutBcc)->ToStream(); + } + + /** + * @param bool $bWithoutBcc = false + * + * @return string + */ + public function ToString($bWithoutBcc = false) + { + return \stream_get_contents($this->ToStream($bWithoutBcc)); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Parameter.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Parameter.php new file mode 100755 index 00000000..487a256e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Parameter.php @@ -0,0 +1,141 @@ +sName = $sName; + $this->sValue = $sValue; + } + + /** + * @param string $sName + * @param string $sValue = '' + * + * @return \MailSo\Mime\Parameter + */ + public static function NewInstance($sName, $sValue = '') + { + return new self($sName, $sValue); + } + + /** + * @param string $sName + * @param string $sValue = '' + * + * @return \MailSo\Mime\Parameter + */ + public static function CreateFromParameterLine($sRawParam) + { + $oParameter = self::NewInstance(''); + return $oParameter->Parse($sRawParam); + } + + /** + * @return \MailSo\Mime\Parameter + */ + public function Reset() + { + $this->sName = ''; + $this->sValue = ''; + + return $this; + } + + /** + * @return string + */ + public function Name() + { + return $this->sName; + } + + /** + * @return string + */ + public function Value() + { + return $this->sValue; + } + + /** + * @param string $sRawParam + * @param string $sSeparator = '=' + * + * @return \MailSo\Mime\Parameter + */ + public function Parse($sRawParam, $sSeparator = '=') + { + $this->Reset(); + + $aParts = explode($sSeparator, $sRawParam, 2); + + $this->sName = trim(trim($aParts[0]), '"\''); + if (2 === count($aParts)) + { + $this->sValue = trim(trim($aParts[1]), '"\''); + } + + return $this; + } + + /** + * @param bool $bConvertSpecialsName = false + * + * @return string + */ + public function ToString($bConvertSpecialsName = false) + { + $sResult = ''; + if (0 < strlen($this->sName)) + { + $sResult = $this->sName.'='; + if ($bConvertSpecialsName && in_array(strtolower($this->sName), array( + strtolower(\MailSo\Mime\Enumerations\Parameter::NAME), + strtolower(\MailSo\Mime\Enumerations\Parameter::FILENAME) + ))) + { + $sResult .= '"'.\MailSo\Base\Utils::EncodeUnencodedValue( + \MailSo\Base\Enumerations\Encoding::BASE64_SHORT, + $this->sValue).'"'; + } + else + { + $sResult .= '"'.$this->sValue.'"'; + } + } + + return $sResult; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/ParameterCollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/ParameterCollection.php new file mode 100755 index 00000000..52b7dd37 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/ParameterCollection.php @@ -0,0 +1,213 @@ +Parse($sRawParams); + } + } + + /** + * @param string $sRawParams = '' + * + * @return \MailSo\Mime\ParameterCollection + */ + public static function NewInstance($sRawParams = '') + { + return new self($sRawParams); + } + + /** + * @return \MailSo\Mime\Parameter|null + */ + public function &GetByIndex($iIndex) + { + $mResult = null; + $mResult =& parent::GetByIndex($iIndex); + return $mResult; + } + + /** + * @param array $aList + * + * @return \MailSo\Mime\ParameterCollection + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public function SetAsArray($aList) + { + parent::SetAsArray($aList); + + return $this; + } + + /** + * @param string $sName + * + * @return string + */ + public function ParameterValueByName($sName) + { + $sResult = ''; + $sName = \trim($sName); + + $aParams =& $this->GetAsArray(); + foreach ($aParams as /* @var $oParam \MailSo\Mime\ParameterCollection */ $oParam) + { + if (\strtolower($sName) === \strtolower($oParam->Name())) + { + $sResult = $oParam->Value(); + break; + } + } + + return $sResult; + } + + /** + * @param string $sRawParams + * + * @return \MailSo\Mime\ParameterCollection + */ + public function Parse($sRawParams) + { + $this->Clear(); + + $aDataToParse = \explode(';', $sRawParams); + + foreach ($aDataToParse as $sParam) + { + $this->Add(Parameter::CreateFromParameterLine($sParam)); + } + + $this->reParseParameters(); + + return $this; + } + + /** + * @param bool $bConvertSpecialsName = false + * + * @return string + */ + public function ToString($bConvertSpecialsName = false) + { + $aResult = array(); + $aParams =& $this->GetAsArray(); + foreach ($aParams as /* @var $oParam \MailSo\Mime\Parameter */ $oParam) + { + $sLine = $oParam->ToString($bConvertSpecialsName); + if (0 < \strlen($sLine)) + { + $aResult[] = $sLine; + } + } + + return 0 < \count($aResult) ? \implode('; ', $aResult) : ''; + } + + /** + * @return void + */ + private function reParseParameters() + { + $aDataToReParse = $this->CloneAsArray(); + $sCharset = \MailSo\Base\Enumerations\Charset::UTF_8; + + $this->Clear(); + + $aPreParams = array(); + foreach ($aDataToReParse as /* @var $oParam \MailSo\Mime\Parameter */ $oParam) + { + $aMatch = array(); + $sParamName = $oParam->Name(); + + if (\preg_match('/([^\*]+)\*([\d]{1,2})\*/', $sParamName, $aMatch) && isset($aMatch[1], $aMatch[2]) + && 0 < \strlen($aMatch[1]) && \is_numeric($aMatch[2])) + { + if (!isset($aPreParams[$aMatch[1]])) + { + $aPreParams[$aMatch[1]] = array(); + } + + $sValue = $oParam->Value(); + + if (false !== \strpos($sValue, "''")) + { + $aValueParts = \explode("''", $sValue, 2); + if (\is_array($aValueParts) && 2 === \count($aValueParts) && 0 < \strlen($aValueParts[1])) + { + $sCharset = $aValueParts[0]; + $sValue = $aValueParts[1]; + } + } + + $aPreParams[$aMatch[1]][(int) $aMatch[2]] = $sValue; + } + else if (\preg_match('/([^\*]+)\*/', $sParamName, $aMatch) && isset($aMatch[1])) + { + if (!isset($aPreParams[$aMatch[1]])) + { + $aPreParams[$aMatch[1]] = array(); + } + + $sValue = $oParam->Value(); + if (false !== \strpos($sValue, "''")) + { + $aValueParts = \explode("''", $sValue, 2); + if (\is_array($aValueParts) && 2 === \count($aValueParts) && 0 < \strlen($aValueParts[1])) + { + $sCharset = $aValueParts[0]; + $sValue = $aValueParts[1]; + } + } + + $aPreParams[$aMatch[1]][0] = $sValue; + } + else + { + $this->Add($oParam); + } + } + + foreach ($aPreParams as $sName => $aValues) + { + ksort($aValues); + $sResult = \implode(\array_values($aValues)); + $sResult = \urldecode($sResult); + + if (0 < \strlen($sCharset)) + { + $sResult = \MailSo\Base\Utils::ConvertEncoding($sResult, + $sCharset, \MailSo\Base\Enumerations\Charset::UTF_8); + } + + $this->Add(Parameter::NewInstance($sName, $sResult)); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Parser/ParserEmpty.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Parser/ParserEmpty.php new file mode 100755 index 00000000..2349ade7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Parser/ParserEmpty.php @@ -0,0 +1,81 @@ +oCurrentMime = $oPart; + } + + /** + * @param string $sBuffer + * + * @return void + */ + public function WriteBody($sBuffer) + { + if (null === $this->oCurrentMime->Body) + { + $this->oCurrentMime->Body = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); + } + + if (\is_resource($this->oCurrentMime->Body)) + { + \fwrite($this->oCurrentMime->Body, $sBuffer); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Part.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Part.php new file mode 100755 index 00000000..2e19af03 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Part.php @@ -0,0 +1,665 @@ +iParseBuffer = \MailSo\Mime\Part::DEFAUL_BUFFER; + $this->Reset(); + } + + /** + * @return \MailSo\Mime\Part + */ + public static function NewInstance() + { + return new self(); + } + + /** + * @return \MailSo\Mime\Part + */ + public function Reset() + { + \MailSo\Base\ResourceRegistry::CloseMemoryResource($this->Body); + $this->Body = null; + + $this->Headers = HeaderCollection::NewInstance(); + $this->SubParts = PartCollection::NewInstance(); + $this->LineParts = array(); + $this->sBoundary = ''; + $this->sParentCharset = \MailSo\Base\Enumerations\Charset::ISO_8859_1; + + return $this; + } + + /** + * @return string + */ + public function Boundary() + { + return $this->sBoundary; + } + + /** + * @return string + */ + public function ParentCharset() + { + return (0 < \strlen($this->sCharset)) ? $this->sParentCharset : self::$DefaultCharset; + } + + /** + * @param string $sParentCharset + * @return \MailSo\Mime\Part + */ + public function SetParentCharset($sParentCharset) + { + $this->sParentCharset = $sParentCharset; + + return $this; + } + + /** + * @param string $sBoundary + * @return \MailSo\Mime\Part + */ + public function SetBoundary($sBoundary) + { + $this->sBoundary = $sBoundary; + + return $this; + } + + /** + * @param int $iParseBuffer + * @return \MailSo\Mime\Part + */ + public function SetParseBuffer($iParseBuffer) + { + $this->iParseBuffer = $iParseBuffer; + + return $this; + } + + /** + * @return string + */ + public function HeaderCharset() + { + return ($this->Headers) ? trim(strtolower($this->Headers->ParameterValue( + \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, + \MailSo\Mime\Enumerations\Parameter::CHARSET))) : ''; + } + + /** + * @return string + */ + public function HeaderBoundary() + { + return ($this->Headers) ? trim($this->Headers->ParameterValue( + \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, + \MailSo\Mime\Enumerations\Parameter::BOUNDARY)) : ''; + } + + /** + * @return string + */ + public function ContentType() + { + return ($this->Headers) ? + trim(strtolower($this->Headers->ValueByName( + \MailSo\Mime\Enumerations\Header::CONTENT_TYPE))) : ''; + } + + /** + * @return string + */ + public function ContentTransferEncoding() + { + return ($this->Headers) ? + trim(strtolower($this->Headers->ValueByName( + \MailSo\Mime\Enumerations\Header::CONTENT_TRANSFER_ENCODING))) : ''; + } + + /** + * @return string + */ + public function ContentID() + { + return ($this->Headers) ? trim($this->Headers->ValueByName( + \MailSo\Mime\Enumerations\Header::CONTENT_ID)) : ''; + } + + /** + * @return string + */ + public function ContentLocation() + { + return ($this->Headers) ? trim($this->Headers->ValueByName( + \MailSo\Mime\Enumerations\Header::CONTENT_LOCATION)) : ''; + } + + /** + * @return bool + */ + public function IsFlowedFormat() + { + $bResult = false; + if ($this->Headers) + { + $bResult = 'flowed' === \trim(\strtolower($this->Headers->ParameterValue( + \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, + \MailSo\Mime\Enumerations\Parameter::FORMAT))); + + if ($bResult && \in_array(\strtolower($this->MailEncodingName()), array('base64', 'quoted-printable'))) + { + $bResult = false; + } + } + + return $bResult; + } + + /** + * @return string + */ + public function FileName() + { + $sResult = ''; + if ($this->Headers) + { + $sResult = trim($this->Headers->ParameterValue( + \MailSo\Mime\Enumerations\Header::CONTENT_DISPOSITION, + \MailSo\Mime\Enumerations\Parameter::FILENAME)); + + if (0 === strlen($sResult)) + { + $sResult = trim($this->Headers->ParameterValue( + \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, + \MailSo\Mime\Enumerations\Parameter::NAME)); + } + } + + return $sResult; + } + + /** + * @param string $sFileName + * @return \MailSo\Mime\Part + */ + public function ParseFromFile($sFileName) + { + $rStreamHandle = (@file_exists($sFileName)) ? @fopen($sFileName, 'rb') : false; + if (is_resource($rStreamHandle)) + { + $this->ParseFromStream($rStreamHandle); + + if (is_resource($rStreamHandle)) + { + fclose($rStreamHandle); + } + } + + return $this; + } + + /** + * @param string $sRawMessage + * @return \MailSo\Mime\Part + */ + public function ParseFromString($sRawMessage) + { + $rStreamHandle = (0 < strlen($sRawMessage)) ? + \MailSo\Base\ResourceRegistry::CreateMemoryResource() : false; + + if (is_resource($rStreamHandle)) + { + fwrite($rStreamHandle, $sRawMessage); + unset($sRawMessage); + fseek($rStreamHandle, 0); + + $this->ParseFromStream($rStreamHandle); + + \MailSo\Base\ResourceRegistry::CloseMemoryResource($rStreamHandle); + } + + return $this; + } + + /** + * @param resource $rStreamHandle + * @return \MailSo\Mime\Part + */ + public function ParseFromStream($rStreamHandle) + { + $this->Reset(); + + $oParserClass = new \MailSo\Mime\Parser\ParserMemory(); + + $oMimePart = null; + $bIsOef = false; + $iOffset = 0; + $sBuffer = ''; + $sPrevBuffer = ''; + $aBoundaryStack = array(); + + + $oParserClass->StartParse($this); + + $this->LineParts[] =& $this; + $this->ParseFromStreamRecursion($rStreamHandle, $oParserClass, $iOffset, + $sPrevBuffer, $sBuffer, $aBoundaryStack, $bIsOef); + + $sFirstNotNullCharset = null; + foreach ($this->LineParts as /* @var $oMimePart \MailSo\Mime\Part */ &$oMimePart) + { + $sCharset = $oMimePart->HeaderCharset(); + if (0 < strlen($sCharset)) + { + $sFirstNotNullCharset = $sCharset; + break; + } + } + + $sForceCharset = self::$ForceCharset; + if (0 < strlen($sForceCharset)) + { + foreach ($this->LineParts as /* @var $oMimePart \MailSo\Mime\Part */ &$oMimePart) + { + $oMimePart->SetParentCharset($sForceCharset); + $oMimePart->Headers->SetParentCharset($sForceCharset); + } + } + else + { + $sFirstNotNullCharset = (null !== $sFirstNotNullCharset) + ? $sFirstNotNullCharset : self::$DefaultCharset; + + foreach ($this->LineParts as /* @var $oMimePart \MailSo\Mime\Part */ &$oMimePart) + { + $sHeaderCharset = $oMimePart->HeaderCharset(); + $oMimePart->SetParentCharset((0 < strlen($sHeaderCharset)) ? $sHeaderCharset : $sFirstNotNullCharset); + $oMimePart->Headers->SetParentCharset($sHeaderCharset); + } + } + + $oParserClass->EndParse($this); + + return $this; + } + + /** + * @param resource $rStreamHandle + * @return \MailSo\Mime\Part + */ + public function ParseFromStreamRecursion($rStreamHandle, &$oCallbackClass, &$iOffset, + &$sPrevBuffer, &$sBuffer, &$aBoundaryStack, &$bIsOef, $bNotFirstRead = false) + { + $oCallbackClass->StartParseMimePart($this); + + $iPos = 0; + $iParsePosition = self::POS_HEADERS; + $sCurrentBoundary = ''; + $bIsBoundaryCheck = false; + $aHeadersLines = array(); + while (true) + { + if (!$bNotFirstRead) + { + $sPrevBuffer = $sBuffer; + $sBuffer = ''; + } + + if (!$bIsOef && !feof($rStreamHandle)) + { + if (!$bNotFirstRead) + { + $sBuffer = @fread($rStreamHandle, $this->iParseBuffer); + if (false === $sBuffer) + { + break; + } + + $oCallbackClass->ReadBuffer($sBuffer); + } + else + { + $bNotFirstRead = false; + } + } + else if ($bIsOef && 0 === strlen($sBuffer)) + { + break; + } + else + { + $bIsOef = true; + } + + while (true) + { + $sCurrentLine = $sPrevBuffer.$sBuffer; + if (self::POS_HEADERS === $iParsePosition) + { + $iEndLen = 4; + $iPos = strpos($sCurrentLine, "\r\n\r\n", $iOffset); + if (false === $iPos) + { + $iEndLen = 2; + $iPos = strpos($sCurrentLine, "\n\n", $iOffset); + } + + if (false !== $iPos) + { + $aHeadersLines[] = substr($sCurrentLine, $iOffset, $iPos + $iEndLen - $iOffset); + + $this->Headers->Parse(implode($aHeadersLines))->SetParentCharset($this->HeaderCharset()); + $aHeadersLines = array(); + + $oCallbackClass->InitMimePartHeader(); + + $sBoundary = $this->HeaderBoundary(); + if (0 < strlen($sBoundary)) + { + $sBoundary = '--'.$sBoundary; + $sCurrentBoundary = $sBoundary; + array_unshift($aBoundaryStack, $sBoundary); + } + + $iOffset = $iPos + $iEndLen; + $iParsePosition = self::POS_BODY; + continue; + } + else + { + $iBufferLen = strlen($sPrevBuffer); + if ($iBufferLen > $iOffset) + { + $aHeadersLines[] = substr($sPrevBuffer, $iOffset); + $iOffset = 0; + } + else + { + $iOffset -= $iBufferLen; + } + break; + } + } + else if (self::POS_BODY === $iParsePosition) + { + $iPos = false; + $sBoundaryLen = 0; + $bIsBoundaryEnd = false; + $bCurrentPartBody = false; + $bIsBoundaryCheck = 0 < count($aBoundaryStack); + + foreach ($aBoundaryStack as $sKey => $sBoundary) + { + if (false !== ($iPos = strpos($sCurrentLine, $sBoundary, $iOffset))) + { + if ($sCurrentBoundary === $sBoundary) + { + $bCurrentPartBody = true; + } + + $sBoundaryLen = strlen($sBoundary); + if ('--' === substr($sCurrentLine, $iPos + $sBoundaryLen, 2)) + { + $sBoundaryLen += 2; + $bIsBoundaryEnd = true; + unset($aBoundaryStack[$sKey]); + $sCurrentBoundary = (isset($aBoundaryStack[$sKey + 1])) + ? $aBoundaryStack[$sKey + 1] : ''; + } + + break; + } + } + + if (false !== $iPos) + { + $oCallbackClass->WriteBody(substr($sCurrentLine, $iOffset, $iPos - $iOffset)); + $iOffset = $iPos; + + if ($bCurrentPartBody) + { + $iParsePosition = self::POS_SUBPARTS; + continue; + } + + $oCallbackClass->EndParseMimePart($this); + return true; + } + else + { + $iBufferLen = strlen($sPrevBuffer); + if ($iBufferLen > $iOffset) + { + $oCallbackClass->WriteBody(substr($sPrevBuffer, $iOffset)); + $iOffset = 0; + } + else + { + $iOffset -= $iBufferLen; + } + break; + } + } + else if (self::POS_SUBPARTS === $iParsePosition) + { + $iPos = false; + $sBoundaryLen = 0; + $bIsBoundaryEnd = false; + $bCurrentPartBody = false; + $bIsBoundaryCheck = 0 < count($aBoundaryStack); + + foreach ($aBoundaryStack as $sKey => $sBoundary) + { + if (false !== ($iPos = strpos($sCurrentLine, $sBoundary, $iOffset))) + { + if ($sCurrentBoundary === $sBoundary) + { + $bCurrentPartBody = true; + } + + $sBoundaryLen = strlen($sBoundary); + if ('--' === substr($sCurrentLine, $iPos + $sBoundaryLen, 2)) + { + $sBoundaryLen += 2; + $bIsBoundaryEnd = true; + unset($aBoundaryStack[$sKey]); + $sCurrentBoundary = (isset($aBoundaryStack[$sKey + 1])) + ? $aBoundaryStack[$sKey + 1] : ''; + } + break; + } + } + + if (false !== $iPos && $bCurrentPartBody) + { + $iOffset = $iPos + $sBoundaryLen; + + $oSubPart = self::NewInstance(); + + $oSubPart + ->SetParseBuffer($this->iParseBuffer) + ->ParseFromStreamRecursion($rStreamHandle, $oCallbackClass, + $iOffset, $sPrevBuffer, $sBuffer, $aBoundaryStack, $bIsOef, true); + + $this->SubParts->Add($oSubPart); + $this->LineParts[] =& $oSubPart; + //$iParsePosition = self::POS_HEADERS; + unset($oSubPart); + } + else + { + $oCallbackClass->EndParseMimePart($this); + return true; + } + } + } + } + + if (0 < strlen($sPrevBuffer)) + { + if (self::POS_HEADERS === $iParsePosition) + { + $aHeadersLines[] = ($iOffset < strlen($sPrevBuffer)) + ? substr($sPrevBuffer, $iOffset) + : $sPrevBuffer; + + $this->Headers->Parse(implode($aHeadersLines))->SetParentCharset($this->HeaderCharset()); + $aHeadersLines = array(); + + $oCallbackClass->InitMimePartHeader(); + } + else if (self::POS_BODY === $iParsePosition) + { + if (!$bIsBoundaryCheck) + { + $oCallbackClass->WriteBody(($iOffset < strlen($sPrevBuffer)) + ? substr($sPrevBuffer, $iOffset) : $sPrevBuffer); + } + } + } + else + { + if (self::POS_HEADERS === $iParsePosition && 0 < count($aHeadersLines)) + { + $this->Headers->Parse(implode($aHeadersLines))->SetParentCharset($this->HeaderCharset()); + $aHeadersLines = array(); + + $oCallbackClass->InitMimePartHeader(); + } + } + + $oCallbackClass->EndParseMimePart($this); + + return $this; + } + + /** + * @return resorce + */ + public function Rewind() + { + if ($this->Body && \is_resource($this->Body)) + { + $aMeta = \stream_get_meta_data($this->Body); + if (isset($aMeta['seekable']) && $aMeta['seekable']) + { + \rewind($this->Body); + } + } + } + + /** + * @return resorce + */ + public function ToStream() + { + $this->Rewind(); + + $aSubStreams = array( + + $this->Headers->ToEncodedString(). + \MailSo\Mime\Enumerations\Constants::CRLF. + \MailSo\Mime\Enumerations\Constants::CRLF, + + null === $this->Body ? '' : $this->Body, + + \MailSo\Mime\Enumerations\Constants::CRLF + ); + + if (0 < $this->SubParts->Count()) + { + $sBoundary = $this->HeaderBoundary(); + if (0 < strlen($sBoundary)) + { + $aSubStreams[] = '--'.$sBoundary.\MailSo\Mime\Enumerations\Constants::CRLF; + + $rSubPartsStream = $this->SubParts->ToStream($sBoundary); + if (is_resource($rSubPartsStream)) + { + $aSubStreams[] = $rSubPartsStream; + } + + $aSubStreams[] = \MailSo\Mime\Enumerations\Constants::CRLF. + '--'.$sBoundary.'--'.\MailSo\Mime\Enumerations\Constants::CRLF; + } + } + + return \MailSo\Base\StreamWrappers\SubStreams::CreateStream($aSubStreams); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/PartCollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/PartCollection.php new file mode 100755 index 00000000..d3c53ca6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/PartCollection.php @@ -0,0 +1,65 @@ +GetAsArray(); + foreach ($aParts as /* @var $oPart \MailSo\Mime\Part */ &$oPart) + { + if (0 < count($aResult)) + { + $aResult[] = \MailSo\Mime\Enumerations\Constants::CRLF. + '--'.$sBoundary.\MailSo\Mime\Enumerations\Constants::CRLF; + } + + $aResult[] = $oPart->ToStream(); + } + + return \MailSo\Base\StreamWrappers\SubStreams::CreateStream($aResult); + } + + return $rResult; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Enumerations/ConnectionSecurityType.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Enumerations/ConnectionSecurityType.php new file mode 100755 index 00000000..fed485db --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Enumerations/ConnectionSecurityType.php @@ -0,0 +1,70 @@ +sSocketMessage = $sSocketMessage; + $this->iSocketCode = $iSocketCode; + } + + /** + * @return string + */ + public function getSocketMessage() + { + return $this->sSocketMessage; + } + + /** + * @return int + */ + public function getSocketCode() + { + return $this->iSocketCode; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketConnectionDoesNotAvailableException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketConnectionDoesNotAvailableException.php new file mode 100755 index 00000000..b406b3d2 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketConnectionDoesNotAvailableException.php @@ -0,0 +1,19 @@ +rConnect = null; + $this->bUnreadBuffer = false; + $this->bRunningCallback = false; + $this->oLogger = null; + + $this->__AUTOLOGOUT__ = true; + + $this->sResponseBuffer = ''; + + $this->iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::NONE; + $this->sConnectedHost = ''; + $this->iConnectedPort = 0; + + $this->bSecure = false; + + $this->iConnectTimeOut = 10; + $this->iSocketTimeOut = 10; + + $this->Clear(); + } + + /** + * @return void + */ + public function __destruct() + { + try + { + if ($this->__AUTOLOGOUT__) + { + $this->LogoutAndDisconnect(); + } + else + { + $this->Disconnect(); + } + } + catch (\Exception $oException) {} + } + + /** + * @return void + */ + public function Clear() + { + $this->sResponseBuffer = ''; + + $this->sConnectedHost = ''; + $this->iConnectedPort = 0; + + $this->iStartConnectTime = 0; + $this->bSecure = false; + } + + /** + * @return string + */ + public function GetConnectedHost() + { + return $this->sConnectedHost; + } + + /** + * @return int + */ + public function GetConnectedPort() + { + return $this->iConnectedPort; + } + + /** + * @param int $iConnectTimeOut = 10 + * @param int $iSocketTimeOut = 10 + * + * @return void + */ + public function SetTimeOuts($iConnectTimeOut = 10, $iSocketTimeOut = 10) + { + $this->iConnectTimeOut = 5 < $iConnectTimeOut ? $iConnectTimeOut : 5; + $this->iSocketTimeOut = 5 < $iSocketTimeOut ? $iSocketTimeOut : 5; + } + + /** + * @return resource|null + */ + public function ConnectionResource() + { + return $this->rConnect; + } + + /** + * @param int $iErrNo + * @param string $sErrStr + * @param string $sErrFile + * @param int $iErrLine + * + * @return bool + */ + public function capturePhpErrorWithException($iErrNo, $sErrStr, $sErrFile, $iErrLine) + { + throw new \MailSo\Base\Exceptions\Exception($sErrStr, $iErrNo); + } + + /** + * @param string $sServerName + * @param int $iPort + * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT + * @param bool $bVerifySsl = false + * @param bool $bAllowSelfSigned = true + * + * @return void + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\SocketAlreadyConnectedException + * @throws \MailSo\Net\Exceptions\SocketCanNotConnectToHostException + */ + public function Connect($sServerName, $iPort, + $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT, + $bVerifySsl = false, $bAllowSelfSigned = true) + { + if (!\MailSo\Base\Validator::NotEmptyString($sServerName, true) || !\MailSo\Base\Validator::PortInt($iPort)) + { + $this->writeLogException( + new \MailSo\Base\Exceptions\InvalidArgumentException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + if ($this->IsConnected()) + { + $this->writeLogException( + new Exceptions\SocketAlreadyConnectedException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + $sServerName = \trim($sServerName); + + $sErrorStr = ''; + $iErrorNo = 0; + + $this->sConnectedHost = $sServerName; + $this->iConnectedPort = $iPort; + $this->iSecurityType = $iSecurityType; + $this->bSecure = \MailSo\Net\Enumerations\ConnectionSecurityType::UseSSL( + $this->iConnectedPort, $this->iSecurityType); + + if (!\preg_match('/^[a-z0-9._]{2,8}:\/\//i', $this->sConnectedHost)) + { + $this->sConnectedHost = ($this->bSecure ? 'ssl://' : 'tcp://').$this->sConnectedHost; +// $this->sConnectedHost = ($this->bSecure ? 'ssl://' : '').$this->sConnectedHost; + } + + if (!$this->bSecure && \MailSo\Net\Enumerations\ConnectionSecurityType::SSL === $this->iSecurityType) + { + $this->writeLogException( + new \MailSo\Net\Exceptions\SocketUnsuppoterdSecureConnectionException('SSL isn\'t supported: ('.\implode(', ', \stream_get_transports()).')'), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + $this->iStartConnectTime = \microtime(true); + $this->writeLog('Start connection to "'.$this->sConnectedHost.':'.$this->iConnectedPort.'"', + \MailSo\Log\Enumerations\Type::NOTE); + +// $this->rConnect = @\fsockopen($this->sConnectedHost, $this->iConnectedPort, +// $iErrorNo, $sErrorStr, $this->iConnectTimeOut); + + $bVerifySsl = !!$bVerifySsl; + $bAllowSelfSigned = $bVerifySsl ? !!$bAllowSelfSigned : true; + + $aStreamContextSettings = array( + 'ssl' => array( + 'verify_host' => $bVerifySsl, + 'verify_peer' => $bVerifySsl, + 'verify_peer_name' => $bVerifySsl, + 'allow_self_signed' => $bAllowSelfSigned + ) + ); + + \MailSo\Hooks::Run('Net.NetClient.StreamContextSettings/Filter', array(&$aStreamContextSettings)); + + $rStreamContext = \stream_context_create($aStreamContextSettings); + + \set_error_handler(array(&$this, 'capturePhpErrorWithException')); + + try + { + $this->rConnect = \stream_socket_client($this->sConnectedHost.':'.$this->iConnectedPort, + $iErrorNo, $sErrorStr, $this->iConnectTimeOut, STREAM_CLIENT_CONNECT, $rStreamContext); + } + catch (\Exception $oExc) + { + $sErrorStr = $oExc->getMessage(); + $iErrorNo = $oExc->getCode(); + } + + \restore_error_handler(); + + $this->writeLog('Connected ('.(\is_resource($this->rConnect) ? 'success' : 'unsuccess').')', + \MailSo\Log\Enumerations\Type::NOTE); + + if (!\is_resource($this->rConnect)) + { + $this->writeLogException( + new Exceptions\SocketCanNotConnectToHostException( + \MailSo\Base\Utils::ConvertSystemString($sErrorStr), (int) $iErrorNo, + 'Can\'t connect to host "'.$this->sConnectedHost.':'.$this->iConnectedPort.'"' + ), \MailSo\Log\Enumerations\Type::NOTICE, true); + } + + $this->writeLog((\microtime(true) - $this->iStartConnectTime).' (raw connection)', + \MailSo\Log\Enumerations\Type::TIME); + + if ($this->rConnect) + { + if (\MailSo\Base\Utils::FunctionExistsAndEnabled('stream_set_timeout')) + { + @\stream_set_timeout($this->rConnect, $this->iSocketTimeOut); + } + } + } + + public function EnableCrypto() + { + $bError = true; + if (\is_resource($this->rConnect) && + \MailSo\Base\Utils::FunctionExistsAndEnabled('stream_socket_enable_crypto')) + { + switch (true) + { + case defined('STREAM_CRYPTO_METHOD_ANY_CLIENT') && + @\stream_socket_enable_crypto($this->rConnect, true, STREAM_CRYPTO_METHOD_ANY_CLIENT): + case @\stream_socket_enable_crypto($this->rConnect, true, STREAM_CRYPTO_METHOD_TLS_CLIENT): + case @\stream_socket_enable_crypto($this->rConnect, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT): + $bError = false; + break; + } + } + + if ($bError) + { + $this->writeLogException( + new \MailSo\Net\Exceptions\Exception('Cannot enable STARTTLS.'), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + } + + /** + * @return void + */ + public function Disconnect() + { + if (\is_resource($this->rConnect)) + { + $bResult = \fclose($this->rConnect); + + $this->writeLog('Disconnected from "'.$this->sConnectedHost.':'.$this->iConnectedPort.'" ('. + (($bResult) ? 'success' : 'unsuccess').')', \MailSo\Log\Enumerations\Type::NOTE); + + if (0 !== $this->iStartConnectTime) + { + $this->writeLog((\microtime(true) - $this->iStartConnectTime).' (net session)', + \MailSo\Log\Enumerations\Type::TIME); + + $this->iStartConnectTime = 0; + } + + $this->rConnect = null; + } + } + + /** + * @retun void + * + * @throws \MailSo\Net\Exceptions\Exception + */ + public function LogoutAndDisconnect() + { + if (\method_exists($this, 'Logout') && !$this->bUnreadBuffer && !$this->bRunningCallback) + { + $this->Logout(); + } + + $this->Disconnect(); + } + + /** + * @param bool $bThrowExceptionOnFalse = false + * + * @return bool + */ + public function IsConnected($bThrowExceptionOnFalse = false) + { + $bResult = \is_resource($this->rConnect); + if (!$bResult && $bThrowExceptionOnFalse) + { + $this->writeLogException( + new Exceptions\SocketConnectionDoesNotAvailableException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + return $bResult; + } + + /** + * @return void + * + * @throws \MailSo\Net\Exceptions\SocketConnectionDoesNotAvailableException + */ + public function IsConnectedWithException() + { + $this->IsConnected(true); + } + + /** + * @return array|bool + */ + public function StreamContextParams() + { + return \is_resource($this->rConnect) && \MailSo\Base\Utils::FunctionExistsAndEnabled('stream_context_get_options') + ? \stream_context_get_params($this->rConnect) : false; + } + + /** + * @param string $sRaw + * @param bool $bWriteToLog = true + * @param string $sFakeRaw = '' + * + * @return void + * + * @throws \MailSo\Net\Exceptions\SocketConnectionDoesNotAvailableException + * @throws \MailSo\Net\Exceptions\SocketWriteException + */ + protected function sendRaw($sRaw, $bWriteToLog = true, $sFakeRaw = '') + { + if ($this->bUnreadBuffer) + { + $this->writeLogException( + new Exceptions\SocketUnreadBufferException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + $bFake = 0 < \strlen($sFakeRaw); + $sRaw .= "\r\n"; + + if ($this->oLogger && $this->oLogger->IsShowSecter()) + { + $bFake = false; + } + + if ($bFake) + { + $sFakeRaw .= "\r\n"; + } + + $mResult = @\fwrite($this->rConnect, $sRaw); + if (false === $mResult) + { + $this->IsConnected(true); + + $this->writeLogException( + new Exceptions\SocketWriteException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + else + { + \MailSo\Base\Loader::IncStatistic('NetWrite', $mResult); + + if ($bWriteToLog) + { + $this->writeLogWithCrlf('> '.($bFake ? $sFakeRaw : $sRaw), //.' ['.$iWriteSize.']', + $bFake ? \MailSo\Log\Enumerations\Type::SECURE : \MailSo\Log\Enumerations\Type::INFO); + } + } + } + + /** + * @param mixed $mReadLen = null + * @param bool $bForceLogin = false + * + * @return void + * + * @throws \MailSo\Net\Exceptions\SocketConnectionDoesNotAvailableException + * @throws \MailSo\Net\Exceptions\SocketReadException + */ + protected function getNextBuffer($mReadLen = null, $bForceLogin = false) + { + if (null === $mReadLen) + { + $this->sResponseBuffer = @\fgets($this->rConnect); + } + else + { + $this->sResponseBuffer = ''; + $iRead = $mReadLen; + while (0 < $iRead) + { + $sAddRead = @\fread($this->rConnect, $iRead); + if (false === $sAddRead) + { + $this->sResponseBuffer = false; + break; + } + + $this->sResponseBuffer .= $sAddRead; + $iRead -= \strlen($sAddRead); + } + } + + if (false === $this->sResponseBuffer) + { + $this->IsConnected(true); + $this->bUnreadBuffer = true; + + $aSocketStatus = @\stream_get_meta_data($this->rConnect); + if (isset($aSocketStatus['timed_out']) && $aSocketStatus['timed_out']) + { + $this->writeLogException( + new Exceptions\SocketReadTimeoutException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + else + { + $this->writeLog('Stream Meta: '. + \print_r($aSocketStatus, true), \MailSo\Log\Enumerations\Type::ERROR); + + $this->writeLogException( + new Exceptions\SocketReadException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + } + else + { + $iReadedLen = \strlen($this->sResponseBuffer); + if (null === $mReadLen || $bForceLogin) + { + $iLimit = 5000; // 5KB + if ($iLimit < $iReadedLen) + { + $this->writeLogWithCrlf('[cutted:'.$iReadedLen.'] < '.\substr($this->sResponseBuffer, 0, $iLimit).'...', + \MailSo\Log\Enumerations\Type::INFO); + } + else + { + $this->writeLogWithCrlf('< '.$this->sResponseBuffer, //.' ['.$iReadedLen.']', + \MailSo\Log\Enumerations\Type::INFO); + } + } + else + { + $this->writeLog('Received '.$iReadedLen.'/'.$mReadLen.' bytes.', + \MailSo\Log\Enumerations\Type::INFO); + } + + \MailSo\Base\Loader::IncStatistic('NetRead', $iReadedLen); + } + } + + /** + * @return string + */ + protected function getLogName() + { + return 'NET'; + } + + /** + * @param string $sDesc + * @param int $iDescType = \MailSo\Log\Enumerations\Type::INFO + * + * @return void + */ + protected function writeLog($sDesc, $iDescType = \MailSo\Log\Enumerations\Type::INFO, $bDiplayCrLf = false) + { + if ($this->oLogger) + { + $this->oLogger->Write($sDesc, $iDescType, $this->getLogName(), true, $bDiplayCrLf); + } + } + + /** + * @param string $sDesc + * @param int $iDescType = \MailSo\Log\Enumerations\Type::INFO + * + * @return void + */ + protected function writeLogWithCrlf($sDesc, $iDescType = \MailSo\Log\Enumerations\Type::INFO) + { + $this->writeLog($sDesc, $iDescType, true); + } + + /** + * @param \Exception $oException + * @param int $iDescType = \MailSo\Log\Enumerations\Type::NOTICE + * @param bool $bThrowException = false + * + * @return void + */ + protected function writeLogException($oException, + $iDescType = \MailSo\Log\Enumerations\Type::NOTICE, $bThrowException = false) + { + if ($this->oLogger) + { + if ($oException instanceof Exceptions\SocketCanNotConnectToHostException) + { + $this->oLogger->Write('Socket: ['.$oException->getSocketCode().'] '.$oException->getSocketMessage(), $iDescType, $this->getLogName()); + } + + $this->oLogger->WriteException($oException, $iDescType, $this->getLogName()); + } + + if ($bThrowException) + { + throw $oException; + } + } + + /** + * @param \MailSo\Log\Logger $oLogger + * + * @return void + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public function SetLogger($oLogger) + { + if (!($oLogger instanceof \MailSo\Log\Logger)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $this->oLogger = $oLogger; + } + + /** + * @return \MailSo\Log\Logger|null + */ + public function Logger() + { + return $this->oLogger; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/Exception.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/Exception.php new file mode 100755 index 00000000..0cc582d5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/Exception.php @@ -0,0 +1,19 @@ +aResponses = $aResponses; + } + } + + /** + * @return array + */ + public function GetResponses() + { + return $this->aResponses; + } + + /** + * @return \MailSo\Pop3\Response | null + */ + public function GetLastResponse() + { + return 0 < count($this->aResponses) ? $this->aResponses[count($this->aResponses) - 1] : null; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/RuntimeException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/RuntimeException.php new file mode 100755 index 00000000..047c32a6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/RuntimeException.php @@ -0,0 +1,19 @@ +bIsLoggined = false; + $this->iRequestTime = 0; + $this->aCapa = null; + $this->sLastMessage = ''; + } + + /** + * @return \MailSo\Pop3\Pop3Client + */ + public static function NewInstance() + { + return new self(); + } + + /** + * @param string $sServerName + * @param int $iPort = 110 + * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT + * @param bool $bVerifySsl = false + * @param bool $bAllowSelfSigned = null + * + * @return \MailSo\Pop3\Pop3Client + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Pop3\Exceptions\ResponseException + */ + public function Connect($sServerName, $iPort = 110, + $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT, + $bVerifySsl = false, $bAllowSelfSigned = null) + { + $this->iRequestTime = microtime(true); + + parent::Connect($sServerName, $iPort, $iSecurityType, $bVerifySsl, $bAllowSelfSigned); + + $this->validateResponse(); + + if (\MailSo\Net\Enumerations\ConnectionSecurityType::UseStartTLS( + in_array('STLS', $this->Capa()), $this->iSecurityType)) + { + $this->sendRequestWithCheck('STLS'); + $this->EnableCrypto(); + + $this->aCapa = null; + } + else if (\MailSo\Net\Enumerations\ConnectionSecurityType::STARTTLS === $this->iSecurityType) + { + $this->writeLogException( + new \MailSo\Net\Exceptions\SocketUnsuppoterdSecureConnectionException('STARTTLS is not supported'), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + return $this; + } + + /** + * @param string $sLogin = '' + * @param string $sPassword = '' + * + * @return \MailSo\Pop3\Pop3Client + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Pop3\Exceptions\ResponseException + */ + public function Login($sLogin, $sPassword) + { + if ($this->bIsLoggined) + { + $this->writeLogException( + new Exceptions\RuntimeException('Already authenticated for this session'), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + $sLogin = trim($sLogin); + $sPassword = $sPassword; + + try + { + $this->sendRequestWithCheck('USER', $sLogin); + $this->sendRequestWithCheck('PASS', $sPassword); + } + catch (\MailSo\Pop3\Exceptions\NegativeResponseException $oException) + { + $this->writeLogException( + new \MailSo\Pop3\Exceptions\LoginBadCredentialsException( + $oException->GetResponses(), '', 0, $oException), + \MailSo\Log\Enumerations\Type::NOTICE, true); + } + + $this->bIsLoggined = true; + $this->aCapa = null; + + return $this; + } + + /** + * @return bool + */ + public function IsLoggined() + { + return $this->IsConnected() && $this->bIsLoggined; + } + + /** + * @return \MailSo\Pop3\Pop3Client + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Pop3\Exceptions\Exception + */ + public function Noop() + { + $this->sendRequestWithCheck('NOOP'); + return $this; + } + + /** + * @return array [MessagesCount, Size] + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Pop3\Exceptions\Exception + */ + public function Status() + { + $this->sendRequestWithCheck('STAT'); + + $iMessageCount = $iSize = 0; + sscanf($this->sLastMessage, '%d %d', $iMessageCount, $iSize); + + return array((int) $iMessageCount, (int) $iSize); + } + + /** + * @return \MailSo\Pop3\Pop3Client + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Pop3\Exceptions\Exception + */ + public function Capa() + { + if (null === $this->aCapa) + { + $this->sendRequestWithCheck('CAPA'); + + $this->aCapa = array_filter(explode("\n", $this->readMultilineResponse()), function (&$sCapa) { + return 0 < strlen(trim($sCapa)); + }); + + $this->aCapa = array_map('trim', $this->aCapa); + } + + return $this->aCapa; + } + + /** + * @return \MailSo\Pop3\Pop3Client + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Pop3\Exceptions\Exception + */ + public function Logout() + { + if ($this->bIsLoggined) + { + $this->sendRequestWithCheck('QUIT'); + } + + $this->bIsLoggined = false; + return $this; + } + + /** + * @param string $sCommand + * @param string $sAddToCommand = '' + * + * @return \MailSo\Pop3\Pop3Client + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + */ + protected function sendRequest($sCommand, $sAddToCommand = '') + { + if (0 === strlen(trim($sCommand))) + { + $this->writeLogException( + new \MailSo\Base\Exceptions\InvalidArgumentException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + $this->IsConnected(true); + + $sCommand = trim($sCommand); + $sRealCommand = $sCommand.(0 === strlen($sAddToCommand) ? '' : ' '.$sAddToCommand); + + $sFakeCommand = ''; + $sFakeAddToCommand = $this->secureRequestParams($sCommand, $sAddToCommand); + if (0 < strlen($sFakeAddToCommand)) + { + $sFakeCommand = $sCommand.' '.$sFakeAddToCommand; + } + + $this->iRequestTime = microtime(true); + $this->sendRaw($sRealCommand, true, $sFakeCommand); + return $this; + } + + /** + * @param string $sCommand + * @param string $sAddToCommand + * + * @return string + */ + private function secureRequestParams($sCommand, $sAddToCommand) + { + $sResult = null; + if (0 < strlen($sAddToCommand)) + { + switch ($sCommand) + { + case 'PASS': + $sResult = '********'; + break; + } + } + + return $sResult; + } + + /** + * @param string $sCommand + * @param string $sAddToCommand = '' + * + * @return \MailSo\Pop3\Pop3Client + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Pop3\Exceptions\Exception + */ + private function sendRequestWithCheck($sCommand, $sAddToCommand = '') + { + $this->sendRequest($sCommand, $sAddToCommand); + return $this->validateResponse(); + } + + /** + * @return string + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Pop3\Exceptions\ResponseException + */ + private function validateResponse() + { + $this->getNextBuffer(); + + $this->sLastMessage = ''; + $sStatus = $sMessage = ''; + $sBuffer = trim($this->sResponseBuffer); + $sStatus = $sBuffer; + if (false !== strpos($sBuffer, ' ')) + { + list($sStatus, $sMessage) = explode(' ', $sBuffer, 2); + } + + $this->sLastMessage = $sMessage; + + if ($sStatus != '+OK') + { + $this->writeLogException( + new Exceptions\NegativeResponseException(), + \MailSo\Log\Enumerations\Type::WARNING, true); + } + + $this->writeLog((microtime(true) - $this->iRequestTime), + \MailSo\Log\Enumerations\Type::TIME); + } + + /** + * @return string + * + * @throws \MailSo\Net\Exceptions\Exception + */ + private function readMultilineResponse() + { + $this->iRequestTime = microtime(true); + + $sResult = ''; + do + { + $this->getNextBuffer(); + if (0 === strpos($this->sResponseBuffer, '.')) + { + $sResult .= substr($this->sResponseBuffer, 1); + } + else + { + $sResult .= $this->sResponseBuffer; + } + } + while ('.' !== rtrim($this->sResponseBuffer, "\r\n")); + + $this->writeLog((microtime(true) - $this->iRequestTime), + \MailSo\Log\Enumerations\Type::TIME); + + return $sResult; + } + + /** + * @return string + */ + protected function getLogName() + { + return 'POP3'; + } + + /** + * @param \MailSo\Log\Logger $oLogger + * @return \MailSo\Pop3\Pop3Client + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public function SetLogger($oLogger) + { + parent::SetLogger($oLogger); + + return $this; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/Exception.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/Exception.php new file mode 100755 index 00000000..76097ffb --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/Exception.php @@ -0,0 +1,19 @@ +aResponses = $aResponses; + } + } + + /** + * @return array + */ + public function GetResponses() + { + return $this->aResponses; + } + + /** + * @return \MailSo\Poppassd\Response | null + */ + public function GetLastResponse() + { + return 0 < \count($this->aResponses) ? $this->aResponses[count($this->aResponses) - 1] : null; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/RuntimeException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/RuntimeException.php new file mode 100755 index 00000000..5b94cb3f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/RuntimeException.php @@ -0,0 +1,19 @@ +bIsLoggined = false; + $this->iRequestTime = 0; + + parent::__construct(); + } + + /** + * @return \MailSo\Poppassd\PoppassdClient + */ + public static function NewInstance() + { + return new self(); + } + + /** + * @param string $sServerName + * @param int $iPort = 106 + * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT + * @param bool $bVerifySsl = false + * @param bool $bAllowSelfSigned = true + * + * @return \MailSo\Poppassd\PoppassdClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Poppassd\Exceptions\ResponseException + */ + public function Connect($sServerName, $iPort = 106, + $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT, + $bVerifySsl = false, $bAllowSelfSigned = true) + { + $this->iRequestTime = \microtime(true); + + parent::Connect($sServerName, $iPort, $iSecurityType, $bVerifySsl, $bAllowSelfSigned); + + $this->validateResponse(); + + return $this; + } + + /** + * @param string $sLogin = '' + * @param string $sPassword = '' + * + * @return \MailSo\Poppassd\PoppassdClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Poppassd\Exceptions\ResponseException + */ + public function Login($sLogin, $sPassword) + { + if ($this->bIsLoggined) + { + $this->writeLogException( + new Exceptions\RuntimeException('Already authenticated for this session'), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + $sLogin = \trim($sLogin); + $sPassword = $sPassword; + + try + { + $this->sendRequestWithCheck('user', $sLogin, true); + $this->sendRequestWithCheck('pass', $sPassword, true); + } + catch (\MailSo\Poppassd\Exceptions\NegativeResponseException $oException) + { + $this->writeLogException( + new \MailSo\Poppassd\Exceptions\LoginBadCredentialsException( + $oException->GetResponses(), '', 0, $oException), + \MailSo\Log\Enumerations\Type::NOTICE, true); + } + + $this->bIsLoggined = true; + + return $this; + } + + /** + * @return \MailSo\Poppassd\PoppassdClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Poppassd\Exceptions\Exception + */ + public function Logout() + { + if ($this->bIsLoggined) + { + $this->sendRequestWithCheck('quit'); + } + + $this->bIsLoggined = false; + return $this; + } + + /** + * @param string $sNewPassword + * + * @return \MailSo\Poppassd\PoppassdClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Poppassd\Exceptions\Exception + */ + public function NewPass($sNewPassword) + { + if ($this->bIsLoggined) + { + $this->sendRequestWithCheck('newpass', $sNewPassword); + } + else + { + $this->writeLogException( + new \MailSo\Poppassd\Exceptions\RuntimeException('Required login'), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + return $this; + } + + /** + * @param string $sCommand + * @param string $sAddToCommand + * + * @return string + */ + private function secureRequestParams($sCommand, $sAddToCommand) + { + $sResult = null; + if (0 < \strlen($sAddToCommand)) + { + switch (\strtolower($sCommand)) + { + case 'pass': + case 'newpass': + $sResult = '********'; + break; + } + } + + return $sResult; + } + + /** + * @param string $sCommand + * @param string $sAddToCommand = '' + * + * @return \MailSo\Poppassd\PoppassdClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + */ + private function sendRequest($sCommand, $sAddToCommand = '') + { + if (0 === \strlen(\trim($sCommand))) + { + $this->writeLogException( + new \MailSo\Base\Exceptions\InvalidArgumentException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + $this->IsConnected(true); + + $sCommand = \trim($sCommand); + $sRealCommand = $sCommand.(0 === \strlen($sAddToCommand) ? '' : ' '.$sAddToCommand); + + $sFakeCommand = ''; + $sFakeAddToCommand = $this->secureRequestParams($sCommand, $sAddToCommand); + if (0 < \strlen($sFakeAddToCommand)) + { + $sFakeCommand = $sCommand.' '.$sFakeAddToCommand; + } + + $this->iRequestTime = \microtime(true); + $this->sendRaw($sRealCommand, true, $sFakeCommand); + + return $this; + } + + /** + * @param string $sCommand + * @param string $sAddToCommand = '' + * @param bool $bAuthRequestValidate = false + * + * @return \MailSo\Poppassd\PoppassdClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Poppassd\Exceptions\Exception + */ + private function sendRequestWithCheck($sCommand, $sAddToCommand = '', $bAuthRequestValidate = false) + { + $this->sendRequest($sCommand, $sAddToCommand); + $this->validateResponse($bAuthRequestValidate); + + return $this; + } + + /** + * @param bool $bAuthRequestValidate = false + * + * @return \MailSo\Poppassd\PoppassdClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Poppassd\Exceptions\ResponseException + */ + private function validateResponse($bAuthRequestValidate = false) + { + $this->getNextBuffer(); + + $bResult = false; + if ($bAuthRequestValidate) + { + $bResult = (bool) \preg_match('/^[23]\d\d/', trim($this->sResponseBuffer)); + } + else + { + $bResult = (bool) \preg_match('/^2\d\d/', \trim($this->sResponseBuffer)); + } + + if (!$bResult) + { + // POP3 validation hack + $bResult = '+OK ' === \substr(\trim($this->sResponseBuffer), 0, 4); + } + + if (!$bResult) + { + $this->writeLogException( + new Exceptions\NegativeResponseException(), + \MailSo\Log\Enumerations\Type::WARNING, true); + } + + $this->writeLog((\microtime(true) - $this->iRequestTime), + \MailSo\Log\Enumerations\Type::TIME); + + return $this; + } + + /** + * @return string + */ + protected function getLogName() + { + return 'POPPASSD'; + } + + /** + * @param \MailSo\Log\Logger $oLogger + * + * @return \MailSo\Poppassd\PoppassdClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public function SetLogger($oLogger) + { + parent::SetLogger($oLogger); + + return $this; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/Exception.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/Exception.php new file mode 100755 index 00000000..0740485c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/Exception.php @@ -0,0 +1,19 @@ +aResponses = $aResponses; + } + } + + /** + * @return array + */ + public function GetResponses() + { + return $this->aResponses; + } + + /** + * @return \MailSo\Sieve\Response | null + */ + public function GetLastResponse() + { + return 0 < count($this->aResponses) ? $this->aResponses[count($this->aResponses) - 1] : null; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/RuntimeException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/RuntimeException.php new file mode 100755 index 00000000..8704e461 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/RuntimeException.php @@ -0,0 +1,19 @@ +bIsLoggined = false; + $this->iRequestTime = 0; + $this->aCapa = array(); + $this->aModules = array(); + + $this->__USE_INITIAL_AUTH_PLAIN_COMMAND = true; + } + + /** + * @return \MailSo\Sieve\ManageSieveClient + */ + public static function NewInstance() + { + return new self(); + } + + /** + * @param string $sCapa + * + * @return bool + */ + public function IsSupported($sCapa) + { + return isset($this->aCapa[\strtoupper($sCapa)]); + } + + /** + * @param string $sModule + * + * @return bool + */ + public function IsModuleSupported($sModule) + { + return $this->IsSupported('SIEVE') && \in_array(\strtolower(\trim($sModule)), $this->aModules); + } + + /** + * @return array + */ + public function Modules() + { + return $this->aModules; + } + + /** + * @param string $sAuth + * + * @return bool + */ + public function IsAuthSupported($sAuth) + { + return $this->IsSupported('SASL') && \in_array(\strtoupper($sAuth), $this->aAuth); + } + + /** + * @param string $sServerName + * @param int $iPort + * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT + * @param bool $bVerifySsl = false + * @param bool $bAllowSelfSigned = true + * + * @return \MailSo\Sieve\ManageSieveClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Sieve\Exceptions\ResponseException + */ + public function Connect($sServerName, $iPort, + $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT, + $bVerifySsl = false, $bAllowSelfSigned = true) + { + $this->iRequestTime = \microtime(true); + + parent::Connect($sServerName, $iPort, $iSecurityType, $bVerifySsl, $bAllowSelfSigned); + + $mResponse = $this->parseResponse(); + $this->validateResponse($mResponse); + $this->parseStartupResponse($mResponse); + + if (\MailSo\Net\Enumerations\ConnectionSecurityType::UseStartTLS( + $this->IsSupported('STARTTLS'), $this->iSecurityType)) + { + $this->sendRequestWithCheck('STARTTLS'); + $this->EnableCrypto(); + + $mResponse = $this->parseResponse(); + $this->validateResponse($mResponse); + $this->parseStartupResponse($mResponse); + } + else if (\MailSo\Net\Enumerations\ConnectionSecurityType::STARTTLS === $this->iSecurityType) + { + $this->writeLogException( + new \MailSo\Net\Exceptions\SocketUnsuppoterdSecureConnectionException('STARTTLS is not supported'), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + return $this; + } + + /** + * @param string $sLogin + * @param string $sPassword + * @param string $sLoginAuthKey = '' + * + * @return \MailSo\Sieve\ManageSieveClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Sieve\Exceptions\LoginException + */ + public function Login($sLogin, $sPassword, $sLoginAuthKey = '') + { + if (!\MailSo\Base\Validator::NotEmptyString($sLogin, true) || + !\MailSo\Base\Validator::NotEmptyString($sPassword, true)) + { + $this->writeLogException( + new \MailSo\Base\Exceptions\InvalidArgumentException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + if ($this->IsSupported('SASL')) + { + $bAuth = false; + try + { + if ($this->IsAuthSupported('PLAIN')) + { + $sAuth = \base64_encode($sLoginAuthKey."\0".$sLogin."\0".$sPassword); + + if ($this->__USE_INITIAL_AUTH_PLAIN_COMMAND) + { + $this->sendRequest('AUTHENTICATE "PLAIN" "'.$sAuth.'"'); + } + else + { + $this->sendRequest('AUTHENTICATE "PLAIN" {'.\strlen($sAuth).'+}'); + $this->sendRequest($sAuth); + } + + $mResponse = $this->parseResponse(); + $this->validateResponse($mResponse); + $this->parseStartupResponse($mResponse); + $bAuth = true; + } + else if ($this->IsAuthSupported('LOGIN')) + { + $sLogin = \base64_encode($sLogin); + $sPassword = \base64_encode($sPassword); + + $this->sendRequest('AUTHENTICATE "LOGIN"'); + $this->sendRequest('{'.\strlen($sLogin).'+}'); + $this->sendRequest($sLogin); + $this->sendRequest('{'.\strlen($sPassword).'+}'); + $this->sendRequest($sPassword); + + $mResponse = $this->parseResponse(); + $this->validateResponse($mResponse); + $this->parseStartupResponse($mResponse); + $bAuth = true; + } + } + catch (\MailSo\Sieve\Exceptions\NegativeResponseException $oException) + { + $this->writeLogException( + new \MailSo\Sieve\Exceptions\LoginBadCredentialsException( + $oException->GetResponses(), '', 0, $oException), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + if (!$bAuth) + { + $this->writeLogException( + new \MailSo\Sieve\Exceptions\LoginBadMethodException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + } + else + { + $this->writeLogException( + new \MailSo\Sieve\Exceptions\LoginException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + $this->bIsLoggined = true; + + return $this; + } + + /** + * @return \MailSo\Sieve\ManageSieveClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Sieve\Exceptions\NegativeResponseException + */ + public function Logout() + { + if ($this->bIsLoggined) + { + $this->sendRequestWithCheck('LOGOUT'); + $this->bIsLoggined = false; + } + + return $this; + } + + /** + * @return array + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Sieve\Exceptions\NegativeResponseException + */ + public function ListScripts() + { + $this->sendRequest('LISTSCRIPTS'); + $mResponse = $this->parseResponse(); + $this->validateResponse($mResponse); + + $aResult = array(); + if (\is_array($mResponse)) + { + foreach ($mResponse as $sLine) + { + $aTokens = $this->parseLine($sLine); + if (false === $aTokens) + { + continue; + } + + $aResult[$aTokens[0]] = 'ACTIVE' === substr($sLine, -6); + } + } + + return $aResult; + } + + /** + * @return array + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Sieve\Exceptions\NegativeResponseException + */ + public function Capability() + { + $this->sendRequest('CAPABILITY'); + $mResponse = $this->parseResponse(); + $this->validateResponse($mResponse); + $this->parseStartupResponse($mResponse); + + return $this->aCapa; + } + + /** + * @return \MailSo\Sieve\ManageSieveClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Sieve\Exceptions\NegativeResponseException + */ + public function Noop() + { + $this->sendRequestWithCheck('NOOP'); + + return $this; + } + + /** + * @param string $sScriptName + * + * @return string + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Sieve\Exceptions\NegativeResponseException + */ + public function GetScript($sScriptName) + { + $this->sendRequest('GETSCRIPT "'.$sScriptName.'"'); + $mResponse = $this->parseResponse(); + $this->validateResponse($mResponse); + + $sScript = ''; + if (\is_array($mResponse) && 0 < \count($mResponse)) + { + if ('{' === $mResponse[0]{0}) + { + \array_shift($mResponse); + } + + if (\in_array(\substr($mResponse[\count($mResponse) - 1], 0, 2), array('OK', 'NO'))) + { + \array_pop($mResponse); + } + + $sScript = \implode("\n", $mResponse); + } + + return $sScript; + } + + /** + * @param string $sScriptName + * @param string $sScriptSource + * + * @return \MailSo\Sieve\ManageSieveClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Sieve\Exceptions\NegativeResponseException + */ + public function PutScript($sScriptName, $sScriptSource) + { + $this->sendRequest('PUTSCRIPT "'.$sScriptName.'" {'.\strlen($sScriptSource).'+}'); + $this->sendRequestWithCheck($sScriptSource); + + return $this; + } + + /** + * @param string $sScriptSource + * + * @return \MailSo\Sieve\ManageSieveClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Sieve\Exceptions\NegativeResponseException + */ + public function CheckScript($sScriptSource) + { + $this->sendRequest('CHECKSCRIPT {'.\strlen($sScriptSource).'+}'); + $this->sendRequestWithCheck($sScriptSource); + + return $this; + } + + /** + * @param string $sScriptName + * + * @return \MailSo\Sieve\ManageSieveClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Sieve\Exceptions\NegativeResponseException + */ + public function SetActiveScript($sScriptName) + { + $this->sendRequestWithCheck('SETACTIVE "'.$sScriptName.'"'); + + return $this; + } + + /** + * @param string $sScriptName + * + * @return \MailSo\Sieve\ManageSieveClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Sieve\Exceptions\NegativeResponseException + */ + public function DeleteScript($sScriptName) + { + $this->sendRequestWithCheck('DELETESCRIPT "'.$sScriptName.'"'); + + return $this; + } + + /** + * @return string + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Sieve\Exceptions\NegativeResponseException + */ + public function GetActiveScriptName() + { + $aList = $this->ListScripts(); + if (\is_array($aList) && 0 < \count($aList)) + { + foreach ($aList as $sName => $bIsActive) + { + if ($bIsActive) + { + return $sName; + } + } + } + + return ''; + } + + /** + * @param string $sScriptName + * + * @return bool + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Sieve\Exceptions\NegativeResponseException + */ + public function IsActiveScript($sScriptName) + { + return $sScriptName === $this->GetActiveScriptName(); + } + + /** + * @param string $sLine + * @return array|false + */ + private function parseLine($sLine) + { + if (false === $sLine || null === $sLine || \in_array(\substr($sLine, 0, 2), array('OK', 'NO'))) + { + return false; + } + + $iStart = -1; + $iIndex = 0; + $aResult = false; + + for ($iPos = 0; $iPos < \strlen($sLine); $iPos++) + { + if ('"' === $sLine[$iPos] && '\\' !== $sLine[$iPos]) + { + if (-1 === $iStart) + { + $iStart = $iPos; + } + else + { + $aResult = \is_array($aResult) ? $aResult : array(); + $aResult[$iIndex++] = \substr($sLine, $iStart + 1, $iPos - $iStart - 1); + $iStart = -1; + } + } + } + + return \is_array($aResult) && isset($aResult[0]) ? $aResult : false; + } + + /** + * @param string $mResponse + * + * @return void + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + */ + private function parseStartupResponse($mResponse) + { + foreach ($mResponse as $sLine) + { + $aTokens = $this->parseLine($sLine); + + if (false === $aTokens || !isset($aTokens[0]) || + \in_array(\substr($sLine, 0, 2), array('OK', 'NO'))) + { + continue; + } + + $sToken = \strtoupper($aTokens[0]); + $this->aCapa[$sToken] = isset($aTokens[1]) ? $aTokens[1] : ''; + + if (isset($aTokens[1])) + { + switch ($sToken) { + case 'SASL': + $this->aAuth = \explode(' ', \strtoupper($aTokens[1])); + break; + case 'SIEVE': + $this->aModules = \explode(' ', \strtolower($aTokens[1])); + break; + } + } + } + } + + /** + * @param string $sRequest + * + * @return void + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + */ + private function sendRequest($sRequest) + { + if (!\MailSo\Base\Validator::NotEmptyString($sRequest, true)) + { + $this->writeLogException( + new \MailSo\Base\Exceptions\InvalidArgumentException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + $this->IsConnected(true); + + $this->sendRaw($sRequest); + } + + /** + * @param string $sRequest + * + * @return void + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Sieve\Exceptions\NegativeResponseException + */ + private function sendRequestWithCheck($sRequest) + { + $this->sendRequest($sRequest); + $this->validateResponse($this->parseResponse()); + } + + /** + * @param string $sLine + * + * @return string + */ + private function convertEndOfLine($sLine) + { + $sLine = \trim($sLine); + if ('}' === \substr($sLine, -1)) + { + $iPos = \strrpos($sLine, '{'); + if (false !== $iPos) + { + $sSunLine = \substr($sLine, $iPos + 1, -1); + if (\is_numeric($sSunLine) && 0 < (int) $sSunLine) + { + $iLen = (int) $sSunLine; + + $this->getNextBuffer($iLen, true); + + if (\strlen($this->sResponseBuffer) === $iLen) + { + $sLine = \trim(\substr_replace($sLine, $this->sResponseBuffer, $iPos)); + } + } + } + } + + return $sLine; + } + + /** + * @return array|bool + */ + private function parseResponse() + { + $this->iRequestTime = \microtime(true); + + $aResult = array(); + do + { + $this->getNextBuffer(); + + $sLine = $this->sResponseBuffer; + if (false === $sLine) + { + break; + } + else if (\in_array(\substr($sLine, 0, 2), array('OK', 'NO'))) + { + $aResult[] = $this->convertEndOfLine($sLine); + break; + } + else + { + $aResult[] = $this->convertEndOfLine($sLine); + } + } + while (true); + + $this->writeLog((\microtime(true) - $this->iRequestTime), + \MailSo\Log\Enumerations\Type::TIME); + + return $aResult; + } + + /** + * @throws \MailSo\Sieve\Exceptions\NegativeResponseException + */ + private function validateResponse($aResponse) + { + if (!\is_array($aResponse) || 0 === \count($aResponse) || + 'OK' !== \substr($aResponse[\count($aResponse) - 1], 0, 2)) + { + $this->writeLogException( + new \MailSo\Sieve\Exceptions\NegativeResponseException($aResponse), + \MailSo\Log\Enumerations\Type::WARNING, true); + } + } + + /** + * @return string + */ + protected function getLogName() + { + return 'SIEVE'; + } + + /** + * @param \MailSo\Log\Logger $oLogger + * + * @return \MailSo\Sieve\ManageSieveClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public function SetLogger($oLogger) + { + parent::SetLogger($oLogger); + + return $this; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/Exception.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/Exception.php new file mode 100755 index 00000000..7c18f189 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/Exception.php @@ -0,0 +1,19 @@ +aResponses = $aResponses; + } + } + + /** + * @return array + */ + public function GetResponses() + { + return $this->aResponses; + } + + /** + * @return \MailSo\Smtp\Response | null + */ + public function GetLastResponse() + { + return 0 < count($this->aResponses) ? $this->aResponses[count($this->aResponses) - 1] : null; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/RuntimeException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/RuntimeException.php new file mode 100755 index 00000000..294b93b0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/RuntimeException.php @@ -0,0 +1,19 @@ +aAuthTypes = array(); + + $this->iRequestTime = 0; + $this->iSizeCapaValue = 0; + $this->aResults = array(); + $this->aCapa = array(); + + $this->bHelo = false; + $this->bRcpt = false; + $this->bMail = false; + $this->bData = false; + } + + /** + * @return \MailSo\Smtp\SmtpClient + */ + public static function NewInstance() + { + return new self(); + } + + /** + * @return bool + */ + public function IsSupported($sCapa) + { + return in_array(strtoupper($sCapa), $this->aCapa); + } + + /** + * @return bool + */ + public function IsAuthSupported($sAuth) + { + return in_array(strtoupper($sAuth), $this->aAuthTypes); + } + + /** + * @return bool + */ + public function HasSupportedAuth() + { + return $this->IsAuthSupported('PLAIN') || $this->IsAuthSupported('LOGIN'); + } + + /** + * @return string + */ + public static function EhloHelper() + { + $sEhloHost = empty($_SERVER['SERVER_NAME']) ? '' : \trim($_SERVER['SERVER_NAME']); + if (empty($sEhloHost)) + { + $sEhloHost = empty($_SERVER['HTTP_HOST']) ? '' : \trim($_SERVER['HTTP_HOST']); + } + + if (empty($sEhloHost)) + { + $sEhloHost = \function_exists('gethostname') ? \gethostname() : 'localhost'; + } + + $sEhloHost = \trim(\preg_replace('/:\d+$/', '', \trim($sEhloHost))); + + if (\preg_match('/^\d+\.\d+\.\d+\.\d+$/', $sEhloHost)) + { + $sEhloHost = '['.$sEhloHost.']'; + } + + return empty($sEhloHost) ? 'localhost' : $sEhloHost; + } + + /** + * @param string $sServerName + * @param int $iPort = 25 + * @param string $sEhloHost = '[127.0.0.1]' + * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT + * @param bool $bVerifySsl = false + * @param bool $bAllowSelfSigned = true + * + * @return \MailSo\Smtp\SmtpClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Smtp\Exceptions\ResponseException + */ + public function Connect($sServerName, $iPort = 25, $sEhloHost = '[127.0.0.1]', + $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT, + $bVerifySsl = false, $bAllowSelfSigned = true) + { + $this->iRequestTime = microtime(true); + + parent::Connect($sServerName, $iPort, $iSecurityType, $bVerifySsl, $bAllowSelfSigned); + + $this->validateResponse(220); + + $this->preLoginStartTLSAndEhloProcess($sEhloHost); + + return $this; + } + + /** + * @param string $sLogin + * @param string $sPassword + * @param boolean $bUseAuthPlainIfSupported = true + * @param boolean $bUseAuthCramMd5IfSupported = true + * + * @return \MailSo\Smtp\SmtpClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Smtp\Exceptions\Exception + */ + public function Login($sLogin, $sPassword, $bUseAuthPlainIfSupported = true, $bUseAuthCramMd5IfSupported = true) + { + $sLogin = \MailSo\Base\Utils::IdnToAscii(\MailSo\Base\Utils::Trim($sLogin)); + + if ($bUseAuthCramMd5IfSupported && $this->IsAuthSupported('CRAM-MD5')) + { + try + { + $this->sendRequestWithCheck('AUTH', 334, 'CRAM-MD5'); + } + catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) + { + $this->writeLogException( + new \MailSo\Smtp\Exceptions\LoginBadMethodException( + $oException->GetResponses(), $oException->getMessage(), 0, $oException), + \MailSo\Log\Enumerations\Type::NOTICE, true); + } + + $sTicket = ''; + + $sContinuationResponse = !empty($this->aResults[0]) ? \trim($this->aResults[0]) : ''; + if ($sContinuationResponse && '334 ' === \substr($sContinuationResponse, 0, 4) && 0 < \strlen(\substr($sContinuationResponse, 4))) + { + $sTicket = @\base64_decode(\substr($sContinuationResponse, 4)); + $this->writeLogWithCrlf('ticket: '.$sTicket); + } + + if (empty($sTicket)) + { + $this->writeLogException( + new \MailSo\Smtp\Exceptions\NegativeResponseException(), + \MailSo\Log\Enumerations\Type::NOTICE, true + ); + } + + try + { + $this->sendRequestWithCheck(\base64_encode($sLogin.' '.\MailSo\Base\Utils::Hmac($sTicket, $sPassword)), 235, '', true); + } + catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) + { + $this->writeLogException( + new \MailSo\Smtp\Exceptions\LoginBadCredentialsException( + $oException->GetResponses(), $oException->getMessage(), 0, $oException), + \MailSo\Log\Enumerations\Type::NOTICE, true); + } + } + else if ($bUseAuthPlainIfSupported && $this->IsAuthSupported('PLAIN')) + { + if ($this->__USE_SINGLE_LINE_AUTH_PLAIN_COMMAND) + { + try + { + $this->sendRequestWithCheck('AUTH', 235, 'PLAIN '.\base64_encode("\0".$sLogin."\0".$sPassword), true); + } + catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) + { + $this->writeLogException( + new \MailSo\Smtp\Exceptions\LoginBadCredentialsException( + $oException->GetResponses(), $oException->getMessage(), 0, $oException), + \MailSo\Log\Enumerations\Type::NOTICE, true); + } + } + else + { + try + { + $this->sendRequestWithCheck('AUTH', 334, 'PLAIN'); + } + catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) + { + $this->writeLogException( + new \MailSo\Smtp\Exceptions\LoginBadMethodException( + $oException->GetResponses(), $oException->getMessage(), 0, $oException), + \MailSo\Log\Enumerations\Type::NOTICE, true); + } + + try + { + $this->sendRequestWithCheck(\base64_encode("\0".$sLogin."\0".$sPassword), 235, '', true); + } + catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) + { + $this->writeLogException( + new \MailSo\Smtp\Exceptions\LoginBadCredentialsException( + $oException->GetResponses(), $oException->getMessage(), 0, $oException), + \MailSo\Log\Enumerations\Type::NOTICE, true); + } + } + } + else if ($this->IsAuthSupported('LOGIN')) + { + try + { + $this->sendRequestWithCheck('AUTH', 334, 'LOGIN'); + } + catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) + { + $this->writeLogException( + new \MailSo\Smtp\Exceptions\LoginBadMethodException( + $oException->GetResponses(), $oException->getMessage(), 0, $oException), + \MailSo\Log\Enumerations\Type::NOTICE, true); + } + + try + { + $this->sendRequestWithCheck(\base64_encode($sLogin), 334, ''); + $this->sendRequestWithCheck(\base64_encode($sPassword), 235, '', true); + } + catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) + { + $this->writeLogException( + new \MailSo\Smtp\Exceptions\LoginBadCredentialsException( + $oException->GetResponses(), $oException->getMessage(), 0, $oException), + \MailSo\Log\Enumerations\Type::NOTICE, true); + } + } + else + { + $this->writeLogException( + new \MailSo\Smtp\Exceptions\LoginBadMethodException(), + \MailSo\Log\Enumerations\Type::NOTICE, true); + } + + return $this; + } + + /** + * @param string $sXOAuth2Token + * + * @return \MailSo\Smtp\SmtpClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Smtp\Exceptions\Exception + */ + public function LoginWithXOauth2($sXOAuth2Token) + { + if ($this->IsAuthSupported('XOAUTH2')) + { + try + { + $this->sendRequestWithCheck('AUTH', 235, 'XOAUTH2 '.\trim($sXOAuth2Token)); + } + catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) + { + $this->writeLogException( + new \MailSo\Smtp\Exceptions\LoginBadCredentialsException( + $oException->GetResponses(), $oException->getMessage(), 0, $oException), + \MailSo\Log\Enumerations\Type::NOTICE, true); + } + } + else + { + $this->writeLogException( + new \MailSo\Smtp\Exceptions\LoginBadMethodException(), + \MailSo\Log\Enumerations\Type::NOTICE, true); + } + + return $this; + } + + /** + * @param string $sFrom + * @param string $sSizeIfSupported = '' + * @param bool $bDsn = false + * + * @return \MailSo\Smtp\SmtpClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Smtp\Exceptions\Exception + */ + public function MailFrom($sFrom, $sSizeIfSupported = '', $bDsn = false) + { + $sFrom = \MailSo\Base\Utils::IdnToAscii( + \MailSo\Base\Utils::Trim($sFrom), true); + + $sCmd = 'FROM:<'.$sFrom.'>'; + + $sSizeIfSupported = (string) $sSizeIfSupported; + if (0 < \strlen($sSizeIfSupported) && \is_numeric($sSizeIfSupported) && $this->IsSupported('SIZE')) + { + $sCmd .= ' SIZE='.$sSizeIfSupported; + } + + if ($bDsn && $this->IsSupported('DSN')) + { + $sCmd .= ' RET=HDRS'; + } + + $this->sendRequestWithCheck('MAIL', 250, $sCmd); + + $this->bMail = true; + $this->bRcpt = false; + $this->bData = false; + + return $this; + } + + /** + * @param string $sTo + * @param bool $bDsn = false + * + * @return \MailSo\Smtp\SmtpClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Smtp\Exceptions\Exception + */ + public function Rcpt($sTo, $bDsn = false) + { + if (!$this->bMail) + { + $this->writeLogException( + new Exceptions\RuntimeException('No sender reverse path has been supplied'), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + $sTo = \MailSo\Base\Utils::IdnToAscii( + \MailSo\Base\Utils::Trim($sTo), true); + + $sCmd = 'TO:<'.$sTo.'>'; + + if ($bDsn && $this->IsSupported('DSN')) + { + $sCmd .= ' NOTIFY=SUCCESS,FAILURE'; + } + + $this->sendRequestWithCheck( + 'RCPT', array(250, 251), $sCmd, false, + 'Failed to add recipient "'.$sTo.'"' + ); + + $this->bRcpt = true; + + return $this; + } + + /** + * @param string $sTo + * + * @return \MailSo\Smtp\SmtpClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Smtp\Exceptions\Exception + */ + public function MailTo($sTo) + { + return $this->Rcpt($sTo); + } + + /** + * @param string $sData + * + * @return \MailSo\Smtp\SmtpClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Smtp\Exceptions\Exception + */ + public function Data($sData) + { + if (!\MailSo\Base\Validator::NotEmptyString($sData, true)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + $rDataStream = \MailSo\Base\ResourceRegistry::CreateMemoryResourceFromString($sData); + unset($sData); + $this->DataWithStream($rDataStream); + \MailSo\Base\ResourceRegistry::CloseMemoryResource($rDataStream); + + return $this; + } + + /** + * @param resource $rDataStream + * + * @return \MailSo\Smtp\SmtpClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Smtp\Exceptions\Exception + */ + public function DataWithStream($rDataStream) + { + if (!\is_resource($rDataStream)) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + + if (!$this->bRcpt) + { + $this->writeLogException( + new Exceptions\RuntimeException('No recipient forward path has been supplied'), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + $this->sendRequestWithCheck('DATA', 354); + + $this->writeLog('Message data.', \MailSo\Log\Enumerations\Type::NOTE); + + $this->bRunningCallback = true; + + while (!\feof($rDataStream)) + { + $sBuffer = \fgets($rDataStream); + if (false !== $sBuffer) + { + if (0 === \strpos($sBuffer, '.')) + { + $sBuffer = '.'.$sBuffer; + } + + $this->sendRaw(\rtrim($sBuffer, "\r\n"), false); + + \MailSo\Base\Utils::ResetTimeLimit(); + continue; + } + else if (!\feof($rDataStream)) + { + $this->writeLogException( + new Exceptions\RuntimeException('Cannot read input resource'), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + break; + } + + $this->sendRequestWithCheck('.', 250); + + $this->bRunningCallback = false; + + $this->bData = true; + + return $this; + } + + /** + * @return \MailSo\Smtp\SmtpClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Smtp\Exceptions\Exception + */ + public function Rset() + { + $this->sendRequestWithCheck('RSET', array(250, 220)); + + $this->bMail = false; + $this->bRcpt = false; + $this->bData = false; + + return $this; + } + + /** + * @return \MailSo\Smtp\SmtpClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Smtp\Exceptions\Exception + */ + public function Vrfy($sUser) + { + $sUser = \MailSo\Base\Utils::IdnToAscii( + \MailSo\Base\Utils::Trim($sUser)); + + $this->sendRequestWithCheck('VRFY', array(250, 251, 252), $sUser); + + return $this; + } + + /** + * @return \MailSo\Smtp\SmtpClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Smtp\Exceptions\Exception + */ + public function Noop() + { + $this->sendRequestWithCheck('NOOP', 250); + + return $this; + } + + /** + * @return \MailSo\Smtp\SmtpClient + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Smtp\Exceptions\Exception + */ + public function Logout() + { + if ($this->IsConnected()) + { + $this->sendRequestWithCheck('QUIT', 221); + } + + $this->bHelo = false; + $this->bMail = false; + $this->bRcpt = false; + $this->bData = false; + + return $this; + } + + /** + * @param string $sEhloHost + * + * @return void + */ + private function preLoginStartTLSAndEhloProcess($sEhloHost) + { + if ($this->bHelo) + { + $this->writeLogException( + new Exceptions\RuntimeException('Cannot issue EHLO/HELO to existing session'), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + $this->ehloOrHelo($sEhloHost); + + if (\MailSo\Net\Enumerations\ConnectionSecurityType::UseStartTLS( + $this->IsSupported('STARTTLS'), $this->iSecurityType, $this->HasSupportedAuth())) + { + $this->sendRequestWithCheck('STARTTLS', 220); + $this->EnableCrypto(); + + $this->ehloOrHelo($sEhloHost); + } + else if (\MailSo\Net\Enumerations\ConnectionSecurityType::STARTTLS === $this->iSecurityType) + { + $this->writeLogException( + new \MailSo\Net\Exceptions\SocketUnsuppoterdSecureConnectionException('STARTTLS is not supported'), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + $this->bHelo = true; + } + + /** + * @param string $sCommand + * @param string $sAddToCommand = '' + * @param bool $bSecureLog = false + * + * @return void + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + */ + private function sendRequest($sCommand, $sAddToCommand = '', $bSecureLog = false) + { + if (!\MailSo\Base\Validator::NotEmptyString($sCommand, true)) + { + $this->writeLogException( + new \MailSo\Base\Exceptions\InvalidArgumentException(), + \MailSo\Log\Enumerations\Type::ERROR, true); + } + + $this->IsConnected(true); + + $sCommand = \trim($sCommand); + $sRealCommand = $sCommand.(0 === \strlen($sAddToCommand) ? '' : ' '.$sAddToCommand); + + $sFakeCommand = ($bSecureLog) ? '********' : ''; + + $this->iRequestTime = \microtime(true); + $this->sendRaw($sRealCommand, true, $sFakeCommand); + + return $this; + } + + /** + * @param string $sCommand + * @param int|array $mExpectCode + * @param string $sAddToCommand = '' + * @param bool $bSecureLog = false + * @param string $sErrorPrefix = '' + * + * @return void + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Smtp\Exceptions\Exception + */ + private function sendRequestWithCheck($sCommand, $mExpectCode, $sAddToCommand = '', $bSecureLog = false, $sErrorPrefix = '') + { + $this->sendRequest($sCommand, $sAddToCommand, $bSecureLog); + $this->validateResponse($mExpectCode, $sErrorPrefix); + } + + /** + * @param string $sHost + * + * @return void + */ + private function ehloOrHelo($sHost) + { + try + { + $this->ehlo($sHost); + } + catch (\Exception $oException) + { + try + { + $this->helo($sHost); + } + catch (\Exception $oException) + { + throw $oException; + } + } + + return $this; + } + + /** + * @param string $sHost + * + * @return void + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Smtp\Exceptions\Exception + */ + private function ehlo($sHost) + { + $this->sendRequestWithCheck('EHLO', 250, $sHost); + + foreach ($this->aResults as $sLine) + { + $aMatch = array(); + if (\preg_match('/[\d]+[ \-](.+)$/', $sLine, $aMatch) && isset($aMatch[1]) && 0 < \strlen($aMatch[1])) + { + $sLine = \trim($aMatch[1]); + $aLine = \preg_split('/[ =]/', $sLine, 2); + if (\is_array($aLine) && 0 < \count($aLine) && !empty($aLine[0])) + { + $sCapa = \strtoupper($aLine[0]); + if (('AUTH' === $sCapa || 'SIZE' === $sCapa) && !empty($aLine[1])) + { + $sSubLine = \trim(\strtoupper($aLine[1])); + if (0 < \strlen($sSubLine)) + { + if ('AUTH' === $sCapa) + { + $this->aAuthTypes = \explode(' ', $sSubLine); + } + else if ('SIZE' === $sCapa && \is_numeric($sSubLine)) + { + $this->iSizeCapaValue = (int) $sSubLine; + } + } + } + + $this->aCapa[] = $sCapa; + } + } + } + } + + /** + * @param string $sHost + * + * @return void + * + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Smtp\Exceptions\Exception + */ + private function helo($sHost) + { + $this->sendRequestWithCheck('HELO', 250, $sHost); + $this->aAuthTypes = array(); + $this->iSizeCapaValue = 0; + $this->aCapa = array(); + } + + /** + * @param int|array $mExpectCode + * @param string $sErrorPrefix = '' + * + * @return void + * + * @throws \MailSo\Smtp\Exceptions\ResponseException + */ + private function validateResponse($mExpectCode, $sErrorPrefix = '') + { + if (!\is_array($mExpectCode)) + { + $mExpectCode = array((int) $mExpectCode); + } + else + { + $mExpectCode = \array_map('intval', $mExpectCode); + } + + $aParts = array('', '', ''); + $this->aResults = array(); + do + { + $this->getNextBuffer(); + $aParts = \preg_split('/([\s\-]+)/', $this->sResponseBuffer, 2, PREG_SPLIT_DELIM_CAPTURE); + + if (\is_array($aParts) && 3 === \count($aParts) && \is_numeric($aParts[0])) + { + if ('-' !== \substr($aParts[1], 0, 1) && !\in_array((int) $aParts[0], $mExpectCode)) + { + $this->writeLogException( + new Exceptions\NegativeResponseException($this->aResults, + ('' === $sErrorPrefix ? '' : $sErrorPrefix.': ').\trim( + (0 < \count($this->aResults) ? \implode("\r\n", $this->aResults)."\r\n" : ''). + $this->sResponseBuffer)), \MailSo\Log\Enumerations\Type::ERROR, true); + } + } + else + { + $this->writeLogException( + new Exceptions\ResponseException($this->aResults, + ('' === $sErrorPrefix ? '' : $sErrorPrefix.': ').\trim( + (0 < \count($this->aResults) ? \implode("\r\n", $this->aResults)."\r\n" : ''). + $this->sResponseBuffer)), \MailSo\Log\Enumerations\Type::ERROR, true); + } + + $this->aResults[] = $this->sResponseBuffer; + } + while ('-' === \substr($aParts[1], 0, 1)); + + $this->writeLog((microtime(true) - $this->iRequestTime), + \MailSo\Log\Enumerations\Type::TIME); + } + + /** + * @return string + */ + protected function getLogName() + { + return 'SMTP'; + } + + /** + * @param \MailSo\Log\Logger $oLogger + * + * @return \MailSo\Smtp\SmtpClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public function SetLogger($oLogger) + { + parent::SetLogger($oLogger); + + return $this; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Vendors/Net/IDNA2.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Vendors/Net/IDNA2.php new file mode 100755 index 00000000..82068341 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Vendors/Net/IDNA2.php @@ -0,0 +1,3404 @@ + + * @author Matthias Sommerfeld + * @author Stefan Neufeind + * @version $Id: IDNA2.php 305344 2010-11-14 23:52:42Z neufeind $ + */ +class Net_IDNA2 +{ + // {{{ npdata + /** + * These Unicode codepoints are + * mapped to nothing, See RFC3454 for details + * + * @static + * @var array + * @access private + */ + private static $_np_map_nothing = array( + 0xAD, + 0x34F, + 0x1806, + 0x180B, + 0x180C, + 0x180D, + 0x200B, + 0x200C, + 0x200D, + 0x2060, + 0xFE00, + 0xFE01, + 0xFE02, + 0xFE03, + 0xFE04, + 0xFE05, + 0xFE06, + 0xFE07, + 0xFE08, + 0xFE09, + 0xFE0A, + 0xFE0B, + 0xFE0C, + 0xFE0D, + 0xFE0E, + 0xFE0F, + 0xFEFF + ); + + /** + * Prohibited codepints + * + * @static + * @var array + * @access private + */ + private static $_general_prohibited = array( + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 0xA, + 0xB, + 0xC, + 0xD, + 0xE, + 0xF, + 0x10, + 0x11, + 0x12, + 0x13, + 0x14, + 0x15, + 0x16, + 0x17, + 0x18, + 0x19, + 0x1A, + 0x1B, + 0x1C, + 0x1D, + 0x1E, + 0x1F, + 0x20, + 0x21, + 0x22, + 0x23, + 0x24, + 0x25, + 0x26, + 0x27, + 0x28, + 0x29, + 0x2A, + 0x2B, + 0x2C, + 0x2F, + 0x3B, + 0x3C, + 0x3D, + 0x3E, + 0x3F, + 0x40, + 0x5B, + 0x5C, + 0x5D, + 0x5E, + 0x5F, + 0x60, + 0x7B, + 0x7C, + 0x7D, + 0x7E, + 0x7F, + 0x3002 + ); + + /** + * Codepints prohibited by Nameprep + * @static + * @var array + * @access private + */ + private static $_np_prohibit = array( + 0xA0, + 0x1680, + 0x2000, + 0x2001, + 0x2002, + 0x2003, + 0x2004, + 0x2005, + 0x2006, + 0x2007, + 0x2008, + 0x2009, + 0x200A, + 0x200B, + 0x202F, + 0x205F, + 0x3000, + 0x6DD, + 0x70F, + 0x180E, + 0x200C, + 0x200D, + 0x2028, + 0x2029, + 0xFEFF, + 0xFFF9, + 0xFFFA, + 0xFFFB, + 0xFFFC, + 0xFFFE, + 0xFFFF, + 0x1FFFE, + 0x1FFFF, + 0x2FFFE, + 0x2FFFF, + 0x3FFFE, + 0x3FFFF, + 0x4FFFE, + 0x4FFFF, + 0x5FFFE, + 0x5FFFF, + 0x6FFFE, + 0x6FFFF, + 0x7FFFE, + 0x7FFFF, + 0x8FFFE, + 0x8FFFF, + 0x9FFFE, + 0x9FFFF, + 0xAFFFE, + 0xAFFFF, + 0xBFFFE, + 0xBFFFF, + 0xCFFFE, + 0xCFFFF, + 0xDFFFE, + 0xDFFFF, + 0xEFFFE, + 0xEFFFF, + 0xFFFFE, + 0xFFFFF, + 0x10FFFE, + 0x10FFFF, + 0xFFF9, + 0xFFFA, + 0xFFFB, + 0xFFFC, + 0xFFFD, + 0x340, + 0x341, + 0x200E, + 0x200F, + 0x202A, + 0x202B, + 0x202C, + 0x202D, + 0x202E, + 0x206A, + 0x206B, + 0x206C, + 0x206D, + 0x206E, + 0x206F, + 0xE0001 + ); + + /** + * Codepoint ranges prohibited by nameprep + * + * @static + * @var array + * @access private + */ + private static $_np_prohibit_ranges = array( + array(0x80, 0x9F ), + array(0x2060, 0x206F ), + array(0x1D173, 0x1D17A ), + array(0xE000, 0xF8FF ), + array(0xF0000, 0xFFFFD ), + array(0x100000, 0x10FFFD), + array(0xFDD0, 0xFDEF ), + array(0xD800, 0xDFFF ), + array(0x2FF0, 0x2FFB ), + array(0xE0020, 0xE007F ) + ); + + /** + * Replacement mappings (casemapping, replacement sequences, ...) + * + * @static + * @var array + * @access private + */ + private static $_np_replacemaps = array( + 0x41 => array(0x61), + 0x42 => array(0x62), + 0x43 => array(0x63), + 0x44 => array(0x64), + 0x45 => array(0x65), + 0x46 => array(0x66), + 0x47 => array(0x67), + 0x48 => array(0x68), + 0x49 => array(0x69), + 0x4A => array(0x6A), + 0x4B => array(0x6B), + 0x4C => array(0x6C), + 0x4D => array(0x6D), + 0x4E => array(0x6E), + 0x4F => array(0x6F), + 0x50 => array(0x70), + 0x51 => array(0x71), + 0x52 => array(0x72), + 0x53 => array(0x73), + 0x54 => array(0x74), + 0x55 => array(0x75), + 0x56 => array(0x76), + 0x57 => array(0x77), + 0x58 => array(0x78), + 0x59 => array(0x79), + 0x5A => array(0x7A), + 0xB5 => array(0x3BC), + 0xC0 => array(0xE0), + 0xC1 => array(0xE1), + 0xC2 => array(0xE2), + 0xC3 => array(0xE3), + 0xC4 => array(0xE4), + 0xC5 => array(0xE5), + 0xC6 => array(0xE6), + 0xC7 => array(0xE7), + 0xC8 => array(0xE8), + 0xC9 => array(0xE9), + 0xCA => array(0xEA), + 0xCB => array(0xEB), + 0xCC => array(0xEC), + 0xCD => array(0xED), + 0xCE => array(0xEE), + 0xCF => array(0xEF), + 0xD0 => array(0xF0), + 0xD1 => array(0xF1), + 0xD2 => array(0xF2), + 0xD3 => array(0xF3), + 0xD4 => array(0xF4), + 0xD5 => array(0xF5), + 0xD6 => array(0xF6), + 0xD8 => array(0xF8), + 0xD9 => array(0xF9), + 0xDA => array(0xFA), + 0xDB => array(0xFB), + 0xDC => array(0xFC), + 0xDD => array(0xFD), + 0xDE => array(0xFE), + 0xDF => array(0x73, 0x73), + 0x100 => array(0x101), + 0x102 => array(0x103), + 0x104 => array(0x105), + 0x106 => array(0x107), + 0x108 => array(0x109), + 0x10A => array(0x10B), + 0x10C => array(0x10D), + 0x10E => array(0x10F), + 0x110 => array(0x111), + 0x112 => array(0x113), + 0x114 => array(0x115), + 0x116 => array(0x117), + 0x118 => array(0x119), + 0x11A => array(0x11B), + 0x11C => array(0x11D), + 0x11E => array(0x11F), + 0x120 => array(0x121), + 0x122 => array(0x123), + 0x124 => array(0x125), + 0x126 => array(0x127), + 0x128 => array(0x129), + 0x12A => array(0x12B), + 0x12C => array(0x12D), + 0x12E => array(0x12F), + 0x130 => array(0x69, 0x307), + 0x132 => array(0x133), + 0x134 => array(0x135), + 0x136 => array(0x137), + 0x139 => array(0x13A), + 0x13B => array(0x13C), + 0x13D => array(0x13E), + 0x13F => array(0x140), + 0x141 => array(0x142), + 0x143 => array(0x144), + 0x145 => array(0x146), + 0x147 => array(0x148), + 0x149 => array(0x2BC, 0x6E), + 0x14A => array(0x14B), + 0x14C => array(0x14D), + 0x14E => array(0x14F), + 0x150 => array(0x151), + 0x152 => array(0x153), + 0x154 => array(0x155), + 0x156 => array(0x157), + 0x158 => array(0x159), + 0x15A => array(0x15B), + 0x15C => array(0x15D), + 0x15E => array(0x15F), + 0x160 => array(0x161), + 0x162 => array(0x163), + 0x164 => array(0x165), + 0x166 => array(0x167), + 0x168 => array(0x169), + 0x16A => array(0x16B), + 0x16C => array(0x16D), + 0x16E => array(0x16F), + 0x170 => array(0x171), + 0x172 => array(0x173), + 0x174 => array(0x175), + 0x176 => array(0x177), + 0x178 => array(0xFF), + 0x179 => array(0x17A), + 0x17B => array(0x17C), + 0x17D => array(0x17E), + 0x17F => array(0x73), + 0x181 => array(0x253), + 0x182 => array(0x183), + 0x184 => array(0x185), + 0x186 => array(0x254), + 0x187 => array(0x188), + 0x189 => array(0x256), + 0x18A => array(0x257), + 0x18B => array(0x18C), + 0x18E => array(0x1DD), + 0x18F => array(0x259), + 0x190 => array(0x25B), + 0x191 => array(0x192), + 0x193 => array(0x260), + 0x194 => array(0x263), + 0x196 => array(0x269), + 0x197 => array(0x268), + 0x198 => array(0x199), + 0x19C => array(0x26F), + 0x19D => array(0x272), + 0x19F => array(0x275), + 0x1A0 => array(0x1A1), + 0x1A2 => array(0x1A3), + 0x1A4 => array(0x1A5), + 0x1A6 => array(0x280), + 0x1A7 => array(0x1A8), + 0x1A9 => array(0x283), + 0x1AC => array(0x1AD), + 0x1AE => array(0x288), + 0x1AF => array(0x1B0), + 0x1B1 => array(0x28A), + 0x1B2 => array(0x28B), + 0x1B3 => array(0x1B4), + 0x1B5 => array(0x1B6), + 0x1B7 => array(0x292), + 0x1B8 => array(0x1B9), + 0x1BC => array(0x1BD), + 0x1C4 => array(0x1C6), + 0x1C5 => array(0x1C6), + 0x1C7 => array(0x1C9), + 0x1C8 => array(0x1C9), + 0x1CA => array(0x1CC), + 0x1CB => array(0x1CC), + 0x1CD => array(0x1CE), + 0x1CF => array(0x1D0), + 0x1D1 => array(0x1D2), + 0x1D3 => array(0x1D4), + 0x1D5 => array(0x1D6), + 0x1D7 => array(0x1D8), + 0x1D9 => array(0x1DA), + 0x1DB => array(0x1DC), + 0x1DE => array(0x1DF), + 0x1E0 => array(0x1E1), + 0x1E2 => array(0x1E3), + 0x1E4 => array(0x1E5), + 0x1E6 => array(0x1E7), + 0x1E8 => array(0x1E9), + 0x1EA => array(0x1EB), + 0x1EC => array(0x1ED), + 0x1EE => array(0x1EF), + 0x1F0 => array(0x6A, 0x30C), + 0x1F1 => array(0x1F3), + 0x1F2 => array(0x1F3), + 0x1F4 => array(0x1F5), + 0x1F6 => array(0x195), + 0x1F7 => array(0x1BF), + 0x1F8 => array(0x1F9), + 0x1FA => array(0x1FB), + 0x1FC => array(0x1FD), + 0x1FE => array(0x1FF), + 0x200 => array(0x201), + 0x202 => array(0x203), + 0x204 => array(0x205), + 0x206 => array(0x207), + 0x208 => array(0x209), + 0x20A => array(0x20B), + 0x20C => array(0x20D), + 0x20E => array(0x20F), + 0x210 => array(0x211), + 0x212 => array(0x213), + 0x214 => array(0x215), + 0x216 => array(0x217), + 0x218 => array(0x219), + 0x21A => array(0x21B), + 0x21C => array(0x21D), + 0x21E => array(0x21F), + 0x220 => array(0x19E), + 0x222 => array(0x223), + 0x224 => array(0x225), + 0x226 => array(0x227), + 0x228 => array(0x229), + 0x22A => array(0x22B), + 0x22C => array(0x22D), + 0x22E => array(0x22F), + 0x230 => array(0x231), + 0x232 => array(0x233), + 0x345 => array(0x3B9), + 0x37A => array(0x20, 0x3B9), + 0x386 => array(0x3AC), + 0x388 => array(0x3AD), + 0x389 => array(0x3AE), + 0x38A => array(0x3AF), + 0x38C => array(0x3CC), + 0x38E => array(0x3CD), + 0x38F => array(0x3CE), + 0x390 => array(0x3B9, 0x308, 0x301), + 0x391 => array(0x3B1), + 0x392 => array(0x3B2), + 0x393 => array(0x3B3), + 0x394 => array(0x3B4), + 0x395 => array(0x3B5), + 0x396 => array(0x3B6), + 0x397 => array(0x3B7), + 0x398 => array(0x3B8), + 0x399 => array(0x3B9), + 0x39A => array(0x3BA), + 0x39B => array(0x3BB), + 0x39C => array(0x3BC), + 0x39D => array(0x3BD), + 0x39E => array(0x3BE), + 0x39F => array(0x3BF), + 0x3A0 => array(0x3C0), + 0x3A1 => array(0x3C1), + 0x3A3 => array(0x3C3), + 0x3A4 => array(0x3C4), + 0x3A5 => array(0x3C5), + 0x3A6 => array(0x3C6), + 0x3A7 => array(0x3C7), + 0x3A8 => array(0x3C8), + 0x3A9 => array(0x3C9), + 0x3AA => array(0x3CA), + 0x3AB => array(0x3CB), + 0x3B0 => array(0x3C5, 0x308, 0x301), + 0x3C2 => array(0x3C3), + 0x3D0 => array(0x3B2), + 0x3D1 => array(0x3B8), + 0x3D2 => array(0x3C5), + 0x3D3 => array(0x3CD), + 0x3D4 => array(0x3CB), + 0x3D5 => array(0x3C6), + 0x3D6 => array(0x3C0), + 0x3D8 => array(0x3D9), + 0x3DA => array(0x3DB), + 0x3DC => array(0x3DD), + 0x3DE => array(0x3DF), + 0x3E0 => array(0x3E1), + 0x3E2 => array(0x3E3), + 0x3E4 => array(0x3E5), + 0x3E6 => array(0x3E7), + 0x3E8 => array(0x3E9), + 0x3EA => array(0x3EB), + 0x3EC => array(0x3ED), + 0x3EE => array(0x3EF), + 0x3F0 => array(0x3BA), + 0x3F1 => array(0x3C1), + 0x3F2 => array(0x3C3), + 0x3F4 => array(0x3B8), + 0x3F5 => array(0x3B5), + 0x400 => array(0x450), + 0x401 => array(0x451), + 0x402 => array(0x452), + 0x403 => array(0x453), + 0x404 => array(0x454), + 0x405 => array(0x455), + 0x406 => array(0x456), + 0x407 => array(0x457), + 0x408 => array(0x458), + 0x409 => array(0x459), + 0x40A => array(0x45A), + 0x40B => array(0x45B), + 0x40C => array(0x45C), + 0x40D => array(0x45D), + 0x40E => array(0x45E), + 0x40F => array(0x45F), + 0x410 => array(0x430), + 0x411 => array(0x431), + 0x412 => array(0x432), + 0x413 => array(0x433), + 0x414 => array(0x434), + 0x415 => array(0x435), + 0x416 => array(0x436), + 0x417 => array(0x437), + 0x418 => array(0x438), + 0x419 => array(0x439), + 0x41A => array(0x43A), + 0x41B => array(0x43B), + 0x41C => array(0x43C), + 0x41D => array(0x43D), + 0x41E => array(0x43E), + 0x41F => array(0x43F), + 0x420 => array(0x440), + 0x421 => array(0x441), + 0x422 => array(0x442), + 0x423 => array(0x443), + 0x424 => array(0x444), + 0x425 => array(0x445), + 0x426 => array(0x446), + 0x427 => array(0x447), + 0x428 => array(0x448), + 0x429 => array(0x449), + 0x42A => array(0x44A), + 0x42B => array(0x44B), + 0x42C => array(0x44C), + 0x42D => array(0x44D), + 0x42E => array(0x44E), + 0x42F => array(0x44F), + 0x460 => array(0x461), + 0x462 => array(0x463), + 0x464 => array(0x465), + 0x466 => array(0x467), + 0x468 => array(0x469), + 0x46A => array(0x46B), + 0x46C => array(0x46D), + 0x46E => array(0x46F), + 0x470 => array(0x471), + 0x472 => array(0x473), + 0x474 => array(0x475), + 0x476 => array(0x477), + 0x478 => array(0x479), + 0x47A => array(0x47B), + 0x47C => array(0x47D), + 0x47E => array(0x47F), + 0x480 => array(0x481), + 0x48A => array(0x48B), + 0x48C => array(0x48D), + 0x48E => array(0x48F), + 0x490 => array(0x491), + 0x492 => array(0x493), + 0x494 => array(0x495), + 0x496 => array(0x497), + 0x498 => array(0x499), + 0x49A => array(0x49B), + 0x49C => array(0x49D), + 0x49E => array(0x49F), + 0x4A0 => array(0x4A1), + 0x4A2 => array(0x4A3), + 0x4A4 => array(0x4A5), + 0x4A6 => array(0x4A7), + 0x4A8 => array(0x4A9), + 0x4AA => array(0x4AB), + 0x4AC => array(0x4AD), + 0x4AE => array(0x4AF), + 0x4B0 => array(0x4B1), + 0x4B2 => array(0x4B3), + 0x4B4 => array(0x4B5), + 0x4B6 => array(0x4B7), + 0x4B8 => array(0x4B9), + 0x4BA => array(0x4BB), + 0x4BC => array(0x4BD), + 0x4BE => array(0x4BF), + 0x4C1 => array(0x4C2), + 0x4C3 => array(0x4C4), + 0x4C5 => array(0x4C6), + 0x4C7 => array(0x4C8), + 0x4C9 => array(0x4CA), + 0x4CB => array(0x4CC), + 0x4CD => array(0x4CE), + 0x4D0 => array(0x4D1), + 0x4D2 => array(0x4D3), + 0x4D4 => array(0x4D5), + 0x4D6 => array(0x4D7), + 0x4D8 => array(0x4D9), + 0x4DA => array(0x4DB), + 0x4DC => array(0x4DD), + 0x4DE => array(0x4DF), + 0x4E0 => array(0x4E1), + 0x4E2 => array(0x4E3), + 0x4E4 => array(0x4E5), + 0x4E6 => array(0x4E7), + 0x4E8 => array(0x4E9), + 0x4EA => array(0x4EB), + 0x4EC => array(0x4ED), + 0x4EE => array(0x4EF), + 0x4F0 => array(0x4F1), + 0x4F2 => array(0x4F3), + 0x4F4 => array(0x4F5), + 0x4F8 => array(0x4F9), + 0x500 => array(0x501), + 0x502 => array(0x503), + 0x504 => array(0x505), + 0x506 => array(0x507), + 0x508 => array(0x509), + 0x50A => array(0x50B), + 0x50C => array(0x50D), + 0x50E => array(0x50F), + 0x531 => array(0x561), + 0x532 => array(0x562), + 0x533 => array(0x563), + 0x534 => array(0x564), + 0x535 => array(0x565), + 0x536 => array(0x566), + 0x537 => array(0x567), + 0x538 => array(0x568), + 0x539 => array(0x569), + 0x53A => array(0x56A), + 0x53B => array(0x56B), + 0x53C => array(0x56C), + 0x53D => array(0x56D), + 0x53E => array(0x56E), + 0x53F => array(0x56F), + 0x540 => array(0x570), + 0x541 => array(0x571), + 0x542 => array(0x572), + 0x543 => array(0x573), + 0x544 => array(0x574), + 0x545 => array(0x575), + 0x546 => array(0x576), + 0x547 => array(0x577), + 0x548 => array(0x578), + 0x549 => array(0x579), + 0x54A => array(0x57A), + 0x54B => array(0x57B), + 0x54C => array(0x57C), + 0x54D => array(0x57D), + 0x54E => array(0x57E), + 0x54F => array(0x57F), + 0x550 => array(0x580), + 0x551 => array(0x581), + 0x552 => array(0x582), + 0x553 => array(0x583), + 0x554 => array(0x584), + 0x555 => array(0x585), + 0x556 => array(0x586), + 0x587 => array(0x565, 0x582), + 0x1E00 => array(0x1E01), + 0x1E02 => array(0x1E03), + 0x1E04 => array(0x1E05), + 0x1E06 => array(0x1E07), + 0x1E08 => array(0x1E09), + 0x1E0A => array(0x1E0B), + 0x1E0C => array(0x1E0D), + 0x1E0E => array(0x1E0F), + 0x1E10 => array(0x1E11), + 0x1E12 => array(0x1E13), + 0x1E14 => array(0x1E15), + 0x1E16 => array(0x1E17), + 0x1E18 => array(0x1E19), + 0x1E1A => array(0x1E1B), + 0x1E1C => array(0x1E1D), + 0x1E1E => array(0x1E1F), + 0x1E20 => array(0x1E21), + 0x1E22 => array(0x1E23), + 0x1E24 => array(0x1E25), + 0x1E26 => array(0x1E27), + 0x1E28 => array(0x1E29), + 0x1E2A => array(0x1E2B), + 0x1E2C => array(0x1E2D), + 0x1E2E => array(0x1E2F), + 0x1E30 => array(0x1E31), + 0x1E32 => array(0x1E33), + 0x1E34 => array(0x1E35), + 0x1E36 => array(0x1E37), + 0x1E38 => array(0x1E39), + 0x1E3A => array(0x1E3B), + 0x1E3C => array(0x1E3D), + 0x1E3E => array(0x1E3F), + 0x1E40 => array(0x1E41), + 0x1E42 => array(0x1E43), + 0x1E44 => array(0x1E45), + 0x1E46 => array(0x1E47), + 0x1E48 => array(0x1E49), + 0x1E4A => array(0x1E4B), + 0x1E4C => array(0x1E4D), + 0x1E4E => array(0x1E4F), + 0x1E50 => array(0x1E51), + 0x1E52 => array(0x1E53), + 0x1E54 => array(0x1E55), + 0x1E56 => array(0x1E57), + 0x1E58 => array(0x1E59), + 0x1E5A => array(0x1E5B), + 0x1E5C => array(0x1E5D), + 0x1E5E => array(0x1E5F), + 0x1E60 => array(0x1E61), + 0x1E62 => array(0x1E63), + 0x1E64 => array(0x1E65), + 0x1E66 => array(0x1E67), + 0x1E68 => array(0x1E69), + 0x1E6A => array(0x1E6B), + 0x1E6C => array(0x1E6D), + 0x1E6E => array(0x1E6F), + 0x1E70 => array(0x1E71), + 0x1E72 => array(0x1E73), + 0x1E74 => array(0x1E75), + 0x1E76 => array(0x1E77), + 0x1E78 => array(0x1E79), + 0x1E7A => array(0x1E7B), + 0x1E7C => array(0x1E7D), + 0x1E7E => array(0x1E7F), + 0x1E80 => array(0x1E81), + 0x1E82 => array(0x1E83), + 0x1E84 => array(0x1E85), + 0x1E86 => array(0x1E87), + 0x1E88 => array(0x1E89), + 0x1E8A => array(0x1E8B), + 0x1E8C => array(0x1E8D), + 0x1E8E => array(0x1E8F), + 0x1E90 => array(0x1E91), + 0x1E92 => array(0x1E93), + 0x1E94 => array(0x1E95), + 0x1E96 => array(0x68, 0x331), + 0x1E97 => array(0x74, 0x308), + 0x1E98 => array(0x77, 0x30A), + 0x1E99 => array(0x79, 0x30A), + 0x1E9A => array(0x61, 0x2BE), + 0x1E9B => array(0x1E61), + 0x1EA0 => array(0x1EA1), + 0x1EA2 => array(0x1EA3), + 0x1EA4 => array(0x1EA5), + 0x1EA6 => array(0x1EA7), + 0x1EA8 => array(0x1EA9), + 0x1EAA => array(0x1EAB), + 0x1EAC => array(0x1EAD), + 0x1EAE => array(0x1EAF), + 0x1EB0 => array(0x1EB1), + 0x1EB2 => array(0x1EB3), + 0x1EB4 => array(0x1EB5), + 0x1EB6 => array(0x1EB7), + 0x1EB8 => array(0x1EB9), + 0x1EBA => array(0x1EBB), + 0x1EBC => array(0x1EBD), + 0x1EBE => array(0x1EBF), + 0x1EC0 => array(0x1EC1), + 0x1EC2 => array(0x1EC3), + 0x1EC4 => array(0x1EC5), + 0x1EC6 => array(0x1EC7), + 0x1EC8 => array(0x1EC9), + 0x1ECA => array(0x1ECB), + 0x1ECC => array(0x1ECD), + 0x1ECE => array(0x1ECF), + 0x1ED0 => array(0x1ED1), + 0x1ED2 => array(0x1ED3), + 0x1ED4 => array(0x1ED5), + 0x1ED6 => array(0x1ED7), + 0x1ED8 => array(0x1ED9), + 0x1EDA => array(0x1EDB), + 0x1EDC => array(0x1EDD), + 0x1EDE => array(0x1EDF), + 0x1EE0 => array(0x1EE1), + 0x1EE2 => array(0x1EE3), + 0x1EE4 => array(0x1EE5), + 0x1EE6 => array(0x1EE7), + 0x1EE8 => array(0x1EE9), + 0x1EEA => array(0x1EEB), + 0x1EEC => array(0x1EED), + 0x1EEE => array(0x1EEF), + 0x1EF0 => array(0x1EF1), + 0x1EF2 => array(0x1EF3), + 0x1EF4 => array(0x1EF5), + 0x1EF6 => array(0x1EF7), + 0x1EF8 => array(0x1EF9), + 0x1F08 => array(0x1F00), + 0x1F09 => array(0x1F01), + 0x1F0A => array(0x1F02), + 0x1F0B => array(0x1F03), + 0x1F0C => array(0x1F04), + 0x1F0D => array(0x1F05), + 0x1F0E => array(0x1F06), + 0x1F0F => array(0x1F07), + 0x1F18 => array(0x1F10), + 0x1F19 => array(0x1F11), + 0x1F1A => array(0x1F12), + 0x1F1B => array(0x1F13), + 0x1F1C => array(0x1F14), + 0x1F1D => array(0x1F15), + 0x1F28 => array(0x1F20), + 0x1F29 => array(0x1F21), + 0x1F2A => array(0x1F22), + 0x1F2B => array(0x1F23), + 0x1F2C => array(0x1F24), + 0x1F2D => array(0x1F25), + 0x1F2E => array(0x1F26), + 0x1F2F => array(0x1F27), + 0x1F38 => array(0x1F30), + 0x1F39 => array(0x1F31), + 0x1F3A => array(0x1F32), + 0x1F3B => array(0x1F33), + 0x1F3C => array(0x1F34), + 0x1F3D => array(0x1F35), + 0x1F3E => array(0x1F36), + 0x1F3F => array(0x1F37), + 0x1F48 => array(0x1F40), + 0x1F49 => array(0x1F41), + 0x1F4A => array(0x1F42), + 0x1F4B => array(0x1F43), + 0x1F4C => array(0x1F44), + 0x1F4D => array(0x1F45), + 0x1F50 => array(0x3C5, 0x313), + 0x1F52 => array(0x3C5, 0x313, 0x300), + 0x1F54 => array(0x3C5, 0x313, 0x301), + 0x1F56 => array(0x3C5, 0x313, 0x342), + 0x1F59 => array(0x1F51), + 0x1F5B => array(0x1F53), + 0x1F5D => array(0x1F55), + 0x1F5F => array(0x1F57), + 0x1F68 => array(0x1F60), + 0x1F69 => array(0x1F61), + 0x1F6A => array(0x1F62), + 0x1F6B => array(0x1F63), + 0x1F6C => array(0x1F64), + 0x1F6D => array(0x1F65), + 0x1F6E => array(0x1F66), + 0x1F6F => array(0x1F67), + 0x1F80 => array(0x1F00, 0x3B9), + 0x1F81 => array(0x1F01, 0x3B9), + 0x1F82 => array(0x1F02, 0x3B9), + 0x1F83 => array(0x1F03, 0x3B9), + 0x1F84 => array(0x1F04, 0x3B9), + 0x1F85 => array(0x1F05, 0x3B9), + 0x1F86 => array(0x1F06, 0x3B9), + 0x1F87 => array(0x1F07, 0x3B9), + 0x1F88 => array(0x1F00, 0x3B9), + 0x1F89 => array(0x1F01, 0x3B9), + 0x1F8A => array(0x1F02, 0x3B9), + 0x1F8B => array(0x1F03, 0x3B9), + 0x1F8C => array(0x1F04, 0x3B9), + 0x1F8D => array(0x1F05, 0x3B9), + 0x1F8E => array(0x1F06, 0x3B9), + 0x1F8F => array(0x1F07, 0x3B9), + 0x1F90 => array(0x1F20, 0x3B9), + 0x1F91 => array(0x1F21, 0x3B9), + 0x1F92 => array(0x1F22, 0x3B9), + 0x1F93 => array(0x1F23, 0x3B9), + 0x1F94 => array(0x1F24, 0x3B9), + 0x1F95 => array(0x1F25, 0x3B9), + 0x1F96 => array(0x1F26, 0x3B9), + 0x1F97 => array(0x1F27, 0x3B9), + 0x1F98 => array(0x1F20, 0x3B9), + 0x1F99 => array(0x1F21, 0x3B9), + 0x1F9A => array(0x1F22, 0x3B9), + 0x1F9B => array(0x1F23, 0x3B9), + 0x1F9C => array(0x1F24, 0x3B9), + 0x1F9D => array(0x1F25, 0x3B9), + 0x1F9E => array(0x1F26, 0x3B9), + 0x1F9F => array(0x1F27, 0x3B9), + 0x1FA0 => array(0x1F60, 0x3B9), + 0x1FA1 => array(0x1F61, 0x3B9), + 0x1FA2 => array(0x1F62, 0x3B9), + 0x1FA3 => array(0x1F63, 0x3B9), + 0x1FA4 => array(0x1F64, 0x3B9), + 0x1FA5 => array(0x1F65, 0x3B9), + 0x1FA6 => array(0x1F66, 0x3B9), + 0x1FA7 => array(0x1F67, 0x3B9), + 0x1FA8 => array(0x1F60, 0x3B9), + 0x1FA9 => array(0x1F61, 0x3B9), + 0x1FAA => array(0x1F62, 0x3B9), + 0x1FAB => array(0x1F63, 0x3B9), + 0x1FAC => array(0x1F64, 0x3B9), + 0x1FAD => array(0x1F65, 0x3B9), + 0x1FAE => array(0x1F66, 0x3B9), + 0x1FAF => array(0x1F67, 0x3B9), + 0x1FB2 => array(0x1F70, 0x3B9), + 0x1FB3 => array(0x3B1, 0x3B9), + 0x1FB4 => array(0x3AC, 0x3B9), + 0x1FB6 => array(0x3B1, 0x342), + 0x1FB7 => array(0x3B1, 0x342, 0x3B9), + 0x1FB8 => array(0x1FB0), + 0x1FB9 => array(0x1FB1), + 0x1FBA => array(0x1F70), + 0x1FBB => array(0x1F71), + 0x1FBC => array(0x3B1, 0x3B9), + 0x1FBE => array(0x3B9), + 0x1FC2 => array(0x1F74, 0x3B9), + 0x1FC3 => array(0x3B7, 0x3B9), + 0x1FC4 => array(0x3AE, 0x3B9), + 0x1FC6 => array(0x3B7, 0x342), + 0x1FC7 => array(0x3B7, 0x342, 0x3B9), + 0x1FC8 => array(0x1F72), + 0x1FC9 => array(0x1F73), + 0x1FCA => array(0x1F74), + 0x1FCB => array(0x1F75), + 0x1FCC => array(0x3B7, 0x3B9), + 0x1FD2 => array(0x3B9, 0x308, 0x300), + 0x1FD3 => array(0x3B9, 0x308, 0x301), + 0x1FD6 => array(0x3B9, 0x342), + 0x1FD7 => array(0x3B9, 0x308, 0x342), + 0x1FD8 => array(0x1FD0), + 0x1FD9 => array(0x1FD1), + 0x1FDA => array(0x1F76), + 0x1FDB => array(0x1F77), + 0x1FE2 => array(0x3C5, 0x308, 0x300), + 0x1FE3 => array(0x3C5, 0x308, 0x301), + 0x1FE4 => array(0x3C1, 0x313), + 0x1FE6 => array(0x3C5, 0x342), + 0x1FE7 => array(0x3C5, 0x308, 0x342), + 0x1FE8 => array(0x1FE0), + 0x1FE9 => array(0x1FE1), + 0x1FEA => array(0x1F7A), + 0x1FEB => array(0x1F7B), + 0x1FEC => array(0x1FE5), + 0x1FF2 => array(0x1F7C, 0x3B9), + 0x1FF3 => array(0x3C9, 0x3B9), + 0x1FF4 => array(0x3CE, 0x3B9), + 0x1FF6 => array(0x3C9, 0x342), + 0x1FF7 => array(0x3C9, 0x342, 0x3B9), + 0x1FF8 => array(0x1F78), + 0x1FF9 => array(0x1F79), + 0x1FFA => array(0x1F7C), + 0x1FFB => array(0x1F7D), + 0x1FFC => array(0x3C9, 0x3B9), + 0x20A8 => array(0x72, 0x73), + 0x2102 => array(0x63), + 0x2103 => array(0xB0, 0x63), + 0x2107 => array(0x25B), + 0x2109 => array(0xB0, 0x66), + 0x210B => array(0x68), + 0x210C => array(0x68), + 0x210D => array(0x68), + 0x2110 => array(0x69), + 0x2111 => array(0x69), + 0x2112 => array(0x6C), + 0x2115 => array(0x6E), + 0x2116 => array(0x6E, 0x6F), + 0x2119 => array(0x70), + 0x211A => array(0x71), + 0x211B => array(0x72), + 0x211C => array(0x72), + 0x211D => array(0x72), + 0x2120 => array(0x73, 0x6D), + 0x2121 => array(0x74, 0x65, 0x6C), + 0x2122 => array(0x74, 0x6D), + 0x2124 => array(0x7A), + 0x2126 => array(0x3C9), + 0x2128 => array(0x7A), + 0x212A => array(0x6B), + 0x212B => array(0xE5), + 0x212C => array(0x62), + 0x212D => array(0x63), + 0x2130 => array(0x65), + 0x2131 => array(0x66), + 0x2133 => array(0x6D), + 0x213E => array(0x3B3), + 0x213F => array(0x3C0), + 0x2145 => array(0x64), + 0x2160 => array(0x2170), + 0x2161 => array(0x2171), + 0x2162 => array(0x2172), + 0x2163 => array(0x2173), + 0x2164 => array(0x2174), + 0x2165 => array(0x2175), + 0x2166 => array(0x2176), + 0x2167 => array(0x2177), + 0x2168 => array(0x2178), + 0x2169 => array(0x2179), + 0x216A => array(0x217A), + 0x216B => array(0x217B), + 0x216C => array(0x217C), + 0x216D => array(0x217D), + 0x216E => array(0x217E), + 0x216F => array(0x217F), + 0x24B6 => array(0x24D0), + 0x24B7 => array(0x24D1), + 0x24B8 => array(0x24D2), + 0x24B9 => array(0x24D3), + 0x24BA => array(0x24D4), + 0x24BB => array(0x24D5), + 0x24BC => array(0x24D6), + 0x24BD => array(0x24D7), + 0x24BE => array(0x24D8), + 0x24BF => array(0x24D9), + 0x24C0 => array(0x24DA), + 0x24C1 => array(0x24DB), + 0x24C2 => array(0x24DC), + 0x24C3 => array(0x24DD), + 0x24C4 => array(0x24DE), + 0x24C5 => array(0x24DF), + 0x24C6 => array(0x24E0), + 0x24C7 => array(0x24E1), + 0x24C8 => array(0x24E2), + 0x24C9 => array(0x24E3), + 0x24CA => array(0x24E4), + 0x24CB => array(0x24E5), + 0x24CC => array(0x24E6), + 0x24CD => array(0x24E7), + 0x24CE => array(0x24E8), + 0x24CF => array(0x24E9), + 0x3371 => array(0x68, 0x70, 0x61), + 0x3373 => array(0x61, 0x75), + 0x3375 => array(0x6F, 0x76), + 0x3380 => array(0x70, 0x61), + 0x3381 => array(0x6E, 0x61), + 0x3382 => array(0x3BC, 0x61), + 0x3383 => array(0x6D, 0x61), + 0x3384 => array(0x6B, 0x61), + 0x3385 => array(0x6B, 0x62), + 0x3386 => array(0x6D, 0x62), + 0x3387 => array(0x67, 0x62), + 0x338A => array(0x70, 0x66), + 0x338B => array(0x6E, 0x66), + 0x338C => array(0x3BC, 0x66), + 0x3390 => array(0x68, 0x7A), + 0x3391 => array(0x6B, 0x68, 0x7A), + 0x3392 => array(0x6D, 0x68, 0x7A), + 0x3393 => array(0x67, 0x68, 0x7A), + 0x3394 => array(0x74, 0x68, 0x7A), + 0x33A9 => array(0x70, 0x61), + 0x33AA => array(0x6B, 0x70, 0x61), + 0x33AB => array(0x6D, 0x70, 0x61), + 0x33AC => array(0x67, 0x70, 0x61), + 0x33B4 => array(0x70, 0x76), + 0x33B5 => array(0x6E, 0x76), + 0x33B6 => array(0x3BC, 0x76), + 0x33B7 => array(0x6D, 0x76), + 0x33B8 => array(0x6B, 0x76), + 0x33B9 => array(0x6D, 0x76), + 0x33BA => array(0x70, 0x77), + 0x33BB => array(0x6E, 0x77), + 0x33BC => array(0x3BC, 0x77), + 0x33BD => array(0x6D, 0x77), + 0x33BE => array(0x6B, 0x77), + 0x33BF => array(0x6D, 0x77), + 0x33C0 => array(0x6B, 0x3C9), + 0x33C1 => array(0x6D, 0x3C9), + /* 0x33C2 => array(0x61, 0x2E, 0x6D, 0x2E), */ + 0x33C3 => array(0x62, 0x71), + 0x33C6 => array(0x63, 0x2215, 0x6B, 0x67), + 0x33C7 => array(0x63, 0x6F, 0x2E), + 0x33C8 => array(0x64, 0x62), + 0x33C9 => array(0x67, 0x79), + 0x33CB => array(0x68, 0x70), + 0x33CD => array(0x6B, 0x6B), + 0x33CE => array(0x6B, 0x6D), + 0x33D7 => array(0x70, 0x68), + 0x33D9 => array(0x70, 0x70, 0x6D), + 0x33DA => array(0x70, 0x72), + 0x33DC => array(0x73, 0x76), + 0x33DD => array(0x77, 0x62), + 0xFB00 => array(0x66, 0x66), + 0xFB01 => array(0x66, 0x69), + 0xFB02 => array(0x66, 0x6C), + 0xFB03 => array(0x66, 0x66, 0x69), + 0xFB04 => array(0x66, 0x66, 0x6C), + 0xFB05 => array(0x73, 0x74), + 0xFB06 => array(0x73, 0x74), + 0xFB13 => array(0x574, 0x576), + 0xFB14 => array(0x574, 0x565), + 0xFB15 => array(0x574, 0x56B), + 0xFB16 => array(0x57E, 0x576), + 0xFB17 => array(0x574, 0x56D), + 0xFF21 => array(0xFF41), + 0xFF22 => array(0xFF42), + 0xFF23 => array(0xFF43), + 0xFF24 => array(0xFF44), + 0xFF25 => array(0xFF45), + 0xFF26 => array(0xFF46), + 0xFF27 => array(0xFF47), + 0xFF28 => array(0xFF48), + 0xFF29 => array(0xFF49), + 0xFF2A => array(0xFF4A), + 0xFF2B => array(0xFF4B), + 0xFF2C => array(0xFF4C), + 0xFF2D => array(0xFF4D), + 0xFF2E => array(0xFF4E), + 0xFF2F => array(0xFF4F), + 0xFF30 => array(0xFF50), + 0xFF31 => array(0xFF51), + 0xFF32 => array(0xFF52), + 0xFF33 => array(0xFF53), + 0xFF34 => array(0xFF54), + 0xFF35 => array(0xFF55), + 0xFF36 => array(0xFF56), + 0xFF37 => array(0xFF57), + 0xFF38 => array(0xFF58), + 0xFF39 => array(0xFF59), + 0xFF3A => array(0xFF5A), + 0x10400 => array(0x10428), + 0x10401 => array(0x10429), + 0x10402 => array(0x1042A), + 0x10403 => array(0x1042B), + 0x10404 => array(0x1042C), + 0x10405 => array(0x1042D), + 0x10406 => array(0x1042E), + 0x10407 => array(0x1042F), + 0x10408 => array(0x10430), + 0x10409 => array(0x10431), + 0x1040A => array(0x10432), + 0x1040B => array(0x10433), + 0x1040C => array(0x10434), + 0x1040D => array(0x10435), + 0x1040E => array(0x10436), + 0x1040F => array(0x10437), + 0x10410 => array(0x10438), + 0x10411 => array(0x10439), + 0x10412 => array(0x1043A), + 0x10413 => array(0x1043B), + 0x10414 => array(0x1043C), + 0x10415 => array(0x1043D), + 0x10416 => array(0x1043E), + 0x10417 => array(0x1043F), + 0x10418 => array(0x10440), + 0x10419 => array(0x10441), + 0x1041A => array(0x10442), + 0x1041B => array(0x10443), + 0x1041C => array(0x10444), + 0x1041D => array(0x10445), + 0x1041E => array(0x10446), + 0x1041F => array(0x10447), + 0x10420 => array(0x10448), + 0x10421 => array(0x10449), + 0x10422 => array(0x1044A), + 0x10423 => array(0x1044B), + 0x10424 => array(0x1044C), + 0x10425 => array(0x1044D), + 0x1D400 => array(0x61), + 0x1D401 => array(0x62), + 0x1D402 => array(0x63), + 0x1D403 => array(0x64), + 0x1D404 => array(0x65), + 0x1D405 => array(0x66), + 0x1D406 => array(0x67), + 0x1D407 => array(0x68), + 0x1D408 => array(0x69), + 0x1D409 => array(0x6A), + 0x1D40A => array(0x6B), + 0x1D40B => array(0x6C), + 0x1D40C => array(0x6D), + 0x1D40D => array(0x6E), + 0x1D40E => array(0x6F), + 0x1D40F => array(0x70), + 0x1D410 => array(0x71), + 0x1D411 => array(0x72), + 0x1D412 => array(0x73), + 0x1D413 => array(0x74), + 0x1D414 => array(0x75), + 0x1D415 => array(0x76), + 0x1D416 => array(0x77), + 0x1D417 => array(0x78), + 0x1D418 => array(0x79), + 0x1D419 => array(0x7A), + 0x1D434 => array(0x61), + 0x1D435 => array(0x62), + 0x1D436 => array(0x63), + 0x1D437 => array(0x64), + 0x1D438 => array(0x65), + 0x1D439 => array(0x66), + 0x1D43A => array(0x67), + 0x1D43B => array(0x68), + 0x1D43C => array(0x69), + 0x1D43D => array(0x6A), + 0x1D43E => array(0x6B), + 0x1D43F => array(0x6C), + 0x1D440 => array(0x6D), + 0x1D441 => array(0x6E), + 0x1D442 => array(0x6F), + 0x1D443 => array(0x70), + 0x1D444 => array(0x71), + 0x1D445 => array(0x72), + 0x1D446 => array(0x73), + 0x1D447 => array(0x74), + 0x1D448 => array(0x75), + 0x1D449 => array(0x76), + 0x1D44A => array(0x77), + 0x1D44B => array(0x78), + 0x1D44C => array(0x79), + 0x1D44D => array(0x7A), + 0x1D468 => array(0x61), + 0x1D469 => array(0x62), + 0x1D46A => array(0x63), + 0x1D46B => array(0x64), + 0x1D46C => array(0x65), + 0x1D46D => array(0x66), + 0x1D46E => array(0x67), + 0x1D46F => array(0x68), + 0x1D470 => array(0x69), + 0x1D471 => array(0x6A), + 0x1D472 => array(0x6B), + 0x1D473 => array(0x6C), + 0x1D474 => array(0x6D), + 0x1D475 => array(0x6E), + 0x1D476 => array(0x6F), + 0x1D477 => array(0x70), + 0x1D478 => array(0x71), + 0x1D479 => array(0x72), + 0x1D47A => array(0x73), + 0x1D47B => array(0x74), + 0x1D47C => array(0x75), + 0x1D47D => array(0x76), + 0x1D47E => array(0x77), + 0x1D47F => array(0x78), + 0x1D480 => array(0x79), + 0x1D481 => array(0x7A), + 0x1D49C => array(0x61), + 0x1D49E => array(0x63), + 0x1D49F => array(0x64), + 0x1D4A2 => array(0x67), + 0x1D4A5 => array(0x6A), + 0x1D4A6 => array(0x6B), + 0x1D4A9 => array(0x6E), + 0x1D4AA => array(0x6F), + 0x1D4AB => array(0x70), + 0x1D4AC => array(0x71), + 0x1D4AE => array(0x73), + 0x1D4AF => array(0x74), + 0x1D4B0 => array(0x75), + 0x1D4B1 => array(0x76), + 0x1D4B2 => array(0x77), + 0x1D4B3 => array(0x78), + 0x1D4B4 => array(0x79), + 0x1D4B5 => array(0x7A), + 0x1D4D0 => array(0x61), + 0x1D4D1 => array(0x62), + 0x1D4D2 => array(0x63), + 0x1D4D3 => array(0x64), + 0x1D4D4 => array(0x65), + 0x1D4D5 => array(0x66), + 0x1D4D6 => array(0x67), + 0x1D4D7 => array(0x68), + 0x1D4D8 => array(0x69), + 0x1D4D9 => array(0x6A), + 0x1D4DA => array(0x6B), + 0x1D4DB => array(0x6C), + 0x1D4DC => array(0x6D), + 0x1D4DD => array(0x6E), + 0x1D4DE => array(0x6F), + 0x1D4DF => array(0x70), + 0x1D4E0 => array(0x71), + 0x1D4E1 => array(0x72), + 0x1D4E2 => array(0x73), + 0x1D4E3 => array(0x74), + 0x1D4E4 => array(0x75), + 0x1D4E5 => array(0x76), + 0x1D4E6 => array(0x77), + 0x1D4E7 => array(0x78), + 0x1D4E8 => array(0x79), + 0x1D4E9 => array(0x7A), + 0x1D504 => array(0x61), + 0x1D505 => array(0x62), + 0x1D507 => array(0x64), + 0x1D508 => array(0x65), + 0x1D509 => array(0x66), + 0x1D50A => array(0x67), + 0x1D50D => array(0x6A), + 0x1D50E => array(0x6B), + 0x1D50F => array(0x6C), + 0x1D510 => array(0x6D), + 0x1D511 => array(0x6E), + 0x1D512 => array(0x6F), + 0x1D513 => array(0x70), + 0x1D514 => array(0x71), + 0x1D516 => array(0x73), + 0x1D517 => array(0x74), + 0x1D518 => array(0x75), + 0x1D519 => array(0x76), + 0x1D51A => array(0x77), + 0x1D51B => array(0x78), + 0x1D51C => array(0x79), + 0x1D538 => array(0x61), + 0x1D539 => array(0x62), + 0x1D53B => array(0x64), + 0x1D53C => array(0x65), + 0x1D53D => array(0x66), + 0x1D53E => array(0x67), + 0x1D540 => array(0x69), + 0x1D541 => array(0x6A), + 0x1D542 => array(0x6B), + 0x1D543 => array(0x6C), + 0x1D544 => array(0x6D), + 0x1D546 => array(0x6F), + 0x1D54A => array(0x73), + 0x1D54B => array(0x74), + 0x1D54C => array(0x75), + 0x1D54D => array(0x76), + 0x1D54E => array(0x77), + 0x1D54F => array(0x78), + 0x1D550 => array(0x79), + 0x1D56C => array(0x61), + 0x1D56D => array(0x62), + 0x1D56E => array(0x63), + 0x1D56F => array(0x64), + 0x1D570 => array(0x65), + 0x1D571 => array(0x66), + 0x1D572 => array(0x67), + 0x1D573 => array(0x68), + 0x1D574 => array(0x69), + 0x1D575 => array(0x6A), + 0x1D576 => array(0x6B), + 0x1D577 => array(0x6C), + 0x1D578 => array(0x6D), + 0x1D579 => array(0x6E), + 0x1D57A => array(0x6F), + 0x1D57B => array(0x70), + 0x1D57C => array(0x71), + 0x1D57D => array(0x72), + 0x1D57E => array(0x73), + 0x1D57F => array(0x74), + 0x1D580 => array(0x75), + 0x1D581 => array(0x76), + 0x1D582 => array(0x77), + 0x1D583 => array(0x78), + 0x1D584 => array(0x79), + 0x1D585 => array(0x7A), + 0x1D5A0 => array(0x61), + 0x1D5A1 => array(0x62), + 0x1D5A2 => array(0x63), + 0x1D5A3 => array(0x64), + 0x1D5A4 => array(0x65), + 0x1D5A5 => array(0x66), + 0x1D5A6 => array(0x67), + 0x1D5A7 => array(0x68), + 0x1D5A8 => array(0x69), + 0x1D5A9 => array(0x6A), + 0x1D5AA => array(0x6B), + 0x1D5AB => array(0x6C), + 0x1D5AC => array(0x6D), + 0x1D5AD => array(0x6E), + 0x1D5AE => array(0x6F), + 0x1D5AF => array(0x70), + 0x1D5B0 => array(0x71), + 0x1D5B1 => array(0x72), + 0x1D5B2 => array(0x73), + 0x1D5B3 => array(0x74), + 0x1D5B4 => array(0x75), + 0x1D5B5 => array(0x76), + 0x1D5B6 => array(0x77), + 0x1D5B7 => array(0x78), + 0x1D5B8 => array(0x79), + 0x1D5B9 => array(0x7A), + 0x1D5D4 => array(0x61), + 0x1D5D5 => array(0x62), + 0x1D5D6 => array(0x63), + 0x1D5D7 => array(0x64), + 0x1D5D8 => array(0x65), + 0x1D5D9 => array(0x66), + 0x1D5DA => array(0x67), + 0x1D5DB => array(0x68), + 0x1D5DC => array(0x69), + 0x1D5DD => array(0x6A), + 0x1D5DE => array(0x6B), + 0x1D5DF => array(0x6C), + 0x1D5E0 => array(0x6D), + 0x1D5E1 => array(0x6E), + 0x1D5E2 => array(0x6F), + 0x1D5E3 => array(0x70), + 0x1D5E4 => array(0x71), + 0x1D5E5 => array(0x72), + 0x1D5E6 => array(0x73), + 0x1D5E7 => array(0x74), + 0x1D5E8 => array(0x75), + 0x1D5E9 => array(0x76), + 0x1D5EA => array(0x77), + 0x1D5EB => array(0x78), + 0x1D5EC => array(0x79), + 0x1D5ED => array(0x7A), + 0x1D608 => array(0x61), + 0x1D609 => array(0x62), + 0x1D60A => array(0x63), + 0x1D60B => array(0x64), + 0x1D60C => array(0x65), + 0x1D60D => array(0x66), + 0x1D60E => array(0x67), + 0x1D60F => array(0x68), + 0x1D610 => array(0x69), + 0x1D611 => array(0x6A), + 0x1D612 => array(0x6B), + 0x1D613 => array(0x6C), + 0x1D614 => array(0x6D), + 0x1D615 => array(0x6E), + 0x1D616 => array(0x6F), + 0x1D617 => array(0x70), + 0x1D618 => array(0x71), + 0x1D619 => array(0x72), + 0x1D61A => array(0x73), + 0x1D61B => array(0x74), + 0x1D61C => array(0x75), + 0x1D61D => array(0x76), + 0x1D61E => array(0x77), + 0x1D61F => array(0x78), + 0x1D620 => array(0x79), + 0x1D621 => array(0x7A), + 0x1D63C => array(0x61), + 0x1D63D => array(0x62), + 0x1D63E => array(0x63), + 0x1D63F => array(0x64), + 0x1D640 => array(0x65), + 0x1D641 => array(0x66), + 0x1D642 => array(0x67), + 0x1D643 => array(0x68), + 0x1D644 => array(0x69), + 0x1D645 => array(0x6A), + 0x1D646 => array(0x6B), + 0x1D647 => array(0x6C), + 0x1D648 => array(0x6D), + 0x1D649 => array(0x6E), + 0x1D64A => array(0x6F), + 0x1D64B => array(0x70), + 0x1D64C => array(0x71), + 0x1D64D => array(0x72), + 0x1D64E => array(0x73), + 0x1D64F => array(0x74), + 0x1D650 => array(0x75), + 0x1D651 => array(0x76), + 0x1D652 => array(0x77), + 0x1D653 => array(0x78), + 0x1D654 => array(0x79), + 0x1D655 => array(0x7A), + 0x1D670 => array(0x61), + 0x1D671 => array(0x62), + 0x1D672 => array(0x63), + 0x1D673 => array(0x64), + 0x1D674 => array(0x65), + 0x1D675 => array(0x66), + 0x1D676 => array(0x67), + 0x1D677 => array(0x68), + 0x1D678 => array(0x69), + 0x1D679 => array(0x6A), + 0x1D67A => array(0x6B), + 0x1D67B => array(0x6C), + 0x1D67C => array(0x6D), + 0x1D67D => array(0x6E), + 0x1D67E => array(0x6F), + 0x1D67F => array(0x70), + 0x1D680 => array(0x71), + 0x1D681 => array(0x72), + 0x1D682 => array(0x73), + 0x1D683 => array(0x74), + 0x1D684 => array(0x75), + 0x1D685 => array(0x76), + 0x1D686 => array(0x77), + 0x1D687 => array(0x78), + 0x1D688 => array(0x79), + 0x1D689 => array(0x7A), + 0x1D6A8 => array(0x3B1), + 0x1D6A9 => array(0x3B2), + 0x1D6AA => array(0x3B3), + 0x1D6AB => array(0x3B4), + 0x1D6AC => array(0x3B5), + 0x1D6AD => array(0x3B6), + 0x1D6AE => array(0x3B7), + 0x1D6AF => array(0x3B8), + 0x1D6B0 => array(0x3B9), + 0x1D6B1 => array(0x3BA), + 0x1D6B2 => array(0x3BB), + 0x1D6B3 => array(0x3BC), + 0x1D6B4 => array(0x3BD), + 0x1D6B5 => array(0x3BE), + 0x1D6B6 => array(0x3BF), + 0x1D6B7 => array(0x3C0), + 0x1D6B8 => array(0x3C1), + 0x1D6B9 => array(0x3B8), + 0x1D6BA => array(0x3C3), + 0x1D6BB => array(0x3C4), + 0x1D6BC => array(0x3C5), + 0x1D6BD => array(0x3C6), + 0x1D6BE => array(0x3C7), + 0x1D6BF => array(0x3C8), + 0x1D6C0 => array(0x3C9), + 0x1D6D3 => array(0x3C3), + 0x1D6E2 => array(0x3B1), + 0x1D6E3 => array(0x3B2), + 0x1D6E4 => array(0x3B3), + 0x1D6E5 => array(0x3B4), + 0x1D6E6 => array(0x3B5), + 0x1D6E7 => array(0x3B6), + 0x1D6E8 => array(0x3B7), + 0x1D6E9 => array(0x3B8), + 0x1D6EA => array(0x3B9), + 0x1D6EB => array(0x3BA), + 0x1D6EC => array(0x3BB), + 0x1D6ED => array(0x3BC), + 0x1D6EE => array(0x3BD), + 0x1D6EF => array(0x3BE), + 0x1D6F0 => array(0x3BF), + 0x1D6F1 => array(0x3C0), + 0x1D6F2 => array(0x3C1), + 0x1D6F3 => array(0x3B8), + 0x1D6F4 => array(0x3C3), + 0x1D6F5 => array(0x3C4), + 0x1D6F6 => array(0x3C5), + 0x1D6F7 => array(0x3C6), + 0x1D6F8 => array(0x3C7), + 0x1D6F9 => array(0x3C8), + 0x1D6FA => array(0x3C9), + 0x1D70D => array(0x3C3), + 0x1D71C => array(0x3B1), + 0x1D71D => array(0x3B2), + 0x1D71E => array(0x3B3), + 0x1D71F => array(0x3B4), + 0x1D720 => array(0x3B5), + 0x1D721 => array(0x3B6), + 0x1D722 => array(0x3B7), + 0x1D723 => array(0x3B8), + 0x1D724 => array(0x3B9), + 0x1D725 => array(0x3BA), + 0x1D726 => array(0x3BB), + 0x1D727 => array(0x3BC), + 0x1D728 => array(0x3BD), + 0x1D729 => array(0x3BE), + 0x1D72A => array(0x3BF), + 0x1D72B => array(0x3C0), + 0x1D72C => array(0x3C1), + 0x1D72D => array(0x3B8), + 0x1D72E => array(0x3C3), + 0x1D72F => array(0x3C4), + 0x1D730 => array(0x3C5), + 0x1D731 => array(0x3C6), + 0x1D732 => array(0x3C7), + 0x1D733 => array(0x3C8), + 0x1D734 => array(0x3C9), + 0x1D747 => array(0x3C3), + 0x1D756 => array(0x3B1), + 0x1D757 => array(0x3B2), + 0x1D758 => array(0x3B3), + 0x1D759 => array(0x3B4), + 0x1D75A => array(0x3B5), + 0x1D75B => array(0x3B6), + 0x1D75C => array(0x3B7), + 0x1D75D => array(0x3B8), + 0x1D75E => array(0x3B9), + 0x1D75F => array(0x3BA), + 0x1D760 => array(0x3BB), + 0x1D761 => array(0x3BC), + 0x1D762 => array(0x3BD), + 0x1D763 => array(0x3BE), + 0x1D764 => array(0x3BF), + 0x1D765 => array(0x3C0), + 0x1D766 => array(0x3C1), + 0x1D767 => array(0x3B8), + 0x1D768 => array(0x3C3), + 0x1D769 => array(0x3C4), + 0x1D76A => array(0x3C5), + 0x1D76B => array(0x3C6), + 0x1D76C => array(0x3C7), + 0x1D76D => array(0x3C8), + 0x1D76E => array(0x3C9), + 0x1D781 => array(0x3C3), + 0x1D790 => array(0x3B1), + 0x1D791 => array(0x3B2), + 0x1D792 => array(0x3B3), + 0x1D793 => array(0x3B4), + 0x1D794 => array(0x3B5), + 0x1D795 => array(0x3B6), + 0x1D796 => array(0x3B7), + 0x1D797 => array(0x3B8), + 0x1D798 => array(0x3B9), + 0x1D799 => array(0x3BA), + 0x1D79A => array(0x3BB), + 0x1D79B => array(0x3BC), + 0x1D79C => array(0x3BD), + 0x1D79D => array(0x3BE), + 0x1D79E => array(0x3BF), + 0x1D79F => array(0x3C0), + 0x1D7A0 => array(0x3C1), + 0x1D7A1 => array(0x3B8), + 0x1D7A2 => array(0x3C3), + 0x1D7A3 => array(0x3C4), + 0x1D7A4 => array(0x3C5), + 0x1D7A5 => array(0x3C6), + 0x1D7A6 => array(0x3C7), + 0x1D7A7 => array(0x3C8), + 0x1D7A8 => array(0x3C9), + 0x1D7BB => array(0x3C3), + 0x3F9 => array(0x3C3), + 0x1D2C => array(0x61), + 0x1D2D => array(0xE6), + 0x1D2E => array(0x62), + 0x1D30 => array(0x64), + 0x1D31 => array(0x65), + 0x1D32 => array(0x1DD), + 0x1D33 => array(0x67), + 0x1D34 => array(0x68), + 0x1D35 => array(0x69), + 0x1D36 => array(0x6A), + 0x1D37 => array(0x6B), + 0x1D38 => array(0x6C), + 0x1D39 => array(0x6D), + 0x1D3A => array(0x6E), + 0x1D3C => array(0x6F), + 0x1D3D => array(0x223), + 0x1D3E => array(0x70), + 0x1D3F => array(0x72), + 0x1D40 => array(0x74), + 0x1D41 => array(0x75), + 0x1D42 => array(0x77), + 0x213B => array(0x66, 0x61, 0x78), + 0x3250 => array(0x70, 0x74, 0x65), + 0x32CC => array(0x68, 0x67), + 0x32CE => array(0x65, 0x76), + 0x32CF => array(0x6C, 0x74, 0x64), + 0x337A => array(0x69, 0x75), + 0x33DE => array(0x76, 0x2215, 0x6D), + 0x33DF => array(0x61, 0x2215, 0x6D) + ); + + /** + * Normalization Combining Classes; Code Points not listed + * got Combining Class 0. + * + * @static + * @var array + * @access private + */ + private static $_np_norm_combcls = array( + 0x334 => 1, + 0x335 => 1, + 0x336 => 1, + 0x337 => 1, + 0x338 => 1, + 0x93C => 7, + 0x9BC => 7, + 0xA3C => 7, + 0xABC => 7, + 0xB3C => 7, + 0xCBC => 7, + 0x1037 => 7, + 0x3099 => 8, + 0x309A => 8, + 0x94D => 9, + 0x9CD => 9, + 0xA4D => 9, + 0xACD => 9, + 0xB4D => 9, + 0xBCD => 9, + 0xC4D => 9, + 0xCCD => 9, + 0xD4D => 9, + 0xDCA => 9, + 0xE3A => 9, + 0xF84 => 9, + 0x1039 => 9, + 0x1714 => 9, + 0x1734 => 9, + 0x17D2 => 9, + 0x5B0 => 10, + 0x5B1 => 11, + 0x5B2 => 12, + 0x5B3 => 13, + 0x5B4 => 14, + 0x5B5 => 15, + 0x5B6 => 16, + 0x5B7 => 17, + 0x5B8 => 18, + 0x5B9 => 19, + 0x5BB => 20, + 0x5Bc => 21, + 0x5BD => 22, + 0x5BF => 23, + 0x5C1 => 24, + 0x5C2 => 25, + 0xFB1E => 26, + 0x64B => 27, + 0x64C => 28, + 0x64D => 29, + 0x64E => 30, + 0x64F => 31, + 0x650 => 32, + 0x651 => 33, + 0x652 => 34, + 0x670 => 35, + 0x711 => 36, + 0xC55 => 84, + 0xC56 => 91, + 0xE38 => 103, + 0xE39 => 103, + 0xE48 => 107, + 0xE49 => 107, + 0xE4A => 107, + 0xE4B => 107, + 0xEB8 => 118, + 0xEB9 => 118, + 0xEC8 => 122, + 0xEC9 => 122, + 0xECA => 122, + 0xECB => 122, + 0xF71 => 129, + 0xF72 => 130, + 0xF7A => 130, + 0xF7B => 130, + 0xF7C => 130, + 0xF7D => 130, + 0xF80 => 130, + 0xF74 => 132, + 0x321 => 202, + 0x322 => 202, + 0x327 => 202, + 0x328 => 202, + 0x31B => 216, + 0xF39 => 216, + 0x1D165 => 216, + 0x1D166 => 216, + 0x1D16E => 216, + 0x1D16F => 216, + 0x1D170 => 216, + 0x1D171 => 216, + 0x1D172 => 216, + 0x302A => 218, + 0x316 => 220, + 0x317 => 220, + 0x318 => 220, + 0x319 => 220, + 0x31C => 220, + 0x31D => 220, + 0x31E => 220, + 0x31F => 220, + 0x320 => 220, + 0x323 => 220, + 0x324 => 220, + 0x325 => 220, + 0x326 => 220, + 0x329 => 220, + 0x32A => 220, + 0x32B => 220, + 0x32C => 220, + 0x32D => 220, + 0x32E => 220, + 0x32F => 220, + 0x330 => 220, + 0x331 => 220, + 0x332 => 220, + 0x333 => 220, + 0x339 => 220, + 0x33A => 220, + 0x33B => 220, + 0x33C => 220, + 0x347 => 220, + 0x348 => 220, + 0x349 => 220, + 0x34D => 220, + 0x34E => 220, + 0x353 => 220, + 0x354 => 220, + 0x355 => 220, + 0x356 => 220, + 0x591 => 220, + 0x596 => 220, + 0x59B => 220, + 0x5A3 => 220, + 0x5A4 => 220, + 0x5A5 => 220, + 0x5A6 => 220, + 0x5A7 => 220, + 0x5AA => 220, + 0x655 => 220, + 0x656 => 220, + 0x6E3 => 220, + 0x6EA => 220, + 0x6ED => 220, + 0x731 => 220, + 0x734 => 220, + 0x737 => 220, + 0x738 => 220, + 0x739 => 220, + 0x73B => 220, + 0x73C => 220, + 0x73E => 220, + 0x742 => 220, + 0x744 => 220, + 0x746 => 220, + 0x748 => 220, + 0x952 => 220, + 0xF18 => 220, + 0xF19 => 220, + 0xF35 => 220, + 0xF37 => 220, + 0xFC6 => 220, + 0x193B => 220, + 0x20E8 => 220, + 0x1D17B => 220, + 0x1D17C => 220, + 0x1D17D => 220, + 0x1D17E => 220, + 0x1D17F => 220, + 0x1D180 => 220, + 0x1D181 => 220, + 0x1D182 => 220, + 0x1D18A => 220, + 0x1D18B => 220, + 0x59A => 222, + 0x5AD => 222, + 0x1929 => 222, + 0x302D => 222, + 0x302E => 224, + 0x302F => 224, + 0x1D16D => 226, + 0x5AE => 228, + 0x18A9 => 228, + 0x302B => 228, + 0x300 => 230, + 0x301 => 230, + 0x302 => 230, + 0x303 => 230, + 0x304 => 230, + 0x305 => 230, + 0x306 => 230, + 0x307 => 230, + 0x308 => 230, + 0x309 => 230, + 0x30A => 230, + 0x30B => 230, + 0x30C => 230, + 0x30D => 230, + 0x30E => 230, + 0x30F => 230, + 0x310 => 230, + 0x311 => 230, + 0x312 => 230, + 0x313 => 230, + 0x314 => 230, + 0x33D => 230, + 0x33E => 230, + 0x33F => 230, + 0x340 => 230, + 0x341 => 230, + 0x342 => 230, + 0x343 => 230, + 0x344 => 230, + 0x346 => 230, + 0x34A => 230, + 0x34B => 230, + 0x34C => 230, + 0x350 => 230, + 0x351 => 230, + 0x352 => 230, + 0x357 => 230, + 0x363 => 230, + 0x364 => 230, + 0x365 => 230, + 0x366 => 230, + 0x367 => 230, + 0x368 => 230, + 0x369 => 230, + 0x36A => 230, + 0x36B => 230, + 0x36C => 230, + 0x36D => 230, + 0x36E => 230, + 0x36F => 230, + 0x483 => 230, + 0x484 => 230, + 0x485 => 230, + 0x486 => 230, + 0x592 => 230, + 0x593 => 230, + 0x594 => 230, + 0x595 => 230, + 0x597 => 230, + 0x598 => 230, + 0x599 => 230, + 0x59C => 230, + 0x59D => 230, + 0x59E => 230, + 0x59F => 230, + 0x5A0 => 230, + 0x5A1 => 230, + 0x5A8 => 230, + 0x5A9 => 230, + 0x5AB => 230, + 0x5AC => 230, + 0x5AF => 230, + 0x5C4 => 230, + 0x610 => 230, + 0x611 => 230, + 0x612 => 230, + 0x613 => 230, + 0x614 => 230, + 0x615 => 230, + 0x653 => 230, + 0x654 => 230, + 0x657 => 230, + 0x658 => 230, + 0x6D6 => 230, + 0x6D7 => 230, + 0x6D8 => 230, + 0x6D9 => 230, + 0x6DA => 230, + 0x6DB => 230, + 0x6DC => 230, + 0x6DF => 230, + 0x6E0 => 230, + 0x6E1 => 230, + 0x6E2 => 230, + 0x6E4 => 230, + 0x6E7 => 230, + 0x6E8 => 230, + 0x6EB => 230, + 0x6EC => 230, + 0x730 => 230, + 0x732 => 230, + 0x733 => 230, + 0x735 => 230, + 0x736 => 230, + 0x73A => 230, + 0x73D => 230, + 0x73F => 230, + 0x740 => 230, + 0x741 => 230, + 0x743 => 230, + 0x745 => 230, + 0x747 => 230, + 0x749 => 230, + 0x74A => 230, + 0x951 => 230, + 0x953 => 230, + 0x954 => 230, + 0xF82 => 230, + 0xF83 => 230, + 0xF86 => 230, + 0xF87 => 230, + 0x170D => 230, + 0x193A => 230, + 0x20D0 => 230, + 0x20D1 => 230, + 0x20D4 => 230, + 0x20D5 => 230, + 0x20D6 => 230, + 0x20D7 => 230, + 0x20DB => 230, + 0x20DC => 230, + 0x20E1 => 230, + 0x20E7 => 230, + 0x20E9 => 230, + 0xFE20 => 230, + 0xFE21 => 230, + 0xFE22 => 230, + 0xFE23 => 230, + 0x1D185 => 230, + 0x1D186 => 230, + 0x1D187 => 230, + 0x1D189 => 230, + 0x1D188 => 230, + 0x1D1AA => 230, + 0x1D1AB => 230, + 0x1D1AC => 230, + 0x1D1AD => 230, + 0x315 => 232, + 0x31A => 232, + 0x302C => 232, + 0x35F => 233, + 0x362 => 233, + 0x35D => 234, + 0x35E => 234, + 0x360 => 234, + 0x361 => 234, + 0x345 => 240 + ); + // }}} + + // {{{ properties + /** + * @var string + * @access private + */ + private $_punycode_prefix = 'xn--'; + + /** + * @access private + */ + private $_invalid_ucs = 0x80000000; + + /** + * @access private + */ + private $_max_ucs = 0x10FFFF; + + /** + * @var int + * @access private + */ + private $_base = 36; + + /** + * @var int + * @access private + */ + private $_tmin = 1; + + /** + * @var int + * @access private + */ + private $_tmax = 26; + + /** + * @var int + * @access private + */ + private $_skew = 38; + + /** + * @var int + * @access private + */ + private $_damp = 700; + + /** + * @var int + * @access private + */ + private $_initial_bias = 72; + + /** + * @var int + * @access private + */ + private $_initial_n = 0x80; + + /** + * @var int + * @access private + */ + private $_slast; + + /** + * @access private + */ + private $_sbase = 0xAC00; + + /** + * @access private + */ + private $_lbase = 0x1100; + + /** + * @access private + */ + private $_vbase = 0x1161; + + /** + * @access private + */ + private $_tbase = 0x11a7; + + /** + * @var int + * @access private + */ + private $_lcount = 19; + + /** + * @var int + * @access private + */ + private $_vcount = 21; + + /** + * @var int + * @access private + */ + private $_tcount = 28; + + /** + * vcount * tcount + * + * @var int + * @access private + */ + private $_ncount = 588; + + /** + * lcount * tcount * vcount + * + * @var int + * @access private + */ + private $_scount = 11172; + + /** + * Default encoding for encode()'s input and decode()'s output is UTF-8; + * Other possible encodings are ucs4_string and ucs4_array + * See {@link setParams()} for how to select these + * + * @var bool + * @access private + */ + private $_api_encoding = 'utf8'; + + /** + * Overlong UTF-8 encodings are forbidden + * + * @var bool + * @access private + */ + private $_allow_overlong = false; + + /** + * Behave strict or not + * + * @var bool + * @access private + */ + private $_strict_mode = false; + + /** + * IDNA-version to use + * + * Values are "2003" and "2008". + * Defaults to "2003", since that was the original version and for + * compatibility with previous versions of this library. + * If you need to encode "new" characters like the German "Eszett", + * please switch to 2008 first before encoding. + * + * @var bool + * @access private + */ + private $_version = '2003'; + + /** + * Cached value indicating whether or not mbstring function overloading is + * on for strlen + * + * This is cached for optimal performance. + * + * @var boolean + * @see Net_IDNA2::_byteLength() + */ + private static $_mb_string_overload = null; + // }}} + + + // {{{ constructor + /** + * Constructor + * + * @param array $options Options to initialise the object with + * + * @access public + * @see setParams() + */ + public function __construct($options = null) + { + $this->_slast = $this->_sbase + $this->_lcount * $this->_vcount * $this->_tcount; + + if (is_array($options)) { + $this->setParams($options); + } + + // populate mbstring overloading cache if not set + if (self::$_mb_string_overload === null) { + self::$_mb_string_overload = (extension_loaded('mbstring') + && (ini_get('mbstring.func_overload') & 0x02) === 0x02); + } + } + // }}} + + + /** + * Sets a new option value. Available options and values: + * + * [utf8 - Use either UTF-8 or ISO-8859-1 as input (true for UTF-8, false + * otherwise); The output is always UTF-8] + * [overlong - Unicode does not allow unnecessarily long encodings of chars, + * to allow this, set this parameter to true, else to false; + * default is false.] + * [strict - true: strict mode, good for registration purposes - Causes errors + * on failures; false: loose mode, ideal for "wildlife" applications + * by silently ignoring errors and returning the original input instead] + * + * @param mixed $option Parameter to set (string: single parameter; array of Parameter => Value pairs) + * @param string $value Value to use (if parameter 1 is a string) + * + * @return boolean true on success, false otherwise + * @access public + */ + public function setParams($option, $value = false) + { + if (!is_array($option)) { + $option = array($option => $value); + } + + foreach ($option as $k => $v) { + switch ($k) { + case 'encoding': + switch ($v) { + case 'utf8': + case 'ucs4_string': + case 'ucs4_array': + $this->_api_encoding = $v; + break; + + default: + throw new InvalidArgumentException('Set Parameter: Unknown parameter '.$v.' for option '.$k); + } + + break; + + case 'overlong': + $this->_allow_overlong = ($v) ? true : false; + break; + + case 'strict': + $this->_strict_mode = ($v) ? true : false; + break; + + case 'version': + if (in_array($v, array('2003', '2008'))) { + $this->_version = $v; + } else { + throw new InvalidArgumentException('Set Parameter: Invalid parameter '.$v.' for option '.$k); + } + break; + + default: + return false; + } + } + + return true; + } + + /** + * Encode a given UTF-8 domain name. + * + * @param string $decoded Domain name (UTF-8 or UCS-4) + * @param string $one_time_encoding Desired input encoding, see {@link set_parameter} + * If not given will use default-encoding + * + * @return string Encoded Domain name (ACE string) + * @return mixed processed string + * @throws Exception + * @access public + */ + public function encode($decoded, $one_time_encoding = false) + { + // Forcing conversion of input to UCS4 array + // If one time encoding is given, use this, else the objects property + switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) { + case 'utf8': + $decoded = $this->_utf8_to_ucs4($decoded); + break; + case 'ucs4_string': + $decoded = $this->_ucs4_string_to_ucs4($decoded); + case 'ucs4_array': // No break; before this line. Catch case, but do nothing + break; + default: + throw new InvalidArgumentException('Unsupported input format'); + } + + // No input, no output, what else did you expect? + if (empty($decoded)) return ''; + + // Anchors for iteration + $last_begin = 0; + // Output string + $output = ''; + + foreach ($decoded as $k => $v) { + // Make sure to use just the plain dot + switch($v) { + case 0x3002: + case 0xFF0E: + case 0xFF61: + $decoded[$k] = 0x2E; + // It's right, no break here + // The codepoints above have to be converted to dots anyway + + // Stumbling across an anchoring character + case 0x2E: + case 0x2F: + case 0x3A: + case 0x3F: + case 0x40: + // Neither email addresses nor URLs allowed in strict mode + if ($this->_strict_mode) { + throw new InvalidArgumentException('Neither email addresses nor URLs are allowed in strict mode.'); + } + // Skip first char + if ($k) { + $encoded = ''; + $encoded = $this->_encode(array_slice($decoded, $last_begin, (($k)-$last_begin))); + if ($encoded) { + $output .= $encoded; + } else { + $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($k)-$last_begin))); + } + $output .= chr($decoded[$k]); + } + $last_begin = $k + 1; + } + } + // Catch the rest of the string + if ($last_begin) { + $inp_len = sizeof($decoded); + $encoded = ''; + $encoded = $this->_encode(array_slice($decoded, $last_begin, (($inp_len)-$last_begin))); + if ($encoded) { + $output .= $encoded; + } else { + $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($inp_len)-$last_begin))); + } + return $output; + } + + if ($output = $this->_encode($decoded)) { + return $output; + } + + return $this->_ucs4_to_utf8($decoded); + } + + /** + * Decode a given ACE domain name. + * + * @param string $input Domain name (ACE string) + * @param string $one_time_encoding Desired output encoding, see {@link set_parameter} + * + * @return string Decoded Domain name (UTF-8 or UCS-4) + * @throws Exception + * @access public + */ + public function decode($input, $one_time_encoding = false) + { + // Optionally set + if ($one_time_encoding) { + switch ($one_time_encoding) { + case 'utf8': + case 'ucs4_string': + case 'ucs4_array': + break; + default: + throw new InvalidArgumentException('Unknown encoding '.$one_time_encoding); + } + } + // Make sure to drop any newline characters around + $input = trim($input); + + // Negotiate input and try to determine, wether it is a plain string, + // an email address or something like a complete URL + if (strpos($input, '@')) { // Maybe it is an email address + // No no in strict mode + if ($this->_strict_mode) { + throw new InvalidArgumentException('Only simple domain name parts can be handled in strict mode'); + } + list($email_pref, $input) = explode('@', $input, 2); + $arr = explode('.', $input); + foreach ($arr as $k => $v) { + $conv = $this->_decode($v); + if ($conv) $arr[$k] = $conv; + } + $return = $email_pref . '@' . join('.', $arr); + } elseif (preg_match('![:\./]!', $input)) { // Or a complete domain name (with or without paths / parameters) + // No no in strict mode + if ($this->_strict_mode) { + throw new InvalidArgumentException('Only simple domain name parts can be handled in strict mode'); + } + + $parsed = parse_url($input); + if (isset($parsed['host'])) { + $arr = explode('.', $parsed['host']); + foreach ($arr as $k => $v) { + $conv = $this->_decode($v); + if ($conv) $arr[$k] = $conv; + } + $parsed['host'] = join('.', $arr); + if (isset($parsed['scheme'])) { + $parsed['scheme'] .= (strtolower($parsed['scheme']) == 'mailto') ? ':' : '://'; + } + $return = $this->_unparse_url($parsed); + } else { // parse_url seems to have failed, try without it + $arr = explode('.', $input); + foreach ($arr as $k => $v) { + $conv = $this->_decode($v); + if ($conv) $arr[$k] = $conv; + } + $return = join('.', $arr); + } + } else { // Otherwise we consider it being a pure domain name string + $return = $this->_decode($input); + } + // The output is UTF-8 by default, other output formats need conversion here + // If one time encoding is given, use this, else the objects property + switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) { + case 'utf8': + return $return; + break; + case 'ucs4_string': + return $this->_ucs4_to_ucs4_string($this->_utf8_to_ucs4($return)); + break; + case 'ucs4_array': + return $this->_utf8_to_ucs4($return); + break; + default: + throw new InvalidArgumentException('Unsupported output format'); + } + } + + + // {{{ private + /** + * Opposite function to parse_url() + * + * Inspired by code from comments of php.net-documentation for parse_url() + * + * @param array $parts_arr parts (strings) as returned by parse_url() + * + * @return string + * @access private + */ + private function _unparse_url($parts_arr) + { + if (!empty($parts_arr['scheme'])) { + $ret_url = $parts_arr['scheme']; + } + if (!empty($parts_arr['user'])) { + $ret_url .= $parts_arr['user']; + if (!empty($parts_arr['pass'])) { + $ret_url .= ':' . $parts_arr['pass']; + } + $ret_url .= '@'; + } + $ret_url .= $parts_arr['host']; + if (!empty($parts_arr['port'])) { + $ret_url .= ':' . $parts_arr['port']; + } + $ret_url .= $parts_arr['path']; + if (!empty($parts_arr['query'])) { + $ret_url .= '?' . $parts_arr['query']; + } + if (!empty($parts_arr['fragment'])) { + $ret_url .= '#' . $parts_arr['fragment']; + } + return $ret_url; + } + + /** + * The actual encoding algorithm. + * + * @param string $decoded Decoded string which should be encoded + * + * @return string Encoded string + * @throws Exception + * @access private + */ + private function _encode($decoded) + { + // We cannot encode a domain name containing the Punycode prefix + $extract = self::_byteLength($this->_punycode_prefix); + $check_pref = $this->_utf8_to_ucs4($this->_punycode_prefix); + $check_deco = array_slice($decoded, 0, $extract); + + if ($check_pref == $check_deco) { + throw new InvalidArgumentException('This is already a punycode string'); + } + + // We will not try to encode strings consisting of basic code points only + $encodable = false; + foreach ($decoded as $k => $v) { + if ($v > 0x7a) { + $encodable = true; + break; + } + } + if (!$encodable) { + if ($this->_strict_mode) { + throw new InvalidArgumentException('The given string does not contain encodable chars'); + } + + return false; + } + + // Do NAMEPREP + $decoded = $this->_nameprep($decoded); + + $deco_len = count($decoded); + + // Empty array + if (!$deco_len) { + return false; + } + + // How many chars have been consumed + $codecount = 0; + + // Start with the prefix; copy it to output + $encoded = $this->_punycode_prefix; + + $encoded = ''; + // Copy all basic code points to output + for ($i = 0; $i < $deco_len; ++$i) { + $test = $decoded[$i]; + // Will match [0-9a-zA-Z-] + if ((0x2F < $test && $test < 0x40) + || (0x40 < $test && $test < 0x5B) + || (0x60 < $test && $test <= 0x7B) + || (0x2D == $test) + ) { + $encoded .= chr($decoded[$i]); + $codecount++; + } + } + + // All codepoints were basic ones + if ($codecount == $deco_len) { + return $encoded; + } + + // Start with the prefix; copy it to output + $encoded = $this->_punycode_prefix . $encoded; + + // If we have basic code points in output, add an hyphen to the end + if ($codecount) { + $encoded .= '-'; + } + + // Now find and encode all non-basic code points + $is_first = true; + $cur_code = $this->_initial_n; + $bias = $this->_initial_bias; + $delta = 0; + + while ($codecount < $deco_len) { + // Find the smallest code point >= the current code point and + // remember the last ouccrence of it in the input + for ($i = 0, $next_code = $this->_max_ucs; $i < $deco_len; $i++) { + if ($decoded[$i] >= $cur_code && $decoded[$i] <= $next_code) { + $next_code = $decoded[$i]; + } + } + + $delta += ($next_code - $cur_code) * ($codecount + 1); + $cur_code = $next_code; + + // Scan input again and encode all characters whose code point is $cur_code + for ($i = 0; $i < $deco_len; $i++) { + if ($decoded[$i] < $cur_code) { + $delta++; + } else if ($decoded[$i] == $cur_code) { + for ($q = $delta, $k = $this->_base; 1; $k += $this->_base) { + $t = ($k <= $bias)? + $this->_tmin : + (($k >= $bias + $this->_tmax)? $this->_tmax : $k - $bias); + + if ($q < $t) { + break; + } + + $encoded .= $this->_encodeDigit(ceil($t + (($q - $t) % ($this->_base - $t)))); + $q = ($q - $t) / ($this->_base - $t); + } + + $encoded .= $this->_encodeDigit($q); + $bias = $this->_adapt($delta, $codecount + 1, $is_first); + $codecount++; + $delta = 0; + $is_first = false; + } + } + + $delta++; + $cur_code++; + } + + return $encoded; + } + + /** + * The actual decoding algorithm. + * + * @param string $encoded Encoded string which should be decoded + * + * @return string Decoded string + * @throws Exception + * @access private + */ + private function _decode($encoded) + { + // We do need to find the Punycode prefix + if (!preg_match('!^' . preg_quote($this->_punycode_prefix, '!') . '!', $encoded)) { + return false; + } + + $encode_test = preg_replace('!^' . preg_quote($this->_punycode_prefix, '!') . '!', '', $encoded); + + // If nothing left after removing the prefix, it is hopeless + if (!$encode_test) { + return false; + } + + // Find last occurence of the delimiter + $delim_pos = strrpos($encoded, '-'); + + if ($delim_pos > self::_byteLength($this->_punycode_prefix)) { + for ($k = self::_byteLength($this->_punycode_prefix); $k < $delim_pos; ++$k) { + $decoded[] = ord($encoded{$k}); + } + } else { + $decoded = array(); + } + + $deco_len = count($decoded); + $enco_len = self::_byteLength($encoded); + + // Wandering through the strings; init + $is_first = true; + $bias = $this->_initial_bias; + $idx = 0; + $char = $this->_initial_n; + + for ($enco_idx = ($delim_pos)? ($delim_pos + 1) : 0; $enco_idx < $enco_len; ++$deco_len) { + for ($old_idx = $idx, $w = 1, $k = $this->_base; 1 ; $k += $this->_base) { + $digit = $this->_decodeDigit($encoded{$enco_idx++}); + $idx += $digit * $w; + + $t = ($k <= $bias) ? + $this->_tmin : + (($k >= $bias + $this->_tmax)? $this->_tmax : ($k - $bias)); + + if ($digit < $t) { + break; + } + + $w = (int)($w * ($this->_base - $t)); + } + + $bias = $this->_adapt($idx - $old_idx, $deco_len + 1, $is_first); + $is_first = false; + $char += (int) ($idx / ($deco_len + 1)); + $idx %= ($deco_len + 1); + + if ($deco_len > 0) { + // Make room for the decoded char + for ($i = $deco_len; $i > $idx; $i--) { + $decoded[$i] = $decoded[($i - 1)]; + } + } + + $decoded[$idx++] = $char; + } + + return $this->_ucs4_to_utf8($decoded); + } + + /** + * Adapt the bias according to the current code point and position. + * + * @param int $delta ... + * @param int $npoints ... + * @param boolean $is_first ... + * + * @return int + * @access private + */ + private function _adapt($delta, $npoints, $is_first) + { + $delta = (int) ($is_first ? ($delta / $this->_damp) : ($delta / 2)); + $delta += (int) ($delta / $npoints); + + for ($k = 0; $delta > (($this->_base - $this->_tmin) * $this->_tmax) / 2; $k += $this->_base) { + $delta = (int) ($delta / ($this->_base - $this->_tmin)); + } + + return (int) ($k + ($this->_base - $this->_tmin + 1) * $delta / ($delta + $this->_skew)); + } + + /** + * Encoding a certain digit. + * + * @param int $d One digit to encode + * + * @return char Encoded digit + * @access private + */ + private function _encodeDigit($d) + { + return chr($d + 22 + 75 * ($d < 26)); + } + + /** + * Decode a certain digit. + * + * @param char $cp One digit (character) to decode + * + * @return int Decoded digit + * @access private + */ + private function _decodeDigit($cp) + { + $cp = ord($cp); + return ($cp - 48 < 10)? $cp - 22 : (($cp - 65 < 26)? $cp - 65 : (($cp - 97 < 26)? $cp - 97 : $this->_base)); + } + + /** + * Do Nameprep according to RFC3491 and RFC3454. + * + * @param array $input Unicode Characters + * + * @return string Unicode Characters, Nameprep'd + * @throws Exception + * @access private + */ + private function _nameprep($input) + { + $output = array(); + + // Walking through the input array, performing the required steps on each of + // the input chars and putting the result into the output array + // While mapping required chars we apply the cannonical ordering + + foreach ($input as $v) { + // Map to nothing == skip that code point + if (in_array($v, self::$_np_map_nothing)) { + continue; + } + + // Try to find prohibited input + if (in_array($v, self::$_np_prohibit) || in_array($v, self::$_general_prohibited)) { + throw new Net_IDNA2_Exception_Nameprep('Prohibited input U+' . sprintf('%08X', $v)); + } + + foreach (self::$_np_prohibit_ranges as $range) { + if ($range[0] <= $v && $v <= $range[1]) { + throw new Net_IDNA2_Exception_Nameprep('Prohibited input U+' . sprintf('%08X', $v)); + } + } + + // Hangul syllable decomposition + if (0xAC00 <= $v && $v <= 0xD7AF) { + foreach ($this->_hangulDecompose($v) as $out) { + $output[] = $out; + } + } else if (($this->_version == '2003') && isset(self::$_np_replacemaps[$v])) { + // There's a decomposition mapping for that code point + // Decompositions only in version 2003 (original) of IDNA + foreach ($this->_applyCannonicalOrdering(self::$_np_replacemaps[$v]) as $out) { + $output[] = $out; + } + } else { + $output[] = $v; + } + } + + // Combine code points + + $last_class = 0; + $last_starter = 0; + $out_len = count($output); + + for ($i = 0; $i < $out_len; ++$i) { + $class = $this->_getCombiningClass($output[$i]); + + if ((!$last_class || $last_class != $class) && $class) { + // Try to match + $seq_len = $i - $last_starter; + $out = $this->_combine(array_slice($output, $last_starter, $seq_len)); + + // On match: Replace the last starter with the composed character and remove + // the now redundant non-starter(s) + if ($out) { + $output[$last_starter] = $out; + + if (count($out) != $seq_len) { + for ($j = $i + 1; $j < $out_len; ++$j) { + $output[$j - 1] = $output[$j]; + } + + unset($output[$out_len]); + } + + // Rewind the for loop by one, since there can be more possible compositions + $i--; + $out_len--; + $last_class = ($i == $last_starter)? 0 : $this->_getCombiningClass($output[$i - 1]); + + continue; + } + } + + // The current class is 0 + if (!$class) { + $last_starter = $i; + } + + $last_class = $class; + } + + return $output; + } + + /** + * Decomposes a Hangul syllable + * (see http://www.unicode.org/unicode/reports/tr15/#Hangul). + * + * @param integer $char 32bit UCS4 code point + * + * @return array Either Hangul Syllable decomposed or original 32bit + * value as one value array + * @access private + */ + private function _hangulDecompose($char) + { + $sindex = $char - $this->_sbase; + + if ($sindex < 0 || $sindex >= $this->_scount) { + return array($char); + } + + $result = array(); + $T = $this->_tbase + $sindex % $this->_tcount; + $result[] = (int)($this->_lbase + $sindex / $this->_ncount); + $result[] = (int)($this->_vbase + ($sindex % $this->_ncount) / $this->_tcount); + + if ($T != $this->_tbase) { + $result[] = $T; + } + + return $result; + } + + /** + * Ccomposes a Hangul syllable + * (see http://www.unicode.org/unicode/reports/tr15/#Hangul). + * + * @param array $input Decomposed UCS4 sequence + * + * @return array UCS4 sequence with syllables composed + * @access private + */ + private function _hangulCompose($input) + { + $inp_len = count($input); + + if (!$inp_len) { + return array(); + } + + $result = array(); + $last = $input[0]; + $result[] = $last; // copy first char from input to output + + for ($i = 1; $i < $inp_len; ++$i) { + $char = $input[$i]; + + // Find out, wether two current characters from L and V + $lindex = $last - $this->_lbase; + + if (0 <= $lindex && $lindex < $this->_lcount) { + $vindex = $char - $this->_vbase; + + if (0 <= $vindex && $vindex < $this->_vcount) { + // create syllable of form LV + $last = ($this->_sbase + ($lindex * $this->_vcount + $vindex) * $this->_tcount); + $out_off = count($result) - 1; + $result[$out_off] = $last; // reset last + + // discard char + continue; + } + } + + // Find out, wether two current characters are LV and T + $sindex = $last - $this->_sbase; + + if (0 <= $sindex && $sindex < $this->_scount && ($sindex % $this->_tcount) == 0) { + $tindex = $char - $this->_tbase; + + if (0 <= $tindex && $tindex <= $this->_tcount) { + // create syllable of form LVT + $last += $tindex; + $out_off = count($result) - 1; + $result[$out_off] = $last; // reset last + + // discard char + continue; + } + } + + // if neither case was true, just add the character + $last = $char; + $result[] = $char; + } + + return $result; + } + + /** + * Returns the combining class of a certain wide char. + * + * @param integer $char Wide char to check (32bit integer) + * + * @return integer Combining class if found, else 0 + * @access private + */ + private function _getCombiningClass($char) + { + return isset(self::$_np_norm_combcls[$char])? self::$_np_norm_combcls[$char] : 0; + } + + /** + * Apllies the cannonical ordering of a decomposed UCS4 sequence. + * + * @param array $input Decomposed UCS4 sequence + * + * @return array Ordered USC4 sequence + * @access private + */ + private function _applyCannonicalOrdering($input) + { + $swap = true; + $size = count($input); + + while ($swap) { + $swap = false; + $last = $this->_getCombiningClass($input[0]); + + for ($i = 0; $i < $size - 1; ++$i) { + $next = $this->_getCombiningClass($input[$i + 1]); + + if ($next != 0 && $last > $next) { + // Move item leftward until it fits + for ($j = $i + 1; $j > 0; --$j) { + if ($this->_getCombiningClass($input[$j - 1]) <= $next) { + break; + } + + $t = $input[$j]; + $input[$j] = $input[$j - 1]; + $input[$j - 1] = $t; + $swap = 1; + } + + // Reentering the loop looking at the old character again + $next = $last; + } + + $last = $next; + } + } + + return $input; + } + + /** + * Do composition of a sequence of starter and non-starter. + * + * @param array $input UCS4 Decomposed sequence + * + * @return array Ordered USC4 sequence + * @access private + */ + private function _combine($input) + { + $inp_len = count($input); + + // Is it a Hangul syllable? + if (1 != $inp_len) { + $hangul = $this->_hangulCompose($input); + + // This place is probably wrong + if (count($hangul) != $inp_len) { + return $hangul; + } + } + + foreach (self::$_np_replacemaps as $np_src => $np_target) { + if ($np_target[0] != $input[0]) { + continue; + } + + if (count($np_target) != $inp_len) { + continue; + } + + $hit = false; + + foreach ($input as $k2 => $v2) { + if ($v2 == $np_target[$k2]) { + $hit = true; + } else { + $hit = false; + break; + } + } + + if ($hit) { + return $np_src; + } + } + + return false; + } + + /** + * This converts an UTF-8 encoded string to its UCS-4 (array) representation + * By talking about UCS-4 we mean arrays of 32bit integers representing + * each of the "chars". This is due to PHP not being able to handle strings with + * bit depth different from 8. This applies to the reverse method _ucs4_to_utf8(), too. + * The following UTF-8 encodings are supported: + * + * bytes bits representation + * 1 7 0xxxxxxx + * 2 11 110xxxxx 10xxxxxx + * 3 16 1110xxxx 10xxxxxx 10xxxxxx + * 4 21 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + * 5 26 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx + * 6 31 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx + * + * Each x represents a bit that can be used to store character data. + * + * @param string $input utf8-encoded string + * + * @return array ucs4-encoded array + * @throws Exception + * @access private + */ + private function _utf8_to_ucs4($input) + { + $output = array(); + $out_len = 0; + $inp_len = self::_byteLength($input, '8bit'); + $mode = 'next'; + $test = 'none'; + for ($k = 0; $k < $inp_len; ++$k) { + $v = ord($input{$k}); // Extract byte from input string + + if ($v < 128) { // We found an ASCII char - put into stirng as is + $output[$out_len] = $v; + ++$out_len; + if ('add' == $mode) { + throw new UnexpectedValueException('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k); + } + continue; + } + if ('next' == $mode) { // Try to find the next start byte; determine the width of the Unicode char + $start_byte = $v; + $mode = 'add'; + $test = 'range'; + if ($v >> 5 == 6) { // &110xxxxx 10xxxxx + $next_byte = 0; // Tells, how many times subsequent bitmasks must rotate 6bits to the left + $v = ($v - 192) << 6; + } elseif ($v >> 4 == 14) { // &1110xxxx 10xxxxxx 10xxxxxx + $next_byte = 1; + $v = ($v - 224) << 12; + } elseif ($v >> 3 == 30) { // &11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + $next_byte = 2; + $v = ($v - 240) << 18; + } elseif ($v >> 2 == 62) { // &111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx + $next_byte = 3; + $v = ($v - 248) << 24; + } elseif ($v >> 1 == 126) { // &1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx + $next_byte = 4; + $v = ($v - 252) << 30; + } else { + throw new UnexpectedValueException('This might be UTF-8, but I don\'t understand it at byte '.$k); + } + if ('add' == $mode) { + $output[$out_len] = (int) $v; + ++$out_len; + continue; + } + } + if ('add' == $mode) { + if (!$this->_allow_overlong && $test == 'range') { + $test = 'none'; + if (($v < 0xA0 && $start_byte == 0xE0) || ($v < 0x90 && $start_byte == 0xF0) || ($v > 0x8F && $start_byte == 0xF4)) { + throw new OutOfRangeException('Bogus UTF-8 character detected (out of legal range) at byte '.$k); + } + } + if ($v >> 6 == 2) { // Bit mask must be 10xxxxxx + $v = ($v - 128) << ($next_byte * 6); + $output[($out_len - 1)] += $v; + --$next_byte; + } else { + throw new UnexpectedValueException('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k); + } + if ($next_byte < 0) { + $mode = 'next'; + } + } + } // for + return $output; + } + + /** + * Convert UCS-4 array into UTF-8 string + * + * @param array $input ucs4-encoded array + * + * @return string utf8-encoded string + * @throws Exception + * @access private + */ + private function _ucs4_to_utf8($input) + { + $output = ''; + + foreach ($input as $v) { + // $v = ord($v); + + if ($v < 128) { + // 7bit are transferred literally + $output .= chr($v); + } else if ($v < 1 << 11) { + // 2 bytes + $output .= chr(192 + ($v >> 6)) + . chr(128 + ($v & 63)); + } else if ($v < 1 << 16) { + // 3 bytes + $output .= chr(224 + ($v >> 12)) + . chr(128 + (($v >> 6) & 63)) + . chr(128 + ($v & 63)); + } else if ($v < 1 << 21) { + // 4 bytes + $output .= chr(240 + ($v >> 18)) + . chr(128 + (($v >> 12) & 63)) + . chr(128 + (($v >> 6) & 63)) + . chr(128 + ($v & 63)); + } else if ($v < 1 << 26) { + // 5 bytes + $output .= chr(248 + ($v >> 24)) + . chr(128 + (($v >> 18) & 63)) + . chr(128 + (($v >> 12) & 63)) + . chr(128 + (($v >> 6) & 63)) + . chr(128 + ($v & 63)); + } else if ($v < 1 << 31) { + // 6 bytes + $output .= chr(252 + ($v >> 30)) + . chr(128 + (($v >> 24) & 63)) + . chr(128 + (($v >> 18) & 63)) + . chr(128 + (($v >> 12) & 63)) + . chr(128 + (($v >> 6) & 63)) + . chr(128 + ($v & 63)); + } else { + throw new UnexpectedValueException('Conversion from UCS-4 to UTF-8 failed: malformed input'); + } + } + + return $output; + } + + /** + * Convert UCS-4 array into UCS-4 string + * + * @param array $input ucs4-encoded array + * + * @return string ucs4-encoded string + * @throws Exception + * @access private + */ + private function _ucs4_to_ucs4_string($input) + { + $output = ''; + // Take array values and split output to 4 bytes per value + // The bit mask is 255, which reads &11111111 + foreach ($input as $v) { + $output .= ($v & (255 << 24) >> 24) . ($v & (255 << 16) >> 16) . ($v & (255 << 8) >> 8) . ($v & 255); + } + return $output; + } + + /** + * Convert UCS-4 string into UCS-4 array + * + * @param string $input ucs4-encoded string + * + * @return array ucs4-encoded array + * @throws InvalidArgumentException + * @access private + */ + private function _ucs4_string_to_ucs4($input) + { + $output = array(); + + $inp_len = self::_byteLength($input); + // Input length must be dividable by 4 + if ($inp_len % 4) { + throw new InvalidArgumentException('Input UCS4 string is broken'); + } + + // Empty input - return empty output + if (!$inp_len) { + return $output; + } + + for ($i = 0, $out_len = -1; $i < $inp_len; ++$i) { + // Increment output position every 4 input bytes + if (!$i % 4) { + $out_len++; + $output[$out_len] = 0; + } + $output[$out_len] += ord($input{$i}) << (8 * (3 - ($i % 4) ) ); + } + return $output; + } + + /** + * Echo hex representation of UCS4 sequence. + * + * @param array $input UCS4 sequence + * @param boolean $include_bit Include bitmask in output + * + * @return void + * @static + * @access private + */ + private static function _showHex($input, $include_bit = false) + { + foreach ($input as $k => $v) { + echo '[', $k, '] => ', sprintf('%X', $v); + + if ($include_bit) { + echo ' (', Net_IDNA2::_showBitmask($v), ')'; + } + + echo "\n"; + } + } + + /** + * Gives you a bit representation of given Byte (8 bits), Word (16 bits) or DWord (32 bits) + * Output width is automagically determined + * + * @param int $octet ... + * + * @return string Bitmask-representation + * @static + * @access private + */ + private static function _showBitmask($octet) + { + if ($octet >= (1 << 16)) { + $w = 31; + } else if ($octet >= (1 << 8)) { + $w = 15; + } else { + $w = 7; + } + + $return = ''; + + for ($i = $w; $i > -1; $i--) { + $return .= ($octet & (1 << $i))? '1' : '0'; + } + + return $return; + } + + /** + * Gets the length of a string in bytes even if mbstring function + * overloading is turned on + * + * @param string $string the string for which to get the length. + * + * @return integer the length of the string in bytes. + * + * @see Net_IDNA2::$_mb_string_overload + */ + private static function _byteLength($string) + { + if (self::$_mb_string_overload) { + return mb_strlen($string, '8bit'); + } + return strlen((binary)$string); + } + + // }}}} + + // {{{ factory + /** + * Attempts to return a concrete IDNA instance for either php4 or php5. + * + * @param array $params Set of paramaters + * + * @return Net_IDNA2 + * @access public + */ + function getInstance($params = array()) + { + return new Net_IDNA2($params); + } + // }}} + + // {{{ singleton + /** + * Attempts to return a concrete IDNA instance for either php4 or php5, + * only creating a new instance if no IDNA instance with the same + * parameters currently exists. + * + * @param array $params Set of paramaters + * + * @return object Net_IDNA2 + * @access public + */ + function singleton($params = array()) + { + static $instances; + if (!isset($instances)) { + $instances = array(); + } + + $signature = serialize($params); + if (!isset($instances[$signature])) { + $instances[$signature] = Net_IDNA2::getInstance($params); + } + + return $instances[$signature]; + } + // }}} +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Vendors/Net/IDNA2CustomExceptions.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Vendors/Net/IDNA2CustomExceptions.php new file mode 100755 index 00000000..69b0f691 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Vendors/Net/IDNA2CustomExceptions.php @@ -0,0 +1,18 @@ +getSignature(); + } + + return $sSignature; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/LICENSE.txt b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/LICENSE.txt new file mode 100755 index 00000000..90e632a7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/LICENSE.txt @@ -0,0 +1,48 @@ +MIT License + +Copyright (c) <2011-2015> Serban Ghita, Nick Ilyin and contributors. + +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. + +Developer’s Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +(a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +(b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +(c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +(d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/Mobile_Detect.json b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/Mobile_Detect.json new file mode 100755 index 00000000..63d2aa7b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/Mobile_Detect.json @@ -0,0 +1 @@ +{"version":"2.8.26","headerMatch":{"HTTP_ACCEPT":{"matches":["application\/x-obml2d","application\/vnd.rim.html","text\/vnd.wap.wml","application\/vnd.wap.xhtml+xml"]},"HTTP_X_WAP_PROFILE":null,"HTTP_X_WAP_CLIENTID":null,"HTTP_WAP_CONNECTION":null,"HTTP_PROFILE":null,"HTTP_X_OPERAMINI_PHONE_UA":null,"HTTP_X_NOKIA_GATEWAY_ID":null,"HTTP_X_ORANGE_ID":null,"HTTP_X_VODAFONE_3GPDPCONTEXT":null,"HTTP_X_HUAWEI_USERID":null,"HTTP_UA_OS":null,"HTTP_X_MOBILE_GATEWAY":null,"HTTP_X_ATT_DEVICEID":null,"HTTP_UA_CPU":{"matches":["ARM"]}},"uaHttpHeaders":["HTTP_USER_AGENT","HTTP_X_OPERAMINI_PHONE_UA","HTTP_X_DEVICE_USER_AGENT","HTTP_X_ORIGINAL_USER_AGENT","HTTP_X_SKYFIRE_PHONE","HTTP_X_BOLT_PHONE_UA","HTTP_DEVICE_STOCK_UA","HTTP_X_UCBROWSER_DEVICE_UA"],"uaMatch":{"phones":{"iPhone":"\\biPhone\\b|\\biPod\\b","BlackBerry":"BlackBerry|\\bBB10\\b|rim[0-9]+","HTC":"HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\\bEVO\\b|T-Mobile G1|Z520m","Nexus":"Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6","Dell":"Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\\b001DL\\b|\\b101DL\\b|\\bGS01\\b","Motorola":"Motorola|DROIDX|DROID BIONIC|\\bDroid\\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\\bMoto E\\b","Samsung":"\\bSamsung\\b|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F|SM-G920F|SM-G920V|SM-G930F|SM-N910C","LG":"\\bLG\\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|MS323)","Sony":"SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533","Asus":"Asus.*Galaxy|PadFone.*Mobile","NokiaLumia":"Lumia [0-9]{3,4}","Micromax":"Micromax.*\\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\\b","Palm":"PalmSource|Palm","Vertu":"Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature","Pantech":"PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790","Fly":"IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250","Wiko":"KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM","iMobile":"i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)","SimValley":"\\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\\b","Wolfgang":"AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q","Alcatel":"Alcatel","Nintendo":"Nintendo 3DS","Amoi":"Amoi","INQ":"INQ","GenericPhone":"Tapatalk|PDA;|SAGEM|\\bmmp\\b|pocket|\\bpsp\\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\\bwap\\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser"},"tablets":{"iPad":"iPad|iPad.*Mobile","NexusTablet":"Android.*Nexus[\\s]+(7|9|10)","SamsungTablet":"SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-T116BU|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713|SM-T719|SM-T813|SM-T819|SM-T580|SM-T355Y|SM-T280|SM-T817A|SM-T820|SM-W700|SM-P580|SM-T587|SM-P350|SM-P555M|SM-P355M|SM-T113NU|SM-T815Y","Kindle":"Kindle|Silk.*Accelerated|Android.*\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI|KFFOWI|KFGIWI|KFMEWI)\\b|Android.*Silk\/[0-9.]+ like Chrome\/[0-9.]+ (?!Mobile)","SurfaceTablet":"Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)","HPTablet":"HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10","AsusTablet":"^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\\bK00F\\b|\\bK00C\\b|\\bK00E\\b|\\bK00L\\b|TX201LA|ME176C|ME102A|\\bM80TA\\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\\bME70C\\b|ME581C|ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z|\\bP027\\b","BlackBerryTablet":"PlayBook|RIM Tablet","HTCtablet":"HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410","MotorolaTablet":"xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617","NookTablet":"Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2","AcerTablet":"Android.*; \\b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\\b|W3-810|\\bA3-A10\\b|\\bA3-A11\\b|\\bA3-A20\\b|\\bA3-A30","ToshibaTablet":"Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO","LGTablet":"\\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\\b","FujitsuTablet":"Android.*\\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\\b","PrestigioTablet":"PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002","LenovoTablet":"Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-850M|YT3-X90L|YT3-X90F|YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)","DellTablet":"Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7","YarvikTablet":"Android.*\\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\\b","MedionTablet":"Android.*\\bOYO\\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB","ArnovaTablet":"97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2","IntensoTablet":"INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004","IRUTablet":"M702pro","MegafonTablet":"MegaFon V9|\\bZTE V9\\b|Android.*\\bMT7A\\b","EbodaTablet":"E-Boda (Supreme|Impresspeed|Izzycomm|Essential)","AllViewTablet":"Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)","ArchosTablet":"\\b(101G9|80G9|A101IT)\\b|Qilive 97R|Archos5|\\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|c|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\\b","AinolTablet":"NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark","NokiaLumiaTablet":"Lumia 2520","SonyTablet":"Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP612|SOT31","PhilipsTablet":"\\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\\b","CubeTablet":"Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT","CobyTablet":"MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010","MIDTablet":"M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10","MSITablet":"MSI \\b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\\b","SMiTTablet":"Android.*(\\bMID\\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)","RockChipTablet":"Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A","FlyTablet":"IQ310|Fly Vision","bqTablet":"Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris [E|M]10)|Maxwell.*Lite|Maxwell.*Plus","HuaweiTablet":"MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim","NecTablet":"\\bN-06D|\\bN-08D","PantechTablet":"Pantech.*P4100","BronchoTablet":"Broncho.*(N701|N708|N802|a710)","VersusTablet":"TOUCHPAD.*[78910]|\\bTOUCHTAB\\b","ZyncTablet":"z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900","PositivoTablet":"TB07STA|TB10STA|TB07FTA|TB10FTA","NabiTablet":"Android.*\\bNabi","KoboTablet":"Kobo Touch|\\bK080\\b|\\bVox\\b Build|\\bArc\\b Build","DanewTablet":"DSlide.*\\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\\b","TexetTablet":"NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE","PlaystationTablet":"Playstation.*(Portable|Vita)","TrekstorTablet":"ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab","PyleAudioTablet":"\\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\\b","AdvanTablet":"Android.* \\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\b ","DanyTechTablet":"Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1","GalapadTablet":"Android.*\\bG1\\b","MicromaxTablet":"Funbook|Micromax.*\\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\\b","KarbonnTablet":"Android.*\\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\\b","AllFineTablet":"Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide","PROSCANTablet":"\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\b","YONESTablet":"BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026","ChangJiaTablet":"TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503","GUTablet":"TX-A1301|TX-M9002|Q702|kf026","PointOfViewTablet":"TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10","OvermaxTablet":"OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)","HCLTablet":"HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync","DPSTablet":"DPS Dream 9|DPS Dual 7","VistureTablet":"V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10","CrestaTablet":"CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989","MediatekTablet":"\\bMT8125|MT8389|MT8135|MT8377\\b","ConcordeTablet":"Concorde([ ]+)?Tab|ConCorde ReadMan","GoCleverTablet":"GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042","ModecomTablet":"FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003","VoninoTablet":"\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\\bQ8\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\b","ECSTablet":"V07OT2|TM105A|S10OT1|TR10CS1","StorexTablet":"eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab","VodafoneTablet":"SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497","EssentielBTablet":"Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2","RossMoorTablet":"RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711","iMobileTablet":"i-mobile i-note","TolinoTablet":"tolino tab [0-9.]+|tolino shine","AudioSonicTablet":"\\bC-22Q|T7-QC|T-17B|T-17P\\b","AMPETablet":"Android.* A78 ","SkkTablet":"Android.* (SKYPAD|PHOENIX|CYCLOPS)","TecnoTablet":"TECNO P9","JXDTablet":"Android.* \\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\\b","iJoyTablet":"Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)","FX2Tablet":"FX2 PAD7|FX2 PAD10","XoroTablet":"KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151","ViewsonicTablet":"ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a","OdysTablet":"LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\\bXELIO\\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10","CaptivaTablet":"CAPTIVA PAD","IconbitTablet":"NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S","TeclastTablet":"T98 4G|\\bP80\\b|\\bX90HD\\b|X98 Air|X98 Air 3G|\\bX89\\b|P80 3G|\\bX80h\\b|P98 Air|\\bX89HD\\b|P98 3G|\\bP90HD\\b|P89 3G|X98 3G|\\bP70h\\b|P79HD 3G|G18d 3G|\\bP79HD\\b|\\bP89s\\b|\\bA88\\b|\\bP10HD\\b|\\bP19HD\\b|G18 3G|\\bP78HD\\b|\\bA78\\b|\\bP75\\b|G17s 3G|G17h 3G|\\bP85t\\b|\\bP90\\b|\\bP11\\b|\\bP98t\\b|\\bP98HD\\b|\\bG18d\\b|\\bP85s\\b|\\bP11HD\\b|\\bP88s\\b|\\bA80HD\\b|\\bA80se\\b|\\bA10h\\b|\\bP89\\b|\\bP78s\\b|\\bG18\\b|\\bP85\\b|\\bA70h\\b|\\bA70\\b|\\bG17\\b|\\bP18\\b|\\bA80s\\b|\\bA11s\\b|\\bP88HD\\b|\\bA80h\\b|\\bP76s\\b|\\bP76h\\b|\\bP98\\b|\\bA10HD\\b|\\bP78\\b|\\bP88\\b|\\bA11\\b|\\bA10t\\b|\\bP76a\\b|\\bP76t\\b|\\bP76e\\b|\\bP85HD\\b|\\bP85a\\b|\\bP86\\b|\\bP75HD\\b|\\bP76v\\b|\\bA12\\b|\\bP75a\\b|\\bA15\\b|\\bP76Ti\\b|\\bP81HD\\b|\\bA10\\b|\\bT760VE\\b|\\bT720HD\\b|\\bP76\\b|\\bP73\\b|\\bP71\\b|\\bP72\\b|\\bT720SE\\b|\\bC520Ti\\b|\\bT760\\b|\\bT720VE\\b|T720-3GE|T720-WiFi","OndaTablet":"\\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\\b[\\s]+","JaytechTablet":"TPC-PA762","BlaupunktTablet":"Endeavour 800NG|Endeavour 1010","DigmaTablet":"\\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\\b","EvolioTablet":"ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\\bEvotab\\b|\\bNeura\\b","LavaTablet":"QPAD E704|\\bIvoryS\\b|E-TAB IVORY|\\bE-TAB\\b","AocTablet":"MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712","MpmanTablet":"MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\\bMPG7\\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010","CelkonTablet":"CT695|CT888|CT[\\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\\bCT-1\\b","WolderTablet":"miTab \\b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\\b","MiTablet":"\\bMI PAD\\b|\\bHM NOTE 1W\\b","NibiruTablet":"Nibiru M1|Nibiru Jupiter One","NexoTablet":"NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI","LeaderTablet":"TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100","UbislateTablet":"UbiSlate[\\s]?7C","PocketBookTablet":"Pocketbook","KocasoTablet":"\\b(TB-1207)\\b","HisenseTablet":"\\b(F5281|E2371)\\b","Hudl":"Hudl HT7S3|Hudl 2","TelstraTablet":"T-Hub2","GenericTablet":"Android.*\\b97D\\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\\bA7EB\\b|CatNova8|A1_07|CT704|CT1002|\\bM721\\b|rk30sdk|\\bEVOTAB\\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\\bM6pro\\b|CT1020W|arc 10HD|\\bTP750\\b|\\bQTAQZ3\\b"},"browsers":{"Chrome":"\\bCrMo\\b|CriOS|Android.*Chrome\/[.0-9]* (Mobile)?","Dolfin":"\\bDolfin\\b","Opera":"Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR\/[0-9.]+|Coast\/[0-9.]+","Skyfire":"Skyfire","Edge":"Mobile Safari\/[.0-9]* Edge","IE":"IEMobile|MSIEMobile","Firefox":"fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile|FxiOS","Bolt":"bolt","TeaShark":"teashark","Blazer":"Blazer","Safari":"Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari","UCBrowser":"UC.*Browser|UCWEB","baiduboxapp":"baiduboxapp","baidubrowser":"baidubrowser","DiigoBrowser":"DiigoBrowser","Puffin":"Puffin","Mercury":"\\bMercury\\b","ObigoBrowser":"Obigo","NetFront":"NF-Browser","GenericBrowser":"NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger","PaleMoon":"Android.*PaleMoon|Mobile.*PaleMoon"},"os":{"AndroidOS":"Android","BlackBerryOS":"blackberry|\\bBB10\\b|rim tablet os","PalmOS":"PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino","SymbianOS":"Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\\bS60\\b","WindowsMobileOS":"Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;","WindowsPhoneOS":"Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;","iOS":"\\biPhone.*Mobile|\\biPod|\\biPad","MeeGoOS":"MeeGo","MaemoOS":"Maemo","JavaOS":"J2ME\/|\\bMIDP\\b|\\bCLDC\\b","webOS":"webOS|hpwOS","badaOS":"\\bBada\\b","BREWOS":"BREW"},"utilities":{"Bot":"Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|YandexMobileBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom","MobileBot":"Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker\/M1A1-R2D2","DesktopMode":"WPDesktop","TV":"SonyDTV|HbbTV","WebKit":"(webkit)[ \/]([\\w.]+)","Console":"\\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\\b","Watch":"SM-V700"}}} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/Mobile_Detect.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/Mobile_Detect.php new file mode 100755 index 00000000..6d0a36d5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/Mobile_Detect.php @@ -0,0 +1,1460 @@ + + * Nick Ilyin + * + * Original author: Victor Stanciu + * + * @license Code and contributions have 'MIT License' + * More details: https://github.com/serbanghita/Mobile-Detect/blob/master/LICENSE.txt + * + * @link Homepage: http://mobiledetect.net + * GitHub Repo: https://github.com/serbanghita/Mobile-Detect + * Google Code: http://code.google.com/p/php-mobile-detect/ + * README: https://github.com/serbanghita/Mobile-Detect/blob/master/README.md + * HOWTO: https://github.com/serbanghita/Mobile-Detect/wiki/Code-examples + * + * @version 2.8.26 + */ + +class Mobile_Detect +{ + /** + * Mobile detection type. + * + * @deprecated since version 2.6.9 + */ + const DETECTION_TYPE_MOBILE = 'mobile'; + + /** + * Extended detection type. + * + * @deprecated since version 2.6.9 + */ + const DETECTION_TYPE_EXTENDED = 'extended'; + + /** + * A frequently used regular expression to extract version #s. + * + * @deprecated since version 2.6.9 + */ + const VER = '([\w._\+]+)'; + + /** + * Top-level device. + */ + const MOBILE_GRADE_A = 'A'; + + /** + * Mid-level device. + */ + const MOBILE_GRADE_B = 'B'; + + /** + * Low-level device. + */ + const MOBILE_GRADE_C = 'C'; + + /** + * Stores the version number of the current release. + */ + const VERSION = '2.8.26'; + + /** + * A type for the version() method indicating a string return value. + */ + const VERSION_TYPE_STRING = 'text'; + + /** + * A type for the version() method indicating a float return value. + */ + const VERSION_TYPE_FLOAT = 'float'; + + /** + * A cache for resolved matches + * @var array + */ + protected $cache = array(); + + /** + * The User-Agent HTTP header is stored in here. + * @var string + */ + protected $userAgent = null; + + /** + * HTTP headers in the PHP-flavor. So HTTP_USER_AGENT and SERVER_SOFTWARE. + * @var array + */ + protected $httpHeaders = array(); + + /** + * CloudFront headers. E.g. CloudFront-Is-Desktop-Viewer, CloudFront-Is-Mobile-Viewer & CloudFront-Is-Tablet-Viewer. + * @var array + */ + protected $cloudfrontHeaders = array(); + + /** + * The matching Regex. + * This is good for debug. + * @var string + */ + protected $matchingRegex = null; + + /** + * The matches extracted from the regex expression. + * This is good for debug. + * @var string + */ + protected $matchesArray = null; + + /** + * The detection type, using self::DETECTION_TYPE_MOBILE or self::DETECTION_TYPE_EXTENDED. + * + * @deprecated since version 2.6.9 + * + * @var string + */ + protected $detectionType = self::DETECTION_TYPE_MOBILE; + + /** + * HTTP headers that trigger the 'isMobile' detection + * to be true. + * + * @var array + */ + protected static $mobileHeaders = array( + + 'HTTP_ACCEPT' => array('matches' => array( + // Opera Mini; @reference: http://dev.opera.com/articles/view/opera-binary-markup-language/ + 'application/x-obml2d', + // BlackBerry devices. + 'application/vnd.rim.html', + 'text/vnd.wap.wml', + 'application/vnd.wap.xhtml+xml' + )), + 'HTTP_X_WAP_PROFILE' => null, + 'HTTP_X_WAP_CLIENTID' => null, + 'HTTP_WAP_CONNECTION' => null, + 'HTTP_PROFILE' => null, + // Reported by Opera on Nokia devices (eg. C3). + 'HTTP_X_OPERAMINI_PHONE_UA' => null, + 'HTTP_X_NOKIA_GATEWAY_ID' => null, + 'HTTP_X_ORANGE_ID' => null, + 'HTTP_X_VODAFONE_3GPDPCONTEXT' => null, + 'HTTP_X_HUAWEI_USERID' => null, + // Reported by Windows Smartphones. + 'HTTP_UA_OS' => null, + // Reported by Verizon, Vodafone proxy system. + 'HTTP_X_MOBILE_GATEWAY' => null, + // Seen this on HTC Sensation. SensationXE_Beats_Z715e. + 'HTTP_X_ATT_DEVICEID' => null, + // Seen this on a HTC. + 'HTTP_UA_CPU' => array('matches' => array('ARM')), + ); + + /** + * List of mobile devices (phones). + * + * @var array + */ + protected static $phoneDevices = array( + 'iPhone' => '\biPhone\b|\biPod\b', // |\biTunes + 'BlackBerry' => 'BlackBerry|\bBB10\b|rim[0-9]+', + 'HTC' => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m', + 'Nexus' => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6', + // @todo: Is 'Dell Streak' a tablet or a phone? ;) + 'Dell' => 'Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b', + 'Motorola' => 'Motorola|DROIDX|DROID BIONIC|\bDroid\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\bMoto E\b', + 'Samsung' => '\bSamsung\b|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F|SM-G920F|SM-G920V|SM-G930F|SM-N910C', + 'LG' => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|MS323)', + 'Sony' => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533', + 'Asus' => 'Asus.*Galaxy|PadFone.*Mobile', + 'NokiaLumia' => 'Lumia [0-9]{3,4}', + // http://www.micromaxinfo.com/mobiles/smartphones + // Added because the codes might conflict with Acer Tablets. + 'Micromax' => 'Micromax.*\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\b', + // @todo Complete the regex. + 'Palm' => 'PalmSource|Palm', // avantgo|blazer|elaine|hiptop|plucker|xiino ; + 'Vertu' => 'Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature', // Just for fun ;) + // http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA (PANTECH) + // Most of the VEGA devices are legacy. PANTECH seem to be newer devices based on Android. + 'Pantech' => 'PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790', + // http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones. + 'Fly' => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250', + // http://fr.wikomobile.com + 'Wiko' => 'KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM', + 'iMobile' => 'i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)', + // Added simvalley mobile just for fun. They have some interesting devices. + // http://www.simvalley.fr/telephonie---gps-_22_telephonie-mobile_telephones_.html + 'SimValley' => '\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\b', + // Wolfgang - a brand that is sold by Aldi supermarkets. + // http://www.wolfgangmobile.com/ + 'Wolfgang' => 'AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q', + 'Alcatel' => 'Alcatel', + 'Nintendo' => 'Nintendo 3DS', + // http://en.wikipedia.org/wiki/Amoi + 'Amoi' => 'Amoi', + // http://en.wikipedia.org/wiki/INQ + 'INQ' => 'INQ', + // @Tapatalk is a mobile app; http://support.tapatalk.com/threads/smf-2-0-2-os-and-browser-detection-plugin-and-tapatalk.15565/#post-79039 + 'GenericPhone' => 'Tapatalk|PDA;|SAGEM|\bmmp\b|pocket|\bpsp\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\bwap\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser', + ); + + /** + * List of tablet devices. + * + * @var array + */ + protected static $tabletDevices = array( + // @todo: check for mobile friendly emails topic. + 'iPad' => 'iPad|iPad.*Mobile', + // Removed |^.*Android.*Nexus(?!(?:Mobile).)*$ + // @see #442 + 'NexusTablet' => 'Android.*Nexus[\s]+(7|9|10)', + 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-T116BU|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713|SM-T719|SM-T813|SM-T819|SM-T580|SM-T355Y|SM-T280|SM-T817A|SM-T820|SM-W700|SM-P580|SM-T587|SM-P350|SM-P555M|SM-P355M|SM-T113NU|SM-T815Y', // SCH-P709|SCH-P729|SM-T2558|GT-I9205 - Samsung Mega - treat them like a regular phone. + // http://docs.aws.amazon.com/silk/latest/developerguide/user-agent.html + 'Kindle' => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI|KFFOWI|KFGIWI|KFMEWI)\b|Android.*Silk/[0-9.]+ like Chrome/[0-9.]+ (?!Mobile)', + // Only the Surface tablets with Windows RT are considered mobile. + // http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx + 'SurfaceTablet' => 'Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)', + // http://shopping1.hp.com/is-bin/INTERSHOP.enfinity/WFS/WW-USSMBPublicStore-Site/en_US/-/USD/ViewStandardCatalog-Browse?CatalogCategoryID=JfIQ7EN5lqMAAAEyDcJUDwMT + 'HPTablet' => 'HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10', + // Watch out for PadFone, see #132. + // http://www.asus.com/de/Tablets_Mobile/Memo_Pad_Products/ + 'AsusTablet' => '^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\bK00F\b|\bK00C\b|\bK00E\b|\bK00L\b|TX201LA|ME176C|ME102A|\bM80TA\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\bME70C\b|ME581C|ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z|\bP027\b', + 'BlackBerryTablet' => 'PlayBook|RIM Tablet', + 'HTCtablet' => 'HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410', + 'MotorolaTablet' => 'xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617', + 'NookTablet' => 'Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2', + // http://www.acer.ro/ac/ro/RO/content/drivers + // http://www.packardbell.co.uk/pb/en/GB/content/download (Packard Bell is part of Acer) + // http://us.acer.com/ac/en/US/content/group/tablets + // http://www.acer.de/ac/de/DE/content/models/tablets/ + // Can conflict with Micromax and Motorola phones codes. + 'AcerTablet' => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\b|W3-810|\bA3-A10\b|\bA3-A11\b|\bA3-A20\b|\bA3-A30', + // http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/ + // http://us.toshiba.com/tablets/tablet-finder + // http://www.toshiba.co.jp/regza/tablet/ + 'ToshibaTablet' => 'Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO', + // http://www.nttdocomo.co.jp/english/service/developer/smart_phone/technical_info/spec/index.html + // http://www.lg.com/us/tablets + 'LGTablet' => '\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\b', + 'FujitsuTablet' => 'Android.*\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\b', + // Prestigio Tablets http://www.prestigio.com/support + 'PrestigioTablet' => 'PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002', + // http://support.lenovo.com/en_GB/downloads/default.page?# + 'LenovoTablet' => 'Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-850M|YT3-X90L|YT3-X90F|YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)', + // http://www.dell.com/support/home/us/en/04/Products/tab_mob/tablets + 'DellTablet' => 'Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7', + // http://www.yarvik.com/en/matrix/tablets/ + 'YarvikTablet' => 'Android.*\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\b', + 'MedionTablet' => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB', + 'ArnovaTablet' => '97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2', + // http://www.intenso.de/kategorie_en.php?kategorie=33 + // @todo: http://www.nbhkdz.com/read/b8e64202f92a2df129126bff.html - investigate + 'IntensoTablet' => 'INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004', + // IRU.ru Tablets http://www.iru.ru/catalog/soho/planetable/ + 'IRUTablet' => 'M702pro', + 'MegafonTablet' => 'MegaFon V9|\bZTE V9\b|Android.*\bMT7A\b', + // http://www.e-boda.ro/tablete-pc.html + 'EbodaTablet' => 'E-Boda (Supreme|Impresspeed|Izzycomm|Essential)', + // http://www.allview.ro/produse/droseries/lista-tablete-pc/ + 'AllViewTablet' => 'Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)', + // http://wiki.archosfans.com/index.php?title=Main_Page + // @note Rewrite the regex format after we add more UAs. + 'ArchosTablet' => '\b(101G9|80G9|A101IT)\b|Qilive 97R|Archos5|\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|c|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\b', + // http://www.ainol.com/plugin.php?identifier=ainol&module=product + 'AinolTablet' => 'NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark', + 'NokiaLumiaTablet' => 'Lumia 2520', + // @todo: inspect http://esupport.sony.com/US/p/select-system.pl?DIRECTOR=DRIVER + // Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser + // http://www.sony.jp/support/tablet/ + 'SonyTablet' => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP612|SOT31', + // http://www.support.philips.com/support/catalog/worldproducts.jsp?userLanguage=en&userCountry=cn&categoryid=3G_LTE_TABLET_SU_CN_CARE&title=3G%20tablets%20/%20LTE%20range&_dyncharset=UTF-8 + 'PhilipsTablet' => '\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\b', + // db + http://www.cube-tablet.com/buy-products.html + 'CubeTablet' => 'Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT', + // http://www.cobyusa.com/?p=pcat&pcat_id=3001 + 'CobyTablet' => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010', + // http://www.match.net.cn/products.asp + 'MIDTablet' => 'M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10', + // http://www.msi.com/support + // @todo Research the Windows Tablets. + 'MSITablet' => 'MSI \b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\b', + // @todo http://www.kyoceramobile.com/support/drivers/ + // 'KyoceraTablet' => null, + // @todo http://intexuae.com/index.php/category/mobile-devices/tablets-products/ + // 'IntextTablet' => null, + // http://pdadb.net/index.php?m=pdalist&list=SMiT (NoName Chinese Tablets) + // http://www.imp3.net/14/show.php?itemid=20454 + 'SMiTTablet' => 'Android.*(\bMID\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)', + // http://www.rock-chips.com/index.php?do=prod&pid=2 + 'RockChipTablet' => 'Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A', + // http://www.fly-phone.com/devices/tablets/ ; http://www.fly-phone.com/service/ + 'FlyTablet' => 'IQ310|Fly Vision', + // http://www.bqreaders.com/gb/tablets-prices-sale.html + 'bqTablet' => 'Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris [E|M]10)|Maxwell.*Lite|Maxwell.*Plus', + // http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290 + // http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets) + 'HuaweiTablet' => 'MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim', + // Nec or Medias Tab + 'NecTablet' => '\bN-06D|\bN-08D', + // Pantech Tablets: http://www.pantechusa.com/phones/ + 'PantechTablet' => 'Pantech.*P4100', + // Broncho Tablets: http://www.broncho.cn/ (hard to find) + 'BronchoTablet' => 'Broncho.*(N701|N708|N802|a710)', + // http://versusuk.com/support.html + 'VersusTablet' => 'TOUCHPAD.*[78910]|\bTOUCHTAB\b', + // http://www.zync.in/index.php/our-products/tablet-phablets + 'ZyncTablet' => 'z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900', + // http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/ + 'PositivoTablet' => 'TB07STA|TB10STA|TB07FTA|TB10FTA', + // https://www.nabitablet.com/ + 'NabiTablet' => 'Android.*\bNabi', + 'KoboTablet' => 'Kobo Touch|\bK080\b|\bVox\b Build|\bArc\b Build', + // French Danew Tablets http://www.danew.com/produits-tablette.php + 'DanewTablet' => 'DSlide.*\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\b', + // Texet Tablets and Readers http://www.texet.ru/tablet/ + 'TexetTablet' => 'NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE', + // Avoid detecting 'PLAYSTATION 3' as mobile. + 'PlaystationTablet' => 'Playstation.*(Portable|Vita)', + // http://www.trekstor.de/surftabs.html + 'TrekstorTablet' => 'ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab', + // http://www.pyleaudio.com/Products.aspx?%2fproducts%2fPersonal-Electronics%2fTablets + 'PyleAudioTablet' => '\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\b', + // http://www.advandigital.com/index.php?link=content-product&jns=JP001 + // because of the short codenames we have to include whitespaces to reduce the possible conflicts. + 'AdvanTablet' => 'Android.* \b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\b ', + // http://www.danytech.com/category/tablet-pc + 'DanyTechTablet' => 'Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1', + // http://www.galapad.net/product.html + 'GalapadTablet' => 'Android.*\bG1\b', + // http://www.micromaxinfo.com/tablet/funbook + 'MicromaxTablet' => 'Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b', + // http://www.karbonnmobiles.com/products_tablet.php + 'KarbonnTablet' => 'Android.*\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\b', + // http://www.myallfine.com/Products.asp + 'AllFineTablet' => 'Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide', + // http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr= + 'PROSCANTablet' => '\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\b', + // http://www.yonesnav.com/products/products.php + 'YONESTablet' => 'BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026', + // http://www.cjshowroom.com/eproducts.aspx?classcode=004001001 + // China manufacturer makes tablets for different small brands (eg. http://www.zeepad.net/index.html) + 'ChangJiaTablet' => 'TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503', + // http://www.gloryunion.cn/products.asp + // http://www.allwinnertech.com/en/apply/mobile.html + // http://www.ptcl.com.pk/pd_content.php?pd_id=284 (EVOTAB) + // @todo: Softwiner tablets? + // aka. Cute or Cool tablets. Not sure yet, must research to avoid collisions. + 'GUTablet' => 'TX-A1301|TX-M9002|Q702|kf026', // A12R|D75A|D77|D79|R83|A95|A106C|R15|A75|A76|D71|D72|R71|R73|R77|D82|R85|D92|A97|D92|R91|A10F|A77F|W71F|A78F|W78F|W81F|A97F|W91F|W97F|R16G|C72|C73E|K72|K73|R96G + // http://www.pointofview-online.com/showroom.php?shop_mode=product_listing&category_id=118 + 'PointOfViewTablet' => 'TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10', + // http://www.overmax.pl/pl/katalog-produktow,p8/tablety,c14/ + // @todo: add more tests. + 'OvermaxTablet' => 'OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)', + // http://hclmetablet.com/India/index.php + 'HCLTablet' => 'HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync', + // http://www.edigital.hu/Tablet_es_e-book_olvaso/Tablet-c18385.html + 'DPSTablet' => 'DPS Dream 9|DPS Dual 7', + // http://www.visture.com/index.asp + 'VistureTablet' => 'V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10', + // http://www.mijncresta.nl/tablet + 'CrestaTablet' => 'CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989', + // MediaTek - http://www.mediatek.com/_en/01_products/02_proSys.php?cata_sn=1&cata1_sn=1&cata2_sn=309 + 'MediatekTablet' => '\bMT8125|MT8389|MT8135|MT8377\b', + // Concorde tab + 'ConcordeTablet' => 'Concorde([ ]+)?Tab|ConCorde ReadMan', + // GoClever Tablets - http://www.goclever.com/uk/products,c1/tablet,c5/ + 'GoCleverTablet' => 'GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042', + // Modecom Tablets - http://www.modecom.eu/tablets/portal/ + 'ModecomTablet' => 'FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003', + // Vonino Tablets - http://www.vonino.eu/tablets + 'VoninoTablet' => '\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\bQ8\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\b', + // ECS Tablets - http://www.ecs.com.tw/ECSWebSite/Product/Product_Tablet_List.aspx?CategoryID=14&MenuID=107&childid=M_107&LanID=0 + 'ECSTablet' => 'V07OT2|TM105A|S10OT1|TR10CS1', + // Storex Tablets - http://storex.fr/espace_client/support.html + // @note: no need to add all the tablet codes since they are guided by the first regex. + 'StorexTablet' => 'eZee[_\']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab', + // Generic Vodafone tablets. + 'VodafoneTablet' => 'SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497', + // French tablets - Essentiel B http://www.boulanger.fr/tablette_tactile_e-book/tablette_tactile_essentiel_b/cl_68908.htm?multiChoiceToDelete=brand&mc_brand=essentielb + // Aka: http://www.essentielb.fr/ + 'EssentielBTablet' => 'Smart[ \']?TAB[ ]+?[0-9]+|Family[ \']?TAB2', + // Ross & Moor - http://ross-moor.ru/ + 'RossMoorTablet' => 'RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711', + // i-mobile http://product.i-mobilephone.com/Mobile_Device + 'iMobileTablet' => 'i-mobile i-note', + // http://www.tolino.de/de/vergleichen/ + 'TolinoTablet' => 'tolino tab [0-9.]+|tolino shine', + // AudioSonic - a Kmart brand + // http://www.kmart.com.au/webapp/wcs/stores/servlet/Search?langId=-1&storeId=10701&catalogId=10001&categoryId=193001&pageSize=72¤tPage=1&searchCategory=193001%2b4294965664&sortBy=p_MaxPrice%7c1 + 'AudioSonicTablet' => '\bC-22Q|T7-QC|T-17B|T-17P\b', + // AMPE Tablets - http://www.ampe.com.my/product-category/tablets/ + // @todo: add them gradually to avoid conflicts. + 'AMPETablet' => 'Android.* A78 ', + // Skk Mobile - http://skkmobile.com.ph/product_tablets.php + 'SkkTablet' => 'Android.* (SKYPAD|PHOENIX|CYCLOPS)', + // Tecno Mobile (only tablet) - http://www.tecno-mobile.com/index.php/product?filterby=smart&list_order=all&page=1 + 'TecnoTablet' => 'TECNO P9', + // JXD (consoles & tablets) - http://jxd.hk/products.asp?selectclassid=009008&clsid=3 + 'JXDTablet' => 'Android.* \b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\b', + // i-Joy tablets - http://www.i-joy.es/en/cat/products/tablets/ + 'iJoyTablet' => 'Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)', + // http://www.intracon.eu/tablet + 'FX2Tablet' => 'FX2 PAD7|FX2 PAD10', + // http://www.xoro.de/produkte/ + // @note: Might be the same brand with 'Simply tablets' + 'XoroTablet' => 'KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151', + // http://www1.viewsonic.com/products/computing/tablets/ + 'ViewsonicTablet' => 'ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a', + // http://www.odys.de/web/internet-tablet_en.html + 'OdysTablet' => 'LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\bXELIO\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10', + // http://www.captiva-power.de/products.html#tablets-en + 'CaptivaTablet' => 'CAPTIVA PAD', + // IconBIT - http://www.iconbit.com/products/tablets/ + 'IconbitTablet' => 'NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S', + // http://www.teclast.com/topic.php?channelID=70&topicID=140&pid=63 + 'TeclastTablet' => 'T98 4G|\bP80\b|\bX90HD\b|X98 Air|X98 Air 3G|\bX89\b|P80 3G|\bX80h\b|P98 Air|\bX89HD\b|P98 3G|\bP90HD\b|P89 3G|X98 3G|\bP70h\b|P79HD 3G|G18d 3G|\bP79HD\b|\bP89s\b|\bA88\b|\bP10HD\b|\bP19HD\b|G18 3G|\bP78HD\b|\bA78\b|\bP75\b|G17s 3G|G17h 3G|\bP85t\b|\bP90\b|\bP11\b|\bP98t\b|\bP98HD\b|\bG18d\b|\bP85s\b|\bP11HD\b|\bP88s\b|\bA80HD\b|\bA80se\b|\bA10h\b|\bP89\b|\bP78s\b|\bG18\b|\bP85\b|\bA70h\b|\bA70\b|\bG17\b|\bP18\b|\bA80s\b|\bA11s\b|\bP88HD\b|\bA80h\b|\bP76s\b|\bP76h\b|\bP98\b|\bA10HD\b|\bP78\b|\bP88\b|\bA11\b|\bA10t\b|\bP76a\b|\bP76t\b|\bP76e\b|\bP85HD\b|\bP85a\b|\bP86\b|\bP75HD\b|\bP76v\b|\bA12\b|\bP75a\b|\bA15\b|\bP76Ti\b|\bP81HD\b|\bA10\b|\bT760VE\b|\bT720HD\b|\bP76\b|\bP73\b|\bP71\b|\bP72\b|\bT720SE\b|\bC520Ti\b|\bT760\b|\bT720VE\b|T720-3GE|T720-WiFi', + // Onda - http://www.onda-tablet.com/buy-android-onda.html?dir=desc&limit=all&order=price + 'OndaTablet' => '\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\b[\s]+', + 'JaytechTablet' => 'TPC-PA762', + 'BlaupunktTablet' => 'Endeavour 800NG|Endeavour 1010', + // http://www.digma.ru/support/download/ + // @todo: Ebooks also (if requested) + 'DigmaTablet' => '\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\b', + // http://www.evolioshop.com/ro/tablete-pc.html + // http://www.evolio.ro/support/downloads_static.html?cat=2 + // @todo: Research some more + 'EvolioTablet' => 'ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\bEvotab\b|\bNeura\b', + // @todo http://www.lavamobiles.com/tablets-data-cards + 'LavaTablet' => 'QPAD E704|\bIvoryS\b|E-TAB IVORY|\bE-TAB\b', + // http://www.breezetablet.com/ + 'AocTablet' => 'MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712', + // http://www.mpmaneurope.com/en/products/internet-tablets-14/android-tablets-14/ + 'MpmanTablet' => 'MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\bMPG7\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010', + // https://www.celkonmobiles.com/?_a=categoryphones&sid=2 + 'CelkonTablet' => 'CT695|CT888|CT[\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\bCT-1\b', + // http://www.wolderelectronics.com/productos/manuales-y-guias-rapidas/categoria-2-miTab + 'WolderTablet' => 'miTab \b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\b', + // http://www.mi.com/en + 'MiTablet' => '\bMI PAD\b|\bHM NOTE 1W\b', + // http://www.nbru.cn/index.html + 'NibiruTablet' => 'Nibiru M1|Nibiru Jupiter One', + // http://navroad.com/products/produkty/tablety/ + // http://navroad.com/products/produkty/tablety/ + 'NexoTablet' => 'NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI', + // http://leader-online.com/new_site/product-category/tablets/ + // http://www.leader-online.net.au/List/Tablet + 'LeaderTablet' => 'TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100', + // http://www.datawind.com/ubislate/ + 'UbislateTablet' => 'UbiSlate[\s]?7C', + // http://www.pocketbook-int.com/ru/support + 'PocketBookTablet' => 'Pocketbook', + // http://www.kocaso.com/product_tablet.html + 'KocasoTablet' => '\b(TB-1207)\b', + // http://global.hisense.com/product/asia/tablet/Sero7/201412/t20141215_91832.htm + 'HisenseTablet' => '\b(F5281|E2371)\b', + // http://www.tesco.com/direct/hudl/ + 'Hudl' => 'Hudl HT7S3|Hudl 2', + // http://www.telstra.com.au/home-phone/thub-2/ + 'TelstraTablet' => 'T-Hub2', + 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|rk30sdk|\bEVOTAB\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\bM6pro\b|CT1020W|arc 10HD|\bTP750\b|\bQTAQZ3\b' + ); + + /** + * List of mobile Operating Systems. + * + * @var array + */ + protected static $operatingSystems = array( + 'AndroidOS' => 'Android', + 'BlackBerryOS' => 'blackberry|\bBB10\b|rim tablet os', + 'PalmOS' => 'PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino', + 'SymbianOS' => 'Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b', + // @reference: http://en.wikipedia.org/wiki/Windows_Mobile + 'WindowsMobileOS' => 'Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;', + // @reference: http://en.wikipedia.org/wiki/Windows_Phone + // http://wifeng.cn/?r=blog&a=view&id=106 + // http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx + // http://msdn.microsoft.com/library/ms537503.aspx + // https://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx + 'WindowsPhoneOS' => 'Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;', + 'iOS' => '\biPhone.*Mobile|\biPod|\biPad', + // http://en.wikipedia.org/wiki/MeeGo + // @todo: research MeeGo in UAs + 'MeeGoOS' => 'MeeGo', + // http://en.wikipedia.org/wiki/Maemo + // @todo: research Maemo in UAs + 'MaemoOS' => 'Maemo', + 'JavaOS' => 'J2ME/|\bMIDP\b|\bCLDC\b', // '|Java/' produces bug #135 + 'webOS' => 'webOS|hpwOS', + 'badaOS' => '\bBada\b', + 'BREWOS' => 'BREW', + ); + + /** + * List of mobile User Agents. + * + * IMPORTANT: This is a list of only mobile browsers. + * Mobile Detect 2.x supports only mobile browsers, + * it was never designed to detect all browsers. + * The change will come in 2017 in the 3.x release for PHP7. + * + * @var array + */ + protected static $browsers = array( + //'Vivaldi' => 'Vivaldi', + // @reference: https://developers.google.com/chrome/mobile/docs/user-agent + 'Chrome' => '\bCrMo\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?', + 'Dolfin' => '\bDolfin\b', + 'Opera' => 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+|Coast/[0-9.]+', + 'Skyfire' => 'Skyfire', + 'Edge' => 'Mobile Safari/[.0-9]* Edge', + 'IE' => 'IEMobile|MSIEMobile', // |Trident/[.0-9]+ + 'Firefox' => 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile|FxiOS', + 'Bolt' => 'bolt', + 'TeaShark' => 'teashark', + 'Blazer' => 'Blazer', + // @reference: http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/OptimizingforSafarioniPhone/OptimizingforSafarioniPhone.html#//apple_ref/doc/uid/TP40006517-SW3 + 'Safari' => 'Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari', + // http://en.wikipedia.org/wiki/Midori_(web_browser) + //'Midori' => 'midori', + //'Tizen' => 'Tizen', + 'UCBrowser' => 'UC.*Browser|UCWEB', + 'baiduboxapp' => 'baiduboxapp', + 'baidubrowser' => 'baidubrowser', + // https://github.com/serbanghita/Mobile-Detect/issues/7 + 'DiigoBrowser' => 'DiigoBrowser', + // http://www.puffinbrowser.com/index.php + 'Puffin' => 'Puffin', + // http://mercury-browser.com/index.html + 'Mercury' => '\bMercury\b', + // http://en.wikipedia.org/wiki/Obigo_Browser + 'ObigoBrowser' => 'Obigo', + // http://en.wikipedia.org/wiki/NetFront + 'NetFront' => 'NF-Browser', + // @reference: http://en.wikipedia.org/wiki/Minimo + // http://en.wikipedia.org/wiki/Vision_Mobile_Browser + 'GenericBrowser' => 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger', + // @reference: https://en.wikipedia.org/wiki/Pale_Moon_(web_browser) + 'PaleMoon' => 'Android.*PaleMoon|Mobile.*PaleMoon', + ); + + /** + * Utilities. + * + * @var array + */ + protected static $utilities = array( + // Experimental. When a mobile device wants to switch to 'Desktop Mode'. + // http://scottcate.com/technology/windows-phone-8-ie10-desktop-or-mobile/ + // https://github.com/serbanghita/Mobile-Detect/issues/57#issuecomment-15024011 + // https://developers.facebook.com/docs/sharing/best-practices + 'Bot' => 'Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|YandexMobileBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom', + 'MobileBot' => 'Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker/M1A1-R2D2', + 'DesktopMode' => 'WPDesktop', + 'TV' => 'SonyDTV|HbbTV', // experimental + 'WebKit' => '(webkit)[ /]([\w.]+)', + // @todo: Include JXD consoles. + 'Console' => '\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\b', + 'Watch' => 'SM-V700', + ); + + /** + * All possible HTTP headers that represent the + * User-Agent string. + * + * @var array + */ + protected static $uaHttpHeaders = array( + // The default User-Agent string. + 'HTTP_USER_AGENT', + // Header can occur on devices using Opera Mini. + 'HTTP_X_OPERAMINI_PHONE_UA', + // Vodafone specific header: http://www.seoprinciple.com/mobile-web-community-still-angry-at-vodafone/24/ + 'HTTP_X_DEVICE_USER_AGENT', + 'HTTP_X_ORIGINAL_USER_AGENT', + 'HTTP_X_SKYFIRE_PHONE', + 'HTTP_X_BOLT_PHONE_UA', + 'HTTP_DEVICE_STOCK_UA', + 'HTTP_X_UCBROWSER_DEVICE_UA' + ); + + /** + * The individual segments that could exist in a User-Agent string. VER refers to the regular + * expression defined in the constant self::VER. + * + * @var array + */ + protected static $properties = array( + + // Build + 'Mobile' => 'Mobile/[VER]', + 'Build' => 'Build/[VER]', + 'Version' => 'Version/[VER]', + 'VendorID' => 'VendorID/[VER]', + + // Devices + 'iPad' => 'iPad.*CPU[a-z ]+[VER]', + 'iPhone' => 'iPhone.*CPU[a-z ]+[VER]', + 'iPod' => 'iPod.*CPU[a-z ]+[VER]', + //'BlackBerry' => array('BlackBerry[VER]', 'BlackBerry [VER];'), + 'Kindle' => 'Kindle/[VER]', + + // Browser + 'Chrome' => array('Chrome/[VER]', 'CriOS/[VER]', 'CrMo/[VER]'), + 'Coast' => array('Coast/[VER]'), + 'Dolfin' => 'Dolfin/[VER]', + // @reference: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox + 'Firefox' => array('Firefox/[VER]', 'FxiOS/[VER]'), + 'Fennec' => 'Fennec/[VER]', + // http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx + // https://msdn.microsoft.com/en-us/library/ie/hh869301(v=vs.85).aspx + 'Edge' => 'Edge/[VER]', + 'IE' => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];', 'Trident/[0-9.]+;.*rv:[VER]'), + // http://en.wikipedia.org/wiki/NetFront + 'NetFront' => 'NetFront/[VER]', + 'NokiaBrowser' => 'NokiaBrowser/[VER]', + 'Opera' => array( ' OPR/[VER]', 'Opera Mini/[VER]', 'Version/[VER]' ), + 'Opera Mini' => 'Opera Mini/[VER]', + 'Opera Mobi' => 'Version/[VER]', + 'UC Browser' => 'UC Browser[VER]', + 'MQQBrowser' => 'MQQBrowser/[VER]', + 'MicroMessenger' => 'MicroMessenger/[VER]', + 'baiduboxapp' => 'baiduboxapp/[VER]', + 'baidubrowser' => 'baidubrowser/[VER]', + 'SamsungBrowser' => 'SamsungBrowser/[VER]', + 'Iron' => 'Iron/[VER]', + // @note: Safari 7534.48.3 is actually Version 5.1. + // @note: On BlackBerry the Version is overwriten by the OS. + 'Safari' => array( 'Version/[VER]', 'Safari/[VER]' ), + 'Skyfire' => 'Skyfire/[VER]', + 'Tizen' => 'Tizen/[VER]', + 'Webkit' => 'webkit[ /][VER]', + 'PaleMoon' => 'PaleMoon/[VER]', + + // Engine + 'Gecko' => 'Gecko/[VER]', + 'Trident' => 'Trident/[VER]', + 'Presto' => 'Presto/[VER]', + 'Goanna' => 'Goanna/[VER]', + + // OS + 'iOS' => ' \bi?OS\b [VER][ ;]{1}', + 'Android' => 'Android [VER]', + 'BlackBerry' => array('BlackBerry[\w]+/[VER]', 'BlackBerry.*Version/[VER]', 'Version/[VER]'), + 'BREW' => 'BREW [VER]', + 'Java' => 'Java/[VER]', + // @reference: http://windowsteamblog.com/windows_phone/b/wpdev/archive/2011/08/29/introducing-the-ie9-on-windows-phone-mango-user-agent-string.aspx + // @reference: http://en.wikipedia.org/wiki/Windows_NT#Releases + 'Windows Phone OS' => array( 'Windows Phone OS [VER]', 'Windows Phone [VER]'), + 'Windows Phone' => 'Windows Phone [VER]', + 'Windows CE' => 'Windows CE/[VER]', + // http://social.msdn.microsoft.com/Forums/en-US/windowsdeveloperpreviewgeneral/thread/6be392da-4d2f-41b4-8354-8dcee20c85cd + 'Windows NT' => 'Windows NT [VER]', + 'Symbian' => array('SymbianOS/[VER]', 'Symbian/[VER]'), + 'webOS' => array('webOS/[VER]', 'hpwOS/[VER];'), + ); + + /** + * Construct an instance of this class. + * + * @param array $headers Specify the headers as injection. Should be PHP _SERVER flavored. + * If left empty, will use the global _SERVER['HTTP_*'] vars instead. + * @param string $userAgent Inject the User-Agent header. If null, will use HTTP_USER_AGENT + * from the $headers array instead. + */ + public function __construct( + array $headers = null, + $userAgent = null + ) { + $this->setHttpHeaders($headers); + $this->setUserAgent($userAgent); + } + + /** + * Get the current script version. + * This is useful for the demo.php file, + * so people can check on what version they are testing + * for mobile devices. + * + * @return string The version number in semantic version format. + */ + public static function getScriptVersion() + { + return self::VERSION; + } + + /** + * Set the HTTP Headers. Must be PHP-flavored. This method will reset existing headers. + * + * @param array $httpHeaders The headers to set. If null, then using PHP's _SERVER to extract + * the headers. The default null is left for backwards compatibility. + */ + public function setHttpHeaders($httpHeaders = null) + { + // use global _SERVER if $httpHeaders aren't defined + if (!is_array($httpHeaders) || !count($httpHeaders)) { + $httpHeaders = $_SERVER; + } + + // clear existing headers + $this->httpHeaders = array(); + + // Only save HTTP headers. In PHP land, that means only _SERVER vars that + // start with HTTP_. + foreach ($httpHeaders as $key => $value) { + if (substr($key, 0, 5) === 'HTTP_') { + $this->httpHeaders[$key] = $value; + } + } + + // In case we're dealing with CloudFront, we need to know. + $this->setCfHeaders($httpHeaders); + } + + /** + * Retrieves the HTTP headers. + * + * @return array + */ + public function getHttpHeaders() + { + return $this->httpHeaders; + } + + /** + * Retrieves a particular header. If it doesn't exist, no exception/error is caused. + * Simply null is returned. + * + * @param string $header The name of the header to retrieve. Can be HTTP compliant such as + * "User-Agent" or "X-Device-User-Agent" or can be php-esque with the + * all-caps, HTTP_ prefixed, underscore seperated awesomeness. + * + * @return string|null The value of the header. + */ + public function getHttpHeader($header) + { + // are we using PHP-flavored headers? + if (strpos($header, '_') === false) { + $header = str_replace('-', '_', $header); + $header = strtoupper($header); + } + + // test the alternate, too + $altHeader = 'HTTP_' . $header; + + //Test both the regular and the HTTP_ prefix + if (isset($this->httpHeaders[$header])) { + return $this->httpHeaders[$header]; + } elseif (isset($this->httpHeaders[$altHeader])) { + return $this->httpHeaders[$altHeader]; + } + + return null; + } + + public function getMobileHeaders() + { + return self::$mobileHeaders; + } + + /** + * Get all possible HTTP headers that + * can contain the User-Agent string. + * + * @return array List of HTTP headers. + */ + public function getUaHttpHeaders() + { + return self::$uaHttpHeaders; + } + + + /** + * Set CloudFront headers + * http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html#header-caching-web-device + * + * @param array $cfHeaders List of HTTP headers + * + * @return boolean If there were CloudFront headers to be set + */ + public function setCfHeaders($cfHeaders = null) { + // use global _SERVER if $cfHeaders aren't defined + if (!is_array($cfHeaders) || !count($cfHeaders)) { + $cfHeaders = $_SERVER; + } + + // clear existing headers + $this->cloudfrontHeaders = array(); + + // Only save CLOUDFRONT headers. In PHP land, that means only _SERVER vars that + // start with cloudfront-. + $response = false; + foreach ($cfHeaders as $key => $value) { + if (substr(strtolower($key), 0, 16) === 'http_cloudfront_') { + $this->cloudfrontHeaders[strtoupper($key)] = $value; + $response = true; + } + } + + return $response; + } + + /** + * Retrieves the cloudfront headers. + * + * @return array + */ + public function getCfHeaders() + { + return $this->cloudfrontHeaders; + } + + /** + * Set the User-Agent to be used. + * + * @param string $userAgent The user agent string to set. + * + * @return string|null + */ + public function setUserAgent($userAgent = null) + { + // Invalidate cache due to #375 + $this->cache = array(); + + if (false === empty($userAgent)) { + return $this->userAgent = $userAgent; + } else { + $this->userAgent = null; + foreach ($this->getUaHttpHeaders() as $altHeader) { + if (false === empty($this->httpHeaders[$altHeader])) { // @todo: should use getHttpHeader(), but it would be slow. (Serban) + $this->userAgent .= $this->httpHeaders[$altHeader] . " "; + } + } + + if (!empty($this->userAgent)) { + return $this->userAgent = trim($this->userAgent); + } + } + + if (count($this->getCfHeaders()) > 0) { + return $this->userAgent = 'Amazon CloudFront'; + } + return $this->userAgent = null; + } + + /** + * Retrieve the User-Agent. + * + * @return string|null The user agent if it's set. + */ + public function getUserAgent() + { + return $this->userAgent; + } + + /** + * Set the detection type. Must be one of self::DETECTION_TYPE_MOBILE or + * self::DETECTION_TYPE_EXTENDED. Otherwise, nothing is set. + * + * @deprecated since version 2.6.9 + * + * @param string $type The type. Must be a self::DETECTION_TYPE_* constant. The default + * parameter is null which will default to self::DETECTION_TYPE_MOBILE. + */ + public function setDetectionType($type = null) + { + if ($type === null) { + $type = self::DETECTION_TYPE_MOBILE; + } + + if ($type !== self::DETECTION_TYPE_MOBILE && $type !== self::DETECTION_TYPE_EXTENDED) { + return; + } + + $this->detectionType = $type; + } + + public function getMatchingRegex() + { + return $this->matchingRegex; + } + + public function getMatchesArray() + { + return $this->matchesArray; + } + + /** + * Retrieve the list of known phone devices. + * + * @return array List of phone devices. + */ + public static function getPhoneDevices() + { + return self::$phoneDevices; + } + + /** + * Retrieve the list of known tablet devices. + * + * @return array List of tablet devices. + */ + public static function getTabletDevices() + { + return self::$tabletDevices; + } + + /** + * Alias for getBrowsers() method. + * + * @return array List of user agents. + */ + public static function getUserAgents() + { + return self::getBrowsers(); + } + + /** + * Retrieve the list of known browsers. Specifically, the user agents. + * + * @return array List of browsers / user agents. + */ + public static function getBrowsers() + { + return self::$browsers; + } + + /** + * Retrieve the list of known utilities. + * + * @return array List of utilities. + */ + public static function getUtilities() + { + return self::$utilities; + } + + /** + * Method gets the mobile detection rules. This method is used for the magic methods $detect->is*(). + * + * @deprecated since version 2.6.9 + * + * @return array All the rules (but not extended). + */ + public static function getMobileDetectionRules() + { + static $rules; + + if (!$rules) { + $rules = array_merge( + self::$phoneDevices, + self::$tabletDevices, + self::$operatingSystems, + self::$browsers + ); + } + + return $rules; + + } + + /** + * Method gets the mobile detection rules + utilities. + * The reason this is separate is because utilities rules + * don't necessary imply mobile. This method is used inside + * the new $detect->is('stuff') method. + * + * @deprecated since version 2.6.9 + * + * @return array All the rules + extended. + */ + public function getMobileDetectionRulesExtended() + { + static $rules; + + if (!$rules) { + // Merge all rules together. + $rules = array_merge( + self::$phoneDevices, + self::$tabletDevices, + self::$operatingSystems, + self::$browsers, + self::$utilities + ); + } + + return $rules; + } + + /** + * Retrieve the current set of rules. + * + * @deprecated since version 2.6.9 + * + * @return array + */ + public function getRules() + { + if ($this->detectionType == self::DETECTION_TYPE_EXTENDED) { + return self::getMobileDetectionRulesExtended(); + } else { + return self::getMobileDetectionRules(); + } + } + + /** + * Retrieve the list of mobile operating systems. + * + * @return array The list of mobile operating systems. + */ + public static function getOperatingSystems() + { + return self::$operatingSystems; + } + + /** + * Check the HTTP headers for signs of mobile. + * This is the fastest mobile check possible; it's used + * inside isMobile() method. + * + * @return bool + */ + public function checkHttpHeadersForMobile() + { + + foreach ($this->getMobileHeaders() as $mobileHeader => $matchType) { + if (isset($this->httpHeaders[$mobileHeader])) { + if (is_array($matchType['matches'])) { + foreach ($matchType['matches'] as $_match) { + if (strpos($this->httpHeaders[$mobileHeader], $_match) !== false) { + return true; + } + } + + return false; + } else { + return true; + } + } + } + + return false; + + } + + /** + * Magic overloading method. + * + * @method boolean is[...]() + * @param string $name + * @param array $arguments + * @return mixed + * @throws BadMethodCallException when the method doesn't exist and doesn't start with 'is' + */ + public function __call($name, $arguments) + { + // make sure the name starts with 'is', otherwise + if (substr($name, 0, 2) !== 'is') { + throw new BadMethodCallException("No such method exists: $name"); + } + + $this->setDetectionType(self::DETECTION_TYPE_MOBILE); + + $key = substr($name, 2); + + return $this->matchUAAgainstKey($key); + } + + /** + * Find a detection rule that matches the current User-agent. + * + * @param null $userAgent deprecated + * @return boolean + */ + protected function matchDetectionRulesAgainstUA($userAgent = null) + { + // Begin general search. + foreach ($this->getRules() as $_regex) { + if (empty($_regex)) { + continue; + } + + if ($this->match($_regex, $userAgent)) { + return true; + } + } + + return false; + } + + /** + * Search for a certain key in the rules array. + * If the key is found then try to match the corresponding + * regex against the User-Agent. + * + * @param string $key + * + * @return boolean + */ + protected function matchUAAgainstKey($key) + { + // Make the keys lowercase so we can match: isIphone(), isiPhone(), isiphone(), etc. + $key = strtolower($key); + if (false === isset($this->cache[$key])) { + + // change the keys to lower case + $_rules = array_change_key_case($this->getRules()); + + if (false === empty($_rules[$key])) { + $this->cache[$key] = $this->match($_rules[$key]); + } + + if (false === isset($this->cache[$key])) { + $this->cache[$key] = false; + } + } + + return $this->cache[$key]; + } + + /** + * Check if the device is mobile. + * Returns true if any type of mobile device detected, including special ones + * @param null $userAgent deprecated + * @param null $httpHeaders deprecated + * @return bool + */ + public function isMobile($userAgent = null, $httpHeaders = null) + { + + if ($httpHeaders) { + $this->setHttpHeaders($httpHeaders); + } + + if ($userAgent) { + $this->setUserAgent($userAgent); + } + + // Check specifically for cloudfront headers if the useragent === 'Amazon CloudFront' + if ($this->getUserAgent() === 'Amazon CloudFront') { + $cfHeaders = $this->getCfHeaders(); + if(array_key_exists('HTTP_CLOUDFRONT_IS_MOBILE_VIEWER', $cfHeaders) && $cfHeaders['HTTP_CLOUDFRONT_IS_MOBILE_VIEWER'] === 'true') { + return true; + } + } + + $this->setDetectionType(self::DETECTION_TYPE_MOBILE); + + if ($this->checkHttpHeadersForMobile()) { + return true; + } else { + return $this->matchDetectionRulesAgainstUA(); + } + + } + + /** + * Check if the device is a tablet. + * Return true if any type of tablet device is detected. + * + * @param string $userAgent deprecated + * @param array $httpHeaders deprecated + * @return bool + */ + public function isTablet($userAgent = null, $httpHeaders = null) + { + // Check specifically for cloudfront headers if the useragent === 'Amazon CloudFront' + if ($this->getUserAgent() === 'Amazon CloudFront') { + $cfHeaders = $this->getCfHeaders(); + if(array_key_exists('HTTP_CLOUDFRONT_IS_TABLET_VIEWER', $cfHeaders) && $cfHeaders['HTTP_CLOUDFRONT_IS_TABLET_VIEWER'] === 'true') { + return true; + } + } + + $this->setDetectionType(self::DETECTION_TYPE_MOBILE); + + foreach (self::$tabletDevices as $_regex) { + if ($this->match($_regex, $userAgent)) { + return true; + } + } + + return false; + } + + /** + * This method checks for a certain property in the + * userAgent. + * @todo: The httpHeaders part is not yet used. + * + * @param string $key + * @param string $userAgent deprecated + * @param string $httpHeaders deprecated + * @return bool|int|null + */ + public function is($key, $userAgent = null, $httpHeaders = null) + { + // Set the UA and HTTP headers only if needed (eg. batch mode). + if ($httpHeaders) { + $this->setHttpHeaders($httpHeaders); + } + + if ($userAgent) { + $this->setUserAgent($userAgent); + } + + $this->setDetectionType(self::DETECTION_TYPE_EXTENDED); + + return $this->matchUAAgainstKey($key); + } + + /** + * Some detection rules are relative (not standard), + * because of the diversity of devices, vendors and + * their conventions in representing the User-Agent or + * the HTTP headers. + * + * This method will be used to check custom regexes against + * the User-Agent string. + * + * @param $regex + * @param string $userAgent + * @return bool + * + * @todo: search in the HTTP headers too. + */ + public function match($regex, $userAgent = null) + { + $match = (bool) preg_match(sprintf('#%s#is', $regex), (false === empty($userAgent) ? $userAgent : $this->userAgent), $matches); + // If positive match is found, store the results for debug. + if ($match) { + $this->matchingRegex = $regex; + $this->matchesArray = $matches; + } + + return $match; + } + + /** + * Get the properties array. + * + * @return array + */ + public static function getProperties() + { + return self::$properties; + } + + /** + * Prepare the version number. + * + * @todo Remove the error supression from str_replace() call. + * + * @param string $ver The string version, like "2.6.21.2152"; + * + * @return float + */ + public function prepareVersionNo($ver) + { + $ver = str_replace(array('_', ' ', '/'), '.', $ver); + $arrVer = explode('.', $ver, 2); + + if (isset($arrVer[1])) { + $arrVer[1] = @str_replace('.', '', $arrVer[1]); // @todo: treat strings versions. + } + + return (float) implode('.', $arrVer); + } + + /** + * Check the version of the given property in the User-Agent. + * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31) + * + * @param string $propertyName The name of the property. See self::getProperties() array + * keys for all possible properties. + * @param string $type Either self::VERSION_TYPE_STRING to get a string value or + * self::VERSION_TYPE_FLOAT indicating a float value. This parameter + * is optional and defaults to self::VERSION_TYPE_STRING. Passing an + * invalid parameter will default to the this type as well. + * + * @return string|float The version of the property we are trying to extract. + */ + public function version($propertyName, $type = self::VERSION_TYPE_STRING) + { + if (empty($propertyName)) { + return false; + } + + // set the $type to the default if we don't recognize the type + if ($type !== self::VERSION_TYPE_STRING && $type !== self::VERSION_TYPE_FLOAT) { + $type = self::VERSION_TYPE_STRING; + } + + $properties = self::getProperties(); + + // Check if the property exists in the properties array. + if (true === isset($properties[$propertyName])) { + + // Prepare the pattern to be matched. + // Make sure we always deal with an array (string is converted). + $properties[$propertyName] = (array) $properties[$propertyName]; + + foreach ($properties[$propertyName] as $propertyMatchString) { + + $propertyPattern = str_replace('[VER]', self::VER, $propertyMatchString); + + // Identify and extract the version. + preg_match(sprintf('#%s#is', $propertyPattern), $this->userAgent, $match); + + if (false === empty($match[1])) { + $version = ($type == self::VERSION_TYPE_FLOAT ? $this->prepareVersionNo($match[1]) : $match[1]); + + return $version; + } + + } + + } + + return false; + } + + /** + * Retrieve the mobile grading, using self::MOBILE_GRADE_* constants. + * + * @return string One of the self::MOBILE_GRADE_* constants. + */ + public function mobileGrade() + { + $isMobile = $this->isMobile(); + + if ( + // Apple iOS 4-7.0 – Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3 / 5.1 / 6.1), iPad 3 (5.1 / 6.0), iPad Mini (6.1), iPad Retina (7.0), iPhone 3GS (4.3), iPhone 4 (4.3 / 5.1), iPhone 4S (5.1 / 6.0), iPhone 5 (6.0), and iPhone 5S (7.0) + $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT) >= 4.3 || + $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT) >= 4.3 || + $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT) >= 4.3 || + + // Android 2.1-2.3 - Tested on the HTC Incredible (2.2), original Droid (2.2), HTC Aria (2.1), Google Nexus S (2.3). Functional on 1.5 & 1.6 but performance may be sluggish, tested on Google G1 (1.5) + // Android 3.1 (Honeycomb) - Tested on the Samsung Galaxy Tab 10.1 and Motorola XOOM + // Android 4.0 (ICS) - Tested on a Galaxy Nexus. Note: transition performance can be poor on upgraded devices + // Android 4.1 (Jelly Bean) - Tested on a Galaxy Nexus and Galaxy 7 + ( $this->version('Android', self::VERSION_TYPE_FLOAT)>2.1 && $this->is('Webkit') ) || + + // Windows Phone 7.5-8 - Tested on the HTC Surround (7.5), HTC Trophy (7.5), LG-E900 (7.5), Nokia 800 (7.8), HTC Mazaa (7.8), Nokia Lumia 520 (8), Nokia Lumia 920 (8), HTC 8x (8) + $this->version('Windows Phone OS', self::VERSION_TYPE_FLOAT) >= 7.5 || + + // Tested on the Torch 9800 (6) and Style 9670 (6), BlackBerry® Torch 9810 (7), BlackBerry Z10 (10) + $this->is('BlackBerry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) >= 6.0 || + // Blackberry Playbook (1.0-2.0) - Tested on PlayBook + $this->match('Playbook.*Tablet') || + + // Palm WebOS (1.4-3.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0), HP TouchPad (3.0) + ( $this->version('webOS', self::VERSION_TYPE_FLOAT) >= 1.4 && $this->match('Palm|Pre|Pixi') ) || + // Palm WebOS 3.0 - Tested on HP TouchPad + $this->match('hp.*TouchPad') || + + // Firefox Mobile 18 - Tested on Android 2.3 and 4.1 devices + ( $this->is('Firefox') && $this->version('Firefox', self::VERSION_TYPE_FLOAT) >= 18 ) || + + // Chrome for Android - Tested on Android 4.0, 4.1 device + ( $this->is('Chrome') && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 4.0 ) || + + // Skyfire 4.1 - Tested on Android 2.3 device + ( $this->is('Skyfire') && $this->version('Skyfire', self::VERSION_TYPE_FLOAT) >= 4.1 && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 ) || + + // Opera Mobile 11.5-12: Tested on Android 2.3 + ( $this->is('Opera') && $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT) >= 11.5 && $this->is('AndroidOS') ) || + + // Meego 1.2 - Tested on Nokia 950 and N9 + $this->is('MeeGoOS') || + + // Tizen (pre-release) - Tested on early hardware + $this->is('Tizen') || + + // Samsung Bada 2.0 - Tested on a Samsung Wave 3, Dolphin browser + // @todo: more tests here! + $this->is('Dolfin') && $this->version('Bada', self::VERSION_TYPE_FLOAT) >= 2.0 || + + // UC Browser - Tested on Android 2.3 device + ( ($this->is('UC Browser') || $this->is('Dolfin')) && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 ) || + + // Kindle 3 and Fire - Tested on the built-in WebKit browser for each + ( $this->match('Kindle Fire') || + $this->is('Kindle') && $this->version('Kindle', self::VERSION_TYPE_FLOAT) >= 3.0 ) || + + // Nook Color 1.4.1 - Tested on original Nook Color, not Nook Tablet + $this->is('AndroidOS') && $this->is('NookTablet') || + + // Chrome Desktop 16-24 - Tested on OS X 10.7 and Windows 7 + $this->version('Chrome', self::VERSION_TYPE_FLOAT) >= 16 && !$isMobile || + + // Safari Desktop 5-6 - Tested on OS X 10.7 and Windows 7 + $this->version('Safari', self::VERSION_TYPE_FLOAT) >= 5.0 && !$isMobile || + + // Firefox Desktop 10-18 - Tested on OS X 10.7 and Windows 7 + $this->version('Firefox', self::VERSION_TYPE_FLOAT) >= 10.0 && !$isMobile || + + // Internet Explorer 7-9 - Tested on Windows XP, Vista and 7 + $this->version('IE', self::VERSION_TYPE_FLOAT) >= 7.0 && !$isMobile || + + // Opera Desktop 10-12 - Tested on OS X 10.7 and Windows 7 + $this->version('Opera', self::VERSION_TYPE_FLOAT) >= 10 && !$isMobile + ){ + return self::MOBILE_GRADE_A; + } + + if ( + $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT)<4.3 || + $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT)<4.3 || + $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT)<4.3 || + + // Blackberry 5.0: Tested on the Storm 2 9550, Bold 9770 + $this->is('Blackberry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) >= 5 && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<6 || + + //Opera Mini (5.0-6.5) - Tested on iOS 3.2/4.3 and Android 2.3 + ($this->version('Opera Mini', self::VERSION_TYPE_FLOAT) >= 5.0 && $this->version('Opera Mini', self::VERSION_TYPE_FLOAT) <= 7.0 && + ($this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 || $this->is('iOS')) ) || + + // Nokia Symbian^3 - Tested on Nokia N8 (Symbian^3), C7 (Symbian^3), also works on N97 (Symbian^1) + $this->match('NokiaN8|NokiaC7|N97.*Series60|Symbian/3') || + + // @todo: report this (tested on Nokia N71) + $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT) >= 11 && $this->is('SymbianOS') + ){ + return self::MOBILE_GRADE_B; + } + + if ( + // Blackberry 4.x - Tested on the Curve 8330 + $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) <= 5.0 || + // Windows Mobile - Tested on the HTC Leo (WinMo 5.2) + $this->match('MSIEMobile|Windows CE.*Mobile') || $this->version('Windows Mobile', self::VERSION_TYPE_FLOAT) <= 5.2 || + + // Tested on original iPhone (3.1), iPhone 3 (3.2) + $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT) <= 3.2 || + $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT) <= 3.2 || + $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT) <= 3.2 || + + // Internet Explorer 7 and older - Tested on Windows XP + $this->version('IE', self::VERSION_TYPE_FLOAT) <= 7.0 && !$isMobile + ){ + return self::MOBILE_GRADE_C; + } + + // All older smartphone platforms and featurephones - Any device that doesn't support media queries + // will receive the basic, C grade experience. + return self::MOBILE_GRADE_C; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/README.md b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/README.md new file mode 100755 index 00000000..c33d7014 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/README.md @@ -0,0 +1,283 @@ +![Mobile Detect](http://demo.mobiledetect.net/logo-github.png) + +> Motto: "Every business should have a mobile detection script to detect mobile readers." + +[![Build Status](https://travis-ci.org/serbanghita/Mobile-Detect.svg?branch=devel)](https://travis-ci.org/serbanghita/Mobile-Detect) +[![Latest Stable Version](https://poser.pugx.org/mobiledetect/mobiledetectlib/v/stable.svg)](https://packagist.org/packages/mobiledetect/mobiledetectlib) +[![Total Downloads](https://poser.pugx.org/mobiledetect/mobiledetectlib/downloads.svg)](https://packagist.org/packages/mobiledetect/mobiledetectlib) +[![Daily Downloads](https://poser.pugx.org/mobiledetect/mobiledetectlib/d/daily.png)](https://packagist.org/packages/mobiledetect/mobiledetectlib) +[![License](https://poser.pugx.org/mobiledetect/mobiledetectlib/license.svg)](https://packagist.org/packages/mobiledetect/mobiledetectlib) + +*Mobile_Detect is a lightweight PHP class for detecting mobile devices (including tablets). +It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.* + +We're committed to make Mobile_Detect the best open-source mobile detection resource and this is why before +each release we're running [unit tests](./tests), we also research and update the detection rules on **daily** +and **weekly** basis. + +Your website's _content strategy_ is important! You need a complete toolkit to deliver an experience that is _optimized_, _fast_ and _relevant_ to your users. Mobile_Detect class is a [server-side detection](http://www.w3.org/TR/mwabp/#bp-devcap-detection) tool that can help you with your RWD strategy, it is not a replacement for CSS3 media queries or other forms of client-side feature detection. + +##### Announcements + +For `2.x` branch we are no longer taking optimizations pull requests, but only new regexes and User-Agents for our tests. +On `2.x` releases we are focusing on **new tablets only**. All the pull requests about TVs, bots or optimizations will be closed and analyzed after `3.0.0-beta` is released. + +Still working on `3.0.0` branch to provide you with device detection! +We're really excited on this one! +We would like to speed this up, but life and family gets in the way ;) + +Special thanks to **JetBrains** for providing licenses for **PHPStorm**. In case you never heard or tried PHPStorm, you're +clearly missing out! [Check PHPStorm](https://www.jetbrains.com/phpstorm/) out! + +##### Download and demo + +|Download|Docs|Examples| +|-------------|-------------|-------------| +|[Go to releases](../../tags)|[Become a contributor](../../wiki/Become-a-contributor)|[Code examples](../../wiki/Code-examples) +|[Mobile_Detect.php](./Mobile_Detect.php)|[History](../../wiki/History)|[:iphone: Live demo!](http://is.gd/mobiletest) +|[Composer package](https://packagist.org/packages/mobiledetect/mobiledetectlib)| + +#### Continuous updates + +You can use [composer](https://getcomposer.org/doc/00-intro.md) in your release and update process to make sure you have the latest Mobile_Detect version. + +``` +composer require mobiledetect/mobiledetectlib +``` + +```json +{ + "require": { + "mobiledetect/mobiledetectlib": "^2.8" + } +} +``` + +##### Help + +|Pledgie|Paypal| +|-------|------| +|[Donate :+1:](https://pledgie.com/campaigns/21856)|[Donate :beer:](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=mobiledetectlib%40gmail%2ecom&lc=US&item_name=Mobile%20Detect¤cy_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted)| + + +I'm currently paying for hosting and spend a lot of my family time to maintain the project and planning the future releases. +I would highly appreciate any money donations that will keep the research going. + +Special thanks to the community :+1: for donations, [BrowserStack](https://www.browserstack.com/) - for providing access to their great platform, [Zend](http://www.zend.com/) - for donating licenses, [Dragos Gavrila](https://twitter.com/grafician) who contributed with the logo. + +##### 3rd party modules / [Submit new](../../issues/new?title=New%203rd%20party%20module&body=Name, Link and Description of the module.) + +:point_right: Keep `Mobile_Detect.php` class in a separate `module` and do NOT include it in your script core because of the high frequency of updates. +:point_right: When including the class into you `web application` or `module` always use `include_once '../path/to/Mobile_Detect.php` to prevent conflicts. + +**JavaScript** + +* mobile-detect.js - A [JavaScript port](https://github.com/hgoebl/mobile-detect.js) of Mobile-Detect class. Made by [Heinrich Goebl](https://github.com/hgoebl). + +**Varnish Cache** + +* [Varnish Mobile Detect](https://github.com/willemk/varnish-mobiletranslate) - Drop-in varnish solution to mobile user +detection based on the Mobile-Detect library. Made by [willemk](https://github.com/willemk). +* [mobiledetect2vcl](https://github.com/carlosabalde/mobiledetect2vcl) - Python script to transform the Mobile +Detect JSON database into an UA-based mobile detection VCL subroutine easily integrable in any Varnish Cache +configuration. Made by [Carlos Abalde](https://github.com/carlosabalde). + +**LUA** + +* [mobile-detect.lua](https://github.com/yourpalmark/mobile-detect.lua) is a port of Mobile-Detect to Lua for +NGINX HTTP servers. Follows closely to mobile-detect.js. Supports all methods that server-side +mobile-detect.js supports. Fully unit-tested and synced with Travis CI (Build Passing badge included). +Made by [Mark Walters](https://github.com/yourpalmark). + +**PHP** + +**WordPress** + +* [WordPress Mobile Detect](https://wordpress.org/plugins/wp-mobile-detect/) - Gives you the ability to wrap that +infographic in a `[notdevice][/notdevice]` shortcode so at the server level WordPress will +decide to show that content only if the user is NOT on a phone or tablet. +Made by [Jesse Friedman](https://profiles.wordpress.org/professor44/). + +* [mobble](https://wordpress.org/plugins/mobble/) - provides mobile related conditional functions for your site. +e.g. `is_iphone()`, `is_mobile()` and `is_tablet()`. Made by Scott Evans. + +* [WordPress Responsage](https://github.com/iamspacehead/responsage) - A small WordPress theme plugin that allows +you to make your images responsive. Made by [Adrian Ciaschetti](https://github.com/iamspacehead). + +* [WP247 Body Classes](https://wordpress.org/plugins/wp247-body-classes/) - Add unique classes to the `body` tag for +easy styling based on various attributes (archive, user, post, mobile) and various WordPress "is" functions. +Mobile attributes include type of device, Operating System, Browser, etc. Examples: .is-mobile, .is-not-mobile, +.is-tablet, .is-ios, .is-not-ios, .is-androidos, .is-chromebrowser. +Made by [wescleveland56](https://github.com/wescleveland56). + +**Drupal** + +* [Drupal Mobile Switch](https://www.drupal.org/project/mobile_switch) - The Mobile Switch Drupal module provides a +automatic theme switch functionality for mobile devices, detected by Browscap or Mobile Detect. +Made by [Siegfried Neumann](https://www.drupal.org/user/45267). + +* [Drupal Context Mobile Detect](https://www.drupal.org/project/context_mobile_detect) - This is a Drupal context module +which integrates Context and PHP Mobile Detect library. +Created by [Artem Shymko](https://www.drupal.org/user/432492). + +* [Drupal Mobile Detect](https://www.drupal.org/project/mobile_detect) - Lightweight mobile detect module for Drupal + created by [Matthew Donadio](https://www.drupal.org/user/325244). + +**Joomla** + +* [yagendoo Joomla! Mobile Detection Plugin](http://www.yagendoo.com/en/blog/free-mobile-detection-plugin-for-joomla.html) - Lightweight PHP plugin for Joomla! +that detects a mobile browser using the Mobile Detect class. +Made by yagendoo media. + +* [User Agent Detector plugin](https://github.com/renekreijveld/UserAgentDetector) - This system plugin detects the user +agent of your website visitor and sets a session variable accordingly. Based on the user agent, the plugin detects if the +site is running on a desktop pc, tablet or smartphone. It can also detect if the visitor is a spider bot (search engine). +Session variable that is set: `ualayout`. Possible values: desktop, tablet, mobile, bot. +Made by @ReneKreijveld. + +**Magento** + +* [Magento helper](http://www.magentocommerce.com/magento-connect/catalog/product/view/id/16835/) from Optimise Web enables +the use of all functions provided by Mobile Detect. Made by [Kathir Vel](http://www.kathirvel.com). + +* [Magento 2 Mobile Detect Theme Change](https://github.com/EaDesgin/magento2-mobiledetect) is an extension for Magento 2 +that will change the theme or redirect to a different URL. Also containing a helper to check for the device type. + +**PrestaShop** + +* [PrestaShop](https://www.prestashop.com) is a free, secure and open source shopping cart platform. Mobile_Detect +is included in the default package since 1.5.x. + +**Laravel** + +* [Agent](https://github.com/jenssegers/agent) is a user agent class for Laravel based on Mobile Detect with some +additional functionality. +Made by [Jens Segers](https://github.com/jenssegers). + +* [BrowserDetect](https://github.com/hisorange/browser-detect) is a browser and mobile detection package, collects +and wrap together the best user-agent identifiers for Laravel. +Created by [Varga Zsolt](https://github.com/hisorange). + +**Zend Framework** + +* [ZF2 Mobile-Detect](https://github.com/neilime/zf2-mobile-detect.git) is a Zend Framework 2 module that provides +Mobile-Detect features (Mobile_Detect class as a service, helper for views and plugin controllers). +Made by [neilime](https://github.com/neilime). + +* [ZF2 MobileDetectModule](https://github.com/nikolaposa/MobileDetectModule) facilitates integration of a PHP MobileDetect +class with some ZF2-based application. Has similar idea like the existing ZF2 Mobile-Detect module, +but differs in initialization and provision routine of the actual Mobile_Detect class. +Appropriate view helper and controller plugin also have different conceptions. +Made by [Nikola Posa](https://github.com/nikolaposa). + +**Symfony** + +* [Symfony2 Mobile Detect Bundle](https://github.com/suncat2000/MobileDetectBundle) is a bundle for detecting mobile devices, +manage mobile view and redirect to the mobile and tablet version. +Made by [Nikolay Ivlev](https://github.com/suncat2000). + +* [Silex Mobile Detect Service Provider](https://github.com/jbinfo/MobileDetectServiceProvider) is a service provider to +interact with Mobile detect class methods. +Made by [Lhassan Baazzi](https://github.com/jbinfo). + +**Slim Framework** + +* [Slim_Mobile_Detect](https://github.com/zguillez/slim_mobile_detect) implements Mobile_Detect lib for different +responses write on Slim Framework App. + +**ExpressionEngine** + +* [EE2 Detect Mobile](https://github.com/garethtdavies/detect-mobile) is a lightweight PHP plugin for EE2 that detects + a mobile browser using the Mobile Detect class. Made by [Gareth Davies](https://github.com/garethtdavies). + +**Yii Framework** + +* [Yii Extension](https://github.com/iamsalnikov/MobileDetect) - Mobile detect plugin for Yii framework. +Made by [Alexey Salnikov](https://github.com/iamsalnikov). + +* [Yii Extension](https://github.com/candasm/yii1-mobile-detect-component) - Mobile detect component for Yii framework +1.x version which supports composer package manager. Made by [Candas Minareci](https://github.com/candasm). + +* [Yii2 Device Detect](https://github.com/alexandernst/yii2-device-detect/) - Yii2 extension for Mobile-Detect library. +Made by [Alexander Nestorov](https://github.com/alexandernst). + +**CakePHP** + +* [CakePHP MobileDetect](https://github.com/chronon/CakePHP-MobileDetectComponent-Plugin) is a plugin component for +CakePHP 2.x. Made by [Gregory Gaskill](https://github.com/chronon). + +**FuelPHP** + +* [Special Agent](https://github.com/rob-bar/special_agent) is a FuelPHP package which uses php-mobile-detect to +determine whether a device is mobile or not. It overrides the Fuelphp Agent class its methods. +Made by [Robbie Bardjin](https://github.com/rob-bar). + + +**TYPO3** + +* [px_mobiledetect](https://typo3.org/extensions/repository/view/px_mobiledetect) is an extension that helps to detect +visitor's mobile device class (if that’s tablet or mobile device like smartphone). Made by Alexander Tretyak. + +**Other** + +* [PageCache](https://github.com/mmamedov/page-cache) is a lightweight PHP library for full page cache, +with built-in Mobile-Detect support. Made by [Muhammed Mamedov](https://github.com/mmamedov). + +* [Statamic CMS Mobile Detect](https://github.com/haikulab/statamic-mobile-detect) is a plugin. +Made by [Sergei Filippov](https://github.com/haikulab/statamic-mobile-detect) of Haiku Lab. + +* [Kohana Mobile Detect](https://github.com/madeinnordeste/kohana-mobile-detect) is an example of implementation of +Mobile_Detect class with Kohana framework. +Written by [Luiz Alberto S. Ribeiro](https://github.com/madeinnordeste). + +* [MemHT](https://www.memht.com) is a Free PHP CMS and Blog that permit the creation and the management online +of websites with few and easy steps. Has the class included in the core. + +* [concrete5](https://www.concrete5.org) is a CMS that is free and open source. The library is included in the core. + +* [engine7](https://github.com/QOXCorp/exengine) is PHP Open Source Framework. The Mobile_Detect class is included in +the engine. + +* [Zikula](http://zikula.org) is a free and open-source Content Management Framework, which allows you to run +impressive websites and build powerful online applications. The core uses Mobile-Detect to switch to a special +Mobile theme, using jQueryMobile. + +* [UserAgentInfo](https://github.com/quentin389/UserAgentInfo) is a PHP class for parsing user agent strings +(HTTP_USER_AGENT). Includes mobile checks, bot checks, browser types/versions and more. +Based on browscap, Mobile_Detect and ua-parser. Created for high traffic websites and fast batch processing. +Made by [quentin389](https://github.com/quentin389). + +* [LJ Mobile Detect](https://github.com/lewisjenkins/craft-lj-mobiledetect) is a simple implementation of Mobile Detect +for Craft CMS. Made by [Lewis Jenkins](https://github.com/lewisjenkins). + +* [Grav Plugin Mobile Detect](https://github.com/dimitrilongo/grav-plugin-mobile-detect/) is a simple implementation +of Mobile Detect for Grav CMS. Made by [Dimitri Longo](https://github.com/dimitrilongo). + + +**Perl** + + * [MobileDetect.pm](https://www.buzzerstar.com/development/) is a Perl module for Mobile Detect. + Made by [Sebastian Enger](https://devop.tools/). + +**Python** + +* [pymobiledetect](https://pypi.python.org/pypi/pymobiledetect) - Mobile detect python package. +Made by Bas van Oostveen. + +**Ruby** + +* [mobile_detect.rb](https://github.com/ktaragorn/mobile_detect) is a Ruby gem using the JSON data exposed by the +php project and implementing a basic subset of the API (as much as can be done by the exposed data). +Made by [Karthik T](https://github.com/ktaragorn). + +**Go** + +* [GoMobileDetect](https://github.com/Shaked/gomobiledetect) is a Go port of Mobile Detect class. +Made by [https://github.com/Shaked](Shaked). + + +**LUA** + +* [ua-lua](https://github.com/robinef/ua-lua) is a small lib written in LUA providing device type detection. +ua-lua is detecting mobile or tablet devices based on user-agent inside nginx daemon. +Made by [Frédéric Robinet](https://github.com/robinef). diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/composer.json b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/composer.json new file mode 100755 index 00000000..0131e493 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/composer.json @@ -0,0 +1,28 @@ +{ + "name": "mobiledetect/mobiledetectlib", + "type": "library", + "description": "Mobile_Detect is a lightweight PHP class for detecting mobile devices. It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.", + "keywords": ["mobile", "mobile detect", "mobile detector", "php mobile detect", "detect mobile devices"], + "homepage": "https://github.com/serbanghita/Mobile-Detect", + "license": "MIT", + "authors": [ + { + "name": "Serban Ghita", + "email": "serbanghita@gmail.com", + "homepage": "http://mobiledetect.net", + "role": "Developer" + } + ], + "require": { + "php": ">=5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "autoload": { + "classmap": ["Mobile_Detect.php"], + "psr-0": { + "Detection": "namespaced/" + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/namespaced/Detection/MobileDetect.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/namespaced/Detection/MobileDetect.php new file mode 100755 index 00000000..ca7efec2 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/namespaced/Detection/MobileDetect.php @@ -0,0 +1,22 @@ + + + The PSR-2 coding standard. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/Client.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/Client.php new file mode 100755 index 00000000..6fae0925 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/Client.php @@ -0,0 +1,513 @@ + + * @author Anis Berejeb + * @version 1.2-dev + */ +namespace OAuth2; + +class Client +{ + /** + * Different AUTH method + */ + const AUTH_TYPE_URI = 0; + const AUTH_TYPE_AUTHORIZATION_BASIC = 1; + const AUTH_TYPE_FORM = 2; + + /** + * Different Access token type + */ + const ACCESS_TOKEN_URI = 0; + const ACCESS_TOKEN_BEARER = 1; + const ACCESS_TOKEN_OAUTH = 2; + const ACCESS_TOKEN_MAC = 3; + + /** + * Different Grant types + */ + const GRANT_TYPE_AUTH_CODE = 'authorization_code'; + const GRANT_TYPE_PASSWORD = 'password'; + const GRANT_TYPE_CLIENT_CREDENTIALS = 'client_credentials'; + const GRANT_TYPE_REFRESH_TOKEN = 'refresh_token'; + + /** + * HTTP Methods + */ + const HTTP_METHOD_GET = 'GET'; + const HTTP_METHOD_POST = 'POST'; + const HTTP_METHOD_PUT = 'PUT'; + const HTTP_METHOD_DELETE = 'DELETE'; + const HTTP_METHOD_HEAD = 'HEAD'; + + /** + * HTTP Form content types + */ + const HTTP_FORM_CONTENT_TYPE_APPLICATION = 0; + const HTTP_FORM_CONTENT_TYPE_MULTIPART = 1; + + /** + * Client ID + * + * @var string + */ + protected $client_id = null; + + /** + * Client Secret + * + * @var string + */ + protected $client_secret = null; + + /** + * Client Authentication method + * + * @var int + */ + protected $client_auth = self::AUTH_TYPE_URI; + + /** + * Access Token + * + * @var string + */ + protected $access_token = null; + + /** + * Access Token Type + * + * @var int + */ + protected $access_token_type = self::ACCESS_TOKEN_URI; + + /** + * Access Token Secret + * + * @var string + */ + protected $access_token_secret = null; + + /** + * Access Token crypt algorithm + * + * @var string + */ + protected $access_token_algorithm = null; + + /** + * Access Token Parameter name + * + * @var string + */ + protected $access_token_param_name = 'access_token'; + + /** + * The path to the certificate file to use for https connections + * + * @var string Defaults to . + */ + protected $certificate_file = null; + + /** + * cURL options + * + * @var array + */ + protected $curl_options = array(); + + /** + * Construct + * + * @param string $client_id Client ID + * @param string $client_secret Client Secret + * @param int $client_auth (AUTH_TYPE_URI, AUTH_TYPE_AUTHORIZATION_BASIC, AUTH_TYPE_FORM) + * @param string $certificate_file Indicates if we want to use a certificate file to trust the server. Optional, defaults to null. + * @return void + */ + public function __construct($client_id, $client_secret, $client_auth = self::AUTH_TYPE_URI, $certificate_file = null) + { + if (!extension_loaded('curl')) { + throw new Exception('The PHP extension curl must be installed to use this library.', Exception::CURL_NOT_FOUND); + } + + $this->client_id = $client_id; + $this->client_secret = $client_secret; + $this->client_auth = $client_auth; + $this->certificate_file = $certificate_file; + if (!empty($this->certificate_file) && !is_file($this->certificate_file)) { + throw new InvalidArgumentException('The certificate file was not found', InvalidArgumentException::CERTIFICATE_NOT_FOUND); + } + } + + /** + * Get the client Id + * + * @return string Client ID + */ + public function getClientId() + { + return $this->client_id; + } + + /** + * Get the client Secret + * + * @return string Client Secret + */ + public function getClientSecret() + { + return $this->client_secret; + } + + /** + * getAuthenticationUrl + * + * @param string $auth_endpoint Url of the authentication endpoint + * @param string $redirect_uri Redirection URI + * @param array $extra_parameters Array of extra parameters like scope or state (Ex: array('scope' => null, 'state' => '')) + * @return string URL used for authentication + */ + public function getAuthenticationUrl($auth_endpoint, $redirect_uri, array $extra_parameters = array()) + { + $parameters = array_merge(array( + 'response_type' => 'code', + 'client_id' => $this->client_id, + 'redirect_uri' => $redirect_uri + ), $extra_parameters); + return $auth_endpoint . '?' . http_build_query($parameters, null, '&'); + } + + /** + * getAccessToken + * + * @param string $token_endpoint Url of the token endpoint + * @param int $grant_type Grant Type ('authorization_code', 'password', 'client_credentials', 'refresh_token', or a custom code (@see GrantType Classes) + * @param array $parameters Array sent to the server (depend on which grant type you're using) + * @return array Array of parameters required by the grant_type (CF SPEC) + */ + public function getAccessToken($token_endpoint, $grant_type, array $parameters) + { + if (!$grant_type) { + throw new InvalidArgumentException('The grant_type is mandatory.', InvalidArgumentException::INVALID_GRANT_TYPE); + } + $grantTypeClassName = $this->convertToCamelCase($grant_type); + $grantTypeClass = __NAMESPACE__ . '\\GrantType\\' . $grantTypeClassName; + if (!class_exists($grantTypeClass)) { + throw new InvalidArgumentException('Unknown grant type \'' . $grant_type . '\'', InvalidArgumentException::INVALID_GRANT_TYPE); + } + $grantTypeObject = new $grantTypeClass(); + $grantTypeObject->validateParameters($parameters); + if (!defined($grantTypeClass . '::GRANT_TYPE')) { + throw new Exception('Unknown constant GRANT_TYPE for class ' . $grantTypeClassName, Exception::GRANT_TYPE_ERROR); + } + $parameters['grant_type'] = $grantTypeClass::GRANT_TYPE; + $http_headers = array(); + switch ($this->client_auth) { + case self::AUTH_TYPE_URI: + case self::AUTH_TYPE_FORM: + $parameters['client_id'] = $this->client_id; + $parameters['client_secret'] = $this->client_secret; + break; + case self::AUTH_TYPE_AUTHORIZATION_BASIC: + $parameters['client_id'] = $this->client_id; + $http_headers['Authorization'] = 'Basic ' . base64_encode($this->client_id . ':' . $this->client_secret); + break; + default: + throw new Exception('Unknown client auth type.', Exception::INVALID_CLIENT_AUTHENTICATION_TYPE); + break; + } + + return $this->executeRequest($token_endpoint, $parameters, self::HTTP_METHOD_POST, $http_headers, self::HTTP_FORM_CONTENT_TYPE_APPLICATION); + } + + /** + * setToken + * + * @param string $token Set the access token + * @return void + */ + public function setAccessToken($token) + { + $this->access_token = $token; + } + + /** + * Set the client authentication type + * + * @param string $client_auth (AUTH_TYPE_URI, AUTH_TYPE_AUTHORIZATION_BASIC, AUTH_TYPE_FORM) + * @return void + */ + public function setClientAuthType($client_auth) + { + $this->client_auth = $client_auth; + } + + /** + * Set an option for the curl transfer + * + * @param int $option The CURLOPT_XXX option to set + * @param mixed $value The value to be set on option + * @return void + */ + public function setCurlOption($option, $value) + { + $this->curl_options[$option] = $value; + } + + /** + * Set multiple options for a cURL transfer + * + * @param array $options An array specifying which options to set and their values + * @return void + */ + public function setCurlOptions($options) + { + $this->curl_options = array_merge($this->curl_options, $options); + } + + /** + * Set the access token type + * + * @param int $type Access token type (ACCESS_TOKEN_BEARER, ACCESS_TOKEN_MAC, ACCESS_TOKEN_URI) + * @param string $secret The secret key used to encrypt the MAC header + * @param string $algorithm Algorithm used to encrypt the signature + * @return void + */ + public function setAccessTokenType($type, $secret = null, $algorithm = null) + { + $this->access_token_type = $type; + $this->access_token_secret = $secret; + $this->access_token_algorithm = $algorithm; + } + + /** + * Fetch a protected ressource + * + * @param string $protected_ressource_url Protected resource URL + * @param array $parameters Array of parameters + * @param string $http_method HTTP Method to use (POST, PUT, GET, HEAD, DELETE) + * @param array $http_headers HTTP headers + * @param int $form_content_type HTTP form content type to use + * @return array + */ + public function fetch($protected_resource_url, $parameters = array(), $http_method = self::HTTP_METHOD_GET, array $http_headers = array(), $form_content_type = self::HTTP_FORM_CONTENT_TYPE_MULTIPART) + { + if ($this->access_token) { + switch ($this->access_token_type) { + case self::ACCESS_TOKEN_URI: + if (is_array($parameters)) { + $parameters[$this->access_token_param_name] = $this->access_token; + } else { + throw new InvalidArgumentException( + 'You need to give parameters as array if you want to give the token within the URI.', + InvalidArgumentException::REQUIRE_PARAMS_AS_ARRAY + ); + } + break; + case self::ACCESS_TOKEN_BEARER: + $http_headers['Authorization'] = 'Bearer ' . $this->access_token; + break; + case self::ACCESS_TOKEN_OAUTH: + $http_headers['Authorization'] = 'OAuth ' . $this->access_token; + break; + case self::ACCESS_TOKEN_MAC: + $http_headers['Authorization'] = 'MAC ' . $this->generateMACSignature($protected_resource_url, $parameters, $http_method); + break; + default: + throw new Exception('Unknown access token type.', Exception::INVALID_ACCESS_TOKEN_TYPE); + break; + } + } + return $this->executeRequest($protected_resource_url, $parameters, $http_method, $http_headers, $form_content_type); + } + + /** + * Generate the MAC signature + * + * @param string $url Called URL + * @param array $parameters Parameters + * @param string $http_method Http Method + * @return string + */ + private function generateMACSignature($url, $parameters, $http_method) + { + $timestamp = time(); + $nonce = uniqid(); + $parsed_url = parse_url($url); + if (!isset($parsed_url['port'])) + { + $parsed_url['port'] = ($parsed_url['scheme'] == 'https') ? 443 : 80; + } + if ($http_method == self::HTTP_METHOD_GET) { + if (is_array($parameters)) { + $parsed_url['path'] .= '?' . http_build_query($parameters, null, '&'); + } elseif ($parameters) { + $parsed_url['path'] .= '?' . $parameters; + } + } + + $signature = base64_encode(hash_hmac($this->access_token_algorithm, + $timestamp . "\n" + . $nonce . "\n" + . $http_method . "\n" + . $parsed_url['path'] . "\n" + . $parsed_url['host'] . "\n" + . $parsed_url['port'] . "\n\n" + , $this->access_token_secret, true)); + + return 'id="' . $this->access_token . '", ts="' . $timestamp . '", nonce="' . $nonce . '", mac="' . $signature . '"'; + } + + /** + * Execute a request (with curl) + * + * @param string $url URL + * @param mixed $parameters Array of parameters + * @param string $http_method HTTP Method + * @param array $http_headers HTTP Headers + * @param int $form_content_type HTTP form content type to use + * @return array + */ + private function executeRequest($url, $parameters = array(), $http_method = self::HTTP_METHOD_GET, array $http_headers = null, $form_content_type = self::HTTP_FORM_CONTENT_TYPE_MULTIPART) + { + $curl_options = array( + CURLOPT_RETURNTRANSFER => true, + CURLOPT_SSL_VERIFYPEER => true, + CURLOPT_CUSTOMREQUEST => $http_method + ); + + switch($http_method) { + case self::HTTP_METHOD_POST: + $curl_options[CURLOPT_POST] = true; + /* No break */ + case self::HTTP_METHOD_PUT: + + /** + * Passing an array to CURLOPT_POSTFIELDS will encode the data as multipart/form-data, + * while passing a URL-encoded string will encode the data as application/x-www-form-urlencoded. + * http://php.net/manual/en/function.curl-setopt.php + */ + if(is_array($parameters) && self::HTTP_FORM_CONTENT_TYPE_APPLICATION === $form_content_type) { + $parameters = http_build_query($parameters, null, '&'); + } + $curl_options[CURLOPT_POSTFIELDS] = $parameters; + break; + case self::HTTP_METHOD_HEAD: + $curl_options[CURLOPT_NOBODY] = true; + /* No break */ + case self::HTTP_METHOD_DELETE: + case self::HTTP_METHOD_GET: + if (is_array($parameters)) { + $url .= '?' . http_build_query($parameters, null, '&'); + } elseif ($parameters) { + $url .= '?' . $parameters; + } + break; + default: + break; + } + + $curl_options[CURLOPT_URL] = $url; + + if (is_array($http_headers)) { + $header = array(); + foreach($http_headers as $key => $parsed_urlvalue) { + $header[] = "$key: $parsed_urlvalue"; + } + $curl_options[CURLOPT_HTTPHEADER] = $header; + } + + $ch = curl_init(); + curl_setopt_array($ch, $curl_options); + // https handling + if (!empty($this->certificate_file)) { + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); + curl_setopt($ch, CURLOPT_CAINFO, $this->certificate_file); + } else { + // bypass ssl verification + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); + } + if (!empty($this->curl_options)) { + curl_setopt_array($ch, $this->curl_options); + } + $result = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); + if ($curl_error = curl_error($ch)) { + throw new Exception($curl_error, Exception::CURL_ERROR); + } else { + $json_decode = json_decode($result, true); + } + curl_close($ch); + + return array( + 'result' => (null === $json_decode) ? $result : $json_decode, + 'code' => $http_code, + 'content_type' => $content_type + ); + } + + /** + * Set the name of the parameter that carry the access token + * + * @param string $name Token parameter name + * @return void + */ + public function setAccessTokenParamName($name) + { + $this->access_token_param_name = $name; + } + + /** + * Converts the class name to camel case + * + * @param mixed $grant_type the grant type + * @return string + */ + private function convertToCamelCase($grant_type) + { + $parts = explode('_', $grant_type); + array_walk($parts, function(&$item) { $item = ucfirst($item);}); + return implode('', $parts); + } +} + +class Exception extends \Exception +{ + const CURL_NOT_FOUND = 0x01; + const CURL_ERROR = 0x02; + const GRANT_TYPE_ERROR = 0x03; + const INVALID_CLIENT_AUTHENTICATION_TYPE = 0x04; + const INVALID_ACCESS_TOKEN_TYPE = 0x05; +} + +class InvalidArgumentException extends \InvalidArgumentException +{ + const INVALID_GRANT_TYPE = 0x01; + const CERTIFICATE_NOT_FOUND = 0x02; + const REQUIRE_PARAMS_AS_ARRAY = 0x03; + const MISSING_PARAMETER = 0x04; +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/GrantType/AuthorizationCode.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/GrantType/AuthorizationCode.php new file mode 100755 index 00000000..f3436e4c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/GrantType/AuthorizationCode.php @@ -0,0 +1,41 @@ +getAuthenticationUrl(AUTHORIZATION_ENDPOINT, REDIRECT_URI); + header('Location: ' . $auth_url); + die('Redirect'); +} +else +{ + $params = array('code' => $_GET['code'], 'redirect_uri' => REDIRECT_URI); + $response = $client->getAccessToken(TOKEN_ENDPOINT, 'authorization_code', $params); + parse_str($response['result'], $info); + $client->setAccessToken($info['access_token']); + $response = $client->fetch('https://graph.facebook.com/me'); + var_dump($response, $response['result']); +} + +How can I add a new Grant Type ? +================================ +Simply write a new class in the namespace OAuth2\GrantType. You can place the class file under GrantType. +Here is an example : + +namespace OAuth2\GrantType; + +/** + * MyCustomGrantType Grant Type + */ +class MyCustomGrantType implements IGrantType +{ + /** + * Defines the Grant Type + * + * @var string Defaults to 'my_custom_grant_type'. + */ + const GRANT_TYPE = 'my_custom_grant_type'; + + /** + * Adds a specific Handling of the parameters + * + * @return array of Specific parameters to be sent. + * @param mixed $parameters the parameters array (passed by reference) + */ + public function validateParameters(&$parameters) + { + if (!isset($parameters['first_mandatory_parameter'])) + { + throw new \Exception('The \'first_mandatory_parameter\' parameter must be defined for the Password grant type'); + } + elseif (!isset($parameters['second_mandatory_parameter'])) + { + throw new \Exception('The \'seconde_mandatory_parameter\' parameter must be defined for the Password grant type'); + } + } +} + +call the OAuth client getAccessToken with the grantType you defined in the GRANT_TYPE constant, As following : +$response = $client->getAccessToken(TOKEN_ENDPOINT, 'my_custom_grant_type', $params); + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPGangsta/GoogleAuthenticator.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPGangsta/GoogleAuthenticator.php new file mode 100755 index 00000000..5e70eed7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPGangsta/GoogleAuthenticator.php @@ -0,0 +1,201 @@ +_getBase32LookupTable(); + unset($validChars[32]); + + $secret = ''; + for ($i = 0; $i < $secretLength; $i++) { + $secret .= $validChars[array_rand($validChars)]; + } + return $secret; + } + + /** + * Calculate the code, with given secret and point in time + * + * @param string $secret + * @param int|null $timeSlice + * @return string + */ + public function getCode($secret, $timeSlice = null) + { + if ($timeSlice === null) { + $timeSlice = floor(time() / 30); + } + + $secretkey = $this->_base32Decode($secret); + + // Pack time into binary string + $time = chr(0).chr(0).chr(0).chr(0).pack('N*', $timeSlice); + // Hash it with users secret key + $hm = hash_hmac('SHA1', $time, $secretkey, true); + // Use last nipple of result as index/offset + $offset = ord(substr($hm, -1)) & 0x0F; + // grab 4 bytes of the result + $hashpart = substr($hm, $offset, 4); + + // Unpak binary value + $value = unpack('N', $hashpart); + $value = $value[1]; + // Only 32 bits + $value = $value & 0x7FFFFFFF; + + $modulo = pow(10, $this->_codeLength); + return str_pad($value % $modulo, $this->_codeLength, '0', STR_PAD_LEFT); + } + + /** + * Get QR-Code URL for image, from google charts + * + * @param string $name + * @param string $secret + * @return string + */ + public function getQRCodeGoogleUrl($name, $secret) { + $urlencoded = urlencode('otpauth://totp/'.$name.'?secret='.$secret.''); + return 'https://chart.googleapis.com/chart?chs=200x200&chld=M|0&cht=qr&chl='.$urlencoded.''; + } + + /** + * Check if the code is correct. This will accept codes starting from $discrepancy*30sec ago to $discrepancy*30sec from now + * + * @param string $secret + * @param string $code + * @param int $discrepancy This is the allowed time drift in 30 second units (8 means 4 minutes before or after) + * @return bool + */ + public function verifyCode($secret, $code, $discrepancy = 1) + { + $currentTimeSlice = floor(time() / 30); + + for ($i = -$discrepancy; $i <= $discrepancy; $i++) { + $calculatedCode = $this->getCode($secret, $currentTimeSlice + $i); + if ($calculatedCode == $code ) { + return true; + } + } + + return false; + } + + /** + * Set the code length, should be >=6 + * + * @param int $length + * @return PHPGangsta_GoogleAuthenticator + */ + public function setCodeLength($length) + { + $this->_codeLength = $length; + return $this; + } + + /** + * Helper class to decode base32 + * + * @param $secret + * @return bool|string + */ + protected function _base32Decode($secret) + { + if (empty($secret)) return ''; + + $base32chars = $this->_getBase32LookupTable(); + $base32charsFlipped = array_flip($base32chars); + + $paddingCharCount = substr_count($secret, $base32chars[32]); + $allowedValues = array(6, 4, 3, 1, 0); + if (!in_array($paddingCharCount, $allowedValues)) return false; + for ($i = 0; $i < 4; $i++){ + if ($paddingCharCount == $allowedValues[$i] && + substr($secret, -($allowedValues[$i])) != str_repeat($base32chars[32], $allowedValues[$i])) return false; + } + $secret = str_replace('=','', $secret); + $secret = str_split($secret); + $binaryString = ""; + for ($i = 0; $i < count($secret); $i = $i+8) { + $x = ""; + if (!in_array($secret[$i], $base32chars)) return false; + for ($j = 0; $j < 8; $j++) { + $x .= str_pad(base_convert(@$base32charsFlipped[@$secret[$i + $j]], 10, 2), 5, '0', STR_PAD_LEFT); + } + $eightBits = str_split($x, 8); + for ($z = 0; $z < count($eightBits); $z++) { + $binaryString .= ( ($y = chr(base_convert($eightBits[$z], 2, 10))) || ord($y) == 48 ) ? $y:""; + } + } + return $binaryString; + } + + /** + * Helper class to encode base32 + * + * @param string $secret + * @param bool $padding + * @return string + */ + protected function _base32Encode($secret, $padding = true) + { + if (empty($secret)) return ''; + + $base32chars = $this->_getBase32LookupTable(); + + $secret = str_split($secret); + $binaryString = ""; + for ($i = 0; $i < count($secret); $i++) { + $binaryString .= str_pad(base_convert(ord($secret[$i]), 10, 2), 8, '0', STR_PAD_LEFT); + } + $fiveBitBinaryArray = str_split($binaryString, 5); + $base32 = ""; + $i = 0; + while ($i < count($fiveBitBinaryArray)) { + $base32 .= $base32chars[base_convert(str_pad($fiveBitBinaryArray[$i], 5, '0'), 2, 10)]; + $i++; + } + if ($padding && ($x = strlen($binaryString) % 40) != 0) { + if ($x == 8) $base32 .= str_repeat($base32chars[32], 6); + elseif ($x == 16) $base32 .= str_repeat($base32chars[32], 4); + elseif ($x == 24) $base32 .= str_repeat($base32chars[32], 3); + elseif ($x == 32) $base32 .= $base32chars[32]; + } + return $base32; + } + + /** + * Get array with all 32 characters for decoding from/encoding to base32 + * + * @return array + */ + protected function _getBase32LookupTable() + { + return array( + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 7 + 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 15 + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 23 + 'Y', 'Z', '2', '3', '4', '5', '6', '7', // 31 + '=' // padding char + ); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/GD.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/GD.php new file mode 100755 index 00000000..53469eda --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/GD.php @@ -0,0 +1,1417 @@ + + * Copyright (c) 2009, Ian Selby/Gen X Design + * + * Author(s): Ian Selby + * + * Licensed under the MIT License + * Redistributions of files must retain the above copyright notice. + * + * @author Ian Selby + * @copyright Copyright (c) 2009 Gen X Design + * @link http://phpthumb.gxdlabs.com + * @license http://www.opensource.org/licenses/mit-license.php The MIT License + */ + +class GD extends PHPThumb +{ + /** + * The prior image (before manipulation) + * + * @var resource + */ + protected $oldImage; + + /** + * The working image (used during manipulation) + * + * @var resource + */ + protected $workingImage; + + /** + * The current dimensions of the image + * + * @var array + */ + protected $currentDimensions; + + /** + * The new, calculated dimensions of the image + * + * @var array + */ + protected $newDimensions; + + /** + * The options for this class + * + * This array contains various options that determine the behavior in + * various functions throughout the class. Functions note which specific + * option key / values are used in their documentation + * + * @var array + */ + protected $options; + + /** + * The maximum width an image can be after resizing (in pixels) + * + * @var int + */ + protected $maxWidth; + + /** + * The maximum height an image can be after resizing (in pixels) + * + * @var int + */ + protected $maxHeight; + + /** + * The percentage to resize the image by + * + * @var int + */ + protected $percent; + + /** + * @param string $fileName + * @param array $options + * @param array $plugins + */ + public function __construct($fileName, $options = array(), array $plugins = array()) + { + parent::__construct($fileName, $options, $plugins); + + $this->determineFormat(); + $this->verifyFormatCompatiblity(); + + switch ($this->format) { + case 'GIF': + $this->oldImage = @imagecreatefromgif($this->fileName); + break; + case 'JPG': + $this->oldImage = @imagecreatefromjpeg($this->fileName); + break; + case 'PNG': + $this->oldImage = @imagecreatefrompng($this->fileName); + break; + case 'STRING': + $this->oldImage = @imagecreatefromstring($this->fileName); + break; + } + + if (!is_resource($this->oldImage)) + { + throw new \Exception('Invalid image file'); + } + else + { + $this->currentDimensions = array ( + 'width' => imagesx($this->oldImage), + 'height' => imagesy($this->oldImage) + ); + } + } + + public function __destruct() + { + if (is_resource($this->oldImage)) { + imagedestroy($this->oldImage); + } + + if (is_resource($this->workingImage)) { + imagedestroy($this->workingImage); + } + } + + /** + * Pad an image to desired dimensions. Moves the image into the center and fills the rest with $color. + * @param $width + * @param $height + * @param array $color + * @return GD + */ + public function pad($width, $height, $color = array(255, 255, 255)) + { + // no resize - woohoo! + if ($width == $this->currentDimensions['width'] && $height == $this->currentDimensions['height']) { + return $this; + } + + // create the working image + if (function_exists('imagecreatetruecolor')) { + $this->workingImage = imagecreatetruecolor($width, $height); + } else { + $this->workingImage = imagecreate($width, $height); + } + + // create the fill color + $fillColor = imagecolorallocate( + $this->workingImage, + $color[0], + $color[1], + $color[2] + ); + + // fill our working image with the fill color + imagefill( + $this->workingImage, + 0, + 0, + $fillColor + ); + + // copy the image into the center of our working image + imagecopyresampled( + $this->workingImage, + $this->oldImage, + intval(($width-$this->currentDimensions['width']) / 2), + intval(($height-$this->currentDimensions['height']) / 2), + 0, + 0, + $this->currentDimensions['width'], + $this->currentDimensions['height'], + $this->currentDimensions['width'], + $this->currentDimensions['height'] + ); + + // update all the variables and resources to be correct + $this->oldImage = $this->workingImage; + $this->currentDimensions['width'] = $width; + $this->currentDimensions['height'] = $height; + + return $this; + } + + /** + * Resizes an image to be no larger than $maxWidth or $maxHeight + * + * If either param is set to zero, then that dimension will not be considered as a part of the resize. + * Additionally, if $this->options['resizeUp'] is set to true (false by default), then this function will + * also scale the image up to the maximum dimensions provided. + * + * @param int $maxWidth The maximum width of the image in pixels + * @param int $maxHeight The maximum height of the image in pixels + * @return \PHPThumb\GD + */ + public function resize($maxWidth = 0, $maxHeight = 0) + { + // make sure our arguments are valid + if (!is_numeric($maxWidth)) { + throw new \InvalidArgumentException('$maxWidth must be numeric'); + } + + if (!is_numeric($maxHeight)) { + throw new \InvalidArgumentException('$maxHeight must be numeric'); + } + + // make sure we're not exceeding our image size if we're not supposed to + if ($this->options['resizeUp'] === false) { + $this->maxHeight = (intval($maxHeight) > $this->currentDimensions['height']) ? $this->currentDimensions['height'] : $maxHeight; + $this->maxWidth = (intval($maxWidth) > $this->currentDimensions['width']) ? $this->currentDimensions['width'] : $maxWidth; + } else { + $this->maxHeight = intval($maxHeight); + $this->maxWidth = intval($maxWidth); + } + + // get the new dimensions... + $this->calcImageSize($this->currentDimensions['width'], $this->currentDimensions['height']); + + // create the working image + if (function_exists('imagecreatetruecolor')) { + $this->workingImage = imagecreatetruecolor($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); + } else { + $this->workingImage = imagecreate($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); + } + + $this->preserveAlpha(); + + // and create the newly sized image + imagecopyresampled( + $this->workingImage, + $this->oldImage, + 0, + 0, + 0, + 0, + $this->newDimensions['newWidth'], + $this->newDimensions['newHeight'], + $this->currentDimensions['width'], + $this->currentDimensions['height'] + ); + + // update all the variables and resources to be correct + $this->oldImage = $this->workingImage; + $this->currentDimensions['width'] = $this->newDimensions['newWidth']; + $this->currentDimensions['height'] = $this->newDimensions['newHeight']; + + return $this; + } + + /** + * Adaptively Resizes the Image + * + * This function attempts to get the image to as close to the provided dimensions as possible, and then crops the + * remaining overflow (from the center) to get the image to be the size specified + * + * @param int $maxWidth + * @param int $maxHeight + * @return \PHPThumb\GD + */ + public function adaptiveResize($width, $height) + { + // make sure our arguments are valid + if ((!is_numeric($width) || $width == 0) && (!is_numeric($height) || $height == 0)) { + throw new \InvalidArgumentException('$width and $height must be numeric and greater than zero'); + } + + if (!is_numeric($width) || $width == 0) { + $width = ($height * $this->currentDimensions['width']) / $this->currentDimensions['height']; + } + + if (!is_numeric($height) || $height == 0) { + $height = ($width * $this->currentDimensions['height']) / $this->currentDimensions['width']; + } + + // make sure we're not exceeding our image size if we're not supposed to + if ($this->options['resizeUp'] === false) { + $this->maxHeight = (intval($height) > $this->currentDimensions['height']) ? $this->currentDimensions['height'] : $height; + $this->maxWidth = (intval($width) > $this->currentDimensions['width']) ? $this->currentDimensions['width'] : $width; + } else { + $this->maxHeight = intval($height); + $this->maxWidth = intval($width); + } + + $this->calcImageSizeStrict($this->currentDimensions['width'], $this->currentDimensions['height']); + + // resize the image to be close to our desired dimensions + $this->resize($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); + + // reset the max dimensions... + if ($this->options['resizeUp'] === false) { + $this->maxHeight = (intval($height) > $this->currentDimensions['height']) ? $this->currentDimensions['height'] : $height; + $this->maxWidth = (intval($width) > $this->currentDimensions['width']) ? $this->currentDimensions['width'] : $width; + } else { + $this->maxHeight = intval($height); + $this->maxWidth = intval($width); + } + + // create the working image + if (function_exists('imagecreatetruecolor')) { + $this->workingImage = imagecreatetruecolor($this->maxWidth, $this->maxHeight); + } else { + $this->workingImage = imagecreate($this->maxWidth, $this->maxHeight); + } + + $this->preserveAlpha(); + + $cropWidth = $this->maxWidth; + $cropHeight = $this->maxHeight; + $cropX = 0; + $cropY = 0; + + // now, figure out how to crop the rest of the image... + if ($this->currentDimensions['width'] > $this->maxWidth) { + $cropX = intval(($this->currentDimensions['width'] - $this->maxWidth) / 2); + } elseif ($this->currentDimensions['height'] > $this->maxHeight) { + $cropY = intval(($this->currentDimensions['height'] - $this->maxHeight) / 2); + } + + imagecopyresampled( + $this->workingImage, + $this->oldImage, + 0, + 0, + $cropX, + $cropY, + $cropWidth, + $cropHeight, + $cropWidth, + $cropHeight + ); + + // update all the variables and resources to be correct + $this->oldImage = $this->workingImage; + $this->currentDimensions['width'] = $this->maxWidth; + $this->currentDimensions['height'] = $this->maxHeight; + + return $this; + } + + /** + * Adaptively Resizes the Image and Crops Using a Percentage + * + * This function attempts to get the image to as close to the provided dimensions as possible, and then crops the + * remaining overflow using a provided percentage to get the image to be the size specified. + * + * The percentage mean different things depending on the orientation of the original image. + * + * For Landscape images: + * --------------------- + * + * A percentage of 1 would crop the image all the way to the left, which would be the same as + * using adaptiveResizeQuadrant() with $quadrant = 'L' + * + * A percentage of 50 would crop the image to the center which would be the same as using + * adaptiveResizeQuadrant() with $quadrant = 'C', or even the original adaptiveResize() + * + * A percentage of 100 would crop the image to the image all the way to the right, etc, etc. + * Note that you can use any percentage between 1 and 100. + * + * For Portrait images: + * -------------------- + * + * This works the same as for Landscape images except that a percentage of 1 means top and 100 means bottom + * + * @param int $maxWidth + * @param int $maxHeight + * @param int $percent + * @return \PHPThumb\GD + */ + public function adaptiveResizePercent($width, $height, $percent = 50) + { + // make sure our arguments are valid + if (!is_numeric($width) || $width == 0) { + throw new \InvalidArgumentException('$width must be numeric and greater than zero'); + } + + if (!is_numeric($height) || $height == 0) { + throw new \InvalidArgumentException('$height must be numeric and greater than zero'); + } + + // make sure we're not exceeding our image size if we're not supposed to + if ($this->options['resizeUp'] === false) { + $this->maxHeight = (intval($height) > $this->currentDimensions['height']) ? $this->currentDimensions['height'] : $height; + $this->maxWidth = (intval($width) > $this->currentDimensions['width']) ? $this->currentDimensions['width'] : $width; + } else { + $this->maxHeight = intval($height); + $this->maxWidth = intval($width); + } + + $this->calcImageSizeStrict($this->currentDimensions['width'], $this->currentDimensions['height']); + + // resize the image to be close to our desired dimensions + $this->resize($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); + + // reset the max dimensions... + if ($this->options['resizeUp'] === false) { + $this->maxHeight = (intval($height) > $this->currentDimensions['height']) ? $this->currentDimensions['height'] : $height; + $this->maxWidth = (intval($width) > $this->currentDimensions['width']) ? $this->currentDimensions['width'] : $width; + } else { + $this->maxHeight = intval($height); + $this->maxWidth = intval($width); + } + + // create the working image + if (function_exists('imagecreatetruecolor')) { + $this->workingImage = imagecreatetruecolor($this->maxWidth, $this->maxHeight); + } else { + $this->workingImage = imagecreate($this->maxWidth, $this->maxHeight); + } + + $this->preserveAlpha(); + + $cropWidth = $this->maxWidth; + $cropHeight = $this->maxHeight; + $cropX = 0; + $cropY = 0; + + // Crop the rest of the image using the quadrant + + if ($percent > 100) { + $percent = 100; + } elseif ($percent < 1) { + $percent = 1; + } + + if ($this->currentDimensions['width'] > $this->maxWidth) { + // Image is landscape + $maxCropX = $this->currentDimensions['width'] - $this->maxWidth; + $cropX = intval(($percent / 100) * $maxCropX); + + } elseif ($this->currentDimensions['height'] > $this->maxHeight) { + // Image is portrait + $maxCropY = $this->currentDimensions['height'] - $this->maxHeight; + $cropY = intval(($percent / 100) * $maxCropY); + } + + imagecopyresampled( + $this->workingImage, + $this->oldImage, + 0, + 0, + $cropX, + $cropY, + $cropWidth, + $cropHeight, + $cropWidth, + $cropHeight + ); + + // update all the variables and resources to be correct + $this->oldImage = $this->workingImage; + $this->currentDimensions['width'] = $this->maxWidth; + $this->currentDimensions['height'] = $this->maxHeight; + + return $this; + } + + /** + * Adaptively Resizes the Image and Crops Using a Quadrant + * + * This function attempts to get the image to as close to the provided dimensions as possible, and then crops the + * remaining overflow using the quadrant to get the image to be the size specified. + * + * The quadrants available are Top, Bottom, Center, Left, and Right: + * + * + * +---+---+---+ + * | | T | | + * +---+---+---+ + * | L | C | R | + * +---+---+---+ + * | | B | | + * +---+---+---+ + * + * Note that if your image is Landscape and you choose either of the Top or Bottom quadrants (which won't + * make sence since only the Left and Right would be available, then the Center quadrant will be used + * to crop. This would have exactly the same result as using adaptiveResize(). + * The same goes if your image is portrait and you choose either the Left or Right quadrants. + * + * @param int $maxWidth + * @param int $maxHeight + * @param string $quadrant T, B, C, L, R + * @return \PHPThumb\GD + */ + public function adaptiveResizeQuadrant($width, $height, $quadrant = 'C') + { + // make sure our arguments are valid + if (!is_numeric($width) || $width == 0) { + throw new \InvalidArgumentException('$width must be numeric and greater than zero'); + } + + if (!is_numeric($height) || $height == 0) { + throw new \InvalidArgumentException('$height must be numeric and greater than zero'); + } + + // make sure we're not exceeding our image size if we're not supposed to + if ($this->options['resizeUp'] === false) { + $this->maxHeight = (intval($height) > $this->currentDimensions['height']) ? $this->currentDimensions['height'] : $height; + $this->maxWidth = (intval($width) > $this->currentDimensions['width']) ? $this->currentDimensions['width'] : $width; + } else { + $this->maxHeight = intval($height); + $this->maxWidth = intval($width); + } + + $this->calcImageSizeStrict($this->currentDimensions['width'], $this->currentDimensions['height']); + + // resize the image to be close to our desired dimensions + $this->resize($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); + + // reset the max dimensions... + if ($this->options['resizeUp'] === false) { + $this->maxHeight = (intval($height) > $this->currentDimensions['height']) ? $this->currentDimensions['height'] : $height; + $this->maxWidth = (intval($width) > $this->currentDimensions['width']) ? $this->currentDimensions['width'] : $width; + } else { + $this->maxHeight = intval($height); + $this->maxWidth = intval($width); + } + + // create the working image + if (function_exists('imagecreatetruecolor')) { + $this->workingImage = imagecreatetruecolor($this->maxWidth, $this->maxHeight); + } else { + $this->workingImage = imagecreate($this->maxWidth, $this->maxHeight); + } + + $this->preserveAlpha(); + + $cropWidth = $this->maxWidth; + $cropHeight = $this->maxHeight; + $cropX = 0; + $cropY = 0; + + // Crop the rest of the image using the quadrant + + if ($this->currentDimensions['width'] > $this->maxWidth) { + // Image is landscape + switch ($quadrant) { + case 'L': + $cropX = 0; + break; + case 'R': + $cropX = intval(($this->currentDimensions['width'] - $this->maxWidth)); + break; + case 'C': + default: + $cropX = intval(($this->currentDimensions['width'] - $this->maxWidth) / 2); + break; + } + } elseif ($this->currentDimensions['height'] > $this->maxHeight) { + // Image is portrait + switch ($quadrant) { + case 'T': + $cropY = 0; + break; + case 'B': + $cropY = intval(($this->currentDimensions['height'] - $this->maxHeight)); + break; + case 'C': + default: + $cropY = intval(($this->currentDimensions['height'] - $this->maxHeight) / 2); + break; + } + } + + imagecopyresampled( + $this->workingImage, + $this->oldImage, + 0, + 0, + $cropX, + $cropY, + $cropWidth, + $cropHeight, + $cropWidth, + $cropHeight + ); + + // update all the variables and resources to be correct + $this->oldImage = $this->workingImage; + $this->currentDimensions['width'] = $this->maxWidth; + $this->currentDimensions['height'] = $this->maxHeight; + + return $this; + } + + /** + * Resizes an image by a given percent uniformly, + * Percentage should be whole number representation (i.e. 1-100) + * + * @param int $percent + * @return GD + * @throws \InvalidArgumentException + */ + public function resizePercent($percent = 0) + { + if (!is_numeric($percent)) { + throw new \InvalidArgumentException ('$percent must be numeric'); + } + + $this->percent = intval($percent); + + $this->calcImageSizePercent($this->currentDimensions['width'], $this->currentDimensions['height']); + + if (function_exists('imagecreatetruecolor')) { + $this->workingImage = imagecreatetruecolor($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); + } else { + $this->workingImage = imagecreate($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); + } + + $this->preserveAlpha(); + + imagecopyresampled( + $this->workingImage, + $this->oldImage, + 0, + 0, + 0, + 0, + $this->newDimensions['newWidth'], + $this->newDimensions['newHeight'], + $this->currentDimensions['width'], + $this->currentDimensions['height'] + ); + + $this->oldImage = $this->workingImage; + $this->currentDimensions['width'] = $this->newDimensions['newWidth']; + $this->currentDimensions['height'] = $this->newDimensions['newHeight']; + + return $this; + } + + /** + * Crops an image from the center with provided dimensions + * + * If no height is given, the width will be used as a height, thus creating a square crop + * + * @param int $cropWidth + * @param int $cropHeight + * @return \PHPThumb\GD + */ + public function cropFromCenter($cropWidth, $cropHeight = null) + { + if (!is_numeric($cropWidth)) { + throw new \InvalidArgumentException('$cropWidth must be numeric'); + } + + if ($cropHeight !== null && !is_numeric($cropHeight)) { + throw new \InvalidArgumentException('$cropHeight must be numeric'); + } + + if ($cropHeight === null) { + $cropHeight = $cropWidth; + } + + $cropWidth = ($this->currentDimensions['width'] < $cropWidth) ? $this->currentDimensions['width'] : $cropWidth; + $cropHeight = ($this->currentDimensions['height'] < $cropHeight) ? $this->currentDimensions['height'] : $cropHeight; + + $cropX = intval(($this->currentDimensions['width'] - $cropWidth) / 2); + $cropY = intval(($this->currentDimensions['height'] - $cropHeight) / 2); + + $this->crop($cropX, $cropY, $cropWidth, $cropHeight); + + return $this; + } + + /** + * Vanilla Cropping - Crops from x,y with specified width and height + * + * @param int $startX + * @param int $startY + * @param int $cropWidth + * @param int $cropHeight + * @return \PHPThumb\GD + */ + public function crop($startX, $startY, $cropWidth, $cropHeight) + { + // validate input + if (!is_numeric($startX)) { + throw new \InvalidArgumentException('$startX must be numeric'); + } + + if (!is_numeric($startY)) { + throw new \InvalidArgumentException('$startY must be numeric'); + } + + if (!is_numeric($cropWidth)) { + throw new \InvalidArgumentException('$cropWidth must be numeric'); + } + + if (!is_numeric($cropHeight)) { + throw new \InvalidArgumentException('$cropHeight must be numeric'); + } + + // do some calculations + $cropWidth = ($this->currentDimensions['width'] < $cropWidth) ? $this->currentDimensions['width'] : $cropWidth; + $cropHeight = ($this->currentDimensions['height'] < $cropHeight) ? $this->currentDimensions['height'] : $cropHeight; + + // ensure everything's in bounds + if (($startX + $cropWidth) > $this->currentDimensions['width']) { + $startX = ($this->currentDimensions['width'] - $cropWidth); + } + + if (($startY + $cropHeight) > $this->currentDimensions['height']) { + $startY = ($this->currentDimensions['height'] - $cropHeight); + } + + if ($startX < 0) { + $startX = 0; + } + + if ($startY < 0) { + $startY = 0; + } + + // create the working image + if (function_exists('imagecreatetruecolor')) { + $this->workingImage = imagecreatetruecolor($cropWidth, $cropHeight); + } else { + $this->workingImage = imagecreate($cropWidth, $cropHeight); + } + + $this->preserveAlpha(); + + imagecopyresampled( + $this->workingImage, + $this->oldImage, + 0, + 0, + $startX, + $startY, + $cropWidth, + $cropHeight, + $cropWidth, + $cropHeight + ); + + $this->oldImage = $this->workingImage; + $this->currentDimensions['width'] = $cropWidth; + $this->currentDimensions['height'] = $cropHeight; + + return $this; + } + + /** + * Rotates image either 90 degrees clockwise or counter-clockwise + * + * @param string $direction + * @retunrn \PHPThumb\GD + */ + public function rotateImage($direction = 'CW') + { + if ($direction == 'CW') { + $this->rotateImageNDegrees(90); + } else { + $this->rotateImageNDegrees(-90); + } + + return $this; + } + + /** + * Rotates image specified number of degrees + * + * @param int $degrees + * @return \PHPThumb\GD + */ + public function rotateImageNDegrees($degrees) + { + if (!is_numeric($degrees)) { + throw new \InvalidArgumentException('$degrees must be numeric'); + } + + if (!function_exists('imagerotate')) { + throw new \RuntimeException('Your version of GD does not support image rotation'); + } + + $this->workingImage = imagerotate($this->oldImage, $degrees, 0); + + $newWidth = $this->currentDimensions['height']; + $newHeight = $this->currentDimensions['width']; + $this->oldImage = $this->workingImage; + $this->currentDimensions['width'] = $newWidth; + $this->currentDimensions['height'] = $newHeight; + + return $this; + } + + /** + * Applies a filter to the image + * + * @param int $filter + * @return \PHPThumb\GD + */ + public function imageFilter($filter, $arg1 = false, $arg2 = false, $arg3 = false, $arg4 = false) + { + if (!is_numeric($filter)) { + throw new \InvalidArgumentException('$filter must be numeric'); + } + + if (!function_exists('imagefilter')) { + throw new \RuntimeException('Your version of GD does not support image filters'); + } + + $result = false; + if ($arg1 === false) { + $result = imagefilter($this->oldImage, $filter); + } elseif ($arg2 === false) { + $result = imagefilter($this->oldImage, $filter, $arg1); + } elseif ($arg3 === false) { + $result = imagefilter($this->oldImage, $filter, $arg1, $arg2); + } elseif ($arg4 === false) { + $result = imagefilter($this->oldImage, $filter, $arg1, $arg2, $arg3); + } else { + $result = imagefilter($this->oldImage, $filter, $arg1, $arg2, $arg3, $arg4); + } + + if (!$result) { + throw new \RuntimeException('GD imagefilter failed'); + } + + $this->workingImage = $this->oldImage; + + return $this; + } + + /** + * Shows an image + * + * This function will show the current image by first sending the appropriate header + * for the format, and then outputting the image data. If headers have already been sent, + * a runtime exception will be thrown + * + * @param bool $rawData Whether or not the raw image stream should be output + * @return \PHPThumb\GD + */ + public function show($rawData = false) + { + //Execute any plugins + if ($this->plugins) { + foreach ($this->plugins as $plugin) { + /* @var $plugin \PHPThumb\PluginInterface */ + $plugin->execute($this); + } + } + + if (headers_sent() && php_sapi_name() != 'cli') { + throw new \RuntimeException('Cannot show image, headers have already been sent'); + } + + // When the interlace option equals true or false call imageinterlace else leave it to default + if ($this->options['interlace'] === true) { + imageinterlace($this->oldImage, 1); + } elseif ($this->options['interlace'] === false) { + imageinterlace($this->oldImage, 0); + } + + switch ($this->format) { + case 'GIF': + if ($rawData === false) { + header('Content-type: image/gif'); + } + imagegif($this->oldImage); + break; + case 'JPG': + if ($rawData === false) { + header('Content-type: image/jpeg'); + } + imagejpeg($this->oldImage, null, $this->options['jpegQuality']); + break; + case 'PNG': + case 'STRING': + if ($rawData === false) { + header('Content-type: image/png'); + } + imagepng($this->oldImage); + break; + } + + return $this; + } + + /** + * Returns the Working Image as a String + * + * This function is useful for getting the raw image data as a string for storage in + * a database, or other similar things. + * + * @return string + */ + public function getImageAsString() + { + $data = null; + ob_start(); + $this->show(true); + $data = ob_get_contents(); + ob_end_clean(); + + return $data; + } + + /** + * Saves an image + * + * This function will make sure the target directory is writeable, and then save the image. + * + * If the target directory is not writeable, the function will try to correct the permissions (if allowed, this + * is set as an option ($this->options['correctPermissions']). If the target cannot be made writeable, then a + * \RuntimeException is thrown. + * + * @param string $fileName The full path and filename of the image to save + * @param string $format The format to save the image in (optional, must be one of [GIF,JPG,PNG] + * @return \PHPThumb\GD + */ + public function save($fileName, $format = null) + { + $validFormats = array('GIF', 'JPG', 'PNG'); + $format = ($format !== null) ? strtoupper($format) : $this->format; + + if (!in_array($format, $validFormats)) { + throw new \InvalidArgumentException("Invalid format type specified in save function: {$format}"); + } + + // make sure the directory is writeable + if (!is_writeable(dirname($fileName))) { + // try to correct the permissions + if ($this->options['correctPermissions'] === true) { + @chmod(dirname($fileName), 0777); + + // throw an exception if not writeable + if (!is_writeable(dirname($fileName))) { + throw new \RuntimeException("File is not writeable, and could not correct permissions: {$fileName}"); + } + } else { // throw an exception if not writeable + throw new \RuntimeException("File not writeable: {$fileName}"); + } + } + + // When the interlace option equals true or false call imageinterlace else leave it to default + if ($this->options['interlace'] === true) { + imageinterlace($this->oldImage, 1); + } elseif ($this->options['interlace'] === false) { + imageinterlace($this->oldImage, 0); + } + + switch ($format) { + case 'GIF': + imagegif($this->oldImage, $fileName); + break; + case 'JPG': + imagejpeg($this->oldImage, $fileName, $this->options['jpegQuality']); + break; + case 'PNG': + imagepng($this->oldImage, $fileName); + break; + } + + return $this; + } + + ################################# + # ----- GETTERS / SETTERS ----- # + ################################# + + /** + * Sets options for all operations. + * @param array $options + * @return GD + */ + public function setOptions(array $options = array()) + { + // we've yet to init the default options, so create them here + if (sizeof($this->options) == 0) { + $defaultOptions = array( + 'resizeUp' => false, + 'jpegQuality' => 100, + 'correctPermissions' => false, + 'preserveAlpha' => true, + 'alphaMaskColor' => array (255, 255, 255), + 'preserveTransparency' => true, + 'transparencyMaskColor' => array (0, 0, 0), + 'interlace' => null + ); + } else { // otherwise, let's use what we've got already + $defaultOptions = $this->options; + } + + $this->options = array_merge($defaultOptions, $options); + + return $this; + } + + /** + * Returns $currentDimensions. + * + * @see \PHPThumb\GD::$currentDimensions + */ + public function getCurrentDimensions() + { + return $this->currentDimensions; + } + + /** + * @param $currentDimensions + * @return GD + */ + public function setCurrentDimensions($currentDimensions) + { + $this->currentDimensions = $currentDimensions; + + return $this; + } + + /** + * @return int + */ + public function getMaxHeight() + { + return $this->maxHeight; + } + + /** + * @param $maxHeight + * @return GD + */ + public function setMaxHeight($maxHeight) + { + $this->maxHeight = $maxHeight; + + return $this; + } + + /** + * @return int + */ + public function getMaxWidth() + { + return $this->maxWidth; + } + + /** + * @param $maxWidth + * @return GD + */ + public function setMaxWidth($maxWidth) + { + $this->maxWidth = $maxWidth; + + return $this; + } + + /** + * Returns $newDimensions. + * + * @see \PHPThumb\GD::$newDimensions + */ + public function getNewDimensions() + { + return $this->newDimensions; + } + + /** + * Sets $newDimensions. + * + * @param object $newDimensions + * @see \PHPThumb\GD::$newDimensions + */ + public function setNewDimensions($newDimensions) + { + $this->newDimensions = $newDimensions; + + return $this; + } + + /** + * Returns $options. + * + * @see \PHPThumb\GD::$options + */ + public function getOptions() + { + return $this->options; + } + + /** + * Returns $percent. + * + * @see \PHPThumb\GD::$percent + */ + public function getPercent() + { + return $this->percent; + } + + /** + * Sets $percent. + * + * @param object $percent + * @see \PHPThumb\GD::$percent + */ + public function setPercent($percent) + { + $this->percent = $percent; + + return $this; + } + + /** + * Returns $oldImage. + * + * @see \PHPThumb\GD::$oldImage + */ + public function getOldImage() + { + return $this->oldImage; + } + + /** + * Sets $oldImage. + * + * @param object $oldImage + * @see \PHPThumb\GD::$oldImage + */ + public function setOldImage($oldImage) + { + $this->oldImage = $oldImage; + + return $this; + } + + /** + * Returns $workingImage. + * + * @see \PHPThumb\GD::$workingImage + */ + public function getWorkingImage() + { + return $this->workingImage; + } + + /** + * Sets $workingImage. + * + * @param object $workingImage + * @see \PHPThumb\GD::$workingImage + */ + public function setWorkingImage($workingImage) + { + $this->workingImage = $workingImage; + + return $this; + } + + + ################################# + # ----- UTILITY FUNCTIONS ----- # + ################################# + + /** + * Calculates a new width and height for the image based on $this->maxWidth and the provided dimensions + * + * @return array + * @param int $width + * @param int $height + */ + protected function calcWidth($width, $height) + { + $newWidthPercentage = (100 * $this->maxWidth) / $width; + $newHeight = ($height * $newWidthPercentage) / 100; + + return array( + 'newWidth' => intval($this->maxWidth), + 'newHeight' => intval($newHeight) + ); + } + + /** + * Calculates a new width and height for the image based on $this->maxWidth and the provided dimensions + * + * @return array + * @param int $width + * @param int $height + */ + protected function calcHeight($width, $height) + { + $newHeightPercentage = (100 * $this->maxHeight) / $height; + $newWidth = ($width * $newHeightPercentage) / 100; + + return array( + 'newWidth' => ceil($newWidth), + 'newHeight' => ceil($this->maxHeight) + ); + } + + /** + * Calculates a new width and height for the image based on $this->percent and the provided dimensions + * + * @return array + * @param int $width + * @param int $height + */ + protected function calcPercent($width, $height) + { + $newWidth = ($width * $this->percent) / 100; + $newHeight = ($height * $this->percent) / 100; + + return array( + 'newWidth' => ceil($newWidth), + 'newHeight' => ceil($newHeight) + ); + } + + /** + * Calculates the new image dimensions + * + * These calculations are based on both the provided dimensions and $this->maxWidth and $this->maxHeight + * + * @param int $width + * @param int $height + */ + protected function calcImageSize($width, $height) + { + $newSize = array( + 'newWidth' => $width, + 'newHeight' => $height + ); + + if ($this->maxWidth > 0) { + $newSize = $this->calcWidth($width, $height); + + if ($this->maxHeight > 0 && $newSize['newHeight'] > $this->maxHeight) { + $newSize = $this->calcHeight($newSize['newWidth'], $newSize['newHeight']); + } + } + + if ($this->maxHeight > 0) { + $newSize = $this->calcHeight($width, $height); + + if ($this->maxWidth > 0 && $newSize['newWidth'] > $this->maxWidth) { + $newSize = $this->calcWidth($newSize['newWidth'], $newSize['newHeight']); + } + } + + $this->newDimensions = $newSize; + } + + /** + * Calculates new image dimensions, not allowing the width and height to be less than either the max width or height + * + * @param int $width + * @param int $height + */ + protected function calcImageSizeStrict($width, $height) + { + // first, we need to determine what the longest resize dimension is.. + if ($this->maxWidth >= $this->maxHeight) { + // and determine the longest original dimension + if ($width > $height) { + $newDimensions = $this->calcHeight($width, $height); + + if ($newDimensions['newWidth'] < $this->maxWidth) { + $newDimensions = $this->calcWidth($width, $height); + } + } elseif ($height >= $width) { + $newDimensions = $this->calcWidth($width, $height); + + if ($newDimensions['newHeight'] < $this->maxHeight) { + $newDimensions = $this->calcHeight($width, $height); + } + } + } elseif ($this->maxHeight > $this->maxWidth) { + if ($width >= $height) { + $newDimensions = $this->calcWidth($width, $height); + + if ($newDimensions['newHeight'] < $this->maxHeight) { + $newDimensions = $this->calcHeight($width, $height); + } + } elseif ($height > $width) { + $newDimensions = $this->calcHeight($width, $height); + + if ($newDimensions['newWidth'] < $this->maxWidth) { + $newDimensions = $this->calcWidth($width, $height); + } + } + } + + $this->newDimensions = $newDimensions; + } + + /** + * Calculates new dimensions based on $this->percent and the provided dimensions + * + * @param int $width + * @param int $height + */ + protected function calcImageSizePercent($width, $height) + { + if ($this->percent > 0) { + $this->newDimensions = $this->calcPercent($width, $height); + } + } + + /** + * Determines the file format by mime-type + * + * This function will throw exceptions for invalid images / mime-types + * + */ + protected function determineFormat() + { + $formatInfo = getimagesize($this->fileName); + + // non-image files will return false + if ($formatInfo === false) { + if ($this->remoteImage) { + throw new \Exception("Could not determine format of remote image: {$this->fileName}"); + } else { + throw new \Exception("File is not a valid image: {$this->fileName}"); + } + } + + $mimeType = isset($formatInfo['mime']) ? $formatInfo['mime'] : null; + + switch ($mimeType) { + case 'image/gif': + $this->format = 'GIF'; + break; + case 'image/jpeg': + $this->format = 'JPG'; + break; + case 'image/png': + $this->format = 'PNG'; + break; + default: + throw new \Exception("Image format not supported: {$mimeType}"); + } + } + + /** + * Makes sure the correct GD implementation exists for the file type + * + */ + protected function verifyFormatCompatiblity() + { + $isCompatible = true; + $gdInfo = gd_info(); + + switch ($this->format) { + case 'GIF': + $isCompatible = isset($gdInfo['GIF Create Support']); + break; + case 'JPG': + $isCompatible = (isset($gdInfo['JPG Support']) || isset($gdInfo['JPEG Support'])) ? true : false; + break; + case 'PNG': + $isCompatible = isset($gdInfo[$this->format . ' Support']); + break; + default: + $isCompatible = false; + } + + if (!$isCompatible) { + // one last check for "JPEG" instead + $isCompatible = isset($gdInfo['JPEG Support']); + + if (!$isCompatible) { + throw new \Exception("Your GD installation does not support {$this->format} image types"); + } + } + } + + /** + * Preserves the alpha or transparency for PNG and GIF files + * + * Alpha / transparency will not be preserved if the appropriate options are set to false. + * Also, the GIF transparency is pretty skunky (the results aren't awesome), but it works like a + * champ... that's the nature of GIFs tho, so no huge surprise. + * + * This functionality was originally suggested by commenter Aimi (no links / site provided) - Thanks! :) + * + */ + protected function preserveAlpha() + { + if ($this->format == 'PNG' && $this->options['preserveAlpha'] === true) { + imagealphablending($this->workingImage, false); + + $colorTransparent = imagecolorallocatealpha( + $this->workingImage, + $this->options['alphaMaskColor'][0], + $this->options['alphaMaskColor'][1], + $this->options['alphaMaskColor'][2], + 0 + ); + + imagefill($this->workingImage, 0, 0, $colorTransparent); + imagesavealpha($this->workingImage, true); + } + // preserve transparency in GIFs... this is usually pretty rough tho + if ($this->format == 'GIF' && $this->options['preserveTransparency'] === true) { + $colorTransparent = imagecolorallocate( + $this->workingImage, + $this->options['transparencyMaskColor'][0], + $this->options['transparencyMaskColor'][1], + $this->options['transparencyMaskColor'][2] + ); + + imagecolortransparent($this->workingImage, $colorTransparent); + imagetruecolortopalette($this->workingImage, true, 256); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/PHPThumb.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/PHPThumb.php new file mode 100755 index 00000000..a86c8c91 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/PHPThumb.php @@ -0,0 +1,143 @@ + + * Copyright (c) 2009, Ian Selby/Gen X Design + * + * Author(s): Ian Selby + * + * Licensed under the MIT License + * Redistributions of files must retain the above copyright notice. + * + * @author Ian Selby + * @copyright Copyright (c) 2009 Gen X Design + * @link http://phpthumb.gxdlabs.com + * @license http://www.opensource.org/licenses/mit-license.php The MIT License + */ + +abstract class PHPThumb +{ + /** + * The name of the file we're manipulating + * This must include the path to the file (absolute paths recommended) + * + * @var string + */ + protected $fileName; + + /** + * What the file format is (mime-type) + * + * @var string + */ + protected $format; + + /** + * Whether or not the image is hosted remotely + * + * @var bool + */ + protected $remoteImage; + + /** + * An array of attached plugins to execute in order. + * @var array + */ + protected $plugins; + + /** + * @param $fileName + * @param array $options + * @param array $plugins + */ + public function __construct($fileName, array $options = array(), array $plugins = array()) + { + $this->fileName = $fileName; + $this->remoteImage = false; + + if(!$this->validateRequestedResource($fileName)) { + throw new \InvalidArgumentException("Image file not found: {$fileName}"); + } + + $this->setOptions($options); + + $this->plugins = $plugins; + } + + abstract public function setOptions(array $options = array()); + + /** + * Check the provided filename/url. If it is a url, validate that it is properly + * formatted. If it is a file, check to make sure that it actually exists on + * the filesystem. + * + * @param $filename + * @return bool + */ + protected function validateRequestedResource($filename) + { + if(false !== filter_var($filename, FILTER_VALIDATE_URL)) { + $this->remoteImage = true; + return true; + } + + if (file_exists($filename)) { + return true; + } + + return false; + } + + /** + * Returns the filename. + * @return string + */ + public function getFileName() + { + return $this->fileName; + } + + /** + * Sets the filename. + * @param $fileName + * @return PHPThumb + */ + public function setFileName($fileName) + { + $this->fileName = $fileName; + + return $this; + } + + /** + * Returns the format. + * @return string + */ + public function getFormat() + { + return $this->format; + } + + /** + * Sets the format. + * @param $format + * @return PHPThumb + */ + public function setFormat($format) + { + $this->format = $format; + + return $this; + } + + /** + * Returns whether the image exists remotely, i.e. it was loaded via a URL. + * @return bool + */ + public function getIsRemoteImage() + { + return $this->remoteImage; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/PluginInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/PluginInterface.php new file mode 100755 index 00000000..56df9768 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/PluginInterface.php @@ -0,0 +1,12 @@ + + * Copyright (c) 2009, Ian Selby/Gen X Design + * + * Author(s): Ian Selby + * + * Licensed under the MIT License + * Redistributions of files must retain the above copyright notice. + * + * @author Ian Selby + * @copyright Copyright (c) 2009 Gen X Design + * @link http://phpthumb.gxdlabs.com + * @license http://www.opensource.org/licenses/mit-license.php The MIT License + * @version 3.0 + * @package PhpThumb + * @filesource + */ + +/** + * GD Reflection Lib Plugin + * + * This plugin allows you to create those fun Apple(tm)-style reflections in your images + * + * @package PhpThumb + * @subpackage Plugins + */ +class Reflection implements \PHPThumb\PluginInterface +{ + protected $currentDimensions; + protected $workingImage; + protected $newImage; + protected $options; + + protected $percent; + protected $reflection; + protected $white; + protected $border; + protected $borderColor; + + public function __construct($percent, $reflection, $white, $border, $borderColor) + { + $this->percent = $percent; + $this->reflection = $reflection; + $this->white = $white; + $this->border = $border; + $this->borderColor = $borderColor; + } + + /** + * @param \PHPThumb\PHPThumb $phpthumb + * @return \PHPThumb\PHPThumb + */ + public function execute($phpthumb) + { + $this->currentDimensions = $phpthumb->getCurrentDimensions(); + $this->workingImage = $phpthumb->getWorkingImage(); + $this->newImage = $phpthumb->getOldImage(); + $this->options = $phpthumb->getOptions(); + + $width = $this->currentDimensions['width']; + $height = $this->currentDimensions['height']; + $this->reflectionHeight = intval($height * ($this->reflection / 100)); + $newHeight = $height + $this->reflectionHeight; + $reflectedPart = $height * ($this->percent / 100); + + $this->workingImage = imagecreatetruecolor($width, $newHeight); + + imagealphablending($this->workingImage, true); + + $colorToPaint = imagecolorallocatealpha( + $this->workingImage, + 255, + 255, + 255, + 0 + ); + + imagefilledrectangle( + $this->workingImage, + 0, + 0, + $width, + $newHeight, + $colorToPaint + ); + + imagecopyresampled( + $this->workingImage, + $this->newImage, + 0, + 0, + 0, + $reflectedPart, + $width, + $this->reflectionHeight, + $width, + ($height - $reflectedPart) + ); + + $this->imageFlipVertical(); + + imagecopy( + $this->workingImage, + $this->newImage, + 0, + 0, + 0, + 0, + $width, + $height + ); + + imagealphablending($this->workingImage, true); + + for ($i = 0; $i < $this->reflectionHeight; $i++) { + $colorToPaint = imagecolorallocatealpha( + $this->workingImage, + 255, + 255, + 255, + ($i / $this->reflectionHeight * -1 + 1) * $this->white + ); + + imagefilledrectangle( + $this->workingImage, + 0, + $height + $i, + $width, + $height + $i, + $colorToPaint + ); + } + + if ($this->border == true) { + $rgb = $this->hex2rgb($this->borderColor, false); + $colorToPaint = imagecolorallocate($this->workingImage, $rgb[0], $rgb[1], $rgb[2]); + + //top line + imageline( + $this->workingImage, + 0, + 0, + $width, + 0, + $colorToPaint + ); + + //bottom line + imageline( + $this->workingImage, + 0, + $height, + $width, + $height, + $colorToPaint + ); + + //left line + imageline( + $this->workingImage, + 0, + 0, + 0, + $height, + $colorToPaint + ); + + //right line + imageline( + $this->workingImage, + $width - 1, + 0, + $width - 1, + $height, + $colorToPaint + ); + } + + if ($phpthumb->getFormat() == 'PNG') { + $colorTransparent = imagecolorallocatealpha( + $this->workingImage, + $this->options['alphaMaskColor'][0], + $this->options['alphaMaskColor'][1], + $this->options['alphaMaskColor'][2], + 0 + ); + + imagefill($this->workingImage, 0, 0, $colorTransparent); + imagesavealpha($this->workingImage, true); + } + + $phpthumb->setOldImage($this->workingImage); + $this->currentDimensions['width'] = $width; + $this->currentDimensions['height'] = $newHeight; + $phpthumb->setCurrentDimensions($this->currentDimensions); + + return $phpthumb; + } + + /** + * Flips the image vertically + * + */ + protected function imageFlipVertical () + { + $x_i = imagesx($this->workingImage); + $y_i = imagesy($this->workingImage); + + for ($x = 0; $x < $x_i; $x++) { + for ($y = 0; $y < $y_i; $y++) { + imagecopy( + $this->workingImage, + $this->workingImage, + $x, + $y_i - $y - 1, + $x, + $y, + 1, + 1 + ); + } + } + } + + /** + * Converts a hex color to rgb tuples + * + * @return mixed + * @param string $hex + * @param bool $asString + */ + protected function hex2rgb ($hex, $asString = false) + { + // strip off any leading # + if (0 === strpos($hex, '#')) { + $hex = substr($hex, 1); + } elseif (0 === strpos($hex, '&H')) { + $hex = substr($hex, 2); + } + + // break into hex 3-tuple + $cutpoint = ceil(strlen($hex) / 2)-1; + $rgb = explode(':', wordwrap($hex, $cutpoint, ':', $cutpoint), 3); + + // convert each tuple to decimal + $rgb[0] = (isset($rgb[0]) ? hexdec($rgb[0]) : 0); + $rgb[1] = (isset($rgb[1]) ? hexdec($rgb[1]) : 0); + $rgb[2] = (isset($rgb[2]) ? hexdec($rgb[2]) : 0); + + return ($asString ? "{$rgb[0]} {$rgb[1]} {$rgb[2]}" : $rgb); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Autoloader.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Autoloader.php new file mode 100755 index 00000000..17ec2ff1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Autoloader.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis; + +/** + * Implements a lightweight PSR-0 compliant autoloader for Predis. + * + * @author Eric Naeseth + * @author Daniele Alessandri + */ +class Autoloader +{ + private $directory; + private $prefix; + private $prefixLength; + + /** + * @param string $baseDirectory Base directory where the source files are located. + */ + public function __construct($baseDirectory = __DIR__) + { + $this->directory = $baseDirectory; + $this->prefix = __NAMESPACE__.'\\'; + $this->prefixLength = strlen($this->prefix); + } + + /** + * Registers the autoloader class with the PHP SPL autoloader. + * + * @param bool $prepend Prepend the autoloader on the stack instead of appending it. + */ + public static function register($prepend = false) + { + spl_autoload_register(array(new self(), 'autoload'), true, $prepend); + } + + /** + * Loads a class from a file using its fully qualified name. + * + * @param string $className Fully qualified name of a class. + */ + public function autoload($className) + { + if (0 === strpos($className, $this->prefix)) { + $parts = explode('\\', substr($className, $this->prefixLength)); + $filepath = $this->directory.DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, $parts).'.php'; + + if (is_file($filepath)) { + require $filepath; + } + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Client.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Client.php new file mode 100755 index 00000000..87596ec9 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Client.php @@ -0,0 +1,523 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis; + +use Predis\Command\CommandInterface; +use Predis\Command\RawCommand; +use Predis\Command\ScriptCommand; +use Predis\Configuration\Options; +use Predis\Configuration\OptionsInterface; +use Predis\Connection\AggregateConnectionInterface; +use Predis\Connection\ConnectionInterface; +use Predis\Connection\ParametersInterface; +use Predis\Monitor\Consumer as MonitorConsumer; +use Predis\Pipeline\Pipeline; +use Predis\PubSub\Consumer as PubSubConsumer; +use Predis\Response\ErrorInterface as ErrorResponseInterface; +use Predis\Response\ResponseInterface; +use Predis\Response\ServerException; +use Predis\Transaction\MultiExec as MultiExecTransaction; + +/** + * Client class used for connecting and executing commands on Redis. + * + * This is the main high-level abstraction of Predis upon which various other + * abstractions are built. Internally it aggregates various other classes each + * one with its own responsibility and scope. + * + * {@inheritdoc} + * + * @author Daniele Alessandri + */ +class Client implements ClientInterface +{ + const VERSION = '1.0.3'; + + protected $connection; + protected $options; + private $profile; + + /** + * @param mixed $parameters Connection parameters for one or more servers. + * @param mixed $options Options to configure some behaviours of the client. + */ + public function __construct($parameters = null, $options = null) + { + $this->options = $this->createOptions($options ?: array()); + $this->connection = $this->createConnection($parameters ?: array()); + $this->profile = $this->options->profile; + } + + /** + * Creates a new instance of Predis\Configuration\Options from different + * types of arguments or simply returns the passed argument if it is an + * instance of Predis\Configuration\OptionsInterface. + * + * @param mixed $options Client options. + * + * @throws \InvalidArgumentException + * + * @return OptionsInterface + */ + protected function createOptions($options) + { + if (is_array($options)) { + return new Options($options); + } + + if ($options instanceof OptionsInterface) { + return $options; + } + + throw new \InvalidArgumentException('Invalid type for client options.'); + } + + /** + * Creates single or aggregate connections from different types of arguments + * (string, array) or returns the passed argument if it is an instance of a + * class implementing Predis\Connection\ConnectionInterface. + * + * Accepted types for connection parameters are: + * + * - Instance of Predis\Connection\ConnectionInterface. + * - Instance of Predis\Connection\ParametersInterface. + * - Array + * - String + * - Callable + * + * @param mixed $parameters Connection parameters or connection instance. + * + * @throws \InvalidArgumentException + * + * @return ConnectionInterface + */ + protected function createConnection($parameters) + { + if ($parameters instanceof ConnectionInterface) { + return $parameters; + } + + if ($parameters instanceof ParametersInterface || is_string($parameters)) { + return $this->options->connections->create($parameters); + } + + if (is_array($parameters)) { + if (!isset($parameters[0])) { + return $this->options->connections->create($parameters); + } + + $options = $this->options; + + if ($options->defined('aggregate')) { + $initializer = $this->getConnectionInitializerWrapper($options->aggregate); + $connection = $initializer($parameters, $options); + } else { + if ($options->defined('replication') && $replication = $options->replication) { + $connection = $replication; + } else { + $connection = $options->cluster; + } + + $options->connections->aggregate($connection, $parameters); + } + + return $connection; + } + + if (is_callable($parameters)) { + $initializer = $this->getConnectionInitializerWrapper($parameters); + $connection = $initializer($this->options); + + return $connection; + } + + throw new \InvalidArgumentException('Invalid type for connection parameters.'); + } + + /** + * Wraps a callable to make sure that its returned value represents a valid + * connection type. + * + * @param mixed $callable + * + * @return \Closure + */ + protected function getConnectionInitializerWrapper($callable) + { + return function () use ($callable) { + $connection = call_user_func_array($callable, func_get_args()); + + if (!$connection instanceof ConnectionInterface) { + throw new \UnexpectedValueException( + 'The callable connection initializer returned an invalid type.' + ); + } + + return $connection; + }; + } + + /** + * {@inheritdoc} + */ + public function getProfile() + { + return $this->profile; + } + + /** + * {@inheritdoc} + */ + public function getOptions() + { + return $this->options; + } + + /** + * Creates a new client instance for the specified connection ID or alias, + * only when working with an aggregate connection (cluster, replication). + * The new client instances uses the same options of the original one. + * + * @param string $connectionID Identifier of a connection. + * + * @throws \InvalidArgumentException + * + * @return Client + */ + public function getClientFor($connectionID) + { + if (!$connection = $this->getConnectionById($connectionID)) { + throw new \InvalidArgumentException("Invalid connection ID: $connectionID."); + } + + return new static($connection, $this->options); + } + + /** + * Opens the underlying connection and connects to the server. + */ + public function connect() + { + $this->connection->connect(); + } + + /** + * Closes the underlying connection and disconnects from the server. + */ + public function disconnect() + { + $this->connection->disconnect(); + } + + /** + * Closes the underlying connection and disconnects from the server. + * + * This is the same as `Client::disconnect()` as it does not actually send + * the `QUIT` command to Redis, but simply closes the connection. + */ + public function quit() + { + $this->disconnect(); + } + + /** + * Returns the current state of the underlying connection. + * + * @return bool + */ + public function isConnected() + { + return $this->connection->isConnected(); + } + + /** + * {@inheritdoc} + */ + public function getConnection() + { + return $this->connection; + } + + /** + * Retrieves the specified connection from the aggregate connection when the + * client is in cluster or replication mode. + * + * @param string $connectionID Index or alias of the single connection. + * + * @throws NotSupportedException + * + * @return Connection\NodeConnectionInterface + */ + public function getConnectionById($connectionID) + { + if (!$this->connection instanceof AggregateConnectionInterface) { + throw new NotSupportedException( + 'Retrieving connections by ID is supported only by aggregate connections.' + ); + } + + return $this->connection->getConnectionById($connectionID); + } + + /** + * Executes a command without filtering its arguments, parsing the response, + * applying any prefix to keys or throwing exceptions on Redis errors even + * regardless of client options. + * + * It is possibile to indentify Redis error responses from normal responses + * using the second optional argument which is populated by reference. + * + * @param array $arguments Command arguments as defined by the command signature. + * @param bool $error Set to TRUE when Redis returned an error response. + * + * @return mixed + */ + public function executeRaw(array $arguments, &$error = null) + { + $error = false; + + $response = $this->connection->executeCommand( + new RawCommand($arguments) + ); + + if ($response instanceof ResponseInterface) { + if ($response instanceof ErrorResponseInterface) { + $error = true; + } + + return (string) $response; + } + + return $response; + } + + /** + * {@inheritdoc} + */ + public function __call($commandID, $arguments) + { + return $this->executeCommand( + $this->createCommand($commandID, $arguments) + ); + } + + /** + * {@inheritdoc} + */ + public function createCommand($commandID, $arguments = array()) + { + return $this->profile->createCommand($commandID, $arguments); + } + + /** + * {@inheritdoc} + */ + public function executeCommand(CommandInterface $command) + { + $response = $this->connection->executeCommand($command); + + if ($response instanceof ResponseInterface) { + if ($response instanceof ErrorResponseInterface) { + $response = $this->onErrorResponse($command, $response); + } + + return $response; + } + + return $command->parseResponse($response); + } + + /** + * Handles -ERR responses returned by Redis. + * + * @param CommandInterface $command Redis command that generated the error. + * @param ErrorResponseInterface $response Instance of the error response. + * + * @throws ServerException + * + * @return mixed + */ + protected function onErrorResponse(CommandInterface $command, ErrorResponseInterface $response) + { + if ($command instanceof ScriptCommand && $response->getErrorType() === 'NOSCRIPT') { + $eval = $this->createCommand('EVAL'); + $eval->setRawArguments($command->getEvalArguments()); + + $response = $this->executeCommand($eval); + + if (!$response instanceof ResponseInterface) { + $response = $command->parseResponse($response); + } + + return $response; + } + + if ($this->options->exceptions) { + throw new ServerException($response->getMessage()); + } + + return $response; + } + + /** + * Executes the specified initializer method on `$this` by adjusting the + * actual invokation depending on the arity (0, 1 or 2 arguments). This is + * simply an utility method to create Redis contexts instances since they + * follow a common initialization path. + * + * @param string $initializer Method name. + * @param array $argv Arguments for the method. + * + * @return mixed + */ + private function sharedContextFactory($initializer, $argv = null) + { + switch (count($argv)) { + case 0: + return $this->$initializer(); + + case 1: + return is_array($argv[0]) + ? $this->$initializer($argv[0]) + : $this->$initializer(null, $argv[0]); + + case 2: + list($arg0, $arg1) = $argv; + + return $this->$initializer($arg0, $arg1); + + default: + return $this->$initializer($this, $argv); + } + } + + /** + * Creates a new pipeline context and returns it, or returns the results of + * a pipeline executed inside the optionally provided callable object. + * + * @param mixed ... Array of options, a callable for execution, or both. + * + * @return Pipeline|array + */ + public function pipeline(/* arguments */) + { + return $this->sharedContextFactory('createPipeline', func_get_args()); + } + + /** + * Actual pipeline context initializer method. + * + * @param array $options Options for the context. + * @param mixed $callable Optional callable used to execute the context. + * + * @return Pipeline|array + */ + protected function createPipeline(array $options = null, $callable = null) + { + if (isset($options['atomic']) && $options['atomic']) { + $class = 'Predis\Pipeline\Atomic'; + } elseif (isset($options['fire-and-forget']) && $options['fire-and-forget']) { + $class = 'Predis\Pipeline\FireAndForget'; + } else { + $class = 'Predis\Pipeline\Pipeline'; + } + + /* + * @var ClientContextInterface + */ + $pipeline = new $class($this); + + if (isset($callable)) { + return $pipeline->execute($callable); + } + + return $pipeline; + } + + /** + * Creates a new transaction context and returns it, or returns the results + * of a transaction executed inside the optionally provided callable object. + * + * @param mixed ... Array of options, a callable for execution, or both. + * + * @return MultiExecTransaction|array + */ + public function transaction(/* arguments */) + { + return $this->sharedContextFactory('createTransaction', func_get_args()); + } + + /** + * Actual transaction context initializer method. + * + * @param array $options Options for the context. + * @param mixed $callable Optional callable used to execute the context. + * + * @return MultiExecTransaction|array + */ + protected function createTransaction(array $options = null, $callable = null) + { + $transaction = new MultiExecTransaction($this, $options); + + if (isset($callable)) { + return $transaction->execute($callable); + } + + return $transaction; + } + + /** + * Creates a new publis/subscribe context and returns it, or starts its loop + * inside the optionally provided callable object. + * + * @param mixed ... Array of options, a callable for execution, or both. + * + * @return PubSubConsumer|null + */ + public function pubSubLoop(/* arguments */) + { + return $this->sharedContextFactory('createPubSub', func_get_args()); + } + + /** + * Actual publish/subscribe context initializer method. + * + * @param array $options Options for the context. + * @param mixed $callable Optional callable used to execute the context. + * + * @return PubSubConsumer|null + */ + protected function createPubSub(array $options = null, $callable = null) + { + $pubsub = new PubSubConsumer($this, $options); + + if (!isset($callable)) { + return $pubsub; + } + + foreach ($pubsub as $message) { + if (call_user_func($callable, $pubsub, $message) === false) { + $pubsub->stop(); + } + } + } + + /** + * Creates a new monitor consumer and returns it. + * + * @return MonitorConsumer + */ + public function monitor() + { + return new MonitorConsumer($this); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientContextInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientContextInterface.php new file mode 100755 index 00000000..7f695b78 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientContextInterface.php @@ -0,0 +1,189 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis; + +use Predis\Command\CommandInterface; + +/** + * Interface defining a client-side context such as a pipeline or transaction. + * + * @method $this del(array $keys) + * @method $this dump($key) + * @method $this exists($key) + * @method $this expire($key, $seconds) + * @method $this expireat($key, $timestamp) + * @method $this keys($pattern) + * @method $this move($key, $db) + * @method $this object($subcommand, $key) + * @method $this persist($key) + * @method $this pexpire($key, $milliseconds) + * @method $this pexpireat($key, $timestamp) + * @method $this pttl($key) + * @method $this randomkey() + * @method $this rename($key, $target) + * @method $this renamenx($key, $target) + * @method $this scan($cursor, array $options = null) + * @method $this sort($key, array $options = null) + * @method $this ttl($key) + * @method $this type($key) + * @method $this append($key, $value) + * @method $this bitcount($key, $start = null, $end = null) + * @method $this bitop($operation, $destkey, $key) + * @method $this decr($key) + * @method $this decrby($key, $decrement) + * @method $this get($key) + * @method $this getbit($key, $offset) + * @method $this getrange($key, $start, $end) + * @method $this getset($key, $value) + * @method $this incr($key) + * @method $this incrby($key, $increment) + * @method $this incrbyfloat($key, $increment) + * @method $this mget(array $keys) + * @method $this mset(array $dictionary) + * @method $this msetnx(array $dictionary) + * @method $this psetex($key, $milliseconds, $value) + * @method $this set($key, $value, $expireResolution = null, $expireTTL = null, $flag = null) + * @method $this setbit($key, $offset, $value) + * @method $this setex($key, $seconds, $value) + * @method $this setnx($key, $value) + * @method $this setrange($key, $offset, $value) + * @method $this strlen($key) + * @method $this hdel($key, array $fields) + * @method $this hexists($key, $field) + * @method $this hget($key, $field) + * @method $this hgetall($key) + * @method $this hincrby($key, $field, $increment) + * @method $this hincrbyfloat($key, $field, $increment) + * @method $this hkeys($key) + * @method $this hlen($key) + * @method $this hmget($key, array $fields) + * @method $this hmset($key, array $dictionary) + * @method $this hscan($key, $cursor, array $options = null) + * @method $this hset($key, $field, $value) + * @method $this hsetnx($key, $field, $value) + * @method $this hvals($key) + * @method $this blpop(array $keys, $timeout) + * @method $this brpop(array $keys, $timeout) + * @method $this brpoplpush($source, $destination, $timeout) + * @method $this lindex($key, $index) + * @method $this linsert($key, $whence, $pivot, $value) + * @method $this llen($key) + * @method $this lpop($key) + * @method $this lpush($key, array $values) + * @method $this lpushx($key, $value) + * @method $this lrange($key, $start, $stop) + * @method $this lrem($key, $count, $value) + * @method $this lset($key, $index, $value) + * @method $this ltrim($key, $start, $stop) + * @method $this rpop($key) + * @method $this rpoplpush($source, $destination) + * @method $this rpush($key, array $values) + * @method $this rpushx($key, $value) + * @method $this sadd($key, array $members) + * @method $this scard($key) + * @method $this sdiff(array $keys) + * @method $this sdiffstore($destination, array $keys) + * @method $this sinter(array $keys) + * @method $this sinterstore($destination, array $keys) + * @method $this sismember($key, $member) + * @method $this smembers($key) + * @method $this smove($source, $destination, $member) + * @method $this spop($key) + * @method $this srandmember($key, $count = null) + * @method $this srem($key, $member) + * @method $this sscan($key, $cursor, array $options = null) + * @method $this sunion(array $keys) + * @method $this sunionstore($destination, array $keys) + * @method $this zadd($key, array $membersAndScoresDictionary) + * @method $this zcard($key) + * @method $this zcount($key, $min, $max) + * @method $this zincrby($key, $increment, $member) + * @method $this zinterstore($destination, array $keys, array $options = null) + * @method $this zrange($key, $start, $stop, array $options = null) + * @method $this zrangebyscore($key, $min, $max, array $options = null) + * @method $this zrank($key, $member) + * @method $this zrem($key, $member) + * @method $this zremrangebyrank($key, $start, $stop) + * @method $this zremrangebyscore($key, $min, $max) + * @method $this zrevrange($key, $start, $stop, array $options = null) + * @method $this zrevrangebyscore($key, $min, $max, array $options = null) + * @method $this zrevrank($key, $member) + * @method $this zunionstore($destination, array $keys, array $options = null) + * @method $this zscore($key, $member) + * @method $this zscan($key, $cursor, array $options = null) + * @method $this zrangebylex($key, $start, $stop, array $options = null) + * @method $this zremrangebylex($key, $min, $max) + * @method $this zlexcount($key, $min, $max) + * @method $this pfadd($key, array $elements) + * @method $this pfmerge($destinationKey, array $sourceKeys) + * @method $this pfcount(array $keys) + * @method $this pubsub($subcommand, $argument) + * @method $this publish($channel, $message) + * @method $this discard() + * @method $this exec() + * @method $this multi() + * @method $this unwatch() + * @method $this watch($key) + * @method $this eval($script, $numkeys, $keyOrArg1 = null, $keyOrArgN = null) + * @method $this evalsha($script, $numkeys, $keyOrArg1 = null, $keyOrArgN = null) + * @method $this script($subcommand, $argument = null) + * @method $this auth($password) + * @method $this echo($message) + * @method $this ping($message = null) + * @method $this select($database) + * @method $this bgrewriteaof() + * @method $this bgsave() + * @method $this client($subcommand, $argument = null) + * @method $this config($subcommand, $argument = null) + * @method $this dbsize() + * @method $this flushall() + * @method $this flushdb() + * @method $this info($section = null) + * @method $this lastsave() + * @method $this save() + * @method $this slaveof($host, $port) + * @method $this slowlog($subcommand, $argument = null) + * @method $this time() + * @method $this command() + * + * @author Daniele Alessandri + */ +interface ClientContextInterface +{ + /** + * Sends the specified command instance to Redis. + * + * @param CommandInterface $command Command instance. + * + * @return mixed + */ + public function executeCommand(CommandInterface $command); + + /** + * Sends the specified command with its arguments to Redis. + * + * @param string $method Command ID. + * @param array $arguments Arguments for the command. + * + * @return mixed + */ + public function __call($method, $arguments); + + /** + * Starts the execution of the context. + * + * @param mixed $callable Optional callback for execution. + * + * @return array + */ + public function execute($callable = null); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientException.php new file mode 100755 index 00000000..6c07aaf0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis; + +/** + * Exception class that identifies client-side errors. + * + * @author Daniele Alessandri + */ +class ClientException extends PredisException +{ +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientInterface.php new file mode 100755 index 00000000..f216c470 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientInterface.php @@ -0,0 +1,230 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis; + +use Predis\Command\CommandInterface; +use Predis\Configuration\OptionsInterface; +use Predis\Connection\ConnectionInterface; +use Predis\Profile\ProfileInterface; + +/** + * Interface defining a client able to execute commands against Redis. + * + * All the commands exposed by the client generally have the same signature as + * described by the Redis documentation, but some of them offer an additional + * and more friendly interface to ease programming which is described in the + * following list of methods: + * + * @method int del(array $keys) + * @method string dump($key) + * @method int exists($key) + * @method int expire($key, $seconds) + * @method int expireat($key, $timestamp) + * @method array keys($pattern) + * @method int move($key, $db) + * @method mixed object($subcommand, $key) + * @method int persist($key) + * @method int pexpire($key, $milliseconds) + * @method int pexpireat($key, $timestamp) + * @method int pttl($key) + * @method string randomkey() + * @method mixed rename($key, $target) + * @method int renamenx($key, $target) + * @method array scan($cursor, array $options = null) + * @method array sort($key, array $options = null) + * @method int ttl($key) + * @method mixed type($key) + * @method int append($key, $value) + * @method int bitcount($key, $start = null, $end = null) + * @method int bitop($operation, $destkey, $key) + * @method int decr($key) + * @method int decrby($key, $decrement) + * @method string get($key) + * @method int getbit($key, $offset) + * @method string getrange($key, $start, $end) + * @method string getset($key, $value) + * @method int incr($key) + * @method int incrby($key, $increment) + * @method string incrbyfloat($key, $increment) + * @method array mget(array $keys) + * @method mixed mset(array $dictionary) + * @method int msetnx(array $dictionary) + * @method mixed psetex($key, $milliseconds, $value) + * @method mixed set($key, $value, $expireResolution = null, $expireTTL = null, $flag = null) + * @method int setbit($key, $offset, $value) + * @method int setex($key, $seconds, $value) + * @method int setnx($key, $value) + * @method int setrange($key, $offset, $value) + * @method int strlen($key) + * @method int hdel($key, array $fields) + * @method int hexists($key, $field) + * @method string hget($key, $field) + * @method array hgetall($key) + * @method int hincrby($key, $field, $increment) + * @method string hincrbyfloat($key, $field, $increment) + * @method array hkeys($key) + * @method int hlen($key) + * @method array hmget($key, array $fields) + * @method mixed hmset($key, array $dictionary) + * @method array hscan($key, $cursor, array $options = null) + * @method int hset($key, $field, $value) + * @method int hsetnx($key, $field, $value) + * @method array hvals($key) + * @method array blpop(array $keys, $timeout) + * @method array brpop(array $keys, $timeout) + * @method array brpoplpush($source, $destination, $timeout) + * @method string lindex($key, $index) + * @method int linsert($key, $whence, $pivot, $value) + * @method int llen($key) + * @method string lpop($key) + * @method int lpush($key, array $values) + * @method int lpushx($key, $value) + * @method array lrange($key, $start, $stop) + * @method int lrem($key, $count, $value) + * @method mixed lset($key, $index, $value) + * @method mixed ltrim($key, $start, $stop) + * @method string rpop($key) + * @method string rpoplpush($source, $destination) + * @method int rpush($key, array $values) + * @method int rpushx($key, $value) + * @method int sadd($key, array $members) + * @method int scard($key) + * @method array sdiff(array $keys) + * @method int sdiffstore($destination, array $keys) + * @method array sinter(array $keys) + * @method int sinterstore($destination, array $keys) + * @method int sismember($key, $member) + * @method array smembers($key) + * @method int smove($source, $destination, $member) + * @method string spop($key) + * @method string srandmember($key, $count = null) + * @method int srem($key, $member) + * @method array sscan($key, $cursor, array $options = null) + * @method array sunion(array $keys) + * @method int sunionstore($destination, array $keys) + * @method int zadd($key, array $membersAndScoresDictionary) + * @method int zcard($key) + * @method string zcount($key, $min, $max) + * @method string zincrby($key, $increment, $member) + * @method int zinterstore($destination, array $keys, array $options = null) + * @method array zrange($key, $start, $stop, array $options = null) + * @method array zrangebyscore($key, $min, $max, array $options = null) + * @method int zrank($key, $member) + * @method int zrem($key, $member) + * @method int zremrangebyrank($key, $start, $stop) + * @method int zremrangebyscore($key, $min, $max) + * @method array zrevrange($key, $start, $stop, array $options = null) + * @method array zrevrangebyscore($key, $min, $max, array $options = null) + * @method int zrevrank($key, $member) + * @method int zunionstore($destination, array $keys, array $options = null) + * @method string zscore($key, $member) + * @method array zscan($key, $cursor, array $options = null) + * @method array zrangebylex($key, $start, $stop, array $options = null) + * @method int zremrangebylex($key, $min, $max) + * @method int zlexcount($key, $min, $max) + * @method int pfadd($key, array $elements) + * @method mixed pfmerge($destinationKey, array $sourceKeys) + * @method int pfcount(array $keys) + * @method mixed pubsub($subcommand, $argument) + * @method int publish($channel, $message) + * @method mixed discard() + * @method array exec() + * @method mixed multi() + * @method mixed unwatch() + * @method mixed watch($key) + * @method mixed eval($script, $numkeys, $keyOrArg1 = null, $keyOrArgN = null) + * @method mixed evalsha($script, $numkeys, $keyOrArg1 = null, $keyOrArgN = null) + * @method mixed script($subcommand, $argument = null) + * @method mixed auth($password) + * @method string echo($message) + * @method mixed ping($message = null) + * @method mixed select($database) + * @method mixed bgrewriteaof() + * @method mixed bgsave() + * @method mixed client($subcommand, $argument = null) + * @method mixed config($subcommand, $argument = null) + * @method int dbsize() + * @method mixed flushall() + * @method mixed flushdb() + * @method array info($section = null) + * @method int lastsave() + * @method mixed save() + * @method mixed slaveof($host, $port) + * @method mixed slowlog($subcommand, $argument = null) + * @method array time() + * @method array command() + * + * @author Daniele Alessandri + */ +interface ClientInterface +{ + /** + * Returns the server profile used by the client. + * + * @return ProfileInterface + */ + public function getProfile(); + + /** + * Returns the client options specified upon initialization. + * + * @return OptionsInterface + */ + public function getOptions(); + + /** + * Opens the underlying connection to the server. + */ + public function connect(); + + /** + * Closes the underlying connection from the server. + */ + public function disconnect(); + + /** + * Returns the underlying connection instance. + * + * @return ConnectionInterface + */ + public function getConnection(); + + /** + * Creates a new instance of the specified Redis command. + * + * @param string $method Command ID. + * @param array $arguments Arguments for the command. + * + * @return CommandInterface + */ + public function createCommand($method, $arguments = array()); + + /** + * Executes the specified Redis command. + * + * @param CommandInterface $command Command instance. + * + * @return mixed + */ + public function executeCommand(CommandInterface $command); + + /** + * Creates a Redis command with the specified arguments and sends a request + * to the server. + * + * @param string $method Command ID. + * @param array $arguments Arguments for the command. + * + * @return mixed + */ + public function __call($method, $arguments); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/ClusterStrategy.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/ClusterStrategy.php new file mode 100755 index 00000000..7635000e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/ClusterStrategy.php @@ -0,0 +1,398 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Cluster; + +use Predis\Command\CommandInterface; +use Predis\Command\ScriptCommand; + +/** + * Common class implementing the logic needed to support clustering strategies. + * + * @author Daniele Alessandri + */ +abstract class ClusterStrategy implements StrategyInterface +{ + protected $commands; + + /** + * + */ + public function __construct() + { + $this->commands = $this->getDefaultCommands(); + } + + /** + * Returns the default map of supported commands with their handlers. + * + * @return array + */ + protected function getDefaultCommands() + { + $getKeyFromFirstArgument = array($this, 'getKeyFromFirstArgument'); + $getKeyFromAllArguments = array($this, 'getKeyFromAllArguments'); + + return array( + /* commands operating on the key space */ + 'EXISTS' => $getKeyFromFirstArgument, + 'DEL' => $getKeyFromAllArguments, + 'TYPE' => $getKeyFromFirstArgument, + 'EXPIRE' => $getKeyFromFirstArgument, + 'EXPIREAT' => $getKeyFromFirstArgument, + 'PERSIST' => $getKeyFromFirstArgument, + 'PEXPIRE' => $getKeyFromFirstArgument, + 'PEXPIREAT' => $getKeyFromFirstArgument, + 'TTL' => $getKeyFromFirstArgument, + 'PTTL' => $getKeyFromFirstArgument, + 'SORT' => $getKeyFromFirstArgument, // TODO + 'DUMP' => $getKeyFromFirstArgument, + 'RESTORE' => $getKeyFromFirstArgument, + + /* commands operating on string values */ + 'APPEND' => $getKeyFromFirstArgument, + 'DECR' => $getKeyFromFirstArgument, + 'DECRBY' => $getKeyFromFirstArgument, + 'GET' => $getKeyFromFirstArgument, + 'GETBIT' => $getKeyFromFirstArgument, + 'MGET' => $getKeyFromAllArguments, + 'SET' => $getKeyFromFirstArgument, + 'GETRANGE' => $getKeyFromFirstArgument, + 'GETSET' => $getKeyFromFirstArgument, + 'INCR' => $getKeyFromFirstArgument, + 'INCRBY' => $getKeyFromFirstArgument, + 'INCRBYFLOAT' => $getKeyFromFirstArgument, + 'SETBIT' => $getKeyFromFirstArgument, + 'SETEX' => $getKeyFromFirstArgument, + 'MSET' => array($this, 'getKeyFromInterleavedArguments'), + 'MSETNX' => array($this, 'getKeyFromInterleavedArguments'), + 'SETNX' => $getKeyFromFirstArgument, + 'SETRANGE' => $getKeyFromFirstArgument, + 'STRLEN' => $getKeyFromFirstArgument, + 'SUBSTR' => $getKeyFromFirstArgument, + 'BITOP' => array($this, 'getKeyFromBitOp'), + 'BITCOUNT' => $getKeyFromFirstArgument, + + /* commands operating on lists */ + 'LINSERT' => $getKeyFromFirstArgument, + 'LINDEX' => $getKeyFromFirstArgument, + 'LLEN' => $getKeyFromFirstArgument, + 'LPOP' => $getKeyFromFirstArgument, + 'RPOP' => $getKeyFromFirstArgument, + 'RPOPLPUSH' => $getKeyFromAllArguments, + 'BLPOP' => array($this, 'getKeyFromBlockingListCommands'), + 'BRPOP' => array($this, 'getKeyFromBlockingListCommands'), + 'BRPOPLPUSH' => array($this, 'getKeyFromBlockingListCommands'), + 'LPUSH' => $getKeyFromFirstArgument, + 'LPUSHX' => $getKeyFromFirstArgument, + 'RPUSH' => $getKeyFromFirstArgument, + 'RPUSHX' => $getKeyFromFirstArgument, + 'LRANGE' => $getKeyFromFirstArgument, + 'LREM' => $getKeyFromFirstArgument, + 'LSET' => $getKeyFromFirstArgument, + 'LTRIM' => $getKeyFromFirstArgument, + + /* commands operating on sets */ + 'SADD' => $getKeyFromFirstArgument, + 'SCARD' => $getKeyFromFirstArgument, + 'SDIFF' => $getKeyFromAllArguments, + 'SDIFFSTORE' => $getKeyFromAllArguments, + 'SINTER' => $getKeyFromAllArguments, + 'SINTERSTORE' => $getKeyFromAllArguments, + 'SUNION' => $getKeyFromAllArguments, + 'SUNIONSTORE' => $getKeyFromAllArguments, + 'SISMEMBER' => $getKeyFromFirstArgument, + 'SMEMBERS' => $getKeyFromFirstArgument, + 'SSCAN' => $getKeyFromFirstArgument, + 'SPOP' => $getKeyFromFirstArgument, + 'SRANDMEMBER' => $getKeyFromFirstArgument, + 'SREM' => $getKeyFromFirstArgument, + + /* commands operating on sorted sets */ + 'ZADD' => $getKeyFromFirstArgument, + 'ZCARD' => $getKeyFromFirstArgument, + 'ZCOUNT' => $getKeyFromFirstArgument, + 'ZINCRBY' => $getKeyFromFirstArgument, + 'ZINTERSTORE' => array($this, 'getKeyFromZsetAggregationCommands'), + 'ZRANGE' => $getKeyFromFirstArgument, + 'ZRANGEBYSCORE' => $getKeyFromFirstArgument, + 'ZRANK' => $getKeyFromFirstArgument, + 'ZREM' => $getKeyFromFirstArgument, + 'ZREMRANGEBYRANK' => $getKeyFromFirstArgument, + 'ZREMRANGEBYSCORE' => $getKeyFromFirstArgument, + 'ZREVRANGE' => $getKeyFromFirstArgument, + 'ZREVRANGEBYSCORE' => $getKeyFromFirstArgument, + 'ZREVRANK' => $getKeyFromFirstArgument, + 'ZSCORE' => $getKeyFromFirstArgument, + 'ZUNIONSTORE' => array($this, 'getKeyFromZsetAggregationCommands'), + 'ZSCAN' => $getKeyFromFirstArgument, + 'ZLEXCOUNT' => $getKeyFromFirstArgument, + 'ZRANGEBYLEX' => $getKeyFromFirstArgument, + 'ZREMRANGEBYLEX' => $getKeyFromFirstArgument, + 'ZREVRANGEBYLEX' => $getKeyFromFirstArgument, + + /* commands operating on hashes */ + 'HDEL' => $getKeyFromFirstArgument, + 'HEXISTS' => $getKeyFromFirstArgument, + 'HGET' => $getKeyFromFirstArgument, + 'HGETALL' => $getKeyFromFirstArgument, + 'HMGET' => $getKeyFromFirstArgument, + 'HMSET' => $getKeyFromFirstArgument, + 'HINCRBY' => $getKeyFromFirstArgument, + 'HINCRBYFLOAT' => $getKeyFromFirstArgument, + 'HKEYS' => $getKeyFromFirstArgument, + 'HLEN' => $getKeyFromFirstArgument, + 'HSET' => $getKeyFromFirstArgument, + 'HSETNX' => $getKeyFromFirstArgument, + 'HVALS' => $getKeyFromFirstArgument, + 'HSCAN' => $getKeyFromFirstArgument, + 'HSTRLEN' => $getKeyFromFirstArgument, + + /* commands operating on HyperLogLog */ + 'PFADD' => $getKeyFromFirstArgument, + 'PFCOUNT' => $getKeyFromAllArguments, + 'PFMERGE' => $getKeyFromAllArguments, + + /* scripting */ + 'EVAL' => array($this, 'getKeyFromScriptingCommands'), + 'EVALSHA' => array($this, 'getKeyFromScriptingCommands'), + ); + } + + /** + * Returns the list of IDs for the supported commands. + * + * @return array + */ + public function getSupportedCommands() + { + return array_keys($this->commands); + } + + /** + * Sets an handler for the specified command ID. + * + * The signature of the callback must have a single parameter of type + * Predis\Command\CommandInterface. + * + * When the callback argument is omitted or NULL, the previously associated + * handler for the specified command ID is removed. + * + * @param string $commandID Command ID. + * @param mixed $callback A valid callable object, or NULL to unset the handler. + * + * @throws \InvalidArgumentException + */ + public function setCommandHandler($commandID, $callback = null) + { + $commandID = strtoupper($commandID); + + if (!isset($callback)) { + unset($this->commands[$commandID]); + + return; + } + + if (!is_callable($callback)) { + throw new \InvalidArgumentException( + 'The argument must be a callable object or NULL.' + ); + } + + $this->commands[$commandID] = $callback; + } + + /** + * Extracts the key from the first argument of a command instance. + * + * @param CommandInterface $command Command instance. + * + * @return string + */ + protected function getKeyFromFirstArgument(CommandInterface $command) + { + return $command->getArgument(0); + } + + /** + * Extracts the key from a command with multiple keys only when all keys in + * the arguments array produce the same hash. + * + * @param CommandInterface $command Command instance. + * + * @return string|null + */ + protected function getKeyFromAllArguments(CommandInterface $command) + { + $arguments = $command->getArguments(); + + if ($this->checkSameSlotForKeys($arguments)) { + return $arguments[0]; + } + } + + /** + * Extracts the key from a command with multiple keys only when all keys in + * the arguments array produce the same hash. + * + * @param CommandInterface $command Command instance. + * + * @return string|null + */ + protected function getKeyFromInterleavedArguments(CommandInterface $command) + { + $arguments = $command->getArguments(); + $keys = array(); + + for ($i = 0; $i < count($arguments); $i += 2) { + $keys[] = $arguments[$i]; + } + + if ($this->checkSameSlotForKeys($keys)) { + return $arguments[0]; + } + } + + /** + * Extracts the key from BLPOP and BRPOP commands. + * + * @param CommandInterface $command Command instance. + * + * @return string|null + */ + protected function getKeyFromBlockingListCommands(CommandInterface $command) + { + $arguments = $command->getArguments(); + + if ($this->checkSameSlotForKeys(array_slice($arguments, 0, count($arguments) - 1))) { + return $arguments[0]; + } + } + + /** + * Extracts the key from BITOP command. + * + * @param CommandInterface $command Command instance. + * + * @return string|null + */ + protected function getKeyFromBitOp(CommandInterface $command) + { + $arguments = $command->getArguments(); + + if ($this->checkSameSlotForKeys(array_slice($arguments, 1, count($arguments)))) { + return $arguments[1]; + } + } + + /** + * Extracts the key from ZINTERSTORE and ZUNIONSTORE commands. + * + * @param CommandInterface $command Command instance. + * + * @return string|null + */ + protected function getKeyFromZsetAggregationCommands(CommandInterface $command) + { + $arguments = $command->getArguments(); + $keys = array_merge(array($arguments[0]), array_slice($arguments, 2, $arguments[1])); + + if ($this->checkSameSlotForKeys($keys)) { + return $arguments[0]; + } + } + + /** + * Extracts the key from EVAL and EVALSHA commands. + * + * @param CommandInterface $command Command instance. + * + * @return string|null + */ + protected function getKeyFromScriptingCommands(CommandInterface $command) + { + if ($command instanceof ScriptCommand) { + $keys = $command->getKeys(); + } else { + $keys = array_slice($args = $command->getArguments(), 2, $args[1]); + } + + if ($keys && $this->checkSameSlotForKeys($keys)) { + return $keys[0]; + } + } + + /** + * {@inheritdoc} + */ + public function getSlot(CommandInterface $command) + { + $slot = $command->getSlot(); + + if (!isset($slot) && isset($this->commands[$cmdID = $command->getId()])) { + $key = call_user_func($this->commands[$cmdID], $command); + + if (isset($key)) { + $slot = $this->getSlotByKey($key); + $command->setSlot($slot); + } + } + + return $slot; + } + + /** + * Checks if the specified array of keys will generate the same hash. + * + * @param array $keys Array of keys. + * + * @return bool + */ + protected function checkSameSlotForKeys(array $keys) + { + if (!$count = count($keys)) { + return false; + } + + $currentSlot = $this->getSlotByKey($keys[0]); + + for ($i = 1; $i < $count; ++$i) { + $nextSlot = $this->getSlotByKey($keys[$i]); + + if ($currentSlot !== $nextSlot) { + return false; + } + + $currentSlot = $nextSlot; + } + + return true; + } + + /** + * Returns only the hashable part of a key (delimited by "{...}"), or the + * whole key if a key tag is not found in the string. + * + * @param string $key A key. + * + * @return string + */ + protected function extractKeyTag($key) + { + if (false !== $start = strpos($key, '{')) { + if (false !== ($end = strpos($key, '}', $start)) && $end !== ++$start) { + $key = substr($key, $start, $end - $start); + } + } + + return $key; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/DistributorInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/DistributorInterface.php new file mode 100755 index 00000000..831f52c5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/DistributorInterface.php @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Cluster\Distributor; + +use Predis\Cluster\Hash\HashGeneratorInterface; + +/** + * A distributor implements the logic to automatically distribute keys among + * several nodes for client-side sharding. + * + * @author Daniele Alessandri + */ +interface DistributorInterface +{ + /** + * Adds a node to the distributor with an optional weight. + * + * @param mixed $node Node object. + * @param int $weight Weight for the node. + */ + public function add($node, $weight = null); + + /** + * Removes a node from the distributor. + * + * @param mixed $node Node object. + */ + public function remove($node); + + /** + * Returns the corresponding slot of a node from the distributor using the + * computed hash of a key. + * + * @param mixed $hash + * + * @return mixed + */ + public function getSlot($hash); + + /** + * Returns a node from the distributor using its assigned slot ID. + * + * @param mixed $slot + * + * @return mixed|null + */ + public function getBySlot($slot); + + /** + * Returns a node from the distributor using the computed hash of a key. + * + * @param mixed $hash + * + * @return mixed + */ + public function getByHash($hash); + + /** + * Returns a node from the distributor mapping to the specified value. + * + * @param string $value + * + * @return mixed + */ + public function get($value); + + /** + * Returns the underlying hash generator instance. + * + * @return HashGeneratorInterface + */ + public function getHashGenerator(); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/EmptyRingException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/EmptyRingException.php new file mode 100755 index 00000000..039f2f2e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/EmptyRingException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Cluster\Distributor; + +/** + * Exception class that identifies empty rings. + * + * @author Daniele Alessandri + */ +class EmptyRingException extends \Exception +{ +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/HashRing.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/HashRing.php new file mode 100755 index 00000000..db864d91 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/HashRing.php @@ -0,0 +1,270 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Cluster\Distributor; + +use Predis\Cluster\Hash\HashGeneratorInterface; + +/** + * This class implements an hashring-based distributor that uses the same + * algorithm of memcache to distribute keys in a cluster using client-side + * sharding. + * + * @author Daniele Alessandri + * @author Lorenzo Castelli + */ +class HashRing implements DistributorInterface, HashGeneratorInterface +{ + const DEFAULT_REPLICAS = 128; + const DEFAULT_WEIGHT = 100; + + private $ring; + private $ringKeys; + private $ringKeysCount; + private $replicas; + private $nodeHashCallback; + private $nodes = array(); + + /** + * @param int $replicas Number of replicas in the ring. + * @param mixed $nodeHashCallback Callback returning a string used to calculate the hash of nodes. + */ + public function __construct($replicas = self::DEFAULT_REPLICAS, $nodeHashCallback = null) + { + $this->replicas = $replicas; + $this->nodeHashCallback = $nodeHashCallback; + } + + /** + * Adds a node to the ring with an optional weight. + * + * @param mixed $node Node object. + * @param int $weight Weight for the node. + */ + public function add($node, $weight = null) + { + // In case of collisions in the hashes of the nodes, the node added + // last wins, thus the order in which nodes are added is significant. + $this->nodes[] = array( + 'object' => $node, + 'weight' => (int) $weight ?: $this::DEFAULT_WEIGHT, + ); + + $this->reset(); + } + + /** + * {@inheritdoc} + */ + public function remove($node) + { + // A node is removed by resetting the ring so that it's recreated from + // scratch, in order to reassign possible hashes with collisions to the + // right node according to the order in which they were added in the + // first place. + for ($i = 0; $i < count($this->nodes); ++$i) { + if ($this->nodes[$i]['object'] === $node) { + array_splice($this->nodes, $i, 1); + $this->reset(); + + break; + } + } + } + + /** + * Resets the distributor. + */ + private function reset() + { + unset( + $this->ring, + $this->ringKeys, + $this->ringKeysCount + ); + } + + /** + * Returns the initialization status of the distributor. + * + * @return bool + */ + private function isInitialized() + { + return isset($this->ringKeys); + } + + /** + * Calculates the total weight of all the nodes in the distributor. + * + * @return int + */ + private function computeTotalWeight() + { + $totalWeight = 0; + + foreach ($this->nodes as $node) { + $totalWeight += $node['weight']; + } + + return $totalWeight; + } + + /** + * Initializes the distributor. + */ + private function initialize() + { + if ($this->isInitialized()) { + return; + } + + if (!$this->nodes) { + throw new EmptyRingException('Cannot initialize an empty hashring.'); + } + + $this->ring = array(); + $totalWeight = $this->computeTotalWeight(); + $nodesCount = count($this->nodes); + + foreach ($this->nodes as $node) { + $weightRatio = $node['weight'] / $totalWeight; + $this->addNodeToRing($this->ring, $node, $nodesCount, $this->replicas, $weightRatio); + } + + ksort($this->ring, SORT_NUMERIC); + $this->ringKeys = array_keys($this->ring); + $this->ringKeysCount = count($this->ringKeys); + } + + /** + * Implements the logic needed to add a node to the hashring. + * + * @param array $ring Source hashring. + * @param mixed $node Node object to be added. + * @param int $totalNodes Total number of nodes. + * @param int $replicas Number of replicas in the ring. + * @param float $weightRatio Weight ratio for the node. + */ + protected function addNodeToRing(&$ring, $node, $totalNodes, $replicas, $weightRatio) + { + $nodeObject = $node['object']; + $nodeHash = $this->getNodeHash($nodeObject); + $replicas = (int) round($weightRatio * $totalNodes * $replicas); + + for ($i = 0; $i < $replicas; ++$i) { + $key = crc32("$nodeHash:$i"); + $ring[$key] = $nodeObject; + } + } + + /** + * {@inheritdoc} + */ + protected function getNodeHash($nodeObject) + { + if (!isset($this->nodeHashCallback)) { + return (string) $nodeObject; + } + + return call_user_func($this->nodeHashCallback, $nodeObject); + } + + /** + * {@inheritdoc} + */ + public function hash($value) + { + return crc32($value); + } + + /** + * {@inheritdoc} + */ + public function getByHash($hash) + { + return $this->ring[$this->getSlot($hash)]; + } + + /** + * {@inheritdoc} + */ + public function getBySlot($slot) + { + $this->initialize(); + + if (isset($this->ring[$slot])) { + return $this->ring[$slot]; + } + } + + /** + * {@inheritdoc} + */ + public function getSlot($hash) + { + $this->initialize(); + + $ringKeys = $this->ringKeys; + $upper = $this->ringKeysCount - 1; + $lower = 0; + + while ($lower <= $upper) { + $index = ($lower + $upper) >> 1; + $item = $ringKeys[$index]; + + if ($item > $hash) { + $upper = $index - 1; + } elseif ($item < $hash) { + $lower = $index + 1; + } else { + return $item; + } + } + + return $ringKeys[$this->wrapAroundStrategy($upper, $lower, $this->ringKeysCount)]; + } + + /** + * {@inheritdoc} + */ + public function get($value) + { + $hash = $this->hash($value); + $node = $this->getByHash($hash); + + return $node; + } + + /** + * Implements a strategy to deal with wrap-around errors during binary searches. + * + * @param int $upper + * @param int $lower + * @param int $ringKeysCount + * + * @return int + */ + protected function wrapAroundStrategy($upper, $lower, $ringKeysCount) + { + // Binary search for the last item in ringkeys with a value less or + // equal to the key. If no such item exists, return the last item. + return $upper >= 0 ? $upper : $ringKeysCount - 1; + } + + /** + * {@inheritdoc} + */ + public function getHashGenerator() + { + return $this; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/KetamaRing.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/KetamaRing.php new file mode 100755 index 00000000..dc77f320 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/KetamaRing.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Cluster\Distributor; + +/** + * This class implements an hashring-based distributor that uses the same + * algorithm of libketama to distribute keys in a cluster using client-side + * sharding. + * + * @author Daniele Alessandri + * @author Lorenzo Castelli + */ +class KetamaRing extends HashRing +{ + const DEFAULT_REPLICAS = 160; + + /** + * @param mixed $nodeHashCallback Callback returning a string used to calculate the hash of nodes. + */ + public function __construct($nodeHashCallback = null) + { + parent::__construct($this::DEFAULT_REPLICAS, $nodeHashCallback); + } + + /** + * {@inheritdoc} + */ + protected function addNodeToRing(&$ring, $node, $totalNodes, $replicas, $weightRatio) + { + $nodeObject = $node['object']; + $nodeHash = $this->getNodeHash($nodeObject); + $replicas = (int) floor($weightRatio * $totalNodes * ($replicas / 4)); + + for ($i = 0; $i < $replicas; ++$i) { + $unpackedDigest = unpack('V4', md5("$nodeHash-$i", true)); + + foreach ($unpackedDigest as $key) { + $ring[$key] = $nodeObject; + } + } + } + + /** + * {@inheritdoc} + */ + public function hash($value) + { + $hash = unpack('V', md5($value, true)); + + return $hash[1]; + } + + /** + * {@inheritdoc} + */ + protected function wrapAroundStrategy($upper, $lower, $ringKeysCount) + { + // Binary search for the first item in ringkeys with a value greater + // or equal to the key. If no such item exists, return the first item. + return $lower < $ringKeysCount ? $lower : 0; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Hash/CRC16.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Hash/CRC16.php new file mode 100755 index 00000000..3add0cef --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Hash/CRC16.php @@ -0,0 +1,72 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Cluster\Hash; + +/** + * Hash generator implementing the CRC-CCITT-16 algorithm used by redis-cluster. + * + * @author Daniele Alessandri + */ +class CRC16 implements HashGeneratorInterface +{ + private static $CCITT_16 = array( + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, + 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, + 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, + 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, + 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, + 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, + 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, + 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, + 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, + 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, + 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, + 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, + 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, + 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, + 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, + 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, + 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, + 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, + 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, + 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, + 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, + 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, + 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0, + ); + + /** + * {@inheritdoc} + */ + public function hash($value) + { + // CRC-CCITT-16 algorithm + $crc = 0; + $CCITT_16 = self::$CCITT_16; + $strlen = strlen($value); + + for ($i = 0; $i < $strlen; ++$i) { + $crc = (($crc << 8) ^ $CCITT_16[($crc >> 8) ^ ord($value[$i])]) & 0xFFFF; + } + + return $crc; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Hash/HashGeneratorInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Hash/HashGeneratorInterface.php new file mode 100755 index 00000000..271b9e72 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Hash/HashGeneratorInterface.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Cluster\Hash; + +/** + * An hash generator implements the logic used to calculate the hash of a key to + * distribute operations among Redis nodes. + * + * @author Daniele Alessandri + */ +interface HashGeneratorInterface +{ + /** + * Generates an hash from a string to be used for distribution. + * + * @param string $value String value. + * + * @return int + */ + public function hash($value); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/PredisStrategy.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/PredisStrategy.php new file mode 100755 index 00000000..20668427 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/PredisStrategy.php @@ -0,0 +1,79 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Cluster; + +use Predis\Cluster\Distributor\DistributorInterface; +use Predis\Cluster\Distributor\HashRing; + +/** + * Default cluster strategy used by Predis to handle client-side sharding. + * + * @author Daniele Alessandri + */ +class PredisStrategy extends ClusterStrategy +{ + protected $distributor; + + /** + * @param DistributorInterface $distributor Optional distributor instance. + */ + public function __construct(DistributorInterface $distributor = null) + { + parent::__construct(); + + $this->distributor = $distributor ?: new HashRing(); + } + + /** + * {@inheritdoc} + */ + public function getSlotByKey($key) + { + $key = $this->extractKeyTag($key); + $hash = $this->distributor->hash($key); + $slot = $this->distributor->getSlot($hash); + + return $slot; + } + + /** + * {@inheritdoc} + */ + protected function checkSameSlotForKeys(array $keys) + { + if (!$count = count($keys)) { + return false; + } + + $currentKey = $this->extractKeyTag($keys[0]); + + for ($i = 1; $i < $count; ++$i) { + $nextKey = $this->extractKeyTag($keys[$i]); + + if ($currentKey !== $nextKey) { + return false; + } + + $currentKey = $nextKey; + } + + return true; + } + + /** + * {@inheritdoc} + */ + public function getDistributor() + { + return $this->distributor; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/RedisStrategy.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/RedisStrategy.php new file mode 100755 index 00000000..df0bdb49 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/RedisStrategy.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Cluster; + +use Predis\Cluster\Hash\CRC16; +use Predis\Cluster\Hash\HashGeneratorInterface; +use Predis\NotSupportedException; + +/** + * Default class used by Predis to calculate hashes out of keys of + * commands supported by redis-cluster. + * + * @author Daniele Alessandri + */ +class RedisStrategy extends ClusterStrategy +{ + protected $hashGenerator; + + /** + * @param HashGeneratorInterface $hashGenerator Hash generator instance. + */ + public function __construct(HashGeneratorInterface $hashGenerator = null) + { + parent::__construct(); + + $this->hashGenerator = $hashGenerator ?: new CRC16(); + } + + /** + * {@inheritdoc} + */ + public function getSlotByKey($key) + { + $key = $this->extractKeyTag($key); + $slot = $this->hashGenerator->hash($key) & 0x3FFF; + + return $slot; + } + + /** + * {@inheritdoc} + */ + public function getDistributor() + { + throw new NotSupportedException( + 'This cluster strategy does not provide an external distributor' + ); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/StrategyInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/StrategyInterface.php new file mode 100755 index 00000000..cdf7d09f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/StrategyInterface.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Cluster; + +use Predis\Cluster\Distributor\DistributorInterface; +use Predis\Command\CommandInterface; + +/** + * Interface for classes defining the strategy used to calculate an hash out of + * keys extracted from supported commands. + * + * This is mostly useful to support clustering via client-side sharding. + * + * @author Daniele Alessandri + */ +interface StrategyInterface +{ + /** + * Returns a slot for the given command used for clustering distribution or + * NULL when this is not possible. + * + * @param CommandInterface $command Command instance. + * + * @return int + */ + public function getSlot(CommandInterface $command); + + /** + * Returns a slot for the given key used for clustering distribution or NULL + * when this is not possible. + * + * @param string $key Key string. + * + * @return int + */ + public function getSlotByKey($key); + + /** + * Returns a distributor instance to be used by the cluster. + * + * @return DistributorInterface + */ + public function getDistributor(); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/CursorBasedIterator.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/CursorBasedIterator.php new file mode 100755 index 00000000..922883f0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/CursorBasedIterator.php @@ -0,0 +1,191 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Collection\Iterator; + +use Predis\ClientInterface; +use Predis\NotSupportedException; + +/** + * Provides the base implementation for a fully-rewindable PHP iterator that can + * incrementally iterate over cursor-based collections stored on Redis using the + * commands in the `SCAN` family. + * + * Given their incremental nature with multiple fetches, these kind of iterators + * offer limited guarantees about the returned elements because the collection + * can change several times during the iteration process. + * + * @see http://redis.io/commands/scan + * + * @author Daniele Alessandri + */ +abstract class CursorBasedIterator implements \Iterator +{ + protected $client; + protected $match; + protected $count; + + protected $valid; + protected $fetchmore; + protected $elements; + protected $cursor; + protected $position; + protected $current; + + /** + * @param ClientInterface $client Client connected to Redis. + * @param string $match Pattern to match during the server-side iteration. + * @param int $count Hint used by Redis to compute the number of results per iteration. + */ + public function __construct(ClientInterface $client, $match = null, $count = null) + { + $this->client = $client; + $this->match = $match; + $this->count = $count; + + $this->reset(); + } + + /** + * Ensures that the client supports the specified Redis command required to + * fetch elements from the server to perform the iteration. + * + * @param ClientInterface $client Client connected to Redis. + * @param string $commandID Command ID. + * + * @throws NotSupportedException + */ + protected function requiredCommand(ClientInterface $client, $commandID) + { + if (!$client->getProfile()->supportsCommand($commandID)) { + throw new NotSupportedException("The current profile does not support '$commandID'."); + } + } + + /** + * Resets the inner state of the iterator. + */ + protected function reset() + { + $this->valid = true; + $this->fetchmore = true; + $this->elements = array(); + $this->cursor = 0; + $this->position = -1; + $this->current = null; + } + + /** + * Returns an array of options for the `SCAN` command. + * + * @return array + */ + protected function getScanOptions() + { + $options = array(); + + if (strlen($this->match) > 0) { + $options['MATCH'] = $this->match; + } + + if ($this->count > 0) { + $options['COUNT'] = $this->count; + } + + return $options; + } + + /** + * Fetches a new set of elements from the remote collection, effectively + * advancing the iteration process. + * + * @return array + */ + abstract protected function executeCommand(); + + /** + * Populates the local buffer of elements fetched from the server during + * the iteration. + */ + protected function fetch() + { + list($cursor, $elements) = $this->executeCommand(); + + if (!$cursor) { + $this->fetchmore = false; + } + + $this->cursor = $cursor; + $this->elements = $elements; + } + + /** + * Extracts next values for key() and current(). + */ + protected function extractNext() + { + ++$this->position; + $this->current = array_shift($this->elements); + } + + /** + * {@inheritdoc} + */ + public function rewind() + { + $this->reset(); + $this->next(); + } + + /** + * {@inheritdoc} + */ + public function current() + { + return $this->current; + } + + /** + * {@inheritdoc} + */ + public function key() + { + return $this->position; + } + + /** + * {@inheritdoc} + */ + public function next() + { + tryFetch: { + if (!$this->elements && $this->fetchmore) { + $this->fetch(); + } + + if ($this->elements) { + $this->extractNext(); + } elseif ($this->cursor) { + goto tryFetch; + } else { + $this->valid = false; + } + } + } + + /** + * {@inheritdoc} + */ + public function valid() + { + return $this->valid; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/HashKey.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/HashKey.php new file mode 100755 index 00000000..aa8aeaf0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/HashKey.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Collection\Iterator; + +use Predis\ClientInterface; + +/** + * Abstracts the iteration of fields and values of an hash by leveraging the + * HSCAN command (Redis >= 2.8) wrapped in a fully-rewindable PHP iterator. + * + * @author Daniele Alessandri + * + * @link http://redis.io/commands/scan + */ +class HashKey extends CursorBasedIterator +{ + protected $key; + + /** + * {@inheritdoc} + */ + public function __construct(ClientInterface $client, $key, $match = null, $count = null) + { + $this->requiredCommand($client, 'HSCAN'); + + parent::__construct($client, $match, $count); + + $this->key = $key; + } + + /** + * {@inheritdoc} + */ + protected function executeCommand() + { + return $this->client->hscan($this->key, $this->cursor, $this->getScanOptions()); + } + + /** + * {@inheritdoc} + */ + protected function extractNext() + { + $this->position = key($this->elements); + $this->current = array_shift($this->elements); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/Keyspace.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/Keyspace.php new file mode 100755 index 00000000..5d985b9b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/Keyspace.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Collection\Iterator; + +use Predis\ClientInterface; + +/** + * Abstracts the iteration of the keyspace on a Redis instance by leveraging the + * SCAN command (Redis >= 2.8) wrapped in a fully-rewindable PHP iterator. + * + * @author Daniele Alessandri + * + * @link http://redis.io/commands/scan + */ +class Keyspace extends CursorBasedIterator +{ + /** + * {@inheritdoc} + */ + public function __construct(ClientInterface $client, $match = null, $count = null) + { + $this->requiredCommand($client, 'SCAN'); + + parent::__construct($client, $match, $count); + } + + /** + * {@inheritdoc} + */ + protected function executeCommand() + { + return $this->client->scan($this->cursor, $this->getScanOptions()); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/ListKey.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/ListKey.php new file mode 100755 index 00000000..7a6eb479 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/ListKey.php @@ -0,0 +1,176 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Collection\Iterator; + +use Predis\ClientInterface; +use Predis\NotSupportedException; + +/** + * Abstracts the iteration of items stored in a list by leveraging the LRANGE + * command wrapped in a fully-rewindable PHP iterator. + * + * This iterator tries to emulate the behaviour of cursor-based iterators based + * on the SCAN-family of commands introduced in Redis <= 2.8, meaning that due + * to its incremental nature with multiple fetches it can only offer limited + * guarantees on the returned elements because the collection can change several + * times (trimmed, deleted, overwritten) during the iteration process. + * + * @author Daniele Alessandri + * + * @link http://redis.io/commands/lrange + */ +class ListKey implements \Iterator +{ + protected $client; + protected $count; + protected $key; + + protected $valid; + protected $fetchmore; + protected $elements; + protected $position; + protected $current; + + /** + * @param ClientInterface $client Client connected to Redis. + * @param string $key Redis list key. + * @param int $count Number of items retrieved on each fetch operation. + * + * @throws \InvalidArgumentException + */ + public function __construct(ClientInterface $client, $key, $count = 10) + { + $this->requiredCommand($client, 'LRANGE'); + + if ((false === $count = filter_var($count, FILTER_VALIDATE_INT)) || $count < 0) { + throw new \InvalidArgumentException('The $count argument must be a positive integer.'); + } + + $this->client = $client; + $this->key = $key; + $this->count = $count; + + $this->reset(); + } + + /** + * Ensures that the client instance supports the specified Redis command + * required to fetch elements from the server to perform the iteration. + * + * @param ClientInterface $client Client connected to Redis. + * @param string $commandID Command ID. + * + * @throws NotSupportedException + */ + protected function requiredCommand(ClientInterface $client, $commandID) + { + if (!$client->getProfile()->supportsCommand($commandID)) { + throw new NotSupportedException("The current profile does not support '$commandID'."); + } + } + + /** + * Resets the inner state of the iterator. + */ + protected function reset() + { + $this->valid = true; + $this->fetchmore = true; + $this->elements = array(); + $this->position = -1; + $this->current = null; + } + + /** + * Fetches a new set of elements from the remote collection, effectively + * advancing the iteration process. + * + * @return array + */ + protected function executeCommand() + { + return $this->client->lrange($this->key, $this->position + 1, $this->position + $this->count); + } + + /** + * Populates the local buffer of elements fetched from the server during the + * iteration. + */ + protected function fetch() + { + $elements = $this->executeCommand(); + + if (count($elements) < $this->count) { + $this->fetchmore = false; + } + + $this->elements = $elements; + } + + /** + * Extracts next values for key() and current(). + */ + protected function extractNext() + { + ++$this->position; + $this->current = array_shift($this->elements); + } + + /** + * {@inheritdoc} + */ + public function rewind() + { + $this->reset(); + $this->next(); + } + + /** + * {@inheritdoc} + */ + public function current() + { + return $this->current; + } + + /** + * {@inheritdoc} + */ + public function key() + { + return $this->position; + } + + /** + * {@inheritdoc} + */ + public function next() + { + if (!$this->elements && $this->fetchmore) { + $this->fetch(); + } + + if ($this->elements) { + $this->extractNext(); + } else { + $this->valid = false; + } + } + + /** + * {@inheritdoc} + */ + public function valid() + { + return $this->valid; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/SetKey.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/SetKey.php new file mode 100755 index 00000000..bf254397 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/SetKey.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Collection\Iterator; + +use Predis\ClientInterface; + +/** + * Abstracts the iteration of members stored in a set by leveraging the SSCAN + * command (Redis >= 2.8) wrapped in a fully-rewindable PHP iterator. + * + * @author Daniele Alessandri + * + * @link http://redis.io/commands/scan + */ +class SetKey extends CursorBasedIterator +{ + protected $key; + + /** + * {@inheritdoc} + */ + public function __construct(ClientInterface $client, $key, $match = null, $count = null) + { + $this->requiredCommand($client, 'SSCAN'); + + parent::__construct($client, $match, $count); + + $this->key = $key; + } + + /** + * {@inheritdoc} + */ + protected function executeCommand() + { + return $this->client->sscan($this->key, $this->cursor, $this->getScanOptions()); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/SortedSetKey.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/SortedSetKey.php new file mode 100755 index 00000000..e2f17892 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/SortedSetKey.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Collection\Iterator; + +use Predis\ClientInterface; + +/** + * Abstracts the iteration of members stored in a sorted set by leveraging the + * ZSCAN command (Redis >= 2.8) wrapped in a fully-rewindable PHP iterator. + * + * @author Daniele Alessandri + * + * @link http://redis.io/commands/scan + */ +class SortedSetKey extends CursorBasedIterator +{ + protected $key; + + /** + * {@inheritdoc} + */ + public function __construct(ClientInterface $client, $key, $match = null, $count = null) + { + $this->requiredCommand($client, 'ZSCAN'); + + parent::__construct($client, $match, $count); + + $this->key = $key; + } + + /** + * {@inheritdoc} + */ + protected function executeCommand() + { + return $this->client->zscan($this->key, $this->cursor, $this->getScanOptions()); + } + + /** + * {@inheritdoc} + */ + protected function extractNext() + { + if ($kv = each($this->elements)) { + $this->position = $kv[0]; + $this->current = $kv[1]; + + unset($this->elements[$this->position]); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Command.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Command.php new file mode 100755 index 00000000..bb538e7c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Command.php @@ -0,0 +1,129 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * Base class for Redis commands. + * + * @author Daniele Alessandri + */ +abstract class Command implements CommandInterface +{ + private $slot; + private $arguments = array(); + + /** + * Returns a filtered array of the arguments. + * + * @param array $arguments List of arguments. + * + * @return array + */ + protected function filterArguments(array $arguments) + { + return $arguments; + } + + /** + * {@inheritdoc} + */ + public function setArguments(array $arguments) + { + $this->arguments = $this->filterArguments($arguments); + unset($this->slot); + } + + /** + * {@inheritdoc} + */ + public function setRawArguments(array $arguments) + { + $this->arguments = $arguments; + unset($this->slot); + } + + /** + * {@inheritdoc} + */ + public function getArguments() + { + return $this->arguments; + } + + /** + * {@inheritdoc} + */ + public function getArgument($index) + { + if (isset($this->arguments[$index])) { + return $this->arguments[$index]; + } + } + + /** + * {@inheritdoc} + */ + public function setSlot($slot) + { + $this->slot = $slot; + } + + /** + * {@inheritdoc} + */ + public function getSlot() + { + if (isset($this->slot)) { + return $this->slot; + } + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + return $data; + } + + /** + * Normalizes the arguments array passed to a Redis command. + * + * @param array $arguments Arguments for a command. + * + * @return array + */ + public static function normalizeArguments(array $arguments) + { + if (count($arguments) === 1 && is_array($arguments[0])) { + return $arguments[0]; + } + + return $arguments; + } + + /** + * Normalizes the arguments array passed to a variadic Redis command. + * + * @param array $arguments Arguments for a command. + * + * @return array + */ + public static function normalizeVariadic(array $arguments) + { + if (count($arguments) === 2 && is_array($arguments[1])) { + return array_merge(array($arguments[0]), $arguments[1]); + } + + return $arguments; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/CommandInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/CommandInterface.php new file mode 100755 index 00000000..9f349e1d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/CommandInterface.php @@ -0,0 +1,81 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * Defines an abstraction representing a Redis command. + * + * @author Daniele Alessandri + */ +interface CommandInterface +{ + /** + * Returns the ID of the Redis command. By convention, command identifiers + * must always be uppercase. + * + * @return string + */ + public function getId(); + + /** + * Assign the specified slot to the command for clustering distribution. + * + * @param int $slot Slot ID. + */ + public function setSlot($slot); + + /** + * Returns the assigned slot of the command for clustering distribution. + * + * @return int|null + */ + public function getSlot(); + + /** + * Sets the arguments for the command. + * + * @param array $arguments List of arguments. + */ + public function setArguments(array $arguments); + + /** + * Sets the raw arguments for the command without processing them. + * + * @param array $arguments List of arguments. + */ + public function setRawArguments(array $arguments); + + /** + * Gets the arguments of the command. + * + * @return array + */ + public function getArguments(); + + /** + * Gets the argument of the command at the specified index. + * + * @param int $index Index of the desired argument. + * + * @return mixed|null + */ + public function getArgument($index); + + /** + * Parses a raw response and returns a PHP object. + * + * @param string $data Binary string containing the whole response. + * + * @return mixed + */ + public function parseResponse($data); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionAuth.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionAuth.php new file mode 100755 index 00000000..c8c9dedc --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionAuth.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/auth + * + * @author Daniele Alessandri + */ +class ConnectionAuth extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'AUTH'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionEcho.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionEcho.php new file mode 100755 index 00000000..fd496097 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionEcho.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/echo + * + * @author Daniele Alessandri + */ +class ConnectionEcho extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ECHO'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionPing.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionPing.php new file mode 100755 index 00000000..fa9d7346 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionPing.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/ping + * + * @author Daniele Alessandri + */ +class ConnectionPing extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'PING'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionQuit.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionQuit.php new file mode 100755 index 00000000..e59e31e3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionQuit.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/quit + * + * @author Daniele Alessandri + */ +class ConnectionQuit extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'QUIT'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionSelect.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionSelect.php new file mode 100755 index 00000000..1da82567 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionSelect.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/select + * + * @author Daniele Alessandri + */ +class ConnectionSelect extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SELECT'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashDelete.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashDelete.php new file mode 100755 index 00000000..d5d4c38c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashDelete.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/hdel + * + * @author Daniele Alessandri + */ +class HashDelete extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'HDEL'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + return self::normalizeVariadic($arguments); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashExists.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashExists.php new file mode 100755 index 00000000..a2c69b90 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashExists.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/hexists + * + * @author Daniele Alessandri + */ +class HashExists extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'HEXISTS'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + return (bool) $data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGet.php new file mode 100755 index 00000000..20f33da5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGet.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/hget + * + * @author Daniele Alessandri + */ +class HashGet extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'HGET'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGetAll.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGetAll.php new file mode 100755 index 00000000..d6986752 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGetAll.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/hgetall + * + * @author Daniele Alessandri + */ +class HashGetAll extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'HGETALL'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + $result = array(); + + for ($i = 0; $i < count($data); ++$i) { + $result[$data[$i]] = $data[++$i]; + } + + return $result; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGetMultiple.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGetMultiple.php new file mode 100755 index 00000000..820ce958 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGetMultiple.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/hmget + * + * @author Daniele Alessandri + */ +class HashGetMultiple extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'HMGET'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + return self::normalizeVariadic($arguments); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashIncrementBy.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashIncrementBy.php new file mode 100755 index 00000000..a37359ff --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashIncrementBy.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/hincrby + * + * @author Daniele Alessandri + */ +class HashIncrementBy extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'HINCRBY'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashIncrementByFloat.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashIncrementByFloat.php new file mode 100755 index 00000000..bce9714f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashIncrementByFloat.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/hincrbyfloat + * + * @author Daniele Alessandri + */ +class HashIncrementByFloat extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'HINCRBYFLOAT'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashKeys.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashKeys.php new file mode 100755 index 00000000..28266020 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashKeys.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/hkeys + * + * @author Daniele Alessandri + */ +class HashKeys extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'HKEYS'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashLength.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashLength.php new file mode 100755 index 00000000..d70926f1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashLength.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/hlen + * + * @author Daniele Alessandri + */ +class HashLength extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'HLEN'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashScan.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashScan.php new file mode 100755 index 00000000..afde74eb --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashScan.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/hscan + * + * @author Daniele Alessandri + */ +class HashScan extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'HSCAN'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + if (count($arguments) === 3 && is_array($arguments[2])) { + $options = $this->prepareOptions(array_pop($arguments)); + $arguments = array_merge($arguments, $options); + } + + return $arguments; + } + + /** + * Returns a list of options and modifiers compatible with Redis. + * + * @param array $options List of options. + * + * @return array + */ + protected function prepareOptions($options) + { + $options = array_change_key_case($options, CASE_UPPER); + $normalized = array(); + + if (!empty($options['MATCH'])) { + $normalized[] = 'MATCH'; + $normalized[] = $options['MATCH']; + } + + if (!empty($options['COUNT'])) { + $normalized[] = 'COUNT'; + $normalized[] = $options['COUNT']; + } + + return $normalized; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + if (is_array($data)) { + $fields = $data[1]; + $result = array(); + + for ($i = 0; $i < count($fields); ++$i) { + $result[$fields[$i]] = $fields[++$i]; + } + + $data[1] = $result; + } + + return $data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSet.php new file mode 100755 index 00000000..d3154a9b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSet.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/hset + * + * @author Daniele Alessandri + */ +class HashSet extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'HSET'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + return (bool) $data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSetMultiple.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSetMultiple.php new file mode 100755 index 00000000..6069e2ad --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSetMultiple.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/hmset + * + * @author Daniele Alessandri + */ +class HashSetMultiple extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'HMSET'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + if (count($arguments) === 2 && is_array($arguments[1])) { + $flattenedKVs = array($arguments[0]); + $args = $arguments[1]; + + foreach ($args as $k => $v) { + $flattenedKVs[] = $k; + $flattenedKVs[] = $v; + } + + return $flattenedKVs; + } + + return $arguments; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSetPreserve.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSetPreserve.php new file mode 100755 index 00000000..582100d4 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSetPreserve.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/hsetnx + * + * @author Daniele Alessandri + */ +class HashSetPreserve extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'HSETNX'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + return (bool) $data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashStringLength.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashStringLength.php new file mode 100755 index 00000000..7cfda80d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashStringLength.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/hstrlen + * + * @author Daniele Alessandri + */ +class HashStringLength extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'HSTRLEN'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashValues.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashValues.php new file mode 100755 index 00000000..0a5ea5f6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashValues.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/hvals + * + * @author Daniele Alessandri + */ +class HashValues extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'HVALS'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogAdd.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogAdd.php new file mode 100755 index 00000000..18d2bd7b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogAdd.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/pfadd + * + * @author Daniele Alessandri + */ +class HyperLogLogAdd extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'PFADD'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + return self::normalizeVariadic($arguments); + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + return (bool) $data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogCount.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogCount.php new file mode 100755 index 00000000..0afe5427 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogCount.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/pfcount + * + * @author Daniele Alessandri + */ +class HyperLogLogCount extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'PFCOUNT'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + return self::normalizeArguments($arguments); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogMerge.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogMerge.php new file mode 100755 index 00000000..c160be5b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogMerge.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/pfmerge + * + * @author Daniele Alessandri + */ +class HyperLogLogMerge extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'PFMERGE'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + return self::normalizeArguments($arguments); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyDelete.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyDelete.php new file mode 100755 index 00000000..89bdfdb7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyDelete.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/del + * + * @author Daniele Alessandri + */ +class KeyDelete extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'DEL'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + return self::normalizeArguments($arguments); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyDump.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyDump.php new file mode 100755 index 00000000..6d9c4880 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyDump.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/dump + * + * @author Daniele Alessandri + */ +class KeyDump extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'DUMP'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExists.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExists.php new file mode 100755 index 00000000..5196ca16 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExists.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/exists + * + * @author Daniele Alessandri + */ +class KeyExists extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'EXISTS'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + return (bool) $data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExpire.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExpire.php new file mode 100755 index 00000000..fd7c9c80 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExpire.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/expire + * + * @author Daniele Alessandri + */ +class KeyExpire extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'EXPIRE'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + return (bool) $data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExpireAt.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExpireAt.php new file mode 100755 index 00000000..e2fe7aeb --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExpireAt.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/expireat + * + * @author Daniele Alessandri + */ +class KeyExpireAt extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'EXPIREAT'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + return (bool) $data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyKeys.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyKeys.php new file mode 100755 index 00000000..6d74c40d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyKeys.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/keys + * + * @author Daniele Alessandri + */ +class KeyKeys extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'KEYS'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyMigrate.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyMigrate.php new file mode 100755 index 00000000..3324ef94 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyMigrate.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/migrate + * + * @author Daniele Alessandri + */ +class KeyMigrate extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'MIGRATE'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + if (is_array(end($arguments))) { + foreach (array_pop($arguments) as $modifier => $value) { + $modifier = strtoupper($modifier); + + if ($modifier === 'COPY' && $value == true) { + $arguments[] = $modifier; + } + + if ($modifier === 'REPLACE' && $value == true) { + $arguments[] = $modifier; + } + } + } + + return $arguments; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyMove.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyMove.php new file mode 100755 index 00000000..8f1ab2a7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyMove.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/move + * + * @author Daniele Alessandri + */ +class KeyMove extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'MOVE'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + return (bool) $data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPersist.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPersist.php new file mode 100755 index 00000000..e7729553 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPersist.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/persist + * + * @author Daniele Alessandri + */ +class KeyPersist extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'PERSIST'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + return (bool) $data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseExpire.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseExpire.php new file mode 100755 index 00000000..258ec476 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseExpire.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/pexpire + * + * @author Daniele Alessandri + */ +class KeyPreciseExpire extends KeyExpire +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'PEXPIRE'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseExpireAt.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseExpireAt.php new file mode 100755 index 00000000..e4192187 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseExpireAt.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/pexpireat + * + * @author Daniele Alessandri + */ +class KeyPreciseExpireAt extends KeyExpireAt +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'PEXPIREAT'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseTimeToLive.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseTimeToLive.php new file mode 100755 index 00000000..bdcd34b9 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseTimeToLive.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/pttl + * + * @author Daniele Alessandri + */ +class KeyPreciseTimeToLive extends KeyTimeToLive +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'PTTL'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRandom.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRandom.php new file mode 100755 index 00000000..b208b2db --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRandom.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/randomkey + * + * @author Daniele Alessandri + */ +class KeyRandom extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'RANDOMKEY'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + return $data !== '' ? $data : null; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRename.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRename.php new file mode 100755 index 00000000..82e44fb2 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRename.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/rename + * + * @author Daniele Alessandri + */ +class KeyRename extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'RENAME'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRenamePreserve.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRenamePreserve.php new file mode 100755 index 00000000..773ece6d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRenamePreserve.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/renamenx + * + * @author Daniele Alessandri + */ +class KeyRenamePreserve extends KeyRename +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'RENAMENX'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + return (bool) $data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRestore.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRestore.php new file mode 100755 index 00000000..a5b0b2db --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRestore.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/restore + * + * @author Daniele Alessandri + */ +class KeyRestore extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'RESTORE'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyScan.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyScan.php new file mode 100755 index 00000000..05f5bb3a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyScan.php @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/scan + * + * @author Daniele Alessandri + */ +class KeyScan extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SCAN'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + if (count($arguments) === 2 && is_array($arguments[1])) { + $options = $this->prepareOptions(array_pop($arguments)); + $arguments = array_merge($arguments, $options); + } + + return $arguments; + } + + /** + * Returns a list of options and modifiers compatible with Redis. + * + * @param array $options List of options. + * + * @return array + */ + protected function prepareOptions($options) + { + $options = array_change_key_case($options, CASE_UPPER); + $normalized = array(); + + if (!empty($options['MATCH'])) { + $normalized[] = 'MATCH'; + $normalized[] = $options['MATCH']; + } + + if (!empty($options['COUNT'])) { + $normalized[] = 'COUNT'; + $normalized[] = $options['COUNT']; + } + + return $normalized; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeySort.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeySort.php new file mode 100755 index 00000000..fd449f13 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeySort.php @@ -0,0 +1,83 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/sort + * + * @author Daniele Alessandri + */ +class KeySort extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SORT'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + if (count($arguments) === 1) { + return $arguments; + } + + $query = array($arguments[0]); + $sortParams = array_change_key_case($arguments[1], CASE_UPPER); + + if (isset($sortParams['BY'])) { + $query[] = 'BY'; + $query[] = $sortParams['BY']; + } + + if (isset($sortParams['GET'])) { + $getargs = $sortParams['GET']; + + if (is_array($getargs)) { + foreach ($getargs as $getarg) { + $query[] = 'GET'; + $query[] = $getarg; + } + } else { + $query[] = 'GET'; + $query[] = $getargs; + } + } + + if (isset($sortParams['LIMIT']) && + is_array($sortParams['LIMIT']) && + count($sortParams['LIMIT']) == 2) { + $query[] = 'LIMIT'; + $query[] = $sortParams['LIMIT'][0]; + $query[] = $sortParams['LIMIT'][1]; + } + + if (isset($sortParams['SORT'])) { + $query[] = strtoupper($sortParams['SORT']); + } + + if (isset($sortParams['ALPHA']) && $sortParams['ALPHA'] == true) { + $query[] = 'ALPHA'; + } + + if (isset($sortParams['STORE'])) { + $query[] = 'STORE'; + $query[] = $sortParams['STORE']; + } + + return $query; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyTimeToLive.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyTimeToLive.php new file mode 100755 index 00000000..67697a6f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyTimeToLive.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/ttl + * + * @author Daniele Alessandri + */ +class KeyTimeToLive extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'TTL'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyType.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyType.php new file mode 100755 index 00000000..f4f06e45 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyType.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/type + * + * @author Daniele Alessandri + */ +class KeyType extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'TYPE'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListIndex.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListIndex.php new file mode 100755 index 00000000..27c64be7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListIndex.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/lindex + * + * @author Daniele Alessandri + */ +class ListIndex extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'LINDEX'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListInsert.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListInsert.php new file mode 100755 index 00000000..7d53d11b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListInsert.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/linsert + * + * @author Daniele Alessandri + */ +class ListInsert extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'LINSERT'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListLength.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListLength.php new file mode 100755 index 00000000..6495beb7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListLength.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/llen + * + * @author Daniele Alessandri + */ +class ListLength extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'LLEN'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopFirst.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopFirst.php new file mode 100755 index 00000000..84d5d673 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopFirst.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/lpop + * + * @author Daniele Alessandri + */ +class ListPopFirst extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'LPOP'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopFirstBlocking.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopFirstBlocking.php new file mode 100755 index 00000000..7dc7c000 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopFirstBlocking.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/blpop + * + * @author Daniele Alessandri + */ +class ListPopFirstBlocking extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'BLPOP'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + if (count($arguments) === 2 && is_array($arguments[0])) { + list($arguments, $timeout) = $arguments; + array_push($arguments, $timeout); + } + + return $arguments; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLast.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLast.php new file mode 100755 index 00000000..9e92db5f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLast.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/rpop + * + * @author Daniele Alessandri + */ +class ListPopLast extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'RPOP'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastBlocking.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastBlocking.php new file mode 100755 index 00000000..781eb919 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastBlocking.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/brpop + * + * @author Daniele Alessandri + */ +class ListPopLastBlocking extends ListPopFirstBlocking +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'BRPOP'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastPushHead.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastPushHead.php new file mode 100755 index 00000000..f430eb22 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastPushHead.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/rpoplpush + * + * @author Daniele Alessandri + */ +class ListPopLastPushHead extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'RPOPLPUSH'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastPushHeadBlocking.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastPushHeadBlocking.php new file mode 100755 index 00000000..ee9c93c8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastPushHeadBlocking.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/brpoplpush + * + * @author Daniele Alessandri + */ +class ListPopLastPushHeadBlocking extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'BRPOPLPUSH'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushHead.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushHead.php new file mode 100755 index 00000000..74bf7c49 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushHead.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/lpush + * + * @author Daniele Alessandri + */ +class ListPushHead extends ListPushTail +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'LPUSH'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushHeadX.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushHeadX.php new file mode 100755 index 00000000..8e136b88 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushHeadX.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/lpushx + * + * @author Daniele Alessandri + */ +class ListPushHeadX extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'LPUSHX'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushTail.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushTail.php new file mode 100755 index 00000000..f2a057c0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushTail.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/rpush + * + * @author Daniele Alessandri + */ +class ListPushTail extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'RPUSH'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + return self::normalizeVariadic($arguments); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushTailX.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushTailX.php new file mode 100755 index 00000000..1af3645b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushTailX.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/rpushx + * + * @author Daniele Alessandri + */ +class ListPushTailX extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'RPUSHX'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListRange.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListRange.php new file mode 100755 index 00000000..32a21a6e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListRange.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/lrange + * + * @author Daniele Alessandri + */ +class ListRange extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'LRANGE'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListRemove.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListRemove.php new file mode 100755 index 00000000..c5800899 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListRemove.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/lrem + * + * @author Daniele Alessandri + */ +class ListRemove extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'LREM'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListSet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListSet.php new file mode 100755 index 00000000..5e59864d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListSet.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/lset + * + * @author Daniele Alessandri + */ +class ListSet extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'LSET'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListTrim.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListTrim.php new file mode 100755 index 00000000..19314180 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListTrim.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/ltrim + * + * @author Daniele Alessandri + */ +class ListTrim extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'LTRIM'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PrefixableCommandInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PrefixableCommandInterface.php new file mode 100755 index 00000000..6d54554f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PrefixableCommandInterface.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * Defines a command whose keys can be prefixed. + * + * @author Daniele Alessandri + */ +interface PrefixableCommandInterface extends CommandInterface +{ + /** + * Prefixes all the keys found in the arguments of the command. + * + * @param string $prefix String used to prefix the keys. + */ + public function prefixKeys($prefix); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/KeyPrefixProcessor.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/KeyPrefixProcessor.php new file mode 100755 index 00000000..d966d0e1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/KeyPrefixProcessor.php @@ -0,0 +1,415 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command\Processor; + +use Predis\Command\CommandInterface; +use Predis\Command\PrefixableCommandInterface; + +/** + * Command processor capable of prefixing keys stored in the arguments of Redis + * commands supported. + * + * @author Daniele Alessandri + */ +class KeyPrefixProcessor implements ProcessorInterface +{ + private $prefix; + private $commands; + + /** + * @param string $prefix Prefix for the keys. + */ + public function __construct($prefix) + { + $this->prefix = $prefix; + $this->commands = array( + /* ---------------- Redis 1.2 ---------------- */ + 'EXISTS' => 'static::first', + 'DEL' => 'static::all', + 'TYPE' => 'static::first', + 'KEYS' => 'static::first', + 'RENAME' => 'static::all', + 'RENAMENX' => 'static::all', + 'EXPIRE' => 'static::first', + 'EXPIREAT' => 'static::first', + 'TTL' => 'static::first', + 'MOVE' => 'static::first', + 'SORT' => 'static::sort', + 'DUMP' => 'static::first', + 'RESTORE' => 'static::first', + 'SET' => 'static::first', + 'SETNX' => 'static::first', + 'MSET' => 'static::interleaved', + 'MSETNX' => 'static::interleaved', + 'GET' => 'static::first', + 'MGET' => 'static::all', + 'GETSET' => 'static::first', + 'INCR' => 'static::first', + 'INCRBY' => 'static::first', + 'DECR' => 'static::first', + 'DECRBY' => 'static::first', + 'RPUSH' => 'static::first', + 'LPUSH' => 'static::first', + 'LLEN' => 'static::first', + 'LRANGE' => 'static::first', + 'LTRIM' => 'static::first', + 'LINDEX' => 'static::first', + 'LSET' => 'static::first', + 'LREM' => 'static::first', + 'LPOP' => 'static::first', + 'RPOP' => 'static::first', + 'RPOPLPUSH' => 'static::all', + 'SADD' => 'static::first', + 'SREM' => 'static::first', + 'SPOP' => 'static::first', + 'SMOVE' => 'static::skipLast', + 'SCARD' => 'static::first', + 'SISMEMBER' => 'static::first', + 'SINTER' => 'static::all', + 'SINTERSTORE' => 'static::all', + 'SUNION' => 'static::all', + 'SUNIONSTORE' => 'static::all', + 'SDIFF' => 'static::all', + 'SDIFFSTORE' => 'static::all', + 'SMEMBERS' => 'static::first', + 'SRANDMEMBER' => 'static::first', + 'ZADD' => 'static::first', + 'ZINCRBY' => 'static::first', + 'ZREM' => 'static::first', + 'ZRANGE' => 'static::first', + 'ZREVRANGE' => 'static::first', + 'ZRANGEBYSCORE' => 'static::first', + 'ZCARD' => 'static::first', + 'ZSCORE' => 'static::first', + 'ZREMRANGEBYSCORE' => 'static::first', + /* ---------------- Redis 2.0 ---------------- */ + 'SETEX' => 'static::first', + 'APPEND' => 'static::first', + 'SUBSTR' => 'static::first', + 'BLPOP' => 'static::skipLast', + 'BRPOP' => 'static::skipLast', + 'ZUNIONSTORE' => 'static::zsetStore', + 'ZINTERSTORE' => 'static::zsetStore', + 'ZCOUNT' => 'static::first', + 'ZRANK' => 'static::first', + 'ZREVRANK' => 'static::first', + 'ZREMRANGEBYRANK' => 'static::first', + 'HSET' => 'static::first', + 'HSETNX' => 'static::first', + 'HMSET' => 'static::first', + 'HINCRBY' => 'static::first', + 'HGET' => 'static::first', + 'HMGET' => 'static::first', + 'HDEL' => 'static::first', + 'HEXISTS' => 'static::first', + 'HLEN' => 'static::first', + 'HKEYS' => 'static::first', + 'HVALS' => 'static::first', + 'HGETALL' => 'static::first', + 'SUBSCRIBE' => 'static::all', + 'UNSUBSCRIBE' => 'static::all', + 'PSUBSCRIBE' => 'static::all', + 'PUNSUBSCRIBE' => 'static::all', + 'PUBLISH' => 'static::first', + /* ---------------- Redis 2.2 ---------------- */ + 'PERSIST' => 'static::first', + 'STRLEN' => 'static::first', + 'SETRANGE' => 'static::first', + 'GETRANGE' => 'static::first', + 'SETBIT' => 'static::first', + 'GETBIT' => 'static::first', + 'RPUSHX' => 'static::first', + 'LPUSHX' => 'static::first', + 'LINSERT' => 'static::first', + 'BRPOPLPUSH' => 'static::skipLast', + 'ZREVRANGEBYSCORE' => 'static::first', + 'WATCH' => 'static::all', + /* ---------------- Redis 2.6 ---------------- */ + 'PTTL' => 'static::first', + 'PEXPIRE' => 'static::first', + 'PEXPIREAT' => 'static::first', + 'PSETEX' => 'static::first', + 'INCRBYFLOAT' => 'static::first', + 'BITOP' => 'static::skipFirst', + 'BITCOUNT' => 'static::first', + 'HINCRBYFLOAT' => 'static::first', + 'EVAL' => 'static::evalKeys', + 'EVALSHA' => 'static::evalKeys', + 'MIGRATE' => 'static::migrate', + /* ---------------- Redis 2.8 ---------------- */ + 'SSCAN' => 'static::first', + 'ZSCAN' => 'static::first', + 'HSCAN' => 'static::first', + 'PFADD' => 'static::first', + 'PFCOUNT' => 'static::all', + 'PFMERGE' => 'static::all', + 'ZLEXCOUNT' => 'static::first', + 'ZRANGEBYLEX' => 'static::first', + 'ZREMRANGEBYLEX' => 'static::first', + 'ZREVRANGEBYLEX' => 'static::first', + 'BITPOS' => 'static::first', + /* ---------------- Redis 3.2 ---------------- */ + 'HSTRLEN' => 'static::first', + ); + } + + /** + * Sets a prefix that is applied to all the keys. + * + * @param string $prefix Prefix for the keys. + */ + public function setPrefix($prefix) + { + $this->prefix = $prefix; + } + + /** + * Gets the current prefix. + * + * @return string + */ + public function getPrefix() + { + return $this->prefix; + } + + /** + * {@inheritdoc} + */ + public function process(CommandInterface $command) + { + if ($command instanceof PrefixableCommandInterface) { + $command->prefixKeys($this->prefix); + } elseif (isset($this->commands[$commandID = strtoupper($command->getId())])) { + call_user_func($this->commands[$commandID], $command, $this->prefix); + } + } + + /** + * Sets an handler for the specified command ID. + * + * The callback signature must have 2 parameters of the following types: + * + * - Predis\Command\CommandInterface (command instance) + * - String (prefix) + * + * When the callback argument is omitted or NULL, the previously + * associated handler for the specified command ID is removed. + * + * @param string $commandID The ID of the command to be handled. + * @param mixed $callback A valid callable object or NULL. + * + * @throws \InvalidArgumentException + */ + public function setCommandHandler($commandID, $callback = null) + { + $commandID = strtoupper($commandID); + + if (!isset($callback)) { + unset($this->commands[$commandID]); + + return; + } + + if (!is_callable($callback)) { + throw new \InvalidArgumentException( + 'Callback must be a valid callable object or NULL' + ); + } + + $this->commands[$commandID] = $callback; + } + + /** + * {@inheritdoc} + */ + public function __toString() + { + return $this->getPrefix(); + } + + /** + * Applies the specified prefix only the first argument. + * + * @param CommandInterface $command Command instance. + * @param string $prefix Prefix string. + */ + public static function first(CommandInterface $command, $prefix) + { + if ($arguments = $command->getArguments()) { + $arguments[0] = "$prefix{$arguments[0]}"; + $command->setRawArguments($arguments); + } + } + + /** + * Applies the specified prefix to all the arguments. + * + * @param CommandInterface $command Command instance. + * @param string $prefix Prefix string. + */ + public static function all(CommandInterface $command, $prefix) + { + if ($arguments = $command->getArguments()) { + foreach ($arguments as &$key) { + $key = "$prefix$key"; + } + + $command->setRawArguments($arguments); + } + } + + /** + * Applies the specified prefix only to even arguments in the list. + * + * @param CommandInterface $command Command instance. + * @param string $prefix Prefix string. + */ + public static function interleaved(CommandInterface $command, $prefix) + { + if ($arguments = $command->getArguments()) { + $length = count($arguments); + + for ($i = 0; $i < $length; $i += 2) { + $arguments[$i] = "$prefix{$arguments[$i]}"; + } + + $command->setRawArguments($arguments); + } + } + + /** + * Applies the specified prefix to all the arguments but the first one. + * + * @param CommandInterface $command Command instance. + * @param string $prefix Prefix string. + */ + public static function skipFirst(CommandInterface $command, $prefix) + { + if ($arguments = $command->getArguments()) { + $length = count($arguments); + + for ($i = 1; $i < $length; ++$i) { + $arguments[$i] = "$prefix{$arguments[$i]}"; + } + + $command->setRawArguments($arguments); + } + } + + /** + * Applies the specified prefix to all the arguments but the last one. + * + * @param CommandInterface $command Command instance. + * @param string $prefix Prefix string. + */ + public static function skipLast(CommandInterface $command, $prefix) + { + if ($arguments = $command->getArguments()) { + $length = count($arguments); + + for ($i = 0; $i < $length - 1; ++$i) { + $arguments[$i] = "$prefix{$arguments[$i]}"; + } + + $command->setRawArguments($arguments); + } + } + + /** + * Applies the specified prefix to the keys of a SORT command. + * + * @param CommandInterface $command Command instance. + * @param string $prefix Prefix string. + */ + public static function sort(CommandInterface $command, $prefix) + { + if ($arguments = $command->getArguments()) { + $arguments[0] = "$prefix{$arguments[0]}"; + + if (($count = count($arguments)) > 1) { + for ($i = 1; $i < $count; ++$i) { + switch ($arguments[$i]) { + case 'BY': + case 'STORE': + $arguments[$i] = "$prefix{$arguments[++$i]}"; + break; + + case 'GET': + $value = $arguments[++$i]; + if ($value !== '#') { + $arguments[$i] = "$prefix$value"; + } + break; + + case 'LIMIT'; + $i += 2; + break; + } + } + } + + $command->setRawArguments($arguments); + } + } + + /** + * Applies the specified prefix to the keys of an EVAL-based command. + * + * @param CommandInterface $command Command instance. + * @param string $prefix Prefix string. + */ + public static function evalKeys(CommandInterface $command, $prefix) + { + if ($arguments = $command->getArguments()) { + for ($i = 2; $i < $arguments[1] + 2; ++$i) { + $arguments[$i] = "$prefix{$arguments[$i]}"; + } + + $command->setRawArguments($arguments); + } + } + + /** + * Applies the specified prefix to the keys of Z[INTERSECTION|UNION]STORE. + * + * @param CommandInterface $command Command instance. + * @param string $prefix Prefix string. + */ + public static function zsetStore(CommandInterface $command, $prefix) + { + if ($arguments = $command->getArguments()) { + $arguments[0] = "$prefix{$arguments[0]}"; + $length = ((int) $arguments[1]) + 2; + + for ($i = 2; $i < $length; ++$i) { + $arguments[$i] = "$prefix{$arguments[$i]}"; + } + + $command->setRawArguments($arguments); + } + } + + /** + * Applies the specified prefix to the key of a MIGRATE command. + * + * @param CommandInterface $command Command instance. + * @param string $prefix Prefix string. + */ + public static function migrate(CommandInterface $command, $prefix) + { + if ($arguments = $command->getArguments()) { + $arguments[2] = "$prefix{$arguments[2]}"; + $command->setRawArguments($arguments); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/ProcessorChain.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/ProcessorChain.php new file mode 100755 index 00000000..0a4768b0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/ProcessorChain.php @@ -0,0 +1,130 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command\Processor; + +use Predis\Command\CommandInterface; + +/** + * Default implementation of a command processors chain. + * + * @author Daniele Alessandri + */ +class ProcessorChain implements \ArrayAccess, ProcessorInterface +{ + private $processors = array(); + + /** + * @param array $processors List of instances of ProcessorInterface. + */ + public function __construct($processors = array()) + { + foreach ($processors as $processor) { + $this->add($processor); + } + } + + /** + * {@inheritdoc} + */ + public function add(ProcessorInterface $processor) + { + $this->processors[] = $processor; + } + + /** + * {@inheritdoc} + */ + public function remove(ProcessorInterface $processor) + { + if (false !== $index = array_search($processor, $this->processors, true)) { + unset($this[$index]); + } + } + + /** + * {@inheritdoc} + */ + public function process(CommandInterface $command) + { + for ($i = 0; $i < $count = count($this->processors); ++$i) { + $this->processors[$i]->process($command); + } + } + + /** + * {@inheritdoc} + */ + public function getProcessors() + { + return $this->processors; + } + + /** + * Returns an iterator over the list of command processor in the chain. + * + * @return \ArrayIterator + */ + public function getIterator() + { + return new \ArrayIterator($this->processors); + } + + /** + * Returns the number of command processors in the chain. + * + * @return int + */ + public function count() + { + return count($this->processors); + } + + /** + * {@inheritdoc} + */ + public function offsetExists($index) + { + return isset($this->processors[$index]); + } + + /** + * {@inheritdoc} + */ + public function offsetGet($index) + { + return $this->processors[$index]; + } + + /** + * {@inheritdoc} + */ + public function offsetSet($index, $processor) + { + if (!$processor instanceof ProcessorInterface) { + throw new \InvalidArgumentException( + 'A processor chain accepts only instances of '. + "'Predis\Command\Processor\ProcessorInterface'." + ); + } + + $this->processors[$index] = $processor; + } + + /** + * {@inheritdoc} + */ + public function offsetUnset($index) + { + unset($this->processors[$index]); + $this->processors = array_values($this->processors); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/ProcessorInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/ProcessorInterface.php new file mode 100755 index 00000000..2f910580 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/ProcessorInterface.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command\Processor; + +use Predis\Command\CommandInterface; + +/** + * A command processor processes Redis commands before they are sent to Redis. + * + * @author Daniele Alessandri + */ +interface ProcessorInterface +{ + /** + * Processes the given Redis command. + * + * @param CommandInterface $command Command instance. + */ + public function process(CommandInterface $command); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubPublish.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubPublish.php new file mode 100755 index 00000000..55508f8d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubPublish.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/publish + * + * @author Daniele Alessandri + */ +class PubSubPublish extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'PUBLISH'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubPubsub.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubPubsub.php new file mode 100755 index 00000000..8cf81297 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubPubsub.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/pubsub + * + * @author Daniele Alessandri + */ +class PubSubPubsub extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'PUBSUB'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + switch (strtolower($this->getArgument(0))) { + case 'numsub': + return self::processNumsub($data); + + default: + return $data; + } + } + + /** + * Returns the processed response to PUBSUB NUMSUB. + * + * @param array $channels List of channels + * + * @return array + */ + protected static function processNumsub(array $channels) + { + $processed = array(); + $count = count($channels); + + for ($i = 0; $i < $count; ++$i) { + $processed[$channels[$i]] = $channels[++$i]; + } + + return $processed; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubSubscribe.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubSubscribe.php new file mode 100755 index 00000000..e477b313 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubSubscribe.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/subscribe + * + * @author Daniele Alessandri + */ +class PubSubSubscribe extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SUBSCRIBE'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + return self::normalizeArguments($arguments); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubSubscribeByPattern.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubSubscribeByPattern.php new file mode 100755 index 00000000..01182806 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubSubscribeByPattern.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/psubscribe + * + * @author Daniele Alessandri + */ +class PubSubSubscribeByPattern extends PubSubSubscribe +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'PSUBSCRIBE'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubUnsubscribe.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubUnsubscribe.php new file mode 100755 index 00000000..d57c3ac6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubUnsubscribe.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/unsubscribe + * + * @author Daniele Alessandri + */ +class PubSubUnsubscribe extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'UNSUBSCRIBE'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + return self::normalizeArguments($arguments); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubUnsubscribeByPattern.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubUnsubscribeByPattern.php new file mode 100755 index 00000000..4d76508b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubUnsubscribeByPattern.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/punsubscribe + * + * @author Daniele Alessandri + */ +class PubSubUnsubscribeByPattern extends PubSubUnsubscribe +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'PUNSUBSCRIBE'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/RawCommand.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/RawCommand.php new file mode 100755 index 00000000..2dd48ca1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/RawCommand.php @@ -0,0 +1,131 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * Class for generic "anonymous" Redis commands. + * + * This command class does not filter input arguments or parse responses, but + * can be used to leverage the standard Predis API to execute any command simply + * by providing the needed arguments following the command signature as defined + * by Redis in its documentation. + * + * @author Daniele Alessandri + */ +class RawCommand implements CommandInterface +{ + private $slot; + private $commandID; + private $arguments; + + /** + * @param array $arguments Command ID and its arguments. + * + * @throws \InvalidArgumentException + */ + public function __construct(array $arguments) + { + if (!$arguments) { + throw new \InvalidArgumentException( + 'The arguments array must contain at least the command ID.' + ); + } + + $this->commandID = strtoupper(array_shift($arguments)); + $this->arguments = $arguments; + } + + /** + * Creates a new raw command using a variadic method. + * + * @param string $commandID Redis command ID. + * @param string ... Arguments list for the command. + * + * @return CommandInterface + */ + public static function create($commandID /* [ $arg, ... */) + { + $arguments = func_get_args(); + $command = new self($arguments); + + return $command; + } + + /** + * {@inheritdoc} + */ + public function getId() + { + return $this->commandID; + } + + /** + * {@inheritdoc} + */ + public function setArguments(array $arguments) + { + $this->arguments = $arguments; + unset($this->slot); + } + + /** + * {@inheritdoc} + */ + public function setRawArguments(array $arguments) + { + $this->setArguments($arguments); + } + + /** + * {@inheritdoc} + */ + public function getArguments() + { + return $this->arguments; + } + + /** + * {@inheritdoc} + */ + public function getArgument($index) + { + if (isset($this->arguments[$index])) { + return $this->arguments[$index]; + } + } + + /** + * {@inheritdoc} + */ + public function setSlot($slot) + { + $this->slot = $slot; + } + + /** + * {@inheritdoc} + */ + public function getSlot() + { + if (isset($this->slot)) { + return $this->slot; + } + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + return $data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ScriptCommand.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ScriptCommand.php new file mode 100755 index 00000000..a30bc1d2 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ScriptCommand.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * Base class used to implement an higher level abstraction for commands based + * on Lua scripting with EVAL and EVALSHA. + * + * @link http://redis.io/commands/eval + * + * @author Daniele Alessandri + */ +abstract class ScriptCommand extends ServerEvalSHA +{ + /** + * Gets the body of a Lua script. + * + * @return string + */ + abstract public function getScript(); + + /** + * Specifies the number of arguments that should be considered as keys. + * + * The default behaviour for the base class is to return 0 to indicate that + * all the elements of the arguments array should be considered as keys, but + * subclasses can enforce a static number of keys. + * + * @return int + */ + protected function getKeysCount() + { + return 0; + } + + /** + * Returns the elements from the arguments that are identified as keys. + * + * @return array + */ + public function getKeys() + { + return array_slice($this->getArguments(), 2, $this->getKeysCount()); + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + if (($numkeys = $this->getKeysCount()) && $numkeys < 0) { + $numkeys = count($arguments) + $numkeys; + } + + return array_merge(array(sha1($this->getScript()), (int) $numkeys), $arguments); + } + + /** + * @return array + */ + public function getEvalArguments() + { + $arguments = $this->getArguments(); + $arguments[0] = $this->getScript(); + + return $arguments; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerBackgroundRewriteAOF.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerBackgroundRewriteAOF.php new file mode 100755 index 00000000..c66a294e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerBackgroundRewriteAOF.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/bgrewriteaof + * + * @author Daniele Alessandri + */ +class ServerBackgroundRewriteAOF extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'BGREWRITEAOF'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + return $data == 'Background append only file rewriting started'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerBackgroundSave.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerBackgroundSave.php new file mode 100755 index 00000000..4bf67ef3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerBackgroundSave.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/bgsave + * + * @author Daniele Alessandri + */ +class ServerBackgroundSave extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'BGSAVE'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + return $data === 'Background saving started' ? true : $data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerClient.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerClient.php new file mode 100755 index 00000000..d00ebbff --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerClient.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/client-list + * @link http://redis.io/commands/client-kill + * @link http://redis.io/commands/client-getname + * @link http://redis.io/commands/client-setname + * + * @author Daniele Alessandri + */ +class ServerClient extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'CLIENT'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + $args = array_change_key_case($this->getArguments(), CASE_UPPER); + + switch (strtoupper($args[0])) { + case 'LIST': + return $this->parseClientList($data); + case 'KILL': + case 'GETNAME': + case 'SETNAME': + default: + return $data; + } + } + + /** + * Parses the response to CLIENT LIST and returns a structured list. + * + * @param string $data Response buffer. + * + * @return array + */ + protected function parseClientList($data) + { + $clients = array(); + + foreach (explode("\n", $data, -1) as $clientData) { + $client = array(); + + foreach (explode(' ', $clientData) as $kv) { + @list($k, $v) = explode('=', $kv); + $client[$k] = $v; + } + + $clients[] = $client; + } + + return $clients; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerCommand.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerCommand.php new file mode 100755 index 00000000..e9b3393c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerCommand.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/command + * + * @author Daniele Alessandri + */ +class ServerCommand extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'COMMAND'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerConfig.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerConfig.php new file mode 100755 index 00000000..81e497ae --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerConfig.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/config-set + * @link http://redis.io/commands/config-get + * @link http://redis.io/commands/config-resetstat + * @link http://redis.io/commands/config-rewrite + * + * @author Daniele Alessandri + */ +class ServerConfig extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'CONFIG'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + if (is_array($data)) { + $result = array(); + + for ($i = 0; $i < count($data); ++$i) { + $result[$data[$i]] = $data[++$i]; + } + + return $result; + } + + return $data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerDatabaseSize.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerDatabaseSize.php new file mode 100755 index 00000000..6bc89724 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerDatabaseSize.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/dbsize + * + * @author Daniele Alessandri + */ +class ServerDatabaseSize extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'DBSIZE'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerEval.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerEval.php new file mode 100755 index 00000000..f5eefd81 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerEval.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/eval + * + * @author Daniele Alessandri + */ +class ServerEval extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'EVAL'; + } + + /** + * Calculates the SHA1 hash of the body of the script. + * + * @return string SHA1 hash. + */ + public function getScriptHash() + { + return sha1($this->getArgument(0)); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerEvalSHA.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerEvalSHA.php new file mode 100755 index 00000000..520a8e98 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerEvalSHA.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/evalsha + * + * @author Daniele Alessandri + */ +class ServerEvalSHA extends ServerEval +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'EVALSHA'; + } + + /** + * Returns the SHA1 hash of the body of the script. + * + * @return string SHA1 hash. + */ + public function getScriptHash() + { + return $this->getArgument(0); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerFlushAll.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerFlushAll.php new file mode 100755 index 00000000..c35b2ad6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerFlushAll.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/flushall + * + * @author Daniele Alessandri + */ +class ServerFlushAll extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'FLUSHALL'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerFlushDatabase.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerFlushDatabase.php new file mode 100755 index 00000000..3da6b320 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerFlushDatabase.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/flushdb + * + * @author Daniele Alessandri + */ +class ServerFlushDatabase extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'FLUSHDB'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerInfo.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerInfo.php new file mode 100755 index 00000000..96d6adad --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerInfo.php @@ -0,0 +1,111 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/info + * + * @author Daniele Alessandri + */ +class ServerInfo extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'INFO'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + $info = array(); + $infoLines = preg_split('/\r?\n/', $data); + + foreach ($infoLines as $row) { + if (strpos($row, ':') === false) { + continue; + } + + list($k, $v) = $this->parseRow($row); + $info[$k] = $v; + } + + return $info; + } + + /** + * Parses a single row of the response and returns the key-value pair. + * + * @param string $row Single row of the response. + * + * @return array + */ + protected function parseRow($row) + { + list($k, $v) = explode(':', $row, 2); + + if (preg_match('/^db\d+$/', $k)) { + $v = $this->parseDatabaseStats($v); + } + + return array($k, $v); + } + + /** + * Extracts the statistics of each logical DB from the string buffer. + * + * @param string $str Response buffer. + * + * @return array + */ + protected function parseDatabaseStats($str) + { + $db = array(); + + foreach (explode(',', $str) as $dbvar) { + list($dbvk, $dbvv) = explode('=', $dbvar); + $db[trim($dbvk)] = $dbvv; + } + + return $db; + } + + /** + * Parses the response and extracts the allocation statistics. + * + * @param string $str Response buffer. + * + * @return array + */ + protected function parseAllocationStats($str) + { + $stats = array(); + + foreach (explode(',', $str) as $kv) { + @list($size, $objects, $extra) = explode('=', $kv); + + // hack to prevent incorrect values when parsing the >=256 key + if (isset($extra)) { + $size = ">=$objects"; + $objects = $extra; + } + + $stats[$size] = $objects; + } + + return $stats; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerInfoV26x.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerInfoV26x.php new file mode 100755 index 00000000..90c9b716 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerInfoV26x.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/info + * + * @author Daniele Alessandri + */ +class ServerInfoV26x extends ServerInfo +{ + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + if ($data === '') { + return array(); + } + + $info = array(); + + $current = null; + $infoLines = preg_split('/\r?\n/', $data); + + if (isset($infoLines[0]) && $infoLines[0][0] !== '#') { + return parent::parseResponse($data); + } + + foreach ($infoLines as $row) { + if ($row === '') { + continue; + } + + if (preg_match('/^# (\w+)$/', $row, $matches)) { + $info[$matches[1]] = array(); + $current = &$info[$matches[1]]; + continue; + } + + list($k, $v) = $this->parseRow($row); + $current[$k] = $v; + } + + return $info; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerLastSave.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerLastSave.php new file mode 100755 index 00000000..feeb19a8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerLastSave.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/lastsave + * + * @author Daniele Alessandri + */ +class ServerLastSave extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'LASTSAVE'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerMonitor.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerMonitor.php new file mode 100755 index 00000000..1c3d3309 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerMonitor.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/monitor + * + * @author Daniele Alessandri + */ +class ServerMonitor extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'MONITOR'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerObject.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerObject.php new file mode 100755 index 00000000..f921701c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerObject.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/object + * + * @author Daniele Alessandri + */ +class ServerObject extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'OBJECT'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSave.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSave.php new file mode 100755 index 00000000..addefe20 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSave.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/save + * + * @author Daniele Alessandri + */ +class ServerSave extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SAVE'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerScript.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerScript.php new file mode 100755 index 00000000..7a01018d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerScript.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/script + * + * @author Daniele Alessandri + */ +class ServerScript extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SCRIPT'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSentinel.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSentinel.php new file mode 100755 index 00000000..c0962db3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSentinel.php @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/topics/sentinel + * + * @author Daniele Alessandri + */ +class ServerSentinel extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SENTINEL'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + switch (strtolower($this->getArgument(0))) { + case 'masters': + case 'slaves': + return self::processMastersOrSlaves($data); + + default: + return $data; + } + } + + /** + * Returns a processed response to SENTINEL MASTERS or SENTINEL SLAVES. + * + * @param array $servers List of Redis servers. + * + * @return array + */ + protected static function processMastersOrSlaves(array $servers) + { + foreach ($servers as $idx => $node) { + $processed = array(); + $count = count($node); + + for ($i = 0; $i < $count; ++$i) { + $processed[$node[$i]] = $node[++$i]; + } + + $servers[$idx] = $processed; + } + + return $servers; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerShutdown.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerShutdown.php new file mode 100755 index 00000000..f5b745a2 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerShutdown.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/shutdown + * + * @author Daniele Alessandri + */ +class ServerShutdown extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SHUTDOWN'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSlaveOf.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSlaveOf.php new file mode 100755 index 00000000..4ff44556 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSlaveOf.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/slaveof + * + * @author Daniele Alessandri + */ +class ServerSlaveOf extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SLAVEOF'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + if (count($arguments) === 0 || $arguments[0] === 'NO ONE') { + return array('NO', 'ONE'); + } + + return $arguments; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSlowlog.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSlowlog.php new file mode 100755 index 00000000..137ff59e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSlowlog.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/slowlog + * + * @author Daniele Alessandri + */ +class ServerSlowlog extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SLOWLOG'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + if (is_array($data)) { + $log = array(); + + foreach ($data as $index => $entry) { + $log[$index] = array( + 'id' => $entry[0], + 'timestamp' => $entry[1], + 'duration' => $entry[2], + 'command' => $entry[3], + ); + } + + return $log; + } + + return $data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerTime.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerTime.php new file mode 100755 index 00000000..589f92c5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerTime.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/time + * + * @author Daniele Alessandri + */ +class ServerTime extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'TIME'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetAdd.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetAdd.php new file mode 100755 index 00000000..c1188181 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetAdd.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/sadd + * + * @author Daniele Alessandri + */ +class SetAdd extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SADD'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + return self::normalizeVariadic($arguments); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetCardinality.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetCardinality.php new file mode 100755 index 00000000..a9f959b7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetCardinality.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/scard + * + * @author Daniele Alessandri + */ +class SetCardinality extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SCARD'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetDifference.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetDifference.php new file mode 100755 index 00000000..35f23f98 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetDifference.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/sdiff + * + * @author Daniele Alessandri + */ +class SetDifference extends SetIntersection +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SDIFF'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetDifferenceStore.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetDifferenceStore.php new file mode 100755 index 00000000..0cb78155 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetDifferenceStore.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/sdiffstore + * + * @author Daniele Alessandri + */ +class SetDifferenceStore extends SetIntersectionStore +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SDIFFSTORE'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIntersection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIntersection.php new file mode 100755 index 00000000..d18258fd --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIntersection.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/sinter + * + * @author Daniele Alessandri + */ +class SetIntersection extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SINTER'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + return self::normalizeArguments($arguments); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIntersectionStore.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIntersectionStore.php new file mode 100755 index 00000000..b748618a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIntersectionStore.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/sinterstore + * + * @author Daniele Alessandri + */ +class SetIntersectionStore extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SINTERSTORE'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + if (count($arguments) === 2 && is_array($arguments[1])) { + return array_merge(array($arguments[0]), $arguments[1]); + } + + return $arguments; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIsMember.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIsMember.php new file mode 100755 index 00000000..1b484907 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIsMember.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/sismember + * + * @author Daniele Alessandri + */ +class SetIsMember extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SISMEMBER'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + return (bool) $data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetMembers.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetMembers.php new file mode 100755 index 00000000..f4076ae8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetMembers.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/smembers + * + * @author Daniele Alessandri + */ +class SetMembers extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SMEMBERS'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetMove.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetMove.php new file mode 100755 index 00000000..72d514be --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetMove.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/smove + * + * @author Daniele Alessandri + */ +class SetMove extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SMOVE'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + return (bool) $data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetPop.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetPop.php new file mode 100755 index 00000000..b78d3f33 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetPop.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/spop + * + * @author Daniele Alessandri + */ +class SetPop extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SPOP'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetRandomMember.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetRandomMember.php new file mode 100755 index 00000000..2cb79a04 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetRandomMember.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/srandmember + * + * @author Daniele Alessandri + */ +class SetRandomMember extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SRANDMEMBER'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetRemove.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetRemove.php new file mode 100755 index 00000000..b34710c6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetRemove.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/srem + * + * @author Daniele Alessandri + */ +class SetRemove extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SREM'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + return self::normalizeVariadic($arguments); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetScan.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetScan.php new file mode 100755 index 00000000..d42b28df --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetScan.php @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/sscan + * + * @author Daniele Alessandri + */ +class SetScan extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SSCAN'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + if (count($arguments) === 3 && is_array($arguments[2])) { + $options = $this->prepareOptions(array_pop($arguments)); + $arguments = array_merge($arguments, $options); + } + + return $arguments; + } + + /** + * Returns a list of options and modifiers compatible with Redis. + * + * @param array $options List of options. + * + * @return array + */ + protected function prepareOptions($options) + { + $options = array_change_key_case($options, CASE_UPPER); + $normalized = array(); + + if (!empty($options['MATCH'])) { + $normalized[] = 'MATCH'; + $normalized[] = $options['MATCH']; + } + + if (!empty($options['COUNT'])) { + $normalized[] = 'COUNT'; + $normalized[] = $options['COUNT']; + } + + return $normalized; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetUnion.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetUnion.php new file mode 100755 index 00000000..7da842b4 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetUnion.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/sunion + * + * @author Daniele Alessandri + */ +class SetUnion extends SetIntersection +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SUNION'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetUnionStore.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetUnionStore.php new file mode 100755 index 00000000..eac821ad --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetUnionStore.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/sunionstore + * + * @author Daniele Alessandri + */ +class SetUnionStore extends SetIntersectionStore +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SUNIONSTORE'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringAppend.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringAppend.php new file mode 100755 index 00000000..dac8b847 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringAppend.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/append + * + * @author Daniele Alessandri + */ +class StringAppend extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'APPEND'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitCount.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitCount.php new file mode 100755 index 00000000..193cce91 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitCount.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/bitcount + * + * @author Daniele Alessandri + */ +class StringBitCount extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'BITCOUNT'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitOp.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitOp.php new file mode 100755 index 00000000..e04ee79c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitOp.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/bitop + * + * @author Daniele Alessandri + */ +class StringBitOp extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'BITOP'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + if (count($arguments) === 3 && is_array($arguments[2])) { + list($operation, $destination) = $arguments; + $arguments = $arguments[2]; + array_unshift($arguments, $operation, $destination); + } + + return $arguments; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitPos.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitPos.php new file mode 100755 index 00000000..42957665 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitPos.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/bitpos + * + * @author Daniele Alessandri + */ +class StringBitPos extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'BITPOS'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringDecrement.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringDecrement.php new file mode 100755 index 00000000..aa5808cd --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringDecrement.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/decr + * + * @author Daniele Alessandri + */ +class StringDecrement extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'DECR'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringDecrementBy.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringDecrementBy.php new file mode 100755 index 00000000..cbf3e112 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringDecrementBy.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/decrby + * + * @author Daniele Alessandri + */ +class StringDecrementBy extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'DECRBY'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGet.php new file mode 100755 index 00000000..138e915c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGet.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/get + * + * @author Daniele Alessandri + */ +class StringGet extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'GET'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetBit.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetBit.php new file mode 100755 index 00000000..3c5b4f9b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetBit.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/getbit + * + * @author Daniele Alessandri + */ +class StringGetBit extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'GETBIT'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetMultiple.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetMultiple.php new file mode 100755 index 00000000..e340f9cf --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetMultiple.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/mget + * + * @author Daniele Alessandri + */ +class StringGetMultiple extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'MGET'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + return self::normalizeArguments($arguments); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetRange.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetRange.php new file mode 100755 index 00000000..bb10565b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetRange.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/getrange + * + * @author Daniele Alessandri + */ +class StringGetRange extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'GETRANGE'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetSet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetSet.php new file mode 100755 index 00000000..b68870d4 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetSet.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/getset + * + * @author Daniele Alessandri + */ +class StringGetSet extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'GETSET'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrement.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrement.php new file mode 100755 index 00000000..fa1846e2 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrement.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/incr + * + * @author Daniele Alessandri + */ +class StringIncrement extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'INCR'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrementBy.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrementBy.php new file mode 100755 index 00000000..9d8241a2 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrementBy.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/incrby + * + * @author Daniele Alessandri + */ +class StringIncrementBy extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'INCRBY'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrementByFloat.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrementByFloat.php new file mode 100755 index 00000000..164a0869 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrementByFloat.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/incrbyfloat + * + * @author Daniele Alessandri + */ +class StringIncrementByFloat extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'INCRBYFLOAT'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringPreciseSetExpire.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringPreciseSetExpire.php new file mode 100755 index 00000000..2faa954d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringPreciseSetExpire.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/psetex + * + * @author Daniele Alessandri + */ +class StringPreciseSetExpire extends StringSetExpire +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'PSETEX'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSet.php new file mode 100755 index 00000000..b1469945 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSet.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/set + * + * @author Daniele Alessandri + */ +class StringSet extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SET'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetBit.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetBit.php new file mode 100755 index 00000000..7933b6be --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetBit.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/setbit + * + * @author Daniele Alessandri + */ +class StringSetBit extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SETBIT'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetExpire.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetExpire.php new file mode 100755 index 00000000..f0881708 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetExpire.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/setex + * + * @author Daniele Alessandri + */ +class StringSetExpire extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SETEX'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetMultiple.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetMultiple.php new file mode 100755 index 00000000..a3c5324d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetMultiple.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/mset + * + * @author Daniele Alessandri + */ +class StringSetMultiple extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'MSET'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + if (count($arguments) === 1 && is_array($arguments[0])) { + $flattenedKVs = array(); + $args = $arguments[0]; + + foreach ($args as $k => $v) { + $flattenedKVs[] = $k; + $flattenedKVs[] = $v; + } + + return $flattenedKVs; + } + + return $arguments; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetMultiplePreserve.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetMultiplePreserve.php new file mode 100755 index 00000000..f98f1f7c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetMultiplePreserve.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/msetnx + * + * @author Daniele Alessandri + */ +class StringSetMultiplePreserve extends StringSetMultiple +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'MSETNX'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + return (bool) $data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetPreserve.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetPreserve.php new file mode 100755 index 00000000..726c35c8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetPreserve.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/setnx + * + * @author Daniele Alessandri + */ +class StringSetPreserve extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SETNX'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + return (bool) $data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetRange.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetRange.php new file mode 100755 index 00000000..4d9389f4 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetRange.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/setrange + * + * @author Daniele Alessandri + */ +class StringSetRange extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SETRANGE'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringStrlen.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringStrlen.php new file mode 100755 index 00000000..10f492fd --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringStrlen.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/strlen + * + * @author Daniele Alessandri + */ +class StringStrlen extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'STRLEN'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSubstr.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSubstr.php new file mode 100755 index 00000000..3aab7ade --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSubstr.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/substr + * + * @author Daniele Alessandri + */ +class StringSubstr extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'SUBSTR'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionDiscard.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionDiscard.php new file mode 100755 index 00000000..44aca2b1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionDiscard.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/discard + * + * @author Daniele Alessandri + */ +class TransactionDiscard extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'DISCARD'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionExec.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionExec.php new file mode 100755 index 00000000..dbd81aae --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionExec.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/exec + * + * @author Daniele Alessandri + */ +class TransactionExec extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'EXEC'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionMulti.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionMulti.php new file mode 100755 index 00000000..673bf55d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionMulti.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/multi + * + * @author Daniele Alessandri + */ +class TransactionMulti extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'MULTI'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionUnwatch.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionUnwatch.php new file mode 100755 index 00000000..79255544 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionUnwatch.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/unwatch + * + * @author Daniele Alessandri + */ +class TransactionUnwatch extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'UNWATCH'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionWatch.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionWatch.php new file mode 100755 index 00000000..d3607801 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionWatch.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/watch + * + * @author Daniele Alessandri + */ +class TransactionWatch extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'WATCH'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + if (isset($arguments[0]) && is_array($arguments[0])) { + return $arguments[0]; + } + + return $arguments; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetAdd.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetAdd.php new file mode 100755 index 00000000..55e4729e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetAdd.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/zadd + * + * @author Daniele Alessandri + */ +class ZSetAdd extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ZADD'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + if (is_array(end($arguments))) { + foreach (array_pop($arguments) as $member => $score) { + $arguments[] = $score; + $arguments[] = $member; + } + } + + return $arguments; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetCardinality.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetCardinality.php new file mode 100755 index 00000000..10332009 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetCardinality.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/zcard + * + * @author Daniele Alessandri + */ +class ZSetCardinality extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ZCARD'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetCount.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetCount.php new file mode 100755 index 00000000..918bd2b8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetCount.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/zcount + * + * @author Daniele Alessandri + */ +class ZSetCount extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ZCOUNT'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetIncrementBy.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetIncrementBy.php new file mode 100755 index 00000000..245a8e0f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetIncrementBy.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/zincrby + * + * @author Daniele Alessandri + */ +class ZSetIncrementBy extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ZINCRBY'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetIntersectionStore.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetIntersectionStore.php new file mode 100755 index 00000000..572a7a32 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetIntersectionStore.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/zinterstore + * + * @author Daniele Alessandri + */ +class ZSetIntersectionStore extends ZSetUnionStore +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ZINTERSTORE'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetLexCount.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetLexCount.php new file mode 100755 index 00000000..447b8eb3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetLexCount.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/zlexcount + * + * @author Daniele Alessandri + */ +class ZSetLexCount extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ZLEXCOUNT'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRange.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRange.php new file mode 100755 index 00000000..ce72c7c0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRange.php @@ -0,0 +1,105 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/zrange + * + * @author Daniele Alessandri + */ +class ZSetRange extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ZRANGE'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + if (count($arguments) === 4) { + $lastType = gettype($arguments[3]); + + if ($lastType === 'string' && strtoupper($arguments[3]) === 'WITHSCORES') { + // Used for compatibility with older versions + $arguments[3] = array('WITHSCORES' => true); + $lastType = 'array'; + } + + if ($lastType === 'array') { + $options = $this->prepareOptions(array_pop($arguments)); + + return array_merge($arguments, $options); + } + } + + return $arguments; + } + + /** + * Returns a list of options and modifiers compatible with Redis. + * + * @param array $options List of options. + * + * @return array + */ + protected function prepareOptions($options) + { + $opts = array_change_key_case($options, CASE_UPPER); + $finalizedOpts = array(); + + if (!empty($opts['WITHSCORES'])) { + $finalizedOpts[] = 'WITHSCORES'; + } + + return $finalizedOpts; + } + + /** + * Checks for the presence of the WITHSCORES modifier. + * + * @return bool + */ + protected function withScores() + { + $arguments = $this->getArguments(); + + if (count($arguments) < 4) { + return false; + } + + return strtoupper($arguments[3]) === 'WITHSCORES'; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + if ($this->withScores()) { + $result = array(); + + for ($i = 0; $i < count($data); ++$i) { + $result[$data[$i]] = $data[++$i]; + } + + return $result; + } + + return $data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRangeByLex.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRangeByLex.php new file mode 100755 index 00000000..9b2991a8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRangeByLex.php @@ -0,0 +1,55 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/zrangebylex + * + * @author Daniele Alessandri + */ +class ZSetRangeByLex extends ZSetRange +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ZRANGEBYLEX'; + } + + /** + * {@inheritdoc} + */ + protected function prepareOptions($options) + { + $opts = array_change_key_case($options, CASE_UPPER); + $finalizedOpts = array(); + + if (isset($opts['LIMIT']) && is_array($opts['LIMIT'])) { + $limit = array_change_key_case($opts['LIMIT'], CASE_UPPER); + + $finalizedOpts[] = 'LIMIT'; + $finalizedOpts[] = isset($limit['OFFSET']) ? $limit['OFFSET'] : $limit[0]; + $finalizedOpts[] = isset($limit['COUNT']) ? $limit['COUNT'] : $limit[1]; + } + + return $finalizedOpts; + } + + /** + * {@inheritdoc} + */ + protected function withScores() + { + return false; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRangeByScore.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRangeByScore.php new file mode 100755 index 00000000..961a5bc2 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRangeByScore.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/zrangebyscore + * + * @author Daniele Alessandri + */ +class ZSetRangeByScore extends ZSetRange +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ZRANGEBYSCORE'; + } + + /** + * {@inheritdoc} + */ + protected function prepareOptions($options) + { + $opts = array_change_key_case($options, CASE_UPPER); + $finalizedOpts = array(); + + if (isset($opts['LIMIT']) && is_array($opts['LIMIT'])) { + $limit = array_change_key_case($opts['LIMIT'], CASE_UPPER); + + $finalizedOpts[] = 'LIMIT'; + $finalizedOpts[] = isset($limit['OFFSET']) ? $limit['OFFSET'] : $limit[0]; + $finalizedOpts[] = isset($limit['COUNT']) ? $limit['COUNT'] : $limit[1]; + } + + return array_merge($finalizedOpts, parent::prepareOptions($options)); + } + + /** + * {@inheritdoc} + */ + protected function withScores() + { + $arguments = $this->getArguments(); + + for ($i = 3; $i < count($arguments); ++$i) { + switch (strtoupper($arguments[$i])) { + case 'WITHSCORES': + return true; + + case 'LIMIT': + $i += 2; + break; + } + } + + return false; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRank.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRank.php new file mode 100755 index 00000000..d0c9c536 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRank.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/zrank + * + * @author Daniele Alessandri + */ +class ZSetRank extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ZRANK'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemove.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemove.php new file mode 100755 index 00000000..cd8ada05 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemove.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/zrem + * + * @author Daniele Alessandri + */ +class ZSetRemove extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ZREM'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + return self::normalizeVariadic($arguments); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByLex.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByLex.php new file mode 100755 index 00000000..9ea2d9e5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByLex.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/zremrangebylex + * + * @author Daniele Alessandri + */ +class ZSetRemoveRangeByLex extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ZREMRANGEBYLEX'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByRank.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByRank.php new file mode 100755 index 00000000..89cd5baf --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByRank.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/zremrangebyrank + * + * @author Daniele Alessandri + */ +class ZSetRemoveRangeByRank extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ZREMRANGEBYRANK'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByScore.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByScore.php new file mode 100755 index 00000000..a7c30814 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByScore.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/zremrangebyscore + * + * @author Daniele Alessandri + */ +class ZSetRemoveRangeByScore extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ZREMRANGEBYSCORE'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRange.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRange.php new file mode 100755 index 00000000..6a46a7a5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRange.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/zrevrange + * + * @author Daniele Alessandri + */ +class ZSetReverseRange extends ZSetRange +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ZREVRANGE'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRangeByLex.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRangeByLex.php new file mode 100755 index 00000000..cdd8ba62 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRangeByLex.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +class ZSetReverseRangeByLex extends ZSetRangeByLex +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ZREVRANGEBYLEX'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRangeByScore.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRangeByScore.php new file mode 100755 index 00000000..1078eb72 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRangeByScore.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/zrevrangebyscore + * + * @author Daniele Alessandri + */ +class ZSetReverseRangeByScore extends ZSetRangeByScore +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ZREVRANGEBYSCORE'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRank.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRank.php new file mode 100755 index 00000000..33fb8158 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRank.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/zrevrank + * + * @author Daniele Alessandri + */ +class ZSetReverseRank extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ZREVRANK'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetScan.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetScan.php new file mode 100755 index 00000000..1dc2352e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetScan.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/zscan + * + * @author Daniele Alessandri + */ +class ZSetScan extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ZSCAN'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + if (count($arguments) === 3 && is_array($arguments[2])) { + $options = $this->prepareOptions(array_pop($arguments)); + $arguments = array_merge($arguments, $options); + } + + return $arguments; + } + + /** + * Returns a list of options and modifiers compatible with Redis. + * + * @param array $options List of options. + * + * @return array + */ + protected function prepareOptions($options) + { + $options = array_change_key_case($options, CASE_UPPER); + $normalized = array(); + + if (!empty($options['MATCH'])) { + $normalized[] = 'MATCH'; + $normalized[] = $options['MATCH']; + } + + if (!empty($options['COUNT'])) { + $normalized[] = 'COUNT'; + $normalized[] = $options['COUNT']; + } + + return $normalized; + } + + /** + * {@inheritdoc} + */ + public function parseResponse($data) + { + if (is_array($data)) { + $members = $data[1]; + $result = array(); + + for ($i = 0; $i < count($members); ++$i) { + $result[$members[$i]] = (float) $members[++$i]; + } + + $data[1] = $result; + } + + return $data; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetScore.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetScore.php new file mode 100755 index 00000000..2e7fce8e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetScore.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/zscore + * + * @author Daniele Alessandri + */ +class ZSetScore extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ZSCORE'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetUnionStore.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetUnionStore.php new file mode 100755 index 00000000..befc5ce7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetUnionStore.php @@ -0,0 +1,78 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/zunionstore + * + * @author Daniele Alessandri + */ +class ZSetUnionStore extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'ZUNIONSTORE'; + } + + /** + * {@inheritdoc} + */ + protected function filterArguments(array $arguments) + { + $options = array(); + $argc = count($arguments); + + if ($argc > 2 && is_array($arguments[$argc - 1])) { + $options = $this->prepareOptions(array_pop($arguments)); + } + + if (is_array($arguments[1])) { + $arguments = array_merge( + array($arguments[0], count($arguments[1])), + $arguments[1] + ); + } + + return array_merge($arguments, $options); + } + + /** + * Returns a list of options and modifiers compatible with Redis. + * + * @param array $options List of options. + * + * @return array + */ + private function prepareOptions($options) + { + $opts = array_change_key_case($options, CASE_UPPER); + $finalizedOpts = array(); + + if (isset($opts['WEIGHTS']) && is_array($opts['WEIGHTS'])) { + $finalizedOpts[] = 'WEIGHTS'; + + foreach ($opts['WEIGHTS'] as $weight) { + $finalizedOpts[] = $weight; + } + } + + if (isset($opts['AGGREGATE'])) { + $finalizedOpts[] = 'AGGREGATE'; + $finalizedOpts[] = $opts['AGGREGATE']; + } + + return $finalizedOpts; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/CommunicationException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/CommunicationException.php new file mode 100755 index 00000000..13fe357c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/CommunicationException.php @@ -0,0 +1,80 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis; + +use Predis\Connection\NodeConnectionInterface; + +/** + * Base exception class for network-related errors. + * + * @author Daniele Alessandri + */ +abstract class CommunicationException extends PredisException +{ + private $connection; + + /** + * @param NodeConnectionInterface $connection Connection that generated the exception. + * @param string $message Error message. + * @param int $code Error code. + * @param \Exception $innerException Inner exception for wrapping the original error. + */ + public function __construct( + NodeConnectionInterface $connection, + $message = null, + $code = null, + \Exception $innerException = null + ) { + parent::__construct($message, $code, $innerException); + $this->connection = $connection; + } + + /** + * Gets the connection that generated the exception. + * + * @return NodeConnectionInterface + */ + public function getConnection() + { + return $this->connection; + } + + /** + * Indicates if the receiver should reset the underlying connection. + * + * @return bool + */ + public function shouldResetConnection() + { + return true; + } + + /** + * Helper method to handle exceptions generated by a connection object. + * + * @param CommunicationException $exception Exception. + * + * @throws CommunicationException + */ + public static function handle(CommunicationException $exception) + { + if ($exception->shouldResetConnection()) { + $connection = $exception->getConnection(); + + if ($connection->isConnected()) { + $connection->disconnect(); + } + } + + throw $exception; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ClusterOption.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ClusterOption.php new file mode 100755 index 00000000..69e36de7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ClusterOption.php @@ -0,0 +1,76 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Configuration; + +use Predis\Connection\Aggregate\ClusterInterface; +use Predis\Connection\Aggregate\PredisCluster; +use Predis\Connection\Aggregate\RedisCluster; + +/** + * Configures an aggregate connection used for clustering + * multiple Redis nodes using various implementations with + * different algorithms or strategies. + * + * @author Daniele Alessandri + */ +class ClusterOption implements OptionInterface +{ + /** + * Creates a new cluster connection from on a known descriptive name. + * + * @param OptionsInterface $options Instance of the client options. + * @param string $id Descriptive identifier of the cluster type (`predis`, `redis-cluster`) + * + * @return ClusterInterface|null + */ + protected function createByDescription(OptionsInterface $options, $id) + { + switch ($id) { + case 'predis': + case 'predis-cluster': + return new PredisCluster(); + + case 'redis': + case 'redis-cluster': + return new RedisCluster($options->connections); + + default: + return; + } + } + + /** + * {@inheritdoc} + */ + public function filter(OptionsInterface $options, $value) + { + if (is_string($value)) { + $value = $this->createByDescription($options, $value); + } + + if (!$value instanceof ClusterInterface) { + throw new \InvalidArgumentException( + "An instance of type 'Predis\Connection\Aggregate\ClusterInterface' was expected." + ); + } + + return $value; + } + + /** + * {@inheritdoc} + */ + public function getDefault(OptionsInterface $options) + { + return new PredisCluster(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ConnectionFactoryOption.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ConnectionFactoryOption.php new file mode 100755 index 00000000..ba38df96 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ConnectionFactoryOption.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Configuration; + +use Predis\Connection\Factory; +use Predis\Connection\FactoryInterface; + +/** + * Configures a connection factory used by the client to create new connection + * instances for single Redis nodes. + * + * @author Daniele Alessandri + */ +class ConnectionFactoryOption implements OptionInterface +{ + /** + * {@inheritdoc} + */ + public function filter(OptionsInterface $options, $value) + { + if ($value instanceof FactoryInterface) { + return $value; + } elseif (is_array($value)) { + $factory = $this->getDefault($options); + + foreach ($value as $scheme => $initializer) { + $factory->define($scheme, $initializer); + } + + return $factory; + } else { + throw new \InvalidArgumentException( + 'Invalid value provided for the connections option.' + ); + } + } + + /** + * {@inheritdoc} + */ + public function getDefault(OptionsInterface $options) + { + return new Factory(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ExceptionsOption.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ExceptionsOption.php new file mode 100755 index 00000000..337733e4 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ExceptionsOption.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Configuration; + +/** + * Configures whether consumers (such as the client) should throw exceptions on + * Redis errors (-ERR responses) or just return instances of error responses. + * + * @author Daniele Alessandri + */ +class ExceptionsOption implements OptionInterface +{ + /** + * {@inheritdoc} + */ + public function filter(OptionsInterface $options, $value) + { + return filter_var($value, FILTER_VALIDATE_BOOLEAN); + } + + /** + * {@inheritdoc} + */ + public function getDefault(OptionsInterface $options) + { + return true; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/OptionInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/OptionInterface.php new file mode 100755 index 00000000..b31e0c98 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/OptionInterface.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Configuration; + +/** + * Defines an handler used by Predis\Configuration\Options to filter, validate + * or return default values for a given option. + * + * @author Daniele Alessandri + */ +interface OptionInterface +{ + /** + * Filters and validates the passed value. + * + * @param OptionsInterface $options Options container. + * @param mixed $value Input value. + * + * @return mixed + */ + public function filter(OptionsInterface $options, $value); + + /** + * Returns the default value for the option. + * + * @param OptionsInterface $options Options container. + * + * @return mixed + */ + public function getDefault(OptionsInterface $options); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/Options.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/Options.php new file mode 100755 index 00000000..6f3b331b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/Options.php @@ -0,0 +1,122 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Configuration; + +/** + * Manages Predis options with filtering, conversion and lazy initialization of + * values using a mini-DI container approach. + * + * {@inheritdoc} + * + * @author Daniele Alessandri + */ +class Options implements OptionsInterface +{ + protected $input; + protected $options; + protected $handlers; + + /** + * @param array $options Array of options with their values + */ + public function __construct(array $options = array()) + { + $this->input = $options; + $this->options = array(); + $this->handlers = $this->getHandlers(); + } + + /** + * Ensures that the default options are initialized. + * + * @return array + */ + protected function getHandlers() + { + return array( + 'cluster' => 'Predis\Configuration\ClusterOption', + 'connections' => 'Predis\Configuration\ConnectionFactoryOption', + 'exceptions' => 'Predis\Configuration\ExceptionsOption', + 'prefix' => 'Predis\Configuration\PrefixOption', + 'profile' => 'Predis\Configuration\ProfileOption', + 'replication' => 'Predis\Configuration\ReplicationOption', + ); + } + + /** + * {@inheritdoc} + */ + public function getDefault($option) + { + if (isset($this->handlers[$option])) { + $handler = $this->handlers[$option]; + $handler = new $handler(); + + return $handler->getDefault($this); + } + } + + /** + * {@inheritdoc} + */ + public function defined($option) + { + return ( + array_key_exists($option, $this->options) || + array_key_exists($option, $this->input) + ); + } + + /** + * {@inheritdoc} + */ + public function __isset($option) + { + return ( + array_key_exists($option, $this->options) || + array_key_exists($option, $this->input) + ) && $this->__get($option) !== null; + } + + /** + * {@inheritdoc} + */ + public function __get($option) + { + if (isset($this->options[$option]) || array_key_exists($option, $this->options)) { + return $this->options[$option]; + } + + if (isset($this->input[$option]) || array_key_exists($option, $this->input)) { + $value = $this->input[$option]; + unset($this->input[$option]); + + if (is_object($value) && method_exists($value, '__invoke')) { + $value = $value($this, $option); + } + + if (isset($this->handlers[$option])) { + $handler = $this->handlers[$option]; + $handler = new $handler(); + $value = $handler->filter($this, $value); + } + + return $this->options[$option] = $value; + } + + if (isset($this->handlers[$option])) { + return $this->options[$option] = $this->getDefault($option); + } + + return; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/OptionsInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/OptionsInterface.php new file mode 100755 index 00000000..f8116470 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/OptionsInterface.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Configuration; + +/** + * Interface defining a container for client options. + * + * @property-read mixed aggregate Custom connection aggregator. + * @property-read mixed cluster Aggregate connection for clustering. + * @property-read mixed connections Connection factory. + * @property-read mixed exceptions Toggles exceptions in client for -ERR responses. + * @property-read mixed prefix Key prefixing strategy using the given prefix. + * @property-read mixed profile Server profile. + * @property-read mixed replication Aggregate connection for replication. + * + * @author Daniele Alessandri + */ +interface OptionsInterface +{ + /** + * Returns the default value for the given option. + * + * @param string $option Name of the option. + * + * @return mixed|null + */ + public function getDefault($option); + + /** + * Checks if the given option has been set by the user upon initialization. + * + * @param string $option Name of the option. + * + * @return bool + */ + public function defined($option); + + /** + * Checks if the given option has been set and does not evaluate to NULL. + * + * @param string $option Name of the option. + * + * @return bool + */ + public function __isset($option); + + /** + * Returns the value of the given option. + * + * @param string $option Name of the option. + * + * @return mixed|null + */ + public function __get($option); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/PrefixOption.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/PrefixOption.php new file mode 100755 index 00000000..5827cdc3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/PrefixOption.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Configuration; + +use Predis\Command\Processor\KeyPrefixProcessor; +use Predis\Command\Processor\ProcessorInterface; + +/** + * Configures a command processor that apply the specified prefix string to a + * series of Redis commands considered prefixable. + * + * @author Daniele Alessandri + */ +class PrefixOption implements OptionInterface +{ + /** + * {@inheritdoc} + */ + public function filter(OptionsInterface $options, $value) + { + if ($value instanceof ProcessorInterface) { + return $value; + } + + return new KeyPrefixProcessor($value); + } + + /** + * {@inheritdoc} + */ + public function getDefault(OptionsInterface $options) + { + // NOOP + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ProfileOption.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ProfileOption.php new file mode 100755 index 00000000..864936e0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ProfileOption.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Configuration; + +use Predis\Profile\Factory; +use Predis\Profile\ProfileInterface; +use Predis\Profile\RedisProfile; + +/** + * Configures the server profile to be used by the client to create command + * instances depending on the specified version of the Redis server. + * + * @author Daniele Alessandri + */ +class ProfileOption implements OptionInterface +{ + /** + * Sets the commands processors that need to be applied to the profile. + * + * @param OptionsInterface $options Client options. + * @param ProfileInterface $profile Server profile. + */ + protected function setProcessors(OptionsInterface $options, ProfileInterface $profile) + { + if (isset($options->prefix) && $profile instanceof RedisProfile) { + // NOTE: directly using __get('prefix') is actually a workaround for + // HHVM 2.3.0. It's correct and respects the options interface, it's + // just ugly. We will remove this hack when HHVM will fix re-entrant + // calls to __get() once and for all. + + $profile->setProcessor($options->__get('prefix')); + } + } + + /** + * {@inheritdoc} + */ + public function filter(OptionsInterface $options, $value) + { + if (is_string($value)) { + $value = Factory::get($value); + $this->setProcessors($options, $value); + } elseif (!$value instanceof ProfileInterface) { + throw new \InvalidArgumentException('Invalid value for the profile option.'); + } + + return $value; + } + + /** + * {@inheritdoc} + */ + public function getDefault(OptionsInterface $options) + { + $profile = Factory::getDefault(); + $this->setProcessors($options, $profile); + + return $profile; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ReplicationOption.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ReplicationOption.php new file mode 100755 index 00000000..fd2c8108 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ReplicationOption.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Configuration; + +use Predis\Connection\Aggregate\MasterSlaveReplication; +use Predis\Connection\Aggregate\ReplicationInterface; + +/** + * Configures an aggregate connection used for master/slave replication among + * multiple Redis nodes. + * + * @author Daniele Alessandri + */ +class ReplicationOption implements OptionInterface +{ + /** + * {@inheritdoc} + * + * @todo There's more code than needed due to a bug in filter_var() as + * discussed here https://bugs.php.net/bug.php?id=49510 and different + * behaviours when encountering NULL values on PHP 5.3. + */ + public function filter(OptionsInterface $options, $value) + { + if ($value instanceof ReplicationInterface) { + return $value; + } + + if (is_bool($value) || $value === null) { + return $value ? $this->getDefault($options) : null; + } + + if ( + !is_object($value) && + null !== $asbool = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) + ) { + return $asbool ? $this->getDefault($options) : null; + } + + throw new \InvalidArgumentException( + "An instance of type 'Predis\Connection\Aggregate\ReplicationInterface' was expected." + ); + } + + /** + * {@inheritdoc} + */ + public function getDefault(OptionsInterface $options) + { + return new MasterSlaveReplication(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/AbstractConnection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/AbstractConnection.php new file mode 100755 index 00000000..029a337e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/AbstractConnection.php @@ -0,0 +1,239 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Connection; + +use Predis\Command\CommandInterface; +use Predis\CommunicationException; +use Predis\Protocol\ProtocolException; + +/** + * Base class with the common logic used by connection classes to communicate + * with Redis. + * + * @author Daniele Alessandri + */ +abstract class AbstractConnection implements NodeConnectionInterface +{ + private $resource; + private $cachedId; + + protected $parameters; + protected $initCommands = array(); + + /** + * @param ParametersInterface $parameters Initialization parameters for the connection. + */ + public function __construct(ParametersInterface $parameters) + { + $this->parameters = $this->assertParameters($parameters); + } + + /** + * Disconnects from the server and destroys the underlying resource when + * PHP's garbage collector kicks in. + */ + public function __destruct() + { + $this->disconnect(); + } + + /** + * Checks some of the parameters used to initialize the connection. + * + * @param ParametersInterface $parameters Initialization parameters for the connection. + * + * @throws \InvalidArgumentException + * + * @return ParametersInterface + */ + protected function assertParameters(ParametersInterface $parameters) + { + switch ($parameters->scheme) { + case 'tcp': + case 'redis': + case 'unix': + break; + + default: + throw new \InvalidArgumentException("Invalid scheme: '$parameters->scheme'."); + } + + return $parameters; + } + + /** + * Creates the underlying resource used to communicate with Redis. + * + * @return mixed + */ + abstract protected function createResource(); + + /** + * {@inheritdoc} + */ + public function isConnected() + { + return isset($this->resource); + } + + /** + * {@inheritdoc} + */ + public function connect() + { + if (!$this->isConnected()) { + $this->resource = $this->createResource(); + + return true; + } + + return false; + } + + /** + * {@inheritdoc} + */ + public function disconnect() + { + unset($this->resource); + } + + /** + * {@inheritdoc} + */ + public function addConnectCommand(CommandInterface $command) + { + $this->initCommands[] = $command; + } + + /** + * {@inheritdoc} + */ + public function executeCommand(CommandInterface $command) + { + $this->writeRequest($command); + + return $this->readResponse($command); + } + + /** + * {@inheritdoc} + */ + public function readResponse(CommandInterface $command) + { + return $this->read(); + } + + /** + * Helper method that returns an exception message augmented with useful + * details from the connection parameters. + * + * @param string $message Error message. + * + * @return string + */ + private function createExceptionMessage($message) + { + $parameters = $this->parameters; + + if ($parameters->scheme === 'unix') { + return "$message [$parameters->scheme:$parameters->path]"; + } + + if (filter_var($parameters->host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { + return "$message [$parameters->scheme://[$parameters->host]:$parameters->port]"; + } + + return "$message [$parameters->scheme://$parameters->host:$parameters->port]"; + } + + /** + * Helper method to handle connection errors. + * + * @param string $message Error message. + * @param int $code Error code. + */ + protected function onConnectionError($message, $code = null) + { + CommunicationException::handle( + new ConnectionException($this, static::createExceptionMessage($message), $code) + ); + } + + /** + * Helper method to handle protocol errors. + * + * @param string $message Error message. + */ + protected function onProtocolError($message) + { + CommunicationException::handle( + new ProtocolException($this, static::createExceptionMessage($message)) + ); + } + + /** + * {@inheritdoc} + */ + public function getResource() + { + if (isset($this->resource)) { + return $this->resource; + } + + $this->connect(); + + return $this->resource; + } + + /** + * {@inheritdoc} + */ + public function getParameters() + { + return $this->parameters; + } + + /** + * Gets an identifier for the connection. + * + * @return string + */ + protected function getIdentifier() + { + if ($this->parameters->scheme === 'unix') { + return $this->parameters->path; + } + + return "{$this->parameters->host}:{$this->parameters->port}"; + } + + /** + * {@inheritdoc} + */ + public function __toString() + { + if (!isset($this->cachedId)) { + $this->cachedId = $this->getIdentifier(); + } + + return $this->cachedId; + } + + /** + * {@inheritdoc} + */ + public function __sleep() + { + return array('parameters', 'initCommands'); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/ClusterInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/ClusterInterface.php new file mode 100755 index 00000000..af0f5aab --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/ClusterInterface.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Connection\Aggregate; + +use Predis\Connection\AggregateConnectionInterface; + +/** + * Defines a cluster of Redis servers formed by aggregating multiple connection + * instances to single Redis nodes. + * + * @author Daniele Alessandri + */ +interface ClusterInterface extends AggregateConnectionInterface +{ +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/MasterSlaveReplication.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/MasterSlaveReplication.php new file mode 100755 index 00000000..3104a753 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/MasterSlaveReplication.php @@ -0,0 +1,264 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Connection\Aggregate; + +use Predis\Command\CommandInterface; +use Predis\Connection\NodeConnectionInterface; +use Predis\Replication\ReplicationStrategy; + +/** + * Aggregate connection handling replication of Redis nodes configured in a + * single master / multiple slaves setup. + * + * @author Daniele Alessandri + */ +class MasterSlaveReplication implements ReplicationInterface +{ + protected $strategy; + protected $master; + protected $slaves; + protected $current; + + /** + * {@inheritdoc} + */ + public function __construct(ReplicationStrategy $strategy = null) + { + $this->slaves = array(); + $this->strategy = $strategy ?: new ReplicationStrategy(); + } + + /** + * Checks if one master and at least one slave have been defined. + */ + protected function check() + { + if (!isset($this->master) || !$this->slaves) { + throw new \RuntimeException('Replication needs one master and at least one slave.'); + } + } + + /** + * Resets the connection state. + */ + protected function reset() + { + $this->current = null; + } + + /** + * {@inheritdoc} + */ + public function add(NodeConnectionInterface $connection) + { + $alias = $connection->getParameters()->alias; + + if ($alias === 'master') { + $this->master = $connection; + } else { + $this->slaves[$alias ?: count($this->slaves)] = $connection; + } + + $this->reset(); + } + + /** + * {@inheritdoc} + */ + public function remove(NodeConnectionInterface $connection) + { + if ($connection->getParameters()->alias === 'master') { + $this->master = null; + $this->reset(); + + return true; + } else { + if (($id = array_search($connection, $this->slaves, true)) !== false) { + unset($this->slaves[$id]); + $this->reset(); + + return true; + } + } + + return false; + } + + /** + * {@inheritdoc} + */ + public function getConnection(CommandInterface $command) + { + if ($this->current === null) { + $this->check(); + $this->current = $this->strategy->isReadOperation($command) + ? $this->pickSlave() + : $this->master; + + return $this->current; + } + + if ($this->current === $this->master) { + return $this->current; + } + + if (!$this->strategy->isReadOperation($command)) { + $this->current = $this->master; + } + + return $this->current; + } + + /** + * {@inheritdoc} + */ + public function getConnectionById($connectionId) + { + if ($connectionId === 'master') { + return $this->master; + } + + if (isset($this->slaves[$connectionId])) { + return $this->slaves[$connectionId]; + } + + return; + } + + /** + * {@inheritdoc} + */ + public function switchTo($connection) + { + $this->check(); + + if (!$connection instanceof NodeConnectionInterface) { + $connection = $this->getConnectionById($connection); + } + if ($connection !== $this->master && !in_array($connection, $this->slaves, true)) { + throw new \InvalidArgumentException('Invalid connection or connection not found.'); + } + + $this->current = $connection; + } + + /** + * {@inheritdoc} + */ + public function getCurrent() + { + return $this->current; + } + + /** + * {@inheritdoc} + */ + public function getMaster() + { + return $this->master; + } + + /** + * {@inheritdoc} + */ + public function getSlaves() + { + return array_values($this->slaves); + } + + /** + * Returns the underlying replication strategy. + * + * @return ReplicationStrategy + */ + public function getReplicationStrategy() + { + return $this->strategy; + } + + /** + * Returns a random slave. + * + * @return NodeConnectionInterface + */ + protected function pickSlave() + { + return $this->slaves[array_rand($this->slaves)]; + } + + /** + * {@inheritdoc} + */ + public function isConnected() + { + return $this->current ? $this->current->isConnected() : false; + } + + /** + * {@inheritdoc} + */ + public function connect() + { + if ($this->current === null) { + $this->check(); + $this->current = $this->pickSlave(); + } + + $this->current->connect(); + } + + /** + * {@inheritdoc} + */ + public function disconnect() + { + if ($this->master) { + $this->master->disconnect(); + } + + foreach ($this->slaves as $connection) { + $connection->disconnect(); + } + } + + /** + * {@inheritdoc} + */ + public function writeRequest(CommandInterface $command) + { + $this->getConnection($command)->writeRequest($command); + } + + /** + * {@inheritdoc} + */ + public function readResponse(CommandInterface $command) + { + return $this->getConnection($command)->readResponse($command); + } + + /** + * {@inheritdoc} + */ + public function executeCommand(CommandInterface $command) + { + return $this->getConnection($command)->executeCommand($command); + } + + /** + * {@inheritdoc} + */ + public function __sleep() + { + return array('master', 'slaves', 'strategy'); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/PredisCluster.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/PredisCluster.php new file mode 100755 index 00000000..33f98bf2 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/PredisCluster.php @@ -0,0 +1,235 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Connection\Aggregate; + +use Predis\Cluster\PredisStrategy; +use Predis\Cluster\StrategyInterface; +use Predis\Command\CommandInterface; +use Predis\Connection\NodeConnectionInterface; +use Predis\NotSupportedException; + +/** + * Abstraction for a cluster of aggregate connections to various Redis servers + * implementing client-side sharding based on pluggable distribution strategies. + * + * @author Daniele Alessandri + * + * @todo Add the ability to remove connections from pool. + */ +class PredisCluster implements ClusterInterface, \IteratorAggregate, \Countable +{ + private $pool; + private $strategy; + private $distributor; + + /** + * @param StrategyInterface $strategy Optional cluster strategy. + */ + public function __construct(StrategyInterface $strategy = null) + { + $this->pool = array(); + $this->strategy = $strategy ?: new PredisStrategy(); + $this->distributor = $this->strategy->getDistributor(); + } + + /** + * {@inheritdoc} + */ + public function isConnected() + { + foreach ($this->pool as $connection) { + if ($connection->isConnected()) { + return true; + } + } + + return false; + } + + /** + * {@inheritdoc} + */ + public function connect() + { + foreach ($this->pool as $connection) { + $connection->connect(); + } + } + + /** + * {@inheritdoc} + */ + public function disconnect() + { + foreach ($this->pool as $connection) { + $connection->disconnect(); + } + } + + /** + * {@inheritdoc} + */ + public function add(NodeConnectionInterface $connection) + { + $parameters = $connection->getParameters(); + + if (isset($parameters->alias)) { + $this->pool[$parameters->alias] = $connection; + } else { + $this->pool[] = $connection; + } + + $weight = isset($parameters->weight) ? $parameters->weight : null; + $this->distributor->add($connection, $weight); + } + + /** + * {@inheritdoc} + */ + public function remove(NodeConnectionInterface $connection) + { + if (($id = array_search($connection, $this->pool, true)) !== false) { + unset($this->pool[$id]); + $this->distributor->remove($connection); + + return true; + } + + return false; + } + + /** + * Removes a connection instance using its alias or index. + * + * @param string $connectionID Alias or index of a connection. + * + * @return bool Returns true if the connection was in the pool. + */ + public function removeById($connectionID) + { + if ($connection = $this->getConnectionById($connectionID)) { + return $this->remove($connection); + } + + return false; + } + + /** + * {@inheritdoc} + */ + public function getConnection(CommandInterface $command) + { + $slot = $this->strategy->getSlot($command); + + if (!isset($slot)) { + throw new NotSupportedException( + "Cannot use '{$command->getId()}' over clusters of connections." + ); + } + + $node = $this->distributor->getBySlot($slot); + + return $node; + } + + /** + * {@inheritdoc} + */ + public function getConnectionById($connectionID) + { + return isset($this->pool[$connectionID]) ? $this->pool[$connectionID] : null; + } + + /** + * Retrieves a connection instance from the cluster using a key. + * + * @param string $key Key string. + * + * @return NodeConnectionInterface + */ + public function getConnectionByKey($key) + { + $hash = $this->strategy->getSlotByKey($key); + $node = $this->distributor->getBySlot($hash); + + return $node; + } + + /** + * Returns the underlying command hash strategy used to hash commands by + * using keys found in their arguments. + * + * @return StrategyInterface + */ + public function getClusterStrategy() + { + return $this->strategy; + } + + /** + * {@inheritdoc} + */ + public function count() + { + return count($this->pool); + } + + /** + * {@inheritdoc} + */ + public function getIterator() + { + return new \ArrayIterator($this->pool); + } + + /** + * {@inheritdoc} + */ + public function writeRequest(CommandInterface $command) + { + $this->getConnection($command)->writeRequest($command); + } + + /** + * {@inheritdoc} + */ + public function readResponse(CommandInterface $command) + { + return $this->getConnection($command)->readResponse($command); + } + + /** + * {@inheritdoc} + */ + public function executeCommand(CommandInterface $command) + { + return $this->getConnection($command)->executeCommand($command); + } + + /** + * Executes the specified Redis command on all the nodes of a cluster. + * + * @param CommandInterface $command A Redis command. + * + * @return array + */ + public function executeCommandOnNodes(CommandInterface $command) + { + $responses = array(); + + foreach ($this->pool as $connection) { + $responses[] = $connection->executeCommand($command); + } + + return $responses; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/RedisCluster.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/RedisCluster.php new file mode 100755 index 00000000..337c2870 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/RedisCluster.php @@ -0,0 +1,553 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Connection\Aggregate; + +use Predis\Cluster\RedisStrategy as RedisClusterStrategy; +use Predis\Cluster\StrategyInterface; +use Predis\Command\CommandInterface; +use Predis\Command\RawCommand; +use Predis\Connection\FactoryInterface; +use Predis\Connection\NodeConnectionInterface; +use Predis\NotSupportedException; +use Predis\Response\ErrorInterface as ErrorResponseInterface; + +/** + * Abstraction for a Redis-backed cluster of nodes (Redis >= 3.0.0). + * + * This connection backend offers smart support for redis-cluster by handling + * automatic slots map (re)generation upon -MOVED or -ASK responses returned by + * Redis when redirecting a client to a different node. + * + * The cluster can be pre-initialized using only a subset of the actual nodes in + * the cluster, Predis will do the rest by adjusting the slots map and creating + * the missing underlying connection instances on the fly. + * + * It is possible to pre-associate connections to a slots range with the "slots" + * parameter in the form "$first-$last". This can greatly reduce runtime node + * guessing and redirections. + * + * It is also possible to ask for the full and updated slots map directly to one + * of the nodes and optionally enable such a behaviour upon -MOVED redirections. + * Asking for the cluster configuration to Redis is actually done by issuing a + * CLUSTER SLOTS command to a random node in the pool. + * + * @author Daniele Alessandri + */ +class RedisCluster implements ClusterInterface, \IteratorAggregate, \Countable +{ + private $useClusterSlots = true; + private $defaultParameters = array(); + private $pool = array(); + private $slots = array(); + private $slotsMap; + private $strategy; + private $connections; + + /** + * @param FactoryInterface $connections Optional connection factory. + * @param StrategyInterface $strategy Optional cluster strategy. + */ + public function __construct( + FactoryInterface $connections, + StrategyInterface $strategy = null + ) { + $this->connections = $connections; + $this->strategy = $strategy ?: new RedisClusterStrategy(); + } + + /** + * {@inheritdoc} + */ + public function isConnected() + { + foreach ($this->pool as $connection) { + if ($connection->isConnected()) { + return true; + } + } + + return false; + } + + /** + * {@inheritdoc} + */ + public function connect() + { + if ($connection = $this->getRandomConnection()) { + $connection->connect(); + } + } + + /** + * {@inheritdoc} + */ + public function disconnect() + { + foreach ($this->pool as $connection) { + $connection->disconnect(); + } + } + + /** + * {@inheritdoc} + */ + public function add(NodeConnectionInterface $connection) + { + $this->pool[(string) $connection] = $connection; + unset($this->slotsMap); + } + + /** + * {@inheritdoc} + */ + public function remove(NodeConnectionInterface $connection) + { + if (false !== $id = array_search($connection, $this->pool, true)) { + unset( + $this->pool[$id], + $this->slotsMap + ); + + return true; + } + + return false; + } + + /** + * Removes a connection instance by using its identifier. + * + * @param string $connectionID Connection identifier. + * + * @return bool True if the connection was in the pool. + */ + public function removeById($connectionID) + { + if (isset($this->pool[$connectionID])) { + unset( + $this->pool[$connectionID], + $this->slotsMap + ); + + return true; + } + + return false; + } + + /** + * Generates the current slots map by guessing the cluster configuration out + * of the connection parameters of the connections in the pool. + * + * Generation is based on the same algorithm used by Redis to generate the + * cluster, so it is most effective when all of the connections supplied on + * initialization have the "slots" parameter properly set accordingly to the + * current cluster configuration. + */ + public function buildSlotsMap() + { + $this->slotsMap = array(); + + foreach ($this->pool as $connectionID => $connection) { + $parameters = $connection->getParameters(); + + if (!isset($parameters->slots)) { + continue; + } + + $slots = explode('-', $parameters->slots, 2); + $this->setSlots($slots[0], $slots[1], $connectionID); + } + } + + /** + * Generates an updated slots map fetching the cluster configuration using + * the CLUSTER SLOTS command against the specified node or a random one from + * the pool. + * + * @param NodeConnectionInterface $connection Optional connection instance. + * + * @return array + */ + public function askSlotsMap(NodeConnectionInterface $connection = null) + { + if (!$connection && !$connection = $this->getRandomConnection()) { + return array(); + } + + $command = RawCommand::create('CLUSTER', 'SLOTS'); + $response = $connection->executeCommand($command); + + foreach ($response as $slots) { + // We only support master servers for now, so we ignore subsequent + // elements in the $slots array identifying slaves. + list($start, $end, $master) = $slots; + + if ($master[0] === '') { + $this->setSlots($start, $end, (string) $connection); + } else { + $this->setSlots($start, $end, "{$master[0]}:{$master[1]}"); + } + } + + return $this->slotsMap; + } + + /** + * Returns the current slots map for the cluster. + * + * @return array + */ + public function getSlotsMap() + { + if (!isset($this->slotsMap)) { + $this->slotsMap = array(); + } + + return $this->slotsMap; + } + + /** + * Pre-associates a connection to a slots range to avoid runtime guessing. + * + * @param int $first Initial slot of the range. + * @param int $last Last slot of the range. + * @param NodeConnectionInterface|string $connection ID or connection instance. + * + * @throws \OutOfBoundsException + */ + public function setSlots($first, $last, $connection) + { + if ($first < 0x0000 || $first > 0x3FFF || + $last < 0x0000 || $last > 0x3FFF || + $last < $first + ) { + throw new \OutOfBoundsException( + "Invalid slot range for $connection: [$first-$last]." + ); + } + + $slots = array_fill($first, $last - $first + 1, (string) $connection); + $this->slotsMap = $this->getSlotsMap() + $slots; + } + + /** + * Guesses the correct node associated to a given slot using a precalculated + * slots map, falling back to the same logic used by Redis to initialize a + * cluster (best-effort). + * + * @param int $slot Slot index. + * + * @return string Connection ID. + */ + protected function guessNode($slot) + { + if (!isset($this->slotsMap)) { + $this->buildSlotsMap(); + } + + if (isset($this->slotsMap[$slot])) { + return $this->slotsMap[$slot]; + } + + $count = count($this->pool); + $index = min((int) ($slot / (int) (16384 / $count)), $count - 1); + $nodes = array_keys($this->pool); + + return $nodes[$index]; + } + + /** + * Creates a new connection instance from the given connection ID. + * + * @param string $connectionID Identifier for the connection. + * + * @return NodeConnectionInterface + */ + protected function createConnection($connectionID) + { + $separator = strrpos($connectionID, ':'); + + $parameters = array_merge($this->defaultParameters, array( + 'host' => substr($connectionID, 0, $separator), + 'port' => substr($connectionID, $separator + 1), + )); + + $connection = $this->connections->create($parameters); + + return $connection; + } + + /** + * {@inheritdoc} + */ + public function getConnection(CommandInterface $command) + { + $slot = $this->strategy->getSlot($command); + + if (!isset($slot)) { + throw new NotSupportedException( + "Cannot use '{$command->getId()}' with redis-cluster." + ); + } + + if (isset($this->slots[$slot])) { + return $this->slots[$slot]; + } else { + return $this->getConnectionBySlot($slot); + } + } + + /** + * Returns the connection currently associated to a given slot. + * + * @param int $slot Slot index. + * + * @throws \OutOfBoundsException + * + * @return NodeConnectionInterface + */ + public function getConnectionBySlot($slot) + { + if ($slot < 0x0000 || $slot > 0x3FFF) { + throw new \OutOfBoundsException("Invalid slot [$slot]."); + } + + if (isset($this->slots[$slot])) { + return $this->slots[$slot]; + } + + $connectionID = $this->guessNode($slot); + + if (!$connection = $this->getConnectionById($connectionID)) { + $connection = $this->createConnection($connectionID); + $this->pool[$connectionID] = $connection; + } + + return $this->slots[$slot] = $connection; + } + + /** + * {@inheritdoc} + */ + public function getConnectionById($connectionID) + { + if (isset($this->pool[$connectionID])) { + return $this->pool[$connectionID]; + } + } + + /** + * Returns a random connection from the pool. + * + * @return NodeConnectionInterface|null + */ + protected function getRandomConnection() + { + if ($this->pool) { + return $this->pool[array_rand($this->pool)]; + } + } + + /** + * Permanently associates the connection instance to a new slot. + * The connection is added to the connections pool if not yet included. + * + * @param NodeConnectionInterface $connection Connection instance. + * @param int $slot Target slot index. + */ + protected function move(NodeConnectionInterface $connection, $slot) + { + $this->pool[(string) $connection] = $connection; + $this->slots[(int) $slot] = $connection; + } + + /** + * Handles -ERR responses returned by Redis. + * + * @param CommandInterface $command Command that generated the -ERR response. + * @param ErrorResponseInterface $error Redis error response object. + * + * @return mixed + */ + protected function onErrorResponse(CommandInterface $command, ErrorResponseInterface $error) + { + $details = explode(' ', $error->getMessage(), 2); + + switch ($details[0]) { + case 'MOVED': + return $this->onMovedResponse($command, $details[1]); + + case 'ASK': + return $this->onAskResponse($command, $details[1]); + + default: + return $error; + } + } + + /** + * Handles -MOVED responses by executing again the command against the node + * indicated by the Redis response. + * + * @param CommandInterface $command Command that generated the -MOVED response. + * @param string $details Parameters of the -MOVED response. + * + * @return mixed + */ + protected function onMovedResponse(CommandInterface $command, $details) + { + list($slot, $connectionID) = explode(' ', $details, 2); + + if (!$connection = $this->getConnectionById($connectionID)) { + $connection = $this->createConnection($connectionID); + } + + if ($this->useClusterSlots) { + $this->askSlotsMap($connection); + } + + $this->move($connection, $slot); + $response = $this->executeCommand($command); + + return $response; + } + + /** + * Handles -ASK responses by executing again the command against the node + * indicated by the Redis response. + * + * @param CommandInterface $command Command that generated the -ASK response. + * @param string $details Parameters of the -ASK response. + * + * @return mixed + */ + protected function onAskResponse(CommandInterface $command, $details) + { + list($slot, $connectionID) = explode(' ', $details, 2); + + if (!$connection = $this->getConnectionById($connectionID)) { + $connection = $this->createConnection($connectionID); + } + + $connection->executeCommand(RawCommand::create('ASKING')); + $response = $connection->executeCommand($command); + + return $response; + } + + /** + * {@inheritdoc} + */ + public function writeRequest(CommandInterface $command) + { + $this->getConnection($command)->writeRequest($command); + } + + /** + * {@inheritdoc} + */ + public function readResponse(CommandInterface $command) + { + return $this->getConnection($command)->readResponse($command); + } + + /** + * {@inheritdoc} + */ + public function executeCommand(CommandInterface $command) + { + $connection = $this->getConnection($command); + $response = $connection->executeCommand($command); + + if ($response instanceof ErrorResponseInterface) { + return $this->onErrorResponse($command, $response); + } + + return $response; + } + + /** + * {@inheritdoc} + */ + public function count() + { + return count($this->pool); + } + + /** + * {@inheritdoc} + */ + public function getIterator() + { + return new \ArrayIterator(array_values($this->pool)); + } + + /** + * Returns the underlying command hash strategy used to hash commands by + * using keys found in their arguments. + * + * @return StrategyInterface + */ + public function getClusterStrategy() + { + return $this->strategy; + } + + /** + * Returns the underlying connection factory used to create new connection + * instances to Redis nodes indicated by redis-cluster. + * + * @return FactoryInterface + */ + public function getConnectionFactory() + { + return $this->connections; + } + + /** + * Enables automatic fetching of the current slots map from one of the nodes + * using the CLUSTER SLOTS command. This option is disabled by default but + * asking the current slots map to Redis upon -MOVED responses may reduce + * overhead by eliminating the trial-and-error nature of the node guessing + * procedure, mostly when targeting many keys that would end up in a lot of + * redirections. + * + * The slots map can still be manually fetched using the askSlotsMap() + * method whether or not this option is enabled. + * + * @param bool $value Enable or disable the use of CLUSTER SLOTS. + */ + public function useClusterSlots($value) + { + $this->useClusterSlots = (bool) $value; + } + + /** + * Sets a default array of connection parameters to be applied when creating + * new connection instances on the fly when they are not part of the initial + * pool supplied upon cluster initialization. + * + * These parameters are not applied to connections added to the pool using + * the add() method. + * + * @param array $parameters Array of connection parameters. + */ + public function setDefaultParameters(array $parameters) + { + $this->defaultParameters = array_merge( + $this->defaultParameters, + $parameters ?: array() + ); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/ReplicationInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/ReplicationInterface.php new file mode 100755 index 00000000..e09e8265 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/ReplicationInterface.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Connection\Aggregate; + +use Predis\Connection\AggregateConnectionInterface; +use Predis\Connection\NodeConnectionInterface; + +/** + * Defines a group of Redis nodes in a master / slave replication setup. + * + * @author Daniele Alessandri + */ +interface ReplicationInterface extends AggregateConnectionInterface +{ + /** + * Switches the internal connection instance in use. + * + * @param string $connection Alias of a connection + */ + public function switchTo($connection); + + /** + * Returns the connection instance currently in use by the aggregate + * connection. + * + * @return NodeConnectionInterface + */ + public function getCurrent(); + + /** + * Returns the connection instance for the master Redis node. + * + * @return NodeConnectionInterface + */ + public function getMaster(); + + /** + * Returns a list of connection instances to slave nodes. + * + * @return NodeConnectionInterface + */ + public function getSlaves(); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/AggregateConnectionInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/AggregateConnectionInterface.php new file mode 100755 index 00000000..7eeaede7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/AggregateConnectionInterface.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Connection; + +use Predis\Command\CommandInterface; + +/** + * Defines a virtual connection composed of multiple connection instances to + * single Redis nodes. + * + * @author Daniele Alessandri + */ +interface AggregateConnectionInterface extends ConnectionInterface +{ + /** + * Adds a connection instance to the aggregate connection. + * + * @param NodeConnectionInterface $connection Connection instance. + */ + public function add(NodeConnectionInterface $connection); + + /** + * Removes the specified connection instance from the aggregate connection. + * + * @param NodeConnectionInterface $connection Connection instance. + * + * @return bool Returns true if the connection was in the pool. + */ + public function remove(NodeConnectionInterface $connection); + + /** + * Returns the connection instance in charge for the given command. + * + * @param CommandInterface $command Command instance. + * + * @return NodeConnectionInterface + */ + public function getConnection(CommandInterface $command); + + /** + * Returns a connection instance from the aggregate connection by its alias. + * + * @param string $connectionID Connection alias. + * + * @return NodeConnectionInterface|null + */ + public function getConnectionById($connectionID); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/CompositeConnectionInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/CompositeConnectionInterface.php new file mode 100755 index 00000000..286e082c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/CompositeConnectionInterface.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Connection; + +/** + * Defines a connection to communicate with a single Redis server that leverages + * an external protocol processor to handle pluggable protocol handlers. + * + * @author Daniele Alessandri + */ +interface CompositeConnectionInterface extends NodeConnectionInterface +{ + /** + * Returns the protocol processor used by the connection. + */ + public function getProtocol(); + + /** + * Writes the buffer containing over the connection. + * + * @param string $buffer String buffer to be sent over the connection. + */ + public function writeBuffer($buffer); + + /** + * Reads the given number of bytes from the connection. + * + * @param int $length Number of bytes to read from the connection. + * + * @return string + */ + public function readBuffer($length); + + /** + * Reads a line from the connection. + * + * @param string + */ + public function readLine(); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/CompositeStreamConnection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/CompositeStreamConnection.php new file mode 100755 index 00000000..7a353405 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/CompositeStreamConnection.php @@ -0,0 +1,125 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Connection; + +use Predis\Command\CommandInterface; +use Predis\Protocol\ProtocolProcessorInterface; +use Predis\Protocol\Text\ProtocolProcessor as TextProtocolProcessor; + +/** + * Connection abstraction to Redis servers based on PHP's stream that uses an + * external protocol processor defining the protocol used for the communication. + * + * @author Daniele Alessandri + */ +class CompositeStreamConnection extends StreamConnection implements CompositeConnectionInterface +{ + protected $protocol; + + /** + * @param ParametersInterface $parameters Initialization parameters for the connection. + * @param ProtocolProcessorInterface $protocol Protocol processor. + */ + public function __construct( + ParametersInterface $parameters, + ProtocolProcessorInterface $protocol = null + ) { + $this->parameters = $this->assertParameters($parameters); + $this->protocol = $protocol ?: new TextProtocolProcessor(); + } + + /** + * {@inheritdoc} + */ + public function getProtocol() + { + return $this->protocol; + } + + /** + * {@inheritdoc} + */ + public function writeBuffer($buffer) + { + $this->write($buffer); + } + + /** + * {@inheritdoc} + */ + public function readBuffer($length) + { + if ($length <= 0) { + throw new \InvalidArgumentException('Length parameter must be greater than 0.'); + } + + $value = ''; + $socket = $this->getResource(); + + do { + $chunk = fread($socket, $length); + + if ($chunk === false || $chunk === '') { + $this->onConnectionError('Error while reading bytes from the server.'); + } + + $value .= $chunk; + } while (($length -= strlen($chunk)) > 0); + + return $value; + } + + /** + * {@inheritdoc} + */ + public function readLine() + { + $value = ''; + $socket = $this->getResource(); + + do { + $chunk = fgets($socket); + + if ($chunk === false || $chunk === '') { + $this->onConnectionError('Error while reading line from the server.'); + } + + $value .= $chunk; + } while (substr($value, -2) !== "\r\n"); + + return substr($value, 0, -2); + } + + /** + * {@inheritdoc} + */ + public function writeRequest(CommandInterface $command) + { + $this->protocol->write($this, $command); + } + + /** + * {@inheritdoc} + */ + public function read() + { + return $this->protocol->read($this); + } + + /** + * {@inheritdoc} + */ + public function __sleep() + { + return array_merge(parent::__sleep(), array('protocol')); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ConnectionException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ConnectionException.php new file mode 100755 index 00000000..ef2e9d73 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ConnectionException.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Connection; + +use Predis\CommunicationException; + +/** + * Exception class that identifies connection-related errors. + * + * @author Daniele Alessandri + */ +class ConnectionException extends CommunicationException +{ +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ConnectionInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ConnectionInterface.php new file mode 100755 index 00000000..11ace1b6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ConnectionInterface.php @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Connection; + +use Predis\Command\CommandInterface; + +/** + * Defines a connection object used to communicate with one or multiple + * Redis servers. + * + * @author Daniele Alessandri + */ +interface ConnectionInterface +{ + /** + * Opens the connection to Redis. + */ + public function connect(); + + /** + * Closes the connection to Redis. + */ + public function disconnect(); + + /** + * Checks if the connection to Redis is considered open. + * + * @return bool + */ + public function isConnected(); + + /** + * Writes the request for the given command over the connection. + * + * @param CommandInterface $command Command instance. + */ + public function writeRequest(CommandInterface $command); + + /** + * Reads the response to the given command from the connection. + * + * @param CommandInterface $command Command instance. + * + * @return mixed + */ + public function readResponse(CommandInterface $command); + + /** + * Writes a request for the given command over the connection and reads back + * the response returned by Redis. + * + * @param CommandInterface $command Command instance. + * + * @return mixed + */ + public function executeCommand(CommandInterface $command); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Factory.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Factory.php new file mode 100755 index 00000000..c2e93f88 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Factory.php @@ -0,0 +1,151 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Connection; + +use Predis\Command\RawCommand; + +/** + * Standard connection factory for creating connections to Redis nodes. + * + * @author Daniele Alessandri + */ +class Factory implements FactoryInterface +{ + protected $schemes = array( + 'tcp' => 'Predis\Connection\StreamConnection', + 'unix' => 'Predis\Connection\StreamConnection', + 'redis' => 'Predis\Connection\StreamConnection', + 'http' => 'Predis\Connection\WebdisConnection', + ); + + /** + * Checks if the provided argument represents a valid connection class + * implementing Predis\Connection\NodeConnectionInterface. Optionally, + * callable objects are used for lazy initialization of connection objects. + * + * @param mixed $initializer FQN of a connection class or a callable for lazy initialization. + * + * @throws \InvalidArgumentException + * + * @return mixed + */ + protected function checkInitializer($initializer) + { + if (is_callable($initializer)) { + return $initializer; + } + + $class = new \ReflectionClass($initializer); + + if (!$class->isSubclassOf('Predis\Connection\NodeConnectionInterface')) { + throw new \InvalidArgumentException( + 'A connection initializer must be a valid connection class or a callable object.' + ); + } + + return $initializer; + } + + /** + * {@inheritdoc} + */ + public function define($scheme, $initializer) + { + $this->schemes[$scheme] = $this->checkInitializer($initializer); + } + + /** + * {@inheritdoc} + */ + public function undefine($scheme) + { + unset($this->schemes[$scheme]); + } + + /** + * {@inheritdoc} + */ + public function create($parameters) + { + if (!$parameters instanceof ParametersInterface) { + $parameters = $this->createParameters($parameters); + } + + $scheme = $parameters->scheme; + + if (!isset($this->schemes[$scheme])) { + throw new \InvalidArgumentException("Unknown connection scheme: '$scheme'."); + } + + $initializer = $this->schemes[$scheme]; + + if (is_callable($initializer)) { + $connection = call_user_func($initializer, $parameters, $this); + } else { + $connection = new $initializer($parameters); + $this->prepareConnection($connection); + } + + if (!$connection instanceof NodeConnectionInterface) { + throw new \UnexpectedValueException( + 'Objects returned by connection initializers must implement '. + "'Predis\Connection\NodeConnectionInterface'." + ); + } + + return $connection; + } + + /** + * {@inheritdoc} + */ + public function aggregate(AggregateConnectionInterface $connection, array $parameters) + { + foreach ($parameters as $node) { + $connection->add($node instanceof NodeConnectionInterface ? $node : $this->create($node)); + } + } + + /** + * Creates a connection parameters instance from the supplied argument. + * + * @param mixed $parameters Original connection parameters. + * + * @return ParametersInterface + */ + protected function createParameters($parameters) + { + return Parameters::create($parameters); + } + + /** + * Prepares a connection instance after its initialization. + * + * @param NodeConnectionInterface $connection Connection instance. + */ + protected function prepareConnection(NodeConnectionInterface $connection) + { + $parameters = $connection->getParameters(); + + if (isset($parameters->password)) { + $connection->addConnectCommand( + new RawCommand(array('AUTH', $parameters->password)) + ); + } + + if (isset($parameters->database)) { + $connection->addConnectCommand( + new RawCommand(array('SELECT', $parameters->database)) + ); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/FactoryInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/FactoryInterface.php new file mode 100755 index 00000000..2bae0839 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/FactoryInterface.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Connection; + +/** + * Interface for classes providing a factory of connections to Redis nodes. + * + * @author Daniele Alessandri + */ +interface FactoryInterface +{ + /** + * Defines or overrides the connection class identified by a scheme prefix. + * + * @param string $scheme Target connection scheme. + * @param mixed $initializer Fully-qualified name of a class or a callable for lazy initialization. + */ + public function define($scheme, $initializer); + + /** + * Undefines the connection identified by a scheme prefix. + * + * @param string $scheme Target connection scheme. + */ + public function undefine($scheme); + + /** + * Creates a new connection object. + * + * @param mixed $parameters Initialization parameters for the connection. + * + * @return NodeConnectionInterface + */ + public function create($parameters); + + /** + * Aggregates single connections into an aggregate connection instance. + * + * @param AggregateConnectionInterface $aggregate Aggregate connection instance. + * @param array $parameters List of parameters for each connection. + */ + public function aggregate(AggregateConnectionInterface $aggregate, array $parameters); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/NodeConnectionInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/NodeConnectionInterface.php new file mode 100755 index 00000000..665b862c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/NodeConnectionInterface.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Connection; + +use Predis\Command\CommandInterface; + +/** + * Defines a connection used to communicate with a single Redis node. + * + * @author Daniele Alessandri + */ +interface NodeConnectionInterface extends ConnectionInterface +{ + /** + * Returns a string representation of the connection. + * + * @return string + */ + public function __toString(); + + /** + * Returns the underlying resource used to communicate with Redis. + * + * @return mixed + */ + public function getResource(); + + /** + * Returns the parameters used to initialize the connection. + * + * @return ParametersInterface + */ + public function getParameters(); + + /** + * Pushes the given command into a queue of commands executed when + * establishing the actual connection to Redis. + * + * @param CommandInterface $command Instance of a Redis command. + */ + public function addConnectCommand(CommandInterface $command); + + /** + * Reads a response from the server. + * + * @return mixed + */ + public function read(); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Parameters.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Parameters.php new file mode 100755 index 00000000..b7d98615 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Parameters.php @@ -0,0 +1,176 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Connection; + +/** + * Container for connection parameters used to initialize connections to Redis. + * + * {@inheritdoc} + * + * @author Daniele Alessandri + */ +class Parameters implements ParametersInterface +{ + private $parameters; + + private static $defaults = array( + 'scheme' => 'tcp', + 'host' => '127.0.0.1', + 'port' => 6379, + 'timeout' => 5.0, + ); + + /** + * @param array $parameters Named array of connection parameters. + */ + public function __construct(array $parameters = array()) + { + $this->parameters = $this->filter($parameters) + $this->getDefaults(); + } + + /** + * Returns some default parameters with their values. + * + * @return array + */ + protected function getDefaults() + { + return self::$defaults; + } + + /** + * Creates a new instance by supplying the initial parameters either in the + * form of an URI string or a named array. + * + * @param array|string $parameters Set of connection parameters. + * + * @return Parameters + */ + public static function create($parameters) + { + if (is_string($parameters)) { + $parameters = static::parse($parameters); + } + + return new static($parameters ?: array()); + } + + /** + * Parses an URI string returning an array of connection parameters. + * + * When using the "redis" and "rediss" schemes the URI is parsed according + * to the rules defined by the provisional registration documents approved + * by IANA. If the URI has a password in its "user-information" part or a + * database number in the "path" part these values override the values of + * "password" and "database" if they are present in the "query" part. + * + * @link http://www.iana.org/assignments/uri-schemes/prov/redis + * @link http://www.iana.org/assignments/uri-schemes/prov/redis + * + * @param string $uri URI string. + * + * @throws \InvalidArgumentException + * + * @return array + */ + public static function parse($uri) + { + if (stripos($uri, 'unix') === 0) { + // Hack to support URIs for UNIX sockets with minimal effort. + $uri = str_ireplace('unix:///', 'unix://localhost/', $uri); + } + + if (!$parsed = parse_url($uri)) { + throw new \InvalidArgumentException("Invalid parameters URI: $uri"); + } + + if ( + isset($parsed['host']) + && false !== strpos($parsed['host'], '[') + && false !== strpos($parsed['host'], ']') + ) { + $parsed['host'] = substr($parsed['host'], 1, -1); + } + + if (isset($parsed['query'])) { + parse_str($parsed['query'], $queryarray); + unset($parsed['query']); + + $parsed = array_merge($parsed, $queryarray); + } + + if (stripos($uri, 'redis') === 0) { + if (isset($parsed['pass'])) { + $parsed['password'] = $parsed['pass']; + unset($parsed['pass']); + } + + if (isset($parsed['path']) && preg_match('/^\/(\d+)(\/.*)?/', $parsed['path'], $path)) { + $parsed['database'] = $path[1]; + + if (isset($path[2])) { + $parsed['path'] = $path[2]; + } else { + unset($parsed['path']); + } + } + } + + return $parsed; + } + + /** + * Validates and converts each value of the connection parameters array. + * + * @param array $parameters Connection parameters. + * + * @return array + */ + protected function filter(array $parameters) + { + return $parameters ?: array(); + } + + /** + * {@inheritdoc} + */ + public function __get($parameter) + { + if (isset($this->parameters[$parameter])) { + return $this->parameters[$parameter]; + } + } + + /** + * {@inheritdoc} + */ + public function __isset($parameter) + { + return isset($this->parameters[$parameter]); + } + + /** + * {@inheritdoc} + */ + public function toArray() + { + return $this->parameters; + } + + /** + * {@inheritdoc} + */ + public function __sleep() + { + return array('parameters'); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ParametersInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ParametersInterface.php new file mode 100755 index 00000000..fd8a908e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ParametersInterface.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Connection; + +/** + * Interface defining a container for connection parameters. + * + * The actual list of connection parameters depends on the features supported by + * each connection backend class (please refer to their specific documentation), + * but the most common parameters used through the library are: + * + * @property-read string scheme Connection scheme, such as 'tcp' or 'unix'. + * @property-read string host IP address or hostname of Redis. + * @property-read int port TCP port on which Redis is listening to. + * @property-read string path Path of a UNIX domain socket file. + * @property-read string alias Alias for the connection. + * @property-read float timeout Timeout for the connect() operation. + * @property-read float read_write_timeout Timeout for read() and write() operations. + * @property-read bool async_connect Performs the connect() operation asynchronously. + * @property-read bool tcp_nodelay Toggles the Nagle's algorithm for coalescing. + * @property-read bool persistent Leaves the connection open after a GC collection. + * @property-read string password Password to access Redis (see the AUTH command). + * @property-read string database Database index (see the SELECT command). + * + * @author Daniele Alessandri + */ +interface ParametersInterface +{ + /** + * Checks if the specified parameters is set. + * + * @param string $parameter Name of the parameter. + * + * @return bool + */ + public function __isset($parameter); + + /** + * Returns the value of the specified parameter. + * + * @param string $parameter Name of the parameter. + * + * @return mixed|null + */ + public function __get($parameter); + + /** + * Returns an array representation of the connection parameters. + * + * @return array + */ + public function toArray(); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/PhpiredisSocketConnection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/PhpiredisSocketConnection.php new file mode 100755 index 00000000..6948f035 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/PhpiredisSocketConnection.php @@ -0,0 +1,393 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Connection; + +use Predis\Command\CommandInterface; +use Predis\NotSupportedException; +use Predis\Response\Error as ErrorResponse; +use Predis\Response\Status as StatusResponse; + +/** + * This class provides the implementation of a Predis connection that uses the + * PHP socket extension for network communication and wraps the phpiredis C + * extension (PHP bindings for hiredis) to parse the Redis protocol. + * + * This class is intended to provide an optional low-overhead alternative for + * processing responses from Redis compared to the standard pure-PHP classes. + * Differences in speed when dealing with short inline responses are practically + * nonexistent, the actual speed boost is for big multibulk responses when this + * protocol processor can parse and return responses very fast. + * + * For instructions on how to build and install the phpiredis extension, please + * consult the repository of the project. + * + * The connection parameters supported by this class are: + * + * - scheme: it can be either 'redis', 'tcp' or 'unix'. + * - host: hostname or IP address of the server. + * - port: TCP port of the server. + * - path: path of a UNIX domain socket when scheme is 'unix'. + * - timeout: timeout to perform the connection. + * - read_write_timeout: timeout of read / write operations. + * + * @link http://github.com/nrk/phpiredis + * + * @author Daniele Alessandri + */ +class PhpiredisSocketConnection extends AbstractConnection +{ + private $reader; + + /** + * {@inheritdoc} + */ + public function __construct(ParametersInterface $parameters) + { + $this->assertExtensions(); + + parent::__construct($parameters); + + $this->reader = $this->createReader(); + } + + /** + * Disconnects from the server and destroys the underlying resource and the + * protocol reader resource when PHP's garbage collector kicks in. + */ + public function __destruct() + { + phpiredis_reader_destroy($this->reader); + + parent::__destruct(); + } + + /** + * Checks if the socket and phpiredis extensions are loaded in PHP. + */ + protected function assertExtensions() + { + if (!extension_loaded('sockets')) { + throw new NotSupportedException( + 'The "sockets" extension is required by this connection backend.' + ); + } + + if (!extension_loaded('phpiredis')) { + throw new NotSupportedException( + 'The "phpiredis" extension is required by this connection backend.' + ); + } + } + + /** + * {@inheritdoc} + */ + protected function assertParameters(ParametersInterface $parameters) + { + parent::assertParameters($parameters); + + if (isset($parameters->persistent)) { + throw new NotSupportedException( + 'Persistent connections are not supported by this connection backend.' + ); + } + + return $parameters; + } + + /** + * Creates a new instance of the protocol reader resource. + * + * @return resource + */ + private function createReader() + { + $reader = phpiredis_reader_create(); + + phpiredis_reader_set_status_handler($reader, $this->getStatusHandler()); + phpiredis_reader_set_error_handler($reader, $this->getErrorHandler()); + + return $reader; + } + + /** + * Returns the underlying protocol reader resource. + * + * @return resource + */ + protected function getReader() + { + return $this->reader; + } + + /** + * Returns the handler used by the protocol reader for inline responses. + * + * @return \Closure + */ + private function getStatusHandler() + { + return function ($payload) { + return StatusResponse::get($payload); + }; + } + + /** + * Returns the handler used by the protocol reader for error responses. + * + * @return \Closure + */ + protected function getErrorHandler() + { + return function ($payload) { + return new ErrorResponse($payload); + }; + } + + /** + * Helper method used to throw exceptions on socket errors. + */ + private function emitSocketError() + { + $errno = socket_last_error(); + $errstr = socket_strerror($errno); + + $this->disconnect(); + + $this->onConnectionError(trim($errstr), $errno); + } + + /** + * Gets the address of an host from connection parameters. + * + * @param ParametersInterface $parameters Parameters used to initialize the connection. + * + * @return string + */ + protected static function getAddress(ParametersInterface $parameters) + { + if (filter_var($host = $parameters->host, FILTER_VALIDATE_IP)) { + return $host; + } + + if ($host === $address = gethostbyname($host)) { + return false; + } + + return $address; + } + + /** + * {@inheritdoc} + */ + protected function createResource() + { + $parameters = $this->parameters; + + if ($parameters->scheme === 'unix') { + $address = $parameters->path; + $domain = AF_UNIX; + $protocol = 0; + } else { + if (false === $address = self::getAddress($parameters)) { + $this->onConnectionError("Cannot resolve the address of '$parameters->host'."); + } + + $domain = filter_var($address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) ? AF_INET6 : AF_INET; + $protocol = SOL_TCP; + } + + $socket = @socket_create($domain, SOCK_STREAM, $protocol); + + if (!is_resource($socket)) { + $this->emitSocketError(); + } + + $this->setSocketOptions($socket, $parameters); + $this->connectWithTimeout($socket, $address, $parameters); + + return $socket; + } + + /** + * Sets options on the socket resource from the connection parameters. + * + * @param resource $socket Socket resource. + * @param ParametersInterface $parameters Parameters used to initialize the connection. + */ + private function setSocketOptions($socket, ParametersInterface $parameters) + { + if ($parameters->scheme !== 'unix') { + if (!socket_set_option($socket, SOL_TCP, TCP_NODELAY, 1)) { + $this->emitSocketError(); + } + + if (!socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)) { + $this->emitSocketError(); + } + } + + if (isset($parameters->read_write_timeout)) { + $rwtimeout = (float) $parameters->read_write_timeout; + $timeoutSec = floor($rwtimeout); + $timeoutUsec = ($rwtimeout - $timeoutSec) * 1000000; + + $timeout = array( + 'sec' => $timeoutSec, + 'usec' => $timeoutUsec, + ); + + if (!socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, $timeout)) { + $this->emitSocketError(); + } + + if (!socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeout)) { + $this->emitSocketError(); + } + } + } + + /** + * Opens the actual connection to the server with a timeout. + * + * @param resource $socket Socket resource. + * @param string $address IP address (DNS-resolved from hostname) + * @param ParametersInterface $parameters Parameters used to initialize the connection. + * + * @return string + */ + private function connectWithTimeout($socket, $address, ParametersInterface $parameters) + { + socket_set_nonblock($socket); + + if (@socket_connect($socket, $address, (int) $parameters->port) === false) { + $error = socket_last_error(); + + if ($error != SOCKET_EINPROGRESS && $error != SOCKET_EALREADY) { + $this->emitSocketError(); + } + } + + socket_set_block($socket); + + $null = null; + $selectable = array($socket); + + $timeout = (float) $parameters->timeout; + $timeoutSecs = floor($timeout); + $timeoutUSecs = ($timeout - $timeoutSecs) * 1000000; + + $selected = socket_select($selectable, $selectable, $null, $timeoutSecs, $timeoutUSecs); + + if ($selected === 2) { + $this->onConnectionError('Connection refused.', SOCKET_ECONNREFUSED); + } + + if ($selected === 0) { + $this->onConnectionError('Connection timed out.', SOCKET_ETIMEDOUT); + } + + if ($selected === false) { + $this->emitSocketError(); + } + } + + /** + * {@inheritdoc} + */ + public function connect() + { + if (parent::connect() && $this->initCommands) { + foreach ($this->initCommands as $command) { + $this->executeCommand($command); + } + } + } + + /** + * {@inheritdoc} + */ + public function disconnect() + { + if ($this->isConnected()) { + socket_close($this->getResource()); + parent::disconnect(); + } + } + + /** + * {@inheritdoc} + */ + protected function write($buffer) + { + $socket = $this->getResource(); + + while (($length = strlen($buffer)) > 0) { + $written = socket_write($socket, $buffer, $length); + + if ($length === $written) { + return; + } + + if ($written === false) { + $this->onConnectionError('Error while writing bytes to the server.'); + } + + $buffer = substr($buffer, $written); + } + } + + /** + * {@inheritdoc} + */ + public function read() + { + $socket = $this->getResource(); + $reader = $this->reader; + + while (PHPIREDIS_READER_STATE_INCOMPLETE === $state = phpiredis_reader_get_state($reader)) { + if (@socket_recv($socket, $buffer, 4096, 0) === false || $buffer === '' || $buffer === null) { + $this->emitSocketError(); + } + + phpiredis_reader_feed($reader, $buffer); + } + + if ($state === PHPIREDIS_READER_STATE_COMPLETE) { + return phpiredis_reader_get_reply($reader); + } else { + $this->onProtocolError(phpiredis_reader_get_error($reader)); + + return; + } + } + + /** + * {@inheritdoc} + */ + public function writeRequest(CommandInterface $command) + { + $arguments = $command->getArguments(); + array_unshift($arguments, $command->getId()); + + $this->write(phpiredis_format_command($arguments)); + } + + /** + * {@inheritdoc} + */ + public function __wakeup() + { + $this->assertExtensions(); + $this->reader = $this->createReader(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/PhpiredisStreamConnection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/PhpiredisStreamConnection.php new file mode 100755 index 00000000..beb23575 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/PhpiredisStreamConnection.php @@ -0,0 +1,228 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Connection; + +use Predis\Command\CommandInterface; +use Predis\NotSupportedException; +use Predis\Response\Error as ErrorResponse; +use Predis\Response\Status as StatusResponse; + +/** + * This class provides the implementation of a Predis connection that uses PHP's + * streams for network communication and wraps the phpiredis C extension (PHP + * bindings for hiredis) to parse and serialize the Redis protocol. + * + * This class is intended to provide an optional low-overhead alternative for + * processing responses from Redis compared to the standard pure-PHP classes. + * Differences in speed when dealing with short inline responses are practically + * nonexistent, the actual speed boost is for big multibulk responses when this + * protocol processor can parse and return responses very fast. + * + * For instructions on how to build and install the phpiredis extension, please + * consult the repository of the project. + * + * The connection parameters supported by this class are: + * + * - scheme: it can be either 'redis', 'tcp' or 'unix'. + * - host: hostname or IP address of the server. + * - port: TCP port of the server. + * - path: path of a UNIX domain socket when scheme is 'unix'. + * - timeout: timeout to perform the connection. + * - read_write_timeout: timeout of read / write operations. + * - async_connect: performs the connection asynchronously. + * - tcp_nodelay: enables or disables Nagle's algorithm for coalescing. + * - persistent: the connection is left intact after a GC collection. + * + * @link https://github.com/nrk/phpiredis + * + * @author Daniele Alessandri + */ +class PhpiredisStreamConnection extends StreamConnection +{ + private $reader; + + /** + * {@inheritdoc} + */ + public function __construct(ParametersInterface $parameters) + { + $this->assertExtensions(); + + parent::__construct($parameters); + + $this->reader = $this->createReader(); + } + + /** + * {@inheritdoc} + */ + public function __destruct() + { + phpiredis_reader_destroy($this->reader); + + parent::__destruct(); + } + + /** + * Checks if the phpiredis extension is loaded in PHP. + */ + private function assertExtensions() + { + if (!extension_loaded('phpiredis')) { + throw new NotSupportedException( + 'The "phpiredis" extension is required by this connection backend.' + ); + } + } + + /** + * {@inheritdoc} + */ + protected function tcpStreamInitializer(ParametersInterface $parameters) + { + $uri = "tcp://[{$parameters->host}]:{$parameters->port}"; + $flags = STREAM_CLIENT_CONNECT; + $socket = null; + + if (isset($parameters->async_connect) && (bool) $parameters->async_connect) { + $flags |= STREAM_CLIENT_ASYNC_CONNECT; + } + + if (isset($parameters->persistent) && (bool) $parameters->persistent) { + $flags |= STREAM_CLIENT_PERSISTENT; + $uri .= strpos($path = $parameters->path, '/') === 0 ? $path : "/$path"; + } + + $resource = @stream_socket_client($uri, $errno, $errstr, (float) $parameters->timeout, $flags); + + if (!$resource) { + $this->onConnectionError(trim($errstr), $errno); + } + + if (isset($parameters->read_write_timeout) && function_exists('socket_import_stream')) { + $rwtimeout = (float) $parameters->read_write_timeout; + $rwtimeout = $rwtimeout > 0 ? $rwtimeout : -1; + + $timeout = array( + 'sec' => $timeoutSeconds = floor($rwtimeout), + 'usec' => ($rwtimeout - $timeoutSeconds) * 1000000, + ); + + $socket = $socket ?: socket_import_stream($resource); + @socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, $timeout); + @socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeout); + } + + if (isset($parameters->tcp_nodelay) && function_exists('socket_import_stream')) { + $socket = $socket ?: socket_import_stream($resource); + socket_set_option($socket, SOL_TCP, TCP_NODELAY, (int) $parameters->tcp_nodelay); + } + + return $resource; + } + + /** + * Creates a new instance of the protocol reader resource. + * + * @return resource + */ + private function createReader() + { + $reader = phpiredis_reader_create(); + + phpiredis_reader_set_status_handler($reader, $this->getStatusHandler()); + phpiredis_reader_set_error_handler($reader, $this->getErrorHandler()); + + return $reader; + } + + /** + * Returns the underlying protocol reader resource. + * + * @return resource + */ + protected function getReader() + { + return $this->reader; + } + + /** + * Returns the handler used by the protocol reader for inline responses. + * + * @return \Closure + */ + protected function getStatusHandler() + { + return function ($payload) { + return StatusResponse::get($payload); + }; + } + + /** + * Returns the handler used by the protocol reader for error responses. + * + * @return \Closure + */ + protected function getErrorHandler() + { + return function ($errorMessage) { + return new ErrorResponse($errorMessage); + }; + } + + /** + * {@inheritdoc} + */ + public function read() + { + $socket = $this->getResource(); + $reader = $this->reader; + + while (PHPIREDIS_READER_STATE_INCOMPLETE === $state = phpiredis_reader_get_state($reader)) { + $buffer = stream_socket_recvfrom($socket, 4096); + + if ($buffer === false || $buffer === '') { + $this->onConnectionError('Error while reading bytes from the server.'); + } + + phpiredis_reader_feed($reader, $buffer); + } + + if ($state === PHPIREDIS_READER_STATE_COMPLETE) { + return phpiredis_reader_get_reply($reader); + } else { + $this->onProtocolError(phpiredis_reader_get_error($reader)); + + return; + } + } + + /** + * {@inheritdoc} + */ + public function writeRequest(CommandInterface $command) + { + $arguments = $command->getArguments(); + array_unshift($arguments, $command->getId()); + + $this->write(phpiredis_format_command($arguments)); + } + + /** + * {@inheritdoc} + */ + public function __wakeup() + { + $this->assertExtensions(); + $this->reader = $this->createReader(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/StreamConnection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/StreamConnection.php new file mode 100755 index 00000000..ed6540b8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/StreamConnection.php @@ -0,0 +1,292 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Connection; + +use Predis\Command\CommandInterface; +use Predis\Response\Error as ErrorResponse; +use Predis\Response\Status as StatusResponse; + +/** + * Standard connection to Redis servers implemented on top of PHP's streams. + * The connection parameters supported by this class are:. + * + * - scheme: it can be either 'redis', 'tcp' or 'unix'. + * - host: hostname or IP address of the server. + * - port: TCP port of the server. + * - path: path of a UNIX domain socket when scheme is 'unix'. + * - timeout: timeout to perform the connection. + * - read_write_timeout: timeout of read / write operations. + * - async_connect: performs the connection asynchronously. + * - tcp_nodelay: enables or disables Nagle's algorithm for coalescing. + * - persistent: the connection is left intact after a GC collection. + * + * @author Daniele Alessandri + */ +class StreamConnection extends AbstractConnection +{ + /** + * Disconnects from the server and destroys the underlying resource when the + * garbage collector kicks in only if the connection has not been marked as + * persistent. + */ + public function __destruct() + { + if (isset($this->parameters->persistent) && $this->parameters->persistent) { + return; + } + + $this->disconnect(); + } + + /** + * {@inheritdoc} + */ + protected function createResource() + { + switch ($this->parameters->scheme) { + case 'tcp': + case 'redis': + return $this->tcpStreamInitializer($this->parameters); + + case 'unix': + return $this->unixStreamInitializer($this->parameters); + + default: + throw new \InvalidArgumentException("Invalid scheme: '{$this->parameters->scheme}'."); + } + } + + /** + * Initializes a TCP stream resource. + * + * @param ParametersInterface $parameters Initialization parameters for the connection. + * + * @return resource + */ + protected function tcpStreamInitializer(ParametersInterface $parameters) + { + if (!filter_var($parameters->host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { + $uri = "tcp://$parameters->host:$parameters->port"; + } else { + $uri = "tcp://[$parameters->host]:$parameters->port"; + } + + $flags = STREAM_CLIENT_CONNECT; + + if (isset($parameters->async_connect) && (bool) $parameters->async_connect) { + $flags |= STREAM_CLIENT_ASYNC_CONNECT; + } + + if (isset($parameters->persistent) && (bool) $parameters->persistent) { + $flags |= STREAM_CLIENT_PERSISTENT; + $uri .= strpos($path = $parameters->path, '/') === 0 ? $path : "/$path"; + } + + $resource = @stream_socket_client($uri, $errno, $errstr, (float) $parameters->timeout, $flags); + + if (!$resource) { + $this->onConnectionError(trim($errstr), $errno); + } + + if (isset($parameters->read_write_timeout)) { + $rwtimeout = (float) $parameters->read_write_timeout; + $rwtimeout = $rwtimeout > 0 ? $rwtimeout : -1; + $timeoutSeconds = floor($rwtimeout); + $timeoutUSeconds = ($rwtimeout - $timeoutSeconds) * 1000000; + stream_set_timeout($resource, $timeoutSeconds, $timeoutUSeconds); + } + + if (isset($parameters->tcp_nodelay) && function_exists('socket_import_stream')) { + $socket = socket_import_stream($resource); + socket_set_option($socket, SOL_TCP, TCP_NODELAY, (int) $parameters->tcp_nodelay); + } + + return $resource; + } + + /** + * Initializes a UNIX stream resource. + * + * @param ParametersInterface $parameters Initialization parameters for the connection. + * + * @return resource + */ + protected function unixStreamInitializer(ParametersInterface $parameters) + { + if (!isset($parameters->path)) { + throw new InvalidArgumentException('Missing UNIX domain socket path.'); + } + + $uri = "unix://{$parameters->path}"; + $flags = STREAM_CLIENT_CONNECT; + + if ((bool) $parameters->persistent) { + $flags |= STREAM_CLIENT_PERSISTENT; + } + + $resource = @stream_socket_client($uri, $errno, $errstr, (float) $parameters->timeout, $flags); + + if (!$resource) { + $this->onConnectionError(trim($errstr), $errno); + } + + if (isset($parameters->read_write_timeout)) { + $rwtimeout = (float) $parameters->read_write_timeout; + $rwtimeout = $rwtimeout > 0 ? $rwtimeout : -1; + $timeoutSeconds = floor($rwtimeout); + $timeoutUSeconds = ($rwtimeout - $timeoutSeconds) * 1000000; + stream_set_timeout($resource, $timeoutSeconds, $timeoutUSeconds); + } + + return $resource; + } + + /** + * {@inheritdoc} + */ + public function connect() + { + if (parent::connect() && $this->initCommands) { + foreach ($this->initCommands as $command) { + $this->executeCommand($command); + } + } + } + + /** + * {@inheritdoc} + */ + public function disconnect() + { + if ($this->isConnected()) { + fclose($this->getResource()); + parent::disconnect(); + } + } + + /** + * Performs a write operation over the stream of the buffer containing a + * command serialized with the Redis wire protocol. + * + * @param string $buffer Representation of a command in the Redis wire protocol. + */ + protected function write($buffer) + { + $socket = $this->getResource(); + + while (($length = strlen($buffer)) > 0) { + $written = @fwrite($socket, $buffer); + + if ($length === $written) { + return; + } + + if ($written === false || $written === 0) { + $this->onConnectionError('Error while writing bytes to the server.'); + } + + $buffer = substr($buffer, $written); + } + } + + /** + * {@inheritdoc} + */ + public function read() + { + $socket = $this->getResource(); + $chunk = fgets($socket); + + if ($chunk === false || $chunk === '') { + $this->onConnectionError('Error while reading line from the server.'); + } + + $prefix = $chunk[0]; + $payload = substr($chunk, 1, -2); + + switch ($prefix) { + case '+': + return StatusResponse::get($payload); + + case '$': + $size = (int) $payload; + + if ($size === -1) { + return; + } + + $bulkData = ''; + $bytesLeft = ($size += 2); + + do { + $chunk = fread($socket, min($bytesLeft, 4096)); + + if ($chunk === false || $chunk === '') { + $this->onConnectionError('Error while reading bytes from the server.'); + } + + $bulkData .= $chunk; + $bytesLeft = $size - strlen($bulkData); + } while ($bytesLeft > 0); + + return substr($bulkData, 0, -2); + + case '*': + $count = (int) $payload; + + if ($count === -1) { + return; + } + + $multibulk = array(); + + for ($i = 0; $i < $count; ++$i) { + $multibulk[$i] = $this->read(); + } + + return $multibulk; + + case ':': + return (int) $payload; + + case '-': + return new ErrorResponse($payload); + + default: + $this->onProtocolError("Unknown response prefix: '$prefix'."); + + return; + } + } + + /** + * {@inheritdoc} + */ + public function writeRequest(CommandInterface $command) + { + $commandID = $command->getId(); + $arguments = $command->getArguments(); + + $cmdlen = strlen($commandID); + $reqlen = count($arguments) + 1; + + $buffer = "*{$reqlen}\r\n\${$cmdlen}\r\n{$commandID}\r\n"; + + for ($i = 0, $reqlen--; $i < $reqlen; ++$i) { + $argument = $arguments[$i]; + $arglen = strlen($argument); + $buffer .= "\${$arglen}\r\n{$argument}\r\n"; + } + + $this->write($buffer); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/WebdisConnection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/WebdisConnection.php new file mode 100755 index 00000000..9cff9d02 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/WebdisConnection.php @@ -0,0 +1,353 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Connection; + +use Predis\Command\CommandInterface; +use Predis\NotSupportedException; +use Predis\Protocol\ProtocolException; +use Predis\Response\Error as ErrorResponse; +use Predis\Response\Status as StatusResponse; + +/** + * This class implements a Predis connection that actually talks with Webdis + * instead of connecting directly to Redis. It relies on the cURL extension to + * communicate with the web server and the phpiredis extension to parse the + * protocol for responses returned in the http response bodies. + * + * Some features are not yet available or they simply cannot be implemented: + * - Pipelining commands. + * - Publish / Subscribe. + * - MULTI / EXEC transactions (not yet supported by Webdis). + * + * The connection parameters supported by this class are: + * + * - scheme: must be 'http'. + * - host: hostname or IP address of the server. + * - port: TCP port of the server. + * - timeout: timeout to perform the connection. + * - user: username for authentication. + * - pass: password for authentication. + * + * @link http://webd.is + * @link http://github.com/nicolasff/webdis + * @link http://github.com/seppo0010/phpiredis + * + * @author Daniele Alessandri + */ +class WebdisConnection implements NodeConnectionInterface +{ + private $parameters; + private $resource; + private $reader; + + /** + * @param ParametersInterface $parameters Initialization parameters for the connection. + * + * @throws \InvalidArgumentException + */ + public function __construct(ParametersInterface $parameters) + { + $this->assertExtensions(); + + if ($parameters->scheme !== 'http') { + throw new \InvalidArgumentException("Invalid scheme: '{$parameters->scheme}'."); + } + + $this->parameters = $parameters; + + $this->resource = $this->createCurl(); + $this->reader = $this->createReader(); + } + + /** + * Frees the underlying cURL and protocol reader resources when the garbage + * collector kicks in. + */ + public function __destruct() + { + curl_close($this->resource); + phpiredis_reader_destroy($this->reader); + } + + /** + * Helper method used to throw on unsupported methods. + * + * @param string $method Name of the unsupported method. + * + * @throws NotSupportedException + */ + private function throwNotSupportedException($method) + { + $class = __CLASS__; + throw new NotSupportedException("The method $class::$method() is not supported."); + } + + /** + * Checks if the cURL and phpiredis extensions are loaded in PHP. + */ + private function assertExtensions() + { + if (!extension_loaded('curl')) { + throw new NotSupportedException( + 'The "curl" extension is required by this connection backend.' + ); + } + + if (!extension_loaded('phpiredis')) { + throw new NotSupportedException( + 'The "phpiredis" extension is required by this connection backend.' + ); + } + } + + /** + * Initializes cURL. + * + * @return resource + */ + private function createCurl() + { + $parameters = $this->getParameters(); + + if (filter_var($host = $parameters->host, FILTER_VALIDATE_IP)) { + $host = "[$host]"; + } + + $options = array( + CURLOPT_FAILONERROR => true, + CURLOPT_CONNECTTIMEOUT_MS => $parameters->timeout * 1000, + CURLOPT_URL => "$parameters->scheme://$host:$parameters->port", + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_POST => true, + CURLOPT_WRITEFUNCTION => array($this, 'feedReader'), + ); + + if (isset($parameters->user, $parameters->pass)) { + $options[CURLOPT_USERPWD] = "{$parameters->user}:{$parameters->pass}"; + } + + curl_setopt_array($resource = curl_init(), $options); + + return $resource; + } + + /** + * Initializes the phpiredis protocol reader. + * + * @return resource + */ + private function createReader() + { + $reader = phpiredis_reader_create(); + + phpiredis_reader_set_status_handler($reader, $this->getStatusHandler()); + phpiredis_reader_set_error_handler($reader, $this->getErrorHandler()); + + return $reader; + } + + /** + * Returns the handler used by the protocol reader for inline responses. + * + * @return \Closure + */ + protected function getStatusHandler() + { + return function ($payload) { + return StatusResponse::get($payload); + }; + } + + /** + * Returns the handler used by the protocol reader for error responses. + * + * @return \Closure + */ + protected function getErrorHandler() + { + return function ($payload) { + return new ErrorResponse($payload); + }; + } + + /** + * Feeds the phpredis reader resource with the data read from the network. + * + * @param resource $resource Reader resource. + * @param string $buffer Buffer of data read from a connection. + * + * @return int + */ + protected function feedReader($resource, $buffer) + { + phpiredis_reader_feed($this->reader, $buffer); + + return strlen($buffer); + } + + /** + * {@inheritdoc} + */ + public function connect() + { + // NOOP + } + + /** + * {@inheritdoc} + */ + public function disconnect() + { + // NOOP + } + + /** + * {@inheritdoc} + */ + public function isConnected() + { + return true; + } + + /** + * Checks if the specified command is supported by this connection class. + * + * @param CommandInterface $command Command instance. + * + * @throws NotSupportedException + * + * @return string + */ + protected function getCommandId(CommandInterface $command) + { + switch ($commandID = $command->getId()) { + case 'AUTH': + case 'SELECT': + case 'MULTI': + case 'EXEC': + case 'WATCH': + case 'UNWATCH': + case 'DISCARD': + case 'MONITOR': + throw new NotSupportedException("Command '$commandID' is not allowed by Webdis."); + + default: + return $commandID; + } + } + + /** + * {@inheritdoc} + */ + public function writeRequest(CommandInterface $command) + { + $this->throwNotSupportedException(__FUNCTION__); + } + + /** + * {@inheritdoc} + */ + public function readResponse(CommandInterface $command) + { + $this->throwNotSupportedException(__FUNCTION__); + } + + /** + * {@inheritdoc} + */ + public function executeCommand(CommandInterface $command) + { + $resource = $this->resource; + $commandId = $this->getCommandId($command); + + if ($arguments = $command->getArguments()) { + $arguments = implode('/', array_map('urlencode', $arguments)); + $serializedCommand = "$commandId/$arguments.raw"; + } else { + $serializedCommand = "$commandId.raw"; + } + + curl_setopt($resource, CURLOPT_POSTFIELDS, $serializedCommand); + + if (curl_exec($resource) === false) { + $error = curl_error($resource); + $errno = curl_errno($resource); + + throw new ConnectionException($this, trim($error), $errno); + } + + if (phpiredis_reader_get_state($this->reader) !== PHPIREDIS_READER_STATE_COMPLETE) { + throw new ProtocolException($this, phpiredis_reader_get_error($this->reader)); + } + + return phpiredis_reader_get_reply($this->reader); + } + + /** + * {@inheritdoc} + */ + public function getResource() + { + return $this->resource; + } + + /** + * {@inheritdoc} + */ + public function getParameters() + { + return $this->parameters; + } + + /** + * {@inheritdoc} + */ + public function addConnectCommand(CommandInterface $command) + { + $this->throwNotSupportedException(__FUNCTION__); + } + + /** + * {@inheritdoc} + */ + public function read() + { + $this->throwNotSupportedException(__FUNCTION__); + } + + /** + * {@inheritdoc} + */ + public function __toString() + { + return "{$this->parameters->host}:{$this->parameters->port}"; + } + + /** + * {@inheritdoc} + */ + public function __sleep() + { + return array('parameters'); + } + + /** + * {@inheritdoc} + */ + public function __wakeup() + { + $this->assertExtensions(); + + $this->resource = $this->createCurl(); + $this->reader = $this->createReader(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Monitor/Consumer.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Monitor/Consumer.php new file mode 100755 index 00000000..d10bad1a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Monitor/Consumer.php @@ -0,0 +1,173 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Monitor; + +use Predis\ClientInterface; +use Predis\Connection\AggregateConnectionInterface; +use Predis\NotSupportedException; + +/** + * Redis MONITOR consumer. + * + * @author Daniele Alessandri + */ +class Consumer implements \Iterator +{ + private $client; + private $valid; + private $position; + + /** + * @param ClientInterface $client Client instance used by the consumer. + */ + public function __construct(ClientInterface $client) + { + $this->assertClient($client); + + $this->client = $client; + + $this->start(); + } + + /** + * Automatically stops the consumer when the garbage collector kicks in. + */ + public function __destruct() + { + $this->stop(); + } + + /** + * Checks if the passed client instance satisfies the required conditions + * needed to initialize a monitor consumer. + * + * @param ClientInterface $client Client instance used by the consumer. + * + * @throws NotSupportedException + */ + private function assertClient(ClientInterface $client) + { + if ($client->getConnection() instanceof AggregateConnectionInterface) { + throw new NotSupportedException( + 'Cannot initialize a monitor consumer over aggregate connections.' + ); + } + + if ($client->getProfile()->supportsCommand('MONITOR') === false) { + throw new NotSupportedException("The current profile does not support 'MONITOR'."); + } + } + + /** + * Initializes the consumer and sends the MONITOR command to the server. + */ + protected function start() + { + $this->client->executeCommand( + $this->client->createCommand('MONITOR') + ); + $this->valid = true; + } + + /** + * Stops the consumer. Internally this is done by disconnecting from server + * since there is no way to terminate the stream initialized by MONITOR. + */ + public function stop() + { + $this->client->disconnect(); + $this->valid = false; + } + + /** + * {@inheritdoc} + */ + public function rewind() + { + // NOOP + } + + /** + * Returns the last message payload retrieved from the server. + * + * @return Object + */ + public function current() + { + return $this->getValue(); + } + + /** + * {@inheritdoc} + */ + public function key() + { + return $this->position; + } + + /** + * {@inheritdoc} + */ + public function next() + { + ++$this->position; + } + + /** + * Checks if the the consumer is still in a valid state to continue. + * + * @return bool + */ + public function valid() + { + return $this->valid; + } + + /** + * Waits for a new message from the server generated by MONITOR and returns + * it when available. + * + * @return Object + */ + private function getValue() + { + $database = 0; + $client = null; + $event = $this->client->getConnection()->read(); + + $callback = function ($matches) use (&$database, &$client) { + if (2 === $count = count($matches)) { + // Redis <= 2.4 + $database = (int) $matches[1]; + } + + if (4 === $count) { + // Redis >= 2.6 + $database = (int) $matches[2]; + $client = $matches[3]; + } + + return ' '; + }; + + $event = preg_replace_callback('/ \(db (\d+)\) | \[(\d+) (.*?)\] /', $callback, $event, 1); + @list($timestamp, $command, $arguments) = explode(' ', $event, 3); + + return (object) array( + 'timestamp' => (float) $timestamp, + 'database' => $database, + 'client' => $client, + 'command' => substr($command, 1, -1), + 'arguments' => $arguments, + ); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/NotSupportedException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/NotSupportedException.php new file mode 100755 index 00000000..be82aba7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/NotSupportedException.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis; + +/** + * Exception class thrown when trying to use features not supported by certain + * classes or abstractions of Predis. + * + * @author Daniele Alessandri + */ +class NotSupportedException extends PredisException +{ +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/Atomic.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/Atomic.php new file mode 100755 index 00000000..1c9c92aa --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/Atomic.php @@ -0,0 +1,119 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Pipeline; + +use Predis\ClientException; +use Predis\ClientInterface; +use Predis\Connection\ConnectionInterface; +use Predis\Connection\NodeConnectionInterface; +use Predis\Response\ErrorInterface as ErrorResponseInterface; +use Predis\Response\ResponseInterface; +use Predis\Response\ServerException; + +/** + * Command pipeline wrapped into a MULTI / EXEC transaction. + * + * @author Daniele Alessandri + */ +class Atomic extends Pipeline +{ + /** + * {@inheritdoc} + */ + public function __construct(ClientInterface $client) + { + if (!$client->getProfile()->supportsCommands(array('multi', 'exec', 'discard'))) { + throw new ClientException( + "The current profile does not support 'MULTI', 'EXEC' and 'DISCARD'." + ); + } + + parent::__construct($client); + } + + /** + * {@inheritdoc} + */ + protected function getConnection() + { + $connection = $this->getClient()->getConnection(); + + if (!$connection instanceof NodeConnectionInterface) { + $class = __CLASS__; + + throw new ClientException("The class '$class' does not support aggregate connections."); + } + + return $connection; + } + + /** + * {@inheritdoc} + */ + protected function executePipeline(ConnectionInterface $connection, \SplQueue $commands) + { + $profile = $this->getClient()->getProfile(); + $connection->executeCommand($profile->createCommand('multi')); + + foreach ($commands as $command) { + $connection->writeRequest($command); + } + + foreach ($commands as $command) { + $response = $connection->readResponse($command); + + if ($response instanceof ErrorResponseInterface) { + $connection->executeCommand($profile->createCommand('discard')); + throw new ServerException($response->getMessage()); + } + } + + $executed = $connection->executeCommand($profile->createCommand('exec')); + + if (!isset($executed)) { + // TODO: should be throwing a more appropriate exception. + throw new ClientException( + 'The underlying transaction has been aborted by the server.' + ); + } + + if (count($executed) !== count($commands)) { + $expected = count($commands); + $received = count($executed); + + throw new ClientException( + "Invalid number of responses [expected $expected, received $received]." + ); + } + + $responses = array(); + $sizeOfPipe = count($commands); + $exceptions = $this->throwServerExceptions(); + + for ($i = 0; $i < $sizeOfPipe; ++$i) { + $command = $commands->dequeue(); + $response = $executed[$i]; + + if (!$response instanceof ResponseInterface) { + $responses[] = $command->parseResponse($response); + } elseif ($response instanceof ErrorResponseInterface && $exceptions) { + $this->exception($connection, $response); + } else { + $responses[] = $response; + } + + unset($executed[$i]); + } + + return $responses; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/ConnectionErrorProof.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/ConnectionErrorProof.php new file mode 100755 index 00000000..d3bc732e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/ConnectionErrorProof.php @@ -0,0 +1,130 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Pipeline; + +use Predis\CommunicationException; +use Predis\Connection\Aggregate\ClusterInterface; +use Predis\Connection\ConnectionInterface; +use Predis\Connection\NodeConnectionInterface; +use Predis\NotSupportedException; + +/** + * Command pipeline that does not throw exceptions on connection errors, but + * returns the exception instances as the rest of the response elements. + * + * @todo Awful naming! + * + * @author Daniele Alessandri + */ +class ConnectionErrorProof extends Pipeline +{ + /** + * {@inheritdoc} + */ + protected function getConnection() + { + return $this->getClient()->getConnection(); + } + + /** + * {@inheritdoc} + */ + protected function executePipeline(ConnectionInterface $connection, \SplQueue $commands) + { + if ($connection instanceof NodeConnectionInterface) { + return $this->executeSingleNode($connection, $commands); + } elseif ($connection instanceof ClusterInterface) { + return $this->executeCluster($connection, $commands); + } else { + $class = get_class($connection); + + throw new NotSupportedException("The connection class '$class' is not supported."); + } + } + + /** + * {@inheritdoc} + */ + protected function executeSingleNode(NodeConnectionInterface $connection, \SplQueue $commands) + { + $responses = array(); + $sizeOfPipe = count($commands); + + foreach ($commands as $command) { + try { + $connection->writeRequest($command); + } catch (CommunicationException $exception) { + return array_fill(0, $sizeOfPipe, $exception); + } + } + + for ($i = 0; $i < $sizeOfPipe; ++$i) { + $command = $commands->dequeue(); + + try { + $responses[$i] = $connection->readResponse($command); + } catch (CommunicationException $exception) { + $add = count($commands) - count($responses); + $responses = array_merge($responses, array_fill(0, $add, $exception)); + + break; + } + } + + return $responses; + } + + /** + * {@inheritdoc} + */ + protected function executeCluster(ClusterInterface $connection, \SplQueue $commands) + { + $responses = array(); + $sizeOfPipe = count($commands); + $exceptions = array(); + + foreach ($commands as $command) { + $cmdConnection = $connection->getConnection($command); + + if (isset($exceptions[spl_object_hash($cmdConnection)])) { + continue; + } + + try { + $cmdConnection->writeRequest($command); + } catch (CommunicationException $exception) { + $exceptions[spl_object_hash($cmdConnection)] = $exception; + } + } + + for ($i = 0; $i < $sizeOfPipe; ++$i) { + $command = $commands->dequeue(); + + $cmdConnection = $connection->getConnection($command); + $connectionHash = spl_object_hash($cmdConnection); + + if (isset($exceptions[$connectionHash])) { + $responses[$i] = $exceptions[$connectionHash]; + continue; + } + + try { + $responses[$i] = $cmdConnection->readResponse($command); + } catch (CommunicationException $exception) { + $responses[$i] = $exception; + $exceptions[$connectionHash] = $exception; + } + } + + return $responses; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/FireAndForget.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/FireAndForget.php new file mode 100755 index 00000000..95a062b6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/FireAndForget.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Pipeline; + +use Predis\Connection\ConnectionInterface; + +/** + * Command pipeline that writes commands to the servers but discards responses. + * + * @author Daniele Alessandri + */ +class FireAndForget extends Pipeline +{ + /** + * {@inheritdoc} + */ + protected function executePipeline(ConnectionInterface $connection, \SplQueue $commands) + { + while (!$commands->isEmpty()) { + $connection->writeRequest($commands->dequeue()); + } + + $connection->disconnect(); + + return array(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/Pipeline.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/Pipeline.php new file mode 100755 index 00000000..cf9c59e4 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/Pipeline.php @@ -0,0 +1,247 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Pipeline; + +use Predis\ClientContextInterface; +use Predis\ClientException; +use Predis\ClientInterface; +use Predis\Command\CommandInterface; +use Predis\Connection\Aggregate\ReplicationInterface; +use Predis\Connection\ConnectionInterface; +use Predis\Response\ErrorInterface as ErrorResponseInterface; +use Predis\Response\ResponseInterface; +use Predis\Response\ServerException; + +/** + * Implementation of a command pipeline in which write and read operations of + * Redis commands are pipelined to alleviate the effects of network round-trips. + * + * {@inheritdoc} + * + * @author Daniele Alessandri + */ +class Pipeline implements ClientContextInterface +{ + private $client; + private $pipeline; + + private $responses = array(); + private $running = false; + + /** + * @param ClientInterface $client Client instance used by the context. + */ + public function __construct(ClientInterface $client) + { + $this->client = $client; + $this->pipeline = new \SplQueue(); + } + + /** + * Queues a command into the pipeline buffer. + * + * @param string $method Command ID. + * @param array $arguments Arguments for the command. + * + * @return $this + */ + public function __call($method, $arguments) + { + $command = $this->client->createCommand($method, $arguments); + $this->recordCommand($command); + + return $this; + } + + /** + * Queues a command instance into the pipeline buffer. + * + * @param CommandInterface $command Command to be queued in the buffer. + */ + protected function recordCommand(CommandInterface $command) + { + $this->pipeline->enqueue($command); + } + + /** + * Queues a command instance into the pipeline buffer. + * + * @param CommandInterface $command Command instance to be queued in the buffer. + * + * @return $this + */ + public function executeCommand(CommandInterface $command) + { + $this->recordCommand($command); + + return $this; + } + + /** + * Throws an exception on -ERR responses returned by Redis. + * + * @param ConnectionInterface $connection Redis connection that returned the error. + * @param ErrorResponseInterface $response Instance of the error response. + * + * @throws ServerException + */ + protected function exception(ConnectionInterface $connection, ErrorResponseInterface $response) + { + $connection->disconnect(); + $message = $response->getMessage(); + + throw new ServerException($message); + } + + /** + * Returns the underlying connection to be used by the pipeline. + * + * @return ConnectionInterface + */ + protected function getConnection() + { + $connection = $this->getClient()->getConnection(); + + if ($connection instanceof ReplicationInterface) { + $connection->switchTo('master'); + } + + return $connection; + } + + /** + * Implements the logic to flush the queued commands and read the responses + * from the current connection. + * + * @param ConnectionInterface $connection Current connection instance. + * @param \SplQueue $commands Queued commands. + * + * @return array + */ + protected function executePipeline(ConnectionInterface $connection, \SplQueue $commands) + { + foreach ($commands as $command) { + $connection->writeRequest($command); + } + + $responses = array(); + $exceptions = $this->throwServerExceptions(); + + while (!$commands->isEmpty()) { + $command = $commands->dequeue(); + $response = $connection->readResponse($command); + + if (!$response instanceof ResponseInterface) { + $responses[] = $command->parseResponse($response); + } elseif ($response instanceof ErrorResponseInterface && $exceptions) { + $this->exception($connection, $response); + } else { + $responses[] = $response; + } + } + + return $responses; + } + + /** + * Flushes the buffer holding all of the commands queued so far. + * + * @param bool $send Specifies if the commands in the buffer should be sent to Redis. + * + * @return $this + */ + public function flushPipeline($send = true) + { + if ($send && !$this->pipeline->isEmpty()) { + $responses = $this->executePipeline($this->getConnection(), $this->pipeline); + $this->responses = array_merge($this->responses, $responses); + } else { + $this->pipeline = new \SplQueue(); + } + + return $this; + } + + /** + * Marks the running status of the pipeline. + * + * @param bool $bool Sets the running status of the pipeline. + * + * @throws ClientException + */ + private function setRunning($bool) + { + if ($bool && $this->running) { + throw new ClientException('The current pipeline context is already being executed.'); + } + + $this->running = $bool; + } + + /** + * Handles the actual execution of the whole pipeline. + * + * @param mixed $callable Optional callback for execution. + * + * @throws \Exception + * @throws \InvalidArgumentException + * + * @return array + */ + public function execute($callable = null) + { + if ($callable && !is_callable($callable)) { + throw new \InvalidArgumentException('The argument must be a callable object.'); + } + + $exception = null; + $this->setRunning(true); + + try { + if ($callable) { + call_user_func($callable, $this); + } + + $this->flushPipeline(); + } catch (\Exception $exception) { + // NOOP + } + + $this->setRunning(false); + + if ($exception) { + throw $exception; + } + + return $this->responses; + } + + /** + * Returns if the pipeline should throw exceptions on server errors. + * + * @return bool + */ + protected function throwServerExceptions() + { + return (bool) $this->client->getOptions()->exceptions; + } + + /** + * Returns the underlying client instance used by the pipeline object. + * + * @return ClientInterface + */ + public function getClient() + { + return $this->client; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PredisException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PredisException.php new file mode 100755 index 00000000..122bde16 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PredisException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis; + +/** + * Base exception class for Predis-related errors. + * + * @author Daniele Alessandri + */ +abstract class PredisException extends \Exception +{ +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/Factory.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/Factory.php new file mode 100755 index 00000000..bcee3c2c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/Factory.php @@ -0,0 +1,100 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Profile; + +use Predis\ClientException; + +/** + * Factory class for creating profile instances from strings. + * + * @author Daniele Alessandri + */ +final class Factory +{ + private static $profiles = array( + '2.0' => 'Predis\Profile\RedisVersion200', + '2.2' => 'Predis\Profile\RedisVersion220', + '2.4' => 'Predis\Profile\RedisVersion240', + '2.6' => 'Predis\Profile\RedisVersion260', + '2.8' => 'Predis\Profile\RedisVersion280', + '3.0' => 'Predis\Profile\RedisVersion300', + 'dev' => 'Predis\Profile\RedisUnstable', + 'default' => 'Predis\Profile\RedisVersion300', + ); + + /** + * + */ + private function __construct() + { + // NOOP + } + + /** + * Returns the default server profile. + * + * @return ProfileInterface + */ + public static function getDefault() + { + return self::get('default'); + } + + /** + * Returns the development server profile. + * + * @return ProfileInterface + */ + public static function getDevelopment() + { + return self::get('dev'); + } + + /** + * Registers a new server profile. + * + * @param string $alias Profile version or alias. + * @param string $class FQN of a class implementing Predis\Profile\ProfileInterface. + * + * @throws \InvalidArgumentException + */ + public static function define($alias, $class) + { + $reflection = new \ReflectionClass($class); + + if (!$reflection->isSubclassOf('Predis\Profile\ProfileInterface')) { + throw new \InvalidArgumentException("The class '$class' is not a valid profile class."); + } + + self::$profiles[$alias] = $class; + } + + /** + * Returns the specified server profile. + * + * @param string $version Profile version or alias. + * + * @throws ClientException + * + * @return ProfileInterface + */ + public static function get($version) + { + if (!isset(self::$profiles[$version])) { + throw new ClientException("Unknown server profile: '$version'."); + } + + $profile = self::$profiles[$version]; + + return new $profile(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/ProfileInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/ProfileInterface.php new file mode 100755 index 00000000..abe71aa6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/ProfileInterface.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Profile; + +use Predis\Command\CommandInterface; + +/** + * A profile defines all the features and commands supported by certain versions + * of Redis. Instances of Predis\Client should use a server profile matching the + * version of Redis being used. + * + * @author Daniele Alessandri + */ +interface ProfileInterface +{ + /** + * Returns the profile version corresponding to the Redis version. + * + * @return string + */ + public function getVersion(); + + /** + * Checks if the profile supports the specified command. + * + * @param string $commandID Command ID. + * + * @return bool + */ + public function supportsCommand($commandID); + + /** + * Checks if the profile supports the specified list of commands. + * + * @param array $commandIDs List of command IDs. + * + * @return string + */ + public function supportsCommands(array $commandIDs); + + /** + * Creates a new command instance. + * + * @param string $commandID Command ID. + * @param array $arguments Arguments for the command. + * + * @return CommandInterface + */ + public function createCommand($commandID, array $arguments = array()); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisProfile.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisProfile.php new file mode 100755 index 00000000..3ef31688 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisProfile.php @@ -0,0 +1,146 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Profile; + +use Predis\ClientException; +use Predis\Command\Processor\ProcessorInterface; + +/** + * Base class implementing common functionalities for Redis server profiles. + * + * @author Daniele Alessandri + */ +abstract class RedisProfile implements ProfileInterface +{ + private $commands; + private $processor; + + /** + * + */ + public function __construct() + { + $this->commands = $this->getSupportedCommands(); + } + + /** + * Returns a map of all the commands supported by the profile and their + * actual PHP classes. + * + * @return array + */ + abstract protected function getSupportedCommands(); + + /** + * {@inheritdoc} + */ + public function supportsCommand($commandID) + { + return isset($this->commands[strtoupper($commandID)]); + } + + /** + * {@inheritdoc} + */ + public function supportsCommands(array $commandIDs) + { + foreach ($commandIDs as $commandID) { + if (!$this->supportsCommand($commandID)) { + return false; + } + } + + return true; + } + + /** + * Returns the fully-qualified name of a class representing the specified + * command ID registered in the current server profile. + * + * @param string $commandID Command ID. + * + * @return string|null + */ + public function getCommandClass($commandID) + { + if (isset($this->commands[$commandID = strtoupper($commandID)])) { + return $this->commands[$commandID]; + } + } + + /** + * {@inheritdoc} + */ + public function createCommand($commandID, array $arguments = array()) + { + $commandID = strtoupper($commandID); + + if (!isset($this->commands[$commandID])) { + throw new ClientException("Command '$commandID' is not a registered Redis command."); + } + + $commandClass = $this->commands[$commandID]; + $command = new $commandClass(); + $command->setArguments($arguments); + + if (isset($this->processor)) { + $this->processor->process($command); + } + + return $command; + } + + /** + * Defines a new command in the server profile. + * + * @param string $commandID Command ID. + * @param string $class Fully-qualified name of a Predis\Command\CommandInterface. + * + * @throws \InvalidArgumentException + */ + public function defineCommand($commandID, $class) + { + $reflection = new \ReflectionClass($class); + + if (!$reflection->isSubclassOf('Predis\Command\CommandInterface')) { + throw new \InvalidArgumentException("The class '$class' is not a valid command class."); + } + + $this->commands[strtoupper($commandID)] = $class; + } + + /** + * {@inheritdoc} + */ + public function setProcessor(ProcessorInterface $processor = null) + { + $this->processor = $processor; + } + + /** + * {@inheritdoc} + */ + public function getProcessor() + { + return $this->processor; + } + + /** + * Returns the version of server profile as its string representation. + * + * @return string + */ + public function __toString() + { + return $this->getVersion(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisUnstable.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisUnstable.php new file mode 100755 index 00000000..cf6174fe --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisUnstable.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Profile; + +/** + * Server profile for the current unstable version of Redis. + * + * @author Daniele Alessandri + */ +class RedisUnstable extends RedisVersion300 +{ + /** + * {@inheritdoc} + */ + public function getVersion() + { + return '3.2'; + } + + /** + * {@inheritdoc} + */ + public function getSupportedCommands() + { + return array_merge(parent::getSupportedCommands(), array( + /* ---------------- Redis 3.2 ---------------- */ + + /* commands operating on hashes */ + 'HSTRLEN' => 'Predis\Command\HashStringLength', + )); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion200.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion200.php new file mode 100755 index 00000000..234d53c0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion200.php @@ -0,0 +1,173 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Profile; + +/** + * Server profile for Redis 2.0. + * + * @author Daniele Alessandri + */ +class RedisVersion200 extends RedisProfile +{ + /** + * {@inheritdoc} + */ + public function getVersion() + { + return '2.0'; + } + + /** + * {@inheritdoc} + */ + public function getSupportedCommands() + { + return array( + /* ---------------- Redis 1.2 ---------------- */ + + /* commands operating on the key space */ + 'EXISTS' => 'Predis\Command\KeyExists', + 'DEL' => 'Predis\Command\KeyDelete', + 'TYPE' => 'Predis\Command\KeyType', + 'KEYS' => 'Predis\Command\KeyKeys', + 'RANDOMKEY' => 'Predis\Command\KeyRandom', + 'RENAME' => 'Predis\Command\KeyRename', + 'RENAMENX' => 'Predis\Command\KeyRenamePreserve', + 'EXPIRE' => 'Predis\Command\KeyExpire', + 'EXPIREAT' => 'Predis\Command\KeyExpireAt', + 'TTL' => 'Predis\Command\KeyTimeToLive', + 'MOVE' => 'Predis\Command\KeyMove', + 'SORT' => 'Predis\Command\KeySort', + + /* commands operating on string values */ + 'SET' => 'Predis\Command\StringSet', + 'SETNX' => 'Predis\Command\StringSetPreserve', + 'MSET' => 'Predis\Command\StringSetMultiple', + 'MSETNX' => 'Predis\Command\StringSetMultiplePreserve', + 'GET' => 'Predis\Command\StringGet', + 'MGET' => 'Predis\Command\StringGetMultiple', + 'GETSET' => 'Predis\Command\StringGetSet', + 'INCR' => 'Predis\Command\StringIncrement', + 'INCRBY' => 'Predis\Command\StringIncrementBy', + 'DECR' => 'Predis\Command\StringDecrement', + 'DECRBY' => 'Predis\Command\StringDecrementBy', + + /* commands operating on lists */ + 'RPUSH' => 'Predis\Command\ListPushTail', + 'LPUSH' => 'Predis\Command\ListPushHead', + 'LLEN' => 'Predis\Command\ListLength', + 'LRANGE' => 'Predis\Command\ListRange', + 'LTRIM' => 'Predis\Command\ListTrim', + 'LINDEX' => 'Predis\Command\ListIndex', + 'LSET' => 'Predis\Command\ListSet', + 'LREM' => 'Predis\Command\ListRemove', + 'LPOP' => 'Predis\Command\ListPopFirst', + 'RPOP' => 'Predis\Command\ListPopLast', + 'RPOPLPUSH' => 'Predis\Command\ListPopLastPushHead', + + /* commands operating on sets */ + 'SADD' => 'Predis\Command\SetAdd', + 'SREM' => 'Predis\Command\SetRemove', + 'SPOP' => 'Predis\Command\SetPop', + 'SMOVE' => 'Predis\Command\SetMove', + 'SCARD' => 'Predis\Command\SetCardinality', + 'SISMEMBER' => 'Predis\Command\SetIsMember', + 'SINTER' => 'Predis\Command\SetIntersection', + 'SINTERSTORE' => 'Predis\Command\SetIntersectionStore', + 'SUNION' => 'Predis\Command\SetUnion', + 'SUNIONSTORE' => 'Predis\Command\SetUnionStore', + 'SDIFF' => 'Predis\Command\SetDifference', + 'SDIFFSTORE' => 'Predis\Command\SetDifferenceStore', + 'SMEMBERS' => 'Predis\Command\SetMembers', + 'SRANDMEMBER' => 'Predis\Command\SetRandomMember', + + /* commands operating on sorted sets */ + 'ZADD' => 'Predis\Command\ZSetAdd', + 'ZINCRBY' => 'Predis\Command\ZSetIncrementBy', + 'ZREM' => 'Predis\Command\ZSetRemove', + 'ZRANGE' => 'Predis\Command\ZSetRange', + 'ZREVRANGE' => 'Predis\Command\ZSetReverseRange', + 'ZRANGEBYSCORE' => 'Predis\Command\ZSetRangeByScore', + 'ZCARD' => 'Predis\Command\ZSetCardinality', + 'ZSCORE' => 'Predis\Command\ZSetScore', + 'ZREMRANGEBYSCORE' => 'Predis\Command\ZSetRemoveRangeByScore', + + /* connection related commands */ + 'PING' => 'Predis\Command\ConnectionPing', + 'AUTH' => 'Predis\Command\ConnectionAuth', + 'SELECT' => 'Predis\Command\ConnectionSelect', + 'ECHO' => 'Predis\Command\ConnectionEcho', + 'QUIT' => 'Predis\Command\ConnectionQuit', + + /* remote server control commands */ + 'INFO' => 'Predis\Command\ServerInfo', + 'SLAVEOF' => 'Predis\Command\ServerSlaveOf', + 'MONITOR' => 'Predis\Command\ServerMonitor', + 'DBSIZE' => 'Predis\Command\ServerDatabaseSize', + 'FLUSHDB' => 'Predis\Command\ServerFlushDatabase', + 'FLUSHALL' => 'Predis\Command\ServerFlushAll', + 'SAVE' => 'Predis\Command\ServerSave', + 'BGSAVE' => 'Predis\Command\ServerBackgroundSave', + 'LASTSAVE' => 'Predis\Command\ServerLastSave', + 'SHUTDOWN' => 'Predis\Command\ServerShutdown', + 'BGREWRITEAOF' => 'Predis\Command\ServerBackgroundRewriteAOF', + + /* ---------------- Redis 2.0 ---------------- */ + + /* commands operating on string values */ + 'SETEX' => 'Predis\Command\StringSetExpire', + 'APPEND' => 'Predis\Command\StringAppend', + 'SUBSTR' => 'Predis\Command\StringSubstr', + + /* commands operating on lists */ + 'BLPOP' => 'Predis\Command\ListPopFirstBlocking', + 'BRPOP' => 'Predis\Command\ListPopLastBlocking', + + /* commands operating on sorted sets */ + 'ZUNIONSTORE' => 'Predis\Command\ZSetUnionStore', + 'ZINTERSTORE' => 'Predis\Command\ZSetIntersectionStore', + 'ZCOUNT' => 'Predis\Command\ZSetCount', + 'ZRANK' => 'Predis\Command\ZSetRank', + 'ZREVRANK' => 'Predis\Command\ZSetReverseRank', + 'ZREMRANGEBYRANK' => 'Predis\Command\ZSetRemoveRangeByRank', + + /* commands operating on hashes */ + 'HSET' => 'Predis\Command\HashSet', + 'HSETNX' => 'Predis\Command\HashSetPreserve', + 'HMSET' => 'Predis\Command\HashSetMultiple', + 'HINCRBY' => 'Predis\Command\HashIncrementBy', + 'HGET' => 'Predis\Command\HashGet', + 'HMGET' => 'Predis\Command\HashGetMultiple', + 'HDEL' => 'Predis\Command\HashDelete', + 'HEXISTS' => 'Predis\Command\HashExists', + 'HLEN' => 'Predis\Command\HashLength', + 'HKEYS' => 'Predis\Command\HashKeys', + 'HVALS' => 'Predis\Command\HashValues', + 'HGETALL' => 'Predis\Command\HashGetAll', + + /* transactions */ + 'MULTI' => 'Predis\Command\TransactionMulti', + 'EXEC' => 'Predis\Command\TransactionExec', + 'DISCARD' => 'Predis\Command\TransactionDiscard', + + /* publish - subscribe */ + 'SUBSCRIBE' => 'Predis\Command\PubSubSubscribe', + 'UNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribe', + 'PSUBSCRIBE' => 'Predis\Command\PubSubSubscribeByPattern', + 'PUNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribeByPattern', + 'PUBLISH' => 'Predis\Command\PubSubPublish', + + /* remote server control commands */ + 'CONFIG' => 'Predis\Command\ServerConfig', + ); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion220.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion220.php new file mode 100755 index 00000000..899014e2 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion220.php @@ -0,0 +1,202 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Profile; + +/** + * Server profile for Redis 2.2. + * + * @author Daniele Alessandri + */ +class RedisVersion220 extends RedisProfile +{ + /** + * {@inheritdoc} + */ + public function getVersion() + { + return '2.2'; + } + + /** + * {@inheritdoc} + */ + public function getSupportedCommands() + { + return array( + /* ---------------- Redis 1.2 ---------------- */ + + /* commands operating on the key space */ + 'EXISTS' => 'Predis\Command\KeyExists', + 'DEL' => 'Predis\Command\KeyDelete', + 'TYPE' => 'Predis\Command\KeyType', + 'KEYS' => 'Predis\Command\KeyKeys', + 'RANDOMKEY' => 'Predis\Command\KeyRandom', + 'RENAME' => 'Predis\Command\KeyRename', + 'RENAMENX' => 'Predis\Command\KeyRenamePreserve', + 'EXPIRE' => 'Predis\Command\KeyExpire', + 'EXPIREAT' => 'Predis\Command\KeyExpireAt', + 'TTL' => 'Predis\Command\KeyTimeToLive', + 'MOVE' => 'Predis\Command\KeyMove', + 'SORT' => 'Predis\Command\KeySort', + + /* commands operating on string values */ + 'SET' => 'Predis\Command\StringSet', + 'SETNX' => 'Predis\Command\StringSetPreserve', + 'MSET' => 'Predis\Command\StringSetMultiple', + 'MSETNX' => 'Predis\Command\StringSetMultiplePreserve', + 'GET' => 'Predis\Command\StringGet', + 'MGET' => 'Predis\Command\StringGetMultiple', + 'GETSET' => 'Predis\Command\StringGetSet', + 'INCR' => 'Predis\Command\StringIncrement', + 'INCRBY' => 'Predis\Command\StringIncrementBy', + 'DECR' => 'Predis\Command\StringDecrement', + 'DECRBY' => 'Predis\Command\StringDecrementBy', + + /* commands operating on lists */ + 'RPUSH' => 'Predis\Command\ListPushTail', + 'LPUSH' => 'Predis\Command\ListPushHead', + 'LLEN' => 'Predis\Command\ListLength', + 'LRANGE' => 'Predis\Command\ListRange', + 'LTRIM' => 'Predis\Command\ListTrim', + 'LINDEX' => 'Predis\Command\ListIndex', + 'LSET' => 'Predis\Command\ListSet', + 'LREM' => 'Predis\Command\ListRemove', + 'LPOP' => 'Predis\Command\ListPopFirst', + 'RPOP' => 'Predis\Command\ListPopLast', + 'RPOPLPUSH' => 'Predis\Command\ListPopLastPushHead', + + /* commands operating on sets */ + 'SADD' => 'Predis\Command\SetAdd', + 'SREM' => 'Predis\Command\SetRemove', + 'SPOP' => 'Predis\Command\SetPop', + 'SMOVE' => 'Predis\Command\SetMove', + 'SCARD' => 'Predis\Command\SetCardinality', + 'SISMEMBER' => 'Predis\Command\SetIsMember', + 'SINTER' => 'Predis\Command\SetIntersection', + 'SINTERSTORE' => 'Predis\Command\SetIntersectionStore', + 'SUNION' => 'Predis\Command\SetUnion', + 'SUNIONSTORE' => 'Predis\Command\SetUnionStore', + 'SDIFF' => 'Predis\Command\SetDifference', + 'SDIFFSTORE' => 'Predis\Command\SetDifferenceStore', + 'SMEMBERS' => 'Predis\Command\SetMembers', + 'SRANDMEMBER' => 'Predis\Command\SetRandomMember', + + /* commands operating on sorted sets */ + 'ZADD' => 'Predis\Command\ZSetAdd', + 'ZINCRBY' => 'Predis\Command\ZSetIncrementBy', + 'ZREM' => 'Predis\Command\ZSetRemove', + 'ZRANGE' => 'Predis\Command\ZSetRange', + 'ZREVRANGE' => 'Predis\Command\ZSetReverseRange', + 'ZRANGEBYSCORE' => 'Predis\Command\ZSetRangeByScore', + 'ZCARD' => 'Predis\Command\ZSetCardinality', + 'ZSCORE' => 'Predis\Command\ZSetScore', + 'ZREMRANGEBYSCORE' => 'Predis\Command\ZSetRemoveRangeByScore', + + /* connection related commands */ + 'PING' => 'Predis\Command\ConnectionPing', + 'AUTH' => 'Predis\Command\ConnectionAuth', + 'SELECT' => 'Predis\Command\ConnectionSelect', + 'ECHO' => 'Predis\Command\ConnectionEcho', + 'QUIT' => 'Predis\Command\ConnectionQuit', + + /* remote server control commands */ + 'INFO' => 'Predis\Command\ServerInfo', + 'SLAVEOF' => 'Predis\Command\ServerSlaveOf', + 'MONITOR' => 'Predis\Command\ServerMonitor', + 'DBSIZE' => 'Predis\Command\ServerDatabaseSize', + 'FLUSHDB' => 'Predis\Command\ServerFlushDatabase', + 'FLUSHALL' => 'Predis\Command\ServerFlushAll', + 'SAVE' => 'Predis\Command\ServerSave', + 'BGSAVE' => 'Predis\Command\ServerBackgroundSave', + 'LASTSAVE' => 'Predis\Command\ServerLastSave', + 'SHUTDOWN' => 'Predis\Command\ServerShutdown', + 'BGREWRITEAOF' => 'Predis\Command\ServerBackgroundRewriteAOF', + + /* ---------------- Redis 2.0 ---------------- */ + + /* commands operating on string values */ + 'SETEX' => 'Predis\Command\StringSetExpire', + 'APPEND' => 'Predis\Command\StringAppend', + 'SUBSTR' => 'Predis\Command\StringSubstr', + + /* commands operating on lists */ + 'BLPOP' => 'Predis\Command\ListPopFirstBlocking', + 'BRPOP' => 'Predis\Command\ListPopLastBlocking', + + /* commands operating on sorted sets */ + 'ZUNIONSTORE' => 'Predis\Command\ZSetUnionStore', + 'ZINTERSTORE' => 'Predis\Command\ZSetIntersectionStore', + 'ZCOUNT' => 'Predis\Command\ZSetCount', + 'ZRANK' => 'Predis\Command\ZSetRank', + 'ZREVRANK' => 'Predis\Command\ZSetReverseRank', + 'ZREMRANGEBYRANK' => 'Predis\Command\ZSetRemoveRangeByRank', + + /* commands operating on hashes */ + 'HSET' => 'Predis\Command\HashSet', + 'HSETNX' => 'Predis\Command\HashSetPreserve', + 'HMSET' => 'Predis\Command\HashSetMultiple', + 'HINCRBY' => 'Predis\Command\HashIncrementBy', + 'HGET' => 'Predis\Command\HashGet', + 'HMGET' => 'Predis\Command\HashGetMultiple', + 'HDEL' => 'Predis\Command\HashDelete', + 'HEXISTS' => 'Predis\Command\HashExists', + 'HLEN' => 'Predis\Command\HashLength', + 'HKEYS' => 'Predis\Command\HashKeys', + 'HVALS' => 'Predis\Command\HashValues', + 'HGETALL' => 'Predis\Command\HashGetAll', + + /* transactions */ + 'MULTI' => 'Predis\Command\TransactionMulti', + 'EXEC' => 'Predis\Command\TransactionExec', + 'DISCARD' => 'Predis\Command\TransactionDiscard', + + /* publish - subscribe */ + 'SUBSCRIBE' => 'Predis\Command\PubSubSubscribe', + 'UNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribe', + 'PSUBSCRIBE' => 'Predis\Command\PubSubSubscribeByPattern', + 'PUNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribeByPattern', + 'PUBLISH' => 'Predis\Command\PubSubPublish', + + /* remote server control commands */ + 'CONFIG' => 'Predis\Command\ServerConfig', + + /* ---------------- Redis 2.2 ---------------- */ + + /* commands operating on the key space */ + 'PERSIST' => 'Predis\Command\KeyPersist', + + /* commands operating on string values */ + 'STRLEN' => 'Predis\Command\StringStrlen', + 'SETRANGE' => 'Predis\Command\StringSetRange', + 'GETRANGE' => 'Predis\Command\StringGetRange', + 'SETBIT' => 'Predis\Command\StringSetBit', + 'GETBIT' => 'Predis\Command\StringGetBit', + + /* commands operating on lists */ + 'RPUSHX' => 'Predis\Command\ListPushTailX', + 'LPUSHX' => 'Predis\Command\ListPushHeadX', + 'LINSERT' => 'Predis\Command\ListInsert', + 'BRPOPLPUSH' => 'Predis\Command\ListPopLastPushHeadBlocking', + + /* commands operating on sorted sets */ + 'ZREVRANGEBYSCORE' => 'Predis\Command\ZSetReverseRangeByScore', + + /* transactions */ + 'WATCH' => 'Predis\Command\TransactionWatch', + 'UNWATCH' => 'Predis\Command\TransactionUnwatch', + + /* remote server control commands */ + 'OBJECT' => 'Predis\Command\ServerObject', + 'SLOWLOG' => 'Predis\Command\ServerSlowlog', + ); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion240.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion240.php new file mode 100755 index 00000000..0856c37c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion240.php @@ -0,0 +1,207 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Profile; + +/** + * Server profile for Redis 2.4. + * + * @author Daniele Alessandri + */ +class RedisVersion240 extends RedisProfile +{ + /** + * {@inheritdoc} + */ + public function getVersion() + { + return '2.4'; + } + + /** + * {@inheritdoc} + */ + public function getSupportedCommands() + { + return array( + /* ---------------- Redis 1.2 ---------------- */ + + /* commands operating on the key space */ + 'EXISTS' => 'Predis\Command\KeyExists', + 'DEL' => 'Predis\Command\KeyDelete', + 'TYPE' => 'Predis\Command\KeyType', + 'KEYS' => 'Predis\Command\KeyKeys', + 'RANDOMKEY' => 'Predis\Command\KeyRandom', + 'RENAME' => 'Predis\Command\KeyRename', + 'RENAMENX' => 'Predis\Command\KeyRenamePreserve', + 'EXPIRE' => 'Predis\Command\KeyExpire', + 'EXPIREAT' => 'Predis\Command\KeyExpireAt', + 'TTL' => 'Predis\Command\KeyTimeToLive', + 'MOVE' => 'Predis\Command\KeyMove', + 'SORT' => 'Predis\Command\KeySort', + + /* commands operating on string values */ + 'SET' => 'Predis\Command\StringSet', + 'SETNX' => 'Predis\Command\StringSetPreserve', + 'MSET' => 'Predis\Command\StringSetMultiple', + 'MSETNX' => 'Predis\Command\StringSetMultiplePreserve', + 'GET' => 'Predis\Command\StringGet', + 'MGET' => 'Predis\Command\StringGetMultiple', + 'GETSET' => 'Predis\Command\StringGetSet', + 'INCR' => 'Predis\Command\StringIncrement', + 'INCRBY' => 'Predis\Command\StringIncrementBy', + 'DECR' => 'Predis\Command\StringDecrement', + 'DECRBY' => 'Predis\Command\StringDecrementBy', + + /* commands operating on lists */ + 'RPUSH' => 'Predis\Command\ListPushTail', + 'LPUSH' => 'Predis\Command\ListPushHead', + 'LLEN' => 'Predis\Command\ListLength', + 'LRANGE' => 'Predis\Command\ListRange', + 'LTRIM' => 'Predis\Command\ListTrim', + 'LINDEX' => 'Predis\Command\ListIndex', + 'LSET' => 'Predis\Command\ListSet', + 'LREM' => 'Predis\Command\ListRemove', + 'LPOP' => 'Predis\Command\ListPopFirst', + 'RPOP' => 'Predis\Command\ListPopLast', + 'RPOPLPUSH' => 'Predis\Command\ListPopLastPushHead', + + /* commands operating on sets */ + 'SADD' => 'Predis\Command\SetAdd', + 'SREM' => 'Predis\Command\SetRemove', + 'SPOP' => 'Predis\Command\SetPop', + 'SMOVE' => 'Predis\Command\SetMove', + 'SCARD' => 'Predis\Command\SetCardinality', + 'SISMEMBER' => 'Predis\Command\SetIsMember', + 'SINTER' => 'Predis\Command\SetIntersection', + 'SINTERSTORE' => 'Predis\Command\SetIntersectionStore', + 'SUNION' => 'Predis\Command\SetUnion', + 'SUNIONSTORE' => 'Predis\Command\SetUnionStore', + 'SDIFF' => 'Predis\Command\SetDifference', + 'SDIFFSTORE' => 'Predis\Command\SetDifferenceStore', + 'SMEMBERS' => 'Predis\Command\SetMembers', + 'SRANDMEMBER' => 'Predis\Command\SetRandomMember', + + /* commands operating on sorted sets */ + 'ZADD' => 'Predis\Command\ZSetAdd', + 'ZINCRBY' => 'Predis\Command\ZSetIncrementBy', + 'ZREM' => 'Predis\Command\ZSetRemove', + 'ZRANGE' => 'Predis\Command\ZSetRange', + 'ZREVRANGE' => 'Predis\Command\ZSetReverseRange', + 'ZRANGEBYSCORE' => 'Predis\Command\ZSetRangeByScore', + 'ZCARD' => 'Predis\Command\ZSetCardinality', + 'ZSCORE' => 'Predis\Command\ZSetScore', + 'ZREMRANGEBYSCORE' => 'Predis\Command\ZSetRemoveRangeByScore', + + /* connection related commands */ + 'PING' => 'Predis\Command\ConnectionPing', + 'AUTH' => 'Predis\Command\ConnectionAuth', + 'SELECT' => 'Predis\Command\ConnectionSelect', + 'ECHO' => 'Predis\Command\ConnectionEcho', + 'QUIT' => 'Predis\Command\ConnectionQuit', + + /* remote server control commands */ + 'INFO' => 'Predis\Command\ServerInfo', + 'SLAVEOF' => 'Predis\Command\ServerSlaveOf', + 'MONITOR' => 'Predis\Command\ServerMonitor', + 'DBSIZE' => 'Predis\Command\ServerDatabaseSize', + 'FLUSHDB' => 'Predis\Command\ServerFlushDatabase', + 'FLUSHALL' => 'Predis\Command\ServerFlushAll', + 'SAVE' => 'Predis\Command\ServerSave', + 'BGSAVE' => 'Predis\Command\ServerBackgroundSave', + 'LASTSAVE' => 'Predis\Command\ServerLastSave', + 'SHUTDOWN' => 'Predis\Command\ServerShutdown', + 'BGREWRITEAOF' => 'Predis\Command\ServerBackgroundRewriteAOF', + + /* ---------------- Redis 2.0 ---------------- */ + + /* commands operating on string values */ + 'SETEX' => 'Predis\Command\StringSetExpire', + 'APPEND' => 'Predis\Command\StringAppend', + 'SUBSTR' => 'Predis\Command\StringSubstr', + + /* commands operating on lists */ + 'BLPOP' => 'Predis\Command\ListPopFirstBlocking', + 'BRPOP' => 'Predis\Command\ListPopLastBlocking', + + /* commands operating on sorted sets */ + 'ZUNIONSTORE' => 'Predis\Command\ZSetUnionStore', + 'ZINTERSTORE' => 'Predis\Command\ZSetIntersectionStore', + 'ZCOUNT' => 'Predis\Command\ZSetCount', + 'ZRANK' => 'Predis\Command\ZSetRank', + 'ZREVRANK' => 'Predis\Command\ZSetReverseRank', + 'ZREMRANGEBYRANK' => 'Predis\Command\ZSetRemoveRangeByRank', + + /* commands operating on hashes */ + 'HSET' => 'Predis\Command\HashSet', + 'HSETNX' => 'Predis\Command\HashSetPreserve', + 'HMSET' => 'Predis\Command\HashSetMultiple', + 'HINCRBY' => 'Predis\Command\HashIncrementBy', + 'HGET' => 'Predis\Command\HashGet', + 'HMGET' => 'Predis\Command\HashGetMultiple', + 'HDEL' => 'Predis\Command\HashDelete', + 'HEXISTS' => 'Predis\Command\HashExists', + 'HLEN' => 'Predis\Command\HashLength', + 'HKEYS' => 'Predis\Command\HashKeys', + 'HVALS' => 'Predis\Command\HashValues', + 'HGETALL' => 'Predis\Command\HashGetAll', + + /* transactions */ + 'MULTI' => 'Predis\Command\TransactionMulti', + 'EXEC' => 'Predis\Command\TransactionExec', + 'DISCARD' => 'Predis\Command\TransactionDiscard', + + /* publish - subscribe */ + 'SUBSCRIBE' => 'Predis\Command\PubSubSubscribe', + 'UNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribe', + 'PSUBSCRIBE' => 'Predis\Command\PubSubSubscribeByPattern', + 'PUNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribeByPattern', + 'PUBLISH' => 'Predis\Command\PubSubPublish', + + /* remote server control commands */ + 'CONFIG' => 'Predis\Command\ServerConfig', + + /* ---------------- Redis 2.2 ---------------- */ + + /* commands operating on the key space */ + 'PERSIST' => 'Predis\Command\KeyPersist', + + /* commands operating on string values */ + 'STRLEN' => 'Predis\Command\StringStrlen', + 'SETRANGE' => 'Predis\Command\StringSetRange', + 'GETRANGE' => 'Predis\Command\StringGetRange', + 'SETBIT' => 'Predis\Command\StringSetBit', + 'GETBIT' => 'Predis\Command\StringGetBit', + + /* commands operating on lists */ + 'RPUSHX' => 'Predis\Command\ListPushTailX', + 'LPUSHX' => 'Predis\Command\ListPushHeadX', + 'LINSERT' => 'Predis\Command\ListInsert', + 'BRPOPLPUSH' => 'Predis\Command\ListPopLastPushHeadBlocking', + + /* commands operating on sorted sets */ + 'ZREVRANGEBYSCORE' => 'Predis\Command\ZSetReverseRangeByScore', + + /* transactions */ + 'WATCH' => 'Predis\Command\TransactionWatch', + 'UNWATCH' => 'Predis\Command\TransactionUnwatch', + + /* remote server control commands */ + 'OBJECT' => 'Predis\Command\ServerObject', + 'SLOWLOG' => 'Predis\Command\ServerSlowlog', + + /* ---------------- Redis 2.4 ---------------- */ + + /* remote server control commands */ + 'CLIENT' => 'Predis\Command\ServerClient', + ); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion260.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion260.php new file mode 100755 index 00000000..ba5084aa --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion260.php @@ -0,0 +1,235 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Profile; + +/** + * Server profile for Redis 2.6. + * + * @author Daniele Alessandri + */ +class RedisVersion260 extends RedisProfile +{ + /** + * {@inheritdoc} + */ + public function getVersion() + { + return '2.6'; + } + + /** + * {@inheritdoc} + */ + public function getSupportedCommands() + { + return array( + /* ---------------- Redis 1.2 ---------------- */ + + /* commands operating on the key space */ + 'EXISTS' => 'Predis\Command\KeyExists', + 'DEL' => 'Predis\Command\KeyDelete', + 'TYPE' => 'Predis\Command\KeyType', + 'KEYS' => 'Predis\Command\KeyKeys', + 'RANDOMKEY' => 'Predis\Command\KeyRandom', + 'RENAME' => 'Predis\Command\KeyRename', + 'RENAMENX' => 'Predis\Command\KeyRenamePreserve', + 'EXPIRE' => 'Predis\Command\KeyExpire', + 'EXPIREAT' => 'Predis\Command\KeyExpireAt', + 'TTL' => 'Predis\Command\KeyTimeToLive', + 'MOVE' => 'Predis\Command\KeyMove', + 'SORT' => 'Predis\Command\KeySort', + 'DUMP' => 'Predis\Command\KeyDump', + 'RESTORE' => 'Predis\Command\KeyRestore', + + /* commands operating on string values */ + 'SET' => 'Predis\Command\StringSet', + 'SETNX' => 'Predis\Command\StringSetPreserve', + 'MSET' => 'Predis\Command\StringSetMultiple', + 'MSETNX' => 'Predis\Command\StringSetMultiplePreserve', + 'GET' => 'Predis\Command\StringGet', + 'MGET' => 'Predis\Command\StringGetMultiple', + 'GETSET' => 'Predis\Command\StringGetSet', + 'INCR' => 'Predis\Command\StringIncrement', + 'INCRBY' => 'Predis\Command\StringIncrementBy', + 'DECR' => 'Predis\Command\StringDecrement', + 'DECRBY' => 'Predis\Command\StringDecrementBy', + + /* commands operating on lists */ + 'RPUSH' => 'Predis\Command\ListPushTail', + 'LPUSH' => 'Predis\Command\ListPushHead', + 'LLEN' => 'Predis\Command\ListLength', + 'LRANGE' => 'Predis\Command\ListRange', + 'LTRIM' => 'Predis\Command\ListTrim', + 'LINDEX' => 'Predis\Command\ListIndex', + 'LSET' => 'Predis\Command\ListSet', + 'LREM' => 'Predis\Command\ListRemove', + 'LPOP' => 'Predis\Command\ListPopFirst', + 'RPOP' => 'Predis\Command\ListPopLast', + 'RPOPLPUSH' => 'Predis\Command\ListPopLastPushHead', + + /* commands operating on sets */ + 'SADD' => 'Predis\Command\SetAdd', + 'SREM' => 'Predis\Command\SetRemove', + 'SPOP' => 'Predis\Command\SetPop', + 'SMOVE' => 'Predis\Command\SetMove', + 'SCARD' => 'Predis\Command\SetCardinality', + 'SISMEMBER' => 'Predis\Command\SetIsMember', + 'SINTER' => 'Predis\Command\SetIntersection', + 'SINTERSTORE' => 'Predis\Command\SetIntersectionStore', + 'SUNION' => 'Predis\Command\SetUnion', + 'SUNIONSTORE' => 'Predis\Command\SetUnionStore', + 'SDIFF' => 'Predis\Command\SetDifference', + 'SDIFFSTORE' => 'Predis\Command\SetDifferenceStore', + 'SMEMBERS' => 'Predis\Command\SetMembers', + 'SRANDMEMBER' => 'Predis\Command\SetRandomMember', + + /* commands operating on sorted sets */ + 'ZADD' => 'Predis\Command\ZSetAdd', + 'ZINCRBY' => 'Predis\Command\ZSetIncrementBy', + 'ZREM' => 'Predis\Command\ZSetRemove', + 'ZRANGE' => 'Predis\Command\ZSetRange', + 'ZREVRANGE' => 'Predis\Command\ZSetReverseRange', + 'ZRANGEBYSCORE' => 'Predis\Command\ZSetRangeByScore', + 'ZCARD' => 'Predis\Command\ZSetCardinality', + 'ZSCORE' => 'Predis\Command\ZSetScore', + 'ZREMRANGEBYSCORE' => 'Predis\Command\ZSetRemoveRangeByScore', + + /* connection related commands */ + 'PING' => 'Predis\Command\ConnectionPing', + 'AUTH' => 'Predis\Command\ConnectionAuth', + 'SELECT' => 'Predis\Command\ConnectionSelect', + 'ECHO' => 'Predis\Command\ConnectionEcho', + 'QUIT' => 'Predis\Command\ConnectionQuit', + + /* remote server control commands */ + 'INFO' => 'Predis\Command\ServerInfoV26x', + 'SLAVEOF' => 'Predis\Command\ServerSlaveOf', + 'MONITOR' => 'Predis\Command\ServerMonitor', + 'DBSIZE' => 'Predis\Command\ServerDatabaseSize', + 'FLUSHDB' => 'Predis\Command\ServerFlushDatabase', + 'FLUSHALL' => 'Predis\Command\ServerFlushAll', + 'SAVE' => 'Predis\Command\ServerSave', + 'BGSAVE' => 'Predis\Command\ServerBackgroundSave', + 'LASTSAVE' => 'Predis\Command\ServerLastSave', + 'SHUTDOWN' => 'Predis\Command\ServerShutdown', + 'BGREWRITEAOF' => 'Predis\Command\ServerBackgroundRewriteAOF', + + /* ---------------- Redis 2.0 ---------------- */ + + /* commands operating on string values */ + 'SETEX' => 'Predis\Command\StringSetExpire', + 'APPEND' => 'Predis\Command\StringAppend', + 'SUBSTR' => 'Predis\Command\StringSubstr', + + /* commands operating on lists */ + 'BLPOP' => 'Predis\Command\ListPopFirstBlocking', + 'BRPOP' => 'Predis\Command\ListPopLastBlocking', + + /* commands operating on sorted sets */ + 'ZUNIONSTORE' => 'Predis\Command\ZSetUnionStore', + 'ZINTERSTORE' => 'Predis\Command\ZSetIntersectionStore', + 'ZCOUNT' => 'Predis\Command\ZSetCount', + 'ZRANK' => 'Predis\Command\ZSetRank', + 'ZREVRANK' => 'Predis\Command\ZSetReverseRank', + 'ZREMRANGEBYRANK' => 'Predis\Command\ZSetRemoveRangeByRank', + + /* commands operating on hashes */ + 'HSET' => 'Predis\Command\HashSet', + 'HSETNX' => 'Predis\Command\HashSetPreserve', + 'HMSET' => 'Predis\Command\HashSetMultiple', + 'HINCRBY' => 'Predis\Command\HashIncrementBy', + 'HGET' => 'Predis\Command\HashGet', + 'HMGET' => 'Predis\Command\HashGetMultiple', + 'HDEL' => 'Predis\Command\HashDelete', + 'HEXISTS' => 'Predis\Command\HashExists', + 'HLEN' => 'Predis\Command\HashLength', + 'HKEYS' => 'Predis\Command\HashKeys', + 'HVALS' => 'Predis\Command\HashValues', + 'HGETALL' => 'Predis\Command\HashGetAll', + + /* transactions */ + 'MULTI' => 'Predis\Command\TransactionMulti', + 'EXEC' => 'Predis\Command\TransactionExec', + 'DISCARD' => 'Predis\Command\TransactionDiscard', + + /* publish - subscribe */ + 'SUBSCRIBE' => 'Predis\Command\PubSubSubscribe', + 'UNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribe', + 'PSUBSCRIBE' => 'Predis\Command\PubSubSubscribeByPattern', + 'PUNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribeByPattern', + 'PUBLISH' => 'Predis\Command\PubSubPublish', + + /* remote server control commands */ + 'CONFIG' => 'Predis\Command\ServerConfig', + + /* ---------------- Redis 2.2 ---------------- */ + + /* commands operating on the key space */ + 'PERSIST' => 'Predis\Command\KeyPersist', + + /* commands operating on string values */ + 'STRLEN' => 'Predis\Command\StringStrlen', + 'SETRANGE' => 'Predis\Command\StringSetRange', + 'GETRANGE' => 'Predis\Command\StringGetRange', + 'SETBIT' => 'Predis\Command\StringSetBit', + 'GETBIT' => 'Predis\Command\StringGetBit', + + /* commands operating on lists */ + 'RPUSHX' => 'Predis\Command\ListPushTailX', + 'LPUSHX' => 'Predis\Command\ListPushHeadX', + 'LINSERT' => 'Predis\Command\ListInsert', + 'BRPOPLPUSH' => 'Predis\Command\ListPopLastPushHeadBlocking', + + /* commands operating on sorted sets */ + 'ZREVRANGEBYSCORE' => 'Predis\Command\ZSetReverseRangeByScore', + + /* transactions */ + 'WATCH' => 'Predis\Command\TransactionWatch', + 'UNWATCH' => 'Predis\Command\TransactionUnwatch', + + /* remote server control commands */ + 'OBJECT' => 'Predis\Command\ServerObject', + 'SLOWLOG' => 'Predis\Command\ServerSlowlog', + + /* ---------------- Redis 2.4 ---------------- */ + + /* remote server control commands */ + 'CLIENT' => 'Predis\Command\ServerClient', + + /* ---------------- Redis 2.6 ---------------- */ + + /* commands operating on the key space */ + 'PTTL' => 'Predis\Command\KeyPreciseTimeToLive', + 'PEXPIRE' => 'Predis\Command\KeyPreciseExpire', + 'PEXPIREAT' => 'Predis\Command\KeyPreciseExpireAt', + 'MIGRATE' => 'Predis\Command\KeyMigrate', + + /* commands operating on string values */ + 'PSETEX' => 'Predis\Command\StringPreciseSetExpire', + 'INCRBYFLOAT' => 'Predis\Command\StringIncrementByFloat', + 'BITOP' => 'Predis\Command\StringBitOp', + 'BITCOUNT' => 'Predis\Command\StringBitCount', + + /* commands operating on hashes */ + 'HINCRBYFLOAT' => 'Predis\Command\HashIncrementByFloat', + + /* scripting */ + 'EVAL' => 'Predis\Command\ServerEval', + 'EVALSHA' => 'Predis\Command\ServerEvalSHA', + 'SCRIPT' => 'Predis\Command\ServerScript', + + /* remote server control commands */ + 'TIME' => 'Predis\Command\ServerTime', + 'SENTINEL' => 'Predis\Command\ServerSentinel', + ); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion280.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion280.php new file mode 100755 index 00000000..ea17e682 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion280.php @@ -0,0 +1,267 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Profile; + +/** + * Server profile for Redis 2.8. + * + * @author Daniele Alessandri + */ +class RedisVersion280 extends RedisProfile +{ + /** + * {@inheritdoc} + */ + public function getVersion() + { + return '2.8'; + } + + /** + * {@inheritdoc} + */ + public function getSupportedCommands() + { + return array( + /* ---------------- Redis 1.2 ---------------- */ + + /* commands operating on the key space */ + 'EXISTS' => 'Predis\Command\KeyExists', + 'DEL' => 'Predis\Command\KeyDelete', + 'TYPE' => 'Predis\Command\KeyType', + 'KEYS' => 'Predis\Command\KeyKeys', + 'RANDOMKEY' => 'Predis\Command\KeyRandom', + 'RENAME' => 'Predis\Command\KeyRename', + 'RENAMENX' => 'Predis\Command\KeyRenamePreserve', + 'EXPIRE' => 'Predis\Command\KeyExpire', + 'EXPIREAT' => 'Predis\Command\KeyExpireAt', + 'TTL' => 'Predis\Command\KeyTimeToLive', + 'MOVE' => 'Predis\Command\KeyMove', + 'SORT' => 'Predis\Command\KeySort', + 'DUMP' => 'Predis\Command\KeyDump', + 'RESTORE' => 'Predis\Command\KeyRestore', + + /* commands operating on string values */ + 'SET' => 'Predis\Command\StringSet', + 'SETNX' => 'Predis\Command\StringSetPreserve', + 'MSET' => 'Predis\Command\StringSetMultiple', + 'MSETNX' => 'Predis\Command\StringSetMultiplePreserve', + 'GET' => 'Predis\Command\StringGet', + 'MGET' => 'Predis\Command\StringGetMultiple', + 'GETSET' => 'Predis\Command\StringGetSet', + 'INCR' => 'Predis\Command\StringIncrement', + 'INCRBY' => 'Predis\Command\StringIncrementBy', + 'DECR' => 'Predis\Command\StringDecrement', + 'DECRBY' => 'Predis\Command\StringDecrementBy', + + /* commands operating on lists */ + 'RPUSH' => 'Predis\Command\ListPushTail', + 'LPUSH' => 'Predis\Command\ListPushHead', + 'LLEN' => 'Predis\Command\ListLength', + 'LRANGE' => 'Predis\Command\ListRange', + 'LTRIM' => 'Predis\Command\ListTrim', + 'LINDEX' => 'Predis\Command\ListIndex', + 'LSET' => 'Predis\Command\ListSet', + 'LREM' => 'Predis\Command\ListRemove', + 'LPOP' => 'Predis\Command\ListPopFirst', + 'RPOP' => 'Predis\Command\ListPopLast', + 'RPOPLPUSH' => 'Predis\Command\ListPopLastPushHead', + + /* commands operating on sets */ + 'SADD' => 'Predis\Command\SetAdd', + 'SREM' => 'Predis\Command\SetRemove', + 'SPOP' => 'Predis\Command\SetPop', + 'SMOVE' => 'Predis\Command\SetMove', + 'SCARD' => 'Predis\Command\SetCardinality', + 'SISMEMBER' => 'Predis\Command\SetIsMember', + 'SINTER' => 'Predis\Command\SetIntersection', + 'SINTERSTORE' => 'Predis\Command\SetIntersectionStore', + 'SUNION' => 'Predis\Command\SetUnion', + 'SUNIONSTORE' => 'Predis\Command\SetUnionStore', + 'SDIFF' => 'Predis\Command\SetDifference', + 'SDIFFSTORE' => 'Predis\Command\SetDifferenceStore', + 'SMEMBERS' => 'Predis\Command\SetMembers', + 'SRANDMEMBER' => 'Predis\Command\SetRandomMember', + + /* commands operating on sorted sets */ + 'ZADD' => 'Predis\Command\ZSetAdd', + 'ZINCRBY' => 'Predis\Command\ZSetIncrementBy', + 'ZREM' => 'Predis\Command\ZSetRemove', + 'ZRANGE' => 'Predis\Command\ZSetRange', + 'ZREVRANGE' => 'Predis\Command\ZSetReverseRange', + 'ZRANGEBYSCORE' => 'Predis\Command\ZSetRangeByScore', + 'ZCARD' => 'Predis\Command\ZSetCardinality', + 'ZSCORE' => 'Predis\Command\ZSetScore', + 'ZREMRANGEBYSCORE' => 'Predis\Command\ZSetRemoveRangeByScore', + + /* connection related commands */ + 'PING' => 'Predis\Command\ConnectionPing', + 'AUTH' => 'Predis\Command\ConnectionAuth', + 'SELECT' => 'Predis\Command\ConnectionSelect', + 'ECHO' => 'Predis\Command\ConnectionEcho', + 'QUIT' => 'Predis\Command\ConnectionQuit', + + /* remote server control commands */ + 'INFO' => 'Predis\Command\ServerInfoV26x', + 'SLAVEOF' => 'Predis\Command\ServerSlaveOf', + 'MONITOR' => 'Predis\Command\ServerMonitor', + 'DBSIZE' => 'Predis\Command\ServerDatabaseSize', + 'FLUSHDB' => 'Predis\Command\ServerFlushDatabase', + 'FLUSHALL' => 'Predis\Command\ServerFlushAll', + 'SAVE' => 'Predis\Command\ServerSave', + 'BGSAVE' => 'Predis\Command\ServerBackgroundSave', + 'LASTSAVE' => 'Predis\Command\ServerLastSave', + 'SHUTDOWN' => 'Predis\Command\ServerShutdown', + 'BGREWRITEAOF' => 'Predis\Command\ServerBackgroundRewriteAOF', + + /* ---------------- Redis 2.0 ---------------- */ + + /* commands operating on string values */ + 'SETEX' => 'Predis\Command\StringSetExpire', + 'APPEND' => 'Predis\Command\StringAppend', + 'SUBSTR' => 'Predis\Command\StringSubstr', + + /* commands operating on lists */ + 'BLPOP' => 'Predis\Command\ListPopFirstBlocking', + 'BRPOP' => 'Predis\Command\ListPopLastBlocking', + + /* commands operating on sorted sets */ + 'ZUNIONSTORE' => 'Predis\Command\ZSetUnionStore', + 'ZINTERSTORE' => 'Predis\Command\ZSetIntersectionStore', + 'ZCOUNT' => 'Predis\Command\ZSetCount', + 'ZRANK' => 'Predis\Command\ZSetRank', + 'ZREVRANK' => 'Predis\Command\ZSetReverseRank', + 'ZREMRANGEBYRANK' => 'Predis\Command\ZSetRemoveRangeByRank', + + /* commands operating on hashes */ + 'HSET' => 'Predis\Command\HashSet', + 'HSETNX' => 'Predis\Command\HashSetPreserve', + 'HMSET' => 'Predis\Command\HashSetMultiple', + 'HINCRBY' => 'Predis\Command\HashIncrementBy', + 'HGET' => 'Predis\Command\HashGet', + 'HMGET' => 'Predis\Command\HashGetMultiple', + 'HDEL' => 'Predis\Command\HashDelete', + 'HEXISTS' => 'Predis\Command\HashExists', + 'HLEN' => 'Predis\Command\HashLength', + 'HKEYS' => 'Predis\Command\HashKeys', + 'HVALS' => 'Predis\Command\HashValues', + 'HGETALL' => 'Predis\Command\HashGetAll', + + /* transactions */ + 'MULTI' => 'Predis\Command\TransactionMulti', + 'EXEC' => 'Predis\Command\TransactionExec', + 'DISCARD' => 'Predis\Command\TransactionDiscard', + + /* publish - subscribe */ + 'SUBSCRIBE' => 'Predis\Command\PubSubSubscribe', + 'UNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribe', + 'PSUBSCRIBE' => 'Predis\Command\PubSubSubscribeByPattern', + 'PUNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribeByPattern', + 'PUBLISH' => 'Predis\Command\PubSubPublish', + + /* remote server control commands */ + 'CONFIG' => 'Predis\Command\ServerConfig', + + /* ---------------- Redis 2.2 ---------------- */ + + /* commands operating on the key space */ + 'PERSIST' => 'Predis\Command\KeyPersist', + + /* commands operating on string values */ + 'STRLEN' => 'Predis\Command\StringStrlen', + 'SETRANGE' => 'Predis\Command\StringSetRange', + 'GETRANGE' => 'Predis\Command\StringGetRange', + 'SETBIT' => 'Predis\Command\StringSetBit', + 'GETBIT' => 'Predis\Command\StringGetBit', + + /* commands operating on lists */ + 'RPUSHX' => 'Predis\Command\ListPushTailX', + 'LPUSHX' => 'Predis\Command\ListPushHeadX', + 'LINSERT' => 'Predis\Command\ListInsert', + 'BRPOPLPUSH' => 'Predis\Command\ListPopLastPushHeadBlocking', + + /* commands operating on sorted sets */ + 'ZREVRANGEBYSCORE' => 'Predis\Command\ZSetReverseRangeByScore', + + /* transactions */ + 'WATCH' => 'Predis\Command\TransactionWatch', + 'UNWATCH' => 'Predis\Command\TransactionUnwatch', + + /* remote server control commands */ + 'OBJECT' => 'Predis\Command\ServerObject', + 'SLOWLOG' => 'Predis\Command\ServerSlowlog', + + /* ---------------- Redis 2.4 ---------------- */ + + /* remote server control commands */ + 'CLIENT' => 'Predis\Command\ServerClient', + + /* ---------------- Redis 2.6 ---------------- */ + + /* commands operating on the key space */ + 'PTTL' => 'Predis\Command\KeyPreciseTimeToLive', + 'PEXPIRE' => 'Predis\Command\KeyPreciseExpire', + 'PEXPIREAT' => 'Predis\Command\KeyPreciseExpireAt', + 'MIGRATE' => 'Predis\Command\KeyMigrate', + + /* commands operating on string values */ + 'PSETEX' => 'Predis\Command\StringPreciseSetExpire', + 'INCRBYFLOAT' => 'Predis\Command\StringIncrementByFloat', + 'BITOP' => 'Predis\Command\StringBitOp', + 'BITCOUNT' => 'Predis\Command\StringBitCount', + + /* commands operating on hashes */ + 'HINCRBYFLOAT' => 'Predis\Command\HashIncrementByFloat', + + /* scripting */ + 'EVAL' => 'Predis\Command\ServerEval', + 'EVALSHA' => 'Predis\Command\ServerEvalSHA', + 'SCRIPT' => 'Predis\Command\ServerScript', + + /* remote server control commands */ + 'TIME' => 'Predis\Command\ServerTime', + 'SENTINEL' => 'Predis\Command\ServerSentinel', + + /* ---------------- Redis 2.8 ---------------- */ + + /* commands operating on the key space */ + 'SCAN' => 'Predis\Command\KeyScan', + + /* commands operating on string values */ + 'BITPOS' => 'Predis\Command\StringBitPos', + + /* commands operating on sets */ + 'SSCAN' => 'Predis\Command\SetScan', + + /* commands operating on sorted sets */ + 'ZSCAN' => 'Predis\Command\ZSetScan', + 'ZLEXCOUNT' => 'Predis\Command\ZSetLexCount', + 'ZRANGEBYLEX' => 'Predis\Command\ZSetRangeByLex', + 'ZREMRANGEBYLEX' => 'Predis\Command\ZSetRemoveRangeByLex', + 'ZREVRANGEBYLEX' => 'Predis\Command\ZSetReverseRangeByLex', + + /* commands operating on hashes */ + 'HSCAN' => 'Predis\Command\HashScan', + + /* publish - subscribe */ + 'PUBSUB' => 'Predis\Command\PubSubPubsub', + + /* commands operating on HyperLogLog */ + 'PFADD' => 'Predis\Command\HyperLogLogAdd', + 'PFCOUNT' => 'Predis\Command\HyperLogLogCount', + 'PFMERGE' => 'Predis\Command\HyperLogLogMerge', + + /* remote server control commands */ + 'COMMAND' => 'Predis\Command\ServerCommand', + ); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion300.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion300.php new file mode 100755 index 00000000..8a2fac8b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion300.php @@ -0,0 +1,270 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Profile; + +/** + * Server profile for Redis 3.0. + * + * @author Daniele Alessandri + */ +class RedisVersion300 extends RedisProfile +{ + /** + * {@inheritdoc} + */ + public function getVersion() + { + return '3.0'; + } + + /** + * {@inheritdoc} + */ + public function getSupportedCommands() + { + return array( + /* ---------------- Redis 1.2 ---------------- */ + + /* commands operating on the key space */ + 'EXISTS' => 'Predis\Command\KeyExists', + 'DEL' => 'Predis\Command\KeyDelete', + 'TYPE' => 'Predis\Command\KeyType', + 'KEYS' => 'Predis\Command\KeyKeys', + 'RANDOMKEY' => 'Predis\Command\KeyRandom', + 'RENAME' => 'Predis\Command\KeyRename', + 'RENAMENX' => 'Predis\Command\KeyRenamePreserve', + 'EXPIRE' => 'Predis\Command\KeyExpire', + 'EXPIREAT' => 'Predis\Command\KeyExpireAt', + 'TTL' => 'Predis\Command\KeyTimeToLive', + 'MOVE' => 'Predis\Command\KeyMove', + 'SORT' => 'Predis\Command\KeySort', + 'DUMP' => 'Predis\Command\KeyDump', + 'RESTORE' => 'Predis\Command\KeyRestore', + + /* commands operating on string values */ + 'SET' => 'Predis\Command\StringSet', + 'SETNX' => 'Predis\Command\StringSetPreserve', + 'MSET' => 'Predis\Command\StringSetMultiple', + 'MSETNX' => 'Predis\Command\StringSetMultiplePreserve', + 'GET' => 'Predis\Command\StringGet', + 'MGET' => 'Predis\Command\StringGetMultiple', + 'GETSET' => 'Predis\Command\StringGetSet', + 'INCR' => 'Predis\Command\StringIncrement', + 'INCRBY' => 'Predis\Command\StringIncrementBy', + 'DECR' => 'Predis\Command\StringDecrement', + 'DECRBY' => 'Predis\Command\StringDecrementBy', + + /* commands operating on lists */ + 'RPUSH' => 'Predis\Command\ListPushTail', + 'LPUSH' => 'Predis\Command\ListPushHead', + 'LLEN' => 'Predis\Command\ListLength', + 'LRANGE' => 'Predis\Command\ListRange', + 'LTRIM' => 'Predis\Command\ListTrim', + 'LINDEX' => 'Predis\Command\ListIndex', + 'LSET' => 'Predis\Command\ListSet', + 'LREM' => 'Predis\Command\ListRemove', + 'LPOP' => 'Predis\Command\ListPopFirst', + 'RPOP' => 'Predis\Command\ListPopLast', + 'RPOPLPUSH' => 'Predis\Command\ListPopLastPushHead', + + /* commands operating on sets */ + 'SADD' => 'Predis\Command\SetAdd', + 'SREM' => 'Predis\Command\SetRemove', + 'SPOP' => 'Predis\Command\SetPop', + 'SMOVE' => 'Predis\Command\SetMove', + 'SCARD' => 'Predis\Command\SetCardinality', + 'SISMEMBER' => 'Predis\Command\SetIsMember', + 'SINTER' => 'Predis\Command\SetIntersection', + 'SINTERSTORE' => 'Predis\Command\SetIntersectionStore', + 'SUNION' => 'Predis\Command\SetUnion', + 'SUNIONSTORE' => 'Predis\Command\SetUnionStore', + 'SDIFF' => 'Predis\Command\SetDifference', + 'SDIFFSTORE' => 'Predis\Command\SetDifferenceStore', + 'SMEMBERS' => 'Predis\Command\SetMembers', + 'SRANDMEMBER' => 'Predis\Command\SetRandomMember', + + /* commands operating on sorted sets */ + 'ZADD' => 'Predis\Command\ZSetAdd', + 'ZINCRBY' => 'Predis\Command\ZSetIncrementBy', + 'ZREM' => 'Predis\Command\ZSetRemove', + 'ZRANGE' => 'Predis\Command\ZSetRange', + 'ZREVRANGE' => 'Predis\Command\ZSetReverseRange', + 'ZRANGEBYSCORE' => 'Predis\Command\ZSetRangeByScore', + 'ZCARD' => 'Predis\Command\ZSetCardinality', + 'ZSCORE' => 'Predis\Command\ZSetScore', + 'ZREMRANGEBYSCORE' => 'Predis\Command\ZSetRemoveRangeByScore', + + /* connection related commands */ + 'PING' => 'Predis\Command\ConnectionPing', + 'AUTH' => 'Predis\Command\ConnectionAuth', + 'SELECT' => 'Predis\Command\ConnectionSelect', + 'ECHO' => 'Predis\Command\ConnectionEcho', + 'QUIT' => 'Predis\Command\ConnectionQuit', + + /* remote server control commands */ + 'INFO' => 'Predis\Command\ServerInfoV26x', + 'SLAVEOF' => 'Predis\Command\ServerSlaveOf', + 'MONITOR' => 'Predis\Command\ServerMonitor', + 'DBSIZE' => 'Predis\Command\ServerDatabaseSize', + 'FLUSHDB' => 'Predis\Command\ServerFlushDatabase', + 'FLUSHALL' => 'Predis\Command\ServerFlushAll', + 'SAVE' => 'Predis\Command\ServerSave', + 'BGSAVE' => 'Predis\Command\ServerBackgroundSave', + 'LASTSAVE' => 'Predis\Command\ServerLastSave', + 'SHUTDOWN' => 'Predis\Command\ServerShutdown', + 'BGREWRITEAOF' => 'Predis\Command\ServerBackgroundRewriteAOF', + + /* ---------------- Redis 2.0 ---------------- */ + + /* commands operating on string values */ + 'SETEX' => 'Predis\Command\StringSetExpire', + 'APPEND' => 'Predis\Command\StringAppend', + 'SUBSTR' => 'Predis\Command\StringSubstr', + + /* commands operating on lists */ + 'BLPOP' => 'Predis\Command\ListPopFirstBlocking', + 'BRPOP' => 'Predis\Command\ListPopLastBlocking', + + /* commands operating on sorted sets */ + 'ZUNIONSTORE' => 'Predis\Command\ZSetUnionStore', + 'ZINTERSTORE' => 'Predis\Command\ZSetIntersectionStore', + 'ZCOUNT' => 'Predis\Command\ZSetCount', + 'ZRANK' => 'Predis\Command\ZSetRank', + 'ZREVRANK' => 'Predis\Command\ZSetReverseRank', + 'ZREMRANGEBYRANK' => 'Predis\Command\ZSetRemoveRangeByRank', + + /* commands operating on hashes */ + 'HSET' => 'Predis\Command\HashSet', + 'HSETNX' => 'Predis\Command\HashSetPreserve', + 'HMSET' => 'Predis\Command\HashSetMultiple', + 'HINCRBY' => 'Predis\Command\HashIncrementBy', + 'HGET' => 'Predis\Command\HashGet', + 'HMGET' => 'Predis\Command\HashGetMultiple', + 'HDEL' => 'Predis\Command\HashDelete', + 'HEXISTS' => 'Predis\Command\HashExists', + 'HLEN' => 'Predis\Command\HashLength', + 'HKEYS' => 'Predis\Command\HashKeys', + 'HVALS' => 'Predis\Command\HashValues', + 'HGETALL' => 'Predis\Command\HashGetAll', + + /* transactions */ + 'MULTI' => 'Predis\Command\TransactionMulti', + 'EXEC' => 'Predis\Command\TransactionExec', + 'DISCARD' => 'Predis\Command\TransactionDiscard', + + /* publish - subscribe */ + 'SUBSCRIBE' => 'Predis\Command\PubSubSubscribe', + 'UNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribe', + 'PSUBSCRIBE' => 'Predis\Command\PubSubSubscribeByPattern', + 'PUNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribeByPattern', + 'PUBLISH' => 'Predis\Command\PubSubPublish', + + /* remote server control commands */ + 'CONFIG' => 'Predis\Command\ServerConfig', + + /* ---------------- Redis 2.2 ---------------- */ + + /* commands operating on the key space */ + 'PERSIST' => 'Predis\Command\KeyPersist', + + /* commands operating on string values */ + 'STRLEN' => 'Predis\Command\StringStrlen', + 'SETRANGE' => 'Predis\Command\StringSetRange', + 'GETRANGE' => 'Predis\Command\StringGetRange', + 'SETBIT' => 'Predis\Command\StringSetBit', + 'GETBIT' => 'Predis\Command\StringGetBit', + + /* commands operating on lists */ + 'RPUSHX' => 'Predis\Command\ListPushTailX', + 'LPUSHX' => 'Predis\Command\ListPushHeadX', + 'LINSERT' => 'Predis\Command\ListInsert', + 'BRPOPLPUSH' => 'Predis\Command\ListPopLastPushHeadBlocking', + + /* commands operating on sorted sets */ + 'ZREVRANGEBYSCORE' => 'Predis\Command\ZSetReverseRangeByScore', + + /* transactions */ + 'WATCH' => 'Predis\Command\TransactionWatch', + 'UNWATCH' => 'Predis\Command\TransactionUnwatch', + + /* remote server control commands */ + 'OBJECT' => 'Predis\Command\ServerObject', + 'SLOWLOG' => 'Predis\Command\ServerSlowlog', + + /* ---------------- Redis 2.4 ---------------- */ + + /* remote server control commands */ + 'CLIENT' => 'Predis\Command\ServerClient', + + /* ---------------- Redis 2.6 ---------------- */ + + /* commands operating on the key space */ + 'PTTL' => 'Predis\Command\KeyPreciseTimeToLive', + 'PEXPIRE' => 'Predis\Command\KeyPreciseExpire', + 'PEXPIREAT' => 'Predis\Command\KeyPreciseExpireAt', + 'MIGRATE' => 'Predis\Command\KeyMigrate', + + /* commands operating on string values */ + 'PSETEX' => 'Predis\Command\StringPreciseSetExpire', + 'INCRBYFLOAT' => 'Predis\Command\StringIncrementByFloat', + 'BITOP' => 'Predis\Command\StringBitOp', + 'BITCOUNT' => 'Predis\Command\StringBitCount', + + /* commands operating on hashes */ + 'HINCRBYFLOAT' => 'Predis\Command\HashIncrementByFloat', + + /* scripting */ + 'EVAL' => 'Predis\Command\ServerEval', + 'EVALSHA' => 'Predis\Command\ServerEvalSHA', + 'SCRIPT' => 'Predis\Command\ServerScript', + + /* remote server control commands */ + 'TIME' => 'Predis\Command\ServerTime', + 'SENTINEL' => 'Predis\Command\ServerSentinel', + + /* ---------------- Redis 2.8 ---------------- */ + + /* commands operating on the key space */ + 'SCAN' => 'Predis\Command\KeyScan', + + /* commands operating on string values */ + 'BITPOS' => 'Predis\Command\StringBitPos', + + /* commands operating on sets */ + 'SSCAN' => 'Predis\Command\SetScan', + + /* commands operating on sorted sets */ + 'ZSCAN' => 'Predis\Command\ZSetScan', + 'ZLEXCOUNT' => 'Predis\Command\ZSetLexCount', + 'ZRANGEBYLEX' => 'Predis\Command\ZSetRangeByLex', + 'ZREMRANGEBYLEX' => 'Predis\Command\ZSetRemoveRangeByLex', + 'ZREVRANGEBYLEX' => 'Predis\Command\ZSetReverseRangeByLex', + + /* commands operating on hashes */ + 'HSCAN' => 'Predis\Command\HashScan', + + /* publish - subscribe */ + 'PUBSUB' => 'Predis\Command\PubSubPubsub', + + /* commands operating on HyperLogLog */ + 'PFADD' => 'Predis\Command\HyperLogLogAdd', + 'PFCOUNT' => 'Predis\Command\HyperLogLogCount', + 'PFMERGE' => 'Predis\Command\HyperLogLogMerge', + + /* remote server control commands */ + 'COMMAND' => 'Predis\Command\ServerCommand', + + /* ---------------- Redis 3.0 ---------------- */ + + ); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ProtocolException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ProtocolException.php new file mode 100755 index 00000000..6fe5d6d3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ProtocolException.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Protocol; + +use Predis\CommunicationException; + +/** + * Exception used to indentify errors encountered while parsing the Redis wire + * protocol. + * + * @author Daniele Alessandri + */ +class ProtocolException extends CommunicationException +{ +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ProtocolProcessorInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ProtocolProcessorInterface.php new file mode 100755 index 00000000..b34ea181 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ProtocolProcessorInterface.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Protocol; + +use Predis\Command\CommandInterface; +use Predis\Connection\CompositeConnectionInterface; + +/** + * Defines a pluggable protocol processor capable of serializing commands and + * deserializing responses into PHP objects directly from a connection. + * + * @author Daniele Alessandri + */ +interface ProtocolProcessorInterface +{ + /** + * Writes a request over a connection to Redis. + * + * @param CompositeConnectionInterface $connection Redis connection. + * @param CommandInterface $command Command instance. + */ + public function write(CompositeConnectionInterface $connection, CommandInterface $command); + + /** + * Reads a response from a connection to Redis. + * + * @param CompositeConnectionInterface $connection Redis connection. + * + * @return mixed + */ + public function read(CompositeConnectionInterface $connection); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/RequestSerializerInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/RequestSerializerInterface.php new file mode 100755 index 00000000..eef72a64 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/RequestSerializerInterface.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Protocol; + +use Predis\Command\CommandInterface; + +/** + * Defines a pluggable serializer for Redis commands. + * + * @author Daniele Alessandri + */ +interface RequestSerializerInterface +{ + /** + * Serializes a Redis command. + * + * @param CommandInterface $command Redis command. + * + * @return string + */ + public function serialize(CommandInterface $command); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ResponseReaderInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ResponseReaderInterface.php new file mode 100755 index 00000000..86a7bdcc --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ResponseReaderInterface.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Protocol; + +use Predis\Connection\CompositeConnectionInterface; + +/** + * Defines a pluggable reader capable of parsing responses returned by Redis and + * deserializing them to PHP objects. + * + * @author Daniele Alessandri + */ +interface ResponseReaderInterface +{ + /** + * Reads a response from a connection to Redis. + * + * @param CompositeConnectionInterface $connection Redis connection. + * + * @return mixed + */ + public function read(CompositeConnectionInterface $connection); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/CompositeProtocolProcessor.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/CompositeProtocolProcessor.php new file mode 100755 index 00000000..ea85ed30 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/CompositeProtocolProcessor.php @@ -0,0 +1,107 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Protocol\Text; + +use Predis\Command\CommandInterface; +use Predis\Connection\CompositeConnectionInterface; +use Predis\Protocol\ProtocolProcessorInterface; +use Predis\Protocol\RequestSerializerInterface; +use Predis\Protocol\ResponseReaderInterface; + +/** + * Composite protocol processor for the standard Redis wire protocol using + * pluggable handlers to serialize requests and deserialize responses. + * + * @link http://redis.io/topics/protocol + * + * @author Daniele Alessandri + */ +class CompositeProtocolProcessor implements ProtocolProcessorInterface +{ + /* + * @var RequestSerializerInterface + */ + protected $serializer; + + /* + * @var ResponseReaderInterface + */ + protected $reader; + + /** + * @param RequestSerializerInterface $serializer Request serializer. + * @param ResponseReaderInterface $reader Response reader. + */ + public function __construct( + RequestSerializerInterface $serializer = null, + ResponseReaderInterface $reader = null + ) { + $this->setRequestSerializer($serializer ?: new RequestSerializer()); + $this->setResponseReader($reader ?: new ResponseReader()); + } + + /** + * {@inheritdoc} + */ + public function write(CompositeConnectionInterface $connection, CommandInterface $command) + { + $connection->writeBuffer($this->serializer->serialize($command)); + } + + /** + * {@inheritdoc} + */ + public function read(CompositeConnectionInterface $connection) + { + return $this->reader->read($connection); + } + + /** + * Sets the request serializer used by the protocol processor. + * + * @param RequestSerializerInterface $serializer Request serializer. + */ + public function setRequestSerializer(RequestSerializerInterface $serializer) + { + $this->serializer = $serializer; + } + + /** + * Returns the request serializer used by the protocol processor. + * + * @return RequestSerializerInterface + */ + public function getRequestSerializer() + { + return $this->serializer; + } + + /** + * Sets the response reader used by the protocol processor. + * + * @param ResponseReaderInterface $reader Response reader. + */ + public function setResponseReader(ResponseReaderInterface $reader) + { + $this->reader = $reader; + } + + /** + * Returns the Response reader used by the protocol processor. + * + * @return ResponseReaderInterface + */ + public function getResponseReader() + { + return $this->reader; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/BulkResponse.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/BulkResponse.php new file mode 100755 index 00000000..5b0bf3c2 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/BulkResponse.php @@ -0,0 +1,55 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Protocol\Text\Handler; + +use Predis\CommunicationException; +use Predis\Connection\CompositeConnectionInterface; +use Predis\Protocol\ProtocolException; + +/** + * Handler for the bulk response type in the standard Redis wire protocol. + * It translates the payload to a string or a NULL. + * + * @link http://redis.io/topics/protocol + * + * @author Daniele Alessandri + */ +class BulkResponse implements ResponseHandlerInterface +{ + /** + * {@inheritdoc} + */ + public function handle(CompositeConnectionInterface $connection, $payload) + { + $length = (int) $payload; + + if ("$length" !== $payload) { + CommunicationException::handle(new ProtocolException( + $connection, "Cannot parse '$payload' as a valid length for a bulk response." + )); + } + + if ($length >= 0) { + return substr($connection->readBuffer($length + 2), 0, -2); + } + + if ($length == -1) { + return; + } + + CommunicationException::handle(new ProtocolException( + $connection, "Value '$payload' is not a valid length for a bulk response." + )); + + return; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/ErrorResponse.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/ErrorResponse.php new file mode 100755 index 00000000..3e18b7b9 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/ErrorResponse.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Protocol\Text\Handler; + +use Predis\Connection\CompositeConnectionInterface; +use Predis\Response\Error; + +/** + * Handler for the error response type in the standard Redis wire protocol. + * It translates the payload to a complex response object for Predis. + * + * @link http://redis.io/topics/protocol + * + * @author Daniele Alessandri + */ +class ErrorResponse implements ResponseHandlerInterface +{ + /** + * {@inheritdoc} + */ + public function handle(CompositeConnectionInterface $connection, $payload) + { + return new Error($payload); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/IntegerResponse.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/IntegerResponse.php new file mode 100755 index 00000000..4639d779 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/IntegerResponse.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Protocol\Text\Handler; + +use Predis\CommunicationException; +use Predis\Connection\CompositeConnectionInterface; +use Predis\Protocol\ProtocolException; + +/** + * Handler for the integer response type in the standard Redis wire protocol. + * It translates the payload an integer or NULL. + * + * @link http://redis.io/topics/protocol + * + * @author Daniele Alessandri + */ +class IntegerResponse implements ResponseHandlerInterface +{ + /** + * {@inheritdoc} + */ + public function handle(CompositeConnectionInterface $connection, $payload) + { + if (is_numeric($payload)) { + return (int) $payload; + } + + if ($payload !== 'nil') { + CommunicationException::handle(new ProtocolException( + $connection, "Cannot parse '$payload' as a valid numeric response." + )); + } + + return; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/MultiBulkResponse.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/MultiBulkResponse.php new file mode 100755 index 00000000..820b9b4a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/MultiBulkResponse.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Protocol\Text\Handler; + +use Predis\CommunicationException; +use Predis\Connection\CompositeConnectionInterface; +use Predis\Protocol\ProtocolException; + +/** + * Handler for the multibulk response type in the standard Redis wire protocol. + * It returns multibulk responses as PHP arrays. + * + * @link http://redis.io/topics/protocol + * + * @author Daniele Alessandri + */ +class MultiBulkResponse implements ResponseHandlerInterface +{ + /** + * {@inheritdoc} + */ + public function handle(CompositeConnectionInterface $connection, $payload) + { + $length = (int) $payload; + + if ("$length" !== $payload) { + CommunicationException::handle(new ProtocolException( + $connection, "Cannot parse '$payload' as a valid length of a multi-bulk response." + )); + } + + if ($length === -1) { + return; + } + + $list = array(); + + if ($length > 0) { + $handlersCache = array(); + $reader = $connection->getProtocol()->getResponseReader(); + + for ($i = 0; $i < $length; ++$i) { + $header = $connection->readLine(); + $prefix = $header[0]; + + if (isset($handlersCache[$prefix])) { + $handler = $handlersCache[$prefix]; + } else { + $handler = $reader->getHandler($prefix); + $handlersCache[$prefix] = $handler; + } + + $list[$i] = $handler->handle($connection, substr($header, 1)); + } + } + + return $list; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/ResponseHandlerInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/ResponseHandlerInterface.php new file mode 100755 index 00000000..ca08a9c5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/ResponseHandlerInterface.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Protocol\Text\Handler; + +use Predis\Connection\CompositeConnectionInterface; + +/** + * Defines a pluggable handler used to parse a particular type of response. + * + * @author Daniele Alessandri + */ +interface ResponseHandlerInterface +{ + /** + * Deserializes a response returned by Redis and reads more data from the + * connection if needed. + * + * @param CompositeConnectionInterface $connection Redis connection. + * @param string $payload String payload. + * + * @return mixed + */ + public function handle(CompositeConnectionInterface $connection, $payload); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/StatusResponse.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/StatusResponse.php new file mode 100755 index 00000000..7bde5558 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/StatusResponse.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Protocol\Text\Handler; + +use Predis\Connection\CompositeConnectionInterface; +use Predis\Response\Status; + +/** + * Handler for the status response type in the standard Redis wire protocol. It + * translates certain classes of status response to PHP objects or just returns + * the payload as a string. + * + * @link http://redis.io/topics/protocol + * + * @author Daniele Alessandri + */ +class StatusResponse implements ResponseHandlerInterface +{ + /** + * {@inheritdoc} + */ + public function handle(CompositeConnectionInterface $connection, $payload) + { + return Status::get($payload); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/StreamableMultiBulkResponse.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/StreamableMultiBulkResponse.php new file mode 100755 index 00000000..7cdb736a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/StreamableMultiBulkResponse.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Protocol\Text\Handler; + +use Predis\CommunicationException; +use Predis\Connection\CompositeConnectionInterface; +use Predis\Protocol\ProtocolException; +use Predis\Response\Iterator\MultiBulk as MultiBulkIterator; + +/** + * Handler for the multibulk response type in the standard Redis wire protocol. + * It returns multibulk responses as iterators that can stream bulk elements. + * + * Streamable multibulk responses are not globally supported by the abstractions + * built-in into Predis, such as transactions or pipelines. Use them with care! + * + * @link http://redis.io/topics/protocol + * + * @author Daniele Alessandri + */ +class StreamableMultiBulkResponse implements ResponseHandlerInterface +{ + /** + * {@inheritdoc} + */ + public function handle(CompositeConnectionInterface $connection, $payload) + { + $length = (int) $payload; + + if ("$length" != $payload) { + CommunicationException::handle(new ProtocolException( + $connection, "Cannot parse '$payload' as a valid length for a multi-bulk response." + )); + } + + return new MultiBulkIterator($connection, $length); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/ProtocolProcessor.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/ProtocolProcessor.php new file mode 100755 index 00000000..f04c3ed5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/ProtocolProcessor.php @@ -0,0 +1,122 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Protocol\Text; + +use Predis\Command\CommandInterface; +use Predis\CommunicationException; +use Predis\Connection\CompositeConnectionInterface; +use Predis\Protocol\ProtocolException; +use Predis\Protocol\ProtocolProcessorInterface; +use Predis\Response\Error as ErrorResponse; +use Predis\Response\Iterator\MultiBulk as MultiBulkIterator; +use Predis\Response\Status as StatusResponse; + +/** + * Protocol processor for the standard Redis wire protocol. + * + * @link http://redis.io/topics/protocol + * + * @author Daniele Alessandri + */ +class ProtocolProcessor implements ProtocolProcessorInterface +{ + protected $mbiterable; + protected $serializer; + + /** + * + */ + public function __construct() + { + $this->mbiterable = false; + $this->serializer = new RequestSerializer(); + } + + /** + * {@inheritdoc} + */ + public function write(CompositeConnectionInterface $connection, CommandInterface $command) + { + $request = $this->serializer->serialize($command); + $connection->writeBuffer($request); + } + + /** + * {@inheritdoc} + */ + public function read(CompositeConnectionInterface $connection) + { + $chunk = $connection->readLine(); + $prefix = $chunk[0]; + $payload = substr($chunk, 1); + + switch ($prefix) { + case '+': + return new StatusResponse($payload); + + case '$': + $size = (int) $payload; + if ($size === -1) { + return; + } + + return substr($connection->readBuffer($size + 2), 0, -2); + + case '*': + $count = (int) $payload; + + if ($count === -1) { + return; + } + if ($this->mbiterable) { + return new MultiBulkIterator($connection, $count); + } + + $multibulk = array(); + + for ($i = 0; $i < $count; ++$i) { + $multibulk[$i] = $this->read($connection); + } + + return $multibulk; + + case ':': + return (int) $payload; + + case '-': + return new ErrorResponse($payload); + + default: + CommunicationException::handle(new ProtocolException( + $connection, "Unknown response prefix: '$prefix'." + )); + + return; + } + } + + /** + * Enables or disables returning multibulk responses as specialized PHP + * iterators used to stream bulk elements of a multibulk response instead + * returning a plain array. + * + * Streamable multibulk responses are not globally supported by the + * abstractions built-in into Predis, such as transactions or pipelines. + * Use them with care! + * + * @param bool $value Enable or disable streamable multibulk responses. + */ + public function useIterableMultibulk($value) + { + $this->mbiterable = (bool) $value; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/RequestSerializer.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/RequestSerializer.php new file mode 100755 index 00000000..c8cbbfbc --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/RequestSerializer.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Protocol\Text; + +use Predis\Command\CommandInterface; +use Predis\Protocol\RequestSerializerInterface; + +/** + * Request serializer for the standard Redis wire protocol. + * + * @link http://redis.io/topics/protocol + * + * @author Daniele Alessandri + */ +class RequestSerializer implements RequestSerializerInterface +{ + /** + * {@inheritdoc} + */ + public function serialize(CommandInterface $command) + { + $commandID = $command->getId(); + $arguments = $command->getArguments(); + + $cmdlen = strlen($commandID); + $reqlen = count($arguments) + 1; + + $buffer = "*{$reqlen}\r\n\${$cmdlen}\r\n{$commandID}\r\n"; + + for ($i = 0, $reqlen--; $i < $reqlen; ++$i) { + $argument = $arguments[$i]; + $arglen = strlen($argument); + $buffer .= "\${$arglen}\r\n{$argument}\r\n"; + } + + return $buffer; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/ResponseReader.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/ResponseReader.php new file mode 100755 index 00000000..d96218df --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/ResponseReader.php @@ -0,0 +1,116 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Protocol\Text; + +use Predis\CommunicationException; +use Predis\Connection\CompositeConnectionInterface; +use Predis\Protocol\ProtocolException; +use Predis\Protocol\ResponseReaderInterface; + +/** + * Response reader for the standard Redis wire protocol. + * + * @link http://redis.io/topics/protocol + * + * @author Daniele Alessandri + */ +class ResponseReader implements ResponseReaderInterface +{ + protected $handlers; + + /** + * + */ + public function __construct() + { + $this->handlers = $this->getDefaultHandlers(); + } + + /** + * Returns the default handlers for the supported type of responses. + * + * @return array + */ + protected function getDefaultHandlers() + { + return array( + '+' => new Handler\StatusResponse(), + '-' => new Handler\ErrorResponse(), + ':' => new Handler\IntegerResponse(), + '$' => new Handler\BulkResponse(), + '*' => new Handler\MultiBulkResponse(), + ); + } + + /** + * Sets the handler for the specified prefix identifying the response type. + * + * @param string $prefix Identifier of the type of response. + * @param Handler\ResponseHandlerInterface $handler Response handler. + */ + public function setHandler($prefix, Handler\ResponseHandlerInterface $handler) + { + $this->handlers[$prefix] = $handler; + } + + /** + * Returns the response handler associated to a certain type of response. + * + * @param string $prefix Identifier of the type of response. + * + * @return Handler\ResponseHandlerInterface + */ + public function getHandler($prefix) + { + if (isset($this->handlers[$prefix])) { + return $this->handlers[$prefix]; + } + + return; + } + + /** + * {@inheritdoc} + */ + public function read(CompositeConnectionInterface $connection) + { + $header = $connection->readLine(); + + if ($header === '') { + $this->onProtocolError($connection, 'Unexpected empty reponse header.'); + } + + $prefix = $header[0]; + + if (!isset($this->handlers[$prefix])) { + $this->onProtocolError($connection, "Unknown response prefix: '$prefix'."); + } + + $payload = $this->handlers[$prefix]->handle($connection, substr($header, 1)); + + return $payload; + } + + /** + * Handles protocol errors generated while reading responses from a + * connection. + * + * @param CompositeConnectionInterface $connection Redis connection that generated the error. + * @param string $message Error message. + */ + protected function onProtocolError(CompositeConnectionInterface $connection, $message) + { + CommunicationException::handle( + new ProtocolException($connection, $message) + ); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/AbstractConsumer.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/AbstractConsumer.php new file mode 100755 index 00000000..d7423f1e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/AbstractConsumer.php @@ -0,0 +1,219 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\PubSub; + +/** + * Base implementation of a PUB/SUB consumer abstraction based on PHP iterators. + * + * @author Daniele Alessandri + */ +abstract class AbstractConsumer implements \Iterator +{ + const SUBSCRIBE = 'subscribe'; + const UNSUBSCRIBE = 'unsubscribe'; + const PSUBSCRIBE = 'psubscribe'; + const PUNSUBSCRIBE = 'punsubscribe'; + const MESSAGE = 'message'; + const PMESSAGE = 'pmessage'; + const PONG = 'pong'; + + const STATUS_VALID = 1; // 0b0001 + const STATUS_SUBSCRIBED = 2; // 0b0010 + const STATUS_PSUBSCRIBED = 4; // 0b0100 + + private $position = null; + private $statusFlags = self::STATUS_VALID; + + /** + * Automatically stops the consumer when the garbage collector kicks in. + */ + public function __destruct() + { + $this->stop(true); + } + + /** + * Checks if the specified flag is valid based on the state of the consumer. + * + * @param int $value Flag. + * + * @return bool + */ + protected function isFlagSet($value) + { + return ($this->statusFlags & $value) === $value; + } + + /** + * Subscribes to the specified channels. + * + * @param mixed $channel,... One or more channel names. + */ + public function subscribe($channel /*, ... */) + { + $this->writeRequest(self::SUBSCRIBE, func_get_args()); + $this->statusFlags |= self::STATUS_SUBSCRIBED; + } + + /** + * Unsubscribes from the specified channels. + * + * @param string ... One or more channel names. + */ + public function unsubscribe(/* ... */) + { + $this->writeRequest(self::UNSUBSCRIBE, func_get_args()); + } + + /** + * Subscribes to the specified channels using a pattern. + * + * @param mixed $pattern,... One or more channel name patterns. + */ + public function psubscribe($pattern /* ... */) + { + $this->writeRequest(self::PSUBSCRIBE, func_get_args()); + $this->statusFlags |= self::STATUS_PSUBSCRIBED; + } + + /** + * Unsubscribes from the specified channels using a pattern. + * + * @param string ... One or more channel name patterns. + */ + public function punsubscribe(/* ... */) + { + $this->writeRequest(self::PUNSUBSCRIBE, func_get_args()); + } + + /** + * PING the server with an optional payload that will be echoed as a + * PONG message in the pub/sub loop. + * + * @param string $payload Optional PING payload. + */ + public function ping($payload = null) + { + $this->writeRequest('PING', array($payload)); + } + + /** + * Closes the context by unsubscribing from all the subscribed channels. The + * context can be forcefully closed by dropping the underlying connection. + * + * @param bool $drop Indicates if the context should be closed by dropping the connection. + * + * @return bool Returns false when there are no pending messages. + */ + public function stop($drop = false) + { + if (!$this->valid()) { + return false; + } + + if ($drop) { + $this->invalidate(); + $this->disconnect(); + } else { + if ($this->isFlagSet(self::STATUS_SUBSCRIBED)) { + $this->unsubscribe(); + } + if ($this->isFlagSet(self::STATUS_PSUBSCRIBED)) { + $this->punsubscribe(); + } + } + + return !$drop; + } + + /** + * Closes the underlying connection when forcing a disconnection. + */ + abstract protected function disconnect(); + + /** + * Writes a Redis command on the underlying connection. + * + * @param string $method Command ID. + * @param array $arguments Arguments for the command. + */ + abstract protected function writeRequest($method, $arguments); + + /** + * {@inheritdoc} + */ + public function rewind() + { + // NOOP + } + + /** + * Returns the last message payload retrieved from the server and generated + * by one of the active subscriptions. + * + * @return array + */ + public function current() + { + return $this->getValue(); + } + + /** + * {@inheritdoc} + */ + public function key() + { + return $this->position; + } + + /** + * {@inheritdoc} + */ + public function next() + { + if ($this->valid()) { + ++$this->position; + } + + return $this->position; + } + + /** + * Checks if the the consumer is still in a valid state to continue. + * + * @return bool + */ + public function valid() + { + $isValid = $this->isFlagSet(self::STATUS_VALID); + $subscriptionFlags = self::STATUS_SUBSCRIBED | self::STATUS_PSUBSCRIBED; + $hasSubscriptions = ($this->statusFlags & $subscriptionFlags) > 0; + + return $isValid && $hasSubscriptions; + } + + /** + * Resets the state of the consumer. + */ + protected function invalidate() + { + $this->statusFlags = 0; // 0b0000; + } + + /** + * Waits for a new message from the server generated by one of the active + * subscriptions and returns it when available. + * + * @return array + */ + abstract protected function getValue(); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/Consumer.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/Consumer.php new file mode 100755 index 00000000..5f2d8a8b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/Consumer.php @@ -0,0 +1,158 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\PubSub; + +use Predis\ClientException; +use Predis\ClientInterface; +use Predis\Command\Command; +use Predis\Connection\AggregateConnectionInterface; +use Predis\NotSupportedException; + +/** + * PUB/SUB consumer abstraction. + * + * @author Daniele Alessandri + */ +class Consumer extends AbstractConsumer +{ + private $client; + private $options; + + /** + * @param ClientInterface $client Client instance used by the consumer. + * @param array $options Options for the consumer initialization. + */ + public function __construct(ClientInterface $client, array $options = null) + { + $this->checkCapabilities($client); + + $this->options = $options ?: array(); + $this->client = $client; + + $this->genericSubscribeInit('subscribe'); + $this->genericSubscribeInit('psubscribe'); + } + + /** + * Returns the underlying client instance used by the pub/sub iterator. + * + * @return ClientInterface + */ + public function getClient() + { + return $this->client; + } + + /** + * Checks if the client instance satisfies the required conditions needed to + * initialize a PUB/SUB consumer. + * + * @param ClientInterface $client Client instance used by the consumer. + * + * @throws NotSupportedException + */ + private function checkCapabilities(ClientInterface $client) + { + if ($client->getConnection() instanceof AggregateConnectionInterface) { + throw new NotSupportedException( + 'Cannot initialize a PUB/SUB consumer over aggregate connections.' + ); + } + + $commands = array('publish', 'subscribe', 'unsubscribe', 'psubscribe', 'punsubscribe'); + + if ($client->getProfile()->supportsCommands($commands) === false) { + throw new NotSupportedException( + 'The current profile does not support PUB/SUB related commands.' + ); + } + } + + /** + * This method shares the logic to handle both SUBSCRIBE and PSUBSCRIBE. + * + * @param string $subscribeAction Type of subscription. + */ + private function genericSubscribeInit($subscribeAction) + { + if (isset($this->options[$subscribeAction])) { + $this->$subscribeAction($this->options[$subscribeAction]); + } + } + + /** + * {@inheritdoc} + */ + protected function writeRequest($method, $arguments) + { + $this->client->getConnection()->writeRequest( + $this->client->createCommand($method, + Command::normalizeArguments($arguments) + ) + ); + } + + /** + * {@inheritdoc} + */ + protected function disconnect() + { + $this->client->disconnect(); + } + + /** + * {@inheritdoc} + */ + protected function getValue() + { + $response = $this->client->getConnection()->read(); + + switch ($response[0]) { + case self::SUBSCRIBE: + case self::UNSUBSCRIBE: + case self::PSUBSCRIBE: + case self::PUNSUBSCRIBE: + if ($response[2] === 0) { + $this->invalidate(); + } + // The missing break here is intentional as we must process + // subscriptions and unsubscriptions as standard messages. + // no break + + case self::MESSAGE: + return (object) array( + 'kind' => $response[0], + 'channel' => $response[1], + 'payload' => $response[2], + ); + + case self::PMESSAGE: + return (object) array( + 'kind' => $response[0], + 'pattern' => $response[1], + 'channel' => $response[2], + 'payload' => $response[3], + ); + + case self::PONG: + return (object) array( + 'kind' => $response[0], + 'payload' => $response[1], + ); + + default: + throw new ClientException( + "Unknown message type '{$response[0]}' received in the PUB/SUB context." + ); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/DispatcherLoop.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/DispatcherLoop.php new file mode 100755 index 00000000..0d4a08ef --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/DispatcherLoop.php @@ -0,0 +1,170 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\PubSub; + +/** + * Method-dispatcher loop built around the client-side abstraction of a Redis + * PUB / SUB context. + * + * @author Daniele Alessandri + */ +class DispatcherLoop +{ + private $pubsub; + + protected $callbacks; + protected $defaultCallback; + protected $subscriptionCallback; + + /** + * @param Consumer $pubsub PubSub consumer instance used by the loop. + */ + public function __construct(Consumer $pubsub) + { + $this->callbacks = array(); + $this->pubsub = $pubsub; + } + + /** + * Checks if the passed argument is a valid callback. + * + * @param mixed $callable A callback. + * + * @throws \InvalidArgumentException + */ + protected function assertCallback($callable) + { + if (!is_callable($callable)) { + throw new \InvalidArgumentException('The given argument must be a callable object.'); + } + } + + /** + * Returns the underlying PUB / SUB context. + * + * @return Consumer + */ + public function getPubSubConsumer() + { + return $this->pubsub; + } + + /** + * Sets a callback that gets invoked upon new subscriptions. + * + * @param mixed $callable A callback. + */ + public function subscriptionCallback($callable = null) + { + if (isset($callable)) { + $this->assertCallback($callable); + } + + $this->subscriptionCallback = $callable; + } + + /** + * Sets a callback that gets invoked when a message is received on a + * channel that does not have an associated callback. + * + * @param mixed $callable A callback. + */ + public function defaultCallback($callable = null) + { + if (isset($callable)) { + $this->assertCallback($callable); + } + + $this->subscriptionCallback = $callable; + } + + /** + * Binds a callback to a channel. + * + * @param string $channel Channel name. + * @param Callable $callback A callback. + */ + public function attachCallback($channel, $callback) + { + $callbackName = $this->getPrefixKeys().$channel; + + $this->assertCallback($callback); + $this->callbacks[$callbackName] = $callback; + $this->pubsub->subscribe($channel); + } + + /** + * Stops listening to a channel and removes the associated callback. + * + * @param string $channel Redis channel. + */ + public function detachCallback($channel) + { + $callbackName = $this->getPrefixKeys().$channel; + + if (isset($this->callbacks[$callbackName])) { + unset($this->callbacks[$callbackName]); + $this->pubsub->unsubscribe($channel); + } + } + + /** + * Starts the dispatcher loop. + */ + public function run() + { + foreach ($this->pubsub as $message) { + $kind = $message->kind; + + if ($kind !== Consumer::MESSAGE && $kind !== Consumer::PMESSAGE) { + if (isset($this->subscriptionCallback)) { + $callback = $this->subscriptionCallback; + call_user_func($callback, $message); + } + + continue; + } + + if (isset($this->callbacks[$message->channel])) { + $callback = $this->callbacks[$message->channel]; + call_user_func($callback, $message->payload); + } elseif (isset($this->defaultCallback)) { + $callback = $this->defaultCallback; + call_user_func($callback, $message); + } + } + } + + /** + * Terminates the dispatcher loop. + */ + public function stop() + { + $this->pubsub->stop(); + } + + /** + * Return the prefix used for keys. + * + * @return string + */ + protected function getPrefixKeys() + { + $options = $this->pubsub->getClient()->getOptions(); + + if (isset($options->prefix)) { + return $options->prefix->getPrefix(); + } + + return ''; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Replication/ReplicationStrategy.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Replication/ReplicationStrategy.php new file mode 100755 index 00000000..0b769405 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Replication/ReplicationStrategy.php @@ -0,0 +1,237 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Replication; + +use Predis\Command\CommandInterface; +use Predis\NotSupportedException; + +/** + * Defines a strategy for master/slave replication. + * + * @author Daniele Alessandri + */ +class ReplicationStrategy +{ + protected $disallowed; + protected $readonly; + protected $readonlySHA1; + + /** + * + */ + public function __construct() + { + $this->disallowed = $this->getDisallowedOperations(); + $this->readonly = $this->getReadOnlyOperations(); + $this->readonlySHA1 = array(); + } + + /** + * Returns if the specified command will perform a read-only operation + * on Redis or not. + * + * @param CommandInterface $command Command instance. + * + * @throws NotSupportedException + * + * @return bool + */ + public function isReadOperation(CommandInterface $command) + { + if (isset($this->disallowed[$id = $command->getId()])) { + throw new NotSupportedException( + "The command '$id' is not allowed in replication mode." + ); + } + + if (isset($this->readonly[$id])) { + if (true === $readonly = $this->readonly[$id]) { + return true; + } + + return call_user_func($readonly, $command); + } + + if (($eval = $id === 'EVAL') || $id === 'EVALSHA') { + $sha1 = $eval ? sha1($command->getArgument(0)) : $command->getArgument(0); + + if (isset($this->readonlySHA1[$sha1])) { + if (true === $readonly = $this->readonlySHA1[$sha1]) { + return true; + } + + return call_user_func($readonly, $command); + } + } + + return false; + } + + /** + * Returns if the specified command is not allowed for execution in a master + * / slave replication context. + * + * @param CommandInterface $command Command instance. + * + * @return bool + */ + public function isDisallowedOperation(CommandInterface $command) + { + return isset($this->disallowed[$command->getId()]); + } + + /** + * Checks if a SORT command is a readable operation by parsing the arguments + * array of the specified commad instance. + * + * @param CommandInterface $command Command instance. + * + * @return bool + */ + protected function isSortReadOnly(CommandInterface $command) + { + $arguments = $command->getArguments(); + + return ($c = count($arguments)) === 1 ? true : $arguments[$c - 2] !== 'STORE'; + } + + /** + * Marks a command as a read-only operation. + * + * When the behavior of a command can be decided only at runtime depending + * on its arguments, a callable object can be provided to dynamically check + * if the specified command performs a read or a write operation. + * + * @param string $commandID Command ID. + * @param mixed $readonly A boolean value or a callable object. + */ + public function setCommandReadOnly($commandID, $readonly = true) + { + $commandID = strtoupper($commandID); + + if ($readonly) { + $this->readonly[$commandID] = $readonly; + } else { + unset($this->readonly[$commandID]); + } + } + + /** + * Marks a Lua script for EVAL and EVALSHA as a read-only operation. When + * the behaviour of a script can be decided only at runtime depending on + * its arguments, a callable object can be provided to dynamically check + * if the passed instance of EVAL or EVALSHA performs write operations or + * not. + * + * @param string $script Body of the Lua script. + * @param mixed $readonly A boolean value or a callable object. + */ + public function setScriptReadOnly($script, $readonly = true) + { + $sha1 = sha1($script); + + if ($readonly) { + $this->readonlySHA1[$sha1] = $readonly; + } else { + unset($this->readonlySHA1[$sha1]); + } + } + + /** + * Returns the default list of disallowed commands. + * + * @return array + */ + protected function getDisallowedOperations() + { + return array( + 'SHUTDOWN' => true, + 'INFO' => true, + 'DBSIZE' => true, + 'LASTSAVE' => true, + 'CONFIG' => true, + 'MONITOR' => true, + 'SLAVEOF' => true, + 'SAVE' => true, + 'BGSAVE' => true, + 'BGREWRITEAOF' => true, + 'SLOWLOG' => true, + ); + } + + /** + * Returns the default list of commands performing read-only operations. + * + * @return array + */ + protected function getReadOnlyOperations() + { + return array( + 'EXISTS' => true, + 'TYPE' => true, + 'KEYS' => true, + 'SCAN' => true, + 'RANDOMKEY' => true, + 'TTL' => true, + 'GET' => true, + 'MGET' => true, + 'SUBSTR' => true, + 'STRLEN' => true, + 'GETRANGE' => true, + 'GETBIT' => true, + 'LLEN' => true, + 'LRANGE' => true, + 'LINDEX' => true, + 'SCARD' => true, + 'SISMEMBER' => true, + 'SINTER' => true, + 'SUNION' => true, + 'SDIFF' => true, + 'SMEMBERS' => true, + 'SSCAN' => true, + 'SRANDMEMBER' => true, + 'ZRANGE' => true, + 'ZREVRANGE' => true, + 'ZRANGEBYSCORE' => true, + 'ZREVRANGEBYSCORE' => true, + 'ZCARD' => true, + 'ZSCORE' => true, + 'ZCOUNT' => true, + 'ZRANK' => true, + 'ZREVRANK' => true, + 'ZSCAN' => true, + 'ZLEXCOUNT' => true, + 'ZRANGEBYLEX' => true, + 'ZREVRANGEBYLEX' => true, + 'HGET' => true, + 'HMGET' => true, + 'HEXISTS' => true, + 'HLEN' => true, + 'HKEYS' => true, + 'HVALS' => true, + 'HGETALL' => true, + 'HSCAN' => true, + 'HSTRLEN' => true, + 'PING' => true, + 'AUTH' => true, + 'SELECT' => true, + 'ECHO' => true, + 'QUIT' => true, + 'OBJECT' => true, + 'BITCOUNT' => true, + 'BITPOS' => true, + 'TIME' => true, + 'PFCOUNT' => true, + 'SORT' => array($this, 'isSortReadOnly'), + ); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Error.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Error.php new file mode 100755 index 00000000..3933857e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Error.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Response; + +/** + * Represents an error returned by Redis (-ERR responses) during the execution + * of a command on the server. + * + * @author Daniele Alessandri + */ +class Error implements ErrorInterface +{ + private $message; + + /** + * @param string $message Error message returned by Redis + */ + public function __construct($message) + { + $this->message = $message; + } + + /** + * {@inheritdoc} + */ + public function getMessage() + { + return $this->message; + } + + /** + * {@inheritdoc} + */ + public function getErrorType() + { + list($errorType) = explode(' ', $this->getMessage(), 2); + + return $errorType; + } + + /** + * Converts the object to its string representation. + * + * @return string + */ + public function __toString() + { + return $this->getMessage(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ErrorInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ErrorInterface.php new file mode 100755 index 00000000..a4a4a02f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ErrorInterface.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Response; + +/** + * Represents an error returned by Redis (responses identified by "-" in the + * Redis protocol) during the execution of an operation on the server. + * + * @author Daniele Alessandri + */ +interface ErrorInterface extends ResponseInterface +{ + /** + * Returns the error message. + * + * @return string + */ + public function getMessage(); + + /** + * Returns the error type (e.g. ERR, ASK, MOVED). + * + * @return string + */ + public function getErrorType(); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulk.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulk.php new file mode 100755 index 00000000..b1d29241 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulk.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Response\Iterator; + +use Predis\Connection\NodeConnectionInterface; + +/** + * Streamable multibulk response. + * + * @author Daniele Alessandri + */ +class MultiBulk extends MultiBulkIterator +{ + private $connection; + + /** + * @param NodeConnectionInterface $connection Connection to Redis. + * @param int $size Number of elements of the multibulk response. + */ + public function __construct(NodeConnectionInterface $connection, $size) + { + $this->connection = $connection; + $this->size = $size; + $this->position = 0; + $this->current = $size > 0 ? $this->getValue() : null; + } + + /** + * Handles the synchronization of the client with the Redis protocol when + * the garbage collector kicks in (e.g. when the iterator goes out of the + * scope of a foreach or it is unset). + */ + public function __destruct() + { + $this->drop(true); + } + + /** + * Drop queued elements that have not been read from the connection either + * by consuming the rest of the multibulk response or quickly by closing the + * underlying connection. + * + * @param bool $disconnect Consume the iterator or drop the connection. + */ + public function drop($disconnect = false) + { + if ($disconnect) { + if ($this->valid()) { + $this->position = $this->size; + $this->connection->disconnect(); + } + } else { + while ($this->valid()) { + $this->next(); + } + } + } + + /** + * Reads the next item of the multibulk response from the connection. + * + * @return mixed + */ + protected function getValue() + { + return $this->connection->read(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulkIterator.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulkIterator.php new file mode 100755 index 00000000..5d328869 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulkIterator.php @@ -0,0 +1,104 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Response\Iterator; + +use Predis\Response\ResponseInterface; + +/** + * Iterator that abstracts the access to multibulk responses allowing them to be + * consumed in a streamable fashion without keeping the whole payload in memory. + * + * This iterator does not support rewinding which means that the iteration, once + * consumed, cannot be restarted. + * + * Always make sure that the whole iteration is consumed (or dropped) to prevent + * protocol desynchronization issues. + * + * @author Daniele Alessandri + */ +abstract class MultiBulkIterator implements \Iterator, \Countable, ResponseInterface +{ + protected $current; + protected $position; + protected $size; + + /** + * {@inheritdoc} + */ + public function rewind() + { + // NOOP + } + + /** + * {@inheritdoc} + */ + public function current() + { + return $this->current; + } + + /** + * {@inheritdoc} + */ + public function key() + { + return $this->position; + } + + /** + * {@inheritdoc} + */ + public function next() + { + if (++$this->position < $this->size) { + $this->current = $this->getValue(); + } + } + + /** + * {@inheritdoc} + */ + public function valid() + { + return $this->position < $this->size; + } + + /** + * Returns the number of items comprising the whole multibulk response. + * + * This method should be used instead of iterator_count() to get the size of + * the current multibulk response since the former consumes the iteration to + * count the number of elements, but our iterators do not support rewinding. + * + * @return int + */ + public function count() + { + return $this->size; + } + + /** + * Returns the current position of the iterator. + * + * @return int + */ + public function getPosition() + { + return $this->position; + } + + /** + * {@inheritdoc} + */ + abstract protected function getValue(); +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulkTuple.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulkTuple.php new file mode 100755 index 00000000..2b6f593c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulkTuple.php @@ -0,0 +1,90 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Response\Iterator; + +/** + * Outer iterator consuming streamable multibulk responses by yielding tuples of + * keys and values. + * + * This wrapper is useful for responses to commands such as `HGETALL` that can + * be iterater as $key => $value pairs. + * + * @author Daniele Alessandri + */ +class MultiBulkTuple extends MultiBulk implements \OuterIterator +{ + private $iterator; + + /** + * @param MultiBulk $iterator Inner multibulk response iterator. + */ + public function __construct(MultiBulk $iterator) + { + $this->checkPreconditions($iterator); + + $this->size = count($iterator) / 2; + $this->iterator = $iterator; + $this->position = $iterator->getPosition(); + $this->current = $this->size > 0 ? $this->getValue() : null; + } + + /** + * Checks for valid preconditions. + * + * @param MultiBulk $iterator Inner multibulk response iterator. + * + * @throws \InvalidArgumentException + * @throws \UnexpectedValueException + */ + protected function checkPreconditions(MultiBulk $iterator) + { + if ($iterator->getPosition() !== 0) { + throw new \InvalidArgumentException( + 'Cannot initialize a tuple iterator using an already initiated iterator.' + ); + } + + if (($size = count($iterator)) % 2 !== 0) { + throw new \UnexpectedValueException('Invalid response size for a tuple iterator.'); + } + } + + /** + * {@inheritdoc} + */ + public function getInnerIterator() + { + return $this->iterator; + } + + /** + * {@inheritdoc} + */ + public function __destruct() + { + $this->iterator->drop(true); + } + + /** + * {@inheritdoc} + */ + protected function getValue() + { + $k = $this->iterator->current(); + $this->iterator->next(); + + $v = $this->iterator->current(); + $this->iterator->next(); + + return array($k, $v); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ResponseInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ResponseInterface.php new file mode 100755 index 00000000..0af13574 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ResponseInterface.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Response; + +/** + * Represents a complex response object from Redis. + * + * @author Daniele Alessandri + */ +interface ResponseInterface +{ +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ServerException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ServerException.php new file mode 100755 index 00000000..407dc5b7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ServerException.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Response; + +use Predis\PredisException; + +/** + * Exception class that identifies server-side Redis errors. + * + * @author Daniele Alessandri + */ +class ServerException extends PredisException implements ErrorInterface +{ + /** + * Gets the type of the error returned by Redis. + * + * @return string + */ + public function getErrorType() + { + list($errorType) = explode(' ', $this->getMessage(), 2); + + return $errorType; + } + + /** + * Converts the exception to an instance of Predis\Response\Error. + * + * @return Error + */ + public function toErrorResponse() + { + return new Error($this->getMessage()); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Status.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Status.php new file mode 100755 index 00000000..729bb663 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Status.php @@ -0,0 +1,79 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Response; + +/** + * Represents a status response returned by Redis. + * + * @author Daniele Alessandri + */ +class Status implements ResponseInterface +{ + private static $OK; + private static $QUEUED; + + private $payload; + + /** + * @param string $payload Payload of the status response as returned by Redis. + */ + public function __construct($payload) + { + $this->payload = $payload; + } + + /** + * Converts the response object to its string representation. + * + * @return string + */ + public function __toString() + { + return $this->payload; + } + + /** + * Returns the payload of status response. + * + * @return string + */ + public function getPayload() + { + return $this->payload; + } + + /** + * Returns an instance of a status response object. + * + * Common status responses such as OK or QUEUED are cached in order to lower + * the global memory usage especially when using pipelines. + * + * @param string $payload Status response payload. + * + * @return string + */ + public static function get($payload) + { + switch ($payload) { + case 'OK': + case 'QUEUED': + if (isset(self::$$payload)) { + return self::$$payload; + } + + return self::$$payload = new self($payload); + + default: + return new self($payload); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Session/Handler.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Session/Handler.php new file mode 100755 index 00000000..cecb9d53 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Session/Handler.php @@ -0,0 +1,142 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Session; + +use Predis\ClientInterface; + +/** + * Session handler class that relies on Predis\Client to store PHP's sessions + * data into one or multiple Redis servers. + * + * This class is mostly intended for PHP 5.4 but it can be used under PHP 5.3 + * provided that a polyfill for `SessionHandlerInterface` is defined by either + * you or an external package such as `symfony/http-foundation`. + * + * @author Daniele Alessandri + */ +class Handler implements \SessionHandlerInterface +{ + protected $client; + protected $ttl; + + /** + * @param ClientInterface $client Fully initialized client instance. + * @param array $options Session handler options. + */ + public function __construct(ClientInterface $client, array $options = array()) + { + $this->client = $client; + + if (isset($options['gc_maxlifetime'])) { + $this->ttl = (int) $options['gc_maxlifetime']; + } else { + $this->ttl = ini_get('session.gc_maxlifetime'); + } + } + + /** + * Registers this instance as the current session handler. + */ + public function register() + { + if (PHP_VERSION_ID >= 50400) { + session_set_save_handler($this, true); + } else { + session_set_save_handler( + array($this, 'open'), + array($this, 'close'), + array($this, 'read'), + array($this, 'write'), + array($this, 'destroy'), + array($this, 'gc') + ); + } + } + + /** + * {@inheritdoc} + */ + public function open($save_path, $session_id) + { + // NOOP + return true; + } + + /** + * {@inheritdoc} + */ + public function close() + { + // NOOP + return true; + } + + /** + * {@inheritdoc} + */ + public function gc($maxlifetime) + { + // NOOP + return true; + } + + /** + * {@inheritdoc} + */ + public function read($session_id) + { + if ($data = $this->client->get($session_id)) { + return $data; + } + + return ''; + } + /** + * {@inheritdoc} + */ + public function write($session_id, $session_data) + { + $this->client->setex($session_id, $this->ttl, $session_data); + + return true; + } + + /** + * {@inheritdoc} + */ + public function destroy($session_id) + { + $this->client->del($session_id); + + return true; + } + + /** + * Returns the underlying client instance. + * + * @return ClientInterface + */ + public function getClient() + { + return $this->client; + } + + /** + * Returns the session max lifetime value. + * + * @return int + */ + public function getMaxLifeTime() + { + return $this->ttl; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/AbortedMultiExecException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/AbortedMultiExecException.php new file mode 100755 index 00000000..b36f38aa --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/AbortedMultiExecException.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Transaction; + +use Predis\PredisException; + +/** + * Exception class that identifies a MULTI / EXEC transaction aborted by Redis. + * + * @author Daniele Alessandri + */ +class AbortedMultiExecException extends PredisException +{ + private $transaction; + + /** + * @param MultiExec $transaction Transaction that generated the exception. + * @param string $message Error message. + * @param int $code Error code. + */ + public function __construct(MultiExec $transaction, $message, $code = null) + { + parent::__construct($message, $code); + $this->transaction = $transaction; + } + + /** + * Returns the transaction that generated the exception. + * + * @return MultiExec + */ + public function getTransaction() + { + return $this->transaction; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/MultiExec.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/MultiExec.php new file mode 100755 index 00000000..0cf1962d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/MultiExec.php @@ -0,0 +1,461 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Transaction; + +use Predis\ClientContextInterface; +use Predis\ClientException; +use Predis\ClientInterface; +use Predis\Command\CommandInterface; +use Predis\CommunicationException; +use Predis\Connection\AggregateConnectionInterface; +use Predis\NotSupportedException; +use Predis\Protocol\ProtocolException; +use Predis\Response\ErrorInterface as ErrorResponseInterface; +use Predis\Response\ServerException; +use Predis\Response\Status as StatusResponse; + +/** + * Client-side abstraction of a Redis transaction based on MULTI / EXEC. + * + * {@inheritdoc} + * + * @author Daniele Alessandri + */ +class MultiExec implements ClientContextInterface +{ + private $state; + + protected $client; + protected $commands; + protected $exceptions = true; + protected $attempts = 0; + protected $watchKeys = array(); + protected $modeCAS = false; + + /** + * @param ClientInterface $client Client instance used by the transaction. + * @param array $options Initialization options. + */ + public function __construct(ClientInterface $client, array $options = null) + { + $this->assertClient($client); + + $this->client = $client; + $this->state = new MultiExecState(); + + $this->configure($client, $options ?: array()); + $this->reset(); + } + + /** + * Checks if the passed client instance satisfies the required conditions + * needed to initialize the transaction object. + * + * @param ClientInterface $client Client instance used by the transaction object. + * + * @throws NotSupportedException + */ + private function assertClient(ClientInterface $client) + { + if ($client->getConnection() instanceof AggregateConnectionInterface) { + throw new NotSupportedException( + 'Cannot initialize a MULTI/EXEC transaction over aggregate connections.' + ); + } + + if (!$client->getProfile()->supportsCommands(array('MULTI', 'EXEC', 'DISCARD'))) { + throw new NotSupportedException( + 'The current profile does not support MULTI, EXEC and DISCARD.' + ); + } + } + + /** + * Configures the transaction using the provided options. + * + * @param ClientInterface $client Underlying client instance. + * @param array $options Array of options for the transaction. + **/ + protected function configure(ClientInterface $client, array $options) + { + if (isset($options['exceptions'])) { + $this->exceptions = (bool) $options['exceptions']; + } else { + $this->exceptions = $client->getOptions()->exceptions; + } + + if (isset($options['cas'])) { + $this->modeCAS = (bool) $options['cas']; + } + + if (isset($options['watch']) && $keys = $options['watch']) { + $this->watchKeys = $keys; + } + + if (isset($options['retry'])) { + $this->attempts = (int) $options['retry']; + } + } + + /** + * Resets the state of the transaction. + */ + protected function reset() + { + $this->state->reset(); + $this->commands = new \SplQueue(); + } + + /** + * Initializes the transaction context. + */ + protected function initialize() + { + if ($this->state->isInitialized()) { + return; + } + + if ($this->modeCAS) { + $this->state->flag(MultiExecState::CAS); + } + + if ($this->watchKeys) { + $this->watch($this->watchKeys); + } + + $cas = $this->state->isCAS(); + $discarded = $this->state->isDiscarded(); + + if (!$cas || ($cas && $discarded)) { + $this->call('MULTI'); + + if ($discarded) { + $this->state->unflag(MultiExecState::CAS); + } + } + + $this->state->unflag(MultiExecState::DISCARDED); + $this->state->flag(MultiExecState::INITIALIZED); + } + + /** + * Dynamically invokes a Redis command with the specified arguments. + * + * @param string $method Command ID. + * @param array $arguments Arguments for the command. + * + * @return mixed + */ + public function __call($method, $arguments) + { + return $this->executeCommand( + $this->client->createCommand($method, $arguments) + ); + } + + /** + * Executes a Redis command bypassing the transaction logic. + * + * @param string $commandID Command ID. + * @param array $arguments Arguments for the command. + * + * @throws ServerException + * + * @return mixed + */ + protected function call($commandID, array $arguments = array()) + { + $response = $this->client->executeCommand( + $this->client->createCommand($commandID, $arguments) + ); + + if ($response instanceof ErrorResponseInterface) { + throw new ServerException($response->getMessage()); + } + + return $response; + } + + /** + * Executes the specified Redis command. + * + * @param CommandInterface $command Command instance. + * + * @throws AbortedMultiExecException + * @throws CommunicationException + * + * @return $this|mixed + */ + public function executeCommand(CommandInterface $command) + { + $this->initialize(); + + if ($this->state->isCAS()) { + return $this->client->executeCommand($command); + } + + $response = $this->client->getConnection()->executeCommand($command); + + if ($response instanceof StatusResponse && $response == 'QUEUED') { + $this->commands->enqueue($command); + } elseif ($response instanceof ErrorResponseInterface) { + throw new AbortedMultiExecException($this, $response->getMessage()); + } else { + $this->onProtocolError('The server did not return a +QUEUED status response.'); + } + + return $this; + } + + /** + * Executes WATCH against one or more keys. + * + * @param string|array $keys One or more keys. + * + * @throws NotSupportedException + * @throws ClientException + * + * @return mixed + */ + public function watch($keys) + { + if (!$this->client->getProfile()->supportsCommand('WATCH')) { + throw new NotSupportedException('WATCH is not supported by the current profile.'); + } + + if ($this->state->isWatchAllowed()) { + throw new ClientException('Sending WATCH after MULTI is not allowed.'); + } + + $response = $this->call('WATCH', is_array($keys) ? $keys : array($keys)); + $this->state->flag(MultiExecState::WATCH); + + return $response; + } + + /** + * Finalizes the transaction by executing MULTI on the server. + * + * @return MultiExec + */ + public function multi() + { + if ($this->state->check(MultiExecState::INITIALIZED | MultiExecState::CAS)) { + $this->state->unflag(MultiExecState::CAS); + $this->call('MULTI'); + } else { + $this->initialize(); + } + + return $this; + } + + /** + * Executes UNWATCH. + * + * @throws NotSupportedException + * + * @return MultiExec + */ + public function unwatch() + { + if (!$this->client->getProfile()->supportsCommand('UNWATCH')) { + throw new NotSupportedException( + 'UNWATCH is not supported by the current profile.' + ); + } + + $this->state->unflag(MultiExecState::WATCH); + $this->__call('UNWATCH', array()); + + return $this; + } + + /** + * Resets the transaction by UNWATCH-ing the keys that are being WATCHed and + * DISCARD-ing pending commands that have been already sent to the server. + * + * @return MultiExec + */ + public function discard() + { + if ($this->state->isInitialized()) { + $this->call($this->state->isCAS() ? 'UNWATCH' : 'DISCARD'); + + $this->reset(); + $this->state->flag(MultiExecState::DISCARDED); + } + + return $this; + } + + /** + * Executes the whole transaction. + * + * @return mixed + */ + public function exec() + { + return $this->execute(); + } + + /** + * Checks the state of the transaction before execution. + * + * @param mixed $callable Callback for execution. + * + * @throws \InvalidArgumentException + * @throws ClientException + */ + private function checkBeforeExecution($callable) + { + if ($this->state->isExecuting()) { + throw new ClientException( + 'Cannot invoke "execute" or "exec" inside an active transaction context.' + ); + } + + if ($callable) { + if (!is_callable($callable)) { + throw new \InvalidArgumentException('The argument must be a callable object.'); + } + + if (!$this->commands->isEmpty()) { + $this->discard(); + + throw new ClientException( + 'Cannot execute a transaction block after using fluent interface.' + ); + } + } elseif ($this->attempts) { + $this->discard(); + + throw new ClientException( + 'Automatic retries are supported only when a callable block is provided.' + ); + } + } + + /** + * Handles the actual execution of the whole transaction. + * + * @param mixed $callable Optional callback for execution. + * + * @throws CommunicationException + * @throws AbortedMultiExecException + * @throws ServerException + * + * @return array + */ + public function execute($callable = null) + { + $this->checkBeforeExecution($callable); + + $execResponse = null; + $attempts = $this->attempts; + + do { + if ($callable) { + $this->executeTransactionBlock($callable); + } + + if ($this->commands->isEmpty()) { + if ($this->state->isWatching()) { + $this->discard(); + } + + return; + } + + $execResponse = $this->call('EXEC'); + + if ($execResponse === null) { + if ($attempts === 0) { + throw new AbortedMultiExecException( + $this, 'The current transaction has been aborted by the server.' + ); + } + + $this->reset(); + + continue; + } + + break; + } while ($attempts-- > 0); + + $response = array(); + $commands = $this->commands; + $size = count($execResponse); + + if ($size !== count($commands)) { + $this->onProtocolError('EXEC returned an unexpected number of response items.'); + } + + for ($i = 0; $i < $size; ++$i) { + $cmdResponse = $execResponse[$i]; + + if ($cmdResponse instanceof ErrorResponseInterface && $this->exceptions) { + throw new ServerException($cmdResponse->getMessage()); + } + + $response[$i] = $commands->dequeue()->parseResponse($cmdResponse); + } + + return $response; + } + + /** + * Passes the current transaction object to a callable block for execution. + * + * @param mixed $callable Callback. + * + * @throws CommunicationException + * @throws ServerException + */ + protected function executeTransactionBlock($callable) + { + $exception = null; + $this->state->flag(MultiExecState::INSIDEBLOCK); + + try { + call_user_func($callable, $this); + } catch (CommunicationException $exception) { + // NOOP + } catch (ServerException $exception) { + // NOOP + } catch (\Exception $exception) { + $this->discard(); + } + + $this->state->unflag(MultiExecState::INSIDEBLOCK); + + if ($exception) { + throw $exception; + } + } + + /** + * Helper method for protocol errors encountered inside the transaction. + * + * @param string $message Error message. + */ + private function onProtocolError($message) + { + // Since a MULTI/EXEC block cannot be initialized when using aggregate + // connections we can safely assume that Predis\Client::getConnection() + // will return a Predis\Connection\NodeConnectionInterface instance. + CommunicationException::handle(new ProtocolException( + $this->client->getConnection(), $message + )); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/MultiExecState.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/MultiExecState.php new file mode 100755 index 00000000..a0a82852 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/MultiExecState.php @@ -0,0 +1,166 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Transaction; + +/** + * Utility class used to track the state of a MULTI / EXEC transaction. + * + * @author Daniele Alessandri + */ +class MultiExecState +{ + const INITIALIZED = 1; // 0b00001 + const INSIDEBLOCK = 2; // 0b00010 + const DISCARDED = 4; // 0b00100 + const CAS = 8; // 0b01000 + const WATCH = 16; // 0b10000 + + private $flags; + + /** + * + */ + public function __construct() + { + $this->flags = 0; + } + + /** + * Sets the internal state flags. + * + * @param int $flags Set of flags + */ + public function set($flags) + { + $this->flags = $flags; + } + + /** + * Gets the internal state flags. + * + * @return int + */ + public function get() + { + return $this->flags; + } + + /** + * Sets one or more flags. + * + * @param int $flags Set of flags + */ + public function flag($flags) + { + $this->flags |= $flags; + } + + /** + * Resets one or more flags. + * + * @param int $flags Set of flags + */ + public function unflag($flags) + { + $this->flags &= ~$flags; + } + + /** + * Returns if the specified flag or set of flags is set. + * + * @param int $flags Flag + * + * @return bool + */ + public function check($flags) + { + return ($this->flags & $flags) === $flags; + } + + /** + * Resets the state of a transaction. + */ + public function reset() + { + $this->flags = 0; + } + + /** + * Returns the state of the RESET flag. + * + * @return bool + */ + public function isReset() + { + return $this->flags === 0; + } + + /** + * Returns the state of the INITIALIZED flag. + * + * @return bool + */ + public function isInitialized() + { + return $this->check(self::INITIALIZED); + } + + /** + * Returns the state of the INSIDEBLOCK flag. + * + * @return bool + */ + public function isExecuting() + { + return $this->check(self::INSIDEBLOCK); + } + + /** + * Returns the state of the CAS flag. + * + * @return bool + */ + public function isCAS() + { + return $this->check(self::CAS); + } + + /** + * Returns if WATCH is allowed in the current state. + * + * @return bool + */ + public function isWatchAllowed() + { + return $this->check(self::INITIALIZED) && !$this->check(self::CAS); + } + + /** + * Returns the state of the WATCH flag. + * + * @return bool + */ + public function isWatching() + { + return $this->check(self::WATCH); + } + + /** + * Returns the state of the DISCARDED flag. + * + * @return bool + */ + public function isDiscarded() + { + return $this->check(self::DISCARDED); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Actions.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Actions.php new file mode 100755 index 00000000..2ae8e10d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Actions.php @@ -0,0 +1,10269 @@ +aCurrentActionParams = array(); + + $this->oHttp = null; + $this->oLogger = null; + $this->oPlugins = null; + $this->oMailClient = null; + $this->oSocial = null; + $this->oConfig = null; + $this->aCachers = array(); + + $this->oStorageProvider = null; + $this->oLocalStorageProvider = null; + $this->oSettingsProvider = null; + $this->oLocalSettingsProvider = null; + $this->oFilesProvider = null; + $this->oFiltersProvider = null; + $this->oDomainProvider = null; + $this->oAddressBookProvider = null; + $this->oSuggestionsProvider = null; + $this->oChangePasswordProvider = null; + $this->oTwoFactorAuthProvider = null; + $this->oPremProvider = null; + + $this->sSpecAuthToken = ''; + + $oConfig = $this->Config(); + $this->Plugins()->RunHook('filter.application-config', array(&$oConfig)); + + $this->Logger()->Ping(); + } + + /** + * @return \RainLoop\Actions + */ + public static function NewInstance() + { + return new self(); + } + + /** + * @param string $sSpecAuthToken + * + * @return \RainLoop\Application + */ + public function SetSpecAuthToken($sSpecAuthToken) + { + $this->sSpecAuthToken = $sSpecAuthToken; + + return $this; + } + + /** + * @return string + */ + public function GetSpecAuthToken() + { + return $this->sSpecAuthToken; + } + + /** + * @return string + */ + public function GetShortLifeSpecAuthToken($iLife = 60) + { + $aAccountHash = \RainLoop\Utils::DecodeKeyValues($this->getLocalAuthToken()); + if (!empty($aAccountHash[0]) && 'token' === $aAccountHash[0] && \is_array($aAccountHash)) + { + $aAccountHash[10] = \time() + $iLife; + return \RainLoop\Utils::EncodeKeyValues($aAccountHash); + } + + return ''; + } + + /** + * @return \RainLoop\Application + */ + public function Config() + { + if (null === $this->oConfig) + { + $this->oConfig = new \RainLoop\Config\Application(); + if (!$this->oConfig->Load()) + { + usleep(10000); + $this->oConfig->Load(); + } + +// if (!$bLoaded && !$this->oConfig->IsFileExists()) +// { +// $bSave = true; +// } +// +// if ($bLoaded && !$bSave) +// { +// $bSave = APP_VERSION !== $this->oConfig->Get('version', 'current'); +// } +// +// if ($bSave) +// { +// $this->oConfig->Save(); +// } + } + + return $this->oConfig; + } + + /** + * @param string $sName + * @param \RainLoop\Model\Account $oAccount = null + * + * @return mixed + */ + private function fabrica($sName, $oAccount = null) + { + $mResult = null; + $this->Plugins() + ->RunHook('main.fabrica', array($sName, &$mResult), false) + ->RunHook('main.fabrica[2]', array($sName, &$mResult, $oAccount), false) + ; + + if (null === $mResult) + { + switch ($sName) + { + case 'files': + // RainLoop\Providers\Files\IFiles + $mResult = new \RainLoop\Providers\Files\FileStorage(APP_PRIVATE_DATA.'storage/files'); + break; + case 'storage': + case 'storage-local': + // RainLoop\Providers\Storage\IStorage + $mResult = new \RainLoop\Providers\Storage\FileStorage( + APP_PRIVATE_DATA.'storage', 'storage-local' === $sName); + break; + case 'settings': + case 'settings-local': + // RainLoop\Providers\Settings\ISettings + $mResult = new \RainLoop\Providers\Settings\DefaultSettings( + $this->StorageProvider('settings-local' === $sName)); + break; + case 'login': + // \RainLoop\Providers\Login\LoginInterface + $mResult = new \RainLoop\Providers\Login\DefaultLogin(); + break; + case 'domain': + // \RainLoop\Providers\Domain\DomainAdminInterface + $mResult = new \RainLoop\Providers\Domain\DefaultDomain(APP_PRIVATE_DATA.'domains', $this->Cacher()); + break; + case 'filters': + // \RainLoop\Providers\Filters\FiltersInterface + $mResult = new \RainLoop\Providers\Filters\SieveStorage( + $this->Plugins(), $this->Config() + ); + break; + case 'address-book': + // \RainLoop\Providers\AddressBook\AddressBookInterface + + $sDsn = \trim($this->Config()->Get('contacts', 'pdo_dsn', '')); + $sUser = \trim($this->Config()->Get('contacts', 'pdo_user', '')); + $sPassword = (string) $this->Config()->Get('contacts', 'pdo_password', ''); + + $sDsnType = $this->ValidateContactPdoType(\trim($this->Config()->Get('contacts', 'type', 'sqlite'))); + if ('sqlite' === $sDsnType) + { + $mResult = new \RainLoop\Providers\AddressBook\PdoAddressBook( + 'sqlite:'.APP_PRIVATE_DATA.'AddressBook.sqlite', '', '', 'sqlite'); + } + else + { + $mResult = new \RainLoop\Providers\AddressBook\PdoAddressBook($sDsn, $sUser, $sPassword, $sDsnType); + } + break; + case 'suggestions': + + if (null === $mResult) + { + $mResult = array(); + } + + if (\is_array($mResult) && \RainLoop\Utils::IsOwnCloud() && $this->Config()->Get('labs', 'owncloud_suggestions', true)) + { + // \RainLoop\Providers\Suggestions\ISuggestions + $mResult[] = new \RainLoop\Providers\Suggestions\OwnCloudSuggestions(); + } + + break; + case 'change-password': + // \RainLoop\Providers\ChangePassword\ChangePasswordInterface + break; + case 'two-factor-auth': + // \RainLoop\Providers\TwoFactorAuth\TwoFactorAuthInterface + $mResult = new \RainLoop\Providers\TwoFactorAuth\GoogleTwoFactorAuth(); + break; + } + } + + foreach (\is_array($mResult) ? $mResult : array($mResult) as $oItem) + { + if ($oItem && \method_exists($oItem, 'SetLogger')) + { + $oItem->SetLogger($this->Logger()); + } + } + + $this->Plugins()->RunHook('filter.fabrica', array($sName, &$mResult, $oAccount), false); + + return $mResult; + } + + /** + * @return void + */ + public function BootStart() + { + if (defined('APP_INSTALLED_START') && defined('APP_INSTALLED_VERSION') && + APP_INSTALLED_START && !APP_INSTALLED_VERSION) + { + try + { + $this->KeenIO('Install'); + } + catch (\Exception $oException) { unset($oException); } + } + } + + /** + * @return void + */ + public function BootEnd() + { + try + { + if ($this->MailClient()->IsLoggined()) + { + $this->MailClient()->LogoutAndDisconnect(); + } + } + catch (\Exception $oException) { unset($oException); } + } + + /** + * @return string + */ + public function ParseQueryAuthString() + { + $sQuery = \trim($this->Http()->GetQueryString()); + + $iPos = \strpos($sQuery, '&'); + if (0 < $iPos) + { + $sQuery = \substr($sQuery, 0, $iPos); + } + + $sQuery = \trim(\trim($sQuery), ' /'); + + $aSubQuery = $this->Http()->GetQuery('q', null); + if (\is_array($aSubQuery)) + { + $aSubQuery = \array_map(function ($sS) { + return \trim(\trim($sS), ' /'); + }, $aSubQuery); + + if (0 < \count($aSubQuery)) + { + $sQuery .= '/'.\implode('/', $aSubQuery); + } + } + + if ('' === $this->GetSpecAuthToken()) + { + $aPaths = \explode('/', $sQuery); + if (!empty($aPaths[0]) && !empty($aPaths[1]) && '_' === substr($aPaths[1], 0, 1)) + { + $this->SetSpecAuthToken($aPaths[1]); + } + } + + return $sQuery; + } + + /** + * @param string $sLine + * @param \RainLoop\Model\Account $oAccount = null + * @param bool $bUrlEncode = false + * @param array $aAdditionalParams = array() + * + * @return string + */ + private function compileLogParams($sLine, $oAccount = null, $bUrlEncode = false, $aAdditionalParams = array()) + { + $aClear = array(); + + if (false !== \strpos($sLine, '{date:')) + { + $sTimeOffset = (string) $this->Config()->Get('logs', 'time_offset', '0'); + $sLine = \preg_replace_callback('/\{date:([^}]+)\}/', function ($aMatch) use ($sTimeOffset, $bUrlEncode) { + return \RainLoop\Utils::UrlEncode(\MailSo\Log\Logger::DateHelper($aMatch[1], $sTimeOffset), $bUrlEncode); + }, $sLine); + + $aClear['/\{date:([^}]*)\}/'] = 'date'; + } + + if (false !== \strpos($sLine, '{imap:') || false !== \strpos($sLine, '{smtp:')) + { + if (!$oAccount) + { + $this->ParseQueryAuthString(); + $oAccount = $this->getAccountFromToken(false); + } + + if ($oAccount) + { + $sLine = \str_replace('{imap:login}', \RainLoop\Utils::UrlEncode($oAccount->IncLogin(), $bUrlEncode), $sLine); + $sLine = \str_replace('{imap:host}', \RainLoop\Utils::UrlEncode($oAccount->DomainIncHost(), $bUrlEncode), $sLine); + $sLine = \str_replace('{imap:port}', \RainLoop\Utils::UrlEncode($oAccount->DomainIncPort(), $bUrlEncode), $sLine); + + $sLine = \str_replace('{smtp:login}', \RainLoop\Utils::UrlEncode($oAccount->OutLogin(), $bUrlEncode), $sLine); + $sLine = \str_replace('{smtp:host}', \RainLoop\Utils::UrlEncode($oAccount->DomainOutHost(), $bUrlEncode), $sLine); + $sLine = \str_replace('{smtp:port}', \RainLoop\Utils::UrlEncode($oAccount->DomainOutPort(), $bUrlEncode), $sLine); + } + + $aClear['/\{imap:([^}]*)\}/i'] = 'imap'; + $aClear['/\{smtp:([^}]*)\}/i'] = 'smtp'; + } + + if (false !== \strpos($sLine, '{request:')) + { + if (false !== \strpos($sLine, '{request:ip}')) + { + $sLine = \str_replace('{request:ip}', \RainLoop\Utils::UrlEncode($this->Http()->GetClientIp( + $this->Config()->Get('labs', 'http_client_ip_check_proxy', false)), $bUrlEncode), $sLine); + } + + if (false !== \strpos($sLine, '{request:domain}')) + { + $sLine = \str_replace('{request:domain}', + \RainLoop\Utils::UrlEncode($this->Http()->GetHost(false, true, true), $bUrlEncode), $sLine); + } + + if (false !== \strpos($sLine, '{request:domain-clear}')) + { + $sLine = \str_replace('{request:domain-clear}', + \RainLoop\Utils::UrlEncode( + \MailSo\Base\Utils::GetClearDomainName($this->Http()->GetHost(false, true, true)), $bUrlEncode), $sLine); + } + + $aClear['/\{request:([^}]*)\}/i'] = 'request'; + } + + if (false !== \strpos($sLine, '{user:')) + { + if (false !== \strpos($sLine, '{user:uid}')) + { + $sLine = \str_replace('{user:uid}', + \RainLoop\Utils::UrlEncode(\base_convert(\sprintf('%u', + \crc32(\md5(\RainLoop\Utils::GetConnectionToken()))), 10, 32), $bUrlEncode), + $sLine + ); + } + + if (false !== \strpos($sLine, '{user:ip}')) + { + $sLine = \str_replace('{user:ip}', \RainLoop\Utils::UrlEncode($this->Http()->GetClientIp( + $this->Config()->Get('labs', 'http_client_ip_check_proxy', false)), $bUrlEncode), $sLine); + } + + if (\preg_match('/\{user:(email|login|domain)\}/i', $sLine)) + { + if (!$oAccount) + { + $this->ParseQueryAuthString(); + $oAccount = $this->getAccountFromToken(false); + } + + if ($oAccount) + { + $sEmail = $oAccount->Email(); + + $sLine = \str_replace('{user:email}', \RainLoop\Utils::UrlEncode($sEmail, $bUrlEncode), $sLine); + $sLine = \str_replace('{user:login}', \RainLoop\Utils::UrlEncode( + \MailSo\Base\Utils::GetAccountNameFromEmail($sEmail), $bUrlEncode), $sLine); + $sLine = \str_replace('{user:domain}', \RainLoop\Utils::UrlEncode( + \MailSo\Base\Utils::GetDomainFromEmail($sEmail), $bUrlEncode), $sLine); + $sLine = \str_replace('{user:domain-clear}', \RainLoop\Utils::UrlEncode( + \MailSo\Base\Utils::GetClearDomainName( + \MailSo\Base\Utils::GetDomainFromEmail($sEmail)), $bUrlEncode), $sLine); + } + } + + $aClear['/\{user:([^}]*)\}/i'] = 'unknown'; + } + + if (false !== \strpos($sLine, '{labs:')) + { + $sLine = \preg_replace_callback('/\{labs:rand:([1-9])\}/', function ($aMatch) { + return \rand(\pow(10, $aMatch[1] - 1), \pow(10, $aMatch[1]) - 1); + }, $sLine); + + $aClear['/\{labs:([^}]*)\}/'] = 'labs'; + } + + if (\is_array($aAdditionalParams) && 0 < \count($aAdditionalParams)) + { + foreach ($aAdditionalParams as $sKey => $sValue) + { + $sLine = \str_replace($sKey, $sValue, $sLine); + } + } + + if (0 < \count($aClear)) + { + foreach ($aClear as $sKey => $sValue) + { + $sLine = \preg_replace($sKey, $sValue, $sLine); + } + } + + return $sLine; + } + + /** + * @param string $sFileName + * + * @return string + */ + private function compileLogFileName($sFileName) + { + $sFileName = \trim($sFileName); + + if (0 !== \strlen($sFileName)) + { + $sFileName = $this->compileLogParams($sFileName); + + $sFileName = \preg_replace('/[\/]+/', '/', \preg_replace('/[.]+/', '.', $sFileName)); + $sFileName = \preg_replace('/[^a-zA-Z0-9@_+=\-\.\/!()\[\]]/', '', $sFileName); + } + + if (0 === \strlen($sFileName)) + { + $sFileName = 'rainloop-log.txt'; + } + + return $sFileName; + } + + /** + * @return void + */ + public function SetAuthLogoutToken() + { + @\header('X-RainLoop-Action: Logout'); + \RainLoop\Utils::SetCookie(self::AUTH_SPEC_LOGOUT_TOKEN_KEY, \md5(APP_START_TIME), 0); + } + + /** + * @param \RainLoop\Model\Account $oAccount + * + * @return void + */ + public function SetAuthToken($oAccount) + { + if ($oAccount) + { + $sSpecAuthToken = '_'.$oAccount->GetAuthTokenQ(); + + $this->SetSpecAuthToken($sSpecAuthToken); + \RainLoop\Utils::SetCookie(self::AUTH_SPEC_TOKEN_KEY, $sSpecAuthToken, 0); + + if ($oAccount->SignMe() && 0 < \strlen($oAccount->SignMeToken())) + { + \RainLoop\Utils::SetCookie(self::AUTH_SIGN_ME_TOKEN_KEY, + \RainLoop\Utils::EncodeKeyValuesQ(array( + 'e' => $oAccount->Email(), + 't' => $oAccount->SignMeToken() + )), + \time() + 60 * 60 * 24 * 30); + + $this->StorageProvider()->Put($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'sign_me', + \RainLoop\Utils::EncodeKeyValuesQ(array( + 'Time' => \time(), + 'AuthToken' => $oAccount->GetAuthTokenQ(), + 'SignMetToken' => $oAccount->SignMeToken() + )) + ); + } + } + } + + /** + * @return string + */ + public function GetSpecAuthTokenWithDeletion() + { + $sResult = \RainLoop\Utils::GetCookie(self::AUTH_SPEC_TOKEN_KEY, ''); + if (0 < strlen($sResult)) + { + \RainLoop\Utils::ClearCookie(self::AUTH_SPEC_TOKEN_KEY); + } + + return $sResult; + } + + /** + * @return string + */ + public function GetSpecAuthLogoutTokenWithDeletion() + { + $sResult = \RainLoop\Utils::GetCookie(self::AUTH_SPEC_LOGOUT_TOKEN_KEY, ''); + if (0 < strlen($sResult)) + { + \RainLoop\Utils::ClearCookie(self::AUTH_SPEC_LOGOUT_TOKEN_KEY); + } + + return $sResult; + } + + /** + * @return string + */ + public function GetSpecLogoutCustomMgsWithDeletion() + { + $sResult = \RainLoop\Utils::GetCookie(self::AUTH_SPEC_LOGOUT_CUSTOM_MSG_KEY, ''); + if (0 < strlen($sResult)) + { + \RainLoop\Utils::ClearCookie(self::AUTH_SPEC_LOGOUT_CUSTOM_MSG_KEY); + } + + return $sResult; + } + + /** + * @return string + */ + public function SetSpecLogoutCustomMgsWithDeletion($sMessage) + { + \RainLoop\Utils::SetCookie(self::AUTH_SPEC_LOGOUT_CUSTOM_MSG_KEY, $sMessage, 0); + } + + /** + * @return void + */ + private function setAdminAuthToken($sToken) + { + \RainLoop\Utils::SetCookie(self::AUTH_ADMIN_TOKEN_KEY, $sToken, 0); + } + + /** + * @return string + */ + private function getLocalAuthToken() + { + $sToken = $this->GetSpecAuthToken(); + return !empty($sToken) && '_' === \substr($sToken, 0, 1) ? \substr($sToken, 1) : ''; + } + + /** + * @return string + */ + private function getAdminAuthToken() + { + return \RainLoop\Utils::GetCookie(self::AUTH_ADMIN_TOKEN_KEY, ''); + } + + /** + * @return void + */ + public function ClearAdminAuthToken() + { + $aAdminHash = \RainLoop\Utils::DecodeKeyValuesQ($this->getAdminAuthToken()); + if ( + !empty($aAdminHash[0]) && !empty($aAdminHash[1]) && !empty($aAdminHash[2]) && + 'token' === $aAdminHash[0] && \md5(APP_SALT) === $aAdminHash[1] + ) + { + $this->Cacher(null, true)->Delete(\RainLoop\KeyPathHelper::SessionAdminKey($aAdminHash[2])); + } + + \RainLoop\Utils::ClearCookie(self::AUTH_ADMIN_TOKEN_KEY); + } + + /** + * @param bool $bThrowExceptionOnFalse = false + * + * @return \RainLoop\Model\Account|bool + * @throws \RainLoop\Exceptions\ClientException + */ + public function GetAccount($bThrowExceptionOnFalse = false) + { + return $this->getAccountFromToken($bThrowExceptionOnFalse); + } + + /** + * @return \MailSo\Base\Http + */ + public function Http() + { + if (null === $this->oHttp) + { + $this->oHttp = \MailSo\Base\Http::SingletonInstance(); + } + + return $this->oHttp; + } + + /** + * @return \RainLoop\Social + */ + public function Social() + { + if (null === $this->oSocial) + { + $this->oSocial = new \RainLoop\Social($this->Http(), $this); + } + + return $this->oSocial; + } + + /** + * @return \MailSo\Mail\MailClient + */ + public function MailClient() + { + if (null === $this->oMailClient) + { + $this->oMailClient = \MailSo\Mail\MailClient::NewInstance(); + $this->oMailClient->SetLogger($this->Logger()); + } + + return $this->oMailClient; + } + + /** + * @return \RainLoop\Providers\Filters + */ + public function FiltersProvider() + { + if (null === $this->oFiltersProvider) + { + $this->oFiltersProvider = new \RainLoop\Providers\Filters( + $this->fabrica('filters')); + } + + return $this->oFiltersProvider; + } + + /** + * @return \RainLoop\Providers\ChangePassword + */ + public function ChangePasswordProvider() + { + if (null === $this->oChangePasswordProvider) + { + $this->oChangePasswordProvider = new \RainLoop\Providers\ChangePassword( + $this, $this->fabrica('change-password'), !!$this->Config()->Get('labs', 'check_new_password_strength', true) + ); + } + + return $this->oChangePasswordProvider; + } + + /** + * @return \RainLoop\Providers\TwoFactorAuth + */ + public function TwoFactorAuthProvider() + { + if (null === $this->oTwoFactorAuthProvider) + { + $this->oTwoFactorAuthProvider = new \RainLoop\Providers\TwoFactorAuth( + $this->Config()->Get('security', 'allow_two_factor_auth', false) ? $this->fabrica('two-factor-auth') : null + ); + } + + return $this->oTwoFactorAuthProvider; + } + + /** + * @return \RainLoop\Providers\Prem + */ + public function PremProvider() + { + if (null === $this->oPremProvider) + { + if (\file_exists(APP_VERSION_ROOT_PATH.'app/libraries/RainLoop/Providers/Prem.php')) + { + $this->oPremProvider = new \RainLoop\Providers\Prem( + $this->Config(), $this->Logger(), $this->Cacher(null, true) + ); + } + else + { + $this->oPremProvider = false; + } + } + + return $this->oPremProvider; + } + + /** + * @param bool $bLocal = false + * + * @return \RainLoop\Providers\Storage + */ + public function StorageProvider($bLocal = false) + { + if ($bLocal) + { + if (null === $this->oLocalStorageProvider) + { + $this->oLocalStorageProvider = new \RainLoop\Providers\Storage( + $this->fabrica('storage-local')); + } + + return $this->oLocalStorageProvider; + } + else + { + if (null === $this->oStorageProvider) + { + $this->oStorageProvider = new \RainLoop\Providers\Storage( + $this->fabrica('storage')); + } + + return $this->oStorageProvider; + } + + return null; + } + + /** + * @return \RainLoop\Providers\Settings + */ + public function SettingsProvider($bLocal = false) + { + if ($bLocal) + { + if (null === $this->oLocalSettingsProvider) + { + $this->oLocalSettingsProvider = new \RainLoop\Providers\Settings( + $this->fabrica('settings-local')); + } + + return $this->oLocalSettingsProvider; + } + else + { + if (null === $this->oSettingsProvider) + { + $this->oSettingsProvider = new \RainLoop\Providers\Settings( + $this->fabrica('settings')); + } + + return $this->oSettingsProvider; + } + + return null; + } + + /** + * @return \RainLoop\Providers\Files + */ + public function FilesProvider() + { + if (null === $this->oFilesProvider) + { + $this->oFilesProvider = new \RainLoop\Providers\Files( + $this->fabrica('files')); + } + + return $this->oFilesProvider; + } + + /** + * @return \RainLoop\Providers\Domain + */ + public function DomainProvider() + { + if (null === $this->oDomainProvider) + { + $this->oDomainProvider = new \RainLoop\Providers\Domain( + $this->fabrica('domain'), $this->Plugins()); + } + + return $this->oDomainProvider; + } + + /** + * @return \RainLoop\Providers\Suggestions + */ + public function SuggestionsProvider() + { + if (null === $this->oSuggestionsProvider) + { + $this->oSuggestionsProvider = new \RainLoop\Providers\Suggestions( + $this->fabrica('suggestions')); + } + + return $this->oSuggestionsProvider; + } + + /** + * @param \RainLoop\Model\Account $oAccount = null + * @param bool $bForceEnable = false + * + * @return \RainLoop\Providers\AddressBook + */ + public function AddressBookProvider($oAccount = null, $bForceEnable = false) + { + if (null === $this->oAddressBookProvider) + { + $oDriver = null; + if ($this->GetCapa(false, false, \RainLoop\Enumerations\Capa::CONTACTS, $oAccount)) + { + if ($this->Config()->Get('contacts', 'enable', false) || $bForceEnable) + { + $oDriver = $this->fabrica('address-book', $oAccount); + } + } + + $this->oAddressBookProvider = new \RainLoop\Providers\AddressBook($oDriver); + $this->oAddressBookProvider->SetLogger($this->Logger()); + } + + return $this->oAddressBookProvider; + } + + /** + * @param \RainLoop\Model\Account $oAccount = null + * @param bool $bForceFile = false + * + * @return \MailSo\Cache\CacheClient + */ + public function Cacher($oAccount = null, $bForceFile = false) + { + $sKey = ''; + if ($oAccount) + { + $sKey = $oAccount->ParentEmailHelper(); + } + + $sIndexKey = empty($sKey) ? '_default_' : $sKey; + if ($bForceFile) + { + $sIndexKey .= '/_files_'; + } + + if (!isset($this->aCachers[$sIndexKey])) + { + $this->aCachers[$sIndexKey] = \MailSo\Cache\CacheClient::NewInstance(); + + $oDriver = null; + $sDriver = \strtoupper(\trim($this->Config()->Get('cache', 'fast_cache_driver', 'files'))); + + switch (true) + { + default: + case $bForceFile: + $oDriver = \MailSo\Cache\Drivers\File::NewInstance(APP_PRIVATE_DATA.'cache', $sKey); + break; + + case ('APC' === $sDriver || 'APCU' === $sDriver) && + \MailSo\Base\Utils::FunctionExistsAndEnabled(array( + 'apc_store', 'apc_fetch', 'apc_delete', 'apc_clear_cache')): + + $oDriver = \MailSo\Cache\Drivers\APC::NewInstance($sKey); + break; + + case ('MEMCACHE' === $sDriver || 'MEMCACHED' === $sDriver) && + \MailSo\Base\Utils::FunctionExistsAndEnabled('memcache_connect'): + + $oDriver = \MailSo\Cache\Drivers\Memcache::NewInstance( + $this->Config()->Get('labs', 'fast_cache_memcache_host', '127.0.0.1'), + (int) $this->Config()->Get('labs', 'fast_cache_memcache_port', 11211), + 43200, + $sKey + ); + break; + + case 'REDIS' === $sDriver && \class_exists('Predis\Client'): + $oDriver = \MailSo\Cache\Drivers\Redis::NewInstance( + $this->Config()->Get('labs', 'fast_cache_redis_host', '127.0.0.1'), + (int) $this->Config()->Get('labs', 'fast_cache_redis_port', 6379), + 43200, + $sKey + ); + break; + } + + if ($oDriver) + { + $this->aCachers[$sIndexKey]->SetDriver($oDriver); + } + + $this->aCachers[$sIndexKey]->SetCacheIndex($this->Config()->Get('cache', 'fast_cache_index', '')); + } + + return $this->aCachers[$sIndexKey]; + } + + /** + * @return \RainLoop\Plugins\Manager + */ + public function Plugins() + { + if (null === $this->oPlugins) + { + $this->oPlugins = new \RainLoop\Plugins\Manager($this); + $this->oPlugins->SetLogger($this->Logger()); + } + + return $this->oPlugins; + } + + /** + * @return \MailSo\Log\Logger + */ + public function Logger() + { + if (null === $this->oLogger) + { + $this->oLogger = \MailSo\Log\Logger::SingletonInstance(); + + if (!!$this->Config()->Get('logs', 'enable', false)) + { + $sSessionFilter = (string) $this->Config()->Get('logs', 'session_filter', ''); + if (!empty($sSessionFilter)) + { + $aSessionParts = \explode(':', $sSessionFilter, 2); + + if (empty($aSessionParts[0]) || empty($aSessionParts[1]) || + (string) $aSessionParts[1] !== (string) \RainLoop\Utils::GetCookie($aSessionParts[0], '')) + { + return $this->oLogger; + } + } + + $sTimeOffset = (string) $this->Config()->Get('logs', 'time_offset', '0'); + + $this->oLogger->SetShowSecter(!$this->Config()->Get('logs', 'hide_passwords', true)); + + $sLogFileName = $this->Config()->Get('logs', 'filename', ''); + + $oDriver = null; + if ('syslog' === $sLogFileName) + { + $oDriver = \MailSo\Log\Drivers\Syslog::NewInstance(); + } + else + { + $sLogFileFullPath = \APP_PRIVATE_DATA.'logs/'.$this->compileLogFileName($sLogFileName); + $sLogFileDir = \dirname($sLogFileFullPath); + + if (!@is_dir($sLogFileDir)) + { + @mkdir($sLogFileDir, 0755, true); + } + + $oDriver = \MailSo\Log\Drivers\File::NewInstance($sLogFileFullPath); + } + + $this->oLogger->Add($oDriver + ->WriteOnErrorOnly($this->Config()->Get('logs', 'write_on_error_only', false)) + ->WriteOnPhpErrorOnly($this->Config()->Get('logs', 'write_on_php_error_only', false)) + ->WriteOnTimeoutOnly($this->Config()->Get('logs', 'write_on_timeout_only', 0)) + ->SetTimeOffset($sTimeOffset) + ); + + if (!$this->Config()->Get('debug', 'enable', false)) + { + $this->oLogger->AddForbiddenType(\MailSo\Log\Enumerations\Type::TIME); + } + + $this->oLogger->WriteEmptyLine(); + + $oHttp = $this->Http(); + + $this->oLogger->Write('[DATE:'.\MailSo\Log\Logger::DateHelper('d.m.y', $sTimeOffset). + (0 !== $sTimeOffset ? '][OFFSET:'.(0 < $sTimeOffset ? '+' : '-'). + \str_pad((string) \abs($sTimeOffset), 2, '0', STR_PAD_LEFT) : ''). + '][RL:'.APP_VERSION.'][PHP:'.PHP_VERSION.'][IP:'. + $oHttp->GetClientIp($this->Config()->Get('labs', 'http_client_ip_check_proxy', false)).'][PID:'. + (\MailSo\Base\Utils::FunctionExistsAndEnabled('getmypid') ? \getmypid() : 'unknown').']['. + $oHttp->GetServer('SERVER_SOFTWARE', '~').']['. + (\MailSo\Base\Utils::FunctionExistsAndEnabled('php_sapi_name') ? \php_sapi_name() : '~' ).']' + ); + + $sPdo = (\class_exists('PDO') ? \implode(',', \PDO::getAvailableDrivers()) : 'off'); + $sPdo = empty($sPdo) ? '~' : $sPdo; + + $this->oLogger->Write('['. + 'Suhosin:'.(\extension_loaded('suhosin') || @\ini_get('suhosin.get.max_value_length') ? 'on' : 'off'). + '][APC:'.(\MailSo\Base\Utils::FunctionExistsAndEnabled('apc_fetch') ? 'on' : 'off'). + '][MB:'.(\MailSo\Base\Utils::FunctionExistsAndEnabled('mb_convert_encoding') ? 'on' : 'off'). + '][PDO:'.$sPdo. + (\RainLoop\Utils::IsOwnCloud() ? '][cloud:true' : ''). + '][Streams:'.\implode(',', \stream_get_transports()). + ']'); + + $this->oLogger->Write( + '['.$oHttp->GetMethod().'] '.$oHttp->GetScheme().'://'.$oHttp->GetHost(false, false).$oHttp->GetServer('REQUEST_URI', ''), + \MailSo\Log\Enumerations\Type::NOTE, 'REQUEST'); + } + } + + return $this->oLogger; + } + + /** + * @return \MailSo\Log\Logger + */ + public function LoggerAuth() + { + if (null === $this->oLoggerAuth) + { + $this->oLoggerAuth = \MailSo\Log\Logger::NewInstance(false); + + if (!!$this->Config()->Get('logs', 'auth_logging', false)) + { + $sAuthLogFileFullPath = \APP_PRIVATE_DATA.'logs/'.$this->compileLogFileName( + $this->Config()->Get('logs', 'auth_logging_filename', '')); + + $sLogFileDir = \dirname($sAuthLogFileFullPath); + + if (!@is_dir($sLogFileDir)) + { + @mkdir($sLogFileDir, 0755, true); + } + + $this->oLoggerAuth->AddForbiddenType(\MailSo\Log\Enumerations\Type::MEMORY); + $this->oLoggerAuth->AddForbiddenType(\MailSo\Log\Enumerations\Type::TIME); + $this->oLoggerAuth->AddForbiddenType(\MailSo\Log\Enumerations\Type::TIME_DELTA); + + $oDriver = \MailSo\Log\Drivers\File::NewInstance($sAuthLogFileFullPath); + + $oDriver->DisableTimePrefix(); + $oDriver->DisableGuidPrefix(); + $oDriver->DisableTypedPrefix(); + + $this->oLoggerAuth->Add($oDriver); + } + } + + return $this->oLoggerAuth; + } + + /** + * @param \RainLoop\Model\Account $oAccount = null + * @param array $aAdditionalParams = array() + */ + public function LoggerAuthHelper($oAccount = null, $aAdditionalParams = array()) + { + $sLine = $this->Config()->Get('logs', 'auth_logging_format', ''); + if (!empty($sLine)) + { + $this->LoggerAuth()->Write($this->compileLogParams($sLine, $oAccount, false, $aAdditionalParams)); + } + } + + /** + * @return string + */ + private function getAdminToken() + { + $sRand = \MailSo\Base\Utils::Md5Rand(); + if (!$this->Cacher(null, true)->Set(\RainLoop\KeyPathHelper::SessionAdminKey($sRand), \time())) + { + $this->oLogger->Write('Cannot store an admin token', + \MailSo\Log\Enumerations\Type::WARNING); + + $sRand = ''; + } + + return '' === $sRand ? '' : \RainLoop\Utils::EncodeKeyValuesQ(array('token', \md5(APP_SALT), $sRand)); + } + + /** + * @param bool $bThrowExceptionOnFalse = true + * + * @return bool + */ + public function IsAdminLoggined($bThrowExceptionOnFalse = true) + { + $bResult = false; + if ($this->Config()->Get('security', 'allow_admin_panel', true)) + { + $aAdminHash = \RainLoop\Utils::DecodeKeyValuesQ($this->getAdminAuthToken()); + if (!empty($aAdminHash[0]) && !empty($aAdminHash[1]) && !empty($aAdminHash[2]) && + 'token' === $aAdminHash[0] && \md5(APP_SALT) === $aAdminHash[1] && + '' !== $this->Cacher(null, true)->Get(\RainLoop\KeyPathHelper::SessionAdminKey($aAdminHash[2]), '') + ) + { + $bResult = true; + } + } + + if (!$bResult && $bThrowExceptionOnFalse) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); + } + + return $bResult; + } + + /** + * @param string $sTo + */ + public function SetMailtoRequest($sTo) + { + if (!empty($sTo)) + { + \RainLoop\Utils::SetCookie(self::AUTH_MAILTO_TOKEN_KEY, + \RainLoop\Utils::EncodeKeyValuesQ(array( + 'Time' => \microtime(true), + 'MailTo' => 'MailTo', + 'To' => $sTo + )), 0); + } + } + + /** + * @param string $sEmail + * @param string $sLogin + * @param string $sPassword + * @param string $sSignMeToken = '' + * @param bool $bThrowProvideException = false + * + * @return \RainLoop\Model\Account|null + */ + public function LoginProvide($sEmail, $sLogin, $sPassword, $sSignMeToken = '', $bThrowProvideException = false) + { + $oAccount = null; + if (0 < \strlen($sEmail) && 0 < \strlen($sLogin) && 0 < \strlen($sPassword)) + { + $oDomain = $this->DomainProvider()->Load(\MailSo\Base\Utils::GetDomainFromEmail($sEmail), true); + if ($oDomain instanceof \RainLoop\Model\Domain) + { + if ($oDomain->ValidateWhiteList($sEmail, $sLogin)) + { + $oAccount = \RainLoop\Model\Account::NewInstance($sEmail, $sLogin, $sPassword, $oDomain, $sSignMeToken); + $this->Plugins()->RunHook('filter.account', array(&$oAccount)); + + if ($bThrowProvideException && !($oAccount instanceof \RainLoop\Model\Account)) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); + } + } + else if ($bThrowProvideException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AccountNotAllowed); + } + } + else if ($bThrowProvideException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::DomainNotAllowed); + } + } + + return $oAccount; + } + + /** + * @param string $sToken + * @param bool $bThrowExceptionOnFalse = true + * @param bool $bValidateShortToken = true + * @param bool $bQ = false + * + * @return \RainLoop\Model\Account|bool + * @throws \RainLoop\Exceptions\ClientException + */ + public function GetAccountFromCustomToken($sToken, $bThrowExceptionOnFalse = true, $bValidateShortToken = true, $bQ = false) + { + $oResult = false; + if (!empty($sToken)) + { + $aAccountHash = $bQ ? \RainLoop\Utils::DecodeKeyValuesQ($sToken) : \RainLoop\Utils::DecodeKeyValues($sToken); + if (!empty($aAccountHash[0]) && 'token' === $aAccountHash[0] && // simple token validation + 8 <= \count($aAccountHash) && // length checking + !empty($aAccountHash[7]) && // does short token exist + (!$bValidateShortToken || \RainLoop\Utils::GetShortToken() === $aAccountHash[7] || // check short token if needed + (isset($aAccountHash[10]) && 0 < $aAccountHash[10] && \time() < $aAccountHash[10])) + ) + { + $oAccount = $this->LoginProvide($aAccountHash[1], $aAccountHash[2], $aAccountHash[3], + empty($aAccountHash[5]) ? '' : $aAccountHash[5], $bThrowExceptionOnFalse); + + if ($oAccount instanceof \RainLoop\Model\Account) + { + if (!empty($aAccountHash[8]) && !empty($aAccountHash[9])) // init proxy user/password + { + $oAccount->SetProxyAuthUser($aAccountHash[8]); + $oAccount->SetProxyAuthPassword($aAccountHash[9]); + } + + $this->Logger()->AddSecret($oAccount->Password()); + $this->Logger()->AddSecret($oAccount->ProxyAuthPassword()); + + $oAccount->SetParentEmail($aAccountHash[6]); + $oResult = $oAccount; + } + } + else if ($bThrowExceptionOnFalse) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); + } + } + + if ($bThrowExceptionOnFalse && !($oResult instanceof \RainLoop\Model\Account)) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); + } + + return $oResult; + } + + /** + * @return \RainLoop\Model\Account|bool + */ + public function GetAccountFromSignMeToken() + { + $oAccount = false; + + $sSignMeToken = \RainLoop\Utils::GetCookie(\RainLoop\Actions::AUTH_SIGN_ME_TOKEN_KEY, ''); + if (!empty($sSignMeToken)) + { + $aTokenData = \RainLoop\Utils::DecodeKeyValuesQ($sSignMeToken); + if (\is_array($aTokenData) && !empty($aTokenData['e']) && !empty($aTokenData['t'])) + { + $sTokenSettings = $this->StorageProvider()->Get($aTokenData['e'], + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'sign_me' + ); + + if (!empty($sTokenSettings)) + { + $aSignMeData = \RainLoop\Utils::DecodeKeyValuesQ($sTokenSettings); + if (\is_array($aSignMeData) && + !empty($aSignMeData['AuthToken']) && + !empty($aSignMeData['SignMetToken']) && + $aSignMeData['SignMetToken'] === $aTokenData['t']) + { + $oAccount = $this->GetAccountFromCustomToken($aSignMeData['AuthToken'], false, false, true); + } + } + } + } + else + { + \RainLoop\Utils::ClearCookie(\RainLoop\Actions::AUTH_SIGN_ME_TOKEN_KEY); + } + + return $oAccount; + } + + /** + * @param bool $bThrowExceptionOnFalse = true + * + * @return \RainLoop\Model\Account|bool + * @throws \RainLoop\Exceptions\ClientException + */ + public function getAccountFromToken($bThrowExceptionOnFalse = true) + { + return $this->GetAccountFromCustomToken($this->getLocalAuthToken(), $bThrowExceptionOnFalse, true, true); + } + + /** + * @return bool + */ + public function IsOpen() + { + return !$this->PremProvider(); + } + + /** + * @param bool $bAdmin = false + * @param bool $bMobile = false + * @param bool $bMobileDevice = false + * + * @return array + */ + public function AppDataSystem($bAdmin = false, $bMobile = false, $bMobileDevice = false) + { + $oConfig = $this->Config(); + + $aAttachmentsActions = array(); + if ($this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::ATTACHMENTS_ACTIONS)) + { + if (!!\class_exists('ZipArchive')) + { + $aAttachmentsActions[] = 'zip'; + } + + if (\RainLoop\Utils::IsOwnCloudLoggedIn() && \class_exists('OCP\Files')) + { + $aAttachmentsActions[] = 'owncloud'; + } + + if ($oConfig->Get('social', 'dropbox_enable', false) && 0 < \strlen(\trim($oConfig->Get('social', 'dropbox_api_key', '')))) + { + $aAttachmentsActions[] = 'dropbox'; + } + } + + return \array_merge(array( + 'version' => APP_VERSION, + 'admin' => $bAdmin, + 'mobile' => $bMobile, + 'mobileDevice' => $bMobileDevice, + 'webPath' => \RainLoop\Utils::WebPath(), + 'webVersionPath' => \RainLoop\Utils::WebVersionPath(), + 'token' => $oConfig->Get('security', 'csrf_protection', false) ? \RainLoop\Utils::GetCsrfToken() : '', + 'inIframe' => (bool) $oConfig->Get('labs', 'in_iframe', false), + 'allowHtmlEditorSourceButton' => (bool) $oConfig->Get('labs', 'allow_html_editor_source_button', false), + 'allowHtmlEditorBitiButtons' => (bool) $oConfig->Get('labs', 'allow_html_editor_biti_buttons', false), + 'allowCtrlEnterOnCompose' => (bool) $oConfig->Get('labs', 'allow_ctrl_enter_on_compose', false), + 'customLoginLink' => $oConfig->Get('labs', 'custom_login_link', ''), + 'customLogoutLink' => $oConfig->Get('labs', 'custom_logout_link', ''), + 'forgotPasswordLinkUrl' => \trim($oConfig->Get('login', 'forgot_password_link_url', '')), + 'registrationLinkUrl' => \trim($oConfig->Get('login', 'registration_link_url', '')), + 'hideSubmitButton' => (bool) $oConfig->Get('login', 'hide_submit_button', true), + 'jsHash' => \md5(\RainLoop\Utils::GetConnectionToken()), + 'useImapThread' => (bool) $oConfig->Get('labs', 'use_imap_thread', false), + 'useImapSubscribe' => (bool) $oConfig->Get('labs', 'use_imap_list_subscribe', true), + 'allowAppendMessage' => (bool) $oConfig->Get('labs', 'allow_message_append', false), + 'materialDesign' => (bool) $oConfig->Get('labs', 'use_material_design', true), + 'folderSpecLimit' => (int) $oConfig->Get('labs', 'folders_spec_limit', 50), + 'faviconStatus' => (bool) $oConfig->Get('labs', 'favicon_status', true), + 'allowCmdInterface' => (bool) $oConfig->Get('labs', 'allow_cmd', false), + 'useNativeScrollbars' => (bool) $oConfig->Get('interface', 'use_native_scrollbars', false), + 'listPermanentFiltered' => '' !== \trim(\RainLoop\Api::Config()->Get('labs', 'imap_message_list_permanent_filter', '')), + 'themes' => $this->GetThemes($bMobile, false), + 'languages' => $this->GetLanguages(false), + 'languagesAdmin' => $this->GetLanguages(true), + 'appVersionType' => APP_VERSION_TYPE, + 'attachmentsActions' => $aAttachmentsActions + ), $bAdmin ? array( + 'adminHostUse' => '' !== $oConfig->Get('security', 'admin_panel_host', ''), + 'adminPath' => \strtolower($oConfig->Get('security', 'admin_panel_key', 'admin')), + 'allowAdminPanel' => (bool) $oConfig->Get('security', 'allow_admin_panel', true), + ) : array()); + } + + /** + * @param bool $bAdmin + * @param bool $bMobile = false + * @param string $sAuthAccountHash = '' + * + * @return array + */ + public function AppData($bAdmin, $bMobile = false, $bMobileDevice = false, $sAuthAccountHash = '') + { + if (0 < \strlen($sAuthAccountHash) && \preg_match('/[^_\-\.a-zA-Z0-9]/', $sAuthAccountHash)) + { + $sAuthAccountHash = ''; + } + + $oAccount = null; + $oConfig = $this->Config(); + +/* +required by Index.html and rl.js: +NewThemeLink IncludeCss LoadingDescriptionEsc TemplatesLink LangLink IncludeBackground PluginsLink AuthAccountHash +*/ + + $aResult = array( + 'Auth' => false, + 'AccountHash' => '', + 'AccountSignMe' => false, + 'AuthAccountHash' => '', + 'MailToEmail' => '', + 'Email' => '', + 'DevEmail' => '', + 'DevPassword' => '', + 'Title' => $oConfig->Get('webmail', 'title', 'RainLoop Webmail'), + 'LoadingDescription' => $oConfig->Get('webmail', 'loading_description', 'RainLoop'), + 'LoadingDescriptionEsc' => 'RainLoop', + 'FaviconUrl' => $oConfig->Get('webmail', 'favicon_url', ''), + 'LoginDescription' => '', + 'LoginPowered' => true, + 'LoginLogo' => '', + 'LoginBackground' => '', + 'LoginCss' => '', + 'UserLogo' => '', + 'UserLogoTitle' => '', + 'UserLogoMessage' => '', + 'UserCss' => '', + 'WelcomePageUrl' => '', + 'WelcomePageDisplay' => 'none', + 'IncludeCss' => '', + 'IncludeBackground' => '', + 'LoginDefaultDomain' => $oConfig->Get('login', 'default_domain', ''), + 'DetermineUserLanguage' => (bool) $oConfig->Get('login', 'determine_user_language', true), + 'DetermineUserDomain' => (bool) $oConfig->Get('login', 'determine_user_domain', false), + 'UseLoginWelcomePage' => (bool) $oConfig->Get('login', 'welcome_page', false), + 'StartupUrl' => \trim(\ltrim(\trim($oConfig->Get('labs', 'startup_url', '')), '#/')), + 'SieveAllowFileintoInbox' => (bool) $oConfig->Get('labs', 'sieve_allow_fileinto_inbox', false), + 'ContactsIsAllowed' => false, + 'ChangePasswordIsAllowed' => false, + 'RequireTwoFactor' => false, + 'Community' => true, + 'PremType' => false, + 'Admin' => array(), + 'Capa' => array(), + 'Plugins' => array(), + 'System' => $this->AppDataSystem($bAdmin, $bMobile, $bMobileDevice) + ); + + if (0 < \strlen($sAuthAccountHash)) + { + $aResult['AuthAccountHash'] = $sAuthAccountHash; + } + + $oPremProvider = $this->PremProvider(); + if ($oPremProvider) + { + $oPremProvider->PopulateAppData($aResult); + } + + if ('' !== $aResult['LoadingDescription'] && 'RainLoop' !== $aResult['LoadingDescription']) + { + $aResult['LoadingDescriptionEsc'] = @\htmlspecialchars($aResult['LoadingDescription'], ENT_QUOTES|ENT_IGNORE, 'UTF-8'); + } + + $oSettings = null; + + if (!$bAdmin) + { + $oAccount = $this->getAccountFromToken(false); + if ($oAccount instanceof \RainLoop\Model\Account) + { + $aResult['IncludeCss'] = $aResult['UserCss']; + + $oAddressBookProvider = $this->AddressBookProvider($oAccount); + + $aResult['Auth'] = true; + $aResult['Email'] = $oAccount->Email(); + $aResult['IncLogin'] = $oAccount->IncLogin(); + $aResult['OutLogin'] = $oAccount->OutLogin(); + $aResult['AccountHash'] = $oAccount->Hash(); + $aResult['AccountSignMe'] = $oAccount->SignMe(); + $aResult['ChangePasswordIsAllowed'] = $this->ChangePasswordProvider()->PasswordChangePossibility($oAccount); + $aResult['ContactsIsAllowed'] = $oAddressBookProvider->IsActive(); + $aResult['ContactsSyncIsAllowed'] = (bool) $oConfig->Get('contacts', 'allow_sync', false); + $aResult['ContactsSyncInterval'] = (int) $oConfig->Get('contacts', 'sync_interval', 20); + + $aResult['EnableContactsSync'] = false; + $aResult['ContactsSyncUrl'] = ''; + $aResult['ContactsSyncUser'] = ''; + $aResult['ContactsSyncPassword'] = ''; + + if ($aResult['ContactsIsAllowed'] && $aResult['ContactsSyncIsAllowed']) + { + $mData = $this->getContactsSyncData($oAccount); + if (\is_array($mData)) + { + $aResult['EnableContactsSync'] = isset($mData['Enable']) ? !!$mData['Enable'] : false; + $aResult['ContactsSyncUrl'] = isset($mData['Url']) ? \trim($mData['Url']) : ''; + $aResult['ContactsSyncUser'] = isset($mData['User']) ? \trim($mData['User']) : ''; + $aResult['ContactsSyncPassword'] = APP_DUMMY; + } + } + + if ($aResult['AccountSignMe']) + { + $sToken = \RainLoop\Utils::GetCookie(self::AUTH_MAILTO_TOKEN_KEY, null); + if (null !== $sToken) + { + \RainLoop\Utils::ClearCookie(self::AUTH_MAILTO_TOKEN_KEY); + + $mMailToData = \RainLoop\Utils::DecodeKeyValuesQ($sToken); + if (\is_array($mMailToData) && !empty($mMailToData['MailTo']) && + 'MailTo' === $mMailToData['MailTo'] && !empty($mMailToData['To'])) + { + $aResult['MailToEmail'] = $mMailToData['To']; + } + } + } + + $oSettings = $this->SettingsProvider()->Load($oAccount); + + if (!$oAccount->IsAdditionalAccount() && !empty($aResult['WelcomePageUrl']) && + ('once' === $aResult['WelcomePageDisplay'] || 'always' === $aResult['WelcomePageDisplay'])) + { + if ('once' === $aResult['WelcomePageDisplay']) + { + if ($aResult['WelcomePageUrl'] === $oSettings->GetConf('LastWelcomePage', '')) + { + $aResult['WelcomePageUrl'] = ''; + $aResult['WelcomePageDisplay'] = ''; + } + } + } + else + { + $aResult['WelcomePageUrl'] = ''; + $aResult['WelcomePageDisplay'] = ''; + } + + if (!empty($aResult['StartupUrl'])) + { + $aResult['StartupUrl'] = $this->compileLogParams($aResult['StartupUrl'], $oAccount, true); + } + + if (!empty($aResult['UserIframeMessage'])) + { + $aResult['UserIframeMessage'] = $this->compileLogParams($aResult['UserIframeMessage'], $oAccount, true); + } + } + else + { + $oAccount = null; + + $aResult['IncludeBackground'] = $aResult['LoginBackground']; + $aResult['IncludeCss'] = $aResult['LoginCss']; + + $aResult['DevEmail'] = $oConfig->Get('labs', 'dev_email', ''); + $aResult['DevPassword'] = $oConfig->Get('labs', 'dev_password', ''); + + $aResult['WelcomePageUrl'] = ''; + $aResult['WelcomePageDisplay'] = ''; + + $aResult['StartupUrl'] = ''; + + if (empty($aResult['AdditionalLoginError'])) + { + $aResult['AdditionalLoginError'] = $this->GetSpecLogoutCustomMgsWithDeletion(); + } + } + + $aResult['AllowGoogleSocial'] = (bool) $oConfig->Get('social', 'google_enable', false); + $aResult['AllowGoogleSocialAuth'] = (bool) $oConfig->Get('social', 'google_enable_auth', true); + $aResult['AllowGoogleSocialAuthFast'] = (bool) $oConfig->Get('social', 'google_enable_auth_fast', true); + $aResult['AllowGoogleSocialDrive'] = (bool) $oConfig->Get('social', 'google_enable_drive', true); + $aResult['AllowGoogleSocialPreview'] = (bool) $oConfig->Get('social', 'google_enable_preview', true); + + $aResult['GoogleClientID'] = \trim($oConfig->Get('social', 'google_client_id', '')); + $aResult['GoogleApiKey'] = \trim($oConfig->Get('social', 'google_api_key', '')); + + if (!$aResult['AllowGoogleSocial'] || ($aResult['AllowGoogleSocial'] && ( + '' === \trim($oConfig->Get('social', 'google_client_id', '')) || '' === \trim($oConfig->Get('social', 'google_client_secret', ''))))) + { + $aResult['AllowGoogleSocialAuth'] = false; + $aResult['AllowGoogleSocialAuthFast'] = false; + $aResult['AllowGoogleSocialDrive'] = false; + $aResult['GoogleClientID'] = ''; + $aResult['GoogleApiKey'] = ''; + } + + if (!$aResult['AllowGoogleSocial']) + { + $aResult['AllowGoogleSocialPreview'] = false; + } + + if ($aResult['AllowGoogleSocial'] && + !$aResult['AllowGoogleSocialAuth'] && !$aResult['AllowGoogleSocialAuthFast'] && + !$aResult['AllowGoogleSocialDrive'] && !$aResult['AllowGoogleSocialPreview']) + { + $aResult['AllowGoogleSocial'] = false; + } + + $aResult['AllowFacebookSocial'] = (bool) $oConfig->Get('social', 'fb_enable', false); + if ($aResult['AllowFacebookSocial'] && ( + '' === \trim($oConfig->Get('social', 'fb_app_id', '')) || '' === \trim($oConfig->Get('social', 'fb_app_secret', '')))) + { + $aResult['AllowFacebookSocial'] = false; + } + + $aResult['AllowTwitterSocial'] = (bool) $oConfig->Get('social', 'twitter_enable', false); + if ($aResult['AllowTwitterSocial'] && ( + '' === \trim($oConfig->Get('social', 'twitter_consumer_key', '')) || '' === \trim($oConfig->Get('social', 'twitter_consumer_secret', '')))) + { + $aResult['AllowTwitterSocial'] = false; + } + + $aResult['AllowDropboxSocial'] = (bool) $oConfig->Get('social', 'dropbox_enable', false); + $aResult['DropboxApiKey'] = \trim($oConfig->Get('social', 'dropbox_api_key', '')); + + if (!$aResult['AllowDropboxSocial']) + { + $aResult['DropboxApiKey'] = ''; + } + else if (0 === strlen($aResult['DropboxApiKey'])) + { + $aResult['AllowDropboxSocial'] = false; + } + + $aResult['Capa'] = $this->Capa(false, $bMobile, $oAccount); + + if ($aResult['Auth'] && !$aResult['RequireTwoFactor']) + { + if ($this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount) && + $this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::TWO_FACTOR_FORCE, $oAccount) && + $this->TwoFactorAuthProvider()->IsActive()) + { + $aData = $this->getTwoFactorInfo($oAccount, true); + + $aResult['RequireTwoFactor'] = !$aData || + !isset($aData['User'], $aData['IsSet'], $aData['Enable']) || + !($aData['IsSet'] && $aData['Enable']); + } + } + } + else + { + $aResult['Auth'] = $this->IsAdminLoggined(false); + if ($aResult['Auth']) + { + $aResult['AdminDomain'] = APP_SITE; + $aResult['AdminLogin'] = (string) $oConfig->Get('security', 'admin_login', ''); + $aResult['UseTokenProtection'] = (bool) $oConfig->Get('security', 'csrf_protection', true); + $aResult['EnabledPlugins'] = (bool) $oConfig->Get('plugins', 'enable', false); + + $aResult['VerifySslCertificate'] = (bool) $oConfig->Get('ssl', 'verify_certificate', false); + $aResult['AllowSelfSigned'] = (bool) $oConfig->Get('ssl', 'allow_self_signed', true); + + $aDrivers = \class_exists('PDO') ? \PDO::getAvailableDrivers() : null; + $aResult['MySqlIsSupported'] = \is_array($aDrivers) ? \in_array('mysql', $aDrivers) : false; + $aResult['SQLiteIsSupported'] = \is_array($aDrivers) ? \in_array('sqlite', $aDrivers) : false; + $aResult['PostgreSqlIsSupported'] = \is_array($aDrivers) ? \in_array('pgsql', $aDrivers) : false; + + $aResult['ContactsEnable'] = (bool) $oConfig->Get('contacts', 'enable', false); + $aResult['ContactsSync'] = (bool) $oConfig->Get('contacts', 'allow_sync', false); + $aResult['ContactsPdoType'] = (string) $this->ValidateContactPdoType(\trim($this->Config()->Get('contacts', 'type', 'sqlite'))); + $aResult['ContactsPdoDsn'] = (string) $oConfig->Get('contacts', 'pdo_dsn', ''); + $aResult['ContactsPdoType'] = (string) $oConfig->Get('contacts', 'type', ''); + $aResult['ContactsPdoUser'] = (string) $oConfig->Get('contacts', 'pdo_user', ''); + $aResult['ContactsPdoPassword'] = (string) APP_DUMMY; + + $aResult['AllowGoogleSocial'] = (bool) $oConfig->Get('social', 'google_enable', false); + $aResult['AllowGoogleSocialAuth'] = (bool) $oConfig->Get('social', 'google_enable_auth', true); + $aResult['AllowGoogleSocialAuthFast'] = (bool) $oConfig->Get('social', 'google_enable_auth_fast', true); + $aResult['AllowGoogleSocialDrive'] = (bool) $oConfig->Get('social', 'google_enable_drive', true); + $aResult['AllowGoogleSocialPreview'] = (bool) $oConfig->Get('social', 'google_enable_preview', true); + + $aResult['GoogleClientID'] = (string) $oConfig->Get('social', 'google_client_id', ''); + $aResult['GoogleClientSecret'] = (string) $oConfig->Get('social', 'google_client_secret', ''); + $aResult['GoogleApiKey'] = (string) $oConfig->Get('social', 'google_api_key', ''); + + $aResult['AllowFacebookSocial'] = (bool) $oConfig->Get('social', 'fb_enable', false); + $aResult['FacebookAppID'] = (string) $oConfig->Get('social', 'fb_app_id', ''); + $aResult['FacebookAppSecret'] = (string) $oConfig->Get('social', 'fb_app_secret', ''); + + $aResult['AllowTwitterSocial'] = (bool) $oConfig->Get('social', 'twitter_enable', false); + $aResult['TwitterConsumerKey'] = (string) $oConfig->Get('social', 'twitter_consumer_key', ''); + $aResult['TwitterConsumerSecret'] = (string) $oConfig->Get('social', 'twitter_consumer_secret', ''); + + $aResult['AllowDropboxSocial'] = (bool) $oConfig->Get('social', 'dropbox_enable', false); + $aResult['DropboxApiKey'] = (string) $oConfig->Get('social', 'dropbox_api_key', ''); + + $aResult['SubscriptionEnabled'] = (bool) \MailSo\Base\Utils::ValidateDomain($aResult['AdminDomain'], true); +// || \MailSo\Base\Utils::ValidateIP($aResult['AdminDomain']); + + $aResult['WeakPassword'] = (bool) $oConfig->ValidatePassword('12345'); + $aResult['CoreAccess'] = (bool) $this->rainLoopCoreAccess(); + + $aResult['PhpUploadSizes'] = array( + 'upload_max_filesize' => \ini_get('upload_max_filesize'), + 'post_max_size' => \ini_get('post_max_size') + ); + } + + $aResult['Capa'] = $this->Capa(true, $bMobile); + } + + $aResult['SupportedFacebookSocial'] = (bool) \version_compare(PHP_VERSION, '5.4.0', '>='); + if (!$aResult['SupportedFacebookSocial']) + { + $aResult['AllowFacebookSocial'] = false; + $aResult['FacebookAppID'] = ''; + $aResult['FacebookAppSecret'] = ''; + } + + $aResult['ProjectHash'] = \md5($aResult['AccountHash'].APP_VERSION.$this->Plugins()->Hash()); + + $sLanguage = $oConfig->Get('webmail', 'language', 'en'); + $sLanguageAdmin = $oConfig->Get('webmail', 'language_admin', 'en'); + $sTheme = $oConfig->Get('webmail', 'theme', 'Default'); + + $aResult['NewMoveToFolder'] = (bool) $oConfig->Get('interface', 'new_move_to_folder_button', true); + $aResult['AllowLanguagesOnSettings'] = (bool) $oConfig->Get('webmail', 'allow_languages_on_settings', true); + $aResult['AllowLanguagesOnLogin'] = (bool) $oConfig->Get('login', 'allow_languages_on_login', true); + $aResult['AttachmentLimit'] = ((int) $oConfig->Get('webmail', 'attachment_size_limit', 10)) * 1024 * 1024; + $aResult['SignMe'] = (string) $oConfig->Get('login', 'sign_me_auto', \RainLoop\Enumerations\SignMeType::DEFAILT_OFF); + $aResult['UseLocalProxyForExternalImages'] = (bool) $oConfig->Get('labs', 'use_local_proxy_for_external_images', false); + + // user + $aResult['ShowImages'] = (bool) $oConfig->Get('defaults', 'show_images', false); + $aResult['MPP'] = (int) $oConfig->Get('webmail', 'messages_per_page', 25); + $aResult['SoundNotification'] = false; + $aResult['DesktopNotifications'] = false; + $aResult['Layout'] = (int) $oConfig->Get('defaults', 'view_layout', \RainLoop\Enumerations\Layout::SIDE_PREVIEW); + $aResult['EditorDefaultType'] = (string) $oConfig->Get('defaults', 'view_editor_type', ''); + $aResult['UseCheckboxesInList'] = (bool) $oConfig->Get('defaults', 'view_use_checkboxes', true); + $aResult['AutoLogout'] = (int) $oConfig->Get('defaults', 'autologout', 30); + $aResult['UseThreads'] = (bool) $oConfig->Get('defaults', 'mail_use_threads', false); + $aResult['AllowDraftAutosave'] = (bool) $oConfig->Get('defaults', 'allow_draft_autosave', true); + $aResult['ReplySameFolder'] = (bool) $oConfig->Get('defaults', 'mail_reply_same_folder', false); + $aResult['ContactsAutosave'] = (bool) $oConfig->Get('defaults', 'contacts_autosave', true); + $aResult['EnableTwoFactor'] = false; + $aResult['ParentEmail'] = ''; + $aResult['InterfaceAnimation'] = true; + $aResult['UserBackgroundName'] = ''; + $aResult['UserBackgroundHash'] = ''; + + if (!$bAdmin && $oAccount instanceof \RainLoop\Model\Account) + { + $aResult['ParentEmail'] = $oAccount->ParentEmail(); + + $oSettingsLocal = $this->SettingsProvider(true)->Load($oAccount); + + if ($oSettingsLocal instanceof \RainLoop\Settings) + { +// if ($this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::FOLDERS, $oAccount)) + + $aResult['SentFolder'] = (string) $oSettingsLocal->GetConf('SentFolder', ''); + $aResult['DraftFolder'] = (string) $oSettingsLocal->GetConf('DraftFolder', ''); + $aResult['SpamFolder'] = (string) $oSettingsLocal->GetConf('SpamFolder', ''); + $aResult['TrashFolder'] = (string) $oSettingsLocal->GetConf('TrashFolder', ''); + $aResult['ArchiveFolder'] = (string) $oSettingsLocal->GetConf('ArchiveFolder', ''); + $aResult['NullFolder'] = (string) $oSettingsLocal->GetConf('NullFolder', ''); + } + + if ($this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::SETTINGS, $oAccount)) + { + if ($oSettings instanceof \RainLoop\Settings) + { + if ($oConfig->Get('webmail', 'allow_languages_on_settings', true)) + { + $sLanguage = (string) $oSettings->GetConf('Language', $sLanguage); + } + + $aResult['EditorDefaultType'] = (string) $oSettings->GetConf('EditorDefaultType', $aResult['EditorDefaultType']); + $aResult['ShowImages'] = (bool) $oSettings->GetConf('ShowImages', $aResult['ShowImages']); + $aResult['ContactsAutosave'] = (bool) $oSettings->GetConf('ContactsAutosave', $aResult['ContactsAutosave']); + $aResult['MPP'] = (int) $oSettings->GetConf('MPP', $aResult['MPP']); + $aResult['SoundNotification'] = (bool) $oSettings->GetConf('SoundNotification', $aResult['SoundNotification']); + $aResult['DesktopNotifications'] = (bool) $oSettings->GetConf('DesktopNotifications', $aResult['DesktopNotifications']); + $aResult['UseCheckboxesInList'] = (bool) $oSettings->GetConf('UseCheckboxesInList', $aResult['UseCheckboxesInList']); + $aResult['AllowDraftAutosave'] = (bool) $oSettings->GetConf('AllowDraftAutosave', $aResult['AllowDraftAutosave']); + $aResult['AutoLogout'] = (int) $oSettings->GetConf('AutoLogout', $aResult['AutoLogout']); + $aResult['Layout'] = (int) $oSettings->GetConf('Layout', $aResult['Layout']); + + if (!$this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::AUTOLOGOUT, $oAccount)) + { + $aResult['AutoLogout'] = 0; + } + + if ($this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::USER_BACKGROUND, $oAccount)) + { + $aResult['UserBackgroundName'] = (string) $oSettings->GetConf('UserBackgroundName', $aResult['UserBackgroundName']); + $aResult['UserBackgroundHash'] = (string) $oSettings->GetConf('UserBackgroundHash', $aResult['UserBackgroundHash']); +// if (!empty($aResult['UserBackgroundName']) && !empty($aResult['UserBackgroundHash'])) +// { +// $aResult['IncludeBackground'] = './?/Raw/&q[]=/{{USER}}/UserBackground/&q[]=/'. +// $aResult['UserBackgroundHash'].'/'; +// } + } + + $aResult['EnableTwoFactor'] = (bool) $oSettings->GetConf('EnableTwoFactor', $aResult['EnableTwoFactor']); + } + + if ($oSettingsLocal instanceof \RainLoop\Settings) + { + $aResult['UseThreads'] = (bool) $oSettingsLocal->GetConf('UseThreads', $aResult['UseThreads']); + $aResult['ReplySameFolder'] = (bool) $oSettingsLocal->GetConf('ReplySameFolder', $aResult['ReplySameFolder']); + + if ($this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::THEMES, $oAccount)) + { + $sTheme = (string) $oSettingsLocal->GetConf('Theme', $sTheme); + } + } + } + } + + if (!$aResult['Auth']) + { + if (!$bAdmin) + { + if ($oConfig->Get('login', 'allow_languages_on_login', true) && + $oConfig->Get('login', 'determine_user_language', true)) + { + $sLanguage = $this->ValidateLanguage( + $this->detectUserLanguage($bAdmin), $sLanguage, false); + } + } + } + + $sTheme = $this->ValidateTheme($sTheme, $bMobile); + $sStaticCache = $this->StaticCache(); + + $aResult['Theme'] = $sTheme; + $aResult['NewThemeLink'] = $this->ThemeLink($sTheme, $bAdmin); + + $aResult['Language'] = $this->ValidateLanguage($sLanguage, '', false); + $aResult['LanguageAdmin'] = $this->ValidateLanguage($sLanguageAdmin, '', true); + + $aResult['UserLanguageRaw'] = $this->detectUserLanguage($bAdmin); + + $aResult['UserLanguage'] = $this->ValidateLanguage($aResult['UserLanguageRaw'], '', false, true); + $aResult['UserLanguageAdmin'] = $this->ValidateLanguage($aResult['UserLanguageRaw'], '', true, true); + + $aResult['PluginsLink'] = ''; + if (0 < $this->Plugins()->Count() && $this->Plugins()->HaveJs($bAdmin)) + { + $aResult['PluginsLink'] = './?/Plugins/0/'.($bAdmin ? 'Admin' : 'User').'/'.$sStaticCache.'/'; + } + + $aResult['LangLink'] = './?/Lang/0/'.($bAdmin ? 'Admin' : 'App').'/'. + ($bAdmin ? $aResult['LanguageAdmin'] : $aResult['Language']).'/'.$sStaticCache.'/'; + + $aResult['TemplatesLink'] = './?/Templates/0/'.($bAdmin ? 'Admin' : 'App').'/'.$sStaticCache.'/'; + + $bAppJsDebug = !!$this->Config()->Get('labs', 'use_app_debug_js', false); + + $aResult['StaticLibJsLink'] = $this->StaticPath('js/'.($bAppJsDebug ? '' : 'min/'). + 'libs'.($bAppJsDebug ? '' : '.min').'.js'); + $aResult['StaticAppJsLink'] = $this->StaticPath('js/'.($bAppJsDebug ? '' : 'min/'). + ($bAdmin ? 'admin' : 'app').($bAppJsDebug ? '' : '.min').'.js'); + + $aResult['StaticAppJsNextLink'] = $this->StaticPath('js/'.($bAdmin ? 'admin' : 'app').'.next.js'); + $aResult['StaticEditorJsLink'] = $this->StaticPath('ckeditor/ckeditor.js'); + + $aResult['EditorDefaultType'] = \in_array($aResult['EditorDefaultType'], array('Plain', 'Html', 'HtmlForced', 'PlainForced')) ? + $aResult['EditorDefaultType'] : 'Plain'; + + // IDN + $aResult['Email'] = \MailSo\Base\Utils::IdnToUtf8($aResult['Email']); + $aResult['ParentEmail'] = \MailSo\Base\Utils::IdnToUtf8($aResult['ParentEmail']); + $aResult['MailToEmail'] = \MailSo\Base\Utils::IdnToUtf8($aResult['MailToEmail']); + $aResult['DevEmail'] = \MailSo\Base\Utils::IdnToUtf8($aResult['DevEmail']); + + // Mobile override + if ($bMobile) + { + $aResult['Layout'] = \RainLoop\Enumerations\Layout::NO_PREVIW; + + $aResult['SoundNotification'] = false; + $aResult['DesktopNotifications'] = false; + $aResult['UseCheckboxesInList'] = true; + + $aResult['UserBackgroundName'] = ''; + $aResult['UserBackgroundHash'] = ''; + } + + $this->Plugins()->InitAppData($bAdmin, $aResult, $oAccount); + + return $aResult; + } + + /** + * @return array + */ + private function getUserLanguagesFromHeader() + { + $aResult = $aList = array(); + $sAcceptLang = \strtolower($this->Http()->GetServer('HTTP_ACCEPT_LANGUAGE', 'en')); + if (!empty($sAcceptLang) && \preg_match_all('/([a-z]{1,8}(?:-[a-z]{1,8})?)(?:;q=([0-9.]+))?/', $sAcceptLang, $aList)) + { + $aResult = \array_combine($aList[1], $aList[2]); + foreach ($aResult as $n => $v) + { + $aResult[$n] = $v ? $v : 1; + } + + \arsort($aResult, SORT_NUMERIC); + } + + return $aResult; + } + + /** + * @return string + */ + public function detectUserLanguage($bAdmin = false) + { + $sResult = ''; + $aLangs = $this->getUserLanguagesFromHeader(); + + foreach (\array_keys($aLangs) as $sLang) + { + $sLang = $this->ValidateLanguage($sLang, '', $bAdmin, true); + if (!empty($sLang)) + { + $sResult = $sLang; + break; + } + } + + return $sResult; + } + + /** + * @param int $iWait = 1 + * @param int $iDelay = 1 + */ + private function requestSleep($iWait = 1, $iDelay = 1) + { + if (0 < $iDelay && 0 < $iWait) + { + if ($iWait > \time() - APP_START_TIME) + { + \sleep($iDelay); + } + } + } + + private function loginErrorDelay() + { + $iDelay = (int) $this->Config()->Get('labs', 'login_fault_delay', 0); + if (0 < $iDelay) + { + $this->requestSleep(1, $iDelay); + } + } + + /** + * @param \RainLoop\Model\Account $oAccount + */ + public function AuthToken($oAccount) + { + if ($oAccount instanceof \RainLoop\Model\Account) + { + $this->SetAuthToken($oAccount); + + $aAccounts = $this->GetAccounts($oAccount); + if (\is_array($aAccounts) && isset($aAccounts[$oAccount->Email()])) + { + $aAccounts[$oAccount->Email()] = $oAccount->GetAuthToken(); + $this->SetAccounts($oAccount, $aAccounts); + } + } + } + + /** + * @param \RainLoop\Model\Account $oAccount + * @param bool $bAuthLog = false + * + * @throws \RainLoop\Exceptions\ClientException + */ + public function CheckMailConnection($oAccount, $bAuthLog = false) + { + try + { + $oAccount->IncConnectAndLoginHelper($this->Plugins(), $this->MailClient(), $this->Config()); + } + catch (\RainLoop\Exceptions\ClientException $oException) + { + throw $oException; + } + catch (\MailSo\Net\Exceptions\ConnectionException $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::ConnectionError, $oException); + } + catch (\MailSo\Imap\Exceptions\LoginBadCredentialsException $oException) + { + if ($bAuthLog) + { + $this->LoggerAuthHelper($oAccount); + } + + if ($this->Config()->Get('labs', 'imap_show_login_alert', true)) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError, + $oException, $oException->getAlertFromStatus()); + } + else + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError, $oException); + } + } + catch (\Exception $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError, $oException); + } + } + + /** + * @param string $sLogin + * @param bool $bAdmin = false + * @return array + */ + private function getAdditionalLogParamsByUserLogin($sLogin, $bAdmin = false) + { + $sHost = $bAdmin ? $this->Http()->GetHost(false, true, true) : \MailSo\Base\Utils::GetDomainFromEmail($sLogin); + return array( + '{imap:login}' => $sLogin, + '{imap:host}' => $sHost, + '{smtp:login}' => $sLogin, + '{smtp:host}' => $sHost, + '{user:email}' => $sLogin, + '{user:login}' => \MailSo\Base\Utils::GetAccountNameFromEmail($sLogin), + '{user:domain}' => $sHost, + ); + } + + /** + * @param string $sEmail + * @param string $sPassword + * @param string $sSignMeToken = '' + * @param string $sAdditionalCode = '' + * @param string $bAdditionalCodeSignMe = false + * @param string $bSkipTwoFactorAuth = false + * + * @return \RainLoop\Model\Account + * @throws \RainLoop\Exceptions\ClientException + */ + public function LoginProcess(&$sEmail, &$sPassword, $sSignMeToken = '', + $sAdditionalCode = '', $bAdditionalCodeSignMe = false, $bSkipTwoFactorAuth = false) + { + $sInputEmail = $sEmail; + + $this->Plugins()->RunHook('filter.login-credentials.step-1', array(&$sEmail, &$sPassword)); + + $sEmail = \MailSo\Base\Utils::Trim($sEmail); + if ($this->Config()->Get('login', 'login_lowercase', true)) + { + $sEmail = \MailSo\Base\Utils::StrToLowerIfAscii($sEmail); + } + + if (false === \strpos($sEmail, '@')) + { + $this->Logger()->Write('The email address "'.$sEmail.'" is not complete', \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); + + if (false === \strpos($sEmail, '@') && !!$this->Config()->Get('login', 'determine_user_domain', false)) + { + $sUserHost = \trim($this->Http()->GetHost(false, true, true)); + $this->Logger()->Write('Determined user domain: '.$sUserHost, \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); + + $bAdded = false; + + $iLimit = 14; + $aDomainParts = \explode('.', $sUserHost); + + $oDomainProvider = $this->DomainProvider(); + while (0 < \count($aDomainParts) && 0 < $iLimit) + { + $sLine = \trim(\implode('.', $aDomainParts), '. '); + + $oDomain = $oDomainProvider->Load($sLine, false); + if ($oDomain && $oDomain instanceof \RainLoop\Model\Domain) + { + $bAdded = true; + $this->Logger()->Write('Check "'.$sLine.'": OK ('.$sEmail.' > '.$sEmail.'@'.$sLine.')', + \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); + + $sEmail = $sEmail.'@'.$sLine; + break; + } + else + { + $this->Logger()->Write('Check "'.$sLine.'": NO', \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); + } + + \array_shift($aDomainParts); + $iLimit--; + } + + if (!$bAdded) + { + $sLine = $sUserHost; + $oDomain = $oDomainProvider->Load($sLine, true); + if ($oDomain && $oDomain instanceof \RainLoop\Model\Domain) + { + $bAdded = true; + $this->Logger()->Write('Check "'.$sLine.'" with wildcard: OK ('.$sEmail.' > '.$sEmail.'@'.$sLine.')', + \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); + + $sEmail = $sEmail.'@'.$sLine; + } + else + { + $this->Logger()->Write('Check "'.$sLine.'" with wildcard: NO', \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); + } + } + + if (!$bAdded) + { + $this->Logger()->Write('Domain was not found!', \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); + } + } + + $sDefDomain = \trim($this->Config()->Get('login', 'default_domain', '')); + if (false === \strpos($sEmail, '@') && 0 < \strlen($sDefDomain)) + { + $this->Logger()->Write('Default domain "'.$sDefDomain.'" was used. ('.$sEmail.' > '.$sEmail.'@'.$sDefDomain.')', + \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); + + $sEmail = $sEmail.'@'.$sDefDomain; + } + } + + $this->Plugins()->RunHook('filter.login-credentials.step-2', array(&$sEmail, &$sPassword)); + + if (false === \strpos($sEmail, '@') || 0 === \strlen($sPassword)) + { + $this->loginErrorDelay(); + + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::InvalidInputArgument); + } + + $this->Logger()->AddSecret($sPassword); + + $sLogin = $sEmail; + if ($this->Config()->Get('login', 'login_lowercase', true)) + { + $sLogin = \MailSo\Base\Utils::StrToLowerIfAscii($sLogin); + } + + $this->Plugins()->RunHook('filter.login-credentials', array(&$sEmail, &$sLogin, &$sPassword)); + + $this->Logger()->AddSecret($sPassword); + + $this->Plugins()->RunHook('event.login-pre-login-provide', array()); + + $oAccount = null; + + try + { + $oAccount = $this->LoginProvide($sEmail, $sLogin, $sPassword, $sSignMeToken, true); + + if (!($oAccount instanceof \RainLoop\Model\Account)) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); + } + + $this->Plugins()->RunHook('event.login-post-login-provide', array(&$oAccount)); + + if (!($oAccount instanceof \RainLoop\Model\Account)) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); + } + } + catch (\Exception $oException) + { + $this->loginErrorDelay(); + $this->LoggerAuthHelper($oAccount, $this->getAdditionalLogParamsByUserLogin($sInputEmail)); + throw $oException; + } + + // 2FA + if (!$bSkipTwoFactorAuth && $this->TwoFactorAuthProvider()->IsActive()) + { + $aData = $this->getTwoFactorInfo($oAccount); + if ($aData && isset($aData['IsSet'], $aData['Enable']) && !empty($aData['Secret']) && $aData['IsSet'] && $aData['Enable']) + { + $sSecretHash = \md5(APP_SALT.$aData['Secret'].\RainLoop\Utils::Fingerprint()); + $sSecretCookieHash = \RainLoop\Utils::GetCookie(self::AUTH_TFA_SIGN_ME_TOKEN_KEY, ''); + + if (empty($sSecretCookieHash) || $sSecretHash !== $sSecretCookieHash) + { + $sAdditionalCode = \trim($sAdditionalCode); + if (empty($sAdditionalCode)) + { + $this->Logger()->Write('TFA: Required Code for '.$oAccount->ParentEmailHelper().' account.'); + + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AccountTwoFactorAuthRequired); + } + else + { + $this->Logger()->Write('TFA: Verify Code for '.$oAccount->ParentEmailHelper().' account.'); + + $bUseBackupCode = false; + if (6 < \strlen($sAdditionalCode) && !empty($aData['BackupCodes'])) + { + $aBackupCodes = \explode(' ', \trim(\preg_replace('/[^\d]+/', ' ', $aData['BackupCodes']))); + $bUseBackupCode = \in_array($sAdditionalCode, $aBackupCodes); + + if ($bUseBackupCode) + { + $this->removeBackupCodeFromTwoFactorInfo($oAccount->ParentEmailHelper(), $sAdditionalCode); + } + } + + if (!$bUseBackupCode && !$this->TwoFactorAuthProvider()->VerifyCode($aData['Secret'], $sAdditionalCode)) + { + $this->loginErrorDelay(); + + $this->LoggerAuthHelper($oAccount); + + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AccountTwoFactorAuthError); + } + + if ($bAdditionalCodeSignMe) + { + \RainLoop\Utils::SetCookie(self::AUTH_TFA_SIGN_ME_TOKEN_KEY, $sSecretHash, + \time() + 60 * 60 * 24 * 14); + } + } + } + } + } + + try + { + $this->CheckMailConnection($oAccount, true); + } + catch (\Exception $oException) + { + $this->loginErrorDelay(); + + throw $oException; + } + + return $oAccount; + } + + /** + * @param string $sEmail + * + * @return string + */ + private function generateSignMeToken($sEmail) + { + return \MailSo\Base\Utils::Md5Rand(APP_SALT.$sEmail); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoLogin() + { + $sEmail = \MailSo\Base\Utils::Trim($this->GetActionParam('Email', '')); + $sPassword = $this->GetActionParam('Password', ''); + $sLanguage = $this->GetActionParam('Language', ''); + $bSignMe = '1' === (string) $this->GetActionParam('SignMe', '0'); + + $sAdditionalCode = $this->GetActionParam('AdditionalCode', ''); + $bAdditionalCodeSignMe = '1' === (string) $this->GetActionParam('AdditionalCodeSignMe', '0'); + + $oAccount = null; + + $this->Logger()->AddSecret($sPassword); + + if ('sleep@sleep.dev' === $sEmail && 0 < \strlen($sPassword) && + \is_numeric($sPassword) && $this->Config()->Get('debug', 'enable', false) && + 0 < (int) $sPassword && 30 > (int) $sPassword + ) + { + \sleep((int) $sPassword); + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); + } + + try + { + $oAccount = $this->LoginProcess($sEmail, $sPassword, + $bSignMe ? $this->generateSignMeToken($sEmail) : '', + $sAdditionalCode, $bAdditionalCodeSignMe); + } + catch (\RainLoop\Exceptions\ClientException $oException) + { + if ($oException && + \RainLoop\Notifications::AccountTwoFactorAuthRequired === $oException->getCode()) + { + return $this->DefaultResponse(__FUNCTION__, true, array( + 'TwoFactorAuth' => true + )); + } + else + { + throw $oException; + } + } + + $this->AuthToken($oAccount); + + if ($oAccount && 0 < \strlen($sLanguage)) + { + $oSettings = $this->SettingsProvider()->Load($oAccount); + if ($oSettings) + { + $sLanguage = $this->ValidateLanguage($sLanguage); + $sCurrentLanguage = $oSettings->GetConf('Language', ''); + + if ($sCurrentLanguage !== $sLanguage) + { + $oSettings->SetConf('Language', $sLanguage); + $this->SettingsProvider()->Save($oAccount, $oSettings); + } + } + } + + return $this->TrueResponse(__FUNCTION__); + } + + /** + * @param \RainLoop\Model\Account $oAccount + * + * @return array + */ + public function GetAccounts($oAccount) + { + if ($this->GetCapa(false, false, \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS, $oAccount)) + { + $sAccounts = $this->StorageProvider()->Get($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'accounts' + ); + + $aAccounts = array(); + if ('' !== $sAccounts && '{' === \substr($sAccounts, 0, 1)) + { + $aAccounts = @\json_decode($sAccounts, true); + } + + if (\is_array($aAccounts) && 0 < \count($aAccounts)) + { + if (1 === \count($aAccounts)) + { + $this->SetAccounts($oAccount, array()); + + } + else if (1 < \count($aAccounts)) + { + $sOrder = $this->StorageProvider()->Get($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'accounts_identities_order' + ); + + $aOrder = empty($sOrder) ? array() : @\json_decode($sOrder, true); + if (isset($aOrder['Accounts']) && \is_array($aOrder['Accounts']) && + 1 < \count($aOrder['Accounts'])) + { + $aAccounts = \array_merge(\array_flip($aOrder['Accounts']), $aAccounts); + + $aAccounts = \array_filter($aAccounts, function ($sHash) { + return 5 < \strlen($sHash); + }); + } + } + + return $aAccounts; + } + } + + $aAccounts = array(); + if (!$oAccount->IsAdditionalAccount()) + { + $aAccounts[$oAccount->Email()] = $oAccount->GetAuthToken(); + } + + return $aAccounts; + } + + /** + * @param \RainLoop\Model\Account $oAccount + * + * @return array + */ + public function GetTemplates($oAccount) + { + $aTemplates = array(); + if ($oAccount) + { + $aData = array(); + + $sData = $this->StorageProvider(true)->Get($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'templates' + ); + + if ('' !== $sData && '[' === \substr($sData, 0, 1)) + { + $aData = @\json_decode($sData, true); + } + + if (\is_array($aData) && 0 < \count($aData)) + { + foreach ($aData as $aItem) + { + $oItem = \RainLoop\Model\Template::NewInstance(); + $oItem->FromJSON($aItem); + + if ($oItem && $oItem->Validate()) + { + \array_push($aTemplates, $oItem); + } + } + } + + if (1 < \count($aTemplates)) + { + $sOrder = $this->StorageProvider()->Get($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'templates_order' + ); + + $aOrder = empty($sOrder) ? array() : @\json_decode($sOrder, true); + if (\is_array($aOrder) && 1 < \count($aOrder)) + { + \usort($aTemplates, function ($a, $b) use ($aOrder) { + return \array_search($a->Id(), $aOrder) < \array_search($b->Id(), $aOrder) ? -1 : 1; + }); + } + } + } + + return $aTemplates; + } + + /** + * @param \RainLoop\Model\Account $oAccount + * @param string $sID + * + * @return \RainLoop\Model\Identity + */ + public function GetTemplateByID($oAccount, $sID) + { + $aTemplates = $this->GetTemplates($oAccount); + if (\is_array($aTemplates)) + { + foreach ($aTemplates as $oIdentity) + { + if ($oIdentity && $sID === $oIdentity->Id()) + { + return $oIdentity; + } + } + } + + return isset($aTemplates[0]) ? $aTemplates[0] : null; + } + + /** + * @param \RainLoop\Model\Account $oAccount + * + * @return array + */ + public function GetIdentities($oAccount) + { + $bAllowIdentities = $this->GetCapa(false, false, + \RainLoop\Enumerations\Capa::IDENTITIES, $oAccount); + + $aIdentities = array(); + if ($oAccount) + { + $aSubIdentities = array(); + + $sData = $this->StorageProvider(true)->Get($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'identities' + ); + + if ('' !== $sData && '[' === \substr($sData, 0, 1)) + { + $aSubIdentities = @\json_decode($sData, true); + } + + $bHasAccountIdentity = false; + + if (\is_array($aSubIdentities) && 0 < \count($aSubIdentities)) + { + foreach ($aSubIdentities as $aItem) + { + $oItem = \RainLoop\Model\Identity::NewInstance(); + $oItem->FromJSON($aItem); + + if ($oItem && $oItem->Validate()) + { + if ($oItem->IsAccountIdentities()) + { + $oItem->SetEmail($oAccount->Email()); + $bHasAccountIdentity = true; + + \array_push($aIdentities, $oItem); + } + else if ($bAllowIdentities) + { + \array_push($aIdentities, $oItem); + } + } + } + } + + if (!$bHasAccountIdentity) + { + \array_unshift($aIdentities, + \RainLoop\Model\Identity::NewInstanceFromAccount($oAccount)); + } + + if (1 < \count($aIdentities) && $bAllowIdentities) + { + $sOrder = $this->StorageProvider()->Get($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'accounts_identities_order' + ); + + $aOrder = empty($sOrder) ? array() : @\json_decode($sOrder, true); + if (isset($aOrder['Identities']) && \is_array($aOrder['Identities']) && + 1 < \count($aOrder['Identities'])) + { + $aList = $aOrder['Identities']; + foreach ($aList as $iIndex => $sItem) + { + if ('' === $sItem) + { + $aList[$iIndex] = '---'; + } + } + + \usort($aIdentities, function ($a, $b) use ($aList) { + return \array_search($a->Id(true), $aList) < \array_search($b->Id(true), $aList) ? -1 : 1; + }); + } + } + } + + return $aIdentities; + } + + /** + * @param \RainLoop\Model\Account $oAccount + * @param string $sID + * @param bool $bFirstOnEmpty = false + * + * @return \RainLoop\Model\Identity + */ + public function GetIdentityByID($oAccount, $sID, $bFirstOnEmpty = false) + { + $aIdentities = $this->GetIdentities($oAccount); + + if (\is_array($aIdentities)) + { + foreach ($aIdentities as $oIdentity) + { + if ($oIdentity && $sID === $oIdentity->Id()) + { + return $oIdentity; + } + } + } + + return $bFirstOnEmpty && \is_array($aIdentities) && isset($aIdentities[0]) ? $aIdentities[0] : null; + } + /** + * @param \RainLoop\Model\Account $oAccount + * + * @return \RainLoop\Model\Identity + */ + public function GetAccountIdentity($oAccount) + { + return $this->GetIdentityByID($oAccount, '', true); + } + + /** + * @param \RainLoop\Model\Account $oAccount + * @param array $aAccounts = array() + * + * @return array + */ + public function SetAccounts($oAccount, $aAccounts = array()) + { + $sParentEmail = $oAccount->ParentEmailHelper(); + if (!\is_array($aAccounts) || 0 >= \count($aAccounts) || + (1 === \count($aAccounts) && !empty($aAccounts[$sParentEmail]))) + { + $this->StorageProvider()->Clear($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'accounts' + ); + } + else + { + $this->StorageProvider()->Put($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'accounts', + @\json_encode($aAccounts) + ); + } + } + + /** + * @param \RainLoop\Model\Account $oAccount + * @param array $aIdentities = array() + * + * @return array + */ + public function SetIdentities($oAccount, $aIdentities = array()) + { + $bAllowIdentities = $this->GetCapa(false, false, \RainLoop\Enumerations\Capa::IDENTITIES, $oAccount); + + $aResult = array(); + foreach ($aIdentities as $oItem) + { + if (!$bAllowIdentities && $oItem && !$oItem->IsAccountIdentities()) + { + continue; + } + + $aResult[] = $oItem->ToSimpleJSON(false); + } + + return $this->StorageProvider(true)->Put($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'identities', + @\json_encode($aResult) + ); + } + + /** + * @param \RainLoop\Model\Account $oAccount + * @param array $aTemplates = array() + * + * @return array + */ + public function SetTemplates($oAccount, $aTemplates = array()) + { + $aResult = array(); + foreach ($aTemplates as $oItem) + { + $aResult[] = $oItem->ToSimpleJSON(false); + } + + return $this->StorageProvider(true)->Put($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'templates', + @\json_encode($aResult) + ); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoFilters() + { + $oAccount = $this->getAccountFromToken(); + + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FILTERS, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $aFakeFilters = null; + + $this->Plugins() + ->RunHook('filter.filters-fake', array($oAccount, &$aFakeFilters)) + ; + + if ($aFakeFilters) + { + return $this->DefaultResponse(__FUNCTION__, $aFakeFilters); + } + + return $this->DefaultResponse(__FUNCTION__, + $this->FiltersProvider()->Load($oAccount, $oAccount->DomainSieveAllowRaw())); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoFiltersSave() + { + $oAccount = $this->getAccountFromToken(); + + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FILTERS, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $aIncFilters = $this->GetActionParam('Filters', array()); + + $sRaw = $this->GetActionParam('Raw', ''); + $bRawIsActive = '1' === (string) $this->GetActionParam('RawIsActive', '0'); + + $aFilters = array(); + foreach ($aIncFilters as $aFilter) + { + if ($aFilter) + { + $oFilter = new \RainLoop\Providers\Filters\Classes\Filter(); + if ($oFilter->FromJSON($aFilter)) + { + $aFilters[] = $oFilter; + } + } + } + + $this->Plugins() + ->RunHook('filter.filters-save', array($oAccount, &$aFilters, &$sRaw, &$bRawIsActive)) + ; + + return $this->DefaultResponse(__FUNCTION__, $this->FiltersProvider()->Save($oAccount, + $aFilters, $sRaw, $bRawIsActive)); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoAccountSetup() + { + $oAccount = $this->getAccountFromToken(); + + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $sParentEmail = $oAccount->ParentEmailHelper(); + + $aAccounts = $this->GetAccounts($oAccount); + if (!\is_array($aAccounts)) + { + $aAccounts = array(); + } + + $sEmail = \trim($this->GetActionParam('Email', '')); + $sPassword = $this->GetActionParam('Password', ''); + $bNew = '1' === (string) $this->GetActionParam('New', '1'); + + $sEmail = \MailSo\Base\Utils::IdnToAscii($sEmail, true); + if ($bNew && ($oAccount->Email() === $sEmail || $sParentEmail === $sEmail || isset($aAccounts[$sEmail]))) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AccountAlreadyExists); + } + else if (!$bNew && !isset($aAccounts[$sEmail])) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AccountDoesNotExist); + } + + $oNewAccount = $this->LoginProcess($sEmail, $sPassword, '', '', false, true); + $oNewAccount->SetParentEmail($sParentEmail); + + $aAccounts[$oNewAccount->Email()] = $oNewAccount->GetAuthToken(); + if (!$oAccount->IsAdditionalAccount()) + { + $aAccounts[$oAccount->Email()] = $oAccount->GetAuthToken(); + } + + $this->SetAccounts($oAccount, $aAccounts); + return $this->TrueResponse(__FUNCTION__); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoAccountDelete() + { + $oAccount = $this->getAccountFromToken(); + + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $sParentEmail = $oAccount->ParentEmailHelper(); + $sEmailToDelete = \trim($this->GetActionParam('EmailToDelete', '')); + $sEmailToDelete = \MailSo\Base\Utils::IdnToAscii($sEmailToDelete, true); + + $aAccounts = $this->GetAccounts($oAccount); + + if (0 < \strlen($sEmailToDelete) && $sEmailToDelete !== $sParentEmail && \is_array($aAccounts) && isset($aAccounts[$sEmailToDelete])) + { + unset($aAccounts[$sEmailToDelete]); + + $oAccountToChange = null; + if ($oAccount->Email() === $sEmailToDelete && !empty($aAccounts[$sParentEmail])) + { + $oAccountToChange = $this->GetAccountFromCustomToken($aAccounts[$sParentEmail], false, false); + if ($oAccountToChange) + { + $this->AuthToken($oAccountToChange); + } + } + + $this->SetAccounts($oAccount, $aAccounts); + return $this->TrueResponse(__FUNCTION__, array('Reload' => !!$oAccountToChange)); + } + + return $this->FalseResponse(__FUNCTION__); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoAttachmentsActions() + { + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::ATTACHMENTS_ACTIONS)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $oAccount = $this->initMailClientConnection(); + + $sAction = $this->GetActionParam('Do', ''); + $aHashes = $this->GetActionParam('Hashes', null); + + $mResult = false; + $bError = false; + $aData = false; + + if (\is_array($aHashes) && 0 < \count($aHashes)) + { + $aData = array(); + foreach ($aHashes as $sZipHash) + { + $aResult = $this->getMimeFileByHash($oAccount, $sZipHash); + if (\is_array($aResult) && !empty($aResult['FileHash'])) + { + $aData[] = $aResult; + } + else + { + $bError = true; + break; + } + } + } + + $oFilesProvider = $this->FilesProvider(); + if (!empty($sAction) && !$bError && \is_array($aData) && 0 < \count($aData) && + $oFilesProvider && $oFilesProvider->IsActive()) + { + $bError = false; + switch (\strtolower($sAction)) + { + case 'zip': + + if (\class_exists('ZipArchive')) + { + $sZipHash = \MailSo\Base\Utils::Md5Rand(); + $sZipFileName = $oFilesProvider->GenerateLocalFullFileName($oAccount, $sZipHash); + + if (!empty($sZipFileName)) + { + $oZip = new \ZipArchive(); + $oZip->open($sZipFileName, \ZIPARCHIVE::CREATE | \ZIPARCHIVE::OVERWRITE); + $oZip->setArchiveComment('RainLoop/'.APP_VERSION); + + foreach ($aData as $aItem) + { + $sFileName = (string) (isset($aItem['FileName']) ? $aItem['FileName'] : 'file.dat'); + $sFileHash = (string) (isset($aItem['FileHash']) ? $aItem['FileHash'] : ''); + + if (!empty($sFileHash)) + { + $sFullFileNameHash = $oFilesProvider->GetFileName($oAccount, $sFileHash); + if (!$oZip->addFile($sFullFileNameHash, $sFileName)) + { + $bError = true; + } + } + } + + if (!$bError) + { + $bError = !$oZip->close(); + } + else + { + $oZip->close(); + } + } + + foreach ($aData as $aItem) + { + $sFileHash = (string) (isset($aItem['FileHash']) ? $aItem['FileHash'] : ''); + if (!empty($sFileHash)) + { + $oFilesProvider->Clear($oAccount, $sFileHash); + } + } + + if (!$bError) + { + $mResult = array( + 'Files' => array(array( + 'FileName' => 'attachments.zip', + 'Hash' => \RainLoop\Utils::EncodeKeyValuesQ(array( + 'V' => APP_VERSION, + 'Account' => $oAccount ? \md5($oAccount->Hash()) : '', + 'FileName' => 'attachments.zip', + 'MimeType' => 'application/zip', + 'FileHash' => $sZipHash + )) + )) + ); + } + } + break; + + case 'owncloud': + + $mResult = false; + + if (\RainLoop\Utils::IsOwnCloudLoggedIn() && \class_exists('OCP\Files')) + { + $sSaveFolder = $this->Config()->Get('labs', 'owncloud_save_folder', ''); + if (empty($sSaveFolder)) + { + $sSaveFolder = 'Attachments'; + } + + $oFiles = \OCP\Files::getStorage('files'); + + if ($oFilesProvider && $oFiles && $oFilesProvider->IsActive() && + \method_exists($oFiles, 'file_put_contents')) + { + if (!$oFiles->is_dir($sSaveFolder)) + { + $oFiles->mkdir($sSaveFolder); + } + + $mResult = true; + foreach ($aData as $aItem) + { + $sSavedFileName = isset($aItem['FileName']) ? $aItem['FileName'] : 'file.dat'; + $sSavedFileHash = !empty($aItem['FileHash']) ? $aItem['FileHash'] : ''; + + if (!empty($sSavedFileHash)) + { + $fFile = $oFilesProvider->GetFile($oAccount, $sSavedFileHash, 'rb'); + if (\is_resource($fFile)) + { + $sSavedFileNameFull = \MailSo\Base\Utils::SmartFileExists($sSaveFolder.'/'.$sSavedFileName, function ($sPath) use ($oFiles) { + return $oFiles->file_exists($sPath); + }); + + if (!$oFiles->file_put_contents($sSavedFileNameFull, $fFile)) + { + $mResult = false; + } + + if (\is_resource($fFile)) + { + @\fclose($fFile); + } + } + } + } + } + } + + foreach ($aData as $aItem) + { + $sFileHash = (string) (isset($aItem['FileHash']) ? $aItem['FileHash'] : ''); + if (!empty($sFileHash)) + { + $oFilesProvider->Clear($oAccount, $sFileHash); + } + } + + break; + + case 'dropbox': + + $mResult = array( + 'ShortLife' => '_'.$this->GetShortLifeSpecAuthToken(), + 'Url' => \preg_replace('/\?(.*)$/', '', $this->Http()->GetFullUrl()), + 'Files' => array() + ); + + foreach ($aData as $aItem) + { + $mResult['Files'][] = array( + 'FileName' => isset($aItem['FileName']) ? $aItem['FileName'] : 'file.dat', + 'Hash' => \RainLoop\Utils::EncodeKeyValuesQ($aItem) + ); + } + + break; + } + } + else + { + $bError = true; + } + + $this->requestSleep(); + return $this->DefaultResponse(__FUNCTION__, $bError ? false : $mResult); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoIdentityUpdate() + { + $oAccount = $this->getAccountFromToken(); + + $oIdentity = \RainLoop\Model\Identity::NewInstance(); + if (!$oIdentity->FromJSON($this->GetActionParams(), true)) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::InvalidInputArgument); + } + + $aIdentities = $this->GetIdentities($oAccount); + + $bAdded = false; + $aIdentitiesForSave = array(); + foreach ($aIdentities as $oItem) + { + if ($oItem) + { + if ($oItem->Id() === $oIdentity->Id()) + { + $aIdentitiesForSave[] = $oIdentity; + $bAdded = true; + } + else + { + $aIdentitiesForSave[] = $oItem; + } + } + } + + if (!$bAdded) + { + $aIdentitiesForSave[] = $oIdentity; + } + + return $this->DefaultResponse(__FUNCTION__, $this->SetIdentities($oAccount, $aIdentitiesForSave)); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoIdentityDelete() + { + $oAccount = $this->getAccountFromToken(); + + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::IDENTITIES, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $sId = \trim($this->GetActionParam('IdToDelete', '')); + if (empty($sId)) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::UnknownError); + } + + $aNew = array(); + $aIdentities = $this->GetIdentities($oAccount); + + foreach ($aIdentities as $oItem) + { + if ($oItem && $sId !== $oItem->Id()) + { + $aNew[] = $oItem; + } + } + + return $this->DefaultResponse(__FUNCTION__, $this->SetIdentities($oAccount, $aNew)); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoTemplateSetup() + { + $oAccount = $this->getAccountFromToken(); + + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TEMPLATES, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $oTemplate = \RainLoop\Model\Template::NewInstance(); + if (!$oTemplate->FromJSON($this->GetActionParams(), true)) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::InvalidInputArgument); + } + + if ('' === $oTemplate->Id()) + { + $oTemplate->GenerateID(); + } + + $aTemplatesForSave = array(); + $aTemplates = $this->GetTemplates($oAccount); + + + foreach ($aTemplates as $oItem) + { + if ($oItem && $oItem->Id() !== $oTemplate->Id()) + { + $aTemplatesForSave[] = $oItem; + } + } + + $aTemplatesForSave[] = $oTemplate; + + return $this->DefaultResponse(__FUNCTION__, $this->SetTemplates($oAccount, $aTemplatesForSave)); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoTemplateDelete() + { + $oAccount = $this->getAccountFromToken(); + + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TEMPLATES, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $sId = \trim($this->GetActionParam('IdToDelete', '')); + if (empty($sId)) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::UnknownError); + } + + $aNew = array(); + $aTemplates = $this->GetTemplates($oAccount); + foreach ($aTemplates as $oItem) + { + if ($oItem && $sId !== $oItem->Id()) + { + $aNew[] = $oItem; + } + } + + return $this->DefaultResponse(__FUNCTION__, $this->SetTemplates($oAccount, $aNew)); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoTemplateGetByID() + { + $oAccount = $this->getAccountFromToken(); + + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TEMPLATES, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $sId = \trim($this->GetActionParam('ID', '')); + if (empty($sId)) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::UnknownError); + } + + $oTemplate = false; + $aTemplates = $this->GetTemplates($oAccount); + + foreach ($aTemplates as $oItem) + { + if ($oItem && $sId === $oItem->Id()) + { + $oTemplate = $oItem; + break; + } + } + + $oTemplate->SetPopulateAlways(true); + return $this->DefaultResponse(__FUNCTION__, $oTemplate); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoAccountsAndIdentitiesSortOrder() + { + $oAccount = $this->getAccountFromToken(); + + $aAccounts = $this->GetActionParam('Accounts', null); + $aIdentities = $this->GetActionParam('Identities', null); + + if (!\is_array($aAccounts) && !\is_array($aIdentities)) + { + return $this->FalseResponse(__FUNCTION__); + } + + return $this->DefaultResponse(__FUNCTION__, $this->StorageProvider()->Put($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'accounts_identities_order', + \json_encode(array( + 'Accounts' => \is_array($aAccounts) ? $aAccounts : array(), + 'Identities' => \is_array($aIdentities) ? $aIdentities : array() + )) + )); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoAccountsAndIdentities() + { + $oAccount = $this->getAccountFromToken(); + + $mAccounts = false; + + if ($this->GetCapa(false, false, \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS, $oAccount)) + { + $mAccounts = $this->GetAccounts($oAccount); + $mAccounts = \array_keys($mAccounts); + + foreach ($mAccounts as $iIndex => $sName) + { + $mAccounts[$iIndex] = \MailSo\Base\Utils::IdnToUtf8($sName); + } + } + + return $this->DefaultResponse(__FUNCTION__, array( + 'Accounts' => $mAccounts, + 'Identities' => $this->GetIdentities($oAccount) + )); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoTemplates() + { + $oAccount = $this->getAccountFromToken(); + + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TEMPLATES, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + return $this->DefaultResponse(__FUNCTION__, array( + 'Templates' => $this->GetTemplates($oAccount) + )); + } + + /** + * @param string $sHash + * + * @return int + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function getAccountUnredCountFromHash($sHash) + { + $iResult = 0; + + $oAccount = $this->GetAccountFromCustomToken($sHash, false); + if ($oAccount) + { + try + { + $oMailClient = \MailSo\Mail\MailClient::NewInstance(); + $oMailClient->SetLogger($this->Logger()); + + $oAccount->IncConnectAndLoginHelper($this->Plugins(),$oMailClient, $this->Config()); + + $iResult = $oMailClient->InboxUnreadCount(); + + $oMailClient->LogoutAndDisconnect(); + } + catch (\Exception $oException) + { + $this->Logger()->WriteException($oException); + } + } + + return $iResult; + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoAccountsCounts() + { + $oAccount = $this->getAccountFromToken(); + + $bComplete = true; + $aCounts = array(); + + if ($this->GetCapa(false, false, \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS, $oAccount)) + { + $iLimit = 7; + $mAccounts = $this->GetAccounts($oAccount); + if (\is_array($mAccounts) && 0 < \count($mAccounts)) + { + if ($iLimit > \count($mAccounts)) + { + $mAccounts = \array_slice($mAccounts, 0, $iLimit); + } + else + { + $bComplete = false; + } + + if (0 < \count($mAccounts)) + { + foreach ($mAccounts as $sEmail => $sHash) + { + $aCounts[] = array(\MailSo\Base\Utils::IdnToUtf8($sEmail), + $oAccount->Email() === $sEmail ? 0 : $this->getAccountUnredCountFromHash($sHash)); + } + } + } + } + else + { + $aCounts[] = array(\MailSo\Base\Utils::IdnToUtf8($oAccount->Email()), 0); + } + + return $this->DefaultResponse(__FUNCTION__, array( + 'Complete' => $bComplete, + 'Counts' => $aCounts + )); + } + + /** + * @param \RainLoop\Model\Account $oAccount + */ + public function ClearSignMeData($oAccount) + { + if ($oAccount) + { + \RainLoop\Utils::ClearCookie(\RainLoop\Actions::AUTH_SIGN_ME_TOKEN_KEY); + + $this->StorageProvider()->Clear($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'sign_me' + ); + } + } + + /** + * @return array + */ + public function DoLogout() + { + $oAccount = $this->getAccountFromToken(false); + if ($oAccount) + { + if ($oAccount->SignMe()) + { + $this->ClearSignMeData($oAccount); + } + + if (!$oAccount->IsAdditionalAccount()) + { + \RainLoop\Utils::ClearCookie(\RainLoop\Actions::AUTH_SPEC_TOKEN_KEY); + } + } + + return $this->TrueResponse(__FUNCTION__); + } + + /** + * @return array + */ + public function DoAppDelayStart() + { + $this->Plugins()->RunHook('service.app-delay-start-begin'); + + \RainLoop\Utils::UpdateConnectionToken(); + + $bMainCache = false; + $bFilesCache = false; + $bVersionsCache = false; + + $iOneDay1 = 60 * 60 * 23; + $iOneDay2 = 60 * 60 * 25; + $iOneDay3 = 60 * 60 * 30; + + $sTimers = $this->StorageProvider()->Get(null, + \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, 'Cache/Timers', ''); + + $aTimers = \explode(',', $sTimers); + + $iMainCacheTime = !empty($aTimers[0]) && \is_numeric($aTimers[0]) ? (int) $aTimers[0] : 0; + $iFilesCacheTime = !empty($aTimers[1]) && \is_numeric($aTimers[1]) ? (int) $aTimers[1] : 0; + $iVersionsCacheTime = !empty($aTimers[2]) && \is_numeric($aTimers[2]) ? (int) $aTimers[2] : 0; + + if (0 === $iMainCacheTime || $iMainCacheTime + $iOneDay1 < \time()) + { + $bMainCache = true; + $iMainCacheTime = \time(); + } + + if (0 === $iFilesCacheTime || $iFilesCacheTime + $iOneDay2 < \time()) + { + $bFilesCache = true; + $iFilesCacheTime = \time(); + } + + if (0 === $iVersionsCacheTime || $iVersionsCacheTime + $iOneDay3 < \time()) + { + $bVersionsCache = true; + $iVersionsCacheTime = \time(); + } + + if ($bMainCache || $bFilesCache || $bVersionsCache) + { + if (!$this->StorageProvider()->Put(null, + \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, 'Cache/Timers', + \implode(',', array($iMainCacheTime, $iFilesCacheTime, $iVersionsCacheTime)))) + { + $bMainCache = $bFilesCache = $bVersionsCache = false; + } + } + + if ($bMainCache) + { + $this->Logger()->Write('Cacher GC: Begin'); + $this->Cacher()->GC(48); + $this->Logger()->Write('Cacher GC: End'); + } + else if ($bFilesCache) + { + $this->Logger()->Write('Files GC: Begin'); + $this->FilesProvider()->GC(48); + $this->Logger()->Write('Files GC: End'); + } + else if ($bVersionsCache) + { + $oPremProvider = $this->PremProvider(); + if ($oPremProvider) + { + $oPremProvider->ClearOldVersion(); + } + } + + $this->Plugins()->RunHook('service.app-delay-start-end'); + + return $this->TrueResponse(__FUNCTION__); + } + + /** + * @return array + */ + public function DoSystemFoldersUpdate() + { + $oAccount = $this->getAccountFromToken(); + + $oSettingsLocal = $this->SettingsProvider(true)->Load($oAccount); + + $oSettingsLocal->SetConf('SentFolder', $this->GetActionParam('SentFolder', '')); + $oSettingsLocal->SetConf('DraftFolder', $this->GetActionParam('DraftFolder', '')); + $oSettingsLocal->SetConf('SpamFolder', $this->GetActionParam('SpamFolder', '')); + $oSettingsLocal->SetConf('TrashFolder', $this->GetActionParam('TrashFolder', '')); + $oSettingsLocal->SetConf('ArchiveFolder', $this->GetActionParam('ArchiveFolder', '')); + $oSettingsLocal->SetConf('NullFolder', $this->GetActionParam('NullFolder', '')); + + return $this->DefaultResponse(__FUNCTION__, + $this->SettingsProvider(true)->Save($oAccount, $oSettingsLocal)); + } + + /** + * @param \RainLoop\Config\Application $oConfig + * @param string $sParamName + * @param string $sConfigSector + * @param string $sConfigName + * @param string $sType = 'string' + * @param callable|null $mStringCallback = null + */ + public function setConfigFromParams(&$oConfig, $sParamName, $sConfigSector, $sConfigName, $sType = 'string', $mStringCallback = null) + { + $sValue = $this->GetActionParam($sParamName, ''); + if ($this->HasActionParam($sParamName)) + { + switch ($sType) + { + default: + case 'string': + $sValue = (string) $sValue; + if ($mStringCallback && is_callable($mStringCallback)) + { + $sValue = call_user_func($mStringCallback, $sValue); + } + + $oConfig->Set($sConfigSector, $sConfigName, (string) $sValue); + break; + + case 'dummy': + $sValue = (string) $this->GetActionParam('ContactsPdoPassword', APP_DUMMY); + if (APP_DUMMY !== $sValue) + { + $oConfig->Set($sConfigSector, $sConfigName, (string) $sValue); + } + break; + + case 'int': + $iValue = (int) $sValue; + $oConfig->Set($sConfigSector, $sConfigName, $iValue); + break; + + case 'bool': + $oConfig->Set($sConfigSector, $sConfigName, '1' === (string) $sValue); + break; + } + } + } + + /** + * @param \RainLoop\Config\Application $oConfig + * @param string $sParamName + * @param string $sCapa + */ + private function setCapaFromParams(&$oConfig, $sParamName, $sCapa) + { + switch ($sCapa) + { + case \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS: + $this->setConfigFromParams($oConfig, $sParamName, 'webmail', 'allow_additional_accounts', 'bool'); + break; + case \RainLoop\Enumerations\Capa::IDENTITIES: + $this->setConfigFromParams($oConfig, $sParamName, 'webmail', 'allow_additional_identities', 'bool'); + break; + case \RainLoop\Enumerations\Capa::TEMPLATES: + $this->setConfigFromParams($oConfig, $sParamName, 'capa', 'x-templates', 'bool'); + break; + case \RainLoop\Enumerations\Capa::TWO_FACTOR: + $this->setConfigFromParams($oConfig, $sParamName, 'security', 'allow_two_factor_auth', 'bool'); + break; + case \RainLoop\Enumerations\Capa::TWO_FACTOR_FORCE: + $this->setConfigFromParams($oConfig, $sParamName, 'security', 'force_two_factor_auth', 'bool'); + break; + case \RainLoop\Enumerations\Capa::GRAVATAR: + $this->setConfigFromParams($oConfig, $sParamName, 'labs', 'allow_gravatar', 'bool'); + break; + case \RainLoop\Enumerations\Capa::ATTACHMENT_THUMBNAILS: + $this->setConfigFromParams($oConfig, $sParamName, 'interface', 'show_attachment_thumbnail', 'bool'); + break; + case \RainLoop\Enumerations\Capa::THEMES: + $this->setConfigFromParams($oConfig, $sParamName, 'webmail', 'allow_themes', 'bool'); + break; + case \RainLoop\Enumerations\Capa::USER_BACKGROUND: + $this->setConfigFromParams($oConfig, $sParamName, 'webmail', 'allow_user_background', 'bool'); + break; + case \RainLoop\Enumerations\Capa::OPEN_PGP: + $this->setConfigFromParams($oConfig, $sParamName, 'security', 'openpgp', 'bool'); + break; + } + } + + /** + * @param \RainLoop\Settings $oSettings + * @param string $sConfigName + * @param string $sType = 'string' + * @param callable|null $mStringCallback = null + */ + private function setSettingsFromParams(&$oSettings, $sConfigName, $sType = 'string', $mStringCallback = null) + { + if ($this->HasActionParam($sConfigName)) + { + $sValue = $this->GetActionParam($sConfigName, ''); + switch ($sType) + { + default: + case 'string': + $sValue = (string) $sValue; + if ($mStringCallback && is_callable($mStringCallback)) + { + $sValue = call_user_func($mStringCallback, $sValue); + } + + $oSettings->SetConf($sConfigName, (string) $sValue); + break; + + case 'int': + $iValue = (int) $sValue; + $oSettings->SetConf($sConfigName, $iValue); + break; + + case 'bool': + $oSettings->SetConf($sConfigName, '1' === (string) $sValue); + break; + } + } + } + + /** + * @return array + */ + public function DoAdminSettingsUpdate() + { +// sleep(3); +// return $this->DefaultResponse(__FUNCTION__, false); + + $this->IsAdminLoggined(); + + $oConfig = $this->Config(); + + $self = $this; + + $this->setConfigFromParams($oConfig, 'Language', 'webmail', 'language', 'string', function ($sLanguage) use ($self) { + return $self->ValidateLanguage($sLanguage, '', false); + }); + + $this->setConfigFromParams($oConfig, 'LanguageAdmin', 'webmail', 'language_admin', 'string', function ($sLanguage) use ($self) { + return $self->ValidateLanguage($sLanguage, '', true); + }); + + $this->setConfigFromParams($oConfig, 'Theme', 'webmail', 'theme', 'string', function ($sTheme) use ($self) { + return $self->ValidateTheme($sTheme); + }); + + $this->setConfigFromParams($oConfig, 'VerifySslCertificate', 'ssl', 'verify_certificate', 'bool'); + $this->setConfigFromParams($oConfig, 'AllowSelfSigned', 'ssl', 'allow_self_signed', 'bool'); + + $this->setConfigFromParams($oConfig, 'UseLocalProxyForExternalImages', 'labs', 'use_local_proxy_for_external_images', 'bool'); + + $this->setConfigFromParams($oConfig, 'NewMoveToFolder', 'interface', 'new_move_to_folder_button', 'bool'); + + $this->setConfigFromParams($oConfig, 'AllowLanguagesOnSettings', 'webmail', 'allow_languages_on_settings', 'bool'); + $this->setConfigFromParams($oConfig, 'AllowLanguagesOnLogin', 'login', 'allow_languages_on_login', 'bool'); + $this->setConfigFromParams($oConfig, 'AttachmentLimit', 'webmail', 'attachment_size_limit', 'int'); + + $this->setConfigFromParams($oConfig, 'LoginDefaultDomain', 'login', 'default_domain', 'string'); + + $this->setConfigFromParams($oConfig, 'ContactsEnable', 'contacts', 'enable', 'bool'); + $this->setConfigFromParams($oConfig, 'ContactsSync', 'contacts', 'allow_sync', 'bool'); + $this->setConfigFromParams($oConfig, 'ContactsPdoDsn', 'contacts', 'pdo_dsn', 'string'); + $this->setConfigFromParams($oConfig, 'ContactsPdoUser', 'contacts', 'pdo_user', 'string'); + $this->setConfigFromParams($oConfig, 'ContactsPdoPassword', 'contacts', 'pdo_password', 'dummy'); + + $this->setConfigFromParams($oConfig, 'ContactsPdoType', 'contacts', 'type', 'string', function ($sType) use ($self) { + return $self->ValidateContactPdoType($sType); + }); + + $this->setCapaFromParams($oConfig, 'CapaAdditionalAccounts', \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS); + $this->setCapaFromParams($oConfig, 'CapaIdentities', \RainLoop\Enumerations\Capa::IDENTITIES); + $this->setCapaFromParams($oConfig, 'CapaTemplates', \RainLoop\Enumerations\Capa::TEMPLATES); + $this->setCapaFromParams($oConfig, 'CapaTwoFactorAuth', \RainLoop\Enumerations\Capa::TWO_FACTOR); + $this->setCapaFromParams($oConfig, 'CapaTwoFactorAuthForce', \RainLoop\Enumerations\Capa::TWO_FACTOR_FORCE); + $this->setCapaFromParams($oConfig, 'CapaOpenPGP', \RainLoop\Enumerations\Capa::OPEN_PGP); + $this->setCapaFromParams($oConfig, 'CapaGravatar', \RainLoop\Enumerations\Capa::GRAVATAR); + $this->setCapaFromParams($oConfig, 'CapaThemes', \RainLoop\Enumerations\Capa::THEMES); + $this->setCapaFromParams($oConfig, 'CapaUserBackground', \RainLoop\Enumerations\Capa::USER_BACKGROUND); + $this->setCapaFromParams($oConfig, 'CapaAttachmentThumbnails', \RainLoop\Enumerations\Capa::ATTACHMENT_THUMBNAILS); + + $this->setConfigFromParams($oConfig, 'DetermineUserLanguage', 'login', 'determine_user_language', 'bool'); + $this->setConfigFromParams($oConfig, 'DetermineUserDomain', 'login', 'determine_user_domain', 'bool'); + + $this->setConfigFromParams($oConfig, 'Title', 'webmail', 'title', 'string'); + $this->setConfigFromParams($oConfig, 'LoadingDescription', 'webmail', 'loading_description', 'string'); + $this->setConfigFromParams($oConfig, 'FaviconUrl', 'webmail', 'favicon_url', 'string'); + + $this->setConfigFromParams($oConfig, 'TokenProtection', 'security', 'csrf_protection', 'bool'); + $this->setConfigFromParams($oConfig, 'EnabledPlugins', 'plugins', 'enable', 'bool'); + + $this->setConfigFromParams($oConfig, 'GoogleEnable', 'social', 'google_enable', 'bool'); + $this->setConfigFromParams($oConfig, 'GoogleEnableAuth', 'social', 'google_enable_auth', 'bool'); + $this->setConfigFromParams($oConfig, 'GoogleEnableAuthFast', 'social', 'google_enable_auth_fast', 'bool'); + $this->setConfigFromParams($oConfig, 'GoogleEnableDrive', 'social', 'google_enable_drive', 'bool'); + $this->setConfigFromParams($oConfig, 'GoogleEnablePreview', 'social', 'google_enable_preview', 'bool'); + $this->setConfigFromParams($oConfig, 'GoogleClientID', 'social', 'google_client_id', 'string'); + $this->setConfigFromParams($oConfig, 'GoogleClientSecret', 'social', 'google_client_secret', 'string'); + $this->setConfigFromParams($oConfig, 'GoogleApiKey', 'social', 'google_api_key', 'string'); + + $this->setConfigFromParams($oConfig, 'FacebookEnable', 'social', 'fb_enable', 'bool'); + $this->setConfigFromParams($oConfig, 'FacebookAppID', 'social', 'fb_app_id', 'string'); + $this->setConfigFromParams($oConfig, 'FacebookAppSecret', 'social', 'fb_app_secret', 'string'); + + $this->setConfigFromParams($oConfig, 'TwitterEnable', 'social', 'twitter_enable', 'bool'); + $this->setConfigFromParams($oConfig, 'TwitterConsumerKey', 'social', 'twitter_consumer_key', 'string'); + $this->setConfigFromParams($oConfig, 'TwitterConsumerSecret', 'social', 'twitter_consumer_secret', 'string'); + + $this->setConfigFromParams($oConfig, 'DropboxEnable', 'social', 'dropbox_enable', 'bool'); + $this->setConfigFromParams($oConfig, 'DropboxApiKey', 'social', 'dropbox_api_key', 'string'); + + $oPremProvider = $this->PremProvider(); + if ($oPremProvider) + { + $oPremProvider->PremSection($this, $oConfig); + } + + return $this->DefaultResponse(__FUNCTION__, $oConfig->Save()); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoAdminLogin() + { + $sLogin = trim($this->GetActionParam('Login', '')); + $sPassword = $this->GetActionParam('Password', ''); + + $this->Logger()->AddSecret($sPassword); + + if (0 === strlen($sLogin) || 0 === strlen($sPassword) || + !$this->Config()->Get('security', 'allow_admin_panel', true) || + $sLogin !== $this->Config()->Get('security', 'admin_login', '') || + !$this->Config()->ValidatePassword($sPassword)) + { + $this->loginErrorDelay(); + $this->LoggerAuthHelper(null, $this->getAdditionalLogParamsByUserLogin($sLogin, true)); + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); + } + + $sToken = $this->getAdminToken(); + $this->setAdminAuthToken($sToken); + + return $this->DefaultResponse(__FUNCTION__, $sToken ? true : false); + } + + /** + * @return array + */ + public function DoAdminLogout() + { + $this->ClearAdminAuthToken(); + return $this->TrueResponse(__FUNCTION__); + } + + /** + * @return array + */ + public function DoAdminPing() + { + $this->IsAdminLoggined(); + + return $this->DefaultResponse(__FUNCTION__, true); + } + + /** + * @return array + */ + public function DoAdminContactsTest() + { + $this->IsAdminLoggined(); + + $oConfig = $this->Config(); + + $this->setConfigFromParams($oConfig, 'ContactsPdoDsn', 'contacts', 'pdo_dsn', 'string'); + $this->setConfigFromParams($oConfig, 'ContactsPdoUser', 'contacts', 'pdo_user', 'string'); + $this->setConfigFromParams($oConfig, 'ContactsPdoPassword', 'contacts', 'pdo_password', 'dummy'); + + $self = $this; + $this->setConfigFromParams($oConfig, 'ContactsPdoType', 'contacts', 'type', 'string', function ($sType) use ($self) { + return $self->ValidateContactPdoType($sType); + }); + + $sTestMessage = $this->AddressBookProvider(null, true)->Test(); + return $this->DefaultResponse(__FUNCTION__, array( + 'Result' => '' === $sTestMessage, + 'Message' => \MailSo\Base\Utils::Utf8Clear($sTestMessage, '?') + )); + } + + /** + * @return array + */ + public function DoAdminLicensing() + { + $this->IsAdminLoggined(); + + $bForce = '1' === (string) $this->GetActionParam('Force', '0'); + + $mResult = false; + $iErrorCode = -1; + + $oPremProvider = $this->PremProvider(); + + if ($oPremProvider && 2 < \strlen(APP_SITE)) + { + $sValue = $oPremProvider->Fetcher($bForce); + + $this->requestSleep(); + + $iExpired = 0; + if ($oPremProvider->Parser($sValue, $iExpired)) + { + $mResult = array( + 'Banned' => false, + 'Expired' => $iExpired, + ); + } + else if ($sValue === 'NO' || \preg_match('/^EXPIRED:[\d]+$/', $sValue)) + { + $iErrorCode = -1; + } + else if ($sValue === 'TOO_MANY_CONNECTIONS') + { + $iErrorCode = -1; + } + else + { + $iErrorCode = \RainLoop\Notifications::LicensingServerIsUnavailable; + } + } + + if (0 < $iErrorCode && !$mResult) + { + throw new \RainLoop\Exceptions\ClientException($iErrorCode); + } + + return $this->DefaultResponse(__FUNCTION__, $mResult); + } + + /** + * @return array + */ + public function DoAdminLicensingActivate() + { + $this->IsAdminLoggined(); + + $sDomain = (string) $this->GetActionParam('Domain', ''); + $sKey = (string) $this->GetActionParam('Key', ''); + + $mResult = false; + $iErrorCode = -1; + + $oPrem = $this->PremProvider(); + + if ($oPrem && 2 < \strlen($sDomain) && 2 < \strlen($sKey) && $sDomain === APP_SITE) + { + $iCode = 0; + $sValue = $oPrem->Activate($sDomain, $sKey, $iCode); + + $this->requestSleep(); + + $aMatch = array(); + if ('OK' === $sValue) + { + $mResult = true; + } + else if ('TOO_MANY_CONNECTIONS' === $sValue) + { + $mResult = 'Too many connections. Please try again later.'; + } + else if (\preg_match('/^ERROR:(.+)$/', $sValue, $aMatch) && !empty($aMatch[1])) + { + $mResult = trim($aMatch[1]); + + $this->Logger()->Write('Activation error for: '.$sKey.' ('.$sDomain.')', \MailSo\Log\Enumerations\Type::ERROR); + $this->Logger()->Write($mResult, \MailSo\Log\Enumerations\Type::ERROR); + } + else + { + $iErrorCode = \RainLoop\Notifications::LicensingServerIsUnavailable; + } + } + + if (0 < $iErrorCode && !$mResult) + { + throw new \RainLoop\Exceptions\ClientException($iErrorCode); + } + + return $this->DefaultResponse(__FUNCTION__, $mResult); + } + + /** + * @return array + */ + public function DoAdminPasswordUpdate() + { + $this->IsAdminLoggined(); + + $bResult = false; + $oConfig = $this->Config(); + + $sLogin = \trim($this->GetActionParam('Login', '')); + $sPassword = $this->GetActionParam('Password', ''); + $this->Logger()->AddSecret($sPassword); + + $sNewPassword = $this->GetActionParam('NewPassword', ''); + if (0 < \strlen(\trim($sNewPassword))) + { + $this->Logger()->AddSecret($sNewPassword); + } + + if ($oConfig->ValidatePassword($sPassword)) + { + if (0 < \strlen($sLogin)) + { + $oConfig->Set('security', 'admin_login', $sLogin); + } + + if (0 < \strlen(\trim($sNewPassword))) + { + $oConfig->SetPassword($sNewPassword); + } + + $bResult = true; + } + + return $this->DefaultResponse(__FUNCTION__, $bResult ? + ($oConfig->Save() ? array('Weak' => $oConfig->ValidatePassword('12345')) : false) : false); + } + + /** + * @return array + */ + public function DoAdminDomainLoad() + { + $this->IsAdminLoggined(); + + return $this->DefaultResponse(__FUNCTION__, + $this->DomainProvider()->Load($this->GetActionParam('Name', ''), false, false)); + } + + /** + * @return array + */ + public function DoAdminDomainList() + { + $this->IsAdminLoggined(); + + $iOffset = (int) $this->GetActionParam('Offset', 0); + $iLimit = (int) $this->GetActionParam('Limit', 20); + $sSearch = (string) $this->GetActionParam('Search', ''); + $bIncludeAliases = '1' === (string) $this->GetActionParam('IncludeAliases', '1'); + + $iOffset = 0; + $sSearch = ''; + $iLimit = $this->Config()->Get('labs', 'domain_list_limit', 99); + + return $this->DefaultResponse(__FUNCTION__, + $this->DomainProvider()->GetList($iOffset, $iLimit, $sSearch, $bIncludeAliases)); + } + + /** + * @return array + */ + public function DoAdminDomainDelete() + { + $this->IsAdminLoggined(); + + return $this->DefaultResponse(__FUNCTION__, + $this->DomainProvider()->Delete((string) $this->GetActionParam('Name', ''))); + } + + /** + * @return array + */ + public function DoAdminDomainDisable() + { + $this->IsAdminLoggined(); + + return $this->DefaultResponse(__FUNCTION__, $this->DomainProvider()->Disable( + (string) $this->GetActionParam('Name', ''), + '1' === (string) $this->GetActionParam('Disabled', '0') + )); + } + + /** + * @return array + */ + public function DoAdminDomainSave() + { + $this->IsAdminLoggined(); + + $oDomain = $this->DomainProvider()->LoadOrCreateNewFromAction($this); + + return $this->DefaultResponse(__FUNCTION__, + $oDomain instanceof \RainLoop\Model\Domain ? $this->DomainProvider()->Save($oDomain) : false); + } + + /** + * @return array + */ + public function DoAdminDomainAliasSave() + { + $this->IsAdminLoggined(); + + return $this->DefaultResponse(__FUNCTION__, $this->DomainProvider()->SaveAlias( + (string) $this->GetActionParam('Name', ''), + (string) $this->GetActionParam('Alias', '') + )); + } + + /** + * @return array + */ + public function DoAdminDomainTest() + { + $this->IsAdminLoggined(); + + $bImapResult = false; + $sImapErrorDesc = ''; + $bSmtpResult = false; + $sSmtpErrorDesc = ''; + $bSieveResult = false; + $sSieveErrorDesc = ''; + + $iImapTime = 0; + $iSmtpTime = 0; + $iSieveTime = 0; + + $iConnectionTimeout = 5; + + $oDomain = $this->DomainProvider()->LoadOrCreateNewFromAction($this, 'domain-test-connection.de'); + if ($oDomain) + { + try + { + $oImapClient = \MailSo\Imap\ImapClient::NewInstance()->SetLogger($this->Logger()); + $oImapClient->SetTimeOuts($iConnectionTimeout); + + $iTime = \microtime(true); + $oImapClient->Connect($oDomain->IncHost(), $oDomain->IncPort(), $oDomain->IncSecure(), + !!$this->Config()->Get('ssl', 'verify_certificate', false), + !!$this->Config()->Get('ssl', 'allow_self_signed', true) + ); + + $iImapTime = \microtime(true) - $iTime; + $oImapClient->Disconnect(); + $bImapResult = true; + } + catch (\MailSo\Net\Exceptions\SocketCanNotConnectToHostException $oException) + { + $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); + $sImapErrorDesc = $oException->getSocketMessage(); + if (empty($sImapErrorDesc)) + { + $sImapErrorDesc = $oException->getMessage(); + } + } + catch (\Exception $oException) + { + $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); + $sImapErrorDesc = $oException->getMessage(); + } + + if ($oDomain->OutUsePhpMail()) + { + $bSmtpResult = \MailSo\Base\Utils::FunctionExistsAndEnabled('mail'); + if (!$bSmtpResult) + { + $sSmtpErrorDesc = 'PHP: mail() function is undefined'; + } + } + else + { + try + { + $oSmtpClient = \MailSo\Smtp\SmtpClient::NewInstance()->SetLogger($this->Logger()); + $oSmtpClient->SetTimeOuts($iConnectionTimeout); + + $iTime = \microtime(true); + $oSmtpClient->Connect($oDomain->OutHost(), $oDomain->OutPort(), + \MailSo\Smtp\SmtpClient::EhloHelper(), $oDomain->OutSecure(), + !!$this->Config()->Get('ssl', 'verify_certificate', false), + !!$this->Config()->Get('ssl', 'allow_self_signed', true) + ); + + $iSmtpTime = \microtime(true) - $iTime; + $oSmtpClient->Disconnect(); + $bSmtpResult = true; + } + catch (\MailSo\Net\Exceptions\SocketCanNotConnectToHostException $oException) + { + $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); + $sSmtpErrorDesc = $oException->getSocketMessage(); + if (empty($sSmtpErrorDesc)) + { + $sSmtpErrorDesc = $oException->getMessage(); + } + } + catch (\Exception $oException) + { + $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); + $sSmtpErrorDesc = $oException->getMessage(); + } + } + + if ($oDomain->UseSieve()) + { + try + { + $oSieveClient = \MailSo\Sieve\ManageSieveClient::NewInstance()->SetLogger($this->Logger()); + $oSieveClient->SetTimeOuts($iConnectionTimeout); + $oSieveClient->__USE_INITIAL_AUTH_PLAIN_COMMAND = !!$this->Config()->Get('labs', 'sieve_auth_plain_initial', true); + + $iTime = \microtime(true); + $oSieveClient->Connect($oDomain->SieveHost(), $oDomain->SievePort(), $oDomain->SieveSecure(), + !!$this->Config()->Get('ssl', 'verify_certificate', false), + !!$this->Config()->Get('ssl', 'allow_self_signed', true) + ); + + $iSieveTime = \microtime(true) - $iTime; + $oSieveClient->Disconnect(); + $bSieveResult = true; + } + catch (\MailSo\Net\Exceptions\SocketCanNotConnectToHostException $oException) + { + $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); + $sSieveErrorDesc = $oException->getSocketMessage(); + if (empty($sSieveErrorDesc)) + { + $sSieveErrorDesc = $oException->getMessage(); + } + } + catch (\Exception $oException) + { + $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); + $sSieveErrorDesc = $oException->getMessage(); + } + } + else + { + $bSieveResult = true; + } + } + + return $this->DefaultResponse(__FUNCTION__, array( + 'Imap' => $bImapResult ? true : $sImapErrorDesc, + 'Smtp' => $bSmtpResult ? true : $sSmtpErrorDesc, + 'Sieve' => $bSieveResult ? true : $sSieveErrorDesc + )); + } + + /** + * @return string + */ + private function rainLoopRepo() + { + $sUrl = APP_REPOSITORY_PATH; + if ('' !== $sUrl) + { + $sUrl = rtrim($sUrl, '\\/').'/'; + } + + return $sUrl; + } + + private function rainLoopUpdatable() + { + return @file_exists(APP_INDEX_ROOT_PATH.'index.php') && + @is_writable(APP_INDEX_ROOT_PATH.'index.php') && + @is_writable(APP_INDEX_ROOT_PATH.'rainloop/') && + APP_VERSION !== APP_DEV_VERSION + ; + } + + private function rainLoopCoreAccess() + { + $sCoreAccess = \strtolower(\preg_replace('/[\s,;]+/', ' ', + $this->Config()->Get('security', 'core_install_access_domain', ''))); + + return '' === $sCoreAccess || '*' === $sCoreAccess || APP_SITE === $sCoreAccess; + } + + /** + * @param string $sRepo + * @param bool $bReal = false + * + * @return array + */ + private function getRepositoryDataByUrl($sRepo, &$bReal = false) + { + $bReal = false; + $aRep = null; + + $sRep = ''; + $sRepoFile = 'repository.json'; + $iRepTime = 0; + + $oHttp = \MailSo\Base\Http::SingletonInstance(); + + $sCacheKey = \RainLoop\KeyPathHelper::RepositoryCacheFile($sRepo, $sRepoFile); + $sRep = $this->Cacher()->Get($sCacheKey); + if ('' !== $sRep) + { + $iRepTime = $this->Cacher()->GetTimer($sCacheKey); + } + + if ('' === $sRep || 0 === $iRepTime || time() - 3600 > $iRepTime) + { + $iCode = 0; + $sContentType = ''; + + $sRepPath = $sRepo.$sRepoFile; + $sRep = '' !== $sRepo ? $oHttp->GetUrlAsString($sRepPath, 'RainLoop', $sContentType, $iCode, $this->Logger(), 10, + $this->Config()->Get('labs', 'curl_proxy', ''), $this->Config()->Get('labs', 'curl_proxy_auth', '')) : false; + + if (false !== $sRep) + { + $aRep = @\json_decode($sRep); + $bReal = \is_array($aRep) && 0 < \count($aRep); + + if ($bReal) + { + $this->Cacher()->Set($sCacheKey, $sRep); + $this->Cacher()->SetTimer($sCacheKey); + } + } + else + { + $this->Logger()->Write('Cannot read remote repository file: '.$sRepPath, \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER'); + } + } + else if ('' !== $sRep) + { + $aRep = @\json_decode($sRep, false, 10); + $bReal = \is_array($aRep) && 0 < \count($aRep); + } + + $aResult = array(); + if (\is_array($aRep)) + { + foreach ($aRep as $oItem) + { + if ($oItem && isset($oItem->type, $oItem->id, $oItem->name, + $oItem->version, $oItem->release, $oItem->file, $oItem->description)) + { + if (!empty($oItem->required) && APP_DEV_VERSION !== APP_VERSION && version_compare(APP_VERSION, $oItem->required, '<')) + { + continue; + } + + if (!empty($oItem->depricated) && APP_DEV_VERSION !== APP_VERSION && version_compare(APP_VERSION, $oItem->depricated, '>=')) + { + continue; + } + + if ('plugin' === $oItem->type) + { + $aResult[] = array( + 'type' => $oItem->type, + 'id' => $oItem->id, + 'name' => $oItem->name, + 'installed' => '', + 'version' => $oItem->version, + 'file' => $oItem->file, + 'release' => $oItem->release, + 'desc' => $oItem->description + ); + } + } + } + } + + return $aResult; + } + + /** + * @return string + */ + private function getCoreChannel() + { + $sChannel = \trim(\strtolower($this->Config()->Get('labs', 'update_channel', 'stable'))); + if (empty($sChannel) || !\in_array($sChannel, array('stable', 'beta'))) + { + $sChannel = 'stable'; + } + + return $sChannel; + } + + private function getCoreData(&$bReal) + { + $bReal = false; + + $sChannel = $this->getCoreChannel(); + + $sRepo = \str_replace('{{channel}}', $sChannel, APP_REPO_CORE_FILE); + + $oHttp = \MailSo\Base\Http::SingletonInstance(); + + $sCacheKey = \RainLoop\KeyPathHelper::RepositoryCacheCore($sRepo); + $sRep = $this->Cacher()->Get($sCacheKey); + if ('' !== $sRep) + { + $iRepTime = $this->Cacher()->GetTimer($sCacheKey); + } + + if ('' === $sRep || 0 === $iRepTime || time() - 3600 > $iRepTime) + { + $iCode = 0; + $sContentType = ''; + + $sRep = '' !== $sRepo ? $oHttp->GetUrlAsString($sRepo, 'RainLoop', $sContentType, $iCode, $this->Logger(), 10, + $this->Config()->Get('labs', 'curl_proxy', ''), $this->Config()->Get('labs', 'curl_proxy_auth', '')) : false; + + if (false !== $sRep) + { + $aRep = @\json_decode($sRep, true, 10); + $bReal = \is_array($aRep) && 0 < \count($aRep) && isset($aRep['id']) && 'rainloop' === $aRep['id']; + + if ($bReal) + { + $this->Cacher()->Set($sCacheKey, $sRep); + $this->Cacher()->SetTimer($sCacheKey); + } + } + else + { + $this->Logger()->Write('Cannot read remote repository file: '.$sRepo, \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER'); + } + } + else if ('' !== $sRep) + { + $aRep = @\json_decode($sRep, true, 10); + $bReal = \is_array($aRep) && 0 < \count($aRep) && isset($aRep['id']) && 'rainloop' === $aRep['id']; + } + + return $bReal ? $aRep : false; + } + + private function getRepositoryData(&$bReal, &$bRainLoopUpdatable) + { + $bRainLoopUpdatable = $this->rainLoopUpdatable(); + + $aResult = $this->getRepositoryDataByUrl($this->rainLoopRepo(), $bReal); + + $aSub = array(); + if (\is_array($aResult)) + { + foreach ($aResult as $aItem) + { + if ('plugin' === $aItem['type']) + { + $aSub[] = $aItem; + } + } + + $aResult = $aSub; + unset($aSub); + } + + $aInstalled = $this->Plugins()->InstalledPlugins(); + if (\is_array($aInstalled)) + { + foreach ($aResult as &$aItem) + { + if ('plugin' === $aItem['type']) + { + foreach ($aInstalled as &$aSubItem) + { + if (\is_array($aSubItem) && isset($aSubItem[0]) && $aSubItem[0] === $aItem['id']) + { + $aSubItem[2] = true; + $aItem['installed'] = $aSubItem[1]; + } + } + } + } + + foreach ($aInstalled as $aSubItemSec) + { + if ($aSubItemSec && !isset($aSubItemSec[2])) + { + \array_push($aResult, array( + 'type' => 'plugin', + 'id' => $aSubItemSec[0], + 'name' => $aSubItemSec[0], + 'installed' => $aSubItemSec[1], + 'version' => '', + 'file' => '', + 'release' => '', + 'desc' => '' + )); + } + } + } + + foreach ($aResult as &$aItem) + { + $aItem['compare'] = \version_compare($aItem['installed'], $aItem['version'], '<'); + $aItem['canBeDeleted'] = '' !== $aItem['installed'] && 'plugin' === $aItem['type']; + $aItem['canBeUpdated'] = $aItem['compare']; + $aItem['canBeInstalled'] = true; + } + + return $aResult; + } + + /** + * @return array + */ + public function DoAdminPackagesList() + { + $this->IsAdminLoggined(); + + $bReal = false; + $bRainLoopUpdatable = false; + $aList = $this->getRepositoryData($bReal, $bRainLoopUpdatable); + + return $this->DefaultResponse(__FUNCTION__, array( + 'Real' => $bReal, + 'MainUpdatable' => $bRainLoopUpdatable, + 'List' => $aList + )); + } + + /** + * @return array + */ + public function DoAdminCoreData() + { + $this->IsAdminLoggined(); + + $bReal = false; + $aData = array(); + + $bRainLoopUpdatable = $this->rainLoopUpdatable(); + $bRainLoopAccess = $this->rainLoopCoreAccess(); + + if ($bRainLoopAccess) + { + $aData = $this->getCoreData($bReal); + } + + $sVersion = empty($aData['version']) ? '' : $aData['version']; + $sType = empty($aData['channel']) ? 'stable' : $aData['channel']; + + $sWarnings = empty($aData['warnings']) ? '' : $aData['warnings']; + $aWarnings = $sWarnings ? explode('|', $sWarnings) : array(); + + $sCurrentVersion = APP_VERSION; + + $bShowWarning = false; + if ($sCurrentVersion !== APP_DEV_VERSION) + { + foreach ($aWarnings as $sWarningVersion) + { + $sWarningVersion = \trim($sWarningVersion); + + if (\version_compare($sCurrentVersion, $sWarningVersion, '<') && + \version_compare($sVersion, $sWarningVersion, '>=')) + { + $bShowWarning = true; + break; + } + } + } + + return $this->DefaultResponse(__FUNCTION__, array( + 'Real' => $bReal, + 'Access' => $bRainLoopAccess, + 'Updatable' => $bRainLoopUpdatable, + 'Warning' => $bShowWarning, + 'Channel' => $this->getCoreChannel(), + 'Type' => $sType, + 'Version' => $sCurrentVersion, + 'RemoteVersion' => $sVersion, + 'RemoteRelease' => empty($aData['release']) ? '' : $aData['release'], + 'VersionCompare' => \version_compare($sCurrentVersion, $sVersion) + )); + } + + /** + * @return array + */ + public function DoAdminUpdateCoreData() + { + $this->IsAdminLoggined(); + + $bReal = false; + + $bRainLoopUpdatable = $this->rainLoopUpdatable(); + $bRainLoopAccess = $this->rainLoopCoreAccess(); + $oPremProvider = $this->PremProvider(); + + $aData = array(); + if ($bRainLoopUpdatable && $bRainLoopAccess) + { + $aData = $this->getCoreData($bReal); + } + + $bResult = false; + if ($bReal && $oPremProvider && !empty($aData['file'])) + { + $bResult = $oPremProvider->UpdateCore($this, $aData['file']); + } + + return $this->DefaultResponse(__FUNCTION__, $bResult); + } + + /** + * @return array + */ + public function DoAdminPackageDelete() + { + $this->IsAdminLoggined(); + + $sId = $this->GetActionParam('Id', ''); + + $bReal = false; + $bRainLoopUpdatable = false; + $aList = $this->getRepositoryData($bReal, $bRainLoopUpdatable); + + $sResultId = ''; + foreach ($aList as $oItem) + { + if ($oItem && 'plugin' === $oItem['type'] && $sId === $oItem['id']) + { + $sResultId = $sId; + break; + } + } + + $bResult = false; + if ('' !== $sResultId) + { + $bResult = \MailSo\Base\Utils::RecRmDir(APP_PLUGINS_PATH.$sResultId); + if ($bResult) + { + $this->pluginEnable($sResultId, false); + } + } + + return $this->DefaultResponse(__FUNCTION__, $bResult); + } + + /** + * @param string $sUrl + * + * @return string + */ + public function downloadRemotePackageByUrl($sUrl) + { + $bResult = false; + $sTmp = APP_PRIVATE_DATA.\md5(\microtime(true).$sUrl).'.zip'; + $pDest = @\fopen($sTmp, 'w+b'); + if ($pDest) + { + $iCode = 0; + $sContentType = ''; + + @\set_time_limit(120); + + $oHttp = \MailSo\Base\Http::SingletonInstance(); + $bResult = $oHttp->SaveUrlToFile($sUrl, $pDest, $sTmp, $sContentType, $iCode, $this->Logger(), 60, + $this->Config()->Get('labs', 'curl_proxy', ''), $this->Config()->Get('labs', 'curl_proxy_auth', '')); + + if (!$bResult) + { + $this->Logger()->Write('Cannot save url to temp file: ', \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER'); + $this->Logger()->Write($sUrl.' -> '.$sTmp, \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER'); + } + + @\fclose($pDest); + } + else + { + $this->Logger()->Write('Cannot create temp file: '.$sTmp, \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER'); + } + + return $bResult ? $sTmp : ''; + } + + /** + * @return array + */ + public function DoAdminPackageInstall() + { + $this->IsAdminLoggined(); + + $sType = $this->GetActionParam('Type', ''); + $sId = $this->GetActionParam('Id', ''); + $sFile = $this->GetActionParam('File', ''); + + $this->Logger()->Write('Start package install: '.$sFile.' ('.$sType.')', \MailSo\Log\Enumerations\Type::INFO, 'INSTALLER'); + + $sRealFile = ''; + + $bReal = false; + $bRainLoopUpdatable = false; + $aList = $this->getRepositoryData($bReal, $bRainLoopUpdatable); + + if ('plugin' === $sType) + { + foreach ($aList as $oItem) + { + if ($oItem && $sFile === $oItem['file'] && $sId === $oItem['id']) + { + $sRealFile = $sFile; + break; + } + } + } + + $sTmp = ''; + $bResult = false; + if ('' !== $sRealFile) + { + $sUrl = $this->rainLoopRepo().$sRealFile; + $sTmp = $this->downloadRemotePackageByUrl($sUrl); + } + + if ('' !== $sTmp) + { + include_once APP_VERSION_ROOT_PATH.'app/libraries/pclzip/pclzip.lib.php'; + + $oArchive = new \PclZip($sTmp); + if ('plugin' === $sType) + { + $bResult = true; + if (\is_dir(APP_PLUGINS_PATH.$sId)) + { + $bResult = \MailSo\Base\Utils::RecRmDir(APP_PLUGINS_PATH.$sId); + if (!$bResult) + { + $this->Logger()->Write('Cannot remove previous plugin folder: '.$sId, \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER'); + } + } + + if ($bResult) + { + $bResult = 0 !== $oArchive->extract(PCLZIP_OPT_PATH, APP_PLUGINS_PATH); + if (!$bResult) + { + $this->Logger()->Write('Cannot extract package files: '.$oArchive->errorInfo(), \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER'); + } + } + } + + @\unlink($sTmp); + } + + return $this->DefaultResponse(__FUNCTION__, $bResult ? + ('plugin' !== $sType ? array('Reload' => true) : true) : false); + } + + /** + * @return array + */ + public function DoAdminPluginList() + { + $this->IsAdminLoggined(); + + $aResult = array(); + + $sEnabledPlugins = $this->Config()->Get('plugins', 'enabled_list', ''); + $aEnabledPlugins = \explode(',', \strtolower($sEnabledPlugins)); + $aEnabledPlugins = \array_map('trim', $aEnabledPlugins); + + $aList = $this->Plugins()->InstalledPlugins(); + foreach ($aList as $aItem) + { + $aResult[] = array( + 'Name' => $aItem[0], + 'Enabled' => \in_array(\strtolower($aItem[0]), $aEnabledPlugins), + 'Configured' => false + ); + } + + return $this->DefaultResponse(__FUNCTION__, $aResult); + } + + /** + * @param string $sName + * @param bool $bEnable = true + * @return bool + */ + private function pluginEnable($sName, $bEnable = true) + { + if (0 === \strlen($sName)) + { + return false; + } + + $oConfig = $this->Config(); + + $sEnabledPlugins = $oConfig->Get('plugins', 'enabled_list', ''); + $aEnabledPlugins = \explode(',', \strtolower($sEnabledPlugins)); + $aEnabledPlugins = \array_map('trim', $aEnabledPlugins); + + $aNewEnabledPlugins = array(); + if ($bEnable) + { + $aNewEnabledPlugins = $aEnabledPlugins; + $aNewEnabledPlugins[] = $sName; + } + else + { + foreach ($aEnabledPlugins as $sPlugin) + { + if ($sName !== $sPlugin && 0 < \strlen($sPlugin)) + { + $aNewEnabledPlugins[] = $sPlugin; + } + } + } + + $aNewEnabledPlugins = \array_unique($aNewEnabledPlugins); + $oConfig->Set('plugins', 'enabled_list', \trim(\implode(',', $aNewEnabledPlugins), ' ,')); + + return $oConfig->Save(); + } + + /** + * @return array + */ + public function DoAdminPluginDisable() + { + $this->IsAdminLoggined(); + + $sName = (string) $this->GetActionParam('Name', ''); + $bDisable = '1' === (string) $this->GetActionParam('Disabled', '1'); + + if (!$bDisable) + { + $oPlugin = $this->Plugins()->CreatePluginByName($sName); + if ($oPlugin && ($oPlugin instanceof \RainLoop\Plugins\AbstractPlugin)) + { + $sValue = $oPlugin->Supported(); + if (0 < \strlen($sValue)) + { + return $this->FalseResponse(__FUNCTION__, \RainLoop\Notifications::UnsupportedPluginPackage, $sValue); + } + } + else + { + return $this->FalseResponse(__FUNCTION__, \RainLoop\Notifications::InvalidPluginPackage); + } + } + + return $this->DefaultResponse(__FUNCTION__, $this->pluginEnable($sName, !$bDisable)); + } + + /** + * @return array + */ + public function DoAdminPluginLoad() + { + $this->IsAdminLoggined(); + + $mResult = false; + $sName = (string) $this->GetActionParam('Name', ''); + + if (!empty($sName)) + { + $oPlugin = $this->Plugins()->CreatePluginByName($sName); + if ($oPlugin) + { + $mResult = array( + 'Name' => $sName, + 'Readme' => file_exists($oPlugin->Path().'/README') ? file_get_contents($oPlugin->Path().'/README') : '', + 'Config' => array() + ); + + $aMap = $oPlugin->ConfigMap(); + $oConfig = $oPlugin->Config(); + if (is_array($aMap) && 0 < count($aMap)) + { + foreach ($aMap as $oItem) + { + if ($oItem && ($oItem instanceof \RainLoop\Plugins\Property)) + { + $aItem = $oItem->ToArray(); + $aItem[0] = $oConfig->Get('plugin', $oItem->Name(), ''); + if (\RainLoop\Enumerations\PluginPropertyType::PASSWORD === $oItem->Type()) + { + $aItem[0] = APP_DUMMY; + } + + $mResult['Config'][] = $aItem; + } + } + } + } + } + + return $this->DefaultResponse(__FUNCTION__, $mResult); + } + + /** + * @return array + */ + public function DoAdminPluginSettingsUpdate() + { + $this->IsAdminLoggined(); + + $mResult = false; + $sName = (string) $this->GetActionParam('Name', ''); + + if (!empty($sName)) + { + $oPlugin = $this->Plugins()->CreatePluginByName($sName); + if ($oPlugin) + { + $oConfig = $oPlugin->Config(); + $aMap = $oPlugin->ConfigMap(); + if (is_array($aMap) && 0 < count($aMap)) + { + foreach ($aMap as $oItem) + { + $sValue = $this->GetActionParam('_'.$oItem->Name(), $oConfig->Get('plugin', $oItem->Name())); + if (\RainLoop\Enumerations\PluginPropertyType::PASSWORD !== $oItem->Type() || APP_DUMMY !== $sValue) + { + $mResultValue = null; + switch ($oItem->Type()) { + case \RainLoop\Enumerations\PluginPropertyType::INT: + $mResultValue = (int) $sValue; + break; + case \RainLoop\Enumerations\PluginPropertyType::BOOL: + $mResultValue = '1' === (string) $sValue; + break; + case \RainLoop\Enumerations\PluginPropertyType::SELECTION: + if (is_array($oItem->DefaultValue()) && in_array($sValue, $oItem->DefaultValue())) + { + $mResultValue = (string) $sValue; + } + break; + case \RainLoop\Enumerations\PluginPropertyType::PASSWORD: + case \RainLoop\Enumerations\PluginPropertyType::STRING: + case \RainLoop\Enumerations\PluginPropertyType::STRING_TEXT: + $mResultValue = (string) $sValue; + break; + } + + if (null !== $mResultValue) + { + $oConfig->Set('plugin', $oItem->Name(), $mResultValue); + } + } + } + } + + $mResult = $oConfig->Save(); + } + } + + if (!$mResult) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSavePluginSettings); + } + + return $this->DefaultResponse(__FUNCTION__, true); + } + + /** + * @return array + */ + public function DoSettingsUpdate() + { + $oAccount = $this->getAccountFromToken(); + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::SETTINGS, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $self = $this; + $oConfig = $this->Config(); + + $oSettings = $this->SettingsProvider()->Load($oAccount); + $oSettingsLocal = $this->SettingsProvider(true)->Load($oAccount); + + if ($oConfig->Get('webmail', 'allow_languages_on_settings', true)) + { + $this->setSettingsFromParams($oSettings, 'Language', 'string', function ($sLanguage) use ($self) { + return $self->ValidateLanguage($sLanguage); + }); + } + else + { + $oSettings->SetConf('Language', $this->ValidateLanguage($oConfig->Get('webmail', 'language', 'en'))); + } + + if ($this->GetCapa(false, false, \RainLoop\Enumerations\Capa::THEMES, $oAccount)) + { + $this->setSettingsFromParams($oSettingsLocal, 'Theme', 'string', function ($sTheme) use ($self) { + return $self->ValidateTheme($sTheme); + }); + } + else + { + $oSettingsLocal->SetConf('Theme', $this->ValidateTheme($oConfig->Get('webmail', 'theme', 'Default'))); + } + + $this->setSettingsFromParams($oSettings, 'MPP', 'int', function ($iValue) { + return (int) (\in_array($iValue, array(10, 20, 30, 50, 100, 150, 200, 300)) ? $iValue : 20); + }); + + $this->setSettingsFromParams($oSettings, 'Layout', 'int', function ($iValue) { + return (int) (\in_array((int) $iValue, array(\RainLoop\Enumerations\Layout::NO_PREVIW, + \RainLoop\Enumerations\Layout::SIDE_PREVIEW, \RainLoop\Enumerations\Layout::BOTTOM_PREVIEW)) ? + $iValue : \RainLoop\Enumerations\Layout::SIDE_PREVIEW); + }); + + $this->setSettingsFromParams($oSettings, 'EditorDefaultType', 'string'); + $this->setSettingsFromParams($oSettings, 'ShowImages', 'bool'); + $this->setSettingsFromParams($oSettings, 'ContactsAutosave', 'bool'); + $this->setSettingsFromParams($oSettings, 'DesktopNotifications', 'bool'); + $this->setSettingsFromParams($oSettings, 'SoundNotification', 'bool'); + $this->setSettingsFromParams($oSettings, 'UseCheckboxesInList', 'bool'); + $this->setSettingsFromParams($oSettings, 'AllowDraftAutosave', 'bool'); + $this->setSettingsFromParams($oSettings, 'AutoLogout', 'int'); + + $this->setSettingsFromParams($oSettings, 'EnableTwoFactor', 'bool'); + + $this->setSettingsFromParams($oSettingsLocal, 'UseThreads', 'bool'); + $this->setSettingsFromParams($oSettingsLocal, 'ReplySameFolder', 'bool'); + + return $this->DefaultResponse(__FUNCTION__, + $this->SettingsProvider()->Save($oAccount, $oSettings) && + $this->SettingsProvider(true)->Save($oAccount, $oSettingsLocal)); + } + + /** + * @return array + */ + public function DoNoop() + { + $this->initMailClientConnection(); + return $this->TrueResponse(__FUNCTION__); + } + + /** + * @return array + */ + public function DoPing() + { + return $this->DefaultResponse(__FUNCTION__, 'Pong'); + } + + /** + * @return array + */ + public function DoChangePassword() + { + $mResult = false; + + $oAccount = $this->getAccountFromToken(); + if ($oAccount) + { + try + { + $mResult = $this->ChangePasswordProvider()->ChangePassword( + $oAccount, + $this->GetActionParam('PrevPassword', ''), + $this->GetActionParam('NewPassword', '') + ); + } + catch (\Exception $oException) + { + $this->loginErrorDelay(); + $this->Logger()->Write('Error: Can\'t change password for '.$oAccount->Email().' account.', \MailSo\Log\Enumerations\Type::NOTICE); + + throw $oException; + } + } + + return $this->DefaultResponse(__FUNCTION__, $mResult); + } + + /** + * @return array + */ + public function DoJsInfo() + { + $bIsError = '1' === (string) $this->GetActionParam('IsError', '0'); + $mData = $this->GetActionParam('Data', null); + + $this->Logger()->WriteDump(is_array($mData) ? $mData : array(), + $bIsError ? \MailSo\Log\Enumerations\Type::ERROR : \MailSo\Log\Enumerations\Type::INFO, 'JS-INFO'); + + return $this->DefaultResponse(__FUNCTION__, true); + } + + /** + * @return array + */ + public function DoWelcomeClose() + { + $oAccount = $this->getAccountFromToken(); + if ($oAccount && !$oAccount->IsAdditionalAccount()) + { + $oSettings = $this->SettingsProvider()->Load($oAccount); + $oSettings->SetConf('LastWelcomePage', + $this->Config()->Get('branding', 'welcome_page_url', '')); + + return $this->DefaultResponse(__FUNCTION__, + $this->SettingsProvider()->Save($oAccount, $oSettings)); + } + + return $this->FalseResponse(__FUNCTION__); + } + + /** + * @return array + */ + public function DoVersion() + { + return $this->DefaultResponse(__FUNCTION__, + APP_VERSION === (string) $this->GetActionParam('Version', '')); + } + + /** + * @return array + */ + public function DoJsError() + { + $sMessage = $this->GetActionParam('Message', ''); + if (0 < strlen($sMessage)) + { + $sFileName = $this->GetActionParam('FileName', ''); + $sLineNo = $this->GetActionParam('LineNo', ''); + $sLocation = $this->GetActionParam('Location', ''); + $sHtmlCapa = $this->GetActionParam('HtmlCapa', ''); + $sTimeOnPage = $this->GetActionParam('TimeOnPage', ''); + + $oHttp = $this->Http(); + + $this->Logger()->Write($sMessage.' ('.$sFileName.' ~ '.$sLineNo.')', \MailSo\Log\Enumerations\Type::ERROR, 'JS'); + $this->Logger()->WriteDump(array( + 'Location' => $sLocation, + 'Capability' => $sHtmlCapa, + 'TimeOnPage' => $sTimeOnPage, + 'HTTP_USER_AGENT' => $oHttp->GetServer('HTTP_USER_AGENT', ''), + 'HTTP_ACCEPT_ENCODING' => $oHttp->GetServer('HTTP_ACCEPT_ENCODING', ''), + 'HTTP_ACCEPT_LANGUAGE' => $oHttp->GetServer('HTTP_ACCEPT_LANGUAGE', '') + )); + } + + return $this->DefaultResponse(__FUNCTION__, true); + } + + /** + * @param \MailSo\Mail\FolderCollection $oFolders + * @return array + */ + private function recFoldersNames($oFolders) + { + $aResult = array(); + if ($oFolders) + { + $aFolders =& $oFolders->GetAsArray(); + + foreach ($aFolders as $oFolder) + { + $aResult[] = $oFolder->FullNameRaw()."|". + implode("|", $oFolder->Flags()).($oFolder->IsSubscribed() ? '1' : '0'); + + $oSub = $oFolder->SubFolders(); + if ($oSub && 0 < $oSub->Count()) + { + $aResult = \array_merge($aResult, $this->recFoldersNames($oSub)); + } + } + } + + return $aResult; + } + + /** + * @staticvar array $aCache + * @param \RainLoop\Model\Account $oAccount + * + * @return array + */ + private function systemFoldersNames($oAccount) + { + static $aCache = null; + if (null === $aCache) + { + $aCache = array( + + 'Sent' => \MailSo\Imap\Enumerations\FolderType::SENT, + 'Send' => \MailSo\Imap\Enumerations\FolderType::SENT, + + 'Outbox' => \MailSo\Imap\Enumerations\FolderType::SENT, + 'Out box' => \MailSo\Imap\Enumerations\FolderType::SENT, + + 'Sent Item' => \MailSo\Imap\Enumerations\FolderType::SENT, + 'Sent Items' => \MailSo\Imap\Enumerations\FolderType::SENT, + 'Send Item' => \MailSo\Imap\Enumerations\FolderType::SENT, + 'Send Items' => \MailSo\Imap\Enumerations\FolderType::SENT, + 'Sent Mail' => \MailSo\Imap\Enumerations\FolderType::SENT, + 'Sent Mails' => \MailSo\Imap\Enumerations\FolderType::SENT, + 'Send Mail' => \MailSo\Imap\Enumerations\FolderType::SENT, + 'Send Mails' => \MailSo\Imap\Enumerations\FolderType::SENT, + + 'Drafts' => \MailSo\Imap\Enumerations\FolderType::DRAFTS, + + 'Draft' => \MailSo\Imap\Enumerations\FolderType::DRAFTS, + 'Draft Mail' => \MailSo\Imap\Enumerations\FolderType::DRAFTS, + 'Draft Mails' => \MailSo\Imap\Enumerations\FolderType::DRAFTS, + 'Drafts Mail' => \MailSo\Imap\Enumerations\FolderType::DRAFTS, + 'Drafts Mails' => \MailSo\Imap\Enumerations\FolderType::DRAFTS, + + 'Junk E-mail' => \MailSo\Imap\Enumerations\FolderType::JUNK, + + 'Spam' => \MailSo\Imap\Enumerations\FolderType::JUNK, + 'Spams' => \MailSo\Imap\Enumerations\FolderType::JUNK, + + 'Junk' => \MailSo\Imap\Enumerations\FolderType::JUNK, + 'Bulk Mail' => \MailSo\Imap\Enumerations\FolderType::JUNK, + 'Bulk Mails' => \MailSo\Imap\Enumerations\FolderType::JUNK, + + 'Deleted Items' => \MailSo\Imap\Enumerations\FolderType::TRASH, + + 'Trash' => \MailSo\Imap\Enumerations\FolderType::TRASH, + 'Deleted' => \MailSo\Imap\Enumerations\FolderType::TRASH, + 'Bin' => \MailSo\Imap\Enumerations\FolderType::TRASH, + + 'Archive' => \MailSo\Imap\Enumerations\FolderType::ALL, + 'Archives' => \MailSo\Imap\Enumerations\FolderType::ALL, + + 'All' => \MailSo\Imap\Enumerations\FolderType::ALL, + 'All Mail' => \MailSo\Imap\Enumerations\FolderType::ALL, + 'All Mails' => \MailSo\Imap\Enumerations\FolderType::ALL, + ); + + $aNewCache = array(); + foreach ($aCache as $sKey => $iType) + { + $aNewCache[$sKey] = $iType; + $aNewCache[\str_replace(' ', '', $sKey)] = $iType; + } + + $aCache = $aNewCache; + + $this->Plugins()->RunHook('filter.system-folders-names', array($oAccount, &$aCache)); + } + + return $aCache; + } + + /** + * @param \RainLoop\Model\Account $oAccount + * @param \MailSo\Mail\FolderCollection $oFolders + * @param array $aResult + * @param bool $bListFolderTypes = true + */ + private function recFoldersTypes($oAccount, $oFolders, &$aResult, $bListFolderTypes = true) + { + if ($oFolders) + { + $aFolders =& $oFolders->GetAsArray(); + if (\is_array($aFolders) && 0 < \count($aFolders)) + { + if ($bListFolderTypes) + { + foreach ($aFolders as $oFolder) + { + $iFolderListType = $oFolder->GetFolderListType(); + if (!isset($aResult[$iFolderListType]) && \in_array($iFolderListType, array( + \MailSo\Imap\Enumerations\FolderType::SENT, + \MailSo\Imap\Enumerations\FolderType::DRAFTS, + \MailSo\Imap\Enumerations\FolderType::JUNK, + \MailSo\Imap\Enumerations\FolderType::TRASH, + \MailSo\Imap\Enumerations\FolderType::ALL + ))) + { + $aResult[$iFolderListType] = $oFolder->FullNameRaw(); + } + } + + foreach ($aFolders as $oFolder) + { + $oSub = $oFolder->SubFolders(); + if ($oSub && 0 < $oSub->Count()) + { + $this->recFoldersTypes($oAccount, $oSub, $aResult, true); + } + } + } + + $aMap = $this->systemFoldersNames($oAccount); + foreach ($aFolders as $oFolder) + { + $sName = $oFolder->Name(); + $sFullName = $oFolder->FullName(); + + if (isset($aMap[$sName]) || isset($aMap[$sFullName])) + { + $iFolderType = isset($aMap[$sName]) ? $aMap[$sName] : $aMap[$sFullName]; + if (!isset($aResult[$iFolderType]) && \in_array($iFolderType, array( + \MailSo\Imap\Enumerations\FolderType::SENT, + \MailSo\Imap\Enumerations\FolderType::DRAFTS, + \MailSo\Imap\Enumerations\FolderType::JUNK, + \MailSo\Imap\Enumerations\FolderType::TRASH, + \MailSo\Imap\Enumerations\FolderType::ALL + ))) + { + $aResult[$iFolderType] = $oFolder->FullNameRaw(); + } + } + } + + foreach ($aFolders as $oFolder) + { + $oSub = $oFolder->SubFolders(); + if ($oSub && 0 < $oSub->Count()) + { + $this->recFoldersTypes($oAccount, $oSub, $aResult, false); + } + } + } + } + } + + /** + * @return array + */ + public function DoFolders() + { + $oAccount = $this->initMailClientConnection(); + + $oFolderCollection = null; + $this->Plugins()->RunHook('filter.folders-before', array($oAccount, &$oFolderCollection)); + + $bUseFolders = $this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FOLDERS, $oAccount); + + if (null === $oFolderCollection) + { + $oFolderCollection = $this->MailClient()->Folders('', + $bUseFolders ? '*' : 'INBOX', + !!$this->Config()->Get('labs', 'use_imap_list_subscribe', true), + (int) $this->Config()->Get('labs', 'imap_folder_list_limit', 200) + ); + } + + $this->Plugins()->RunHook('filter.folders-post', array($oAccount, &$oFolderCollection)); + + if ($oFolderCollection instanceof \MailSo\Mail\FolderCollection) + { + $oSettingsLocal = $this->SettingsProvider(true)->Load($oAccount); + + $aSystemFolders = array(); + $this->recFoldersTypes($oAccount, $oFolderCollection, $aSystemFolders); + $oFolderCollection->SystemFolders = $aSystemFolders; + + if ($bUseFolders && $this->Config()->Get('labs', 'autocreate_system_folders', true)) + { + $bDoItAgain = false; + + $sNamespace = $oFolderCollection->GetNamespace(); + $sParent = empty($sNamespace) ? '' : \substr($sNamespace, 0, -1); + + $sDelimiter = $oFolderCollection->FindDelimiter(); + + $aList = array(); + $aMap = $this->systemFoldersNames($oAccount); + + if ('' === $oSettingsLocal->GetConf('SentFolder', '')) + { + $aList[] = \MailSo\Imap\Enumerations\FolderType::SENT; + } + + if ('' === $oSettingsLocal->GetConf('DraftFolder', '')) + { + $aList[] = \MailSo\Imap\Enumerations\FolderType::DRAFTS; + } + + if ('' === $oSettingsLocal->GetConf('SpamFolder', '')) + { + $aList[] = \MailSo\Imap\Enumerations\FolderType::JUNK; + } + + if ('' === $oSettingsLocal->GetConf('TrashFolder', '')) + { + $aList[] = \MailSo\Imap\Enumerations\FolderType::TRASH; + } + + if ('' === $oSettingsLocal->GetConf('ArchiveFolder', '')) + { + $aList[] = \MailSo\Imap\Enumerations\FolderType::ALL; + } + + $this->Plugins()->RunHook('filter.folders-system-types', array($oAccount, &$aList)); + + foreach ($aList as $iType) + { + if (!isset($aSystemFolders[$iType])) + { + $mFolderNameToCreate = \array_search($iType, $aMap); + if (!empty($mFolderNameToCreate)) + { + $iPos = \strrpos($mFolderNameToCreate, $sDelimiter); + if (false !== $iPos) + { + $mNewParent = \substr($mFolderNameToCreate, 0, $iPos); + $mNewFolderNameToCreate = \substr($mFolderNameToCreate, $iPos + 1); + if (0 < \strlen($mNewFolderNameToCreate)) + { + $mFolderNameToCreate = $mNewFolderNameToCreate; + } + + if (0 < \strlen($mNewParent)) + { + $sParent = 0 < \strlen($sParent) ? $sParent.$sDelimiter.$mNewParent : $mNewParent; + } + } + + $sFullNameToCheck = \MailSo\Base\Utils::ConvertEncoding($mFolderNameToCreate, + \MailSo\Base\Enumerations\Charset::UTF_8, \MailSo\Base\Enumerations\Charset::UTF_7_IMAP); + + if (0 < \strlen(\trim($sParent))) + { + $sFullNameToCheck = $sParent.$sDelimiter.$sFullNameToCheck; + } + + if (!$oFolderCollection->GetByFullNameRaw($sFullNameToCheck)) + { + try + { + if ($this->MailClient()->FolderCreate($mFolderNameToCreate, $sParent, true, $sDelimiter)) + { + $bDoItAgain = true; + } + } + catch (\Exception $oException) + { + $this->Logger()->WriteException($oException); + } + } + } + } + } + + if ($bDoItAgain) + { + $oFolderCollection = $this->MailClient()->Folders('', '*', + !!$this->Config()->Get('labs', 'use_imap_list_subscribe', true), + (int) $this->Config()->Get('labs', 'imap_folder_list_limit', 200) + ); + + if ($oFolderCollection) + { + $aSystemFolders = array(); + $this->recFoldersTypes($oAccount, $oFolderCollection, $aSystemFolders); + $oFolderCollection->SystemFolders = $aSystemFolders; + } + } + } + + if ($oFolderCollection) + { + $oFolderCollection->FoldersHash = \md5(\implode("\x0", $this->recFoldersNames($oFolderCollection))); + } + } + + $this->Plugins()->RunHook('filter.folders-complete', array($oAccount, &$oFolderCollection)); + + return $this->DefaultResponse(__FUNCTION__, $oFolderCollection); + } + + /** + * @return array + */ + public function DoFolderCreate() + { + $oAccount = $this->initMailClientConnection(); + + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FOLDERS, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + try + { + $sFolderNameInUtf = $this->GetActionParam('Folder', ''); + $sFolderParentFullNameRaw = $this->GetActionParam('Parent', ''); + + $this->MailClient()->FolderCreate($sFolderNameInUtf, $sFolderParentFullNameRaw, + !!$this->Config()->Get('labs', 'use_imap_list_subscribe', true)); + } + catch (\Exception $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantCreateFolder, $oException); + } + + return $this->TrueResponse(__FUNCTION__); + } + + /** + * @return array + */ + public function DoFolderSubscribe() + { + $oAccount = $this->initMailClientConnection(); + + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FOLDERS, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $sFolderFullNameRaw = $this->GetActionParam('Folder', ''); + $bSubscribe = '1' === (string) $this->GetActionParam('Subscribe', '0'); + + try + { + $this->MailClient()->FolderSubscribe($sFolderFullNameRaw, !!$bSubscribe); + } + catch (\Exception $oException) + { + if ($bSubscribe) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSubscribeFolder, $oException); + } + else + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantUnsubscribeFolder, $oException); + } + } + + return $this->TrueResponse(__FUNCTION__); + } + + /** + * @return array + */ + public function DoFolderCheckable() + { + $oAccount = $this->getAccountFromToken(); + + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FOLDERS, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $sFolderFullNameRaw = $this->GetActionParam('Folder', ''); + $bCheckable = '1' === (string) $this->GetActionParam('Checkable', '0'); + + $oSettingsLocal = $this->SettingsProvider(true)->Load($oAccount); + + $sCheckableFolder = $oSettingsLocal->GetConf('CheckableFolder', '[]'); + $aCheckableFolder = @\json_decode($sCheckableFolder); + + if (!\is_array($aCheckableFolder)) + { + $aCheckableFolder = array(); + } + + if ($bCheckable) + { + $aCheckableFolder[] = $sFolderFullNameRaw; + } + else + { + $aCheckableFolderNew = array(); + foreach ($aCheckableFolder as $sFolder) + { + if ($sFolder !== $sFolderFullNameRaw) + { + $aCheckableFolderNew[] = $sFolder; + } + } + $aCheckableFolder = $aCheckableFolderNew; + } + + $aCheckableFolder = \array_unique($aCheckableFolder); + + $oSettingsLocal->SetConf('CheckableFolder', @\json_encode($aCheckableFolder)); + + return $this->DefaultResponse(__FUNCTION__, + $this->SettingsProvider(true)->Save($oAccount, $oSettingsLocal)); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoFolderRename() + { + $oAccount = $this->initMailClientConnection(); + + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FOLDERS, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $sPrevFolderFullNameRaw = $this->GetActionParam('Folder', ''); + $sNewTopFolderNameInUtf = $this->GetActionParam('NewFolderName', ''); + + try + { + $this->MailClient()->FolderRename($sPrevFolderFullNameRaw, $sNewTopFolderNameInUtf, + !!$this->Config()->Get('labs', 'use_imap_list_subscribe', true)); + } + catch (\Exception $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantRenameFolder, $oException); + } + + return $this->TrueResponse(__FUNCTION__); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoFolderDelete() + { + $oAccount = $this->initMailClientConnection(); + + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FOLDERS, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $sFolderFullNameRaw = $this->GetActionParam('Folder', ''); + + try + { + $this->MailClient()->FolderDelete($sFolderFullNameRaw, + !!$this->Config()->Get('labs', 'use_imap_list_subscribe', true)); + } + catch (\MailSo\Mail\Exceptions\NonEmptyFolder $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantDeleteNonEmptyFolder, $oException); + } + catch (\Exception $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantDeleteFolder, $oException); + } + + return $this->TrueResponse(__FUNCTION__); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoFolderClear() + { + $this->initMailClientConnection(); + + $sFolderFullNameRaw = $this->GetActionParam('Folder', ''); + + try + { + $this->MailClient()->FolderClear($sFolderFullNameRaw); + } + catch (\Exception $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::MailServerError, $oException); + } + + return $this->TrueResponse(__FUNCTION__); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoFolderInformation() + { + $sFolder = $this->GetActionParam('Folder', ''); + $sPrevUidNext = $this->GetActionParam('UidNext', ''); + $aFlagsUids = array(); + $sFlagsUids = (string) $this->GetActionParam('FlagsUids', ''); + + $aFlagsFilteredUids = array(); + if (0 < strlen($sFlagsUids)) + { + $aFlagsUids = explode(',', $sFlagsUids); + $aFlagsFilteredUids = array_filter($aFlagsUids, function (&$sUid) { + $sUid = (int) trim($sUid); + return 0 < (int) trim($sUid); + }); + } + + $this->initMailClientConnection(); + + $sForwardedFlag = $this->Config()->Get('labs', 'imap_forwarded_flag', ''); + $sReadReceiptFlag = $this->Config()->Get('labs', 'imap_read_receipt_flag', ''); + try + { + $aInboxInformation = $this->MailClient()->FolderInformation( + $sFolder, $sPrevUidNext, $aFlagsFilteredUids + ); + + if (\is_array($aInboxInformation) && isset($aInboxInformation['Flags']) && \is_array($aInboxInformation['Flags'])) + { + foreach ($aInboxInformation['Flags'] as $iUid => $aFlags) + { + $aLowerFlags = array_map('strtolower', $aFlags); + $aInboxInformation['Flags'][$iUid] = array( + 'IsSeen' => in_array('\\seen', $aLowerFlags), + 'IsFlagged' => in_array('\\flagged', $aLowerFlags), + 'IsAnswered' => in_array('\\answered', $aLowerFlags), + 'IsDeleted' => in_array('\\deleted', $aLowerFlags), + 'IsForwarded' => 0 < strlen($sForwardedFlag) && in_array(strtolower($sForwardedFlag), $aLowerFlags), + 'IsReadReceipt' => 0 < strlen($sReadReceiptFlag) && in_array(strtolower($sReadReceiptFlag), $aLowerFlags) + ); + } + } + } + catch (\Exception $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::MailServerError, $oException); + } + + if (\is_array($aInboxInformation)) + { + $aInboxInformation['Version'] = APP_VERSION; + } + + return $this->DefaultResponse(__FUNCTION__, $aInboxInformation); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoFolderInformationMultiply() + { + $aResult = array( + 'List' => array(), + 'Version' => APP_VERSION + ); + + $aFolders = $this->GetActionParam('Folders', null); + if (\is_array($aFolders)) + { + $this->initMailClientConnection(); + + $aFolders = \array_unique($aFolders); + foreach ($aFolders as $sFolder) + { + if (0 < \strlen(\trim($sFolder)) && 'INBOX' !== \strtoupper($sFolder)) + { + try + { + $aInboxInformation = $this->MailClient()->FolderInformation($sFolder, '', array()); + if (\is_array($aInboxInformation) && isset($aInboxInformation['Folder'])) + { + $aResult['List'][] = $aInboxInformation; + } + } + catch (\Exception $oException) + { + $this->Logger()->WriteException($oException); + } + } + } + } + + return $this->DefaultResponse(__FUNCTION__, $aResult); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoMessageList() + { +// \sleep(1); +// throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantGetMessageList); + + $sFolder = ''; + $iOffset = 0; + $iLimit = 20; + $sSearch = ''; + $sUidNext = ''; + $bUseThreads = false; + $sThreadUid = ''; + + $sRawKey = $this->GetActionParam('RawKey', ''); + $aValues = $this->getDecodedClientRawKeyValue($sRawKey, 9); + + if (\is_array($aValues) && 7 < \count($aValues)) + { + $sFolder =(string) $aValues[0]; + $iOffset = (int) $aValues[1]; + $iLimit = (int) $aValues[2]; + $sSearch = (string) $aValues[3]; + $sUidNext = (string) $aValues[6]; + $bUseThreads = (bool) $aValues[7]; + + if ($bUseThreads) + { + $sThreadUid = isset($aValues[8]) ? (string) $aValues[8] : ''; + } + + $this->verifyCacheByKey($sRawKey); + } + else + { + $sFolder = $this->GetActionParam('Folder', ''); + $iOffset = (int) $this->GetActionParam('Offset', 0); + $iLimit = (int) $this->GetActionParam('Limit', 10); + $sSearch = $this->GetActionParam('Search', ''); + $sUidNext = $this->GetActionParam('UidNext', ''); + $bUseThreads = '1' === (string) $this->GetActionParam('UseThreads', '0'); + + if ($bUseThreads) + { + $sThreadUid = (string) $this->GetActionParam('ThreadUid', ''); + } + } + + if (0 === strlen($sFolder)) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantGetMessageList); + } + + $this->initMailClientConnection(); + + try + { + if (!$this->Config()->Get('labs', 'use_imap_thread', false)) + { + $bUseThreads = false; + } + + $oMessageList = $this->MailClient()->MessageList( + $sFolder, $iOffset, $iLimit, $sSearch, $sUidNext, + $this->cacherForUids(), + !!$this->Config()->Get('labs', 'use_imap_sort', false), + $bUseThreads, + $sThreadUid, + '' + ); + } + catch (\Exception $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantGetMessageList, $oException); + } + + if ($oMessageList instanceof \MailSo\Mail\MessageCollection) + { + $this->cacheByKey($sRawKey); + } + + return $this->DefaultResponse(__FUNCTION__, $oMessageList); + } + + /** + * @param \RainLoop\Model\Account $oAccount + * @param bool $bWithDraftInfo = true + * + * @return \MailSo\Mime\Message + */ + private function buildMessage($oAccount, $bWithDraftInfo = true) + { + $sIdentityID = $this->GetActionParam('IdentityID', ''); + $sTo = $this->GetActionParam('To', ''); + $sCc = $this->GetActionParam('Cc', ''); + $sBcc = $this->GetActionParam('Bcc', ''); + $sReplyTo = $this->GetActionParam('ReplyTo', ''); + $sSubject = $this->GetActionParam('Subject', ''); + $bTextIsHtml = '1' === $this->GetActionParam('TextIsHtml', '0'); + $bReadReceiptRequest = '1' === $this->GetActionParam('ReadReceiptRequest', '0'); + $bMarkAsImportant = '1' === $this->GetActionParam('MarkAsImportant', '0'); + $sText = $this->GetActionParam('Text', ''); + $aAttachments = $this->GetActionParam('Attachments', null); + + $aDraftInfo = $this->GetActionParam('DraftInfo', null); + $sInReplyTo = $this->GetActionParam('InReplyTo', ''); + $sReferences = $this->GetActionParam('References', ''); + + $oMessage = \MailSo\Mime\Message::NewInstance(); + + if (!$this->Config()->Get('security', 'hide_x_mailer_header', false)) + { + $oMessage->SetXMailer('RainLoop/'.APP_VERSION); + } + + $oFromIdentity = $this->GetIdentityByID($oAccount, $sIdentityID); + if ($oFromIdentity) + { + $oMessage->SetFrom(\MailSo\Mime\Email::NewInstance( + $oFromIdentity->Email(), $oFromIdentity->Name())); + } + else + { + $oMessage->SetFrom(\MailSo\Mime\Email::Parse($oAccount->Email())); + } + + $oFrom = $oMessage->GetFrom(); + $oMessage->RegenerateMessageId($oFrom ? $oFrom->GetDomain() : ''); + + if (!empty($sReplyTo)) + { + $oReplyTo = \MailSo\Mime\EmailCollection::NewInstance($sReplyTo); + if ($oReplyTo && 0 < $oReplyTo->Count()) + { + $oMessage->SetReplyTo($oReplyTo); + } + } + + if ($bReadReceiptRequest) + { + $oMessage->SetReadReceipt($oAccount->Email()); + } + + if ($bMarkAsImportant) + { + $oMessage->SetPriority(\MailSo\Mime\Enumerations\MessagePriority::HIGH); + } + + $oMessage->SetSubject($sSubject); + + $oToEmails = \MailSo\Mime\EmailCollection::NewInstance($sTo); + if ($oToEmails && $oToEmails->Count()) + { + $oMessage->SetTo($oToEmails); + } + + $oCcEmails = \MailSo\Mime\EmailCollection::NewInstance($sCc); + if ($oCcEmails && $oCcEmails->Count()) + { + $oMessage->SetCc($oCcEmails); + } + + $oBccEmails = \MailSo\Mime\EmailCollection::NewInstance($sBcc); + if ($oBccEmails && $oBccEmails->Count()) + { + $oMessage->SetBcc($oBccEmails); + } + + if ($bWithDraftInfo && \is_array($aDraftInfo) && !empty($aDraftInfo[0]) && !empty($aDraftInfo[1]) && !empty($aDraftInfo[2])) + { + $oMessage->SetDraftInfo($aDraftInfo[0], $aDraftInfo[1], $aDraftInfo[2]); + } + + if (0 < \strlen($sInReplyTo)) + { + $oMessage->SetInReplyTo($sInReplyTo); + } + + if (0 < \strlen($sReferences)) + { + $oMessage->SetReferences($sReferences); + } + + $aFoundedCids = array(); + $mFoundDataURL = array(); + $aFoundedContentLocationUrls = array(); + + $sTextToAdd = $bTextIsHtml ? + \MailSo\Base\HtmlUtils::BuildHtml($sText, $aFoundedCids, $mFoundDataURL, $aFoundedContentLocationUrls) : $sText; + + $this->Plugins()->RunHook($bTextIsHtml ? 'filter.message-html' : 'filter.message-plain', + array($oAccount, &$oMessage, &$sTextToAdd)); + + if ($bTextIsHtml && 0 < \strlen($sTextToAdd)) + { + $sTextConverted = \MailSo\Base\HtmlUtils::ConvertHtmlToPlain($sTextToAdd); + $this->Plugins()->RunHook('filter.message-plain', array($oAccount, &$oMessage, &$sTextConverted)); + $oMessage->AddText($sTextConverted, false); + } + + $oMessage->AddText($sTextToAdd, $bTextIsHtml); + + if (\is_array($aAttachments)) + { + foreach ($aAttachments as $sTempName => $aData) + { + $sFileName = (string) $aData[0]; + $bIsInline = (bool) $aData[1]; + $sCID = (string) $aData[2]; + $sContentLocation = isset($aData[3]) ? (string) $aData[3] : ''; + + $rResource = $this->FilesProvider()->GetFile($oAccount, $sTempName); + if (\is_resource($rResource)) + { + $iFileSize = $this->FilesProvider()->FileSize($oAccount, $sTempName); + + $oMessage->Attachments()->Add( + \MailSo\Mime\Attachment::NewInstance($rResource, $sFileName, $iFileSize, $bIsInline, + \in_array(trim(trim($sCID), '<>'), $aFoundedCids), + $sCID, array(), $sContentLocation + ) + ); + } + } + } + + if ($mFoundDataURL && \is_array($mFoundDataURL) && 0 < \count($mFoundDataURL)) + { + foreach ($mFoundDataURL as $sCidHash => $sDataUrlString) + { + $aMatch = array(); + $sCID = '<'.$sCidHash.'>'; + if (\preg_match('/^data:(image\/[a-zA-Z0-9]+);base64,(.+)$/i', $sDataUrlString, $aMatch) && + !empty($aMatch[1]) && !empty($aMatch[2])) + { + $sRaw = \MailSo\Base\Utils::Base64Decode($aMatch[2]); + $iFileSize = \strlen($sRaw); + if (0 < $iFileSize) + { + $sFileName = \preg_replace('/[^a-z0-9]+/i', '.', $aMatch[1]); + $rResource = \MailSo\Base\ResourceRegistry::CreateMemoryResourceFromString($sRaw); + + $sRaw = ''; + unset($sRaw); + unset($aMatch); + + $oMessage->Attachments()->Add( + \MailSo\Mime\Attachment::NewInstance($rResource, $sFileName, $iFileSize, true, true, $sCID) + ); + } + } + } + } + + $this->Plugins()->RunHook('filter.build-message', array(&$oMessage)); + $this->Plugins()->RunHook('filter.build-message[2]', array(&$oMessage, $oAccount)); + + return $oMessage; + } + + /** + * @param \RainLoop\Model\Account $oAccount + * + * @return void + */ + private function deleteMessageAttachmnets($oAccount) + { + $aAttachments = $this->GetActionParam('Attachments', null); + + if (\is_array($aAttachments)) + { + foreach (\array_keys($aAttachments) as $sTempName) + { + if ($this->FilesProvider()->FileExists($oAccount, $sTempName)) + { + $this->FilesProvider()->Clear($oAccount, $sTempName); + } + } + } + } + + /** + * @param \RainLoop\Model\Account $oAccount + * + * @return \MailSo\Mime\Message + */ + private function buildReadReceiptMessage($oAccount) + { + $sReadReceipt = $this->GetActionParam('ReadReceipt', ''); + $sSubject = $this->GetActionParam('Subject', ''); + $sText = $this->GetActionParam('Text', ''); + + $oIdentity = $this->GetAccountIdentity($oAccount); + + if (empty($sReadReceipt) || empty($sSubject) || empty($sText) || !$oIdentity) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::UnknownError); + } + + $oMessage = \MailSo\Mime\Message::NewInstance(); + + if (!$this->Config()->Get('security', 'hide_x_mailer_header', false)) + { + $oMessage->SetXMailer('RainLoop/'.APP_VERSION); + } + + $oMessage->SetFrom(\MailSo\Mime\Email::NewInstance($oIdentity->Email(), $oIdentity->Name())); + + $oFrom = $oMessage->GetFrom(); + $oMessage->RegenerateMessageId($oFrom ? $oFrom->GetDomain() : ''); + + $sReplyTo = $oIdentity->ReplyTo(); + if (!empty($sReplyTo)) + { + $oReplyTo = \MailSo\Mime\EmailCollection::NewInstance($sReplyTo); + if ($oReplyTo && $oReplyTo->Count()) + { + $oMessage->SetReplyTo($oReplyTo); + } + } + + $oMessage->SetSubject($sSubject); + + $oToEmails = \MailSo\Mime\EmailCollection::NewInstance($sReadReceipt); + if ($oToEmails && $oToEmails->Count()) + { + $oMessage->SetTo($oToEmails); + } + + $this->Plugins()->RunHook('filter.read-receipt-message-plain', array($oAccount, &$oMessage, &$sText)); + + $oMessage->AddText($sText, false); + + $this->Plugins()->RunHook('filter.build-read-receipt-message', array(&$oMessage, $oAccount)); + + return $oMessage; + } + + /** + * @return array + */ + public function DoSaveMessage() + { + $oAccount = $this->initMailClientConnection(); + + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::COMPOSER, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $sMessageFolder = $this->GetActionParam('MessageFolder', ''); + $sMessageUid = $this->GetActionParam('MessageUid', ''); + + $sDraftFolder = $this->GetActionParam('DraftFolder', ''); + if (0 === strlen($sDraftFolder)) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::UnknownError); + } + + $oMessage = $this->buildMessage($oAccount, true); + + $this->Plugins() + ->RunHook('filter.save-message', array(&$oMessage)) + ->RunHook('filter.save-message[2]', array(&$oMessage, $oAccount)) + ; + + $mResult = false; + if ($oMessage) + { + $rMessageStream = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); + + $iMessageStreamSize = \MailSo\Base\Utils::MultipleStreamWriter( + $oMessage->ToStream(false), array($rMessageStream), 8192, true, true); + + if (false !== $iMessageStreamSize) + { + $sMessageId = $oMessage->MessageId(); + + \rewind($rMessageStream); + + $iNewUid = 0; + $this->MailClient()->MessageAppendStream( + $rMessageStream, $iMessageStreamSize, $sDraftFolder, array( + \MailSo\Imap\Enumerations\MessageFlag::SEEN + ), $iNewUid); + + if (!empty($sMessageId) && (null === $iNewUid || 0 === $iNewUid)) + { + $iNewUid = $this->MailClient()->FindMessageUidByMessageId($sDraftFolder, $sMessageId); + } + + $mResult = true; + + if (0 < strlen($sMessageFolder) && 0 < strlen($sMessageUid)) + { + $this->MailClient()->MessageDelete($sMessageFolder, array($sMessageUid), true, true); + } + + if (null !== $iNewUid && 0 < $iNewUid) + { + $mResult = array( + 'NewFolder' => $sDraftFolder, + 'NewUid' => $iNewUid + ); + } + } + } + + return $this->DefaultResponse(__FUNCTION__, $mResult); + } + + /** + * + * @param \RainLoop\Model\Account $oAccount + * @param \MailSo\Mime\Message $oMessage + * @param resource $rMessageStream + * @param bool $bDsn = false + * @param bool $bAddHiddenRcpt = true + * + * @throws \RainLoop\Exceptions\ClientException + * @throws \MailSo\Net\Exceptions\ConnectionException + */ + private function smtpSendMessage($oAccount, $oMessage, + &$rMessageStream, &$iMessageStreamSize, $bDsn = false, $bAddHiddenRcpt = true) + { + $oRcpt = $oMessage->GetRcpt(); + if ($oRcpt && 0 < $oRcpt->Count()) + { + $this->Plugins()->RunHook('filter.smtp-message-stream', + array($oAccount, &$rMessageStream, &$iMessageStreamSize)); + + $this->Plugins()->RunHook('filter.message-rcpt', array($oAccount, &$oRcpt)); + + try + { + $oFrom = $oMessage->GetFrom(); + $sFrom = $oFrom instanceof \MailSo\Mime\Email ? $oFrom->GetEmail() : ''; + $sFrom = empty($sFrom) ? $oAccount->Email() : $sFrom; + + $this->Plugins()->RunHook('filter.smtp-from', array($oAccount, $oMessage, &$sFrom)); + + $aHiddenRcpt = array(); + if ($bAddHiddenRcpt) + { + $this->Plugins()->RunHook('filter.smtp-hidden-rcpt', array($oAccount, $oMessage, &$aHiddenRcpt)); + } + + $bUsePhpMail = $oAccount->Domain()->OutUsePhpMail(); + + $oSmtpClient = \MailSo\Smtp\SmtpClient::NewInstance()->SetLogger($this->Logger()); + $oSmtpClient->SetTimeOuts(10, (int) \RainLoop\Api::Config()->Get('labs', 'smtp_timeout', 60)); + + $bLoggined = $oAccount->OutConnectAndLoginHelper($this->Plugins(), $oSmtpClient, $this->Config(), $bUsePhpMail); + + if ($bUsePhpMail) + { + if (\MailSo\Base\Utils::FunctionExistsAndEnabled('mail')) + { + $aToCollection = $oMessage->GetTo(); + if ($aToCollection && $oFrom) + { + $sRawBody = @\stream_get_contents($rMessageStream); + if (!empty($sRawBody)) + { + $sMailTo = \trim($aToCollection->ToString(true)); + $sMailSubject = \trim($oMessage->GetSubject()); + $sMailSubject = 0 === \strlen($sMailSubject) ? '' : \MailSo\Base\Utils::EncodeUnencodedValue( + \MailSo\Base\Enumerations\Encoding::BASE64_SHORT, $sMailSubject); + + $sMailHeaders = $sMailBody = ''; + list($sMailHeaders, $sMailBody) = \explode("\r\n\r\n", $sRawBody, 2); + unset($sRawBody); + + if ($this->Config()->Get('labs', 'mail_func_clear_headers', true)) + { + $sMailHeaders = \MailSo\Base\Utils::RemoveHeaderFromHeaders($sMailHeaders, array( + \MailSo\Mime\Enumerations\Header::TO_, + \MailSo\Mime\Enumerations\Header::SUBJECT + )); + } + + if ($this->Config()->Get('debug', 'enable', false)) + { + $this->Logger()->WriteDump(array( + $sMailTo, $sMailSubject, $sMailBody, $sMailHeaders + )); + } + + $bR = $this->Config()->Get('labs', 'mail_func_additional_parameters', false) ? + \mail($sMailTo, $sMailSubject, $sMailBody, $sMailHeaders, '-f'.$oFrom->GetEmail()) : + \mail($sMailTo, $sMailSubject, $sMailBody, $sMailHeaders); + + if (!$bR) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSendMessage); + } + } + } + } + else + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSendMessage); + } + } + else if ($oSmtpClient->IsConnected()) + { + if (!empty($sFrom)) + { + $oSmtpClient->MailFrom($sFrom, '', $bDsn); + } + + $aRcpt =& $oRcpt->GetAsArray(); + foreach ($aRcpt as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) + { + $oSmtpClient->Rcpt($oEmail->GetEmail(), $bDsn); + } + + if ($bAddHiddenRcpt && \is_array($aHiddenRcpt) && 0 < \count($aHiddenRcpt)) + { + foreach ($aHiddenRcpt as $sEmail) + { + if (\preg_match('/^[^@\s]+@[^@\s]+$/', $sEmail)) + { + $oSmtpClient->Rcpt($sEmail); + } + } + } + + $oSmtpClient->DataWithStream($rMessageStream); + + if ($bLoggined) + { + $oSmtpClient->Logout(); + } + + $oSmtpClient->Disconnect(); + } + } + catch (\MailSo\Net\Exceptions\ConnectionException $oException) + { + if ($this->Config()->Get('labs', 'smtp_show_server_errors')) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::ClientViewError, $oException); + } + else + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::ConnectionError, $oException); + } + } + catch (\MailSo\Smtp\Exceptions\LoginException $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError, $oException); + } + catch (\Exception $oException) + { + if ($this->Config()->Get('labs', 'smtp_show_server_errors')) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::ClientViewError, $oException); + } + else + { + throw $oException; + } + } + } + else + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::InvalidRecipients); + } + } + + /** + * @return array + */ + public function DoSendMessage() + { + $oAccount = $this->initMailClientConnection(); + + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::COMPOSER, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $oConfig = $this->Config(); + + $sDraftFolder = $this->GetActionParam('MessageFolder', ''); + $sDraftUid = $this->GetActionParam('MessageUid', ''); + $sSentFolder = $this->GetActionParam('SentFolder', ''); + $aDraftInfo = $this->GetActionParam('DraftInfo', null); + $bDsn = '1' === (string) $this->GetActionParam('Dsn', '0'); + + $oMessage = $this->buildMessage($oAccount, false); + + $this->Plugins() + ->RunHook('filter.send-message', array(&$oMessage)) + ->RunHook('filter.send-message[2]', array(&$oMessage, $oAccount)) + ; + + $mResult = false; + try + { + if ($oMessage) + { + $rMessageStream = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); + + $iMessageStreamSize = \MailSo\Base\Utils::MultipleStreamWriter( + $oMessage->ToStream(true), array($rMessageStream), 8192, true, true, true); + + if (false !== $iMessageStreamSize) + { + $this->smtpSendMessage($oAccount, $oMessage, $rMessageStream, $iMessageStreamSize, $bDsn, true); + + if (\is_array($aDraftInfo) && 3 === \count($aDraftInfo)) + { + $sDraftInfoType = $aDraftInfo[0]; + $sDraftInfoUid = $aDraftInfo[1]; + $sDraftInfoFolder = $aDraftInfo[2]; + + try + { + switch (\strtolower($sDraftInfoType)) + { + case 'reply': + case 'reply-all': + $this->MailClient()->MessageSetFlag($sDraftInfoFolder, array($sDraftInfoUid), true, + \MailSo\Imap\Enumerations\MessageFlag::ANSWERED, true); + break; + case 'forward': + $sForwardedFlag = $this->Config()->Get('labs', 'imap_forwarded_flag', ''); + if (0 < strlen($sForwardedFlag)) + { + $this->MailClient()->MessageSetFlag($sDraftInfoFolder, array($sDraftInfoUid), true, + $sForwardedFlag, true); + } + break; + } + } + catch (\Exception $oException) + { + $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); + } + } + + if (0 < \strlen($sSentFolder)) + { + try + { + if (!$oMessage->GetBcc()) + { + if (\is_resource($rMessageStream)) + { + \rewind($rMessageStream); + } + + $this->Plugins()->RunHook('filter.sent-message-stream', + array($oAccount, &$rMessageStream, &$iMessageStreamSize)); + + $this->MailClient()->MessageAppendStream( + $rMessageStream, $iMessageStreamSize, $sSentFolder, array( + \MailSo\Imap\Enumerations\MessageFlag::SEEN + ) + ); + } + else + { + $rAppendMessageStream = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); + + $iAppendMessageStreamSize = \MailSo\Base\Utils::MultipleStreamWriter( + $oMessage->ToStream(false), array($rAppendMessageStream), 8192, true, true, true); + + $this->Plugins()->RunHook('filter.sent-message-stream', + array($oAccount, &$rAppendMessageStream, &$iAppendMessageStreamSize)); + + $this->MailClient()->MessageAppendStream( + $rAppendMessageStream, $iAppendMessageStreamSize, $sSentFolder, array( + \MailSo\Imap\Enumerations\MessageFlag::SEEN + )); + + if (\is_resource($rAppendMessageStream)) + { + @fclose($rAppendMessageStream); + } + } + } + catch (\Exception $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSaveMessage, $oException); + } + } + + if (\is_resource($rMessageStream)) + { + @\fclose($rMessageStream); + } + + $this->deleteMessageAttachmnets($oAccount); + + if (0 < \strlen($sDraftFolder) && 0 < \strlen($sDraftUid)) + { + try + { + $this->MailClient()->MessageDelete($sDraftFolder, array($sDraftUid), true, true); + } + catch (\Exception $oException) + { + $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); + } + } + + $mResult = true; + } + } + } + catch (\RainLoop\Exceptions\ClientException $oException) + { + throw $oException; + } + catch (\Exception $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSendMessage, $oException); + } + + if (false === $mResult) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSendMessage); + } + + try + { + if ($oMessage && $this->AddressBookProvider($oAccount)->IsActive()) + { + $aArrayToFrec = array(); + $oToCollection = $oMessage->GetTo(); + if ($oToCollection) + { + $aTo =& $oToCollection->GetAsArray(); + foreach ($aTo as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) + { + $aArrayToFrec[$oEmail->GetEmail(true)] = $oEmail->ToString(false, true); + } + } + + if (0 < \count($aArrayToFrec)) + { + $oSettings = $this->SettingsProvider()->Load($oAccount); + + $this->AddressBookProvider($oAccount)->IncFrec( + $oAccount->ParentEmailHelper(), \array_values($aArrayToFrec), + !!$oSettings->GetConf('ContactsAutosave', + !!$oConfig->Get('defaults', 'contacts_autosave', true))); + } + } + } + catch (\Exception $oException) + { + $this->Logger()->WriteException($oException); + } + + return $this->TrueResponse(__FUNCTION__); + } + + /** + * @return array + */ + public function DoSendReadReceiptMessage() + { + $oAccount = $this->initMailClientConnection(); + + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::COMPOSER, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $oMessage = $this->buildReadReceiptMessage($oAccount); + + $this->Plugins()->RunHook('filter.send-read-receipt-message', array(&$oMessage, $oAccount)); + + $mResult = false; + try + { + if ($oMessage) + { + $rMessageStream = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); + + $iMessageStreamSize = \MailSo\Base\Utils::MultipleStreamWriter( + $oMessage->ToStream(true), array($rMessageStream), 8192, true, true, true); + + if (false !== $iMessageStreamSize) + { + $this->smtpSendMessage($oAccount, $oMessage, $rMessageStream, $iMessageStreamSize, false, false); + + if (\is_resource($rMessageStream)) + { + @\fclose($rMessageStream); + } + + $mResult = true; + + $sReadReceiptFlag = $this->Config()->Get('labs', 'imap_read_receipt_flag', ''); + if (!empty($sReadReceiptFlag)) + { + $sFolderFullName = $this->GetActionParam('MessageFolder', ''); + $sUid = $this->GetActionParam('MessageUid', ''); + + $this->Cacher($oAccount)->Set(\RainLoop\KeyPathHelper::ReadReceiptCache($oAccount->Email(), $sFolderFullName, $sUid), '1'); + + if (0 < \strlen($sFolderFullName) && 0 < \strlen($sUid)) + { + try + { + $this->MailClient()->MessageSetFlag($sFolderFullName, array($sUid), true, $sReadReceiptFlag, true, true); + } + catch (\Exception $oException) {} + } + } + } + } + } + catch (\RainLoop\Exceptions\ClientException $oException) + { + throw $oException; + } + catch (\Exception $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSendMessage, $oException); + } + + if (false === $mResult) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSendMessage); + } + + return $this->TrueResponse(__FUNCTION__); + } + + /** + * @return array + */ + public function DoQuota() + { + $oAccount = $this->initMailClientConnection(); + + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::QUOTA, $oAccount)) + { + return $this->DefaultResponse(__FUNCTION__, array(0, 0, 0, 0)); + } + + try + { + $aQuota = $this->MailClient()->Quota(); + } + catch (\Exception $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::MailServerError, $oException); + } + + return $this->DefaultResponse(__FUNCTION__, $aQuota); + } + + private function getContactsSyncData($oAccount) + { + $mResult = null; + + $sData = $this->StorageProvider()->Get($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'contacts_sync' + ); + + if (!empty($sData)) + { + $mData = \RainLoop\Utils::DecodeKeyValues($sData); + if (\is_array($mData)) + { + $mResult = array( + 'Enable' => isset($mData['Enable']) ? !!$mData['Enable'] : false, + 'Url' => isset($mData['Url']) ? \trim($mData['Url']) : '', + 'User' => isset($mData['User']) ? \trim($mData['User']) : '', + 'Password' => isset($mData['Password']) ? $mData['Password'] : '' + ); + } + } + + return $mResult; + } + + /** + * @return array + */ + public function DoSaveContactsSyncData() + { + $oAccount = $this->getAccountFromToken(); + + $oAddressBookProvider = $this->AddressBookProvider($oAccount); + if (!$oAddressBookProvider || !$oAddressBookProvider->IsActive()) + { + return $this->FalseResponse(__FUNCTION__); + } + + $bEnabled = '1' === (string) $this->GetActionParam('Enable', '0'); + $sUrl = $this->GetActionParam('Url', ''); + $sUser = $this->GetActionParam('User', ''); + $sPassword = $this->GetActionParam('Password', ''); + + $mData = $this->getContactsSyncData($oAccount); + + $bResult = $this->StorageProvider()->Put($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'contacts_sync', + \RainLoop\Utils::EncodeKeyValues(array( + 'Enable' => $bEnabled, + 'User' => $sUser, + 'Password' => APP_DUMMY === $sPassword && isset($mData['Password']) ? + $mData['Password'] : (APP_DUMMY === $sPassword ? '' : $sPassword), + 'Url' => $sUrl + )) + ); + + return $this->DefaultResponse(__FUNCTION__, $bResult); + } + + /** + * @return array + */ + public function DoContactsSync() + { + $bResult = false; + $oAccount = $this->getAccountFromToken(); + + $oAddressBookProvider = $this->AddressBookProvider($oAccount); + if ($oAddressBookProvider && $oAddressBookProvider->IsActive()) + { + $mData = $this->getContactsSyncData($oAccount); + if (\is_array($mData) && isset($mData['Enable'], $mData['User'], $mData['Password'], $mData['Url']) && $mData['Enable']) + { + $bResult = $oAddressBookProvider->Sync( + $oAccount->ParentEmailHelper(), + $mData['Url'], $mData['User'], $mData['Password']); + } + } + + if (!$bResult) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::ContactsSyncError); + } + + return $this->TrueResponse(__FUNCTION__); + } + + private function getTwoFactorInfo($oAccount, $bRemoveSecret = false) + { + $sEmail = $oAccount->ParentEmailHelper(); + + $mData = null; + + $aResult = array( + 'User' => '', + 'IsSet' => false, + 'Enable' => false, + 'Secret' => '', + 'UrlTitle' => '', + 'BackupCodes' => '' + ); + + if (!empty($sEmail)) + { + $aResult['User'] = $sEmail; + + $sData = $this->StorageProvider()->Get($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'two_factor' + ); + + if ($sData) + { + $mData = \RainLoop\Utils::DecodeKeyValues($sData); + } + } + + if (\is_array($mData) && !empty($aResult['User']) && + !empty($mData['User']) && !empty($mData['Secret']) && + !empty($mData['BackupCodes']) && $sEmail === $mData['User']) + { + $aResult['IsSet'] = true; + $aResult['Enable'] = isset($mData['Enable']) ? !!$mData['Enable'] : false; + $aResult['Secret'] = $mData['Secret']; + $aResult['BackupCodes'] = $mData['BackupCodes']; + $aResult['UrlTitle'] = $this->Config()->Get('webmail', 'title', ''); + } + + if ($bRemoveSecret) + { + if (isset($aResult['Secret'])) + { + unset($aResult['Secret']); + } + + if (isset($aResult['UrlTitle'])) + { + unset($aResult['UrlTitle']); + } + + if (isset($aResult['BackupCodes'])) + { + unset($aResult['BackupCodes']); + } + } + + return $aResult; + } + + /** + * @param \RainLoop\Model\Account $oAccount + * @param string $sCode + * + * @return bool + */ + private function removeBackupCodeFromTwoFactorInfo($oAccount, $sCode) + { + if (!$oAccount || empty($sCode)) + { + return false; + } + + $sData = $this->StorageProvider()->Get($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'two_factor' + ); + + if ($sData) + { + $mData = \RainLoop\Utils::DecodeKeyValues($sData); + + if (!empty($mData['BackupCodes'])) + { + $sBackupCodes = \preg_replace('/[^\d]+/', ' ', ' '.$mData['BackupCodes'].' '); + $sBackupCodes = \str_replace(' '.$sCode.' ', '', $sBackupCodes); + + $mData['BackupCodes'] = \trim(\preg_replace('/[^\d]+/', ' ', $sBackupCodes)); + + return $this->StorageProvider()->Put($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'two_factor', + \RainLoop\Utils::EncodeKeyValues($mData) + ); + } + } + + return false; + } + + /** + * @return array + */ + public function DoGetTwoFactorInfo() + { + $oAccount = $this->getAccountFromToken(); + + if (!$this->TwoFactorAuthProvider()->IsActive() || + !$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + return $this->DefaultResponse(__FUNCTION__, + $this->getTwoFactorInfo($oAccount, true)); + } + + /** + * @return array + */ + public function DoCreateTwoFactorSecret() + { + $oAccount = $this->getAccountFromToken(); + + if (!$this->TwoFactorAuthProvider()->IsActive() || + !$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $sEmail = $oAccount->ParentEmailHelper(); + + $sSecret = $this->TwoFactorAuthProvider()->CreateSecret(); + + $aCodes = array(); + for ($iIndex = 9; $iIndex > 0; $iIndex--) + { + $aCodes[] = \rand(100000000, 900000000); + } + + $this->StorageProvider()->Put($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'two_factor', + \RainLoop\Utils::EncodeKeyValues(array( + 'User' => $sEmail, + 'Enable' => false, + 'Secret' => $sSecret, + 'BackupCodes' => \implode(' ', $aCodes) + )) + ); + + $this->requestSleep(); + + return $this->DefaultResponse(__FUNCTION__, + $this->getTwoFactorInfo($oAccount)); + } + + /** + * @return array + */ + public function DoShowTwoFactorSecret() + { + $oAccount = $this->getAccountFromToken(); + + if (!$this->TwoFactorAuthProvider()->IsActive() || + !$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $aResult = $this->getTwoFactorInfo($oAccount); + if (\is_array($aResult)) + { + unset($aResult['BackupCodes']); + } + + return $this->DefaultResponse(__FUNCTION__, $aResult); + } + + /** + * @return array + */ + public function DoEnableTwoFactor() + { + $oAccount = $this->getAccountFromToken(); + + if (!$this->TwoFactorAuthProvider()->IsActive() || + !$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $sEmail = $oAccount->ParentEmailHelper(); + + $bResult = false; + $mData = $this->getTwoFactorInfo($oAccount); + if (isset($mData['Secret'], $mData['BackupCodes'])) + { + $bResult = $this->StorageProvider()->Put($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'two_factor', + \RainLoop\Utils::EncodeKeyValues(array( + 'User' => $sEmail, + 'Enable' => '1' === \trim($this->GetActionParam('Enable', '0')), + 'Secret' => $mData['Secret'], + 'BackupCodes' => $mData['BackupCodes'] + )) + ); + } + + return $this->DefaultResponse(__FUNCTION__, $bResult); + } + + /** + * @return array + */ + public function DoTestTwoFactorInfo() + { + $oAccount = $this->getAccountFromToken(); + + if (!$this->TwoFactorAuthProvider()->IsActive() || + !$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $sCode = \trim($this->GetActionParam('Code', '')); + + $aData = $this->getTwoFactorInfo($oAccount); + $sSecret = !empty($aData['Secret']) ? $aData['Secret'] : ''; + +// $this->Logger()->WriteDump(array( +// $sCode, $sSecret, $aData, +// $this->TwoFactorAuthProvider()->VerifyCode($sSecret, $sCode) +// )); + + $this->requestSleep(); + + return $this->DefaultResponse(__FUNCTION__, + $this->TwoFactorAuthProvider()->VerifyCode($sSecret, $sCode)); + } + + /** + * @return array + */ + public function DoClearTwoFactorInfo() + { + $oAccount = $this->getAccountFromToken(); + + if (!$this->TwoFactorAuthProvider()->IsActive() || + !$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $this->StorageProvider()->Clear($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'two_factor' + ); + + return $this->DefaultResponse(__FUNCTION__, + $this->getTwoFactorInfo($oAccount, true)); + } + + /** + * @return array + */ + public function DoContacts() + { + $oAccount = $this->getAccountFromToken(); + + $sSearch = \trim($this->GetActionParam('Search', '')); + $iOffset = (int) $this->GetActionParam('Offset', 0); + $iLimit = (int) $this->GetActionParam('Limit', 20); + $iOffset = 0 > $iOffset ? 0 : $iOffset; + $iLimit = 0 > $iLimit ? 20 : $iLimit; + + $iResultCount = 0; + $mResult = array(); + + $oAbp = $this->AddressBookProvider($oAccount); + if ($oAbp->IsActive()) + { + $iResultCount = 0; + $mResult = $oAbp->GetContacts($oAccount->ParentEmailHelper(), + $iOffset, $iLimit, $sSearch, $iResultCount); + } + + return $this->DefaultResponse(__FUNCTION__, array( + 'Offset' => $iOffset, + 'Limit' => $iLimit, + 'Count' => $iResultCount, + 'Search' => $sSearch, + 'List' => $mResult + )); + } + + /** + * @return array + */ + public function DoContactsDelete() + { + $oAccount = $this->getAccountFromToken(); + $aUids = \explode(',', (string) $this->GetActionParam('Uids', '')); + + $aFilteredUids = \array_filter($aUids, function (&$mUid) { + $mUid = (int) \trim($mUid); + return 0 < $mUid; + }); + + $bResult = false; + if (0 < \count($aFilteredUids) && $this->AddressBookProvider($oAccount)->IsActive()) + { + $bResult = $this->AddressBookProvider($oAccount)->DeleteContacts($oAccount->ParentEmailHelper(), $aFilteredUids); + } + + return $this->DefaultResponse(__FUNCTION__, $bResult); + } + + /** + * @return array + */ + public function DoContactSave() + { + $oAccount = $this->getAccountFromToken(); + + $bResult = false; + + $oAddressBookProvider = $this->AddressBookProvider($oAccount); + $sRequestUid = \trim($this->GetActionParam('RequestUid', '')); + if ($oAddressBookProvider && $oAddressBookProvider->IsActive() && 0 < \strlen($sRequestUid)) + { + $sUid = \trim($this->GetActionParam('Uid', '')); + + $oContact = null; + if (0 < \strlen($sUid)) + { + $oContact = $oAddressBookProvider->GetContactByID($oAccount->ParentEmailHelper(), $sUid); + } + + if (!$oContact) + { + $oContact = new \RainLoop\Providers\AddressBook\Classes\Contact(); + if (0 < \strlen($sUid)) + { + $oContact->IdContact = $sUid; + } + } + + $oContact->Properties = array(); + $aProperties = $this->GetActionParam('Properties', array()); + if (\is_array($aProperties)) + { + foreach ($aProperties as $aItem) + { + if ($aItem && isset($aItem[0], $aItem[1]) && \is_numeric($aItem[0])) + { + $oProp = new \RainLoop\Providers\AddressBook\Classes\Property(); + $oProp->Type = (int) $aItem[0]; + $oProp->Value = $aItem[1]; + $oProp->TypeStr = empty($aItem[2]) ? '': $aItem[2]; + + $oContact->Properties[] = $oProp; + } + } + } + + if (!empty($oContact->Etag)) + { + $oContact->Etag = \md5($oContact->ToVCard()); + } + + $oContact->PopulateDisplayAndFullNameValue(true); + + $bResult = $oAddressBookProvider->ContactSave($oAccount->ParentEmailHelper(), $oContact); + } + + return $this->DefaultResponse(__FUNCTION__, array( + 'RequestUid' => $sRequestUid, + 'ResultID' => $bResult ? $oContact->IdContact : '', + 'Result' => $bResult + )); + } + + /** + * @return array + */ + public function DoSuggestions() + { + $oAccount = $this->getAccountFromToken(); + + $sQuery = \trim($this->GetActionParam('Query', '')); + $iLimit = (int) $this->Config()->Get('contacts', 'suggestions_limit', 20); + + $aResult = array(); + + $this->Plugins()->RunHook('ajax.suggestions-input-parameters', array(&$sQuery, &$iLimit, $oAccount)); + + $iLimit = (int) $iLimit; + if (5 > $iLimit) + { + $iLimit = 5; + } + + $this->Plugins()->RunHook('ajax.suggestions-pre', array(&$aResult, $sQuery, $oAccount, $iLimit)); + + if ($iLimit > \count($aResult) && 0 < \strlen($sQuery)) + { + try + { + // Address Book + $oAddressBookProvider = $this->AddressBookProvider($oAccount); + if ($oAddressBookProvider && $oAddressBookProvider->IsActive()) + { + $aSuggestions = $oAddressBookProvider->GetSuggestions($oAccount->ParentEmailHelper(), $sQuery, $iLimit); + if (0 === \count($aResult)) + { + $aResult = $aSuggestions; + } + else + { + $aResult = \array_merge($aResult, $aSuggestions); + } + } + } + catch (\Exception $oException) + { + $this->Logger()->WriteException($oException); + } + } + + if ($iLimit > \count($aResult) && 0 < \strlen($sQuery)) + { + $oSuggestionsProvider = $this->SuggestionsProvider(); + if ($oSuggestionsProvider && $oSuggestionsProvider->IsActive()) + { + $aSuggestionsProviderResult = $oSuggestionsProvider->Process($oAccount, $sQuery, $iLimit); + if (\is_array($aSuggestionsProviderResult) && 0 < \count($aSuggestionsProviderResult)) + { + $aResult = \array_merge($aResult, $aSuggestionsProviderResult); + } + } + + } + + $aResult = \RainLoop\Utils::RemoveSuggestionDuplicates($aResult); + if ($iLimit < \count($aResult)) + { + $aResult = \array_slice($aResult, 0, $iLimit); + } + + $this->Plugins()->RunHook('ajax.suggestions-post', array(&$aResult, $sQuery, $oAccount, $iLimit)); + + $aResult = \RainLoop\Utils::RemoveSuggestionDuplicates($aResult); + if ($iLimit < \count($aResult)) + { + $aResult = \array_slice($aResult, 0, $iLimit); + } + + return $this->DefaultResponse(__FUNCTION__, $aResult); + } + + /** + * @return array + */ + private function messageSetFlag($sActionFunction, $sResponseFunction) + { + $this->initMailClientConnection(); + + $sFolder = $this->GetActionParam('Folder', ''); + $bSetAction = '1' === (string) $this->GetActionParam('SetAction', '0'); + $aUids = \explode(',', (string) $this->GetActionParam('Uids', '')); + $aFilteredUids = \array_filter($aUids, function (&$sUid) { + $sUid = (int) \trim($sUid); + return 0 < $sUid; + }); + + try + { + $this->MailClient()->{$sActionFunction}($sFolder, $aFilteredUids, true, $bSetAction, true); + } + catch (\Exception $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::MailServerError, $oException); + } + + return $this->TrueResponse($sResponseFunction); + } + + /** + * @return array + */ + public function DoMessageSetSeen() + { + return $this->messageSetFlag('MessageSetSeen', __FUNCTION__); + } + + /** + * @return array + */ + public function DoMessageSetSeenToAll() + { + $this->initMailClientConnection(); + + $sFolder = $this->GetActionParam('Folder', ''); + $bSetAction = '1' === (string) $this->GetActionParam('SetAction', '0'); + $sThreadUids = \trim($this->GetActionParam('ThreadUids', '')); + + try + { + $this->MailClient()->MessageSetSeenToAll($sFolder, $bSetAction, + !empty($sThreadUids) ? explode(',', $sThreadUids) : null); + } + catch (\Exception $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::MailServerError, $oException); + } + + return $this->TrueResponse(__FUNCTION__); + } + + /** + * @return array + */ + public function DoMessageSetFlagged() + { + return $this->messageSetFlag('MessageSetFlagged', __FUNCTION__); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoMessage() + { + $sRawKey = (string) $this->GetActionParam('RawKey', ''); + + $sFolder = ''; + $iUid = 0; + + $aValues = $this->getDecodedClientRawKeyValue($sRawKey, 4); + if (is_array($aValues) && 4 === count($aValues)) + { + $sFolder = (string) $aValues[0]; + $iUid = (int) $aValues[1]; + + $this->verifyCacheByKey($sRawKey); + } + else + { + $sFolder = $this->GetActionParam('Folder', ''); + $iUid = (int) $this->GetActionParam('Uid', 0); + } + + $oAccount = $this->initMailClientConnection(); + + try + { + $oMessage = $this->MailClient()->Message($sFolder, $iUid, true, + $this->cacherForThreads(), + (int) $this->Config()->Get('labs', 'imap_body_text_limit', 0) + ); + } + catch (\Exception $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantGetMessage, $oException); + } + + if ($oMessage instanceof \MailSo\Mail\Message) + { + $this->Plugins() + ->RunHook('filter.result-message', array(&$oMessage)) + ->RunHook('filter.result-message[2]', array(&$oMessage, $oAccount)) + ; + + $this->cacheByKey($sRawKey); + } + + return $this->DefaultResponse(__FUNCTION__, $oMessage); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoMessageDelete() + { + $this->initMailClientConnection(); + + $sFolder = $this->GetActionParam('Folder', ''); + $aUids = \explode(',', (string) $this->GetActionParam('Uids', '')); + + $aFilteredUids = \array_filter($aUids, function (&$sUid) { + $sUid = (int) \trim($sUid); + return 0 < $sUid; + }); + + try + { + $this->MailClient()->MessageDelete($sFolder, $aFilteredUids, true, true, + !!$this->Config()->Get('labs', 'use_imap_expunge_all_on_delete', false)); + } + catch (\Exception $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantDeleteMessage, $oException); + } + + if ($this->Config()->Get('labs', 'use_imap_unselect', true)) + { + try + { + $this->MailClient()->FolderUnSelect(); + } + catch (\Exception $oException) + { + unset($oException); + } + } + + $sHash = ''; + + try + { + $sHash = $this->MailClient()->FolderHash($sFolder); + } + catch (\Exception $oException) + { + unset($oException); + } + + return $this->DefaultResponse(__FUNCTION__, '' === $sHash ? false : array($sFolder, $sHash)); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoMessageMove() + { + $this->initMailClientConnection(); + + $sFromFolder = $this->GetActionParam('FromFolder', ''); + $sToFolder = $this->GetActionParam('ToFolder', ''); + $aUids = \explode(',', (string) $this->GetActionParam('Uids', '')); + $bMarkAsRead = '1' === (string) $this->GetActionParam('MarkAsRead', '0'); + + $aFilteredUids = \array_filter($aUids, function (&$mUid) { + $mUid = (int) \trim($mUid); + return 0 < $mUid; + }); + + if ($bMarkAsRead) + { + try + { + $this->MailClient()->MessageSetSeen($sFromFolder, $aFilteredUids, true, true); + } + catch (\Exception $oException) + { + unset($oException); + } + } + + try + { + $this->MailClient()->MessageMove($sFromFolder, $sToFolder, $aFilteredUids, true, + !!$this->Config()->Get('labs', 'use_imap_move', true), + !!$this->Config()->Get('labs', 'use_imap_expunge_all_on_delete', false) + ); + } + catch (\Exception $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantMoveMessage, $oException); + } + + if ($this->Config()->Get('labs', 'use_imap_unselect', true)) + { + try + { + $this->MailClient()->FolderUnSelect(); + } + catch (\Exception $oException) + { + unset($oException); + } + } + + $sHash = ''; + + try + { + $sHash = $this->MailClient()->FolderHash($sFromFolder); + } + catch (\Exception $oException) + { + unset($oException); + } + + return $this->DefaultResponse(__FUNCTION__, '' === $sHash ? false : array($sFromFolder, $sHash)); + } + + /** + * @return array + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function DoMessageCopy() + { + $this->initMailClientConnection(); + + $sFromFolder = $this->GetActionParam('FromFolder', ''); + $sToFolder = $this->GetActionParam('ToFolder', ''); + $aUids = \explode(',', (string) $this->GetActionParam('Uids', '')); + + $aFilteredUids = \array_filter($aUids, function (&$mUid) { + $mUid = (int) \trim($mUid); + return 0 < $mUid; + }); + + try + { + $this->MailClient()->MessageCopy($sFromFolder, $sToFolder, + $aFilteredUids, true); + + $sHash = $this->MailClient()->FolderHash($sFromFolder); + } + catch (\Exception $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantCopyMessage, $oException); + } + + return $this->DefaultResponse(__FUNCTION__, + '' === $sHash ? false : array($sFromFolder, $sHash)); + } + + /** + * @param string $sFileName + * @param string $sContentType + * @param string $sMimeIndex + * @param int $iMaxLength = 250 + * + * @return string + */ + public function MainClearFileName($sFileName, $sContentType, $sMimeIndex, $iMaxLength = 250) + { + $sFileName = 0 === \strlen($sFileName) ? \preg_replace('/[^a-zA-Z0-9]/', '.', (empty($sMimeIndex) ? '' : $sMimeIndex.'.').$sContentType) : $sFileName; + $sClearedFileName = \MailSo\Base\Utils::StripSpaces(\preg_replace('/[\.]+/', '.', $sFileName)); + $sExt = \MailSo\Base\Utils::GetFileExtension($sClearedFileName); + + if (10 < $iMaxLength && $iMaxLength < \strlen($sClearedFileName) - \strlen($sExt)) + { + $sClearedFileName = \substr($sClearedFileName, 0, $iMaxLength).(empty($sExt) ? '' : '.'.$sExt); + } + + return \MailSo\Base\Utils::ClearFileName(\MailSo\Base\Utils::Utf8Clear($sClearedFileName)); + } + + /** + * @return array + */ + public function DoMessageUploadAttachments() + { + $oAccount = $this->initMailClientConnection(); + + $mResult = false; + $self = $this; + + try + { + $aAttachments = $this->GetActionParam('Attachments', array()); + if (\is_array($aAttachments) && 0 < \count($aAttachments)) + { + $mResult = array(); + foreach ($aAttachments as $sAttachment) + { + $aValues = \RainLoop\Utils::DecodeKeyValuesQ($sAttachment); + if (\is_array($aValues)) + { + $sFolder = isset($aValues['Folder']) ? $aValues['Folder'] : ''; + $iUid = (int) isset($aValues['Uid']) ? $aValues['Uid'] : 0; + $sMimeIndex = (string) isset($aValues['MimeIndex']) ? $aValues['MimeIndex'] : ''; + + $sTempName = \md5($sAttachment); + if (!$this->FilesProvider()->FileExists($oAccount, $sTempName)) + { + $this->MailClient()->MessageMimeStream( + function($rResource, $sContentType, $sFileName, $sMimeIndex = '') use ($oAccount, &$mResult, $sTempName, $sAttachment, $self) { + if (is_resource($rResource)) + { + $sContentType = (empty($sFileName)) ? 'text/plain' : \MailSo\Base\Utils::MimeContentType($sFileName); + $sFileName = $self->MainClearFileName($sFileName, $sContentType, $sMimeIndex); + + if ($self->FilesProvider()->PutFile($oAccount, $sTempName, $rResource)) + { + $mResult[$sTempName] = $sAttachment; + } + } + }, $sFolder, $iUid, true, $sMimeIndex); + } + else + { + $mResult[$sTempName] = $sAttachment; + } + } + } + } + } + catch (\Exception $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::MailServerError, $oException); + } + + return $this->DefaultResponse(__FUNCTION__, $mResult); + } + + /** + * @return array + */ + public function DoComposeUploadExternals() + { + $oAccount = $this->getAccountFromToken(); + + $mResult = false; + $aExternals = $this->GetActionParam('Externals', array()); + if (\is_array($aExternals) && 0 < \count($aExternals)) + { + $oHttp = \MailSo\Base\Http::SingletonInstance(); + + $mResult = array(); + foreach ($aExternals as $sUrl) + { + $mResult[$sUrl] = ''; + + $sTempName = \md5($sUrl); + + $iCode = 0; + $sContentType = ''; + + $rFile = $this->FilesProvider()->GetFile($oAccount, $sTempName, 'wb+'); + if ($rFile && $oHttp->SaveUrlToFile($sUrl, $rFile, '', $sContentType, $iCode, $this->Logger(), 60, + $this->Config()->Get('labs', 'curl_proxy', ''), $this->Config()->Get('labs', 'curl_proxy_auth', ''))) + { + $mResult[$sUrl] = $sTempName; + } + + if (\is_resource($rFile)) + { + @\fclose($rFile); + } + } + } + + return $this->DefaultResponse(__FUNCTION__, $mResult); + } + + /** + * @return array + */ + public function DoComposeUploadDrive() + { + $oAccount = $this->getAccountFromToken(); + + $mResult = false; + + $sUrl = $this->GetActionParam('Url', ''); + $sAccessToken = $this->GetActionParam('AccessToken', ''); + $sGoogleApiKey = (string) $this->Config()->Get('social', 'google_api_key', ''); + + if (0 < \strlen($sUrl) && 0 < \strlen($sAccessToken) && 0 < \strlen($sGoogleApiKey)) + { + $oHttp = \MailSo\Base\Http::SingletonInstance(); + + $mResult[$sUrl] = false; + + $sTempName = \md5($sUrl); + + $iCode = 0; + $sContentType = ''; + + $rFile = $this->FilesProvider()->GetFile($oAccount, $sTempName, 'wb+'); + if ($rFile && $oHttp->SaveUrlToFile($sUrl.'&key='.$sGoogleApiKey, $rFile, '', $sContentType, $iCode, $this->Logger(), 60, + $this->Config()->Get('labs', 'curl_proxy', ''), $this->Config()->Get('labs', 'curl_proxy_auth', ''), + array('Authorization: Bearer '.$sAccessToken))) + { + $mResult[$sUrl] = array($sTempName, 0); + } + + if (\is_resource($rFile)) + { + @\fclose($rFile); + } + + if (isset($mResult[$sUrl][1])) + { + $mResult[$sUrl][1] = $rFile = $this->FilesProvider()->FileSize($oAccount, $sTempName); + } + } + + return $this->DefaultResponse(__FUNCTION__, $mResult); + } + + /** + * @return array + */ + public function DoSocialUsers() + { + $oAccount = $this->getAccountFromToken(); + + $oSettings = $this->SettingsProvider()->Load($oAccount); + + $aData = array( + 'Google' => '', + 'Facebook' => '', + 'Twitter' => '' + ); + + if ($oSettings) + { + $aData['Google'] = $oSettings->GetConf('GoogleSocialName', ''); + $aData['Facebook'] = $oSettings->GetConf('FacebookSocialName', ''); + $aData['Twitter'] = $oSettings->GetConf('TwitterSocialName', ''); + } + + return $this->DefaultResponse(__FUNCTION__, $aData); + } + + /** + * @return array + */ + public function DoSocialGoogleDisconnect() + { + $oAccount = $this->getAccountFromToken(); + return $this->DefaultResponse(__FUNCTION__, $this->Social()->GoogleDisconnect($oAccount)); + } + + /** + * @return array + */ + public function DoSocialTwitterDisconnect() + { + $oAccount = $this->getAccountFromToken(); + return $this->DefaultResponse(__FUNCTION__, $this->Social()->TwitterDisconnect($oAccount)); + } + + /** + * @return array + */ + public function DoSocialFacebookDisconnect() + { + $oAccount = $this->getAccountFromToken(); + return $this->DefaultResponse(__FUNCTION__, $this->Social()->FacebookDisconnect($oAccount)); + } + + /** + * @param int $iError + * @param int $iClientError + * + * @return string + */ + private function getUploadErrorMessageByCode($iError, &$iClientError) + { + $sError = ''; + $iClientError = UploadClientError::NORMAL; + switch($iError) + { + case UPLOAD_ERR_OK: + break; + case UPLOAD_ERR_INI_SIZE: + case UPLOAD_ERR_FORM_SIZE: + case UploadError::CONFIG_SIZE: + case UploadError::EMPTY_FILES_DATA: + $sError = 'File is too big'; + $iClientError = UploadClientError::FILE_IS_TOO_BIG; + break; + case UPLOAD_ERR_PARTIAL: + $sError = 'File partially uploaded'; + $iClientError = UploadClientError::FILE_PARTIALLY_UPLOADED; + break; + case UPLOAD_ERR_NO_FILE: + $sError = 'No file uploaded'; + $iClientError = UploadClientError::FILE_NO_UPLOADED; + break; + case UPLOAD_ERR_NO_TMP_DIR: + case UPLOAD_ERR_CANT_WRITE: + case UPLOAD_ERR_EXTENSION: + $sError = 'Missing temp folder'; + $iClientError = UploadClientError::MISSING_TEMP_FOLDER; + break; + case UploadError::ON_SAVING: + $sError = 'Error on saving file'; + $iClientError = UploadClientError::FILE_ON_SAVING_ERROR; + break; + case UploadError::FILE_TYPE: + $sError = 'Invalid file type'; + $iClientError = UploadClientError::FILE_TYPE; + break; + case UploadError::UNKNOWN: + default: + $sError = 'Unknown error'; + $iClientError = UploadClientError::UNKNOWN; + break; + } + + return $sError; + } + + /** + * @return array + */ + public function Upload() + { + $oAccount = $this->getAccountFromToken(); + + $aResponse = array(); + + $aFile = $this->GetActionParam('File', null); + $iError = $this->GetActionParam('Error', \RainLoop\Enumerations\UploadError::UNKNOWN); + + if ($oAccount && UPLOAD_ERR_OK === $iError && \is_array($aFile)) + { + $sSavedName = 'upload-post-'.\md5($aFile['name'].$aFile['tmp_name']); + if (!$this->FilesProvider()->MoveUploadedFile($oAccount, $sSavedName, $aFile['tmp_name'])) + { + $iError = \RainLoop\Enumerations\UploadError::ON_SAVING; + } + else + { + $sUploadName = $aFile['name']; + $iSize = $aFile['size']; + $sMimeType = $aFile['type']; + + $aResponse['Attachment'] = array( + 'Name' => $sUploadName, + 'TempName' => $sSavedName, + 'MimeType' => $sMimeType, + 'Size' => (int) $iSize + ); + } + } + + if (UPLOAD_ERR_OK !== $iError) + { + $iClientError = \RainLoop\Enumerations\UploadClientError::NORMAL; + $sError = $this->getUploadErrorMessageByCode($iError, $iClientError); + + if (!empty($sError)) + { + $aResponse['ErrorCode'] = $iClientError; + $aResponse['Error'] = $sError; + } + } + + return $this->DefaultResponse(__FUNCTION__, $aResponse); + } + + /** + * @return array + */ + public function DoClearUserBackground() + { + $oAccount = $this->getAccountFromToken(); + + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::USER_BACKGROUND, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $oSettings = $this->SettingsProvider()->Load($oAccount); + if ($oAccount && $oSettings) + { + $this->StorageProvider()->Clear($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'background' + ); + + $oSettings->SetConf('UserBackgroundName', ''); + $oSettings->SetConf('UserBackgroundHash', ''); + } + + return $this->DefaultResponse(__FUNCTION__, $oAccount && $oSettings ? + $this->SettingsProvider()->Save($oAccount, $oSettings) : false); + } + + /** + * @return array + */ + public function UploadBackground() + { + $oAccount = $this->getAccountFromToken(); + + if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::USER_BACKGROUND, $oAccount)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $sName = ''; + $sHash = ''; + + $aFile = $this->GetActionParam('File', null); + $iError = $this->GetActionParam('Error', \RainLoop\Enumerations\UploadError::UNKNOWN); + + if ($oAccount && UPLOAD_ERR_OK === $iError && \is_array($aFile)) + { + $sMimeType = \strtolower(\MailSo\Base\Utils::MimeContentType($aFile['name'])); + if (\in_array($sMimeType, array('image/png', 'image/jpg', 'image/jpeg'))) + { + $sSavedName = 'upload-post-'.\md5($aFile['name'].$aFile['tmp_name']); + if (!$this->FilesProvider()->MoveUploadedFile($oAccount, $sSavedName, $aFile['tmp_name'])) + { + $iError = \RainLoop\Enumerations\UploadError::ON_SAVING; + } + else + { + $rData = $this->FilesProvider()->GetFile($oAccount, $sSavedName); + if (@\is_resource($rData)) + { + $sData = @\stream_get_contents($rData); + if (!empty($sData) && 0 < \strlen($sData)) + { + $sName = $aFile['name']; + if (empty($sName)) + { + $sName = '_'; + } + + if ($this->StorageProvider()->Put($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'background', + \json_encode(array( + 'Name' => $aFile['name'], + 'ContentType' => $sMimeType, + 'Raw' => \base64_encode($sData) + )) + )) + { + $oSettings = $this->SettingsProvider()->Load($oAccount); + if ($oSettings) + { + $sHash = \MailSo\Base\Utils::Md5Rand($sName.APP_VERSION.APP_SALT); + + $oSettings->SetConf('UserBackgroundName', $sName); + $oSettings->SetConf('UserBackgroundHash', $sHash); + $this->SettingsProvider()->Save($oAccount, $oSettings); + } + } + } + + unset($sData); + } + + if (@\is_resource($rData)) + { + @\fclose($rData); + } + + unset($rData); + } + + $this->FilesProvider()->Clear($oAccount, $sSavedName); + } + else + { + $iError = \RainLoop\Enumerations\UploadError::FILE_TYPE; + } + } + + if (UPLOAD_ERR_OK !== $iError) + { + $iClientError = \RainLoop\Enumerations\UploadClientError::NORMAL; + $sError = $this->getUploadErrorMessageByCode($iError, $iClientError); + + if (!empty($sError)) + { + return $this->FalseResponse(__FUNCTION__, $iClientError, $sError); + } + } + + return $this->DefaultResponse(__FUNCTION__, !empty($sName) && !empty($sHash) ? array( + 'Name' => $sName, + 'Hash' => $sHash + ) : false); + } + + /** + * @return array + */ + public function UploadContacts() + { + $oAccount = $this->getAccountFromToken(); + + $mResponse = false; + + $aFile = $this->GetActionParam('File', null); + $iError = $this->GetActionParam('Error', \RainLoop\Enumerations\UploadError::UNKNOWN); + + if ($oAccount && UPLOAD_ERR_OK === $iError && \is_array($aFile)) + { + $sSavedName = 'upload-post-'.\md5($aFile['name'].$aFile['tmp_name']); + if (!$this->FilesProvider()->MoveUploadedFile($oAccount, $sSavedName, $aFile['tmp_name'])) + { + $iError = \RainLoop\Enumerations\UploadError::ON_SAVING; + } + else + { + @\ini_set('auto_detect_line_endings', true); + $mData = $this->FilesProvider()->GetFile($oAccount, $sSavedName); + if ($mData) + { + $sFileStart = @\fread($mData, 20); + \rewind($mData); + + if (false !== $sFileStart) + { + $sFileStart = \trim($sFileStart); + if (false !== \strpos($sFileStart, 'BEGIN:VCARD')) + { + $mResponse = $this->importContactsFromVcfFile($oAccount, $mData); + } + else if (false !== \strpos($sFileStart, ',') || false !== \strpos($sFileStart, ';')) + { + $mResponse = $this->importContactsFromCsvFile($oAccount, $mData, $sFileStart); + } + } + } + + if (\is_resource($mData)) + { + @\fclose($mData); + } + + unset($mData); + $this->FilesProvider()->Clear($oAccount, $sSavedName); + + @\ini_set('auto_detect_line_endings', false); + } + } + + if (UPLOAD_ERR_OK !== $iError) + { + $iClientError = \RainLoop\Enumerations\UploadClientError::NORMAL; + $sError = $this->getUploadErrorMessageByCode($iError, $iClientError); + + if (!empty($sError)) + { + return $this->FalseResponse(__FUNCTION__, $iClientError, $sError); + } + } + + return $this->DefaultResponse(__FUNCTION__, $mResponse); + } + + /** + * @param \RainLoop\Model\Account $oAccount + * @param resource $rFile + * @param string $sFileStart + * + * @return int + */ + private function importContactsFromCsvFile($oAccount, $rFile, $sFileStart) + { + $iCount = 0; + $aHeaders = null; + $aData = array(); + + if ($oAccount && \is_resource($rFile)) + { + $oAddressBookProvider = $this->AddressBookProvider($oAccount); + if ($oAddressBookProvider && $oAddressBookProvider->IsActive()) + { + $sDelimiter = ((int) \strpos($sFileStart, ',') > (int) \strpos($sFileStart, ';')) ? ',' : ';'; + + @\setlocale(LC_CTYPE, 'en_US.UTF-8'); + while (false !== ($mRow = \fgetcsv($rFile, 5000, $sDelimiter, '"'))) + { + if (null === $aHeaders) + { + if (3 >= \count($mRow)) + { + return 0; + } + + $aHeaders = $mRow; + + foreach ($aHeaders as $iIndex => $sHeaderValue) + { + $aHeaders[$iIndex] = \MailSo\Base\Utils::Utf8Clear($sHeaderValue); + } + } + else + { + $aNewItem = array(); + foreach ($aHeaders as $iIndex => $sHeaderValue) + { + $aNewItem[$sHeaderValue] = isset($mRow[$iIndex]) ? $mRow[$iIndex] : ''; + } + + $aData[] = $aNewItem; + } + } + + if (\is_array($aData) && 0 < \count($aData)) + { + $this->Logger()->Write('Import contacts from csv'); + $iCount = $oAddressBookProvider->ImportCsvArray($oAccount->ParentEmailHelper(), $aData); + } + } + } + + return $iCount; + } + + /** + * @param \RainLoop\Model\Account $oAccount + * @param resource $rFile + * + * @return int + */ + private function importContactsFromVcfFile($oAccount, $rFile) + { + $iCount = 0; + if ($oAccount && \is_resource($rFile)) + { + $oAddressBookProvider = $this->AddressBookProvider($oAccount); + if ($oAddressBookProvider && $oAddressBookProvider->IsActive()) + { + $sFile = \stream_get_contents($rFile); + if (\is_resource($rFile)) + { + \fclose($rFile); + } + + if (is_string($sFile) && 5 < \strlen($sFile)) + { + $this->Logger()->Write('Import contacts from vcf'); + $iCount = $oAddressBookProvider->ImportVcfFile($oAccount->ParentEmailHelper(), $sFile); + } + } + } + + return $iCount; + } + + /** + * @return bool + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function RawViewAsPlain() + { + $this->initMailClientConnection(); + + $sRawKey = (string) $this->GetActionParam('RawKey', ''); + $aValues = $this->getDecodedRawKeyValue($sRawKey); + + $sFolder = isset($aValues['Folder']) ? $aValues['Folder'] : ''; + $iUid = (int) (isset($aValues['Uid']) ? $aValues['Uid'] : 0); + $sMimeIndex = (string) (isset($aValues['MimeIndex']) ? $aValues['MimeIndex'] : ''); + + \header('Content-Type: text/plain', true); + + return $this->MailClient()->MessageMimeStream(function ($rResource) { + if (\is_resource($rResource)) + { + \MailSo\Base\Utils::FpassthruWithTimeLimitReset($rResource); + } + }, $sFolder, $iUid, true, $sMimeIndex); + } + + /** + * @return string + */ + public function RawFramedView() + { + $oAccount = $this->getAccountFromToken(false); + if ($oAccount) + { + $sRawKey = (string) $this->GetActionParam('RawKey', ''); + $aParams = $this->GetActionParam('Params', null); + $this->Http()->ServerNoCache(); + + $aData = \RainLoop\Utils::DecodeKeyValuesQ($sRawKey); + if (isset($aParams[0], $aParams[1], $aParams[2]) && + 'Raw' === $aParams[0] && 'FramedView' === $aParams[2] && isset($aData['Framed']) && $aData['Framed'] && $aData['FileName']) + { + if ($this->isFileHasFramedPreview($aData['FileName'])) + { + $sNewSpecAuthToken = $this->GetShortLifeSpecAuthToken(); + if (!empty($sNewSpecAuthToken)) + { + $aParams[1] = '_'.$sNewSpecAuthToken; + $aParams[2] = 'View'; + + \array_shift($aParams); + $sLast = \array_pop($aParams); + + $sUrl = $this->Http()->GetFullUrl().'?/Raw/&q[]=/'.\implode('/', $aParams).'/&q[]=/'.$sLast; + $sFullUrl = 'https://docs.google.com/viewer?embedded=true&url='.\urlencode($sUrl); + + @\header('Content-Type: text/html; charset=utf-8'); + echo ''. + ''. + ''. + ''; + } + } + } + } + + + return true; + + } + + /** + * @return bool + * + * @throws \MailSo\Base\Exceptions\Exception + */ + public function Append() + { + $oAccount = $this->initMailClientConnection(); + + $sFolderFullNameRaw = $this->GetActionParam('Folder', ''); + + $_FILES = isset($_FILES) ? $_FILES : null; + if ($oAccount instanceof \RainLoop\Model\Account && + $this->Config()->Get('labs', 'allow_message_append', false) && + isset($_FILES, $_FILES['AppendFile'], $_FILES['AppendFile']['name'], + $_FILES['AppendFile']['tmp_name'], $_FILES['AppendFile']['size'])) + { + if (is_string($_FILES['AppendFile']['tmp_name']) && 0 < strlen($_FILES['AppendFile']['tmp_name'])) + { + if (\UPLOAD_ERR_OK === (int) $_FILES['AppendFile']['error'] && !empty($sFolderFullNameRaw)) + { + $sSavedName = 'append-post-'.md5($sFolderFullNameRaw.$_FILES['AppendFile']['name'].$_FILES['AppendFile']['tmp_name']); + + if ($this->FilesProvider()->MoveUploadedFile($oAccount, + $sSavedName, $_FILES['AppendFile']['tmp_name'])) + { + $iMessageStreamSize = $this->FilesProvider()->FileSize($oAccount, $sSavedName); + $rMessageStream = $this->FilesProvider()->GetFile($oAccount, $sSavedName); + + $this->MailClient()->MessageAppendStream($rMessageStream, $iMessageStreamSize, $sFolderFullNameRaw); + + $this->FilesProvider()->Clear($oAccount, $sSavedName); + } + } + } + } + + return $this->DefaultResponse(__FUNCTION__, true); + } + + /** + * @param bool $bAdmin + * @param bool $bMobile = false + * @param \RainLoop\Model\Account $oAccount = null + * + * @return array + */ + public function Capa($bAdmin, $bMobile = false, $oAccount = null) + { + $oConfig = $this->Config(); + + $aResult = array(); + + if ($oConfig->Get('capa', 'folders', true)) + { + $aResult[] = \RainLoop\Enumerations\Capa::FOLDERS; + + if ($oConfig->Get('capa', 'messagelist_actions', true)) + { + $aResult[] = \RainLoop\Enumerations\Capa::MESSAGELIST_ACTIONS; + + if ($oConfig->Get('capa', 'dangerous_actions', true)) + { + $aResult[] = \RainLoop\Enumerations\Capa::DANGEROUS_ACTIONS; + } + } + } + + if ($oConfig->Get('capa', 'reload', true)) + { + $aResult[] = \RainLoop\Enumerations\Capa::RELOAD; + } + + if ($oConfig->Get('capa', 'quota', true)) + { + $aResult[] = \RainLoop\Enumerations\Capa::QUOTA; + } + + if ($oConfig->Get('capa', 'settings', true)) + { + $aResult[] = \RainLoop\Enumerations\Capa::SETTINGS; + + if ($oConfig->Get('webmail', 'allow_additional_accounts', false)) + { + $aResult[] = \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS; + } + + if ($oConfig->Get('webmail', 'allow_additional_identities', false)) + { + $aResult[] = \RainLoop\Enumerations\Capa::IDENTITIES; + } + + if ($oConfig->Get('capa', 'x-templates', true) && !$bMobile) + { + $aResult[] = \RainLoop\Enumerations\Capa::TEMPLATES; + } + + if ($oConfig->Get('webmail', 'allow_themes', false) && !$bMobile) + { + $aResult[] = \RainLoop\Enumerations\Capa::THEMES; + } + + if ($oConfig->Get('webmail', 'allow_user_background', false) && !$bMobile) + { + $aResult[] = \RainLoop\Enumerations\Capa::USER_BACKGROUND; + } + + if ($oConfig->Get('security', 'openpgp', false) && !$bMobile) + { + $aResult[] = \RainLoop\Enumerations\Capa::OPEN_PGP; + } + + if ($oConfig->Get('capa', 'filters', false)) + { + $aResult[] = \RainLoop\Enumerations\Capa::FILTERS; + if ($bAdmin || ($oAccount && $oAccount->Domain()->UseSieve())) + { + $aResult[] = \RainLoop\Enumerations\Capa::SIEVE; + } + } + } + + if ($oConfig->Get('security', 'allow_two_factor_auth', false) && + ($bAdmin || ($oAccount && !$oAccount->IsAdditionalAccount()))) + { + $aResult[] = \RainLoop\Enumerations\Capa::TWO_FACTOR; + + if ($oConfig->Get('security', 'force_two_factor_auth', false) && + ($bAdmin || ($oAccount && !$oAccount->IsAdditionalAccount()))) + { + $aResult[] = \RainLoop\Enumerations\Capa::TWO_FACTOR_FORCE; + } + } + + if ($oConfig->Get('capa', 'help', true) && !$bMobile) + { + $aResult[] = \RainLoop\Enumerations\Capa::HELP; + } + + if ($oConfig->Get('capa', 'attachments_actions', false)) + { + $aResult[] = \RainLoop\Enumerations\Capa::ATTACHMENTS_ACTIONS; + } + + if ($oConfig->Get('capa', 'message_actions', true)) + { + $aResult[] = \RainLoop\Enumerations\Capa::MESSAGE_ACTIONS; + } + + if ($oConfig->Get('capa', 'composer', true)) + { + $aResult[] = \RainLoop\Enumerations\Capa::COMPOSER; + + if ($oConfig->Get('capa', 'contacts', true)) + { + $aResult[] = \RainLoop\Enumerations\Capa::CONTACTS; + } + } + + if ($oConfig->Get('capa', 'search', true)) + { + $aResult[] = \RainLoop\Enumerations\Capa::SEARCH; + + if ($oConfig->Get('capa', 'search_adv', true) && !$bMobile) + { + $aResult[] = \RainLoop\Enumerations\Capa::SEARCH_ADV; + } + } + + if ($oConfig->Get('labs', 'allow_gravatar', false)) + { + $aResult[] = \RainLoop\Enumerations\Capa::GRAVATAR; + } + + if ($oConfig->Get('interface', 'show_attachment_thumbnail', true)) + { + $aResult[] = \RainLoop\Enumerations\Capa::ATTACHMENT_THUMBNAILS; + } + + if ($oConfig->Get('labs', 'allow_prefetch', false) && !$bMobile) + { + $aResult[] = \RainLoop\Enumerations\Capa::PREFETCH; + } + + if (!\RainLoop\Utils::IsOwnCloud()) + { + $aResult[] = \RainLoop\Enumerations\Capa::AUTOLOGOUT; + } + + return $aResult; + } + + /** + * @param bool $bAdmin + * @param bool $bMobile + * @param string $sName + * @param \RainLoop\Model\Account $oAccount = null + * + * @return bool + */ + public function GetCapa($bAdmin, $bMobile, $sName, $oAccount = null) + { + return \in_array($sName, $this->Capa($bAdmin, $bMobile, $oAccount)); + } + + /** + * @param string $sKey + * + * @return string + */ + public function etag($sKey) + { + return \md5('Etag:'.\md5($sKey.\md5($this->Config()->Get('cache', 'index', '')))); + } + + /** + * @param string $sKey + * @param bool $bForce = false + * + * @return bool + */ + public function cacheByKey($sKey, $bForce = false) + { + $bResult = false; + if (!empty($sKey) && ($bForce || ($this->Config()->Get('cache', 'enable', true) && $this->Config()->Get('cache', 'http', true)))) + { + $iExpires = $this->Config()->Get('cache', 'http_expires', 3600); + if (0 < $iExpires) + { + $this->oHttp->ServerUseCache($this->etag($sKey), 1382478804, time() + $iExpires); + $bResult = true; + } + } + + if (!$bResult) + { + $this->oHttp->ServerNoCache(); + } + + return $bResult; + } + + /** + * @param string $sKey + * @param bool $bForce = false + * + * @return void + */ + public function verifyCacheByKey($sKey, $bForce = false) + { + if (!empty($sKey) && ($bForce || $this->Config()->Get('cache', 'enable', true) && $this->Config()->Get('cache', 'http', true))) + { + $sIfNoneMatch = $this->Http()->GetHeader('If-None-Match', ''); + if ($this->etag($sKey) === $sIfNoneMatch) + { + $this->Http()->StatusHeader(304); + $this->cacheByKey($sKey); + exit(0); + } + } + } + + /** + * @param \RainLoop\Model\Account $oAccount + * @param string $sHash + * + * @return array + */ + private function getMimeFileByHash($oAccount, $sHash) + { + $aValues = $this->getDecodedRawKeyValue($sHash); + + $sFolder = isset($aValues['Folder']) ? $aValues['Folder'] : ''; + $iUid = (int) isset($aValues['Uid']) ? $aValues['Uid'] : 0; + $sMimeIndex = (string) isset($aValues['MimeIndex']) ? $aValues['MimeIndex'] : ''; + + $sContentTypeIn = (string) isset($aValues['MimeType']) ? $aValues['MimeType'] : ''; + $sFileNameIn = (string) isset($aValues['FileName']) ? $aValues['FileName'] : ''; + + $oFileProvider = $this->FilesProvider(); + + $sResultHash = ''; + + $mResult = $this->MailClient()->MessageMimeStream(function($rResource, $sContentType, $sFileName, $sMimeIndex = '') + use ($oAccount, $oFileProvider, $sFileNameIn, $sContentTypeIn, &$sResultHash) { + + unset($sContentType, $sFileName, $sMimeIndex); + + if ($oAccount && \is_resource($rResource)) + { + $sHash = \MailSo\Base\Utils::Md5Rand($sFileNameIn.'~'.$sContentTypeIn); + $rTempResource = $oFileProvider->GetFile($oAccount, $sHash, 'wb+'); + + if (@\is_resource($rTempResource)) + { + if (false !== \MailSo\Base\Utils::MultipleStreamWriter($rResource, array($rTempResource))) + { + $sResultHash = $sHash; + } + + @\fclose($rTempResource); + } + } + + }, $sFolder, $iUid, true, $sMimeIndex); + + $aValues['FileHash'] = ''; + if ($mResult) + { + $aValues['FileHash'] = $sResultHash; + } + + return $aValues; + } + + /** + * @param \Imagine\Image\AbstractImage $oImage + * @param int $iOrientation + */ + private function rotateImageByOrientation(&$oImage, $iOrientation) + { + if (0 < $iOrientation) + { + switch ($iOrientation) + { + default: + case 1: + break; + + case 2: // flip horizontal + $oImage->flipHorizontally(); + break; + + case 3: // rotate 180 + $oImage->rotate(180); + break; + + case 4: // flip vertical + $oImage->flipVertically(); + break; + + case 5: // vertical flip + 90 rotate + $oImage->flipVertically(); + $oImage->rotate(90); + break; + + case 6: // rotate 90 + $oImage->rotate(90); + break; + + case 7: // horizontal flip + 90 rotate + $oImage->flipHorizontally(); + $oImage->rotate(90); + break; + + case 8: // rotate 270 + $oImage->rotate(270); + break; + } + } + } + + /** + * @param \Imagine\Image\AbstractImage $oImage + */ + public function correctImageOrientation($oImage, $bDetectImageOrientation = true, $iThumbnailBoxSize = null) + { + $iOrientation = 1; + if ($bDetectImageOrientation && \MailSo\Base\Utils::FunctionExistsAndEnabled('exif_read_data') && + \MailSo\Base\Utils::FunctionExistsAndEnabled('gd_info')) + { + $oMetadata = $oImage->metadata(new \Imagine\Image\Metadata\ExifMetadataReader()); + $iOrientation = isset($oMetadata['ifd0.Orientation']) && + is_numeric($oMetadata['ifd0.Orientation']) ? (int) $oMetadata['ifd0.Orientation'] : 1; + } + + if ($iThumbnailBoxSize && 0 < $iThumbnailBoxSize) + { + $oImage = $oImage->thumbnail( + new \Imagine\Image\Box($iThumbnailBoxSize, $iThumbnailBoxSize), + \Imagine\Image\ImageInterface::THUMBNAIL_OUTBOUND); + + $this->rotateImageByOrientation($oImage, $iOrientation); + } + else + { + $this->rotateImageByOrientation($oImage, $iOrientation); + } + + return $oImage; + } + + /** + * @param bool $bDownload + * @param bool $bThumbnail = false + * + * @return bool + */ + private function rawSmart($bDownload, $bThumbnail = false) + { + $sRawKey = (string) $this->GetActionParam('RawKey', ''); + $aValues = $this->getDecodedRawKeyValue($sRawKey); + + $sRange = $this->Http()->GetHeader('Range'); + + $aMatch = array(); + $sRangeStart = $sRangeEnd = ''; + $bIsRangeRequest = false; + + if (!empty($sRange) && 'bytes=0-' !== \strtolower($sRange) && \preg_match('/^bytes=([0-9]+)-([0-9]*)/i', \trim($sRange), $aMatch)) + { + $sRangeStart = $aMatch[1]; + $sRangeEnd = $aMatch[2]; + + $bIsRangeRequest = true; + } + + $sFolder = isset($aValues['Folder']) ? $aValues['Folder'] : ''; + $iUid = isset($aValues['Uid']) ? (int) $aValues['Uid'] : 0; + $sMimeIndex = isset($aValues['MimeIndex']) ? (string) $aValues['MimeIndex'] : ''; + + $sContentTypeIn = isset($aValues['MimeType']) ? (string) $aValues['MimeType'] : ''; + $sFileNameIn = isset($aValues['FileName']) ? (string) $aValues['FileName'] : ''; + $sFileHashIn = isset($aValues['FileHash']) ? (string) $aValues['FileHash'] : ''; + + $bDetectImageOrientation = !!$this->Config()->Get('labs', 'detect_image_exif_orientation', true); + + if (!empty($sFileHashIn)) + { + $this->verifyCacheByKey($sRawKey); + + $oAccount = $this->getAccountFromToken(); + + $sContentTypeOut = empty($sContentTypeIn) ? + \MailSo\Base\Utils::MimeContentType($sFileNameIn) : $sContentTypeIn; + + $sFileNameOut = $this->MainClearFileName($sFileNameIn, $sContentTypeIn, $sMimeIndex); + + $rResource = $this->FilesProvider()->GetFile($oAccount, $sFileHashIn); + if (\is_resource($rResource)) + { + $sFileNameOut = \MailSo\Base\Utils::ConvertEncoding( + $sFileNameOut, \MailSo\Base\Enumerations\Charset::UTF_8, + \MailSo\Base\Enumerations\Charset::CP858); + + \header('Content-Type: '.$sContentTypeOut); + \header('Content-Disposition: attachment; '. + \trim(\MailSo\Base\Utils::EncodeHeaderUtf8AttributeValue('filename', $sFileNameOut)), true); + + \header('Accept-Ranges: none', true); + \header('Content-Transfer-Encoding: binary'); + + \MailSo\Base\Utils::FpassthruWithTimeLimitReset($rResource); + return true; + } + + return false; + } + else + { + if (!empty($sFolder) && 0 < $iUid) + { + $this->verifyCacheByKey($sRawKey); + } + } + + $oAccount = $this->initMailClientConnection(); + + $self = $this; + return $this->MailClient()->MessageMimeStream( + function($rResource, $sContentType, $sFileName, $sMimeIndex = '') use ( + $self, $oAccount, $sRawKey, $sContentTypeIn, $sFileNameIn, $bDownload, $bThumbnail, $bDetectImageOrientation, + $bIsRangeRequest, $sRangeStart, $sRangeEnd + ) { + if ($oAccount && \is_resource($rResource)) + { + \MailSo\Base\Utils::ResetTimeLimit(); + + $sContentTypeOut = $sContentTypeIn; + if (empty($sContentTypeOut)) + { + $sContentTypeOut = $sContentType; + if (empty($sContentTypeOut)) + { + $sContentTypeOut = (empty($sFileName)) ? 'text/plain' : \MailSo\Base\Utils::MimeContentType($sFileName); + } + } + + $sFileNameOut = $sFileNameIn; + if (empty($sFileNameOut)) + { + $sFileNameOut = $sFileName; + } + + $sFileNameOut = $self->MainClearFileName($sFileNameOut, $sContentTypeOut, $sMimeIndex); + + $self->cacheByKey($sRawKey); + + $sLoadedData = null; + if (!$bDownload) + { + if ($bThumbnail) + { + try + { + $oImagine = new \Imagine\Gd\Imagine(); + + $oImage = $oImagine->load(\stream_get_contents($rResource)); + + $oImage = $self->correctImageOrientation($oImage, $bDetectImageOrientation, 60); + + \header('Content-Disposition: inline; '. + \trim(\MailSo\Base\Utils::EncodeHeaderUtf8AttributeValue('filename', $sFileNameOut.'_thumb60x60.png')), true); + + $oImage->show('png'); + } + catch (\Exception $oException) + { + $self->Logger()->WriteExceptionShort($oException); + } + } + else if ($bDetectImageOrientation && + \in_array($sContentTypeOut, array('image/png', 'image/jpeg', 'image/jpg')) && + \MailSo\Base\Utils::FunctionExistsAndEnabled('gd_info')) + { + try + { + $oImagine = new \Imagine\Gd\Imagine(); + + $sLoadedData = \stream_get_contents($rResource); + + $oImage = $oImagine->load($sLoadedData); + + $oImage = $self->correctImageOrientation($oImage, $bDetectImageOrientation); + + \header('Content-Disposition: inline; '. + \trim(\MailSo\Base\Utils::EncodeHeaderUtf8AttributeValue('filename', $sFileNameOut)), true); + + $oImage->show($sContentTypeOut === 'image/png' ? 'png' : 'jpg'); + } + catch (\Exception $oException) + { + $self->Logger()->WriteExceptionShort($oException); + } + } + else + { + $sLoadedData = \stream_get_contents($rResource); + } + } + + if ($bDownload || $sLoadedData) + { + if (!headers_sent()) { + \header('Content-Type: '.$sContentTypeOut); + \header('Content-Disposition: '.($bDownload ? 'attachment' : 'inline').'; '. + \trim(\MailSo\Base\Utils::EncodeHeaderUtf8AttributeValue('filename', $sFileNameOut)), true); + + \header('Accept-Ranges: bytes'); + \header('Content-Transfer-Encoding: binary'); + } + + if ($bIsRangeRequest && !$sLoadedData) + { + $sLoadedData = \stream_get_contents($rResource); + } + + \MailSo\Base\Utils::ResetTimeLimit(); + + if ($sLoadedData) + { + if ($bIsRangeRequest && (0 < \strlen($sRangeStart) || 0 < \strlen($sRangeEnd))) + { + $iFullContentLength = \strlen($sLoadedData); + + $self->Http()->StatusHeader(206); + + $iRangeStart = (int) $sRangeStart; + $iRangeEnd = (int) $sRangeEnd; + + if ('' === $sRangeEnd) + { + $sLoadedData = 0 < $iRangeStart ? \substr($sLoadedData, $iRangeStart) : $sLoadedData; + } + else + { + if ($iRangeStart < $iRangeEnd) + { + $sLoadedData = \substr($sLoadedData, $iRangeStart, $iRangeEnd - $iRangeStart); + } + else + { + $sLoadedData = 0 < $iRangeStart ? \substr($sLoadedData, $iRangeStart) : $sLoadedData; + } + } + + $iContentLength = \strlen($sLoadedData); + + if (0 < $iContentLength) + { + \header('Content-Length: '.$iContentLength, true); + \header('Content-Range: bytes '.$sRangeStart.'-'.(0 < $iRangeEnd ? $iRangeEnd : $iFullContentLength - 1).'/'.$iFullContentLength); + } + + echo $sLoadedData; + } + else + { + echo $sLoadedData; + } + + unset($sLoadedData); + } + else + { + \MailSo\Base\Utils::FpassthruWithTimeLimitReset($rResource); + } + } + } + }, $sFolder, $iUid, true, $sMimeIndex); + } + + /** + * @return bool + */ + public function RawDownload() + { + return $this->rawSmart(true); + } + + /** + * @return bool + */ + public function RawView() + { + return $this->rawSmart(false); + } + + /** + * @return bool + */ + public function RawViewThumbnail() + { + return $this->rawSmart(false, true); + } + + /** + * @return bool + */ + public function RawUserBackground() + { + $sRawKey = (string) $this->GetActionParam('RawKey', ''); + $this->verifyCacheByKey($sRawKey); + + $oAccount = $this->getAccountFromToken(); + + $sData = $this->StorageProvider()->Get($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'background' + ); + + if (!empty($sData)) + { + $aData = \json_decode($sData, true); + unset($sData); + + if (!empty($aData['ContentType']) && !empty($aData['Raw']) && + \in_array($aData['ContentType'], array('image/png', 'image/jpg', 'image/jpeg'))) + { + $this->cacheByKey($sRawKey); + + @\header('Content-Type: '.$aData['ContentType']); + echo \base64_decode($aData['Raw']); + unset($aData); + + return true; + } + } + + return false; + } + + /** + * @return bool + */ + public function RawPublic() + { + $sRawKey = (string) $this->GetActionParam('RawKey', ''); + $this->verifyCacheByKey($sRawKey); + + $sHash = $sRawKey; + $sData = ''; + + if (!empty($sHash)) + { + $sData = $this->StorageProvider()->Get(null, + \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, + \RainLoop\KeyPathHelper::PublicFile($sHash) + ); + } + + $aMatch = array(); + if (!empty($sData) && 0 === \strpos($sData, 'data:') && + \preg_match('/^data:([^:]+):/', $sData, $aMatch) && !empty($aMatch[1])) + { + $sContentType = \trim($aMatch[1]); + if (\in_array($sContentType, array('image/png', 'image/jpg', 'image/jpeg'))) + { + $this->cacheByKey($sRawKey); + + @\header('Content-Type: '.$sContentType); + echo \preg_replace('/^data:[^:]+:/', '', $sData); + unset($sData); + + return true; + } + } + + return false; + } + + /** + * @param string $sFileName + * + * @return bool + */ + public function isFileHasFramedPreview($sFileName) + { + $sExt = \MailSo\Base\Utils::GetFileExtension($sFileName); + return \in_array($sExt, array('doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx')); + } + + /** + * @param string $sFileName + * + * @return bool + */ + public function isFileHasThumbnail($sFileName) + { + static $aCache = array(); + + $sExt = \MailSo\Base\Utils::GetFileExtension($sFileName); + if (isset($aCache[$sExt])) + { + return $aCache[$sExt]; + } + + $bResult = \function_exists('gd_info'); + if ($bResult) + { + $bResult = false; + switch ($sExt) + { + case 'png': + $bResult = \function_exists('imagecreatefrompng'); + break; + case 'gif': + $bResult = \function_exists('imagecreatefromgif'); + break; + case 'jpg': + case 'jpeg': + $bResult = \function_exists('imagecreatefromjpeg'); + break; + } + } + + $aCache[$sExt] = $bResult; + + return $bResult; + } + + /** + * @return bool + */ + public function RawAvatar() + { + $sData = ''; + + $sRawKey = (string) $this->GetActionParam('RawKey', ''); + $sRawKey = \urldecode($sRawKey); + + $this->verifyCacheByKey($sRawKey); + + if (0 < \strlen($sRawKey) && \preg_match('/^[^@]+@([^@]+)$/', $sRawKey)) + { + $sEmail = \MailSo\Base\Utils::IdnToAscii($sRawKey, true); + + $iCode = 0; + $sContentType = ''; + + $sGravatarUrl = 'http://gravatar.com/avatar/'.\md5(strtolower($sEmail)).'.jpg?s=80&d=404'; + + $this->Logger()->Write('gravatar: '.$sGravatarUrl); + + $sData = $this->Http()->GetUrlAsString($sGravatarUrl, null, $sContentType, $iCode, null, 5, + $this->Config()->Get('labs', 'curl_proxy', ''), $this->Config()->Get('labs', 'curl_proxy_auth', '')); + + $sContentType = \strtolower(\trim($sContentType)); + if (200 !== $iCode || empty($sData) || !\in_array($sContentType, array('image/jpeg', 'image/jpg', 'image/png'))) + { + $this->Logger()->Write('gravatar: code: '.$iCode.', content-type: '.$sContentType); + + $sData = ''; + + $aMatch = array(); + if (\preg_match('/^[^@]+@([a-z0-9\-\.]+)$/', $sEmail, $aMatch) && !empty($aMatch[1])) + { + $sDomain = $aMatch[1]; + if (\file_exists(APP_VERSION_ROOT_PATH.'app/resources/images/services/'.$sDomain.'.png')) + { + $sContentType = 'image/png'; + $sData = \file_get_contents(APP_VERSION_ROOT_PATH.'app/resources/images/services/'.$sDomain.'.png'); + } + } + } + } + + if (empty($sData) || empty($sContentType)) + { + $sContentType = 'image/png'; + $sData = \file_get_contents(APP_VERSION_ROOT_PATH.'app/resources/images/empty-contact.png'); + } + + $this->cacheByKey($sRawKey); + \header('Content-Type: '.$sContentType); + echo $sData; + return true; + } + + /** + * @return bool + */ + public function RawContactsVcf() + { + $oAccount = $this->getAccountFromToken(); + + \header('Content-Type: text/x-vcard; charset=UTF-8'); + \header('Content-Disposition: attachment; filename="contacts.vcf"', true); + \header('Accept-Ranges: none', true); + \header('Content-Transfer-Encoding: binary'); + + $this->oHttp->ServerNoCache(); + + return $this->AddressBookProvider($oAccount)->IsActive() ? + $this->AddressBookProvider($oAccount)->Export($oAccount->ParentEmailHelper(), 'vcf') : false; + } + + /** + * @return bool + */ + public function RawContactsCsv() + { + $oAccount = $this->getAccountFromToken(); + + \header('Content-Type: text/csv; charset=UTF-8'); + \header('Content-Disposition: attachment; filename="contacts.csv"', true); + \header('Accept-Ranges: none', true); + \header('Content-Transfer-Encoding: binary'); + + $this->oHttp->ServerNoCache(); + + return $this->AddressBookProvider($oAccount)->IsActive() ? + $this->AddressBookProvider($oAccount)->Export($oAccount->ParentEmailHelper(), 'csv') : false; + } + + /** + * @return \RainLoop\Model\Account|bool + */ + private function initMailClientConnection() + { + $oAccount = null; + + if (!$this->MailClient()->IsLoggined()) + { + $oAccount = $this->getAccountFromToken(); + + try + { + $oAccount->IncConnectAndLoginHelper($this->Plugins(), $this->MailClient(), $this->Config()); + } + catch (\MailSo\Net\Exceptions\ConnectionException $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::ConnectionError, $oException); + } + catch (\Exception $oException) + { + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError, $oException); + } + + $this->MailClient()->ImapClient()->__FORCE_SELECT_ON_EXAMINE__ = !!$this->Config()->Get('labs', 'use_imap_force_selection'); + } + + return $oAccount; + } + + /** + * @param string $sRawKey + * + * @return array | false + */ + private function getDecodedRawKeyValue($sRawKey) + { + $bResult = false; + if (!empty($sRawKey)) + { + $aValues = \RainLoop\Utils::DecodeKeyValuesQ($sRawKey); + if (is_array($aValues)) + { + $bResult = $aValues; + } + } + + return $bResult; + } + + /** + * @param string $sRawKey + * @param int | null $iLenCache + * @return array | bool + */ + private function getDecodedClientRawKeyValue($sRawKey, $iLenCache = null) + { + $mResult = false; + if (!empty($sRawKey)) + { + $sRawKey = \MailSo\Base\Utils::UrlSafeBase64Decode($sRawKey); + $aValues = explode("\x0", $sRawKey); + + if (is_array($aValues) && (null === $iLenCache || $iLenCache === count($aValues))) + { + $mResult = $aValues; + } + } + + return $mResult; + } + + /** + * @return string + */ + public function StaticCache() + { + static $sCache = null; + if (!$sCache) + { + $sCache = \md5(APP_VERSION.$this->Plugins()->Hash()); + } + return $sCache; + } + + /** + * @param string $sTheme + * + * @return string + */ + public function ThemeLink($sTheme, $bAdmin) + { + return './?/Css/0/'.($bAdmin ? 'Admin' : 'User').'/-/'.$sTheme.'/-/'.$this->StaticCache().'/Hash/-/'; + } + + /** + * @param string $sTheme + * + * @return string + */ + public function ValidateTheme($sTheme, $bMobile = false) + { + if ($bMobile) + { + return 'Mobile'; + } + + return \in_array($sTheme, $this->GetThemes($bMobile)) ? + $sTheme : $this->Config()->Get('themes', 'default', $bMobile ? 'Mobile' : 'Default'); + } + + /** + * @param string $sLanguage + * @param string $sDefault = '' + * @param bool $bAdmin = false + * @param bool $bAllowEmptyResult = false + * + * @return string + */ + public function ValidateLanguage($sLanguage, $sDefault = '', $bAdmin = false, $bAllowEmptyResult = false) + { + $sResult = ''; + $aLang = $this->GetLanguages($bAdmin); + + if (\is_array($aLang)) + { + $aHelper = array('en' => 'en_us', 'ar' => 'ar_sa', 'cs' => 'cs_cz', 'no' => 'nb_no', 'ua' => 'uk_ua', + 'cn' => 'zh_cn', 'zh' => 'zh_cn', 'tw' => 'zh_tw', 'fa' => 'fa_ir'); + + $sLanguage = isset($aHelper[$sLanguage]) ? $aHelper[$sLanguage] : $sLanguage; + $sDefault = isset($aHelper[$sDefault]) ? $aHelper[$sDefault] : $sDefault; + + $sLanguage = \strtolower(\str_replace('-', '_', $sLanguage)); + if (2 === strlen($sLanguage)) + { + $sLanguage = $sLanguage.'_'.$sLanguage; + } + + $sDefault = \strtolower(\str_replace('-', '_', $sDefault)); + if (2 === strlen($sDefault)) + { + $sDefault = $sDefault.'_'.$sDefault; + } + + $sLanguage = \preg_replace_callback('/_([a-zA-Z0-9]{2})$/', function ($aData) { + return \strtoupper($aData[0]); + }, $sLanguage); + + $sDefault = \preg_replace_callback('/_([a-zA-Z0-9]{2})$/', function ($aData) { + return \strtoupper($aData[0]); + }, $sDefault); + + if (\in_array($sLanguage, $aLang)) + { + $sResult = $sLanguage; + } + + if (empty($sResult) && !empty($sDefault) && \in_array($sDefault, $aLang)) + { + $sResult = $sDefault; + } + + if (empty($sResult) && !$bAllowEmptyResult) + { + $sResult = $this->Config()->Get('webmail', $bAdmin ? 'language_admin' : 'language', 'en_US'); + $sResult = \in_array($sResult, $aLang) ? $sResult : 'en_US'; + } + } + + return $sResult; + } + + /** + * @param string $sType + * + * @return string + */ + public function ValidateContactPdoType($sType) + { + return \in_array($sType, array('mysql', 'pgsql', 'sqlite')) ? $sType : 'sqlite'; + } + + /** + * @staticvar array $aCache + * + * @return array + */ + public function GetThemes($bMobile = false, $bIncludeMobile = true) + { + if ($bMobile) + { + return array('Mobile'); + } + + static $aCache = array('full' => null, 'mobile' => null); + if ($bIncludeMobile && \is_array($aCache['full'])) + { + return $aCache['full']; + } + else if ($bIncludeMobile && \is_array($aCache['mobile'])) + { + return $aCache['mobile']; + } + + $bClear = false; + $bDefault = false; + $sList = array(); + $sDir = APP_VERSION_ROOT_PATH.'themes'; + if (@\is_dir($sDir)) + { + $rDirH = \opendir($sDir); + if ($rDirH) + { + while (($sFile = \readdir($rDirH)) !== false) + { + if ('.' !== $sFile{0} && \is_dir($sDir.'/'.$sFile) && \file_exists($sDir.'/'.$sFile.'/styles.less')) + { + if ('Default' === $sFile) + { + $bDefault = true; + } + else if ('Clear' === $sFile) + { + $bClear = true; + } + else if ($bIncludeMobile || 'Mobile' !== $sFile) + { + $sList[] = $sFile; + } + } + } + @closedir($rDirH); + } + } + + $sDir = APP_INDEX_ROOT_PATH.'themes'; // custom user themes + if (@\is_dir($sDir)) + { + $rDirH = \opendir($sDir); + if ($rDirH) + { + while (($sFile = \readdir($rDirH)) !== false) + { + if ('.' !== $sFile{0} && \is_dir($sDir.'/'.$sFile) && \file_exists($sDir.'/'.$sFile.'/styles.less')) + { + $sList[] = $sFile.'@custom'; + } + } + + @\closedir($rDirH); + } + } + + $sList = \array_unique($sList); + \sort($sList); + + if ($bDefault) + { + \array_unshift($sList, 'Default'); + } + + if ($bClear) + { + \array_push($sList, 'Clear'); + } + + $aCache[$bIncludeMobile ? 'full' : 'mobile'] = $sList; + return $sList; + } + + /** + * @staticvar array $aCache + * @param bool $bAdmin = false + * + * @return array + */ + public function GetLanguages($bAdmin = false) + { + static $aCache = array(); + $sDir = APP_VERSION_ROOT_PATH.'app/localization/'.($bAdmin ? 'admin' : 'webmail').'/'; + + if (isset($aCache[$sDir])) + { + return $aCache[$sDir]; + } + + $aTop = array(); + $aList = array(); + + if (@\is_dir($sDir)) + { + $rDirH = \opendir($sDir); + if ($rDirH) + { + while (($sFile = \readdir($rDirH)) !== false) + { + if ('.' !== $sFile{0} && \is_file($sDir.'/'.$sFile) && '.yml' === \substr($sFile, -4)) + { + $sLang = \substr($sFile, 0, -4); + if (0 < \strlen($sLang) && 'always' !== $sLang && '_source.en' !== $sLang) + { + \array_push($aList, $sLang); + } + } + } + + @\closedir($rDirH); + } + } + + \sort($aTop); + \sort($aList); + + $aCache[$sDir] = \array_merge($aTop, $aList); + return $aCache[$sDir]; + } + + /** + * @param string $sName + * @param string $sHtml + * + * @return string + */ + public function ProcessTemplate($sName, $sHtml) + { + $sHtml = $this->Plugins()->ProcessTemplate($sName, $sHtml); + $sHtml = \preg_replace('/\{\{INCLUDE\/([a-zA-Z]+)\/PLACE\}\}/', '', $sHtml); + + $sHtml = \preg_replace('/'; + } + + unset($aTemplates); + + return $bJsOutput ? 'window.rainloopTEMPLATES='.\MailSo\Base\Utils::Php2js(array($sHtml), $this->Logger()).';' : $sHtml; + } + + /** + * @param string $sLanguage + * + * @return string + */ + private function convertLanguageNameToMomentLanguageName($sLanguage) + { + $aHelper = array('en_gb' => 'en-gb', 'fr_ca' => 'fr-ca', 'pt_br' => 'pt-br', + 'uk_ua' => 'ua', 'zh_cn' => 'zh-cn', 'zh_tw' => 'zh-tw', 'fa_ir' => 'fa'); + + return isset($aHelper[$sLanguage]) ? $aHelper[$sLanguage] : \substr($sLanguage, 0, 2); + } + + /** + * @param string $sLanguage + * @param bool $bAdmin = false + * @param bool $bWrapByScriptTag = true + * + * @return string + */ + private function compileLanguage($sLanguage, $bAdmin = false, $bWrapByScriptTag = true) + { + $aResultLang = array(); + + $sMoment = 'window.moment && window.moment.locale && window.moment.locale(\'en\');'; + $sMomentFileName = APP_VERSION_ROOT_PATH.'app/localization/moment/'. + $this->convertLanguageNameToMomentLanguageName($sLanguage).'.js'; + + if (\file_exists($sMomentFileName)) + { + $sMoment = \file_get_contents($sMomentFileName); + $sMoment = \preg_replace('/\/\/[^\n]+\n/', '', $sMoment); + } + + \RainLoop\Utils::ReadAndAddLang(APP_VERSION_ROOT_PATH.'app/localization/langs.yml', $aResultLang); + \RainLoop\Utils::ReadAndAddLang(APP_VERSION_ROOT_PATH.'app/localization/'. + ($bAdmin ? 'admin' : 'webmail').'/_source.en.yml', $aResultLang); + \RainLoop\Utils::ReadAndAddLang(APP_VERSION_ROOT_PATH.'app/localization/'. + ($bAdmin ? 'admin' : 'webmail').'/'.$sLanguage.'.yml', $aResultLang); + + $this->Plugins()->ReadLang($sLanguage, $aResultLang); + + $sLangJs = ''; + $aLangKeys = \array_keys($aResultLang); + foreach ($aLangKeys as $sKey) + { + $sString = isset($aResultLang[$sKey]) ? $aResultLang[$sKey] : $sKey; + if (\is_array($sString)) + { + $sString = \implode("\n", $sString); + } + + $sLangJs .= '"'.\str_replace('"', '\\"', \str_replace('\\', '\\\\', $sKey)).'":' + .'"'.\str_replace(array("\r", "\n", "\t"), array('\r', '\n', '\t'), + \str_replace('"', '\\"', \str_replace('\\', '\\\\', $sString))).'",'; + } + + $sResult = empty($sLangJs) ? 'null' : '{'.\substr($sLangJs, 0, -1).'}'; + + return + ($bWrapByScriptTag ? '' : '') + ; + } + + /** + * @param array $aAppData + * @param bool $bWrapByScriptTag = true + * + * @return string + */ + private function compileAppData($aAppData, $bWrapByScriptTag = true) + { + return + ($bWrapByScriptTag ? '' : '') + ; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Settings.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Settings.php new file mode 100755 index 00000000..d234f083 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Settings.php @@ -0,0 +1,78 @@ +aData = array(); + $this->bLocal = !!$bLocal; + } + + /** + * @param array $aData + * + * @return \RainLoop\Settings + */ + public function InitData($aData) + { + if (\is_array($aData)) + { + $this->aData = $aData; + } + + return $this; + } + + /** + * @return array + */ + public function DataAsArray() + { + return $this->aData; + } + + /** + * @return bool + */ + public function IsLocal() + { + return $this->bLocal; + } + + /** + * @param string $sName + * @param mixed $mDefValue = null + * + * @return mixed + */ + public function GetConf($sName, $mDefValue = null) + { + return isset($this->aData[$sName]) ? $this->aData[$sName] : $mDefValue; + } + + /** + * @param string $sName + * @param mixed $mValue + * + * @return void + */ + public function SetConf($sName, $mValue) + { + $this->aData[$sName] = $mValue; + } +} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Social.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Social.php new file mode 100755 index 00000000..a1363756 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Social.php @@ -0,0 +1,792 @@ +oHttp = $oHttp; + $this->oActions = $oActions; + } + + /** + * @return bool + */ + public function GoogleDisconnect($oAccount) + { + $oGoogle = $this->GoogleConnector(); + if ($oAccount && $oGoogle) + { + $oSettings = $this->oActions->SettingsProvider()->Load($oAccount); + $sEncodedeData = $oSettings->GetConf('GoogleAccessToken', ''); + + if (!empty($sEncodedeData)) + { + $aData = \RainLoop\Utils::DecodeKeyValues($sEncodedeData); + if (\is_array($aData) && !empty($aData['id'])) + { + $this->oActions->StorageProvider()->Clear(null, + \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, + $this->GoogleUserLoginStorageKey($oGoogle, $aData['id']) + ); + } + } + + $oSettings->SetConf('GoogleAccessToken', ''); + $oSettings->SetConf('GoogleSocialName', ''); + + return $this->oActions->SettingsProvider()->Save($oAccount, $oSettings); + } + + return false; + } + + /** + * @return bool + */ + public function FacebookDisconnect($oAccount) + { + $oFacebook = $this->FacebookConnector($oAccount ? $oAccount : null); + if ($oAccount && $oFacebook) + { + $oSettings = $this->oActions->SettingsProvider()->Load($oAccount); + + $sEncodedeData = $oSettings->GetConf('FacebookAccessToken', ''); + + if (!empty($sEncodedeData)) + { + $aData = \RainLoop\Utils::DecodeKeyValues($sEncodedeData); + if (is_array($aData) && isset($aData['id'])) + { + $this->oActions->StorageProvider()->Clear(null, + \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, + $this->FacebookUserLoginStorageKey($oFacebook, $aData['id']) + ); + } + } + + $oSettings->SetConf('FacebookAccessToken', ''); + $oSettings->SetConf('FacebookSocialName', ''); + + return $this->oActions->SettingsProvider()->Save($oAccount, $oSettings); + } + + return false; + } + + /** + * @return bool + */ + public function TwitterDisconnect($oAccount) + { + $oTwitter = $this->TwitterConnector(); + if ($oAccount && $oTwitter) + { + $oSettings = $this->oActions->SettingsProvider()->Load($oAccount); + $sEncodedData = $oSettings->GetConf('TwitterAccessToken', ''); + + if (!empty($sEncodedData)) + { + $aData = \RainLoop\Utils::DecodeKeyValues($sEncodedData); + if (is_array($aData) && isset($aData['id'])) + { + $this->oActions->StorageProvider()->Clear(null, + \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, + $this->TwitterUserLoginStorageKey($oTwitter, $aData['id']) + ); + } + } + + $oSettings->SetConf('TwitterAccessToken', ''); + $oSettings->SetConf('TwitterSocialName', ''); + + return $this->oActions->SettingsProvider()->Save($oAccount, $oSettings); + } + + return false; + } + + /** + * @return string + */ + public function popupServiceResult($sTypeStr, $sLoginUrl, $bLogin, $iErrorCode) + { + $sResult = ''; + $bAppCssDebug = !!$this->oActions->Config()->Get('labs', 'use_app_debug_css', false); + + $sIcon = $sTypeStr; + if ('facebook' === $sIcon) + { + $sIcon = $sIcon.'-alt'; + } + + if ($sLoginUrl) + { + $this->oHttp->ServerNoCache(); + @\header('Content-Type: text/html; charset=utf-8'); + + $sResult = \strtr(\file_get_contents(APP_VERSION_ROOT_PATH.'app/templates/Social.html'), array( + '{{RefreshMeta}}' => '', + '{{Stylesheet}}' => $this->oActions->StaticPath('css/social'.($bAppCssDebug ? '' : '.min').'.css'), + '{{Icon}}' => $sIcon, + '{{Script}}' => '' + )); + } + else + { + $this->oHttp->ServerNoCache(); + @\header('Content-Type: text/html; charset=utf-8'); + + $sCallBackType = $bLogin ? '_login' : ''; + $sConnectionFunc = 'rl_'.\md5(\RainLoop\Utils::GetConnectionToken()).'_'.$sTypeStr.$sCallBackType.'_service'; + + $sResult = \strtr(\file_get_contents(APP_VERSION_ROOT_PATH.'app/templates/Social.html'), array( + '{{RefreshMeta}}' => '', + '{{Stylesheet}}' => $this->oActions->StaticPath('css/social'.($bAppCssDebug ? '' : '.min').'.css'), + '{{Icon}}' => $sIcon, + '{{Script}}' => '' + )); + } + + return $sResult; + } + + /** + * @return string + */ + public function GooglePopupService($bGmail = false) + { + $sLoginUrl = ''; + $oAccount = null; + + $bLogin = false; + $iErrorCode = \RainLoop\Notifications::UnknownError; + + try + { + $oGoogle = $this->GoogleConnector(); + if ($this->oHttp->HasQuery('error')) + { + $iErrorCode = ('access_denied' === $this->oHttp->GetQuery('error')) ? + \RainLoop\Notifications::SocialGoogleLoginAccessDisable : \RainLoop\Notifications::UnknownError; + } + else if ($oGoogle) + { + $oAccount = $this->oActions->GetAccount(); + $bLogin = !$oAccount; + + $sCheckToken = ''; + $sCheckAuth = ''; + $sState = $this->oHttp->GetQuery('state'); + if (!empty($sState)) + { + $aParts = explode('|', $sState, 3); + + if (!$bGmail) + { + $bGmail = !empty($aParts[0]) ? '1' === (string) $aParts[0] : false; + } + + $sCheckToken = !empty($aParts[1]) ? $aParts[1] : ''; + $sCheckAuth = !empty($aParts[2]) ? $aParts[2] : ''; + } + + $sRedirectUrl = $this->oHttp->GetFullUrl().'?SocialGoogle'; + if (!$this->oHttp->HasQuery('code')) + { + $aParams = array( + 'scope' => \trim(\implode(' ', array( + 'https://www.googleapis.com/auth/userinfo.email', + 'https://www.googleapis.com/auth/userinfo.profile', + $bGmail ? 'https://mail.google.com/' : '' + ))), + 'state' => ($bGmail ? '1' : '0').'|'.\RainLoop\Utils::GetConnectionToken().'|'.$this->oActions->GetSpecAuthToken(), + 'response_type' => 'code' + ); + +// if ($bGmail) +// { +// $aParams['access_type'] = 'offline'; +// $aParams['approval_prompt'] = 'force'; +// } + + $sLoginUrl = $oGoogle->getAuthenticationUrl('https://accounts.google.com/o/oauth2/auth', $sRedirectUrl, $aParams); + } + else if (!empty($sState) && $sCheckToken === \RainLoop\Utils::GetConnectionToken()) + { + if (!empty($sCheckAuth)) + { + $this->oActions->SetSpecAuthToken($sCheckAuth); + $oAccount = $this->oActions->GetAccount(); + $bLogin = !$oAccount; + } + + $aParams = array('code' => $this->oHttp->GetQuery('code'), 'redirect_uri' => $sRedirectUrl); + $aAuthorizationResponse = $oGoogle->getAccessToken('https://accounts.google.com/o/oauth2/token', 'authorization_code', $aParams); + + if (!empty($aAuthorizationResponse['result']['access_token'])) + { + $oGoogle->setAccessToken($aAuthorizationResponse['result']['access_token']); + $aUserInfoResponse = $oGoogle->fetch('https://www.googleapis.com/oauth2/v2/userinfo'); + + if (!empty($aUserInfoResponse['result']['id'])) + { + if ($bLogin) + { + $aUserData = null; + if ($bGmail) + { + if (!empty($aUserInfoResponse['result']['email'])) + { + $aUserData = array( + 'Email' => $aUserInfoResponse['result']['email'], + 'Password' => APP_GOOGLE_ACCESS_TOKEN_PREFIX.$aAuthorizationResponse['result']['access_token'] + ); + } + } + else + { + $sUserData = $this->oActions->StorageProvider()->Get(null, + \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, + $this->GoogleUserLoginStorageKey($oGoogle, $aUserInfoResponse['result']['id']) + ); + + $aUserData = \RainLoop\Utils::DecodeKeyValues($sUserData); + } + + if ($aUserData && \is_array($aUserData) && + !empty($aUserData['Email']) && isset($aUserData['Password'])) + { + $iErrorCode = $this->loginProcess($oAccount, $aUserData['Email'], $aUserData['Password']); + } + else + { + $iErrorCode = \RainLoop\Notifications::SocialGoogleLoginAccessDisable; + } + } + + if ($oAccount && !$bGmail) + { + $aUserData = array( + 'ID' => $aUserInfoResponse['result']['id'], + 'Email' => $oAccount->Email(), + 'Password' => $oAccount->Password() + ); + + $sSocialName = !empty($aUserInfoResponse['result']['name']) ? $aUserInfoResponse['result']['name'] : ''; + $sSocialName .= !empty($aUserInfoResponse['result']['email']) ? ' ('.$aUserInfoResponse['result']['email'].')' : ''; + $sSocialName = \trim($sSocialName); + + $oSettings = $this->oActions->SettingsProvider()->Load($oAccount); + + $oSettings->SetConf('GoogleAccessToken', \RainLoop\Utils::EncodeKeyValues(array( + 'id' => $aUserInfoResponse['result']['id'] + ))); + + $oSettings->SetConf('GoogleSocialName', $sSocialName); + + $this->oActions->SettingsProvider()->Save($oAccount, $oSettings); + + $this->oActions->StorageProvider()->Put(null, + \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, + $this->GoogleUserLoginStorageKey($oGoogle, $aUserInfoResponse['result']['id']), + \RainLoop\Utils::EncodeKeyValues($aUserData)); + + $iErrorCode = 0; + } + } + } + } + } + } + catch (\Exception $oException) + { + $this->oActions->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); + } + + return $this->popupServiceResult('google', $sLoginUrl, $bLogin, $iErrorCode); + } + + /** + * @return string + */ + public function FacebookPopupService() + { + $sLoginUrl = ''; + $sSocialName = ''; + + $mData = false; + $sUserData = ''; + $aUserData = false; + $oAccount = null; + + $bLogin = false; + $iErrorCode = \RainLoop\Notifications::UnknownError; + + if (0 === \strlen($this->oActions->GetSpecAuthToken()) && $this->oHttp->HasQuery('rlah')) + { + $this->oActions->SetSpecAuthToken($this->oHttp->GetQuery('rlah', '')); + } + + $oAccount = $this->oActions->GetAccount(); + + $sRedirectUrl = ''; + $oFacebook = $this->FacebookConnector($oAccount, $sRedirectUrl); + if ($oFacebook) + { + try + { + $oRedirectLoginHelper = $oFacebook->getRedirectLoginHelper(); + $oAccessToken = $oRedirectLoginHelper->getAccessToken(); + + if (!$oAccessToken && !$this->oHttp->HasQuery('state')) + { + $sLoginUrl = $oFacebook->getRedirectLoginHelper()->getLoginUrl($sRedirectUrl.'&display=popup'); + } + else if ($oAccessToken) + { + $oResponse = $oFacebook->get('/me?fields=id,name', (string) $oAccessToken); + $oGraphUser = $oResponse->getGraphUser(); + + $mData = $oGraphUser->getId(); + $sSocialName = $oGraphUser->getName(); + + if ($oAccount) + { + if ($mData && 0 < \strlen($mData)) + { + $aUserData = array( + 'id' => $mData, + 'Email' => $oAccount->Email(), + 'Password' => $oAccount->Password() + ); + + $oSettings = $this->oActions->SettingsProvider()->Load($oAccount); + $oSettings->SetConf('FacebookSocialName', $sSocialName); + $oSettings->SetConf('FacebookAccessToken', \RainLoop\Utils::EncodeKeyValues(array('id' => $mData))); + + $this->oActions->SettingsProvider()->Save($oAccount, $oSettings); + + $this->oActions->StorageProvider()->Put(null, + \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, + $this->FacebookUserLoginStorageKey($oFacebook, $mData), + \RainLoop\Utils::EncodeKeyValues($aUserData)); + + $iErrorCode = 0; + } + } + else + { + $bLogin = true; + + if ($mData && 0 < \strlen($mData)) + { + $sUserData = $this->oActions->StorageProvider()->Get(null, + \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, + $this->FacebookUserLoginStorageKey($oFacebook, $mData)); + + if ($sUserData) + { + $aUserData = \RainLoop\Utils::DecodeKeyValues($sUserData); + } + } + + if ($aUserData && \is_array($aUserData) && + !empty($aUserData['Email']) && isset($aUserData['Password'])) + { + $iErrorCode = $this->loginProcess($oAccount, $aUserData['Email'], $aUserData['Password']); + } + else + { + $iErrorCode = \RainLoop\Notifications::SocialFacebookLoginAccessDisable; + } + } + } + } + catch (\Exception $oException) + { + $this->oActions->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); + } + } + + return $this->popupServiceResult('facebook', $sLoginUrl, $bLogin, $iErrorCode); + } + + /** + * @return string + */ + public function TwitterPopupService() + { + $sLoginUrl = ''; + + $sSocialName = ''; + $oAccount = null; + + $bLogin = false; + $iErrorCode = \RainLoop\Notifications::UnknownError; + + $sRedirectUrl = $this->oHttp->GetFullUrl().'?SocialTwitter'; + if (0 < strlen($this->oActions->GetSpecAuthToken())) + { + $sRedirectUrl .= '&rlah='.$this->oActions->GetSpecAuthToken(); + } + else if ($this->oHttp->HasQuery('rlah')) + { + $this->oActions->SetSpecAuthToken($this->oHttp->GetQuery('rlah', '')); + $sRedirectUrl .= '&rlah='.$this->oActions->GetSpecAuthToken(); + } + + try + { + $oTwitter = $this->TwitterConnector(); + if ($oTwitter) + { + $sSessionKey = \implode('_', array('twitter', + \md5($oTwitter->config['consumer_secret']), \md5(\RainLoop\Utils::GetConnectionToken()), 'AuthSessionData')); + + $oAccount = $this->oActions->GetAccount(); + if ($oAccount) + { + if (isset($_REQUEST['oauth_verifier'])) + { + $sAuth = $this->oActions->Cacher()->Get($sSessionKey); + $oAuth = $sAuth ? \json_decode($sAuth, true) : null; + + if ($oAuth && !empty($oAuth['oauth_token']) && !empty($oAuth['oauth_token_secret'])) + { + $oTwitter->config['user_token'] = $oAuth['oauth_token']; + $oTwitter->config['user_secret'] = $oAuth['oauth_token_secret']; + + $iCode = $oTwitter->request('POST', $oTwitter->url('oauth/access_token', ''), array( + 'oauth_callback' => $sRedirectUrl, + 'oauth_verifier' => $_REQUEST['oauth_verifier'] + )); + + if (200 === $iCode && isset($oTwitter->response['response'])) + { + $aAccessToken = $oTwitter->extract_params($oTwitter->response['response']); + if ($aAccessToken && isset($aAccessToken['oauth_token']) && !empty($aAccessToken['user_id'])) + { + $aAccessToken['id'] = $aAccessToken['user_id']; + + $oTwitter->config['user_token'] = $aAccessToken['oauth_token']; + $oTwitter->config['user_secret'] = $aAccessToken['oauth_token_secret']; + + $sSocialName = !empty($aAccessToken['screen_name']) ? '@'.$aAccessToken['screen_name'] : $aAccessToken['user_id']; + $sSocialName = \trim($sSocialName); + + $aUserData = array( + 'id' => $aAccessToken['id'], + 'Email' => $oAccount->Email(), + 'Password' => $oAccount->Password() + ); + + $oSettings = $this->oActions->SettingsProvider()->Load($oAccount); + $oSettings->SetConf('TwitterAccessToken', \RainLoop\Utils::EncodeKeyValues($aAccessToken)); + $oSettings->SetConf('TwitterSocialName', $sSocialName); + $this->oActions->SettingsProvider()->Save($oAccount, $oSettings); + + $this->oActions->StorageProvider()->Put(null, + \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, + $this->TwitterUserLoginStorageKey($oTwitter, $aAccessToken['id']), + \RainLoop\Utils::EncodeKeyValues($aUserData)); + + $iErrorCode = 0; + } + } + } + } + else + { + $aParams = array( + 'oauth_callback' => $sRedirectUrl, + 'x_auth_access_type' => 'read' + ); + + $iCode = $oTwitter->request('POST', $oTwitter->url('oauth/request_token', ''), $aParams); + if (200 === $iCode && isset($oTwitter->response['response'])) + { + $oAuth = $oTwitter->extract_params($oTwitter->response['response']); + if (!empty($oAuth['oauth_token'])) + { + $this->oActions->Cacher()->Set($sSessionKey, \json_encode($oAuth)); + $sLoginUrl = $oTwitter->url('oauth/authenticate', '').'?oauth_token='.$oAuth['oauth_token']; + } + } + } + } + else + { + $bLogin = true; + + if (isset($_REQUEST['oauth_verifier'])) + { + $sAuth = $this->oActions->Cacher()->Get($sSessionKey); + $oAuth = $sAuth ? \json_decode($sAuth, true) : null; + if ($oAuth && !empty($oAuth['oauth_token']) && !empty($oAuth['oauth_token_secret'])) + { + $oTwitter->config['user_token'] = $oAuth['oauth_token']; + $oTwitter->config['user_secret'] = $oAuth['oauth_token_secret']; + + $iCode = $oTwitter->request('POST', $oTwitter->url('oauth/access_token', ''), array( + 'oauth_callback' => $sRedirectUrl, + 'oauth_verifier' => $_REQUEST['oauth_verifier'] + )); + + if (200 === $iCode && isset($oTwitter->response['response'])) + { + $aAccessToken = $oTwitter->extract_params($oTwitter->response['response']); + if ($aAccessToken && isset($aAccessToken['oauth_token']) && !empty($aAccessToken['user_id'])) + { + $sUserData = $this->oActions->StorageProvider()->Get(null, + \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, + $this->TwitterUserLoginStorageKey($oTwitter, $aAccessToken['user_id']) + ); + + $aUserData = \RainLoop\Utils::DecodeKeyValues($sUserData); + + if ($aUserData && \is_array($aUserData) && + !empty($aUserData['Email']) && isset($aUserData['Password'])) + { + $iErrorCode = $this->loginProcess($oAccount, $aUserData['Email'], $aUserData['Password']); + } + else + { + $iErrorCode = \RainLoop\Notifications::SocialTwitterLoginAccessDisable; + } + + $this->oActions->Cacher()->Delete($sSessionKey); + } + } + } + } + else + { + $aParams = array( + 'oauth_callback' => $sRedirectUrl, + 'x_auth_access_type' => 'read' + ); + + $iCode = $oTwitter->request('POST', $oTwitter->url('oauth/request_token', ''), $aParams); + if (200 === $iCode && isset($oTwitter->response['response'])) + { + $oAuth = $oTwitter->extract_params($oTwitter->response['response']); + if (!empty($oAuth['oauth_token'])) + { + $this->oActions->Cacher()->Set($sSessionKey, \json_encode($oAuth)); + $sLoginUrl = $oTwitter->url('oauth/authenticate', '').'?oauth_token='.$oAuth['oauth_token']; + } + } + } + } + } + } + catch (\Exception $oException) + { + $this->oActions->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); + } + + return $this->popupServiceResult('twitter', $sLoginUrl, $bLogin, $iErrorCode); + } + + /** + * @return \OAuth2\Client|null + */ + public function GoogleConnector() + { + $oGoogle = false; + $oConfig = $this->oActions->Config(); + if ($oConfig->Get('social', 'google_enable', false) && + '' !== \trim($oConfig->Get('social', 'google_client_id', '')) && + '' !== \trim($oConfig->Get('social', 'google_client_secret', ''))) + { + include_once APP_VERSION_ROOT_PATH.'app/libraries/PHP-OAuth2/Client.php'; + include_once APP_VERSION_ROOT_PATH.'app/libraries/PHP-OAuth2/GrantType/IGrantType.php'; + include_once APP_VERSION_ROOT_PATH.'app/libraries/PHP-OAuth2/GrantType/AuthorizationCode.php'; + include_once APP_VERSION_ROOT_PATH.'app/libraries/PHP-OAuth2/GrantType/RefreshToken.php'; + + try + { + $oGoogle = new \OAuth2\Client( + \trim($oConfig->Get('social', 'google_client_id', '')), + \trim($oConfig->Get('social', 'google_client_secret', ''))); + + $sProxy = $this->oActions->Config()->Get('labs', 'curl_proxy', ''); + if (0 < \strlen($sProxy)) + { + $oGoogle->setCurlOption(CURLOPT_PROXY, $sProxy); + + $sProxyAuth = $this->oActions->Config()->Get('labs', 'curl_proxy_auth', ''); + if (0 < \strlen($sProxyAuth)) + { + $oGoogle->setCurlOption(CURLOPT_PROXYUSERPWD, $sProxyAuth); + } + } + } + catch (\Exception $oException) + { + $this->oActions->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); + } + } + + return false === $oGoogle ? null : $oGoogle; + } + + /** + * @return \tmhOAuth|null + */ + public function TwitterConnector() + { + $oTwitter = false; + $oConfig = $this->oActions->Config(); + if ($oConfig->Get('social', 'twitter_enable', false) && + '' !== \trim($oConfig->Get('social', 'twitter_consumer_key', '')) && + '' !== \trim($oConfig->Get('social', 'twitter_consumer_secret', ''))) + { + include_once APP_VERSION_ROOT_PATH.'app/libraries/tmhOAuth/tmhOAuth.php'; + include_once APP_VERSION_ROOT_PATH.'app/libraries/tmhOAuth/tmhUtilities.php'; + + $sProxy = $this->oActions->Config()->Get('labs', 'curl_proxy', ''); + $sProxyAuth = $this->oActions->Config()->Get('labs', 'curl_proxy_auth', ''); + + $oTwitter = new \tmhOAuth(array( + 'consumer_key' => \trim($oConfig->Get('social', 'twitter_consumer_key', '')), + 'consumer_secret' => \trim($oConfig->Get('social', 'twitter_consumer_secret', '')), + 'curl_proxy' => 0 < \strlen($sProxy) ? $sProxy : false, + 'curl_proxyuserpwd' => 0 < \strlen($sProxyAuth) ? $sProxyAuth : false + )); + } + + return false === $oTwitter ? null : $oTwitter; + } + + /** + * @param \RainLoop\Model\Account|null $oAccount = null + * @param string $sRedirectUrl = '' + * + * @return \RainLoop\Common\RainLoopFacebookRedirectLoginHelper|null + */ + public function FacebookConnector($oAccount = null, &$sRedirectUrl = '') + { + $oFacebook = false; + $oConfig = $this->oActions->Config(); + $sAppID = \trim($oConfig->Get('social', 'fb_app_id', '')); + $sAppSecret = \trim($oConfig->Get('social', 'fb_app_secret', '')); + + if (\version_compare(PHP_VERSION, '5.4.0', '>=') && + $oConfig->Get('social', 'fb_enable', false) && '' !== $sAppID && + '' !== \trim($oConfig->Get('social', 'fb_app_secret', '')) && + \class_exists('Facebook\Facebook') + ) + { + $sRedirectUrl = $this->oHttp->GetFullUrl().'?SocialFacebook'; + if (0 < \strlen($this->oActions->GetSpecAuthToken())) + { + $sRedirectUrl .= '&rlah='.$this->oActions->GetSpecAuthToken(); + } + else if ($this->oHttp->HasQuery('rlah')) + { + $this->oActions->SetSpecAuthToken($this->oHttp->GetQuery('rlah', '')); + $sRedirectUrl .= '&rlah='.$this->oActions->GetSpecAuthToken(); + } + + try + { + $oAccount = $this->oActions->GetAccount(); + + $oFacebook = new \Facebook\Facebook(array( + 'app_id' => $sAppID, // Replace {app-id} with your app id + 'app_secret' => $sAppSecret, + 'persistent_data_handler' => new \RainLoop\Common\FacebookRainLoopPersistentDataHandler( + $oAccount, \RainLoop\Utils::GetConnectionToken(), $this->oActions->StorageProvider() + ) + )); + } + catch (\Exception $oException) + { + $this->oActions->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); + } + } + + return false === $oFacebook ? null : $oFacebook; + } + + /** + * @return string + */ + public function GoogleUserLoginStorageKey($oGoogle, $sGoogleUserId) + { + return \implode('_', array('google', \md5($oGoogle->getClientId()), $sGoogleUserId, APP_SALT)); + } + + /** + * @return string + */ + public function FacebookUserLoginStorageKey($oFacebook, $sFacebookUserId) + { + return \implode('_', array('facebookNew', \md5($oFacebook->getApp()->getId()), $sFacebookUserId, APP_SALT)); + } + + /** + * @return string + */ + public function TwitterUserLoginStorageKey($oTwitter, $sTwitterUserId) + { + return \implode('_', array('twitter_2', \md5($oTwitter->config['consumer_secret']), $sTwitterUserId, APP_SALT)); + } + + /** + * @param \RainLoop\Model\Account|null $oAccount + * @param string $sEmail + * @param string $sPassword + * + * @return int + */ + private function loginProcess(&$oAccount, $sEmail, $sPassword) + { + $iErrorCode = \RainLoop\Notifications::UnknownError; + + try + { + $oAccount = $this->oActions->LoginProcess($sEmail, $sPassword, '', '', false, true); + if ($oAccount instanceof \RainLoop\Model\Account) + { + $this->oActions->AuthToken($oAccount); + $iErrorCode = 0; + } + else + { + $oAccount = null; + $iErrorCode = \RainLoop\Notifications::AuthError; + } + } + catch (\RainLoop\Exceptions\ClientException $oException) + { + $iErrorCode = $oException->getCode(); + } + catch (\Exception $oException) + { + unset($oException); + $iErrorCode = \RainLoop\Notifications::UnknownError; + } + + return $iErrorCode; + } +} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Utils.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Utils.php new file mode 100755 index 00000000..83b20418 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Utils.php @@ -0,0 +1,735 @@ +setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); + $oRsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1); + $oRsa->setPrivateKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1); + + $sPrivateKey = \file_exists(APP_PRIVATE_DATA.'rsa/private') ? + \file_get_contents(APP_PRIVATE_DATA.'rsa/private') : ''; + + if (!empty($sPrivateKey)) + { + $oRsa->loadKey($sPrivateKey, CRYPT_RSA_PRIVATE_FORMAT_PKCS1); + $oRsa->loadKey($oRsa->getPublicKey(), CRYPT_RSA_PUBLIC_FORMAT_PKCS1); + + \RainLoop\Utils::$RSA = $oRsa; + } + } + } + + return \RainLoop\Utils::$RSA; + } + + /** + * @return string + */ + static public function RsaPrivateKey() + { + if (!empty(\RainLoop\Utils::$RsaKey)) + { + return \RainLoop\Utils::$RsaKey; + } + + \RainLoop\Utils::$RsaKey = \file_exists(APP_PRIVATE_DATA.'rsa/private') ? + \file_get_contents(APP_PRIVATE_DATA.'rsa/private') : ''; + + \RainLoop\Utils::$RsaKey = \is_string(\RainLoop\Utils::$RsaKey) ? \RainLoop\Utils::$RsaKey : ''; + } + + /** + * @param string $sString + * @param string $sKey = '' + * + * @return string|false + */ + static public function EncryptStringRSA($sString, $sKey = '') + { + $sResult = ''; + $sKey = \md5($sKey); + + $sPrivateKey = \RainLoop\Utils::RsaPrivateKey(); + if (!empty($sPrivateKey)) + { + $oPrivKey = \openssl_pkey_get_private($sPrivateKey); + $oKeyDetails = \openssl_pkey_get_details($oPrivKey); + + if (!empty($oKeyDetails['key']) && !empty($oKeyDetails['bits'])) + { + $oPubKey = \openssl_pkey_get_public($oKeyDetails['key']); + + $iC = (($oKeyDetails['bits'] / 8) - 15); + $aString = \str_split($sString, $iC); + + foreach ($aString as $iIndex => $sLine) + { + $sEncrypted = ''; + \openssl_public_encrypt($sLine, $sEncrypted, $oPubKey); + $aString[$iIndex] = $sEncrypted; + } + + $aString[] = $sKey; + $sResult = @\serialize($aString); + + \openssl_free_key($oPubKey); + } + + \openssl_free_key($oPrivKey); + } + + return $sResult; + } + + /** + * @param string $sString + * @param string $sKey = '' + * + * @return string|false + */ + static public function DecryptStringRSA($sString, $sKey = '') + { + $sResult = ''; + $sKey = \md5($sKey); + + $sPrivateKey = \RainLoop\Utils::RsaPrivateKey(); + if (!empty($sPrivateKey) && !empty($sString)) + { + $oPrivKey = \openssl_pkey_get_private($sPrivateKey); + + $aString = @\unserialize($sString); + if (\is_array($aString)) + { + if ($sKey === \array_pop($aString)) + { + foreach ($aString as $iIndex => $sLine) + { + $sDecrypted = ''; + \openssl_private_decrypt($sLine, $sDecrypted, $oPrivKey); + $aString[$iIndex] = $sDecrypted; + } + + $sResult = \implode('', $aString); + } + } + + \openssl_free_key($oPrivKey); + } + + return $sResult; + } + + /** + * @param string $sString + * @param string $sKey + * + * @return string + */ + static public function EncryptString($sString, $sKey) + { + return \MailSo\Base\Crypt::XxteaEncrypt($sString, $sKey); + } + + /** + * @param string $sEncriptedString + * @param string $sKey + * + * @return string + */ + static public function DecryptString($sEncriptedString, $sKey) + { + return \MailSo\Base\Crypt::XxteaDecrypt($sEncriptedString, $sKey); + } + + /** + * @param string $sString + * @param string $sKey + * + * @return string + */ + static public function EncryptStringQ($sString, $sKey) + { +// if (\MailSo\Base\Utils::FunctionExistsAndEnabled('openssl_pkey_get_private')) +// { +// return \RainLoop\Utils::EncryptStringRSA($sString, +// $sKey.'Q'.\RainLoop\Utils::GetShortToken()); +// } + + return \MailSo\Base\Crypt::XxteaEncrypt($sString, + $sKey.'Q'.\RainLoop\Utils::GetShortToken()); + } + + /** + * @param string $sEncriptedString + * @param string $sKey + * + * @return string + */ + static public function DecryptStringQ($sEncriptedString, $sKey) + { +// if (\MailSo\Base\Utils::FunctionExistsAndEnabled('openssl_pkey_get_private')) +// { +// return \RainLoop\Utils::DecryptStringRSA($sEncriptedString, +// $sKey.'Q'.\RainLoop\Utils::GetShortToken()); +// } + + return \MailSo\Base\Crypt::XxteaDecrypt($sEncriptedString, + $sKey.'Q'.\RainLoop\Utils::GetShortToken()); + } + + /** + * @param array $aValues + * @param string $sCustomKey = '' + * + * @return string + */ + static public function EncodeKeyValues(array $aValues, $sCustomKey = '') + { + return \MailSo\Base\Utils::UrlSafeBase64Encode( + \RainLoop\Utils::EncryptString(@\serialize($aValues), \md5(APP_SALT.$sCustomKey))); + } + + /** + * @param string $sEncodedValues + * @param string $sCustomKey = '' + * + * @return array + */ + static public function DecodeKeyValues($sEncodedValues, $sCustomKey = '') + { + $aResult = @\unserialize( + \RainLoop\Utils::DecryptString( + \MailSo\Base\Utils::UrlSafeBase64Decode($sEncodedValues), \md5(APP_SALT.$sCustomKey))); + + return \is_array($aResult) ? $aResult : array(); + } + + /** + * @param array $aValues + * @param string $sCustomKey = '' + * + * @return string + */ + static public function EncodeKeyValuesQ(array $aValues, $sCustomKey = '') + { + return \MailSo\Base\Utils::UrlSafeBase64Encode( + \RainLoop\Utils::EncryptStringQ( + @\serialize($aValues), \md5(APP_SALT.$sCustomKey))); + } + + /** + * @param string $sEncodedValues + * @param string $sCustomKey = '' + * + * @return array + */ + static public function DecodeKeyValuesQ($sEncodedValues, $sCustomKey = '') + { + $aResult = @\unserialize( + \RainLoop\Utils::DecryptStringQ( + \MailSo\Base\Utils::UrlSafeBase64Decode($sEncodedValues), \md5(APP_SALT.$sCustomKey))); + + return \is_array($aResult) ? $aResult : array(); + } + + /** + * @return string + */ + static public function GetConnectionToken() + { + $sKey = 'rltoken'; + + $sToken = \RainLoop\Utils::GetCookie($sKey, null); + if (null === $sToken) + { + $sToken = \MailSo\Base\Utils::Md5Rand(APP_SALT); + \RainLoop\Utils::SetCookie($sKey, $sToken, \time() + 60 * 60 * 24 * 30); + } + + return \md5('Connection'.APP_SALT.$sToken.'Token'.APP_SALT); + } + + /** + * @return string + */ + static public function Fingerprint() + { + return \md5(empty($_SERVER['HTTP_USER_AGENT']) ? 'RainLoopFingerprint' : $_SERVER['HTTP_USER_AGENT']); + } + + /** + * @return string + */ + static public function GetShortToken() + { + $sKey = 'rlsession'; + + $sToken = \RainLoop\Utils::GetCookie($sKey, null); + if (null === $sToken) + { + $sToken = \MailSo\Base\Utils::Md5Rand(APP_SALT); + \RainLoop\Utils::SetCookie($sKey, $sToken, 0); + } + + return \md5('Session'.APP_SALT.$sToken.'Token'.APP_SALT); + } + + /** + * @return void + */ + static public function UpdateConnectionToken() + { + $sKey = 'rltoken'; + + $sToken = \RainLoop\Utils::GetCookie($sKey, ''); + if (!empty($sToken)) + { + \RainLoop\Utils::SetCookie($sKey, $sToken, \time() + 60 * 60 * 24 * 30); + } + } + + /** + * @return string + */ + static public function GetCsrfToken() + { + return \md5('Csrf'.APP_SALT.self::GetConnectionToken().'Token'.APP_SALT); + } + + /** + * @param string $sPath + * + * @return string + */ + public static function PathMD5($sPath) + { + $sResult = ''; + if (@\is_dir($sPath)) + { + $oDirIterator = new \RecursiveDirectoryIterator($sPath); + $oIterator = new \RecursiveIteratorIterator($oDirIterator, \RecursiveIteratorIterator::SELF_FIRST); + + foreach ($oIterator as $oFile) + { + $sResult = \md5($sResult.($oFile->isFile() ? \md5_file($oFile) : $oFile)); + } + } + + return $sResult; + } + + /** + * @param string $sFileName + * @param array $aResultLang + * + * @return void + */ + public static function ReadAndAddLang($sFileName, &$aResultLang) + { + if (\file_exists($sFileName)) + { + $isYml = '.yml' === substr($sFileName, -4); + if ($isYml) + { + $aLang = \spyc_load(\str_replace(array(': >-', ': |-', ': |+'), array(': >', ': |', ': |'), \file_get_contents($sFileName))); + if (\is_array($aLang)) + { + \reset($aLang); + $sLangKey = key($aLang); + if (isset($aLang[$sLangKey]) && is_array($aLang[$sLangKey])) + { + $aLang = $aLang[$sLangKey]; + } + else + { + $aLang = null; + } + } + } + else + { + $aLang = \RainLoop\Utils::CustomParseIniFile($sFileName, true); + } + + if (\is_array($aLang)) + { + foreach ($aLang as $sKey => $mValue) + { + if (\is_array($mValue)) + { + foreach ($mValue as $sSecKey => $mSecValue) + { + $aResultLang[$sKey.'/'.$sSecKey] = $mSecValue; + } + } + else + { + $aResultLang[$sKey] = $mValue; + } + } + } + } + } + + /** + * @param string $sDir + * @param string $sType = '' + * @return array + */ + public static function FolderFiles($sDir, $sType = '') + { + $aResult = array(); + if (@\is_dir($sDir)) + { + if (false !== ($rDirHandle = @\opendir($sDir))) + { + while (false !== ($sFile = @\readdir($rDirHandle))) + { + if (empty($sType) || $sType === \substr($sFile, -\strlen($sType))) + { + if (\is_file($sDir.'/'.$sFile)) + { + $aResult[] = $sFile; + } + } + } + + @\closedir($rDirHandle); + } + } + + return $aResult; + } + + /** + * @param string $sHtml + * + * @return string + */ + public static function ClearHtmlOutput($sHtml) + { +// return $sHtml; + return \trim(\str_replace('> <', '><', + \str_replace('" />', '"/>', + \preg_replace('/[\s]+ /i', ' ', + \preg_replace('/ [\s]+/i', ' ', + \preg_replace('/[\r\n\t]+/', ' ', + $sHtml + )))))); + } + + /** + * @param string $sKey + * @return bool + */ + public static function FastCheck($sKey) + { + $bResult = false; + + $aMatches = array(); + if (!empty($sKey) && 0 < \strlen($sKey) && \preg_match('/^(RL[\d]+)\-(.+)\-([^\-]+)$/', $sKey, $aMatches) && 3 === \count($aMatches)) + { + $bResult = $aMatches[3] === \strtoupper(\base_convert(\crc32(\md5( + $aMatches[1].'-'.$aMatches[2].'-')), 10, 32)); + } + + return $bResult; + } + + /** + * @param array $aList + * @param string $sDirName + * @param string $sNameSuffix = '' + */ + public static function CompileTemplates(&$aList, $sDirName, $sNameSuffix = '') + { + if (\file_exists($sDirName)) + { + $aFileList = \RainLoop\Utils::FolderFiles($sDirName, '.html'); + + foreach ($aFileList as $sName) + { + $sTemplateName = \substr($sName, 0, -5).$sNameSuffix; + $aList[$sTemplateName] = $sDirName.'/'.$sName; + } + } + } + + /** + * @param string $sName + * @param mixed $mDefault = null + * @return mixed + */ + public static function GetCookie($sName, $mDefault = null) + { + if (null === \RainLoop\Utils::$Cookies) + { + \RainLoop\Utils::$Cookies = is_array($_COOKIE) ? $_COOKIE : array(); + } + + return isset(\RainLoop\Utils::$Cookies[$sName]) ? \RainLoop\Utils::$Cookies[$sName] : $mDefault; + } + + public static function SetCookie($sName, $sValue = '', $iExpire = 0, $sPath = null, $sDomain = null, $bSecure = null, $bHttpOnly = true) + { + if (null === \RainLoop\Utils::$Cookies) + { + \RainLoop\Utils::$Cookies = is_array($_COOKIE) ? $_COOKIE : array(); + } + + if (null === $sPath) + { + $sPath = \RainLoop\Utils::$CookieDefaultPath; + $sPath = $sPath && 0 < \strlen($sPath) ? $sPath : null; + } + + if (null === $bSecure) + { + $bSecure = \RainLoop\Utils::$CookieDefaultSecure; + } + + \RainLoop\Utils::$Cookies[$sName] = $sValue; + @\setcookie($sName, $sValue, $iExpire, $sPath, $sDomain, $bSecure, $bHttpOnly); + } + + public static function ClearCookie($sName) + { + if (null === \RainLoop\Utils::$Cookies) + { + \RainLoop\Utils::$Cookies = is_array($_COOKIE) ? $_COOKIE : array(); + } + + $sPath = \RainLoop\Utils::$CookieDefaultPath; + $sPath = $sPath && 0 < \strlen($sPath) ? $sPath : null; + + unset(\RainLoop\Utils::$Cookies[$sName]); + @\setcookie($sName, '', \time() - 3600 * 24 * 30, $sPath); + } + + /** + * @return bool + */ + public static function IsOwnCloud() + { + return isset($_ENV['RAINLOOP_OWNCLOUD']) && $_ENV['RAINLOOP_OWNCLOUD'] && + \class_exists('OC'); + } + /** + * @return bool + */ + public static function IsOwnCloudLoggedIn() + { + return self::IsOwnCloud() && \class_exists('OCP\User') && \OCP\User::isLoggedIn(); + } + + /** + * @param string $sV + * @param bool $bEncode = false + * + * @return string + */ + public static function UrlEncode($sV, $bEncode = false) + { + return $bEncode ? \urlencode($sV) : $sV; + } + + /** + * @return string + */ + public static function WebPath() + { + $sAppPath = ''; + if (\RainLoop\Utils::IsOwnCloud()) + { + if (\class_exists('OC_App')) + { + $sAppPath = \rtrim(\trim(\OC_App::getAppWebPath('rainloop')), '\\/').'/app/'; + } + + if (empty($sAppPath)) + { + $sUrl = \MailSo\Base\Http::SingletonInstance()->GetUrl(); + if ($sUrl && \preg_match('/\/index\.php\/apps\/rainloop/', $sUrl)) + { + $sAppPath = \preg_replace('/\/index\.php\/apps\/rainloop.+$/', + '/apps/rainloop/app/', $sUrl); + } + } + } + + return $sAppPath; + } + /** + * @return string + */ + public static function WebVersionPath() + { + return self::WebPath().'rainloop/v/'.APP_VERSION.'/'; + } + + /** + * @return string + */ + public static function WebStaticPath() + { + return self::WebVersionPath().'static/'; + } + + /** + * @param array $aSuggestions + * + * @return array + */ + public static function RemoveSuggestionDuplicates($aSuggestions) + { + $aResult = array(); + + if (is_array($aSuggestions)) + { + $aCache = array(); + foreach ($aSuggestions as $aItem) + { + $sLine = \implode('~~', $aItem); + if (!isset($aCache[$sLine])) + { + $aCache[$sLine] = true; + $aResult[] = $aItem; + } + } + } + + return $aResult; + } + + /** + * @param string $sFileName + * @param bool $bProcessSections = false + * + * @return array + */ + public static function CustomParseIniFile($sFileName, $bProcessSections = false) + { +// if (\MailSo\Base\Utils::FunctionExistsAndEnabled('parse_ini_file')) +// { +// return @\parse_ini_file($sFileName, !!$bProcessSections); +// } + + $sData = @\file_get_contents($sFileName); + return \is_string($sData) ? @\parse_ini_string($sData, !!$bProcessSections) : null; + } + + public static function CustomBaseConvert($sNumberInput, $sFromBaseInput = '0123456789', $sToBaseInput = '0123456789') + { + if ($sFromBaseInput === $sToBaseInput) + { + return $sNumberInput; + } + + $mFromBase = \str_split($sFromBaseInput, 1); + $mToBase = \str_split($sToBaseInput, 1); + $aNumber = \str_split($sNumberInput, 1); + $iFromLen = \strlen($sFromBaseInput); + $iToLen = \strlen($sToBaseInput); + $numberLen = \strlen($sNumberInput); + $mRetVal = ''; + + if ($sToBaseInput === '0123456789') + { + $mRetVal = 0; + for ($iIndex = 1; $iIndex <= $numberLen; $iIndex++) + { + $mRetVal = \bcadd($mRetVal, \bcmul(\array_search($aNumber[$iIndex - 1], $mFromBase), \bcpow($iFromLen, $numberLen - $iIndex))); + } + + return $mRetVal; + } + + if ($sFromBaseInput != '0123456789') + { + $sBase10 = \RainLoop\Utils::CustomBaseConvert($sNumberInput, $sFromBaseInput, '0123456789'); + } + else + { + $sBase10 = $sNumberInput; + } + + if ($sBase10 < \strlen($sToBaseInput)) + { + return $mToBase[$sBase10]; + } + + while ($sBase10 !== '0') + { + $mRetVal = $mToBase[\bcmod($sBase10, $iToLen)].$mRetVal; + $sBase10 = \bcdiv($sBase10, $iToLen, 0); + } + + return $mRetVal; + } +} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/AbstractBackend.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/AbstractBackend.php new file mode 100755 index 00000000..eab64407 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/AbstractBackend.php @@ -0,0 +1,155 @@ + array( + * '{DAV:}displayname' => null, + * ), + * 424 => array( + * '{DAV:}owner' => null, + * ) + * ) + * + * In this example it was forbidden to update {DAV:}displayname. + * (403 Forbidden), which in turn also caused {DAV:}owner to fail + * (424 Failed Dependency) because the request needs to be atomic. + * + * @param mixed $calendarId + * @param array $mutations + * @return bool|array + */ + public function updateCalendar($calendarId, array $mutations) { + + return false; + + } + + /** + * Performs a calendar-query on the contents of this calendar. + * + * The calendar-query is defined in RFC4791 : CalDAV. Using the + * calendar-query it is possible for a client to request a specific set of + * object, based on contents of iCalendar properties, date-ranges and + * iCalendar component types (VTODO, VEVENT). + * + * This method should just return a list of (relative) urls that match this + * query. + * + * The list of filters are specified as an array. The exact array is + * documented by \SabreForRainLoop\CalDAV\CalendarQueryParser. + * + * Note that it is extremely likely that getCalendarObject for every path + * returned from this method will be called almost immediately after. You + * may want to anticipate this to speed up these requests. + * + * This method provides a default implementation, which parses *all* the + * iCalendar objects in the specified calendar. + * + * This default may well be good enough for personal use, and calendars + * that aren't very large. But if you anticipate high usage, big calendars + * or high loads, you are strongly adviced to optimize certain paths. + * + * The best way to do so is override this method and to optimize + * specifically for 'common filters'. + * + * Requests that are extremely common are: + * * requests for just VEVENTS + * * requests for just VTODO + * * requests with a time-range-filter on either VEVENT or VTODO. + * + * ..and combinations of these requests. It may not be worth it to try to + * handle every possible situation and just rely on the (relatively + * easy to use) CalendarQueryValidator to handle the rest. + * + * Note that especially time-range-filters may be difficult to parse. A + * time-range filter specified on a VEVENT must for instance also handle + * recurrence rules correctly. + * A good example of how to interprete all these filters can also simply + * be found in \SabreForRainLoop\CalDAV\CalendarQueryFilter. This class is as correct + * as possible, so it gives you a good idea on what type of stuff you need + * to think of. + * + * @param mixed $calendarId + * @param array $filters + * @return array + */ + public function calendarQuery($calendarId, array $filters) { + + $result = array(); + $objects = $this->getCalendarObjects($calendarId); + + $validator = new \SabreForRainLoop\CalDAV\CalendarQueryValidator(); + + foreach($objects as $object) { + + if ($this->validateFilterForObject($object, $filters)) { + $result[] = $object['uri']; + } + + } + + return $result; + + } + + /** + * This method validates if a filters (as passed to calendarQuery) matches + * the given object. + * + * @param array $object + * @param array $filters + * @return bool + */ + protected function validateFilterForObject(array $object, array $filters) { + + // Unfortunately, setting the 'calendardata' here is optional. If + // it was excluded, we actually need another call to get this as + // well. + if (!isset($object['calendardata'])) { + $object = $this->getCalendarObject($object['calendarid'], $object['uri']); + } + + $data = is_resource($object['calendardata'])?stream_get_contents($object['calendardata']):$object['calendardata']; + $vObject = VObject\Reader::read($data); + + $validator = new CalDAV\CalendarQueryValidator(); + return $validator->validate($vObject, $filters); + + } + + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/BackendInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/BackendInterface.php new file mode 100755 index 00000000..ddfe5d8c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/BackendInterface.php @@ -0,0 +1,233 @@ + array( + * '{DAV:}displayname' => null, + * ), + * 424 => array( + * '{DAV:}owner' => null, + * ) + * ) + * + * In this example it was forbidden to update {DAV:}displayname. + * (403 Forbidden), which in turn also caused {DAV:}owner to fail + * (424 Failed Dependency) because the request needs to be atomic. + * + * @param mixed $calendarId + * @param array $mutations + * @return bool|array + */ + public function updateCalendar($calendarId, array $mutations); + + /** + * Delete a calendar and all it's objects + * + * @param mixed $calendarId + * @return void + */ + public function deleteCalendar($calendarId); + + /** + * Returns all calendar objects within a calendar. + * + * Every item contains an array with the following keys: + * * id - unique identifier which will be used for subsequent updates + * * calendardata - The iCalendar-compatible calendar data + * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string. + * * lastmodified - a timestamp of the last modification time + * * etag - An arbitrary string, surrounded by double-quotes. (e.g.: + * ' "abcdef"') + * * calendarid - The calendarid as it was passed to this function. + * * size - The size of the calendar objects, in bytes. + * + * Note that the etag is optional, but it's highly encouraged to return for + * speed reasons. + * + * The calendardata is also optional. If it's not returned + * 'getCalendarObject' will be called later, which *is* expected to return + * calendardata. + * + * If neither etag or size are specified, the calendardata will be + * used/fetched to determine these numbers. If both are specified the + * amount of times this is needed is reduced by a great degree. + * + * @param mixed $calendarId + * @return array + */ + public function getCalendarObjects($calendarId); + + /** + * Returns information from a single calendar object, based on it's object + * uri. + * + * The returned array must have the same keys as getCalendarObjects. The + * 'calendardata' object is required here though, while it's not required + * for getCalendarObjects. + * + * This method must return null if the object did not exist. + * + * @param mixed $calendarId + * @param string $objectUri + * @return array|null + */ + public function getCalendarObject($calendarId,$objectUri); + + /** + * Creates a new calendar object. + * + * It is possible return an etag from this function, which will be used in + * the response to this PUT request. Note that the ETag must be surrounded + * by double-quotes. + * + * However, you should only really return this ETag if you don't mangle the + * calendar-data. If the result of a subsequent GET to this object is not + * the exact same as this request body, you should omit the ETag. + * + * @param mixed $calendarId + * @param string $objectUri + * @param string $calendarData + * @return string|null + */ + public function createCalendarObject($calendarId,$objectUri,$calendarData); + + /** + * Updates an existing calendarobject, based on it's uri. + * + * It is possible return an etag from this function, which will be used in + * the response to this PUT request. Note that the ETag must be surrounded + * by double-quotes. + * + * However, you should only really return this ETag if you don't mangle the + * calendar-data. If the result of a subsequent GET to this object is not + * the exact same as this request body, you should omit the ETag. + * + * @param mixed $calendarId + * @param string $objectUri + * @param string $calendarData + * @return string|null + */ + public function updateCalendarObject($calendarId,$objectUri,$calendarData); + + /** + * Deletes an existing calendar object. + * + * @param mixed $calendarId + * @param string $objectUri + * @return void + */ + public function deleteCalendarObject($calendarId,$objectUri); + + /** + * Performs a calendar-query on the contents of this calendar. + * + * The calendar-query is defined in RFC4791 : CalDAV. Using the + * calendar-query it is possible for a client to request a specific set of + * object, based on contents of iCalendar properties, date-ranges and + * iCalendar component types (VTODO, VEVENT). + * + * This method should just return a list of (relative) urls that match this + * query. + * + * The list of filters are specified as an array. The exact array is + * documented by SabreForRainLoop\CalDAV\CalendarQueryParser. + * + * Note that it is extremely likely that getCalendarObject for every path + * returned from this method will be called almost immediately after. You + * may want to anticipate this to speed up these requests. + * + * This method provides a default implementation, which parses *all* the + * iCalendar objects in the specified calendar. + * + * This default may well be good enough for personal use, and calendars + * that aren't very large. But if you anticipate high usage, big calendars + * or high loads, you are strongly adviced to optimize certain paths. + * + * The best way to do so is override this method and to optimize + * specifically for 'common filters'. + * + * Requests that are extremely common are: + * * requests for just VEVENTS + * * requests for just VTODO + * * requests with a time-range-filter on either VEVENT or VTODO. + * + * ..and combinations of these requests. It may not be worth it to try to + * handle every possible situation and just rely on the (relatively + * easy to use) CalendarQueryValidator to handle the rest. + * + * Note that especially time-range-filters may be difficult to parse. A + * time-range filter specified on a VEVENT must for instance also handle + * recurrence rules correctly. + * A good example of how to interprete all these filters can also simply + * be found in SabreForRainLoop\CalDAV\CalendarQueryFilter. This class is as correct + * as possible, so it gives you a good idea on what type of stuff you need + * to think of. + * + * @param mixed $calendarId + * @param array $filters + * @return array + */ + public function calendarQuery($calendarId, array $filters); + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/NotificationSupport.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/NotificationSupport.php new file mode 100755 index 00000000..9ae43c8b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/NotificationSupport.php @@ -0,0 +1,47 @@ + 'displayname', + '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'description', + '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => 'timezone', + '{http://apple.com/ns/ical/}calendar-order' => 'calendarorder', + '{http://apple.com/ns/ical/}calendar-color' => 'calendarcolor', + ); + + /** + * Creates the backend + * + * @param \PDO $pdo + * @param string $calendarTableName + * @param string $calendarObjectTableName + */ + public function __construct(\PDO $pdo, $calendarTableName = 'calendars', $calendarObjectTableName = 'calendarobjects') { + + $this->pdo = $pdo; + $this->calendarTableName = $calendarTableName; + $this->calendarObjectTableName = $calendarObjectTableName; + + } + + /** + * Returns a list of calendars for a principal. + * + * Every project is an array with the following keys: + * * id, a unique id that will be used by other functions to modify the + * calendar. This can be the same as the uri or a database key. + * * uri, which the basename of the uri with which the calendar is + * accessed. + * * principaluri. The owner of the calendar. Almost always the same as + * principalUri passed to this method. + * + * Furthermore it can contain webdav properties in clark notation. A very + * common one is '{DAV:}displayname'. + * + * @param string $principalUri + * @return array + */ + public function getCalendarsForUser($principalUri) { + + $fields = array_values($this->propertyMap); + $fields[] = 'id'; + $fields[] = 'uri'; + $fields[] = 'ctag'; + $fields[] = 'components'; + $fields[] = 'principaluri'; + $fields[] = 'transparent'; + + // Making fields a comma-delimited list + $fields = implode(', ', $fields); + $stmt = $this->pdo->prepare("SELECT " . $fields . " FROM ".$this->calendarTableName." WHERE principaluri = ? ORDER BY calendarorder ASC"); + $stmt->execute(array($principalUri)); + + $calendars = array(); + while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { + + $components = array(); + if ($row['components']) { + $components = explode(',',$row['components']); + } + + $calendar = array( + 'id' => $row['id'], + 'uri' => $row['uri'], + 'principaluri' => $row['principaluri'], + '{' . CalDAV\Plugin::NS_CALENDARSERVER . '}getctag' => $row['ctag']?$row['ctag']:'0', + '{' . CalDAV\Plugin::NS_CALDAV . '}supported-calendar-component-set' => new CalDAV\Property\SupportedCalendarComponentSet($components), + '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-calendar-transp' => new CalDAV\Property\ScheduleCalendarTransp($row['transparent']?'transparent':'opaque'), + ); + + + foreach($this->propertyMap as $xmlName=>$dbName) { + $calendar[$xmlName] = $row[$dbName]; + } + + $calendars[] = $calendar; + + } + + return $calendars; + + } + + /** + * Creates a new calendar for a principal. + * + * If the creation was a success, an id must be returned that can be used to reference + * this calendar in other methods, such as updateCalendar + * + * @param string $principalUri + * @param string $calendarUri + * @param array $properties + * @return string + */ + public function createCalendar($principalUri, $calendarUri, array $properties) { + + $fieldNames = array( + 'principaluri', + 'uri', + 'ctag', + 'transparent', + ); + $values = array( + ':principaluri' => $principalUri, + ':uri' => $calendarUri, + ':ctag' => 1, + ':transparent' => 0, + ); + + // Default value + $sccs = '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set'; + $fieldNames[] = 'components'; + if (!isset($properties[$sccs])) { + $values[':components'] = 'VEVENT,VTODO'; + } else { + if (!($properties[$sccs] instanceof CalDAV\Property\SupportedCalendarComponentSet)) { + throw new DAV\Exception('The ' . $sccs . ' property must be of type: \SabreForRainLoop\CalDAV\Property\SupportedCalendarComponentSet'); + } + $values[':components'] = implode(',',$properties[$sccs]->getValue()); + } + $transp = '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-calendar-transp'; + if (isset($properties[$transp])) { + $values[':transparent'] = $properties[$transp]->getValue()==='transparent'; + } + + foreach($this->propertyMap as $xmlName=>$dbName) { + if (isset($properties[$xmlName])) { + + $values[':' . $dbName] = $properties[$xmlName]; + $fieldNames[] = $dbName; + } + } + + $stmt = $this->pdo->prepare("INSERT INTO ".$this->calendarTableName." (".implode(', ', $fieldNames).") VALUES (".implode(', ',array_keys($values)).")"); + $stmt->execute($values); + + return $this->pdo->lastInsertId(); + + } + + /** + * Updates properties for a calendar. + * + * The mutations array uses the propertyName in clark-notation as key, + * and the array value for the property value. In the case a property + * should be deleted, the property value will be null. + * + * This method must be atomic. If one property cannot be changed, the + * entire operation must fail. + * + * If the operation was successful, true can be returned. + * If the operation failed, false can be returned. + * + * Deletion of a non-existent property is always successful. + * + * Lastly, it is optional to return detailed information about any + * failures. In this case an array should be returned with the following + * structure: + * + * array( + * 403 => array( + * '{DAV:}displayname' => null, + * ), + * 424 => array( + * '{DAV:}owner' => null, + * ) + * ) + * + * In this example it was forbidden to update {DAV:}displayname. + * (403 Forbidden), which in turn also caused {DAV:}owner to fail + * (424 Failed Dependency) because the request needs to be atomic. + * + * @param string $calendarId + * @param array $mutations + * @return bool|array + */ + public function updateCalendar($calendarId, array $mutations) { + + $newValues = array(); + $result = array( + 200 => array(), // Ok + 403 => array(), // Forbidden + 424 => array(), // Failed Dependency + ); + + $hasError = false; + + foreach($mutations as $propertyName=>$propertyValue) { + + switch($propertyName) { + case '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-calendar-transp' : + $fieldName = 'transparent'; + $newValues[$fieldName] = $propertyValue->getValue()==='transparent'; + break; + default : + // Checking the property map + if (!isset($this->propertyMap[$propertyName])) { + // We don't know about this property. + $hasError = true; + $result[403][$propertyName] = null; + unset($mutations[$propertyName]); + continue; + } + + $fieldName = $this->propertyMap[$propertyName]; + $newValues[$fieldName] = $propertyValue; + } + + } + + // If there were any errors we need to fail the request + if ($hasError) { + // Properties has the remaining properties + foreach($mutations as $propertyName=>$propertyValue) { + $result[424][$propertyName] = null; + } + + // Removing unused statuscodes for cleanliness + foreach($result as $status=>$properties) { + if (is_array($properties) && count($properties)===0) unset($result[$status]); + } + + return $result; + + } + + // Success + + // Now we're generating the sql query. + $valuesSql = array(); + foreach($newValues as $fieldName=>$value) { + $valuesSql[] = $fieldName . ' = ?'; + } + $valuesSql[] = 'ctag = ctag + 1'; + + $stmt = $this->pdo->prepare("UPDATE " . $this->calendarTableName . " SET " . implode(', ',$valuesSql) . " WHERE id = ?"); + $newValues['id'] = $calendarId; + $stmt->execute(array_values($newValues)); + + return true; + + } + + /** + * Delete a calendar and all it's objects + * + * @param string $calendarId + * @return void + */ + public function deleteCalendar($calendarId) { + + $stmt = $this->pdo->prepare('DELETE FROM '.$this->calendarObjectTableName.' WHERE calendarid = ?'); + $stmt->execute(array($calendarId)); + + $stmt = $this->pdo->prepare('DELETE FROM '.$this->calendarTableName.' WHERE id = ?'); + $stmt->execute(array($calendarId)); + + } + + /** + * Returns all calendar objects within a calendar. + * + * Every item contains an array with the following keys: + * * id - unique identifier which will be used for subsequent updates + * * calendardata - The iCalendar-compatible calendar data + * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string. + * * lastmodified - a timestamp of the last modification time + * * etag - An arbitrary string, surrounded by double-quotes. (e.g.: + * ' "abcdef"') + * * calendarid - The calendarid as it was passed to this function. + * * size - The size of the calendar objects, in bytes. + * + * Note that the etag is optional, but it's highly encouraged to return for + * speed reasons. + * + * The calendardata is also optional. If it's not returned + * 'getCalendarObject' will be called later, which *is* expected to return + * calendardata. + * + * If neither etag or size are specified, the calendardata will be + * used/fetched to determine these numbers. If both are specified the + * amount of times this is needed is reduced by a great degree. + * + * @param string $calendarId + * @return array + */ + public function getCalendarObjects($calendarId) { + + $stmt = $this->pdo->prepare('SELECT id, uri, lastmodified, etag, calendarid, size FROM '.$this->calendarObjectTableName.' WHERE calendarid = ?'); + $stmt->execute(array($calendarId)); + + $result = array(); + foreach($stmt->fetchAll(\PDO::FETCH_ASSOC) as $row) { + $result[] = array( + 'id' => $row['id'], + 'uri' => $row['uri'], + 'lastmodified' => $row['lastmodified'], + 'etag' => '"' . $row['etag'] . '"', + 'calendarid' => $row['calendarid'], + 'size' => (int)$row['size'], + ); + } + + return $result; + + } + + /** + * Returns information from a single calendar object, based on it's object + * uri. + * + * The returned array must have the same keys as getCalendarObjects. The + * 'calendardata' object is required here though, while it's not required + * for getCalendarObjects. + * + * This method must return null if the object did not exist. + * + * @param string $calendarId + * @param string $objectUri + * @return array|null + */ + public function getCalendarObject($calendarId,$objectUri) { + + $stmt = $this->pdo->prepare('SELECT id, uri, lastmodified, etag, calendarid, size, calendardata FROM '.$this->calendarObjectTableName.' WHERE calendarid = ? AND uri = ?'); + $stmt->execute(array($calendarId, $objectUri)); + $row = $stmt->fetch(\PDO::FETCH_ASSOC); + + if(!$row) return null; + + return array( + 'id' => $row['id'], + 'uri' => $row['uri'], + 'lastmodified' => $row['lastmodified'], + 'etag' => '"' . $row['etag'] . '"', + 'calendarid' => $row['calendarid'], + 'size' => (int)$row['size'], + 'calendardata' => $row['calendardata'], + ); + + } + + + /** + * Creates a new calendar object. + * + * It is possible return an etag from this function, which will be used in + * the response to this PUT request. Note that the ETag must be surrounded + * by double-quotes. + * + * However, you should only really return this ETag if you don't mangle the + * calendar-data. If the result of a subsequent GET to this object is not + * the exact same as this request body, you should omit the ETag. + * + * @param mixed $calendarId + * @param string $objectUri + * @param string $calendarData + * @return string|null + */ + public function createCalendarObject($calendarId,$objectUri,$calendarData) { + + $extraData = $this->getDenormalizedData($calendarData); + + $stmt = $this->pdo->prepare('INSERT INTO '.$this->calendarObjectTableName.' (calendarid, uri, calendardata, lastmodified, etag, size, componenttype, firstoccurence, lastoccurence) VALUES (?,?,?,?,?,?,?,?,?)'); + $stmt->execute(array( + $calendarId, + $objectUri, + $calendarData, + time(), + $extraData['etag'], + $extraData['size'], + $extraData['componentType'], + $extraData['firstOccurence'], + $extraData['lastOccurence'], + )); + $stmt = $this->pdo->prepare('UPDATE '.$this->calendarTableName.' SET ctag = ctag + 1 WHERE id = ?'); + $stmt->execute(array($calendarId)); + + return '"' . $extraData['etag'] . '"'; + + } + + /** + * Updates an existing calendarobject, based on it's uri. + * + * It is possible return an etag from this function, which will be used in + * the response to this PUT request. Note that the ETag must be surrounded + * by double-quotes. + * + * However, you should only really return this ETag if you don't mangle the + * calendar-data. If the result of a subsequent GET to this object is not + * the exact same as this request body, you should omit the ETag. + * + * @param mixed $calendarId + * @param string $objectUri + * @param string $calendarData + * @return string|null + */ + public function updateCalendarObject($calendarId,$objectUri,$calendarData) { + + $extraData = $this->getDenormalizedData($calendarData); + + $stmt = $this->pdo->prepare('UPDATE '.$this->calendarObjectTableName.' SET calendardata = ?, lastmodified = ?, etag = ?, size = ?, componenttype = ?, firstoccurence = ?, lastoccurence = ? WHERE calendarid = ? AND uri = ?'); + $stmt->execute(array($calendarData,time(), $extraData['etag'], $extraData['size'], $extraData['componentType'], $extraData['firstOccurence'], $extraData['lastOccurence'] ,$calendarId,$objectUri)); + $stmt = $this->pdo->prepare('UPDATE '.$this->calendarTableName.' SET ctag = ctag + 1 WHERE id = ?'); + $stmt->execute(array($calendarId)); + + return '"' . $extraData['etag'] . '"'; + + } + + /** + * Parses some information from calendar objects, used for optimized + * calendar-queries. + * + * Returns an array with the following keys: + * * etag + * * size + * * componentType + * * firstOccurence + * * lastOccurence + * + * @param string $calendarData + * @return array + */ + protected function getDenormalizedData($calendarData) { + + $vObject = VObject\Reader::read($calendarData); + $componentType = null; + $component = null; + $firstOccurence = null; + $lastOccurence = null; + foreach($vObject->getComponents() as $component) { + if ($component->name!=='VTIMEZONE') { + $componentType = $component->name; + break; + } + } + if (!$componentType) { + throw new \SabreForRainLoop\DAV\Exception\BadRequest('Calendar objects must have a VJOURNAL, VEVENT or VTODO component'); + } + if ($componentType === 'VEVENT') { + $firstOccurence = $component->DTSTART->getDateTime()->getTimeStamp(); + // Finding the last occurence is a bit harder + if (!isset($component->RRULE)) { + if (isset($component->DTEND)) { + $lastOccurence = $component->DTEND->getDateTime()->getTimeStamp(); + } elseif (isset($component->DURATION)) { + $endDate = clone $component->DTSTART->getDateTime(); + $endDate->add(VObject\DateTimeParser::parse($component->DURATION->getValue())); + $lastOccurence = $endDate->getTimeStamp(); + } elseif (!$component->DTSTART->hasTime()) { + $endDate = clone $component->DTSTART->getDateTime(); + $endDate->modify('+1 day'); + $lastOccurence = $endDate->getTimeStamp(); + } else { + $lastOccurence = $firstOccurence; + } + } else { + $it = new VObject\RecurrenceIterator($vObject, (string)$component->UID); + $maxDate = new \DateTime(self::MAX_DATE); + if ($it->isInfinite()) { + $lastOccurence = $maxDate->getTimeStamp(); + } else { + $end = $it->getDtEnd(); + while($it->valid() && $end < $maxDate) { + $end = $it->getDtEnd(); + $it->next(); + + } + $lastOccurence = $end->getTimeStamp(); + } + + } + } + + return array( + 'etag' => md5($calendarData), + 'size' => strlen($calendarData), + 'componentType' => $componentType, + 'firstOccurence' => $firstOccurence, + 'lastOccurence' => $lastOccurence, + ); + + } + + /** + * Deletes an existing calendar object. + * + * @param string $calendarId + * @param string $objectUri + * @return void + */ + public function deleteCalendarObject($calendarId,$objectUri) { + + $stmt = $this->pdo->prepare('DELETE FROM '.$this->calendarObjectTableName.' WHERE calendarid = ? AND uri = ?'); + $stmt->execute(array($calendarId,$objectUri)); + $stmt = $this->pdo->prepare('UPDATE '. $this->calendarTableName .' SET ctag = ctag + 1 WHERE id = ?'); + $stmt->execute(array($calendarId)); + + } + + /** + * Performs a calendar-query on the contents of this calendar. + * + * The calendar-query is defined in RFC4791 : CalDAV. Using the + * calendar-query it is possible for a client to request a specific set of + * object, based on contents of iCalendar properties, date-ranges and + * iCalendar component types (VTODO, VEVENT). + * + * This method should just return a list of (relative) urls that match this + * query. + * + * The list of filters are specified as an array. The exact array is + * documented by \SabreForRainLoop\CalDAV\CalendarQueryParser. + * + * Note that it is extremely likely that getCalendarObject for every path + * returned from this method will be called almost immediately after. You + * may want to anticipate this to speed up these requests. + * + * This method provides a default implementation, which parses *all* the + * iCalendar objects in the specified calendar. + * + * This default may well be good enough for personal use, and calendars + * that aren't very large. But if you anticipate high usage, big calendars + * or high loads, you are strongly adviced to optimize certain paths. + * + * The best way to do so is override this method and to optimize + * specifically for 'common filters'. + * + * Requests that are extremely common are: + * * requests for just VEVENTS + * * requests for just VTODO + * * requests with a time-range-filter on a VEVENT. + * + * ..and combinations of these requests. It may not be worth it to try to + * handle every possible situation and just rely on the (relatively + * easy to use) CalendarQueryValidator to handle the rest. + * + * Note that especially time-range-filters may be difficult to parse. A + * time-range filter specified on a VEVENT must for instance also handle + * recurrence rules correctly. + * A good example of how to interprete all these filters can also simply + * be found in \SabreForRainLoop\CalDAV\CalendarQueryFilter. This class is as correct + * as possible, so it gives you a good idea on what type of stuff you need + * to think of. + * + * This specific implementation (for the PDO) backend optimizes filters on + * specific components, and VEVENT time-ranges. + * + * @param string $calendarId + * @param array $filters + * @return array + */ + public function calendarQuery($calendarId, array $filters) { + + $result = array(); + $validator = new \SabreForRainLoop\CalDAV\CalendarQueryValidator(); + + $componentType = null; + $requirePostFilter = true; + $timeRange = null; + + // if no filters were specified, we don't need to filter after a query + if (!$filters['prop-filters'] && !$filters['comp-filters']) { + $requirePostFilter = false; + } + + // Figuring out if there's a component filter + if (count($filters['comp-filters']) > 0 && !$filters['comp-filters'][0]['is-not-defined']) { + $componentType = $filters['comp-filters'][0]['name']; + + // Checking if we need post-filters + if (!$filters['prop-filters'] && !$filters['comp-filters'][0]['comp-filters'] && !$filters['comp-filters'][0]['time-range'] && !$filters['comp-filters'][0]['prop-filters']) { + $requirePostFilter = false; + } + // There was a time-range filter + if ($componentType == 'VEVENT' && isset($filters['comp-filters'][0]['time-range'])) { + $timeRange = $filters['comp-filters'][0]['time-range']; + + // If start time OR the end time is not specified, we can do a + // 100% accurate mysql query. + if (!$filters['prop-filters'] && !$filters['comp-filters'][0]['comp-filters'] && !$filters['comp-filters'][0]['prop-filters'] && (!$timeRange['start'] || !$timeRange['end'])) { + $requirePostFilter = false; + } + } + + } + + if ($requirePostFilter) { + $query = "SELECT uri, calendardata FROM ".$this->calendarObjectTableName." WHERE calendarid = :calendarid"; + } else { + $query = "SELECT uri FROM ".$this->calendarObjectTableName." WHERE calendarid = :calendarid"; + } + + $values = array( + 'calendarid' => $calendarId, + ); + + if ($componentType) { + $query.=" AND componenttype = :componenttype"; + $values['componenttype'] = $componentType; + } + + if ($timeRange && $timeRange['start']) { + $query.=" AND lastoccurence > :startdate"; + $values['startdate'] = $timeRange['start']->getTimeStamp(); + } + if ($timeRange && $timeRange['end']) { + $query.=" AND firstoccurence < :enddate"; + $values['enddate'] = $timeRange['end']->getTimeStamp(); + } + + $stmt = $this->pdo->prepare($query); + $stmt->execute($values); + + $result = array(); + while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { + if ($requirePostFilter) { + if (!$this->validateFilterForObject($row, $filters)) { + continue; + } + } + $result[] = $row['uri']; + + } + + return $result; + + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/SharingSupport.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/SharingSupport.php new file mode 100755 index 00000000..3bfcc145 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/SharingSupport.php @@ -0,0 +1,243 @@ +caldavBackend = $caldavBackend; + $this->calendarInfo = $calendarInfo; + + } + + /** + * Returns the name of the calendar + * + * @return string + */ + public function getName() { + + return $this->calendarInfo['uri']; + + } + + /** + * Updates properties such as the display name and description + * + * @param array $mutations + * @return array + */ + public function updateProperties($mutations) { + + return $this->caldavBackend->updateCalendar($this->calendarInfo['id'],$mutations); + + } + + /** + * Returns the list of properties + * + * @param array $requestedProperties + * @return array + */ + public function getProperties($requestedProperties) { + + $response = array(); + + foreach($requestedProperties as $prop) switch($prop) { + + case '{urn:ietf:params:xml:ns:caldav}supported-calendar-data' : + $response[$prop] = new Property\SupportedCalendarData(); + break; + case '{urn:ietf:params:xml:ns:caldav}supported-collation-set' : + $response[$prop] = new Property\SupportedCollationSet(); + break; + case '{DAV:}owner' : + $response[$prop] = new DAVACL\Property\Principal(DAVACL\Property\Principal::HREF,$this->calendarInfo['principaluri']); + break; + default : + if (isset($this->calendarInfo[$prop])) $response[$prop] = $this->calendarInfo[$prop]; + break; + + } + return $response; + + } + + /** + * Returns a calendar object + * + * The contained calendar objects are for example Events or Todo's. + * + * @param string $name + * @return \SabreForRainLoop\CalDAV\ICalendarObject + */ + public function getChild($name) { + + $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'],$name); + + if (!$obj) throw new DAV\Exception\NotFound('Calendar object not found'); + + $obj['acl'] = $this->getACL(); + // Removing the irrelivant + foreach($obj['acl'] as $key=>$acl) { + if ($acl['privilege'] === '{' . Plugin::NS_CALDAV . '}read-free-busy') { + unset($obj['acl'][$key]); + } + } + + return new CalendarObject($this->caldavBackend,$this->calendarInfo,$obj); + + } + + /** + * Returns the full list of calendar objects + * + * @return array + */ + public function getChildren() { + + $objs = $this->caldavBackend->getCalendarObjects($this->calendarInfo['id']); + $children = array(); + foreach($objs as $obj) { + $obj['acl'] = $this->getACL(); + // Removing the irrelivant + foreach($obj['acl'] as $key=>$acl) { + if ($acl['privilege'] === '{' . Plugin::NS_CALDAV . '}read-free-busy') { + unset($obj['acl'][$key]); + } + } + $children[] = new CalendarObject($this->caldavBackend,$this->calendarInfo,$obj); + } + return $children; + + } + + /** + * Checks if a child-node exists. + * + * @param string $name + * @return bool + */ + public function childExists($name) { + + $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'],$name); + if (!$obj) + return false; + else + return true; + + } + + /** + * Creates a new directory + * + * We actually block this, as subdirectories are not allowed in calendars. + * + * @param string $name + * @return void + */ + public function createDirectory($name) { + + throw new DAV\Exception\MethodNotAllowed('Creating collections in calendar objects is not allowed'); + + } + + /** + * Creates a new file + * + * The contents of the new file must be a valid ICalendar string. + * + * @param string $name + * @param resource $calendarData + * @return string|null + */ + public function createFile($name,$calendarData = null) { + + if (is_resource($calendarData)) { + $calendarData = stream_get_contents($calendarData); + } + return $this->caldavBackend->createCalendarObject($this->calendarInfo['id'],$name,$calendarData); + + } + + /** + * Deletes the calendar. + * + * @return void + */ + public function delete() { + + $this->caldavBackend->deleteCalendar($this->calendarInfo['id']); + + } + + /** + * Renames the calendar. Note that most calendars use the + * {DAV:}displayname to display a name to display a name. + * + * @param string $newName + * @return void + */ + public function setName($newName) { + + throw new DAV\Exception\MethodNotAllowed('Renaming calendars is not yet supported'); + + } + + /** + * Returns the last modification date as a unix timestamp. + * + * @return void + */ + public function getLastModified() { + + return null; + + } + + /** + * Returns the owner principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getOwner() { + + return $this->calendarInfo['principaluri']; + + } + + /** + * Returns a group principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getGroup() { + + return null; + + } + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + return array( + array( + 'privilege' => '{DAV:}read', + 'principal' => $this->getOwner(), + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}write', + 'principal' => $this->getOwner(), + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}read', + 'principal' => $this->getOwner() . '/calendar-proxy-write', + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}write', + 'principal' => $this->getOwner() . '/calendar-proxy-write', + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}read', + 'principal' => $this->getOwner() . '/calendar-proxy-read', + 'protected' => true, + ), + array( + 'privilege' => '{' . Plugin::NS_CALDAV . '}read-free-busy', + 'principal' => '{DAV:}authenticated', + 'protected' => true, + ), + + ); + + } + + /** + * Updates the ACL + * + * This method will receive a list of new ACE's. + * + * @param array $acl + * @return void + */ + public function setACL(array $acl) { + + throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported'); + + } + + /** + * Returns the list of supported privileges for this node. + * + * The returned data structure is a list of nested privileges. + * See \SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple + * standard structure. + * + * If null is returned from this method, the default privilege set is used, + * which is fine for most common usecases. + * + * @return array|null + */ + public function getSupportedPrivilegeSet() { + + $default = DAVACL\Plugin::getDefaultSupportedPrivilegeSet(); + + // We need to inject 'read-free-busy' in the tree, aggregated under + // {DAV:}read. + foreach($default['aggregates'] as &$agg) { + + if ($agg['privilege'] !== '{DAV:}read') continue; + + $agg['aggregates'][] = array( + 'privilege' => '{' . Plugin::NS_CALDAV . '}read-free-busy', + ); + + } + return $default; + + } + + /** + * Performs a calendar-query on the contents of this calendar. + * + * The calendar-query is defined in RFC4791 : CalDAV. Using the + * calendar-query it is possible for a client to request a specific set of + * object, based on contents of iCalendar properties, date-ranges and + * iCalendar component types (VTODO, VEVENT). + * + * This method should just return a list of (relative) urls that match this + * query. + * + * The list of filters are specified as an array. The exact array is + * documented by SabreForRainLoop\CalDAV\CalendarQueryParser. + * + * @param array $filters + * @return array + */ + public function calendarQuery(array $filters) { + + return $this->caldavBackend->calendarQuery($this->calendarInfo['id'], $filters); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarObject.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarObject.php new file mode 100755 index 00000000..9f6b4988 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarObject.php @@ -0,0 +1,279 @@ +caldavBackend = $caldavBackend; + + if (!isset($objectData['calendarid'])) { + throw new \InvalidArgumentException('The objectData argument must contain a \'calendarid\' property'); + } + if (!isset($objectData['uri'])) { + throw new \InvalidArgumentException('The objectData argument must contain an \'uri\' property'); + } + + $this->calendarInfo = $calendarInfo; + $this->objectData = $objectData; + + } + + /** + * Returns the uri for this object + * + * @return string + */ + public function getName() { + + return $this->objectData['uri']; + + } + + /** + * Returns the ICalendar-formatted object + * + * @return string + */ + public function get() { + + // Pre-populating the 'calendardata' is optional, if we don't have it + // already we fetch it from the backend. + if (!isset($this->objectData['calendardata'])) { + $this->objectData = $this->caldavBackend->getCalendarObject($this->objectData['calendarid'], $this->objectData['uri']); + } + return $this->objectData['calendardata']; + + } + + /** + * Updates the ICalendar-formatted object + * + * @param string|resource $calendarData + * @return string + */ + public function put($calendarData) { + + if (is_resource($calendarData)) { + $calendarData = stream_get_contents($calendarData); + } + $etag = $this->caldavBackend->updateCalendarObject($this->calendarInfo['id'],$this->objectData['uri'],$calendarData); + $this->objectData['calendardata'] = $calendarData; + $this->objectData['etag'] = $etag; + + return $etag; + + } + + /** + * Deletes the calendar object + * + * @return void + */ + public function delete() { + + $this->caldavBackend->deleteCalendarObject($this->calendarInfo['id'],$this->objectData['uri']); + + } + + /** + * Returns the mime content-type + * + * @return string + */ + public function getContentType() { + + return 'text/calendar; charset=utf-8'; + + } + + /** + * Returns an ETag for this object. + * + * The ETag is an arbitrary string, but MUST be surrounded by double-quotes. + * + * @return string + */ + public function getETag() { + + if (isset($this->objectData['etag'])) { + return $this->objectData['etag']; + } else { + return '"' . md5($this->get()). '"'; + } + + } + + /** + * Returns the last modification date as a unix timestamp + * + * @return int + */ + public function getLastModified() { + + return $this->objectData['lastmodified']; + + } + + /** + * Returns the size of this object in bytes + * + * @return int + */ + public function getSize() { + + if (array_key_exists('size',$this->objectData)) { + return $this->objectData['size']; + } else { + return strlen($this->get()); + } + + } + + /** + * Returns the owner principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getOwner() { + + return $this->calendarInfo['principaluri']; + + } + + /** + * Returns a group principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getGroup() { + + return null; + + } + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + // An alternative acl may be specified in the object data. + if (isset($this->objectData['acl'])) { + return $this->objectData['acl']; + } + + // The default ACL + return array( + array( + 'privilege' => '{DAV:}read', + 'principal' => $this->calendarInfo['principaluri'], + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}write', + 'principal' => $this->calendarInfo['principaluri'], + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}read', + 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-write', + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}write', + 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-write', + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}read', + 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-read', + 'protected' => true, + ), + + ); + + } + + /** + * Updates the ACL + * + * This method will receive a list of new ACE's. + * + * @param array $acl + * @return void + */ + public function setACL(array $acl) { + + throw new \SabreForRainLoop\DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported'); + + } + + /** + * Returns the list of supported privileges for this node. + * + * The returned data structure is a list of nested privileges. + * See \SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple + * standard structure. + * + * If null is returned from this method, the default privilege set is used, + * which is fine for most common usecases. + * + * @return array|null + */ + public function getSupportedPrivilegeSet() { + + return null; + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarQueryParser.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarQueryParser.php new file mode 100755 index 00000000..8a3aec7f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarQueryParser.php @@ -0,0 +1,298 @@ +dom = $dom; + $this->xpath = new \DOMXPath($dom); + $this->xpath->registerNameSpace('cal',Plugin::NS_CALDAV); + $this->xpath->registerNameSpace('dav','urn:DAV'); + + } + + /** + * Parses the request. + * + * @return void + */ + public function parse() { + + $filterNode = null; + + $filter = $this->xpath->query('/cal:calendar-query/cal:filter'); + if ($filter->length !== 1) { + throw new \SabreForRainLoop\DAV\Exception\BadRequest('Only one filter element is allowed'); + } + + $compFilters = $this->parseCompFilters($filter->item(0)); + if (count($compFilters)!==1) { + throw new \SabreForRainLoop\DAV\Exception\BadRequest('There must be exactly 1 top-level comp-filter.'); + } + + $this->filters = $compFilters[0]; + $this->requestedProperties = array_keys(\SabreForRainLoop\DAV\XMLUtil::parseProperties($this->dom->firstChild)); + + $expand = $this->xpath->query('/cal:calendar-query/dav:prop/cal:calendar-data/cal:expand'); + if ($expand->length>0) { + $this->expand = $this->parseExpand($expand->item(0)); + } + + + } + + /** + * Parses all the 'comp-filter' elements from a node + * + * @param \DOMElement $parentNode + * @return array + */ + protected function parseCompFilters(\DOMElement $parentNode) { + + $compFilterNodes = $this->xpath->query('cal:comp-filter', $parentNode); + $result = array(); + + for($ii=0; $ii < $compFilterNodes->length; $ii++) { + + $compFilterNode = $compFilterNodes->item($ii); + + $compFilter = array(); + $compFilter['name'] = $compFilterNode->getAttribute('name'); + $compFilter['is-not-defined'] = $this->xpath->query('cal:is-not-defined', $compFilterNode)->length>0; + $compFilter['comp-filters'] = $this->parseCompFilters($compFilterNode); + $compFilter['prop-filters'] = $this->parsePropFilters($compFilterNode); + $compFilter['time-range'] = $this->parseTimeRange($compFilterNode); + + if ($compFilter['time-range'] && !in_array($compFilter['name'],array( + 'VEVENT', + 'VTODO', + 'VJOURNAL', + 'VFREEBUSY', + 'VALARM', + ))) { + throw new \SabreForRainLoop\DAV\Exception\BadRequest('The time-range filter is not defined for the ' . $compFilter['name'] . ' component'); + }; + + $result[] = $compFilter; + + } + + return $result; + + } + + /** + * Parses all the prop-filter elements from a node + * + * @param \DOMElement $parentNode + * @return array + */ + protected function parsePropFilters(\DOMElement $parentNode) { + + $propFilterNodes = $this->xpath->query('cal:prop-filter', $parentNode); + $result = array(); + + for ($ii=0; $ii < $propFilterNodes->length; $ii++) { + + $propFilterNode = $propFilterNodes->item($ii); + $propFilter = array(); + $propFilter['name'] = $propFilterNode->getAttribute('name'); + $propFilter['is-not-defined'] = $this->xpath->query('cal:is-not-defined', $propFilterNode)->length>0; + $propFilter['param-filters'] = $this->parseParamFilters($propFilterNode); + $propFilter['text-match'] = $this->parseTextMatch($propFilterNode); + $propFilter['time-range'] = $this->parseTimeRange($propFilterNode); + + $result[] = $propFilter; + + } + + return $result; + + } + + /** + * Parses the param-filter element + * + * @param \DOMElement $parentNode + * @return array + */ + protected function parseParamFilters(\DOMElement $parentNode) { + + $paramFilterNodes = $this->xpath->query('cal:param-filter', $parentNode); + $result = array(); + + for($ii=0;$ii<$paramFilterNodes->length;$ii++) { + + $paramFilterNode = $paramFilterNodes->item($ii); + $paramFilter = array(); + $paramFilter['name'] = $paramFilterNode->getAttribute('name'); + $paramFilter['is-not-defined'] = $this->xpath->query('cal:is-not-defined', $paramFilterNode)->length>0; + $paramFilter['text-match'] = $this->parseTextMatch($paramFilterNode); + + $result[] = $paramFilter; + + } + + return $result; + + } + + /** + * Parses the text-match element + * + * @param \DOMElement $parentNode + * @return array|null + */ + protected function parseTextMatch(\DOMElement $parentNode) { + + $textMatchNodes = $this->xpath->query('cal:text-match', $parentNode); + + if ($textMatchNodes->length === 0) + return null; + + $textMatchNode = $textMatchNodes->item(0); + $negateCondition = $textMatchNode->getAttribute('negate-condition'); + $negateCondition = $negateCondition==='yes'; + $collation = $textMatchNode->getAttribute('collation'); + if (!$collation) $collation = 'i;ascii-casemap'; + + return array( + 'negate-condition' => $negateCondition, + 'collation' => $collation, + 'value' => $textMatchNode->nodeValue + ); + + } + + /** + * Parses the time-range element + * + * @param \DOMElement $parentNode + * @return array|null + */ + protected function parseTimeRange(\DOMElement $parentNode) { + + $timeRangeNodes = $this->xpath->query('cal:time-range', $parentNode); + if ($timeRangeNodes->length === 0) { + return null; + } + + $timeRangeNode = $timeRangeNodes->item(0); + + if ($start = $timeRangeNode->getAttribute('start')) { + $start = VObject\DateTimeParser::parseDateTime($start); + } else { + $start = null; + } + if ($end = $timeRangeNode->getAttribute('end')) { + $end = VObject\DateTimeParser::parseDateTime($end); + } else { + $end = null; + } + + if (!is_null($start) && !is_null($end) && $end <= $start) { + throw new \SabreForRainLoop\DAV\Exception\BadRequest('The end-date must be larger than the start-date in the time-range filter'); + } + + return array( + 'start' => $start, + 'end' => $end, + ); + + } + + /** + * Parses the CALDAV:expand element + * + * @param \DOMElement $parentNode + * @return void + */ + protected function parseExpand(\DOMElement $parentNode) { + + $start = $parentNode->getAttribute('start'); + if(!$start) { + throw new \SabreForRainLoop\DAV\Exception\BadRequest('The "start" attribute is required for the CALDAV:expand element'); + } + $start = VObject\DateTimeParser::parseDateTime($start); + + $end = $parentNode->getAttribute('end'); + if(!$end) { + throw new \SabreForRainLoop\DAV\Exception\BadRequest('The "end" attribute is required for the CALDAV:expand element'); + } + + $end = VObject\DateTimeParser::parseDateTime($end); + + if ($end <= $start) { + throw new \SabreForRainLoop\DAV\Exception\BadRequest('The end-date must be larger than the start-date in the expand element.'); + } + + return array( + 'start' => $start, + 'end' => $end, + ); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarQueryValidator.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarQueryValidator.php new file mode 100755 index 00000000..4537d3bf --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarQueryValidator.php @@ -0,0 +1,392 @@ +name !== $filters['name']) { + return false; + } + + return + $this->validateCompFilters($vObject, $filters['comp-filters']) && + $this->validatePropFilters($vObject, $filters['prop-filters']); + + + } + + /** + * This method checks the validity of comp-filters. + * + * A list of comp-filters needs to be specified. Also the parent of the + * component we're checking should be specified, not the component to check + * itself. + * + * @param VObject\Component $parent + * @param array $filters + * @return bool + */ + protected function validateCompFilters(VObject\Component $parent, array $filters) { + + foreach($filters as $filter) { + + $isDefined = isset($parent->$filter['name']); + + if ($filter['is-not-defined']) { + + if ($isDefined) { + return false; + } else { + continue; + } + + } + if (!$isDefined) { + return false; + } + + if ($filter['time-range']) { + foreach($parent->$filter['name'] as $subComponent) { + if ($this->validateTimeRange($subComponent, $filter['time-range']['start'], $filter['time-range']['end'])) { + continue 2; + } + } + return false; + } + + if (!$filter['comp-filters'] && !$filter['prop-filters']) { + continue; + } + + // If there are sub-filters, we need to find at least one component + // for which the subfilters hold true. + foreach($parent->$filter['name'] as $subComponent) { + + if ( + $this->validateCompFilters($subComponent, $filter['comp-filters']) && + $this->validatePropFilters($subComponent, $filter['prop-filters'])) { + // We had a match, so this comp-filter succeeds + continue 2; + } + + } + + // If we got here it means there were sub-comp-filters or + // sub-prop-filters and there was no match. This means this filter + // needs to return false. + return false; + + } + + // If we got here it means we got through all comp-filters alive so the + // filters were all true. + return true; + + } + + /** + * This method checks the validity of prop-filters. + * + * A list of prop-filters needs to be specified. Also the parent of the + * property we're checking should be specified, not the property to check + * itself. + * + * @param VObject\Component $parent + * @param array $filters + * @return bool + */ + protected function validatePropFilters(VObject\Component $parent, array $filters) { + + foreach($filters as $filter) { + + $isDefined = isset($parent->$filter['name']); + + if ($filter['is-not-defined']) { + + if ($isDefined) { + return false; + } else { + continue; + } + + } + if (!$isDefined) { + return false; + } + + if ($filter['time-range']) { + foreach($parent->$filter['name'] as $subComponent) { + if ($this->validateTimeRange($subComponent, $filter['time-range']['start'], $filter['time-range']['end'])) { + continue 2; + } + } + return false; + } + + if (!$filter['param-filters'] && !$filter['text-match']) { + continue; + } + + // If there are sub-filters, we need to find at least one property + // for which the subfilters hold true. + foreach($parent->$filter['name'] as $subComponent) { + + if( + $this->validateParamFilters($subComponent, $filter['param-filters']) && + (!$filter['text-match'] || $this->validateTextMatch($subComponent, $filter['text-match'])) + ) { + // We had a match, so this prop-filter succeeds + continue 2; + } + + } + + // If we got here it means there were sub-param-filters or + // text-match filters and there was no match. This means the + // filter needs to return false. + return false; + + } + + // If we got here it means we got through all prop-filters alive so the + // filters were all true. + return true; + + } + + /** + * This method checks the validity of param-filters. + * + * A list of param-filters needs to be specified. Also the parent of the + * parameter we're checking should be specified, not the parameter to check + * itself. + * + * @param VObject\Property $parent + * @param array $filters + * @return bool + */ + protected function validateParamFilters(VObject\Property $parent, array $filters) { + + foreach($filters as $filter) { + + $isDefined = isset($parent[$filter['name']]); + + if ($filter['is-not-defined']) { + + if ($isDefined) { + return false; + } else { + continue; + } + + } + if (!$isDefined) { + return false; + } + + if (!$filter['text-match']) { + continue; + } + + if (version_compare(VObject\Version::VERSION, '3.0.0beta1', '>=')) { + + // If there are sub-filters, we need to find at least one parameter + // for which the subfilters hold true. + foreach($parent[$filter['name']]->getParts() as $subParam) { + + if($this->validateTextMatch($subParam,$filter['text-match'])) { + // We had a match, so this param-filter succeeds + continue 2; + } + + } + + } else { + + // If there are sub-filters, we need to find at least one parameter + // for which the subfilters hold true. + foreach($parent[$filter['name']] as $subParam) { + + if($this->validateTextMatch($subParam,$filter['text-match'])) { + // We had a match, so this param-filter succeeds + continue 2; + } + + } + + } + + // If we got here it means there was a text-match filter and there + // were no matches. This means the filter needs to return false. + return false; + + } + + // If we got here it means we got through all param-filters alive so the + // filters were all true. + return true; + + } + + /** + * This method checks the validity of a text-match. + * + * A single text-match should be specified as well as the specific property + * or parameter we need to validate. + * + * @param VObject\Node|string $check Value to check against. + * @param array $textMatch + * @return bool + */ + protected function validateTextMatch($check, array $textMatch) { + + if ($check instanceof VObject\Node) { + $check = (string)$check; + } + + $isMatching = \SabreForRainLoop\DAV\StringUtil::textMatch($check, $textMatch['value'], $textMatch['collation']); + + return ($textMatch['negate-condition'] xor $isMatching); + + } + + /** + * Validates if a component matches the given time range. + * + * This is all based on the rules specified in rfc4791, which are quite + * complex. + * + * @param VObject\Node $component + * @param DateTime $start + * @param DateTime $end + * @return bool + */ + protected function validateTimeRange(VObject\Node $component, $start, $end) { + + if (is_null($start)) { + $start = new DateTime('1900-01-01'); + } + if (is_null($end)) { + $end = new DateTime('3000-01-01'); + } + + switch($component->name) { + + case 'VEVENT' : + case 'VTODO' : + case 'VJOURNAL' : + + return $component->isInTimeRange($start, $end); + + case 'VALARM' : + + // If the valarm is wrapped in a recurring event, we need to + // expand the recursions, and validate each. + // + // Our datamodel doesn't easily allow us to do this straight + // in the VALARM component code, so this is a hack, and an + // expensive one too. + if ($component->parent->name === 'VEVENT' && $component->parent->RRULE) { + + // Fire up the iterator! + $it = new VObject\RecurrenceIterator($component->parent->parent, (string)$component->parent->UID); + while($it->valid()) { + $expandedEvent = $it->getEventObject(); + + // We need to check from these expanded alarms, which + // one is the first to trigger. Based on this, we can + // determine if we can 'give up' expanding events. + $firstAlarm = null; + if ($expandedEvent->VALARM !== null) { + foreach($expandedEvent->VALARM as $expandedAlarm) { + + $effectiveTrigger = $expandedAlarm->getEffectiveTriggerTime(); + if ($expandedAlarm->isInTimeRange($start, $end)) { + return true; + } + + if ((string)$expandedAlarm->TRIGGER['VALUE'] === 'DATE-TIME') { + // This is an alarm with a non-relative trigger + // time, likely created by a buggy client. The + // implication is that every alarm in this + // recurring event trigger at the exact same + // time. It doesn't make sense to traverse + // further. + } else { + // We store the first alarm as a means to + // figure out when we can stop traversing. + if (!$firstAlarm || $effectiveTrigger < $firstAlarm) { + $firstAlarm = $effectiveTrigger; + } + } + } + } + if (is_null($firstAlarm)) { + // No alarm was found. + // + // Or technically: No alarm that will change for + // every instance of the recurrence was found, + // which means we can assume there was no match. + return false; + } + if ($firstAlarm > $end) { + return false; + } + $it->next(); + } + return false; + } else { + return $component->isInTimeRange($start, $end); + } + + case 'VFREEBUSY' : + throw new \SabreForRainLoop\DAV\Exception\NotImplemented('time-range filters are currently not supported on ' . $component->name . ' components'); + + case 'COMPLETED' : + case 'CREATED' : + case 'DTEND' : + case 'DTSTAMP' : + case 'DTSTART' : + case 'DUE' : + case 'LAST-MODIFIED' : + return ($start <= $component->getDateTime() && $end >= $component->getDateTime()); + + + + default : + throw new \SabreForRainLoop\DAV\Exception\BadRequest('You cannot create a time-range filter on a ' . $component->name . ' component'); + + } + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarRootNode.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarRootNode.php new file mode 100755 index 00000000..69e01b1a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarRootNode.php @@ -0,0 +1,77 @@ +caldavBackend = $caldavBackend; + + } + + /** + * Returns the nodename + * + * We're overriding this, because the default will be the 'principalPrefix', + * and we want it to be SabreForRainLoop\CalDAV\Plugin::CALENDAR_ROOT + * + * @return string + */ + public function getName() { + + return Plugin::CALENDAR_ROOT; + + } + + /** + * This method returns a node for a principal. + * + * The passed array contains principal information, and is guaranteed to + * at least contain a uri item. Other properties may or may not be + * supplied by the authentication backend. + * + * @param array $principal + * @return \SabreForRainLoop\DAV\INode + */ + public function getChildForPrincipal(array $principal) { + + return new UserCalendars($this->caldavBackend, $principal); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Exception/InvalidComponentType.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Exception/InvalidComponentType.php new file mode 100755 index 00000000..c7d0ea92 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Exception/InvalidComponentType.php @@ -0,0 +1,35 @@ +ownerDocument; + + $np = $doc->createElementNS(CalDAV\Plugin::NS_CALDAV,'cal:supported-calendar-component'); + $errorNode->appendChild($np); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ICSExportPlugin.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ICSExportPlugin.php new file mode 100755 index 00000000..6e36274e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ICSExportPlugin.php @@ -0,0 +1,142 @@ +server = $server; + $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90); + + } + + /** + * 'beforeMethod' event handles. This event handles intercepts GET requests ending + * with ?export + * + * @param string $method + * @param string $uri + * @return bool + */ + public function beforeMethod($method, $uri) { + + if ($method!='GET') return; + if ($this->server->httpRequest->getQueryString()!='export') return; + + // splitting uri + list($uri) = explode('?',$uri,2); + + $node = $this->server->tree->getNodeForPath($uri); + + if (!($node instanceof Calendar)) return; + + // Checking ACL, if available. + if ($aclPlugin = $this->server->getPlugin('acl')) { + $aclPlugin->checkPrivileges($uri, '{DAV:}read'); + } + + $this->server->httpResponse->setHeader('Content-Type','text/calendar'); + $this->server->httpResponse->sendStatus(200); + + $nodes = $this->server->getPropertiesForPath($uri, array( + '{' . Plugin::NS_CALDAV . '}calendar-data', + ),1); + + $this->server->httpResponse->sendBody($this->generateICS($nodes)); + + // Returning false to break the event chain + return false; + + } + + /** + * Merges all calendar objects, and builds one big ics export + * + * @param array $nodes + * @return string + */ + public function generateICS(array $nodes) { + + $calendar = new VObject\Component\VCalendar(); + $calendar->version = '2.0'; + if (DAV\Server::$exposeVersion) { + $calendar->prodid = '-//SabreDAV//SabreDAV ' . DAV\Version::VERSION . '//EN'; + } else { + $calendar->prodid = '-//SabreDAV//SabreDAV//EN'; + } + $calendar->calscale = 'GREGORIAN'; + + $collectedTimezones = array(); + + $timezones = array(); + $objects = array(); + + foreach($nodes as $node) { + + if (!isset($node[200]['{' . Plugin::NS_CALDAV . '}calendar-data'])) { + continue; + } + $nodeData = $node[200]['{' . Plugin::NS_CALDAV . '}calendar-data']; + + $nodeComp = VObject\Reader::read($nodeData); + + foreach($nodeComp->children() as $child) { + + switch($child->name) { + case 'VEVENT' : + case 'VTODO' : + case 'VJOURNAL' : + $objects[] = $child; + break; + + // VTIMEZONE is special, because we need to filter out the duplicates + case 'VTIMEZONE' : + // Naively just checking tzid. + if (in_array((string)$child->TZID, $collectedTimezones)) continue; + + $timezones[] = $child; + $collectedTimezones[] = $child->TZID; + break; + + } + + } + + } + + foreach($timezones as $tz) $calendar->add($tz); + foreach($objects as $obj) $calendar->add($obj); + + return $calendar->serialize(); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ICalendar.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ICalendar.php new file mode 100755 index 00000000..e6de95b5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ICalendar.php @@ -0,0 +1,36 @@ +caldavBackend = $caldavBackend; + $this->principalUri = $principalUri; + + } + + /** + * Returns all notifications for a principal + * + * @return array + */ + public function getChildren() { + + $children = array(); + $notifications = $this->caldavBackend->getNotificationsForPrincipal($this->principalUri); + + foreach($notifications as $notification) { + + $children[] = new Node( + $this->caldavBackend, + $this->principalUri, + $notification + ); + } + + return $children; + + } + + /** + * Returns the name of this object + * + * @return string + */ + public function getName() { + + return 'notifications'; + + } + + /** + * Returns the owner principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getOwner() { + + return $this->principalUri; + + } + + /** + * Returns a group principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getGroup() { + + return null; + + } + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + return array( + array( + 'principal' => $this->getOwner(), + 'privilege' => '{DAV:}read', + 'protected' => true, + ), + array( + 'principal' => $this->getOwner(), + 'privilege' => '{DAV:}write', + 'protected' => true, + ) + ); + + } + + /** + * Updates the ACL + * + * This method will receive a list of new ACE's as an array argument. + * + * @param array $acl + * @return void + */ + public function setACL(array $acl) { + + throw new DAV\Exception\NotImplemented('Updating ACLs is not implemented here'); + + } + + /** + * Returns the list of supported privileges for this node. + * + * The returned data structure is a list of nested privileges. + * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple + * standard structure. + * + * If null is returned from this method, the default privilege set is used, + * which is fine for most common usecases. + * + * @return array|null + */ + public function getSupportedPrivilegeSet() { + + return null; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/ICollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/ICollection.php new file mode 100755 index 00000000..f145f388 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/ICollection.php @@ -0,0 +1,24 @@ +caldavBackend = $caldavBackend; + $this->principalUri = $principalUri; + $this->notification = $notification; + + } + + /** + * Returns the path name for this notification + * + * @return id + */ + public function getName() { + + return $this->notification->getId() . '.xml'; + + } + + /** + * Returns the etag for the notification. + * + * The etag must be surrounded by litteral double-quotes. + * + * @return string + */ + public function getETag() { + + return $this->notification->getETag(); + + } + + /** + * This method must return an xml element, using the + * SabreForRainLoop\CalDAV\Notifications\INotificationType classes. + * + * @return INotificationType + */ + public function getNotificationType() { + + return $this->notification; + + } + + /** + * Deletes this notification + * + * @return void + */ + public function delete() { + + $this->caldavBackend->deleteNotification($this->getOwner(), $this->notification); + + } + + /** + * Returns the owner principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getOwner() { + + return $this->principalUri; + + } + + /** + * Returns a group principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getGroup() { + + return null; + + } + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + return array( + array( + 'principal' => $this->getOwner(), + 'privilege' => '{DAV:}read', + 'protected' => true, + ), + array( + 'principal' => $this->getOwner(), + 'privilege' => '{DAV:}write', + 'protected' => true, + ) + ); + + } + + /** + * Updates the ACL + * + * This method will receive a list of new ACE's as an array argument. + * + * @param array $acl + * @return void + */ + public function setACL(array $acl) { + + throw new DAV\Exception\NotImplemented('Updating ACLs is not implemented here'); + + } + + /** + * Returns the list of supported privileges for this node. + * + * The returned data structure is a list of nested privileges. + * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple + * standard structure. + * + * If null is returned from this method, the default privilege set is used, + * which is fine for most common usecases. + * + * @return array|null + */ + public function getSupportedPrivilegeSet() { + + return null; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/Invite.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/Invite.php new file mode 100755 index 00000000..26237550 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/Invite.php @@ -0,0 +1,324 @@ +$value) { + if (!property_exists($this, $key)) { + throw new \InvalidArgumentException('Unknown option: ' . $key); + } + $this->$key = $value; + } + + } + + /** + * Serializes the notification as a single property. + * + * You should usually just encode the single top-level element of the + * notification. + * + * @param DAV\Server $server + * @param \DOMElement $node + * @return void + */ + public function serialize(DAV\Server $server, \DOMElement $node) { + + $prop = $node->ownerDocument->createElement('cs:invite-notification'); + $node->appendChild($prop); + + } + + /** + * This method serializes the entire notification, as it is used in the + * response body. + * + * @param DAV\Server $server + * @param \DOMElement $node + * @return void + */ + public function serializeBody(DAV\Server $server, \DOMElement $node) { + + $doc = $node->ownerDocument; + + $dt = $doc->createElement('cs:dtstamp'); + $this->dtStamp->setTimezone(new \DateTimezone('GMT')); + $dt->appendChild($doc->createTextNode($this->dtStamp->format('Ymd\\THis\\Z'))); + $node->appendChild($dt); + + $prop = $doc->createElement('cs:invite-notification'); + $node->appendChild($prop); + + $uid = $doc->createElement('cs:uid'); + $uid->appendChild( $doc->createTextNode($this->id) ); + $prop->appendChild($uid); + + $href = $doc->createElement('d:href'); + $href->appendChild( $doc->createTextNode( $this->href ) ); + $prop->appendChild($href); + + $nodeName = null; + switch($this->type) { + + case SharingPlugin::STATUS_ACCEPTED : + $nodeName = 'cs:invite-accepted'; + break; + case SharingPlugin::STATUS_DECLINED : + $nodeName = 'cs:invite-declined'; + break; + case SharingPlugin::STATUS_DELETED : + $nodeName = 'cs:invite-deleted'; + break; + case SharingPlugin::STATUS_NORESPONSE : + $nodeName = 'cs:invite-noresponse'; + break; + + } + $prop->appendChild( + $doc->createElement($nodeName) + ); + $hostHref = $doc->createElement('d:href', $server->getBaseUri() . $this->hostUrl); + $hostUrl = $doc->createElement('cs:hosturl'); + $hostUrl->appendChild($hostHref); + $prop->appendChild($hostUrl); + + $access = $doc->createElement('cs:access'); + if ($this->readOnly) { + $access->appendChild($doc->createElement('cs:read')); + } else { + $access->appendChild($doc->createElement('cs:read-write')); + } + $prop->appendChild($access); + + $organizerUrl = $doc->createElement('cs:organizer'); + // If the organizer contains a 'mailto:' part, it means it should be + // treated as absolute. + if (strtolower(substr($this->organizer,0,7))==='mailto:') { + $organizerHref = new DAV\Property\Href($this->organizer, false); + } else { + $organizerHref = new DAV\Property\Href($this->organizer, true); + } + $organizerHref->serialize($server, $organizerUrl); + + if ($this->commonName) { + $commonName = $doc->createElement('cs:common-name'); + $commonName->appendChild($doc->createTextNode($this->commonName)); + $organizerUrl->appendChild($commonName); + + $commonNameOld = $doc->createElement('cs:organizer-cn'); + $commonNameOld->appendChild($doc->createTextNode($this->commonName)); + $prop->appendChild($commonNameOld); + + } + if ($this->firstName) { + $firstName = $doc->createElement('cs:first-name'); + $firstName->appendChild($doc->createTextNode($this->firstName)); + $organizerUrl->appendChild($firstName); + + $firstNameOld = $doc->createElement('cs:organizer-first'); + $firstNameOld->appendChild($doc->createTextNode($this->firstName)); + $prop->appendChild($firstNameOld); + } + if ($this->lastName) { + $lastName = $doc->createElement('cs:last-name'); + $lastName->appendChild($doc->createTextNode($this->lastName)); + $organizerUrl->appendChild($lastName); + + $lastNameOld = $doc->createElement('cs:organizer-last'); + $lastNameOld->appendChild($doc->createTextNode($this->lastName)); + $prop->appendChild($lastNameOld); + } + $prop->appendChild($organizerUrl); + + if ($this->summary) { + $summary = $doc->createElement('cs:summary'); + $summary->appendChild($doc->createTextNode($this->summary)); + $prop->appendChild($summary); + } + if ($this->supportedComponents) { + + $xcomp = $doc->createElement('cal:supported-calendar-component-set'); + $this->supportedComponents->serialize($server, $xcomp); + $prop->appendChild($xcomp); + + } + + } + + /** + * Returns a unique id for this notification + * + * This is just the base url. This should generally be some kind of unique + * id. + * + * @return string + */ + public function getId() { + + return $this->id; + + } + + /** + * Returns the ETag for this notification. + * + * The ETag must be surrounded by literal double-quotes. + * + * @return string + */ + public function getETag() { + + return $this->etag; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/InviteReply.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/InviteReply.php new file mode 100755 index 00000000..3964c940 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/InviteReply.php @@ -0,0 +1,218 @@ +$value) { + if (!property_exists($this, $key)) { + throw new \InvalidArgumentException('Unknown option: ' . $key); + } + $this->$key = $value; + } + + } + + /** + * Serializes the notification as a single property. + * + * You should usually just encode the single top-level element of the + * notification. + * + * @param DAV\Server $server + * @param \DOMElement $node + * @return void + */ + public function serialize(DAV\Server $server, \DOMElement $node) { + + $prop = $node->ownerDocument->createElement('cs:invite-reply'); + $node->appendChild($prop); + + } + + /** + * This method serializes the entire notification, as it is used in the + * response body. + * + * @param DAV\Server $server + * @param \DOMElement $node + * @return void + */ + public function serializeBody(DAV\Server $server, \DOMElement $node) { + + $doc = $node->ownerDocument; + + $dt = $doc->createElement('cs:dtstamp'); + $this->dtStamp->setTimezone(new \DateTimezone('GMT')); + $dt->appendChild($doc->createTextNode($this->dtStamp->format('Ymd\\THis\\Z'))); + $node->appendChild($dt); + + $prop = $doc->createElement('cs:invite-reply'); + $node->appendChild($prop); + + $uid = $doc->createElement('cs:uid'); + $uid->appendChild($doc->createTextNode($this->id)); + $prop->appendChild($uid); + + $inReplyTo = $doc->createElement('cs:in-reply-to'); + $inReplyTo->appendChild( $doc->createTextNode($this->inReplyTo) ); + $prop->appendChild($inReplyTo); + + $href = $doc->createElement('d:href'); + $href->appendChild( $doc->createTextNode($this->href) ); + $prop->appendChild($href); + + $nodeName = null; + switch($this->type) { + + case SharingPlugin::STATUS_ACCEPTED : + $nodeName = 'cs:invite-accepted'; + break; + case SharingPlugin::STATUS_DECLINED : + $nodeName = 'cs:invite-declined'; + break; + + } + $prop->appendChild( + $doc->createElement($nodeName) + ); + $hostHref = $doc->createElement('d:href', $server->getBaseUri() . $this->hostUrl); + $hostUrl = $doc->createElement('cs:hosturl'); + $hostUrl->appendChild($hostHref); + $prop->appendChild($hostUrl); + + if ($this->summary) { + $summary = $doc->createElement('cs:summary'); + $summary->appendChild($doc->createTextNode($this->summary)); + $prop->appendChild($summary); + } + + } + + /** + * Returns a unique id for this notification + * + * This is just the base url. This should generally be some kind of unique + * id. + * + * @return string + */ + public function getId() { + + return $this->id; + + } + + /** + * Returns the ETag for this notification. + * + * The ETag must be surrounded by literal double-quotes. + * + * @return string + */ + public function getETag() { + + return $this->etag; + + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/SystemStatus.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/SystemStatus.php new file mode 100755 index 00000000..dfe571a5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/SystemStatus.php @@ -0,0 +1,182 @@ +id = $id; + $this->type = $type; + $this->description = $description; + $this->href = $href; + $this->etag = $etag; + + } + + /** + * Serializes the notification as a single property. + * + * You should usually just encode the single top-level element of the + * notification. + * + * @param DAV\Server $server + * @param \DOMElement $node + * @return void + */ + public function serialize(DAV\Server $server, \DOMElement $node) { + + switch($this->type) { + case self::TYPE_LOW : + $type = 'low'; + break; + case self::TYPE_MEDIUM : + $type = 'medium'; + break; + default : + case self::TYPE_HIGH : + $type = 'high'; + break; + } + + $prop = $node->ownerDocument->createElement('cs:systemstatus'); + $prop->setAttribute('type', $type); + + $node->appendChild($prop); + + } + + /** + * This method serializes the entire notification, as it is used in the + * response body. + * + * @param DAV\Server $server + * @param \DOMElement $node + * @return void + */ + public function serializeBody(DAV\Server $server, \DOMElement $node) { + + switch($this->type) { + case self::TYPE_LOW : + $type = 'low'; + break; + case self::TYPE_MEDIUM : + $type = 'medium'; + break; + default : + case self::TYPE_HIGH : + $type = 'high'; + break; + } + + $prop = $node->ownerDocument->createElement('cs:systemstatus'); + $prop->setAttribute('type', $type); + + if ($this->description) { + $text = $node->ownerDocument->createTextNode($this->description); + $desc = $node->ownerDocument->createElement('cs:description'); + $desc->appendChild($text); + $prop->appendChild($desc); + } + if ($this->href) { + $text = $node->ownerDocument->createTextNode($this->href); + $href = $node->ownerDocument->createElement('d:href'); + $href->appendChild($text); + $prop->appendChild($href); + } + + $node->appendChild($prop); + + } + + /** + * Returns a unique id for this notification + * + * This is just the base url. This should generally be some kind of unique + * id. + * + * @return string + */ + public function getId() { + + return $this->id; + + } + + /* + * Returns the ETag for this notification. + * + * The ETag must be surrounded by literal double-quotes. + * + * @return string + */ + public function getETag() { + + return $this->etag; + + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Plugin.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Plugin.php new file mode 100755 index 00000000..9ed56955 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Plugin.php @@ -0,0 +1,1338 @@ +imipHandler = $imipHandler; + + } + + /** + * Use this method to tell the server this plugin defines additional + * HTTP methods. + * + * This method is passed a uri. It should only return HTTP methods that are + * available for the specified uri. + * + * @param string $uri + * @return array + */ + public function getHTTPMethods($uri) { + + // The MKCALENDAR is only available on unmapped uri's, whose + // parents extend IExtendedCollection + list($parent, $name) = DAV\URLUtil::splitPath($uri); + + $node = $this->server->tree->getNodeForPath($parent); + + if ($node instanceof DAV\IExtendedCollection) { + try { + $node->getChild($name); + } catch (DAV\Exception\NotFound $e) { + return array('MKCALENDAR'); + } + } + return array(); + + } + + /** + * Returns a list of features for the DAV: HTTP header. + * + * @return array + */ + public function getFeatures() { + + return array('calendar-access', 'calendar-proxy'); + + } + + /** + * Returns a plugin name. + * + * Using this name other plugins will be able to access other plugins + * using DAV\Server::getPlugin + * + * @return string + */ + public function getPluginName() { + + return 'caldav'; + + } + + /** + * Returns a list of reports this plugin supports. + * + * This will be used in the {DAV:}supported-report-set property. + * Note that you still need to subscribe to the 'report' event to actually + * implement them + * + * @param string $uri + * @return array + */ + public function getSupportedReportSet($uri) { + + $node = $this->server->tree->getNodeForPath($uri); + + $reports = array(); + if ($node instanceof ICalendar || $node instanceof ICalendarObject) { + $reports[] = '{' . self::NS_CALDAV . '}calendar-multiget'; + $reports[] = '{' . self::NS_CALDAV . '}calendar-query'; + } + if ($node instanceof ICalendar) { + $reports[] = '{' . self::NS_CALDAV . '}free-busy-query'; + } + return $reports; + + } + + /** + * Initializes the plugin + * + * @param DAV\Server $server + * @return void + */ + public function initialize(DAV\Server $server) { + + $this->server = $server; + + $server->subscribeEvent('unknownMethod',array($this,'unknownMethod')); + //$server->subscribeEvent('unknownMethod',array($this,'unknownMethod2'),1000); + $server->subscribeEvent('report',array($this,'report')); + $server->subscribeEvent('beforeGetProperties',array($this,'beforeGetProperties')); + $server->subscribeEvent('onHTMLActionsPanel', array($this,'htmlActionsPanel')); + $server->subscribeEvent('onBrowserPostAction', array($this,'browserPostAction')); + $server->subscribeEvent('beforeWriteContent', array($this, 'beforeWriteContent')); + $server->subscribeEvent('beforeCreateFile', array($this, 'beforeCreateFile')); + $server->subscribeEvent('beforeMethod', array($this,'beforeMethod')); + + $server->xmlNamespaces[self::NS_CALDAV] = 'cal'; + $server->xmlNamespaces[self::NS_CALENDARSERVER] = 'cs'; + + $server->propertyMap['{' . self::NS_CALDAV . '}supported-calendar-component-set'] = 'SabreForRainLoop\\CalDAV\\Property\\SupportedCalendarComponentSet'; + $server->propertyMap['{' . self::NS_CALDAV . '}schedule-calendar-transp'] = 'SabreForRainLoop\\CalDAV\\Property\\ScheduleCalendarTransp'; + + $server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\ICalendar'] = '{urn:ietf:params:xml:ns:caldav}calendar'; + $server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\Schedule\\IOutbox'] = '{urn:ietf:params:xml:ns:caldav}schedule-outbox'; + $server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\Principal\\IProxyRead'] = '{http://calendarserver.org/ns/}calendar-proxy-read'; + $server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\Principal\\IProxyWrite'] = '{http://calendarserver.org/ns/}calendar-proxy-write'; + $server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\Notifications\\ICollection'] = '{' . self::NS_CALENDARSERVER . '}notification'; + + array_push($server->protectedProperties, + + '{' . self::NS_CALDAV . '}supported-calendar-component-set', + '{' . self::NS_CALDAV . '}supported-calendar-data', + '{' . self::NS_CALDAV . '}max-resource-size', + '{' . self::NS_CALDAV . '}min-date-time', + '{' . self::NS_CALDAV . '}max-date-time', + '{' . self::NS_CALDAV . '}max-instances', + '{' . self::NS_CALDAV . '}max-attendees-per-instance', + '{' . self::NS_CALDAV . '}calendar-home-set', + '{' . self::NS_CALDAV . '}supported-collation-set', + '{' . self::NS_CALDAV . '}calendar-data', + + // scheduling extension + '{' . self::NS_CALDAV . '}schedule-inbox-URL', + '{' . self::NS_CALDAV . '}schedule-outbox-URL', + '{' . self::NS_CALDAV . '}calendar-user-address-set', + '{' . self::NS_CALDAV . '}calendar-user-type', + + // CalendarServer extensions + '{' . self::NS_CALENDARSERVER . '}getctag', + '{' . self::NS_CALENDARSERVER . '}calendar-proxy-read-for', + '{' . self::NS_CALENDARSERVER . '}calendar-proxy-write-for', + '{' . self::NS_CALENDARSERVER . '}notification-URL', + '{' . self::NS_CALENDARSERVER . '}notificationtype' + + ); + } + + /** + * This function handles support for the MKCALENDAR method + * + * @param string $method + * @param string $uri + * @return bool + */ + public function unknownMethod($method, $uri) { + + switch ($method) { + case 'MKCALENDAR' : + $this->httpMkCalendar($uri); + // false is returned to stop the propagation of the + // unknownMethod event. + return false; + case 'POST' : + + // Checking if this is a text/calendar content type + $contentType = $this->server->httpRequest->getHeader('Content-Type'); + if (strpos($contentType, 'text/calendar')!==0) { + return; + } + + // Checking if we're talking to an outbox + try { + $node = $this->server->tree->getNodeForPath($uri); + } catch (DAV\Exception\NotFound $e) { + return; + } + if (!$node instanceof Schedule\IOutbox) + return; + + $this->outboxRequest($node, $uri); + return false; + + } + + } + + /** + * This functions handles REPORT requests specific to CalDAV + * + * @param string $reportName + * @param \DOMNode $dom + * @return bool + */ + public function report($reportName,$dom) { + + switch($reportName) { + case '{'.self::NS_CALDAV.'}calendar-multiget' : + $this->calendarMultiGetReport($dom); + return false; + case '{'.self::NS_CALDAV.'}calendar-query' : + $this->calendarQueryReport($dom); + return false; + case '{'.self::NS_CALDAV.'}free-busy-query' : + $this->freeBusyQueryReport($dom); + return false; + + } + + + } + + /** + * This function handles the MKCALENDAR HTTP method, which creates + * a new calendar. + * + * @param string $uri + * @return void + */ + public function httpMkCalendar($uri) { + + // Due to unforgivable bugs in iCal, we're completely disabling MKCALENDAR support + // for clients matching iCal in the user agent + //$ua = $this->server->httpRequest->getHeader('User-Agent'); + //if (strpos($ua,'iCal/')!==false) { + // throw new \SabreForRainLoop\DAV\Exception\Forbidden('iCal has major bugs in it\'s RFC3744 support. Therefore we are left with no other choice but disabling this feature.'); + //} + + $body = $this->server->httpRequest->getBody(true); + $properties = array(); + + if ($body) { + + $dom = DAV\XMLUtil::loadDOMDocument($body); + + foreach($dom->firstChild->childNodes as $child) { + + if (DAV\XMLUtil::toClarkNotation($child)!=='{DAV:}set') continue; + foreach(DAV\XMLUtil::parseProperties($child,$this->server->propertyMap) as $k=>$prop) { + $properties[$k] = $prop; + } + + } + } + + $resourceType = array('{DAV:}collection','{urn:ietf:params:xml:ns:caldav}calendar'); + + $this->server->createCollection($uri,$resourceType,$properties); + + $this->server->httpResponse->sendStatus(201); + $this->server->httpResponse->setHeader('Content-Length',0); + } + + /** + * beforeGetProperties + * + * This method handler is invoked before any after properties for a + * resource are fetched. This allows us to add in any CalDAV specific + * properties. + * + * @param string $path + * @param DAV\INode $node + * @param array $requestedProperties + * @param array $returnedProperties + * @return void + */ + public function beforeGetProperties($path, DAV\INode $node, &$requestedProperties, &$returnedProperties) { + + if ($node instanceof DAVACL\IPrincipal) { + + // calendar-home-set property + $calHome = '{' . self::NS_CALDAV . '}calendar-home-set'; + if (in_array($calHome,$requestedProperties)) { + $principalId = $node->getName(); + $calendarHomePath = self::CALENDAR_ROOT . '/' . $principalId . '/'; + + unset($requestedProperties[array_search($calHome, $requestedProperties)]); + $returnedProperties[200][$calHome] = new DAV\Property\Href($calendarHomePath); + + } + + // schedule-outbox-URL property + $scheduleProp = '{' . self::NS_CALDAV . '}schedule-outbox-URL'; + if (in_array($scheduleProp,$requestedProperties)) { + $principalId = $node->getName(); + $outboxPath = self::CALENDAR_ROOT . '/' . $principalId . '/outbox'; + + unset($requestedProperties[array_search($scheduleProp, $requestedProperties)]); + $returnedProperties[200][$scheduleProp] = new DAV\Property\Href($outboxPath); + + } + + // calendar-user-address-set property + $calProp = '{' . self::NS_CALDAV . '}calendar-user-address-set'; + if (in_array($calProp,$requestedProperties)) { + + $addresses = $node->getAlternateUriSet(); + $addresses[] = $this->server->getBaseUri() . DAV\URLUtil::encodePath($node->getPrincipalUrl() . '/'); + unset($requestedProperties[array_search($calProp, $requestedProperties)]); + $returnedProperties[200][$calProp] = new DAV\Property\HrefList($addresses, false); + + } + + // These two properties are shortcuts for ical to easily find + // other principals this principal has access to. + $propRead = '{' . self::NS_CALENDARSERVER . '}calendar-proxy-read-for'; + $propWrite = '{' . self::NS_CALENDARSERVER . '}calendar-proxy-write-for'; + if (in_array($propRead,$requestedProperties) || in_array($propWrite,$requestedProperties)) { + + $aclPlugin = $this->server->getPlugin('acl'); + $membership = $aclPlugin->getPrincipalMembership($path); + $readList = array(); + $writeList = array(); + + foreach($membership as $group) { + + $groupNode = $this->server->tree->getNodeForPath($group); + + // If the node is either ap proxy-read or proxy-write + // group, we grab the parent principal and add it to the + // list. + if ($groupNode instanceof Principal\IProxyRead) { + list($readList[]) = DAV\URLUtil::splitPath($group); + } + if ($groupNode instanceof Principal\IProxyWrite) { + list($writeList[]) = DAV\URLUtil::splitPath($group); + } + + } + if (in_array($propRead,$requestedProperties)) { + unset($requestedProperties[$propRead]); + $returnedProperties[200][$propRead] = new DAV\Property\HrefList($readList); + } + if (in_array($propWrite,$requestedProperties)) { + unset($requestedProperties[$propWrite]); + $returnedProperties[200][$propWrite] = new DAV\Property\HrefList($writeList); + } + + } + + // notification-URL property + $notificationUrl = '{' . self::NS_CALENDARSERVER . '}notification-URL'; + if (($index = array_search($notificationUrl, $requestedProperties)) !== false) { + $principalId = $node->getName(); + $calendarHomePath = 'calendars/' . $principalId . '/notifications/'; + unset($requestedProperties[$index]); + $returnedProperties[200][$notificationUrl] = new DAV\Property\Href($calendarHomePath); + } + + } // instanceof IPrincipal + + if ($node instanceof Notifications\INode) { + + $propertyName = '{' . self::NS_CALENDARSERVER . '}notificationtype'; + if (($index = array_search($propertyName, $requestedProperties)) !== false) { + + $returnedProperties[200][$propertyName] = + $node->getNotificationType(); + + unset($requestedProperties[$index]); + + } + + } // instanceof Notifications_INode + + + if ($node instanceof ICalendarObject) { + // The calendar-data property is not supposed to be a 'real' + // property, but in large chunks of the spec it does act as such. + // Therefore we simply expose it as a property. + $calDataProp = '{' . Plugin::NS_CALDAV . '}calendar-data'; + if (in_array($calDataProp, $requestedProperties)) { + unset($requestedProperties[$calDataProp]); + $val = $node->get(); + if (is_resource($val)) + $val = stream_get_contents($val); + + // Taking out \r to not screw up the xml output + $returnedProperties[200][$calDataProp] = str_replace("\r","", $val); + + } + } + + } + + /** + * This function handles the calendar-multiget REPORT. + * + * This report is used by the client to fetch the content of a series + * of urls. Effectively avoiding a lot of redundant requests. + * + * @param \DOMNode $dom + * @return void + */ + public function calendarMultiGetReport($dom) { + + $properties = array_keys(DAV\XMLUtil::parseProperties($dom->firstChild)); + $hrefElems = $dom->getElementsByTagNameNS('urn:DAV','href'); + + $xpath = new \DOMXPath($dom); + $xpath->registerNameSpace('cal',Plugin::NS_CALDAV); + $xpath->registerNameSpace('dav','urn:DAV'); + + $expand = $xpath->query('/cal:calendar-multiget/dav:prop/cal:calendar-data/cal:expand'); + if ($expand->length>0) { + $expandElem = $expand->item(0); + $start = $expandElem->getAttribute('start'); + $end = $expandElem->getAttribute('end'); + if(!$start || !$end) { + throw new DAV\Exception\BadRequest('The "start" and "end" attributes are required for the CALDAV:expand element'); + } + $start = VObject\DateTimeParser::parseDateTime($start); + $end = VObject\DateTimeParser::parseDateTime($end); + + if ($end <= $start) { + throw new DAV\Exception\BadRequest('The end-date must be larger than the start-date in the expand element.'); + } + + $expand = true; + + } else { + + $expand = false; + + } + + foreach($hrefElems as $elem) { + $uri = $this->server->calculateUri($elem->nodeValue); + list($objProps) = $this->server->getPropertiesForPath($uri,$properties); + + if ($expand && isset($objProps[200]['{' . self::NS_CALDAV . '}calendar-data'])) { + $vObject = VObject\Reader::read($objProps[200]['{' . self::NS_CALDAV . '}calendar-data']); + $vObject->expand($start, $end); + $objProps[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize(); + } + + $propertyList[]=$objProps; + + } + + $prefer = $this->server->getHTTPPRefer(); + + $this->server->httpResponse->sendStatus(207); + $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); + $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); + $this->server->httpResponse->sendBody($this->server->generateMultiStatus($propertyList, $prefer['return-minimal'])); + + } + + /** + * This function handles the calendar-query REPORT + * + * This report is used by clients to request calendar objects based on + * complex conditions. + * + * @param \DOMNode $dom + * @return void + */ + public function calendarQueryReport($dom) { + + $parser = new CalendarQueryParser($dom); + $parser->parse(); + + $node = $this->server->tree->getNodeForPath($this->server->getRequestUri()); + $depth = $this->server->getHTTPDepth(0); + + // The default result is an empty array + $result = array(); + + // The calendarobject was requested directly. In this case we handle + // this locally. + if ($depth == 0 && $node instanceof ICalendarObject) { + + $requestedCalendarData = true; + $requestedProperties = $parser->requestedProperties; + + if (!in_array('{urn:ietf:params:xml:ns:caldav}calendar-data', $requestedProperties)) { + + // We always retrieve calendar-data, as we need it for filtering. + $requestedProperties[] = '{urn:ietf:params:xml:ns:caldav}calendar-data'; + + // If calendar-data wasn't explicitly requested, we need to remove + // it after processing. + $requestedCalendarData = false; + } + + $properties = $this->server->getPropertiesForPath( + $this->server->getRequestUri(), + $requestedProperties, + 0 + ); + + // This array should have only 1 element, the first calendar + // object. + $properties = current($properties); + + // If there wasn't any calendar-data returned somehow, we ignore + // this. + if (isset($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data'])) { + + $validator = new CalendarQueryValidator(); + + $vObject = VObject\Reader::read($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']); + if ($validator->validate($vObject,$parser->filters)) { + + // If the client didn't require the calendar-data property, + // we won't give it back. + if (!$requestedCalendarData) { + unset($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']); + } else { + if ($parser->expand) { + $vObject->expand($parser->expand['start'], $parser->expand['end']); + $properties[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize(); + } + } + + $result = array($properties); + + } + + } + + } + // If we're dealing with a calendar, the calendar itself is responsible + // for the calendar-query. + if ($node instanceof ICalendar && $depth = 1) { + + $nodePaths = $node->calendarQuery($parser->filters); + + foreach($nodePaths as $path) { + + list($properties) = + $this->server->getPropertiesForPath($this->server->getRequestUri() . '/' . $path, $parser->requestedProperties); + + if ($parser->expand) { + // We need to do some post-processing + $vObject = VObject\Reader::read($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']); + $vObject->expand($parser->expand['start'], $parser->expand['end']); + $properties[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize(); + } + + $result[] = $properties; + + } + + } + + $prefer = $this->server->getHTTPPRefer(); + + $this->server->httpResponse->sendStatus(207); + $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); + $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); + $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result, $prefer['return-minimal'])); + + } + + /** + * This method is responsible for parsing the request and generating the + * response for the CALDAV:free-busy-query REPORT. + * + * @param \DOMNode $dom + * @return void + */ + protected function freeBusyQueryReport(\DOMNode $dom) { + + $start = null; + $end = null; + + foreach($dom->firstChild->childNodes as $childNode) { + + $clark = DAV\XMLUtil::toClarkNotation($childNode); + if ($clark == '{' . self::NS_CALDAV . '}time-range') { + $start = $childNode->getAttribute('start'); + $end = $childNode->getAttribute('end'); + break; + } + + } + if ($start) { + $start = VObject\DateTimeParser::parseDateTime($start); + } + if ($end) { + $end = VObject\DateTimeParser::parseDateTime($end); + } + + if (!$start && !$end) { + throw new DAV\Exception\BadRequest('The freebusy report must have a time-range filter'); + } + $acl = $this->server->getPlugin('acl'); + + if (!$acl) { + throw new DAV\Exception('The ACL plugin must be loaded for free-busy queries to work'); + } + $uri = $this->server->getRequestUri(); + $acl->checkPrivileges($uri,'{' . self::NS_CALDAV . '}read-free-busy'); + + $calendar = $this->server->tree->getNodeForPath($uri); + if (!$calendar instanceof ICalendar) { + throw new DAV\Exception\NotImplemented('The free-busy-query REPORT is only implemented on calendars'); + } + + // Doing a calendar-query first, to make sure we get the most + // performance. + $urls = $calendar->calendarQuery(array( + 'name' => 'VCALENDAR', + 'comp-filters' => array( + array( + 'name' => 'VEVENT', + 'comp-filters' => array(), + 'prop-filters' => array(), + 'is-not-defined' => false, + 'time-range' => array( + 'start' => $start, + 'end' => $end, + ), + ), + ), + 'prop-filters' => array(), + 'is-not-defined' => false, + 'time-range' => null, + )); + + $objects = array_map(function($url) use ($calendar) { + $obj = $calendar->getChild($url)->get(); + return $obj; + }, $urls); + + $generator = new VObject\FreeBusyGenerator(); + $generator->setObjects($objects); + $generator->setTimeRange($start, $end); + $result = $generator->getResult(); + $result = $result->serialize(); + + $this->server->httpResponse->sendStatus(200); + $this->server->httpResponse->setHeader('Content-Type', 'text/calendar'); + $this->server->httpResponse->setHeader('Content-Length', strlen($result)); + $this->server->httpResponse->sendBody($result); + + } + + /** + * This method is triggered before a file gets updated with new content. + * + * This plugin uses this method to ensure that CalDAV objects receive + * valid calendar data. + * + * @param string $path + * @param DAV\IFile $node + * @param resource $data + * @return void + */ + public function beforeWriteContent($path, DAV\IFile $node, &$data) { + + if (!$node instanceof ICalendarObject) + return; + + $this->validateICalendar($data, $path); + + } + + /** + * This method is triggered before a new file is created. + * + * This plugin uses this method to ensure that newly created calendar + * objects contain valid calendar data. + * + * @param string $path + * @param resource $data + * @param DAV\ICollection $parentNode + * @return void + */ + public function beforeCreateFile($path, &$data, DAV\ICollection $parentNode) { + + if (!$parentNode instanceof Calendar) + return; + + $this->validateICalendar($data, $path); + + } + + /** + * This event is triggered before any HTTP request is handled. + * + * We use this to intercept GET calls to notification nodes, and return the + * proper response. + * + * @param string $method + * @param string $path + * @return void + */ + public function beforeMethod($method, $path) { + + if ($method!=='GET') return; + + try { + $node = $this->server->tree->getNodeForPath($path); + } catch (DAV\Exception\NotFound $e) { + return; + } + + if (!$node instanceof Notifications\INode) + return; + + if (!$this->server->checkPreconditions(true)) return false; + $dom = new \DOMDocument('1.0', 'UTF-8'); + + $dom->formatOutput = true; + + $root = $dom->createElement('cs:notification'); + foreach($this->server->xmlNamespaces as $namespace => $prefix) { + $root->setAttribute('xmlns:' . $prefix, $namespace); + } + + $dom->appendChild($root); + $node->getNotificationType()->serializeBody($this->server, $root); + + $this->server->httpResponse->setHeader('Content-Type','application/xml'); + $this->server->httpResponse->setHeader('ETag',$node->getETag()); + $this->server->httpResponse->sendStatus(200); + $this->server->httpResponse->sendBody($dom->saveXML()); + + return false; + + } + + /** + * Checks if the submitted iCalendar data is in fact, valid. + * + * An exception is thrown if it's not. + * + * @param resource|string $data + * @param string $path + * @return void + */ + protected function validateICalendar(&$data, $path) { + + // If it's a stream, we convert it to a string first. + if (is_resource($data)) { + $data = stream_get_contents($data); + } + + // Converting the data to unicode, if needed. + $data = DAV\StringUtil::ensureUTF8($data); + + try { + + $vobj = VObject\Reader::read($data); + + } catch (VObject\ParseException $e) { + + throw new DAV\Exception\UnsupportedMediaType('This resource only supports valid iCalendar 2.0 data. Parse error: ' . $e->getMessage()); + + } + + if ($vobj->name !== 'VCALENDAR') { + throw new DAV\Exception\UnsupportedMediaType('This collection can only support iCalendar objects.'); + } + + // Get the Supported Components for the target calendar + list($parentPath,$object) = DAV\URLUtil::splitPath($path); + $calendarProperties = $this->server->getProperties($parentPath,array('{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set')); + $supportedComponents = $calendarProperties['{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set']->getValue(); + + $foundType = null; + $foundUID = null; + foreach($vobj->getComponents() as $component) { + switch($component->name) { + case 'VTIMEZONE' : + continue 2; + case 'VEVENT' : + case 'VTODO' : + case 'VJOURNAL' : + if (is_null($foundType)) { + $foundType = $component->name; + if (!in_array($foundType, $supportedComponents)) { + throw new Exception\InvalidComponentType('This calendar only supports ' . implode(', ', $supportedComponents) . '. We found a ' . $foundType); + } + if (!isset($component->UID)) { + throw new DAV\Exception\BadRequest('Every ' . $component->name . ' component must have an UID'); + } + $foundUID = (string)$component->UID; + } else { + if ($foundType !== $component->name) { + throw new DAV\Exception\BadRequest('A calendar object must only contain 1 component. We found a ' . $component->name . ' as well as a ' . $foundType); + } + if ($foundUID !== (string)$component->UID) { + throw new DAV\Exception\BadRequest('Every ' . $component->name . ' in this object must have identical UIDs'); + } + } + break; + default : + throw new DAV\Exception\BadRequest('You are not allowed to create components of type: ' . $component->name . ' here'); + + } + } + if (!$foundType) + throw new DAV\Exception\BadRequest('iCalendar object must contain at least 1 of VEVENT, VTODO or VJOURNAL'); + + } + + /** + * This method handles POST requests to the schedule-outbox. + * + * Currently, two types of requests are support: + * * FREEBUSY requests from RFC 6638 + * * Simple iTIP messages from draft-desruisseaux-caldav-sched-04 + * + * The latter is from an expired early draft of the CalDAV scheduling + * extensions, but iCal depends on a feature from that spec, so we + * implement it. + * + * @param Schedule\IOutbox $outboxNode + * @param string $outboxUri + * @return void + */ + public function outboxRequest(Schedule\IOutbox $outboxNode, $outboxUri) { + + // Parsing the request body + try { + $vObject = VObject\Reader::read($this->server->httpRequest->getBody(true)); + } catch (VObject\ParseException $e) { + throw new DAV\Exception\BadRequest('The request body must be a valid iCalendar object. Parse error: ' . $e->getMessage()); + } + + // The incoming iCalendar object must have a METHOD property, and a + // component. The combination of both determines what type of request + // this is. + $componentType = null; + foreach($vObject->getComponents() as $component) { + if ($component->name !== 'VTIMEZONE') { + $componentType = $component->name; + break; + } + } + if (is_null($componentType)) { + throw new DAV\Exception\BadRequest('We expected at least one VTODO, VJOURNAL, VFREEBUSY or VEVENT component'); + } + + // Validating the METHOD + $method = strtoupper((string)$vObject->METHOD); + if (!$method) { + throw new DAV\Exception\BadRequest('A METHOD property must be specified in iTIP messages'); + } + + // So we support two types of requests: + // + // REQUEST with a VFREEBUSY component + // REQUEST, REPLY, ADD, CANCEL on VEVENT components + + $acl = $this->server->getPlugin('acl'); + + if ($componentType === 'VFREEBUSY' && $method === 'REQUEST') { + + $acl && $acl->checkPrivileges($outboxUri,'{' . Plugin::NS_CALDAV . '}schedule-query-freebusy'); + $this->handleFreeBusyRequest($outboxNode, $vObject); + + } elseif ($componentType === 'VEVENT' && in_array($method, array('REQUEST','REPLY','ADD','CANCEL'))) { + + $acl && $acl->checkPrivileges($outboxUri,'{' . Plugin::NS_CALDAV . '}schedule-post-vevent'); + $this->handleEventNotification($outboxNode, $vObject); + + } else { + + throw new DAV\Exception\NotImplemented('SabreDAV supports only VFREEBUSY (REQUEST) and VEVENT (REQUEST, REPLY, ADD, CANCEL)'); + + } + + } + + /** + * This method handles the REQUEST, REPLY, ADD and CANCEL methods for + * VEVENT iTip messages. + * + * @return void + */ + protected function handleEventNotification(Schedule\IOutbox $outboxNode, VObject\Component $vObject) { + + $originator = $this->server->httpRequest->getHeader('Originator'); + $recipients = $this->server->httpRequest->getHeader('Recipient'); + + if (!$originator) { + throw new DAV\Exception\BadRequest('The Originator: header must be specified when making POST requests'); + } + if (!$recipients) { + throw new DAV\Exception\BadRequest('The Recipient: header must be specified when making POST requests'); + } + + $recipients = explode(',',$recipients); + foreach($recipients as $k=>$recipient) { + + $recipient = trim($recipient); + if (!preg_match('/^mailto:(.*)@(.*)$/i', $recipient)) { + throw new DAV\Exception\BadRequest('Recipients must start with mailto: and must be valid email address'); + } + $recipient = substr($recipient, 7); + $recipients[$k] = $recipient; + } + + // We need to make sure that 'originator' matches one of the email + // addresses of the selected principal. + $principal = $outboxNode->getOwner(); + $props = $this->server->getProperties($principal,array( + '{' . self::NS_CALDAV . '}calendar-user-address-set', + )); + + $addresses = array(); + if (isset($props['{' . self::NS_CALDAV . '}calendar-user-address-set'])) { + $addresses = $props['{' . self::NS_CALDAV . '}calendar-user-address-set']->getHrefs(); + } + + $found = false; + foreach($addresses as $address) { + + // Trimming the / on both sides, just in case.. + if (rtrim(strtolower($originator),'/') === rtrim(strtolower($address),'/')) { + $found = true; + break; + } + + } + + if (!$found) { + throw new DAV\Exception\Forbidden('The addresses specified in the Originator header did not match any addresses in the owners calendar-user-address-set header'); + } + + // If the Originator header was a url, and not a mailto: address.. + // we're going to try to pull the mailto: from the vobject body. + if (strtolower(substr($originator,0,7)) !== 'mailto:') { + $originator = (string)$vObject->VEVENT->ORGANIZER; + + } + if (strtolower(substr($originator,0,7)) !== 'mailto:') { + throw new DAV\Exception\Forbidden('Could not find mailto: address in both the Orignator header, and the ORGANIZER property in the VEVENT'); + } + $originator = substr($originator,7); + + $result = $this->iMIPMessage($originator, $recipients, $vObject, $principal); + $this->server->httpResponse->sendStatus(200); + $this->server->httpResponse->setHeader('Content-Type','application/xml'); + $this->server->httpResponse->sendBody($this->generateScheduleResponse($result)); + + } + + /** + * Sends an iMIP message by email. + * + * This method must return an array with status codes per recipient. + * This should look something like: + * + * array( + * 'user1@example.org' => '2.0;Success' + * ) + * + * Formatting for this status code can be found at: + * https://tools.ietf.org/html/rfc5545#section-3.8.8.3 + * + * A list of valid status codes can be found at: + * https://tools.ietf.org/html/rfc5546#section-3.6 + * + * @param string $originator + * @param array $recipients + * @param VObject\Component $vObject + * @param string $principal Principal url + * @return array + */ + protected function iMIPMessage($originator, array $recipients, VObject\Component $vObject, $principal) { + + if (!$this->imipHandler) { + $resultStatus = '5.2;This server does not support this operation'; + } else { + $this->imipHandler->sendMessage($originator, $recipients, $vObject, $principal); + $resultStatus = '2.0;Success'; + } + + $result = array(); + foreach($recipients as $recipient) { + $result[$recipient] = $resultStatus; + } + + return $result; + + } + + /** + * Generates a schedule-response XML body + * + * The recipients array is a key->value list, containing email addresses + * and iTip status codes. See the iMIPMessage method for a description of + * the value. + * + * @param array $recipients + * @return string + */ + public function generateScheduleResponse(array $recipients) { + + $dom = new \DOMDocument('1.0','utf-8'); + $dom->formatOutput = true; + $xscheduleResponse = $dom->createElement('cal:schedule-response'); + $dom->appendChild($xscheduleResponse); + + foreach($this->server->xmlNamespaces as $namespace=>$prefix) { + + $xscheduleResponse->setAttribute('xmlns:' . $prefix, $namespace); + + } + + foreach($recipients as $recipient=>$status) { + $xresponse = $dom->createElement('cal:response'); + + $xrecipient = $dom->createElement('cal:recipient'); + $xrecipient->appendChild($dom->createTextNode($recipient)); + $xresponse->appendChild($xrecipient); + + $xrequestStatus = $dom->createElement('cal:request-status'); + $xrequestStatus->appendChild($dom->createTextNode($status)); + $xresponse->appendChild($xrequestStatus); + + $xscheduleResponse->appendChild($xresponse); + + } + + return $dom->saveXML(); + + } + + /** + * This method is responsible for parsing a free-busy query request and + * returning it's result. + * + * @param Schedule\IOutbox $outbox + * @param string $request + * @return string + */ + protected function handleFreeBusyRequest(Schedule\IOutbox $outbox, VObject\Component $vObject) { + + $vFreeBusy = $vObject->VFREEBUSY; + $organizer = $vFreeBusy->organizer; + + $organizer = (string)$organizer; + + // Validating if the organizer matches the owner of the inbox. + $owner = $outbox->getOwner(); + + $caldavNS = '{' . Plugin::NS_CALDAV . '}'; + + $uas = $caldavNS . 'calendar-user-address-set'; + $props = $this->server->getProperties($owner,array($uas)); + + if (empty($props[$uas]) || !in_array($organizer, $props[$uas]->getHrefs())) { + throw new DAV\Exception\Forbidden('The organizer in the request did not match any of the addresses for the owner of this inbox'); + } + + if (!isset($vFreeBusy->ATTENDEE)) { + throw new DAV\Exception\BadRequest('You must at least specify 1 attendee'); + } + + $attendees = array(); + foreach($vFreeBusy->ATTENDEE as $attendee) { + $attendees[]= (string)$attendee; + } + + + if (!isset($vFreeBusy->DTSTART) || !isset($vFreeBusy->DTEND)) { + throw new DAV\Exception\BadRequest('DTSTART and DTEND must both be specified'); + } + + $startRange = $vFreeBusy->DTSTART->getDateTime(); + $endRange = $vFreeBusy->DTEND->getDateTime(); + + $results = array(); + foreach($attendees as $attendee) { + $results[] = $this->getFreeBusyForEmail($attendee, $startRange, $endRange, $vObject); + } + + $dom = new \DOMDocument('1.0','utf-8'); + $dom->formatOutput = true; + $scheduleResponse = $dom->createElement('cal:schedule-response'); + foreach($this->server->xmlNamespaces as $namespace=>$prefix) { + + $scheduleResponse->setAttribute('xmlns:' . $prefix,$namespace); + + } + $dom->appendChild($scheduleResponse); + + foreach($results as $result) { + $response = $dom->createElement('cal:response'); + + $recipient = $dom->createElement('cal:recipient'); + $recipientHref = $dom->createElement('d:href'); + + $recipientHref->appendChild($dom->createTextNode($result['href'])); + $recipient->appendChild($recipientHref); + $response->appendChild($recipient); + + $reqStatus = $dom->createElement('cal:request-status'); + $reqStatus->appendChild($dom->createTextNode($result['request-status'])); + $response->appendChild($reqStatus); + + if (isset($result['calendar-data'])) { + + $calendardata = $dom->createElement('cal:calendar-data'); + $calendardata->appendChild($dom->createTextNode(str_replace("\r\n","\n",$result['calendar-data']->serialize()))); + $response->appendChild($calendardata); + + } + $scheduleResponse->appendChild($response); + } + + $this->server->httpResponse->sendStatus(200); + $this->server->httpResponse->setHeader('Content-Type','application/xml'); + $this->server->httpResponse->sendBody($dom->saveXML()); + + } + + /** + * Returns free-busy information for a specific address. The returned + * data is an array containing the following properties: + * + * calendar-data : A VFREEBUSY VObject + * request-status : an iTip status code. + * href: The principal's email address, as requested + * + * The following request status codes may be returned: + * * 2.0;description + * * 3.7;description + * + * @param string $email address + * @param \DateTime $start + * @param \DateTime $end + * @param VObject\Component $request + * @return array + */ + protected function getFreeBusyForEmail($email, \DateTime $start, \DateTime $end, VObject\Component $request) { + + $caldavNS = '{' . Plugin::NS_CALDAV . '}'; + + $aclPlugin = $this->server->getPlugin('acl'); + if (substr($email,0,7)==='mailto:') $email = substr($email,7); + + $result = $aclPlugin->principalSearch( + array('{http://sabredav.org/ns}email-address' => $email), + array( + '{DAV:}principal-URL', $caldavNS . 'calendar-home-set', + '{http://sabredav.org/ns}email-address', + ) + ); + + if (!count($result)) { + return array( + 'request-status' => '3.7;Could not find principal', + 'href' => 'mailto:' . $email, + ); + } + + if (!isset($result[0][200][$caldavNS . 'calendar-home-set'])) { + return array( + 'request-status' => '3.7;No calendar-home-set property found', + 'href' => 'mailto:' . $email, + ); + } + $homeSet = $result[0][200][$caldavNS . 'calendar-home-set']->getHref(); + + // Grabbing the calendar list + $objects = array(); + foreach($this->server->tree->getNodeForPath($homeSet)->getChildren() as $node) { + if (!$node instanceof ICalendar) { + continue; + } + $aclPlugin->checkPrivileges($homeSet . $node->getName() ,$caldavNS . 'read-free-busy'); + + // Getting the list of object uris within the time-range + $urls = $node->calendarQuery(array( + 'name' => 'VCALENDAR', + 'comp-filters' => array( + array( + 'name' => 'VEVENT', + 'comp-filters' => array(), + 'prop-filters' => array(), + 'is-not-defined' => false, + 'time-range' => array( + 'start' => $start, + 'end' => $end, + ), + ), + ), + 'prop-filters' => array(), + 'is-not-defined' => false, + 'time-range' => null, + )); + + $calObjects = array_map(function($url) use ($node) { + $obj = $node->getChild($url)->get(); + return $obj; + }, $urls); + + $objects = array_merge($objects,$calObjects); + + } + + $vcalendar = new VObject\Component\VCalendar(); + $vcalendar->VERSION = '2.0'; + $vcalendar->METHOD = 'REPLY'; + $vcalendar->CALSCALE = 'GREGORIAN'; + $vcalendar->PRODID = '-//SabreDAV//SabreDAV ' . DAV\Version::VERSION . '//EN'; + + $generator = new VObject\FreeBusyGenerator(); + $generator->setObjects($objects); + $generator->setTimeRange($start, $end); + $generator->setBaseObject($vcalendar); + + $result = $generator->getResult(); + + $vcalendar->VFREEBUSY->ATTENDEE = 'mailto:' . $email; + $vcalendar->VFREEBUSY->UID = (string)$request->VFREEBUSY->UID; + $vcalendar->VFREEBUSY->ORGANIZER = clone $request->VFREEBUSY->ORGANIZER; + + return array( + 'calendar-data' => $result, + 'request-status' => '2.0;Success', + 'href' => 'mailto:' . $email, + ); + } + + /** + * This method is used to generate HTML output for the + * DAV\Browser\Plugin. This allows us to generate an interface users + * can use to create new calendars. + * + * @param DAV\INode $node + * @param string $output + * @return bool + */ + public function htmlActionsPanel(DAV\INode $node, &$output) { + + if (!$node instanceof UserCalendars) + return; + + $output.= '
+

Create new calendar

+ +
+
+ +
+ '; + + return false; + + } + + /** + * This method allows us to intercept the 'mkcalendar' sabreAction. This + * action enables the user to create new calendars from the browser plugin. + * + * @param string $uri + * @param string $action + * @param array $postVars + * @return bool + */ + public function browserPostAction($uri, $action, array $postVars) { + + if ($action!=='mkcalendar') + return; + + $resourceType = array('{DAV:}collection','{urn:ietf:params:xml:ns:caldav}calendar'); + $properties = array(); + if (isset($postVars['{DAV:}displayname'])) { + $properties['{DAV:}displayname'] = $postVars['{DAV:}displayname']; + } + $this->server->createCollection($uri . '/' . $postVars['name'],$resourceType,$properties); + return false; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/Collection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/Collection.php new file mode 100755 index 00000000..e4559c87 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/Collection.php @@ -0,0 +1,32 @@ +principalBackend, $principalInfo); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/IProxyRead.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/IProxyRead.php new file mode 100755 index 00000000..f2215ebe --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/IProxyRead.php @@ -0,0 +1,19 @@ +principalInfo = $principalInfo; + $this->principalBackend = $principalBackend; + + } + + /** + * Returns this principals name. + * + * @return string + */ + public function getName() { + + return 'calendar-proxy-read'; + + } + + /** + * Returns the last modification time + * + * @return null + */ + public function getLastModified() { + + return null; + + } + + /** + * Deletes the current node + * + * @throws DAV\Exception\Forbidden + * @return void + */ + public function delete() { + + throw new DAV\Exception\Forbidden('Permission denied to delete node'); + + } + + /** + * Renames the node + * + * @throws DAV\Exception\Forbidden + * @param string $name The new name + * @return void + */ + public function setName($name) { + + throw new DAV\Exception\Forbidden('Permission denied to rename file'); + + } + + + /** + * Returns a list of alternative urls for a principal + * + * This can for example be an email address, or ldap url. + * + * @return array + */ + public function getAlternateUriSet() { + + return array(); + + } + + /** + * Returns the full principal url + * + * @return string + */ + public function getPrincipalUrl() { + + return $this->principalInfo['uri'] . '/' . $this->getName(); + + } + + /** + * Returns the list of group members + * + * If this principal is a group, this function should return + * all member principal uri's for the group. + * + * @return array + */ + public function getGroupMemberSet() { + + return $this->principalBackend->getGroupMemberSet($this->getPrincipalUrl()); + + } + + /** + * Returns the list of groups this principal is member of + * + * If this principal is a member of a (list of) groups, this function + * should return a list of principal uri's for it's members. + * + * @return array + */ + public function getGroupMembership() { + + return $this->principalBackend->getGroupMembership($this->getPrincipalUrl()); + + } + + /** + * Sets a list of group members + * + * If this principal is a group, this method sets all the group members. + * The list of members is always overwritten, never appended to. + * + * This method should throw an exception if the members could not be set. + * + * @param array $principals + * @return void + */ + public function setGroupMemberSet(array $principals) { + + $this->principalBackend->setGroupMemberSet($this->getPrincipalUrl(), $principals); + + } + + /** + * Returns the displayname + * + * This should be a human readable name for the principal. + * If none is available, return the nodename. + * + * @return string + */ + public function getDisplayName() { + + return $this->getName(); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/ProxyWrite.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/ProxyWrite.php new file mode 100755 index 00000000..1ebaf6a1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/ProxyWrite.php @@ -0,0 +1,180 @@ +principalInfo = $principalInfo; + $this->principalBackend = $principalBackend; + + } + + /** + * Returns this principals name. + * + * @return string + */ + public function getName() { + + return 'calendar-proxy-write'; + + } + + /** + * Returns the last modification time + * + * @return null + */ + public function getLastModified() { + + return null; + + } + + /** + * Deletes the current node + * + * @throws DAV\Exception\Forbidden + * @return void + */ + public function delete() { + + throw new DAV\Exception\Forbidden('Permission denied to delete node'); + + } + + /** + * Renames the node + * + * @throws DAV\Exception\Forbidden + * @param string $name The new name + * @return void + */ + public function setName($name) { + + throw new DAV\Exception\Forbidden('Permission denied to rename file'); + + } + + + /** + * Returns a list of alternative urls for a principal + * + * This can for example be an email address, or ldap url. + * + * @return array + */ + public function getAlternateUriSet() { + + return array(); + + } + + /** + * Returns the full principal url + * + * @return string + */ + public function getPrincipalUrl() { + + return $this->principalInfo['uri'] . '/' . $this->getName(); + + } + + /** + * Returns the list of group members + * + * If this principal is a group, this function should return + * all member principal uri's for the group. + * + * @return array + */ + public function getGroupMemberSet() { + + return $this->principalBackend->getGroupMemberSet($this->getPrincipalUrl()); + + } + + /** + * Returns the list of groups this principal is member of + * + * If this principal is a member of a (list of) groups, this function + * should return a list of principal uri's for it's members. + * + * @return array + */ + public function getGroupMembership() { + + return $this->principalBackend->getGroupMembership($this->getPrincipalUrl()); + + } + + /** + * Sets a list of group members + * + * If this principal is a group, this method sets all the group members. + * The list of members is always overwritten, never appended to. + * + * This method should throw an exception if the members could not be set. + * + * @param array $principals + * @return void + */ + public function setGroupMemberSet(array $principals) { + + $this->principalBackend->setGroupMemberSet($this->getPrincipalUrl(), $principals); + + } + + /** + * Returns the displayname + * + * This should be a human readable name for the principal. + * If none is available, return the nodename. + * + * @return string + */ + public function getDisplayName() { + + return $this->getName(); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/User.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/User.php new file mode 100755 index 00000000..1887f8ad --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/User.php @@ -0,0 +1,134 @@ +principalBackend->getPrincipalByPath($this->getPrincipalURL() . '/' . $name); + if (!$principal) { + throw new DAV\Exception\NotFound('Node with name ' . $name . ' was not found'); + } + if ($name === 'calendar-proxy-read') + return new ProxyRead($this->principalBackend, $this->principalProperties); + + if ($name === 'calendar-proxy-write') + return new ProxyWrite($this->principalBackend, $this->principalProperties); + + throw new DAV\Exception\NotFound('Node with name ' . $name . ' was not found'); + + } + + /** + * Returns an array with all the child nodes + * + * @return DAV\INode[] + */ + public function getChildren() { + + $r = array(); + if ($this->principalBackend->getPrincipalByPath($this->getPrincipalURL() . '/calendar-proxy-read')) { + $r[] = new ProxyRead($this->principalBackend, $this->principalProperties); + } + if ($this->principalBackend->getPrincipalByPath($this->getPrincipalURL() . '/calendar-proxy-write')) { + $r[] = new ProxyWrite($this->principalBackend, $this->principalProperties); + } + + return $r; + + } + + /** + * Returns whether or not the child node exists + * + * @param string $name + * @return bool + */ + public function childExists($name) { + + try { + $this->getChild($name); + return true; + } catch (DAV\Exception\NotFound $e) { + return false; + } + + } + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + $acl = parent::getACL(); + $acl[] = array( + 'privilege' => '{DAV:}read', + 'principal' => $this->principalProperties['uri'] . '/calendar-proxy-read', + 'protected' => true, + ); + $acl[] = array( + 'privilege' => '{DAV:}read', + 'principal' => $this->principalProperties['uri'] . '/calendar-proxy-write', + 'protected' => true, + ); + return $acl; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/AllowedSharingModes.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/AllowedSharingModes.php new file mode 100755 index 00000000..97b888a0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/AllowedSharingModes.php @@ -0,0 +1,74 @@ +canBeShared = $canBeShared; + $this->canBePublished = $canBePublished; + + } + + /** + * Serializes the property in a DOMDocument + * + * @param DAV\Server $server + * @param \DOMElement $node + * @return void + */ + public function serialize(DAV\Server $server, \DOMElement $node) { + + $doc = $node->ownerDocument; + if ($this->canBeShared) { + $xcomp = $doc->createElement('cs:can-be-shared'); + $node->appendChild($xcomp); + } + if ($this->canBePublished) { + $xcomp = $doc->createElement('cs:can-be-published'); + $node->appendChild($xcomp); + } + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/Invite.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/Invite.php new file mode 100755 index 00000000..7a8683ac --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/Invite.php @@ -0,0 +1,227 @@ +users = $users; + $this->organizer = $organizer; + + } + + /** + * Returns the list of users, as it was passed to the constructor. + * + * @return array + */ + public function getValue() { + + return $this->users; + + } + + /** + * Serializes the property in a DOMDocument + * + * @param DAV\Server $server + * @param \DOMElement $node + * @return void + */ + public function serialize(DAV\Server $server,\DOMElement $node) { + + $doc = $node->ownerDocument; + + if (!is_null($this->organizer)) { + + $xorganizer = $doc->createElement('cs:organizer'); + + $href = $doc->createElement('d:href'); + $href->appendChild($doc->createTextNode($this->organizer['href'])); + $xorganizer->appendChild($href); + + if (isset($this->organizer['commonName']) && $this->organizer['commonName']) { + $commonName = $doc->createElement('cs:common-name'); + $commonName->appendChild($doc->createTextNode($this->organizer['commonName'])); + $xorganizer->appendChild($commonName); + } + if (isset($this->organizer['firstName']) && $this->organizer['firstName']) { + $firstName = $doc->createElement('cs:first-name'); + $firstName->appendChild($doc->createTextNode($this->organizer['firstName'])); + $xorganizer->appendChild($firstName); + } + if (isset($this->organizer['lastName']) && $this->organizer['lastName']) { + $lastName = $doc->createElement('cs:last-name'); + $lastName->appendChild($doc->createTextNode($this->organizer['lastName'])); + $xorganizer->appendChild($lastName); + } + + $node->appendChild($xorganizer); + + + } + + foreach($this->users as $user) { + + $xuser = $doc->createElement('cs:user'); + + $href = $doc->createElement('d:href'); + $href->appendChild($doc->createTextNode($user['href'])); + $xuser->appendChild($href); + + if (isset($user['commonName']) && $user['commonName']) { + $commonName = $doc->createElement('cs:common-name'); + $commonName->appendChild($doc->createTextNode($user['commonName'])); + $xuser->appendChild($commonName); + } + + switch($user['status']) { + + case SharingPlugin::STATUS_ACCEPTED : + $status = $doc->createElement('cs:invite-accepted'); + $xuser->appendChild($status); + break; + case SharingPlugin::STATUS_DECLINED : + $status = $doc->createElement('cs:invite-declined'); + $xuser->appendChild($status); + break; + case SharingPlugin::STATUS_NORESPONSE : + $status = $doc->createElement('cs:invite-noresponse'); + $xuser->appendChild($status); + break; + case SharingPlugin::STATUS_INVALID : + $status = $doc->createElement('cs:invite-invalid'); + $xuser->appendChild($status); + break; + + } + + $xaccess = $doc->createElement('cs:access'); + + if ($user['readOnly']) { + $xaccess->appendChild( + $doc->createElement('cs:read') + ); + } else { + $xaccess->appendChild( + $doc->createElement('cs:read-write') + ); + } + $xuser->appendChild($xaccess); + + if (isset($user['summary']) && $user['summary']) { + $summary = $doc->createElement('cs:summary'); + $summary->appendChild($doc->createTextNode($user['summary'])); + $xuser->appendChild($summary); + } + + $node->appendChild($xuser); + + } + + + } + + /** + * Unserializes the property. + * + * This static method should return a an instance of this object. + * + * @param \DOMElement $prop + * @return DAV\IProperty + */ + static function unserialize(\DOMElement $prop) { + + $xpath = new \DOMXPath($prop->ownerDocument); + $xpath->registerNamespace('cs', CalDAV\Plugin::NS_CALENDARSERVER); + $xpath->registerNamespace('d', 'urn:DAV'); + + $users = array(); + + foreach($xpath->query('cs:user', $prop) as $user) { + + $status = null; + if ($xpath->evaluate('boolean(cs:invite-accepted)', $user)) { + $status = SharingPlugin::STATUS_ACCEPTED; + } elseif ($xpath->evaluate('boolean(cs:invite-declined)', $user)) { + $status = SharingPlugin::STATUS_DECLINED; + } elseif ($xpath->evaluate('boolean(cs:invite-noresponse)', $user)) { + $status = SharingPlugin::STATUS_NORESPONSE; + } elseif ($xpath->evaluate('boolean(cs:invite-invalid)', $user)) { + $status = SharingPlugin::STATUS_INVALID; + } else { + throw new DAV\Exception('Every cs:user property must have one of cs:invite-accepted, cs:invite-declined, cs:invite-noresponse or cs:invite-invalid'); + } + $users[] = array( + 'href' => $xpath->evaluate('string(d:href)', $user), + 'commonName' => $xpath->evaluate('string(cs:common-name)', $user), + 'readOnly' => $xpath->evaluate('boolean(cs:access/cs:read)', $user), + 'summary' => $xpath->evaluate('string(cs:summary)', $user), + 'status' => $status, + ); + + } + + return new self($users); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/ScheduleCalendarTransp.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/ScheduleCalendarTransp.php new file mode 100755 index 00000000..328ac764 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/ScheduleCalendarTransp.php @@ -0,0 +1,102 @@ +value = $value; + + } + + /** + * Returns the current value + * + * @return string + */ + public function getValue() { + + return $this->value; + + } + + /** + * Serializes the property in a DOMDocument + * + * @param DAV\Server $server + * @param \DOMElement $node + * @return void + */ + public function serialize(DAV\Server $server,\DOMElement $node) { + + $doc = $node->ownerDocument; + switch($this->value) { + case self::TRANSPARENT : + $xval = $doc->createElement('cal:transparent'); + break; + case self::OPAQUE : + $xval = $doc->createElement('cal:opaque'); + break; + } + + $node->appendChild($xval); + + } + + /** + * Unserializes the DOMElement back into a Property class. + * + * @param \DOMElement $node + * @return ScheduleCalendarTransp + */ + static function unserialize(\DOMElement $node) { + + $value = null; + foreach($node->childNodes as $childNode) { + switch(DAV\XMLUtil::toClarkNotation($childNode)) { + case '{' . CalDAV\Plugin::NS_CALDAV . '}opaque' : + $value = self::OPAQUE; + break; + case '{' . CalDAV\Plugin::NS_CALDAV . '}transparent' : + $value = self::TRANSPARENT; + break; + } + } + if (is_null($value)) + return null; + + return new self($value); + + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCalendarComponentSet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCalendarComponentSet.php new file mode 100755 index 00000000..c533762e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCalendarComponentSet.php @@ -0,0 +1,88 @@ +components = $components; + + } + + /** + * Returns the list of supported components + * + * @return array + */ + public function getValue() { + + return $this->components; + + } + + /** + * Serializes the property in a DOMDocument + * + * @param DAV\Server $server + * @param \DOMElement $node + * @return void + */ + public function serialize(DAV\Server $server,\DOMElement $node) { + + $doc = $node->ownerDocument; + foreach($this->components as $component) { + + $xcomp = $doc->createElement('cal:comp'); + $xcomp->setAttribute('name',$component); + $node->appendChild($xcomp); + + } + + } + + /** + * Unserializes the DOMElement back into a Property class. + * + * @param \DOMElement $node + * @return Property_SupportedCalendarComponentSet + */ + static function unserialize(\DOMElement $node) { + + $components = array(); + foreach($node->childNodes as $childNode) { + if (DAV\XMLUtil::toClarkNotation($childNode)==='{' . CalDAV\Plugin::NS_CALDAV . '}comp') { + $components[] = $childNode->getAttribute('name'); + } + } + return new self($components); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCalendarData.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCalendarData.php new file mode 100755 index 00000000..ed742daf --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCalendarData.php @@ -0,0 +1,40 @@ +ownerDocument; + + $prefix = isset($server->xmlNamespaces[Plugin::NS_CALDAV])?$server->xmlNamespaces[Plugin::NS_CALDAV]:'cal'; + + $caldata = $doc->createElement($prefix . ':calendar-data'); + $caldata->setAttribute('content-type','text/calendar'); + $caldata->setAttribute('version','2.0'); + + $node->appendChild($caldata); + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCollationSet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCollationSet.php new file mode 100755 index 00000000..7c853f26 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCollationSet.php @@ -0,0 +1,45 @@ +ownerDocument; + + $prefix = $node->lookupPrefix('urn:ietf:params:xml:ns:caldav'); + if (!$prefix) $prefix = 'cal'; + + $node->appendChild( + $doc->createElement($prefix . ':supported-collation','i;ascii-casemap') + ); + $node->appendChild( + $doc->createElement($prefix . ':supported-collation','i;octet') + ); + $node->appendChild( + $doc->createElement($prefix . ':supported-collation','i;unicode-casemap') + ); + + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Schedule/IMip.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Schedule/IMip.php new file mode 100755 index 00000000..0efacff6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Schedule/IMip.php @@ -0,0 +1,111 @@ +senderEmail = $senderEmail; + + } + + /** + * Sends one or more iTip messages through email. + * + * @param string $originator Originator Email + * @param array $recipients Array of email addresses + * @param VObject\Component $vObject + * @param string $principal Principal Url of the originator + * @return void + */ + public function sendMessage($originator, array $recipients, VObject\Component $vObject, $principal) { + + foreach($recipients as $recipient) { + + $to = $recipient; + $replyTo = $originator; + $subject = 'SabreDAV iTIP message'; + + switch(strtoupper($vObject->METHOD)) { + case 'REPLY' : + $subject = 'Response for: ' . $vObject->VEVENT->SUMMARY; + break; + case 'REQUEST' : + $subject = 'Invitation for: ' .$vObject->VEVENT->SUMMARY; + break; + case 'CANCEL' : + $subject = 'Cancelled event: ' . $vObject->VEVENT->SUMMARY; + break; + } + + $headers = array(); + $headers[] = 'Reply-To: ' . $replyTo; + $headers[] = 'From: ' . $this->senderEmail; + $headers[] = 'Content-Type: text/calendar; method=' . (string)$vObject->method . '; charset=utf-8'; + if (DAV\Server::$exposeVersion) { + $headers[] = 'X-Sabre-Version: ' . DAV\Version::VERSION . '-' . DAV\Version::STABILITY; + } + + $vcalBody = $vObject->serialize(); + + $this->mail($to, $subject, $vcalBody, $headers); + + } + + } + + // @codeCoverageIgnoreStart + // This is deemed untestable in a reasonable manner + + /** + * This function is reponsible for sending the actual email. + * + * @param string $to Recipient email address + * @param string $subject Subject of the email + * @param string $body iCalendar body + * @param array $headers List of headers + * @return void + */ + protected function mail($to, $subject, $body, array $headers) { + + + mail($to, $subject, $body, implode("\r\n", $headers)); + + } + + // @codeCoverageIgnoreEnd + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Schedule/IOutbox.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Schedule/IOutbox.php new file mode 100755 index 00000000..e9edc510 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Schedule/IOutbox.php @@ -0,0 +1,16 @@ +principalUri = $principalUri; + + } + + /** + * Returns the name of the node. + * + * This is used to generate the url. + * + * @return string + */ + public function getName() { + + return 'outbox'; + + } + + /** + * Returns an array with all the child nodes + * + * @return \SabreForRainLoop\DAV\INode[] + */ + public function getChildren() { + + return array(); + + } + + /** + * Returns the owner principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getOwner() { + + return $this->principalUri; + + } + + /** + * Returns a group principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getGroup() { + + return null; + + } + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + return array( + array( + 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-query-freebusy', + 'principal' => $this->getOwner(), + 'protected' => true, + ), + array( + 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-post-vevent', + 'principal' => $this->getOwner(), + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}read', + 'principal' => $this->getOwner(), + 'protected' => true, + ), + ); + + } + + /** + * Updates the ACL + * + * This method will receive a list of new ACE's. + * + * @param array $acl + * @return void + */ + public function setACL(array $acl) { + + throw new DAV\Exception\MethodNotAllowed('You\'re not allowed to update the ACL'); + + } + + /** + * Returns the list of supported privileges for this node. + * + * The returned data structure is a list of nested privileges. + * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple + * standard structure. + * + * If null is returned from this method, the default privilege set is used, + * which is fine for most common usecases. + * + * @return array|null + */ + public function getSupportedPrivilegeSet() { + + $default = DAVACL\Plugin::getDefaultSupportedPrivilegeSet(); + $default['aggregates'][] = array( + 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-query-freebusy', + ); + $default['aggregates'][] = array( + 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-post-vevent', + ); + + return $default; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ShareableCalendar.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ShareableCalendar.php new file mode 100755 index 00000000..43b051a2 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ShareableCalendar.php @@ -0,0 +1,72 @@ +caldavBackend->updateShares($this->calendarInfo['id'], $add, $remove); + + } + + /** + * Returns the list of people whom this calendar is shared with. + * + * Every element in this array should have the following properties: + * * href - Often a mailto: address + * * commonName - Optional, for example a first + last name + * * status - See the SabreForRainLoop\CalDAV\SharingPlugin::STATUS_ constants. + * * readOnly - boolean + * * summary - Optional, a description for the share + * + * @return array + */ + public function getShares() { + + return $this->caldavBackend->getShares($this->calendarInfo['id']); + + } + + /** + * Marks this calendar as published. + * + * Publishing a calendar should automatically create a read-only, public, + * subscribable calendar. + * + * @param bool $value + * @return void + */ + public function setPublishStatus($value) { + + $this->caldavBackend->setPublishStatus($this->calendarInfo['id'], $value); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/SharedCalendar.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/SharedCalendar.php new file mode 100755 index 00000000..fda75159 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/SharedCalendar.php @@ -0,0 +1,116 @@ +calendarInfo['{http://calendarserver.org/ns/}shared-url']; + + } + + /** + * Returns the owner principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getOwner() { + + return $this->calendarInfo['{http://sabredav.org/ns}owner-principal']; + + } + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + // The top-level ACL only contains access information for the true + // owner of the calendar, so we need to add the information for the + // sharee. + $acl = parent::getACL(); + $acl[] = array( + 'privilege' => '{DAV:}read', + 'principal' => $this->calendarInfo['principaluri'], + 'protected' => true, + ); + if (!$this->calendarInfo['{http://sabredav.org/ns}read-only']) { + $acl[] = array( + 'privilege' => '{DAV:}write', + 'principal' => $this->calendarInfo['principaluri'], + 'protected' => true, + ); + } + return $acl; + + } + + /** + * Returns the list of people whom this calendar is shared with. + * + * Every element in this array should have the following properties: + * * href - Often a mailto: address + * * commonName - Optional, for example a first + last name + * * status - See the SabreForRainLoop\CalDAV\SharingPlugin::STATUS_ constants. + * * readOnly - boolean + * * summary - Optional, a description for the share + * + * @return array + */ + public function getShares() { + + return $this->caldavBackend->getShares($this->calendarInfo['id']); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/SharingPlugin.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/SharingPlugin.php new file mode 100755 index 00000000..7a89075a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/SharingPlugin.php @@ -0,0 +1,526 @@ +server = $server; + $server->resourceTypeMapping['SabreForRainLoop\\CalDAV\\ISharedCalendar'] = '{' . Plugin::NS_CALENDARSERVER . '}shared'; + + array_push( + $this->server->protectedProperties, + '{' . Plugin::NS_CALENDARSERVER . '}invite', + '{' . Plugin::NS_CALENDARSERVER . '}allowed-sharing-modes', + '{' . Plugin::NS_CALENDARSERVER . '}shared-url' + ); + + $this->server->subscribeEvent('beforeGetProperties', array($this, 'beforeGetProperties')); + $this->server->subscribeEvent('afterGetProperties', array($this, 'afterGetProperties')); + $this->server->subscribeEvent('updateProperties', array($this, 'updateProperties')); + $this->server->subscribeEvent('unknownMethod', array($this,'unknownMethod')); + + } + + /** + * This event is triggered when properties are requested for a certain + * node. + * + * This allows us to inject any properties early. + * + * @param string $path + * @param DAV\INode $node + * @param array $requestedProperties + * @param array $returnedProperties + * @return void + */ + public function beforeGetProperties($path, DAV\INode $node, &$requestedProperties, &$returnedProperties) { + + if ($node instanceof IShareableCalendar) { + if (($index = array_search('{' . Plugin::NS_CALENDARSERVER . '}invite', $requestedProperties))!==false) { + + unset($requestedProperties[$index]); + $returnedProperties[200]['{' . Plugin::NS_CALENDARSERVER . '}invite'] = + new Property\Invite( + $node->getShares() + ); + + } + + } + + if ($node instanceof ISharedCalendar) { + + if (($index = array_search('{' . Plugin::NS_CALENDARSERVER . '}shared-url', $requestedProperties))!==false) { + + unset($requestedProperties[$index]); + $returnedProperties[200]['{' . Plugin::NS_CALENDARSERVER . '}shared-url'] = + new DAV\Property\Href( + $node->getSharedUrl() + ); + + } + // The 'invite' property is slightly different for the 'shared' + // instance of the calendar, as it also contains the owner + // information. + if (($index = array_search('{' . Plugin::NS_CALENDARSERVER . '}invite', $requestedProperties))!==false) { + + unset($requestedProperties[$index]); + + // Fetching owner information + $props = $this->server->getPropertiesForPath($node->getOwner(), array( + '{http://sabredav.org/ns}email-address', + '{DAV:}displayname', + ), 1); + + $ownerInfo = array( + 'href' => $node->getOwner(), + ); + + if (isset($props[0][200])) { + + // We're mapping the internal webdav properties to the + // elements caldav-sharing expects. + if (isset($props[0][200]['{http://sabredav.org/ns}email-address'])) { + $ownerInfo['href'] = 'mailto:' . $props[0][200]['{http://sabredav.org/ns}email-address']; + } + if (isset($props[0][200]['{DAV:}displayname'])) { + $ownerInfo['commonName'] = $props[0][200]['{DAV:}displayname']; + } + + } + + $returnedProperties[200]['{' . Plugin::NS_CALENDARSERVER . '}invite'] = + new Property\Invite( + $node->getShares(), + $ownerInfo + ); + + } + + + } + + } + + /** + * This method is triggered *after* all properties have been retrieved. + * This allows us to inject the correct resourcetype for calendars that + * have been shared. + * + * @param string $path + * @param array $properties + * @param DAV\INode $node + * @return void + */ + public function afterGetProperties($path, &$properties, DAV\INode $node) { + + if ($node instanceof IShareableCalendar) { + if (isset($properties[200]['{DAV:}resourcetype'])) { + if (count($node->getShares())>0) { + $properties[200]['{DAV:}resourcetype']->add( + '{' . Plugin::NS_CALENDARSERVER . '}shared-owner' + ); + } + } + $propName = '{' . Plugin::NS_CALENDARSERVER . '}allowed-sharing-modes'; + if (array_key_exists($propName, $properties[404])) { + unset($properties[404][$propName]); + $properties[200][$propName] = new Property\AllowedSharingModes(true,false); + } + + } + + } + + /** + * This method is trigged when a user attempts to update a node's + * properties. + * + * A previous draft of the sharing spec stated that it was possible to use + * PROPPATCH to remove 'shared-owner' from the resourcetype, thus unsharing + * the calendar. + * + * Even though this is no longer in the current spec, we keep this around + * because OS X 10.7 may still make use of this feature. + * + * @param array $mutations + * @param array $result + * @param DAV\INode $node + * @return void + */ + public function updateProperties(array &$mutations, array &$result, DAV\INode $node) { + + if (!$node instanceof IShareableCalendar) + return; + + if (!isset($mutations['{DAV:}resourcetype'])) { + return; + } + + // Only doing something if shared-owner is indeed not in the list. + if($mutations['{DAV:}resourcetype']->is('{' . Plugin::NS_CALENDARSERVER . '}shared-owner')) return; + + $shares = $node->getShares(); + $remove = array(); + foreach($shares as $share) { + $remove[] = $share['href']; + } + $node->updateShares(array(), $remove); + + // We're marking this update as 200 OK + $result[200]['{DAV:}resourcetype'] = null; + + // Removing it from the mutations list + unset($mutations['{DAV:}resourcetype']); + + } + + /** + * This event is triggered when the server didn't know how to handle a + * certain request. + * + * We intercept this to handle POST requests on calendars. + * + * @param string $method + * @param string $uri + * @return null|bool + */ + public function unknownMethod($method, $uri) { + + if ($method!=='POST') { + return; + } + + // Only handling xml + $contentType = $this->server->httpRequest->getHeader('Content-Type'); + if (strpos($contentType,'application/xml')===false && strpos($contentType,'text/xml')===false) + return; + + // Making sure the node exists + try { + $node = $this->server->tree->getNodeForPath($uri); + } catch (DAV\Exception\NotFound $e) { + return; + } + + $requestBody = $this->server->httpRequest->getBody(true); + + // If this request handler could not deal with this POST request, it + // will return 'null' and other plugins get a chance to handle the + // request. + // + // However, we already requested the full body. This is a problem, + // because a body can only be read once. This is why we preemptively + // re-populated the request body with the existing data. + $this->server->httpRequest->setBody($requestBody); + + $dom = DAV\XMLUtil::loadDOMDocument($requestBody); + + $documentType = DAV\XMLUtil::toClarkNotation($dom->firstChild); + + switch($documentType) { + + // Dealing with the 'share' document, which modified invitees on a + // calendar. + case '{' . Plugin::NS_CALENDARSERVER . '}share' : + + // We can only deal with IShareableCalendar objects + if (!$node instanceof IShareableCalendar) { + return; + } + + // Getting ACL info + $acl = $this->server->getPlugin('acl'); + + // If there's no ACL support, we allow everything + if ($acl) { + $acl->checkPrivileges($uri, '{DAV:}write'); + } + + $mutations = $this->parseShareRequest($dom); + + $node->updateShares($mutations[0], $mutations[1]); + + $this->server->httpResponse->sendStatus(200); + // Adding this because sending a response body may cause issues, + // and I wanted some type of indicator the response was handled. + $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well'); + + // Breaking the event chain + return false; + + // The invite-reply document is sent when the user replies to an + // invitation of a calendar share. + case '{'. Plugin::NS_CALENDARSERVER.'}invite-reply' : + + // This only works on the calendar-home-root node. + if (!$node instanceof UserCalendars) { + return; + } + + // Getting ACL info + $acl = $this->server->getPlugin('acl'); + + // If there's no ACL support, we allow everything + if ($acl) { + $acl->checkPrivileges($uri, '{DAV:}write'); + } + + $message = $this->parseInviteReplyRequest($dom); + + $url = $node->shareReply( + $message['href'], + $message['status'], + $message['calendarUri'], + $message['inReplyTo'], + $message['summary'] + ); + + $this->server->httpResponse->sendStatus(200); + // Adding this because sending a response body may cause issues, + // and I wanted some type of indicator the response was handled. + $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well'); + + if ($url) { + $dom = new \DOMDocument('1.0', 'UTF-8'); + $dom->formatOutput = true; + + $root = $dom->createElement('cs:shared-as'); + foreach($this->server->xmlNamespaces as $namespace => $prefix) { + $root->setAttribute('xmlns:' . $prefix, $namespace); + } + + $dom->appendChild($root); + $href = new DAV\Property\Href($url); + + $href->serialize($this->server, $root); + $this->server->httpResponse->setHeader('Content-Type','application/xml'); + $this->server->httpResponse->sendBody($dom->saveXML()); + + } + + // Breaking the event chain + return false; + + case '{' . Plugin::NS_CALENDARSERVER . '}publish-calendar' : + + // We can only deal with IShareableCalendar objects + if (!$node instanceof IShareableCalendar) { + return; + } + + // Getting ACL info + $acl = $this->server->getPlugin('acl'); + + // If there's no ACL support, we allow everything + if ($acl) { + $acl->checkPrivileges($uri, '{DAV:}write'); + } + + $node->setPublishStatus(true); + + // iCloud sends back the 202, so we will too. + $this->server->httpResponse->sendStatus(202); + + // Adding this because sending a response body may cause issues, + // and I wanted some type of indicator the response was handled. + $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well'); + + // Breaking the event chain + return false; + + case '{' . Plugin::NS_CALENDARSERVER . '}unpublish-calendar' : + + // We can only deal with IShareableCalendar objects + if (!$node instanceof IShareableCalendar) { + return; + } + + // Getting ACL info + $acl = $this->server->getPlugin('acl'); + + // If there's no ACL support, we allow everything + if ($acl) { + $acl->checkPrivileges($uri, '{DAV:}write'); + } + + $node->setPublishStatus(false); + + $this->server->httpResponse->sendStatus(200); + + // Adding this because sending a response body may cause issues, + // and I wanted some type of indicator the response was handled. + $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well'); + + // Breaking the event chain + return false; + + } + + + + } + + /** + * Parses the 'share' POST request. + * + * This method returns an array, containing two arrays. + * The first array is a list of new sharees. Every element is a struct + * containing a: + * * href element. (usually a mailto: address) + * * commonName element (often a first and lastname, but can also be + * false) + * * readOnly (true or false) + * * summary (A description of the share, can also be false) + * + * The second array is a list of sharees that are to be removed. This is + * just a simple array with 'hrefs'. + * + * @param \DOMDocument $dom + * @return array + */ + protected function parseShareRequest(\DOMDocument $dom) { + + $xpath = new \DOMXPath($dom); + $xpath->registerNamespace('cs', Plugin::NS_CALENDARSERVER); + $xpath->registerNamespace('d', 'urn:DAV'); + + $set = array(); + $elems = $xpath->query('cs:set'); + + for($i=0; $i < $elems->length; $i++) { + + $xset = $elems->item($i); + $set[] = array( + 'href' => $xpath->evaluate('string(d:href)', $xset), + 'commonName' => $xpath->evaluate('string(cs:common-name)', $xset), + 'summary' => $xpath->evaluate('string(cs:summary)', $xset), + 'readOnly' => $xpath->evaluate('boolean(cs:read)', $xset)!==false + ); + + } + + $remove = array(); + $elems = $xpath->query('cs:remove'); + + for($i=0; $i < $elems->length; $i++) { + + $xremove = $elems->item($i); + $remove[] = $xpath->evaluate('string(d:href)', $xremove); + + } + + return array($set, $remove); + + } + + /** + * Parses the 'invite-reply' POST request. + * + * This method returns an array, containing the following properties: + * * href - The sharee who is replying + * * status - One of the self::STATUS_* constants + * * calendarUri - The url of the shared calendar + * * inReplyTo - The unique id of the share invitation. + * * summary - Optional description of the reply. + * + * @param \DOMDocument $dom + * @return array + */ + protected function parseInviteReplyRequest(\DOMDocument $dom) { + + $xpath = new \DOMXPath($dom); + $xpath->registerNamespace('cs', Plugin::NS_CALENDARSERVER); + $xpath->registerNamespace('d', 'urn:DAV'); + + $hostHref = $xpath->evaluate('string(cs:hosturl/d:href)'); + if (!$hostHref) { + throw new DAV\Exception\BadRequest('The {' . Plugin::NS_CALENDARSERVER . '}hosturl/{DAV:}href element is required'); + } + + return array( + 'href' => $xpath->evaluate('string(d:href)'), + 'calendarUri' => $this->server->calculateUri($hostHref), + 'inReplyTo' => $xpath->evaluate('string(cs:in-reply-to)'), + 'summary' => $xpath->evaluate('string(cs:summary)'), + 'status' => $xpath->evaluate('boolean(cs:invite-accepted)')?self::STATUS_ACCEPTED:self::STATUS_DECLINED + ); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/UserCalendars.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/UserCalendars.php new file mode 100755 index 00000000..17f7956f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/UserCalendars.php @@ -0,0 +1,342 @@ +caldavBackend = $caldavBackend; + $this->principalInfo = $principalInfo; + + } + + /** + * Returns the name of this object + * + * @return string + */ + public function getName() { + + list(,$name) = DAV\URLUtil::splitPath($this->principalInfo['uri']); + return $name; + + } + + /** + * Updates the name of this object + * + * @param string $name + * @return void + */ + public function setName($name) { + + throw new DAV\Exception\Forbidden(); + + } + + /** + * Deletes this object + * + * @return void + */ + public function delete() { + + throw new DAV\Exception\Forbidden(); + + } + + /** + * Returns the last modification date + * + * @return int + */ + public function getLastModified() { + + return null; + + } + + /** + * Creates a new file under this object. + * + * This is currently not allowed + * + * @param string $filename + * @param resource $data + * @return void + */ + public function createFile($filename, $data=null) { + + throw new DAV\Exception\MethodNotAllowed('Creating new files in this collection is not supported'); + + } + + /** + * Creates a new directory under this object. + * + * This is currently not allowed. + * + * @param string $filename + * @return void + */ + public function createDirectory($filename) { + + throw new DAV\Exception\MethodNotAllowed('Creating new collections in this collection is not supported'); + + } + + /** + * Returns a single calendar, by name + * + * @param string $name + * @todo needs optimizing + * @return Calendar + */ + public function getChild($name) { + + foreach($this->getChildren() as $child) { + if ($name==$child->getName()) + return $child; + + } + throw new DAV\Exception\NotFound('Calendar with name \'' . $name . '\' could not be found'); + + } + + /** + * Checks if a calendar exists. + * + * @param string $name + * @todo needs optimizing + * @return bool + */ + public function childExists($name) { + + foreach($this->getChildren() as $child) { + if ($name==$child->getName()) + return true; + + } + return false; + + } + + /** + * Returns a list of calendars + * + * @return array + */ + public function getChildren() { + + $calendars = $this->caldavBackend->getCalendarsForUser($this->principalInfo['uri']); + $objs = array(); + foreach($calendars as $calendar) { + if ($this->caldavBackend instanceof Backend\SharingSupport) { + if (isset($calendar['{http://calendarserver.org/ns/}shared-url'])) { + $objs[] = new SharedCalendar($this->caldavBackend, $calendar); + } else { + $objs[] = new ShareableCalendar($this->caldavBackend, $calendar); + } + } else { + $objs[] = new Calendar($this->caldavBackend, $calendar); + } + } + $objs[] = new Schedule\Outbox($this->principalInfo['uri']); + + // We're adding a notifications node, if it's supported by the backend. + if ($this->caldavBackend instanceof Backend\NotificationSupport) { + $objs[] = new Notifications\Collection($this->caldavBackend, $this->principalInfo['uri']); + } + return $objs; + + } + + /** + * Creates a new calendar + * + * @param string $name + * @param array $resourceType + * @param array $properties + * @return void + */ + public function createExtendedCollection($name, array $resourceType, array $properties) { + + $isCalendar = false; + foreach($resourceType as $rt) { + switch ($rt) { + case '{DAV:}collection' : + case '{http://calendarserver.org/ns/}shared-owner' : + // ignore + break; + case '{urn:ietf:params:xml:ns:caldav}calendar' : + $isCalendar = true; + break; + default : + throw new DAV\Exception\InvalidResourceType('Unknown resourceType: ' . $rt); + } + } + if (!$isCalendar) { + throw new DAV\Exception\InvalidResourceType('You can only create calendars in this collection'); + } + $this->caldavBackend->createCalendar($this->principalInfo['uri'], $name, $properties); + + } + + /** + * Returns the owner principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getOwner() { + + return $this->principalInfo['uri']; + + } + + /** + * Returns a group principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getGroup() { + + return null; + + } + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + return array( + array( + 'privilege' => '{DAV:}read', + 'principal' => $this->principalInfo['uri'], + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}write', + 'principal' => $this->principalInfo['uri'], + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}read', + 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-write', + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}write', + 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-write', + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}read', + 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-read', + 'protected' => true, + ), + + ); + + } + + /** + * Updates the ACL + * + * This method will receive a list of new ACE's. + * + * @param array $acl + * @return void + */ + public function setACL(array $acl) { + + throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported'); + + } + + /** + * Returns the list of supported privileges for this node. + * + * The returned data structure is a list of nested privileges. + * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple + * standard structure. + * + * If null is returned from this method, the default privilege set is used, + * which is fine for most common usecases. + * + * @return array|null + */ + public function getSupportedPrivilegeSet() { + + return null; + + } + + /** + * This method is called when a user replied to a request to share. + * + * This method should return the url of the newly created calendar if the + * share was accepted. + * + * @param string href The sharee who is replying (often a mailto: address) + * @param int status One of the SharingPlugin::STATUS_* constants + * @param string $calendarUri The url to the calendar thats being shared + * @param string $inReplyTo The unique id this message is a response to + * @param string $summary A description of the reply + * @return null|string + */ + public function shareReply($href, $status, $calendarUri, $inReplyTo, $summary = null) { + + if (!$this->caldavBackend instanceof Backend\SharingSupport) { + throw new DAV\Exception\NotImplemented('Sharing support is not implemented by this backend.'); + } + + return $this->caldavBackend->shareReply($href, $status, $calendarUri, $inReplyTo, $summary); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Version.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Version.php new file mode 100755 index 00000000..b85b3400 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Version.php @@ -0,0 +1,24 @@ +carddavBackend = $carddavBackend; + $this->addressBookInfo = $addressBookInfo; + + } + + /** + * Returns the name of the addressbook + * + * @return string + */ + public function getName() { + + return $this->addressBookInfo['uri']; + + } + + /** + * Returns a card + * + * @param string $name + * @return \ICard + */ + public function getChild($name) { + + $obj = $this->carddavBackend->getCard($this->addressBookInfo['id'],$name); + if (!$obj) throw new DAV\Exception\NotFound('Card not found'); + return new Card($this->carddavBackend,$this->addressBookInfo,$obj); + + } + + /** + * Returns the full list of cards + * + * @return array + */ + public function getChildren() { + + $objs = $this->carddavBackend->getCards($this->addressBookInfo['id']); + $children = array(); + foreach($objs as $obj) { + $children[] = new Card($this->carddavBackend,$this->addressBookInfo,$obj); + } + return $children; + + } + + /** + * Creates a new directory + * + * We actually block this, as subdirectories are not allowed in addressbooks. + * + * @param string $name + * @return void + */ + public function createDirectory($name) { + + throw new DAV\Exception\MethodNotAllowed('Creating collections in addressbooks is not allowed'); + + } + + /** + * Creates a new file + * + * The contents of the new file must be a valid VCARD. + * + * This method may return an ETag. + * + * @param string $name + * @param resource $vcardData + * @return string|null + */ + public function createFile($name,$vcardData = null) { + + if (is_resource($vcardData)) { + $vcardData = stream_get_contents($vcardData); + } + // Converting to UTF-8, if needed + $vcardData = DAV\StringUtil::ensureUTF8($vcardData); + + return $this->carddavBackend->createCard($this->addressBookInfo['id'],$name,$vcardData); + + } + + /** + * Deletes the entire addressbook. + * + * @return void + */ + public function delete() { + + $this->carddavBackend->deleteAddressBook($this->addressBookInfo['id']); + + } + + /** + * Renames the addressbook + * + * @param string $newName + * @return void + */ + public function setName($newName) { + + throw new DAV\Exception\MethodNotAllowed('Renaming addressbooks is not yet supported'); + + } + + /** + * Returns the last modification date as a unix timestamp. + * + * @return void + */ + public function getLastModified() { + + return null; + + } + + /** + * Updates properties on this node, + * + * The properties array uses the propertyName in clark-notation as key, + * and the array value for the property value. In the case a property + * should be deleted, the property value will be null. + * + * This method must be atomic. If one property cannot be changed, the + * entire operation must fail. + * + * If the operation was successful, true can be returned. + * If the operation failed, false can be returned. + * + * Deletion of a non-existent property is always successful. + * + * Lastly, it is optional to return detailed information about any + * failures. In this case an array should be returned with the following + * structure: + * + * array( + * 403 => array( + * '{DAV:}displayname' => null, + * ), + * 424 => array( + * '{DAV:}owner' => null, + * ) + * ) + * + * In this example it was forbidden to update {DAV:}displayname. + * (403 Forbidden), which in turn also caused {DAV:}owner to fail + * (424 Failed Dependency) because the request needs to be atomic. + * + * @param array $mutations + * @return bool|array + */ + public function updateProperties($mutations) { + + return $this->carddavBackend->updateAddressBook($this->addressBookInfo['id'], $mutations); + + } + + /** + * Returns a list of properties for this nodes. + * + * The properties list is a list of propertynames the client requested, + * encoded in clark-notation {xmlnamespace}tagname + * + * If the array is empty, it means 'all properties' were requested. + * + * @param array $properties + * @return array + */ + public function getProperties($properties) { + + $response = array(); + foreach($properties as $propertyName) { + + if (isset($this->addressBookInfo[$propertyName])) { + + $response[$propertyName] = $this->addressBookInfo[$propertyName]; + + } + + } + + return $response; + + } + + /** + * Returns the owner principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getOwner() { + + return $this->addressBookInfo['principaluri']; + + } + + /** + * Returns a group principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getGroup() { + + return null; + + } + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + return array( + array( + 'privilege' => '{DAV:}read', + 'principal' => $this->addressBookInfo['principaluri'], + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}write', + 'principal' => $this->addressBookInfo['principaluri'], + 'protected' => true, + ), + + ); + + } + + /** + * Updates the ACL + * + * This method will receive a list of new ACE's. + * + * @param array $acl + * @return void + */ + public function setACL(array $acl) { + + throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported'); + + } + + /** + * Returns the list of supported privileges for this node. + * + * The returned data structure is a list of nested privileges. + * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple + * standard structure. + * + * If null is returned from this method, the default privilege set is used, + * which is fine for most common usecases. + * + * @return array|null + */ + public function getSupportedPrivilegeSet() { + + return null; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/AddressBookQueryParser.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/AddressBookQueryParser.php new file mode 100755 index 00000000..579937e8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/AddressBookQueryParser.php @@ -0,0 +1,221 @@ +dom = $dom; + + $this->xpath = new \DOMXPath($dom); + $this->xpath->registerNameSpace('card',Plugin::NS_CARDDAV); + + } + + /** + * Parses the request. + * + * @return void + */ + public function parse() { + + $filterNode = null; + + $limit = $this->xpath->evaluate('number(/card:addressbook-query/card:limit/card:nresults)'); + if (is_nan($limit)) $limit = null; + + $filter = $this->xpath->query('/card:addressbook-query/card:filter'); + + // According to the CardDAV spec there needs to be exactly 1 filter + // element. However, KDE 4.8.2 contains a bug that will encode 0 filter + // elements, so this is a workaround for that. + // + // See: https://bugs.kde.org/show_bug.cgi?id=300047 + if ($filter->length === 0) { + $test = null; + $filter = null; + } elseif ($filter->length === 1) { + $filter = $filter->item(0); + $test = $this->xpath->evaluate('string(@test)', $filter); + } else { + throw new DAV\Exception\BadRequest('Only one filter element is allowed'); + } + + if (!$test) $test = self::TEST_ANYOF; + if ($test !== self::TEST_ANYOF && $test !== self::TEST_ALLOF) { + throw new DAV\Exception\BadRequest('The test attribute must either hold "anyof" or "allof"'); + } + + $propFilters = array(); + + $propFilterNodes = $this->xpath->query('card:prop-filter', $filter); + for($ii=0; $ii < $propFilterNodes->length; $ii++) { + + $propFilters[] = $this->parsePropFilterNode($propFilterNodes->item($ii)); + + + } + + $this->filters = $propFilters; + $this->limit = $limit; + $this->requestedProperties = array_keys(DAV\XMLUtil::parseProperties($this->dom->firstChild)); + $this->test = $test; + + } + + /** + * Parses the prop-filter xml element + * + * @param \DOMElement $propFilterNode + * @return array + */ + protected function parsePropFilterNode(\DOMElement $propFilterNode) { + + $propFilter = array(); + $propFilter['name'] = $propFilterNode->getAttribute('name'); + $propFilter['test'] = $propFilterNode->getAttribute('test'); + if (!$propFilter['test']) $propFilter['test'] = 'anyof'; + + $propFilter['is-not-defined'] = $this->xpath->query('card:is-not-defined', $propFilterNode)->length>0; + + $paramFilterNodes = $this->xpath->query('card:param-filter', $propFilterNode); + + $propFilter['param-filters'] = array(); + + + for($ii=0;$ii<$paramFilterNodes->length;$ii++) { + + $propFilter['param-filters'][] = $this->parseParamFilterNode($paramFilterNodes->item($ii)); + + } + $propFilter['text-matches'] = array(); + $textMatchNodes = $this->xpath->query('card:text-match', $propFilterNode); + + for($ii=0;$ii<$textMatchNodes->length;$ii++) { + + $propFilter['text-matches'][] = $this->parseTextMatchNode($textMatchNodes->item($ii)); + + } + + return $propFilter; + + } + + /** + * Parses the param-filter element + * + * @param \DOMElement $paramFilterNode + * @return array + */ + public function parseParamFilterNode(\DOMElement $paramFilterNode) { + + $paramFilter = array(); + $paramFilter['name'] = $paramFilterNode->getAttribute('name'); + $paramFilter['is-not-defined'] = $this->xpath->query('card:is-not-defined', $paramFilterNode)->length>0; + $paramFilter['text-match'] = null; + + $textMatch = $this->xpath->query('card:text-match', $paramFilterNode); + if ($textMatch->length>0) { + $paramFilter['text-match'] = $this->parseTextMatchNode($textMatch->item(0)); + } + + return $paramFilter; + + } + + /** + * Text match + * + * @param \DOMElement $textMatchNode + * @return array + */ + public function parseTextMatchNode(\DOMElement $textMatchNode) { + + $matchType = $textMatchNode->getAttribute('match-type'); + if (!$matchType) $matchType = 'contains'; + + if (!in_array($matchType, array('contains', 'equals', 'starts-with', 'ends-with'))) { + throw new DAV\Exception\BadRequest('Unknown match-type: ' . $matchType); + } + + $negateCondition = $textMatchNode->getAttribute('negate-condition'); + $negateCondition = $negateCondition==='yes'; + $collation = $textMatchNode->getAttribute('collation'); + if (!$collation) $collation = 'i;unicode-casemap'; + + return array( + 'negate-condition' => $negateCondition, + 'collation' => $collation, + 'match-type' => $matchType, + 'value' => $textMatchNode->nodeValue + ); + + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/AddressBookRoot.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/AddressBookRoot.php new file mode 100755 index 00000000..5cbd9183 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/AddressBookRoot.php @@ -0,0 +1,80 @@ +carddavBackend = $carddavBackend; + parent::__construct($principalBackend, $principalPrefix); + + } + + /** + * Returns the name of the node + * + * @return string + */ + public function getName() { + + return Plugin::ADDRESSBOOK_ROOT; + + } + + /** + * This method returns a node for a principal. + * + * The passed array contains principal information, and is guaranteed to + * at least contain a uri item. Other properties may or may not be + * supplied by the authentication backend. + * + * @param array $principal + * @return \SabreForRainLoop\DAV\INode + */ + public function getChildForPrincipal(array $principal) { + + return new UserAddressBooks($this->carddavBackend, $principal['uri']); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Backend/AbstractBackend.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Backend/AbstractBackend.php new file mode 100755 index 00000000..14504d6f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Backend/AbstractBackend.php @@ -0,0 +1,18 @@ +pdo = $pdo; + $this->addressBooksTableName = $addressBooksTableName; + $this->cardsTableName = $cardsTableName; + + } + + /** + * Returns the list of addressbooks for a specific user. + * + * @param string $principalUri + * @return array + */ + public function getAddressBooksForUser($principalUri) { + + $stmt = $this->pdo->prepare('SELECT id, uri, displayname, principaluri, description, ctag FROM '.$this->addressBooksTableName.' WHERE principaluri = ?'); + $stmt->execute(array($principalUri)); + + $addressBooks = array(); + + foreach($stmt->fetchAll() as $row) { + + $addressBooks[] = array( + 'id' => $row['id'], + 'uri' => $row['uri'], + 'principaluri' => $row['principaluri'], + '{DAV:}displayname' => $row['displayname'], + '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'], + '{http://calendarserver.org/ns/}getctag' => $row['ctag'], + '{' . CardDAV\Plugin::NS_CARDDAV . '}supported-address-data' => + new CardDAV\Property\SupportedAddressData(), + ); + + } + + return $addressBooks; + + } + + + /** + * Updates an addressbook's properties + * + * See SabreForRainLoop\DAV\IProperties for a description of the mutations array, as + * well as the return value. + * + * @param mixed $addressBookId + * @param array $mutations + * @see SabreForRainLoop\DAV\IProperties::updateProperties + * @return bool|array + */ + public function updateAddressBook($addressBookId, array $mutations) { + + $updates = array(); + + foreach($mutations as $property=>$newValue) { + + switch($property) { + case '{DAV:}displayname' : + $updates['displayname'] = $newValue; + break; + case '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' : + $updates['description'] = $newValue; + break; + default : + // If any unsupported values were being updated, we must + // let the entire request fail. + return false; + } + + } + + // No values are being updated? + if (!$updates) { + return false; + } + + $query = 'UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 '; + foreach($updates as $key=>$value) { + $query.=', `' . $key . '` = :' . $key . ' '; + } + $query.=' WHERE id = :addressbookid'; + + $stmt = $this->pdo->prepare($query); + $updates['addressbookid'] = $addressBookId; + + $stmt->execute($updates); + + return true; + + } + + /** + * Creates a new address book + * + * @param string $principalUri + * @param string $url Just the 'basename' of the url. + * @param array $properties + * @return void + */ + public function createAddressBook($principalUri, $url, array $properties) { + + $values = array( + 'displayname' => null, + 'description' => null, + 'principaluri' => $principalUri, + 'uri' => $url, + ); + + foreach($properties as $property=>$newValue) { + + switch($property) { + case '{DAV:}displayname' : + $values['displayname'] = $newValue; + break; + case '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' : + $values['description'] = $newValue; + break; + default : + throw new DAV\Exception\BadRequest('Unknown property: ' . $property); + } + + } + + $query = 'INSERT INTO ' . $this->addressBooksTableName . ' (uri, displayname, description, principaluri, ctag) VALUES (:uri, :displayname, :description, :principaluri, 1)'; + $stmt = $this->pdo->prepare($query); + $stmt->execute($values); + + } + + /** + * Deletes an entire addressbook and all its contents + * + * @param int $addressBookId + * @return void + */ + public function deleteAddressBook($addressBookId) { + + $stmt = $this->pdo->prepare('DELETE FROM ' . $this->cardsTableName . ' WHERE addressbookid = ?'); + $stmt->execute(array($addressBookId)); + + $stmt = $this->pdo->prepare('DELETE FROM ' . $this->addressBooksTableName . ' WHERE id = ?'); + $stmt->execute(array($addressBookId)); + + } + + /** + * Returns all cards for a specific addressbook id. + * + * This method should return the following properties for each card: + * * carddata - raw vcard data + * * uri - Some unique url + * * lastmodified - A unix timestamp + * + * It's recommended to also return the following properties: + * * etag - A unique etag. This must change every time the card changes. + * * size - The size of the card in bytes. + * + * If these last two properties are provided, less time will be spent + * calculating them. If they are specified, you can also ommit carddata. + * This may speed up certain requests, especially with large cards. + * + * @param mixed $addressbookId + * @return array + */ + public function getCards($addressbookId) { + + $stmt = $this->pdo->prepare('SELECT id, carddata, uri, lastmodified FROM ' . $this->cardsTableName . ' WHERE addressbookid = ?'); + $stmt->execute(array($addressbookId)); + + return $stmt->fetchAll(\PDO::FETCH_ASSOC); + + + } + + /** + * Returns a specfic card. + * + * The same set of properties must be returned as with getCards. The only + * exception is that 'carddata' is absolutely required. + * + * @param mixed $addressBookId + * @param string $cardUri + * @return array + */ + public function getCard($addressBookId, $cardUri) { + + $stmt = $this->pdo->prepare('SELECT id, carddata, uri, lastmodified FROM ' . $this->cardsTableName . ' WHERE addressbookid = ? AND uri = ? LIMIT 1'); + $stmt->execute(array($addressBookId, $cardUri)); + + $result = $stmt->fetchAll(\PDO::FETCH_ASSOC); + + return (count($result)>0?$result[0]:false); + + } + + /** + * Creates a new card. + * + * The addressbook id will be passed as the first argument. This is the + * same id as it is returned from the getAddressbooksForUser method. + * + * The cardUri is a base uri, and doesn't include the full path. The + * cardData argument is the vcard body, and is passed as a string. + * + * It is possible to return an ETag from this method. This ETag is for the + * newly created resource, and must be enclosed with double quotes (that + * is, the string itself must contain the double quotes). + * + * You should only return the ETag if you store the carddata as-is. If a + * subsequent GET request on the same card does not have the same body, + * byte-by-byte and you did return an ETag here, clients tend to get + * confused. + * + * If you don't return an ETag, you can just return null. + * + * @param mixed $addressBookId + * @param string $cardUri + * @param string $cardData + * @return string|null + */ + public function createCard($addressBookId, $cardUri, $cardData) { + + $stmt = $this->pdo->prepare('INSERT INTO ' . $this->cardsTableName . ' (carddata, uri, lastmodified, addressbookid) VALUES (?, ?, ?, ?)'); + + $result = $stmt->execute(array($cardData, $cardUri, time(), $addressBookId)); + + $stmt2 = $this->pdo->prepare('UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 WHERE id = ?'); + $stmt2->execute(array($addressBookId)); + + return '"' . md5($cardData) . '"'; + + } + + /** + * Updates a card. + * + * The addressbook id will be passed as the first argument. This is the + * same id as it is returned from the getAddressbooksForUser method. + * + * The cardUri is a base uri, and doesn't include the full path. The + * cardData argument is the vcard body, and is passed as a string. + * + * It is possible to return an ETag from this method. This ETag should + * match that of the updated resource, and must be enclosed with double + * quotes (that is: the string itself must contain the actual quotes). + * + * You should only return the ETag if you store the carddata as-is. If a + * subsequent GET request on the same card does not have the same body, + * byte-by-byte and you did return an ETag here, clients tend to get + * confused. + * + * If you don't return an ETag, you can just return null. + * + * @param mixed $addressBookId + * @param string $cardUri + * @param string $cardData + * @return string|null + */ + public function updateCard($addressBookId, $cardUri, $cardData) { + + $stmt = $this->pdo->prepare('UPDATE ' . $this->cardsTableName . ' SET carddata = ?, lastmodified = ? WHERE uri = ? AND addressbookid =?'); + $stmt->execute(array($cardData, time(), $cardUri, $addressBookId)); + + $stmt2 = $this->pdo->prepare('UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 WHERE id = ?'); + $stmt2->execute(array($addressBookId)); + + return '"' . md5($cardData) . '"'; + + } + + /** + * Deletes a card + * + * @param mixed $addressBookId + * @param string $cardUri + * @return bool + */ + public function deleteCard($addressBookId, $cardUri) { + + $stmt = $this->pdo->prepare('DELETE FROM ' . $this->cardsTableName . ' WHERE addressbookid = ? AND uri = ?'); + $stmt->execute(array($addressBookId, $cardUri)); + + $stmt2 = $this->pdo->prepare('UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 WHERE id = ?'); + $stmt2->execute(array($addressBookId)); + + return $stmt->rowCount()===1; + + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Card.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Card.php new file mode 100755 index 00000000..dba09ec6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Card.php @@ -0,0 +1,260 @@ +carddavBackend = $carddavBackend; + $this->addressBookInfo = $addressBookInfo; + $this->cardData = $cardData; + + } + + /** + * Returns the uri for this object + * + * @return string + */ + public function getName() { + + return $this->cardData['uri']; + + } + + /** + * Returns the VCard-formatted object + * + * @return string + */ + public function get() { + + // Pre-populating 'carddata' is optional. If we don't yet have it + // already, we fetch it from the backend. + if (!isset($this->cardData['carddata'])) { + $this->cardData = $this->carddavBackend->getCard($this->addressBookInfo['id'], $this->cardData['uri']); + } + return $this->cardData['carddata']; + + } + + /** + * Updates the VCard-formatted object + * + * @param string $cardData + * @return string|null + */ + public function put($cardData) { + + if (is_resource($cardData)) + $cardData = stream_get_contents($cardData); + + // Converting to UTF-8, if needed + $cardData = DAV\StringUtil::ensureUTF8($cardData); + + $etag = $this->carddavBackend->updateCard($this->addressBookInfo['id'],$this->cardData['uri'],$cardData); + $this->cardData['carddata'] = $cardData; + $this->cardData['etag'] = $etag; + + return $etag; + + } + + /** + * Deletes the card + * + * @return void + */ + public function delete() { + + $this->carddavBackend->deleteCard($this->addressBookInfo['id'],$this->cardData['uri']); + + } + + /** + * Returns the mime content-type + * + * @return string + */ + public function getContentType() { + + return 'text/x-vcard; charset=utf-8'; + + } + + /** + * Returns an ETag for this object + * + * @return string + */ + public function getETag() { + + if (isset($this->cardData['etag'])) { + return $this->cardData['etag']; + } else { + $data = $this->get(); + if (is_string($data)) { + return '"' . md5($data) . '"'; + } else { + // We refuse to calculate the md5 if it's a stream. + return null; + } + } + + } + + /** + * Returns the last modification date as a unix timestamp + * + * @return int + */ + public function getLastModified() { + + return isset($this->cardData['lastmodified'])?$this->cardData['lastmodified']:null; + + } + + /** + * Returns the size of this object in bytes + * + * @return int + */ + public function getSize() { + + if (array_key_exists('size', $this->cardData)) { + return $this->cardData['size']; + } else { + return strlen($this->get()); + } + + } + + /** + * Returns the owner principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getOwner() { + + return $this->addressBookInfo['principaluri']; + + } + + /** + * Returns a group principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getGroup() { + + return null; + + } + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + return array( + array( + 'privilege' => '{DAV:}read', + 'principal' => $this->addressBookInfo['principaluri'], + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}write', + 'principal' => $this->addressBookInfo['principaluri'], + 'protected' => true, + ), + ); + + } + + /** + * Updates the ACL + * + * This method will receive a list of new ACE's. + * + * @param array $acl + * @return void + */ + public function setACL(array $acl) { + + throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported'); + + } + + /** + * Returns the list of supported privileges for this node. + * + * The returned data structure is a list of nested privileges. + * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple + * standard structure. + * + * If null is returned from this method, the default privilege set is used, + * which is fine for most common usecases. + * + * @return array|null + */ + public function getSupportedPrivilegeSet() { + + return null; + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/IAddressBook.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/IAddressBook.php new file mode 100755 index 00000000..a8d74c6b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/IAddressBook.php @@ -0,0 +1,20 @@ +subscribeEvent('beforeGetProperties', array($this, 'beforeGetProperties')); + $server->subscribeEvent('afterGetProperties', array($this, 'afterGetProperties')); + $server->subscribeEvent('updateProperties', array($this, 'updateProperties')); + $server->subscribeEvent('report', array($this,'report')); + $server->subscribeEvent('onHTMLActionsPanel', array($this,'htmlActionsPanel')); + $server->subscribeEvent('onBrowserPostAction', array($this,'browserPostAction')); + $server->subscribeEvent('beforeWriteContent', array($this, 'beforeWriteContent')); + $server->subscribeEvent('beforeCreateFile', array($this, 'beforeCreateFile')); + + /* Namespaces */ + $server->xmlNamespaces[self::NS_CARDDAV] = 'card'; + + /* Mapping Interfaces to {DAV:}resourcetype values */ + $server->resourceTypeMapping['SabreForRainLoop\\CardDAV\\IAddressBook'] = '{' . self::NS_CARDDAV . '}addressbook'; + $server->resourceTypeMapping['SabreForRainLoop\\CardDAV\\IDirectory'] = '{' . self::NS_CARDDAV . '}directory'; + + /* Adding properties that may never be changed */ + $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}supported-address-data'; + $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}max-resource-size'; + $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}addressbook-home-set'; + $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}supported-collation-set'; + + $server->propertyMap['{http://calendarserver.org/ns/}me-card'] = 'SabreForRainLoop\\DAV\\Property\\Href'; + + $this->server = $server; + + } + + /** + * Returns a list of supported features. + * + * This is used in the DAV: header in the OPTIONS and PROPFIND requests. + * + * @return array + */ + public function getFeatures() { + + return array('addressbook'); + + } + + /** + * Returns a list of reports this plugin supports. + * + * This will be used in the {DAV:}supported-report-set property. + * Note that you still need to subscribe to the 'report' event to actually + * implement them + * + * @param string $uri + * @return array + */ + public function getSupportedReportSet($uri) { + + $node = $this->server->tree->getNodeForPath($uri); + if ($node instanceof IAddressBook || $node instanceof ICard) { + return array( + '{' . self::NS_CARDDAV . '}addressbook-multiget', + '{' . self::NS_CARDDAV . '}addressbook-query', + ); + } + return array(); + + } + + + /** + * Adds all CardDAV-specific properties + * + * @param string $path + * @param DAV\INode $node + * @param array $requestedProperties + * @param array $returnedProperties + * @return void + */ + public function beforeGetProperties($path, DAV\INode $node, array &$requestedProperties, array &$returnedProperties) { + + if ($node instanceof DAVACL\IPrincipal) { + + // calendar-home-set property + $addHome = '{' . self::NS_CARDDAV . '}addressbook-home-set'; + if (in_array($addHome,$requestedProperties)) { + $principalId = $node->getName(); + $addressbookHomePath = self::ADDRESSBOOK_ROOT . '/' . $principalId . '/'; + unset($requestedProperties[array_search($addHome, $requestedProperties)]); + $returnedProperties[200][$addHome] = new DAV\Property\Href($addressbookHomePath); + } + + $directories = '{' . self::NS_CARDDAV . '}directory-gateway'; + if ($this->directories && in_array($directories, $requestedProperties)) { + unset($requestedProperties[array_search($directories, $requestedProperties)]); + $returnedProperties[200][$directories] = new DAV\Property\HrefList($this->directories); + } + + } + + if ($node instanceof ICard) { + + // The address-data property is not supposed to be a 'real' + // property, but in large chunks of the spec it does act as such. + // Therefore we simply expose it as a property. + $addressDataProp = '{' . self::NS_CARDDAV . '}address-data'; + if (in_array($addressDataProp, $requestedProperties)) { + unset($requestedProperties[$addressDataProp]); + $val = $node->get(); + if (is_resource($val)) + $val = stream_get_contents($val); + + $returnedProperties[200][$addressDataProp] = $val; + + } + } + + if ($node instanceof UserAddressBooks) { + + $meCardProp = '{http://calendarserver.org/ns/}me-card'; + if (in_array($meCardProp, $requestedProperties)) { + + $props = $this->server->getProperties($node->getOwner(), array('{http://sabredav.org/ns}vcard-url')); + if (isset($props['{http://sabredav.org/ns}vcard-url'])) { + + $returnedProperties[200][$meCardProp] = new DAV\Property\Href( + $props['{http://sabredav.org/ns}vcard-url'] + ); + $pos = array_search($meCardProp, $requestedProperties); + unset($requestedProperties[$pos]); + + } + + } + + } + + } + + /** + * This event is triggered when a PROPPATCH method is executed + * + * @param array $mutations + * @param array $result + * @param DAV\INode $node + * @return bool + */ + public function updateProperties(&$mutations, &$result, DAV\INode $node) { + + if (!$node instanceof UserAddressBooks) { + return true; + } + + $meCard = '{http://calendarserver.org/ns/}me-card'; + + // The only property we care about + if (!isset($mutations[$meCard])) + return true; + + $value = $mutations[$meCard]; + unset($mutations[$meCard]); + + if ($value instanceof DAV\Property\IHref) { + $value = $value->getHref(); + $value = $this->server->calculateUri($value); + } elseif (!is_null($value)) { + $result[400][$meCard] = null; + return false; + } + + $innerResult = $this->server->updateProperties( + $node->getOwner(), + array( + '{http://sabredav.org/ns}vcard-url' => $value, + ) + ); + + $closureResult = false; + foreach($innerResult as $status => $props) { + if (is_array($props) && array_key_exists('{http://sabredav.org/ns}vcard-url', $props)) { + $result[$status][$meCard] = null; + $closureResult = ($status>=200 && $status<300); + } + + } + + return $result; + + } + + /** + * This functions handles REPORT requests specific to CardDAV + * + * @param string $reportName + * @param \DOMNode $dom + * @return bool + */ + public function report($reportName,$dom) { + + switch($reportName) { + case '{'.self::NS_CARDDAV.'}addressbook-multiget' : + $this->addressbookMultiGetReport($dom); + return false; + case '{'.self::NS_CARDDAV.'}addressbook-query' : + $this->addressBookQueryReport($dom); + return false; + default : + return; + + } + + + } + + /** + * This function handles the addressbook-multiget REPORT. + * + * This report is used by the client to fetch the content of a series + * of urls. Effectively avoiding a lot of redundant requests. + * + * @param \DOMNode $dom + * @return void + */ + public function addressbookMultiGetReport($dom) { + + $properties = array_keys(DAV\XMLUtil::parseProperties($dom->firstChild)); + + $hrefElems = $dom->getElementsByTagNameNS('urn:DAV','href'); + $propertyList = array(); + + foreach($hrefElems as $elem) { + + $uri = $this->server->calculateUri($elem->nodeValue); + list($propertyList[]) = $this->server->getPropertiesForPath($uri,$properties); + + } + + $prefer = $this->server->getHTTPPRefer(); + + $this->server->httpResponse->sendStatus(207); + $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); + $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); + $this->server->httpResponse->sendBody($this->server->generateMultiStatus($propertyList, $prefer['return-minimal'])); + + } + + /** + * This method is triggered before a file gets updated with new content. + * + * This plugin uses this method to ensure that Card nodes receive valid + * vcard data. + * + * @param string $path + * @param DAV\IFile $node + * @param resource $data + * @return void + */ + public function beforeWriteContent($path, DAV\IFile $node, &$data) { + + if (!$node instanceof ICard) + return; + + $this->validateVCard($data); + + } + + /** + * This method is triggered before a new file is created. + * + * This plugin uses this method to ensure that Card nodes receive valid + * vcard data. + * + * @param string $path + * @param resource $data + * @param DAV\ICollection $parentNode + * @return void + */ + public function beforeCreateFile($path, &$data, DAV\ICollection $parentNode) { + + if (!$parentNode instanceof IAddressBook) + return; + + $this->validateVCard($data); + + } + + /** + * Checks if the submitted iCalendar data is in fact, valid. + * + * An exception is thrown if it's not. + * + * @param resource|string $data + * @return void + */ + protected function validateVCard(&$data) { + + // If it's a stream, we convert it to a string first. + if (is_resource($data)) { + $data = stream_get_contents($data); + } + + // Converting the data to unicode, if needed. + $data = DAV\StringUtil::ensureUTF8($data); + + try { + + $vobj = VObject\Reader::read($data); + + } catch (VObject\ParseException $e) { + + throw new DAV\Exception\UnsupportedMediaType('This resource only supports valid vcard data. Parse error: ' . $e->getMessage()); + + } + + if ($vobj->name !== 'VCARD') { + throw new DAV\Exception\UnsupportedMediaType('This collection can only support vcard objects.'); + } + + if (!isset($vobj->UID)) { + // No UID in vcards is invalid, but we'll just add it in anyway. + $vobj->add('UID', DAV\UUIDUtil::getUUID()); + $data = $vobj->serialize(); + } + + } + + + /** + * This function handles the addressbook-query REPORT + * + * This report is used by the client to filter an addressbook based on a + * complex query. + * + * @param \DOMNode $dom + * @return void + */ + protected function addressbookQueryReport($dom) { + + $query = new AddressBookQueryParser($dom); + $query->parse(); + + $depth = $this->server->getHTTPDepth(0); + + if ($depth==0) { + $candidateNodes = array( + $this->server->tree->getNodeForPath($this->server->getRequestUri()) + ); + } else { + $candidateNodes = $this->server->tree->getChildren($this->server->getRequestUri()); + } + + $validNodes = array(); + foreach($candidateNodes as $node) { + + if (!$node instanceof ICard) + continue; + + $blob = $node->get(); + if (is_resource($blob)) { + $blob = stream_get_contents($blob); + } + + if (!$this->validateFilters($blob, $query->filters, $query->test)) { + continue; + } + + $validNodes[] = $node; + + if ($query->limit && $query->limit <= count($validNodes)) { + // We hit the maximum number of items, we can stop now. + break; + } + + } + + $result = array(); + foreach($validNodes as $validNode) { + + if ($depth==0) { + $href = $this->server->getRequestUri(); + } else { + $href = $this->server->getRequestUri() . '/' . $validNode->getName(); + } + + list($result[]) = $this->server->getPropertiesForPath($href, $query->requestedProperties, 0); + + } + + $prefer = $this->server->getHTTPPRefer(); + + $this->server->httpResponse->sendStatus(207); + $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); + $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); + $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result, $prefer['return-minimal'])); + + } + + /** + * Validates if a vcard makes it throught a list of filters. + * + * @param string $vcardData + * @param array $filters + * @param string $test anyof or allof (which means OR or AND) + * @return bool + */ + public function validateFilters($vcardData, array $filters, $test) { + + $vcard = VObject\Reader::read($vcardData); + + if (!$filters) return true; + + foreach($filters as $filter) { + + $isDefined = isset($vcard->{$filter['name']}); + if ($filter['is-not-defined']) { + if ($isDefined) { + $success = false; + } else { + $success = true; + } + } elseif ((!$filter['param-filters'] && !$filter['text-matches']) || !$isDefined) { + + // We only need to check for existence + $success = $isDefined; + + } else { + + $vProperties = $vcard->select($filter['name']); + + $results = array(); + if ($filter['param-filters']) { + $results[] = $this->validateParamFilters($vProperties, $filter['param-filters'], $filter['test']); + } + if ($filter['text-matches']) { + $texts = array(); + foreach($vProperties as $vProperty) + $texts[] = $vProperty->getValue(); + + $results[] = $this->validateTextMatches($texts, $filter['text-matches'], $filter['test']); + } + + if (count($results)===1) { + $success = $results[0]; + } else { + if ($filter['test'] === 'anyof') { + $success = $results[0] || $results[1]; + } else { + $success = $results[0] && $results[1]; + } + } + + } // else + + // There are two conditions where we can already determine whether + // or not this filter succeeds. + if ($test==='anyof' && $success) { + return true; + } + if ($test==='allof' && !$success) { + return false; + } + + } // foreach + + // If we got all the way here, it means we haven't been able to + // determine early if the test failed or not. + // + // This implies for 'anyof' that the test failed, and for 'allof' that + // we succeeded. Sounds weird, but makes sense. + return $test==='allof'; + + } + + /** + * Validates if a param-filter can be applied to a specific property. + * + * @todo currently we're only validating the first parameter of the passed + * property. Any subsequence parameters with the same name are + * ignored. + * @param array $vProperties + * @param array $filters + * @param string $test + * @return bool + */ + protected function validateParamFilters(array $vProperties, array $filters, $test) { + + foreach($filters as $filter) { + + $isDefined = false; + foreach($vProperties as $vProperty) { + $isDefined = isset($vProperty[$filter['name']]); + if ($isDefined) break; + } + + if ($filter['is-not-defined']) { + if ($isDefined) { + $success = false; + } else { + $success = true; + } + + // If there's no text-match, we can just check for existence + } elseif (!$filter['text-match'] || !$isDefined) { + + $success = $isDefined; + + } else { + + $success = false; + foreach($vProperties as $vProperty) { + // If we got all the way here, we'll need to validate the + // text-match filter. + $success = DAV\StringUtil::textMatch($vProperty[$filter['name']]->getValue(), $filter['text-match']['value'], $filter['text-match']['collation'], $filter['text-match']['match-type']); + if ($success) break; + } + if ($filter['text-match']['negate-condition']) { + $success = !$success; + } + + } // else + + // There are two conditions where we can already determine whether + // or not this filter succeeds. + if ($test==='anyof' && $success) { + return true; + } + if ($test==='allof' && !$success) { + return false; + } + + } + + // If we got all the way here, it means we haven't been able to + // determine early if the test failed or not. + // + // This implies for 'anyof' that the test failed, and for 'allof' that + // we succeeded. Sounds weird, but makes sense. + return $test==='allof'; + + } + + /** + * Validates if a text-filter can be applied to a specific property. + * + * @param array $texts + * @param array $filters + * @param string $test + * @return bool + */ + protected function validateTextMatches(array $texts, array $filters, $test) { + + foreach($filters as $filter) { + + $success = false; + foreach($texts as $haystack) { + $success = DAV\StringUtil::textMatch($haystack, $filter['value'], $filter['collation'], $filter['match-type']); + + // Breaking on the first match + if ($success) break; + } + if ($filter['negate-condition']) { + $success = !$success; + } + + if ($success && $test==='anyof') + return true; + + if (!$success && $test=='allof') + return false; + + + } + + // If we got all the way here, it means we haven't been able to + // determine early if the test failed or not. + // + // This implies for 'anyof' that the test failed, and for 'allof' that + // we succeeded. Sounds weird, but makes sense. + return $test==='allof'; + + } + + /** + * This event is triggered after webdav-properties have been retrieved. + * + * @return bool + */ + public function afterGetProperties($uri, &$properties) { + + // If the request was made using the SOGO connector, we must rewrite + // the content-type property. By default SabreDAV will send back + // text/x-vcard; charset=utf-8, but for SOGO we must strip that last + // part. + if (!isset($properties[200]['{DAV:}getcontenttype'])) + return; + + if (strpos($this->server->httpRequest->getHeader('User-Agent'),'Thunderbird')===false) { + return; + } + + if (strpos($properties[200]['{DAV:}getcontenttype'],'text/x-vcard')===0) { + $properties[200]['{DAV:}getcontenttype'] = 'text/x-vcard'; + } + + } + + /** + * This method is used to generate HTML output for the + * SabreForRainLoop\DAV\Browser\Plugin. This allows us to generate an interface users + * can use to create new calendars. + * + * @param DAV\INode $node + * @param string $output + * @return bool + */ + public function htmlActionsPanel(DAV\INode $node, &$output) { + + if (!$node instanceof UserAddressBooks) + return; + + $output.= '
+

Create new address book

+ +
+
+ +
+ '; + + return false; + + } + + /** + * This method allows us to intercept the 'mkcalendar' sabreAction. This + * action enables the user to create new calendars from the browser plugin. + * + * @param string $uri + * @param string $action + * @param array $postVars + * @return bool + */ + public function browserPostAction($uri, $action, array $postVars) { + + if ($action!=='mkaddressbook') + return; + + $resourceType = array('{DAV:}collection','{urn:ietf:params:xml:ns:carddav}addressbook'); + $properties = array(); + if (isset($postVars['{DAV:}displayname'])) { + $properties['{DAV:}displayname'] = $postVars['{DAV:}displayname']; + } + $this->server->createCollection($uri . '/' . $postVars['name'],$resourceType,$properties); + return false; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Property/SupportedAddressData.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Property/SupportedAddressData.php new file mode 100755 index 00000000..084c06f3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Property/SupportedAddressData.php @@ -0,0 +1,72 @@ + 'text/vcard', 'version' => '3.0'), + // array('contentType' => 'text/vcard', 'version' => '4.0'), + ); + } + + $this->supportedData = $supportedData; + + } + + /** + * Serializes the property in a DOMDocument + * + * @param DAV\Server $server + * @param \DOMElement $node + * @return void + */ + public function serialize(DAV\Server $server,\DOMElement $node) { + + $doc = $node->ownerDocument; + + $prefix = + isset($server->xmlNamespaces[CardDAV\Plugin::NS_CARDDAV]) ? + $server->xmlNamespaces[CardDAV\Plugin::NS_CARDDAV] : + 'card'; + + foreach($this->supportedData as $supported) { + + $caldata = $doc->createElementNS(CardDAV\Plugin::NS_CARDDAV, $prefix . ':address-data-type'); + $caldata->setAttribute('content-type',$supported['contentType']); + $caldata->setAttribute('version',$supported['version']); + $node->appendChild($caldata); + + } + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/UserAddressBooks.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/UserAddressBooks.php new file mode 100755 index 00000000..0970fe3d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/UserAddressBooks.php @@ -0,0 +1,260 @@ +carddavBackend = $carddavBackend; + $this->principalUri = $principalUri; + + } + + /** + * Returns the name of this object + * + * @return string + */ + public function getName() { + + list(,$name) = DAV\URLUtil::splitPath($this->principalUri); + return $name; + + } + + /** + * Updates the name of this object + * + * @param string $name + * @return void + */ + public function setName($name) { + + throw new DAV\Exception\MethodNotAllowed(); + + } + + /** + * Deletes this object + * + * @return void + */ + public function delete() { + + throw new DAV\Exception\MethodNotAllowed(); + + } + + /** + * Returns the last modification date + * + * @return int + */ + public function getLastModified() { + + return null; + + } + + /** + * Creates a new file under this object. + * + * This is currently not allowed + * + * @param string $filename + * @param resource $data + * @return void + */ + public function createFile($filename, $data=null) { + + throw new DAV\Exception\MethodNotAllowed('Creating new files in this collection is not supported'); + + } + + /** + * Creates a new directory under this object. + * + * This is currently not allowed. + * + * @param string $filename + * @return void + */ + public function createDirectory($filename) { + + throw new DAV\Exception\MethodNotAllowed('Creating new collections in this collection is not supported'); + + } + + /** + * Returns a single calendar, by name + * + * @param string $name + * @todo needs optimizing + * @return \AddressBook + */ + public function getChild($name) { + + foreach($this->getChildren() as $child) { + if ($name==$child->getName()) + return $child; + + } + throw new DAV\Exception\NotFound('Addressbook with name \'' . $name . '\' could not be found'); + + } + + /** + * Returns a list of addressbooks + * + * @return array + */ + public function getChildren() { + + $addressbooks = $this->carddavBackend->getAddressbooksForUser($this->principalUri); + $objs = array(); + foreach($addressbooks as $addressbook) { + $objs[] = new AddressBook($this->carddavBackend, $addressbook); + } + return $objs; + + } + + /** + * Creates a new addressbook + * + * @param string $name + * @param array $resourceType + * @param array $properties + * @return void + */ + public function createExtendedCollection($name, array $resourceType, array $properties) { + + if (!in_array('{'.Plugin::NS_CARDDAV.'}addressbook',$resourceType) || count($resourceType)!==2) { + throw new DAV\Exception\InvalidResourceType('Unknown resourceType for this collection'); + } + $this->carddavBackend->createAddressBook($this->principalUri, $name, $properties); + + } + + /** + * Returns the owner principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getOwner() { + + return $this->principalUri; + + } + + /** + * Returns a group principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getGroup() { + + return null; + + } + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + return array( + array( + 'privilege' => '{DAV:}read', + 'principal' => $this->principalUri, + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}write', + 'principal' => $this->principalUri, + 'protected' => true, + ), + + ); + + } + + /** + * Updates the ACL + * + * This method will receive a list of new ACE's. + * + * @param array $acl + * @return void + */ + public function setACL(array $acl) { + + throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported'); + + } + + /** + * Returns the list of supported privileges for this node. + * + * The returned data structure is a list of nested privileges. + * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple + * standard structure. + * + * If null is returned from this method, the default privilege set is used, + * which is fine for most common usecases. + * + * @return array|null + */ + public function getSupportedPrivilegeSet() { + + return null; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/VCFExportPlugin.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/VCFExportPlugin.php new file mode 100755 index 00000000..081bdd22 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/VCFExportPlugin.php @@ -0,0 +1,108 @@ +server = $server; + $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90); + + } + + /** + * 'beforeMethod' event handles. This event handles intercepts GET requests ending + * with ?export + * + * @param string $method + * @param string $uri + * @return bool + */ + public function beforeMethod($method, $uri) { + + if ($method!='GET') return; + if ($this->server->httpRequest->getQueryString()!='export') return; + + // splitting uri + list($uri) = explode('?',$uri,2); + + $node = $this->server->tree->getNodeForPath($uri); + + if (!($node instanceof IAddressBook)) return; + + // Checking ACL, if available. + if ($aclPlugin = $this->server->getPlugin('acl')) { + $aclPlugin->checkPrivileges($uri, '{DAV:}read'); + } + + $this->server->httpResponse->setHeader('Content-Type','text/directory'); + $this->server->httpResponse->sendStatus(200); + + $nodes = $this->server->getPropertiesForPath($uri, array( + '{' . Plugin::NS_CARDDAV . '}address-data', + ),1); + + $this->server->httpResponse->sendBody($this->generateVCF($nodes)); + + // Returning false to break the event chain + return false; + + } + + /** + * Merges all vcard objects, and builds one big vcf export + * + * @param array $nodes + * @return string + */ + public function generateVCF(array $nodes) { + + $output = ""; + + foreach($nodes as $node) { + + if (!isset($node[200]['{' . Plugin::NS_CARDDAV . '}address-data'])) { + continue; + } + $nodeData = $node[200]['{' . Plugin::NS_CARDDAV . '}address-data']; + + // Parsing this node so VObject can clean up the output. + $output .= + VObject\Reader::read($nodeData)->serialize(); + + } + + return $output; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Version.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Version.php new file mode 100755 index 00000000..d3ce9816 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Version.php @@ -0,0 +1,26 @@ +currentUser; + } + + + /** + * Authenticates the user based on the current request. + * + * If authentication is successful, true must be returned. + * If authentication fails, an exception must be thrown. + * + * @param DAV\Server $server + * @param string $realm + * @throws DAV\Exception\NotAuthenticated + * @return bool + */ + public function authenticate(DAV\Server $server, $realm) { + + $auth = new HTTP\BasicAuth(); + $auth->setHTTPRequest($server->httpRequest); + $auth->setHTTPResponse($server->httpResponse); + $auth->setRealm($realm); + $userpass = $auth->getUserPass(); + if (!$userpass) { + $auth->requireLogin(); + throw new DAV\Exception\NotAuthenticated('No basic authentication headers were found'); + } + + // Authenticates the user + if (!$this->validateUserPass($userpass[0],$userpass[1])) { + $auth->requireLogin(); + throw new DAV\Exception\NotAuthenticated('Username or password does not match'); + } + $this->currentUser = $userpass[0]; + return true; + } + + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/AbstractDigest.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/AbstractDigest.php new file mode 100755 index 00000000..ca642c6c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/AbstractDigest.php @@ -0,0 +1,101 @@ +setHTTPRequest($server->httpRequest); + $digest->setHTTPResponse($server->httpResponse); + + $digest->setRealm($realm); + $digest->init(); + + $username = $digest->getUsername(); + + // No username was given + if (!$username) { + $digest->requireLogin(); + throw new DAV\Exception\NotAuthenticated('No digest authentication headers were found'); + } + + $hash = $this->getDigestHash($realm, $username); + // If this was false, the user account didn't exist + if ($hash===false || is_null($hash)) { + $digest->requireLogin(); + throw new DAV\Exception\NotAuthenticated('The supplied username was not on file'); + } + if (!is_string($hash)) { + throw new DAV\Exception('The returned value from getDigestHash must be a string or null'); + } + + // If this was false, the password or part of the hash was incorrect. + if (!$digest->validateA1($hash)) { + $digest->requireLogin(); + throw new DAV\Exception\NotAuthenticated('Incorrect username'); + } + + $this->currentUser = $username; + return true; + + } + + /** + * Returns the currently logged in username. + * + * @return string|null + */ + public function getCurrentUser() { + + return $this->currentUser; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/Apache.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/Apache.php new file mode 100755 index 00000000..be19a681 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/Apache.php @@ -0,0 +1,63 @@ +httpRequest->getRawServerValue('REMOTE_USER'); + if (is_null($remoteUser)) { + throw new DAV\Exception('We did not receive the $_SERVER[REMOTE_USER] property. This means that apache might have been misconfigured'); + } + + $this->remoteUser = $remoteUser; + return true; + + } + + /** + * Returns information about the currently logged in user. + * + * If nobody is currently logged in, this method should return null. + * + * @return array|null + */ + public function getCurrentUser() { + + return $this->remoteUser; + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/BackendInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/BackendInterface.php new file mode 100755 index 00000000..1193489d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/BackendInterface.php @@ -0,0 +1,36 @@ +loadFile($filename); + + } + + /** + * Loads an htdigest-formatted file. This method can be called multiple times if + * more than 1 file is used. + * + * @param string $filename + * @return void + */ + public function loadFile($filename) { + + foreach(file($filename,FILE_IGNORE_NEW_LINES) as $line) { + + if (substr_count($line, ":") !== 2) + throw new DAV\Exception('Malformed htdigest file. Every line should contain 2 colons'); + + list($username,$realm,$A1) = explode(':',$line); + + if (!preg_match('/^[a-zA-Z0-9]{32}$/', $A1)) + throw new DAV\Exception('Malformed htdigest file. Invalid md5 hash'); + + $this->users[$realm . ':' . $username] = $A1; + + } + + } + + /** + * Returns a users' information + * + * @param string $realm + * @param string $username + * @return string + */ + public function getDigestHash($realm, $username) { + + return isset($this->users[$realm . ':' . $username])?$this->users[$realm . ':' . $username]:false; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/PDO.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/PDO.php new file mode 100755 index 00000000..7e8e31d6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/PDO.php @@ -0,0 +1,65 @@ +pdo = $pdo; + $this->tableName = $tableName; + + } + + /** + * Returns the digest hash for a user. + * + * @param string $realm + * @param string $username + * @return string|null + */ + public function getDigestHash($realm,$username) { + + $stmt = $this->pdo->prepare('SELECT username, digesta1 FROM '.$this->tableName.' WHERE username = ?'); + $stmt->execute(array($username)); + $result = $stmt->fetchAll(); + + if (!count($result)) return; + + return $result[0]['digesta1']; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Plugin.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Plugin.php new file mode 100755 index 00000000..ade6a5f7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Plugin.php @@ -0,0 +1,112 @@ +authBackend = $authBackend; + $this->realm = $realm; + + } + + /** + * Initializes the plugin. This function is automatically called by the server + * + * @param DAV\Server $server + * @return void + */ + public function initialize(DAV\Server $server) { + + $this->server = $server; + $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'),10); + + } + + /** + * Returns a plugin name. + * + * Using this name other plugins will be able to access other plugins + * using DAV\Server::getPlugin + * + * @return string + */ + public function getPluginName() { + + return 'auth'; + + } + + /** + * Returns the current users' principal uri. + * + * If nobody is logged in, this will return null. + * + * @return string|null + */ + public function getCurrentUser() { + + $userInfo = $this->authBackend->getCurrentUser(); + if (!$userInfo) return null; + + return $userInfo; + + } + + /** + * This method is called before any HTTP method and forces users to be authenticated + * + * @param string $method + * @param string $uri + * @throws SabreForRainLoop\DAV\Exception\NotAuthenticated + * @return bool + */ + public function beforeMethod($method, $uri) { + + $this->authBackend->authenticate($this->server,$this->realm); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/GuessContentType.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/GuessContentType.php new file mode 100755 index 00000000..c787fdda --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/GuessContentType.php @@ -0,0 +1,99 @@ + 'image/jpeg', + 'gif' => 'image/gif', + 'png' => 'image/png', + + // groupware + 'ics' => 'text/calendar', + 'vcf' => 'text/x-vcard', + + // text + 'txt' => 'text/plain', + + ); + + /** + * Initializes the plugin + * + * @param DAV\Server $server + * @return void + */ + public function initialize(DAV\Server $server) { + + // Using a relatively low priority (200) to allow other extensions + // to set the content-type first. + $server->subscribeEvent('afterGetProperties',array($this,'afterGetProperties'),200); + + } + + /** + * Handler for teh afterGetProperties event + * + * @param string $path + * @param array $properties + * @return void + */ + public function afterGetProperties($path, &$properties) { + + if (array_key_exists('{DAV:}getcontenttype', $properties[404])) { + + list(, $fileName) = DAV\URLUtil::splitPath($path); + $contentType = $this->getContentType($fileName); + + if ($contentType) { + $properties[200]['{DAV:}getcontenttype'] = $contentType; + unset($properties[404]['{DAV:}getcontenttype']); + } + + } + + } + + /** + * Simple method to return the contenttype + * + * @param string $fileName + * @return string + */ + protected function getContentType($fileName) { + + // Just grabbing the extension + $extension = strtolower(substr($fileName,strrpos($fileName,'.')+1)); + if (isset($this->extensionMap[$extension])) + return $this->extensionMap[$extension]; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/MapGetToPropFind.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/MapGetToPropFind.php new file mode 100755 index 00000000..3792252b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/MapGetToPropFind.php @@ -0,0 +1,57 @@ +server = $server; + $this->server->subscribeEvent('beforeMethod',array($this,'httpGetInterceptor')); + } + + /** + * This method intercepts GET requests to non-files, and changes it into an HTTP PROPFIND request + * + * @param string $method + * @param string $uri + * @return bool + */ + public function httpGetInterceptor($method, $uri) { + + if ($method!='GET') return true; + + $node = $this->server->tree->getNodeForPath($uri); + if ($node instanceof DAV\IFile) return; + + $this->server->invokeMethod('PROPFIND',$uri); + return false; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/Plugin.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/Plugin.php new file mode 100755 index 00000000..d19ba58e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/Plugin.php @@ -0,0 +1,491 @@ + 'icons/file', + 'SabreForRainLoop\\DAV\\ICollection' => 'icons/collection', + 'SabreForRainLoop\\DAVACL\\IPrincipal' => 'icons/principal', + 'SabreForRainLoop\\CalDAV\\ICalendar' => 'icons/calendar', + 'SabreForRainLoop\\CardDAV\\IAddressBook' => 'icons/addressbook', + 'SabreForRainLoop\\CardDAV\\ICard' => 'icons/card', + ); + + /** + * The file extension used for all icons + * + * @var string + */ + public $iconExtension = '.png'; + + /** + * reference to server class + * + * @var SabreForRainLoop\DAV\Server + */ + protected $server; + + /** + * enablePost turns on the 'actions' panel, which allows people to create + * folders and upload files straight from a browser. + * + * @var bool + */ + protected $enablePost = true; + + /** + * By default the browser plugin will generate a favicon and other images. + * To turn this off, set this property to false. + * + * @var bool + */ + protected $enableAssets = true; + + /** + * Creates the object. + * + * By default it will allow file creation and uploads. + * Specify the first argument as false to disable this + * + * @param bool $enablePost + * @param bool $enableAssets + */ + public function __construct($enablePost=true, $enableAssets = true) { + + $this->enablePost = $enablePost; + $this->enableAssets = $enableAssets; + + } + + /** + * Initializes the plugin and subscribes to events + * + * @param DAV\Server $server + * @return void + */ + public function initialize(DAV\Server $server) { + + $this->server = $server; + $this->server->subscribeEvent('beforeMethod',array($this,'httpGetInterceptor')); + $this->server->subscribeEvent('onHTMLActionsPanel', array($this, 'htmlActionsPanel'),200); + if ($this->enablePost) $this->server->subscribeEvent('unknownMethod',array($this,'httpPOSTHandler')); + } + + /** + * This method intercepts GET requests to collections and returns the html + * + * @param string $method + * @param string $uri + * @return bool + */ + public function httpGetInterceptor($method, $uri) { + + if ($method !== 'GET') return true; + + // We're not using straight-up $_GET, because we want everything to be + // unit testable. + $getVars = array(); + parse_str($this->server->httpRequest->getQueryString(), $getVars); + + if (isset($getVars['sabreAction']) && $getVars['sabreAction'] === 'asset' && isset($getVars['assetName'])) { + $this->serveAsset($getVars['assetName']); + return false; + } + + try { + $node = $this->server->tree->getNodeForPath($uri); + } catch (DAV\Exception\NotFound $e) { + // We're simply stopping when the file isn't found to not interfere + // with other plugins. + return; + } + if ($node instanceof DAV\IFile) + return; + + $this->server->httpResponse->sendStatus(200); + $this->server->httpResponse->setHeader('Content-Type','text/html; charset=utf-8'); + + $this->server->httpResponse->sendBody( + $this->generateDirectoryIndex($uri) + ); + + return false; + + } + + /** + * Handles POST requests for tree operations. + * + * @param string $method + * @param string $uri + * @return bool + */ + public function httpPOSTHandler($method, $uri) { + + if ($method!='POST') return; + $contentType = $this->server->httpRequest->getHeader('Content-Type'); + list($contentType) = explode(';', $contentType); + if ($contentType !== 'application/x-www-form-urlencoded' && + $contentType !== 'multipart/form-data') { + return; + } + $postVars = $this->server->httpRequest->getPostVars(); + + if (!isset($postVars['sabreAction'])) + return; + + if ($this->server->broadcastEvent('onBrowserPostAction', array($uri, $postVars['sabreAction'], $postVars))) { + + switch($postVars['sabreAction']) { + + case 'mkcol' : + if (isset($postVars['name']) && trim($postVars['name'])) { + // Using basename() because we won't allow slashes + list(, $folderName) = DAV\URLUtil::splitPath(trim($postVars['name'])); + $this->server->createDirectory($uri . '/' . $folderName); + } + break; + case 'put' : + if ($_FILES) $file = current($_FILES); + else break; + + list(, $newName) = DAV\URLUtil::splitPath(trim($file['name'])); + if (isset($postVars['name']) && trim($postVars['name'])) + $newName = trim($postVars['name']); + + // Making sure we only have a 'basename' component + list(, $newName) = DAV\URLUtil::splitPath($newName); + + if (is_uploaded_file($file['tmp_name'])) { + $this->server->createFile($uri . '/' . $newName, fopen($file['tmp_name'],'r')); + } + break; + + } + + } + $this->server->httpResponse->setHeader('Location',$this->server->httpRequest->getUri()); + $this->server->httpResponse->sendStatus(302); + return false; + + } + + /** + * Escapes a string for html. + * + * @param string $value + * @return string + */ + public function escapeHTML($value) { + + return htmlspecialchars($value,ENT_QUOTES,'UTF-8'); + + } + + /** + * Generates the html directory index for a given url + * + * @param string $path + * @return string + */ + public function generateDirectoryIndex($path) { + + $version = ''; + if (DAV\Server::$exposeVersion) { + $version = DAV\Version::VERSION ."-". DAV\Version::STABILITY; + } + + $html = " + + Index for " . $this->escapeHTML($path) . "/ - SabreDAV " . $version . " + + "; + + if ($this->enableAssets) { + $html.=''; + } + + $html .= " + +

Index for " . $this->escapeHTML($path) . "/

+ + + "; + + $files = $this->server->getPropertiesForPath($path,array( + '{DAV:}displayname', + '{DAV:}resourcetype', + '{DAV:}getcontenttype', + '{DAV:}getcontentlength', + '{DAV:}getlastmodified', + ),1); + + $parent = $this->server->tree->getNodeForPath($path); + + + if ($path) { + + list($parentUri) = DAV\URLUtil::splitPath($path); + $fullPath = DAV\URLUtil::encodePath($this->server->getBaseUri() . $parentUri); + + $icon = $this->enableAssets?'Parent':''; + $html.= " + + + + + + "; + + } + + foreach($files as $file) { + + // This is the current directory, we can skip it + if (rtrim($file['href'],'/')==$path) continue; + + list(, $name) = DAV\URLUtil::splitPath($file['href']); + + $type = null; + + + if (isset($file[200]['{DAV:}resourcetype'])) { + $type = $file[200]['{DAV:}resourcetype']->getValue(); + + // resourcetype can have multiple values + if (!is_array($type)) $type = array($type); + + foreach($type as $k=>$v) { + + // Some name mapping is preferred + switch($v) { + case '{DAV:}collection' : + $type[$k] = 'Collection'; + break; + case '{DAV:}principal' : + $type[$k] = 'Principal'; + break; + case '{urn:ietf:params:xml:ns:carddav}addressbook' : + $type[$k] = 'Addressbook'; + break; + case '{urn:ietf:params:xml:ns:caldav}calendar' : + $type[$k] = 'Calendar'; + break; + case '{urn:ietf:params:xml:ns:caldav}schedule-inbox' : + $type[$k] = 'Schedule Inbox'; + break; + case '{urn:ietf:params:xml:ns:caldav}schedule-outbox' : + $type[$k] = 'Schedule Outbox'; + break; + case '{http://calendarserver.org/ns/}calendar-proxy-read' : + $type[$k] = 'Proxy-Read'; + break; + case '{http://calendarserver.org/ns/}calendar-proxy-write' : + $type[$k] = 'Proxy-Write'; + break; + } + + } + $type = implode(', ', $type); + } + + // If no resourcetype was found, we attempt to use + // the contenttype property + if (!$type && isset($file[200]['{DAV:}getcontenttype'])) { + $type = $file[200]['{DAV:}getcontenttype']; + } + if (!$type) $type = 'Unknown'; + + $size = isset($file[200]['{DAV:}getcontentlength'])?(int)$file[200]['{DAV:}getcontentlength']:''; + $lastmodified = isset($file[200]['{DAV:}getlastmodified'])?$file[200]['{DAV:}getlastmodified']->getTime()->format(\DateTime::ATOM):''; + + $fullPath = DAV\URLUtil::encodePath('/' . trim($this->server->getBaseUri() . ($path?$path . '/':'') . $name,'/')); + + $displayName = isset($file[200]['{DAV:}displayname'])?$file[200]['{DAV:}displayname']:$name; + + $displayName = $this->escapeHTML($displayName); + $type = $this->escapeHTML($type); + + $icon = ''; + + if ($this->enableAssets) { + $node = $this->server->tree->getNodeForPath(($path?$path.'/':'') . $name); + foreach(array_reverse($this->iconMap) as $class=>$iconName) { + + if ($node instanceof $class) { + $icon = ''; + break; + } + + + } + + } + + $html.= " + + + + + + "; + + } + + $html.= ""; + + $output = ''; + + if ($this->enablePost) { + $this->server->broadcastEvent('onHTMLActionsPanel',array($parent, &$output)); + } + + $html.=$output; + + $html.= "
NameTypeSizeLast modified

$icon..[parent]
$icon{$displayName}{$type}{$size}{$lastmodified}

+
Generated by SabreDAV " . $version . " (c)2007-2013 http://code.google.com/p/sabredav/
+ + "; + + return $html; + + } + + /** + * This method is used to generate the 'actions panel' output for + * collections. + * + * This specifically generates the interfaces for creating new files, and + * creating new directories. + * + * @param DAV\INode $node + * @param mixed $output + * @return void + */ + public function htmlActionsPanel(DAV\INode $node, &$output) { + + if (!$node instanceof DAV\ICollection) + return; + + // We also know fairly certain that if an object is a non-extended + // SimpleCollection, we won't need to show the panel either. + if (get_class($node)==='SabreForRainLoop\\DAV\\SimpleCollection') + return; + + $output.= '
+

Create new folder

+ + Name:
+ +
+
+

Upload file

+ + Name (optional):
+ File:
+ +
+ '; + + } + + /** + * This method takes a path/name of an asset and turns it into url + * suiteable for http access. + * + * @param string $assetName + * @return string + */ + protected function getAssetUrl($assetName) { + + return $this->server->getBaseUri() . '?sabreAction=asset&assetName=' . urlencode($assetName); + + } + + /** + * This method returns a local pathname to an asset. + * + * @param string $assetName + * @return string + */ + protected function getLocalAssetPath($assetName) { + + $assetDir = __DIR__ . '/assets/'; + $path = $assetDir . $assetName; + + // Making sure people aren't trying to escape from the base path. + if (strpos(realpath($path), realpath($assetDir)) === 0) { + return $path; + } + throw new DAV\Exception\Forbidden('Path does not exist, or escaping from the base path was detected'); + } + + /** + * This method reads an asset from disk and generates a full http response. + * + * @param string $assetName + * @return void + */ + protected function serveAsset($assetName) { + + $assetPath = $this->getLocalAssetPath($assetName); + if (!file_exists($assetPath)) { + throw new DAV\Exception\NotFound('Could not find an asset with this name'); + } + // Rudimentary mime type detection + switch(strtolower(substr($assetPath,strpos($assetPath,'.')+1))) { + + case 'ico' : + $mime = 'image/vnd.microsoft.icon'; + break; + + case 'png' : + $mime = 'image/png'; + break; + + default: + $mime = 'application/octet-stream'; + break; + + } + + $this->server->httpResponse->setHeader('Content-Type', $mime); + $this->server->httpResponse->setHeader('Content-Length', filesize($assetPath)); + $this->server->httpResponse->setHeader('Cache-Control', 'public, max-age=1209600'); + $this->server->httpResponse->sendStatus(200); + $this->server->httpResponse->sendBody(fopen($assetPath,'r')); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/favicon.ico b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/favicon.ico new file mode 100755 index 0000000000000000000000000000000000000000..2b2c10a22cc7a57c4dc5d7156f184448f2bee92b GIT binary patch literal 4286 zcmc&&O-NKx6uz%14NNBzA}E}JHil3^6a|4&P_&6!RGSD}1rgCAC@`9dTC_@vqNoT8 z0%;dQR0K_{iUM;bf#3*%o1h^C2N7@IH_nmc?Va~t5U6~f`_BE&`Of`&_n~tUev3uN zziw!)bL*XR-2hy!51_yCgT8fb3s`VC=e=KcI5&)PGGQlpSAh?}1mK&Pg8c>z0Y`y$ zAT_6qJ%yV?|0!S$5WO@z3+`QD17OyXL4PyiM}RavtA7Tu7p)pn^p7Ks@m6m7)A}X$ z4Y+@;NrHYq_;V@RoZ|;69MPx!46Ftg*Tc~711C+J`JMuUfYwNBzXPB9sZm3WK9272 z&x|>@f_EO{b3cubqjOyc~J3I$d_lHIpN}q z!{kjX{c{12XF=~Z$w$kazXHB!b53>u!rx}_$e&dD`xNgv+MR&p2yN1xb0>&9t@28Z zV&5u#j_D=P9mI#){2s8@eGGj(?>gooo<%RT14>`VSZ&_l6GlGnan=^bemD56rRN{? zSAqZD$i;oS9SF6#f5I`#^C&hW@13s_lc3LUl(PWmHcop2{vr^kO`kP(*4!m=3Hn3e#Oc!a2;iDn+FbXzcOHEQ zbXZ)u93cj1WA=KS+M>jZ=oYyXq}1?ZdsjsX0A zkJXCvi~cfO@2ffd7r^;>=SsL-3U%l5HRoEZ#0r%`7%&% ziLTXJqU*JeXt3H5`AS#h(dpfl+`Ox|)*~QS%h&VO!d#)!>r3U5_YsDi2fY6Sd&vw% literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/addressbook.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/addressbook.png new file mode 100755 index 0000000000000000000000000000000000000000..c9acc84172dad59708b6b298b310b8d29eeeb671 GIT binary patch literal 7232 zcmeHMXH=70vktu%m8u{iNEJu|p@k-dEbh;oQp! z004N*&5Ug6PsrAvofQCJ0J8kPi!O*#jGZWUL@!DZii8CiV2GYrpt(N^hqc9`Fu^B& z$Li3XlkoOV6epx598L6BMs3+BQ~d+z-T;7(J~aS^_Qg_wo>&~7pbMI-s0IP?7+sK~ z8WMsGKw!P`W~WG4yHi&7=u^IEEeuFsk5h*Vrvvz7DJUS--;Y3sQ*}YxxN!P<>ophz z+%}>3>Vm!{<%F~bB8Vg`5T>l6tfGX5sH+0iRFzfLRMb^qia-?zL=z0r0INcjpqg-q z8XN`%e*b~=IDtAOj2GP2$mDxCx}*#8rceUlU~o`SkaCc!GLeJ>L$$QDzz`L%ii#55 zLWvwqprEKq1hUi?#5W8hEE!G02T<@t0&oixr=z>6WJ@7j?2K@s&Aduv@jf_Eq zv3^*8EP+A>LzSW6o%VDlZ1Fg63i*c{f&86iI^SR_DuC_+0h6|E{^l9rO{5UX-o$`^ z_WYsV_TL%OJb;3R(c^9r`oovLEA)1 zN5s+d$KcTvEQUfv6TQ5!SY-@$JAofL!3_c_-b51Fnn=cPu}SA}i)5e<1`YqV)ot+` z>jr+5Z_+o>55Gk<+z&;->4K&f4Xf4 z*@?Opg@UK}VRyv%Go$a__mho-f4Ygk@O1vF+EFt7eA{D5{^b9!NI%8a+1W>M#5WER zMEbcxQ_Klo#O-7AcN@F`hGa~opfIFAkJbOyBk+{qpKERDlW4o4eu8d|CSvGq|Ls8h z12~2BGjMyXpCge(pGp7dYwVB0|0n%X(x2Mxf_>}29Rr14jc@PhgNi;Q!9RxNw=(VM z?f=Sho2~x}@($2{gX|#V*UNwD`ZY&8EdHfy2N}O!{!7=dIoe_IFI_vx`1SH%x_-^k z4vYUp7w2EsEG&V3w+f&Lv``pA3oHbg@?#%M;1t1p-E2-|c|#H-_R1@JzcNBq&XcTyD{j<6UEo zI0B^10yQ<)ne~ii-I(2&&uI#3*c>cE#4F`4kjf9Yf_ZrA9}M*e%!^mAR}E$zo9Zu3 zORdt;YtL*^N_oifn?F+u*|JG0gxkI3G?lUOvJIf`xLe&LM~@;G2ok9*GlYr@Go9q^ zEz`#}@G`i`7&#X(r(J-?mH-)D<>Cgao26JlhL$0DkE{zbmf-K(&|l=DD*83q#uQGU zBfS~GLtVKIm&%cnvH3DXpH6YX+nd@SWMv({*9pmf$($M!medu{2S+`*XCh6t-wjlCNsFC~wA ztcbPif81a*Yr3ti?%Lg-nYeKf;M-OF)`;J@?PY=n6fA4v!4Y!-RK&GE!e|%E#rOE^ zoFOK;>>L^svjrm2h{sHx(ZWK2#aNC-Iyotq$HA~D8yWs;GH{Czl&W$vSX9co>CY_Jx^p$*HJ(W=11 z2PK+Q^PIpqE{Q$`e^qZ}9+2ghQRIQ~E)V}@K_6kS`C%KoxHO#-#55!NTr9BH z$Gf;zV1y&|YokQx-X0?N;CZI65bn4U4me(v9v zt~$4NQ0?3rdSimd1&!>(WtET&)ww0Fc3t+>j11iq;<6g?d`;6m(?o-v--hwhsT@)D z0tIfwG=F`%g`|b}Fj5F8rtn%b=Q*N4c476cdco@zbJ{%maeVAa3Aft*j9lATg{8YasCtKb*)A6 z&p)mOy?*~>Rz>8ALTwmBci{43pegY-Rz z@eqaDI>U++PdYkRyrs|SG9%{4tSuE@XNM|3erf14y>^dbo%`=<#-XIL;5_gIA^7h8{BBuh8QFCLWCMz zjybw8t#D>`diqPK?x2S16YVFy=Uha*f^b!zgR4JJ1ZT}vGx=G3Onb-tVMfdR7D0dD z`glZQZoz|4cc%WQut~kEYa)eZXSH#>_lm0s76*KCRHhC+4HUTh7P+wZx$aU#-1PwD zSw(J?U7Ia5Q(8A&im4#q-#hZkl`FX)bHqF}g8`PDLh%P9%#Y3|7lfHZ&tmX5;&hWT z<5fx_3!1T4E*<_n0Pc)>)%JSuOcLRfI-%tzZ;gP!lL*7d())_#@^@3z?2K^hXQMez zmDt>^G}ZL42){nsmzQ~bTugJ`1R|Rsv0yNHf_;8B=k-ptG#j-&17x9xZl-tKyA+#6 ztpovzDJU_K53r$#T&zg?0a^a6-O5L(t?|buEi^7SuU@r^ia5%0=)partDxHpgbYVJ zf7*m%AIoR4_ci_L>MqZ+*&Gus1R1Cu%z!(p(e54?)BHFeZReqE|p;9|xOx#=mi9BR2G+bFNE z-l%Yn{d&pegCmMktsLdiG9F(%KkR?98FB?ye>(quR3lC}e?WDi>cbomAm@FBzd$g^ zV;Gwwu)@-|QaU>tzvM-TZ+$#1$T~4m^(w?f*!&T{%)ZSN@d_#2fI@5Rm8uEfOL0E93XfHpv@9<(lpR4mCW=Wvos2vP=RffHC{UD;WbfFVr5`q+#U0o}O{-IJS~eAv(asK`d^)1aHQ ziy$S$GkI8i4v*0tgFSBcLh-pWdJsuP?pNabJmX@Z_2OKk=(*Z@o+mKR5yN;JSh0YO z;_LHf?tcg;o|L=R`eA^auo>D~-ub>gnZ&aogPZNsR-M?G+g#spUS#6M*q%}`oxWOC zeSONjTSg*?%f^N&jiG)pQcJJ-=+ayFwkTSC&8&4Qaq3x))DfvNqQv#nS&JAl^B7b(Tia2WaO$md0D6JDpTV=dCihh zQ4IexnVGqpv4g8h+U=%}z6rv`flBeFYR&i{J@Lk9WM+$=Dcj=aFB+24EdQMu1Z35i3S>ORB({g=d7Sfc(FkLfW`1UO z{)U`pu+|%A1{9(x2s#>kQGEY6mjQOyW35MuUrjoDTz&Cr=j$yJ%f!y>222$-wGR#^ zPN>LNhJplQ3fd3rD)m~H=?JTcNmm6(GWiC#@iqmIk{%gyHD^6lw7tt zhMhcptW>Ps#OeK11)H|fL)fJ|=F`I?@r=te)Adow=3hu^^>w4s zs9r~e!tV^N-`jWDP0kaCJGkt1WnrBrilEV4XHRx~iV?{UMKtsA@Ek2{pXlE0kR$8K zvUgsr*wQ{^erT2u61=e2S;I*CS-d4bT4LYe&2Z2R+NOWD&k|R#};cqIY8^5>EQfcq87f$;c)(zU)I@Er+1@JoG9p za9q{*!gAy(yOu~ku$Py95#Ec`?GJ;Omy3r6Q~g@+Je)1x%Tl~Q%D9&QWWh;Vh-wC- zOV=yUyC*dJXWMyT-U3!~it`e2?`E=SeW8nCPUFMoJ(mdqi$ZMzi+PbsS?Ln`$rt&C z22GC)MK|$t@NY4UO}@4o{^JomDd#w}qr&tsN2Ce$^FHtM``!2b+`s4fUDtck$-!DgP+AZK z0*Tlh*ze5wM{NA~`9L5p$hHm%5Qz5?(ba?IVQ+`VQ$k@l0>vMI(L=*HQ6P{Jh8~8) zhX6E)KM+VH8$;Q3O;8AtU<`HFwMW>8SpY%A12I&KFqB+kSui;S0W(Y0B7;3gb2=TCYf>=vNBJfmV7>&pw-N3~8 zQzB``P$*{}@?$x;FlS<55G~>-1v%mm<2V+=>9{bsHVgr$ZpOg>migav{v1re|BMZb zq>?rlK)}NR5)cZIX%QR_?JaN);g%k>JK*m^!_hVaekS{qD1jV#1R|aW5NH%UB_IF* zU<6>3i<67C=ahtiqv7^*GL4}eiw(38+FD4Yt2P3S&_ipZG!WWo1Y*-8h!Fvg#!~?t zjY8e<><`ymfbgx+mWd>yi6e;^1yCWb(KsrB5*-mjG=gu~$(h;8+8q5zGlKsOb%TZQ zpGy3R$&5t%E7L|%&?Fo=&=^YBA^-unND>Wd!Y*in*y9KQgi}Tw=LxT%tVlOA+`IvF zJSj4QBM%Zlp+a0jaS=g8av&!t5Enxv1OFuS2kWNLzYE(C8xiRr4B-Eewz(P2ae;po zYC^=^_85;xCr|hjlCTPp6P0W$PX1baQ$O{AY9F41TsJfXwMh zR8I4mLhO%;Pg5k5nOR-Tdcx6XN4R2$6lk6VHpVUe3;E-_E^l z;WvaTDoU-bF1J9GmD?cd>W@L*>GEeVKAk$;TWsH{xI5X?bzYQL47CPO7l5 z5ZvG24+e41nenL!Cz(oqPcyHbc%VVUvkR@m&uhl=QQqwp{9VZNc>ELdR;+XGIVS8i z7X#ASnX~?4lH%(Av>N}mv_pJ5_ObB!%i%mNHT41lHFHmWO%BsNnV~Y)XJ=OOf-3fk zwwSuw#$6q~oE2CBR_p;MG4d3O3TZC3b=)f z?%4ef>b~PcF(TJb?iLkfuMHWDe+eKSFisLGms@6*-%SzSU4m|ZI*9vfV$35Z?P9s_ z5}2=Ib}^yc^_~Bd8Rpj|zjJ$K=iY!+uo)i|VX^x~iHZpVyDZP7x*X2twh$DKJKp)( z2kw6GgE8L7esT)Qb>Tr( z9~+tndeS6(A`%>gHQC0hnDpG4a`j{Aduz4YDCCG^iN3zz)g)Fyfx|L90rp1bdXl%Y zyUK~Ei6NRKl;(cL^HNGscg=^^sLE%FyI~!%3h=7B zzszfnFp9c81oKP0C;anLqlfT^WPY1Z@7{s4JZJc5don3}Xh*wKc9qr01boh0X+-zr z-qf9*1w-|Y*FK@7JEW($S3f3=?#nlTGX>o zt(ig!wA>)%ps~lJw{NHHdL&-|VuBEU;_^bKN){=e-{_*9Qhv9FU;F#;R|PkE4)WVM z=HwJY51A>IesjE?+ILM(w!LRQOy5=DdDTD#_rgkCirx#5w|MSzRP~eG*YVei^U7Xc z@2{#@#=_rszahJG@g*g&G=ccRN0CQLUk1ly`R!v#T*v|A`7e}>QcL5Ds}Y5&?%#%{ zzTCZX>D}3tp_2ZU=(^l05g}L9Q|&iO`OUnzx40nvcAq(>PhSw~;ph5%l=1mEf#$g7 z@?r@~+^U}K&dhgLQ=A8Rcl#fy6*uz<=qY-=drm~sPhpAAyl(2XCGD-PLIw-wlM1PL zW}AeEFkz_4g;nyns7_l7;f!T0?t)?Ttnql>%J@p-XEwfP{r$*-6e+(pXH{FgGKt!o zDC*O6Zc(6eCLuU4zDA7u{L-6OLap6}QbDP{FmVwZWURR%d zA)jN{@_V&v=4G!I=!boXA}=H9HQX za=Ol`$kPr_kk=(;)$e(AbsZcL%<9CZ9xHXVJ(>DdYTOfc9wxuSKQ2y+Kz5ef;}}j= zm-RY!>Anw#Akxz&Xy5Mh+ZLT25<=s7lW`A0Df-2gvUYqeJ)%I0`IQ!l>D`Y^RCb^8 zynUl9z@@s{OY88>K3(Hz880-S-r9N#Nt77PFL(qtN)?V&kT3EcErwIw^NP{ zeNb4ET>U~W2{+9xQO-KaOq-TCxJcOEhB$M}C+RoSz8aPCSmmr9^>zRkDVLAUY<7|o@!c4td_gCN@+g! zCSG5xp{c)j!CKiPdoR)~7CrtTtp=nuH4MO}^Hv#&f_JF8fr(3ko`nr6DHXwim#9i- zcH?gJNB-vYRtT%6nZ*Phy@^U*31-w)(-{I|MfFTP&tt$|LzN7FwOz^9R|@3QHI-5G zTG!6AgaQo(YUuzM#{h)@4JzPIgn!;bQ1U2WFyl8(ZqYWEu|Lq3YR_~Zwlau0bM zVQ((GR&hm0E&l8dR*NMD^K#jJ+qp&Elk1>PBPOb#0?ebqQ4ulFIg;sj=3v3uvCm*T9iJ>!a>etUgsb!o&U zspnei)pt2djm+ zC|Tti+{zZKG{1J%A>Zgn6zH_Lif%tEkaeT7L! zR3$sXM`KHcZb3!$O!dLd!eK^6Mt8FI><G75RR_~_31AY4R>1)BBS#x|MpEfUkf*zmlzFecJsHpfVWoCLB zyw@?Gt6=OnP7ynk$d&&31>XnubtAEnk{~MexewOfWvE@IZh|FmWMZPnEB3jjvC-Gh zAPT@@o4o`FK^7-@8Z)wkX=wutKbHozw4qn=U0q$@7~t_;^UD|H^OlWg2f*WT&tJV_ zk|-2!nbR2=-rMDFl4F#U7}e1lJmkcFBVND25%a<>(FzG+E!|S9v=aFFR#24it$UAjtSmRU4DWYZp&MOpC4>2 VG`ly3;d~;1Y%Cr2-!R7}{u}gUbfEwM literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/card.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/card.png new file mode 100755 index 0000000000000000000000000000000000000000..2ce954866d853edb737a7e281de221f7846846f6 GIT binary patch literal 5695 zcmeHLdpMN&7ay0fZjDGHnIU_zPvqiXLJR^Cf~{zk;|Xg)J1@|U9t5%pOaNj{q6Y#nCn|vq-~j?D zD!diI@|=%S+`T|A7iSESPSqnU+URkp44yXxg0qmazu zo<=T67lthmOmU260&daU-HFkmL{k#n(n1o;!SDd607!sws9`h~hGP!r<6?O0#n%Wp zjBf&ln!}fp@^W#7+0vN+%uvrj&p?-mG)BRUP_3L%N#^ii5M*Ew2sWFo$42SVnPh~%si`RfX@D>=(B)a^ zvZ81pful=fZCr#{!oUG6B9p=ZDRdfa5t9%|j{wc#aGoCa5u8L^#%4q?!}!P~A_52l zr~nOQA@ue15rXzSCh!z;FvwbVqp?1+%;OuuAuxC@NCcB_^O+|jm=4le!F0yodoHW_ z{(>Q$7$DJ*7k81+WnbQ|i2P((APFI8!FT7^X({@0!Wd5=&q%(Ol z>2H1Qs07MC={=aAwETiCb)djN;ZvN}EdGfu$-k~y0F8IIV)HIh z5{E|(ArJ{WC!DoA=P{UeStb?<6;XwS#%;;LNbQ}{CM7#|?9Xh32Dh%x3TtD+4p}NX z=P33;*+id>O0iGPc83m}%^N~*wua<4LyK_8p+k!J`?_)c}(WuGwGA@!ezR_oo+Od{B|q6241IjlJgdO zt0-DJLWQ6S$lE}Psp!!rN*<=Kx7=v*sanVQU?~tKKQ9K)+6f(AnY>P8K1pf#TqeBS z$Vqb#QNlAhwEXRph1E7nj+({eIjq7oeeFw^ARD9$ScuTq;*aYf_cHWln_$v*hrBQ& zVybQRkK{?ER}xT2L#||ZYfIr%*xgm%ohRO9jr5sc06l^D+Jk(!J-KhFTSUGjL^WK!sA+18ml0HpUiCAi%da1ixGAcTjB}ST<6|c^O zb;Vjdzop!GveBdU$c$xEG{o0xpU>7~^yrB?6!Iu*93$O?E8aIC^GhRcLjuKH(doGC z>g>#i`DLb~d%7dmo&#@oN8I$V@l#0CH&zpB(caUa5C@Z_AA>t;`qo}S#BKDns84A& zktlJp&Cn}0>mFqbanu~f=u7SW=ts7#i9_@eilO9@bm=aYe?khhFtg%k-MKB2QxH5&9dJ%BoUAv9<>+K z&!i+MxZT|9@WNE%=1ECpD+IjSo$Fm`lAXsSzc$_`Q8D7beUrKS=9H#9tA5cz@-zSJ ztyNdD&YeeuJ|~@lF^h(OGlz>j(wK~pb2<{61@xBK&W$9|T{>SKSO2bb(`g&OtP%DA zSDX9ZwR_qkoml4}`3K`XTB<&#>#7D6*Wi)|UD<%YW&@pE`LJijg{Ef5S5@gJ>|$)n zj%rk$h8I0@tT!%BTo{C!<@=lp`1OV<&F`siSjOE0BNma|_VK=(xxE|Ls0yV+7B-=O z=m_3H7&6yJKijn16Ir=>-HiidZ=^#X(rR`nK>FoG zN~@eDM8L5!cP+`l7kRHz1{K!D7eQik+D6=!^V?NCwRY zd4*hGrygYw%hs9nJLmK_ z&D@&!ISrcJ+5EvCQkavY^)y$uLcCzGQXyPa;);)+Z%Jp=Bz8hax`~|In?Enk3BF@? z&%35i)iK4Q_;pj@Wr^2gt08j@=Z9+iE4#Uqz4DfzNv<;}_ReO{+l-83CtIBIPdTy=p?FxkVsl{i?s8V`{<&J} zd&Sef7bsM?L{moBE_j?(U<-m*@mDS{9d0Ww#M?RUh}QgLv-llgMDdZ)(OIJZMiEXAELrv z`K@ze{)cl57I`gKme=kVBbx&L#O06>H(N9R#EEb$-IT@vZ7O7i3cHSe)Sxw-sPw@l~2F-b$rpmHb^+G_g^smmN*w zLHndv&MEb0CKi{MkFs>@YPc5ma<1QH>m3Dc%7ndO2G8%|j+5UUAI9V)btp4?bEBy2 z8n(6fn3%Cp_vy5vLD9^&Ej}v)gcG2br#O4hDyNySR+ySvq&LeydAJ*jABP)&$qY^P zW^2yc2^uAkCea|`C9#I5`xL!XU5M9nr!PFUcqO@;g4J)(rE4uS4W-RH!KrD>nonw?_3 z-{*F+?e3#yLgQT_RW;EA`%Bcm@0wRkKe2TLxc=m+MvcR^Hai_#>zD$46R(reH$M=t z>)F<6JuzkG3uWEEzaGrDt?frTyKHh4IrgT}e6RdZPsT&%9hpZIj@^s&IrVr-6P=$U&LPIV iv*os~CbdYl&#K_=OkBmrhgdFt(si=ij;pWxEzMhwDg6VRB9Bbk!O z6tW@c#N~iA9v>u-KoWsq0uoKBtI5n{}YsCay6 zXecgpHIB45La^gu2Pk;h~+gfLUcWpMrcU>L`Qr@4?^ zsuNNYCM1NckxX+eVll;tKr|we+=&D#flMVD8xV+80%6)C(2U8TGWakg9duh6)1MX80*Pk(rsS>Cv||GyLCBr&ySORpJLGTA=V} zrm3P(10fE}94j(n!hTS2pb%>@c&Zw7f|xLflo3Ln7|V56h-ho4e_#8jQ-s& zzd$I28_fSNvx09LcmJct?A`0Q3wm*e z`r?VnFDmKiCBuXFJooSP4*}5gRtywBz3qeGUmH}Mtd5LTuaQb6O%3@sYx9blBsI;A zlExZ^^pW9bCUwadsyU_q`ZA={G*Tl`6spRN&H3$BZ*Qcc;iN?*V?=h*$S;1fRzOvg zjx40UKgPN3tm+bUKvGRcm|>Yy13P6EO366rn9RIDhtr4DCd@2ZL505eHF3AQ{I=N7 z_jjkWkMSlR7@ryWaG*i!S3!YTDG*XJ@b9UP)|cl+qwZ`%t<(=+x(`xU&|`0nk3JZ^ znm1clS#tZfLY}W5a~(Z*$qio`fl$hywQpZacC%KC^Qx;3SD2J7Z`+$cow$>C+IqvA z?RR-)3IsXds1@arpAx(cVtXzr)_BcVd~V-bUKY>5^sNxQ(tKZ<tM9$5tdWz%ej0ez^ya?f6Uo&{%mXC{m5-D|#M})nH&YH-de-MQ_7o1- z#CD#)h-GilV$|^-wK4g~F|==SXVAR;kpJOJ1QJh|oFtLRE%fX| z6QYi#L~SE1SFVxVR-KodqG8#ke`e#DwxLZ(TjPcNUV+ccwwC;%P~eLCW!nG}$^T5* z2KCN+25ld-C9`res#RIF2P5tNTFFQKZl)nOJ3ud(wWUs zigV_31!`Y>wXYA;a?fF$(=%0GqwWNR=hK#(^eg1=iA+9BvdZsrMKSZFgBQm?$NQu` z8ZI~ectr(JHJI%V2a*>8RF)v5JGOae_N$Wm${=X$hi-;9sN)kvM_4=Pfs=| zS6fzbZGnxWj`*s@zJp#mRncNO44E8)p~G)x#}$pp#DF0V_ifP^|3taUb;iljLK-u= zA6bT$8xsfkC2wEwO#~I!zKmC8__u1;#63TLz6lka$q6`+BpOakz5ZZrZ}=A#73X%3 z({QtIxVNXrh(9j^5Q#4!7NNWO(CB>_QSo7(eHhPOeUC z?V^-SvGAl$U%2WnSuJ;3uuJhX*QK-%=kK-0b(|&s4!GIP?Z1h-aVs>vOUAkGm^gR36sr&_zj%NG!0qfsPSSWYtzWaqIns?Yya)Zez_}3HkrU=7y$!KPW zZqo*AUyHJ*^w{93gBM1h74AJPqoQZOtK4%?yY{_CD1T+9OuhO?(MDGYTIw*KlH3>b zk{(_!kE{DF^KfdIM`vPMhm!umMB}U?x0K|j^mm>bN1vDvM4ldQnvU{wMbGop6+;X3O=sODx{wXdGn!#Iowd2S3j=3v%!vAF1s^TonKOpMr4QroDy zquS4he|@yd1iv=v5>ENHRZ|4FXT>M&JyMF^WMy~ zw<@-N9+-ID5_^>URu8zEs0$dnY|E(MuOEe5*(a%}q7^4R-GMnWm~Y3pugtL=B#07U zXtoU}A4b&&Fjh&IkTl%00j+p_z%KoqL-6H zsy0St$fopeoNbs^0c&p6~Uw>GXW; zOnr}u;fk}!A*9*X0m+VuA=cNgd}=IGkJO6S`nCFi_>?27XD9XAi>;K9$g&uxo*Iv% zN0vCW6uK=7Ymg@KEN`Tq0*&i*<@zl0-FwdV`f-&ABBYP9l zmiYvvoml12_ApZyNX5#l7|GAe=qHVnpNUhum)mVcXL~&dyBYC$&+{kjvMrxjRlfHa z=*~;8`n4bAQ>(4E_l(})VnJ}E-H#ZyGF=R`%OK2VpUn?#rMG@{Z-l*1a~S z1#>P&^t~(6`?%86zGjT^@;pwC}Q1RrXH8pScuyuG^&BCf5knD@5o zK&{USOy%2DN>RroTCx-MxT4oq7D$qmE~dBEt;$#{8h6o>mjZQNW$3K>`0h!3+Z^?0 zq#?|y0K3Zesv@7I_q+ol(sUCW*PZ(!&TCuIQtx%>IL6+g8JE!i^75e35Vq1nvVQz++X-2Na-jNuQTP-uom}bmOGfQTu9TlY;TkVum z;*bjI!YPtVa*0h_yQ|zQicoe*?XuSpyE>ioJZC-6thN62f8YDQ|NH&__e{Kp`${d% zxtag~Xt}yLd7@9U@`qCc01P;#b~*rHYxrzm#Mf;VgChv%45-EkfBHh`XNCAh=B`mkqWXc&RKp2cb zpgc?{k}>2g!Wb?CeOG=a5x}t!M8G20D+xhgHxJNJEQLWDkz&aqTP*=;Hbm-Dstw)7 z0(29LKzoT4BvU~unY;v~EM-{PFsyCB&lkZ~6J$!cAq-Ea6`vW=5sMItAQA?N6cG_Y zjIbh#r92XaPN$Q|R1%eHiAGq;6e0wYTZ&{RN{Dd`Cs@Xj@+Al#B~@ZV!Qya)MIfN_ z;KXtui6@^IipVA@M6%Dup%#+lkc31bl1b9B7}7VH|2yZ)U@m7eRuV21jxB)8A;Cg8 z3>G0Wl!G!3juMXRVfetoUI>JY1xzLf3&lKC9+%HSU@ju&h(khPn8=04xX@gN8(I=B zgg{PcCX0YtOt&OcEU8pBh0Gw^Feo&0GKE1Vk9h<#xf}*Z3PXrks`Tu$YhLiC@zJ=6 zLcZ;4A%8P01=$ghlq-&q3HVHs(oS?{JZo$;k;Wu_gQ{fV{!@uBnCykf*G$TyFockZ z$0Eorxo`*+E<^~n0~w{D8^nb{w2Tn?#xY)CBDY^Qc7x>{VYm#H2Zo5HpjQ|q3+0P= zXb=yIb@J5*PS=!iUbbxqY3$^8Q#3I?(=#zGZ2%*j5aOr=U zl}%_2`>w`Gl!+>Xh!`BN^VfjmqX}hWi}_Nxav|fp_Ww7$;*9ce(!pQ__#dSQzo+6W zOaEaV5B=g4qEg1cp{E<|Eu_ijf(|Cz6D&e|k`!$|{n#~4XyclLIQt@A;t&MgelRfJ zV_Z@5U{4t0DmK-^OaPeDuKi z(&CWpjmOsQtr2w2>c76os!MO>Zd~@+fphg(f}aGx)P_KmV|7e|d`h-{(CbSd9%vhF zD-g`C@IGm~^*x?y6f)b$$f(kL+o!)U$40xV@ob+MB!+$Q;zep%A2)_S`lfgGV>2B9 z2hQ>-i5k`pru^}+Y(wx;#cNYXHhY%IDy=k10QI-Puy3raN~UJp(EI4je@<`VZ1?HVUK1>j=z9~ zl{0=f)Ri^teW7EQA8LJxp6vPl;CvP5(@r}mAB(9vX%?D)md|UCdeRjAi)V_}+@8Lp z<--RKwdQm!dA#D~+`h&nBG9rObL#GJ`OLCY*<82y(=%=Ca^Kva>j<>o>W_nTc9+v$ zsNwXY*CZaHb&-yW@e%gyZIQ z)%t;po`#$EpHyEF*Xd?z;`)+cyR-cdmmg~j?&S?J&*!SFN`tMJ>kYRSAD3;5aQ#Ii zR{NI2+Xp~teVKTnKK^9hrkBZ>1kONW?f{S@C>#n|_`;ai=yQcbzlq zS~HTLQzFs0=pWLDpVNzG7v0@QCT}%0UKDCq8QM1b+p+FOU4xc{)j9aq!g%3Ri@MHd z3bpF1Bb03<&FQmrcKOn=%ih)$<$>b7F#jcPcR2cSf=#=#u@$u{ih+?cf|O@bZNnd7 zgKA!(%1y%tjCajQ(0yx{R}nH%;C6GMm|1x2rGl zWlUuHy>q<6=1a1)o@~uoR0lQK{6UTpm3ma}uX76XE8A|^kq#>M#}dueH?m4DTuN4r zx5~gRX5)G^25RslhBCNg*)i`y`%H2nt(LsUp>ijM#;*G4VZT~;Af@(#cA-jy_jK*I zUOQv_b7x@Q&<^*cspF=MEX1k`>{O8WH66uqwwAFHxtI6d1*D>Wy$EXVlTxk4Wqu8f z7pSbP89Cbr-Hi*kUw)Ki{CfEcgCxP`7w;Z!dA%oSTc)KECZ(XTSuFb{z@tEIWSp8j6-6W8K(M@5_M zzM(ap>AgjFUdfp&hob@i^-&!S%)^__m?ce)TcZPr$q<4Xd?BHHSI3IyO0DU()TXl(gK1eqCMlT5UAa%-vKs*e z{1f4!PyJ0*MUPbL)dU&7_9Lq@1gY)9cQZ`ZT7hdl{S1!vUE5%}_BJ6sJyyrpsY-CI z*LF*lK$;-lW$ky-w+=Ms&LPicKhRG>`;bXD&CR(v|9MK|Ky|y%;EDyN%xC)aYr1&`JU!`) zU`3-!RzOL*K6r~#TZ=CUG47?UtS$+c&%6n=q;a(zkC;{Ty<{g*)hWBOG^q9KmSxpt ze|j9eKR3^y1z4}zR2x?ALSLU0aFj~G5oFA%A#gxM$>ZYQhTOKRZqbjE>~73kxI^Tg zm}+D?;NE)t8bh(^J};-Md&W6t`*ob+{rStcW``Q%lQLXv%9Q_RU7g*X@*Fm7{~MA6 BY2g3> literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/parent.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/parent.png new file mode 100755 index 0000000000000000000000000000000000000000..156fa64fd50f15d9e838326d42d68feba2c23c3b GIT binary patch literal 3474 zcmb7H2{=@1A3sx*ElZmr6{pFPFk2dCvP~gNlqE}xoS8YsL^ES%F!9N9n-C#MNxEne zBBg~(j5Sk9R1{fSrMg$$D9Z93RJZPTzwddzInT^F?|J|K-|zSS{_p#Lo{8V=yg^Ap zLjeE)C3`z-SL9BZ`pU@w01BKVoeu!$Cbqkm(93BfmBHPOgP2@8j1%qVAyEKeW+~!9 zi~v{&(qR^xV~!oHsK$b9ra9JgjT6C%w;uLq+lBFAw=idSMpyuY!o*ryD42<;2*7Sw z2!W#AfgAxxEzMhwDg6VRB9Bbk!O z6tW@c#N~iA9v>u-KoWsq0uoKBtI5n{}YsCay6 zXecgpHIB45La^gu2Pk;h~+gfLUcWpMrcU>L`Qr@4?^ zsuNNYCM1NckxX+eVll;tKr|we+=&D#flMVD8xV+80%6)C(2U8TGWakg9duh6)1MX80*Pk(rsS>Cv||GyLCBr&ySORpJLGTA=V} zrm3P(10fE}94j(n!hTS2pb%>@c&Zw7f|xLflo3Ln7|V56h-ho4e_#8jQ-s& zzd$I28_fSNvx09LcmJct?A`0Q3wm*e z`r?VnFDmKiCBuXFJooSP4*}5gRtywBz3qeGUmH}Mtd5LTuaQb6O%3@sYx9blBsI;A zlExZ^^pW9bCUwadsyU_q`ZA={G*Tl`6spRN&H3$BZ*Qcc;iN?*V?=h*$S;1fRzOvg zjx40UKgPN3tm+bUKvGRcm|>Yy13P6EO366rn9RIDhtr4DCd@2ZL505eHF3AQ{I=N7 z_jjkWkMSlR7@ryWaG*i!S3!YTDG*XJ@b9UP)|cl+qwZ`%t<(=+x(`xU&|`0nk3JZ^ znm1clS#tZfLY}W5a~(Z*$qio`fl$hywQpZacC%KC^Qx;3SD2J7Z`+$cow$>C+IqvA z?RR-)3IsXds1@arpAx(cVtXzr)_BcVd~V-bUKY>5^sNxQ(tKZ<tM9$5tdWz%ej0ez^ya?f6Uo&{%mXC{m5-D|#M})nH&YH-de-MQ_7o1- z#CD#)h-GilV$|^-wK4g~F|==SXVAR;kpJOJ1QJh|oFtLRE%fX| z6QYi#L~SE1SFVxVR-KodqG8#ke`e#DwxLZ(TjPcNUV+ccwwC;%P~eLCW!nG}$^T5* z2KCN+25ld-C9`res#RIF2P5tNTFFQKZl)nOJ3ud(wWUs zigV_31!`Y>wXYA;a?fF$(=%0GqwWNR=hK#(^eg1=iA+9BvdZsrMKSZFgBQm?$NQu` z8ZI~ectr(JHJI%V2a*>8RF)v5JGOae_N$Wm${=X$hi-;9sN)kvM_4=Pfs=| zS6fzbZGnxWj`*s@zJp#mRncNO44E8)p~G)x#}$pp#DF0V_ifP^|3taUb;iljLK-u= zA6bT$8xsfkC2wEwO#~I!zKmC8__u1;#63TLz6lka$q6`+BpOakz5ZZrZ}=A#73X%3 z({QtIxVNXrh(9j^5Q#4!7NNWO(CB>_QSo7(eHhPOeUC z?V^-SvGAl$U%2WnSuJ;3uuJhX*QK-%=kK-0b(|&s4!GIP?Z1h-aVs>vOUAkGm^gR36sr&_zj%NG!0qfsPSSWYtzWaqIns?Yya)Zez_}3HkrU=7y$!KPW zZqo*AUyHJ*^w{93gBM1h74AJPqoQZOtK4%?yY{_CD1T+9OuhO?(MDGYTIw*KlH3>b zk{(_!kE{DF^KfdIM`vPMhm!umMB}U?x0K|j^mm>bN1vDvM4ldQnvU{wMbGop6+;X3O=sODx{wXdGn!#Iowd2S3j=3v%!vAF1s^TonKOpMr4QroDy zquS4he|@yd1iv=v5>ENHRZ|4FXT>M&JyMF^WMy~ zw<@-N9+-ID5_^>URu8zEs0$dnY|E(MuOEe5*(a%}q7^4R-GMnWm~Y3pugtL=B#07U zXtoU}A4b&&Fjh&IkTl%00j+p_z%KoqL-6H zsy0St$fopeoNbs^0c&p6~Uw>GXW; zOnr}u;fk}!A*9*X0m+VuA=cNgd}=IGkJO6S`nCFi_>?27XD9XAi>;K9$g&uxo*Iv% zN0vCW6uK=7Ymg@KEN`Tq0*&i*<@zl0-FwdV`f-&ABBYP9l zmiYvvoml12_ApZyNX5#l7|GAe=qHVnpNUhum)mVcXL~&dyBYC$&+{kjvMrxjRlfHa z=*~;8`n4bAQ>(4E_l(})VnJ}E-H#ZyGF=R`%OK2VpUn?#rMG@{Z-l*1a~S z1#>P&^t~(6`?%86zGjT^@;pwC}Q1RrXH8pScuyuG^&BCf5knD@5o zK&{USOy%2DN>RroTCx-MxT4oq7D$qmE~dBEt;$#{8h6o>mjZQNW$3K>`0h!3+Z^?0 zq#?|y0K3Zesv@7I_q+ol(sUCW*PZ(!&TCuIQtx%>IL6+g8JE!i^75``Y6gr#$Vf>RpCKLvN z^z@Wgh%9j~V?{(G(ZN9^8k~#+r8YQ0GFRda0Ax=A7o;UY2qpnyvN-P8;j`zl7#7_f zyL?eFA(-m}C9?c7cu;u8(g<2c63vy4_4Lpn3rG@xWC#H|IEN zMI=Xi%=;hKLjyzR(HW#L>f-m|B$7Ke5ka^lJU%Tg4VUJCgLzE6y{oG$oUVFczU!rZ_2oL0;H z&5t^eUu9VPeU&*d$vSj%P9WQSobC=a=D*AN7q~%aTI07QFjZNbuuwkYoe>#hX zKy(DA!3+ij;pmVof$5w`lvE@U=J7*dK1<4`ghMIG7&4tkn%b&NoMN5AMy8}Gkc;vsT7Ri^K?+A#O%>REy`Xn}4zK=*gQyluhl5<5v{5cF*c5FVjVNvKj zUjYKrc^{6|f9ri%NcyL>VUkHCYp744htOcUr0u5;#NU7;yib8gKzV~|BzLPc$t6mCu;ISHTOg@8{`1v`W!_A;zE{UtDEr zWmQzGgfqu3{F+s9ezhnZa2)Z9uFly_+2XbaSRA()h1LeQ%&&Ta2PA<^aue(oO@qP85~&ePYGTyx|%5fgoi~uQi^> z^R~lr#QqcJ9`=+ib7xnz%$~dZ(#8E~<6(XZPiMH$_!Ml?JJ6rtbw!X2C~!EOMyL41 z-v0ivmTOnq+Am#F4`QP_Mhe0h8NZ5|?KO3W-!!Cjs8aOMy5sXFJX8AT#T`)B&>#fW zxbD<`wpV0`12&Y+{k{Meex?3e$;QU!mcJ4v$8TxiUPS|M4XSc}dtiW{(Zr;vuD!$36|9bDk{df1+vF6yo{oS3n4FqdohLjw_`5~{?3hM@%4|Xg-TL<{!O54QXQz7JRVWFg}t9!8~JKOWQ zXT$280Ugww0mhTe$9;WZJdLKd-;~kNxBIDXL_kvgLD9N(f|+G{RN;<4&mB8hEZn+a z+3YxvY)Whl6NGL$-)81KwT}IPb3++5b4S$3MoP7|K-3wHW^b(cq+{x2V4&ZIg?(=#W?0>RtB8i22g=Mf#Bi7Z;Qg%I8uy z*SJIR4Cq4fut#HiS#`znyk{DP`QOH`zcljnPSW~OyLiaeYxg{rZNc>=*5$S#6 z$DhrKGs_ges@%z*nI(Rk)O@Yryvm;X-SyNTRcbufHvzWR=#hhc1O460))F6`PN|DY z3N-G<8bnv+8mVk<3D`e5IeDrxy2})>S8_tJLtXkDs_SdLBZDEVnwznb8v)mu!!o08 z7^@cU@7;4z%`E)kNXGcUL9#`|B&23EE;ehpb-DTai0G=h~gE@oaLKP&CrKmLvQXGSLUx*u87evamzB<=YVdFE$c6=%+IIj zb(*XE*lGwo=q*;Z1ER)M`pb3R5s5^UVf$+Om}t;B)R!2drR3M%)xq=tY%(cF401Bm znz2|^8m9-u7y=s&RCQ@I)%Zd4l*@;n%^BA+O8oYV; zmSUuz`b>|k@p)ISH#d9PaR=L0-KLNK{u<^UE@8}_72?Kkaasu|BFt3t;CyiGfmo|8 z(kAw1)_s##8y6c|6xVLbRqmhnZ1@VU&hK0arg4ab{>^E|*JUl1MFe%lJw=>GLdz5O zqOLY_RmOhP?FW+24ZmO?*^Hr+W!1tihruhm?RS;tp3u`h`8t|>`Ww6Qg=sQYTaFybZ9Z5Y@)k-y*mr@hLWqYfqA;VU2Q zHBNnUR%_UBz^IQtcD4Ra(_LZl;oJ^`p5m8BPp(6#hwq6xvtIJ3L8A|>e|^?8zem00 zJ}v)`(cV4{T4cWWn<_^C={vqR@1<>k^WGgle2cM~Z}`oF!WYridplU=KYwT0mV}rO zX5u#U!P=-pW9^}4eV(a$l|!cJ(pT5KcRxu8R2%DxtGdD2wM$d{a=lZP&BEZyfE7_c zor&e>lw>hoN`E&ponu-*TOm7XrJC1)R{9#Rb!W65F4!5Ar}WPIboMORSS924n9T=H zFK9bUq3sFy!&sxys8c8RRp1}>PijmWx~i8JZkQKto%Ps~doqk#*?Q^i*trmf%RqJU z;#=VlXJ@*Ot@Tm7cQh70`TUgTilj9ygRTDMD_Wna-`nRr)Vk*kX+&p+_hoCb$go`z z(mGzZL{lr@+q}G%)%W7iTIF2Zt6P@o>RvYSKjuC`!I)?+XJl_PxHBh4;f`g!!E>A4VP5$SQ5CLF_=0&A@lnwhleUz`(>k&GBZWCDT3kgv cn$validSetting = $settings[$validSetting]; + } + } + + if (isset($settings['authType'])) { + $this->authType = $settings['authType']; + } else { + $this->authType = self::AUTH_BASIC | self::AUTH_DIGEST; + } + + $this->propertyMap['{DAV:}resourcetype'] = 'SabreForRainLoop\\DAV\\Property\\ResourceType'; + + } + + /** + * Add trusted root certificates to the webdav client. + * + * The parameter certificates should be a absolute path to a file + * which contains all trusted certificates + * + * @param string $certificates + */ + public function addTrustedCertificates($certificates) { + $this->trustedCertificates = $certificates; + } + + /** + * Enables/disables SSL peer verification + * + * @param boolean $value + */ + public function setVerifyPeer($value) { + $this->verifyPeer = $value; + } + + /** + * Does a PROPFIND request + * + * The list of requested properties must be specified as an array, in clark + * notation. + * + * The returned array will contain a list of filenames as keys, and + * properties as values. + * + * The properties array will contain the list of properties. Only properties + * that are actually returned from the server (without error) will be + * returned, anything else is discarded. + * + * Depth should be either 0 or 1. A depth of 1 will cause a request to be + * made to the server to also return all child resources. + * + * @param string $url + * @param array $properties + * @param int $depth + * @return array + */ + public function propFind($url, array $properties, $depth = 0) { + + $body = '' . "\n"; + $body.= '' . "\n"; + $body.= ' ' . "\n"; + + foreach($properties as $property) { + + list( + $namespace, + $elementName + ) = XMLUtil::parseClarkNotation($property); + + if ($namespace === 'DAV:') { + $body.=' ' . "\n"; + } else { + $body.=" \n"; + } + + } + + $body.= ' ' . "\n"; + $body.= ''; + + $response = $this->request('PROPFIND', $url, $body, array( + 'Depth' => $depth, + 'Content-Type' => 'application/xml' + )); + + $result = $this->parseMultiStatus($response['body']); + + // If depth was 0, we only return the top item + if ($depth===0) { + reset($result); + $result = current($result); + return isset($result[200])?$result[200]:array(); + } + + $newResult = array(); + foreach($result as $href => $statusList) { + + $newResult[$href] = isset($statusList[200])?$statusList[200]:array(); + + } + + return $newResult; + + } + + /** + * Updates a list of properties on the server + * + * The list of properties must have clark-notation properties for the keys, + * and the actual (string) value for the value. If the value is null, an + * attempt is made to delete the property. + * + * @todo Must be building the request using the DOM, and does not yet + * support complex properties. + * @param string $url + * @param array $properties + * @return void + */ + public function propPatch($url, array $properties) { + + $body = '' . "\n"; + $body.= '' . "\n"; + + foreach($properties as $propName => $propValue) { + + list( + $namespace, + $elementName + ) = XMLUtil::parseClarkNotation($propName); + + if ($propValue === null) { + + $body.="\n"; + + if ($namespace === 'DAV:') { + $body.=' ' . "\n"; + } else { + $body.=" \n"; + } + + $body.="\n"; + + } else { + + $body.="\n"; + if ($namespace === 'DAV:') { + $body.=' '; + } else { + $body.=" "; + } + // Shitty.. i know + $body.=htmlspecialchars($propValue, ENT_NOQUOTES, 'UTF-8'); + if ($namespace === 'DAV:') { + $body.='' . "\n"; + } else { + $body.="\n"; + } + $body.="\n"; + + } + + } + + $body.= ''; + + $this->request('PROPPATCH', $url, $body, array( + 'Content-Type' => 'application/xml' + )); + + } + + /** + * Performs an HTTP options request + * + * This method returns all the features from the 'DAV:' header as an array. + * If there was no DAV header, or no contents this method will return an + * empty array. + * + * @return array + */ + public function options() { + + $result = $this->request('OPTIONS'); + if (!isset($result['headers']['dav'])) { + return array(); + } + + $features = explode(',', $result['headers']['dav']); + foreach($features as &$v) { + $v = trim($v); + } + return $features; + + } + + /** + * Performs an actual HTTP request, and returns the result. + * + * If the specified url is relative, it will be expanded based on the base + * url. + * + * The returned array contains 3 keys: + * * body - the response body + * * httpCode - a HTTP code (200, 404, etc) + * * headers - a list of response http headers. The header names have + * been lowercased. + * + * @param string $method + * @param string $url + * @param string $body + * @param array $headers + * @return array + */ + public function request($method, $url = '', $body = null, $headers = array()) { + + $url = $this->getAbsoluteUrl($url); + + $curlSettings = array( + CURLOPT_RETURNTRANSFER => true, + // Return headers as part of the response + CURLOPT_HEADER => true, + CURLOPT_POSTFIELDS => $body, + CURLOPT_USERAGENT => 'RainLoop DAV Client', // TODO rainloop + // Automatically follow redirects + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_MAXREDIRS => 5, + ); + + if($this->verifyPeer !== null) { + $curlSettings[CURLOPT_SSL_VERIFYPEER] = $this->verifyPeer; + // TODO rainloop + if (!$this->verifyPeer) { + $curlSettings[CURLOPT_SSL_VERIFYHOST] = 0; + } // --- + } + + if($this->trustedCertificates) { + $curlSettings[CURLOPT_CAINFO] = $this->trustedCertificates; + } + + switch ($method) { + case 'HEAD' : + + // do not read body with HEAD requests (this is necessary because cURL does not ignore the body with HEAD + // requests when the Content-Length header is given - which in turn is perfectly valid according to HTTP + // specs...) cURL does unfortunately return an error in this case ("transfer closed transfer closed with + // ... bytes remaining to read") this can be circumvented by explicitly telling cURL to ignore the + // response body + $curlSettings[CURLOPT_NOBODY] = true; + $curlSettings[CURLOPT_CUSTOMREQUEST] = 'HEAD'; + break; + + default: + $curlSettings[CURLOPT_CUSTOMREQUEST] = $method; + break; + + } + + // Adding HTTP headers + $nHeaders = array(); + foreach($headers as $key=>$value) { + + $nHeaders[] = $key . ': ' . $value; + + } + $curlSettings[CURLOPT_HTTPHEADER] = $nHeaders; + + if ($this->proxy) { + $curlSettings[CURLOPT_PROXY] = $this->proxy; + } + + if ($this->userName && $this->authType) { + $curlType = 0; + if ($this->authType & self::AUTH_BASIC) { + $curlType |= CURLAUTH_BASIC; + } + if ($this->authType & self::AUTH_DIGEST) { + $curlType |= CURLAUTH_DIGEST; + } + $curlSettings[CURLOPT_HTTPAUTH] = $curlType; + $curlSettings[CURLOPT_USERPWD] = $this->userName . ':' . $this->password; + } + +// var_dump($url); +// var_dump($curlSettings); + + list( + $response, + $curlInfo, + $curlErrNo, + $curlError + ) = $this->curlRequest($url, $curlSettings); + +// var_dump($response); + + $headerBlob = substr($response, 0, $curlInfo['header_size']); + $response = substr($response, $curlInfo['header_size']); + + + // In the case of 100 Continue, or redirects we'll have multiple lists + // of headers for each separate HTTP response. We can easily split this + // because they are separated by \r\n\r\n + $headerBlob = explode("\r\n\r\n", trim($headerBlob, "\r\n")); + + // We only care about the last set of headers + $headerBlob = $headerBlob[count($headerBlob)-1]; + + // Splitting headers + $headerBlob = explode("\r\n", $headerBlob); + + $headers = array(); + foreach($headerBlob as $header) { + $parts = explode(':', $header, 2); + if (count($parts)==2) { + $headers[strtolower(trim($parts[0]))] = trim($parts[1]); + } + } + + $response = array( + 'body' => $response, + 'statusCode' => $curlInfo['http_code'], + 'headers' => $headers + ); + + if ($curlErrNo) { + throw new Exception('[CURL] Error while making request: ' . $curlError . ' (error code: ' . $curlErrNo . ')'); + } + + if ($response['statusCode']>=400) { + switch ($response['statusCode']) { + case 400 : + throw new Exception\BadRequest('Bad request'); + case 401 : + throw new Exception\NotAuthenticated('Not authenticated'); + case 402 : + throw new Exception\PaymentRequired('Payment required'); + case 403 : + throw new Exception\Forbidden('Forbidden'); + case 404: + throw new Exception\NotFound('Resource not found.'); + case 405 : + throw new Exception\MethodNotAllowed('Method not allowed'); + case 409 : + throw new Exception\Conflict('Conflict'); + case 412 : + throw new Exception\PreconditionFailed('Precondition failed'); + case 416 : + throw new Exception\RequestedRangeNotSatisfiable('Requested Range Not Satisfiable'); + case 500 : + throw new Exception('Internal server error'); + case 501 : + throw new Exception\NotImplemented('Not Implemented'); + case 507 : + throw new Exception\InsufficientStorage('Insufficient storage'); + default: + throw new Exception('HTTP error response. (errorcode ' . $response['statusCode'] . ')'); + } + } + + return $response; + + } + + /** + * Wrapper for all curl functions. + * + * The only reason this was split out in a separate method, is so it + * becomes easier to unittest. + * + * @param string $url + * @param array $settings + * @return array + */ + // @codeCoverageIgnoreStart + protected function curlRequest($url, $settings) { + + // TODO rainloop + $curl = curl_init($url); + $sSafeMode = strtolower(trim(@ini_get('safe_mode'))); + $bSafeMode = 'on' === $sSafeMode || '1' === $sSafeMode; + + if (!$bSafeMode && ini_get('open_basedir') === '') + { + curl_setopt_array($curl, $settings); + $data = curl_exec($curl); + } + else + { + $settings[CURLOPT_FOLLOWLOCATION] = false; + curl_setopt_array($curl, $settings); + + $max_redirects = isset($settings[CURLOPT_MAXREDIRS]) ? $settings[CURLOPT_MAXREDIRS] : 5; + $mr = $max_redirects; + if ($mr > 0) + { + $newurl = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL); + + $rcurl = curl_copy_handle($curl); + curl_setopt($rcurl, CURLOPT_HEADER, true); + curl_setopt($rcurl, CURLOPT_NOBODY, true); + curl_setopt($rcurl, CURLOPT_FORBID_REUSE, false); + curl_setopt($rcurl, CURLOPT_RETURNTRANSFER, true); + do + { + curl_setopt($rcurl, CURLOPT_URL, $newurl); + $header = curl_exec($rcurl); + if (curl_errno($rcurl)) + { + $code = 0; + } + else + { + $code = curl_getinfo($rcurl, CURLINFO_HTTP_CODE); + if ($code == 301 || $code == 302) + { + $matches = array(); + preg_match('/Location:(.*?)\n/', $header, $matches); + $newurl = trim(array_pop($matches)); + } + else + { + $code = 0; + } + } + } while ($code && --$mr); + + curl_close($rcurl); + if ($mr > 0) + { + curl_setopt($curl, CURLOPT_URL, $newurl); + } + } + + if ($mr == 0 && $max_redirects > 0) + { + $data = false; + } + else + { + $data = curl_exec($curl); + } + } + + return array( + $data, + curl_getinfo($curl), + curl_errno($curl), + curl_error($curl) + ); + + } + // @codeCoverageIgnoreEnd + + /** + * Returns the full url based on the given url (which may be relative). All + * urls are expanded based on the base url as given by the server. + * + * @param string $url + * @return string + */ + protected function getAbsoluteUrl($url) { + + // If the url starts with http:// or https://, the url is already absolute. + if (preg_match('/^http(s?):\/\//', $url)) { + return $url; + } + + // If the url starts with a slash, we must calculate the url based off + // the root of the base url. + if (strpos($url,'/') === 0) { + $parts = parse_url($this->baseUri); + return $parts['scheme'] . '://' . $parts['host'] . (isset($parts['port'])?':' . $parts['port']:'') . $url; + } + + // Otherwise... + return $this->baseUri . $url; + + } + + /** + * Parses a WebDAV multistatus response body + * + * This method returns an array with the following structure + * + * array( + * 'url/to/resource' => array( + * '200' => array( + * '{DAV:}property1' => 'value1', + * '{DAV:}property2' => 'value2', + * ), + * '404' => array( + * '{DAV:}property1' => null, + * '{DAV:}property2' => null, + * ), + * ) + * 'url/to/resource2' => array( + * .. etc .. + * ) + * ) + * + * + * @param string $body xml body + * @return array + */ + public function parseMultiStatus($body) { + + $body = XMLUtil::convertDAVNamespace($body); + + $responseXML = simplexml_load_string($body, null, LIBXML_NOBLANKS | LIBXML_NOCDATA); + if ($responseXML===false) { + throw new \InvalidArgumentException('The passed data is not valid XML'); + } + + $responseXML->registerXPathNamespace('d', 'urn:DAV'); + + $propResult = array(); + + foreach($responseXML->xpath('d:response') as $response) { + $response->registerXPathNamespace('d', 'urn:DAV'); + $href = $response->xpath('d:href'); + $href = (string)$href[0]; + + $properties = array(); + + foreach($response->xpath('d:propstat') as $propStat) { + + $propStat->registerXPathNamespace('d', 'urn:DAV'); + $status = $propStat->xpath('d:status'); + list($httpVersion, $statusCode, $message) = explode(' ', (string)$status[0],3); + + // Only using the propertymap for results with status 200. + $propertyMap = $statusCode==='200' ? $this->propertyMap : array(); + + $properties[$statusCode] = XMLUtil::parseProperties(dom_import_simplexml($propStat), $propertyMap); + + } + + $propResult[$href] = $properties; + + } + + return $propResult; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Collection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Collection.php new file mode 100755 index 00000000..1e070e76 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Collection.php @@ -0,0 +1,110 @@ +getChildren() as $child) { + + if ($child->getName()==$name) return $child; + + } + throw new Exception\NotFound('File not found: ' . $name); + + } + + /** + * Checks is a child-node exists. + * + * It is generally a good idea to try and override this. Usually it can be optimized. + * + * @param string $name + * @return bool + */ + public function childExists($name) { + + try { + + $this->getChild($name); + return true; + + } catch(Exception\NotFound $e) { + + return false; + + } + + } + + /** + * Creates a new file in the directory + * + * Data will either be supplied as a stream resource, or in certain cases + * as a string. Keep in mind that you may have to support either. + * + * After succesful creation of the file, you may choose to return the ETag + * of the new file here. + * + * The returned ETag must be surrounded by double-quotes (The quotes should + * be part of the actual string). + * + * If you cannot accurately determine the ETag, you should not return it. + * If you don't store the file exactly as-is (you're transforming it + * somehow) you should also not return an ETag. + * + * This means that if a subsequent GET to this new file does not exactly + * return the same contents of what was submitted here, you are strongly + * recommended to omit the ETag. + * + * @param string $name Name of the file + * @param resource|string $data Initial payload + * @return null|string + */ + public function createFile($name, $data = null) { + + throw new Exception\Forbidden('Permission denied to create file (filename ' . $name . ')'); + + } + + /** + * Creates a new subdirectory + * + * @param string $name + * @throws Exception\Forbidden + * @return void + */ + public function createDirectory($name) { + + throw new Exception\Forbidden('Permission denied to create directory'); + + } + + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception.php new file mode 100755 index 00000000..7140bdf4 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception.php @@ -0,0 +1,64 @@ +lock) { + $error = $errorNode->ownerDocument->createElementNS('DAV:','d:no-conflicting-lock'); + $errorNode->appendChild($error); + if (!is_object($this->lock)) var_dump($this->lock); + $error->appendChild($errorNode->ownerDocument->createElementNS('DAV:','d:href',$this->lock->uri)); + } + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/FileNotFound.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/FileNotFound.php new file mode 100755 index 00000000..24a0e64f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/FileNotFound.php @@ -0,0 +1,19 @@ +ownerDocument->createElementNS('DAV:','d:valid-resourcetype'); + $errorNode->appendChild($error); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/LockTokenMatchesRequestUri.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/LockTokenMatchesRequestUri.php new file mode 100755 index 00000000..6fbd2889 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/LockTokenMatchesRequestUri.php @@ -0,0 +1,41 @@ +message = 'The locktoken supplied does not match any locks on this entity'; + + } + + /** + * This method allows the exception to include additional information into the WebDAV error response + * + * @param DAV\Server $server + * @param \DOMElement $errorNode + * @return void + */ + public function serialize(DAV\Server $server,\DOMElement $errorNode) { + + $error = $errorNode->ownerDocument->createElementNS('DAV:','d:lock-token-matches-request-uri'); + $errorNode->appendChild($error); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/Locked.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/Locked.php new file mode 100755 index 00000000..ebcc46c5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/Locked.php @@ -0,0 +1,73 @@ +lock = $lock; + + } + + /** + * Returns the HTTP statuscode for this exception + * + * @return int + */ + public function getHTTPCode() { + + return 423; + + } + + /** + * This method allows the exception to include additional information into the WebDAV error response + * + * @param DAV\Server $server + * @param \DOMElement $errorNode + * @return void + */ + public function serialize(DAV\Server $server,\DOMElement $errorNode) { + + if ($this->lock) { + $error = $errorNode->ownerDocument->createElementNS('DAV:','d:lock-token-submitted'); + $errorNode->appendChild($error); + + $href = $errorNode->ownerDocument->createElementNS('DAV:','d:href'); + $href->appendChild($errorNode->ownerDocument->createTextNode($this->lock->uri)); + $error->appendChild( + $href + ); + } + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/MethodNotAllowed.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/MethodNotAllowed.php new file mode 100755 index 00000000..0c2b67eb --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/MethodNotAllowed.php @@ -0,0 +1,45 @@ +getAllowedMethods($server->getRequestUri()); + + return array( + 'Allow' => strtoupper(implode(', ',$methods)), + ); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/NotAuthenticated.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/NotAuthenticated.php new file mode 100755 index 00000000..99e2ad26 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/NotAuthenticated.php @@ -0,0 +1,30 @@ +header = $header; + + } + + /** + * Returns the HTTP statuscode for this exception + * + * @return int + */ + public function getHTTPCode() { + + return 412; + + } + + /** + * This method allows the exception to include additional information into the WebDAV error response + * + * @param DAV\Server $server + * @param \DOMElement $errorNode + * @return void + */ + public function serialize(DAV\Server $server,\DOMElement $errorNode) { + + if ($this->header) { + $prop = $errorNode->ownerDocument->createElement('s:header'); + $prop->nodeValue = $this->header; + $errorNode->appendChild($prop); + } + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/ReportNotSupported.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/ReportNotSupported.php new file mode 100755 index 00000000..d7fa05fb --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/ReportNotSupported.php @@ -0,0 +1,32 @@ +ownerDocument->createElementNS('DAV:','d:supported-report'); + $errorNode->appendChild($error); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/RequestedRangeNotSatisfiable.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/RequestedRangeNotSatisfiable.php new file mode 100755 index 00000000..2080388c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/RequestedRangeNotSatisfiable.php @@ -0,0 +1,31 @@ + + * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/). + * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License + */ +class ServiceUnavailable extends DAV\Exception { + + /** + * Returns the HTTP statuscode for this exception + * + * @return int + */ + public function getHTTPCode() { + + return 503; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/UnsupportedMediaType.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/UnsupportedMediaType.php new file mode 100755 index 00000000..05b245d9 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/UnsupportedMediaType.php @@ -0,0 +1,28 @@ +path . '/' . $name; + file_put_contents($newPath,$data); + + } + + /** + * Creates a new subdirectory + * + * @param string $name + * @return void + */ + public function createDirectory($name) { + + $newPath = $this->path . '/' . $name; + mkdir($newPath); + + } + + /** + * Returns a specific child node, referenced by its name + * + * This method must throw DAV\Exception\NotFound if the node does not + * exist. + * + * @param string $name + * @throws DAV\Exception\NotFound + * @return DAV\INode + */ + public function getChild($name) { + + $path = $this->path . '/' . $name; + + if (!file_exists($path)) throw new DAV\Exception\NotFound('File with name ' . $path . ' could not be located'); + + if (is_dir($path)) { + + return new Directory($path); + + } else { + + return new File($path); + + } + + } + + /** + * Returns an array with all the child nodes + * + * @return DAV\INode[] + */ + public function getChildren() { + + $nodes = array(); + foreach(scandir($this->path) as $node) if($node!='.' && $node!='..') $nodes[] = $this->getChild($node); + return $nodes; + + } + + /** + * Checks if a child exists. + * + * @param string $name + * @return bool + */ + public function childExists($name) { + + $path = $this->path . '/' . $name; + return file_exists($path); + + } + + /** + * Deletes all files in this directory, and then itself + * + * @return void + */ + public function delete() { + + foreach($this->getChildren() as $child) $child->delete(); + rmdir($this->path); + + } + + /** + * Returns available diskspace information + * + * @return array + */ + public function getQuotaInfo() { + + return array( + disk_total_space($this->path)-disk_free_space($this->path), + disk_free_space($this->path) + ); + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FS/File.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FS/File.php new file mode 100755 index 00000000..36106dea --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FS/File.php @@ -0,0 +1,91 @@ +path,$data); + + } + + /** + * Returns the data + * + * @return string + */ + public function get() { + + return fopen($this->path,'r'); + + } + + /** + * Delete the current file + * + * @return void + */ + public function delete() { + + unlink($this->path); + + } + + /** + * Returns the size of the node, in bytes + * + * @return int + */ + public function getSize() { + + return filesize($this->path); + + } + + /** + * Returns the ETag for a file + * + * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change. + * The ETag is an arbitrary string, but MUST be surrounded by double-quotes. + * + * Return null if the ETag can not effectively be determined + * + * @return mixed + */ + public function getETag() { + + return null; + + } + + /** + * Returns the mime-type for a file + * + * If null is returned, we'll assume application/octet-stream + * + * @return mixed + */ + public function getContentType() { + + return null; + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FS/Node.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FS/Node.php new file mode 100755 index 00000000..0e2145bb --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FS/Node.php @@ -0,0 +1,82 @@ +path = $path; + + } + + + + /** + * Returns the name of the node + * + * @return string + */ + public function getName() { + + list(, $name) = DAV\URLUtil::splitPath($this->path); + return $name; + + } + + /** + * Renames the node + * + * @param string $name The new name + * @return void + */ + public function setName($name) { + + list($parentPath, ) = DAV\URLUtil::splitPath($this->path); + list(, $newName) = DAV\URLUtil::splitPath($name); + + $newPath = $parentPath . '/' . $newName; + rename($this->path,$newPath); + + $this->path = $newPath; + + } + + + + /** + * Returns the last modification time, as a unix timestamp + * + * @return int + */ + public function getLastModified() { + + return filemtime($this->path); + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/Directory.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/Directory.php new file mode 100755 index 00000000..ca26db09 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/Directory.php @@ -0,0 +1,159 @@ +path . '/' . $name; + file_put_contents($newPath,$data); + + return '"' . md5_file($newPath) . '"'; + + } + + /** + * Creates a new subdirectory + * + * @param string $name + * @return void + */ + public function createDirectory($name) { + + // We're not allowing dots + if ($name=='.' || $name=='..') throw new DAV\Exception\Forbidden('Permission denied to . and ..'); + $newPath = $this->path . '/' . $name; + mkdir($newPath); + + } + + /** + * Returns a specific child node, referenced by its name + * + * This method must throw SabreForRainLoop\DAV\Exception\NotFound if the node does not + * exist. + * + * @param string $name + * @throws DAV\Exception\NotFound + * @return DAV\INode + */ + public function getChild($name) { + + $path = $this->path . '/' . $name; + + if (!file_exists($path)) throw new DAV\Exception\NotFound('File could not be located'); + if ($name=='.' || $name=='..') throw new DAV\Exception\Forbidden('Permission denied to . and ..'); + + if (is_dir($path)) { + + return new Directory($path); + + } else { + + return new File($path); + + } + + } + + /** + * Checks if a child exists. + * + * @param string $name + * @return bool + */ + public function childExists($name) { + + if ($name=='.' || $name=='..') + throw new DAV\Exception\Forbidden('Permission denied to . and ..'); + + $path = $this->path . '/' . $name; + return file_exists($path); + + } + + /** + * Returns an array with all the child nodes + * + * @return DAV\INode[] + */ + public function getChildren() { + + $nodes = array(); + foreach(scandir($this->path) as $node) if($node!='.' && $node!='..' && $node!='.sabredav') $nodes[] = $this->getChild($node); + return $nodes; + + } + + /** + * Deletes all files in this directory, and then itself + * + * @return bool + */ + public function delete() { + + // Deleting all children + foreach($this->getChildren() as $child) $child->delete(); + + // Removing resource info, if its still around + if (file_exists($this->path . '/.sabredav')) unlink($this->path . '/.sabredav'); + + // Removing the directory itself + rmdir($this->path); + + return parent::delete(); + + } + + /** + * Returns available diskspace information + * + * @return array + */ + public function getQuotaInfo() { + + return array( + disk_total_space($this->path)-disk_free_space($this->path), + disk_free_space($this->path) + ); + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/File.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/File.php new file mode 100755 index 00000000..425637ce --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/File.php @@ -0,0 +1,118 @@ +path,$data); + return '"' . md5_file($this->path) . '"'; + + } + + /** + * Updates the data at a given offset + * + * The data argument is a readable stream resource. + * The offset argument is a 0-based offset where the data should be + * written. + * + * param resource|string $data + * @return void + */ + public function putRange($data, $offset) { + + $f = fopen($this->path, 'c'); + fseek($f,$offset-1); + if (is_string($data)) { + fwrite($f, $data); + } else { + stream_copy_to_stream($data,$f); + } + fclose($f); + return '"' . md5_file($this->path) . '"'; + + } + + /** + * Returns the data + * + * @return resource + */ + public function get() { + + return fopen($this->path,'r'); + + } + + /** + * Delete the current file + * + * @return bool + */ + public function delete() { + + unlink($this->path); + return parent::delete(); + + } + + /** + * Returns the ETag for a file + * + * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change. + * The ETag is an arbitrary string, but MUST be surrounded by double-quotes. + * + * Return null if the ETag can not effectively be determined + * + * @return string|null + */ + public function getETag() { + + return '"' . md5_file($this->path). '"'; + + } + + /** + * Returns the mime-type for a file + * + * If null is returned, we'll assume application/octet-stream + * + * @return string|null + */ + public function getContentType() { + + return null; + + } + + /** + * Returns the size of the file, in bytes + * + * @return int + */ + public function getSize() { + + return filesize($this->path); + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/Node.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/Node.php new file mode 100755 index 00000000..17cd32c8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/Node.php @@ -0,0 +1,214 @@ +getResourceData(); + + foreach($properties as $propertyName=>$propertyValue) { + + // If it was null, we need to delete the property + if (is_null($propertyValue)) { + if (isset($resourceData['properties'][$propertyName])) { + unset($resourceData['properties'][$propertyName]); + } + } else { + $resourceData['properties'][$propertyName] = $propertyValue; + } + + } + + $this->putResourceData($resourceData); + return true; + } + + /** + * Returns a list of properties for this nodes.; + * + * The properties list is a list of propertynames the client requested, encoded as xmlnamespace#tagName, for example: http://www.example.org/namespace#author + * If the array is empty, all properties should be returned + * + * @param array $properties + * @return array + */ + function getProperties($properties) { + + $resourceData = $this->getResourceData(); + + // if the array was empty, we need to return everything + if (!$properties) return $resourceData['properties']; + + $props = array(); + foreach($properties as $property) { + if (isset($resourceData['properties'][$property])) $props[$property] = $resourceData['properties'][$property]; + } + + return $props; + + } + + /** + * Returns the path to the resource file + * + * @return string + */ + protected function getResourceInfoPath() { + + list($parentDir) = DAV\URLUtil::splitPath($this->path); + return $parentDir . '/.sabredav'; + + } + + /** + * Returns all the stored resource information + * + * @return array + */ + protected function getResourceData() { + + $path = $this->getResourceInfoPath(); + if (!file_exists($path)) return array('properties' => array()); + + // opening up the file, and creating a shared lock + $handle = fopen($path,'r'); + flock($handle,LOCK_SH); + $data = ''; + + // Reading data until the eof + while(!feof($handle)) { + $data.=fread($handle,8192); + } + + // We're all good + fclose($handle); + + // Unserializing and checking if the resource file contains data for this file + $data = unserialize($data); + if (!isset($data[$this->getName()])) { + return array('properties' => array()); + } + + $data = $data[$this->getName()]; + if (!isset($data['properties'])) $data['properties'] = array(); + return $data; + + } + + /** + * Updates the resource information + * + * @param array $newData + * @return void + */ + protected function putResourceData(array $newData) { + + $path = $this->getResourceInfoPath(); + + // opening up the file, and creating a shared lock + $handle = fopen($path,'a+'); + flock($handle,LOCK_EX); + $data = ''; + + rewind($handle); + + // Reading data until the eof + while(!feof($handle)) { + $data.=fread($handle,8192); + } + + // Unserializing and checking if the resource file contains data for this file + $data = unserialize($data); + $data[$this->getName()] = $newData; + ftruncate($handle,0); + rewind($handle); + + fwrite($handle,serialize($data)); + fclose($handle); + + } + + /** + * Renames the node + * + * @param string $name The new name + * @return void + */ + public function setName($name) { + + list($parentPath, ) = DAV\URLUtil::splitPath($this->path); + list(, $newName) = DAV\URLUtil::splitPath($name); + $newPath = $parentPath . '/' . $newName; + + // We're deleting the existing resourcedata, and recreating it + // for the new path. + $resourceData = $this->getResourceData(); + $this->deleteResourceData(); + + rename($this->path,$newPath); + $this->path = $newPath; + $this->putResourceData($resourceData); + + + } + + /** + * @return bool + */ + public function deleteResourceData() { + + // When we're deleting this node, we also need to delete any resource information + $path = $this->getResourceInfoPath(); + if (!file_exists($path)) return true; + + // opening up the file, and creating a shared lock + $handle = fopen($path,'a+'); + flock($handle,LOCK_EX); + $data = ''; + + rewind($handle); + + // Reading data until the eof + while(!feof($handle)) { + $data.=fread($handle,8192); + } + + // Unserializing and checking if the resource file contains data for this file + $data = unserialize($data); + if (isset($data[$this->getName()])) unset($data[$this->getName()]); + ftruncate($handle,0); + rewind($handle); + fwrite($handle,serialize($data)); + fclose($handle); + + return true; + } + + public function delete() { + + return $this->deleteResourceData(); + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/File.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/File.php new file mode 100755 index 00000000..e21d240b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/File.php @@ -0,0 +1,85 @@ + array( + * '{DAV:}displayname' => null, + * ), + * 424 => array( + * '{DAV:}owner' => null, + * ) + * ) + * + * In this example it was forbidden to update {DAV:}displayname. + * (403 Forbidden), which in turn also caused {DAV:}owner to fail + * (424 Failed Dependency) because the request needs to be atomic. + * + * @param array $mutations + * @return bool|array + */ + function updateProperties($mutations); + + /** + * Returns a list of properties for this nodes. + * + * The properties list is a list of propertynames the client requested, + * encoded in clark-notation {xmlnamespace}tagname + * + * If the array is empty, it means 'all properties' were requested. + * + * Note that it's fine to liberally give properties back, instead of + * conforming to the list of requested properties. + * The Server class will filter out the extra. + * + * @param array $properties + * @return void + */ + function getProperties($properties); + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/IQuota.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/IQuota.php new file mode 100755 index 00000000..dd42fc51 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/IQuota.php @@ -0,0 +1,27 @@ +dataDir = $dataDir; + + } + + protected function getFileNameForUri($uri) { + + return $this->dataDir . '/sabredav_' . md5($uri) . '.locks'; + + } + + + /** + * Returns a list of SabreForRainLoop\DAV\Locks\LockInfo objects + * + * This method should return all the locks for a particular uri, including + * locks that might be set on a parent uri. + * + * If returnChildLocks is set to true, this method should also look for + * any locks in the subtree of the uri for locks. + * + * @param string $uri + * @param bool $returnChildLocks + * @return array + */ + public function getLocks($uri, $returnChildLocks) { + + $lockList = array(); + $currentPath = ''; + + foreach(explode('/',$uri) as $uriPart) { + + // weird algorithm that can probably be improved, but we're traversing the path top down + if ($currentPath) $currentPath.='/'; + $currentPath.=$uriPart; + + $uriLocks = $this->getData($currentPath); + + foreach($uriLocks as $uriLock) { + + // Unless we're on the leaf of the uri-tree we should ignore locks with depth 0 + if($uri==$currentPath || $uriLock->depth!=0) { + $uriLock->uri = $currentPath; + $lockList[] = $uriLock; + } + + } + + } + + // Checking if we can remove any of these locks + foreach($lockList as $k=>$lock) { + if (time() > $lock->timeout + $lock->created) unset($lockList[$k]); + } + return $lockList; + + } + + /** + * Locks a uri + * + * @param string $uri + * @param LockInfo $lockInfo + * @return bool + */ + public function lock($uri, LockInfo $lockInfo) { + + // We're making the lock timeout 30 minutes + $lockInfo->timeout = 1800; + $lockInfo->created = time(); + + $locks = $this->getLocks($uri,false); + foreach($locks as $k=>$lock) { + if ($lock->token == $lockInfo->token) unset($locks[$k]); + } + $locks[] = $lockInfo; + $this->putData($uri,$locks); + return true; + + } + + /** + * Removes a lock from a uri + * + * @param string $uri + * @param LockInfo $lockInfo + * @return bool + */ + public function unlock($uri, LockInfo $lockInfo) { + + $locks = $this->getLocks($uri,false); + foreach($locks as $k=>$lock) { + + if ($lock->token == $lockInfo->token) { + + unset($locks[$k]); + $this->putData($uri,$locks); + return true; + + } + } + return false; + + } + + /** + * Returns the stored data for a uri + * + * @param string $uri + * @return array + */ + protected function getData($uri) { + + $path = $this->getFilenameForUri($uri); + if (!file_exists($path)) return array(); + + // opening up the file, and creating a shared lock + $handle = fopen($path,'r'); + flock($handle,LOCK_SH); + $data = ''; + + // Reading data until the eof + while(!feof($handle)) { + $data.=fread($handle,8192); + } + + // We're all good + fclose($handle); + + // Unserializing and checking if the resource file contains data for this file + $data = unserialize($data); + if (!$data) return array(); + return $data; + + } + + /** + * Updates the lock information + * + * @param string $uri + * @param array $newData + * @return void + */ + protected function putData($uri,array $newData) { + + $path = $this->getFileNameForUri($uri); + + // opening up the file, and creating a shared lock + $handle = fopen($path,'a+'); + flock($handle,LOCK_EX); + ftruncate($handle,0); + rewind($handle); + + fwrite($handle,serialize($newData)); + fclose($handle); + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/File.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/File.php new file mode 100755 index 00000000..b4050859 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/File.php @@ -0,0 +1,183 @@ +locksFile = $locksFile; + + } + + /** + * Returns a list of SabreForRainLoop\DAV\Locks\LockInfo objects + * + * This method should return all the locks for a particular uri, including + * locks that might be set on a parent uri. + * + * If returnChildLocks is set to true, this method should also look for + * any locks in the subtree of the uri for locks. + * + * @param string $uri + * @param bool $returnChildLocks + * @return array + */ + public function getLocks($uri, $returnChildLocks) { + + $newLocks = array(); + + $locks = $this->getData(); + + foreach($locks as $lock) { + + if ($lock->uri === $uri || + //deep locks on parents + ($lock->depth!=0 && strpos($uri, $lock->uri . '/')===0) || + + // locks on children + ($returnChildLocks && (strpos($lock->uri, $uri . '/')===0)) ) { + + $newLocks[] = $lock; + + } + + } + + // Checking if we can remove any of these locks + foreach($newLocks as $k=>$lock) { + if (time() > $lock->timeout + $lock->created) unset($newLocks[$k]); + } + return $newLocks; + + } + + /** + * Locks a uri + * + * @param string $uri + * @param LockInfo $lockInfo + * @return bool + */ + public function lock($uri, LockInfo $lockInfo) { + + // We're making the lock timeout 30 minutes + $lockInfo->timeout = 1800; + $lockInfo->created = time(); + $lockInfo->uri = $uri; + + $locks = $this->getData(); + + foreach($locks as $k=>$lock) { + if ( + ($lock->token == $lockInfo->token) || + (time() > $lock->timeout + $lock->created) + ) { + unset($locks[$k]); + } + } + $locks[] = $lockInfo; + $this->putData($locks); + return true; + + } + + /** + * Removes a lock from a uri + * + * @param string $uri + * @param LockInfo $lockInfo + * @return bool + */ + public function unlock($uri, LockInfo $lockInfo) { + + $locks = $this->getData(); + foreach($locks as $k=>$lock) { + + if ($lock->token == $lockInfo->token) { + + unset($locks[$k]); + $this->putData($locks); + return true; + + } + } + return false; + + } + + /** + * Loads the lockdata from the filesystem. + * + * @return array + */ + protected function getData() { + + if (!file_exists($this->locksFile)) return array(); + + // opening up the file, and creating a shared lock + $handle = fopen($this->locksFile,'r'); + flock($handle,LOCK_SH); + + // Reading data until the eof + $data = stream_get_contents($handle); + + // We're all good + fclose($handle); + + // Unserializing and checking if the resource file contains data for this file + $data = unserialize($data); + if (!$data) return array(); + return $data; + + } + + /** + * Saves the lockdata + * + * @param array $newData + * @return void + */ + protected function putData(array $newData) { + + // opening up the file, and creating an exclusive lock + $handle = fopen($this->locksFile,'a+'); + flock($handle,LOCK_EX); + + // We can only truncate and rewind once the lock is acquired. + ftruncate($handle,0); + rewind($handle); + + fwrite($handle,serialize($newData)); + fclose($handle); + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/PDO.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/PDO.php new file mode 100755 index 00000000..27185333 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/PDO.php @@ -0,0 +1,167 @@ +pdo = $pdo; + $this->tableName = $tableName; + + } + + /** + * Returns a list of SabreForRainLoop\DAV\Locks\LockInfo objects + * + * This method should return all the locks for a particular uri, including + * locks that might be set on a parent uri. + * + * If returnChildLocks is set to true, this method should also look for + * any locks in the subtree of the uri for locks. + * + * @param string $uri + * @param bool $returnChildLocks + * @return array + */ + public function getLocks($uri, $returnChildLocks) { + + // NOTE: the following 10 lines or so could be easily replaced by + // pure sql. MySQL's non-standard string concatenation prevents us + // from doing this though. + $query = 'SELECT owner, token, timeout, created, scope, depth, uri FROM '.$this->tableName.' WHERE ((created + timeout) > CAST(? AS UNSIGNED INTEGER)) AND ((uri = ?)'; + $params = array(time(),$uri); + + // We need to check locks for every part in the uri. + $uriParts = explode('/',$uri); + + // We already covered the last part of the uri + array_pop($uriParts); + + $currentPath=''; + + foreach($uriParts as $part) { + + if ($currentPath) $currentPath.='/'; + $currentPath.=$part; + + $query.=' OR (depth!=0 AND uri = ?)'; + $params[] = $currentPath; + + } + + if ($returnChildLocks) { + + $query.=' OR (uri LIKE ?)'; + $params[] = $uri . '/%'; + + } + $query.=')'; + + $stmt = $this->pdo->prepare($query); + $stmt->execute($params); + $result = $stmt->fetchAll(); + + $lockList = array(); + foreach($result as $row) { + + $lockInfo = new LockInfo(); + $lockInfo->owner = $row['owner']; + $lockInfo->token = $row['token']; + $lockInfo->timeout = $row['timeout']; + $lockInfo->created = $row['created']; + $lockInfo->scope = $row['scope']; + $lockInfo->depth = $row['depth']; + $lockInfo->uri = $row['uri']; + $lockList[] = $lockInfo; + + } + + return $lockList; + + } + + /** + * Locks a uri + * + * @param string $uri + * @param LockInfo $lockInfo + * @return bool + */ + public function lock($uri, LockInfo $lockInfo) { + + // We're making the lock timeout 30 minutes + $lockInfo->timeout = 30*60; + $lockInfo->created = time(); + $lockInfo->uri = $uri; + + $locks = $this->getLocks($uri,false); + $exists = false; + foreach($locks as $lock) { + if ($lock->token == $lockInfo->token) $exists = true; + } + + if ($exists) { + $stmt = $this->pdo->prepare('UPDATE '.$this->tableName.' SET owner = ?, timeout = ?, scope = ?, depth = ?, uri = ?, created = ? WHERE token = ?'); + $stmt->execute(array($lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,$lockInfo->token)); + } else { + $stmt = $this->pdo->prepare('INSERT INTO '.$this->tableName.' (owner,timeout,scope,depth,uri,created,token) VALUES (?,?,?,?,?,?,?)'); + $stmt->execute(array($lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,$lockInfo->token)); + } + + return true; + + } + + + + /** + * Removes a lock from a uri + * + * @param string $uri + * @param LockInfo $lockInfo + * @return bool + */ + public function unlock($uri, LockInfo $lockInfo) { + + $stmt = $this->pdo->prepare('DELETE FROM '.$this->tableName.' WHERE uri = ? AND token = ?'); + $stmt->execute(array($uri,$lockInfo->token)); + + return $stmt->rowCount()===1; + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/LockInfo.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/LockInfo.php new file mode 100755 index 00000000..894ac574 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/LockInfo.php @@ -0,0 +1,81 @@ +addPlugin($lockPlugin); + * + * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/). + * @author Evert Pot (http://evertpot.com/) + * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License + */ +class Plugin extends DAV\ServerPlugin { + + /** + * locksBackend + * + * @var Backend\Backend\Interface + */ + protected $locksBackend; + + /** + * server + * + * @var SabreForRainLoop\DAV\Server + */ + protected $server; + + /** + * __construct + * + * @param Backend\BackendInterface $locksBackend + */ + public function __construct(Backend\BackendInterface $locksBackend = null) { + + $this->locksBackend = $locksBackend; + + } + + /** + * Initializes the plugin + * + * This method is automatically called by the Server class after addPlugin. + * + * @param DAV\Server $server + * @return void + */ + public function initialize(DAV\Server $server) { + + $this->server = $server; + $server->subscribeEvent('unknownMethod',array($this,'unknownMethod')); + $server->subscribeEvent('beforeMethod',array($this,'beforeMethod'),50); + $server->subscribeEvent('afterGetProperties',array($this,'afterGetProperties')); + + } + + /** + * Returns a plugin name. + * + * Using this name other plugins will be able to access other plugins + * using SabreForRainLoop\DAV\Server::getPlugin + * + * @return string + */ + public function getPluginName() { + + return 'locks'; + + } + + /** + * This method is called by the Server if the user used an HTTP method + * the server didn't recognize. + * + * This plugin intercepts the LOCK and UNLOCK methods. + * + * @param string $method + * @param string $uri + * @return bool + */ + public function unknownMethod($method, $uri) { + + switch($method) { + + case 'LOCK' : $this->httpLock($uri); return false; + case 'UNLOCK' : $this->httpUnlock($uri); return false; + + } + + } + + /** + * This method is called after most properties have been found + * it allows us to add in any Lock-related properties + * + * @param string $path + * @param array $newProperties + * @return bool + */ + public function afterGetProperties($path, &$newProperties) { + + foreach($newProperties[404] as $propName=>$discard) { + + switch($propName) { + + case '{DAV:}supportedlock' : + $val = false; + if ($this->locksBackend) $val = true; + $newProperties[200][$propName] = new DAV\Property\SupportedLock($val); + unset($newProperties[404][$propName]); + break; + + case '{DAV:}lockdiscovery' : + $newProperties[200][$propName] = new DAV\Property\LockDiscovery($this->getLocks($path)); + unset($newProperties[404][$propName]); + break; + + } + + + } + return true; + + } + + + /** + * This method is called before the logic for any HTTP method is + * handled. + * + * This plugin uses that feature to intercept access to locked resources. + * + * @param string $method + * @param string $uri + * @return bool + */ + public function beforeMethod($method, $uri) { + + switch($method) { + + case 'DELETE' : + $lastLock = null; + if (!$this->validateLock($uri,$lastLock, true)) + throw new DAV\Exception\Locked($lastLock); + break; + case 'MKCOL' : + case 'PROPPATCH' : + case 'PUT' : + case 'PATCH' : + $lastLock = null; + if (!$this->validateLock($uri,$lastLock)) + throw new DAV\Exception\Locked($lastLock); + break; + case 'MOVE' : + $lastLock = null; + if (!$this->validateLock(array( + $uri, + $this->server->calculateUri($this->server->httpRequest->getHeader('Destination')), + ),$lastLock, true)) + throw new DAV\Exception\Locked($lastLock); + break; + case 'COPY' : + $lastLock = null; + if (!$this->validateLock( + $this->server->calculateUri($this->server->httpRequest->getHeader('Destination')), + $lastLock, true)) + throw new DAV\Exception\Locked($lastLock); + break; + } + + return true; + + } + + /** + * Use this method to tell the server this plugin defines additional + * HTTP methods. + * + * This method is passed a uri. It should only return HTTP methods that are + * available for the specified uri. + * + * @param string $uri + * @return array + */ + public function getHTTPMethods($uri) { + + if ($this->locksBackend) + return array('LOCK','UNLOCK'); + + return array(); + + } + + /** + * Returns a list of features for the HTTP OPTIONS Dav: header. + * + * In this case this is only the number 2. The 2 in the Dav: header + * indicates the server supports locks. + * + * @return array + */ + public function getFeatures() { + + return array(2); + + } + + /** + * Returns all lock information on a particular uri + * + * This function should return an array with SabreForRainLoop\DAV\Locks\LockInfo objects. If there are no locks on a file, return an empty array. + * + * Additionally there is also the possibility of locks on parent nodes, so we'll need to traverse every part of the tree + * If the $returnChildLocks argument is set to true, we'll also traverse all the children of the object + * for any possible locks and return those as well. + * + * @param string $uri + * @param bool $returnChildLocks + * @return array + */ + public function getLocks($uri, $returnChildLocks = false) { + + $lockList = array(); + + if ($this->locksBackend) + $lockList = array_merge($lockList,$this->locksBackend->getLocks($uri, $returnChildLocks)); + + return $lockList; + + } + + /** + * Locks an uri + * + * The WebDAV lock request can be operated to either create a new lock on a file, or to refresh an existing lock + * If a new lock is created, a full XML body should be supplied, containing information about the lock such as the type + * of lock (shared or exclusive) and the owner of the lock + * + * If a lock is to be refreshed, no body should be supplied and there should be a valid If header containing the lock + * + * Additionally, a lock can be requested for a non-existent file. In these case we're obligated to create an empty file as per RFC4918:S7.3 + * + * @param string $uri + * @return void + */ + protected function httpLock($uri) { + + $lastLock = null; + if (!$this->validateLock($uri,$lastLock)) { + + // If the existing lock was an exclusive lock, we need to fail + if (!$lastLock || $lastLock->scope == LockInfo::EXCLUSIVE) { + //var_dump($lastLock); + throw new DAV\Exception\ConflictingLock($lastLock); + } + + } + + if ($body = $this->server->httpRequest->getBody(true)) { + // This is a new lock request + $lockInfo = $this->parseLockRequest($body); + $lockInfo->depth = $this->server->getHTTPDepth(); + $lockInfo->uri = $uri; + if($lastLock && $lockInfo->scope != LockInfo::SHARED) throw new DAV\Exception\ConflictingLock($lastLock); + + } elseif ($lastLock) { + + // This must have been a lock refresh + $lockInfo = $lastLock; + + // The resource could have been locked through another uri. + if ($uri!=$lockInfo->uri) $uri = $lockInfo->uri; + + } else { + + // There was neither a lock refresh nor a new lock request + throw new DAV\Exception\BadRequest('An xml body is required for lock requests'); + + } + + if ($timeout = $this->getTimeoutHeader()) $lockInfo->timeout = $timeout; + + $newFile = false; + + // If we got this far.. we should go check if this node actually exists. If this is not the case, we need to create it first + try { + $this->server->tree->getNodeForPath($uri); + + // We need to call the beforeWriteContent event for RFC3744 + // Edit: looks like this is not used, and causing problems now. + // + // See Issue 222 + // $this->server->broadcastEvent('beforeWriteContent',array($uri)); + + } catch (DAV\Exception\NotFound $e) { + + // It didn't, lets create it + $this->server->createFile($uri,fopen('php://memory','r')); + $newFile = true; + + } + + $this->lockNode($uri,$lockInfo); + + $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); + $this->server->httpResponse->setHeader('Lock-Token','token . '>'); + $this->server->httpResponse->sendStatus($newFile?201:200); + $this->server->httpResponse->sendBody($this->generateLockResponse($lockInfo)); + + } + + /** + * Unlocks a uri + * + * This WebDAV method allows you to remove a lock from a node. The client should provide a valid locktoken through the Lock-token http header + * The server should return 204 (No content) on success + * + * @param string $uri + * @return void + */ + protected function httpUnlock($uri) { + + $lockToken = $this->server->httpRequest->getHeader('Lock-Token'); + + // If the locktoken header is not supplied, we need to throw a bad request exception + if (!$lockToken) throw new DAV\Exception\BadRequest('No lock token was supplied'); + + $locks = $this->getLocks($uri); + + // Windows sometimes forgets to include < and > in the Lock-Token + // header + if ($lockToken[0]!=='<') $lockToken = '<' . $lockToken . '>'; + + foreach($locks as $lock) { + + if ('token . '>' == $lockToken) { + + $this->unlockNode($uri,$lock); + $this->server->httpResponse->setHeader('Content-Length','0'); + $this->server->httpResponse->sendStatus(204); + return; + + } + + } + + // If we got here, it means the locktoken was invalid + throw new DAV\Exception\LockTokenMatchesRequestUri(); + + } + + /** + * Locks a uri + * + * All the locking information is supplied in the lockInfo object. The object has a suggested timeout, but this can be safely ignored + * It is important that if the existing timeout is ignored, the property is overwritten, as this needs to be sent back to the client + * + * @param string $uri + * @param LockInfo $lockInfo + * @return bool + */ + public function lockNode($uri,LockInfo $lockInfo) { + + if (!$this->server->broadcastEvent('beforeLock',array($uri,$lockInfo))) return; + + if ($this->locksBackend) return $this->locksBackend->lock($uri,$lockInfo); + throw new DAV\Exception\MethodNotAllowed('Locking support is not enabled for this resource. No Locking backend was found so if you didn\'t expect this error, please check your configuration.'); + + } + + /** + * Unlocks a uri + * + * This method removes a lock from a uri. It is assumed all the supplied information is correct and verified + * + * @param string $uri + * @param LockInfo $lockInfo + * @return bool + */ + public function unlockNode($uri, LockInfo $lockInfo) { + + if (!$this->server->broadcastEvent('beforeUnlock',array($uri,$lockInfo))) return; + if ($this->locksBackend) return $this->locksBackend->unlock($uri,$lockInfo); + + } + + + /** + * Returns the contents of the HTTP Timeout header. + * + * The method formats the header into an integer. + * + * @return int + */ + public function getTimeoutHeader() { + + $header = $this->server->httpRequest->getHeader('Timeout'); + + if ($header) { + + if (stripos($header,'second-')===0) $header = (int)(substr($header,7)); + else if (strtolower($header)=='infinite') $header = LockInfo::TIMEOUT_INFINITE; + else throw new DAV\Exception\BadRequest('Invalid HTTP timeout header'); + + } else { + + $header = 0; + + } + + return $header; + + } + + /** + * Generates the response for successful LOCK requests + * + * @param LockInfo $lockInfo + * @return string + */ + protected function generateLockResponse(LockInfo $lockInfo) { + + $dom = new \DOMDocument('1.0','utf-8'); + $dom->formatOutput = true; + + $prop = $dom->createElementNS('DAV:','d:prop'); + $dom->appendChild($prop); + + $lockDiscovery = $dom->createElementNS('DAV:','d:lockdiscovery'); + $prop->appendChild($lockDiscovery); + + $lockObj = new DAV\Property\LockDiscovery(array($lockInfo),true); + $lockObj->serialize($this->server,$lockDiscovery); + + return $dom->saveXML(); + + } + + /** + * validateLock should be called when a write operation is about to happen + * It will check if the requested url is locked, and see if the correct lock tokens are passed + * + * @param mixed $urls List of relevant urls. Can be an array, a string or nothing at all for the current request uri + * @param mixed $lastLock This variable will be populated with the last checked lock object (SabreForRainLoop\DAV\Locks\LockInfo) + * @param bool $checkChildLocks If set to true, this function will also look for any locks set on child resources of the supplied urls. This is needed for for example deletion of entire trees. + * @return bool + */ + protected function validateLock($urls = null,&$lastLock = null, $checkChildLocks = false) { + + if (is_null($urls)) { + $urls = array($this->server->getRequestUri()); + } elseif (is_string($urls)) { + $urls = array($urls); + } elseif (!is_array($urls)) { + throw new DAV\Exception('The urls parameter should either be null, a string or an array'); + } + + $conditions = $this->getIfConditions(); + + // We're going to loop through the urls and make sure all lock conditions are satisfied + foreach($urls as $url) { + + $locks = $this->getLocks($url, $checkChildLocks); + + // If there were no conditions, but there were locks, we fail + if (!$conditions && $locks) { + reset($locks); + $lastLock = current($locks); + return false; + } + + // If there were no locks or conditions, we go to the next url + if (!$locks && !$conditions) continue; + + foreach($conditions as $condition) { + + if (!$condition['uri']) { + $conditionUri = $this->server->getRequestUri(); + } else { + $conditionUri = $this->server->calculateUri($condition['uri']); + } + + // If the condition has a url, and it isn't part of the affected url at all, check the next condition + if ($conditionUri && strpos($url,$conditionUri)!==0) continue; + + // The tokens array contians arrays with 2 elements. 0=true/false for normal/not condition, 1=locktoken + // At least 1 condition has to be satisfied + foreach($condition['tokens'] as $conditionToken) { + + $etagValid = true; + $lockValid = true; + + // key 2 can contain an etag + if ($conditionToken[2]) { + + $uri = $conditionUri?$conditionUri:$this->server->getRequestUri(); + $node = $this->server->tree->getNodeForPath($uri); + $etagValid = $node->getETag()==$conditionToken[2]; + + } + + // key 1 can contain a lock token + if ($conditionToken[1]) { + + $lockValid = false; + // Match all the locks + foreach($locks as $lockIndex=>$lock) { + + $lockToken = 'opaquelocktoken:' . $lock->token; + + // Checking NOT + if (!$conditionToken[0] && $lockToken != $conditionToken[1]) { + + // Condition valid, onto the next + $lockValid = true; + break; + } + if ($conditionToken[0] && $lockToken == $conditionToken[1]) { + + $lastLock = $lock; + // Condition valid and lock matched + unset($locks[$lockIndex]); + $lockValid = true; + break; + + } + + } + + } + + // If, after checking both etags and locks they are stil valid, + // we can continue with the next condition. + if ($etagValid && $lockValid) continue 2; + } + // No conditions matched, so we fail + throw new DAV\Exception\PreconditionFailed('The tokens provided in the if header did not match','If'); + } + + // Conditions were met, we'll also need to check if all the locks are gone + if (count($locks)) { + + reset($locks); + + // There's still locks, we fail + $lastLock = current($locks); + return false; + + } + + + } + + // We got here, this means every condition was satisfied + return true; + + } + + /** + * This method is created to extract information from the WebDAV HTTP 'If:' header + * + * The If header can be quite complex, and has a bunch of features. We're using a regex to extract all relevant information + * The function will return an array, containing structs with the following keys + * + * * uri - the uri the condition applies to. If this is returned as an + * empty string, this implies it's referring to the request url. + * * tokens - The lock token. another 2 dimensional array containing 2 elements (0 = true/false.. If this is a negative condition its set to false, 1 = the actual token) + * * etag - an etag, if supplied + * + * @return array + */ + public function getIfConditions() { + + $header = $this->server->httpRequest->getHeader('If'); + if (!$header) return array(); + + $matches = array(); + + $regex = '/(?:\<(?P.*?)\>\s)?\((?PNot\s)?(?:\<(?P[^\>]*)\>)?(?:\s?)(?:\[(?P[^\]]*)\])?\)/im'; + preg_match_all($regex,$header,$matches,PREG_SET_ORDER); + + $conditions = array(); + + foreach($matches as $match) { + + $condition = array( + 'uri' => $match['uri'], + 'tokens' => array( + array($match['not']?0:1,$match['token'],isset($match['etag'])?$match['etag']:'') + ), + ); + + if (!$condition['uri'] && count($conditions)) $conditions[count($conditions)-1]['tokens'][] = array( + $match['not']?0:1, + $match['token'], + isset($match['etag'])?$match['etag']:'' + ); + else { + $conditions[] = $condition; + } + + } + + return $conditions; + + } + + /** + * Parses a webdav lock xml body, and returns a new SabreForRainLoop\DAV\Locks\LockInfo object + * + * @param string $body + * @return DAV\Locks\LockInfo + */ + protected function parseLockRequest($body) { + + $xml = simplexml_load_string( + DAV\XMLUtil::convertDAVNamespace($body), + null, + LIBXML_NOWARNING); + $xml->registerXPathNamespace('d','urn:DAV'); + $lockInfo = new LockInfo(); + + $children = $xml->children("urn:DAV"); + $lockInfo->owner = (string)$children->owner; + + $lockInfo->token = DAV\UUIDUtil::getUUID(); + $lockInfo->scope = count($xml->xpath('d:lockscope/d:exclusive'))>0 ? LockInfo::EXCLUSIVE : LockInfo::SHARED; + + return $lockInfo; + + } + + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Mount/Plugin.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Mount/Plugin.php new file mode 100755 index 00000000..4959f012 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Mount/Plugin.php @@ -0,0 +1,83 @@ +server = $server; + $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90); + + } + + /** + * 'beforeMethod' event handles. This event handles intercepts GET requests ending + * with ?mount + * + * @param string $method + * @param string $uri + * @return bool + */ + public function beforeMethod($method, $uri) { + + if ($method!='GET') return; + if ($this->server->httpRequest->getQueryString()!='mount') return; + + $currentUri = $this->server->httpRequest->getAbsoluteUri(); + + // Stripping off everything after the ? + list($currentUri) = explode('?',$currentUri); + + $this->davMount($currentUri); + + // Returning false to break the event chain + return false; + + } + + /** + * Generates the davmount response + * + * @param string $uri absolute uri + * @return void + */ + public function davMount($uri) { + + $this->server->httpResponse->sendStatus(200); + $this->server->httpResponse->setHeader('Content-Type','application/davmount+xml'); + ob_start(); + echo '', "\n"; + echo "\n"; + echo " ", htmlspecialchars($uri, ENT_NOQUOTES, 'UTF-8'), "\n"; + echo ""; + $this->server->httpResponse->sendBody(ob_get_clean()); + + } + + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Node.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Node.php new file mode 100755 index 00000000..52e460e2 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Node.php @@ -0,0 +1,55 @@ +rootNode = $rootNode; + + } + + /** + * Returns the INode object for the requested path + * + * @param string $path + * @return INode + */ + public function getNodeForPath($path) { + + $path = trim($path,'/'); + if (isset($this->cache[$path])) return $this->cache[$path]; + + // Is it the root node? + if (!strlen($path)) { + return $this->rootNode; + } + + // Attempting to fetch its parent + list($parentName, $baseName) = URLUtil::splitPath($path); + + // If there was no parent, we must simply ask it from the root node. + if ($parentName==="") { + $node = $this->rootNode->getChild($baseName); + } else { + // Otherwise, we recursively grab the parent and ask him/her. + $parent = $this->getNodeForPath($parentName); + + if (!($parent instanceof ICollection)) + throw new Exception\NotFound('Could not find node at path: ' . $path); + + $node = $parent->getChild($baseName); + + } + + $this->cache[$path] = $node; + return $node; + + } + + /** + * This function allows you to check if a node exists. + * + * @param string $path + * @return bool + */ + public function nodeExists($path) { + + try { + + // The root always exists + if ($path==='') return true; + + list($parent, $base) = URLUtil::splitPath($path); + + $parentNode = $this->getNodeForPath($parent); + if (!$parentNode instanceof ICollection) return false; + return $parentNode->childExists($base); + + } catch (Exception\NotFound $e) { + + return false; + + } + + } + + /** + * Returns a list of childnodes for a given path. + * + * @param string $path + * @return array + */ + public function getChildren($path) { + + $node = $this->getNodeForPath($path); + $children = $node->getChildren(); + foreach($children as $child) { + + $this->cache[trim($path,'/') . '/' . $child->getName()] = $child; + + } + return $children; + + } + + /** + * This method is called with every tree update + * + * Examples of tree updates are: + * * node deletions + * * node creations + * * copy + * * move + * * renaming nodes + * + * If Tree classes implement a form of caching, this will allow + * them to make sure caches will be expired. + * + * If a path is passed, it is assumed that the entire subtree is dirty + * + * @param string $path + * @return void + */ + public function markDirty($path) { + + // We don't care enough about sub-paths + // flushing the entire cache + $path = trim($path,'/'); + foreach($this->cache as $nodePath=>$node) { + if ($nodePath == $path || strpos($nodePath,$path.'/')===0) + unset($this->cache[$nodePath]); + + } + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/PartialUpdate/IFile.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/PartialUpdate/IFile.php new file mode 100755 index 00000000..a3eee51e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/PartialUpdate/IFile.php @@ -0,0 +1,40 @@ +addPlugin($patchPlugin); + * + * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/). + * @author Jean-Tiare LE BIGOT (http://www.jtlebi.fr/) + * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License + */ +class Plugin extends DAV\ServerPlugin { + + /** + * Reference to server + * + * @var SabreForRainLoop\DAV\Server + */ + protected $server; + + /** + * Initializes the plugin + * + * This method is automatically called by the Server class after addPlugin. + * + * @param DAV\Server $server + * @return void + */ + public function initialize(DAV\Server $server) { + + $this->server = $server; + $server->subscribeEvent('unknownMethod',array($this,'unknownMethod')); + + } + + /** + * Returns a plugin name. + * + * Using this name other plugins will be able to access other plugins + * using DAV\Server::getPlugin + * + * @return string + */ + public function getPluginName() { + + return 'partialupdate'; + + } + + /** + * This method is called by the Server if the user used an HTTP method + * the server didn't recognize. + * + * This plugin intercepts the PATCH methods. + * + * @param string $method + * @param string $uri + * @return bool|null + */ + public function unknownMethod($method, $uri) { + + switch($method) { + + case 'PATCH': + return $this->httpPatch($uri); + + } + + } + + /** + * Use this method to tell the server this plugin defines additional + * HTTP methods. + * + * This method is passed a uri. It should only return HTTP methods that are + * available for the specified uri. + * + * We claim to support PATCH method (partial update) if and only if + * - the node exist + * - the node implements our partial update interface + * + * @param string $uri + * @return array + */ + public function getHTTPMethods($uri) { + + $tree = $this->server->tree; + + if ($tree->nodeExists($uri) && + $tree->getNodeForPath($uri) instanceof IFile) { + return array('PATCH'); + } + + return array(); + + } + + /** + * Returns a list of features for the HTTP OPTIONS Dav: header. + * + * @return array + */ + public function getFeatures() { + + return array('sabredav-partialupdate'); + + } + + /** + * Patch an uri + * + * The WebDAV patch request can be used to modify only a part of an + * existing resource. If the resource does not exist yet and the first + * offset is not 0, the request fails + * + * @param string $uri + * @return void + */ + protected function httpPatch($uri) { + + // Get the node. Will throw a 404 if not found + $node = $this->server->tree->getNodeForPath($uri); + if (!($node instanceof IFile)) { + throw new DAV\Exception\MethodNotAllowed('The target resource does not support the PATCH method.'); + } + + $range = $this->getHTTPUpdateRange(); + + if (!$range) { + throw new DAV\Exception\BadRequest('No valid "X-Update-Range" found in the headers'); + } + + $contentType = strtolower( + $this->server->httpRequest->getHeader('Content-Type') + ); + + if ($contentType != 'application/x-sabredav-partialupdate') { + throw new DAV\Exception\UnsupportedMediaType('Unknown Content-Type header "' . $contentType . '"'); + } + + $len = $this->server->httpRequest->getHeader('Content-Length'); + + // Load the begin and end data + $start = ($range[0])?$range[0]:0; + $end = ($range[1])?$range[1]:$len-1; + + // Check consistency + if($end < $start) + throw new DAV\Exception\RequestedRangeNotSatisfiable('The end offset (' . $range[1] . ') is lower than the start offset (' . $range[0] . ')'); + if($end - $start + 1 != $len) + throw new DAV\Exception\RequestedRangeNotSatisfiable('Actual data length (' . $len . ') is not consistent with begin (' . $range[0] . ') and end (' . $range[1] . ') offsets'); + + // Checking If-None-Match and related headers. + if (!$this->server->checkPreconditions()) return; + + if (!$this->server->broadcastEvent('beforeWriteContent',array($uri, $node, null))) + return; + + $body = $this->server->httpRequest->getBody(); + $etag = $node->putRange($body, $start-1); + + $this->server->broadcastEvent('afterWriteContent',array($uri, $node)); + + $this->server->httpResponse->setHeader('Content-Length','0'); + if ($etag) $this->server->httpResponse->setHeader('ETag',$etag); + $this->server->httpResponse->sendStatus(204); + + return false; + + } + + /** + * Returns the HTTP custom range update header + * + * This method returns null if there is no well-formed HTTP range request + * header or array($start, $end). + * + * The first number is the offset of the first byte in the range. + * The second number is the offset of the last byte in the range. + * + * If the second offset is null, it should be treated as the offset of the last byte of the entity + * If the first offset is null, the second offset should be used to retrieve the last x bytes of the entity + * + * @return array|null + */ + public function getHTTPUpdateRange() { + + $range = $this->server->httpRequest->getHeader('X-Update-Range'); + if (is_null($range)) return null; + + // Matching "Range: bytes=1234-5678: both numbers are optional + + if (!preg_match('/^bytes=([0-9]*)-([0-9]*)$/i',$range,$matches)) return null; + + if ($matches[1]==='' && $matches[2]==='') return null; + + return array( + $matches[1]!==''?$matches[1]:null, + $matches[2]!==''?$matches[2]:null, + ); + + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property.php new file mode 100755 index 00000000..36d4ea69 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property.php @@ -0,0 +1,31 @@ +time = $time; + } elseif (is_int($time) || ctype_digit($time)) { + $this->time = new \DateTime('@' . $time); + } else { + $this->time = new \DateTime($time); + } + + // Setting timezone to UTC + $this->time->setTimezone(new \DateTimeZone('UTC')); + + } + + /** + * serialize + * + * @param DAV\Server $server + * @param \DOMElement $prop + * @return void + */ + public function serialize(DAV\Server $server, \DOMElement $prop) { + + $doc = $prop->ownerDocument; + //$prop->setAttribute('xmlns:b','urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/'); + //$prop->setAttribute('b:dt','dateTime.rfc1123'); + $prop->nodeValue = HTTP\Util::toHTTPDate($this->time); + + } + + /** + * getTime + * + * @return \DateTime + */ + public function getTime() { + + return $this->time; + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/Href.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/Href.php new file mode 100755 index 00000000..71dcc244 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/Href.php @@ -0,0 +1,99 @@ +href = $href; + $this->autoPrefix = $autoPrefix; + + } + + /** + * Returns the uri + * + * @return string + */ + public function getHref() { + + return $this->href; + + } + + /** + * Serializes this property. + * + * It will additionally prepend the href property with the server's base uri. + * + * @param DAV\Server $server + * @param \DOMElement $dom + * @return void + */ + public function serialize(DAV\Server $server, \DOMElement $dom) { + + $prefix = $server->xmlNamespaces['DAV:']; + $elem = $dom->ownerDocument->createElement($prefix . ':href'); + + if ($this->autoPrefix) { + $value = $server->getBaseUri() . DAV\URLUtil::encodePath($this->href); + } else { + $value = $this->href; + } + $elem->appendChild($dom->ownerDocument->createTextNode($value)); + + $dom->appendChild($elem); + + } + + /** + * Unserializes this property from a DOM Element + * + * This method returns an instance of this class. + * It will only decode {DAV:}href values. For non-compatible elements null will be returned. + * + * @param \DOMElement $dom + * @return DAV\Property\Href + */ + static function unserialize(\DOMElement $dom) { + + if ($dom->firstChild && DAV\XMLUtil::toClarkNotation($dom->firstChild)==='{DAV:}href') { + return new self($dom->firstChild->textContent,false); + } + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/HrefList.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/HrefList.php new file mode 100755 index 00000000..05ba266a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/HrefList.php @@ -0,0 +1,105 @@ +hrefs = $hrefs; + $this->autoPrefix = $autoPrefix; + + } + + /** + * Returns the uris + * + * @return array + */ + public function getHrefs() { + + return $this->hrefs; + + } + + /** + * Serializes this property. + * + * It will additionally prepend the href property with the server's base uri. + * + * @param DAV\Server $server + * @param \DOMElement $dom + * @return void + */ + public function serialize(DAV\Server $server,\DOMElement $dom) { + + $prefix = $server->xmlNamespaces['DAV:']; + + foreach($this->hrefs as $href) { + + $elem = $dom->ownerDocument->createElement($prefix . ':href'); + if ($this->autoPrefix) { + $value = $server->getBaseUri() . DAV\URLUtil::encodePath($href); + } else { + $value = $href; + } + $elem->appendChild($dom->ownerDocument->createTextNode($value)); + + $dom->appendChild($elem); + } + + } + + /** + * Unserializes this property from a DOM Element + * + * This method returns an instance of this class. + * It will only decode {DAV:}href values. + * + * @param \DOMElement $dom + * @return DAV\Property\HrefList + */ + static function unserialize(\DOMElement $dom) { + + $hrefs = array(); + foreach($dom->childNodes as $child) { + if (DAV\XMLUtil::toClarkNotation($child)==='{DAV:}href') { + $hrefs[] = $child->textContent; + } + } + return new self($hrefs, false); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/IHref.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/IHref.php new file mode 100755 index 00000000..d2b4d4d2 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/IHref.php @@ -0,0 +1,25 @@ +locks = $locks; + $this->revealLockToken = $revealLockToken; + + } + + /** + * serialize + * + * @param DAV\Server $server + * @param \DOMElement $prop + * @return void + */ + public function serialize(DAV\Server $server, \DOMElement $prop) { + + $doc = $prop->ownerDocument; + + foreach($this->locks as $lock) { + + $activeLock = $doc->createElementNS('DAV:','d:activelock'); + $prop->appendChild($activeLock); + + $lockScope = $doc->createElementNS('DAV:','d:lockscope'); + $activeLock->appendChild($lockScope); + + $lockScope->appendChild($doc->createElementNS('DAV:','d:' . ($lock->scope==DAV\Locks\LockInfo::EXCLUSIVE?'exclusive':'shared'))); + + $lockType = $doc->createElementNS('DAV:','d:locktype'); + $activeLock->appendChild($lockType); + + $lockType->appendChild($doc->createElementNS('DAV:','d:write')); + + /* {DAV:}lockroot */ + if (!self::$hideLockRoot) { + $lockRoot = $doc->createElementNS('DAV:','d:lockroot'); + $activeLock->appendChild($lockRoot); + $href = $doc->createElementNS('DAV:','d:href'); + $href->appendChild($doc->createTextNode($server->getBaseUri() . $lock->uri)); + $lockRoot->appendChild($href); + } + + $activeLock->appendChild($doc->createElementNS('DAV:','d:depth',($lock->depth == DAV\Server::DEPTH_INFINITY?'infinity':$lock->depth))); + $activeLock->appendChild($doc->createElementNS('DAV:','d:timeout','Second-' . $lock->timeout)); + + if ($this->revealLockToken) { + $lockToken = $doc->createElementNS('DAV:','d:locktoken'); + $activeLock->appendChild($lockToken); + $lockToken->appendChild($doc->createElementNS('DAV:','d:href','opaquelocktoken:' . $lock->token)); + } + + $activeLock->appendChild($doc->createElementNS('DAV:','d:owner',$lock->owner)); + + } + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/ResourceType.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/ResourceType.php new file mode 100755 index 00000000..7d12e313 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/ResourceType.php @@ -0,0 +1,127 @@ +resourceType = array(); + elseif ($resourceType === DAV\Server::NODE_DIRECTORY) + $this->resourceType = array('{DAV:}collection'); + elseif (is_array($resourceType)) + $this->resourceType = $resourceType; + else + $this->resourceType = array($resourceType); + + } + + /** + * serialize + * + * @param DAV\Server $server + * @param \DOMElement $prop + * @return void + */ + public function serialize(DAV\Server $server, \DOMElement $prop) { + + $propName = null; + $rt = $this->resourceType; + + foreach($rt as $resourceType) { + if (preg_match('/^{([^}]*)}(.*)$/',$resourceType,$propName)) { + + if (isset($server->xmlNamespaces[$propName[1]])) { + $prop->appendChild($prop->ownerDocument->createElement($server->xmlNamespaces[$propName[1]] . ':' . $propName[2])); + } else { + $prop->appendChild($prop->ownerDocument->createElementNS($propName[1],'custom:' . $propName[2])); + } + + } + } + + } + + /** + * Returns the values in clark-notation + * + * For example array('{DAV:}collection') + * + * @return array + */ + public function getValue() { + + return $this->resourceType; + + } + + /** + * Checks if the principal contains a certain value + * + * @param string $type + * @return bool + */ + public function is($type) { + + return in_array($type, $this->resourceType); + + } + + /** + * Adds a resourcetype value to this property + * + * @param string $type + * @return void + */ + public function add($type) { + + $this->resourceType[] = $type; + $this->resourceType = array_unique($this->resourceType); + + } + + /** + * Unserializes a DOM element into a ResourceType property. + * + * @param \DOMElement $dom + * @return DAV\Property\ResourceType + */ + static public function unserialize(\DOMElement $dom) { + + $value = array(); + foreach($dom->childNodes as $child) { + + $value[] = DAV\XMLUtil::toClarkNotation($child); + + } + + return new self($value); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/Response.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/Response.php new file mode 100755 index 00000000..151e795d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/Response.php @@ -0,0 +1,157 @@ +href = $href; + $this->responseProperties = $responseProperties; + + } + + /** + * Returns the url + * + * @return string + */ + public function getHref() { + + return $this->href; + + } + + /** + * Returns the property list + * + * @return array + */ + public function getResponseProperties() { + + return $this->responseProperties; + + } + + /** + * serialize + * + * @param DAV\Server $server + * @param \DOMElement $dom + * @return void + */ + public function serialize(DAV\Server $server, \DOMElement $dom) { + + $document = $dom->ownerDocument; + $properties = $this->responseProperties; + + $xresponse = $document->createElement('d:response'); + $dom->appendChild($xresponse); + + $uri = DAV\URLUtil::encodePath($this->href); + + // Adding the baseurl to the beginning of the url + $uri = $server->getBaseUri() . $uri; + + $xresponse->appendChild($document->createElement('d:href',$uri)); + + // The properties variable is an array containing properties, grouped by + // HTTP status + foreach($properties as $httpStatus=>$propertyGroup) { + + // The 'href' is also in this array, and it's special cased. + // We will ignore it + if ($httpStatus=='href') continue; + + // If there are no properties in this group, we can also just carry on + if (!count($propertyGroup)) continue; + + $xpropstat = $document->createElement('d:propstat'); + $xresponse->appendChild($xpropstat); + + $xprop = $document->createElement('d:prop'); + $xpropstat->appendChild($xprop); + + $nsList = $server->xmlNamespaces; + + foreach($propertyGroup as $propertyName=>$propertyValue) { + + $propName = null; + preg_match('/^{([^}]*)}(.*)$/',$propertyName,$propName); + + // special case for empty namespaces + if ($propName[1]=='') { + + $currentProperty = $document->createElement($propName[2]); + $xprop->appendChild($currentProperty); + $currentProperty->setAttribute('xmlns',''); + + } else { + + if (!isset($nsList[$propName[1]])) { + $nsList[$propName[1]] = 'x' . count($nsList); + } + + // If the namespace was defined in the top-level xml namespaces, it means + // there was already a namespace declaration, and we don't have to worry about it. + if (isset($server->xmlNamespaces[$propName[1]])) { + $currentProperty = $document->createElement($nsList[$propName[1]] . ':' . $propName[2]); + } else { + $currentProperty = $document->createElementNS($propName[1],$nsList[$propName[1]].':' . $propName[2]); + } + $xprop->appendChild($currentProperty); + + } + + if (is_scalar($propertyValue)) { + $text = $document->createTextNode($propertyValue); + $currentProperty->appendChild($text); + } elseif ($propertyValue instanceof DAV\PropertyInterface) { + $propertyValue->serialize($server,$currentProperty); + } elseif (!is_null($propertyValue)) { + throw new DAV\Exception('Unknown property value type: ' . gettype($propertyValue) . ' for property: ' . $propertyName); + } + + } + + $xpropstat->appendChild($document->createElement('d:status',$server->httpResponse->getStatusMessage($httpStatus))); + + } + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/ResponseList.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/ResponseList.php new file mode 100755 index 00000000..62c4308f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/ResponseList.php @@ -0,0 +1,59 @@ +responses = $responses; + + } + + /** + * serialize + * + * @param DAV\Server $server + * @param \DOMElement $dom + * @return void + */ + public function serialize(DAV\Server $server,\DOMElement $dom) { + + foreach($this->responses as $response) { + $response->serialize($server, $dom); + } + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/SupportedLock.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/SupportedLock.php new file mode 100755 index 00000000..5ddde647 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/SupportedLock.php @@ -0,0 +1,78 @@ +supportsLocks = $supportsLocks; + + } + + /** + * serialize + * + * @param DAV\Server $server + * @param \DOMElement $prop + * @return void + */ + public function serialize(DAV\Server $server,\DOMElement $prop) { + + $doc = $prop->ownerDocument; + + if (!$this->supportsLocks) return null; + + $lockEntry1 = $doc->createElement('d:lockentry'); + $lockEntry2 = $doc->createElement('d:lockentry'); + + $prop->appendChild($lockEntry1); + $prop->appendChild($lockEntry2); + + $lockScope1 = $doc->createElement('d:lockscope'); + $lockScope2 = $doc->createElement('d:lockscope'); + $lockType1 = $doc->createElement('d:locktype'); + $lockType2 = $doc->createElement('d:locktype'); + + $lockEntry1->appendChild($lockScope1); + $lockEntry1->appendChild($lockType1); + $lockEntry2->appendChild($lockScope2); + $lockEntry2->appendChild($lockType2); + + $lockScope1->appendChild($doc->createElement('d:exclusive')); + $lockScope2->appendChild($doc->createElement('d:shared')); + + $lockType1->appendChild($doc->createElement('d:write')); + $lockType2->appendChild($doc->createElement('d:write')); + + //$frag->appendXML(''); + //$frag->appendXML(''); + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/SupportedReportSet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/SupportedReportSet.php new file mode 100755 index 00000000..d0273e46 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/SupportedReportSet.php @@ -0,0 +1,111 @@ +addReport($reports); + + } + + /** + * Adds a report to this property + * + * The report must be a string in clark-notation. + * Multiple reports can be specified as an array. + * + * @param mixed $report + * @return void + */ + public function addReport($report) { + + if (!is_array($report)) $report = array($report); + + foreach($report as $r) { + + if (!preg_match('/^{([^}]*)}(.*)$/',$r)) + throw new DAV\Exception('Reportname must be in clark-notation'); + + $this->reports[] = $r; + + } + + } + + /** + * Returns the list of supported reports + * + * @return array + */ + public function getValue() { + + return $this->reports; + + } + + /** + * Serializes the node + * + * @param DAV\Server $server + * @param \DOMElement $prop + * @return void + */ + public function serialize(DAV\Server $server, \DOMElement $prop) { + + foreach($this->reports as $reportName) { + + $supportedReport = $prop->ownerDocument->createElement('d:supported-report'); + $prop->appendChild($supportedReport); + + $report = $prop->ownerDocument->createElement('d:report'); + $supportedReport->appendChild($report); + + preg_match('/^{([^}]*)}(.*)$/',$reportName,$matches); + + list(, $namespace, $element) = $matches; + + $prefix = isset($server->xmlNamespaces[$namespace])?$server->xmlNamespaces[$namespace]:null; + + if ($prefix) { + $report->appendChild($prop->ownerDocument->createElement($prefix . ':' . $element)); + } else { + $report->appendChild($prop->ownerDocument->createElementNS($namespace, 'x:' . $element)); + } + + } + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/PropertyInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/PropertyInterface.php new file mode 100755 index 00000000..fe0c016e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/PropertyInterface.php @@ -0,0 +1,21 @@ + 'd', + 'http://sabredav.org/ns' => 's', + ); + + /** + * The propertymap can be used to map properties from + * requests to property classes. + * + * @var array + */ + public $propertyMap = array( + '{DAV:}resourcetype' => 'SabreForRainLoop\\DAV\\Property\\ResourceType', + ); + + public $protectedProperties = array( + // RFC4918 + '{DAV:}getcontentlength', + '{DAV:}getetag', + '{DAV:}getlastmodified', + '{DAV:}lockdiscovery', + '{DAV:}supportedlock', + + // RFC4331 + '{DAV:}quota-available-bytes', + '{DAV:}quota-used-bytes', + + // RFC3744 + '{DAV:}supported-privilege-set', + '{DAV:}current-user-privilege-set', + '{DAV:}acl', + '{DAV:}acl-restrictions', + '{DAV:}inherited-acl-set', + + ); + + /** + * This is a flag that allow or not showing file, line and code + * of the exception in the returned XML + * + * @var bool + */ + public $debugExceptions = false; + + /** + * This property allows you to automatically add the 'resourcetype' value + * based on a node's classname or interface. + * + * The preset ensures that {DAV:}collection is automaticlly added for nodes + * implementing SabreForRainLoop\DAV\ICollection. + * + * @var array + */ + public $resourceTypeMapping = array( + 'SabreForRainLoop\\DAV\\ICollection' => '{DAV:}collection', + ); + + /** + * If this setting is turned off, SabreDAV's version number will be hidden + * from various places. + * + * Some people feel this is a good security measure. + * + * @var bool + */ + static public $exposeVersion = true; + + /** + * Sets up the server + * + * If a SabreForRainLoop\DAV\Tree object is passed as an argument, it will + * use it as the directory tree. If a SabreForRainLoop\DAV\INode is passed, it + * will create a SabreForRainLoop\DAV\ObjectTree and use the node as the root. + * + * If nothing is passed, a SabreForRainLoop\DAV\SimpleCollection is created in + * a SabreForRainLoop\DAV\ObjectTree. + * + * If an array is passed, we automatically create a root node, and use + * the nodes in the array as top-level children. + * + * @param Tree|INode|array|null $treeOrNode The tree object + */ + public function __construct($treeOrNode = null) { + + if ($treeOrNode instanceof Tree) { + $this->tree = $treeOrNode; + } elseif ($treeOrNode instanceof INode) { + $this->tree = new ObjectTree($treeOrNode); + } elseif (is_array($treeOrNode)) { + + // If it's an array, a list of nodes was passed, and we need to + // create the root node. + foreach($treeOrNode as $node) { + if (!($node instanceof INode)) { + throw new Exception('Invalid argument passed to constructor. If you\'re passing an array, all the values must implement SabreForRainLoop\\DAV\\INode'); + } + } + + $root = new SimpleCollection('root', $treeOrNode); + $this->tree = new ObjectTree($root); + + } elseif (is_null($treeOrNode)) { + $root = new SimpleCollection('root'); + $this->tree = new ObjectTree($root); + } else { + throw new Exception('Invalid argument passed to constructor. Argument must either be an instance of SabreForRainLoop\\DAV\\Tree, SabreForRainLoop\\DAV\\INode, an array or null'); + } + $this->httpResponse = new HTTP\Response(); + $this->httpRequest = new HTTP\Request(); + + } + + /** + * Starts the DAV Server + * + * @return void + */ + public function exec() { + + try { + + // If nginx (pre-1.2) is used as a proxy server, and SabreDAV as an + // origin, we must make sure we send back HTTP/1.0 if this was + // requested. + // This is mainly because nginx doesn't support Chunked Transfer + // Encoding, and this forces the webserver SabreDAV is running on, + // to buffer entire responses to calculate Content-Length. + $this->httpResponse->defaultHttpVersion = $this->httpRequest->getHTTPVersion(); + + $this->invokeMethod($this->httpRequest->getMethod(), $this->getRequestUri()); + + } catch (Exception $e) { + + try { + $this->broadcastEvent('exception', array($e)); + } catch (Exception $ignore) { + } + $DOM = new \DOMDocument('1.0','utf-8'); + $DOM->formatOutput = true; + + $error = $DOM->createElementNS('DAV:','d:error'); + $error->setAttribute('xmlns:s',self::NS_SABREDAV); + $DOM->appendChild($error); + + $h = function($v) { + + return htmlspecialchars($v, ENT_NOQUOTES, 'UTF-8'); + + }; + + $error->appendChild($DOM->createElement('s:exception',$h(get_class($e)))); + $error->appendChild($DOM->createElement('s:message',$h($e->getMessage()))); + if ($this->debugExceptions) { + $error->appendChild($DOM->createElement('s:file',$h($e->getFile()))); + $error->appendChild($DOM->createElement('s:line',$h($e->getLine()))); + $error->appendChild($DOM->createElement('s:code',$h($e->getCode()))); + $error->appendChild($DOM->createElement('s:stacktrace',$h($e->getTraceAsString()))); + + } + if (self::$exposeVersion) { + $error->appendChild($DOM->createElement('s:sabredav-version',$h(Version::VERSION))); + } + + if($e instanceof Exception) { + + $httpCode = $e->getHTTPCode(); + $e->serialize($this,$error); + $headers = $e->getHTTPHeaders($this); + + } else { + + $httpCode = 500; + $headers = array(); + + } + $headers['Content-Type'] = 'application/xml; charset=utf-8'; + + $this->httpResponse->sendStatus($httpCode); + $this->httpResponse->setHeaders($headers); + $this->httpResponse->sendBody($DOM->saveXML()); + + } + + } + + /** + * Sets the base server uri + * + * @param string $uri + * @return void + */ + public function setBaseUri($uri) { + + // If the baseUri does not end with a slash, we must add it + if ($uri[strlen($uri)-1]!=='/') + $uri.='/'; + + $this->baseUri = $uri; + + } + + /** + * Returns the base responding uri + * + * @return string + */ + public function getBaseUri() { + + if (is_null($this->baseUri)) $this->baseUri = $this->guessBaseUri(); + return $this->baseUri; + + } + + /** + * This method attempts to detect the base uri. + * Only the PATH_INFO variable is considered. + * + * If this variable is not set, the root (/) is assumed. + * + * @return string + */ + public function guessBaseUri() { + + $pathInfo = $this->httpRequest->getRawServerValue('PATH_INFO'); + $uri = $this->httpRequest->getRawServerValue('REQUEST_URI'); + + // If PATH_INFO is found, we can assume it's accurate. + if (!empty($pathInfo)) { + + // We need to make sure we ignore the QUERY_STRING part + if ($pos = strpos($uri,'?')) + $uri = substr($uri,0,$pos); + + // PATH_INFO is only set for urls, such as: /example.php/path + // in that case PATH_INFO contains '/path'. + // Note that REQUEST_URI is percent encoded, while PATH_INFO is + // not, Therefore they are only comparable if we first decode + // REQUEST_INFO as well. + $decodedUri = URLUtil::decodePath($uri); + + // A simple sanity check: + if(substr($decodedUri,strlen($decodedUri)-strlen($pathInfo))===$pathInfo) { + $baseUri = substr($decodedUri,0,strlen($decodedUri)-strlen($pathInfo)); + return rtrim($baseUri,'/') . '/'; + } + + throw new Exception('The REQUEST_URI ('. $uri . ') did not end with the contents of PATH_INFO (' . $pathInfo . '). This server might be misconfigured.'); + + } + + // The last fallback is that we're just going to assume the server root. + return '/'; + + } + + /** + * Adds a plugin to the server + * + * For more information, console the documentation of SabreForRainLoop\DAV\ServerPlugin + * + * @param ServerPlugin $plugin + * @return void + */ + public function addPlugin(ServerPlugin $plugin) { + + $this->plugins[$plugin->getPluginName()] = $plugin; + $plugin->initialize($this); + + } + + /** + * Returns an initialized plugin by it's name. + * + * This function returns null if the plugin was not found. + * + * @param string $name + * @return ServerPlugin + */ + public function getPlugin($name) { + + if (isset($this->plugins[$name])) + return $this->plugins[$name]; + + // This is a fallback and deprecated. + foreach($this->plugins as $plugin) { + if (get_class($plugin)===$name) return $plugin; + } + + return null; + + } + + /** + * Returns all plugins + * + * @return array + */ + public function getPlugins() { + + return $this->plugins; + + } + + + /** + * Subscribe to an event. + * + * When the event is triggered, we'll call all the specified callbacks. + * It is possible to control the order of the callbacks through the + * priority argument. + * + * This is for example used to make sure that the authentication plugin + * is triggered before anything else. If it's not needed to change this + * number, it is recommended to ommit. + * + * @param string $event + * @param callback $callback + * @param int $priority + * @return void + */ + public function subscribeEvent($event, $callback, $priority = 100) { + + if (!isset($this->eventSubscriptions[$event])) { + $this->eventSubscriptions[$event] = array(); + } + while(isset($this->eventSubscriptions[$event][$priority])) $priority++; + $this->eventSubscriptions[$event][$priority] = $callback; + ksort($this->eventSubscriptions[$event]); + + } + + /** + * Broadcasts an event + * + * This method will call all subscribers. If one of the subscribers returns false, the process stops. + * + * The arguments parameter will be sent to all subscribers + * + * @param string $eventName + * @param array $arguments + * @return bool + */ + public function broadcastEvent($eventName,$arguments = array()) { + + if (isset($this->eventSubscriptions[$eventName])) { + + foreach($this->eventSubscriptions[$eventName] as $subscriber) { + + $result = call_user_func_array($subscriber,$arguments); + if ($result===false) return false; + + } + + } + + return true; + + } + + /** + * Handles a http request, and execute a method based on its name + * + * @param string $method + * @param string $uri + * @return void + */ + public function invokeMethod($method, $uri) { + + $method = strtoupper($method); + + if (!$this->broadcastEvent('beforeMethod',array($method, $uri))) return; + + // Make sure this is a HTTP method we support + $internalMethods = array( + 'OPTIONS', + 'GET', + 'HEAD', + 'DELETE', + 'PROPFIND', + 'MKCOL', + 'PUT', + 'PROPPATCH', + 'COPY', + 'MOVE', + 'REPORT' + ); + + if (in_array($method,$internalMethods)) { + + call_user_func(array($this,'http' . $method), $uri); + + } else { + + if ($this->broadcastEvent('unknownMethod',array($method, $uri))) { + // Unsupported method + throw new Exception\NotImplemented('There was no handler found for this "' . $method . '" method'); + } + + } + + } + + // {{{ HTTP Method implementations + + /** + * HTTP OPTIONS + * + * @param string $uri + * @return void + */ + protected function httpOptions($uri) { + + $methods = $this->getAllowedMethods($uri); + + $this->httpResponse->setHeader('Allow',strtoupper(implode(', ',$methods))); + $features = array('1','3', 'extended-mkcol'); + + foreach($this->plugins as $plugin) $features = array_merge($features,$plugin->getFeatures()); + + $this->httpResponse->setHeader('DAV',implode(', ',$features)); + $this->httpResponse->setHeader('MS-Author-Via','DAV'); + $this->httpResponse->setHeader('Accept-Ranges','bytes'); + if (self::$exposeVersion) { + $this->httpResponse->setHeader('X-Sabre-Version',Version::VERSION); + } + $this->httpResponse->setHeader('Content-Length',0); + $this->httpResponse->sendStatus(200); + + } + + /** + * HTTP GET + * + * This method simply fetches the contents of a uri, like normal + * + * @param string $uri + * @return bool + */ + protected function httpGet($uri) { + + $node = $this->tree->getNodeForPath($uri,0); + + if (!$this->checkPreconditions(true)) return false; + if (!$node instanceof IFile) throw new Exception\NotImplemented('GET is only implemented on File objects'); + + $body = $node->get(); + + // Converting string into stream, if needed. + if (is_string($body)) { + $stream = fopen('php://temp','r+'); + fwrite($stream,$body); + rewind($stream); + $body = $stream; + } + + /* + * TODO: getetag, getlastmodified, getsize should also be used using + * this method + */ + $httpHeaders = $this->getHTTPHeaders($uri); + + /* ContentType needs to get a default, because many webservers will otherwise + * default to text/html, and we don't want this for security reasons. + */ + if (!isset($httpHeaders['Content-Type'])) { + $httpHeaders['Content-Type'] = 'application/octet-stream'; + } + + + if (isset($httpHeaders['Content-Length'])) { + + $nodeSize = $httpHeaders['Content-Length']; + + // Need to unset Content-Length, because we'll handle that during figuring out the range + unset($httpHeaders['Content-Length']); + + } else { + $nodeSize = null; + } + + $this->httpResponse->setHeaders($httpHeaders); + + $range = $this->getHTTPRange(); + $ifRange = $this->httpRequest->getHeader('If-Range'); + $ignoreRangeHeader = false; + + // If ifRange is set, and range is specified, we first need to check + // the precondition. + if ($nodeSize && $range && $ifRange) { + + // if IfRange is parsable as a date we'll treat it as a DateTime + // otherwise, we must treat it as an etag. + try { + $ifRangeDate = new \DateTime($ifRange); + + // It's a date. We must check if the entity is modified since + // the specified date. + if (!isset($httpHeaders['Last-Modified'])) $ignoreRangeHeader = true; + else { + $modified = new \DateTime($httpHeaders['Last-Modified']); + if($modified > $ifRangeDate) $ignoreRangeHeader = true; + } + + } catch (\Exception $e) { + + // It's an entity. We can do a simple comparison. + if (!isset($httpHeaders['ETag'])) $ignoreRangeHeader = true; + elseif ($httpHeaders['ETag']!==$ifRange) $ignoreRangeHeader = true; + } + } + + // We're only going to support HTTP ranges if the backend provided a filesize + if (!$ignoreRangeHeader && $nodeSize && $range) { + + // Determining the exact byte offsets + if (!is_null($range[0])) { + + $start = $range[0]; + $end = $range[1]?$range[1]:$nodeSize-1; + if($start >= $nodeSize) + throw new Exception\RequestedRangeNotSatisfiable('The start offset (' . $range[0] . ') exceeded the size of the entity (' . $nodeSize . ')'); + + if($end < $start) throw new Exception\RequestedRangeNotSatisfiable('The end offset (' . $range[1] . ') is lower than the start offset (' . $range[0] . ')'); + if($end >= $nodeSize) $end = $nodeSize-1; + + } else { + + $start = $nodeSize-$range[1]; + $end = $nodeSize-1; + + if ($start<0) $start = 0; + + } + + // New read/write stream + $newStream = fopen('php://temp','r+'); + + // stream_copy_to_stream() has a bug/feature: the `whence` argument + // is interpreted as SEEK_SET (count from absolute offset 0), while + // for a stream it should be SEEK_CUR (count from current offset). + // If a stream is nonseekable, the function fails. So we *emulate* + // the correct behaviour with fseek(): + if ($start > 0) { + if (($curOffs = ftell($body)) === false) $curOffs = 0; + fseek($body, $start - $curOffs, SEEK_CUR); + } + stream_copy_to_stream($body, $newStream, $end-$start+1); + rewind($newStream); + + $this->httpResponse->setHeader('Content-Length', $end-$start+1); + $this->httpResponse->setHeader('Content-Range','bytes ' . $start . '-' . $end . '/' . $nodeSize); + $this->httpResponse->sendStatus(206); + $this->httpResponse->sendBody($newStream); + + + } else { + + if ($nodeSize) $this->httpResponse->setHeader('Content-Length',$nodeSize); + $this->httpResponse->sendStatus(200); + $this->httpResponse->sendBody($body); + + } + + } + + /** + * HTTP HEAD + * + * This method is normally used to take a peak at a url, and only get the HTTP response headers, without the body + * This is used by clients to determine if a remote file was changed, so they can use a local cached version, instead of downloading it again + * + * @param string $uri + * @return void + */ + protected function httpHead($uri) { + + $node = $this->tree->getNodeForPath($uri); + /* This information is only collection for File objects. + * Ideally we want to throw 405 Method Not Allowed for every + * non-file, but MS Office does not like this + */ + if ($node instanceof IFile) { + $headers = $this->getHTTPHeaders($this->getRequestUri()); + if (!isset($headers['Content-Type'])) { + $headers['Content-Type'] = 'application/octet-stream'; + } + $this->httpResponse->setHeaders($headers); + } + $this->httpResponse->sendStatus(200); + + } + + /** + * HTTP Delete + * + * The HTTP delete method, deletes a given uri + * + * @param string $uri + * @return void + */ + protected function httpDelete($uri) { + + if (!$this->broadcastEvent('beforeUnbind',array($uri))) return; + $this->tree->delete($uri); + $this->broadcastEvent('afterUnbind',array($uri)); + + $this->httpResponse->sendStatus(204); + $this->httpResponse->setHeader('Content-Length','0'); + + } + + + /** + * WebDAV PROPFIND + * + * This WebDAV method requests information about an uri resource, or a list of resources + * If a client wants to receive the properties for a single resource it will add an HTTP Depth: header with a 0 value + * If the value is 1, it means that it also expects a list of sub-resources (e.g.: files in a directory) + * + * The request body contains an XML data structure that has a list of properties the client understands + * The response body is also an xml document, containing information about every uri resource and the requested properties + * + * It has to return a HTTP 207 Multi-status status code + * + * @param string $uri + * @return void + */ + protected function httpPropfind($uri) { + + $requestedProperties = $this->parsePropFindRequest($this->httpRequest->getBody(true)); + + $depth = $this->getHTTPDepth(1); + // The only two options for the depth of a propfind is 0 or 1 + if ($depth!=0) $depth = 1; + + $newProperties = $this->getPropertiesForPath($uri,$requestedProperties,$depth); + + // This is a multi-status response + $this->httpResponse->sendStatus(207); + $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); + $this->httpResponse->setHeader('Vary','Brief,Prefer'); + + // Normally this header is only needed for OPTIONS responses, however.. + // iCal seems to also depend on these being set for PROPFIND. Since + // this is not harmful, we'll add it. + $features = array('1','3', 'extended-mkcol'); + foreach($this->plugins as $plugin) $features = array_merge($features,$plugin->getFeatures()); + $this->httpResponse->setHeader('DAV',implode(', ',$features)); + + $prefer = $this->getHTTPPrefer(); + $minimal = $prefer['return-minimal']; + + $data = $this->generateMultiStatus($newProperties, $minimal); + $this->httpResponse->sendBody($data); + + } + + /** + * WebDAV PROPPATCH + * + * This method is called to update properties on a Node. The request is an XML body with all the mutations. + * In this XML body it is specified which properties should be set/updated and/or deleted + * + * @param string $uri + * @return void + */ + protected function httpPropPatch($uri) { + + $newProperties = $this->parsePropPatchRequest($this->httpRequest->getBody(true)); + + $result = $this->updateProperties($uri, $newProperties); + + $prefer = $this->getHTTPPrefer(); + $this->httpResponse->setHeader('Vary','Brief,Prefer'); + + if ($prefer['return-minimal']) { + + // If return-minimal is specified, we only have to check if the + // request was succesful, and don't need to return the + // multi-status. + $ok = true; + foreach($result as $code=>$prop) { + if ((int)$code > 299) { + $ok = false; + } + } + + if ($ok) { + + $this->httpResponse->sendStatus(204); + return; + + } + + } + + $this->httpResponse->sendStatus(207); + $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); + + $this->httpResponse->sendBody( + $this->generateMultiStatus(array($result)) + ); + + } + + /** + * HTTP PUT method + * + * This HTTP method updates a file, or creates a new one. + * + * If a new resource was created, a 201 Created status code should be returned. If an existing resource is updated, it's a 204 No Content + * + * @param string $uri + * @return bool + */ + protected function httpPut($uri) { + + $body = $this->httpRequest->getBody(); + + // Intercepting Content-Range + if ($this->httpRequest->getHeader('Content-Range')) { + /** + Content-Range is dangerous for PUT requests: PUT per definition + stores a full resource. draft-ietf-httpbis-p2-semantics-15 says + in section 7.6: + An origin server SHOULD reject any PUT request that contains a + Content-Range header field, since it might be misinterpreted as + partial content (or might be partial content that is being mistakenly + PUT as a full representation). Partial content updates are possible + by targeting a separately identified resource with state that + overlaps a portion of the larger resource, or by using a different + method that has been specifically defined for partial updates (for + example, the PATCH method defined in [RFC5789]). + This clarifies RFC2616 section 9.6: + The recipient of the entity MUST NOT ignore any Content-* + (e.g. Content-Range) headers that it does not understand or implement + and MUST return a 501 (Not Implemented) response in such cases. + OTOH is a PUT request with a Content-Range currently the only way to + continue an aborted upload request and is supported by curl, mod_dav, + Tomcat and others. Since some clients do use this feature which results + in unexpected behaviour (cf PEAR::HTTP_WebDAV_Client 1.0.1), we reject + all PUT requests with a Content-Range for now. + */ + + throw new Exception\NotImplemented('PUT with Content-Range is not allowed.'); + } + + // Intercepting the Finder problem + if (($expected = $this->httpRequest->getHeader('X-Expected-Entity-Length')) && $expected > 0) { + + /** + Many webservers will not cooperate well with Finder PUT requests, + because it uses 'Chunked' transfer encoding for the request body. + + The symptom of this problem is that Finder sends files to the + server, but they arrive as 0-length files in PHP. + + If we don't do anything, the user might think they are uploading + files successfully, but they end up empty on the server. Instead, + we throw back an error if we detect this. + + The reason Finder uses Chunked, is because it thinks the files + might change as it's being uploaded, and therefore the + Content-Length can vary. + + Instead it sends the X-Expected-Entity-Length header with the size + of the file at the very start of the request. If this header is set, + but we don't get a request body we will fail the request to + protect the end-user. + */ + + // Only reading first byte + $firstByte = fread($body,1); + if (strlen($firstByte)!==1) { + throw new Exception\Forbidden('This server is not compatible with OS/X finder. Consider using a different WebDAV client or webserver.'); + } + + // The body needs to stay intact, so we copy everything to a + // temporary stream. + + $newBody = fopen('php://temp','r+'); + fwrite($newBody,$firstByte); + stream_copy_to_stream($body, $newBody); + rewind($newBody); + + $body = $newBody; + + } + + if ($this->tree->nodeExists($uri)) { + + $node = $this->tree->getNodeForPath($uri); + + // Checking If-None-Match and related headers. + if (!$this->checkPreconditions()) return; + + // If the node is a collection, we'll deny it + if (!($node instanceof IFile)) throw new Exception\Conflict('PUT is not allowed on non-files.'); + if (!$this->broadcastEvent('beforeWriteContent',array($uri, $node, &$body))) return false; + + $etag = $node->put($body); + + $this->broadcastEvent('afterWriteContent',array($uri, $node)); + + $this->httpResponse->setHeader('Content-Length','0'); + if ($etag) $this->httpResponse->setHeader('ETag',$etag); + $this->httpResponse->sendStatus(204); + + } else { + + $etag = null; + // If we got here, the resource didn't exist yet. + if (!$this->createFile($this->getRequestUri(),$body,$etag)) { + // For one reason or another the file was not created. + return; + } + + $this->httpResponse->setHeader('Content-Length','0'); + if ($etag) $this->httpResponse->setHeader('ETag', $etag); + $this->httpResponse->sendStatus(201); + + } + + } + + + /** + * WebDAV MKCOL + * + * The MKCOL method is used to create a new collection (directory) on the server + * + * @param string $uri + * @return void + */ + protected function httpMkcol($uri) { + + $requestBody = $this->httpRequest->getBody(true); + + if ($requestBody) { + + $contentType = $this->httpRequest->getHeader('Content-Type'); + if (strpos($contentType,'application/xml')!==0 && strpos($contentType,'text/xml')!==0) { + + // We must throw 415 for unsupported mkcol bodies + throw new Exception\UnsupportedMediaType('The request body for the MKCOL request must have an xml Content-Type'); + + } + + $dom = XMLUtil::loadDOMDocument($requestBody); + if (XMLUtil::toClarkNotation($dom->firstChild)!=='{DAV:}mkcol') { + + // We must throw 415 for unsupported mkcol bodies + throw new Exception\UnsupportedMediaType('The request body for the MKCOL request must be a {DAV:}mkcol request construct.'); + + } + + $properties = array(); + foreach($dom->firstChild->childNodes as $childNode) { + + if (XMLUtil::toClarkNotation($childNode)!=='{DAV:}set') continue; + $properties = array_merge($properties, XMLUtil::parseProperties($childNode, $this->propertyMap)); + + } + if (!isset($properties['{DAV:}resourcetype'])) + throw new Exception\BadRequest('The mkcol request must include a {DAV:}resourcetype property'); + + $resourceType = $properties['{DAV:}resourcetype']->getValue(); + unset($properties['{DAV:}resourcetype']); + + } else { + + $properties = array(); + $resourceType = array('{DAV:}collection'); + + } + + $result = $this->createCollection($uri, $resourceType, $properties); + + if (is_array($result)) { + $this->httpResponse->sendStatus(207); + $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); + + $this->httpResponse->sendBody( + $this->generateMultiStatus(array($result)) + ); + + } else { + $this->httpResponse->setHeader('Content-Length','0'); + $this->httpResponse->sendStatus(201); + } + + } + + /** + * WebDAV HTTP MOVE method + * + * This method moves one uri to a different uri. A lot of the actual request processing is done in getCopyMoveInfo + * + * @param string $uri + * @return bool + */ + protected function httpMove($uri) { + + $moveInfo = $this->getCopyAndMoveInfo(); + + // If the destination is part of the source tree, we must fail + if ($moveInfo['destination']==$uri) + throw new Exception\Forbidden('Source and destination uri are identical.'); + + if ($moveInfo['destinationExists']) { + + if (!$this->broadcastEvent('beforeUnbind',array($moveInfo['destination']))) return false; + $this->tree->delete($moveInfo['destination']); + $this->broadcastEvent('afterUnbind',array($moveInfo['destination'])); + + } + + if (!$this->broadcastEvent('beforeUnbind',array($uri))) return false; + if (!$this->broadcastEvent('beforeBind',array($moveInfo['destination']))) return false; + $this->tree->move($uri,$moveInfo['destination']); + $this->broadcastEvent('afterUnbind',array($uri)); + $this->broadcastEvent('afterBind',array($moveInfo['destination'])); + + // If a resource was overwritten we should send a 204, otherwise a 201 + $this->httpResponse->setHeader('Content-Length','0'); + $this->httpResponse->sendStatus($moveInfo['destinationExists']?204:201); + + } + + /** + * WebDAV HTTP COPY method + * + * This method copies one uri to a different uri, and works much like the MOVE request + * A lot of the actual request processing is done in getCopyMoveInfo + * + * @param string $uri + * @return bool + */ + protected function httpCopy($uri) { + + $copyInfo = $this->getCopyAndMoveInfo(); + // If the destination is part of the source tree, we must fail + if ($copyInfo['destination']==$uri) + throw new Exception\Forbidden('Source and destination uri are identical.'); + + if ($copyInfo['destinationExists']) { + if (!$this->broadcastEvent('beforeUnbind',array($copyInfo['destination']))) return false; + $this->tree->delete($copyInfo['destination']); + + } + if (!$this->broadcastEvent('beforeBind',array($copyInfo['destination']))) return false; + $this->tree->copy($uri,$copyInfo['destination']); + $this->broadcastEvent('afterBind',array($copyInfo['destination'])); + + // If a resource was overwritten we should send a 204, otherwise a 201 + $this->httpResponse->setHeader('Content-Length','0'); + $this->httpResponse->sendStatus($copyInfo['destinationExists']?204:201); + + } + + + + /** + * HTTP REPORT method implementation + * + * Although the REPORT method is not part of the standard WebDAV spec (it's from rfc3253) + * It's used in a lot of extensions, so it made sense to implement it into the core. + * + * @param string $uri + * @return void + */ + protected function httpReport($uri) { + + $body = $this->httpRequest->getBody(true); + $dom = XMLUtil::loadDOMDocument($body); + + $reportName = XMLUtil::toClarkNotation($dom->firstChild); + + if ($this->broadcastEvent('report',array($reportName,$dom, $uri))) { + + // If broadcastEvent returned true, it means the report was not supported + throw new Exception\ReportNotSupported(); + + } + + } + + // }}} + // {{{ HTTP/WebDAV protocol helpers + + /** + * Returns an array with all the supported HTTP methods for a specific uri. + * + * @param string $uri + * @return array + */ + public function getAllowedMethods($uri) { + + $methods = array( + 'OPTIONS', + 'GET', + 'HEAD', + 'DELETE', + 'PROPFIND', + 'PUT', + 'PROPPATCH', + 'COPY', + 'MOVE', + 'REPORT' + ); + + // The MKCOL is only allowed on an unmapped uri + try { + $this->tree->getNodeForPath($uri); + } catch (Exception\NotFound $e) { + $methods[] = 'MKCOL'; + } + + // We're also checking if any of the plugins register any new methods + foreach($this->plugins as $plugin) $methods = array_merge($methods, $plugin->getHTTPMethods($uri)); + array_unique($methods); + + return $methods; + + } + + /** + * Gets the uri for the request, keeping the base uri into consideration + * + * @return string + */ + public function getRequestUri() { + + return $this->calculateUri($this->httpRequest->getUri()); + + } + + /** + * Calculates the uri for a request, making sure that the base uri is stripped out + * + * @param string $uri + * @throws Exception\Forbidden A permission denied exception is thrown whenever there was an attempt to supply a uri outside of the base uri + * @return string + */ + public function calculateUri($uri) { + + if ($uri[0]!='/' && strpos($uri,'://')) { + + $uri = parse_url($uri,PHP_URL_PATH); + + } + + $uri = str_replace('//','/',$uri); + + if (strpos($uri,$this->getBaseUri())===0) { + + return trim(URLUtil::decodePath(substr($uri,strlen($this->getBaseUri()))),'/'); + + // A special case, if the baseUri was accessed without a trailing + // slash, we'll accept it as well. + } elseif ($uri.'/' === $this->getBaseUri()) { + + return ''; + + } else { + + throw new Exception\Forbidden('Requested uri (' . $uri . ') is out of base uri (' . $this->getBaseUri() . ')'); + + } + + } + + /** + * Returns the HTTP depth header + * + * This method returns the contents of the HTTP depth request header. If the depth header was 'infinity' it will return the SabreForRainLoop\DAV\Server::DEPTH_INFINITY object + * It is possible to supply a default depth value, which is used when the depth header has invalid content, or is completely non-existent + * + * @param mixed $default + * @return int + */ + public function getHTTPDepth($default = self::DEPTH_INFINITY) { + + // If its not set, we'll grab the default + $depth = $this->httpRequest->getHeader('Depth'); + + if (is_null($depth)) return $default; + + if ($depth == 'infinity') return self::DEPTH_INFINITY; + + + // If its an unknown value. we'll grab the default + if (!ctype_digit($depth)) return $default; + + return (int)$depth; + + } + + /** + * Returns the HTTP range header + * + * This method returns null if there is no well-formed HTTP range request + * header or array($start, $end). + * + * The first number is the offset of the first byte in the range. + * The second number is the offset of the last byte in the range. + * + * If the second offset is null, it should be treated as the offset of the last byte of the entity + * If the first offset is null, the second offset should be used to retrieve the last x bytes of the entity + * + * @return array|null + */ + public function getHTTPRange() { + + $range = $this->httpRequest->getHeader('range'); + if (is_null($range)) return null; + + // Matching "Range: bytes=1234-5678: both numbers are optional + + if (!preg_match('/^bytes=([0-9]*)-([0-9]*)$/i',$range,$matches)) return null; + + if ($matches[1]==='' && $matches[2]==='') return null; + + return array( + $matches[1]!==''?$matches[1]:null, + $matches[2]!==''?$matches[2]:null, + ); + + } + + /** + * Returns the HTTP Prefer header information. + * + * The prefer header is defined in: + * http://tools.ietf.org/html/draft-snell-http-prefer-14 + * + * This method will return an array with options. + * + * Currently, the following options may be returned: + * array( + * 'return-asynch' => true, + * 'return-minimal' => true, + * 'return-representation' => true, + * 'wait' => 30, + * 'strict' => true, + * 'lenient' => true, + * ) + * + * This method also supports the Brief header, and will also return + * 'return-minimal' if the brief header was set to 't'. + * + * For the boolean options, false will be returned if the headers are not + * specified. For the integer options it will be 'null'. + * + * @return array + */ + public function getHTTPPrefer() { + + $result = array( + 'return-asynch' => false, + 'return-minimal' => false, + 'return-representation' => false, + 'wait' => null, + 'strict' => false, + 'lenient' => false, + ); + + if ($prefer = $this->httpRequest->getHeader('Prefer')) { + + $parameters = array_map('trim', + explode(',', $prefer) + ); + + foreach($parameters as $parameter) { + + // Right now our regex only supports the tokens actually + // specified in the draft. We may need to expand this if new + // tokens get registered. + if(!preg_match('/^(?P[a-z0-9-]+)(?:=(?P[0-9]+))?$/', $parameter, $matches)) { + continue; + } + + switch($matches['token']) { + + case 'return-asynch' : + case 'return-minimal' : + case 'return-representation' : + case 'strict' : + case 'lenient' : + $result[$matches['token']] = true; + break; + case 'wait' : + $result[$matches['token']] = $matches['value']; + break; + + } + + } + + } + + if ($this->httpRequest->getHeader('Brief')=='t') { + $result['return-minimal'] = true; + } + + return $result; + + } + + + /** + * Returns information about Copy and Move requests + * + * This function is created to help getting information about the source and the destination for the + * WebDAV MOVE and COPY HTTP request. It also validates a lot of information and throws proper exceptions + * + * The returned value is an array with the following keys: + * * destination - Destination path + * * destinationExists - Whether or not the destination is an existing url (and should therefore be overwritten) + * + * @return array + */ + public function getCopyAndMoveInfo() { + + // Collecting the relevant HTTP headers + if (!$this->httpRequest->getHeader('Destination')) throw new Exception\BadRequest('The destination header was not supplied'); + $destination = $this->calculateUri($this->httpRequest->getHeader('Destination')); + $overwrite = $this->httpRequest->getHeader('Overwrite'); + if (!$overwrite) $overwrite = 'T'; + if (strtoupper($overwrite)=='T') $overwrite = true; + elseif (strtoupper($overwrite)=='F') $overwrite = false; + // We need to throw a bad request exception, if the header was invalid + else throw new Exception\BadRequest('The HTTP Overwrite header should be either T or F'); + + list($destinationDir) = URLUtil::splitPath($destination); + + try { + $destinationParent = $this->tree->getNodeForPath($destinationDir); + if (!($destinationParent instanceof ICollection)) throw new Exception\UnsupportedMediaType('The destination node is not a collection'); + } catch (Exception\NotFound $e) { + + // If the destination parent node is not found, we throw a 409 + throw new Exception\Conflict('The destination node is not found'); + } + + try { + + $destinationNode = $this->tree->getNodeForPath($destination); + + // If this succeeded, it means the destination already exists + // we'll need to throw precondition failed in case overwrite is false + if (!$overwrite) throw new Exception\PreconditionFailed('The destination node already exists, and the overwrite header is set to false','Overwrite'); + + } catch (Exception\NotFound $e) { + + // Destination didn't exist, we're all good + $destinationNode = false; + + + + } + + // These are the three relevant properties we need to return + return array( + 'destination' => $destination, + 'destinationExists' => $destinationNode==true, + 'destinationNode' => $destinationNode, + ); + + } + + /** + * Returns a list of properties for a path + * + * This is a simplified version getPropertiesForPath. + * if you aren't interested in status codes, but you just + * want to have a flat list of properties. Use this method. + * + * @param string $path + * @param array $propertyNames + */ + public function getProperties($path, $propertyNames) { + + $result = $this->getPropertiesForPath($path,$propertyNames,0); + return $result[0][200]; + + } + + /** + * A kid-friendly way to fetch properties for a node's children. + * + * The returned array will be indexed by the path of the of child node. + * Only properties that are actually found will be returned. + * + * The parent node will not be returned. + * + * @param string $path + * @param array $propertyNames + * @return array + */ + public function getPropertiesForChildren($path, $propertyNames) { + + $result = array(); + foreach($this->getPropertiesForPath($path,$propertyNames,1) as $k=>$row) { + + // Skipping the parent path + if ($k === 0) continue; + + $result[$row['href']] = $row[200]; + + } + return $result; + + } + + /** + * Returns a list of HTTP headers for a particular resource + * + * The generated http headers are based on properties provided by the + * resource. The method basically provides a simple mapping between + * DAV property and HTTP header. + * + * The headers are intended to be used for HEAD and GET requests. + * + * @param string $path + * @return array + */ + public function getHTTPHeaders($path) { + + $propertyMap = array( + '{DAV:}getcontenttype' => 'Content-Type', + '{DAV:}getcontentlength' => 'Content-Length', + '{DAV:}getlastmodified' => 'Last-Modified', + '{DAV:}getetag' => 'ETag', + ); + + $properties = $this->getProperties($path,array_keys($propertyMap)); + + $headers = array(); + foreach($propertyMap as $property=>$header) { + if (!isset($properties[$property])) continue; + + if (is_scalar($properties[$property])) { + $headers[$header] = $properties[$property]; + + // GetLastModified gets special cased + } elseif ($properties[$property] instanceof Property\GetLastModified) { + $headers[$header] = HTTP\Util::toHTTPDate($properties[$property]->getTime()); + } + + } + + return $headers; + + } + + /** + * Returns a list of properties for a given path + * + * The path that should be supplied should have the baseUrl stripped out + * The list of properties should be supplied in Clark notation. If the list is empty + * 'allprops' is assumed. + * + * If a depth of 1 is requested child elements will also be returned. + * + * @param string $path + * @param array $propertyNames + * @param int $depth + * @return array + */ + public function getPropertiesForPath($path, $propertyNames = array(), $depth = 0) { + + if ($depth!=0) $depth = 1; + + $path = rtrim($path,'/'); + + // This event allows people to intercept these requests early on in the + // process. + // + // We're not doing anything with the result, but this can be helpful to + // pre-fetch certain expensive live properties. + $this->broadCastEvent('beforeGetPropertiesForPath', array($path, $propertyNames, $depth)); + + $returnPropertyList = array(); + + $parentNode = $this->tree->getNodeForPath($path); + $nodes = array( + $path => $parentNode + ); + if ($depth==1 && $parentNode instanceof ICollection) { + foreach($this->tree->getChildren($path) as $childNode) + $nodes[$path . '/' . $childNode->getName()] = $childNode; + } + + // If the propertyNames array is empty, it means all properties are requested. + // We shouldn't actually return everything we know though, and only return a + // sensible list. + $allProperties = count($propertyNames)==0; + + foreach($nodes as $myPath=>$node) { + + $currentPropertyNames = $propertyNames; + + $newProperties = array( + '200' => array(), + '404' => array(), + ); + + if ($allProperties) { + // Default list of propertyNames, when all properties were requested. + $currentPropertyNames = array( + '{DAV:}getlastmodified', + '{DAV:}getcontentlength', + '{DAV:}resourcetype', + '{DAV:}quota-used-bytes', + '{DAV:}quota-available-bytes', + '{DAV:}getetag', + '{DAV:}getcontenttype', + ); + } + + // If the resourceType was not part of the list, we manually add it + // and mark it for removal. We need to know the resourcetype in order + // to make certain decisions about the entry. + // WebDAV dictates we should add a / and the end of href's for collections + $removeRT = false; + if (!in_array('{DAV:}resourcetype',$currentPropertyNames)) { + $currentPropertyNames[] = '{DAV:}resourcetype'; + $removeRT = true; + } + + $result = $this->broadcastEvent('beforeGetProperties',array($myPath, $node, &$currentPropertyNames, &$newProperties)); + // If this method explicitly returned false, we must ignore this + // node as it is inaccessible. + if ($result===false) continue; + + if (count($currentPropertyNames) > 0) { + + if ($node instanceof IProperties) { + $nodeProperties = $node->getProperties($currentPropertyNames); + + // The getProperties method may give us too much, + // properties, in case the implementor was lazy. + // + // So as we loop through this list, we will only take the + // properties that were actually requested and discard the + // rest. + foreach($currentPropertyNames as $k=>$currentPropertyName) { + if (isset($nodeProperties[$currentPropertyName])) { + unset($currentPropertyNames[$k]); + $newProperties[200][$currentPropertyName] = $nodeProperties[$currentPropertyName]; + } + } + + } + + } + + foreach($currentPropertyNames as $prop) { + + if (isset($newProperties[200][$prop])) continue; + + switch($prop) { + case '{DAV:}getlastmodified' : if ($node->getLastModified()) $newProperties[200][$prop] = new Property\GetLastModified($node->getLastModified()); break; + case '{DAV:}getcontentlength' : + if ($node instanceof IFile) { + $size = $node->getSize(); + if (!is_null($size)) { + $newProperties[200][$prop] = (int)$node->getSize(); + } + } + break; + case '{DAV:}quota-used-bytes' : + if ($node instanceof IQuota) { + $quotaInfo = $node->getQuotaInfo(); + $newProperties[200][$prop] = $quotaInfo[0]; + } + break; + case '{DAV:}quota-available-bytes' : + if ($node instanceof IQuota) { + $quotaInfo = $node->getQuotaInfo(); + $newProperties[200][$prop] = $quotaInfo[1]; + } + break; + case '{DAV:}getetag' : if ($node instanceof IFile && $etag = $node->getETag()) $newProperties[200][$prop] = $etag; break; + case '{DAV:}getcontenttype' : if ($node instanceof IFile && $ct = $node->getContentType()) $newProperties[200][$prop] = $ct; break; + case '{DAV:}supported-report-set' : + $reports = array(); + foreach($this->plugins as $plugin) { + $reports = array_merge($reports, $plugin->getSupportedReportSet($myPath)); + } + $newProperties[200][$prop] = new Property\SupportedReportSet($reports); + break; + case '{DAV:}resourcetype' : + $newProperties[200]['{DAV:}resourcetype'] = new Property\ResourceType(); + foreach($this->resourceTypeMapping as $className => $resourceType) { + if ($node instanceof $className) $newProperties[200]['{DAV:}resourcetype']->add($resourceType); + } + break; + + } + + // If we were unable to find the property, we will list it as 404. + if (!$allProperties && !isset($newProperties[200][$prop])) $newProperties[404][$prop] = null; + + } + + $this->broadcastEvent('afterGetProperties',array(trim($myPath,'/'),&$newProperties, $node)); + + $newProperties['href'] = trim($myPath,'/'); + + // Its is a WebDAV recommendation to add a trailing slash to collectionnames. + // Apple's iCal also requires a trailing slash for principals (rfc 3744), though this is non-standard. + if ($myPath!='' && isset($newProperties[200]['{DAV:}resourcetype'])) { + $rt = $newProperties[200]['{DAV:}resourcetype']; + if ($rt->is('{DAV:}collection') || $rt->is('{DAV:}principal')) { + $newProperties['href'] .='/'; + } + } + + // If the resourcetype property was manually added to the requested property list, + // we will remove it again. + if ($removeRT) unset($newProperties[200]['{DAV:}resourcetype']); + + $returnPropertyList[] = $newProperties; + + } + + return $returnPropertyList; + + } + + /** + * This method is invoked by sub-systems creating a new file. + * + * Currently this is done by HTTP PUT and HTTP LOCK (in the Locks_Plugin). + * It was important to get this done through a centralized function, + * allowing plugins to intercept this using the beforeCreateFile event. + * + * This method will return true if the file was actually created + * + * @param string $uri + * @param resource $data + * @param string $etag + * @return bool + */ + public function createFile($uri,$data, &$etag = null) { + + list($dir,$name) = URLUtil::splitPath($uri); + + if (!$this->broadcastEvent('beforeBind',array($uri))) return false; + + $parent = $this->tree->getNodeForPath($dir); + if (!$parent instanceof ICollection) { + throw new Exception\Conflict('Files can only be created as children of collections'); + } + + if (!$this->broadcastEvent('beforeCreateFile',array($uri, &$data, $parent))) return false; + + $etag = $parent->createFile($name,$data); + $this->tree->markDirty($dir . '/' . $name); + + $this->broadcastEvent('afterBind',array($uri)); + $this->broadcastEvent('afterCreateFile',array($uri, $parent)); + + return true; + } + + /** + * This method is invoked by sub-systems creating a new directory. + * + * @param string $uri + * @return void + */ + public function createDirectory($uri) { + + $this->createCollection($uri,array('{DAV:}collection'),array()); + + } + + /** + * Use this method to create a new collection + * + * The {DAV:}resourcetype is specified using the resourceType array. + * At the very least it must contain {DAV:}collection. + * + * The properties array can contain a list of additional properties. + * + * @param string $uri The new uri + * @param array $resourceType The resourceType(s) + * @param array $properties A list of properties + * @return array|null + */ + public function createCollection($uri, array $resourceType, array $properties) { + + list($parentUri,$newName) = URLUtil::splitPath($uri); + + // Making sure {DAV:}collection was specified as resourceType + if (!in_array('{DAV:}collection', $resourceType)) { + throw new Exception\InvalidResourceType('The resourceType for this collection must at least include {DAV:}collection'); + } + + + // Making sure the parent exists + try { + + $parent = $this->tree->getNodeForPath($parentUri); + + } catch (Exception\NotFound $e) { + + throw new Exception\Conflict('Parent node does not exist'); + + } + + // Making sure the parent is a collection + if (!$parent instanceof ICollection) { + throw new Exception\Conflict('Parent node is not a collection'); + } + + + + // Making sure the child does not already exist + try { + $parent->getChild($newName); + + // If we got here.. it means there's already a node on that url, and we need to throw a 405 + throw new Exception\MethodNotAllowed('The resource you tried to create already exists'); + + } catch (Exception\NotFound $e) { + // This is correct + } + + + if (!$this->broadcastEvent('beforeBind',array($uri))) return; + + // There are 2 modes of operation. The standard collection + // creates the directory, and then updates properties + // the extended collection can create it directly. + if ($parent instanceof IExtendedCollection) { + + $parent->createExtendedCollection($newName, $resourceType, $properties); + + } else { + + // No special resourcetypes are supported + if (count($resourceType)>1) { + throw new Exception\InvalidResourceType('The {DAV:}resourcetype you specified is not supported here.'); + } + + $parent->createDirectory($newName); + $rollBack = false; + $exception = null; + $errorResult = null; + + if (count($properties)>0) { + + try { + + $errorResult = $this->updateProperties($uri, $properties); + if (!isset($errorResult[200])) { + $rollBack = true; + } + + } catch (Exception $e) { + + $rollBack = true; + $exception = $e; + + } + + } + + if ($rollBack) { + if (!$this->broadcastEvent('beforeUnbind',array($uri))) return; + $this->tree->delete($uri); + + // Re-throwing exception + if ($exception) throw $exception; + + return $errorResult; + } + + } + $this->tree->markDirty($parentUri); + $this->broadcastEvent('afterBind',array($uri)); + + } + + /** + * This method updates a resource's properties + * + * The properties array must be a list of properties. Array-keys are + * property names in clarknotation, array-values are it's values. + * If a property must be deleted, the value should be null. + * + * Note that this request should either completely succeed, or + * completely fail. + * + * The response is an array with statuscodes for keys, which in turn + * contain arrays with propertynames. This response can be used + * to generate a multistatus body. + * + * @param string $uri + * @param array $properties + * @return array + */ + public function updateProperties($uri, array $properties) { + + // we'll start by grabbing the node, this will throw the appropriate + // exceptions if it doesn't. + $node = $this->tree->getNodeForPath($uri); + + $result = array( + 200 => array(), + 403 => array(), + 424 => array(), + ); + $remainingProperties = $properties; + $hasError = false; + + // Running through all properties to make sure none of them are protected + if (!$hasError) foreach($properties as $propertyName => $value) { + if(in_array($propertyName, $this->protectedProperties)) { + $result[403][$propertyName] = null; + unset($remainingProperties[$propertyName]); + $hasError = true; + } + } + + if (!$hasError) { + // Allowing plugins to take care of property updating + $hasError = !$this->broadcastEvent('updateProperties',array( + &$remainingProperties, + &$result, + $node + )); + } + + // If the node is not an instance of SabreForRainLoop\DAV\IProperties, every + // property is 403 Forbidden + if (!$hasError && count($remainingProperties) && !($node instanceof IProperties)) { + $hasError = true; + foreach($properties as $propertyName=> $value) { + $result[403][$propertyName] = null; + } + $remainingProperties = array(); + } + + // Only if there were no errors we may attempt to update the resource + if (!$hasError) { + + if (count($remainingProperties)>0) { + + $updateResult = $node->updateProperties($remainingProperties); + + if ($updateResult===true) { + // success + foreach($remainingProperties as $propertyName=>$value) { + $result[200][$propertyName] = null; + } + + } elseif ($updateResult===false) { + // The node failed to update the properties for an + // unknown reason + foreach($remainingProperties as $propertyName=>$value) { + $result[403][$propertyName] = null; + } + + } elseif (is_array($updateResult)) { + + // The node has detailed update information + // We need to merge the results with the earlier results. + foreach($updateResult as $status => $props) { + if (is_array($props)) { + if (!isset($result[$status])) + $result[$status] = array(); + + $result[$status] = array_merge($result[$status], $updateResult[$status]); + } + } + + } else { + throw new Exception('Invalid result from updateProperties'); + } + $remainingProperties = array(); + } + + } + + foreach($remainingProperties as $propertyName=>$value) { + // if there are remaining properties, it must mean + // there's a dependency failure + $result[424][$propertyName] = null; + } + + // Removing empty array values + foreach($result as $status=>$props) { + + if (count($props)===0) unset($result[$status]); + + } + $result['href'] = $uri; + return $result; + + } + + /** + * This method checks the main HTTP preconditions. + * + * Currently these are: + * * If-Match + * * If-None-Match + * * If-Modified-Since + * * If-Unmodified-Since + * + * The method will return true if all preconditions are met + * The method will return false, or throw an exception if preconditions + * failed. If false is returned the operation should be aborted, and + * the appropriate HTTP response headers are already set. + * + * Normally this method will throw 412 Precondition Failed for failures + * related to If-None-Match, If-Match and If-Unmodified Since. It will + * set the status to 304 Not Modified for If-Modified_since. + * + * If the $handleAsGET argument is set to true, it will also return 304 + * Not Modified for failure of the If-None-Match precondition. This is the + * desired behaviour for HTTP GET and HTTP HEAD requests. + * + * @param bool $handleAsGET + * @return bool + */ + public function checkPreconditions($handleAsGET = false) { + + $uri = $this->getRequestUri(); + $node = null; + $lastMod = null; + $etag = null; + + if ($ifMatch = $this->httpRequest->getHeader('If-Match')) { + + // If-Match contains an entity tag. Only if the entity-tag + // matches we are allowed to make the request succeed. + // If the entity-tag is '*' we are only allowed to make the + // request succeed if a resource exists at that url. + try { + $node = $this->tree->getNodeForPath($uri); + } catch (Exception\NotFound $e) { + throw new Exception\PreconditionFailed('An If-Match header was specified and the resource did not exist','If-Match'); + } + + // Only need to check entity tags if they are not * + if ($ifMatch!=='*') { + + // There can be multiple etags + $ifMatch = explode(',',$ifMatch); + $haveMatch = false; + foreach($ifMatch as $ifMatchItem) { + + // Stripping any extra spaces + $ifMatchItem = trim($ifMatchItem,' '); + + $etag = $node->getETag(); + if ($etag===$ifMatchItem) { + $haveMatch = true; + } else { + // Evolution has a bug where it sometimes prepends the " + // with a \. This is our workaround. + if (str_replace('\\"','"', $ifMatchItem) === $etag) { + $haveMatch = true; + } + } + + } + if (!$haveMatch) { + throw new Exception\PreconditionFailed('An If-Match header was specified, but none of the specified the ETags matched.','If-Match'); + } + } + } + + if ($ifNoneMatch = $this->httpRequest->getHeader('If-None-Match')) { + + // The If-None-Match header contains an etag. + // Only if the ETag does not match the current ETag, the request will succeed + // The header can also contain *, in which case the request + // will only succeed if the entity does not exist at all. + $nodeExists = true; + if (!$node) { + try { + $node = $this->tree->getNodeForPath($uri); + } catch (Exception\NotFound $e) { + $nodeExists = false; + } + } + if ($nodeExists) { + $haveMatch = false; + if ($ifNoneMatch==='*') $haveMatch = true; + else { + + // There might be multiple etags + $ifNoneMatch = explode(',', $ifNoneMatch); + $etag = $node->getETag(); + + foreach($ifNoneMatch as $ifNoneMatchItem) { + + // Stripping any extra spaces + $ifNoneMatchItem = trim($ifNoneMatchItem,' '); + + if ($etag===$ifNoneMatchItem) $haveMatch = true; + + } + + } + + if ($haveMatch) { + if ($handleAsGET) { + $this->httpResponse->sendStatus(304); + return false; + } else { + throw new Exception\PreconditionFailed('An If-None-Match header was specified, but the ETag matched (or * was specified).','If-None-Match'); + } + } + } + + } + + if (!$ifNoneMatch && ($ifModifiedSince = $this->httpRequest->getHeader('If-Modified-Since'))) { + + // The If-Modified-Since header contains a date. We + // will only return the entity if it has been changed since + // that date. If it hasn't been changed, we return a 304 + // header + // Note that this header only has to be checked if there was no If-None-Match header + // as per the HTTP spec. + $date = HTTP\Util::parseHTTPDate($ifModifiedSince); + + if ($date) { + if (is_null($node)) { + $node = $this->tree->getNodeForPath($uri); + } + $lastMod = $node->getLastModified(); + if ($lastMod) { + $lastMod = new \DateTime('@' . $lastMod); + if ($lastMod <= $date) { + $this->httpResponse->sendStatus(304); + $this->httpResponse->setHeader('Last-Modified', HTTP\Util::toHTTPDate($lastMod)); + return false; + } + } + } + } + + if ($ifUnmodifiedSince = $this->httpRequest->getHeader('If-Unmodified-Since')) { + + // The If-Unmodified-Since will allow allow the request if the + // entity has not changed since the specified date. + $date = HTTP\Util::parseHTTPDate($ifUnmodifiedSince); + + // We must only check the date if it's valid + if ($date) { + if (is_null($node)) { + $node = $this->tree->getNodeForPath($uri); + } + $lastMod = $node->getLastModified(); + if ($lastMod) { + $lastMod = new \DateTime('@' . $lastMod); + if ($lastMod > $date) { + throw new Exception\PreconditionFailed('An If-Unmodified-Since header was specified, but the entity has been changed since the specified date.','If-Unmodified-Since'); + } + } + } + + } + return true; + + } + + // }}} + // {{{ XML Readers & Writers + + + /** + * Generates a WebDAV propfind response body based on a list of nodes. + * + * If 'strip404s' is set to true, all 404 responses will be removed. + * + * @param array $fileProperties The list with nodes + * @param bool strip404s + * @return string + */ + public function generateMultiStatus(array $fileProperties, $strip404s = false) { + + $dom = new \DOMDocument('1.0','utf-8'); + //$dom->formatOutput = true; + $multiStatus = $dom->createElement('d:multistatus'); + $dom->appendChild($multiStatus); + + // Adding in default namespaces + foreach($this->xmlNamespaces as $namespace=>$prefix) { + + $multiStatus->setAttribute('xmlns:' . $prefix,$namespace); + + } + + foreach($fileProperties as $entry) { + + $href = $entry['href']; + unset($entry['href']); + + if ($strip404s && isset($entry[404])) { + unset($entry[404]); + } + + $response = new Property\Response($href,$entry); + $response->serialize($this,$multiStatus); + + } + + return $dom->saveXML(); + + } + + /** + * This method parses a PropPatch request + * + * PropPatch changes the properties for a resource. This method + * returns a list of properties. + * + * The keys in the returned array contain the property name (e.g.: {DAV:}displayname, + * and the value contains the property value. If a property is to be removed the value + * will be null. + * + * @param string $body xml body + * @return array list of properties in need of updating or deletion + */ + public function parsePropPatchRequest($body) { + + //We'll need to change the DAV namespace declaration to something else in order to make it parsable + $dom = XMLUtil::loadDOMDocument($body); + + $newProperties = array(); + + foreach($dom->firstChild->childNodes as $child) { + + if ($child->nodeType !== XML_ELEMENT_NODE) continue; + + $operation = XMLUtil::toClarkNotation($child); + + if ($operation!=='{DAV:}set' && $operation!=='{DAV:}remove') continue; + + $innerProperties = XMLUtil::parseProperties($child, $this->propertyMap); + + foreach($innerProperties as $propertyName=>$propertyValue) { + + if ($operation==='{DAV:}remove') { + $propertyValue = null; + } + + $newProperties[$propertyName] = $propertyValue; + + } + + } + + return $newProperties; + + } + + /** + * This method parses the PROPFIND request and returns its information + * + * This will either be a list of properties, or an empty array; in which case + * an {DAV:}allprop was requested. + * + * @param string $body + * @return array + */ + public function parsePropFindRequest($body) { + + // If the propfind body was empty, it means IE is requesting 'all' properties + if (!$body) return array(); + + $dom = XMLUtil::loadDOMDocument($body); + $elem = $dom->getElementsByTagNameNS('urn:DAV','propfind')->item(0); + return array_keys(XMLUtil::parseProperties($elem)); + + } + + // }}} + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/ServerPlugin.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/ServerPlugin.php new file mode 100755 index 00000000..83cde575 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/ServerPlugin.php @@ -0,0 +1,90 @@ +name = $name; + foreach($children as $child) { + + if (!($child instanceof INode)) throw new Exception('Only instances of SabreForRainLoop\DAV\INode are allowed to be passed in the children argument'); + $this->addChild($child); + + } + + } + + /** + * Adds a new childnode to this collection + * + * @param INode $child + * @return void + */ + public function addChild(INode $child) { + + $this->children[$child->getName()] = $child; + + } + + /** + * Returns the name of the collection + * + * @return string + */ + public function getName() { + + return $this->name; + + } + + /** + * Returns a child object, by its name. + * + * This method makes use of the getChildren method to grab all the child nodes, and compares the name. + * Generally its wise to override this, as this can usually be optimized + * + * This method must throw SabreForRainLoop\DAV\Exception\NotFound if the node does not + * exist. + * + * @param string $name + * @throws Exception\NotFound + * @return INode + */ + public function getChild($name) { + + if (isset($this->children[$name])) return $this->children[$name]; + throw new Exception\NotFound('File not found: ' . $name . ' in \'' . $this->getName() . '\''); + + } + + /** + * Returns a list of children for this collection + * + * @return array + */ + public function getChildren() { + + return array_values($this->children); + + } + + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/SimpleFile.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/SimpleFile.php new file mode 100755 index 00000000..d1b2d7e3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/SimpleFile.php @@ -0,0 +1,121 @@ +name = $name; + $this->contents = $contents; + $this->mimeType = $mimeType; + + } + + /** + * Returns the node name for this file. + * + * This name is used to construct the url. + * + * @return string + */ + public function getName() { + + return $this->name; + + } + + /** + * Returns the data + * + * This method may either return a string or a readable stream resource + * + * @return mixed + */ + public function get() { + + return $this->contents; + + } + + /** + * Returns the size of the file, in bytes. + * + * @return int + */ + public function getSize() { + + return strlen($this->contents); + + } + + /** + * Returns the ETag for a file + * + * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change. + * The ETag is an arbitrary string, but MUST be surrounded by double-quotes. + * + * Return null if the ETag can not effectively be determined + * @return string + */ + public function getETag() { + + return '"' . md5($this->contents) . '"'; + + } + + /** + * Returns the mime-type for a file + * + * If null is returned, we'll assume application/octet-stream + * @return string + */ + public function getContentType() { + + return $this->mimeType; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/StringUtil.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/StringUtil.php new file mode 100755 index 00000000..4c9dcee5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/StringUtil.php @@ -0,0 +1,91 @@ +dataDir = $dataDir; + + } + + /** + * Initialize the plugin + * + * This is called automatically be the Server class after this plugin is + * added with SabreForRainLoop\DAV\Server::addPlugin() + * + * @param Server $server + * @return void + */ + public function initialize(Server $server) { + + $this->server = $server; + $server->subscribeEvent('beforeMethod',array($this,'beforeMethod')); + $server->subscribeEvent('beforeCreateFile',array($this,'beforeCreateFile')); + + } + + /** + * This method is called before any HTTP method handler + * + * This method intercepts any GET, DELETE, PUT and PROPFIND calls to + * filenames that are known to match the 'temporary file' regex. + * + * @param string $method + * @param string $uri + * @return bool + */ + public function beforeMethod($method, $uri) { + + if (!$tempLocation = $this->isTempFile($uri)) + return true; + + switch($method) { + case 'GET' : + return $this->httpGet($tempLocation); + case 'PUT' : + return $this->httpPut($tempLocation); + case 'PROPFIND' : + return $this->httpPropfind($tempLocation, $uri); + case 'DELETE' : + return $this->httpDelete($tempLocation); + } + return true; + + } + + /** + * This method is invoked if some subsystem creates a new file. + * + * This is used to deal with HTTP LOCK requests which create a new + * file. + * + * @param string $uri + * @param resource $data + * @return bool + */ + public function beforeCreateFile($uri,$data) { + + if ($tempPath = $this->isTempFile($uri)) { + + $hR = $this->server->httpResponse; + $hR->setHeader('X-Sabre-Temp','true'); + file_put_contents($tempPath,$data); + return false; + } + return true; + + } + + /** + * This method will check if the url matches the temporary file pattern + * if it does, it will return an path based on $this->dataDir for the + * temporary file storage. + * + * @param string $path + * @return boolean|string + */ + protected function isTempFile($path) { + + // We're only interested in the basename. + list(, $tempPath) = URLUtil::splitPath($path); + + foreach($this->temporaryFilePatterns as $tempFile) { + + if (preg_match($tempFile,$tempPath)) { + return $this->getDataDir() . '/sabredav_' . md5($path) . '.tempfile'; + } + + } + + return false; + + } + + + /** + * This method handles the GET method for temporary files. + * If the file doesn't exist, it will return false which will kick in + * the regular system for the GET method. + * + * @param string $tempLocation + * @return bool + */ + public function httpGet($tempLocation) { + + if (!file_exists($tempLocation)) return true; + + $hR = $this->server->httpResponse; + $hR->setHeader('Content-Type','application/octet-stream'); + $hR->setHeader('Content-Length',filesize($tempLocation)); + $hR->setHeader('X-Sabre-Temp','true'); + $hR->sendStatus(200); + $hR->sendBody(fopen($tempLocation,'r')); + return false; + + } + + /** + * This method handles the PUT method. + * + * @param string $tempLocation + * @return bool + */ + public function httpPut($tempLocation) { + + $hR = $this->server->httpResponse; + $hR->setHeader('X-Sabre-Temp','true'); + + $newFile = !file_exists($tempLocation); + + if (!$newFile && ($this->server->httpRequest->getHeader('If-None-Match'))) { + throw new Exception\PreconditionFailed('The resource already exists, and an If-None-Match header was supplied'); + } + + file_put_contents($tempLocation,$this->server->httpRequest->getBody()); + $hR->sendStatus($newFile?201:200); + return false; + + } + + /** + * This method handles the DELETE method. + * + * If the file didn't exist, it will return false, which will make the + * standard HTTP DELETE handler kick in. + * + * @param string $tempLocation + * @return bool + */ + public function httpDelete($tempLocation) { + + if (!file_exists($tempLocation)) return true; + + unlink($tempLocation); + $hR = $this->server->httpResponse; + $hR->setHeader('X-Sabre-Temp','true'); + $hR->sendStatus(204); + return false; + + } + + /** + * This method handles the PROPFIND method. + * + * It's a very lazy method, it won't bother checking the request body + * for which properties were requested, and just sends back a default + * set of properties. + * + * @param string $tempLocation + * @param string $uri + * @return bool + */ + public function httpPropfind($tempLocation, $uri) { + + if (!file_exists($tempLocation)) return true; + + $hR = $this->server->httpResponse; + $hR->setHeader('X-Sabre-Temp','true'); + $hR->sendStatus(207); + $hR->setHeader('Content-Type','application/xml; charset=utf-8'); + + $this->server->parsePropFindRequest($this->server->httpRequest->getBody(true)); + + $properties = array( + 'href' => $uri, + 200 => array( + '{DAV:}getlastmodified' => new Property\GetLastModified(filemtime($tempLocation)), + '{DAV:}getcontentlength' => filesize($tempLocation), + '{DAV:}resourcetype' => new Property\ResourceType(null), + '{'.Server::NS_SABREDAV.'}tempFile' => true, + + ), + ); + + $data = $this->server->generateMultiStatus(array($properties)); + $hR->sendBody($data); + return false; + + } + + + /** + * This method returns the directory where the temporary files should be stored. + * + * @return string + */ + protected function getDataDir() + { + return $this->dataDir; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Tree.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Tree.php new file mode 100755 index 00000000..49fa99d6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Tree.php @@ -0,0 +1,193 @@ +getNodeForPath($path); + return true; + + } catch (Exception\NotFound $e) { + + return false; + + } + + } + + /** + * Copies a file from path to another + * + * @param string $sourcePath The source location + * @param string $destinationPath The full destination path + * @return void + */ + public function copy($sourcePath, $destinationPath) { + + $sourceNode = $this->getNodeForPath($sourcePath); + + // grab the dirname and basename components + list($destinationDir, $destinationName) = URLUtil::splitPath($destinationPath); + + $destinationParent = $this->getNodeForPath($destinationDir); + $this->copyNode($sourceNode,$destinationParent,$destinationName); + + $this->markDirty($destinationDir); + + } + + /** + * Moves a file from one location to another + * + * @param string $sourcePath The path to the file which should be moved + * @param string $destinationPath The full destination path, so not just the destination parent node + * @return int + */ + public function move($sourcePath, $destinationPath) { + + list($sourceDir, $sourceName) = URLUtil::splitPath($sourcePath); + list($destinationDir, $destinationName) = URLUtil::splitPath($destinationPath); + + if ($sourceDir===$destinationDir) { + $renameable = $this->getNodeForPath($sourcePath); + $renameable->setName($destinationName); + } else { + $this->copy($sourcePath,$destinationPath); + $this->getNodeForPath($sourcePath)->delete(); + } + $this->markDirty($sourceDir); + $this->markDirty($destinationDir); + + } + + /** + * Deletes a node from the tree + * + * @param string $path + * @return void + */ + public function delete($path) { + + $node = $this->getNodeForPath($path); + $node->delete(); + + list($parent) = URLUtil::splitPath($path); + $this->markDirty($parent); + + } + + /** + * Returns a list of childnodes for a given path. + * + * @param string $path + * @return array + */ + public function getChildren($path) { + + $node = $this->getNodeForPath($path); + return $node->getChildren(); + + } + + /** + * This method is called with every tree update + * + * Examples of tree updates are: + * * node deletions + * * node creations + * * copy + * * move + * * renaming nodes + * + * If Tree classes implement a form of caching, this will allow + * them to make sure caches will be expired. + * + * If a path is passed, it is assumed that the entire subtree is dirty + * + * @param string $path + * @return void + */ + public function markDirty($path) { + + + } + + /** + * copyNode + * + * @param INode $source + * @param ICollection $destinationParent + * @param string $destinationName + * @return void + */ + protected function copyNode(INode $source,ICollection $destinationParent,$destinationName = null) { + + if (!$destinationName) $destinationName = $source->getName(); + + if ($source instanceof IFile) { + + $data = $source->get(); + + // If the body was a string, we need to convert it to a stream + if (is_string($data)) { + $stream = fopen('php://temp','r+'); + fwrite($stream,$data); + rewind($stream); + $data = $stream; + } + $destinationParent->createFile($destinationName,$data); + $destination = $destinationParent->getChild($destinationName); + + } elseif ($source instanceof ICollection) { + + $destinationParent->createDirectory($destinationName); + + $destination = $destinationParent->getChild($destinationName); + foreach($source->getChildren() as $child) { + + $this->copyNode($child,$destination); + + } + + } + if ($source instanceof IProperties && $destination instanceof IProperties) { + + $props = $source->getProperties(array()); + $destination->updateProperties($props); + + } + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Tree/Filesystem.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Tree/Filesystem.php new file mode 100755 index 00000000..7546c058 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Tree/Filesystem.php @@ -0,0 +1,133 @@ +basePath = $basePath; + + } + + /** + * Returns a new node for the given path + * + * @param string $path + * @return DAV\FS\Node + */ + public function getNodeForPath($path) { + + $realPath = $this->getRealPath($path); + if (!file_exists($realPath)) { + throw new DAV\Exception\NotFound('File at location ' . $realPath . ' not found'); + } + if (is_dir($realPath)) { + return new DAV\FS\Directory($realPath); + } else { + return new DAV\FS\File($realPath); + } + + } + + /** + * Returns the real filesystem path for a webdav url. + * + * @param string $publicPath + * @return string + */ + protected function getRealPath($publicPath) { + + return rtrim($this->basePath,'/') . '/' . trim($publicPath,'/'); + + } + + /** + * Copies a file or directory. + * + * This method must work recursively and delete the destination + * if it exists + * + * @param string $source + * @param string $destination + * @return void + */ + public function copy($source,$destination) { + + $source = $this->getRealPath($source); + $destination = $this->getRealPath($destination); + $this->realCopy($source,$destination); + + } + + /** + * Used by self::copy + * + * @param string $source + * @param string $destination + * @return void + */ + protected function realCopy($source,$destination) { + + if (is_file($source)) { + copy($source,$destination); + } else { + mkdir($destination); + foreach(scandir($source) as $subnode) { + + if ($subnode=='.' || $subnode=='..') continue; + $this->realCopy($source.'/'.$subnode,$destination.'/'.$subnode); + + } + } + + } + + /** + * Moves a file or directory recursively. + * + * If the destination exists, delete it first. + * + * @param string $source + * @param string $destination + * @return void + */ + public function move($source,$destination) { + + $source = $this->getRealPath($source); + $destination = $this->getRealPath($destination); + rename($source,$destination); + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/URLUtil.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/URLUtil.php new file mode 100755 index 00000000..65f4d9ba --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/URLUtil.php @@ -0,0 +1,121 @@ + + * will be returned as: + * {http://www.example.org}myelem + * + * This format is used throughout the SabreDAV sourcecode. + * Elements encoded with the urn:DAV namespace will + * be returned as if they were in the DAV: namespace. This is to avoid + * compatibility problems. + * + * This function will return null if a nodetype other than an Element is passed. + * + * @param \DOMNode $dom + * @return string + */ + static function toClarkNotation(\DOMNode $dom) { + + if ($dom->nodeType !== XML_ELEMENT_NODE) return null; + + // Mapping back to the real namespace, in case it was dav + if ($dom->namespaceURI=='urn:DAV') $ns = 'DAV:'; else $ns = $dom->namespaceURI; + + // Mapping to clark notation + return '{' . $ns . '}' . $dom->localName; + + } + + /** + * Parses a clark-notation string, and returns the namespace and element + * name components. + * + * If the string was invalid, it will throw an InvalidArgumentException. + * + * @param string $str + * @throws InvalidArgumentException + * @return array + */ + static function parseClarkNotation($str) { + + if (!preg_match('/^{([^}]*)}(.*)$/',$str,$matches)) { + throw new \InvalidArgumentException('\'' . $str . '\' is not a valid clark-notation formatted string'); + } + + return array( + $matches[1], + $matches[2] + ); + + } + + /** + * This method takes an XML document (as string) and converts all instances of the + * DAV: namespace to urn:DAV + * + * This is unfortunately needed, because the DAV: namespace violates the xml namespaces + * spec, and causes the DOM to throw errors + * + * @param string $xmlDocument + * @return array|string|null + */ + static function convertDAVNamespace($xmlDocument) { + + // This is used to map the DAV: namespace to urn:DAV. This is needed, because the DAV: + // namespace is actually a violation of the XML namespaces specification, and will cause errors + return preg_replace("/xmlns(:[A-Za-z0-9_]*)?=(\"|\')DAV:(\\2)/","xmlns\\1=\\2urn:DAV\\2",$xmlDocument); + + } + + /** + * This method provides a generic way to load a DOMDocument for WebDAV use. + * + * This method throws a SabreForRainLoop\DAV\Exception\BadRequest exception for any xml errors. + * It does not preserve whitespace, and it converts the DAV: namespace to urn:DAV. + * + * @param string $xml + * @throws SabreForRainLoop\DAV\Exception\BadRequest + * @return DOMDocument + */ + static function loadDOMDocument($xml) { + + if (empty($xml)) + throw new Exception\BadRequest('Empty XML document sent'); + + // The BitKinex client sends xml documents as UTF-16. PHP 5.3.1 (and presumably lower) + // does not support this, so we must intercept this and convert to UTF-8. + if (substr($xml,0,12) === "\x3c\x00\x3f\x00\x78\x00\x6d\x00\x6c\x00\x20\x00") { + + // Note: the preceeding byte sequence is "]*)encoding="UTF-16"([^>]*)>|u','',$xml); + + } + + // Retaining old error setting + $oldErrorSetting = libxml_use_internal_errors(true); + + // Clearing any previous errors + libxml_clear_errors(); + + $dom = new \DOMDocument(); + + // We don't generally care about any whitespace + $dom->preserveWhiteSpace = false; + + $dom->loadXML(self::convertDAVNamespace($xml),LIBXML_NOWARNING | LIBXML_NOERROR); + + if ($error = libxml_get_last_error()) { + libxml_clear_errors(); + throw new Exception\BadRequest('The request body had an invalid XML body. (message: ' . $error->message . ', errorcode: ' . $error->code . ', line: ' . $error->line . ')'); + } + + // Restoring old mechanism for error handling + if ($oldErrorSetting===false) libxml_use_internal_errors(false); + + return $dom; + + } + + /** + * Parses all WebDAV properties out of a DOM Element + * + * Generally WebDAV properties are enclosed in {DAV:}prop elements. This + * method helps by going through all these and pulling out the actual + * propertynames, making them array keys and making the property values, + * well.. the array values. + * + * If no value was given (self-closing element) null will be used as the + * value. This is used in for example PROPFIND requests. + * + * Complex values are supported through the propertyMap argument. The + * propertyMap should have the clark-notation properties as it's keys, and + * classnames as values. + * + * When any of these properties are found, the unserialize() method will be + * (statically) called. The result of this method is used as the value. + * + * @param \DOMElement $parentNode + * @param array $propertyMap + * @return array + */ + static function parseProperties(\DOMElement $parentNode, array $propertyMap = array()) { + + $propList = array(); + foreach($parentNode->childNodes as $propNode) { + + if (self::toClarkNotation($propNode)!=='{DAV:}prop') continue; + + foreach($propNode->childNodes as $propNodeData) { + + /* If there are no elements in here, we actually get 1 text node, this special case is dedicated to netdrive */ + if ($propNodeData->nodeType != XML_ELEMENT_NODE) continue; + + $propertyName = self::toClarkNotation($propNodeData); + if (isset($propertyMap[$propertyName])) { + $propList[$propertyName] = call_user_func(array($propertyMap[$propertyName],'unserialize'),$propNodeData); + } else { + $propList[$propertyName] = $propNodeData->textContent; + } + } + + + } + return $propList; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/AbstractPrincipalCollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/AbstractPrincipalCollection.php new file mode 100755 index 00000000..342796fb --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/AbstractPrincipalCollection.php @@ -0,0 +1,155 @@ +principalPrefix = $principalPrefix; + $this->principalBackend = $principalBackend; + + } + + /** + * This method returns a node for a principal. + * + * The passed array contains principal information, and is guaranteed to + * at least contain a uri item. Other properties may or may not be + * supplied by the authentication backend. + * + * @param array $principalInfo + * @return IPrincipal + */ + abstract function getChildForPrincipal(array $principalInfo); + + /** + * Returns the name of this collection. + * + * @return string + */ + public function getName() { + + list(,$name) = DAV\URLUtil::splitPath($this->principalPrefix); + return $name; + + } + + /** + * Return the list of users + * + * @return array + */ + public function getChildren() { + + if ($this->disableListing) + throw new DAV\Exception\MethodNotAllowed('Listing members of this collection is disabled'); + + $children = array(); + foreach($this->principalBackend->getPrincipalsByPrefix($this->principalPrefix) as $principalInfo) { + + $children[] = $this->getChildForPrincipal($principalInfo); + + + } + return $children; + + } + + /** + * Returns a child object, by its name. + * + * @param string $name + * @throws DAV\Exception\NotFound + * @return IPrincipal + */ + public function getChild($name) { + + $principalInfo = $this->principalBackend->getPrincipalByPath($this->principalPrefix . '/' . $name); + if (!$principalInfo) throw new DAV\Exception\NotFound('Principal with name ' . $name . ' not found'); + return $this->getChildForPrincipal($principalInfo); + + } + + /** + * This method is used to search for principals matching a set of + * properties. + * + * This search is specifically used by RFC3744's principal-property-search + * REPORT. You should at least allow searching on + * http://sabredav.org/ns}email-address. + * + * The actual search should be a unicode-non-case-sensitive search. The + * keys in searchProperties are the WebDAV property names, while the values + * are the property values to search on. + * + * If multiple properties are being searched on, the search should be + * AND'ed. + * + * This method should simply return a list of 'child names', which may be + * used to call $this->getChild in the future. + * + * @param array $searchProperties + * @return array + */ + public function searchPrincipals(array $searchProperties) { + + $result = $this->principalBackend->searchPrincipals($this->principalPrefix, $searchProperties); + $r = array(); + + foreach($result as $row) { + list(, $r[]) = DAV\URLUtil::splitPath($row); + } + + return $r; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/AceConflict.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/AceConflict.php new file mode 100755 index 00000000..cc91a95d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/AceConflict.php @@ -0,0 +1,35 @@ +ownerDocument; + + $np = $doc->createElementNS('DAV:','d:no-ace-conflict'); + $errorNode->appendChild($np); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NeedPrivileges.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NeedPrivileges.php new file mode 100755 index 00000000..9b4db9b5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NeedPrivileges.php @@ -0,0 +1,83 @@ +uri = $uri; + $this->privileges = $privileges; + + parent::__construct('User did not have the required privileges (' . implode(',', $privileges) . ') for path "' . $uri . '"'); + + } + + /** + * Adds in extra information in the xml response. + * + * This method adds the {DAV:}need-privileges element as defined in rfc3744 + * + * @param DAV\Server $server + * @param \DOMElement $errorNode + * @return void + */ + public function serialize(DAV\Server $server,\DOMElement $errorNode) { + + $doc = $errorNode->ownerDocument; + + $np = $doc->createElementNS('DAV:','d:need-privileges'); + $errorNode->appendChild($np); + + foreach($this->privileges as $privilege) { + + $resource = $doc->createElementNS('DAV:','d:resource'); + $np->appendChild($resource); + + $resource->appendChild($doc->createElementNS('DAV:','d:href',$server->getBaseUri() . $this->uri)); + + $priv = $doc->createElementNS('DAV:','d:privilege'); + $resource->appendChild($priv); + + preg_match('/^{([^}]*)}(.*)$/',$privilege,$privilegeParts); + $priv->appendChild($doc->createElementNS($privilegeParts[1],'d:' . $privilegeParts[2])); + + + } + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NoAbstract.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NoAbstract.php new file mode 100755 index 00000000..0f821062 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NoAbstract.php @@ -0,0 +1,35 @@ +ownerDocument; + + $np = $doc->createElementNS('DAV:','d:no-abstract'); + $errorNode->appendChild($np); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NotRecognizedPrincipal.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NotRecognizedPrincipal.php new file mode 100755 index 00000000..9e95cc51 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NotRecognizedPrincipal.php @@ -0,0 +1,35 @@ +ownerDocument; + + $np = $doc->createElementNS('DAV:','d:recognized-principal'); + $errorNode->appendChild($np); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NotSupportedPrivilege.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NotSupportedPrivilege.php new file mode 100755 index 00000000..461ebe3f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NotSupportedPrivilege.php @@ -0,0 +1,35 @@ +ownerDocument; + + $np = $doc->createElementNS('DAV:','d:not-supported-privilege'); + $errorNode->appendChild($np); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/IACL.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/IACL.php new file mode 100755 index 00000000..31971d54 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/IACL.php @@ -0,0 +1,74 @@ +getChild in the future. + * + * @param array $searchProperties + * @return array + */ + function searchPrincipals(array $searchProperties); + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Plugin.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Plugin.php new file mode 100755 index 00000000..89269b43 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Plugin.php @@ -0,0 +1,1402 @@ + 'Display name', + '{http://sabredav.org/ns}email-address' => 'Email address', + ); + + /** + * Any principal uri's added here, will automatically be added to the list + * of ACL's. They will effectively receive {DAV:}all privileges, as a + * protected privilege. + * + * @var array + */ + public $adminPrincipals = array(); + + /** + * Returns a list of features added by this plugin. + * + * This list is used in the response of a HTTP OPTIONS request. + * + * @return array + */ + public function getFeatures() { + + return array('access-control', 'calendarserver-principal-property-search'); + + } + + /** + * Returns a list of available methods for a given url + * + * @param string $uri + * @return array + */ + public function getMethods($uri) { + + return array('ACL'); + + } + + /** + * Returns a plugin name. + * + * Using this name other plugins will be able to access other plugins + * using SabreForRainLoop\DAV\Server::getPlugin + * + * @return string + */ + public function getPluginName() { + + return 'acl'; + + } + + /** + * Returns a list of reports this plugin supports. + * + * This will be used in the {DAV:}supported-report-set property. + * Note that you still need to subscribe to the 'report' event to actually + * implement them + * + * @param string $uri + * @return array + */ + public function getSupportedReportSet($uri) { + + return array( + '{DAV:}expand-property', + '{DAV:}principal-property-search', + '{DAV:}principal-search-property-set', + ); + + } + + + /** + * Checks if the current user has the specified privilege(s). + * + * You can specify a single privilege, or a list of privileges. + * This method will throw an exception if the privilege is not available + * and return true otherwise. + * + * @param string $uri + * @param array|string $privileges + * @param int $recursion + * @param bool $throwExceptions if set to false, this method won't throw exceptions. + * @throws SabreForRainLoop\DAVACL\Exception\NeedPrivileges + * @return bool + */ + public function checkPrivileges($uri, $privileges, $recursion = self::R_PARENT, $throwExceptions = true) { + + if (!is_array($privileges)) $privileges = array($privileges); + + $acl = $this->getCurrentUserPrivilegeSet($uri); + + if (is_null($acl)) { + if ($this->allowAccessToNodesWithoutACL) { + return true; + } else { + if ($throwExceptions) + throw new Exception\NeedPrivileges($uri,$privileges); + else + return false; + + } + } + + $failed = array(); + foreach($privileges as $priv) { + + if (!in_array($priv, $acl)) { + $failed[] = $priv; + } + + } + + if ($failed) { + if ($throwExceptions) + throw new Exception\NeedPrivileges($uri,$failed); + else + return false; + } + return true; + + } + + /** + * Returns the standard users' principal. + * + * This is one authorative principal url for the current user. + * This method will return null if the user wasn't logged in. + * + * @return string|null + */ + public function getCurrentUserPrincipal() { + + $authPlugin = $this->server->getPlugin('auth'); + if (is_null($authPlugin)) return null; + /** @var $authPlugin SabreForRainLoop\DAV\Auth\Plugin */ + + $userName = $authPlugin->getCurrentUser(); + if (!$userName) return null; + + return $this->defaultUsernamePath . '/' . $userName; + + } + + + /** + * Returns a list of principals that's associated to the current + * user, either directly or through group membership. + * + * @return array + */ + public function getCurrentUserPrincipals() { + + $currentUser = $this->getCurrentUserPrincipal(); + + if (is_null($currentUser)) return array(); + + return array_merge( + array($currentUser), + $this->getPrincipalMembership($currentUser) + ); + + } + + /** + * This array holds a cache for all the principals that are associated with + * a single principal. + * + * @var array + */ + protected $principalMembershipCache = array(); + + + /** + * Returns all the principal groups the specified principal is a member of. + * + * @param string $principal + * @return array + */ + public function getPrincipalMembership($mainPrincipal) { + + // First check our cache + if (isset($this->principalMembershipCache[$mainPrincipal])) { + return $this->principalMembershipCache[$mainPrincipal]; + } + + $check = array($mainPrincipal); + $principals = array(); + + while(count($check)) { + + $principal = array_shift($check); + + $node = $this->server->tree->getNodeForPath($principal); + if ($node instanceof IPrincipal) { + foreach($node->getGroupMembership() as $groupMember) { + + if (!in_array($groupMember, $principals)) { + + $check[] = $groupMember; + $principals[] = $groupMember; + + } + + } + + } + + } + + // Store the result in the cache + $this->principalMembershipCache[$mainPrincipal] = $principals; + + return $principals; + + } + + /** + * Returns the supported privilege structure for this ACL plugin. + * + * See RFC3744 for more details. Currently we default on a simple, + * standard structure. + * + * You can either get the list of privileges by a uri (path) or by + * specifying a Node. + * + * @param string|DAV\INode $node + * @return array + */ + public function getSupportedPrivilegeSet($node) { + + if (is_string($node)) { + $node = $this->server->tree->getNodeForPath($node); + } + + if ($node instanceof IACL) { + $result = $node->getSupportedPrivilegeSet(); + + if ($result) + return $result; + } + + return self::getDefaultSupportedPrivilegeSet(); + + } + + /** + * Returns a fairly standard set of privileges, which may be useful for + * other systems to use as a basis. + * + * @return array + */ + static function getDefaultSupportedPrivilegeSet() { + + return array( + 'privilege' => '{DAV:}all', + 'abstract' => true, + 'aggregates' => array( + array( + 'privilege' => '{DAV:}read', + 'aggregates' => array( + array( + 'privilege' => '{DAV:}read-acl', + 'abstract' => true, + ), + array( + 'privilege' => '{DAV:}read-current-user-privilege-set', + 'abstract' => true, + ), + ), + ), // {DAV:}read + array( + 'privilege' => '{DAV:}write', + 'aggregates' => array( + array( + 'privilege' => '{DAV:}write-acl', + 'abstract' => true, + ), + array( + 'privilege' => '{DAV:}write-properties', + 'abstract' => true, + ), + array( + 'privilege' => '{DAV:}write-content', + 'abstract' => true, + ), + array( + 'privilege' => '{DAV:}bind', + 'abstract' => true, + ), + array( + 'privilege' => '{DAV:}unbind', + 'abstract' => true, + ), + array( + 'privilege' => '{DAV:}unlock', + 'abstract' => true, + ), + ), + ), // {DAV:}write + ), + ); // {DAV:}all + + } + + /** + * Returns the supported privilege set as a flat list + * + * This is much easier to parse. + * + * The returned list will be index by privilege name. + * The value is a struct containing the following properties: + * - aggregates + * - abstract + * - concrete + * + * @param string|DAV\INode $node + * @return array + */ + final public function getFlatPrivilegeSet($node) { + + $privs = $this->getSupportedPrivilegeSet($node); + + $flat = array(); + $this->getFPSTraverse($privs, null, $flat); + + return $flat; + + } + + /** + * Traverses the privilege set tree for reordering + * + * This function is solely used by getFlatPrivilegeSet, and would have been + * a closure if it wasn't for the fact I need to support PHP 5.2. + * + * @param array $priv + * @param $concrete + * @param array $flat + * @return void + */ + final private function getFPSTraverse($priv, $concrete, &$flat) { + + $myPriv = array( + 'privilege' => $priv['privilege'], + 'abstract' => isset($priv['abstract']) && $priv['abstract'], + 'aggregates' => array(), + 'concrete' => isset($priv['abstract']) && $priv['abstract']?$concrete:$priv['privilege'], + ); + + if (isset($priv['aggregates'])) + foreach($priv['aggregates'] as $subPriv) $myPriv['aggregates'][] = $subPriv['privilege']; + + $flat[$priv['privilege']] = $myPriv; + + if (isset($priv['aggregates'])) { + + foreach($priv['aggregates'] as $subPriv) { + + $this->getFPSTraverse($subPriv, $myPriv['concrete'], $flat); + + } + + } + + } + + /** + * Returns the full ACL list. + * + * Either a uri or a DAV\INode may be passed. + * + * null will be returned if the node doesn't support ACLs. + * + * @param string|DAV\INode $node + * @return array + */ + public function getACL($node) { + + if (is_string($node)) { + $node = $this->server->tree->getNodeForPath($node); + } + if (!$node instanceof IACL) { + return null; + } + $acl = $node->getACL(); + foreach($this->adminPrincipals as $adminPrincipal) { + $acl[] = array( + 'principal' => $adminPrincipal, + 'privilege' => '{DAV:}all', + 'protected' => true, + ); + } + return $acl; + + } + + /** + * Returns a list of privileges the current user has + * on a particular node. + * + * Either a uri or a DAV\INode may be passed. + * + * null will be returned if the node doesn't support ACLs. + * + * @param string|DAV\INode $node + * @return array + */ + public function getCurrentUserPrivilegeSet($node) { + + if (is_string($node)) { + $node = $this->server->tree->getNodeForPath($node); + } + + $acl = $this->getACL($node); + + if (is_null($acl)) return null; + + $principals = $this->getCurrentUserPrincipals(); + + $collected = array(); + + foreach($acl as $ace) { + + $principal = $ace['principal']; + + switch($principal) { + + case '{DAV:}owner' : + $owner = $node->getOwner(); + if ($owner && in_array($owner, $principals)) { + $collected[] = $ace; + } + break; + + + // 'all' matches for every user + case '{DAV:}all' : + + // 'authenticated' matched for every user that's logged in. + // Since it's not possible to use ACL while not being logged + // in, this is also always true. + case '{DAV:}authenticated' : + $collected[] = $ace; + break; + + // 'unauthenticated' can never occur either, so we simply + // ignore these. + case '{DAV:}unauthenticated' : + break; + + default : + if (in_array($ace['principal'], $principals)) { + $collected[] = $ace; + } + break; + + } + + + } + + // Now we deduct all aggregated privileges. + $flat = $this->getFlatPrivilegeSet($node); + + $collected2 = array(); + while(count($collected)) { + + $current = array_pop($collected); + $collected2[] = $current['privilege']; + + foreach($flat[$current['privilege']]['aggregates'] as $subPriv) { + $collected2[] = $subPriv; + $collected[] = $flat[$subPriv]; + } + + } + + return array_values(array_unique($collected2)); + + } + + /** + * Principal property search + * + * This method can search for principals matching certain values in + * properties. + * + * This method will return a list of properties for the matched properties. + * + * @param array $searchProperties The properties to search on. This is a + * key-value list. The keys are property + * names, and the values the strings to + * match them on. + * @param array $requestedProperties This is the list of properties to + * return for every match. + * @param string $collectionUri The principal collection to search on. + * If this is ommitted, the standard + * principal collection-set will be used. + * @return array This method returns an array structure similar to + * SabreForRainLoop\DAV\Server::getPropertiesForPath. Returned + * properties are index by a HTTP status code. + * + */ + public function principalSearch(array $searchProperties, array $requestedProperties, $collectionUri = null) { + + if (!is_null($collectionUri)) { + $uris = array($collectionUri); + } else { + $uris = $this->principalCollectionSet; + } + + $lookupResults = array(); + foreach($uris as $uri) { + + $principalCollection = $this->server->tree->getNodeForPath($uri); + if (!$principalCollection instanceof IPrincipalCollection) { + // Not a principal collection, we're simply going to ignore + // this. + continue; + } + + $results = $principalCollection->searchPrincipals($searchProperties); + foreach($results as $result) { + $lookupResults[] = rtrim($uri,'/') . '/' . $result; + } + + } + + $matches = array(); + + foreach($lookupResults as $lookupResult) { + + list($matches[]) = $this->server->getPropertiesForPath($lookupResult, $requestedProperties, 0); + + } + + return $matches; + + } + + /** + * Sets up the plugin + * + * This method is automatically called by the server class. + * + * @param DAV\Server $server + * @return void + */ + public function initialize(DAV\Server $server) { + + $this->server = $server; + $server->subscribeEvent('beforeGetProperties',array($this,'beforeGetProperties')); + + $server->subscribeEvent('beforeMethod', array($this,'beforeMethod'),20); + $server->subscribeEvent('beforeBind', array($this,'beforeBind'),20); + $server->subscribeEvent('beforeUnbind', array($this,'beforeUnbind'),20); + $server->subscribeEvent('updateProperties',array($this,'updateProperties')); + $server->subscribeEvent('beforeUnlock', array($this,'beforeUnlock'),20); + $server->subscribeEvent('report',array($this,'report')); + $server->subscribeEvent('unknownMethod', array($this, 'unknownMethod')); + + array_push($server->protectedProperties, + '{DAV:}alternate-URI-set', + '{DAV:}principal-URL', + '{DAV:}group-membership', + '{DAV:}principal-collection-set', + '{DAV:}current-user-principal', + '{DAV:}supported-privilege-set', + '{DAV:}current-user-privilege-set', + '{DAV:}acl', + '{DAV:}acl-restrictions', + '{DAV:}inherited-acl-set', + '{DAV:}owner', + '{DAV:}group' + ); + + // Automatically mapping nodes implementing IPrincipal to the + // {DAV:}principal resourcetype. + $server->resourceTypeMapping['SabreForRainLoop\\DAVACL\\IPrincipal'] = '{DAV:}principal'; + + // Mapping the group-member-set property to the HrefList property + // class. + $server->propertyMap['{DAV:}group-member-set'] = 'SabreForRainLoop\\DAV\\Property\\HrefList'; + + } + + + /* {{{ Event handlers */ + + /** + * Triggered before any method is handled + * + * @param string $method + * @param string $uri + * @return void + */ + public function beforeMethod($method, $uri) { + + $exists = $this->server->tree->nodeExists($uri); + + // If the node doesn't exists, none of these checks apply + if (!$exists) return; + + switch($method) { + + case 'GET' : + case 'HEAD' : + case 'OPTIONS' : + // For these 3 we only need to know if the node is readable. + $this->checkPrivileges($uri,'{DAV:}read'); + break; + + case 'PUT' : + case 'LOCK' : + case 'UNLOCK' : + // This method requires the write-content priv if the node + // already exists, and bind on the parent if the node is being + // created. + // The bind privilege is handled in the beforeBind event. + $this->checkPrivileges($uri,'{DAV:}write-content'); + break; + + + case 'PROPPATCH' : + $this->checkPrivileges($uri,'{DAV:}write-properties'); + break; + + case 'ACL' : + $this->checkPrivileges($uri,'{DAV:}write-acl'); + break; + + case 'COPY' : + case 'MOVE' : + // Copy requires read privileges on the entire source tree. + // If the target exists write-content normally needs to be + // checked, however, we're deleting the node beforehand and + // creating a new one after, so this is handled by the + // beforeUnbind event. + // + // The creation of the new node is handled by the beforeBind + // event. + // + // If MOVE is used beforeUnbind will also be used to check if + // the sourcenode can be deleted. + $this->checkPrivileges($uri,'{DAV:}read',self::R_RECURSIVE); + + break; + + } + + } + + /** + * Triggered before a new node is created. + * + * This allows us to check permissions for any operation that creates a + * new node, such as PUT, MKCOL, MKCALENDAR, LOCK, COPY and MOVE. + * + * @param string $uri + * @return void + */ + public function beforeBind($uri) { + + list($parentUri,$nodeName) = DAV\URLUtil::splitPath($uri); + $this->checkPrivileges($parentUri,'{DAV:}bind'); + + } + + /** + * Triggered before a node is deleted + * + * This allows us to check permissions for any operation that will delete + * an existing node. + * + * @param string $uri + * @return void + */ + public function beforeUnbind($uri) { + + list($parentUri,$nodeName) = DAV\URLUtil::splitPath($uri); + $this->checkPrivileges($parentUri,'{DAV:}unbind',self::R_RECURSIVEPARENTS); + + } + + /** + * Triggered before a node is unlocked. + * + * @param string $uri + * @param DAV\Locks\LockInfo $lock + * @TODO: not yet implemented + * @return void + */ + public function beforeUnlock($uri, DAV\Locks\LockInfo $lock) { + + + } + + /** + * Triggered before properties are looked up in specific nodes. + * + * @param string $uri + * @param DAV\INode $node + * @param array $requestedProperties + * @param array $returnedProperties + * @TODO really should be broken into multiple methods, or even a class. + * @return bool + */ + public function beforeGetProperties($uri, DAV\INode $node, &$requestedProperties, &$returnedProperties) { + + // Checking the read permission + if (!$this->checkPrivileges($uri,'{DAV:}read',self::R_PARENT,false)) { + + // User is not allowed to read properties + if ($this->hideNodesFromListings) { + return false; + } + + // Marking all requested properties as '403'. + foreach($requestedProperties as $key=>$requestedProperty) { + unset($requestedProperties[$key]); + $returnedProperties[403][$requestedProperty] = null; + } + return; + + } + + /* Adding principal properties */ + if ($node instanceof IPrincipal) { + + if (false !== ($index = array_search('{DAV:}alternate-URI-set', $requestedProperties))) { + + unset($requestedProperties[$index]); + $returnedProperties[200]['{DAV:}alternate-URI-set'] = new DAV\Property\HrefList($node->getAlternateUriSet()); + + } + if (false !== ($index = array_search('{DAV:}principal-URL', $requestedProperties))) { + + unset($requestedProperties[$index]); + $returnedProperties[200]['{DAV:}principal-URL'] = new DAV\Property\Href($node->getPrincipalUrl() . '/'); + + } + if (false !== ($index = array_search('{DAV:}group-member-set', $requestedProperties))) { + + unset($requestedProperties[$index]); + $returnedProperties[200]['{DAV:}group-member-set'] = new DAV\Property\HrefList($node->getGroupMemberSet()); + + } + if (false !== ($index = array_search('{DAV:}group-membership', $requestedProperties))) { + + unset($requestedProperties[$index]); + $returnedProperties[200]['{DAV:}group-membership'] = new DAV\Property\HrefList($node->getGroupMembership()); + + } + + if (false !== ($index = array_search('{DAV:}displayname', $requestedProperties))) { + + $returnedProperties[200]['{DAV:}displayname'] = $node->getDisplayName(); + + } + + } + if (false !== ($index = array_search('{DAV:}principal-collection-set', $requestedProperties))) { + + unset($requestedProperties[$index]); + $val = $this->principalCollectionSet; + // Ensuring all collections end with a slash + foreach($val as $k=>$v) $val[$k] = $v . '/'; + $returnedProperties[200]['{DAV:}principal-collection-set'] = new DAV\Property\HrefList($val); + + } + if (false !== ($index = array_search('{DAV:}current-user-principal', $requestedProperties))) { + + unset($requestedProperties[$index]); + if ($url = $this->getCurrentUserPrincipal()) { + $returnedProperties[200]['{DAV:}current-user-principal'] = new Property\Principal(Property\Principal::HREF, $url . '/'); + } else { + $returnedProperties[200]['{DAV:}current-user-principal'] = new Property\Principal(Property\Principal::UNAUTHENTICATED); + } + + } + if (false !== ($index = array_search('{DAV:}supported-privilege-set', $requestedProperties))) { + + unset($requestedProperties[$index]); + $returnedProperties[200]['{DAV:}supported-privilege-set'] = new Property\SupportedPrivilegeSet($this->getSupportedPrivilegeSet($node)); + + } + if (false !== ($index = array_search('{DAV:}current-user-privilege-set', $requestedProperties))) { + + if (!$this->checkPrivileges($uri, '{DAV:}read-current-user-privilege-set', self::R_PARENT, false)) { + $returnedProperties[403]['{DAV:}current-user-privilege-set'] = null; + unset($requestedProperties[$index]); + } else { + $val = $this->getCurrentUserPrivilegeSet($node); + if (!is_null($val)) { + unset($requestedProperties[$index]); + $returnedProperties[200]['{DAV:}current-user-privilege-set'] = new Property\CurrentUserPrivilegeSet($val); + } + } + + } + + /* The ACL property contains all the permissions */ + if (false !== ($index = array_search('{DAV:}acl', $requestedProperties))) { + + if (!$this->checkPrivileges($uri, '{DAV:}read-acl', self::R_PARENT, false)) { + + unset($requestedProperties[$index]); + $returnedProperties[403]['{DAV:}acl'] = null; + + } else { + + $acl = $this->getACL($node); + if (!is_null($acl)) { + unset($requestedProperties[$index]); + $returnedProperties[200]['{DAV:}acl'] = new Property\Acl($this->getACL($node)); + } + + } + + } + + /* The acl-restrictions property contains information on how privileges + * must behave. + */ + if (false !== ($index = array_search('{DAV:}acl-restrictions', $requestedProperties))) { + unset($requestedProperties[$index]); + $returnedProperties[200]['{DAV:}acl-restrictions'] = new Property\AclRestrictions(); + } + + /* Adding ACL properties */ + if ($node instanceof IACL) { + + if (false !== ($index = array_search('{DAV:}owner', $requestedProperties))) { + + unset($requestedProperties[$index]); + $returnedProperties[200]['{DAV:}owner'] = new DAV\Property\Href($node->getOwner() . '/'); + + } + + } + + } + + /** + * This method intercepts PROPPATCH methods and make sure the + * group-member-set is updated correctly. + * + * @param array $propertyDelta + * @param array $result + * @param DAV\INode $node + * @return bool + */ + public function updateProperties(&$propertyDelta, &$result, DAV\INode $node) { + + if (!array_key_exists('{DAV:}group-member-set', $propertyDelta)) + return; + + if (is_null($propertyDelta['{DAV:}group-member-set'])) { + $memberSet = array(); + } elseif ($propertyDelta['{DAV:}group-member-set'] instanceof DAV\Property\HrefList) { + $memberSet = array_map( + array($this->server,'calculateUri'), + $propertyDelta['{DAV:}group-member-set']->getHrefs() + ); + } else { + throw new DAV\Exception('The group-member-set property MUST be an instance of SabreForRainLoop\DAV\Property\HrefList or null'); + } + + if (!($node instanceof IPrincipal)) { + $result[403]['{DAV:}group-member-set'] = null; + unset($propertyDelta['{DAV:}group-member-set']); + + // Returning false will stop the updateProperties process + return false; + } + + $node->setGroupMemberSet($memberSet); + // We must also clear our cache, just in case + + $this->principalMembershipCache = array(); + + $result[200]['{DAV:}group-member-set'] = null; + unset($propertyDelta['{DAV:}group-member-set']); + + } + + /** + * This method handles HTTP REPORT requests + * + * @param string $reportName + * @param \DOMNode $dom + * @return bool + */ + public function report($reportName, $dom) { + + switch($reportName) { + + case '{DAV:}principal-property-search' : + $this->principalPropertySearchReport($dom); + return false; + case '{DAV:}principal-search-property-set' : + $this->principalSearchPropertySetReport($dom); + return false; + case '{DAV:}expand-property' : + $this->expandPropertyReport($dom); + return false; + + } + + } + + /** + * This event is triggered for any HTTP method that is not known by the + * webserver. + * + * @param string $method + * @param string $uri + * @return bool + */ + public function unknownMethod($method, $uri) { + + if ($method!=='ACL') return; + + $this->httpACL($uri); + return false; + + } + + /** + * This method is responsible for handling the 'ACL' event. + * + * @param string $uri + * @return void + */ + public function httpACL($uri) { + + $body = $this->server->httpRequest->getBody(true); + $dom = DAV\XMLUtil::loadDOMDocument($body); + + $newAcl = + Property\Acl::unserialize($dom->firstChild) + ->getPrivileges(); + + // Normalizing urls + foreach($newAcl as $k=>$newAce) { + $newAcl[$k]['principal'] = $this->server->calculateUri($newAce['principal']); + } + + $node = $this->server->tree->getNodeForPath($uri); + + if (!($node instanceof IACL)) { + throw new DAV\Exception\MethodNotAllowed('This node does not support the ACL method'); + } + + $oldAcl = $this->getACL($node); + + $supportedPrivileges = $this->getFlatPrivilegeSet($node); + + /* Checking if protected principals from the existing principal set are + not overwritten. */ + foreach($oldAcl as $oldAce) { + + if (!isset($oldAce['protected']) || !$oldAce['protected']) continue; + + $found = false; + foreach($newAcl as $newAce) { + if ( + $newAce['privilege'] === $oldAce['privilege'] && + $newAce['principal'] === $oldAce['principal'] && + $newAce['protected'] + ) + $found = true; + } + + if (!$found) + throw new Exception\AceConflict('This resource contained a protected {DAV:}ace, but this privilege did not occur in the ACL request'); + + } + + foreach($newAcl as $newAce) { + + // Do we recognize the privilege + if (!isset($supportedPrivileges[$newAce['privilege']])) { + throw new Exception\NotSupportedPrivilege('The privilege you specified (' . $newAce['privilege'] . ') is not recognized by this server'); + } + + if ($supportedPrivileges[$newAce['privilege']]['abstract']) { + throw new Exception\NoAbstract('The privilege you specified (' . $newAce['privilege'] . ') is an abstract privilege'); + } + + // Looking up the principal + try { + $principal = $this->server->tree->getNodeForPath($newAce['principal']); + } catch (DAV\Exception\NotFound $e) { + throw new Exception\NotRecognizedPrincipal('The specified principal (' . $newAce['principal'] . ') does not exist'); + } + if (!($principal instanceof IPrincipal)) { + throw new Exception\NotRecognizedPrincipal('The specified uri (' . $newAce['principal'] . ') is not a principal'); + } + + } + $node->setACL($newAcl); + + } + + /* }}} */ + + /* Reports {{{ */ + + /** + * The expand-property report is defined in RFC3253 section 3-8. + * + * This report is very similar to a standard PROPFIND. The difference is + * that it has the additional ability to look at properties containing a + * {DAV:}href element, follow that property and grab additional elements + * there. + * + * Other rfc's, such as ACL rely on this report, so it made sense to put + * it in this plugin. + * + * @param \DOMElement $dom + * @return void + */ + protected function expandPropertyReport($dom) { + + $requestedProperties = $this->parseExpandPropertyReportRequest($dom->firstChild->firstChild); + $depth = $this->server->getHTTPDepth(0); + $requestUri = $this->server->getRequestUri(); + + $result = $this->expandProperties($requestUri,$requestedProperties,$depth); + + $dom = new \DOMDocument('1.0','utf-8'); + $dom->formatOutput = true; + $multiStatus = $dom->createElement('d:multistatus'); + $dom->appendChild($multiStatus); + + // Adding in default namespaces + foreach($this->server->xmlNamespaces as $namespace=>$prefix) { + + $multiStatus->setAttribute('xmlns:' . $prefix,$namespace); + + } + + foreach($result as $response) { + $response->serialize($this->server, $multiStatus); + } + + $xml = $dom->saveXML(); + $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); + $this->server->httpResponse->sendStatus(207); + $this->server->httpResponse->sendBody($xml); + + } + + /** + * This method is used by expandPropertyReport to parse + * out the entire HTTP request. + * + * @param \DOMElement $node + * @return array + */ + protected function parseExpandPropertyReportRequest($node) { + + $requestedProperties = array(); + do { + + if (DAV\XMLUtil::toClarkNotation($node)!=='{DAV:}property') continue; + + if ($node->firstChild) { + + $children = $this->parseExpandPropertyReportRequest($node->firstChild); + + } else { + + $children = array(); + + } + + $namespace = $node->getAttribute('namespace'); + if (!$namespace) $namespace = 'DAV:'; + + $propName = '{'.$namespace.'}' . $node->getAttribute('name'); + $requestedProperties[$propName] = $children; + + } while ($node = $node->nextSibling); + + return $requestedProperties; + + } + + /** + * This method expands all the properties and returns + * a list with property values + * + * @param array $path + * @param array $requestedProperties the list of required properties + * @param int $depth + * @return array + */ + protected function expandProperties($path, array $requestedProperties, $depth) { + + $foundProperties = $this->server->getPropertiesForPath($path, array_keys($requestedProperties), $depth); + + $result = array(); + + foreach($foundProperties as $node) { + + foreach($requestedProperties as $propertyName=>$childRequestedProperties) { + + // We're only traversing if sub-properties were requested + if(count($childRequestedProperties)===0) continue; + + // We only have to do the expansion if the property was found + // and it contains an href element. + if (!array_key_exists($propertyName,$node[200])) continue; + + if ($node[200][$propertyName] instanceof DAV\Property\IHref) { + $hrefs = array($node[200][$propertyName]->getHref()); + } elseif ($node[200][$propertyName] instanceof DAV\Property\HrefList) { + $hrefs = $node[200][$propertyName]->getHrefs(); + } + + $childProps = array(); + foreach($hrefs as $href) { + $childProps = array_merge($childProps, $this->expandProperties($href, $childRequestedProperties, 0)); + } + $node[200][$propertyName] = new DAV\Property\ResponseList($childProps); + + } + $result[] = new DAV\Property\Response($node['href'], $node); + + } + + return $result; + + } + + /** + * principalSearchPropertySetReport + * + * This method responsible for handing the + * {DAV:}principal-search-property-set report. This report returns a list + * of properties the client may search on, using the + * {DAV:}principal-property-search report. + * + * @param \DOMDocument $dom + * @return void + */ + protected function principalSearchPropertySetReport(\DOMDocument $dom) { + + $httpDepth = $this->server->getHTTPDepth(0); + if ($httpDepth!==0) { + throw new DAV\Exception\BadRequest('This report is only defined when Depth: 0'); + } + + if ($dom->firstChild->hasChildNodes()) + throw new DAV\Exception\BadRequest('The principal-search-property-set report element is not allowed to have child elements'); + + $dom = new \DOMDocument('1.0','utf-8'); + $dom->formatOutput = true; + $root = $dom->createElement('d:principal-search-property-set'); + $dom->appendChild($root); + // Adding in default namespaces + foreach($this->server->xmlNamespaces as $namespace=>$prefix) { + + $root->setAttribute('xmlns:' . $prefix,$namespace); + + } + + $nsList = $this->server->xmlNamespaces; + + foreach($this->principalSearchPropertySet as $propertyName=>$description) { + + $psp = $dom->createElement('d:principal-search-property'); + $root->appendChild($psp); + + $prop = $dom->createElement('d:prop'); + $psp->appendChild($prop); + + $propName = null; + preg_match('/^{([^}]*)}(.*)$/',$propertyName,$propName); + + $currentProperty = $dom->createElement($nsList[$propName[1]] . ':' . $propName[2]); + $prop->appendChild($currentProperty); + + $descriptionElem = $dom->createElement('d:description'); + $descriptionElem->setAttribute('xml:lang','en'); + $descriptionElem->appendChild($dom->createTextNode($description)); + $psp->appendChild($descriptionElem); + + + } + + $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); + $this->server->httpResponse->sendStatus(200); + $this->server->httpResponse->sendBody($dom->saveXML()); + + } + + /** + * principalPropertySearchReport + * + * This method is responsible for handing the + * {DAV:}principal-property-search report. This report can be used for + * clients to search for groups of principals, based on the value of one + * or more properties. + * + * @param \DOMDocument $dom + * @return void + */ + protected function principalPropertySearchReport(\DOMDocument $dom) { + + list($searchProperties, $requestedProperties, $applyToPrincipalCollectionSet) = $this->parsePrincipalPropertySearchReportRequest($dom); + + $uri = null; + if (!$applyToPrincipalCollectionSet) { + $uri = $this->server->getRequestUri(); + } + $result = $this->principalSearch($searchProperties, $requestedProperties, $uri); + + $prefer = $this->server->getHTTPPRefer(); + + $this->server->httpResponse->sendStatus(207); + $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); + $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); + $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result, $prefer['return-minimal'])); + + } + + /** + * parsePrincipalPropertySearchReportRequest + * + * This method parses the request body from a + * {DAV:}principal-property-search report. + * + * This method returns an array with two elements: + * 1. an array with properties to search on, and their values + * 2. a list of propertyvalues that should be returned for the request. + * + * @param \DOMDocument $dom + * @return array + */ + protected function parsePrincipalPropertySearchReportRequest($dom) { + + $httpDepth = $this->server->getHTTPDepth(0); + if ($httpDepth!==0) { + throw new DAV\Exception\BadRequest('This report is only defined when Depth: 0'); + } + + $searchProperties = array(); + + $applyToPrincipalCollectionSet = false; + + // Parsing the search request + foreach($dom->firstChild->childNodes as $searchNode) { + + if (DAV\XMLUtil::toClarkNotation($searchNode) == '{DAV:}apply-to-principal-collection-set') { + $applyToPrincipalCollectionSet = true; + } + + if (DAV\XMLUtil::toClarkNotation($searchNode)!=='{DAV:}property-search') + continue; + + $propertyName = null; + $propertyValue = null; + + foreach($searchNode->childNodes as $childNode) { + + switch(DAV\XMLUtil::toClarkNotation($childNode)) { + + case '{DAV:}prop' : + $property = DAV\XMLUtil::parseProperties($searchNode); + reset($property); + $propertyName = key($property); + break; + + case '{DAV:}match' : + $propertyValue = $childNode->textContent; + break; + + } + + + } + + if (is_null($propertyName) || is_null($propertyValue)) + throw new DAV\Exception\BadRequest('Invalid search request. propertyname: ' . $propertyName . '. propertvvalue: ' . $propertyValue); + + $searchProperties[$propertyName] = $propertyValue; + + } + + return array($searchProperties, array_keys(DAV\XMLUtil::parseProperties($dom->firstChild)), $applyToPrincipalCollectionSet); + + } + + + /* }}} */ + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Principal.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Principal.php new file mode 100755 index 00000000..b2d9e9da --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Principal.php @@ -0,0 +1,281 @@ +principalBackend = $principalBackend; + $this->principalProperties = $principalProperties; + + } + + /** + * Returns the full principal url + * + * @return string + */ + public function getPrincipalUrl() { + + return $this->principalProperties['uri']; + + } + + /** + * Returns a list of alternative urls for a principal + * + * This can for example be an email address, or ldap url. + * + * @return array + */ + public function getAlternateUriSet() { + + $uris = array(); + if (isset($this->principalProperties['{DAV:}alternate-URI-set'])) { + + $uris = $this->principalProperties['{DAV:}alternate-URI-set']; + + } + + if (isset($this->principalProperties['{http://sabredav.org/ns}email-address'])) { + $uris[] = 'mailto:' . $this->principalProperties['{http://sabredav.org/ns}email-address']; + } + + return array_unique($uris); + + } + + /** + * Returns the list of group members + * + * If this principal is a group, this function should return + * all member principal uri's for the group. + * + * @return array + */ + public function getGroupMemberSet() { + + return $this->principalBackend->getGroupMemberSet($this->principalProperties['uri']); + + } + + /** + * Returns the list of groups this principal is member of + * + * If this principal is a member of a (list of) groups, this function + * should return a list of principal uri's for it's members. + * + * @return array + */ + public function getGroupMembership() { + + return $this->principalBackend->getGroupMemberShip($this->principalProperties['uri']); + + } + + + /** + * Sets a list of group members + * + * If this principal is a group, this method sets all the group members. + * The list of members is always overwritten, never appended to. + * + * This method should throw an exception if the members could not be set. + * + * @param array $groupMembers + * @return void + */ + public function setGroupMemberSet(array $groupMembers) { + + $this->principalBackend->setGroupMemberSet($this->principalProperties['uri'], $groupMembers); + + } + + + /** + * Returns this principals name. + * + * @return string + */ + public function getName() { + + $uri = $this->principalProperties['uri']; + list(, $name) = DAV\URLUtil::splitPath($uri); + return $name; + + } + + /** + * Returns the name of the user + * + * @return string + */ + public function getDisplayName() { + + if (isset($this->principalProperties['{DAV:}displayname'])) { + return $this->principalProperties['{DAV:}displayname']; + } else { + return $this->getName(); + } + + } + + /** + * Returns a list of properties + * + * @param array $requestedProperties + * @return array + */ + public function getProperties($requestedProperties) { + + $newProperties = array(); + foreach($requestedProperties as $propName) { + + if (isset($this->principalProperties[$propName])) { + $newProperties[$propName] = $this->principalProperties[$propName]; + } + + } + + return $newProperties; + + } + + /** + * Updates this principals properties. + * + * @param array $mutations + * @see SabreForRainLoop\DAV\IProperties::updateProperties + * @return bool|array + */ + public function updateProperties($mutations) { + + return $this->principalBackend->updatePrincipal($this->principalProperties['uri'], $mutations); + + } + + /** + * Returns the owner principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getOwner() { + + return $this->principalProperties['uri']; + + + } + + /** + * Returns a group principal + * + * This must be a url to a principal, or null if there's no owner + * + * @return string|null + */ + public function getGroup() { + + return null; + + } + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + return array( + array( + 'privilege' => '{DAV:}read', + 'principal' => $this->getPrincipalUrl(), + 'protected' => true, + ), + ); + + } + + /** + * Updates the ACL + * + * This method will receive a list of new ACE's. + * + * @param array $acl + * @return void + */ + public function setACL(array $acl) { + + throw new DAV\Exception\MethodNotAllowed('Updating ACLs is not allowed here'); + + } + + /** + * Returns the list of supported privileges for this node. + * + * The returned data structure is a list of nested privileges. + * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple + * standard structure. + * + * If null is returned from this method, the default privilege set is used, + * which is fine for most common usecases. + * + * @return array|null + */ + public function getSupportedPrivilegeSet() { + + return null; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalBackend/AbstractBackend.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalBackend/AbstractBackend.php new file mode 100755 index 00000000..3f500e30 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalBackend/AbstractBackend.php @@ -0,0 +1,18 @@ + array( + * '{DAV:}prop1' => null, + * ), + * 201 => array( + * '{DAV:}prop2' => null, + * ), + * 403 => array( + * '{DAV:}prop3' => null, + * ), + * 424 => array( + * '{DAV:}prop4' => null, + * ), + * ); + * + * In this previous example prop1 was successfully updated or deleted, and + * prop2 was succesfully created. + * + * prop3 failed to update due to '403 Forbidden' and because of this prop4 + * also could not be updated with '424 Failed dependency'. + * + * This last example was actually incorrect. While 200 and 201 could appear + * in 1 response, if there's any error (403) the other properties should + * always fail with 423 (failed dependency). + * + * But anyway, if you don't want to scratch your head over this, just + * return true or false. + * + * @param string $path + * @param array $mutations + * @return array|bool + */ + function updatePrincipal($path, $mutations); + + /** + * This method is used to search for principals matching a set of + * properties. + * + * This search is specifically used by RFC3744's principal-property-search + * REPORT. You should at least allow searching on + * http://sabredav.org/ns}email-address. + * + * The actual search should be a unicode-non-case-sensitive search. The + * keys in searchProperties are the WebDAV property names, while the values + * are the property values to search on. + * + * If multiple properties are being searched on, the search should be + * AND'ed. + * + * This method should simply return an array with full principal uri's. + * + * If somebody attempted to search on a property the backend does not + * support, you should simply return 0 results. + * + * You can also just return 0 results if you choose to not support + * searching at all, but keep in mind that this may stop certain features + * from working. + * + * @param string $prefixPath + * @param array $searchProperties + * @return array + */ + function searchPrincipals($prefixPath, array $searchProperties); + + /** + * Returns the list of members for a group-principal + * + * @param string $principal + * @return array + */ + function getGroupMemberSet($principal); + + /** + * Returns the list of groups a principal is a member of + * + * @param string $principal + * @return array + */ + function getGroupMembership($principal); + + /** + * Updates the list of group members for a group principal. + * + * The principals should be passed as a list of uri's. + * + * @param string $principal + * @param array $members + * @return void + */ + function setGroupMemberSet($principal, array $members); + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalBackend/PDO.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalBackend/PDO.php new file mode 100755 index 00000000..4717c495 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalBackend/PDO.php @@ -0,0 +1,428 @@ + array( + 'dbField' => 'displayname', + ), + + /** + * This property is actually used by the CardDAV plugin, where it gets + * mapped to {http://calendarserver.orgi/ns/}me-card. + * + * The reason we don't straight-up use that property, is because + * me-card is defined as a property on the users' addressbook + * collection. + */ + '{http://sabredav.org/ns}vcard-url' => array( + 'dbField' => 'vcardurl', + ), + /** + * This is the users' primary email-address. + */ + '{http://sabredav.org/ns}email-address' => array( + 'dbField' => 'email', + ), + ); + + /** + * Sets up the backend. + * + * @param PDO $pdo + * @param string $tableName + * @param string $groupMembersTableName + */ + public function __construct(\PDO $pdo, $tableName = 'principals', $groupMembersTableName = 'groupmembers') { + + $this->pdo = $pdo; + $this->tableName = $tableName; + $this->groupMembersTableName = $groupMembersTableName; + + } + + + /** + * Returns a list of principals based on a prefix. + * + * This prefix will often contain something like 'principals'. You are only + * expected to return principals that are in this base path. + * + * You are expected to return at least a 'uri' for every user, you can + * return any additional properties if you wish so. Common properties are: + * {DAV:}displayname + * {http://sabredav.org/ns}email-address - This is a custom SabreDAV + * field that's actualy injected in a number of other properties. If + * you have an email address, use this property. + * + * @param string $prefixPath + * @return array + */ + public function getPrincipalsByPrefix($prefixPath) { + + $fields = array( + 'uri', + ); + + foreach($this->fieldMap as $key=>$value) { + $fields[] = $value['dbField']; + } + $result = $this->pdo->query('SELECT '.implode(',', $fields).' FROM '. $this->tableName); + + $principals = array(); + + while($row = $result->fetch(\PDO::FETCH_ASSOC)) { + + // Checking if the principal is in the prefix + list($rowPrefix) = DAV\URLUtil::splitPath($row['uri']); + if ($rowPrefix !== $prefixPath) continue; + + $principal = array( + 'uri' => $row['uri'], + ); + foreach($this->fieldMap as $key=>$value) { + if ($row[$value['dbField']]) { + $principal[$key] = $row[$value['dbField']]; + } + } + $principals[] = $principal; + + } + + return $principals; + + } + + /** + * Returns a specific principal, specified by it's path. + * The returned structure should be the exact same as from + * getPrincipalsByPrefix. + * + * @param string $path + * @return array + */ + public function getPrincipalByPath($path) { + + $fields = array( + 'id', + 'uri', + ); + + foreach($this->fieldMap as $key=>$value) { + $fields[] = $value['dbField']; + } + $stmt = $this->pdo->prepare('SELECT '.implode(',', $fields).' FROM '. $this->tableName . ' WHERE uri = ?'); + $stmt->execute(array($path)); + + $row = $stmt->fetch(\PDO::FETCH_ASSOC); + if (!$row) return; + + $principal = array( + 'id' => $row['id'], + 'uri' => $row['uri'], + ); + foreach($this->fieldMap as $key=>$value) { + if ($row[$value['dbField']]) { + $principal[$key] = $row[$value['dbField']]; + } + } + return $principal; + + } + + /** + * Updates one ore more webdav properties on a principal. + * + * The list of mutations is supplied as an array. Each key in the array is + * a propertyname, such as {DAV:}displayname. + * + * Each value is the actual value to be updated. If a value is null, it + * must be deleted. + * + * This method should be atomic. It must either completely succeed, or + * completely fail. Success and failure can simply be returned as 'true' or + * 'false'. + * + * It is also possible to return detailed failure information. In that case + * an array such as this should be returned: + * + * array( + * 200 => array( + * '{DAV:}prop1' => null, + * ), + * 201 => array( + * '{DAV:}prop2' => null, + * ), + * 403 => array( + * '{DAV:}prop3' => null, + * ), + * 424 => array( + * '{DAV:}prop4' => null, + * ), + * ); + * + * In this previous example prop1 was successfully updated or deleted, and + * prop2 was succesfully created. + * + * prop3 failed to update due to '403 Forbidden' and because of this prop4 + * also could not be updated with '424 Failed dependency'. + * + * This last example was actually incorrect. While 200 and 201 could appear + * in 1 response, if there's any error (403) the other properties should + * always fail with 423 (failed dependency). + * + * But anyway, if you don't want to scratch your head over this, just + * return true or false. + * + * @param string $path + * @param array $mutations + * @return array|bool + */ + public function updatePrincipal($path, $mutations) { + + $updateAble = array(); + foreach($mutations as $key=>$value) { + + // We are not aware of this field, we must fail. + if (!isset($this->fieldMap[$key])) { + + $response = array( + 403 => array( + $key => null, + ), + 424 => array(), + ); + + // Adding the rest to the response as a 424 + foreach($mutations as $subKey=>$subValue) { + if ($subKey !== $key) { + $response[424][$subKey] = null; + } + } + return $response; + } + + $updateAble[$this->fieldMap[$key]['dbField']] = $value; + + } + + // No fields to update + $query = "UPDATE " . $this->tableName . " SET "; + + $first = true; + foreach($updateAble as $key => $value) { + if (!$first) { + $query.= ', '; + } + $first = false; + $query.= "$key = :$key "; + } + $query.='WHERE uri = :uri'; + $stmt = $this->pdo->prepare($query); + $updateAble['uri'] = $path; + $stmt->execute($updateAble); + + return true; + + } + + /** + * This method is used to search for principals matching a set of + * properties. + * + * This search is specifically used by RFC3744's principal-property-search + * REPORT. You should at least allow searching on + * http://sabredav.org/ns}email-address. + * + * The actual search should be a unicode-non-case-sensitive search. The + * keys in searchProperties are the WebDAV property names, while the values + * are the property values to search on. + * + * If multiple properties are being searched on, the search should be + * AND'ed. + * + * This method should simply return an array with full principal uri's. + * + * If somebody attempted to search on a property the backend does not + * support, you should simply return 0 results. + * + * You can also just return 0 results if you choose to not support + * searching at all, but keep in mind that this may stop certain features + * from working. + * + * @param string $prefixPath + * @param array $searchProperties + * @return array + */ + public function searchPrincipals($prefixPath, array $searchProperties) { + + $query = 'SELECT uri FROM ' . $this->tableName . ' WHERE 1=1 '; + $values = array(); + foreach($searchProperties as $property => $value) { + + switch($property) { + + case '{DAV:}displayname' : + $query.=' AND displayname LIKE ?'; + $values[] = '%' . $value . '%'; + break; + case '{http://sabredav.org/ns}email-address' : + $query.=' AND email LIKE ?'; + $values[] = '%' . $value . '%'; + break; + default : + // Unsupported property + return array(); + + } + + } + $stmt = $this->pdo->prepare($query); + $stmt->execute($values); + + $principals = array(); + while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { + + // Checking if the principal is in the prefix + list($rowPrefix) = DAV\URLUtil::splitPath($row['uri']); + if ($rowPrefix !== $prefixPath) continue; + + $principals[] = $row['uri']; + + } + + return $principals; + + } + + /** + * Returns the list of members for a group-principal + * + * @param string $principal + * @return array + */ + public function getGroupMemberSet($principal) { + + $principal = $this->getPrincipalByPath($principal); + if (!$principal) throw new DAV\Exception('Principal not found'); + + $stmt = $this->pdo->prepare('SELECT principals.uri as uri FROM '.$this->groupMembersTableName.' AS groupmembers LEFT JOIN '.$this->tableName.' AS principals ON groupmembers.member_id = principals.id WHERE groupmembers.principal_id = ?'); + $stmt->execute(array($principal['id'])); + + $result = array(); + while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { + $result[] = $row['uri']; + } + return $result; + + } + + /** + * Returns the list of groups a principal is a member of + * + * @param string $principal + * @return array + */ + public function getGroupMembership($principal) { + + $principal = $this->getPrincipalByPath($principal); + if (!$principal) throw new DAV\Exception('Principal not found'); + + $stmt = $this->pdo->prepare('SELECT principals.uri as uri FROM '.$this->groupMembersTableName.' AS groupmembers LEFT JOIN '.$this->tableName.' AS principals ON groupmembers.principal_id = principals.id WHERE groupmembers.member_id = ?'); + $stmt->execute(array($principal['id'])); + + $result = array(); + while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { + $result[] = $row['uri']; + } + return $result; + + } + + /** + * Updates the list of group members for a group principal. + * + * The principals should be passed as a list of uri's. + * + * @param string $principal + * @param array $members + * @return void + */ + public function setGroupMemberSet($principal, array $members) { + + // Grabbing the list of principal id's. + $stmt = $this->pdo->prepare('SELECT id, uri FROM '.$this->tableName.' WHERE uri IN (? ' . str_repeat(', ? ', count($members)) . ');'); + $stmt->execute(array_merge(array($principal), $members)); + + $memberIds = array(); + $principalId = null; + + while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { + if ($row['uri'] == $principal) { + $principalId = $row['id']; + } else { + $memberIds[] = $row['id']; + } + } + if (!$principalId) throw new DAV\Exception('Principal not found'); + + // Wiping out old members + $stmt = $this->pdo->prepare('DELETE FROM '.$this->groupMembersTableName.' WHERE principal_id = ?;'); + $stmt->execute(array($principalId)); + + foreach($memberIds as $memberId) { + + $stmt = $this->pdo->prepare('INSERT INTO '.$this->groupMembersTableName.' (principal_id, member_id) VALUES (?, ?);'); + $stmt->execute(array($principalId, $memberId)); + + } + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalCollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalCollection.php new file mode 100755 index 00000000..aa8cdd89 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalCollection.php @@ -0,0 +1,33 @@ +principalBackend, $principal); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/Acl.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/Acl.php new file mode 100755 index 00000000..8284fd37 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/Acl.php @@ -0,0 +1,211 @@ +privileges = $privileges; + $this->prefixBaseUrl = $prefixBaseUrl; + + } + + /** + * Returns the list of privileges for this property + * + * @return array + */ + public function getPrivileges() { + + return $this->privileges; + + } + + /** + * Serializes the property into a DOMElement + * + * @param DAV\Server $server + * @param \DOMElement $node + * @return void + */ + public function serialize(DAV\Server $server,\DOMElement $node) { + + $doc = $node->ownerDocument; + foreach($this->privileges as $ace) { + + $this->serializeAce($doc, $node, $ace, $server); + + } + + } + + /** + * Unserializes the {DAV:}acl xml element. + * + * @param \DOMElement $dom + * @return Acl + */ + static public function unserialize(\DOMElement $dom) { + + $privileges = array(); + $xaces = $dom->getElementsByTagNameNS('urn:DAV','ace'); + for($ii=0; $ii < $xaces->length; $ii++) { + + $xace = $xaces->item($ii); + $principal = $xace->getElementsByTagNameNS('urn:DAV','principal'); + if ($principal->length !== 1) { + throw new DAV\Exception\BadRequest('Each {DAV:}ace element must have one {DAV:}principal element'); + } + $principal = Principal::unserialize($principal->item(0)); + + switch($principal->getType()) { + case Principal::HREF : + $principal = $principal->getHref(); + break; + case Principal::AUTHENTICATED : + $principal = '{DAV:}authenticated'; + break; + case Principal::UNAUTHENTICATED : + $principal = '{DAV:}unauthenticated'; + break; + case Principal::ALL : + $principal = '{DAV:}all'; + break; + + } + + $protected = false; + + if ($xace->getElementsByTagNameNS('urn:DAV','protected')->length > 0) { + $protected = true; + } + + $grants = $xace->getElementsByTagNameNS('urn:DAV','grant'); + if ($grants->length < 1) { + throw new DAV\Exception\NotImplemented('Every {DAV:}ace element must have a {DAV:}grant element. {DAV:}deny is not yet supported'); + } + $grant = $grants->item(0); + + $xprivs = $grant->getElementsByTagNameNS('urn:DAV','privilege'); + for($jj=0; $jj<$xprivs->length; $jj++) { + + $xpriv = $xprivs->item($jj); + + $privilegeName = null; + + for ($kk=0;$kk<$xpriv->childNodes->length;$kk++) { + + $childNode = $xpriv->childNodes->item($kk); + if ($t = DAV\XMLUtil::toClarkNotation($childNode)) { + $privilegeName = $t; + break; + } + } + if (is_null($privilegeName)) { + throw new DAV\Exception\BadRequest('{DAV:}privilege elements must have a privilege element contained within them.'); + } + + $privileges[] = array( + 'principal' => $principal, + 'protected' => $protected, + 'privilege' => $privilegeName, + ); + + } + + } + + return new self($privileges); + + } + + /** + * Serializes a single access control entry. + * + * @param \DOMDocument $doc + * @param \DOMElement $node + * @param array $ace + * @param DAV\Server $server + * @return void + */ + private function serializeAce($doc,$node,$ace, DAV\Server $server) { + + $xace = $doc->createElementNS('DAV:','d:ace'); + $node->appendChild($xace); + + $principal = $doc->createElementNS('DAV:','d:principal'); + $xace->appendChild($principal); + switch($ace['principal']) { + case '{DAV:}authenticated' : + $principal->appendChild($doc->createElementNS('DAV:','d:authenticated')); + break; + case '{DAV:}unauthenticated' : + $principal->appendChild($doc->createElementNS('DAV:','d:unauthenticated')); + break; + case '{DAV:}all' : + $principal->appendChild($doc->createElementNS('DAV:','d:all')); + break; + default: + $principal->appendChild($doc->createElementNS('DAV:','d:href',($this->prefixBaseUrl?$server->getBaseUri():'') . $ace['principal'] . '/')); + } + + $grant = $doc->createElementNS('DAV:','d:grant'); + $xace->appendChild($grant); + + $privParts = null; + + preg_match('/^{([^}]*)}(.*)$/',$ace['privilege'],$privParts); + + $xprivilege = $doc->createElementNS('DAV:','d:privilege'); + $grant->appendChild($xprivilege); + + $xprivilege->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2])); + + if (isset($ace['protected']) && $ace['protected']) + $xace->appendChild($doc->createElement('d:protected')); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/AclRestrictions.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/AclRestrictions.php new file mode 100755 index 00000000..f512424b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/AclRestrictions.php @@ -0,0 +1,34 @@ +ownerDocument; + + $elem->appendChild($doc->createElementNS('DAV:','d:grant-only')); + $elem->appendChild($doc->createElementNS('DAV:','d:no-invert')); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/CurrentUserPrivilegeSet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/CurrentUserPrivilegeSet.php new file mode 100755 index 00000000..42307930 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/CurrentUserPrivilegeSet.php @@ -0,0 +1,124 @@ +privileges = $privileges; + + } + + /** + * Serializes the property in the DOM + * + * @param DAV\Server $server + * @param \DOMElement $node + * @return void + */ + public function serialize(DAV\Server $server,\DOMElement $node) { + + $doc = $node->ownerDocument; + foreach($this->privileges as $privName) { + + $this->serializePriv($doc,$node,$privName); + + } + + } + + /** + * Returns true or false, whether the specified principal appears in the + * list. + * + * @return bool + */ + public function has($privilegeName) { + + return in_array($privilegeName, $this->privileges); + + } + + /** + * Serializes one privilege + * + * @param \DOMDocument $doc + * @param \DOMElement $node + * @param string $privName + * @return void + */ + protected function serializePriv($doc,$node,$privName) { + + $xp = $doc->createElementNS('DAV:','d:privilege'); + $node->appendChild($xp); + + $privParts = null; + preg_match('/^{([^}]*)}(.*)$/',$privName,$privParts); + + $xp->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2])); + + } + + /** + * Unserializes the {DAV:}current-user-privilege-set element. + * + * @param DOMElement $node + * @return CurrentUserPrivilegeSet + */ + static public function unserialize(\DOMElement $node) { + + $result = array(); + + $xprivs = $node->getElementsByTagNameNS('urn:DAV','privilege'); + + for($jj=0; $jj<$xprivs->length; $jj++) { + + $xpriv = $xprivs->item($jj); + + $privilegeName = null; + + for ($kk=0;$kk<$xpriv->childNodes->length;$kk++) { + + $childNode = $xpriv->childNodes->item($kk); + if ($t = DAV\XMLUtil::toClarkNotation($childNode)) { + $privilegeName = $t; + break; + } + } + + $result[] = $privilegeName; + + } + + return new self($result); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/Principal.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/Principal.php new file mode 100755 index 00000000..c6f813f1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/Principal.php @@ -0,0 +1,161 @@ +type = $type; + + if ($type===self::HREF && is_null($href)) { + throw new DAV\Exception('The href argument must be specified for the HREF principal type.'); + } + $this->href = $href; + + } + + /** + * Returns the principal type + * + * @return int + */ + public function getType() { + + return $this->type; + + } + + /** + * Returns the principal uri. + * + * @return string + */ + public function getHref() { + + return $this->href; + + } + + /** + * Serializes the property into a DOMElement. + * + * @param DAV\Server $server + * @param \DOMElement $node + * @return void + */ + public function serialize(DAV\Server $server, \DOMElement $node) { + + $prefix = $server->xmlNamespaces['DAV:']; + switch($this->type) { + + case self::UNAUTHENTICATED : + $node->appendChild( + $node->ownerDocument->createElement($prefix . ':unauthenticated') + ); + break; + case self::AUTHENTICATED : + $node->appendChild( + $node->ownerDocument->createElement($prefix . ':authenticated') + ); + break; + case self::HREF : + $href = $node->ownerDocument->createElement($prefix . ':href'); + $href->nodeValue = $server->getBaseUri() . DAV\URLUtil::encodePath($this->href); + $node->appendChild($href); + break; + + } + + } + + /** + * Deserializes a DOM element into a property object. + * + * @param \DOMElement $dom + * @return Principal + */ + static public function unserialize(\DOMElement $dom) { + + $parent = $dom->firstChild; + while(!DAV\XMLUtil::toClarkNotation($parent)) { + $parent = $parent->nextSibling; + } + + switch(DAV\XMLUtil::toClarkNotation($parent)) { + + case '{DAV:}unauthenticated' : + return new self(self::UNAUTHENTICATED); + case '{DAV:}authenticated' : + return new self(self::AUTHENTICATED); + case '{DAV:}href': + return new self(self::HREF, $parent->textContent); + case '{DAV:}all': + return new self(self::ALL); + default : + throw new DAV\Exception\BadRequest('Unexpected element (' . DAV\XMLUtil::toClarkNotation($parent) . '). Could not deserialize'); + + } + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/SupportedPrivilegeSet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/SupportedPrivilegeSet.php new file mode 100755 index 00000000..2f3e507f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/SupportedPrivilegeSet.php @@ -0,0 +1,94 @@ +privileges = $privileges; + + } + + /** + * Serializes the property into a domdocument. + * + * @param DAV\Server $server + * @param \DOMElement $node + * @return void + */ + public function serialize(DAV\Server $server,\DOMElement $node) { + + $doc = $node->ownerDocument; + $this->serializePriv($doc, $node, $this->privileges); + + } + + /** + * Serializes a property + * + * This is a recursive function. + * + * @param \DOMDocument $doc + * @param \DOMElement $node + * @param array $privilege + * @return void + */ + private function serializePriv($doc,$node,$privilege) { + + $xsp = $doc->createElementNS('DAV:','d:supported-privilege'); + $node->appendChild($xsp); + + $xp = $doc->createElementNS('DAV:','d:privilege'); + $xsp->appendChild($xp); + + $privParts = null; + preg_match('/^{([^}]*)}(.*)$/',$privilege['privilege'],$privParts); + + $xp->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2])); + + if (isset($privilege['abstract']) && $privilege['abstract']) { + $xsp->appendChild($doc->createElementNS('DAV:','d:abstract')); + } + + if (isset($privilege['description'])) { + $xsp->appendChild($doc->createElementNS('DAV:','d:description',$privilege['description'])); + } + + if (isset($privilege['aggregates'])) { + foreach($privilege['aggregates'] as $subPrivilege) { + $this->serializePriv($doc,$xsp,$subPrivilege); + } + } + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Version.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Version.php new file mode 100755 index 00000000..722ab490 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Version.php @@ -0,0 +1,24 @@ +httpRequest->getHeader('Authorization'); + $authHeader = explode(' ',$authHeader); + + if ($authHeader[0]!='AWS' || !isset($authHeader[1])) { + $this->errorCode = self::ERR_NOAWSHEADER; + return false; + } + + list($this->accessKey,$this->signature) = explode(':',$authHeader[1]); + + return true; + + } + + /** + * Returns the username for the request + * + * @return string + */ + public function getAccessKey() { + + return $this->accessKey; + + } + + /** + * Validates the signature based on the secretKey + * + * @param string $secretKey + * @return bool + */ + public function validate($secretKey) { + + $contentMD5 = $this->httpRequest->getHeader('Content-MD5'); + + if ($contentMD5) { + // We need to validate the integrity of the request + $body = $this->httpRequest->getBody(true); + $this->httpRequest->setBody($body,true); + + if ($contentMD5!=base64_encode(md5($body,true))) { + // content-md5 header did not match md5 signature of body + $this->errorCode = self::ERR_MD5CHECKSUMWRONG; + return false; + } + + } + + if (!$requestDate = $this->httpRequest->getHeader('x-amz-date')) + $requestDate = $this->httpRequest->getHeader('Date'); + + if (!$this->validateRFC2616Date($requestDate)) + return false; + + $amzHeaders = $this->getAmzHeaders(); + + $signature = base64_encode( + $this->hmacsha1($secretKey, + $this->httpRequest->getMethod() . "\n" . + $contentMD5 . "\n" . + $this->httpRequest->getHeader('Content-type') . "\n" . + $requestDate . "\n" . + $amzHeaders . + $this->httpRequest->getURI() + ) + ); + + if ($this->signature != $signature) { + + $this->errorCode = self::ERR_INVALIDSIGNATURE; + return false; + + } + + return true; + + } + + + /** + * Returns an HTTP 401 header, forcing login + * + * This should be called when username and password are incorrect, or not supplied at all + * + * @return void + */ + public function requireLogin() { + + $this->httpResponse->setHeader('WWW-Authenticate','AWS'); + $this->httpResponse->sendStatus(401); + + } + + /** + * Makes sure the supplied value is a valid RFC2616 date. + * + * If we would just use strtotime to get a valid timestamp, we have no way of checking if a + * user just supplied the word 'now' for the date header. + * + * This function also makes sure the Date header is within 15 minutes of the operating + * system date, to prevent replay attacks. + * + * @param string $dateHeader + * @return bool + */ + protected function validateRFC2616Date($dateHeader) { + + $date = Util::parseHTTPDate($dateHeader); + + // Unknown format + if (!$date) { + $this->errorCode = self::ERR_INVALIDDATEFORMAT; + return false; + } + + $min = new \DateTime('-15 minutes'); + $max = new \DateTime('+15 minutes'); + + // We allow 15 minutes around the current date/time + if ($date > $max || $date < $min) { + $this->errorCode = self::ERR_REQUESTTIMESKEWED; + return false; + } + + return $date; + + } + + /** + * Returns a list of AMZ headers + * + * @return string + */ + protected function getAmzHeaders() { + + $amzHeaders = array(); + $headers = $this->httpRequest->getHeaders(); + foreach($headers as $headerName => $headerValue) { + if (strpos(strtolower($headerName),'x-amz-')===0) { + $amzHeaders[strtolower($headerName)] = str_replace(array("\r\n"),array(' '),$headerValue) . "\n"; + } + } + ksort($amzHeaders); + + $headerStr = ''; + foreach($amzHeaders as $h=>$v) { + $headerStr.=$h.':'.$v; + } + + return $headerStr; + + } + + /** + * Generates an HMAC-SHA1 signature + * + * @param string $key + * @param string $message + * @return string + */ + private function hmacsha1($key, $message) { + + $blocksize=64; + if (strlen($key)>$blocksize) + $key=pack('H*', sha1($key)); + $key=str_pad($key,$blocksize,chr(0x00)); + $ipad=str_repeat(chr(0x36),$blocksize); + $opad=str_repeat(chr(0x5c),$blocksize); + $hmac = pack('H*',sha1(($key^$opad).pack('H*',sha1(($key^$ipad).$message)))); + return $hmac; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/AbstractAuth.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/AbstractAuth.php new file mode 100755 index 00000000..0db29830 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/AbstractAuth.php @@ -0,0 +1,111 @@ +httpResponse = new Response(); + $this->httpRequest = new Request(); + + } + + /** + * Sets an alternative HTTP response object + * + * @param Response $response + * @return void + */ + public function setHTTPResponse(Response $response) { + + $this->httpResponse = $response; + + } + + /** + * Sets an alternative HTTP request object + * + * @param Request $request + * @return void + */ + public function setHTTPRequest(Request $request) { + + $this->httpRequest = $request; + + } + + + /** + * Sets the realm + * + * The realm is often displayed in authentication dialog boxes + * Commonly an application name displayed here + * + * @param string $realm + * @return void + */ + public function setRealm($realm) { + + $this->realm = $realm; + + } + + /** + * Returns the realm + * + * @return string + */ + public function getRealm() { + + return $this->realm; + + } + + /** + * Returns an HTTP 401 header, forcing login + * + * This should be called when username and password are incorrect, or not supplied at all + * + * @return void + */ + abstract public function requireLogin(); + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/BasicAuth.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/BasicAuth.php new file mode 100755 index 00000000..bcb087ed --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/BasicAuth.php @@ -0,0 +1,67 @@ +httpRequest->getRawServerValue('PHP_AUTH_USER')) && ($pass = $this->httpRequest->getRawServerValue('PHP_AUTH_PW'))) { + + return array($user,$pass); + + } + + // Most other webservers + $auth = $this->httpRequest->getHeader('Authorization'); + + // Apache could prefix environment variables with REDIRECT_ when urls + // are passed through mod_rewrite + if (!$auth) { + $auth = $this->httpRequest->getRawServerValue('REDIRECT_HTTP_AUTHORIZATION'); + } + + if (!$auth) return false; + + if (strpos(strtolower($auth),'basic')!==0) return false; + + return explode(':', base64_decode(substr($auth, 6)),2); + + } + + /** + * Returns an HTTP 401 header, forcing login + * + * This should be called when username and password are incorrect, or not supplied at all + * + * @return void + */ + public function requireLogin() { + + $this->httpResponse->setHeader('WWW-Authenticate','Basic realm="' . $this->realm . '"'); + $this->httpResponse->sendStatus(401); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/DigestAuth.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/DigestAuth.php new file mode 100755 index 00000000..62310f7c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/DigestAuth.php @@ -0,0 +1,240 @@ +nonce = uniqid(); + $this->opaque = md5($this->realm); + parent::__construct(); + + } + + /** + * Gathers all information from the headers + * + * This method needs to be called prior to anything else. + * + * @return void + */ + public function init() { + + $digest = $this->getDigest(); + $this->digestParts = $this->parseDigest($digest); + + } + + /** + * Sets the quality of protection value. + * + * Possible values are: + * SabreForRainLoop\HTTP\DigestAuth::QOP_AUTH + * SabreForRainLoop\HTTP\DigestAuth::QOP_AUTHINT + * + * Multiple values can be specified using logical OR. + * + * QOP_AUTHINT ensures integrity of the request body, but this is not + * supported by most HTTP clients. QOP_AUTHINT also requires the entire + * request body to be md5'ed, which can put strains on CPU and memory. + * + * @param int $qop + * @return void + */ + public function setQOP($qop) { + + $this->qop = $qop; + + } + + /** + * Validates the user. + * + * The A1 parameter should be md5($username . ':' . $realm . ':' . $password); + * + * @param string $A1 + * @return bool + */ + public function validateA1($A1) { + + $this->A1 = $A1; + return $this->validate(); + + } + + /** + * Validates authentication through a password. The actual password must be provided here. + * It is strongly recommended not store the password in plain-text and use validateA1 instead. + * + * @param string $password + * @return bool + */ + public function validatePassword($password) { + + $this->A1 = md5($this->digestParts['username'] . ':' . $this->realm . ':' . $password); + return $this->validate(); + + } + + /** + * Returns the username for the request + * + * @return string + */ + public function getUsername() { + + return $this->digestParts['username']; + + } + + /** + * Validates the digest challenge + * + * @return bool + */ + protected function validate() { + + $A2 = $this->httpRequest->getMethod() . ':' . $this->digestParts['uri']; + + if ($this->digestParts['qop']=='auth-int') { + // Making sure we support this qop value + if (!($this->qop & self::QOP_AUTHINT)) return false; + // We need to add an md5 of the entire request body to the A2 part of the hash + $body = $this->httpRequest->getBody(true); + $this->httpRequest->setBody($body,true); + $A2 .= ':' . md5($body); + } else { + + // We need to make sure we support this qop value + if (!($this->qop & self::QOP_AUTH)) return false; + } + + $A2 = md5($A2); + + $validResponse = md5("{$this->A1}:{$this->digestParts['nonce']}:{$this->digestParts['nc']}:{$this->digestParts['cnonce']}:{$this->digestParts['qop']}:{$A2}"); + + return $this->digestParts['response']==$validResponse; + + + } + + /** + * Returns an HTTP 401 header, forcing login + * + * This should be called when username and password are incorrect, or not supplied at all + * + * @return void + */ + public function requireLogin() { + + $qop = ''; + switch($this->qop) { + case self::QOP_AUTH : $qop = 'auth'; break; + case self::QOP_AUTHINT : $qop = 'auth-int'; break; + case self::QOP_AUTH | self::QOP_AUTHINT : $qop = 'auth,auth-int'; break; + } + + $this->httpResponse->setHeader('WWW-Authenticate','Digest realm="' . $this->realm . '",qop="'.$qop.'",nonce="' . $this->nonce . '",opaque="' . $this->opaque . '"'); + $this->httpResponse->sendStatus(401); + + } + + + /** + * This method returns the full digest string. + * + * It should be compatibile with mod_php format and other webservers. + * + * If the header could not be found, null will be returned + * + * @return mixed + */ + public function getDigest() { + + // mod_php + $digest = $this->httpRequest->getRawServerValue('PHP_AUTH_DIGEST'); + if ($digest) return $digest; + + // most other servers + $digest = $this->httpRequest->getHeader('Authorization'); + + // Apache could prefix environment variables with REDIRECT_ when urls + // are passed through mod_rewrite + if (!$digest) { + $digest = $this->httpRequest->getRawServerValue('REDIRECT_HTTP_AUTHORIZATION'); + } + + if ($digest && strpos(strtolower($digest),'digest')===0) { + return substr($digest,7); + } else { + return null; + } + + } + + + /** + * Parses the different pieces of the digest string into an array. + * + * This method returns false if an incomplete digest was supplied + * + * @param string $digest + * @return mixed + */ + protected function parseDigest($digest) { + + // protect against missing data + $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1); + $data = array(); + + preg_match_all('@(\w+)=(?:(?:")([^"]+)"|([^\s,$]+))@', $digest, $matches, PREG_SET_ORDER); + + foreach ($matches as $m) { + $data[$m[1]] = $m[2] ? $m[2] : $m[3]; + unset($needed_parts[$m[1]]); + } + + return $needed_parts ? false : $data; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Request.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Request.php new file mode 100755 index 00000000..3942af8c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Request.php @@ -0,0 +1,284 @@ +_SERVER = $serverData; + else $this->_SERVER =& $_SERVER; + + if ($postData) $this->_POST = $postData; + else $this->_POST =& $_POST; + + } + + /** + * Returns the value for a specific http header. + * + * This method returns null if the header did not exist. + * + * @param string $name + * @return string + */ + public function getHeader($name) { + + $name = strtoupper(str_replace(array('-'),array('_'),$name)); + if (isset($this->_SERVER['HTTP_' . $name])) { + return $this->_SERVER['HTTP_' . $name]; + } + + // There's a few headers that seem to end up in the top-level + // server array. + switch($name) { + case 'CONTENT_TYPE' : + case 'CONTENT_LENGTH' : + if (isset($this->_SERVER[$name])) { + return $this->_SERVER[$name]; + } + break; + + } + return; + + } + + /** + * Returns all (known) HTTP headers. + * + * All headers are converted to lower-case, and additionally all underscores + * are automatically converted to dashes + * + * @return array + */ + public function getHeaders() { + + $hdrs = array(); + foreach($this->_SERVER as $key=>$value) { + + switch($key) { + case 'CONTENT_LENGTH' : + case 'CONTENT_TYPE' : + $hdrs[strtolower(str_replace('_','-',$key))] = $value; + break; + default : + if (strpos($key,'HTTP_')===0) { + $hdrs[substr(strtolower(str_replace('_','-',$key)),5)] = $value; + } + break; + } + + } + + return $hdrs; + + } + + /** + * Returns the HTTP request method + * + * This is for example POST or GET + * + * @return string + */ + public function getMethod() { + + return $this->_SERVER['REQUEST_METHOD']; + + } + + /** + * Returns the requested uri + * + * @return string + */ + public function getUri() { + + return $this->_SERVER['REQUEST_URI']; + + } + + /** + * Will return protocol + the hostname + the uri + * + * @return string + */ + public function getAbsoluteUri() { + + // Checking if the request was made through HTTPS. The last in line is for IIS + $protocol = isset($this->_SERVER['HTTPS']) && ($this->_SERVER['HTTPS']) && ($this->_SERVER['HTTPS']!='off'); + return ($protocol?'https':'http') . '://' . $this->getHeader('Host') . $this->getUri(); + + } + + /** + * Returns everything after the ? from the current url + * + * @return string + */ + public function getQueryString() { + + return isset($this->_SERVER['QUERY_STRING'])?$this->_SERVER['QUERY_STRING']:''; + + } + + /** + * Returns the HTTP request body body + * + * This method returns a readable stream resource. + * If the asString parameter is set to true, a string is sent instead. + * + * @param bool $asString + * @return resource + */ + public function getBody($asString = false) { + + if (is_null($this->body)) { + if (!is_null(self::$defaultInputStream)) { + $this->body = self::$defaultInputStream; + } else { + $this->body = fopen('php://input','r'); + self::$defaultInputStream = $this->body; + } + } + if ($asString) { + $body = stream_get_contents($this->body); + return $body; + } else { + return $this->body; + } + + } + + /** + * Sets the contents of the HTTP request body + * + * This method can either accept a string, or a readable stream resource. + * + * If the setAsDefaultInputStream is set to true, it means for this run of the + * script the supplied body will be used instead of php://input. + * + * @param mixed $body + * @param bool $setAsDefaultInputStream + * @return void + */ + public function setBody($body,$setAsDefaultInputStream = false) { + + if(is_resource($body)) { + $this->body = $body; + } else { + + $stream = fopen('php://temp','r+'); + fputs($stream,$body); + rewind($stream); + // String is assumed + $this->body = $stream; + } + if ($setAsDefaultInputStream) { + self::$defaultInputStream = $this->body; + } + + } + + /** + * Returns PHP's _POST variable. + * + * The reason this is in a method is so it can be subclassed and + * overridden. + * + * @return array + */ + public function getPostVars() { + + return $this->_POST; + + } + + /** + * Returns a specific item from the _SERVER array. + * + * Do not rely on this feature, it is for internal use only. + * + * @param string $field + * @return string + */ + public function getRawServerValue($field) { + + return isset($this->_SERVER[$field])?$this->_SERVER[$field]:null; + + } + + /** + * Returns the HTTP version specified within the request. + * + * @return string + */ + public function getHTTPVersion() { + + $protocol = $this->getRawServerValue('SERVER_PROTOCOL'); + if ($protocol==='HTTP/1.0') { + return '1.0'; + } else { + return '1.1'; + } + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Response.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Response.php new file mode 100755 index 00000000..cb4b9dab --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Response.php @@ -0,0 +1,175 @@ + 'Continue', + 101 => 'Switching Protocols', + 102 => 'Processing', + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authorative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + 207 => 'Multi-Status', // RFC 4918 + 208 => 'Already Reported', // RFC 5842 + 226 => 'IM Used', // RFC 3229 + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 306 => 'Reserved', + 307 => 'Temporary Redirect', + 400 => 'Bad request', + 401 => 'Unauthorized', + 402 => 'Payment Required', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Timeout', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition failed', + 413 => 'Request Entity Too Large', + 414 => 'Request-URI Too Long', + 415 => 'Unsupported Media Type', + 416 => 'Requested Range Not Satisfiable', + 417 => 'Expectation Failed', + 418 => 'I\'m a teapot', // RFC 2324 + 422 => 'Unprocessable Entity', // RFC 4918 + 423 => 'Locked', // RFC 4918 + 424 => 'Failed Dependency', // RFC 4918 + 426 => 'Upgrade required', + 428 => 'Precondition required', // draft-nottingham-http-new-status + 429 => 'Too Many Requests', // draft-nottingham-http-new-status + 431 => 'Request Header Fields Too Large', // draft-nottingham-http-new-status + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Timeout', + 505 => 'HTTP Version not supported', + 506 => 'Variant Also Negotiates', + 507 => 'Insufficient Storage', // RFC 4918 + 508 => 'Loop Detected', // RFC 5842 + 509 => 'Bandwidth Limit Exceeded', // non-standard + 510 => 'Not extended', + 511 => 'Network Authentication Required', // draft-nottingham-http-new-status + ); + + return 'HTTP/' . $httpVersion . ' ' . $code . ' ' . $msg[$code]; + + } + + // @codeCoverageIgnoreStart + // We cannot reasonably test header() related methods. + + /** + * Sends an HTTP status header to the client. + * + * @param int $code HTTP status code + * @return bool + */ + public function sendStatus($code) { + + if (!headers_sent()) + return header($this->getStatusMessage($code, $this->defaultHttpVersion)); + else return false; + + } + + /** + * Sets an HTTP header for the response + * + * @param string $name + * @param string $value + * @param bool $replace + * @return bool + */ + public function setHeader($name, $value, $replace = true) { + + $value = str_replace(array("\r","\n"),array('\r','\n'),$value); + if (!headers_sent()) + return header($name . ': ' . $value, $replace); + else return false; + + + } + // @codeCoverageIgnoreEnd + + /** + * Sets a bunch of HTTP Headers + * + * headersnames are specified as keys, value in the array value + * + * @param array $headers + * @return void + */ + public function setHeaders(array $headers) { + + foreach($headers as $key=>$value) + $this->setHeader($key, $value); + + } + + /** + * Sends the entire response body + * + * This method can accept either an open filestream, or a string. + * + * @param mixed $body + * @return void + */ + public function sendBody($body) { + + if (is_resource($body)) { + + fpassthru($body); + + } else { + + // We assume a string + echo $body; + + } + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Util.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Util.php new file mode 100755 index 00000000..e308618a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Util.php @@ -0,0 +1,82 @@ += 0) + return new \DateTime('@' . $realDate, new \DateTimeZone('UTC')); + + } + + /** + * Transforms a DateTime object to HTTP's most common date format. + * + * We're serializing it as the RFC 1123 date, which, for HTTP must be + * specified as GMT. + * + * @param \DateTime $dateTime + * @return string + */ + static function toHTTPDate(\DateTime $dateTime) { + + // We need to clone it, as we don't want to affect the existing + // DateTime. + $dateTime = clone $dateTime; + $dateTime->setTimeZone(new \DateTimeZone('GMT')); + return $dateTime->format('D, d M Y H:i:s \G\M\T'); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Version.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Version.php new file mode 100755 index 00000000..c14bd03f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Version.php @@ -0,0 +1,24 @@ +stderr) { + $this->stderr = STDERR; + } + if (!$this->stdout) { + $this->stdout = STDOUT; + } + if (!$this->stdin) { + $this->stdin = STDIN; + } + + // @codeCoverageIgnoreEnd + + + try { + + list($options, $positional) = $this->parseArguments($argv); + + if (isset($options['q'])) { + $this->quiet = true; + } + $this->log($this->colorize('green', "sabre-vobject ") . $this->colorize('yellow', Version::VERSION)); + + foreach($options as $name=>$value) { + + switch($name) { + + case 'q' : + // Already handled earlier. + break; + case 'h' : + case 'help' : + $this->showHelp(); + return 0; + break; + case 'format' : + switch($value) { + + // jcard/jcal documents + case 'jcard' : + case 'jcal' : + + // specific document versions + case 'vcard21' : + case 'vcard30' : + case 'vcard40' : + case 'icalendar20' : + + // specific formats + case 'json' : + case 'mimedir' : + + // icalendar/vcad + case 'icalendar' : + case 'vcard' : + $this->format = $value; + break; + + default : + throw new InvalidArgumentException('Unknown format: ' . $value); + + } + break; + case 'pretty' : + if (version_compare(PHP_VERSION, '5.4.0') >= 0) { + $this->pretty = true; + } + break; + case 'forgiving' : + $this->forgiving = true; + break; + case 'inputformat' : + switch($value) { + // json formats + case 'jcard' : + case 'jcal' : + case 'json' : + $this->inputFormat = 'json'; + break; + + // mimedir formats + case 'mimedir' : + case 'icalendar' : + case 'vcard' : + case 'vcard21' : + case 'vcard30' : + case 'vcard40' : + case 'icalendar20' : + + $this->inputFormat = 'mimedir'; + break; + + default : + throw new InvalidArgumentException('Unknown format: ' . $value); + + } + break; + default : + throw new InvalidArgumentException('Unknown option: ' . $name); + + } + + } + + if (count($positional) === 0) { + $this->showHelp(); + return 1; + } + + if (count($positional) === 1) { + throw new InvalidArgumentException('Inputfile is a required argument'); + } + + if (count($positional) > 3) { + throw new InvalidArgumentException('Too many arguments'); + } + + if (!in_array($positional[0], array('validate','repair','convert','color'))) { + throw new InvalidArgumentException('Uknown command: ' . $positional[0]); + } + + } catch (InvalidArgumentException $e) { + $this->showHelp(); + $this->log('Error: ' . $e->getMessage(),'red'); + return 1; + } + + $command = $positional[0]; + + $this->inputPath = $positional[1]; + $this->outputPath = isset($positional[2])?$positional[2]:'-'; + + if ($this->outputPath !== '-') { + $this->stdout = fopen($this->outputPath,'w'); + } + + if (!$this->inputFormat) { + if (substr($this->inputPath,-5)==='.json') { + $this->inputFormat = 'json'; + } else { + $this->inputFormat = 'mimedir'; + } + } + if (!$this->format) { + if (substr($this->outputPath,-5)==='.json') { + $this->format = 'json'; + } else { + $this->format = 'mimedir'; + } + } + + + $realCode = 0; + + try { + + while($input = $this->readInput()) { + + $returnCode = $this->$command($input); + if ($returnCode!==0) $realCode = $returnCode; + + } + + } catch (EofException $e) { + // end of file + } catch (\Exception $e) { + $this->log('Error: ' . $e->getMessage(),'red'); + return 2; + } + + return $realCode; + + } + + /** + * Shows the help message. + * + * @return void + */ + protected function showHelp() { + + $this->log('Usage:', 'yellow'); + $this->log(" vobject [options] command [arguments]"); + $this->log(''); + $this->log('Options:', 'yellow'); + $this->log($this->colorize('green', ' -q ') . "Don't output anything."); + $this->log($this->colorize('green', ' -help -h ') . "Display this help message."); + $this->log($this->colorize('green', ' --format ') . "Convert to a specific format. Must be one of: vcard, vcard21,"); + $this->log($this->colorize('green', ' --forgiving ') . "Makes the parser less strict."); + $this->log(" vcard30, vcard40, icalendar20, jcal, jcard, json, mimedir."); + $this->log($this->colorize('green', ' --inputformat ') . "If the input format cannot be guessed from the extension, it"); + $this->log(" must be specified here."); + // Only PHP 5.4 and up + if (version_compare(PHP_VERSION, '5.4.0') >= 0) { + $this->log($this->colorize('green', ' --pretty ') . "json pretty-print."); + } + $this->log(''); + $this->log('Commands:', 'yellow'); + $this->log($this->colorize('green', ' validate') . ' source_file Validates a file for correctness.'); + $this->log($this->colorize('green', ' repair') . ' source_file [output_file] Repairs a file.'); + $this->log($this->colorize('green', ' convert') . ' source_file [output_file] Converts a file.'); + $this->log($this->colorize('green', ' color') . ' source_file Colorize a file, useful for debbugging.'); + $this->log(<<log('Examples:', 'yellow'); + $this->log(' vobject convert contact.vcf contact.json'); + $this->log(' vobject convert --format=vcard40 old.vcf new.vcf'); + $this->log(' vobject convert --inputformat=json --format=mimedir - -'); + $this->log(' vobject color calendar.ics'); + $this->log(''); + $this->log('https://github.com/fruux/sabre-vobject','purple'); + + } + + /** + * Validates a VObject file + * + * @param Component $vObj + * @return int + */ + protected function validate($vObj) { + + $returnCode = 0; + + switch($vObj->name) { + case 'VCALENDAR' : + $this->log("iCalendar: " . (string)$vObj->VERSION); + break; + case 'VCARD' : + $this->log("vCard: " . (string)$vObj->VERSION); + break; + } + + $warnings = $vObj->validate(); + if (!count($warnings)) { + $this->log(" No warnings!"); + } else { + + $returnCode = 2; + foreach($warnings as $warn) { + + $this->log(" " . $warn['message']); + + } + + } + + return $returnCode; + + } + + /** + * Repairs a VObject file + * + * @param Component $vObj + * @return int + */ + protected function repair($vObj) { + + $returnCode = 0; + + switch($vObj->name) { + case 'VCALENDAR' : + $this->log("iCalendar: " . (string)$vObj->VERSION); + break; + case 'VCARD' : + $this->log("vCard: " . (string)$vObj->VERSION); + break; + } + + $warnings = $vObj->validate(Node::REPAIR); + if (!count($warnings)) { + $this->log(" No warnings!"); + } else { + foreach($warnings as $warn) { + + $returnCode = 2; + $this->log(" " . $warn['message']); + + } + + } + fwrite($this->stdout, $vObj->serialize()); + + return $returnCode; + + } + + /** + * Converts a vObject file to a new format. + * + * @param Component $vObj + * @return int + */ + protected function convert($vObj) { + + $json = false; + $convertVersion = null; + $forceInput = null; + + switch($this->format) { + case 'json' : + $json = true; + if ($vObj->name === 'VCARD') { + $convertVersion = Document::VCARD40; + } + break; + case 'jcard' : + $json = true; + $forceInput = 'VCARD'; + $convertVersion = Document::VCARD40; + break; + case 'jcal' : + $json = true; + $forceInput = 'VCALENDAR'; + break; + case 'mimedir' : + case 'icalendar' : + case 'icalendar20' : + case 'vcard' : + break; + case 'vcard21' : + $convertVersion = Document::VCARD21; + break; + case 'vcard30' : + $convertVersion = Document::VCARD30; + break; + case 'vcard40' : + $convertVersion = Document::VCARD40; + break; + + } + + if ($forceInput && $vObj->name !== $forceInput) { + throw new \Exception('You cannot convert a ' . strtolower($vObj->name) . ' to ' . $this->format); + } + if ($convertVersion) { + $vObj = $vObj->convert($convertVersion); + } + if ($json) { + $jsonOptions = 0; + if ($this->pretty) { + $jsonOptions = JSON_PRETTY_PRINT; + } + fwrite($this->stdout, json_encode($vObj->jsonSerialize(), $jsonOptions)); + } else { + fwrite($this->stdout, $vObj->serialize()); + } + + return 0; + + } + + /** + * Colorizes a file + * + * @param Component $vObj + * @return int + */ + protected function color($vObj) { + + fwrite($this->stdout, $this->serializeComponent($vObj)); + + } + + /** + * Returns an ansi color string for a color name. + * + * @param string $color + * @return string + */ + protected function colorize($color, $str, $resetTo = 'default') { + + $colors = array( + 'cyan' => '1;36', + 'red' => '1;31', + 'yellow' => '1;33', + 'blue' => '0;34', + 'green' => '0;32', + 'default' => '0', + 'purple' => '0;35', + ); + return "\033[" . $colors[$color] . 'm' . $str . "\033[".$colors[$resetTo]."m"; + + } + + /** + * Writes out a string in specific color. + * + * @param string $color + * @param string $str + * @return void + */ + protected function cWrite($color, $str) { + + fwrite($this->stdout, $this->colorize($color, $str)); + + } + + protected function serializeComponent(Component $vObj) { + + $this->cWrite('cyan', 'BEGIN'); + $this->cWrite('red', ':'); + $this->cWrite('yellow', $vObj->name . "\n"); + + /** + * Gives a component a 'score' for sorting purposes. + * + * This is solely used by the childrenSort method. + * + * A higher score means the item will be lower in the list. + * To avoid score collisions, each "score category" has a reasonable + * space to accomodate elements. The $key is added to the $score to + * preserve the original relative order of elements. + * + * @param int $key + * @param array $array + * @return int + */ + $sortScore = function($key, $array) { + + if ($array[$key] instanceof Component) { + + // We want to encode VTIMEZONE first, this is a personal + // preference. + if ($array[$key]->name === 'VTIMEZONE') { + $score=300000000; + return $score+$key; + } else { + $score=400000000; + return $score+$key; + } + } else { + // Properties get encoded first + // VCARD version 4.0 wants the VERSION property to appear first + if ($array[$key] instanceof Property) { + if ($array[$key]->name === 'VERSION') { + $score=100000000; + return $score+$key; + } else { + // All other properties + $score=200000000; + return $score+$key; + } + } + } + + }; + + $tmp = $vObj->children; + uksort($vObj->children, function($a, $b) use ($sortScore, $tmp) { + + $sA = $sortScore($a, $tmp); + $sB = $sortScore($b, $tmp); + + return $sA - $sB; + + }); + + foreach($vObj->children as $child) { + if ($child instanceof Component) { + $this->serializeComponent($child); + } else { + $this->serializeProperty($child); + } + } + + $this->cWrite('cyan', 'END'); + $this->cWrite('red', ':'); + $this->cWrite('yellow', $vObj->name . "\n"); + + } + + /** + * Colorizes a property. + * + * @param Property $property + * @return void + */ + protected function serializeProperty(Property $property) { + + if ($property->group) { + $this->cWrite('default', $property->group); + $this->cWrite('red', '.'); + } + + $str = ''; + $this->cWrite('yellow', $property->name); + + foreach($property->parameters as $param) { + + $this->cWrite('red',';'); + $this->cWrite('blue', $param->serialize()); + + } + $this->cWrite('red',':'); + + if ($property instanceof Property\Binary) { + + $this->cWrite('default', 'embedded binary stripped. (' . strlen($property->getValue()) . ' bytes)'); + + } else { + + $parts = $property->getParts(); + $first1 = true; + // Looping through property values + foreach($parts as $part) { + if ($first1) { + $first1 = false; + } else { + $this->cWrite('red', $property->delimiter); + } + $first2 = true; + // Looping through property sub-values + foreach((array)$part as $subPart) { + if ($first2) { + $first2 = false; + } else { + // The sub-value delimiter is always comma + $this->cWrite('red', ','); + } + + $subPart = strtr($subPart, array( + '\\' => $this->colorize('purple', '\\\\', 'green'), + ';' => $this->colorize('purple', '\;', 'green'), + ',' => $this->colorize('purple', '\,', 'green'), + "\n" => $this->colorize('purple', "\\n\n\t", 'green'), + "\r" => "", + )); + + $this->cWrite('green', $subPart); + } + } + + } + $this->cWrite("default", "\n"); + + } + + /** + * Parses the list of arguments. + * + * @param array $argv + * @return void + */ + protected function parseArguments(array $argv) { + + $positional = array(); + $options = array(); + + for($ii=0; $ii < count($argv); $ii++) { + + // Skipping the first argument. + if ($ii===0) continue; + + $v = $argv[$ii]; + + if (substr($v,0,2)==='--') { + // This is a long-form option. + $optionName = substr($v,2); + $optionValue = true; + if (strpos($optionName,'=')) { + list($optionName, $optionValue) = explode('=', $optionName); + } + $options[$optionName] = $optionValue; + } elseif (substr($v,0,1) === '-' && strlen($v)>1) { + // This is a short-form option. + foreach(str_split(substr($v,1)) as $option) { + $options[$option] = true; + } + + } else { + + $positional[] = $v; + + } + + } + + return array($options, $positional); + + } + + protected $parser; + + /** + * Reads the input file + * + * @return Component + */ + protected function readInput() { + + if (!$this->parser) { + if ($this->inputPath!=='-') { + $this->stdin = fopen($this->inputPath,'r'); + } + + if ($this->inputFormat === 'mimedir') { + $this->parser = new Parser\MimeDir($this->stdin, ($this->forgiving?Reader::OPTION_FORGIVING:0)); + } else { + $this->parser = new Parser\Json($this->stdin, ($this->forgiving?Reader::OPTION_FORGIVING:0)); + } + } + + return $this->parser->parse(); + + } + + /** + * Sends a message to STDERR. + * + * @param string $msg + * @return void + */ + protected function log($msg, $color = 'default') { + + if (!$this->quiet) { + if ($color!=='default') { + $msg = $this->colorize($color, $msg); + } + fwrite($this->stderr, $msg . "\n"); + } + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component.php new file mode 100755 index 00000000..70cf550d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component.php @@ -0,0 +1,473 @@ +value syntax, in which case + * properties will automatically be created, or you can just pass a list of + * Component and Property object. + * + * By default, a set of sensible values will be added to the component. For + * an iCalendar object, this may be something like CALSCALE:GREGORIAN. To + * ensure that this does not happen, set $defaults to false. + * + * @param Document $root + * @param string $name such as VCALENDAR, VEVENT. + * @param array $children + * @param bool $defaults + * @return void + */ + public function __construct(Document $root, $name, array $children = array(), $defaults = true) { + + $this->name = strtoupper($name); + $this->root = $root; + + if ($defaults) { + $children = array_merge($this->getDefaults(), $children); + } + + foreach($children as $k=>$child) { + if ($child instanceof Node) { + + // Component or Property + $this->add($child); + } else { + + // Property key=>value + $this->add($k, $child); + } + } + + } + + /** + * Adds a new property or component, and returns the new item. + * + * This method has 3 possible signatures: + * + * add(Component $comp) // Adds a new component + * add(Property $prop) // Adds a new property + * add($name, $value, array $parameters = array()) // Adds a new property + * add($name, array $children = array()) // Adds a new component + * by name. + * + * @return Node + */ + public function add($a1, $a2 = null, $a3 = null) { + + if ($a1 instanceof Node) { + if (!is_null($a2)) { + throw new \InvalidArgumentException('The second argument must not be specified, when passing a VObject Node'); + } + $a1->parent = $this; + $this->children[] = $a1; + + return $a1; + + } elseif(is_string($a1)) { + + $item = $this->root->create($a1, $a2, $a3); + $item->parent = $this; + $this->children[] = $item; + + return $item; + + } else { + + throw new \InvalidArgumentException('The first argument must either be a \\SabreForRainLoop\\VObject\\Node or a string'); + + } + + } + + /** + * This method removes a component or property from this component. + * + * You can either specify the item by name (like DTSTART), in which case + * all properties/components with that name will be removed, or you can + * pass an instance of a property or component, in which case only that + * exact item will be removed. + * + * The removed item will be returned. In case there were more than 1 items + * removed, only the last one will be returned. + * + * @param mixed $item + * @return void + */ + public function remove($item) { + + if (is_string($item)) { + $children = $this->select($item); + foreach($children as $k=>$child) { + unset($this->children[$k]); + } + return $child; + } else { + foreach($this->children as $k => $child) { + if ($child===$item) { + unset($this->children[$k]); + return $child; + } + } + + throw new \InvalidArgumentException('The item you passed to remove() was not a child of this component'); + + } + + } + + /** + * Returns an iterable list of children + * + * @return array + */ + public function children() { + + return $this->children; + + } + + /** + * This method only returns a list of sub-components. Properties are + * ignored. + * + * @return array + */ + public function getComponents() { + + $result = array(); + foreach($this->children as $child) { + if ($child instanceof Component) { + $result[] = $child; + } + } + + return $result; + + } + + /** + * Returns an array with elements that match the specified name. + * + * This function is also aware of MIME-Directory groups (as they appear in + * vcards). This means that if a property is grouped as "HOME.EMAIL", it + * will also be returned when searching for just "EMAIL". If you want to + * search for a property in a specific group, you can select on the entire + * string ("HOME.EMAIL"). If you want to search on a specific property that + * has not been assigned a group, specify ".EMAIL". + * + * Keys are retained from the 'children' array, which may be confusing in + * certain cases. + * + * @param string $name + * @return array + */ + public function select($name) { + + $group = null; + $name = strtoupper($name); + if (strpos($name,'.')!==false) { + list($group,$name) = explode('.', $name, 2); + } + + $result = array(); + foreach($this->children as $key=>$child) { + + if ( + strtoupper($child->name) === $name && + (is_null($group) || ( $child instanceof Property && strtoupper($child->group) === $group)) + ) { + + $result[$key] = $child; + + } + } + + reset($result); + return $result; + + } + + /** + * Turns the object back into a serialized blob. + * + * @return string + */ + public function serialize() { + + $str = "BEGIN:" . $this->name . "\r\n"; + + /** + * Gives a component a 'score' for sorting purposes. + * + * This is solely used by the childrenSort method. + * + * A higher score means the item will be lower in the list. + * To avoid score collisions, each "score category" has a reasonable + * space to accomodate elements. The $key is added to the $score to + * preserve the original relative order of elements. + * + * @param int $key + * @param array $array + * @return int + */ + $sortScore = function($key, $array) { + + if ($array[$key] instanceof Component) { + + // We want to encode VTIMEZONE first, this is a personal + // preference. + if ($array[$key]->name === 'VTIMEZONE') { + $score=300000000; + return $score+$key; + } else { + $score=400000000; + return $score+$key; + } + } else { + // Properties get encoded first + // VCARD version 4.0 wants the VERSION property to appear first + if ($array[$key] instanceof Property) { + if ($array[$key]->name === 'VERSION') { + $score=100000000; + return $score+$key; + } else { + // All other properties + $score=200000000; + return $score+$key; + } + } + } + + }; + + $tmp = $this->children; + uksort($this->children, function($a, $b) use ($sortScore, $tmp) { + + $sA = $sortScore($a, $tmp); + $sB = $sortScore($b, $tmp); + + return $sA - $sB; + + }); + + foreach($this->children as $child) $str.=$child->serialize(); + $str.= "END:" . $this->name . "\r\n"; + + return $str; + + } + + /** + * This method returns an array, with the representation as it should be + * encoded in json. This is used to create jCard or jCal documents. + * + * @return array + */ + public function jsonSerialize() { + + $components = array(); + $properties = array(); + + foreach($this->children as $child) { + if ($child instanceof Component) { + $components[] = $child->jsonSerialize(); + } else { + $properties[] = $child->jsonSerialize(); + } + } + + return array( + strtolower($this->name), + $properties, + $components + ); + + } + + /** + * This method should return a list of default property values. + * + * @return array + */ + protected function getDefaults() { + + return array(); + + } + + /* Magic property accessors {{{ */ + + /** + * Using 'get' you will either get a property or component. + * + * If there were no child-elements found with the specified name, + * null is returned. + * + * To use this, this may look something like this: + * + * $event = $calendar->VEVENT; + * + * @param string $name + * @return Property + */ + public function __get($name) { + + $matches = $this->select($name); + if (count($matches)===0) { + return null; + } else { + $firstMatch = current($matches); + /** @var $firstMatch Property */ + $firstMatch->setIterator(new ElementList(array_values($matches))); + return $firstMatch; + } + + } + + /** + * This method checks if a sub-element with the specified name exists. + * + * @param string $name + * @return bool + */ + public function __isset($name) { + + $matches = $this->select($name); + return count($matches)>0; + + } + + /** + * Using the setter method you can add properties or subcomponents + * + * You can either pass a Component, Property + * object, or a string to automatically create a Property. + * + * If the item already exists, it will be removed. If you want to add + * a new item with the same name, always use the add() method. + * + * @param string $name + * @param mixed $value + * @return void + */ + public function __set($name, $value) { + + $matches = $this->select($name); + $overWrite = count($matches)?key($matches):null; + + if ($value instanceof Component || $value instanceof Property) { + $value->parent = $this; + if (!is_null($overWrite)) { + $this->children[$overWrite] = $value; + } else { + $this->children[] = $value; + } + } elseif (is_scalar($value) || is_array($value) || is_null($value)) { + $property = $this->root->create($name,$value); + $property->parent = $this; + if (!is_null($overWrite)) { + $this->children[$overWrite] = $property; + } else { + $this->children[] = $property; + } + } else { + throw new \InvalidArgumentException('You must pass a \\SabreForRainLoop\\VObject\\Component, \\SabreForRainLoop\\VObject\\Property or scalar type'); + } + + } + + /** + * Removes all properties and components within this component with the + * specified name. + * + * @param string $name + * @return void + */ + public function __unset($name) { + + $matches = $this->select($name); + foreach($matches as $k=>$child) { + + unset($this->children[$k]); + $child->parent = null; + + } + + } + + /* }}} */ + + /** + * This method is automatically called when the object is cloned. + * Specifically, this will ensure all child elements are also cloned. + * + * @return void + */ + public function __clone() { + + foreach($this->children as $key=>$child) { + $this->children[$key] = clone $child; + $this->children[$key]->parent = $this; + } + + } + + /** + * Validates the node for correctness. + * + * The following options are supported: + * - Node::REPAIR - If something is broken, an automatic repair may + * be attempted. + * + * An array is returned with warnings. + * + * Every item in the array has the following properties: + * * level - (number between 1 and 3 with severity information) + * * message - (human readable message) + * * node - (reference to the offending node) + * + * @param int $options + * @return array + */ + public function validate($options = 0) { + + $result = array(); + foreach($this->children as $child) { + $result = array_merge($result, $child->validate($options)); + } + return $result; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VAlarm.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VAlarm.php new file mode 100755 index 00000000..6951c199 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VAlarm.php @@ -0,0 +1,108 @@ +TRIGGER; + if(!isset($trigger['VALUE']) || strtoupper($trigger['VALUE']) === 'DURATION') { + $triggerDuration = VObject\DateTimeParser::parseDuration($this->TRIGGER); + $related = (isset($trigger['RELATED']) && strtoupper($trigger['RELATED']) == 'END') ? 'END' : 'START'; + + $parentComponent = $this->parent; + if ($related === 'START') { + + if ($parentComponent->name === 'VTODO') { + $propName = 'DUE'; + } else { + $propName = 'DTSTART'; + } + + $effectiveTrigger = clone $parentComponent->$propName->getDateTime(); + $effectiveTrigger->add($triggerDuration); + } else { + if ($parentComponent->name === 'VTODO') { + $endProp = 'DUE'; + } elseif ($parentComponent->name === 'VEVENT') { + $endProp = 'DTEND'; + } else { + throw new \LogicException('time-range filters on VALARM components are only supported when they are a child of VTODO or VEVENT'); + } + + if (isset($parentComponent->$endProp)) { + $effectiveTrigger = clone $parentComponent->$endProp->getDateTime(); + $effectiveTrigger->add($triggerDuration); + } elseif (isset($parentComponent->DURATION)) { + $effectiveTrigger = clone $parentComponent->DTSTART->getDateTime(); + $duration = VObject\DateTimeParser::parseDuration($parentComponent->DURATION); + $effectiveTrigger->add($duration); + $effectiveTrigger->add($triggerDuration); + } else { + $effectiveTrigger = clone $parentComponent->DTSTART->getDateTime(); + $effectiveTrigger->add($triggerDuration); + } + } + } else { + $effectiveTrigger = $trigger->getDateTime(); + } + return $effectiveTrigger; + + } + + /** + * Returns true or false depending on if the event falls in the specified + * time-range. This is used for filtering purposes. + * + * The rules used to determine if an event falls within the specified + * time-range is based on the CalDAV specification. + * + * @param \DateTime $start + * @param \DateTime $end + * @return bool + */ + public function isInTimeRange(\DateTime $start, \DateTime $end) { + + $effectiveTrigger = $this->getEffectiveTriggerTime(); + + if (isset($this->DURATION)) { + $duration = VObject\DateTimeParser::parseDuration($this->DURATION); + $repeat = (string)$this->repeat; + if (!$repeat) { + $repeat = 1; + } + + $period = new \DatePeriod($effectiveTrigger, $duration, (int)$repeat); + + foreach($period as $occurrence) { + + if ($start <= $occurrence && $end > $occurrence) { + return true; + } + } + return false; + } else { + return ($start <= $effectiveTrigger && $end > $effectiveTrigger); + } + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VCalendar.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VCalendar.php new file mode 100755 index 00000000..ecc6784d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VCalendar.php @@ -0,0 +1,369 @@ + 'SabreForRainLoop\\VObject\\Component\\VEvent', + 'VFREEBUSY' => 'SabreForRainLoop\\VObject\\Component\\VFreeBusy', + 'VJOURNAL' => 'SabreForRainLoop\\VObject\\Component\\VJournal', + 'VTODO' => 'SabreForRainLoop\\VObject\\Component\\VTodo', + 'VALARM' => 'SabreForRainLoop\\VObject\\Component\\VAlarm', + ); + + /** + * List of value-types, and which classes they map to. + * + * @var array + */ + static public $valueMap = array( + 'BINARY' => 'SabreForRainLoop\\VObject\\Property\\Binary', + 'BOOLEAN' => 'SabreForRainLoop\\VObject\\Property\\Boolean', + 'CAL-ADDRESS' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\CalAddress', + 'DATE' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Date', + 'DATE-TIME' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', + 'DURATION' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Duration', + 'FLOAT' => 'SabreForRainLoop\\VObject\\Property\\Float', + 'INTEGER' => 'SabreForRainLoop\\VObject\\Property\\Integer', + 'PERIOD' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Period', + 'RECUR' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Recur', + 'TEXT' => 'SabreForRainLoop\\VObject\\Property\\Text', + 'TIME' => 'SabreForRainLoop\\VObject\\Property\\Time', + 'UNKNOWN' => 'SabreForRainLoop\\VObject\\Property\\Unknown', // jCard / jCal-only. + 'URI' => 'SabreForRainLoop\\VObject\\Property\\Uri', + 'UTC-OFFSET' => 'SabreForRainLoop\\VObject\\Property\\UtcOffset', + ); + + /** + * List of properties, and which classes they map to. + * + * @var array + */ + static public $propertyMap = array( + // Calendar properties + 'CALSCALE' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'METHOD' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'PRODID' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'VERSION' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + + // Component properties + 'ATTACH' => 'SabreForRainLoop\\VObject\\Property\\Binary', + 'CATEGORIES' => 'SabreForRainLoop\\VObject\\Property\\Text', + 'CLASS' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'COMMENT' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'DESCRIPTION' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'GEO' => 'SabreForRainLoop\\VObject\\Property\\Float', + 'LOCATION' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'PERCENT-COMPLETE' => 'SabreForRainLoop\\VObject\\Property\\Integer', + 'PRIORITY' => 'SabreForRainLoop\\VObject\\Property\\Integer', + 'RESOURCES' => 'SabreForRainLoop\\VObject\\Property\\Text', + 'STATUS' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'SUMMARY' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + + // Date and Time Component Properties + 'COMPLETED' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', + 'DTEND' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', + 'DUE' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', + 'DTSTART' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', + 'DURATION' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Duration', + 'FREEBUSY' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Period', + 'TRANSP' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + + // Time Zone Component Properties + 'TZID' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'TZNAME' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'TZOFFSETFROM' => 'SabreForRainLoop\\VObject\\Property\\UtcOffset', + 'TZOFFSETTO' => 'SabreForRainLoop\\VObject\\Property\\UtcOffset', + 'TZURL' => 'SabreForRainLoop\\VObject\\Property\\Uri', + + // Relationship Component Properties + 'ATTENDEE' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\CalAddress', + 'CONTACT' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'ORGANIZER' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\CalAddress', + 'RECURRENCE-ID' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', + 'RELATED-TO' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'URL' => 'SabreForRainLoop\\VObject\\Property\\Uri', + 'UID' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + + // Recurrence Component Properties + 'EXDATE' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', + 'RDATE' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', + 'RRULE' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Recur', + 'EXRULE' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Recur', // Deprecated since rfc5545 + + // Alarm Component Properties + 'ACTION' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'REPEAT' => 'SabreForRainLoop\\VObject\\Property\\Integer', + 'TRIGGER' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Duration', + + // Change Management Component Properties + 'CREATED' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', + 'DTSTAMP' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', + 'LAST-MODIFIED' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', + 'SEQUENCE' => 'SabreForRainLoop\\VObject\\Property\\Integer', + + // Request Status + 'REQUEST-STATUS' => 'SabreForRainLoop\\VObject\\Property\\Text', + + // Additions from draft-daboo-valarm-extensions-04 + 'ALARM-AGENT' => 'SabreForRainLoop\\VObject\\Property\\Text', + 'ACKNOWLEDGED' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', + 'PROXIMITY' => 'SabreForRainLoop\\VObject\\Property\\Text', + 'DEFAULT-ALARM' => 'SabreForRainLoop\\VObject\\Property\\Boolean', + + ); + + /** + * Returns the current document type. + * + * @return void + */ + public function getDocumentType() { + + return self::ICALENDAR20; + + } + + /** + * Returns a list of all 'base components'. For instance, if an Event has + * a recurrence rule, and one instance is overridden, the overridden event + * will have the same UID, but will be excluded from this list. + * + * VTIMEZONE components will always be excluded. + * + * @param string $componentName filter by component name + * @return array + */ + public function getBaseComponents($componentName = null) { + + $components = array(); + foreach($this->children as $component) { + + if (!$component instanceof VObject\Component) + continue; + + if (isset($component->{'RECURRENCE-ID'})) + continue; + + if ($componentName && $component->name !== strtoupper($componentName)) + continue; + + if ($component->name === 'VTIMEZONE') + continue; + + $components[] = $component; + + } + + return $components; + + } + + /** + * If this calendar object, has events with recurrence rules, this method + * can be used to expand the event into multiple sub-events. + * + * Each event will be stripped from it's recurrence information, and only + * the instances of the event in the specified timerange will be left + * alone. + * + * In addition, this method will cause timezone information to be stripped, + * and normalized to UTC. + * + * This method will alter the VCalendar. This cannot be reversed. + * + * This functionality is specifically used by the CalDAV standard. It is + * possible for clients to request expand events, if they are rather simple + * clients and do not have the possibility to calculate recurrences. + * + * @param DateTime $start + * @param DateTime $end + * @return void + */ + public function expand(\DateTime $start, \DateTime $end) { + + $newEvents = array(); + + foreach($this->select('VEVENT') as $key=>$vevent) { + + if (isset($vevent->{'RECURRENCE-ID'})) { + unset($this->children[$key]); + continue; + } + + + if (!$vevent->rrule) { + unset($this->children[$key]); + if ($vevent->isInTimeRange($start, $end)) { + $newEvents[] = $vevent; + } + continue; + } + + $uid = (string)$vevent->uid; + if (!$uid) { + throw new \LogicException('Event did not have a UID!'); + } + + $it = new VObject\RecurrenceIterator($this, $vevent->uid); + $it->fastForward($start); + + while($it->valid() && $it->getDTStart() < $end) { + + if ($it->getDTEnd() > $start) { + + $newEvents[] = $it->getEventObject(); + + } + $it->next(); + + } + unset($this->children[$key]); + + } + + // Setting all properties to UTC time. + foreach($newEvents as $newEvent) { + + foreach($newEvent->children as $child) { + if ($child instanceof VObject\Property\ICalendar\DateTime && $child->hasTime()) { + $dt = $child->getDateTimes(); + // We only need to update the first timezone, because + // setDateTimes will match all other timezones to the + // first. + $dt[0]->setTimeZone(new \DateTimeZone('UTC')); + $child->setDateTimes($dt); + } + + } + + $this->add($newEvent); + + } + + // Removing all VTIMEZONE components + unset($this->VTIMEZONE); + + } + + /** + * This method should return a list of default property values. + * + * @return array + */ + protected function getDefaults() { + + return array( + 'VERSION' => '2.0', + 'PRODID' => '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN', + 'CALSCALE' => 'GREGORIAN', + ); + + } + + /** + * Validates the node for correctness. + * An array is returned with warnings. + * + * Every item in the array has the following properties: + * * level - (number between 1 and 3 with severity information) + * * message - (human readable message) + * * node - (reference to the offending node) + * + * @return array + */ + public function validate($options = 0) { + + $warnings = array(); + + $version = $this->select('VERSION'); + if (count($version)!==1) { + $warnings[] = array( + 'level' => 1, + 'message' => 'The VERSION property must appear in the VCALENDAR component exactly 1 time', + 'node' => $this, + ); + } else { + if ((string)$this->VERSION !== '2.0') { + $warnings[] = array( + 'level' => 1, + 'message' => 'Only iCalendar version 2.0 as defined in rfc5545 is supported.', + 'node' => $this, + ); + } + } + $version = $this->select('PRODID'); + if (count($version)!==1) { + $warnings[] = array( + 'level' => 2, + 'message' => 'The PRODID property must appear in the VCALENDAR component exactly 1 time', + 'node' => $this, + ); + } + if (count($this->CALSCALE) > 1) { + $warnings[] = array( + 'level' => 2, + 'message' => 'The CALSCALE property must not be specified more than once.', + 'node' => $this, + ); + } + if (count($this->METHOD) > 1) { + $warnings[] = array( + 'level' => 2, + 'message' => 'The METHOD property must not be specified more than once.', + 'node' => $this, + ); + } + + $componentsFound = 0; + foreach($this->children as $child) { + if($child instanceof Component) { + $componentsFound++; + } + } + + if ($componentsFound===0) { + $warnings[] = array( + 'level' => 1, + 'message' => 'An iCalendar object must have at least 1 component.', + 'node' => $this, + ); + } + + return array_merge( + $warnings, + parent::validate() + ); + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VCard.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VCard.php new file mode 100755 index 00000000..e44ac3f1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VCard.php @@ -0,0 +1,353 @@ + 'SabreForRainLoop\\VObject\\Property\\Binary', + 'BOOLEAN' => 'SabreForRainLoop\\VObject\\Property\\Boolean', + 'CONTENT-ID' => 'SabreForRainLoop\\VObject\\Property\\FlatText', // vCard 2.1 only + 'DATE' => 'SabreForRainLoop\\VObject\\Property\\VCard\\Date', + 'DATE-TIME' => 'SabreForRainLoop\\VObject\\Property\\VCard\\DateTime', + 'DATE-AND-OR-TIME' => 'SabreForRainLoop\\VObject\\Property\\VCard\\DateAndOrTime', // vCard only + 'FLOAT' => 'SabreForRainLoop\\VObject\\Property\\Float', + 'INTEGER' => 'SabreForRainLoop\\VObject\\Property\\Integer', + 'LANGUAGE-TAG' => 'SabreForRainLoop\\VObject\\Property\\VCard\\LanguageTag', + 'TIMESTAMP' => 'SabreForRainLoop\\VObject\\Property\\VCard\\TimeStamp', + 'TEXT' => 'SabreForRainLoop\\VObject\\Property\\Text', + 'TIME' => 'SabreForRainLoop\\VObject\\Property\\Time', + 'UNKNOWN' => 'SabreForRainLoop\\VObject\\Property\\Unknown', // jCard / jCal-only. + 'URI' => 'SabreForRainLoop\\VObject\\Property\\Uri', + 'URL' => 'SabreForRainLoop\\VObject\\Property\\Uri', // vCard 2.1 only + 'UTC-OFFSET' => 'SabreForRainLoop\\VObject\\Property\\UtcOffset', + ); + + /** + * List of properties, and which classes they map to. + * + * @var array + */ + static public $propertyMap = array( + + // vCard 2.1 properties and up + 'N' => 'SabreForRainLoop\\VObject\\Property\\Text', + 'FN' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'PHOTO' => 'SabreForRainLoop\\VObject\\Property\\Binary', // Todo: we should add a class for Binary values. + 'BDAY' => 'SabreForRainLoop\\VObject\\Property\\VCard\\DateAndOrTime', + 'ADR' => 'SabreForRainLoop\\VObject\\Property\\Text', + 'LABEL' => 'SabreForRainLoop\\VObject\\Property\\FlatText', // Removed in vCard 4.0 + 'TEL' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'EMAIL' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'MAILER' => 'SabreForRainLoop\\VObject\\Property\\FlatText', // Removed in vCard 4.0 + 'GEO' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'TITLE' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'ROLE' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'LOGO' => 'SabreForRainLoop\\VObject\\Property\\Binary', + // 'AGENT' => 'SabreForRainLoop\\VObject\\Property\\', // Todo: is an embedded vCard. Probably rare, so + // not supported at the moment + 'ORG' => 'SabreForRainLoop\\VObject\\Property\\Text', + 'NOTE' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'REV' => 'SabreForRainLoop\\VObject\\Property\\VCard\\TimeStamp', + 'SOUND' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'URL' => 'SabreForRainLoop\\VObject\\Property\\Uri', + 'UID' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'VERSION' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'KEY' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'TZ' => 'SabreForRainLoop\\VObject\\Property\\Text', + + // vCard 3.0 properties + 'CATEGORIES' => 'SabreForRainLoop\\VObject\\Property\\Text', + 'SORT-STRING' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'PRODID' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'NICKNAME' => 'SabreForRainLoop\\VObject\\Property\\Text', + 'CLASS' => 'SabreForRainLoop\\VObject\\Property\\FlatText', // Removed in vCard 4.0 + + // rfc2739 properties + 'FBURL' => 'SabreForRainLoop\\VObject\\Property\\Uri', + 'CAPURI' => 'SabreForRainLoop\\VObject\\Property\\Uri', + 'CALURI' => 'SabreForRainLoop\\VObject\\Property\\Uri', + + // rfc4770 properties + 'IMPP' => 'SabreForRainLoop\\VObject\\Property\\Uri', + + // vCard 4.0 properties + 'XML' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + 'ANNIVERSARY' => 'SabreForRainLoop\\VObject\\Property\\VCard\\DateAndOrTime', + 'CLIENTPIDMAP' => 'SabreForRainLoop\\VObject\\Property\\Text', + 'LANG' => 'SabreForRainLoop\\VObject\\Property\\VCard\\LanguageTag', + 'GENDER' => 'SabreForRainLoop\\VObject\\Property\\Text', + 'KIND' => 'SabreForRainLoop\\VObject\\Property\\FlatText', + + ); + + /** + * Returns the current document type. + * + * @return void + */ + public function getDocumentType() { + + if (!$this->version) { + $version = (string)$this->VERSION; + switch($version) { + case '2.1' : + $this->version = self::VCARD21; + break; + case '3.0' : + $this->version = self::VCARD30; + break; + case '4.0' : + $this->version = self::VCARD40; + break; + default : + $this->version = self::UNKNOWN; + break; + + } + } + + return $this->version; + + } + + /** + * Converts the document to a different vcard version. + * + * Use one of the VCARD constants for the target. This method will return + * a copy of the vcard in the new version. + * + * At the moment the only supported conversion is from 3.0 to 4.0. + * + * If input and output version are identical, a clone is returned. + * + * @param int $target + * @return VCard + */ + public function convert($target) { + + $converter = new VObject\VCardConverter(); + return $converter->convert($this, $target); + + } + + /** + * VCards with version 2.1, 3.0 and 4.0 are found. + * + * If the VCARD doesn't know its version, 2.1 is assumed. + */ + const DEFAULT_VERSION = self::VCARD21; + + + + /** + * Validates the node for correctness. + * + * The following options are supported: + * - Node::REPAIR - If something is broken, and automatic repair may + * be attempted. + * + * An array is returned with warnings. + * + * Every item in the array has the following properties: + * * level - (number between 1 and 3 with severity information) + * * message - (human readable message) + * * node - (reference to the offending node) + * + * @param int $options + * @return array + */ + public function validate($options = 0) { + + $warnings = array(); + + $versionMap = array( + self::VCARD21 => '2.1', + self::VCARD30 => '3.0', + self::VCARD40 => '4.0', + ); + + $version = $this->select('VERSION'); + if (count($version)!==1) { + $warnings[] = array( + 'level' => 1, + 'message' => 'The VERSION property must appear in the VCARD component exactly 1 time', + 'node' => $this, + ); + if ($options & self::REPAIR) { + $this->VERSION = $versionMap[self::DEFAULT_VERSION]; + } + } else { + $version = (string)$this->VERSION; + if ($version!=='2.1' && $version!=='3.0' && $version!=='4.0') { + $warnings[] = array( + 'level' => 1, + 'message' => 'Only vcard version 4.0 (RFC6350), version 3.0 (RFC2426) or version 2.1 (icm-vcard-2.1) are supported.', + 'node' => $this, + ); + if ($options & self::REPAIR) { + $this->VERSION = $versionMap[self::DEFAULT_VERSION]; + } + } + + } + $fn = $this->select('FN'); + if (count($fn)!==1) { + $warnings[] = array( + 'level' => 1, + 'message' => 'The FN property must appear in the VCARD component exactly 1 time', + 'node' => $this, + ); + if (($options & self::REPAIR) && count($fn) === 0) { + // We're going to try to see if we can use the contents of the + // N property. + if (isset($this->N)) { + $value = explode(';', (string)$this->N); + if (isset($value[1]) && $value[1]) { + $this->FN = $value[1] . ' ' . $value[0]; + } else { + $this->FN = $value[0]; + } + + // Otherwise, the ORG property may work + } elseif (isset($this->ORG)) { + $this->FN = (string)$this->ORG; + } + + } + } + + return array_merge( + parent::validate($options), + $warnings + ); + + } + + /** + * Returns a preferred field. + * + * VCards can indicate wether a field such as ADR, TEL or EMAIL is + * preferred by specifying TYPE=PREF (vcard 2.1, 3) or PREF=x (vcard 4, x + * being a number between 1 and 100). + * + * If neither of those parameters are specified, the first is returned, if + * a field with that name does not exist, null is returned. + * + * @param string $fieldName + * @return VObject\Property|null + */ + public function preferred($propertyName) { + + $preferred = null; + $lastPref = 101; + foreach($this->select($propertyName) as $field) { + + $pref = 101; + if (isset($field['TYPE']) && $field['TYPE']->has('PREF')) { + $pref = 1; + } elseif (isset($field['PREF'])) { + $pref = $field['PREF']->getValue(); + } + + if ($pref < $lastPref || is_null($preferred)) { + $preferred = $field; + $lastPref = $pref; + } + + } + return $preferred; + + } + + /** + * This method should return a list of default property values. + * + * @return array + */ + protected function getDefaults() { + + return array( + 'VERSION' => '3.0', + 'PRODID' => '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN', + ); + + } + + /** + * This method returns an array, with the representation as it should be + * encoded in json. This is used to create jCard or jCal documents. + * + * @return array + */ + public function jsonSerialize() { + + // A vcard does not have sub-components, so we're overriding this + // method to remove that array element. + $properties = array(); + + foreach($this->children as $child) { + $properties[] = $child->jsonSerialize(); + } + + return array( + strtolower($this->name), + $properties, + ); + + } + + /** + * Returns the default class for a property name. + * + * @param string $propertyName + * @return string + */ + public function getClassNameForPropertyName($propertyName) { + + $className = parent::getClassNameForPropertyName($propertyName); + // In vCard 4, BINARY no longer exists, and we need URI instead. + + if ($className == 'SabreForRainLoop\\VObject\\Property\\Binary' && $this->getDocumentType()===self::VCARD40) { + return 'SabreForRainLoop\\VObject\\Property\\Uri'; + } + return $className; + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VEvent.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VEvent.php new file mode 100755 index 00000000..b1dc1933 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VEvent.php @@ -0,0 +1,70 @@ +RRULE) { + $it = new VObject\RecurrenceIterator($this); + $it->fastForward($start); + + // We fast-forwarded to a spot where the end-time of the + // recurrence instance exceeded the start of the requested + // time-range. + // + // If the starttime of the recurrence did not exceed the + // end of the time range as well, we have a match. + return ($it->getDTStart() < $end && $it->getDTEnd() > $start); + + } + + $effectiveStart = $this->DTSTART->getDateTime(); + if (isset($this->DTEND)) { + + // The DTEND property is considered non inclusive. So for a 3 day + // event in july, dtstart and dtend would have to be July 1st and + // July 4th respectively. + // + // See: + // http://tools.ietf.org/html/rfc5545#page-54 + $effectiveEnd = $this->DTEND->getDateTime(); + + } elseif (isset($this->DURATION)) { + $effectiveEnd = clone $effectiveStart; + $effectiveEnd->add( VObject\DateTimeParser::parseDuration($this->DURATION) ); + } elseif (!$this->DTSTART->hasTime()) { + $effectiveEnd = clone $effectiveStart; + $effectiveEnd->modify('+1 day'); + } else { + $effectiveEnd = clone $effectiveStart; + } + return ( + ($start <= $effectiveEnd) && ($end > $effectiveStart) + ); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VFreeBusy.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VFreeBusy.php new file mode 100755 index 00000000..1787c6bb --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VFreeBusy.php @@ -0,0 +1,68 @@ +select('FREEBUSY') as $freebusy) { + + // We are only interested in FBTYPE=BUSY (the default), + // FBTYPE=BUSY-TENTATIVE or FBTYPE=BUSY-UNAVAILABLE. + if (isset($freebusy['FBTYPE']) && strtoupper(substr((string)$freebusy['FBTYPE'],0,4))!=='BUSY') { + continue; + } + + // The freebusy component can hold more than 1 value, separated by + // commas. + $periods = explode(',', (string)$freebusy); + + foreach($periods as $period) { + // Every period is formatted as [start]/[end]. The start is an + // absolute UTC time, the end may be an absolute UTC time, or + // duration (relative) value. + list($busyStart, $busyEnd) = explode('/', $period); + + $busyStart = VObject\DateTimeParser::parse($busyStart); + $busyEnd = VObject\DateTimeParser::parse($busyEnd); + if ($busyEnd instanceof \DateInterval) { + $tmp = clone $busyStart; + $tmp->add($busyEnd); + $busyEnd = $tmp; + } + + if($start < $busyEnd && $end > $busyStart) { + return false; + } + + } + + } + + return true; + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VJournal.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VJournal.php new file mode 100755 index 00000000..8a54a2b0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VJournal.php @@ -0,0 +1,46 @@ +DTSTART)?$this->DTSTART->getDateTime():null; + if ($dtstart) { + $effectiveEnd = clone $dtstart; + if (!$this->DTSTART->hasTime()) { + $effectiveEnd->modify('+1 day'); + } + + return ($start <= $effectiveEnd && $end > $dtstart); + + } + return false; + + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VTodo.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VTodo.php new file mode 100755 index 00000000..27bd2e30 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VTodo.php @@ -0,0 +1,68 @@ +DTSTART)?$this->DTSTART->getDateTime():null; + $duration = isset($this->DURATION)?VObject\DateTimeParser::parseDuration($this->DURATION):null; + $due = isset($this->DUE)?$this->DUE->getDateTime():null; + $completed = isset($this->COMPLETED)?$this->COMPLETED->getDateTime():null; + $created = isset($this->CREATED)?$this->CREATED->getDateTime():null; + + if ($dtstart) { + if ($duration) { + $effectiveEnd = clone $dtstart; + $effectiveEnd->add($duration); + return $start <= $effectiveEnd && $end > $dtstart; + } elseif ($due) { + return + ($start < $due || $start <= $dtstart) && + ($end > $dtstart || $end >= $due); + } else { + return $start <= $dtstart && $end > $dtstart; + } + } + if ($due) { + return ($start < $due && $end >= $due); + } + if ($completed && $created) { + return + ($start <= $created || $start <= $completed) && + ($end >= $created || $end >= $completed); + } + if ($completed) { + return ($start <= $completed && $end >= $completed); + } + if ($created) { + return ($end > $created); + } + return true; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/DateTimeParser.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/DateTimeParser.php new file mode 100755 index 00000000..687a9176 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/DateTimeParser.php @@ -0,0 +1,415 @@ +setTimeZone(new \DateTimeZone('UTC')); + return $date; + + } + + /** + * Parses an iCalendar (rfc5545) formatted date and returns a DateTime object + * + * @param string $date + * @return DateTime + */ + static public function parseDate($date) { + + // Format is YYYYMMDD + $result = preg_match('/^([0-9]{4})([0-1][0-9])([0-3][0-9])$/',$date,$matches); + + if (!$result) { + throw new \LogicException('The supplied iCalendar date value is incorrect: ' . $date); + } + + $date = new \DateTime($matches[1] . '-' . $matches[2] . '-' . $matches[3], new \DateTimeZone('UTC')); + return $date; + + } + + /** + * Parses an iCalendar (RFC5545) formatted duration value. + * + * This method will either return a DateTimeInterval object, or a string + * suitable for strtotime or DateTime::modify. + * + * @param string $duration + * @param bool $asString + * @return DateInterval|string + */ + static public function parseDuration($duration, $asString = false) { + + $result = preg_match('/^(?P\+|-)?P((?P\d+)W)?((?P\d+)D)?(T((?P\d+)H)?((?P\d+)M)?((?P\d+)S)?)?$/', $duration, $matches); + if (!$result) { + throw new \LogicException('The supplied iCalendar duration value is incorrect: ' . $duration); + } + + if (!$asString) { + $invert = false; + if ($matches['plusminus']==='-') { + $invert = true; + } + + + $parts = array( + 'week', + 'day', + 'hour', + 'minute', + 'second', + ); + foreach($parts as $part) { + $matches[$part] = isset($matches[$part])&&$matches[$part]?(int)$matches[$part]:0; + } + + + // We need to re-construct the $duration string, because weeks and + // days are not supported by DateInterval in the same string. + $duration = 'P'; + $days = $matches['day']; + if ($matches['week']) { + $days+=$matches['week']*7; + } + if ($days) + $duration.=$days . 'D'; + + if ($matches['minute'] || $matches['second'] || $matches['hour']) { + $duration.='T'; + + if ($matches['hour']) + $duration.=$matches['hour'].'H'; + + if ($matches['minute']) + $duration.=$matches['minute'].'M'; + + if ($matches['second']) + $duration.=$matches['second'].'S'; + + } + + if ($duration==='P') { + $duration = 'PT0S'; + } + $iv = new \DateInterval($duration); + if ($invert) $iv->invert = true; + + return $iv; + + } + + + + $parts = array( + 'week', + 'day', + 'hour', + 'minute', + 'second', + ); + + $newDur = ''; + foreach($parts as $part) { + if (isset($matches[$part]) && $matches[$part]) { + $newDur.=' '.$matches[$part] . ' ' . $part . 's'; + } + } + + $newDur = ($matches['plusminus']==='-'?'-':'+') . trim($newDur); + if ($newDur === '+') { $newDur = '+0 seconds'; }; + return $newDur; + + } + + /** + * Parses either a Date or DateTime, or Duration value. + * + * @param string $date + * @param DateTimeZone|string $referenceTZ + * @return DateTime|DateInterval + */ + static public function parse($date, $referenceTZ = null) { + + if ($date[0]==='P' || ($date[0]==='-' && $date[1]==='P')) { + return self::parseDuration($date); + } elseif (strlen($date)===8) { + return self::parseDate($date); + } else { + return self::parseDateTime($date, $referenceTZ); + } + + } + + /** + * This method parses a vCard date and or time value. + * + * This can be used for the DATE, DATE-TIME, TIMESTAMP and + * DATE-AND-OR-TIME value. + * + * This method returns an array, not a DateTime value. + * + * The elements in the array are in the following order: + * year, month, date, hour, minute, second, timezone + * + * Almost any part of the string may be omitted. It's for example legal to + * just specify seconds, leave out the year, etc. + * + * Timezone is either returned as 'Z' or as '+08:00' + * + * For any non-specified values null is returned. + * + * List of date formats that are supported: + * YYYY + * YYYY-MM + * YYYYMMDD + * --MMDD + * ---DD + * + * YYYY-MM-DD + * --MM-DD + * ---DD + * + * List of supported time formats: + * + * HH + * HHMM + * HHMMSS + * -MMSS + * --SS + * + * HH + * HH:MM + * HH:MM:SS + * -MM:SS + * --SS + * + * A full basic-format date-time string looks like : + * 20130603T133901 + * + * A full extended-format date-time string looks like : + * 2013-06-03T13:39:01 + * + * Times may be postfixed by a timezone offset. This can be either 'Z' for + * UTC, or a string like -0500 or +1100. + * + * @param string $date + * @return array + */ + static public function parseVCardDateTime($date) { + + $regex = '/^ + (?: # date part + (?: + (?: (?P [0-9]{4}) (?: -)?| --) + (?P [0-9]{2})? + |---) + (?P [0-9]{2})? + )? + (?:T # time part + (?P [0-9]{2} | -) + (?P [0-9]{2} | -)? + (?P [0-9]{2})? + + (?P # timezone offset + + Z | (?: \+|-)(?: [0-9]{4}) + + )? + + )? + $/x'; + + + if (!preg_match($regex, $date, $matches)) { + + // Attempting to parse the extended format. + $regex = '/^ + (?: # date part + (?: (?P [0-9]{4}) - | -- ) + (?P [0-9]{2}) - + (?P [0-9]{2}) + )? + (?:T # time part + + (?: (?P [0-9]{2}) : | -) + (?: (?P [0-9]{2}) : | -)? + (?P [0-9]{2})? + + (?P # timezone offset + + Z | (?: \+|-)(?: [0-9]{2}:[0-9]{2}) + + )? + + )? + $/x'; + + if (!preg_match($regex, $date, $matches)) { + throw new \InvalidArgumentException('Invalid vCard date-time string: ' . $date); + } + + } + $parts = array( + 'year', + 'month', + 'date', + 'hour', + 'minute', + 'second', + 'timezone' + ); + + $result = array(); + foreach($parts as $part) { + + if (empty($matches[$part])) { + $result[$part] = null; + } elseif ($matches[$part] === '-' || $matches[$part] === '--') { + $result[$part] = null; + } else { + $result[$part] = $matches[$part]; + } + + } + + return $result; + + } + + /** + * This method parses a vCard TIME value. + * + * This method returns an array, not a DateTime value. + * + * The elements in the array are in the following order: + * hour, minute, second, timezone + * + * Almost any part of the string may be omitted. It's for example legal to + * just specify seconds, leave out the hour etc. + * + * Timezone is either returned as 'Z' or as '+08:00' + * + * For any non-specified values null is returned. + * + * List of supported time formats: + * + * HH + * HHMM + * HHMMSS + * -MMSS + * --SS + * + * HH + * HH:MM + * HH:MM:SS + * -MM:SS + * --SS + * + * A full basic-format time string looks like : + * 133901 + * + * A full extended-format time string looks like : + * 13:39:01 + * + * Times may be postfixed by a timezone offset. This can be either 'Z' for + * UTC, or a string like -0500 or +11:00. + * + * @param string $date + * @return array + */ + static public function parseVCardTime($date) { + + $regex = '/^ + (?P [0-9]{2} | -) + (?P [0-9]{2} | -)? + (?P [0-9]{2})? + + (?P # timezone offset + + Z | (?: \+|-)(?: [0-9]{4}) + + )? + $/x'; + + + if (!preg_match($regex, $date, $matches)) { + + // Attempting to parse the extended format. + $regex = '/^ + (?: (?P [0-9]{2}) : | -) + (?: (?P [0-9]{2}) : | -)? + (?P [0-9]{2})? + + (?P # timezone offset + + Z | (?: \+|-)(?: [0-9]{2}:[0-9]{2}) + + )? + $/x'; + + if (!preg_match($regex, $date, $matches)) { + throw new \InvalidArgumentException('Invalid vCard time string: ' . $date); + } + + } + $parts = array( + 'hour', + 'minute', + 'second', + 'timezone' + ); + + $result = array(); + foreach($parts as $part) { + + if (empty($matches[$part])) { + $result[$part] = null; + } elseif ($matches[$part] === '-') { + $result[$part] = null; + } else { + $result[$part] = $matches[$part]; + } + + } + + return $result; + + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Document.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Document.php new file mode 100755 index 00000000..fd17b162 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Document.php @@ -0,0 +1,261 @@ +value syntax, in which case + * properties will automatically be created, or you can just pass a list of + * Component and Property object. + * + * By default, a set of sensible values will be added to the component. For + * an iCalendar object, this may be something like CALSCALE:GREGORIAN. To + * ensure that this does not happen, set $defaults to false. + * + * @param string $name + * @param array $children + * @param bool $defaults + * @return Component + */ + public function createComponent($name, array $children = null, $defaults = true) { + + $name = strtoupper($name); + $class = 'SabreForRainLoop\\VObject\\Component'; + + if (isset(static::$componentMap[$name])) { + $class=static::$componentMap[$name]; + } + if (is_null($children)) $children = array(); + return new $class($this, $name, $children, $defaults); + + } + + /** + * Factory method for creating new properties + * + * This method automatically searches for the correct property class, based + * on its name. + * + * You can specify the parameters either in key=>value syntax, in which case + * parameters will automatically be created, or you can just pass a list of + * Parameter objects. + * + * @param string $name + * @param mixed $value + * @param array $parameters + * @param string $valueType Force a specific valuetype, such as URI or TEXT + * @return Property + */ + public function createProperty($name, $value = null, array $parameters = null, $valueType = null) { + + // If there's a . in the name, it means it's prefixed by a groupname. + if (($i=strpos($name,'.'))!==false) { + $group = substr($name, 0, $i); + $name = strtoupper(substr($name, $i+1)); + } else { + $name = strtoupper($name); + $group = null; + } + + $class = null; + + if ($valueType) { + // The valueType argument comes first to figure out the correct + // class. + $class = $this->getClassNameForPropertyValue($valueType); + } + + if (is_null($class) && isset($parameters['VALUE'])) { + // If a VALUE parameter is supplied, we should use that. + $class = $this->getClassNameForPropertyValue($parameters['VALUE']); + } + if (is_null($class)) { + $class = $this->getClassNameForPropertyName($name); + } + if (is_null($parameters)) $parameters = array(); + + return new $class($this, $name, $value, $parameters, $group); + + } + + /** + * This method returns a full class-name for a value parameter. + * + * For instance, DTSTART may have VALUE=DATE. In that case we will look in + * our valueMap table and return the appropriate class name. + * + * This method returns null if we don't have a specialized class. + * + * @param string $valueParam + * @return void + */ + public function getClassNameForPropertyValue($valueParam) { + + $valueParam = strtoupper($valueParam); + if (isset(static::$valueMap[$valueParam])) { + return static::$valueMap[$valueParam]; + } + + } + + /** + * Returns the default class for a property name. + * + * @param string $propertyName + * @return string + */ + public function getClassNameForPropertyName($propertyName) { + + if (isset(static::$propertyMap[$propertyName])) { + return static::$propertyMap[$propertyName]; + } else { + return 'SabreForRainLoop\\VObject\\Property\\Unknown'; + } + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/ElementList.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/ElementList.php new file mode 100755 index 00000000..807a085c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/ElementList.php @@ -0,0 +1,172 @@ +vevent where there's multiple VEVENT objects. + * + * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/). + * @author Evert Pot (http://evertpot.com/) + * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License + */ +class ElementList implements \Iterator, \Countable, \ArrayAccess { + + /** + * Inner elements + * + * @var array + */ + protected $elements = array(); + + /** + * Creates the element list. + * + * @param array $elements + */ + public function __construct(array $elements) { + + $this->elements = $elements; + + } + + /* {{{ Iterator interface */ + + /** + * Current position + * + * @var int + */ + private $key = 0; + + /** + * Returns current item in iteration + * + * @return Element + */ + public function current() { + + return $this->elements[$this->key]; + + } + + /** + * To the next item in the iterator + * + * @return void + */ + public function next() { + + $this->key++; + + } + + /** + * Returns the current iterator key + * + * @return int + */ + public function key() { + + return $this->key; + + } + + /** + * Returns true if the current position in the iterator is a valid one + * + * @return bool + */ + public function valid() { + + return isset($this->elements[$this->key]); + + } + + /** + * Rewinds the iterator + * + * @return void + */ + public function rewind() { + + $this->key = 0; + + } + + /* }}} */ + + /* {{{ Countable interface */ + + /** + * Returns the number of elements + * + * @return int + */ + public function count() { + + return count($this->elements); + + } + + /* }}} */ + + /* {{{ ArrayAccess Interface */ + + + /** + * Checks if an item exists through ArrayAccess. + * + * @param int $offset + * @return bool + */ + public function offsetExists($offset) { + + return isset($this->elements[$offset]); + + } + + /** + * Gets an item through ArrayAccess. + * + * @param int $offset + * @return mixed + */ + public function offsetGet($offset) { + + return $this->elements[$offset]; + + } + + /** + * Sets an item through ArrayAccess. + * + * @param int $offset + * @param mixed $value + * @return void + */ + public function offsetSet($offset,$value) { + + throw new \LogicException('You can not add new objects to an ElementList'); + + } + + /** + * Sets an item through ArrayAccess. + * + * This method just forwards the request to the inner iterator + * + * @param int $offset + * @return void + */ + public function offsetUnset($offset) { + + throw new \LogicException('You can not remove objects from an ElementList'); + + } + + /* }}} */ + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/EofException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/EofException.php new file mode 100755 index 00000000..fc935098 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/EofException.php @@ -0,0 +1,13 @@ +setTimeRange($start, $end); + } + + if ($objects) { + $this->setObjects($objects); + } + + } + + /** + * Sets the VCALENDAR object. + * + * If this is set, it will not be generated for you. You are responsible + * for setting things like the METHOD, CALSCALE, VERSION, etc.. + * + * The VFREEBUSY object will be automatically added though. + * + * @param Component $vcalendar + * @return void + */ + public function setBaseObject(Component $vcalendar) { + + $this->baseObject = $vcalendar; + + } + + /** + * Sets the input objects + * + * You must either specify a valendar object as a strong, or as the parse + * Component. + * It's also possible to specify multiple objects as an array. + * + * @param mixed $objects + * @return void + */ + public function setObjects($objects) { + + if (!is_array($objects)) { + $objects = array($objects); + } + + $this->objects = array(); + foreach($objects as $object) { + + if (is_string($object)) { + $this->objects[] = Reader::read($object); + } elseif ($object instanceof Component) { + $this->objects[] = $object; + } else { + throw new \InvalidArgumentException('You can only pass strings or \\SabreForRainLoop\\VObject\\Component arguments to setObjects'); + } + + } + + } + + /** + * Sets the time range + * + * Any freebusy object falling outside of this time range will be ignored. + * + * @param DateTime $start + * @param DateTime $end + * @return void + */ + public function setTimeRange(\DateTime $start = null, \DateTime $end = null) { + + $this->start = $start; + $this->end = $end; + + } + + /** + * Parses the input data and returns a correct VFREEBUSY object, wrapped in + * a VCALENDAR. + * + * @return Component + */ + public function getResult() { + + $busyTimes = array(); + + foreach($this->objects as $object) { + + foreach($object->getBaseComponents() as $component) { + + switch($component->name) { + + case 'VEVENT' : + + $FBTYPE = 'BUSY'; + if (isset($component->TRANSP) && (strtoupper($component->TRANSP) === 'TRANSPARENT')) { + break; + } + if (isset($component->STATUS)) { + $status = strtoupper($component->STATUS); + if ($status==='CANCELLED') { + break; + } + if ($status==='TENTATIVE') { + $FBTYPE = 'BUSY-TENTATIVE'; + } + } + + $times = array(); + + if ($component->RRULE) { + + $iterator = new RecurrenceIterator($object, (string)$component->uid); + if ($this->start) { + $iterator->fastForward($this->start); + } + + $maxRecurrences = 200; + + while($iterator->valid() && --$maxRecurrences) { + + $startTime = $iterator->getDTStart(); + if ($this->end && $startTime > $this->end) { + break; + } + $times[] = array( + $iterator->getDTStart(), + $iterator->getDTEnd(), + ); + + $iterator->next(); + + } + + } else { + + $startTime = $component->DTSTART->getDateTime(); + if ($this->end && $startTime > $this->end) { + break; + } + $endTime = null; + if (isset($component->DTEND)) { + $endTime = $component->DTEND->getDateTime(); + } elseif (isset($component->DURATION)) { + $duration = DateTimeParser::parseDuration((string)$component->DURATION); + $endTime = clone $startTime; + $endTime->add($duration); + } elseif (!$component->DTSTART->hasTime()) { + $endTime = clone $startTime; + $endTime->modify('+1 day'); + } else { + // The event had no duration (0 seconds) + break; + } + + $times[] = array($startTime, $endTime); + + } + + foreach($times as $time) { + + if ($this->end && $time[0] > $this->end) break; + if ($this->start && $time[1] < $this->start) break; + + $busyTimes[] = array( + $time[0], + $time[1], + $FBTYPE, + ); + } + break; + + case 'VFREEBUSY' : + foreach($component->FREEBUSY as $freebusy) { + + $fbType = isset($freebusy['FBTYPE'])?strtoupper($freebusy['FBTYPE']):'BUSY'; + + // Skipping intervals marked as 'free' + if ($fbType==='FREE') + continue; + + $values = explode(',', $freebusy); + foreach($values as $value) { + list($startTime, $endTime) = explode('/', $value); + $startTime = DateTimeParser::parseDateTime($startTime); + + if (substr($endTime,0,1)==='P' || substr($endTime,0,2)==='-P') { + $duration = DateTimeParser::parseDuration($endTime); + $endTime = clone $startTime; + $endTime->add($duration); + } else { + $endTime = DateTimeParser::parseDateTime($endTime); + } + + if($this->start && $this->start > $endTime) continue; + if($this->end && $this->end < $startTime) continue; + $busyTimes[] = array( + $startTime, + $endTime, + $fbType + ); + + } + + + } + break; + + + + } + + + } + + } + + if ($this->baseObject) { + $calendar = $this->baseObject; + } else { + $calendar = new VCalendar(); + } + + $vfreebusy = $calendar->createComponent('VFREEBUSY'); + $calendar->add($vfreebusy); + + if ($this->start) { + $dtstart = $calendar->createProperty('DTSTART'); + $dtstart->setDateTime($this->start); + $vfreebusy->add($dtstart); + } + if ($this->end) { + $dtend = $calendar->createProperty('DTEND'); + $dtend->setDateTime($this->end); + $vfreebusy->add($dtend); + } + $dtstamp = $calendar->createProperty('DTSTAMP'); + $dtstamp->setDateTime(new \DateTime('now', new \DateTimeZone('UTC'))); + $vfreebusy->add($dtstamp); + + foreach($busyTimes as $busyTime) { + + $busyTime[0]->setTimeZone(new \DateTimeZone('UTC')); + $busyTime[1]->setTimeZone(new \DateTimeZone('UTC')); + + $prop = $calendar->createProperty( + 'FREEBUSY', + $busyTime[0]->format('Ymd\\THis\\Z') . '/' . $busyTime[1]->format('Ymd\\THis\\Z') + ); + $prop['FBTYPE'] = $busyTime[2]; + $vfreebusy->add($prop); + + } + + return $calendar; + + } + +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Node.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Node.php new file mode 100755 index 00000000..3330fcef --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Node.php @@ -0,0 +1,201 @@ +iterator)) + return $this->iterator; + + return new ElementList(array($this)); + + } + + /** + * Sets the overridden iterator + * + * Note that this is not actually part of the iterator interface + * + * @param ElementList $iterator + * @return void + */ + public function setIterator(ElementList $iterator) { + + $this->iterator = $iterator; + + } + + /** + * Validates the node for correctness. + * + * The following options are supported: + * - Node::REPAIR - If something is broken, and automatic repair may + * be attempted. + * + * An array is returned with warnings. + * + * Every item in the array has the following properties: + * * level - (number between 1 and 3 with severity information) + * * message - (human readable message) + * * node - (reference to the offending node) + * + * @param int $options + * @return array + */ + public function validate($options = 0) { + + return array(); + + } + + /* }}} */ + + /* {{{ Countable interface */ + + /** + * Returns the number of elements + * + * @return int + */ + public function count() { + + $it = $this->getIterator(); + return $it->count(); + + } + + /* }}} */ + + /* {{{ ArrayAccess Interface */ + + + /** + * Checks if an item exists through ArrayAccess. + * + * This method just forwards the request to the inner iterator + * + * @param int $offset + * @return bool + */ + public function offsetExists($offset) { + + $iterator = $this->getIterator(); + return $iterator->offsetExists($offset); + + } + + /** + * Gets an item through ArrayAccess. + * + * This method just forwards the request to the inner iterator + * + * @param int $offset + * @return mixed + */ + public function offsetGet($offset) { + + $iterator = $this->getIterator(); + return $iterator->offsetGet($offset); + + } + + /** + * Sets an item through ArrayAccess. + * + * This method just forwards the request to the inner iterator + * + * @param int $offset + * @param mixed $value + * @return void + */ + public function offsetSet($offset,$value) { + + $iterator = $this->getIterator(); + $iterator->offsetSet($offset,$value); + + // @codeCoverageIgnoreStart + // + // This method always throws an exception, so we ignore the closing + // brace + } + // @codeCoverageIgnoreEnd + + /** + * Sets an item through ArrayAccess. + * + * This method just forwards the request to the inner iterator + * + * @param int $offset + * @return void + */ + public function offsetUnset($offset) { + + $iterator = $this->getIterator(); + $iterator->offsetUnset($offset); + + // @codeCoverageIgnoreStart + // + // This method always throws an exception, so we ignore the closing + // brace + } + // @codeCoverageIgnoreEnd + + /* }}} */ +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parameter.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parameter.php new file mode 100755 index 00000000..6e153175 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parameter.php @@ -0,0 +1,343 @@ +name = strtoupper($name); + $this->root = $root; + if (is_null($name)) { + $this->noName = true; + $this->name = static::guessParameterNameByValue($value); + } + $this->setValue($value); + } + + /** + * Try to guess property name by value, can be used for vCard 2.1 nameless parameters. + * + * Figuring out what the name should have been. Note that a ton of + * these are rather silly in 2013 and would probably rarely be + * used, but we like to be complete. + * + * @param string $value + * @return string + */ + public static function guessParameterNameByValue($value) { + switch(strtoupper($value)) { + + // Encodings + case '7-BIT' : + case 'QUOTED-PRINTABLE' : + case 'BASE64' : + $name = 'ENCODING'; + break; + + // Common types + case 'WORK' : + case 'HOME' : + case 'PREF' : + + // Delivery Label Type + case 'DOM' : + case 'INTL' : + case 'POSTAL' : + case 'PARCEL' : + + // Telephone types + case 'VOICE' : + case 'FAX' : + case 'MSG' : + case 'CELL' : + case 'PAGER' : + case 'BBS' : + case 'MODEM' : + case 'CAR' : + case 'ISDN' : + case 'VIDEO' : + + // EMAIL types (lol) + case 'AOL' : + case 'APPLELINK' : + case 'ATTMAIL' : + case 'CIS' : + case 'EWORLD' : + case 'INTERNET' : + case 'IBMMAIL' : + case 'MCIMAIL' : + case 'POWERSHARE' : + case 'PRODIGY' : + case 'TLX' : + case 'X400' : + + // Photo / Logo format types + case 'GIF' : + case 'CGM' : + case 'WMF' : + case 'BMP' : + case 'DIB' : + case 'PICT' : + case 'TIFF' : + case 'PDF ': + case 'PS' : + case 'JPEG' : + case 'MPEG' : + case 'MPEG2' : + case 'AVI' : + case 'QTIME' : + + // Sound Digital Audio Type + case 'WAVE' : + case 'PCM' : + case 'AIFF' : + + // Key types + case 'X509' : + case 'PGP' : + $name = 'TYPE'; + break; + + // Value types + case 'INLINE' : + case 'URL' : + case 'CONTENT-ID' : + case 'CID' : + $name = 'VALUE'; + break; + + default: + $name = ''; + } + + return $name; + } + + /** + * Updates the current value. + * + * This may be either a single, or multiple strings in an array. + * + * @param string|array $value + * @return void + */ + public function setValue($value) { + + $this->value = $value; + + } + + /** + * Returns the current value + * + * This method will always return a string, or null. If there were multiple + * values, it will automatically concatinate them (separated by comma). + * + * @return string|null + */ + public function getValue() { + + if (is_array($this->value)) { + return implode(',' , $this->value); + } else { + return $this->value; + } + + } + + /** + * Sets multiple values for this parameter. + * + * @param array $value + * @return void + */ + public function setParts(array $value) { + + $this->value = $value; + + } + + /** + * Returns all values for this parameter. + * + * If there were no values, an empty array will be returned. + * + * @return array + */ + public function getParts() { + + if (is_array($this->value)) { + return $this->value; + } elseif (is_null($this->value)) { + return array(); + } else { + return array($this->value); + } + + } + + /** + * Adds a value to this parameter + * + * If the argument is specified as an array, all items will be added to the + * parameter value list. + * + * @param string|array $part + * @return void + */ + public function addValue($part) { + + if (is_null($this->value)) { + $this->value = $part; + } else { + $this->value = array_merge((array)$this->value, (array)$part); + } + + } + + /** + * Checks if this parameter contains the specified value. + * + * This is a case-insensitive match. It makes sense to call this for for + * instance the TYPE parameter, to see if it contains a keyword such as + * 'WORK' or 'FAX'. + * + * @param string $value + * @return bool + */ + public function has($value) { + + return in_array( + strtolower($value), + array_map('strtolower', (array)$this->value) + ); + + } + + /** + * Turns the object back into a serialized blob. + * + * @return string + */ + public function serialize() { + + $value = $this->getParts(); + + if (count($value)===0) { + return $this->name; + } + + if ($this->root->getDocumentType() === Document::VCARD21 && $this->noName) { + + return implode(';', $value); + + } + + return $this->name . '=' . array_reduce($value, function($out, $item) { + + if (!is_null($out)) $out.=','; + + // If there's no special characters in the string, we'll use the simple + // format + if (!preg_match('#(?: [\n":;\^,] )#x', $item)) { + return $out.$item; + } else { + // Enclosing in double-quotes, and using RFC6868 for encoding any + // special characters + $out.='"' . strtr($item, array( + '^' => '^^', + "\n" => '^n', + '"' => '^\'', + )) . '"'; + return $out; + } + + }); + + } + + /** + * This method returns an array, with the representation as it should be + * encoded in json. This is used to create jCard or jCal documents. + * + * @return array + */ + public function jsonSerialize() { + + return $this->value; + + } + + /** + * Called when this object is being cast to a string + * + * @return string + */ + public function __toString() { + + return $this->getValue(); + + } + + /** + * Returns the iterator for this object + * + * @return ElementList + */ + public function getIterator() { + + if (!is_null($this->iterator)) + return $this->iterator; + + return $this->iterator = new ArrayObject((array)$this->value); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/ParseException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/ParseException.php new file mode 100755 index 00000000..5e3658c5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/ParseException.php @@ -0,0 +1,12 @@ +setInput($input); + } + if (is_null($this->input)) { + throw new EofException('End of input stream, or no input supplied'); + } + + if (!is_null($options)) { + $this->options = $options; + } + + switch($this->input[0]) { + case 'vcalendar' : + $this->root = new VCalendar(array(), false); + break; + case 'vcard' : + $this->root = new VCard(array(), false); + break; + default : + throw new ParseException('The root component must either be a vcalendar, or a vcard'); + + } + foreach($this->input[1] as $prop) { + $this->root->add($this->parseProperty($prop)); + } + if (isset($this->input[2])) foreach($this->input[2] as $comp) { + $this->root->add($this->parseComponent($comp)); + } + + // Resetting the input so we can throw an feof exception the next time. + $this->input = null; + + return $this->root; + + } + + /** + * Parses a component + * + * @param array $jComp + * @return \SabreForRainLoop\VObject\Component + */ + public function parseComponent(array $jComp) { + + // We can remove $self from PHP 5.4 onward. + $self = $this; + + $properties = array_map(function($jProp) use ($self) { + return $self->parseProperty($jProp); + }, $jComp[1]); + + if (isset($jComp[2])) { + + $components = array_map(function($jComp) use ($self) { + return $self->parseComponent($jComp); + }, $jComp[2]); + + } else $components = array(); + + return $this->root->createComponent( + $jComp[0], + array_merge( $properties, $components), + $defaults = false + ); + + } + + /** + * Parses properties. + * + * @param array $jProp + * @return \SabreForRainLoop\VObject\Property + */ + public function parseProperty(array $jProp) { + + list( + $propertyName, + $parameters, + $valueType + ) = $jProp; + + $propertyName = strtoupper($propertyName); + + // This is the default class we would be using if we didn't know the + // value type. We're using this value later in this function. + $defaultPropertyClass = $this->root->getClassNameForPropertyName($propertyName); + + $parameters = (array)$parameters; + + $value = array_slice($jProp, 3); + + $valueType = strtoupper($valueType); + + if (isset($parameters['group'])) { + $propertyName = $parameters['group'] . '.' . $propertyName; + unset($parameters['group']); + } + + $prop = $this->root->createProperty($propertyName, null, $parameters, $valueType); + $prop->setJsonValue($value); + + // We have to do something awkward here. FlatText as well as Text + // represents TEXT values. We have to normalize these here. In the + // future we can get rid of FlatText once we're allowed to break BC + // again. + if ($defaultPropertyClass === 'SabreForRainLoop\VObject\Property\FlatText') { + $defaultPropertyClass = 'SabreForRainLoop\VObject\Property\Text'; + } + + // If the value type we received (e.g.: TEXT) was not the default value + // type for the given property (e.g.: BDAY), we need to add a VALUE= + // parameter. + if ($defaultPropertyClass !== get_class($prop)) { + $prop["VALUE"] = $valueType; + } + + return $prop; + + } + + /** + * Sets the input data + * + * @param resource|string|array $input + * @return void + */ + public function setInput($input) { + + if (is_resource($input)) { + $input = stream_get_contents($input); + } + if (is_string($input)) { + $input = json_decode($input); + } + $this->input = $input; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parser/MimeDir.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parser/MimeDir.php new file mode 100755 index 00000000..e95741fd --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parser/MimeDir.php @@ -0,0 +1,602 @@ +root = null; + if (!is_null($input)) { + + $this->setInput($input); + + } + + if (!is_null($options)) $this->options = $options; + + $this->parseDocument(); + + return $this->root; + + } + + /** + * Sets the input buffer. Must be a string or stream. + * + * @param resource|string $input + * @return void + */ + public function setInput($input) { + + // Resetting the parser + $this->lineIndex = 0; + $this->startLine = 0; + + if (is_string($input)) { + // Convering to a stream. + $stream = fopen('php://temp', 'r+'); + fwrite($stream, $input); + rewind($stream); + $this->input = $stream; + } else { + $this->input = $input; + } + + } + + /** + * Parses an entire document. + * + * @return void + */ + protected function parseDocument() { + + $line = $this->readLine(); + switch(strtoupper($line)) { + case 'BEGIN:VCALENDAR' : + $class = isset(VCalendar::$componentMap['VCALENDAR']) + ? VCalendar::$componentMap[$name] + : 'SabreForRainLoop\\VObject\\Component\\VCalendar'; + break; + case 'BEGIN:VCARD' : + $class = isset(VCard::$componentMap['VCARD']) + ? VCard::$componentMap['VCARD'] + : 'SabreForRainLoop\\VObject\\Component\\VCard'; + break; + default : + throw new ParseException('This parser only supports VCARD and VCALENDAR files'); + } + + $this->root = new $class(array(), false); + + while(true) { + + // Reading until we hit END: + $line = $this->readLine(); + if (strtoupper(substr($line,0,4)) === 'END:') { + break; + } + $result = $this->parseLine($line); + if ($result) { + $this->root->add($result); + } + + } + + $name = strtoupper(substr($line, 4)); + if ($name!==$this->root->name) { + throw new ParseException('Invalid MimeDir file. expected: "END:' . $this->root->name . '" got: "END:' . $name . '"'); + } + + } + + /** + * Parses a line, and if it hits a component, it will also attempt to parse + * the entire component + * + * @param string $line Unfolded line + * @return Node + */ + protected function parseLine($line) { + + // Start of a new component + if (strtoupper(substr($line, 0, 6)) === 'BEGIN:') { + + $component = $this->root->createComponent(substr($line,6), array(), false); + + while(true) { + + // Reading until we hit END: + $line = $this->readLine(); + if (strtoupper(substr($line,0,4)) === 'END:') { + break; + } + $result = $this->parseLine($line); + if ($result) { + $component->add($result); + } + + } + + $name = strtoupper(substr($line, 4)); + if ($name!==$component->name) { + throw new ParseException('Invalid MimeDir file. expected: "END:' . $component->name . '" got: "END:' . $name . '"'); + } + + return $component; + + } else { + + // Property reader + $property = $this->readProperty($line); + if (!$property) { + // Ignored line + return false; + } + return $property; + + } + + } + + /** + * We need to look ahead 1 line every time to see if we need to 'unfold' + * the next line. + * + * If that was not the case, we store it here. + * + * @var null|string + */ + protected $lineBuffer; + + /** + * The real current line number. + */ + protected $lineIndex = 0; + + /** + * In the case of unfolded lines, this property holds the line number for + * the start of the line. + * + * @var int + */ + protected $startLine = 0; + + /** + * Contains a 'raw' representation of the current line. + * + * @var string + */ + protected $rawLine; + + /** + * Reads a single line from the buffer. + * + * This method strips any newlines and also takes care of unfolding. + * + * @throws \SabreForRainLoop\VObject\EofException + * @return string + */ + protected function readLine() { + + if (!is_null($this->lineBuffer)) { + $rawLine = $this->lineBuffer; + $this->lineBuffer = null; + } else { + do { + $rawLine = fgets($this->input); + if ($rawLine === false && feof($this->input)) { + throw new EofException('End of document reached prematurely'); + } + $rawLine = rtrim($rawLine, "\r\n"); + } while ($rawLine === ''); // Skipping empty lines + $this->lineIndex++; + } + $line = $rawLine; + + $this->startLine = $this->lineIndex; + + // Looking ahead for folded lines. + while (true) { + + $nextLine = rtrim(fgets($this->input), "\r\n"); + $this->lineIndex++; + if (!$nextLine) { + break; + } + if ($nextLine[0] === "\t" || $nextLine[0] === " ") { + $line .= substr($nextLine, 1); + $rawLine .= "\n " . substr($nextLine, 1); + } else { + $this->lineBuffer = $nextLine; + break; + } + + } + $this->rawLine = $rawLine; + return $line; + + } + + /** + * Reads a property or component from a line. + * + * @return void + */ + protected function readProperty($line) { + + if ($this->options & self::OPTION_FORGIVING) { + $propNameToken = 'A-Z0-9\-\._\\/'; + } else { + $propNameToken = 'A-Z0-9\-\.'; + } + + $paramNameToken = 'A-Z0-9\-'; + $safeChar = '^";:,'; + $qSafeChar = '^"'; + + $regex = "/ + ^(?P [$propNameToken]+ ) (?=[;:]) # property name + | + (?<=:)(?P .*)$ # property value + | + ;(?P [$paramNameToken]+) (?=[=;:]) # parameter name + | + (=|,)(?P # parameter value + (?: [$safeChar]*) | + \"(?: [$qSafeChar]+)\" + ) (?=[;:,]) + /xi"; + + //echo $regex, "\n"; die(); + preg_match_all($regex, $line, $matches, PREG_SET_ORDER ); + + $property = array( + 'name' => null, + 'parameters' => array(), + 'value' => null + ); + + $lastParam = null; + + /** + * Looping through all the tokens. + * + * Note that we are looping through them in reverse order, because if a + * sub-pattern matched, the subsequent named patterns will not show up + * in the result. + */ + foreach($matches as $match) { + + if (isset($match['paramValue'])) { + if ($match['paramValue'] && $match['paramValue'][0] === '"') { + $value = substr($match['paramValue'], 1, -1); + } else { + $value = $match['paramValue']; + } + + $value = $this->unescapeParam($value); + + if (is_null($property['parameters'][$lastParam])) { + $property['parameters'][$lastParam] = $value; + } elseif (is_array($property['parameters'][$lastParam])) { + $property['parameters'][$lastParam][] = $value; + } else { + $property['parameters'][$lastParam] = array( + $property['parameters'][$lastParam], + $value + ); + } + continue; + } + if (isset($match['paramName'])) { + $lastParam = strtoupper($match['paramName']); + if (!isset($property['parameters'][$lastParam])) { + $property['parameters'][$lastParam] = null; + } + continue; + } + if (isset($match['propValue'])) { + $property['value'] = $match['propValue']; + continue; + } + if (isset($match['name']) && $match['name']) { + $property['name'] = strtoupper($match['name']); + continue; + } + + // @codeCoverageIgnoreStart + throw new \LogicException('This code should not be reachable'); + // @codeCoverageIgnoreEnd + + } + + if (is_null($property['value']) || !$property['name']) { + if ($this->options & self::OPTION_IGNORE_INVALID_LINES) { + return false; + } + throw new ParseException('Invalid Mimedir file. Line starting at ' . $this->startLine . ' did not follow iCalendar/vCard conventions'); + } + + // vCard 2.1 states that parameters may appear without a name, and only + // a value. We can deduce the value based on it's name. + // + // Our parser will get those as parameters without a value instead, so + // we're filtering these parameters out first. + $namedParameters = array(); + $namelessParameters = array(); + + foreach($property['parameters'] as $name=>$value) { + if (!is_null($value)) { + $namedParameters[$name] = $value; + } else { + $namelessParameters[] = $name; + } + } + + $propObj = $this->root->createProperty($property['name'], null, $namedParameters); + + foreach($namelessParameters as $namelessParameter) { + $propObj->add(null, $namelessParameter); + } + + if (strtoupper($propObj['ENCODING']) === 'QUOTED-PRINTABLE') { + $propObj->setQuotedPrintableValue($this->extractQuotedPrintableValue()); + } else { + $propObj->setRawMimeDirValue($property['value']); + } + + return $propObj; + + } + + /** + * Unescapes a property value. + * + * vCard 2.1 says: + * * Semi-colons must be escaped in some property values, specifically + * ADR, ORG and N. + * * Semi-colons must be escaped in parameter values, because semi-colons + * are also use to separate values. + * * No mention of escaping backslashes with another backslash. + * * newlines are not escaped either, instead QUOTED-PRINTABLE is used to + * span values over more than 1 line. + * + * vCard 3.0 says: + * * (rfc2425) Backslashes, newlines (\n or \N) and comma's must be + * escaped, all time time. + * * Comma's are used for delimeters in multiple values + * * (rfc2426) Adds to to this that the semi-colon MUST also be escaped, + * as in some properties semi-colon is used for separators. + * * Properties using semi-colons: N, ADR, GEO, ORG + * * Both ADR and N's individual parts may be broken up further with a + * comma. + * * Properties using commas: NICKNAME, CATEGORIES + * + * vCard 4.0 (rfc6350) says: + * * Commas must be escaped. + * * Semi-colons may be escaped, an unescaped semi-colon _may_ be a + * delimiter, depending on the property. + * * Backslashes must be escaped + * * Newlines must be escaped as either \N or \n. + * * Some compound properties may contain multiple parts themselves, so a + * comma within a semi-colon delimited property may also be unescaped + * to denote multiple parts _within_ the compound property. + * * Text-properties using semi-colons: N, ADR, ORG, CLIENTPIDMAP. + * * Text-properties using commas: NICKNAME, RELATED, CATEGORIES, PID. + * + * Even though the spec says that commas must always be escaped, the + * example for GEO in Section 6.5.2 seems to violate this. + * + * iCalendar 2.0 (rfc5545) says: + * * Commas or semi-colons may be used as delimiters, depending on the + * property. + * * Commas, semi-colons, backslashes, newline (\N or \n) are always + * escaped, unless they are delimiters. + * * Colons shall not be escaped. + * * Commas can be considered the 'default delimiter' and is described as + * the delimiter in cases where the order of the multiple values is + * insignificant. + * * Semi-colons are described as the delimiter for 'structured values'. + * They are specifically used in Semi-colons are used as a delimiter in + * REQUEST-STATUS, RRULE, GEO and EXRULE. EXRULE is deprecated however. + * + * Now for the parameters + * + * If delimiter is not set (null) this method will just return a string. + * If it's a comma or a semi-colon the string will be split on those + * characters, and always return an array. + * + * @param string $input + * @param string $delimiter + * @return string|string[] + */ + static public function unescapeValue($input, $delimiter = ';') { + + $regex = '# (?: (\\\\ (?: \\\\ | N | n | ; | , ) )'; + if ($delimiter) { + $regex .= ' | (' . $delimiter . ')'; + } + $regex .= ') #x'; + + $matches = preg_split($regex, $input, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); + + $resultArray = array(); + $result = ''; + + foreach($matches as $match) { + + switch ($match) { + case '\\\\' : + $result .='\\'; + break; + case '\N' : + case '\n' : + $result .="\n"; + break; + case '\;' : + $result .=';'; + break; + case '\,' : + $result .=','; + break; + case $delimiter : + $resultArray[] = $result; + $result = ''; + break; + default : + $result .= $match; + break; + + } + + } + + $resultArray[] = $result; + return $delimiter ? $resultArray : $result; + + } + + /** + * Unescapes a parameter value. + * + * vCard 2.1: + * * Does not mention a mechanism for this. In addition, double quotes + * are never used to wrap values. + * * This means that parameters can simply not contain colons or + * semi-colons. + * + * vCard 3.0 (rfc2425, rfc2426): + * * Parameters _may_ be surrounded by double quotes. + * * If this is not the case, semi-colon, colon and comma may simply not + * occur (the comma used for multiple parameter values though). + * * If it is surrounded by double-quotes, it may simply not contain + * double-quotes. + * * This means that a parameter can in no case encode double-quotes, or + * newlines. + * + * vCard 4.0 (rfc6350) + * * Behavior seems to be identical to vCard 3.0 + * + * iCalendar 2.0 (rfc5545) + * * Behavior seems to be identical to vCard 3.0 + * + * Parameter escaping mechanism (rfc6868) : + * * This rfc describes a new way to escape parameter values. + * * New-line is encoded as ^n + * * ^ is encoded as ^^. + * * " is encoded as ^' + * + * @param string $input + * @return void + */ + private function unescapeParam($input) { + + return + preg_replace_callback('#(\^(\^|n|\'))#',function($matches) { + switch($matches[2]) { + case 'n' : + return "\n"; + case '^' : + return '^'; + case '\'' : + return '"'; + + // @codeCoverageIgnoreStart + } + // @codeCoverageIgnoreEnd + }, $input); + + } + + /** + * Gets the full quoted printable value. + * + * We need a special method for this, because newlines have both a meaning + * in vCards, and in QuotedPrintable. + * + * This method does not do any decoding. + * + * @return string + */ + private function extractQuotedPrintableValue() { + + // We need to parse the raw line again to get the start of the value. + // + // We are basically looking for the first colon (:), but we need to + // skip over the parameters first, as they may contain one. + $regex = '/^ + (?: [^:])+ # Anything but a colon + (?: "[^"]")* # A parameter in double quotes + : # start of the value we really care about + (.*)$ + /xs'; + + preg_match($regex, $this->rawLine, $matches); + + $value = $matches[1]; + // Removing the first whitespace character from every line. Kind of + // like unfolding, but we keep the newline. + $value = str_replace("\n ", "\n", $value); + + // Microsoft products don't always correctly fold lines, they may be + // missing a whitespace. So if 'forgiving' is turned on, we will take + // those as well. + if ($this->options & self::OPTION_FORGIVING) { + while(substr($value,-1) === '=') { + // Reading the line + $this->readLine(); + // Grabbing the raw form + $value.="\n" . $this->rawLine; + } + } + + return $value; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parser/Parser.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parser/Parser.php new file mode 100755 index 00000000..22c90a1f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parser/Parser.php @@ -0,0 +1,77 @@ +setInput($input); + } + $this->options = $options; + } + + /** + * This method starts the parsing process. + * + * If the input was not supplied during construction, it's possible to pass + * it here instead. + * + * If either input or options are not supplied, the defaults will be used. + * + * @param mixed $input + * @param int|null $options + * @return array + */ + abstract public function parse($input = null, $options = null); + + /** + * Sets the input data + * + * @param mixed $input + * @return void + */ + abstract public function setInput($input); + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property.php new file mode 100755 index 00000000..0dde8d0d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property.php @@ -0,0 +1,502 @@ +value syntax. + * + * @param Component $root The root document + * @param string $name + * @param string|array|null $value + * @param array $parameters List of parameters + * @param string $group The vcard property group + * @return void + */ + public function __construct(Component $root, $name, $value = null, array $parameters = array(), $group = null) { + + $this->name = $name; + $this->group = $group; + + $this->root = $root; + + if (!is_null($value)) { + $this->setValue($value); + } + + foreach($parameters as $k=>$v) { + $this->add($k, $v); + } + + } + + /** + * Updates the current value. + * + * This may be either a single, or multiple strings in an array. + * + * @param string|array $value + * @return void + */ + public function setValue($value) { + + $this->value = $value; + + } + + /** + * Returns the current value. + * + * This method will always return a singular value. If this was a + * multi-value object, some decision will be made first on how to represent + * it as a string. + * + * To get the correct multi-value version, use getParts. + * + * @return string + */ + public function getValue() { + + if (is_array($this->value)) { + if (count($this->value)==0) { + return null; + } elseif (count($this->value)===1) { + return $this->value[0]; + } else { + return $this->getRawMimeDirValue($this->value); + } + } else { + return $this->value; + } + + } + + /** + * Sets a multi-valued property. + * + * @param array $parts + * @return void + */ + public function setParts(array $parts) { + + $this->value = $parts; + + } + + /** + * Returns a multi-valued property. + * + * This method always returns an array, if there was only a single value, + * it will still be wrapped in an array. + * + * @return array + */ + public function getParts() { + + if (is_null($this->value)) { + return array(); + } elseif (is_array($this->value)) { + return $this->value; + } else { + return array($this->value); + } + + } + + /** + * Adds a new parameter, and returns the new item. + * + * If a parameter with same name already existed, the values will be + * combined. + * If nameless parameter is added, we try to guess it's name. + * + * @param string $name + * @param string|null|array $value + * @return Node + */ + public function add($name, $value = null) { + $noName = false; + if ($name === null) { + $name = Parameter::guessParameterNameByValue($value); + $noName = true; + } + + if (isset($this->parameters[strtoupper($name)])) { + $this->parameters[strtoupper($name)]->addValue($value); + } + else { + $param = new Parameter($this->root, $name, $value); + $param->noName = $noName; + $this->parameters[$param->name] = $param; + } + } + + /** + * Returns an iterable list of children + * + * @return array + */ + public function parameters() { + + return $this->parameters; + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + abstract public function getValueType(); + + /** + * Sets a raw value coming from a mimedir (iCalendar/vCard) file. + * + * This has been 'unfolded', so only 1 line will be passed. Unescaping is + * not yet done, but parameters are not included. + * + * @param string $val + * @return void + */ + abstract public function setRawMimeDirValue($val); + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + abstract public function getRawMimeDirValue(); + + /** + * Turns the object back into a serialized blob. + * + * @return string + */ + public function serialize() { + + $str = $this->name; + if ($this->group) $str = $this->group . '.' . $this->name; + + foreach($this->parameters as $param) { + + $str.=';' . $param->serialize(); + + } + + $str.=':' . $this->getRawMimeDirValue(); + + $out = ''; + while(strlen($str)>0) { + if (strlen($str)>75) { + $out.= mb_strcut($str,0,75,'utf-8') . "\r\n"; + $str = ' ' . mb_strcut($str,75,strlen($str),'utf-8'); + } else { + $out.=$str . "\r\n"; + $str=''; + break; + } + } + + return $out; + + } + + /** + * Returns the value, in the format it should be encoded for json. + * + * This method must always return an array. + * + * @return array + */ + public function getJsonValue() { + + return $this->getParts(); + + } + + /** + * Sets the json value, as it would appear in a jCard or jCal object. + * + * The value must always be an array. + * + * @param array $value + * @return void + */ + public function setJsonValue(array $value) { + + if (count($value)===1) { + $this->setValue(reset($value)); + } else { + $this->setValue($value); + } + + } + + /** + * This method returns an array, with the representation as it should be + * encoded in json. This is used to create jCard or jCal documents. + * + * @return array + */ + public function jsonSerialize() { + + $parameters = array(); + + foreach($this->parameters as $parameter) { + if ($parameter->name === 'VALUE') { + continue; + } + $parameters[strtolower($parameter->name)] = $parameter->jsonSerialize(); + } + // In jCard, we need to encode the property-group as a separate 'group' + // parameter. + if ($this->group) { + $parameters['group'] = $this->group; + } + + return array_merge( + array( + strtolower($this->name), + (object)$parameters, + strtolower($this->getValueType()), + ), + $this->getJsonValue() + ); + } + + + /** + * Called when this object is being cast to a string. + * + * If the property only had a single value, you will get just that. In the + * case the property had multiple values, the contents will be escaped and + * combined with ,. + * + * @return string + */ + public function __toString() { + + return (string)$this->getValue(); + + } + + /* ArrayAccess interface {{{ */ + + /** + * Checks if an array element exists + * + * @param mixed $name + * @return bool + */ + public function offsetExists($name) { + + if (is_int($name)) return parent::offsetExists($name); + + $name = strtoupper($name); + + foreach($this->parameters as $parameter) { + if ($parameter->name == $name) return true; + } + return false; + + } + + /** + * Returns a parameter. + * + * If the parameter does not exist, null is returned. + * + * @param string $name + * @return Node + */ + public function offsetGet($name) { + + if (is_int($name)) return parent::offsetGet($name); + $name = strtoupper($name); + + if (!isset($this->parameters[$name])) { + return null; + } + + return $this->parameters[$name]; + + } + + /** + * Creates a new parameter + * + * @param string $name + * @param mixed $value + * @return void + */ + public function offsetSet($name, $value) { + + if (is_int($name)) { + parent::offsetSet($name, $value); + // @codeCoverageIgnoreStart + // This will never be reached, because an exception is always + // thrown. + return; + // @codeCoverageIgnoreEnd + } + + $param = new Parameter($this->root, $name, $value); + $this->parameters[$param->name] = $param; + + } + + /** + * Removes one or more parameters with the specified name + * + * @param string $name + * @return void + */ + public function offsetUnset($name) { + + if (is_int($name)) { + parent::offsetUnset($name); + // @codeCoverageIgnoreStart + // This will never be reached, because an exception is always + // thrown. + return; + // @codeCoverageIgnoreEnd + } + + unset($this->parameters[strtoupper($name)]); + + } + /* }}} */ + + /** + * This method is automatically called when the object is cloned. + * Specifically, this will ensure all child elements are also cloned. + * + * @return void + */ + public function __clone() { + + foreach($this->parameters as $key=>$child) { + $this->parameters[$key] = clone $child; + $this->parameters[$key]->parent = $this; + } + + } + + /** + * Validates the node for correctness. + * + * The following options are supported: + * - Node::REPAIR - If something is broken, and automatic repair may + * be attempted. + * + * An array is returned with warnings. + * + * Every item in the array has the following properties: + * * level - (number between 1 and 3 with severity information) + * * message - (human readable message) + * * node - (reference to the offending node) + * + * @param int $options + * @return array + */ + public function validate($options = 0) { + + $warnings = array(); + + // Checking if our value is UTF-8 + if (!StringUtil::isUTF8($this->getRawMimeDirValue())) { + $warnings[] = array( + 'level' => 1, + 'message' => 'Property is not valid UTF-8!', + 'node' => $this, + ); + if ($options & self::REPAIR) { + $this->setRawMimeDirValue(StringUtil::convertToUTF8($this->getRawMimeDirValue())); + } + } + + // Checking if the propertyname does not contain any invalid bytes. + if (!preg_match('/^([A-Z0-9-]+)$/', $this->name)) { + $warnings[] = array( + 'level' => 1, + 'message' => 'The propertyname: ' . $this->name . ' contains invalid characters. Only A-Z, 0-9 and - are allowed', + 'node' => $this, + ); + if ($options & self::REPAIR) { + // Uppercasing and converting underscores to dashes. + $this->name = strtoupper( + str_replace('_', '-', $this->name) + ); + // Removing every other invalid character + $this->name = preg_replace('/([^A-Z0-9-])/u', '', $this->name); + + } + + } + + // Validating inner parameters + foreach($this->parameters as $param) { + $warnings = array_merge($warnings, $param->validate($options)); + } + + return $warnings; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Binary.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Binary.php new file mode 100755 index 00000000..2e857c3d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Binary.php @@ -0,0 +1,127 @@ +value = $value[0]; + } else { + throw new \InvalidArgumentException('The argument must either be a string or an array with only one child'); + } + + } else { + + $this->value = $value; + + } + + } + + /** + * Sets a raw value coming from a mimedir (iCalendar/vCard) file. + * + * This has been 'unfolded', so only 1 line will be passed. Unescaping is + * not yet done, but parameters are not included. + * + * @param string $val + * @return void + */ + public function setRawMimeDirValue($val) { + + $this->value = base64_decode($val); + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + return base64_encode($this->value); + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return 'BINARY'; + + } + + /** + * Returns the value, in the format it should be encoded for json. + * + * This method must always return an array. + * + * @return array + */ + public function getJsonValue() { + + return array(base64_encode($this->getValue())); + + } + + /** + * Sets the json value, as it would appear in a jCard or jCal object. + * + * The value must always be an array. + * + * @param array $value + * @return void + */ + public function setJsonValue(array $value) { + + $value = array_map('base64_decode', $value); + parent::setJsonValue($value); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Boolean.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Boolean.php new file mode 100755 index 00000000..75ea0d69 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Boolean.php @@ -0,0 +1,63 @@ +setValue($val); + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + return $this->value?'TRUE':'FALSE'; + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return 'BOOLEAN'; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/FlatText.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/FlatText.php new file mode 100755 index 00000000..57f30cda --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/FlatText.php @@ -0,0 +1,49 @@ +setValue($val); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Float.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Float.php new file mode 100755 index 00000000..02476f8d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Float.php @@ -0,0 +1,101 @@ +delimiter, $val); + foreach($val as &$item) { + $item = (float)$item; + } + $this->setParts($val); + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + return implode( + $this->delimiter, + $this->getParts() + ); + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return "FLOAT"; + + } + + /** + * Returns the value, in the format it should be encoded for json. + * + * This method must always return an array. + * + * @return array + */ + public function getJsonValue() { + + $val = array_map(function($item) { + + return (float)$item; + + }, $this->getParts()); + + // Special-casing the GEO property. + // + // See: + // http://tools.ietf.org/html/draft-ietf-jcardcal-jcal-04#section-3.4.1.2 + if ($this->name==='GEO') { + return array($val); + } else { + return $val; + } + + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/CalAddress.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/CalAddress.php new file mode 100755 index 00000000..e76a302a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/CalAddress.php @@ -0,0 +1,41 @@ +setDateTimes($parts); + } else { + parent::setParts($parts); + } + + } + + /** + * Updates the current value. + * + * This may be either a single, or multiple strings in an array. + * + * Instead of strings, you may also use DateTime here. + * + * @param string|array|\DateTime $value + * @return void + */ + public function setValue($value) { + + if (is_array($value) && isset($value[0]) && $value[0] instanceof \DateTime) { + $this->setDateTimes($value); + } elseif ($value instanceof \DateTime) { + $this->setDateTimes(array($value)); + } else { + parent::setValue($value); + } + + } + + /** + * Sets a raw value coming from a mimedir (iCalendar/vCard) file. + * + * This has been 'unfolded', so only 1 line will be passed. Unescaping is + * not yet done, but parameters are not included. + * + * @param string $val + * @return void + */ + public function setRawMimeDirValue($val) { + + $this->setValue(explode($this->delimiter, $val)); + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + return implode($this->delimiter, $this->getParts()); + + } + + /** + * Returns true if this is a DATE-TIME value, false if it's a DATE. + * + * @return bool + */ + public function hasTime() { + + return strtoupper((string)$this['VALUE']) !== 'DATE'; + + } + + /** + * Returns a date-time value. + * + * Note that if this property contained more than 1 date-time, only the + * first will be returned. To get an array with multiple values, call + * getDateTimes. + * + * @return \DateTime + */ + public function getDateTime() { + + $dt = $this->getDateTimes(); + if (!$dt) return null; + + return $dt[0]; + + } + + /** + * Returns multiple date-time values. + * + * @return \DateTime[] + */ + public function getDateTimes() { + + // Finding the timezone. + $tz = $this['TZID']; + + if ($tz) { + $tz = TimeZoneUtil::getTimeZone((string)$tz, $this->root); + } + + $dts = array(); + foreach($this->getParts() as $part) { + $dts[] = DateTimeParser::parse($part, $tz); + } + return $dts; + + } + + /** + * Sets the property as a DateTime object. + * + * @param \DateTime $dt + * @param bool isFloating If set to true, timezones will be ignored. + * @return void + */ + public function setDateTime(\DateTime $dt, $isFloating = false) { + + $this->setDateTimes(array($dt), $isFloating); + + } + + /** + * Sets the property as multiple date-time objects. + * + * The first value will be used as a reference for the timezones, and all + * the otehr values will be adjusted for that timezone + * + * @param \DateTime[] $dt + * @param bool isFloating If set to true, timezones will be ignored. + * @return void + */ + public function setDateTimes(array $dt, $isFloating = false) { + + $values = array(); + + if($this->hasTime()) { + + $tz = null; + $isUtc = false; + + foreach($dt as $d) { + + if ($isFloating) { + $values[] = $d->format('Ymd\\THis'); + continue; + } + if (is_null($tz)) { + $tz = $d->getTimeZone(); + $isUtc = in_array($tz->getName() , array('UTC', 'GMT', 'Z')); + if (!$isUtc) { + $this->offsetSet('TZID', $tz->getName()); + } + } else { + $d->setTimeZone($tz); + } + + if ($isUtc) { + $values[] = $d->format('Ymd\\THis\\Z'); + } else { + $values[] = $d->format('Ymd\\THis'); + } + + } + if ($isUtc || $isFloating) { + $this->offsetUnset('TZID'); + } + + } else { + + foreach($dt as $d) { + + $values[] = $d->format('Ymd'); + + } + $this->offsetUnset('TZID'); + + } + + $this->value = $values; + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return $this->hasTime()?'DATE-TIME':'DATE'; + + } + + /** + * Returns the value, in the format it should be encoded for json. + * + * This method must always return an array. + * + * @return array + */ + public function getJsonValue() { + + $dts = $this->getDateTimes(); + $hasTime = $this->hasTime(); + + $tz = $dts[0]->getTimeZone(); + $isUtc = in_array($tz->getName() , array('UTC', 'GMT', 'Z')); + + return array_map(function($dt) use ($hasTime, $isUtc) { + + if ($hasTime) { + return $dt->format('Y-m-d\\TH:i:s') . ($isUtc?'Z':''); + } else { + return $dt->format('Y-m-d'); + } + + }, $dts); + + } + + /** + * Sets the json value, as it would appear in a jCard or jCal object. + * + * The value must always be an array. + * + * @param array $value + * @return void + */ + public function setJsonValue(array $value) { + + // dates and times in jCal have one difference to dates and times in + // iCalendar. In jCal date-parts are separated by dashes, and + // time-parts are separated by colons. It makes sense to just remove + // those. + $this->setValue(array_map(function($item) { + + return strtr($item, array(':'=>'', '-'=>'')); + + }, $value)); + + } + /** + * We need to intercept offsetSet, because it may be used to alter the + * VALUE from DATE-TIME to DATE or vice-versa. + * + * @param string $name + * @param mixed $value + * @return void + */ + public function offsetSet($name, $value) { + + parent::offsetSet($name, $value); + if (strtoupper($name)!=='VALUE') { + return; + } + + // This will ensure that dates are correctly encoded. + $this->setDateTimes($this->getDateTimes()); + + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Duration.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Duration.php new file mode 100755 index 00000000..0f251102 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Duration.php @@ -0,0 +1,86 @@ +setValue(explode($this->delimiter, $val)); + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + return implode($this->delimiter, $this->getParts()); + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return 'DURATION'; + + } + + /** + * Returns a DateInterval representation of the Duration property. + * + * If the property has more than one value, only the first is returned. + * + * @return \DateInterval + */ + public function getDateInterval() { + + $parts = $this->getParts(); + $value = $parts[0]; + return DateTimeParser::parseDuration($value); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Period.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Period.php new file mode 100755 index 00000000..67c818c7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Period.php @@ -0,0 +1,126 @@ +setValue(explode($this->delimiter, $val)); + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + return implode($this->delimiter, $this->getParts()); + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return "PERIOD"; + + } + + /** + * Sets the json value, as it would appear in a jCard or jCal object. + * + * The value must always be an array. + * + * @param array $value + * @return void + */ + public function setJsonValue(array $value) { + + $value = array_map(function($item) { + + return strtr(implode('/', $item), array(':' => '', '-' => '')); + + }, $value); + parent::setJsonValue($value); + + } + + /** + * Returns the value, in the format it should be encoded for json. + * + * This method must always return an array. + * + * @return array + */ + public function getJsonValue() { + + $return = array(); + foreach($this->getParts() as $item) { + + list($start, $end) = explode('/', $item, 2); + + $start = DateTimeParser::parseDateTime($start); + + // This is a duration value. + if ($end[0]==='P') { + $return[] = array( + $start->format('Y-m-d\\TH:i:s'), + $end + ); + } else { + $end = DateTimeParser::parseDateTime($end); + $return[] = array( + $start->format('Y-m-d\\TH:i:s'), + $end->format('Y-m-d\\TH:i:s'), + ); + } + + } + + return $return; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Recur.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Recur.php new file mode 100755 index 00000000..98e3f19d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Recur.php @@ -0,0 +1,189 @@ +value array that is accessible using + * getParts, and may be set using setParts. + * + * @copyright Copyright (C) 2007-2013 fruux GmbH. All rights reserved. + * @author Evert Pot (http://evertpot.com/) + * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License + */ +class Recur extends Property { + + /** + * Updates the current value. + * + * This may be either a single, or multiple strings in an array. + * + * @param string|array $value + * @return void + */ + public function setValue($value) { + + // If we're getting the data from json, we'll be receiving an object + if ($value instanceof \StdClass) { + $value = (array)$value; + } + + if (is_array($value)) { + $newVal = array(); + foreach($value as $k=>$v) { + + if (is_string($v)) { + $v = strtoupper($v); + + // The value had multiple sub-values + if (strpos($v,',')!==false) { + $v = explode(',', $v); + } + } else { + $v = array_map('strtoupper', $v); + } + + $newVal[strtoupper($k)] = $v; + } + $this->value = $newVal; + } elseif (is_string($value)) { + $value = strtoupper($value); + $newValue = array(); + foreach(explode(';', $value) as $part) { + + // Skipping empty parts. + if (empty($part)) { + continue; + } + list($partName, $partValue) = explode('=', $part); + + // The value itself had multiple values.. + if (strpos($partValue,',')!==false) { + $partValue=explode(',', $partValue); + } + $newValue[$partName] = $partValue; + + } + $this->value = $newValue; + } else { + throw new \InvalidArgumentException('You must either pass a string, or a key=>value array'); + } + + } + + /** + * Returns the current value. + * + * This method will always return a singular value. If this was a + * multi-value object, some decision will be made first on how to represent + * it as a string. + * + * To get the correct multi-value version, use getParts. + * + * @return string + */ + public function getValue() { + + $out = array(); + foreach($this->value as $key=>$value) { + $out[] = $key . '=' . (is_array($value)?implode(',', $value):$value); + } + return strtoupper(implode(';',$out)); + + } + + /** + * Sets a multi-valued property. + * + * @param array $parts + * @return void + */ + public function setParts(array $parts) { + + $this->setValue($parts); + + } + + /** + * Returns a multi-valued property. + * + * This method always returns an array, if there was only a single value, + * it will still be wrapped in an array. + * + * @return array + */ + public function getParts() { + + return $this->value; + + } + + /** + * Sets a raw value coming from a mimedir (iCalendar/vCard) file. + * + * This has been 'unfolded', so only 1 line will be passed. Unescaping is + * not yet done, but parameters are not included. + * + * @param string $val + * @return void + */ + public function setRawMimeDirValue($val) { + + $this->setValue($val); + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + return $this->getValue(); + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return "RECUR"; + + } + + /** + * Returns the value, in the format it should be encoded for json. + * + * This method must always return an array. + * + * @return array + */ + public function getJsonValue() { + + $values = array(); + foreach($this->getParts() as $k=>$v) { + $values[strtolower($k)] = $v; + } + return array($values); + + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Integer.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Integer.php new file mode 100755 index 00000000..a48c8740 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Integer.php @@ -0,0 +1,72 @@ +setValue((int)$val); + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + return $this->value; + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return "INTEGER"; + + } + + /** + * Returns the value, in the format it should be encoded for json. + * + * This method must always return an array. + * + * @return array + */ + public function getJsonValue() { + + return array((int)$this->getValue()); + + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Text.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Text.php new file mode 100755 index 00000000..b1651e3a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Text.php @@ -0,0 +1,330 @@ + 5, + 'ADR' => 7, + ); + + /** + * Creates the property. + * + * You can specify the parameters either in key=>value syntax, in which case + * parameters will automatically be created, or you can just pass a list of + * Parameter objects. + * + * @param Component $root The root document + * @param string $name + * @param string|array|null $value + * @param array $parameters List of parameters + * @param string $group The vcard property group + * @return void + */ + public function __construct(Component $root, $name, $value = null, array $parameters = array(), $group = null) { + + // There's two types of multi-valued text properties: + // 1. multivalue properties. + // 2. structured value properties + // + // The former is always separated by a comma, the latter by semi-colon. + if (in_array($name, $this->structuredValues)) { + $this->delimiter = ';'; + } + + parent::__construct($root, $name, $value, $parameters, $group); + + } + + + /** + * Sets a raw value coming from a mimedir (iCalendar/vCard) file. + * + * This has been 'unfolded', so only 1 line will be passed. Unescaping is + * not yet done, but parameters are not included. + * + * @param string $val + * @return void + */ + public function setRawMimeDirValue($val) { + + $this->setValue(MimeDir::unescapeValue($val, $this->delimiter)); + + } + + /** + * Sets the value as a quoted-printable encoded string. + * + * @param string $val + * @return void + */ + public function setQuotedPrintableValue($val) { + + $val = quoted_printable_decode($val); + + // Quoted printable only appears in vCard 2.1, and the only character + // that may be escaped there is ;. So we are simply splitting on just + // that. + // + // We also don't have to unescape \\, so all we need to look for is a ; + // that's not preceeded with a \. + $regex = '# (?setValue($matches); + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + $val = $this->getParts(); + + if (isset($this->minimumPropertyValues[$this->name])) { + $val = array_pad($val, $this->minimumPropertyValues[$this->name], ''); + } + + foreach($val as &$item) { + + if (!is_array($item)) { + $item = array($item); + } + + foreach($item as &$subItem) { + $subItem = strtr($subItem, array( + '\\' => '\\\\', + ';' => '\;', + ',' => '\,', + "\n" => '\n', + "\r" => "", + )); + } + $item = implode(',', $item); + + } + + return implode($this->delimiter, $val); + + } + + /** + * Returns the value, in the format it should be encoded for json. + * + * This method must always return an array. + * + * @return array + */ + public function getJsonValue() { + + // Structured text values should always be returned as a single + // array-item. Multi-value text should be returned as multiple items in + // the top-array. + if (in_array($this->name, $this->structuredValues)) { + return array($this->getParts()); + } else { + return $this->getParts(); + } + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return "TEXT"; + + } + + /** + * Turns the object back into a serialized blob. + * + * @return string + */ + public function serialize() { + + // We need to kick in a special type of encoding, if it's a 2.1 vcard. + if ($this->root->getDocumentType() !== Document::VCARD21) { + return parent::serialize(); + } + + $val = $this->getParts(); + + if (isset($this->minimumPropertyValues[$this->name])) { + $val = array_pad($val, $this->minimumPropertyValues[$this->name], ''); + } + + // Imploding multiple parts into a single value, and splitting the + // values with ;. + if (count($val)>1) { + foreach($val as $k=>$v) { + $val[$k] = str_replace(';','\;', $v); + } + $val = implode(';', $val); + } else { + $val = $val[0]; + } + + $str = $this->name; + if ($this->group) $str = $this->group . '.' . $this->name; + foreach($this->parameters as $param) { + + if ($param->getValue() === 'QUOTED-PRINTABLE') { + continue; + } + $str.=';' . $param->serialize(); + + } + + + + // If the resulting value contains a \n, we must encode it as + // quoted-printable. + if (strpos($val,"\n") !== false) { + + $str.=';ENCODING=QUOTED-PRINTABLE:'; + $lastLine=$str; + $out = null; + + // The PHP built-in quoted-printable-encode does not correctly + // encode newlines for us. Specifically, the \r\n sequence must in + // vcards be encoded as =0D=OA and we must insert soft-newlines + // every 75 bytes. + for($ii=0;$ii= 32 && $ord <=126) { + $lastLine.=$val[$ii]; + } else { + $lastLine.='=' . strtoupper(bin2hex($val[$ii])); + } + if (strlen($lastLine)>=75) { + // Soft line break + $out.=$lastLine. "=\r\n "; + $lastLine = null; + } + + } + if (!is_null($lastLine)) $out.= $lastLine . "\r\n"; + return $out; + + } else { + $str.=':' . $val; + $out = ''; + while(strlen($str)>0) { + if (strlen($str)>75) { + $out.= mb_strcut($str,0,75,'utf-8') . "\r\n"; + $str = ' ' . mb_strcut($str,75,strlen($str),'utf-8'); + } else { + $out.=$str . "\r\n"; + $str=''; + break; + } + } + + return $out; + + + } + + } + + /** + * Validates the node for correctness. + * + * The following options are supported: + * - Node::REPAIR - If something is broken, and automatic repair may + * be attempted. + * + * An array is returned with warnings. + * + * Every item in the array has the following properties: + * * level - (number between 1 and 3 with severity information) + * * message - (human readable message) + * * node - (reference to the offending node) + * + * @param int $options + * @return array + */ + public function validate($options = 0) { + + $warnings = parent::validate($options); + + if (isset($this->minimumPropertyValues[$this->name])) { + + $minimum = $this->minimumPropertyValues[$this->name]; + $parts = $this->getParts(); + if (count($parts) < $minimum) { + $warnings[] = array( + 'level' => 1, + 'message' => 'This property must have at least ' . $minimum . ' components. It only has ' . count($parts), + 'node' => $this, + ); + if ($options & self::REPAIR) { + $parts = array_pad($parts, $minimum, ''); + $this->setParts($parts); + } + } + + } + return $warnings; + + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Time.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Time.php new file mode 100755 index 00000000..394e37f6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Time.php @@ -0,0 +1,94 @@ +getValue()); + + $timeStr = ''; + + // Hour + if (!is_null($parts['hour'])) { + $timeStr.=$parts['hour']; + + if (!is_null($parts['minute'])) { + $timeStr.=':'; + } + } else { + // We know either minute or second _must_ be set, so we insert a + // dash for an empty value. + $timeStr.='-'; + } + + // Minute + if (!is_null($parts['minute'])) { + $timeStr.=$parts['minute']; + + if (!is_null($parts['second'])) { + $timeStr.=':'; + } + } else { + if (isset($parts['second'])) { + // Dash for empty minute + $timeStr.='-'; + } + } + + // Second + if (!is_null($parts['second'])) { + $timeStr.=$parts['second']; + } + + // Timezone + if (!is_null($parts['timezone'])) { + $timeStr.=$parts['timezone']; + } + + return array($timeStr); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Unknown.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Unknown.php new file mode 100755 index 00000000..c2a49515 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Unknown.php @@ -0,0 +1,50 @@ +getRawMimeDirValue()); + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return "UNKNOWN"; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Uri.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Uri.php new file mode 100755 index 00000000..b6107808 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Uri.php @@ -0,0 +1,70 @@ +value = $val; + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + if (is_array($this->value)) { + return $this->value[0]; + } else { + return $this->value; + } + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/UtcOffset.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/UtcOffset.php new file mode 100755 index 00000000..f2d0d170 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/UtcOffset.php @@ -0,0 +1,37 @@ +getValue()); + + $dateStr = ''; + + // Year + if (!is_null($parts['year'])) { + $dateStr.=$parts['year']; + + if (!is_null($parts['month'])) { + // If a year and a month is set, we need to insert a separator + // dash. + $dateStr.='-'; + } + + } else { + + if (!is_null($parts['month']) || !is_null($parts['date'])) { + // Inserting two dashes + $dateStr.='--'; + } + + } + + // Month + + if (!is_null($parts['month'])) { + $dateStr.=$parts['month']; + + if (isset($parts['date'])) { + // If month and date are set, we need the separator dash. + $dateStr.='-'; + } + } else { + if (isset($parts['date'])) { + // If the month is empty, and a date is set, we need a 'empty + // dash' + $dateStr.='-'; + } + } + + // Date + if (!is_null($parts['date'])) { + $dateStr.=$parts['date']; + } + + + // Early exit if we don't have a time string. + if (is_null($parts['hour']) && is_null($parts['minute']) && is_null($parts['second'])) { + return array($dateStr); + } + + $dateStr.='T'; + + // Hour + if (!is_null($parts['hour'])) { + $dateStr.=$parts['hour']; + + if (!is_null($parts['minute'])) { + $dateStr.=':'; + } + } else { + // We know either minute or second _must_ be set, so we insert a + // dash for an empty value. + $dateStr.='-'; + } + + // Minute + if (!is_null($parts['minute'])) { + $dateStr.=$parts['minute']; + + if (!is_null($parts['second'])) { + $dateStr.=':'; + } + } else { + if (isset($parts['second'])) { + // Dash for empty minute + $dateStr.='-'; + } + } + + // Second + if (!is_null($parts['second'])) { + $dateStr.=$parts['second']; + } + + // Timezone + if (!is_null($parts['timezone'])) { + $dateStr.=$parts['timezone']; + } + + return array($dateStr); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/DateTime.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/DateTime.php new file mode 100755 index 00000000..ae8ffd3f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/DateTime.php @@ -0,0 +1,33 @@ +setValue($val); + + } + + /** + * Returns a raw mime-dir representation of the value. + * + * @return string + */ + public function getRawMimeDirValue() { + + return $this->value; + + } + + /** + * Returns the type of value. + * + * This corresponds to the VALUE= parameter. Every property also has a + * 'default' valueType. + * + * @return string + */ + public function getValueType() { + + return "LANGUAGE-TAG"; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/TimeStamp.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/TimeStamp.php new file mode 100755 index 00000000..00522dc3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/TimeStamp.php @@ -0,0 +1,69 @@ +getValue()); + + $dateStr = + $parts['year'] . '-' . + $parts['month'] . '-' . + $parts['date'] . 'T' . + $parts['hour'] . ':' . + $parts['minute'] . ':' . + $parts['second']; + + // Timezone + if (!is_null($parts['timezone'])) { + $dateStr.=$parts['timezone']; + } + + return array($dateStr); + + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Reader.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Reader.php new file mode 100755 index 00000000..89432f1f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Reader.php @@ -0,0 +1,73 @@ +parse($data, $options); + + return $result; + + } + + /** + * Parses a jCard or jCal object, and returns the top component. + * + * The options argument is a bitfield. Pass any of the OPTIONS constant to + * alter the parsers' behaviour. + * + * You can either a string, a readable stream, or an array for it's input. + * Specifying the array is useful if json_decode was already called on the + * input. + * + * @param string|resource|array $data + * @param int $options + * @return Node + */ + static function readJson($data, $options = 0) { + + $parser = new Parser\Json(); + $result = $parser->parse($data, $options); + + return $result; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/RecurrenceIterator.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/RecurrenceIterator.php new file mode 100755 index 00000000..5d6d8e2b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/RecurrenceIterator.php @@ -0,0 +1,1153 @@ + 0, + 'MO' => 1, + 'TU' => 2, + 'WE' => 3, + 'TH' => 4, + 'FR' => 5, + 'SA' => 6, + ); + + /** + * Mappings between the day number and english day name. + * + * @var array + */ + private $dayNames = array( + 0 => 'Sunday', + 1 => 'Monday', + 2 => 'Tuesday', + 3 => 'Wednesday', + 4 => 'Thursday', + 5 => 'Friday', + 6 => 'Saturday', + ); + + /** + * If the current iteration of the event is an overriden event, this + * property will hold the VObject + * + * @var Component + */ + private $currentOverriddenEvent; + + /** + * This property may contain the date of the next not-overridden event. + * This date is calculated sometimes a bit early, before overridden events + * are evaluated. + * + * @var DateTime + */ + private $nextDate; + + /** + * This counts the number of overridden events we've handled so far + * + * @var int + */ + private $handledOverridden = 0; + + /** + * Creates the iterator + * + * You should pass a VCALENDAR component, as well as the UID of the event + * we're going to traverse. + * + * @param Component $vcal + * @param string|null $uid + */ + public function __construct(Component $vcal, $uid=null) { + + if (is_null($uid)) { + if ($vcal instanceof Component\VCalendar) { + throw new \InvalidArgumentException('If you pass a VCALENDAR object, you must pass a uid argument as well'); + } + $components = array($vcal); + $uid = (string)$vcal->uid; + } else { + $components = $vcal->select('VEVENT'); + } + foreach($components as $component) { + if ((string)$component->uid == $uid) { + if (isset($component->{'RECURRENCE-ID'})) { + $this->overriddenEvents[$component->DTSTART->getDateTime()->getTimeStamp()] = $component; + $this->overriddenDates[] = $component->{'RECURRENCE-ID'}->getDateTime(); + } else { + $this->baseEvent = $component; + } + } + } + + ksort($this->overriddenEvents); + + if (!$this->baseEvent) { + // No base event was found. CalDAV does allow cases where only + // overridden instances are stored. + // + // In this barticular case, we're just going to grab the first + // event and use that instead. This may not always give the + // desired result. + if (!count($this->overriddenEvents)) { + throw new \InvalidArgumentException('Could not find an event with uid: ' . $uid); + } + ksort($this->overriddenEvents, SORT_NUMERIC); + $this->baseEvent = array_shift($this->overriddenEvents); + } + + $this->startDate = clone $this->baseEvent->DTSTART->getDateTime(); + + $this->endDate = null; + if (isset($this->baseEvent->DTEND)) { + $this->endDate = clone $this->baseEvent->DTEND->getDateTime(); + } else { + $this->endDate = clone $this->startDate; + if (isset($this->baseEvent->DURATION)) { + $this->endDate->add(DateTimeParser::parse((string)$this->baseEvent->DURATION)); + } elseif (!$this->baseEvent->DTSTART->hasTime()) { + $this->endDate->modify('+1 day'); + } + } + $this->currentDate = clone $this->startDate; + + $rrule = $this->baseEvent->RRULE; + + // If no rrule was specified, we create a default setting + if (!$rrule) { + $this->frequency = 'daily'; + $this->count = 1; + } else foreach($rrule->getParts() as $key=>$value) { + + switch($key) { + + case 'FREQ' : + if (!in_array( + strtolower($value), + array('secondly','minutely','hourly','daily','weekly','monthly','yearly') + )) { + throw new \InvalidArgumentException('Unknown value for FREQ=' . strtoupper($value)); + + } + $this->frequency = strtolower($value); + break; + + case 'UNTIL' : + $this->until = DateTimeParser::parse($value); + + // In some cases events are generated with an UNTIL= + // parameter before the actual start of the event. + // + // Not sure why this is happening. We assume that the + // intention was that the event only recurs once. + // + // So we are modifying the parameter so our code doesn't + // break. + if($this->until < $this->baseEvent->DTSTART->getDateTime()) { + $this->until = $this->baseEvent->DTSTART->getDateTime(); + } + break; + + case 'COUNT' : + $this->count = (int)$value; + break; + + case 'INTERVAL' : + $this->interval = (int)$value; + if ($this->interval < 1) { + throw new \InvalidArgumentException('INTERVAL in RRULE must be a positive integer!'); + } + break; + + case 'BYSECOND' : + $this->bySecond = (array)$value; + break; + + case 'BYMINUTE' : + $this->byMinute = (array)$value; + break; + + case 'BYHOUR' : + $this->byHour = (array)$value; + break; + + case 'BYDAY' : + $this->byDay = (array)$value; + break; + + case 'BYMONTHDAY' : + $this->byMonthDay = (array)$value; + break; + + case 'BYYEARDAY' : + $this->byYearDay = (array)$value; + break; + + case 'BYWEEKNO' : + $this->byWeekNo = (array)$value; + break; + + case 'BYMONTH' : + $this->byMonth = (array)$value; + break; + + case 'BYSETPOS' : + $this->bySetPos = (array)$value; + break; + + case 'WKST' : + $this->weekStart = strtoupper($value); + break; + + } + + } + + // Parsing exception dates + if (isset($this->baseEvent->EXDATE)) { + foreach($this->baseEvent->EXDATE as $exDate) { + + foreach(explode(',', (string)$exDate) as $exceptionDate) { + + $this->exceptionDates[] = + DateTimeParser::parse($exceptionDate, $this->startDate->getTimeZone()); + + } + + } + + } + + } + + /** + * Returns the current item in the list + * + * @return DateTime + */ + public function current() { + + if (!$this->valid()) return null; + return clone $this->currentDate; + + } + + /** + * This method returns the startdate for the current iteration of the + * event. + * + * @return DateTime + */ + public function getDtStart() { + + if (!$this->valid()) return null; + return clone $this->currentDate; + + } + + /** + * This method returns the enddate for the current iteration of the + * event. + * + * @return DateTime + */ + public function getDtEnd() { + + if (!$this->valid()) return null; + $dtEnd = clone $this->currentDate; + $dtEnd->add( $this->startDate->diff( $this->endDate ) ); + return clone $dtEnd; + + } + + /** + * Returns a VEVENT object with the updated start and end date. + * + * Any recurrence information is removed, and this function may return an + * 'overridden' event instead. + * + * This method always returns a cloned instance. + * + * @return Component\VEvent + */ + public function getEventObject() { + + if ($this->currentOverriddenEvent) { + return clone $this->currentOverriddenEvent; + } + $event = clone $this->baseEvent; + unset($event->RRULE); + unset($event->EXDATE); + unset($event->RDATE); + unset($event->EXRULE); + + $event->DTSTART->setDateTime($this->getDTStart()); + if (isset($event->DTEND)) { + $event->DTEND->setDateTime($this->getDtEnd()); + } + if ($this->counter > 0) { + $event->{'RECURRENCE-ID'} = (string)$event->DTSTART; + } + + return $event; + + } + + /** + * Returns the current item number + * + * @return int + */ + public function key() { + + return $this->counter; + + } + + /** + * Whether or not there is a 'next item' + * + * @return bool + */ + public function valid() { + + if (!is_null($this->count)) { + return $this->counter < $this->count; + } + if (!is_null($this->until) && $this->currentDate > $this->until) { + + // Need to make sure there's no overridden events past the + // until date. + foreach($this->overriddenEvents as $overriddenEvent) { + + if ($overriddenEvent->DTSTART->getDateTime() >= $this->currentDate) { + + return true; + } + } + return false; + } + return true; + + } + + /** + * Resets the iterator + * + * @return void + */ + public function rewind() { + + $this->currentDate = clone $this->startDate; + $this->counter = 0; + + } + + /** + * This method allows you to quickly go to the next occurrence after the + * specified date. + * + * Note that this checks the current 'endDate', not the 'stardDate'. This + * means that if you forward to January 1st, the iterator will stop at the + * first event that ends *after* January 1st. + * + * @param DateTime $dt + * @return void + */ + public function fastForward(\DateTime $dt) { + + while($this->valid() && $this->getDTEnd() <= $dt) { + $this->next(); + } + + } + + /** + * Returns true if this recurring event never ends. + * + * @return bool + */ + public function isInfinite() { + + return !$this->count && !$this->until; + + } + + /** + * Goes on to the next iteration + * + * @return void + */ + public function next() { + + $previousStamp = $this->currentDate->getTimeStamp(); + + // Finding the next overridden event in line, and storing that for + // later use. + $overriddenEvent = null; + $overriddenDate = null; + $this->currentOverriddenEvent = null; + + foreach($this->overriddenEvents as $index=>$event) { + if ($index > $previousStamp) { + $overriddenEvent = $event; + $overriddenDate = clone $event->DTSTART->getDateTime(); + break; + } + } + + // If we have a stored 'next date', we will use that. + if ($this->nextDate) { + if (!$overriddenDate || $this->nextDate < $overriddenDate) { + $this->currentDate = $this->nextDate; + $currentStamp = $this->currentDate->getTimeStamp(); + $this->nextDate = null; + } else { + $this->currentDate = clone $overriddenDate; + $this->currentOverriddenEvent = $overriddenEvent; + } + $this->counter++; + return; + } + + while(true) { + + // Otherwise, we find the next event in the normal RRULE + // sequence. + switch($this->frequency) { + + case 'hourly' : + $this->nextHourly(); + break; + + case 'daily' : + $this->nextDaily(); + break; + + case 'weekly' : + $this->nextWeekly(); + break; + + case 'monthly' : + $this->nextMonthly(); + break; + + case 'yearly' : + $this->nextYearly(); + break; + + } + $currentStamp = $this->currentDate->getTimeStamp(); + + + // Checking exception dates + foreach($this->exceptionDates as $exceptionDate) { + if ($this->currentDate == $exceptionDate) { + $this->counter++; + continue 2; + } + } + foreach($this->overriddenDates as $check) { + if ($this->currentDate == $check) { + continue 2; + } + } + break; + + } + + + + // Is the date we have actually higher than the next overiddenEvent? + if ($overriddenDate && $this->currentDate > $overriddenDate) { + $this->nextDate = clone $this->currentDate; + $this->currentDate = clone $overriddenDate; + $this->currentOverriddenEvent = $overriddenEvent; + $this->handledOverridden++; + } + $this->counter++; + + + /* + * If we have overridden events left in the queue, but our counter is + * running out, we should grab one of those. + */ + if (!is_null($overriddenEvent) && !is_null($this->count) && count($this->overriddenEvents) - $this->handledOverridden >= ($this->count - $this->counter)) { + + $this->currentOverriddenEvent = $overriddenEvent; + $this->currentDate = clone $overriddenDate; + $this->handledOverridden++; + + } + + } + + /** + * Does the processing for advancing the iterator for hourly frequency. + * + * @return void + */ + protected function nextHourly() { + + if (!$this->byHour) { + $this->currentDate->modify('+' . $this->interval . ' hours'); + return; + } + // @codeCoverageIgnoreStart + } + // @codeCoverageIgnoreEnd + + /** + * Does the processing for advancing the iterator for daily frequency. + * + * @return void + */ + protected function nextDaily() { + + if (!$this->byHour && !$this->byDay) { + $this->currentDate->modify('+' . $this->interval . ' days'); + return; + } + + if (isset($this->byHour)) { + $recurrenceHours = $this->getHours(); + } + + if (isset($this->byDay)) { + $recurrenceDays = $this->getDays(); + } + + do { + + if ($this->byHour) { + if ($this->currentDate->format('G') == '23') { + // to obey the interval rule + $this->currentDate->modify('+' . $this->interval-1 . ' days'); + } + + $this->currentDate->modify('+1 hours'); + + } else { + $this->currentDate->modify('+' . $this->interval . ' days'); + + } + + // Current day of the week + $currentDay = $this->currentDate->format('w'); + + // Current hour of the day + $currentHour = $this->currentDate->format('G'); + + } while (($this->byDay && !in_array($currentDay, $recurrenceDays)) || ($this->byHour && !in_array($currentHour, $recurrenceHours))); + + } + + /** + * Does the processing for advancing the iterator for weekly frequency. + * + * @return void + */ + protected function nextWeekly() { + + if (!$this->byHour && !$this->byDay) { + $this->currentDate->modify('+' . $this->interval . ' weeks'); + return; + } + + if ($this->byHour) { + $recurrenceHours = $this->getHours(); + } + + if ($this->byDay) { + $recurrenceDays = $this->getDays(); + } + + // First day of the week: + $firstDay = $this->dayMap[$this->weekStart]; + + do { + + if ($this->byHour) { + $this->currentDate->modify('+1 hours'); + } else { + $this->currentDate->modify('+1 days'); + } + + // Current day of the week + $currentDay = (int) $this->currentDate->format('w'); + + // Current hour of the day + $currentHour = (int) $this->currentDate->format('G'); + + // We need to roll over to the next week + if ($currentDay === $firstDay && (!$this->byHour || $currentHour == '0')) { + $this->currentDate->modify('+' . $this->interval-1 . ' weeks'); + + // We need to go to the first day of this week, but only if we + // are not already on this first day of this week. + if($this->currentDate->format('w') != $firstDay) { + $this->currentDate->modify('last ' . $this->dayNames[$this->dayMap[$this->weekStart]]); + } + } + + // We have a match + } while (($this->byDay && !in_array($currentDay, $recurrenceDays)) || ($this->byHour && !in_array($currentHour, $recurrenceHours))); + } + + /** + * Does the processing for advancing the iterator for monthly frequency. + * + * @return void + */ + protected function nextMonthly() { + + $currentDayOfMonth = $this->currentDate->format('j'); + if (!$this->byMonthDay && !$this->byDay) { + + // If the current day is higher than the 28th, rollover can + // occur to the next month. We Must skip these invalid + // entries. + if ($currentDayOfMonth < 29) { + $this->currentDate->modify('+' . $this->interval . ' months'); + } else { + $increase = 0; + do { + $increase++; + $tempDate = clone $this->currentDate; + $tempDate->modify('+ ' . ($this->interval*$increase) . ' months'); + } while ($tempDate->format('j') != $currentDayOfMonth); + $this->currentDate = $tempDate; + } + return; + } + + while(true) { + + $occurrences = $this->getMonthlyOccurrences(); + + foreach($occurrences as $occurrence) { + + // The first occurrence thats higher than the current + // day of the month wins. + if ($occurrence > $currentDayOfMonth) { + break 2; + } + + } + + // If we made it all the way here, it means there were no + // valid occurrences, and we need to advance to the next + // month. + $this->currentDate->modify('first day of this month'); + $this->currentDate->modify('+ ' . $this->interval . ' months'); + + // This goes to 0 because we need to start counting at hte + // beginning. + $currentDayOfMonth = 0; + + } + + $this->currentDate->setDate($this->currentDate->format('Y'), $this->currentDate->format('n'), $occurrence); + + } + + /** + * Does the processing for advancing the iterator for yearly frequency. + * + * @return void + */ + protected function nextYearly() { + + $currentMonth = $this->currentDate->format('n'); + $currentYear = $this->currentDate->format('Y'); + $currentDayOfMonth = $this->currentDate->format('j'); + + // No sub-rules, so we just advance by year + if (!$this->byMonth) { + + // Unless it was a leap day! + if ($currentMonth==2 && $currentDayOfMonth==29) { + + $counter = 0; + do { + $counter++; + // Here we increase the year count by the interval, until + // we hit a date that's also in a leap year. + // + // We could just find the next interval that's dividable by + // 4, but that would ignore the rule that there's no leap + // year every year that's dividable by a 100, but not by + // 400. (1800, 1900, 2100). So we just rely on the datetime + // functions instead. + $nextDate = clone $this->currentDate; + $nextDate->modify('+ ' . ($this->interval*$counter) . ' years'); + } while ($nextDate->format('n')!=2); + $this->currentDate = $nextDate; + + return; + + } + + // The easiest form + $this->currentDate->modify('+' . $this->interval . ' years'); + return; + + } + + $currentMonth = $this->currentDate->format('n'); + $currentYear = $this->currentDate->format('Y'); + $currentDayOfMonth = $this->currentDate->format('j'); + + $advancedToNewMonth = false; + + // If we got a byDay or getMonthDay filter, we must first expand + // further. + if ($this->byDay || $this->byMonthDay) { + + while(true) { + + $occurrences = $this->getMonthlyOccurrences(); + + foreach($occurrences as $occurrence) { + + // The first occurrence that's higher than the current + // day of the month wins. + // If we advanced to the next month or year, the first + // occurrence is always correct. + if ($occurrence > $currentDayOfMonth || $advancedToNewMonth) { + break 2; + } + + } + + // If we made it here, it means we need to advance to + // the next month or year. + $currentDayOfMonth = 1; + $advancedToNewMonth = true; + do { + + $currentMonth++; + if ($currentMonth>12) { + $currentYear+=$this->interval; + $currentMonth = 1; + } + } while (!in_array($currentMonth, $this->byMonth)); + + $this->currentDate->setDate($currentYear, $currentMonth, $currentDayOfMonth); + + } + + // If we made it here, it means we got a valid occurrence + $this->currentDate->setDate($currentYear, $currentMonth, $occurrence); + return; + + } else { + + // These are the 'byMonth' rules, if there are no byDay or + // byMonthDay sub-rules. + do { + + $currentMonth++; + if ($currentMonth>12) { + $currentYear+=$this->interval; + $currentMonth = 1; + } + } while (!in_array($currentMonth, $this->byMonth)); + $this->currentDate->setDate($currentYear, $currentMonth, $currentDayOfMonth); + + return; + + } + + } + + /** + * Returns all the occurrences for a monthly frequency with a 'byDay' or + * 'byMonthDay' expansion for the current month. + * + * The returned list is an array of integers with the day of month (1-31). + * + * @return array + */ + protected function getMonthlyOccurrences() { + + $startDate = clone $this->currentDate; + + $byDayResults = array(); + + // Our strategy is to simply go through the byDays, advance the date to + // that point and add it to the results. + if ($this->byDay) foreach($this->byDay as $day) { + + $dayName = $this->dayNames[$this->dayMap[substr($day,-2)]]; + + // Dayname will be something like 'wednesday'. Now we need to find + // all wednesdays in this month. + $dayHits = array(); + + $checkDate = clone $startDate; + $checkDate->modify('first day of this month'); + $checkDate->modify($dayName); + + do { + $dayHits[] = $checkDate->format('j'); + $checkDate->modify('next ' . $dayName); + } while ($checkDate->format('n') === $startDate->format('n')); + + // So now we have 'all wednesdays' for month. It is however + // possible that the user only really wanted the 1st, 2nd or last + // wednesday. + if (strlen($day)>2) { + $offset = (int)substr($day,0,-2); + + if ($offset>0) { + // It is possible that the day does not exist, such as a + // 5th or 6th wednesday of the month. + if (isset($dayHits[$offset-1])) { + $byDayResults[] = $dayHits[$offset-1]; + } + } else { + + // if it was negative we count from the end of the array + $byDayResults[] = $dayHits[count($dayHits) + $offset]; + } + } else { + // There was no counter (first, second, last wednesdays), so we + // just need to add the all to the list). + $byDayResults = array_merge($byDayResults, $dayHits); + + } + + } + + $byMonthDayResults = array(); + if ($this->byMonthDay) foreach($this->byMonthDay as $monthDay) { + + // Removing values that are out of range for this month + if ($monthDay > $startDate->format('t') || + $monthDay < 0-$startDate->format('t')) { + continue; + } + if ($monthDay>0) { + $byMonthDayResults[] = $monthDay; + } else { + // Negative values + $byMonthDayResults[] = $startDate->format('t') + 1 + $monthDay; + } + } + + // If there was just byDay or just byMonthDay, they just specify our + // (almost) final list. If both were provided, then byDay limits the + // list. + if ($this->byMonthDay && $this->byDay) { + $result = array_intersect($byMonthDayResults, $byDayResults); + } elseif ($this->byMonthDay) { + $result = $byMonthDayResults; + } else { + $result = $byDayResults; + } + $result = array_unique($result); + sort($result, SORT_NUMERIC); + + // The last thing that needs checking is the BYSETPOS. If it's set, it + // means only certain items in the set survive the filter. + if (!$this->bySetPos) { + return $result; + } + + $filteredResult = array(); + foreach($this->bySetPos as $setPos) { + + if ($setPos<0) { + $setPos = count($result)-($setPos+1); + } + if (isset($result[$setPos-1])) { + $filteredResult[] = $result[$setPos-1]; + } + } + + sort($filteredResult, SORT_NUMERIC); + return $filteredResult; + + } + + protected function getHours() + { + $recurrenceHours = array(); + foreach($this->byHour as $byHour) { + $recurrenceHours[] = $byHour; + } + + return $recurrenceHours; + } + + protected function getDays() + { + $recurrenceDays = array(); + foreach($this->byDay as $byDay) { + + // The day may be preceeded with a positive (+n) or + // negative (-n) integer. However, this does not make + // sense in 'weekly' so we ignore it here. + $recurrenceDays[] = $this->dayMap[substr($byDay,-2)]; + + } + + return $recurrenceDays; + } +} + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Splitter/ICalendar.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Splitter/ICalendar.php new file mode 100755 index 00000000..eb5db80b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Splitter/ICalendar.php @@ -0,0 +1,114 @@ +children() as $component) { + if (!$component instanceof VObject\Component) { + continue; + } + + // Get all timezones + if ($component->name === 'VTIMEZONE') { + $this->vtimezones[(string)$component->TZID] = $component; + continue; + } + + // Get component UID for recurring Events search + if($component->UID) { + $uid = (string)$component->UID; + } else { + // Generating a random UID + $uid = sha1(microtime()) . '-vobjectimport'; + } + + // Take care of recurring events + if (!array_key_exists($uid, $this->objects)) { + $this->objects[$uid] = new VCalendar(); + } + + $this->objects[$uid]->add(clone $component); + } + + } + + /** + * Every time getNext() is called, a new object will be parsed, until we + * hit the end of the stream. + * + * When the end is reached, null will be returned. + * + * @return SabreForRainLoop\VObject\Component|null + */ + public function getNext() { + + if($object=array_shift($this->objects)) { + + // create our baseobject + $object->version = '2.0'; + $object->prodid = '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN'; + $object->calscale = 'GREGORIAN'; + + // add vtimezone information to obj (if we have it) + foreach ($this->vtimezones as $vtimezone) { + $object->add($vtimezone); + } + + return $object; + + } else { + + return null; + + } + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Splitter/SplitterInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Splitter/SplitterInterface.php new file mode 100755 index 00000000..116da8af --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Splitter/SplitterInterface.php @@ -0,0 +1,39 @@ +input = $input; + $this->parser = new MimeDir($input, $options); + + } + + /** + * Every time getNext() is called, a new object will be parsed, until we + * hit the end of the stream. + * + * When the end is reached, null will be returned. + * + * @return SabreForRainLoop\VObject\Component|null + */ + public function getNext() { + + try { + $object = $this->parser->parse(); + } catch (VObject\EofException $e) { + return null; + } + + return $object; + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/StringUtil.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/StringUtil.php new file mode 100755 index 00000000..39011373 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/StringUtil.php @@ -0,0 +1,61 @@ +'Australia/Darwin', + 'AUS Eastern Standard Time'=>'Australia/Sydney', + 'Afghanistan Standard Time'=>'Asia/Kabul', + 'Alaskan Standard Time'=>'America/Anchorage', + 'Arab Standard Time'=>'Asia/Riyadh', + 'Arabian Standard Time'=>'Asia/Dubai', + 'Arabic Standard Time'=>'Asia/Baghdad', + 'Argentina Standard Time'=>'America/Buenos_Aires', + 'Armenian Standard Time'=>'Asia/Yerevan', + 'Atlantic Standard Time'=>'America/Halifax', + 'Azerbaijan Standard Time'=>'Asia/Baku', + 'Azores Standard Time'=>'Atlantic/Azores', + 'Bangladesh Standard Time'=>'Asia/Dhaka', + 'Canada Central Standard Time'=>'America/Regina', + 'Cape Verde Standard Time'=>'Atlantic/Cape_Verde', + 'Caucasus Standard Time'=>'Asia/Yerevan', + 'Cen. Australia Standard Time'=>'Australia/Adelaide', + 'Central America Standard Time'=>'America/Guatemala', + 'Central Asia Standard Time'=>'Asia/Almaty', + 'Central Brazilian Standard Time'=>'America/Cuiaba', + 'Central Europe Standard Time'=>'Europe/Budapest', + 'Central European Standard Time'=>'Europe/Warsaw', + 'Central Pacific Standard Time'=>'Pacific/Guadalcanal', + 'Central Standard Time'=>'America/Chicago', + 'Central Standard Time (Mexico)'=>'America/Mexico_City', + 'China Standard Time'=>'Asia/Shanghai', + 'Dateline Standard Time'=>'Etc/GMT+12', + 'E. Africa Standard Time'=>'Africa/Nairobi', + 'E. Australia Standard Time'=>'Australia/Brisbane', + 'E. Europe Standard Time'=>'Europe/Minsk', + 'E. South America Standard Time'=>'America/Sao_Paulo', + 'Eastern Standard Time'=>'America/New_York', + 'Egypt Standard Time'=>'Africa/Cairo', + 'Ekaterinburg Standard Time'=>'Asia/Yekaterinburg', + 'FLE Standard Time'=>'Europe/Kiev', + 'Fiji Standard Time'=>'Pacific/Fiji', + 'GMT Standard Time'=>'Europe/London', + 'GTB Standard Time'=>'Europe/Istanbul', + 'Georgian Standard Time'=>'Asia/Tbilisi', + 'Greenland Standard Time'=>'America/Godthab', + 'Greenwich Standard Time'=>'Atlantic/Reykjavik', + 'Hawaiian Standard Time'=>'Pacific/Honolulu', + 'India Standard Time'=>'Asia/Calcutta', + 'Iran Standard Time'=>'Asia/Tehran', + 'Israel Standard Time'=>'Asia/Jerusalem', + 'Jordan Standard Time'=>'Asia/Amman', + 'Kamchatka Standard Time'=>'Asia/Kamchatka', + 'Korea Standard Time'=>'Asia/Seoul', + 'Magadan Standard Time'=>'Asia/Magadan', + 'Mauritius Standard Time'=>'Indian/Mauritius', + 'Mexico Standard Time'=>'America/Mexico_City', + 'Mexico Standard Time 2'=>'America/Chihuahua', + 'Mid-Atlantic Standard Time'=>'Etc/GMT-2', + 'Middle East Standard Time'=>'Asia/Beirut', + 'Montevideo Standard Time'=>'America/Montevideo', + 'Morocco Standard Time'=>'Africa/Casablanca', + 'Mountain Standard Time'=>'America/Denver', + 'Mountain Standard Time (Mexico)'=>'America/Chihuahua', + 'Myanmar Standard Time'=>'Asia/Rangoon', + 'N. Central Asia Standard Time'=>'Asia/Novosibirsk', + 'Namibia Standard Time'=>'Africa/Windhoek', + 'Nepal Standard Time'=>'Asia/Katmandu', + 'New Zealand Standard Time'=>'Pacific/Auckland', + 'Newfoundland Standard Time'=>'America/St_Johns', + 'North Asia East Standard Time'=>'Asia/Irkutsk', + 'North Asia Standard Time'=>'Asia/Krasnoyarsk', + 'Pacific SA Standard Time'=>'America/Santiago', + 'Pacific Standard Time'=>'America/Los_Angeles', + 'Pacific Standard Time (Mexico)'=>'America/Santa_Isabel', + 'Pakistan Standard Time'=>'Asia/Karachi', + 'Paraguay Standard Time'=>'America/Asuncion', + 'Romance Standard Time'=>'Europe/Paris', + 'Russian Standard Time'=>'Europe/Moscow', + 'SA Eastern Standard Time'=>'America/Cayenne', + 'SA Pacific Standard Time'=>'America/Bogota', + 'SA Western Standard Time'=>'America/La_Paz', + 'SE Asia Standard Time'=>'Asia/Bangkok', + 'Samoa Standard Time'=>'Pacific/Apia', + 'Singapore Standard Time'=>'Asia/Singapore', + 'South Africa Standard Time'=>'Africa/Johannesburg', + 'Sri Lanka Standard Time'=>'Asia/Colombo', + 'Syria Standard Time'=>'Asia/Damascus', + 'Taipei Standard Time'=>'Asia/Taipei', + 'Tasmania Standard Time'=>'Australia/Hobart', + 'Tokyo Standard Time'=>'Asia/Tokyo', + 'Tonga Standard Time'=>'Pacific/Tongatapu', + 'US Eastern Standard Time'=>'America/Indianapolis', + 'US Mountain Standard Time'=>'America/Phoenix', + 'UTC+12'=>'Etc/GMT-12', + 'UTC-02'=>'Etc/GMT+2', + 'UTC-11'=>'Etc/GMT+11', + 'Ulaanbaatar Standard Time'=>'Asia/Ulaanbaatar', + 'Venezuela Standard Time'=>'America/Caracas', + 'Vladivostok Standard Time'=>'Asia/Vladivostok', + 'W. Australia Standard Time'=>'Australia/Perth', + 'W. Central Africa Standard Time'=>'Africa/Lagos', + 'W. Europe Standard Time'=>'Europe/Berlin', + 'West Asia Standard Time'=>'Asia/Tashkent', + 'West Pacific Standard Time'=>'Pacific/Port_Moresby', + 'Yakutsk Standard Time'=>'Asia/Yakutsk', + + // Microsoft exchange timezones + // Source: + // http://msdn.microsoft.com/en-us/library/ms988620%28v=exchg.65%29.aspx + // + // Correct timezones deduced with help from: + // http://en.wikipedia.org/wiki/List_of_tz_database_time_zones + 'Universal Coordinated Time' => 'UTC', + 'Casablanca, Monrovia' => 'Africa/Casablanca', + 'Greenwich Mean Time: Dublin, Edinburgh, Lisbon, London' => 'Europe/Lisbon', + 'Greenwich Mean Time; Dublin, Edinburgh, London' => 'Europe/London', + 'Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna' => 'Europe/Berlin', + 'Belgrade, Pozsony, Budapest, Ljubljana, Prague' => 'Europe/Prague', + 'Brussels, Copenhagen, Madrid, Paris' => 'Europe/Paris', + 'Paris, Madrid, Brussels, Copenhagen' => 'Europe/Paris', + 'Prague, Central Europe' => 'Europe/Prague', + 'Sarajevo, Skopje, Sofija, Vilnius, Warsaw, Zagreb' => 'Europe/Sarajevo', + 'West Central Africa' => 'Africa/Luanda', // This was a best guess + 'Athens, Istanbul, Minsk' => 'Europe/Athens', + 'Bucharest' => 'Europe/Bucharest', + 'Cairo' => 'Africa/Cairo', + 'Harare, Pretoria' => 'Africa/Harare', + 'Helsinki, Riga, Tallinn' => 'Europe/Helsinki', + 'Israel, Jerusalem Standard Time' => 'Asia/Jerusalem', + 'Baghdad' => 'Asia/Baghdad', + 'Arab, Kuwait, Riyadh' => 'Asia/Kuwait', + 'Moscow, St. Petersburg, Volgograd' => 'Europe/Moscow', + 'East Africa, Nairobi' => 'Africa/Nairobi', + 'Tehran' => 'Asia/Tehran', + 'Abu Dhabi, Muscat' => 'Asia/Muscat', // Best guess + 'Baku, Tbilisi, Yerevan' => 'Asia/Baku', + 'Kabul' => 'Asia/Kabul', + 'Ekaterinburg' => 'Asia/Yekaterinburg', + 'Islamabad, Karachi, Tashkent' => 'Asia/Karachi', + 'Kolkata, Chennai, Mumbai, New Delhi, India Standard Time' => 'Asia/Calcutta', + 'Kathmandu, Nepal' => 'Asia/Kathmandu', + 'Almaty, Novosibirsk, North Central Asia' => 'Asia/Almaty', + 'Astana, Dhaka' => 'Asia/Dhaka', + 'Sri Jayawardenepura, Sri Lanka' => 'Asia/Colombo', + 'Rangoon' => 'Asia/Rangoon', + 'Bangkok, Hanoi, Jakarta' => 'Asia/Bangkok', + 'Krasnoyarsk' => 'Asia/Krasnoyarsk', + 'Beijing, Chongqing, Hong Kong SAR, Urumqi' => 'Asia/Shanghai', + 'Irkutsk, Ulaan Bataar' => 'Asia/Irkutsk', + 'Kuala Lumpur, Singapore' => 'Asia/Singapore', + 'Perth, Western Australia' => 'Australia/Perth', + 'Taipei' => 'Asia/Taipei', + 'Osaka, Sapporo, Tokyo' => 'Asia/Tokyo', + 'Seoul, Korea Standard time' => 'Asia/Seoul', + 'Yakutsk' => 'Asia/Yakutsk', + 'Adelaide, Central Australia' => 'Australia/Adelaide', + 'Darwin' => 'Australia/Darwin', + 'Brisbane, East Australia' => 'Australia/Brisbane', + 'Canberra, Melbourne, Sydney, Hobart (year 2000 only)' => 'Australia/Sydney', + 'Guam, Port Moresby' => 'Pacific/Guam', + 'Hobart, Tasmania' => 'Australia/Hobart', + 'Vladivostok' => 'Asia/Vladivostok', + 'Magadan, Solomon Is., New Caledonia' => 'Asia/Magadan', + 'Auckland, Wellington' => 'Pacific/Auckland', + 'Fiji Islands, Kamchatka, Marshall Is.' => 'Pacific/Fiji', + 'Nuku\'alofa, Tonga' => 'Pacific/Tongatapu', + 'Azores' => 'Atlantic/Azores', + 'Cape Verde Is.' => 'Atlantic/Cape_Verde', + 'Mid-Atlantic' => 'America/Noronha', + 'Brasilia' => 'America/Sao_Paulo', // Best guess + 'Buenos Aires' => 'America/Argentina/Buenos_Aires', + 'Greenland' => 'America/Godthab', + 'Newfoundland' => 'America/St_Johns', + 'Atlantic Time (Canada)' => 'America/Halifax', + 'Caracas, La Paz' => 'America/Caracas', + 'Santiago' => 'America/Santiago', + 'Bogota, Lima, Quito' => 'America/Bogota', + 'Eastern Time (US & Canada)' => 'America/New_York', + 'Indiana (East)' => 'America/Indiana/Indianapolis', + 'Central America' => 'America/Guatemala', + 'Central Time (US & Canada)' => 'America/Chicago', + 'Mexico City, Tegucigalpa' => 'America/Mexico_City', + 'Saskatchewan' => 'America/Edmonton', + 'Arizona' => 'America/Phoenix', + 'Mountain Time (US & Canada)' => 'America/Denver', // Best guess + 'Pacific Time (US & Canada); Tijuana' => 'America/Los_Angeles', // Best guess + 'Alaska' => 'America/Anchorage', + 'Hawaii' => 'Pacific/Honolulu', + 'Midway Island, Samoa' => 'Pacific/Midway', + 'Eniwetok, Kwajalein, Dateline Time' => 'Pacific/Kwajalein', + + // The following list are timezone names that could be generated by + // Lotus / Domino + 'Dateline' => 'Etc/GMT-12', + 'Samoa' => 'Pacific/Apia', + 'Hawaiian' => 'Pacific/Honolulu', + 'Alaskan' => 'America/Anchorage', + 'Pacific' => 'America/Los_Angeles', + 'Pacific Standard Time' => 'America/Los_Angeles', + 'Mexico Standard Time 2' => 'America/Chihuahua', + 'Mountain' => 'America/Denver', + 'Mountain Standard Time' => 'America/Chihuahua', + 'US Mountain' => 'America/Phoenix', + 'Canada Central' => 'America/Edmonton', + 'Central America' => 'America/Guatemala', + 'Central' => 'America/Chicago', + 'Central Standard Time' => 'America/Mexico_City', + 'Mexico' => 'America/Mexico_City', + 'Eastern' => 'America/New_York', + 'SA Pacific' => 'America/Bogota', + 'US Eastern' => 'America/Indiana/Indianapolis', + 'Venezuela' => 'America/Caracas', + 'Atlantic' => 'America/Halifax', + 'Central Brazilian' => 'America/Manaus', + 'Pacific SA' => 'America/Santiago', + 'SA Western' => 'America/La_Paz', + 'Newfoundland' => 'America/St_Johns', + 'Argentina' => 'America/Argentina/Buenos_Aires', + 'E. South America' => 'America/Belem', + 'Greenland' => 'America/Godthab', + 'Montevideo' => 'America/Montevideo', + 'SA Eastern' => 'America/Belem', + 'Mid-Atlantic' => 'Etc/GMT-2', + 'Azores' => 'Atlantic/Azores', + 'Cape Verde' => 'Atlantic/Cape_Verde', + 'Greenwich' => 'Atlantic/Reykjavik', // No I'm serious.. Greenwich is not GMT. + 'Morocco' => 'Africa/Casablanca', + 'Central Europe' => 'Europe/Prague', + 'Central European' => 'Europe/Sarajevo', + 'Romance' => 'Europe/Paris', + 'W. Central Africa' => 'Africa/Lagos', // Best guess + 'W. Europe' => 'Europe/Amsterdam', + 'E. Europe' => 'Europe/Minsk', + 'Egypt' => 'Africa/Cairo', + 'FLE' => 'Europe/Helsinki', + 'GTB' => 'Europe/Athens', + 'Israel' => 'Asia/Jerusalem', + 'Jordan' => 'Asia/Amman', + 'Middle East' => 'Asia/Beirut', + 'Namibia' => 'Africa/Windhoek', + 'South Africa' => 'Africa/Harare', + 'Arab' => 'Asia/Kuwait', + 'Arabic' => 'Asia/Baghdad', + 'E. Africa' => 'Africa/Nairobi', + 'Georgian' => 'Asia/Tbilisi', + 'Russian' => 'Europe/Moscow', + 'Iran' => 'Asia/Tehran', + 'Arabian' => 'Asia/Muscat', + 'Armenian' => 'Asia/Yerevan', + 'Azerbijan' => 'Asia/Baku', + 'Caucasus' => 'Asia/Yerevan', + 'Mauritius' => 'Indian/Mauritius', + 'Afghanistan' => 'Asia/Kabul', + 'Ekaterinburg' => 'Asia/Yekaterinburg', + 'Pakistan' => 'Asia/Karachi', + 'West Asia' => 'Asia/Tashkent', + 'India' => 'Asia/Calcutta', + 'Sri Lanka' => 'Asia/Colombo', + 'Nepal' => 'Asia/Kathmandu', + 'Central Asia' => 'Asia/Dhaka', + 'N. Central Asia' => 'Asia/Almaty', + 'Myanmar' => 'Asia/Rangoon', + 'North Asia' => 'Asia/Krasnoyarsk', + 'SE Asia' => 'Asia/Bangkok', + 'China' => 'Asia/Shanghai', + 'North Asia East' => 'Asia/Irkutsk', + 'Singapore' => 'Asia/Singapore', + 'Taipei' => 'Asia/Taipei', + 'W. Australia' => 'Australia/Perth', + 'Korea' => 'Asia/Seoul', + 'Tokyo' => 'Asia/Tokyo', + 'Yakutsk' => 'Asia/Yakutsk', + 'AUS Central' => 'Australia/Darwin', + 'Cen. Australia' => 'Australia/Adelaide', + 'AUS Eastern' => 'Australia/Sydney', + 'E. Australia' => 'Australia/Brisbane', + 'Tasmania' => 'Australia/Hobart', + 'Vladivostok' => 'Asia/Vladivostok', + 'West Pacific' => 'Pacific/Guam', + 'Central Pacific' => 'Asia/Magadan', + 'Fiji' => 'Pacific/Fiji', + 'New Zealand' => 'Pacific/Auckland', + 'Tonga' => 'Pacific/Tongatapu', + ); + + /** + * List of microsoft exchange timezone ids. + * + * Source: http://msdn.microsoft.com/en-us/library/aa563018(loband).aspx + */ + public static $microsoftExchangeMap = array( + 0 => 'UTC', + 31 => 'Africa/Casablanca', + + // Insanely, id #2 is used for both Europe/Lisbon, and Europe/Sarajevo. + // I'm not even kidding.. We handle this special case in the + // getTimeZone method. + 2 => 'Europe/Lisbon', + 1 => 'Europe/London', + 4 => 'Europe/Berlin', + 6 => 'Europe/Prague', + 3 => 'Europe/Paris', + 69 => 'Africa/Luanda', // This was a best guess + 7 => 'Europe/Athens', + 5 => 'Europe/Bucharest', + 49 => 'Africa/Cairo', + 50 => 'Africa/Harare', + 59 => 'Europe/Helsinki', + 27 => 'Asia/Jerusalem', + 26 => 'Asia/Baghdad', + 74 => 'Asia/Kuwait', + 51 => 'Europe/Moscow', + 56 => 'Africa/Nairobi', + 25 => 'Asia/Tehran', + 24 => 'Asia/Muscat', // Best guess + 54 => 'Asia/Baku', + 48 => 'Asia/Kabul', + 58 => 'Asia/Yekaterinburg', + 47 => 'Asia/Karachi', + 23 => 'Asia/Calcutta', + 62 => 'Asia/Kathmandu', + 46 => 'Asia/Almaty', + 71 => 'Asia/Dhaka', + 66 => 'Asia/Colombo', + 61 => 'Asia/Rangoon', + 22 => 'Asia/Bangkok', + 64 => 'Asia/Krasnoyarsk', + 45 => 'Asia/Shanghai', + 63 => 'Asia/Irkutsk', + 21 => 'Asia/Singapore', + 73 => 'Australia/Perth', + 75 => 'Asia/Taipei', + 20 => 'Asia/Tokyo', + 72 => 'Asia/Seoul', + 70 => 'Asia/Yakutsk', + 19 => 'Australia/Adelaide', + 44 => 'Australia/Darwin', + 18 => 'Australia/Brisbane', + 76 => 'Australia/Sydney', + 43 => 'Pacific/Guam', + 42 => 'Australia/Hobart', + 68 => 'Asia/Vladivostok', + 41 => 'Asia/Magadan', + 17 => 'Pacific/Auckland', + 40 => 'Pacific/Fiji', + 67 => 'Pacific/Tongatapu', + 29 => 'Atlantic/Azores', + 53 => 'Atlantic/Cape_Verde', + 30 => 'America/Noronha', + 8 => 'America/Sao_Paulo', // Best guess + 32 => 'America/Argentina/Buenos_Aires', + 60 => 'America/Godthab', + 28 => 'America/St_Johns', + 9 => 'America/Halifax', + 33 => 'America/Caracas', + 65 => 'America/Santiago', + 35 => 'America/Bogota', + 10 => 'America/New_York', + 34 => 'America/Indiana/Indianapolis', + 55 => 'America/Guatemala', + 11 => 'America/Chicago', + 37 => 'America/Mexico_City', + 36 => 'America/Edmonton', + 38 => 'America/Phoenix', + 12 => 'America/Denver', // Best guess + 13 => 'America/Los_Angeles', // Best guess + 14 => 'America/Anchorage', + 15 => 'Pacific/Honolulu', + 16 => 'Pacific/Midway', + 39 => 'Pacific/Kwajalein', + ); + + /** + * This method will try to find out the correct timezone for an iCalendar + * date-time value. + * + * You must pass the contents of the TZID parameter, as well as the full + * calendar. + * + * If the lookup fails, this method will return the default PHP timezone + * (as configured using date_default_timezone_set, or the date.timezone ini + * setting). + * + * Alternatively, if $failIfUncertain is set to true, it will throw an + * exception if we cannot accurately determine the timezone. + * + * @param string $tzid + * @param SabreForRainLoop\VObject\Component $vcalendar + * @return DateTimeZone + */ + static public function getTimeZone($tzid, Component $vcalendar = null, $failIfUncertain = false) { + + // First we will just see if the tzid is a support timezone identifier. + try { + return new \DateTimeZone($tzid); + } catch (\Exception $e) { + } + + // Next, we check if the tzid is somewhere in our tzid map. + if (isset(self::$map[$tzid])) { + return new \DateTimeZone(self::$map[$tzid]); + } + + // Maybe the author was hyper-lazy and just included an offset. We + // support it, but we aren't happy about it. + if (preg_match('/^GMT(\+|-)([0-9]{4})$/', $tzid, $matches)) { + return new \DateTimeZone('Etc/GMT' . $matches[1] . ltrim(substr($matches[2],0,2),'0')); + } + + if ($vcalendar) { + + // If that didn't work, we will scan VTIMEZONE objects + foreach($vcalendar->select('VTIMEZONE') as $vtimezone) { + + if ((string)$vtimezone->TZID === $tzid) { + + // Some clients add 'X-LIC-LOCATION' with the olson name. + if (isset($vtimezone->{'X-LIC-LOCATION'})) { + + $lic = (string)$vtimezone->{'X-LIC-LOCATION'}; + + // Libical generators may specify strings like + // "SystemV/EST5EDT". For those we must remove the + // SystemV part. + if (substr($lic,0,8)==='SystemV/') { + $lic = substr($lic,8); + } + + try { + return new \DateTimeZone($lic); + } catch (\Exception $e) { + } + + } + // Microsoft may add a magic number, which we also have an + // answer for. + if (isset($vtimezone->{'X-MICROSOFT-CDO-TZID'})) { + $cdoId = (int)$vtimezone->{'X-MICROSOFT-CDO-TZID'}->getValue(); + + // 2 can mean both Europe/Lisbon and Europe/Sarajevo. + if ($cdoId===2 && strpos((string)$vtimezone->TZID, 'Sarajevo')!==false) { + return new \DateTimeZone('Europe/Sarajevo'); + } + + if (isset(self::$microsoftExchangeMap[$cdoId])) { + return new \DateTimeZone(self::$microsoftExchangeMap[$cdoId]); + } + } + + } + + } + + } + + if ($failIfUncertain) { + throw new \InvalidArgumentException('We were unable to determine the correct PHP timezone for tzid: ' . $tzid); + } + + // If we got all the way here, we default to UTC. + return new \DateTimeZone(date_default_timezone_get()); + + } + +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/VCardConverter.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/VCardConverter.php new file mode 100755 index 00000000..4b5d6d14 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/VCardConverter.php @@ -0,0 +1,382 @@ +getDocumentType(); + if ($inputVersion===$targetVersion) { + return clone $input; + } + + if (!in_array($inputVersion, array(Document::VCARD21, Document::VCARD30, Document::VCARD40))) { + throw new \InvalidArgumentException('Only vCard 2.1, 3.0 and 4.0 are supported for the input data'); + } + if (!in_array($targetVersion, array(Document::VCARD30, Document::VCARD40))) { + throw new \InvalidArgumentException('You can only use vCard 3.0 or 4.0 for the target version'); + } + + $newVersion = $targetVersion===Document::VCARD40?'4.0':'3.0'; + + $output = new Component\VCard(array( + 'VERSION' => $newVersion, + )); + + foreach($input->children as $property) { + + $this->convertProperty($input, $output, $property, $targetVersion); + + } + + return $output; + + } + + /** + * Handles conversion of a single property. + * + * @param Component\VCard $input + * @param Component\VCard $output + * @param Property $property + * @param int $targetVersion + * @return void + */ + protected function convertProperty(Component\VCard $input, Component\VCard $output, Property $property, $targetVersion) { + + // Skipping these, those are automatically added. + if (in_array($property->name, array('VERSION', 'PRODID'))) { + return; + } + + $parameters = $property->parameters(); + + $valueType = null; + if (isset($parameters['VALUE'])) { + $valueType = $parameters['VALUE']->getValue(); + unset($parameters['VALUE']); + } + if (!$valueType) { + $valueType = $property->getValueType(); + } + + $newProperty = null; + + if ($targetVersion===Document::VCARD30) { + + if ($property instanceof Property\Uri && in_array($property->name, array('PHOTO','LOGO','SOUND'))) { + + $newProperty = $this->convertUriToBinary($output, $property, $parameters); + + } elseif ($property->name === 'KIND') { + + switch(strtolower($property->getValue())) { + case 'org' : + // OS X addressbook property. + $newProperty = $output->createProperty('X-ABSHOWAS','COMPANY'); + break; + case 'individual' : + // Individual is implied, so we can just skip it. + return; + + case 'group' : + // OS X addressbook property + $newProperty = $output->createProperty('X-ADDRESSBOOKSERVER-KIND','GROUP'); + break; + } + + + } + + } elseif ($targetVersion===Document::VCARD40) { + + // These properties were removed in vCard 4.0 + if (in_array($property->name, array('NAME', 'MAILER', 'LABEL', 'CLASS'))) { + return; + } + + if ($property instanceOf Property\Binary) { + + $newProperty = $this->convertBinaryToUri($output, $property, $parameters); + + } else { + switch($property->name) { + case 'X-ABSHOWAS' : + if (strtoupper($property->getValue()) === 'COMPANY') { + $newProperty = $output->createProperty('KIND','org'); + } + break; + case 'X-ADDRESSBOOKSERVER-KIND' : + if (strtoupper($property->getValue()) === 'GROUP') { + $newProperty = $output->createProperty('KIND','group'); + } + break; + } + + } + + } + + + if (is_null($newProperty)) { + + $newProperty = $output->createProperty( + $property->name, + $property->getParts(), + array(), // no parameters yet + $valueType + ); + + } + + // set property group + $newProperty->group = $property->group; + + if ($targetVersion===Document::VCARD40) { + $this->convertParameters40($newProperty, $parameters); + } else { + $this->convertParameters30($newProperty, $parameters); + } + + // Lastly, we need to see if there's a need for a VALUE parameter. + // + // We can do that by instantating a empty property with that name, and + // seeing if the default valueType is identical to the current one. + $tempProperty = $output->createProperty($newProperty->name); + if ($tempProperty->getValueType() !== $newProperty->getValueType()) { + $newProperty['VALUE'] = $newProperty->getValueType(); + } + + $output->add($newProperty); + + + } + + /** + * Converts a BINARY property to a URI property. + * + * vCard 4.0 no longer supports BINARY properties. + * + * @param Component\VCard $output + * @param Property\Uri $property The input property. + * @param $parameters List of parameters that will eventually be added to + * the new property. + * @return Property\Uri + */ + protected function convertBinaryToUri(Component\VCard $output, Property\Binary $property, array &$parameters) { + + $newProperty = $output->createProperty( + $property->name, + null, // no value + array(), // no parameters yet + 'URI' // Forcing the BINARY type + ); + + $mimeType = 'application/octet-stream'; + + // See if we can find a better mimetype. + if (isset($parameters['TYPE'])) { + + $newTypes = array(); + foreach($parameters['TYPE']->getParts() as $typePart) { + if (in_array( + strtoupper($typePart), + array('JPEG','PNG','GIF') + )) { + $mimeType = 'image/' . strtolower($typePart); + } else { + $newTypes[] = $typePart; + } + } + + // If there were any parameters we're not converting to a + // mime-type, we need to keep them. + if ($newTypes) { + $parameters['TYPE']->setParts($newTypes); + } else { + unset($parameters['TYPE']); + } + + } + + $newProperty->setValue('data:' . $mimeType . ';base64,' . base64_encode($property->getValue())); + + return $newProperty; + + } + + /** + * Converts a URI property to a BINARY property. + * + * In vCard 4.0 attachments are encoded as data: uri. Even though these may + * be valid in vCard 3.0 as well, we should convert those to BINARY if + * possible, to improve compatibility. + * + * @param Component\VCard $output + * @param Property\Uri $property The input property. + * @param $parameters List of parameters that will eventually be added to + * the new property. + * @return Property\Binary|null + */ + protected function convertUriToBinary(Component\VCard $output, Property\Uri $property, array &$parameters) { + + $value = $property->getValue(); + + // Only converting data: uris + if (substr($value, 0, 5)!=='data:') { + return; + } + + $newProperty = $output->createProperty( + $property->name, + null, // no value + array(), // no parameters yet + 'BINARY' + ); + + $mimeType = substr($value, 5, strpos($value, ',')-5); + if (strpos($mimeType, ';')) { + $mimeType = substr($mimeType,0,strpos($mimeType, ';')); + $newProperty->setValue(base64_decode(substr($value, strpos($value,',')+1))); + } else { + $newProperty->setValue(substr($value, strpos($value,',')+1)); + } + unset($value); + + $newProperty['ENCODING'] = 'b'; + switch($mimeType) { + + case 'image/jpeg' : + $newProperty['TYPE'] = 'JPEG'; + break; + case 'image/png' : + $newProperty['TYPE'] = 'PNG'; + break; + case 'image/gif' : + $newProperty['TYPE'] = 'GIF'; + break; + + } + + + return $newProperty; + + } + + /** + * Adds parameters to a new property for vCard 4.0 + * + * @param Property $newProperty + * @param array $parameters + * @return void + */ + protected function convertParameters40(Property $newProperty, array $parameters) { + + // Adding all parameters. + foreach($parameters as $param) { + + // vCard 2.1 allowed parameters with no name + if ($param->noName) $param->noName = false; + + switch($param->name) { + + // We need to see if there's any TYPE=PREF, because in vCard 4 + // that's now PREF=1. + case 'TYPE' : + foreach($param->getParts() as $paramPart) { + + if (strtoupper($paramPart)==='PREF') { + $newProperty->add('PREF','1'); + } else { + $newProperty->add($param->name, $paramPart); + } + + } + break; + // These no longer exist in vCard 4 + case 'ENCODING' : + case 'CHARSET' : + break; + + default : + $newProperty->add($param->name, $param->getParts()); + break; + + } + + } + + } + + /** + * Adds parameters to a new property for vCard 3.0 + * + * @param Property $newProperty + * @param array $parameters + * @return void + */ + protected function convertParameters30(Property $newProperty, array $parameters) { + + // Adding all parameters. + foreach($parameters as $param) { + + // vCard 2.1 allowed parameters with no name + if ($param->noName) $param->noName = false; + + switch($param->name) { + + case 'ENCODING' : + // This value only existed in vCard 2.1, and should be + // removed for anything else. + if (strtoupper($param->getValue())!=='QUOTED-PRINTABLE') { + $newProperty->add($param->name, $param->getParts()); + } + break; + + /* + * Converting PREF=1 to TYPE=PREF. + * + * Any other PREF numbers we'll drop. + */ + case 'PREF' : + if ($param->getValue()=='1') { + $newProperty->add('TYPE','PREF'); + } + break; + + default : + $newProperty->add($param->name, $param->getParts()); + break; + + } + + } + + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Version.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Version.php new file mode 100755 index 00000000..76283639 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Version.php @@ -0,0 +1,19 @@ + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is 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. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +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. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + 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 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. Use with the GNU Affero General Public License. + + 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 Affero 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 special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 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 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 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. + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/lessphp/README.md b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/lessphp/README.md new file mode 100755 index 00000000..0085e19d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/lessphp/README.md @@ -0,0 +1,96 @@ +# lessphp v0.3.9 +### + +[![Build Status](https://secure.travis-ci.org/leafo/lessphp.png)](http://travis-ci.org/leafo/lessphp) + +`lessphp` is a compiler for LESS written in PHP. The documentation is great, +so check it out: . + +Here's a quick tutorial: + +### How to use in your PHP project + +The only file required is `lessc.inc.php`, so copy that to your include directory. + +The typical flow of **lessphp** is to create a new instance of `lessc`, +configure it how you like, then tell it to compile something using one built in +compile methods. + +The `compile` method compiles a string of LESS code to CSS. + +```php +compile(".block { padding: 3 + 4px }"); +``` + +The `compileFile` method reads and compiles a file. It will either return the +result or write it to the path specified by an optional second argument. + +```php +compileFile("input.less"); +``` + +The `compileChecked` method is like `compileFile`, but it only compiles if the output +file doesn't exist or it's older than the input file: + +```php +checkedCompile("input.less", "output.css"); +``` + +If there any problem compiling your code, an exception is thrown with a helpful message: + +```php +compile("invalid LESS } {"); +} catch (exception $e) { + echo "fatal error: " . $e->getMessage(); +} +``` + +The `lessc` object can be configured through an assortment of instance methods. +Some possible configuration options include [changing the output format][1], +[setting variables from PHP][2], and [controlling the preservation of +comments][3], writing [custom functions][4] and much more. It's all described +in [the documentation][0]. + + + [0]: http://leafo.net/lessphp/docs/ + [1]: http://leafo.net/lessphp/docs/#output_formatting + [2]: http://leafo.net/lessphp/docs/#setting_variables_from_php + [3]: http://leafo.net/lessphp/docs/#preserving_comments + [4]: http://leafo.net/lessphp/docs/#custom_functions + + +### How to use from the command line + +An additional script has been included to use the compiler from the command +line. In the simplest invocation, you specify an input file and the compiled +css is written to standard out: + + $ plessc input.less > output.css + +Using the -r flag, you can specify LESS code directly as an argument or, if +the argument is left off, from standard in: + + $ plessc -r "my less code here" + +Finally, by using the -w flag you can watch a specified input file and have it +compile as needed to the output file: + + $ plessc -w input-file output-file + +Errors from watch mode are written to standard out. + +The -f flag sets the [output formatter][1]. For example, to compress the +output run this: + + $ plessc -f=compressed myfile.less + +For more help, run `plessc --help` + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/lessphp/ctype.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/lessphp/ctype.php new file mode 100755 index 00000000..74a12d14 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/lessphp/ctype.php @@ -0,0 +1,40 @@ + + * Licensed under MIT or GPLv3, see LICENSE + */ + + +/** + * The less compiler and parser. + * + * Converting LESS to CSS is a three stage process. The incoming file is parsed + * by `lessc_parser` into a syntax tree, then it is compiled into another tree + * representing the CSS structure by `lessc`. The CSS tree is fed into a + * formatter, like `lessc_formatter` which then outputs CSS as a string. + * + * During the first compile, all values are *reduced*, which means that their + * types are brought to the lowest form before being dump as strings. This + * handles math equations, variable dereferences, and the like. + * + * The `parse` function of `lessc` is the entry point. + * + * In summary: + * + * The `lessc` class creates an intstance of the parser, feeds it LESS code, + * then transforms the resulting tree to a CSS tree. This class also holds the + * evaluation context, such as all available mixins and variables at any given + * time. + * + * The `lessc_parser` class is only concerned with parsing its input. + * + * The `lessc_formatter` takes a CSS tree, and dumps it to a formatted string, + * handling things like indentation. + */ +class lessc { + static public $VERSION = "v0.3.9"; + static protected $TRUE = array("keyword", "true"); + static protected $FALSE = array("keyword", "false"); + + protected $libFunctions = array(); + protected $registeredVars = array(); + protected $preserveComments = false; + + public $vPrefix = '@'; // prefix of abstract properties + public $mPrefix = '$'; // prefix of abstract blocks + public $parentSelector = '&'; + + public $importDisabled = false; + public $importDir = ''; + + protected $numberPrecision = null; + + // set to the parser that generated the current line when compiling + // so we know how to create error messages + protected $sourceParser = null; + protected $sourceLoc = null; + + static public $defaultValue = array("keyword", ""); + + static protected $nextImportId = 0; // uniquely identify imports + + // attempts to find the path of an import url, returns null for css files + protected function findImport($url) { + foreach ((array)$this->importDir as $dir) { + $full = $dir.(substr($dir, -1) != '/' ? '/' : '').$url; + if ($this->fileExists($file = $full.'.less') || $this->fileExists($file = $full)) { + return $file; + } + } + + return null; + } + + protected function fileExists($name) { + return is_file($name); + } + + static public function compressList($items, $delim) { + if (!isset($items[1]) && isset($items[0])) return $items[0]; + else return array('list', $delim, $items); + } + + static public function preg_quote($what) { + return preg_quote($what, '/'); + } + + protected function tryImport($importPath, $parentBlock, $out) { + if ($importPath[0] == "function" && $importPath[1] == "url") { + $importPath = $this->flattenList($importPath[2]); + } + + $str = $this->coerceString($importPath); + if ($str === null) return false; + + $url = $this->compileValue($this->lib_e($str)); + + // don't import if it ends in css + if (substr_compare($url, '.css', -4, 4) === 0) return false; + + $realPath = $this->findImport($url); + if ($realPath === null) return false; + + if ($this->importDisabled) { + return array(false, "/* import disabled */"); + } + + $this->addParsedFile($realPath); + $parser = $this->makeParser($realPath); + $root = $parser->parse(file_get_contents($realPath)); + + // set the parents of all the block props + foreach ($root->props as $prop) { + if ($prop[0] == "block") { + $prop[1]->parent = $parentBlock; + } + } + + // copy mixins into scope, set their parents + // bring blocks from import into current block + // TODO: need to mark the source parser these came from this file + foreach ($root->children as $childName => $child) { + if (isset($parentBlock->children[$childName])) { + $parentBlock->children[$childName] = array_merge( + $parentBlock->children[$childName], + $child); + } else { + $parentBlock->children[$childName] = $child; + } + } + + $pi = pathinfo($realPath); + $dir = $pi["dirname"]; + + list($top, $bottom) = $this->sortProps($root->props, true); + $this->compileImportedProps($top, $parentBlock, $out, $parser, $dir); + + return array(true, $bottom, $parser, $dir); + } + + protected function compileImportedProps($props, $block, $out, $sourceParser, $importDir) { + $oldSourceParser = $this->sourceParser; + + $oldImport = $this->importDir; + + // TODO: this is because the importDir api is stupid + $this->importDir = (array)$this->importDir; + array_unshift($this->importDir, $importDir); + + foreach ($props as $prop) { + $this->compileProp($prop, $block, $out); + } + + $this->importDir = $oldImport; + $this->sourceParser = $oldSourceParser; + } + + /** + * Recursively compiles a block. + * + * A block is analogous to a CSS block in most cases. A single LESS document + * is encapsulated in a block when parsed, but it does not have parent tags + * so all of it's children appear on the root level when compiled. + * + * Blocks are made up of props and children. + * + * Props are property instructions, array tuples which describe an action + * to be taken, eg. write a property, set a variable, mixin a block. + * + * The children of a block are just all the blocks that are defined within. + * This is used to look up mixins when performing a mixin. + * + * Compiling the block involves pushing a fresh environment on the stack, + * and iterating through the props, compiling each one. + * + * See lessc::compileProp() + * + */ + protected function compileBlock($block) { + switch ($block->type) { + case "root": + $this->compileRoot($block); + break; + case null: + $this->compileCSSBlock($block); + break; + case "media": + $this->compileMedia($block); + break; + case "directive": + $name = "@" . $block->name; + if (!empty($block->value)) { + $name .= " " . $this->compileValue($this->reduce($block->value)); + } + + $this->compileNestedBlock($block, array($name)); + break; + default: + $this->throwError("unknown block type: $block->type\n"); + } + } + + protected function compileCSSBlock($block) { + $env = $this->pushEnv(); + + $selectors = $this->compileSelectors($block->tags); + $env->selectors = $this->multiplySelectors($selectors); + $out = $this->makeOutputBlock(null, $env->selectors); + + $this->scope->children[] = $out; + $this->compileProps($block, $out); + + $block->scope = $env; // mixins carry scope with them! + $this->popEnv(); + } + + protected function compileMedia($media) { + $env = $this->pushEnv($media); + $parentScope = $this->mediaParent($this->scope); + + $query = $this->compileMediaQuery($this->multiplyMedia($env)); + + $this->scope = $this->makeOutputBlock($media->type, array($query)); + $parentScope->children[] = $this->scope; + + $this->compileProps($media, $this->scope); + + if (count($this->scope->lines) > 0) { + $orphanSelelectors = $this->findClosestSelectors(); + if (!is_null($orphanSelelectors)) { + $orphan = $this->makeOutputBlock(null, $orphanSelelectors); + $orphan->lines = $this->scope->lines; + array_unshift($this->scope->children, $orphan); + $this->scope->lines = array(); + } + } + + $this->scope = $this->scope->parent; + $this->popEnv(); + } + + protected function mediaParent($scope) { + while (!empty($scope->parent)) { + if (!empty($scope->type) && $scope->type != "media") { + break; + } + $scope = $scope->parent; + } + + return $scope; + } + + protected function compileNestedBlock($block, $selectors) { + $this->pushEnv($block); + $this->scope = $this->makeOutputBlock($block->type, $selectors); + $this->scope->parent->children[] = $this->scope; + + $this->compileProps($block, $this->scope); + + $this->scope = $this->scope->parent; + $this->popEnv(); + } + + protected function compileRoot($root) { + $this->pushEnv(); + $this->scope = $this->makeOutputBlock($root->type); + $this->compileProps($root, $this->scope); + $this->popEnv(); + } + + protected function compileProps($block, $out) { + foreach ($this->sortProps($block->props) as $prop) { + $this->compileProp($prop, $block, $out); + } + } + + protected function sortProps($props, $split = false) { + $vars = array(); + $imports = array(); + $other = array(); + + foreach ($props as $prop) { + switch ($prop[0]) { + case "assign": + if (isset($prop[1][0]) && $prop[1][0] == $this->vPrefix) { + $vars[] = $prop; + } else { + $other[] = $prop; + } + break; + case "import": + $id = self::$nextImportId++; + $prop[] = $id; + $imports[] = $prop; + $other[] = array("import_mixin", $id); + break; + default: + $other[] = $prop; + } + } + + if ($split) { + return array(array_merge($vars, $imports), $other); + } else { + return array_merge($vars, $imports, $other); + } + } + + protected function compileMediaQuery($queries) { + $compiledQueries = array(); + foreach ($queries as $query) { + $parts = array(); + foreach ($query as $q) { + switch ($q[0]) { + case "mediaType": + $parts[] = implode(" ", array_slice($q, 1)); + break; + case "mediaExp": + if (isset($q[2])) { + $parts[] = "($q[1]: " . + $this->compileValue($this->reduce($q[2])) . ")"; + } else { + $parts[] = "($q[1])"; + } + break; + case "variable": + $parts[] = $this->compileValue($this->reduce($q)); + break; + } + } + + if (count($parts) > 0) { + $compiledQueries[] = implode(" and ", $parts); + } + } + + $out = "@media"; + if (!empty($parts)) { + $out .= " " . + implode($this->formatter->selectorSeparator, $compiledQueries); + } + return $out; + } + + protected function multiplyMedia($env, $childQueries = null) { + if (is_null($env) || + !empty($env->block->type) && $env->block->type != "media") + { + return $childQueries; + } + + // plain old block, skip + if (empty($env->block->type)) { + return $this->multiplyMedia($env->parent, $childQueries); + } + + $out = array(); + $queries = $env->block->queries; + if (is_null($childQueries)) { + $out = $queries; + } else { + foreach ($queries as $parent) { + foreach ($childQueries as $child) { + $out[] = array_merge($parent, $child); + } + } + } + + return $this->multiplyMedia($env->parent, $out); + } + + protected function expandParentSelectors(&$tag, $replace) { + $parts = explode("$&$", $tag); + $count = 0; + foreach ($parts as &$part) { + $part = str_replace($this->parentSelector, $replace, $part, $c); + $count += $c; + } + $tag = implode($this->parentSelector, $parts); + return $count; + } + + protected function findClosestSelectors() { + $env = $this->env; + $selectors = null; + while ($env !== null) { + if (isset($env->selectors)) { + $selectors = $env->selectors; + break; + } + $env = $env->parent; + } + + return $selectors; + } + + + // multiply $selectors against the nearest selectors in env + protected function multiplySelectors($selectors) { + // find parent selectors + + $parentSelectors = $this->findClosestSelectors(); + if (is_null($parentSelectors)) { + // kill parent reference in top level selector + foreach ($selectors as &$s) { + $this->expandParentSelectors($s, ""); + } + + return $selectors; + } + + $out = array(); + foreach ($parentSelectors as $parent) { + foreach ($selectors as $child) { + $count = $this->expandParentSelectors($child, $parent); + + // don't prepend the parent tag if & was used + if ($count > 0) { + $out[] = trim($child); + } else { + $out[] = trim($parent . ' ' . $child); + } + } + } + + return $out; + } + + // reduces selector expressions + protected function compileSelectors($selectors) { + $out = array(); + + foreach ($selectors as $s) { + if (is_array($s)) { + list(, $value) = $s; + $out[] = trim($this->compileValue($this->reduce($value))); + } else { + $out[] = $s; + } + } + + return $out; + } + + protected function eq($left, $right) { + return $left == $right; + } + + protected function patternMatch($block, $callingArgs) { + // match the guards if it has them + // any one of the groups must have all its guards pass for a match + if (!empty($block->guards)) { + $groupPassed = false; + foreach ($block->guards as $guardGroup) { + foreach ($guardGroup as $guard) { + $this->pushEnv(); + $this->zipSetArgs($block->args, $callingArgs); + + $negate = false; + if ($guard[0] == "negate") { + $guard = $guard[1]; + $negate = true; + } + + $passed = $this->reduce($guard) == self::$TRUE; + if ($negate) $passed = !$passed; + + $this->popEnv(); + + if ($passed) { + $groupPassed = true; + } else { + $groupPassed = false; + break; + } + } + + if ($groupPassed) break; + } + + if (!$groupPassed) { + return false; + } + } + + $numCalling = count($callingArgs); + + if (empty($block->args)) { + return $block->isVararg || $numCalling == 0; + } + + $i = -1; // no args + // try to match by arity or by argument literal + foreach ($block->args as $i => $arg) { + switch ($arg[0]) { + case "lit": + if (empty($callingArgs[$i]) || !$this->eq($arg[1], $callingArgs[$i])) { + return false; + } + break; + case "arg": + // no arg and no default value + if (!isset($callingArgs[$i]) && !isset($arg[2])) { + return false; + } + break; + case "rest": + $i--; // rest can be empty + break 2; + } + } + + if ($block->isVararg) { + return true; // not having enough is handled above + } else { + $numMatched = $i + 1; + // greater than becuase default values always match + return $numMatched >= $numCalling; + } + } + + protected function patternMatchAll($blocks, $callingArgs) { + $matches = null; + foreach ($blocks as $block) { + if ($this->patternMatch($block, $callingArgs)) { + $matches[] = $block; + } + } + + return $matches; + } + + // attempt to find blocks matched by path and args + protected function findBlocks($searchIn, $path, $args, $seen=array()) { + if ($searchIn == null) return null; + if (isset($seen[$searchIn->id])) return null; + $seen[$searchIn->id] = true; + + $name = $path[0]; + + if (isset($searchIn->children[$name])) { + $blocks = $searchIn->children[$name]; + if (count($path) == 1) { + $matches = $this->patternMatchAll($blocks, $args); + if (!empty($matches)) { + // This will return all blocks that match in the closest + // scope that has any matching block, like lessjs + return $matches; + } + } else { + $matches = array(); + foreach ($blocks as $subBlock) { + $subMatches = $this->findBlocks($subBlock, + array_slice($path, 1), $args, $seen); + + if (!is_null($subMatches)) { + foreach ($subMatches as $sm) { + $matches[] = $sm; + } + } + } + + return count($matches) > 0 ? $matches : null; + } + } + + if ($searchIn->parent === $searchIn) return null; + return $this->findBlocks($searchIn->parent, $path, $args, $seen); + } + + // sets all argument names in $args to either the default value + // or the one passed in through $values + protected function zipSetArgs($args, $values) { + $i = 0; + $assignedValues = array(); + foreach ($args as $a) { + if ($a[0] == "arg") { + if ($i < count($values) && !is_null($values[$i])) { + $value = $values[$i]; + } elseif (isset($a[2])) { + $value = $a[2]; + } else $value = null; + + $value = $this->reduce($value); + $this->set($a[1], $value); + $assignedValues[] = $value; + } + $i++; + } + + // check for a rest + $last = end($args); + if ($last[0] == "rest") { + $rest = array_slice($values, count($args) - 1); + $this->set($last[1], $this->reduce(array("list", " ", $rest))); + } + + $this->env->arguments = $assignedValues; + } + + // compile a prop and update $lines or $blocks appropriately + protected function compileProp($prop, $block, $out) { + // set error position context + $this->sourceLoc = isset($prop[-1]) ? $prop[-1] : -1; + + switch ($prop[0]) { + case 'assign': + list(, $name, $value) = $prop; + if ($name[0] == $this->vPrefix) { + $this->set($name, $value); + } else { + $out->lines[] = $this->formatter->property($name, + $this->compileValue($this->reduce($value))); + } + break; + case 'block': + list(, $child) = $prop; + $this->compileBlock($child); + break; + case 'mixin': + list(, $path, $args, $suffix) = $prop; + + $args = array_map(array($this, "reduce"), (array)$args); + $mixins = $this->findBlocks($block, $path, $args); + + if ($mixins === null) { + // fwrite(STDERR,"failed to find block: ".implode(" > ", $path)."\n"); + break; // throw error here?? + } + + foreach ($mixins as $mixin) { + $haveScope = false; + if (isset($mixin->parent->scope)) { + $haveScope = true; + $mixinParentEnv = $this->pushEnv(); + $mixinParentEnv->storeParent = $mixin->parent->scope; + } + + $haveArgs = false; + if (isset($mixin->args)) { + $haveArgs = true; + $this->pushEnv(); + $this->zipSetArgs($mixin->args, $args); + } + + $oldParent = $mixin->parent; + if ($mixin != $block) $mixin->parent = $block; + + foreach ($this->sortProps($mixin->props) as $subProp) { + if ($suffix !== null && + $subProp[0] == "assign" && + is_string($subProp[1]) && + $subProp[1]{0} != $this->vPrefix) + { + $subProp[2] = array( + 'list', ' ', + array($subProp[2], array('keyword', $suffix)) + ); + } + + $this->compileProp($subProp, $mixin, $out); + } + + $mixin->parent = $oldParent; + + if ($haveArgs) $this->popEnv(); + if ($haveScope) $this->popEnv(); + } + + break; + case 'raw': + $out->lines[] = $prop[1]; + break; + case "directive": + list(, $name, $value) = $prop; + $out->lines[] = "@$name " . $this->compileValue($this->reduce($value)).';'; + break; + case "comment": + $out->lines[] = $prop[1]; + break; + case "import"; + list(, $importPath, $importId) = $prop; + $importPath = $this->reduce($importPath); + + if (!isset($this->env->imports)) { + $this->env->imports = array(); + } + + $result = $this->tryImport($importPath, $block, $out); + + $this->env->imports[$importId] = $result === false ? + array(false, "@import " . $this->compileValue($importPath).";") : + $result; + + break; + case "import_mixin": + list(,$importId) = $prop; + $import = $this->env->imports[$importId]; + if ($import[0] === false) { + $out->lines[] = $import[1]; + } else { + list(, $bottom, $parser, $importDir) = $import; + $this->compileImportedProps($bottom, $block, $out, $parser, $importDir); + } + + break; + default: + $this->throwError("unknown op: {$prop[0]}\n"); + } + } + + + /** + * Compiles a primitive value into a CSS property value. + * + * Values in lessphp are typed by being wrapped in arrays, their format is + * typically: + * + * array(type, contents [, additional_contents]*) + * + * The input is expected to be reduced. This function will not work on + * things like expressions and variables. + */ + protected function compileValue($value) { + switch ($value[0]) { + case 'list': + // [1] - delimiter + // [2] - array of values + return implode($value[1], array_map(array($this, 'compileValue'), $value[2])); + case 'raw_color': + if (!empty($this->formatter->compressColors)) { + return $this->compileValue($this->coerceColor($value)); + } + return $value[1]; + case 'keyword': + // [1] - the keyword + return $value[1]; + case 'number': + list(, $num, $unit) = $value; + // [1] - the number + // [2] - the unit + if ($this->numberPrecision !== null) { + $num = round($num, $this->numberPrecision); + } + return $num . $unit; + case 'string': + // [1] - contents of string (includes quotes) + list(, $delim, $content) = $value; + foreach ($content as &$part) { + if (is_array($part)) { + $part = $this->compileValue($part); + } + } + return $delim . implode($content) . $delim; + case 'color': + // [1] - red component (either number or a %) + // [2] - green component + // [3] - blue component + // [4] - optional alpha component + list(, $r, $g, $b) = $value; + $r = round($r); + $g = round($g); + $b = round($b); + + if (count($value) == 5 && $value[4] != 1) { // rgba + return 'rgba('.$r.','.$g.','.$b.','.$value[4].')'; + } + + $h = sprintf("#%02x%02x%02x", $r, $g, $b); + + if (!empty($this->formatter->compressColors)) { + // Converting hex color to short notation (e.g. #003399 to #039) + if ($h[1] === $h[2] && $h[3] === $h[4] && $h[5] === $h[6]) { + $h = '#' . $h[1] . $h[3] . $h[5]; + } + } + + return $h; + + case 'function': + list(, $name, $args) = $value; + return $name.'('.$this->compileValue($args).')'; + default: // assumed to be unit + $this->throwError("unknown value type: $value[0]"); + } + } + + protected function lib_isnumber($value) { + return $this->toBool($value[0] == "number"); + } + + protected function lib_isstring($value) { + return $this->toBool($value[0] == "string"); + } + + protected function lib_iscolor($value) { + return $this->toBool($this->coerceColor($value)); + } + + protected function lib_iskeyword($value) { + return $this->toBool($value[0] == "keyword"); + } + + protected function lib_ispixel($value) { + return $this->toBool($value[0] == "number" && $value[2] == "px"); + } + + protected function lib_ispercentage($value) { + return $this->toBool($value[0] == "number" && $value[2] == "%"); + } + + protected function lib_isem($value) { + return $this->toBool($value[0] == "number" && $value[2] == "em"); + } + + protected function lib_isrem($value) { + return $this->toBool($value[0] == "number" && $value[2] == "rem"); + } + + protected function lib_rgbahex($color) { + $color = $this->coerceColor($color); + if (is_null($color)) + $this->throwError("color expected for rgbahex"); + + return sprintf("#%02x%02x%02x%02x", + isset($color[4]) ? $color[4]*255 : 255, + $color[1],$color[2], $color[3]); + } + + protected function lib_argb($color){ + return $this->lib_rgbahex($color); + } + + // utility func to unquote a string + protected function lib_e($arg) { + switch ($arg[0]) { + case "list": + $items = $arg[2]; + if (isset($items[0])) { + return $this->lib_e($items[0]); + } + return self::$defaultValue; + case "string": + $arg[1] = ""; + return $arg; + case "keyword": + return $arg; + default: + return array("keyword", $this->compileValue($arg)); + } + } + + protected function lib__sprintf($args) { + if ($args[0] != "list") return $args; + $values = $args[2]; + $string = array_shift($values); + $template = $this->compileValue($this->lib_e($string)); + + $i = 0; + if (preg_match_all('/%[dsa]/', $template, $m)) { + foreach ($m[0] as $match) { + $val = isset($values[$i]) ? + $this->reduce($values[$i]) : array('keyword', ''); + + // lessjs compat, renders fully expanded color, not raw color + if ($color = $this->coerceColor($val)) { + $val = $color; + } + + $i++; + $rep = $this->compileValue($this->lib_e($val)); + $template = preg_replace('/'.self::preg_quote($match).'/', + $rep, $template, 1); + } + } + + $d = $string[0] == "string" ? $string[1] : '"'; + return array("string", $d, array($template)); + } + + protected function lib_floor($arg) { + $value = $this->assertNumber($arg); + return array("number", floor($value), $arg[2]); + } + + protected function lib_ceil($arg) { + $value = $this->assertNumber($arg); + return array("number", ceil($value), $arg[2]); + } + + protected function lib_round($arg) { + $value = $this->assertNumber($arg); + return array("number", round($value), $arg[2]); + } + + protected function lib_unit($arg) { + if ($arg[0] == "list") { + list($number, $newUnit) = $arg[2]; + return array("number", $this->assertNumber($number), + $this->compileValue($this->lib_e($newUnit))); + } else { + return array("number", $this->assertNumber($arg), ""); + } + } + + /** + * Helper function to get arguments for color manipulation functions. + * takes a list that contains a color like thing and a percentage + */ + protected function colorArgs($args) { + if ($args[0] != 'list' || count($args[2]) < 2) { + return array(array('color', 0, 0, 0), 0); + } + list($color, $delta) = $args[2]; + $color = $this->assertColor($color); + $delta = floatval($delta[1]); + + return array($color, $delta); + } + + protected function lib_darken($args) { + list($color, $delta) = $this->colorArgs($args); + + $hsl = $this->toHSL($color); + $hsl[3] = $this->clamp($hsl[3] - $delta, 100); + return $this->toRGB($hsl); + } + + protected function lib_lighten($args) { + list($color, $delta) = $this->colorArgs($args); + + $hsl = $this->toHSL($color); + $hsl[3] = $this->clamp($hsl[3] + $delta, 100); + return $this->toRGB($hsl); + } + + protected function lib_saturate($args) { + list($color, $delta) = $this->colorArgs($args); + + $hsl = $this->toHSL($color); + $hsl[2] = $this->clamp($hsl[2] + $delta, 100); + return $this->toRGB($hsl); + } + + protected function lib_desaturate($args) { + list($color, $delta) = $this->colorArgs($args); + + $hsl = $this->toHSL($color); + $hsl[2] = $this->clamp($hsl[2] - $delta, 100); + return $this->toRGB($hsl); + } + + protected function lib_spin($args) { + list($color, $delta) = $this->colorArgs($args); + + $hsl = $this->toHSL($color); + + $hsl[1] = $hsl[1] + $delta % 360; + if ($hsl[1] < 0) $hsl[1] += 360; + + return $this->toRGB($hsl); + } + + protected function lib_fadeout($args) { + list($color, $delta) = $this->colorArgs($args); + $color[4] = $this->clamp((isset($color[4]) ? $color[4] : 1) - $delta/100); + return $color; + } + + protected function lib_fadein($args) { + list($color, $delta) = $this->colorArgs($args); + $color[4] = $this->clamp((isset($color[4]) ? $color[4] : 1) + $delta/100); + return $color; + } + + protected function lib_hue($color) { + $hsl = $this->toHSL($this->assertColor($color)); + return round($hsl[1]); + } + + protected function lib_saturation($color) { + $hsl = $this->toHSL($this->assertColor($color)); + return round($hsl[2]); + } + + protected function lib_lightness($color) { + $hsl = $this->toHSL($this->assertColor($color)); + return round($hsl[3]); + } + + // get the alpha of a color + // defaults to 1 for non-colors or colors without an alpha + protected function lib_alpha($value) { + if (!is_null($color = $this->coerceColor($value))) { + return isset($color[4]) ? $color[4] : 1; + } + } + + // set the alpha of the color + protected function lib_fade($args) { + list($color, $alpha) = $this->colorArgs($args); + $color[4] = $this->clamp($alpha / 100.0); + return $color; + } + + protected function lib_percentage($arg) { + $num = $this->assertNumber($arg); + return array("number", $num*100, "%"); + } + + // mixes two colors by weight + // mix(@color1, @color2, @weight); + // http://sass-lang.com/docs/yardoc/Sass/Script/Functions.html#mix-instance_method + protected function lib_mix($args) { + if ($args[0] != "list" || count($args[2]) < 3) + $this->throwError("mix expects (color1, color2, weight)"); + + list($first, $second, $weight) = $args[2]; + $first = $this->assertColor($first); + $second = $this->assertColor($second); + + $first_a = $this->lib_alpha($first); + $second_a = $this->lib_alpha($second); + $weight = $weight[1] / 100.0; + + $w = $weight * 2 - 1; + $a = $first_a - $second_a; + + $w1 = (($w * $a == -1 ? $w : ($w + $a)/(1 + $w * $a)) + 1) / 2.0; + $w2 = 1.0 - $w1; + + $new = array('color', + $w1 * $first[1] + $w2 * $second[1], + $w1 * $first[2] + $w2 * $second[2], + $w1 * $first[3] + $w2 * $second[3], + ); + + if ($first_a != 1.0 || $second_a != 1.0) { + $new[] = $first_a * $weight + $second_a * ($weight - 1); + } + + return $this->fixColor($new); + } + + protected function lib_contrast($args) { + if ($args[0] != 'list' || count($args[2]) < 3) { + return array(array('color', 0, 0, 0), 0); + } + + list($inputColor, $darkColor, $lightColor) = $args[2]; + + $inputColor = $this->assertColor($inputColor); + $darkColor = $this->assertColor($darkColor); + $lightColor = $this->assertColor($lightColor); + $hsl = $this->toHSL($inputColor); + + if ($hsl[3] > 50) { + return $darkColor; + } + + return $lightColor; + } + + protected function assertColor($value, $error = "expected color value") { + $color = $this->coerceColor($value); + if (is_null($color)) $this->throwError($error); + return $color; + } + + protected function assertNumber($value, $error = "expecting number") { + if ($value[0] == "number") return $value[1]; + $this->throwError($error); + } + + protected function toHSL($color) { + if ($color[0] == 'hsl') return $color; + + $r = $color[1] / 255; + $g = $color[2] / 255; + $b = $color[3] / 255; + + $min = min($r, $g, $b); + $max = max($r, $g, $b); + + $L = ($min + $max) / 2; + if ($min == $max) { + $S = $H = 0; + } else { + if ($L < 0.5) + $S = ($max - $min)/($max + $min); + else + $S = ($max - $min)/(2.0 - $max - $min); + + if ($r == $max) $H = ($g - $b)/($max - $min); + elseif ($g == $max) $H = 2.0 + ($b - $r)/($max - $min); + elseif ($b == $max) $H = 4.0 + ($r - $g)/($max - $min); + + } + + $out = array('hsl', + ($H < 0 ? $H + 6 : $H)*60, + $S*100, + $L*100, + ); + + if (count($color) > 4) $out[] = $color[4]; // copy alpha + return $out; + } + + protected function toRGB_helper($comp, $temp1, $temp2) { + if ($comp < 0) $comp += 1.0; + elseif ($comp > 1) $comp -= 1.0; + + if (6 * $comp < 1) return $temp1 + ($temp2 - $temp1) * 6 * $comp; + if (2 * $comp < 1) return $temp2; + if (3 * $comp < 2) return $temp1 + ($temp2 - $temp1)*((2/3) - $comp) * 6; + + return $temp1; + } + + /** + * Converts a hsl array into a color value in rgb. + * Expects H to be in range of 0 to 360, S and L in 0 to 100 + */ + protected function toRGB($color) { + if ($color[0] == 'color') return $color; + + $H = $color[1] / 360; + $S = $color[2] / 100; + $L = $color[3] / 100; + + if ($S == 0) { + $r = $g = $b = $L; + } else { + $temp2 = $L < 0.5 ? + $L*(1.0 + $S) : + $L + $S - $L * $S; + + $temp1 = 2.0 * $L - $temp2; + + $r = $this->toRGB_helper($H + 1/3, $temp1, $temp2); + $g = $this->toRGB_helper($H, $temp1, $temp2); + $b = $this->toRGB_helper($H - 1/3, $temp1, $temp2); + } + + // $out = array('color', round($r*255), round($g*255), round($b*255)); + $out = array('color', $r*255, $g*255, $b*255); + if (count($color) > 4) $out[] = $color[4]; // copy alpha + return $out; + } + + protected function clamp($v, $max = 1, $min = 0) { + return min($max, max($min, $v)); + } + + /** + * Convert the rgb, rgba, hsl color literals of function type + * as returned by the parser into values of color type. + */ + protected function funcToColor($func) { + $fname = $func[1]; + if ($func[2][0] != 'list') return false; // need a list of arguments + $rawComponents = $func[2][2]; + + if ($fname == 'hsl' || $fname == 'hsla') { + $hsl = array('hsl'); + $i = 0; + foreach ($rawComponents as $c) { + $val = $this->reduce($c); + $val = isset($val[1]) ? floatval($val[1]) : 0; + + if ($i == 0) $clamp = 360; + elseif ($i < 3) $clamp = 100; + else $clamp = 1; + + $hsl[] = $this->clamp($val, $clamp); + $i++; + } + + while (count($hsl) < 4) $hsl[] = 0; + return $this->toRGB($hsl); + + } elseif ($fname == 'rgb' || $fname == 'rgba') { + $components = array(); + $i = 1; + foreach ($rawComponents as $c) { + $c = $this->reduce($c); + if ($i < 4) { + if ($c[0] == "number" && $c[2] == "%") { + $components[] = 255 * ($c[1] / 100); + } else { + $components[] = floatval($c[1]); + } + } elseif ($i == 4) { + if ($c[0] == "number" && $c[2] == "%") { + $components[] = 1.0 * ($c[1] / 100); + } else { + $components[] = floatval($c[1]); + } + } else break; + + $i++; + } + while (count($components) < 3) $components[] = 0; + array_unshift($components, 'color'); + return $this->fixColor($components); + } + + return false; + } + + protected function reduce($value, $forExpression = false) { + switch ($value[0]) { + case "interpolate": + $reduced = $this->reduce($value[1]); + $var = $this->compileValue($reduced); + $res = $this->reduce(array("variable", $this->vPrefix . $var)); + + if (empty($value[2])) $res = $this->lib_e($res); + + return $res; + case "variable": + $key = $value[1]; + if (is_array($key)) { + $key = $this->reduce($key); + $key = $this->vPrefix . $this->compileValue($this->lib_e($key)); + } + + $seen =& $this->env->seenNames; + + if (!empty($seen[$key])) { + $this->throwError("infinite loop detected: $key"); + } + + $seen[$key] = true; + $out = $this->reduce($this->get($key, self::$defaultValue)); + $seen[$key] = false; + return $out; + case "list": + foreach ($value[2] as &$item) { + $item = $this->reduce($item, $forExpression); + } + return $value; + case "expression": + return $this->evaluate($value); + case "string": + foreach ($value[2] as &$part) { + if (is_array($part)) { + $strip = $part[0] == "variable"; + $part = $this->reduce($part); + if ($strip) $part = $this->lib_e($part); + } + } + return $value; + case "escape": + list(,$inner) = $value; + return $this->lib_e($this->reduce($inner)); + case "function": + $color = $this->funcToColor($value); + if ($color) return $color; + + list(, $name, $args) = $value; + if ($name == "%") $name = "_sprintf"; + $f = isset($this->libFunctions[$name]) ? + $this->libFunctions[$name] : array($this, 'lib_'.$name); + + if (is_callable($f)) { + if ($args[0] == 'list') + $args = self::compressList($args[2], $args[1]); + + $ret = call_user_func($f, $this->reduce($args, true), $this); + + if (is_null($ret)) { + return array("string", "", array( + $name, "(", $args, ")" + )); + } + + // convert to a typed value if the result is a php primitive + if (is_numeric($ret)) $ret = array('number', $ret, ""); + elseif (!is_array($ret)) $ret = array('keyword', $ret); + + return $ret; + } + + // plain function, reduce args + $value[2] = $this->reduce($value[2]); + return $value; + case "unary": + list(, $op, $exp) = $value; + $exp = $this->reduce($exp); + + if ($exp[0] == "number") { + switch ($op) { + case "+": + return $exp; + case "-": + $exp[1] *= -1; + return $exp; + } + } + return array("string", "", array($op, $exp)); + } + + if ($forExpression) { + switch ($value[0]) { + case "keyword": + if ($color = $this->coerceColor($value)) { + return $color; + } + break; + case "raw_color": + return $this->coerceColor($value); + } + } + + return $value; + } + + + // coerce a value for use in color operation + protected function coerceColor($value) { + switch($value[0]) { + case 'color': return $value; + case 'raw_color': + $c = array("color", 0, 0, 0); + $colorStr = substr($value[1], 1); + $num = hexdec($colorStr); + $width = strlen($colorStr) == 3 ? 16 : 256; + + for ($i = 3; $i > 0; $i--) { // 3 2 1 + $t = $num % $width; + $num /= $width; + + $c[$i] = $t * (256/$width) + $t * floor(16/$width); + } + + return $c; + case 'keyword': + $name = $value[1]; + if (isset(self::$cssColors[$name])) { + $rgba = explode(',', self::$cssColors[$name]); + + if(isset($rgba[3])) + return array('color', $rgba[0], $rgba[1], $rgba[2], $rgba[3]); + + return array('color', $rgba[0], $rgba[1], $rgba[2]); + } + return null; + } + } + + // make something string like into a string + protected function coerceString($value) { + switch ($value[0]) { + case "string": + return $value; + case "keyword": + return array("string", "", array($value[1])); + } + return null; + } + + // turn list of length 1 into value type + protected function flattenList($value) { + if ($value[0] == "list" && count($value[2]) == 1) { + return $this->flattenList($value[2][0]); + } + return $value; + } + + protected function toBool($a) { + if ($a) return self::$TRUE; + else return self::$FALSE; + } + + // evaluate an expression + protected function evaluate($exp) { + list(, $op, $left, $right, $whiteBefore, $whiteAfter) = $exp; + + $left = $this->reduce($left, true); + $right = $this->reduce($right, true); + + if ($leftColor = $this->coerceColor($left)) { + $left = $leftColor; + } + + if ($rightColor = $this->coerceColor($right)) { + $right = $rightColor; + } + + $ltype = $left[0]; + $rtype = $right[0]; + + // operators that work on all types + if ($op == "and") { + return $this->toBool($left == self::$TRUE && $right == self::$TRUE); + } + + if ($op == "=") { + return $this->toBool($this->eq($left, $right) ); + } + + if ($op == "+" && !is_null($str = $this->stringConcatenate($left, $right))) { + return $str; + } + + // type based operators + $fname = "op_${ltype}_${rtype}"; + if (is_callable(array($this, $fname))) { + $out = $this->$fname($op, $left, $right); + if (!is_null($out)) return $out; + } + + // make the expression look it did before being parsed + $paddedOp = $op; + if ($whiteBefore) $paddedOp = " " . $paddedOp; + if ($whiteAfter) $paddedOp .= " "; + + return array("string", "", array($left, $paddedOp, $right)); + } + + protected function stringConcatenate($left, $right) { + if ($strLeft = $this->coerceString($left)) { + if ($right[0] == "string") { + $right[1] = ""; + } + $strLeft[2][] = $right; + return $strLeft; + } + + if ($strRight = $this->coerceString($right)) { + array_unshift($strRight[2], $left); + return $strRight; + } + } + + + // make sure a color's components don't go out of bounds + protected function fixColor($c) { + foreach (range(1, 3) as $i) { + if ($c[$i] < 0) $c[$i] = 0; + if ($c[$i] > 255) $c[$i] = 255; + } + + return $c; + } + + protected function op_number_color($op, $lft, $rgt) { + if ($op == '+' || $op == '*') { + return $this->op_color_number($op, $rgt, $lft); + } + } + + protected function op_color_number($op, $lft, $rgt) { + if ($rgt[0] == '%') $rgt[1] /= 100; + + return $this->op_color_color($op, $lft, + array_fill(1, count($lft) - 1, $rgt[1])); + } + + protected function op_color_color($op, $left, $right) { + $out = array('color'); + $max = count($left) > count($right) ? count($left) : count($right); + foreach (range(1, $max - 1) as $i) { + $lval = isset($left[$i]) ? $left[$i] : 0; + $rval = isset($right[$i]) ? $right[$i] : 0; + switch ($op) { + case '+': + $out[] = $lval + $rval; + break; + case '-': + $out[] = $lval - $rval; + break; + case '*': + $out[] = $lval * $rval; + break; + case '%': + $out[] = $lval % $rval; + break; + case '/': + if ($rval == 0) $this->throwError("evaluate error: can't divide by zero"); + $out[] = $lval / $rval; + break; + default: + $this->throwError('evaluate error: color op number failed on op '.$op); + } + } + return $this->fixColor($out); + } + + function lib_red($color){ + $color = $this->coerceColor($color); + if (is_null($color)) { + $this->throwError('color expected for red()'); + } + + return $color[1]; + } + + function lib_green($color){ + $color = $this->coerceColor($color); + if (is_null($color)) { + $this->throwError('color expected for green()'); + } + + return $color[2]; + } + + function lib_blue($color){ + $color = $this->coerceColor($color); + if (is_null($color)) { + $this->throwError('color expected for blue()'); + } + + return $color[3]; + } + + + // operator on two numbers + protected function op_number_number($op, $left, $right) { + $unit = empty($left[2]) ? $right[2] : $left[2]; + + $value = 0; + switch ($op) { + case '+': + $value = $left[1] + $right[1]; + break; + case '*': + $value = $left[1] * $right[1]; + break; + case '-': + $value = $left[1] - $right[1]; + break; + case '%': + $value = $left[1] % $right[1]; + break; + case '/': + if ($right[1] == 0) $this->throwError('parse error: divide by zero'); + $value = $left[1] / $right[1]; + break; + case '<': + return $this->toBool($left[1] < $right[1]); + case '>': + return $this->toBool($left[1] > $right[1]); + case '>=': + return $this->toBool($left[1] >= $right[1]); + case '=<': + return $this->toBool($left[1] <= $right[1]); + default: + $this->throwError('parse error: unknown number operator: '.$op); + } + + return array("number", $value, $unit); + } + + + /* environment functions */ + + protected function makeOutputBlock($type, $selectors = null) { + $b = new stdclass; + $b->lines = array(); + $b->children = array(); + $b->selectors = $selectors; + $b->type = $type; + $b->parent = $this->scope; + return $b; + } + + // the state of execution + protected function pushEnv($block = null) { + $e = new stdclass; + $e->parent = $this->env; + $e->store = array(); + $e->block = $block; + + $this->env = $e; + return $e; + } + + // pop something off the stack + protected function popEnv() { + $old = $this->env; + $this->env = $this->env->parent; + return $old; + } + + // set something in the current env + protected function set($name, $value) { + $this->env->store[$name] = $value; + } + + + // get the highest occurrence entry for a name + protected function get($name, $default=null) { + $current = $this->env; + + $isArguments = $name == $this->vPrefix . 'arguments'; + while ($current) { + if ($isArguments && isset($current->arguments)) { + return array('list', ' ', $current->arguments); + } + + if (isset($current->store[$name])) + return $current->store[$name]; + else { + $current = isset($current->storeParent) ? + $current->storeParent : $current->parent; + } + } + + return $default; + } + + // inject array of unparsed strings into environment as variables + protected function injectVariables($args) { + $this->pushEnv(); + $parser = new lessc_parser($this, __METHOD__); + foreach ($args as $name => $strValue) { + if ($name{0} != '@') $name = '@'.$name; + $parser->count = 0; + $parser->buffer = (string)$strValue; + if (!$parser->propertyValue($value)) { + throw new Exception("failed to parse passed in variable $name: $strValue"); + } + + $this->set($name, $value); + } + } + + /** + * Initialize any static state, can initialize parser for a file + * $opts isn't used yet + */ + public function __construct($fname = null) { + if ($fname !== null) { + // used for deprecated parse method + $this->_parseFile = $fname; + } + } + + public function compile($string, $name = null) { + $locale = setlocale(LC_NUMERIC, 0); + setlocale(LC_NUMERIC, "C"); + + $this->parser = $this->makeParser($name); + $root = $this->parser->parse($string); + + $this->env = null; + $this->scope = null; + + $this->formatter = $this->newFormatter(); + + if (!empty($this->registeredVars)) { + $this->injectVariables($this->registeredVars); + } + + $this->sourceParser = $this->parser; // used for error messages + $this->compileBlock($root); + + ob_start(); + $this->formatter->block($this->scope); + $out = ob_get_clean(); + setlocale(LC_NUMERIC, $locale); + return $out; + } + + public function compileFile($fname, $outFname = null) { + if (!is_readable($fname)) { + throw new Exception('load error: failed to find '.$fname); + } + + $pi = pathinfo($fname); + + $oldImport = $this->importDir; + + $this->importDir = (array)$this->importDir; + $this->importDir[] = $pi['dirname'].'/'; + + $this->allParsedFiles = array(); + $this->addParsedFile($fname); + + $out = $this->compile(file_get_contents($fname), $fname); + + $this->importDir = $oldImport; + + if ($outFname !== null) { + return file_put_contents($outFname, $out); + } + + return $out; + } + + // compile only if changed input has changed or output doesn't exist + public function checkedCompile($in, $out) { + if (!is_file($out) || filemtime($in) > filemtime($out)) { + $this->compileFile($in, $out); + return true; + } + return false; + } + + /** + * Execute lessphp on a .less file or a lessphp cache structure + * + * The lessphp cache structure contains information about a specific + * less file having been parsed. It can be used as a hint for future + * calls to determine whether or not a rebuild is required. + * + * The cache structure contains two important keys that may be used + * externally: + * + * compiled: The final compiled CSS + * updated: The time (in seconds) the CSS was last compiled + * + * The cache structure is a plain-ol' PHP associative array and can + * be serialized and unserialized without a hitch. + * + * @param mixed $in Input + * @param bool $force Force rebuild? + * @return array lessphp cache structure + */ + public function cachedCompile($in, $force = false) { + // assume no root + $root = null; + + if (is_string($in)) { + $root = $in; + } elseif (is_array($in) and isset($in['root'])) { + if ($force or ! isset($in['files'])) { + // If we are forcing a recompile or if for some reason the + // structure does not contain any file information we should + // specify the root to trigger a rebuild. + $root = $in['root']; + } elseif (isset($in['files']) and is_array($in['files'])) { + foreach ($in['files'] as $fname => $ftime ) { + if (!file_exists($fname) or filemtime($fname) > $ftime) { + // One of the files we knew about previously has changed + // so we should look at our incoming root again. + $root = $in['root']; + break; + } + } + } + } else { + // TODO: Throw an exception? We got neither a string nor something + // that looks like a compatible lessphp cache structure. + return null; + } + + if ($root !== null) { + // If we have a root value which means we should rebuild. + $out = array(); + $out['root'] = $root; + $out['compiled'] = $this->compileFile($root); + $out['files'] = $this->allParsedFiles(); + $out['updated'] = time(); + return $out; + } else { + // No changes, pass back the structure + // we were given initially. + return $in; + } + + } + + // parse and compile buffer + // This is deprecated + public function parse($str = null, $initialVariables = null) { + if (is_array($str)) { + $initialVariables = $str; + $str = null; + } + + $oldVars = $this->registeredVars; + if ($initialVariables !== null) { + $this->setVariables($initialVariables); + } + + if ($str == null) { + if (empty($this->_parseFile)) { + throw new exception("nothing to parse"); + } + + $out = $this->compileFile($this->_parseFile); + } else { + $out = $this->compile($str); + } + + $this->registeredVars = $oldVars; + return $out; + } + + protected function makeParser($name) { + $parser = new lessc_parser($this, $name); + $parser->writeComments = $this->preserveComments; + + return $parser; + } + + public function setFormatter($name) { + $this->formatterName = $name; + } + + protected function newFormatter() { + $className = "lessc_formatter_lessjs"; + if (!empty($this->formatterName)) { + if (!is_string($this->formatterName)) + return $this->formatterName; + $className = "lessc_formatter_$this->formatterName"; + } + + $className = 'RainLoopVendor\\'.$className; + return new $className; + } + + public function setPreserveComments($preserve) { + $this->preserveComments = $preserve; + } + + public function registerFunction($name, $func) { + $this->libFunctions[$name] = $func; + } + + public function unregisterFunction($name) { + unset($this->libFunctions[$name]); + } + + public function setVariables($variables) { + $this->registeredVars = array_merge($this->registeredVars, $variables); + } + + public function unsetVariable($name) { + unset($this->registeredVars[$name]); + } + + public function setImportDir($dirs) { + $this->importDir = (array)$dirs; + } + + public function addImportDir($dir) { + $this->importDir = (array)$this->importDir; + $this->importDir[] = $dir; + } + + public function allParsedFiles() { + return $this->allParsedFiles; + } + + protected function addParsedFile($file) { + $this->allParsedFiles[realpath($file)] = filemtime($file); + } + + /** + * Uses the current value of $this->count to show line and line number + */ + protected function throwError($msg = null) { + if ($this->sourceLoc >= 0) { + $this->sourceParser->throwError($msg, $this->sourceLoc); + } + throw new exception($msg); + } + + // compile file $in to file $out if $in is newer than $out + // returns true when it compiles, false otherwise + public static function ccompile($in, $out, $less = null) { + if ($less === null) { + $less = new self; + } + return $less->checkedCompile($in, $out); + } + + public static function cexecute($in, $force = false, $less = null) { + if ($less === null) { + $less = new self; + } + return $less->cachedCompile($in, $force); + } + + static protected $cssColors = array( + 'aliceblue' => '240,248,255', + 'antiquewhite' => '250,235,215', + 'aqua' => '0,255,255', + 'aquamarine' => '127,255,212', + 'azure' => '240,255,255', + 'beige' => '245,245,220', + 'bisque' => '255,228,196', + 'black' => '0,0,0', + 'blanchedalmond' => '255,235,205', + 'blue' => '0,0,255', + 'blueviolet' => '138,43,226', + 'brown' => '165,42,42', + 'burlywood' => '222,184,135', + 'cadetblue' => '95,158,160', + 'chartreuse' => '127,255,0', + 'chocolate' => '210,105,30', + 'coral' => '255,127,80', + 'cornflowerblue' => '100,149,237', + 'cornsilk' => '255,248,220', + 'crimson' => '220,20,60', + 'cyan' => '0,255,255', + 'darkblue' => '0,0,139', + 'darkcyan' => '0,139,139', + 'darkgoldenrod' => '184,134,11', + 'darkgray' => '169,169,169', + 'darkgreen' => '0,100,0', + 'darkgrey' => '169,169,169', + 'darkkhaki' => '189,183,107', + 'darkmagenta' => '139,0,139', + 'darkolivegreen' => '85,107,47', + 'darkorange' => '255,140,0', + 'darkorchid' => '153,50,204', + 'darkred' => '139,0,0', + 'darksalmon' => '233,150,122', + 'darkseagreen' => '143,188,143', + 'darkslateblue' => '72,61,139', + 'darkslategray' => '47,79,79', + 'darkslategrey' => '47,79,79', + 'darkturquoise' => '0,206,209', + 'darkviolet' => '148,0,211', + 'deeppink' => '255,20,147', + 'deepskyblue' => '0,191,255', + 'dimgray' => '105,105,105', + 'dimgrey' => '105,105,105', + 'dodgerblue' => '30,144,255', + 'firebrick' => '178,34,34', + 'floralwhite' => '255,250,240', + 'forestgreen' => '34,139,34', + 'fuchsia' => '255,0,255', + 'gainsboro' => '220,220,220', + 'ghostwhite' => '248,248,255', + 'gold' => '255,215,0', + 'goldenrod' => '218,165,32', + 'gray' => '128,128,128', + 'green' => '0,128,0', + 'greenyellow' => '173,255,47', + 'grey' => '128,128,128', + 'honeydew' => '240,255,240', + 'hotpink' => '255,105,180', + 'indianred' => '205,92,92', + 'indigo' => '75,0,130', + 'ivory' => '255,255,240', + 'khaki' => '240,230,140', + 'lavender' => '230,230,250', + 'lavenderblush' => '255,240,245', + 'lawngreen' => '124,252,0', + 'lemonchiffon' => '255,250,205', + 'lightblue' => '173,216,230', + 'lightcoral' => '240,128,128', + 'lightcyan' => '224,255,255', + 'lightgoldenrodyellow' => '250,250,210', + 'lightgray' => '211,211,211', + 'lightgreen' => '144,238,144', + 'lightgrey' => '211,211,211', + 'lightpink' => '255,182,193', + 'lightsalmon' => '255,160,122', + 'lightseagreen' => '32,178,170', + 'lightskyblue' => '135,206,250', + 'lightslategray' => '119,136,153', + 'lightslategrey' => '119,136,153', + 'lightsteelblue' => '176,196,222', + 'lightyellow' => '255,255,224', + 'lime' => '0,255,0', + 'limegreen' => '50,205,50', + 'linen' => '250,240,230', + 'magenta' => '255,0,255', + 'maroon' => '128,0,0', + 'mediumaquamarine' => '102,205,170', + 'mediumblue' => '0,0,205', + 'mediumorchid' => '186,85,211', + 'mediumpurple' => '147,112,219', + 'mediumseagreen' => '60,179,113', + 'mediumslateblue' => '123,104,238', + 'mediumspringgreen' => '0,250,154', + 'mediumturquoise' => '72,209,204', + 'mediumvioletred' => '199,21,133', + 'midnightblue' => '25,25,112', + 'mintcream' => '245,255,250', + 'mistyrose' => '255,228,225', + 'moccasin' => '255,228,181', + 'navajowhite' => '255,222,173', + 'navy' => '0,0,128', + 'oldlace' => '253,245,230', + 'olive' => '128,128,0', + 'olivedrab' => '107,142,35', + 'orange' => '255,165,0', + 'orangered' => '255,69,0', + 'orchid' => '218,112,214', + 'palegoldenrod' => '238,232,170', + 'palegreen' => '152,251,152', + 'paleturquoise' => '175,238,238', + 'palevioletred' => '219,112,147', + 'papayawhip' => '255,239,213', + 'peachpuff' => '255,218,185', + 'peru' => '205,133,63', + 'pink' => '255,192,203', + 'plum' => '221,160,221', + 'powderblue' => '176,224,230', + 'purple' => '128,0,128', + 'red' => '255,0,0', + 'rosybrown' => '188,143,143', + 'royalblue' => '65,105,225', + 'saddlebrown' => '139,69,19', + 'salmon' => '250,128,114', + 'sandybrown' => '244,164,96', + 'seagreen' => '46,139,87', + 'seashell' => '255,245,238', + 'sienna' => '160,82,45', + 'silver' => '192,192,192', + 'skyblue' => '135,206,235', + 'slateblue' => '106,90,205', + 'slategray' => '112,128,144', + 'slategrey' => '112,128,144', + 'snow' => '255,250,250', + 'springgreen' => '0,255,127', + 'steelblue' => '70,130,180', + 'tan' => '210,180,140', + 'teal' => '0,128,128', + 'thistle' => '216,191,216', + 'tomato' => '255,99,71', + 'transparent' => '0,0,0,0', + 'turquoise' => '64,224,208', + 'violet' => '238,130,238', + 'wheat' => '245,222,179', + 'white' => '255,255,255', + 'whitesmoke' => '245,245,245', + 'yellow' => '255,255,0', + 'yellowgreen' => '154,205,50' + ); +} + +// responsible for taking a string of LESS code and converting it into a +// syntax tree +class lessc_parser { + static protected $nextBlockId = 0; // used to uniquely identify blocks + + static protected $precedence = array( + '=<' => 0, + '>=' => 0, + '=' => 0, + '<' => 0, + '>' => 0, + + '+' => 1, + '-' => 1, + '*' => 2, + '/' => 2, + '%' => 2, + ); + + static protected $whitePattern; + static protected $commentMulti; + + static protected $commentSingle = "//"; + static protected $commentMultiLeft = "/*"; + static protected $commentMultiRight = "*/"; + + // regex string to match any of the operators + static protected $operatorString; + + // these properties will supress division unless it's inside parenthases + static protected $supressDivisionProps = + array('/border-radius$/i', '/^font$/i'); + + protected $blockDirectives = array("font-face", "keyframes", "page", "-moz-document"); + protected $lineDirectives = array("charset"); + + /** + * if we are in parens we can be more liberal with whitespace around + * operators because it must evaluate to a single value and thus is less + * ambiguous. + * + * Consider: + * property1: 10 -5; // is two numbers, 10 and -5 + * property2: (10 -5); // should evaluate to 5 + */ + protected $inParens = false; + + // caches preg escaped literals + static protected $literalCache = array(); + + public function __construct($lessc, $sourceName = null) { + $this->eatWhiteDefault = true; + // reference to less needed for vPrefix, mPrefix, and parentSelector + $this->lessc = $lessc; + + $this->sourceName = $sourceName; // name used for error messages + + $this->writeComments = false; + + if (!self::$operatorString) { + self::$operatorString = + '('.implode('|', array_map(array('RainLoopVendor\\lessc', 'preg_quote'), + array_keys(self::$precedence))).')'; + + $commentSingle = lessc::preg_quote(self::$commentSingle); + $commentMultiLeft = lessc::preg_quote(self::$commentMultiLeft); + $commentMultiRight = lessc::preg_quote(self::$commentMultiRight); + + self::$commentMulti = $commentMultiLeft.'.*?'.$commentMultiRight; + self::$whitePattern = '/'.$commentSingle.'[^\n]*\s*|('.self::$commentMulti.')\s*|\s+/Ais'; + } + } + + public function parse($buffer) { + $this->count = 0; + $this->line = 1; + + $this->env = null; // block stack + $this->buffer = $this->writeComments ? $buffer : $this->removeComments($buffer); + $this->pushSpecialBlock("root"); + $this->eatWhiteDefault = true; + $this->seenComments = array(); + + // trim whitespace on head + // if (preg_match('/^\s+/', $this->buffer, $m)) { + // $this->line += substr_count($m[0], "\n"); + // $this->buffer = ltrim($this->buffer); + // } + $this->whitespace(); + + // parse the entire file + $lastCount = $this->count; + while (false !== $this->parseChunk()); + + if ($this->count != strlen($this->buffer)) + $this->throwError(); + + // TODO report where the block was opened + if (!is_null($this->env->parent)) + throw new exception('parse error: unclosed block'); + + return $this->env; + } + + /** + * Parse a single chunk off the head of the buffer and append it to the + * current parse environment. + * Returns false when the buffer is empty, or when there is an error. + * + * This function is called repeatedly until the entire document is + * parsed. + * + * This parser is most similar to a recursive descent parser. Single + * functions represent discrete grammatical rules for the language, and + * they are able to capture the text that represents those rules. + * + * Consider the function lessc::keyword(). (all parse functions are + * structured the same) + * + * The function takes a single reference argument. When calling the + * function it will attempt to match a keyword on the head of the buffer. + * If it is successful, it will place the keyword in the referenced + * argument, advance the position in the buffer, and return true. If it + * fails then it won't advance the buffer and it will return false. + * + * All of these parse functions are powered by lessc::match(), which behaves + * the same way, but takes a literal regular expression. Sometimes it is + * more convenient to use match instead of creating a new function. + * + * Because of the format of the functions, to parse an entire string of + * grammatical rules, you can chain them together using &&. + * + * But, if some of the rules in the chain succeed before one fails, then + * the buffer position will be left at an invalid state. In order to + * avoid this, lessc::seek() is used to remember and set buffer positions. + * + * Before parsing a chain, use $s = $this->seek() to remember the current + * position into $s. Then if a chain fails, use $this->seek($s) to + * go back where we started. + */ + protected function parseChunk() { + if (empty($this->buffer)) return false; + $s = $this->seek(); + + // setting a property + if ($this->keyword($key) && $this->assign() && + $this->propertyValue($value, $key) && $this->end()) + { + $this->append(array('assign', $key, $value), $s); + return true; + } else { + $this->seek($s); + } + + + // look for special css blocks + if ($this->literal('@', false)) { + $this->count--; + + // media + if ($this->literal('@media')) { + if (($this->mediaQueryList($mediaQueries) || true) + && $this->literal('{')) + { + $media = $this->pushSpecialBlock("media"); + $media->queries = is_null($mediaQueries) ? array() : $mediaQueries; + return true; + } else { + $this->seek($s); + return false; + } + } + + if ($this->literal("@", false) && $this->keyword($dirName)) { + if ($this->isDirective($dirName, $this->blockDirectives)) { + if (($this->openString("{", $dirValue, null, array(";")) || true) && + $this->literal("{")) + { + $dir = $this->pushSpecialBlock("directive"); + $dir->name = $dirName; + if (isset($dirValue)) $dir->value = $dirValue; + return true; + } + } elseif ($this->isDirective($dirName, $this->lineDirectives)) { + if ($this->propertyValue($dirValue) && $this->end()) { + $this->append(array("directive", $dirName, $dirValue)); + return true; + } + } + } + + $this->seek($s); + } + + // setting a variable + if ($this->variable($var) && $this->assign() && + $this->propertyValue($value) && $this->end()) + { + $this->append(array('assign', $var, $value), $s); + return true; + } else { + $this->seek($s); + } + + if ($this->import($importValue)) { + $this->append($importValue, $s); + return true; + } + + // opening parametric mixin + if ($this->tag($tag, true) && $this->argumentDef($args, $isVararg) && + ($this->guards($guards) || true) && + $this->literal('{')) + { + $block = $this->pushBlock($this->fixTags(array($tag))); + $block->args = $args; + $block->isVararg = $isVararg; + if (!empty($guards)) $block->guards = $guards; + return true; + } else { + $this->seek($s); + } + + // opening a simple block + if ($this->tags($tags) && $this->literal('{')) { + $tags = $this->fixTags($tags); + $this->pushBlock($tags); + return true; + } else { + $this->seek($s); + } + + // closing a block + if ($this->literal('}', false)) { + try { + $block = $this->pop(); + } catch (exception $e) { + $this->seek($s); + $this->throwError($e->getMessage()); + } + + $hidden = false; + if (is_null($block->type)) { + $hidden = true; + if (!isset($block->args)) { + foreach ($block->tags as $tag) { + if (!is_string($tag) || $tag{0} != $this->lessc->mPrefix) { + $hidden = false; + break; + } + } + } + + foreach ($block->tags as $tag) { + if (is_string($tag)) { + $this->env->children[$tag][] = $block; + } + } + } + + if (!$hidden) { + $this->append(array('block', $block), $s); + } + + // this is done here so comments aren't bundled into he block that + // was just closed + $this->whitespace(); + return true; + } + + // mixin + if ($this->mixinTags($tags) && + ($this->argumentValues($argv) || true) && + ($this->keyword($suffix) || true) && $this->end()) + { + $tags = $this->fixTags($tags); + $this->append(array('mixin', $tags, $argv, $suffix), $s); + return true; + } else { + $this->seek($s); + } + + // spare ; + if ($this->literal(';')) return true; + + return false; // got nothing, throw error + } + + protected function isDirective($dirname, $directives) { + // TODO: cache pattern in parser + $pattern = implode('|', + array_map(array('RainLoopVendor\\lessc', 'preg_quote'), $directives)); + $pattern = '/^(-[a-z-]+-)?(' . $pattern . ')$/i'; + + return preg_match($pattern, $dirname); + } + + protected function fixTags($tags) { + // move @ tags out of variable namespace + foreach ($tags as &$tag) { + if ($tag{0} == $this->lessc->vPrefix) + $tag[0] = $this->lessc->mPrefix; + } + return $tags; + } + + // a list of expressions + protected function expressionList(&$exps) { + $values = array(); + + while ($this->expression($exp)) { + $values[] = $exp; + } + + if (count($values) == 0) return false; + + $exps = lessc::compressList($values, ' '); + return true; + } + + /** + * Attempt to consume an expression. + * @link http://en.wikipedia.org/wiki/Operator-precedence_parser#Pseudo-code + */ + protected function expression(&$out) { + if ($this->value($lhs)) { + $out = $this->expHelper($lhs, 0); + + // look for / shorthand + if (!empty($this->env->supressedDivision)) { + unset($this->env->supressedDivision); + $s = $this->seek(); + if ($this->literal("/") && $this->value($rhs)) { + $out = array("list", "", + array($out, array("keyword", "/"), $rhs)); + } else { + $this->seek($s); + } + } + + return true; + } + return false; + } + + /** + * recursively parse infix equation with $lhs at precedence $minP + */ + protected function expHelper($lhs, $minP) { + $this->inExp = true; + $ss = $this->seek(); + + while (true) { + $whiteBefore = isset($this->buffer[$this->count - 1]) && + ctype_space($this->buffer[$this->count - 1]); + + // If there is whitespace before the operator, then we require + // whitespace after the operator for it to be an expression + $needWhite = $whiteBefore && !$this->inParens; + + if ($this->match(self::$operatorString.($needWhite ? '\s' : ''), $m) && self::$precedence[$m[1]] >= $minP) { + if (!$this->inParens && isset($this->env->currentProperty) && $m[1] == "/" && empty($this->env->supressedDivision)) { + foreach (self::$supressDivisionProps as $pattern) { + if (preg_match($pattern, $this->env->currentProperty)) { + $this->env->supressedDivision = true; + break 2; + } + } + } + + + $whiteAfter = isset($this->buffer[$this->count - 1]) && + ctype_space($this->buffer[$this->count - 1]); + + if (!$this->value($rhs)) break; + + // peek for next operator to see what to do with rhs + if ($this->peek(self::$operatorString, $next) && self::$precedence[$next[1]] > self::$precedence[$m[1]]) { + $rhs = $this->expHelper($rhs, self::$precedence[$next[1]]); + } + + $lhs = array('expression', $m[1], $lhs, $rhs, $whiteBefore, $whiteAfter); + $ss = $this->seek(); + + continue; + } + + break; + } + + $this->seek($ss); + + return $lhs; + } + + // consume a list of values for a property + public function propertyValue(&$value, $keyName = null) { + $values = array(); + + if ($keyName !== null) $this->env->currentProperty = $keyName; + + $s = null; + while ($this->expressionList($v)) { + $values[] = $v; + $s = $this->seek(); + if (!$this->literal(',')) break; + } + + if ($s) $this->seek($s); + + if ($keyName !== null) unset($this->env->currentProperty); + + if (count($values) == 0) return false; + + $value = lessc::compressList($values, ', '); + return true; + } + + protected function parenValue(&$out) { + $s = $this->seek(); + + // speed shortcut + if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] != "(") { + return false; + } + + $inParens = $this->inParens; + if ($this->literal("(") && + ($this->inParens = true) && $this->expression($exp) && + $this->literal(")")) + { + $out = $exp; + $this->inParens = $inParens; + return true; + } else { + $this->inParens = $inParens; + $this->seek($s); + } + + return false; + } + + // a single value + protected function value(&$value) { + $s = $this->seek(); + + // speed shortcut + if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] == "-") { + // negation + if ($this->literal("-", false) && + (($this->variable($inner) && $inner = array("variable", $inner)) || + $this->unit($inner) || + $this->parenValue($inner))) + { + $value = array("unary", "-", $inner); + return true; + } else { + $this->seek($s); + } + } + + if ($this->parenValue($value)) return true; + if ($this->unit($value)) return true; + if ($this->color($value)) return true; + if ($this->func($value)) return true; + if ($this->string($value)) return true; + + if ($this->keyword($word)) { + $value = array('keyword', $word); + return true; + } + + // try a variable + if ($this->variable($var)) { + $value = array('variable', $var); + return true; + } + + // unquote string (should this work on any type? + if ($this->literal("~") && $this->string($str)) { + $value = array("escape", $str); + return true; + } else { + $this->seek($s); + } + + // css hack: \0 + if ($this->literal('\\') && $this->match('([0-9]+)', $m)) { + $value = array('keyword', '\\'.$m[1]); + return true; + } else { + $this->seek($s); + } + + return false; + } + + // an import statement + protected function import(&$out) { + $s = $this->seek(); + if (!$this->literal('@import')) return false; + + // @import "something.css" media; + // @import url("something.css") media; + // @import url(something.css) media; + + if ($this->propertyValue($value)) { + $out = array("import", $value); + return true; + } + } + + protected function mediaQueryList(&$out) { + if ($this->genericList($list, "mediaQuery", ",", false)) { + $out = $list[2]; + return true; + } + return false; + } + + protected function mediaQuery(&$out) { + $s = $this->seek(); + + $expressions = null; + $parts = array(); + + if (($this->literal("only") && ($only = true) || $this->literal("not") && ($not = true) || true) && $this->keyword($mediaType)) { + $prop = array("mediaType"); + if (isset($only)) $prop[] = "only"; + if (isset($not)) $prop[] = "not"; + $prop[] = $mediaType; + $parts[] = $prop; + } else { + $this->seek($s); + } + + + if (!empty($mediaType) && !$this->literal("and")) { + // ~ + } else { + $this->genericList($expressions, "mediaExpression", "and", false); + if (is_array($expressions)) $parts = array_merge($parts, $expressions[2]); + } + + if (count($parts) == 0) { + $this->seek($s); + return false; + } + + $out = $parts; + return true; + } + + protected function mediaExpression(&$out) { + $s = $this->seek(); + $value = null; + if ($this->literal("(") && + $this->keyword($feature) && + ($this->literal(":") && $this->expression($value) || true) && + $this->literal(")")) + { + $out = array("mediaExp", $feature); + if ($value) $out[] = $value; + return true; + } elseif ($this->variable($variable)) { + $out = array('variable', $variable); + return true; + } + + $this->seek($s); + return false; + } + + // an unbounded string stopped by $end + protected function openString($end, &$out, $nestingOpen=null, $rejectStrs = null) { + $oldWhite = $this->eatWhiteDefault; + $this->eatWhiteDefault = false; + + $stop = array("'", '"', "@{", $end); + $stop = array_map(array('RainLoopVendor\\lessc', 'preg_quote'), $stop); + // $stop[] = self::$commentMulti; + + if (!is_null($rejectStrs)) { + $stop = array_merge($stop, $rejectStrs); + } + + $patt = '(.*?)('.implode("|", $stop).')'; + + $nestingLevel = 0; + + $content = array(); + while ($this->match($patt, $m, false)) { + if (!empty($m[1])) { + $content[] = $m[1]; + if ($nestingOpen) { + $nestingLevel += substr_count($m[1], $nestingOpen); + } + } + + $tok = $m[2]; + + $this->count-= strlen($tok); + if ($tok == $end) { + if ($nestingLevel == 0) { + break; + } else { + $nestingLevel--; + } + } + + if (($tok == "'" || $tok == '"') && $this->string($str)) { + $content[] = $str; + continue; + } + + if ($tok == "@{" && $this->interpolation($inter)) { + $content[] = $inter; + continue; + } + + if (!empty($rejectStrs) && in_array($tok, $rejectStrs)) { + $ount = null; + break; + } + + $content[] = $tok; + $this->count+= strlen($tok); + } + + $this->eatWhiteDefault = $oldWhite; + + if (count($content) == 0) return false; + + // trim the end + if (is_string(end($content))) { + $content[count($content) - 1] = rtrim(end($content)); + } + + $out = array("string", "", $content); + return true; + } + + protected function string(&$out) { + $s = $this->seek(); + if ($this->literal('"', false)) { + $delim = '"'; + } elseif ($this->literal("'", false)) { + $delim = "'"; + } else { + return false; + } + + $content = array(); + + // look for either ending delim , escape, or string interpolation + $patt = '([^\n]*?)(@\{|\\\\|' . + lessc::preg_quote($delim).')'; + + $oldWhite = $this->eatWhiteDefault; + $this->eatWhiteDefault = false; + + while ($this->match($patt, $m, false)) { + $content[] = $m[1]; + if ($m[2] == "@{") { + $this->count -= strlen($m[2]); + if ($this->interpolation($inter, false)) { + $content[] = $inter; + } else { + $this->count += strlen($m[2]); + $content[] = "@{"; // ignore it + } + } elseif ($m[2] == '\\') { + $content[] = $m[2]; + if ($this->literal($delim, false)) { + $content[] = $delim; + } + } else { + $this->count -= strlen($delim); + break; // delim + } + } + + $this->eatWhiteDefault = $oldWhite; + + if ($this->literal($delim)) { + $out = array("string", $delim, $content); + return true; + } + + $this->seek($s); + return false; + } + + protected function interpolation(&$out) { + $oldWhite = $this->eatWhiteDefault; + $this->eatWhiteDefault = true; + + $s = $this->seek(); + if ($this->literal("@{") && + $this->openString("}", $interp, null, array("'", '"', ";")) && + $this->literal("}", false)) + { + $out = array("interpolate", $interp); + $this->eatWhiteDefault = $oldWhite; + if ($this->eatWhiteDefault) $this->whitespace(); + return true; + } + + $this->eatWhiteDefault = $oldWhite; + $this->seek($s); + return false; + } + + protected function unit(&$unit) { + // speed shortcut + if (isset($this->buffer[$this->count])) { + $char = $this->buffer[$this->count]; + if (!ctype_digit($char) && $char != ".") return false; + } + + if ($this->match('([0-9]+(?:\.[0-9]*)?|\.[0-9]+)([%a-zA-Z]+)?', $m)) { + $unit = array("number", $m[1], empty($m[2]) ? "" : $m[2]); + return true; + } + return false; + } + + // a # color + protected function color(&$out) { + if ($this->match('(#(?:[0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{3}))', $m)) { + if (strlen($m[1]) > 7) { + $out = array("string", "", array($m[1])); + } else { + $out = array("raw_color", $m[1]); + } + return true; + } + + return false; + } + + // consume a list of property values delimited by ; and wrapped in () + protected function argumentValues(&$args, $delim = ',') { + $s = $this->seek(); + if (!$this->literal('(')) return false; + + $values = array(); + while (true) { + if ($this->expressionList($value)) $values[] = $value; + if (!$this->literal($delim)) break; + else { + if ($value == null) $values[] = null; + $value = null; + } + } + + if (!$this->literal(')')) { + $this->seek($s); + return false; + } + + $args = $values; + return true; + } + + // consume an argument definition list surrounded by () + // each argument is a variable name with optional value + // or at the end a ... or a variable named followed by ... + protected function argumentDef(&$args, &$isVararg, $delim = ',') { + $s = $this->seek(); + if (!$this->literal('(')) return false; + + $values = array(); + + $isVararg = false; + while (true) { + if ($this->literal("...")) { + $isVararg = true; + break; + } + + if ($this->variable($vname)) { + $arg = array("arg", $vname); + $ss = $this->seek(); + if ($this->assign() && $this->expressionList($value)) { + $arg[] = $value; + } else { + $this->seek($ss); + if ($this->literal("...")) { + $arg[0] = "rest"; + $isVararg = true; + } + } + $values[] = $arg; + if ($isVararg) break; + continue; + } + + if ($this->value($literal)) { + $values[] = array("lit", $literal); + } + + if (!$this->literal($delim)) break; + } + + if (!$this->literal(')')) { + $this->seek($s); + return false; + } + + $args = $values; + + return true; + } + + // consume a list of tags + // this accepts a hanging delimiter + protected function tags(&$tags, $simple = false, $delim = ',') { + $tags = array(); + while ($this->tag($tt, $simple)) { + $tags[] = $tt; + if (!$this->literal($delim)) break; + } + if (count($tags) == 0) return false; + + return true; + } + + // list of tags of specifying mixin path + // optionally separated by > (lazy, accepts extra >) + protected function mixinTags(&$tags) { + $s = $this->seek(); + $tags = array(); + while ($this->tag($tt, true)) { + $tags[] = $tt; + $this->literal(">"); + } + + if (count($tags) == 0) return false; + + return true; + } + + // a bracketed value (contained within in a tag definition) + protected function tagBracket(&$value) { + // speed shortcut + if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] != "[") { + return false; + } + + $s = $this->seek(); + if ($this->literal('[') && $this->to(']', $c, true) && $this->literal(']', false)) { + $value = '['.$c.']'; + // whitespace? + if ($this->whitespace()) $value .= " "; + + // escape parent selector, (yuck) + $value = str_replace($this->lessc->parentSelector, "$&$", $value); + return true; + } + + $this->seek($s); + return false; + } + + protected function tagExpression(&$value) { + $s = $this->seek(); + if ($this->literal("(") && $this->expression($exp) && $this->literal(")")) { + $value = array('exp', $exp); + return true; + } + + $this->seek($s); + return false; + } + + // a space separated list of selectors + protected function tag(&$tag, $simple = false) { + if ($simple) + $chars = '^@,:;{}\][>\(\) "\''; + else + $chars = '^@,;{}["\''; + + $s = $this->seek(); + + if (!$simple && $this->tagExpression($tag)) { + return true; + } + + $hasExpression = false; + $parts = array(); + while ($this->tagBracket($first)) $parts[] = $first; + + $oldWhite = $this->eatWhiteDefault; + $this->eatWhiteDefault = false; + + while (true) { + if ($this->match('(['.$chars.'0-9]['.$chars.']*)', $m)) { + $parts[] = $m[1]; + if ($simple) break; + + while ($this->tagBracket($brack)) { + $parts[] = $brack; + } + continue; + } + + if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] == "@") { + if ($this->interpolation($interp)) { + $hasExpression = true; + $interp[2] = true; // don't unescape + $parts[] = $interp; + continue; + } + + if ($this->literal("@")) { + $parts[] = "@"; + continue; + } + } + + if ($this->unit($unit)) { // for keyframes + $parts[] = $unit[1]; + $parts[] = $unit[2]; + continue; + } + + break; + } + + $this->eatWhiteDefault = $oldWhite; + if (!$parts) { + $this->seek($s); + return false; + } + + if ($hasExpression) { + $tag = array("exp", array("string", "", $parts)); + } else { + $tag = trim(implode($parts)); + } + + $this->whitespace(); + return true; + } + + // a css function + protected function func(&$func) { + $s = $this->seek(); + + if ($this->match('(%|[\w\-_][\w\-_:\.]+|[\w_])', $m) && $this->literal('(')) { + $fname = $m[1]; + + $sPreArgs = $this->seek(); + + $args = array(); + while (true) { + $ss = $this->seek(); + // this ugly nonsense is for ie filter properties + if ($this->keyword($name) && $this->literal('=') && $this->expressionList($value)) { + $args[] = array("string", "", array($name, "=", $value)); + } else { + $this->seek($ss); + if ($this->expressionList($value)) { + $args[] = $value; + } + } + + if (!$this->literal(',')) break; + } + $args = array('list', ',', $args); + + if ($this->literal(')')) { + $func = array('function', $fname, $args); + return true; + } elseif ($fname == 'url') { + // couldn't parse and in url? treat as string + $this->seek($sPreArgs); + if ($this->openString(")", $string) && $this->literal(")")) { + $func = array('function', $fname, $string); + return true; + } + } + } + + $this->seek($s); + return false; + } + + // consume a less variable + protected function variable(&$name) { + $s = $this->seek(); + if ($this->literal($this->lessc->vPrefix, false) && + ($this->variable($sub) || $this->keyword($name))) + { + if (!empty($sub)) { + $name = array('variable', $sub); + } else { + $name = $this->lessc->vPrefix.$name; + } + return true; + } + + $name = null; + $this->seek($s); + return false; + } + + /** + * Consume an assignment operator + * Can optionally take a name that will be set to the current property name + */ + protected function assign($name = null) { + if ($name) $this->currentProperty = $name; + return $this->literal(':') || $this->literal('='); + } + + // consume a keyword + protected function keyword(&$word) { + if ($this->match('([\w_\-\*!"][\w\-_"]*)', $m)) { + $word = $m[1]; + return true; + } + return false; + } + + // consume an end of statement delimiter + protected function end() { + if ($this->literal(';')) { + return true; + } elseif ($this->count == strlen($this->buffer) || $this->buffer{$this->count} == '}') { + // if there is end of file or a closing block next then we don't need a ; + return true; + } + return false; + } + + protected function guards(&$guards) { + $s = $this->seek(); + + if (!$this->literal("when")) { + $this->seek($s); + return false; + } + + $guards = array(); + + while ($this->guardGroup($g)) { + $guards[] = $g; + if (!$this->literal(",")) break; + } + + if (count($guards) == 0) { + $guards = null; + $this->seek($s); + return false; + } + + return true; + } + + // a bunch of guards that are and'd together + // TODO rename to guardGroup + protected function guardGroup(&$guardGroup) { + $s = $this->seek(); + $guardGroup = array(); + while ($this->guard($guard)) { + $guardGroup[] = $guard; + if (!$this->literal("and")) break; + } + + if (count($guardGroup) == 0) { + $guardGroup = null; + $this->seek($s); + return false; + } + + return true; + } + + protected function guard(&$guard) { + $s = $this->seek(); + $negate = $this->literal("not"); + + if ($this->literal("(") && $this->expression($exp) && $this->literal(")")) { + $guard = $exp; + if ($negate) $guard = array("negate", $guard); + return true; + } + + $this->seek($s); + return false; + } + + /* raw parsing functions */ + + protected function literal($what, $eatWhitespace = null) { + if ($eatWhitespace === null) $eatWhitespace = $this->eatWhiteDefault; + + // shortcut on single letter + if (!isset($what[1]) && isset($this->buffer[$this->count])) { + if ($this->buffer[$this->count] == $what) { + if (!$eatWhitespace) { + $this->count++; + return true; + } + // goes below... + } else { + return false; + } + } + + if (!isset(self::$literalCache[$what])) { + self::$literalCache[$what] = lessc::preg_quote($what); + } + + return $this->match(self::$literalCache[$what], $m, $eatWhitespace); + } + + protected function genericList(&$out, $parseItem, $delim="", $flatten=true) { + $s = $this->seek(); + $items = array(); + while ($this->$parseItem($value)) { + $items[] = $value; + if ($delim) { + if (!$this->literal($delim)) break; + } + } + + if (count($items) == 0) { + $this->seek($s); + return false; + } + + if ($flatten && count($items) == 1) { + $out = $items[0]; + } else { + $out = array("list", $delim, $items); + } + + return true; + } + + + // advance counter to next occurrence of $what + // $until - don't include $what in advance + // $allowNewline, if string, will be used as valid char set + protected function to($what, &$out, $until = false, $allowNewline = false) { + if (is_string($allowNewline)) { + $validChars = $allowNewline; + } else { + $validChars = $allowNewline ? "." : "[^\n]"; + } + if (!$this->match('('.$validChars.'*?)'.lessc::preg_quote($what), $m, !$until)) return false; + if ($until) $this->count -= strlen($what); // give back $what + $out = $m[1]; + return true; + } + + // try to match something on head of buffer + protected function match($regex, &$out, $eatWhitespace = null) { + if ($eatWhitespace === null) $eatWhitespace = $this->eatWhiteDefault; + + $r = '/'.$regex.($eatWhitespace && !$this->writeComments ? '\s*' : '').'/Ais'; + if (preg_match($r, $this->buffer, $out, null, $this->count)) { + $this->count += strlen($out[0]); + if ($eatWhitespace && $this->writeComments) $this->whitespace(); + return true; + } + return false; + } + + // match some whitespace + protected function whitespace() { + if ($this->writeComments) { + $gotWhite = false; + while (preg_match(self::$whitePattern, $this->buffer, $m, null, $this->count)) { + if (isset($m[1]) && empty($this->commentsSeen[$this->count])) { + $this->append(array("comment", $m[1])); + $this->commentsSeen[$this->count] = true; + } + $this->count += strlen($m[0]); + $gotWhite = true; + } + return $gotWhite; + } else { + $this->match("", $m); + return strlen($m[0]) > 0; + } + } + + // match something without consuming it + protected function peek($regex, &$out = null, $from=null) { + if (is_null($from)) $from = $this->count; + $r = '/'.$regex.'/Ais'; + $result = preg_match($r, $this->buffer, $out, null, $from); + + return $result; + } + + // seek to a spot in the buffer or return where we are on no argument + protected function seek($where = null) { + if ($where === null) return $this->count; + else $this->count = $where; + return true; + } + + /* misc functions */ + + public function throwError($msg = "parse error", $count = null) { + $count = is_null($count) ? $this->count : $count; + + $line = $this->line + + substr_count(substr($this->buffer, 0, $count), "\n"); + + if (!empty($this->sourceName)) { + $loc = "$this->sourceName on line $line"; + } else { + $loc = "line: $line"; + } + + // TODO this depends on $this->count + if ($this->peek("(.*?)(\n|$)", $m, $count)) { + throw new exception("$msg: failed at `$m[1]` $loc"); + } else { + throw new exception("$msg: $loc"); + } + } + + protected function pushBlock($selectors=null, $type=null) { + $b = new stdclass; + $b->parent = $this->env; + + $b->type = $type; + $b->id = self::$nextBlockId++; + + $b->isVararg = false; // TODO: kill me from here + $b->tags = $selectors; + + $b->props = array(); + $b->children = array(); + + $this->env = $b; + return $b; + } + + // push a block that doesn't multiply tags + protected function pushSpecialBlock($type) { + return $this->pushBlock(null, $type); + } + + // append a property to the current block + protected function append($prop, $pos = null) { + if ($pos !== null) $prop[-1] = $pos; + $this->env->props[] = $prop; + } + + // pop something off the stack + protected function pop() { + $old = $this->env; + $this->env = $this->env->parent; + return $old; + } + + // remove comments from $text + // todo: make it work for all functions, not just url + protected function removeComments($text) { + $look = array( + 'url(', '//', '/*', '"', "'" + ); + + $out = ''; + $min = null; + while (true) { + // find the next item + foreach ($look as $token) { + $pos = strpos($text, $token); + if ($pos !== false) { + if (!isset($min) || $pos < $min[1]) $min = array($token, $pos); + } + } + + if (is_null($min)) break; + + $count = $min[1]; + $skip = 0; + $newlines = 0; + switch ($min[0]) { + case 'url(': + if (preg_match('/url\(.*?\)/', $text, $m, 0, $count)) + $count += strlen($m[0]) - strlen($min[0]); + break; + case '"': + case "'": + if (preg_match('/'.$min[0].'.*?'.$min[0].'/', $text, $m, 0, $count)) + $count += strlen($m[0]) - 1; + break; + case '//': + $skip = strpos($text, "\n", $count); + if ($skip === false) $skip = strlen($text) - $count; + else $skip -= $count; + break; + case '/*': + if (preg_match('/\/\*.*?\*\//s', $text, $m, 0, $count)) { + $skip = strlen($m[0]); + $newlines = substr_count($m[0], "\n"); + } + break; + } + + if ($skip == 0) $count += strlen($min[0]); + + $out .= substr($text, 0, $count).str_repeat("\n", $newlines); + $text = substr($text, $count + $skip); + + $min = null; + } + + return $out.$text; + } + +} + +class lessc_formatter_classic { + public $indentChar = " "; + + public $break = "\n"; + public $open = " {"; + public $close = "}"; + public $selectorSeparator = ", "; + public $assignSeparator = ":"; + + public $openSingle = " { "; + public $closeSingle = " }"; + + public $disableSingle = false; + public $breakSelectors = false; + + public $compressColors = false; + + public function __construct() { + $this->indentLevel = 0; + } + + public function indentStr($n = 0) { + return str_repeat($this->indentChar, max($this->indentLevel + $n, 0)); + } + + public function property($name, $value) { + return $name . $this->assignSeparator . $value . ";"; + } + + protected function isEmpty($block) { + if (empty($block->lines)) { + foreach ($block->children as $child) { + if (!$this->isEmpty($child)) return false; + } + + return true; + } + return false; + } + + public function block($block) { + if ($this->isEmpty($block)) return; + + $inner = $pre = $this->indentStr(); + + $isSingle = !$this->disableSingle && + is_null($block->type) && count($block->lines) == 1; + + if (!empty($block->selectors)) { + $this->indentLevel++; + + if ($this->breakSelectors) { + $selectorSeparator = $this->selectorSeparator . $this->break . $pre; + } else { + $selectorSeparator = $this->selectorSeparator; + } + + echo $pre . + implode($selectorSeparator, $block->selectors); + if ($isSingle) { + echo $this->openSingle; + $inner = ""; + } else { + echo $this->open . $this->break; + $inner = $this->indentStr(); + } + + } + + if (!empty($block->lines)) { + $glue = $this->break.$inner; + echo $inner . implode($glue, $block->lines); + if (!$isSingle && !empty($block->children)) { + echo $this->break; + } + } + + foreach ($block->children as $child) { + $this->block($child); + } + + if (!empty($block->selectors)) { + if (!$isSingle && empty($block->children)) echo $this->break; + + if ($isSingle) { + echo $this->closeSingle . $this->break; + } else { + echo $pre . $this->close . $this->break; + } + + $this->indentLevel--; + } + } +} + +class lessc_formatter_compressed extends lessc_formatter_classic { + public $disableSingle = true; + public $open = "{"; + public $selectorSeparator = ","; + public $assignSeparator = ":"; + public $break = ""; + public $compressColors = true; + + public function indentStr($n = 0) { + return ""; + } +} + +class lessc_formatter_lessjs extends lessc_formatter_classic { + public $disableSingle = true; + public $breakSelectors = true; + public $assignSeparator = ": "; + public $selectorSeparator = ","; +} + + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/_pclzip.lib.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/_pclzip.lib.php new file mode 100755 index 00000000..a93e2212 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/_pclzip.lib.php @@ -0,0 +1,5693 @@ +zipname = $p_zipname; + $this->zip_fd = 0; + $this->magic_quotes_status = -1; + + // ----- Return + return; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // create($p_filelist, $p_add_dir="", $p_remove_dir="") + // create($p_filelist, $p_option, $p_option_value, ...) + // Description : + // This method supports two different synopsis. The first one is historical. + // This method creates a Zip Archive. The Zip file is created in the + // filesystem. The files and directories indicated in $p_filelist + // are added in the archive. See the parameters description for the + // supported format of $p_filelist. + // When a directory is in the list, the directory and its content is added + // in the archive. + // In this synopsis, the function takes an optional variable list of + // options. See bellow the supported options. + // Parameters : + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or one directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_add_dir : A path to add before the real path of the archived file, + // in order to have it memorized in the archive. + // $p_remove_dir : A path to remove from the real path of the file to archive, + // in order to have a shorter path memorized in the archive. + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir + // is removed first, before $p_add_dir is added. + // Options : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_COMMENT : + // PCLZIP_CB_PRE_ADD : + // PCLZIP_CB_POST_ADD : + // Return Values : + // 0 on failure, + // The list of the added files, with a status of the add action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function create($p_filelist) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Set default values + $v_options = array(); + $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove from the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_ADD => 'optional', + PCLZIP_CB_POST_ADD => 'optional', + PCLZIP_OPT_NO_COMPRESSION => 'optional', + PCLZIP_OPT_COMMENT => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + //, PCLZIP_OPT_CRYPT => 'optional' + )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; + } + else if ($v_size > 2) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Invalid number / type of arguments"); + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Init + $v_string_list = array(); + $v_att_list = array(); + $v_filedescr_list = array(); + $p_result_list = array(); + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + + // ----- Look if the first element is also an array + // This will mean that this is a file description entry + if (isset($p_filelist[0]) && is_array($p_filelist[0])) { + $v_att_list = $p_filelist; + } + + // ----- The list is a list of string names + else { + $v_string_list = $p_filelist; + } + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_filelist)) { + // ----- Create a list from the string + $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); + } + + // ----- Invalid variable type for $p_filelist + else { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist"); + return 0; + } + + // ----- Reformat the string list + if (sizeof($v_string_list) != 0) { + foreach ($v_string_list as $v_string) { + if ($v_string != '') { + $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; + } + else { + } + } + } + + // ----- For each file in the list check the attributes + $v_supported_attributes + = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' + ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' + ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' + ,PCLZIP_ATT_FILE_MTIME => 'optional' + ,PCLZIP_ATT_FILE_CONTENT => 'optional' + ,PCLZIP_ATT_FILE_COMMENT => 'optional' + ); + foreach ($v_att_list as $v_entry) { + $v_result = $this->privFileDescrParseAtt($v_entry, + $v_filedescr_list[], + $v_options, + $v_supported_attributes); + if ($v_result != 1) { + return 0; + } + } + + // ----- Expand the filelist (expand directories) + $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Call the create fct + $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Return + return $p_result_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // add($p_filelist, $p_add_dir="", $p_remove_dir="") + // add($p_filelist, $p_option, $p_option_value, ...) + // Description : + // This method supports two synopsis. The first one is historical. + // This methods add the list of files in an existing archive. + // If a file with the same name already exists, it is added at the end of the + // archive, the first one is still present. + // If the archive does not exist, it is created. + // Parameters : + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or one directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_add_dir : A path to add before the real path of the archived file, + // in order to have it memorized in the archive. + // $p_remove_dir : A path to remove from the real path of the file to archive, + // in order to have a shorter path memorized in the archive. + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir + // is removed first, before $p_add_dir is added. + // Options : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_COMMENT : + // PCLZIP_OPT_ADD_COMMENT : + // PCLZIP_OPT_PREPEND_COMMENT : + // PCLZIP_CB_PRE_ADD : + // PCLZIP_CB_POST_ADD : + // Return Values : + // 0 on failure, + // The list of the added files, with a status of the add action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function add($p_filelist) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Set default values + $v_options = array(); + $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove form the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_ADD => 'optional', + PCLZIP_CB_POST_ADD => 'optional', + PCLZIP_OPT_NO_COMPRESSION => 'optional', + PCLZIP_OPT_COMMENT => 'optional', + PCLZIP_OPT_ADD_COMMENT => 'optional', + PCLZIP_OPT_PREPEND_COMMENT => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + //, PCLZIP_OPT_CRYPT => 'optional' + )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Init + $v_string_list = array(); + $v_att_list = array(); + $v_filedescr_list = array(); + $p_result_list = array(); + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + + // ----- Look if the first element is also an array + // This will mean that this is a file description entry + if (isset($p_filelist[0]) && is_array($p_filelist[0])) { + $v_att_list = $p_filelist; + } + + // ----- The list is a list of string names + else { + $v_string_list = $p_filelist; + } + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_filelist)) { + // ----- Create a list from the string + $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); + } + + // ----- Invalid variable type for $p_filelist + else { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist"); + return 0; + } + + // ----- Reformat the string list + if (sizeof($v_string_list) != 0) { + foreach ($v_string_list as $v_string) { + $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; + } + } + + // ----- For each file in the list check the attributes + $v_supported_attributes + = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' + ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' + ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' + ,PCLZIP_ATT_FILE_MTIME => 'optional' + ,PCLZIP_ATT_FILE_CONTENT => 'optional' + ,PCLZIP_ATT_FILE_COMMENT => 'optional' + ); + foreach ($v_att_list as $v_entry) { + $v_result = $this->privFileDescrParseAtt($v_entry, + $v_filedescr_list[], + $v_options, + $v_supported_attributes); + if ($v_result != 1) { + return 0; + } + } + + // ----- Expand the filelist (expand directories) + $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Call the create fct + $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Return + return $p_result_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : listContent() + // Description : + // This public method, gives the list of the files and directories, with their + // properties. + // The properties of each entries in the list are (used also in other functions) : + // filename : Name of the file. For a create or add action it is the filename + // given by the user. For an extract function it is the filename + // of the extracted file. + // stored_filename : Name of the file / directory stored in the archive. + // size : Size of the stored file. + // compressed_size : Size of the file's data compressed in the archive + // (without the headers overhead) + // mtime : Last known modification date of the file (UNIX timestamp) + // comment : Comment associated with the file + // folder : true | false + // index : index of the file in the archive + // status : status of the action (depending of the action) : + // Values are : + // ok : OK ! + // filtered : the file / dir is not extracted (filtered by user) + // already_a_directory : the file can not be extracted because a + // directory with the same name already exists + // write_protected : the file can not be extracted because a file + // with the same name already exists and is + // write protected + // newer_exist : the file was not extracted because a newer file exists + // path_creation_fail : the file is not extracted because the folder + // does not exist and can not be created + // write_error : the file was not extracted because there was a + // error while writing the file + // read_error : the file was not extracted because there was a error + // while reading the file + // invalid_header : the file was not extracted because of an archive + // format error (bad file header) + // Note that each time a method can continue operating when there + // is an action error on a file, the error is only logged in the file status. + // Return Values : + // 0 on an unrecoverable failure, + // The list of the files in the archive. + // -------------------------------------------------------------------------------- + function listContent() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Call the extracting fct + $p_list = array(); + if (($v_result = $this->privList($p_list)) != 1) + { + unset($p_list); + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // extract($p_path="./", $p_remove_path="") + // extract([$p_option, $p_option_value, ...]) + // Description : + // This method supports two synopsis. The first one is historical. + // This method extract all the files / directories from the archive to the + // folder indicated in $p_path. + // If you want to ignore the 'root' part of path of the memorized files + // you can indicate this in the optional $p_remove_path parameter. + // By default, if a newer file with the same name already exists, the + // file is not extracted. + // + // If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions + // are used, the path indicated in PCLZIP_OPT_ADD_PATH is append + // at the end of the path value of PCLZIP_OPT_PATH. + // Parameters : + // $p_path : Path where the files and directories are to be extracted + // $p_remove_path : First part ('root' part) of the memorized path + // (if any similar) to remove while extracting. + // Options : + // PCLZIP_OPT_PATH : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_CB_PRE_EXTRACT : + // PCLZIP_CB_POST_EXTRACT : + // Return Values : + // 0 or a negative value on failure, + // The list of the extracted files, with a status of the action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function extract() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); +// $v_path = "./"; + $v_path = ''; + $v_remove_path = ""; + $v_remove_all_path = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Default values for option + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + + // ----- Look for arguments + if ($v_size > 0) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_PATH => 'optional', + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_EXTRACT => 'optional', + PCLZIP_CB_POST_EXTRACT => 'optional', + PCLZIP_OPT_SET_CHMOD => 'optional', + PCLZIP_OPT_BY_NAME => 'optional', + PCLZIP_OPT_BY_EREG => 'optional', + PCLZIP_OPT_BY_PREG => 'optional', + PCLZIP_OPT_BY_INDEX => 'optional', + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', + PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional', + PCLZIP_OPT_REPLACE_NEWER => 'optional' + ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' + ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + )); + if ($v_result != 1) { + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_PATH])) { + $v_path = $v_options[PCLZIP_OPT_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + // ----- Check for '/' in last path char + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { + $v_path .= '/'; + } + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Trace + + // ----- Call the extracting fct + $p_list = array(); + $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, + $v_remove_all_path, $v_options); + if ($v_result < 1) { + unset($p_list); + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + + // -------------------------------------------------------------------------------- + // Function : + // extractByIndex($p_index, $p_path="./", $p_remove_path="") + // extractByIndex($p_index, [$p_option, $p_option_value, ...]) + // Description : + // This method supports two synopsis. The first one is historical. + // This method is doing a partial extract of the archive. + // The extracted files or folders are identified by their index in the + // archive (from 0 to n). + // Note that if the index identify a folder, only the folder entry is + // extracted, not all the files included in the archive. + // Parameters : + // $p_index : A single index (integer) or a string of indexes of files to + // extract. The form of the string is "0,4-6,8-12" with only numbers + // and '-' for range or ',' to separate ranges. No spaces or ';' + // are allowed. + // $p_path : Path where the files and directories are to be extracted + // $p_remove_path : First part ('root' part) of the memorized path + // (if any similar) to remove while extracting. + // Options : + // PCLZIP_OPT_PATH : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and + // not as files. + // The resulting content is in a new field 'content' in the file + // structure. + // This option must be used alone (any other options are ignored). + // PCLZIP_CB_PRE_EXTRACT : + // PCLZIP_CB_POST_EXTRACT : + // Return Values : + // 0 on failure, + // The list of the extracted files, with a status of the action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + //function extractByIndex($p_index, options...) + function extractByIndex($p_index) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); +// $v_path = "./"; + $v_path = ''; + $v_remove_path = ""; + $v_remove_all_path = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Default values for option + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove form the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_PATH => 'optional', + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_EXTRACT => 'optional', + PCLZIP_CB_POST_EXTRACT => 'optional', + PCLZIP_OPT_SET_CHMOD => 'optional', + PCLZIP_OPT_REPLACE_NEWER => 'optional' + ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' + ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + )); + if ($v_result != 1) { + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_PATH])) { + $v_path = $v_options[PCLZIP_OPT_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + // ----- Check for '/' in last path char + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { + $v_path .= '/'; + } + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; + } + if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) { + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + } + else { + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Trace + + // ----- Trick + // Here I want to reuse extractByRule(), so I need to parse the $p_index + // with privParseOptions() + $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index); + $v_options_trick = array(); + $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick, + array (PCLZIP_OPT_BY_INDEX => 'optional' )); + if ($v_result != 1) { + return 0; + } + $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX]; + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Call the extracting fct + if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) { + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // delete([$p_option, $p_option_value, ...]) + // Description : + // This method removes files from the archive. + // If no parameters are given, then all the archive is emptied. + // Parameters : + // None or optional arguments. + // Options : + // PCLZIP_OPT_BY_INDEX : + // PCLZIP_OPT_BY_NAME : + // PCLZIP_OPT_BY_EREG : + // PCLZIP_OPT_BY_PREG : + // Return Values : + // 0 on failure, + // The list of the files which are still present in the archive. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function delete() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 0) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_BY_NAME => 'optional', + PCLZIP_OPT_BY_EREG => 'optional', + PCLZIP_OPT_BY_PREG => 'optional', + PCLZIP_OPT_BY_INDEX => 'optional' )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Call the delete fct + $v_list = array(); + if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) { + $this->privSwapBackMagicQuotes(); + unset($v_list); + return(0); + } + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : deleteByIndex() + // Description : + // ***** Deprecated ***** + // delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered. + // -------------------------------------------------------------------------------- + function deleteByIndex($p_index) + { + + $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index); + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : properties() + // Description : + // This method gives the properties of the archive. + // The properties are : + // nb : Number of files in the archive + // comment : Comment associated with the archive file + // status : not_exist, ok + // Parameters : + // None + // Return Values : + // 0 on failure, + // An array with the archive properties. + // -------------------------------------------------------------------------------- + function properties() + { + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + $this->privSwapBackMagicQuotes(); + return(0); + } + + // ----- Default properties + $v_prop = array(); + $v_prop['comment'] = ''; + $v_prop['nb'] = 0; + $v_prop['status'] = 'not_exist'; + + // ----- Look if file exists + if (@is_file($this->zipname)) + { + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) + { + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); + + // ----- Return + return 0; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privSwapBackMagicQuotes(); + return 0; + } + + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Set the user attributes + $v_prop['comment'] = $v_central_dir['comment']; + $v_prop['nb'] = $v_central_dir['entries']; + $v_prop['status'] = 'ok'; + } + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_prop; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : duplicate() + // Description : + // This method creates an archive by copying the content of an other one. If + // the archive already exist, it is replaced by the new one without any warning. + // Parameters : + // $p_archive : The filename of a valid archive, or + // a valid PclZip object. + // Return Values : + // 1 on success. + // 0 or a negative value on error (error code). + // -------------------------------------------------------------------------------- + function duplicate($p_archive) + { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Look if the $p_archive is a PclZip object + if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')) + { + + // ----- Duplicate the archive + $v_result = $this->privDuplicate($p_archive->zipname); + } + + // ----- Look if the $p_archive is a string (so a filename) + else if (is_string($p_archive)) + { + + // ----- Check that $p_archive is a valid zip file + // TBC : Should also check the archive format + if (!is_file($p_archive)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'"); + $v_result = PCLZIP_ERR_MISSING_FILE; + } + else { + // ----- Duplicate the archive + $v_result = $this->privDuplicate($p_archive); + } + } + + // ----- Invalid variable + else + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : merge() + // Description : + // This method merge the $p_archive_to_add archive at the end of the current + // one ($this). + // If the archive ($this) does not exist, the merge becomes a duplicate. + // If the $p_archive_to_add archive does not exist, the merge is a success. + // Parameters : + // $p_archive_to_add : It can be directly the filename of a valid zip archive, + // or a PclZip object archive. + // Return Values : + // 1 on success, + // 0 or negative values on error (see below). + // -------------------------------------------------------------------------------- + function merge($p_archive_to_add) + { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Look if the $p_archive_to_add is a PclZip object + if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')) + { + + // ----- Merge the archive + $v_result = $this->privMerge($p_archive_to_add); + } + + // ----- Look if the $p_archive_to_add is a string (so a filename) + else if (is_string($p_archive_to_add)) + { + + // ----- Create a temporary archive + $v_object_archive = new PclZip($p_archive_to_add); + + // ----- Merge the archive + $v_result = $this->privMerge($v_object_archive); + } + + // ----- Invalid variable + else + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + + + // -------------------------------------------------------------------------------- + // Function : errorCode() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorCode() + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + return(PclErrorCode()); + } + else { + return($this->error_code); + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : errorName() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorName($p_with_code=false) + { + $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR', + PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL', + PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL', + PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER', + PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE', + PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG', + PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP', + PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE', + PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL', + PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION', + PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT', + PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL', + PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL', + PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM', + PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', + PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE', + PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE', + PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', + PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION' + ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE' + ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION' + ); + + if (isset($v_name[$this->error_code])) { + $v_value = $v_name[$this->error_code]; + } + else { + $v_value = 'NoName'; + } + + if ($p_with_code) { + return($v_value.' ('.$this->error_code.')'); + } + else { + return($v_value); + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : errorInfo() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorInfo($p_full=false) + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + return(PclErrorString()); + } + else { + if ($p_full) { + return($this->errorName(true)." : ".$this->error_string); + } + else { + return($this->error_string." [code ".$this->error_code."]"); + } + } + } + // -------------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------------- +// ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS ***** +// ***** ***** +// ***** THESES FUNCTIONS MUST NOT BE USED DIRECTLY ***** +// -------------------------------------------------------------------------------- + + + + // -------------------------------------------------------------------------------- + // Function : privCheckFormat() + // Description : + // This method check that the archive exists and is a valid zip archive. + // Several level of check exists. (futur) + // Parameters : + // $p_level : Level of check. Default 0. + // 0 : Check the first bytes (magic codes) (default value)) + // 1 : 0 + Check the central directory (futur) + // 2 : 1 + Check each file header (futur) + // Return Values : + // true on success, + // false on error, the error code is set. + // -------------------------------------------------------------------------------- + function privCheckFormat($p_level=0) + { + $v_result = true; + + // ----- Reset the file system cache + clearstatcache(); + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Look if the file exits + if (!is_file($this->zipname)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'"); + return(false); + } + + // ----- Check that the file is readeable + if (!is_readable($this->zipname)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'"); + return(false); + } + + // ----- Check the magic code + // TBC + + // ----- Check the central header + // TBC + + // ----- Check each file header + // TBC + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privParseOptions() + // Description : + // This internal methods reads the variable list of arguments ($p_options_list, + // $p_size) and generate an array with the options and values ($v_result_list). + // $v_requested_options contains the options that can be present and those that + // must be present. + // $v_requested_options is an array, with the option value as key, and 'optional', + // or 'mandatory' as value. + // Parameters : + // See above. + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false) + { + $v_result=1; + + // ----- Read the options + $i=0; + while ($i<$p_size) { + + // ----- Check if the option is supported + if (!isset($v_requested_options[$p_options_list[$i]])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for next option + switch ($p_options_list[$i]) { + // ----- Look for options that request a path value + case PCLZIP_OPT_PATH : + case PCLZIP_OPT_REMOVE_PATH : + case PCLZIP_OPT_ADD_PATH : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); + $i++; + break; + + case PCLZIP_OPT_TEMP_FILE_THRESHOLD : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + return PclZip::errorCode(); + } + + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); + return PclZip::errorCode(); + } + + // ----- Check the value + $v_value = $p_options_list[$i+1]; + if ((!is_integer($v_value)) || ($v_value<0)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + return PclZip::errorCode(); + } + + // ----- Get the value (and convert it in bytes) + $v_result_list[$p_options_list[$i]] = $v_value*1048576; + $i++; + break; + + case PCLZIP_OPT_TEMP_FILE_ON : + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); + return PclZip::errorCode(); + } + + $v_result_list[$p_options_list[$i]] = true; + break; + + case PCLZIP_OPT_TEMP_FILE_OFF : + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'"); + return PclZip::errorCode(); + } + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'"); + return PclZip::errorCode(); + } + + $v_result_list[$p_options_list[$i]] = true; + break; + + case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if ( is_string($p_options_list[$i+1]) + && ($p_options_list[$i+1] != '')) { + $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); + $i++; + } + else { + } + break; + + // ----- Look for options that request an array of string for value + case PCLZIP_OPT_BY_NAME : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1]; + } + else if (is_array($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that request an EREG or PREG expression + case PCLZIP_OPT_BY_EREG : + // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG + // to PCLZIP_OPT_BY_PREG + $p_options_list[$i] = PCLZIP_OPT_BY_PREG; + case PCLZIP_OPT_BY_PREG : + //case PCLZIP_OPT_CRYPT : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that takes a string + case PCLZIP_OPT_COMMENT : + case PCLZIP_OPT_ADD_COMMENT : + case PCLZIP_OPT_PREPEND_COMMENT : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, + "Missing parameter value for option '" + .PclZipUtilOptionText($p_options_list[$i]) + ."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, + "Wrong parameter value for option '" + .PclZipUtilOptionText($p_options_list[$i]) + ."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that request an array of index + case PCLZIP_OPT_BY_INDEX : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_work_list = array(); + if (is_string($p_options_list[$i+1])) { + + // ----- Remove spaces + $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', ''); + + // ----- Parse items + $v_work_list = explode(",", $p_options_list[$i+1]); + } + else if (is_integer($p_options_list[$i+1])) { + $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1]; + } + else if (is_array($p_options_list[$i+1])) { + $v_work_list = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Reduce the index list + // each index item in the list must be a couple with a start and + // an end value : [0,3], [5-5], [8-10], ... + // ----- Check the format of each item + $v_sort_flag=false; + $v_sort_value=0; + for ($j=0; $j= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + $i++; + break; + + // ----- Look for options that request a call-back + case PCLZIP_CB_PRE_EXTRACT : + case PCLZIP_CB_POST_EXTRACT : + case PCLZIP_CB_PRE_ADD : + case PCLZIP_CB_POST_ADD : + /* for futur use + case PCLZIP_CB_PRE_DELETE : + case PCLZIP_CB_POST_DELETE : + case PCLZIP_CB_PRE_LIST : + case PCLZIP_CB_POST_LIST : + */ + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_function_name = $p_options_list[$i+1]; + + // ----- Check that the value is a valid existing function + if (!function_exists($v_function_name)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Set the attribute + $v_result_list[$p_options_list[$i]] = $v_function_name; + $i++; + break; + + default : + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Unknown parameter '" + .$p_options_list[$i]."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Next options + $i++; + } + + // ----- Look for mandatory options + if ($v_requested_options !== false) { + for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { + // ----- Look for mandatory option + if ($v_requested_options[$key] == 'mandatory') { + // ----- Look if present + if (!isset($v_result_list[$key])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); + + // ----- Return + return PclZip::errorCode(); + } + } + } + } + + // ----- Look for default values + if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { + + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privOptionDefaultThreshold() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privOptionDefaultThreshold(&$p_options) + { + $v_result=1; + + if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) { + return $v_result; + } + + // ----- Get 'memory_limit' configuration value + $v_memory_limit = ini_get('memory_limit'); + $v_memory_limit = trim($v_memory_limit); + $last = strtolower(substr($v_memory_limit, -1)); + + if($last == 'g') + //$v_memory_limit = $v_memory_limit*1024*1024*1024; + $v_memory_limit = $v_memory_limit*1073741824; + if($last == 'm') + //$v_memory_limit = $v_memory_limit*1024*1024; + $v_memory_limit = $v_memory_limit*1048576; + if($last == 'k') + $v_memory_limit = $v_memory_limit*1024; + + $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO); + + + // ----- Sanity check : No threshold if value lower than 1M + if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) { + unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privFileDescrParseAtt() + // Description : + // Parameters : + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false) + { + $v_result=1; + + // ----- For each file in the list check the attributes + foreach ($p_file_list as $v_key => $v_value) { + + // ----- Check if the option is supported + if (!isset($v_requested_options[$v_key])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for attribute + switch ($v_key) { + case PCLZIP_ATT_FILE_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['filename'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['filename'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + break; + + case PCLZIP_ATT_FILE_NEW_SHORT_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['new_short_name'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + break; + + case PCLZIP_ATT_FILE_NEW_FULL_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['new_full_name'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + break; + + // ----- Look for options that takes a string + case PCLZIP_ATT_FILE_COMMENT : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['comment'] = $v_value; + break; + + case PCLZIP_ATT_FILE_MTIME : + if (!is_integer($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['mtime'] = $v_value; + break; + + case PCLZIP_ATT_FILE_CONTENT : + $p_filedescr['content'] = $v_value; + break; + + default : + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Unknown parameter '".$v_key."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for mandatory options + if ($v_requested_options !== false) { + for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { + // ----- Look for mandatory option + if ($v_requested_options[$key] == 'mandatory') { + // ----- Look if present + if (!isset($p_file_list[$key])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); + return PclZip::errorCode(); + } + } + } + } + + // end foreach + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privFileDescrExpand() + // Description : + // This method look for each item of the list to see if its a file, a folder + // or a string to be added as file. For any other type of files (link, other) + // just ignore the item. + // Then prepare the information that will be stored for that file. + // When its a folder, expand the folder with all the files that are in that + // folder (recursively). + // Parameters : + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privFileDescrExpand(&$p_filedescr_list, &$p_options) + { + $v_result=1; + + // ----- Create a result list + $v_result_list = array(); + + // ----- Look each entry + for ($i=0; $iprivCalculateStoredFilename($v_descr, $p_options); + + // ----- Add the descriptor in result list + $v_result_list[sizeof($v_result_list)] = $v_descr; + + // ----- Look for folder + if ($v_descr['type'] == 'folder') { + // ----- List of items in folder + $v_dirlist_descr = array(); + $v_dirlist_nb = 0; + if ($v_folder_handler = @opendir($v_descr['filename'])) { + while (($v_item_handler = @readdir($v_folder_handler)) !== false) { + + // ----- Skip '.' and '..' + if (($v_item_handler == '.') || ($v_item_handler == '..')) { + continue; + } + + // ----- Compose the full filename + $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler; + + // ----- Look for different stored filename + // Because the name of the folder was changed, the name of the + // files/sub-folders also change + if (($v_descr['stored_filename'] != $v_descr['filename']) + && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) { + if ($v_descr['stored_filename'] != '') { + $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler; + } + else { + $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler; + } + } + + $v_dirlist_nb++; + } + + @closedir($v_folder_handler); + } + else { + // TBC : unable to open folder in read mode + } + + // ----- Expand each element of the list + if ($v_dirlist_nb != 0) { + // ----- Expand + if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) { + return $v_result; + } + + // ----- Concat the resulting list + $v_result_list = array_merge($v_result_list, $v_dirlist_descr); + } + else { + } + + // ----- Free local array + unset($v_dirlist_descr); + } + } + + // ----- Get the result list + $p_filedescr_list = $v_result_list; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCreate() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privCreate($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the file in write mode + if (($v_result = $this->privOpenFd('wb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Add the list of files + $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options); + + // ----- Close + $this->privCloseFd(); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAdd() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAdd($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Look if the archive exists or is empty + if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)) + { + + // ----- Do a create + $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options); + + // ----- Return + return $v_result; + } + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) + { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = $v_central_dir['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Swap the file descriptor + // Here is a trick : I swap the temporary fd with the zip fd, in order to use + // the following methods on the temporary fil and not the real archive + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Add the files + $v_header_list = array(); + if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) + { + fclose($v_zip_temp_fd); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($this->zip_fd); + + // ----- Copy the block of file headers from the old archive + $v_size = $v_central_dir['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_zip_temp_fd, $v_read_size); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Create the Central Dir files header + for ($i=0, $v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { + fclose($v_zip_temp_fd); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file comment + $v_comment = $v_central_dir['comment']; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) { + $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT]; + } + if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($this->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1) + { + // ----- Reset the file list + unset($v_header_list); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Swap back the file descriptor + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Close + $this->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privOpenFd() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privOpenFd($p_mode) + { + $v_result=1; + + // ----- Look if already open + if ($this->zip_fd != 0) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCloseFd() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privCloseFd() + { + $v_result=1; + + if ($this->zip_fd != 0) + @fclose($this->zip_fd); + $this->zip_fd = 0; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddList() + // Description : + // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is + // different from the real path of the file. This is usefull if you want to have PclTar + // running in any directory, and memorize relative path from an other directory. + // Parameters : + // $p_list : An array containing the file or directory names to add in the tar + // $p_result_list : list of added files with their properties (specially the status field) + // $p_add_dir : Path to add in the filename path archived + // $p_remove_dir : Path to remove in the filename path archived + // Return Values : + // -------------------------------------------------------------------------------- +// function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) + function privAddList($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + + // ----- Add the files + $v_header_list = array(); + if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($this->zip_fd); + + // ----- Create the Central Dir files header + for ($i=0,$v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { + // ----- Return + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file comment + $v_comment = ''; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($this->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1) + { + // ----- Reset the file list + unset($v_header_list); + + // ----- Return + return $v_result; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFileList() + // Description : + // Parameters : + // $p_filedescr_list : An array containing the file description + // or directory names to add in the zip + // $p_result_list : list of added files with their properties (specially the status field) + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_header = array(); + + // ----- Recuperate the current number of elt in list + $v_nb = sizeof($p_result_list); + + // ----- Loop on the files + for ($j=0; ($jprivAddFile($p_filedescr_list[$j], $v_header, + $p_options); + if ($v_result != 1) { + return $v_result; + } + + // ----- Store the file infos + $p_result_list[$v_nb++] = $v_header; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFile($p_filedescr, &$p_header, &$p_options) + { + $v_result=1; + + // ----- Working variable + $p_filename = $p_filedescr['filename']; + + // TBC : Already done in the fileAtt check ... ? + if ($p_filename == "") { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for a stored different filename + /* TBC : Removed + if (isset($p_filedescr['stored_filename'])) { + $v_stored_filename = $p_filedescr['stored_filename']; + } + else { + $v_stored_filename = $p_filedescr['stored_filename']; + } + */ + + // ----- Set the file properties + clearstatcache(); + $p_header['version'] = 20; + $p_header['version_extracted'] = 10; + $p_header['flag'] = 0; + $p_header['compression'] = 0; + $p_header['crc'] = 0; + $p_header['compressed_size'] = 0; + $p_header['filename_len'] = strlen($p_filename); + $p_header['extra_len'] = 0; + $p_header['disk'] = 0; + $p_header['internal'] = 0; + $p_header['offset'] = 0; + $p_header['filename'] = $p_filename; +// TBC : Removed $p_header['stored_filename'] = $v_stored_filename; + $p_header['stored_filename'] = $p_filedescr['stored_filename']; + $p_header['extra'] = ''; + $p_header['status'] = 'ok'; + $p_header['index'] = -1; + + // ----- Look for regular file + if ($p_filedescr['type']=='file') { + $p_header['external'] = 0x00000000; + $p_header['size'] = filesize($p_filename); + } + + // ----- Look for regular folder + else if ($p_filedescr['type']=='folder') { + $p_header['external'] = 0x00000010; + $p_header['mtime'] = filemtime($p_filename); + $p_header['size'] = filesize($p_filename); + } + + // ----- Look for virtual file + else if ($p_filedescr['type'] == 'virtual_file') { + $p_header['external'] = 0x00000000; + $p_header['size'] = strlen($p_filedescr['content']); + } + + + // ----- Look for filetime + if (isset($p_filedescr['mtime'])) { + $p_header['mtime'] = $p_filedescr['mtime']; + } + else if ($p_filedescr['type'] == 'virtual_file') { + $p_header['mtime'] = time(); + } + else { + $p_header['mtime'] = filemtime($p_filename); + } + + // ------ Look for file comment + if (isset($p_filedescr['comment'])) { + $p_header['comment_len'] = strlen($p_filedescr['comment']); + $p_header['comment'] = $p_filedescr['comment']; + } + else { + $p_header['comment_len'] = 0; + $p_header['comment'] = ''; + } + + // ----- Look for pre-add callback + if (isset($p_options[PCLZIP_CB_PRE_ADD])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_header, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_header['status'] = "skipped"; + $v_result = 1; + } + + // ----- Update the informations + // Only some fields can be modified + if ($p_header['stored_filename'] != $v_local_header['stored_filename']) { + $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']); + } + } + + // ----- Look for empty stored filename + if ($p_header['stored_filename'] == "") { + $p_header['status'] = "filtered"; + } + + // ----- Check the path length + if (strlen($p_header['stored_filename']) > 0xFF) { + $p_header['status'] = 'filename_too_long'; + } + + // ----- Look if no error, or file not skipped + if ($p_header['status'] == 'ok') { + + // ----- Look for a file + if ($p_filedescr['type'] == 'file') { + // ----- Look for using temporary file to zip + if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) + && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) + || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) { + $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options); + if ($v_result < PCLZIP_ERR_NO_ERROR) { + return $v_result; + } + } + + // ----- Use "in memory" zip algo + else { + + // ----- Open the source file + if (($v_file = @fopen($p_filename, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); + return PclZip::errorCode(); + } + + // ----- Read the file content + $v_content = @fread($v_file, $p_header['size']); + + // ----- Close the file + @fclose($v_file); + + // ----- Calculate the CRC + $p_header['crc'] = @crc32($v_content); + + // ----- Look for no compression + if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { + // ----- Set header parameters + $p_header['compressed_size'] = $p_header['size']; + $p_header['compression'] = 0; + } + + // ----- Look for normal compression + else { + // ----- Compress the content + $v_content = @gzdeflate($v_content); + + // ----- Set header parameters + $p_header['compressed_size'] = strlen($v_content); + $p_header['compression'] = 8; + } + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + @fclose($v_file); + return $v_result; + } + + // ----- Write the compressed (or not) content + @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); + + } + + } + + // ----- Look for a virtual file (a file from string) + else if ($p_filedescr['type'] == 'virtual_file') { + + $v_content = $p_filedescr['content']; + + // ----- Calculate the CRC + $p_header['crc'] = @crc32($v_content); + + // ----- Look for no compression + if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { + // ----- Set header parameters + $p_header['compressed_size'] = $p_header['size']; + $p_header['compression'] = 0; + } + + // ----- Look for normal compression + else { + // ----- Compress the content + $v_content = @gzdeflate($v_content); + + // ----- Set header parameters + $p_header['compressed_size'] = strlen($v_content); + $p_header['compression'] = 8; + } + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + @fclose($v_file); + return $v_result; + } + + // ----- Write the compressed (or not) content + @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); + } + + // ----- Look for a directory + else if ($p_filedescr['type'] == 'folder') { + // ----- Look for directory last '/' + if (@substr($p_header['stored_filename'], -1) != '/') { + $p_header['stored_filename'] .= '/'; + } + + // ----- Set the file properties + $p_header['size'] = 0; + //$p_header['external'] = 0x41FF0010; // Value for a folder : to be checked + $p_header['external'] = 0x00000010; // Value for a folder : to be checked + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) + { + return $v_result; + } + } + } + + // ----- Look for post-add callback + if (isset($p_options[PCLZIP_CB_POST_ADD])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_header, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header); + if ($v_result == 0) { + // ----- Ignored + $v_result = 1; + } + + // ----- Update the informations + // Nothing can be modified + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFileUsingTempFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options) + { + $v_result=PCLZIP_ERR_NO_ERROR; + + // ----- Working variable + $p_filename = $p_filedescr['filename']; + + + // ----- Open the source file + if (($v_file = @fopen($p_filename, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); + return PclZip::errorCode(); + } + + // ----- Creates a compressed temporary file + $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; + if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) { + fclose($v_file); + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); + return PclZip::errorCode(); + } + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = filesize($p_filename); + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_file, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @gzputs($v_file_compressed, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close the file + @fclose($v_file); + @gzclose($v_file_compressed); + + // ----- Check the minimum file size + if (filesize($v_gzip_temp_name) < 18) { + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \''.$v_gzip_temp_name.'\' has invalid filesize - should be minimum 18 bytes'); + return PclZip::errorCode(); + } + + // ----- Extract the compressed attributes + if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + // ----- Read the gzip file header + $v_binary_data = @fread($v_file_compressed, 10); + $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data); + + // ----- Check some parameters + $v_data_header['os'] = bin2hex($v_data_header['os']); + + // ----- Read the gzip file footer + @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8); + $v_binary_data = @fread($v_file_compressed, 8); + $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data); + + // ----- Set the attributes + $p_header['compression'] = ord($v_data_header['cm']); + //$p_header['mtime'] = $v_data_header['mtime']; + $p_header['crc'] = $v_data_footer['crc']; + $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18; + + // ----- Close the file + @fclose($v_file_compressed); + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + return $v_result; + } + + // ----- Add the compressed data + if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) + { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + fseek($v_file_compressed, 10); + $v_size = $p_header['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_file_compressed, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close the file + @fclose($v_file_compressed); + + // ----- Unlink the temporary file + @unlink($v_gzip_temp_name); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCalculateStoredFilename() + // Description : + // Based on file descriptor properties and global options, this method + // calculate the filename that will be stored in the archive. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privCalculateStoredFilename(&$p_filedescr, &$p_options) + { + $v_result=1; + + // ----- Working variables + $p_filename = $p_filedescr['filename']; + if (isset($p_options[PCLZIP_OPT_ADD_PATH])) { + $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH]; + } + else { + $p_add_dir = ''; + } + if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) { + $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH]; + } + else { + $p_remove_dir = ''; + } + if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + else { + $p_remove_all_dir = 0; + } + + + // ----- Look for full name change + if (isset($p_filedescr['new_full_name'])) { + // ----- Remove drive letter if any + $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']); + } + + // ----- Look for path and/or short name change + else { + + // ----- Look for short name change + // Its when we cahnge just the filename but not the path + if (isset($p_filedescr['new_short_name'])) { + $v_path_info = pathinfo($p_filename); + $v_dir = ''; + if ($v_path_info['dirname'] != '') { + $v_dir = $v_path_info['dirname'].'/'; + } + $v_stored_filename = $v_dir.$p_filedescr['new_short_name']; + } + else { + // ----- Calculate the stored filename + $v_stored_filename = $p_filename; + } + + // ----- Look for all path to remove + if ($p_remove_all_dir) { + $v_stored_filename = basename($p_filename); + } + // ----- Look for partial path remove + else if ($p_remove_dir != "") { + if (substr($p_remove_dir, -1) != '/') + $p_remove_dir .= "/"; + + if ( (substr($p_filename, 0, 2) == "./") + || (substr($p_remove_dir, 0, 2) == "./")) { + + if ( (substr($p_filename, 0, 2) == "./") + && (substr($p_remove_dir, 0, 2) != "./")) { + $p_remove_dir = "./".$p_remove_dir; + } + if ( (substr($p_filename, 0, 2) != "./") + && (substr($p_remove_dir, 0, 2) == "./")) { + $p_remove_dir = substr($p_remove_dir, 2); + } + } + + $v_compare = PclZipUtilPathInclusion($p_remove_dir, + $v_stored_filename); + if ($v_compare > 0) { + if ($v_compare == 2) { + $v_stored_filename = ""; + } + else { + $v_stored_filename = substr($v_stored_filename, + strlen($p_remove_dir)); + } + } + } + + // ----- Remove drive letter if any + $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename); + + // ----- Look for path to add + if ($p_add_dir != "") { + if (substr($p_add_dir, -1) == "/") + $v_stored_filename = $p_add_dir.$v_stored_filename; + else + $v_stored_filename = $p_add_dir."/".$v_stored_filename; + } + } + + // ----- Filename (reduce the path of stored name) + $v_stored_filename = PclZipUtilPathReduction($v_stored_filename); + $p_filedescr['stored_filename'] = $v_stored_filename; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteFileHeader(&$p_header) + { + $v_result=1; + + // ----- Store the offset position of the file + $p_header['offset'] = ftell($this->zip_fd); + + // ----- Transform UNIX mtime to DOS format mdate/mtime + $v_date = getdate($p_header['mtime']); + $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; + $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; + + // ----- Packed data + $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50, + $p_header['version_extracted'], $p_header['flag'], + $p_header['compression'], $v_mtime, $v_mdate, + $p_header['crc'], $p_header['compressed_size'], + $p_header['size'], + strlen($p_header['stored_filename']), + $p_header['extra_len']); + + // ----- Write the first 148 bytes of the header in the archive + fputs($this->zip_fd, $v_binary_data, 30); + + // ----- Write the variable fields + if (strlen($p_header['stored_filename']) != 0) + { + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); + } + if ($p_header['extra_len'] != 0) + { + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteCentralFileHeader(&$p_header) + { + $v_result=1; + + // TBC + //for(reset($p_header); $key = key($p_header); next($p_header)) { + //} + + // ----- Transform UNIX mtime to DOS format mdate/mtime + $v_date = getdate($p_header['mtime']); + $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; + $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; + + + // ----- Packed data + $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50, + $p_header['version'], $p_header['version_extracted'], + $p_header['flag'], $p_header['compression'], + $v_mtime, $v_mdate, $p_header['crc'], + $p_header['compressed_size'], $p_header['size'], + strlen($p_header['stored_filename']), + $p_header['extra_len'], $p_header['comment_len'], + $p_header['disk'], $p_header['internal'], + $p_header['external'], $p_header['offset']); + + // ----- Write the 42 bytes of the header in the zip file + fputs($this->zip_fd, $v_binary_data, 46); + + // ----- Write the variable fields + if (strlen($p_header['stored_filename']) != 0) + { + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); + } + if ($p_header['extra_len'] != 0) + { + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); + } + if ($p_header['comment_len'] != 0) + { + fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteCentralHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment) + { + $v_result=1; + + // ----- Packed data + $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries, + $p_nb_entries, $p_size, + $p_offset, strlen($p_comment)); + + // ----- Write the 22 bytes of the header in the zip file + fputs($this->zip_fd, $v_binary_data, 22); + + // ----- Write the variable fields + if (strlen($p_comment) != 0) + { + fputs($this->zip_fd, $p_comment, strlen($p_comment)); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privList() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privList(&$p_list) + { + $v_result=1; + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) + { + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Go to beginning of Central Dir + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_central_dir['offset'])) + { + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read each entry + for ($i=0; $i<$v_central_dir['entries']; $i++) + { + // ----- Read the file header + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) + { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + $v_header['index'] = $i; + + // ----- Get the only interesting attributes + $this->privConvertHeader2FileInfo($v_header, $p_list[$i]); + unset($v_header); + } + + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privConvertHeader2FileInfo() + // Description : + // This function takes the file informations from the central directory + // entries and extract the interesting parameters that will be given back. + // The resulting file infos are set in the array $p_info + // $p_info['filename'] : Filename with full path. Given by user (add), + // extracted in the filesystem (extract). + // $p_info['stored_filename'] : Stored filename in the archive. + // $p_info['size'] = Size of the file. + // $p_info['compressed_size'] = Compressed size of the file. + // $p_info['mtime'] = Last modification date of the file. + // $p_info['comment'] = Comment associated with the file. + // $p_info['folder'] = true/false : indicates if the entry is a folder or not. + // $p_info['status'] = status of the action on the file. + // $p_info['crc'] = CRC of the file content. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privConvertHeader2FileInfo($p_header, &$p_info) + { + $v_result=1; + + // ----- Get the interesting attributes + $v_temp_path = PclZipUtilPathReduction($p_header['filename']); + $p_info['filename'] = $v_temp_path; + $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']); + $p_info['stored_filename'] = $v_temp_path; + $p_info['size'] = $p_header['size']; + $p_info['compressed_size'] = $p_header['compressed_size']; + $p_info['mtime'] = $p_header['mtime']; + $p_info['comment'] = $p_header['comment']; + $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010); + $p_info['index'] = $p_header['index']; + $p_info['status'] = $p_header['status']; + $p_info['crc'] = $p_header['crc']; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractByRule() + // Description : + // Extract a file or directory depending of rules (by index, by name, ...) + // Parameters : + // $p_file_list : An array where will be placed the properties of each + // extracted file + // $p_path : Path to add while writing the extracted files + // $p_remove_path : Path to remove (from the file memorized path) while writing the + // extracted files. If the path does not match the file path, + // the file is extracted with its memorized path. + // $p_remove_path does not apply to 'list' mode. + // $p_path and $p_remove_path are commulative. + // Return Values : + // 1 on success,0 or less on error (see error code list) + // -------------------------------------------------------------------------------- + function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) + { + $v_result=1; + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Check the path + if ( ($p_path == "") + || ( (substr($p_path, 0, 1) != "/") + && (substr($p_path, 0, 3) != "../") + && (substr($p_path,1,2)!=":/"))) + $p_path = "./".$p_path; + + // ----- Reduce the path last (and duplicated) '/' + if (($p_path != "./") && ($p_path != "/")) + { + // ----- Look for the path end '/' + while (substr($p_path, -1) == "/") + { + $p_path = substr($p_path, 0, strlen($p_path)-1); + } + } + + // ----- Look for path to remove format (should end by /) + if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) + { + $p_remove_path .= '/'; + } + $p_remove_path_size = strlen($p_remove_path); + + // ----- Open the zip file + if (($v_result = $this->privOpenFd('rb')) != 1) + { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Start at beginning of Central Dir + $v_pos_entry = $v_central_dir['offset']; + + // ----- Read each entry + $j_start = 0; + for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) + { + + // ----- Read next Central dir entry + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_pos_entry)) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Store the index + $v_header['index'] = $i; + + // ----- Store the file position + $v_pos_entry = ftell($this->zip_fd); + + // ----- Look for the specific extract rules + $v_extract = false; + + // ----- Look for extract by name rule + if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) + && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { + + // ----- Look if the filename is in the list + for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) + && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_extract = true; + } + } + // ----- Look for a filename + elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { + $v_extract = true; + } + } + } + + // ----- Look for extract by ereg rule + // ereg() is deprecated with PHP 5.3 + /* + else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) + && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { + + if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) { + $v_extract = true; + } + } + */ + + // ----- Look for extract by preg rule + else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) + && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { + + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) { + $v_extract = true; + } + } + + // ----- Look for extract by index rule + else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) + && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { + + // ----- Look if the index is in the list + for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { + $v_extract = true; + } + if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { + $j_start = $j+1; + } + + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { + break; + } + } + } + + // ----- Look for no rule, which means extract all the archive + else { + $v_extract = true; + } + + // ----- Check compression method + if ( ($v_extract) + && ( ($v_header['compression'] != 8) + && ($v_header['compression'] != 0))) { + $v_header['status'] = 'unsupported_compression'; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, + "Filename '".$v_header['stored_filename']."' is " + ."compressed by an unsupported compression " + ."method (".$v_header['compression'].") "); + + return PclZip::errorCode(); + } + } + + // ----- Check encrypted files + if (($v_extract) && (($v_header['flag'] & 1) == 1)) { + $v_header['status'] = 'unsupported_encryption'; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, + "Unsupported encryption for " + ." filename '".$v_header['stored_filename'] + ."'"); + + return PclZip::errorCode(); + } + } + + // ----- Look for real extraction + if (($v_extract) && ($v_header['status'] != 'ok')) { + $v_result = $this->privConvertHeader2FileInfo($v_header, + $p_file_list[$v_nb_extracted++]); + if ($v_result != 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + $v_extract = false; + } + + // ----- Look for real extraction + if ($v_extract) + { + + // ----- Go to the file position + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_header['offset'])) + { + // ----- Close the zip file + $this->privCloseFd(); + + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for extraction as string + if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) { + + $v_string = ''; + + // ----- Extracting the file + $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Set the file content + $p_file_list[$v_nb_extracted]['content'] = $v_string; + + // ----- Next extracted file + $v_nb_extracted++; + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + // ----- Look for extraction in standard output + elseif ( (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) + && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) { + // ----- Extracting the file in standard output + $v_result1 = $this->privExtractFileInOutput($v_header, $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + // ----- Look for normal extraction + else { + // ----- Extracting the file + $v_result1 = $this->privExtractFile($v_header, + $p_path, $p_remove_path, + $p_remove_all_path, + $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + } + } + + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFile() + // Description : + // Parameters : + // Return Values : + // + // 1 : ... ? + // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback + // -------------------------------------------------------------------------------- + function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) + { + $v_result=1; + + // ----- Read the file header + if (($v_result = $this->privReadFileHeader($v_header)) != 1) + { + // ----- Return + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for all path to remove + if ($p_remove_all_path == true) { + // ----- Look for folder entry that not need to be extracted + if (($p_entry['external']&0x00000010)==0x00000010) { + + $p_entry['status'] = "filtered"; + + return $v_result; + } + + // ----- Get the basename of the path + $p_entry['filename'] = basename($p_entry['filename']); + } + + // ----- Look for path to remove + else if ($p_remove_path != "") + { + if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) + { + + // ----- Change the file status + $p_entry['status'] = "filtered"; + + // ----- Return + return $v_result; + } + + $p_remove_path_size = strlen($p_remove_path); + if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) + { + + // ----- Remove the path + $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size); + + } + } + + // ----- Add the path + if ($p_path != '') { + $p_entry['filename'] = $p_path."/".$p_entry['filename']; + } + + // ----- Check a base_dir_restriction + if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) { + $v_inclusion + = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION], + $p_entry['filename']); + if ($v_inclusion == 0) { + + PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION, + "Filename '".$p_entry['filename']."' is " + ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION"); + + return PclZip::errorCode(); + } + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Look for specific actions while the file exist + if (file_exists($p_entry['filename'])) + { + + // ----- Look if file is a directory + if (is_dir($p_entry['filename'])) + { + + // ----- Change the file status + $p_entry['status'] = "already_a_directory"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY, + "Filename '".$p_entry['filename']."' is " + ."already used by an existing directory"); + + return PclZip::errorCode(); + } + } + // ----- Look if file is write protected + else if (!is_writeable($p_entry['filename'])) + { + + // ----- Change the file status + $p_entry['status'] = "write_protected"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, + "Filename '".$p_entry['filename']."' exists " + ."and is write protected"); + + return PclZip::errorCode(); + } + } + + // ----- Look if the extracted file is older + else if (filemtime($p_entry['filename']) > $p_entry['mtime']) + { + // ----- Change the file status + if ( (isset($p_options[PCLZIP_OPT_REPLACE_NEWER])) + && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) { + } + else { + $p_entry['status'] = "newer_exist"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, + "Newer version of '".$p_entry['filename']."' exists " + ."and option PCLZIP_OPT_REPLACE_NEWER is not selected"); + + return PclZip::errorCode(); + } + } + } + else { + } + } + + // ----- Check the directory availability and create it if necessary + else { + if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/')) + $v_dir_to_check = $p_entry['filename']; + else if (!strstr($p_entry['filename'], "/")) + $v_dir_to_check = ""; + else + $v_dir_to_check = dirname($p_entry['filename']); + + if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) { + + // ----- Change the file status + $p_entry['status'] = "path_creation_fail"; + + // ----- Return + //return $v_result; + $v_result = 1; + } + } + } + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) + { + // ----- Look for not compressed file + if ($p_entry['compression'] == 0) { + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) + { + + // ----- Change the file status + $p_entry['status'] = "write_error"; + + // ----- Return + return $v_result; + } + + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + /* Try to speed up the code + $v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_binary_data, $v_read_size); + */ + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Closing the destination file + fclose($v_dest_file); + + // ----- Change the file mtime + touch($p_entry['filename'], $p_entry['mtime']); + + + } + else { + // ----- TBC + // Need to be finished + if (($p_entry['flag'] & 1) == 1) { + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \''.$p_entry['filename'].'\' is encrypted. Encrypted files are not supported.'); + return PclZip::errorCode(); + } + + + // ----- Look for using temporary file to unzip + if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) + && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) + || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) ) ) { + $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options); + if ($v_result < PCLZIP_ERR_NO_ERROR) { + return $v_result; + } + } + + // ----- Look for extract in memory + else { + + + // ----- Read the compressed file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + $v_file_content = @gzinflate($v_buffer); + unset($v_buffer); + if ($v_file_content === FALSE) { + + // ----- Change the file status + // TBC + $p_entry['status'] = "error"; + + return $v_result; + } + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { + + // ----- Change the file status + $p_entry['status'] = "write_error"; + + return $v_result; + } + + // ----- Write the uncompressed data + @fwrite($v_dest_file, $v_file_content, $p_entry['size']); + unset($v_file_content); + + // ----- Closing the destination file + @fclose($v_dest_file); + + } + + // ----- Change the file mtime + @touch($p_entry['filename'], $p_entry['mtime']); + } + + // ----- Look for chmod option + if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) { + + // ----- Change the mode of the file + @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]); + } + + } + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileUsingTempFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileUsingTempFile(&$p_entry, &$p_options) + { + $v_result=1; + + // ----- Creates a temporary file + $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; + if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) { + fclose($v_file); + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); + return PclZip::errorCode(); + } + + + // ----- Write gz file format header + $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3)); + @fwrite($v_dest_file, $v_binary_data, 10); + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Write gz file format footer + $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']); + @fwrite($v_dest_file, $v_binary_data, 8); + + // ----- Close the temporary file + @fclose($v_dest_file); + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { + $p_entry['status'] = "write_error"; + return $v_result; + } + + // ----- Open the temporary gz file + if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) { + @fclose($v_dest_file); + $p_entry['status'] = "read_error"; + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['size']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($v_src_file, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + @fclose($v_dest_file); + @gzclose($v_src_file); + + // ----- Delete the temporary file + @unlink($v_gzip_temp_name); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileInOutput() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileInOutput(&$p_entry, &$p_options) + { + $v_result=1; + + // ----- Read the file header + if (($v_result = $this->privReadFileHeader($v_header)) != 1) { + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + // ----- Trace + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) { + // ----- Look for not compressed file + if ($p_entry['compressed_size'] == $p_entry['size']) { + + // ----- Read the file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Send the file to the output + echo $v_buffer; + unset($v_buffer); + } + else { + + // ----- Read the compressed file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + $v_file_content = gzinflate($v_buffer); + unset($v_buffer); + + // ----- Send the file to the output + echo $v_file_content; + unset($v_file_content); + } + } + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileAsString() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileAsString(&$p_entry, &$p_string, &$p_options) + { + $v_result=1; + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->privReadFileHeader($v_header)) != 1) + { + // ----- Return + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) { + // ----- Look for not compressed file + // if ($p_entry['compressed_size'] == $p_entry['size']) + if ($p_entry['compression'] == 0) { + + // ----- Reading the file + $p_string = @fread($this->zip_fd, $p_entry['compressed_size']); + } + else { + + // ----- Reading the file + $v_data = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + if (($p_string = @gzinflate($v_data)) === FALSE) { + // TBC + } + } + + // ----- Trace + } + else { + // TBC : error : can not extract a folder in a string + } + + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Swap the content to header + $v_local_header['content'] = $p_string; + $p_string = ''; + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Swap back the content to header + $p_string = $v_local_header['content']; + unset($v_local_header['content']); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadFileHeader(&$p_header) + { + $v_result=1; + + // ----- Read the 4 bytes signature + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] != 0x04034b50) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the first 42 bytes of the header + $v_binary_data = fread($this->zip_fd, 26); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 26) + { + $p_header['filename'] = ""; + $p_header['status'] = "invalid_header"; + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data); + + // ----- Get filename + $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']); + + // ----- Get extra_fields + if ($v_data['extra_len'] != 0) { + $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']); + } + else { + $p_header['extra'] = ''; + } + + // ----- Extract properties + $p_header['version_extracted'] = $v_data['version']; + $p_header['compression'] = $v_data['compression']; + $p_header['size'] = $v_data['size']; + $p_header['compressed_size'] = $v_data['compressed_size']; + $p_header['crc'] = $v_data['crc']; + $p_header['flag'] = $v_data['flag']; + $p_header['filename_len'] = $v_data['filename_len']; + + // ----- Recuperate date in UNIX format + $p_header['mdate'] = $v_data['mdate']; + $p_header['mtime'] = $v_data['mtime']; + if ($p_header['mdate'] && $p_header['mtime']) + { + // ----- Extract time + $v_hour = ($p_header['mtime'] & 0xF800) >> 11; + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; + $v_seconde = ($p_header['mtime'] & 0x001F)*2; + + // ----- Extract date + $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; + $v_month = ($p_header['mdate'] & 0x01E0) >> 5; + $v_day = $p_header['mdate'] & 0x001F; + + // ----- Get UNIX date format + $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); + + } + else + { + $p_header['mtime'] = time(); + } + + // TBC + //for(reset($v_data); $key = key($v_data); next($v_data)) { + //} + + // ----- Set the stored filename + $p_header['stored_filename'] = $p_header['filename']; + + // ----- Set the status field + $p_header['status'] = "ok"; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadCentralFileHeader(&$p_header) + { + $v_result=1; + + // ----- Read the 4 bytes signature + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] != 0x02014b50) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the first 42 bytes of the header + $v_binary_data = fread($this->zip_fd, 42); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 42) + { + $p_header['filename'] = ""; + $p_header['status'] = "invalid_header"; + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data); + + // ----- Get filename + if ($p_header['filename_len'] != 0) + $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']); + else + $p_header['filename'] = ''; + + // ----- Get extra + if ($p_header['extra_len'] != 0) + $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']); + else + $p_header['extra'] = ''; + + // ----- Get comment + if ($p_header['comment_len'] != 0) + $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']); + else + $p_header['comment'] = ''; + + // ----- Extract properties + + // ----- Recuperate date in UNIX format + //if ($p_header['mdate'] && $p_header['mtime']) + // TBC : bug : this was ignoring time with 0/0/0 + if (1) + { + // ----- Extract time + $v_hour = ($p_header['mtime'] & 0xF800) >> 11; + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; + $v_seconde = ($p_header['mtime'] & 0x001F)*2; + + // ----- Extract date + $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; + $v_month = ($p_header['mdate'] & 0x01E0) >> 5; + $v_day = $p_header['mdate'] & 0x001F; + + // ----- Get UNIX date format + $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); + + } + else + { + $p_header['mtime'] = time(); + } + + // ----- Set the stored filename + $p_header['stored_filename'] = $p_header['filename']; + + // ----- Set default status to ok + $p_header['status'] = 'ok'; + + // ----- Look if it is a directory + if (substr($p_header['filename'], -1) == '/') { + //$p_header['external'] = 0x41FF0010; + $p_header['external'] = 0x00000010; + } + + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCheckFileHeaders() + // Description : + // Parameters : + // Return Values : + // 1 on success, + // 0 on error; + // -------------------------------------------------------------------------------- + function privCheckFileHeaders(&$p_local_header, &$p_central_header) + { + $v_result=1; + + // ----- Check the static values + // TBC + if ($p_local_header['filename'] != $p_central_header['filename']) { + } + if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) { + } + if ($p_local_header['flag'] != $p_central_header['flag']) { + } + if ($p_local_header['compression'] != $p_central_header['compression']) { + } + if ($p_local_header['mtime'] != $p_central_header['mtime']) { + } + if ($p_local_header['filename_len'] != $p_central_header['filename_len']) { + } + + // ----- Look for flag bit 3 + if (($p_local_header['flag'] & 8) == 8) { + $p_local_header['size'] = $p_central_header['size']; + $p_local_header['compressed_size'] = $p_central_header['compressed_size']; + $p_local_header['crc'] = $p_central_header['crc']; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadEndCentralDir() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadEndCentralDir(&$p_central_dir) + { + $v_result=1; + + // ----- Go to the end of the zip file + $v_size = filesize($this->zipname); + @fseek($this->zip_fd, $v_size); + if (@ftell($this->zip_fd) != $v_size) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- First try : look if this is an archive with no commentaries (most of the time) + // in this case the end of central dir is at 22 bytes of the file end + $v_found = 0; + if ($v_size > 26) { + @fseek($this->zip_fd, $v_size-22); + if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read for bytes + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = @unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] == 0x06054b50) { + $v_found = 1; + } + + $v_pos = ftell($this->zip_fd); + } + + // ----- Go back to the maximum possible size of the Central Dir End Record + if (!$v_found) { + $v_maximum_size = 65557; // 0xFFFF + 22; + if ($v_maximum_size > $v_size) + $v_maximum_size = $v_size; + @fseek($this->zip_fd, $v_size-$v_maximum_size); + if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read byte per byte in order to find the signature + $v_pos = ftell($this->zip_fd); + $v_bytes = 0x00000000; + while ($v_pos < $v_size) + { + // ----- Read a byte + $v_byte = @fread($this->zip_fd, 1); + + // ----- Add the byte + //$v_bytes = ($v_bytes << 8) | Ord($v_byte); + // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number + // Otherwise on systems where we have 64bit integers the check below for the magic number will fail. + $v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte); + + // ----- Compare the bytes + if ($v_bytes == 0x504b0506) + { + $v_pos++; + break; + } + + $v_pos++; + } + + // ----- Look if not found end of central dir + if ($v_pos == $v_size) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature"); + + // ----- Return + return PclZip::errorCode(); + } + } + + // ----- Read the first 18 bytes of the header + $v_binary_data = fread($this->zip_fd, 18); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 18) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data); + + // ----- Check the global size + if (($v_pos + $v_data['comment_size'] + 18) != $v_size) { + + // ----- Removed in release 2.2 see readme file + // The check of the file size is a little too strict. + // Some bugs where found when a zip is encrypted/decrypted with 'crypt'. + // While decrypted, zip has training 0 bytes + if (0) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, + 'The central dir is not at the end of the archive.' + .' Some trailing bytes exists after the archive.'); + + // ----- Return + return PclZip::errorCode(); + } + } + + // ----- Get comment + if ($v_data['comment_size'] != 0) { + $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']); + } + else + $p_central_dir['comment'] = ''; + + $p_central_dir['entries'] = $v_data['entries']; + $p_central_dir['disk_entries'] = $v_data['disk_entries']; + $p_central_dir['offset'] = $v_data['offset']; + $p_central_dir['size'] = $v_data['size']; + $p_central_dir['disk'] = $v_data['disk']; + $p_central_dir['disk_start'] = $v_data['disk_start']; + + // TBC + //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) { + //} + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDeleteByRule() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDeleteByRule(&$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Scan all the files + // ----- Start at beginning of Central Dir + $v_pos_entry = $v_central_dir['offset']; + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_pos_entry)) + { + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read each entry + $v_header_list = array(); + $j_start = 0; + for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) + { + + // ----- Read the file header + $v_header_list[$v_nb_extracted] = array(); + if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + + return $v_result; + } + + + // ----- Store the index + $v_header_list[$v_nb_extracted]['index'] = $i; + + // ----- Look for the specific extract rules + $v_found = false; + + // ----- Look for extract by name rule + if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) + && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { + + // ----- Look if the filename is in the list + for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) + && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_found = true; + } + elseif ( (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */ + && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_found = true; + } + } + // ----- Look for a filename + elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { + $v_found = true; + } + } + } + + // ----- Look for extract by ereg rule + // ereg() is deprecated with PHP 5.3 + /* + else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) + && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { + + if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { + $v_found = true; + } + } + */ + + // ----- Look for extract by preg rule + else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) + && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { + + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { + $v_found = true; + } + } + + // ----- Look for extract by index rule + else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) + && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { + + // ----- Look if the index is in the list + for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { + $v_found = true; + } + if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { + $j_start = $j+1; + } + + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { + break; + } + } + } + else { + $v_found = true; + } + + // ----- Look for deletion + if ($v_found) + { + unset($v_header_list[$v_nb_extracted]); + } + else + { + $v_nb_extracted++; + } + } + + // ----- Look if something need to be deleted + if ($v_nb_extracted > 0) { + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Creates a temporary zip archive + $v_temp_zip = new PclZip($v_zip_temp_name); + + // ----- Open the temporary zip file in write mode + if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) { + $this->privCloseFd(); + + // ----- Return + return $v_result; + } + + // ----- Look which file need to be kept + for ($i=0; $izip_fd); + if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the file header + $v_local_header = array(); + if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Check that local file header is same as central file header + if ($this->privCheckFileHeaders($v_local_header, + $v_header_list[$i]) != 1) { + // TBC + } + unset($v_local_header); + + // ----- Write the file header + if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Read/write the data block + if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($v_temp_zip->zip_fd); + + // ----- Re-Create the Central Dir files header + for ($i=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Transform the header to a 'usable' info + $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + + // ----- Zip file comment + $v_comment = ''; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) { + // ----- Reset the file list + unset($v_header_list); + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Close + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Destroy the temporary archive + unset($v_temp_zip); + } + + // ----- Remove every files : reset the file + else if ($v_central_dir['entries'] != 0) { + $this->privCloseFd(); + + if (($v_result = $this->privOpenFd('wb')) != 1) { + return $v_result; + } + + if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) { + return $v_result; + } + + $this->privCloseFd(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDirCheck() + // Description : + // Check if a directory exists, if not it creates it and all the parents directory + // which may be useful. + // Parameters : + // $p_dir : Directory path to check. + // Return Values : + // 1 : OK + // -1 : Unable to create directory + // -------------------------------------------------------------------------------- + function privDirCheck($p_dir, $p_is_dir=false) + { + $v_result = 1; + + + // ----- Remove the final '/' + if (($p_is_dir) && (substr($p_dir, -1)=='/')) + { + $p_dir = substr($p_dir, 0, strlen($p_dir)-1); + } + + // ----- Check the directory availability + if ((is_dir($p_dir)) || ($p_dir == "")) + { + return 1; + } + + // ----- Extract parent directory + $p_parent_dir = dirname($p_dir); + + // ----- Just a check + if ($p_parent_dir != $p_dir) + { + // ----- Look for parent directory + if ($p_parent_dir != "") + { + if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) + { + return $v_result; + } + } + } + + // ----- Create the directory + if (!@mkdir($p_dir, 0777)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privMerge() + // Description : + // If $p_archive_to_add does not exist, the function exit with a success result. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privMerge(&$p_archive_to_add) + { + $v_result=1; + + // ----- Look if the archive_to_add exists + if (!is_file($p_archive_to_add->zipname)) + { + + // ----- Nothing to merge, so merge is a success + $v_result = 1; + + // ----- Return + return $v_result; + } + + // ----- Look if the archive exists + if (!is_file($this->zipname)) + { + + // ----- Do a duplicate + $v_result = $this->privDuplicate($p_archive_to_add->zipname); + + // ----- Return + return $v_result; + } + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Open the archive_to_add file + if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1) + { + $this->privCloseFd(); + + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir_to_add = array(); + if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + return $v_result; + } + + // ----- Go to beginning of File + @rewind($p_archive_to_add->zip_fd); + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = $v_central_dir['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Copy the files from the archive_to_add into the temporary file + $v_size = $v_central_dir_to_add['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($v_zip_temp_fd); + + // ----- Copy the block of file headers from the old archive + $v_size = $v_central_dir['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Copy the block of file headers from the archive_to_add + $v_size = $v_central_dir_to_add['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Merge the file comments + $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment']; + + // ----- Calculate the size of the (new) central header + $v_size = @ftell($v_zip_temp_fd)-$v_offset; + + // ----- Swap the file descriptor + // Here is a trick : I swap the temporary fd with the zip fd, in order to use + // the following methods on the temporary fil and not the real archive fd + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + @fclose($v_zip_temp_fd); + $this->zip_fd = null; + + // ----- Reset the file list + unset($v_header_list); + + // ----- Return + return $v_result; + } + + // ----- Swap back the file descriptor + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Close + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDuplicate() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDuplicate($p_archive_filename) + { + $v_result=1; + + // ----- Look if the $p_archive_filename exists + if (!is_file($p_archive_filename)) + { + + // ----- Nothing to duplicate, so duplicate is a success. + $v_result = 1; + + // ----- Return + return $v_result; + } + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('wb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) + { + $this->privCloseFd(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = filesize($p_archive_filename); + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($v_zip_temp_fd, $v_read_size); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close + $this->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privErrorLog() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privErrorLog($p_error_code=0, $p_error_string='') + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + PclError($p_error_code, $p_error_string); + } + else { + $this->error_code = $p_error_code; + $this->error_string = $p_error_string; + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privErrorReset() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privErrorReset() + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + PclErrorReset(); + } + else { + $this->error_code = 0; + $this->error_string = ''; + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDisableMagicQuotes() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDisableMagicQuotes() + { + $v_result=1; + + // ----- Look if function exists + if ( (!function_exists("get_magic_quotes_runtime")) + || (!function_exists("set_magic_quotes_runtime"))) { + return $v_result; + } + + // ----- Look if already done + if ($this->magic_quotes_status != -1) { + return $v_result; + } + + // ----- Get and memorize the magic_quote value + $this->magic_quotes_status = @get_magic_quotes_runtime(); + + // ----- Disable magic_quotes + if ($this->magic_quotes_status == 1) { + @set_magic_quotes_runtime(0); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privSwapBackMagicQuotes() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privSwapBackMagicQuotes() + { + $v_result=1; + + // ----- Look if function exists + if ( (!function_exists("get_magic_quotes_runtime")) + || (!function_exists("set_magic_quotes_runtime"))) { + return $v_result; + } + + // ----- Look if something to do + if ($this->magic_quotes_status != -1) { + return $v_result; + } + + // ----- Swap back magic_quotes + if ($this->magic_quotes_status == 1) { + @set_magic_quotes_runtime($this->magic_quotes_status); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + } + // End of class + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilPathReduction() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function PclZipUtilPathReduction($p_dir) + { + $v_result = ""; + + // ----- Look for not empty path + if ($p_dir != "") { + // ----- Explode path by directory names + $v_list = explode("/", $p_dir); + + // ----- Study directories from last to first + $v_skip = 0; + for ($i=sizeof($v_list)-1; $i>=0; $i--) { + // ----- Look for current path + if ($v_list[$i] == ".") { + // ----- Ignore this directory + // Should be the first $i=0, but no check is done + } + else if ($v_list[$i] == "..") { + $v_skip++; + } + else if ($v_list[$i] == "") { + // ----- First '/' i.e. root slash + if ($i == 0) { + $v_result = "/".$v_result; + if ($v_skip > 0) { + // ----- It is an invalid path, so the path is not modified + // TBC + $v_result = $p_dir; + $v_skip = 0; + } + } + // ----- Last '/' i.e. indicates a directory + else if ($i == (sizeof($v_list)-1)) { + $v_result = $v_list[$i]; + } + // ----- Double '/' inside the path + else { + // ----- Ignore only the double '//' in path, + // but not the first and last '/' + } + } + else { + // ----- Look for item to skip + if ($v_skip > 0) { + $v_skip--; + } + else { + $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:""); + } + } + } + + // ----- Look for skip + if ($v_skip > 0) { + while ($v_skip > 0) { + $v_result = '../'.$v_result; + $v_skip--; + } + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilPathInclusion() + // Description : + // This function indicates if the path $p_path is under the $p_dir tree. Or, + // said in an other way, if the file or sub-dir $p_path is inside the dir + // $p_dir. + // The function indicates also if the path is exactly the same as the dir. + // This function supports path with duplicated '/' like '//', but does not + // support '.' or '..' statements. + // Parameters : + // Return Values : + // 0 if $p_path is not inside directory $p_dir + // 1 if $p_path is inside directory $p_dir + // 2 if $p_path is exactly the same as $p_dir + // -------------------------------------------------------------------------------- + function PclZipUtilPathInclusion($p_dir, $p_path) + { + $v_result = 1; + + // ----- Look for path beginning by ./ + if ( ($p_dir == '.') + || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) { + $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1); + } + if ( ($p_path == '.') + || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) { + $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1); + } + + // ----- Explode dir and path by directory separator + $v_list_dir = explode("/", $p_dir); + $v_list_dir_size = sizeof($v_list_dir); + $v_list_path = explode("/", $p_path); + $v_list_path_size = sizeof($v_list_path); + + // ----- Study directories paths + $i = 0; + $j = 0; + while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) { + + // ----- Look for empty dir (path reduction) + if ($v_list_dir[$i] == '') { + $i++; + continue; + } + if ($v_list_path[$j] == '') { + $j++; + continue; + } + + // ----- Compare the items + if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != '')) { + $v_result = 0; + } + + // ----- Next items + $i++; + $j++; + } + + // ----- Look if everything seems to be the same + if ($v_result) { + // ----- Skip all the empty items + while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++; + while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++; + + if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) { + // ----- There are exactly the same + $v_result = 2; + } + else if ($i < $v_list_dir_size) { + // ----- The path is shorter than the dir + $v_result = 0; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilCopyBlock() + // Description : + // Parameters : + // $p_mode : read/write compression mode + // 0 : src & dest normal + // 1 : src gzip, dest normal + // 2 : src normal, dest gzip + // 3 : src & dest gzip + // Return Values : + // -------------------------------------------------------------------------------- + function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0) + { + $v_result = 1; + + if ($p_mode==0) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_src, $v_read_size); + @fwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==1) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($p_src, $v_read_size); + @fwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==2) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_src, $v_read_size); + @gzwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==3) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($p_src, $v_read_size); + @gzwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilRename() + // Description : + // This function tries to do a simple rename() function. If it fails, it + // tries to copy the $p_src file in a new $p_dest file and then unlink the + // first one. + // Parameters : + // $p_src : Old filename + // $p_dest : New filename + // Return Values : + // 1 on success, 0 on failure. + // -------------------------------------------------------------------------------- + function PclZipUtilRename($p_src, $p_dest) + { + $v_result = 1; + + // ----- Try to rename the files + if (!@rename($p_src, $p_dest)) { + + // ----- Try to copy & unlink the src + if (!@copy($p_src, $p_dest)) { + $v_result = 0; + } + else if (!@unlink($p_src)) { + $v_result = 0; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilOptionText() + // Description : + // Translate option value in text. Mainly for debug purpose. + // Parameters : + // $p_option : the option value. + // Return Values : + // The option text value. + // -------------------------------------------------------------------------------- + function PclZipUtilOptionText($p_option) + { + + $v_list = get_defined_constants(); + for (reset($v_list); $v_key = key($v_list); next($v_list)) { + $v_prefix = substr($v_key, 0, 10); + if (( ($v_prefix == 'PCLZIP_OPT') + || ($v_prefix == 'PCLZIP_CB_') + || ($v_prefix == 'PCLZIP_ATT')) + && ($v_list[$v_key] == $p_option)) { + return $v_key; + } + } + + $v_result = 'Unknown'; + + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilTranslateWinPath() + // Description : + // Translate windows path by replacing '\' by '/' and optionally removing + // drive letter. + // Parameters : + // $p_path : path to translate. + // $p_remove_disk_letter : true | false + // Return Values : + // The path translated. + // -------------------------------------------------------------------------------- + function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true) + { + if (stristr(php_uname(), 'windows')) { + // ----- Look for potential disk letter + if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { + $p_path = substr($p_path, $v_position+1); + } + // ----- Change potential windows directory separator + if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) { + $p_path = strtr($p_path, '\\', '/'); + } + } + return $p_path; + } + // -------------------------------------------------------------------------------- + + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/gnu-lgpl.txt b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/gnu-lgpl.txt new file mode 100755 index 00000000..cbee875b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/gnu-lgpl.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/pclzip.lib.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/pclzip.lib.php new file mode 100755 index 00000000..74365b1c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/pclzip.lib.php @@ -0,0 +1,5719 @@ +bUseGzopen64 = !function_exists('gzopen') && function_exists('gzopen64'); + + // ----- Set the attributes + $this->zipname = $p_zipname; + $this->zip_fd = 0; + $this->magic_quotes_status = -1; + + // ----- Return + return; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // create($p_filelist, $p_add_dir="", $p_remove_dir="") + // create($p_filelist, $p_option, $p_option_value, ...) + // Description : + // This method supports two different synopsis. The first one is historical. + // This method creates a Zip Archive. The Zip file is created in the + // filesystem. The files and directories indicated in $p_filelist + // are added in the archive. See the parameters description for the + // supported format of $p_filelist. + // When a directory is in the list, the directory and its content is added + // in the archive. + // In this synopsis, the function takes an optional variable list of + // options. See bellow the supported options. + // Parameters : + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or one directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_add_dir : A path to add before the real path of the archived file, + // in order to have it memorized in the archive. + // $p_remove_dir : A path to remove from the real path of the file to archive, + // in order to have a shorter path memorized in the archive. + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir + // is removed first, before $p_add_dir is added. + // Options : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_COMMENT : + // PCLZIP_CB_PRE_ADD : + // PCLZIP_CB_POST_ADD : + // Return Values : + // 0 on failure, + // The list of the added files, with a status of the add action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function create($p_filelist) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Set default values + $v_options = array(); + $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove from the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_ADD => 'optional', + PCLZIP_CB_POST_ADD => 'optional', + PCLZIP_OPT_NO_COMPRESSION => 'optional', + PCLZIP_OPT_COMMENT => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + //, PCLZIP_OPT_CRYPT => 'optional' + )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; + } + else if ($v_size > 2) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Invalid number / type of arguments"); + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Init + $v_string_list = array(); + $v_att_list = array(); + $v_filedescr_list = array(); + $p_result_list = array(); + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + + // ----- Look if the first element is also an array + // This will mean that this is a file description entry + if (isset($p_filelist[0]) && is_array($p_filelist[0])) { + $v_att_list = $p_filelist; + } + + // ----- The list is a list of string names + else { + $v_string_list = $p_filelist; + } + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_filelist)) { + // ----- Create a list from the string + $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); + } + + // ----- Invalid variable type for $p_filelist + else { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist"); + return 0; + } + + // ----- Reformat the string list + if (sizeof($v_string_list) != 0) { + foreach ($v_string_list as $v_string) { + if ($v_string != '') { + $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; + } + else { + } + } + } + + // ----- For each file in the list check the attributes + $v_supported_attributes + = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' + ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' + ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' + ,PCLZIP_ATT_FILE_MTIME => 'optional' + ,PCLZIP_ATT_FILE_CONTENT => 'optional' + ,PCLZIP_ATT_FILE_COMMENT => 'optional' + ); + foreach ($v_att_list as $v_entry) { + $v_result = $this->privFileDescrParseAtt($v_entry, + $v_filedescr_list[], + $v_options, + $v_supported_attributes); + if ($v_result != 1) { + return 0; + } + } + + // ----- Expand the filelist (expand directories) + $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Call the create fct + $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Return + return $p_result_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // add($p_filelist, $p_add_dir="", $p_remove_dir="") + // add($p_filelist, $p_option, $p_option_value, ...) + // Description : + // This method supports two synopsis. The first one is historical. + // This methods add the list of files in an existing archive. + // If a file with the same name already exists, it is added at the end of the + // archive, the first one is still present. + // If the archive does not exist, it is created. + // Parameters : + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or one directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_add_dir : A path to add before the real path of the archived file, + // in order to have it memorized in the archive. + // $p_remove_dir : A path to remove from the real path of the file to archive, + // in order to have a shorter path memorized in the archive. + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir + // is removed first, before $p_add_dir is added. + // Options : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_COMMENT : + // PCLZIP_OPT_ADD_COMMENT : + // PCLZIP_OPT_PREPEND_COMMENT : + // PCLZIP_CB_PRE_ADD : + // PCLZIP_CB_POST_ADD : + // Return Values : + // 0 on failure, + // The list of the added files, with a status of the add action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function add($p_filelist) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Set default values + $v_options = array(); + $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove form the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_ADD => 'optional', + PCLZIP_CB_POST_ADD => 'optional', + PCLZIP_OPT_NO_COMPRESSION => 'optional', + PCLZIP_OPT_COMMENT => 'optional', + PCLZIP_OPT_ADD_COMMENT => 'optional', + PCLZIP_OPT_PREPEND_COMMENT => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + //, PCLZIP_OPT_CRYPT => 'optional' + )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Init + $v_string_list = array(); + $v_att_list = array(); + $v_filedescr_list = array(); + $p_result_list = array(); + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + + // ----- Look if the first element is also an array + // This will mean that this is a file description entry + if (isset($p_filelist[0]) && is_array($p_filelist[0])) { + $v_att_list = $p_filelist; + } + + // ----- The list is a list of string names + else { + $v_string_list = $p_filelist; + } + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_filelist)) { + // ----- Create a list from the string + $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); + } + + // ----- Invalid variable type for $p_filelist + else { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist"); + return 0; + } + + // ----- Reformat the string list + if (sizeof($v_string_list) != 0) { + foreach ($v_string_list as $v_string) { + $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; + } + } + + // ----- For each file in the list check the attributes + $v_supported_attributes + = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' + ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' + ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' + ,PCLZIP_ATT_FILE_MTIME => 'optional' + ,PCLZIP_ATT_FILE_CONTENT => 'optional' + ,PCLZIP_ATT_FILE_COMMENT => 'optional' + ); + foreach ($v_att_list as $v_entry) { + $v_result = $this->privFileDescrParseAtt($v_entry, + $v_filedescr_list[], + $v_options, + $v_supported_attributes); + if ($v_result != 1) { + return 0; + } + } + + // ----- Expand the filelist (expand directories) + $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Call the create fct + $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Return + return $p_result_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : listContent() + // Description : + // This public method, gives the list of the files and directories, with their + // properties. + // The properties of each entries in the list are (used also in other functions) : + // filename : Name of the file. For a create or add action it is the filename + // given by the user. For an extract function it is the filename + // of the extracted file. + // stored_filename : Name of the file / directory stored in the archive. + // size : Size of the stored file. + // compressed_size : Size of the file's data compressed in the archive + // (without the headers overhead) + // mtime : Last known modification date of the file (UNIX timestamp) + // comment : Comment associated with the file + // folder : true | false + // index : index of the file in the archive + // status : status of the action (depending of the action) : + // Values are : + // ok : OK ! + // filtered : the file / dir is not extracted (filtered by user) + // already_a_directory : the file can not be extracted because a + // directory with the same name already exists + // write_protected : the file can not be extracted because a file + // with the same name already exists and is + // write protected + // newer_exist : the file was not extracted because a newer file exists + // path_creation_fail : the file is not extracted because the folder + // does not exist and can not be created + // write_error : the file was not extracted because there was a + // error while writing the file + // read_error : the file was not extracted because there was a error + // while reading the file + // invalid_header : the file was not extracted because of an archive + // format error (bad file header) + // Note that each time a method can continue operating when there + // is an action error on a file, the error is only logged in the file status. + // Return Values : + // 0 on an unrecoverable failure, + // The list of the files in the archive. + // -------------------------------------------------------------------------------- + function listContent() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Call the extracting fct + $p_list = array(); + if (($v_result = $this->privList($p_list)) != 1) + { + unset($p_list); + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // extract($p_path="./", $p_remove_path="") + // extract([$p_option, $p_option_value, ...]) + // Description : + // This method supports two synopsis. The first one is historical. + // This method extract all the files / directories from the archive to the + // folder indicated in $p_path. + // If you want to ignore the 'root' part of path of the memorized files + // you can indicate this in the optional $p_remove_path parameter. + // By default, if a newer file with the same name already exists, the + // file is not extracted. + // + // If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions + // are used, the path indicated in PCLZIP_OPT_ADD_PATH is append + // at the end of the path value of PCLZIP_OPT_PATH. + // Parameters : + // $p_path : Path where the files and directories are to be extracted + // $p_remove_path : First part ('root' part) of the memorized path + // (if any similar) to remove while extracting. + // Options : + // PCLZIP_OPT_PATH : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_CB_PRE_EXTRACT : + // PCLZIP_CB_POST_EXTRACT : + // Return Values : + // 0 or a negative value on failure, + // The list of the extracted files, with a status of the action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function extract() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); +// $v_path = "./"; + $v_path = ''; + $v_remove_path = ""; + $v_remove_all_path = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Default values for option + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + + // ----- Look for arguments + if ($v_size > 0) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_PATH => 'optional', + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_EXTRACT => 'optional', + PCLZIP_CB_POST_EXTRACT => 'optional', + PCLZIP_OPT_SET_CHMOD => 'optional', + PCLZIP_OPT_BY_NAME => 'optional', + PCLZIP_OPT_BY_EREG => 'optional', + PCLZIP_OPT_BY_PREG => 'optional', + PCLZIP_OPT_BY_INDEX => 'optional', + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', + PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional', + PCLZIP_OPT_REPLACE_NEWER => 'optional' + ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' + ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + )); + if ($v_result != 1) { + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_PATH])) { + $v_path = $v_options[PCLZIP_OPT_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + // ----- Check for '/' in last path char + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { + $v_path .= '/'; + } + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Trace + + // ----- Call the extracting fct + $p_list = array(); + $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, + $v_remove_all_path, $v_options); + if ($v_result < 1) { + unset($p_list); + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + + // -------------------------------------------------------------------------------- + // Function : + // extractByIndex($p_index, $p_path="./", $p_remove_path="") + // extractByIndex($p_index, [$p_option, $p_option_value, ...]) + // Description : + // This method supports two synopsis. The first one is historical. + // This method is doing a partial extract of the archive. + // The extracted files or folders are identified by their index in the + // archive (from 0 to n). + // Note that if the index identify a folder, only the folder entry is + // extracted, not all the files included in the archive. + // Parameters : + // $p_index : A single index (integer) or a string of indexes of files to + // extract. The form of the string is "0,4-6,8-12" with only numbers + // and '-' for range or ',' to separate ranges. No spaces or ';' + // are allowed. + // $p_path : Path where the files and directories are to be extracted + // $p_remove_path : First part ('root' part) of the memorized path + // (if any similar) to remove while extracting. + // Options : + // PCLZIP_OPT_PATH : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and + // not as files. + // The resulting content is in a new field 'content' in the file + // structure. + // This option must be used alone (any other options are ignored). + // PCLZIP_CB_PRE_EXTRACT : + // PCLZIP_CB_POST_EXTRACT : + // Return Values : + // 0 on failure, + // The list of the extracted files, with a status of the action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + //function extractByIndex($p_index, options...) + function extractByIndex($p_index) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); +// $v_path = "./"; + $v_path = ''; + $v_remove_path = ""; + $v_remove_all_path = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Default values for option + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove form the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_PATH => 'optional', + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_EXTRACT => 'optional', + PCLZIP_CB_POST_EXTRACT => 'optional', + PCLZIP_OPT_SET_CHMOD => 'optional', + PCLZIP_OPT_REPLACE_NEWER => 'optional' + ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' + ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + )); + if ($v_result != 1) { + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_PATH])) { + $v_path = $v_options[PCLZIP_OPT_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + // ----- Check for '/' in last path char + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { + $v_path .= '/'; + } + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; + } + if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) { + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + } + else { + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Trace + + // ----- Trick + // Here I want to reuse extractByRule(), so I need to parse the $p_index + // with privParseOptions() + $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index); + $v_options_trick = array(); + $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick, + array (PCLZIP_OPT_BY_INDEX => 'optional' )); + if ($v_result != 1) { + return 0; + } + $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX]; + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Call the extracting fct + if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) { + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // delete([$p_option, $p_option_value, ...]) + // Description : + // This method removes files from the archive. + // If no parameters are given, then all the archive is emptied. + // Parameters : + // None or optional arguments. + // Options : + // PCLZIP_OPT_BY_INDEX : + // PCLZIP_OPT_BY_NAME : + // PCLZIP_OPT_BY_EREG : + // PCLZIP_OPT_BY_PREG : + // Return Values : + // 0 on failure, + // The list of the files which are still present in the archive. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function delete() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 0) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_BY_NAME => 'optional', + PCLZIP_OPT_BY_EREG => 'optional', + PCLZIP_OPT_BY_PREG => 'optional', + PCLZIP_OPT_BY_INDEX => 'optional' )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Call the delete fct + $v_list = array(); + if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) { + $this->privSwapBackMagicQuotes(); + unset($v_list); + return(0); + } + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : deleteByIndex() + // Description : + // ***** Deprecated ***** + // delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered. + // -------------------------------------------------------------------------------- + function deleteByIndex($p_index) + { + + $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index); + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : properties() + // Description : + // This method gives the properties of the archive. + // The properties are : + // nb : Number of files in the archive + // comment : Comment associated with the archive file + // status : not_exist, ok + // Parameters : + // None + // Return Values : + // 0 on failure, + // An array with the archive properties. + // -------------------------------------------------------------------------------- + function properties() + { + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + $this->privSwapBackMagicQuotes(); + return(0); + } + + // ----- Default properties + $v_prop = array(); + $v_prop['comment'] = ''; + $v_prop['nb'] = 0; + $v_prop['status'] = 'not_exist'; + + // ----- Look if file exists + if (@is_file($this->zipname)) + { + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) + { + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); + + // ----- Return + return 0; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privSwapBackMagicQuotes(); + return 0; + } + + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Set the user attributes + $v_prop['comment'] = $v_central_dir['comment']; + $v_prop['nb'] = $v_central_dir['entries']; + $v_prop['status'] = 'ok'; + } + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_prop; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : duplicate() + // Description : + // This method creates an archive by copying the content of an other one. If + // the archive already exist, it is replaced by the new one without any warning. + // Parameters : + // $p_archive : The filename of a valid archive, or + // a valid PclZip object. + // Return Values : + // 1 on success. + // 0 or a negative value on error (error code). + // -------------------------------------------------------------------------------- + function duplicate($p_archive) + { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Look if the $p_archive is a PclZip object + if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')) + { + + // ----- Duplicate the archive + $v_result = $this->privDuplicate($p_archive->zipname); + } + + // ----- Look if the $p_archive is a string (so a filename) + else if (is_string($p_archive)) + { + + // ----- Check that $p_archive is a valid zip file + // TBC : Should also check the archive format + if (!is_file($p_archive)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'"); + $v_result = PCLZIP_ERR_MISSING_FILE; + } + else { + // ----- Duplicate the archive + $v_result = $this->privDuplicate($p_archive); + } + } + + // ----- Invalid variable + else + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : merge() + // Description : + // This method merge the $p_archive_to_add archive at the end of the current + // one ($this). + // If the archive ($this) does not exist, the merge becomes a duplicate. + // If the $p_archive_to_add archive does not exist, the merge is a success. + // Parameters : + // $p_archive_to_add : It can be directly the filename of a valid zip archive, + // or a PclZip object archive. + // Return Values : + // 1 on success, + // 0 or negative values on error (see below). + // -------------------------------------------------------------------------------- + function merge($p_archive_to_add) + { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Look if the $p_archive_to_add is a PclZip object + if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')) + { + + // ----- Merge the archive + $v_result = $this->privMerge($p_archive_to_add); + } + + // ----- Look if the $p_archive_to_add is a string (so a filename) + else if (is_string($p_archive_to_add)) + { + + // ----- Create a temporary archive + $v_object_archive = new PclZip($p_archive_to_add); + + // ----- Merge the archive + $v_result = $this->privMerge($v_object_archive); + } + + // ----- Invalid variable + else + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + + + // -------------------------------------------------------------------------------- + // Function : errorCode() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorCode() + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + return(PclErrorCode()); + } + else { + return($this->error_code); + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : errorName() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorName($p_with_code=false) + { + $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR', + PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL', + PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL', + PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER', + PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE', + PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG', + PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP', + PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE', + PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL', + PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION', + PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT', + PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL', + PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL', + PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM', + PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', + PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE', + PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE', + PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', + PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION' + ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE' + ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION' + ); + + if (isset($v_name[$this->error_code])) { + $v_value = $v_name[$this->error_code]; + } + else { + $v_value = 'NoName'; + } + + if ($p_with_code) { + return($v_value.' ('.$this->error_code.')'); + } + else { + return($v_value); + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : errorInfo() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorInfo($p_full=false) + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + return(PclErrorString()); + } + else { + if ($p_full) { + return($this->errorName(true)." : ".$this->error_string); + } + else { + return($this->error_string." [code ".$this->error_code."]"); + } + } + } + // -------------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------------- +// ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS ***** +// ***** ***** +// ***** THESES FUNCTIONS MUST NOT BE USED DIRECTLY ***** +// -------------------------------------------------------------------------------- + + + + // -------------------------------------------------------------------------------- + // Function : privCheckFormat() + // Description : + // This method check that the archive exists and is a valid zip archive. + // Several level of check exists. (futur) + // Parameters : + // $p_level : Level of check. Default 0. + // 0 : Check the first bytes (magic codes) (default value)) + // 1 : 0 + Check the central directory (futur) + // 2 : 1 + Check each file header (futur) + // Return Values : + // true on success, + // false on error, the error code is set. + // -------------------------------------------------------------------------------- + function privCheckFormat($p_level=0) + { + $v_result = true; + + // ----- Reset the file system cache + clearstatcache(); + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Look if the file exits + if (!is_file($this->zipname)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'"); + return(false); + } + + // ----- Check that the file is readeable + if (!is_readable($this->zipname)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'"); + return(false); + } + + // ----- Check the magic code + // TBC + + // ----- Check the central header + // TBC + + // ----- Check each file header + // TBC + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privParseOptions() + // Description : + // This internal methods reads the variable list of arguments ($p_options_list, + // $p_size) and generate an array with the options and values ($v_result_list). + // $v_requested_options contains the options that can be present and those that + // must be present. + // $v_requested_options is an array, with the option value as key, and 'optional', + // or 'mandatory' as value. + // Parameters : + // See above. + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false) + { + $v_result=1; + + // ----- Read the options + $i=0; + while ($i<$p_size) { + + // ----- Check if the option is supported + if (!isset($v_requested_options[$p_options_list[$i]])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for next option + switch ($p_options_list[$i]) { + // ----- Look for options that request a path value + case PCLZIP_OPT_PATH : + case PCLZIP_OPT_REMOVE_PATH : + case PCLZIP_OPT_ADD_PATH : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); + $i++; + break; + + case PCLZIP_OPT_TEMP_FILE_THRESHOLD : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + return PclZip::errorCode(); + } + + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); + return PclZip::errorCode(); + } + + // ----- Check the value + $v_value = $p_options_list[$i+1]; + if ((!is_integer($v_value)) || ($v_value<0)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + return PclZip::errorCode(); + } + + // ----- Get the value (and convert it in bytes) + $v_result_list[$p_options_list[$i]] = $v_value*1048576; + $i++; + break; + + case PCLZIP_OPT_TEMP_FILE_ON : + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); + return PclZip::errorCode(); + } + + $v_result_list[$p_options_list[$i]] = true; + break; + + case PCLZIP_OPT_TEMP_FILE_OFF : + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'"); + return PclZip::errorCode(); + } + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'"); + return PclZip::errorCode(); + } + + $v_result_list[$p_options_list[$i]] = true; + break; + + case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if ( is_string($p_options_list[$i+1]) + && ($p_options_list[$i+1] != '')) { + $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); + $i++; + } + else { + } + break; + + // ----- Look for options that request an array of string for value + case PCLZIP_OPT_BY_NAME : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1]; + } + else if (is_array($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that request an EREG or PREG expression + case PCLZIP_OPT_BY_EREG : + // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG + // to PCLZIP_OPT_BY_PREG + $p_options_list[$i] = PCLZIP_OPT_BY_PREG; + case PCLZIP_OPT_BY_PREG : + //case PCLZIP_OPT_CRYPT : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that takes a string + case PCLZIP_OPT_COMMENT : + case PCLZIP_OPT_ADD_COMMENT : + case PCLZIP_OPT_PREPEND_COMMENT : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, + "Missing parameter value for option '" + .PclZipUtilOptionText($p_options_list[$i]) + ."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, + "Wrong parameter value for option '" + .PclZipUtilOptionText($p_options_list[$i]) + ."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that request an array of index + case PCLZIP_OPT_BY_INDEX : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_work_list = array(); + if (is_string($p_options_list[$i+1])) { + + // ----- Remove spaces + $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', ''); + + // ----- Parse items + $v_work_list = explode(",", $p_options_list[$i+1]); + } + else if (is_integer($p_options_list[$i+1])) { + $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1]; + } + else if (is_array($p_options_list[$i+1])) { + $v_work_list = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Reduce the index list + // each index item in the list must be a couple with a start and + // an end value : [0,3], [5-5], [8-10], ... + // ----- Check the format of each item + $v_sort_flag=false; + $v_sort_value=0; + for ($j=0; $j= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + $i++; + break; + + // ----- Look for options that request a call-back + case PCLZIP_CB_PRE_EXTRACT : + case PCLZIP_CB_POST_EXTRACT : + case PCLZIP_CB_PRE_ADD : + case PCLZIP_CB_POST_ADD : + /* for futur use + case PCLZIP_CB_PRE_DELETE : + case PCLZIP_CB_POST_DELETE : + case PCLZIP_CB_PRE_LIST : + case PCLZIP_CB_POST_LIST : + */ + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_function_name = $p_options_list[$i+1]; + + // ----- Check that the value is a valid existing function + if (!function_exists($v_function_name)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Set the attribute + $v_result_list[$p_options_list[$i]] = $v_function_name; + $i++; + break; + + default : + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Unknown parameter '" + .$p_options_list[$i]."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Next options + $i++; + } + + // ----- Look for mandatory options + if ($v_requested_options !== false) { + for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { + // ----- Look for mandatory option + if ($v_requested_options[$key] == 'mandatory') { + // ----- Look if present + if (!isset($v_result_list[$key])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); + + // ----- Return + return PclZip::errorCode(); + } + } + } + } + + // ----- Look for default values + if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { + + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privOptionDefaultThreshold() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privOptionDefaultThreshold(&$p_options) + { + $v_result=1; + + if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) { + return $v_result; + } + + // ----- Get 'memory_limit' configuration value + $v_memory_limit = ini_get('memory_limit'); + $v_memory_limit = trim($v_memory_limit); + $last = strtolower(substr($v_memory_limit, -1)); + + if($last == 'g') + //$v_memory_limit = $v_memory_limit*1024*1024*1024; + $v_memory_limit = $v_memory_limit*1073741824; + if($last == 'm') + //$v_memory_limit = $v_memory_limit*1024*1024; + $v_memory_limit = $v_memory_limit*1048576; + if($last == 'k') + $v_memory_limit = $v_memory_limit*1024; + + $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO); + + + // ----- Sanity check : No threshold if value lower than 1M + if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) { + unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privFileDescrParseAtt() + // Description : + // Parameters : + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false) + { + $v_result=1; + + // ----- For each file in the list check the attributes + foreach ($p_file_list as $v_key => $v_value) { + + // ----- Check if the option is supported + if (!isset($v_requested_options[$v_key])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for attribute + switch ($v_key) { + case PCLZIP_ATT_FILE_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['filename'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['filename'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + break; + + case PCLZIP_ATT_FILE_NEW_SHORT_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['new_short_name'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + break; + + case PCLZIP_ATT_FILE_NEW_FULL_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['new_full_name'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + break; + + // ----- Look for options that takes a string + case PCLZIP_ATT_FILE_COMMENT : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['comment'] = $v_value; + break; + + case PCLZIP_ATT_FILE_MTIME : + if (!is_integer($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['mtime'] = $v_value; + break; + + case PCLZIP_ATT_FILE_CONTENT : + $p_filedescr['content'] = $v_value; + break; + + default : + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Unknown parameter '".$v_key."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for mandatory options + if ($v_requested_options !== false) { + for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { + // ----- Look for mandatory option + if ($v_requested_options[$key] == 'mandatory') { + // ----- Look if present + if (!isset($p_file_list[$key])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); + return PclZip::errorCode(); + } + } + } + } + + // end foreach + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privFileDescrExpand() + // Description : + // This method look for each item of the list to see if its a file, a folder + // or a string to be added as file. For any other type of files (link, other) + // just ignore the item. + // Then prepare the information that will be stored for that file. + // When its a folder, expand the folder with all the files that are in that + // folder (recursively). + // Parameters : + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privFileDescrExpand(&$p_filedescr_list, &$p_options) + { + $v_result=1; + + // ----- Create a result list + $v_result_list = array(); + + // ----- Look each entry + for ($i=0; $iprivCalculateStoredFilename($v_descr, $p_options); + + // ----- Add the descriptor in result list + $v_result_list[sizeof($v_result_list)] = $v_descr; + + // ----- Look for folder + if ($v_descr['type'] == 'folder') { + // ----- List of items in folder + $v_dirlist_descr = array(); + $v_dirlist_nb = 0; + if ($v_folder_handler = @opendir($v_descr['filename'])) { + while (($v_item_handler = @readdir($v_folder_handler)) !== false) { + + // ----- Skip '.' and '..' + if (($v_item_handler == '.') || ($v_item_handler == '..')) { + continue; + } + + // ----- Compose the full filename + $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler; + + // ----- Look for different stored filename + // Because the name of the folder was changed, the name of the + // files/sub-folders also change + if (($v_descr['stored_filename'] != $v_descr['filename']) + && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) { + if ($v_descr['stored_filename'] != '') { + $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler; + } + else { + $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler; + } + } + + $v_dirlist_nb++; + } + + @closedir($v_folder_handler); + } + else { + // TBC : unable to open folder in read mode + } + + // ----- Expand each element of the list + if ($v_dirlist_nb != 0) { + // ----- Expand + if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) { + return $v_result; + } + + // ----- Concat the resulting list + $v_result_list = array_merge($v_result_list, $v_dirlist_descr); + } + else { + } + + // ----- Free local array + unset($v_dirlist_descr); + } + } + + // ----- Get the result list + $p_filedescr_list = $v_result_list; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCreate() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privCreate($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the file in write mode + if (($v_result = $this->privOpenFd('wb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Add the list of files + $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options); + + // ----- Close + $this->privCloseFd(); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAdd() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAdd($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Look if the archive exists or is empty + if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)) + { + + // ----- Do a create + $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options); + + // ----- Return + return $v_result; + } + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) + { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = $v_central_dir['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Swap the file descriptor + // Here is a trick : I swap the temporary fd with the zip fd, in order to use + // the following methods on the temporary fil and not the real archive + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Add the files + $v_header_list = array(); + if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) + { + fclose($v_zip_temp_fd); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($this->zip_fd); + + // ----- Copy the block of file headers from the old archive + $v_size = $v_central_dir['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_zip_temp_fd, $v_read_size); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Create the Central Dir files header + for ($i=0, $v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { + fclose($v_zip_temp_fd); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file comment + $v_comment = $v_central_dir['comment']; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) { + $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT]; + } + if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($this->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1) + { + // ----- Reset the file list + unset($v_header_list); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Swap back the file descriptor + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Close + $this->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privOpenFd() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privOpenFd($p_mode) + { + $v_result=1; + + // ----- Look if already open + if ($this->zip_fd != 0) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCloseFd() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privCloseFd() + { + $v_result=1; + + if ($this->zip_fd != 0) + @fclose($this->zip_fd); + $this->zip_fd = 0; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddList() + // Description : + // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is + // different from the real path of the file. This is usefull if you want to have PclTar + // running in any directory, and memorize relative path from an other directory. + // Parameters : + // $p_list : An array containing the file or directory names to add in the tar + // $p_result_list : list of added files with their properties (specially the status field) + // $p_add_dir : Path to add in the filename path archived + // $p_remove_dir : Path to remove in the filename path archived + // Return Values : + // -------------------------------------------------------------------------------- +// function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) + function privAddList($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + + // ----- Add the files + $v_header_list = array(); + if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($this->zip_fd); + + // ----- Create the Central Dir files header + for ($i=0,$v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { + // ----- Return + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file comment + $v_comment = ''; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($this->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1) + { + // ----- Reset the file list + unset($v_header_list); + + // ----- Return + return $v_result; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFileList() + // Description : + // Parameters : + // $p_filedescr_list : An array containing the file description + // or directory names to add in the zip + // $p_result_list : list of added files with their properties (specially the status field) + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_header = array(); + + // ----- Recuperate the current number of elt in list + $v_nb = sizeof($p_result_list); + + // ----- Loop on the files + for ($j=0; ($jprivAddFile($p_filedescr_list[$j], $v_header, + $p_options); + if ($v_result != 1) { + return $v_result; + } + + // ----- Store the file infos + $p_result_list[$v_nb++] = $v_header; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFile($p_filedescr, &$p_header, &$p_options) + { + $v_result=1; + + // ----- Working variable + $p_filename = $p_filedescr['filename']; + + // TBC : Already done in the fileAtt check ... ? + if ($p_filename == "") { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for a stored different filename + /* TBC : Removed + if (isset($p_filedescr['stored_filename'])) { + $v_stored_filename = $p_filedescr['stored_filename']; + } + else { + $v_stored_filename = $p_filedescr['stored_filename']; + } + */ + + // ----- Set the file properties + clearstatcache(); + $p_header['version'] = 20; + $p_header['version_extracted'] = 10; + $p_header['flag'] = 0; + $p_header['compression'] = 0; + $p_header['crc'] = 0; + $p_header['compressed_size'] = 0; + $p_header['filename_len'] = strlen($p_filename); + $p_header['extra_len'] = 0; + $p_header['disk'] = 0; + $p_header['internal'] = 0; + $p_header['offset'] = 0; + $p_header['filename'] = $p_filename; +// TBC : Removed $p_header['stored_filename'] = $v_stored_filename; + $p_header['stored_filename'] = $p_filedescr['stored_filename']; + $p_header['extra'] = ''; + $p_header['status'] = 'ok'; + $p_header['index'] = -1; + + // ----- Look for regular file + if ($p_filedescr['type']=='file') { + $p_header['external'] = 0x00000000; + $p_header['size'] = filesize($p_filename); + } + + // ----- Look for regular folder + else if ($p_filedescr['type']=='folder') { + $p_header['external'] = 0x00000010; + $p_header['mtime'] = filemtime($p_filename); + $p_header['size'] = filesize($p_filename); + } + + // ----- Look for virtual file + else if ($p_filedescr['type'] == 'virtual_file') { + $p_header['external'] = 0x00000000; + $p_header['size'] = strlen($p_filedescr['content']); + } + + + // ----- Look for filetime + if (isset($p_filedescr['mtime'])) { + $p_header['mtime'] = $p_filedescr['mtime']; + } + else if ($p_filedescr['type'] == 'virtual_file') { + $p_header['mtime'] = time(); + } + else { + $p_header['mtime'] = filemtime($p_filename); + } + + // ------ Look for file comment + if (isset($p_filedescr['comment'])) { + $p_header['comment_len'] = strlen($p_filedescr['comment']); + $p_header['comment'] = $p_filedescr['comment']; + } + else { + $p_header['comment_len'] = 0; + $p_header['comment'] = ''; + } + + // ----- Look for pre-add callback + if (isset($p_options[PCLZIP_CB_PRE_ADD])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_header, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_header['status'] = "skipped"; + $v_result = 1; + } + + // ----- Update the informations + // Only some fields can be modified + if ($p_header['stored_filename'] != $v_local_header['stored_filename']) { + $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']); + } + } + + // ----- Look for empty stored filename + if ($p_header['stored_filename'] == "") { + $p_header['status'] = "filtered"; + } + + // ----- Check the path length + if (strlen($p_header['stored_filename']) > 0xFF) { + $p_header['status'] = 'filename_too_long'; + } + + // ----- Look if no error, or file not skipped + if ($p_header['status'] == 'ok') { + + // ----- Look for a file + if ($p_filedescr['type'] == 'file') { + // ----- Look for using temporary file to zip + if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) + && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) + || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) { + $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options); + if ($v_result < PCLZIP_ERR_NO_ERROR) { + return $v_result; + } + } + + // ----- Use "in memory" zip algo + else { + + // ----- Open the source file + if (($v_file = @fopen($p_filename, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); + return PclZip::errorCode(); + } + + // ----- Read the file content + $v_content = @fread($v_file, $p_header['size']); + + // ----- Close the file + @fclose($v_file); + + // ----- Calculate the CRC + $p_header['crc'] = @crc32($v_content); + + // ----- Look for no compression + if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { + // ----- Set header parameters + $p_header['compressed_size'] = $p_header['size']; + $p_header['compression'] = 0; + } + + // ----- Look for normal compression + else { + // ----- Compress the content + $v_content = @gzdeflate($v_content); + + // ----- Set header parameters + $p_header['compressed_size'] = strlen($v_content); + $p_header['compression'] = 8; + } + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + @fclose($v_file); + return $v_result; + } + + // ----- Write the compressed (or not) content + @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); + + } + + } + + // ----- Look for a virtual file (a file from string) + else if ($p_filedescr['type'] == 'virtual_file') { + + $v_content = $p_filedescr['content']; + + // ----- Calculate the CRC + $p_header['crc'] = @crc32($v_content); + + // ----- Look for no compression + if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { + // ----- Set header parameters + $p_header['compressed_size'] = $p_header['size']; + $p_header['compression'] = 0; + } + + // ----- Look for normal compression + else { + // ----- Compress the content + $v_content = @gzdeflate($v_content); + + // ----- Set header parameters + $p_header['compressed_size'] = strlen($v_content); + $p_header['compression'] = 8; + } + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + @fclose($v_file); + return $v_result; + } + + // ----- Write the compressed (or not) content + @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); + } + + // ----- Look for a directory + else if ($p_filedescr['type'] == 'folder') { + // ----- Look for directory last '/' + if (@substr($p_header['stored_filename'], -1) != '/') { + $p_header['stored_filename'] .= '/'; + } + + // ----- Set the file properties + $p_header['size'] = 0; + //$p_header['external'] = 0x41FF0010; // Value for a folder : to be checked + $p_header['external'] = 0x00000010; // Value for a folder : to be checked + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) + { + return $v_result; + } + } + } + + // ----- Look for post-add callback + if (isset($p_options[PCLZIP_CB_POST_ADD])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_header, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header); + if ($v_result == 0) { + // ----- Ignored + $v_result = 1; + } + + // ----- Update the informations + // Nothing can be modified + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFileUsingTempFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options) + { + $v_result=PCLZIP_ERR_NO_ERROR; + + // ----- Working variable + $p_filename = $p_filedescr['filename']; + + + // ----- Open the source file + if (($v_file = @fopen($p_filename, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); + return PclZip::errorCode(); + } + + // ----- Creates a compressed temporary file + $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; + if ($this->bUseGzopen64) + { + if (($v_file_compressed = @gzopen64($v_gzip_temp_name, "wb")) == 0) { + fclose($v_file); + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); + return PclZip::errorCode(); + } + } + else + { + if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) { + fclose($v_file); + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); + return PclZip::errorCode(); + } + } + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = filesize($p_filename); + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_file, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @gzputs($v_file_compressed, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close the file + @fclose($v_file); + @gzclose($v_file_compressed); + + // ----- Check the minimum file size + if (filesize($v_gzip_temp_name) < 18) { + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \''.$v_gzip_temp_name.'\' has invalid filesize - should be minimum 18 bytes'); + return PclZip::errorCode(); + } + + // ----- Extract the compressed attributes + if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + // ----- Read the gzip file header + $v_binary_data = @fread($v_file_compressed, 10); + $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data); + + // ----- Check some parameters + $v_data_header['os'] = bin2hex($v_data_header['os']); + + // ----- Read the gzip file footer + @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8); + $v_binary_data = @fread($v_file_compressed, 8); + $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data); + + // ----- Set the attributes + $p_header['compression'] = ord($v_data_header['cm']); + //$p_header['mtime'] = $v_data_header['mtime']; + $p_header['crc'] = $v_data_footer['crc']; + $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18; + + // ----- Close the file + @fclose($v_file_compressed); + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + return $v_result; + } + + // ----- Add the compressed data + if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) + { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + fseek($v_file_compressed, 10); + $v_size = $p_header['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_file_compressed, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close the file + @fclose($v_file_compressed); + + // ----- Unlink the temporary file + @unlink($v_gzip_temp_name); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCalculateStoredFilename() + // Description : + // Based on file descriptor properties and global options, this method + // calculate the filename that will be stored in the archive. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privCalculateStoredFilename(&$p_filedescr, &$p_options) + { + $v_result=1; + + // ----- Working variables + $p_filename = $p_filedescr['filename']; + if (isset($p_options[PCLZIP_OPT_ADD_PATH])) { + $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH]; + } + else { + $p_add_dir = ''; + } + if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) { + $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH]; + } + else { + $p_remove_dir = ''; + } + if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + else { + $p_remove_all_dir = 0; + } + + + // ----- Look for full name change + if (isset($p_filedescr['new_full_name'])) { + // ----- Remove drive letter if any + $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']); + } + + // ----- Look for path and/or short name change + else { + + // ----- Look for short name change + // Its when we cahnge just the filename but not the path + if (isset($p_filedescr['new_short_name'])) { + $v_path_info = pathinfo($p_filename); + $v_dir = ''; + if ($v_path_info['dirname'] != '') { + $v_dir = $v_path_info['dirname'].'/'; + } + $v_stored_filename = $v_dir.$p_filedescr['new_short_name']; + } + else { + // ----- Calculate the stored filename + $v_stored_filename = $p_filename; + } + + // ----- Look for all path to remove + if ($p_remove_all_dir) { + $v_stored_filename = basename($p_filename); + } + // ----- Look for partial path remove + else if ($p_remove_dir != "") { + if (substr($p_remove_dir, -1) != '/') + $p_remove_dir .= "/"; + + if ( (substr($p_filename, 0, 2) == "./") + || (substr($p_remove_dir, 0, 2) == "./")) { + + if ( (substr($p_filename, 0, 2) == "./") + && (substr($p_remove_dir, 0, 2) != "./")) { + $p_remove_dir = "./".$p_remove_dir; + } + if ( (substr($p_filename, 0, 2) != "./") + && (substr($p_remove_dir, 0, 2) == "./")) { + $p_remove_dir = substr($p_remove_dir, 2); + } + } + + $v_compare = PclZipUtilPathInclusion($p_remove_dir, + $v_stored_filename); + if ($v_compare > 0) { + if ($v_compare == 2) { + $v_stored_filename = ""; + } + else { + $v_stored_filename = substr($v_stored_filename, + strlen($p_remove_dir)); + } + } + } + + // ----- Remove drive letter if any + $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename); + + // ----- Look for path to add + if ($p_add_dir != "") { + if (substr($p_add_dir, -1) == "/") + $v_stored_filename = $p_add_dir.$v_stored_filename; + else + $v_stored_filename = $p_add_dir."/".$v_stored_filename; + } + } + + // ----- Filename (reduce the path of stored name) + $v_stored_filename = PclZipUtilPathReduction($v_stored_filename); + $p_filedescr['stored_filename'] = $v_stored_filename; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteFileHeader(&$p_header) + { + $v_result=1; + + // ----- Store the offset position of the file + $p_header['offset'] = ftell($this->zip_fd); + + // ----- Transform UNIX mtime to DOS format mdate/mtime + $v_date = getdate($p_header['mtime']); + $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; + $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; + + // ----- Packed data + $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50, + $p_header['version_extracted'], $p_header['flag'], + $p_header['compression'], $v_mtime, $v_mdate, + $p_header['crc'], $p_header['compressed_size'], + $p_header['size'], + strlen($p_header['stored_filename']), + $p_header['extra_len']); + + // ----- Write the first 148 bytes of the header in the archive + fputs($this->zip_fd, $v_binary_data, 30); + + // ----- Write the variable fields + if (strlen($p_header['stored_filename']) != 0) + { + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); + } + if ($p_header['extra_len'] != 0) + { + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteCentralFileHeader(&$p_header) + { + $v_result=1; + + // TBC + //for(reset($p_header); $key = key($p_header); next($p_header)) { + //} + + // ----- Transform UNIX mtime to DOS format mdate/mtime + $v_date = getdate($p_header['mtime']); + $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; + $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; + + + // ----- Packed data + $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50, + $p_header['version'], $p_header['version_extracted'], + $p_header['flag'], $p_header['compression'], + $v_mtime, $v_mdate, $p_header['crc'], + $p_header['compressed_size'], $p_header['size'], + strlen($p_header['stored_filename']), + $p_header['extra_len'], $p_header['comment_len'], + $p_header['disk'], $p_header['internal'], + $p_header['external'], $p_header['offset']); + + // ----- Write the 42 bytes of the header in the zip file + fputs($this->zip_fd, $v_binary_data, 46); + + // ----- Write the variable fields + if (strlen($p_header['stored_filename']) != 0) + { + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); + } + if ($p_header['extra_len'] != 0) + { + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); + } + if ($p_header['comment_len'] != 0) + { + fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteCentralHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment) + { + $v_result=1; + + // ----- Packed data + $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries, + $p_nb_entries, $p_size, + $p_offset, strlen($p_comment)); + + // ----- Write the 22 bytes of the header in the zip file + fputs($this->zip_fd, $v_binary_data, 22); + + // ----- Write the variable fields + if (strlen($p_comment) != 0) + { + fputs($this->zip_fd, $p_comment, strlen($p_comment)); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privList() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privList(&$p_list) + { + $v_result=1; + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) + { + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Go to beginning of Central Dir + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_central_dir['offset'])) + { + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read each entry + for ($i=0; $i<$v_central_dir['entries']; $i++) + { + // ----- Read the file header + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) + { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + $v_header['index'] = $i; + + // ----- Get the only interesting attributes + $this->privConvertHeader2FileInfo($v_header, $p_list[$i]); + unset($v_header); + } + + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privConvertHeader2FileInfo() + // Description : + // This function takes the file informations from the central directory + // entries and extract the interesting parameters that will be given back. + // The resulting file infos are set in the array $p_info + // $p_info['filename'] : Filename with full path. Given by user (add), + // extracted in the filesystem (extract). + // $p_info['stored_filename'] : Stored filename in the archive. + // $p_info['size'] = Size of the file. + // $p_info['compressed_size'] = Compressed size of the file. + // $p_info['mtime'] = Last modification date of the file. + // $p_info['comment'] = Comment associated with the file. + // $p_info['folder'] = true/false : indicates if the entry is a folder or not. + // $p_info['status'] = status of the action on the file. + // $p_info['crc'] = CRC of the file content. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privConvertHeader2FileInfo($p_header, &$p_info) + { + $v_result=1; + + // ----- Get the interesting attributes + $v_temp_path = PclZipUtilPathReduction($p_header['filename']); + $p_info['filename'] = $v_temp_path; + $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']); + $p_info['stored_filename'] = $v_temp_path; + $p_info['size'] = $p_header['size']; + $p_info['compressed_size'] = $p_header['compressed_size']; + $p_info['mtime'] = $p_header['mtime']; + $p_info['comment'] = $p_header['comment']; + $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010); + $p_info['index'] = $p_header['index']; + $p_info['status'] = $p_header['status']; + $p_info['crc'] = $p_header['crc']; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractByRule() + // Description : + // Extract a file or directory depending of rules (by index, by name, ...) + // Parameters : + // $p_file_list : An array where will be placed the properties of each + // extracted file + // $p_path : Path to add while writing the extracted files + // $p_remove_path : Path to remove (from the file memorized path) while writing the + // extracted files. If the path does not match the file path, + // the file is extracted with its memorized path. + // $p_remove_path does not apply to 'list' mode. + // $p_path and $p_remove_path are commulative. + // Return Values : + // 1 on success,0 or less on error (see error code list) + // -------------------------------------------------------------------------------- + function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) + { + $v_result=1; + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Check the path + if ( ($p_path == "") + || ( (substr($p_path, 0, 1) != "/") + && (substr($p_path, 0, 3) != "../") + && (substr($p_path,1,2)!=":/"))) + $p_path = "./".$p_path; + + // ----- Reduce the path last (and duplicated) '/' + if (($p_path != "./") && ($p_path != "/")) + { + // ----- Look for the path end '/' + while (substr($p_path, -1) == "/") + { + $p_path = substr($p_path, 0, strlen($p_path)-1); + } + } + + // ----- Look for path to remove format (should end by /) + if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) + { + $p_remove_path .= '/'; + } + $p_remove_path_size = strlen($p_remove_path); + + // ----- Open the zip file + if (($v_result = $this->privOpenFd('rb')) != 1) + { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Start at beginning of Central Dir + $v_pos_entry = $v_central_dir['offset']; + + // ----- Read each entry + $j_start = 0; + for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) + { + + // ----- Read next Central dir entry + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_pos_entry)) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Store the index + $v_header['index'] = $i; + + // ----- Store the file position + $v_pos_entry = ftell($this->zip_fd); + + // ----- Look for the specific extract rules + $v_extract = false; + + // ----- Look for extract by name rule + if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) + && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { + + // ----- Look if the filename is in the list + for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) + && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_extract = true; + } + } + // ----- Look for a filename + elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { + $v_extract = true; + } + } + } + + // ----- Look for extract by ereg rule + // ereg() is deprecated with PHP 5.3 + /* + else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) + && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { + + if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) { + $v_extract = true; + } + } + */ + + // ----- Look for extract by preg rule + else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) + && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { + + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) { + $v_extract = true; + } + } + + // ----- Look for extract by index rule + else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) + && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { + + // ----- Look if the index is in the list + for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { + $v_extract = true; + } + if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { + $j_start = $j+1; + } + + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { + break; + } + } + } + + // ----- Look for no rule, which means extract all the archive + else { + $v_extract = true; + } + + // ----- Check compression method + if ( ($v_extract) + && ( ($v_header['compression'] != 8) + && ($v_header['compression'] != 0))) { + $v_header['status'] = 'unsupported_compression'; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, + "Filename '".$v_header['stored_filename']."' is " + ."compressed by an unsupported compression " + ."method (".$v_header['compression'].") "); + + return PclZip::errorCode(); + } + } + + // ----- Check encrypted files + if (($v_extract) && (($v_header['flag'] & 1) == 1)) { + $v_header['status'] = 'unsupported_encryption'; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, + "Unsupported encryption for " + ." filename '".$v_header['stored_filename'] + ."'"); + + return PclZip::errorCode(); + } + } + + // ----- Look for real extraction + if (($v_extract) && ($v_header['status'] != 'ok')) { + $v_result = $this->privConvertHeader2FileInfo($v_header, + $p_file_list[$v_nb_extracted++]); + if ($v_result != 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + $v_extract = false; + } + + // ----- Look for real extraction + if ($v_extract) + { + + // ----- Go to the file position + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_header['offset'])) + { + // ----- Close the zip file + $this->privCloseFd(); + + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for extraction as string + if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) { + + $v_string = ''; + + // ----- Extracting the file + $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Set the file content + $p_file_list[$v_nb_extracted]['content'] = $v_string; + + // ----- Next extracted file + $v_nb_extracted++; + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + // ----- Look for extraction in standard output + elseif ( (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) + && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) { + // ----- Extracting the file in standard output + $v_result1 = $this->privExtractFileInOutput($v_header, $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + // ----- Look for normal extraction + else { + // ----- Extracting the file + $v_result1 = $this->privExtractFile($v_header, + $p_path, $p_remove_path, + $p_remove_all_path, + $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + } + } + + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFile() + // Description : + // Parameters : + // Return Values : + // + // 1 : ... ? + // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback + // -------------------------------------------------------------------------------- + function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) + { + $v_result=1; + + // ----- Read the file header + if (($v_result = $this->privReadFileHeader($v_header)) != 1) + { + // ----- Return + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for all path to remove + if ($p_remove_all_path == true) { + // ----- Look for folder entry that not need to be extracted + if (($p_entry['external']&0x00000010)==0x00000010) { + + $p_entry['status'] = "filtered"; + + return $v_result; + } + + // ----- Get the basename of the path + $p_entry['filename'] = basename($p_entry['filename']); + } + + // ----- Look for path to remove + else if ($p_remove_path != "") + { + if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) + { + + // ----- Change the file status + $p_entry['status'] = "filtered"; + + // ----- Return + return $v_result; + } + + $p_remove_path_size = strlen($p_remove_path); + if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) + { + + // ----- Remove the path + $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size); + + } + } + + // ----- Add the path + if ($p_path != '') { + $p_entry['filename'] = $p_path."/".$p_entry['filename']; + } + + // ----- Check a base_dir_restriction + if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) { + $v_inclusion + = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION], + $p_entry['filename']); + if ($v_inclusion == 0) { + + PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION, + "Filename '".$p_entry['filename']."' is " + ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION"); + + return PclZip::errorCode(); + } + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Look for specific actions while the file exist + if (file_exists($p_entry['filename'])) + { + + // ----- Look if file is a directory + if (is_dir($p_entry['filename'])) + { + + // ----- Change the file status + $p_entry['status'] = "already_a_directory"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY, + "Filename '".$p_entry['filename']."' is " + ."already used by an existing directory"); + + return PclZip::errorCode(); + } + } + // ----- Look if file is write protected + else if (!is_writeable($p_entry['filename'])) + { + + // ----- Change the file status + $p_entry['status'] = "write_protected"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, + "Filename '".$p_entry['filename']."' exists " + ."and is write protected"); + + return PclZip::errorCode(); + } + } + + // ----- Look if the extracted file is older + else if (filemtime($p_entry['filename']) > $p_entry['mtime']) + { + // ----- Change the file status + if ( (isset($p_options[PCLZIP_OPT_REPLACE_NEWER])) + && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) { + } + else { + $p_entry['status'] = "newer_exist"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, + "Newer version of '".$p_entry['filename']."' exists " + ."and option PCLZIP_OPT_REPLACE_NEWER is not selected"); + + return PclZip::errorCode(); + } + } + } + else { + } + } + + // ----- Check the directory availability and create it if necessary + else { + if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/')) + $v_dir_to_check = $p_entry['filename']; + else if (!strstr($p_entry['filename'], "/")) + $v_dir_to_check = ""; + else + $v_dir_to_check = dirname($p_entry['filename']); + + if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) { + + // ----- Change the file status + $p_entry['status'] = "path_creation_fail"; + + // ----- Return + //return $v_result; + $v_result = 1; + } + } + } + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) + { + // ----- Look for not compressed file + if ($p_entry['compression'] == 0) { + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) + { + + // ----- Change the file status + $p_entry['status'] = "write_error"; + + // ----- Return + return $v_result; + } + + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + /* Try to speed up the code + $v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_binary_data, $v_read_size); + */ + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Closing the destination file + fclose($v_dest_file); + + // ----- Change the file mtime + touch($p_entry['filename'], $p_entry['mtime']); + + + } + else { + // ----- TBC + // Need to be finished + if (($p_entry['flag'] & 1) == 1) { + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \''.$p_entry['filename'].'\' is encrypted. Encrypted files are not supported.'); + return PclZip::errorCode(); + } + + + // ----- Look for using temporary file to unzip + if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) + && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) + || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) ) ) { + $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options); + if ($v_result < PCLZIP_ERR_NO_ERROR) { + return $v_result; + } + } + + // ----- Look for extract in memory + else { + + + // ----- Read the compressed file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + $v_file_content = @gzinflate($v_buffer); + unset($v_buffer); + if ($v_file_content === FALSE) { + + // ----- Change the file status + // TBC + $p_entry['status'] = "error"; + + return $v_result; + } + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { + + // ----- Change the file status + $p_entry['status'] = "write_error"; + + return $v_result; + } + + // ----- Write the uncompressed data + @fwrite($v_dest_file, $v_file_content, $p_entry['size']); + unset($v_file_content); + + // ----- Closing the destination file + @fclose($v_dest_file); + + } + + // ----- Change the file mtime + @touch($p_entry['filename'], $p_entry['mtime']); + } + + // ----- Look for chmod option + if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) { + + // ----- Change the mode of the file + @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]); + } + + } + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileUsingTempFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileUsingTempFile(&$p_entry, &$p_options) + { + $v_result=1; + + // ----- Creates a temporary file + $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; + if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) { + fclose($v_file); + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); + return PclZip::errorCode(); + } + + + // ----- Write gz file format header + $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3)); + @fwrite($v_dest_file, $v_binary_data, 10); + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Write gz file format footer + $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']); + @fwrite($v_dest_file, $v_binary_data, 8); + + // ----- Close the temporary file + @fclose($v_dest_file); + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { + $p_entry['status'] = "write_error"; + return $v_result; + } + + // ----- Open the temporary gz file + if ($this->bUseGzopen64) + { + if (($v_src_file = @gzopen64($v_gzip_temp_name, 'rb')) == 0) { + @fclose($v_dest_file); + $p_entry['status'] = "read_error"; + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + } + else + { + if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) { + @fclose($v_dest_file); + $p_entry['status'] = "read_error"; + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + } + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['size']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($v_src_file, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + @fclose($v_dest_file); + @gzclose($v_src_file); + + // ----- Delete the temporary file + @unlink($v_gzip_temp_name); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileInOutput() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileInOutput(&$p_entry, &$p_options) + { + $v_result=1; + + // ----- Read the file header + if (($v_result = $this->privReadFileHeader($v_header)) != 1) { + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + // ----- Trace + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) { + // ----- Look for not compressed file + if ($p_entry['compressed_size'] == $p_entry['size']) { + + // ----- Read the file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Send the file to the output + echo $v_buffer; + unset($v_buffer); + } + else { + + // ----- Read the compressed file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + $v_file_content = gzinflate($v_buffer); + unset($v_buffer); + + // ----- Send the file to the output + echo $v_file_content; + unset($v_file_content); + } + } + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileAsString() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileAsString(&$p_entry, &$p_string, &$p_options) + { + $v_result=1; + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->privReadFileHeader($v_header)) != 1) + { + // ----- Return + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) { + // ----- Look for not compressed file + // if ($p_entry['compressed_size'] == $p_entry['size']) + if ($p_entry['compression'] == 0) { + + // ----- Reading the file + $p_string = @fread($this->zip_fd, $p_entry['compressed_size']); + } + else { + + // ----- Reading the file + $v_data = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + if (($p_string = @gzinflate($v_data)) === FALSE) { + // TBC + } + } + + // ----- Trace + } + else { + // TBC : error : can not extract a folder in a string + } + + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Swap the content to header + $v_local_header['content'] = $p_string; + $p_string = ''; + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Swap back the content to header + $p_string = $v_local_header['content']; + unset($v_local_header['content']); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadFileHeader(&$p_header) + { + $v_result=1; + + // ----- Read the 4 bytes signature + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] != 0x04034b50) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the first 42 bytes of the header + $v_binary_data = fread($this->zip_fd, 26); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 26) + { + $p_header['filename'] = ""; + $p_header['status'] = "invalid_header"; + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data); + + // ----- Get filename + $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']); + + // ----- Get extra_fields + if ($v_data['extra_len'] != 0) { + $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']); + } + else { + $p_header['extra'] = ''; + } + + // ----- Extract properties + $p_header['version_extracted'] = $v_data['version']; + $p_header['compression'] = $v_data['compression']; + $p_header['size'] = $v_data['size']; + $p_header['compressed_size'] = $v_data['compressed_size']; + $p_header['crc'] = $v_data['crc']; + $p_header['flag'] = $v_data['flag']; + $p_header['filename_len'] = $v_data['filename_len']; + + // ----- Recuperate date in UNIX format + $p_header['mdate'] = $v_data['mdate']; + $p_header['mtime'] = $v_data['mtime']; + if ($p_header['mdate'] && $p_header['mtime']) + { + // ----- Extract time + $v_hour = ($p_header['mtime'] & 0xF800) >> 11; + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; + $v_seconde = ($p_header['mtime'] & 0x001F)*2; + + // ----- Extract date + $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; + $v_month = ($p_header['mdate'] & 0x01E0) >> 5; + $v_day = $p_header['mdate'] & 0x001F; + + // ----- Get UNIX date format + $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); + + } + else + { + $p_header['mtime'] = time(); + } + + // TBC + //for(reset($v_data); $key = key($v_data); next($v_data)) { + //} + + // ----- Set the stored filename + $p_header['stored_filename'] = $p_header['filename']; + + // ----- Set the status field + $p_header['status'] = "ok"; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadCentralFileHeader(&$p_header) + { + $v_result=1; + + // ----- Read the 4 bytes signature + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] != 0x02014b50) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the first 42 bytes of the header + $v_binary_data = fread($this->zip_fd, 42); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 42) + { + $p_header['filename'] = ""; + $p_header['status'] = "invalid_header"; + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data); + + // ----- Get filename + if ($p_header['filename_len'] != 0) + $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']); + else + $p_header['filename'] = ''; + + // ----- Get extra + if ($p_header['extra_len'] != 0) + $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']); + else + $p_header['extra'] = ''; + + // ----- Get comment + if ($p_header['comment_len'] != 0) + $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']); + else + $p_header['comment'] = ''; + + // ----- Extract properties + + // ----- Recuperate date in UNIX format + //if ($p_header['mdate'] && $p_header['mtime']) + // TBC : bug : this was ignoring time with 0/0/0 + if (1) + { + // ----- Extract time + $v_hour = ($p_header['mtime'] & 0xF800) >> 11; + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; + $v_seconde = ($p_header['mtime'] & 0x001F)*2; + + // ----- Extract date + $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; + $v_month = ($p_header['mdate'] & 0x01E0) >> 5; + $v_day = $p_header['mdate'] & 0x001F; + + // ----- Get UNIX date format + $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); + + } + else + { + $p_header['mtime'] = time(); + } + + // ----- Set the stored filename + $p_header['stored_filename'] = $p_header['filename']; + + // ----- Set default status to ok + $p_header['status'] = 'ok'; + + // ----- Look if it is a directory + if (substr($p_header['filename'], -1) == '/') { + //$p_header['external'] = 0x41FF0010; + $p_header['external'] = 0x00000010; + } + + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCheckFileHeaders() + // Description : + // Parameters : + // Return Values : + // 1 on success, + // 0 on error; + // -------------------------------------------------------------------------------- + function privCheckFileHeaders(&$p_local_header, &$p_central_header) + { + $v_result=1; + + // ----- Check the static values + // TBC + if ($p_local_header['filename'] != $p_central_header['filename']) { + } + if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) { + } + if ($p_local_header['flag'] != $p_central_header['flag']) { + } + if ($p_local_header['compression'] != $p_central_header['compression']) { + } + if ($p_local_header['mtime'] != $p_central_header['mtime']) { + } + if ($p_local_header['filename_len'] != $p_central_header['filename_len']) { + } + + // ----- Look for flag bit 3 + if (($p_local_header['flag'] & 8) == 8) { + $p_local_header['size'] = $p_central_header['size']; + $p_local_header['compressed_size'] = $p_central_header['compressed_size']; + $p_local_header['crc'] = $p_central_header['crc']; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadEndCentralDir() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadEndCentralDir(&$p_central_dir) + { + $v_result=1; + + // ----- Go to the end of the zip file + $v_size = filesize($this->zipname); + @fseek($this->zip_fd, $v_size); + if (@ftell($this->zip_fd) != $v_size) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- First try : look if this is an archive with no commentaries (most of the time) + // in this case the end of central dir is at 22 bytes of the file end + $v_found = 0; + if ($v_size > 26) { + @fseek($this->zip_fd, $v_size-22); + if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read for bytes + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = @unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] == 0x06054b50) { + $v_found = 1; + } + + $v_pos = ftell($this->zip_fd); + } + + // ----- Go back to the maximum possible size of the Central Dir End Record + if (!$v_found) { + $v_maximum_size = 65557; // 0xFFFF + 22; + if ($v_maximum_size > $v_size) + $v_maximum_size = $v_size; + @fseek($this->zip_fd, $v_size-$v_maximum_size); + if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read byte per byte in order to find the signature + $v_pos = ftell($this->zip_fd); + $v_bytes = 0x00000000; + while ($v_pos < $v_size) + { + // ----- Read a byte + $v_byte = @fread($this->zip_fd, 1); + + // ----- Add the byte + //$v_bytes = ($v_bytes << 8) | Ord($v_byte); + // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number + // Otherwise on systems where we have 64bit integers the check below for the magic number will fail. + $v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte); + + // ----- Compare the bytes + if ($v_bytes == 0x504b0506) + { + $v_pos++; + break; + } + + $v_pos++; + } + + // ----- Look if not found end of central dir + if ($v_pos == $v_size) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature"); + + // ----- Return + return PclZip::errorCode(); + } + } + + // ----- Read the first 18 bytes of the header + $v_binary_data = fread($this->zip_fd, 18); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 18) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data); + + // ----- Check the global size + if (($v_pos + $v_data['comment_size'] + 18) != $v_size) { + + // ----- Removed in release 2.2 see readme file + // The check of the file size is a little too strict. + // Some bugs where found when a zip is encrypted/decrypted with 'crypt'. + // While decrypted, zip has training 0 bytes + if (0) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, + 'The central dir is not at the end of the archive.' + .' Some trailing bytes exists after the archive.'); + + // ----- Return + return PclZip::errorCode(); + } + } + + // ----- Get comment + if ($v_data['comment_size'] != 0) { + $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']); + } + else + $p_central_dir['comment'] = ''; + + $p_central_dir['entries'] = $v_data['entries']; + $p_central_dir['disk_entries'] = $v_data['disk_entries']; + $p_central_dir['offset'] = $v_data['offset']; + $p_central_dir['size'] = $v_data['size']; + $p_central_dir['disk'] = $v_data['disk']; + $p_central_dir['disk_start'] = $v_data['disk_start']; + + // TBC + //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) { + //} + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDeleteByRule() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDeleteByRule(&$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Scan all the files + // ----- Start at beginning of Central Dir + $v_pos_entry = $v_central_dir['offset']; + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_pos_entry)) + { + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read each entry + $v_header_list = array(); + $j_start = 0; + for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) + { + + // ----- Read the file header + $v_header_list[$v_nb_extracted] = array(); + if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + + return $v_result; + } + + + // ----- Store the index + $v_header_list[$v_nb_extracted]['index'] = $i; + + // ----- Look for the specific extract rules + $v_found = false; + + // ----- Look for extract by name rule + if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) + && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { + + // ----- Look if the filename is in the list + for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) + && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_found = true; + } + elseif ( (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */ + && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_found = true; + } + } + // ----- Look for a filename + elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { + $v_found = true; + } + } + } + + // ----- Look for extract by ereg rule + // ereg() is deprecated with PHP 5.3 + /* + else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) + && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { + + if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { + $v_found = true; + } + } + */ + + // ----- Look for extract by preg rule + else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) + && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { + + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { + $v_found = true; + } + } + + // ----- Look for extract by index rule + else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) + && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { + + // ----- Look if the index is in the list + for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { + $v_found = true; + } + if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { + $j_start = $j+1; + } + + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { + break; + } + } + } + else { + $v_found = true; + } + + // ----- Look for deletion + if ($v_found) + { + unset($v_header_list[$v_nb_extracted]); + } + else + { + $v_nb_extracted++; + } + } + + // ----- Look if something need to be deleted + if ($v_nb_extracted > 0) { + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Creates a temporary zip archive + $v_temp_zip = new PclZip($v_zip_temp_name); + + // ----- Open the temporary zip file in write mode + if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) { + $this->privCloseFd(); + + // ----- Return + return $v_result; + } + + // ----- Look which file need to be kept + for ($i=0; $izip_fd); + if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the file header + $v_local_header = array(); + if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Check that local file header is same as central file header + if ($this->privCheckFileHeaders($v_local_header, + $v_header_list[$i]) != 1) { + // TBC + } + unset($v_local_header); + + // ----- Write the file header + if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Read/write the data block + if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($v_temp_zip->zip_fd); + + // ----- Re-Create the Central Dir files header + for ($i=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Transform the header to a 'usable' info + $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + + // ----- Zip file comment + $v_comment = ''; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) { + // ----- Reset the file list + unset($v_header_list); + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Close + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Destroy the temporary archive + unset($v_temp_zip); + } + + // ----- Remove every files : reset the file + else if ($v_central_dir['entries'] != 0) { + $this->privCloseFd(); + + if (($v_result = $this->privOpenFd('wb')) != 1) { + return $v_result; + } + + if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) { + return $v_result; + } + + $this->privCloseFd(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDirCheck() + // Description : + // Check if a directory exists, if not it creates it and all the parents directory + // which may be useful. + // Parameters : + // $p_dir : Directory path to check. + // Return Values : + // 1 : OK + // -1 : Unable to create directory + // -------------------------------------------------------------------------------- + function privDirCheck($p_dir, $p_is_dir=false) + { + $v_result = 1; + + + // ----- Remove the final '/' + if (($p_is_dir) && (substr($p_dir, -1)=='/')) + { + $p_dir = substr($p_dir, 0, strlen($p_dir)-1); + } + + // ----- Check the directory availability + if ((is_dir($p_dir)) || ($p_dir == "")) + { + return 1; + } + + // ----- Extract parent directory + $p_parent_dir = dirname($p_dir); + + // ----- Just a check + if ($p_parent_dir != $p_dir) + { + // ----- Look for parent directory + if ($p_parent_dir != "") + { + if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) + { + return $v_result; + } + } + } + + // ----- Create the directory + if (!@mkdir($p_dir, 0777)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privMerge() + // Description : + // If $p_archive_to_add does not exist, the function exit with a success result. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privMerge(&$p_archive_to_add) + { + $v_result=1; + + // ----- Look if the archive_to_add exists + if (!is_file($p_archive_to_add->zipname)) + { + + // ----- Nothing to merge, so merge is a success + $v_result = 1; + + // ----- Return + return $v_result; + } + + // ----- Look if the archive exists + if (!is_file($this->zipname)) + { + + // ----- Do a duplicate + $v_result = $this->privDuplicate($p_archive_to_add->zipname); + + // ----- Return + return $v_result; + } + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Open the archive_to_add file + if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1) + { + $this->privCloseFd(); + + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir_to_add = array(); + if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + return $v_result; + } + + // ----- Go to beginning of File + @rewind($p_archive_to_add->zip_fd); + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = $v_central_dir['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Copy the files from the archive_to_add into the temporary file + $v_size = $v_central_dir_to_add['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($v_zip_temp_fd); + + // ----- Copy the block of file headers from the old archive + $v_size = $v_central_dir['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Copy the block of file headers from the archive_to_add + $v_size = $v_central_dir_to_add['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Merge the file comments + $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment']; + + // ----- Calculate the size of the (new) central header + $v_size = @ftell($v_zip_temp_fd)-$v_offset; + + // ----- Swap the file descriptor + // Here is a trick : I swap the temporary fd with the zip fd, in order to use + // the following methods on the temporary fil and not the real archive fd + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + @fclose($v_zip_temp_fd); + $this->zip_fd = null; + + // ----- Reset the file list + unset($v_header_list); + + // ----- Return + return $v_result; + } + + // ----- Swap back the file descriptor + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Close + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDuplicate() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDuplicate($p_archive_filename) + { + $v_result=1; + + // ----- Look if the $p_archive_filename exists + if (!is_file($p_archive_filename)) + { + + // ----- Nothing to duplicate, so duplicate is a success. + $v_result = 1; + + // ----- Return + return $v_result; + } + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('wb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) + { + $this->privCloseFd(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = filesize($p_archive_filename); + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($v_zip_temp_fd, $v_read_size); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close + $this->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privErrorLog() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privErrorLog($p_error_code=0, $p_error_string='') + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + PclError($p_error_code, $p_error_string); + } + else { + $this->error_code = $p_error_code; + $this->error_string = $p_error_string; + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privErrorReset() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privErrorReset() + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + PclErrorReset(); + } + else { + $this->error_code = 0; + $this->error_string = ''; + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDisableMagicQuotes() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDisableMagicQuotes() + { + $v_result=1; + + // ----- Look if function exists + if ( (!function_exists("get_magic_quotes_runtime")) + || (!function_exists("set_magic_quotes_runtime"))) { + return $v_result; + } + + // ----- Look if already done + if ($this->magic_quotes_status != -1) { + return $v_result; + } + + // ----- Get and memorize the magic_quote value + $this->magic_quotes_status = @get_magic_quotes_runtime(); + + // ----- Disable magic_quotes + if ($this->magic_quotes_status == 1) { + @set_magic_quotes_runtime(0); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privSwapBackMagicQuotes() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privSwapBackMagicQuotes() + { + $v_result=1; + + // ----- Look if function exists + if ( (!function_exists("get_magic_quotes_runtime")) + || (!function_exists("set_magic_quotes_runtime"))) { + return $v_result; + } + + // ----- Look if something to do + if ($this->magic_quotes_status != -1) { + return $v_result; + } + + // ----- Swap back magic_quotes + if ($this->magic_quotes_status == 1) { + @set_magic_quotes_runtime($this->magic_quotes_status); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + } + // End of class + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilPathReduction() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function PclZipUtilPathReduction($p_dir) + { + $v_result = ""; + + // ----- Look for not empty path + if ($p_dir != "") { + // ----- Explode path by directory names + $v_list = explode("/", $p_dir); + + // ----- Study directories from last to first + $v_skip = 0; + for ($i=sizeof($v_list)-1; $i>=0; $i--) { + // ----- Look for current path + if ($v_list[$i] == ".") { + // ----- Ignore this directory + // Should be the first $i=0, but no check is done + } + else if ($v_list[$i] == "..") { + $v_skip++; + } + else if ($v_list[$i] == "") { + // ----- First '/' i.e. root slash + if ($i == 0) { + $v_result = "/".$v_result; + if ($v_skip > 0) { + // ----- It is an invalid path, so the path is not modified + // TBC + $v_result = $p_dir; + $v_skip = 0; + } + } + // ----- Last '/' i.e. indicates a directory + else if ($i == (sizeof($v_list)-1)) { + $v_result = $v_list[$i]; + } + // ----- Double '/' inside the path + else { + // ----- Ignore only the double '//' in path, + // but not the first and last '/' + } + } + else { + // ----- Look for item to skip + if ($v_skip > 0) { + $v_skip--; + } + else { + $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:""); + } + } + } + + // ----- Look for skip + if ($v_skip > 0) { + while ($v_skip > 0) { + $v_result = '../'.$v_result; + $v_skip--; + } + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilPathInclusion() + // Description : + // This function indicates if the path $p_path is under the $p_dir tree. Or, + // said in an other way, if the file or sub-dir $p_path is inside the dir + // $p_dir. + // The function indicates also if the path is exactly the same as the dir. + // This function supports path with duplicated '/' like '//', but does not + // support '.' or '..' statements. + // Parameters : + // Return Values : + // 0 if $p_path is not inside directory $p_dir + // 1 if $p_path is inside directory $p_dir + // 2 if $p_path is exactly the same as $p_dir + // -------------------------------------------------------------------------------- + function PclZipUtilPathInclusion($p_dir, $p_path) + { + $v_result = 1; + + // ----- Look for path beginning by ./ + if ( ($p_dir == '.') + || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) { + $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1); + } + if ( ($p_path == '.') + || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) { + $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1); + } + + // ----- Explode dir and path by directory separator + $v_list_dir = explode("/", $p_dir); + $v_list_dir_size = sizeof($v_list_dir); + $v_list_path = explode("/", $p_path); + $v_list_path_size = sizeof($v_list_path); + + // ----- Study directories paths + $i = 0; + $j = 0; + while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) { + + // ----- Look for empty dir (path reduction) + if ($v_list_dir[$i] == '') { + $i++; + continue; + } + if ($v_list_path[$j] == '') { + $j++; + continue; + } + + // ----- Compare the items + if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != '')) { + $v_result = 0; + } + + // ----- Next items + $i++; + $j++; + } + + // ----- Look if everything seems to be the same + if ($v_result) { + // ----- Skip all the empty items + while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++; + while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++; + + if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) { + // ----- There are exactly the same + $v_result = 2; + } + else if ($i < $v_list_dir_size) { + // ----- The path is shorter than the dir + $v_result = 0; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilCopyBlock() + // Description : + // Parameters : + // $p_mode : read/write compression mode + // 0 : src & dest normal + // 1 : src gzip, dest normal + // 2 : src normal, dest gzip + // 3 : src & dest gzip + // Return Values : + // -------------------------------------------------------------------------------- + function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0) + { + $v_result = 1; + + if ($p_mode==0) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_src, $v_read_size); + @fwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==1) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($p_src, $v_read_size); + @fwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==2) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_src, $v_read_size); + @gzwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==3) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($p_src, $v_read_size); + @gzwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilRename() + // Description : + // This function tries to do a simple rename() function. If it fails, it + // tries to copy the $p_src file in a new $p_dest file and then unlink the + // first one. + // Parameters : + // $p_src : Old filename + // $p_dest : New filename + // Return Values : + // 1 on success, 0 on failure. + // -------------------------------------------------------------------------------- + function PclZipUtilRename($p_src, $p_dest) + { + $v_result = 1; + + // ----- Try to rename the files + if (!@rename($p_src, $p_dest)) { + + // ----- Try to copy & unlink the src + if (!@copy($p_src, $p_dest)) { + $v_result = 0; + } + else if (!@unlink($p_src)) { + $v_result = 0; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilOptionText() + // Description : + // Translate option value in text. Mainly for debug purpose. + // Parameters : + // $p_option : the option value. + // Return Values : + // The option text value. + // -------------------------------------------------------------------------------- + function PclZipUtilOptionText($p_option) + { + + $v_list = get_defined_constants(); + for (reset($v_list); $v_key = key($v_list); next($v_list)) { + $v_prefix = substr($v_key, 0, 10); + if (( ($v_prefix == 'PCLZIP_OPT') + || ($v_prefix == 'PCLZIP_CB_') + || ($v_prefix == 'PCLZIP_ATT')) + && ($v_list[$v_key] == $p_option)) { + return $v_key; + } + } + + $v_result = 'Unknown'; + + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilTranslateWinPath() + // Description : + // Translate windows path by replacing '\' by '/' and optionally removing + // drive letter. + // Parameters : + // $p_path : path to translate. + // $p_remove_disk_letter : true | false + // Return Values : + // The path translated. + // -------------------------------------------------------------------------------- + function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true) + { + if (stristr(php_uname(), 'windows')) { + // ----- Look for potential disk letter + if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { + $p_path = substr($p_path, $v_position+1); + } + // ----- Change potential windows directory separator + if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) { + $p_path = strtr($p_path, '\\', '/'); + } + } + return $p_path; + } + // -------------------------------------------------------------------------------- + + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/readme.txt b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/readme.txt new file mode 100755 index 00000000..6ed88394 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/readme.txt @@ -0,0 +1,421 @@ +// -------------------------------------------------------------------------------- +// PclZip 2.8.2 - readme.txt +// -------------------------------------------------------------------------------- +// License GNU/LGPL - August 2009 +// Vincent Blavet - vincent@phpconcept.net +// http://www.phpconcept.net +// -------------------------------------------------------------------------------- +// $Id: readme.txt,v 1.60 2009/09/30 20:35:21 vblavet Exp $ +// -------------------------------------------------------------------------------- + + + +0 - Sommaire +============ + 1 - Introduction + 2 - What's new + 3 - Corrected bugs + 4 - Known bugs or limitations + 5 - License + 6 - Warning + 7 - Documentation + 8 - Author + 9 - Contribute + +1 - Introduction +================ + + PclZip is a library that allow you to manage a Zip archive. + + Full documentation about PclZip can be found here : http://www.phpconcept.net/pclzip + +2 - What's new +============== + + Version 2.8.2 : + - PCLZIP_CB_PRE_EXTRACT and PCLZIP_CB_POST_EXTRACT are now supported with + extraction as a string (PCLZIP_OPT_EXTRACT_AS_STRING). The string + can also be modified in the post-extract call back. + **Bugs correction : + - PCLZIP_OPT_REMOVE_ALL_PATH was not working correctly + - Remove use of eval() and do direct call to callback functions + - Correct support of 64bits systems (Thanks to WordPress team) + + Version 2.8.1 : + - Move option PCLZIP_OPT_BY_EREG to PCLZIP_OPT_BY_PREG because ereg() is + deprecated in PHP 5.3. When using option PCLZIP_OPT_BY_EREG, PclZip will + automatically replace it by PCLZIP_OPT_BY_PREG. + + Version 2.8 : + - Improve extraction of zip archive for large files by using temporary files + This feature is working like the one defined in r2.7. + Options are renamed : PCLZIP_OPT_TEMP_FILE_ON, PCLZIP_OPT_TEMP_FILE_OFF, + PCLZIP_OPT_TEMP_FILE_THRESHOLD + - Add a ratio constant PCLZIP_TEMPORARY_FILE_RATIO to configure the auto + sense of temporary file use. + - Bug correction : Reduce filepath in returned file list to remove ennoying + './/' preambule in file path. + + Version 2.7 : + - Improve creation of zip archive for large files : + PclZip will now autosense the configured memory and use temporary files + when large file is suspected. + This feature can also ne triggered by manual options in create() and add() + methods. 'PCLZIP_OPT_ADD_TEMP_FILE_ON' force the use of temporary files, + 'PCLZIP_OPT_ADD_TEMP_FILE_OFF' disable the autosense technic, + 'PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD' allow for configuration of a size + threshold to use temporary files. + Using "temporary files" rather than "memory" might take more time, but + might give the ability to zip very large files : + Tested on my win laptop with a 88Mo file : + Zip "in-memory" : 18sec (max_execution_time=30, memory_limit=180Mo) + Zip "tmporary-files" : 23sec (max_execution_time=30, memory_limit=30Mo) + - Replace use of mktime() by time() to limit the E_STRICT error messages. + - Bug correction : When adding files with full windows path (drive letter) + PclZip is now working. Before, if the drive letter is not the default + path, PclZip was not able to add the file. + + Version 2.6 : + - Code optimisation + - New attributes PCLZIP_ATT_FILE_COMMENT gives the ability to + add a comment for a specific file. (Don't really know if this is usefull) + - New attribute PCLZIP_ATT_FILE_CONTENT gives the ability to add a string + as a file. + - New attribute PCLZIP_ATT_FILE_MTIME modify the timestamp associated with + a file. + - Correct a bug. Files archived with a timestamp with 0h0m0s were extracted + with current time + - Add CRC value in the informations returned back for each file after an + action. + - Add missing closedir() statement. + - When adding a folder, and removing the path of this folder, files were + incorrectly added with a '/' at the beginning. Which means files are + related to root in unix systems. Corrected. + - Add conditional if before constant definition. This will allow users + to redefine constants without changing the file, and then improve + upgrade of pclzip code for new versions. + + Version 2.5 : + - Introduce the ability to add file/folder with individual properties (file descriptor). + This gives for example the ability to change the filename of a zipped file. + . Able to add files individually + . Able to change full name + . Able to change short name + . Compatible with global options + - New attributes : PCLZIP_ATT_FILE_NAME, PCLZIP_ATT_FILE_NEW_SHORT_NAME, PCLZIP_ATT_FILE_NEW_FULL_NAME + - New error code : PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE + - Add a security control feature. PclZip can extract any file in any folder + of a system. People may use this to upload a zip file and try to override + a system file. The PCLZIP_OPT_EXTRACT_DIR_RESTRICTION will give the + ability to forgive any directory transversal behavior. + - New PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : check extraction path + - New error code : PCLZIP_ERR_DIRECTORY_RESTRICTION + - Modification in PclZipUtilPathInclusion() : dir and path beginning with ./ will be prepend + by current path (getcwd()) + + Version 2.4 : + - Code improvment : try to speed up the code by removing unusefull call to pack() + - Correct bug in delete() : delete() should be called with no argument. This was not + the case in 2.3. This is corrected in 2.4. + - Correct a bug in path_inclusion function. When the path has several '../../', the + result was bad. + - Add a check for magic_quotes_runtime configuration. If enabled, PclZip will + disable it while working and det it back to its original value. + This resolve a lots of bad formated archive errors. + - Bug correction : PclZip now correctly unzip file in some specific situation, + when compressed content has same size as uncompressed content. + - Bug correction : When selecting option 'PCLZIP_OPT_REMOVE_ALL_PATH', + directories are not any more created. + - Code improvment : correct unclosed opendir(), better handling of . and .. in + loops. + + + Version 2.3 : + - Correct a bug with PHP5 : affecting the value 0xFE49FFE0 to a variable does not + give the same result in PHP4 and PHP5 .... + + Version 2.2 : + - Try development of PCLZIP_OPT_CRYPT ..... + However this becomes to a stop. To crypt/decrypt I need to multiply 2 long integers, + the result (greater than a long) is not supported by PHP. Even the use of bcmath + functions does not help. I did not find yet a solution ...; + - Add missing '/' at end of directory entries + - Check is a file is encrypted or not. Returns status 'unsupported_encryption' and/or + error code PCLZIP_ERR_UNSUPPORTED_ENCRYPTION. + - Corrected : Bad "version need to extract" field in local file header + - Add private method privCheckFileHeaders() in order to check local and central + file headers. PclZip is now supporting purpose bit flag bit 3. Purpose bit flag bit 3 gives + the ability to have a local file header without size, compressed size and crc filled. + - Add a generic status 'error' for file status + - Add control of compression type. PclZip only support deflate compression method. + Before v2.2, PclZip does not check the compression method used in an archive while + extracting. With v2.2 PclZip returns a new error status for a file using an unsupported + compression method. New status is "unsupported_compression". New error code is + PCLZIP_ERR_UNSUPPORTED_COMPRESSION. + - Add optional attribute PCLZIP_OPT_STOP_ON_ERROR. This will stop the extract of files + when errors like 'a folder with same name exists' or 'a newer file exists' or + 'a write protected file' exists, rather than set a status for the concerning file + and resume the extract of the zip. + - Add optional attribute PCLZIP_OPT_REPLACE_NEWER. This will force, during an extract' the + replacement of the file, even if a newer version of the file exists. + Note that today if a file with the same name already exists but is older it will be + replaced by the extracted one. + - Improve PclZipUtilOption() + - Support of zip archive with trailing bytes. Before 2.2, PclZip checks that the central + directory structure is the last data in the archive. Crypt encryption/decryption of + zip archive put trailing 0 bytes after decryption. PclZip is now supporting this. + + Version 2.1 : + - Add the ability to abort the extraction by using a user callback function. + The user can now return the value '2' in its callback which indicates to stop the + extraction. For a pre call-back extract is stopped before the extration of the current + file. For a post call back, the extraction is stopped after. + - Add the ability to extract a file (or several files) directly in the standard output. + This is done by the new parameter PCLZIP_OPT_EXTRACT_IN_OUTPUT with method extract(). + - Add support for parameters PCLZIP_OPT_COMMENT, PCLZIP_OPT_ADD_COMMENT, + PCLZIP_OPT_PREPEND_COMMENT. This will create, replace, add, or prepend comments + in the zip archive. + - When merging two archives, the comments are not any more lost, but merged, with a + blank space separator. + - Corrected bug : Files are not deleted when all files are asked to be deleted. + - Corrected bug : Folders with name '0' made PclZip to abort the create or add feature. + + + Version 2.0 : + ***** Warning : Some new features may break the backward compatibility for your scripts. + Please carefully read the readme file. + - Add the ability to delete by Index, name and regular expression. This feature is + performed by the method delete(), which uses the optional parameters + PCLZIP_OPT_BY_INDEX, PCLZIP_OPT_BY_NAME, PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG. + - Add the ability to extract by regular expression. To extract by regexp you must use the method + extract(), with the option PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG + (depending if you want to use ereg() or preg_match() syntax) followed by the + regular expression pattern. + - Add the ability to extract by index, directly with the extract() method. This is a + code improvment of the extractByIndex() method. + - Add the ability to extract by name. To extract by name you must use the method + extract(), with the option PCLZIP_OPT_BY_NAME followed by the filename to + extract or an array of filenames to extract. To extract all a folder, use the folder + name rather than the filename with a '/' at the end. + - Add the ability to add files without compression. This is done with a new attribute + which is PCLZIP_OPT_NO_COMPRESSION. + - Add the attribute PCLZIP_OPT_EXTRACT_AS_STRING, which allow to extract a file directly + in a string without using any file (or temporary file). + - Add constant PCLZIP_SEPARATOR for static configuration of filename separators in a single string. + The default separator is now a comma (,) and not any more a blank space. + THIS BREAK THE BACKWARD COMPATIBILITY : Please check if this may have an impact with + your script. + - Improve algorythm performance by removing the use of temporary files when adding or + extracting files in an archive. + - Add (correct) detection of empty filename zipping. This can occurs when the removed + path is the same + as a zipped dir. The dir is not zipped (['status'] = filtered), only its content. + - Add better support for windows paths (thanks for help from manus@manusfreedom.com). + - Corrected bug : When the archive file already exists with size=0, the add() method + fails. Corrected in 2.0. + - Remove the use of OS_WINDOWS constant. Use php_uname() function rather. + - Control the order of index ranges in extract by index feature. + - Change the internal management of folders (better handling of internal flag). + + + Version 1.3 : + - Removing the double include check. This is now done by include_once() and require_once() + PHP directives. + - Changing the error handling mecanism : Remove the use of an external error library. + The former PclError...() functions are replaced by internal equivalent methods. + By changing the environment variable PCLZIP_ERROR_EXTERNAL you can still use the former library. + Introducing the use of constants for error codes rather than integer values. This will help + in futur improvment. + Introduction of error handling functions like errorCode(), errorName() and errorInfo(). + - Remove the deprecated use of calling function with arguments passed by reference. + - Add the calling of extract(), extractByIndex(), create() and add() functions + with variable options rather than fixed arguments. + - Add the ability to remove all the file path while extracting or adding, + without any need to specify the path to remove. + This is available for extract(), extractByIndex(), create() and add() functionS by using + the new variable options parameters : + - PCLZIP_OPT_REMOVE_ALL_PATH : by indicating this option while calling the fct. + - Ability to change the mode of a file after the extraction (chmod()). + This is available for extract() and extractByIndex() functionS by using + the new variable options parameters. + - PCLZIP_OPT_SET_CHMOD : by setting the value of this option. + - Ability to definition call-back options. These call-back will be called during the adding, + or the extracting of file (extract(), extractByIndex(), create() and add() functions) : + - PCLZIP_CB_PRE_EXTRACT : will be called before each extraction of a file. The user + can trigerred the change the filename of the extracted file. The user can triggered the + skip of the extraction. This is adding a 'skipped' status in the file list result value. + - PCLZIP_CB_POST_EXTRACT : will be called after each extraction of a file. + Nothing can be triggered from that point. + - PCLZIP_CB_PRE_ADD : will be called before each add of a file. The user + can trigerred the change the stored filename of the added file. The user can triggered the + skip of the add. This is adding a 'skipped' status in the file list result value. + - PCLZIP_CB_POST_ADD : will be called after each add of a file. + Nothing can be triggered from that point. + - Two status are added in the file list returned as function result : skipped & filename_too_long + 'skipped' is used when a call-back function ask for skipping the file. + 'filename_too_long' is used while adding a file with a too long filename to archive (the file is + not added) + - Adding the function PclZipUtilPathInclusion(), that check the inclusion of a path into + a directory. + - Add a check of the presence of the archive file before some actions (like list, ...) + - Add the initialisation of field "index" in header array. This means that by + default index will be -1 when not explicitly set by the methods. + + Version 1.2 : + - Adding a duplicate function. + - Adding a merge function. The merge function is a "quick merge" function, + it just append the content of an archive at the end of the first one. There + is no check for duplicate files or more recent files. + - Improve the search of the central directory end. + + Version 1.1.2 : + + - Changing the license of PclZip. PclZip is now released under the GNU / LGPL license + (see License section). + - Adding the optional support of a static temporary directory. You will need to configure + the constant PCLZIP_TEMPORARY_DIR if you want to use this feature. + - Improving the rename() function. In some cases rename() does not work (different + Filesystems), so it will be replaced by a copy() + unlink() functions. + + Version 1.1.1 : + + - Maintenance release, no new feature. + + Version 1.1 : + + - New method Add() : adding files in the archive + - New method ExtractByIndex() : partial extract of the archive, files are identified by + their index in the archive + - New method DeleteByIndex() : delete some files/folder entries from the archive, + files are identified by their index in the archive. + - Adding a test of the zlib extension presence. If not present abort the script. + + Version 1.0.1 : + + - No new feature + + +3 - Corrected bugs +================== + + Corrected in Version 2.0 : + - Corrected : During an extraction, if a call-back fucntion is used and try to skip + a file, all the extraction process is stopped. + + Corrected in Version 1.3 : + - Corrected : Support of static synopsis for method extract() is broken. + - Corrected : invalid size of archive content field (0xFF) should be (0xFFFF). + - Corrected : When an extract is done with a remove_path parameter, the entry for + the directory with exactly the same path is not skipped/filtered. + - Corrected : extractByIndex() and deleteByIndex() were not managing index in the + right way. For example indexes '1,3-5,11' will only extract files 1 and 11. This + is due to a sort of the index resulting table that puts 11 before 3-5 (sort on + string and not interger). The sort is temporarilly removed, this means that + you must provide a sorted list of index ranges. + + Corrected in Version 1.2 : + + - Nothing. + + Corrected in Version 1.1.2 : + + - Corrected : Winzip is unable to delete or add new files in a PclZip created archives. + + Corrected in Version 1.1.1 : + + - Corrected : When archived file is not compressed (0% compression), the + extract method fails. + + Corrected in Version 1.1 : + + - Corrected : Adding a complete tree of folder may result in a bad archive + creation. + + Corrected in Version 1.0.1 : + + - Corrected : Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024). + + +4 - Known bugs or limitations +============================= + + Please publish bugs reports in SourceForge : + http://sourceforge.net/tracker/?group_id=40254&atid=427564 + + In Version 2.x : + - PclZip does only support file uncompressed or compressed with deflate (compression method 8) + - PclZip does not support password protected zip archive + - Some concern were seen when changing mtime of a file while archiving. + Seems to be linked to Daylight Saving Time (PclTest_changing_mtime). + + In Version 1.2 : + + - merge() methods does not check for duplicate files or last date of modifications. + + In Version 1.1 : + + - Limitation : Using 'extract' fields in the file header in the zip archive is not supported. + - WinZip is unable to delete a single file in a PclZip created archive. It is also unable to + add a file in a PclZip created archive. (Corrected in v.1.2) + + In Version 1.0.1 : + + - Adding a complete tree of folder may result in a bad archive + creation. (Corrected in V.1.1). + - Path given to methods must be in the unix format (/) and not the Windows format (\). + Workaround : Use only / directory separators. + - PclZip is using temporary files that are sometime the name of the file with a .tmp or .gz + added suffix. Files with these names may already exist and may be overwritten. + Workaround : none. + - PclZip does not check if the zlib extension is present. If it is absent, the zip + file is not created and the lib abort without warning. + Workaround : enable the zlib extension on the php install + + In Version 1.0 : + + - Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024). + (Corrected in v.1.0.1) + - Limitation : Multi-disk zip archive are not supported. + + +5 - License +=========== + + Since version 1.1.2, PclZip Library is released under GNU/LGPL license. + This library is free, so you can use it at no cost. + + HOWEVER, if you release a script, an application, a library or any kind of + code using PclZip library (or a part of it), YOU MUST : + - Indicate in the documentation (or a readme file), that your work + uses PclZip Library, and make a reference to the author and the web site + http://www.phpconcept.net + - Gives the ability to the final user to update the PclZip libary. + + I will also appreciate that you send me a mail (vincent@phpconcept.net), just to + be aware that someone is using PclZip. + + For more information about GNU/LGPL license : http://www.gnu.org + +6 - Warning +================= + + This library and the associated files are non commercial, non professional work. + It should not have unexpected results. However if any damage is caused by this software + the author can not be responsible. + The use of this software is at the risk of the user. + +7 - Documentation +================= + PclZip User Manuel is available in English on PhpConcept : http://www.phpconcept.net/pclzip/man/en/index.php + A Russian translation was done by Feskov Kuzma : http://php.russofile.ru/ru/authors/unsort/zip/ + +8 - Author +========== + + This software was written by Vincent Blavet (vincent@phpconcept.net) on its leasure time. + +9 - Contribute +============== + If you want to contribute to the development of PclZip, please contact vincent@phpconcept.net. + If you can help in financing PhpConcept hosting service, please go to + http://www.phpconcept.net/soutien.php diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/AES.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/AES.php new file mode 100755 index 00000000..6b1f9daa --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/AES.php @@ -0,0 +1,207 @@ + + * setKey('abcdefghijklmnop'); + * + * $size = 10 * 1024; + * $plaintext = ''; + * for ($i = 0; $i < $size; $i++) { + * $plaintext.= 'a'; + * } + * + * echo $aes->decrypt($aes->encrypt($plaintext)); + * ?> + * + * + * LICENSE: 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. + * + * @category Crypt + * @package Crypt_AES + * @author Jim Wigginton + * @copyright 2008 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Rijndael + */ +if (!class_exists('Crypt_Rijndael')) { + include_once 'Rijndael.php'; +} + +/**#@+ + * @access public + * @see Crypt_AES::encrypt() + * @see Crypt_AES::decrypt() + */ +/** + * Encrypt / decrypt using the Counter mode. + * + * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 + */ +define('CRYPT_AES_MODE_CTR', CRYPT_MODE_CTR); +/** + * Encrypt / decrypt using the Electronic Code Book mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 + */ +define('CRYPT_AES_MODE_ECB', CRYPT_MODE_ECB); +/** + * Encrypt / decrypt using the Code Book Chaining mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 + */ +define('CRYPT_AES_MODE_CBC', CRYPT_MODE_CBC); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 + */ +define('CRYPT_AES_MODE_CFB', CRYPT_MODE_CFB); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 + */ +define('CRYPT_AES_MODE_OFB', CRYPT_MODE_OFB); +/**#@-*/ + +/**#@+ + * @access private + * @see Crypt_Base::Crypt_Base() + */ +/** + * Toggles the internal implementation + */ +define('CRYPT_AES_MODE_INTERNAL', CRYPT_MODE_INTERNAL); +/** + * Toggles the mcrypt implementation + */ +define('CRYPT_AES_MODE_MCRYPT', CRYPT_MODE_MCRYPT); +/**#@-*/ + +/** + * Pure-PHP implementation of AES. + * + * @package Crypt_AES + * @author Jim Wigginton + * @access public + */ +class Crypt_AES extends Crypt_Rijndael +{ + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_Base::const_namespace + * @var String + * @access private + */ + var $const_namespace = 'AES'; + + /** + * Dummy function + * + * Since Crypt_AES extends Crypt_Rijndael, this function is, technically, available, but it doesn't do anything. + * + * @see Crypt_Rijndael::setBlockLength() + * @access public + * @param Integer $length + */ + function setBlockLength($length) + { + return; + } + + /** + * Sets the key length + * + * Valid key lengths are 128, 192, and 256. If the length is less than 128, it will be rounded up to + * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount. + * + * @see Crypt_Rijndael:setKeyLength() + * @access public + * @param Integer $length + */ + function setKeyLength($length) + { + switch ($length) { + case 160: + $length = 192; + break; + case 224: + $length = 256; + } + parent::setKeyLength($length); + } + + /** + * Sets the key. + * + * Rijndael supports five different key lengths, AES only supports three. + * + * @see Crypt_Rijndael:setKey() + * @see setKeyLength() + * @access public + * @param String $key + */ + function setKey($key) + { + parent::setKey($key); + + if (!$this->explicit_key_length) { + $length = strlen($key); + switch (true) { + case $length <= 16: + $this->key_size = 16; + break; + case $length <= 24: + $this->key_size = 24; + break; + default: + $this->key_size = 32; + } + $this->_setupEngine(); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Base.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Base.php new file mode 100755 index 00000000..4df2a2db --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Base.php @@ -0,0 +1,2011 @@ + + * @author Hans-Juergen Petrich + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/**#@+ + * @access public + * @see Crypt_Base::encrypt() + * @see Crypt_Base::decrypt() + */ +/** + * Encrypt / decrypt using the Counter mode. + * + * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 + */ +define('CRYPT_MODE_CTR', -1); +/** + * Encrypt / decrypt using the Electronic Code Book mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 + */ +define('CRYPT_MODE_ECB', 1); +/** + * Encrypt / decrypt using the Code Book Chaining mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 + */ +define('CRYPT_MODE_CBC', 2); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 + */ +define('CRYPT_MODE_CFB', 3); +/** + * Encrypt / decrypt using the Output Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 + */ +define('CRYPT_MODE_OFB', 4); +/** + * Encrypt / decrypt using streaming mode. + * + */ +define('CRYPT_MODE_STREAM', 5); +/**#@-*/ + +/**#@+ + * @access private + * @see Crypt_Base::Crypt_Base() + */ +/** + * Base value for the internal implementation $engine switch + */ +define('CRYPT_MODE_INTERNAL', 1); +/** + * Base value for the mcrypt implementation $engine switch + */ +define('CRYPT_MODE_MCRYPT', 2); +/**#@-*/ + +/** + * Base Class for all Crypt_* cipher classes + * + * @package Crypt_Base + * @author Jim Wigginton + * @author Hans-Juergen Petrich + * @access public + */ +class Crypt_Base +{ + /** + * The Encryption Mode + * + * @see Crypt_Base::Crypt_Base() + * @var Integer + * @access private + */ + var $mode; + + /** + * The Block Length of the block cipher + * + * @var Integer + * @access private + */ + var $block_size = 16; + + /** + * The Key + * + * @see Crypt_Base::setKey() + * @var String + * @access private + */ + var $key = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; + + /** + * The Initialization Vector + * + * @see Crypt_Base::setIV() + * @var String + * @access private + */ + var $iv; + + /** + * A "sliding" Initialization Vector + * + * @see Crypt_Base::enableContinuousBuffer() + * @see Crypt_Base::_clearBuffers() + * @var String + * @access private + */ + var $encryptIV; + + /** + * A "sliding" Initialization Vector + * + * @see Crypt_Base::enableContinuousBuffer() + * @see Crypt_Base::_clearBuffers() + * @var String + * @access private + */ + var $decryptIV; + + /** + * Continuous Buffer status + * + * @see Crypt_Base::enableContinuousBuffer() + * @var Boolean + * @access private + */ + var $continuousBuffer = false; + + /** + * Encryption buffer for CTR, OFB and CFB modes + * + * @see Crypt_Base::encrypt() + * @see Crypt_Base::_clearBuffers() + * @var Array + * @access private + */ + var $enbuffer; + + /** + * Decryption buffer for CTR, OFB and CFB modes + * + * @see Crypt_Base::decrypt() + * @see Crypt_Base::_clearBuffers() + * @var Array + * @access private + */ + var $debuffer; + + /** + * mcrypt resource for encryption + * + * The mcrypt resource can be recreated every time something needs to be created or it can be created just once. + * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode. + * + * @see Crypt_Base::encrypt() + * @var Resource + * @access private + */ + var $enmcrypt; + + /** + * mcrypt resource for decryption + * + * The mcrypt resource can be recreated every time something needs to be created or it can be created just once. + * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode. + * + * @see Crypt_Base::decrypt() + * @var Resource + * @access private + */ + var $demcrypt; + + /** + * Does the enmcrypt resource need to be (re)initialized? + * + * @see Crypt_Twofish::setKey() + * @see Crypt_Twofish::setIV() + * @var Boolean + * @access private + */ + var $enchanged = true; + + /** + * Does the demcrypt resource need to be (re)initialized? + * + * @see Crypt_Twofish::setKey() + * @see Crypt_Twofish::setIV() + * @var Boolean + * @access private + */ + var $dechanged = true; + + /** + * mcrypt resource for CFB mode + * + * mcrypt's CFB mode, in (and only in) buffered context, + * is broken, so phpseclib implements the CFB mode by it self, + * even when the mcrypt php extension is available. + * + * In order to do the CFB-mode work (fast) phpseclib + * use a separate ECB-mode mcrypt resource. + * + * @link http://phpseclib.sourceforge.net/cfb-demo.phps + * @see Crypt_Base::encrypt() + * @see Crypt_Base::decrypt() + * @see Crypt_Base::_setupMcrypt() + * @var Resource + * @access private + */ + var $ecb; + + /** + * Optimizing value while CFB-encrypting + * + * Only relevant if $continuousBuffer enabled + * and $engine == CRYPT_MODE_MCRYPT + * + * It's faster to re-init $enmcrypt if + * $buffer bytes > $cfb_init_len than + * using the $ecb resource furthermore. + * + * This value depends of the chosen cipher + * and the time it would be needed for it's + * initialization [by mcrypt_generic_init()] + * which, typically, depends on the complexity + * on its internaly Key-expanding algorithm. + * + * @see Crypt_Base::encrypt() + * @var Integer + * @access private + */ + var $cfb_init_len = 600; + + /** + * Does internal cipher state need to be (re)initialized? + * + * @see setKey() + * @see setIV() + * @see disableContinuousBuffer() + * @var Boolean + * @access private + */ + var $changed = true; + + /** + * Padding status + * + * @see Crypt_Base::enablePadding() + * @var Boolean + * @access private + */ + var $padding = true; + + /** + * Is the mode one that is paddable? + * + * @see Crypt_Base::Crypt_Base() + * @var Boolean + * @access private + */ + var $paddable = false; + + /** + * Holds which crypt engine internaly should be use, + * which will be determined automatically on __construct() + * + * Currently available $engines are: + * - CRYPT_MODE_MCRYPT (fast, php-extension: mcrypt, extension_loaded('mcrypt') required) + * - CRYPT_MODE_INTERNAL (slower, pure php-engine, no php-extension required) + * + * In the pipeline... maybe. But currently not available: + * - CRYPT_MODE_OPENSSL (very fast, php-extension: openssl, extension_loaded('openssl') required) + * + * If possible, CRYPT_MODE_MCRYPT will be used for each cipher. + * Otherwise CRYPT_MODE_INTERNAL + * + * @see Crypt_Base::encrypt() + * @see Crypt_Base::decrypt() + * @var Integer + * @access private + */ + var $engine; + + /** + * The mcrypt specific name of the cipher + * + * Only used if $engine == CRYPT_MODE_MCRYPT + * + * @link http://www.php.net/mcrypt_module_open + * @link http://www.php.net/mcrypt_list_algorithms + * @see Crypt_Base::_setupMcrypt() + * @var String + * @access private + */ + var $cipher_name_mcrypt; + + /** + * The default password key_size used by setPassword() + * + * @see Crypt_Base::setPassword() + * @var Integer + * @access private + */ + var $password_key_size = 32; + + /** + * The default salt used by setPassword() + * + * @see Crypt_Base::setPassword() + * @var String + * @access private + */ + var $password_default_salt = 'phpseclib/salt'; + + /** + * The namespace used by the cipher for its constants. + * + * ie: AES.php is using CRYPT_AES_MODE_* for its constants + * so $const_namespace is AES + * + * DES.php is using CRYPT_DES_MODE_* for its constants + * so $const_namespace is DES... and so on + * + * All CRYPT_<$const_namespace>_MODE_* are aliases of + * the generic CRYPT_MODE_* constants, so both could be used + * for each cipher. + * + * Example: + * $aes = new Crypt_AES(CRYPT_AES_MODE_CFB); // $aes will operate in cfb mode + * $aes = new Crypt_AES(CRYPT_MODE_CFB); // identical + * + * @see Crypt_Base::Crypt_Base() + * @var String + * @access private + */ + var $const_namespace; + + /** + * The name of the performance-optimized callback function + * + * Used by encrypt() / decrypt() + * only if $engine == CRYPT_MODE_INTERNAL + * + * @see Crypt_Base::encrypt() + * @see Crypt_Base::decrypt() + * @see Crypt_Base::_setupInlineCrypt() + * @see Crypt_Base::$use_inline_crypt + * @var Callback + * @access private + */ + var $inline_crypt; + + /** + * Holds whether performance-optimized $inline_crypt() can/should be used. + * + * @see Crypt_Base::encrypt() + * @see Crypt_Base::decrypt() + * @see Crypt_Base::inline_crypt + * @var mixed + * @access private + */ + var $use_inline_crypt; + + /** + * Default Constructor. + * + * Determines whether or not the mcrypt extension should be used. + * + * $mode could be: + * + * - CRYPT_MODE_ECB + * + * - CRYPT_MODE_CBC + * + * - CRYPT_MODE_CTR + * + * - CRYPT_MODE_CFB + * + * - CRYPT_MODE_OFB + * + * (or the alias constants of the chosen cipher, for example for AES: CRYPT_AES_MODE_ECB or CRYPT_AES_MODE_CBC ...) + * + * If not explicitly set, CRYPT_MODE_CBC will be used. + * + * @param optional Integer $mode + * @access public + */ + function Crypt_Base($mode = CRYPT_MODE_CBC) + { + $const_crypt_mode = 'CRYPT_' . $this->const_namespace . '_MODE'; + + // Determining the availibility of mcrypt support for the cipher + if (!defined($const_crypt_mode)) { + switch (true) { + case extension_loaded('mcrypt') && in_array($this->cipher_name_mcrypt, mcrypt_list_algorithms()): + define($const_crypt_mode, CRYPT_MODE_MCRYPT); + break; + default: + define($const_crypt_mode, CRYPT_MODE_INTERNAL); + } + } + + // Determining which internal $engine should be used. + // The fastes possible first. + switch (true) { + case empty($this->cipher_name_mcrypt): // The cipher module has no mcrypt-engine support at all so we force CRYPT_MODE_INTERNAL + $this->engine = CRYPT_MODE_INTERNAL; + break; + case constant($const_crypt_mode) == CRYPT_MODE_MCRYPT: + $this->engine = CRYPT_MODE_MCRYPT; + break; + default: + $this->engine = CRYPT_MODE_INTERNAL; + } + + // $mode dependent settings + switch ($mode) { + case CRYPT_MODE_ECB: + $this->paddable = true; + $this->mode = $mode; + break; + case CRYPT_MODE_CTR: + case CRYPT_MODE_CFB: + case CRYPT_MODE_OFB: + case CRYPT_MODE_STREAM: + $this->mode = $mode; + break; + case CRYPT_MODE_CBC: + default: + $this->paddable = true; + $this->mode = CRYPT_MODE_CBC; + } + + // Determining whether inline crypting can be used by the cipher + if ($this->use_inline_crypt !== false && function_exists('create_function')) { + $this->use_inline_crypt = true; + } + } + + /** + * Sets the initialization vector. (optional) + * + * SetIV is not required when CRYPT_MODE_ECB (or ie for AES: CRYPT_AES_MODE_ECB) is being used. If not explicitly set, it'll be assumed + * to be all zero's. + * + * Note: Could, but not must, extend by the child Crypt_* class + * + * @access public + * @param String $iv + */ + function setIV($iv) + { + if ($this->mode == CRYPT_MODE_ECB) { + return; + } + + $this->iv = $iv; + $this->changed = true; + } + + /** + * Sets the key. + * + * The min/max length(s) of the key depends on the cipher which is used. + * If the key not fits the length(s) of the cipher it will paded with null bytes + * up to the closest valid key length. If the key is more than max length, + * we trim the excess bits. + * + * If the key is not explicitly set, it'll be assumed to be all null bytes. + * + * Note: Could, but not must, extend by the child Crypt_* class + * + * @access public + * @param String $key + */ + function setKey($key) + { + $this->key = $key; + $this->changed = true; + } + + /** + * Sets the password. + * + * Depending on what $method is set to, setPassword()'s (optional) parameters are as follows: + * {@link http://en.wikipedia.org/wiki/PBKDF2 pbkdf2} or pbkdf1: + * $hash, $salt, $count, $dkLen + * + * Where $hash (default = sha1) currently supports the following hashes: see: Crypt/Hash.php + * + * Note: Could, but not must, extend by the child Crypt_* class + * + * @see Crypt/Hash.php + * @param String $password + * @param optional String $method + * @return Boolean + * @access public + */ + function setPassword($password, $method = 'pbkdf2') + { + $key = ''; + + switch ($method) { + default: // 'pbkdf2' or 'pbkdf1' + $func_args = func_get_args(); + + // Hash function + $hash = isset($func_args[2]) ? $func_args[2] : 'sha1'; + + // WPA and WPA2 use the SSID as the salt + $salt = isset($func_args[3]) ? $func_args[3] : $this->password_default_salt; + + // RFC2898#section-4.2 uses 1,000 iterations by default + // WPA and WPA2 use 4,096. + $count = isset($func_args[4]) ? $func_args[4] : 1000; + + // Keylength + if (isset($func_args[5])) { + $dkLen = $func_args[5]; + } else { + $dkLen = $method == 'pbkdf1' ? 2 * $this->password_key_size : $this->password_key_size; + } + + switch (true) { + case $method == 'pbkdf1': + if (!class_exists('Crypt_Hash')) { + include_once 'Crypt/Hash.php'; + } + $hashObj = new Crypt_Hash(); + $hashObj->setHash($hash); + if ($dkLen > $hashObj->getLength()) { + user_error('Derived key too long'); + return false; + } + $t = $password . $salt; + for ($i = 0; $i < $count; ++$i) { + $t = $hashObj->hash($t); + } + $key = substr($t, 0, $dkLen); + + $this->setKey(substr($key, 0, $dkLen >> 1)); + $this->setIV(substr($key, $dkLen >> 1)); + + return true; + // Determining if php[>=5.5.0]'s hash_pbkdf2() function avail- and useable + case !function_exists('hash_pbkdf2'): + case !function_exists('hash_algos'): + case !in_array($hash, hash_algos()): + if (!class_exists('Crypt_Hash')) { + include_once 'Crypt/Hash.php'; + } + $i = 1; + while (strlen($key) < $dkLen) { + $hmac = new Crypt_Hash(); + $hmac->setHash($hash); + $hmac->setKey($password); + $f = $u = $hmac->hash($salt . pack('N', $i++)); + for ($j = 2; $j <= $count; ++$j) { + $u = $hmac->hash($u); + $f^= $u; + } + $key.= $f; + } + $key = substr($key, 0, $dkLen); + break; + default: + $key = hash_pbkdf2($hash, $password, $salt, $count, $dkLen, true); + } + } + + $this->setKey($key); + + return true; + } + + /** + * Encrypts a message. + * + * $plaintext will be padded with additional bytes such that it's length is a multiple of the block size. Other cipher + * implementations may or may not pad in the same manner. Other common approaches to padding and the reasons why it's + * necessary are discussed in the following + * URL: + * + * {@link http://www.di-mgt.com.au/cryptopad.html http://www.di-mgt.com.au/cryptopad.html} + * + * An alternative to padding is to, separately, send the length of the file. This is what SSH, in fact, does. + * strlen($plaintext) will still need to be a multiple of the block size, however, arbitrary values can be added to make it that + * length. + * + * Note: Could, but not must, extend by the child Crypt_* class + * + * @see Crypt_Base::decrypt() + * @access public + * @param String $plaintext + * @return String $cipertext + */ + function encrypt($plaintext) + { + if ($this->engine == CRYPT_MODE_MCRYPT) { + if ($this->changed) { + $this->_setupMcrypt(); + $this->changed = false; + } + if ($this->enchanged) { + mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV); + $this->enchanged = false; + } + + // re: {@link http://phpseclib.sourceforge.net/cfb-demo.phps} + // using mcrypt's default handing of CFB the above would output two different things. using phpseclib's + // rewritten CFB implementation the above outputs the same thing twice. + if ($this->mode == CRYPT_MODE_CFB && $this->continuousBuffer) { + $block_size = $this->block_size; + $iv = &$this->encryptIV; + $pos = &$this->enbuffer['pos']; + $len = strlen($plaintext); + $ciphertext = ''; + $i = 0; + if ($pos) { + $orig_pos = $pos; + $max = $block_size - $pos; + if ($len >= $max) { + $i = $max; + $len-= $max; + $pos = 0; + } else { + $i = $len; + $pos+= $len; + $len = 0; + } + $ciphertext = substr($iv, $orig_pos) ^ $plaintext; + $iv = substr_replace($iv, $ciphertext, $orig_pos, $i); + $this->enbuffer['enmcrypt_init'] = true; + } + if ($len >= $block_size) { + if ($this->enbuffer['enmcrypt_init'] === false || $len > $this->cfb_init_len) { + if ($this->enbuffer['enmcrypt_init'] === true) { + mcrypt_generic_init($this->enmcrypt, $this->key, $iv); + $this->enbuffer['enmcrypt_init'] = false; + } + $ciphertext.= mcrypt_generic($this->enmcrypt, substr($plaintext, $i, $len - $len % $block_size)); + $iv = substr($ciphertext, -$block_size); + $len%= $block_size; + } else { + while ($len >= $block_size) { + $iv = mcrypt_generic($this->ecb, $iv) ^ substr($plaintext, $i, $block_size); + $ciphertext.= $iv; + $len-= $block_size; + $i+= $block_size; + } + } + } + + if ($len) { + $iv = mcrypt_generic($this->ecb, $iv); + $block = $iv ^ substr($plaintext, -$len); + $iv = substr_replace($iv, $block, 0, $len); + $ciphertext.= $block; + $pos = $len; + } + + return $ciphertext; + } + + if ($this->paddable) { + $plaintext = $this->_pad($plaintext); + } + + $ciphertext = mcrypt_generic($this->enmcrypt, $plaintext); + + if (!$this->continuousBuffer) { + mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV); + } + + return $ciphertext; + } + + if ($this->changed) { + $this->_setup(); + $this->changed = false; + } + if ($this->use_inline_crypt) { + $inline = $this->inline_crypt; + return $inline('encrypt', $this, $plaintext); + } + if ($this->paddable) { + $plaintext = $this->_pad($plaintext); + } + + $buffer = &$this->enbuffer; + $block_size = $this->block_size; + $ciphertext = ''; + switch ($this->mode) { + case CRYPT_MODE_ECB: + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $ciphertext.= $this->_encryptBlock(substr($plaintext, $i, $block_size)); + } + break; + case CRYPT_MODE_CBC: + $xor = $this->encryptIV; + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $block = substr($plaintext, $i, $block_size); + $block = $this->_encryptBlock($block ^ $xor); + $xor = $block; + $ciphertext.= $block; + } + if ($this->continuousBuffer) { + $this->encryptIV = $xor; + } + break; + case CRYPT_MODE_CTR: + $xor = $this->encryptIV; + if (strlen($buffer['encrypted'])) { + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $block = substr($plaintext, $i, $block_size); + if (strlen($block) > strlen($buffer['encrypted'])) { + $buffer['encrypted'].= $this->_encryptBlock($this->_generateXor($xor, $block_size)); + } + $key = $this->_stringShift($buffer['encrypted'], $block_size); + $ciphertext.= $block ^ $key; + } + } else { + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $block = substr($plaintext, $i, $block_size); + $key = $this->_encryptBlock($this->_generateXor($xor, $block_size)); + $ciphertext.= $block ^ $key; + } + } + if ($this->continuousBuffer) { + $this->encryptIV = $xor; + if ($start = strlen($plaintext) % $block_size) { + $buffer['encrypted'] = substr($key, $start) . $buffer['encrypted']; + } + } + break; + case CRYPT_MODE_CFB: + // cfb loosely routines inspired by openssl's: + // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1} + if ($this->continuousBuffer) { + $iv = &$this->encryptIV; + $pos = &$buffer['pos']; + } else { + $iv = $this->encryptIV; + $pos = 0; + } + $len = strlen($plaintext); + $i = 0; + if ($pos) { + $orig_pos = $pos; + $max = $block_size - $pos; + if ($len >= $max) { + $i = $max; + $len-= $max; + $pos = 0; + } else { + $i = $len; + $pos+= $len; + $len = 0; + } + // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize + $ciphertext = substr($iv, $orig_pos) ^ $plaintext; + $iv = substr_replace($iv, $ciphertext, $orig_pos, $i); + } + while ($len >= $block_size) { + $iv = $this->_encryptBlock($iv) ^ substr($plaintext, $i, $block_size); + $ciphertext.= $iv; + $len-= $block_size; + $i+= $block_size; + } + if ($len) { + $iv = $this->_encryptBlock($iv); + $block = $iv ^ substr($plaintext, $i); + $iv = substr_replace($iv, $block, 0, $len); + $ciphertext.= $block; + $pos = $len; + } + break; + case CRYPT_MODE_OFB: + $xor = $this->encryptIV; + if (strlen($buffer['xor'])) { + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $block = substr($plaintext, $i, $block_size); + if (strlen($block) > strlen($buffer['xor'])) { + $xor = $this->_encryptBlock($xor); + $buffer['xor'].= $xor; + } + $key = $this->_stringShift($buffer['xor'], $block_size); + $ciphertext.= $block ^ $key; + } + } else { + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $xor = $this->_encryptBlock($xor); + $ciphertext.= substr($plaintext, $i, $block_size) ^ $xor; + } + $key = $xor; + } + if ($this->continuousBuffer) { + $this->encryptIV = $xor; + if ($start = strlen($plaintext) % $block_size) { + $buffer['xor'] = substr($key, $start) . $buffer['xor']; + } + } + break; + case CRYPT_MODE_STREAM: + $ciphertext = $this->_encryptBlock($plaintext); + break; + } + + return $ciphertext; + } + + /** + * Decrypts a message. + * + * If strlen($ciphertext) is not a multiple of the block size, null bytes will be added to the end of the string until + * it is. + * + * Note: Could, but not must, extend by the child Crypt_* class + * + * @see Crypt_Base::encrypt() + * @access public + * @param String $ciphertext + * @return String $plaintext + */ + function decrypt($ciphertext) + { + if ($this->engine == CRYPT_MODE_MCRYPT) { + $block_size = $this->block_size; + if ($this->changed) { + $this->_setupMcrypt(); + $this->changed = false; + } + if ($this->dechanged) { + mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV); + $this->dechanged = false; + } + + if ($this->mode == CRYPT_MODE_CFB && $this->continuousBuffer) { + $iv = &$this->decryptIV; + $pos = &$this->debuffer['pos']; + $len = strlen($ciphertext); + $plaintext = ''; + $i = 0; + if ($pos) { + $orig_pos = $pos; + $max = $block_size - $pos; + if ($len >= $max) { + $i = $max; + $len-= $max; + $pos = 0; + } else { + $i = $len; + $pos+= $len; + $len = 0; + } + // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize + $plaintext = substr($iv, $orig_pos) ^ $ciphertext; + $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i); + } + if ($len >= $block_size) { + $cb = substr($ciphertext, $i, $len - $len % $block_size); + $plaintext.= mcrypt_generic($this->ecb, $iv . $cb) ^ $cb; + $iv = substr($cb, -$block_size); + $len%= $block_size; + } + if ($len) { + $iv = mcrypt_generic($this->ecb, $iv); + $plaintext.= $iv ^ substr($ciphertext, -$len); + $iv = substr_replace($iv, substr($ciphertext, -$len), 0, $len); + $pos = $len; + } + + return $plaintext; + } + + if ($this->paddable) { + // we pad with chr(0) since that's what mcrypt_generic does. to quote from {@link http://www.php.net/function.mcrypt-generic}: + // "The data is padded with "\0" to make sure the length of the data is n * blocksize." + $ciphertext = str_pad($ciphertext, strlen($ciphertext) + ($block_size - strlen($ciphertext) % $block_size) % $block_size, chr(0)); + } + + $plaintext = mdecrypt_generic($this->demcrypt, $ciphertext); + + if (!$this->continuousBuffer) { + mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV); + } + + return $this->paddable ? $this->_unpad($plaintext) : $plaintext; + } + + if ($this->changed) { + $this->_setup(); + $this->changed = false; + } + if ($this->use_inline_crypt) { + $inline = $this->inline_crypt; + return $inline('decrypt', $this, $ciphertext); + } + + $block_size = $this->block_size; + if ($this->paddable) { + // we pad with chr(0) since that's what mcrypt_generic does [...] + $ciphertext = str_pad($ciphertext, strlen($ciphertext) + ($block_size - strlen($ciphertext) % $block_size) % $block_size, chr(0)); + } + + $buffer = &$this->debuffer; + $plaintext = ''; + switch ($this->mode) { + case CRYPT_MODE_ECB: + for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { + $plaintext.= $this->_decryptBlock(substr($ciphertext, $i, $block_size)); + } + break; + case CRYPT_MODE_CBC: + $xor = $this->decryptIV; + for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { + $block = substr($ciphertext, $i, $block_size); + $plaintext.= $this->_decryptBlock($block) ^ $xor; + $xor = $block; + } + if ($this->continuousBuffer) { + $this->decryptIV = $xor; + } + break; + case CRYPT_MODE_CTR: + $xor = $this->decryptIV; + if (strlen($buffer['ciphertext'])) { + for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { + $block = substr($ciphertext, $i, $block_size); + if (strlen($block) > strlen($buffer['ciphertext'])) { + $buffer['ciphertext'].= $this->_encryptBlock($this->_generateXor($xor, $block_size)); + } + $key = $this->_stringShift($buffer['ciphertext'], $block_size); + $plaintext.= $block ^ $key; + } + } else { + for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { + $block = substr($ciphertext, $i, $block_size); + $key = $this->_encryptBlock($this->_generateXor($xor, $block_size)); + $plaintext.= $block ^ $key; + } + } + if ($this->continuousBuffer) { + $this->decryptIV = $xor; + if ($start = strlen($ciphertext) % $block_size) { + $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext']; + } + } + break; + case CRYPT_MODE_CFB: + if ($this->continuousBuffer) { + $iv = &$this->decryptIV; + $pos = &$buffer['pos']; + } else { + $iv = $this->decryptIV; + $pos = 0; + } + $len = strlen($ciphertext); + $i = 0; + if ($pos) { + $orig_pos = $pos; + $max = $block_size - $pos; + if ($len >= $max) { + $i = $max; + $len-= $max; + $pos = 0; + } else { + $i = $len; + $pos+= $len; + $len = 0; + } + // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize + $plaintext = substr($iv, $orig_pos) ^ $ciphertext; + $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i); + } + while ($len >= $block_size) { + $iv = $this->_encryptBlock($iv); + $cb = substr($ciphertext, $i, $block_size); + $plaintext.= $iv ^ $cb; + $iv = $cb; + $len-= $block_size; + $i+= $block_size; + } + if ($len) { + $iv = $this->_encryptBlock($iv); + $plaintext.= $iv ^ substr($ciphertext, $i); + $iv = substr_replace($iv, substr($ciphertext, $i), 0, $len); + $pos = $len; + } + break; + case CRYPT_MODE_OFB: + $xor = $this->decryptIV; + if (strlen($buffer['xor'])) { + for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { + $block = substr($ciphertext, $i, $block_size); + if (strlen($block) > strlen($buffer['xor'])) { + $xor = $this->_encryptBlock($xor); + $buffer['xor'].= $xor; + } + $key = $this->_stringShift($buffer['xor'], $block_size); + $plaintext.= $block ^ $key; + } + } else { + for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { + $xor = $this->_encryptBlock($xor); + $plaintext.= substr($ciphertext, $i, $block_size) ^ $xor; + } + $key = $xor; + } + if ($this->continuousBuffer) { + $this->decryptIV = $xor; + if ($start = strlen($ciphertext) % $block_size) { + $buffer['xor'] = substr($key, $start) . $buffer['xor']; + } + } + break; + case CRYPT_MODE_STREAM: + $plaintext = $this->_decryptBlock($ciphertext); + break; + } + return $this->paddable ? $this->_unpad($plaintext) : $plaintext; + } + + /** + * Pad "packets". + * + * Block ciphers working by encrypting between their specified [$this->]block_size at a time + * If you ever need to encrypt or decrypt something that isn't of the proper length, it becomes necessary to + * pad the input so that it is of the proper length. + * + * Padding is enabled by default. Sometimes, however, it is undesirable to pad strings. Such is the case in SSH, + * where "packets" are padded with random bytes before being encrypted. Unpad these packets and you risk stripping + * away characters that shouldn't be stripped away. (SSH knows how many bytes are added because the length is + * transmitted separately) + * + * @see Crypt_Base::disablePadding() + * @access public + */ + function enablePadding() + { + $this->padding = true; + } + + /** + * Do not pad packets. + * + * @see Crypt_Base::enablePadding() + * @access public + */ + function disablePadding() + { + $this->padding = false; + } + + /** + * Treat consecutive "packets" as if they are a continuous buffer. + * + * Say you have a 32-byte plaintext $plaintext. Using the default behavior, the two following code snippets + * will yield different outputs: + * + * + * echo $rijndael->encrypt(substr($plaintext, 0, 16)); + * echo $rijndael->encrypt(substr($plaintext, 16, 16)); + * + * + * echo $rijndael->encrypt($plaintext); + * + * + * The solution is to enable the continuous buffer. Although this will resolve the above discrepancy, it creates + * another, as demonstrated with the following: + * + * + * $rijndael->encrypt(substr($plaintext, 0, 16)); + * echo $rijndael->decrypt($rijndael->encrypt(substr($plaintext, 16, 16))); + * + * + * echo $rijndael->decrypt($rijndael->encrypt(substr($plaintext, 16, 16))); + * + * + * With the continuous buffer disabled, these would yield the same output. With it enabled, they yield different + * outputs. The reason is due to the fact that the initialization vector's change after every encryption / + * decryption round when the continuous buffer is enabled. When it's disabled, they remain constant. + * + * Put another way, when the continuous buffer is enabled, the state of the Crypt_*() object changes after each + * encryption / decryption round, whereas otherwise, it'd remain constant. For this reason, it's recommended that + * continuous buffers not be used. They do offer better security and are, in fact, sometimes required (SSH uses them), + * however, they are also less intuitive and more likely to cause you problems. + * + * Note: Could, but not must, extend by the child Crypt_* class + * + * @see Crypt_Base::disableContinuousBuffer() + * @access public + */ + function enableContinuousBuffer() + { + if ($this->mode == CRYPT_MODE_ECB) { + return; + } + + $this->continuousBuffer = true; + } + + /** + * Treat consecutive packets as if they are a discontinuous buffer. + * + * The default behavior. + * + * Note: Could, but not must, extend by the child Crypt_* class + * + * @see Crypt_Base::enableContinuousBuffer() + * @access public + */ + function disableContinuousBuffer() + { + if ($this->mode == CRYPT_MODE_ECB) { + return; + } + if (!$this->continuousBuffer) { + return; + } + + $this->continuousBuffer = false; + $this->changed = true; + } + + /** + * Encrypts a block + * + * Note: Must extend by the child Crypt_* class + * + * @access private + * @param String $in + * @return String + */ + function _encryptBlock($in) + { + user_error((version_compare(PHP_VERSION, '5.0.0', '>=') ? __METHOD__ : __FUNCTION__) . '() must extend by class ' . get_class($this), E_USER_ERROR); + } + + /** + * Decrypts a block + * + * Note: Must extend by the child Crypt_* class + * + * @access private + * @param String $in + * @return String + */ + function _decryptBlock($in) + { + user_error((version_compare(PHP_VERSION, '5.0.0', '>=') ? __METHOD__ : __FUNCTION__) . '() must extend by class ' . get_class($this), E_USER_ERROR); + } + + /** + * Setup the key (expansion) + * + * Only used if $engine == CRYPT_MODE_INTERNAL + * + * Note: Must extend by the child Crypt_* class + * + * @see Crypt_Base::_setup() + * @access private + */ + function _setupKey() + { + user_error((version_compare(PHP_VERSION, '5.0.0', '>=') ? __METHOD__ : __FUNCTION__) . '() must extend by class ' . get_class($this), E_USER_ERROR); + } + + /** + * Setup the CRYPT_MODE_INTERNAL $engine + * + * (re)init, if necessary, the internal cipher $engine and flush all $buffers + * Used (only) if $engine == CRYPT_MODE_INTERNAL + * + * _setup() will be called each time if $changed === true + * typically this happens when using one or more of following public methods: + * + * - setKey() + * + * - setIV() + * + * - disableContinuousBuffer() + * + * - First run of encrypt() / decrypt() with no init-settings + * + * Internally: _setup() is called always before(!) en/decryption. + * + * Note: Could, but not must, extend by the child Crypt_* class + * + * @see setKey() + * @see setIV() + * @see disableContinuousBuffer() + * @access private + */ + function _setup() + { + $this->_clearBuffers(); + $this->_setupKey(); + + if ($this->use_inline_crypt) { + $this->_setupInlineCrypt(); + } + } + + /** + * Setup the CRYPT_MODE_MCRYPT $engine + * + * (re)init, if necessary, the (ext)mcrypt resources and flush all $buffers + * Used (only) if $engine = CRYPT_MODE_MCRYPT + * + * _setupMcrypt() will be called each time if $changed === true + * typically this happens when using one or more of following public methods: + * + * - setKey() + * + * - setIV() + * + * - disableContinuousBuffer() + * + * - First run of encrypt() / decrypt() + * + * + * Note: Could, but not must, extend by the child Crypt_* class + * + * @see setKey() + * @see setIV() + * @see disableContinuousBuffer() + * @access private + */ + function _setupMcrypt() + { + $this->_clearBuffers(); + $this->enchanged = $this->dechanged = true; + + if (!isset($this->enmcrypt)) { + static $mcrypt_modes = array( + CRYPT_MODE_CTR => 'ctr', + CRYPT_MODE_ECB => MCRYPT_MODE_ECB, + CRYPT_MODE_CBC => MCRYPT_MODE_CBC, + CRYPT_MODE_CFB => 'ncfb', + CRYPT_MODE_OFB => MCRYPT_MODE_NOFB, + CRYPT_MODE_STREAM => MCRYPT_MODE_STREAM, + ); + + $this->demcrypt = mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], ''); + $this->enmcrypt = mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], ''); + + // we need the $ecb mcrypt resource (only) in MODE_CFB with enableContinuousBuffer() + // to workaround mcrypt's broken ncfb implementation in buffered mode + // see: {@link http://phpseclib.sourceforge.net/cfb-demo.phps} + if ($this->mode == CRYPT_MODE_CFB) { + $this->ecb = mcrypt_module_open($this->cipher_name_mcrypt, '', MCRYPT_MODE_ECB, ''); + } + + } // else should mcrypt_generic_deinit be called? + + if ($this->mode == CRYPT_MODE_CFB) { + mcrypt_generic_init($this->ecb, $this->key, str_repeat("\0", $this->block_size)); + } + } + + /** + * Pads a string + * + * Pads a string using the RSA PKCS padding standards so that its length is a multiple of the blocksize. + * $this->block_size - (strlen($text) % $this->block_size) bytes are added, each of which is equal to + * chr($this->block_size - (strlen($text) % $this->block_size) + * + * If padding is disabled and $text is not a multiple of the blocksize, the string will be padded regardless + * and padding will, hence forth, be enabled. + * + * @see Crypt_Base::_unpad() + * @param String $text + * @access private + * @return String + */ + function _pad($text) + { + $length = strlen($text); + + if (!$this->padding) { + if ($length % $this->block_size == 0) { + return $text; + } else { + user_error("The plaintext's length ($length) is not a multiple of the block size ({$this->block_size})"); + $this->padding = true; + } + } + + $pad = $this->block_size - ($length % $this->block_size); + + return str_pad($text, $length + $pad, chr($pad)); + } + + /** + * Unpads a string. + * + * If padding is enabled and the reported padding length is invalid the encryption key will be assumed to be wrong + * and false will be returned. + * + * @see Crypt_Base::_pad() + * @param String $text + * @access private + * @return String + */ + function _unpad($text) + { + if (!$this->padding) { + return $text; + } + + $length = ord($text[strlen($text) - 1]); + + if (!$length || $length > $this->block_size) { + return false; + } + + return substr($text, 0, -$length); + } + + /** + * Clears internal buffers + * + * Clearing/resetting the internal buffers is done everytime + * after disableContinuousBuffer() or on cipher $engine (re)init + * ie after setKey() or setIV() + * + * Note: Could, but not must, extend by the child Crypt_* class + * + * @access public + */ + function _clearBuffers() + { + $this->enbuffer = array('encrypted' => '', 'xor' => '', 'pos' => 0, 'enmcrypt_init' => true); + $this->debuffer = array('ciphertext' => '', 'xor' => '', 'pos' => 0, 'demcrypt_init' => true); + + // mcrypt's handling of invalid's $iv: + // $this->encryptIV = $this->decryptIV = strlen($this->iv) == $this->block_size ? $this->iv : str_repeat("\0", $this->block_size); + $this->encryptIV = $this->decryptIV = str_pad(substr($this->iv, 0, $this->block_size), $this->block_size, "\0"); + } + + /** + * String Shift + * + * Inspired by array_shift + * + * @param String $string + * @param optional Integer $index + * @access private + * @return String + */ + function _stringShift(&$string, $index = 1) + { + $substr = substr($string, 0, $index); + $string = substr($string, $index); + return $substr; + } + + /** + * Generate CTR XOR encryption key + * + * Encrypt the output of this and XOR it against the ciphertext / plaintext to get the + * plaintext / ciphertext in CTR mode. + * + * @see Crypt_Base::decrypt() + * @see Crypt_Base::encrypt() + * @param String $iv + * @param Integer $length + * @access private + * @return String $xor + */ + function _generateXor(&$iv, $length) + { + $xor = ''; + $block_size = $this->block_size; + $num_blocks = floor(($length + ($block_size - 1)) / $block_size); + for ($i = 0; $i < $num_blocks; $i++) { + $xor.= $iv; + for ($j = 4; $j <= $block_size; $j+= 4) { + $temp = substr($iv, -$j, 4); + switch ($temp) { + case "\xFF\xFF\xFF\xFF": + $iv = substr_replace($iv, "\x00\x00\x00\x00", -$j, 4); + break; + case "\x7F\xFF\xFF\xFF": + $iv = substr_replace($iv, "\x80\x00\x00\x00", -$j, 4); + break 2; + default: + extract(unpack('Ncount', $temp)); + $iv = substr_replace($iv, pack('N', $count + 1), -$j, 4); + break 2; + } + } + } + + return $xor; + } + + /** + * Setup the performance-optimized function for de/encrypt() + * + * Stores the created (or existing) callback function-name + * in $this->inline_crypt + * + * Internally for phpseclib developers: + * + * _setupInlineCrypt() would be called only if: + * + * - $engine == CRYPT_MODE_INTERNAL and + * + * - $use_inline_crypt === true + * + * - each time on _setup(), after(!) _setupKey() + * + * + * This ensures that _setupInlineCrypt() has always a + * full ready2go initializated internal cipher $engine state + * where, for example, the keys allready expanded, + * keys/block_size calculated and such. + * + * It is, each time if called, the responsibility of _setupInlineCrypt(): + * + * - to set $this->inline_crypt to a valid and fully working callback function + * as a (faster) replacement for encrypt() / decrypt() + * + * - NOT to create unlimited callback functions (for memory reasons!) + * no matter how often _setupInlineCrypt() would be called. At some + * point of amount they must be generic re-useable. + * + * - the code of _setupInlineCrypt() it self, + * and the generated callback code, + * must be, in following order: + * - 100% safe + * - 100% compatible to encrypt()/decrypt() + * - using only php5+ features/lang-constructs/php-extensions if + * compatibility (down to php4) or fallback is provided + * - readable/maintainable/understandable/commented and... not-cryptic-styled-code :-) + * - >= 10% faster than encrypt()/decrypt() [which is, by the way, + * the reason for the existence of _setupInlineCrypt() :-)] + * - memory-nice + * - short (as good as possible) + * + * Note: - _setupInlineCrypt() is using _createInlineCryptFunction() to create the full callback function code. + * - In case of using inline crypting, _setupInlineCrypt() must extend by the child Crypt_* class. + * - The following variable names are reserved: + * - $_* (all variable names prefixed with an underscore) + * - $self (object reference to it self. Do not use $this, but $self instead) + * - $in (the content of $in has to en/decrypt by the generated code) + * - The callback function should not use the 'return' statement, but en/decrypt'ing the content of $in only + * + * + * @see Crypt_Base::_setup() + * @see Crypt_Base::_createInlineCryptFunction() + * @see Crypt_Base::encrypt() + * @see Crypt_Base::decrypt() + * @access private + */ + function _setupInlineCrypt() + { + // If a Crypt_* class providing inline crypting it must extend _setupInlineCrypt() + + // If, for any reason, an extending Crypt_Base() Crypt_* class + // not using inline crypting then it must be ensured that: $this->use_inline_crypt = false + // ie in the class var declaration of $use_inline_crypt in general for the Crypt_* class, + // in the constructor at object instance-time + // or, if it's runtime-specific, at runtime + + $this->use_inline_crypt = false; + } + + /** + * Creates the performance-optimized function for en/decrypt() + * + * Internally for phpseclib developers: + * + * _createInlineCryptFunction(): + * + * - merge the $cipher_code [setup'ed by _setupInlineCrypt()] + * with the current [$this->]mode of operation code + * + * - create the $inline function, which called by encrypt() / decrypt() + * as its replacement to speed up the en/decryption operations. + * + * - return the name of the created $inline callback function + * + * - used to speed up en/decryption + * + * + * + * The main reason why can speed up things [up to 50%] this way are: + * + * - using variables more effective then regular. + * (ie no use of expensive arrays but integers $k_0, $k_1 ... + * or even, for example, the pure $key[] values hardcoded) + * + * - avoiding 1000's of function calls of ie _encryptBlock() + * but inlining the crypt operations. + * in the mode of operation for() loop. + * + * - full loop unroll the (sometimes key-dependent) rounds + * avoiding this way ++$i counters and runtime-if's etc... + * + * The basic code architectur of the generated $inline en/decrypt() + * lambda function, in pseudo php, is: + * + * + * +----------------------------------------------------------------------------------------------+ + * | callback $inline = create_function: | + * | lambda_function_0001_crypt_ECB($action, $text) | + * | { | + * | INSERT PHP CODE OF: | + * | $cipher_code['init_crypt']; // general init code. | + * | // ie: $sbox'es declarations used for | + * | // encrypt and decrypt'ing. | + * | | + * | switch ($action) { | + * | case 'encrypt': | + * | INSERT PHP CODE OF: | + * | $cipher_code['init_encrypt']; // encrypt sepcific init code. | + * | ie: specified $key or $box | + * | declarations for encrypt'ing. | + * | | + * | foreach ($ciphertext) { | + * | $in = $block_size of $ciphertext; | + * | | + * | INSERT PHP CODE OF: | + * | $cipher_code['encrypt_block']; // encrypt's (string) $in, which is always: | + * | // strlen($in) == $this->block_size | + * | // here comes the cipher algorithm in action | + * | // for encryption. | + * | // $cipher_code['encrypt_block'] has to | + * | // encrypt the content of the $in variable | + * | | + * | $plaintext .= $in; | + * | } | + * | return $plaintext; | + * | | + * | case 'decrypt': | + * | INSERT PHP CODE OF: | + * | $cipher_code['init_decrypt']; // decrypt sepcific init code | + * | ie: specified $key or $box | + * | declarations for decrypt'ing. | + * | foreach ($plaintext) { | + * | $in = $block_size of $plaintext; | + * | | + * | INSERT PHP CODE OF: | + * | $cipher_code['decrypt_block']; // decrypt's (string) $in, which is always | + * | // strlen($in) == $this->block_size | + * | // here comes the cipher algorithm in action | + * | // for decryption. | + * | // $cipher_code['decrypt_block'] has to | + * | // decrypt the content of the $in variable | + * | $ciphertext .= $in; | + * | } | + * | return $ciphertext; | + * | } | + * | } | + * +----------------------------------------------------------------------------------------------+ + * + * + * See also the Crypt_*::_setupInlineCrypt()'s for + * productive inline $cipher_code's how they works. + * + * Structure of: + * + * $cipher_code = array( + * 'init_crypt' => (string) '', // optional + * 'init_encrypt' => (string) '', // optional + * 'init_decrypt' => (string) '', // optional + * 'encrypt_block' => (string) '', // required + * 'decrypt_block' => (string) '' // required + * ); + * + * + * @see Crypt_Base::_setupInlineCrypt() + * @see Crypt_Base::encrypt() + * @see Crypt_Base::decrypt() + * @param Array $cipher_code + * @access private + * @return String (the name of the created callback function) + */ + function _createInlineCryptFunction($cipher_code) + { + $block_size = $this->block_size; + + // optional + $init_crypt = isset($cipher_code['init_crypt']) ? $cipher_code['init_crypt'] : ''; + $init_encrypt = isset($cipher_code['init_encrypt']) ? $cipher_code['init_encrypt'] : ''; + $init_decrypt = isset($cipher_code['init_decrypt']) ? $cipher_code['init_decrypt'] : ''; + // required + $encrypt_block = $cipher_code['encrypt_block']; + $decrypt_block = $cipher_code['decrypt_block']; + + // Generating mode of operation inline code, + // merged with the $cipher_code algorithm + // for encrypt- and decryption. + switch ($this->mode) { + case CRYPT_MODE_ECB: + $encrypt = $init_encrypt . ' + $_ciphertext = ""; + $_text = $self->_pad($_text); + $_plaintext_len = strlen($_text); + + for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { + $in = substr($_text, $_i, '.$block_size.'); + '.$encrypt_block.' + $_ciphertext.= $in; + } + + return $_ciphertext; + '; + + $decrypt = $init_decrypt . ' + $_plaintext = ""; + $_text = str_pad($_text, strlen($_text) + ('.$block_size.' - strlen($_text) % '.$block_size.') % '.$block_size.', chr(0)); + $_ciphertext_len = strlen($_text); + + for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { + $in = substr($_text, $_i, '.$block_size.'); + '.$decrypt_block.' + $_plaintext.= $in; + } + + return $self->_unpad($_plaintext); + '; + break; + case CRYPT_MODE_CTR: + $encrypt = $init_encrypt . ' + $_ciphertext = ""; + $_plaintext_len = strlen($_text); + $_xor = $self->encryptIV; + $_buffer = &$self->enbuffer; + + if (strlen($_buffer["encrypted"])) { + for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { + $_block = substr($_text, $_i, '.$block_size.'); + if (strlen($_block) > strlen($_buffer["encrypted"])) { + $in = $self->_generateXor($_xor, '.$block_size.'); + '.$encrypt_block.' + $_buffer["encrypted"].= $in; + } + $_key = $self->_stringShift($_buffer["encrypted"], '.$block_size.'); + $_ciphertext.= $_block ^ $_key; + } + } else { + for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { + $_block = substr($_text, $_i, '.$block_size.'); + $in = $self->_generateXor($_xor, '.$block_size.'); + '.$encrypt_block.' + $_key = $in; + $_ciphertext.= $_block ^ $_key; + } + } + if ($self->continuousBuffer) { + $self->encryptIV = $_xor; + if ($_start = $_plaintext_len % '.$block_size.') { + $_buffer["encrypted"] = substr($_key, $_start) . $_buffer["encrypted"]; + } + } + + return $_ciphertext; + '; + + $decrypt = $init_encrypt . ' + $_plaintext = ""; + $_ciphertext_len = strlen($_text); + $_xor = $self->decryptIV; + $_buffer = &$self->debuffer; + + if (strlen($_buffer["ciphertext"])) { + for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { + $_block = substr($_text, $_i, '.$block_size.'); + if (strlen($_block) > strlen($_buffer["ciphertext"])) { + $in = $self->_generateXor($_xor, '.$block_size.'); + '.$encrypt_block.' + $_buffer["ciphertext"].= $in; + } + $_key = $self->_stringShift($_buffer["ciphertext"], '.$block_size.'); + $_plaintext.= $_block ^ $_key; + } + } else { + for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { + $_block = substr($_text, $_i, '.$block_size.'); + $in = $self->_generateXor($_xor, '.$block_size.'); + '.$encrypt_block.' + $_key = $in; + $_plaintext.= $_block ^ $_key; + } + } + if ($self->continuousBuffer) { + $self->decryptIV = $_xor; + if ($_start = $_ciphertext_len % '.$block_size.') { + $_buffer["ciphertext"] = substr($_key, $_start) . $_buffer["ciphertext"]; + } + } + + return $_plaintext; + '; + break; + case CRYPT_MODE_CFB: + $encrypt = $init_encrypt . ' + $_ciphertext = ""; + $_buffer = &$self->enbuffer; + + if ($self->continuousBuffer) { + $_iv = &$self->encryptIV; + $_pos = &$_buffer["pos"]; + } else { + $_iv = $self->encryptIV; + $_pos = 0; + } + $_len = strlen($_text); + $_i = 0; + if ($_pos) { + $_orig_pos = $_pos; + $_max = '.$block_size.' - $_pos; + if ($_len >= $_max) { + $_i = $_max; + $_len-= $_max; + $_pos = 0; + } else { + $_i = $_len; + $_pos+= $_len; + $_len = 0; + } + $_ciphertext = substr($_iv, $_orig_pos) ^ $_text; + $_iv = substr_replace($_iv, $_ciphertext, $_orig_pos, $_i); + } + while ($_len >= '.$block_size.') { + $in = $_iv; + '.$encrypt_block.'; + $_iv = $in ^ substr($_text, $_i, '.$block_size.'); + $_ciphertext.= $_iv; + $_len-= '.$block_size.'; + $_i+= '.$block_size.'; + } + if ($_len) { + $in = $_iv; + '.$encrypt_block.' + $_iv = $in; + $_block = $_iv ^ substr($_text, $_i); + $_iv = substr_replace($_iv, $_block, 0, $_len); + $_ciphertext.= $_block; + $_pos = $_len; + } + return $_ciphertext; + '; + + $decrypt = $init_encrypt . ' + $_plaintext = ""; + $_buffer = &$self->debuffer; + + if ($self->continuousBuffer) { + $_iv = &$self->decryptIV; + $_pos = &$_buffer["pos"]; + } else { + $_iv = $self->decryptIV; + $_pos = 0; + } + $_len = strlen($_text); + $_i = 0; + if ($_pos) { + $_orig_pos = $_pos; + $_max = '.$block_size.' - $_pos; + if ($_len >= $_max) { + $_i = $_max; + $_len-= $_max; + $_pos = 0; + } else { + $_i = $_len; + $_pos+= $_len; + $_len = 0; + } + $_plaintext = substr($_iv, $_orig_pos) ^ $_text; + $_iv = substr_replace($_iv, substr($_text, 0, $_i), $_orig_pos, $_i); + } + while ($_len >= '.$block_size.') { + $in = $_iv; + '.$encrypt_block.' + $_iv = $in; + $cb = substr($_text, $_i, '.$block_size.'); + $_plaintext.= $_iv ^ $cb; + $_iv = $cb; + $_len-= '.$block_size.'; + $_i+= '.$block_size.'; + } + if ($_len) { + $in = $_iv; + '.$encrypt_block.' + $_iv = $in; + $_plaintext.= $_iv ^ substr($_text, $_i); + $_iv = substr_replace($_iv, substr($_text, $_i), 0, $_len); + $_pos = $_len; + } + + return $_plaintext; + '; + break; + case CRYPT_MODE_OFB: + $encrypt = $init_encrypt . ' + $_ciphertext = ""; + $_plaintext_len = strlen($_text); + $_xor = $self->encryptIV; + $_buffer = &$self->enbuffer; + + if (strlen($_buffer["xor"])) { + for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { + $_block = substr($_text, $_i, '.$block_size.'); + if (strlen($_block) > strlen($_buffer["xor"])) { + $in = $_xor; + '.$encrypt_block.' + $_xor = $in; + $_buffer["xor"].= $_xor; + } + $_key = $self->_stringShift($_buffer["xor"], '.$block_size.'); + $_ciphertext.= $_block ^ $_key; + } + } else { + for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { + $in = $_xor; + '.$encrypt_block.' + $_xor = $in; + $_ciphertext.= substr($_text, $_i, '.$block_size.') ^ $_xor; + } + $_key = $_xor; + } + if ($self->continuousBuffer) { + $self->encryptIV = $_xor; + if ($_start = $_plaintext_len % '.$block_size.') { + $_buffer["xor"] = substr($_key, $_start) . $_buffer["xor"]; + } + } + return $_ciphertext; + '; + + $decrypt = $init_encrypt . ' + $_plaintext = ""; + $_ciphertext_len = strlen($_text); + $_xor = $self->decryptIV; + $_buffer = &$self->debuffer; + + if (strlen($_buffer["xor"])) { + for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { + $_block = substr($_text, $_i, '.$block_size.'); + if (strlen($_block) > strlen($_buffer["xor"])) { + $in = $_xor; + '.$encrypt_block.' + $_xor = $in; + $_buffer["xor"].= $_xor; + } + $_key = $self->_stringShift($_buffer["xor"], '.$block_size.'); + $_plaintext.= $_block ^ $_key; + } + } else { + for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { + $in = $_xor; + '.$encrypt_block.' + $_xor = $in; + $_plaintext.= substr($_text, $_i, '.$block_size.') ^ $_xor; + } + $_key = $_xor; + } + if ($self->continuousBuffer) { + $self->decryptIV = $_xor; + if ($_start = $_ciphertext_len % '.$block_size.') { + $_buffer["xor"] = substr($_key, $_start) . $_buffer["xor"]; + } + } + return $_plaintext; + '; + break; + case CRYPT_MODE_STREAM: + $encrypt = $init_encrypt . ' + $_ciphertext = ""; + '.$encrypt_block.' + return $_ciphertext; + '; + $decrypt = $init_decrypt . ' + $_plaintext = ""; + '.$decrypt_block.' + return $_plaintext; + '; + break; + // case CRYPT_MODE_CBC: + default: + $encrypt = $init_encrypt . ' + $_ciphertext = ""; + $_text = $self->_pad($_text); + $_plaintext_len = strlen($_text); + + $in = $self->encryptIV; + + for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { + $in = substr($_text, $_i, '.$block_size.') ^ $in; + '.$encrypt_block.' + $_ciphertext.= $in; + } + + if ($self->continuousBuffer) { + $self->encryptIV = $in; + } + + return $_ciphertext; + '; + + $decrypt = $init_decrypt . ' + $_plaintext = ""; + $_text = str_pad($_text, strlen($_text) + ('.$block_size.' - strlen($_text) % '.$block_size.') % '.$block_size.', chr(0)); + $_ciphertext_len = strlen($_text); + + $_iv = $self->decryptIV; + + for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { + $in = $_block = substr($_text, $_i, '.$block_size.'); + '.$decrypt_block.' + $_plaintext.= $in ^ $_iv; + $_iv = $_block; + } + + if ($self->continuousBuffer) { + $self->decryptIV = $_iv; + } + + return $self->_unpad($_plaintext); + '; + break; + } + + // Create the $inline function and return its name as string. Ready to run! + return create_function('$_action, &$self, $_text', $init_crypt . 'if ($_action == "encrypt") { ' . $encrypt . ' } else { ' . $decrypt . ' }'); + } + + /** + * Holds the lambda_functions table (classwide) + * + * Each name of the lambda function, created from + * _setupInlineCrypt() && _createInlineCryptFunction() + * is stored, classwide (!), here for reusing. + * + * The string-based index of $function is a classwide + * uniqe value representing, at least, the $mode of + * operation (or more... depends of the optimizing level) + * for which $mode the lambda function was created. + * + * @access private + * @return &Array + */ + function &_getLambdaFunctions() + { + static $functions = array(); + return $functions; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Blowfish.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Blowfish.php new file mode 100755 index 00000000..f39f17d7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Blowfish.php @@ -0,0 +1,644 @@ + + * setKey('12345678901234567890123456789012'); + * + * $plaintext = str_repeat('a', 1024); + * + * echo $blowfish->decrypt($blowfish->encrypt($plaintext)); + * ?> + * + * + * LICENSE: 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. + * + * @category Crypt + * @package Crypt_Blowfish + * @author Jim Wigginton + * @author Hans-Juergen Petrich + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Base + * + * Base cipher class + */ +if (!class_exists('Crypt_Base')) { + include_once 'Base.php'; +} + +/**#@+ + * @access public + * @see Crypt_Blowfish::encrypt() + * @see Crypt_Blowfish::decrypt() + */ +/** + * Encrypt / decrypt using the Counter mode. + * + * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 + */ +define('CRYPT_BLOWFISH_MODE_CTR', CRYPT_MODE_CTR); +/** + * Encrypt / decrypt using the Electronic Code Book mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 + */ +define('CRYPT_BLOWFISH_MODE_ECB', CRYPT_MODE_ECB); +/** + * Encrypt / decrypt using the Code Book Chaining mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 + */ +define('CRYPT_BLOWFISH_MODE_CBC', CRYPT_MODE_CBC); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 + */ +define('CRYPT_BLOWFISH_MODE_CFB', CRYPT_MODE_CFB); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 + */ +define('CRYPT_BLOWFISH_MODE_OFB', CRYPT_MODE_OFB); +/**#@-*/ + +/**#@+ + * @access private + * @see Crypt_Base::Crypt_Base() + */ +/** + * Toggles the internal implementation + */ +define('CRYPT_BLOWFISH_MODE_INTERNAL', CRYPT_MODE_INTERNAL); +/** + * Toggles the mcrypt implementation + */ +define('CRYPT_BLOWFISH_MODE_MCRYPT', CRYPT_MODE_MCRYPT); +/**#@-*/ + +/** + * Pure-PHP implementation of Blowfish. + * + * @package Crypt_Blowfish + * @author Jim Wigginton + * @author Hans-Juergen Petrich + * @access public + */ +class Crypt_Blowfish extends Crypt_Base +{ + /** + * Block Length of the cipher + * + * @see Crypt_Base::block_size + * @var Integer + * @access private + */ + var $block_size = 8; + + /** + * The default password key_size used by setPassword() + * + * @see Crypt_Base::password_key_size + * @see Crypt_Base::setPassword() + * @var Integer + * @access private + */ + var $password_key_size = 56; + + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_Base::const_namespace + * @var String + * @access private + */ + var $const_namespace = 'BLOWFISH'; + + /** + * The mcrypt specific name of the cipher + * + * @see Crypt_Base::cipher_name_mcrypt + * @var String + * @access private + */ + var $cipher_name_mcrypt = 'blowfish'; + + /** + * Optimizing value while CFB-encrypting + * + * @see Crypt_Base::cfb_init_len + * @var Integer + * @access private + */ + var $cfb_init_len = 500; + + /** + * The fixed subkeys boxes ($sbox0 - $sbox3) with 256 entries each + * + * S-Box 1 + * + * @access private + * @var array + */ + var $sbox0 = array ( + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a + ); + + /** + * S-Box 1 + * + * @access private + * @var array + */ + var $sbox1 = array( + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 + ); + + /** + * S-Box 2 + * + * @access private + * @var array + */ + var $sbox2 = array( + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 + ); + + /** + * S-Box 3 + * + * @access private + * @var array + */ + var $sbox3 = array( + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 + ); + + /** + * P-Array consists of 18 32-bit subkeys + * + * @var array $parray + * @access private + */ + var $parray = array( + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, + 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b + ); + + /** + * The BCTX-working Array + * + * Holds the expanded key [p] and the key-depended s-boxes [sb] + * + * @var array $bctx + * @access private + */ + var $bctx; + + /** + * Holds the last used key + * + * @var Array + * @access private + */ + var $kl; + + /** + * Sets the key. + * + * Keys can be of any length. Blowfish, itself, requires the use of a key between 32 and max. 448-bits long. + * If the key is less than 32-bits we NOT fill the key to 32bit but let the key as it is to be compatible + * with mcrypt because mcrypt act this way with blowfish key's < 32 bits. + * + * If the key is more than 448-bits, we trim the excess bits. + * + * If the key is not explicitly set, or empty, it'll be assumed a 128 bits key to be all null bytes. + * + * @access public + * @see Crypt_Base::setKey() + * @param String $key + */ + function setKey($key) + { + $keylength = strlen($key); + + if (!$keylength) { + $key = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; + } elseif ($keylength > 56) { + $key = substr($key, 0, 56); + } + + parent::setKey($key); + } + + /** + * Setup the key (expansion) + * + * @see Crypt_Base::_setupKey() + * @access private + */ + function _setupKey() + { + if (isset($this->kl['key']) && $this->key === $this->kl['key']) { + // already expanded + return; + } + $this->kl = array('key' => $this->key); + + /* key-expanding p[] and S-Box building sb[] */ + $this->bctx = array( + 'p' => array(), + 'sb' => array( + $this->sbox0, + $this->sbox1, + $this->sbox2, + $this->sbox3 + ) + ); + + // unpack binary string in unsigned chars + $key = array_values(unpack('C*', $this->key)); + $keyl = count($key); + for ($j = 0, $i = 0; $i < 18; ++$i) { + // xor P1 with the first 32-bits of the key, xor P2 with the second 32-bits ... + for ($data = 0, $k = 0; $k < 4; ++$k) { + $data = ($data << 8) | $key[$j]; + if (++$j >= $keyl) { + $j = 0; + } + } + $this->bctx['p'][] = $this->parray[$i] ^ $data; + } + + // encrypt the zero-string, replace P1 and P2 with the encrypted data, + // encrypt P3 and P4 with the new P1 and P2, do it with all P-array and subkeys + $data = "\0\0\0\0\0\0\0\0"; + for ($i = 0; $i < 18; $i += 2) { + list($l, $r) = array_values(unpack('N*', $data = $this->_encryptBlock($data))); + $this->bctx['p'][$i ] = $l; + $this->bctx['p'][$i + 1] = $r; + } + for ($i = 0; $i < 4; ++$i) { + for ($j = 0; $j < 256; $j += 2) { + list($l, $r) = array_values(unpack('N*', $data = $this->_encryptBlock($data))); + $this->bctx['sb'][$i][$j ] = $l; + $this->bctx['sb'][$i][$j + 1] = $r; + } + } + } + + /** + * Encrypts a block + * + * @access private + * @param String $in + * @return String + */ + function _encryptBlock($in) + { + $p = $this->bctx["p"]; + // extract($this->bctx["sb"], EXTR_PREFIX_ALL, "sb"); // slower + $sb_0 = $this->bctx["sb"][0]; + $sb_1 = $this->bctx["sb"][1]; + $sb_2 = $this->bctx["sb"][2]; + $sb_3 = $this->bctx["sb"][3]; + + $in = unpack("N*", $in); + $l = $in[1]; + $r = $in[2]; + + for ($i = 0; $i < 16; $i+= 2) { + $l^= $p[$i]; + $r^= ($sb_0[$l >> 24 & 0xff] + + $sb_1[$l >> 16 & 0xff] ^ + $sb_2[$l >> 8 & 0xff]) + + $sb_3[$l & 0xff]; + + $r^= $p[$i + 1]; + $l^= ($sb_0[$r >> 24 & 0xff] + + $sb_1[$r >> 16 & 0xff] ^ + $sb_2[$r >> 8 & 0xff]) + + $sb_3[$r & 0xff]; + } + return pack("N*", $r ^ $p[17], $l ^ $p[16]); + } + + /** + * Decrypts a block + * + * @access private + * @param String $in + * @return String + */ + function _decryptBlock($in) + { + $p = $this->bctx["p"]; + $sb_0 = $this->bctx["sb"][0]; + $sb_1 = $this->bctx["sb"][1]; + $sb_2 = $this->bctx["sb"][2]; + $sb_3 = $this->bctx["sb"][3]; + + $in = unpack("N*", $in); + $l = $in[1]; + $r = $in[2]; + + for ($i = 17; $i > 2; $i-= 2) { + $l^= $p[$i]; + $r^= ($sb_0[$l >> 24 & 0xff] + + $sb_1[$l >> 16 & 0xff] ^ + $sb_2[$l >> 8 & 0xff]) + + $sb_3[$l & 0xff]; + + $r^= $p[$i - 1]; + $l^= ($sb_0[$r >> 24 & 0xff] + + $sb_1[$r >> 16 & 0xff] ^ + $sb_2[$r >> 8 & 0xff]) + + $sb_3[$r & 0xff]; + } + + return pack("N*", $r ^ $p[0], $l ^ $p[1]); + } + + /** + * Setup the performance-optimized function for de/encrypt() + * + * @see Crypt_Base::_setupInlineCrypt() + * @access private + */ + function _setupInlineCrypt() + { + $lambda_functions =& Crypt_Blowfish::_getLambdaFunctions(); + + // We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function. + // After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one. + $gen_hi_opt_code = (bool)( count($lambda_functions) < 10); + + switch (true) { + case $gen_hi_opt_code: + $code_hash = md5(str_pad("Crypt_Blowfish, {$this->mode}, ", 32, "\0") . $this->key); + break; + default: + $code_hash = "Crypt_Blowfish, {$this->mode}"; + } + + if (!isset($lambda_functions[$code_hash])) { + switch (true) { + case $gen_hi_opt_code: + $p = $this->bctx['p']; + $init_crypt = ' + static $sb_0, $sb_1, $sb_2, $sb_3; + if (!$sb_0) { + $sb_0 = $self->bctx["sb"][0]; + $sb_1 = $self->bctx["sb"][1]; + $sb_2 = $self->bctx["sb"][2]; + $sb_3 = $self->bctx["sb"][3]; + } + '; + break; + default: + $p = array(); + for ($i = 0; $i < 18; ++$i) { + $p[] = '$p_' . $i; + } + $init_crypt = ' + list($sb_0, $sb_1, $sb_2, $sb_3) = $self->bctx["sb"]; + list(' . implode(',', $p) . ') = $self->bctx["p"]; + + '; + } + + // Generating encrypt code: + $encrypt_block = ' + $in = unpack("N*", $in); + $l = $in[1]; + $r = $in[2]; + '; + for ($i = 0; $i < 16; $i+= 2) { + $encrypt_block.= ' + $l^= ' . $p[$i] . '; + $r^= ($sb_0[$l >> 24 & 0xff] + + $sb_1[$l >> 16 & 0xff] ^ + $sb_2[$l >> 8 & 0xff]) + + $sb_3[$l & 0xff]; + + $r^= ' . $p[$i + 1] . '; + $l^= ($sb_0[$r >> 24 & 0xff] + + $sb_1[$r >> 16 & 0xff] ^ + $sb_2[$r >> 8 & 0xff]) + + $sb_3[$r & 0xff]; + '; + } + $encrypt_block.= ' + $in = pack("N*", + $r ^ ' . $p[17] . ', + $l ^ ' . $p[16] . ' + ); + '; + + // Generating decrypt code: + $decrypt_block = ' + $in = unpack("N*", $in); + $l = $in[1]; + $r = $in[2]; + '; + + for ($i = 17; $i > 2; $i-= 2) { + $decrypt_block.= ' + $l^= ' . $p[$i] . '; + $r^= ($sb_0[$l >> 24 & 0xff] + + $sb_1[$l >> 16 & 0xff] ^ + $sb_2[$l >> 8 & 0xff]) + + $sb_3[$l & 0xff]; + + $r^= ' . $p[$i - 1] . '; + $l^= ($sb_0[$r >> 24 & 0xff] + + $sb_1[$r >> 16 & 0xff] ^ + $sb_2[$r >> 8 & 0xff]) + + $sb_3[$r & 0xff]; + '; + } + + $decrypt_block.= ' + $in = pack("N*", + $r ^ ' . $p[0] . ', + $l ^ ' . $p[1] . ' + ); + '; + + $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( + array( + 'init_crypt' => $init_crypt, + 'init_encrypt' => '', + 'init_decrypt' => '', + 'encrypt_block' => $encrypt_block, + 'decrypt_block' => $decrypt_block + ) + ); + } + $this->inline_crypt = $lambda_functions[$code_hash]; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/DES.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/DES.php new file mode 100755 index 00000000..f92f30b2 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/DES.php @@ -0,0 +1,1506 @@ + + * setKey('abcdefgh'); + * + * $size = 10 * 1024; + * $plaintext = ''; + * for ($i = 0; $i < $size; $i++) { + * $plaintext.= 'a'; + * } + * + * echo $des->decrypt($des->encrypt($plaintext)); + * ?> + * + * + * LICENSE: 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. + * + * @category Crypt + * @package Crypt_DES + * @author Jim Wigginton + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Base + * + * Base cipher class + */ +if (!class_exists('Crypt_Base')) { + include_once 'Base.php'; +} + +/**#@+ + * @access private + * @see Crypt_DES::_setupKey() + * @see Crypt_DES::_processBlock() + */ +/** + * Contains $keys[CRYPT_DES_ENCRYPT] + */ +define('CRYPT_DES_ENCRYPT', 0); +/** + * Contains $keys[CRYPT_DES_DECRYPT] + */ +define('CRYPT_DES_DECRYPT', 1); +/**#@-*/ + +/**#@+ + * @access public + * @see Crypt_DES::encrypt() + * @see Crypt_DES::decrypt() + */ +/** + * Encrypt / decrypt using the Counter mode. + * + * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 + */ +define('CRYPT_DES_MODE_CTR', CRYPT_MODE_CTR); +/** + * Encrypt / decrypt using the Electronic Code Book mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 + */ +define('CRYPT_DES_MODE_ECB', CRYPT_MODE_ECB); +/** + * Encrypt / decrypt using the Code Book Chaining mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 + */ +define('CRYPT_DES_MODE_CBC', CRYPT_MODE_CBC); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 + */ +define('CRYPT_DES_MODE_CFB', CRYPT_MODE_CFB); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 + */ +define('CRYPT_DES_MODE_OFB', CRYPT_MODE_OFB); +/**#@-*/ + +/**#@+ + * @access private + * @see Crypt_Base::Crypt_Base() + */ +/** + * Toggles the internal implementation + */ +define('CRYPT_DES_MODE_INTERNAL', CRYPT_MODE_INTERNAL); +/** + * Toggles the mcrypt implementation + */ +define('CRYPT_DES_MODE_MCRYPT', CRYPT_MODE_MCRYPT); +/**#@-*/ + +/** + * Pure-PHP implementation of DES. + * + * @package Crypt_DES + * @author Jim Wigginton + * @access public + */ +class Crypt_DES extends Crypt_Base +{ + /** + * Block Length of the cipher + * + * @see Crypt_Base::block_size + * @var Integer + * @access private + */ + var $block_size = 8; + + /** + * The Key + * + * @see Crypt_Base::key + * @see setKey() + * @var String + * @access private + */ + var $key = "\0\0\0\0\0\0\0\0"; + + /** + * The default password key_size used by setPassword() + * + * @see Crypt_Base::password_key_size + * @see Crypt_Base::setPassword() + * @var Integer + * @access private + */ + var $password_key_size = 8; + + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_Base::const_namespace + * @var String + * @access private + */ + var $const_namespace = 'DES'; + + /** + * The mcrypt specific name of the cipher + * + * @see Crypt_Base::cipher_name_mcrypt + * @var String + * @access private + */ + var $cipher_name_mcrypt = 'des'; + + /** + * Optimizing value while CFB-encrypting + * + * @see Crypt_Base::cfb_init_len + * @var Integer + * @access private + */ + var $cfb_init_len = 500; + + /** + * Switch for DES/3DES encryption + * + * Used only if $engine == CRYPT_DES_MODE_INTERNAL + * + * @see Crypt_DES::_setupKey() + * @see Crypt_DES::_processBlock() + * @var Integer + * @access private + */ + var $des_rounds = 1; + + /** + * max possible size of $key + * + * @see Crypt_DES::setKey() + * @var String + * @access private + */ + var $key_size_max = 8; + + /** + * The Key Schedule + * + * @see Crypt_DES::_setupKey() + * @var Array + * @access private + */ + var $keys; + + /** + * Shuffle table. + * + * For each byte value index, the entry holds an 8-byte string + * with each byte containing all bits in the same state as the + * corresponding bit in the index value. + * + * @see Crypt_DES::_processBlock() + * @see Crypt_DES::_setupKey() + * @var Array + * @access private + */ + var $shuffle = array( + "\x00\x00\x00\x00\x00\x00\x00\x00", "\x00\x00\x00\x00\x00\x00\x00\xFF", + "\x00\x00\x00\x00\x00\x00\xFF\x00", "\x00\x00\x00\x00\x00\x00\xFF\xFF", + "\x00\x00\x00\x00\x00\xFF\x00\x00", "\x00\x00\x00\x00\x00\xFF\x00\xFF", + "\x00\x00\x00\x00\x00\xFF\xFF\x00", "\x00\x00\x00\x00\x00\xFF\xFF\xFF", + "\x00\x00\x00\x00\xFF\x00\x00\x00", "\x00\x00\x00\x00\xFF\x00\x00\xFF", + "\x00\x00\x00\x00\xFF\x00\xFF\x00", "\x00\x00\x00\x00\xFF\x00\xFF\xFF", + "\x00\x00\x00\x00\xFF\xFF\x00\x00", "\x00\x00\x00\x00\xFF\xFF\x00\xFF", + "\x00\x00\x00\x00\xFF\xFF\xFF\x00", "\x00\x00\x00\x00\xFF\xFF\xFF\xFF", + "\x00\x00\x00\xFF\x00\x00\x00\x00", "\x00\x00\x00\xFF\x00\x00\x00\xFF", + "\x00\x00\x00\xFF\x00\x00\xFF\x00", "\x00\x00\x00\xFF\x00\x00\xFF\xFF", + "\x00\x00\x00\xFF\x00\xFF\x00\x00", "\x00\x00\x00\xFF\x00\xFF\x00\xFF", + "\x00\x00\x00\xFF\x00\xFF\xFF\x00", "\x00\x00\x00\xFF\x00\xFF\xFF\xFF", + "\x00\x00\x00\xFF\xFF\x00\x00\x00", "\x00\x00\x00\xFF\xFF\x00\x00\xFF", + "\x00\x00\x00\xFF\xFF\x00\xFF\x00", "\x00\x00\x00\xFF\xFF\x00\xFF\xFF", + "\x00\x00\x00\xFF\xFF\xFF\x00\x00", "\x00\x00\x00\xFF\xFF\xFF\x00\xFF", + "\x00\x00\x00\xFF\xFF\xFF\xFF\x00", "\x00\x00\x00\xFF\xFF\xFF\xFF\xFF", + "\x00\x00\xFF\x00\x00\x00\x00\x00", "\x00\x00\xFF\x00\x00\x00\x00\xFF", + "\x00\x00\xFF\x00\x00\x00\xFF\x00", "\x00\x00\xFF\x00\x00\x00\xFF\xFF", + "\x00\x00\xFF\x00\x00\xFF\x00\x00", "\x00\x00\xFF\x00\x00\xFF\x00\xFF", + "\x00\x00\xFF\x00\x00\xFF\xFF\x00", "\x00\x00\xFF\x00\x00\xFF\xFF\xFF", + "\x00\x00\xFF\x00\xFF\x00\x00\x00", "\x00\x00\xFF\x00\xFF\x00\x00\xFF", + "\x00\x00\xFF\x00\xFF\x00\xFF\x00", "\x00\x00\xFF\x00\xFF\x00\xFF\xFF", + "\x00\x00\xFF\x00\xFF\xFF\x00\x00", "\x00\x00\xFF\x00\xFF\xFF\x00\xFF", + "\x00\x00\xFF\x00\xFF\xFF\xFF\x00", "\x00\x00\xFF\x00\xFF\xFF\xFF\xFF", + "\x00\x00\xFF\xFF\x00\x00\x00\x00", "\x00\x00\xFF\xFF\x00\x00\x00\xFF", + "\x00\x00\xFF\xFF\x00\x00\xFF\x00", "\x00\x00\xFF\xFF\x00\x00\xFF\xFF", + "\x00\x00\xFF\xFF\x00\xFF\x00\x00", "\x00\x00\xFF\xFF\x00\xFF\x00\xFF", + "\x00\x00\xFF\xFF\x00\xFF\xFF\x00", "\x00\x00\xFF\xFF\x00\xFF\xFF\xFF", + "\x00\x00\xFF\xFF\xFF\x00\x00\x00", "\x00\x00\xFF\xFF\xFF\x00\x00\xFF", + "\x00\x00\xFF\xFF\xFF\x00\xFF\x00", "\x00\x00\xFF\xFF\xFF\x00\xFF\xFF", + "\x00\x00\xFF\xFF\xFF\xFF\x00\x00", "\x00\x00\xFF\xFF\xFF\xFF\x00\xFF", + "\x00\x00\xFF\xFF\xFF\xFF\xFF\x00", "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF", + "\x00\xFF\x00\x00\x00\x00\x00\x00", "\x00\xFF\x00\x00\x00\x00\x00\xFF", + "\x00\xFF\x00\x00\x00\x00\xFF\x00", "\x00\xFF\x00\x00\x00\x00\xFF\xFF", + "\x00\xFF\x00\x00\x00\xFF\x00\x00", "\x00\xFF\x00\x00\x00\xFF\x00\xFF", + "\x00\xFF\x00\x00\x00\xFF\xFF\x00", "\x00\xFF\x00\x00\x00\xFF\xFF\xFF", + "\x00\xFF\x00\x00\xFF\x00\x00\x00", "\x00\xFF\x00\x00\xFF\x00\x00\xFF", + "\x00\xFF\x00\x00\xFF\x00\xFF\x00", "\x00\xFF\x00\x00\xFF\x00\xFF\xFF", + "\x00\xFF\x00\x00\xFF\xFF\x00\x00", "\x00\xFF\x00\x00\xFF\xFF\x00\xFF", + "\x00\xFF\x00\x00\xFF\xFF\xFF\x00", "\x00\xFF\x00\x00\xFF\xFF\xFF\xFF", + "\x00\xFF\x00\xFF\x00\x00\x00\x00", "\x00\xFF\x00\xFF\x00\x00\x00\xFF", + "\x00\xFF\x00\xFF\x00\x00\xFF\x00", "\x00\xFF\x00\xFF\x00\x00\xFF\xFF", + "\x00\xFF\x00\xFF\x00\xFF\x00\x00", "\x00\xFF\x00\xFF\x00\xFF\x00\xFF", + "\x00\xFF\x00\xFF\x00\xFF\xFF\x00", "\x00\xFF\x00\xFF\x00\xFF\xFF\xFF", + "\x00\xFF\x00\xFF\xFF\x00\x00\x00", "\x00\xFF\x00\xFF\xFF\x00\x00\xFF", + "\x00\xFF\x00\xFF\xFF\x00\xFF\x00", "\x00\xFF\x00\xFF\xFF\x00\xFF\xFF", + "\x00\xFF\x00\xFF\xFF\xFF\x00\x00", "\x00\xFF\x00\xFF\xFF\xFF\x00\xFF", + "\x00\xFF\x00\xFF\xFF\xFF\xFF\x00", "\x00\xFF\x00\xFF\xFF\xFF\xFF\xFF", + "\x00\xFF\xFF\x00\x00\x00\x00\x00", "\x00\xFF\xFF\x00\x00\x00\x00\xFF", + "\x00\xFF\xFF\x00\x00\x00\xFF\x00", "\x00\xFF\xFF\x00\x00\x00\xFF\xFF", + "\x00\xFF\xFF\x00\x00\xFF\x00\x00", "\x00\xFF\xFF\x00\x00\xFF\x00\xFF", + "\x00\xFF\xFF\x00\x00\xFF\xFF\x00", "\x00\xFF\xFF\x00\x00\xFF\xFF\xFF", + "\x00\xFF\xFF\x00\xFF\x00\x00\x00", "\x00\xFF\xFF\x00\xFF\x00\x00\xFF", + "\x00\xFF\xFF\x00\xFF\x00\xFF\x00", "\x00\xFF\xFF\x00\xFF\x00\xFF\xFF", + "\x00\xFF\xFF\x00\xFF\xFF\x00\x00", "\x00\xFF\xFF\x00\xFF\xFF\x00\xFF", + "\x00\xFF\xFF\x00\xFF\xFF\xFF\x00", "\x00\xFF\xFF\x00\xFF\xFF\xFF\xFF", + "\x00\xFF\xFF\xFF\x00\x00\x00\x00", "\x00\xFF\xFF\xFF\x00\x00\x00\xFF", + "\x00\xFF\xFF\xFF\x00\x00\xFF\x00", "\x00\xFF\xFF\xFF\x00\x00\xFF\xFF", + "\x00\xFF\xFF\xFF\x00\xFF\x00\x00", "\x00\xFF\xFF\xFF\x00\xFF\x00\xFF", + "\x00\xFF\xFF\xFF\x00\xFF\xFF\x00", "\x00\xFF\xFF\xFF\x00\xFF\xFF\xFF", + "\x00\xFF\xFF\xFF\xFF\x00\x00\x00", "\x00\xFF\xFF\xFF\xFF\x00\x00\xFF", + "\x00\xFF\xFF\xFF\xFF\x00\xFF\x00", "\x00\xFF\xFF\xFF\xFF\x00\xFF\xFF", + "\x00\xFF\xFF\xFF\xFF\xFF\x00\x00", "\x00\xFF\xFF\xFF\xFF\xFF\x00\xFF", + "\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00", "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF", + "\xFF\x00\x00\x00\x00\x00\x00\x00", "\xFF\x00\x00\x00\x00\x00\x00\xFF", + "\xFF\x00\x00\x00\x00\x00\xFF\x00", "\xFF\x00\x00\x00\x00\x00\xFF\xFF", + "\xFF\x00\x00\x00\x00\xFF\x00\x00", "\xFF\x00\x00\x00\x00\xFF\x00\xFF", + "\xFF\x00\x00\x00\x00\xFF\xFF\x00", "\xFF\x00\x00\x00\x00\xFF\xFF\xFF", + "\xFF\x00\x00\x00\xFF\x00\x00\x00", "\xFF\x00\x00\x00\xFF\x00\x00\xFF", + "\xFF\x00\x00\x00\xFF\x00\xFF\x00", "\xFF\x00\x00\x00\xFF\x00\xFF\xFF", + "\xFF\x00\x00\x00\xFF\xFF\x00\x00", "\xFF\x00\x00\x00\xFF\xFF\x00\xFF", + "\xFF\x00\x00\x00\xFF\xFF\xFF\x00", "\xFF\x00\x00\x00\xFF\xFF\xFF\xFF", + "\xFF\x00\x00\xFF\x00\x00\x00\x00", "\xFF\x00\x00\xFF\x00\x00\x00\xFF", + "\xFF\x00\x00\xFF\x00\x00\xFF\x00", "\xFF\x00\x00\xFF\x00\x00\xFF\xFF", + "\xFF\x00\x00\xFF\x00\xFF\x00\x00", "\xFF\x00\x00\xFF\x00\xFF\x00\xFF", + "\xFF\x00\x00\xFF\x00\xFF\xFF\x00", "\xFF\x00\x00\xFF\x00\xFF\xFF\xFF", + "\xFF\x00\x00\xFF\xFF\x00\x00\x00", "\xFF\x00\x00\xFF\xFF\x00\x00\xFF", + "\xFF\x00\x00\xFF\xFF\x00\xFF\x00", "\xFF\x00\x00\xFF\xFF\x00\xFF\xFF", + "\xFF\x00\x00\xFF\xFF\xFF\x00\x00", "\xFF\x00\x00\xFF\xFF\xFF\x00\xFF", + "\xFF\x00\x00\xFF\xFF\xFF\xFF\x00", "\xFF\x00\x00\xFF\xFF\xFF\xFF\xFF", + "\xFF\x00\xFF\x00\x00\x00\x00\x00", "\xFF\x00\xFF\x00\x00\x00\x00\xFF", + "\xFF\x00\xFF\x00\x00\x00\xFF\x00", "\xFF\x00\xFF\x00\x00\x00\xFF\xFF", + "\xFF\x00\xFF\x00\x00\xFF\x00\x00", "\xFF\x00\xFF\x00\x00\xFF\x00\xFF", + "\xFF\x00\xFF\x00\x00\xFF\xFF\x00", "\xFF\x00\xFF\x00\x00\xFF\xFF\xFF", + "\xFF\x00\xFF\x00\xFF\x00\x00\x00", "\xFF\x00\xFF\x00\xFF\x00\x00\xFF", + "\xFF\x00\xFF\x00\xFF\x00\xFF\x00", "\xFF\x00\xFF\x00\xFF\x00\xFF\xFF", + "\xFF\x00\xFF\x00\xFF\xFF\x00\x00", "\xFF\x00\xFF\x00\xFF\xFF\x00\xFF", + "\xFF\x00\xFF\x00\xFF\xFF\xFF\x00", "\xFF\x00\xFF\x00\xFF\xFF\xFF\xFF", + "\xFF\x00\xFF\xFF\x00\x00\x00\x00", "\xFF\x00\xFF\xFF\x00\x00\x00\xFF", + "\xFF\x00\xFF\xFF\x00\x00\xFF\x00", "\xFF\x00\xFF\xFF\x00\x00\xFF\xFF", + "\xFF\x00\xFF\xFF\x00\xFF\x00\x00", "\xFF\x00\xFF\xFF\x00\xFF\x00\xFF", + "\xFF\x00\xFF\xFF\x00\xFF\xFF\x00", "\xFF\x00\xFF\xFF\x00\xFF\xFF\xFF", + "\xFF\x00\xFF\xFF\xFF\x00\x00\x00", "\xFF\x00\xFF\xFF\xFF\x00\x00\xFF", + "\xFF\x00\xFF\xFF\xFF\x00\xFF\x00", "\xFF\x00\xFF\xFF\xFF\x00\xFF\xFF", + "\xFF\x00\xFF\xFF\xFF\xFF\x00\x00", "\xFF\x00\xFF\xFF\xFF\xFF\x00\xFF", + "\xFF\x00\xFF\xFF\xFF\xFF\xFF\x00", "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF", + "\xFF\xFF\x00\x00\x00\x00\x00\x00", "\xFF\xFF\x00\x00\x00\x00\x00\xFF", + "\xFF\xFF\x00\x00\x00\x00\xFF\x00", "\xFF\xFF\x00\x00\x00\x00\xFF\xFF", + "\xFF\xFF\x00\x00\x00\xFF\x00\x00", "\xFF\xFF\x00\x00\x00\xFF\x00\xFF", + "\xFF\xFF\x00\x00\x00\xFF\xFF\x00", "\xFF\xFF\x00\x00\x00\xFF\xFF\xFF", + "\xFF\xFF\x00\x00\xFF\x00\x00\x00", "\xFF\xFF\x00\x00\xFF\x00\x00\xFF", + "\xFF\xFF\x00\x00\xFF\x00\xFF\x00", "\xFF\xFF\x00\x00\xFF\x00\xFF\xFF", + "\xFF\xFF\x00\x00\xFF\xFF\x00\x00", "\xFF\xFF\x00\x00\xFF\xFF\x00\xFF", + "\xFF\xFF\x00\x00\xFF\xFF\xFF\x00", "\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF", + "\xFF\xFF\x00\xFF\x00\x00\x00\x00", "\xFF\xFF\x00\xFF\x00\x00\x00\xFF", + "\xFF\xFF\x00\xFF\x00\x00\xFF\x00", "\xFF\xFF\x00\xFF\x00\x00\xFF\xFF", + "\xFF\xFF\x00\xFF\x00\xFF\x00\x00", "\xFF\xFF\x00\xFF\x00\xFF\x00\xFF", + "\xFF\xFF\x00\xFF\x00\xFF\xFF\x00", "\xFF\xFF\x00\xFF\x00\xFF\xFF\xFF", + "\xFF\xFF\x00\xFF\xFF\x00\x00\x00", "\xFF\xFF\x00\xFF\xFF\x00\x00\xFF", + "\xFF\xFF\x00\xFF\xFF\x00\xFF\x00", "\xFF\xFF\x00\xFF\xFF\x00\xFF\xFF", + "\xFF\xFF\x00\xFF\xFF\xFF\x00\x00", "\xFF\xFF\x00\xFF\xFF\xFF\x00\xFF", + "\xFF\xFF\x00\xFF\xFF\xFF\xFF\x00", "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF", + "\xFF\xFF\xFF\x00\x00\x00\x00\x00", "\xFF\xFF\xFF\x00\x00\x00\x00\xFF", + "\xFF\xFF\xFF\x00\x00\x00\xFF\x00", "\xFF\xFF\xFF\x00\x00\x00\xFF\xFF", + "\xFF\xFF\xFF\x00\x00\xFF\x00\x00", "\xFF\xFF\xFF\x00\x00\xFF\x00\xFF", + "\xFF\xFF\xFF\x00\x00\xFF\xFF\x00", "\xFF\xFF\xFF\x00\x00\xFF\xFF\xFF", + "\xFF\xFF\xFF\x00\xFF\x00\x00\x00", "\xFF\xFF\xFF\x00\xFF\x00\x00\xFF", + "\xFF\xFF\xFF\x00\xFF\x00\xFF\x00", "\xFF\xFF\xFF\x00\xFF\x00\xFF\xFF", + "\xFF\xFF\xFF\x00\xFF\xFF\x00\x00", "\xFF\xFF\xFF\x00\xFF\xFF\x00\xFF", + "\xFF\xFF\xFF\x00\xFF\xFF\xFF\x00", "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF", + "\xFF\xFF\xFF\xFF\x00\x00\x00\x00", "\xFF\xFF\xFF\xFF\x00\x00\x00\xFF", + "\xFF\xFF\xFF\xFF\x00\x00\xFF\x00", "\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF", + "\xFF\xFF\xFF\xFF\x00\xFF\x00\x00", "\xFF\xFF\xFF\xFF\x00\xFF\x00\xFF", + "\xFF\xFF\xFF\xFF\x00\xFF\xFF\x00", "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF", + "\xFF\xFF\xFF\xFF\xFF\x00\x00\x00", "\xFF\xFF\xFF\xFF\xFF\x00\x00\xFF", + "\xFF\xFF\xFF\xFF\xFF\x00\xFF\x00", "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF", + "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00", "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF", + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00", "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" + ); + + /** + * IP mapping helper table. + * + * Indexing this table with each source byte performs the initial bit permutation. + * + * @var Array + * @access private + */ + var $ipmap = array( + 0x00, 0x10, 0x01, 0x11, 0x20, 0x30, 0x21, 0x31, + 0x02, 0x12, 0x03, 0x13, 0x22, 0x32, 0x23, 0x33, + 0x40, 0x50, 0x41, 0x51, 0x60, 0x70, 0x61, 0x71, + 0x42, 0x52, 0x43, 0x53, 0x62, 0x72, 0x63, 0x73, + 0x04, 0x14, 0x05, 0x15, 0x24, 0x34, 0x25, 0x35, + 0x06, 0x16, 0x07, 0x17, 0x26, 0x36, 0x27, 0x37, + 0x44, 0x54, 0x45, 0x55, 0x64, 0x74, 0x65, 0x75, + 0x46, 0x56, 0x47, 0x57, 0x66, 0x76, 0x67, 0x77, + 0x80, 0x90, 0x81, 0x91, 0xA0, 0xB0, 0xA1, 0xB1, + 0x82, 0x92, 0x83, 0x93, 0xA2, 0xB2, 0xA3, 0xB3, + 0xC0, 0xD0, 0xC1, 0xD1, 0xE0, 0xF0, 0xE1, 0xF1, + 0xC2, 0xD2, 0xC3, 0xD3, 0xE2, 0xF2, 0xE3, 0xF3, + 0x84, 0x94, 0x85, 0x95, 0xA4, 0xB4, 0xA5, 0xB5, + 0x86, 0x96, 0x87, 0x97, 0xA6, 0xB6, 0xA7, 0xB7, + 0xC4, 0xD4, 0xC5, 0xD5, 0xE4, 0xF4, 0xE5, 0xF5, + 0xC6, 0xD6, 0xC7, 0xD7, 0xE6, 0xF6, 0xE7, 0xF7, + 0x08, 0x18, 0x09, 0x19, 0x28, 0x38, 0x29, 0x39, + 0x0A, 0x1A, 0x0B, 0x1B, 0x2A, 0x3A, 0x2B, 0x3B, + 0x48, 0x58, 0x49, 0x59, 0x68, 0x78, 0x69, 0x79, + 0x4A, 0x5A, 0x4B, 0x5B, 0x6A, 0x7A, 0x6B, 0x7B, + 0x0C, 0x1C, 0x0D, 0x1D, 0x2C, 0x3C, 0x2D, 0x3D, + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4C, 0x5C, 0x4D, 0x5D, 0x6C, 0x7C, 0x6D, 0x7D, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x88, 0x98, 0x89, 0x99, 0xA8, 0xB8, 0xA9, 0xB9, + 0x8A, 0x9A, 0x8B, 0x9B, 0xAA, 0xBA, 0xAB, 0xBB, + 0xC8, 0xD8, 0xC9, 0xD9, 0xE8, 0xF8, 0xE9, 0xF9, + 0xCA, 0xDA, 0xCB, 0xDB, 0xEA, 0xFA, 0xEB, 0xFB, + 0x8C, 0x9C, 0x8D, 0x9D, 0xAC, 0xBC, 0xAD, 0xBD, + 0x8E, 0x9E, 0x8F, 0x9F, 0xAE, 0xBE, 0xAF, 0xBF, + 0xCC, 0xDC, 0xCD, 0xDD, 0xEC, 0xFC, 0xED, 0xFD, + 0xCE, 0xDE, 0xCF, 0xDF, 0xEE, 0xFE, 0xEF, 0xFF + ); + + /** + * Inverse IP mapping helper table. + * Indexing this table with a byte value reverses the bit order. + * + * @var Array + * @access private + */ + var $invipmap = array( + 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, + 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, + 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, + 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, + 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, + 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, + 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, + 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, + 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, + 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, + 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, + 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, + 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, + 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, + 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, + 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, + 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, + 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, + 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, + 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, + 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, + 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, + 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, + 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, + 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, + 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, + 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, + 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, + 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, + 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, + 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, + 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF + ); + + /** + * Pre-permuted S-box1 + * + * Each box ($sbox1-$sbox8) has been vectorized, then each value pre-permuted using the + * P table: concatenation can then be replaced by exclusive ORs. + * + * @var Array + * @access private + */ + var $sbox1 = array( + 0x00808200, 0x00000000, 0x00008000, 0x00808202, + 0x00808002, 0x00008202, 0x00000002, 0x00008000, + 0x00000200, 0x00808200, 0x00808202, 0x00000200, + 0x00800202, 0x00808002, 0x00800000, 0x00000002, + 0x00000202, 0x00800200, 0x00800200, 0x00008200, + 0x00008200, 0x00808000, 0x00808000, 0x00800202, + 0x00008002, 0x00800002, 0x00800002, 0x00008002, + 0x00000000, 0x00000202, 0x00008202, 0x00800000, + 0x00008000, 0x00808202, 0x00000002, 0x00808000, + 0x00808200, 0x00800000, 0x00800000, 0x00000200, + 0x00808002, 0x00008000, 0x00008200, 0x00800002, + 0x00000200, 0x00000002, 0x00800202, 0x00008202, + 0x00808202, 0x00008002, 0x00808000, 0x00800202, + 0x00800002, 0x00000202, 0x00008202, 0x00808200, + 0x00000202, 0x00800200, 0x00800200, 0x00000000, + 0x00008002, 0x00008200, 0x00000000, 0x00808002 + ); + + /** + * Pre-permuted S-box2 + * + * @var Array + * @access private + */ + var $sbox2 = array( + 0x40084010, 0x40004000, 0x00004000, 0x00084010, + 0x00080000, 0x00000010, 0x40080010, 0x40004010, + 0x40000010, 0x40084010, 0x40084000, 0x40000000, + 0x40004000, 0x00080000, 0x00000010, 0x40080010, + 0x00084000, 0x00080010, 0x40004010, 0x00000000, + 0x40000000, 0x00004000, 0x00084010, 0x40080000, + 0x00080010, 0x40000010, 0x00000000, 0x00084000, + 0x00004010, 0x40084000, 0x40080000, 0x00004010, + 0x00000000, 0x00084010, 0x40080010, 0x00080000, + 0x40004010, 0x40080000, 0x40084000, 0x00004000, + 0x40080000, 0x40004000, 0x00000010, 0x40084010, + 0x00084010, 0x00000010, 0x00004000, 0x40000000, + 0x00004010, 0x40084000, 0x00080000, 0x40000010, + 0x00080010, 0x40004010, 0x40000010, 0x00080010, + 0x00084000, 0x00000000, 0x40004000, 0x00004010, + 0x40000000, 0x40080010, 0x40084010, 0x00084000 + ); + + /** + * Pre-permuted S-box3 + * + * @var Array + * @access private + */ + var $sbox3 = array( + 0x00000104, 0x04010100, 0x00000000, 0x04010004, + 0x04000100, 0x00000000, 0x00010104, 0x04000100, + 0x00010004, 0x04000004, 0x04000004, 0x00010000, + 0x04010104, 0x00010004, 0x04010000, 0x00000104, + 0x04000000, 0x00000004, 0x04010100, 0x00000100, + 0x00010100, 0x04010000, 0x04010004, 0x00010104, + 0x04000104, 0x00010100, 0x00010000, 0x04000104, + 0x00000004, 0x04010104, 0x00000100, 0x04000000, + 0x04010100, 0x04000000, 0x00010004, 0x00000104, + 0x00010000, 0x04010100, 0x04000100, 0x00000000, + 0x00000100, 0x00010004, 0x04010104, 0x04000100, + 0x04000004, 0x00000100, 0x00000000, 0x04010004, + 0x04000104, 0x00010000, 0x04000000, 0x04010104, + 0x00000004, 0x00010104, 0x00010100, 0x04000004, + 0x04010000, 0x04000104, 0x00000104, 0x04010000, + 0x00010104, 0x00000004, 0x04010004, 0x00010100 + ); + + /** + * Pre-permuted S-box4 + * + * @var Array + * @access private + */ + var $sbox4 = array( + 0x80401000, 0x80001040, 0x80001040, 0x00000040, + 0x00401040, 0x80400040, 0x80400000, 0x80001000, + 0x00000000, 0x00401000, 0x00401000, 0x80401040, + 0x80000040, 0x00000000, 0x00400040, 0x80400000, + 0x80000000, 0x00001000, 0x00400000, 0x80401000, + 0x00000040, 0x00400000, 0x80001000, 0x00001040, + 0x80400040, 0x80000000, 0x00001040, 0x00400040, + 0x00001000, 0x00401040, 0x80401040, 0x80000040, + 0x00400040, 0x80400000, 0x00401000, 0x80401040, + 0x80000040, 0x00000000, 0x00000000, 0x00401000, + 0x00001040, 0x00400040, 0x80400040, 0x80000000, + 0x80401000, 0x80001040, 0x80001040, 0x00000040, + 0x80401040, 0x80000040, 0x80000000, 0x00001000, + 0x80400000, 0x80001000, 0x00401040, 0x80400040, + 0x80001000, 0x00001040, 0x00400000, 0x80401000, + 0x00000040, 0x00400000, 0x00001000, 0x00401040 + ); + + /** + * Pre-permuted S-box5 + * + * @var Array + * @access private + */ + var $sbox5 = array( + 0x00000080, 0x01040080, 0x01040000, 0x21000080, + 0x00040000, 0x00000080, 0x20000000, 0x01040000, + 0x20040080, 0x00040000, 0x01000080, 0x20040080, + 0x21000080, 0x21040000, 0x00040080, 0x20000000, + 0x01000000, 0x20040000, 0x20040000, 0x00000000, + 0x20000080, 0x21040080, 0x21040080, 0x01000080, + 0x21040000, 0x20000080, 0x00000000, 0x21000000, + 0x01040080, 0x01000000, 0x21000000, 0x00040080, + 0x00040000, 0x21000080, 0x00000080, 0x01000000, + 0x20000000, 0x01040000, 0x21000080, 0x20040080, + 0x01000080, 0x20000000, 0x21040000, 0x01040080, + 0x20040080, 0x00000080, 0x01000000, 0x21040000, + 0x21040080, 0x00040080, 0x21000000, 0x21040080, + 0x01040000, 0x00000000, 0x20040000, 0x21000000, + 0x00040080, 0x01000080, 0x20000080, 0x00040000, + 0x00000000, 0x20040000, 0x01040080, 0x20000080 + ); + + /** + * Pre-permuted S-box6 + * + * @var Array + * @access private + */ + var $sbox6 = array( + 0x10000008, 0x10200000, 0x00002000, 0x10202008, + 0x10200000, 0x00000008, 0x10202008, 0x00200000, + 0x10002000, 0x00202008, 0x00200000, 0x10000008, + 0x00200008, 0x10002000, 0x10000000, 0x00002008, + 0x00000000, 0x00200008, 0x10002008, 0x00002000, + 0x00202000, 0x10002008, 0x00000008, 0x10200008, + 0x10200008, 0x00000000, 0x00202008, 0x10202000, + 0x00002008, 0x00202000, 0x10202000, 0x10000000, + 0x10002000, 0x00000008, 0x10200008, 0x00202000, + 0x10202008, 0x00200000, 0x00002008, 0x10000008, + 0x00200000, 0x10002000, 0x10000000, 0x00002008, + 0x10000008, 0x10202008, 0x00202000, 0x10200000, + 0x00202008, 0x10202000, 0x00000000, 0x10200008, + 0x00000008, 0x00002000, 0x10200000, 0x00202008, + 0x00002000, 0x00200008, 0x10002008, 0x00000000, + 0x10202000, 0x10000000, 0x00200008, 0x10002008 + ); + + /** + * Pre-permuted S-box7 + * + * @var Array + * @access private + */ + var $sbox7 = array( + 0x00100000, 0x02100001, 0x02000401, 0x00000000, + 0x00000400, 0x02000401, 0x00100401, 0x02100400, + 0x02100401, 0x00100000, 0x00000000, 0x02000001, + 0x00000001, 0x02000000, 0x02100001, 0x00000401, + 0x02000400, 0x00100401, 0x00100001, 0x02000400, + 0x02000001, 0x02100000, 0x02100400, 0x00100001, + 0x02100000, 0x00000400, 0x00000401, 0x02100401, + 0x00100400, 0x00000001, 0x02000000, 0x00100400, + 0x02000000, 0x00100400, 0x00100000, 0x02000401, + 0x02000401, 0x02100001, 0x02100001, 0x00000001, + 0x00100001, 0x02000000, 0x02000400, 0x00100000, + 0x02100400, 0x00000401, 0x00100401, 0x02100400, + 0x00000401, 0x02000001, 0x02100401, 0x02100000, + 0x00100400, 0x00000000, 0x00000001, 0x02100401, + 0x00000000, 0x00100401, 0x02100000, 0x00000400, + 0x02000001, 0x02000400, 0x00000400, 0x00100001 + ); + + /** + * Pre-permuted S-box8 + * + * @var Array + * @access private + */ + var $sbox8 = array( + 0x08000820, 0x00000800, 0x00020000, 0x08020820, + 0x08000000, 0x08000820, 0x00000020, 0x08000000, + 0x00020020, 0x08020000, 0x08020820, 0x00020800, + 0x08020800, 0x00020820, 0x00000800, 0x00000020, + 0x08020000, 0x08000020, 0x08000800, 0x00000820, + 0x00020800, 0x00020020, 0x08020020, 0x08020800, + 0x00000820, 0x00000000, 0x00000000, 0x08020020, + 0x08000020, 0x08000800, 0x00020820, 0x00020000, + 0x00020820, 0x00020000, 0x08020800, 0x00000800, + 0x00000020, 0x08020020, 0x00000800, 0x00020820, + 0x08000800, 0x00000020, 0x08000020, 0x08020000, + 0x08020020, 0x08000000, 0x00020000, 0x08000820, + 0x00000000, 0x08020820, 0x00020020, 0x08000020, + 0x08020000, 0x08000800, 0x08000820, 0x00000000, + 0x08020820, 0x00020800, 0x00020800, 0x00000820, + 0x00000820, 0x00020020, 0x08000000, 0x08020800 + ); + + /** + * Sets the key. + * + * Keys can be of any length. DES, itself, uses 64-bit keys (eg. strlen($key) == 8), however, we + * only use the first eight, if $key has more then eight characters in it, and pad $key with the + * null byte if it is less then eight characters long. + * + * DES also requires that every eighth bit be a parity bit, however, we'll ignore that. + * + * If the key is not explicitly set, it'll be assumed to be all zero's. + * + * @see Crypt_Base::setKey() + * @access public + * @param String $key + */ + function setKey($key) + { + // We check/cut here only up to max length of the key. + // Key padding to the proper length will be done in _setupKey() + if (strlen($key) > $this->key_size_max) { + $key = substr($key, 0, $this->key_size_max); + } + + // Sets the key + parent::setKey($key); + } + + /** + * Encrypts a block + * + * @see Crypt_Base::_encryptBlock() + * @see Crypt_Base::encrypt() + * @see Crypt_DES::encrypt() + * @access private + * @param String $in + * @return String + */ + function _encryptBlock($in) + { + return $this->_processBlock($in, CRYPT_DES_ENCRYPT); + } + + /** + * Decrypts a block + * + * @see Crypt_Base::_decryptBlock() + * @see Crypt_Base::decrypt() + * @see Crypt_DES::decrypt() + * @access private + * @param String $in + * @return String + */ + function _decryptBlock($in) + { + return $this->_processBlock($in, CRYPT_DES_DECRYPT); + } + + /** + * Encrypts or decrypts a 64-bit block + * + * $mode should be either CRYPT_DES_ENCRYPT or CRYPT_DES_DECRYPT. See + * {@link http://en.wikipedia.org/wiki/Image:Feistel.png Feistel.png} to get a general + * idea of what this function does. + * + * @see Crypt_DES::_encryptBlock() + * @see Crypt_DES::_decryptBlock() + * @access private + * @param String $block + * @param Integer $mode + * @return String + */ + function _processBlock($block, $mode) + { + static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip; + if (!$sbox1) { + $sbox1 = array_map("intval", $this->sbox1); + $sbox2 = array_map("intval", $this->sbox2); + $sbox3 = array_map("intval", $this->sbox3); + $sbox4 = array_map("intval", $this->sbox4); + $sbox5 = array_map("intval", $this->sbox5); + $sbox6 = array_map("intval", $this->sbox6); + $sbox7 = array_map("intval", $this->sbox7); + $sbox8 = array_map("intval", $this->sbox8); + /* Merge $shuffle with $[inv]ipmap */ + for ($i = 0; $i < 256; ++$i) { + $shuffleip[] = $this->shuffle[$this->ipmap[$i]]; + $shuffleinvip[] = $this->shuffle[$this->invipmap[$i]]; + } + } + + $keys = $this->keys[$mode]; + $ki = -1; + + // Do the initial IP permutation. + $t = unpack('Nl/Nr', $block); + list($l, $r) = array($t['l'], $t['r']); + $block = ($shuffleip[ $r & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | + ($shuffleip[($r >> 8) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | + ($shuffleip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | + ($shuffleip[($r >> 24) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | + ($shuffleip[ $l & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | + ($shuffleip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | + ($shuffleip[($l >> 16) & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | + ($shuffleip[($l >> 24) & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01"); + + // Extract L0 and R0. + $t = unpack('Nl/Nr', $block); + list($l, $r) = array($t['l'], $t['r']); + + for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) { + // Perform the 16 steps. + for ($i = 0; $i < 16; $i++) { + // start of "the Feistel (F) function" - see the following URL: + // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png + // Merge key schedule. + $b1 = (($r >> 3) & 0x1FFFFFFF) ^ ($r << 29) ^ $keys[++$ki]; + $b2 = (($r >> 31) & 0x00000001) ^ ($r << 1) ^ $keys[++$ki]; + + // S-box indexing. + $t = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^ + $sbox3[($b1 >> 16) & 0x3F] ^ $sbox4[($b2 >> 16) & 0x3F] ^ + $sbox5[($b1 >> 8) & 0x3F] ^ $sbox6[($b2 >> 8) & 0x3F] ^ + $sbox7[ $b1 & 0x3F] ^ $sbox8[ $b2 & 0x3F] ^ $l; + // end of "the Feistel (F) function" + + $l = $r; + $r = $t; + } + + // Last step should not permute L & R. + $t = $l; + $l = $r; + $r = $t; + } + + // Perform the inverse IP permutation. + return ($shuffleinvip[($r >> 24) & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | + ($shuffleinvip[($l >> 24) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | + ($shuffleinvip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | + ($shuffleinvip[($l >> 16) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | + ($shuffleinvip[($r >> 8) & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | + ($shuffleinvip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | + ($shuffleinvip[ $r & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | + ($shuffleinvip[ $l & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01"); + } + + /** + * Creates the key schedule + * + * @see Crypt_Base::_setupKey() + * @access private + */ + function _setupKey() + { + if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->des_rounds === $this->kl['des_rounds']) { + // already expanded + return; + } + $this->kl = array('key' => $this->key, 'des_rounds' => $this->des_rounds); + + static $shifts = array( // number of key bits shifted per round + 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 + ); + + static $pc1map = array( + 0x00, 0x00, 0x08, 0x08, 0x04, 0x04, 0x0C, 0x0C, + 0x02, 0x02, 0x0A, 0x0A, 0x06, 0x06, 0x0E, 0x0E, + 0x10, 0x10, 0x18, 0x18, 0x14, 0x14, 0x1C, 0x1C, + 0x12, 0x12, 0x1A, 0x1A, 0x16, 0x16, 0x1E, 0x1E, + 0x20, 0x20, 0x28, 0x28, 0x24, 0x24, 0x2C, 0x2C, + 0x22, 0x22, 0x2A, 0x2A, 0x26, 0x26, 0x2E, 0x2E, + 0x30, 0x30, 0x38, 0x38, 0x34, 0x34, 0x3C, 0x3C, + 0x32, 0x32, 0x3A, 0x3A, 0x36, 0x36, 0x3E, 0x3E, + 0x40, 0x40, 0x48, 0x48, 0x44, 0x44, 0x4C, 0x4C, + 0x42, 0x42, 0x4A, 0x4A, 0x46, 0x46, 0x4E, 0x4E, + 0x50, 0x50, 0x58, 0x58, 0x54, 0x54, 0x5C, 0x5C, + 0x52, 0x52, 0x5A, 0x5A, 0x56, 0x56, 0x5E, 0x5E, + 0x60, 0x60, 0x68, 0x68, 0x64, 0x64, 0x6C, 0x6C, + 0x62, 0x62, 0x6A, 0x6A, 0x66, 0x66, 0x6E, 0x6E, + 0x70, 0x70, 0x78, 0x78, 0x74, 0x74, 0x7C, 0x7C, + 0x72, 0x72, 0x7A, 0x7A, 0x76, 0x76, 0x7E, 0x7E, + 0x80, 0x80, 0x88, 0x88, 0x84, 0x84, 0x8C, 0x8C, + 0x82, 0x82, 0x8A, 0x8A, 0x86, 0x86, 0x8E, 0x8E, + 0x90, 0x90, 0x98, 0x98, 0x94, 0x94, 0x9C, 0x9C, + 0x92, 0x92, 0x9A, 0x9A, 0x96, 0x96, 0x9E, 0x9E, + 0xA0, 0xA0, 0xA8, 0xA8, 0xA4, 0xA4, 0xAC, 0xAC, + 0xA2, 0xA2, 0xAA, 0xAA, 0xA6, 0xA6, 0xAE, 0xAE, + 0xB0, 0xB0, 0xB8, 0xB8, 0xB4, 0xB4, 0xBC, 0xBC, + 0xB2, 0xB2, 0xBA, 0xBA, 0xB6, 0xB6, 0xBE, 0xBE, + 0xC0, 0xC0, 0xC8, 0xC8, 0xC4, 0xC4, 0xCC, 0xCC, + 0xC2, 0xC2, 0xCA, 0xCA, 0xC6, 0xC6, 0xCE, 0xCE, + 0xD0, 0xD0, 0xD8, 0xD8, 0xD4, 0xD4, 0xDC, 0xDC, + 0xD2, 0xD2, 0xDA, 0xDA, 0xD6, 0xD6, 0xDE, 0xDE, + 0xE0, 0xE0, 0xE8, 0xE8, 0xE4, 0xE4, 0xEC, 0xEC, + 0xE2, 0xE2, 0xEA, 0xEA, 0xE6, 0xE6, 0xEE, 0xEE, + 0xF0, 0xF0, 0xF8, 0xF8, 0xF4, 0xF4, 0xFC, 0xFC, + 0xF2, 0xF2, 0xFA, 0xFA, 0xF6, 0xF6, 0xFE, 0xFE + ); + + // Mapping tables for the PC-2 transformation. + static $pc2mapc1 = array( + 0x00000000, 0x00000400, 0x00200000, 0x00200400, + 0x00000001, 0x00000401, 0x00200001, 0x00200401, + 0x02000000, 0x02000400, 0x02200000, 0x02200400, + 0x02000001, 0x02000401, 0x02200001, 0x02200401 + ); + static $pc2mapc2 = array( + 0x00000000, 0x00000800, 0x08000000, 0x08000800, + 0x00010000, 0x00010800, 0x08010000, 0x08010800, + 0x00000000, 0x00000800, 0x08000000, 0x08000800, + 0x00010000, 0x00010800, 0x08010000, 0x08010800, + 0x00000100, 0x00000900, 0x08000100, 0x08000900, + 0x00010100, 0x00010900, 0x08010100, 0x08010900, + 0x00000100, 0x00000900, 0x08000100, 0x08000900, + 0x00010100, 0x00010900, 0x08010100, 0x08010900, + 0x00000010, 0x00000810, 0x08000010, 0x08000810, + 0x00010010, 0x00010810, 0x08010010, 0x08010810, + 0x00000010, 0x00000810, 0x08000010, 0x08000810, + 0x00010010, 0x00010810, 0x08010010, 0x08010810, + 0x00000110, 0x00000910, 0x08000110, 0x08000910, + 0x00010110, 0x00010910, 0x08010110, 0x08010910, + 0x00000110, 0x00000910, 0x08000110, 0x08000910, + 0x00010110, 0x00010910, 0x08010110, 0x08010910, + 0x00040000, 0x00040800, 0x08040000, 0x08040800, + 0x00050000, 0x00050800, 0x08050000, 0x08050800, + 0x00040000, 0x00040800, 0x08040000, 0x08040800, + 0x00050000, 0x00050800, 0x08050000, 0x08050800, + 0x00040100, 0x00040900, 0x08040100, 0x08040900, + 0x00050100, 0x00050900, 0x08050100, 0x08050900, + 0x00040100, 0x00040900, 0x08040100, 0x08040900, + 0x00050100, 0x00050900, 0x08050100, 0x08050900, + 0x00040010, 0x00040810, 0x08040010, 0x08040810, + 0x00050010, 0x00050810, 0x08050010, 0x08050810, + 0x00040010, 0x00040810, 0x08040010, 0x08040810, + 0x00050010, 0x00050810, 0x08050010, 0x08050810, + 0x00040110, 0x00040910, 0x08040110, 0x08040910, + 0x00050110, 0x00050910, 0x08050110, 0x08050910, + 0x00040110, 0x00040910, 0x08040110, 0x08040910, + 0x00050110, 0x00050910, 0x08050110, 0x08050910, + 0x01000000, 0x01000800, 0x09000000, 0x09000800, + 0x01010000, 0x01010800, 0x09010000, 0x09010800, + 0x01000000, 0x01000800, 0x09000000, 0x09000800, + 0x01010000, 0x01010800, 0x09010000, 0x09010800, + 0x01000100, 0x01000900, 0x09000100, 0x09000900, + 0x01010100, 0x01010900, 0x09010100, 0x09010900, + 0x01000100, 0x01000900, 0x09000100, 0x09000900, + 0x01010100, 0x01010900, 0x09010100, 0x09010900, + 0x01000010, 0x01000810, 0x09000010, 0x09000810, + 0x01010010, 0x01010810, 0x09010010, 0x09010810, + 0x01000010, 0x01000810, 0x09000010, 0x09000810, + 0x01010010, 0x01010810, 0x09010010, 0x09010810, + 0x01000110, 0x01000910, 0x09000110, 0x09000910, + 0x01010110, 0x01010910, 0x09010110, 0x09010910, + 0x01000110, 0x01000910, 0x09000110, 0x09000910, + 0x01010110, 0x01010910, 0x09010110, 0x09010910, + 0x01040000, 0x01040800, 0x09040000, 0x09040800, + 0x01050000, 0x01050800, 0x09050000, 0x09050800, + 0x01040000, 0x01040800, 0x09040000, 0x09040800, + 0x01050000, 0x01050800, 0x09050000, 0x09050800, + 0x01040100, 0x01040900, 0x09040100, 0x09040900, + 0x01050100, 0x01050900, 0x09050100, 0x09050900, + 0x01040100, 0x01040900, 0x09040100, 0x09040900, + 0x01050100, 0x01050900, 0x09050100, 0x09050900, + 0x01040010, 0x01040810, 0x09040010, 0x09040810, + 0x01050010, 0x01050810, 0x09050010, 0x09050810, + 0x01040010, 0x01040810, 0x09040010, 0x09040810, + 0x01050010, 0x01050810, 0x09050010, 0x09050810, + 0x01040110, 0x01040910, 0x09040110, 0x09040910, + 0x01050110, 0x01050910, 0x09050110, 0x09050910, + 0x01040110, 0x01040910, 0x09040110, 0x09040910, + 0x01050110, 0x01050910, 0x09050110, 0x09050910 + ); + static $pc2mapc3 = array( + 0x00000000, 0x00000004, 0x00001000, 0x00001004, + 0x00000000, 0x00000004, 0x00001000, 0x00001004, + 0x10000000, 0x10000004, 0x10001000, 0x10001004, + 0x10000000, 0x10000004, 0x10001000, 0x10001004, + 0x00000020, 0x00000024, 0x00001020, 0x00001024, + 0x00000020, 0x00000024, 0x00001020, 0x00001024, + 0x10000020, 0x10000024, 0x10001020, 0x10001024, + 0x10000020, 0x10000024, 0x10001020, 0x10001024, + 0x00080000, 0x00080004, 0x00081000, 0x00081004, + 0x00080000, 0x00080004, 0x00081000, 0x00081004, + 0x10080000, 0x10080004, 0x10081000, 0x10081004, + 0x10080000, 0x10080004, 0x10081000, 0x10081004, + 0x00080020, 0x00080024, 0x00081020, 0x00081024, + 0x00080020, 0x00080024, 0x00081020, 0x00081024, + 0x10080020, 0x10080024, 0x10081020, 0x10081024, + 0x10080020, 0x10080024, 0x10081020, 0x10081024, + 0x20000000, 0x20000004, 0x20001000, 0x20001004, + 0x20000000, 0x20000004, 0x20001000, 0x20001004, + 0x30000000, 0x30000004, 0x30001000, 0x30001004, + 0x30000000, 0x30000004, 0x30001000, 0x30001004, + 0x20000020, 0x20000024, 0x20001020, 0x20001024, + 0x20000020, 0x20000024, 0x20001020, 0x20001024, + 0x30000020, 0x30000024, 0x30001020, 0x30001024, + 0x30000020, 0x30000024, 0x30001020, 0x30001024, + 0x20080000, 0x20080004, 0x20081000, 0x20081004, + 0x20080000, 0x20080004, 0x20081000, 0x20081004, + 0x30080000, 0x30080004, 0x30081000, 0x30081004, + 0x30080000, 0x30080004, 0x30081000, 0x30081004, + 0x20080020, 0x20080024, 0x20081020, 0x20081024, + 0x20080020, 0x20080024, 0x20081020, 0x20081024, + 0x30080020, 0x30080024, 0x30081020, 0x30081024, + 0x30080020, 0x30080024, 0x30081020, 0x30081024, + 0x00000002, 0x00000006, 0x00001002, 0x00001006, + 0x00000002, 0x00000006, 0x00001002, 0x00001006, + 0x10000002, 0x10000006, 0x10001002, 0x10001006, + 0x10000002, 0x10000006, 0x10001002, 0x10001006, + 0x00000022, 0x00000026, 0x00001022, 0x00001026, + 0x00000022, 0x00000026, 0x00001022, 0x00001026, + 0x10000022, 0x10000026, 0x10001022, 0x10001026, + 0x10000022, 0x10000026, 0x10001022, 0x10001026, + 0x00080002, 0x00080006, 0x00081002, 0x00081006, + 0x00080002, 0x00080006, 0x00081002, 0x00081006, + 0x10080002, 0x10080006, 0x10081002, 0x10081006, + 0x10080002, 0x10080006, 0x10081002, 0x10081006, + 0x00080022, 0x00080026, 0x00081022, 0x00081026, + 0x00080022, 0x00080026, 0x00081022, 0x00081026, + 0x10080022, 0x10080026, 0x10081022, 0x10081026, + 0x10080022, 0x10080026, 0x10081022, 0x10081026, + 0x20000002, 0x20000006, 0x20001002, 0x20001006, + 0x20000002, 0x20000006, 0x20001002, 0x20001006, + 0x30000002, 0x30000006, 0x30001002, 0x30001006, + 0x30000002, 0x30000006, 0x30001002, 0x30001006, + 0x20000022, 0x20000026, 0x20001022, 0x20001026, + 0x20000022, 0x20000026, 0x20001022, 0x20001026, + 0x30000022, 0x30000026, 0x30001022, 0x30001026, + 0x30000022, 0x30000026, 0x30001022, 0x30001026, + 0x20080002, 0x20080006, 0x20081002, 0x20081006, + 0x20080002, 0x20080006, 0x20081002, 0x20081006, + 0x30080002, 0x30080006, 0x30081002, 0x30081006, + 0x30080002, 0x30080006, 0x30081002, 0x30081006, + 0x20080022, 0x20080026, 0x20081022, 0x20081026, + 0x20080022, 0x20080026, 0x20081022, 0x20081026, + 0x30080022, 0x30080026, 0x30081022, 0x30081026, + 0x30080022, 0x30080026, 0x30081022, 0x30081026 + ); + static $pc2mapc4 = array( + 0x00000000, 0x00100000, 0x00000008, 0x00100008, + 0x00000200, 0x00100200, 0x00000208, 0x00100208, + 0x00000000, 0x00100000, 0x00000008, 0x00100008, + 0x00000200, 0x00100200, 0x00000208, 0x00100208, + 0x04000000, 0x04100000, 0x04000008, 0x04100008, + 0x04000200, 0x04100200, 0x04000208, 0x04100208, + 0x04000000, 0x04100000, 0x04000008, 0x04100008, + 0x04000200, 0x04100200, 0x04000208, 0x04100208, + 0x00002000, 0x00102000, 0x00002008, 0x00102008, + 0x00002200, 0x00102200, 0x00002208, 0x00102208, + 0x00002000, 0x00102000, 0x00002008, 0x00102008, + 0x00002200, 0x00102200, 0x00002208, 0x00102208, + 0x04002000, 0x04102000, 0x04002008, 0x04102008, + 0x04002200, 0x04102200, 0x04002208, 0x04102208, + 0x04002000, 0x04102000, 0x04002008, 0x04102008, + 0x04002200, 0x04102200, 0x04002208, 0x04102208, + 0x00000000, 0x00100000, 0x00000008, 0x00100008, + 0x00000200, 0x00100200, 0x00000208, 0x00100208, + 0x00000000, 0x00100000, 0x00000008, 0x00100008, + 0x00000200, 0x00100200, 0x00000208, 0x00100208, + 0x04000000, 0x04100000, 0x04000008, 0x04100008, + 0x04000200, 0x04100200, 0x04000208, 0x04100208, + 0x04000000, 0x04100000, 0x04000008, 0x04100008, + 0x04000200, 0x04100200, 0x04000208, 0x04100208, + 0x00002000, 0x00102000, 0x00002008, 0x00102008, + 0x00002200, 0x00102200, 0x00002208, 0x00102208, + 0x00002000, 0x00102000, 0x00002008, 0x00102008, + 0x00002200, 0x00102200, 0x00002208, 0x00102208, + 0x04002000, 0x04102000, 0x04002008, 0x04102008, + 0x04002200, 0x04102200, 0x04002208, 0x04102208, + 0x04002000, 0x04102000, 0x04002008, 0x04102008, + 0x04002200, 0x04102200, 0x04002208, 0x04102208, + 0x00020000, 0x00120000, 0x00020008, 0x00120008, + 0x00020200, 0x00120200, 0x00020208, 0x00120208, + 0x00020000, 0x00120000, 0x00020008, 0x00120008, + 0x00020200, 0x00120200, 0x00020208, 0x00120208, + 0x04020000, 0x04120000, 0x04020008, 0x04120008, + 0x04020200, 0x04120200, 0x04020208, 0x04120208, + 0x04020000, 0x04120000, 0x04020008, 0x04120008, + 0x04020200, 0x04120200, 0x04020208, 0x04120208, + 0x00022000, 0x00122000, 0x00022008, 0x00122008, + 0x00022200, 0x00122200, 0x00022208, 0x00122208, + 0x00022000, 0x00122000, 0x00022008, 0x00122008, + 0x00022200, 0x00122200, 0x00022208, 0x00122208, + 0x04022000, 0x04122000, 0x04022008, 0x04122008, + 0x04022200, 0x04122200, 0x04022208, 0x04122208, + 0x04022000, 0x04122000, 0x04022008, 0x04122008, + 0x04022200, 0x04122200, 0x04022208, 0x04122208, + 0x00020000, 0x00120000, 0x00020008, 0x00120008, + 0x00020200, 0x00120200, 0x00020208, 0x00120208, + 0x00020000, 0x00120000, 0x00020008, 0x00120008, + 0x00020200, 0x00120200, 0x00020208, 0x00120208, + 0x04020000, 0x04120000, 0x04020008, 0x04120008, + 0x04020200, 0x04120200, 0x04020208, 0x04120208, + 0x04020000, 0x04120000, 0x04020008, 0x04120008, + 0x04020200, 0x04120200, 0x04020208, 0x04120208, + 0x00022000, 0x00122000, 0x00022008, 0x00122008, + 0x00022200, 0x00122200, 0x00022208, 0x00122208, + 0x00022000, 0x00122000, 0x00022008, 0x00122008, + 0x00022200, 0x00122200, 0x00022208, 0x00122208, + 0x04022000, 0x04122000, 0x04022008, 0x04122008, + 0x04022200, 0x04122200, 0x04022208, 0x04122208, + 0x04022000, 0x04122000, 0x04022008, 0x04122008, + 0x04022200, 0x04122200, 0x04022208, 0x04122208 + ); + static $pc2mapd1 = array( + 0x00000000, 0x00000001, 0x08000000, 0x08000001, + 0x00200000, 0x00200001, 0x08200000, 0x08200001, + 0x00000002, 0x00000003, 0x08000002, 0x08000003, + 0x00200002, 0x00200003, 0x08200002, 0x08200003 + ); + static $pc2mapd2 = array( + 0x00000000, 0x00100000, 0x00000800, 0x00100800, + 0x00000000, 0x00100000, 0x00000800, 0x00100800, + 0x04000000, 0x04100000, 0x04000800, 0x04100800, + 0x04000000, 0x04100000, 0x04000800, 0x04100800, + 0x00000004, 0x00100004, 0x00000804, 0x00100804, + 0x00000004, 0x00100004, 0x00000804, 0x00100804, + 0x04000004, 0x04100004, 0x04000804, 0x04100804, + 0x04000004, 0x04100004, 0x04000804, 0x04100804, + 0x00000000, 0x00100000, 0x00000800, 0x00100800, + 0x00000000, 0x00100000, 0x00000800, 0x00100800, + 0x04000000, 0x04100000, 0x04000800, 0x04100800, + 0x04000000, 0x04100000, 0x04000800, 0x04100800, + 0x00000004, 0x00100004, 0x00000804, 0x00100804, + 0x00000004, 0x00100004, 0x00000804, 0x00100804, + 0x04000004, 0x04100004, 0x04000804, 0x04100804, + 0x04000004, 0x04100004, 0x04000804, 0x04100804, + 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, + 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, + 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, + 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, + 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, + 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, + 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, + 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, + 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, + 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, + 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, + 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, + 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, + 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, + 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, + 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, + 0x00020000, 0x00120000, 0x00020800, 0x00120800, + 0x00020000, 0x00120000, 0x00020800, 0x00120800, + 0x04020000, 0x04120000, 0x04020800, 0x04120800, + 0x04020000, 0x04120000, 0x04020800, 0x04120800, + 0x00020004, 0x00120004, 0x00020804, 0x00120804, + 0x00020004, 0x00120004, 0x00020804, 0x00120804, + 0x04020004, 0x04120004, 0x04020804, 0x04120804, + 0x04020004, 0x04120004, 0x04020804, 0x04120804, + 0x00020000, 0x00120000, 0x00020800, 0x00120800, + 0x00020000, 0x00120000, 0x00020800, 0x00120800, + 0x04020000, 0x04120000, 0x04020800, 0x04120800, + 0x04020000, 0x04120000, 0x04020800, 0x04120800, + 0x00020004, 0x00120004, 0x00020804, 0x00120804, + 0x00020004, 0x00120004, 0x00020804, 0x00120804, + 0x04020004, 0x04120004, 0x04020804, 0x04120804, + 0x04020004, 0x04120004, 0x04020804, 0x04120804, + 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, + 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, + 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, + 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, + 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, + 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, + 0x04020204, 0x04120204, 0x04020A04, 0x04120A04, + 0x04020204, 0x04120204, 0x04020A04, 0x04120A04, + 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, + 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, + 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, + 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, + 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, + 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, + 0x04020204, 0x04120204, 0x04020A04, 0x04120A04, + 0x04020204, 0x04120204, 0x04020A04, 0x04120A04 + ); + static $pc2mapd3 = array( + 0x00000000, 0x00010000, 0x02000000, 0x02010000, + 0x00000020, 0x00010020, 0x02000020, 0x02010020, + 0x00040000, 0x00050000, 0x02040000, 0x02050000, + 0x00040020, 0x00050020, 0x02040020, 0x02050020, + 0x00002000, 0x00012000, 0x02002000, 0x02012000, + 0x00002020, 0x00012020, 0x02002020, 0x02012020, + 0x00042000, 0x00052000, 0x02042000, 0x02052000, + 0x00042020, 0x00052020, 0x02042020, 0x02052020, + 0x00000000, 0x00010000, 0x02000000, 0x02010000, + 0x00000020, 0x00010020, 0x02000020, 0x02010020, + 0x00040000, 0x00050000, 0x02040000, 0x02050000, + 0x00040020, 0x00050020, 0x02040020, 0x02050020, + 0x00002000, 0x00012000, 0x02002000, 0x02012000, + 0x00002020, 0x00012020, 0x02002020, 0x02012020, + 0x00042000, 0x00052000, 0x02042000, 0x02052000, + 0x00042020, 0x00052020, 0x02042020, 0x02052020, + 0x00000010, 0x00010010, 0x02000010, 0x02010010, + 0x00000030, 0x00010030, 0x02000030, 0x02010030, + 0x00040010, 0x00050010, 0x02040010, 0x02050010, + 0x00040030, 0x00050030, 0x02040030, 0x02050030, + 0x00002010, 0x00012010, 0x02002010, 0x02012010, + 0x00002030, 0x00012030, 0x02002030, 0x02012030, + 0x00042010, 0x00052010, 0x02042010, 0x02052010, + 0x00042030, 0x00052030, 0x02042030, 0x02052030, + 0x00000010, 0x00010010, 0x02000010, 0x02010010, + 0x00000030, 0x00010030, 0x02000030, 0x02010030, + 0x00040010, 0x00050010, 0x02040010, 0x02050010, + 0x00040030, 0x00050030, 0x02040030, 0x02050030, + 0x00002010, 0x00012010, 0x02002010, 0x02012010, + 0x00002030, 0x00012030, 0x02002030, 0x02012030, + 0x00042010, 0x00052010, 0x02042010, 0x02052010, + 0x00042030, 0x00052030, 0x02042030, 0x02052030, + 0x20000000, 0x20010000, 0x22000000, 0x22010000, + 0x20000020, 0x20010020, 0x22000020, 0x22010020, + 0x20040000, 0x20050000, 0x22040000, 0x22050000, + 0x20040020, 0x20050020, 0x22040020, 0x22050020, + 0x20002000, 0x20012000, 0x22002000, 0x22012000, + 0x20002020, 0x20012020, 0x22002020, 0x22012020, + 0x20042000, 0x20052000, 0x22042000, 0x22052000, + 0x20042020, 0x20052020, 0x22042020, 0x22052020, + 0x20000000, 0x20010000, 0x22000000, 0x22010000, + 0x20000020, 0x20010020, 0x22000020, 0x22010020, + 0x20040000, 0x20050000, 0x22040000, 0x22050000, + 0x20040020, 0x20050020, 0x22040020, 0x22050020, + 0x20002000, 0x20012000, 0x22002000, 0x22012000, + 0x20002020, 0x20012020, 0x22002020, 0x22012020, + 0x20042000, 0x20052000, 0x22042000, 0x22052000, + 0x20042020, 0x20052020, 0x22042020, 0x22052020, + 0x20000010, 0x20010010, 0x22000010, 0x22010010, + 0x20000030, 0x20010030, 0x22000030, 0x22010030, + 0x20040010, 0x20050010, 0x22040010, 0x22050010, + 0x20040030, 0x20050030, 0x22040030, 0x22050030, + 0x20002010, 0x20012010, 0x22002010, 0x22012010, + 0x20002030, 0x20012030, 0x22002030, 0x22012030, + 0x20042010, 0x20052010, 0x22042010, 0x22052010, + 0x20042030, 0x20052030, 0x22042030, 0x22052030, + 0x20000010, 0x20010010, 0x22000010, 0x22010010, + 0x20000030, 0x20010030, 0x22000030, 0x22010030, + 0x20040010, 0x20050010, 0x22040010, 0x22050010, + 0x20040030, 0x20050030, 0x22040030, 0x22050030, + 0x20002010, 0x20012010, 0x22002010, 0x22012010, + 0x20002030, 0x20012030, 0x22002030, 0x22012030, + 0x20042010, 0x20052010, 0x22042010, 0x22052010, + 0x20042030, 0x20052030, 0x22042030, 0x22052030 + ); + static $pc2mapd4 = array( + 0x00000000, 0x00000400, 0x01000000, 0x01000400, + 0x00000000, 0x00000400, 0x01000000, 0x01000400, + 0x00000100, 0x00000500, 0x01000100, 0x01000500, + 0x00000100, 0x00000500, 0x01000100, 0x01000500, + 0x10000000, 0x10000400, 0x11000000, 0x11000400, + 0x10000000, 0x10000400, 0x11000000, 0x11000400, + 0x10000100, 0x10000500, 0x11000100, 0x11000500, + 0x10000100, 0x10000500, 0x11000100, 0x11000500, + 0x00080000, 0x00080400, 0x01080000, 0x01080400, + 0x00080000, 0x00080400, 0x01080000, 0x01080400, + 0x00080100, 0x00080500, 0x01080100, 0x01080500, + 0x00080100, 0x00080500, 0x01080100, 0x01080500, + 0x10080000, 0x10080400, 0x11080000, 0x11080400, + 0x10080000, 0x10080400, 0x11080000, 0x11080400, + 0x10080100, 0x10080500, 0x11080100, 0x11080500, + 0x10080100, 0x10080500, 0x11080100, 0x11080500, + 0x00000008, 0x00000408, 0x01000008, 0x01000408, + 0x00000008, 0x00000408, 0x01000008, 0x01000408, + 0x00000108, 0x00000508, 0x01000108, 0x01000508, + 0x00000108, 0x00000508, 0x01000108, 0x01000508, + 0x10000008, 0x10000408, 0x11000008, 0x11000408, + 0x10000008, 0x10000408, 0x11000008, 0x11000408, + 0x10000108, 0x10000508, 0x11000108, 0x11000508, + 0x10000108, 0x10000508, 0x11000108, 0x11000508, + 0x00080008, 0x00080408, 0x01080008, 0x01080408, + 0x00080008, 0x00080408, 0x01080008, 0x01080408, + 0x00080108, 0x00080508, 0x01080108, 0x01080508, + 0x00080108, 0x00080508, 0x01080108, 0x01080508, + 0x10080008, 0x10080408, 0x11080008, 0x11080408, + 0x10080008, 0x10080408, 0x11080008, 0x11080408, + 0x10080108, 0x10080508, 0x11080108, 0x11080508, + 0x10080108, 0x10080508, 0x11080108, 0x11080508, + 0x00001000, 0x00001400, 0x01001000, 0x01001400, + 0x00001000, 0x00001400, 0x01001000, 0x01001400, + 0x00001100, 0x00001500, 0x01001100, 0x01001500, + 0x00001100, 0x00001500, 0x01001100, 0x01001500, + 0x10001000, 0x10001400, 0x11001000, 0x11001400, + 0x10001000, 0x10001400, 0x11001000, 0x11001400, + 0x10001100, 0x10001500, 0x11001100, 0x11001500, + 0x10001100, 0x10001500, 0x11001100, 0x11001500, + 0x00081000, 0x00081400, 0x01081000, 0x01081400, + 0x00081000, 0x00081400, 0x01081000, 0x01081400, + 0x00081100, 0x00081500, 0x01081100, 0x01081500, + 0x00081100, 0x00081500, 0x01081100, 0x01081500, + 0x10081000, 0x10081400, 0x11081000, 0x11081400, + 0x10081000, 0x10081400, 0x11081000, 0x11081400, + 0x10081100, 0x10081500, 0x11081100, 0x11081500, + 0x10081100, 0x10081500, 0x11081100, 0x11081500, + 0x00001008, 0x00001408, 0x01001008, 0x01001408, + 0x00001008, 0x00001408, 0x01001008, 0x01001408, + 0x00001108, 0x00001508, 0x01001108, 0x01001508, + 0x00001108, 0x00001508, 0x01001108, 0x01001508, + 0x10001008, 0x10001408, 0x11001008, 0x11001408, + 0x10001008, 0x10001408, 0x11001008, 0x11001408, + 0x10001108, 0x10001508, 0x11001108, 0x11001508, + 0x10001108, 0x10001508, 0x11001108, 0x11001508, + 0x00081008, 0x00081408, 0x01081008, 0x01081408, + 0x00081008, 0x00081408, 0x01081008, 0x01081408, + 0x00081108, 0x00081508, 0x01081108, 0x01081508, + 0x00081108, 0x00081508, 0x01081108, 0x01081508, + 0x10081008, 0x10081408, 0x11081008, 0x11081408, + 0x10081008, 0x10081408, 0x11081008, 0x11081408, + 0x10081108, 0x10081508, 0x11081108, 0x11081508, + 0x10081108, 0x10081508, 0x11081108, 0x11081508 + ); + + $keys = array(); + for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) { + // pad the key and remove extra characters as appropriate. + $key = str_pad(substr($this->key, $des_round * 8, 8), 8, "\0"); + + // Perform the PC/1 transformation and compute C and D. + $t = unpack('Nl/Nr', $key); + list($l, $r) = array($t['l'], $t['r']); + $key = ($this->shuffle[$pc1map[ $r & 0xFF]] & "\x80\x80\x80\x80\x80\x80\x80\x00") | + ($this->shuffle[$pc1map[($r >> 8) & 0xFF]] & "\x40\x40\x40\x40\x40\x40\x40\x00") | + ($this->shuffle[$pc1map[($r >> 16) & 0xFF]] & "\x20\x20\x20\x20\x20\x20\x20\x00") | + ($this->shuffle[$pc1map[($r >> 24) & 0xFF]] & "\x10\x10\x10\x10\x10\x10\x10\x00") | + ($this->shuffle[$pc1map[ $l & 0xFF]] & "\x08\x08\x08\x08\x08\x08\x08\x00") | + ($this->shuffle[$pc1map[($l >> 8) & 0xFF]] & "\x04\x04\x04\x04\x04\x04\x04\x00") | + ($this->shuffle[$pc1map[($l >> 16) & 0xFF]] & "\x02\x02\x02\x02\x02\x02\x02\x00") | + ($this->shuffle[$pc1map[($l >> 24) & 0xFF]] & "\x01\x01\x01\x01\x01\x01\x01\x00"); + $key = unpack('Nc/Nd', $key); + $c = ( $key['c'] >> 4) & 0x0FFFFFFF; + $d = (($key['d'] >> 4) & 0x0FFFFFF0) | ($key['c'] & 0x0F); + + $keys[$des_round] = array( + CRYPT_DES_ENCRYPT => array(), + CRYPT_DES_DECRYPT => array_fill(0, 32, 0) + ); + for ($i = 0, $ki = 31; $i < 16; ++$i, $ki-= 2) { + $c <<= $shifts[$i]; + $c = ($c | ($c >> 28)) & 0x0FFFFFFF; + $d <<= $shifts[$i]; + $d = ($d | ($d >> 28)) & 0x0FFFFFFF; + + // Perform the PC-2 transformation. + $cp = $pc2mapc1[ $c >> 24 ] | $pc2mapc2[($c >> 16) & 0xFF] | + $pc2mapc3[($c >> 8) & 0xFF] | $pc2mapc4[ $c & 0xFF]; + $dp = $pc2mapd1[ $d >> 24 ] | $pc2mapd2[($d >> 16) & 0xFF] | + $pc2mapd3[($d >> 8) & 0xFF] | $pc2mapd4[ $d & 0xFF]; + + // Reorder: odd bytes/even bytes. Push the result in key schedule. + $val1 = ( $cp & 0xFF000000) | (($cp << 8) & 0x00FF0000) | + (($dp >> 16) & 0x0000FF00) | (($dp >> 8) & 0x000000FF); + $val2 = (($cp << 8) & 0xFF000000) | (($cp << 16) & 0x00FF0000) | + (($dp >> 8) & 0x0000FF00) | ( $dp & 0x000000FF); + $keys[$des_round][CRYPT_DES_ENCRYPT][ ] = $val1; + $keys[$des_round][CRYPT_DES_DECRYPT][$ki - 1] = $val1; + $keys[$des_round][CRYPT_DES_ENCRYPT][ ] = $val2; + $keys[$des_round][CRYPT_DES_DECRYPT][$ki ] = $val2; + } + } + + switch ($this->des_rounds) { + case 3: // 3DES keys + $this->keys = array( + CRYPT_DES_ENCRYPT => array_merge( + $keys[0][CRYPT_DES_ENCRYPT], + $keys[1][CRYPT_DES_DECRYPT], + $keys[2][CRYPT_DES_ENCRYPT] + ), + CRYPT_DES_DECRYPT => array_merge( + $keys[2][CRYPT_DES_DECRYPT], + $keys[1][CRYPT_DES_ENCRYPT], + $keys[0][CRYPT_DES_DECRYPT] + ) + ); + break; + // case 1: // DES keys + default: + $this->keys = array( + CRYPT_DES_ENCRYPT => $keys[0][CRYPT_DES_ENCRYPT], + CRYPT_DES_DECRYPT => $keys[0][CRYPT_DES_DECRYPT] + ); + } + } + + /** + * Setup the performance-optimized function for de/encrypt() + * + * @see Crypt_Base::_setupInlineCrypt() + * @access private + */ + function _setupInlineCrypt() + { + $lambda_functions =& Crypt_DES::_getLambdaFunctions(); + + // Engine configuration for: + // - DES ($des_rounds == 1) or + // - 3DES ($des_rounds == 3) + $des_rounds = $this->des_rounds; + + // We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function. + // After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one + $gen_hi_opt_code = (bool)( count($lambda_functions) < 10 ); + + // Generation of a uniqe hash for our generated code + switch (true) { + case $gen_hi_opt_code: + // For hi-optimized code, we create for each combination of + // $mode, $des_rounds and $this->key its own encrypt/decrypt function. + $code_hash = md5(str_pad("Crypt_DES, $des_rounds, {$this->mode}, ", 32, "\0") . $this->key); + break; + default: + // After max 10 hi-optimized functions, we create generic + // (still very fast.. but not ultra) functions for each $mode/$des_rounds + // Currently 2 * 5 generic functions will be then max. possible. + $code_hash = "Crypt_DES, $des_rounds, {$this->mode}"; + } + + // Is there a re-usable $lambda_functions in there? If not, we have to create it. + if (!isset($lambda_functions[$code_hash])) { + // Init code for both, encrypt and decrypt. + $init_crypt = 'static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip; + if (!$sbox1) { + $sbox1 = array_map("intval", $self->sbox1); + $sbox2 = array_map("intval", $self->sbox2); + $sbox3 = array_map("intval", $self->sbox3); + $sbox4 = array_map("intval", $self->sbox4); + $sbox5 = array_map("intval", $self->sbox5); + $sbox6 = array_map("intval", $self->sbox6); + $sbox7 = array_map("intval", $self->sbox7); + $sbox8 = array_map("intval", $self->sbox8);' + /* Merge $shuffle with $[inv]ipmap */ . ' + for ($i = 0; $i < 256; ++$i) { + $shuffleip[] = $self->shuffle[$self->ipmap[$i]]; + $shuffleinvip[] = $self->shuffle[$self->invipmap[$i]]; + } + } + '; + + switch (true) { + case $gen_hi_opt_code: + // In Hi-optimized code mode, we use our [3]DES key schedule as hardcoded integers. + // No futher initialisation of the $keys schedule is necessary. + // That is the extra performance boost. + $k = array( + CRYPT_DES_ENCRYPT => $this->keys[CRYPT_DES_ENCRYPT], + CRYPT_DES_DECRYPT => $this->keys[CRYPT_DES_DECRYPT] + ); + $init_encrypt = ''; + $init_decrypt = ''; + break; + default: + // In generic optimized code mode, we have to use, as the best compromise [currently], + // our key schedule as $ke/$kd arrays. (with hardcoded indexes...) + $k = array( + CRYPT_DES_ENCRYPT => array(), + CRYPT_DES_DECRYPT => array() + ); + for ($i = 0, $c = count($this->keys[CRYPT_DES_ENCRYPT]); $i < $c; ++$i) { + $k[CRYPT_DES_ENCRYPT][$i] = '$ke[' . $i . ']'; + $k[CRYPT_DES_DECRYPT][$i] = '$kd[' . $i . ']'; + } + $init_encrypt = '$ke = $self->keys[CRYPT_DES_ENCRYPT];'; + $init_decrypt = '$kd = $self->keys[CRYPT_DES_DECRYPT];'; + break; + } + + // Creating code for en- and decryption. + $crypt_block = array(); + foreach (array(CRYPT_DES_ENCRYPT, CRYPT_DES_DECRYPT) as $c) { + + /* Do the initial IP permutation. */ + $crypt_block[$c] = ' + $in = unpack("N*", $in); + $l = $in[1]; + $r = $in[2]; + $in = unpack("N*", + ($shuffleip[ $r & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | + ($shuffleip[($r >> 8) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | + ($shuffleip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | + ($shuffleip[($r >> 24) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | + ($shuffleip[ $l & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | + ($shuffleip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | + ($shuffleip[($l >> 16) & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | + ($shuffleip[($l >> 24) & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01") + ); + ' . /* Extract L0 and R0 */ ' + $l = $in[1]; + $r = $in[2]; + '; + + $l = '$l'; + $r = '$r'; + + // Perform DES or 3DES. + for ($ki = -1, $des_round = 0; $des_round < $des_rounds; ++$des_round) { + // Perform the 16 steps. + for ($i = 0; $i < 16; ++$i) { + // start of "the Feistel (F) function" - see the following URL: + // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png + // Merge key schedule. + $crypt_block[$c].= ' + $b1 = ((' . $r . ' >> 3) & 0x1FFFFFFF) ^ (' . $r . ' << 29) ^ ' . $k[$c][++$ki] . '; + $b2 = ((' . $r . ' >> 31) & 0x00000001) ^ (' . $r . ' << 1) ^ ' . $k[$c][++$ki] . ';' . + /* S-box indexing. */ + $l . ' = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^ + $sbox3[($b1 >> 16) & 0x3F] ^ $sbox4[($b2 >> 16) & 0x3F] ^ + $sbox5[($b1 >> 8) & 0x3F] ^ $sbox6[($b2 >> 8) & 0x3F] ^ + $sbox7[ $b1 & 0x3F] ^ $sbox8[ $b2 & 0x3F] ^ ' . $l . '; + '; + // end of "the Feistel (F) function" + + // swap L & R + list($l, $r) = array($r, $l); + } + list($l, $r) = array($r, $l); + } + + // Perform the inverse IP permutation. + $crypt_block[$c].= '$in = + ($shuffleinvip[($l >> 24) & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | + ($shuffleinvip[($r >> 24) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | + ($shuffleinvip[($l >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | + ($shuffleinvip[($r >> 16) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | + ($shuffleinvip[($l >> 8) & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | + ($shuffleinvip[($r >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | + ($shuffleinvip[ $l & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | + ($shuffleinvip[ $r & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01"); + '; + } + + // Creates the inline-crypt function + $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( + array( + 'init_crypt' => $init_crypt, + 'init_encrypt' => $init_encrypt, + 'init_decrypt' => $init_decrypt, + 'encrypt_block' => $crypt_block[CRYPT_DES_ENCRYPT], + 'decrypt_block' => $crypt_block[CRYPT_DES_DECRYPT] + ) + ); + } + + // Set the inline-crypt function as callback in: $this->inline_crypt + $this->inline_crypt = $lambda_functions[$code_hash]; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Hash.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Hash.php new file mode 100755 index 00000000..4ab75b2d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Hash.php @@ -0,0 +1,841 @@ + + * setKey('abcdefg'); + * + * echo base64_encode($hash->hash('abcdefg')); + * ?> + * + * + * LICENSE: 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. + * + * @category Crypt + * @package Crypt_Hash + * @author Jim Wigginton + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/**#@+ + * @access private + * @see Crypt_Hash::Crypt_Hash() + */ +/** + * Toggles the internal implementation + */ +define('CRYPT_HASH_MODE_INTERNAL', 1); +/** + * Toggles the mhash() implementation, which has been deprecated on PHP 5.3.0+. + */ +define('CRYPT_HASH_MODE_MHASH', 2); +/** + * Toggles the hash() implementation, which works on PHP 5.1.2+. + */ +define('CRYPT_HASH_MODE_HASH', 3); +/**#@-*/ + +/** + * Pure-PHP implementations of keyed-hash message authentication codes (HMACs) and various cryptographic hashing functions. + * + * @package Crypt_Hash + * @author Jim Wigginton + * @access public + */ +class Crypt_Hash +{ + /** + * Hash Parameter + * + * @see Crypt_Hash::setHash() + * @var Integer + * @access private + */ + var $hashParam; + + /** + * Byte-length of compression blocks / key (Internal HMAC) + * + * @see Crypt_Hash::setAlgorithm() + * @var Integer + * @access private + */ + var $b; + + /** + * Byte-length of hash output (Internal HMAC) + * + * @see Crypt_Hash::setHash() + * @var Integer + * @access private + */ + var $l = false; + + /** + * Hash Algorithm + * + * @see Crypt_Hash::setHash() + * @var String + * @access private + */ + var $hash; + + /** + * Key + * + * @see Crypt_Hash::setKey() + * @var String + * @access private + */ + var $key = false; + + /** + * Outer XOR (Internal HMAC) + * + * @see Crypt_Hash::setKey() + * @var String + * @access private + */ + var $opad; + + /** + * Inner XOR (Internal HMAC) + * + * @see Crypt_Hash::setKey() + * @var String + * @access private + */ + var $ipad; + + /** + * Default Constructor. + * + * @param optional String $hash + * @return Crypt_Hash + * @access public + */ + function Crypt_Hash($hash = 'sha1') + { + if ( !defined('CRYPT_HASH_MODE') ) { + switch (true) { + case extension_loaded('hash'): + define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_HASH); + break; + case extension_loaded('mhash'): + define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_MHASH); + break; + default: + define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_INTERNAL); + } + } + + $this->setHash($hash); + } + + /** + * Sets the key for HMACs + * + * Keys can be of any length. + * + * @access public + * @param optional String $key + */ + function setKey($key = false) + { + $this->key = $key; + } + + /** + * Gets the hash function. + * + * As set by the constructor or by the setHash() method. + * + * @access public + * @return String + */ + function getHash() + { + return $this->hashParam; + } + + /** + * Sets the hash function. + * + * @access public + * @param String $hash + */ + function setHash($hash) + { + $this->hashParam = $hash = strtolower($hash); + switch ($hash) { + case 'md5-96': + case 'sha1-96': + case 'sha256-96': + case 'sha512-96': + $hash = substr($hash, 0, -3); + $this->l = 12; // 96 / 8 = 12 + break; + case 'md2': + case 'md5': + $this->l = 16; + break; + case 'sha1': + $this->l = 20; + break; + case 'sha256': + $this->l = 32; + break; + case 'sha384': + $this->l = 48; + break; + case 'sha512': + $this->l = 64; + } + + switch ($hash) { + case 'md2': + $mode = CRYPT_HASH_MODE == CRYPT_HASH_MODE_HASH && in_array('md2', hash_algos()) ? + CRYPT_HASH_MODE_HASH : CRYPT_HASH_MODE_INTERNAL; + break; + case 'sha384': + case 'sha512': + $mode = CRYPT_HASH_MODE == CRYPT_HASH_MODE_MHASH ? CRYPT_HASH_MODE_INTERNAL : CRYPT_HASH_MODE; + break; + default: + $mode = CRYPT_HASH_MODE; + } + + switch ( $mode ) { + case CRYPT_HASH_MODE_MHASH: + switch ($hash) { + case 'md5': + $this->hash = MHASH_MD5; + break; + case 'sha256': + $this->hash = MHASH_SHA256; + break; + case 'sha1': + default: + $this->hash = MHASH_SHA1; + } + return; + case CRYPT_HASH_MODE_HASH: + switch ($hash) { + case 'md5': + $this->hash = 'md5'; + return; + case 'md2': + case 'sha256': + case 'sha384': + case 'sha512': + $this->hash = $hash; + return; + case 'sha1': + default: + $this->hash = 'sha1'; + } + return; + } + + switch ($hash) { + case 'md2': + $this->b = 16; + $this->hash = array($this, '_md2'); + break; + case 'md5': + $this->b = 64; + $this->hash = array($this, '_md5'); + break; + case 'sha256': + $this->b = 64; + $this->hash = array($this, '_sha256'); + break; + case 'sha384': + case 'sha512': + $this->b = 128; + $this->hash = array($this, '_sha512'); + break; + case 'sha1': + default: + $this->b = 64; + $this->hash = array($this, '_sha1'); + } + + $this->ipad = str_repeat(chr(0x36), $this->b); + $this->opad = str_repeat(chr(0x5C), $this->b); + } + + /** + * Compute the HMAC. + * + * @access public + * @param String $text + * @return String + */ + function hash($text) + { + $mode = is_array($this->hash) ? CRYPT_HASH_MODE_INTERNAL : CRYPT_HASH_MODE; + + if (!empty($this->key) || is_string($this->key)) { + switch ( $mode ) { + case CRYPT_HASH_MODE_MHASH: + $output = mhash($this->hash, $text, $this->key); + break; + case CRYPT_HASH_MODE_HASH: + $output = hash_hmac($this->hash, $text, $this->key, true); + break; + case CRYPT_HASH_MODE_INTERNAL: + /* "Applications that use keys longer than B bytes will first hash the key using H and then use the + resultant L byte string as the actual key to HMAC." + + -- http://tools.ietf.org/html/rfc2104#section-2 */ + $key = strlen($this->key) > $this->b ? call_user_func($this->hash, $this->key) : $this->key; + + $key = str_pad($key, $this->b, chr(0)); // step 1 + $temp = $this->ipad ^ $key; // step 2 + $temp .= $text; // step 3 + $temp = call_user_func($this->hash, $temp); // step 4 + $output = $this->opad ^ $key; // step 5 + $output.= $temp; // step 6 + $output = call_user_func($this->hash, $output); // step 7 + } + } else { + switch ( $mode ) { + case CRYPT_HASH_MODE_MHASH: + $output = mhash($this->hash, $text); + break; + case CRYPT_HASH_MODE_HASH: + $output = hash($this->hash, $text, true); + break; + case CRYPT_HASH_MODE_INTERNAL: + $output = call_user_func($this->hash, $text); + } + } + + return substr($output, 0, $this->l); + } + + /** + * Returns the hash length (in bytes) + * + * @access public + * @return Integer + */ + function getLength() + { + return $this->l; + } + + /** + * Wrapper for MD5 + * + * @access private + * @param String $m + */ + function _md5($m) + { + return pack('H*', md5($m)); + } + + /** + * Wrapper for SHA1 + * + * @access private + * @param String $m + */ + function _sha1($m) + { + return pack('H*', sha1($m)); + } + + /** + * Pure-PHP implementation of MD2 + * + * See {@link http://tools.ietf.org/html/rfc1319 RFC1319}. + * + * @access private + * @param String $m + */ + function _md2($m) + { + static $s = array( + 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6, + 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188, + 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24, + 138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251, + 245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63, + 148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50, + 39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165, + 181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210, + 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157, + 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27, + 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15, + 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197, + 234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65, + 129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123, + 8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233, + 203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228, + 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237, + 31, 26, 219, 153, 141, 51, 159, 17, 131, 20 + ); + + // Step 1. Append Padding Bytes + $pad = 16 - (strlen($m) & 0xF); + $m.= str_repeat(chr($pad), $pad); + + $length = strlen($m); + + // Step 2. Append Checksum + $c = str_repeat(chr(0), 16); + $l = chr(0); + for ($i = 0; $i < $length; $i+= 16) { + for ($j = 0; $j < 16; $j++) { + // RFC1319 incorrectly states that C[j] should be set to S[c xor L] + //$c[$j] = chr($s[ord($m[$i + $j] ^ $l)]); + // per , however, C[j] should be set to S[c xor L] xor C[j] + $c[$j] = chr($s[ord($m[$i + $j] ^ $l)] ^ ord($c[$j])); + $l = $c[$j]; + } + } + $m.= $c; + + $length+= 16; + + // Step 3. Initialize MD Buffer + $x = str_repeat(chr(0), 48); + + // Step 4. Process Message in 16-Byte Blocks + for ($i = 0; $i < $length; $i+= 16) { + for ($j = 0; $j < 16; $j++) { + $x[$j + 16] = $m[$i + $j]; + $x[$j + 32] = $x[$j + 16] ^ $x[$j]; + } + $t = chr(0); + for ($j = 0; $j < 18; $j++) { + for ($k = 0; $k < 48; $k++) { + $x[$k] = $t = $x[$k] ^ chr($s[ord($t)]); + //$t = $x[$k] = $x[$k] ^ chr($s[ord($t)]); + } + $t = chr(ord($t) + $j); + } + } + + // Step 5. Output + return substr($x, 0, 16); + } + + /** + * Pure-PHP implementation of SHA256 + * + * See {@link http://en.wikipedia.org/wiki/SHA_hash_functions#SHA-256_.28a_SHA-2_variant.29_pseudocode SHA-256 (a SHA-2 variant) pseudocode - Wikipedia}. + * + * @access private + * @param String $m + */ + function _sha256($m) + { + if (extension_loaded('suhosin')) { + return pack('H*', sha256($m)); + } + + // Initialize variables + $hash = array( + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 + ); + // Initialize table of round constants + // (first 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311) + static $k = array( + 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 + ); + + // Pre-processing + $length = strlen($m); + // to round to nearest 56 mod 64, we'll add 64 - (length + (64 - 56)) % 64 + $m.= str_repeat(chr(0), 64 - (($length + 8) & 0x3F)); + $m[$length] = chr(0x80); + // we don't support hashing strings 512MB long + $m.= pack('N2', 0, $length << 3); + + // Process the message in successive 512-bit chunks + $chunks = str_split($m, 64); + foreach ($chunks as $chunk) { + $w = array(); + for ($i = 0; $i < 16; $i++) { + extract(unpack('Ntemp', $this->_string_shift($chunk, 4))); + $w[] = $temp; + } + + // Extend the sixteen 32-bit words into sixty-four 32-bit words + for ($i = 16; $i < 64; $i++) { + $s0 = $this->_rightRotate($w[$i - 15], 7) ^ + $this->_rightRotate($w[$i - 15], 18) ^ + $this->_rightShift( $w[$i - 15], 3); + $s1 = $this->_rightRotate($w[$i - 2], 17) ^ + $this->_rightRotate($w[$i - 2], 19) ^ + $this->_rightShift( $w[$i - 2], 10); + $w[$i] = $this->_add($w[$i - 16], $s0, $w[$i - 7], $s1); + + } + + // Initialize hash value for this chunk + list($a, $b, $c, $d, $e, $f, $g, $h) = $hash; + + // Main loop + for ($i = 0; $i < 64; $i++) { + $s0 = $this->_rightRotate($a, 2) ^ + $this->_rightRotate($a, 13) ^ + $this->_rightRotate($a, 22); + $maj = ($a & $b) ^ + ($a & $c) ^ + ($b & $c); + $t2 = $this->_add($s0, $maj); + + $s1 = $this->_rightRotate($e, 6) ^ + $this->_rightRotate($e, 11) ^ + $this->_rightRotate($e, 25); + $ch = ($e & $f) ^ + ($this->_not($e) & $g); + $t1 = $this->_add($h, $s1, $ch, $k[$i], $w[$i]); + + $h = $g; + $g = $f; + $f = $e; + $e = $this->_add($d, $t1); + $d = $c; + $c = $b; + $b = $a; + $a = $this->_add($t1, $t2); + } + + // Add this chunk's hash to result so far + $hash = array( + $this->_add($hash[0], $a), + $this->_add($hash[1], $b), + $this->_add($hash[2], $c), + $this->_add($hash[3], $d), + $this->_add($hash[4], $e), + $this->_add($hash[5], $f), + $this->_add($hash[6], $g), + $this->_add($hash[7], $h) + ); + } + + // Produce the final hash value (big-endian) + return pack('N8', $hash[0], $hash[1], $hash[2], $hash[3], $hash[4], $hash[5], $hash[6], $hash[7]); + } + + /** + * Pure-PHP implementation of SHA384 and SHA512 + * + * @access private + * @param String $m + */ + function _sha512($m) + { + if (!class_exists('Math_BigInteger')) { + include_once 'Math/BigInteger.php'; + } + + static $init384, $init512, $k; + + if (!isset($k)) { + // Initialize variables + $init384 = array( // initial values for SHA384 + 'cbbb9d5dc1059ed8', '629a292a367cd507', '9159015a3070dd17', '152fecd8f70e5939', + '67332667ffc00b31', '8eb44a8768581511', 'db0c2e0d64f98fa7', '47b5481dbefa4fa4' + ); + $init512 = array( // initial values for SHA512 + '6a09e667f3bcc908', 'bb67ae8584caa73b', '3c6ef372fe94f82b', 'a54ff53a5f1d36f1', + '510e527fade682d1', '9b05688c2b3e6c1f', '1f83d9abfb41bd6b', '5be0cd19137e2179' + ); + + for ($i = 0; $i < 8; $i++) { + $init384[$i] = new Math_BigInteger($init384[$i], 16); + $init384[$i]->setPrecision(64); + $init512[$i] = new Math_BigInteger($init512[$i], 16); + $init512[$i]->setPrecision(64); + } + + // Initialize table of round constants + // (first 64 bits of the fractional parts of the cube roots of the first 80 primes 2..409) + $k = array( + '428a2f98d728ae22', '7137449123ef65cd', 'b5c0fbcfec4d3b2f', 'e9b5dba58189dbbc', + '3956c25bf348b538', '59f111f1b605d019', '923f82a4af194f9b', 'ab1c5ed5da6d8118', + 'd807aa98a3030242', '12835b0145706fbe', '243185be4ee4b28c', '550c7dc3d5ffb4e2', + '72be5d74f27b896f', '80deb1fe3b1696b1', '9bdc06a725c71235', 'c19bf174cf692694', + 'e49b69c19ef14ad2', 'efbe4786384f25e3', '0fc19dc68b8cd5b5', '240ca1cc77ac9c65', + '2de92c6f592b0275', '4a7484aa6ea6e483', '5cb0a9dcbd41fbd4', '76f988da831153b5', + '983e5152ee66dfab', 'a831c66d2db43210', 'b00327c898fb213f', 'bf597fc7beef0ee4', + 'c6e00bf33da88fc2', 'd5a79147930aa725', '06ca6351e003826f', '142929670a0e6e70', + '27b70a8546d22ffc', '2e1b21385c26c926', '4d2c6dfc5ac42aed', '53380d139d95b3df', + '650a73548baf63de', '766a0abb3c77b2a8', '81c2c92e47edaee6', '92722c851482353b', + 'a2bfe8a14cf10364', 'a81a664bbc423001', 'c24b8b70d0f89791', 'c76c51a30654be30', + 'd192e819d6ef5218', 'd69906245565a910', 'f40e35855771202a', '106aa07032bbd1b8', + '19a4c116b8d2d0c8', '1e376c085141ab53', '2748774cdf8eeb99', '34b0bcb5e19b48a8', + '391c0cb3c5c95a63', '4ed8aa4ae3418acb', '5b9cca4f7763e373', '682e6ff3d6b2b8a3', + '748f82ee5defb2fc', '78a5636f43172f60', '84c87814a1f0ab72', '8cc702081a6439ec', + '90befffa23631e28', 'a4506cebde82bde9', 'bef9a3f7b2c67915', 'c67178f2e372532b', + 'ca273eceea26619c', 'd186b8c721c0c207', 'eada7dd6cde0eb1e', 'f57d4f7fee6ed178', + '06f067aa72176fba', '0a637dc5a2c898a6', '113f9804bef90dae', '1b710b35131c471b', + '28db77f523047d84', '32caab7b40c72493', '3c9ebe0a15c9bebc', '431d67c49c100d4c', + '4cc5d4becb3e42b6', '597f299cfc657e2a', '5fcb6fab3ad6faec', '6c44198c4a475817' + ); + + for ($i = 0; $i < 80; $i++) { + $k[$i] = new Math_BigInteger($k[$i], 16); + } + } + + $hash = $this->l == 48 ? $init384 : $init512; + + // Pre-processing + $length = strlen($m); + // to round to nearest 112 mod 128, we'll add 128 - (length + (128 - 112)) % 128 + $m.= str_repeat(chr(0), 128 - (($length + 16) & 0x7F)); + $m[$length] = chr(0x80); + // we don't support hashing strings 512MB long + $m.= pack('N4', 0, 0, 0, $length << 3); + + // Process the message in successive 1024-bit chunks + $chunks = str_split($m, 128); + foreach ($chunks as $chunk) { + $w = array(); + for ($i = 0; $i < 16; $i++) { + $temp = new Math_BigInteger($this->_string_shift($chunk, 8), 256); + $temp->setPrecision(64); + $w[] = $temp; + } + + // Extend the sixteen 32-bit words into eighty 32-bit words + for ($i = 16; $i < 80; $i++) { + $temp = array( + $w[$i - 15]->bitwise_rightRotate(1), + $w[$i - 15]->bitwise_rightRotate(8), + $w[$i - 15]->bitwise_rightShift(7) + ); + $s0 = $temp[0]->bitwise_xor($temp[1]); + $s0 = $s0->bitwise_xor($temp[2]); + $temp = array( + $w[$i - 2]->bitwise_rightRotate(19), + $w[$i - 2]->bitwise_rightRotate(61), + $w[$i - 2]->bitwise_rightShift(6) + ); + $s1 = $temp[0]->bitwise_xor($temp[1]); + $s1 = $s1->bitwise_xor($temp[2]); + $w[$i] = $w[$i - 16]->copy(); + $w[$i] = $w[$i]->add($s0); + $w[$i] = $w[$i]->add($w[$i - 7]); + $w[$i] = $w[$i]->add($s1); + } + + // Initialize hash value for this chunk + $a = $hash[0]->copy(); + $b = $hash[1]->copy(); + $c = $hash[2]->copy(); + $d = $hash[3]->copy(); + $e = $hash[4]->copy(); + $f = $hash[5]->copy(); + $g = $hash[6]->copy(); + $h = $hash[7]->copy(); + + // Main loop + for ($i = 0; $i < 80; $i++) { + $temp = array( + $a->bitwise_rightRotate(28), + $a->bitwise_rightRotate(34), + $a->bitwise_rightRotate(39) + ); + $s0 = $temp[0]->bitwise_xor($temp[1]); + $s0 = $s0->bitwise_xor($temp[2]); + $temp = array( + $a->bitwise_and($b), + $a->bitwise_and($c), + $b->bitwise_and($c) + ); + $maj = $temp[0]->bitwise_xor($temp[1]); + $maj = $maj->bitwise_xor($temp[2]); + $t2 = $s0->add($maj); + + $temp = array( + $e->bitwise_rightRotate(14), + $e->bitwise_rightRotate(18), + $e->bitwise_rightRotate(41) + ); + $s1 = $temp[0]->bitwise_xor($temp[1]); + $s1 = $s1->bitwise_xor($temp[2]); + $temp = array( + $e->bitwise_and($f), + $g->bitwise_and($e->bitwise_not()) + ); + $ch = $temp[0]->bitwise_xor($temp[1]); + $t1 = $h->add($s1); + $t1 = $t1->add($ch); + $t1 = $t1->add($k[$i]); + $t1 = $t1->add($w[$i]); + + $h = $g->copy(); + $g = $f->copy(); + $f = $e->copy(); + $e = $d->add($t1); + $d = $c->copy(); + $c = $b->copy(); + $b = $a->copy(); + $a = $t1->add($t2); + } + + // Add this chunk's hash to result so far + $hash = array( + $hash[0]->add($a), + $hash[1]->add($b), + $hash[2]->add($c), + $hash[3]->add($d), + $hash[4]->add($e), + $hash[5]->add($f), + $hash[6]->add($g), + $hash[7]->add($h) + ); + } + + // Produce the final hash value (big-endian) + // (Crypt_Hash::hash() trims the output for hashes but not for HMACs. as such, we trim the output here) + $temp = $hash[0]->toBytes() . $hash[1]->toBytes() . $hash[2]->toBytes() . $hash[3]->toBytes() . + $hash[4]->toBytes() . $hash[5]->toBytes(); + if ($this->l != 48) { + $temp.= $hash[6]->toBytes() . $hash[7]->toBytes(); + } + + return $temp; + } + + /** + * Right Rotate + * + * @access private + * @param Integer $int + * @param Integer $amt + * @see _sha256() + * @return Integer + */ + function _rightRotate($int, $amt) + { + $invamt = 32 - $amt; + $mask = (1 << $invamt) - 1; + return (($int << $invamt) & 0xFFFFFFFF) | (($int >> $amt) & $mask); + } + + /** + * Right Shift + * + * @access private + * @param Integer $int + * @param Integer $amt + * @see _sha256() + * @return Integer + */ + function _rightShift($int, $amt) + { + $mask = (1 << (32 - $amt)) - 1; + return ($int >> $amt) & $mask; + } + + /** + * Not + * + * @access private + * @param Integer $int + * @see _sha256() + * @return Integer + */ + function _not($int) + { + return ~$int & 0xFFFFFFFF; + } + + /** + * Add + * + * _sha256() adds multiple unsigned 32-bit integers. Since PHP doesn't support unsigned integers and since the + * possibility of overflow exists, care has to be taken. Math_BigInteger() could be used but this should be faster. + * + * @param Integer $... + * @return Integer + * @see _sha256() + * @access private + */ + function _add() + { + static $mod; + if (!isset($mod)) { + $mod = pow(2, 32); + } + + $result = 0; + $arguments = func_get_args(); + foreach ($arguments as $argument) { + $result+= $argument < 0 ? ($argument & 0x7FFFFFFF) + 0x80000000 : $argument; + } + + return fmod($result, $mod); + } + + /** + * String Shift + * + * Inspired by array_shift + * + * @param String $string + * @param optional Integer $index + * @return String + * @access private + */ + function _string_shift(&$string, $index = 1) + { + $substr = substr($string, 0, $index); + $string = substr($string, $index); + return $substr; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RC2.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RC2.php new file mode 100755 index 00000000..96c9f18c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RC2.php @@ -0,0 +1,652 @@ + + * setKey('abcdefgh'); + * + * $plaintext = str_repeat('a', 1024); + * + * echo $rc2->decrypt($rc2->encrypt($plaintext)); + * ?> + * + * + * LICENSE: 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. + * + * @category Crypt + * @package Crypt_RC2 + * @author Patrick Monnerat + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Base + * + * Base cipher class + */ +if (!class_exists('Crypt_Base')) { + include_once 'Base.php'; +} + +/**#@+ + * @access public + * @see Crypt_RC2::encrypt() + * @see Crypt_RC2::decrypt() + */ +/** + * Encrypt / decrypt using the Counter mode. + * + * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 + */ +define('CRYPT_RC2_MODE_CTR', CRYPT_MODE_CTR); +/** + * Encrypt / decrypt using the Electronic Code Book mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 + */ +define('CRYPT_RC2_MODE_ECB', CRYPT_MODE_ECB); +/** + * Encrypt / decrypt using the Code Book Chaining mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 + */ +define('CRYPT_RC2_MODE_CBC', CRYPT_MODE_CBC); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 + */ +define('CRYPT_RC2_MODE_CFB', CRYPT_MODE_CFB); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 + */ +define('CRYPT_RC2_MODE_OFB', CRYPT_MODE_OFB); +/**#@-*/ + +/**#@+ + * @access private + * @see Crypt_RC2::Crypt_RC2() + */ +/** + * Toggles the internal implementation + */ +define('CRYPT_RC2_MODE_INTERNAL', CRYPT_MODE_INTERNAL); +/** + * Toggles the mcrypt implementation + */ +define('CRYPT_RC2_MODE_MCRYPT', CRYPT_MODE_MCRYPT); +/**#@-*/ + +/** + * Pure-PHP implementation of RC2. + * + * @package Crypt_RC2 + * @access public + */ +class Crypt_RC2 extends Crypt_Base +{ + /** + * Block Length of the cipher + * + * @see Crypt_Base::block_size + * @var Integer + * @access private + */ + var $block_size = 8; + + /** + * The Key + * + * @see Crypt_Base::key + * @see setKey() + * @var String + * @access private + */ + var $key = "\0"; + + /** + * The default password key_size used by setPassword() + * + * @see Crypt_Base::password_key_size + * @see Crypt_Base::setPassword() + * @var Integer + * @access private + */ + var $password_key_size = 16; // = 128 bits + + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_Base::const_namespace + * @var String + * @access private + */ + var $const_namespace = 'RC2'; + + /** + * The mcrypt specific name of the cipher + * + * @see Crypt_Base::cipher_name_mcrypt + * @var String + * @access private + */ + var $cipher_name_mcrypt = 'rc2'; + + /** + * Optimizing value while CFB-encrypting + * + * @see Crypt_Base::cfb_init_len + * @var Integer + * @access private + */ + var $cfb_init_len = 500; + + /** + * The key length in bits. + * + * @see Crypt_RC2::setKeyLength() + * @see Crypt_RC2::setKey() + * @var Integer + * @access private + * @internal Should be in range [1..1024]. + * @internal Changing this value after setting the key has no effect. + */ + var $default_key_length = 1024; + + /** + * The Key Schedule + * + * @see Crypt_RC2::_setupKey() + * @var Array + * @access private + */ + var $keys; + + /** + * Key expansion randomization table. + * Twice the same 256-value sequence to save a modulus in key expansion. + * + * @see Crypt_RC2::setKey() + * @var Array + * @access private + */ + var $pitable = array( + 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED, + 0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D, + 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E, + 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2, + 0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13, + 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32, + 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B, + 0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82, + 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C, + 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC, + 0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1, + 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26, + 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57, + 0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03, + 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7, + 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7, + 0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7, + 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A, + 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74, + 0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC, + 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC, + 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39, + 0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A, + 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31, + 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE, + 0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9, + 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C, + 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9, + 0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0, + 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E, + 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77, + 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD, + 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED, + 0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D, + 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E, + 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2, + 0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13, + 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32, + 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B, + 0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82, + 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C, + 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC, + 0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1, + 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26, + 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57, + 0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03, + 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7, + 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7, + 0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7, + 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A, + 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74, + 0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC, + 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC, + 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39, + 0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A, + 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31, + 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE, + 0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9, + 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C, + 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9, + 0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0, + 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E, + 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77, + 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD + ); + + /** + * Inverse key expansion randomization table. + * + * @see Crypt_RC2::setKey() + * @var Array + * @access private + */ + var $invpitable = array( + 0xD1, 0xDA, 0xB9, 0x6F, 0x9C, 0xC8, 0x78, 0x66, + 0x80, 0x2C, 0xF8, 0x37, 0xEA, 0xE0, 0x62, 0xA4, + 0xCB, 0x71, 0x50, 0x27, 0x4B, 0x95, 0xD9, 0x20, + 0x9D, 0x04, 0x91, 0xE3, 0x47, 0x6A, 0x7E, 0x53, + 0xFA, 0x3A, 0x3B, 0xB4, 0xA8, 0xBC, 0x5F, 0x68, + 0x08, 0xCA, 0x8F, 0x14, 0xD7, 0xC0, 0xEF, 0x7B, + 0x5B, 0xBF, 0x2F, 0xE5, 0xE2, 0x8C, 0xBA, 0x12, + 0xE1, 0xAF, 0xB2, 0x54, 0x5D, 0x59, 0x76, 0xDB, + 0x32, 0xA2, 0x58, 0x6E, 0x1C, 0x29, 0x64, 0xF3, + 0xE9, 0x96, 0x0C, 0x98, 0x19, 0x8D, 0x3E, 0x26, + 0xAB, 0xA5, 0x85, 0x16, 0x40, 0xBD, 0x49, 0x67, + 0xDC, 0x22, 0x94, 0xBB, 0x3C, 0xC1, 0x9B, 0xEB, + 0x45, 0x28, 0x18, 0xD8, 0x1A, 0x42, 0x7D, 0xCC, + 0xFB, 0x65, 0x8E, 0x3D, 0xCD, 0x2A, 0xA3, 0x60, + 0xAE, 0x93, 0x8A, 0x48, 0x97, 0x51, 0x15, 0xF7, + 0x01, 0x0B, 0xB7, 0x36, 0xB1, 0x2E, 0x11, 0xFD, + 0x84, 0x2D, 0x3F, 0x13, 0x88, 0xB3, 0x34, 0x24, + 0x1B, 0xDE, 0xC5, 0x1D, 0x4D, 0x2B, 0x17, 0x31, + 0x74, 0xA9, 0xC6, 0x43, 0x6D, 0x39, 0x90, 0xBE, + 0xC3, 0xB0, 0x21, 0x6B, 0xF6, 0x0F, 0xD5, 0x99, + 0x0D, 0xAC, 0x1F, 0x5C, 0x9E, 0xF5, 0xF9, 0x4C, + 0xD6, 0xDF, 0x89, 0xE4, 0x8B, 0xFF, 0xC7, 0xAA, + 0xE7, 0xED, 0x46, 0x25, 0xB6, 0x06, 0x5E, 0x35, + 0xB5, 0xEC, 0xCE, 0xE8, 0x6C, 0x30, 0x55, 0x61, + 0x4A, 0xFE, 0xA0, 0x79, 0x03, 0xF0, 0x10, 0x72, + 0x7C, 0xCF, 0x52, 0xA6, 0xA7, 0xEE, 0x44, 0xD3, + 0x9A, 0x57, 0x92, 0xD0, 0x5A, 0x7A, 0x41, 0x7F, + 0x0E, 0x00, 0x63, 0xF2, 0x4F, 0x05, 0x83, 0xC9, + 0xA1, 0xD4, 0xDD, 0xC4, 0x56, 0xF4, 0xD2, 0x77, + 0x81, 0x09, 0x82, 0x33, 0x9F, 0x07, 0x86, 0x75, + 0x38, 0x4E, 0x69, 0xF1, 0xAD, 0x23, 0x73, 0x87, + 0x70, 0x02, 0xC2, 0x1E, 0xB8, 0x0A, 0xFC, 0xE6 + ); + + /** + * Default Constructor. + * + * Determines whether or not the mcrypt extension should be used. + * + * $mode could be: + * + * - CRYPT_RC2_MODE_ECB + * + * - CRYPT_RC2_MODE_CBC + * + * - CRYPT_RC2_MODE_CTR + * + * - CRYPT_RC2_MODE_CFB + * + * - CRYPT_RC2_MODE_OFB + * + * If not explicitly set, CRYPT_RC2_MODE_CBC will be used. + * + * @see Crypt_Base::Crypt_Base() + * @param optional Integer $mode + * @access public + */ + function Crypt_RC2($mode = CRYPT_RC2_MODE_CBC) + { + parent::Crypt_Base($mode); + $this->setKey(''); + } + + /** + * Sets the key length + * + * Valid key lengths are 1 to 1024. + * Calling this function after setting the key has no effect until the next + * Crypt_RC2::setKey() call. + * + * @access public + * @param Integer $length in bits + */ + function setKeyLength($length) + { + if ($length >= 1 && $length <= 1024) { + $this->default_key_length = $length; + } + } + + /** + * Sets the key. + * + * Keys can be of any length. RC2, itself, uses 1 to 1024 bit keys (eg. + * strlen($key) <= 128), however, we only use the first 128 bytes if $key + * has more then 128 bytes in it, and set $key to a single null byte if + * it is empty. + * + * If the key is not explicitly set, it'll be assumed to be a single + * null byte. + * + * @see Crypt_Base::setKey() + * @access public + * @param String $key + * @param Integer $t1 optional Effective key length in bits. + */ + function setKey($key, $t1 = 0) + { + if ($t1 <= 0) { + $t1 = $this->default_key_length; + } else if ($t1 > 1024) { + $t1 = 1024; + } + // Key byte count should be 1..128. + $key = strlen($key) ? substr($key, 0, 128) : "\x00"; + $t = strlen($key); + + // The mcrypt RC2 implementation only supports effective key length + // of 1024 bits. It is however possible to handle effective key + // lengths in range 1..1024 by expanding the key and applying + // inverse pitable mapping to the first byte before submitting it + // to mcrypt. + + // Key expansion. + $l = array_values(unpack('C*', $key)); + $t8 = ($t1 + 7) >> 3; + $tm = 0xFF >> (8 * $t8 - $t1); + + // Expand key. + $pitable = $this->pitable; + for ($i = $t; $i < 128; $i++) { + $l[$i] = $pitable[$l[$i - 1] + $l[$i - $t]]; + } + $i = 128 - $t8; + $l[$i] = $pitable[$l[$i] & $tm]; + while ($i--) { + $l[$i] = $pitable[$l[$i + 1] ^ $l[$i + $t8]]; + } + + // Prepare the key for mcrypt. + $l[0] = $this->invpitable[$l[0]]; + array_unshift($l, 'C*'); + parent::setKey(call_user_func_array('pack', $l)); + } + + /** + * Encrypts a block + * + * @see Crypt_Base::_encryptBlock() + * @see Crypt_Base::encrypt() + * @access private + * @param String $in + * @return String + */ + function _encryptBlock($in) + { + list($r0, $r1, $r2, $r3) = array_values(unpack('v*', $in)); + $keys = $this->keys; + $limit = 20; + $actions = array($limit => 44, 44 => 64); + $j = 0; + + for (;;) { + // Mixing round. + $r0 = (($r0 + $keys[$j++] + ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF) << 1; + $r0 |= $r0 >> 16; + $r1 = (($r1 + $keys[$j++] + ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF) << 2; + $r1 |= $r1 >> 16; + $r2 = (($r2 + $keys[$j++] + ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF) << 3; + $r2 |= $r2 >> 16; + $r3 = (($r3 + $keys[$j++] + ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF) << 5; + $r3 |= $r3 >> 16; + + if ($j === $limit) { + if ($limit === 64) { + break; + } + + // Mashing round. + $r0 += $keys[$r3 & 0x3F]; + $r1 += $keys[$r0 & 0x3F]; + $r2 += $keys[$r1 & 0x3F]; + $r3 += $keys[$r2 & 0x3F]; + $limit = $actions[$limit]; + } + } + + return pack('vvvv', $r0, $r1, $r2, $r3); + } + + /** + * Decrypts a block + * + * @see Crypt_Base::_decryptBlock() + * @see Crypt_Base::decrypt() + * @access private + * @param String $in + * @return String + */ + function _decryptBlock($in) + { + list($r0, $r1, $r2, $r3) = array_values(unpack('v*', $in)); + $keys = $this->keys; + $limit = 44; + $actions = array($limit => 20, 20 => 0); + $j = 64; + + for (;;) { + // R-mixing round. + $r3 = ($r3 | ($r3 << 16)) >> 5; + $r3 = ($r3 - $keys[--$j] - ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF; + $r2 = ($r2 | ($r2 << 16)) >> 3; + $r2 = ($r2 - $keys[--$j] - ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF; + $r1 = ($r1 | ($r1 << 16)) >> 2; + $r1 = ($r1 - $keys[--$j] - ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF; + $r0 = ($r0 | ($r0 << 16)) >> 1; + $r0 = ($r0 - $keys[--$j] - ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF; + + if ($j === $limit) { + if ($limit === 0) { + break; + } + + // R-mashing round. + $r3 = ($r3 - $keys[$r2 & 0x3F]) & 0xFFFF; + $r2 = ($r2 - $keys[$r1 & 0x3F]) & 0xFFFF; + $r1 = ($r1 - $keys[$r0 & 0x3F]) & 0xFFFF; + $r0 = ($r0 - $keys[$r3 & 0x3F]) & 0xFFFF; + $limit = $actions[$limit]; + } + } + + return pack('vvvv', $r0, $r1, $r2, $r3); + } + + /** + * Creates the key schedule + * + * @see Crypt_Base::_setupKey() + * @access private + */ + function _setupKey() + { + // Key has already been expanded in Crypt_RC2::setKey(): + // Only the first value must be altered. + $l = unpack('Ca/Cb/v*', $this->key); + array_unshift($l, $this->pitable[$l['a']] | ($l['b'] << 8)); + unset($l['a']); + unset($l['b']); + $this->keys = $l; + } + + /** + * Setup the performance-optimized function for de/encrypt() + * + * @see Crypt_Base::_setupInlineCrypt() + * @access private + */ + function _setupInlineCrypt() + { + $lambda_functions = &Crypt_RC2::_getLambdaFunctions(); + + // The first 10 generated $lambda_functions will use the $keys hardcoded as integers + // for the mixing rounds, for better inline crypt performance [~20% faster]. + // But for memory reason we have to limit those ultra-optimized $lambda_functions to an amount of 10. + $keys = $this->keys; + if (count($lambda_functions) >= 10) { + foreach ($this->keys as $k => $v) { + $keys[$k] = '$keys[' . $k . ']'; + } + } + + $code_hash = md5(str_pad("Crypt_RC2, {$this->mode}, ", 32, "\0") . implode(',', $keys)); + + // Is there a re-usable $lambda_functions in there? + // If not, we have to create it. + if (!isset($lambda_functions[$code_hash])) { + // Init code for both, encrypt and decrypt. + $init_crypt = '$keys = $self->keys;'; + + // $in is the current 8 bytes block which has to be en/decrypt + $encrypt_block = $decrypt_block = ' + $in = unpack("v4", $in); + $r0 = $in[1]; + $r1 = $in[2]; + $r2 = $in[3]; + $r3 = $in[4]; + '; + + // Create code for encryption. + $limit = 20; + $actions = array($limit => 44, 44 => 64); + $j = 0; + + for (;;) { + // Mixing round. + $encrypt_block .= ' + $r0 = (($r0 + ' . $keys[$j++] . ' + + ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF) << 1; + $r0 |= $r0 >> 16; + $r1 = (($r1 + ' . $keys[$j++] . ' + + ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF) << 2; + $r1 |= $r1 >> 16; + $r2 = (($r2 + ' . $keys[$j++] . ' + + ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF) << 3; + $r2 |= $r2 >> 16; + $r3 = (($r3 + ' . $keys[$j++] . ' + + ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF) << 5; + $r3 |= $r3 >> 16;'; + + if ($j === $limit) { + if ($limit === 64) { + break; + } + + // Mashing round. + $encrypt_block .= ' + $r0 += $keys[$r3 & 0x3F]; + $r1 += $keys[$r0 & 0x3F]; + $r2 += $keys[$r1 & 0x3F]; + $r3 += $keys[$r2 & 0x3F];'; + $limit = $actions[$limit]; + } + } + + $encrypt_block .= '$in = pack("v4", $r0, $r1, $r2, $r3);'; + + // Create code for decryption. + $limit = 44; + $actions = array($limit => 20, 20 => 0); + $j = 64; + + for (;;) { + // R-mixing round. + $decrypt_block .= ' + $r3 = ($r3 | ($r3 << 16)) >> 5; + $r3 = ($r3 - ' . $keys[--$j] . ' - + ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF; + $r2 = ($r2 | ($r2 << 16)) >> 3; + $r2 = ($r2 - ' . $keys[--$j] . ' - + ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF; + $r1 = ($r1 | ($r1 << 16)) >> 2; + $r1 = ($r1 - ' . $keys[--$j] . ' - + ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF; + $r0 = ($r0 | ($r0 << 16)) >> 1; + $r0 = ($r0 - ' . $keys[--$j] . ' - + ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF;'; + + if ($j === $limit) { + if ($limit === 0) { + break; + } + + // R-mashing round. + $decrypt_block .= ' + $r3 = ($r3 - $keys[$r2 & 0x3F]) & 0xFFFF; + $r2 = ($r2 - $keys[$r1 & 0x3F]) & 0xFFFF; + $r1 = ($r1 - $keys[$r0 & 0x3F]) & 0xFFFF; + $r0 = ($r0 - $keys[$r3 & 0x3F]) & 0xFFFF;'; + $limit = $actions[$limit]; + } + } + + $decrypt_block .= '$in = pack("v4", $r0, $r1, $r2, $r3);'; + + // Creates the inline-crypt function + $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( + array( + 'init_crypt' => $init_crypt, + 'encrypt_block' => $encrypt_block, + 'decrypt_block' => $decrypt_block + ) + ); + } + + // Set the inline-crypt function as callback in: $this->inline_crypt + $this->inline_crypt = $lambda_functions[$code_hash]; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RC4.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RC4.php new file mode 100755 index 00000000..d5eda8c3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RC4.php @@ -0,0 +1,329 @@ + + * setKey('abcdefgh'); + * + * $size = 10 * 1024; + * $plaintext = ''; + * for ($i = 0; $i < $size; $i++) { + * $plaintext.= 'a'; + * } + * + * echo $rc4->decrypt($rc4->encrypt($plaintext)); + * ?> + * + * + * LICENSE: 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. + * + * @category Crypt + * @package Crypt_RC4 + * @author Jim Wigginton + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Base + * + * Base cipher class + */ +if (!class_exists('Crypt_Base')) { + include_once 'Base.php'; +} + +/**#@+ + * @access private + * @see Crypt_RC4::Crypt_RC4() + */ +/** + * Toggles the internal implementation + */ +define('CRYPT_RC4_MODE_INTERNAL', CRYPT_MODE_INTERNAL); +/** + * Toggles the mcrypt implementation + */ +define('CRYPT_RC4_MODE_MCRYPT', CRYPT_MODE_MCRYPT); +/**#@-*/ + +/**#@+ + * @access private + * @see Crypt_RC4::_crypt() + */ +define('CRYPT_RC4_ENCRYPT', 0); +define('CRYPT_RC4_DECRYPT', 1); +/**#@-*/ + +/** + * Pure-PHP implementation of RC4. + * + * @package Crypt_RC4 + * @author Jim Wigginton + * @access public + */ +class Crypt_RC4 extends Crypt_Base +{ + /** + * Block Length of the cipher + * + * RC4 is a stream cipher + * so we the block_size to 0 + * + * @see Crypt_Base::block_size + * @var Integer + * @access private + */ + var $block_size = 0; + + /** + * The default password key_size used by setPassword() + * + * @see Crypt_Base::password_key_size + * @see Crypt_Base::setPassword() + * @var Integer + * @access private + */ + var $password_key_size = 128; // = 1024 bits + + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_Base::const_namespace + * @var String + * @access private + */ + var $const_namespace = 'RC4'; + + /** + * The mcrypt specific name of the cipher + * + * @see Crypt_Base::cipher_name_mcrypt + * @var String + * @access private + */ + var $cipher_name_mcrypt = 'arcfour'; + + /** + * Holds whether performance-optimized $inline_crypt() can/should be used. + * + * @see Crypt_Base::inline_crypt + * @var mixed + * @access private + */ + var $use_inline_crypt = false; // currently not available + + /** + * The Key + * + * @see Crypt_RC4::setKey() + * @var String + * @access private + */ + var $key = "\0"; + + /** + * The Key Stream for decryption and encryption + * + * @see Crypt_RC4::setKey() + * @var Array + * @access private + */ + var $stream; + + /** + * Default Constructor. + * + * Determines whether or not the mcrypt extension should be used. + * + * @see Crypt_Base::Crypt_Base() + * @return Crypt_RC4 + * @access public + */ + function Crypt_RC4() + { + parent::Crypt_Base(CRYPT_MODE_STREAM); + } + + /** + * Dummy function. + * + * Some protocols, such as WEP, prepend an "initialization vector" to the key, effectively creating a new key [1]. + * If you need to use an initialization vector in this manner, feel free to prepend it to the key, yourself, before + * calling setKey(). + * + * [1] WEP's initialization vectors (IV's) are used in a somewhat insecure way. Since, in that protocol, + * the IV's are relatively easy to predict, an attack described by + * {@link http://www.drizzle.com/~aboba/IEEE/rc4_ksaproc.pdf Scott Fluhrer, Itsik Mantin, and Adi Shamir} + * can be used to quickly guess at the rest of the key. The following links elaborate: + * + * {@link http://www.rsa.com/rsalabs/node.asp?id=2009 http://www.rsa.com/rsalabs/node.asp?id=2009} + * {@link http://en.wikipedia.org/wiki/Related_key_attack http://en.wikipedia.org/wiki/Related_key_attack} + * + * @param String $iv + * @see Crypt_RC4::setKey() + * @access public + */ + function setIV($iv) + { + } + + /** + * Sets the key. + * + * Keys can be between 1 and 256 bytes long. If they are longer then 256 bytes, the first 256 bytes will + * be used. If no key is explicitly set, it'll be assumed to be a single null byte. + * + * @access public + * @see Crypt_Base::setKey() + * @param String $key + */ + function setKey($key) + { + parent::setKey(substr($key, 0, 256)); + } + + /** + * Encrypts a message. + * + * @see Crypt_Base::decrypt() + * @see Crypt_RC4::_crypt() + * @access public + * @param String $plaintext + * @return String $ciphertext + */ + function encrypt($plaintext) + { + if ($this->engine == CRYPT_MODE_MCRYPT) { + return parent::encrypt($plaintext); + } + return $this->_crypt($plaintext, CRYPT_RC4_ENCRYPT); + } + + /** + * Decrypts a message. + * + * $this->decrypt($this->encrypt($plaintext)) == $this->encrypt($this->encrypt($plaintext)). + * At least if the continuous buffer is disabled. + * + * @see Crypt_Base::encrypt() + * @see Crypt_RC4::_crypt() + * @access public + * @param String $ciphertext + * @return String $plaintext + */ + function decrypt($ciphertext) + { + if ($this->engine == CRYPT_MODE_MCRYPT) { + return parent::decrypt($ciphertext); + } + return $this->_crypt($ciphertext, CRYPT_RC4_DECRYPT); + } + + + /** + * Setup the key (expansion) + * + * @see Crypt_Base::_setupKey() + * @access private + */ + function _setupKey() + { + $key = $this->key; + $keyLength = strlen($key); + $keyStream = range(0, 255); + $j = 0; + for ($i = 0; $i < 256; $i++) { + $j = ($j + $keyStream[$i] + ord($key[$i % $keyLength])) & 255; + $temp = $keyStream[$i]; + $keyStream[$i] = $keyStream[$j]; + $keyStream[$j] = $temp; + } + + $this->stream = array(); + $this->stream[CRYPT_RC4_DECRYPT] = $this->stream[CRYPT_RC4_ENCRYPT] = array( + 0, // index $i + 0, // index $j + $keyStream + ); + } + + /** + * Encrypts or decrypts a message. + * + * @see Crypt_RC4::encrypt() + * @see Crypt_RC4::decrypt() + * @access private + * @param String $text + * @param Integer $mode + * @return String $text + */ + function _crypt($text, $mode) + { + if ($this->changed) { + $this->_setup(); + $this->changed = false; + } + + $stream = &$this->stream[$mode]; + if ($this->continuousBuffer) { + $i = &$stream[0]; + $j = &$stream[1]; + $keyStream = &$stream[2]; + } else { + $i = $stream[0]; + $j = $stream[1]; + $keyStream = $stream[2]; + } + + $len = strlen($text); + for ($k = 0; $k < $len; ++$k) { + $i = ($i + 1) & 255; + $ksi = $keyStream[$i]; + $j = ($j + $ksi) & 255; + $ksj = $keyStream[$j]; + + $keyStream[$i] = $ksj; + $keyStream[$j] = $ksi; + $text[$k] = $text[$k] ^ chr($keyStream[($ksj + $ksi) & 255]); + } + + return $text; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RSA.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RSA.php new file mode 100755 index 00000000..53f94354 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RSA.php @@ -0,0 +1,2997 @@ + + * createKey()); + * + * $plaintext = 'terrafrost'; + * + * $rsa->loadKey($privatekey); + * $ciphertext = $rsa->encrypt($plaintext); + * + * $rsa->loadKey($publickey); + * echo $rsa->decrypt($ciphertext); + * ?> + * + * + * Here's an example of how to create signatures and verify signatures with this library: + * + * createKey()); + * + * $plaintext = 'terrafrost'; + * + * $rsa->loadKey($privatekey); + * $signature = $rsa->sign($plaintext); + * + * $rsa->loadKey($publickey); + * echo $rsa->verify($plaintext, $signature) ? 'verified' : 'unverified'; + * ?> + * + * + * LICENSE: 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. + * + * @category Crypt + * @package Crypt_RSA + * @author Jim Wigginton + * @copyright 2009 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Random + */ +// the class_exists() will only be called if the crypt_random_string function hasn't been defined and +// will trigger a call to __autoload() if you're wanting to auto-load classes +// call function_exists() a second time to stop the include_once from being called outside +// of the auto loader +if (!function_exists('crypt_random_string')) { + include_once 'Random.php'; +} + +/** + * Include Crypt_Hash + */ +if (!class_exists('Crypt_Hash')) { + include_once 'Hash.php'; +} + +/**#@+ + * @access public + * @see Crypt_RSA::encrypt() + * @see Crypt_RSA::decrypt() + */ +/** + * Use {@link http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding Optimal Asymmetric Encryption Padding} + * (OAEP) for encryption / decryption. + * + * Uses sha1 by default. + * + * @see Crypt_RSA::setHash() + * @see Crypt_RSA::setMGFHash() + */ +define('CRYPT_RSA_ENCRYPTION_OAEP', 1); +/** + * Use PKCS#1 padding. + * + * Although CRYPT_RSA_ENCRYPTION_OAEP offers more security, including PKCS#1 padding is necessary for purposes of backwards + * compatibility with protocols (like SSH-1) written before OAEP's introduction. + */ +define('CRYPT_RSA_ENCRYPTION_PKCS1', 2); +/**#@-*/ + +/**#@+ + * @access public + * @see Crypt_RSA::sign() + * @see Crypt_RSA::verify() + * @see Crypt_RSA::setHash() + */ +/** + * Use the Probabilistic Signature Scheme for signing + * + * Uses sha1 by default. + * + * @see Crypt_RSA::setSaltLength() + * @see Crypt_RSA::setMGFHash() + */ +define('CRYPT_RSA_SIGNATURE_PSS', 1); +/** + * Use the PKCS#1 scheme by default. + * + * Although CRYPT_RSA_SIGNATURE_PSS offers more security, including PKCS#1 signing is necessary for purposes of backwards + * compatibility with protocols (like SSH-2) written before PSS's introduction. + */ +define('CRYPT_RSA_SIGNATURE_PKCS1', 2); +/**#@-*/ + +/**#@+ + * @access private + * @see Crypt_RSA::createKey() + */ +/** + * ASN1 Integer + */ +define('CRYPT_RSA_ASN1_INTEGER', 2); +/** + * ASN1 Bit String + */ +define('CRYPT_RSA_ASN1_BITSTRING', 3); +/** + * ASN1 Octet String + */ +define('CRYPT_RSA_ASN1_OCTETSTRING', 4); +/** + * ASN1 Object Identifier + */ +define('CRYPT_RSA_ASN1_OBJECT', 6); +/** + * ASN1 Sequence (with the constucted bit set) + */ +define('CRYPT_RSA_ASN1_SEQUENCE', 48); +/**#@-*/ + +/**#@+ + * @access private + * @see Crypt_RSA::Crypt_RSA() + */ +/** + * To use the pure-PHP implementation + */ +define('CRYPT_RSA_MODE_INTERNAL', 1); +/** + * To use the OpenSSL library + * + * (if enabled; otherwise, the internal implementation will be used) + */ +define('CRYPT_RSA_MODE_OPENSSL', 2); +/**#@-*/ + +/** + * Default openSSL configuration file. + */ +define('CRYPT_RSA_OPENSSL_CONFIG', dirname(__FILE__) . '/../openssl.cnf'); + +/**#@+ + * @access public + * @see Crypt_RSA::createKey() + * @see Crypt_RSA::setPrivateKeyFormat() + */ +/** + * PKCS#1 formatted private key + * + * Used by OpenSSH + */ +define('CRYPT_RSA_PRIVATE_FORMAT_PKCS1', 0); +/** + * PuTTY formatted private key + */ +define('CRYPT_RSA_PRIVATE_FORMAT_PUTTY', 1); +/** + * XML formatted private key + */ +define('CRYPT_RSA_PRIVATE_FORMAT_XML', 2); +/** + * PKCS#8 formatted private key + */ +define('CRYPT_RSA_PRIVATE_FORMAT_PKCS8', 3); +/**#@-*/ + +/**#@+ + * @access public + * @see Crypt_RSA::createKey() + * @see Crypt_RSA::setPublicKeyFormat() + */ +/** + * Raw public key + * + * An array containing two Math_BigInteger objects. + * + * The exponent can be indexed with any of the following: + * + * 0, e, exponent, publicExponent + * + * The modulus can be indexed with any of the following: + * + * 1, n, modulo, modulus + */ +define('CRYPT_RSA_PUBLIC_FORMAT_RAW', 3); +/** + * PKCS#1 formatted public key (raw) + * + * Used by File/X509.php + * + * Has the following header: + * + * -----BEGIN RSA PUBLIC KEY----- + * + * Analogous to ssh-keygen's pem format (as specified by -m) + */ +define('CRYPT_RSA_PUBLIC_FORMAT_PKCS1', 4); +define('CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW', 4); +/** + * XML formatted public key + */ +define('CRYPT_RSA_PUBLIC_FORMAT_XML', 5); +/** + * OpenSSH formatted public key + * + * Place in $HOME/.ssh/authorized_keys + */ +define('CRYPT_RSA_PUBLIC_FORMAT_OPENSSH', 6); +/** + * PKCS#1 formatted public key (encapsulated) + * + * Used by PHP's openssl_public_encrypt() and openssl's rsautl (when -pubin is set) + * + * Has the following header: + * + * -----BEGIN PUBLIC KEY----- + * + * Analogous to ssh-keygen's pkcs8 format (as specified by -m). Although PKCS8 + * is specific to private keys it's basically creating a DER-encoded wrapper + * for keys. This just extends that same concept to public keys (much like ssh-keygen) + */ +define('CRYPT_RSA_PUBLIC_FORMAT_PKCS8', 7); +/**#@-*/ + +/** + * Pure-PHP PKCS#1 compliant implementation of RSA. + * + * @package Crypt_RSA + * @author Jim Wigginton + * @access public + */ +class Crypt_RSA +{ + /** + * Precomputed Zero + * + * @var Array + * @access private + */ + var $zero; + + /** + * Precomputed One + * + * @var Array + * @access private + */ + var $one; + + /** + * Private Key Format + * + * @var Integer + * @access private + */ + var $privateKeyFormat = CRYPT_RSA_PRIVATE_FORMAT_PKCS1; + + /** + * Public Key Format + * + * @var Integer + * @access public + */ + var $publicKeyFormat = CRYPT_RSA_PUBLIC_FORMAT_PKCS8; + + /** + * Modulus (ie. n) + * + * @var Math_BigInteger + * @access private + */ + var $modulus; + + /** + * Modulus length + * + * @var Math_BigInteger + * @access private + */ + var $k; + + /** + * Exponent (ie. e or d) + * + * @var Math_BigInteger + * @access private + */ + var $exponent; + + /** + * Primes for Chinese Remainder Theorem (ie. p and q) + * + * @var Array + * @access private + */ + var $primes; + + /** + * Exponents for Chinese Remainder Theorem (ie. dP and dQ) + * + * @var Array + * @access private + */ + var $exponents; + + /** + * Coefficients for Chinese Remainder Theorem (ie. qInv) + * + * @var Array + * @access private + */ + var $coefficients; + + /** + * Hash name + * + * @var String + * @access private + */ + var $hashName; + + /** + * Hash function + * + * @var Crypt_Hash + * @access private + */ + var $hash; + + /** + * Length of hash function output + * + * @var Integer + * @access private + */ + var $hLen; + + /** + * Length of salt + * + * @var Integer + * @access private + */ + var $sLen; + + /** + * Hash function for the Mask Generation Function + * + * @var Crypt_Hash + * @access private + */ + var $mgfHash; + + /** + * Length of MGF hash function output + * + * @var Integer + * @access private + */ + var $mgfHLen; + + /** + * Encryption mode + * + * @var Integer + * @access private + */ + var $encryptionMode = CRYPT_RSA_ENCRYPTION_OAEP; + + /** + * Signature mode + * + * @var Integer + * @access private + */ + var $signatureMode = CRYPT_RSA_SIGNATURE_PSS; + + /** + * Public Exponent + * + * @var Mixed + * @access private + */ + var $publicExponent = false; + + /** + * Password + * + * @var String + * @access private + */ + var $password = false; + + /** + * Components + * + * For use with parsing XML formatted keys. PHP's XML Parser functions use utilized - instead of PHP's DOM functions - + * because PHP's XML Parser functions work on PHP4 whereas PHP's DOM functions - although surperior - don't. + * + * @see Crypt_RSA::_start_element_handler() + * @var Array + * @access private + */ + var $components = array(); + + /** + * Current String + * + * For use with parsing XML formatted keys. + * + * @see Crypt_RSA::_character_handler() + * @see Crypt_RSA::_stop_element_handler() + * @var Mixed + * @access private + */ + var $current; + + /** + * OpenSSL configuration file name. + * + * Set to null to use system configuration file. + * @see Crypt_RSA::createKey() + * @var Mixed + * @Access public + */ + var $configFile; + + /** + * Public key comment field. + * + * @var String + * @access private + */ + var $comment = 'phpseclib-generated-key'; + + /** + * The constructor + * + * If you want to make use of the openssl extension, you'll need to set the mode manually, yourself. The reason + * Crypt_RSA doesn't do it is because OpenSSL doesn't fail gracefully. openssl_pkey_new(), in particular, requires + * openssl.cnf be present somewhere and, unfortunately, the only real way to find out is too late. + * + * @return Crypt_RSA + * @access public + */ + function Crypt_RSA() + { + if (!class_exists('Math_BigInteger')) { + include_once 'Math/BigInteger.php'; + } + + $this->configFile = CRYPT_RSA_OPENSSL_CONFIG; + + if ( !defined('CRYPT_RSA_MODE') ) { + switch (true) { + // Math/BigInteger's openssl requirements are a little less stringent than Crypt/RSA's. in particular, + // Math/BigInteger doesn't require an openssl.cfg file whereas Crypt/RSA does. so if Math/BigInteger + // can't use OpenSSL it can be pretty trivially assumed, then, that Crypt/RSA can't either. + case defined('MATH_BIGINTEGER_OPENSSL_DISABLE'): + define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); + break; + // openssl_pkey_get_details - which is used in the only place Crypt/RSA.php uses OpenSSL - was introduced in PHP 5.2.0 + case !function_exists('openssl_pkey_get_details'): + define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); + break; + case extension_loaded('openssl') && version_compare(PHP_VERSION, '4.2.0', '>=') && file_exists($this->configFile): + // some versions of XAMPP have mismatched versions of OpenSSL which causes it not to work + ob_start(); + @phpinfo(); + $content = ob_get_contents(); + ob_end_clean(); + + preg_match_all('#OpenSSL (Header|Library) Version(.*)#im', $content, $matches); + + $versions = array(); + if (!empty($matches[1])) { + for ($i = 0; $i < count($matches[1]); $i++) { + $fullVersion = trim(str_replace('=>', '', strip_tags($matches[2][$i]))); + + // Remove letter part in OpenSSL version + if (!preg_match('/(\d+\.\d+\.\d+)/i', $fullVersion, $m)) { + $versions[$matches[1][$i]] = $fullVersion; + } else { + $versions[$matches[1][$i]] = $m[0]; + } + } + } + + // it doesn't appear that OpenSSL versions were reported upon until PHP 5.3+ + switch (true) { + case !isset($versions['Header']): + case !isset($versions['Library']): + case $versions['Header'] == $versions['Library']: + define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_OPENSSL); + break; + default: + define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); + define('MATH_BIGINTEGER_OPENSSL_DISABLE', true); + } + break; + default: + define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); + } + } + + $this->zero = new Math_BigInteger(); + $this->one = new Math_BigInteger(1); + + $this->hash = new Crypt_Hash('sha1'); + $this->hLen = $this->hash->getLength(); + $this->hashName = 'sha1'; + $this->mgfHash = new Crypt_Hash('sha1'); + $this->mgfHLen = $this->mgfHash->getLength(); + } + + /** + * Create public / private key pair + * + * Returns an array with the following three elements: + * - 'privatekey': The private key. + * - 'publickey': The public key. + * - 'partialkey': A partially computed key (if the execution time exceeded $timeout). + * Will need to be passed back to Crypt_RSA::createKey() as the third parameter for further processing. + * + * @access public + * @param optional Integer $bits + * @param optional Integer $timeout + * @param optional Math_BigInteger $p + */ + function createKey($bits = 1024, $timeout = false, $partial = array()) + { + if (!defined('CRYPT_RSA_EXPONENT')) { + // http://en.wikipedia.org/wiki/65537_%28number%29 + define('CRYPT_RSA_EXPONENT', '65537'); + } + // per , this number ought not result in primes smaller + // than 256 bits. as a consequence if the key you're trying to create is 1024 bits and you've set CRYPT_RSA_SMALLEST_PRIME + // to 384 bits then you're going to get a 384 bit prime and a 640 bit prime (384 + 1024 % 384). at least if + // CRYPT_RSA_MODE is set to CRYPT_RSA_MODE_INTERNAL. if CRYPT_RSA_MODE is set to CRYPT_RSA_MODE_OPENSSL then + // CRYPT_RSA_SMALLEST_PRIME is ignored (ie. multi-prime RSA support is more intended as a way to speed up RSA key + // generation when there's a chance neither gmp nor OpenSSL are installed) + if (!defined('CRYPT_RSA_SMALLEST_PRIME')) { + define('CRYPT_RSA_SMALLEST_PRIME', 4096); + } + + // OpenSSL uses 65537 as the exponent and requires RSA keys be 384 bits minimum + if ( CRYPT_RSA_MODE == CRYPT_RSA_MODE_OPENSSL && $bits >= 384 && CRYPT_RSA_EXPONENT == 65537) { + $config = array(); + if (isset($this->configFile)) { + $config['config'] = $this->configFile; + } + $rsa = openssl_pkey_new(array('private_key_bits' => $bits) + $config); + openssl_pkey_export($rsa, $privatekey, null, $config); + $publickey = openssl_pkey_get_details($rsa); + $publickey = $publickey['key']; + + $privatekey = call_user_func_array(array($this, '_convertPrivateKey'), array_values($this->_parseKey($privatekey, CRYPT_RSA_PRIVATE_FORMAT_PKCS1))); + $publickey = call_user_func_array(array($this, '_convertPublicKey'), array_values($this->_parseKey($publickey, CRYPT_RSA_PUBLIC_FORMAT_PKCS1))); + + // clear the buffer of error strings stemming from a minimalistic openssl.cnf + while (openssl_error_string() !== false); + + return array( + 'privatekey' => $privatekey, + 'publickey' => $publickey, + 'partialkey' => false + ); + } + + static $e; + if (!isset($e)) { + $e = new Math_BigInteger(CRYPT_RSA_EXPONENT); + } + + extract($this->_generateMinMax($bits)); + $absoluteMin = $min; + $temp = $bits >> 1; // divide by two to see how many bits P and Q would be + if ($temp > CRYPT_RSA_SMALLEST_PRIME) { + $num_primes = floor($bits / CRYPT_RSA_SMALLEST_PRIME); + $temp = CRYPT_RSA_SMALLEST_PRIME; + } else { + $num_primes = 2; + } + extract($this->_generateMinMax($temp + $bits % $temp)); + $finalMax = $max; + extract($this->_generateMinMax($temp)); + + $generator = new Math_BigInteger(); + + $n = $this->one->copy(); + if (!empty($partial)) { + extract(unserialize($partial)); + } else { + $exponents = $coefficients = $primes = array(); + $lcm = array( + 'top' => $this->one->copy(), + 'bottom' => false + ); + } + + $start = time(); + $i0 = count($primes) + 1; + + do { + for ($i = $i0; $i <= $num_primes; $i++) { + if ($timeout !== false) { + $timeout-= time() - $start; + $start = time(); + if ($timeout <= 0) { + return array( + 'privatekey' => '', + 'publickey' => '', + 'partialkey' => serialize(array( + 'primes' => $primes, + 'coefficients' => $coefficients, + 'lcm' => $lcm, + 'exponents' => $exponents + )) + ); + } + } + + if ($i == $num_primes) { + list($min, $temp) = $absoluteMin->divide($n); + if (!$temp->equals($this->zero)) { + $min = $min->add($this->one); // ie. ceil() + } + $primes[$i] = $generator->randomPrime($min, $finalMax, $timeout); + } else { + $primes[$i] = $generator->randomPrime($min, $max, $timeout); + } + + if ($primes[$i] === false) { // if we've reached the timeout + if (count($primes) > 1) { + $partialkey = ''; + } else { + array_pop($primes); + $partialkey = serialize(array( + 'primes' => $primes, + 'coefficients' => $coefficients, + 'lcm' => $lcm, + 'exponents' => $exponents + )); + } + + return array( + 'privatekey' => '', + 'publickey' => '', + 'partialkey' => $partialkey + ); + } + + // the first coefficient is calculated differently from the rest + // ie. instead of being $primes[1]->modInverse($primes[2]), it's $primes[2]->modInverse($primes[1]) + if ($i > 2) { + $coefficients[$i] = $n->modInverse($primes[$i]); + } + + $n = $n->multiply($primes[$i]); + + $temp = $primes[$i]->subtract($this->one); + + // textbook RSA implementations use Euler's totient function instead of the least common multiple. + // see http://en.wikipedia.org/wiki/Euler%27s_totient_function + $lcm['top'] = $lcm['top']->multiply($temp); + $lcm['bottom'] = $lcm['bottom'] === false ? $temp : $lcm['bottom']->gcd($temp); + + $exponents[$i] = $e->modInverse($temp); + } + + list($temp) = $lcm['top']->divide($lcm['bottom']); + $gcd = $temp->gcd($e); + $i0 = 1; + } while (!$gcd->equals($this->one)); + + $d = $e->modInverse($temp); + + $coefficients[2] = $primes[2]->modInverse($primes[1]); + + // from : + // RSAPrivateKey ::= SEQUENCE { + // version Version, + // modulus INTEGER, -- n + // publicExponent INTEGER, -- e + // privateExponent INTEGER, -- d + // prime1 INTEGER, -- p + // prime2 INTEGER, -- q + // exponent1 INTEGER, -- d mod (p-1) + // exponent2 INTEGER, -- d mod (q-1) + // coefficient INTEGER, -- (inverse of q) mod p + // otherPrimeInfos OtherPrimeInfos OPTIONAL + // } + + return array( + 'privatekey' => $this->_convertPrivateKey($n, $e, $d, $primes, $exponents, $coefficients), + 'publickey' => $this->_convertPublicKey($n, $e), + 'partialkey' => false + ); + } + + /** + * Convert a private key to the appropriate format. + * + * @access private + * @see setPrivateKeyFormat() + * @param String $RSAPrivateKey + * @return String + */ + function _convertPrivateKey($n, $e, $d, $primes, $exponents, $coefficients) + { + $signed = $this->privateKeyFormat != CRYPT_RSA_PRIVATE_FORMAT_XML; + $num_primes = count($primes); + $raw = array( + 'version' => $num_primes == 2 ? chr(0) : chr(1), // two-prime vs. multi + 'modulus' => $n->toBytes($signed), + 'publicExponent' => $e->toBytes($signed), + 'privateExponent' => $d->toBytes($signed), + 'prime1' => $primes[1]->toBytes($signed), + 'prime2' => $primes[2]->toBytes($signed), + 'exponent1' => $exponents[1]->toBytes($signed), + 'exponent2' => $exponents[2]->toBytes($signed), + 'coefficient' => $coefficients[2]->toBytes($signed) + ); + + // if the format in question does not support multi-prime rsa and multi-prime rsa was used, + // call _convertPublicKey() instead. + switch ($this->privateKeyFormat) { + case CRYPT_RSA_PRIVATE_FORMAT_XML: + if ($num_primes != 2) { + return false; + } + return "\r\n" . + ' ' . base64_encode($raw['modulus']) . "\r\n" . + ' ' . base64_encode($raw['publicExponent']) . "\r\n" . + '

' . base64_encode($raw['prime1']) . "

\r\n" . + ' ' . base64_encode($raw['prime2']) . "\r\n" . + ' ' . base64_encode($raw['exponent1']) . "\r\n" . + ' ' . base64_encode($raw['exponent2']) . "\r\n" . + ' ' . base64_encode($raw['coefficient']) . "\r\n" . + ' ' . base64_encode($raw['privateExponent']) . "\r\n" . + '
'; + break; + case CRYPT_RSA_PRIVATE_FORMAT_PUTTY: + if ($num_primes != 2) { + return false; + } + $key = "PuTTY-User-Key-File-2: ssh-rsa\r\nEncryption: "; + $encryption = (!empty($this->password) || is_string($this->password)) ? 'aes256-cbc' : 'none'; + $key.= $encryption; + $key.= "\r\nComment: " . $this->comment . "\r\n"; + $public = pack('Na*Na*Na*', + strlen('ssh-rsa'), 'ssh-rsa', strlen($raw['publicExponent']), $raw['publicExponent'], strlen($raw['modulus']), $raw['modulus'] + ); + $source = pack('Na*Na*Na*Na*', + strlen('ssh-rsa'), 'ssh-rsa', strlen($encryption), $encryption, + strlen($this->comment), $this->comment, strlen($public), $public + ); + $public = base64_encode($public); + $key.= "Public-Lines: " . ((strlen($public) + 63) >> 6) . "\r\n"; + $key.= chunk_split($public, 64); + $private = pack('Na*Na*Na*Na*', + strlen($raw['privateExponent']), $raw['privateExponent'], strlen($raw['prime1']), $raw['prime1'], + strlen($raw['prime2']), $raw['prime2'], strlen($raw['coefficient']), $raw['coefficient'] + ); + if (empty($this->password) && !is_string($this->password)) { + $source.= pack('Na*', strlen($private), $private); + $hashkey = 'putty-private-key-file-mac-key'; + } else { + $private.= crypt_random_string(16 - (strlen($private) & 15)); + $source.= pack('Na*', strlen($private), $private); + if (!class_exists('Crypt_AES')) { + include_once 'Crypt/AES.php'; + } + $sequence = 0; + $symkey = ''; + while (strlen($symkey) < 32) { + $temp = pack('Na*', $sequence++, $this->password); + $symkey.= pack('H*', sha1($temp)); + } + $symkey = substr($symkey, 0, 32); + $crypto = new Crypt_AES(); + + $crypto->setKey($symkey); + $crypto->disablePadding(); + $private = $crypto->encrypt($private); + $hashkey = 'putty-private-key-file-mac-key' . $this->password; + } + + $private = base64_encode($private); + $key.= 'Private-Lines: ' . ((strlen($private) + 63) >> 6) . "\r\n"; + $key.= chunk_split($private, 64); + if (!class_exists('Crypt_Hash')) { + include_once 'Crypt/Hash.php'; + } + $hash = new Crypt_Hash('sha1'); + $hash->setKey(pack('H*', sha1($hashkey))); + $key.= 'Private-MAC: ' . bin2hex($hash->hash($source)) . "\r\n"; + + return $key; + default: // eg. CRYPT_RSA_PRIVATE_FORMAT_PKCS1 + $components = array(); + foreach ($raw as $name => $value) { + $components[$name] = pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($value)), $value); + } + + $RSAPrivateKey = implode('', $components); + + if ($num_primes > 2) { + $OtherPrimeInfos = ''; + for ($i = 3; $i <= $num_primes; $i++) { + // OtherPrimeInfos ::= SEQUENCE SIZE(1..MAX) OF OtherPrimeInfo + // + // OtherPrimeInfo ::= SEQUENCE { + // prime INTEGER, -- ri + // exponent INTEGER, -- di + // coefficient INTEGER -- ti + // } + $OtherPrimeInfo = pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($primes[$i]->toBytes(true))), $primes[$i]->toBytes(true)); + $OtherPrimeInfo.= pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($exponents[$i]->toBytes(true))), $exponents[$i]->toBytes(true)); + $OtherPrimeInfo.= pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($coefficients[$i]->toBytes(true))), $coefficients[$i]->toBytes(true)); + $OtherPrimeInfos.= pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($OtherPrimeInfo)), $OtherPrimeInfo); + } + $RSAPrivateKey.= pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($OtherPrimeInfos)), $OtherPrimeInfos); + } + + $RSAPrivateKey = pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey); + + if ($this->privateKeyFormat == CRYPT_RSA_PRIVATE_FORMAT_PKCS8) { + $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA + $RSAPrivateKey = pack('Ca*a*Ca*a*', + CRYPT_RSA_ASN1_INTEGER, "\01\00", $rsaOID, 4, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey + ); + $RSAPrivateKey = pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey); + if (!empty($this->password) || is_string($this->password)) { + $salt = crypt_random_string(8); + $iterationCount = 2048; + + if (!class_exists('Crypt_DES')) { + include_once 'Crypt/DES.php'; + } + $crypto = new Crypt_DES(); + $crypto->setPassword($this->password, 'pbkdf1', 'md5', $salt, $iterationCount); + $RSAPrivateKey = $crypto->encrypt($RSAPrivateKey); + + $parameters = pack('Ca*a*Ca*N', + CRYPT_RSA_ASN1_OCTETSTRING, $this->_encodeLength(strlen($salt)), $salt, + CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(4), $iterationCount + ); + $pbeWithMD5AndDES_CBC = "\x2a\x86\x48\x86\xf7\x0d\x01\x05\x03"; + + $encryptionAlgorithm = pack('Ca*a*Ca*a*', + CRYPT_RSA_ASN1_OBJECT, $this->_encodeLength(strlen($pbeWithMD5AndDES_CBC)), $pbeWithMD5AndDES_CBC, + CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($parameters)), $parameters + ); + + $RSAPrivateKey = pack('Ca*a*Ca*a*', + CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($encryptionAlgorithm)), $encryptionAlgorithm, + CRYPT_RSA_ASN1_OCTETSTRING, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey + ); + + $RSAPrivateKey = pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey); + + $RSAPrivateKey = "-----BEGIN ENCRYPTED PRIVATE KEY-----\r\n" . + chunk_split(base64_encode($RSAPrivateKey), 64) . + '-----END ENCRYPTED PRIVATE KEY-----'; + } else { + $RSAPrivateKey = "-----BEGIN PRIVATE KEY-----\r\n" . + chunk_split(base64_encode($RSAPrivateKey), 64) . + '-----END PRIVATE KEY-----'; + } + return $RSAPrivateKey; + } + + if (!empty($this->password) || is_string($this->password)) { + $iv = crypt_random_string(8); + $symkey = pack('H*', md5($this->password . $iv)); // symkey is short for symmetric key + $symkey.= substr(pack('H*', md5($symkey . $this->password . $iv)), 0, 8); + if (!class_exists('Crypt_TripleDES')) { + include_once 'Crypt/TripleDES.php'; + } + $des = new Crypt_TripleDES(); + $des->setKey($symkey); + $des->setIV($iv); + $iv = strtoupper(bin2hex($iv)); + $RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" . + "Proc-Type: 4,ENCRYPTED\r\n" . + "DEK-Info: DES-EDE3-CBC,$iv\r\n" . + "\r\n" . + chunk_split(base64_encode($des->encrypt($RSAPrivateKey)), 64) . + '-----END RSA PRIVATE KEY-----'; + } else { + $RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" . + chunk_split(base64_encode($RSAPrivateKey), 64) . + '-----END RSA PRIVATE KEY-----'; + } + + return $RSAPrivateKey; + } + } + + /** + * Convert a public key to the appropriate format + * + * @access private + * @see setPublicKeyFormat() + * @param String $RSAPrivateKey + * @return String + */ + function _convertPublicKey($n, $e) + { + $signed = $this->publicKeyFormat != CRYPT_RSA_PUBLIC_FORMAT_XML; + + $modulus = $n->toBytes($signed); + $publicExponent = $e->toBytes($signed); + + switch ($this->publicKeyFormat) { + case CRYPT_RSA_PUBLIC_FORMAT_RAW: + return array('e' => $e->copy(), 'n' => $n->copy()); + case CRYPT_RSA_PUBLIC_FORMAT_XML: + return "\r\n" . + ' ' . base64_encode($modulus) . "\r\n" . + ' ' . base64_encode($publicExponent) . "\r\n" . + ''; + break; + case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH: + // from : + // string "ssh-rsa" + // mpint e + // mpint n + $RSAPublicKey = pack('Na*Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publicExponent), $publicExponent, strlen($modulus), $modulus); + $RSAPublicKey = 'ssh-rsa ' . base64_encode($RSAPublicKey) . ' ' . $this->comment; + + return $RSAPublicKey; + default: // eg. CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW or CRYPT_RSA_PUBLIC_FORMAT_PKCS1 + // from : + // RSAPublicKey ::= SEQUENCE { + // modulus INTEGER, -- n + // publicExponent INTEGER -- e + // } + $components = array( + 'modulus' => pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($modulus)), $modulus), + 'publicExponent' => pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($publicExponent)), $publicExponent) + ); + + $RSAPublicKey = pack('Ca*a*a*', + CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($components['modulus']) + strlen($components['publicExponent'])), + $components['modulus'], $components['publicExponent'] + ); + + if ($this->publicKeyFormat == CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW) { + $RSAPublicKey = "-----BEGIN RSA PUBLIC KEY-----\r\n" . + chunk_split(base64_encode($RSAPublicKey), 64) . + '-----END RSA PUBLIC KEY-----'; + } else { + // sequence(oid(1.2.840.113549.1.1.1), null)) = rsaEncryption. + $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA + $RSAPublicKey = chr(0) . $RSAPublicKey; + $RSAPublicKey = chr(3) . $this->_encodeLength(strlen($RSAPublicKey)) . $RSAPublicKey; + + $RSAPublicKey = pack('Ca*a*', + CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($rsaOID . $RSAPublicKey)), $rsaOID . $RSAPublicKey + ); + + $RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" . + chunk_split(base64_encode($RSAPublicKey), 64) . + '-----END PUBLIC KEY-----'; + } + + return $RSAPublicKey; + } + } + + /** + * Break a public or private key down into its constituant components + * + * @access private + * @see _convertPublicKey() + * @see _convertPrivateKey() + * @param String $key + * @param Integer $type + * @return Array + */ + function _parseKey($key, $type) + { + if ($type != CRYPT_RSA_PUBLIC_FORMAT_RAW && !is_string($key)) { + return false; + } + + switch ($type) { + case CRYPT_RSA_PUBLIC_FORMAT_RAW: + if (!is_array($key)) { + return false; + } + $components = array(); + switch (true) { + case isset($key['e']): + $components['publicExponent'] = $key['e']->copy(); + break; + case isset($key['exponent']): + $components['publicExponent'] = $key['exponent']->copy(); + break; + case isset($key['publicExponent']): + $components['publicExponent'] = $key['publicExponent']->copy(); + break; + case isset($key[0]): + $components['publicExponent'] = $key[0]->copy(); + } + switch (true) { + case isset($key['n']): + $components['modulus'] = $key['n']->copy(); + break; + case isset($key['modulo']): + $components['modulus'] = $key['modulo']->copy(); + break; + case isset($key['modulus']): + $components['modulus'] = $key['modulus']->copy(); + break; + case isset($key[1]): + $components['modulus'] = $key[1]->copy(); + } + return isset($components['modulus']) && isset($components['publicExponent']) ? $components : false; + case CRYPT_RSA_PRIVATE_FORMAT_PKCS1: + case CRYPT_RSA_PRIVATE_FORMAT_PKCS8: + case CRYPT_RSA_PUBLIC_FORMAT_PKCS1: + /* Although PKCS#1 proposes a format that public and private keys can use, encrypting them is + "outside the scope" of PKCS#1. PKCS#1 then refers you to PKCS#12 and PKCS#15 if you're wanting to + protect private keys, however, that's not what OpenSSL* does. OpenSSL protects private keys by adding + two new "fields" to the key - DEK-Info and Proc-Type. These fields are discussed here: + + http://tools.ietf.org/html/rfc1421#section-4.6.1.1 + http://tools.ietf.org/html/rfc1421#section-4.6.1.3 + + DES-EDE3-CBC as an algorithm, however, is not discussed anywhere, near as I can tell. + DES-CBC and DES-EDE are discussed in RFC1423, however, DES-EDE3-CBC isn't, nor is its key derivation + function. As is, the definitive authority on this encoding scheme isn't the IETF but rather OpenSSL's + own implementation. ie. the implementation *is* the standard and any bugs that may exist in that + implementation are part of the standard, as well. + + * OpenSSL is the de facto standard. It's utilized by OpenSSH and other projects */ + if (preg_match('#DEK-Info: (.+),(.+)#', $key, $matches)) { + $iv = pack('H*', trim($matches[2])); + $symkey = pack('H*', md5($this->password . substr($iv, 0, 8))); // symkey is short for symmetric key + $symkey.= pack('H*', md5($symkey . $this->password . substr($iv, 0, 8))); + // remove the Proc-Type / DEK-Info sections as they're no longer needed + $key = preg_replace('#^(?:Proc-Type|DEK-Info): .*#m', '', $key); + $ciphertext = $this->_extractBER($key); + if ($ciphertext === false) { + $ciphertext = $key; + } + switch ($matches[1]) { + case 'AES-256-CBC': + if (!class_exists('Crypt_AES')) { + include_once 'Crypt/AES.php'; + } + $crypto = new Crypt_AES(); + break; + case 'AES-128-CBC': + if (!class_exists('Crypt_AES')) { + include_once 'Crypt/AES.php'; + } + $symkey = substr($symkey, 0, 16); + $crypto = new Crypt_AES(); + break; + case 'DES-EDE3-CFB': + if (!class_exists('Crypt_TripleDES')) { + include_once 'Crypt/TripleDES.php'; + } + $crypto = new Crypt_TripleDES(CRYPT_DES_MODE_CFB); + break; + case 'DES-EDE3-CBC': + if (!class_exists('Crypt_TripleDES')) { + include_once 'Crypt/TripleDES.php'; + } + $symkey = substr($symkey, 0, 24); + $crypto = new Crypt_TripleDES(); + break; + case 'DES-CBC': + if (!class_exists('Crypt_DES')) { + include_once 'Crypt/DES.php'; + } + $crypto = new Crypt_DES(); + break; + default: + return false; + } + $crypto->setKey($symkey); + $crypto->setIV($iv); + $decoded = $crypto->decrypt($ciphertext); + } else { + $decoded = $this->_extractBER($key); + } + + if ($decoded !== false) { + $key = $decoded; + } + + $components = array(); + + if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) { + return false; + } + if ($this->_decodeLength($key) != strlen($key)) { + return false; + } + + $tag = ord($this->_string_shift($key)); + /* intended for keys for which OpenSSL's asn1parse returns the following: + + 0:d=0 hl=4 l= 631 cons: SEQUENCE + 4:d=1 hl=2 l= 1 prim: INTEGER :00 + 7:d=1 hl=2 l= 13 cons: SEQUENCE + 9:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption + 20:d=2 hl=2 l= 0 prim: NULL + 22:d=1 hl=4 l= 609 prim: OCTET STRING + + ie. PKCS8 keys*/ + + if ($tag == CRYPT_RSA_ASN1_INTEGER && substr($key, 0, 3) == "\x01\x00\x30") { + $this->_string_shift($key, 3); + $tag = CRYPT_RSA_ASN1_SEQUENCE; + } + + if ($tag == CRYPT_RSA_ASN1_SEQUENCE) { + $temp = $this->_string_shift($key, $this->_decodeLength($key)); + if (ord($this->_string_shift($temp)) != CRYPT_RSA_ASN1_OBJECT) { + return false; + } + $length = $this->_decodeLength($temp); + switch ($this->_string_shift($temp, $length)) { + case "\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01": // rsaEncryption + break; + case "\x2a\x86\x48\x86\xf7\x0d\x01\x05\x03": // pbeWithMD5AndDES-CBC + /* + PBEParameter ::= SEQUENCE { + salt OCTET STRING (SIZE(8)), + iterationCount INTEGER } + */ + if (ord($this->_string_shift($temp)) != CRYPT_RSA_ASN1_SEQUENCE) { + return false; + } + if ($this->_decodeLength($temp) != strlen($temp)) { + return false; + } + $this->_string_shift($temp); // assume it's an octet string + $salt = $this->_string_shift($temp, $this->_decodeLength($temp)); + if (ord($this->_string_shift($temp)) != CRYPT_RSA_ASN1_INTEGER) { + return false; + } + $this->_decodeLength($temp); + list(, $iterationCount) = unpack('N', str_pad($temp, 4, chr(0), STR_PAD_LEFT)); + $this->_string_shift($key); // assume it's an octet string + $length = $this->_decodeLength($key); + if (strlen($key) != $length) { + return false; + } + + if (!class_exists('Crypt_DES')) { + include_once 'Crypt/DES.php'; + } + $crypto = new Crypt_DES(); + $crypto->setPassword($this->password, 'pbkdf1', 'md5', $salt, $iterationCount); + $key = $crypto->decrypt($key); + if ($key === false) { + return false; + } + return $this->_parseKey($key, CRYPT_RSA_PRIVATE_FORMAT_PKCS1); + default: + return false; + } + /* intended for keys for which OpenSSL's asn1parse returns the following: + + 0:d=0 hl=4 l= 290 cons: SEQUENCE + 4:d=1 hl=2 l= 13 cons: SEQUENCE + 6:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption + 17:d=2 hl=2 l= 0 prim: NULL + 19:d=1 hl=4 l= 271 prim: BIT STRING */ + $tag = ord($this->_string_shift($key)); // skip over the BIT STRING / OCTET STRING tag + $this->_decodeLength($key); // skip over the BIT STRING / OCTET STRING length + // "The initial octet shall encode, as an unsigned binary integer wtih bit 1 as the least significant bit, the number of + // unused bits in the final subsequent octet. The number shall be in the range zero to seven." + // -- http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf (section 8.6.2.2) + if ($tag == CRYPT_RSA_ASN1_BITSTRING) { + $this->_string_shift($key); + } + if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) { + return false; + } + if ($this->_decodeLength($key) != strlen($key)) { + return false; + } + $tag = ord($this->_string_shift($key)); + } + if ($tag != CRYPT_RSA_ASN1_INTEGER) { + return false; + } + + $length = $this->_decodeLength($key); + $temp = $this->_string_shift($key, $length); + if (strlen($temp) != 1 || ord($temp) > 2) { + $components['modulus'] = new Math_BigInteger($temp, 256); + $this->_string_shift($key); // skip over CRYPT_RSA_ASN1_INTEGER + $length = $this->_decodeLength($key); + $components[$type == CRYPT_RSA_PUBLIC_FORMAT_PKCS1 ? 'publicExponent' : 'privateExponent'] = new Math_BigInteger($this->_string_shift($key, $length), 256); + + return $components; + } + if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_INTEGER) { + return false; + } + $length = $this->_decodeLength($key); + $components['modulus'] = new Math_BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['publicExponent'] = new Math_BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['privateExponent'] = new Math_BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['primes'] = array(1 => new Math_BigInteger($this->_string_shift($key, $length), 256)); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['primes'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['exponents'] = array(1 => new Math_BigInteger($this->_string_shift($key, $length), 256)); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['exponents'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['coefficients'] = array(2 => new Math_BigInteger($this->_string_shift($key, $length), 256)); + + if (!empty($key)) { + if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) { + return false; + } + $this->_decodeLength($key); + while (!empty($key)) { + if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) { + return false; + } + $this->_decodeLength($key); + $key = substr($key, 1); + $length = $this->_decodeLength($key); + $components['primes'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['exponents'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['coefficients'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); + } + } + + return $components; + case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH: + $parts = explode(' ', $key, 3); + + $key = isset($parts[1]) ? base64_decode($parts[1]) : false; + if ($key === false) { + return false; + } + + $comment = isset($parts[2]) ? $parts[2] : false; + + $cleanup = substr($key, 0, 11) == "\0\0\0\7ssh-rsa"; + + if (strlen($key) <= 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($key, 4))); + $publicExponent = new Math_BigInteger($this->_string_shift($key, $length), -256); + if (strlen($key) <= 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($key, 4))); + $modulus = new Math_BigInteger($this->_string_shift($key, $length), -256); + + if ($cleanup && strlen($key)) { + if (strlen($key) <= 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($key, 4))); + $realModulus = new Math_BigInteger($this->_string_shift($key, $length), -256); + return strlen($key) ? false : array( + 'modulus' => $realModulus, + 'publicExponent' => $modulus, + 'comment' => $comment + ); + } else { + return strlen($key) ? false : array( + 'modulus' => $modulus, + 'publicExponent' => $publicExponent, + 'comment' => $comment + ); + } + // http://www.w3.org/TR/xmldsig-core/#sec-RSAKeyValue + // http://en.wikipedia.org/wiki/XML_Signature + case CRYPT_RSA_PRIVATE_FORMAT_XML: + case CRYPT_RSA_PUBLIC_FORMAT_XML: + $this->components = array(); + + $xml = xml_parser_create('UTF-8'); + xml_set_object($xml, $this); + xml_set_element_handler($xml, '_start_element_handler', '_stop_element_handler'); + xml_set_character_data_handler($xml, '_data_handler'); + // add to account for "dangling" tags like ... that are sometimes added + if (!xml_parse($xml, '' . $key . '')) { + return false; + } + + return isset($this->components['modulus']) && isset($this->components['publicExponent']) ? $this->components : false; + // from PuTTY's SSHPUBK.C + case CRYPT_RSA_PRIVATE_FORMAT_PUTTY: + $components = array(); + $key = preg_split('#\r\n|\r|\n#', $key); + $type = trim(preg_replace('#PuTTY-User-Key-File-2: (.+)#', '$1', $key[0])); + if ($type != 'ssh-rsa') { + return false; + } + $encryption = trim(preg_replace('#Encryption: (.+)#', '$1', $key[1])); + $comment = trim(preg_replace('#Comment: (.+)#', '$1', $key[2])); + + $publicLength = trim(preg_replace('#Public-Lines: (\d+)#', '$1', $key[3])); + $public = base64_decode(implode('', array_map('trim', array_slice($key, 4, $publicLength)))); + $public = substr($public, 11); + extract(unpack('Nlength', $this->_string_shift($public, 4))); + $components['publicExponent'] = new Math_BigInteger($this->_string_shift($public, $length), -256); + extract(unpack('Nlength', $this->_string_shift($public, 4))); + $components['modulus'] = new Math_BigInteger($this->_string_shift($public, $length), -256); + + $privateLength = trim(preg_replace('#Private-Lines: (\d+)#', '$1', $key[$publicLength + 4])); + $private = base64_decode(implode('', array_map('trim', array_slice($key, $publicLength + 5, $privateLength)))); + + switch ($encryption) { + case 'aes256-cbc': + if (!class_exists('Crypt_AES')) { + include_once 'Crypt/AES.php'; + } + $symkey = ''; + $sequence = 0; + while (strlen($symkey) < 32) { + $temp = pack('Na*', $sequence++, $this->password); + $symkey.= pack('H*', sha1($temp)); + } + $symkey = substr($symkey, 0, 32); + $crypto = new Crypt_AES(); + } + + if ($encryption != 'none') { + $crypto->setKey($symkey); + $crypto->disablePadding(); + $private = $crypto->decrypt($private); + if ($private === false) { + return false; + } + } + + extract(unpack('Nlength', $this->_string_shift($private, 4))); + if (strlen($private) < $length) { + return false; + } + $components['privateExponent'] = new Math_BigInteger($this->_string_shift($private, $length), -256); + extract(unpack('Nlength', $this->_string_shift($private, 4))); + if (strlen($private) < $length) { + return false; + } + $components['primes'] = array(1 => new Math_BigInteger($this->_string_shift($private, $length), -256)); + extract(unpack('Nlength', $this->_string_shift($private, 4))); + if (strlen($private) < $length) { + return false; + } + $components['primes'][] = new Math_BigInteger($this->_string_shift($private, $length), -256); + + $temp = $components['primes'][1]->subtract($this->one); + $components['exponents'] = array(1 => $components['publicExponent']->modInverse($temp)); + $temp = $components['primes'][2]->subtract($this->one); + $components['exponents'][] = $components['publicExponent']->modInverse($temp); + + extract(unpack('Nlength', $this->_string_shift($private, 4))); + if (strlen($private) < $length) { + return false; + } + $components['coefficients'] = array(2 => new Math_BigInteger($this->_string_shift($private, $length), -256)); + + return $components; + } + } + + /** + * Returns the key size + * + * More specifically, this returns the size of the modulo in bits. + * + * @access public + * @return Integer + */ + function getSize() + { + return !isset($this->modulus) ? 0 : strlen($this->modulus->toBits()); + } + + /** + * Start Element Handler + * + * Called by xml_set_element_handler() + * + * @access private + * @param Resource $parser + * @param String $name + * @param Array $attribs + */ + function _start_element_handler($parser, $name, $attribs) + { + //$name = strtoupper($name); + switch ($name) { + case 'MODULUS': + $this->current = &$this->components['modulus']; + break; + case 'EXPONENT': + $this->current = &$this->components['publicExponent']; + break; + case 'P': + $this->current = &$this->components['primes'][1]; + break; + case 'Q': + $this->current = &$this->components['primes'][2]; + break; + case 'DP': + $this->current = &$this->components['exponents'][1]; + break; + case 'DQ': + $this->current = &$this->components['exponents'][2]; + break; + case 'INVERSEQ': + $this->current = &$this->components['coefficients'][2]; + break; + case 'D': + $this->current = &$this->components['privateExponent']; + } + $this->current = ''; + } + + /** + * Stop Element Handler + * + * Called by xml_set_element_handler() + * + * @access private + * @param Resource $parser + * @param String $name + */ + function _stop_element_handler($parser, $name) + { + if (isset($this->current)) { + $this->current = new Math_BigInteger(base64_decode($this->current), 256); + unset($this->current); + } + } + + /** + * Data Handler + * + * Called by xml_set_character_data_handler() + * + * @access private + * @param Resource $parser + * @param String $data + */ + function _data_handler($parser, $data) + { + if (!isset($this->current) || is_object($this->current)) { + return; + } + $this->current.= trim($data); + } + + /** + * Loads a public or private key + * + * Returns true on success and false on failure (ie. an incorrect password was provided or the key was malformed) + * + * @access public + * @param String $key + * @param Integer $type optional + */ + function loadKey($key, $type = false) + { + if (is_object($key) && strtolower(get_class($key)) == 'crypt_rsa') { + $this->privateKeyFormat = $key->privateKeyFormat; + $this->publicKeyFormat = $key->publicKeyFormat; + $this->k = $key->k; + $this->hLen = $key->hLen; + $this->sLen = $key->sLen; + $this->mgfHLen = $key->mgfHLen; + $this->encryptionMode = $key->encryptionMode; + $this->signatureMode = $key->signatureMode; + $this->password = $key->password; + $this->configFile = $key->configFile; + $this->comment = $key->comment; + + if (is_object($key->hash)) { + $this->hash = new Crypt_Hash($key->hash->getHash()); + } + if (is_object($key->mgfHash)) { + $this->mgfHash = new Crypt_Hash($key->mgfHash->getHash()); + } + + if (is_object($key->modulus)) { + $this->modulus = $key->modulus->copy(); + } + if (is_object($key->exponent)) { + $this->exponent = $key->exponent->copy(); + } + if (is_object($key->publicExponent)) { + $this->publicExponent = $key->publicExponent->copy(); + } + + $this->primes = array(); + $this->exponents = array(); + $this->coefficients = array(); + + foreach ($this->primes as $prime) { + $this->primes[] = $prime->copy(); + } + foreach ($this->exponents as $exponent) { + $this->exponents[] = $exponent->copy(); + } + foreach ($this->coefficients as $coefficient) { + $this->coefficients[] = $coefficient->copy(); + } + + return true; + } + + if ($type === false) { + $types = array( + CRYPT_RSA_PUBLIC_FORMAT_RAW, + CRYPT_RSA_PRIVATE_FORMAT_PKCS1, + CRYPT_RSA_PRIVATE_FORMAT_XML, + CRYPT_RSA_PRIVATE_FORMAT_PUTTY, + CRYPT_RSA_PUBLIC_FORMAT_OPENSSH + ); + foreach ($types as $type) { + $components = $this->_parseKey($key, $type); + if ($components !== false) { + break; + } + } + + } else { + $components = $this->_parseKey($key, $type); + } + + if ($components === false) { + return false; + } + + if (isset($components['comment']) && $components['comment'] !== false) { + $this->comment = $components['comment']; + } + $this->modulus = $components['modulus']; + $this->k = strlen($this->modulus->toBytes()); + $this->exponent = isset($components['privateExponent']) ? $components['privateExponent'] : $components['publicExponent']; + if (isset($components['primes'])) { + $this->primes = $components['primes']; + $this->exponents = $components['exponents']; + $this->coefficients = $components['coefficients']; + $this->publicExponent = $components['publicExponent']; + } else { + $this->primes = array(); + $this->exponents = array(); + $this->coefficients = array(); + $this->publicExponent = false; + } + + switch ($type) { + case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH: + case CRYPT_RSA_PUBLIC_FORMAT_RAW: + $this->setPublicKey(); + break; + case CRYPT_RSA_PRIVATE_FORMAT_PKCS1: + switch (true) { + case strpos($key, '-BEGIN PUBLIC KEY-') !== false: + case strpos($key, '-BEGIN RSA PUBLIC KEY-') !== false: + $this->setPublicKey(); + } + } + + return true; + } + + /** + * Sets the password + * + * Private keys can be encrypted with a password. To unset the password, pass in the empty string or false. + * Or rather, pass in $password such that empty($password) && !is_string($password) is true. + * + * @see createKey() + * @see loadKey() + * @access public + * @param String $password + */ + function setPassword($password = false) + { + $this->password = $password; + } + + /** + * Defines the public key + * + * Some private key formats define the public exponent and some don't. Those that don't define it are problematic when + * used in certain contexts. For example, in SSH-2, RSA authentication works by sending the public key along with a + * message signed by the private key to the server. The SSH-2 server looks the public key up in an index of public keys + * and if it's present then proceeds to verify the signature. Problem is, if your private key doesn't include the public + * exponent this won't work unless you manually add the public exponent. phpseclib tries to guess if the key being used + * is the public key but in the event that it guesses incorrectly you might still want to explicitly set the key as being + * public. + * + * Do note that when a new key is loaded the index will be cleared. + * + * Returns true on success, false on failure + * + * @see getPublicKey() + * @access public + * @param String $key optional + * @param Integer $type optional + * @return Boolean + */ + function setPublicKey($key = false, $type = false) + { + // if a public key has already been loaded return false + if (!empty($this->publicExponent)) { + return false; + } + + if ($key === false && !empty($this->modulus)) { + $this->publicExponent = $this->exponent; + return true; + } + + if ($type === false) { + $types = array( + CRYPT_RSA_PUBLIC_FORMAT_RAW, + CRYPT_RSA_PUBLIC_FORMAT_PKCS1, + CRYPT_RSA_PUBLIC_FORMAT_XML, + CRYPT_RSA_PUBLIC_FORMAT_OPENSSH + ); + foreach ($types as $type) { + $components = $this->_parseKey($key, $type); + if ($components !== false) { + break; + } + } + } else { + $components = $this->_parseKey($key, $type); + } + + if ($components === false) { + return false; + } + + if (empty($this->modulus) || !$this->modulus->equals($components['modulus'])) { + $this->modulus = $components['modulus']; + $this->exponent = $this->publicExponent = $components['publicExponent']; + return true; + } + + $this->publicExponent = $components['publicExponent']; + + return true; + } + + /** + * Defines the private key + * + * If phpseclib guessed a private key was a public key and loaded it as such it might be desirable to force + * phpseclib to treat the key as a private key. This function will do that. + * + * Do note that when a new key is loaded the index will be cleared. + * + * Returns true on success, false on failure + * + * @see getPublicKey() + * @access public + * @param String $key optional + * @param Integer $type optional + * @return Boolean + */ + function setPrivateKey($key = false, $type = false) + { + if ($key === false && !empty($this->publicExponent)) { + unset($this->publicExponent); + return true; + } + + $rsa = new Crypt_RSA(); + if (!$rsa->loadKey($key, $type)) { + return false; + } + unset($rsa->publicExponent); + + // don't overwrite the old key if the new key is invalid + $this->loadKey($rsa); + return true; + } + + /** + * Returns the public key + * + * The public key is only returned under two circumstances - if the private key had the public key embedded within it + * or if the public key was set via setPublicKey(). If the currently loaded key is supposed to be the public key this + * function won't return it since this library, for the most part, doesn't distinguish between public and private keys. + * + * @see getPublicKey() + * @access public + * @param String $key + * @param Integer $type optional + */ + function getPublicKey($type = CRYPT_RSA_PUBLIC_FORMAT_PKCS8) + { + if (empty($this->modulus) || empty($this->publicExponent)) { + return false; + } + + $oldFormat = $this->publicKeyFormat; + $this->publicKeyFormat = $type; + $temp = $this->_convertPublicKey($this->modulus, $this->publicExponent); + $this->publicKeyFormat = $oldFormat; + return $temp; + } + + /** + * Returns the private key + * + * The private key is only returned if the currently loaded key contains the constituent prime numbers. + * + * @see getPublicKey() + * @access public + * @param String $key + * @param Integer $type optional + */ + function getPrivateKey($type = CRYPT_RSA_PUBLIC_FORMAT_PKCS1) + { + if (empty($this->primes)) { + return false; + } + + $oldFormat = $this->privateKeyFormat; + $this->privateKeyFormat = $type; + $temp = $this->_convertPrivateKey($this->modulus, $this->publicExponent, $this->exponent, $this->primes, $this->exponents, $this->coefficients); + $this->privateKeyFormat = $oldFormat; + return $temp; + } + + /** + * Returns a minimalistic private key + * + * Returns the private key without the prime number constituants. Structurally identical to a public key that + * hasn't been set as the public key + * + * @see getPrivateKey() + * @access private + * @param String $key + * @param Integer $type optional + */ + function _getPrivatePublicKey($mode = CRYPT_RSA_PUBLIC_FORMAT_PKCS8) + { + if (empty($this->modulus) || empty($this->exponent)) { + return false; + } + + $oldFormat = $this->publicKeyFormat; + $this->publicKeyFormat = $mode; + $temp = $this->_convertPublicKey($this->modulus, $this->exponent); + $this->publicKeyFormat = $oldFormat; + return $temp; + } + + /** + * __toString() magic method + * + * @access public + */ + function __toString() + { + $key = $this->getPrivateKey($this->privateKeyFormat); + if ($key !== false) { + return $key; + } + $key = $this->_getPrivatePublicKey($this->publicKeyFormat); + return $key !== false ? $key : ''; + } + + /** + * __clone() magic method + * + * @access public + */ + function __clone() + { + $key = new Crypt_RSA(); + $key->loadKey($this); + return $key; + } + + /** + * Generates the smallest and largest numbers requiring $bits bits + * + * @access private + * @param Integer $bits + * @return Array + */ + function _generateMinMax($bits) + { + $bytes = $bits >> 3; + $min = str_repeat(chr(0), $bytes); + $max = str_repeat(chr(0xFF), $bytes); + $msb = $bits & 7; + if ($msb) { + $min = chr(1 << ($msb - 1)) . $min; + $max = chr((1 << $msb) - 1) . $max; + } else { + $min[0] = chr(0x80); + } + + return array( + 'min' => new Math_BigInteger($min, 256), + 'max' => new Math_BigInteger($max, 256) + ); + } + + /** + * DER-decode the length + * + * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See + * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. + * + * @access private + * @param String $string + * @return Integer + */ + function _decodeLength(&$string) + { + $length = ord($this->_string_shift($string)); + if ( $length & 0x80 ) { // definite length, long form + $length&= 0x7F; + $temp = $this->_string_shift($string, $length); + list(, $length) = unpack('N', substr(str_pad($temp, 4, chr(0), STR_PAD_LEFT), -4)); + } + return $length; + } + + /** + * DER-encode the length + * + * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See + * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. + * + * @access private + * @param Integer $length + * @return String + */ + function _encodeLength($length) + { + if ($length <= 0x7F) { + return chr($length); + } + + $temp = ltrim(pack('N', $length), chr(0)); + return pack('Ca*', 0x80 | strlen($temp), $temp); + } + + /** + * String Shift + * + * Inspired by array_shift + * + * @param String $string + * @param optional Integer $index + * @return String + * @access private + */ + function _string_shift(&$string, $index = 1) + { + $substr = substr($string, 0, $index); + $string = substr($string, $index); + return $substr; + } + + /** + * Determines the private key format + * + * @see createKey() + * @access public + * @param Integer $format + */ + function setPrivateKeyFormat($format) + { + $this->privateKeyFormat = $format; + } + + /** + * Determines the public key format + * + * @see createKey() + * @access public + * @param Integer $format + */ + function setPublicKeyFormat($format) + { + $this->publicKeyFormat = $format; + } + + /** + * Determines which hashing function should be used + * + * Used with signature production / verification and (if the encryption mode is CRYPT_RSA_ENCRYPTION_OAEP) encryption and + * decryption. If $hash isn't supported, sha1 is used. + * + * @access public + * @param String $hash + */ + function setHash($hash) + { + // Crypt_Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example. + switch ($hash) { + case 'md2': + case 'md5': + case 'sha1': + case 'sha256': + case 'sha384': + case 'sha512': + $this->hash = new Crypt_Hash($hash); + $this->hashName = $hash; + break; + default: + $this->hash = new Crypt_Hash('sha1'); + $this->hashName = 'sha1'; + } + $this->hLen = $this->hash->getLength(); + } + + /** + * Determines which hashing function should be used for the mask generation function + * + * The mask generation function is used by CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_SIGNATURE_PSS and although it's + * best if Hash and MGFHash are set to the same thing this is not a requirement. + * + * @access public + * @param String $hash + */ + function setMGFHash($hash) + { + // Crypt_Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example. + switch ($hash) { + case 'md2': + case 'md5': + case 'sha1': + case 'sha256': + case 'sha384': + case 'sha512': + $this->mgfHash = new Crypt_Hash($hash); + break; + default: + $this->mgfHash = new Crypt_Hash('sha1'); + } + $this->mgfHLen = $this->mgfHash->getLength(); + } + + /** + * Determines the salt length + * + * To quote from {@link http://tools.ietf.org/html/rfc3447#page-38 RFC3447#page-38}: + * + * Typical salt lengths in octets are hLen (the length of the output + * of the hash function Hash) and 0. + * + * @access public + * @param Integer $format + */ + function setSaltLength($sLen) + { + $this->sLen = $sLen; + } + + /** + * Integer-to-Octet-String primitive + * + * See {@link http://tools.ietf.org/html/rfc3447#section-4.1 RFC3447#section-4.1}. + * + * @access private + * @param Math_BigInteger $x + * @param Integer $xLen + * @return String + */ + function _i2osp($x, $xLen) + { + $x = $x->toBytes(); + if (strlen($x) > $xLen) { + user_error('Integer too large'); + return false; + } + return str_pad($x, $xLen, chr(0), STR_PAD_LEFT); + } + + /** + * Octet-String-to-Integer primitive + * + * See {@link http://tools.ietf.org/html/rfc3447#section-4.2 RFC3447#section-4.2}. + * + * @access private + * @param String $x + * @return Math_BigInteger + */ + function _os2ip($x) + { + return new Math_BigInteger($x, 256); + } + + /** + * Exponentiate with or without Chinese Remainder Theorem + * + * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.1 RFC3447#section-5.1.2}. + * + * @access private + * @param Math_BigInteger $x + * @return Math_BigInteger + */ + function _exponentiate($x) + { + if (empty($this->primes) || empty($this->coefficients) || empty($this->exponents)) { + return $x->modPow($this->exponent, $this->modulus); + } + + $num_primes = count($this->primes); + + if (defined('CRYPT_RSA_DISABLE_BLINDING')) { + $m_i = array( + 1 => $x->modPow($this->exponents[1], $this->primes[1]), + 2 => $x->modPow($this->exponents[2], $this->primes[2]) + ); + $h = $m_i[1]->subtract($m_i[2]); + $h = $h->multiply($this->coefficients[2]); + list(, $h) = $h->divide($this->primes[1]); + $m = $m_i[2]->add($h->multiply($this->primes[2])); + + $r = $this->primes[1]; + for ($i = 3; $i <= $num_primes; $i++) { + $m_i = $x->modPow($this->exponents[$i], $this->primes[$i]); + + $r = $r->multiply($this->primes[$i - 1]); + + $h = $m_i->subtract($m); + $h = $h->multiply($this->coefficients[$i]); + list(, $h) = $h->divide($this->primes[$i]); + + $m = $m->add($r->multiply($h)); + } + } else { + $smallest = $this->primes[1]; + for ($i = 2; $i <= $num_primes; $i++) { + if ($smallest->compare($this->primes[$i]) > 0) { + $smallest = $this->primes[$i]; + } + } + + $one = new Math_BigInteger(1); + + $r = $one->random($one, $smallest->subtract($one)); + + $m_i = array( + 1 => $this->_blind($x, $r, 1), + 2 => $this->_blind($x, $r, 2) + ); + $h = $m_i[1]->subtract($m_i[2]); + $h = $h->multiply($this->coefficients[2]); + list(, $h) = $h->divide($this->primes[1]); + $m = $m_i[2]->add($h->multiply($this->primes[2])); + + $r = $this->primes[1]; + for ($i = 3; $i <= $num_primes; $i++) { + $m_i = $this->_blind($x, $r, $i); + + $r = $r->multiply($this->primes[$i - 1]); + + $h = $m_i->subtract($m); + $h = $h->multiply($this->coefficients[$i]); + list(, $h) = $h->divide($this->primes[$i]); + + $m = $m->add($r->multiply($h)); + } + } + + return $m; + } + + /** + * Performs RSA Blinding + * + * Protects against timing attacks by employing RSA Blinding. + * Returns $x->modPow($this->exponents[$i], $this->primes[$i]) + * + * @access private + * @param Math_BigInteger $x + * @param Math_BigInteger $r + * @param Integer $i + * @return Math_BigInteger + */ + function _blind($x, $r, $i) + { + $x = $x->multiply($r->modPow($this->publicExponent, $this->primes[$i])); + $x = $x->modPow($this->exponents[$i], $this->primes[$i]); + + $r = $r->modInverse($this->primes[$i]); + $x = $x->multiply($r); + list(, $x) = $x->divide($this->primes[$i]); + + return $x; + } + + /** + * Performs blinded RSA equality testing + * + * Protects against a particular type of timing attack described. + * + * See {@link http://codahale.com/a-lesson-in-timing-attacks/ A Lesson In Timing Attacks (or, Don't use MessageDigest.isEquals)} + * + * Thanks for the heads up singpolyma! + * + * @access private + * @param String $x + * @param String $y + * @return Boolean + */ + function _equals($x, $y) + { + if (strlen($x) != strlen($y)) { + return false; + } + + $result = 0; + for ($i = 0; $i < strlen($x); $i++) { + $result |= ord($x[$i]) ^ ord($y[$i]); + } + + return $result == 0; + } + + /** + * RSAEP + * + * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.1 RFC3447#section-5.1.1}. + * + * @access private + * @param Math_BigInteger $m + * @return Math_BigInteger + */ + function _rsaep($m) + { + if ($m->compare($this->zero) < 0 || $m->compare($this->modulus) > 0) { + user_error('Message representative out of range'); + return false; + } + return $this->_exponentiate($m); + } + + /** + * RSADP + * + * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.2 RFC3447#section-5.1.2}. + * + * @access private + * @param Math_BigInteger $c + * @return Math_BigInteger + */ + function _rsadp($c) + { + if ($c->compare($this->zero) < 0 || $c->compare($this->modulus) > 0) { + user_error('Ciphertext representative out of range'); + return false; + } + return $this->_exponentiate($c); + } + + /** + * RSASP1 + * + * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.1 RFC3447#section-5.2.1}. + * + * @access private + * @param Math_BigInteger $m + * @return Math_BigInteger + */ + function _rsasp1($m) + { + if ($m->compare($this->zero) < 0 || $m->compare($this->modulus) > 0) { + user_error('Message representative out of range'); + return false; + } + return $this->_exponentiate($m); + } + + /** + * RSAVP1 + * + * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.2 RFC3447#section-5.2.2}. + * + * @access private + * @param Math_BigInteger $s + * @return Math_BigInteger + */ + function _rsavp1($s) + { + if ($s->compare($this->zero) < 0 || $s->compare($this->modulus) > 0) { + user_error('Signature representative out of range'); + return false; + } + return $this->_exponentiate($s); + } + + /** + * MGF1 + * + * See {@link http://tools.ietf.org/html/rfc3447#appendix-B.2.1 RFC3447#appendix-B.2.1}. + * + * @access private + * @param String $mgfSeed + * @param Integer $mgfLen + * @return String + */ + function _mgf1($mgfSeed, $maskLen) + { + // if $maskLen would yield strings larger than 4GB, PKCS#1 suggests a "Mask too long" error be output. + + $t = ''; + $count = ceil($maskLen / $this->mgfHLen); + for ($i = 0; $i < $count; $i++) { + $c = pack('N', $i); + $t.= $this->mgfHash->hash($mgfSeed . $c); + } + + return substr($t, 0, $maskLen); + } + + /** + * RSAES-OAEP-ENCRYPT + * + * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.1 RFC3447#section-7.1.1} and + * {http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding OAES}. + * + * @access private + * @param String $m + * @param String $l + * @return String + */ + function _rsaes_oaep_encrypt($m, $l = '') + { + $mLen = strlen($m); + + // Length checking + + // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error + // be output. + + if ($mLen > $this->k - 2 * $this->hLen - 2) { + user_error('Message too long'); + return false; + } + + // EME-OAEP encoding + + $lHash = $this->hash->hash($l); + $ps = str_repeat(chr(0), $this->k - $mLen - 2 * $this->hLen - 2); + $db = $lHash . $ps . chr(1) . $m; + $seed = crypt_random_string($this->hLen); + $dbMask = $this->_mgf1($seed, $this->k - $this->hLen - 1); + $maskedDB = $db ^ $dbMask; + $seedMask = $this->_mgf1($maskedDB, $this->hLen); + $maskedSeed = $seed ^ $seedMask; + $em = chr(0) . $maskedSeed . $maskedDB; + + // RSA encryption + + $m = $this->_os2ip($em); + $c = $this->_rsaep($m); + $c = $this->_i2osp($c, $this->k); + + // Output the ciphertext C + + return $c; + } + + /** + * RSAES-OAEP-DECRYPT + * + * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.2 RFC3447#section-7.1.2}. The fact that the error + * messages aren't distinguishable from one another hinders debugging, but, to quote from RFC3447#section-7.1.2: + * + * Note. Care must be taken to ensure that an opponent cannot + * distinguish the different error conditions in Step 3.g, whether by + * error message or timing, or, more generally, learn partial + * information about the encoded message EM. Otherwise an opponent may + * be able to obtain useful information about the decryption of the + * ciphertext C, leading to a chosen-ciphertext attack such as the one + * observed by Manger [36]. + * + * As for $l... to quote from {@link http://tools.ietf.org/html/rfc3447#page-17 RFC3447#page-17}: + * + * Both the encryption and the decryption operations of RSAES-OAEP take + * the value of a label L as input. In this version of PKCS #1, L is + * the empty string; other uses of the label are outside the scope of + * this document. + * + * @access private + * @param String $c + * @param String $l + * @return String + */ + function _rsaes_oaep_decrypt($c, $l = '') + { + // Length checking + + // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error + // be output. + + if (strlen($c) != $this->k || $this->k < 2 * $this->hLen + 2) { + user_error('Decryption error'); + return false; + } + + // RSA decryption + + $c = $this->_os2ip($c); + $m = $this->_rsadp($c); + if ($m === false) { + user_error('Decryption error'); + return false; + } + $em = $this->_i2osp($m, $this->k); + + // EME-OAEP decoding + + $lHash = $this->hash->hash($l); + $y = ord($em[0]); + $maskedSeed = substr($em, 1, $this->hLen); + $maskedDB = substr($em, $this->hLen + 1); + $seedMask = $this->_mgf1($maskedDB, $this->hLen); + $seed = $maskedSeed ^ $seedMask; + $dbMask = $this->_mgf1($seed, $this->k - $this->hLen - 1); + $db = $maskedDB ^ $dbMask; + $lHash2 = substr($db, 0, $this->hLen); + $m = substr($db, $this->hLen); + if ($lHash != $lHash2) { + user_error('Decryption error'); + return false; + } + $m = ltrim($m, chr(0)); + if (ord($m[0]) != 1) { + user_error('Decryption error'); + return false; + } + + // Output the message M + + return substr($m, 1); + } + + /** + * RSAES-PKCS1-V1_5-ENCRYPT + * + * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.1 RFC3447#section-7.2.1}. + * + * @access private + * @param String $m + * @return String + */ + function _rsaes_pkcs1_v1_5_encrypt($m) + { + $mLen = strlen($m); + + // Length checking + + if ($mLen > $this->k - 11) { + user_error('Message too long'); + return false; + } + + // EME-PKCS1-v1_5 encoding + + $psLen = $this->k - $mLen - 3; + $ps = ''; + while (strlen($ps) != $psLen) { + $temp = crypt_random_string($psLen - strlen($ps)); + $temp = str_replace("\x00", '', $temp); + $ps.= $temp; + } + $type = 2; + // see the comments of _rsaes_pkcs1_v1_5_decrypt() to understand why this is being done + if (defined('CRYPT_RSA_PKCS15_COMPAT') && (!isset($this->publicExponent) || $this->exponent !== $this->publicExponent)) { + $type = 1; + // "The padding string PS shall consist of k-3-||D|| octets. ... for block type 01, they shall have value FF" + $ps = str_repeat("\xFF", $psLen); + } + $em = chr(0) . chr($type) . $ps . chr(0) . $m; + + // RSA encryption + $m = $this->_os2ip($em); + $c = $this->_rsaep($m); + $c = $this->_i2osp($c, $this->k); + + // Output the ciphertext C + + return $c; + } + + /** + * RSAES-PKCS1-V1_5-DECRYPT + * + * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.2 RFC3447#section-7.2.2}. + * + * For compatibility purposes, this function departs slightly from the description given in RFC3447. + * The reason being that RFC2313#section-8.1 (PKCS#1 v1.5) states that ciphertext's encrypted by the + * private key should have the second byte set to either 0 or 1 and that ciphertext's encrypted by the + * public key should have the second byte set to 2. In RFC3447 (PKCS#1 v2.1), the second byte is supposed + * to be 2 regardless of which key is used. For compatibility purposes, we'll just check to make sure the + * second byte is 2 or less. If it is, we'll accept the decrypted string as valid. + * + * As a consequence of this, a private key encrypted ciphertext produced with Crypt_RSA may not decrypt + * with a strictly PKCS#1 v1.5 compliant RSA implementation. Public key encrypted ciphertext's should but + * not private key encrypted ciphertext's. + * + * @access private + * @param String $c + * @return String + */ + function _rsaes_pkcs1_v1_5_decrypt($c) + { + // Length checking + + if (strlen($c) != $this->k) { // or if k < 11 + user_error('Decryption error'); + return false; + } + + // RSA decryption + + $c = $this->_os2ip($c); + $m = $this->_rsadp($c); + + if ($m === false) { + user_error('Decryption error'); + return false; + } + $em = $this->_i2osp($m, $this->k); + + // EME-PKCS1-v1_5 decoding + + if (ord($em[0]) != 0 || ord($em[1]) > 2) { + user_error('Decryption error'); + return false; + } + + $ps = substr($em, 2, strpos($em, chr(0), 2) - 2); + $m = substr($em, strlen($ps) + 3); + + if (strlen($ps) < 8) { + user_error('Decryption error'); + return false; + } + + // Output M + + return $m; + } + + /** + * EMSA-PSS-ENCODE + * + * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.1 RFC3447#section-9.1.1}. + * + * @access private + * @param String $m + * @param Integer $emBits + */ + function _emsa_pss_encode($m, $emBits) + { + // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error + // be output. + + $emLen = ($emBits + 1) >> 3; // ie. ceil($emBits / 8) + $sLen = $this->sLen == false ? $this->hLen : $this->sLen; + + $mHash = $this->hash->hash($m); + if ($emLen < $this->hLen + $sLen + 2) { + user_error('Encoding error'); + return false; + } + + $salt = crypt_random_string($sLen); + $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt; + $h = $this->hash->hash($m2); + $ps = str_repeat(chr(0), $emLen - $sLen - $this->hLen - 2); + $db = $ps . chr(1) . $salt; + $dbMask = $this->_mgf1($h, $emLen - $this->hLen - 1); + $maskedDB = $db ^ $dbMask; + $maskedDB[0] = ~chr(0xFF << ($emBits & 7)) & $maskedDB[0]; + $em = $maskedDB . $h . chr(0xBC); + + return $em; + } + + /** + * EMSA-PSS-VERIFY + * + * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.2 RFC3447#section-9.1.2}. + * + * @access private + * @param String $m + * @param String $em + * @param Integer $emBits + * @return String + */ + function _emsa_pss_verify($m, $em, $emBits) + { + // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error + // be output. + + $emLen = ($emBits + 1) >> 3; // ie. ceil($emBits / 8); + $sLen = $this->sLen == false ? $this->hLen : $this->sLen; + + $mHash = $this->hash->hash($m); + if ($emLen < $this->hLen + $sLen + 2) { + return false; + } + + if ($em[strlen($em) - 1] != chr(0xBC)) { + return false; + } + + $maskedDB = substr($em, 0, -$this->hLen - 1); + $h = substr($em, -$this->hLen - 1, $this->hLen); + $temp = chr(0xFF << ($emBits & 7)); + if ((~$maskedDB[0] & $temp) != $temp) { + return false; + } + $dbMask = $this->_mgf1($h, $emLen - $this->hLen - 1); + $db = $maskedDB ^ $dbMask; + $db[0] = ~chr(0xFF << ($emBits & 7)) & $db[0]; + $temp = $emLen - $this->hLen - $sLen - 2; + if (substr($db, 0, $temp) != str_repeat(chr(0), $temp) || ord($db[$temp]) != 1) { + return false; + } + $salt = substr($db, $temp + 1); // should be $sLen long + $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt; + $h2 = $this->hash->hash($m2); + return $this->_equals($h, $h2); + } + + /** + * RSASSA-PSS-SIGN + * + * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.1 RFC3447#section-8.1.1}. + * + * @access private + * @param String $m + * @return String + */ + function _rsassa_pss_sign($m) + { + // EMSA-PSS encoding + + $em = $this->_emsa_pss_encode($m, 8 * $this->k - 1); + + // RSA signature + + $m = $this->_os2ip($em); + $s = $this->_rsasp1($m); + $s = $this->_i2osp($s, $this->k); + + // Output the signature S + + return $s; + } + + /** + * RSASSA-PSS-VERIFY + * + * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.2 RFC3447#section-8.1.2}. + * + * @access private + * @param String $m + * @param String $s + * @return String + */ + function _rsassa_pss_verify($m, $s) + { + // Length checking + + if (strlen($s) != $this->k) { + user_error('Invalid signature'); + return false; + } + + // RSA verification + + $modBits = 8 * $this->k; + + $s2 = $this->_os2ip($s); + $m2 = $this->_rsavp1($s2); + if ($m2 === false) { + user_error('Invalid signature'); + return false; + } + $em = $this->_i2osp($m2, $modBits >> 3); + if ($em === false) { + user_error('Invalid signature'); + return false; + } + + // EMSA-PSS verification + + return $this->_emsa_pss_verify($m, $em, $modBits - 1); + } + + /** + * EMSA-PKCS1-V1_5-ENCODE + * + * See {@link http://tools.ietf.org/html/rfc3447#section-9.2 RFC3447#section-9.2}. + * + * @access private + * @param String $m + * @param Integer $emLen + * @return String + */ + function _emsa_pkcs1_v1_5_encode($m, $emLen) + { + $h = $this->hash->hash($m); + if ($h === false) { + return false; + } + + // see http://tools.ietf.org/html/rfc3447#page-43 + switch ($this->hashName) { + case 'md2': + $t = pack('H*', '3020300c06082a864886f70d020205000410'); + break; + case 'md5': + $t = pack('H*', '3020300c06082a864886f70d020505000410'); + break; + case 'sha1': + $t = pack('H*', '3021300906052b0e03021a05000414'); + break; + case 'sha256': + $t = pack('H*', '3031300d060960864801650304020105000420'); + break; + case 'sha384': + $t = pack('H*', '3041300d060960864801650304020205000430'); + break; + case 'sha512': + $t = pack('H*', '3051300d060960864801650304020305000440'); + } + $t.= $h; + $tLen = strlen($t); + + if ($emLen < $tLen + 11) { + user_error('Intended encoded message length too short'); + return false; + } + + $ps = str_repeat(chr(0xFF), $emLen - $tLen - 3); + + $em = "\0\1$ps\0$t"; + + return $em; + } + + /** + * RSASSA-PKCS1-V1_5-SIGN + * + * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.1 RFC3447#section-8.2.1}. + * + * @access private + * @param String $m + * @return String + */ + function _rsassa_pkcs1_v1_5_sign($m) + { + // EMSA-PKCS1-v1_5 encoding + + $em = $this->_emsa_pkcs1_v1_5_encode($m, $this->k); + if ($em === false) { + user_error('RSA modulus too short'); + return false; + } + + // RSA signature + + $m = $this->_os2ip($em); + $s = $this->_rsasp1($m); + $s = $this->_i2osp($s, $this->k); + + // Output the signature S + + return $s; + } + + /** + * RSASSA-PKCS1-V1_5-VERIFY + * + * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.2 RFC3447#section-8.2.2}. + * + * @access private + * @param String $m + * @return String + */ + function _rsassa_pkcs1_v1_5_verify($m, $s) + { + // Length checking + + if (strlen($s) != $this->k) { + user_error('Invalid signature'); + return false; + } + + // RSA verification + + $s = $this->_os2ip($s); + $m2 = $this->_rsavp1($s); + if ($m2 === false) { + user_error('Invalid signature'); + return false; + } + $em = $this->_i2osp($m2, $this->k); + if ($em === false) { + user_error('Invalid signature'); + return false; + } + + // EMSA-PKCS1-v1_5 encoding + + $em2 = $this->_emsa_pkcs1_v1_5_encode($m, $this->k); + if ($em2 === false) { + user_error('RSA modulus too short'); + return false; + } + + // Compare + return $this->_equals($em, $em2); + } + + /** + * Set Encryption Mode + * + * Valid values include CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_ENCRYPTION_PKCS1. + * + * @access public + * @param Integer $mode + */ + function setEncryptionMode($mode) + { + $this->encryptionMode = $mode; + } + + /** + * Set Signature Mode + * + * Valid values include CRYPT_RSA_SIGNATURE_PSS and CRYPT_RSA_SIGNATURE_PKCS1 + * + * @access public + * @param Integer $mode + */ + function setSignatureMode($mode) + { + $this->signatureMode = $mode; + } + + /** + * Set public key comment. + * + * @access public + * @param String $comment + */ + function setComment($comment) + { + $this->comment = $comment; + } + + /** + * Get public key comment. + * + * @access public + * @return String + */ + function getComment() + { + return $this->comment; + } + + /** + * Encryption + * + * Both CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_ENCRYPTION_PKCS1 both place limits on how long $plaintext can be. + * If $plaintext exceeds those limits it will be broken up so that it does and the resultant ciphertext's will + * be concatenated together. + * + * @see decrypt() + * @access public + * @param String $plaintext + * @return String + */ + function encrypt($plaintext) + { + switch ($this->encryptionMode) { + case CRYPT_RSA_ENCRYPTION_PKCS1: + $length = $this->k - 11; + if ($length <= 0) { + return false; + } + + $plaintext = str_split($plaintext, $length); + $ciphertext = ''; + foreach ($plaintext as $m) { + $ciphertext.= $this->_rsaes_pkcs1_v1_5_encrypt($m); + } + return $ciphertext; + //case CRYPT_RSA_ENCRYPTION_OAEP: + default: + $length = $this->k - 2 * $this->hLen - 2; + if ($length <= 0) { + return false; + } + + $plaintext = str_split($plaintext, $length); + $ciphertext = ''; + foreach ($plaintext as $m) { + $ciphertext.= $this->_rsaes_oaep_encrypt($m); + } + return $ciphertext; + } + } + + /** + * Decryption + * + * @see encrypt() + * @access public + * @param String $plaintext + * @return String + */ + function decrypt($ciphertext) + { + if ($this->k <= 0) { + return false; + } + + $ciphertext = str_split($ciphertext, $this->k); + $ciphertext[count($ciphertext) - 1] = str_pad($ciphertext[count($ciphertext) - 1], $this->k, chr(0), STR_PAD_LEFT); + + $plaintext = ''; + + switch ($this->encryptionMode) { + case CRYPT_RSA_ENCRYPTION_PKCS1: + $decrypt = '_rsaes_pkcs1_v1_5_decrypt'; + break; + //case CRYPT_RSA_ENCRYPTION_OAEP: + default: + $decrypt = '_rsaes_oaep_decrypt'; + } + + foreach ($ciphertext as $c) { + $temp = $this->$decrypt($c); + if ($temp === false) { + return false; + } + $plaintext.= $temp; + } + + return $plaintext; + } + + /** + * Create a signature + * + * @see verify() + * @access public + * @param String $message + * @return String + */ + function sign($message) + { + if (empty($this->modulus) || empty($this->exponent)) { + return false; + } + + switch ($this->signatureMode) { + case CRYPT_RSA_SIGNATURE_PKCS1: + return $this->_rsassa_pkcs1_v1_5_sign($message); + //case CRYPT_RSA_SIGNATURE_PSS: + default: + return $this->_rsassa_pss_sign($message); + } + } + + /** + * Verifies a signature + * + * @see sign() + * @access public + * @param String $message + * @param String $signature + * @return Boolean + */ + function verify($message, $signature) + { + if (empty($this->modulus) || empty($this->exponent)) { + return false; + } + + switch ($this->signatureMode) { + case CRYPT_RSA_SIGNATURE_PKCS1: + return $this->_rsassa_pkcs1_v1_5_verify($message, $signature); + //case CRYPT_RSA_SIGNATURE_PSS: + default: + return $this->_rsassa_pss_verify($message, $signature); + } + } + + /** + * Extract raw BER from Base64 encoding + * + * @access private + * @param String $str + * @return String + */ + function _extractBER($str) + { + /* X.509 certs are assumed to be base64 encoded but sometimes they'll have additional things in them + * above and beyond the ceritificate. + * ie. some may have the following preceding the -----BEGIN CERTIFICATE----- line: + * + * Bag Attributes + * localKeyID: 01 00 00 00 + * subject=/O=organization/OU=org unit/CN=common name + * issuer=/O=organization/CN=common name + */ + $temp = preg_replace('#.*?^-+[^-]+-+#ms', '', $str, 1); + // remove the -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- stuff + $temp = preg_replace('#-+[^-]+-+#', '', $temp); + // remove new lines + $temp = str_replace(array("\r", "\n", ' '), '', $temp); + $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? base64_decode($temp) : false; + return $temp != false ? $temp : $str; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Random.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Random.php new file mode 100755 index 00000000..918b97bf --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Random.php @@ -0,0 +1,300 @@ + + * + * + * + * LICENSE: 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. + * + * @category Crypt + * @package Crypt_Random + * @author Jim Wigginton + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +// laravel is a PHP framework that utilizes phpseclib. laravel workbenches may, independently, +// have phpseclib as a requirement as well. if you're developing such a program you may encounter +// a "Cannot redeclare crypt_random_string()" error. +if (!function_exists('crypt_random_string')) { + /** + * "Is Windows" test + * + * @access private + */ + define('CRYPT_RANDOM_IS_WINDOWS', strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'); + + /** + * Generate a random string. + * + * Although microoptimizations are generally discouraged as they impair readability this function is ripe with + * microoptimizations because this function has the potential of being called a huge number of times. + * eg. for RSA key generation. + * + * @param Integer $length + * @return String + * @access public + */ + function crypt_random_string($length) + { + if (CRYPT_RANDOM_IS_WINDOWS) { + // method 1. prior to PHP 5.3 this would call rand() on windows hence the function_exists('class_alias') call. + // ie. class_alias is a function that was introduced in PHP 5.3 + if (function_exists('mcrypt_create_iv') && function_exists('class_alias')) { + return mcrypt_create_iv($length); + } + // method 2. openssl_random_pseudo_bytes was introduced in PHP 5.3.0 but prior to PHP 5.3.4 there was, + // to quote , "possible blocking behavior". as of 5.3.4 + // openssl_random_pseudo_bytes and mcrypt_create_iv do the exact same thing on Windows. ie. they both + // call php_win32_get_random_bytes(): + // + // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/openssl/openssl.c#L5008 + // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1392 + // + // php_win32_get_random_bytes() is defined thusly: + // + // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/win32/winutil.c#L80 + // + // we're calling it, all the same, in the off chance that the mcrypt extension is not available + if (function_exists('openssl_random_pseudo_bytes') && version_compare(PHP_VERSION, '5.3.4', '>=')) { + return openssl_random_pseudo_bytes($length); + } + } else { + // method 1. the fastest + if (function_exists('openssl_random_pseudo_bytes')) { + return openssl_random_pseudo_bytes($length); + } + // method 2 + static $fp = true; + if ($fp === true) { + // warning's will be output unles the error suppression operator is used. errors such as + // "open_basedir restriction in effect", "Permission denied", "No such file or directory", etc. + $fp = @fopen('/dev/urandom', 'rb'); + } + if ($fp !== true && $fp !== false) { // surprisingly faster than !is_bool() or is_resource() + return fread($fp, $length); + } + // method 3. pretty much does the same thing as method 2 per the following url: + // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1391 + // surprisingly slower than method 2. maybe that's because mcrypt_create_iv does a bunch of error checking that we're + // not doing. regardless, this'll only be called if this PHP script couldn't open /dev/urandom due to open_basedir + // restrictions or some such + if (function_exists('mcrypt_create_iv')) { + return mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); + } + } + // at this point we have no choice but to use a pure-PHP CSPRNG + + // cascade entropy across multiple PHP instances by fixing the session and collecting all + // environmental variables, including the previous session data and the current session + // data. + // + // mt_rand seeds itself by looking at the PID and the time, both of which are (relatively) + // easy to guess at. linux uses mouse clicks, keyboard timings, etc, as entropy sources, but + // PHP isn't low level to be able to use those as sources and on a web server there's not likely + // going to be a ton of keyboard or mouse action. web servers do have one thing that we can use + // however, a ton of people visiting the website. obviously you don't want to base your seeding + // soley on parameters a potential attacker sends but (1) not everything in $_SERVER is controlled + // by the user and (2) this isn't just looking at the data sent by the current user - it's based + // on the data sent by all users. one user requests the page and a hash of their info is saved. + // another user visits the page and the serialization of their data is utilized along with the + // server envirnment stuff and a hash of the previous http request data (which itself utilizes + // a hash of the session data before that). certainly an attacker should be assumed to have + // full control over his own http requests. he, however, is not going to have control over + // everyone's http requests. + static $crypto = false, $v; + if ($crypto === false) { + // save old session data + $old_session_id = session_id(); + $old_use_cookies = ini_get('session.use_cookies'); + $old_session_cache_limiter = session_cache_limiter(); + $_OLD_SESSION = isset($_SESSION) ? $_SESSION : false; + if ($old_session_id != '') { + session_write_close(); + } + + session_id(1); + ini_set('session.use_cookies', 0); + session_cache_limiter(''); + session_start(); + + $v = $seed = $_SESSION['seed'] = pack('H*', sha1( + serialize($_SERVER) . + serialize($_POST) . + serialize($_GET) . + serialize($_COOKIE) . + serialize($GLOBALS) . + serialize($_SESSION) . + serialize($_OLD_SESSION) + )); + if (!isset($_SESSION['count'])) { + $_SESSION['count'] = 0; + } + $_SESSION['count']++; + + session_write_close(); + + // restore old session data + if ($old_session_id != '') { + session_id($old_session_id); + session_start(); + ini_set('session.use_cookies', $old_use_cookies); + session_cache_limiter($old_session_cache_limiter); + } else { + if ($_OLD_SESSION !== false) { + $_SESSION = $_OLD_SESSION; + unset($_OLD_SESSION); + } else { + unset($_SESSION); + } + } + + // in SSH2 a shared secret and an exchange hash are generated through the key exchange process. + // the IV client to server is the hash of that "nonce" with the letter A and for the encryption key it's the letter C. + // if the hash doesn't produce enough a key or an IV that's long enough concat successive hashes of the + // original hash and the current hash. we'll be emulating that. for more info see the following URL: + // + // http://tools.ietf.org/html/rfc4253#section-7.2 + // + // see the is_string($crypto) part for an example of how to expand the keys + $key = pack('H*', sha1($seed . 'A')); + $iv = pack('H*', sha1($seed . 'C')); + + // ciphers are used as per the nist.gov link below. also, see this link: + // + // http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator#Designs_based_on_cryptographic_primitives + switch (true) { + case phpseclib_resolve_include_path('Crypt/AES.php'): + if (!class_exists('Crypt_AES')) { + include_once 'AES.php'; + } + $crypto = new Crypt_AES(CRYPT_AES_MODE_CTR); + break; + case phpseclib_resolve_include_path('Crypt/Twofish.php'): + if (!class_exists('Crypt_Twofish')) { + include_once 'Twofish.php'; + } + $crypto = new Crypt_Twofish(CRYPT_TWOFISH_MODE_CTR); + break; + case phpseclib_resolve_include_path('Crypt/Blowfish.php'): + if (!class_exists('Crypt_Blowfish')) { + include_once 'Blowfish.php'; + } + $crypto = new Crypt_Blowfish(CRYPT_BLOWFISH_MODE_CTR); + break; + case phpseclib_resolve_include_path('Crypt/TripleDES.php'): + if (!class_exists('Crypt_TripleDES')) { + include_once 'TripleDES.php'; + } + $crypto = new Crypt_TripleDES(CRYPT_DES_MODE_CTR); + break; + case phpseclib_resolve_include_path('Crypt/DES.php'): + if (!class_exists('Crypt_DES')) { + include_once 'DES.php'; + } + $crypto = new Crypt_DES(CRYPT_DES_MODE_CTR); + break; + case phpseclib_resolve_include_path('Crypt/RC4.php'): + if (!class_exists('Crypt_RC4')) { + include_once 'RC4.php'; + } + $crypto = new Crypt_RC4(); + break; + default: + user_error('crypt_random_string requires at least one symmetric cipher be loaded'); + return false; + } + + $crypto->setKey($key); + $crypto->setIV($iv); + $crypto->enableContinuousBuffer(); + } + + //return $crypto->encrypt(str_repeat("\0", $length)); + + // the following is based off of ANSI X9.31: + // + // http://csrc.nist.gov/groups/STM/cavp/documents/rng/931rngext.pdf + // + // OpenSSL uses that same standard for it's random numbers: + // + // http://www.opensource.apple.com/source/OpenSSL/OpenSSL-38/openssl/fips-1.0/rand/fips_rand.c + // (do a search for "ANS X9.31 A.2.4") + $result = ''; + while (strlen($result) < $length) { + $i = $crypto->encrypt(microtime()); // strlen(microtime()) == 21 + $r = $crypto->encrypt($i ^ $v); // strlen($v) == 20 + $v = $crypto->encrypt($r ^ $i); // strlen($r) == 20 + $result.= $r; + } + return substr($result, 0, $length); + } +} + +if (!function_exists('phpseclib_resolve_include_path')) { + /** + * Resolve filename against the include path. + * + * Wrapper around stream_resolve_include_path() (which was introduced in + * PHP 5.3.2) with fallback implementation for earlier PHP versions. + * + * @param string $filename + * @return mixed Filename (string) on success, false otherwise. + * @access public + */ + function phpseclib_resolve_include_path($filename) + { + if (function_exists('stream_resolve_include_path')) { + return stream_resolve_include_path($filename); + } + + // handle non-relative paths + if (file_exists($filename)) { + return realpath($filename); + } + + $paths = PATH_SEPARATOR == ':' ? + preg_split('#(? + * setKey('abcdefghijklmnop'); + * + * $size = 10 * 1024; + * $plaintext = ''; + * for ($i = 0; $i < $size; $i++) { + * $plaintext.= 'a'; + * } + * + * echo $rijndael->decrypt($rijndael->encrypt($plaintext)); + * ?> + * + * + * LICENSE: 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. + * + * @category Crypt + * @package Crypt_Rijndael + * @author Jim Wigginton + * @copyright 2008 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Base + * + * Base cipher class + */ +if (!class_exists('Crypt_Base')) { + include_once 'Base.php'; +} + +/**#@+ + * @access public + * @see Crypt_Rijndael::encrypt() + * @see Crypt_Rijndael::decrypt() + */ +/** + * Encrypt / decrypt using the Counter mode. + * + * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 + */ +define('CRYPT_RIJNDAEL_MODE_CTR', CRYPT_MODE_CTR); +/** + * Encrypt / decrypt using the Electronic Code Book mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 + */ +define('CRYPT_RIJNDAEL_MODE_ECB', CRYPT_MODE_ECB); +/** + * Encrypt / decrypt using the Code Book Chaining mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 + */ +define('CRYPT_RIJNDAEL_MODE_CBC', CRYPT_MODE_CBC); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 + */ +define('CRYPT_RIJNDAEL_MODE_CFB', CRYPT_MODE_CFB); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 + */ +define('CRYPT_RIJNDAEL_MODE_OFB', CRYPT_MODE_OFB); +/**#@-*/ + +/**#@+ + * @access private + * @see Crypt_Base::Crypt_Base() + */ +/** + * Toggles the internal implementation + */ +define('CRYPT_RIJNDAEL_MODE_INTERNAL', CRYPT_MODE_INTERNAL); +/** + * Toggles the mcrypt implementation + */ +define('CRYPT_RIJNDAEL_MODE_MCRYPT', CRYPT_MODE_MCRYPT); +/**#@-*/ + +/** + * Pure-PHP implementation of Rijndael. + * + * @package Crypt_Rijndael + * @author Jim Wigginton + * @access public + */ +class Crypt_Rijndael extends Crypt_Base +{ + /** + * The default password key_size used by setPassword() + * + * @see Crypt_Base::password_key_size + * @see Crypt_Base::setPassword() + * @var Integer + * @access private + */ + var $password_key_size = 16; + + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_Base::const_namespace + * @var String + * @access private + */ + var $const_namespace = 'RIJNDAEL'; + + /** + * The mcrypt specific name of the cipher + * + * Mcrypt is useable for 128/192/256-bit $block_size/$key_size. For 160/224 not. + * Crypt_Rijndael determines automatically whether mcrypt is useable + * or not for the current $block_size/$key_size. + * In case of, $cipher_name_mcrypt will be set dynamically at run time accordingly. + * + * @see Crypt_Base::cipher_name_mcrypt + * @see Crypt_Base::engine + * @see _setupEngine() + * @var String + * @access private + */ + var $cipher_name_mcrypt = 'rijndael-128'; + + /** + * The default salt used by setPassword() + * + * @see Crypt_Base::password_default_salt + * @see Crypt_Base::setPassword() + * @var String + * @access private + */ + var $password_default_salt = 'phpseclib'; + + /** + * Has the key length explicitly been set or should it be derived from the key, itself? + * + * @see setKeyLength() + * @var Boolean + * @access private + */ + var $explicit_key_length = false; + + /** + * The Key Schedule + * + * @see _setup() + * @var Array + * @access private + */ + var $w; + + /** + * The Inverse Key Schedule + * + * @see _setup() + * @var Array + * @access private + */ + var $dw; + + /** + * The Block Length divided by 32 + * + * @see setBlockLength() + * @var Integer + * @access private + * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4. Exists in conjunction with $block_size + * because the encryption / decryption / key schedule creation requires this number and not $block_size. We could + * derive this from $block_size or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu + * of that, we'll just precompute it once. + * + */ + var $Nb = 4; + + /** + * The Key Length + * + * @see setKeyLength() + * @var Integer + * @access private + * @internal The max value is 256 / 8 = 32, the min value is 128 / 8 = 16. Exists in conjunction with $Nk + * because the encryption / decryption / key schedule creation requires this number and not $key_size. We could + * derive this from $key_size or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu + * of that, we'll just precompute it once. + */ + var $key_size = 16; + + /** + * The Key Length divided by 32 + * + * @see setKeyLength() + * @var Integer + * @access private + * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4 + */ + var $Nk = 4; + + /** + * The Number of Rounds + * + * @var Integer + * @access private + * @internal The max value is 14, the min value is 10. + */ + var $Nr; + + /** + * Shift offsets + * + * @var Array + * @access private + */ + var $c; + + /** + * Holds the last used key- and block_size information + * + * @var Array + * @access private + */ + var $kl; + + /** + * Precomputed mixColumns table + * + * According to (section 5.2.1), + * precomputed tables can be used in the mixColumns phase. in that example, they're assigned t0...t3, so + * those are the names we'll use. + * + * @see Crypt_Rijndael:_encryptBlock() + * @see Crypt_Rijndael:_decryptBlock() + * @var Array + * @access private + */ + var $t0 = array( + 0xC66363A5, 0xF87C7C84, 0xEE777799, 0xF67B7B8D, 0xFFF2F20D, 0xD66B6BBD, 0xDE6F6FB1, 0x91C5C554, + 0x60303050, 0x02010103, 0xCE6767A9, 0x562B2B7D, 0xE7FEFE19, 0xB5D7D762, 0x4DABABE6, 0xEC76769A, + 0x8FCACA45, 0x1F82829D, 0x89C9C940, 0xFA7D7D87, 0xEFFAFA15, 0xB25959EB, 0x8E4747C9, 0xFBF0F00B, + 0x41ADADEC, 0xB3D4D467, 0x5FA2A2FD, 0x45AFAFEA, 0x239C9CBF, 0x53A4A4F7, 0xE4727296, 0x9BC0C05B, + 0x75B7B7C2, 0xE1FDFD1C, 0x3D9393AE, 0x4C26266A, 0x6C36365A, 0x7E3F3F41, 0xF5F7F702, 0x83CCCC4F, + 0x6834345C, 0x51A5A5F4, 0xD1E5E534, 0xF9F1F108, 0xE2717193, 0xABD8D873, 0x62313153, 0x2A15153F, + 0x0804040C, 0x95C7C752, 0x46232365, 0x9DC3C35E, 0x30181828, 0x379696A1, 0x0A05050F, 0x2F9A9AB5, + 0x0E070709, 0x24121236, 0x1B80809B, 0xDFE2E23D, 0xCDEBEB26, 0x4E272769, 0x7FB2B2CD, 0xEA75759F, + 0x1209091B, 0x1D83839E, 0x582C2C74, 0x341A1A2E, 0x361B1B2D, 0xDC6E6EB2, 0xB45A5AEE, 0x5BA0A0FB, + 0xA45252F6, 0x763B3B4D, 0xB7D6D661, 0x7DB3B3CE, 0x5229297B, 0xDDE3E33E, 0x5E2F2F71, 0x13848497, + 0xA65353F5, 0xB9D1D168, 0x00000000, 0xC1EDED2C, 0x40202060, 0xE3FCFC1F, 0x79B1B1C8, 0xB65B5BED, + 0xD46A6ABE, 0x8DCBCB46, 0x67BEBED9, 0x7239394B, 0x944A4ADE, 0x984C4CD4, 0xB05858E8, 0x85CFCF4A, + 0xBBD0D06B, 0xC5EFEF2A, 0x4FAAAAE5, 0xEDFBFB16, 0x864343C5, 0x9A4D4DD7, 0x66333355, 0x11858594, + 0x8A4545CF, 0xE9F9F910, 0x04020206, 0xFE7F7F81, 0xA05050F0, 0x783C3C44, 0x259F9FBA, 0x4BA8A8E3, + 0xA25151F3, 0x5DA3A3FE, 0x804040C0, 0x058F8F8A, 0x3F9292AD, 0x219D9DBC, 0x70383848, 0xF1F5F504, + 0x63BCBCDF, 0x77B6B6C1, 0xAFDADA75, 0x42212163, 0x20101030, 0xE5FFFF1A, 0xFDF3F30E, 0xBFD2D26D, + 0x81CDCD4C, 0x180C0C14, 0x26131335, 0xC3ECEC2F, 0xBE5F5FE1, 0x359797A2, 0x884444CC, 0x2E171739, + 0x93C4C457, 0x55A7A7F2, 0xFC7E7E82, 0x7A3D3D47, 0xC86464AC, 0xBA5D5DE7, 0x3219192B, 0xE6737395, + 0xC06060A0, 0x19818198, 0x9E4F4FD1, 0xA3DCDC7F, 0x44222266, 0x542A2A7E, 0x3B9090AB, 0x0B888883, + 0x8C4646CA, 0xC7EEEE29, 0x6BB8B8D3, 0x2814143C, 0xA7DEDE79, 0xBC5E5EE2, 0x160B0B1D, 0xADDBDB76, + 0xDBE0E03B, 0x64323256, 0x743A3A4E, 0x140A0A1E, 0x924949DB, 0x0C06060A, 0x4824246C, 0xB85C5CE4, + 0x9FC2C25D, 0xBDD3D36E, 0x43ACACEF, 0xC46262A6, 0x399191A8, 0x319595A4, 0xD3E4E437, 0xF279798B, + 0xD5E7E732, 0x8BC8C843, 0x6E373759, 0xDA6D6DB7, 0x018D8D8C, 0xB1D5D564, 0x9C4E4ED2, 0x49A9A9E0, + 0xD86C6CB4, 0xAC5656FA, 0xF3F4F407, 0xCFEAEA25, 0xCA6565AF, 0xF47A7A8E, 0x47AEAEE9, 0x10080818, + 0x6FBABAD5, 0xF0787888, 0x4A25256F, 0x5C2E2E72, 0x381C1C24, 0x57A6A6F1, 0x73B4B4C7, 0x97C6C651, + 0xCBE8E823, 0xA1DDDD7C, 0xE874749C, 0x3E1F1F21, 0x964B4BDD, 0x61BDBDDC, 0x0D8B8B86, 0x0F8A8A85, + 0xE0707090, 0x7C3E3E42, 0x71B5B5C4, 0xCC6666AA, 0x904848D8, 0x06030305, 0xF7F6F601, 0x1C0E0E12, + 0xC26161A3, 0x6A35355F, 0xAE5757F9, 0x69B9B9D0, 0x17868691, 0x99C1C158, 0x3A1D1D27, 0x279E9EB9, + 0xD9E1E138, 0xEBF8F813, 0x2B9898B3, 0x22111133, 0xD26969BB, 0xA9D9D970, 0x078E8E89, 0x339494A7, + 0x2D9B9BB6, 0x3C1E1E22, 0x15878792, 0xC9E9E920, 0x87CECE49, 0xAA5555FF, 0x50282878, 0xA5DFDF7A, + 0x038C8C8F, 0x59A1A1F8, 0x09898980, 0x1A0D0D17, 0x65BFBFDA, 0xD7E6E631, 0x844242C6, 0xD06868B8, + 0x824141C3, 0x299999B0, 0x5A2D2D77, 0x1E0F0F11, 0x7BB0B0CB, 0xA85454FC, 0x6DBBBBD6, 0x2C16163A + ); + + /** + * Precomputed mixColumns table + * + * @see Crypt_Rijndael:_encryptBlock() + * @see Crypt_Rijndael:_decryptBlock() + * @var Array + * @access private + */ + var $t1 = array( + 0xA5C66363, 0x84F87C7C, 0x99EE7777, 0x8DF67B7B, 0x0DFFF2F2, 0xBDD66B6B, 0xB1DE6F6F, 0x5491C5C5, + 0x50603030, 0x03020101, 0xA9CE6767, 0x7D562B2B, 0x19E7FEFE, 0x62B5D7D7, 0xE64DABAB, 0x9AEC7676, + 0x458FCACA, 0x9D1F8282, 0x4089C9C9, 0x87FA7D7D, 0x15EFFAFA, 0xEBB25959, 0xC98E4747, 0x0BFBF0F0, + 0xEC41ADAD, 0x67B3D4D4, 0xFD5FA2A2, 0xEA45AFAF, 0xBF239C9C, 0xF753A4A4, 0x96E47272, 0x5B9BC0C0, + 0xC275B7B7, 0x1CE1FDFD, 0xAE3D9393, 0x6A4C2626, 0x5A6C3636, 0x417E3F3F, 0x02F5F7F7, 0x4F83CCCC, + 0x5C683434, 0xF451A5A5, 0x34D1E5E5, 0x08F9F1F1, 0x93E27171, 0x73ABD8D8, 0x53623131, 0x3F2A1515, + 0x0C080404, 0x5295C7C7, 0x65462323, 0x5E9DC3C3, 0x28301818, 0xA1379696, 0x0F0A0505, 0xB52F9A9A, + 0x090E0707, 0x36241212, 0x9B1B8080, 0x3DDFE2E2, 0x26CDEBEB, 0x694E2727, 0xCD7FB2B2, 0x9FEA7575, + 0x1B120909, 0x9E1D8383, 0x74582C2C, 0x2E341A1A, 0x2D361B1B, 0xB2DC6E6E, 0xEEB45A5A, 0xFB5BA0A0, + 0xF6A45252, 0x4D763B3B, 0x61B7D6D6, 0xCE7DB3B3, 0x7B522929, 0x3EDDE3E3, 0x715E2F2F, 0x97138484, + 0xF5A65353, 0x68B9D1D1, 0x00000000, 0x2CC1EDED, 0x60402020, 0x1FE3FCFC, 0xC879B1B1, 0xEDB65B5B, + 0xBED46A6A, 0x468DCBCB, 0xD967BEBE, 0x4B723939, 0xDE944A4A, 0xD4984C4C, 0xE8B05858, 0x4A85CFCF, + 0x6BBBD0D0, 0x2AC5EFEF, 0xE54FAAAA, 0x16EDFBFB, 0xC5864343, 0xD79A4D4D, 0x55663333, 0x94118585, + 0xCF8A4545, 0x10E9F9F9, 0x06040202, 0x81FE7F7F, 0xF0A05050, 0x44783C3C, 0xBA259F9F, 0xE34BA8A8, + 0xF3A25151, 0xFE5DA3A3, 0xC0804040, 0x8A058F8F, 0xAD3F9292, 0xBC219D9D, 0x48703838, 0x04F1F5F5, + 0xDF63BCBC, 0xC177B6B6, 0x75AFDADA, 0x63422121, 0x30201010, 0x1AE5FFFF, 0x0EFDF3F3, 0x6DBFD2D2, + 0x4C81CDCD, 0x14180C0C, 0x35261313, 0x2FC3ECEC, 0xE1BE5F5F, 0xA2359797, 0xCC884444, 0x392E1717, + 0x5793C4C4, 0xF255A7A7, 0x82FC7E7E, 0x477A3D3D, 0xACC86464, 0xE7BA5D5D, 0x2B321919, 0x95E67373, + 0xA0C06060, 0x98198181, 0xD19E4F4F, 0x7FA3DCDC, 0x66442222, 0x7E542A2A, 0xAB3B9090, 0x830B8888, + 0xCA8C4646, 0x29C7EEEE, 0xD36BB8B8, 0x3C281414, 0x79A7DEDE, 0xE2BC5E5E, 0x1D160B0B, 0x76ADDBDB, + 0x3BDBE0E0, 0x56643232, 0x4E743A3A, 0x1E140A0A, 0xDB924949, 0x0A0C0606, 0x6C482424, 0xE4B85C5C, + 0x5D9FC2C2, 0x6EBDD3D3, 0xEF43ACAC, 0xA6C46262, 0xA8399191, 0xA4319595, 0x37D3E4E4, 0x8BF27979, + 0x32D5E7E7, 0x438BC8C8, 0x596E3737, 0xB7DA6D6D, 0x8C018D8D, 0x64B1D5D5, 0xD29C4E4E, 0xE049A9A9, + 0xB4D86C6C, 0xFAAC5656, 0x07F3F4F4, 0x25CFEAEA, 0xAFCA6565, 0x8EF47A7A, 0xE947AEAE, 0x18100808, + 0xD56FBABA, 0x88F07878, 0x6F4A2525, 0x725C2E2E, 0x24381C1C, 0xF157A6A6, 0xC773B4B4, 0x5197C6C6, + 0x23CBE8E8, 0x7CA1DDDD, 0x9CE87474, 0x213E1F1F, 0xDD964B4B, 0xDC61BDBD, 0x860D8B8B, 0x850F8A8A, + 0x90E07070, 0x427C3E3E, 0xC471B5B5, 0xAACC6666, 0xD8904848, 0x05060303, 0x01F7F6F6, 0x121C0E0E, + 0xA3C26161, 0x5F6A3535, 0xF9AE5757, 0xD069B9B9, 0x91178686, 0x5899C1C1, 0x273A1D1D, 0xB9279E9E, + 0x38D9E1E1, 0x13EBF8F8, 0xB32B9898, 0x33221111, 0xBBD26969, 0x70A9D9D9, 0x89078E8E, 0xA7339494, + 0xB62D9B9B, 0x223C1E1E, 0x92158787, 0x20C9E9E9, 0x4987CECE, 0xFFAA5555, 0x78502828, 0x7AA5DFDF, + 0x8F038C8C, 0xF859A1A1, 0x80098989, 0x171A0D0D, 0xDA65BFBF, 0x31D7E6E6, 0xC6844242, 0xB8D06868, + 0xC3824141, 0xB0299999, 0x775A2D2D, 0x111E0F0F, 0xCB7BB0B0, 0xFCA85454, 0xD66DBBBB, 0x3A2C1616 + ); + + /** + * Precomputed mixColumns table + * + * @see Crypt_Rijndael:_encryptBlock() + * @see Crypt_Rijndael:_decryptBlock() + * @var Array + * @access private + */ + var $t2 = array( + 0x63A5C663, 0x7C84F87C, 0x7799EE77, 0x7B8DF67B, 0xF20DFFF2, 0x6BBDD66B, 0x6FB1DE6F, 0xC55491C5, + 0x30506030, 0x01030201, 0x67A9CE67, 0x2B7D562B, 0xFE19E7FE, 0xD762B5D7, 0xABE64DAB, 0x769AEC76, + 0xCA458FCA, 0x829D1F82, 0xC94089C9, 0x7D87FA7D, 0xFA15EFFA, 0x59EBB259, 0x47C98E47, 0xF00BFBF0, + 0xADEC41AD, 0xD467B3D4, 0xA2FD5FA2, 0xAFEA45AF, 0x9CBF239C, 0xA4F753A4, 0x7296E472, 0xC05B9BC0, + 0xB7C275B7, 0xFD1CE1FD, 0x93AE3D93, 0x266A4C26, 0x365A6C36, 0x3F417E3F, 0xF702F5F7, 0xCC4F83CC, + 0x345C6834, 0xA5F451A5, 0xE534D1E5, 0xF108F9F1, 0x7193E271, 0xD873ABD8, 0x31536231, 0x153F2A15, + 0x040C0804, 0xC75295C7, 0x23654623, 0xC35E9DC3, 0x18283018, 0x96A13796, 0x050F0A05, 0x9AB52F9A, + 0x07090E07, 0x12362412, 0x809B1B80, 0xE23DDFE2, 0xEB26CDEB, 0x27694E27, 0xB2CD7FB2, 0x759FEA75, + 0x091B1209, 0x839E1D83, 0x2C74582C, 0x1A2E341A, 0x1B2D361B, 0x6EB2DC6E, 0x5AEEB45A, 0xA0FB5BA0, + 0x52F6A452, 0x3B4D763B, 0xD661B7D6, 0xB3CE7DB3, 0x297B5229, 0xE33EDDE3, 0x2F715E2F, 0x84971384, + 0x53F5A653, 0xD168B9D1, 0x00000000, 0xED2CC1ED, 0x20604020, 0xFC1FE3FC, 0xB1C879B1, 0x5BEDB65B, + 0x6ABED46A, 0xCB468DCB, 0xBED967BE, 0x394B7239, 0x4ADE944A, 0x4CD4984C, 0x58E8B058, 0xCF4A85CF, + 0xD06BBBD0, 0xEF2AC5EF, 0xAAE54FAA, 0xFB16EDFB, 0x43C58643, 0x4DD79A4D, 0x33556633, 0x85941185, + 0x45CF8A45, 0xF910E9F9, 0x02060402, 0x7F81FE7F, 0x50F0A050, 0x3C44783C, 0x9FBA259F, 0xA8E34BA8, + 0x51F3A251, 0xA3FE5DA3, 0x40C08040, 0x8F8A058F, 0x92AD3F92, 0x9DBC219D, 0x38487038, 0xF504F1F5, + 0xBCDF63BC, 0xB6C177B6, 0xDA75AFDA, 0x21634221, 0x10302010, 0xFF1AE5FF, 0xF30EFDF3, 0xD26DBFD2, + 0xCD4C81CD, 0x0C14180C, 0x13352613, 0xEC2FC3EC, 0x5FE1BE5F, 0x97A23597, 0x44CC8844, 0x17392E17, + 0xC45793C4, 0xA7F255A7, 0x7E82FC7E, 0x3D477A3D, 0x64ACC864, 0x5DE7BA5D, 0x192B3219, 0x7395E673, + 0x60A0C060, 0x81981981, 0x4FD19E4F, 0xDC7FA3DC, 0x22664422, 0x2A7E542A, 0x90AB3B90, 0x88830B88, + 0x46CA8C46, 0xEE29C7EE, 0xB8D36BB8, 0x143C2814, 0xDE79A7DE, 0x5EE2BC5E, 0x0B1D160B, 0xDB76ADDB, + 0xE03BDBE0, 0x32566432, 0x3A4E743A, 0x0A1E140A, 0x49DB9249, 0x060A0C06, 0x246C4824, 0x5CE4B85C, + 0xC25D9FC2, 0xD36EBDD3, 0xACEF43AC, 0x62A6C462, 0x91A83991, 0x95A43195, 0xE437D3E4, 0x798BF279, + 0xE732D5E7, 0xC8438BC8, 0x37596E37, 0x6DB7DA6D, 0x8D8C018D, 0xD564B1D5, 0x4ED29C4E, 0xA9E049A9, + 0x6CB4D86C, 0x56FAAC56, 0xF407F3F4, 0xEA25CFEA, 0x65AFCA65, 0x7A8EF47A, 0xAEE947AE, 0x08181008, + 0xBAD56FBA, 0x7888F078, 0x256F4A25, 0x2E725C2E, 0x1C24381C, 0xA6F157A6, 0xB4C773B4, 0xC65197C6, + 0xE823CBE8, 0xDD7CA1DD, 0x749CE874, 0x1F213E1F, 0x4BDD964B, 0xBDDC61BD, 0x8B860D8B, 0x8A850F8A, + 0x7090E070, 0x3E427C3E, 0xB5C471B5, 0x66AACC66, 0x48D89048, 0x03050603, 0xF601F7F6, 0x0E121C0E, + 0x61A3C261, 0x355F6A35, 0x57F9AE57, 0xB9D069B9, 0x86911786, 0xC15899C1, 0x1D273A1D, 0x9EB9279E, + 0xE138D9E1, 0xF813EBF8, 0x98B32B98, 0x11332211, 0x69BBD269, 0xD970A9D9, 0x8E89078E, 0x94A73394, + 0x9BB62D9B, 0x1E223C1E, 0x87921587, 0xE920C9E9, 0xCE4987CE, 0x55FFAA55, 0x28785028, 0xDF7AA5DF, + 0x8C8F038C, 0xA1F859A1, 0x89800989, 0x0D171A0D, 0xBFDA65BF, 0xE631D7E6, 0x42C68442, 0x68B8D068, + 0x41C38241, 0x99B02999, 0x2D775A2D, 0x0F111E0F, 0xB0CB7BB0, 0x54FCA854, 0xBBD66DBB, 0x163A2C16 + ); + + /** + * Precomputed mixColumns table + * + * @see Crypt_Rijndael:_encryptBlock() + * @see Crypt_Rijndael:_decryptBlock() + * @var Array + * @access private + */ + var $t3 = array( + 0x6363A5C6, 0x7C7C84F8, 0x777799EE, 0x7B7B8DF6, 0xF2F20DFF, 0x6B6BBDD6, 0x6F6FB1DE, 0xC5C55491, + 0x30305060, 0x01010302, 0x6767A9CE, 0x2B2B7D56, 0xFEFE19E7, 0xD7D762B5, 0xABABE64D, 0x76769AEC, + 0xCACA458F, 0x82829D1F, 0xC9C94089, 0x7D7D87FA, 0xFAFA15EF, 0x5959EBB2, 0x4747C98E, 0xF0F00BFB, + 0xADADEC41, 0xD4D467B3, 0xA2A2FD5F, 0xAFAFEA45, 0x9C9CBF23, 0xA4A4F753, 0x727296E4, 0xC0C05B9B, + 0xB7B7C275, 0xFDFD1CE1, 0x9393AE3D, 0x26266A4C, 0x36365A6C, 0x3F3F417E, 0xF7F702F5, 0xCCCC4F83, + 0x34345C68, 0xA5A5F451, 0xE5E534D1, 0xF1F108F9, 0x717193E2, 0xD8D873AB, 0x31315362, 0x15153F2A, + 0x04040C08, 0xC7C75295, 0x23236546, 0xC3C35E9D, 0x18182830, 0x9696A137, 0x05050F0A, 0x9A9AB52F, + 0x0707090E, 0x12123624, 0x80809B1B, 0xE2E23DDF, 0xEBEB26CD, 0x2727694E, 0xB2B2CD7F, 0x75759FEA, + 0x09091B12, 0x83839E1D, 0x2C2C7458, 0x1A1A2E34, 0x1B1B2D36, 0x6E6EB2DC, 0x5A5AEEB4, 0xA0A0FB5B, + 0x5252F6A4, 0x3B3B4D76, 0xD6D661B7, 0xB3B3CE7D, 0x29297B52, 0xE3E33EDD, 0x2F2F715E, 0x84849713, + 0x5353F5A6, 0xD1D168B9, 0x00000000, 0xEDED2CC1, 0x20206040, 0xFCFC1FE3, 0xB1B1C879, 0x5B5BEDB6, + 0x6A6ABED4, 0xCBCB468D, 0xBEBED967, 0x39394B72, 0x4A4ADE94, 0x4C4CD498, 0x5858E8B0, 0xCFCF4A85, + 0xD0D06BBB, 0xEFEF2AC5, 0xAAAAE54F, 0xFBFB16ED, 0x4343C586, 0x4D4DD79A, 0x33335566, 0x85859411, + 0x4545CF8A, 0xF9F910E9, 0x02020604, 0x7F7F81FE, 0x5050F0A0, 0x3C3C4478, 0x9F9FBA25, 0xA8A8E34B, + 0x5151F3A2, 0xA3A3FE5D, 0x4040C080, 0x8F8F8A05, 0x9292AD3F, 0x9D9DBC21, 0x38384870, 0xF5F504F1, + 0xBCBCDF63, 0xB6B6C177, 0xDADA75AF, 0x21216342, 0x10103020, 0xFFFF1AE5, 0xF3F30EFD, 0xD2D26DBF, + 0xCDCD4C81, 0x0C0C1418, 0x13133526, 0xECEC2FC3, 0x5F5FE1BE, 0x9797A235, 0x4444CC88, 0x1717392E, + 0xC4C45793, 0xA7A7F255, 0x7E7E82FC, 0x3D3D477A, 0x6464ACC8, 0x5D5DE7BA, 0x19192B32, 0x737395E6, + 0x6060A0C0, 0x81819819, 0x4F4FD19E, 0xDCDC7FA3, 0x22226644, 0x2A2A7E54, 0x9090AB3B, 0x8888830B, + 0x4646CA8C, 0xEEEE29C7, 0xB8B8D36B, 0x14143C28, 0xDEDE79A7, 0x5E5EE2BC, 0x0B0B1D16, 0xDBDB76AD, + 0xE0E03BDB, 0x32325664, 0x3A3A4E74, 0x0A0A1E14, 0x4949DB92, 0x06060A0C, 0x24246C48, 0x5C5CE4B8, + 0xC2C25D9F, 0xD3D36EBD, 0xACACEF43, 0x6262A6C4, 0x9191A839, 0x9595A431, 0xE4E437D3, 0x79798BF2, + 0xE7E732D5, 0xC8C8438B, 0x3737596E, 0x6D6DB7DA, 0x8D8D8C01, 0xD5D564B1, 0x4E4ED29C, 0xA9A9E049, + 0x6C6CB4D8, 0x5656FAAC, 0xF4F407F3, 0xEAEA25CF, 0x6565AFCA, 0x7A7A8EF4, 0xAEAEE947, 0x08081810, + 0xBABAD56F, 0x787888F0, 0x25256F4A, 0x2E2E725C, 0x1C1C2438, 0xA6A6F157, 0xB4B4C773, 0xC6C65197, + 0xE8E823CB, 0xDDDD7CA1, 0x74749CE8, 0x1F1F213E, 0x4B4BDD96, 0xBDBDDC61, 0x8B8B860D, 0x8A8A850F, + 0x707090E0, 0x3E3E427C, 0xB5B5C471, 0x6666AACC, 0x4848D890, 0x03030506, 0xF6F601F7, 0x0E0E121C, + 0x6161A3C2, 0x35355F6A, 0x5757F9AE, 0xB9B9D069, 0x86869117, 0xC1C15899, 0x1D1D273A, 0x9E9EB927, + 0xE1E138D9, 0xF8F813EB, 0x9898B32B, 0x11113322, 0x6969BBD2, 0xD9D970A9, 0x8E8E8907, 0x9494A733, + 0x9B9BB62D, 0x1E1E223C, 0x87879215, 0xE9E920C9, 0xCECE4987, 0x5555FFAA, 0x28287850, 0xDFDF7AA5, + 0x8C8C8F03, 0xA1A1F859, 0x89898009, 0x0D0D171A, 0xBFBFDA65, 0xE6E631D7, 0x4242C684, 0x6868B8D0, + 0x4141C382, 0x9999B029, 0x2D2D775A, 0x0F0F111E, 0xB0B0CB7B, 0x5454FCA8, 0xBBBBD66D, 0x16163A2C + ); + + /** + * Precomputed invMixColumns table + * + * @see Crypt_Rijndael:_encryptBlock() + * @see Crypt_Rijndael:_decryptBlock() + * @var Array + * @access private + */ + var $dt0 = array( + 0x51F4A750, 0x7E416553, 0x1A17A4C3, 0x3A275E96, 0x3BAB6BCB, 0x1F9D45F1, 0xACFA58AB, 0x4BE30393, + 0x2030FA55, 0xAD766DF6, 0x88CC7691, 0xF5024C25, 0x4FE5D7FC, 0xC52ACBD7, 0x26354480, 0xB562A38F, + 0xDEB15A49, 0x25BA1B67, 0x45EA0E98, 0x5DFEC0E1, 0xC32F7502, 0x814CF012, 0x8D4697A3, 0x6BD3F9C6, + 0x038F5FE7, 0x15929C95, 0xBF6D7AEB, 0x955259DA, 0xD4BE832D, 0x587421D3, 0x49E06929, 0x8EC9C844, + 0x75C2896A, 0xF48E7978, 0x99583E6B, 0x27B971DD, 0xBEE14FB6, 0xF088AD17, 0xC920AC66, 0x7DCE3AB4, + 0x63DF4A18, 0xE51A3182, 0x97513360, 0x62537F45, 0xB16477E0, 0xBB6BAE84, 0xFE81A01C, 0xF9082B94, + 0x70486858, 0x8F45FD19, 0x94DE6C87, 0x527BF8B7, 0xAB73D323, 0x724B02E2, 0xE31F8F57, 0x6655AB2A, + 0xB2EB2807, 0x2FB5C203, 0x86C57B9A, 0xD33708A5, 0x302887F2, 0x23BFA5B2, 0x02036ABA, 0xED16825C, + 0x8ACF1C2B, 0xA779B492, 0xF307F2F0, 0x4E69E2A1, 0x65DAF4CD, 0x0605BED5, 0xD134621F, 0xC4A6FE8A, + 0x342E539D, 0xA2F355A0, 0x058AE132, 0xA4F6EB75, 0x0B83EC39, 0x4060EFAA, 0x5E719F06, 0xBD6E1051, + 0x3E218AF9, 0x96DD063D, 0xDD3E05AE, 0x4DE6BD46, 0x91548DB5, 0x71C45D05, 0x0406D46F, 0x605015FF, + 0x1998FB24, 0xD6BDE997, 0x894043CC, 0x67D99E77, 0xB0E842BD, 0x07898B88, 0xE7195B38, 0x79C8EEDB, + 0xA17C0A47, 0x7C420FE9, 0xF8841EC9, 0x00000000, 0x09808683, 0x322BED48, 0x1E1170AC, 0x6C5A724E, + 0xFD0EFFFB, 0x0F853856, 0x3DAED51E, 0x362D3927, 0x0A0FD964, 0x685CA621, 0x9B5B54D1, 0x24362E3A, + 0x0C0A67B1, 0x9357E70F, 0xB4EE96D2, 0x1B9B919E, 0x80C0C54F, 0x61DC20A2, 0x5A774B69, 0x1C121A16, + 0xE293BA0A, 0xC0A02AE5, 0x3C22E043, 0x121B171D, 0x0E090D0B, 0xF28BC7AD, 0x2DB6A8B9, 0x141EA9C8, + 0x57F11985, 0xAF75074C, 0xEE99DDBB, 0xA37F60FD, 0xF701269F, 0x5C72F5BC, 0x44663BC5, 0x5BFB7E34, + 0x8B432976, 0xCB23C6DC, 0xB6EDFC68, 0xB8E4F163, 0xD731DCCA, 0x42638510, 0x13972240, 0x84C61120, + 0x854A247D, 0xD2BB3DF8, 0xAEF93211, 0xC729A16D, 0x1D9E2F4B, 0xDCB230F3, 0x0D8652EC, 0x77C1E3D0, + 0x2BB3166C, 0xA970B999, 0x119448FA, 0x47E96422, 0xA8FC8CC4, 0xA0F03F1A, 0x567D2CD8, 0x223390EF, + 0x87494EC7, 0xD938D1C1, 0x8CCAA2FE, 0x98D40B36, 0xA6F581CF, 0xA57ADE28, 0xDAB78E26, 0x3FADBFA4, + 0x2C3A9DE4, 0x5078920D, 0x6A5FCC9B, 0x547E4662, 0xF68D13C2, 0x90D8B8E8, 0x2E39F75E, 0x82C3AFF5, + 0x9F5D80BE, 0x69D0937C, 0x6FD52DA9, 0xCF2512B3, 0xC8AC993B, 0x10187DA7, 0xE89C636E, 0xDB3BBB7B, + 0xCD267809, 0x6E5918F4, 0xEC9AB701, 0x834F9AA8, 0xE6956E65, 0xAAFFE67E, 0x21BCCF08, 0xEF15E8E6, + 0xBAE79BD9, 0x4A6F36CE, 0xEA9F09D4, 0x29B07CD6, 0x31A4B2AF, 0x2A3F2331, 0xC6A59430, 0x35A266C0, + 0x744EBC37, 0xFC82CAA6, 0xE090D0B0, 0x33A7D815, 0xF104984A, 0x41ECDAF7, 0x7FCD500E, 0x1791F62F, + 0x764DD68D, 0x43EFB04D, 0xCCAA4D54, 0xE49604DF, 0x9ED1B5E3, 0x4C6A881B, 0xC12C1FB8, 0x4665517F, + 0x9D5EEA04, 0x018C355D, 0xFA877473, 0xFB0B412E, 0xB3671D5A, 0x92DBD252, 0xE9105633, 0x6DD64713, + 0x9AD7618C, 0x37A10C7A, 0x59F8148E, 0xEB133C89, 0xCEA927EE, 0xB761C935, 0xE11CE5ED, 0x7A47B13C, + 0x9CD2DF59, 0x55F2733F, 0x1814CE79, 0x73C737BF, 0x53F7CDEA, 0x5FFDAA5B, 0xDF3D6F14, 0x7844DB86, + 0xCAAFF381, 0xB968C43E, 0x3824342C, 0xC2A3405F, 0x161DC372, 0xBCE2250C, 0x283C498B, 0xFF0D9541, + 0x39A80171, 0x080CB3DE, 0xD8B4E49C, 0x6456C190, 0x7BCB8461, 0xD532B670, 0x486C5C74, 0xD0B85742 + ); + + /** + * Precomputed invMixColumns table + * + * @see Crypt_Rijndael:_encryptBlock() + * @see Crypt_Rijndael:_decryptBlock() + * @var Array + * @access private + */ + var $dt1 = array( + 0x5051F4A7, 0x537E4165, 0xC31A17A4, 0x963A275E, 0xCB3BAB6B, 0xF11F9D45, 0xABACFA58, 0x934BE303, + 0x552030FA, 0xF6AD766D, 0x9188CC76, 0x25F5024C, 0xFC4FE5D7, 0xD7C52ACB, 0x80263544, 0x8FB562A3, + 0x49DEB15A, 0x6725BA1B, 0x9845EA0E, 0xE15DFEC0, 0x02C32F75, 0x12814CF0, 0xA38D4697, 0xC66BD3F9, + 0xE7038F5F, 0x9515929C, 0xEBBF6D7A, 0xDA955259, 0x2DD4BE83, 0xD3587421, 0x2949E069, 0x448EC9C8, + 0x6A75C289, 0x78F48E79, 0x6B99583E, 0xDD27B971, 0xB6BEE14F, 0x17F088AD, 0x66C920AC, 0xB47DCE3A, + 0x1863DF4A, 0x82E51A31, 0x60975133, 0x4562537F, 0xE0B16477, 0x84BB6BAE, 0x1CFE81A0, 0x94F9082B, + 0x58704868, 0x198F45FD, 0x8794DE6C, 0xB7527BF8, 0x23AB73D3, 0xE2724B02, 0x57E31F8F, 0x2A6655AB, + 0x07B2EB28, 0x032FB5C2, 0x9A86C57B, 0xA5D33708, 0xF2302887, 0xB223BFA5, 0xBA02036A, 0x5CED1682, + 0x2B8ACF1C, 0x92A779B4, 0xF0F307F2, 0xA14E69E2, 0xCD65DAF4, 0xD50605BE, 0x1FD13462, 0x8AC4A6FE, + 0x9D342E53, 0xA0A2F355, 0x32058AE1, 0x75A4F6EB, 0x390B83EC, 0xAA4060EF, 0x065E719F, 0x51BD6E10, + 0xF93E218A, 0x3D96DD06, 0xAEDD3E05, 0x464DE6BD, 0xB591548D, 0x0571C45D, 0x6F0406D4, 0xFF605015, + 0x241998FB, 0x97D6BDE9, 0xCC894043, 0x7767D99E, 0xBDB0E842, 0x8807898B, 0x38E7195B, 0xDB79C8EE, + 0x47A17C0A, 0xE97C420F, 0xC9F8841E, 0x00000000, 0x83098086, 0x48322BED, 0xAC1E1170, 0x4E6C5A72, + 0xFBFD0EFF, 0x560F8538, 0x1E3DAED5, 0x27362D39, 0x640A0FD9, 0x21685CA6, 0xD19B5B54, 0x3A24362E, + 0xB10C0A67, 0x0F9357E7, 0xD2B4EE96, 0x9E1B9B91, 0x4F80C0C5, 0xA261DC20, 0x695A774B, 0x161C121A, + 0x0AE293BA, 0xE5C0A02A, 0x433C22E0, 0x1D121B17, 0x0B0E090D, 0xADF28BC7, 0xB92DB6A8, 0xC8141EA9, + 0x8557F119, 0x4CAF7507, 0xBBEE99DD, 0xFDA37F60, 0x9FF70126, 0xBC5C72F5, 0xC544663B, 0x345BFB7E, + 0x768B4329, 0xDCCB23C6, 0x68B6EDFC, 0x63B8E4F1, 0xCAD731DC, 0x10426385, 0x40139722, 0x2084C611, + 0x7D854A24, 0xF8D2BB3D, 0x11AEF932, 0x6DC729A1, 0x4B1D9E2F, 0xF3DCB230, 0xEC0D8652, 0xD077C1E3, + 0x6C2BB316, 0x99A970B9, 0xFA119448, 0x2247E964, 0xC4A8FC8C, 0x1AA0F03F, 0xD8567D2C, 0xEF223390, + 0xC787494E, 0xC1D938D1, 0xFE8CCAA2, 0x3698D40B, 0xCFA6F581, 0x28A57ADE, 0x26DAB78E, 0xA43FADBF, + 0xE42C3A9D, 0x0D507892, 0x9B6A5FCC, 0x62547E46, 0xC2F68D13, 0xE890D8B8, 0x5E2E39F7, 0xF582C3AF, + 0xBE9F5D80, 0x7C69D093, 0xA96FD52D, 0xB3CF2512, 0x3BC8AC99, 0xA710187D, 0x6EE89C63, 0x7BDB3BBB, + 0x09CD2678, 0xF46E5918, 0x01EC9AB7, 0xA8834F9A, 0x65E6956E, 0x7EAAFFE6, 0x0821BCCF, 0xE6EF15E8, + 0xD9BAE79B, 0xCE4A6F36, 0xD4EA9F09, 0xD629B07C, 0xAF31A4B2, 0x312A3F23, 0x30C6A594, 0xC035A266, + 0x37744EBC, 0xA6FC82CA, 0xB0E090D0, 0x1533A7D8, 0x4AF10498, 0xF741ECDA, 0x0E7FCD50, 0x2F1791F6, + 0x8D764DD6, 0x4D43EFB0, 0x54CCAA4D, 0xDFE49604, 0xE39ED1B5, 0x1B4C6A88, 0xB8C12C1F, 0x7F466551, + 0x049D5EEA, 0x5D018C35, 0x73FA8774, 0x2EFB0B41, 0x5AB3671D, 0x5292DBD2, 0x33E91056, 0x136DD647, + 0x8C9AD761, 0x7A37A10C, 0x8E59F814, 0x89EB133C, 0xEECEA927, 0x35B761C9, 0xEDE11CE5, 0x3C7A47B1, + 0x599CD2DF, 0x3F55F273, 0x791814CE, 0xBF73C737, 0xEA53F7CD, 0x5B5FFDAA, 0x14DF3D6F, 0x867844DB, + 0x81CAAFF3, 0x3EB968C4, 0x2C382434, 0x5FC2A340, 0x72161DC3, 0x0CBCE225, 0x8B283C49, 0x41FF0D95, + 0x7139A801, 0xDE080CB3, 0x9CD8B4E4, 0x906456C1, 0x617BCB84, 0x70D532B6, 0x74486C5C, 0x42D0B857 + ); + + /** + * Precomputed invMixColumns table + * + * @see Crypt_Rijndael:_encryptBlock() + * @see Crypt_Rijndael:_decryptBlock() + * @var Array + * @access private + */ + var $dt2 = array( + 0xA75051F4, 0x65537E41, 0xA4C31A17, 0x5E963A27, 0x6BCB3BAB, 0x45F11F9D, 0x58ABACFA, 0x03934BE3, + 0xFA552030, 0x6DF6AD76, 0x769188CC, 0x4C25F502, 0xD7FC4FE5, 0xCBD7C52A, 0x44802635, 0xA38FB562, + 0x5A49DEB1, 0x1B6725BA, 0x0E9845EA, 0xC0E15DFE, 0x7502C32F, 0xF012814C, 0x97A38D46, 0xF9C66BD3, + 0x5FE7038F, 0x9C951592, 0x7AEBBF6D, 0x59DA9552, 0x832DD4BE, 0x21D35874, 0x692949E0, 0xC8448EC9, + 0x896A75C2, 0x7978F48E, 0x3E6B9958, 0x71DD27B9, 0x4FB6BEE1, 0xAD17F088, 0xAC66C920, 0x3AB47DCE, + 0x4A1863DF, 0x3182E51A, 0x33609751, 0x7F456253, 0x77E0B164, 0xAE84BB6B, 0xA01CFE81, 0x2B94F908, + 0x68587048, 0xFD198F45, 0x6C8794DE, 0xF8B7527B, 0xD323AB73, 0x02E2724B, 0x8F57E31F, 0xAB2A6655, + 0x2807B2EB, 0xC2032FB5, 0x7B9A86C5, 0x08A5D337, 0x87F23028, 0xA5B223BF, 0x6ABA0203, 0x825CED16, + 0x1C2B8ACF, 0xB492A779, 0xF2F0F307, 0xE2A14E69, 0xF4CD65DA, 0xBED50605, 0x621FD134, 0xFE8AC4A6, + 0x539D342E, 0x55A0A2F3, 0xE132058A, 0xEB75A4F6, 0xEC390B83, 0xEFAA4060, 0x9F065E71, 0x1051BD6E, + 0x8AF93E21, 0x063D96DD, 0x05AEDD3E, 0xBD464DE6, 0x8DB59154, 0x5D0571C4, 0xD46F0406, 0x15FF6050, + 0xFB241998, 0xE997D6BD, 0x43CC8940, 0x9E7767D9, 0x42BDB0E8, 0x8B880789, 0x5B38E719, 0xEEDB79C8, + 0x0A47A17C, 0x0FE97C42, 0x1EC9F884, 0x00000000, 0x86830980, 0xED48322B, 0x70AC1E11, 0x724E6C5A, + 0xFFFBFD0E, 0x38560F85, 0xD51E3DAE, 0x3927362D, 0xD9640A0F, 0xA621685C, 0x54D19B5B, 0x2E3A2436, + 0x67B10C0A, 0xE70F9357, 0x96D2B4EE, 0x919E1B9B, 0xC54F80C0, 0x20A261DC, 0x4B695A77, 0x1A161C12, + 0xBA0AE293, 0x2AE5C0A0, 0xE0433C22, 0x171D121B, 0x0D0B0E09, 0xC7ADF28B, 0xA8B92DB6, 0xA9C8141E, + 0x198557F1, 0x074CAF75, 0xDDBBEE99, 0x60FDA37F, 0x269FF701, 0xF5BC5C72, 0x3BC54466, 0x7E345BFB, + 0x29768B43, 0xC6DCCB23, 0xFC68B6ED, 0xF163B8E4, 0xDCCAD731, 0x85104263, 0x22401397, 0x112084C6, + 0x247D854A, 0x3DF8D2BB, 0x3211AEF9, 0xA16DC729, 0x2F4B1D9E, 0x30F3DCB2, 0x52EC0D86, 0xE3D077C1, + 0x166C2BB3, 0xB999A970, 0x48FA1194, 0x642247E9, 0x8CC4A8FC, 0x3F1AA0F0, 0x2CD8567D, 0x90EF2233, + 0x4EC78749, 0xD1C1D938, 0xA2FE8CCA, 0x0B3698D4, 0x81CFA6F5, 0xDE28A57A, 0x8E26DAB7, 0xBFA43FAD, + 0x9DE42C3A, 0x920D5078, 0xCC9B6A5F, 0x4662547E, 0x13C2F68D, 0xB8E890D8, 0xF75E2E39, 0xAFF582C3, + 0x80BE9F5D, 0x937C69D0, 0x2DA96FD5, 0x12B3CF25, 0x993BC8AC, 0x7DA71018, 0x636EE89C, 0xBB7BDB3B, + 0x7809CD26, 0x18F46E59, 0xB701EC9A, 0x9AA8834F, 0x6E65E695, 0xE67EAAFF, 0xCF0821BC, 0xE8E6EF15, + 0x9BD9BAE7, 0x36CE4A6F, 0x09D4EA9F, 0x7CD629B0, 0xB2AF31A4, 0x23312A3F, 0x9430C6A5, 0x66C035A2, + 0xBC37744E, 0xCAA6FC82, 0xD0B0E090, 0xD81533A7, 0x984AF104, 0xDAF741EC, 0x500E7FCD, 0xF62F1791, + 0xD68D764D, 0xB04D43EF, 0x4D54CCAA, 0x04DFE496, 0xB5E39ED1, 0x881B4C6A, 0x1FB8C12C, 0x517F4665, + 0xEA049D5E, 0x355D018C, 0x7473FA87, 0x412EFB0B, 0x1D5AB367, 0xD25292DB, 0x5633E910, 0x47136DD6, + 0x618C9AD7, 0x0C7A37A1, 0x148E59F8, 0x3C89EB13, 0x27EECEA9, 0xC935B761, 0xE5EDE11C, 0xB13C7A47, + 0xDF599CD2, 0x733F55F2, 0xCE791814, 0x37BF73C7, 0xCDEA53F7, 0xAA5B5FFD, 0x6F14DF3D, 0xDB867844, + 0xF381CAAF, 0xC43EB968, 0x342C3824, 0x405FC2A3, 0xC372161D, 0x250CBCE2, 0x498B283C, 0x9541FF0D, + 0x017139A8, 0xB3DE080C, 0xE49CD8B4, 0xC1906456, 0x84617BCB, 0xB670D532, 0x5C74486C, 0x5742D0B8 + ); + + /** + * Precomputed invMixColumns table + * + * @see Crypt_Rijndael:_encryptBlock() + * @see Crypt_Rijndael:_decryptBlock() + * @var Array + * @access private + */ + var $dt3 = array( + 0xF4A75051, 0x4165537E, 0x17A4C31A, 0x275E963A, 0xAB6BCB3B, 0x9D45F11F, 0xFA58ABAC, 0xE303934B, + 0x30FA5520, 0x766DF6AD, 0xCC769188, 0x024C25F5, 0xE5D7FC4F, 0x2ACBD7C5, 0x35448026, 0x62A38FB5, + 0xB15A49DE, 0xBA1B6725, 0xEA0E9845, 0xFEC0E15D, 0x2F7502C3, 0x4CF01281, 0x4697A38D, 0xD3F9C66B, + 0x8F5FE703, 0x929C9515, 0x6D7AEBBF, 0x5259DA95, 0xBE832DD4, 0x7421D358, 0xE0692949, 0xC9C8448E, + 0xC2896A75, 0x8E7978F4, 0x583E6B99, 0xB971DD27, 0xE14FB6BE, 0x88AD17F0, 0x20AC66C9, 0xCE3AB47D, + 0xDF4A1863, 0x1A3182E5, 0x51336097, 0x537F4562, 0x6477E0B1, 0x6BAE84BB, 0x81A01CFE, 0x082B94F9, + 0x48685870, 0x45FD198F, 0xDE6C8794, 0x7BF8B752, 0x73D323AB, 0x4B02E272, 0x1F8F57E3, 0x55AB2A66, + 0xEB2807B2, 0xB5C2032F, 0xC57B9A86, 0x3708A5D3, 0x2887F230, 0xBFA5B223, 0x036ABA02, 0x16825CED, + 0xCF1C2B8A, 0x79B492A7, 0x07F2F0F3, 0x69E2A14E, 0xDAF4CD65, 0x05BED506, 0x34621FD1, 0xA6FE8AC4, + 0x2E539D34, 0xF355A0A2, 0x8AE13205, 0xF6EB75A4, 0x83EC390B, 0x60EFAA40, 0x719F065E, 0x6E1051BD, + 0x218AF93E, 0xDD063D96, 0x3E05AEDD, 0xE6BD464D, 0x548DB591, 0xC45D0571, 0x06D46F04, 0x5015FF60, + 0x98FB2419, 0xBDE997D6, 0x4043CC89, 0xD99E7767, 0xE842BDB0, 0x898B8807, 0x195B38E7, 0xC8EEDB79, + 0x7C0A47A1, 0x420FE97C, 0x841EC9F8, 0x00000000, 0x80868309, 0x2BED4832, 0x1170AC1E, 0x5A724E6C, + 0x0EFFFBFD, 0x8538560F, 0xAED51E3D, 0x2D392736, 0x0FD9640A, 0x5CA62168, 0x5B54D19B, 0x362E3A24, + 0x0A67B10C, 0x57E70F93, 0xEE96D2B4, 0x9B919E1B, 0xC0C54F80, 0xDC20A261, 0x774B695A, 0x121A161C, + 0x93BA0AE2, 0xA02AE5C0, 0x22E0433C, 0x1B171D12, 0x090D0B0E, 0x8BC7ADF2, 0xB6A8B92D, 0x1EA9C814, + 0xF1198557, 0x75074CAF, 0x99DDBBEE, 0x7F60FDA3, 0x01269FF7, 0x72F5BC5C, 0x663BC544, 0xFB7E345B, + 0x4329768B, 0x23C6DCCB, 0xEDFC68B6, 0xE4F163B8, 0x31DCCAD7, 0x63851042, 0x97224013, 0xC6112084, + 0x4A247D85, 0xBB3DF8D2, 0xF93211AE, 0x29A16DC7, 0x9E2F4B1D, 0xB230F3DC, 0x8652EC0D, 0xC1E3D077, + 0xB3166C2B, 0x70B999A9, 0x9448FA11, 0xE9642247, 0xFC8CC4A8, 0xF03F1AA0, 0x7D2CD856, 0x3390EF22, + 0x494EC787, 0x38D1C1D9, 0xCAA2FE8C, 0xD40B3698, 0xF581CFA6, 0x7ADE28A5, 0xB78E26DA, 0xADBFA43F, + 0x3A9DE42C, 0x78920D50, 0x5FCC9B6A, 0x7E466254, 0x8D13C2F6, 0xD8B8E890, 0x39F75E2E, 0xC3AFF582, + 0x5D80BE9F, 0xD0937C69, 0xD52DA96F, 0x2512B3CF, 0xAC993BC8, 0x187DA710, 0x9C636EE8, 0x3BBB7BDB, + 0x267809CD, 0x5918F46E, 0x9AB701EC, 0x4F9AA883, 0x956E65E6, 0xFFE67EAA, 0xBCCF0821, 0x15E8E6EF, + 0xE79BD9BA, 0x6F36CE4A, 0x9F09D4EA, 0xB07CD629, 0xA4B2AF31, 0x3F23312A, 0xA59430C6, 0xA266C035, + 0x4EBC3774, 0x82CAA6FC, 0x90D0B0E0, 0xA7D81533, 0x04984AF1, 0xECDAF741, 0xCD500E7F, 0x91F62F17, + 0x4DD68D76, 0xEFB04D43, 0xAA4D54CC, 0x9604DFE4, 0xD1B5E39E, 0x6A881B4C, 0x2C1FB8C1, 0x65517F46, + 0x5EEA049D, 0x8C355D01, 0x877473FA, 0x0B412EFB, 0x671D5AB3, 0xDBD25292, 0x105633E9, 0xD647136D, + 0xD7618C9A, 0xA10C7A37, 0xF8148E59, 0x133C89EB, 0xA927EECE, 0x61C935B7, 0x1CE5EDE1, 0x47B13C7A, + 0xD2DF599C, 0xF2733F55, 0x14CE7918, 0xC737BF73, 0xF7CDEA53, 0xFDAA5B5F, 0x3D6F14DF, 0x44DB8678, + 0xAFF381CA, 0x68C43EB9, 0x24342C38, 0xA3405FC2, 0x1DC37216, 0xE2250CBC, 0x3C498B28, 0x0D9541FF, + 0xA8017139, 0x0CB3DE08, 0xB4E49CD8, 0x56C19064, 0xCB84617B, 0x32B670D5, 0x6C5C7448, 0xB85742D0 + ); + + /** + * The SubByte S-Box + * + * @see Crypt_Rijndael::_encryptBlock() + * @var Array + * @access private + */ + var $sbox = array( + 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, + 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, + 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, + 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, + 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, + 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, + 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, + 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, + 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, + 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, + 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, + 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, + 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, + 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, + 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, + 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 + ); + + /** + * The inverse SubByte S-Box + * + * @see Crypt_Rijndael::_decryptBlock() + * @var Array + * @access private + */ + var $isbox = array( + 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, + 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, + 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, + 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, + 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, + 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, + 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, + 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, + 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, + 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, + 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, + 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, + 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, + 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, + 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D + ); + + /** + * Sets the key. + * + * Keys can be of any length. Rijndael, itself, requires the use of a key that's between 128-bits and 256-bits long and + * whose length is a multiple of 32. If the key is less than 256-bits and the key length isn't set, we round the length + * up to the closest valid key length, padding $key with null bytes. If the key is more than 256-bits, we trim the + * excess bits. + * + * If the key is not explicitly set, it'll be assumed to be all null bytes. + * + * Note: 160/224-bit keys must explicitly set by setKeyLength(), otherwise they will be round/pad up to 192/256 bits. + * + * @see Crypt_Base:setKey() + * @see setKeyLength() + * @access public + * @param String $key + */ + function setKey($key) + { + parent::setKey($key); + + if (!$this->explicit_key_length) { + $length = strlen($key); + switch (true) { + case $length <= 16: + $this->key_size = 16; + break; + case $length <= 20: + $this->key_size = 20; + break; + case $length <= 24: + $this->key_size = 24; + break; + case $length <= 28: + $this->key_size = 28; + break; + default: + $this->key_size = 32; + } + $this->_setupEngine(); + } + } + + /** + * Sets the key length + * + * Valid key lengths are 128, 160, 192, 224, and 256. If the length is less than 128, it will be rounded up to + * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount. + * + * Note: phpseclib extends Rijndael (and AES) for using 160- and 224-bit keys but they are officially not defined + * and the most (if not all) implementations are not able using 160/224-bit keys but round/pad them up to + * 192/256 bits as, for example, mcrypt will do. + * + * That said, if you want be compatible with other Rijndael and AES implementations, + * you should not setKeyLength(160) or setKeyLength(224). + * + * Additional: In case of 160- and 224-bit keys, phpseclib will/can, for that reason, not use + * the mcrypt php extension, even if available. + * This results then in slower encryption. + * + * @access public + * @param Integer $length + */ + function setKeyLength($length) + { + switch (true) { + case $length == 160: + $this->key_size = 20; + break; + case $length == 224: + $this->key_size = 28; + break; + case $length <= 128: + $this->key_size = 16; + break; + case $length <= 192: + $this->key_size = 24; + break; + default: + $this->key_size = 32; + } + + $this->explicit_key_length = true; + $this->changed = true; + $this->_setupEngine(); + } + + /** + * Sets the block length + * + * Valid block lengths are 128, 160, 192, 224, and 256. If the length is less than 128, it will be rounded up to + * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount. + * + * @access public + * @param Integer $length + */ + function setBlockLength($length) + { + $length >>= 5; + if ($length > 8) { + $length = 8; + } else if ($length < 4) { + $length = 4; + } + $this->Nb = $length; + $this->block_size = $length << 2; + $this->changed = true; + $this->_setupEngine(); + } + + /** + * Setup the fastest possible $engine + * + * Determines if the mcrypt (MODE_MCRYPT) $engine available + * and usable for the current $block_size and $key_size. + * + * If not, the slower MODE_INTERNAL $engine will be set. + * + * @see setKey() + * @see setKeyLength() + * @see setBlockLength() + * @access private + */ + function _setupEngine() + { + if (constant('CRYPT_' . $this->const_namespace . '_MODE') == CRYPT_MODE_INTERNAL) { + // No mcrypt support at all for rijndael + return; + } + + // The required mcrypt module name for the current $block_size of rijndael + $cipher_name_mcrypt = 'rijndael-' . ($this->block_size << 3); + + // Determining the availibility/usability of $cipher_name_mcrypt + switch (true) { + case $this->key_size % 8: // mcrypt is not usable for 160/224-bit keys, only for 128/192/256-bit keys + case !in_array($cipher_name_mcrypt, mcrypt_list_algorithms()): // $cipher_name_mcrypt is not available for the current $block_size + $engine = CRYPT_MODE_INTERNAL; + break; + default: + $engine = CRYPT_MODE_MCRYPT; + } + + if ($this->engine == $engine && $this->cipher_name_mcrypt == $cipher_name_mcrypt) { + // allready set, so we not unnecessary close $this->enmcrypt/demcrypt/ecb + return; + } + + // Set the $engine + $this->engine = $engine; + $this->cipher_name_mcrypt = $cipher_name_mcrypt; + + if ($this->enmcrypt) { + // Closing the current mcrypt resource(s). _mcryptSetup() will, if needed, + // (re)open them with the module named in $this->cipher_name_mcrypt + mcrypt_module_close($this->enmcrypt); + mcrypt_module_close($this->demcrypt); + $this->enmcrypt = null; + $this->demcrypt = null; + + if ($this->ecb) { + mcrypt_module_close($this->ecb); + $this->ecb = null; + } + } + } + + /** + * Setup the CRYPT_MODE_MCRYPT $engine + * + * @see Crypt_Base::_setupMcrypt() + * @access private + */ + function _setupMcrypt() + { + $this->key = str_pad(substr($this->key, 0, $this->key_size), $this->key_size, "\0"); + parent::_setupMcrypt(); + } + + /** + * Encrypts a block + * + * @access private + * @param String $in + * @return String + */ + function _encryptBlock($in) + { + static $t0, $t1, $t2, $t3, $sbox; + if (!$t0) { + for ($i = 0; $i < 256; ++$i) { + $t0[] = (int)$this->t0[$i]; + $t1[] = (int)$this->t1[$i]; + $t2[] = (int)$this->t2[$i]; + $t3[] = (int)$this->t3[$i]; + $sbox[] = (int)$this->sbox[$i]; + } + } + + $state = array(); + $words = unpack('N*', $in); + + $c = $this->c; + $w = $this->w; + $Nb = $this->Nb; + $Nr = $this->Nr; + + // addRoundKey + $i = -1; + foreach ($words as $word) { + $state[] = $word ^ $w[0][++$i]; + } + + // fips-197.pdf#page=19, "Figure 5. Pseudo Code for the Cipher", states that this loop has four components - + // subBytes, shiftRows, mixColumns, and addRoundKey. fips-197.pdf#page=30, "Implementation Suggestions Regarding + // Various Platforms" suggests that performs enhanced implementations are described in Rijndael-ammended.pdf. + // Rijndael-ammended.pdf#page=20, "Implementation aspects / 32-bit processor", discusses such an optimization. + // Unfortunately, the description given there is not quite correct. Per aes.spec.v316.pdf#page=19 [1], + // equation (7.4.7) is supposed to use addition instead of subtraction, so we'll do that here, as well. + + // [1] http://fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.v316.pdf + $temp = array(); + for ($round = 1; $round < $Nr; ++$round) { + $i = 0; // $c[0] == 0 + $j = $c[1]; + $k = $c[2]; + $l = $c[3]; + + while ($i < $Nb) { + $temp[$i] = $t0[$state[$i] >> 24 & 0x000000FF] ^ + $t1[$state[$j] >> 16 & 0x000000FF] ^ + $t2[$state[$k] >> 8 & 0x000000FF] ^ + $t3[$state[$l] & 0x000000FF] ^ + $w[$round][$i]; + ++$i; + $j = ($j + 1) % $Nb; + $k = ($k + 1) % $Nb; + $l = ($l + 1) % $Nb; + } + $state = $temp; + } + + // subWord + for ($i = 0; $i < $Nb; ++$i) { + $state[$i] = $sbox[$state[$i] & 0x000000FF] | + ($sbox[$state[$i] >> 8 & 0x000000FF] << 8) | + ($sbox[$state[$i] >> 16 & 0x000000FF] << 16) | + ($sbox[$state[$i] >> 24 & 0x000000FF] << 24); + } + + // shiftRows + addRoundKey + $i = 0; // $c[0] == 0 + $j = $c[1]; + $k = $c[2]; + $l = $c[3]; + while ($i < $Nb) { + $temp[$i] = ($state[$i] & 0xFF000000) ^ + ($state[$j] & 0x00FF0000) ^ + ($state[$k] & 0x0000FF00) ^ + ($state[$l] & 0x000000FF) ^ + $w[$Nr][$i]; + ++$i; + $j = ($j + 1) % $Nb; + $k = ($k + 1) % $Nb; + $l = ($l + 1) % $Nb; + } + + switch ($Nb) { + case 8: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6], $temp[7]); + case 7: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6]); + case 6: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5]); + case 5: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4]); + default: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3]); + } + } + + /** + * Decrypts a block + * + * @access private + * @param String $in + * @return String + */ + function _decryptBlock($in) + { + static $dt0, $dt1, $dt2, $dt3, $isbox; + if (!$dt0) { + for ($i = 0; $i < 256; ++$i) { + $dt0[] = (int)$this->dt0[$i]; + $dt1[] = (int)$this->dt1[$i]; + $dt2[] = (int)$this->dt2[$i]; + $dt3[] = (int)$this->dt3[$i]; + $isbox[] = (int)$this->isbox[$i]; + } + } + + $state = array(); + $words = unpack('N*', $in); + + $c = $this->c; + $dw = $this->dw; + $Nb = $this->Nb; + $Nr = $this->Nr; + + // addRoundKey + $i = -1; + foreach ($words as $word) { + $state[] = $word ^ $dw[$Nr][++$i]; + } + + $temp = array(); + for ($round = $Nr - 1; $round > 0; --$round) { + $i = 0; // $c[0] == 0 + $j = $Nb - $c[1]; + $k = $Nb - $c[2]; + $l = $Nb - $c[3]; + + while ($i < $Nb) { + $temp[$i] = $dt0[$state[$i] >> 24 & 0x000000FF] ^ + $dt1[$state[$j] >> 16 & 0x000000FF] ^ + $dt2[$state[$k] >> 8 & 0x000000FF] ^ + $dt3[$state[$l] & 0x000000FF] ^ + $dw[$round][$i]; + ++$i; + $j = ($j + 1) % $Nb; + $k = ($k + 1) % $Nb; + $l = ($l + 1) % $Nb; + } + $state = $temp; + } + + // invShiftRows + invSubWord + addRoundKey + $i = 0; // $c[0] == 0 + $j = $Nb - $c[1]; + $k = $Nb - $c[2]; + $l = $Nb - $c[3]; + + while ($i < $Nb) { + $word = ($state[$i] & 0xFF000000) | + ($state[$j] & 0x00FF0000) | + ($state[$k] & 0x0000FF00) | + ($state[$l] & 0x000000FF); + + $temp[$i] = $dw[0][$i] ^ ($isbox[$word & 0x000000FF] | + ($isbox[$word >> 8 & 0x000000FF] << 8) | + ($isbox[$word >> 16 & 0x000000FF] << 16) | + ($isbox[$word >> 24 & 0x000000FF] << 24)); + ++$i; + $j = ($j + 1) % $Nb; + $k = ($k + 1) % $Nb; + $l = ($l + 1) % $Nb; + } + + switch ($Nb) { + case 8: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6], $temp[7]); + case 7: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6]); + case 6: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5]); + case 5: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4]); + default: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3]); + } + } + + /** + * Setup the key (expansion) + * + * @see Crypt_Base::_setupKey() + * @access private + */ + function _setupKey() + { + // Each number in $rcon is equal to the previous number multiplied by two in Rijndael's finite field. + // See http://en.wikipedia.org/wiki/Finite_field_arithmetic#Multiplicative_inverse + static $rcon = array(0, + 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, + 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000, + 0x6C000000, 0xD8000000, 0xAB000000, 0x4D000000, 0x9A000000, + 0x2F000000, 0x5E000000, 0xBC000000, 0x63000000, 0xC6000000, + 0x97000000, 0x35000000, 0x6A000000, 0xD4000000, 0xB3000000, + 0x7D000000, 0xFA000000, 0xEF000000, 0xC5000000, 0x91000000 + ); + + $this->key = str_pad(substr($this->key, 0, $this->key_size), $this->key_size, "\0"); + + if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->key_size === $this->kl['key_size'] && $this->block_size === $this->kl['block_size']) { + // already expanded + return; + } + $this->kl = array('key' => $this->key, 'key_size' => $this->key_size, 'block_size' => $this->block_size); + + $this->Nk = $this->key_size >> 2; + // see Rijndael-ammended.pdf#page=44 + $this->Nr = max($this->Nk, $this->Nb) + 6; + + // shift offsets for Nb = 5, 7 are defined in Rijndael-ammended.pdf#page=44, + // "Table 8: Shift offsets in Shiftrow for the alternative block lengths" + // shift offsets for Nb = 4, 6, 8 are defined in Rijndael-ammended.pdf#page=14, + // "Table 2: Shift offsets for different block lengths" + switch ($this->Nb) { + case 4: + case 5: + case 6: + $this->c = array(0, 1, 2, 3); + break; + case 7: + $this->c = array(0, 1, 2, 4); + break; + case 8: + $this->c = array(0, 1, 3, 4); + } + + $w = array_values(unpack('N*words', $this->key)); + + $length = $this->Nb * ($this->Nr + 1); + for ($i = $this->Nk; $i < $length; $i++) { + $temp = $w[$i - 1]; + if ($i % $this->Nk == 0) { + // according to , "the size of an integer is platform-dependent". + // on a 32-bit machine, it's 32-bits, and on a 64-bit machine, it's 64-bits. on a 32-bit machine, + // 0xFFFFFFFF << 8 == 0xFFFFFF00, but on a 64-bit machine, it equals 0xFFFFFFFF00. as such, doing 'and' + // with 0xFFFFFFFF (or 0xFFFFFF00) on a 32-bit machine is unnecessary, but on a 64-bit machine, it is. + $temp = (($temp << 8) & 0xFFFFFF00) | (($temp >> 24) & 0x000000FF); // rotWord + $temp = $this->_subWord($temp) ^ $rcon[$i / $this->Nk]; + } else if ($this->Nk > 6 && $i % $this->Nk == 4) { + $temp = $this->_subWord($temp); + } + $w[$i] = $w[$i - $this->Nk] ^ $temp; + } + + // convert the key schedule from a vector of $Nb * ($Nr + 1) length to a matrix with $Nr + 1 rows and $Nb columns + // and generate the inverse key schedule. more specifically, + // according to (section 5.3.3), + // "The key expansion for the Inverse Cipher is defined as follows: + // 1. Apply the Key Expansion. + // 2. Apply InvMixColumn to all Round Keys except the first and the last one." + // also, see fips-197.pdf#page=27, "5.3.5 Equivalent Inverse Cipher" + $temp = $this->w = $this->dw = array(); + for ($i = $row = $col = 0; $i < $length; $i++, $col++) { + if ($col == $this->Nb) { + if ($row == 0) { + $this->dw[0] = $this->w[0]; + } else { + // subWord + invMixColumn + invSubWord = invMixColumn + $j = 0; + while ($j < $this->Nb) { + $dw = $this->_subWord($this->w[$row][$j]); + $temp[$j] = $this->dt0[$dw >> 24 & 0x000000FF] ^ + $this->dt1[$dw >> 16 & 0x000000FF] ^ + $this->dt2[$dw >> 8 & 0x000000FF] ^ + $this->dt3[$dw & 0x000000FF]; + $j++; + } + $this->dw[$row] = $temp; + } + + $col = 0; + $row++; + } + $this->w[$row][$col] = $w[$i]; + } + + $this->dw[$row] = $this->w[$row]; + + // In case of $this->use_inline_crypt === true we have to use 1-dim key arrays (both ascending) + if ($this->use_inline_crypt) { + $this->dw = array_reverse($this->dw); + $w = array_pop($this->w); + $dw = array_pop($this->dw); + foreach ($this->w as $r => $wr) { + foreach ($wr as $c => $wc) { + $w[] = $wc; + $dw[] = $this->dw[$r][$c]; + } + } + $this->w = $w; + $this->dw = $dw; + } + } + + /** + * Performs S-Box substitutions + * + * @access private + * @param Integer $word + */ + function _subWord($word) + { + $sbox = $this->sbox; + + return $sbox[$word & 0x000000FF] | + ($sbox[$word >> 8 & 0x000000FF] << 8) | + ($sbox[$word >> 16 & 0x000000FF] << 16) | + ($sbox[$word >> 24 & 0x000000FF] << 24); + } + + /** + * Setup the performance-optimized function for de/encrypt() + * + * @see Crypt_Base::_setupInlineCrypt() + * @access private + */ + function _setupInlineCrypt() + { + // Note: _setupInlineCrypt() will be called only if $this->changed === true + // So here we are'nt under the same heavy timing-stress as we are in _de/encryptBlock() or de/encrypt(). + // However...the here generated function- $code, stored as php callback in $this->inline_crypt, must work as fast as even possible. + + $lambda_functions =& Crypt_Rijndael::_getLambdaFunctions(); + + // The first 10 generated $lambda_functions will use the key-words hardcoded for better performance. + // For memory reason we limit those ultra-optimized functions. + // After that, we use pure (extracted) integer vars for the key-words which is faster than accessing them via array. + if (count($lambda_functions) < 10) { + $w = $this->w; + $dw = $this->dw; + $init_encrypt = ''; + $init_decrypt = ''; + } else { + for ($i = 0, $cw = count($this->w); $i < $cw; ++$i) { + $w[] = '$w[' . $i . ']'; + $dw[] = '$dw[' . $i . ']'; + } + $init_encrypt = '$w = $self->w;'; + $init_decrypt = '$dw = $self->dw;'; + } + + $code_hash = md5(str_pad("Crypt_Rijndael, {$this->mode}, {$this->block_size}, ", 32, "\0") . implode(',', $w)); + + if (!isset($lambda_functions[$code_hash])) { + $Nr = $this->Nr; + $Nb = $this->Nb; + $c = $this->c; + + // Generating encrypt code: + $init_encrypt.= ' + static $t0, $t1, $t2, $t3, $sbox; + if (!$t0) { + for ($i = 0; $i < 256; ++$i) { + $t0[$i] = (int)$self->t0[$i]; + $t1[$i] = (int)$self->t1[$i]; + $t2[$i] = (int)$self->t2[$i]; + $t3[$i] = (int)$self->t3[$i]; + $sbox[$i] = (int)$self->sbox[$i]; + } + } + '; + + $s = 'e'; + $e = 's'; + $wc = $Nb - 1; + + // Preround: addRoundKey + $encrypt_block = '$in = unpack("N*", $in);'."\n"; + for ($i = 0; $i < $Nb; ++$i) { + $encrypt_block .= '$s'.$i.' = $in['.($i + 1).'] ^ '.$w[++$wc].";\n"; + } + + // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey + for ($round = 1; $round < $Nr; ++$round) { + list($s, $e) = array($e, $s); + for ($i = 0; $i < $Nb; ++$i) { + $encrypt_block.= + '$'.$e.$i.' = + $t0[($'.$s.$i .' >> 24) & 0xff] ^ + $t1[($'.$s.(($i + $c[1]) % $Nb).' >> 16) & 0xff] ^ + $t2[($'.$s.(($i + $c[2]) % $Nb).' >> 8) & 0xff] ^ + $t3[ $'.$s.(($i + $c[3]) % $Nb).' & 0xff] ^ + '.$w[++$wc].";\n"; + } + } + + // Finalround: subWord + shiftRows + addRoundKey + for ($i = 0; $i < $Nb; ++$i) { + $encrypt_block.= + '$'.$e.$i.' = + $sbox[ $'.$e.$i.' & 0xff] | + ($sbox[($'.$e.$i.' >> 8) & 0xff] << 8) | + ($sbox[($'.$e.$i.' >> 16) & 0xff] << 16) | + ($sbox[($'.$e.$i.' >> 24) & 0xff] << 24);'."\n"; + } + $encrypt_block .= '$in = pack("N*"'."\n"; + for ($i = 0; $i < $Nb; ++$i) { + $encrypt_block.= ', + ($'.$e.$i .' & 0xFF000000) ^ + ($'.$e.(($i + $c[1]) % $Nb).' & 0x00FF0000) ^ + ($'.$e.(($i + $c[2]) % $Nb).' & 0x0000FF00) ^ + ($'.$e.(($i + $c[3]) % $Nb).' & 0x000000FF) ^ + '.$w[$i]."\n"; + } + $encrypt_block .= ');'; + + // Generating decrypt code: + $init_decrypt.= ' + static $dt0, $dt1, $dt2, $dt3, $isbox; + if (!$dt0) { + for ($i = 0; $i < 256; ++$i) { + $dt0[$i] = (int)$self->dt0[$i]; + $dt1[$i] = (int)$self->dt1[$i]; + $dt2[$i] = (int)$self->dt2[$i]; + $dt3[$i] = (int)$self->dt3[$i]; + $isbox[$i] = (int)$self->isbox[$i]; + } + } + '; + + $s = 'e'; + $e = 's'; + $wc = $Nb - 1; + + // Preround: addRoundKey + $decrypt_block = '$in = unpack("N*", $in);'."\n"; + for ($i = 0; $i < $Nb; ++$i) { + $decrypt_block .= '$s'.$i.' = $in['.($i + 1).'] ^ '.$dw[++$wc].';'."\n"; + } + + // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey + for ($round = 1; $round < $Nr; ++$round) { + list($s, $e) = array($e, $s); + for ($i = 0; $i < $Nb; ++$i) { + $decrypt_block.= + '$'.$e.$i.' = + $dt0[($'.$s.$i .' >> 24) & 0xff] ^ + $dt1[($'.$s.(($Nb + $i - $c[1]) % $Nb).' >> 16) & 0xff] ^ + $dt2[($'.$s.(($Nb + $i - $c[2]) % $Nb).' >> 8) & 0xff] ^ + $dt3[ $'.$s.(($Nb + $i - $c[3]) % $Nb).' & 0xff] ^ + '.$dw[++$wc].";\n"; + } + } + + // Finalround: subWord + shiftRows + addRoundKey + for ($i = 0; $i < $Nb; ++$i) { + $decrypt_block.= + '$'.$e.$i.' = + $isbox[ $'.$e.$i.' & 0xff] | + ($isbox[($'.$e.$i.' >> 8) & 0xff] << 8) | + ($isbox[($'.$e.$i.' >> 16) & 0xff] << 16) | + ($isbox[($'.$e.$i.' >> 24) & 0xff] << 24);'."\n"; + } + $decrypt_block .= '$in = pack("N*"'."\n"; + for ($i = 0; $i < $Nb; ++$i) { + $decrypt_block.= ', + ($'.$e.$i. ' & 0xFF000000) ^ + ($'.$e.(($Nb + $i - $c[1]) % $Nb).' & 0x00FF0000) ^ + ($'.$e.(($Nb + $i - $c[2]) % $Nb).' & 0x0000FF00) ^ + ($'.$e.(($Nb + $i - $c[3]) % $Nb).' & 0x000000FF) ^ + '.$dw[$i]."\n"; + } + $decrypt_block .= ');'; + + $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( + array( + 'init_crypt' => '', + 'init_encrypt' => $init_encrypt, + 'init_decrypt' => $init_decrypt, + 'encrypt_block' => $encrypt_block, + 'decrypt_block' => $decrypt_block + ) + ); + } + $this->inline_crypt = $lambda_functions[$code_hash]; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/TripleDES.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/TripleDES.php new file mode 100755 index 00000000..06ea09b1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/TripleDES.php @@ -0,0 +1,428 @@ + + * setKey('abcdefghijklmnopqrstuvwx'); + * + * $size = 10 * 1024; + * $plaintext = ''; + * for ($i = 0; $i < $size; $i++) { + * $plaintext.= 'a'; + * } + * + * echo $des->decrypt($des->encrypt($plaintext)); + * ?> + * + * + * LICENSE: 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. + * + * @category Crypt + * @package Crypt_TripleDES + * @author Jim Wigginton + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_DES + */ +if (!class_exists('Crypt_DES')) { + include_once 'DES.php'; +} + +/** + * Encrypt / decrypt using inner chaining + * + * Inner chaining is used by SSH-1 and is generally considered to be less secure then outer chaining (CRYPT_DES_MODE_CBC3). + */ +define('CRYPT_DES_MODE_3CBC', -2); + +/** + * Encrypt / decrypt using outer chaining + * + * Outer chaining is used by SSH-2 and when the mode is set to CRYPT_DES_MODE_CBC. + */ +define('CRYPT_DES_MODE_CBC3', CRYPT_DES_MODE_CBC); + +/** + * Pure-PHP implementation of Triple DES. + * + * @package Crypt_TripleDES + * @author Jim Wigginton + * @access public + */ +class Crypt_TripleDES extends Crypt_DES +{ + /** + * The default password key_size used by setPassword() + * + * @see Crypt_DES::password_key_size + * @see Crypt_Base::password_key_size + * @see Crypt_Base::setPassword() + * @var Integer + * @access private + */ + var $password_key_size = 24; + + /** + * The default salt used by setPassword() + * + * @see Crypt_Base::password_default_salt + * @see Crypt_Base::setPassword() + * @var String + * @access private + */ + var $password_default_salt = 'phpseclib'; + + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_DES::const_namespace + * @see Crypt_Base::const_namespace + * @var String + * @access private + */ + var $const_namespace = 'DES'; + + /** + * The mcrypt specific name of the cipher + * + * @see Crypt_DES::cipher_name_mcrypt + * @see Crypt_Base::cipher_name_mcrypt + * @var String + * @access private + */ + var $cipher_name_mcrypt = 'tripledes'; + + /** + * Optimizing value while CFB-encrypting + * + * @see Crypt_Base::cfb_init_len + * @var Integer + * @access private + */ + var $cfb_init_len = 750; + + /** + * max possible size of $key + * + * @see Crypt_TripleDES::setKey() + * @see Crypt_DES::setKey() + * @var String + * @access private + */ + var $key_size_max = 24; + + /** + * Internal flag whether using CRYPT_DES_MODE_3CBC or not + * + * @var Boolean + * @access private + */ + var $mode_3cbc; + + /** + * The Crypt_DES objects + * + * Used only if $mode_3cbc === true + * + * @var Array + * @access private + */ + var $des; + + /** + * Default Constructor. + * + * Determines whether or not the mcrypt extension should be used. + * + * $mode could be: + * + * - CRYPT_DES_MODE_ECB + * + * - CRYPT_DES_MODE_CBC + * + * - CRYPT_DES_MODE_CTR + * + * - CRYPT_DES_MODE_CFB + * + * - CRYPT_DES_MODE_OFB + * + * - CRYPT_DES_MODE_3CBC + * + * If not explicitly set, CRYPT_DES_MODE_CBC will be used. + * + * @see Crypt_DES::Crypt_DES() + * @see Crypt_Base::Crypt_Base() + * @param optional Integer $mode + * @access public + */ + function Crypt_TripleDES($mode = CRYPT_DES_MODE_CBC) + { + switch ($mode) { + // In case of CRYPT_DES_MODE_3CBC, we init as CRYPT_DES_MODE_CBC + // and additional flag us internally as 3CBC + case CRYPT_DES_MODE_3CBC: + parent::Crypt_Base(CRYPT_DES_MODE_CBC); + $this->mode_3cbc = true; + + // This three $des'es will do the 3CBC work (if $key > 64bits) + $this->des = array( + new Crypt_DES(CRYPT_DES_MODE_CBC), + new Crypt_DES(CRYPT_DES_MODE_CBC), + new Crypt_DES(CRYPT_DES_MODE_CBC), + ); + + // we're going to be doing the padding, ourselves, so disable it in the Crypt_DES objects + $this->des[0]->disablePadding(); + $this->des[1]->disablePadding(); + $this->des[2]->disablePadding(); + break; + // If not 3CBC, we init as usual + default: + parent::Crypt_Base($mode); + } + } + + /** + * Sets the initialization vector. (optional) + * + * SetIV is not required when CRYPT_DES_MODE_ECB is being used. If not explicitly set, it'll be assumed + * to be all zero's. + * + * @see Crypt_Base::setIV() + * @access public + * @param String $iv + */ + function setIV($iv) + { + parent::setIV($iv); + if ($this->mode_3cbc) { + $this->des[0]->setIV($iv); + $this->des[1]->setIV($iv); + $this->des[2]->setIV($iv); + } + } + + /** + * Sets the key. + * + * Keys can be of any length. Triple DES, itself, can use 128-bit (eg. strlen($key) == 16) or + * 192-bit (eg. strlen($key) == 24) keys. This function pads and truncates $key as appropriate. + * + * DES also requires that every eighth bit be a parity bit, however, we'll ignore that. + * + * If the key is not explicitly set, it'll be assumed to be all null bytes. + * + * @access public + * @see Crypt_DES::setKey() + * @see Crypt_Base::setKey() + * @param String $key + */ + function setKey($key) + { + $length = strlen($key); + if ($length > 8) { + $key = str_pad(substr($key, 0, 24), 24, chr(0)); + // if $key is between 64 and 128-bits, use the first 64-bits as the last, per this: + // http://php.net/function.mcrypt-encrypt#47973 + //$key = $length <= 16 ? substr_replace($key, substr($key, 0, 8), 16) : substr($key, 0, 24); + } else { + $key = str_pad($key, 8, chr(0)); + } + parent::setKey($key); + + // And in case of CRYPT_DES_MODE_3CBC: + // if key <= 64bits we not need the 3 $des to work, + // because we will then act as regular DES-CBC with just a <= 64bit key. + // So only if the key > 64bits (> 8 bytes) we will call setKey() for the 3 $des. + if ($this->mode_3cbc && $length > 8) { + $this->des[0]->setKey(substr($key, 0, 8)); + $this->des[1]->setKey(substr($key, 8, 8)); + $this->des[2]->setKey(substr($key, 16, 8)); + } + } + + /** + * Encrypts a message. + * + * @see Crypt_Base::encrypt() + * @access public + * @param String $plaintext + * @return String $cipertext + */ + function encrypt($plaintext) + { + // parent::en/decrypt() is able to do all the work for all modes and keylengths, + // except for: CRYPT_DES_MODE_3CBC (inner chaining CBC) with a key > 64bits + + // if the key is smaller then 8, do what we'd normally do + if ($this->mode_3cbc && strlen($this->key) > 8) { + return $this->des[2]->encrypt( + $this->des[1]->decrypt( + $this->des[0]->encrypt( + $this->_pad($plaintext) + ) + ) + ); + } + + return parent::encrypt($plaintext); + } + + /** + * Decrypts a message. + * + * @see Crypt_Base::decrypt() + * @access public + * @param String $ciphertext + * @return String $plaintext + */ + function decrypt($ciphertext) + { + if ($this->mode_3cbc && strlen($this->key) > 8) { + return $this->_unpad( + $this->des[0]->decrypt( + $this->des[1]->encrypt( + $this->des[2]->decrypt( + str_pad($ciphertext, (strlen($ciphertext) + 7) & 0xFFFFFFF8, "\0") + ) + ) + ) + ); + } + + return parent::decrypt($ciphertext); + } + + /** + * Treat consecutive "packets" as if they are a continuous buffer. + * + * Say you have a 16-byte plaintext $plaintext. Using the default behavior, the two following code snippets + * will yield different outputs: + * + * + * echo $des->encrypt(substr($plaintext, 0, 8)); + * echo $des->encrypt(substr($plaintext, 8, 8)); + * + * + * echo $des->encrypt($plaintext); + * + * + * The solution is to enable the continuous buffer. Although this will resolve the above discrepancy, it creates + * another, as demonstrated with the following: + * + * + * $des->encrypt(substr($plaintext, 0, 8)); + * echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8))); + * + * + * echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8))); + * + * + * With the continuous buffer disabled, these would yield the same output. With it enabled, they yield different + * outputs. The reason is due to the fact that the initialization vector's change after every encryption / + * decryption round when the continuous buffer is enabled. When it's disabled, they remain constant. + * + * Put another way, when the continuous buffer is enabled, the state of the Crypt_DES() object changes after each + * encryption / decryption round, whereas otherwise, it'd remain constant. For this reason, it's recommended that + * continuous buffers not be used. They do offer better security and are, in fact, sometimes required (SSH uses them), + * however, they are also less intuitive and more likely to cause you problems. + * + * @see Crypt_Base::enableContinuousBuffer() + * @see Crypt_TripleDES::disableContinuousBuffer() + * @access public + */ + function enableContinuousBuffer() + { + parent::enableContinuousBuffer(); + if ($this->mode_3cbc) { + $this->des[0]->enableContinuousBuffer(); + $this->des[1]->enableContinuousBuffer(); + $this->des[2]->enableContinuousBuffer(); + } + } + + /** + * Treat consecutive packets as if they are a discontinuous buffer. + * + * The default behavior. + * + * @see Crypt_Base::disableContinuousBuffer() + * @see Crypt_TripleDES::enableContinuousBuffer() + * @access public + */ + function disableContinuousBuffer() + { + parent::disableContinuousBuffer(); + if ($this->mode_3cbc) { + $this->des[0]->disableContinuousBuffer(); + $this->des[1]->disableContinuousBuffer(); + $this->des[2]->disableContinuousBuffer(); + } + } + + /** + * Creates the key schedule + * + * @see Crypt_DES::_setupKey() + * @see Crypt_Base::_setupKey() + * @access private + */ + function _setupKey() + { + switch (true) { + // if $key <= 64bits we configure our internal pure-php cipher engine + // to act as regular [1]DES, not as 3DES. mcrypt.so::tripledes does the same. + case strlen($this->key) <= 8: + $this->des_rounds = 1; + break; + + // otherwise, if $key > 64bits, we configure our engine to work as 3DES. + default: + $this->des_rounds = 3; + + // (only) if 3CBC is used we have, of course, to setup the $des[0-2] keys also separately. + if ($this->mode_3cbc) { + $this->des[0]->_setupKey(); + $this->des[1]->_setupKey(); + $this->des[2]->_setupKey(); + + // because $des[0-2] will, now, do all the work we can return here + // not need unnecessary stress parent::_setupKey() with our, now unused, $key. + return; + } + } + // setup our key + parent::_setupKey(); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Twofish.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Twofish.php new file mode 100755 index 00000000..8dd7933a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Twofish.php @@ -0,0 +1,895 @@ + + * setKey('12345678901234567890123456789012'); + * + * $plaintext = str_repeat('a', 1024); + * + * echo $twofish->decrypt($twofish->encrypt($plaintext)); + * ?> + * + * + * LICENSE: 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. + * + * @category Crypt + * @package Crypt_Twofish + * @author Jim Wigginton + * @author Hans-Juergen Petrich + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Base + * + * Base cipher class + */ +if (!class_exists('Crypt_Base')) { + include_once 'Base.php'; +} + +/**#@+ + * @access public + * @see Crypt_Twofish::encrypt() + * @see Crypt_Twofish::decrypt() + */ +/** + * Encrypt / decrypt using the Counter mode. + * + * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 + */ +define('CRYPT_TWOFISH_MODE_CTR', CRYPT_MODE_CTR); +/** + * Encrypt / decrypt using the Electronic Code Book mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 + */ +define('CRYPT_TWOFISH_MODE_ECB', CRYPT_MODE_ECB); +/** + * Encrypt / decrypt using the Code Book Chaining mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 + */ +define('CRYPT_TWOFISH_MODE_CBC', CRYPT_MODE_CBC); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 + */ +define('CRYPT_TWOFISH_MODE_CFB', CRYPT_MODE_CFB); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 + */ +define('CRYPT_TWOFISH_MODE_OFB', CRYPT_MODE_OFB); +/**#@-*/ + +/**#@+ + * @access private + * @see Crypt_Base::Crypt_Base() + */ +/** + * Toggles the internal implementation + */ +define('CRYPT_TWOFISH_MODE_INTERNAL', CRYPT_MODE_INTERNAL); +/** + * Toggles the mcrypt implementation + */ +define('CRYPT_TWOFISH_MODE_MCRYPT', CRYPT_MODE_MCRYPT); +/**#@-*/ + +/** + * Pure-PHP implementation of Twofish. + * + * @package Crypt_Twofish + * @author Jim Wigginton + * @author Hans-Juergen Petrich + * @access public + */ +class Crypt_Twofish extends Crypt_Base +{ + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_Base::const_namespace + * @var String + * @access private + */ + var $const_namespace = 'TWOFISH'; + + /** + * The mcrypt specific name of the cipher + * + * @see Crypt_Base::cipher_name_mcrypt + * @var String + * @access private + */ + var $cipher_name_mcrypt = 'twofish'; + + /** + * Optimizing value while CFB-encrypting + * + * @see Crypt_Base::cfb_init_len + * @var Integer + * @access private + */ + var $cfb_init_len = 800; + + /** + * Q-Table + * + * @var Array + * @access private + */ + var $q0 = array ( + 0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76, + 0x9A, 0x92, 0x80, 0x78, 0xE4, 0xDD, 0xD1, 0x38, + 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7, 0xEC, 0x6C, + 0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48, + 0xF2, 0xD0, 0x8B, 0x30, 0x84, 0x54, 0xDF, 0x23, + 0x19, 0x5B, 0x3D, 0x59, 0xF3, 0xAE, 0xA2, 0x82, + 0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B, 0x7C, + 0xA6, 0xEB, 0xA5, 0xBE, 0x16, 0x0C, 0xE3, 0x61, + 0xC0, 0x8C, 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B, + 0xBB, 0x4E, 0x89, 0x6B, 0x53, 0x6A, 0xB4, 0xF1, + 0xE1, 0xE6, 0xBD, 0x45, 0xE2, 0xF4, 0xB6, 0x66, + 0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7, + 0xFB, 0xC3, 0x8E, 0xB5, 0xE9, 0xCF, 0xBF, 0xBA, + 0xEA, 0x77, 0x39, 0xAF, 0x33, 0xC9, 0x62, 0x71, + 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8, + 0xE5, 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7, + 0xA1, 0x1D, 0xAA, 0xED, 0x06, 0x70, 0xB2, 0xD2, + 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27, 0x90, + 0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB, + 0x9E, 0x9C, 0x52, 0x1B, 0x5F, 0x93, 0x0A, 0xEF, + 0x91, 0x85, 0x49, 0xEE, 0x2D, 0x4F, 0x8F, 0x3B, + 0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64, + 0x2A, 0xCE, 0xCB, 0x2F, 0xFC, 0x97, 0x05, 0x7A, + 0xAC, 0x7F, 0xD5, 0x1A, 0x4B, 0x0E, 0xA7, 0x5A, + 0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C, 0x4C, 0x02, + 0xB8, 0xDA, 0xB0, 0x17, 0x55, 0x1F, 0x8A, 0x7D, + 0x57, 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72, + 0x7E, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34, + 0x6E, 0x50, 0xDE, 0x68, 0x65, 0xBC, 0xDB, 0xF8, + 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4, + 0xCA, 0x10, 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00, + 0x6F, 0x9D, 0x36, 0x42, 0x4A, 0x5E, 0xC1, 0xE0 + ); + + /** + * Q-Table + * + * @var Array + * @access private + */ + var $q1 = array ( + 0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8, + 0x4A, 0xD3, 0xE6, 0x6B, 0x45, 0x7D, 0xE8, 0x4B, + 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71, 0xF1, 0xE1, + 0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F, + 0x5E, 0xBA, 0xAE, 0x5B, 0x8A, 0x00, 0xBC, 0x9D, + 0x6D, 0xC1, 0xB1, 0x0E, 0x80, 0x5D, 0xD2, 0xD5, + 0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C, 0xA3, + 0xB2, 0x73, 0x4C, 0x54, 0x92, 0x74, 0x36, 0x51, + 0x38, 0xB0, 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96, + 0x6C, 0x42, 0xF7, 0x10, 0x7C, 0x28, 0x27, 0x8C, + 0x13, 0x95, 0x9C, 0xC7, 0x24, 0x46, 0x3B, 0x70, + 0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8, + 0xA6, 0x83, 0x20, 0xFF, 0x9F, 0x77, 0xC3, 0xCC, + 0x03, 0x6F, 0x08, 0xBF, 0x40, 0xE7, 0x2B, 0xE2, + 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9, + 0xE4, 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17, + 0x66, 0x94, 0xA1, 0x1D, 0x3D, 0xF0, 0xDE, 0xB3, + 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53, 0x3E, + 0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49, + 0x81, 0x88, 0xEE, 0x21, 0xC4, 0x1A, 0xEB, 0xD9, + 0xC5, 0x39, 0x99, 0xCD, 0xAD, 0x31, 0x8B, 0x01, + 0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48, + 0x4F, 0xF2, 0x65, 0x8E, 0x78, 0x5C, 0x58, 0x19, + 0x8D, 0xE5, 0x98, 0x57, 0x67, 0x7F, 0x05, 0x64, + 0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7, 0x3C, 0xA5, + 0xCE, 0xE9, 0x68, 0x44, 0xE0, 0x4D, 0x43, 0x69, + 0x29, 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E, + 0x6E, 0x47, 0xDF, 0x34, 0x35, 0x6A, 0xCF, 0xDC, + 0x22, 0xC9, 0xC0, 0x9B, 0x89, 0xD4, 0xED, 0xAB, + 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9, + 0xD7, 0x61, 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2, + 0x16, 0x25, 0x86, 0x56, 0x55, 0x09, 0xBE, 0x91 + ); + + /** + * M-Table + * + * @var Array + * @access private + */ + var $m0 = array ( + 0xBCBC3275, 0xECEC21F3, 0x202043C6, 0xB3B3C9F4, 0xDADA03DB, 0x02028B7B, 0xE2E22BFB, 0x9E9EFAC8, + 0xC9C9EC4A, 0xD4D409D3, 0x18186BE6, 0x1E1E9F6B, 0x98980E45, 0xB2B2387D, 0xA6A6D2E8, 0x2626B74B, + 0x3C3C57D6, 0x93938A32, 0x8282EED8, 0x525298FD, 0x7B7BD437, 0xBBBB3771, 0x5B5B97F1, 0x474783E1, + 0x24243C30, 0x5151E20F, 0xBABAC6F8, 0x4A4AF31B, 0xBFBF4887, 0x0D0D70FA, 0xB0B0B306, 0x7575DE3F, + 0xD2D2FD5E, 0x7D7D20BA, 0x666631AE, 0x3A3AA35B, 0x59591C8A, 0x00000000, 0xCDCD93BC, 0x1A1AE09D, + 0xAEAE2C6D, 0x7F7FABC1, 0x2B2BC7B1, 0xBEBEB90E, 0xE0E0A080, 0x8A8A105D, 0x3B3B52D2, 0x6464BAD5, + 0xD8D888A0, 0xE7E7A584, 0x5F5FE807, 0x1B1B1114, 0x2C2CC2B5, 0xFCFCB490, 0x3131272C, 0x808065A3, + 0x73732AB2, 0x0C0C8173, 0x79795F4C, 0x6B6B4154, 0x4B4B0292, 0x53536974, 0x94948F36, 0x83831F51, + 0x2A2A3638, 0xC4C49CB0, 0x2222C8BD, 0xD5D5F85A, 0xBDBDC3FC, 0x48487860, 0xFFFFCE62, 0x4C4C0796, + 0x4141776C, 0xC7C7E642, 0xEBEB24F7, 0x1C1C1410, 0x5D5D637C, 0x36362228, 0x6767C027, 0xE9E9AF8C, + 0x4444F913, 0x1414EA95, 0xF5F5BB9C, 0xCFCF18C7, 0x3F3F2D24, 0xC0C0E346, 0x7272DB3B, 0x54546C70, + 0x29294CCA, 0xF0F035E3, 0x0808FE85, 0xC6C617CB, 0xF3F34F11, 0x8C8CE4D0, 0xA4A45993, 0xCACA96B8, + 0x68683BA6, 0xB8B84D83, 0x38382820, 0xE5E52EFF, 0xADAD569F, 0x0B0B8477, 0xC8C81DC3, 0x9999FFCC, + 0x5858ED03, 0x19199A6F, 0x0E0E0A08, 0x95957EBF, 0x70705040, 0xF7F730E7, 0x6E6ECF2B, 0x1F1F6EE2, + 0xB5B53D79, 0x09090F0C, 0x616134AA, 0x57571682, 0x9F9F0B41, 0x9D9D803A, 0x111164EA, 0x2525CDB9, + 0xAFAFDDE4, 0x4545089A, 0xDFDF8DA4, 0xA3A35C97, 0xEAEAD57E, 0x353558DA, 0xEDEDD07A, 0x4343FC17, + 0xF8F8CB66, 0xFBFBB194, 0x3737D3A1, 0xFAFA401D, 0xC2C2683D, 0xB4B4CCF0, 0x32325DDE, 0x9C9C71B3, + 0x5656E70B, 0xE3E3DA72, 0x878760A7, 0x15151B1C, 0xF9F93AEF, 0x6363BFD1, 0x3434A953, 0x9A9A853E, + 0xB1B1428F, 0x7C7CD133, 0x88889B26, 0x3D3DA65F, 0xA1A1D7EC, 0xE4E4DF76, 0x8181942A, 0x91910149, + 0x0F0FFB81, 0xEEEEAA88, 0x161661EE, 0xD7D77321, 0x9797F5C4, 0xA5A5A81A, 0xFEFE3FEB, 0x6D6DB5D9, + 0x7878AEC5, 0xC5C56D39, 0x1D1DE599, 0x7676A4CD, 0x3E3EDCAD, 0xCBCB6731, 0xB6B6478B, 0xEFEF5B01, + 0x12121E18, 0x6060C523, 0x6A6AB0DD, 0x4D4DF61F, 0xCECEE94E, 0xDEDE7C2D, 0x55559DF9, 0x7E7E5A48, + 0x2121B24F, 0x03037AF2, 0xA0A02665, 0x5E5E198E, 0x5A5A6678, 0x65654B5C, 0x62624E58, 0xFDFD4519, + 0x0606F48D, 0x404086E5, 0xF2F2BE98, 0x3333AC57, 0x17179067, 0x05058E7F, 0xE8E85E05, 0x4F4F7D64, + 0x89896AAF, 0x10109563, 0x74742FB6, 0x0A0A75FE, 0x5C5C92F5, 0x9B9B74B7, 0x2D2D333C, 0x3030D6A5, + 0x2E2E49CE, 0x494989E9, 0x46467268, 0x77775544, 0xA8A8D8E0, 0x9696044D, 0x2828BD43, 0xA9A92969, + 0xD9D97929, 0x8686912E, 0xD1D187AC, 0xF4F44A15, 0x8D8D1559, 0xD6D682A8, 0xB9B9BC0A, 0x42420D9E, + 0xF6F6C16E, 0x2F2FB847, 0xDDDD06DF, 0x23233934, 0xCCCC6235, 0xF1F1C46A, 0xC1C112CF, 0x8585EBDC, + 0x8F8F9E22, 0x7171A1C9, 0x9090F0C0, 0xAAAA539B, 0x0101F189, 0x8B8BE1D4, 0x4E4E8CED, 0x8E8E6FAB, + 0xABABA212, 0x6F6F3EA2, 0xE6E6540D, 0xDBDBF252, 0x92927BBB, 0xB7B7B602, 0x6969CA2F, 0x3939D9A9, + 0xD3D30CD7, 0xA7A72361, 0xA2A2AD1E, 0xC3C399B4, 0x6C6C4450, 0x07070504, 0x04047FF6, 0x272746C2, + 0xACACA716, 0xD0D07625, 0x50501386, 0xDCDCF756, 0x84841A55, 0xE1E15109, 0x7A7A25BE, 0x1313EF91 + ); + + /** + * M-Table + * + * @var Array + * @access private + */ + var $m1 = array ( + 0xA9D93939, 0x67901717, 0xB3719C9C, 0xE8D2A6A6, 0x04050707, 0xFD985252, 0xA3658080, 0x76DFE4E4, + 0x9A084545, 0x92024B4B, 0x80A0E0E0, 0x78665A5A, 0xE4DDAFAF, 0xDDB06A6A, 0xD1BF6363, 0x38362A2A, + 0x0D54E6E6, 0xC6432020, 0x3562CCCC, 0x98BEF2F2, 0x181E1212, 0xF724EBEB, 0xECD7A1A1, 0x6C774141, + 0x43BD2828, 0x7532BCBC, 0x37D47B7B, 0x269B8888, 0xFA700D0D, 0x13F94444, 0x94B1FBFB, 0x485A7E7E, + 0xF27A0303, 0xD0E48C8C, 0x8B47B6B6, 0x303C2424, 0x84A5E7E7, 0x54416B6B, 0xDF06DDDD, 0x23C56060, + 0x1945FDFD, 0x5BA33A3A, 0x3D68C2C2, 0x59158D8D, 0xF321ECEC, 0xAE316666, 0xA23E6F6F, 0x82165757, + 0x63951010, 0x015BEFEF, 0x834DB8B8, 0x2E918686, 0xD9B56D6D, 0x511F8383, 0x9B53AAAA, 0x7C635D5D, + 0xA63B6868, 0xEB3FFEFE, 0xA5D63030, 0xBE257A7A, 0x16A7ACAC, 0x0C0F0909, 0xE335F0F0, 0x6123A7A7, + 0xC0F09090, 0x8CAFE9E9, 0x3A809D9D, 0xF5925C5C, 0x73810C0C, 0x2C273131, 0x2576D0D0, 0x0BE75656, + 0xBB7B9292, 0x4EE9CECE, 0x89F10101, 0x6B9F1E1E, 0x53A93434, 0x6AC4F1F1, 0xB499C3C3, 0xF1975B5B, + 0xE1834747, 0xE66B1818, 0xBDC82222, 0x450E9898, 0xE26E1F1F, 0xF4C9B3B3, 0xB62F7474, 0x66CBF8F8, + 0xCCFF9999, 0x95EA1414, 0x03ED5858, 0x56F7DCDC, 0xD4E18B8B, 0x1C1B1515, 0x1EADA2A2, 0xD70CD3D3, + 0xFB2BE2E2, 0xC31DC8C8, 0x8E195E5E, 0xB5C22C2C, 0xE9894949, 0xCF12C1C1, 0xBF7E9595, 0xBA207D7D, + 0xEA641111, 0x77840B0B, 0x396DC5C5, 0xAF6A8989, 0x33D17C7C, 0xC9A17171, 0x62CEFFFF, 0x7137BBBB, + 0x81FB0F0F, 0x793DB5B5, 0x0951E1E1, 0xADDC3E3E, 0x242D3F3F, 0xCDA47676, 0xF99D5555, 0xD8EE8282, + 0xE5864040, 0xC5AE7878, 0xB9CD2525, 0x4D049696, 0x44557777, 0x080A0E0E, 0x86135050, 0xE730F7F7, + 0xA1D33737, 0x1D40FAFA, 0xAA346161, 0xED8C4E4E, 0x06B3B0B0, 0x706C5454, 0xB22A7373, 0xD2523B3B, + 0x410B9F9F, 0x7B8B0202, 0xA088D8D8, 0x114FF3F3, 0x3167CBCB, 0xC2462727, 0x27C06767, 0x90B4FCFC, + 0x20283838, 0xF67F0404, 0x60784848, 0xFF2EE5E5, 0x96074C4C, 0x5C4B6565, 0xB1C72B2B, 0xAB6F8E8E, + 0x9E0D4242, 0x9CBBF5F5, 0x52F2DBDB, 0x1BF34A4A, 0x5FA63D3D, 0x9359A4A4, 0x0ABCB9B9, 0xEF3AF9F9, + 0x91EF1313, 0x85FE0808, 0x49019191, 0xEE611616, 0x2D7CDEDE, 0x4FB22121, 0x8F42B1B1, 0x3BDB7272, + 0x47B82F2F, 0x8748BFBF, 0x6D2CAEAE, 0x46E3C0C0, 0xD6573C3C, 0x3E859A9A, 0x6929A9A9, 0x647D4F4F, + 0x2A948181, 0xCE492E2E, 0xCB17C6C6, 0x2FCA6969, 0xFCC3BDBD, 0x975CA3A3, 0x055EE8E8, 0x7AD0EDED, + 0xAC87D1D1, 0x7F8E0505, 0xD5BA6464, 0x1AA8A5A5, 0x4BB72626, 0x0EB9BEBE, 0xA7608787, 0x5AF8D5D5, + 0x28223636, 0x14111B1B, 0x3FDE7575, 0x2979D9D9, 0x88AAEEEE, 0x3C332D2D, 0x4C5F7979, 0x02B6B7B7, + 0xB896CACA, 0xDA583535, 0xB09CC4C4, 0x17FC4343, 0x551A8484, 0x1FF64D4D, 0x8A1C5959, 0x7D38B2B2, + 0x57AC3333, 0xC718CFCF, 0x8DF40606, 0x74695353, 0xB7749B9B, 0xC4F59797, 0x9F56ADAD, 0x72DAE3E3, + 0x7ED5EAEA, 0x154AF4F4, 0x229E8F8F, 0x12A2ABAB, 0x584E6262, 0x07E85F5F, 0x99E51D1D, 0x34392323, + 0x6EC1F6F6, 0x50446C6C, 0xDE5D3232, 0x68724646, 0x6526A0A0, 0xBC93CDCD, 0xDB03DADA, 0xF8C6BABA, + 0xC8FA9E9E, 0xA882D6D6, 0x2BCF6E6E, 0x40507070, 0xDCEB8585, 0xFE750A0A, 0x328A9393, 0xA48DDFDF, + 0xCA4C2929, 0x10141C1C, 0x2173D7D7, 0xF0CCB4B4, 0xD309D4D4, 0x5D108A8A, 0x0FE25151, 0x00000000, + 0x6F9A1919, 0x9DE01A1A, 0x368F9494, 0x42E6C7C7, 0x4AECC9C9, 0x5EFDD2D2, 0xC1AB7F7F, 0xE0D8A8A8 + ); + + /** + * M-Table + * + * @var Array + * @access private + */ + var $m2 = array ( + 0xBC75BC32, 0xECF3EC21, 0x20C62043, 0xB3F4B3C9, 0xDADBDA03, 0x027B028B, 0xE2FBE22B, 0x9EC89EFA, + 0xC94AC9EC, 0xD4D3D409, 0x18E6186B, 0x1E6B1E9F, 0x9845980E, 0xB27DB238, 0xA6E8A6D2, 0x264B26B7, + 0x3CD63C57, 0x9332938A, 0x82D882EE, 0x52FD5298, 0x7B377BD4, 0xBB71BB37, 0x5BF15B97, 0x47E14783, + 0x2430243C, 0x510F51E2, 0xBAF8BAC6, 0x4A1B4AF3, 0xBF87BF48, 0x0DFA0D70, 0xB006B0B3, 0x753F75DE, + 0xD25ED2FD, 0x7DBA7D20, 0x66AE6631, 0x3A5B3AA3, 0x598A591C, 0x00000000, 0xCDBCCD93, 0x1A9D1AE0, + 0xAE6DAE2C, 0x7FC17FAB, 0x2BB12BC7, 0xBE0EBEB9, 0xE080E0A0, 0x8A5D8A10, 0x3BD23B52, 0x64D564BA, + 0xD8A0D888, 0xE784E7A5, 0x5F075FE8, 0x1B141B11, 0x2CB52CC2, 0xFC90FCB4, 0x312C3127, 0x80A38065, + 0x73B2732A, 0x0C730C81, 0x794C795F, 0x6B546B41, 0x4B924B02, 0x53745369, 0x9436948F, 0x8351831F, + 0x2A382A36, 0xC4B0C49C, 0x22BD22C8, 0xD55AD5F8, 0xBDFCBDC3, 0x48604878, 0xFF62FFCE, 0x4C964C07, + 0x416C4177, 0xC742C7E6, 0xEBF7EB24, 0x1C101C14, 0x5D7C5D63, 0x36283622, 0x672767C0, 0xE98CE9AF, + 0x441344F9, 0x149514EA, 0xF59CF5BB, 0xCFC7CF18, 0x3F243F2D, 0xC046C0E3, 0x723B72DB, 0x5470546C, + 0x29CA294C, 0xF0E3F035, 0x088508FE, 0xC6CBC617, 0xF311F34F, 0x8CD08CE4, 0xA493A459, 0xCAB8CA96, + 0x68A6683B, 0xB883B84D, 0x38203828, 0xE5FFE52E, 0xAD9FAD56, 0x0B770B84, 0xC8C3C81D, 0x99CC99FF, + 0x580358ED, 0x196F199A, 0x0E080E0A, 0x95BF957E, 0x70407050, 0xF7E7F730, 0x6E2B6ECF, 0x1FE21F6E, + 0xB579B53D, 0x090C090F, 0x61AA6134, 0x57825716, 0x9F419F0B, 0x9D3A9D80, 0x11EA1164, 0x25B925CD, + 0xAFE4AFDD, 0x459A4508, 0xDFA4DF8D, 0xA397A35C, 0xEA7EEAD5, 0x35DA3558, 0xED7AEDD0, 0x431743FC, + 0xF866F8CB, 0xFB94FBB1, 0x37A137D3, 0xFA1DFA40, 0xC23DC268, 0xB4F0B4CC, 0x32DE325D, 0x9CB39C71, + 0x560B56E7, 0xE372E3DA, 0x87A78760, 0x151C151B, 0xF9EFF93A, 0x63D163BF, 0x345334A9, 0x9A3E9A85, + 0xB18FB142, 0x7C337CD1, 0x8826889B, 0x3D5F3DA6, 0xA1ECA1D7, 0xE476E4DF, 0x812A8194, 0x91499101, + 0x0F810FFB, 0xEE88EEAA, 0x16EE1661, 0xD721D773, 0x97C497F5, 0xA51AA5A8, 0xFEEBFE3F, 0x6DD96DB5, + 0x78C578AE, 0xC539C56D, 0x1D991DE5, 0x76CD76A4, 0x3EAD3EDC, 0xCB31CB67, 0xB68BB647, 0xEF01EF5B, + 0x1218121E, 0x602360C5, 0x6ADD6AB0, 0x4D1F4DF6, 0xCE4ECEE9, 0xDE2DDE7C, 0x55F9559D, 0x7E487E5A, + 0x214F21B2, 0x03F2037A, 0xA065A026, 0x5E8E5E19, 0x5A785A66, 0x655C654B, 0x6258624E, 0xFD19FD45, + 0x068D06F4, 0x40E54086, 0xF298F2BE, 0x335733AC, 0x17671790, 0x057F058E, 0xE805E85E, 0x4F644F7D, + 0x89AF896A, 0x10631095, 0x74B6742F, 0x0AFE0A75, 0x5CF55C92, 0x9BB79B74, 0x2D3C2D33, 0x30A530D6, + 0x2ECE2E49, 0x49E94989, 0x46684672, 0x77447755, 0xA8E0A8D8, 0x964D9604, 0x284328BD, 0xA969A929, + 0xD929D979, 0x862E8691, 0xD1ACD187, 0xF415F44A, 0x8D598D15, 0xD6A8D682, 0xB90AB9BC, 0x429E420D, + 0xF66EF6C1, 0x2F472FB8, 0xDDDFDD06, 0x23342339, 0xCC35CC62, 0xF16AF1C4, 0xC1CFC112, 0x85DC85EB, + 0x8F228F9E, 0x71C971A1, 0x90C090F0, 0xAA9BAA53, 0x018901F1, 0x8BD48BE1, 0x4EED4E8C, 0x8EAB8E6F, + 0xAB12ABA2, 0x6FA26F3E, 0xE60DE654, 0xDB52DBF2, 0x92BB927B, 0xB702B7B6, 0x692F69CA, 0x39A939D9, + 0xD3D7D30C, 0xA761A723, 0xA21EA2AD, 0xC3B4C399, 0x6C506C44, 0x07040705, 0x04F6047F, 0x27C22746, + 0xAC16ACA7, 0xD025D076, 0x50865013, 0xDC56DCF7, 0x8455841A, 0xE109E151, 0x7ABE7A25, 0x139113EF + ); + + /** + * M-Table + * + * @var Array + * @access private + */ + var $m3 = array ( + 0xD939A9D9, 0x90176790, 0x719CB371, 0xD2A6E8D2, 0x05070405, 0x9852FD98, 0x6580A365, 0xDFE476DF, + 0x08459A08, 0x024B9202, 0xA0E080A0, 0x665A7866, 0xDDAFE4DD, 0xB06ADDB0, 0xBF63D1BF, 0x362A3836, + 0x54E60D54, 0x4320C643, 0x62CC3562, 0xBEF298BE, 0x1E12181E, 0x24EBF724, 0xD7A1ECD7, 0x77416C77, + 0xBD2843BD, 0x32BC7532, 0xD47B37D4, 0x9B88269B, 0x700DFA70, 0xF94413F9, 0xB1FB94B1, 0x5A7E485A, + 0x7A03F27A, 0xE48CD0E4, 0x47B68B47, 0x3C24303C, 0xA5E784A5, 0x416B5441, 0x06DDDF06, 0xC56023C5, + 0x45FD1945, 0xA33A5BA3, 0x68C23D68, 0x158D5915, 0x21ECF321, 0x3166AE31, 0x3E6FA23E, 0x16578216, + 0x95106395, 0x5BEF015B, 0x4DB8834D, 0x91862E91, 0xB56DD9B5, 0x1F83511F, 0x53AA9B53, 0x635D7C63, + 0x3B68A63B, 0x3FFEEB3F, 0xD630A5D6, 0x257ABE25, 0xA7AC16A7, 0x0F090C0F, 0x35F0E335, 0x23A76123, + 0xF090C0F0, 0xAFE98CAF, 0x809D3A80, 0x925CF592, 0x810C7381, 0x27312C27, 0x76D02576, 0xE7560BE7, + 0x7B92BB7B, 0xE9CE4EE9, 0xF10189F1, 0x9F1E6B9F, 0xA93453A9, 0xC4F16AC4, 0x99C3B499, 0x975BF197, + 0x8347E183, 0x6B18E66B, 0xC822BDC8, 0x0E98450E, 0x6E1FE26E, 0xC9B3F4C9, 0x2F74B62F, 0xCBF866CB, + 0xFF99CCFF, 0xEA1495EA, 0xED5803ED, 0xF7DC56F7, 0xE18BD4E1, 0x1B151C1B, 0xADA21EAD, 0x0CD3D70C, + 0x2BE2FB2B, 0x1DC8C31D, 0x195E8E19, 0xC22CB5C2, 0x8949E989, 0x12C1CF12, 0x7E95BF7E, 0x207DBA20, + 0x6411EA64, 0x840B7784, 0x6DC5396D, 0x6A89AF6A, 0xD17C33D1, 0xA171C9A1, 0xCEFF62CE, 0x37BB7137, + 0xFB0F81FB, 0x3DB5793D, 0x51E10951, 0xDC3EADDC, 0x2D3F242D, 0xA476CDA4, 0x9D55F99D, 0xEE82D8EE, + 0x8640E586, 0xAE78C5AE, 0xCD25B9CD, 0x04964D04, 0x55774455, 0x0A0E080A, 0x13508613, 0x30F7E730, + 0xD337A1D3, 0x40FA1D40, 0x3461AA34, 0x8C4EED8C, 0xB3B006B3, 0x6C54706C, 0x2A73B22A, 0x523BD252, + 0x0B9F410B, 0x8B027B8B, 0x88D8A088, 0x4FF3114F, 0x67CB3167, 0x4627C246, 0xC06727C0, 0xB4FC90B4, + 0x28382028, 0x7F04F67F, 0x78486078, 0x2EE5FF2E, 0x074C9607, 0x4B655C4B, 0xC72BB1C7, 0x6F8EAB6F, + 0x0D429E0D, 0xBBF59CBB, 0xF2DB52F2, 0xF34A1BF3, 0xA63D5FA6, 0x59A49359, 0xBCB90ABC, 0x3AF9EF3A, + 0xEF1391EF, 0xFE0885FE, 0x01914901, 0x6116EE61, 0x7CDE2D7C, 0xB2214FB2, 0x42B18F42, 0xDB723BDB, + 0xB82F47B8, 0x48BF8748, 0x2CAE6D2C, 0xE3C046E3, 0x573CD657, 0x859A3E85, 0x29A96929, 0x7D4F647D, + 0x94812A94, 0x492ECE49, 0x17C6CB17, 0xCA692FCA, 0xC3BDFCC3, 0x5CA3975C, 0x5EE8055E, 0xD0ED7AD0, + 0x87D1AC87, 0x8E057F8E, 0xBA64D5BA, 0xA8A51AA8, 0xB7264BB7, 0xB9BE0EB9, 0x6087A760, 0xF8D55AF8, + 0x22362822, 0x111B1411, 0xDE753FDE, 0x79D92979, 0xAAEE88AA, 0x332D3C33, 0x5F794C5F, 0xB6B702B6, + 0x96CAB896, 0x5835DA58, 0x9CC4B09C, 0xFC4317FC, 0x1A84551A, 0xF64D1FF6, 0x1C598A1C, 0x38B27D38, + 0xAC3357AC, 0x18CFC718, 0xF4068DF4, 0x69537469, 0x749BB774, 0xF597C4F5, 0x56AD9F56, 0xDAE372DA, + 0xD5EA7ED5, 0x4AF4154A, 0x9E8F229E, 0xA2AB12A2, 0x4E62584E, 0xE85F07E8, 0xE51D99E5, 0x39233439, + 0xC1F66EC1, 0x446C5044, 0x5D32DE5D, 0x72466872, 0x26A06526, 0x93CDBC93, 0x03DADB03, 0xC6BAF8C6, + 0xFA9EC8FA, 0x82D6A882, 0xCF6E2BCF, 0x50704050, 0xEB85DCEB, 0x750AFE75, 0x8A93328A, 0x8DDFA48D, + 0x4C29CA4C, 0x141C1014, 0x73D72173, 0xCCB4F0CC, 0x09D4D309, 0x108A5D10, 0xE2510FE2, 0x00000000, + 0x9A196F9A, 0xE01A9DE0, 0x8F94368F, 0xE6C742E6, 0xECC94AEC, 0xFDD25EFD, 0xAB7FC1AB, 0xD8A8E0D8 + ); + + /** + * The Key Schedule Array + * + * @var Array + * @access private + */ + var $K = array(); + + /** + * The Key depended S-Table 0 + * + * @var Array + * @access private + */ + var $S0 = array(); + + /** + * The Key depended S-Table 1 + * + * @var Array + * @access private + */ + var $S1 = array(); + + /** + * The Key depended S-Table 2 + * + * @var Array + * @access private + */ + var $S2 = array(); + + /** + * The Key depended S-Table 3 + * + * @var Array + * @access private + */ + var $S3 = array(); + + /** + * Holds the last used key + * + * @var Array + * @access private + */ + var $kl; + + /** + * Sets the key. + * + * Keys can be of any length. Twofish, itself, requires the use of a key that's 128, 192 or 256-bits long. + * If the key is less than 256-bits we round the length up to the closest valid key length, + * padding $key with null bytes. If the key is more than 256-bits, we trim the excess bits. + * + * If the key is not explicitly set, it'll be assumed a 128 bits key to be all null bytes. + * + * @access public + * @see Crypt_Base::setKey() + * @param String $key + */ + function setKey($key) + { + $keylength = strlen($key); + switch (true) { + case $keylength <= 16: + $key = str_pad($key, 16, "\0"); + break; + case $keylength <= 24: + $key = str_pad($key, 24, "\0"); + break; + case $keylength < 32: + $key = str_pad($key, 32, "\0"); + break; + case $keylength > 32: + $key = substr($key, 0, 32); + } + parent::setKey($key); + } + + /** + * Setup the key (expansion) + * + * @see Crypt_Base::_setupKey() + * @access private + */ + function _setupKey() + { + if (isset($this->kl['key']) && $this->key === $this->kl['key']) { + // already expanded + return; + } + $this->kl = array('key' => $this->key); + + /* Key expanding and generating the key-depended s-boxes */ + $le_longs = unpack('V*', $this->key); + $key = unpack('C*', $this->key); + $m0 = $this->m0; + $m1 = $this->m1; + $m2 = $this->m2; + $m3 = $this->m3; + $q0 = $this->q0; + $q1 = $this->q1; + + $K = $S0 = $S1 = $S2 = $S3 = array(); + + switch (strlen($this->key)) { + case 16: + list ($s7, $s6, $s5, $s4) = $this->_mdsrem($le_longs[1], $le_longs[2]); + list ($s3, $s2, $s1, $s0) = $this->_mdsrem($le_longs[3], $le_longs[4]); + for ($i = 0, $j = 1; $i < 40; $i+= 2,$j+= 2) { + $A = $m0[$q0[$q0[$i] ^ $key[ 9]] ^ $key[1]] ^ + $m1[$q0[$q1[$i] ^ $key[10]] ^ $key[2]] ^ + $m2[$q1[$q0[$i] ^ $key[11]] ^ $key[3]] ^ + $m3[$q1[$q1[$i] ^ $key[12]] ^ $key[4]]; + $B = $m0[$q0[$q0[$j] ^ $key[13]] ^ $key[5]] ^ + $m1[$q0[$q1[$j] ^ $key[14]] ^ $key[6]] ^ + $m2[$q1[$q0[$j] ^ $key[15]] ^ $key[7]] ^ + $m3[$q1[$q1[$j] ^ $key[16]] ^ $key[8]]; + $B = ($B << 8) | ($B >> 24 & 0xff); + $K[] = $A+= $B; + $K[] = (($A+= $B) << 9 | $A >> 23 & 0x1ff); + } + for ($i = 0; $i < 256; ++$i) { + $S0[$i] = $m0[$q0[$q0[$i] ^ $s4] ^ $s0]; + $S1[$i] = $m1[$q0[$q1[$i] ^ $s5] ^ $s1]; + $S2[$i] = $m2[$q1[$q0[$i] ^ $s6] ^ $s2]; + $S3[$i] = $m3[$q1[$q1[$i] ^ $s7] ^ $s3]; + } + break; + case 24: + list ($sb, $sa, $s9, $s8) = $this->_mdsrem($le_longs[1], $le_longs[2]); + list ($s7, $s6, $s5, $s4) = $this->_mdsrem($le_longs[3], $le_longs[4]); + list ($s3, $s2, $s1, $s0) = $this->_mdsrem($le_longs[5], $le_longs[6]); + for ($i = 0, $j = 1; $i < 40; $i+= 2, $j+= 2) { + $A = $m0[$q0[$q0[$q1[$i] ^ $key[17]] ^ $key[ 9]] ^ $key[1]] ^ + $m1[$q0[$q1[$q1[$i] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^ + $m2[$q1[$q0[$q0[$i] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^ + $m3[$q1[$q1[$q0[$i] ^ $key[20]] ^ $key[12]] ^ $key[4]]; + $B = $m0[$q0[$q0[$q1[$j] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^ + $m1[$q0[$q1[$q1[$j] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^ + $m2[$q1[$q0[$q0[$j] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^ + $m3[$q1[$q1[$q0[$j] ^ $key[24]] ^ $key[16]] ^ $key[8]]; + $B = ($B << 8) | ($B >> 24 & 0xff); + $K[] = $A+= $B; + $K[] = (($A+= $B) << 9 | $A >> 23 & 0x1ff); + } + for ($i = 0; $i < 256; ++$i) { + $S0[$i] = $m0[$q0[$q0[$q1[$i] ^ $s8] ^ $s4] ^ $s0]; + $S1[$i] = $m1[$q0[$q1[$q1[$i] ^ $s9] ^ $s5] ^ $s1]; + $S2[$i] = $m2[$q1[$q0[$q0[$i] ^ $sa] ^ $s6] ^ $s2]; + $S3[$i] = $m3[$q1[$q1[$q0[$i] ^ $sb] ^ $s7] ^ $s3]; + } + break; + default: // 32 + list ($sf, $se, $sd, $sc) = $this->_mdsrem($le_longs[1], $le_longs[2]); + list ($sb, $sa, $s9, $s8) = $this->_mdsrem($le_longs[3], $le_longs[4]); + list ($s7, $s6, $s5, $s4) = $this->_mdsrem($le_longs[5], $le_longs[6]); + list ($s3, $s2, $s1, $s0) = $this->_mdsrem($le_longs[7], $le_longs[8]); + for ($i = 0, $j = 1; $i < 40; $i+= 2, $j+= 2) { + $A = $m0[$q0[$q0[$q1[$q1[$i] ^ $key[25]] ^ $key[17]] ^ $key[ 9]] ^ $key[1]] ^ + $m1[$q0[$q1[$q1[$q0[$i] ^ $key[26]] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^ + $m2[$q1[$q0[$q0[$q0[$i] ^ $key[27]] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^ + $m3[$q1[$q1[$q0[$q1[$i] ^ $key[28]] ^ $key[20]] ^ $key[12]] ^ $key[4]]; + $B = $m0[$q0[$q0[$q1[$q1[$j] ^ $key[29]] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^ + $m1[$q0[$q1[$q1[$q0[$j] ^ $key[30]] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^ + $m2[$q1[$q0[$q0[$q0[$j] ^ $key[31]] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^ + $m3[$q1[$q1[$q0[$q1[$j] ^ $key[32]] ^ $key[24]] ^ $key[16]] ^ $key[8]]; + $B = ($B << 8) | ($B >> 24 & 0xff); + $K[] = $A+= $B; + $K[] = (($A+= $B) << 9 | $A >> 23 & 0x1ff); + } + for ($i = 0; $i < 256; ++$i) { + $S0[$i] = $m0[$q0[$q0[$q1[$q1[$i] ^ $sc] ^ $s8] ^ $s4] ^ $s0]; + $S1[$i] = $m1[$q0[$q1[$q1[$q0[$i] ^ $sd] ^ $s9] ^ $s5] ^ $s1]; + $S2[$i] = $m2[$q1[$q0[$q0[$q0[$i] ^ $se] ^ $sa] ^ $s6] ^ $s2]; + $S3[$i] = $m3[$q1[$q1[$q0[$q1[$i] ^ $sf] ^ $sb] ^ $s7] ^ $s3]; + } + } + + $this->K = $K; + $this->S0 = $S0; + $this->S1 = $S1; + $this->S2 = $S2; + $this->S3 = $S3; + } + + /** + * _mdsrem function using by the twofish cipher algorithm + * + * @access private + * @param String $A + * @param String $B + * @return Array + */ + function _mdsrem($A, $B) + { + // No gain by unrolling this loop. + for ($i = 0; $i < 8; ++$i) { + // Get most significant coefficient. + $t = 0xff & ($B >> 24); + + // Shift the others up. + $B = ($B << 8) | (0xff & ($A >> 24)); + $A<<= 8; + + $u = $t << 1; + + // Subtract the modular polynomial on overflow. + if ($t & 0x80) { + $u^= 0x14d; + } + + // Remove t * (a * x^2 + 1). + $B ^= $t ^ ($u << 16); + + // Form u = a*t + t/a = t*(a + 1/a). + $u^= 0x7fffffff & ($t >> 1); + + // Add the modular polynomial on underflow. + if ($t & 0x01) $u^= 0xa6 ; + + // Remove t * (a + 1/a) * (x^3 + x). + $B^= ($u << 24) | ($u << 8); + } + + return array( + 0xff & $B >> 24, + 0xff & $B >> 16, + 0xff & $B >> 8, + 0xff & $B); + } + + /** + * Encrypts a block + * + * @access private + * @param String $in + * @return String + */ + function _encryptBlock($in) + { + $S0 = $this->S0; + $S1 = $this->S1; + $S2 = $this->S2; + $S3 = $this->S3; + $K = $this->K; + + $in = unpack("V4", $in); + $R0 = $K[0] ^ $in[1]; + $R1 = $K[1] ^ $in[2]; + $R2 = $K[2] ^ $in[3]; + $R3 = $K[3] ^ $in[4]; + + $ki = 7; + while ($ki < 39) { + $t0 = $S0[ $R0 & 0xff] ^ + $S1[($R0 >> 8) & 0xff] ^ + $S2[($R0 >> 16) & 0xff] ^ + $S3[($R0 >> 24) & 0xff]; + $t1 = $S0[($R1 >> 24) & 0xff] ^ + $S1[ $R1 & 0xff] ^ + $S2[($R1 >> 8) & 0xff] ^ + $S3[($R1 >> 16) & 0xff]; + $R2^= $t0 + $t1 + $K[++$ki]; + $R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31); + $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ ($t0 + ($t1 << 1) + $K[++$ki]); + + $t0 = $S0[ $R2 & 0xff] ^ + $S1[($R2 >> 8) & 0xff] ^ + $S2[($R2 >> 16) & 0xff] ^ + $S3[($R2 >> 24) & 0xff]; + $t1 = $S0[($R3 >> 24) & 0xff] ^ + $S1[ $R3 & 0xff] ^ + $S2[($R3 >> 8) & 0xff] ^ + $S3[($R3 >> 16) & 0xff]; + $R0^= ($t0 + $t1 + $K[++$ki]); + $R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31); + $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ ($t0 + ($t1 << 1) + $K[++$ki]); + } + + // @codingStandardsIgnoreStart + return pack("V4", $K[4] ^ $R2, + $K[5] ^ $R3, + $K[6] ^ $R0, + $K[7] ^ $R1); + // @codingStandardsIgnoreEnd + } + + /** + * Decrypts a block + * + * @access private + * @param String $in + * @return String + */ + function _decryptBlock($in) + { + $S0 = $this->S0; + $S1 = $this->S1; + $S2 = $this->S2; + $S3 = $this->S3; + $K = $this->K; + + $in = unpack("V4", $in); + $R0 = $K[4] ^ $in[1]; + $R1 = $K[5] ^ $in[2]; + $R2 = $K[6] ^ $in[3]; + $R3 = $K[7] ^ $in[4]; + + $ki = 40; + while ($ki > 8) { + $t0 = $S0[$R0 & 0xff] ^ + $S1[$R0 >> 8 & 0xff] ^ + $S2[$R0 >> 16 & 0xff] ^ + $S3[$R0 >> 24 & 0xff]; + $t1 = $S0[$R1 >> 24 & 0xff] ^ + $S1[$R1 & 0xff] ^ + $S2[$R1 >> 8 & 0xff] ^ + $S3[$R1 >> 16 & 0xff]; + $R3^= $t0 + ($t1 << 1) + $K[--$ki]; + $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31; + $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ ($t0 + $t1 + $K[--$ki]); + + $t0 = $S0[$R2 & 0xff] ^ + $S1[$R2 >> 8 & 0xff] ^ + $S2[$R2 >> 16 & 0xff] ^ + $S3[$R2 >> 24 & 0xff]; + $t1 = $S0[$R3 >> 24 & 0xff] ^ + $S1[$R3 & 0xff] ^ + $S2[$R3 >> 8 & 0xff] ^ + $S3[$R3 >> 16 & 0xff]; + $R1^= $t0 + ($t1 << 1) + $K[--$ki]; + $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31; + $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ ($t0 + $t1 + $K[--$ki]); + } + + // @codingStandardsIgnoreStart + return pack("V4", $K[0] ^ $R2, + $K[1] ^ $R3, + $K[2] ^ $R0, + $K[3] ^ $R1); + // @codingStandardsIgnoreEnd + } + + /** + * Setup the performance-optimized function for de/encrypt() + * + * @see Crypt_Base::_setupInlineCrypt() + * @access private + */ + function _setupInlineCrypt() + { + $lambda_functions =& Crypt_Twofish::_getLambdaFunctions(); + + // Max. 10 Ultra-Hi-optimized inline-crypt functions. After that, we'll (still) create very fast code, but not the ultimate fast one. + $gen_hi_opt_code = (bool)( count($lambda_functions) < 10 ); + + switch (true) { + case $gen_hi_opt_code: + $code_hash = md5(str_pad("Crypt_Twofish, {$this->mode}, ", 32, "\0") . $this->key); + break; + default: + $code_hash = "Crypt_Twofish, {$this->mode}"; + } + + if (!isset($lambda_functions[$code_hash])) { + switch (true) { + case $gen_hi_opt_code: + $K = $this->K; + + $init_crypt = ' + static $S0, $S1, $S2, $S3; + if (!$S0) { + for ($i = 0; $i < 256; ++$i) { + $S0[] = (int)$self->S0[$i]; + $S1[] = (int)$self->S1[$i]; + $S2[] = (int)$self->S2[$i]; + $S3[] = (int)$self->S3[$i]; + } + } + '; + break; + default: + $K = array(); + for ($i = 0; $i < 40; ++$i) { + $K[] = '$K_' . $i; + } + + $init_crypt = ' + $S0 = $self->S0; + $S1 = $self->S1; + $S2 = $self->S2; + $S3 = $self->S3; + list(' . implode(',', $K) . ') = $self->K; + '; + } + + // Generating encrypt code: + $encrypt_block = ' + $in = unpack("V4", $in); + $R0 = '.$K[0].' ^ $in[1]; + $R1 = '.$K[1].' ^ $in[2]; + $R2 = '.$K[2].' ^ $in[3]; + $R3 = '.$K[3].' ^ $in[4]; + '; + for ($ki = 7, $i = 0; $i < 8; ++$i) { + $encrypt_block.= ' + $t0 = $S0[ $R0 & 0xff] ^ + $S1[($R0 >> 8) & 0xff] ^ + $S2[($R0 >> 16) & 0xff] ^ + $S3[($R0 >> 24) & 0xff]; + $t1 = $S0[($R1 >> 24) & 0xff] ^ + $S1[ $R1 & 0xff] ^ + $S2[($R1 >> 8) & 0xff] ^ + $S3[($R1 >> 16) & 0xff]; + $R2^= ($t0 + $t1 + '.$K[++$ki].'); + $R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31); + $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ ($t0 + ($t1 << 1) + '.$K[++$ki].'); + + $t0 = $S0[ $R2 & 0xff] ^ + $S1[($R2 >> 8) & 0xff] ^ + $S2[($R2 >> 16) & 0xff] ^ + $S3[($R2 >> 24) & 0xff]; + $t1 = $S0[($R3 >> 24) & 0xff] ^ + $S1[ $R3 & 0xff] ^ + $S2[($R3 >> 8) & 0xff] ^ + $S3[($R3 >> 16) & 0xff]; + $R0^= ($t0 + $t1 + '.$K[++$ki].'); + $R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31); + $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ ($t0 + ($t1 << 1) + '.$K[++$ki].'); + '; + } + $encrypt_block.= ' + $in = pack("V4", '.$K[4].' ^ $R2, + '.$K[5].' ^ $R3, + '.$K[6].' ^ $R0, + '.$K[7].' ^ $R1); + '; + + // Generating decrypt code: + $decrypt_block = ' + $in = unpack("V4", $in); + $R0 = '.$K[4].' ^ $in[1]; + $R1 = '.$K[5].' ^ $in[2]; + $R2 = '.$K[6].' ^ $in[3]; + $R3 = '.$K[7].' ^ $in[4]; + '; + for ($ki = 40, $i = 0; $i < 8; ++$i) { + $decrypt_block.= ' + $t0 = $S0[$R0 & 0xff] ^ + $S1[$R0 >> 8 & 0xff] ^ + $S2[$R0 >> 16 & 0xff] ^ + $S3[$R0 >> 24 & 0xff]; + $t1 = $S0[$R1 >> 24 & 0xff] ^ + $S1[$R1 & 0xff] ^ + $S2[$R1 >> 8 & 0xff] ^ + $S3[$R1 >> 16 & 0xff]; + $R3^= $t0 + ($t1 << 1) + '.$K[--$ki].'; + $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31; + $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ ($t0 + $t1 + '.$K[--$ki].'); + + $t0 = $S0[$R2 & 0xff] ^ + $S1[$R2 >> 8 & 0xff] ^ + $S2[$R2 >> 16 & 0xff] ^ + $S3[$R2 >> 24 & 0xff]; + $t1 = $S0[$R3 >> 24 & 0xff] ^ + $S1[$R3 & 0xff] ^ + $S2[$R3 >> 8 & 0xff] ^ + $S3[$R3 >> 16 & 0xff]; + $R1^= $t0 + ($t1 << 1) + '.$K[--$ki].'; + $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31; + $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ ($t0 + $t1 + '.$K[--$ki].'); + '; + } + $decrypt_block.= ' + $in = pack("V4", '.$K[0].' ^ $R2, + '.$K[1].' ^ $R3, + '.$K[2].' ^ $R0, + '.$K[3].' ^ $R1); + '; + + $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( + array( + 'init_crypt' => $init_crypt, + 'init_encrypt' => '', + 'init_decrypt' => '', + 'encrypt_block' => $encrypt_block, + 'decrypt_block' => $decrypt_block + ) + ); + } + $this->inline_crypt = $lambda_functions[$code_hash]; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/ANSI.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/ANSI.php new file mode 100755 index 00000000..3ff1b7d4 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/ANSI.php @@ -0,0 +1,559 @@ + + * @copyright 2012 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Pure-PHP ANSI Decoder + * + * @package File_ANSI + * @author Jim Wigginton + * @access public + */ +class File_ANSI +{ + /** + * Max Width + * + * @var Integer + * @access private + */ + var $max_x; + + /** + * Max Height + * + * @var Integer + * @access private + */ + var $max_y; + + /** + * Max History + * + * @var Integer + * @access private + */ + var $max_history; + + /** + * History + * + * @var Array + * @access private + */ + var $history; + + /** + * History Attributes + * + * @var Array + * @access private + */ + var $history_attrs; + + /** + * Current Column + * + * @var Integer + * @access private + */ + var $x; + + /** + * Current Row + * + * @var Integer + * @access private + */ + var $y; + + /** + * Old Column + * + * @var Integer + * @access private + */ + var $old_x; + + /** + * Old Row + * + * @var Integer + * @access private + */ + var $old_y; + + /** + * An empty attribute row + * + * @var Array + * @access private + */ + var $attr_row; + + /** + * The current screen text + * + * @var Array + * @access private + */ + var $screen; + + /** + * The current screen attributes + * + * @var Array + * @access private + */ + var $attrs; + + /** + * The current foreground color + * + * @var String + * @access private + */ + var $foreground; + + /** + * The current background color + * + * @var String + * @access private + */ + var $background; + + /** + * Bold flag + * + * @var Boolean + * @access private + */ + var $bold; + + /** + * Underline flag + * + * @var Boolean + * @access private + */ + var $underline; + + /** + * Blink flag + * + * @var Boolean + * @access private + */ + var $blink; + + /** + * Reverse flag + * + * @var Boolean + * @access private + */ + var $reverse; + + /** + * Color flag + * + * @var Boolean + * @access private + */ + var $color; + + /** + * Current ANSI code + * + * @var String + * @access private + */ + var $ansi; + + /** + * Default Constructor. + * + * @return File_ANSI + * @access public + */ + function File_ANSI() + { + $this->setHistory(200); + $this->setDimensions(80, 24); + } + + /** + * Set terminal width and height + * + * Resets the screen as well + * + * @param Integer $x + * @param Integer $y + * @access public + */ + function setDimensions($x, $y) + { + $this->max_x = $x - 1; + $this->max_y = $y - 1; + $this->x = $this->y = 0; + $this->history = $this->history_attrs = array(); + $this->attr_row = array_fill(0, $this->max_x + 1, ''); + $this->screen = array_fill(0, $this->max_y + 1, ''); + $this->attrs = array_fill(0, $this->max_y + 1, $this->attr_row); + $this->foreground = 'white'; + $this->background = 'black'; + $this->bold = false; + $this->underline = false; + $this->blink = false; + $this->reverse = false; + $this->color = false; + + $this->ansi = ''; + } + + /** + * Set the number of lines that should be logged past the terminal height + * + * @param Integer $x + * @param Integer $y + * @access public + */ + function setHistory($history) + { + $this->max_history = $history; + } + + /** + * Load a string + * + * @param String $source + * @access public + */ + function loadString($source) + { + $this->setDimensions($this->max_x + 1, $this->max_y + 1); + $this->appendString($source); + } + + /** + * Appdend a string + * + * @param String $source + * @access public + */ + function appendString($source) + { + for ($i = 0; $i < strlen($source); $i++) { + if (strlen($this->ansi)) { + $this->ansi.= $source[$i]; + $chr = ord($source[$i]); + // http://en.wikipedia.org/wiki/ANSI_escape_code#Sequence_elements + // single character CSI's not currently supported + switch (true) { + case $this->ansi == "\x1B=": + $this->ansi = ''; + continue 2; + case strlen($this->ansi) == 2 && $chr >= 64 && $chr <= 95 && $chr != ord('['): + case strlen($this->ansi) > 2 && $chr >= 64 && $chr <= 126: + break; + default: + continue 2; + } + // http://ascii-table.com/ansi-escape-sequences-vt-100.php + switch ($this->ansi) { + case "\x1B[H": // Move cursor to upper left corner + $this->old_x = $this->x; + $this->old_y = $this->y; + $this->x = $this->y = 0; + break; + case "\x1B[J": // Clear screen from cursor down + $this->history = array_merge($this->history, array_slice(array_splice($this->screen, $this->y + 1), 0, $this->old_y)); + $this->screen = array_merge($this->screen, array_fill($this->y, $this->max_y, '')); + + $this->history_attrs = array_merge($this->history_attrs, array_slice(array_splice($this->attrs, $this->y + 1), 0, $this->old_y)); + $this->attrs = array_merge($this->attrs, array_fill($this->y, $this->max_y, $this->attr_row)); + + if (count($this->history) == $this->max_history) { + array_shift($this->history); + array_shift($this->history_attrs); + } + case "\x1B[K": // Clear screen from cursor right + $this->screen[$this->y] = substr($this->screen[$this->y], 0, $this->x); + + array_splice($this->attrs[$this->y], $this->x + 1); + break; + case "\x1B[2K": // Clear entire line + $this->screen[$this->y] = str_repeat(' ', $this->x); + $this->attrs[$this->y] = $this->attr_row; + break; + case "\x1B[?1h": // set cursor key to application + case "\x1B[?25h": // show the cursor + break; + case "\x1BE": // Move to next line + $this->_newLine(); + $this->x = 0; + break; + default: + switch (true) { + case preg_match('#\x1B\[(\d+);(\d+)H#', $this->ansi, $match): // Move cursor to screen location v,h + $this->old_x = $this->x; + $this->old_y = $this->y; + $this->x = $match[2] - 1; + $this->y = $match[1] - 1; + break; + case preg_match('#\x1B\[(\d+)C#', $this->ansi, $match): // Move cursor right n lines + $this->old_x = $this->x; + $x = $match[1] - 1; + break; + case preg_match('#\x1B\[(\d+);(\d+)r#', $this->ansi, $match): // Set top and bottom lines of a window + break; + case preg_match('#\x1B\[(\d*(?:;\d*)*)m#', $this->ansi, $match): // character attributes + $mods = explode(';', $match[1]); + foreach ($mods as $mod) { + switch ($mod) { + case 0: // Turn off character attributes + $this->attrs[$this->y][$this->x] = ''; + + if ($this->bold) $this->attrs[$this->y][$this->x].= ''; + if ($this->underline) $this->attrs[$this->y][$this->x].= '
'; + if ($this->blink) $this->attrs[$this->y][$this->x].= ''; + if ($this->color) $this->attrs[$this->y][$this->x].= ''; + + if ($this->reverse) { + $temp = $this->background; + $this->background = $this->foreground; + $this->foreground = $temp; + } + + $this->bold = $this->underline = $this->blink = $this->color = $this->reverse = false; + break; + case 1: // Turn bold mode on + if (!$this->bold) { + $this->attrs[$this->y][$this->x] = ''; + $this->bold = true; + } + break; + case 4: // Turn underline mode on + if (!$this->underline) { + $this->attrs[$this->y][$this->x] = ''; + $this->underline = true; + } + break; + case 5: // Turn blinking mode on + if (!$this->blink) { + $this->attrs[$this->y][$this->x] = ''; + $this->blink = true; + } + break; + case 7: // Turn reverse video on + $this->reverse = !$this->reverse; + $temp = $this->background; + $this->background = $this->foreground; + $this->foreground = $temp; + $this->attrs[$this->y][$this->x] = ''; + if ($this->color) { + $this->attrs[$this->y][$this->x] = '' . $this->attrs[$this->y][$this->x]; + } + $this->color = true; + break; + default: // set colors + //$front = $this->reverse ? &$this->background : &$this->foreground; + $front = &$this->{ $this->reverse ? 'background' : 'foreground' }; + //$back = $this->reverse ? &$this->foreground : &$this->background; + $back = &$this->{ $this->reverse ? 'foreground' : 'background' }; + switch ($mod) { + case 30: $front = 'black'; break; + case 31: $front = 'red'; break; + case 32: $front = 'green'; break; + case 33: $front = 'yellow'; break; + case 34: $front = 'blue'; break; + case 35: $front = 'magenta'; break; + case 36: $front = 'cyan'; break; + case 37: $front = 'white'; break; + + case 40: $back = 'black'; break; + case 41: $back = 'red'; break; + case 42: $back = 'green'; break; + case 43: $back = 'yellow'; break; + case 44: $back = 'blue'; break; + case 45: $back = 'magenta'; break; + case 46: $back = 'cyan'; break; + case 47: $back = 'white'; break; + + default: + user_error('Unsupported attribute: ' . $mod); + $this->ansi = ''; + break 2; + } + + unset($temp); + $this->attrs[$this->y][$this->x] = ''; + if ($this->color) { + $this->attrs[$this->y][$this->x] = '' . $this->attrs[$this->y][$this->x]; + } + $this->color = true; + } + } + break; + default: + user_error("{$this->ansi} unsupported\r\n"); + } + } + $this->ansi = ''; + continue; + } + + switch ($source[$i]) { + case "\r": + $this->x = 0; + break; + case "\n": + $this->_newLine(); + break; + case "\x0F": // shift + break; + case "\x1B": // start ANSI escape code + $this->ansi.= "\x1B"; + break; + default: + $this->screen[$this->y] = substr_replace( + $this->screen[$this->y], + $source[$i], + $this->x, + 1 + ); + + if ($this->x > $this->max_x) { + $this->x = 0; + $this->y++; + } else { + $this->x++; + } + } + } + } + + /** + * Add a new line + * + * Also update the $this->screen and $this->history buffers + * + * @access private + */ + function _newLine() + { + //if ($this->y < $this->max_y) { + // $this->y++; + //} + + while ($this->y >= $this->max_y) { + $this->history = array_merge($this->history, array(array_shift($this->screen))); + $this->screen[] = ''; + + $this->history_attrs = array_merge($this->history_attrs, array(array_shift($this->attrs))); + $this->attrs[] = $this->attr_row; + + if (count($this->history) >= $this->max_history) { + array_shift($this->history); + array_shift($this->history_attrs); + } + + $this->y--; + } + $this->y++; + } + + /** + * Returns the current screen without preformating + * + * @access private + * @return String + */ + function _getScreen() + { + $output = ''; + for ($i = 0; $i <= $this->max_y; $i++) { + for ($j = 0; $j <= $this->max_x + 1; $j++) { + if (isset($this->attrs[$i][$j])) { + $output.= $this->attrs[$i][$j]; + } + if (isset($this->screen[$i][$j])) { + $output.= htmlspecialchars($this->screen[$i][$j]); + } + } + $output.= "\r\n"; + } + return rtrim($output); + } + + /** + * Returns the current screen + * + * @access public + * @return String + */ + function getScreen() + { + return '
' . $this->_getScreen() . '
'; + } + + /** + * Returns the current screen and the x previous lines + * + * @access public + * @return String + */ + function getHistory() + { + $scrollback = ''; + for ($i = 0; $i < count($this->history); $i++) { + for ($j = 0; $j <= $this->max_x + 1; $j++) { + if (isset($this->history_attrs[$i][$j])) { + $scrollback.= $this->history_attrs[$i][$j]; + } + if (isset($this->history[$i][$j])) { + $scrollback.= htmlspecialchars($this->history[$i][$j]); + } + } + $scrollback.= "\r\n"; + } + $scrollback.= $this->_getScreen(); + + return '
' . $scrollback . '
'; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/ASN1.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/ASN1.php new file mode 100755 index 00000000..1d66793a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/ASN1.php @@ -0,0 +1,1358 @@ + + * @copyright 2012 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/**#@+ + * Tag Classes + * + * @access private + * @link http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=12 + */ +define('FILE_ASN1_CLASS_UNIVERSAL', 0); +define('FILE_ASN1_CLASS_APPLICATION', 1); +define('FILE_ASN1_CLASS_CONTEXT_SPECIFIC', 2); +define('FILE_ASN1_CLASS_PRIVATE', 3); +/**#@-*/ + +/**#@+ + * Tag Classes + * + * @access private + * @link http://www.obj-sys.com/asn1tutorial/node124.html + */ +define('FILE_ASN1_TYPE_BOOLEAN', 1); +define('FILE_ASN1_TYPE_INTEGER', 2); +define('FILE_ASN1_TYPE_BIT_STRING', 3); +define('FILE_ASN1_TYPE_OCTET_STRING', 4); +define('FILE_ASN1_TYPE_NULL', 5); +define('FILE_ASN1_TYPE_OBJECT_IDENTIFIER', 6); +//define('FILE_ASN1_TYPE_OBJECT_DESCRIPTOR', 7); +//define('FILE_ASN1_TYPE_INSTANCE_OF', 8); // EXTERNAL +define('FILE_ASN1_TYPE_REAL', 9); +define('FILE_ASN1_TYPE_ENUMERATED', 10); +//define('FILE_ASN1_TYPE_EMBEDDED', 11); +define('FILE_ASN1_TYPE_UTF8_STRING', 12); +//define('FILE_ASN1_TYPE_RELATIVE_OID', 13); +define('FILE_ASN1_TYPE_SEQUENCE', 16); // SEQUENCE OF +define('FILE_ASN1_TYPE_SET', 17); // SET OF +/**#@-*/ +/**#@+ + * More Tag Classes + * + * @access private + * @link http://www.obj-sys.com/asn1tutorial/node10.html + */ +define('FILE_ASN1_TYPE_NUMERIC_STRING', 18); +define('FILE_ASN1_TYPE_PRINTABLE_STRING', 19); +define('FILE_ASN1_TYPE_TELETEX_STRING', 20); // T61String +define('FILE_ASN1_TYPE_VIDEOTEX_STRING', 21); +define('FILE_ASN1_TYPE_IA5_STRING', 22); +define('FILE_ASN1_TYPE_UTC_TIME', 23); +define('FILE_ASN1_TYPE_GENERALIZED_TIME', 24); +define('FILE_ASN1_TYPE_GRAPHIC_STRING', 25); +define('FILE_ASN1_TYPE_VISIBLE_STRING', 26); // ISO646String +define('FILE_ASN1_TYPE_GENERAL_STRING', 27); +define('FILE_ASN1_TYPE_UNIVERSAL_STRING', 28); +//define('FILE_ASN1_TYPE_CHARACTER_STRING', 29); +define('FILE_ASN1_TYPE_BMP_STRING', 30); +/**#@-*/ + +/**#@+ + * Tag Aliases + * + * These tags are kinda place holders for other tags. + * + * @access private + */ +define('FILE_ASN1_TYPE_CHOICE', -1); +define('FILE_ASN1_TYPE_ANY', -2); +/**#@-*/ + +/** + * ASN.1 Element + * + * Bypass normal encoding rules in File_ASN1::encodeDER() + * + * @package File_ASN1 + * @author Jim Wigginton + * @access public + */ +class File_ASN1_Element +{ + /** + * Raw element value + * + * @var String + * @access private + */ + var $element; + + /** + * Constructor + * + * @param String $encoded + * @return File_ASN1_Element + * @access public + */ + function File_ASN1_Element($encoded) + { + $this->element = $encoded; + } +} + +/** + * Pure-PHP ASN.1 Parser + * + * @package File_ASN1 + * @author Jim Wigginton + * @access public + */ +class File_ASN1 +{ + /** + * ASN.1 object identifier + * + * @var Array + * @access private + * @link http://en.wikipedia.org/wiki/Object_identifier + */ + var $oids = array(); + + /** + * Default date format + * + * @var String + * @access private + * @link http://php.net/class.datetime + */ + var $format = 'D, d M Y H:i:s O'; + + /** + * Default date format + * + * @var Array + * @access private + * @see File_ASN1::setTimeFormat() + * @see File_ASN1::asn1map() + * @link http://php.net/class.datetime + */ + var $encoded; + + /** + * Filters + * + * If the mapping type is FILE_ASN1_TYPE_ANY what do we actually encode it as? + * + * @var Array + * @access private + * @see File_ASN1::_encode_der() + */ + var $filters; + + /** + * Type mapping table for the ANY type. + * + * Structured or unknown types are mapped to a FILE_ASN1_Element. + * Unambiguous types get the direct mapping (int/real/bool). + * Others are mapped as a choice, with an extra indexing level. + * + * @var Array + * @access public + */ + var $ANYmap = array( + FILE_ASN1_TYPE_BOOLEAN => true, + FILE_ASN1_TYPE_INTEGER => true, + FILE_ASN1_TYPE_BIT_STRING => 'bitString', + FILE_ASN1_TYPE_OCTET_STRING => 'octetString', + FILE_ASN1_TYPE_NULL => 'null', + FILE_ASN1_TYPE_OBJECT_IDENTIFIER => 'objectIdentifier', + FILE_ASN1_TYPE_REAL => true, + FILE_ASN1_TYPE_ENUMERATED => 'enumerated', + FILE_ASN1_TYPE_UTF8_STRING => 'utf8String', + FILE_ASN1_TYPE_NUMERIC_STRING => 'numericString', + FILE_ASN1_TYPE_PRINTABLE_STRING => 'printableString', + FILE_ASN1_TYPE_TELETEX_STRING => 'teletexString', + FILE_ASN1_TYPE_VIDEOTEX_STRING => 'videotexString', + FILE_ASN1_TYPE_IA5_STRING => 'ia5String', + FILE_ASN1_TYPE_UTC_TIME => 'utcTime', + FILE_ASN1_TYPE_GENERALIZED_TIME => 'generalTime', + FILE_ASN1_TYPE_GRAPHIC_STRING => 'graphicString', + FILE_ASN1_TYPE_VISIBLE_STRING => 'visibleString', + FILE_ASN1_TYPE_GENERAL_STRING => 'generalString', + FILE_ASN1_TYPE_UNIVERSAL_STRING => 'universalString', + //FILE_ASN1_TYPE_CHARACTER_STRING => 'characterString', + FILE_ASN1_TYPE_BMP_STRING => 'bmpString' + ); + + /** + * String type to character size mapping table. + * + * Non-convertable types are absent from this table. + * size == 0 indicates variable length encoding. + * + * @var Array + * @access public + */ + var $stringTypeSize = array( + FILE_ASN1_TYPE_UTF8_STRING => 0, + FILE_ASN1_TYPE_BMP_STRING => 2, + FILE_ASN1_TYPE_UNIVERSAL_STRING => 4, + FILE_ASN1_TYPE_PRINTABLE_STRING => 1, + FILE_ASN1_TYPE_TELETEX_STRING => 1, + FILE_ASN1_TYPE_IA5_STRING => 1, + FILE_ASN1_TYPE_VISIBLE_STRING => 1, + ); + + /** + * Default Constructor. + * + * @access public + */ + function File_ASN1() + { + static $static_init = null; + if (!$static_init) { + $static_init = true; + if (!class_exists('Math_BigInteger')) { + include_once 'Math/BigInteger.php'; + } + } + } + + /** + * Parse BER-encoding + * + * Serves a similar purpose to openssl's asn1parse + * + * @param String $encoded + * @return Array + * @access public + */ + function decodeBER($encoded) + { + if (is_object($encoded) && strtolower(get_class($encoded)) == 'file_asn1_element') { + $encoded = $encoded->element; + } + + $this->encoded = $encoded; + // encapsulate in an array for BC with the old decodeBER + return array($this->_decode_ber($encoded)); + } + + /** + * Parse BER-encoding (Helper function) + * + * Sometimes we want to get the BER encoding of a particular tag. $start lets us do that without having to reencode. + * $encoded is passed by reference for the recursive calls done for FILE_ASN1_TYPE_BIT_STRING and + * FILE_ASN1_TYPE_OCTET_STRING. In those cases, the indefinite length is used. + * + * @param String $encoded + * @param Integer $start + * @return Array + * @access private + */ + function _decode_ber($encoded, $start = 0) + { + $current = array('start' => $start); + + $type = ord($this->_string_shift($encoded)); + $start++; + + $constructed = ($type >> 5) & 1; + + $tag = $type & 0x1F; + if ($tag == 0x1F) { + $tag = 0; + // process septets (since the eighth bit is ignored, it's not an octet) + do { + $loop = ord($encoded[0]) >> 7; + $tag <<= 7; + $tag |= ord($this->_string_shift($encoded)) & 0x7F; + $start++; + } while ( $loop ); + } + + // Length, as discussed in paragraph 8.1.3 of X.690-0207.pdf#page=13 + $length = ord($this->_string_shift($encoded)); + $start++; + if ( $length == 0x80 ) { // indefinite length + // "[A sender shall] use the indefinite form (see 8.1.3.6) if the encoding is constructed and is not all + // immediately available." -- paragraph 8.1.3.2.c + $length = strlen($encoded); + } elseif ( $length & 0x80 ) { // definite length, long form + // technically, the long form of the length can be represented by up to 126 octets (bytes), but we'll only + // support it up to four. + $length&= 0x7F; + $temp = $this->_string_shift($encoded, $length); + // tags of indefinte length don't really have a header length; this length includes the tag + $current+= array('headerlength' => $length + 2); + $start+= $length; + extract(unpack('Nlength', substr(str_pad($temp, 4, chr(0), STR_PAD_LEFT), -4))); + } else { + $current+= array('headerlength' => 2); + } + + $content = $this->_string_shift($encoded, $length); + + // at this point $length can be overwritten. it's only accurate for definite length things as is + + /* Class is UNIVERSAL, APPLICATION, PRIVATE, or CONTEXT-SPECIFIC. The UNIVERSAL class is restricted to the ASN.1 + built-in types. It defines an application-independent data type that must be distinguishable from all other + data types. The other three classes are user defined. The APPLICATION class distinguishes data types that + have a wide, scattered use within a particular presentation context. PRIVATE distinguishes data types within + a particular organization or country. CONTEXT-SPECIFIC distinguishes members of a sequence or set, the + alternatives of a CHOICE, or universally tagged set members. Only the class number appears in braces for this + data type; the term CONTEXT-SPECIFIC does not appear. + + -- http://www.obj-sys.com/asn1tutorial/node12.html */ + $class = ($type >> 6) & 3; + switch ($class) { + case FILE_ASN1_CLASS_APPLICATION: + case FILE_ASN1_CLASS_PRIVATE: + case FILE_ASN1_CLASS_CONTEXT_SPECIFIC: + if (!$constructed) { + return array( + 'type' => $class, + 'constant' => $tag, + 'content' => $content, + 'length' => $length + $start - $current['start'] + ); + } + + $newcontent = array(); + if (strlen($content)) { + $newcontent = $this->_decode_ber($content, $start); + $length = $newcontent['length']; + if (substr($content, $length, 2) == "\0\0") { + $length+= 2; + } + $start+= $length; + $newcontent = array($newcontent); + } + + return array( + 'type' => $class, + 'constant' => $tag, + // the array encapsulation is for BC with the old format + 'content' => $newcontent, + // the only time when $content['headerlength'] isn't defined is when the length is indefinite. + // the absence of $content['headerlength'] is how we know if something is indefinite or not. + // technically, it could be defined to be 2 and then another indicator could be used but whatever. + 'length' => $start - $current['start'] + ) + $current; + } + + $current+= array('type' => $tag); + + // decode UNIVERSAL tags + switch ($tag) { + case FILE_ASN1_TYPE_BOOLEAN: + // "The contents octets shall consist of a single octet." -- paragraph 8.2.1 + //if (strlen($content) != 1) { + // return false; + //} + $current['content'] = (bool) ord($content[0]); + break; + case FILE_ASN1_TYPE_INTEGER: + case FILE_ASN1_TYPE_ENUMERATED: + $current['content'] = new Math_BigInteger($content, -256); + break; + case FILE_ASN1_TYPE_REAL: // not currently supported + return false; + case FILE_ASN1_TYPE_BIT_STRING: + // The initial octet shall encode, as an unsigned binary integer with bit 1 as the least significant bit, + // the number of unused bits in the final subsequent octet. The number shall be in the range zero to + // seven. + if (!$constructed) { + $current['content'] = $content; + } else { + $temp = $this->_decode_ber($content, $start); + $length-= strlen($content); + $last = count($temp) - 1; + for ($i = 0; $i < $last; $i++) { + // all subtags should be bit strings + //if ($temp[$i]['type'] != FILE_ASN1_TYPE_BIT_STRING) { + // return false; + //} + $current['content'].= substr($temp[$i]['content'], 1); + } + // all subtags should be bit strings + //if ($temp[$last]['type'] != FILE_ASN1_TYPE_BIT_STRING) { + // return false; + //} + $current['content'] = $temp[$last]['content'][0] . $current['content'] . substr($temp[$i]['content'], 1); + } + break; + case FILE_ASN1_TYPE_OCTET_STRING: + if (!$constructed) { + $current['content'] = $content; + } else { + $current['content'] = ''; + $length = 0; + while (substr($content, 0, 2) != "\0\0") { + $temp = $this->_decode_ber($content, $length + $start); + $this->_string_shift($content, $temp['length']); + // all subtags should be octet strings + //if ($temp['type'] != FILE_ASN1_TYPE_OCTET_STRING) { + // return false; + //} + $current['content'].= $temp['content']; + $length+= $temp['length']; + } + if (substr($content, 0, 2) == "\0\0") { + $length+= 2; // +2 for the EOC + } + } + break; + case FILE_ASN1_TYPE_NULL: + // "The contents octets shall not contain any octets." -- paragraph 8.8.2 + //if (strlen($content)) { + // return false; + //} + break; + case FILE_ASN1_TYPE_SEQUENCE: + case FILE_ASN1_TYPE_SET: + $offset = 0; + $current['content'] = array(); + while (strlen($content)) { + // if indefinite length construction was used and we have an end-of-content string next + // see paragraphs 8.1.1.3, 8.1.3.2, 8.1.3.6, 8.1.5, and (for an example) 8.6.4.2 + if (!isset($current['headerlength']) && substr($content, 0, 2) == "\0\0") { + $length = $offset + 2; // +2 for the EOC + break 2; + } + $temp = $this->_decode_ber($content, $start + $offset); + $this->_string_shift($content, $temp['length']); + $current['content'][] = $temp; + $offset+= $temp['length']; + } + break; + case FILE_ASN1_TYPE_OBJECT_IDENTIFIER: + $temp = ord($this->_string_shift($content)); + $current['content'] = sprintf('%d.%d', floor($temp / 40), $temp % 40); + $valuen = 0; + // process septets + while (strlen($content)) { + $temp = ord($this->_string_shift($content)); + $valuen <<= 7; + $valuen |= $temp & 0x7F; + if (~$temp & 0x80) { + $current['content'].= ".$valuen"; + $valuen = 0; + } + } + // the eighth bit of the last byte should not be 1 + //if ($temp >> 7) { + // return false; + //} + break; + /* Each character string type shall be encoded as if it had been declared: + [UNIVERSAL x] IMPLICIT OCTET STRING + + -- X.690-0207.pdf#page=23 (paragraph 8.21.3) + + Per that, we're not going to do any validation. If there are any illegal characters in the string, + we don't really care */ + case FILE_ASN1_TYPE_NUMERIC_STRING: + // 0,1,2,3,4,5,6,7,8,9, and space + case FILE_ASN1_TYPE_PRINTABLE_STRING: + // Upper and lower case letters, digits, space, apostrophe, left/right parenthesis, plus sign, comma, + // hyphen, full stop, solidus, colon, equal sign, question mark + case FILE_ASN1_TYPE_TELETEX_STRING: + // The Teletex character set in CCITT's T61, space, and delete + // see http://en.wikipedia.org/wiki/Teletex#Character_sets + case FILE_ASN1_TYPE_VIDEOTEX_STRING: + // The Videotex character set in CCITT's T.100 and T.101, space, and delete + case FILE_ASN1_TYPE_VISIBLE_STRING: + // Printing character sets of international ASCII, and space + case FILE_ASN1_TYPE_IA5_STRING: + // International Alphabet 5 (International ASCII) + case FILE_ASN1_TYPE_GRAPHIC_STRING: + // All registered G sets, and space + case FILE_ASN1_TYPE_GENERAL_STRING: + // All registered C and G sets, space and delete + case FILE_ASN1_TYPE_UTF8_STRING: + // ???? + case FILE_ASN1_TYPE_BMP_STRING: + $current['content'] = $content; + break; + case FILE_ASN1_TYPE_UTC_TIME: + case FILE_ASN1_TYPE_GENERALIZED_TIME: + $current['content'] = $this->_decodeTime($content, $tag); + default: + } + + $start+= $length; + + // ie. length is the length of the full TLV encoding - it's not just the length of the value + return $current + array('length' => $start - $current['start']); + } + + /** + * ASN.1 Map + * + * Provides an ASN.1 semantic mapping ($mapping) from a parsed BER-encoding to a human readable format. + * + * "Special" mappings may be applied on a per tag-name basis via $special. + * + * @param Array $decoded + * @param Array $mapping + * @param Array $special + * @return Array + * @access public + */ + function asn1map($decoded, $mapping, $special = array()) + { + if (isset($mapping['explicit']) && is_array($decoded['content'])) { + $decoded = $decoded['content'][0]; + } + + switch (true) { + case $mapping['type'] == FILE_ASN1_TYPE_ANY: + $intype = $decoded['type']; + if (isset($decoded['constant']) || !isset($this->ANYmap[$intype]) || ($this->encoded[$decoded['start']] & 0x20)) { + return new File_ASN1_Element(substr($this->encoded, $decoded['start'], $decoded['length'])); + } + $inmap = $this->ANYmap[$intype]; + if (is_string($inmap)) { + return array($inmap => $this->asn1map($decoded, array('type' => $intype) + $mapping, $special)); + } + break; + case $mapping['type'] == FILE_ASN1_TYPE_CHOICE: + foreach ($mapping['children'] as $key => $option) { + switch (true) { + case isset($option['constant']) && $option['constant'] == $decoded['constant']: + case !isset($option['constant']) && $option['type'] == $decoded['type']: + $value = $this->asn1map($decoded, $option, $special); + break; + case !isset($option['constant']) && $option['type'] == FILE_ASN1_TYPE_CHOICE: + $v = $this->asn1map($decoded, $option, $special); + if (isset($v)) { + $value = $v; + } + } + if (isset($value)) { + if (isset($special[$key])) { + $value = call_user_func($special[$key], $value); + } + return array($key => $value); + } + } + return null; + case isset($mapping['implicit']): + case isset($mapping['explicit']): + case $decoded['type'] == $mapping['type']: + break; + default: + // if $decoded['type'] and $mapping['type'] are both strings, but different types of strings, + // let it through + switch (true) { + case $decoded['type'] < 18: // FILE_ASN1_TYPE_NUMERIC_STRING == 18 + case $decoded['type'] > 30: // FILE_ASN1_TYPE_BMP_STRING == 30 + case $mapping['type'] < 18: + case $mapping['type'] > 30: + return null; + } + } + + if (isset($mapping['implicit'])) { + $decoded['type'] = $mapping['type']; + } + + switch ($decoded['type']) { + case FILE_ASN1_TYPE_SEQUENCE: + $map = array(); + + // ignore the min and max + if (isset($mapping['min']) && isset($mapping['max'])) { + $child = $mapping['children']; + foreach ($decoded['content'] as $content) { + if (($map[] = $this->asn1map($content, $child, $special)) === null) { + return null; + } + } + + return $map; + } + + $n = count($decoded['content']); + $i = 0; + + foreach ($mapping['children'] as $key => $child) { + $maymatch = $i < $n; // Match only existing input. + if ($maymatch) { + $temp = $decoded['content'][$i]; + + if ($child['type'] != FILE_ASN1_TYPE_CHOICE) { + // Get the mapping and input class & constant. + $childClass = $tempClass = FILE_ASN1_CLASS_UNIVERSAL; + $constant = null; + if (isset($temp['constant'])) { + $tempClass = isset($temp['class']) ? $temp['class'] : FILE_ASN1_CLASS_CONTEXT_SPECIFIC; + } + if (isset($child['class'])) { + $childClass = $child['class']; + $constant = $child['cast']; + } elseif (isset($child['constant'])) { + $childClass = FILE_ASN1_CLASS_CONTEXT_SPECIFIC; + $constant = $child['constant']; + } + + if (isset($constant) && isset($temp['constant'])) { + // Can only match if constants and class match. + $maymatch = $constant == $temp['constant'] && $childClass == $tempClass; + } else { + // Can only match if no constant expected and type matches or is generic. + $maymatch = !isset($child['constant']) && array_search($child['type'], array($temp['type'], FILE_ASN1_TYPE_ANY, FILE_ASN1_TYPE_CHOICE)) !== false; + } + } + } + + if ($maymatch) { + // Attempt submapping. + $candidate = $this->asn1map($temp, $child, $special); + $maymatch = $candidate !== null; + } + + if ($maymatch) { + // Got the match: use it. + if (isset($special[$key])) { + $candidate = call_user_func($special[$key], $candidate); + } + $map[$key] = $candidate; + $i++; + } elseif (isset($child['default'])) { + $map[$key] = $child['default']; // Use default. + } elseif (!isset($child['optional'])) { + return null; // Syntax error. + } + } + + // Fail mapping if all input items have not been consumed. + return $i < $n? null: $map; + + // the main diff between sets and sequences is the encapsulation of the foreach in another for loop + case FILE_ASN1_TYPE_SET: + $map = array(); + + // ignore the min and max + if (isset($mapping['min']) && isset($mapping['max'])) { + $child = $mapping['children']; + foreach ($decoded['content'] as $content) { + if (($map[] = $this->asn1map($content, $child, $special)) === null) { + return null; + } + } + + return $map; + } + + for ($i = 0; $i < count($decoded['content']); $i++) { + $temp = $decoded['content'][$i]; + $tempClass = FILE_ASN1_CLASS_UNIVERSAL; + if (isset($temp['constant'])) { + $tempClass = isset($temp['class']) ? $temp['class'] : FILE_ASN1_CLASS_CONTEXT_SPECIFIC; + } + + foreach ($mapping['children'] as $key => $child) { + if (isset($map[$key])) { + continue; + } + $maymatch = true; + if ($child['type'] != FILE_ASN1_TYPE_CHOICE) { + $childClass = FILE_ASN1_CLASS_UNIVERSAL; + $constant = null; + if (isset($child['class'])) { + $childClass = $child['class']; + $constant = $child['cast']; + } elseif (isset($child['constant'])) { + $childClass = FILE_ASN1_CLASS_CONTEXT_SPECIFIC; + $constant = $child['constant']; + } + + if (isset($constant) && isset($temp['constant'])) { + // Can only match if constants and class match. + $maymatch = $constant == $temp['constant'] && $childClass == $tempClass; + } else { + // Can only match if no constant expected and type matches or is generic. + $maymatch = !isset($child['constant']) && array_search($child['type'], array($temp['type'], FILE_ASN1_TYPE_ANY, FILE_ASN1_TYPE_CHOICE)) !== false; + } + } + + if ($maymatch) { + // Attempt submapping. + $candidate = $this->asn1map($temp, $child, $special); + $maymatch = $candidate !== null; + } + + if (!$maymatch) { + break; + } + + // Got the match: use it. + if (isset($special[$key])) { + $candidate = call_user_func($special[$key], $candidate); + } + $map[$key] = $candidate; + break; + } + } + + foreach ($mapping['children'] as $key => $child) { + if (!isset($map[$key])) { + if (isset($child['default'])) { + $map[$key] = $child['default']; + } elseif (!isset($child['optional'])) { + return null; + } + } + } + return $map; + case FILE_ASN1_TYPE_OBJECT_IDENTIFIER: + return isset($this->oids[$decoded['content']]) ? $this->oids[$decoded['content']] : $decoded['content']; + case FILE_ASN1_TYPE_UTC_TIME: + case FILE_ASN1_TYPE_GENERALIZED_TIME: + if (isset($mapping['implicit'])) { + $decoded['content'] = $this->_decodeTime($decoded['content'], $decoded['type']); + } + return @date($this->format, $decoded['content']); + case FILE_ASN1_TYPE_BIT_STRING: + if (isset($mapping['mapping'])) { + $offset = ord($decoded['content'][0]); + $size = (strlen($decoded['content']) - 1) * 8 - $offset; + /* + From X.680-0207.pdf#page=46 (21.7): + + "When a "NamedBitList" is used in defining a bitstring type ASN.1 encoding rules are free to add (or remove) + arbitrarily any trailing 0 bits to (or from) values that are being encoded or decoded. Application designers should + therefore ensure that different semantics are not associated with such values which differ only in the number of trailing + 0 bits." + */ + $bits = count($mapping['mapping']) == $size ? array() : array_fill(0, count($mapping['mapping']) - $size, false); + for ($i = strlen($decoded['content']) - 1; $i > 0; $i--) { + $current = ord($decoded['content'][$i]); + for ($j = $offset; $j < 8; $j++) { + $bits[] = (bool) ($current & (1 << $j)); + } + $offset = 0; + } + $values = array(); + $map = array_reverse($mapping['mapping']); + foreach ($map as $i => $value) { + if ($bits[$i]) { + $values[] = $value; + } + } + return $values; + } + case FILE_ASN1_TYPE_OCTET_STRING: + return base64_encode($decoded['content']); + case FILE_ASN1_TYPE_NULL: + return ''; + case FILE_ASN1_TYPE_BOOLEAN: + return $decoded['content']; + case FILE_ASN1_TYPE_NUMERIC_STRING: + case FILE_ASN1_TYPE_PRINTABLE_STRING: + case FILE_ASN1_TYPE_TELETEX_STRING: + case FILE_ASN1_TYPE_VIDEOTEX_STRING: + case FILE_ASN1_TYPE_IA5_STRING: + case FILE_ASN1_TYPE_GRAPHIC_STRING: + case FILE_ASN1_TYPE_VISIBLE_STRING: + case FILE_ASN1_TYPE_GENERAL_STRING: + case FILE_ASN1_TYPE_UNIVERSAL_STRING: + case FILE_ASN1_TYPE_UTF8_STRING: + case FILE_ASN1_TYPE_BMP_STRING: + return $decoded['content']; + case FILE_ASN1_TYPE_INTEGER: + case FILE_ASN1_TYPE_ENUMERATED: + $temp = $decoded['content']; + if (isset($mapping['implicit'])) { + $temp = new Math_BigInteger($decoded['content'], -256); + } + if (isset($mapping['mapping'])) { + $temp = (int) $temp->toString(); + return isset($mapping['mapping'][$temp]) ? + $mapping['mapping'][$temp] : + false; + } + return $temp; + } + } + + /** + * ASN.1 Encode + * + * DER-encodes an ASN.1 semantic mapping ($mapping). Some libraries would probably call this function + * an ASN.1 compiler. + * + * "Special" mappings can be applied via $special. + * + * @param String $source + * @param String $mapping + * @param Integer $idx + * @return String + * @access public + */ + function encodeDER($source, $mapping, $special = array()) + { + $this->location = array(); + return $this->_encode_der($source, $mapping, null, $special); + } + + /** + * ASN.1 Encode (Helper function) + * + * @param String $source + * @param String $mapping + * @param Integer $idx + * @return String + * @access private + */ + function _encode_der($source, $mapping, $idx = null, $special = array()) + { + if (is_object($source) && strtolower(get_class($source)) == 'file_asn1_element') { + return $source->element; + } + + // do not encode (implicitly optional) fields with value set to default + if (isset($mapping['default']) && $source === $mapping['default']) { + return ''; + } + + if (isset($idx)) { + if (isset($special[$idx])) { + $source = call_user_func($special[$idx], $source); + } + $this->location[] = $idx; + } + + $tag = $mapping['type']; + + switch ($tag) { + case FILE_ASN1_TYPE_SET: // Children order is not important, thus process in sequence. + case FILE_ASN1_TYPE_SEQUENCE: + $tag|= 0x20; // set the constructed bit + $value = ''; + + // ignore the min and max + if (isset($mapping['min']) && isset($mapping['max'])) { + $child = $mapping['children']; + + foreach ($source as $content) { + $temp = $this->_encode_der($content, $child, null, $special); + if ($temp === false) { + return false; + } + $value.= $temp; + } + break; + } + + foreach ($mapping['children'] as $key => $child) { + if (!isset($source[$key])) { + if (!isset($child['optional'])) { + return false; + } + continue; + } + + $temp = $this->_encode_der($source[$key], $child, $key, $special); + if ($temp === false) { + return false; + } + + // An empty child encoding means it has been optimized out. + // Else we should have at least one tag byte. + if ($temp === '') { + continue; + } + + // if isset($child['constant']) is true then isset($child['optional']) should be true as well + if (isset($child['constant'])) { + /* + From X.680-0207.pdf#page=58 (30.6): + + "The tagging construction specifies explicit tagging if any of the following holds: + ... + c) the "Tag Type" alternative is used and the value of "TagDefault" for the module is IMPLICIT TAGS or + AUTOMATIC TAGS, but the type defined by "Type" is an untagged choice type, an untagged open type, or + an untagged "DummyReference" (see ITU-T Rec. X.683 | ISO/IEC 8824-4, 8.3)." + */ + if (isset($child['explicit']) || $child['type'] == FILE_ASN1_TYPE_CHOICE) { + $subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | 0x20 | $child['constant']); + $temp = $subtag . $this->_encodeLength(strlen($temp)) . $temp; + } else { + $subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | (ord($temp[0]) & 0x20) | $child['constant']); + $temp = $subtag . substr($temp, 1); + } + } + $value.= $temp; + } + break; + case FILE_ASN1_TYPE_CHOICE: + $temp = false; + + foreach ($mapping['children'] as $key => $child) { + if (!isset($source[$key])) { + continue; + } + + $temp = $this->_encode_der($source[$key], $child, $key, $special); + if ($temp === false) { + return false; + } + + // An empty child encoding means it has been optimized out. + // Else we should have at least one tag byte. + if ($temp === '') { + continue; + } + + $tag = ord($temp[0]); + + // if isset($child['constant']) is true then isset($child['optional']) should be true as well + if (isset($child['constant'])) { + if (isset($child['explicit']) || $child['type'] == FILE_ASN1_TYPE_CHOICE) { + $subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | 0x20 | $child['constant']); + $temp = $subtag . $this->_encodeLength(strlen($temp)) . $temp; + } else { + $subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | (ord($temp[0]) & 0x20) | $child['constant']); + $temp = $subtag . substr($temp, 1); + } + } + } + + if (isset($idx)) { + array_pop($this->location); + } + + if ($temp && isset($mapping['cast'])) { + $temp[0] = chr(($mapping['class'] << 6) | ($tag & 0x20) | $mapping['cast']); + } + + return $temp; + case FILE_ASN1_TYPE_INTEGER: + case FILE_ASN1_TYPE_ENUMERATED: + if (!isset($mapping['mapping'])) { + if (is_numeric($source)) { + $source = new Math_BigInteger($source); + } + $value = $source->toBytes(true); + } else { + $value = array_search($source, $mapping['mapping']); + if ($value === false) { + return false; + } + $value = new Math_BigInteger($value); + $value = $value->toBytes(true); + } + if (!strlen($value)) { + $value = chr(0); + } + break; + case FILE_ASN1_TYPE_UTC_TIME: + case FILE_ASN1_TYPE_GENERALIZED_TIME: + $format = $mapping['type'] == FILE_ASN1_TYPE_UTC_TIME ? 'y' : 'Y'; + $format.= 'mdHis'; + $value = @gmdate($format, strtotime($source)) . 'Z'; + break; + case FILE_ASN1_TYPE_BIT_STRING: + if (isset($mapping['mapping'])) { + $bits = array_fill(0, count($mapping['mapping']), 0); + $size = 0; + for ($i = 0; $i < count($mapping['mapping']); $i++) { + if (in_array($mapping['mapping'][$i], $source)) { + $bits[$i] = 1; + $size = $i; + } + } + + if (isset($mapping['min']) && $mapping['min'] >= 1 && $size < $mapping['min']) { + $size = $mapping['min'] - 1; + } + + $offset = 8 - (($size + 1) & 7); + $offset = $offset !== 8 ? $offset : 0; + + $value = chr($offset); + + for ($i = $size + 1; $i < count($mapping['mapping']); $i++) { + unset($bits[$i]); + } + + $bits = implode('', array_pad($bits, $size + $offset + 1, 0)); + $bytes = explode(' ', rtrim(chunk_split($bits, 8, ' '))); + foreach ($bytes as $byte) { + $value.= chr(bindec($byte)); + } + + break; + } + case FILE_ASN1_TYPE_OCTET_STRING: + /* The initial octet shall encode, as an unsigned binary integer with bit 1 as the least significant bit, + the number of unused bits in the final subsequent octet. The number shall be in the range zero to seven. + + -- http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=16 */ + $value = base64_decode($source); + break; + case FILE_ASN1_TYPE_OBJECT_IDENTIFIER: + $oid = preg_match('#(?:\d+\.)+#', $source) ? $source : array_search($source, $this->oids); + if ($oid === false) { + user_error('Invalid OID'); + return false; + } + $value = ''; + $parts = explode('.', $oid); + $value = chr(40 * $parts[0] + $parts[1]); + for ($i = 2; $i < count($parts); $i++) { + $temp = ''; + if (!$parts[$i]) { + $temp = "\0"; + } else { + while ($parts[$i]) { + $temp = chr(0x80 | ($parts[$i] & 0x7F)) . $temp; + $parts[$i] >>= 7; + } + $temp[strlen($temp) - 1] = $temp[strlen($temp) - 1] & chr(0x7F); + } + $value.= $temp; + } + break; + case FILE_ASN1_TYPE_ANY: + $loc = $this->location; + if (isset($idx)) { + array_pop($this->location); + } + + switch (true) { + case !isset($source): + return $this->_encode_der(null, array('type' => FILE_ASN1_TYPE_NULL) + $mapping, null, $special); + case is_int($source): + case is_object($source) && strtolower(get_class($source)) == 'math_biginteger': + return $this->_encode_der($source, array('type' => FILE_ASN1_TYPE_INTEGER) + $mapping, null, $special); + case is_float($source): + return $this->_encode_der($source, array('type' => FILE_ASN1_TYPE_REAL) + $mapping, null, $special); + case is_bool($source): + return $this->_encode_der($source, array('type' => FILE_ASN1_TYPE_BOOLEAN) + $mapping, null, $special); + case is_array($source) && count($source) == 1: + $typename = implode('', array_keys($source)); + $outtype = array_search($typename, $this->ANYmap, true); + if ($outtype !== false) { + return $this->_encode_der($source[$typename], array('type' => $outtype) + $mapping, null, $special); + } + } + + $filters = $this->filters; + foreach ($loc as $part) { + if (!isset($filters[$part])) { + $filters = false; + break; + } + $filters = $filters[$part]; + } + if ($filters === false) { + user_error('No filters defined for ' . implode('/', $loc)); + return false; + } + return $this->_encode_der($source, $filters + $mapping, null, $special); + case FILE_ASN1_TYPE_NULL: + $value = ''; + break; + case FILE_ASN1_TYPE_NUMERIC_STRING: + case FILE_ASN1_TYPE_TELETEX_STRING: + case FILE_ASN1_TYPE_PRINTABLE_STRING: + case FILE_ASN1_TYPE_UNIVERSAL_STRING: + case FILE_ASN1_TYPE_UTF8_STRING: + case FILE_ASN1_TYPE_BMP_STRING: + case FILE_ASN1_TYPE_IA5_STRING: + case FILE_ASN1_TYPE_VISIBLE_STRING: + case FILE_ASN1_TYPE_VIDEOTEX_STRING: + case FILE_ASN1_TYPE_GRAPHIC_STRING: + case FILE_ASN1_TYPE_GENERAL_STRING: + $value = $source; + break; + case FILE_ASN1_TYPE_BOOLEAN: + $value = $source ? "\xFF" : "\x00"; + break; + default: + user_error('Mapping provides no type definition for ' . implode('/', $this->location)); + return false; + } + + if (isset($idx)) { + array_pop($this->location); + } + + if (isset($mapping['cast'])) { + if (isset($mapping['explicit']) || $mapping['type'] == FILE_ASN1_TYPE_CHOICE) { + $value = chr($tag) . $this->_encodeLength(strlen($value)) . $value; + $tag = ($mapping['class'] << 6) | 0x20 | $mapping['cast']; + } else { + $tag = ($mapping['class'] << 6) | (ord($temp[0]) & 0x20) | $mapping['cast']; + } + } + + return chr($tag) . $this->_encodeLength(strlen($value)) . $value; + } + + /** + * DER-encode the length + * + * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See + * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. + * + * @access private + * @param Integer $length + * @return String + */ + function _encodeLength($length) + { + if ($length <= 0x7F) { + return chr($length); + } + + $temp = ltrim(pack('N', $length), chr(0)); + return pack('Ca*', 0x80 | strlen($temp), $temp); + } + + /** + * BER-decode the time + * + * Called by _decode_ber() and in the case of implicit tags asn1map(). + * + * @access private + * @param String $content + * @param Integer $tag + * @return String + */ + function _decodeTime($content, $tag) + { + /* UTCTime: + http://tools.ietf.org/html/rfc5280#section-4.1.2.5.1 + http://www.obj-sys.com/asn1tutorial/node15.html + + GeneralizedTime: + http://tools.ietf.org/html/rfc5280#section-4.1.2.5.2 + http://www.obj-sys.com/asn1tutorial/node14.html */ + + $pattern = $tag == FILE_ASN1_TYPE_UTC_TIME ? + '#(..)(..)(..)(..)(..)(..)(.*)#' : + '#(....)(..)(..)(..)(..)(..).*([Z+-].*)$#'; + + preg_match($pattern, $content, $matches); + + list(, $year, $month, $day, $hour, $minute, $second, $timezone) = $matches; + + if ($tag == FILE_ASN1_TYPE_UTC_TIME) { + $year = $year >= 50 ? "19$year" : "20$year"; + } + + if ($timezone == 'Z') { + $mktime = 'gmmktime'; + $timezone = 0; + } elseif (preg_match('#([+-])(\d\d)(\d\d)#', $timezone, $matches)) { + $mktime = 'gmmktime'; + $timezone = 60 * $matches[3] + 3600 * $matches[2]; + if ($matches[1] == '-') { + $timezone = -$timezone; + } + } else { + $mktime = 'mktime'; + $timezone = 0; + } + + return @$mktime($hour, $minute, $second, $month, $day, $year) + $timezone; + } + + /** + * Set the time format + * + * Sets the time / date format for asn1map(). + * + * @access public + * @param String $format + */ + function setTimeFormat($format) + { + $this->format = $format; + } + + /** + * Load OIDs + * + * Load the relevant OIDs for a particular ASN.1 semantic mapping. + * + * @access public + * @param Array $oids + */ + function loadOIDs($oids) + { + $this->oids = $oids; + } + + /** + * Load filters + * + * See File_X509, etc, for an example. + * + * @access public + * @param Array $filters + */ + function loadFilters($filters) + { + $this->filters = $filters; + } + + /** + * String Shift + * + * Inspired by array_shift + * + * @param String $string + * @param optional Integer $index + * @return String + * @access private + */ + function _string_shift(&$string, $index = 1) + { + $substr = substr($string, 0, $index); + $string = substr($string, $index); + return $substr; + } + + /** + * String type conversion + * + * This is a lazy conversion, dealing only with character size. + * No real conversion table is used. + * + * @param String $in + * @param optional Integer $from + * @param optional Integer $to + * @return String + * @access public + */ + function convert($in, $from = FILE_ASN1_TYPE_UTF8_STRING, $to = FILE_ASN1_TYPE_UTF8_STRING) + { + if (!isset($this->stringTypeSize[$from]) || !isset($this->stringTypeSize[$to])) { + return false; + } + $insize = $this->stringTypeSize[$from]; + $outsize = $this->stringTypeSize[$to]; + $inlength = strlen($in); + $out = ''; + + for ($i = 0; $i < $inlength;) { + if ($inlength - $i < $insize) { + return false; + } + + // Get an input character as a 32-bit value. + $c = ord($in[$i++]); + switch (true) { + case $insize == 4: + $c = ($c << 8) | ord($in[$i++]); + $c = ($c << 8) | ord($in[$i++]); + case $insize == 2: + $c = ($c << 8) | ord($in[$i++]); + case $insize == 1: + break; + case ($c & 0x80) == 0x00: + break; + case ($c & 0x40) == 0x00: + return false; + default: + $bit = 6; + do { + if ($bit > 25 || $i >= $inlength || (ord($in[$i]) & 0xC0) != 0x80) { + return false; + } + $c = ($c << 6) | (ord($in[$i++]) & 0x3F); + $bit += 5; + $mask = 1 << $bit; + } while ($c & $bit); + $c &= $mask - 1; + break; + } + + // Convert and append the character to output string. + $v = ''; + switch (true) { + case $outsize == 4: + $v .= chr($c & 0xFF); + $c >>= 8; + $v .= chr($c & 0xFF); + $c >>= 8; + case $outsize == 2: + $v .= chr($c & 0xFF); + $c >>= 8; + case $outsize == 1: + $v .= chr($c & 0xFF); + $c >>= 8; + if ($c) { + return false; + } + break; + case ($c & 0x80000000) != 0: + return false; + case $c >= 0x04000000: + $v .= chr(0x80 | ($c & 0x3F)); + $c = ($c >> 6) | 0x04000000; + case $c >= 0x00200000: + $v .= chr(0x80 | ($c & 0x3F)); + $c = ($c >> 6) | 0x00200000; + case $c >= 0x00010000: + $v .= chr(0x80 | ($c & 0x3F)); + $c = ($c >> 6) | 0x00010000; + case $c >= 0x00000800: + $v .= chr(0x80 | ($c & 0x3F)); + $c = ($c >> 6) | 0x00000800; + case $c >= 0x00000080: + $v .= chr(0x80 | ($c & 0x3F)); + $c = ($c >> 6) | 0x000000C0; + default: + $v .= chr($c); + break; + } + $out .= strrev($v); + } + return $out; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/X509.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/X509.php new file mode 100755 index 00000000..36a6287b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/X509.php @@ -0,0 +1,4583 @@ + + * @copyright 2012 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include File_ASN1 + */ +if (!class_exists('File_ASN1')) { + include_once 'ASN1.php'; +} + +/** + * Flag to only accept signatures signed by certificate authorities + * + * Not really used anymore but retained all the same to suppress E_NOTICEs from old installs + * + * @access public + */ +define('FILE_X509_VALIDATE_SIGNATURE_BY_CA', 1); + +/**#@+ + * @access public + * @see File_X509::getDN() + */ +/** + * Return internal array representation + */ +define('FILE_X509_DN_ARRAY', 0); +/** + * Return string + */ +define('FILE_X509_DN_STRING', 1); +/** + * Return ASN.1 name string + */ +define('FILE_X509_DN_ASN1', 2); +/** + * Return OpenSSL compatible array + */ +define('FILE_X509_DN_OPENSSL', 3); +/** + * Return canonical ASN.1 RDNs string + */ +define('FILE_X509_DN_CANON', 4); +/** + * Return name hash for file indexing + */ +define('FILE_X509_DN_HASH', 5); +/**#@-*/ + +/**#@+ + * @access public + * @see File_X509::saveX509() + * @see File_X509::saveCSR() + * @see File_X509::saveCRL() + */ +/** + * Save as PEM + * + * ie. a base64-encoded PEM with a header and a footer + */ +define('FILE_X509_FORMAT_PEM', 0); +/** + * Save as DER + */ +define('FILE_X509_FORMAT_DER', 1); +/** + * Save as a SPKAC + * + * Only works on CSRs. Not currently supported. + */ +define('FILE_X509_FORMAT_SPKAC', 2); +/**#@-*/ + +/** + * Attribute value disposition. + * If disposition is >= 0, this is the index of the target value. + */ +define('FILE_X509_ATTR_ALL', -1); // All attribute values (array). +define('FILE_X509_ATTR_APPEND', -2); // Add a value. +define('FILE_X509_ATTR_REPLACE', -3); // Clear first, then add a value. + +/** + * Pure-PHP X.509 Parser + * + * @package File_X509 + * @author Jim Wigginton + * @access public + */ +class File_X509 +{ + /** + * ASN.1 syntax for X.509 certificates + * + * @var Array + * @access private + */ + var $Certificate; + + /**#@+ + * ASN.1 syntax for various extensions + * + * @access private + */ + var $DirectoryString; + var $PKCS9String; + var $AttributeValue; + var $Extensions; + var $KeyUsage; + var $ExtKeyUsageSyntax; + var $BasicConstraints; + var $KeyIdentifier; + var $CRLDistributionPoints; + var $AuthorityKeyIdentifier; + var $CertificatePolicies; + var $AuthorityInfoAccessSyntax; + var $SubjectAltName; + var $PrivateKeyUsagePeriod; + var $IssuerAltName; + var $PolicyMappings; + var $NameConstraints; + + var $CPSuri; + var $UserNotice; + + var $netscape_cert_type; + var $netscape_comment; + var $netscape_ca_policy_url; + + var $Name; + var $RelativeDistinguishedName; + var $CRLNumber; + var $CRLReason; + var $IssuingDistributionPoint; + var $InvalidityDate; + var $CertificateIssuer; + var $HoldInstructionCode; + var $SignedPublicKeyAndChallenge; + /**#@-*/ + + /** + * ASN.1 syntax for Certificate Signing Requests (RFC2986) + * + * @var Array + * @access private + */ + var $CertificationRequest; + + /** + * ASN.1 syntax for Certificate Revocation Lists (RFC5280) + * + * @var Array + * @access private + */ + var $CertificateList; + + /** + * Distinguished Name + * + * @var Array + * @access private + */ + var $dn; + + /** + * Public key + * + * @var String + * @access private + */ + var $publicKey; + + /** + * Private key + * + * @var String + * @access private + */ + var $privateKey; + + /** + * Object identifiers for X.509 certificates + * + * @var Array + * @access private + * @link http://en.wikipedia.org/wiki/Object_identifier + */ + var $oids; + + /** + * The certificate authorities + * + * @var Array + * @access private + */ + var $CAs; + + /** + * The currently loaded certificate + * + * @var Array + * @access private + */ + var $currentCert; + + /** + * The signature subject + * + * There's no guarantee File_X509 is going to reencode an X.509 cert in the same way it was originally + * encoded so we take save the portion of the original cert that the signature would have made for. + * + * @var String + * @access private + */ + var $signatureSubject; + + /** + * Certificate Start Date + * + * @var String + * @access private + */ + var $startDate; + + /** + * Certificate End Date + * + * @var String + * @access private + */ + var $endDate; + + /** + * Serial Number + * + * @var String + * @access private + */ + var $serialNumber; + + /** + * Key Identifier + * + * See {@link http://tools.ietf.org/html/rfc5280#section-4.2.1.1 RFC5280#section-4.2.1.1} and + * {@link http://tools.ietf.org/html/rfc5280#section-4.2.1.2 RFC5280#section-4.2.1.2}. + * + * @var String + * @access private + */ + var $currentKeyIdentifier; + + /** + * CA Flag + * + * @var Boolean + * @access private + */ + var $caFlag = false; + + /** + * SPKAC Challenge + * + * @var String + * @access private + */ + var $challenge; + + /** + * Default Constructor. + * + * @return File_X509 + * @access public + */ + function File_X509() + { + if (!class_exists('Math_BigInteger')) { + include_once 'Math/BigInteger.php'; + } + + // Explicitly Tagged Module, 1988 Syntax + // http://tools.ietf.org/html/rfc5280#appendix-A.1 + + $this->DirectoryString = array( + 'type' => FILE_ASN1_TYPE_CHOICE, + 'children' => array( + 'teletexString' => array('type' => FILE_ASN1_TYPE_TELETEX_STRING), + 'printableString' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING), + 'universalString' => array('type' => FILE_ASN1_TYPE_UNIVERSAL_STRING), + 'utf8String' => array('type' => FILE_ASN1_TYPE_UTF8_STRING), + 'bmpString' => array('type' => FILE_ASN1_TYPE_BMP_STRING) + ) + ); + + $this->PKCS9String = array( + 'type' => FILE_ASN1_TYPE_CHOICE, + 'children' => array( + 'ia5String' => array('type' => FILE_ASN1_TYPE_IA5_STRING), + 'directoryString' => $this->DirectoryString + ) + ); + + $this->AttributeValue = array('type' => FILE_ASN1_TYPE_ANY); + + $AttributeType = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER); + + $AttributeTypeAndValue = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'type' => $AttributeType, + 'value'=> $this->AttributeValue + ) + ); + + /* + In practice, RDNs containing multiple name-value pairs (called "multivalued RDNs") are rare, + but they can be useful at times when either there is no unique attribute in the entry or you + want to ensure that the entry's DN contains some useful identifying information. + + - https://www.opends.org/wiki/page/DefinitionRelativeDistinguishedName + */ + $this->RelativeDistinguishedName = array( + 'type' => FILE_ASN1_TYPE_SET, + 'min' => 1, + 'max' => -1, + 'children' => $AttributeTypeAndValue + ); + + // http://tools.ietf.org/html/rfc5280#section-4.1.2.4 + $RDNSequence = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + // RDNSequence does not define a min or a max, which means it doesn't have one + 'min' => 0, + 'max' => -1, + 'children' => $this->RelativeDistinguishedName + ); + + $this->Name = array( + 'type' => FILE_ASN1_TYPE_CHOICE, + 'children' => array( + 'rdnSequence' => $RDNSequence + ) + ); + + // http://tools.ietf.org/html/rfc5280#section-4.1.1.2 + $AlgorithmIdentifier = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'algorithm' => array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER), + 'parameters' => array( + 'type' => FILE_ASN1_TYPE_ANY, + 'optional' => true + ) + ) + ); + + /* + A certificate using system MUST reject the certificate if it encounters + a critical extension it does not recognize; however, a non-critical + extension may be ignored if it is not recognized. + + http://tools.ietf.org/html/rfc5280#section-4.2 + */ + $Extension = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'extnId' => array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER), + 'critical' => array( + 'type' => FILE_ASN1_TYPE_BOOLEAN, + 'optional' => true, + 'default' => false + ), + 'extnValue' => array('type' => FILE_ASN1_TYPE_OCTET_STRING) + ) + ); + + $this->Extensions = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + // technically, it's MAX, but we'll assume anything < 0 is MAX + 'max' => -1, + // if 'children' isn't an array then 'min' and 'max' must be defined + 'children' => $Extension + ); + + $SubjectPublicKeyInfo = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'algorithm' => $AlgorithmIdentifier, + 'subjectPublicKey' => array('type' => FILE_ASN1_TYPE_BIT_STRING) + ) + ); + + $UniqueIdentifier = array('type' => FILE_ASN1_TYPE_BIT_STRING); + + $Time = array( + 'type' => FILE_ASN1_TYPE_CHOICE, + 'children' => array( + 'utcTime' => array('type' => FILE_ASN1_TYPE_UTC_TIME), + 'generalTime' => array('type' => FILE_ASN1_TYPE_GENERALIZED_TIME) + ) + ); + + // http://tools.ietf.org/html/rfc5280#section-4.1.2.5 + $Validity = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'notBefore' => $Time, + 'notAfter' => $Time + ) + ); + + $CertificateSerialNumber = array('type' => FILE_ASN1_TYPE_INTEGER); + + $Version = array( + 'type' => FILE_ASN1_TYPE_INTEGER, + 'mapping' => array('v1', 'v2', 'v3') + ); + + // assert($TBSCertificate['children']['signature'] == $Certificate['children']['signatureAlgorithm']) + $TBSCertificate = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + // technically, default implies optional, but we'll define it as being optional, none-the-less, just to + // reenforce that fact + 'version' => array( + 'constant' => 0, + 'optional' => true, + 'explicit' => true, + 'default' => 'v1' + ) + $Version, + 'serialNumber' => $CertificateSerialNumber, + 'signature' => $AlgorithmIdentifier, + 'issuer' => $this->Name, + 'validity' => $Validity, + 'subject' => $this->Name, + 'subjectPublicKeyInfo' => $SubjectPublicKeyInfo, + // implicit means that the T in the TLV structure is to be rewritten, regardless of the type + 'issuerUniqueID' => array( + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ) + $UniqueIdentifier, + 'subjectUniqueID' => array( + 'constant' => 2, + 'optional' => true, + 'implicit' => true + ) + $UniqueIdentifier, + // doesn't use the EXPLICIT keyword but if + // it's not IMPLICIT, it's EXPLICIT + 'extensions' => array( + 'constant' => 3, + 'optional' => true, + 'explicit' => true + ) + $this->Extensions + ) + ); + + $this->Certificate = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'tbsCertificate' => $TBSCertificate, + 'signatureAlgorithm' => $AlgorithmIdentifier, + 'signature' => array('type' => FILE_ASN1_TYPE_BIT_STRING) + ) + ); + + $this->KeyUsage = array( + 'type' => FILE_ASN1_TYPE_BIT_STRING, + 'mapping' => array( + 'digitalSignature', + 'nonRepudiation', + 'keyEncipherment', + 'dataEncipherment', + 'keyAgreement', + 'keyCertSign', + 'cRLSign', + 'encipherOnly', + 'decipherOnly' + ) + ); + + $this->BasicConstraints = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'cA' => array( + 'type' => FILE_ASN1_TYPE_BOOLEAN, + 'optional' => true, + 'default' => false + ), + 'pathLenConstraint' => array( + 'type' => FILE_ASN1_TYPE_INTEGER, + 'optional' => true + ) + ) + ); + + $this->KeyIdentifier = array('type' => FILE_ASN1_TYPE_OCTET_STRING); + + $OrganizationalUnitNames = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + 'max' => 4, // ub-organizational-units + 'children' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING) + ); + + $PersonalName = array( + 'type' => FILE_ASN1_TYPE_SET, + 'children' => array( + 'surname' => array( + 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING, + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ), + 'given-name' => array( + 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING, + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ), + 'initials' => array( + 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING, + 'constant' => 2, + 'optional' => true, + 'implicit' => true + ), + 'generation-qualifier' => array( + 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING, + 'constant' => 3, + 'optional' => true, + 'implicit' => true + ) + ) + ); + + $NumericUserIdentifier = array('type' => FILE_ASN1_TYPE_NUMERIC_STRING); + + $OrganizationName = array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING); + + $PrivateDomainName = array( + 'type' => FILE_ASN1_TYPE_CHOICE, + 'children' => array( + 'numeric' => array('type' => FILE_ASN1_TYPE_NUMERIC_STRING), + 'printable' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING) + ) + ); + + $TerminalIdentifier = array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING); + + $NetworkAddress = array('type' => FILE_ASN1_TYPE_NUMERIC_STRING); + + $AdministrationDomainName = array( + 'type' => FILE_ASN1_TYPE_CHOICE, + // if class isn't present it's assumed to be FILE_ASN1_CLASS_UNIVERSAL or + // (if constant is present) FILE_ASN1_CLASS_CONTEXT_SPECIFIC + 'class' => FILE_ASN1_CLASS_APPLICATION, + 'cast' => 2, + 'children' => array( + 'numeric' => array('type' => FILE_ASN1_TYPE_NUMERIC_STRING), + 'printable' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING) + ) + ); + + $CountryName = array( + 'type' => FILE_ASN1_TYPE_CHOICE, + // if class isn't present it's assumed to be FILE_ASN1_CLASS_UNIVERSAL or + // (if constant is present) FILE_ASN1_CLASS_CONTEXT_SPECIFIC + 'class' => FILE_ASN1_CLASS_APPLICATION, + 'cast' => 1, + 'children' => array( + 'x121-dcc-code' => array('type' => FILE_ASN1_TYPE_NUMERIC_STRING), + 'iso-3166-alpha2-code' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING) + ) + ); + + $AnotherName = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'type-id' => array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER), + 'value' => array( + 'type' => FILE_ASN1_TYPE_ANY, + 'constant' => 0, + 'optional' => true, + 'explicit' => true + ) + ) + ); + + $ExtensionAttribute = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'extension-attribute-type' => array( + 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING, + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ), + 'extension-attribute-value' => array( + 'type' => FILE_ASN1_TYPE_ANY, + 'constant' => 1, + 'optional' => true, + 'explicit' => true + ) + ) + ); + + $ExtensionAttributes = array( + 'type' => FILE_ASN1_TYPE_SET, + 'min' => 1, + 'max' => 256, // ub-extension-attributes + 'children' => $ExtensionAttribute + ); + + $BuiltInDomainDefinedAttribute = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'type' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING), + 'value' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING) + ) + ); + + $BuiltInDomainDefinedAttributes = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + 'max' => 4, // ub-domain-defined-attributes + 'children' => $BuiltInDomainDefinedAttribute + ); + + $BuiltInStandardAttributes = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'country-name' => array('optional' => true) + $CountryName, + 'administration-domain-name' => array('optional' => true) + $AdministrationDomainName, + 'network-address' => array( + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ) + $NetworkAddress, + 'terminal-identifier' => array( + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ) + $TerminalIdentifier, + 'private-domain-name' => array( + 'constant' => 2, + 'optional' => true, + 'explicit' => true + ) + $PrivateDomainName, + 'organization-name' => array( + 'constant' => 3, + 'optional' => true, + 'implicit' => true + ) + $OrganizationName, + 'numeric-user-identifier' => array( + 'constant' => 4, + 'optional' => true, + 'implicit' => true + ) + $NumericUserIdentifier, + 'personal-name' => array( + 'constant' => 5, + 'optional' => true, + 'implicit' => true + ) + $PersonalName, + 'organizational-unit-names' => array( + 'constant' => 6, + 'optional' => true, + 'implicit' => true + ) + $OrganizationalUnitNames + ) + ); + + $ORAddress = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'built-in-standard-attributes' => $BuiltInStandardAttributes, + 'built-in-domain-defined-attributes' => array('optional' => true) + $BuiltInDomainDefinedAttributes, + 'extension-attributes' => array('optional' => true) + $ExtensionAttributes + ) + ); + + $EDIPartyName = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'nameAssigner' => array( + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ) + $this->DirectoryString, + // partyName is technically required but File_ASN1 doesn't currently support non-optional constants and + // setting it to optional gets the job done in any event. + 'partyName' => array( + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ) + $this->DirectoryString + ) + ); + + $GeneralName = array( + 'type' => FILE_ASN1_TYPE_CHOICE, + 'children' => array( + 'otherName' => array( + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ) + $AnotherName, + 'rfc822Name' => array( + 'type' => FILE_ASN1_TYPE_IA5_STRING, + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ), + 'dNSName' => array( + 'type' => FILE_ASN1_TYPE_IA5_STRING, + 'constant' => 2, + 'optional' => true, + 'implicit' => true + ), + 'x400Address' => array( + 'constant' => 3, + 'optional' => true, + 'implicit' => true + ) + $ORAddress, + 'directoryName' => array( + 'constant' => 4, + 'optional' => true, + 'explicit' => true + ) + $this->Name, + 'ediPartyName' => array( + 'constant' => 5, + 'optional' => true, + 'implicit' => true + ) + $EDIPartyName, + 'uniformResourceIdentifier' => array( + 'type' => FILE_ASN1_TYPE_IA5_STRING, + 'constant' => 6, + 'optional' => true, + 'implicit' => true + ), + 'iPAddress' => array( + 'type' => FILE_ASN1_TYPE_OCTET_STRING, + 'constant' => 7, + 'optional' => true, + 'implicit' => true + ), + 'registeredID' => array( + 'type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER, + 'constant' => 8, + 'optional' => true, + 'implicit' => true + ) + ) + ); + + $GeneralNames = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => $GeneralName + ); + + $this->IssuerAltName = $GeneralNames; + + $ReasonFlags = array( + 'type' => FILE_ASN1_TYPE_BIT_STRING, + 'mapping' => array( + 'unused', + 'keyCompromise', + 'cACompromise', + 'affiliationChanged', + 'superseded', + 'cessationOfOperation', + 'certificateHold', + 'privilegeWithdrawn', + 'aACompromise' + ) + ); + + $DistributionPointName = array( + 'type' => FILE_ASN1_TYPE_CHOICE, + 'children' => array( + 'fullName' => array( + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ) + $GeneralNames, + 'nameRelativeToCRLIssuer' => array( + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ) + $this->RelativeDistinguishedName + ) + ); + + $DistributionPoint = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'distributionPoint' => array( + 'constant' => 0, + 'optional' => true, + 'explicit' => true + ) + $DistributionPointName, + 'reasons' => array( + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ) + $ReasonFlags, + 'cRLIssuer' => array( + 'constant' => 2, + 'optional' => true, + 'implicit' => true + ) + $GeneralNames + ) + ); + + $this->CRLDistributionPoints = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => $DistributionPoint + ); + + $this->AuthorityKeyIdentifier = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'keyIdentifier' => array( + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ) + $this->KeyIdentifier, + 'authorityCertIssuer' => array( + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ) + $GeneralNames, + 'authorityCertSerialNumber' => array( + 'constant' => 2, + 'optional' => true, + 'implicit' => true + ) + $CertificateSerialNumber + ) + ); + + $PolicyQualifierId = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER); + + $PolicyQualifierInfo = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'policyQualifierId' => $PolicyQualifierId, + 'qualifier' => array('type' => FILE_ASN1_TYPE_ANY) + ) + ); + + $CertPolicyId = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER); + + $PolicyInformation = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'policyIdentifier' => $CertPolicyId, + 'policyQualifiers' => array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 0, + 'max' => -1, + 'optional' => true, + 'children' => $PolicyQualifierInfo + ) + ) + ); + + $this->CertificatePolicies = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => $PolicyInformation + ); + + $this->PolicyMappings = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'issuerDomainPolicy' => $CertPolicyId, + 'subjectDomainPolicy' => $CertPolicyId + ) + ) + ); + + $KeyPurposeId = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER); + + $this->ExtKeyUsageSyntax = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => $KeyPurposeId + ); + + $AccessDescription = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'accessMethod' => array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER), + 'accessLocation' => $GeneralName + ) + ); + + $this->AuthorityInfoAccessSyntax = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => $AccessDescription + ); + + $this->SubjectAltName = $GeneralNames; + + $this->PrivateKeyUsagePeriod = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'notBefore' => array( + 'constant' => 0, + 'optional' => true, + 'implicit' => true, + 'type' => FILE_ASN1_TYPE_GENERALIZED_TIME), + 'notAfter' => array( + 'constant' => 1, + 'optional' => true, + 'implicit' => true, + 'type' => FILE_ASN1_TYPE_GENERALIZED_TIME) + ) + ); + + $BaseDistance = array('type' => FILE_ASN1_TYPE_INTEGER); + + $GeneralSubtree = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'base' => $GeneralName, + 'minimum' => array( + 'constant' => 0, + 'optional' => true, + 'implicit' => true, + 'default' => new Math_BigInteger(0) + ) + $BaseDistance, + 'maximum' => array( + 'constant' => 1, + 'optional' => true, + 'implicit' => true, + ) + $BaseDistance + ) + ); + + $GeneralSubtrees = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => $GeneralSubtree + ); + + $this->NameConstraints = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'permittedSubtrees' => array( + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ) + $GeneralSubtrees, + 'excludedSubtrees' => array( + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ) + $GeneralSubtrees + ) + ); + + $this->CPSuri = array('type' => FILE_ASN1_TYPE_IA5_STRING); + + $DisplayText = array( + 'type' => FILE_ASN1_TYPE_CHOICE, + 'children' => array( + 'ia5String' => array('type' => FILE_ASN1_TYPE_IA5_STRING), + 'visibleString' => array('type' => FILE_ASN1_TYPE_VISIBLE_STRING), + 'bmpString' => array('type' => FILE_ASN1_TYPE_BMP_STRING), + 'utf8String' => array('type' => FILE_ASN1_TYPE_UTF8_STRING) + ) + ); + + $NoticeReference = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'organization' => $DisplayText, + 'noticeNumbers' => array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + 'max' => 200, + 'children' => array('type' => FILE_ASN1_TYPE_INTEGER) + ) + ) + ); + + $this->UserNotice = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'noticeRef' => array( + 'optional' => true, + 'implicit' => true + ) + $NoticeReference, + 'explicitText' => array( + 'optional' => true, + 'implicit' => true + ) + $DisplayText + ) + ); + + // mapping is from + $this->netscape_cert_type = array( + 'type' => FILE_ASN1_TYPE_BIT_STRING, + 'mapping' => array( + 'SSLClient', + 'SSLServer', + 'Email', + 'ObjectSigning', + 'Reserved', + 'SSLCA', + 'EmailCA', + 'ObjectSigningCA' + ) + ); + + $this->netscape_comment = array('type' => FILE_ASN1_TYPE_IA5_STRING); + $this->netscape_ca_policy_url = array('type' => FILE_ASN1_TYPE_IA5_STRING); + + // attribute is used in RFC2986 but we're using the RFC5280 definition + + $Attribute = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'type' => $AttributeType, + 'value'=> array( + 'type' => FILE_ASN1_TYPE_SET, + 'min' => 1, + 'max' => -1, + 'children' => $this->AttributeValue + ) + ) + ); + + // adapted from + + $Attributes = array( + 'type' => FILE_ASN1_TYPE_SET, + 'min' => 1, + 'max' => -1, + 'children' => $Attribute + ); + + $CertificationRequestInfo = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'version' => array( + 'type' => FILE_ASN1_TYPE_INTEGER, + 'mapping' => array('v1') + ), + 'subject' => $this->Name, + 'subjectPKInfo' => $SubjectPublicKeyInfo, + 'attributes' => array( + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ) + $Attributes, + ) + ); + + $this->CertificationRequest = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'certificationRequestInfo' => $CertificationRequestInfo, + 'signatureAlgorithm' => $AlgorithmIdentifier, + 'signature' => array('type' => FILE_ASN1_TYPE_BIT_STRING) + ) + ); + + $RevokedCertificate = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'userCertificate' => $CertificateSerialNumber, + 'revocationDate' => $Time, + 'crlEntryExtensions' => array( + 'optional' => true + ) + $this->Extensions + ) + ); + + $TBSCertList = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'version' => array( + 'optional' => true, + 'default' => 'v1' + ) + $Version, + 'signature' => $AlgorithmIdentifier, + 'issuer' => $this->Name, + 'thisUpdate' => $Time, + 'nextUpdate' => array( + 'optional' => true + ) + $Time, + 'revokedCertificates' => array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'optional' => true, + 'min' => 0, + 'max' => -1, + 'children' => $RevokedCertificate + ), + 'crlExtensions' => array( + 'constant' => 0, + 'optional' => true, + 'explicit' => true + ) + $this->Extensions + ) + ); + + $this->CertificateList = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'tbsCertList' => $TBSCertList, + 'signatureAlgorithm' => $AlgorithmIdentifier, + 'signature' => array('type' => FILE_ASN1_TYPE_BIT_STRING) + ) + ); + + $this->CRLNumber = array('type' => FILE_ASN1_TYPE_INTEGER); + + $this->CRLReason = array('type' => FILE_ASN1_TYPE_ENUMERATED, + 'mapping' => array( + 'unspecified', + 'keyCompromise', + 'cACompromise', + 'affiliationChanged', + 'superseded', + 'cessationOfOperation', + 'certificateHold', + // Value 7 is not used. + 8 => 'removeFromCRL', + 'privilegeWithdrawn', + 'aACompromise' + ) + ); + + $this->IssuingDistributionPoint = array('type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'distributionPoint' => array( + 'constant' => 0, + 'optional' => true, + 'explicit' => true + ) + $DistributionPointName, + 'onlyContainsUserCerts' => array( + 'type' => FILE_ASN1_TYPE_BOOLEAN, + 'constant' => 1, + 'optional' => true, + 'default' => false, + 'implicit' => true + ), + 'onlyContainsCACerts' => array( + 'type' => FILE_ASN1_TYPE_BOOLEAN, + 'constant' => 2, + 'optional' => true, + 'default' => false, + 'implicit' => true + ), + 'onlySomeReasons' => array( + 'constant' => 3, + 'optional' => true, + 'implicit' => true + ) + $ReasonFlags, + 'indirectCRL' => array( + 'type' => FILE_ASN1_TYPE_BOOLEAN, + 'constant' => 4, + 'optional' => true, + 'default' => false, + 'implicit' => true + ), + 'onlyContainsAttributeCerts' => array( + 'type' => FILE_ASN1_TYPE_BOOLEAN, + 'constant' => 5, + 'optional' => true, + 'default' => false, + 'implicit' => true + ) + ) + ); + + $this->InvalidityDate = array('type' => FILE_ASN1_TYPE_GENERALIZED_TIME); + + $this->CertificateIssuer = $GeneralNames; + + $this->HoldInstructionCode = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER); + + $PublicKeyAndChallenge = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'spki' => $SubjectPublicKeyInfo, + 'challenge' => array('type' => FILE_ASN1_TYPE_IA5_STRING) + ) + ); + + $this->SignedPublicKeyAndChallenge = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'publicKeyAndChallenge' => $PublicKeyAndChallenge, + 'signatureAlgorithm' => $AlgorithmIdentifier, + 'signature' => array('type' => FILE_ASN1_TYPE_BIT_STRING) + ) + ); + + // OIDs from RFC5280 and those RFCs mentioned in RFC5280#section-4.1.1.2 + $this->oids = array( + '1.3.6.1.5.5.7' => 'id-pkix', + '1.3.6.1.5.5.7.1' => 'id-pe', + '1.3.6.1.5.5.7.2' => 'id-qt', + '1.3.6.1.5.5.7.3' => 'id-kp', + '1.3.6.1.5.5.7.48' => 'id-ad', + '1.3.6.1.5.5.7.2.1' => 'id-qt-cps', + '1.3.6.1.5.5.7.2.2' => 'id-qt-unotice', + '1.3.6.1.5.5.7.48.1' =>'id-ad-ocsp', + '1.3.6.1.5.5.7.48.2' => 'id-ad-caIssuers', + '1.3.6.1.5.5.7.48.3' => 'id-ad-timeStamping', + '1.3.6.1.5.5.7.48.5' => 'id-ad-caRepository', + '2.5.4' => 'id-at', + '2.5.4.41' => 'id-at-name', + '2.5.4.4' => 'id-at-surname', + '2.5.4.42' => 'id-at-givenName', + '2.5.4.43' => 'id-at-initials', + '2.5.4.44' => 'id-at-generationQualifier', + '2.5.4.3' => 'id-at-commonName', + '2.5.4.7' => 'id-at-localityName', + '2.5.4.8' => 'id-at-stateOrProvinceName', + '2.5.4.10' => 'id-at-organizationName', + '2.5.4.11' => 'id-at-organizationalUnitName', + '2.5.4.12' => 'id-at-title', + '2.5.4.13' => 'id-at-description', + '2.5.4.46' => 'id-at-dnQualifier', + '2.5.4.6' => 'id-at-countryName', + '2.5.4.5' => 'id-at-serialNumber', + '2.5.4.65' => 'id-at-pseudonym', + '2.5.4.17' => 'id-at-postalCode', + '2.5.4.9' => 'id-at-streetAddress', + '2.5.4.45' => 'id-at-uniqueIdentifier', + '2.5.4.72' => 'id-at-role', + + '0.9.2342.19200300.100.1.25' => 'id-domainComponent', + '1.2.840.113549.1.9' => 'pkcs-9', + '1.2.840.113549.1.9.1' => 'pkcs-9-at-emailAddress', + '2.5.29' => 'id-ce', + '2.5.29.35' => 'id-ce-authorityKeyIdentifier', + '2.5.29.14' => 'id-ce-subjectKeyIdentifier', + '2.5.29.15' => 'id-ce-keyUsage', + '2.5.29.16' => 'id-ce-privateKeyUsagePeriod', + '2.5.29.32' => 'id-ce-certificatePolicies', + '2.5.29.32.0' => 'anyPolicy', + + '2.5.29.33' => 'id-ce-policyMappings', + '2.5.29.17' => 'id-ce-subjectAltName', + '2.5.29.18' => 'id-ce-issuerAltName', + '2.5.29.9' => 'id-ce-subjectDirectoryAttributes', + '2.5.29.19' => 'id-ce-basicConstraints', + '2.5.29.30' => 'id-ce-nameConstraints', + '2.5.29.36' => 'id-ce-policyConstraints', + '2.5.29.31' => 'id-ce-cRLDistributionPoints', + '2.5.29.37' => 'id-ce-extKeyUsage', + '2.5.29.37.0' => 'anyExtendedKeyUsage', + '1.3.6.1.5.5.7.3.1' => 'id-kp-serverAuth', + '1.3.6.1.5.5.7.3.2' => 'id-kp-clientAuth', + '1.3.6.1.5.5.7.3.3' => 'id-kp-codeSigning', + '1.3.6.1.5.5.7.3.4' => 'id-kp-emailProtection', + '1.3.6.1.5.5.7.3.8' => 'id-kp-timeStamping', + '1.3.6.1.5.5.7.3.9' => 'id-kp-OCSPSigning', + '2.5.29.54' => 'id-ce-inhibitAnyPolicy', + '2.5.29.46' => 'id-ce-freshestCRL', + '1.3.6.1.5.5.7.1.1' => 'id-pe-authorityInfoAccess', + '1.3.6.1.5.5.7.1.11' => 'id-pe-subjectInfoAccess', + '2.5.29.20' => 'id-ce-cRLNumber', + '2.5.29.28' => 'id-ce-issuingDistributionPoint', + '2.5.29.27' => 'id-ce-deltaCRLIndicator', + '2.5.29.21' => 'id-ce-cRLReasons', + '2.5.29.29' => 'id-ce-certificateIssuer', + '2.5.29.23' => 'id-ce-holdInstructionCode', + '1.2.840.10040.2' => 'holdInstruction', + '1.2.840.10040.2.1' => 'id-holdinstruction-none', + '1.2.840.10040.2.2' => 'id-holdinstruction-callissuer', + '1.2.840.10040.2.3' => 'id-holdinstruction-reject', + '2.5.29.24' => 'id-ce-invalidityDate', + + '1.2.840.113549.2.2' => 'md2', + '1.2.840.113549.2.5' => 'md5', + '1.3.14.3.2.26' => 'id-sha1', + '1.2.840.10040.4.1' => 'id-dsa', + '1.2.840.10040.4.3' => 'id-dsa-with-sha1', + '1.2.840.113549.1.1' => 'pkcs-1', + '1.2.840.113549.1.1.1' => 'rsaEncryption', + '1.2.840.113549.1.1.2' => 'md2WithRSAEncryption', + '1.2.840.113549.1.1.4' => 'md5WithRSAEncryption', + '1.2.840.113549.1.1.5' => 'sha1WithRSAEncryption', + '1.2.840.10046.2.1' => 'dhpublicnumber', + '2.16.840.1.101.2.1.1.22' => 'id-keyExchangeAlgorithm', + '1.2.840.10045' => 'ansi-X9-62', + '1.2.840.10045.4' => 'id-ecSigType', + '1.2.840.10045.4.1' => 'ecdsa-with-SHA1', + '1.2.840.10045.1' => 'id-fieldType', + '1.2.840.10045.1.1' => 'prime-field', + '1.2.840.10045.1.2' => 'characteristic-two-field', + '1.2.840.10045.1.2.3' => 'id-characteristic-two-basis', + '1.2.840.10045.1.2.3.1' => 'gnBasis', + '1.2.840.10045.1.2.3.2' => 'tpBasis', + '1.2.840.10045.1.2.3.3' => 'ppBasis', + '1.2.840.10045.2' => 'id-publicKeyType', + '1.2.840.10045.2.1' => 'id-ecPublicKey', + '1.2.840.10045.3' => 'ellipticCurve', + '1.2.840.10045.3.0' => 'c-TwoCurve', + '1.2.840.10045.3.0.1' => 'c2pnb163v1', + '1.2.840.10045.3.0.2' => 'c2pnb163v2', + '1.2.840.10045.3.0.3' => 'c2pnb163v3', + '1.2.840.10045.3.0.4' => 'c2pnb176w1', + '1.2.840.10045.3.0.5' => 'c2pnb191v1', + '1.2.840.10045.3.0.6' => 'c2pnb191v2', + '1.2.840.10045.3.0.7' => 'c2pnb191v3', + '1.2.840.10045.3.0.8' => 'c2pnb191v4', + '1.2.840.10045.3.0.9' => 'c2pnb191v5', + '1.2.840.10045.3.0.10' => 'c2pnb208w1', + '1.2.840.10045.3.0.11' => 'c2pnb239v1', + '1.2.840.10045.3.0.12' => 'c2pnb239v2', + '1.2.840.10045.3.0.13' => 'c2pnb239v3', + '1.2.840.10045.3.0.14' => 'c2pnb239v4', + '1.2.840.10045.3.0.15' => 'c2pnb239v5', + '1.2.840.10045.3.0.16' => 'c2pnb272w1', + '1.2.840.10045.3.0.17' => 'c2pnb304w1', + '1.2.840.10045.3.0.18' => 'c2pnb359v1', + '1.2.840.10045.3.0.19' => 'c2pnb368w1', + '1.2.840.10045.3.0.20' => 'c2pnb431r1', + '1.2.840.10045.3.1' => 'primeCurve', + '1.2.840.10045.3.1.1' => 'prime192v1', + '1.2.840.10045.3.1.2' => 'prime192v2', + '1.2.840.10045.3.1.3' => 'prime192v3', + '1.2.840.10045.3.1.4' => 'prime239v1', + '1.2.840.10045.3.1.5' => 'prime239v2', + '1.2.840.10045.3.1.6' => 'prime239v3', + '1.2.840.10045.3.1.7' => 'prime256v1', + '1.2.840.113549.1.1.7' => 'id-RSAES-OAEP', + '1.2.840.113549.1.1.9' => 'id-pSpecified', + '1.2.840.113549.1.1.10' => 'id-RSASSA-PSS', + '1.2.840.113549.1.1.8' => 'id-mgf1', + '1.2.840.113549.1.1.14' => 'sha224WithRSAEncryption', + '1.2.840.113549.1.1.11' => 'sha256WithRSAEncryption', + '1.2.840.113549.1.1.12' => 'sha384WithRSAEncryption', + '1.2.840.113549.1.1.13' => 'sha512WithRSAEncryption', + '2.16.840.1.101.3.4.2.4' => 'id-sha224', + '2.16.840.1.101.3.4.2.1' => 'id-sha256', + '2.16.840.1.101.3.4.2.2' => 'id-sha384', + '2.16.840.1.101.3.4.2.3' => 'id-sha512', + '1.2.643.2.2.4' => 'id-GostR3411-94-with-GostR3410-94', + '1.2.643.2.2.3' => 'id-GostR3411-94-with-GostR3410-2001', + '1.2.643.2.2.20' => 'id-GostR3410-2001', + '1.2.643.2.2.19' => 'id-GostR3410-94', + // Netscape Object Identifiers from "Netscape Certificate Extensions" + '2.16.840.1.113730' => 'netscape', + '2.16.840.1.113730.1' => 'netscape-cert-extension', + '2.16.840.1.113730.1.1' => 'netscape-cert-type', + '2.16.840.1.113730.1.13' => 'netscape-comment', + '2.16.840.1.113730.1.8' => 'netscape-ca-policy-url', + // the following are X.509 extensions not supported by phpseclib + '1.3.6.1.5.5.7.1.12' => 'id-pe-logotype', + '1.2.840.113533.7.65.0' => 'entrustVersInfo', + '2.16.840.1.113733.1.6.9' => 'verisignPrivate', + // for Certificate Signing Requests + // see http://tools.ietf.org/html/rfc2985 + '1.2.840.113549.1.9.2' => 'pkcs-9-at-unstructuredName', // PKCS #9 unstructured name + '1.2.840.113549.1.9.7' => 'pkcs-9-at-challengePassword', // Challenge password for certificate revocations + '1.2.840.113549.1.9.14' => 'pkcs-9-at-extensionRequest' // Certificate extension request + ); + } + + /** + * Load X.509 certificate + * + * Returns an associative array describing the X.509 cert or a false if the cert failed to load + * + * @param String $cert + * @access public + * @return Mixed + */ + function loadX509($cert) + { + if (is_array($cert) && isset($cert['tbsCertificate'])) { + unset($this->currentCert); + unset($this->currentKeyIdentifier); + $this->dn = $cert['tbsCertificate']['subject']; + if (!isset($this->dn)) { + return false; + } + $this->currentCert = $cert; + + $currentKeyIdentifier = $this->getExtension('id-ce-subjectKeyIdentifier'); + $this->currentKeyIdentifier = is_string($currentKeyIdentifier) ? $currentKeyIdentifier : null; + + unset($this->signatureSubject); + + return $cert; + } + + $asn1 = new File_ASN1(); + + $cert = $this->_extractBER($cert); + + if ($cert === false) { + $this->currentCert = false; + return false; + } + + $asn1->loadOIDs($this->oids); + $decoded = $asn1->decodeBER($cert); + + if (!empty($decoded)) { + $x509 = $asn1->asn1map($decoded[0], $this->Certificate); + } + if (!isset($x509) || $x509 === false) { + $this->currentCert = false; + return false; + } + + $this->signatureSubject = substr($cert, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); + + $this->_mapInExtensions($x509, 'tbsCertificate/extensions', $asn1); + + $key = &$x509['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']; + $key = $this->_reformatKey($x509['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'], $key); + + $this->currentCert = $x509; + $this->dn = $x509['tbsCertificate']['subject']; + + $currentKeyIdentifier = $this->getExtension('id-ce-subjectKeyIdentifier'); + $this->currentKeyIdentifier = is_string($currentKeyIdentifier) ? $currentKeyIdentifier : null; + + return $x509; + } + + /** + * Save X.509 certificate + * + * @param Array $cert + * @param Integer $format optional + * @access public + * @return String + */ + function saveX509($cert, $format = FILE_X509_FORMAT_PEM) + { + if (!is_array($cert) || !isset($cert['tbsCertificate'])) { + return false; + } + + switch (true) { + // "case !$a: case !$b: break; default: whatever();" is the same thing as "if ($a && $b) whatever()" + case !($algorithm = $this->_subArray($cert, 'tbsCertificate/subjectPublicKeyInfo/algorithm/algorithm')): + case is_object($cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']): + break; + default: + switch ($algorithm) { + case 'rsaEncryption': + $cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'] + = base64_encode("\0" . base64_decode(preg_replace('#-.+-|[\r\n]#', '', $cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']))); + } + } + + $asn1 = new File_ASN1(); + $asn1->loadOIDs($this->oids); + + $filters = array(); + $type_utf8_string = array('type' => FILE_ASN1_TYPE_UTF8_STRING); + $filters['tbsCertificate']['signature']['parameters'] = $type_utf8_string; + $filters['tbsCertificate']['signature']['issuer']['rdnSequence']['value'] = $type_utf8_string; + $filters['tbsCertificate']['issuer']['rdnSequence']['value'] = $type_utf8_string; + $filters['tbsCertificate']['subject']['rdnSequence']['value'] = $type_utf8_string; + $filters['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['parameters'] = $type_utf8_string; + $filters['signatureAlgorithm']['parameters'] = $type_utf8_string; + $filters['authorityCertIssuer']['directoryName']['rdnSequence']['value'] = $type_utf8_string; + //$filters['policyQualifiers']['qualifier'] = $type_utf8_string; + $filters['distributionPoint']['fullName']['directoryName']['rdnSequence']['value'] = $type_utf8_string; + $filters['directoryName']['rdnSequence']['value'] = $type_utf8_string; + + /* in the case of policyQualifiers/qualifier, the type has to be FILE_ASN1_TYPE_IA5_STRING. + FILE_ASN1_TYPE_PRINTABLE_STRING will cause OpenSSL's X.509 parser to spit out random + characters. + */ + $filters['policyQualifiers']['qualifier'] + = array('type' => FILE_ASN1_TYPE_IA5_STRING); + + $asn1->loadFilters($filters); + + $this->_mapOutExtensions($cert, 'tbsCertificate/extensions', $asn1); + + $cert = $asn1->encodeDER($cert, $this->Certificate); + + switch ($format) { + case FILE_X509_FORMAT_DER: + return $cert; + // case FILE_X509_FORMAT_PEM: + default: + return "-----BEGIN CERTIFICATE-----\r\n" . chunk_split(base64_encode($cert), 64) . '-----END CERTIFICATE-----'; + } + } + + /** + * Map extension values from octet string to extension-specific internal + * format. + * + * @param Array ref $root + * @param String $path + * @param Object $asn1 + * @access private + */ + function _mapInExtensions(&$root, $path, $asn1) + { + $extensions = &$this->_subArray($root, $path); + + if (is_array($extensions)) { + for ($i = 0; $i < count($extensions); $i++) { + $id = $extensions[$i]['extnId']; + $value = &$extensions[$i]['extnValue']; + $value = base64_decode($value); + $decoded = $asn1->decodeBER($value); + /* [extnValue] contains the DER encoding of an ASN.1 value + corresponding to the extension type identified by extnID */ + $map = $this->_getMapping($id); + if (!is_bool($map)) { + $mapped = $asn1->asn1map($decoded[0], $map, array('iPAddress' => array($this, '_decodeIP'))); + $value = $mapped === false ? $decoded[0] : $mapped; + + if ($id == 'id-ce-certificatePolicies') { + for ($j = 0; $j < count($value); $j++) { + if (!isset($value[$j]['policyQualifiers'])) { + continue; + } + for ($k = 0; $k < count($value[$j]['policyQualifiers']); $k++) { + $subid = $value[$j]['policyQualifiers'][$k]['policyQualifierId']; + $map = $this->_getMapping($subid); + $subvalue = &$value[$j]['policyQualifiers'][$k]['qualifier']; + if ($map !== false) { + $decoded = $asn1->decodeBER($subvalue); + $mapped = $asn1->asn1map($decoded[0], $map); + $subvalue = $mapped === false ? $decoded[0] : $mapped; + } + } + } + } + } elseif ($map) { + $value = base64_encode($value); + } + } + } + } + + /** + * Map extension values from extension-specific internal format to + * octet string. + * + * @param Array ref $root + * @param String $path + * @param Object $asn1 + * @access private + */ + function _mapOutExtensions(&$root, $path, $asn1) + { + $extensions = &$this->_subArray($root, $path); + + if (is_array($extensions)) { + $size = count($extensions); + for ($i = 0; $i < $size; $i++) { + $id = $extensions[$i]['extnId']; + $value = &$extensions[$i]['extnValue']; + + switch ($id) { + case 'id-ce-certificatePolicies': + for ($j = 0; $j < count($value); $j++) { + if (!isset($value[$j]['policyQualifiers'])) { + continue; + } + for ($k = 0; $k < count($value[$j]['policyQualifiers']); $k++) { + $subid = $value[$j]['policyQualifiers'][$k]['policyQualifierId']; + $map = $this->_getMapping($subid); + $subvalue = &$value[$j]['policyQualifiers'][$k]['qualifier']; + if ($map !== false) { + // by default File_ASN1 will try to render qualifier as a FILE_ASN1_TYPE_IA5_STRING since it's + // actual type is FILE_ASN1_TYPE_ANY + $subvalue = new File_ASN1_Element($asn1->encodeDER($subvalue, $map)); + } + } + } + break; + case 'id-ce-authorityKeyIdentifier': // use 00 as the serial number instead of an empty string + if (isset($value['authorityCertSerialNumber'])) { + if ($value['authorityCertSerialNumber']->toBytes() == '') { + $temp = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | 2) . "\1\0"; + $value['authorityCertSerialNumber'] = new File_ASN1_Element($temp); + } + } + } + + /* [extnValue] contains the DER encoding of an ASN.1 value + corresponding to the extension type identified by extnID */ + $map = $this->_getMapping($id); + if (is_bool($map)) { + if (!$map) { + user_error($id . ' is not a currently supported extension'); + unset($extensions[$i]); + } + } else { + $temp = $asn1->encodeDER($value, $map, array('iPAddress' => array($this, '_encodeIP'))); + $value = base64_encode($temp); + } + } + } + } + + /** + * Map attribute values from ANY type to attribute-specific internal + * format. + * + * @param Array ref $root + * @param String $path + * @param Object $asn1 + * @access private + */ + function _mapInAttributes(&$root, $path, $asn1) + { + $attributes = &$this->_subArray($root, $path); + + if (is_array($attributes)) { + for ($i = 0; $i < count($attributes); $i++) { + $id = $attributes[$i]['type']; + /* $value contains the DER encoding of an ASN.1 value + corresponding to the attribute type identified by type */ + $map = $this->_getMapping($id); + if (is_array($attributes[$i]['value'])) { + $values = &$attributes[$i]['value']; + for ($j = 0; $j < count($values); $j++) { + $value = $asn1->encodeDER($values[$j], $this->AttributeValue); + $decoded = $asn1->decodeBER($value); + if (!is_bool($map)) { + $mapped = $asn1->asn1map($decoded[0], $map); + if ($mapped !== false) { + $values[$j] = $mapped; + } + if ($id == 'pkcs-9-at-extensionRequest') { + $this->_mapInExtensions($values, $j, $asn1); + } + } elseif ($map) { + $values[$j] = base64_encode($value); + } + } + } + } + } + } + + /** + * Map attribute values from attribute-specific internal format to + * ANY type. + * + * @param Array ref $root + * @param String $path + * @param Object $asn1 + * @access private + */ + function _mapOutAttributes(&$root, $path, $asn1) + { + $attributes = &$this->_subArray($root, $path); + + if (is_array($attributes)) { + $size = count($attributes); + for ($i = 0; $i < $size; $i++) { + /* [value] contains the DER encoding of an ASN.1 value + corresponding to the attribute type identified by type */ + $id = $attributes[$i]['type']; + $map = $this->_getMapping($id); + if ($map === false) { + user_error($id . ' is not a currently supported attribute', E_USER_NOTICE); + unset($attributes[$i]); + } elseif (is_array($attributes[$i]['value'])) { + $values = &$attributes[$i]['value']; + for ($j = 0; $j < count($values); $j++) { + switch ($id) { + case 'pkcs-9-at-extensionRequest': + $this->_mapOutExtensions($values, $j, $asn1); + break; + } + + if (!is_bool($map)) { + $temp = $asn1->encodeDER($values[$j], $map); + $decoded = $asn1->decodeBER($temp); + $values[$j] = $asn1->asn1map($decoded[0], $this->AttributeValue); + } + } + } + } + } + } + + /** + * Associate an extension ID to an extension mapping + * + * @param String $extnId + * @access private + * @return Mixed + */ + function _getMapping($extnId) + { + if (!is_string($extnId)) { // eg. if it's a File_ASN1_Element object + return true; + } + + switch ($extnId) { + case 'id-ce-keyUsage': + return $this->KeyUsage; + case 'id-ce-basicConstraints': + return $this->BasicConstraints; + case 'id-ce-subjectKeyIdentifier': + return $this->KeyIdentifier; + case 'id-ce-cRLDistributionPoints': + return $this->CRLDistributionPoints; + case 'id-ce-authorityKeyIdentifier': + return $this->AuthorityKeyIdentifier; + case 'id-ce-certificatePolicies': + return $this->CertificatePolicies; + case 'id-ce-extKeyUsage': + return $this->ExtKeyUsageSyntax; + case 'id-pe-authorityInfoAccess': + return $this->AuthorityInfoAccessSyntax; + case 'id-ce-subjectAltName': + return $this->SubjectAltName; + case 'id-ce-privateKeyUsagePeriod': + return $this->PrivateKeyUsagePeriod; + case 'id-ce-issuerAltName': + return $this->IssuerAltName; + case 'id-ce-policyMappings': + return $this->PolicyMappings; + case 'id-ce-nameConstraints': + return $this->NameConstraints; + + case 'netscape-cert-type': + return $this->netscape_cert_type; + case 'netscape-comment': + return $this->netscape_comment; + case 'netscape-ca-policy-url': + return $this->netscape_ca_policy_url; + + // since id-qt-cps isn't a constructed type it will have already been decoded as a string by the time it gets + // back around to asn1map() and we don't want it decoded again. + //case 'id-qt-cps': + // return $this->CPSuri; + case 'id-qt-unotice': + return $this->UserNotice; + + // the following OIDs are unsupported but we don't want them to give notices when calling saveX509(). + case 'id-pe-logotype': // http://www.ietf.org/rfc/rfc3709.txt + case 'entrustVersInfo': + // http://support.microsoft.com/kb/287547 + case '1.3.6.1.4.1.311.20.2': // szOID_ENROLL_CERTTYPE_EXTENSION + case '1.3.6.1.4.1.311.21.1': // szOID_CERTSRV_CA_VERSION + // "SET Secure Electronic Transaction Specification" + // http://www.maithean.com/docs/set_bk3.pdf + case '2.23.42.7.0': // id-set-hashedRootKey + return true; + + // CSR attributes + case 'pkcs-9-at-unstructuredName': + return $this->PKCS9String; + case 'pkcs-9-at-challengePassword': + return $this->DirectoryString; + case 'pkcs-9-at-extensionRequest': + return $this->Extensions; + + // CRL extensions. + case 'id-ce-cRLNumber': + return $this->CRLNumber; + case 'id-ce-deltaCRLIndicator': + return $this->CRLNumber; + case 'id-ce-issuingDistributionPoint': + return $this->IssuingDistributionPoint; + case 'id-ce-freshestCRL': + return $this->CRLDistributionPoints; + case 'id-ce-cRLReasons': + return $this->CRLReason; + case 'id-ce-invalidityDate': + return $this->InvalidityDate; + case 'id-ce-certificateIssuer': + return $this->CertificateIssuer; + case 'id-ce-holdInstructionCode': + return $this->HoldInstructionCode; + } + + return false; + } + + /** + * Load an X.509 certificate as a certificate authority + * + * @param String $cert + * @access public + * @return Boolean + */ + function loadCA($cert) + { + $olddn = $this->dn; + $oldcert = $this->currentCert; + $oldsigsubj = $this->signatureSubject; + $oldkeyid = $this->currentKeyIdentifier; + + $cert = $this->loadX509($cert); + if (!$cert) { + $this->dn = $olddn; + $this->currentCert = $oldcert; + $this->signatureSubject = $oldsigsubj; + $this->currentKeyIdentifier = $oldkeyid; + + return false; + } + + /* From RFC5280 "PKIX Certificate and CRL Profile": + + If the keyUsage extension is present, then the subject public key + MUST NOT be used to verify signatures on certificates or CRLs unless + the corresponding keyCertSign or cRLSign bit is set. */ + //$keyUsage = $this->getExtension('id-ce-keyUsage'); + //if ($keyUsage && !in_array('keyCertSign', $keyUsage)) { + // return false; + //} + + /* From RFC5280 "PKIX Certificate and CRL Profile": + + The cA boolean indicates whether the certified public key may be used + to verify certificate signatures. If the cA boolean is not asserted, + then the keyCertSign bit in the key usage extension MUST NOT be + asserted. If the basic constraints extension is not present in a + version 3 certificate, or the extension is present but the cA boolean + is not asserted, then the certified public key MUST NOT be used to + verify certificate signatures. */ + //$basicConstraints = $this->getExtension('id-ce-basicConstraints'); + //if (!$basicConstraints || !$basicConstraints['cA']) { + // return false; + //} + + $this->CAs[] = $cert; + + $this->dn = $olddn; + $this->currentCert = $oldcert; + $this->signatureSubject = $oldsigsubj; + + return true; + } + + /** + * Validate an X.509 certificate against a URL + * + * From RFC2818 "HTTP over TLS": + * + * Matching is performed using the matching rules specified by + * [RFC2459]. If more than one identity of a given type is present in + * the certificate (e.g., more than one dNSName name, a match in any one + * of the set is considered acceptable.) Names may contain the wildcard + * character * which is considered to match any single domain name + * component or component fragment. E.g., *.a.com matches foo.a.com but + * not bar.foo.a.com. f*.com matches foo.com but not bar.com. + * + * @param String $url + * @access public + * @return Boolean + */ + function validateURL($url) + { + if (!is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { + return false; + } + + $components = parse_url($url); + if (!isset($components['host'])) { + return false; + } + + if ($names = $this->getExtension('id-ce-subjectAltName')) { + foreach ($names as $key => $value) { + $value = str_replace(array('.', '*'), array('\.', '[^.]*'), $value); + switch ($key) { + case 'dNSName': + /* From RFC2818 "HTTP over TLS": + + If a subjectAltName extension of type dNSName is present, that MUST + be used as the identity. Otherwise, the (most specific) Common Name + field in the Subject field of the certificate MUST be used. Although + the use of the Common Name is existing practice, it is deprecated and + Certification Authorities are encouraged to use the dNSName instead. */ + if (preg_match('#^' . $value . '$#', $components['host'])) { + return true; + } + break; + case 'iPAddress': + /* From RFC2818 "HTTP over TLS": + + In some cases, the URI is specified as an IP address rather than a + hostname. In this case, the iPAddress subjectAltName must be present + in the certificate and must exactly match the IP in the URI. */ + if (preg_match('#(?:\d{1-3}\.){4}#', $components['host'] . '.') && preg_match('#^' . $value . '$#', $components['host'])) { + return true; + } + } + } + return false; + } + + if ($value = $this->getDNProp('id-at-commonName')) { + $value = str_replace(array('.', '*'), array('\.', '[^.]*'), $value[0]); + return preg_match('#^' . $value . '$#', $components['host']); + } + + return false; + } + + /** + * Validate a date + * + * If $date isn't defined it is assumed to be the current date. + * + * @param Integer $date optional + * @access public + */ + function validateDate($date = null) + { + if (!is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { + return false; + } + + if (!isset($date)) { + $date = time(); + } + + $notBefore = $this->currentCert['tbsCertificate']['validity']['notBefore']; + $notBefore = isset($notBefore['generalTime']) ? $notBefore['generalTime'] : $notBefore['utcTime']; + + $notAfter = $this->currentCert['tbsCertificate']['validity']['notAfter']; + $notAfter = isset($notAfter['generalTime']) ? $notAfter['generalTime'] : $notAfter['utcTime']; + + switch (true) { + case $date < @strtotime($notBefore): + case $date > @strtotime($notAfter): + return false; + } + + return true; + } + + /** + * Validate a signature + * + * Works on X.509 certs, CSR's and CRL's. + * Returns true if the signature is verified, false if it is not correct or null on error + * + * By default returns false for self-signed certs. Call validateSignature(false) to make this support + * self-signed. + * + * The behavior of this function is inspired by {@link http://php.net/openssl-verify openssl_verify}. + * + * @param Boolean $caonly optional + * @access public + * @return Mixed + */ + function validateSignature($caonly = true) + { + if (!is_array($this->currentCert) || !isset($this->signatureSubject)) { + return null; + } + + /* TODO: + "emailAddress attribute values are not case-sensitive (e.g., "subscriber@example.com" is the same as "SUBSCRIBER@EXAMPLE.COM")." + -- http://tools.ietf.org/html/rfc5280#section-4.1.2.6 + + implement pathLenConstraint in the id-ce-basicConstraints extension */ + + switch (true) { + case isset($this->currentCert['tbsCertificate']): + // self-signed cert + if ($this->currentCert['tbsCertificate']['issuer'] === $this->currentCert['tbsCertificate']['subject']) { + $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier'); + $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier'); + switch (true) { + case !is_array($authorityKey): + case is_array($authorityKey) && isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: + $signingCert = $this->currentCert; // working cert + } + } + + if (!empty($this->CAs)) { + for ($i = 0; $i < count($this->CAs); $i++) { + // even if the cert is a self-signed one we still want to see if it's a CA; + // if not, we'll conditionally return an error + $ca = $this->CAs[$i]; + if ($this->currentCert['tbsCertificate']['issuer'] === $ca['tbsCertificate']['subject']) { + $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier'); + $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca); + switch (true) { + case !is_array($authorityKey): + case is_array($authorityKey) && isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: + $signingCert = $ca; // working cert + break 2; + } + } + } + if (count($this->CAs) == $i && $caonly) { + return false; + } + } elseif (!isset($signingCert) || $caonly) { + return false; + } + return $this->_validateSignature( + $signingCert['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'], + $signingCert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], + $this->currentCert['signatureAlgorithm']['algorithm'], + substr(base64_decode($this->currentCert['signature']), 1), + $this->signatureSubject + ); + case isset($this->currentCert['certificationRequestInfo']): + return $this->_validateSignature( + $this->currentCert['certificationRequestInfo']['subjectPKInfo']['algorithm']['algorithm'], + $this->currentCert['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'], + $this->currentCert['signatureAlgorithm']['algorithm'], + substr(base64_decode($this->currentCert['signature']), 1), + $this->signatureSubject + ); + case isset($this->currentCert['publicKeyAndChallenge']): + return $this->_validateSignature( + $this->currentCert['publicKeyAndChallenge']['spki']['algorithm']['algorithm'], + $this->currentCert['publicKeyAndChallenge']['spki']['subjectPublicKey'], + $this->currentCert['signatureAlgorithm']['algorithm'], + substr(base64_decode($this->currentCert['signature']), 1), + $this->signatureSubject + ); + case isset($this->currentCert['tbsCertList']): + if (!empty($this->CAs)) { + for ($i = 0; $i < count($this->CAs); $i++) { + $ca = $this->CAs[$i]; + if ($this->currentCert['tbsCertList']['issuer'] === $ca['tbsCertificate']['subject']) { + $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier'); + $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca); + switch (true) { + case !is_array($authorityKey): + case is_array($authorityKey) && isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: + $signingCert = $ca; // working cert + break 2; + } + } + } + } + if (!isset($signingCert)) { + return false; + } + return $this->_validateSignature( + $signingCert['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'], + $signingCert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], + $this->currentCert['signatureAlgorithm']['algorithm'], + substr(base64_decode($this->currentCert['signature']), 1), + $this->signatureSubject + ); + default: + return false; + } + } + + /** + * Validates a signature + * + * Returns true if the signature is verified, false if it is not correct or null on error + * + * @param String $publicKeyAlgorithm + * @param String $publicKey + * @param String $signatureAlgorithm + * @param String $signature + * @param String $signatureSubject + * @access private + * @return Integer + */ + function _validateSignature($publicKeyAlgorithm, $publicKey, $signatureAlgorithm, $signature, $signatureSubject) + { + switch ($publicKeyAlgorithm) { + case 'rsaEncryption': + if (!class_exists('Crypt_RSA')) { + include_once 'Crypt/RSA.php'; + } + $rsa = new Crypt_RSA(); + $rsa->loadKey($publicKey); + + switch ($signatureAlgorithm) { + case 'md2WithRSAEncryption': + case 'md5WithRSAEncryption': + case 'sha1WithRSAEncryption': + case 'sha224WithRSAEncryption': + case 'sha256WithRSAEncryption': + case 'sha384WithRSAEncryption': + case 'sha512WithRSAEncryption': + $rsa->setHash(preg_replace('#WithRSAEncryption$#', '', $signatureAlgorithm)); + $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); + if (!@$rsa->verify($signatureSubject, $signature)) { + return false; + } + break; + default: + return null; + } + break; + default: + return null; + } + + return true; + } + + /** + * Reformat public keys + * + * Reformats a public key to a format supported by phpseclib (if applicable) + * + * @param String $algorithm + * @param String $key + * @access private + * @return String + */ + function _reformatKey($algorithm, $key) + { + switch ($algorithm) { + case 'rsaEncryption': + return + "-----BEGIN RSA PUBLIC KEY-----\r\n" . + // subjectPublicKey is stored as a bit string in X.509 certs. the first byte of a bit string represents how many bits + // in the last byte should be ignored. the following only supports non-zero stuff but as none of the X.509 certs Firefox + // uses as a cert authority actually use a non-zero bit I think it's safe to assume that none do. + chunk_split(base64_encode(substr(base64_decode($key), 1)), 64) . + '-----END RSA PUBLIC KEY-----'; + default: + return $key; + } + } + + /** + * Decodes an IP address + * + * Takes in a base64 encoded "blob" and returns a human readable IP address + * + * @param String $ip + * @access private + * @return String + */ + function _decodeIP($ip) + { + $ip = base64_decode($ip); + list(, $ip) = unpack('N', $ip); + return long2ip($ip); + } + + /** + * Encodes an IP address + * + * Takes a human readable IP address into a base64-encoded "blob" + * + * @param String $ip + * @access private + * @return String + */ + function _encodeIP($ip) + { + return base64_encode(pack('N', ip2long($ip))); + } + + /** + * "Normalizes" a Distinguished Name property + * + * @param String $propName + * @access private + * @return Mixed + */ + function _translateDNProp($propName) + { + switch (strtolower($propName)) { + case 'id-at-countryname': + case 'countryname': + case 'c': + return 'id-at-countryName'; + case 'id-at-organizationname': + case 'organizationname': + case 'o': + return 'id-at-organizationName'; + case 'id-at-dnqualifier': + case 'dnqualifier': + return 'id-at-dnQualifier'; + case 'id-at-commonname': + case 'commonname': + case 'cn': + return 'id-at-commonName'; + case 'id-at-stateorprovincename': + case 'stateorprovincename': + case 'state': + case 'province': + case 'provincename': + case 'st': + return 'id-at-stateOrProvinceName'; + case 'id-at-localityname': + case 'localityname': + case 'l': + return 'id-at-localityName'; + case 'id-emailaddress': + case 'emailaddress': + return 'pkcs-9-at-emailAddress'; + case 'id-at-serialnumber': + case 'serialnumber': + return 'id-at-serialNumber'; + case 'id-at-postalcode': + case 'postalcode': + return 'id-at-postalCode'; + case 'id-at-streetaddress': + case 'streetaddress': + return 'id-at-streetAddress'; + case 'id-at-name': + case 'name': + return 'id-at-name'; + case 'id-at-givenname': + case 'givenname': + return 'id-at-givenName'; + case 'id-at-surname': + case 'surname': + case 'sn': + return 'id-at-surname'; + case 'id-at-initials': + case 'initials': + return 'id-at-initials'; + case 'id-at-generationqualifier': + case 'generationqualifier': + return 'id-at-generationQualifier'; + case 'id-at-organizationalunitname': + case 'organizationalunitname': + case 'ou': + return 'id-at-organizationalUnitName'; + case 'id-at-pseudonym': + case 'pseudonym': + return 'id-at-pseudonym'; + case 'id-at-title': + case 'title': + return 'id-at-title'; + case 'id-at-description': + case 'description': + return 'id-at-description'; + case 'id-at-role': + case 'role': + return 'id-at-role'; + case 'id-at-uniqueidentifier': + case 'uniqueidentifier': + case 'x500uniqueidentifier': + return 'id-at-uniqueIdentifier'; + default: + return false; + } + } + + /** + * Set a Distinguished Name property + * + * @param String $propName + * @param Mixed $propValue + * @param String $type optional + * @access public + * @return Boolean + */ + function setDNProp($propName, $propValue, $type = 'utf8String') + { + if (empty($this->dn)) { + $this->dn = array('rdnSequence' => array()); + } + + if (($propName = $this->_translateDNProp($propName)) === false) { + return false; + } + + foreach ((array) $propValue as $v) { + if (!is_array($v) && isset($type)) { + $v = array($type => $v); + } + $this->dn['rdnSequence'][] = array( + array( + 'type' => $propName, + 'value'=> $v + ) + ); + } + + return true; + } + + /** + * Remove Distinguished Name properties + * + * @param String $propName + * @access public + */ + function removeDNProp($propName) + { + if (empty($this->dn)) { + return; + } + + if (($propName = $this->_translateDNProp($propName)) === false) { + return; + } + + $dn = &$this->dn['rdnSequence']; + $size = count($dn); + for ($i = 0; $i < $size; $i++) { + if ($dn[$i][0]['type'] == $propName) { + unset($dn[$i]); + } + } + + $dn = array_values($dn); + } + + /** + * Get Distinguished Name properties + * + * @param String $propName + * @param Array $dn optional + * @param Boolean $withType optional + * @return Mixed + * @access public + */ + function getDNProp($propName, $dn = null, $withType = false) + { + if (!isset($dn)) { + $dn = $this->dn; + } + + if (empty($dn)) { + return false; + } + + if (($propName = $this->_translateDNProp($propName)) === false) { + return false; + } + + $dn = $dn['rdnSequence']; + $result = array(); + $asn1 = new File_ASN1(); + for ($i = 0; $i < count($dn); $i++) { + if ($dn[$i][0]['type'] == $propName) { + $v = $dn[$i][0]['value']; + if (!$withType && is_array($v)) { + foreach ($v as $type => $s) { + $type = array_search($type, $asn1->ANYmap, true); + if ($type !== false && isset($asn1->stringTypeSize[$type])) { + $s = $asn1->convert($s, $type); + if ($s !== false) { + $v = $s; + break; + } + } + } + if (is_array($v)) { + $v = array_pop($v); // Always strip data type. + } + } + $result[] = $v; + } + } + + return $result; + } + + /** + * Set a Distinguished Name + * + * @param Mixed $dn + * @param Boolean $merge optional + * @param String $type optional + * @access public + * @return Boolean + */ + function setDN($dn, $merge = false, $type = 'utf8String') + { + if (!$merge) { + $this->dn = null; + } + + if (is_array($dn)) { + if (isset($dn['rdnSequence'])) { + $this->dn = $dn; // No merge here. + return true; + } + + // handles stuff generated by openssl_x509_parse() + foreach ($dn as $prop => $value) { + if (!$this->setDNProp($prop, $value, $type)) { + return false; + } + } + return true; + } + + // handles everything else + $results = preg_split('#((?:^|, *|/)(?:C=|O=|OU=|CN=|L=|ST=|SN=|postalCode=|streetAddress=|emailAddress=|serialNumber=|organizationalUnitName=|title=|description=|role=|x500UniqueIdentifier=))#', $dn, -1, PREG_SPLIT_DELIM_CAPTURE); + for ($i = 1; $i < count($results); $i+=2) { + $prop = trim($results[$i], ', =/'); + $value = $results[$i + 1]; + if (!$this->setDNProp($prop, $value, $type)) { + return false; + } + } + + return true; + } + + /** + * Get the Distinguished Name for a certificates subject + * + * @param Mixed $format optional + * @param Array $dn optional + * @access public + * @return Boolean + */ + function getDN($format = FILE_X509_DN_ARRAY, $dn = null) + { + if (!isset($dn)) { + $dn = isset($this->currentCert['tbsCertList']) ? $this->currentCert['tbsCertList']['issuer'] : $this->dn; + } + + switch ((int) $format) { + case FILE_X509_DN_ARRAY: + return $dn; + case FILE_X509_DN_ASN1: + $asn1 = new File_ASN1(); + $asn1->loadOIDs($this->oids); + $filters = array(); + $filters['rdnSequence']['value'] = array('type' => FILE_ASN1_TYPE_UTF8_STRING); + $asn1->loadFilters($filters); + return $asn1->encodeDER($dn, $this->Name); + case FILE_X509_DN_OPENSSL: + $dn = $this->getDN(FILE_X509_DN_STRING, $dn); + if ($dn === false) { + return false; + } + $attrs = preg_split('#((?:^|, *|/)[a-z][a-z0-9]*=)#i', $dn, -1, PREG_SPLIT_DELIM_CAPTURE); + $dn = array(); + for ($i = 1; $i < count($attrs); $i += 2) { + $prop = trim($attrs[$i], ', =/'); + $value = $attrs[$i + 1]; + if (!isset($dn[$prop])) { + $dn[$prop] = $value; + } else { + $dn[$prop] = array_merge((array) $dn[$prop], array($value)); + } + } + return $dn; + case FILE_X509_DN_CANON: + // No SEQUENCE around RDNs and all string values normalized as + // trimmed lowercase UTF-8 with all spacing as one blank. + $asn1 = new File_ASN1(); + $asn1->loadOIDs($this->oids); + $filters = array(); + $filters['value'] = array('type' => FILE_ASN1_TYPE_UTF8_STRING); + $asn1->loadFilters($filters); + $result = ''; + foreach ($dn['rdnSequence'] as $rdn) { + foreach ($rdn as $i=>$attr) { + $attr = &$rdn[$i]; + if (is_array($attr['value'])) { + foreach ($attr['value'] as $type => $v) { + $type = array_search($type, $asn1->ANYmap, true); + if ($type !== false && isset($asn1->stringTypeSize[$type])) { + $v = $asn1->convert($v, $type); + if ($v !== false) { + $v = preg_replace('/\s+/', ' ', $v); + $attr['value'] = strtolower(trim($v)); + break; + } + } + } + } + } + $result .= $asn1->encodeDER($rdn, $this->RelativeDistinguishedName); + } + return $result; + case FILE_X509_DN_HASH: + $dn = $this->getDN(FILE_X509_DN_CANON, $dn); + if (!class_exists('Crypt_Hash')) { + include_once 'Crypt/Hash.php'; + } + $hash = new Crypt_Hash('sha1'); + $hash = $hash->hash($dn); + extract(unpack('Vhash', $hash)); + return strtolower(bin2hex(pack('N', $hash))); + } + + // Default is to return a string. + $start = true; + $output = ''; + $asn1 = new File_ASN1(); + foreach ($dn['rdnSequence'] as $field) { + $prop = $field[0]['type']; + $value = $field[0]['value']; + + $delim = ', '; + switch ($prop) { + case 'id-at-countryName': + $desc = 'C='; + break; + case 'id-at-stateOrProvinceName': + $desc = 'ST='; + break; + case 'id-at-organizationName': + $desc = 'O='; + break; + case 'id-at-organizationalUnitName': + $desc = 'OU='; + break; + case 'id-at-commonName': + $desc = 'CN='; + break; + case 'id-at-localityName': + $desc = 'L='; + break; + case 'id-at-surname': + $desc = 'SN='; + break; + case 'id-at-uniqueIdentifier': + $delim = '/'; + $desc = 'x500UniqueIdentifier='; + break; + default: + $delim = '/'; + $desc = preg_replace('#.+-([^-]+)$#', '$1', $prop) . '='; + } + + if (!$start) { + $output.= $delim; + } + if (is_array($value)) { + foreach ($value as $type => $v) { + $type = array_search($type, $asn1->ANYmap, true); + if ($type !== false && isset($asn1->stringTypeSize[$type])) { + $v = $asn1->convert($v, $type); + if ($v !== false) { + $value = $v; + break; + } + } + } + if (is_array($value)) { + $value = array_pop($value); // Always strip data type. + } + } + $output.= $desc . $value; + $start = false; + } + + return $output; + } + + /** + * Get the Distinguished Name for a certificate/crl issuer + * + * @param Integer $format optional + * @access public + * @return Mixed + */ + function getIssuerDN($format = FILE_X509_DN_ARRAY) + { + switch (true) { + case !isset($this->currentCert) || !is_array($this->currentCert): + break; + case isset($this->currentCert['tbsCertificate']): + return $this->getDN($format, $this->currentCert['tbsCertificate']['issuer']); + case isset($this->currentCert['tbsCertList']): + return $this->getDN($format, $this->currentCert['tbsCertList']['issuer']); + } + + return false; + } + + /** + * Get the Distinguished Name for a certificate/csr subject + * Alias of getDN() + * + * @param Integer $format optional + * @access public + * @return Mixed + */ + function getSubjectDN($format = FILE_X509_DN_ARRAY) + { + switch (true) { + case !empty($this->dn): + return $this->getDN($format); + case !isset($this->currentCert) || !is_array($this->currentCert): + break; + case isset($this->currentCert['tbsCertificate']): + return $this->getDN($format, $this->currentCert['tbsCertificate']['subject']); + case isset($this->currentCert['certificationRequestInfo']): + return $this->getDN($format, $this->currentCert['certificationRequestInfo']['subject']); + } + + return false; + } + + /** + * Get an individual Distinguished Name property for a certificate/crl issuer + * + * @param String $propName + * @param Boolean $withType optional + * @access public + * @return Mixed + */ + function getIssuerDNProp($propName, $withType = false) + { + switch (true) { + case !isset($this->currentCert) || !is_array($this->currentCert): + break; + case isset($this->currentCert['tbsCertificate']): + return $this->getDNProp($propName, $this->currentCert['tbsCertificate']['issuer'], $withType); + case isset($this->currentCert['tbsCertList']): + return $this->getDNProp($propName, $this->currentCert['tbsCertList']['issuer'], $withType); + } + + return false; + } + + /** + * Get an individual Distinguished Name property for a certificate/csr subject + * + * @param String $propName + * @param Boolean $withType optional + * @access public + * @return Mixed + */ + function getSubjectDNProp($propName, $withType = false) + { + switch (true) { + case !empty($this->dn): + return $this->getDNProp($propName, null, $withType); + case !isset($this->currentCert) || !is_array($this->currentCert): + break; + case isset($this->currentCert['tbsCertificate']): + return $this->getDNProp($propName, $this->currentCert['tbsCertificate']['subject'], $withType); + case isset($this->currentCert['certificationRequestInfo']): + return $this->getDNProp($propName, $this->currentCert['certificationRequestInfo']['subject'], $withType); + } + + return false; + } + + /** + * Get the certificate chain for the current cert + * + * @access public + * @return Mixed + */ + function getChain() + { + $chain = array($this->currentCert); + + if (!is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { + return false; + } + if (empty($this->CAs)) { + return $chain; + } + while (true) { + $currentCert = $chain[count($chain) - 1]; + for ($i = 0; $i < count($this->CAs); $i++) { + $ca = $this->CAs[$i]; + if ($currentCert['tbsCertificate']['issuer'] === $ca['tbsCertificate']['subject']) { + $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier', $currentCert); + $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca); + switch (true) { + case !is_array($authorityKey): + case is_array($authorityKey) && isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: + if ($currentCert === $ca) { + break 3; + } + $chain[] = $ca; + break 2; + } + } + } + if ($i == count($this->CAs)) { + break; + } + } + foreach ($chain as $key=>$value) { + $chain[$key] = new File_X509(); + $chain[$key]->loadX509($value); + } + return $chain; + } + + /** + * Set public key + * + * Key needs to be a Crypt_RSA object + * + * @param Object $key + * @access public + * @return Boolean + */ + function setPublicKey($key) + { + $key->setPublicKey(); + $this->publicKey = $key; + } + + /** + * Set private key + * + * Key needs to be a Crypt_RSA object + * + * @param Object $key + * @access public + */ + function setPrivateKey($key) + { + $this->privateKey = $key; + } + + /** + * Set challenge + * + * Used for SPKAC CSR's + * + * @param String $challenge + * @access public + */ + function setChallenge($challenge) + { + $this->challenge = $challenge; + } + + /** + * Gets the public key + * + * Returns a Crypt_RSA object or a false. + * + * @access public + * @return Mixed + */ + function getPublicKey() + { + if (isset($this->publicKey)) { + return $this->publicKey; + } + + if (isset($this->currentCert) && is_array($this->currentCert)) { + foreach (array('tbsCertificate/subjectPublicKeyInfo', 'certificationRequestInfo/subjectPKInfo') as $path) { + $keyinfo = $this->_subArray($this->currentCert, $path); + if (!empty($keyinfo)) { + break; + } + } + } + if (empty($keyinfo)) { + return false; + } + + $key = $keyinfo['subjectPublicKey']; + + switch ($keyinfo['algorithm']['algorithm']) { + case 'rsaEncryption': + if (!class_exists('Crypt_RSA')) { + include_once 'Crypt/RSA.php'; + } + $publicKey = new Crypt_RSA(); + $publicKey->loadKey($key); + $publicKey->setPublicKey(); + break; + default: + return false; + } + + return $publicKey; + } + + /** + * Load a Certificate Signing Request + * + * @param String $csr + * @access public + * @return Mixed + */ + function loadCSR($csr) + { + if (is_array($csr) && isset($csr['certificationRequestInfo'])) { + unset($this->currentCert); + unset($this->currentKeyIdentifier); + unset($this->signatureSubject); + $this->dn = $csr['certificationRequestInfo']['subject']; + if (!isset($this->dn)) { + return false; + } + + $this->currentCert = $csr; + return $csr; + } + + // see http://tools.ietf.org/html/rfc2986 + + $asn1 = new File_ASN1(); + + $csr = $this->_extractBER($csr); + $orig = $csr; + + if ($csr === false) { + $this->currentCert = false; + return false; + } + + $asn1->loadOIDs($this->oids); + $decoded = $asn1->decodeBER($csr); + + if (empty($decoded)) { + $this->currentCert = false; + return false; + } + + $csr = $asn1->asn1map($decoded[0], $this->CertificationRequest); + if (!isset($csr) || $csr === false) { + $this->currentCert = false; + return false; + } + + $this->dn = $csr['certificationRequestInfo']['subject']; + $this->_mapInAttributes($csr, 'certificationRequestInfo/attributes', $asn1); + + $this->signatureSubject = substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); + + $algorithm = &$csr['certificationRequestInfo']['subjectPKInfo']['algorithm']['algorithm']; + $key = &$csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']; + $key = $this->_reformatKey($algorithm, $key); + + switch ($algorithm) { + case 'rsaEncryption': + if (!class_exists('Crypt_RSA')) { + include_once 'Crypt/RSA.php'; + } + $this->publicKey = new Crypt_RSA(); + $this->publicKey->loadKey($key); + $this->publicKey->setPublicKey(); + break; + default: + $this->publicKey = null; + } + + $this->currentKeyIdentifier = null; + $this->currentCert = $csr; + + return $csr; + } + + /** + * Save CSR request + * + * @param Array $csr + * @param Integer $format optional + * @access public + * @return String + */ + function saveCSR($csr, $format = FILE_X509_FORMAT_PEM) + { + if (!is_array($csr) || !isset($csr['certificationRequestInfo'])) { + return false; + } + + switch (true) { + case !($algorithm = $this->_subArray($csr, 'certificationRequestInfo/subjectPKInfo/algorithm/algorithm')): + case is_object($csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']); + break; + default: + switch ($algorithm) { + case 'rsaEncryption': + $csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'] + = base64_encode("\0" . base64_decode(preg_replace('#-.+-|[\r\n]#', '', $csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']))); + } + } + + $asn1 = new File_ASN1(); + + $asn1->loadOIDs($this->oids); + + $filters = array(); + $filters['certificationRequestInfo']['subject']['rdnSequence']['value'] + = array('type' => FILE_ASN1_TYPE_UTF8_STRING); + + $asn1->loadFilters($filters); + + $this->_mapOutAttributes($csr, 'certificationRequestInfo/attributes', $asn1); + $csr = $asn1->encodeDER($csr, $this->CertificationRequest); + + switch ($format) { + case FILE_X509_FORMAT_DER: + return $csr; + // case FILE_X509_FORMAT_PEM: + default: + return "-----BEGIN CERTIFICATE REQUEST-----\r\n" . chunk_split(base64_encode($csr), 64) . '-----END CERTIFICATE REQUEST-----'; + } + } + + /** + * Load a SPKAC CSR + * + * SPKAC's are produced by the HTML5 keygen element: + * + * https://developer.mozilla.org/en-US/docs/HTML/Element/keygen + * + * @param String $csr + * @access public + * @return Mixed + */ + function loadSPKAC($spkac) + { + if (is_array($spkac) && isset($spkac['publicKeyAndChallenge'])) { + unset($this->currentCert); + unset($this->currentKeyIdentifier); + unset($this->signatureSubject); + $this->currentCert = $spkac; + return $spkac; + } + + // see http://www.w3.org/html/wg/drafts/html/master/forms.html#signedpublickeyandchallenge + + $asn1 = new File_ASN1(); + + // OpenSSL produces SPKAC's that are preceeded by the string SPKAC= + $temp = preg_replace('#(?:SPKAC=)|[ \r\n\\\]#', '', $spkac); + $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? base64_decode($temp) : false; + if ($temp != false) { + $spkac = $temp; + } + $orig = $spkac; + + if ($spkac === false) { + $this->currentCert = false; + return false; + } + + $asn1->loadOIDs($this->oids); + $decoded = $asn1->decodeBER($spkac); + + if (empty($decoded)) { + $this->currentCert = false; + return false; + } + + $spkac = $asn1->asn1map($decoded[0], $this->SignedPublicKeyAndChallenge); + + if (!isset($spkac) || $spkac === false) { + $this->currentCert = false; + return false; + } + + $this->signatureSubject = substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); + + $algorithm = &$spkac['publicKeyAndChallenge']['spki']['algorithm']['algorithm']; + $key = &$spkac['publicKeyAndChallenge']['spki']['subjectPublicKey']; + $key = $this->_reformatKey($algorithm, $key); + + switch ($algorithm) { + case 'rsaEncryption': + if (!class_exists('Crypt_RSA')) { + include_once 'Crypt/RSA.php'; + } + $this->publicKey = new Crypt_RSA(); + $this->publicKey->loadKey($key); + $this->publicKey->setPublicKey(); + break; + default: + $this->publicKey = null; + } + + $this->currentKeyIdentifier = null; + $this->currentCert = $spkac; + + return $spkac; + } + + /** + * Save a SPKAC CSR request + * + * @param Array $csr + * @param Integer $format optional + * @access public + * @return String + */ + function saveSPKAC($spkac, $format = FILE_X509_FORMAT_PEM) + { + if (!is_array($spkac) || !isset($spkac['publicKeyAndChallenge'])) { + return false; + } + + $algorithm = $this->_subArray($spkac, 'publicKeyAndChallenge/spki/algorithm/algorithm'); + switch (true) { + case !$algorithm: + case is_object($spkac['publicKeyAndChallenge']['spki']['subjectPublicKey']); + break; + default: + switch ($algorithm) { + case 'rsaEncryption': + $spkac['publicKeyAndChallenge']['spki']['subjectPublicKey'] + = base64_encode("\0" . base64_decode(preg_replace('#-.+-|[\r\n]#', '', $spkac['publicKeyAndChallenge']['spki']['subjectPublicKey']))); + } + } + + $asn1 = new File_ASN1(); + + $asn1->loadOIDs($this->oids); + $spkac = $asn1->encodeDER($spkac, $this->SignedPublicKeyAndChallenge); + + switch ($format) { + case FILE_X509_FORMAT_DER: + return $spkac; + // case FILE_X509_FORMAT_PEM: + default: + // OpenSSL's implementation of SPKAC requires the SPKAC be preceeded by SPKAC= and since there are pretty much + // no other SPKAC decoders phpseclib will use that same format + return 'SPKAC=' . base64_encode($spkac); + } + } + + /** + * Load a Certificate Revocation List + * + * @param String $crl + * @access public + * @return Mixed + */ + function loadCRL($crl) + { + if (is_array($crl) && isset($crl['tbsCertList'])) { + $this->currentCert = $crl; + unset($this->signatureSubject); + return $crl; + } + + $asn1 = new File_ASN1(); + + $crl = $this->_extractBER($crl); + $orig = $crl; + + if ($crl === false) { + $this->currentCert = false; + return false; + } + + $asn1->loadOIDs($this->oids); + $decoded = $asn1->decodeBER($crl); + + if (empty($decoded)) { + $this->currentCert = false; + return false; + } + + $crl = $asn1->asn1map($decoded[0], $this->CertificateList); + if (!isset($crl) || $crl === false) { + $this->currentCert = false; + return false; + } + + $this->signatureSubject = substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); + + $this->_mapInExtensions($crl, 'tbsCertList/crlExtensions', $asn1); + $rclist = &$this->_subArray($crl, 'tbsCertList/revokedCertificates'); + if (is_array($rclist)) { + foreach ($rclist as $i => $extension) { + $this->_mapInExtensions($rclist, "$i/crlEntryExtensions", $asn1); + } + } + + $this->currentKeyIdentifier = null; + $this->currentCert = $crl; + + return $crl; + } + + /** + * Save Certificate Revocation List. + * + * @param Array $crl + * @param Integer $format optional + * @access public + * @return String + */ + function saveCRL($crl, $format = FILE_X509_FORMAT_PEM) + { + if (!is_array($crl) || !isset($crl['tbsCertList'])) { + return false; + } + + $asn1 = new File_ASN1(); + + $asn1->loadOIDs($this->oids); + + $filters = array(); + $filters['tbsCertList']['issuer']['rdnSequence']['value'] + = array('type' => FILE_ASN1_TYPE_UTF8_STRING); + $filters['tbsCertList']['signature']['parameters'] + = array('type' => FILE_ASN1_TYPE_UTF8_STRING); + $filters['signatureAlgorithm']['parameters'] + = array('type' => FILE_ASN1_TYPE_UTF8_STRING); + + if (empty($crl['tbsCertList']['signature']['parameters'])) { + $filters['tbsCertList']['signature']['parameters'] + = array('type' => FILE_ASN1_TYPE_NULL); + } + + if (empty($crl['signatureAlgorithm']['parameters'])) { + $filters['signatureAlgorithm']['parameters'] + = array('type' => FILE_ASN1_TYPE_NULL); + } + + $asn1->loadFilters($filters); + + $this->_mapOutExtensions($crl, 'tbsCertList/crlExtensions', $asn1); + $rclist = &$this->_subArray($crl, 'tbsCertList/revokedCertificates'); + if (is_array($rclist)) { + foreach ($rclist as $i => $extension) { + $this->_mapOutExtensions($rclist, "$i/crlEntryExtensions", $asn1); + } + } + + $crl = $asn1->encodeDER($crl, $this->CertificateList); + + switch ($format) { + case FILE_X509_FORMAT_DER: + return $crl; + // case FILE_X509_FORMAT_PEM: + default: + return "-----BEGIN X509 CRL-----\r\n" . chunk_split(base64_encode($crl), 64) . '-----END X509 CRL-----'; + } + } + + /** + * Helper function to build a time field according to RFC 3280 section + * - 4.1.2.5 Validity + * - 5.1.2.4 This Update + * - 5.1.2.5 Next Update + * - 5.1.2.6 Revoked Certificates + * by choosing utcTime iff year of date given is before 2050 and generalTime else. + * + * @param String $date in format date('D, d M Y H:i:s O') + * @access private + * @return Array + */ + function _timeField($date) + { + $year = @gmdate("Y", @strtotime($date)); // the same way ASN1.php parses this + if ($year < 2050) { + return array('utcTime' => $date); + } else { + return array('generalTime' => $date); + } + } + + /** + * Sign an X.509 certificate + * + * $issuer's private key needs to be loaded. + * $subject can be either an existing X.509 cert (if you want to resign it), + * a CSR or something with the DN and public key explicitly set. + * + * @param File_X509 $issuer + * @param File_X509 $subject + * @param String $signatureAlgorithm optional + * @access public + * @return Mixed + */ + function sign($issuer, $subject, $signatureAlgorithm = 'sha1WithRSAEncryption') + { + if (!is_object($issuer->privateKey) || empty($issuer->dn)) { + return false; + } + + if (isset($subject->publicKey) && !($subjectPublicKey = $subject->_formatSubjectPublicKey())) { + return false; + } + + $currentCert = isset($this->currentCert) ? $this->currentCert : null; + $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject: null; + + if (isset($subject->currentCert) && is_array($subject->currentCert) && isset($subject->currentCert['tbsCertificate'])) { + $this->currentCert = $subject->currentCert; + $this->currentCert['tbsCertificate']['signature']['algorithm'] = $signatureAlgorithm; + $this->currentCert['signatureAlgorithm']['algorithm'] = $signatureAlgorithm; + + if (!empty($this->startDate)) { + $this->currentCert['tbsCertificate']['validity']['notBefore'] = $this->_timeField($this->startDate); + } + if (!empty($this->endDate)) { + $this->currentCert['tbsCertificate']['validity']['notAfter'] = $this->_timeField($this->endDate); + } + if (!empty($this->serialNumber)) { + $this->currentCert['tbsCertificate']['serialNumber'] = $this->serialNumber; + } + if (!empty($subject->dn)) { + $this->currentCert['tbsCertificate']['subject'] = $subject->dn; + } + if (!empty($subject->publicKey)) { + $this->currentCert['tbsCertificate']['subjectPublicKeyInfo'] = $subjectPublicKey; + } + $this->removeExtension('id-ce-authorityKeyIdentifier'); + if (isset($subject->domains)) { + $this->removeExtension('id-ce-subjectAltName'); + } + } else if (isset($subject->currentCert) && is_array($subject->currentCert) && isset($subject->currentCert['tbsCertList'])) { + return false; + } else { + if (!isset($subject->publicKey)) { + return false; + } + + $startDate = !empty($this->startDate) ? $this->startDate : @date('D, d M Y H:i:s O'); + $endDate = !empty($this->endDate) ? $this->endDate : @date('D, d M Y H:i:s O', strtotime('+1 year')); + $serialNumber = !empty($this->serialNumber) ? $this->serialNumber : new Math_BigInteger(); + + $this->currentCert = array( + 'tbsCertificate' => + array( + 'version' => 'v3', + 'serialNumber' => $serialNumber, // $this->setserialNumber() + 'signature' => array('algorithm' => $signatureAlgorithm), + 'issuer' => false, // this is going to be overwritten later + 'validity' => array( + 'notBefore' => $this->_timeField($startDate), // $this->setStartDate() + 'notAfter' => $this->_timeField($endDate) // $this->setEndDate() + ), + 'subject' => $subject->dn, + 'subjectPublicKeyInfo' => $subjectPublicKey + ), + 'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm), + 'signature' => false // this is going to be overwritten later + ); + + // Copy extensions from CSR. + $csrexts = $subject->getAttribute('pkcs-9-at-extensionRequest', 0); + + if (!empty($csrexts)) { + $this->currentCert['tbsCertificate']['extensions'] = $csrexts; + } + } + + $this->currentCert['tbsCertificate']['issuer'] = $issuer->dn; + + if (isset($issuer->currentKeyIdentifier)) { + $this->setExtension('id-ce-authorityKeyIdentifier', array( + //'authorityCertIssuer' => array( + // array( + // 'directoryName' => $issuer->dn + // ) + //), + 'keyIdentifier' => $issuer->currentKeyIdentifier + ) + ); + //$extensions = &$this->currentCert['tbsCertificate']['extensions']; + //if (isset($issuer->serialNumber)) { + // $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber; + //} + //unset($extensions); + } + + if (isset($subject->currentKeyIdentifier)) { + $this->setExtension('id-ce-subjectKeyIdentifier', $subject->currentKeyIdentifier); + } + + $altName = array(); + + if (isset($subject->domains) && count($subject->domains) > 1) { + $altName = array_map(array('File_X509', '_dnsName'), $subject->domains); + } + + if (isset($subject->ipAddresses) && count($subject->ipAddresses)) { + // should an IP address appear as the CN if no domain name is specified? idk + //$ips = count($subject->domains) ? $subject->ipAddresses : array_slice($subject->ipAddresses, 1); + $ipAddresses = array(); + foreach ($subject->ipAddresses as $ipAddress) { + $encoded = $subject->_ipAddress($ipAddress); + if ($encoded !== false) { + $ipAddresses[] = $encoded; + } + } + if (count($ipAddresses)) { + $altName = array_merge($altName, $ipAddresses); + } + } + + if (!empty($altName)) { + $this->setExtension('id-ce-subjectAltName', $altName); + } + + if ($this->caFlag) { + $keyUsage = $this->getExtension('id-ce-keyUsage'); + if (!$keyUsage) { + $keyUsage = array(); + } + + $this->setExtension('id-ce-keyUsage', + array_values(array_unique(array_merge($keyUsage, array('cRLSign', 'keyCertSign')))) + ); + + $basicConstraints = $this->getExtension('id-ce-basicConstraints'); + if (!$basicConstraints) { + $basicConstraints = array(); + } + + $this->setExtension('id-ce-basicConstraints', + array_unique(array_merge(array('cA' => true), $basicConstraints)), true); + + if (!isset($subject->currentKeyIdentifier)) { + $this->setExtension('id-ce-subjectKeyIdentifier', base64_encode($this->computeKeyIdentifier($this->currentCert)), false, false); + } + } + + // resync $this->signatureSubject + // save $tbsCertificate in case there are any File_ASN1_Element objects in it + $tbsCertificate = $this->currentCert['tbsCertificate']; + $this->loadX509($this->saveX509($this->currentCert)); + + $result = $this->_sign($issuer->privateKey, $signatureAlgorithm); + $result['tbsCertificate'] = $tbsCertificate; + + $this->currentCert = $currentCert; + $this->signatureSubject = $signatureSubject; + + return $result; + } + + /** + * Sign a CSR + * + * @access public + * @return Mixed + */ + function signCSR($signatureAlgorithm = 'sha1WithRSAEncryption') + { + if (!is_object($this->privateKey) || empty($this->dn)) { + return false; + } + + $origPublicKey = $this->publicKey; + $class = get_class($this->privateKey); + $this->publicKey = new $class(); + $this->publicKey->loadKey($this->privateKey->getPublicKey()); + $this->publicKey->setPublicKey(); + if (!($publicKey = $this->_formatSubjectPublicKey())) { + return false; + } + $this->publicKey = $origPublicKey; + + $currentCert = isset($this->currentCert) ? $this->currentCert : null; + $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject: null; + + if (isset($this->currentCert) && is_array($this->currentCert) && isset($this->currentCert['certificationRequestInfo'])) { + $this->currentCert['signatureAlgorithm']['algorithm'] = $signatureAlgorithm; + if (!empty($this->dn)) { + $this->currentCert['certificationRequestInfo']['subject'] = $this->dn; + } + $this->currentCert['certificationRequestInfo']['subjectPKInfo'] = $publicKey; + } else { + $this->currentCert = array( + 'certificationRequestInfo' => + array( + 'version' => 'v1', + 'subject' => $this->dn, + 'subjectPKInfo' => $publicKey + ), + 'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm), + 'signature' => false // this is going to be overwritten later + ); + } + + // resync $this->signatureSubject + // save $certificationRequestInfo in case there are any File_ASN1_Element objects in it + $certificationRequestInfo = $this->currentCert['certificationRequestInfo']; + $this->loadCSR($this->saveCSR($this->currentCert)); + + $result = $this->_sign($this->privateKey, $signatureAlgorithm); + $result['certificationRequestInfo'] = $certificationRequestInfo; + + $this->currentCert = $currentCert; + $this->signatureSubject = $signatureSubject; + + return $result; + } + + /** + * Sign a SPKAC + * + * @access public + * @return Mixed + */ + function signSPKAC($signatureAlgorithm = 'sha1WithRSAEncryption') + { + if (!is_object($this->privateKey)) { + return false; + } + + $origPublicKey = $this->publicKey; + $class = get_class($this->privateKey); + $this->publicKey = new $class(); + $this->publicKey->loadKey($this->privateKey->getPublicKey()); + $this->publicKey->setPublicKey(); + $publicKey = $this->_formatSubjectPublicKey(); + if (!$publicKey) { + return false; + } + $this->publicKey = $origPublicKey; + + $currentCert = isset($this->currentCert) ? $this->currentCert : null; + $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject: null; + + // re-signing a SPKAC seems silly but since everything else supports re-signing why not? + if (isset($this->currentCert) && is_array($this->currentCert) && isset($this->currentCert['publicKeyAndChallenge'])) { + $this->currentCert['signatureAlgorithm']['algorithm'] = $signatureAlgorithm; + $this->currentCert['publicKeyAndChallenge']['spki'] = $publicKey; + if (!empty($this->challenge)) { + // the bitwise AND ensures that the output is a valid IA5String + $this->currentCert['publicKeyAndChallenge']['challenge'] = $this->challenge & str_repeat("\x7F", strlen($this->challenge)); + } + } else { + $this->currentCert = array( + 'publicKeyAndChallenge' => + array( + 'spki' => $publicKey, + // quoting , + // "A challenge string that is submitted along with the public key. Defaults to an empty string if not specified." + // both Firefox and OpenSSL ("openssl spkac -key private.key") behave this way + // we could alternatively do this instead if we ignored the specs: + // crypt_random_string(8) & str_repeat("\x7F", 8) + 'challenge' => !empty($this->challenge) ? $this->challenge : '' + ), + 'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm), + 'signature' => false // this is going to be overwritten later + ); + } + + // resync $this->signatureSubject + // save $publicKeyAndChallenge in case there are any File_ASN1_Element objects in it + $publicKeyAndChallenge = $this->currentCert['publicKeyAndChallenge']; + $this->loadSPKAC($this->saveSPKAC($this->currentCert)); + + $result = $this->_sign($this->privateKey, $signatureAlgorithm); + $result['publicKeyAndChallenge'] = $publicKeyAndChallenge; + + $this->currentCert = $currentCert; + $this->signatureSubject = $signatureSubject; + + return $result; + } + + /** + * Sign a CRL + * + * $issuer's private key needs to be loaded. + * + * @param File_X509 $issuer + * @param File_X509 $crl + * @param String $signatureAlgorithm optional + * @access public + * @return Mixed + */ + function signCRL($issuer, $crl, $signatureAlgorithm = 'sha1WithRSAEncryption') + { + if (!is_object($issuer->privateKey) || empty($issuer->dn)) { + return false; + } + + $currentCert = isset($this->currentCert) ? $this->currentCert : null; + $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject : null; + $thisUpdate = !empty($this->startDate) ? $this->startDate : @date('D, d M Y H:i:s O'); + + if (isset($crl->currentCert) && is_array($crl->currentCert) && isset($crl->currentCert['tbsCertList'])) { + $this->currentCert = $crl->currentCert; + $this->currentCert['tbsCertList']['signature']['algorithm'] = $signatureAlgorithm; + $this->currentCert['signatureAlgorithm']['algorithm'] = $signatureAlgorithm; + } else { + $this->currentCert = array( + 'tbsCertList' => + array( + 'version' => 'v2', + 'signature' => array('algorithm' => $signatureAlgorithm), + 'issuer' => false, // this is going to be overwritten later + 'thisUpdate' => $this->_timeField($thisUpdate) // $this->setStartDate() + ), + 'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm), + 'signature' => false // this is going to be overwritten later + ); + } + + $tbsCertList = &$this->currentCert['tbsCertList']; + $tbsCertList['issuer'] = $issuer->dn; + $tbsCertList['thisUpdate'] = $this->_timeField($thisUpdate); + + if (!empty($this->endDate)) { + $tbsCertList['nextUpdate'] = $this->_timeField($this->endDate); // $this->setEndDate() + } else { + unset($tbsCertList['nextUpdate']); + } + + if (!empty($this->serialNumber)) { + $crlNumber = $this->serialNumber; + } else { + $crlNumber = $this->getExtension('id-ce-cRLNumber'); + $crlNumber = $crlNumber !== false ? $crlNumber->add(new Math_BigInteger(1)) : null; + } + + $this->removeExtension('id-ce-authorityKeyIdentifier'); + $this->removeExtension('id-ce-issuerAltName'); + + // Be sure version >= v2 if some extension found. + $version = isset($tbsCertList['version']) ? $tbsCertList['version'] : 0; + if (!$version) { + if (!empty($tbsCertList['crlExtensions'])) { + $version = 1; // v2. + } elseif (!empty($tbsCertList['revokedCertificates'])) { + foreach ($tbsCertList['revokedCertificates'] as $cert) { + if (!empty($cert['crlEntryExtensions'])) { + $version = 1; // v2. + } + } + } + + if ($version) { + $tbsCertList['version'] = $version; + } + } + + // Store additional extensions. + if (!empty($tbsCertList['version'])) { // At least v2. + if (!empty($crlNumber)) { + $this->setExtension('id-ce-cRLNumber', $crlNumber); + } + + if (isset($issuer->currentKeyIdentifier)) { + $this->setExtension('id-ce-authorityKeyIdentifier', array( + //'authorityCertIssuer' => array( + // array( + // 'directoryName' => $issuer->dn + // ) + //), + 'keyIdentifier' => $issuer->currentKeyIdentifier + ) + ); + //$extensions = &$tbsCertList['crlExtensions']; + //if (isset($issuer->serialNumber)) { + // $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber; + //} + //unset($extensions); + } + + $issuerAltName = $this->getExtension('id-ce-subjectAltName', $issuer->currentCert); + + if ($issuerAltName !== false) { + $this->setExtension('id-ce-issuerAltName', $issuerAltName); + } + } + + if (empty($tbsCertList['revokedCertificates'])) { + unset($tbsCertList['revokedCertificates']); + } + + unset($tbsCertList); + + // resync $this->signatureSubject + // save $tbsCertList in case there are any File_ASN1_Element objects in it + $tbsCertList = $this->currentCert['tbsCertList']; + $this->loadCRL($this->saveCRL($this->currentCert)); + + $result = $this->_sign($issuer->privateKey, $signatureAlgorithm); + $result['tbsCertList'] = $tbsCertList; + + $this->currentCert = $currentCert; + $this->signatureSubject = $signatureSubject; + + return $result; + } + + /** + * X.509 certificate signing helper function. + * + * @param Object $key + * @param File_X509 $subject + * @param String $signatureAlgorithm + * @access public + * @return Mixed + */ + function _sign($key, $signatureAlgorithm) + { + switch (strtolower(get_class($key))) { + case 'crypt_rsa': + switch ($signatureAlgorithm) { + case 'md2WithRSAEncryption': + case 'md5WithRSAEncryption': + case 'sha1WithRSAEncryption': + case 'sha224WithRSAEncryption': + case 'sha256WithRSAEncryption': + case 'sha384WithRSAEncryption': + case 'sha512WithRSAEncryption': + $key->setHash(preg_replace('#WithRSAEncryption$#', '', $signatureAlgorithm)); + $key->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); + + $this->currentCert['signature'] = base64_encode("\0" . $key->sign($this->signatureSubject)); + return $this->currentCert; + } + default: + return false; + } + } + + /** + * Set certificate start date + * + * @param String $date + * @access public + */ + function setStartDate($date) + { + $this->startDate = @date('D, d M Y H:i:s O', @strtotime($date)); + } + + /** + * Set certificate end date + * + * @param String $date + * @access public + */ + function setEndDate($date) + { + /* + To indicate that a certificate has no well-defined expiration date, + the notAfter SHOULD be assigned the GeneralizedTime value of + 99991231235959Z. + + -- http://tools.ietf.org/html/rfc5280#section-4.1.2.5 + */ + if (strtolower($date) == 'lifetime') { + $temp = '99991231235959Z'; + $asn1 = new File_ASN1(); + $temp = chr(FILE_ASN1_TYPE_GENERALIZED_TIME) . $asn1->_encodeLength(strlen($temp)) . $temp; + $this->endDate = new File_ASN1_Element($temp); + } else { + $this->endDate = @date('D, d M Y H:i:s O', @strtotime($date)); + } + } + + /** + * Set Serial Number + * + * @param String $serial + * @param $base optional + * @access public + */ + function setSerialNumber($serial, $base = -256) + { + $this->serialNumber = new Math_BigInteger($serial, $base); + } + + /** + * Turns the certificate into a certificate authority + * + * @access public + */ + function makeCA() + { + $this->caFlag = true; + } + + /** + * Get a reference to a subarray + * + * @param array $root + * @param String $path absolute path with / as component separator + * @param Boolean $create optional + * @access private + * @return array item ref or false + */ + function &_subArray(&$root, $path, $create = false) + { + $false = false; + + if (!is_array($root)) { + return $false; + } + + foreach (explode('/', $path) as $i) { + if (!is_array($root)) { + return $false; + } + + if (!isset($root[$i])) { + if (!$create) { + return $false; + } + + $root[$i] = array(); + } + + $root = &$root[$i]; + } + + return $root; + } + + /** + * Get a reference to an extension subarray + * + * @param array $root + * @param String $path optional absolute path with / as component separator + * @param Boolean $create optional + * @access private + * @return array ref or false + */ + function &_extensions(&$root, $path = null, $create = false) + { + if (!isset($root)) { + $root = $this->currentCert; + } + + switch (true) { + case !empty($path): + case !is_array($root): + break; + case isset($root['tbsCertificate']): + $path = 'tbsCertificate/extensions'; + break; + case isset($root['tbsCertList']): + $path = 'tbsCertList/crlExtensions'; + break; + case isset($root['certificationRequestInfo']): + $pth = 'certificationRequestInfo/attributes'; + $attributes = &$this->_subArray($root, $pth, $create); + + if (is_array($attributes)) { + foreach ($attributes as $key => $value) { + if ($value['type'] == 'pkcs-9-at-extensionRequest') { + $path = "$pth/$key/value/0"; + break 2; + } + } + if ($create) { + $key = count($attributes); + $attributes[] = array('type' => 'pkcs-9-at-extensionRequest', 'value' => array()); + $path = "$pth/$key/value/0"; + } + } + break; + } + + $extensions = &$this->_subArray($root, $path, $create); + + if (!is_array($extensions)) { + $false = false; + return $false; + } + + return $extensions; + } + + /** + * Remove an Extension + * + * @param String $id + * @param String $path optional + * @access private + * @return Boolean + */ + function _removeExtension($id, $path = null) + { + $extensions = &$this->_extensions($this->currentCert, $path); + + if (!is_array($extensions)) { + return false; + } + + $result = false; + foreach ($extensions as $key => $value) { + if ($value['extnId'] == $id) { + unset($extensions[$key]); + $result = true; + } + } + + $extensions = array_values($extensions); + return $result; + } + + /** + * Get an Extension + * + * Returns the extension if it exists and false if not + * + * @param String $id + * @param Array $cert optional + * @param String $path optional + * @access private + * @return Mixed + */ + function _getExtension($id, $cert = null, $path = null) + { + $extensions = $this->_extensions($cert, $path); + + if (!is_array($extensions)) { + return false; + } + + foreach ($extensions as $key => $value) { + if ($value['extnId'] == $id) { + return $value['extnValue']; + } + } + + return false; + } + + /** + * Returns a list of all extensions in use + * + * @param array $cert optional + * @param String $path optional + * @access private + * @return Array + */ + function _getExtensions($cert = null, $path = null) + { + $exts = $this->_extensions($cert, $path); + $extensions = array(); + + if (is_array($exts)) { + foreach ($exts as $extension) { + $extensions[] = $extension['extnId']; + } + } + + return $extensions; + } + + /** + * Set an Extension + * + * @param String $id + * @param Mixed $value + * @param Boolean $critical optional + * @param Boolean $replace optional + * @param String $path optional + * @access private + * @return Boolean + */ + function _setExtension($id, $value, $critical = false, $replace = true, $path = null) + { + $extensions = &$this->_extensions($this->currentCert, $path, true); + + if (!is_array($extensions)) { + return false; + } + + $newext = array('extnId' => $id, 'critical' => $critical, 'extnValue' => $value); + + foreach ($extensions as $key => $value) { + if ($value['extnId'] == $id) { + if (!$replace) { + return false; + } + + $extensions[$key] = $newext; + return true; + } + } + + $extensions[] = $newext; + return true; + } + + /** + * Remove a certificate, CSR or CRL Extension + * + * @param String $id + * @access public + * @return Boolean + */ + function removeExtension($id) + { + return $this->_removeExtension($id); + } + + /** + * Get a certificate, CSR or CRL Extension + * + * Returns the extension if it exists and false if not + * + * @param String $id + * @param Array $cert optional + * @access public + * @return Mixed + */ + function getExtension($id, $cert = null) + { + return $this->_getExtension($id, $cert); + } + + /** + * Returns a list of all extensions in use in certificate, CSR or CRL + * + * @param array $cert optional + * @access public + * @return Array + */ + function getExtensions($cert = null) + { + return $this->_getExtensions($cert); + } + + /** + * Set a certificate, CSR or CRL Extension + * + * @param String $id + * @param Mixed $value + * @param Boolean $critical optional + * @param Boolean $replace optional + * @access public + * @return Boolean + */ + function setExtension($id, $value, $critical = false, $replace = true) + { + return $this->_setExtension($id, $value, $critical, $replace); + } + + /** + * Remove a CSR attribute. + * + * @param String $id + * @param Integer $disposition optional + * @access public + * @return Boolean + */ + function removeAttribute($id, $disposition = FILE_X509_ATTR_ALL) + { + $attributes = &$this->_subArray($this->currentCert, 'certificationRequestInfo/attributes'); + + if (!is_array($attributes)) { + return false; + } + + $result = false; + foreach ($attributes as $key => $attribute) { + if ($attribute['type'] == $id) { + $n = count($attribute['value']); + switch (true) { + case $disposition == FILE_X509_ATTR_APPEND: + case $disposition == FILE_X509_ATTR_REPLACE: + return false; + case $disposition >= $n: + $disposition -= $n; + break; + case $disposition == FILE_X509_ATTR_ALL: + case $n == 1: + unset($attributes[$key]); + $result = true; + break; + default: + unset($attributes[$key]['value'][$disposition]); + $attributes[$key]['value'] = array_values($attributes[$key]['value']); + $result = true; + break; + } + if ($result && $disposition != FILE_X509_ATTR_ALL) { + break; + } + } + } + + $attributes = array_values($attributes); + return $result; + } + + /** + * Get a CSR attribute + * + * Returns the attribute if it exists and false if not + * + * @param String $id + * @param Integer $disposition optional + * @param Array $csr optional + * @access public + * @return Mixed + */ + function getAttribute($id, $disposition = FILE_X509_ATTR_ALL, $csr = null) + { + if (empty($csr)) { + $csr = $this->currentCert; + } + + $attributes = $this->_subArray($csr, 'certificationRequestInfo/attributes'); + + if (!is_array($attributes)) { + return false; + } + + foreach ($attributes as $key => $attribute) { + if ($attribute['type'] == $id) { + $n = count($attribute['value']); + switch (true) { + case $disposition == FILE_X509_ATTR_APPEND: + case $disposition == FILE_X509_ATTR_REPLACE: + return false; + case $disposition == FILE_X509_ATTR_ALL: + return $attribute['value']; + case $disposition >= $n: + $disposition -= $n; + break; + default: + return $attribute['value'][$disposition]; + } + } + } + + return false; + } + + /** + * Returns a list of all CSR attributes in use + * + * @param array $csr optional + * @access public + * @return Array + */ + function getAttributes($csr = null) + { + if (empty($csr)) { + $csr = $this->currentCert; + } + + $attributes = $this->_subArray($csr, 'certificationRequestInfo/attributes'); + $attrs = array(); + + if (is_array($attributes)) { + foreach ($attributes as $attribute) { + $attrs[] = $attribute['type']; + } + } + + return $attrs; + } + + /** + * Set a CSR attribute + * + * @param String $id + * @param Mixed $value + * @param Boolean $disposition optional + * @access public + * @return Boolean + */ + function setAttribute($id, $value, $disposition = FILE_X509_ATTR_ALL) + { + $attributes = &$this->_subArray($this->currentCert, 'certificationRequestInfo/attributes', true); + + if (!is_array($attributes)) { + return false; + } + + switch ($disposition) { + case FILE_X509_ATTR_REPLACE: + $disposition = FILE_X509_ATTR_APPEND; + case FILE_X509_ATTR_ALL: + $this->removeAttribute($id); + break; + } + + foreach ($attributes as $key => $attribute) { + if ($attribute['type'] == $id) { + $n = count($attribute['value']); + switch (true) { + case $disposition == FILE_X509_ATTR_APPEND: + $last = $key; + break; + case $disposition >= $n; + $disposition -= $n; + break; + default: + $attributes[$key]['value'][$disposition] = $value; + return true; + } + } + } + + switch (true) { + case $disposition >= 0: + return false; + case isset($last): + $attributes[$last]['value'][] = $value; + break; + default: + $attributes[] = array('type' => $id, 'value' => $disposition == FILE_X509_ATTR_ALL ? $value: array($value)); + break; + } + + return true; + } + + /** + * Sets the subject key identifier + * + * This is used by the id-ce-authorityKeyIdentifier and the id-ce-subjectKeyIdentifier extensions. + * + * @param String $value + * @access public + */ + function setKeyIdentifier($value) + { + if (empty($value)) { + unset($this->currentKeyIdentifier); + } else { + $this->currentKeyIdentifier = base64_encode($value); + } + } + + /** + * Compute a public key identifier. + * + * Although key identifiers may be set to any unique value, this function + * computes key identifiers from public key according to the two + * recommended methods (4.2.1.2 RFC 3280). + * Highly polymorphic: try to accept all possible forms of key: + * - Key object + * - File_X509 object with public or private key defined + * - Certificate or CSR array + * - File_ASN1_Element object + * - PEM or DER string + * + * @param Mixed $key optional + * @param Integer $method optional + * @access public + * @return String binary key identifier + */ + function computeKeyIdentifier($key = null, $method = 1) + { + if (is_null($key)) { + $key = $this; + } + + switch (true) { + case is_string($key): + break; + case is_array($key) && isset($key['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']): + return $this->computeKeyIdentifier($key['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], $method); + case is_array($key) && isset($key['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']): + return $this->computeKeyIdentifier($key['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'], $method); + case !is_object($key): + return false; + case strtolower(get_class($key)) == 'file_asn1_element': + // Assume the element is a bitstring-packed key. + $asn1 = new File_ASN1(); + $decoded = $asn1->decodeBER($key->element); + if (empty($decoded)) { + return false; + } + $raw = $asn1->asn1map($decoded[0], array('type' => FILE_ASN1_TYPE_BIT_STRING)); + if (empty($raw)) { + return false; + } + $raw = base64_decode($raw); + // If the key is private, compute identifier from its corresponding public key. + if (!class_exists('Crypt_RSA')) { + include_once 'Crypt/RSA.php'; + } + $key = new Crypt_RSA(); + if (!$key->loadKey($raw)) { + return false; // Not an unencrypted RSA key. + } + if ($key->getPrivateKey() !== false) { // If private. + return $this->computeKeyIdentifier($key, $method); + } + $key = $raw; // Is a public key. + break; + case strtolower(get_class($key)) == 'file_x509': + if (isset($key->publicKey)) { + return $this->computeKeyIdentifier($key->publicKey, $method); + } + if (isset($key->privateKey)) { + return $this->computeKeyIdentifier($key->privateKey, $method); + } + if (isset($key->currentCert['tbsCertificate']) || isset($key->currentCert['certificationRequestInfo'])) { + return $this->computeKeyIdentifier($key->currentCert, $method); + } + return false; + default: // Should be a key object (i.e.: Crypt_RSA). + $key = $key->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_PKCS1); + break; + } + + // If in PEM format, convert to binary. + $key = $this->_extractBER($key); + + // Now we have the key string: compute its sha-1 sum. + if (!class_exists('Crypt_Hash')) { + include_once 'Crypt/Hash.php'; + } + $hash = new Crypt_Hash('sha1'); + $hash = $hash->hash($key); + + if ($method == 2) { + $hash = substr($hash, -8); + $hash[0] = chr((ord($hash[0]) & 0x0F) | 0x40); + } + + return $hash; + } + + /** + * Format a public key as appropriate + * + * @access private + * @return Array + */ + function _formatSubjectPublicKey() + { + if (!isset($this->publicKey) || !is_object($this->publicKey)) { + return false; + } + + switch (strtolower(get_class($this->publicKey))) { + case 'crypt_rsa': + // the following two return statements do the same thing. i dunno.. i just prefer the later for some reason. + // the former is a good example of how to do fuzzing on the public key + //return new File_ASN1_Element(base64_decode(preg_replace('#-.+-|[\r\n]#', '', $this->publicKey->getPublicKey()))); + return array( + 'algorithm' => array('algorithm' => 'rsaEncryption'), + 'subjectPublicKey' => $this->publicKey->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_PKCS1) + ); + default: + return false; + } + } + + /** + * Set the domain name's which the cert is to be valid for + * + * @access public + * @return Array + */ + function setDomain() + { + $this->domains = func_get_args(); + $this->removeDNProp('id-at-commonName'); + $this->setDNProp('id-at-commonName', $this->domains[0]); + } + + /** + * Set the IP Addresses's which the cert is to be valid for + * + * @access public + * @param String $ipAddress optional + */ + function setIPAddress() + { + $this->ipAddresses = func_get_args(); + /* + if (!isset($this->domains)) { + $this->removeDNProp('id-at-commonName'); + $this->setDNProp('id-at-commonName', $this->ipAddresses[0]); + } + */ + } + + /** + * Helper function to build domain array + * + * @access private + * @param String $domain + * @return Array + */ + function _dnsName($domain) + { + return array('dNSName' => $domain); + } + + /** + * Helper function to build IP Address array + * + * (IPv6 is not currently supported) + * + * @access private + * @param String $address + * @return Array + */ + function _iPAddress($address) + { + return array('iPAddress' => $address); + } + + /** + * Get the index of a revoked certificate. + * + * @param array $rclist + * @param String $serial + * @param Boolean $create optional + * @access private + * @return Integer or false + */ + function _revokedCertificate(&$rclist, $serial, $create = false) + { + $serial = new Math_BigInteger($serial); + + foreach ($rclist as $i => $rc) { + if (!($serial->compare($rc['userCertificate']))) { + return $i; + } + } + + if (!$create) { + return false; + } + + $i = count($rclist); + $rclist[] = array('userCertificate' => $serial, + 'revocationDate' => $this->_timeField(@date('D, d M Y H:i:s O'))); + return $i; + } + + /** + * Revoke a certificate. + * + * @param String $serial + * @param String $date optional + * @access public + * @return Boolean + */ + function revoke($serial, $date = null) + { + if (isset($this->currentCert['tbsCertList'])) { + if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates', true))) { + if ($this->_revokedCertificate($rclist, $serial) === false) { // If not yet revoked + if (($i = $this->_revokedCertificate($rclist, $serial, true)) !== false) { + + if (!empty($date)) { + $rclist[$i]['revocationDate'] = $this->_timeField($date); + } + + return true; + } + } + } + } + + return false; + } + + /** + * Unrevoke a certificate. + * + * @param String $serial + * @access public + * @return Boolean + */ + function unrevoke($serial) + { + if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { + if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) { + unset($rclist[$i]); + $rclist = array_values($rclist); + return true; + } + } + + return false; + } + + /** + * Get a revoked certificate. + * + * @param String $serial + * @access public + * @return Mixed + */ + function getRevoked($serial) + { + if (is_array($rclist = $this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { + if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) { + return $rclist[$i]; + } + } + + return false; + } + + /** + * List revoked certificates + * + * @param array $crl optional + * @access public + * @return array + */ + function listRevoked($crl = null) + { + if (!isset($crl)) { + $crl = $this->currentCert; + } + + if (!isset($crl['tbsCertList'])) { + return false; + } + + $result = array(); + + if (is_array($rclist = $this->_subArray($crl, 'tbsCertList/revokedCertificates'))) { + foreach ($rclist as $rc) { + $result[] = $rc['userCertificate']->toString(); + } + } + + return $result; + } + + /** + * Remove a Revoked Certificate Extension + * + * @param String $serial + * @param String $id + * @access public + * @return Boolean + */ + function removeRevokedCertificateExtension($serial, $id) + { + if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { + if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) { + return $this->_removeExtension($id, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); + } + } + + return false; + } + + /** + * Get a Revoked Certificate Extension + * + * Returns the extension if it exists and false if not + * + * @param String $serial + * @param String $id + * @param Array $crl optional + * @access public + * @return Mixed + */ + function getRevokedCertificateExtension($serial, $id, $crl = null) + { + if (!isset($crl)) { + $crl = $this->currentCert; + } + + if (is_array($rclist = $this->_subArray($crl, 'tbsCertList/revokedCertificates'))) { + if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) { + return $this->_getExtension($id, $crl, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); + } + } + + return false; + } + + /** + * Returns a list of all extensions in use for a given revoked certificate + * + * @param String $serial + * @param array $crl optional + * @access public + * @return Array + */ + function getRevokedCertificateExtensions($serial, $crl = null) + { + if (!isset($crl)) { + $crl = $this->currentCert; + } + + if (is_array($rclist = $this->_subArray($crl, 'tbsCertList/revokedCertificates'))) { + if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) { + return $this->_getExtensions($crl, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); + } + } + + return false; + } + + /** + * Set a Revoked Certificate Extension + * + * @param String $serial + * @param String $id + * @param Mixed $value + * @param Boolean $critical optional + * @param Boolean $replace optional + * @access public + * @return Boolean + */ + function setRevokedCertificateExtension($serial, $id, $value, $critical = false, $replace = true) + { + if (isset($this->currentCert['tbsCertList'])) { + if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates', true))) { + if (($i = $this->_revokedCertificate($rclist, $serial, true)) !== false) { + return $this->_setExtension($id, $value, $critical, $replace, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); + } + } + } + + return false; + } + + /** + * Extract raw BER from Base64 encoding + * + * @access private + * @param String $str + * @return String + */ + function _extractBER($str) + { + /* X.509 certs are assumed to be base64 encoded but sometimes they'll have additional things in them + * above and beyond the ceritificate. + * ie. some may have the following preceding the -----BEGIN CERTIFICATE----- line: + * + * Bag Attributes + * localKeyID: 01 00 00 00 + * subject=/O=organization/OU=org unit/CN=common name + * issuer=/O=organization/CN=common name + */ + $temp = preg_replace('#.*?^-+[^-]+-+#ms', '', $str, 1); + // remove the -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- stuff + $temp = preg_replace('#-+[^-]+-+#', '', $temp); + // remove new lines + $temp = str_replace(array("\r", "\n", ' '), '', $temp); + $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? base64_decode($temp) : false; + return $temp != false ? $temp : $str; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Math/BigInteger.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Math/BigInteger.php new file mode 100755 index 00000000..8e54f741 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Math/BigInteger.php @@ -0,0 +1,3758 @@ +> and << cannot be used, nor can the modulo operator %, + * which only supports integers. Although this fact will slow this library down, the fact that such a high + * base is being used should more than compensate. + * + * Numbers are stored in {@link http://en.wikipedia.org/wiki/Endianness little endian} format. ie. + * (new Math_BigInteger(pow(2, 26)))->value = array(0, 1) + * + * Useful resources are as follows: + * + * - {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf Handbook of Applied Cryptography (HAC)} + * - {@link http://math.libtomcrypt.com/files/tommath.pdf Multi-Precision Math (MPM)} + * - Java's BigInteger classes. See /j2se/src/share/classes/java/math in jdk-1_5_0-src-jrl.zip + * + * Here's an example of how to use this library: + * + * add($b); + * + * echo $c->toString(); // outputs 5 + * ?> + * + * + * LICENSE: 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. + * + * @category Math + * @package Math_BigInteger + * @author Jim Wigginton + * @copyright 2006 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://pear.php.net/package/Math_BigInteger + */ + +/**#@+ + * Reduction constants + * + * @access private + * @see Math_BigInteger::_reduce() + */ +/** + * @see Math_BigInteger::_montgomery() + * @see Math_BigInteger::_prepMontgomery() + */ +define('MATH_BIGINTEGER_MONTGOMERY', 0); +/** + * @see Math_BigInteger::_barrett() + */ +define('MATH_BIGINTEGER_BARRETT', 1); +/** + * @see Math_BigInteger::_mod2() + */ +define('MATH_BIGINTEGER_POWEROF2', 2); +/** + * @see Math_BigInteger::_remainder() + */ +define('MATH_BIGINTEGER_CLASSIC', 3); +/** + * @see Math_BigInteger::__clone() + */ +define('MATH_BIGINTEGER_NONE', 4); +/**#@-*/ + +/**#@+ + * Array constants + * + * Rather than create a thousands and thousands of new Math_BigInteger objects in repeated function calls to add() and + * multiply() or whatever, we'll just work directly on arrays, taking them in as parameters and returning them. + * + * @access private + */ +/** + * $result[MATH_BIGINTEGER_VALUE] contains the value. + */ +define('MATH_BIGINTEGER_VALUE', 0); +/** + * $result[MATH_BIGINTEGER_SIGN] contains the sign. + */ +define('MATH_BIGINTEGER_SIGN', 1); +/**#@-*/ + +/**#@+ + * @access private + * @see Math_BigInteger::_montgomery() + * @see Math_BigInteger::_barrett() + */ +/** + * Cache constants + * + * $cache[MATH_BIGINTEGER_VARIABLE] tells us whether or not the cached data is still valid. + */ +define('MATH_BIGINTEGER_VARIABLE', 0); +/** + * $cache[MATH_BIGINTEGER_DATA] contains the cached data. + */ +define('MATH_BIGINTEGER_DATA', 1); +/**#@-*/ + +/**#@+ + * Mode constants. + * + * @access private + * @see Math_BigInteger::Math_BigInteger() + */ +/** + * To use the pure-PHP implementation + */ +define('MATH_BIGINTEGER_MODE_INTERNAL', 1); +/** + * To use the BCMath library + * + * (if enabled; otherwise, the internal implementation will be used) + */ +define('MATH_BIGINTEGER_MODE_BCMATH', 2); +/** + * To use the GMP library + * + * (if present; otherwise, either the BCMath or the internal implementation will be used) + */ +define('MATH_BIGINTEGER_MODE_GMP', 3); +/**#@-*/ + +/** + * Karatsuba Cutoff + * + * At what point do we switch between Karatsuba multiplication and schoolbook long multiplication? + * + * @access private + */ +define('MATH_BIGINTEGER_KARATSUBA_CUTOFF', 25); + +/** + * Pure-PHP arbitrary precision integer arithmetic library. Supports base-2, base-10, base-16, and base-256 + * numbers. + * + * @package Math_BigInteger + * @author Jim Wigginton + * @access public + */ +class Math_BigInteger +{ + /** + * Holds the BigInteger's value. + * + * @var Array + * @access private + */ + var $value; + + /** + * Holds the BigInteger's magnitude. + * + * @var Boolean + * @access private + */ + var $is_negative = false; + + /** + * Random number generator function + * + * @see setRandomGenerator() + * @access private + */ + var $generator = 'mt_rand'; + + /** + * Precision + * + * @see setPrecision() + * @access private + */ + var $precision = -1; + + /** + * Precision Bitmask + * + * @see setPrecision() + * @access private + */ + var $bitmask = false; + + /** + * Mode independent value used for serialization. + * + * If the bcmath or gmp extensions are installed $this->value will be a non-serializable resource, hence the need for + * a variable that'll be serializable regardless of whether or not extensions are being used. Unlike $this->value, + * however, $this->hex is only calculated when $this->__sleep() is called. + * + * @see __sleep() + * @see __wakeup() + * @var String + * @access private + */ + var $hex; + + /** + * Converts base-2, base-10, base-16, and binary strings (base-256) to BigIntegers. + * + * If the second parameter - $base - is negative, then it will be assumed that the number's are encoded using + * two's compliment. The sole exception to this is -10, which is treated the same as 10 is. + * + * Here's an example: + * + * toString(); // outputs 50 + * ?> + * + * + * @param optional $x base-10 number or base-$base number if $base set. + * @param optional integer $base + * @return Math_BigInteger + * @access public + */ + function Math_BigInteger($x = 0, $base = 10) + { + if ( !defined('MATH_BIGINTEGER_MODE') ) { + switch (true) { + case extension_loaded('gmp'): + define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_GMP); + break; + case extension_loaded('bcmath'): + define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_BCMATH); + break; + default: + define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_INTERNAL); + } + } + + if (function_exists('openssl_public_encrypt') && !defined('MATH_BIGINTEGER_OPENSSL_DISABLE') && !defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) { + // some versions of XAMPP have mismatched versions of OpenSSL which causes it not to work + ob_start(); + @phpinfo(); + $content = ob_get_contents(); + ob_end_clean(); + + preg_match_all('#OpenSSL (Header|Library) Version(.*)#im', $content, $matches); + + $versions = array(); + if (!empty($matches[1])) { + for ($i = 0; $i < count($matches[1]); $i++) { + $fullVersion = trim(str_replace('=>', '', strip_tags($matches[2][$i]))); + + // Remove letter part in OpenSSL version + if (!preg_match('/(\d+\.\d+\.\d+)/i', $fullVersion, $m)) { + $versions[$matches[1][$i]] = $fullVersion; + } else { + $versions[$matches[1][$i]] = $m[0]; + } + } + } + + // it doesn't appear that OpenSSL versions were reported upon until PHP 5.3+ + switch (true) { + case !isset($versions['Header']): + case !isset($versions['Library']): + case $versions['Header'] == $versions['Library']: + define('MATH_BIGINTEGER_OPENSSL_ENABLED', true); + break; + default: + define('MATH_BIGINTEGER_OPENSSL_DISABLE', true); + } + } + + if (!defined('PHP_INT_SIZE')) { + define('PHP_INT_SIZE', 4); + } + + if (!defined('MATH_BIGINTEGER_BASE') && MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_INTERNAL) { + switch (PHP_INT_SIZE) { + case 8: // use 64-bit integers if int size is 8 bytes + define('MATH_BIGINTEGER_BASE', 31); + define('MATH_BIGINTEGER_BASE_FULL', 0x80000000); + define('MATH_BIGINTEGER_MAX_DIGIT', 0x7FFFFFFF); + define('MATH_BIGINTEGER_MSB', 0x40000000); + // 10**9 is the closest we can get to 2**31 without passing it + define('MATH_BIGINTEGER_MAX10', 1000000000); + define('MATH_BIGINTEGER_MAX10_LEN', 9); + // the largest digit that may be used in addition / subtraction + define('MATH_BIGINTEGER_MAX_DIGIT2', pow(2, 62)); + break; + //case 4: // use 64-bit floats if int size is 4 bytes + default: + define('MATH_BIGINTEGER_BASE', 26); + define('MATH_BIGINTEGER_BASE_FULL', 0x4000000); + define('MATH_BIGINTEGER_MAX_DIGIT', 0x3FFFFFF); + define('MATH_BIGINTEGER_MSB', 0x2000000); + // 10**7 is the closest to 2**26 without passing it + define('MATH_BIGINTEGER_MAX10', 10000000); + define('MATH_BIGINTEGER_MAX10_LEN', 7); + // the largest digit that may be used in addition / subtraction + // we do pow(2, 52) instead of using 4503599627370496 directly because some + // PHP installations will truncate 4503599627370496. + define('MATH_BIGINTEGER_MAX_DIGIT2', pow(2, 52)); + } + } + + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + switch (true) { + case is_resource($x) && get_resource_type($x) == 'GMP integer': + // PHP 5.6 switched GMP from using resources to objects + case is_object($x) && get_class($x) == 'GMP': + $this->value = $x; + return; + } + $this->value = gmp_init(0); + break; + case MATH_BIGINTEGER_MODE_BCMATH: + $this->value = '0'; + break; + default: + $this->value = array(); + } + + // '0' counts as empty() but when the base is 256 '0' is equal to ord('0') or 48 + // '0' is the only value like this per http://php.net/empty + if (empty($x) && (abs($base) != 256 || $x !== '0')) { + return; + } + + switch ($base) { + case -256: + if (ord($x[0]) & 0x80) { + $x = ~$x; + $this->is_negative = true; + } + case 256: + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + $sign = $this->is_negative ? '-' : ''; + $this->value = gmp_init($sign . '0x' . bin2hex($x)); + break; + case MATH_BIGINTEGER_MODE_BCMATH: + // round $len to the nearest 4 (thanks, DavidMJ!) + $len = (strlen($x) + 3) & 0xFFFFFFFC; + + $x = str_pad($x, $len, chr(0), STR_PAD_LEFT); + + for ($i = 0; $i < $len; $i+= 4) { + $this->value = bcmul($this->value, '4294967296', 0); // 4294967296 == 2**32 + $this->value = bcadd($this->value, 0x1000000 * ord($x[$i]) + ((ord($x[$i + 1]) << 16) | (ord($x[$i + 2]) << 8) | ord($x[$i + 3])), 0); + } + + if ($this->is_negative) { + $this->value = '-' . $this->value; + } + + break; + // converts a base-2**8 (big endian / msb) number to base-2**26 (little endian / lsb) + default: + while (strlen($x)) { + $this->value[] = $this->_bytes2int($this->_base256_rshift($x, MATH_BIGINTEGER_BASE)); + } + } + + if ($this->is_negative) { + if (MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL) { + $this->is_negative = false; + } + $temp = $this->add(new Math_BigInteger('-1')); + $this->value = $temp->value; + } + break; + case 16: + case -16: + if ($base > 0 && $x[0] == '-') { + $this->is_negative = true; + $x = substr($x, 1); + } + + $x = preg_replace('#^(?:0x)?([A-Fa-f0-9]*).*#', '$1', $x); + + $is_negative = false; + if ($base < 0 && hexdec($x[0]) >= 8) { + $this->is_negative = $is_negative = true; + $x = bin2hex(~pack('H*', $x)); + } + + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = $this->is_negative ? '-0x' . $x : '0x' . $x; + $this->value = gmp_init($temp); + $this->is_negative = false; + break; + case MATH_BIGINTEGER_MODE_BCMATH: + $x = ( strlen($x) & 1 ) ? '0' . $x : $x; + $temp = new Math_BigInteger(pack('H*', $x), 256); + $this->value = $this->is_negative ? '-' . $temp->value : $temp->value; + $this->is_negative = false; + break; + default: + $x = ( strlen($x) & 1 ) ? '0' . $x : $x; + $temp = new Math_BigInteger(pack('H*', $x), 256); + $this->value = $temp->value; + } + + if ($is_negative) { + $temp = $this->add(new Math_BigInteger('-1')); + $this->value = $temp->value; + } + break; + case 10: + case -10: + // (?value = gmp_init($x); + break; + case MATH_BIGINTEGER_MODE_BCMATH: + // explicitly casting $x to a string is necessary, here, since doing $x[0] on -1 yields different + // results then doing it on '-1' does (modInverse does $x[0]) + $this->value = $x === '-' ? '0' : (string) $x; + break; + default: + $temp = new Math_BigInteger(); + + $multiplier = new Math_BigInteger(); + $multiplier->value = array(MATH_BIGINTEGER_MAX10); + + if ($x[0] == '-') { + $this->is_negative = true; + $x = substr($x, 1); + } + + $x = str_pad($x, strlen($x) + ((MATH_BIGINTEGER_MAX10_LEN - 1) * strlen($x)) % MATH_BIGINTEGER_MAX10_LEN, 0, STR_PAD_LEFT); + while (strlen($x)) { + $temp = $temp->multiply($multiplier); + $temp = $temp->add(new Math_BigInteger($this->_int2bytes(substr($x, 0, MATH_BIGINTEGER_MAX10_LEN)), 256)); + $x = substr($x, MATH_BIGINTEGER_MAX10_LEN); + } + + $this->value = $temp->value; + } + break; + case 2: // base-2 support originally implemented by Lluis Pamies - thanks! + case -2: + if ($base > 0 && $x[0] == '-') { + $this->is_negative = true; + $x = substr($x, 1); + } + + $x = preg_replace('#^([01]*).*#', '$1', $x); + $x = str_pad($x, strlen($x) + (3 * strlen($x)) % 4, 0, STR_PAD_LEFT); + + $str = '0x'; + while (strlen($x)) { + $part = substr($x, 0, 4); + $str.= dechex(bindec($part)); + $x = substr($x, 4); + } + + if ($this->is_negative) { + $str = '-' . $str; + } + + $temp = new Math_BigInteger($str, 8 * $base); // ie. either -16 or +16 + $this->value = $temp->value; + $this->is_negative = $temp->is_negative; + + break; + default: + // base not supported, so we'll let $this == 0 + } + } + + /** + * Converts a BigInteger to a byte string (eg. base-256). + * + * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're + * saved as two's compliment. + * + * Here's an example: + * + * toBytes(); // outputs chr(65) + * ?> + * + * + * @param Boolean $twos_compliment + * @return String + * @access public + * @internal Converts a base-2**26 number to base-2**8 + */ + function toBytes($twos_compliment = false) + { + if ($twos_compliment) { + $comparison = $this->compare(new Math_BigInteger()); + if ($comparison == 0) { + return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; + } + + $temp = $comparison < 0 ? $this->add(new Math_BigInteger(1)) : $this->copy(); + $bytes = $temp->toBytes(); + + if (empty($bytes)) { // eg. if the number we're trying to convert is -1 + $bytes = chr(0); + } + + if (ord($bytes[0]) & 0x80) { + $bytes = chr(0) . $bytes; + } + + return $comparison < 0 ? ~$bytes : $bytes; + } + + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + if (gmp_cmp($this->value, gmp_init(0)) == 0) { + return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; + } + + $temp = gmp_strval(gmp_abs($this->value), 16); + $temp = ( strlen($temp) & 1 ) ? '0' . $temp : $temp; + $temp = pack('H*', $temp); + + return $this->precision > 0 ? + substr(str_pad($temp, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) : + ltrim($temp, chr(0)); + case MATH_BIGINTEGER_MODE_BCMATH: + if ($this->value === '0') { + return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; + } + + $value = ''; + $current = $this->value; + + if ($current[0] == '-') { + $current = substr($current, 1); + } + + while (bccomp($current, '0', 0) > 0) { + $temp = bcmod($current, '16777216'); + $value = chr($temp >> 16) . chr($temp >> 8) . chr($temp) . $value; + $current = bcdiv($current, '16777216', 0); + } + + return $this->precision > 0 ? + substr(str_pad($value, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) : + ltrim($value, chr(0)); + } + + if (!count($this->value)) { + return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; + } + $result = $this->_int2bytes($this->value[count($this->value) - 1]); + + $temp = $this->copy(); + + for ($i = count($temp->value) - 2; $i >= 0; --$i) { + $temp->_base256_lshift($result, MATH_BIGINTEGER_BASE); + $result = $result | str_pad($temp->_int2bytes($temp->value[$i]), strlen($result), chr(0), STR_PAD_LEFT); + } + + return $this->precision > 0 ? + str_pad(substr($result, -(($this->precision + 7) >> 3)), ($this->precision + 7) >> 3, chr(0), STR_PAD_LEFT) : + $result; + } + + /** + * Converts a BigInteger to a hex string (eg. base-16)). + * + * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're + * saved as two's compliment. + * + * Here's an example: + * + * toHex(); // outputs '41' + * ?> + * + * + * @param Boolean $twos_compliment + * @return String + * @access public + * @internal Converts a base-2**26 number to base-2**8 + */ + function toHex($twos_compliment = false) + { + return bin2hex($this->toBytes($twos_compliment)); + } + + /** + * Converts a BigInteger to a bit string (eg. base-2). + * + * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're + * saved as two's compliment. + * + * Here's an example: + * + * toBits(); // outputs '1000001' + * ?> + * + * + * @param Boolean $twos_compliment + * @return String + * @access public + * @internal Converts a base-2**26 number to base-2**2 + */ + function toBits($twos_compliment = false) + { + $hex = $this->toHex($twos_compliment); + $bits = ''; + for ($i = strlen($hex) - 8, $start = strlen($hex) & 7; $i >= $start; $i-=8) { + $bits = str_pad(decbin(hexdec(substr($hex, $i, 8))), 32, '0', STR_PAD_LEFT) . $bits; + } + if ($start) { // hexdec('') == 0 + $bits = str_pad(decbin(hexdec(substr($hex, 0, $start))), 8, '0', STR_PAD_LEFT) . $bits; + } + $result = $this->precision > 0 ? substr($bits, -$this->precision) : ltrim($bits, '0'); + + if ($twos_compliment && $this->compare(new Math_BigInteger()) > 0 && $this->precision <= 0) { + return '0' . $result; + } + + return $result; + } + + /** + * Converts a BigInteger to a base-10 number. + * + * Here's an example: + * + * toString(); // outputs 50 + * ?> + * + * + * @return String + * @access public + * @internal Converts a base-2**26 number to base-10**7 (which is pretty much base-10) + */ + function toString() + { + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + return gmp_strval($this->value); + case MATH_BIGINTEGER_MODE_BCMATH: + if ($this->value === '0') { + return '0'; + } + + return ltrim($this->value, '0'); + } + + if (!count($this->value)) { + return '0'; + } + + $temp = $this->copy(); + $temp->is_negative = false; + + $divisor = new Math_BigInteger(); + $divisor->value = array(MATH_BIGINTEGER_MAX10); + $result = ''; + while (count($temp->value)) { + list($temp, $mod) = $temp->divide($divisor); + $result = str_pad(isset($mod->value[0]) ? $mod->value[0] : '', MATH_BIGINTEGER_MAX10_LEN, '0', STR_PAD_LEFT) . $result; + } + $result = ltrim($result, '0'); + if (empty($result)) { + $result = '0'; + } + + if ($this->is_negative) { + $result = '-' . $result; + } + + return $result; + } + + /** + * Copy an object + * + * PHP5 passes objects by reference while PHP4 passes by value. As such, we need a function to guarantee + * that all objects are passed by value, when appropriate. More information can be found here: + * + * {@link http://php.net/language.oop5.basic#51624} + * + * @access public + * @see __clone() + * @return Math_BigInteger + */ + function copy() + { + $temp = new Math_BigInteger(); + $temp->value = $this->value; + $temp->is_negative = $this->is_negative; + $temp->generator = $this->generator; + $temp->precision = $this->precision; + $temp->bitmask = $this->bitmask; + return $temp; + } + + /** + * __toString() magic method + * + * Will be called, automatically, if you're supporting just PHP5. If you're supporting PHP4, you'll need to call + * toString(). + * + * @access public + * @internal Implemented per a suggestion by Techie-Michael - thanks! + */ + function __toString() + { + return $this->toString(); + } + + /** + * __clone() magic method + * + * Although you can call Math_BigInteger::__toString() directly in PHP5, you cannot call Math_BigInteger::__clone() + * directly in PHP5. You can in PHP4 since it's not a magic method, but in PHP5, you have to call it by using the PHP5 + * only syntax of $y = clone $x. As such, if you're trying to write an application that works on both PHP4 and PHP5, + * call Math_BigInteger::copy(), instead. + * + * @access public + * @see copy() + * @return Math_BigInteger + */ + function __clone() + { + return $this->copy(); + } + + /** + * __sleep() magic method + * + * Will be called, automatically, when serialize() is called on a Math_BigInteger object. + * + * @see __wakeup() + * @access public + */ + function __sleep() + { + $this->hex = $this->toHex(true); + $vars = array('hex'); + if ($this->generator != 'mt_rand') { + $vars[] = 'generator'; + } + if ($this->precision > 0) { + $vars[] = 'precision'; + } + return $vars; + + } + + /** + * __wakeup() magic method + * + * Will be called, automatically, when unserialize() is called on a Math_BigInteger object. + * + * @see __sleep() + * @access public + */ + function __wakeup() + { + $temp = new Math_BigInteger($this->hex, -16); + $this->value = $temp->value; + $this->is_negative = $temp->is_negative; + $this->setRandomGenerator($this->generator); + if ($this->precision > 0) { + // recalculate $this->bitmask + $this->setPrecision($this->precision); + } + } + + /** + * Adds two BigIntegers. + * + * Here's an example: + * + * add($b); + * + * echo $c->toString(); // outputs 30 + * ?> + * + * + * @param Math_BigInteger $y + * @return Math_BigInteger + * @access public + * @internal Performs base-2**52 addition + */ + function add($y) + { + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = new Math_BigInteger(); + $temp->value = gmp_add($this->value, $y->value); + + return $this->_normalize($temp); + case MATH_BIGINTEGER_MODE_BCMATH: + $temp = new Math_BigInteger(); + $temp->value = bcadd($this->value, $y->value, 0); + + return $this->_normalize($temp); + } + + $temp = $this->_add($this->value, $this->is_negative, $y->value, $y->is_negative); + + $result = new Math_BigInteger(); + $result->value = $temp[MATH_BIGINTEGER_VALUE]; + $result->is_negative = $temp[MATH_BIGINTEGER_SIGN]; + + return $this->_normalize($result); + } + + /** + * Performs addition. + * + * @param Array $x_value + * @param Boolean $x_negative + * @param Array $y_value + * @param Boolean $y_negative + * @return Array + * @access private + */ + function _add($x_value, $x_negative, $y_value, $y_negative) + { + $x_size = count($x_value); + $y_size = count($y_value); + + if ($x_size == 0) { + return array( + MATH_BIGINTEGER_VALUE => $y_value, + MATH_BIGINTEGER_SIGN => $y_negative + ); + } else if ($y_size == 0) { + return array( + MATH_BIGINTEGER_VALUE => $x_value, + MATH_BIGINTEGER_SIGN => $x_negative + ); + } + + // subtract, if appropriate + if ( $x_negative != $y_negative ) { + if ( $x_value == $y_value ) { + return array( + MATH_BIGINTEGER_VALUE => array(), + MATH_BIGINTEGER_SIGN => false + ); + } + + $temp = $this->_subtract($x_value, false, $y_value, false); + $temp[MATH_BIGINTEGER_SIGN] = $this->_compare($x_value, false, $y_value, false) > 0 ? + $x_negative : $y_negative; + + return $temp; + } + + if ($x_size < $y_size) { + $size = $x_size; + $value = $y_value; + } else { + $size = $y_size; + $value = $x_value; + } + + $value[count($value)] = 0; // just in case the carry adds an extra digit + + $carry = 0; + for ($i = 0, $j = 1; $j < $size; $i+=2, $j+=2) { + $sum = $x_value[$j] * MATH_BIGINTEGER_BASE_FULL + $x_value[$i] + $y_value[$j] * MATH_BIGINTEGER_BASE_FULL + $y_value[$i] + $carry; + $carry = $sum >= MATH_BIGINTEGER_MAX_DIGIT2; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1 + $sum = $carry ? $sum - MATH_BIGINTEGER_MAX_DIGIT2 : $sum; + + $temp = MATH_BIGINTEGER_BASE === 26 ? intval($sum / 0x4000000) : ($sum >> 31); + + $value[$i] = (int) ($sum - MATH_BIGINTEGER_BASE_FULL * $temp); // eg. a faster alternative to fmod($sum, 0x4000000) + $value[$j] = $temp; + } + + if ($j == $size) { // ie. if $y_size is odd + $sum = $x_value[$i] + $y_value[$i] + $carry; + $carry = $sum >= MATH_BIGINTEGER_BASE_FULL; + $value[$i] = $carry ? $sum - MATH_BIGINTEGER_BASE_FULL : $sum; + ++$i; // ie. let $i = $j since we've just done $value[$i] + } + + if ($carry) { + for (; $value[$i] == MATH_BIGINTEGER_MAX_DIGIT; ++$i) { + $value[$i] = 0; + } + ++$value[$i]; + } + + return array( + MATH_BIGINTEGER_VALUE => $this->_trim($value), + MATH_BIGINTEGER_SIGN => $x_negative + ); + } + + /** + * Subtracts two BigIntegers. + * + * Here's an example: + * + * subtract($b); + * + * echo $c->toString(); // outputs -10 + * ?> + * + * + * @param Math_BigInteger $y + * @return Math_BigInteger + * @access public + * @internal Performs base-2**52 subtraction + */ + function subtract($y) + { + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = new Math_BigInteger(); + $temp->value = gmp_sub($this->value, $y->value); + + return $this->_normalize($temp); + case MATH_BIGINTEGER_MODE_BCMATH: + $temp = new Math_BigInteger(); + $temp->value = bcsub($this->value, $y->value, 0); + + return $this->_normalize($temp); + } + + $temp = $this->_subtract($this->value, $this->is_negative, $y->value, $y->is_negative); + + $result = new Math_BigInteger(); + $result->value = $temp[MATH_BIGINTEGER_VALUE]; + $result->is_negative = $temp[MATH_BIGINTEGER_SIGN]; + + return $this->_normalize($result); + } + + /** + * Performs subtraction. + * + * @param Array $x_value + * @param Boolean $x_negative + * @param Array $y_value + * @param Boolean $y_negative + * @return Array + * @access private + */ + function _subtract($x_value, $x_negative, $y_value, $y_negative) + { + $x_size = count($x_value); + $y_size = count($y_value); + + if ($x_size == 0) { + return array( + MATH_BIGINTEGER_VALUE => $y_value, + MATH_BIGINTEGER_SIGN => !$y_negative + ); + } else if ($y_size == 0) { + return array( + MATH_BIGINTEGER_VALUE => $x_value, + MATH_BIGINTEGER_SIGN => $x_negative + ); + } + + // add, if appropriate (ie. -$x - +$y or +$x - -$y) + if ( $x_negative != $y_negative ) { + $temp = $this->_add($x_value, false, $y_value, false); + $temp[MATH_BIGINTEGER_SIGN] = $x_negative; + + return $temp; + } + + $diff = $this->_compare($x_value, $x_negative, $y_value, $y_negative); + + if ( !$diff ) { + return array( + MATH_BIGINTEGER_VALUE => array(), + MATH_BIGINTEGER_SIGN => false + ); + } + + // switch $x and $y around, if appropriate. + if ( (!$x_negative && $diff < 0) || ($x_negative && $diff > 0) ) { + $temp = $x_value; + $x_value = $y_value; + $y_value = $temp; + + $x_negative = !$x_negative; + + $x_size = count($x_value); + $y_size = count($y_value); + } + + // at this point, $x_value should be at least as big as - if not bigger than - $y_value + + $carry = 0; + for ($i = 0, $j = 1; $j < $y_size; $i+=2, $j+=2) { + $sum = $x_value[$j] * MATH_BIGINTEGER_BASE_FULL + $x_value[$i] - $y_value[$j] * MATH_BIGINTEGER_BASE_FULL - $y_value[$i] - $carry; + $carry = $sum < 0; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1 + $sum = $carry ? $sum + MATH_BIGINTEGER_MAX_DIGIT2 : $sum; + + $temp = MATH_BIGINTEGER_BASE === 26 ? intval($sum / 0x4000000) : ($sum >> 31); + + $x_value[$i] = (int) ($sum - MATH_BIGINTEGER_BASE_FULL * $temp); + $x_value[$j] = $temp; + } + + if ($j == $y_size) { // ie. if $y_size is odd + $sum = $x_value[$i] - $y_value[$i] - $carry; + $carry = $sum < 0; + $x_value[$i] = $carry ? $sum + MATH_BIGINTEGER_BASE_FULL : $sum; + ++$i; + } + + if ($carry) { + for (; !$x_value[$i]; ++$i) { + $x_value[$i] = MATH_BIGINTEGER_MAX_DIGIT; + } + --$x_value[$i]; + } + + return array( + MATH_BIGINTEGER_VALUE => $this->_trim($x_value), + MATH_BIGINTEGER_SIGN => $x_negative + ); + } + + /** + * Multiplies two BigIntegers + * + * Here's an example: + * + * multiply($b); + * + * echo $c->toString(); // outputs 200 + * ?> + * + * + * @param Math_BigInteger $x + * @return Math_BigInteger + * @access public + */ + function multiply($x) + { + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = new Math_BigInteger(); + $temp->value = gmp_mul($this->value, $x->value); + + return $this->_normalize($temp); + case MATH_BIGINTEGER_MODE_BCMATH: + $temp = new Math_BigInteger(); + $temp->value = bcmul($this->value, $x->value, 0); + + return $this->_normalize($temp); + } + + $temp = $this->_multiply($this->value, $this->is_negative, $x->value, $x->is_negative); + + $product = new Math_BigInteger(); + $product->value = $temp[MATH_BIGINTEGER_VALUE]; + $product->is_negative = $temp[MATH_BIGINTEGER_SIGN]; + + return $this->_normalize($product); + } + + /** + * Performs multiplication. + * + * @param Array $x_value + * @param Boolean $x_negative + * @param Array $y_value + * @param Boolean $y_negative + * @return Array + * @access private + */ + function _multiply($x_value, $x_negative, $y_value, $y_negative) + { + //if ( $x_value == $y_value ) { + // return array( + // MATH_BIGINTEGER_VALUE => $this->_square($x_value), + // MATH_BIGINTEGER_SIGN => $x_sign != $y_value + // ); + //} + + $x_length = count($x_value); + $y_length = count($y_value); + + if ( !$x_length || !$y_length ) { // a 0 is being multiplied + return array( + MATH_BIGINTEGER_VALUE => array(), + MATH_BIGINTEGER_SIGN => false + ); + } + + return array( + MATH_BIGINTEGER_VALUE => min($x_length, $y_length) < 2 * MATH_BIGINTEGER_KARATSUBA_CUTOFF ? + $this->_trim($this->_regularMultiply($x_value, $y_value)) : + $this->_trim($this->_karatsuba($x_value, $y_value)), + MATH_BIGINTEGER_SIGN => $x_negative != $y_negative + ); + } + + /** + * Performs long multiplication on two BigIntegers + * + * Modeled after 'multiply' in MutableBigInteger.java. + * + * @param Array $x_value + * @param Array $y_value + * @return Array + * @access private + */ + function _regularMultiply($x_value, $y_value) + { + $x_length = count($x_value); + $y_length = count($y_value); + + if ( !$x_length || !$y_length ) { // a 0 is being multiplied + return array(); + } + + if ( $x_length < $y_length ) { + $temp = $x_value; + $x_value = $y_value; + $y_value = $temp; + + $x_length = count($x_value); + $y_length = count($y_value); + } + + $product_value = $this->_array_repeat(0, $x_length + $y_length); + + // the following for loop could be removed if the for loop following it + // (the one with nested for loops) initially set $i to 0, but + // doing so would also make the result in one set of unnecessary adds, + // since on the outermost loops first pass, $product->value[$k] is going + // to always be 0 + + $carry = 0; + + for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0 + $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0 + $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $product_value[$j] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); + } + + $product_value[$j] = $carry; + + // the above for loop is what the previous comment was talking about. the + // following for loop is the "one with nested for loops" + for ($i = 1; $i < $y_length; ++$i) { + $carry = 0; + + for ($j = 0, $k = $i; $j < $x_length; ++$j, ++$k) { + $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry; + $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $product_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); + } + + $product_value[$k] = $carry; + } + + return $product_value; + } + + /** + * Performs Karatsuba multiplication on two BigIntegers + * + * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=120 MPM 5.2.3}. + * + * @param Array $x_value + * @param Array $y_value + * @return Array + * @access private + */ + function _karatsuba($x_value, $y_value) + { + $m = min(count($x_value) >> 1, count($y_value) >> 1); + + if ($m < MATH_BIGINTEGER_KARATSUBA_CUTOFF) { + return $this->_regularMultiply($x_value, $y_value); + } + + $x1 = array_slice($x_value, $m); + $x0 = array_slice($x_value, 0, $m); + $y1 = array_slice($y_value, $m); + $y0 = array_slice($y_value, 0, $m); + + $z2 = $this->_karatsuba($x1, $y1); + $z0 = $this->_karatsuba($x0, $y0); + + $z1 = $this->_add($x1, false, $x0, false); + $temp = $this->_add($y1, false, $y0, false); + $z1 = $this->_karatsuba($z1[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_VALUE]); + $temp = $this->_add($z2, false, $z0, false); + $z1 = $this->_subtract($z1, false, $temp[MATH_BIGINTEGER_VALUE], false); + + $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2); + $z1[MATH_BIGINTEGER_VALUE] = array_merge(array_fill(0, $m, 0), $z1[MATH_BIGINTEGER_VALUE]); + + $xy = $this->_add($z2, false, $z1[MATH_BIGINTEGER_VALUE], $z1[MATH_BIGINTEGER_SIGN]); + $xy = $this->_add($xy[MATH_BIGINTEGER_VALUE], $xy[MATH_BIGINTEGER_SIGN], $z0, false); + + return $xy[MATH_BIGINTEGER_VALUE]; + } + + /** + * Performs squaring + * + * @param Array $x + * @return Array + * @access private + */ + function _square($x = false) + { + return count($x) < 2 * MATH_BIGINTEGER_KARATSUBA_CUTOFF ? + $this->_trim($this->_baseSquare($x)) : + $this->_trim($this->_karatsubaSquare($x)); + } + + /** + * Performs traditional squaring on two BigIntegers + * + * Squaring can be done faster than multiplying a number by itself can be. See + * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=7 HAC 14.2.4} / + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=141 MPM 5.3} for more information. + * + * @param Array $value + * @return Array + * @access private + */ + function _baseSquare($value) + { + if ( empty($value) ) { + return array(); + } + $square_value = $this->_array_repeat(0, 2 * count($value)); + + for ($i = 0, $max_index = count($value) - 1; $i <= $max_index; ++$i) { + $i2 = $i << 1; + + $temp = $square_value[$i2] + $value[$i] * $value[$i]; + $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $square_value[$i2] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); + + // note how we start from $i+1 instead of 0 as we do in multiplication. + for ($j = $i + 1, $k = $i2 + 1; $j <= $max_index; ++$j, ++$k) { + $temp = $square_value[$k] + 2 * $value[$j] * $value[$i] + $carry; + $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $square_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); + } + + // the following line can yield values larger 2**15. at this point, PHP should switch + // over to floats. + $square_value[$i + $max_index + 1] = $carry; + } + + return $square_value; + } + + /** + * Performs Karatsuba "squaring" on two BigIntegers + * + * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=151 MPM 5.3.4}. + * + * @param Array $value + * @return Array + * @access private + */ + function _karatsubaSquare($value) + { + $m = count($value) >> 1; + + if ($m < MATH_BIGINTEGER_KARATSUBA_CUTOFF) { + return $this->_baseSquare($value); + } + + $x1 = array_slice($value, $m); + $x0 = array_slice($value, 0, $m); + + $z2 = $this->_karatsubaSquare($x1); + $z0 = $this->_karatsubaSquare($x0); + + $z1 = $this->_add($x1, false, $x0, false); + $z1 = $this->_karatsubaSquare($z1[MATH_BIGINTEGER_VALUE]); + $temp = $this->_add($z2, false, $z0, false); + $z1 = $this->_subtract($z1, false, $temp[MATH_BIGINTEGER_VALUE], false); + + $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2); + $z1[MATH_BIGINTEGER_VALUE] = array_merge(array_fill(0, $m, 0), $z1[MATH_BIGINTEGER_VALUE]); + + $xx = $this->_add($z2, false, $z1[MATH_BIGINTEGER_VALUE], $z1[MATH_BIGINTEGER_SIGN]); + $xx = $this->_add($xx[MATH_BIGINTEGER_VALUE], $xx[MATH_BIGINTEGER_SIGN], $z0, false); + + return $xx[MATH_BIGINTEGER_VALUE]; + } + + /** + * Divides two BigIntegers. + * + * Returns an array whose first element contains the quotient and whose second element contains the + * "common residue". If the remainder would be positive, the "common residue" and the remainder are the + * same. If the remainder would be negative, the "common residue" is equal to the sum of the remainder + * and the divisor (basically, the "common residue" is the first positive modulo). + * + * Here's an example: + * + * divide($b); + * + * echo $quotient->toString(); // outputs 0 + * echo "\r\n"; + * echo $remainder->toString(); // outputs 10 + * ?> + * + * + * @param Math_BigInteger $y + * @return Array + * @access public + * @internal This function is based off of {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=9 HAC 14.20}. + */ + function divide($y) + { + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + $quotient = new Math_BigInteger(); + $remainder = new Math_BigInteger(); + + list($quotient->value, $remainder->value) = gmp_div_qr($this->value, $y->value); + + if (gmp_sign($remainder->value) < 0) { + $remainder->value = gmp_add($remainder->value, gmp_abs($y->value)); + } + + return array($this->_normalize($quotient), $this->_normalize($remainder)); + case MATH_BIGINTEGER_MODE_BCMATH: + $quotient = new Math_BigInteger(); + $remainder = new Math_BigInteger(); + + $quotient->value = bcdiv($this->value, $y->value, 0); + $remainder->value = bcmod($this->value, $y->value); + + if ($remainder->value[0] == '-') { + $remainder->value = bcadd($remainder->value, $y->value[0] == '-' ? substr($y->value, 1) : $y->value, 0); + } + + return array($this->_normalize($quotient), $this->_normalize($remainder)); + } + + if (count($y->value) == 1) { + list($q, $r) = $this->_divide_digit($this->value, $y->value[0]); + $quotient = new Math_BigInteger(); + $remainder = new Math_BigInteger(); + $quotient->value = $q; + $remainder->value = array($r); + $quotient->is_negative = $this->is_negative != $y->is_negative; + return array($this->_normalize($quotient), $this->_normalize($remainder)); + } + + static $zero; + if ( !isset($zero) ) { + $zero = new Math_BigInteger(); + } + + $x = $this->copy(); + $y = $y->copy(); + + $x_sign = $x->is_negative; + $y_sign = $y->is_negative; + + $x->is_negative = $y->is_negative = false; + + $diff = $x->compare($y); + + if ( !$diff ) { + $temp = new Math_BigInteger(); + $temp->value = array(1); + $temp->is_negative = $x_sign != $y_sign; + return array($this->_normalize($temp), $this->_normalize(new Math_BigInteger())); + } + + if ( $diff < 0 ) { + // if $x is negative, "add" $y. + if ( $x_sign ) { + $x = $y->subtract($x); + } + return array($this->_normalize(new Math_BigInteger()), $this->_normalize($x)); + } + + // normalize $x and $y as described in HAC 14.23 / 14.24 + $msb = $y->value[count($y->value) - 1]; + for ($shift = 0; !($msb & MATH_BIGINTEGER_MSB); ++$shift) { + $msb <<= 1; + } + $x->_lshift($shift); + $y->_lshift($shift); + $y_value = &$y->value; + + $x_max = count($x->value) - 1; + $y_max = count($y->value) - 1; + + $quotient = new Math_BigInteger(); + $quotient_value = &$quotient->value; + $quotient_value = $this->_array_repeat(0, $x_max - $y_max + 1); + + static $temp, $lhs, $rhs; + if (!isset($temp)) { + $temp = new Math_BigInteger(); + $lhs = new Math_BigInteger(); + $rhs = new Math_BigInteger(); + } + $temp_value = &$temp->value; + $rhs_value = &$rhs->value; + + // $temp = $y << ($x_max - $y_max-1) in base 2**26 + $temp_value = array_merge($this->_array_repeat(0, $x_max - $y_max), $y_value); + + while ( $x->compare($temp) >= 0 ) { + // calculate the "common residue" + ++$quotient_value[$x_max - $y_max]; + $x = $x->subtract($temp); + $x_max = count($x->value) - 1; + } + + for ($i = $x_max; $i >= $y_max + 1; --$i) { + $x_value = &$x->value; + $x_window = array( + isset($x_value[$i]) ? $x_value[$i] : 0, + isset($x_value[$i - 1]) ? $x_value[$i - 1] : 0, + isset($x_value[$i - 2]) ? $x_value[$i - 2] : 0 + ); + $y_window = array( + $y_value[$y_max], + ( $y_max > 0 ) ? $y_value[$y_max - 1] : 0 + ); + + $q_index = $i - $y_max - 1; + if ($x_window[0] == $y_window[0]) { + $quotient_value[$q_index] = MATH_BIGINTEGER_MAX_DIGIT; + } else { + $quotient_value[$q_index] = $this->_safe_divide( + $x_window[0] * MATH_BIGINTEGER_BASE_FULL + $x_window[1], + $y_window[0] + ); + } + + $temp_value = array($y_window[1], $y_window[0]); + + $lhs->value = array($quotient_value[$q_index]); + $lhs = $lhs->multiply($temp); + + $rhs_value = array($x_window[2], $x_window[1], $x_window[0]); + + while ( $lhs->compare($rhs) > 0 ) { + --$quotient_value[$q_index]; + + $lhs->value = array($quotient_value[$q_index]); + $lhs = $lhs->multiply($temp); + } + + $adjust = $this->_array_repeat(0, $q_index); + $temp_value = array($quotient_value[$q_index]); + $temp = $temp->multiply($y); + $temp_value = &$temp->value; + $temp_value = array_merge($adjust, $temp_value); + + $x = $x->subtract($temp); + + if ($x->compare($zero) < 0) { + $temp_value = array_merge($adjust, $y_value); + $x = $x->add($temp); + + --$quotient_value[$q_index]; + } + + $x_max = count($x_value) - 1; + } + + // unnormalize the remainder + $x->_rshift($shift); + + $quotient->is_negative = $x_sign != $y_sign; + + // calculate the "common residue", if appropriate + if ( $x_sign ) { + $y->_rshift($shift); + $x = $y->subtract($x); + } + + return array($this->_normalize($quotient), $this->_normalize($x)); + } + + /** + * Divides a BigInteger by a regular integer + * + * abc / x = a00 / x + b0 / x + c / x + * + * @param Array $dividend + * @param Array $divisor + * @return Array + * @access private + */ + function _divide_digit($dividend, $divisor) + { + $carry = 0; + $result = array(); + + for ($i = count($dividend) - 1; $i >= 0; --$i) { + $temp = MATH_BIGINTEGER_BASE_FULL * $carry + $dividend[$i]; + $result[$i] = $this->_safe_divide($temp, $divisor); + $carry = (int) ($temp - $divisor * $result[$i]); + } + + return array($result, $carry); + } + + /** + * Performs modular exponentiation. + * + * Here's an example: + * + * modPow($b, $c); + * + * echo $c->toString(); // outputs 10 + * ?> + * + * + * @param Math_BigInteger $e + * @param Math_BigInteger $n + * @return Math_BigInteger + * @access public + * @internal The most naive approach to modular exponentiation has very unreasonable requirements, and + * and although the approach involving repeated squaring does vastly better, it, too, is impractical + * for our purposes. The reason being that division - by far the most complicated and time-consuming + * of the basic operations (eg. +,-,*,/) - occurs multiple times within it. + * + * Modular reductions resolve this issue. Although an individual modular reduction takes more time + * then an individual division, when performed in succession (with the same modulo), they're a lot faster. + * + * The two most commonly used modular reductions are Barrett and Montgomery reduction. Montgomery reduction, + * although faster, only works when the gcd of the modulo and of the base being used is 1. In RSA, when the + * base is a power of two, the modulo - a product of two primes - is always going to have a gcd of 1 (because + * the product of two odd numbers is odd), but what about when RSA isn't used? + * + * In contrast, Barrett reduction has no such constraint. As such, some bigint implementations perform a + * Barrett reduction after every operation in the modpow function. Others perform Barrett reductions when the + * modulo is even and Montgomery reductions when the modulo is odd. BigInteger.java's modPow method, however, + * uses a trick involving the Chinese Remainder Theorem to factor the even modulo into two numbers - one odd and + * the other, a power of two - and recombine them, later. This is the method that this modPow function uses. + * {@link http://islab.oregonstate.edu/papers/j34monex.pdf Montgomery Reduction with Even Modulus} elaborates. + */ + function modPow($e, $n) + { + $n = $this->bitmask !== false && $this->bitmask->compare($n) < 0 ? $this->bitmask : $n->abs(); + + if ($e->compare(new Math_BigInteger()) < 0) { + $e = $e->abs(); + + $temp = $this->modInverse($n); + if ($temp === false) { + return false; + } + + return $this->_normalize($temp->modPow($e, $n)); + } + + if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_GMP ) { + $temp = new Math_BigInteger(); + $temp->value = gmp_powm($this->value, $e->value, $n->value); + + return $this->_normalize($temp); + } + + if ($this->compare(new Math_BigInteger()) < 0 || $this->compare($n) > 0) { + list(, $temp) = $this->divide($n); + return $temp->modPow($e, $n); + } + + if (defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) { + $components = array( + 'modulus' => $n->toBytes(true), + 'publicExponent' => $e->toBytes(true) + ); + + $components = array( + 'modulus' => pack('Ca*a*', 2, $this->_encodeASN1Length(strlen($components['modulus'])), $components['modulus']), + 'publicExponent' => pack('Ca*a*', 2, $this->_encodeASN1Length(strlen($components['publicExponent'])), $components['publicExponent']) + ); + + $RSAPublicKey = pack('Ca*a*a*', + 48, $this->_encodeASN1Length(strlen($components['modulus']) + strlen($components['publicExponent'])), + $components['modulus'], $components['publicExponent'] + ); + + $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA + $RSAPublicKey = chr(0) . $RSAPublicKey; + $RSAPublicKey = chr(3) . $this->_encodeASN1Length(strlen($RSAPublicKey)) . $RSAPublicKey; + + $encapsulated = pack('Ca*a*', + 48, $this->_encodeASN1Length(strlen($rsaOID . $RSAPublicKey)), $rsaOID . $RSAPublicKey + ); + + $RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" . + chunk_split(base64_encode($encapsulated)) . + '-----END PUBLIC KEY-----'; + + $plaintext = str_pad($this->toBytes(), strlen($n->toBytes(true)) - 1, "\0", STR_PAD_LEFT); + + if (openssl_public_encrypt($plaintext, $result, $RSAPublicKey, OPENSSL_NO_PADDING)) { + return new Math_BigInteger($result, 256); + } + } + + if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH ) { + $temp = new Math_BigInteger(); + $temp->value = bcpowmod($this->value, $e->value, $n->value, 0); + + return $this->_normalize($temp); + } + + if ( empty($e->value) ) { + $temp = new Math_BigInteger(); + $temp->value = array(1); + return $this->_normalize($temp); + } + + if ( $e->value == array(1) ) { + list(, $temp) = $this->divide($n); + return $this->_normalize($temp); + } + + if ( $e->value == array(2) ) { + $temp = new Math_BigInteger(); + $temp->value = $this->_square($this->value); + list(, $temp) = $temp->divide($n); + return $this->_normalize($temp); + } + + return $this->_normalize($this->_slidingWindow($e, $n, MATH_BIGINTEGER_BARRETT)); + + // the following code, although not callable, can be run independently of the above code + // although the above code performed better in my benchmarks the following could might + // perform better under different circumstances. in lieu of deleting it it's just been + // made uncallable + + // is the modulo odd? + if ( $n->value[0] & 1 ) { + return $this->_normalize($this->_slidingWindow($e, $n, MATH_BIGINTEGER_MONTGOMERY)); + } + // if it's not, it's even + + // find the lowest set bit (eg. the max pow of 2 that divides $n) + for ($i = 0; $i < count($n->value); ++$i) { + if ( $n->value[$i] ) { + $temp = decbin($n->value[$i]); + $j = strlen($temp) - strrpos($temp, '1') - 1; + $j+= 26 * $i; + break; + } + } + // at this point, 2^$j * $n/(2^$j) == $n + + $mod1 = $n->copy(); + $mod1->_rshift($j); + $mod2 = new Math_BigInteger(); + $mod2->value = array(1); + $mod2->_lshift($j); + + $part1 = ( $mod1->value != array(1) ) ? $this->_slidingWindow($e, $mod1, MATH_BIGINTEGER_MONTGOMERY) : new Math_BigInteger(); + $part2 = $this->_slidingWindow($e, $mod2, MATH_BIGINTEGER_POWEROF2); + + $y1 = $mod2->modInverse($mod1); + $y2 = $mod1->modInverse($mod2); + + $result = $part1->multiply($mod2); + $result = $result->multiply($y1); + + $temp = $part2->multiply($mod1); + $temp = $temp->multiply($y2); + + $result = $result->add($temp); + list(, $result) = $result->divide($n); + + return $this->_normalize($result); + } + + /** + * Performs modular exponentiation. + * + * Alias for Math_BigInteger::modPow() + * + * @param Math_BigInteger $e + * @param Math_BigInteger $n + * @return Math_BigInteger + * @access public + */ + function powMod($e, $n) + { + return $this->modPow($e, $n); + } + + /** + * Sliding Window k-ary Modular Exponentiation + * + * Based on {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=27 HAC 14.85} / + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=210 MPM 7.7}. In a departure from those algorithims, + * however, this function performs a modular reduction after every multiplication and squaring operation. + * As such, this function has the same preconditions that the reductions being used do. + * + * @param Math_BigInteger $e + * @param Math_BigInteger $n + * @param Integer $mode + * @return Math_BigInteger + * @access private + */ + function _slidingWindow($e, $n, $mode) + { + static $window_ranges = array(7, 25, 81, 241, 673, 1793); // from BigInteger.java's oddModPow function + //static $window_ranges = array(0, 7, 36, 140, 450, 1303, 3529); // from MPM 7.3.1 + + $e_value = $e->value; + $e_length = count($e_value) - 1; + $e_bits = decbin($e_value[$e_length]); + for ($i = $e_length - 1; $i >= 0; --$i) { + $e_bits.= str_pad(decbin($e_value[$i]), MATH_BIGINTEGER_BASE, '0', STR_PAD_LEFT); + } + + $e_length = strlen($e_bits); + + // calculate the appropriate window size. + // $window_size == 3 if $window_ranges is between 25 and 81, for example. + for ($i = 0, $window_size = 1; $e_length > $window_ranges[$i] && $i < count($window_ranges); ++$window_size, ++$i); + + $n_value = $n->value; + + // precompute $this^0 through $this^$window_size + $powers = array(); + $powers[1] = $this->_prepareReduce($this->value, $n_value, $mode); + $powers[2] = $this->_squareReduce($powers[1], $n_value, $mode); + + // we do every other number since substr($e_bits, $i, $j+1) (see below) is supposed to end + // in a 1. ie. it's supposed to be odd. + $temp = 1 << ($window_size - 1); + for ($i = 1; $i < $temp; ++$i) { + $i2 = $i << 1; + $powers[$i2 + 1] = $this->_multiplyReduce($powers[$i2 - 1], $powers[2], $n_value, $mode); + } + + $result = array(1); + $result = $this->_prepareReduce($result, $n_value, $mode); + + for ($i = 0; $i < $e_length; ) { + if ( !$e_bits[$i] ) { + $result = $this->_squareReduce($result, $n_value, $mode); + ++$i; + } else { + for ($j = $window_size - 1; $j > 0; --$j) { + if ( !empty($e_bits[$i + $j]) ) { + break; + } + } + + for ($k = 0; $k <= $j; ++$k) {// eg. the length of substr($e_bits, $i, $j+1) + $result = $this->_squareReduce($result, $n_value, $mode); + } + + $result = $this->_multiplyReduce($result, $powers[bindec(substr($e_bits, $i, $j + 1))], $n_value, $mode); + + $i+=$j + 1; + } + } + + $temp = new Math_BigInteger(); + $temp->value = $this->_reduce($result, $n_value, $mode); + + return $temp; + } + + /** + * Modular reduction + * + * For most $modes this will return the remainder. + * + * @see _slidingWindow() + * @access private + * @param Array $x + * @param Array $n + * @param Integer $mode + * @return Array + */ + function _reduce($x, $n, $mode) + { + switch ($mode) { + case MATH_BIGINTEGER_MONTGOMERY: + return $this->_montgomery($x, $n); + case MATH_BIGINTEGER_BARRETT: + return $this->_barrett($x, $n); + case MATH_BIGINTEGER_POWEROF2: + $lhs = new Math_BigInteger(); + $lhs->value = $x; + $rhs = new Math_BigInteger(); + $rhs->value = $n; + return $x->_mod2($n); + case MATH_BIGINTEGER_CLASSIC: + $lhs = new Math_BigInteger(); + $lhs->value = $x; + $rhs = new Math_BigInteger(); + $rhs->value = $n; + list(, $temp) = $lhs->divide($rhs); + return $temp->value; + case MATH_BIGINTEGER_NONE: + return $x; + default: + // an invalid $mode was provided + } + } + + /** + * Modular reduction preperation + * + * @see _slidingWindow() + * @access private + * @param Array $x + * @param Array $n + * @param Integer $mode + * @return Array + */ + function _prepareReduce($x, $n, $mode) + { + if ($mode == MATH_BIGINTEGER_MONTGOMERY) { + return $this->_prepMontgomery($x, $n); + } + return $this->_reduce($x, $n, $mode); + } + + /** + * Modular multiply + * + * @see _slidingWindow() + * @access private + * @param Array $x + * @param Array $y + * @param Array $n + * @param Integer $mode + * @return Array + */ + function _multiplyReduce($x, $y, $n, $mode) + { + if ($mode == MATH_BIGINTEGER_MONTGOMERY) { + return $this->_montgomeryMultiply($x, $y, $n); + } + $temp = $this->_multiply($x, false, $y, false); + return $this->_reduce($temp[MATH_BIGINTEGER_VALUE], $n, $mode); + } + + /** + * Modular square + * + * @see _slidingWindow() + * @access private + * @param Array $x + * @param Array $n + * @param Integer $mode + * @return Array + */ + function _squareReduce($x, $n, $mode) + { + if ($mode == MATH_BIGINTEGER_MONTGOMERY) { + return $this->_montgomeryMultiply($x, $x, $n); + } + return $this->_reduce($this->_square($x), $n, $mode); + } + + /** + * Modulos for Powers of Two + * + * Calculates $x%$n, where $n = 2**$e, for some $e. Since this is basically the same as doing $x & ($n-1), + * we'll just use this function as a wrapper for doing that. + * + * @see _slidingWindow() + * @access private + * @param Math_BigInteger + * @return Math_BigInteger + */ + function _mod2($n) + { + $temp = new Math_BigInteger(); + $temp->value = array(1); + return $this->bitwise_and($n->subtract($temp)); + } + + /** + * Barrett Modular Reduction + * + * See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=14 HAC 14.3.3} / + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=165 MPM 6.2.5} for more information. Modified slightly, + * so as not to require negative numbers (initially, this script didn't support negative numbers). + * + * Employs "folding", as described at + * {@link http://www.cosic.esat.kuleuven.be/publications/thesis-149.pdf#page=66 thesis-149.pdf#page=66}. To quote from + * it, "the idea [behind folding] is to find a value x' such that x (mod m) = x' (mod m), with x' being smaller than x." + * + * Unfortunately, the "Barrett Reduction with Folding" algorithm described in thesis-149.pdf is not, as written, all that + * usable on account of (1) its not using reasonable radix points as discussed in + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=162 MPM 6.2.2} and (2) the fact that, even with reasonable + * radix points, it only works when there are an even number of digits in the denominator. The reason for (2) is that + * (x >> 1) + (x >> 1) != x / 2 + x / 2. If x is even, they're the same, but if x is odd, they're not. See the in-line + * comments for details. + * + * @see _slidingWindow() + * @access private + * @param Array $n + * @param Array $m + * @return Array + */ + function _barrett($n, $m) + { + static $cache = array( + MATH_BIGINTEGER_VARIABLE => array(), + MATH_BIGINTEGER_DATA => array() + ); + + $m_length = count($m); + + // if ($this->_compare($n, $this->_square($m)) >= 0) { + if (count($n) > 2 * $m_length) { + $lhs = new Math_BigInteger(); + $rhs = new Math_BigInteger(); + $lhs->value = $n; + $rhs->value = $m; + list(, $temp) = $lhs->divide($rhs); + return $temp->value; + } + + // if (m.length >> 1) + 2 <= m.length then m is too small and n can't be reduced + if ($m_length < 5) { + return $this->_regularBarrett($n, $m); + } + + // n = 2 * m.length + + if ( ($key = array_search($m, $cache[MATH_BIGINTEGER_VARIABLE])) === false ) { + $key = count($cache[MATH_BIGINTEGER_VARIABLE]); + $cache[MATH_BIGINTEGER_VARIABLE][] = $m; + + $lhs = new Math_BigInteger(); + $lhs_value = &$lhs->value; + $lhs_value = $this->_array_repeat(0, $m_length + ($m_length >> 1)); + $lhs_value[] = 1; + $rhs = new Math_BigInteger(); + $rhs->value = $m; + + list($u, $m1) = $lhs->divide($rhs); + $u = $u->value; + $m1 = $m1->value; + + $cache[MATH_BIGINTEGER_DATA][] = array( + 'u' => $u, // m.length >> 1 (technically (m.length >> 1) + 1) + 'm1'=> $m1 // m.length + ); + } else { + extract($cache[MATH_BIGINTEGER_DATA][$key]); + } + + $cutoff = $m_length + ($m_length >> 1); + $lsd = array_slice($n, 0, $cutoff); // m.length + (m.length >> 1) + $msd = array_slice($n, $cutoff); // m.length >> 1 + $lsd = $this->_trim($lsd); + $temp = $this->_multiply($msd, false, $m1, false); + $n = $this->_add($lsd, false, $temp[MATH_BIGINTEGER_VALUE], false); // m.length + (m.length >> 1) + 1 + + if ($m_length & 1) { + return $this->_regularBarrett($n[MATH_BIGINTEGER_VALUE], $m); + } + + // (m.length + (m.length >> 1) + 1) - (m.length - 1) == (m.length >> 1) + 2 + $temp = array_slice($n[MATH_BIGINTEGER_VALUE], $m_length - 1); + // if even: ((m.length >> 1) + 2) + (m.length >> 1) == m.length + 2 + // if odd: ((m.length >> 1) + 2) + (m.length >> 1) == (m.length - 1) + 2 == m.length + 1 + $temp = $this->_multiply($temp, false, $u, false); + // if even: (m.length + 2) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) + 1 + // if odd: (m.length + 1) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) + $temp = array_slice($temp[MATH_BIGINTEGER_VALUE], ($m_length >> 1) + 1); + // if even: (m.length - (m.length >> 1) + 1) + m.length = 2 * m.length - (m.length >> 1) + 1 + // if odd: (m.length - (m.length >> 1)) + m.length = 2 * m.length - (m.length >> 1) + $temp = $this->_multiply($temp, false, $m, false); + + // at this point, if m had an odd number of digits, we'd be subtracting a 2 * m.length - (m.length >> 1) digit + // number from a m.length + (m.length >> 1) + 1 digit number. ie. there'd be an extra digit and the while loop + // following this comment would loop a lot (hence our calling _regularBarrett() in that situation). + + $result = $this->_subtract($n[MATH_BIGINTEGER_VALUE], false, $temp[MATH_BIGINTEGER_VALUE], false); + + while ($this->_compare($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $m, false) >= 0) { + $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $m, false); + } + + return $result[MATH_BIGINTEGER_VALUE]; + } + + /** + * (Regular) Barrett Modular Reduction + * + * For numbers with more than four digits Math_BigInteger::_barrett() is faster. The difference between that and this + * is that this function does not fold the denominator into a smaller form. + * + * @see _slidingWindow() + * @access private + * @param Array $x + * @param Array $n + * @return Array + */ + function _regularBarrett($x, $n) + { + static $cache = array( + MATH_BIGINTEGER_VARIABLE => array(), + MATH_BIGINTEGER_DATA => array() + ); + + $n_length = count($n); + + if (count($x) > 2 * $n_length) { + $lhs = new Math_BigInteger(); + $rhs = new Math_BigInteger(); + $lhs->value = $x; + $rhs->value = $n; + list(, $temp) = $lhs->divide($rhs); + return $temp->value; + } + + if ( ($key = array_search($n, $cache[MATH_BIGINTEGER_VARIABLE])) === false ) { + $key = count($cache[MATH_BIGINTEGER_VARIABLE]); + $cache[MATH_BIGINTEGER_VARIABLE][] = $n; + $lhs = new Math_BigInteger(); + $lhs_value = &$lhs->value; + $lhs_value = $this->_array_repeat(0, 2 * $n_length); + $lhs_value[] = 1; + $rhs = new Math_BigInteger(); + $rhs->value = $n; + list($temp, ) = $lhs->divide($rhs); // m.length + $cache[MATH_BIGINTEGER_DATA][] = $temp->value; + } + + // 2 * m.length - (m.length - 1) = m.length + 1 + $temp = array_slice($x, $n_length - 1); + // (m.length + 1) + m.length = 2 * m.length + 1 + $temp = $this->_multiply($temp, false, $cache[MATH_BIGINTEGER_DATA][$key], false); + // (2 * m.length + 1) - (m.length - 1) = m.length + 2 + $temp = array_slice($temp[MATH_BIGINTEGER_VALUE], $n_length + 1); + + // m.length + 1 + $result = array_slice($x, 0, $n_length + 1); + // m.length + 1 + $temp = $this->_multiplyLower($temp, false, $n, false, $n_length + 1); + // $temp == array_slice($temp->_multiply($temp, false, $n, false)->value, 0, $n_length + 1) + + if ($this->_compare($result, false, $temp[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_SIGN]) < 0) { + $corrector_value = $this->_array_repeat(0, $n_length + 1); + $corrector_value[count($corrector_value)] = 1; + $result = $this->_add($result, false, $corrector_value, false); + $result = $result[MATH_BIGINTEGER_VALUE]; + } + + // at this point, we're subtracting a number with m.length + 1 digits from another number with m.length + 1 digits + $result = $this->_subtract($result, false, $temp[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_SIGN]); + while ($this->_compare($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $n, false) > 0) { + $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $n, false); + } + + return $result[MATH_BIGINTEGER_VALUE]; + } + + /** + * Performs long multiplication up to $stop digits + * + * If you're going to be doing array_slice($product->value, 0, $stop), some cycles can be saved. + * + * @see _regularBarrett() + * @param Array $x_value + * @param Boolean $x_negative + * @param Array $y_value + * @param Boolean $y_negative + * @param Integer $stop + * @return Array + * @access private + */ + function _multiplyLower($x_value, $x_negative, $y_value, $y_negative, $stop) + { + $x_length = count($x_value); + $y_length = count($y_value); + + if ( !$x_length || !$y_length ) { // a 0 is being multiplied + return array( + MATH_BIGINTEGER_VALUE => array(), + MATH_BIGINTEGER_SIGN => false + ); + } + + if ( $x_length < $y_length ) { + $temp = $x_value; + $x_value = $y_value; + $y_value = $temp; + + $x_length = count($x_value); + $y_length = count($y_value); + } + + $product_value = $this->_array_repeat(0, $x_length + $y_length); + + // the following for loop could be removed if the for loop following it + // (the one with nested for loops) initially set $i to 0, but + // doing so would also make the result in one set of unnecessary adds, + // since on the outermost loops first pass, $product->value[$k] is going + // to always be 0 + + $carry = 0; + + for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0, $k = $i + $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0 + $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $product_value[$j] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); + } + + if ($j < $stop) { + $product_value[$j] = $carry; + } + + // the above for loop is what the previous comment was talking about. the + // following for loop is the "one with nested for loops" + + for ($i = 1; $i < $y_length; ++$i) { + $carry = 0; + + for ($j = 0, $k = $i; $j < $x_length && $k < $stop; ++$j, ++$k) { + $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry; + $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $product_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); + } + + if ($k < $stop) { + $product_value[$k] = $carry; + } + } + + return array( + MATH_BIGINTEGER_VALUE => $this->_trim($product_value), + MATH_BIGINTEGER_SIGN => $x_negative != $y_negative + ); + } + + /** + * Montgomery Modular Reduction + * + * ($x->_prepMontgomery($n))->_montgomery($n) yields $x % $n. + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=170 MPM 6.3} provides insights on how this can be + * improved upon (basically, by using the comba method). gcd($n, 2) must be equal to one for this function + * to work correctly. + * + * @see _prepMontgomery() + * @see _slidingWindow() + * @access private + * @param Array $x + * @param Array $n + * @return Array + */ + function _montgomery($x, $n) + { + static $cache = array( + MATH_BIGINTEGER_VARIABLE => array(), + MATH_BIGINTEGER_DATA => array() + ); + + if ( ($key = array_search($n, $cache[MATH_BIGINTEGER_VARIABLE])) === false ) { + $key = count($cache[MATH_BIGINTEGER_VARIABLE]); + $cache[MATH_BIGINTEGER_VARIABLE][] = $x; + $cache[MATH_BIGINTEGER_DATA][] = $this->_modInverse67108864($n); + } + + $k = count($n); + + $result = array(MATH_BIGINTEGER_VALUE => $x); + + for ($i = 0; $i < $k; ++$i) { + $temp = $result[MATH_BIGINTEGER_VALUE][$i] * $cache[MATH_BIGINTEGER_DATA][$key]; + $temp = $temp - MATH_BIGINTEGER_BASE_FULL * (MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); + $temp = $this->_regularMultiply(array($temp), $n); + $temp = array_merge($this->_array_repeat(0, $i), $temp); + $result = $this->_add($result[MATH_BIGINTEGER_VALUE], false, $temp, false); + } + + $result[MATH_BIGINTEGER_VALUE] = array_slice($result[MATH_BIGINTEGER_VALUE], $k); + + if ($this->_compare($result, false, $n, false) >= 0) { + $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], false, $n, false); + } + + return $result[MATH_BIGINTEGER_VALUE]; + } + + /** + * Montgomery Multiply + * + * Interleaves the montgomery reduction and long multiplication algorithms together as described in + * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=13 HAC 14.36} + * + * @see _prepMontgomery() + * @see _montgomery() + * @access private + * @param Array $x + * @param Array $y + * @param Array $m + * @return Array + */ + function _montgomeryMultiply($x, $y, $m) + { + $temp = $this->_multiply($x, false, $y, false); + return $this->_montgomery($temp[MATH_BIGINTEGER_VALUE], $m); + + // the following code, although not callable, can be run independently of the above code + // although the above code performed better in my benchmarks the following could might + // perform better under different circumstances. in lieu of deleting it it's just been + // made uncallable + + static $cache = array( + MATH_BIGINTEGER_VARIABLE => array(), + MATH_BIGINTEGER_DATA => array() + ); + + if ( ($key = array_search($m, $cache[MATH_BIGINTEGER_VARIABLE])) === false ) { + $key = count($cache[MATH_BIGINTEGER_VARIABLE]); + $cache[MATH_BIGINTEGER_VARIABLE][] = $m; + $cache[MATH_BIGINTEGER_DATA][] = $this->_modInverse67108864($m); + } + + $n = max(count($x), count($y), count($m)); + $x = array_pad($x, $n, 0); + $y = array_pad($y, $n, 0); + $m = array_pad($m, $n, 0); + $a = array(MATH_BIGINTEGER_VALUE => $this->_array_repeat(0, $n + 1)); + for ($i = 0; $i < $n; ++$i) { + $temp = $a[MATH_BIGINTEGER_VALUE][0] + $x[$i] * $y[0]; + $temp = $temp - MATH_BIGINTEGER_BASE_FULL * (MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); + $temp = $temp * $cache[MATH_BIGINTEGER_DATA][$key]; + $temp = $temp - MATH_BIGINTEGER_BASE_FULL * (MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); + $temp = $this->_add($this->_regularMultiply(array($x[$i]), $y), false, $this->_regularMultiply(array($temp), $m), false); + $a = $this->_add($a[MATH_BIGINTEGER_VALUE], false, $temp[MATH_BIGINTEGER_VALUE], false); + $a[MATH_BIGINTEGER_VALUE] = array_slice($a[MATH_BIGINTEGER_VALUE], 1); + } + if ($this->_compare($a[MATH_BIGINTEGER_VALUE], false, $m, false) >= 0) { + $a = $this->_subtract($a[MATH_BIGINTEGER_VALUE], false, $m, false); + } + return $a[MATH_BIGINTEGER_VALUE]; + } + + /** + * Prepare a number for use in Montgomery Modular Reductions + * + * @see _montgomery() + * @see _slidingWindow() + * @access private + * @param Array $x + * @param Array $n + * @return Array + */ + function _prepMontgomery($x, $n) + { + $lhs = new Math_BigInteger(); + $lhs->value = array_merge($this->_array_repeat(0, count($n)), $x); + $rhs = new Math_BigInteger(); + $rhs->value = $n; + + list(, $temp) = $lhs->divide($rhs); + return $temp->value; + } + + /** + * Modular Inverse of a number mod 2**26 (eg. 67108864) + * + * Based off of the bnpInvDigit function implemented and justified in the following URL: + * + * {@link http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js} + * + * The following URL provides more info: + * + * {@link http://groups.google.com/group/sci.crypt/msg/7a137205c1be7d85} + * + * As for why we do all the bitmasking... strange things can happen when converting from floats to ints. For + * instance, on some computers, var_dump((int) -4294967297) yields int(-1) and on others, it yields + * int(-2147483648). To avoid problems stemming from this, we use bitmasks to guarantee that ints aren't + * auto-converted to floats. The outermost bitmask is present because without it, there's no guarantee that + * the "residue" returned would be the so-called "common residue". We use fmod, in the last step, because the + * maximum possible $x is 26 bits and the maximum $result is 16 bits. Thus, we have to be able to handle up to + * 40 bits, which only 64-bit floating points will support. + * + * Thanks to Pedro Gimeno Fortea for input! + * + * @see _montgomery() + * @access private + * @param Array $x + * @return Integer + */ + function _modInverse67108864($x) // 2**26 == 67,108,864 + { + $x = -$x[0]; + $result = $x & 0x3; // x**-1 mod 2**2 + $result = ($result * (2 - $x * $result)) & 0xF; // x**-1 mod 2**4 + $result = ($result * (2 - ($x & 0xFF) * $result)) & 0xFF; // x**-1 mod 2**8 + $result = ($result * ((2 - ($x & 0xFFFF) * $result) & 0xFFFF)) & 0xFFFF; // x**-1 mod 2**16 + $result = fmod($result * (2 - fmod($x * $result, MATH_BIGINTEGER_BASE_FULL)), MATH_BIGINTEGER_BASE_FULL); // x**-1 mod 2**26 + return $result & MATH_BIGINTEGER_MAX_DIGIT; + } + + /** + * Calculates modular inverses. + * + * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. + * + * Here's an example: + * + * modInverse($b); + * echo $c->toString(); // outputs 4 + * + * echo "\r\n"; + * + * $d = $a->multiply($c); + * list(, $d) = $d->divide($b); + * echo $d; // outputs 1 (as per the definition of modular inverse) + * ?> + * + * + * @param Math_BigInteger $n + * @return mixed false, if no modular inverse exists, Math_BigInteger, otherwise. + * @access public + * @internal See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=21 HAC 14.64} for more information. + */ + function modInverse($n) + { + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = new Math_BigInteger(); + $temp->value = gmp_invert($this->value, $n->value); + + return ( $temp->value === false ) ? false : $this->_normalize($temp); + } + + static $zero, $one; + if (!isset($zero)) { + $zero = new Math_BigInteger(); + $one = new Math_BigInteger(1); + } + + // $x mod -$n == $x mod $n. + $n = $n->abs(); + + if ($this->compare($zero) < 0) { + $temp = $this->abs(); + $temp = $temp->modInverse($n); + return $this->_normalize($n->subtract($temp)); + } + + extract($this->extendedGCD($n)); + + if (!$gcd->equals($one)) { + return false; + } + + $x = $x->compare($zero) < 0 ? $x->add($n) : $x; + + return $this->compare($zero) < 0 ? $this->_normalize($n->subtract($x)) : $this->_normalize($x); + } + + /** + * Calculates the greatest common divisor and Bezout's identity. + * + * Say you have 693 and 609. The GCD is 21. Bezout's identity states that there exist integers x and y such that + * 693*x + 609*y == 21. In point of fact, there are actually an infinite number of x and y combinations and which + * combination is returned is dependant upon which mode is in use. See + * {@link http://en.wikipedia.org/wiki/B%C3%A9zout%27s_identity Bezout's identity - Wikipedia} for more information. + * + * Here's an example: + * + * extendedGCD($b)); + * + * echo $gcd->toString() . "\r\n"; // outputs 21 + * echo $a->toString() * $x->toString() + $b->toString() * $y->toString(); // outputs 21 + * ?> + * + * + * @param Math_BigInteger $n + * @return Math_BigInteger + * @access public + * @internal Calculates the GCD using the binary xGCD algorithim described in + * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=19 HAC 14.61}. As the text above 14.61 notes, + * the more traditional algorithim requires "relatively costly multiple-precision divisions". + */ + function extendedGCD($n) + { + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + extract(gmp_gcdext($this->value, $n->value)); + + return array( + 'gcd' => $this->_normalize(new Math_BigInteger($g)), + 'x' => $this->_normalize(new Math_BigInteger($s)), + 'y' => $this->_normalize(new Math_BigInteger($t)) + ); + case MATH_BIGINTEGER_MODE_BCMATH: + // it might be faster to use the binary xGCD algorithim here, as well, but (1) that algorithim works + // best when the base is a power of 2 and (2) i don't think it'd make much difference, anyway. as is, + // the basic extended euclidean algorithim is what we're using. + + $u = $this->value; + $v = $n->value; + + $a = '1'; + $b = '0'; + $c = '0'; + $d = '1'; + + while (bccomp($v, '0', 0) != 0) { + $q = bcdiv($u, $v, 0); + + $temp = $u; + $u = $v; + $v = bcsub($temp, bcmul($v, $q, 0), 0); + + $temp = $a; + $a = $c; + $c = bcsub($temp, bcmul($a, $q, 0), 0); + + $temp = $b; + $b = $d; + $d = bcsub($temp, bcmul($b, $q, 0), 0); + } + + return array( + 'gcd' => $this->_normalize(new Math_BigInteger($u)), + 'x' => $this->_normalize(new Math_BigInteger($a)), + 'y' => $this->_normalize(new Math_BigInteger($b)) + ); + } + + $y = $n->copy(); + $x = $this->copy(); + $g = new Math_BigInteger(); + $g->value = array(1); + + while ( !(($x->value[0] & 1)|| ($y->value[0] & 1)) ) { + $x->_rshift(1); + $y->_rshift(1); + $g->_lshift(1); + } + + $u = $x->copy(); + $v = $y->copy(); + + $a = new Math_BigInteger(); + $b = new Math_BigInteger(); + $c = new Math_BigInteger(); + $d = new Math_BigInteger(); + + $a->value = $d->value = $g->value = array(1); + $b->value = $c->value = array(); + + while ( !empty($u->value) ) { + while ( !($u->value[0] & 1) ) { + $u->_rshift(1); + if ( (!empty($a->value) && ($a->value[0] & 1)) || (!empty($b->value) && ($b->value[0] & 1)) ) { + $a = $a->add($y); + $b = $b->subtract($x); + } + $a->_rshift(1); + $b->_rshift(1); + } + + while ( !($v->value[0] & 1) ) { + $v->_rshift(1); + if ( (!empty($d->value) && ($d->value[0] & 1)) || (!empty($c->value) && ($c->value[0] & 1)) ) { + $c = $c->add($y); + $d = $d->subtract($x); + } + $c->_rshift(1); + $d->_rshift(1); + } + + if ($u->compare($v) >= 0) { + $u = $u->subtract($v); + $a = $a->subtract($c); + $b = $b->subtract($d); + } else { + $v = $v->subtract($u); + $c = $c->subtract($a); + $d = $d->subtract($b); + } + } + + return array( + 'gcd' => $this->_normalize($g->multiply($v)), + 'x' => $this->_normalize($c), + 'y' => $this->_normalize($d) + ); + } + + /** + * Calculates the greatest common divisor + * + * Say you have 693 and 609. The GCD is 21. + * + * Here's an example: + * + * extendedGCD($b); + * + * echo $gcd->toString() . "\r\n"; // outputs 21 + * ?> + * + * + * @param Math_BigInteger $n + * @return Math_BigInteger + * @access public + */ + function gcd($n) + { + extract($this->extendedGCD($n)); + return $gcd; + } + + /** + * Absolute value. + * + * @return Math_BigInteger + * @access public + */ + function abs() + { + $temp = new Math_BigInteger(); + + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + $temp->value = gmp_abs($this->value); + break; + case MATH_BIGINTEGER_MODE_BCMATH: + $temp->value = (bccomp($this->value, '0', 0) < 0) ? substr($this->value, 1) : $this->value; + break; + default: + $temp->value = $this->value; + } + + return $temp; + } + + /** + * Compares two numbers. + * + * Although one might think !$x->compare($y) means $x != $y, it, in fact, means the opposite. The reason for this is + * demonstrated thusly: + * + * $x > $y: $x->compare($y) > 0 + * $x < $y: $x->compare($y) < 0 + * $x == $y: $x->compare($y) == 0 + * + * Note how the same comparison operator is used. If you want to test for equality, use $x->equals($y). + * + * @param Math_BigInteger $y + * @return Integer < 0 if $this is less than $y; > 0 if $this is greater than $y, and 0 if they are equal. + * @access public + * @see equals() + * @internal Could return $this->subtract($x), but that's not as fast as what we do do. + */ + function compare($y) + { + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + return gmp_cmp($this->value, $y->value); + case MATH_BIGINTEGER_MODE_BCMATH: + return bccomp($this->value, $y->value, 0); + } + + return $this->_compare($this->value, $this->is_negative, $y->value, $y->is_negative); + } + + /** + * Compares two numbers. + * + * @param Array $x_value + * @param Boolean $x_negative + * @param Array $y_value + * @param Boolean $y_negative + * @return Integer + * @see compare() + * @access private + */ + function _compare($x_value, $x_negative, $y_value, $y_negative) + { + if ( $x_negative != $y_negative ) { + return ( !$x_negative && $y_negative ) ? 1 : -1; + } + + $result = $x_negative ? -1 : 1; + + if ( count($x_value) != count($y_value) ) { + return ( count($x_value) > count($y_value) ) ? $result : -$result; + } + $size = max(count($x_value), count($y_value)); + + $x_value = array_pad($x_value, $size, 0); + $y_value = array_pad($y_value, $size, 0); + + for ($i = count($x_value) - 1; $i >= 0; --$i) { + if ($x_value[$i] != $y_value[$i]) { + return ( $x_value[$i] > $y_value[$i] ) ? $result : -$result; + } + } + + return 0; + } + + /** + * Tests the equality of two numbers. + * + * If you need to see if one number is greater than or less than another number, use Math_BigInteger::compare() + * + * @param Math_BigInteger $x + * @return Boolean + * @access public + * @see compare() + */ + function equals($x) + { + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + return gmp_cmp($this->value, $x->value) == 0; + default: + return $this->value === $x->value && $this->is_negative == $x->is_negative; + } + } + + /** + * Set Precision + * + * Some bitwise operations give different results depending on the precision being used. Examples include left + * shift, not, and rotates. + * + * @param Integer $bits + * @access public + */ + function setPrecision($bits) + { + $this->precision = $bits; + if ( MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_BCMATH ) { + $this->bitmask = new Math_BigInteger(chr((1 << ($bits & 0x7)) - 1) . str_repeat(chr(0xFF), $bits >> 3), 256); + } else { + $this->bitmask = new Math_BigInteger(bcpow('2', $bits, 0)); + } + + $temp = $this->_normalize($this); + $this->value = $temp->value; + } + + /** + * Logical And + * + * @param Math_BigInteger $x + * @access public + * @internal Implemented per a request by Lluis Pamies i Juarez + * @return Math_BigInteger + */ + function bitwise_and($x) + { + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = new Math_BigInteger(); + $temp->value = gmp_and($this->value, $x->value); + + return $this->_normalize($temp); + case MATH_BIGINTEGER_MODE_BCMATH: + $left = $this->toBytes(); + $right = $x->toBytes(); + + $length = max(strlen($left), strlen($right)); + + $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); + $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); + + return $this->_normalize(new Math_BigInteger($left & $right, 256)); + } + + $result = $this->copy(); + + $length = min(count($x->value), count($this->value)); + + $result->value = array_slice($result->value, 0, $length); + + for ($i = 0; $i < $length; ++$i) { + $result->value[$i]&= $x->value[$i]; + } + + return $this->_normalize($result); + } + + /** + * Logical Or + * + * @param Math_BigInteger $x + * @access public + * @internal Implemented per a request by Lluis Pamies i Juarez + * @return Math_BigInteger + */ + function bitwise_or($x) + { + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = new Math_BigInteger(); + $temp->value = gmp_or($this->value, $x->value); + + return $this->_normalize($temp); + case MATH_BIGINTEGER_MODE_BCMATH: + $left = $this->toBytes(); + $right = $x->toBytes(); + + $length = max(strlen($left), strlen($right)); + + $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); + $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); + + return $this->_normalize(new Math_BigInteger($left | $right, 256)); + } + + $length = max(count($this->value), count($x->value)); + $result = $this->copy(); + $result->value = array_pad($result->value, $length, 0); + $x->value = array_pad($x->value, $length, 0); + + for ($i = 0; $i < $length; ++$i) { + $result->value[$i]|= $x->value[$i]; + } + + return $this->_normalize($result); + } + + /** + * Logical Exclusive-Or + * + * @param Math_BigInteger $x + * @access public + * @internal Implemented per a request by Lluis Pamies i Juarez + * @return Math_BigInteger + */ + function bitwise_xor($x) + { + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = new Math_BigInteger(); + $temp->value = gmp_xor($this->value, $x->value); + + return $this->_normalize($temp); + case MATH_BIGINTEGER_MODE_BCMATH: + $left = $this->toBytes(); + $right = $x->toBytes(); + + $length = max(strlen($left), strlen($right)); + + $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); + $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); + + return $this->_normalize(new Math_BigInteger($left ^ $right, 256)); + } + + $length = max(count($this->value), count($x->value)); + $result = $this->copy(); + $result->value = array_pad($result->value, $length, 0); + $x->value = array_pad($x->value, $length, 0); + + for ($i = 0; $i < $length; ++$i) { + $result->value[$i]^= $x->value[$i]; + } + + return $this->_normalize($result); + } + + /** + * Logical Not + * + * @access public + * @internal Implemented per a request by Lluis Pamies i Juarez + * @return Math_BigInteger + */ + function bitwise_not() + { + // calculuate "not" without regard to $this->precision + // (will always result in a smaller number. ie. ~1 isn't 1111 1110 - it's 0) + $temp = $this->toBytes(); + $pre_msb = decbin(ord($temp[0])); + $temp = ~$temp; + $msb = decbin(ord($temp[0])); + if (strlen($msb) == 8) { + $msb = substr($msb, strpos($msb, '0')); + } + $temp[0] = chr(bindec($msb)); + + // see if we need to add extra leading 1's + $current_bits = strlen($pre_msb) + 8 * strlen($temp) - 8; + $new_bits = $this->precision - $current_bits; + if ($new_bits <= 0) { + return $this->_normalize(new Math_BigInteger($temp, 256)); + } + + // generate as many leading 1's as we need to. + $leading_ones = chr((1 << ($new_bits & 0x7)) - 1) . str_repeat(chr(0xFF), $new_bits >> 3); + $this->_base256_lshift($leading_ones, $current_bits); + + $temp = str_pad($temp, strlen($leading_ones), chr(0), STR_PAD_LEFT); + + return $this->_normalize(new Math_BigInteger($leading_ones | $temp, 256)); + } + + /** + * Logical Right Shift + * + * Shifts BigInteger's by $shift bits, effectively dividing by 2**$shift. + * + * @param Integer $shift + * @return Math_BigInteger + * @access public + * @internal The only version that yields any speed increases is the internal version. + */ + function bitwise_rightShift($shift) + { + $temp = new Math_BigInteger(); + + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + static $two; + + if (!isset($two)) { + $two = gmp_init('2'); + } + + $temp->value = gmp_div_q($this->value, gmp_pow($two, $shift)); + + break; + case MATH_BIGINTEGER_MODE_BCMATH: + $temp->value = bcdiv($this->value, bcpow('2', $shift, 0), 0); + + break; + default: // could just replace _lshift with this, but then all _lshift() calls would need to be rewritten + // and I don't want to do that... + $temp->value = $this->value; + $temp->_rshift($shift); + } + + return $this->_normalize($temp); + } + + /** + * Logical Left Shift + * + * Shifts BigInteger's by $shift bits, effectively multiplying by 2**$shift. + * + * @param Integer $shift + * @return Math_BigInteger + * @access public + * @internal The only version that yields any speed increases is the internal version. + */ + function bitwise_leftShift($shift) + { + $temp = new Math_BigInteger(); + + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + static $two; + + if (!isset($two)) { + $two = gmp_init('2'); + } + + $temp->value = gmp_mul($this->value, gmp_pow($two, $shift)); + + break; + case MATH_BIGINTEGER_MODE_BCMATH: + $temp->value = bcmul($this->value, bcpow('2', $shift, 0), 0); + + break; + default: // could just replace _rshift with this, but then all _lshift() calls would need to be rewritten + // and I don't want to do that... + $temp->value = $this->value; + $temp->_lshift($shift); + } + + return $this->_normalize($temp); + } + + /** + * Logical Left Rotate + * + * Instead of the top x bits being dropped they're appended to the shifted bit string. + * + * @param Integer $shift + * @return Math_BigInteger + * @access public + */ + function bitwise_leftRotate($shift) + { + $bits = $this->toBytes(); + + if ($this->precision > 0) { + $precision = $this->precision; + if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH ) { + $mask = $this->bitmask->subtract(new Math_BigInteger(1)); + $mask = $mask->toBytes(); + } else { + $mask = $this->bitmask->toBytes(); + } + } else { + $temp = ord($bits[0]); + for ($i = 0; $temp >> $i; ++$i); + $precision = 8 * strlen($bits) - 8 + $i; + $mask = chr((1 << ($precision & 0x7)) - 1) . str_repeat(chr(0xFF), $precision >> 3); + } + + if ($shift < 0) { + $shift+= $precision; + } + $shift%= $precision; + + if (!$shift) { + return $this->copy(); + } + + $left = $this->bitwise_leftShift($shift); + $left = $left->bitwise_and(new Math_BigInteger($mask, 256)); + $right = $this->bitwise_rightShift($precision - $shift); + $result = MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_BCMATH ? $left->bitwise_or($right) : $left->add($right); + return $this->_normalize($result); + } + + /** + * Logical Right Rotate + * + * Instead of the bottom x bits being dropped they're prepended to the shifted bit string. + * + * @param Integer $shift + * @return Math_BigInteger + * @access public + */ + function bitwise_rightRotate($shift) + { + return $this->bitwise_leftRotate(-$shift); + } + + /** + * Set random number generator function + * + * This function is deprecated. + * + * @param String $generator + * @access public + */ + function setRandomGenerator($generator) + { + } + + /** + * Generates a random BigInteger + * + * Byte length is equal to $length. Uses crypt_random if it's loaded and mt_rand if it's not. + * + * @param Integer $length + * @return Math_BigInteger + * @access private + */ + function _random_number_helper($size) + { + if (function_exists('crypt_random_string')) { + $random = crypt_random_string($size); + } else { + $random = ''; + + if ($size & 1) { + $random.= chr(mt_rand(0, 255)); + } + + $blocks = $size >> 1; + for ($i = 0; $i < $blocks; ++$i) { + // mt_rand(-2147483648, 0x7FFFFFFF) always produces -2147483648 on some systems + $random.= pack('n', mt_rand(0, 0xFFFF)); + } + } + + return new Math_BigInteger($random, 256); + } + + /** + * Generate a random number + * + * Returns a random number between $min and $max where $min and $max + * can be defined using one of the two methods: + * + * $min->random($max) + * $max->random($min) + * + * @param Math_BigInteger $arg1 + * @param optional Math_BigInteger $arg2 + * @return Math_BigInteger + * @access public + * @internal The API for creating random numbers used to be $a->random($min, $max), where $a was a Math_BigInteger object. + * That method is still supported for BC purposes. + */ + function random($arg1, $arg2 = false) + { + if ($arg1 === false) { + return false; + } + + if ($arg2 === false) { + $max = $arg1; + $min = $this; + } else { + $min = $arg1; + $max = $arg2; + } + + $compare = $max->compare($min); + + if (!$compare) { + return $this->_normalize($min); + } else if ($compare < 0) { + // if $min is bigger then $max, swap $min and $max + $temp = $max; + $max = $min; + $min = $temp; + } + + static $one; + if (!isset($one)) { + $one = new Math_BigInteger(1); + } + + $max = $max->subtract($min->subtract($one)); + $size = strlen(ltrim($max->toBytes(), chr(0))); + + /* + doing $random % $max doesn't work because some numbers will be more likely to occur than others. + eg. if $max is 140 and $random's max is 255 then that'd mean both $random = 5 and $random = 145 + would produce 5 whereas the only value of random that could produce 139 would be 139. ie. + not all numbers would be equally likely. some would be more likely than others. + + creating a whole new random number until you find one that is within the range doesn't work + because, for sufficiently small ranges, the likelihood that you'd get a number within that range + would be pretty small. eg. with $random's max being 255 and if your $max being 1 the probability + would be pretty high that $random would be greater than $max. + + phpseclib works around this using the technique described here: + + http://crypto.stackexchange.com/questions/5708/creating-a-small-number-from-a-cryptographically-secure-random-string + */ + $random_max = new Math_BigInteger(chr(1) . str_repeat("\0", $size), 256); + $random = $this->_random_number_helper($size); + + list($max_multiple) = $random_max->divide($max); + $max_multiple = $max_multiple->multiply($max); + + while ($random->compare($max_multiple) >= 0) { + $random = $random->subtract($max_multiple); + $random_max = $random_max->subtract($max_multiple); + $random = $random->bitwise_leftShift(8); + $random = $random->add($this->_random_number_helper(1)); + $random_max = $random_max->bitwise_leftShift(8); + list($max_multiple) = $random_max->divide($max); + $max_multiple = $max_multiple->multiply($max); + } + list(, $random) = $random->divide($max); + + return $this->_normalize($random->add($min)); + } + + /** + * Generate a random prime number. + * + * If there's not a prime within the given range, false will be returned. If more than $timeout seconds have elapsed, + * give up and return false. + * + * @param Math_BigInteger $arg1 + * @param optional Math_BigInteger $arg2 + * @param optional Integer $timeout + * @return Mixed + * @access public + * @internal See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap4.pdf#page=15 HAC 4.44}. + */ + function randomPrime($arg1, $arg2 = false, $timeout = false) + { + if ($arg1 === false) { + return false; + } + + if ($arg2 === false) { + $max = $arg1; + $min = $this; + } else { + $min = $arg1; + $max = $arg2; + } + + $compare = $max->compare($min); + + if (!$compare) { + return $min->isPrime() ? $min : false; + } else if ($compare < 0) { + // if $min is bigger then $max, swap $min and $max + $temp = $max; + $max = $min; + $min = $temp; + } + + static $one, $two; + if (!isset($one)) { + $one = new Math_BigInteger(1); + $two = new Math_BigInteger(2); + } + + $start = time(); + + $x = $this->random($min, $max); + + // gmp_nextprime() requires PHP 5 >= 5.2.0 per . + if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_GMP && function_exists('gmp_nextprime') ) { + $p = new Math_BigInteger(); + $p->value = gmp_nextprime($x->value); + + if ($p->compare($max) <= 0) { + return $p; + } + + if (!$min->equals($x)) { + $x = $x->subtract($one); + } + + return $x->randomPrime($min, $x); + } + + if ($x->equals($two)) { + return $x; + } + + $x->_make_odd(); + if ($x->compare($max) > 0) { + // if $x > $max then $max is even and if $min == $max then no prime number exists between the specified range + if ($min->equals($max)) { + return false; + } + $x = $min->copy(); + $x->_make_odd(); + } + + $initial_x = $x->copy(); + + while (true) { + if ($timeout !== false && time() - $start > $timeout) { + return false; + } + + if ($x->isPrime()) { + return $x; + } + + $x = $x->add($two); + + if ($x->compare($max) > 0) { + $x = $min->copy(); + if ($x->equals($two)) { + return $x; + } + $x->_make_odd(); + } + + if ($x->equals($initial_x)) { + return false; + } + } + } + + /** + * Make the current number odd + * + * If the current number is odd it'll be unchanged. If it's even, one will be added to it. + * + * @see randomPrime() + * @access private + */ + function _make_odd() + { + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + gmp_setbit($this->value, 0); + break; + case MATH_BIGINTEGER_MODE_BCMATH: + if ($this->value[strlen($this->value) - 1] % 2 == 0) { + $this->value = bcadd($this->value, '1'); + } + break; + default: + $this->value[0] |= 1; + } + } + + /** + * Checks a numer to see if it's prime + * + * Assuming the $t parameter is not set, this function has an error rate of 2**-80. The main motivation for the + * $t parameter is distributability. Math_BigInteger::randomPrime() can be distributed across multiple pageloads + * on a website instead of just one. + * + * @param optional Math_BigInteger $t + * @return Boolean + * @access public + * @internal Uses the + * {@link http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test Miller-Rabin primality test}. See + * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap4.pdf#page=8 HAC 4.24}. + */ + function isPrime($t = false) + { + $length = strlen($this->toBytes()); + + if (!$t) { + // see HAC 4.49 "Note (controlling the error probability)" + // @codingStandardsIgnoreStart + if ($length >= 163) { $t = 2; } // floor(1300 / 8) + else if ($length >= 106) { $t = 3; } // floor( 850 / 8) + else if ($length >= 81 ) { $t = 4; } // floor( 650 / 8) + else if ($length >= 68 ) { $t = 5; } // floor( 550 / 8) + else if ($length >= 56 ) { $t = 6; } // floor( 450 / 8) + else if ($length >= 50 ) { $t = 7; } // floor( 400 / 8) + else if ($length >= 43 ) { $t = 8; } // floor( 350 / 8) + else if ($length >= 37 ) { $t = 9; } // floor( 300 / 8) + else if ($length >= 31 ) { $t = 12; } // floor( 250 / 8) + else if ($length >= 25 ) { $t = 15; } // floor( 200 / 8) + else if ($length >= 18 ) { $t = 18; } // floor( 150 / 8) + else { $t = 27; } + // @codingStandardsIgnoreEnd + } + + // ie. gmp_testbit($this, 0) + // ie. isEven() or !isOdd() + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + return gmp_prob_prime($this->value, $t) != 0; + case MATH_BIGINTEGER_MODE_BCMATH: + if ($this->value === '2') { + return true; + } + if ($this->value[strlen($this->value) - 1] % 2 == 0) { + return false; + } + break; + default: + if ($this->value == array(2)) { + return true; + } + if (~$this->value[0] & 1) { + return false; + } + } + + static $primes, $zero, $one, $two; + + if (!isset($primes)) { + $primes = array( + 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, + 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, + 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, + 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, + 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, + 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, + 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, + 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, + 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, + 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, + 953, 967, 971, 977, 983, 991, 997 + ); + + if ( MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL ) { + for ($i = 0; $i < count($primes); ++$i) { + $primes[$i] = new Math_BigInteger($primes[$i]); + } + } + + $zero = new Math_BigInteger(); + $one = new Math_BigInteger(1); + $two = new Math_BigInteger(2); + } + + if ($this->equals($one)) { + return false; + } + + // see HAC 4.4.1 "Random search for probable primes" + if ( MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL ) { + foreach ($primes as $prime) { + list(, $r) = $this->divide($prime); + if ($r->equals($zero)) { + return $this->equals($prime); + } + } + } else { + $value = $this->value; + foreach ($primes as $prime) { + list(, $r) = $this->_divide_digit($value, $prime); + if (!$r) { + return count($value) == 1 && $value[0] == $prime; + } + } + } + + $n = $this->copy(); + $n_1 = $n->subtract($one); + $n_2 = $n->subtract($two); + + $r = $n_1->copy(); + $r_value = $r->value; + // ie. $s = gmp_scan1($n, 0) and $r = gmp_div_q($n, gmp_pow(gmp_init('2'), $s)); + if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH ) { + $s = 0; + // if $n was 1, $r would be 0 and this would be an infinite loop, hence our $this->equals($one) check earlier + while ($r->value[strlen($r->value) - 1] % 2 == 0) { + $r->value = bcdiv($r->value, '2', 0); + ++$s; + } + } else { + for ($i = 0, $r_length = count($r_value); $i < $r_length; ++$i) { + $temp = ~$r_value[$i] & 0xFFFFFF; + for ($j = 1; ($temp >> $j) & 1; ++$j); + if ($j != 25) { + break; + } + } + $s = 26 * $i + $j - 1; + $r->_rshift($s); + } + + for ($i = 0; $i < $t; ++$i) { + $a = $this->random($two, $n_2); + $y = $a->modPow($r, $n); + + if (!$y->equals($one) && !$y->equals($n_1)) { + for ($j = 1; $j < $s && !$y->equals($n_1); ++$j) { + $y = $y->modPow($two, $n); + if ($y->equals($one)) { + return false; + } + } + + if (!$y->equals($n_1)) { + return false; + } + } + } + return true; + } + + /** + * Logical Left Shift + * + * Shifts BigInteger's by $shift bits. + * + * @param Integer $shift + * @access private + */ + function _lshift($shift) + { + if ( $shift == 0 ) { + return; + } + + $num_digits = (int) ($shift / MATH_BIGINTEGER_BASE); + $shift %= MATH_BIGINTEGER_BASE; + $shift = 1 << $shift; + + $carry = 0; + + for ($i = 0; $i < count($this->value); ++$i) { + $temp = $this->value[$i] * $shift + $carry; + $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $this->value[$i] = (int) ($temp - $carry * MATH_BIGINTEGER_BASE_FULL); + } + + if ( $carry ) { + $this->value[count($this->value)] = $carry; + } + + while ($num_digits--) { + array_unshift($this->value, 0); + } + } + + /** + * Logical Right Shift + * + * Shifts BigInteger's by $shift bits. + * + * @param Integer $shift + * @access private + */ + function _rshift($shift) + { + if ($shift == 0) { + return; + } + + $num_digits = (int) ($shift / MATH_BIGINTEGER_BASE); + $shift %= MATH_BIGINTEGER_BASE; + $carry_shift = MATH_BIGINTEGER_BASE - $shift; + $carry_mask = (1 << $shift) - 1; + + if ( $num_digits ) { + $this->value = array_slice($this->value, $num_digits); + } + + $carry = 0; + + for ($i = count($this->value) - 1; $i >= 0; --$i) { + $temp = $this->value[$i] >> $shift | $carry; + $carry = ($this->value[$i] & $carry_mask) << $carry_shift; + $this->value[$i] = $temp; + } + + $this->value = $this->_trim($this->value); + } + + /** + * Normalize + * + * Removes leading zeros and truncates (if necessary) to maintain the appropriate precision + * + * @param Math_BigInteger + * @return Math_BigInteger + * @see _trim() + * @access private + */ + function _normalize($result) + { + $result->precision = $this->precision; + $result->bitmask = $this->bitmask; + + switch ( MATH_BIGINTEGER_MODE ) { + case MATH_BIGINTEGER_MODE_GMP: + if (!empty($result->bitmask->value)) { + $result->value = gmp_and($result->value, $result->bitmask->value); + } + + return $result; + case MATH_BIGINTEGER_MODE_BCMATH: + if (!empty($result->bitmask->value)) { + $result->value = bcmod($result->value, $result->bitmask->value); + } + + return $result; + } + + $value = &$result->value; + + if ( !count($value) ) { + return $result; + } + + $value = $this->_trim($value); + + if (!empty($result->bitmask->value)) { + $length = min(count($value), count($this->bitmask->value)); + $value = array_slice($value, 0, $length); + + for ($i = 0; $i < $length; ++$i) { + $value[$i] = $value[$i] & $this->bitmask->value[$i]; + } + } + + return $result; + } + + /** + * Trim + * + * Removes leading zeros + * + * @param Array $value + * @return Math_BigInteger + * @access private + */ + function _trim($value) + { + for ($i = count($value) - 1; $i >= 0; --$i) { + if ( $value[$i] ) { + break; + } + unset($value[$i]); + } + + return $value; + } + + /** + * Array Repeat + * + * @param $input Array + * @param $multiplier mixed + * @return Array + * @access private + */ + function _array_repeat($input, $multiplier) + { + return ($multiplier) ? array_fill(0, $multiplier, $input) : array(); + } + + /** + * Logical Left Shift + * + * Shifts binary strings $shift bits, essentially multiplying by 2**$shift. + * + * @param $x String + * @param $shift Integer + * @return String + * @access private + */ + function _base256_lshift(&$x, $shift) + { + if ($shift == 0) { + return; + } + + $num_bytes = $shift >> 3; // eg. floor($shift/8) + $shift &= 7; // eg. $shift % 8 + + $carry = 0; + for ($i = strlen($x) - 1; $i >= 0; --$i) { + $temp = ord($x[$i]) << $shift | $carry; + $x[$i] = chr($temp); + $carry = $temp >> 8; + } + $carry = ($carry != 0) ? chr($carry) : ''; + $x = $carry . $x . str_repeat(chr(0), $num_bytes); + } + + /** + * Logical Right Shift + * + * Shifts binary strings $shift bits, essentially dividing by 2**$shift and returning the remainder. + * + * @param $x String + * @param $shift Integer + * @return String + * @access private + */ + function _base256_rshift(&$x, $shift) + { + if ($shift == 0) { + $x = ltrim($x, chr(0)); + return ''; + } + + $num_bytes = $shift >> 3; // eg. floor($shift/8) + $shift &= 7; // eg. $shift % 8 + + $remainder = ''; + if ($num_bytes) { + $start = $num_bytes > strlen($x) ? -strlen($x) : -$num_bytes; + $remainder = substr($x, $start); + $x = substr($x, 0, -$num_bytes); + } + + $carry = 0; + $carry_shift = 8 - $shift; + for ($i = 0; $i < strlen($x); ++$i) { + $temp = (ord($x[$i]) >> $shift) | $carry; + $carry = (ord($x[$i]) << $carry_shift) & 0xFF; + $x[$i] = chr($temp); + } + $x = ltrim($x, chr(0)); + + $remainder = chr($carry >> $carry_shift) . $remainder; + + return ltrim($remainder, chr(0)); + } + + // one quirk about how the following functions are implemented is that PHP defines N to be an unsigned long + // at 32-bits, while java's longs are 64-bits. + + /** + * Converts 32-bit integers to bytes. + * + * @param Integer $x + * @return String + * @access private + */ + function _int2bytes($x) + { + return ltrim(pack('N', $x), chr(0)); + } + + /** + * Converts bytes to 32-bit integers + * + * @param String $x + * @return Integer + * @access private + */ + function _bytes2int($x) + { + $temp = unpack('Nint', str_pad($x, 4, chr(0), STR_PAD_LEFT)); + return $temp['int']; + } + + /** + * DER-encode an integer + * + * The ability to DER-encode integers is needed to create RSA public keys for use with OpenSSL + * + * @see modPow() + * @access private + * @param Integer $length + * @return String + */ + function _encodeASN1Length($length) + { + if ($length <= 0x7F) { + return chr($length); + } + + $temp = ltrim(pack('N', $length), chr(0)); + return pack('Ca*', 0x80 | strlen($temp), $temp); + } + + /** + * Single digit division + * + * Even if int64 is being used the division operator will return a float64 value + * if the dividend is not evenly divisible by the divisor. Since a float64 doesn't + * have the precision of int64 this is a problem so, when int64 is being used, + * we'll guarantee that the dividend is divisible by first subtracting the remainder. + * + * @access private + * @param Integer $x + * @param Integer $y + * @return Integer + */ + function _safe_divide($x, $y) + { + if (MATH_BIGINTEGER_BASE === 26) { + return (int) ($x / $y); + } + + // MATH_BIGINTEGER_BASE === 31 + return ($x - ($x % $y)) / $y; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SCP.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SCP.php new file mode 100755 index 00000000..b5cd2f55 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SCP.php @@ -0,0 +1,360 @@ + + * login('username', 'password')) { + * exit('bad login'); + * } + + * $scp = new Net_SCP($ssh); + * $scp->put('abcd', str_repeat('x', 1024*1024)); + * ?> + * + * + * LICENSE: 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. + * + * @category Net + * @package Net_SCP + * @author Jim Wigginton + * @copyright 2010 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/**#@+ + * @access public + * @see Net_SCP::put() + */ +/** + * Reads data from a local file. + */ +define('NET_SCP_LOCAL_FILE', 1); +/** + * Reads data from a string. + */ +define('NET_SCP_STRING', 2); +/**#@-*/ + +/**#@+ + * @access private + * @see Net_SCP::_send() + * @see Net_SCP::_receive() + */ +/** + * SSH1 is being used. + */ +define('NET_SCP_SSH1', 1); +/** + * SSH2 is being used. + */ +define('NET_SCP_SSH2', 2); +/**#@-*/ + +/** + * Pure-PHP implementations of SCP. + * + * @package Net_SCP + * @author Jim Wigginton + * @access public + */ +class Net_SCP +{ + /** + * SSH Object + * + * @var Object + * @access private + */ + var $ssh; + + /** + * Packet Size + * + * @var Integer + * @access private + */ + var $packet_size; + + /** + * Mode + * + * @var Integer + * @access private + */ + var $mode; + + /** + * Default Constructor. + * + * Connects to an SSH server + * + * @param String $host + * @param optional Integer $port + * @param optional Integer $timeout + * @return Net_SCP + * @access public + */ + function Net_SCP($ssh) + { + if (!is_object($ssh)) { + return; + } + + switch (strtolower(get_class($ssh))) { + case 'net_ssh2': + $this->mode = NET_SCP_SSH2; + break; + case 'net_ssh1': + $this->packet_size = 50000; + $this->mode = NET_SCP_SSH1; + break; + default: + return; + } + + $this->ssh = $ssh; + } + + /** + * Uploads a file to the SCP server. + * + * By default, Net_SCP::put() does not read from the local filesystem. $data is dumped directly into $remote_file. + * So, for example, if you set $data to 'filename.ext' and then do Net_SCP::get(), you will get a file, twelve bytes + * long, containing 'filename.ext' as its contents. + * + * Setting $mode to NET_SCP_LOCAL_FILE will change the above behavior. With NET_SCP_LOCAL_FILE, $remote_file will + * contain as many bytes as filename.ext does on your local filesystem. If your filename.ext is 1MB then that is how + * large $remote_file will be, as well. + * + * Currently, only binary mode is supported. As such, if the line endings need to be adjusted, you will need to take + * care of that, yourself. + * + * @param String $remote_file + * @param String $data + * @param optional Integer $mode + * @param optional Callable $callback + * @return Boolean + * @access public + */ + function put($remote_file, $data, $mode = NET_SCP_STRING, $callback = null) + { + if (!isset($this->ssh)) { + return false; + } + + if (!$this->ssh->exec('scp -t ' . escapeshellarg($remote_file), false)) { // -t = to + return false; + } + + $temp = $this->_receive(); + if ($temp !== chr(0)) { + return false; + } + + if ($this->mode == NET_SCP_SSH2) { + $this->packet_size = $this->ssh->packet_size_client_to_server[NET_SSH2_CHANNEL_EXEC] - 4; + } + + $remote_file = basename($remote_file); + + if ($mode == NET_SCP_STRING) { + $size = strlen($data); + } else { + if (!is_file($data)) { + user_error("$data is not a valid file", E_USER_NOTICE); + return false; + } + + $fp = @fopen($data, 'rb'); + if (!$fp) { + return false; + } + $size = filesize($data); + } + + $this->_send('C0644 ' . $size . ' ' . $remote_file . "\n"); + + $temp = $this->_receive(); + if ($temp !== chr(0)) { + return false; + } + + $sent = 0; + while ($sent < $size) { + $temp = $mode & NET_SCP_STRING ? substr($data, $sent, $this->packet_size) : fread($fp, $this->packet_size); + $this->_send($temp); + $sent+= strlen($temp); + + if (is_callable($callback)) { + call_user_func($callback, $sent); + } + } + $this->_close(); + + if ($mode != NET_SCP_STRING) { + fclose($fp); + } + + return true; + } + + /** + * Downloads a file from the SCP server. + * + * Returns a string containing the contents of $remote_file if $local_file is left undefined or a boolean false if + * the operation was unsuccessful. If $local_file is defined, returns true or false depending on the success of the + * operation + * + * @param String $remote_file + * @param optional String $local_file + * @return Mixed + * @access public + */ + function get($remote_file, $local_file = false) + { + if (!isset($this->ssh)) { + return false; + } + + if (!$this->ssh->exec('scp -f ' . escapeshellarg($remote_file), false)) { // -f = from + return false; + } + + $this->_send("\0"); + + if (!preg_match('#(?[^ ]+) (?\d+) (?.+)#', rtrim($this->_receive()), $info)) { + return false; + } + + $this->_send("\0"); + + $size = 0; + + if ($local_file !== false) { + $fp = @fopen($local_file, 'wb'); + if (!$fp) { + return false; + } + } + + $content = ''; + while ($size < $info['size']) { + $data = $this->_receive(); + // SCP usually seems to split stuff out into 16k chunks + $size+= strlen($data); + + if ($local_file === false) { + $content.= $data; + } else { + fputs($fp, $data); + } + } + + $this->_close(); + + if ($local_file !== false) { + fclose($fp); + return true; + } + + return $content; + } + + /** + * Sends a packet to an SSH server + * + * @param String $data + * @access private + */ + function _send($data) + { + switch ($this->mode) { + case NET_SCP_SSH2: + $this->ssh->_send_channel_packet(NET_SSH2_CHANNEL_EXEC, $data); + break; + case NET_SCP_SSH1: + $data = pack('CNa*', NET_SSH1_CMSG_STDIN_DATA, strlen($data), $data); + $this->ssh->_send_binary_packet($data); + } + } + + /** + * Receives a packet from an SSH server + * + * @return String + * @access private + */ + function _receive() + { + switch ($this->mode) { + case NET_SCP_SSH2: + return $this->ssh->_get_channel_packet(NET_SSH2_CHANNEL_EXEC, true); + case NET_SCP_SSH1: + if (!$this->ssh->bitmap) { + return false; + } + while (true) { + $response = $this->ssh->_get_binary_packet(); + switch ($response[NET_SSH1_RESPONSE_TYPE]) { + case NET_SSH1_SMSG_STDOUT_DATA: + extract(unpack('Nlength', $response[NET_SSH1_RESPONSE_DATA])); + return $this->ssh->_string_shift($response[NET_SSH1_RESPONSE_DATA], $length); + case NET_SSH1_SMSG_STDERR_DATA: + break; + case NET_SSH1_SMSG_EXITSTATUS: + $this->ssh->_send_binary_packet(chr(NET_SSH1_CMSG_EXIT_CONFIRMATION)); + fclose($this->ssh->fsock); + $this->ssh->bitmap = 0; + return false; + default: + user_error('Unknown packet received', E_USER_NOTICE); + return false; + } + } + } + } + + /** + * Closes the connection to an SSH server + * + * @access private + */ + function _close() + { + switch ($this->mode) { + case NET_SCP_SSH2: + $this->ssh->_close_channel(NET_SSH2_CHANNEL_EXEC, true); + break; + case NET_SCP_SSH1: + $this->ssh->disconnect(); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SFTP.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SFTP.php new file mode 100755 index 00000000..5f7d3666 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SFTP.php @@ -0,0 +1,2778 @@ + + * login('username', 'password')) { + * exit('Login Failed'); + * } + * + * echo $sftp->pwd() . "\r\n"; + * $sftp->put('filename.ext', 'hello, world!'); + * print_r($sftp->nlist()); + * ?> + * + * + * LICENSE: 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. + * + * @category Net + * @package Net_SFTP + * @author Jim Wigginton + * @copyright 2009 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Net_SSH2 + */ +if (!class_exists('Net_SSH2')) { + include_once 'SSH2.php'; +} + +/**#@+ + * @access public + * @see Net_SFTP::getLog() + */ +/** + * Returns the message numbers + */ +define('NET_SFTP_LOG_SIMPLE', NET_SSH2_LOG_SIMPLE); +/** + * Returns the message content + */ +define('NET_SFTP_LOG_COMPLEX', NET_SSH2_LOG_COMPLEX); +/** + * Outputs the message content in real-time. + */ +define('NET_SFTP_LOG_REALTIME', 3); +/**#@-*/ + +/** + * SFTP channel constant + * + * Net_SSH2::exec() uses 0 and Net_SSH2::read() / Net_SSH2::write() use 1. + * + * @see Net_SSH2::_send_channel_packet() + * @see Net_SSH2::_get_channel_packet() + * @access private + */ +define('NET_SFTP_CHANNEL', 0x100); + +/**#@+ + * @access public + * @see Net_SFTP::put() + */ +/** + * Reads data from a local file. + */ +define('NET_SFTP_LOCAL_FILE', 1); +/** + * Reads data from a string. + */ +// this value isn't really used anymore but i'm keeping it reserved for historical reasons +define('NET_SFTP_STRING', 2); +/** + * Resumes an upload + */ +define('NET_SFTP_RESUME', 4); +/** + * Append a local file to an already existing remote file + */ +define('NET_SFTP_RESUME_START', 8); +/**#@-*/ + +/** + * Pure-PHP implementations of SFTP. + * + * @package Net_SFTP + * @author Jim Wigginton + * @access public + */ +class Net_SFTP extends Net_SSH2 +{ + /** + * Packet Types + * + * @see Net_SFTP::Net_SFTP() + * @var Array + * @access private + */ + var $packet_types = array(); + + /** + * Status Codes + * + * @see Net_SFTP::Net_SFTP() + * @var Array + * @access private + */ + var $status_codes = array(); + + /** + * The Request ID + * + * The request ID exists in the off chance that a packet is sent out-of-order. Of course, this library doesn't support + * concurrent actions, so it's somewhat academic, here. + * + * @var Integer + * @see Net_SFTP::_send_sftp_packet() + * @access private + */ + var $request_id = false; + + /** + * The Packet Type + * + * The request ID exists in the off chance that a packet is sent out-of-order. Of course, this library doesn't support + * concurrent actions, so it's somewhat academic, here. + * + * @var Integer + * @see Net_SFTP::_get_sftp_packet() + * @access private + */ + var $packet_type = -1; + + /** + * Packet Buffer + * + * @var String + * @see Net_SFTP::_get_sftp_packet() + * @access private + */ + var $packet_buffer = ''; + + /** + * Extensions supported by the server + * + * @var Array + * @see Net_SFTP::_initChannel() + * @access private + */ + var $extensions = array(); + + /** + * Server SFTP version + * + * @var Integer + * @see Net_SFTP::_initChannel() + * @access private + */ + var $version; + + /** + * Current working directory + * + * @var String + * @see Net_SFTP::_realpath() + * @see Net_SFTP::chdir() + * @access private + */ + var $pwd = false; + + /** + * Packet Type Log + * + * @see Net_SFTP::getLog() + * @var Array + * @access private + */ + var $packet_type_log = array(); + + /** + * Packet Log + * + * @see Net_SFTP::getLog() + * @var Array + * @access private + */ + var $packet_log = array(); + + /** + * Error information + * + * @see Net_SFTP::getSFTPErrors() + * @see Net_SFTP::getLastSFTPError() + * @var String + * @access private + */ + var $sftp_errors = array(); + + /** + * Stat Cache + * + * Rather than always having to open a directory and close it immediately there after to see if a file is a directory + * we'll cache the results. + * + * @see Net_SFTP::_update_stat_cache() + * @see Net_SFTP::_remove_from_stat_cache() + * @see Net_SFTP::_query_stat_cache() + * @var Array + * @access private + */ + var $stat_cache = array(); + + /** + * Max SFTP Packet Size + * + * @see Net_SFTP::Net_SFTP() + * @see Net_SFTP::get() + * @var Array + * @access private + */ + var $max_sftp_packet; + + /** + * Stat Cache Flag + * + * @see Net_SFTP::disableStatCache() + * @see Net_SFTP::enableStatCache() + * @var Boolean + * @access private + */ + var $use_stat_cache = true; + + /** + * Sort Options + * + * @see Net_SFTP::_comparator() + * @see Net_SFTP::setListOrder() + * @var Array + * @access private + */ + var $sortOptions = array(); + + /** + * Default Constructor. + * + * Connects to an SFTP server + * + * @param String $host + * @param optional Integer $port + * @param optional Integer $timeout + * @return Net_SFTP + * @access public + */ + function Net_SFTP($host, $port = 22, $timeout = 10) + { + parent::Net_SSH2($host, $port, $timeout); + + $this->max_sftp_packet = 1 << 15; + + $this->packet_types = array( + 1 => 'NET_SFTP_INIT', + 2 => 'NET_SFTP_VERSION', + /* the format of SSH_FXP_OPEN changed between SFTPv4 and SFTPv5+: + SFTPv5+: http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.1.1 + pre-SFTPv5 : http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-6.3 */ + 3 => 'NET_SFTP_OPEN', + 4 => 'NET_SFTP_CLOSE', + 5 => 'NET_SFTP_READ', + 6 => 'NET_SFTP_WRITE', + 7 => 'NET_SFTP_LSTAT', + 9 => 'NET_SFTP_SETSTAT', + 11 => 'NET_SFTP_OPENDIR', + 12 => 'NET_SFTP_READDIR', + 13 => 'NET_SFTP_REMOVE', + 14 => 'NET_SFTP_MKDIR', + 15 => 'NET_SFTP_RMDIR', + 16 => 'NET_SFTP_REALPATH', + 17 => 'NET_SFTP_STAT', + /* the format of SSH_FXP_RENAME changed between SFTPv4 and SFTPv5+: + SFTPv5+: http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.3 + pre-SFTPv5 : http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-6.5 */ + 18 => 'NET_SFTP_RENAME', + 19 => 'NET_SFTP_READLINK', + 20 => 'NET_SFTP_SYMLINK', + + 101=> 'NET_SFTP_STATUS', + 102=> 'NET_SFTP_HANDLE', + /* the format of SSH_FXP_NAME changed between SFTPv3 and SFTPv4+: + SFTPv4+: http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-9.4 + pre-SFTPv4 : http://tools.ietf.org/html/draft-ietf-secsh-filexfer-02#section-7 */ + 103=> 'NET_SFTP_DATA', + 104=> 'NET_SFTP_NAME', + 105=> 'NET_SFTP_ATTRS', + + 200=> 'NET_SFTP_EXTENDED' + ); + $this->status_codes = array( + 0 => 'NET_SFTP_STATUS_OK', + 1 => 'NET_SFTP_STATUS_EOF', + 2 => 'NET_SFTP_STATUS_NO_SUCH_FILE', + 3 => 'NET_SFTP_STATUS_PERMISSION_DENIED', + 4 => 'NET_SFTP_STATUS_FAILURE', + 5 => 'NET_SFTP_STATUS_BAD_MESSAGE', + 6 => 'NET_SFTP_STATUS_NO_CONNECTION', + 7 => 'NET_SFTP_STATUS_CONNECTION_LOST', + 8 => 'NET_SFTP_STATUS_OP_UNSUPPORTED', + 9 => 'NET_SFTP_STATUS_INVALID_HANDLE', + 10 => 'NET_SFTP_STATUS_NO_SUCH_PATH', + 11 => 'NET_SFTP_STATUS_FILE_ALREADY_EXISTS', + 12 => 'NET_SFTP_STATUS_WRITE_PROTECT', + 13 => 'NET_SFTP_STATUS_NO_MEDIA', + 14 => 'NET_SFTP_STATUS_NO_SPACE_ON_FILESYSTEM', + 15 => 'NET_SFTP_STATUS_QUOTA_EXCEEDED', + 16 => 'NET_SFTP_STATUS_UNKNOWN_PRINCIPAL', + 17 => 'NET_SFTP_STATUS_LOCK_CONFLICT', + 18 => 'NET_SFTP_STATUS_DIR_NOT_EMPTY', + 19 => 'NET_SFTP_STATUS_NOT_A_DIRECTORY', + 20 => 'NET_SFTP_STATUS_INVALID_FILENAME', + 21 => 'NET_SFTP_STATUS_LINK_LOOP', + 22 => 'NET_SFTP_STATUS_CANNOT_DELETE', + 23 => 'NET_SFTP_STATUS_INVALID_PARAMETER', + 24 => 'NET_SFTP_STATUS_FILE_IS_A_DIRECTORY', + 25 => 'NET_SFTP_STATUS_BYTE_RANGE_LOCK_CONFLICT', + 26 => 'NET_SFTP_STATUS_BYTE_RANGE_LOCK_REFUSED', + 27 => 'NET_SFTP_STATUS_DELETE_PENDING', + 28 => 'NET_SFTP_STATUS_FILE_CORRUPT', + 29 => 'NET_SFTP_STATUS_OWNER_INVALID', + 30 => 'NET_SFTP_STATUS_GROUP_INVALID', + 31 => 'NET_SFTP_STATUS_NO_MATCHING_BYTE_RANGE_LOCK' + ); + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-7.1 + // the order, in this case, matters quite a lot - see Net_SFTP::_parseAttributes() to understand why + $this->attributes = array( + 0x00000001 => 'NET_SFTP_ATTR_SIZE', + 0x00000002 => 'NET_SFTP_ATTR_UIDGID', // defined in SFTPv3, removed in SFTPv4+ + 0x00000004 => 'NET_SFTP_ATTR_PERMISSIONS', + 0x00000008 => 'NET_SFTP_ATTR_ACCESSTIME', + // 0x80000000 will yield a floating point on 32-bit systems and converting floating points to integers + // yields inconsistent behavior depending on how php is compiled. so we left shift -1 (which, in + // two's compliment, consists of all 1 bits) by 31. on 64-bit systems this'll yield 0xFFFFFFFF80000000. + // that's not a problem, however, and 'anded' and a 32-bit number, as all the leading 1 bits are ignored. + -1 << 31 => 'NET_SFTP_ATTR_EXTENDED' + ); + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-6.3 + // the flag definitions change somewhat in SFTPv5+. if SFTPv5+ support is added to this library, maybe name + // the array for that $this->open5_flags and similarily alter the constant names. + $this->open_flags = array( + 0x00000001 => 'NET_SFTP_OPEN_READ', + 0x00000002 => 'NET_SFTP_OPEN_WRITE', + 0x00000004 => 'NET_SFTP_OPEN_APPEND', + 0x00000008 => 'NET_SFTP_OPEN_CREATE', + 0x00000010 => 'NET_SFTP_OPEN_TRUNCATE', + 0x00000020 => 'NET_SFTP_OPEN_EXCL' + ); + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-5.2 + // see Net_SFTP::_parseLongname() for an explanation + $this->file_types = array( + 1 => 'NET_SFTP_TYPE_REGULAR', + 2 => 'NET_SFTP_TYPE_DIRECTORY', + 3 => 'NET_SFTP_TYPE_SYMLINK', + 4 => 'NET_SFTP_TYPE_SPECIAL', + 5 => 'NET_SFTP_TYPE_UNKNOWN', + // the followin types were first defined for use in SFTPv5+ + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-05#section-5.2 + 6 => 'NET_SFTP_TYPE_SOCKET', + 7 => 'NET_SFTP_TYPE_CHAR_DEVICE', + 8 => 'NET_SFTP_TYPE_BLOCK_DEVICE', + 9 => 'NET_SFTP_TYPE_FIFO' + ); + $this->_define_array( + $this->packet_types, + $this->status_codes, + $this->attributes, + $this->open_flags, + $this->file_types + ); + + if (!defined('NET_SFTP_QUEUE_SIZE')) { + define('NET_SFTP_QUEUE_SIZE', 50); + } + } + + /** + * Login + * + * @param String $username + * @param optional String $password + * @return Boolean + * @access public + */ + function login($username) + { + $args = func_get_args(); + if (!call_user_func_array(array(&$this, '_login'), $args)) { + return false; + } + + $this->window_size_server_to_client[NET_SFTP_CHANNEL] = $this->window_size; + + $packet = pack('CNa*N3', + NET_SSH2_MSG_CHANNEL_OPEN, strlen('session'), 'session', NET_SFTP_CHANNEL, $this->window_size, 0x4000); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $this->channel_status[NET_SFTP_CHANNEL] = NET_SSH2_MSG_CHANNEL_OPEN; + + $response = $this->_get_channel_packet(NET_SFTP_CHANNEL); + if ($response === false) { + return false; + } + + $packet = pack('CNNa*CNa*', + NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SFTP_CHANNEL], strlen('subsystem'), 'subsystem', 1, strlen('sftp'), 'sftp'); + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $this->channel_status[NET_SFTP_CHANNEL] = NET_SSH2_MSG_CHANNEL_REQUEST; + + $response = $this->_get_channel_packet(NET_SFTP_CHANNEL); + if ($response === false) { + // from PuTTY's psftp.exe + $command = "test -x /usr/lib/sftp-server && exec /usr/lib/sftp-server\n" . + "test -x /usr/local/lib/sftp-server && exec /usr/local/lib/sftp-server\n" . + "exec sftp-server"; + // we don't do $this->exec($command, false) because exec() operates on a different channel and plus the SSH_MSG_CHANNEL_OPEN that exec() does + // is redundant + $packet = pack('CNNa*CNa*', + NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SFTP_CHANNEL], strlen('exec'), 'exec', 1, strlen($command), $command); + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $this->channel_status[NET_SFTP_CHANNEL] = NET_SSH2_MSG_CHANNEL_REQUEST; + + $response = $this->_get_channel_packet(NET_SFTP_CHANNEL); + if ($response === false) { + return false; + } + } + + $this->channel_status[NET_SFTP_CHANNEL] = NET_SSH2_MSG_CHANNEL_DATA; + + if (!$this->_send_sftp_packet(NET_SFTP_INIT, "\0\0\0\3")) { + return false; + } + + $response = $this->_get_sftp_packet(); + if ($this->packet_type != NET_SFTP_VERSION) { + user_error('Expected SSH_FXP_VERSION'); + return false; + } + + extract(unpack('Nversion', $this->_string_shift($response, 4))); + $this->version = $version; + while (!empty($response)) { + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $key = $this->_string_shift($response, $length); + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $value = $this->_string_shift($response, $length); + $this->extensions[$key] = $value; + } + + /* + SFTPv4+ defines a 'newline' extension. SFTPv3 seems to have unofficial support for it via 'newline@vandyke.com', + however, I'm not sure what 'newline@vandyke.com' is supposed to do (the fact that it's unofficial means that it's + not in the official SFTPv3 specs) and 'newline@vandyke.com' / 'newline' are likely not drop-in substitutes for + one another due to the fact that 'newline' comes with a SSH_FXF_TEXT bitmask whereas it seems unlikely that + 'newline@vandyke.com' would. + */ + /* + if (isset($this->extensions['newline@vandyke.com'])) { + $this->extensions['newline'] = $this->extensions['newline@vandyke.com']; + unset($this->extensions['newline@vandyke.com']); + } + */ + + $this->request_id = 1; + + /* + A Note on SFTPv4/5/6 support: + states the following: + + "If the client wishes to interoperate with servers that support noncontiguous version + numbers it SHOULD send '3'" + + Given that the server only sends its version number after the client has already done so, the above + seems to be suggesting that v3 should be the default version. This makes sense given that v3 is the + most popular. + + states the following; + + "If the server did not send the "versions" extension, or the version-from-list was not included, the + server MAY send a status response describing the failure, but MUST then close the channel without + processing any further requests." + + So what do you do if you have a client whose initial SSH_FXP_INIT packet says it implements v3 and + a server whose initial SSH_FXP_VERSION reply says it implements v4 and only v4? If it only implements + v4, the "versions" extension is likely not going to have been sent so version re-negotiation as discussed + in draft-ietf-secsh-filexfer-13 would be quite impossible. As such, what Net_SFTP would do is close the + channel and reopen it with a new and updated SSH_FXP_INIT packet. + */ + switch ($this->version) { + case 2: + case 3: + break; + default: + return false; + } + + $this->pwd = $this->_realpath('.'); + + $this->_update_stat_cache($this->pwd, array()); + + return true; + } + + /** + * Disable the stat cache + * + * @access public + */ + function disableStatCache() + { + $this->use_stat_cache = false; + } + + /** + * Enable the stat cache + * + * @access public + */ + function enableStatCache() + { + $this->use_stat_cache = true; + } + + /** + * Clear the stat cache + * + * @access public + */ + function clearStatCache() + { + $this->stat_cache = array(); + } + + /** + * Returns the current directory name + * + * @return Mixed + * @access public + */ + function pwd() + { + return $this->pwd; + } + + /** + * Logs errors + * + * @param String $response + * @param optional Integer $status + * @access public + */ + function _logError($response, $status = -1) + { + if ($status == -1) { + extract(unpack('Nstatus', $this->_string_shift($response, 4))); + } + + $error = $this->status_codes[$status]; + + if ($this->version > 2) { + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $this->sftp_errors[] = $error . ': ' . $this->_string_shift($response, $length); + } else { + $this->sftp_errors[] = $error; + } + } + + /** + * Canonicalize the Server-Side Path Name + * + * SFTP doesn't provide a mechanism by which the current working directory can be changed, so we'll emulate it. Returns + * the absolute (canonicalized) path. + * + * @see Net_SFTP::chdir() + * @param String $path + * @return Mixed + * @access private + */ + function _realpath($path) + { + if ($this->pwd === false) { + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.9 + if (!$this->_send_sftp_packet(NET_SFTP_REALPATH, pack('Na*', strlen($path), $path))) { + return false; + } + + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_NAME: + // although SSH_FXP_NAME is implemented differently in SFTPv3 than it is in SFTPv4+, the following + // should work on all SFTP versions since the only part of the SSH_FXP_NAME packet the following looks + // at is the first part and that part is defined the same in SFTP versions 3 through 6. + $this->_string_shift($response, 4); // skip over the count - it should be 1, anyway + extract(unpack('Nlength', $this->_string_shift($response, 4))); + return $this->_string_shift($response, $length); + case NET_SFTP_STATUS: + $this->_logError($response); + return false; + default: + user_error('Expected SSH_FXP_NAME or SSH_FXP_STATUS'); + return false; + } + } + + if ($path[0] != '/') { + $path = $this->pwd . '/' . $path; + } + + $path = explode('/', $path); + $new = array(); + foreach ($path as $dir) { + if (!strlen($dir)) { + continue; + } + switch ($dir) { + case '..': + array_pop($new); + case '.': + break; + default: + $new[] = $dir; + } + } + + return '/' . implode('/', $new); + } + + /** + * Changes the current directory + * + * @param String $dir + * @return Boolean + * @access public + */ + function chdir($dir) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + // assume current dir if $dir is empty + if ($dir === '') { + $dir = './'; + // suffix a slash if needed + } elseif ($dir[strlen($dir) - 1] != '/') { + $dir.= '/'; + } + + $dir = $this->_realpath($dir); + + // confirm that $dir is, in fact, a valid directory + if ($this->use_stat_cache && is_array($this->_query_stat_cache($dir))) { + $this->pwd = $dir; + return true; + } + + // we could do a stat on the alleged $dir to see if it's a directory but that doesn't tell us + // the currently logged in user has the appropriate permissions or not. maybe you could see if + // the file's uid / gid match the currently logged in user's uid / gid but how there's no easy + // way to get those with SFTP + + if (!$this->_send_sftp_packet(NET_SFTP_OPENDIR, pack('Na*', strlen($dir), $dir))) { + return false; + } + + // see Net_SFTP::nlist() for a more thorough explanation of the following + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_HANDLE: + $handle = substr($response, 4); + break; + case NET_SFTP_STATUS: + $this->_logError($response); + return false; + default: + user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); + return false; + } + + if (!$this->_close_handle($handle)) { + return false; + } + + $this->_update_stat_cache($dir, array()); + + $this->pwd = $dir; + return true; + } + + /** + * Returns a list of files in the given directory + * + * @param optional String $dir + * @param optional Boolean $recursive + * @return Mixed + * @access public + */ + function nlist($dir = '.', $recursive = false) + { + return $this->_nlist_helper($dir, $recursive, ''); + } + + /** + * Helper method for nlist + * + * @param String $dir + * @param Boolean $recursive + * @param String $relativeDir + * @return Mixed + * @access private + */ + function _nlist_helper($dir, $recursive, $relativeDir) + { + $files = $this->_list($dir, false); + + if (!$recursive) { + return $files; + } + + $result = array(); + foreach ($files as $value) { + if ($value == '.' || $value == '..') { + if ($relativeDir == '') { + $result[] = $value; + } + continue; + } + if (is_array($this->_query_stat_cache($this->_realpath($dir . '/' . $value)))) { + $temp = $this->_nlist_helper($dir . '/' . $value, true, $relativeDir . $value . '/'); + $result = array_merge($result, $temp); + } else { + $result[] = $relativeDir . $value; + } + } + + return $result; + } + + /** + * Returns a detailed list of files in the given directory + * + * @param optional String $dir + * @param optional Boolean $recursive + * @return Mixed + * @access public + */ + function rawlist($dir = '.', $recursive = false) + { + $files = $this->_list($dir, true); + if (!$recursive || $files === false) { + return $files; + } + + static $depth = 0; + + foreach ($files as $key=>$value) { + if ($depth != 0 && $key == '..') { + unset($files[$key]); + continue; + } + if ($key != '.' && $key != '..' && is_array($this->_query_stat_cache($this->_realpath($dir . '/' . $key)))) { + $depth++; + $files[$key] = $this->rawlist($dir . '/' . $key, true); + $depth--; + } else { + $files[$key] = (object) $value; + } + } + + return $files; + } + + /** + * Reads a list, be it detailed or not, of files in the given directory + * + * @param String $dir + * @param optional Boolean $raw + * @return Mixed + * @access private + */ + function _list($dir, $raw = true) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $dir = $this->_realpath($dir . '/'); + if ($dir === false) { + return false; + } + + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.1.2 + if (!$this->_send_sftp_packet(NET_SFTP_OPENDIR, pack('Na*', strlen($dir), $dir))) { + return false; + } + + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_HANDLE: + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-9.2 + // since 'handle' is the last field in the SSH_FXP_HANDLE packet, we'll just remove the first four bytes that + // represent the length of the string and leave it at that + $handle = substr($response, 4); + break; + case NET_SFTP_STATUS: + // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED + $this->_logError($response); + return false; + default: + user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); + return false; + } + + $this->_update_stat_cache($dir, array()); + + $contents = array(); + while (true) { + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.2.2 + // why multiple SSH_FXP_READDIR packets would be sent when the response to a single one can span arbitrarily many + // SSH_MSG_CHANNEL_DATA messages is not known to me. + if (!$this->_send_sftp_packet(NET_SFTP_READDIR, pack('Na*', strlen($handle), $handle))) { + return false; + } + + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_NAME: + extract(unpack('Ncount', $this->_string_shift($response, 4))); + for ($i = 0; $i < $count; $i++) { + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $shortname = $this->_string_shift($response, $length); + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $longname = $this->_string_shift($response, $length); + $attributes = $this->_parseAttributes($response); + if (!isset($attributes['type'])) { + $fileType = $this->_parseLongname($longname); + if ($fileType) { + $attributes['type'] = $fileType; + } + } + $contents[$shortname] = $attributes + array('filename' => $shortname); + + if (isset($attributes['type']) && $attributes['type'] == NET_SFTP_TYPE_DIRECTORY && ($shortname != '.' && $shortname != '..')) { + $this->_update_stat_cache($dir . '/' . $shortname, array()); + } else { + if ($shortname == '..') { + $temp = $this->_realpath($dir . '/..') . '/.'; + } else { + $temp = $dir . '/' . $shortname; + } + $this->_update_stat_cache($temp, (object) $attributes); + } + // SFTPv6 has an optional boolean end-of-list field, but we'll ignore that, since the + // final SSH_FXP_STATUS packet should tell us that, already. + } + break; + case NET_SFTP_STATUS: + extract(unpack('Nstatus', $this->_string_shift($response, 4))); + if ($status != NET_SFTP_STATUS_EOF) { + $this->_logError($response, $status); + return false; + } + break 2; + default: + user_error('Expected SSH_FXP_NAME or SSH_FXP_STATUS'); + return false; + } + } + + if (!$this->_close_handle($handle)) { + return false; + } + + if (count($this->sortOptions)) { + uasort($contents, array(&$this, '_comparator')); + } + + return $raw ? $contents : array_keys($contents); + } + + /** + * Compares two rawlist entries using parameters set by setListOrder() + * + * Intended for use with uasort() + * + * @param Array $a + * @param Array $b + * @return Integer + * @access private + */ + function _comparator($a, $b) + { + switch (true) { + case $a['filename'] === '.' || $b['filename'] === '.': + if ($a['filename'] === $b['filename']) { + return 0; + } + return $a['filename'] === '.' ? -1 : 1; + case $a['filename'] === '..' || $b['filename'] === '..': + if ($a['filename'] === $b['filename']) { + return 0; + } + return $a['filename'] === '..' ? -1 : 1; + case isset($a['type']) && $a['type'] === NET_SFTP_TYPE_DIRECTORY: + if (!isset($b['type'])) { + return 1; + } + if ($b['type'] !== $a['type']) { + return -1; + } + break; + case isset($b['type']) && $b['type'] === NET_SFTP_TYPE_DIRECTORY: + return 1; + } + foreach ($this->sortOptions as $sort => $order) { + if (!isset($a[$sort]) || !isset($b[$sort])) { + if (isset($a[$sort])) { + return -1; + } + if (isset($b[$sort])) { + return 1; + } + return 0; + } + switch ($sort) { + case 'filename': + $result = strcasecmp($a['filename'], $b['filename']); + if ($result) { + return $order === SORT_DESC ? -$result : $result; + } + break; + case 'permissions': + case 'mode': + $a[$sort]&= 07777; + $b[$sort]&= 07777; + default: + if ($a[$sort] === $b[$sort]) { + break; + } + return $order === SORT_ASC ? $a[$sort] - $b[$sort] : $b[$sort] - $a[$sort]; + } + } + } + + /** + * Defines how nlist() and rawlist() will be sorted - if at all. + * + * If sorting is enabled directories and files will be sorted independently with + * directories appearing before files in the resultant array that is returned. + * + * Any parameter returned by stat is a valid sort parameter for this function. + * Filename comparisons are case insensitive. + * + * Examples: + * + * $sftp->setListOrder('filename', SORT_ASC); + * $sftp->setListOrder('size', SORT_DESC, 'filename', SORT_ASC); + * $sftp->setListOrder(true); + * Separates directories from files but doesn't do any sorting beyond that + * $sftp->setListOrder(); + * Don't do any sort of sorting + * + * @access public + */ + function setListOrder() + { + $this->sortOptions = array(); + $args = func_get_args(); + if (empty($args)) { + return; + } + $len = count($args) & 0x7FFFFFFE; + for ($i = 0; $i < $len; $i+=2) { + $this->sortOptions[$args[$i]] = $args[$i + 1]; + } + if (!count($this->sortOptions)) { + $this->sortOptions = array('bogus' => true); + } + } + + /** + * Returns the file size, in bytes, or false, on failure + * + * Files larger than 4GB will show up as being exactly 4GB. + * + * @param String $filename + * @return Mixed + * @access public + */ + function size($filename) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $result = $this->stat($filename); + if ($result === false) { + return false; + } + return isset($result['size']) ? $result['size'] : -1; + } + + /** + * Save files / directories to cache + * + * @param String $path + * @param Mixed $value + * @access private + */ + function _update_stat_cache($path, $value) + { + // preg_replace('#^/|/(?=/)|/$#', '', $dir) == str_replace('//', '/', trim($path, '/')) + $dirs = explode('/', preg_replace('#^/|/(?=/)|/$#', '', $path)); + + $temp = &$this->stat_cache; + $max = count($dirs) - 1; + foreach ($dirs as $i=>$dir) { + if (!isset($temp[$dir])) { + $temp[$dir] = array(); + } + if ($i === $max) { + $temp[$dir] = $value; + break; + } + $temp = &$temp[$dir]; + } + } + + /** + * Remove files / directories from cache + * + * @param String $path + * @return Boolean + * @access private + */ + function _remove_from_stat_cache($path) + { + $dirs = explode('/', preg_replace('#^/|/(?=/)|/$#', '', $path)); + + $temp = &$this->stat_cache; + $max = count($dirs) - 1; + foreach ($dirs as $i=>$dir) { + if ($i === $max) { + unset($temp[$dir]); + return true; + } + if (!isset($temp[$dir])) { + return false; + } + $temp = &$temp[$dir]; + } + } + + /** + * Checks cache for path + * + * Mainly used by file_exists + * + * @param String $dir + * @return Mixed + * @access private + */ + function _query_stat_cache($path) + { + $dirs = explode('/', preg_replace('#^/|/(?=/)|/$#', '', $path)); + + $temp = &$this->stat_cache; + foreach ($dirs as $dir) { + if (!isset($temp[$dir])) { + return null; + } + $temp = &$temp[$dir]; + } + return $temp; + } + + /** + * Returns general information about a file. + * + * Returns an array on success and false otherwise. + * + * @param String $filename + * @return Mixed + * @access public + */ + function stat($filename) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $filename = $this->_realpath($filename); + if ($filename === false) { + return false; + } + + if ($this->use_stat_cache) { + $result = $this->_query_stat_cache($filename); + if (is_array($result) && isset($result['.'])) { + return (array) $result['.']; + } + if (is_object($result)) { + return (array) $result; + } + } + + $stat = $this->_stat($filename, NET_SFTP_STAT); + if ($stat === false) { + $this->_remove_from_stat_cache($filename); + return false; + } + if (isset($stat['type'])) { + if ($stat['type'] == NET_SFTP_TYPE_DIRECTORY) { + $filename.= '/.'; + } + $this->_update_stat_cache($filename, (object) $stat); + return $stat; + } + + $pwd = $this->pwd; + $stat['type'] = $this->chdir($filename) ? + NET_SFTP_TYPE_DIRECTORY : + NET_SFTP_TYPE_REGULAR; + $this->pwd = $pwd; + + if ($stat['type'] == NET_SFTP_TYPE_DIRECTORY) { + $filename.= '/.'; + } + $this->_update_stat_cache($filename, (object) $stat); + + return $stat; + } + + /** + * Returns general information about a file or symbolic link. + * + * Returns an array on success and false otherwise. + * + * @param String $filename + * @return Mixed + * @access public + */ + function lstat($filename) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $filename = $this->_realpath($filename); + if ($filename === false) { + return false; + } + + if ($this->use_stat_cache) { + $result = $this->_query_stat_cache($filename); + if (is_array($result) && isset($result['.'])) { + return (array) $result['.']; + } + if (is_object($result)) { + return (array) $result; + } + } + + $lstat = $this->_stat($filename, NET_SFTP_LSTAT); + if ($lstat === false) { + $this->_remove_from_stat_cache($filename); + return false; + } + if (isset($lstat['type'])) { + if ($lstat['type'] == NET_SFTP_TYPE_DIRECTORY) { + $filename.= '/.'; + } + $this->_update_stat_cache($filename, (object) $lstat); + return $lstat; + } + + $stat = $this->_stat($filename, NET_SFTP_STAT); + + if ($lstat != $stat) { + $lstat = array_merge($lstat, array('type' => NET_SFTP_TYPE_SYMLINK)); + $this->_update_stat_cache($filename, (object) $lstat); + return $stat; + } + + $pwd = $this->pwd; + $lstat['type'] = $this->chdir($filename) ? + NET_SFTP_TYPE_DIRECTORY : + NET_SFTP_TYPE_REGULAR; + $this->pwd = $pwd; + + if ($lstat['type'] == NET_SFTP_TYPE_DIRECTORY) { + $filename.= '/.'; + } + $this->_update_stat_cache($filename, (object) $lstat); + + return $lstat; + } + + /** + * Returns general information about a file or symbolic link + * + * Determines information without calling Net_SFTP::_realpath(). + * The second parameter can be either NET_SFTP_STAT or NET_SFTP_LSTAT. + * + * @param String $filename + * @param Integer $type + * @return Mixed + * @access private + */ + function _stat($filename, $type) + { + // SFTPv4+ adds an additional 32-bit integer field - flags - to the following: + $packet = pack('Na*', strlen($filename), $filename); + if (!$this->_send_sftp_packet($type, $packet)) { + return false; + } + + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_ATTRS: + return $this->_parseAttributes($response); + case NET_SFTP_STATUS: + $this->_logError($response); + return false; + } + + user_error('Expected SSH_FXP_ATTRS or SSH_FXP_STATUS'); + return false; + } + + /** + * Truncates a file to a given length + * + * @param String $filename + * @param Integer $new_size + * @return Boolean + * @access public + */ + function truncate($filename, $new_size) + { + $attr = pack('N3', NET_SFTP_ATTR_SIZE, $new_size / 4294967296, $new_size); // 4294967296 == 0x100000000 == 1<<32 + + return $this->_setstat($filename, $attr, false); + } + + /** + * Sets access and modification time of file. + * + * If the file does not exist, it will be created. + * + * @param String $filename + * @param optional Integer $time + * @param optional Integer $atime + * @return Boolean + * @access public + */ + function touch($filename, $time = null, $atime = null) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $filename = $this->_realpath($filename); + if ($filename === false) { + return false; + } + + if (!isset($time)) { + $time = time(); + } + if (!isset($atime)) { + $atime = $time; + } + + $flags = NET_SFTP_OPEN_WRITE | NET_SFTP_OPEN_CREATE | NET_SFTP_OPEN_EXCL; + $attr = pack('N3', NET_SFTP_ATTR_ACCESSTIME, $time, $atime); + $packet = pack('Na*Na*', strlen($filename), $filename, $flags, $attr); + if (!$this->_send_sftp_packet(NET_SFTP_OPEN, $packet)) { + return false; + } + + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_HANDLE: + return $this->_close_handle(substr($response, 4)); + case NET_SFTP_STATUS: + $this->_logError($response); + break; + default: + user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); + return false; + } + + return $this->_setstat($filename, $attr, false); + } + + /** + * Changes file or directory owner + * + * Returns true on success or false on error. + * + * @param String $filename + * @param Integer $uid + * @param optional Boolean $recursive + * @return Boolean + * @access public + */ + function chown($filename, $uid, $recursive = false) + { + // quoting from , + // "if the owner or group is specified as -1, then that ID is not changed" + $attr = pack('N3', NET_SFTP_ATTR_UIDGID, $uid, -1); + + return $this->_setstat($filename, $attr, $recursive); + } + + /** + * Changes file or directory group + * + * Returns true on success or false on error. + * + * @param String $filename + * @param Integer $gid + * @param optional Boolean $recursive + * @return Boolean + * @access public + */ + function chgrp($filename, $gid, $recursive = false) + { + $attr = pack('N3', NET_SFTP_ATTR_UIDGID, -1, $gid); + + return $this->_setstat($filename, $attr, $recursive); + } + + /** + * Set permissions on a file. + * + * Returns the new file permissions on success or false on error. + * If $recursive is true than this just returns true or false. + * + * @param Integer $mode + * @param String $filename + * @param optional Boolean $recursive + * @return Mixed + * @access public + */ + function chmod($mode, $filename, $recursive = false) + { + if (is_string($mode) && is_int($filename)) { + $temp = $mode; + $mode = $filename; + $filename = $temp; + } + + $attr = pack('N2', NET_SFTP_ATTR_PERMISSIONS, $mode & 07777); + if (!$this->_setstat($filename, $attr, $recursive)) { + return false; + } + if ($recursive) { + return true; + } + + // rather than return what the permissions *should* be, we'll return what they actually are. this will also + // tell us if the file actually exists. + // incidentally, SFTPv4+ adds an additional 32-bit integer field - flags - to the following: + $packet = pack('Na*', strlen($filename), $filename); + if (!$this->_send_sftp_packet(NET_SFTP_STAT, $packet)) { + return false; + } + + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_ATTRS: + $attrs = $this->_parseAttributes($response); + return $attrs['permissions']; + case NET_SFTP_STATUS: + $this->_logError($response); + return false; + } + + user_error('Expected SSH_FXP_ATTRS or SSH_FXP_STATUS'); + return false; + } + + /** + * Sets information about a file + * + * @param String $filename + * @param String $attr + * @param Boolean $recursive + * @return Boolean + * @access private + */ + function _setstat($filename, $attr, $recursive) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $filename = $this->_realpath($filename); + if ($filename === false) { + return false; + } + + $this->_remove_from_stat_cache($filename); + + if ($recursive) { + $i = 0; + $result = $this->_setstat_recursive($filename, $attr, $i); + $this->_read_put_responses($i); + return $result; + } + + // SFTPv4+ has an additional byte field - type - that would need to be sent, as well. setting it to + // SSH_FILEXFER_TYPE_UNKNOWN might work. if not, we'd have to do an SSH_FXP_STAT before doing an SSH_FXP_SETSTAT. + if (!$this->_send_sftp_packet(NET_SFTP_SETSTAT, pack('Na*a*', strlen($filename), $filename, $attr))) { + return false; + } + + /* + "Because some systems must use separate system calls to set various attributes, it is possible that a failure + response will be returned, but yet some of the attributes may be have been successfully modified. If possible, + servers SHOULD avoid this situation; however, clients MUST be aware that this is possible." + + -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.6 + */ + $response = $this->_get_sftp_packet(); + if ($this->packet_type != NET_SFTP_STATUS) { + user_error('Expected SSH_FXP_STATUS'); + return false; + } + + extract(unpack('Nstatus', $this->_string_shift($response, 4))); + if ($status != NET_SFTP_STATUS_OK) { + $this->_logError($response, $status); + return false; + } + + return true; + } + + /** + * Recursively sets information on directories on the SFTP server + * + * Minimizes directory lookups and SSH_FXP_STATUS requests for speed. + * + * @param String $path + * @param String $attr + * @param Integer $i + * @return Boolean + * @access private + */ + function _setstat_recursive($path, $attr, &$i) + { + if (!$this->_read_put_responses($i)) { + return false; + } + $i = 0; + $entries = $this->_list($path, true); + + if ($entries === false) { + return $this->_setstat($path, $attr, false); + } + + // normally $entries would have at least . and .. but it might not if the directories + // permissions didn't allow reading + if (empty($entries)) { + return false; + } + + unset($entries['.'], $entries['..']); + foreach ($entries as $filename=>$props) { + if (!isset($props['type'])) { + return false; + } + + $temp = $path . '/' . $filename; + if ($props['type'] == NET_SFTP_TYPE_DIRECTORY) { + if (!$this->_setstat_recursive($temp, $attr, $i)) { + return false; + } + } else { + if (!$this->_send_sftp_packet(NET_SFTP_SETSTAT, pack('Na*a*', strlen($temp), $temp, $attr))) { + return false; + } + + $i++; + + if ($i >= NET_SFTP_QUEUE_SIZE) { + if (!$this->_read_put_responses($i)) { + return false; + } + $i = 0; + } + } + } + + if (!$this->_send_sftp_packet(NET_SFTP_SETSTAT, pack('Na*a*', strlen($path), $path, $attr))) { + return false; + } + + $i++; + + if ($i >= NET_SFTP_QUEUE_SIZE) { + if (!$this->_read_put_responses($i)) { + return false; + } + $i = 0; + } + + return true; + } + + /** + * Return the target of a symbolic link + * + * @param String $link + * @return Mixed + * @access public + */ + function readlink($link) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $link = $this->_realpath($link); + + if (!$this->_send_sftp_packet(NET_SFTP_READLINK, pack('Na*', strlen($link), $link))) { + return false; + } + + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_NAME: + break; + case NET_SFTP_STATUS: + $this->_logError($response); + return false; + default: + user_error('Expected SSH_FXP_NAME or SSH_FXP_STATUS'); + return false; + } + + extract(unpack('Ncount', $this->_string_shift($response, 4))); + // the file isn't a symlink + if (!$count) { + return false; + } + + extract(unpack('Nlength', $this->_string_shift($response, 4))); + return $this->_string_shift($response, $length); + } + + /** + * Create a symlink + * + * symlink() creates a symbolic link to the existing target with the specified name link. + * + * @param String $target + * @param String $link + * @return Boolean + * @access public + */ + function symlink($target, $link) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $target = $this->_realpath($target); + $link = $this->_realpath($link); + + $packet = pack('Na*Na*', strlen($target), $target, strlen($link), $link); + if (!$this->_send_sftp_packet(NET_SFTP_SYMLINK, $packet)) { + return false; + } + + $response = $this->_get_sftp_packet(); + if ($this->packet_type != NET_SFTP_STATUS) { + user_error('Expected SSH_FXP_STATUS'); + return false; + } + + extract(unpack('Nstatus', $this->_string_shift($response, 4))); + if ($status != NET_SFTP_STATUS_OK) { + $this->_logError($response, $status); + return false; + } + + return true; + } + + /** + * Creates a directory. + * + * @param String $dir + * @return Boolean + * @access public + */ + function mkdir($dir, $mode = -1, $recursive = false) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $dir = $this->_realpath($dir); + // by not providing any permissions, hopefully the server will use the logged in users umask - their + // default permissions. + $attr = $mode == -1 ? "\0\0\0\0" : pack('N2', NET_SFTP_ATTR_PERMISSIONS, $mode & 07777); + + if ($recursive) { + $dirs = explode('/', preg_replace('#/(?=/)|/$#', '', $dir)); + if (empty($dirs[0])) { + array_shift($dirs); + $dirs[0] = '/' . $dirs[0]; + } + for ($i = 0; $i < count($dirs); $i++) { + $temp = array_slice($dirs, 0, $i + 1); + $temp = implode('/', $temp); + $result = $this->_mkdir_helper($temp, $attr); + } + return $result; + } + + return $this->_mkdir_helper($dir, $attr); + } + + /** + * Helper function for directory creation + * + * @param String $dir + * @return Boolean + * @access private + */ + function _mkdir_helper($dir, $attr) + { + if (!$this->_send_sftp_packet(NET_SFTP_MKDIR, pack('Na*a*', strlen($dir), $dir, $attr))) { + return false; + } + + $response = $this->_get_sftp_packet(); + if ($this->packet_type != NET_SFTP_STATUS) { + user_error('Expected SSH_FXP_STATUS'); + return false; + } + + extract(unpack('Nstatus', $this->_string_shift($response, 4))); + if ($status != NET_SFTP_STATUS_OK) { + $this->_logError($response, $status); + return false; + } + + return true; + } + + /** + * Removes a directory. + * + * @param String $dir + * @return Boolean + * @access public + */ + function rmdir($dir) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $dir = $this->_realpath($dir); + if ($dir === false) { + return false; + } + + if (!$this->_send_sftp_packet(NET_SFTP_RMDIR, pack('Na*', strlen($dir), $dir))) { + return false; + } + + $response = $this->_get_sftp_packet(); + if ($this->packet_type != NET_SFTP_STATUS) { + user_error('Expected SSH_FXP_STATUS'); + return false; + } + + extract(unpack('Nstatus', $this->_string_shift($response, 4))); + if ($status != NET_SFTP_STATUS_OK) { + // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED? + $this->_logError($response, $status); + return false; + } + + $this->_remove_from_stat_cache($dir); + // the following will do a soft delete, which would be useful if you deleted a file + // and then tried to do a stat on the deleted file. the above, in contrast, does + // a hard delete + //$this->_update_stat_cache($dir, false); + + return true; + } + + /** + * Uploads a file to the SFTP server. + * + * By default, Net_SFTP::put() does not read from the local filesystem. $data is dumped directly into $remote_file. + * So, for example, if you set $data to 'filename.ext' and then do Net_SFTP::get(), you will get a file, twelve bytes + * long, containing 'filename.ext' as its contents. + * + * Setting $mode to NET_SFTP_LOCAL_FILE will change the above behavior. With NET_SFTP_LOCAL_FILE, $remote_file will + * contain as many bytes as filename.ext does on your local filesystem. If your filename.ext is 1MB then that is how + * large $remote_file will be, as well. + * + * If $data is a resource then it'll be used as a resource instead. + * + * Currently, only binary mode is supported. As such, if the line endings need to be adjusted, you will need to take + * care of that, yourself. + * + * $mode can take an additional two parameters - NET_SFTP_RESUME and NET_SFTP_RESUME_START. These are bitwise AND'd with + * $mode. So if you want to resume upload of a 300mb file on the local file system you'd set $mode to the following: + * + * NET_SFTP_LOCAL_FILE | NET_SFTP_RESUME + * + * If you wanted to simply append the full contents of a local file to the full contents of a remote file you'd replace + * NET_SFTP_RESUME with NET_SFTP_RESUME_START. + * + * If $mode & (NET_SFTP_RESUME | NET_SFTP_RESUME_START) then NET_SFTP_RESUME_START will be assumed. + * + * $start and $local_start give you more fine grained control over this process and take precident over NET_SFTP_RESUME + * when they're non-negative. ie. $start could let you write at the end of a file (like NET_SFTP_RESUME) or in the middle + * of one. $local_start could let you start your reading from the end of a file (like NET_SFTP_RESUME_START) or in the + * middle of one. + * + * Setting $local_start to > 0 or $mode | NET_SFTP_RESUME_START doesn't do anything unless $mode | NET_SFTP_LOCAL_FILE. + * + * @param String $remote_file + * @param String|resource $data + * @param optional Integer $mode + * @param optional Integer $start + * @param optional Integer $local_start + * @return Boolean + * @access public + * @internal ASCII mode for SFTPv4/5/6 can be supported by adding a new function - Net_SFTP::setMode(). + */ + function put($remote_file, $data, $mode = NET_SFTP_STRING, $start = -1, $local_start = -1) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $remote_file = $this->_realpath($remote_file); + if ($remote_file === false) { + return false; + } + + $this->_remove_from_stat_cache($remote_file); + + $flags = NET_SFTP_OPEN_WRITE | NET_SFTP_OPEN_CREATE; + // according to the SFTP specs, NET_SFTP_OPEN_APPEND should "force all writes to append data at the end of the file." + // in practice, it doesn't seem to do that. + //$flags|= ($mode & NET_SFTP_RESUME) ? NET_SFTP_OPEN_APPEND : NET_SFTP_OPEN_TRUNCATE; + + if ($start >= 0) { + $offset = $start; + } elseif ($mode & NET_SFTP_RESUME) { + // if NET_SFTP_OPEN_APPEND worked as it should _size() wouldn't need to be called + $size = $this->size($remote_file); + $offset = $size !== false ? $size : 0; + } else { + $offset = 0; + $flags|= NET_SFTP_OPEN_TRUNCATE; + } + + $packet = pack('Na*N2', strlen($remote_file), $remote_file, $flags, 0); + if (!$this->_send_sftp_packet(NET_SFTP_OPEN, $packet)) { + return false; + } + + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_HANDLE: + $handle = substr($response, 4); + break; + case NET_SFTP_STATUS: + $this->_logError($response); + return false; + default: + user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); + return false; + } + + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.2.3 + switch (true) { + case is_resource($data): + $mode = $mode & ~NET_SFTP_LOCAL_FILE; + $fp = $data; + break; + case $mode & NET_SFTP_LOCAL_FILE: + if (!is_file($data)) { + user_error("$data is not a valid file"); + return false; + } + $fp = @fopen($data, 'rb'); + if (!$fp) { + return false; + } + } + + if (isset($fp)) { + $stat = fstat($fp); + $size = $stat['size']; + + if ($local_start >= 0) { + fseek($fp, $local_start); + } elseif ($mode & NET_SFTP_RESUME_START) { + // do nothing + } else { + fseek($fp, $offset); + } + } else { + $size = strlen($data); + } + + $sent = 0; + $size = $size < 0 ? ($size & 0x7FFFFFFF) + 0x80000000 : $size; + + $sftp_packet_size = 4096; // PuTTY uses 4096 + // make the SFTP packet be exactly 4096 bytes by including the bytes in the NET_SFTP_WRITE packets "header" + $sftp_packet_size-= strlen($handle) + 25; + $i = 0; + while ($sent < $size) { + $temp = isset($fp) ? fread($fp, $sftp_packet_size) : substr($data, $sent, $sftp_packet_size); + $subtemp = $offset + $sent; + $packet = pack('Na*N3a*', strlen($handle), $handle, $subtemp / 4294967296, $subtemp, strlen($temp), $temp); + if (!$this->_send_sftp_packet(NET_SFTP_WRITE, $packet)) { + if ($mode & NET_SFTP_LOCAL_FILE) { + fclose($fp); + } + return false; + } + $sent+= strlen($temp); + + $i++; + + if ($i == NET_SFTP_QUEUE_SIZE) { + if (!$this->_read_put_responses($i)) { + $i = 0; + break; + } + $i = 0; + } + } + + if (!$this->_read_put_responses($i)) { + if ($mode & NET_SFTP_LOCAL_FILE) { + fclose($fp); + } + $this->_close_handle($handle); + return false; + } + + if ($mode & NET_SFTP_LOCAL_FILE) { + fclose($fp); + } + + return $this->_close_handle($handle); + } + + /** + * Reads multiple successive SSH_FXP_WRITE responses + * + * Sending an SSH_FXP_WRITE packet and immediately reading its response isn't as efficient as blindly sending out $i + * SSH_FXP_WRITEs, in succession, and then reading $i responses. + * + * @param Integer $i + * @return Boolean + * @access private + */ + function _read_put_responses($i) + { + while ($i--) { + $response = $this->_get_sftp_packet(); + if ($this->packet_type != NET_SFTP_STATUS) { + user_error('Expected SSH_FXP_STATUS'); + return false; + } + + extract(unpack('Nstatus', $this->_string_shift($response, 4))); + if ($status != NET_SFTP_STATUS_OK) { + $this->_logError($response, $status); + break; + } + } + + return $i < 0; + } + + /** + * Close handle + * + * @param String $handle + * @return Boolean + * @access private + */ + function _close_handle($handle) + { + if (!$this->_send_sftp_packet(NET_SFTP_CLOSE, pack('Na*', strlen($handle), $handle))) { + return false; + } + + // "The client MUST release all resources associated with the handle regardless of the status." + // -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.1.3 + $response = $this->_get_sftp_packet(); + if ($this->packet_type != NET_SFTP_STATUS) { + user_error('Expected SSH_FXP_STATUS'); + return false; + } + + extract(unpack('Nstatus', $this->_string_shift($response, 4))); + if ($status != NET_SFTP_STATUS_OK) { + $this->_logError($response, $status); + return false; + } + + return true; + } + + /** + * Downloads a file from the SFTP server. + * + * Returns a string containing the contents of $remote_file if $local_file is left undefined or a boolean false if + * the operation was unsuccessful. If $local_file is defined, returns true or false depending on the success of the + * operation. + * + * $offset and $length can be used to download files in chunks. + * + * @param String $remote_file + * @param optional String $local_file + * @param optional Integer $offset + * @param optional Integer $length + * @return Mixed + * @access public + */ + function get($remote_file, $local_file = false, $offset = 0, $length = -1) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $remote_file = $this->_realpath($remote_file); + if ($remote_file === false) { + return false; + } + + $packet = pack('Na*N2', strlen($remote_file), $remote_file, NET_SFTP_OPEN_READ, 0); + if (!$this->_send_sftp_packet(NET_SFTP_OPEN, $packet)) { + return false; + } + + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_HANDLE: + $handle = substr($response, 4); + break; + case NET_SFTP_STATUS: // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED + $this->_logError($response); + return false; + default: + user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); + return false; + } + + if (is_resource($local_file)) { + $fp = $local_file; + $stat = fstat($fp); + $res_offset = $stat['size']; + } else { + $res_offset = 0; + if ($local_file !== false) { + $fp = fopen($local_file, 'wb'); + if (!$fp) { + return false; + } + } else { + $content = ''; + } + } + + $fclose_check = $local_file !== false && !is_resource($local_file); + + $start = $offset; + $size = $this->max_sftp_packet < $length || $length < 0 ? $this->max_sftp_packet : $length; + while (true) { + $packet = pack('Na*N3', strlen($handle), $handle, $offset / 4294967296, $offset, $size); + if (!$this->_send_sftp_packet(NET_SFTP_READ, $packet)) { + if ($fclose_check) { + fclose($fp); + } + return false; + } + + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_DATA: + $temp = substr($response, 4); + $offset+= strlen($temp); + if ($local_file === false) { + $content.= $temp; + } else { + fputs($fp, $temp); + } + break; + case NET_SFTP_STATUS: + // could, in theory, return false if !strlen($content) but we'll hold off for the time being + $this->_logError($response); + break 2; + default: + user_error('Expected SSH_FXP_DATA or SSH_FXP_STATUS'); + if ($fclose_check) { + fclose($fp); + } + return false; + } + + if ($length > 0 && $length <= $offset - $start) { + break; + } + } + + if ($length > 0 && $length <= $offset - $start) { + if ($local_file === false) { + $content = substr($content, 0, $length); + } else { + ftruncate($fp, $length + $res_offset); + } + } + + if ($fclose_check) { + fclose($fp); + } + + if (!$this->_close_handle($handle)) { + return false; + } + + // if $content isn't set that means a file was written to + return isset($content) ? $content : true; + } + + /** + * Deletes a file on the SFTP server. + * + * @param String $path + * @param Boolean $recursive + * @return Boolean + * @access public + */ + function delete($path, $recursive = true) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $path = $this->_realpath($path); + if ($path === false) { + return false; + } + + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.3 + if (!$this->_send_sftp_packet(NET_SFTP_REMOVE, pack('Na*', strlen($path), $path))) { + return false; + } + + $response = $this->_get_sftp_packet(); + if ($this->packet_type != NET_SFTP_STATUS) { + user_error('Expected SSH_FXP_STATUS'); + return false; + } + + // if $status isn't SSH_FX_OK it's probably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED + extract(unpack('Nstatus', $this->_string_shift($response, 4))); + if ($status != NET_SFTP_STATUS_OK) { + $this->_logError($response, $status); + if (!$recursive) { + return false; + } + $i = 0; + $result = $this->_delete_recursive($path, $i); + $this->_read_put_responses($i); + return $result; + } + + $this->_remove_from_stat_cache($path); + + return true; + } + + /** + * Recursively deletes directories on the SFTP server + * + * Minimizes directory lookups and SSH_FXP_STATUS requests for speed. + * + * @param String $path + * @param Integer $i + * @return Boolean + * @access private + */ + function _delete_recursive($path, &$i) + { + if (!$this->_read_put_responses($i)) { + return false; + } + $i = 0; + $entries = $this->_list($path, true); + + // normally $entries would have at least . and .. but it might not if the directories + // permissions didn't allow reading + if (empty($entries)) { + return false; + } + + unset($entries['.'], $entries['..']); + foreach ($entries as $filename=>$props) { + if (!isset($props['type'])) { + return false; + } + + $temp = $path . '/' . $filename; + if ($props['type'] == NET_SFTP_TYPE_DIRECTORY) { + if (!$this->_delete_recursive($temp, $i)) { + return false; + } + } else { + if (!$this->_send_sftp_packet(NET_SFTP_REMOVE, pack('Na*', strlen($temp), $temp))) { + return false; + } + + $i++; + + if ($i >= NET_SFTP_QUEUE_SIZE) { + if (!$this->_read_put_responses($i)) { + return false; + } + $i = 0; + } + } + $this->_remove_from_stat_cache($path); + } + + if (!$this->_send_sftp_packet(NET_SFTP_RMDIR, pack('Na*', strlen($path), $path))) { + return false; + } + + $i++; + + if ($i >= NET_SFTP_QUEUE_SIZE) { + if (!$this->_read_put_responses($i)) { + return false; + } + $i = 0; + } + + return true; + } + + /** + * Checks whether a file or directory exists + * + * @param String $path + * @return Boolean + * @access public + */ + function file_exists($path) + { + if ($this->use_stat_cache) { + $path = $this->_realpath($path); + + $result = $this->_query_stat_cache($path); + + if (isset($result)) { + // return true if $result is an array or if it's an stdClass object + return $result !== false; + } + } + + return $this->stat($path) !== false; + } + + /** + * Tells whether the filename is a directory + * + * @param String $path + * @return Boolean + * @access public + */ + function is_dir($path) + { + $result = $this->_get_stat_cache_prop($path, 'type'); + if ($result === false) { + return false; + } + return $result === NET_SFTP_TYPE_DIRECTORY; + } + + /** + * Tells whether the filename is a regular file + * + * @param String $path + * @return Boolean + * @access public + */ + function is_file($path) + { + $result = $this->_get_stat_cache_prop($path, 'type'); + if ($result === false) { + return false; + } + return $result === NET_SFTP_TYPE_REGULAR; + } + + /** + * Tells whether the filename is a symbolic link + * + * @param String $path + * @return Boolean + * @access public + */ + function is_link($path) + { + $result = $this->_get_stat_cache_prop($path, 'type'); + if ($result === false) { + return false; + } + return $result === NET_SFTP_TYPE_SYMLINK; + } + + /** + * Gets last access time of file + * + * @param String $path + * @return Mixed + * @access public + */ + function fileatime($path) + { + return $this->_get_stat_cache_prop($path, 'atime'); + } + + /** + * Gets file modification time + * + * @param String $path + * @return Mixed + * @access public + */ + function filemtime($path) + { + return $this->_get_stat_cache_prop($path, 'mtime'); + } + + /** + * Gets file permissions + * + * @param String $path + * @return Mixed + * @access public + */ + function fileperms($path) + { + return $this->_get_stat_cache_prop($path, 'permissions'); + } + + /** + * Gets file owner + * + * @param String $path + * @return Mixed + * @access public + */ + function fileowner($path) + { + return $this->_get_stat_cache_prop($path, 'uid'); + } + + /** + * Gets file group + * + * @param String $path + * @return Mixed + * @access public + */ + function filegroup($path) + { + return $this->_get_stat_cache_prop($path, 'gid'); + } + + /** + * Gets file size + * + * @param String $path + * @return Mixed + * @access public + */ + function filesize($path) + { + return $this->_get_stat_cache_prop($path, 'size'); + } + + /** + * Gets file type + * + * @param String $path + * @return Mixed + * @access public + */ + function filetype($path) + { + $type = $this->_get_stat_cache_prop($path, 'type'); + if ($type === false) { + return false; + } + + switch ($type) { + case NET_SFTP_TYPE_BLOCK_DEVICE: return 'block'; + case NET_SFTP_TYPE_CHAR_DEVICE: return 'char'; + case NET_SFTP_TYPE_DIRECTORY: return 'dir'; + case NET_SFTP_TYPE_FIFO: return 'fifo'; + case NET_SFTP_TYPE_REGULAR: return 'file'; + case NET_SFTP_TYPE_SYMLINK: return 'link'; + default: return false; + } + } + + /** + * Return a stat properity + * + * Uses cache if appropriate. + * + * @param String $path + * @param String $prop + * @return Mixed + * @access private + */ + function _get_stat_cache_prop($path, $prop) + { + if ($this->use_stat_cache) { + $path = $this->_realpath($path); + + $result = $this->_query_stat_cache($path); + + if (is_object($result) && isset($result->$prop)) { + return $result->$prop; + } + } + + $result = $this->stat($path); + + if ($result === false || !isset($result[$prop])) { + return false; + } + + return $result[$prop]; + } + + /** + * Renames a file or a directory on the SFTP server + * + * @param String $oldname + * @param String $newname + * @return Boolean + * @access public + */ + function rename($oldname, $newname) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $oldname = $this->_realpath($oldname); + $newname = $this->_realpath($newname); + if ($oldname === false || $newname === false) { + return false; + } + + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.3 + $packet = pack('Na*Na*', strlen($oldname), $oldname, strlen($newname), $newname); + if (!$this->_send_sftp_packet(NET_SFTP_RENAME, $packet)) { + return false; + } + + $response = $this->_get_sftp_packet(); + if ($this->packet_type != NET_SFTP_STATUS) { + user_error('Expected SSH_FXP_STATUS'); + return false; + } + + // if $status isn't SSH_FX_OK it's probably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED + extract(unpack('Nstatus', $this->_string_shift($response, 4))); + if ($status != NET_SFTP_STATUS_OK) { + $this->_logError($response, $status); + return false; + } + + // don't move the stat cache entry over since this operation could very well change the + // atime and mtime attributes + //$this->_update_stat_cache($newname, $this->_query_stat_cache($oldname)); + $this->_remove_from_stat_cache($oldname); + $this->_remove_from_stat_cache($newname); + + return true; + } + + /** + * Parse Attributes + * + * See '7. File Attributes' of draft-ietf-secsh-filexfer-13 for more info. + * + * @param String $response + * @return Array + * @access private + */ + function _parseAttributes(&$response) + { + $attr = array(); + extract(unpack('Nflags', $this->_string_shift($response, 4))); + // SFTPv4+ have a type field (a byte) that follows the above flag field + foreach ($this->attributes as $key => $value) { + switch ($flags & $key) { + case NET_SFTP_ATTR_SIZE: // 0x00000001 + // The size attribute is defined as an unsigned 64-bit integer. + // The following will use floats on 32-bit platforms, if necessary. + // As can be seen in the BigInteger class, floats are generally + // IEEE 754 binary64 "double precision" on such platforms and + // as such can represent integers of at least 2^50 without loss + // of precision. Interpreted in filesize, 2^50 bytes = 1024 TiB. + $attr['size'] = hexdec(bin2hex($this->_string_shift($response, 8))); + break; + case NET_SFTP_ATTR_UIDGID: // 0x00000002 (SFTPv3 only) + $attr+= unpack('Nuid/Ngid', $this->_string_shift($response, 8)); + break; + case NET_SFTP_ATTR_PERMISSIONS: // 0x00000004 + $attr+= unpack('Npermissions', $this->_string_shift($response, 4)); + // mode == permissions; permissions was the original array key and is retained for bc purposes. + // mode was added because that's the more industry standard terminology + $attr+= array('mode' => $attr['permissions']); + $fileType = $this->_parseMode($attr['permissions']); + if ($fileType !== false) { + $attr+= array('type' => $fileType); + } + break; + case NET_SFTP_ATTR_ACCESSTIME: // 0x00000008 + $attr+= unpack('Natime/Nmtime', $this->_string_shift($response, 8)); + break; + case NET_SFTP_ATTR_EXTENDED: // 0x80000000 + extract(unpack('Ncount', $this->_string_shift($response, 4))); + for ($i = 0; $i < $count; $i++) { + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $key = $this->_string_shift($response, $length); + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $attr[$key] = $this->_string_shift($response, $length); + } + } + } + return $attr; + } + + /** + * Attempt to identify the file type + * + * Quoting the SFTP RFC, "Implementations MUST NOT send bits that are not defined" but they seem to anyway + * + * @param Integer $mode + * @return Integer + * @access private + */ + function _parseMode($mode) + { + // values come from http://lxr.free-electrons.com/source/include/uapi/linux/stat.h#L12 + // see, also, http://linux.die.net/man/2/stat + switch ($mode & 0170000) {// ie. 1111 0000 0000 0000 + case 0000000: // no file type specified - figure out the file type using alternative means + return false; + case 0040000: + return NET_SFTP_TYPE_DIRECTORY; + case 0100000: + return NET_SFTP_TYPE_REGULAR; + case 0120000: + return NET_SFTP_TYPE_SYMLINK; + // new types introduced in SFTPv5+ + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-05#section-5.2 + case 0010000: // named pipe (fifo) + return NET_SFTP_TYPE_FIFO; + case 0020000: // character special + return NET_SFTP_TYPE_CHAR_DEVICE; + case 0060000: // block special + return NET_SFTP_TYPE_BLOCK_DEVICE; + case 0140000: // socket + return NET_SFTP_TYPE_SOCKET; + case 0160000: // whiteout + // "SPECIAL should be used for files that are of + // a known type which cannot be expressed in the protocol" + return NET_SFTP_TYPE_SPECIAL; + default: + return NET_SFTP_TYPE_UNKNOWN; + } + } + + /** + * Parse Longname + * + * SFTPv3 doesn't provide any easy way of identifying a file type. You could try to open + * a file as a directory and see if an error is returned or you could try to parse the + * SFTPv3-specific longname field of the SSH_FXP_NAME packet. That's what this function does. + * The result is returned using the + * {@link http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-5.2 SFTPv4 type constants}. + * + * If the longname is in an unrecognized format bool(false) is returned. + * + * @param String $longname + * @return Mixed + * @access private + */ + function _parseLongname($longname) + { + // http://en.wikipedia.org/wiki/Unix_file_types + // http://en.wikipedia.org/wiki/Filesystem_permissions#Notation_of_traditional_Unix_permissions + if (preg_match('#^[^/]([r-][w-][xstST-]){3}#', $longname)) { + switch ($longname[0]) { + case '-': + return NET_SFTP_TYPE_REGULAR; + case 'd': + return NET_SFTP_TYPE_DIRECTORY; + case 'l': + return NET_SFTP_TYPE_SYMLINK; + default: + return NET_SFTP_TYPE_SPECIAL; + } + } + + return false; + } + + /** + * Sends SFTP Packets + * + * See '6. General Packet Format' of draft-ietf-secsh-filexfer-13 for more info. + * + * @param Integer $type + * @param String $data + * @see Net_SFTP::_get_sftp_packet() + * @see Net_SSH2::_send_channel_packet() + * @return Boolean + * @access private + */ + function _send_sftp_packet($type, $data) + { + $packet = $this->request_id !== false ? + pack('NCNa*', strlen($data) + 5, $type, $this->request_id, $data) : + pack('NCa*', strlen($data) + 1, $type, $data); + + $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 + $result = $this->_send_channel_packet(NET_SFTP_CHANNEL, $packet); + $stop = strtok(microtime(), ' ') + strtok(''); + + if (defined('NET_SFTP_LOGGING')) { + $packet_type = '-> ' . $this->packet_types[$type] . + ' (' . round($stop - $start, 4) . 's)'; + if (NET_SFTP_LOGGING == NET_SFTP_LOG_REALTIME) { + echo "
\r\n" . $this->_format_log(array($data), array($packet_type)) . "\r\n
\r\n"; + flush(); + ob_flush(); + } else { + $this->packet_type_log[] = $packet_type; + if (NET_SFTP_LOGGING == NET_SFTP_LOG_COMPLEX) { + $this->packet_log[] = $data; + } + } + } + + return $result; + } + + /** + * Receives SFTP Packets + * + * See '6. General Packet Format' of draft-ietf-secsh-filexfer-13 for more info. + * + * Incidentally, the number of SSH_MSG_CHANNEL_DATA messages has no bearing on the number of SFTP packets present. + * There can be one SSH_MSG_CHANNEL_DATA messages containing two SFTP packets or there can be two SSH_MSG_CHANNEL_DATA + * messages containing one SFTP packet. + * + * @see Net_SFTP::_send_sftp_packet() + * @return String + * @access private + */ + function _get_sftp_packet() + { + $this->curTimeout = false; + + $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 + + // SFTP packet length + while (strlen($this->packet_buffer) < 4) { + $temp = $this->_get_channel_packet(NET_SFTP_CHANNEL); + if (is_bool($temp)) { + $this->packet_type = false; + $this->packet_buffer = ''; + return false; + } + $this->packet_buffer.= $temp; + } + extract(unpack('Nlength', $this->_string_shift($this->packet_buffer, 4))); + $tempLength = $length; + $tempLength-= strlen($this->packet_buffer); + + // SFTP packet type and data payload + while ($tempLength > 0) { + $temp = $this->_get_channel_packet(NET_SFTP_CHANNEL); + if (is_bool($temp)) { + $this->packet_type = false; + $this->packet_buffer = ''; + return false; + } + $this->packet_buffer.= $temp; + $tempLength-= strlen($temp); + } + + $stop = strtok(microtime(), ' ') + strtok(''); + + $this->packet_type = ord($this->_string_shift($this->packet_buffer)); + + if ($this->request_id !== false) { + $this->_string_shift($this->packet_buffer, 4); // remove the request id + $length-= 5; // account for the request id and the packet type + } else { + $length-= 1; // account for the packet type + } + + $packet = $this->_string_shift($this->packet_buffer, $length); + + if (defined('NET_SFTP_LOGGING')) { + $packet_type = '<- ' . $this->packet_types[$this->packet_type] . + ' (' . round($stop - $start, 4) . 's)'; + if (NET_SFTP_LOGGING == NET_SFTP_LOG_REALTIME) { + echo "
\r\n" . $this->_format_log(array($packet), array($packet_type)) . "\r\n
\r\n"; + flush(); + ob_flush(); + } else { + $this->packet_type_log[] = $packet_type; + if (NET_SFTP_LOGGING == NET_SFTP_LOG_COMPLEX) { + $this->packet_log[] = $packet; + } + } + } + + return $packet; + } + + /** + * Returns a log of the packets that have been sent and received. + * + * Returns a string if NET_SFTP_LOGGING == NET_SFTP_LOG_COMPLEX, an array if NET_SFTP_LOGGING == NET_SFTP_LOG_SIMPLE and false if !defined('NET_SFTP_LOGGING') + * + * @access public + * @return String or Array + */ + function getSFTPLog() + { + if (!defined('NET_SFTP_LOGGING')) { + return false; + } + + switch (NET_SFTP_LOGGING) { + case NET_SFTP_LOG_COMPLEX: + return $this->_format_log($this->packet_log, $this->packet_type_log); + break; + //case NET_SFTP_LOG_SIMPLE: + default: + return $this->packet_type_log; + } + } + + /** + * Returns all errors + * + * @return String + * @access public + */ + function getSFTPErrors() + { + return $this->sftp_errors; + } + + /** + * Returns the last error + * + * @return String + * @access public + */ + function getLastSFTPError() + { + return count($this->sftp_errors) ? $this->sftp_errors[count($this->sftp_errors) - 1] : ''; + } + + /** + * Get supported SFTP versions + * + * @return Array + * @access public + */ + function getSupportedVersions() + { + $temp = array('version' => $this->version); + if (isset($this->extensions['versions'])) { + $temp['extensions'] = $this->extensions['versions']; + } + return $temp; + } + + /** + * Disconnect + * + * @param Integer $reason + * @return Boolean + * @access private + */ + function _disconnect($reason) + { + $this->pwd = false; + parent::_disconnect($reason); + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SFTP/Stream.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SFTP/Stream.php new file mode 100755 index 00000000..eda1cdba --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SFTP/Stream.php @@ -0,0 +1,801 @@ + + * @copyright 2013 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * SFTP Stream Wrapper + * + * @package Net_SFTP_Stream + * @author Jim Wigginton + * @access public + */ +class Net_SFTP_Stream +{ + /** + * SFTP instances + * + * Rather than re-create the connection we re-use instances if possible + * + * @var Array + */ + static $instances; + + /** + * SFTP instance + * + * @var Object + * @access private + */ + var $sftp; + + /** + * Path + * + * @var String + * @access private + */ + var $path; + + /** + * Mode + * + * @var String + * @access private + */ + var $mode; + + /** + * Position + * + * @var Integer + * @access private + */ + var $pos; + + /** + * Size + * + * @var Integer + * @access private + */ + var $size; + + /** + * Directory entries + * + * @var Array + * @access private + */ + var $entries; + + /** + * EOF flag + * + * @var Boolean + * @access private + */ + var $eof; + + /** + * Context resource + * + * Technically this needs to be publically accessible so PHP can set it directly + * + * @var Resource + * @access public + */ + var $context; + + /** + * Notification callback function + * + * @var Callable + * @access public + */ + var $notification; + + /** + * Registers this class as a URL wrapper. + * + * @param optional String $protocol The wrapper name to be registered. + * @return Boolean True on success, false otherwise. + * @access public + */ + static function register($protocol = 'sftp') + { + if (in_array($protocol, stream_get_wrappers(), true)) { + return false; + } + $class = function_exists('get_called_class') ? get_called_class() : __CLASS__; + return stream_wrapper_register($protocol, $class); + } + + /** + * The Constructor + * + * @access public + */ + function Net_SFTP_Stream() + { + if (defined('NET_SFTP_STREAM_LOGGING')) { + echo "__construct()\r\n"; + } + + if (!class_exists('Net_SFTP')) { + include_once 'Net/SFTP.php'; + } + } + + /** + * Path Parser + * + * Extract a path from a URI and actually connect to an SSH server if appropriate + * + * If "notification" is set as a context parameter the message code for successful login is + * NET_SSH2_MSG_USERAUTH_SUCCESS. For a failed login it's NET_SSH2_MSG_USERAUTH_FAILURE. + * + * @param String $path + * @return String + * @access private + */ + function _parse_path($path) + { + extract(parse_url($path) + array('port' => 22)); + + if (!isset($host)) { + return false; + } + + if (isset($this->context)) { + $context = stream_context_get_params($this->context); + if (isset($context['notification'])) { + $this->notification = $context['notification']; + } + } + + if ($host[0] == '$') { + $host = substr($host, 1); + global $$host; + if (!is_object($$host) || get_class($$host) != 'Net_SFTP') { + return false; + } + $this->sftp = $$host; + } else { + if (isset($this->context)) { + $context = stream_context_get_options($this->context); + } + if (isset($context[$scheme]['session'])) { + $sftp = $context[$scheme]['session']; + } + if (isset($context[$scheme]['sftp'])) { + $sftp = $context[$scheme]['sftp']; + } + if (isset($sftp) && is_object($sftp) && get_class($sftp) == 'Net_SFTP') { + $this->sftp = $sftp; + return $path; + } + if (isset($context[$scheme]['username'])) { + $user = $context[$scheme]['username']; + } + if (isset($context[$scheme]['password'])) { + $pass = $context[$scheme]['password']; + } + if (isset($context[$scheme]['privkey']) && is_object($context[$scheme]['privkey']) && get_Class($context[$scheme]['privkey']) == 'Crypt_RSA') { + $pass = $context[$scheme]['privkey']; + } + + if (!isset($user) || !isset($pass)) { + return false; + } + + // casting $pass to a string is necessary in the event that it's a Crypt_RSA object + if (isset(self::$instances[$host][$port][$user][(string) $pass])) { + $this->sftp = self::$instances[$host][$port][$user][(string) $pass]; + } else { + $this->sftp = new Net_SFTP($host, $port); + $this->sftp->disableStatCache(); + if (isset($this->notification) && is_callable($this->notification)) { + /* if !is_callable($this->notification) we could do this: + + user_error('fopen(): failed to call user notifier', E_USER_WARNING); + + the ftp wrapper gives errors like that when the notifier isn't callable. + i've opted not to do that, however, since the ftp wrapper gives the line + on which the fopen occurred as the line number - not the line that the + user_error is on. + */ + call_user_func($this->notification, STREAM_NOTIFY_CONNECT, STREAM_NOTIFY_SEVERITY_INFO, '', 0, 0, 0); + call_user_func($this->notification, STREAM_NOTIFY_AUTH_REQUIRED, STREAM_NOTIFY_SEVERITY_INFO, '', 0, 0, 0); + if (!$this->sftp->login($user, $pass)) { + call_user_func($this->notification, STREAM_NOTIFY_AUTH_RESULT, STREAM_NOTIFY_SEVERITY_ERR, 'Login Failure', NET_SSH2_MSG_USERAUTH_FAILURE, 0, 0); + return false; + } + call_user_func($this->notification, STREAM_NOTIFY_AUTH_RESULT, STREAM_NOTIFY_SEVERITY_INFO, 'Login Success', NET_SSH2_MSG_USERAUTH_SUCCESS, 0, 0); + } else { + if (!$this->sftp->login($user, $pass)) { + return false; + } + } + self::$instances[$host][$port][$user][(string) $pass] = $this->sftp; + } + } + + return $path; + } + + /** + * Opens file or URL + * + * @param String $path + * @param String $mode + * @param Integer $options + * @param String $opened_path + * @return Boolean + * @access public + */ + function _stream_open($path, $mode, $options, &$opened_path) + { + $path = $this->_parse_path($path); + + if ($path === false) { + return false; + } + $this->path = $path; + + $this->size = $this->sftp->size($path); + $this->mode = preg_replace('#[bt]$#', '', $mode); + $this->eof = false; + + if ($this->size === false) { + if ($this->mode[0] == 'r') { + return false; + } + } else { + switch ($this->mode[0]) { + case 'x': + return false; + case 'w': + case 'c': + $this->sftp->truncate($path, 0); + } + } + + $this->pos = $this->mode[0] != 'a' ? 0 : $this->size; + + return true; + } + + /** + * Read from stream + * + * @param Integer $count + * @return Mixed + * @access public + */ + function _stream_read($count) + { + switch ($this->mode) { + case 'w': + case 'a': + case 'x': + case 'c': + return false; + } + + // commented out because some files - eg. /dev/urandom - will say their size is 0 when in fact it's kinda infinite + //if ($this->pos >= $this->size) { + // $this->eof = true; + // return false; + //} + + $result = $this->sftp->get($this->path, false, $this->pos, $count); + if (isset($this->notification) && is_callable($this->notification)) { + if ($result === false) { + call_user_func($this->notification, STREAM_NOTIFY_FAILURE, STREAM_NOTIFY_SEVERITY_ERR, $this->sftp->getLastSFTPError(), NET_SFTP_OPEN, 0, 0); + return 0; + } + // seems that PHP calls stream_read in 8k chunks + call_user_func($this->notification, STREAM_NOTIFY_PROGRESS, STREAM_NOTIFY_SEVERITY_INFO, '', 0, strlen($result), $this->size); + } + + if (empty($result)) { // ie. false or empty string + $this->eof = true; + return false; + } + $this->pos+= strlen($result); + + return $result; + } + + /** + * Write to stream + * + * @param String $data + * @return Mixed + * @access public + */ + function _stream_write($data) + { + switch ($this->mode) { + case 'r': + return false; + } + + $result = $this->sftp->put($this->path, $data, NET_SFTP_STRING, $this->pos); + if (isset($this->notification) && is_callable($this->notification)) { + if (!$result) { + call_user_func($this->notification, STREAM_NOTIFY_FAILURE, STREAM_NOTIFY_SEVERITY_ERR, $this->sftp->getLastSFTPError(), NET_SFTP_OPEN, 0, 0); + return 0; + } + // seems that PHP splits up strings into 8k blocks before calling stream_write + call_user_func($this->notification, STREAM_NOTIFY_PROGRESS, STREAM_NOTIFY_SEVERITY_INFO, '', 0, strlen($data), strlen($data)); + } + + if ($result === false) { + return false; + } + $this->pos+= strlen($data); + if ($this->pos > $this->size) { + $this->size = $this->pos; + } + $this->eof = false; + return strlen($data); + } + + /** + * Retrieve the current position of a stream + * + * @return Integer + * @access public + */ + function _stream_tell() + { + return $this->pos; + } + + /** + * Tests for end-of-file on a file pointer + * + * In my testing there are four classes functions that normally effect the pointer: + * fseek, fputs / fwrite, fgets / fread and ftruncate. + * + * Only fgets / fread, however, results in feof() returning true. do fputs($fp, 'aaa') on a blank file and feof() + * will return false. do fread($fp, 1) and feof() will then return true. do fseek($fp, 10) on ablank file and feof() + * will return false. do fread($fp, 1) and feof() will then return true. + * + * @return Boolean + * @access public + */ + function _stream_eof() + { + return $this->eof; + } + + /** + * Seeks to specific location in a stream + * + * @param Integer $offset + * @param Integer $whence + * @return Boolean + * @access public + */ + function _stream_seek($offset, $whence) + { + switch ($whence) { + case SEEK_SET: + if ($offset >= $this->size || $offset < 0) { + return false; + } + break; + case SEEK_CUR: + $offset+= $this->pos; + break; + case SEEK_END: + $offset+= $this->size; + } + + $this->pos = $offset; + $this->eof = false; + return true; + } + + /** + * Change stream options + * + * @param String $path + * @param Integer $option + * @param Mixed $var + * @return Boolean + * @access public + */ + function _stream_metadata($path, $option, $var) + { + $path = $this->_parse_path($path); + if ($path === false) { + return false; + } + + // stream_metadata was introduced in PHP 5.4.0 but as of 5.4.11 the constants haven't been defined + // see http://www.php.net/streamwrapper.stream-metadata and https://bugs.php.net/64246 + // and https://github.com/php/php-src/blob/master/main/php_streams.h#L592 + switch ($option) { + case 1: // PHP_STREAM_META_TOUCH + return $this->sftp->touch($path, $var[0], $var[1]); + case 2: // PHP_STREAM_OWNER_NAME + case 3: // PHP_STREAM_GROUP_NAME + return false; + case 4: // PHP_STREAM_META_OWNER + return $this->sftp->chown($path, $var); + case 5: // PHP_STREAM_META_GROUP + return $this->sftp->chgrp($path, $var); + case 6: // PHP_STREAM_META_ACCESS + return $this->sftp->chmod($path, $var) !== false; + } + } + + /** + * Retrieve the underlaying resource + * + * @param Integer $cast_as + * @return Resource + * @access public + */ + function _stream_cast($cast_as) + { + return $this->sftp->fsock; + } + + /** + * Advisory file locking + * + * @param Integer $operation + * @return Boolean + * @access public + */ + function _stream_lock($operation) + { + return false; + } + + /** + * Renames a file or directory + * + * Attempts to rename oldname to newname, moving it between directories if necessary. + * If newname exists, it will be overwritten. This is a departure from what Net_SFTP + * does. + * + * @param String $path_from + * @param String $path_to + * @return Boolean + * @access public + */ + function _rename($path_from, $path_to) + { + $path1 = parse_url($path_from); + $path2 = parse_url($path_to); + unset($path1['path'], $path2['path']); + if ($path1 != $path2) { + return false; + } + + $path_from = $this->_parse_path($path_from); + $path_to = parse_url($path_to); + if ($path_from == false) { + return false; + } + + $path_to = $path_to['path']; // the $component part of parse_url() was added in PHP 5.1.2 + // "It is an error if there already exists a file with the name specified by newpath." + // -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-02#section-6.5 + if (!$this->sftp->rename($path_from, $path_to)) { + if ($this->sftp->stat($path_to)) { + return $this->sftp->delete($path_to, true) && $this->sftp->rename($path_from, $path_to); + } + return false; + } + + return true; + } + + /** + * Open directory handle + * + * The only $options is "whether or not to enforce safe_mode (0x04)". Since safe mode was deprecated in 5.3 and + * removed in 5.4 I'm just going to ignore it. + * + * Also, nlist() is the best that this function is realistically going to be able to do. When an SFTP client + * sends a SSH_FXP_READDIR packet you don't generally get info on just one file but on multiple files. Quoting + * the SFTP specs: + * + * The SSH_FXP_NAME response has the following format: + * + * uint32 id + * uint32 count + * repeats count times: + * string filename + * string longname + * ATTRS attrs + * + * @param String $path + * @param Integer $options + * @return Boolean + * @access public + */ + function _dir_opendir($path, $options) + { + $path = $this->_parse_path($path); + if ($path === false) { + return false; + } + $this->pos = 0; + $this->entries = $this->sftp->nlist($path); + return $this->entries !== false; + } + + /** + * Read entry from directory handle + * + * @return Mixed + * @access public + */ + function _dir_readdir() + { + if (isset($this->entries[$this->pos])) { + return $this->entries[$this->pos++]; + } + return false; + } + + /** + * Rewind directory handle + * + * @return Boolean + * @access public + */ + function _dir_rewinddir() + { + $this->pos = 0; + return true; + } + + /** + * Close directory handle + * + * @return Boolean + * @access public + */ + function _dir_closedir() + { + return true; + } + + /** + * Create a directory + * + * Only valid $options is STREAM_MKDIR_RECURSIVE + * + * @param String $path + * @param Integer $mode + * @param Integer $options + * @return Boolean + * @access public + */ + function _mkdir($path, $mode, $options) + { + $path = $this->_parse_path($path); + if ($path === false) { + return false; + } + + return $this->sftp->mkdir($path, $mode, $options & STREAM_MKDIR_RECURSIVE); + } + + /** + * Removes a directory + * + * Only valid $options is STREAM_MKDIR_RECURSIVE per , however, + * does not have a $recursive parameter as mkdir() does so I don't know how + * STREAM_MKDIR_RECURSIVE is supposed to be set. Also, when I try it out with rmdir() I get 8 as + * $options. What does 8 correspond to? + * + * @param String $path + * @param Integer $mode + * @param Integer $options + * @return Boolean + * @access public + */ + function _rmdir($path, $options) + { + $path = $this->_parse_path($path); + if ($path === false) { + return false; + } + + return $this->sftp->rmdir($path); + } + + /** + * Flushes the output + * + * See . Always returns true because Net_SFTP doesn't cache stuff before writing + * + * @return Boolean + * @access public + */ + function _stream_flush() + { + return true; + } + + /** + * Retrieve information about a file resource + * + * @return Mixed + * @access public + */ + function _stream_stat() + { + $results = $this->sftp->stat($this->path); + if ($results === false) { + return false; + } + return $results; + } + + /** + * Delete a file + * + * @param String $path + * @return Boolean + * @access public + */ + function _unlink($path) + { + $path = $this->_parse_path($path); + if ($path === false) { + return false; + } + + return $this->sftp->delete($path, false); + } + + /** + * Retrieve information about a file + * + * Ignores the STREAM_URL_STAT_QUIET flag because the entirety of Net_SFTP_Stream is quiet by default + * might be worthwhile to reconstruct bits 12-16 (ie. the file type) if mode doesn't have them but we'll + * cross that bridge when and if it's reached + * + * @param String $path + * @param Integer $flags + * @return Mixed + * @access public + */ + function _url_stat($path, $flags) + { + $path = $this->_parse_path($path); + if ($path === false) { + return false; + } + + $results = $flags & STREAM_URL_STAT_LINK ? $this->sftp->lstat($path) : $this->sftp->stat($path); + if ($results === false) { + return false; + } + + return $results; + } + + /** + * Truncate stream + * + * @param Integer $new_size + * @return Boolean + * @access public + */ + function _stream_truncate($new_size) + { + if (!$this->sftp->truncate($this->path, $new_size)) { + return false; + } + + $this->eof = false; + $this->size = $new_size; + + return true; + } + + /** + * Change stream options + * + * STREAM_OPTION_WRITE_BUFFER isn't supported for the same reason stream_flush isn't. + * The other two aren't supported because of limitations in Net_SFTP. + * + * @param Integer $option + * @param Integer $arg1 + * @param Integer $arg2 + * @return Boolean + * @access public + */ + function _stream_set_option($option, $arg1, $arg2) + { + return false; + } + + /** + * Close an resource + * + * @access public + */ + function _stream_close() + { + } + + /** + * __call Magic Method + * + * When you're utilizing an SFTP stream you're not calling the methods in this class directly - PHP is calling them for you. + * Which kinda begs the question... what methods is PHP calling and what parameters is it passing to them? This function + * lets you figure that out. + * + * If NET_SFTP_STREAM_LOGGING is defined all calls will be output on the screen and then (regardless of whether or not + * NET_SFTP_STREAM_LOGGING is enabled) the parameters will be passed through to the appropriate method. + * + * @param String + * @param Array + * @return Mixed + * @access public + */ + function __call($name, $arguments) + { + if (defined('NET_SFTP_STREAM_LOGGING')) { + echo $name . '('; + $last = count($arguments) - 1; + foreach ($arguments as $i => $argument) { + var_export($argument); + if ($i != $last) { + echo ','; + } + } + echo ")\r\n"; + } + $name = '_' . $name; + if (!method_exists($this, $name)) { + return false; + } + return call_user_func_array(array($this, $name), $arguments); + } +} + +Net_SFTP_Stream::register(); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SSH1.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SSH1.php new file mode 100755 index 00000000..f1fae02b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SSH1.php @@ -0,0 +1,1651 @@ + + * login('username', 'password')) { + * exit('Login Failed'); + * } + * + * echo $ssh->exec('ls -la'); + * ?> + * + * + * Here's another short example: + * + * login('username', 'password')) { + * exit('Login Failed'); + * } + * + * echo $ssh->read('username@username:~$'); + * $ssh->write("ls -la\n"); + * echo $ssh->read('username@username:~$'); + * ?> + * + * + * More information on the SSHv1 specification can be found by reading + * {@link http://www.snailbook.com/docs/protocol-1.5.txt protocol-1.5.txt}. + * + * LICENSE: 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. + * + * @category Net + * @package Net_SSH1 + * @author Jim Wigginton + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/**#@+ + * Encryption Methods + * + * @see Net_SSH1::getSupportedCiphers() + * @access public + */ +/** + * No encryption + * + * Not supported. + */ +define('NET_SSH1_CIPHER_NONE', 0); +/** + * IDEA in CFB mode + * + * Not supported. + */ +define('NET_SSH1_CIPHER_IDEA', 1); +/** + * DES in CBC mode + */ +define('NET_SSH1_CIPHER_DES', 2); +/** + * Triple-DES in CBC mode + * + * All implementations are required to support this + */ +define('NET_SSH1_CIPHER_3DES', 3); +/** + * TRI's Simple Stream encryption CBC + * + * Not supported nor is it defined in the official SSH1 specs. OpenSSH, however, does define it (see cipher.h), + * although it doesn't use it (see cipher.c) + */ +define('NET_SSH1_CIPHER_BROKEN_TSS', 4); +/** + * RC4 + * + * Not supported. + * + * @internal According to the SSH1 specs: + * + * "The first 16 bytes of the session key are used as the key for + * the server to client direction. The remaining 16 bytes are used + * as the key for the client to server direction. This gives + * independent 128-bit keys for each direction." + * + * This library currently only supports encryption when the same key is being used for both directions. This is + * because there's only one $crypto object. Two could be added ($encrypt and $decrypt, perhaps). + */ +define('NET_SSH1_CIPHER_RC4', 5); +/** + * Blowfish + * + * Not supported nor is it defined in the official SSH1 specs. OpenSSH, however, defines it (see cipher.h) and + * uses it (see cipher.c) + */ +define('NET_SSH1_CIPHER_BLOWFISH', 6); +/**#@-*/ + +/**#@+ + * Authentication Methods + * + * @see Net_SSH1::getSupportedAuthentications() + * @access public + */ +/** + * .rhosts or /etc/hosts.equiv + */ +define('NET_SSH1_AUTH_RHOSTS', 1); +/** + * pure RSA authentication + */ +define('NET_SSH1_AUTH_RSA', 2); +/** + * password authentication + * + * This is the only method that is supported by this library. + */ +define('NET_SSH1_AUTH_PASSWORD', 3); +/** + * .rhosts with RSA host authentication + */ +define('NET_SSH1_AUTH_RHOSTS_RSA', 4); +/**#@-*/ + +/**#@+ + * Terminal Modes + * + * @link http://3sp.com/content/developer/maverick-net/docs/Maverick.SSH.PseudoTerminalModesMembers.html + * @access private + */ +define('NET_SSH1_TTY_OP_END', 0); +/**#@-*/ + +/** + * The Response Type + * + * @see Net_SSH1::_get_binary_packet() + * @access private + */ +define('NET_SSH1_RESPONSE_TYPE', 1); + +/** + * The Response Data + * + * @see Net_SSH1::_get_binary_packet() + * @access private + */ +define('NET_SSH1_RESPONSE_DATA', 2); + +/**#@+ + * Execution Bitmap Masks + * + * @see Net_SSH1::bitmap + * @access private + */ +define('NET_SSH1_MASK_CONSTRUCTOR', 0x00000001); +define('NET_SSH1_MASK_CONNECTED', 0x00000002); +define('NET_SSH1_MASK_LOGIN', 0x00000004); +define('NET_SSH1_MASK_SHELL', 0x00000008); +/**#@-*/ + +/**#@+ + * @access public + * @see Net_SSH1::getLog() + */ +/** + * Returns the message numbers + */ +define('NET_SSH1_LOG_SIMPLE', 1); +/** + * Returns the message content + */ +define('NET_SSH1_LOG_COMPLEX', 2); +/** + * Outputs the content real-time + */ +define('NET_SSH1_LOG_REALTIME', 3); +/** + * Dumps the content real-time to a file + */ +define('NET_SSH1_LOG_REALTIME_FILE', 4); +/**#@-*/ + +/**#@+ + * @access public + * @see Net_SSH1::read() + */ +/** + * Returns when a string matching $expect exactly is found + */ +define('NET_SSH1_READ_SIMPLE', 1); +/** + * Returns when a string matching the regular expression $expect is found + */ +define('NET_SSH1_READ_REGEX', 2); +/**#@-*/ + +/** + * Pure-PHP implementation of SSHv1. + * + * @package Net_SSH1 + * @author Jim Wigginton + * @access public + */ +class Net_SSH1 +{ + /** + * The SSH identifier + * + * @var String + * @access private + */ + var $identifier = 'SSH-1.5-phpseclib'; + + /** + * The Socket Object + * + * @var Object + * @access private + */ + var $fsock; + + /** + * The cryptography object + * + * @var Object + * @access private + */ + var $crypto = false; + + /** + * Execution Bitmap + * + * The bits that are set represent functions that have been called already. This is used to determine + * if a requisite function has been successfully executed. If not, an error should be thrown. + * + * @var Integer + * @access private + */ + var $bitmap = 0; + + /** + * The Server Key Public Exponent + * + * Logged for debug purposes + * + * @see Net_SSH1::getServerKeyPublicExponent() + * @var String + * @access private + */ + var $server_key_public_exponent; + + /** + * The Server Key Public Modulus + * + * Logged for debug purposes + * + * @see Net_SSH1::getServerKeyPublicModulus() + * @var String + * @access private + */ + var $server_key_public_modulus; + + /** + * The Host Key Public Exponent + * + * Logged for debug purposes + * + * @see Net_SSH1::getHostKeyPublicExponent() + * @var String + * @access private + */ + var $host_key_public_exponent; + + /** + * The Host Key Public Modulus + * + * Logged for debug purposes + * + * @see Net_SSH1::getHostKeyPublicModulus() + * @var String + * @access private + */ + var $host_key_public_modulus; + + /** + * Supported Ciphers + * + * Logged for debug purposes + * + * @see Net_SSH1::getSupportedCiphers() + * @var Array + * @access private + */ + var $supported_ciphers = array( + NET_SSH1_CIPHER_NONE => 'No encryption', + NET_SSH1_CIPHER_IDEA => 'IDEA in CFB mode', + NET_SSH1_CIPHER_DES => 'DES in CBC mode', + NET_SSH1_CIPHER_3DES => 'Triple-DES in CBC mode', + NET_SSH1_CIPHER_BROKEN_TSS => 'TRI\'s Simple Stream encryption CBC', + NET_SSH1_CIPHER_RC4 => 'RC4', + NET_SSH1_CIPHER_BLOWFISH => 'Blowfish' + ); + + /** + * Supported Authentications + * + * Logged for debug purposes + * + * @see Net_SSH1::getSupportedAuthentications() + * @var Array + * @access private + */ + var $supported_authentications = array( + NET_SSH1_AUTH_RHOSTS => '.rhosts or /etc/hosts.equiv', + NET_SSH1_AUTH_RSA => 'pure RSA authentication', + NET_SSH1_AUTH_PASSWORD => 'password authentication', + NET_SSH1_AUTH_RHOSTS_RSA => '.rhosts with RSA host authentication' + ); + + /** + * Server Identification + * + * @see Net_SSH1::getServerIdentification() + * @var String + * @access private + */ + var $server_identification = ''; + + /** + * Protocol Flags + * + * @see Net_SSH1::Net_SSH1() + * @var Array + * @access private + */ + var $protocol_flags = array(); + + /** + * Protocol Flag Log + * + * @see Net_SSH1::getLog() + * @var Array + * @access private + */ + var $protocol_flag_log = array(); + + /** + * Message Log + * + * @see Net_SSH1::getLog() + * @var Array + * @access private + */ + var $message_log = array(); + + /** + * Real-time log file pointer + * + * @see Net_SSH1::_append_log() + * @var Resource + * @access private + */ + var $realtime_log_file; + + /** + * Real-time log file size + * + * @see Net_SSH1::_append_log() + * @var Integer + * @access private + */ + var $realtime_log_size; + + /** + * Real-time log file wrap boolean + * + * @see Net_SSH1::_append_log() + * @var Boolean + * @access private + */ + var $realtime_log_wrap; + + /** + * Interactive Buffer + * + * @see Net_SSH1::read() + * @var Array + * @access private + */ + var $interactiveBuffer = ''; + + /** + * Timeout + * + * @see Net_SSH1::setTimeout() + * @access private + */ + var $timeout; + + /** + * Current Timeout + * + * @see Net_SSH1::_get_channel_packet() + * @access private + */ + var $curTimeout; + + /** + * Log Boundary + * + * @see Net_SSH1::_format_log + * @access private + */ + var $log_boundary = ':'; + + /** + * Log Long Width + * + * @see Net_SSH1::_format_log + * @access private + */ + var $log_long_width = 65; + + /** + * Log Short Width + * + * @see Net_SSH1::_format_log + * @access private + */ + var $log_short_width = 16; + + /** + * Hostname + * + * @see Net_SSH1::Net_SSH1() + * @see Net_SSH1::_connect() + * @var String + * @access private + */ + var $host; + + /** + * Port Number + * + * @see Net_SSH1::Net_SSH1() + * @see Net_SSH1::_connect() + * @var Integer + * @access private + */ + var $port; + + /** + * Timeout for initial connection + * + * Set by the constructor call. Calling setTimeout() is optional. If it's not called functions like + * exec() won't timeout unless some PHP setting forces it too. The timeout specified in the constructor, + * however, is non-optional. There will be a timeout, whether or not you set it. If you don't it'll be + * 10 seconds. It is used by fsockopen() in that function. + * + * @see Net_SSH1::Net_SSH1() + * @see Net_SSH1::_connect() + * @var Integer + * @access private + */ + var $connectionTimeout; + + /** + * Default cipher + * + * @see Net_SSH1::Net_SSH1() + * @see Net_SSH1::_connect() + * @var Integer + * @access private + */ + var $cipher; + + /** + * Default Constructor. + * + * Connects to an SSHv1 server + * + * @param String $host + * @param optional Integer $port + * @param optional Integer $timeout + * @param optional Integer $cipher + * @return Net_SSH1 + * @access public + */ + function Net_SSH1($host, $port = 22, $timeout = 10, $cipher = NET_SSH1_CIPHER_3DES) + { + if (!class_exists('Math_BigInteger')) { + include_once 'Math/BigInteger.php'; + } + + // Include Crypt_Random + // the class_exists() will only be called if the crypt_random_string function hasn't been defined and + // will trigger a call to __autoload() if you're wanting to auto-load classes + // call function_exists() a second time to stop the include_once from being called outside + // of the auto loader + if (!function_exists('crypt_random_string') && !class_exists('Crypt_Random') && !function_exists('crypt_random_string')) { + include_once 'Crypt/Random.php'; + } + + $this->protocol_flags = array( + 1 => 'NET_SSH1_MSG_DISCONNECT', + 2 => 'NET_SSH1_SMSG_PUBLIC_KEY', + 3 => 'NET_SSH1_CMSG_SESSION_KEY', + 4 => 'NET_SSH1_CMSG_USER', + 9 => 'NET_SSH1_CMSG_AUTH_PASSWORD', + 10 => 'NET_SSH1_CMSG_REQUEST_PTY', + 12 => 'NET_SSH1_CMSG_EXEC_SHELL', + 13 => 'NET_SSH1_CMSG_EXEC_CMD', + 14 => 'NET_SSH1_SMSG_SUCCESS', + 15 => 'NET_SSH1_SMSG_FAILURE', + 16 => 'NET_SSH1_CMSG_STDIN_DATA', + 17 => 'NET_SSH1_SMSG_STDOUT_DATA', + 18 => 'NET_SSH1_SMSG_STDERR_DATA', + 19 => 'NET_SSH1_CMSG_EOF', + 20 => 'NET_SSH1_SMSG_EXITSTATUS', + 33 => 'NET_SSH1_CMSG_EXIT_CONFIRMATION' + ); + + $this->_define_array($this->protocol_flags); + + $this->host = $host; + $this->port = $port; + $this->connectionTimeout = $timeout; + $this->cipher = $cipher; + } + + /** + * Connect to an SSHv1 server + * + * @return Boolean + * @access private + */ + function _connect() + { + $this->fsock = @fsockopen($this->host, $this->port, $errno, $errstr, $this->connectionTimeout); + if (!$this->fsock) { + user_error(rtrim("Cannot connect to {$this->host}:{$this->port}. Error $errno. $errstr")); + return false; + } + + $this->server_identification = $init_line = fgets($this->fsock, 255); + + if (defined('NET_SSH1_LOGGING')) { + $this->_append_log('<-', $this->server_identification); + $this->_append_log('->', $this->identifier . "\r\n"); + } + + if (!preg_match('#SSH-([0-9\.]+)-(.+)#', $init_line, $parts)) { + user_error('Can only connect to SSH servers'); + return false; + } + if ($parts[1][0] != 1) { + user_error("Cannot connect to SSH $parts[1] servers"); + return false; + } + + fputs($this->fsock, $this->identifier."\r\n"); + + $response = $this->_get_binary_packet(); + if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_PUBLIC_KEY) { + user_error('Expected SSH_SMSG_PUBLIC_KEY'); + return false; + } + + $anti_spoofing_cookie = $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 8); + + $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4); + + $temp = unpack('nlen', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 2)); + $server_key_public_exponent = new Math_BigInteger($this->_string_shift($response[NET_SSH1_RESPONSE_DATA], ceil($temp['len'] / 8)), 256); + $this->server_key_public_exponent = $server_key_public_exponent; + + $temp = unpack('nlen', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 2)); + $server_key_public_modulus = new Math_BigInteger($this->_string_shift($response[NET_SSH1_RESPONSE_DATA], ceil($temp['len'] / 8)), 256); + $this->server_key_public_modulus = $server_key_public_modulus; + + $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4); + + $temp = unpack('nlen', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 2)); + $host_key_public_exponent = new Math_BigInteger($this->_string_shift($response[NET_SSH1_RESPONSE_DATA], ceil($temp['len'] / 8)), 256); + $this->host_key_public_exponent = $host_key_public_exponent; + + $temp = unpack('nlen', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 2)); + $host_key_public_modulus = new Math_BigInteger($this->_string_shift($response[NET_SSH1_RESPONSE_DATA], ceil($temp['len'] / 8)), 256); + $this->host_key_public_modulus = $host_key_public_modulus; + + $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4); + + // get a list of the supported ciphers + extract(unpack('Nsupported_ciphers_mask', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4))); + foreach ($this->supported_ciphers as $mask=>$name) { + if (($supported_ciphers_mask & (1 << $mask)) == 0) { + unset($this->supported_ciphers[$mask]); + } + } + + // get a list of the supported authentications + extract(unpack('Nsupported_authentications_mask', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4))); + foreach ($this->supported_authentications as $mask=>$name) { + if (($supported_authentications_mask & (1 << $mask)) == 0) { + unset($this->supported_authentications[$mask]); + } + } + + $session_id = pack('H*', md5($host_key_public_modulus->toBytes() . $server_key_public_modulus->toBytes() . $anti_spoofing_cookie)); + + $session_key = crypt_random_string(32); + $double_encrypted_session_key = $session_key ^ str_pad($session_id, 32, chr(0)); + + if ($server_key_public_modulus->compare($host_key_public_modulus) < 0) { + $double_encrypted_session_key = $this->_rsa_crypt( + $double_encrypted_session_key, + array( + $server_key_public_exponent, + $server_key_public_modulus + ) + ); + $double_encrypted_session_key = $this->_rsa_crypt( + $double_encrypted_session_key, + array( + $host_key_public_exponent, + $host_key_public_modulus + ) + ); + } else { + $double_encrypted_session_key = $this->_rsa_crypt( + $double_encrypted_session_key, + array( + $host_key_public_exponent, + $host_key_public_modulus + ) + ); + $double_encrypted_session_key = $this->_rsa_crypt( + $double_encrypted_session_key, + array( + $server_key_public_exponent, + $server_key_public_modulus + ) + ); + } + + $cipher = isset($this->supported_ciphers[$this->cipher]) ? $this->cipher : NET_SSH1_CIPHER_3DES; + $data = pack('C2a*na*N', NET_SSH1_CMSG_SESSION_KEY, $cipher, $anti_spoofing_cookie, 8 * strlen($double_encrypted_session_key), $double_encrypted_session_key, 0); + + if (!$this->_send_binary_packet($data)) { + user_error('Error sending SSH_CMSG_SESSION_KEY'); + return false; + } + + switch ($cipher) { + //case NET_SSH1_CIPHER_NONE: + // $this->crypto = new Crypt_Null(); + // break; + case NET_SSH1_CIPHER_DES: + if (!class_exists('Crypt_DES')) { + include_once 'Crypt/DES.php'; + } + $this->crypto = new Crypt_DES(); + $this->crypto->disablePadding(); + $this->crypto->enableContinuousBuffer(); + $this->crypto->setKey(substr($session_key, 0, 8)); + break; + case NET_SSH1_CIPHER_3DES: + if (!class_exists('Crypt_TripleDES')) { + include_once 'Crypt/TripleDES.php'; + } + $this->crypto = new Crypt_TripleDES(CRYPT_DES_MODE_3CBC); + $this->crypto->disablePadding(); + $this->crypto->enableContinuousBuffer(); + $this->crypto->setKey(substr($session_key, 0, 24)); + break; + //case NET_SSH1_CIPHER_RC4: + // if (!class_exists('Crypt_RC4')) { + // include_once 'Crypt/RC4.php'; + // } + // $this->crypto = new Crypt_RC4(); + // $this->crypto->enableContinuousBuffer(); + // $this->crypto->setKey(substr($session_key, 0, 16)); + // break; + } + + $response = $this->_get_binary_packet(); + + if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_SUCCESS) { + user_error('Expected SSH_SMSG_SUCCESS'); + return false; + } + + $this->bitmap = NET_SSH1_MASK_CONNECTED; + + return true; + } + + /** + * Login + * + * @param String $username + * @param optional String $password + * @return Boolean + * @access public + */ + function login($username, $password = '') + { + if (!($this->bitmap & NET_SSH1_MASK_CONSTRUCTOR)) { + $this->bitmap |= NET_SSH1_MASK_CONSTRUCTOR; + if (!$this->_connect()) { + return false; + } + } + + if (!($this->bitmap & NET_SSH1_MASK_CONNECTED)) { + return false; + } + + $data = pack('CNa*', NET_SSH1_CMSG_USER, strlen($username), $username); + + if (!$this->_send_binary_packet($data)) { + user_error('Error sending SSH_CMSG_USER'); + return false; + } + + $response = $this->_get_binary_packet(); + + if ($response === true) { + return false; + } + if ($response[NET_SSH1_RESPONSE_TYPE] == NET_SSH1_SMSG_SUCCESS) { + $this->bitmap |= NET_SSH1_MASK_LOGIN; + return true; + } else if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_FAILURE) { + user_error('Expected SSH_SMSG_SUCCESS or SSH_SMSG_FAILURE'); + return false; + } + + $data = pack('CNa*', NET_SSH1_CMSG_AUTH_PASSWORD, strlen($password), $password); + + if (!$this->_send_binary_packet($data)) { + user_error('Error sending SSH_CMSG_AUTH_PASSWORD'); + return false; + } + + // remove the username and password from the last logged packet + if (defined('NET_SSH1_LOGGING') && NET_SSH1_LOGGING == NET_SSH1_LOG_COMPLEX) { + $data = pack('CNa*', NET_SSH1_CMSG_AUTH_PASSWORD, strlen('password'), 'password'); + $this->message_log[count($this->message_log) - 1] = $data; + } + + $response = $this->_get_binary_packet(); + + if ($response === true) { + return false; + } + if ($response[NET_SSH1_RESPONSE_TYPE] == NET_SSH1_SMSG_SUCCESS) { + $this->bitmap |= NET_SSH1_MASK_LOGIN; + return true; + } else if ($response[NET_SSH1_RESPONSE_TYPE] == NET_SSH1_SMSG_FAILURE) { + return false; + } else { + user_error('Expected SSH_SMSG_SUCCESS or SSH_SMSG_FAILURE'); + return false; + } + } + + /** + * Set Timeout + * + * $ssh->exec('ping 127.0.0.1'); on a Linux host will never return and will run indefinitely. setTimeout() makes it so it'll timeout. + * Setting $timeout to false or 0 will mean there is no timeout. + * + * @param Mixed $timeout + */ + function setTimeout($timeout) + { + $this->timeout = $this->curTimeout = $timeout; + } + + /** + * Executes a command on a non-interactive shell, returns the output, and quits. + * + * An SSH1 server will close the connection after a command has been executed on a non-interactive shell. SSH2 + * servers don't, however, this isn't an SSH2 client. The way this works, on the server, is by initiating a + * shell with the -s option, as discussed in the following links: + * + * {@link http://www.faqs.org/docs/bashman/bashref_65.html http://www.faqs.org/docs/bashman/bashref_65.html} + * {@link http://www.faqs.org/docs/bashman/bashref_62.html http://www.faqs.org/docs/bashman/bashref_62.html} + * + * To execute further commands, a new Net_SSH1 object will need to be created. + * + * Returns false on failure and the output, otherwise. + * + * @see Net_SSH1::interactiveRead() + * @see Net_SSH1::interactiveWrite() + * @param String $cmd + * @return mixed + * @access public + */ + function exec($cmd, $block = true) + { + if (!($this->bitmap & NET_SSH1_MASK_LOGIN)) { + user_error('Operation disallowed prior to login()'); + return false; + } + + $data = pack('CNa*', NET_SSH1_CMSG_EXEC_CMD, strlen($cmd), $cmd); + + if (!$this->_send_binary_packet($data)) { + user_error('Error sending SSH_CMSG_EXEC_CMD'); + return false; + } + + if (!$block) { + return true; + } + + $output = ''; + $response = $this->_get_binary_packet(); + + if ($response !== false) { + do { + $output.= substr($response[NET_SSH1_RESPONSE_DATA], 4); + $response = $this->_get_binary_packet(); + } while (is_array($response) && $response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_EXITSTATUS); + } + + $data = pack('C', NET_SSH1_CMSG_EXIT_CONFIRMATION); + + // i don't think it's really all that important if this packet gets sent or not. + $this->_send_binary_packet($data); + + fclose($this->fsock); + + // reset the execution bitmap - a new Net_SSH1 object needs to be created. + $this->bitmap = 0; + + return $output; + } + + /** + * Creates an interactive shell + * + * @see Net_SSH1::interactiveRead() + * @see Net_SSH1::interactiveWrite() + * @return Boolean + * @access private + */ + function _initShell() + { + // connect using the sample parameters in protocol-1.5.txt. + // according to wikipedia.org's entry on text terminals, "the fundamental type of application running on a text + // terminal is a command line interpreter or shell". thus, opening a terminal session to run the shell. + $data = pack('CNa*N4C', NET_SSH1_CMSG_REQUEST_PTY, strlen('vt100'), 'vt100', 24, 80, 0, 0, NET_SSH1_TTY_OP_END); + + if (!$this->_send_binary_packet($data)) { + user_error('Error sending SSH_CMSG_REQUEST_PTY'); + return false; + } + + $response = $this->_get_binary_packet(); + + if ($response === true) { + return false; + } + if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_SUCCESS) { + user_error('Expected SSH_SMSG_SUCCESS'); + return false; + } + + $data = pack('C', NET_SSH1_CMSG_EXEC_SHELL); + + if (!$this->_send_binary_packet($data)) { + user_error('Error sending SSH_CMSG_EXEC_SHELL'); + return false; + } + + $this->bitmap |= NET_SSH1_MASK_SHELL; + + //stream_set_blocking($this->fsock, 0); + + return true; + } + + /** + * Inputs a command into an interactive shell. + * + * @see Net_SSH1::interactiveWrite() + * @param String $cmd + * @return Boolean + * @access public + */ + function write($cmd) + { + return $this->interactiveWrite($cmd); + } + + /** + * Returns the output of an interactive shell when there's a match for $expect + * + * $expect can take the form of a string literal or, if $mode == NET_SSH1_READ_REGEX, + * a regular expression. + * + * @see Net_SSH1::write() + * @param String $expect + * @param Integer $mode + * @return Boolean + * @access public + */ + function read($expect, $mode = NET_SSH1_READ_SIMPLE) + { + if (!($this->bitmap & NET_SSH1_MASK_LOGIN)) { + user_error('Operation disallowed prior to login()'); + return false; + } + + if (!($this->bitmap & NET_SSH1_MASK_SHELL) && !$this->_initShell()) { + user_error('Unable to initiate an interactive shell session'); + return false; + } + + $match = $expect; + while (true) { + if ($mode == NET_SSH1_READ_REGEX) { + preg_match($expect, $this->interactiveBuffer, $matches); + $match = isset($matches[0]) ? $matches[0] : ''; + } + $pos = strlen($match) ? strpos($this->interactiveBuffer, $match) : false; + if ($pos !== false) { + return $this->_string_shift($this->interactiveBuffer, $pos + strlen($match)); + } + $response = $this->_get_binary_packet(); + + if ($response === true) { + return $this->_string_shift($this->interactiveBuffer, strlen($this->interactiveBuffer)); + } + $this->interactiveBuffer.= substr($response[NET_SSH1_RESPONSE_DATA], 4); + } + } + + /** + * Inputs a command into an interactive shell. + * + * @see Net_SSH1::interactiveRead() + * @param String $cmd + * @return Boolean + * @access public + */ + function interactiveWrite($cmd) + { + if (!($this->bitmap & NET_SSH1_MASK_LOGIN)) { + user_error('Operation disallowed prior to login()'); + return false; + } + + if (!($this->bitmap & NET_SSH1_MASK_SHELL) && !$this->_initShell()) { + user_error('Unable to initiate an interactive shell session'); + return false; + } + + $data = pack('CNa*', NET_SSH1_CMSG_STDIN_DATA, strlen($cmd), $cmd); + + if (!$this->_send_binary_packet($data)) { + user_error('Error sending SSH_CMSG_STDIN'); + return false; + } + + return true; + } + + /** + * Returns the output of an interactive shell when no more output is available. + * + * Requires PHP 4.3.0 or later due to the use of the stream_select() function. If you see stuff like + * "^[[00m", you're seeing ANSI escape codes. According to + * {@link http://support.microsoft.com/kb/101875 How to Enable ANSI.SYS in a Command Window}, "Windows NT + * does not support ANSI escape sequences in Win32 Console applications", so if you're a Windows user, + * there's not going to be much recourse. + * + * @see Net_SSH1::interactiveRead() + * @return String + * @access public + */ + function interactiveRead() + { + if (!($this->bitmap & NET_SSH1_MASK_LOGIN)) { + user_error('Operation disallowed prior to login()'); + return false; + } + + if (!($this->bitmap & NET_SSH1_MASK_SHELL) && !$this->_initShell()) { + user_error('Unable to initiate an interactive shell session'); + return false; + } + + $read = array($this->fsock); + $write = $except = null; + if (stream_select($read, $write, $except, 0)) { + $response = $this->_get_binary_packet(); + return substr($response[NET_SSH1_RESPONSE_DATA], 4); + } else { + return ''; + } + } + + /** + * Disconnect + * + * @access public + */ + function disconnect() + { + $this->_disconnect(); + } + + /** + * Destructor. + * + * Will be called, automatically, if you're supporting just PHP5. If you're supporting PHP4, you'll need to call + * disconnect(). + * + * @access public + */ + function __destruct() + { + $this->_disconnect(); + } + + /** + * Disconnect + * + * @param String $msg + * @access private + */ + function _disconnect($msg = 'Client Quit') + { + if ($this->bitmap) { + $data = pack('C', NET_SSH1_CMSG_EOF); + $this->_send_binary_packet($data); + /* + $response = $this->_get_binary_packet(); + if ($response === true) { + $response = array(NET_SSH1_RESPONSE_TYPE => -1); + } + switch ($response[NET_SSH1_RESPONSE_TYPE]) { + case NET_SSH1_SMSG_EXITSTATUS: + $data = pack('C', NET_SSH1_CMSG_EXIT_CONFIRMATION); + break; + default: + $data = pack('CNa*', NET_SSH1_MSG_DISCONNECT, strlen($msg), $msg); + } + */ + $data = pack('CNa*', NET_SSH1_MSG_DISCONNECT, strlen($msg), $msg); + + $this->_send_binary_packet($data); + fclose($this->fsock); + $this->bitmap = 0; + } + } + + /** + * Gets Binary Packets + * + * See 'The Binary Packet Protocol' of protocol-1.5.txt for more info. + * + * Also, this function could be improved upon by adding detection for the following exploit: + * http://www.securiteam.com/securitynews/5LP042K3FY.html + * + * @see Net_SSH1::_send_binary_packet() + * @return Array + * @access private + */ + function _get_binary_packet() + { + if (feof($this->fsock)) { + //user_error('connection closed prematurely'); + return false; + } + + if ($this->curTimeout) { + $read = array($this->fsock); + $write = $except = null; + + $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 + $sec = floor($this->curTimeout); + $usec = 1000000 * ($this->curTimeout - $sec); + // on windows this returns a "Warning: Invalid CRT parameters detected" error + if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) { + //$this->_disconnect('Timeout'); + return true; + } + $elapsed = strtok(microtime(), ' ') + strtok('') - $start; + $this->curTimeout-= $elapsed; + } + + $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 + $temp = unpack('Nlength', fread($this->fsock, 4)); + + $padding_length = 8 - ($temp['length'] & 7); + $length = $temp['length'] + $padding_length; + $raw = ''; + + while ($length > 0) { + $temp = fread($this->fsock, $length); + $raw.= $temp; + $length-= strlen($temp); + } + $stop = strtok(microtime(), ' ') + strtok(''); + + if (strlen($raw) && $this->crypto !== false) { + $raw = $this->crypto->decrypt($raw); + } + + $padding = substr($raw, 0, $padding_length); + $type = $raw[$padding_length]; + $data = substr($raw, $padding_length + 1, -4); + + $temp = unpack('Ncrc', substr($raw, -4)); + + //if ( $temp['crc'] != $this->_crc($padding . $type . $data) ) { + // user_error('Bad CRC in packet from server'); + // return false; + //} + + $type = ord($type); + + if (defined('NET_SSH1_LOGGING')) { + $temp = isset($this->protocol_flags[$type]) ? $this->protocol_flags[$type] : 'UNKNOWN'; + $temp = '<- ' . $temp . + ' (' . round($stop - $start, 4) . 's)'; + $this->_append_log($temp, $data); + } + + return array( + NET_SSH1_RESPONSE_TYPE => $type, + NET_SSH1_RESPONSE_DATA => $data + ); + } + + /** + * Sends Binary Packets + * + * Returns true on success, false on failure. + * + * @see Net_SSH1::_get_binary_packet() + * @param String $data + * @return Boolean + * @access private + */ + function _send_binary_packet($data) + { + if (feof($this->fsock)) { + //user_error('connection closed prematurely'); + return false; + } + + $length = strlen($data) + 4; + + $padding = crypt_random_string(8 - ($length & 7)); + + $orig = $data; + $data = $padding . $data; + $data.= pack('N', $this->_crc($data)); + + if ($this->crypto !== false) { + $data = $this->crypto->encrypt($data); + } + + $packet = pack('Na*', $length, $data); + + $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 + $result = strlen($packet) == fputs($this->fsock, $packet); + $stop = strtok(microtime(), ' ') + strtok(''); + + if (defined('NET_SSH1_LOGGING')) { + $temp = isset($this->protocol_flags[ord($orig[0])]) ? $this->protocol_flags[ord($orig[0])] : 'UNKNOWN'; + $temp = '-> ' . $temp . + ' (' . round($stop - $start, 4) . 's)'; + $this->_append_log($temp, $orig); + } + + return $result; + } + + /** + * Cyclic Redundancy Check (CRC) + * + * PHP's crc32 function is implemented slightly differently than the one that SSH v1 uses, so + * we've reimplemented it. A more detailed discussion of the differences can be found after + * $crc_lookup_table's initialization. + * + * @see Net_SSH1::_get_binary_packet() + * @see Net_SSH1::_send_binary_packet() + * @param String $data + * @return Integer + * @access private + */ + function _crc($data) + { + static $crc_lookup_table = array( + 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, + 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, + 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, + 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, + 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, + 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, + 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, + 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, + 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, + 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, + 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, + 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, + 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, + 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, + 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, + 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, + 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, + 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, + 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, + 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, + 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, + 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, + 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, + 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, + 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, + 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, + 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, + 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, + 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, + 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, + 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, + 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, + 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, + 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, + 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, + 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, + 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, + 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, + 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, + 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, + 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, + 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, + 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, + 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, + 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, + 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, + 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, + 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, + 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, + 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, + 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, + 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, + 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, + 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, + 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, + 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, + 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, + 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, + 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, + 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, + 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, + 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, + 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, + 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D + ); + + // For this function to yield the same output as PHP's crc32 function, $crc would have to be + // set to 0xFFFFFFFF, initially - not 0x00000000 as it currently is. + $crc = 0x00000000; + $length = strlen($data); + + for ($i=0;$i<$length;$i++) { + // We AND $crc >> 8 with 0x00FFFFFF because we want the eight newly added bits to all + // be zero. PHP, unfortunately, doesn't always do this. 0x80000000 >> 8, as an example, + // yields 0xFF800000 - not 0x00800000. The following link elaborates: + // http://www.php.net/manual/en/language.operators.bitwise.php#57281 + $crc = (($crc >> 8) & 0x00FFFFFF) ^ $crc_lookup_table[($crc & 0xFF) ^ ord($data[$i])]; + } + + // In addition to having to set $crc to 0xFFFFFFFF, initially, the return value must be XOR'd with + // 0xFFFFFFFF for this function to return the same thing that PHP's crc32 function would. + return $crc; + } + + /** + * String Shift + * + * Inspired by array_shift + * + * @param String $string + * @param optional Integer $index + * @return String + * @access private + */ + function _string_shift(&$string, $index = 1) + { + $substr = substr($string, 0, $index); + $string = substr($string, $index); + return $substr; + } + + /** + * RSA Encrypt + * + * Returns mod(pow($m, $e), $n), where $n should be the product of two (large) primes $p and $q and where $e + * should be a number with the property that gcd($e, ($p - 1) * ($q - 1)) == 1. Could just make anything that + * calls this call modexp, instead, but I think this makes things clearer, maybe... + * + * @see Net_SSH1::Net_SSH1() + * @param Math_BigInteger $m + * @param Array $key + * @return Math_BigInteger + * @access private + */ + function _rsa_crypt($m, $key) + { + /* + if (!class_exists('Crypt_RSA')) { + include_once 'Crypt/RSA.php'; + } + + $rsa = new Crypt_RSA(); + $rsa->loadKey($key, CRYPT_RSA_PUBLIC_FORMAT_RAW); + $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); + return $rsa->encrypt($m); + */ + + // To quote from protocol-1.5.txt: + // The most significant byte (which is only partial as the value must be + // less than the public modulus, which is never a power of two) is zero. + // + // The next byte contains the value 2 (which stands for public-key + // encrypted data in the PKCS standard [PKCS#1]). Then, there are non- + // zero random bytes to fill any unused space, a zero byte, and the data + // to be encrypted in the least significant bytes, the last byte of the + // data in the least significant byte. + + // Presumably the part of PKCS#1 they're refering to is "Section 7.2.1 Encryption Operation", + // under "7.2 RSAES-PKCS1-v1.5" and "7 Encryption schemes" of the following URL: + // ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1.pdf + $modulus = $key[1]->toBytes(); + $length = strlen($modulus) - strlen($m) - 3; + $random = ''; + while (strlen($random) != $length) { + $block = crypt_random_string($length - strlen($random)); + $block = str_replace("\x00", '', $block); + $random.= $block; + } + $temp = chr(0) . chr(2) . $random . chr(0) . $m; + + $m = new Math_BigInteger($temp, 256); + $m = $m->modPow($key[0], $key[1]); + + return $m->toBytes(); + } + + /** + * Define Array + * + * Takes any number of arrays whose indices are integers and whose values are strings and defines a bunch of + * named constants from it, using the value as the name of the constant and the index as the value of the constant. + * If any of the constants that would be defined already exists, none of the constants will be defined. + * + * @param Array $array + * @access private + */ + function _define_array() + { + $args = func_get_args(); + foreach ($args as $arg) { + foreach ($arg as $key=>$value) { + if (!defined($value)) { + define($value, $key); + } else { + break 2; + } + } + } + } + + /** + * Returns a log of the packets that have been sent and received. + * + * Returns a string if NET_SSH1_LOGGING == NET_SSH1_LOG_COMPLEX, an array if NET_SSH1_LOGGING == NET_SSH1_LOG_SIMPLE and false if !defined('NET_SSH1_LOGGING') + * + * @access public + * @return String or Array + */ + function getLog() + { + if (!defined('NET_SSH1_LOGGING')) { + return false; + } + + switch (NET_SSH1_LOGGING) { + case NET_SSH1_LOG_SIMPLE: + return $this->message_number_log; + break; + case NET_SSH1_LOG_COMPLEX: + return $this->_format_log($this->message_log, $this->protocol_flags_log); + break; + default: + return false; + } + } + + /** + * Formats a log for printing + * + * @param Array $message_log + * @param Array $message_number_log + * @access private + * @return String + */ + function _format_log($message_log, $message_number_log) + { + $output = ''; + for ($i = 0; $i < count($message_log); $i++) { + $output.= $message_number_log[$i] . "\r\n"; + $current_log = $message_log[$i]; + $j = 0; + do { + if (strlen($current_log)) { + $output.= str_pad(dechex($j), 7, '0', STR_PAD_LEFT) . '0 '; + } + $fragment = $this->_string_shift($current_log, $this->log_short_width); + $hex = substr(preg_replace_callback('#.#s', array($this, '_format_log_helper'), $fragment), strlen($this->log_boundary)); + // replace non ASCII printable characters with dots + // http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters + // also replace < with a . since < messes up the output on web browsers + $raw = preg_replace('#[^\x20-\x7E]|<#', '.', $fragment); + $output.= str_pad($hex, $this->log_long_width - $this->log_short_width, ' ') . $raw . "\r\n"; + $j++; + } while (strlen($current_log)); + $output.= "\r\n"; + } + + return $output; + } + + /** + * Helper function for _format_log + * + * For use with preg_replace_callback() + * + * @param Array $matches + * @access private + * @return String + */ + function _format_log_helper($matches) + { + return $this->log_boundary . str_pad(dechex(ord($matches[0])), 2, '0', STR_PAD_LEFT); + } + + /** + * Return the server key public exponent + * + * Returns, by default, the base-10 representation. If $raw_output is set to true, returns, instead, + * the raw bytes. This behavior is similar to PHP's md5() function. + * + * @param optional Boolean $raw_output + * @return String + * @access public + */ + function getServerKeyPublicExponent($raw_output = false) + { + return $raw_output ? $this->server_key_public_exponent->toBytes() : $this->server_key_public_exponent->toString(); + } + + /** + * Return the server key public modulus + * + * Returns, by default, the base-10 representation. If $raw_output is set to true, returns, instead, + * the raw bytes. This behavior is similar to PHP's md5() function. + * + * @param optional Boolean $raw_output + * @return String + * @access public + */ + function getServerKeyPublicModulus($raw_output = false) + { + return $raw_output ? $this->server_key_public_modulus->toBytes() : $this->server_key_public_modulus->toString(); + } + + /** + * Return the host key public exponent + * + * Returns, by default, the base-10 representation. If $raw_output is set to true, returns, instead, + * the raw bytes. This behavior is similar to PHP's md5() function. + * + * @param optional Boolean $raw_output + * @return String + * @access public + */ + function getHostKeyPublicExponent($raw_output = false) + { + return $raw_output ? $this->host_key_public_exponent->toBytes() : $this->host_key_public_exponent->toString(); + } + + /** + * Return the host key public modulus + * + * Returns, by default, the base-10 representation. If $raw_output is set to true, returns, instead, + * the raw bytes. This behavior is similar to PHP's md5() function. + * + * @param optional Boolean $raw_output + * @return String + * @access public + */ + function getHostKeyPublicModulus($raw_output = false) + { + return $raw_output ? $this->host_key_public_modulus->toBytes() : $this->host_key_public_modulus->toString(); + } + + /** + * Return a list of ciphers supported by SSH1 server. + * + * Just because a cipher is supported by an SSH1 server doesn't mean it's supported by this library. If $raw_output + * is set to true, returns, instead, an array of constants. ie. instead of array('Triple-DES in CBC mode'), you'll + * get array(NET_SSH1_CIPHER_3DES). + * + * @param optional Boolean $raw_output + * @return Array + * @access public + */ + function getSupportedCiphers($raw_output = false) + { + return $raw_output ? array_keys($this->supported_ciphers) : array_values($this->supported_ciphers); + } + + /** + * Return a list of authentications supported by SSH1 server. + * + * Just because a cipher is supported by an SSH1 server doesn't mean it's supported by this library. If $raw_output + * is set to true, returns, instead, an array of constants. ie. instead of array('password authentication'), you'll + * get array(NET_SSH1_AUTH_PASSWORD). + * + * @param optional Boolean $raw_output + * @return Array + * @access public + */ + function getSupportedAuthentications($raw_output = false) + { + return $raw_output ? array_keys($this->supported_authentications) : array_values($this->supported_authentications); + } + + /** + * Return the server identification. + * + * @return String + * @access public + */ + function getServerIdentification() + { + return rtrim($this->server_identification); + } + + /** + * Logs data packets + * + * Makes sure that only the last 1MB worth of packets will be logged + * + * @param String $data + * @access private + */ + function _append_log($protocol_flags, $message) + { + switch (NET_SSH1_LOGGING) { + // useful for benchmarks + case NET_SSH1_LOG_SIMPLE: + $this->protocol_flags_log[] = $protocol_flags; + break; + // the most useful log for SSH1 + case NET_SSH1_LOG_COMPLEX: + $this->protocol_flags_log[] = $protocol_flags; + $this->_string_shift($message); + $this->log_size+= strlen($message); + $this->message_log[] = $message; + while ($this->log_size > NET_SSH1_LOG_MAX_SIZE) { + $this->log_size-= strlen(array_shift($this->message_log)); + array_shift($this->protocol_flags_log); + } + break; + // dump the output out realtime; packets may be interspersed with non packets, + // passwords won't be filtered out and select other packets may not be correctly + // identified + case NET_SSH1_LOG_REALTIME: + echo "
\r\n" . $this->_format_log(array($message), array($protocol_flags)) . "\r\n
\r\n"; + @flush(); + @ob_flush(); + break; + // basically the same thing as NET_SSH1_LOG_REALTIME with the caveat that NET_SSH1_LOG_REALTIME_FILE + // needs to be defined and that the resultant log file will be capped out at NET_SSH1_LOG_MAX_SIZE. + // the earliest part of the log file is denoted by the first <<< START >>> and is not going to necessarily + // at the beginning of the file + case NET_SSH1_LOG_REALTIME_FILE: + if (!isset($this->realtime_log_file)) { + // PHP doesn't seem to like using constants in fopen() + $filename = NET_SSH1_LOG_REALTIME_FILE; + $fp = fopen($filename, 'w'); + $this->realtime_log_file = $fp; + } + if (!is_resource($this->realtime_log_file)) { + break; + } + $entry = $this->_format_log(array($message), array($protocol_flags)); + if ($this->realtime_log_wrap) { + $temp = "<<< START >>>\r\n"; + $entry.= $temp; + fseek($this->realtime_log_file, ftell($this->realtime_log_file) - strlen($temp)); + } + $this->realtime_log_size+= strlen($entry); + if ($this->realtime_log_size > NET_SSH1_LOG_MAX_SIZE) { + fseek($this->realtime_log_file, 0); + $this->realtime_log_size = strlen($entry); + $this->realtime_log_wrap = true; + } + fputs($this->realtime_log_file, $entry); + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SSH2.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SSH2.php new file mode 100755 index 00000000..d6134562 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SSH2.php @@ -0,0 +1,3878 @@ + + * login('username', 'password')) { + * exit('Login Failed'); + * } + * + * echo $ssh->exec('pwd'); + * echo $ssh->exec('ls -la'); + * ?> + * + * + * + * setPassword('whatever'); + * $key->loadKey(file_get_contents('privatekey')); + * + * $ssh = new Net_SSH2('www.domain.tld'); + * if (!$ssh->login('username', $key)) { + * exit('Login Failed'); + * } + * + * echo $ssh->read('username@username:~$'); + * $ssh->write("ls -la\n"); + * echo $ssh->read('username@username:~$'); + * ?> + * + * + * LICENSE: 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. + * + * @category Net + * @package Net_SSH2 + * @author Jim Wigginton + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/**#@+ + * Execution Bitmap Masks + * + * @see Net_SSH2::bitmap + * @access private + */ +define('NET_SSH2_MASK_CONSTRUCTOR', 0x00000001); +define('NET_SSH2_MASK_CONNECTED', 0x00000002); +define('NET_SSH2_MASK_LOGIN_REQ', 0x00000004); +define('NET_SSH2_MASK_LOGIN', 0x00000008); +define('NET_SSH2_MASK_SHELL', 0x00000010); +define('NET_SSH2_MASK_WINDOW_ADJUST', 0x00000020); +/**#@-*/ + +/**#@+ + * Channel constants + * + * RFC4254 refers not to client and server channels but rather to sender and recipient channels. we don't refer + * to them in that way because RFC4254 toggles the meaning. the client sends a SSH_MSG_CHANNEL_OPEN message with + * a sender channel and the server sends a SSH_MSG_CHANNEL_OPEN_CONFIRMATION in response, with a sender and a + * recepient channel. at first glance, you might conclude that SSH_MSG_CHANNEL_OPEN_CONFIRMATION's sender channel + * would be the same thing as SSH_MSG_CHANNEL_OPEN's sender channel, but it's not, per this snipet: + * The 'recipient channel' is the channel number given in the original + * open request, and 'sender channel' is the channel number allocated by + * the other side. + * + * @see Net_SSH2::_send_channel_packet() + * @see Net_SSH2::_get_channel_packet() + * @access private + */ +define('NET_SSH2_CHANNEL_EXEC', 0); // PuTTy uses 0x100 +define('NET_SSH2_CHANNEL_SHELL', 1); +define('NET_SSH2_CHANNEL_SUBSYSTEM', 2); +/**#@-*/ + +/**#@+ + * @access public + * @see Net_SSH2::getLog() + */ +/** + * Returns the message numbers + */ +define('NET_SSH2_LOG_SIMPLE', 1); +/** + * Returns the message content + */ +define('NET_SSH2_LOG_COMPLEX', 2); +/** + * Outputs the content real-time + */ +define('NET_SSH2_LOG_REALTIME', 3); +/** + * Dumps the content real-time to a file + */ +define('NET_SSH2_LOG_REALTIME_FILE', 4); +/**#@-*/ + +/**#@+ + * @access public + * @see Net_SSH2::read() + */ +/** + * Returns when a string matching $expect exactly is found + */ +define('NET_SSH2_READ_SIMPLE', 1); +/** + * Returns when a string matching the regular expression $expect is found + */ +define('NET_SSH2_READ_REGEX', 2); +/** + * Make sure that the log never gets larger than this + */ +define('NET_SSH2_LOG_MAX_SIZE', 1024 * 1024); +/**#@-*/ + +/** + * Pure-PHP implementation of SSHv2. + * + * @package Net_SSH2 + * @author Jim Wigginton + * @access public + */ +class Net_SSH2 +{ + /** + * The SSH identifier + * + * @var String + * @access private + */ + var $identifier; + + /** + * The Socket Object + * + * @var Object + * @access private + */ + var $fsock; + + /** + * Execution Bitmap + * + * The bits that are set represent functions that have been called already. This is used to determine + * if a requisite function has been successfully executed. If not, an error should be thrown. + * + * @var Integer + * @access private + */ + var $bitmap = 0; + + /** + * Error information + * + * @see Net_SSH2::getErrors() + * @see Net_SSH2::getLastError() + * @var String + * @access private + */ + var $errors = array(); + + /** + * Server Identifier + * + * @see Net_SSH2::getServerIdentification() + * @var mixed false or Array + * @access private + */ + var $server_identifier = false; + + /** + * Key Exchange Algorithms + * + * @see Net_SSH2::getKexAlgorithims() + * @var mixed false or Array + * @access private + */ + var $kex_algorithms = false; + + /** + * Server Host Key Algorithms + * + * @see Net_SSH2::getServerHostKeyAlgorithms() + * @var mixed false or Array + * @access private + */ + var $server_host_key_algorithms = false; + + /** + * Encryption Algorithms: Client to Server + * + * @see Net_SSH2::getEncryptionAlgorithmsClient2Server() + * @var mixed false or Array + * @access private + */ + var $encryption_algorithms_client_to_server = false; + + /** + * Encryption Algorithms: Server to Client + * + * @see Net_SSH2::getEncryptionAlgorithmsServer2Client() + * @var mixed false or Array + * @access private + */ + var $encryption_algorithms_server_to_client = false; + + /** + * MAC Algorithms: Client to Server + * + * @see Net_SSH2::getMACAlgorithmsClient2Server() + * @var mixed false or Array + * @access private + */ + var $mac_algorithms_client_to_server = false; + + /** + * MAC Algorithms: Server to Client + * + * @see Net_SSH2::getMACAlgorithmsServer2Client() + * @var mixed false or Array + * @access private + */ + var $mac_algorithms_server_to_client = false; + + /** + * Compression Algorithms: Client to Server + * + * @see Net_SSH2::getCompressionAlgorithmsClient2Server() + * @var mixed false or Array + * @access private + */ + var $compression_algorithms_client_to_server = false; + + /** + * Compression Algorithms: Server to Client + * + * @see Net_SSH2::getCompressionAlgorithmsServer2Client() + * @var mixed false or Array + * @access private + */ + var $compression_algorithms_server_to_client = false; + + /** + * Languages: Server to Client + * + * @see Net_SSH2::getLanguagesServer2Client() + * @var mixed false or Array + * @access private + */ + var $languages_server_to_client = false; + + /** + * Languages: Client to Server + * + * @see Net_SSH2::getLanguagesClient2Server() + * @var mixed false or Array + * @access private + */ + var $languages_client_to_server = false; + + /** + * Block Size for Server to Client Encryption + * + * "Note that the length of the concatenation of 'packet_length', + * 'padding_length', 'payload', and 'random padding' MUST be a multiple + * of the cipher block size or 8, whichever is larger. This constraint + * MUST be enforced, even when using stream ciphers." + * + * -- http://tools.ietf.org/html/rfc4253#section-6 + * + * @see Net_SSH2::Net_SSH2() + * @see Net_SSH2::_send_binary_packet() + * @var Integer + * @access private + */ + var $encrypt_block_size = 8; + + /** + * Block Size for Client to Server Encryption + * + * @see Net_SSH2::Net_SSH2() + * @see Net_SSH2::_get_binary_packet() + * @var Integer + * @access private + */ + var $decrypt_block_size = 8; + + /** + * Server to Client Encryption Object + * + * @see Net_SSH2::_get_binary_packet() + * @var Object + * @access private + */ + var $decrypt = false; + + /** + * Client to Server Encryption Object + * + * @see Net_SSH2::_send_binary_packet() + * @var Object + * @access private + */ + var $encrypt = false; + + /** + * Client to Server HMAC Object + * + * @see Net_SSH2::_send_binary_packet() + * @var Object + * @access private + */ + var $hmac_create = false; + + /** + * Server to Client HMAC Object + * + * @see Net_SSH2::_get_binary_packet() + * @var Object + * @access private + */ + var $hmac_check = false; + + /** + * Size of server to client HMAC + * + * We need to know how big the HMAC will be for the server to client direction so that we know how many bytes to read. + * For the client to server side, the HMAC object will make the HMAC as long as it needs to be. All we need to do is + * append it. + * + * @see Net_SSH2::_get_binary_packet() + * @var Integer + * @access private + */ + var $hmac_size = false; + + /** + * Server Public Host Key + * + * @see Net_SSH2::getServerPublicHostKey() + * @var String + * @access private + */ + var $server_public_host_key; + + /** + * Session identifer + * + * "The exchange hash H from the first key exchange is additionally + * used as the session identifier, which is a unique identifier for + * this connection." + * + * -- http://tools.ietf.org/html/rfc4253#section-7.2 + * + * @see Net_SSH2::_key_exchange() + * @var String + * @access private + */ + var $session_id = false; + + /** + * Exchange hash + * + * The current exchange hash + * + * @see Net_SSH2::_key_exchange() + * @var String + * @access private + */ + var $exchange_hash = false; + + /** + * Message Numbers + * + * @see Net_SSH2::Net_SSH2() + * @var Array + * @access private + */ + var $message_numbers = array(); + + /** + * Disconnection Message 'reason codes' defined in RFC4253 + * + * @see Net_SSH2::Net_SSH2() + * @var Array + * @access private + */ + var $disconnect_reasons = array(); + + /** + * SSH_MSG_CHANNEL_OPEN_FAILURE 'reason codes', defined in RFC4254 + * + * @see Net_SSH2::Net_SSH2() + * @var Array + * @access private + */ + var $channel_open_failure_reasons = array(); + + /** + * Terminal Modes + * + * @link http://tools.ietf.org/html/rfc4254#section-8 + * @see Net_SSH2::Net_SSH2() + * @var Array + * @access private + */ + var $terminal_modes = array(); + + /** + * SSH_MSG_CHANNEL_EXTENDED_DATA's data_type_codes + * + * @link http://tools.ietf.org/html/rfc4254#section-5.2 + * @see Net_SSH2::Net_SSH2() + * @var Array + * @access private + */ + var $channel_extended_data_type_codes = array(); + + /** + * Send Sequence Number + * + * See 'Section 6.4. Data Integrity' of rfc4253 for more info. + * + * @see Net_SSH2::_send_binary_packet() + * @var Integer + * @access private + */ + var $send_seq_no = 0; + + /** + * Get Sequence Number + * + * See 'Section 6.4. Data Integrity' of rfc4253 for more info. + * + * @see Net_SSH2::_get_binary_packet() + * @var Integer + * @access private + */ + var $get_seq_no = 0; + + /** + * Server Channels + * + * Maps client channels to server channels + * + * @see Net_SSH2::_get_channel_packet() + * @see Net_SSH2::exec() + * @var Array + * @access private + */ + var $server_channels = array(); + + /** + * Channel Buffers + * + * If a client requests a packet from one channel but receives two packets from another those packets should + * be placed in a buffer + * + * @see Net_SSH2::_get_channel_packet() + * @see Net_SSH2::exec() + * @var Array + * @access private + */ + var $channel_buffers = array(); + + /** + * Channel Status + * + * Contains the type of the last sent message + * + * @see Net_SSH2::_get_channel_packet() + * @var Array + * @access private + */ + var $channel_status = array(); + + /** + * Packet Size + * + * Maximum packet size indexed by channel + * + * @see Net_SSH2::_send_channel_packet() + * @var Array + * @access private + */ + var $packet_size_client_to_server = array(); + + /** + * Message Number Log + * + * @see Net_SSH2::getLog() + * @var Array + * @access private + */ + var $message_number_log = array(); + + /** + * Message Log + * + * @see Net_SSH2::getLog() + * @var Array + * @access private + */ + var $message_log = array(); + + /** + * The Window Size + * + * Bytes the other party can send before it must wait for the window to be adjusted (0x7FFFFFFF = 2GB) + * + * @var Integer + * @see Net_SSH2::_send_channel_packet() + * @see Net_SSH2::exec() + * @access private + */ + var $window_size = 0x7FFFFFFF; + + /** + * Window size, server to client + * + * Window size indexed by channel + * + * @see Net_SSH2::_send_channel_packet() + * @var Array + * @access private + */ + var $window_size_server_to_client = array(); + + /** + * Window size, client to server + * + * Window size indexed by channel + * + * @see Net_SSH2::_get_channel_packet() + * @var Array + * @access private + */ + var $window_size_client_to_server = array(); + + /** + * Server signature + * + * Verified against $this->session_id + * + * @see Net_SSH2::getServerPublicHostKey() + * @var String + * @access private + */ + var $signature = ''; + + /** + * Server signature format + * + * ssh-rsa or ssh-dss. + * + * @see Net_SSH2::getServerPublicHostKey() + * @var String + * @access private + */ + var $signature_format = ''; + + /** + * Interactive Buffer + * + * @see Net_SSH2::read() + * @var Array + * @access private + */ + var $interactiveBuffer = ''; + + /** + * Current log size + * + * Should never exceed NET_SSH2_LOG_MAX_SIZE + * + * @see Net_SSH2::_send_binary_packet() + * @see Net_SSH2::_get_binary_packet() + * @var Integer + * @access private + */ + var $log_size; + + /** + * Timeout + * + * @see Net_SSH2::setTimeout() + * @access private + */ + var $timeout; + + /** + * Current Timeout + * + * @see Net_SSH2::_get_channel_packet() + * @access private + */ + var $curTimeout; + + /** + * Real-time log file pointer + * + * @see Net_SSH2::_append_log() + * @var Resource + * @access private + */ + var $realtime_log_file; + + /** + * Real-time log file size + * + * @see Net_SSH2::_append_log() + * @var Integer + * @access private + */ + var $realtime_log_size; + + /** + * Has the signature been validated? + * + * @see Net_SSH2::getServerPublicHostKey() + * @var Boolean + * @access private + */ + var $signature_validated = false; + + /** + * Real-time log file wrap boolean + * + * @see Net_SSH2::_append_log() + * @access private + */ + var $realtime_log_wrap; + + /** + * Flag to suppress stderr from output + * + * @see Net_SSH2::enableQuietMode() + * @access private + */ + var $quiet_mode = false; + + /** + * Time of first network activity + * + * @var Integer + * @access private + */ + var $last_packet; + + /** + * Exit status returned from ssh if any + * + * @var Integer + * @access private + */ + var $exit_status; + + /** + * Flag to request a PTY when using exec() + * + * @var Boolean + * @see Net_SSH2::enablePTY() + * @access private + */ + var $request_pty = false; + + /** + * Flag set while exec() is running when using enablePTY() + * + * @var Boolean + * @access private + */ + var $in_request_pty_exec = false; + + /** + * Flag set after startSubsystem() is called + * + * @var Boolean + * @access private + */ + var $in_subsystem; + + /** + * Contents of stdError + * + * @var String + * @access private + */ + var $stdErrorLog; + + /** + * The Last Interactive Response + * + * @see Net_SSH2::_keyboard_interactive_process() + * @var String + * @access private + */ + var $last_interactive_response = ''; + + /** + * Keyboard Interactive Request / Responses + * + * @see Net_SSH2::_keyboard_interactive_process() + * @var Array + * @access private + */ + var $keyboard_requests_responses = array(); + + /** + * Banner Message + * + * Quoting from the RFC, "in some jurisdictions, sending a warning message before + * authentication may be relevant for getting legal protection." + * + * @see Net_SSH2::_filter() + * @see Net_SSH2::getBannerMessage() + * @var String + * @access private + */ + var $banner_message = ''; + + /** + * Did read() timeout or return normally? + * + * @see Net_SSH2::isTimeout() + * @var Boolean + * @access private + */ + var $is_timeout = false; + + /** + * Log Boundary + * + * @see Net_SSH2::_format_log() + * @var String + * @access private + */ + var $log_boundary = ':'; + + /** + * Log Long Width + * + * @see Net_SSH2::_format_log() + * @var Integer + * @access private + */ + var $log_long_width = 65; + + /** + * Log Short Width + * + * @see Net_SSH2::_format_log() + * @var Integer + * @access private + */ + var $log_short_width = 16; + + /** + * Hostname + * + * @see Net_SSH2::Net_SSH2() + * @see Net_SSH2::_connect() + * @var String + * @access private + */ + var $host; + + /** + * Port Number + * + * @see Net_SSH2::Net_SSH2() + * @see Net_SSH2::_connect() + * @var Integer + * @access private + */ + var $port; + + /** + * Timeout for initial connection + * + * Set by the constructor call. Calling setTimeout() is optional. If it's not called functions like + * exec() won't timeout unless some PHP setting forces it too. The timeout specified in the constructor, + * however, is non-optional. There will be a timeout, whether or not you set it. If you don't it'll be + * 10 seconds. It is used by fsockopen() and the initial stream_select in that function. + * + * @see Net_SSH2::Net_SSH2() + * @see Net_SSH2::_connect() + * @var Integer + * @access private + */ + var $connectionTimeout; + + /** + * Number of columns for terminal window size + * + * @see Net_SSH2::getWindowColumns() + * @see Net_SSH2::setWindowColumns() + * @see Net_SSH2::setWindowSize() + * @var Integer + * @access private + */ + var $windowColumns = 80; + + /** + * Number of columns for terminal window size + * + * @see Net_SSH2::getWindowRows() + * @see Net_SSH2::setWindowRows() + * @see Net_SSH2::setWindowSize() + * @var Integer + * @access private + */ + var $windowRows = 24; + + /** + * Default Constructor. + * + * @param String $host + * @param optional Integer $port + * @param optional Integer $timeout + * @see Net_SSH2::login() + * @return Net_SSH2 + * @access public + */ + function Net_SSH2($host, $port = 22, $timeout = 10) + { + // Include Math_BigInteger + // Used to do Diffie-Hellman key exchange and DSA/RSA signature verification. + if (!class_exists('Math_BigInteger')) { + include_once 'Math/BigInteger.php'; + } + + if (!function_exists('crypt_random_string')) { + include_once 'Crypt/Random.php'; + } + + if (!class_exists('Crypt_Hash')) { + include_once 'Crypt/Hash.php'; + } + + $this->message_numbers = array( + 1 => 'NET_SSH2_MSG_DISCONNECT', + 2 => 'NET_SSH2_MSG_IGNORE', + 3 => 'NET_SSH2_MSG_UNIMPLEMENTED', + 4 => 'NET_SSH2_MSG_DEBUG', + 5 => 'NET_SSH2_MSG_SERVICE_REQUEST', + 6 => 'NET_SSH2_MSG_SERVICE_ACCEPT', + 20 => 'NET_SSH2_MSG_KEXINIT', + 21 => 'NET_SSH2_MSG_NEWKEYS', + 30 => 'NET_SSH2_MSG_KEXDH_INIT', + 31 => 'NET_SSH2_MSG_KEXDH_REPLY', + 50 => 'NET_SSH2_MSG_USERAUTH_REQUEST', + 51 => 'NET_SSH2_MSG_USERAUTH_FAILURE', + 52 => 'NET_SSH2_MSG_USERAUTH_SUCCESS', + 53 => 'NET_SSH2_MSG_USERAUTH_BANNER', + + 80 => 'NET_SSH2_MSG_GLOBAL_REQUEST', + 81 => 'NET_SSH2_MSG_REQUEST_SUCCESS', + 82 => 'NET_SSH2_MSG_REQUEST_FAILURE', + 90 => 'NET_SSH2_MSG_CHANNEL_OPEN', + 91 => 'NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION', + 92 => 'NET_SSH2_MSG_CHANNEL_OPEN_FAILURE', + 93 => 'NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST', + 94 => 'NET_SSH2_MSG_CHANNEL_DATA', + 95 => 'NET_SSH2_MSG_CHANNEL_EXTENDED_DATA', + 96 => 'NET_SSH2_MSG_CHANNEL_EOF', + 97 => 'NET_SSH2_MSG_CHANNEL_CLOSE', + 98 => 'NET_SSH2_MSG_CHANNEL_REQUEST', + 99 => 'NET_SSH2_MSG_CHANNEL_SUCCESS', + 100 => 'NET_SSH2_MSG_CHANNEL_FAILURE' + ); + $this->disconnect_reasons = array( + 1 => 'NET_SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT', + 2 => 'NET_SSH2_DISCONNECT_PROTOCOL_ERROR', + 3 => 'NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED', + 4 => 'NET_SSH2_DISCONNECT_RESERVED', + 5 => 'NET_SSH2_DISCONNECT_MAC_ERROR', + 6 => 'NET_SSH2_DISCONNECT_COMPRESSION_ERROR', + 7 => 'NET_SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE', + 8 => 'NET_SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED', + 9 => 'NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE', + 10 => 'NET_SSH2_DISCONNECT_CONNECTION_LOST', + 11 => 'NET_SSH2_DISCONNECT_BY_APPLICATION', + 12 => 'NET_SSH2_DISCONNECT_TOO_MANY_CONNECTIONS', + 13 => 'NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER', + 14 => 'NET_SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE', + 15 => 'NET_SSH2_DISCONNECT_ILLEGAL_USER_NAME' + ); + $this->channel_open_failure_reasons = array( + 1 => 'NET_SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED' + ); + $this->terminal_modes = array( + 0 => 'NET_SSH2_TTY_OP_END' + ); + $this->channel_extended_data_type_codes = array( + 1 => 'NET_SSH2_EXTENDED_DATA_STDERR' + ); + + $this->_define_array( + $this->message_numbers, + $this->disconnect_reasons, + $this->channel_open_failure_reasons, + $this->terminal_modes, + $this->channel_extended_data_type_codes, + array(60 => 'NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ'), + array(60 => 'NET_SSH2_MSG_USERAUTH_PK_OK'), + array(60 => 'NET_SSH2_MSG_USERAUTH_INFO_REQUEST', + 61 => 'NET_SSH2_MSG_USERAUTH_INFO_RESPONSE') + ); + + $this->host = $host; + $this->port = $port; + $this->connectionTimeout = $timeout; + } + + /** + * Connect to an SSHv2 server + * + * @return Boolean + * @access private + */ + function _connect() + { + if ($this->bitmap & NET_SSH2_MASK_CONSTRUCTOR) { + return false; + } + + $this->bitmap |= NET_SSH2_MASK_CONSTRUCTOR; + + $timeout = $this->connectionTimeout; + $host = $this->host . ':' . $this->port; + + $this->last_packet = strtok(microtime(), ' ') + strtok(''); // == microtime(true) in PHP5 + + $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 + $this->fsock = @fsockopen($this->host, $this->port, $errno, $errstr, $timeout); + if (!$this->fsock) { + user_error(rtrim("Cannot connect to $host. Error $errno. $errstr")); + return false; + } + $elapsed = strtok(microtime(), ' ') + strtok('') - $start; + + $timeout-= $elapsed; + + if ($timeout <= 0) { + user_error("Cannot connect to $host. Timeout error"); + return false; + } + + $read = array($this->fsock); + $write = $except = null; + + $sec = floor($timeout); + $usec = 1000000 * ($timeout - $sec); + + // on windows this returns a "Warning: Invalid CRT parameters detected" error + // the !count() is done as a workaround for + if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) { + user_error("Cannot connect to $host. Banner timeout"); + return false; + } + + /* According to the SSH2 specs, + + "The server MAY send other lines of data before sending the version + string. Each line SHOULD be terminated by a Carriage Return and Line + Feed. Such lines MUST NOT begin with "SSH-", and SHOULD be encoded + in ISO-10646 UTF-8 [RFC3629] (language is not specified). Clients + MUST be able to process such lines." */ + $temp = ''; + $extra = ''; + while (!feof($this->fsock) && !preg_match('#^SSH-(\d\.\d+)#', $temp, $matches)) { + if (substr($temp, -2) == "\r\n") { + $extra.= $temp; + $temp = ''; + } + $temp.= fgets($this->fsock, 255); + } + + if (feof($this->fsock)) { + user_error('Connection closed by server'); + return false; + } + + $this->identifier = $this->_generate_identifier(); + + if (defined('NET_SSH2_LOGGING')) { + $this->_append_log('<-', $extra . $temp); + $this->_append_log('->', $this->identifier . "\r\n"); + } + + $this->server_identifier = trim($temp, "\r\n"); + if (strlen($extra)) { + $this->errors[] = utf8_decode($extra); + } + + if ($matches[1] != '1.99' && $matches[1] != '2.0') { + user_error("Cannot connect to SSH $matches[1] servers"); + return false; + } + + fputs($this->fsock, $this->identifier . "\r\n"); + + $response = $this->_get_binary_packet(); + if ($response === false) { + user_error('Connection closed by server'); + return false; + } + + if (ord($response[0]) != NET_SSH2_MSG_KEXINIT) { + user_error('Expected SSH_MSG_KEXINIT'); + return false; + } + + if (!$this->_key_exchange($response)) { + return false; + } + + $this->bitmap|= NET_SSH2_MASK_CONNECTED; + + return true; + } + + /** + * Generates the SSH identifier + * + * You should overwrite this method in your own class if you want to use another identifier + * + * @access protected + * @return String + */ + function _generate_identifier() + { + $identifier = 'SSH-2.0-phpseclib_0.3'; + + $ext = array(); + if (extension_loaded('mcrypt')) { + $ext[] = 'mcrypt'; + } + + if (extension_loaded('gmp')) { + $ext[] = 'gmp'; + } elseif (extension_loaded('bcmath')) { + $ext[] = 'bcmath'; + } + + if (!empty($ext)) { + $identifier .= ' (' . implode(', ', $ext) . ')'; + } + + return $identifier; + } + + /** + * Key Exchange + * + * @param String $kexinit_payload_server + * @access private + */ + function _key_exchange($kexinit_payload_server) + { + static $kex_algorithms = array( + 'diffie-hellman-group1-sha1', // REQUIRED + 'diffie-hellman-group14-sha1' // REQUIRED + ); + + static $server_host_key_algorithms = array( + 'ssh-rsa', // RECOMMENDED sign Raw RSA Key + 'ssh-dss' // REQUIRED sign Raw DSS Key + ); + + static $encryption_algorithms = false; + if ($encryption_algorithms === false) { + $encryption_algorithms = array( + // from : + 'arcfour256', + 'arcfour128', + + //'arcfour', // OPTIONAL the ARCFOUR stream cipher with a 128-bit key + + // CTR modes from : + 'aes128-ctr', // RECOMMENDED AES (Rijndael) in SDCTR mode, with 128-bit key + 'aes192-ctr', // RECOMMENDED AES with 192-bit key + 'aes256-ctr', // RECOMMENDED AES with 256-bit key + + 'twofish128-ctr', // OPTIONAL Twofish in SDCTR mode, with 128-bit key + 'twofish192-ctr', // OPTIONAL Twofish with 192-bit key + 'twofish256-ctr', // OPTIONAL Twofish with 256-bit key + + 'aes128-cbc', // RECOMMENDED AES with a 128-bit key + 'aes192-cbc', // OPTIONAL AES with a 192-bit key + 'aes256-cbc', // OPTIONAL AES in CBC mode, with a 256-bit key + + 'twofish128-cbc', // OPTIONAL Twofish with a 128-bit key + 'twofish192-cbc', // OPTIONAL Twofish with a 192-bit key + 'twofish256-cbc', + 'twofish-cbc', // OPTIONAL alias for "twofish256-cbc" + // (this is being retained for historical reasons) + + 'blowfish-ctr', // OPTIONAL Blowfish in SDCTR mode + + 'blowfish-cbc', // OPTIONAL Blowfish in CBC mode + + '3des-ctr', // RECOMMENDED Three-key 3DES in SDCTR mode + + '3des-cbc', // REQUIRED three-key 3DES in CBC mode + //'none' // OPTIONAL no encryption; NOT RECOMMENDED + ); + + if (phpseclib_resolve_include_path('Crypt/RC4.php') === false) { + $encryption_algorithms = array_diff( + $encryption_algorithms, + array('arcfour256', 'arcfour128', 'arcfour') + ); + } + if (phpseclib_resolve_include_path('Crypt/Rijndael.php') === false) { + $encryption_algorithms = array_diff( + $encryption_algorithms, + array('aes128-ctr', 'aes192-ctr', 'aes256-ctr', 'aes128-cbc', 'aes192-cbc', 'aes256-cbc') + ); + } + if (phpseclib_resolve_include_path('Crypt/Twofish.php') === false) { + $encryption_algorithms = array_diff( + $encryption_algorithms, + array('twofish128-ctr', 'twofish192-ctr', 'twofish256-ctr', 'twofish128-cbc', 'twofish192-cbc', 'twofish256-cbc', 'twofish-cbc') + ); + } + if (phpseclib_resolve_include_path('Crypt/Blowfish.php') === false) { + $encryption_algorithms = array_diff( + $encryption_algorithms, + array('blowfish-ctr', 'blowfish-cbc') + ); + } + if (phpseclib_resolve_include_path('Crypt/TripleDES.php') === false) { + $encryption_algorithms = array_diff( + $encryption_algorithms, + array('3des-ctr', '3des-cbc') + ); + } + $encryption_algorithms = array_values($encryption_algorithms); + } + + $mac_algorithms = array( + // from : + 'hmac-sha2-256',// RECOMMENDED HMAC-SHA256 (digest length = key length = 32) + + 'hmac-sha1-96', // RECOMMENDED first 96 bits of HMAC-SHA1 (digest length = 12, key length = 20) + 'hmac-sha1', // REQUIRED HMAC-SHA1 (digest length = key length = 20) + 'hmac-md5-96', // OPTIONAL first 96 bits of HMAC-MD5 (digest length = 12, key length = 16) + 'hmac-md5', // OPTIONAL HMAC-MD5 (digest length = key length = 16) + //'none' // OPTIONAL no MAC; NOT RECOMMENDED + ); + + static $compression_algorithms = array( + 'none' // REQUIRED no compression + //'zlib' // OPTIONAL ZLIB (LZ77) compression + ); + + // some SSH servers have buggy implementations of some of the above algorithms + switch ($this->server_identifier) { + case 'SSH-2.0-SSHD': + $mac_algorithms = array_values(array_diff( + $mac_algorithms, + array('hmac-sha1-96', 'hmac-md5-96') + )); + } + + static $str_kex_algorithms, $str_server_host_key_algorithms, + $encryption_algorithms_server_to_client, $mac_algorithms_server_to_client, $compression_algorithms_server_to_client, + $encryption_algorithms_client_to_server, $mac_algorithms_client_to_server, $compression_algorithms_client_to_server; + + if (empty($str_kex_algorithms)) { + $str_kex_algorithms = implode(',', $kex_algorithms); + $str_server_host_key_algorithms = implode(',', $server_host_key_algorithms); + $encryption_algorithms_server_to_client = $encryption_algorithms_client_to_server = implode(',', $encryption_algorithms); + $mac_algorithms_server_to_client = $mac_algorithms_client_to_server = implode(',', $mac_algorithms); + $compression_algorithms_server_to_client = $compression_algorithms_client_to_server = implode(',', $compression_algorithms); + } + + $client_cookie = crypt_random_string(16); + + $response = $kexinit_payload_server; + $this->_string_shift($response, 1); // skip past the message number (it should be SSH_MSG_KEXINIT) + $server_cookie = $this->_string_shift($response, 16); + + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->kex_algorithms = explode(',', $this->_string_shift($response, $temp['length'])); + + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->server_host_key_algorithms = explode(',', $this->_string_shift($response, $temp['length'])); + + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->encryption_algorithms_client_to_server = explode(',', $this->_string_shift($response, $temp['length'])); + + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->encryption_algorithms_server_to_client = explode(',', $this->_string_shift($response, $temp['length'])); + + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->mac_algorithms_client_to_server = explode(',', $this->_string_shift($response, $temp['length'])); + + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->mac_algorithms_server_to_client = explode(',', $this->_string_shift($response, $temp['length'])); + + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->compression_algorithms_client_to_server = explode(',', $this->_string_shift($response, $temp['length'])); + + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->compression_algorithms_server_to_client = explode(',', $this->_string_shift($response, $temp['length'])); + + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->languages_client_to_server = explode(',', $this->_string_shift($response, $temp['length'])); + + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->languages_server_to_client = explode(',', $this->_string_shift($response, $temp['length'])); + + extract(unpack('Cfirst_kex_packet_follows', $this->_string_shift($response, 1))); + $first_kex_packet_follows = $first_kex_packet_follows != 0; + + // the sending of SSH2_MSG_KEXINIT could go in one of two places. this is the second place. + $kexinit_payload_client = pack('Ca*Na*Na*Na*Na*Na*Na*Na*Na*Na*Na*CN', + NET_SSH2_MSG_KEXINIT, $client_cookie, strlen($str_kex_algorithms), $str_kex_algorithms, + strlen($str_server_host_key_algorithms), $str_server_host_key_algorithms, strlen($encryption_algorithms_client_to_server), + $encryption_algorithms_client_to_server, strlen($encryption_algorithms_server_to_client), $encryption_algorithms_server_to_client, + strlen($mac_algorithms_client_to_server), $mac_algorithms_client_to_server, strlen($mac_algorithms_server_to_client), + $mac_algorithms_server_to_client, strlen($compression_algorithms_client_to_server), $compression_algorithms_client_to_server, + strlen($compression_algorithms_server_to_client), $compression_algorithms_server_to_client, 0, '', 0, '', + 0, 0 + ); + + if (!$this->_send_binary_packet($kexinit_payload_client)) { + return false; + } + // here ends the second place. + + // we need to decide upon the symmetric encryption algorithms before we do the diffie-hellman key exchange + for ($i = 0; $i < count($encryption_algorithms) && !in_array($encryption_algorithms[$i], $this->encryption_algorithms_server_to_client); $i++); + if ($i == count($encryption_algorithms)) { + user_error('No compatible server to client encryption algorithms found'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + + // we don't initialize any crypto-objects, yet - we do that, later. for now, we need the lengths to make the + // diffie-hellman key exchange as fast as possible + $decrypt = $encryption_algorithms[$i]; + switch ($decrypt) { + case '3des-cbc': + case '3des-ctr': + $decryptKeyLength = 24; // eg. 192 / 8 + break; + case 'aes256-cbc': + case 'aes256-ctr': + case 'twofish-cbc': + case 'twofish256-cbc': + case 'twofish256-ctr': + $decryptKeyLength = 32; // eg. 256 / 8 + break; + case 'aes192-cbc': + case 'aes192-ctr': + case 'twofish192-cbc': + case 'twofish192-ctr': + $decryptKeyLength = 24; // eg. 192 / 8 + break; + case 'aes128-cbc': + case 'aes128-ctr': + case 'twofish128-cbc': + case 'twofish128-ctr': + case 'blowfish-cbc': + case 'blowfish-ctr': + $decryptKeyLength = 16; // eg. 128 / 8 + break; + case 'arcfour': + case 'arcfour128': + $decryptKeyLength = 16; // eg. 128 / 8 + break; + case 'arcfour256': + $decryptKeyLength = 32; // eg. 128 / 8 + break; + case 'none'; + $decryptKeyLength = 0; + } + + for ($i = 0; $i < count($encryption_algorithms) && !in_array($encryption_algorithms[$i], $this->encryption_algorithms_client_to_server); $i++); + if ($i == count($encryption_algorithms)) { + user_error('No compatible client to server encryption algorithms found'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + + $encrypt = $encryption_algorithms[$i]; + switch ($encrypt) { + case '3des-cbc': + case '3des-ctr': + $encryptKeyLength = 24; + break; + case 'aes256-cbc': + case 'aes256-ctr': + case 'twofish-cbc': + case 'twofish256-cbc': + case 'twofish256-ctr': + $encryptKeyLength = 32; + break; + case 'aes192-cbc': + case 'aes192-ctr': + case 'twofish192-cbc': + case 'twofish192-ctr': + $encryptKeyLength = 24; + break; + case 'aes128-cbc': + case 'aes128-ctr': + case 'twofish128-cbc': + case 'twofish128-ctr': + case 'blowfish-cbc': + case 'blowfish-ctr': + $encryptKeyLength = 16; + break; + case 'arcfour': + case 'arcfour128': + $encryptKeyLength = 16; + break; + case 'arcfour256': + $encryptKeyLength = 32; + break; + case 'none'; + $encryptKeyLength = 0; + } + + $keyLength = $decryptKeyLength > $encryptKeyLength ? $decryptKeyLength : $encryptKeyLength; + + // through diffie-hellman key exchange a symmetric key is obtained + for ($i = 0; $i < count($kex_algorithms) && !in_array($kex_algorithms[$i], $this->kex_algorithms); $i++); + if ($i == count($kex_algorithms)) { + user_error('No compatible key exchange algorithms found'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + + switch ($kex_algorithms[$i]) { + // see http://tools.ietf.org/html/rfc2409#section-6.2 and + // http://tools.ietf.org/html/rfc2412, appendex E + case 'diffie-hellman-group1-sha1': + $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . + '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . + '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . + 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF'; + break; + // see http://tools.ietf.org/html/rfc3526#section-3 + case 'diffie-hellman-group14-sha1': + $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . + '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . + '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . + 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . + '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . + '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . + 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . + '3995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF'; + break; + } + + // For both diffie-hellman-group1-sha1 and diffie-hellman-group14-sha1 + // the generator field element is 2 (decimal) and the hash function is sha1. + $g = new Math_BigInteger(2); + $prime = new Math_BigInteger($prime, 16); + $kexHash = new Crypt_Hash('sha1'); + //$q = $p->bitwise_rightShift(1); + + /* To increase the speed of the key exchange, both client and server may + reduce the size of their private exponents. It should be at least + twice as long as the key material that is generated from the shared + secret. For more details, see the paper by van Oorschot and Wiener + [VAN-OORSCHOT]. + + -- http://tools.ietf.org/html/rfc4419#section-6.2 */ + $one = new Math_BigInteger(1); + $keyLength = min($keyLength, $kexHash->getLength()); + $max = $one->bitwise_leftShift(16 * $keyLength); // 2 * 8 * $keyLength + $max = $max->subtract($one); + + $x = $one->random($one, $max); + $e = $g->modPow($x, $prime); + + $eBytes = $e->toBytes(true); + $data = pack('CNa*', NET_SSH2_MSG_KEXDH_INIT, strlen($eBytes), $eBytes); + + if (!$this->_send_binary_packet($data)) { + user_error('Connection closed by server'); + return false; + } + + $response = $this->_get_binary_packet(); + if ($response === false) { + user_error('Connection closed by server'); + return false; + } + extract(unpack('Ctype', $this->_string_shift($response, 1))); + + if ($type != NET_SSH2_MSG_KEXDH_REPLY) { + user_error('Expected SSH_MSG_KEXDH_REPLY'); + return false; + } + + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->server_public_host_key = $server_public_host_key = $this->_string_shift($response, $temp['length']); + + $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); + $public_key_format = $this->_string_shift($server_public_host_key, $temp['length']); + + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $fBytes = $this->_string_shift($response, $temp['length']); + $f = new Math_BigInteger($fBytes, -256); + + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->signature = $this->_string_shift($response, $temp['length']); + + $temp = unpack('Nlength', $this->_string_shift($this->signature, 4)); + $this->signature_format = $this->_string_shift($this->signature, $temp['length']); + + $key = $f->modPow($x, $prime); + $keyBytes = $key->toBytes(true); + + $this->exchange_hash = pack('Na*Na*Na*Na*Na*Na*Na*Na*', + strlen($this->identifier), $this->identifier, strlen($this->server_identifier), $this->server_identifier, + strlen($kexinit_payload_client), $kexinit_payload_client, strlen($kexinit_payload_server), + $kexinit_payload_server, strlen($this->server_public_host_key), $this->server_public_host_key, strlen($eBytes), + $eBytes, strlen($fBytes), $fBytes, strlen($keyBytes), $keyBytes + ); + + $this->exchange_hash = $kexHash->hash($this->exchange_hash); + + if ($this->session_id === false) { + $this->session_id = $this->exchange_hash; + } + + for ($i = 0; $i < count($server_host_key_algorithms) && !in_array($server_host_key_algorithms[$i], $this->server_host_key_algorithms); $i++); + if ($i == count($server_host_key_algorithms)) { + user_error('No compatible server host key algorithms found'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + + if ($public_key_format != $server_host_key_algorithms[$i] || $this->signature_format != $server_host_key_algorithms[$i]) { + user_error('Server Host Key Algorithm Mismatch'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + + $packet = pack('C', + NET_SSH2_MSG_NEWKEYS + ); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $response = $this->_get_binary_packet(); + + if ($response === false) { + user_error('Connection closed by server'); + return false; + } + + extract(unpack('Ctype', $this->_string_shift($response, 1))); + + if ($type != NET_SSH2_MSG_NEWKEYS) { + user_error('Expected SSH_MSG_NEWKEYS'); + return false; + } + + switch ($encrypt) { + case '3des-cbc': + if (!class_exists('Crypt_TripleDES')) { + include_once 'Crypt/TripleDES.php'; + } + $this->encrypt = new Crypt_TripleDES(); + // $this->encrypt_block_size = 64 / 8 == the default + break; + case '3des-ctr': + if (!class_exists('Crypt_TripleDES')) { + include_once 'Crypt/TripleDES.php'; + } + $this->encrypt = new Crypt_TripleDES(CRYPT_DES_MODE_CTR); + // $this->encrypt_block_size = 64 / 8 == the default + break; + case 'aes256-cbc': + case 'aes192-cbc': + case 'aes128-cbc': + if (!class_exists('Crypt_Rijndael')) { + include_once 'Crypt/Rijndael.php'; + } + $this->encrypt = new Crypt_Rijndael(); + $this->encrypt_block_size = 16; // eg. 128 / 8 + break; + case 'aes256-ctr': + case 'aes192-ctr': + case 'aes128-ctr': + if (!class_exists('Crypt_Rijndael')) { + include_once 'Crypt/Rijndael.php'; + } + $this->encrypt = new Crypt_Rijndael(CRYPT_RIJNDAEL_MODE_CTR); + $this->encrypt_block_size = 16; // eg. 128 / 8 + break; + case 'blowfish-cbc': + if (!class_exists('Crypt_Blowfish')) { + include_once 'Crypt/Blowfish.php'; + } + $this->encrypt = new Crypt_Blowfish(); + $this->encrypt_block_size = 8; + break; + case 'blowfish-ctr': + if (!class_exists('Crypt_Blowfish')) { + include_once 'Crypt/Blowfish.php'; + } + $this->encrypt = new Crypt_Blowfish(CRYPT_BLOWFISH_MODE_CTR); + $this->encrypt_block_size = 8; + break; + case 'twofish128-cbc': + case 'twofish192-cbc': + case 'twofish256-cbc': + case 'twofish-cbc': + if (!class_exists('Crypt_Twofish')) { + include_once 'Crypt/Twofish.php'; + } + $this->encrypt = new Crypt_Twofish(); + $this->encrypt_block_size = 16; + break; + case 'twofish128-ctr': + case 'twofish192-ctr': + case 'twofish256-ctr': + if (!class_exists('Crypt_Twofish')) { + include_once 'Crypt/Twofish.php'; + } + $this->encrypt = new Crypt_Twofish(CRYPT_TWOFISH_MODE_CTR); + $this->encrypt_block_size = 16; + break; + case 'arcfour': + case 'arcfour128': + case 'arcfour256': + if (!class_exists('Crypt_RC4')) { + include_once 'Crypt/RC4.php'; + } + $this->encrypt = new Crypt_RC4(); + break; + case 'none'; + //$this->encrypt = new Crypt_Null(); + } + + switch ($decrypt) { + case '3des-cbc': + if (!class_exists('Crypt_TripleDES')) { + include_once 'Crypt/TripleDES.php'; + } + $this->decrypt = new Crypt_TripleDES(); + break; + case '3des-ctr': + if (!class_exists('Crypt_TripleDES')) { + include_once 'Crypt/TripleDES.php'; + } + $this->decrypt = new Crypt_TripleDES(CRYPT_DES_MODE_CTR); + break; + case 'aes256-cbc': + case 'aes192-cbc': + case 'aes128-cbc': + if (!class_exists('Crypt_Rijndael')) { + include_once 'Crypt/Rijndael.php'; + } + $this->decrypt = new Crypt_Rijndael(); + $this->decrypt_block_size = 16; + break; + case 'aes256-ctr': + case 'aes192-ctr': + case 'aes128-ctr': + if (!class_exists('Crypt_Rijndael')) { + include_once 'Crypt/Rijndael.php'; + } + $this->decrypt = new Crypt_Rijndael(CRYPT_RIJNDAEL_MODE_CTR); + $this->decrypt_block_size = 16; + break; + case 'blowfish-cbc': + if (!class_exists('Crypt_Blowfish')) { + include_once 'Crypt/Blowfish.php'; + } + $this->decrypt = new Crypt_Blowfish(); + $this->decrypt_block_size = 8; + break; + case 'blowfish-ctr': + if (!class_exists('Crypt_Blowfish')) { + include_once 'Crypt/Blowfish.php'; + } + $this->decrypt = new Crypt_Blowfish(CRYPT_BLOWFISH_MODE_CTR); + $this->decrypt_block_size = 8; + break; + case 'twofish128-cbc': + case 'twofish192-cbc': + case 'twofish256-cbc': + case 'twofish-cbc': + if (!class_exists('Crypt_Twofish')) { + include_once 'Crypt/Twofish.php'; + } + $this->decrypt = new Crypt_Twofish(); + $this->decrypt_block_size = 16; + break; + case 'twofish128-ctr': + case 'twofish192-ctr': + case 'twofish256-ctr': + if (!class_exists('Crypt_Twofish')) { + include_once 'Crypt/Twofish.php'; + } + $this->decrypt = new Crypt_Twofish(CRYPT_TWOFISH_MODE_CTR); + $this->decrypt_block_size = 16; + break; + case 'arcfour': + case 'arcfour128': + case 'arcfour256': + if (!class_exists('Crypt_RC4')) { + include_once 'Crypt/RC4.php'; + } + $this->decrypt = new Crypt_RC4(); + break; + case 'none'; + //$this->decrypt = new Crypt_Null(); + } + + $keyBytes = pack('Na*', strlen($keyBytes), $keyBytes); + + if ($this->encrypt) { + $this->encrypt->enableContinuousBuffer(); + $this->encrypt->disablePadding(); + + $iv = $kexHash->hash($keyBytes . $this->exchange_hash . 'A' . $this->session_id); + while ($this->encrypt_block_size > strlen($iv)) { + $iv.= $kexHash->hash($keyBytes . $this->exchange_hash . $iv); + } + $this->encrypt->setIV(substr($iv, 0, $this->encrypt_block_size)); + + $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'C' . $this->session_id); + while ($encryptKeyLength > strlen($key)) { + $key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key); + } + $this->encrypt->setKey(substr($key, 0, $encryptKeyLength)); + } + + if ($this->decrypt) { + $this->decrypt->enableContinuousBuffer(); + $this->decrypt->disablePadding(); + + $iv = $kexHash->hash($keyBytes . $this->exchange_hash . 'B' . $this->session_id); + while ($this->decrypt_block_size > strlen($iv)) { + $iv.= $kexHash->hash($keyBytes . $this->exchange_hash . $iv); + } + $this->decrypt->setIV(substr($iv, 0, $this->decrypt_block_size)); + + $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'D' . $this->session_id); + while ($decryptKeyLength > strlen($key)) { + $key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key); + } + $this->decrypt->setKey(substr($key, 0, $decryptKeyLength)); + } + + /* The "arcfour128" algorithm is the RC4 cipher, as described in + [SCHNEIER], using a 128-bit key. The first 1536 bytes of keystream + generated by the cipher MUST be discarded, and the first byte of the + first encrypted packet MUST be encrypted using the 1537th byte of + keystream. + + -- http://tools.ietf.org/html/rfc4345#section-4 */ + if ($encrypt == 'arcfour128' || $encrypt == 'arcfour256') { + $this->encrypt->encrypt(str_repeat("\0", 1536)); + } + if ($decrypt == 'arcfour128' || $decrypt == 'arcfour256') { + $this->decrypt->decrypt(str_repeat("\0", 1536)); + } + + for ($i = 0; $i < count($mac_algorithms) && !in_array($mac_algorithms[$i], $this->mac_algorithms_client_to_server); $i++); + if ($i == count($mac_algorithms)) { + user_error('No compatible client to server message authentication algorithms found'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + + $createKeyLength = 0; // ie. $mac_algorithms[$i] == 'none' + switch ($mac_algorithms[$i]) { + case 'hmac-sha2-256': + $this->hmac_create = new Crypt_Hash('sha256'); + $createKeyLength = 32; + break; + case 'hmac-sha1': + $this->hmac_create = new Crypt_Hash('sha1'); + $createKeyLength = 20; + break; + case 'hmac-sha1-96': + $this->hmac_create = new Crypt_Hash('sha1-96'); + $createKeyLength = 20; + break; + case 'hmac-md5': + $this->hmac_create = new Crypt_Hash('md5'); + $createKeyLength = 16; + break; + case 'hmac-md5-96': + $this->hmac_create = new Crypt_Hash('md5-96'); + $createKeyLength = 16; + } + + for ($i = 0; $i < count($mac_algorithms) && !in_array($mac_algorithms[$i], $this->mac_algorithms_server_to_client); $i++); + if ($i == count($mac_algorithms)) { + user_error('No compatible server to client message authentication algorithms found'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + + $checkKeyLength = 0; + $this->hmac_size = 0; + switch ($mac_algorithms[$i]) { + case 'hmac-sha2-256': + $this->hmac_check = new Crypt_Hash('sha256'); + $checkKeyLength = 32; + $this->hmac_size = 32; + break; + case 'hmac-sha1': + $this->hmac_check = new Crypt_Hash('sha1'); + $checkKeyLength = 20; + $this->hmac_size = 20; + break; + case 'hmac-sha1-96': + $this->hmac_check = new Crypt_Hash('sha1-96'); + $checkKeyLength = 20; + $this->hmac_size = 12; + break; + case 'hmac-md5': + $this->hmac_check = new Crypt_Hash('md5'); + $checkKeyLength = 16; + $this->hmac_size = 16; + break; + case 'hmac-md5-96': + $this->hmac_check = new Crypt_Hash('md5-96'); + $checkKeyLength = 16; + $this->hmac_size = 12; + } + + $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'E' . $this->session_id); + while ($createKeyLength > strlen($key)) { + $key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key); + } + $this->hmac_create->setKey(substr($key, 0, $createKeyLength)); + + $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'F' . $this->session_id); + while ($checkKeyLength > strlen($key)) { + $key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key); + } + $this->hmac_check->setKey(substr($key, 0, $checkKeyLength)); + + for ($i = 0; $i < count($compression_algorithms) && !in_array($compression_algorithms[$i], $this->compression_algorithms_server_to_client); $i++); + if ($i == count($compression_algorithms)) { + user_error('No compatible server to client compression algorithms found'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + $this->decompress = $compression_algorithms[$i] == 'zlib'; + + for ($i = 0; $i < count($compression_algorithms) && !in_array($compression_algorithms[$i], $this->compression_algorithms_client_to_server); $i++); + if ($i == count($compression_algorithms)) { + user_error('No compatible client to server compression algorithms found'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + $this->compress = $compression_algorithms[$i] == 'zlib'; + + return true; + } + + /** + * Login + * + * The $password parameter can be a plaintext password, a Crypt_RSA object or an array + * + * @param String $username + * @param Mixed $password + * @param Mixed $... + * @return Boolean + * @see _login + * @access public + */ + function login($username) + { + $args = func_get_args(); + return call_user_func_array(array(&$this, '_login'), $args); + } + + /** + * Login Helper + * + * @param String $username + * @param Mixed $password + * @param Mixed $... + * @return Boolean + * @see _login_helper + * @access private + */ + function _login($username) + { + if (!($this->bitmap & NET_SSH2_MASK_CONSTRUCTOR)) { + if (!$this->_connect()) { + return false; + } + } + + $args = array_slice(func_get_args(), 1); + if (empty($args)) { + return $this->_login_helper($username); + } + + foreach ($args as $arg) { + if ($this->_login_helper($username, $arg)) { + return true; + } + } + return false; + } + + /** + * Login Helper + * + * @param String $username + * @param optional String $password + * @return Boolean + * @access private + * @internal It might be worthwhile, at some point, to protect against {@link http://tools.ietf.org/html/rfc4251#section-9.3.9 traffic analysis} + * by sending dummy SSH_MSG_IGNORE messages. + */ + function _login_helper($username, $password = null) + { + if (!($this->bitmap & NET_SSH2_MASK_CONNECTED)) { + return false; + } + + if (!($this->bitmap & NET_SSH2_MASK_LOGIN_REQ)) { + $packet = pack('CNa*', + NET_SSH2_MSG_SERVICE_REQUEST, strlen('ssh-userauth'), 'ssh-userauth' + ); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $response = $this->_get_binary_packet(); + if ($response === false) { + user_error('Connection closed by server'); + return false; + } + + extract(unpack('Ctype', $this->_string_shift($response, 1))); + + if ($type != NET_SSH2_MSG_SERVICE_ACCEPT) { + user_error('Expected SSH_MSG_SERVICE_ACCEPT'); + return false; + } + $this->bitmap |= NET_SSH2_MASK_LOGIN_REQ; + } + + if (strlen($this->last_interactive_response)) { + return !is_string($password) && !is_array($password) ? false : $this->_keyboard_interactive_process($password); + } + + // although PHP5's get_class() preserves the case, PHP4's does not + if (is_object($password)) { + switch (strtolower(get_class($password))) { + case 'crypt_rsa': + return $this->_privatekey_login($username, $password); + case 'system_ssh_agent': + return $this->_ssh_agent_login($username, $password); + } + } + + if (is_array($password)) { + if ($this->_keyboard_interactive_login($username, $password)) { + $this->bitmap |= NET_SSH2_MASK_LOGIN; + return true; + } + return false; + } + + if (!isset($password)) { + $packet = pack('CNa*Na*Na*', + NET_SSH2_MSG_USERAUTH_REQUEST, strlen($username), $username, strlen('ssh-connection'), 'ssh-connection', + strlen('none'), 'none' + ); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $response = $this->_get_binary_packet(); + if ($response === false) { + user_error('Connection closed by server'); + return false; + } + + extract(unpack('Ctype', $this->_string_shift($response, 1))); + + switch ($type) { + case NET_SSH2_MSG_USERAUTH_SUCCESS: + $this->bitmap |= NET_SSH2_MASK_LOGIN; + return true; + //case NET_SSH2_MSG_USERAUTH_FAILURE: + default: + return false; + } + } + + $packet = pack('CNa*Na*Na*CNa*', + NET_SSH2_MSG_USERAUTH_REQUEST, strlen($username), $username, strlen('ssh-connection'), 'ssh-connection', + strlen('password'), 'password', 0, strlen($password), $password + ); + + // remove the username and password from the logged packet + if (!defined('NET_SSH2_LOGGING')) { + $logged = null; + } else { + $logged = pack('CNa*Na*Na*CNa*', + NET_SSH2_MSG_USERAUTH_REQUEST, strlen('username'), 'username', strlen('ssh-connection'), 'ssh-connection', + strlen('password'), 'password', 0, strlen('password'), 'password' + ); + } + + if (!$this->_send_binary_packet($packet, $logged)) { + return false; + } + + $response = $this->_get_binary_packet(); + if ($response === false) { + user_error('Connection closed by server'); + return false; + } + + extract(unpack('Ctype', $this->_string_shift($response, 1))); + + switch ($type) { + case NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ: // in theory, the password can be changed + if (defined('NET_SSH2_LOGGING')) { + $this->message_number_log[count($this->message_number_log) - 1] = 'NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ'; + } + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $this->errors[] = 'SSH_MSG_USERAUTH_PASSWD_CHANGEREQ: ' . utf8_decode($this->_string_shift($response, $length)); + return $this->_disconnect(NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER); + case NET_SSH2_MSG_USERAUTH_FAILURE: + // can we use keyboard-interactive authentication? if not then either the login is bad or the server employees + // multi-factor authentication + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $auth_methods = explode(',', $this->_string_shift($response, $length)); + extract(unpack('Cpartial_success', $this->_string_shift($response, 1))); + $partial_success = $partial_success != 0; + + if (!$partial_success && in_array('keyboard-interactive', $auth_methods)) { + if ($this->_keyboard_interactive_login($username, $password)) { + $this->bitmap |= NET_SSH2_MASK_LOGIN; + return true; + } + return false; + } + return false; + case NET_SSH2_MSG_USERAUTH_SUCCESS: + $this->bitmap |= NET_SSH2_MASK_LOGIN; + return true; + } + + return false; + } + + /** + * Login via keyboard-interactive authentication + * + * See {@link http://tools.ietf.org/html/rfc4256 RFC4256} for details. This is not a full-featured keyboard-interactive authenticator. + * + * @param String $username + * @param String $password + * @return Boolean + * @access private + */ + function _keyboard_interactive_login($username, $password) + { + $packet = pack('CNa*Na*Na*Na*Na*', + NET_SSH2_MSG_USERAUTH_REQUEST, strlen($username), $username, strlen('ssh-connection'), 'ssh-connection', + strlen('keyboard-interactive'), 'keyboard-interactive', 0, '', 0, '' + ); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + return $this->_keyboard_interactive_process($password); + } + + /** + * Handle the keyboard-interactive requests / responses. + * + * @param String $responses... + * @return Boolean + * @access private + */ + function _keyboard_interactive_process() + { + $responses = func_get_args(); + + if (strlen($this->last_interactive_response)) { + $response = $this->last_interactive_response; + } else { + $orig = $response = $this->_get_binary_packet(); + if ($response === false) { + user_error('Connection closed by server'); + return false; + } + } + + extract(unpack('Ctype', $this->_string_shift($response, 1))); + + switch ($type) { + case NET_SSH2_MSG_USERAUTH_INFO_REQUEST: + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $this->_string_shift($response, $length); // name; may be empty + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $this->_string_shift($response, $length); // instruction; may be empty + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $this->_string_shift($response, $length); // language tag; may be empty + extract(unpack('Nnum_prompts', $this->_string_shift($response, 4))); + + for ($i = 0; $i < count($responses); $i++) { + if (is_array($responses[$i])) { + foreach ($responses[$i] as $key => $value) { + $this->keyboard_requests_responses[$key] = $value; + } + unset($responses[$i]); + } + } + $responses = array_values($responses); + + if (isset($this->keyboard_requests_responses)) { + for ($i = 0; $i < $num_prompts; $i++) { + extract(unpack('Nlength', $this->_string_shift($response, 4))); + // prompt - ie. "Password: "; must not be empty + $prompt = $this->_string_shift($response, $length); + //$echo = $this->_string_shift($response) != chr(0); + foreach ($this->keyboard_requests_responses as $key => $value) { + if (substr($prompt, 0, strlen($key)) == $key) { + $responses[] = $value; + break; + } + } + } + } + + // see http://tools.ietf.org/html/rfc4256#section-3.2 + if (strlen($this->last_interactive_response)) { + $this->last_interactive_response = ''; + } else if (defined('NET_SSH2_LOGGING')) { + $this->message_number_log[count($this->message_number_log) - 1] = str_replace( + 'UNKNOWN', + 'NET_SSH2_MSG_USERAUTH_INFO_REQUEST', + $this->message_number_log[count($this->message_number_log) - 1] + ); + } + + if (!count($responses) && $num_prompts) { + $this->last_interactive_response = $orig; + return false; + } + + /* + After obtaining the requested information from the user, the client + MUST respond with an SSH_MSG_USERAUTH_INFO_RESPONSE message. + */ + // see http://tools.ietf.org/html/rfc4256#section-3.4 + $packet = $logged = pack('CN', NET_SSH2_MSG_USERAUTH_INFO_RESPONSE, count($responses)); + for ($i = 0; $i < count($responses); $i++) { + $packet.= pack('Na*', strlen($responses[$i]), $responses[$i]); + $logged.= pack('Na*', strlen('dummy-answer'), 'dummy-answer'); + } + + if (!$this->_send_binary_packet($packet, $logged)) { + return false; + } + + if (defined('NET_SSH2_LOGGING') && NET_SSH2_LOGGING == NET_SSH2_LOG_COMPLEX) { + $this->message_number_log[count($this->message_number_log) - 1] = str_replace( + 'UNKNOWN', + 'NET_SSH2_MSG_USERAUTH_INFO_RESPONSE', + $this->message_number_log[count($this->message_number_log) - 1] + ); + } + + /* + After receiving the response, the server MUST send either an + SSH_MSG_USERAUTH_SUCCESS, SSH_MSG_USERAUTH_FAILURE, or another + SSH_MSG_USERAUTH_INFO_REQUEST message. + */ + // maybe phpseclib should force close the connection after x request / responses? unless something like that is done + // there could be an infinite loop of request / responses. + return $this->_keyboard_interactive_process(); + case NET_SSH2_MSG_USERAUTH_SUCCESS: + return true; + case NET_SSH2_MSG_USERAUTH_FAILURE: + return false; + } + + return false; + } + + /** + * Login with an ssh-agent provided key + * + * @param String $username + * @param System_SSH_Agent $agent + * @return Boolean + * @access private + */ + function _ssh_agent_login($username, $agent) + { + $keys = $agent->requestIdentities(); + foreach ($keys as $key) { + if ($this->_privatekey_login($username, $key)) { + return true; + } + } + + return false; + } + + /** + * Login with an RSA private key + * + * @param String $username + * @param Crypt_RSA $password + * @return Boolean + * @access private + * @internal It might be worthwhile, at some point, to protect against {@link http://tools.ietf.org/html/rfc4251#section-9.3.9 traffic analysis} + * by sending dummy SSH_MSG_IGNORE messages. + */ + function _privatekey_login($username, $privatekey) + { + // see http://tools.ietf.org/html/rfc4253#page-15 + $publickey = $privatekey->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_RAW); + if ($publickey === false) { + return false; + } + + $publickey = array( + 'e' => $publickey['e']->toBytes(true), + 'n' => $publickey['n']->toBytes(true) + ); + $publickey = pack('Na*Na*Na*', + strlen('ssh-rsa'), 'ssh-rsa', strlen($publickey['e']), $publickey['e'], strlen($publickey['n']), $publickey['n'] + ); + + $part1 = pack('CNa*Na*Na*', + NET_SSH2_MSG_USERAUTH_REQUEST, strlen($username), $username, strlen('ssh-connection'), 'ssh-connection', + strlen('publickey'), 'publickey' + ); + $part2 = pack('Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publickey), $publickey); + + $packet = $part1 . chr(0) . $part2; + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $response = $this->_get_binary_packet(); + if ($response === false) { + user_error('Connection closed by server'); + return false; + } + + extract(unpack('Ctype', $this->_string_shift($response, 1))); + + switch ($type) { + case NET_SSH2_MSG_USERAUTH_FAILURE: + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $this->errors[] = 'SSH_MSG_USERAUTH_FAILURE: ' . $this->_string_shift($response, $length); + return false; + case NET_SSH2_MSG_USERAUTH_PK_OK: + // we'll just take it on faith that the public key blob and the public key algorithm name are as + // they should be + if (defined('NET_SSH2_LOGGING') && NET_SSH2_LOGGING == NET_SSH2_LOG_COMPLEX) { + $this->message_number_log[count($this->message_number_log) - 1] = str_replace( + 'UNKNOWN', + 'NET_SSH2_MSG_USERAUTH_PK_OK', + $this->message_number_log[count($this->message_number_log) - 1] + ); + } + } + + $packet = $part1 . chr(1) . $part2; + $privatekey->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); + $signature = $privatekey->sign(pack('Na*a*', strlen($this->session_id), $this->session_id, $packet)); + $signature = pack('Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($signature), $signature); + $packet.= pack('Na*', strlen($signature), $signature); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $response = $this->_get_binary_packet(); + if ($response === false) { + user_error('Connection closed by server'); + return false; + } + + extract(unpack('Ctype', $this->_string_shift($response, 1))); + + switch ($type) { + case NET_SSH2_MSG_USERAUTH_FAILURE: + // either the login is bad or the server employs multi-factor authentication + return false; + case NET_SSH2_MSG_USERAUTH_SUCCESS: + $this->bitmap |= NET_SSH2_MASK_LOGIN; + return true; + } + + return false; + } + + /** + * Set Timeout + * + * $ssh->exec('ping 127.0.0.1'); on a Linux host will never return and will run indefinitely. setTimeout() makes it so it'll timeout. + * Setting $timeout to false or 0 will mean there is no timeout. + * + * @param Mixed $timeout + * @access public + */ + function setTimeout($timeout) + { + $this->timeout = $this->curTimeout = $timeout; + } + + /** + * Get the output from stdError + * + * @access public + */ + function getStdError() + { + return $this->stdErrorLog; + } + + /** + * Execute Command + * + * If $callback is set to false then Net_SSH2::_get_channel_packet(NET_SSH2_CHANNEL_EXEC) will need to be called manually. + * In all likelihood, this is not a feature you want to be taking advantage of. + * + * @param String $command + * @param optional Callback $callback + * @return String + * @access public + */ + function exec($command, $callback = null) + { + $this->curTimeout = $this->timeout; + $this->is_timeout = false; + $this->stdErrorLog = ''; + + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + // RFC4254 defines the (client) window size as "bytes the other party can send before it must wait for the window to + // be adjusted". 0x7FFFFFFF is, at 2GB, the max size. technically, it should probably be decremented, but, + // honestly, if you're transfering more than 2GB, you probably shouldn't be using phpseclib, anyway. + // see http://tools.ietf.org/html/rfc4254#section-5.2 for more info + $this->window_size_server_to_client[NET_SSH2_CHANNEL_EXEC] = $this->window_size; + // 0x8000 is the maximum max packet size, per http://tools.ietf.org/html/rfc4253#section-6.1, although since PuTTy + // uses 0x4000, that's what will be used here, as well. + $packet_size = 0x4000; + + $packet = pack('CNa*N3', + NET_SSH2_MSG_CHANNEL_OPEN, strlen('session'), 'session', NET_SSH2_CHANNEL_EXEC, $this->window_size_server_to_client[NET_SSH2_CHANNEL_EXEC], $packet_size); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $this->channel_status[NET_SSH2_CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_OPEN; + + $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_EXEC); + if ($response === false) { + return false; + } + + if ($this->request_pty === true) { + $terminal_modes = pack('C', NET_SSH2_TTY_OP_END); + $packet = pack('CNNa*CNa*N5a*', + NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SSH2_CHANNEL_EXEC], strlen('pty-req'), 'pty-req', 1, strlen('vt100'), 'vt100', + $this->windowColumns, $this->windowRows, 0, 0, strlen($terminal_modes), $terminal_modes); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + $response = $this->_get_binary_packet(); + if ($response === false) { + user_error('Connection closed by server'); + return false; + } + + list(, $type) = unpack('C', $this->_string_shift($response, 1)); + + switch ($type) { + case NET_SSH2_MSG_CHANNEL_SUCCESS: + break; + case NET_SSH2_MSG_CHANNEL_FAILURE: + default: + user_error('Unable to request pseudo-terminal'); + return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); + } + $this->in_request_pty_exec = true; + } + + // sending a pty-req SSH_MSG_CHANNEL_REQUEST message is unnecessary and, in fact, in most cases, slows things + // down. the one place where it might be desirable is if you're doing something like Net_SSH2::exec('ping localhost &'). + // with a pty-req SSH_MSG_CHANNEL_REQUEST, exec() will return immediately and the ping process will then + // then immediately terminate. without such a request exec() will loop indefinitely. the ping process won't end but + // neither will your script. + + // although, in theory, the size of SSH_MSG_CHANNEL_REQUEST could exceed the maximum packet size established by + // SSH_MSG_CHANNEL_OPEN_CONFIRMATION, RFC4254#section-5.1 states that the "maximum packet size" refers to the + // "maximum size of an individual data packet". ie. SSH_MSG_CHANNEL_DATA. RFC4254#section-5.2 corroborates. + $packet = pack('CNNa*CNa*', + NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SSH2_CHANNEL_EXEC], strlen('exec'), 'exec', 1, strlen($command), $command); + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $this->channel_status[NET_SSH2_CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_REQUEST; + + $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_EXEC); + if ($response === false) { + return false; + } + + $this->channel_status[NET_SSH2_CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_DATA; + + if ($callback === false || $this->in_request_pty_exec) { + return true; + } + + $output = ''; + while (true) { + $temp = $this->_get_channel_packet(NET_SSH2_CHANNEL_EXEC); + switch (true) { + case $temp === true: + return is_callable($callback) ? true : $output; + case $temp === false: + return false; + default: + if (is_callable($callback)) { + if (call_user_func($callback, $temp) === true) { + $this->_close_channel(NET_SSH2_CHANNEL_EXEC); + return true; + } + } else { + $output.= $temp; + } + } + } + } + + /** + * Creates an interactive shell + * + * @see Net_SSH2::read() + * @see Net_SSH2::write() + * @return Boolean + * @access private + */ + function _initShell() + { + if ($this->in_request_pty_exec === true) { + return true; + } + + $this->window_size_server_to_client[NET_SSH2_CHANNEL_SHELL] = $this->window_size; + $packet_size = 0x4000; + + $packet = pack('CNa*N3', + NET_SSH2_MSG_CHANNEL_OPEN, strlen('session'), 'session', NET_SSH2_CHANNEL_SHELL, $this->window_size_server_to_client[NET_SSH2_CHANNEL_SHELL], $packet_size); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $this->channel_status[NET_SSH2_CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_OPEN; + + $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_SHELL); + if ($response === false) { + return false; + } + + $terminal_modes = pack('C', NET_SSH2_TTY_OP_END); + $packet = pack('CNNa*CNa*N5a*', + NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SSH2_CHANNEL_SHELL], strlen('pty-req'), 'pty-req', 1, strlen('vt100'), 'vt100', + $this->windowColumns, $this->windowRows, 0, 0, strlen($terminal_modes), $terminal_modes); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $response = $this->_get_binary_packet(); + if ($response === false) { + user_error('Connection closed by server'); + return false; + } + + list(, $type) = unpack('C', $this->_string_shift($response, 1)); + + switch ($type) { + case NET_SSH2_MSG_CHANNEL_SUCCESS: + // if a pty can't be opened maybe commands can still be executed + case NET_SSH2_MSG_CHANNEL_FAILURE: + break; + default: + user_error('Unable to request pseudo-terminal'); + return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); + } + + $packet = pack('CNNa*C', + NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SSH2_CHANNEL_SHELL], strlen('shell'), 'shell', 1); + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $this->channel_status[NET_SSH2_CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_REQUEST; + + $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_SHELL); + if ($response === false) { + return false; + } + + $this->channel_status[NET_SSH2_CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_DATA; + + $this->bitmap |= NET_SSH2_MASK_SHELL; + + return true; + } + + /** + * Return the channel to be used with read() / write() + * + * @see Net_SSH2::read() + * @see Net_SSH2::write() + * @return Integer + * @access public + */ + function _get_interactive_channel() + { + switch (true) { + case $this->in_subsystem: + return NET_SSH2_CHANNEL_SUBSYSTEM; + case $this->in_request_pty_exec: + return NET_SSH2_CHANNEL_EXEC; + default: + return NET_SSH2_CHANNEL_SHELL; + } + } + + /** + * Returns the output of an interactive shell + * + * Returns when there's a match for $expect, which can take the form of a string literal or, + * if $mode == NET_SSH2_READ_REGEX, a regular expression. + * + * @see Net_SSH2::write() + * @param String $expect + * @param Integer $mode + * @return String + * @access public + */ + function read($expect = '', $mode = NET_SSH2_READ_SIMPLE) + { + $this->curTimeout = $this->timeout; + $this->is_timeout = false; + + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + user_error('Operation disallowed prior to login()'); + return false; + } + + if (!($this->bitmap & NET_SSH2_MASK_SHELL) && !$this->_initShell()) { + user_error('Unable to initiate an interactive shell session'); + return false; + } + + $channel = $this->_get_interactive_channel(); + + $match = $expect; + while (true) { + if ($mode == NET_SSH2_READ_REGEX) { + preg_match($expect, $this->interactiveBuffer, $matches); + $match = isset($matches[0]) ? $matches[0] : ''; + } + $pos = strlen($match) ? strpos($this->interactiveBuffer, $match) : false; + if ($pos !== false) { + return $this->_string_shift($this->interactiveBuffer, $pos + strlen($match)); + } + $response = $this->_get_channel_packet($channel); + if (is_bool($response)) { + $this->in_request_pty_exec = false; + return $response ? $this->_string_shift($this->interactiveBuffer, strlen($this->interactiveBuffer)) : false; + } + + $this->interactiveBuffer.= $response; + } + } + + /** + * Inputs a command into an interactive shell. + * + * @see Net_SSH2::read() + * @param String $cmd + * @return Boolean + * @access public + */ + function write($cmd) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + user_error('Operation disallowed prior to login()'); + return false; + } + + if (!($this->bitmap & NET_SSH2_MASK_SHELL) && !$this->_initShell()) { + user_error('Unable to initiate an interactive shell session'); + return false; + } + + return $this->_send_channel_packet($this->_get_interactive_channel(), $cmd); + } + + /** + * Start a subsystem. + * + * Right now only one subsystem at a time is supported. To support multiple subsystem's stopSubsystem() could accept + * a string that contained the name of the subsystem, but at that point, only one subsystem of each type could be opened. + * To support multiple subsystem's of the same name maybe it'd be best if startSubsystem() generated a new channel id and + * returns that and then that that was passed into stopSubsystem() but that'll be saved for a future date and implemented + * if there's sufficient demand for such a feature. + * + * @see Net_SSH2::stopSubsystem() + * @param String $subsystem + * @return Boolean + * @access public + */ + function startSubsystem($subsystem) + { + $this->window_size_server_to_client[NET_SSH2_CHANNEL_SUBSYSTEM] = $this->window_size; + + $packet = pack('CNa*N3', + NET_SSH2_MSG_CHANNEL_OPEN, strlen('session'), 'session', NET_SSH2_CHANNEL_SUBSYSTEM, $this->window_size, 0x4000); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $this->channel_status[NET_SSH2_CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_OPEN; + + $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_SUBSYSTEM); + if ($response === false) { + return false; + } + + $packet = pack('CNNa*CNa*', + NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SSH2_CHANNEL_SUBSYSTEM], strlen('subsystem'), 'subsystem', 1, strlen($subsystem), $subsystem); + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $this->channel_status[NET_SSH2_CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_REQUEST; + + $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_SUBSYSTEM); + + if ($response === false) { + return false; + } + + $this->channel_status[NET_SSH2_CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_DATA; + + $this->bitmap |= NET_SSH2_MASK_SHELL; + $this->in_subsystem = true; + + return true; + } + + /** + * Stops a subsystem. + * + * @see Net_SSH2::startSubsystem() + * @return Boolean + * @access public + */ + function stopSubsystem() + { + $this->in_subsystem = false; + $this->_close_channel(NET_SSH2_CHANNEL_SUBSYSTEM); + return true; + } + + /** + * Closes a channel + * + * If read() timed out you might want to just close the channel and have it auto-restart on the next read() call + * + * @access public + */ + function reset() + { + $this->_close_channel($this->_get_interactive_channel()); + } + + /** + * Is timeout? + * + * Did exec() or read() return because they timed out or because they encountered the end? + * + * @access public + */ + function isTimeout() + { + return $this->is_timeout; + } + + /** + * Disconnect + * + * @access public + */ + function disconnect() + { + $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); + if (isset($this->realtime_log_file) && is_resource($this->realtime_log_file)) { + fclose($this->realtime_log_file); + } + } + + /** + * Destructor. + * + * Will be called, automatically, if you're supporting just PHP5. If you're supporting PHP4, you'll need to call + * disconnect(). + * + * @access public + */ + function __destruct() + { + $this->disconnect(); + } + + /** + * Is the connection still active? + * + * @return boolean + * @access public + */ + function isConnected() + { + return (bool) ($this->bitmap & NET_SSH2_MASK_CONNECTED); + } + + /** + * Gets Binary Packets + * + * See '6. Binary Packet Protocol' of rfc4253 for more info. + * + * @see Net_SSH2::_send_binary_packet() + * @return String + * @access private + */ + function _get_binary_packet() + { + if (!is_resource($this->fsock) || feof($this->fsock)) { + user_error('Connection closed prematurely'); + $this->bitmap = 0; + return false; + } + + $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 + $raw = fread($this->fsock, $this->decrypt_block_size); + + if (!strlen($raw)) { + return ''; + } + + if ($this->decrypt !== false) { + $raw = $this->decrypt->decrypt($raw); + } + if ($raw === false) { + user_error('Unable to decrypt content'); + return false; + } + + extract(unpack('Npacket_length/Cpadding_length', $this->_string_shift($raw, 5))); + + $remaining_length = $packet_length + 4 - $this->decrypt_block_size; + + // quoting , + // "implementations SHOULD check that the packet length is reasonable" + // PuTTY uses 0x9000 as the actual max packet size and so to shall we + if ($remaining_length < -$this->decrypt_block_size || $remaining_length > 0x9000 || $remaining_length % $this->decrypt_block_size != 0) { + user_error('Invalid size'); + return false; + } + + $buffer = ''; + while ($remaining_length > 0) { + $temp = fread($this->fsock, $remaining_length); + if ($temp === false || feof($this->fsock)) { + user_error('Error reading from socket'); + $this->bitmap = 0; + return false; + } + $buffer.= $temp; + $remaining_length-= strlen($temp); + } + $stop = strtok(microtime(), ' ') + strtok(''); + if (strlen($buffer)) { + $raw.= $this->decrypt !== false ? $this->decrypt->decrypt($buffer) : $buffer; + } + + $payload = $this->_string_shift($raw, $packet_length - $padding_length - 1); + $padding = $this->_string_shift($raw, $padding_length); // should leave $raw empty + + if ($this->hmac_check !== false) { + $hmac = fread($this->fsock, $this->hmac_size); + if ($hmac === false || strlen($hmac) != $this->hmac_size) { + user_error('Error reading socket'); + $this->bitmap = 0; + return false; + } elseif ($hmac != $this->hmac_check->hash(pack('NNCa*', $this->get_seq_no, $packet_length, $padding_length, $payload . $padding))) { + user_error('Invalid HMAC'); + return false; + } + } + + //if ($this->decompress) { + // $payload = gzinflate(substr($payload, 2)); + //} + + $this->get_seq_no++; + + if (defined('NET_SSH2_LOGGING')) { + $current = strtok(microtime(), ' ') + strtok(''); + $message_number = isset($this->message_numbers[ord($payload[0])]) ? $this->message_numbers[ord($payload[0])] : 'UNKNOWN (' . ord($payload[0]) . ')'; + $message_number = '<- ' . $message_number . + ' (since last: ' . round($current - $this->last_packet, 4) . ', network: ' . round($stop - $start, 4) . 's)'; + $this->_append_log($message_number, $payload); + $this->last_packet = $current; + } + + return $this->_filter($payload); + } + + /** + * Filter Binary Packets + * + * Because some binary packets need to be ignored... + * + * @see Net_SSH2::_get_binary_packet() + * @return String + * @access private + */ + function _filter($payload) + { + switch (ord($payload[0])) { + case NET_SSH2_MSG_DISCONNECT: + $this->_string_shift($payload, 1); + extract(unpack('Nreason_code/Nlength', $this->_string_shift($payload, 8))); + $this->errors[] = 'SSH_MSG_DISCONNECT: ' . $this->disconnect_reasons[$reason_code] . "\r\n" . utf8_decode($this->_string_shift($payload, $length)); + $this->bitmap = 0; + return false; + case NET_SSH2_MSG_IGNORE: + $payload = $this->_get_binary_packet(); + break; + case NET_SSH2_MSG_DEBUG: + $this->_string_shift($payload, 2); + extract(unpack('Nlength', $this->_string_shift($payload, 4))); + $this->errors[] = 'SSH_MSG_DEBUG: ' . utf8_decode($this->_string_shift($payload, $length)); + $payload = $this->_get_binary_packet(); + break; + case NET_SSH2_MSG_UNIMPLEMENTED: + return false; + case NET_SSH2_MSG_KEXINIT: + if ($this->session_id !== false) { + if (!$this->_key_exchange($payload)) { + $this->bitmap = 0; + return false; + } + $payload = $this->_get_binary_packet(); + } + } + + // see http://tools.ietf.org/html/rfc4252#section-5.4; only called when the encryption has been activated and when we haven't already logged in + if (($this->bitmap & NET_SSH2_MASK_CONNECTED) && !($this->bitmap & NET_SSH2_MASK_LOGIN) && ord($payload[0]) == NET_SSH2_MSG_USERAUTH_BANNER) { + $this->_string_shift($payload, 1); + extract(unpack('Nlength', $this->_string_shift($payload, 4))); + $this->banner_message = utf8_decode($this->_string_shift($payload, $length)); + $payload = $this->_get_binary_packet(); + } + + // only called when we've already logged in + if (($this->bitmap & NET_SSH2_MASK_CONNECTED) && ($this->bitmap & NET_SSH2_MASK_LOGIN)) { + switch (ord($payload[0])) { + case NET_SSH2_MSG_GLOBAL_REQUEST: // see http://tools.ietf.org/html/rfc4254#section-4 + $this->_string_shift($payload, 1); + extract(unpack('Nlength', $this->_string_shift($payload))); + $this->errors[] = 'SSH_MSG_GLOBAL_REQUEST: ' . utf8_decode($this->_string_shift($payload, $length)); + + if (!$this->_send_binary_packet(pack('C', NET_SSH2_MSG_REQUEST_FAILURE))) { + return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); + } + + $payload = $this->_get_binary_packet(); + break; + case NET_SSH2_MSG_CHANNEL_OPEN: // see http://tools.ietf.org/html/rfc4254#section-5.1 + $this->_string_shift($payload, 1); + extract(unpack('Nlength', $this->_string_shift($payload, 4))); + $this->errors[] = 'SSH_MSG_CHANNEL_OPEN: ' . utf8_decode($this->_string_shift($payload, $length)); + + $this->_string_shift($payload, 4); // skip over client channel + extract(unpack('Nserver_channel', $this->_string_shift($payload, 4))); + + $packet = pack('CN3a*Na*', + NET_SSH2_MSG_REQUEST_FAILURE, $server_channel, NET_SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED, 0, '', 0, ''); + + if (!$this->_send_binary_packet($packet)) { + return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); + } + + $payload = $this->_get_binary_packet(); + break; + case NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST: + $this->_string_shift($payload, 1); + extract(unpack('Nchannel', $this->_string_shift($payload, 4))); + extract(unpack('Nwindow_size', $this->_string_shift($payload, 4))); + $this->window_size_client_to_server[$channel]+= $window_size; + + $payload = ($this->bitmap & NET_SSH2_MASK_WINDOW_ADJUST) ? true : $this->_get_binary_packet(); + } + } + + return $payload; + } + + /** + * Enable Quiet Mode + * + * Suppress stderr from output + * + * @access public + */ + function enableQuietMode() + { + $this->quiet_mode = true; + } + + /** + * Disable Quiet Mode + * + * Show stderr in output + * + * @access public + */ + function disableQuietMode() + { + $this->quiet_mode = false; + } + + /** + * Returns whether Quiet Mode is enabled or not + * + * @see Net_SSH2::enableQuietMode() + * @see Net_SSH2::disableQuietMode() + * + * @access public + * @return boolean + */ + function isQuietModeEnabled() + { + return $this->quiet_mode; + } + + /** + * Enable request-pty when using exec() + * + * @access public + */ + function enablePTY() + { + $this->request_pty = true; + } + + /** + * Disable request-pty when using exec() + * + * @access public + */ + function disablePTY() + { + $this->request_pty = false; + } + + /** + * Returns whether request-pty is enabled or not + * + * @see Net_SSH2::enablePTY() + * @see Net_SSH2::disablePTY() + * + * @access public + * @return boolean + */ + function isPTYEnabled() + { + return $this->request_pty; + } + + /** + * Gets channel data + * + * Returns the data as a string if it's available and false if not. + * + * @param $client_channel + * @return Mixed + * @access private + */ + function _get_channel_packet($client_channel, $skip_extended = false) + { + if (!empty($this->channel_buffers[$client_channel])) { + return array_shift($this->channel_buffers[$client_channel]); + } + + while (true) { + if ($this->curTimeout) { + if ($this->curTimeout < 0) { + $this->is_timeout = true; + return true; + } + + $read = array($this->fsock); + $write = $except = null; + + $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 + $sec = floor($this->curTimeout); + $usec = 1000000 * ($this->curTimeout - $sec); + // on windows this returns a "Warning: Invalid CRT parameters detected" error + if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) { + $this->is_timeout = true; + return true; + } + $elapsed = strtok(microtime(), ' ') + strtok('') - $start; + $this->curTimeout-= $elapsed; + } + + $response = $this->_get_binary_packet(); + if ($response === false) { + user_error('Connection closed by server'); + return false; + } + if ($client_channel == -1 && $response === true) { + return true; + } + if (!strlen($response)) { + return ''; + } + + extract(unpack('Ctype/Nchannel', $this->_string_shift($response, 5))); + + $this->window_size_server_to_client[$channel]-= strlen($response); + + // resize the window, if appropriate + if ($this->window_size_server_to_client[$channel] < 0) { + $packet = pack('CNN', NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST, $this->server_channels[$channel], $this->window_size); + if (!$this->_send_binary_packet($packet)) { + return false; + } + $this->window_size_server_to_client[$channel]+= $this->window_size; + } + + switch ($this->channel_status[$channel]) { + case NET_SSH2_MSG_CHANNEL_OPEN: + switch ($type) { + case NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION: + extract(unpack('Nserver_channel', $this->_string_shift($response, 4))); + $this->server_channels[$channel] = $server_channel; + extract(unpack('Nwindow_size', $this->_string_shift($response, 4))); + $this->window_size_client_to_server[$channel] = $window_size; + $temp = unpack('Npacket_size_client_to_server', $this->_string_shift($response, 4)); + $this->packet_size_client_to_server[$channel] = $temp['packet_size_client_to_server']; + return $client_channel == $channel ? true : $this->_get_channel_packet($client_channel, $skip_extended); + //case NET_SSH2_MSG_CHANNEL_OPEN_FAILURE: + default: + user_error('Unable to open channel'); + return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); + } + break; + case NET_SSH2_MSG_CHANNEL_REQUEST: + switch ($type) { + case NET_SSH2_MSG_CHANNEL_SUCCESS: + return true; + case NET_SSH2_MSG_CHANNEL_FAILURE: + return false; + default: + user_error('Unable to fulfill channel request'); + return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); + } + case NET_SSH2_MSG_CHANNEL_CLOSE: + return $type == NET_SSH2_MSG_CHANNEL_CLOSE ? true : $this->_get_channel_packet($client_channel, $skip_extended); + } + + // ie. $this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_DATA + + switch ($type) { + case NET_SSH2_MSG_CHANNEL_DATA: + /* + if ($channel == NET_SSH2_CHANNEL_EXEC) { + // SCP requires null packets, such as this, be sent. further, in the case of the ssh.com SSH server + // this actually seems to make things twice as fast. more to the point, the message right after + // SSH_MSG_CHANNEL_DATA (usually SSH_MSG_IGNORE) won't block for as long as it would have otherwise. + // in OpenSSH it slows things down but only by a couple thousandths of a second. + $this->_send_channel_packet($channel, chr(0)); + } + */ + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $data = $this->_string_shift($response, $length); + if ($client_channel == $channel) { + return $data; + } + if (!isset($this->channel_buffers[$channel])) { + $this->channel_buffers[$channel] = array(); + } + $this->channel_buffers[$channel][] = $data; + break; + case NET_SSH2_MSG_CHANNEL_EXTENDED_DATA: + /* + if ($client_channel == NET_SSH2_CHANNEL_EXEC) { + $this->_send_channel_packet($client_channel, chr(0)); + } + */ + // currently, there's only one possible value for $data_type_code: NET_SSH2_EXTENDED_DATA_STDERR + extract(unpack('Ndata_type_code/Nlength', $this->_string_shift($response, 8))); + $data = $this->_string_shift($response, $length); + $this->stdErrorLog.= $data; + if ($skip_extended || $this->quiet_mode) { + break; + } + if ($client_channel == $channel) { + return $data; + } + if (!isset($this->channel_buffers[$channel])) { + $this->channel_buffers[$channel] = array(); + } + $this->channel_buffers[$channel][] = $data; + break; + case NET_SSH2_MSG_CHANNEL_REQUEST: + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $value = $this->_string_shift($response, $length); + switch ($value) { + case 'exit-signal': + $this->_string_shift($response, 1); + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $this->errors[] = 'SSH_MSG_CHANNEL_REQUEST (exit-signal): ' . $this->_string_shift($response, $length); + $this->_string_shift($response, 1); + extract(unpack('Nlength', $this->_string_shift($response, 4))); + if ($length) { + $this->errors[count($this->errors)].= "\r\n" . $this->_string_shift($response, $length); + } + + $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_EOF, $this->server_channels[$client_channel])); + $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$channel])); + + $this->channel_status[$channel] = NET_SSH2_MSG_CHANNEL_EOF; + + break; + case 'exit-status': + extract(unpack('Cfalse/Nexit_status', $this->_string_shift($response, 5))); + $this->exit_status = $exit_status; + + // "The client MAY ignore these messages." + // -- http://tools.ietf.org/html/rfc4254#section-6.10 + + break; + default: + // "Some systems may not implement signals, in which case they SHOULD ignore this message." + // -- http://tools.ietf.org/html/rfc4254#section-6.9 + break; + } + break; + case NET_SSH2_MSG_CHANNEL_CLOSE: + $this->curTimeout = 0; + + if ($this->bitmap & NET_SSH2_MASK_SHELL) { + $this->bitmap&= ~NET_SSH2_MASK_SHELL; + } + if ($this->channel_status[$channel] != NET_SSH2_MSG_CHANNEL_EOF) { + $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$channel])); + } + + $this->channel_status[$channel] = NET_SSH2_MSG_CHANNEL_CLOSE; + return true; + case NET_SSH2_MSG_CHANNEL_EOF: + break; + default: + user_error('Error reading channel data'); + return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); + } + } + } + + /** + * Sends Binary Packets + * + * See '6. Binary Packet Protocol' of rfc4253 for more info. + * + * @param String $data + * @param optional String $logged + * @see Net_SSH2::_get_binary_packet() + * @return Boolean + * @access private + */ + function _send_binary_packet($data, $logged = null) + { + if (!is_resource($this->fsock) || feof($this->fsock)) { + user_error('Connection closed prematurely'); + $this->bitmap = 0; + return false; + } + + //if ($this->compress) { + // // the -4 removes the checksum: + // // http://php.net/function.gzcompress#57710 + // $data = substr(gzcompress($data), 0, -4); + //} + + // 4 (packet length) + 1 (padding length) + 4 (minimal padding amount) == 9 + $packet_length = strlen($data) + 9; + // round up to the nearest $this->encrypt_block_size + $packet_length+= (($this->encrypt_block_size - 1) * $packet_length) % $this->encrypt_block_size; + // subtracting strlen($data) is obvious - subtracting 5 is necessary because of packet_length and padding_length + $padding_length = $packet_length - strlen($data) - 5; + $padding = crypt_random_string($padding_length); + + // we subtract 4 from packet_length because the packet_length field isn't supposed to include itself + $packet = pack('NCa*', $packet_length - 4, $padding_length, $data . $padding); + + $hmac = $this->hmac_create !== false ? $this->hmac_create->hash(pack('Na*', $this->send_seq_no, $packet)) : ''; + $this->send_seq_no++; + + if ($this->encrypt !== false) { + $packet = $this->encrypt->encrypt($packet); + } + + $packet.= $hmac; + + $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 + $result = strlen($packet) == fputs($this->fsock, $packet); + $stop = strtok(microtime(), ' ') + strtok(''); + + if (defined('NET_SSH2_LOGGING')) { + $current = strtok(microtime(), ' ') + strtok(''); + $message_number = isset($this->message_numbers[ord($data[0])]) ? $this->message_numbers[ord($data[0])] : 'UNKNOWN (' . ord($data[0]) . ')'; + $message_number = '-> ' . $message_number . + ' (since last: ' . round($current - $this->last_packet, 4) . ', network: ' . round($stop - $start, 4) . 's)'; + $this->_append_log($message_number, isset($logged) ? $logged : $data); + $this->last_packet = $current; + } + + return $result; + } + + /** + * Logs data packets + * + * Makes sure that only the last 1MB worth of packets will be logged + * + * @param String $data + * @access private + */ + function _append_log($message_number, $message) + { + // remove the byte identifying the message type from all but the first two messages (ie. the identification strings) + if (strlen($message_number) > 2) { + $this->_string_shift($message); + } + + switch (NET_SSH2_LOGGING) { + // useful for benchmarks + case NET_SSH2_LOG_SIMPLE: + $this->message_number_log[] = $message_number; + break; + // the most useful log for SSH2 + case NET_SSH2_LOG_COMPLEX: + $this->message_number_log[] = $message_number; + $this->log_size+= strlen($message); + $this->message_log[] = $message; + while ($this->log_size > NET_SSH2_LOG_MAX_SIZE) { + $this->log_size-= strlen(array_shift($this->message_log)); + array_shift($this->message_number_log); + } + break; + // dump the output out realtime; packets may be interspersed with non packets, + // passwords won't be filtered out and select other packets may not be correctly + // identified + case NET_SSH2_LOG_REALTIME: + switch (PHP_SAPI) { + case 'cli': + $start = $stop = "\r\n"; + break; + default: + $start = '
';
+                        $stop = '
'; + } + echo $start . $this->_format_log(array($message), array($message_number)) . $stop; + @flush(); + @ob_flush(); + break; + // basically the same thing as NET_SSH2_LOG_REALTIME with the caveat that NET_SSH2_LOG_REALTIME_FILE + // needs to be defined and that the resultant log file will be capped out at NET_SSH2_LOG_MAX_SIZE. + // the earliest part of the log file is denoted by the first <<< START >>> and is not going to necessarily + // at the beginning of the file + case NET_SSH2_LOG_REALTIME_FILE: + if (!isset($this->realtime_log_file)) { + // PHP doesn't seem to like using constants in fopen() + $filename = NET_SSH2_LOG_REALTIME_FILENAME; + $fp = fopen($filename, 'w'); + $this->realtime_log_file = $fp; + } + if (!is_resource($this->realtime_log_file)) { + break; + } + $entry = $this->_format_log(array($message), array($message_number)); + if ($this->realtime_log_wrap) { + $temp = "<<< START >>>\r\n"; + $entry.= $temp; + fseek($this->realtime_log_file, ftell($this->realtime_log_file) - strlen($temp)); + } + $this->realtime_log_size+= strlen($entry); + if ($this->realtime_log_size > NET_SSH2_LOG_MAX_SIZE) { + fseek($this->realtime_log_file, 0); + $this->realtime_log_size = strlen($entry); + $this->realtime_log_wrap = true; + } + fputs($this->realtime_log_file, $entry); + } + } + + /** + * Sends channel data + * + * Spans multiple SSH_MSG_CHANNEL_DATAs if appropriate + * + * @param Integer $client_channel + * @param String $data + * @return Boolean + * @access private + */ + function _send_channel_packet($client_channel, $data) + { + while (strlen($data)) { + if (!$this->window_size_client_to_server[$client_channel]) { + $this->bitmap^= NET_SSH2_MASK_WINDOW_ADJUST; + // using an invalid channel will let the buffers be built up for the valid channels + $this->_get_channel_packet(-1); + $this->bitmap^= NET_SSH2_MASK_WINDOW_ADJUST; + } + + /* The maximum amount of data allowed is determined by the maximum + packet size for the channel, and the current window size, whichever + is smaller. + -- http://tools.ietf.org/html/rfc4254#section-5.2 */ + $max_size = min( + $this->packet_size_client_to_server[$client_channel], + $this->window_size_client_to_server[$client_channel] + ); + + $temp = $this->_string_shift($data, $max_size); + $packet = pack('CN2a*', + NET_SSH2_MSG_CHANNEL_DATA, + $this->server_channels[$client_channel], + strlen($temp), + $temp + ); + $this->window_size_client_to_server[$client_channel]-= strlen($temp); + if (!$this->_send_binary_packet($packet)) { + return false; + } + } + + return true; + } + + /** + * Closes and flushes a channel + * + * Net_SSH2 doesn't properly close most channels. For exec() channels are normally closed by the server + * and for SFTP channels are presumably closed when the client disconnects. This functions is intended + * for SCP more than anything. + * + * @param Integer $client_channel + * @param Boolean $want_reply + * @return Boolean + * @access private + */ + function _close_channel($client_channel, $want_reply = false) + { + // see http://tools.ietf.org/html/rfc4254#section-5.3 + + $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_EOF, $this->server_channels[$client_channel])); + + if (!$want_reply) { + $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$client_channel])); + } + + $this->channel_status[$client_channel] = NET_SSH2_MSG_CHANNEL_CLOSE; + + $this->curTimeout = 0; + + while (!is_bool($this->_get_channel_packet($client_channel))); + + if ($want_reply) { + $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$client_channel])); + } + + if ($this->bitmap & NET_SSH2_MASK_SHELL) { + $this->bitmap&= ~NET_SSH2_MASK_SHELL; + } + } + + /** + * Disconnect + * + * @param Integer $reason + * @return Boolean + * @access private + */ + function _disconnect($reason) + { + if ($this->bitmap & NET_SSH2_MASK_CONNECTED) { + $data = pack('CNNa*Na*', NET_SSH2_MSG_DISCONNECT, $reason, 0, '', 0, ''); + $this->_send_binary_packet($data); + $this->bitmap = 0; + fclose($this->fsock); + return false; + } + } + + /** + * String Shift + * + * Inspired by array_shift + * + * @param String $string + * @param optional Integer $index + * @return String + * @access private + */ + function _string_shift(&$string, $index = 1) + { + $substr = substr($string, 0, $index); + $string = substr($string, $index); + return $substr; + } + + /** + * Define Array + * + * Takes any number of arrays whose indices are integers and whose values are strings and defines a bunch of + * named constants from it, using the value as the name of the constant and the index as the value of the constant. + * If any of the constants that would be defined already exists, none of the constants will be defined. + * + * @param Array $array + * @access private + */ + function _define_array() + { + $args = func_get_args(); + foreach ($args as $arg) { + foreach ($arg as $key=>$value) { + if (!defined($value)) { + define($value, $key); + } else { + break 2; + } + } + } + } + + /** + * Returns a log of the packets that have been sent and received. + * + * Returns a string if NET_SSH2_LOGGING == NET_SSH2_LOG_COMPLEX, an array if NET_SSH2_LOGGING == NET_SSH2_LOG_SIMPLE and false if !defined('NET_SSH2_LOGGING') + * + * @access public + * @return String or Array + */ + function getLog() + { + if (!defined('NET_SSH2_LOGGING')) { + return false; + } + + switch (NET_SSH2_LOGGING) { + case NET_SSH2_LOG_SIMPLE: + return $this->message_number_log; + break; + case NET_SSH2_LOG_COMPLEX: + return $this->_format_log($this->message_log, $this->message_number_log); + break; + default: + return false; + } + } + + /** + * Formats a log for printing + * + * @param Array $message_log + * @param Array $message_number_log + * @access private + * @return String + */ + function _format_log($message_log, $message_number_log) + { + $output = ''; + for ($i = 0; $i < count($message_log); $i++) { + $output.= $message_number_log[$i] . "\r\n"; + $current_log = $message_log[$i]; + $j = 0; + do { + if (strlen($current_log)) { + $output.= str_pad(dechex($j), 7, '0', STR_PAD_LEFT) . '0 '; + } + $fragment = $this->_string_shift($current_log, $this->log_short_width); + $hex = substr(preg_replace_callback('#.#s', array($this, '_format_log_helper'), $fragment), strlen($this->log_boundary)); + // replace non ASCII printable characters with dots + // http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters + // also replace < with a . since < messes up the output on web browsers + $raw = preg_replace('#[^\x20-\x7E]|<#', '.', $fragment); + $output.= str_pad($hex, $this->log_long_width - $this->log_short_width, ' ') . $raw . "\r\n"; + $j++; + } while (strlen($current_log)); + $output.= "\r\n"; + } + + return $output; + } + + /** + * Helper function for _format_log + * + * For use with preg_replace_callback() + * + * @param Array $matches + * @access private + * @return String + */ + function _format_log_helper($matches) + { + return $this->log_boundary . str_pad(dechex(ord($matches[0])), 2, '0', STR_PAD_LEFT); + } + + /** + * Returns all errors + * + * @return String + * @access public + */ + function getErrors() + { + return $this->errors; + } + + /** + * Returns the last error + * + * @return String + * @access public + */ + function getLastError() + { + return $this->errors[count($this->errors) - 1]; + } + + /** + * Return the server identification. + * + * @return String + * @access public + */ + function getServerIdentification() + { + $this->_connect(); + + return $this->server_identifier; + } + + /** + * Return a list of the key exchange algorithms the server supports. + * + * @return Array + * @access public + */ + function getKexAlgorithms() + { + $this->_connect(); + + return $this->kex_algorithms; + } + + /** + * Return a list of the host key (public key) algorithms the server supports. + * + * @return Array + * @access public + */ + function getServerHostKeyAlgorithms() + { + $this->_connect(); + + return $this->server_host_key_algorithms; + } + + /** + * Return a list of the (symmetric key) encryption algorithms the server supports, when receiving stuff from the client. + * + * @return Array + * @access public + */ + function getEncryptionAlgorithmsClient2Server() + { + $this->_connect(); + + return $this->encryption_algorithms_client_to_server; + } + + /** + * Return a list of the (symmetric key) encryption algorithms the server supports, when sending stuff to the client. + * + * @return Array + * @access public + */ + function getEncryptionAlgorithmsServer2Client() + { + $this->_connect(); + + return $this->encryption_algorithms_server_to_client; + } + + /** + * Return a list of the MAC algorithms the server supports, when receiving stuff from the client. + * + * @return Array + * @access public + */ + function getMACAlgorithmsClient2Server() + { + $this->_connect(); + + return $this->mac_algorithms_client_to_server; + } + + /** + * Return a list of the MAC algorithms the server supports, when sending stuff to the client. + * + * @return Array + * @access public + */ + function getMACAlgorithmsServer2Client() + { + $this->_connect(); + + return $this->mac_algorithms_server_to_client; + } + + /** + * Return a list of the compression algorithms the server supports, when receiving stuff from the client. + * + * @return Array + * @access public + */ + function getCompressionAlgorithmsClient2Server() + { + $this->_connect(); + + return $this->compression_algorithms_client_to_server; + } + + /** + * Return a list of the compression algorithms the server supports, when sending stuff to the client. + * + * @return Array + * @access public + */ + function getCompressionAlgorithmsServer2Client() + { + $this->_connect(); + + return $this->compression_algorithms_server_to_client; + } + + /** + * Return a list of the languages the server supports, when sending stuff to the client. + * + * @return Array + * @access public + */ + function getLanguagesServer2Client() + { + $this->_connect(); + + return $this->languages_server_to_client; + } + + /** + * Return a list of the languages the server supports, when receiving stuff from the client. + * + * @return Array + * @access public + */ + function getLanguagesClient2Server() + { + $this->_connect(); + + return $this->languages_client_to_server; + } + + /** + * Returns the banner message. + * + * Quoting from the RFC, "in some jurisdictions, sending a warning message before + * authentication may be relevant for getting legal protection." + * + * @return String + * @access public + */ + function getBannerMessage() + { + return $this->banner_message; + } + + /** + * Returns the server public host key. + * + * Caching this the first time you connect to a server and checking the result on subsequent connections + * is recommended. Returns false if the server signature is not signed correctly with the public host key. + * + * @return Mixed + * @access public + */ + function getServerPublicHostKey() + { + if (!($this->bitmap & NET_SSH2_MASK_CONSTRUCTOR)) { + if (!$this->_connect()) { + return false; + } + } + + $signature = $this->signature; + $server_public_host_key = $this->server_public_host_key; + + extract(unpack('Nlength', $this->_string_shift($server_public_host_key, 4))); + $this->_string_shift($server_public_host_key, $length); + + if ($this->signature_validated) { + return $this->bitmap ? + $this->signature_format . ' ' . base64_encode($this->server_public_host_key) : + false; + } + + $this->signature_validated = true; + + switch ($this->signature_format) { + case 'ssh-dss': + $zero = new Math_BigInteger(); + + $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); + $p = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256); + + $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); + $q = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256); + + $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); + $g = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256); + + $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); + $y = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256); + + /* The value for 'dss_signature_blob' is encoded as a string containing + r, followed by s (which are 160-bit integers, without lengths or + padding, unsigned, and in network byte order). */ + $temp = unpack('Nlength', $this->_string_shift($signature, 4)); + if ($temp['length'] != 40) { + user_error('Invalid signature'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + + $r = new Math_BigInteger($this->_string_shift($signature, 20), 256); + $s = new Math_BigInteger($this->_string_shift($signature, 20), 256); + + switch (true) { + case $r->equals($zero): + case $r->compare($q) >= 0: + case $s->equals($zero): + case $s->compare($q) >= 0: + user_error('Invalid signature'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + + $w = $s->modInverse($q); + + $u1 = $w->multiply(new Math_BigInteger(sha1($this->exchange_hash), 16)); + list(, $u1) = $u1->divide($q); + + $u2 = $w->multiply($r); + list(, $u2) = $u2->divide($q); + + $g = $g->modPow($u1, $p); + $y = $y->modPow($u2, $p); + + $v = $g->multiply($y); + list(, $v) = $v->divide($p); + list(, $v) = $v->divide($q); + + if (!$v->equals($r)) { + user_error('Bad server signature'); + return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); + } + + break; + case 'ssh-rsa': + $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); + $e = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256); + + $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); + $rawN = $this->_string_shift($server_public_host_key, $temp['length']); + $n = new Math_BigInteger($rawN, -256); + $nLength = strlen(ltrim($rawN, "\0")); + + /* + $temp = unpack('Nlength', $this->_string_shift($signature, 4)); + $signature = $this->_string_shift($signature, $temp['length']); + + if (!class_exists('Crypt_RSA')) { + include_once 'Crypt/RSA.php'; + } + + $rsa = new Crypt_RSA(); + $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); + $rsa->loadKey(array('e' => $e, 'n' => $n), CRYPT_RSA_PUBLIC_FORMAT_RAW); + if (!$rsa->verify($this->exchange_hash, $signature)) { + user_error('Bad server signature'); + return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); + } + */ + + $temp = unpack('Nlength', $this->_string_shift($signature, 4)); + $s = new Math_BigInteger($this->_string_shift($signature, $temp['length']), 256); + + // validate an RSA signature per "8.2 RSASSA-PKCS1-v1_5", "5.2.2 RSAVP1", and "9.1 EMSA-PSS" in the + // following URL: + // ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1.pdf + + // also, see SSHRSA.c (rsa2_verifysig) in PuTTy's source. + + if ($s->compare(new Math_BigInteger()) < 0 || $s->compare($n->subtract(new Math_BigInteger(1))) > 0) { + user_error('Invalid signature'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + + $s = $s->modPow($e, $n); + $s = $s->toBytes(); + + $h = pack('N4H*', 0x00302130, 0x0906052B, 0x0E03021A, 0x05000414, sha1($this->exchange_hash)); + $h = chr(0x01) . str_repeat(chr(0xFF), $nLength - 2 - strlen($h)) . $h; + + if ($s != $h) { + user_error('Bad server signature'); + return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); + } + break; + default: + user_error('Unsupported signature format'); + return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); + } + + return $this->signature_format . ' ' . base64_encode($this->server_public_host_key); + } + + /** + * Returns the exit status of an SSH command or false. + * + * @return Integer or false + * @access public + */ + function getExitStatus() + { + if (is_null($this->exit_status)) { + return false; + } + return $this->exit_status; + } + + /** + * Returns the number of columns for the terminal window size. + * + * @return Integer + * @access public + */ + function getWindowColumns() + { + return $this->windowColumns; + } + + /** + * Returns the number of rows for the terminal window size. + * + * @return Integer + * @access public + */ + function getWindowRows() + { + return $this->windowRows; + } + + /** + * Sets the number of columns for the terminal window size. + * + * @param Integer $value + * @access public + */ + function setWindowColumns($value) + { + $this->windowColumns = $value; + } + + /** + * Sets the number of rows for the terminal window size. + * + * @param Integer $value + * @access public + */ + function setWindowRows($value) + { + $this->windowRows = $value; + } + + /** + * Sets the number of columns and rows for the terminal window size. + * + * @param Integer $columns + * @param Integer $rows + * @access public + */ + function setWindowSize($columns = 80, $rows = 24) + { + $this->windowColumns = $columns; + $this->windowRows = $rows; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/System/SSH/Agent.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/System/SSH/Agent.php new file mode 100755 index 00000000..4c0ef733 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/System/SSH/Agent.php @@ -0,0 +1,313 @@ + + * login('username', $agent)) { + * exit('Login Failed'); + * } + * + * echo $ssh->exec('pwd'); + * echo $ssh->exec('ls -la'); + * ?> + * + * + * LICENSE: 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. + * + * @category System + * @package System_SSH_Agent + * @author Jim Wigginton + * @copyright 2014 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + * @internal See http://api.libssh.org/rfc/PROTOCOL.agent + */ + +/**#@+ + * Message numbers + * + * @access private + */ +// to request SSH1 keys you have to use SSH_AGENTC_REQUEST_RSA_IDENTITIES (1) +define('SYSTEM_SSH_AGENTC_REQUEST_IDENTITIES', 11); +// this is the SSH2 response; the SSH1 response is SSH_AGENT_RSA_IDENTITIES_ANSWER (2). +define('SYSTEM_SSH_AGENT_IDENTITIES_ANSWER', 12); +define('SYSTEM_SSH_AGENT_FAILURE', 5); +// the SSH1 request is SSH_AGENTC_RSA_CHALLENGE (3) +define('SYSTEM_SSH_AGENTC_SIGN_REQUEST', 13); +// the SSH1 response is SSH_AGENT_RSA_RESPONSE (4) +define('SYSTEM_SSH_AGENT_SIGN_RESPONSE', 14); +/**#@-*/ + +/** + * Pure-PHP ssh-agent client identity object + * + * Instantiation should only be performed by System_SSH_Agent class. + * This could be thought of as implementing an interface that Crypt_RSA + * implements. ie. maybe a Net_SSH_Auth_PublicKey interface or something. + * The methods in this interface would be getPublicKey, setSignatureMode + * and sign since those are the methods phpseclib looks for to perform + * public key authentication. + * + * @package System_SSH_Agent + * @author Jim Wigginton + * @access internal + */ +class System_SSH_Agent_Identity +{ + /** + * Key Object + * + * @var Crypt_RSA + * @access private + * @see System_SSH_Agent_Identity::getPublicKey() + */ + var $key; + + /** + * Key Blob + * + * @var String + * @access private + * @see System_SSH_Agent_Identity::sign() + */ + var $key_blob; + + /** + * Socket Resource + * + * @var Resource + * @access private + * @see System_SSH_Agent_Identity::sign() + */ + var $fsock; + + /** + * Default Constructor. + * + * @param Resource $fsock + * @return System_SSH_Agent_Identity + * @access private + */ + function System_SSH_Agent_Identity($fsock) + { + $this->fsock = $fsock; + } + + /** + * Set Public Key + * + * Called by System_SSH_Agent::requestIdentities() + * + * @param Crypt_RSA $key + * @access private + */ + function setPublicKey($key) + { + $this->key = $key; + $this->key->setPublicKey(); + } + + /** + * Set Public Key + * + * Called by System_SSH_Agent::requestIdentities(). The key blob could be extracted from $this->key + * but this saves a small amount of computation. + * + * @param String $key_blob + * @access private + */ + function setPublicKeyBlob($key_blob) + { + $this->key_blob = $key_blob; + } + + /** + * Get Public Key + * + * Wrapper for $this->key->getPublicKey() + * + * @param Integer $format optional + * @return Mixed + * @access public + */ + function getPublicKey($format = null) + { + return !isset($format) ? $this->key->getPublicKey() : $this->key->getPublicKey($format); + } + + /** + * Set Signature Mode + * + * Doesn't do anything as ssh-agent doesn't let you pick and choose the signature mode. ie. + * ssh-agent's only supported mode is CRYPT_RSA_SIGNATURE_PKCS1 + * + * @param Integer $mode + * @access public + */ + function setSignatureMode($mode) + { + } + + /** + * Create a signature + * + * See "2.6.2 Protocol 2 private key signature request" + * + * @param String $message + * @return String + * @access public + */ + function sign($message) + { + // the last parameter (currently 0) is for flags and ssh-agent only defines one flag (for ssh-dss): SSH_AGENT_OLD_SIGNATURE + $packet = pack('CNa*Na*N', SYSTEM_SSH_AGENTC_SIGN_REQUEST, strlen($this->key_blob), $this->key_blob, strlen($message), $message, 0); + $packet = pack('Na*', strlen($packet), $packet); + if (strlen($packet) != fputs($this->fsock, $packet)) { + user_error('Connection closed during signing'); + } + + $length = current(unpack('N', fread($this->fsock, 4))); + $type = ord(fread($this->fsock, 1)); + if ($type != SYSTEM_SSH_AGENT_SIGN_RESPONSE) { + user_error('Unable to retreive signature'); + } + + $signature_blob = fread($this->fsock, $length - 1); + // the only other signature format defined - ssh-dss - is the same length as ssh-rsa + // the + 12 is for the other various SSH added length fields + return substr($signature_blob, strlen('ssh-rsa') + 12); + } +} + +/** + * Pure-PHP ssh-agent client identity factory + * + * requestIdentities() method pumps out System_SSH_Agent_Identity objects + * + * @package System_SSH_Agent + * @author Jim Wigginton + * @access internal + */ +class System_SSH_Agent +{ + /** + * Socket Resource + * + * @var Resource + * @access private + */ + var $fsock; + + /** + * Default Constructor + * + * @return System_SSH_Agent + * @access public + */ + function System_SSH_Agent() + { + switch (true) { + case isset($_SERVER['SSH_AUTH_SOCK']): + $address = $_SERVER['SSH_AUTH_SOCK']; + break; + case isset($_ENV['SSH_AUTH_SOCK']): + $address = $_ENV['SSH_AUTH_SOCK']; + break; + default: + user_error('SSH_AUTH_SOCK not found'); + return false; + } + + $this->fsock = fsockopen('unix://' . $address, 0, $errno, $errstr); + if (!$this->fsock) { + user_error("Unable to connect to ssh-agent (Error $errno: $errstr)"); + } + } + + /** + * Request Identities + * + * See "2.5.2 Requesting a list of protocol 2 keys" + * Returns an array containing zero or more System_SSH_Agent_Identity objects + * + * @return Array + * @access public + */ + function requestIdentities() + { + if (!$this->fsock) { + return array(); + } + + $packet = pack('NC', 1, SYSTEM_SSH_AGENTC_REQUEST_IDENTITIES); + if (strlen($packet) != fputs($this->fsock, $packet)) { + user_error('Connection closed while requesting identities'); + } + + $length = current(unpack('N', fread($this->fsock, 4))); + $type = ord(fread($this->fsock, 1)); + if ($type != SYSTEM_SSH_AGENT_IDENTITIES_ANSWER) { + user_error('Unable to request identities'); + } + + $identities = array(); + $keyCount = current(unpack('N', fread($this->fsock, 4))); + for ($i = 0; $i < $keyCount; $i++) { + $length = current(unpack('N', fread($this->fsock, 4))); + $key_blob = fread($this->fsock, $length); + $length = current(unpack('N', fread($this->fsock, 4))); + $key_comment = fread($this->fsock, $length); + $length = current(unpack('N', substr($key_blob, 0, 4))); + $key_type = substr($key_blob, 4, $length); + switch ($key_type) { + case 'ssh-rsa': + if (!class_exists('Crypt_RSA')) { + include_once 'Crypt/RSA.php'; + } + $key = new Crypt_RSA(); + $key->loadKey('ssh-rsa ' . base64_encode($key_blob) . ' ' . $key_comment); + break; + case 'ssh-dss': + // not currently supported + break; + } + // resources are passed by reference by default + if (isset($key)) { + $identity = new System_SSH_Agent_Identity($this->fsock); + $identity->setPublicKey($key); + $identity->setPublicKeyBlob($key_blob); + $identities[] = $identity; + unset($key); + } + } + + return $identities; + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/System/SSH_Agent.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/System/SSH_Agent.php new file mode 100755 index 00000000..ea434b9c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/System/SSH_Agent.php @@ -0,0 +1,39 @@ + + * @copyright 2014 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + * @internal See http://api.libssh.org/rfc/PROTOCOL.agent + */ + +require_once 'SSH/Agent.php'; diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/openssl.cnf b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/openssl.cnf new file mode 100755 index 00000000..2b8b52f9 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/openssl.cnf @@ -0,0 +1,6 @@ +# minimalist openssl.cnf file for use with phpseclib + +HOME = . +RANDFILE = $ENV::HOME/.rnd + +[ v3_ca ] diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/COPYING b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/COPYING new file mode 100755 index 00000000..8e7ddbcf --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/COPYING @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2011 Vladimir Andersen + +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. \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/README.md b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/README.md new file mode 100755 index 00000000..f8fa8487 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/README.md @@ -0,0 +1,30 @@ +**Spyc** is a YAML loader/dumper written in pure PHP. Given a YAML document, Spyc will return an array that +you can use however you see fit. Given an array, Spyc will return a string which contains a YAML document +built from your data. + +**YAML** is an amazingly human friendly and strikingly versatile data serialization language which can be used +for log files, config files, custom protocols, the works. For more information, see http://www.yaml.org. + +Spyc supports YAML 1.0 specification. + +## Using Spyc + +Using Spyc is trivial: + +``` + + * @author Chris Wanstrath + * @link https://github.com/mustangostang/spyc/ + * @copyright Copyright 2005-2006 Chris Wanstrath, 2006-2011 Vlad Andersen + * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @package Spyc + */ + +if (!function_exists('spyc_load')) { + /** + * Parses YAML to array. + * @param string $string YAML string. + * @return array + */ + function spyc_load ($string) { + return Spyc::YAMLLoadString($string); + } +} + +if (!function_exists('spyc_load_file')) { + /** + * Parses YAML to array. + * @param string $file Path to YAML file. + * @return array + */ + function spyc_load_file ($file) { + return Spyc::YAMLLoad($file); + } +} + +if (!function_exists('spyc_dump')) { + /** + * Dumps array to YAML. + * @param array $data Array. + * @return string + */ + function spyc_dump ($data) { + return Spyc::YAMLDump($data, false, false, true); + } +} + +/** + * The Simple PHP YAML Class. + * + * This class can be used to read a YAML file and convert its contents + * into a PHP array. It currently supports a very limited subsection of + * the YAML spec. + * + * Usage: + * + * $Spyc = new Spyc; + * $array = $Spyc->load($file); + * + * or: + * + * $array = Spyc::YAMLLoad($file); + * + * or: + * + * $array = spyc_load_file($file); + * + * @package Spyc + */ +class Spyc { + + // SETTINGS + + const REMPTY = "\0\0\0\0\0"; + + /** + * Setting this to true will force YAMLDump to enclose any string value in + * quotes. False by default. + * + * @var bool + */ + public $setting_dump_force_quotes = false; + + /** + * Setting this to true will forse YAMLLoad to use syck_load function when + * possible. False by default. + * @var bool + */ + public $setting_use_syck_is_possible = false; + + + + /**#@+ + * @access private + * @var mixed + */ + private $_dumpIndent; + private $_dumpWordWrap; + private $_containsGroupAnchor = false; + private $_containsGroupAlias = false; + private $path; + private $result; + private $LiteralPlaceHolder = '___YAML_Literal_Block___'; + private $SavedGroups = array(); + private $indent; + /** + * Path modifier that should be applied after adding current element. + * @var array + */ + private $delayedPath = array(); + + /**#@+ + * @access public + * @var mixed + */ + public $_nodeId; + +/** + * Load a valid YAML string to Spyc. + * @param string $input + * @return array + */ + public function load ($input) { + return $this->__loadString($input); + } + + /** + * Load a valid YAML file to Spyc. + * @param string $file + * @return array + */ + public function loadFile ($file) { + return $this->__load($file); + } + + /** + * Load YAML into a PHP array statically + * + * The load method, when supplied with a YAML stream (string or file), + * will do its best to convert YAML in a file into a PHP array. Pretty + * simple. + * Usage: + * + * $array = Spyc::YAMLLoad('lucky.yaml'); + * print_r($array); + * + * @access public + * @return array + * @param string $input Path of YAML file or string containing YAML + */ + public static function YAMLLoad($input) { + $Spyc = new Spyc; + return $Spyc->__load($input); + } + + /** + * Load a string of YAML into a PHP array statically + * + * The load method, when supplied with a YAML string, will do its best + * to convert YAML in a string into a PHP array. Pretty simple. + * + * Note: use this function if you don't want files from the file system + * loaded and processed as YAML. This is of interest to people concerned + * about security whose input is from a string. + * + * Usage: + * + * $array = Spyc::YAMLLoadString("---\n0: hello world\n"); + * print_r($array); + * + * @access public + * @return array + * @param string $input String containing YAML + */ + public static function YAMLLoadString($input) { + $Spyc = new Spyc; + return $Spyc->__loadString($input); + } + + /** + * Dump YAML from PHP array statically + * + * The dump method, when supplied with an array, will do its best + * to convert the array into friendly YAML. Pretty simple. Feel free to + * save the returned string as nothing.yaml and pass it around. + * + * Oh, and you can decide how big the indent is and what the wordwrap + * for folding is. Pretty cool -- just pass in 'false' for either if + * you want to use the default. + * + * Indent's default is 2 spaces, wordwrap's default is 40 characters. And + * you can turn off wordwrap by passing in 0. + * + * @access public + * @return string + * @param array $array PHP array + * @param int $indent Pass in false to use the default, which is 2 + * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) + * @param int $no_opening_dashes Do not start YAML file with "---\n" + */ + public static function YAMLDump($array, $indent = false, $wordwrap = false, $no_opening_dashes = false) { + $spyc = new Spyc; + return $spyc->dump($array, $indent, $wordwrap, $no_opening_dashes); + } + + + /** + * Dump PHP array to YAML + * + * The dump method, when supplied with an array, will do its best + * to convert the array into friendly YAML. Pretty simple. Feel free to + * save the returned string as tasteful.yaml and pass it around. + * + * Oh, and you can decide how big the indent is and what the wordwrap + * for folding is. Pretty cool -- just pass in 'false' for either if + * you want to use the default. + * + * Indent's default is 2 spaces, wordwrap's default is 40 characters. And + * you can turn off wordwrap by passing in 0. + * + * @access public + * @return string + * @param array $array PHP array + * @param int $indent Pass in false to use the default, which is 2 + * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) + */ + public function dump($array,$indent = false,$wordwrap = false, $no_opening_dashes = false) { + // Dumps to some very clean YAML. We'll have to add some more features + // and options soon. And better support for folding. + + // New features and options. + if ($indent === false or !is_numeric($indent)) { + $this->_dumpIndent = 2; + } else { + $this->_dumpIndent = $indent; + } + + if ($wordwrap === false or !is_numeric($wordwrap)) { + $this->_dumpWordWrap = 40; + } else { + $this->_dumpWordWrap = $wordwrap; + } + + // New YAML document + $string = ""; + if (!$no_opening_dashes) $string = "---\n"; + + // Start at the base of the array and move through it. + if ($array) { + $array = (array)$array; + $previous_key = -1; + foreach ($array as $key => $value) { + if (!isset($first_key)) $first_key = $key; + $string .= $this->_yamlize($key,$value,0,$previous_key, $first_key, $array); + $previous_key = $key; + } + } + return $string; + } + + /** + * Attempts to convert a key / value array item to YAML + * @access private + * @return string + * @param $key The name of the key + * @param $value The value of the item + * @param $indent The indent of the current node + */ + private function _yamlize($key,$value,$indent, $previous_key = -1, $first_key = 0, $source_array = null) { + if (is_array($value)) { + if (empty ($value)) + return $this->_dumpNode($key, array(), $indent, $previous_key, $first_key, $source_array); + // It has children. What to do? + // Make it the right kind of item + $string = $this->_dumpNode($key, self::REMPTY, $indent, $previous_key, $first_key, $source_array); + // Add the indent + $indent += $this->_dumpIndent; + // Yamlize the array + $string .= $this->_yamlizeArray($value,$indent); + } elseif (!is_array($value)) { + // It doesn't have children. Yip. + $string = $this->_dumpNode($key, $value, $indent, $previous_key, $first_key, $source_array); + } + return $string; + } + + /** + * Attempts to convert an array to YAML + * @access private + * @return string + * @param $array The array you want to convert + * @param $indent The indent of the current level + */ + private function _yamlizeArray($array,$indent) { + if (is_array($array)) { + $string = ''; + $previous_key = -1; + foreach ($array as $key => $value) { + if (!isset($first_key)) $first_key = $key; + $string .= $this->_yamlize($key, $value, $indent, $previous_key, $first_key, $array); + $previous_key = $key; + } + return $string; + } else { + return false; + } + } + + /** + * Returns YAML from a key and a value + * @access private + * @return string + * @param $key The name of the key + * @param $value The value of the item + * @param $indent The indent of the current node + */ + private function _dumpNode($key, $value, $indent, $previous_key = -1, $first_key = 0, $source_array = null) { + // do some folding here, for blocks + if (is_string ($value) && ((strpos($value,"\n") !== false || strpos($value,": ") !== false || strpos($value,"- ") !== false || + strpos($value,"*") !== false || strpos($value,"#") !== false || strpos($value,"<") !== false || strpos($value,">") !== false || strpos ($value, '%') !== false || strpos ($value, ' ') !== false || + strpos($value,"[") !== false || strpos($value,"]") !== false || strpos($value,"{") !== false || strpos($value,"}") !== false) || strpos($value,"&") !== false || strpos($value, "'") !== false || strpos($value, "!") === 0 || + substr ($value, -1, 1) == ':') + ) { + $value = $this->_doLiteralBlock($value,$indent); + } else { + $value = $this->_doFolding($value,$indent); + } + + if ($value === array()) $value = '[ ]'; + if ($value === "") $value = '""'; + if (self::isTranslationWord($value)) { + $value = $this->_doLiteralBlock($value, $indent); + } + if (trim ($value) != $value) + $value = $this->_doLiteralBlock($value,$indent); + + if (is_bool($value)) { + $value = $value ? "true" : "false"; + } + + if ($value === null) $value = 'null'; + if ($value === "'" . self::REMPTY . "'") $value = null; + + $spaces = str_repeat(' ',$indent); + + //if (is_int($key) && $key - 1 == $previous_key && $first_key===0) { + if (is_array ($source_array) && array_keys($source_array) === range(0, count($source_array) - 1)) { + // It's a sequence + $string = $spaces.'- '.$value."\n"; + } else { + // if ($first_key===0) throw new Exception('Keys are all screwy. The first one was zero, now it\'s "'. $key .'"'); + // It's mapped + if (strpos($key, ":") !== false || strpos($key, "#") !== false) { $key = '"' . $key . '"'; } + $string = rtrim ($spaces.$key.': '.$value)."\n"; + } + return $string; + } + + /** + * Creates a literal block for dumping + * @access private + * @return string + * @param $value + * @param $indent int The value of the indent + */ + private function _doLiteralBlock($value,$indent) { + if ($value === "\n") return '\n'; + if (strpos($value, "\n") === false && strpos($value, "'") === false) { + return sprintf ("'%s'", $value); + } + if (strpos($value, "\n") === false && strpos($value, '"') === false) { + return sprintf ('"%s"', $value); + } + $exploded = explode("\n",$value); + $newValue = '|'; + if (isset($exploded[0]) && ($exploded[0] == "|" || $exploded[0] == "|-" || $exploded[0] == ">")) { + $newValue = $exploded[0]; + unset($exploded[0]); + } + $indent += $this->_dumpIndent; + $spaces = str_repeat(' ',$indent); + foreach ($exploded as $line) { + $line = trim($line); + if (strpos($line, '"') === 0 && strrpos($line, '"') == (strlen($line)-1) || strpos($line, "'") === 0 && strrpos($line, "'") == (strlen($line)-1)) { + $line = substr($line, 1, -1); + } + $newValue .= "\n" . $spaces . ($line); + } + return $newValue; + } + + /** + * Folds a string of text, if necessary + * @access private + * @return string + * @param $value The string you wish to fold + */ + private function _doFolding($value,$indent) { + // Don't do anything if wordwrap is set to 0 + + if ($this->_dumpWordWrap !== 0 && is_string ($value) && strlen($value) > $this->_dumpWordWrap) { + $indent += $this->_dumpIndent; + $indent = str_repeat(' ',$indent); + $wrapped = wordwrap($value,$this->_dumpWordWrap,"\n$indent"); + $value = ">\n".$indent.$wrapped; + } else { + if ($this->setting_dump_force_quotes && is_string ($value) && $value !== self::REMPTY) + $value = '"' . $value . '"'; + if (is_numeric($value) && is_string($value)) + $value = '"' . $value . '"'; + } + + + return $value; + } + + private function isTrueWord($value) { + $words = self::getTranslations(array('true', 'on', 'yes', 'y')); + return in_array($value, $words, true); + } + + private function isFalseWord($value) { + $words = self::getTranslations(array('false', 'off', 'no', 'n')); + return in_array($value, $words, true); + } + + private function isNullWord($value) { + $words = self::getTranslations(array('null', '~')); + return in_array($value, $words, true); + } + + private function isTranslationWord($value) { + return ( + self::isTrueWord($value) || + self::isFalseWord($value) || + self::isNullWord($value) + ); + } + + /** + * Coerce a string into a native type + * Reference: http://yaml.org/type/bool.html + * TODO: Use only words from the YAML spec. + * @access private + * @param $value The value to coerce + */ + private function coerceValue(&$value) { + if (self::isTrueWord($value)) { + $value = true; + } else if (self::isFalseWord($value)) { + $value = false; + } else if (self::isNullWord($value)) { + $value = null; + } + } + + /** + * Given a set of words, perform the appropriate translations on them to + * match the YAML 1.1 specification for type coercing. + * @param $words The words to translate + * @access private + */ + private static function getTranslations(array $words) { + $result = array(); + foreach ($words as $i) { + $result = array_merge($result, array(ucfirst($i), strtoupper($i), strtolower($i))); + } + return $result; + } + +// LOADING FUNCTIONS + + private function __load($input) { + $Source = $this->loadFromSource($input); + return $this->loadWithSource($Source); + } + + private function __loadString($input) { + $Source = $this->loadFromString($input); + return $this->loadWithSource($Source); + } + + private function loadWithSource($Source) { + if (empty ($Source)) return array(); + if ($this->setting_use_syck_is_possible && function_exists ('syck_load')) { + $array = syck_load (implode ("\n", $Source)); + return is_array($array) ? $array : array(); + } + + $this->path = array(); + $this->result = array(); + + $cnt = count($Source); + for ($i = 0; $i < $cnt; $i++) { + $line = $Source[$i]; + + $this->indent = strlen($line) - strlen(ltrim($line)); + $tempPath = $this->getParentPathByIndent($this->indent); + $line = self::stripIndent($line, $this->indent); + if (self::isComment($line)) continue; + if (self::isEmpty($line)) continue; + $this->path = $tempPath; + + $literalBlockStyle = self::startsLiteralBlock($line); + if ($literalBlockStyle) { + $line = rtrim ($line, $literalBlockStyle . " \n"); + $literalBlock = ''; + $line .= ' '.$this->LiteralPlaceHolder; + $literal_block_indent = strlen($Source[$i+1]) - strlen(ltrim($Source[$i+1])); + while (++$i < $cnt && $this->literalBlockContinues($Source[$i], $this->indent)) { + $literalBlock = $this->addLiteralLine($literalBlock, $Source[$i], $literalBlockStyle, $literal_block_indent); + } + $i--; + } + + // Strip out comments + if (strpos ($line, '#')) { + $line = preg_replace('/\s*#([^"\']+)$/','',$line); + } + + while (++$i < $cnt && self::greedilyNeedNextLine($line)) { + $line = rtrim ($line, " \n\t\r") . ' ' . ltrim ($Source[$i], " \t"); + } + $i--; + + $lineArray = $this->_parseLine($line); + + if ($literalBlockStyle) + $lineArray = $this->revertLiteralPlaceHolder ($lineArray, $literalBlock); + + $this->addArray($lineArray, $this->indent); + + foreach ($this->delayedPath as $indent => $delayedPath) + $this->path[$indent] = $delayedPath; + + $this->delayedPath = array(); + + } + return $this->result; + } + + private function loadFromSource ($input) { + if (!empty($input) && strpos($input, "\n") === false && file_exists($input)) + $input = file_get_contents($input); + + return $this->loadFromString($input); + } + + private function loadFromString ($input) { + $lines = explode("\n",$input); + foreach ($lines as $k => $_) { + $lines[$k] = rtrim ($_, "\r"); + } + return $lines; + } + + /** + * Parses YAML code and returns an array for a node + * @access private + * @return array + * @param string $line A line from the YAML file + */ + private function _parseLine($line) { + if (!$line) return array(); + $line = trim($line); + if (!$line) return array(); + + $array = array(); + + $group = $this->nodeContainsGroup($line); + if ($group) { + $this->addGroup($line, $group); + $line = $this->stripGroup ($line, $group); + } + + if ($this->startsMappedSequence($line)) + return $this->returnMappedSequence($line); + + if ($this->startsMappedValue($line)) + return $this->returnMappedValue($line); + + if ($this->isArrayElement($line)) + return $this->returnArrayElement($line); + + if ($this->isPlainArray($line)) + return $this->returnPlainArray($line); + + + return $this->returnKeyValuePair($line); + + } + + /** + * Finds the type of the passed value, returns the value as the new type. + * @access private + * @param string $value + * @return mixed + */ + private function _toType($value) { + if ($value === '') return ""; + $first_character = $value[0]; + $last_character = substr($value, -1, 1); + + $is_quoted = false; + do { + if (!$value) break; + if ($first_character != '"' && $first_character != "'") break; + if ($last_character != '"' && $last_character != "'") break; + $is_quoted = true; + } while (0); + + if ($is_quoted) { + $value = str_replace('\n', "\n", $value); + return strtr(substr ($value, 1, -1), array ('\\"' => '"', '\'\'' => '\'', '\\\'' => '\'')); + } + + if (strpos($value, ' #') !== false && !$is_quoted) + $value = preg_replace('/\s+#(.+)$/','',$value); + + if ($first_character == '[' && $last_character == ']') { + // Take out strings sequences and mappings + $innerValue = trim(substr ($value, 1, -1)); + if ($innerValue === '') return array(); + $explode = $this->_inlineEscape($innerValue); + // Propagate value array + $value = array(); + foreach ($explode as $v) { + $value[] = $this->_toType($v); + } + return $value; + } + + if (strpos($value,': ')!==false && $first_character != '{') { + $array = explode(': ',$value); + $key = trim($array[0]); + array_shift($array); + $value = trim(implode(': ',$array)); + $value = $this->_toType($value); + return array($key => $value); + } + + if ($first_character == '{' && $last_character == '}') { + $innerValue = trim(substr ($value, 1, -1)); + if ($innerValue === '') return array(); + // Inline Mapping + // Take out strings sequences and mappings + $explode = $this->_inlineEscape($innerValue); + // Propagate value array + $array = array(); + foreach ($explode as $v) { + $SubArr = $this->_toType($v); + if (empty($SubArr)) continue; + if (is_array ($SubArr)) { + $array[key($SubArr)] = $SubArr[key($SubArr)]; continue; + } + $array[] = $SubArr; + } + return $array; + } + + if ($value == 'null' || $value == 'NULL' || $value == 'Null' || $value == '' || $value == '~') { + return null; + } + + if ( is_numeric($value) && preg_match ('/^(-|)[1-9]+[0-9]*$/', $value) ){ + $intvalue = (int)$value; + if ($intvalue != PHP_INT_MAX) + $value = $intvalue; + return $value; + } + + if (is_numeric($value) && preg_match('/^0[xX][0-9a-fA-F]+$/', $value)) { + // Hexadecimal value. + return hexdec($value); + } + + $this->coerceValue($value); + + if (is_numeric($value)) { + if ($value === '0') return 0; + if (rtrim ($value, 0) === $value) + $value = (float)$value; + return $value; + } + + return $value; + } + + /** + * Used in inlines to check for more inlines or quoted strings + * @access private + * @return array + */ + private function _inlineEscape($inline) { + // There's gotta be a cleaner way to do this... + // While pure sequences seem to be nesting just fine, + // pure mappings and mappings with sequences inside can't go very + // deep. This needs to be fixed. + + $seqs = array(); + $maps = array(); + $saved_strings = array(); + $saved_empties = array(); + + // Check for empty strings + $regex = '/("")|(\'\')/'; + if (preg_match_all($regex,$inline,$strings)) { + $saved_empties = $strings[0]; + $inline = preg_replace($regex,'YAMLEmpty',$inline); + } + unset($regex); + + // Check for strings + $regex = '/(?:(")|(?:\'))((?(1)[^"]+|[^\']+))(?(1)"|\')/'; + if (preg_match_all($regex,$inline,$strings)) { + $saved_strings = $strings[0]; + $inline = preg_replace($regex,'YAMLString',$inline); + } + unset($regex); + + // echo $inline; + + $i = 0; + do { + + // Check for sequences + while (preg_match('/\[([^{}\[\]]+)\]/U',$inline,$matchseqs)) { + $seqs[] = $matchseqs[0]; + $inline = preg_replace('/\[([^{}\[\]]+)\]/U', ('YAMLSeq' . (count($seqs) - 1) . 's'), $inline, 1); + } + + // Check for mappings + while (preg_match('/{([^\[\]{}]+)}/U',$inline,$matchmaps)) { + $maps[] = $matchmaps[0]; + $inline = preg_replace('/{([^\[\]{}]+)}/U', ('YAMLMap' . (count($maps) - 1) . 's'), $inline, 1); + } + + if ($i++ >= 10) break; + + } while (strpos ($inline, '[') !== false || strpos ($inline, '{') !== false); + + $explode = explode(',',$inline); + $explode = array_map('trim', $explode); + $stringi = 0; $i = 0; + + while (1) { + + // Re-add the sequences + if (!empty($seqs)) { + foreach ($explode as $key => $value) { + if (strpos($value,'YAMLSeq') !== false) { + foreach ($seqs as $seqk => $seq) { + $explode[$key] = str_replace(('YAMLSeq'.$seqk.'s'),$seq,$value); + $value = $explode[$key]; + } + } + } + } + + // Re-add the mappings + if (!empty($maps)) { + foreach ($explode as $key => $value) { + if (strpos($value,'YAMLMap') !== false) { + foreach ($maps as $mapk => $map) { + $explode[$key] = str_replace(('YAMLMap'.$mapk.'s'), $map, $value); + $value = $explode[$key]; + } + } + } + } + + + // Re-add the strings + if (!empty($saved_strings)) { + foreach ($explode as $key => $value) { + while (strpos($value,'YAMLString') !== false) { + $explode[$key] = preg_replace('/YAMLString/',$saved_strings[$stringi],$value, 1); + unset($saved_strings[$stringi]); + ++$stringi; + $value = $explode[$key]; + } + } + } + + + // Re-add the empties + if (!empty($saved_empties)) { + foreach ($explode as $key => $value) { + while (strpos($value,'YAMLEmpty') !== false) { + $explode[$key] = preg_replace('/YAMLEmpty/', '', $value, 1); + $value = $explode[$key]; + } + } + } + + $finished = true; + foreach ($explode as $key => $value) { + if (strpos($value,'YAMLSeq') !== false) { + $finished = false; break; + } + if (strpos($value,'YAMLMap') !== false) { + $finished = false; break; + } + if (strpos($value,'YAMLString') !== false) { + $finished = false; break; + } + if (strpos($value,'YAMLEmpty') !== false) { + $finished = false; break; + } + } + if ($finished) break; + + $i++; + if ($i > 10) + break; // Prevent infinite loops. + } + + + return $explode; + } + + private function literalBlockContinues ($line, $lineIndent) { + if (!trim($line)) return true; + if (strlen($line) - strlen(ltrim($line)) > $lineIndent) return true; + return false; + } + + private function referenceContentsByAlias ($alias) { + do { + if (!isset($this->SavedGroups[$alias])) { echo "Bad group name: $alias."; break; } + $groupPath = $this->SavedGroups[$alias]; + $value = $this->result; + foreach ($groupPath as $k) { + $value = $value[$k]; + } + } while (false); + return $value; + } + + private function addArrayInline ($array, $indent) { + $CommonGroupPath = $this->path; + if (empty ($array)) return false; + + foreach ($array as $k => $_) { + $this->addArray(array($k => $_), $indent); + $this->path = $CommonGroupPath; + } + return true; + } + + private function addArray ($incoming_data, $incoming_indent) { + + // print_r ($incoming_data); + + if (count ($incoming_data) > 1) + return $this->addArrayInline ($incoming_data, $incoming_indent); + + $key = key ($incoming_data); + $value = isset($incoming_data[$key]) ? $incoming_data[$key] : null; + if ($key === '__!YAMLZero') $key = '0'; + + if ($incoming_indent == 0 && !$this->_containsGroupAlias && !$this->_containsGroupAnchor) { // Shortcut for root-level values. + if ($key || $key === '' || $key === '0') { + $this->result[$key] = $value; + } else { + $this->result[] = $value; end ($this->result); $key = key ($this->result); + } + $this->path[$incoming_indent] = $key; + return; + } + + + + $history = array(); + // Unfolding inner array tree. + $history[] = $_arr = $this->result; + foreach ($this->path as $k) { + $history[] = $_arr = $_arr[$k]; + } + + if ($this->_containsGroupAlias) { + $value = $this->referenceContentsByAlias($this->_containsGroupAlias); + $this->_containsGroupAlias = false; + } + + + // Adding string or numeric key to the innermost level or $this->arr. + if (is_string($key) && $key == '<<') { + if (!is_array ($_arr)) { $_arr = array (); } + + $_arr = array_merge ($_arr, $value); + } else if ($key || $key === '' || $key === '0') { + if (!is_array ($_arr)) + $_arr = array ($key=>$value); + else + $_arr[$key] = $value; + } else { + if (!is_array ($_arr)) { $_arr = array ($value); $key = 0; } + else { $_arr[] = $value; end ($_arr); $key = key ($_arr); } + } + + $reverse_path = array_reverse($this->path); + $reverse_history = array_reverse ($history); + $reverse_history[0] = $_arr; + $cnt = count($reverse_history) - 1; + for ($i = 0; $i < $cnt; $i++) { + $reverse_history[$i+1][$reverse_path[$i]] = $reverse_history[$i]; + } + $this->result = $reverse_history[$cnt]; + + $this->path[$incoming_indent] = $key; + + if ($this->_containsGroupAnchor) { + $this->SavedGroups[$this->_containsGroupAnchor] = $this->path; + if (is_array ($value)) { + $k = key ($value); + if (!is_int ($k)) { + $this->SavedGroups[$this->_containsGroupAnchor][$incoming_indent + 2] = $k; + } + } + $this->_containsGroupAnchor = false; + } + + } + + private static function startsLiteralBlock ($line) { + $lastChar = substr (trim($line), -1); + if ($lastChar != '>' && $lastChar != '|') return false; + if ($lastChar == '|') return $lastChar; + // HTML tags should not be counted as literal blocks. + if (preg_match ('#<.*?>$#', $line)) return false; + return $lastChar; + } + + private static function greedilyNeedNextLine($line) { + $line = trim ($line); + if (!strlen($line)) return false; + if (substr ($line, -1, 1) == ']') return false; + if ($line[0] == '[') return true; + if (preg_match ('#^[^:]+?:\s*\[#', $line)) return true; + return false; + } + + private function addLiteralLine ($literalBlock, $line, $literalBlockStyle, $indent = -1) { + $line = self::stripIndent($line, $indent); + if ($literalBlockStyle !== '|') { + $line = self::stripIndent($line); + } + $line = rtrim ($line, "\r\n\t ") . "\n"; + if ($literalBlockStyle == '|') { + return $literalBlock . $line; + } + if (strlen($line) == 0) + return rtrim($literalBlock, ' ') . "\n"; + if ($line == "\n" && $literalBlockStyle == '>') { + return rtrim ($literalBlock, " \t") . "\n"; + } + if ($line != "\n") + $line = trim ($line, "\r\n ") . " "; + return $literalBlock . $line; + } + + function revertLiteralPlaceHolder ($lineArray, $literalBlock) { + foreach ($lineArray as $k => $_) { + if (is_array($_)) + $lineArray[$k] = $this->revertLiteralPlaceHolder ($_, $literalBlock); + else if (substr($_, -1 * strlen ($this->LiteralPlaceHolder)) == $this->LiteralPlaceHolder) + $lineArray[$k] = rtrim ($literalBlock, " \r\n"); + } + return $lineArray; + } + + private static function stripIndent ($line, $indent = -1) { + if ($indent == -1) $indent = strlen($line) - strlen(ltrim($line)); + return substr ($line, $indent); + } + + private function getParentPathByIndent ($indent) { + if ($indent == 0) return array(); + $linePath = $this->path; + do { + end($linePath); $lastIndentInParentPath = key($linePath); + if ($indent <= $lastIndentInParentPath) array_pop ($linePath); + } while ($indent <= $lastIndentInParentPath); + return $linePath; + } + + + private function clearBiggerPathValues ($indent) { + + + if ($indent == 0) $this->path = array(); + if (empty ($this->path)) return true; + + foreach ($this->path as $k => $_) { + if ($k > $indent) unset ($this->path[$k]); + } + + return true; + } + + + private static function isComment ($line) { + if (!$line) return false; + if ($line[0] == '#') return true; + if (trim($line, " \r\n\t") == '---') return true; + return false; + } + + private static function isEmpty ($line) { + return (trim ($line) === ''); + } + + + private function isArrayElement ($line) { + if (!$line || !is_scalar($line)) return false; + if (substr($line, 0, 2) != '- ') return false; + if (strlen ($line) > 3) + if (substr($line,0,3) == '---') return false; + + return true; + } + + private function isHashElement ($line) { + return strpos($line, ':'); + } + + private function isLiteral ($line) { + if ($this->isArrayElement($line)) return false; + if ($this->isHashElement($line)) return false; + return true; + } + + + private static function unquote ($value) { + if (!$value) return $value; + if (!is_string($value)) return $value; + if ($value[0] == '\'') return trim ($value, '\''); + if ($value[0] == '"') return trim ($value, '"'); + return $value; + } + + private function startsMappedSequence ($line) { + return (substr($line, 0, 2) == '- ' && substr ($line, -1, 1) == ':'); + } + + private function returnMappedSequence ($line) { + $array = array(); + $key = self::unquote(trim(substr($line,1,-1))); + $array[$key] = array(); + $this->delayedPath = array(strpos ($line, $key) + $this->indent => $key); + return array($array); + } + + private function checkKeysInValue($value) { + if (strchr('[{"\'', $value[0]) === false) { + if (strchr($value, ': ') !== false) { + throw new Exception('Too many keys: '.$value); + } + } + } + + private function returnMappedValue ($line) { + $this->checkKeysInValue($line); + $array = array(); + $key = self::unquote (trim(substr($line,0,-1))); + $array[$key] = ''; + return $array; + } + + private function startsMappedValue ($line) { + return (substr ($line, -1, 1) == ':'); + } + + private function isPlainArray ($line) { + return ($line[0] == '[' && substr ($line, -1, 1) == ']'); + } + + private function returnPlainArray ($line) { + return $this->_toType($line); + } + + private function returnKeyValuePair ($line) { + $array = array(); + $key = ''; + if (strpos ($line, ': ')) { + // It's a key/value pair most likely + // If the key is in double quotes pull it out + if (($line[0] == '"' || $line[0] == "'") && preg_match('/^(["\'](.*)["\'](\s)*:)/',$line,$matches)) { + $value = trim(str_replace($matches[1],'',$line)); + $key = $matches[2]; + } else { + // Do some guesswork as to the key and the value + $explode = explode(': ', $line); + $key = trim(array_shift($explode)); + $value = trim(implode(': ', $explode)); + $this->checkKeysInValue($value); + } + // Set the type of the value. Int, string, etc + $value = $this->_toType($value); + if ($key === '0') $key = '__!YAMLZero'; + $array[$key] = $value; + } else { + $array = array ($line); + } + return $array; + + } + + + private function returnArrayElement ($line) { + if (strlen($line) <= 1) return array(array()); // Weird %) + $array = array(); + $value = trim(substr($line,1)); + $value = $this->_toType($value); + if ($this->isArrayElement($value)) { + $value = $this->returnArrayElement($value); + } + $array[] = $value; + return $array; + } + + + private function nodeContainsGroup ($line) { + $symbolsForReference = 'A-z0-9_\-'; + if (strpos($line, '&') === false && strpos($line, '*') === false) return false; // Please die fast ;-) + if ($line[0] == '&' && preg_match('/^(&['.$symbolsForReference.']+)/', $line, $matches)) return $matches[1]; + if ($line[0] == '*' && preg_match('/^(\*['.$symbolsForReference.']+)/', $line, $matches)) return $matches[1]; + if (preg_match('/(&['.$symbolsForReference.']+)$/', $line, $matches)) return $matches[1]; + if (preg_match('/(\*['.$symbolsForReference.']+$)/', $line, $matches)) return $matches[1]; + if (preg_match ('#^\s*<<\s*:\s*(\*[^\s]+).*$#', $line, $matches)) return $matches[1]; + return false; + + } + + private function addGroup ($line, $group) { + if ($group[0] == '&') $this->_containsGroupAnchor = substr ($group, 1); + if ($group[0] == '*') $this->_containsGroupAlias = substr ($group, 1); + //print_r ($this->path); + } + + private function stripGroup ($line, $group) { + $line = trim(str_replace($group, '', $line)); + return $line; + } +} + +// Enable use of Spyc from command line +// The syntax is the following: php Spyc.php spyc.yaml + +do { + if (PHP_SAPI != 'cli') break; + if (empty ($_SERVER['argc']) || $_SERVER['argc'] < 2) break; + if (empty ($_SERVER['PHP_SELF']) || FALSE === strpos ($_SERVER['PHP_SELF'], 'Spyc.php') ) break; + $file = $argv[1]; + echo json_encode (spyc_load_file ($file)); +} while (0); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/composer.json b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/composer.json new file mode 100755 index 00000000..e5ab7768 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/composer.json @@ -0,0 +1,30 @@ +{ + "name": "mustangostang/spyc", + "description": "A simple YAML loader/dumper class for PHP", + "type": "library", + "keywords": [ + "spyc", + "yaml", + "yml" + ], + "homepage": "https://github.com/mustangostang/spyc/", + "authors" : [{ + "name": "mustangostang", + "email": "vlad.andersen@gmail.com" + }], + "license": "MIT", + "require": { + "php": ">=5.3.1" + }, + "autoload": { + "files": [ "Spyc.php" ] + }, + "require-dev": { + "phpunit/phpunit": "4.3.*@dev" + }, + "extra": { + "branch-alias": { + "dev-master": "0.5.x-dev" + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/LICENSE b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/LICENSE new file mode 100755 index 00000000..d6456956 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/README.md b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/README.md new file mode 100755 index 00000000..7d45323c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/README.md @@ -0,0 +1,211 @@ +# tmhOAuth + +An OAuth 1.0A library written in PHP by @themattharris, specifically for use +with the Twitter API. + +**Disclaimer**: This project is a work in progress. Please use the issue tracker +to report any enhancements or issues you encounter. + +## Goals + +- Support OAuth 1.0A +- Use Authorisation headers instead of query string or POST parameters +- Allow uploading of images +- Provide enough information to assist with debugging + +## Dependencies + +The library has been tested with PHP 5.3+ and relies on CURL and hash_hmac. The +vast majority of hosting providers include these libraries and run with PHP 5.1+. + +The code makes use of hash_hmac, which was introduced in PHP 5.1.2. If your version +of PHP is lower than this you should ask your hosting provider for an update. + +## A note about security and SSL + +Version 0.60 hardened the security of the library and defaulted `curl_ssl_verifypeer` to `true`. +As some hosting providers do not provide the most current certificate root file +it is now included in this repository. If the version is out of date OR you prefer +to download the certificate roots yourself, you can get them +from: http://curl.haxx.se/ca/cacert.pem + +Before upgrading the version of tmhOAuth that you use, be sure to verify the SSL +handling works on your server by running the `examples/verify_ssl.php` script. + +## Usage + +This will be built out later but for the moment review the examples repository + for ways the library can be +used. Each example contains instructions on how to use it. + +## Notes for users of previous versions + +If you previously used version 0.4 be aware the utility functions +have now been broken into their own file. Before you use version 0.5+ in your app +test locally to ensure your code doesn't need tmhUtilities included. + +If you used custom HTTP request headers when they were defined as `'key: value'` strings +you should now define them as `'key' => 'value'` pairs. + +Versions prior to 0.7.3 collapsed headers with the same value into one +$tmhOAuth->response['headers'] key. Since 0.7.3 headers with the same key will use an array +to store their values. + +## Change History +### 0.7.5 - 20 Februrary 2013 +- tidying up of composer.json. (Issue #112) Props: ceeram + +### 0.7.4 - 19 Februrary 2013 +- corrections to composer.json to support packagists requirements. (Issue #110) + +### 0.7.3 - 18 Februrary 2013 +- add support for making requests with the host header being different to the request host. +- ensure headers with the same key do not overwrite each other in $tmhOAuth->response['headers']. +- removed examples submodule in favor of examples including tmhOAuth, rather than tmhOAuth including examples +- made it so that if param values are sent to $tmhOAuth->request as an array (key -> array()) then $tmhOAuth->prepare_params will now implode them using ',' +- fixed composer. (Issue #99). Props: rasa +- fixed PHPDoc. (Issue #47). Props: trante +- instead of void, $tmhOAuth->curlit now returns 0 if 'prevent_request' is set + +### 0.7.2 - 01 November 2012 +- use DIRECTORY_SEPARATOR for multi-environment support. (Issue #80) Props: whallz +- tidied up the curlHeader function to use explode instead of substr and store the keys in the format they are returned from the API +- removed content-length hack as it isn't needed if CURLOPT_POSTFIELDS is initialized on all POSTs +- removed the expects header hack as Twitter no longer requires it to be there +- introduce composer.json. (Issues #39, #77, #85) Props: akandels, conradkleinespel, dguyon, kud, philsturgeon, willdurand +- added support for specifying custom headers when using $tmhOAuth->request. (Issue #98) + +### 0.7.1 - 27 October 2012 +- set content-length to 0 explictly to avoid a bug between libcurl and Twitter. (Issue #94) +- allow initialization without a configuration array (default config to array()) +- prevent ->url allowing double slashes in paths + +### 0.7.0 - 04 September 2012 +- changed version numbers to x.y.z format +- stronger method scoping (public and private) +- Typo fix in depenencies. (Issue #42) Props: tantek +- Only lowercase the host and scheme, and not path, in prepare_url. (Issue #56) Props: uzyn +- Fixed a number of PHP warnings by changing some tmhUtilty methods to static. (Issue #52) Props: DrayChou +- Raw headers and response body are now available as `$tmhOAuth->response['raw']` +- Moved the examples to their own repository +- Removed the `noexamples` branch as master does not contain examples anymore +- Introduced `$tmhOAuth->config['timezone']` and set `date_default_timezone_set`. (Issue #70) Props: iamctodd + +### 0.621 - 12 March 2012 +- Ensure `$_SERVER['HTTPS']` isset before checking it's value. Props: kud + +### 0.62 - 01 March 2012 +- Fix array merging bug. Props: julien-c +- use is_callable instead of function_exists: Props: samwierema +- Allow options to be specified for the entify function. Props: davidcroda +- protocol was not inferred correctly for https when ['HTTPS'] == 'on'. Props: ospector +- Switched to https for twitter.com display URLs +- Improved the search results example + +### 0.61 - 16 January 2012 +- Removed trailing ?> from tmhOAuth.php and tmhUtilities.php to meet the Zend Framework's coding practices. Props: reedy +- Fixed bug where CURLOPT_SSL_VERIFYHOST was defaulted to true when it should have been defaulted to 2. Props: kevinsmcarthur + +### 0.60 - 29 December 2011 +- Changed any use of implode to the preferred format of implode($glue, $pieces). Props: reedy +- Moved oauth_verifier to the authorization header as shown in example of RFC 5849. Props: spacenick +- added curl error and error number values to the $tmhOAuth->response object +- added an example script for testing the SSL connection to twitter.com with the new SSL configuration of tmhOAuth +- added a function to generate the useragent depending on whether SSL is on or not +- defaulted CURLOPT_SSL_VERIFYPEER to true +- added CURLOPT_SSL_VERIFYHOST and defaulted it to true +- added the most current cacert.pem file from http://curl.haxx.se/ca/cacert.pem and configured curl to use it + +### 0.58 - 29 December 2011 +- Rearranged some configuration variables around to make commenting easier +- Standarised on lowercase booleans + +### 0.57 - 11 December 2011 +- Fixed prevent_request so OAuth Echo requests work again. +- Added a TwitPic OAuth Echo example + +### 0.56 - 29 September 2011 +- Fixed version reference in the UserAgent +- Updated tmhUtilities::entify with support for media +- Updated tmhUtilities::entify with support for multibyte characters. Props: andersonshatch + +### 0.55 - 29 September 2011 +- Added support for content encoding. Defaults to whatever localhost supports. Props: yusuke + +### 0.54 - 29 September 2011 +- User-Agent is now configurable and includes the current version number of the script +- Updated the Streaming examples to use SSL + +### 0.53 - 15 July 2011 +- Fixed issue where headers were being duplicated if the library was called more than once. +- Updated examples to fit the new location of access tokens and secrets on dev.twitter.com +- Added Photo Tweet example + +### 0.52 - 06 July 2011 +- Fixed issue where the preference for include_time in create_nonce was being ignored + +### 0.51 - 06 July 2011 +- Use isset instead of suppress errors. Props: funkatron +- Added example of using the Search API +- Added example of using friends/ids and users/lookup to get details of a users friends +- Added example of the authorize OAuth webflow + +### 0.5 - 29 March 2011 +- Moved utility functions out of the main class and into the tmhUtilities class. +- Added the ability to send OAuth parameters as part of the querystring or POST body. +- Section 3.4.1.2 says the url must be lowercase so prepare URL now does this. +- Added a convenience method for accessing the safe_encode/decode transforms. +- Updated the examples to use the new utilities library. +- Added examples for sitestreams and userstreams. +- Added a more advanced streaming API example. + +### 0.4 - 03 March 2011 +- Fixed handling of parameters when using DELETE. Thanks to yusuke for reporting +- Fixed php_self to handle port numbers other than 80/443. Props: yusuke +- Updated function pr to use pre only when not running in CLI mode +- Add support for proxy servers. Props juanchorossi +- Function request now returns the HTTP status code. Props: kronenthaler +- Documentation fixes for xAuth. Props: 140dev +- Some minor code formatting changes + +### 0.3 - 28 September 2010 +- Moved entities rendering into the library + +### 0.2 - 17 September 2010 +- Added support for the Streaming API + +### 0.14 - 17 September 2010 +- Fixed authorisation header for use with OAuth Echo + +### 0.13 - 17 September 2010 +- Added use_ssl configuration parameter +- Fixed config array typo +- Removed v from the config +- Remove protocol from the host (configured by use_ssl) +- Added include for easier debugging + +### 0.12 - 17 September 2010 + +- Moved curl options to config +- Added the ability for curl to follow redirects, default false + +### 0.11 - 17 September 2010 + +- Fixed a bug in the GET requests + +### 0.1 - 26 August 2010 + +- Initial beta version + +## Community + +License: Apache 2 (see [included LICENSE file](https://github.com/themattharris/tmhOAuth/blob/master/LICENSE)) + +Follow [@tmhOAuth](https://twitter.com/intent/follow?screen_name=tmhOAuth) to receive updates on releases, or ask for support +Follow me on Twitter: [@themattharris](https://twitter.com/intent/follow?screen_name=themattharris) +Check out the Twitter Developer Resources: + +## To Do + +- Add good behavior logic to the Streaming API handler - i.e. on disconnect back off +- Async Curl support \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/cacert.pem b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/cacert.pem new file mode 100755 index 00000000..334fb26a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/cacert.pem @@ -0,0 +1,3376 @@ +## +## ca-bundle.crt -- Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Thu Nov 3 19:04:19 2011 +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## + +# ***** BEGIN LICENSE BLOCK ***** +# Version: MPL 1.1/GPL 2.0/LGPL 2.1 +# +# The contents of this file are subject to the Mozilla Public License Version +# 1.1 (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. +# +# The Original Code is the Netscape security libraries. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1994-2000 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# +# Alternatively, the contents of this file may be used under the terms of +# either the GNU General Public License Version 2 or later (the "GPL"), or +# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +# in which case the provisions of the GPL or the LGPL are applicable instead +# of those above. If you wish to allow use of your version of this file only +# under the terms of either the GPL or the LGPL, and not to allow others to +# use your version of this file under the terms of the MPL, indicate your +# decision by deleting the provisions above and replace them with the notice +# and other provisions required by the GPL or the LGPL. If you do not delete +# the provisions above, a recipient may use your version of this file under +# the terms of any one of the MPL, the GPL or the LGPL. +# +# ***** END LICENSE BLOCK ***** +# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $ + +GTE CyberTrust Global Root +========================== +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg +Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG +A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz +MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL +Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 +IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u +sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql +HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID +AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW +M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF +NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +Thawte Server CA +================ +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE +AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j +b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV +BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u +c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG +A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 +ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl +/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 +1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J +GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ +GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +Thawte Premium Server CA +======================== +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE +AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl +ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU +VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 +aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ +cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 +aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh +Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ +qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm +SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf +8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t +UCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +Equifax Secure CA +================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE +ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT +B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR +fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW +8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE +CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS +spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 +zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB +BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 +70+sB3c4 +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 1 +======================================= +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE +ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy +MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs +IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE +NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i +o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo +BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 +dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM +BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB +ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq +kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4 +RbyhkwS7hp86W0N6w4pl +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 3 +======================================= +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE +ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy +MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs +IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD +VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS +xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo +BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 +dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM +BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB +AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi +up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1 +mPnHfxsb1gYgAlihw6ID +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA +TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah +WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf +Tqj/ZA1k +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO +FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 +lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT +1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD +Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 +-----END CERTIFICATE----- + +Verisign Class 4 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4 +xBewRNzjMHPVKmIquNDMHO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDH +qGKB3FtKqsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwjcSGIL4LcY/oCRaxF +WdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0ycyfYaT5DdPauxYma51N86Xv2S/PB +ZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRPT8qAkbYp +-----END CERTIFICATE----- + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +GlobalSign Root CA - R2 +======================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 +ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp +s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN +S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL +TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C +ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i +YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN +BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp +9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu +01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 +9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +ValiCert Class 1 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy +MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi +GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm +DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG +lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX +icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP +Orf1LXLI +-----END CERTIFICATE----- + +ValiCert Class 2 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC +CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf +ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ +SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV +UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 +W9ViH0Pd +-----END CERTIFICATE----- + +RSA Root Certificate 1 +====================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td +3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H +BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs +3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF +V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r +on+jjBXu +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 +EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc +cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw +EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj +055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 +xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa +t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Verisign Class 4 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS +tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM +8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW +Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX +Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt +mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd +RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG +UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- + +Entrust.net Secure Server CA +============================ +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg +cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl +ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG +A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi +eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p +dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ +aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 +gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw +ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw +CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l +dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw +NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow +HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA +BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN +Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 +n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC +AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER +gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B +AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo +oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS +o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z +2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX +OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +Equifax Secure Global eBusiness CA +================================== +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp +bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx +HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds +b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV +PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN +qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn +hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j +BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs +MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN +I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY +NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 1 +============================= +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB +LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE +ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz +IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ +1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a +IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk +MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW +Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF +AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 +lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ +KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 2 +============================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE +ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y +MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT +DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn +2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5 +BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx +JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e +uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1 +jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia +78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm +V+GRMOrN +-----END CERTIFICATE----- + +AddTrust Low-Value Services Root +================================ +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU +cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw +CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO +ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 +54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr +oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 +Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui +GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w +HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw +HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt +ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph +iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr +mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj +ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +AddTrust External Root +====================== +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD +VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw +NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU +cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg +Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 ++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw +Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo +aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy +2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 +7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL +VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk +VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 +e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u +G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +AddTrust Public Services Root +============================= +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU +cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ +BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l +dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu +nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i +d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG +Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw +HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G +A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G +A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 +JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL ++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 +Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H +EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +AddTrust Qualified Certificates Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU +cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx +CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ +IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx +64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 +KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o +L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR +wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU +MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE +BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y +azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG +GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze +RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB +iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +RSA Security 2048 v3 +==================== +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK +ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy +MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb +BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 +Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb +WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH +KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP ++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E +FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY +v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj +0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj +VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 +nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA +pKnXwiJPZ9d37CAFYd4= +-----END CERTIFICATE----- + +GeoTrust Global CA +================== +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw +MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo +BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet +8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc +T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU +vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk +DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q +zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 +d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 +mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p +XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- + +GeoTrust Global CA 2 +==================== +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw +MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ +NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k +LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA +Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b +HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH +K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 +srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh +ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL +OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC +x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF +H4z1Ir+rzoPz4iIprn2DQKi6bA== +-----END CERTIFICATE----- + +GeoTrust Universal CA +===================== +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 +MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu +Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t +JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e +RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs +7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d +8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V +qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga +Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB +Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu +KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 +ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 +XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB +hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 +qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL +oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK +xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF +KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 +DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK +xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU +p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI +P/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +GeoTrust Universal CA 2 +======================= +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 +MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg +SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 +DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 +j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q +JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a +QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 +WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP +20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn +ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC +SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG +8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 ++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E +BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ +4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ +mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq +A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg +Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP +pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d +FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp +gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm +X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +America Online Root Certification Authority 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG +v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z +DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh +sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP +8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z +o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf +GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF +VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft +3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g +Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- + +America Online Root Certification Authority 2 +============================================= +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en +fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 +f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO +qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN +RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 +gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn +6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid +FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 +Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj +B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op +aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY +T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p ++DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg +JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy +zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO +ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh +1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf +GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff +Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP +cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= +-----END CERTIFICATE----- + +Visa eCommerce Root +=================== +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG +EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug +QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 +WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm +VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL +F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b +RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 +TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI +/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs +GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc +CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW +YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz +zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu +YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +TC TrustCenter, Germany, Class 2 CA +=================================== +-----BEGIN CERTIFICATE----- +MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI +EwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig +U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD +bGFzcyAyIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05 +ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt +YnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy +aXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg +MiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI +hvcNAQEBBQADgY0AMIGJAoGBANo46O0yAClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLs +qh1R1z2zUbKDTl3LSbDwTFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5N +u6hLVxa8/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy +LmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBAIRS+yjf +/x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ2 +9ELw+HkuCkhcq8xRT3h2oNmsGb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/Ac +ASZ4smZHcFFk +-----END CERTIFICATE----- + +TC TrustCenter, Germany, Class 3 CA +=================================== +-----BEGIN CERTIFICATE----- +MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI +EwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig +U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD +bGFzcyAzIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05 +ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt +YnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy +aXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg +MyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI +hvcNAQEBBQADgY0AMIGJAoGBALa0wTUFLg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN +2U4CdhHBC/KNecoAtvGwDtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+7 +7uMMfTDWw1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy +LmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBABY9xs3B +u4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIETb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm +5gZOngylerpuw3yCGdHHsbHD2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQS +CdS7kjXvD9s0 +-----END CERTIFICATE----- + +Certum Root CA +============== +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK +ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla +Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u +by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x +wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL +kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ +89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K +Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P +NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ +GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg +GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ +0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS +qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +Comodo Secure Services root +=========================== +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw +MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu +Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi +BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP +9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc +rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC +oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V +p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E +FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj +YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm +aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm +4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL +DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw +pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H +RR3B7Hzs/Sk= +-----END CERTIFICATE----- + +Comodo Trusted Services root +============================ +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw +MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h +bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw +IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 +3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y +/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 +juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS +ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud +DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp +ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl +cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw +uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA +BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l +R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O +9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +QuoVadis Root CA +================ +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE +ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz +MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp +cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD +EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk +J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL +F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL +YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen +AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w +PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y +ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 +MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj +YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW +Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu +BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw +FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 +tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo +fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul +LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x +gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi +5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi +5nrQNiOKSnQ2+Q== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx +ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 +XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk +lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB +lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy +lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt +66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn +wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh +D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy +BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie +J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud +DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU +a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv +Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 +UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm +VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK ++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW +IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 +WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X +f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II +4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 +VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx +OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg +DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij +KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K +DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv +BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp +p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 +nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX +MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM +Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz +uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT +BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj +YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB +BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD +VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 +ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE +AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV +qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s +hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z +POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 +Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp +8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC +bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu +g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p +vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr +qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +Sonera Class 2 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw +NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 +/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT +dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG +f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P +tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH +nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT +XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt +0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI +cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph +Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx +EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH +llpwrN9M +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA +============================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE +ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w +HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh +bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt +vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P +jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca +C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth +vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 +22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV +HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v +dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN +BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR +EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw +MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y +nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- + +TDC Internet Root CA +==================== +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE +ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx +NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu +ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j +xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL +znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc +5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 +otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI +AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM +VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM +MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC +AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe +UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G +CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m +gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb +O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU +Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- + +TDC OCES Root CA +================ +-----BEGIN CERTIFICATE----- +MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE +ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5 +MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH +nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0 +zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV +iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde +dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO +3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB +5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k +ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm +cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp +Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x +LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM +MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm +aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy +MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647 ++RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6 +NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4 +A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc +A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9 +AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1 +AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw== +-----END CERTIFICATE----- + +UTN DATACorp SGC Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ +BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa +MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w +HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy +dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys +raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo +wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA +9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv +33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud +DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 +BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD +LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 +DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 +I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx +EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP +DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- + +UTN USERFirst Hardware Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd +BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx +OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 +eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz +ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI +wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd +tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 +i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf +Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw +gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF +lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF +UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF +BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW +XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 +lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn +iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 +nfhmqA== +-----END CERTIFICATE----- + +Camerfirma Chambers of Commerce Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx +NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp +cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn +MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC +AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU +xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH +NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW +DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV +d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud +EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v +cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P +AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh +bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD +VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi +fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD +L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN +UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n +ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 +erfutGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +Camerfirma Global Chambersign Root +================================== +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx +NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt +YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg +MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw +ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J +1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O +by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl +6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c +8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ +BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j +aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B +Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj +aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y +ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA +PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y +gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ +PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 +IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes +t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +NetLock Notary (Class A) Root +============================= +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI +EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j +ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX +DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH +EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD +VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz +cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM +D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ +z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC +/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 +tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 +4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG +A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC +Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv +bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn +LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 +ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz +IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh +IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu +b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg +Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp +bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 +ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP +ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB +CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr +KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM +8CgHrTwXZoi1/baI +-----END CERTIFICATE----- + +NetLock Business (Class B) Root +=============================== +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg +VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD +VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv +bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg +VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S +o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr +1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV +HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ +RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh +dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 +ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv +c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg +YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz +Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA +bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl +IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 +YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj +cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM +43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR +stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +NetLock Express (Class C) Root +============================== +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ +BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j +ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z +W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 +euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw +DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN +RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn +YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB +IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i +aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 +ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y +emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k +IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ +UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg +YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 +xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW +gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj +YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH +AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw +Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg +U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 +LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh +cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT +dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC +AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh +3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm +vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk +fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 +fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ +EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl +1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ +lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro +g14= +-----END CERTIFICATE----- + +Taiwan GRCA +=========== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG +EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X +DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv +dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN +w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 +BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O +1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO +htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov +J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 +Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t +B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB +O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 +lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV +HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 +09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj +Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 +Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU +D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz +DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk +Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk +7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ +CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy ++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS +-----END CERTIFICATE----- + +Firmaprofesional Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT +GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp +Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA +ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL +MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT +OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2 +ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V +j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH +lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf +3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8 +NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww +KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG +AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD +ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq +u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf +wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm +7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG +VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= +-----END CERTIFICATE----- + +Wells Fargo Root CA +=================== +-----BEGIN CERTIFICATE----- +MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl +bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv +MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX +x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3 +E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5 +OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j +sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj +YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF +BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD +ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv +m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R +OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx +x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023 +tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= +-----END CERTIFICATE----- + +Swisscom Root CA 1 +================== +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG +EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy +dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4 +MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln +aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC +IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM +MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF +NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe +AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC +b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn +7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN +cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp +WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5 +haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY +MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw +HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j +BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9 +MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn +jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ +MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H +VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl +vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl +OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3 +1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq +nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy +x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW +NY6E0F/6MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +Certplus Class 2 Primary CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE +BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN +OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy +dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR +5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ +Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO +YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e +e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME +CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ +YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t +L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD +P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R +TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ +7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW +//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +DST Root CA X3 +============== +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK +ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X +DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 +cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT +rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 +UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy +xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d +utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ +MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug +dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE +GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw +RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS +fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +DST ACES CA X6 +============== +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT +MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha +MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE +CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI +DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa +pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow +GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy +MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu +Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy +dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU +CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 +5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t +Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs +vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 +oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 1 +============================================== +-----BEGIN CERTIFICATE----- +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP +MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 +acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx +MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg +U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB +TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC +aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX +yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i +Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ +8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 +W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME +BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 +sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE +q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY +nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 2 +============================================== +-----BEGIN CERTIFICATE----- +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP +MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN +MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr +dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G +A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls +acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe +LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI +x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g +QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr +5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB +AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt +Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ +hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P +9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 +UrbnBEI= +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw +EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN +MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp +c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq +t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C +jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg +vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF +ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR +AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend +jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO +peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR +7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi +GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 +OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm +5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr +44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf +Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m +Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp +mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk +vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf +KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br +NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj +viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT +BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X +DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 +aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG +9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 +N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm ++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH +6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu +MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h +qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 +FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs +ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc +celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X +CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB +tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P +4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F +kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L +3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx +/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa +DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP +e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu +WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ +DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub +DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN +b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 +nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge +RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt +tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI +hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K +Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN +NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa +Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG +1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +thawte Primary Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 +MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg +SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv +KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT +FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs +oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ +1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc +q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K +aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p +afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF +AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE +uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 +jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH +z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G5 +============================================================ +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh +dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz +j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD +Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ +Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r +fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv +Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG +SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ +X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE +KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC +Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE +ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +Network Solutions Certificate Authority +======================================= +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG +EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr +IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx +MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx +jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT +aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT +crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc +/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB +AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv +bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA +A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q +4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ +GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD +ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +WellsSecure Public Root Certificate Authority +============================================= +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM +F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw +NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl +bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD +VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 +iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 +i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 +bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB +K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB +AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu +cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm +lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB +i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww +GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI +K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 +bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj +qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es +E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ +tylv2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +IGC/A +===== +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD +VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE +Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy +MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI +EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT +STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 +TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW +So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy +HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd +frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ +tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB +egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC +iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK +q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q +MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI +lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF +0mBWWg== +-----END CERTIFICATE----- + +Security Communication EV RootCA1 +================================= +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE +BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl +Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO +/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX +WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z +ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 +bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK +9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm +iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG +Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW +mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW +T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GA CA +=============================== +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE +BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG +A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH +bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD +VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw +IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 +IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 +Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg +Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD +d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ +/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R +LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm +MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 ++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY +okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE +BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL +EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 +MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz +dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT +GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG +d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N +oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc +QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ +PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb +MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG +IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD +VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 +LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A +dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA +4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg +AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA +egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 +Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO +PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv +c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h +cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw +IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT +WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV +MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER +MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp +Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal +HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT +nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE +aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK +yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB +S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. +====================================== +-----BEGIN CERTIFICATE----- +MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT +AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg +LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w +HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ +U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh +IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN +yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU +2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 +4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP +2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm +8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf +HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa +Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK +5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b +czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g +ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF +BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug +cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf +AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX +EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v +/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 +MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 +3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk +eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f +/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h +RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU +Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 2 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw +MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw +IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 +xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ +Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u +SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G +dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ +KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj +TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP +JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk +vQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 3 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw +MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W +yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo +6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ +uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk +2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE +O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 +yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 +IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal +092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc +5A== +-----END CERTIFICATE----- + +TC TrustCenter Universal CA I +============================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy +IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN +MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg +VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw +JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC +qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv +xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw +ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O +gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j +BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG +1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy +vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 +ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a +7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY +-----END CERTIFICATE----- + +Deutsche Telekom Root CA 2 +========================== +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT +RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG +A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 +MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G +A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS +b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 +bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI +KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY +AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK +Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV +jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV +HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr +E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy +zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 +rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G +dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +ComSign Secured CA +================== +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE +AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w +NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD +QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs +49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH +7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB +kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 +9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw +AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t +U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA +j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC +AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a +BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp +FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP +51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz +OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== +-----END CERTIFICATE----- + +Cybertrust Global Root +====================== +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li +ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 +MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD +ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA ++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW +0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL +AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin +89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT +8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 +MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G +A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO +lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi +5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 +hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T +X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 +============================================================================================================================= +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH +DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q +aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry +b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV +BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg +S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 +MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl +IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF +n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl +IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft +dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl +cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO +Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 +xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR +6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd +BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 +N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT +y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh +LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M +dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= +-----END CERTIFICATE----- + +Buypass Class 2 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 +MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M +cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 +0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 +0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R +uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV +1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt +7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 +fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w +wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- + +Buypass Class 3 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 +MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx +ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 +n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia +AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c +1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 +pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA +EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 +htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj +el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 +-----END CERTIFICATE----- + +EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 +========================================================================== +-----BEGIN CERTIFICATE----- +MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg +QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe +Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p +ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt +IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by +X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b +gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr +eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ +TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy +Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn +uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI +qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm +ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0 +Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW +Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t +FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm +zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k +XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT +bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU +RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK +1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt +2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ +Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9 +AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +CNNIC ROOT +========== +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE +ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw +OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD +o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz +VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT +VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or +czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK +y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC +wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S +lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 +Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM +O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 +BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 +G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m +mxE= +-----END CERTIFICATE----- + +ApplicationCA - Japanese Government +=================================== +-----BEGIN CERTIFICATE----- +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT +SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw +MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl +cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 +fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN +wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE +jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu +nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU +WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV +BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD +vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs +o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g +/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD +io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW +dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G3 +============================================= +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz +NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo +YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT +LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j +K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE +c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C +IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu +dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr +2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 +cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE +Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s +t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +thawte Primary Root CA - G2 +=========================== +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC +VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu +IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg +Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV +MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG +b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt +IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS +LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 +8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU +mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN +G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K +rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +thawte Primary Root CA - G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w +ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD +VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG +A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At +P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC ++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY +7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW +vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ +KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK +A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC +8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm +er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G2 +============================================= +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 +OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl +b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG +BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc +KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ +EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m +ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 +npaqBA+K +-----END CERTIFICATE----- + +VeriSign Universal Root Certification Authority +=============================================== +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj +1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP +MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 +9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I +AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR +tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G +CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O +a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 +Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx +Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx +P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P +wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 +mJO37M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G4 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC +VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 +b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz +ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo +b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 +Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz +rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw +HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u +Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD +A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx +AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) FÅ‘tanúsítvány +============================================ +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G2 +================================== +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC +TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l +ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ +5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn +vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj +CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil +e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR +OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI +CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 +48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi +trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 +qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB +AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC +ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA +A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz ++51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj +f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN +kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk +CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF +URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb +CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h +oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV +IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm +66+KAQ== +-----END CERTIFICATE----- + +CA Disig +======== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK +QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw +MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz +bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm +GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD +Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo +hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt +ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w +gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P +AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz +aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff +ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa +BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t +WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 +mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ +CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K +ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA +4Z7CRneC9VkGjCFMhwnN5ag= +-----END CERTIFICATE----- + +Juur-SK +======= +-----BEGIN CERTIFICATE----- +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA +c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw +DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG +SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy +aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf +TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC ++Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw +UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa +Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF +MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD +HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh +AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA +cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr +AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw +cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G +A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo +ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL +abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 +IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh +Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 +yyqcjg== +-----END CERTIFICATE----- + +Hongkong Post Root CA 1 +======================= +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT +DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx +NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n +IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 +ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr +auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh +qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY +V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV +HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i +h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio +l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei +IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps +T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT +c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +ACEDICOM Root +============= +-----BEGIN CERTIFICATE----- +MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD +T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4 +MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG +A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk +WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD +YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew +MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb +m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk +HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT +xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2 +3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9 +2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq +TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz +4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU +9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv +bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg +aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP +eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk +zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1 +ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI +KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq +nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE +I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp +MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o +tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA== +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky +CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX +bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ +D/xwzoiQ +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi +=================================================== +-----BEGIN CERTIFICATE----- +MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz +ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 +MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 +cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u +aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY +8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y +jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI +JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk +9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG +SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d +F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq +D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 +Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq +fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +TC TrustCenter Universal CA III +=============================== +-----BEGIN CERTIFICATE----- +MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy +IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe +Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU +QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex +KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt +QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO +juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut +CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1 +M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G +A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA +g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+ +KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK +BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV +CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq +woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG +EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz +MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu +QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ +03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK +ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU ++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC +PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT +OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK +F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK +0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ +0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB +leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID +AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ +SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG +NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l +Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga +kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q +hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs +g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 +aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 +nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC +ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo +Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z +WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +Chambers of Commerce Root - 2008 +================================ +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy +Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl +ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF +EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl +cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA +XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj +h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ +ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk +NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g +D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 +lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ +0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 +EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI +G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ +BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh +bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh +bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC +CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH +AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 +wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH +3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU +RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 +M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 +YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF +9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK +zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG +nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ +-----END CERTIFICATE----- + +Global Chambersign Root - 2008 +============================== +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx +NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg +Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ +QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf +VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf +XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 +ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB +/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA +TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M +H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe +Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF +HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB +AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT +BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE +BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm +aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm +aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp +1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 +dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG +/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 +ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s +dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg +9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH +foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du +qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr +P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq +c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +Certinomis - Autorité Racine +============================= +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg +LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG +A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw +JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa +wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly +Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw +2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N +jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q +c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC +lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb +xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g +530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna +4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x +WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva +R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 +nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B +CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv +JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE +qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b +WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE +wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ +vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +Root CA Generalitat Valenciana +============================== +-----BEGIN CERTIFICATE----- +MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE +ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 +IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 +WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE +CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 +F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B +ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ +D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte +JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB +AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n +dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB +ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl +AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA +YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy +AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA +aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt +AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA +YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu +AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA +OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 +dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV +BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G +A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S +b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh +TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz +Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 +NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH +iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt ++GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= +-----END CERTIFICATE----- + +A-Trust-nQual-03 +================ +-----BEGIN CERTIFICATE----- +MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE +Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy +a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R +dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw +RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 +ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 +c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA +zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n +yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE +SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 +iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V +cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV +eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 +ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr +sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd +JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS +mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 +ahq97BvIxYSazQ== +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/tmhOAuth.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/tmhOAuth.php new file mode 100755 index 00000000..c4ad4e78 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/tmhOAuth.php @@ -0,0 +1,724 @@ +params = array(); + $this->headers = array(); + $this->auto_fixed_time = false; + $this->buffer = null; + + // default configuration options + $this->config = array_merge( + array( + // leave 'user_agent' blank for default, otherwise set this to + // something that clearly identifies your app + 'user_agent' => '', + // default timezone for requests + 'timezone' => 'UTC', + + 'use_ssl' => true, + 'host' => 'api.twitter.com', + + 'consumer_key' => '', + 'consumer_secret' => '', + 'user_token' => '', + 'user_secret' => '', + 'force_nonce' => false, + 'nonce' => false, // used for checking signatures. leave as false for auto + 'force_timestamp' => false, + 'timestamp' => false, // used for checking signatures. leave as false for auto + + // oauth signing variables that are not dynamic + 'oauth_version' => '1.0', + 'oauth_signature_method' => 'HMAC-SHA1', + + // you probably don't want to change any of these curl values + 'curl_connecttimeout' => 30, + 'curl_timeout' => 10, + + // for security this should always be set to 2. + 'curl_ssl_verifyhost' => 2, + // for security this should always be set to true. + 'curl_ssl_verifypeer' => true, + + // you can get the latest cacert.pem from here http://curl.haxx.se/ca/cacert.pem + 'curl_cainfo' => dirname(__FILE__) . DIRECTORY_SEPARATOR . 'cacert.pem', + 'curl_capath' => dirname(__FILE__), + + 'curl_followlocation' => false, // whether to follow redirects or not + + // support for proxy servers + 'curl_proxy' => false, // really you don't want to use this if you are using streaming + 'curl_proxyuserpwd' => false, // format username:password for proxy, if required + 'curl_encoding' => '', // leave blank for all supported formats, else use gzip, deflate, identity + + // streaming API + 'is_streaming' => false, + 'streaming_eol' => "\r\n", + 'streaming_metrics_interval' => 60, + + // header or querystring. You should always use header! + // this is just to help me debug other developers implementations + 'as_header' => true, + 'debug' => false, + ), + $config + ); + $this->set_user_agent(); + date_default_timezone_set($this->config['timezone']); + } + + /** + * Sets the useragent for PHP to use + * If '$this->config['user_agent']' already has a value it is used instead of one + * being generated. + * + * @return void value is stored to the config array class variable + */ + private function set_user_agent() { + if (!empty($this->config['user_agent'])) + return; + + if ($this->config['curl_ssl_verifyhost'] && $this->config['curl_ssl_verifypeer']) { + $ssl = '+SSL'; + } else { + $ssl = '-SSL'; + } + + $ua = 'tmhOAuth ' . self::VERSION . $ssl . ' - //github.com/themattharris/tmhOAuth'; + $this->config['user_agent'] = $ua; + } + + /** + * Generates a random OAuth nonce. + * If 'force_nonce' is true a nonce is not generated and the value in the configuration will be retained. + * + * @param string $length how many characters the nonce should be before MD5 hashing. default 12 + * @param string $include_time whether to include time at the beginning of the nonce. default true + * @return void value is stored to the config array class variable + */ + private function create_nonce($length=12, $include_time=true) { + if ($this->config['force_nonce'] == false) { + $sequence = array_merge(range(0,9), range('A','Z'), range('a','z')); + $length = $length > count($sequence) ? count($sequence) : $length; + shuffle($sequence); + + $prefix = $include_time ? microtime() : ''; + $this->config['nonce'] = md5(substr($prefix . implode('', $sequence), 0, $length)); + } + } + + /** + * Generates a timestamp. + * If 'force_timestamp' is true a nonce is not generated and the value in the configuration will be retained. + * + * @return void value is stored to the config array class variable + */ + private function create_timestamp() { + $this->config['timestamp'] = ($this->config['force_timestamp'] == false ? time() : $this->config['timestamp']); + } + + /** + * Encodes the string or array passed in a way compatible with OAuth. + * If an array is passed each array value will will be encoded. + * + * @param mixed $data the scalar or array to encode + * @return $data encoded in a way compatible with OAuth + */ + private function safe_encode($data) { + if (is_array($data)) { + return array_map(array($this, 'safe_encode'), $data); + } else if (is_scalar($data)) { + return str_ireplace( + array('+', '%7E'), + array(' ', '~'), + rawurlencode($data) + ); + } else { + return ''; + } + } + + /** + * Decodes the string or array from it's URL encoded form + * If an array is passed each array value will will be decoded. + * + * @param mixed $data the scalar or array to decode + * @return string $data decoded from the URL encoded form + */ + private function safe_decode($data) { + if (is_array($data)) { + return array_map(array($this, 'safe_decode'), $data); + } else if (is_scalar($data)) { + return rawurldecode($data); + } else { + return ''; + } + } + + /** + * Returns an array of the standard OAuth parameters. + * + * @return array all required OAuth parameters, safely encoded + */ + private function get_defaults() { + $defaults = array( + 'oauth_version' => $this->config['oauth_version'], + 'oauth_nonce' => $this->config['nonce'], + 'oauth_timestamp' => $this->config['timestamp'], + 'oauth_consumer_key' => $this->config['consumer_key'], + 'oauth_signature_method' => $this->config['oauth_signature_method'], + ); + + // include the user token if it exists + if ( $this->config['user_token'] ) + $defaults['oauth_token'] = $this->config['user_token']; + + // safely encode + foreach ($defaults as $k => $v) { + $_defaults[$this->safe_encode($k)] = $this->safe_encode($v); + } + + return $_defaults; + } + + /** + * Extracts and decodes OAuth parameters from the passed string + * + * @param string $body the response body from an OAuth flow method + * @return array the response body safely decoded to an array of key => values + */ + public function extract_params($body) { + $kvs = explode('&', $body); + $decoded = array(); + foreach ($kvs as $kv) { + $kv = explode('=', $kv, 2); + $kv[0] = $this->safe_decode($kv[0]); + $kv[1] = $this->safe_decode($kv[1]); + $decoded[$kv[0]] = $kv[1]; + } + return $decoded; + } + + /** + * Prepares the HTTP method for use in the base string by converting it to + * uppercase. + * + * @param string $method an HTTP method such as GET or POST + * @return void value is stored to the class variable 'method' + */ + private function prepare_method($method) { + $this->method = strtoupper($method); + } + + /** + * Prepares the URL for use in the base string by ripping it apart and + * reconstructing it. + * + * Ref: 3.4.1.2 + * + * @param string $url the request URL + * @return void value is stored to the class variable 'url' + */ + private function prepare_url($url) { + $parts = parse_url($url); + + $port = isset($parts['port']) ? $parts['port'] : false; + $scheme = $parts['scheme']; + $host = $parts['host']; + $path = isset($parts['path']) ? $parts['path'] : false; + + $port or $port = ($scheme == 'https') ? '443' : '80'; + + if (($scheme == 'https' && $port != '443') + || ($scheme == 'http' && $port != '80')) { + $host = "$host:$port"; + } + + // the scheme and host MUST be lowercase + $this->url = strtolower("$scheme://$host"); + // but not the path + $this->url .= $path; + } + + /** + * Prepares all parameters for the base string and request. + * Multipart parameters are ignored as they are not defined in the specification, + * all other types of parameter are encoded for compatibility with OAuth. + * + * @param array $params the parameters for the request + * @return void prepared values are stored in the class variable 'signing_params' + */ + private function prepare_params($params) { + // do not encode multipart parameters, leave them alone + if ($this->config['multipart']) { + $this->request_params = $params; + $params = array(); + } + + // signing parameters are request parameters + OAuth default parameters + $this->signing_params = array_merge($this->get_defaults(), (array)$params); + + // Remove oauth_signature if present + // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.") + if (isset($this->signing_params['oauth_signature'])) { + unset($this->signing_params['oauth_signature']); + } + + // Parameters are sorted by name, using lexicographical byte value ordering. + // Ref: Spec: 9.1.1 (1) + uksort($this->signing_params, 'strcmp'); + + // encode. Also sort the signed parameters from the POST parameters + foreach ($this->signing_params as $k => $v) { + $k = $this->safe_encode($k); + + if (is_array($v)) + $v = implode(',', $v); + + $v = $this->safe_encode($v); + $_signing_params[$k] = $v; + $kv[] = "{$k}={$v}"; + } + + // auth params = the default oauth params which are present in our collection of signing params + $this->auth_params = array_intersect_key($this->get_defaults(), $_signing_params); + if (isset($_signing_params['oauth_callback'])) { + $this->auth_params['oauth_callback'] = $_signing_params['oauth_callback']; + unset($_signing_params['oauth_callback']); + } + + if (isset($_signing_params['oauth_verifier'])) { + $this->auth_params['oauth_verifier'] = $_signing_params['oauth_verifier']; + unset($_signing_params['oauth_verifier']); + } + + // request_params is already set if we're doing multipart, if not we need to set them now + if ( ! $this->config['multipart']) + $this->request_params = array_diff_key($_signing_params, $this->get_defaults()); + + // create the parameter part of the base string + $this->signing_params = implode('&', $kv); + } + + /** + * Prepares the OAuth signing key + * + * @return void prepared signing key is stored in the class variable 'signing_key' + */ + private function prepare_signing_key() { + $this->signing_key = $this->safe_encode($this->config['consumer_secret']) . '&' . $this->safe_encode($this->config['user_secret']); + } + + /** + * Prepare the base string. + * Ref: Spec: 9.1.3 ("Concatenate Request Elements") + * + * @return void prepared base string is stored in the class variable 'base_string' + */ + private function prepare_base_string() { + $url = $this->url; + + # if the host header is set we need to rewrite the basestring to use + # that, instead of the request host. otherwise the signature won't match + # on the server side + if (!empty($this->custom_headers['Host'])) { + $url = str_ireplace( + $this->config['host'], + $this->custom_headers['Host'], + $url + ); + } + + $base = array( + $this->method, + $url, + $this->signing_params + ); + $this->base_string = implode('&', $this->safe_encode($base)); + } + + /** + * Prepares the Authorization header + * + * @return void prepared authorization header is stored in the class variable headers['Authorization'] + */ + private function prepare_auth_header() { + unset($this->headers['Authorization']); + + uksort($this->auth_params, 'strcmp'); + if (!$this->config['as_header']) : + $this->request_params = array_merge($this->request_params, $this->auth_params); + return; + endif; + + foreach ($this->auth_params as $k => $v) { + $kv[] = "{$k}=\"{$v}\""; + } + $this->auth_header = 'OAuth ' . implode(', ', $kv); + $this->headers['Authorization'] = $this->auth_header; + } + + /** + * Signs the request and adds the OAuth signature. This runs all the request + * parameter preparation methods. + * + * @param string $method the HTTP method being used. e.g. POST, GET, HEAD etc + * @param string $url the request URL without query string parameters + * @param array $params the request parameters as an array of key=value pairs + * @param string $useauth whether to use authentication when making the request. + * @return void + */ + private function sign($method, $url, $params, $useauth) { + $this->prepare_method($method); + $this->prepare_url($url); + $this->prepare_params($params); + + // we don't sign anything is we're not using auth + if ($useauth) { + $this->prepare_base_string(); + $this->prepare_signing_key(); + + $this->auth_params['oauth_signature'] = $this->safe_encode( + base64_encode( + hash_hmac( + 'sha1', $this->base_string, $this->signing_key, true + ))); + + $this->prepare_auth_header(); + } + } + + /** + * Make an HTTP request using this library. This method doesn't return anything. + * Instead the response should be inspected directly. + * + * @param string $method the HTTP method being used. e.g. POST, GET, HEAD etc + * @param string $url the request URL without query string parameters + * @param array $params the request parameters as an array of key=value pairs. Default empty array + * @param string $useauth whether to use authentication when making the request. Default true + * @param string $multipart whether this request contains multipart data. Default false + * @param array $headers any custom headers to send with the request. Default empty array + * @return int the http response code for the request. 0 is returned if a connection could not be made + */ + public function request($method, $url, $params=array(), $useauth=true, $multipart=false, $headers=array()) { + // reset the request headers (we don't want to reuse them) + $this->headers = array(); + $this->custom_headers = $headers; + + $this->config['multipart'] = $multipart; + + $this->create_nonce(); + $this->create_timestamp(); + + $this->sign($method, $url, $params, $useauth); + + if (!empty($this->custom_headers)) + $this->headers = array_merge((array)$this->headers, (array)$this->custom_headers); + + return $this->curlit(); + } + + /** + * Make a long poll HTTP request using this library. This method is + * different to the other request methods as it isn't supposed to disconnect + * + * Using this method expects a callback which will receive the streaming + * responses. + * + * @param string $method the HTTP method being used. e.g. POST, GET, HEAD etc + * @param string $url the request URL without query string parameters + * @param array $params the request parameters as an array of key=value pairs + * @param string $callback the callback function to stream the buffer to. + * @return void + */ + public function streaming_request($method, $url, $params=array(), $callback='') { + if ( ! empty($callback) ) { + if ( ! is_callable($callback) ) { + return false; + } + $this->config['streaming_callback'] = $callback; + } + $this->metrics['start'] = time(); + $this->metrics['interval_start'] = $this->metrics['start']; + $this->metrics['tweets'] = 0; + $this->metrics['last_tweets'] = 0; + $this->metrics['bytes'] = 0; + $this->metrics['last_bytes'] = 0; + $this->config['is_streaming'] = true; + $this->request($method, $url, $params); + } + + /** + * Handles the updating of the current Streaming API metrics. + * + * @return array the metrics for the streaming api connection + */ + private function update_metrics() { + $now = time(); + if (($this->metrics['interval_start'] + $this->config['streaming_metrics_interval']) > $now) + return false; + + $this->metrics['tps'] = round( ($this->metrics['tweets'] - $this->metrics['last_tweets']) / $this->config['streaming_metrics_interval'], 2); + $this->metrics['bps'] = round( ($this->metrics['bytes'] - $this->metrics['last_bytes']) / $this->config['streaming_metrics_interval'], 2); + + $this->metrics['last_bytes'] = $this->metrics['bytes']; + $this->metrics['last_tweets'] = $this->metrics['tweets']; + $this->metrics['interval_start'] = $now; + return $this->metrics; + } + + /** + * Utility function to create the request URL in the requested format + * + * @param string $request the API method without extension + * @param string $format the format of the response. Default json. Set to an empty string to exclude the format + * @return string the concatenation of the host, API version, API method and format + */ + public function url($request, $format='json') { + $format = strlen($format) > 0 ? ".$format" : ''; + $proto = $this->config['use_ssl'] ? 'https:/' : 'http:/'; + + // backwards compatibility with v0.1 + if (isset($this->config['v'])) + $this->config['host'] = $this->config['host'] . '/' . $this->config['v']; + + $request = ltrim($request, '/'); + + $pos = strlen($request) - strlen($format); + if (substr($request, $pos) === $format) + $request = substr_replace($request, '', $pos); + + return implode('/', array( + $proto, + $this->config['host'], + $request . $format + )); + } + + /** + * Public access to the private safe decode/encode methods + * + * @param string $text the text to transform + * @param string $mode the transformation mode. either encode or decode + * @return string $text transformed by the given $mode + */ + public function transformText($text, $mode='encode') { + return $this->{"safe_$mode"}($text); + } + + /** + * Utility function to parse the returned curl headers and store them in the + * class array variable. + * + * @param object $ch curl handle + * @param string $header the response headers + * @return string the length of the header + */ + private function curlHeader($ch, $header) { + $this->response['raw'] .= $header; + + list($key, $value) = array_pad(explode(':', $header, 2), 2, null); + + $key = trim($key); + $value = trim($value); + + if ( ! isset($this->response['headers'][$key])) { + $this->response['headers'][$key] = $value; + } else { + if (!is_array($this->response['headers'][$key])) { + $this->response['headers'][$key] = array($this->response['headers'][$key]); + } + $this->response['headers'][$key][] = $value; + } + + return strlen($header); + } + + /** + * Utility function to parse the returned curl buffer and store them until + * an EOL is found. The buffer for curl is an undefined size so we need + * to collect the content until an EOL is found. + * + * This function calls the previously defined streaming callback method. + * + * @param object $ch curl handle + * @param string $data the current curl buffer + * @return int the length of the data string processed in this function + */ + private function curlWrite($ch, $data) { + $l = strlen($data); + if (strpos($data, $this->config['streaming_eol']) === false) { + $this->buffer .= $data; + return $l; + } + + $buffered = explode($this->config['streaming_eol'], $data); + $content = $this->buffer . $buffered[0]; + + $this->metrics['tweets']++; + $this->metrics['bytes'] += strlen($content); + + if ( ! is_callable($this->config['streaming_callback'])) + return 0; + + $metrics = $this->update_metrics(); + $stop = call_user_func( + $this->config['streaming_callback'], + $content, + strlen($content), + $metrics + ); + $this->buffer = $buffered[1]; + if ($stop) + return 0; + + return $l; + } + + /** + * Makes a curl request. Takes no parameters as all should have been prepared + * by the request method + * + * the response data is stored in the class variable 'response' + * + * @return int the http response code for the request. 0 is returned if a connection could not be made + */ + private function curlit() { + $this->response['raw'] = ''; + + // method handling + switch ($this->method) { + case 'POST': + break; + default: + // GET, DELETE request so convert the parameters to a querystring + if ( ! empty($this->request_params)) { + foreach ($this->request_params as $k => $v) { + // Multipart params haven't been encoded yet. + // Not sure why you would do a multipart GET but anyway, here's the support for it + if ($this->config['multipart']) { + $params[] = $this->safe_encode($k) . '=' . $this->safe_encode($v); + } else { + $params[] = $k . '=' . $v; + } + } + $qs = implode('&', $params); + $this->url = strlen($qs) > 0 ? $this->url . '?' . $qs : $this->url; + $this->request_params = array(); + } + break; + } + + // configure curl + $c = curl_init(); + curl_setopt_array($c, array( + CURLOPT_USERAGENT => $this->config['user_agent'], + CURLOPT_CONNECTTIMEOUT => $this->config['curl_connecttimeout'], + CURLOPT_TIMEOUT => $this->config['curl_timeout'], + CURLOPT_RETURNTRANSFER => true, + CURLOPT_SSL_VERIFYPEER => $this->config['curl_ssl_verifypeer'], + CURLOPT_SSL_VERIFYHOST => $this->config['curl_ssl_verifyhost'], + + CURLOPT_FOLLOWLOCATION => $this->config['curl_followlocation'], + CURLOPT_PROXY => $this->config['curl_proxy'], + CURLOPT_ENCODING => $this->config['curl_encoding'], + CURLOPT_URL => $this->url, + // process the headers + CURLOPT_HEADERFUNCTION => array($this, 'curlHeader'), + CURLOPT_HEADER => false, + CURLINFO_HEADER_OUT => true, + )); + + if ($this->config['curl_cainfo'] !== false) + curl_setopt($c, CURLOPT_CAINFO, $this->config['curl_cainfo']); + + if ($this->config['curl_capath'] !== false) + curl_setopt($c, CURLOPT_CAPATH, $this->config['curl_capath']); + + if ($this->config['curl_proxyuserpwd'] !== false) + curl_setopt($c, CURLOPT_PROXYUSERPWD, $this->config['curl_proxyuserpwd']); + + if ($this->config['is_streaming']) { + // process the body + $this->response['content-length'] = 0; + curl_setopt($c, CURLOPT_TIMEOUT, 0); + curl_setopt($c, CURLOPT_WRITEFUNCTION, array($this, 'curlWrite')); + } + + switch ($this->method) { + case 'GET': + break; + case 'POST': + curl_setopt($c, CURLOPT_POST, true); + curl_setopt($c, CURLOPT_POSTFIELDS, $this->request_params); + break; + default: + curl_setopt($c, CURLOPT_CUSTOMREQUEST, $this->method); + } + + if ( ! empty($this->request_params) ) { + // if not doing multipart we need to implode the parameters + if ( ! $this->config['multipart'] ) { + foreach ($this->request_params as $k => $v) { + $ps[] = "{$k}={$v}"; + } + $this->request_params = implode('&', $ps); + } + curl_setopt($c, CURLOPT_POSTFIELDS, $this->request_params); + } + + if ( ! empty($this->headers)) { + foreach ($this->headers as $k => $v) { + $headers[] = trim($k . ': ' . $v); + } + curl_setopt($c, CURLOPT_HTTPHEADER, $headers); + } + + if (isset($this->config['prevent_request']) && (true == $this->config['prevent_request'])) + return 0; + + // do it! + $response = curl_exec($c); + $code = curl_getinfo($c, CURLINFO_HTTP_CODE); + $info = curl_getinfo($c); + $error = curl_error($c); + $errno = curl_errno($c); + curl_close($c); + + // store the response + $this->response['code'] = $code; + $this->response['response'] = $response; + $this->response['info'] = $info; + $this->response['error'] = $error; + $this->response['errno'] = $errno; + + if (!isset($this->response['raw'])) { + $this->response['raw'] = ''; + } + $this->response['raw'] .= $response; + + return $code; + } +} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/tmhUtilities.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/tmhUtilities.php new file mode 100755 index 00000000..22277df3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/tmhUtilities.php @@ -0,0 +1,280 @@ + 'UTF-8', + 'target' => '', + ); + + $opts = array_merge($default_opts, $options); + + $encoding = mb_internal_encoding(); + mb_internal_encoding($opts['encoding']); + + $keys = array(); + $is_retweet = false; + + if (isset($tweet['retweeted_status'])) { + $tweet = $tweet['retweeted_status']; + $is_retweet = true; + } + + if (!isset($tweet['entities'])) { + return $tweet['text']; + } + + $target = (!empty($opts['target'])) ? ' target="'.$opts['target'].'"' : ''; + + // prepare the entities + foreach ($tweet['entities'] as $type => $things) { + foreach ($things as $entity => $value) { + $tweet_link = "{$tweet['created_at']}"; + + switch ($type) { + case 'hashtags': + $href = "#{$value['text']}"; + break; + case 'user_mentions': + $href = "@{$value['screen_name']}"; + break; + case 'urls': + case 'media': + $url = empty($value['expanded_url']) ? $value['url'] : $value['expanded_url']; + $display = isset($value['display_url']) ? $value['display_url'] : str_replace('http://', '', $url); + // Not all pages are served in UTF-8 so you may need to do this ... + $display = urldecode(str_replace('%E2%80%A6', '…', urlencode($display))); + $href = "{$display}"; + break; + } + $keys[$value['indices']['0']] = mb_substr( + $tweet['text'], + $value['indices']['0'], + $value['indices']['1'] - $value['indices']['0'] + ); + $replacements[$value['indices']['0']] = $href; + } + } + + ksort($replacements); + $replacements = array_reverse($replacements, true); + $entified_tweet = $tweet['text']; + foreach ($replacements as $k => $v) { + $entified_tweet = mb_substr($entified_tweet, 0, $k).$v.mb_substr($entified_tweet, $k + strlen($keys[$k])); + } + $replacements = array( + 'replacements' => $replacements, + 'keys' => $keys + ); + + mb_internal_encoding($encoding); + return $entified_tweet; + } + + /** + * Returns the current URL. This is instead of PHP_SELF which is unsafe + * + * @param bool $dropqs whether to drop the querystring or not. Default true + * @return string the current URL + */ + public static function php_self($dropqs=true) { + $protocol = 'http'; + if (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') { + $protocol = 'https'; + } elseif (isset($_SERVER['SERVER_PORT']) && ($_SERVER['SERVER_PORT'] == '443')) { + $protocol = 'https'; + } + + $url = sprintf('%s://%s%s', + $protocol, + $_SERVER['SERVER_NAME'], + $_SERVER['REQUEST_URI'] + ); + + $parts = parse_url($url); + + $port = $_SERVER['SERVER_PORT']; + $scheme = $parts['scheme']; + $host = $parts['host']; + $path = @$parts['path']; + $qs = @$parts['query']; + + $port or $port = ($scheme == 'https') ? '443' : '80'; + + if (($scheme == 'https' && $port != '443') + || ($scheme == 'http' && $port != '80')) { + $host = "$host:$port"; + } + $url = "$scheme://$host$path"; + if ( ! $dropqs) + return "{$url}?{$qs}"; + else + return $url; + } + + public static function is_cli() { + return (PHP_SAPI == 'cli' && empty($_SERVER['REMOTE_ADDR'])); + } + + /** + * Debug function for printing the content of an object + * + * @param mixes $obj + */ + public static function pr($obj) { + + if (!self::is_cli()) + echo '
';
+    if ( is_object($obj) )
+      print_r($obj);
+    elseif ( is_array($obj) )
+      print_r($obj);
+    else
+      echo $obj;
+    if (!self::is_cli())
+      echo '
'; + } + + /** + * Make an HTTP request using this library. This method is different to 'request' + * because on a 401 error it will retry the request. + * + * When a 401 error is returned it is possible the timestamp of the client is + * too different to that of the API server. In this situation it is recommended + * the request is retried with the OAuth timestamp set to the same as the API + * server. This method will automatically try that technique. + * + * This method doesn't return anything. Instead the response should be + * inspected directly. + * + * @param string $method the HTTP method being used. e.g. POST, GET, HEAD etc + * @param string $url the request URL without query string parameters + * @param array $params the request parameters as an array of key=value pairs + * @param string $useauth whether to use authentication when making the request. Default true. + * @param string $multipart whether this request contains multipart data. Default false + */ + public static function auto_fix_time_request($tmhOAuth, $method, $url, $params=array(), $useauth=true, $multipart=false) { + $tmhOAuth->request($method, $url, $params, $useauth, $multipart); + + // if we're not doing auth the timestamp isn't important + if ( ! $useauth) + return; + + // some error that isn't a 401 + if ($tmhOAuth->response['code'] != 401) + return; + + // some error that is a 401 but isn't because the OAuth token and signature are incorrect + // TODO: this check is horrid but helps avoid requesting twice when the username and password are wrong + if (stripos($tmhOAuth->response['response'], 'password') !== false) + return; + + // force the timestamp to be the same as the Twitter servers, and re-request + $tmhOAuth->auto_fixed_time = true; + $tmhOAuth->config['force_timestamp'] = true; + $tmhOAuth->config['timestamp'] = strtotime($tmhOAuth->response['headers']['date']); + return $tmhOAuth->request($method, $url, $params, $useauth, $multipart); + } + + /** + * Asks the user for input and returns the line they enter + * + * @param string $prompt the text to display to the user + * @return the text entered by the user + */ + public static function read_input($prompt) { + echo $prompt; + $handle = fopen("php://stdin","r"); + $data = fgets($handle); + return trim($data); + } + + /** + * Get a password from the shell. + * + * This function works on *nix systems only and requires shell_exec and stty. + * + * @param boolean $stars Wether or not to output stars for given characters + * @return string + * @url http://www.dasprids.de/blog/2008/08/22/getting-a-password-hidden-from-stdin-with-php-cli + */ + public static function read_password($prompt, $stars=false) { + echo $prompt; + $style = shell_exec('stty -g'); + + if ($stars === false) { + shell_exec('stty -echo'); + $password = rtrim(fgets(STDIN), "\n"); + } else { + shell_exec('stty -icanon -echo min 1 time 0'); + $password = ''; + while (true) : + $char = fgetc(STDIN); + if ($char === "\n") : + break; + elseif (ord($char) === 127) : + if (strlen($password) > 0) { + fwrite(STDOUT, "\x08 \x08"); + $password = substr($password, 0, -1); + } + else + fwrite(STDOUT, "*"); + $password .= $char; + endif; + endwhile; + } + + // Reset + shell_exec('stty ' . $style); + echo PHP_EOL; + return $password; + } + + /** + * Check if one string ends with another + * + * @param string $haystack the string to check inside of + * @param string $needle the string to check $haystack ends with + * @return true if $haystack ends with $needle, false otherwise + */ + public static function endswith($haystack, $needle) { + $haylen = strlen($haystack); + $needlelen = strlen($needle); + if ($needlelen > $haylen) + return false; + + return substr_compare($haystack, $needle, -$needlelen) === 0; + } +} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/README b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/README new file mode 100755 index 00000000..7f2baf21 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/README @@ -0,0 +1 @@ +https://www.transifex.com/rainloop/rainloop-webmail/ \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/README b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/README new file mode 100755 index 00000000..7f2baf21 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/README @@ -0,0 +1 @@ +https://www.transifex.com/rainloop/rainloop-webmail/ \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/_source.en.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/_source.en.yml new file mode 100755 index 00000000..ed6cbed2 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/_source.en.yml @@ -0,0 +1,324 @@ +en: + LOGIN: + LABEL_LOGIN: "Login" + LABEL_PASSWORD: "Password" + BUTTON_LOGIN: "Log into the admin panel" + TOP_PANEL: + LABEL_PREMIUM: "Premium" + LABEL_ADMIN_PANEL: "Admin Panel" + TABS_LABELS: + LABEL_GENERAL_NAME: "General" + LABEL_LOGIN_NAME: "Login" + LABEL_BRANDING_NAME: "Branding" + LABEL_CONTACTS_NAME: "Contacts" + LABEL_DOMAINS_NAME: "Domains" + LABEL_SECURITY_NAME: "Security" + LABEL_INTEGRATION_NAME: "Integrations" + LABEL_PLUGINS_NAME: "Plugins" + LABEL_PACKAGES_NAME: "Packages" + LABEL_LICENSING_NAME: "Licensing" + LABEL_ABOUT_NAME: "About" + TAB_GENERAL: + LEGEND_INTERFACE: "Interface" + LABEL_LANGUAGE: "Language" + LABEL_LANGUAGE_ADMIN: "Language (admin)" + LABEL_THEME: "Theme" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Allow language selection on settings screen" + LABEL_ALLOW_THEMES_ON_SETTINGS: "Allow theme selection on settings screen" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Allow background selection on settings screen" + LABEL_NEW_FOLDER_MOVE: "New \"move to folder\" button" + LABEL_SHOW_THUMBNAILS: "Show thumbnails (attachments)" + LABEL_ALLOW_GRAVATAR: "Allow Gravatar" + LEGEND_MAIN: "Main" + LABEL_ATTACHMENT_SIZE_LIMIT: "Attachment size limit" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Allow additional accounts" + LABEL_ALLOW_IDENTITIES: "Allow multiple identities" + LABEL_ALLOW_TEMPLATES: "Allow templates" + ALERT_DATA_ACCESS: "RainLoop data folder is accessible. Please configure your web server to hide the data folder from external access. Read more here:" + ALERT_WARNING: "Warning!" + HTML_ALERT_WEAK_PASSWORD: | + You are using the default admin password. +
+ For security reasons please + change + password to something else now. + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "Login Screen" + LABEL_DEFAULT_DOMAIN: "Default Domain" + LABEL_DETERMINE_USER_DOMAIN: "Try to determine user domain" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Allow language selection on login screen" + LABEL_DETERMINE_USER_LANGUAGE: "Try to determine user language" + TAB_BRANDING: + LEGEND_BRANDING: "Branding" + LABEL_PAGE_TITLE: "Page Title" + LABEL_LOADING_DESCRIPTION: "Loading Description" + LABEL_FAVICON_URL: "Favicon" + LEGEND_LOGIN: "Login" + LABEL_LOGIN_LOGO: "Logo" + LABEL_LOGIN_DESCRIPTION: "Description" + LABEL_LOGIN_BACKGROUND: "Background" + LABEL_LOGIN_CUSTOM_CSS: "Custom CSS" + LABEL_LOGIN_SHOW_POWERED_LINK: "Show \"Powered by RainLoop\" link" + LEGEND_USER: "User" + LABEL_USER_LOGO: "Logo" + LABEL_USER_LOGO_TITLE: "Logo Title" + LABEL_USER_LOGO_MESSAGE: "Logo (Message View)" + LABEL_USER_CUSTOM_CSS: "Custom CSS" + LEGEND_WELCOME_PAGE: "Welcome page" + LABEL_WELCOME_PAGE_TITLE: "Title" + LABEL_WELCOME_PAGE_URL: "URL" + LABEL_WELCOME_PAGE_DISPLAY: "Display" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "None" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Once" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Always" + HTML_ALERT_PREMIUM: "This functionality is available for Premium subscribers." + TAB_CONTACTS: + LEGEND_CONTACTS: "Contacts" + LEGEND_STORAGE: "Storage (PDO)" + LABEL_ENABLE_CONTACTS: "Enable contacts" + LABEL_ALLOW_SYNC: "Allow contacts sync (with external CardDAV server)" + LABEL_STORAGE_TYPE: "Type" + LABEL_STORAGE_DSN: "Dsn" + LABEL_STORAGE_USER: "User" + LABEL_STORAGE_PASSWORD: "Password" + BUTTON_TEST: "Test" + ALERT_NOTICE: "Notice!" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Don't use this database type with a large number of active users." + HTML_ALERT_DOES_NOT_SUPPORTED: | + Your system doesn't support contacts. +
+ You need to install or enable PDO (SQLite / MySQL / PostgreSQL) extension on your server. + TAB_DOMAINS: + LEGEND_DOMAINS: "Domains" + BUTTON_ADD_DOMAIN: "Add Domain" + BUTTON_ADD_ALIAS: "Add Alias" + DELETE_ARE_YOU_SURE: "Are you sure?" + HTML_DOMAINS_HELPER: | + List of domains webmail is allowed to access. +
+ Click on the name to configure the domain. + TAB_SECURITY: + LEGEND_SECURITY: "Security" + LABEL_ALLOW_TWO_STEP: "Allow 2-Step Verification" + LABEL_FORCE_TWO_STEP: "Enforce 2-Step Verification" + LABEL_USE_IMAGE_PROXY: "Use local proxy for external images" + LABEL_ALLOW_OPEN_PGP: "Allow OpenPGP" + LABEL_SHOW_PHP_INFO: "Show PHP information" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Admin Panel Access Credentials" + LABEL_CURRENT_PASSWORD: "Current password" + LABEL_NEW_LOGIN: "New login" + LABEL_NEW_PASSWORD: "New password" + LABEL_REPEAT_PASSWORD: "Repeat" + BUTTON_UPDATE_PASSWORD: "Update Password" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "Require verification of SSL certificate used (IMAP/SMTP)" + LABEL_ALLOW_SELF_SIGNED: "Allow self signed certificates" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "Enable Google Integration" + LABEL_GOOGLE_AUTH: "Authorization" + LABEL_GOOGLE_DRIVE: "Google Drive Integration (Compose view)" + LABEL_GOOGLE_PREVIEW: "Google Viewer Integration (Preview for Microsoft Word, Excel and PowerPoint files)" + LABEL_GOOGLE_CLIENT_ID: "Client ID" + LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" + LABEL_GOOGLE_API_KEY: "Api Key" + HINT_GOOGLE_API_KEY: "Required for Google Drive File Picker" + LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "Enable Facebook Integration (Authorization)" + LABEL_FACEBOOK_APP_ID: "App ID" + LABEL_FACEBOOK_APP_SECRET: "App Secret" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "Enable Twitter Integration (Authorization)" + LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" + LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" + LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "Enable Dropbox Integration" + LABEL_DROPBOX_API_KEY: "Api Key" + TOP_ALERT: "Detailed information on social integration is found at" + TAB_PLUGINS: + LEGEND_PLUGINS: "Plugins" + LABEL_ENABLE_PLUGINS: "Enable plugins" + ALERT_NO_PLUGINS: "No plugins have yet been installed." + LINK_INSTALL_NEW: "Click here to install new!" + HINT_CLICK_NAME: "Click on the name to configure the plugin." + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "Available for Update" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Available for Installation" + LEGEND_INSTALLED_PACKAGES: "Installed Packages" + ALERT_CANNOT_ACCESS_REPOSITORY: "Cannot access the repository at the moment." + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "Your domain" + LABEL_VERSION: "Version" + LABEL_CHECKING: "Checking" + TYPE_BASIC_HINT: "This domain isn't licensed for commercial use (with additional features)." + TYPE_BASIC_HINT_2: "This domain can't be licensed." + HTML_ALERT_TOP_1: "RainLoop Webmail is licensed under" + HTML_ALERT_TOP_2: "You are free to use it for your personal projects." + HTML_ALERT_TOP_3: | + Commercial use (with additional features) of RainLoop Webmail requires getting a + subscription. + TYPE_PREMIUM_LIFETIME: "Lifetime" + LABEL_SUB_EXPIRES: "Subscription expires" + BUTTON_ACTIVATE: "Activate Subscription Key for this domain" + BUTTON_PURCHASE: "Purchase" + BUTTON_TRIAL: "Trial" + TAB_ABOUT: + LEGEND_ABOUT: "About" + LABEL_TAG_HINT: "Simple, modern & fast web-based email client" + LABEL_ALL_RIGHTS_RESERVED: "All Rights Reserved." + HINT_READ_CHANGE_LOG: "Please read the change log before updating." + HINT_IS_UP_TO_DATE: "RainLoop is up to date." + HTML_NEW_VERSION: "New %VERSION% version is available." + LABEL_UPDATING: "Updating" + LABEL_CHECKING: "Checking for updates" + BUTTON_UPDATE: "Update" + BUTTON_DOWNLOAD: "Download" + BUTTON_CHANGELOG: "Changelog" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "Activate Subscription Key?" + TITLE_ACTIVATION: "Activation..." + LABEL_DOMAIN: "Domain" + LABEL_SUB_KEY: "Subscription Key" + BUTTON_ACTIVATE: "Activate" + LABEL_ACTIVATED: "Activated" + ERROR_INVALID_SUBS_KEY: "Invalid Subscription Key" + SUBS_KEY_ACTIVATED: "Subscription Key Activated Successfully" + HTML_DESC: | + After activation, premium subscription for %DOMAIN% will be extended. +
+ Note that subscription key can be activated for a single domain only. +

+ Once started, the process of activation cannot be aborted or cancelled. + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "Add Alias" + LABEL_ALIAS: "Alias" + LABEL_DOMAIN: "Domain" + BUTTON_CLOSE: "Close" + BUTTON_ADD: "Add" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "Add Domain" + TITLE_ADD_DOMAIN_WITH_NAME: "Add Domain \"%NAME%\"" + TITLE_EDIT_DOMAIN: "Edit Domain \"%NAME%\"" + LABEL_NAME: "Name" + NAME_HELPER: "wildcard supported" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "Server" + LABEL_PORT: "Port" + LABEL_SECURE: "Secure" + LABEL_WHITE_LIST: "White List" + SECURE_OPTION_NONE: "None" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "Allow sieve scripts" + LABEL_ALLOW_USER_SCRIPT: "Allow custom user script" + LABEL_USE_SHORT_LOGIN: "Use short login" + LABEL_USE_AUTH: "Use authentication" + LABEL_USE_PHP_MAIL: "Use php mail() function" + BUTTON_TEST: "Test" + BUTTON_WHITE_LIST: "White List" + BUTTON_SIEVE_CONFIGURATION: "Sieve configuration" + BUTTON_BACK_TO_IMAP: "Back to IMAP settings" + BUTTON_BACK: "Back" + BUTTON_CLOSE: "Close" + BUTTON_ADD: "Add" + BUTTON_UPDATE: "Update" + NEW_DOMAIN_DESC: "This domain configuration will allow you to work
with %NAME% email addresses." + WHITE_LIST_ALERT: | + List of domain users webmail is allowed to access. + Use a space as delimiter. + POPUPS_PLUGIN: + TITLE_PLUGIN: "Plugin" + DESC_NOTHING_TO_CONFIGURE: "Nothing to configure" + BUTTON_CLOSE: "Close" + BUTTON_SAVE: "Save" + TOOLTIP_ABOUT_TITLE: "About" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "Are you sure you want to close this window?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Choose your language" + HINTS: + BETA: "beta" + UNSTABLE: "unstable" + WARNING: "Warning!" + NOT_SUPPORTED: "not supported" + REQUIRES_PHP_54: "requires PHP 5.4 or greater" + ERRORS: + DOMAIN_ALREADY_EXISTS: "Domain already exists" + UNKNOWN_ERROR: "Unknown error" + NOTIFICATIONS: + INVALID_TOKEN: "Invalid token" + AUTH_ERROR: "Authentication failed" + ACCESS_ERROR: "Access error" + CONNECTION_ERROR: "Can't connect to server" + CAPTCHA_ERROR: "Incorrect CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + DOMAIN_NOT_ALLOWED: "Domain is not allowed" + ACCOUNT_NOT_ALLOWED: "Account is not allowed" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" + COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" + CURRENT_PASSWORD_INCORRECT: "Current password incorrect" + NEW_PASSWORD_SHORT: "Password is too short" + NEW_PASSWORD_WEAK: "Password is too easy" + NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" + CONTACTS_SYNC_ERROR: "Contacts synchronization error" + CANT_GET_MESSAGE_LIST: "Can't get message list" + CANT_GET_MESSAGE: "Can't get message" + CANT_DELETE_MESSAGE: "Can't delete message" + CANT_MOVE_MESSAGE: "Can't move message" + CANT_SAVE_MESSAGE: "Can't save message" + CANT_SEND_MESSAGE: "Can't send message" + INVALID_RECIPIENTS: "Invalid recipients" + CANT_SAVE_FILTERS: "Can't save filters" + CANT_GET_FILTERS: "Can't get filters" + FILTERS_ARE_NOT_CORRECT: "Filters are not correct" + CANT_CREATE_FOLDER: "Can't create folder" + CANT_RENAME_FOLDER: "Can't rename folder" + CANT_DELETE_FOLDER: "Can't delete folder" + CANT_DELETE_NON_EMPTY_FOLDER: "Can't delete non-empty directory" + CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" + CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" + CANT_SAVE_SETTINGS: "Can't save settings" + CANT_SAVE_PLUGIN_SETTINGS: "Can't save settings" + DOMAIN_ALREADY_EXISTS: "Domain already exists" + CANT_INSTALL_PACKAGE: "Failed to install package" + CANT_DELETE_PACKAGE: "Failed to remove package" + INVALID_PLUGIN_PACKAGE: "Invalid plugin package" + UNSUPPORTED_PLUGIN_PACKAGE: "Unsupported plugin package" + LICENSING_SERVER_IS_UNAVAILABLE: "Subscription server is unvailable" + LICENSING_DOMAIN_EXPIRED: "Subscription for this domain has expired." + LICENSING_DOMAIN_BANNED: "Subscription for this domain is banned." + DEMO_SEND_MESSAGE_ERROR: "For security purposes, this account is not allowed to send messages to external e-mail addresses!" + DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" + ACCOUNT_ALREADY_EXISTS: "Account already exists" + ACCOUNT_DOES_NOT_EXIST: "Account doesn't exist" + MAIL_SERVER_ERROR: "An error has occured while accessing mail server" + INVALID_INPUT_ARGUMENT: "Invalid input argument" + UNKNOWN_ERROR: "Unknown error" + STATIC: + BACK_LINK: "Reload" + DOMAIN_LIST_DESC: "List of domains webmail is allowed to access." + PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" + PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" + NO_SCRIPT_TITLE: "JavaScript is required for this application." + NO_SCRIPT_DESC: | + JavaScript support is not available in your browser. + Please enable JavaScript support in your browser settings and retry. + NO_COOKIE_TITLE: "Cookies support is required for this application." + NO_COOKIE_DESC: | + Cookies support is not available in your browser. + Please enable Cookie support in your browser settings and retry. + BAD_BROWSER_TITLE: "Your browser is outdated." + BAD_BROWSER_DESC: | + To use all the features of the application, + download and install one of these browsers: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/cs_CZ.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/cs_CZ.yml new file mode 100755 index 00000000..ab8d3ccf --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/cs_CZ.yml @@ -0,0 +1,316 @@ +cs_CZ: + LOGIN: + LABEL_LOGIN: "Login" + LABEL_PASSWORD: "Heslo" + BUTTON_LOGIN: "Přihlásit do administrace" + TOP_PANEL: + LABEL_PREMIUM: "Prémium" + LABEL_ADMIN_PANEL: "Administrační panel" + TABS_LABELS: + LABEL_GENERAL_NAME: "Základní" + LABEL_LOGIN_NAME: "Login" + LABEL_BRANDING_NAME: "Branding" + LABEL_CONTACTS_NAME: "Kontakty" + LABEL_DOMAINS_NAME: "Domény" + LABEL_SECURITY_NAME: "Zabezpečení" + LABEL_INTEGRATION_NAME: "Integrace" + LABEL_PLUGINS_NAME: "Pluginy" + LABEL_PACKAGES_NAME: "Balíčky" + LABEL_LICENSING_NAME: "Licence" + LABEL_ABOUT_NAME: "Info" + TAB_GENERAL: + LEGEND_INTERFACE: "Rozhraní" + LABEL_LANGUAGE: "Jazyk" + LABEL_LANGUAGE_ADMIN: "Jazyk (administrace)" + LABEL_THEME: "Motiv" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Povolit výběr jazyka na přihlašovací obrazovce" + LABEL_ALLOW_THEMES_ON_SETTINGS: "Povolit výběr motivu na přihlašovací obrazovce" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Povolit výběr pozadí na přihlašovací obrazovce" + LABEL_SHOW_THUMBNAILS: "Zobrazovat miniatury (přílohy)" + LABEL_ALLOW_GRAVATAR: "Povolit nastavení avatara" + LEGEND_MAIN: "Hlavní" + LABEL_ATTACHMENT_SIZE_LIMIT: "Limit velikosti přílohy" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Povolit přidávat další účty" + LABEL_ALLOW_IDENTITIES: "Povolit další identity" + LABEL_ALLOW_TEMPLATES: "Povolit šablony" + ALERT_WARNING: "Upozornění!" + HTML_ALERT_WEAK_PASSWORD: | + Používáte výchozí administrátorské heslo. +
+ Z bezpečnostních důvodů jeji prosím + změnte. + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "Přihlašovací obrazovka" + LABEL_DEFAULT_DOMAIN: "Výchozí doména" + LABEL_DETERMINE_USER_DOMAIN: "Zkoušet odvodit doménu z uživatelského jména" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Povolit výběr jazyka na přihlašovací obrazovce" + LABEL_DETERMINE_USER_LANGUAGE: "Zkoušet odvodit jazyk pro uživatele" + TAB_BRANDING: + LEGEND_BRANDING: "Branding" + LABEL_PAGE_TITLE: "Nadpis stránky" + LABEL_LOADING_DESCRIPTION: "Načítání popisu" + LABEL_FAVICON_URL: "Favicon" + LEGEND_LOGIN: "Login" + LABEL_LOGIN_LOGO: "Logo" + LABEL_LOGIN_DESCRIPTION: "Popis" + LABEL_LOGIN_BACKGROUND: "Pozadí" + LABEL_LOGIN_CUSTOM_CSS: "Vlastní CSS" + LABEL_LOGIN_SHOW_POWERED_LINK: "Zobrazovat \"Powered by RainLoop\" odkaz" + LEGEND_USER: "Uživatel" + LABEL_USER_LOGO: "Logo" + LABEL_USER_LOGO_TITLE: "Popis loga" + LABEL_USER_LOGO_MESSAGE: "Logo (detail zprávy)" + LABEL_USER_CUSTOM_CSS: "Vlastní CSS" + LEGEND_WELCOME_PAGE: "Uvítací stránka" + LABEL_WELCOME_PAGE_TITLE: "Nadpis" + LABEL_WELCOME_PAGE_URL: "URL" + LABEL_WELCOME_PAGE_DISPLAY: "Zobrazení" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "Nikdy" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Jednou" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Vždy" + HTML_ALERT_PREMIUM: "Tato funkce je dostupná pouze pro Prémiovou verzi." + TAB_CONTACTS: + LEGEND_CONTACTS: "Kontakty" + LEGEND_STORAGE: "Úložiště (PDO)" + LABEL_ENABLE_CONTACTS: "Povolit kontakty" + LABEL_ALLOW_SYNC: "Povolit synchronizaci kontaktů (přes externí CardDAV server)" + LABEL_STORAGE_TYPE: "Typ" + LABEL_STORAGE_DSN: "Dsn" + LABEL_STORAGE_USER: "Uživatel" + LABEL_STORAGE_PASSWORD: "Heslo" + BUTTON_TEST: "Test" + ALERT_NOTICE: "Upozornění!" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Nepoužívejte tento typ databáze při velkém počtu aktivních uživatelů." + HTML_ALERT_DOES_NOT_SUPPORTED: | + Váš systém nepodporuje kontakty. +
+ Je potřeba nainstalovat nebo povolit PDO (SQLite / MySQL / PostgreSQL) + rozšíření na vašem serveru. + TAB_DOMAINS: + LEGEND_DOMAINS: "Domény" + BUTTON_ADD_DOMAIN: "Přidat Doménu" + DELETE_ARE_YOU_SURE: "Jste si jistí?" + HTML_DOMAINS_HELPER: | + Seznam domén, ke kterým je možné přistupovat přes webmail. +
+ Klikněte na jméno domény pro její konfiguraci. + TAB_SECURITY: + LEGEND_SECURITY: "Zabezpečení" + LABEL_ALLOW_TWO_STEP: "Povolit dvoufázové ověření" + LABEL_FORCE_TWO_STEP: "Vynucovat dvoufázové ověření" + LABEL_USE_IMAGE_PROXY: "Použít lokální proxy pro externí obrázky" + LABEL_ALLOW_OPEN_PGP: "Povolit OpenPGP" + LABEL_SHOW_PHP_INFO: "Zobrazit PHP informace (php_info)" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Přístupové údaje administrace" + LABEL_CURRENT_PASSWORD: "Současné heslo" + LABEL_NEW_LOGIN: "Nový login" + LABEL_NEW_PASSWORD: "Nové heslo" + LABEL_REPEAT_PASSWORD: "Znovu" + BUTTON_UPDATE_PASSWORD: "Aktualizovat heslo" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "Vyžadovat ověření SSL certifikátu (IMAP/SMTP)" + LABEL_ALLOW_SELF_SIGNED: "Povolit self-signed certifikáty" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "Povolit Google integraci" + LABEL_GOOGLE_AUTH: "Authorizace" + LABEL_GOOGLE_DRIVE: "Google Drive integrace (Compose view)" + LABEL_GOOGLE_PREVIEW: "Google Viewer integrace (náhled pro Microsoft Word, Excel a PowerPoint soubory)" + LABEL_GOOGLE_CLIENT_ID: "Klient ID" + LABEL_GOOGLE_CLIENT_SECRET: "Klient Secret" + LABEL_GOOGLE_API_KEY: "Api klíč" + HINT_GOOGLE_API_KEY: "Vyžadováno pro Google Drive File Picker" + LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "Povolit Facebook integraci (Authorizaci)" + LABEL_FACEBOOK_APP_ID: "App ID" + LABEL_FACEBOOK_APP_SECRET: "App Secret" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "Povolit Twitter integraci (Authorizaci)" + LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" + LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" + LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "Povolit Dropbox integraci" + LABEL_DROPBOX_API_KEY: "Api key" + TOP_ALERT: "Detailní informace o integraci sociálních sítí jsou dostupné na adrese" + TAB_PLUGINS: + LEGEND_PLUGINS: "Pluginy" + LABEL_ENABLE_PLUGINS: "Povolit pluginy" + ALERT_NO_PLUGINS: "Žádné pluginy zatím nebyly nainstalovány." + LINK_INSTALL_NEW: "Klikněte zde pro instalaci nových." + HINT_CLICK_NAME: "Klikněte na jméno pluginu pro jeho konfiguraci." + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "Dostupné pro aktualizaci" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Dostupné pro instalaci" + LEGEND_INSTALLED_PACKAGES: "Nainstalované balíčky" + ALERT_CANNOT_ACCESS_REPOSITORY: "V tento moment se nelze připojit k repozitáři." + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "Vaše doména" + LABEL_VERSION: "Verze" + LABEL_CHECKING: "Kontrolování" + TYPE_BASIC_HINT: "Tato doména není licencována pro komerční užití." + TYPE_BASIC_HINT_2: "Tato doména nemůže být licencována." + HTML_ALERT_TOP_1: "RainLoop Webmail je licencován pod" + HTML_ALERT_TOP_2: "Můžete tento nástroj volně používat pro vaše osobní projekty." + HTML_ALERT_TOP_3: | + Komerční užívání (s přidanými doplňky) RainLoop Webmail vyžaduje získání + + licence. + TYPE_PREMIUM_LIFETIME: "Lifetime" + LABEL_SUB_EXPIRES: "Licence vyprší" + BUTTON_ACTIVATE: "Aktivační licenční klíč pro tuto doménu" + BUTTON_PURCHASE: "Koupit" + BUTTON_TRIAL: "Trial" + TAB_ABOUT: + LEGEND_ABOUT: "Info" + LABEL_TAG_HINT: "Jednoduchý, moderní a rychlý webový emailový klient" + LABEL_ALL_RIGHTS_RESERVED: "Všechna práva vyhrazena." + HINT_READ_CHANGE_LOG: "Přečtěte si prosím change log předtím, než budete chtít provést aktualizaci." + HINT_IS_UP_TO_DATE: "RainLoop je v aktuální verzi." + HTML_NEW_VERSION: "Nová verze %VERSION% je k dispozici." + LABEL_UPDATING: "Aktualizace" + LABEL_CHECKING: "Zjistit nové aktualizace" + BUTTON_UPDATE: "Aktualizace" + BUTTON_DOWNLOAD: "Stáhnout" + BUTTON_CHANGELOG: "Seznam změn" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "Aktivovat licenční klíč?" + TITLE_ACTIVATION: "Aktivace..." + LABEL_DOMAIN: "Doména" + LABEL_SUB_KEY: "Licenční klíč" + BUTTON_ACTIVATE: "Aktivovat" + LABEL_ACTIVATED: "Aktivováno" + ERROR_INVALID_SUBS_KEY: "Nevalidní licenční klíč" + SUBS_KEY_ACTIVATED: "Licenční klíč byl úspěšně aktivován" + HTML_DESC: | + Po aktivaci bude prémiové licence pro doménu %DOMAIN% prodloužena. +
+ Aktivační klíč lze použít pouze pro jednu doménu. +

+ Jakmile začnete proces aktivace, nelze ho přerušit nebo ukončit. + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "Přidat Doménu" + TITLE_ADD_DOMAIN_WITH_NAME: "Přidat Doménu \"%NAME%\"" + TITLE_EDIT_DOMAIN: "Editovat Doménu \"%NAME%\"" + LABEL_NAME: "Název" + NAME_HELPER: "wildcard podporovány" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "Server" + LABEL_PORT: "Port" + LABEL_SECURE: "Zabezpečení" + LABEL_WHITE_LIST: "White List" + SECURE_OPTION_NONE: "Žádné" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "Povolit SIEVE skripty" + LABEL_ALLOW_USER_SCRIPT: "Povolit vlastní uživatelské skripty" + LABEL_USE_SHORT_LOGIN: "Používat krátký login" + LABEL_USE_AUTH: "Používat authentikaci" + LABEL_USE_PHP_MAIL: "Používat php mail() funkci" + BUTTON_TEST: "Test" + BUTTON_WHITE_LIST: "White List" + BUTTON_SIEVE_CONFIGURATION: "SIEVE konfigurace" + BUTTON_BACK_TO_IMAP: "Zpět na IMAP nastavení" + BUTTON_BACK: "Zpět" + BUTTON_CLOSE: "Zavřít" + BUTTON_ADD: "Přidat" + BUTTON_UPDATE: "Aktualizovat" + NEW_DOMAIN_DESC: "Konfigurace této domény umožní používat %NAME% adresy." + WHITE_LIST_ALERT: | + Seznam domén s povoleným uživatelským přístupem + Použijte mezeru pro jejich oddělení. + POPUPS_PLUGIN: + TITLE_PLUGIN: "Plugin" + DESC_NOTHING_TO_CONFIGURE: "Není zde nic ke konfiguraci" + BUTTON_CLOSE: "Zavřít" + BUTTON_SAVE: "Uložit" + TOOLTIP_ABOUT_TITLE: "Info" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "Jste si jistí, že opravdu chcete zavřit toto okno?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Vyberte váš jazyk" + HINTS: + BETA: "beta" + UNSTABLE: "unstable" + WARNING: "Varování!" + NOT_SUPPORTED: "není podporováno" + REQUIRES_PHP_54: "vyžaduje PHP 5.4 nebo vyšší" + ERRORS: + DOMAIN_ALREADY_EXISTS: "Doména již existuje" + UNKNOWN_ERROR: "Neznámá chyba" + NOTIFICATIONS: + INVALID_TOKEN: "Nevalidní token" + AUTH_ERROR: "Chyba authentikace" + ACCESS_ERROR: "Chyba v přístupu" + CONNECTION_ERROR: "Nelze se spojit se serverem" + CAPTCHA_ERROR: "Nesprávná CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Toto ID není přiřazeno k žádnému účtu. Přihlašte se pomocí vaší emailové adresy + a nastavte si tuto možnost. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Toto ID není přiřazeno k žádnému účtu. Přihlašte se pomocí vaší emailové adresy + a nastavte si tuto možnost. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Toto ID není přiřazeno k žádnému účtu. Přihlašte se pomocí vaší emailové adresy + a nastavte si tuto možnost. + DOMAIN_NOT_ALLOWED: "Doména není povolená" + ACCOUNT_NOT_ALLOWED: "Účet není povolený" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Je vyžadováno dvoufázové ověření" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Chyba dvoufázového ověření" + COULD_NOT_SAVE_NEW_PASSWORD: "Nelze uložit nové heslo" + CURRENT_PASSWORD_INCORRECT: "Současné heslo neodpovídá" + NEW_PASSWORD_SHORT: "Heslo je krátké" + NEW_PASSWORD_WEAK: "Heslo je moc jednoduché" + NEW_PASSWORD_FORBIDDENT: "Heslo obsahuje zakázané znaky" + CONTACTS_SYNC_ERROR: "Chyba při synchronizaci kontaktů" + CANT_GET_MESSAGE_LIST: "Nelze načíst seznam zpráv" + CANT_GET_MESSAGE: "Zprávu se nepodařilo načíst" + CANT_DELETE_MESSAGE: "Zprávu se nepodařilo odstranit" + CANT_MOVE_MESSAGE: "Zprávu se nepodařilo přesunout" + CANT_SAVE_MESSAGE: "Zprávu se nepodařilo uložit" + CANT_SEND_MESSAGE: "Zprávu se nepodařilo odeslat" + INVALID_RECIPIENTS: "Neplatní příjemci" + CANT_SAVE_FILTERS: "Nelze uložit filtry" + CANT_GET_FILTERS: "Nelze načíst filtry" + FILTERS_ARE_NOT_CORRECT: "Filtry nejsou validní" + CANT_CREATE_FOLDER: "Složku se nepodařilo vytvořit" + CANT_RENAME_FOLDER: "Složku se nepodařilo přejmenovat" + CANT_DELETE_FOLDER: "Složku se nepodařilo odstranit" + CANT_DELETE_NON_EMPTY_FOLDER: "Nelze odstranit neprázdnou složku" + CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" + CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" + CANT_SAVE_SETTINGS: "Nastavení se nepodařilo uložit" + CANT_SAVE_PLUGIN_SETTINGS: "Nastavení se nepodařilo uložit" + DOMAIN_ALREADY_EXISTS: "Táto doména již existuje" + CANT_INSTALL_PACKAGE: "Instalace balíčku se nezdařila" + CANT_DELETE_PACKAGE: "Odstranění balíčku se nezdařilo" + INVALID_PLUGIN_PACKAGE: "Nevalidní balíček" + UNSUPPORTED_PLUGIN_PACKAGE: "Nepodporovaný balíček rozšíření" + LICENSING_SERVER_IS_UNAVAILABLE: "Licenční server je nedostupný" + LICENSING_DOMAIN_EXPIRED: "Licence pro tuto doménu vypršela." + LICENSING_DOMAIN_BANNED: "Licence pro tuto doménu byla zablokována." + DEMO_SEND_MESSAGE_ERROR: "Z důvodu bezpečnosti tento demo účet není oprávněn posílat zprávy na externí emaily!" + DEMO_ACCOUNT_ERROR: "Z důvodu bezpečnosti tento účet nemá oprávnění toto provést!" + ACCOUNT_ALREADY_EXISTS: "Účet už existuje" + ACCOUNT_DOES_NOT_EXIST: "Účet neexistuje" + MAIL_SERVER_ERROR: "Nastala chyba během přístupu na poštovní server" + INVALID_INPUT_ARGUMENT: "Nevalidní vstupní argument" + UNKNOWN_ERROR: "Neznámá chyba" + STATIC: + BACK_LINK: "Obnovit" + DOMAIN_LIST_DESC: "Seznam domén, ke kterým je možné přistupovat přes webmail." + PHP_EXSTENSIONS_ERROR_DESC: "Potřebné rošíření PHP nejsou dostupné v konfiguraci PHP!" + PHP_VERSION_ERROR_DESC: "Vaše verze PHP (%VERSION%) je nižší než požadovaná 5.3.0!" + NO_SCRIPT_TITLE: "Tato aplikace vyžaduje JavaScript." + NO_SCRIPT_DESC: | + Váš internetový prohlížeč nepodporuje JavaScript. + Prosím povolte podporu JavaScriptu v nastavení vašeho internetového prohlížeče a zkuste to znovu. + NO_COOKIE_TITLE: "Tato aplikace vyžaduje podporu Cookies." + NO_COOKIE_DESC: | + Váš internetový prohlížeč nepodporuje Cookies. + Prosím povolte podporu Cookies v nastavení vašeho internetového prohlížeče a zkuste to znovu. + BAD_BROWSER_TITLE: "Používáte zastaralý internetový prohlížeč." + BAD_BROWSER_DESC: | + Abyste mohli využívat všechny funkcie této aplikace, + použijte některý z následujících internetových prohlížečů: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/da_DK.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/da_DK.yml new file mode 100755 index 00000000..1b9eddba --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/da_DK.yml @@ -0,0 +1,323 @@ +da_DK: + LOGIN: + LABEL_LOGIN: "Log ind" + LABEL_PASSWORD: "Adgangskode" + BUTTON_LOGIN: "Log ind i administrationspanelet" + TOP_PANEL: + LABEL_PREMIUM: "Premium" + LABEL_ADMIN_PANEL: "Admin Panel" + TABS_LABELS: + LABEL_GENERAL_NAME: "Generelt" + LABEL_LOGIN_NAME: "Log ind" + LABEL_BRANDING_NAME: "Branding" + LABEL_CONTACTS_NAME: "Kontakter" + LABEL_DOMAINS_NAME: "Domæner" + LABEL_SECURITY_NAME: "Sikkerhed" + LABEL_INTEGRATION_NAME: "Integrationer" + LABEL_PLUGINS_NAME: "Plugins" + LABEL_PACKAGES_NAME: "Pakker" + LABEL_LICENSING_NAME: "Licensering" + LABEL_ABOUT_NAME: "Om" + TAB_GENERAL: + LEGEND_INTERFACE: "Grænseflade" + LABEL_LANGUAGE: "Sprog" + LABEL_LANGUAGE_ADMIN: "Sprog (admin)" + LABEL_THEME: "Tema" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Tillad sprogvalg i indstillinger" + LABEL_ALLOW_THEMES_ON_SETTINGS: "Tillad temavalg i indstillinger" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Tillad baggrundsvalg i indstillinger" + LABEL_NEW_FOLDER_MOVE: "Ny \"flyt til mappe\" knap" + LABEL_SHOW_THUMBNAILS: "Vis miniaturer (vedhæftede filer)" + LABEL_ALLOW_GRAVATAR: "Tillad Gravatar" + LEGEND_MAIN: "Primære" + LABEL_ATTACHMENT_SIZE_LIMIT: "Vedhæftede filers størrelsesgrænse" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Tillad flere konti" + LABEL_ALLOW_IDENTITIES: "Tillad flere identiteter" + LABEL_ALLOW_TEMPLATES: "Tillad skabeloner" + ALERT_WARNING: "Advarsler!" + HTML_ALERT_WEAK_PASSWORD: | + Du bruger standard admin adgangskoden. +
+ Af sikkerhedsmæssige hensyn bør du venligst + ændre + adgangskoden til noget andet snarest. + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "Log ind skærm" + LABEL_DEFAULT_DOMAIN: "Standard domæne" + LABEL_DETERMINE_USER_DOMAIN: "Forsøg at bestemme brugerens domæne" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Tillad sprogvalg ved log ind" + LABEL_DETERMINE_USER_LANGUAGE: "Forsøg at bestemme brugerens sprog" + TAB_BRANDING: + LEGEND_BRANDING: "Branding" + LABEL_PAGE_TITLE: "Sidetitel" + LABEL_LOADING_DESCRIPTION: "Indlæsningsbeskrivelse" + LABEL_FAVICON_URL: "Favicon" + LEGEND_LOGIN: "Log ind" + LABEL_LOGIN_LOGO: "Logo" + LABEL_LOGIN_DESCRIPTION: "Beskrivelse" + LABEL_LOGIN_BACKGROUND: "Baggrund" + LABEL_LOGIN_CUSTOM_CSS: "Brugerdefinerede CSS" + LABEL_LOGIN_SHOW_POWERED_LINK: "Vis \"Powered by RainLoop\" link" + LEGEND_USER: "Bruger" + LABEL_USER_LOGO: "Logo" + LABEL_USER_LOGO_TITLE: "Logotitel" + LABEL_USER_LOGO_MESSAGE: "Logo (meddelelsesvisning)" + LABEL_USER_CUSTOM_CSS: "Brugerdefinerede CSS" + LEGEND_WELCOME_PAGE: "Velkomstside" + LABEL_WELCOME_PAGE_TITLE: "Titel" + LABEL_WELCOME_PAGE_URL: "URL" + LABEL_WELCOME_PAGE_DISPLAY: "Visning" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "Ingen" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "én enkelt gang" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Altid" + HTML_ALERT_PREMIUM: "Denne funktionalitet er tilgængelig for Premium abonnenter." + TAB_CONTACTS: + LEGEND_CONTACTS: "Kontakter" + LEGEND_STORAGE: "Lagring (PDO)" + LABEL_ENABLE_CONTACTS: "Aktivér kontakter" + LABEL_ALLOW_SYNC: "Tillad kontaktsynkronisering (med ektern CardDAV server)" + LABEL_STORAGE_TYPE: "Type" + LABEL_STORAGE_DSN: "Dsn" + LABEL_STORAGE_USER: "Bruger" + LABEL_STORAGE_PASSWORD: "Adgangskode" + BUTTON_TEST: "Test" + ALERT_NOTICE: "Underretning!" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Brug ikke denne database type med større antal af aktive brugere." + HTML_ALERT_DOES_NOT_SUPPORTED: | + Dit system ser ikke ud til at understøtte kontakter. +
+ Du skal installere og aktivere PDO (SQLite / MySQL / PostgreSQL) udvidelsen på din server. + TAB_DOMAINS: + LEGEND_DOMAINS: "Domæner" + BUTTON_ADD_DOMAIN: "Tilføj domæne" + BUTTON_ADD_ALIAS: "Tilføj alias" + DELETE_ARE_YOU_SURE: "Er du sikker?" + HTML_DOMAINS_HELPER: | + Liste over domæner webmail er tilladt adgang til. +
+ Klik på navnet for at konfigurere domænet. + TAB_SECURITY: + LEGEND_SECURITY: "Sikkerhed" + LABEL_ALLOW_TWO_STEP: "Tillad 2-trins verifikation" + LABEL_FORCE_TWO_STEP: "Gennemtving 2-trins verifikation" + LABEL_USE_IMAGE_PROXY: "Brug lokal proxy til eksterne billeder" + LABEL_ALLOW_OPEN_PGP: "Tillad OpenPGP" + LABEL_SHOW_PHP_INFO: "Vis PHP informationer" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Admin Panel Adgangsoplysninger" + LABEL_CURRENT_PASSWORD: "Nuværende adgangskode" + LABEL_NEW_LOGIN: "Nyt log ind" + LABEL_NEW_PASSWORD: "Ny adgangskode" + LABEL_REPEAT_PASSWORD: "Gentag" + BUTTON_UPDATE_PASSWORD: "Opdater adgangskode" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "Kræv verifikation af brugt SSL certifikat (IMAP/SMTP)" + LABEL_ALLOW_SELF_SIGNED: "Tillad selvsignerede certifikater" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "Aktiver Google integration" + LABEL_GOOGLE_AUTH: "Autorisation" + LABEL_GOOGLE_DRIVE: "Google Drive integration (Komponerede visning)" + LABEL_GOOGLE_PREVIEW: "Google Viewer integration (Visning af Microsoft Word, Excel og PowerPoint filer)" + LABEL_GOOGLE_CLIENT_ID: "Klient ID" + LABEL_GOOGLE_CLIENT_SECRET: "Klient hemmelighed" + LABEL_GOOGLE_API_KEY: "API nøgle" + HINT_GOOGLE_API_KEY: "Krævet af Google Drive File Picker" + LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "Aktiver Facebook integration (Autorisation)" + LABEL_FACEBOOK_APP_ID: "App ID" + LABEL_FACEBOOK_APP_SECRET: "App hemmelighed" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "Aktiver Twitter integrering (Godkendelse)" + LABEL_TWITTER_CONSUMER_KEY: "Bruger nøgle" + LABEL_TWITTER_CONSUMER_SECRET: "Bruger hemmelighed" + LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "Aktiver Dropbox integrering" + LABEL_DROPBOX_API_KEY: "API nøgle" + TOP_ALERT: "Mere information omkring integrring med sociale netværk kan finder på" + TAB_PLUGINS: + LEGEND_PLUGINS: "Plugins" + LABEL_ENABLE_PLUGINS: "Aktiver plugins" + ALERT_NO_PLUGINS: "Ingen tilføjelser er installeret endnu." + LINK_INSTALL_NEW: "Tryk her for at installere nyt!" + HINT_CLICK_NAME: "Tryk på navnet for at konfigurere tilføjelse." + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "Opdatering tilgængelig" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Installation tilgængelig" + LEGEND_INSTALLED_PACKAGES: "Installerede pakker" + ALERT_CANNOT_ACCESS_REPOSITORY: "Kan ikke tilgå depotet lige nu." + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "Dit domæne" + LABEL_VERSION: "Version" + LABEL_CHECKING: "Tjekker" + TYPE_BASIC_HINT: "Dette domæne er ikke licenseret til kommercielt brug (med ekstra funktioner)." + TYPE_BASIC_HINT_2: "Dette domæne kan ikke licenseret." + HTML_ALERT_TOP_1: "RainLoop Webmail er licenseret under" + HTML_ALERT_TOP_2: "Du er velkommen til at bruge det til personlige projekter." + HTML_ALERT_TOP_3: | + Kommercielt brug (med ekstra funktioner) af RainLoop Webmail kræver et + abonnement. + TYPE_PREMIUM_LIFETIME: "Livstid" + LABEL_SUB_EXPIRES: "Abonnement udløber" + BUTTON_ACTIVATE: "Aktiver abonnements kode for dette domæne" + BUTTON_PURCHASE: "Køb" + BUTTON_TRIAL: "Prøv" + TAB_ABOUT: + LEGEND_ABOUT: "Om" + LABEL_TAG_HINT: "Simpel, moderne & hurtig web-baseret e-mail klient" + LABEL_ALL_RIGHTS_RESERVED: "alle rettigheder forbeholdes." + HINT_READ_CHANGE_LOG: "Læs ændrings listen før der opdateres." + HINT_IS_UP_TO_DATE: "RainLoop is up to date." + HTML_NEW_VERSION: "Ny %VERSION% version tilgængelig" + LABEL_UPDATING: "Opdatere" + LABEL_CHECKING: "Tjekker for opdateringer" + BUTTON_UPDATE: "Opdater" + BUTTON_DOWNLOAD: "Download" + BUTTON_CHANGELOG: "Ændrings liste" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "Aktiver abonnements kode?" + TITLE_ACTIVATION: "Aktivering..." + LABEL_DOMAIN: "Domæne" + LABEL_SUB_KEY: "Abonnements kode" + BUTTON_ACTIVATE: "Aktiver" + LABEL_ACTIVATED: "Aktiveret" + ERROR_INVALID_SUBS_KEY: "Ugyldig abonnements kode" + SUBS_KEY_ACTIVATED: "Abonnements kode aktivering var succesfuld" + HTML_DESC: | + Efter aktiveren, vil abonnementet for %DOMAIN% blive forlænget. +
+ Bemærk at en abonnements kode kun kan blive aktiveret for et enkelt domæne. +

+ Når aktiverings processen er startet kan den ikke afbrydes eller annulleres. + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "Tilføj alias" + LABEL_ALIAS: "Alias" + LABEL_DOMAIN: "Domæne" + BUTTON_CLOSE: "Luk" + BUTTON_ADD: "Tilføj" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "Tilføj domæne" + TITLE_ADD_DOMAIN_WITH_NAME: "Tilføj domæne \"%NAME%\"" + TITLE_EDIT_DOMAIN: "Rediger domæne \"%NAME%\"" + LABEL_NAME: "Navn" + NAME_HELPER: "specieltegn understøttet" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "Server" + LABEL_PORT: "Port" + LABEL_SECURE: "Sikker" + LABEL_WHITE_LIST: "Whitelist" + SECURE_OPTION_NONE: "Ingen" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "Tillad sieve skripts" + LABEL_ALLOW_USER_SCRIPT: "Tillad brugerdefinerede skripts" + LABEL_USE_SHORT_LOGIN: "Brug kort log ind" + LABEL_USE_AUTH: "Brug godkendelse" + LABEL_USE_PHP_MAIL: "Brug php mail()" + BUTTON_TEST: "Test" + BUTTON_WHITE_LIST: "Whitelist" + BUTTON_SIEVE_CONFIGURATION: "Sieve opsætning" + BUTTON_BACK_TO_IMAP: "Tilbage til IMAP indstillinger" + BUTTON_BACK: "Tilbage" + BUTTON_CLOSE: "Luk" + BUTTON_ADD: "Tilføj" + BUTTON_UPDATE: "Opdater" + NEW_DOMAIN_DESC: "Denne domæne konfiguration tillader %NAME% e-mail adresser." + WHITE_LIST_ALERT: | + Liste med godkendte domæne for webmail opsætning. + Brug mellemrum til at separere domæner. + POPUPS_PLUGIN: + TITLE_PLUGIN: "Tilføjelse" + DESC_NOTHING_TO_CONFIGURE: "Intet at opsætte" + BUTTON_CLOSE: "Luk" + BUTTON_SAVE: "Gem" + TOOLTIP_ABOUT_TITLE: "Om" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "Vil du lukke vinduet?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Vælg sprog" + HINTS: + BETA: "beta" + UNSTABLE: "ustabil" + WARNING: "Advarsel!" + NOT_SUPPORTED: "ikke understøttet" + REQUIRES_PHP_54: "PHP 5.4 eller højere er et krav" + ERRORS: + DOMAIN_ALREADY_EXISTS: "Domæne eksisterer allerede" + UNKNOWN_ERROR: "Ukendt fejl" + NOTIFICATIONS: + INVALID_TOKEN: "Ugyldigt tegn" + AUTH_ERROR: "Godkendelse fejlede" + ACCESS_ERROR: "Adgangsfejl" + CONNECTION_ERROR: "Kan ikke kontakte server" + CAPTCHA_ERROR: "Forkert CAPTCHA" + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Dette sociale ID er ikke knyttet til en e-mail konto endnu. Log ind ved brug + af e-mail og tilføj ID'et under konto indstillinger. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Dette sociale ID er ikke knyttet til en e-mail konto endnu. Log ind ved brug + af e-mail og tilføj ID'et under konto indstillinger. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Dette sociale ID er ikke knyttet til en e-mail konto endnu. Log ind ved brug + af e-mail og tilføj ID'et under konto indstillinger. + DOMAIN_NOT_ALLOWED: "Domæne ikke tilladt" + ACCOUNT_NOT_ALLOWED: "Konto ikke tilladt" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2-faktor verifikation påbudt." + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2-faktor verifikationsfejl" + COULD_NOT_SAVE_NEW_PASSWORD: "Kunne ikke gemme ny adgangskode" + CURRENT_PASSWORD_INCORRECT: "Nuværende adgangskode forkert" + NEW_PASSWORD_SHORT: "Adgangskoden for kort" + NEW_PASSWORD_WEAK: "Adgangskoden for simpel" + NEW_PASSWORD_FORBIDDENT: "Adgangskode indeholder forbudte tegn" + CONTACTS_SYNC_ERROR: "Fejl ved synkronisering af kontakter" + CANT_GET_MESSAGE_LIST: "Kan ikke indlæse meddelelsesoversigt " + CANT_GET_MESSAGE: "Kan ikke indlæse meddelelse" + CANT_DELETE_MESSAGE: "Kan ikke slette meddelelse" + CANT_MOVE_MESSAGE: "Kan ikke flytte meddelelse" + CANT_SAVE_MESSAGE: "Kan ikke gemme meddelelse" + CANT_SEND_MESSAGE: "Kan ikke sende meddelelse" + INVALID_RECIPIENTS: "Ugyldige modtagere" + CANT_SAVE_FILTERS: "Kan ikke gemme filtre" + CANT_GET_FILTERS: "Kan ikke indlæse filtre" + FILTERS_ARE_NOT_CORRECT: "Fejl i filtre" + CANT_CREATE_FOLDER: "Kan ikke oprette mappe" + CANT_RENAME_FOLDER: "Kan ikke omdøbe mappe" + CANT_DELETE_FOLDER: "Kan ikke slette mappe" + CANT_DELETE_NON_EMPTY_FOLDER: "Kan ikke slette mappe som ikke er tom" + CANT_SUBSCRIBE_FOLDER: "Kan ikke abonnere på mappe" + CANT_UNSUBSCRIBE_FOLDER: "Kan ikke afmelde mappe" + CANT_SAVE_SETTINGS: "Kan ikke gemme instillinger" + CANT_SAVE_PLUGIN_SETTINGS: "Kan ikke gemme instillinger" + DOMAIN_ALREADY_EXISTS: "Domæne eksisterer allerede" + CANT_INSTALL_PACKAGE: "Installation af pakke mislykkedes" + CANT_DELETE_PACKAGE: "Fjernelse af pakke mislykkedes" + INVALID_PLUGIN_PACKAGE: "Ugyldig tilføjelsespakke" + UNSUPPORTED_PLUGIN_PACKAGE: "Tilføjelsespakke ikke understøttet" + LICENSING_SERVER_IS_UNAVAILABLE: "Abonnementsserver ikke tilgængelig" + LICENSING_DOMAIN_EXPIRED: "Abonnement på domæne udløbet." + LICENSING_DOMAIN_BANNED: "Abonnement på domæne forbudt." + DEMO_SEND_MESSAGE_ERROR: "Denne konto kan af sikkerheds hensyn ikke sende e-mails til eksterne adresser!" + DEMO_ACCOUNT_ERROR: "Denne konto kan af sikkerheds hensyn ikke udføre denne handling!" + ACCOUNT_ALREADY_EXISTS: "Kontoen eksisterer allerede" + ACCOUNT_DOES_NOT_EXIST: "Kontoen eksisterer ikke" + MAIL_SERVER_ERROR: "Der skete en fejl under adgang til e-mail serveren" + INVALID_INPUT_ARGUMENT: "Ugyldigt argument" + UNKNOWN_ERROR: "Ukendt fejl" + STATIC: + BACK_LINK: "Genindlæs" + DOMAIN_LIST_DESC: "Liste over domæner webmail er tilladt adgang til." + PHP_EXSTENSIONS_ERROR_DESC: "Nødvendige PHP udvidelser er ikke tilgængelige!" + PHP_VERSION_ERROR_DESC: "PHP versionen (%VERSION%) er for gammel. Minimum 5.3.0 er nødvendig!" + NO_SCRIPT_TITLE: "JavaScript er nødvendig for dette program." + NO_SCRIPT_DESC: | + JavaScript er slået fra i din browser. + Slå JavaScript til og prøv igen. + NO_COOKIE_TITLE: "Cookies er nødvendige for dette program." + NO_COOKIE_DESC: | + Cookies er slået fra i din browser. + Slå Cookies til og prøv igen. + BAD_BROWSER_TITLE: "Din browser er forældet." + BAD_BROWSER_DESC: | + Enkle funktioner fungere ikke med denne browser. + For at bruge alle funktioner, hent en af følgende: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/de_DE.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/de_DE.yml new file mode 100755 index 00000000..f1660dae --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/de_DE.yml @@ -0,0 +1,325 @@ +de_DE: + LOGIN: + LABEL_LOGIN: "Benutzer" + LABEL_PASSWORD: "Passwort" + BUTTON_LOGIN: "Im Adminpanel anmelden" + TOP_PANEL: + LABEL_PREMIUM: "Premium" + LABEL_ADMIN_PANEL: "Adminpanel" + TABS_LABELS: + LABEL_GENERAL_NAME: "Allgemein" + LABEL_LOGIN_NAME: "Anmeldung" + LABEL_BRANDING_NAME: "Branding" + LABEL_CONTACTS_NAME: "Kontakte" + LABEL_DOMAINS_NAME: "Domains" + LABEL_SECURITY_NAME: "Sicherheit" + LABEL_INTEGRATION_NAME: "Integration" + LABEL_PLUGINS_NAME: "Plugins" + LABEL_PACKAGES_NAME: "Pakete" + LABEL_LICENSING_NAME: "Lizenzierung" + LABEL_ABOUT_NAME: "Über" + TAB_GENERAL: + LEGEND_INTERFACE: "Oberfläche" + LABEL_LANGUAGE: "Sprache" + LABEL_LANGUAGE_ADMIN: "Sprache (Admin)" + LABEL_THEME: "Thema" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Sprachauswahl in den Einstellungen zulassen" + LABEL_ALLOW_THEMES_ON_SETTINGS: "Themaauswahl in den Einstellungen zulassen" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Hintergrundauswahl in den Einstellungen zulassen" + LABEL_NEW_FOLDER_MOVE: "Neue \"Verschieben nach\"-Schaltfläche" + LABEL_SHOW_THUMBNAILS: "Vorschaubilder anzeigen (Anhänge)" + LABEL_ALLOW_GRAVATAR: "Gravatar erlauben" + LEGEND_MAIN: "Allgemein" + LABEL_ATTACHMENT_SIZE_LIMIT: "Größenlimit für Anhänge" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Zusätzliche Konten erlauben" + LABEL_ALLOW_IDENTITIES: "Mehrere Identitäten erlauben" + LABEL_ALLOW_TEMPLATES: "Vorlagen erlauben" + ALERT_WARNING: "Warnung!" + HTML_ALERT_WEAK_PASSWORD: | + Sie verwenden das Standard-Admin-Passwort. +
+ Bitte ändern Sie + aus Sicherheitsgründen das Passwort jetzt. + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "Anmeldebildschirm" + LABEL_DEFAULT_DOMAIN: "Standarddomain" + LABEL_DETERMINE_USER_DOMAIN: "Versuche Domain des Benutzers zu ermitteln" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Sprachauswahl bei der Anmeldung zulassen" + LABEL_DETERMINE_USER_LANGUAGE: "Versuche Sprache des Benutzers zu ermitteln" + TAB_BRANDING: + LEGEND_BRANDING: "Branding" + LABEL_PAGE_TITLE: "Seitentitel" + LABEL_LOADING_DESCRIPTION: "Ladevorgang-Beschreibung" + LABEL_FAVICON_URL: "Favicon" + LEGEND_LOGIN: "Anmeldung" + LABEL_LOGIN_LOGO: "Logo" + LABEL_LOGIN_DESCRIPTION: "Beschreibung" + LABEL_LOGIN_BACKGROUND: "Hintergrund" + LABEL_LOGIN_CUSTOM_CSS: "Benutzerdefiniertes CSS" + LABEL_LOGIN_SHOW_POWERED_LINK: "\"Powered by RainLoop\"-Link anzeigen" + LEGEND_USER: "Benutzer" + LABEL_USER_LOGO: "Logo" + LABEL_USER_LOGO_TITLE: "Logo Titel" + LABEL_USER_LOGO_MESSAGE: "Logo (Nachrichten-Ansicht)" + LABEL_USER_CUSTOM_CSS: "Benutzerdefiniertes CSS" + LEGEND_WELCOME_PAGE: "Willkommensseite" + LABEL_WELCOME_PAGE_TITLE: "Titel" + LABEL_WELCOME_PAGE_URL: "URL" + LABEL_WELCOME_PAGE_DISPLAY: "Anzeigen" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "Nie" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Einmal" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Immer" + HTML_ALERT_PREMIUM: "Diese Funktionalität ist für Premium-Abonnenten verfügbar." + TAB_CONTACTS: + LEGEND_CONTACTS: "Kontakte" + LEGEND_STORAGE: "Speicher (PDO)" + LABEL_ENABLE_CONTACTS: "Kontakte akivieren" + LABEL_ALLOW_SYNC: "Kontakte-Synchronisierung erlauben (mit externem CardDAV-Server)" + LABEL_STORAGE_TYPE: "Typ" + LABEL_STORAGE_DSN: "DSN" + LABEL_STORAGE_USER: "Benutzer" + LABEL_STORAGE_PASSWORD: "Passwort" + BUTTON_TEST: "Testen" + ALERT_NOTICE: "Hinweis!" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Verwenden Sie diesen Datenbanktyp nicht bei einer hohen Anzahl aktiver Benutzer." + HTML_ALERT_DOES_NOT_SUPPORTED: | + Ihr System unterstützt keine Kontakte. +
+ Sie müssen die PDO-Erweiterung (SQLite / MySQL / PostgreSQL) auf Ihrem Server installieren oder aktivieren. + TAB_DOMAINS: + LEGEND_DOMAINS: "Domains" + BUTTON_ADD_DOMAIN: "Domain hinzufügen" + BUTTON_ADD_ALIAS: "Alias hinzufügen" + DELETE_ARE_YOU_SURE: "Sind Sie sicher?" + HTML_DOMAINS_HELPER: | + Liste der Domains, die Webmail abrufen darf. +
+ Klicken Sie auf den Namen, um die Domain zu konfigurieren. + TAB_SECURITY: + LEGEND_SECURITY: "Sicherheit" + LABEL_ALLOW_TWO_STEP: "Zwei-Faktor-Authentifizierung erlauben" + LABEL_FORCE_TWO_STEP: "Zwei-Faktor-Authentifizierung erzwingen" + LABEL_USE_IMAGE_PROXY: "Lokalen Proxy für externe Bilder verwenden" + LABEL_ALLOW_OPEN_PGP: "OpenPGP erlauben" + LABEL_SHOW_PHP_INFO: "PHP-Informationen anzeigen" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Adminpanel-Zugangsdaten" + LABEL_CURRENT_PASSWORD: "Aktuelles Passwort" + LABEL_NEW_LOGIN: "Neuer Benutzer" + LABEL_NEW_PASSWORD: "Neues Passwort" + LABEL_REPEAT_PASSWORD: "Wiederholen" + BUTTON_UPDATE_PASSWORD: "Passwort aktualisieren" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "Verlangen, dass das verwendete SSL-Zertifikat beglaubigt ist (IMAP/SMTP)" + LABEL_ALLOW_SELF_SIGNED: "Selbst-signierte Zertifikate erlauben" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "Google-Integration aktivieren" + LABEL_GOOGLE_AUTH: "Autorisierung" + LABEL_GOOGLE_DRIVE: "Google-Drive-Integration (Erstellen-Ansicht)" + LABEL_GOOGLE_PREVIEW: "Google-Viewer-Integration (Vorschau für Microsoft Word-, Excel- und PowerPoint-Dateien)" + LABEL_GOOGLE_CLIENT_ID: "Client-ID" + LABEL_GOOGLE_CLIENT_SECRET: "Client-Geheimnis" + LABEL_GOOGLE_API_KEY: "API-Schlüssel" + HINT_GOOGLE_API_KEY: "Wird für Google-Drive-Dateiauswahl benötigt" + LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "Facebook-Integration aktivieren (Autorisierung)" + LABEL_FACEBOOK_APP_ID: "App-ID" + LABEL_FACEBOOK_APP_SECRET: "App-Geheimnis" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "Twitter-Integration aktivieren (Autorisierung)" + LABEL_TWITTER_CONSUMER_KEY: "Consumer-Schlüssel" + LABEL_TWITTER_CONSUMER_SECRET: "Consumer-Geheimnis" + LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "Dropbox-Integration aktivieren" + LABEL_DROPBOX_API_KEY: "API-Schlüssel" + TOP_ALERT: "Detaillierte Informationen zur Integration von Social-Diensten finden Sie unter" + TAB_PLUGINS: + LEGEND_PLUGINS: "Plugins" + LABEL_ENABLE_PLUGINS: "Plugins aktivieren" + ALERT_NO_PLUGINS: "Es wurden noch keine Plugins installiert." + LINK_INSTALL_NEW: "Hier klicken, um Plugins zu installieren!" + HINT_CLICK_NAME: "Klicken Sie auf den Namen, um das Plugin zu konfigurieren." + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "Zur Aktualisierung verfügbar" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Zur Installation verfügbar" + LEGEND_INSTALLED_PACKAGES: "Installierte Pakete" + ALERT_CANNOT_ACCESS_REPOSITORY: "Auf das Plugin-Repository kann derzeit nicht zugegriffen werden." + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "Ihre Domain" + LABEL_VERSION: "Version" + LABEL_CHECKING: "Überprüfe" + TYPE_BASIC_HINT: "Diese Domain ist nicht für die kommerzielle Nutzung (mit zusätzlichen Funktionen) lizenziert." + TYPE_BASIC_HINT_2: "Diese Domain kann nicht lizenziert werden." + HTML_ALERT_TOP_1: "RainLoop Webmail steht unter folgender Lizenz:" + HTML_ALERT_TOP_2: "Sie dürfen es für persönliche Projekte nutzen." + HTML_ALERT_TOP_3: | + Kommerzielle Nutzung (mit zusätzlichen Funktionen) von RainLoop Webmail erfordert eine + Subscription. + TYPE_PREMIUM_LIFETIME: "Lebenszeit" + LABEL_SUB_EXPIRES: "Ablauf der Subscription" + BUTTON_ACTIVATE: "Subscription-Schlüssel für diese Domain aktivieren" + BUTTON_PURCHASE: "Erwerben" + BUTTON_TRIAL: "Testversion" + TAB_ABOUT: + LEGEND_ABOUT: "Über" + LABEL_TAG_HINT: "Einfacher, moderner und schneller webbasierter E-Mail-Client" + LABEL_ALL_RIGHTS_RESERVED: "Alle Rechte vorbehalten." + HINT_READ_CHANGE_LOG: "Bitte Lesen Sie das Änderungsprotokoll vor dem Update." + HINT_IS_UP_TO_DATE: "RainLoop ist auf dem neusten Stand." + HTML_NEW_VERSION: "Neue Version %VERSION% verfügbar." + LABEL_UPDATING: "Aktualisiere" + LABEL_CHECKING: "Prüfe auf Aktualisierungen" + BUTTON_UPDATE: "Aktualisieren" + BUTTON_DOWNLOAD: "Herunterladen" + BUTTON_CHANGELOG: "Änderungsprotokoll" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "Subscription-Schlüssel aktivieren?" + TITLE_ACTIVATION: "Aktiviere..." + LABEL_DOMAIN: "Domain" + LABEL_SUB_KEY: "Subscription-Schlüssel" + BUTTON_ACTIVATE: "Aktivieren" + LABEL_ACTIVATED: "Aktiviert" + ERROR_INVALID_SUBS_KEY: "Ungültiger Subscription-Schlüssel" + SUBS_KEY_ACTIVATED: "Subscription-Schlüssel erfolgreich aktiviert" + HTML_DESC: | + Nach der Aktivierung wird %DOMAIN% um die Premium-Subscription erweitert. +
+ Beachten Sie, dass ein Subscription-Schlüssel nur für eine einzelne Domain aktiviert werden kann. +

+ Nach dem Start kann der Aktivierungsprozess nicht unterbrochen oder abgebrochen werden. + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "Alias hinzufügen" + LABEL_ALIAS: "Alias" + LABEL_DOMAIN: "Domain" + BUTTON_CLOSE: "Schließen" + BUTTON_ADD: "Hinzufügen" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "Domain hinzufügen" + TITLE_ADD_DOMAIN_WITH_NAME: "Domain \"%NAME%\" hinzufügen" + TITLE_EDIT_DOMAIN: "Domain \"%NAME%\" bearbeiten" + LABEL_NAME: "Name" + NAME_HELPER: "Platzhalter unterstützt" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "Server" + LABEL_PORT: "Port" + LABEL_SECURE: "Sicherheit" + LABEL_WHITE_LIST: "Whitelist" + SECURE_OPTION_NONE: "Ohne" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "Sieve-Skripte erlauben" + LABEL_ALLOW_USER_SCRIPT: "Benutzerdefiniertes Skript erlauben" + LABEL_USE_SHORT_LOGIN: "Kurze Benutzernamen verwenden" + LABEL_USE_AUTH: "Authentifizierung verwenden" + LABEL_USE_PHP_MAIL: "PHPs mail()-Funktion verwenden" + BUTTON_TEST: "Testen" + BUTTON_WHITE_LIST: "Whitelist" + BUTTON_SIEVE_CONFIGURATION: "Sieve-Konfiguration" + BUTTON_BACK_TO_IMAP: "Zurück zu IMAP-Einstellungen" + BUTTON_BACK: "Zurück" + BUTTON_CLOSE: "Schließen" + BUTTON_ADD: "Hinzufügen" + BUTTON_UPDATE: "Aktualisieren" + NEW_DOMAIN_DESC: "Diese Domain Konfiguration wird es dir möglich machen
mit %NAME% Mailadressen zu arbeiten." + WHITE_LIST_ALERT: | + Liste der User, die Webmail abrufen darf. + Verwenden Sie Leerzeichen als Trenner. + POPUPS_PLUGIN: + TITLE_PLUGIN: "Plugin" + DESC_NOTHING_TO_CONFIGURE: "Nichts zu konfigurieren" + BUTTON_CLOSE: "Schließen" + BUTTON_SAVE: "Speichern" + TOOLTIP_ABOUT_TITLE: "Über" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "Sind Sie sicher, dass Sie dieses Fenster schließen möchten?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Wählen Sie Ihre Sprache" + HINTS: + BETA: "Beta" + UNSTABLE: "Nicht stabil" + WARNING: "Warnung!" + NOT_SUPPORTED: "Nicht unterstützt" + REQUIRES_PHP_54: "PHP 5.4 oder höher ist erforderlich" + ERRORS: + DOMAIN_ALREADY_EXISTS: "Domain existiert bereits" + UNKNOWN_ERROR: "Unbekannter Fehler" + NOTIFICATIONS: + INVALID_TOKEN: "Ungültiger Token" + AUTH_ERROR: "Authentifizierung fehlgeschlagen" + ACCESS_ERROR: "Zugriffsfehler" + CONNECTION_ERROR: "Serververbindung kann nicht hergestellt werden" + CAPTCHA_ERROR: "Falsche CAPTCHA-Eingabe." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- + Diese Social-ID ist bisher mit keinem E-Mail-Konto verbunden. Melden Sie sich + mit Ihren E-Mail-Anmeldedaten an und aktivieren Sie diese Funktion in Ihren + Konteneinstellungen. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- + Diese Social-ID ist bisher mit keinem E-Mail-Konto verbunden. Melden Sie sich + mit Ihren E-Mail-Anmeldedaten an und aktivieren Sie diese Funktion in Ihren + Konteneinstellungen. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- + Diese Social-ID ist bisher mit keinem E-Mail-Konto verbunden. Melden Sie sich + mit Ihren E-Mail-Anmeldedaten an und aktivieren Sie diese Funktion in Ihren + Konteneinstellungen. + DOMAIN_NOT_ALLOWED: "Diese Domain ist nicht zugelassen." + ACCOUNT_NOT_ALLOWED: "Konto ist nicht zugelassen." + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Zwei-Faktor-Authentifizierung erforderlich" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Fehler bei Zwei-Faktor-Authentifizierung" + COULD_NOT_SAVE_NEW_PASSWORD: "Neues Passwort konnte nicht gespeichert werden" + CURRENT_PASSWORD_INCORRECT: "Aktuelles Passwort falsch" + NEW_PASSWORD_SHORT: "Passwort ist zu kurz" + NEW_PASSWORD_WEAK: "Passwort ist zu einfach" + NEW_PASSWORD_FORBIDDENT: "Passwort enthält unzulässige Zeichen" + CONTACTS_SYNC_ERROR: "Fehler bei Kontakte-Synchronisierung" + CANT_GET_MESSAGE_LIST: "Die Nachrichtenliste ist nicht verfügbar" + CANT_GET_MESSAGE: "Diese Nachricht ist nicht verfügbar" + CANT_DELETE_MESSAGE: "Diese Nachricht kann nicht gelöscht werden" + CANT_MOVE_MESSAGE: "Diese Nachricht kann nicht verschoben werden" + CANT_SAVE_MESSAGE: "Diese Nachricht kann nicht gespeichert werden" + CANT_SEND_MESSAGE: "Diese Nachricht kann nicht gesendet werden" + INVALID_RECIPIENTS: "Ungültige Empfängeradressen" + CANT_SAVE_FILTERS: "Die Filter können nicht gespeichert werden" + CANT_GET_FILTERS: "Die Filter sind nicht verfügbar" + FILTERS_ARE_NOT_CORRECT: "Die Filter sind fehlerhaft" + CANT_CREATE_FOLDER: "Dieser Ordner kann nicht angelegt werden" + CANT_RENAME_FOLDER: "Dieser Ordner kann nicht umbenannt werden" + CANT_DELETE_FOLDER: "Dieser Ordner kann nicht gelöscht werden" + CANT_DELETE_NON_EMPTY_FOLDER: "Der Ordner kann nicht gelöscht werden; er ist nicht leer" + CANT_SUBSCRIBE_FOLDER: "Dieser Ordner kann nicht abonniert werden" + CANT_UNSUBSCRIBE_FOLDER: "Das Abonnement dieses Ordners kann nicht gelöscht werden" + CANT_SAVE_SETTINGS: "Einstellungen können nicht gespeichert werden" + CANT_SAVE_PLUGIN_SETTINGS: "Einstellungen können nicht gespeichert werden" + DOMAIN_ALREADY_EXISTS: "Diese Domain existiert bereits" + CANT_INSTALL_PACKAGE: "Paket konnte nicht installiert werden" + CANT_DELETE_PACKAGE: "Paket konnte nicht entfernt werden" + INVALID_PLUGIN_PACKAGE: "Plugin-Paket ist ungültig" + UNSUPPORTED_PLUGIN_PACKAGE: "Plugin-Paket wird nicht unterstützt" + LICENSING_SERVER_IS_UNAVAILABLE: "Der Subscription-Server kann nicht erreicht werden" + LICENSING_DOMAIN_EXPIRED: "Die Subscription dieser Domain ist abgelaufen." + LICENSING_DOMAIN_BANNED: "Die Subscription dieser Domain ist gesperrt." + DEMO_SEND_MESSAGE_ERROR: "Dieses Demokonto darf aus Sicherheitsgründen keine Nachrichten an externe E-Mail-Adressen versenden!" + DEMO_ACCOUNT_ERROR: "Aus Sicherheitsgründen ist dieses Konto nicht zu dieser Aktion berechtigt!" + ACCOUNT_ALREADY_EXISTS: "Dieses Konto existiert bereits" + ACCOUNT_DOES_NOT_EXIST: "Dieser Account existiert nicht." + MAIL_SERVER_ERROR: "Beim Zugriff auf den E-Mail-Server trat ein Fehler auf." + INVALID_INPUT_ARGUMENT: "Ungültige Eingabe" + UNKNOWN_ERROR: "Unbekannter Fehler" + STATIC: + BACK_LINK: "Aktualisieren" + DOMAIN_LIST_DESC: "Liste der Domains, auf die zugegriffen werden darf" + PHP_EXSTENSIONS_ERROR_DESC: "Notwendige PHP-Erweiterungen sind in Ihrer PHP-Konfiguration nicht vorhanden!" + PHP_VERSION_ERROR_DESC: "Ihre PHP Version (%VERSION%) ist älter als die notwendige Version: 5.3.0!" + NO_SCRIPT_TITLE: "Diese Anwendung benötigt JavaScript." + NO_SCRIPT_DESC: | + Ihr Browser unterstützt JavaScript nicht. + Aktivieren Sie bitte die JavaScript-Unterstützung in Ihrem Browser und versuchen Sie es erneut. + NO_COOKIE_TITLE: "Diese Anwendung benötigt Cookies." + NO_COOKIE_DESC: | + Ihr Browser unterstützt Cookies nicht. + Aktivieren Sie bitte die Cookie-Unterstützung in Ihrem Browser und versuchen Sie es erneut. + BAD_BROWSER_TITLE: "Ihr Browser ist veraltet." + BAD_BROWSER_DESC: | + Um alle Funktionen dieser Anwendung nutzen zu können, + sollten Sie einen der folgenden Browser herunterladen und installieren diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/en_US.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/en_US.yml new file mode 100755 index 00000000..0b5bb0de --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/en_US.yml @@ -0,0 +1,322 @@ +en_US: + LOGIN: + LABEL_LOGIN: "Login" + LABEL_PASSWORD: "Password" + BUTTON_LOGIN: "Log into the admin panel" + TOP_PANEL: + LABEL_PREMIUM: "Premium" + LABEL_ADMIN_PANEL: "Admin Panel" + TABS_LABELS: + LABEL_GENERAL_NAME: "General" + LABEL_LOGIN_NAME: "Login" + LABEL_BRANDING_NAME: "Branding" + LABEL_CONTACTS_NAME: "Contacts" + LABEL_DOMAINS_NAME: "Domains" + LABEL_SECURITY_NAME: "Security" + LABEL_INTEGRATION_NAME: "Integrations" + LABEL_PLUGINS_NAME: "Plugins" + LABEL_PACKAGES_NAME: "Packages" + LABEL_LICENSING_NAME: "Licensing" + LABEL_ABOUT_NAME: "About" + TAB_GENERAL: + LEGEND_INTERFACE: "Interface" + LABEL_LANGUAGE: "Language" + LABEL_LANGUAGE_ADMIN: "Language (admin)" + LABEL_THEME: "Theme" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Allow language selection on settings screen" + LABEL_ALLOW_THEMES_ON_SETTINGS: "Allow theme selection on settings screen" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Allow background selection on settings screen" + LABEL_SHOW_THUMBNAILS: "Show thumbnails (attachments)" + LABEL_ALLOW_GRAVATAR: "Allow Gravatar" + LEGEND_MAIN: "Main" + LABEL_ATTACHMENT_SIZE_LIMIT: "Attachment size limit" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Allow additional accounts" + LABEL_ALLOW_IDENTITIES: "Allow multiple identities" + LABEL_ALLOW_TEMPLATES: "Allow templates" + ALERT_WARNING: "Warning!" + HTML_ALERT_WEAK_PASSWORD: | + You are using the default admin password. +
+ For security reasons please + change + password to something else now. + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "Login Screen" + LABEL_DEFAULT_DOMAIN: "Default Domain" + LABEL_DETERMINE_USER_DOMAIN: "Try to determine user domain" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Allow language selection on login screen" + LABEL_DETERMINE_USER_LANGUAGE: "Try to determine user language" + TAB_BRANDING: + LEGEND_BRANDING: "Branding" + LABEL_PAGE_TITLE: "Page Title" + LABEL_LOADING_DESCRIPTION: "Loading Description" + LABEL_FAVICON_URL: "Favicon" + LEGEND_LOGIN: "Login" + LABEL_LOGIN_LOGO: "Logo" + LABEL_LOGIN_DESCRIPTION: "Description" + LABEL_LOGIN_BACKGROUND: "Background" + LABEL_LOGIN_CUSTOM_CSS: "Custom CSS" + LABEL_LOGIN_SHOW_POWERED_LINK: "Show \"Powered by RainLoop\" link" + LEGEND_USER: "User" + LABEL_USER_LOGO: "Logo" + LABEL_USER_LOGO_TITLE: "Logo Title" + LABEL_USER_LOGO_MESSAGE: "Logo (Message View)" + LABEL_USER_CUSTOM_CSS: "Custom CSS" + LEGEND_WELCOME_PAGE: "Welcome page" + LABEL_WELCOME_PAGE_TITLE: "Title" + LABEL_WELCOME_PAGE_URL: "URL" + LABEL_WELCOME_PAGE_DISPLAY: "Display" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "None" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Once" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Always" + HTML_ALERT_PREMIUM: "This functionality is available for Premium subscribers." + TAB_CONTACTS: + LEGEND_CONTACTS: "Contacts" + LEGEND_STORAGE: "Storage (PDO)" + LABEL_ENABLE_CONTACTS: "Enable contacts" + LABEL_ALLOW_SYNC: "Allow contacts sync (with external CardDAV server)" + LABEL_STORAGE_TYPE: "Type" + LABEL_STORAGE_DSN: "Dsn" + LABEL_STORAGE_USER: "User" + LABEL_STORAGE_PASSWORD: "Password" + BUTTON_TEST: "Test" + ALERT_NOTICE: "Notice!" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Don't use this database type with a large number of active users." + HTML_ALERT_DOES_NOT_SUPPORTED: | + Your system doesn't support contacts. +
+ You need to install or enable PDO (SQLite / MySQL / PostgreSQL) extension on your server. + TAB_DOMAINS: + LEGEND_DOMAINS: "Domains" + BUTTON_ADD_DOMAIN: "Add Domain" + BUTTON_ADD_ALIAS: "Add Alias" + DELETE_ARE_YOU_SURE: "Are you sure?" + HTML_DOMAINS_HELPER: | + List of domains webmail is allowed to access. +
+ Click on the name to configure the domain. + TAB_SECURITY: + LEGEND_SECURITY: "Security" + LABEL_ALLOW_TWO_STEP: "Allow 2-Step Verification" + LABEL_FORCE_TWO_STEP: "Enforce 2-Step Verification" + LABEL_USE_IMAGE_PROXY: "Use local proxy for external images" + LABEL_ALLOW_OPEN_PGP: "Allow OpenPGP" + LABEL_SHOW_PHP_INFO: "Show PHP information" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Admin Panel Access Credentials" + LABEL_CURRENT_PASSWORD: "Current password" + LABEL_NEW_LOGIN: "New login" + LABEL_NEW_PASSWORD: "New password" + LABEL_REPEAT_PASSWORD: "Repeat" + BUTTON_UPDATE_PASSWORD: "Update Password" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "Require verification of SSL certificate used (IMAP/SMTP)" + LABEL_ALLOW_SELF_SIGNED: "Allow self signed certificates" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "Enable Google Integration" + LABEL_GOOGLE_AUTH: "Authorization" + LABEL_GOOGLE_DRIVE: "Google Drive Integration (Compose view)" + LABEL_GOOGLE_PREVIEW: "Google Viewer Integration (Preview for Microsoft Word, Excel and PowerPoint files)" + LABEL_GOOGLE_CLIENT_ID: "Client ID" + LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" + LABEL_GOOGLE_API_KEY: "Api Key" + HINT_GOOGLE_API_KEY: "Required for Google Drive File Picker" + LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "Enable Facebook Integration (Authorization)" + LABEL_FACEBOOK_APP_ID: "App ID" + LABEL_FACEBOOK_APP_SECRET: "App Secret" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "Enable Twitter Integration (Authorization)" + LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" + LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" + LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "Enable Dropbox Integration" + LABEL_DROPBOX_API_KEY: "Api Key" + TOP_ALERT: "Detailed information on social integration is found at" + TAB_PLUGINS: + LEGEND_PLUGINS: "Plugins" + LABEL_ENABLE_PLUGINS: "Enable plugins" + ALERT_NO_PLUGINS: "No plugins have yet been installed." + LINK_INSTALL_NEW: "Click here to install new!" + HINT_CLICK_NAME: "Click on the name to configure the plugin." + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "Available for Update" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Available for Installation" + LEGEND_INSTALLED_PACKAGES: "Installed Packages" + ALERT_CANNOT_ACCESS_REPOSITORY: "Cannot access the repository at the moment." + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "Your domain" + LABEL_VERSION: "Version" + LABEL_CHECKING: "Checking" + TYPE_BASIC_HINT: "This domain isn't licensed for commercial use (with additional features)." + TYPE_BASIC_HINT_2: "This domain can't be licensed." + HTML_ALERT_TOP_1: "RainLoop Webmail is licensed under" + HTML_ALERT_TOP_2: "You are free to use it for your personal projects." + HTML_ALERT_TOP_3: | + Commercial use (with additional features) of RainLoop Webmail requires getting a + subscription. + TYPE_PREMIUM_LIFETIME: "Lifetime" + LABEL_SUB_EXPIRES: "Subscription expires" + BUTTON_ACTIVATE: "Activate Subscription Key for this domain" + BUTTON_PURCHASE: "Purchase" + BUTTON_TRIAL: "Trial" + TAB_ABOUT: + LEGEND_ABOUT: "About" + LABEL_TAG_HINT: "Simple, modern & fast web-based email client" + LABEL_ALL_RIGHTS_RESERVED: "All Rights Reserved." + HINT_READ_CHANGE_LOG: "Please read the change log before updating." + HINT_IS_UP_TO_DATE: "RainLoop is up to date." + HTML_NEW_VERSION: "New %VERSION% version is available." + LABEL_UPDATING: "Updating" + LABEL_CHECKING: "Checking for updates" + BUTTON_UPDATE: "Update" + BUTTON_DOWNLOAD: "Download" + BUTTON_CHANGELOG: "Changelog" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "Activate Subscription Key?" + TITLE_ACTIVATION: "Activation..." + LABEL_DOMAIN: "Domain" + LABEL_SUB_KEY: "Subscription Key" + BUTTON_ACTIVATE: "Activate" + LABEL_ACTIVATED: "Activated" + ERROR_INVALID_SUBS_KEY: "Invalid Subscription Key" + SUBS_KEY_ACTIVATED: "Subscription Key Activated Successfully" + HTML_DESC: | + After activation, premium subscription for %DOMAIN% will be extended. +
+ Note that subscription key can be activated for a single domain only. +

+ Once started, the process of activation cannot be aborted or cancelled. + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "Add Alias" + LABEL_ALIAS: "Alias" + LABEL_DOMAIN: "Domain" + BUTTON_CLOSE: "Close" + BUTTON_ADD: "Add" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "Add Domain" + TITLE_ADD_DOMAIN_WITH_NAME: "Add Domain \"%NAME%\"" + TITLE_EDIT_DOMAIN: "Edit Domain \"%NAME%\"" + LABEL_NAME: "Name" + NAME_HELPER: "wildcard supported" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "Server" + LABEL_PORT: "Port" + LABEL_SECURE: "Secure" + LABEL_WHITE_LIST: "White List" + SECURE_OPTION_NONE: "None" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "Allow sieve scripts" + LABEL_ALLOW_USER_SCRIPT: "Allow custom user script" + LABEL_USE_SHORT_LOGIN: "Use short login" + LABEL_USE_AUTH: "Use authentication" + LABEL_USE_PHP_MAIL: "Use php mail() function" + BUTTON_TEST: "Test" + BUTTON_WHITE_LIST: "White List" + BUTTON_SIEVE_CONFIGURATION: "Sieve configuration" + BUTTON_BACK_TO_IMAP: "Back to IMAP settings" + BUTTON_BACK: "Back" + BUTTON_CLOSE: "Close" + BUTTON_ADD: "Add" + BUTTON_UPDATE: "Update" + NEW_DOMAIN_DESC: "This domain configuration will allow you to work
with %NAME% email addresses." + WHITE_LIST_ALERT: | + List of domain users webmail is allowed to access. + Use a space as delimiter. + POPUPS_PLUGIN: + TITLE_PLUGIN: "Plugin" + DESC_NOTHING_TO_CONFIGURE: "Nothing to configure" + BUTTON_CLOSE: "Close" + BUTTON_SAVE: "Save" + TOOLTIP_ABOUT_TITLE: "About" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "Are you sure you want to close this window?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Choose your language" + HINTS: + BETA: "beta" + UNSTABLE: "unstable" + WARNING: "Warning!" + NOT_SUPPORTED: "not supported" + REQUIRES_PHP_54: "requires PHP 5.4 or greater" + ERRORS: + DOMAIN_ALREADY_EXISTS: "Domain already exists" + UNKNOWN_ERROR: "Unknown error" + NOTIFICATIONS: + INVALID_TOKEN: "Invalid token" + AUTH_ERROR: "Authentication failed" + ACCESS_ERROR: "Access error" + CONNECTION_ERROR: "Can't connect to server" + CAPTCHA_ERROR: "Incorrect CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + DOMAIN_NOT_ALLOWED: "Domain is not allowed" + ACCOUNT_NOT_ALLOWED: "Account is not allowed" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" + COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" + CURRENT_PASSWORD_INCORRECT: "Current password incorrect" + NEW_PASSWORD_SHORT: "Password is too short" + NEW_PASSWORD_WEAK: "Password is too easy" + NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" + CONTACTS_SYNC_ERROR: "Contacts synchronization error" + CANT_GET_MESSAGE_LIST: "Can't get message list" + CANT_GET_MESSAGE: "Can't get message" + CANT_DELETE_MESSAGE: "Can't delete message" + CANT_MOVE_MESSAGE: "Can't move message" + CANT_SAVE_MESSAGE: "Can't save message" + CANT_SEND_MESSAGE: "Can't send message" + INVALID_RECIPIENTS: "Invalid recipients" + CANT_SAVE_FILTERS: "Can't save filters" + CANT_GET_FILTERS: "Can't get filters" + FILTERS_ARE_NOT_CORRECT: "Filters are not correct" + CANT_CREATE_FOLDER: "Can't create folder" + CANT_RENAME_FOLDER: "Can't rename folder" + CANT_DELETE_FOLDER: "Can't delete folder" + CANT_DELETE_NON_EMPTY_FOLDER: "Can't delete non-empty directory" + CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" + CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" + CANT_SAVE_SETTINGS: "Can't save settings" + CANT_SAVE_PLUGIN_SETTINGS: "Can't save settings" + DOMAIN_ALREADY_EXISTS: "Domain already exists" + CANT_INSTALL_PACKAGE: "Failed to install package" + CANT_DELETE_PACKAGE: "Failed to remove package" + INVALID_PLUGIN_PACKAGE: "Invalid plugin package" + UNSUPPORTED_PLUGIN_PACKAGE: "Unsupported plugin package" + LICENSING_SERVER_IS_UNAVAILABLE: "Subscription server is unvailable" + LICENSING_DOMAIN_EXPIRED: "Subscription for this domain has expired." + LICENSING_DOMAIN_BANNED: "Subscription for this domain is banned." + DEMO_SEND_MESSAGE_ERROR: "For security purposes, this account is not allowed to send messages to external e-mail addresses!" + DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" + ACCOUNT_ALREADY_EXISTS: "Account already exists" + ACCOUNT_DOES_NOT_EXIST: "Account doesn't exist" + MAIL_SERVER_ERROR: "An error has occured while accessing mail server" + INVALID_INPUT_ARGUMENT: "Invalid input argument" + UNKNOWN_ERROR: "Unknown error" + STATIC: + BACK_LINK: "Reload" + DOMAIN_LIST_DESC: "List of domains webmail is allowed to access." + PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" + PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" + NO_SCRIPT_TITLE: "JavaScript is required for this application." + NO_SCRIPT_DESC: | + JavaScript support is not available in your browser. + Please enable JavaScript support in your browser settings and retry. + NO_COOKIE_TITLE: "Cookies support is required for this application." + NO_COOKIE_DESC: | + Cookies support is not available in your browser. + Please enable Cookie support in your browser settings and retry. + BAD_BROWSER_TITLE: "Your browser is outdated." + BAD_BROWSER_DESC: | + To use all the features of the application, + download and install one of these browsers: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/es_ES.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/es_ES.yml new file mode 100755 index 00000000..2f3fc40a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/es_ES.yml @@ -0,0 +1,321 @@ +es_ES: + LOGIN: + LABEL_LOGIN: "Ingresar" + LABEL_PASSWORD: "Contraseña" + BUTTON_LOGIN: "Ingresar al panel de control" + TOP_PANEL: + LABEL_PREMIUM: "Premium" + LABEL_ADMIN_PANEL: "Panel de Control" + TABS_LABELS: + LABEL_GENERAL_NAME: "General" + LABEL_LOGIN_NAME: "Ingresar" + LABEL_BRANDING_NAME: "Personalización" + LABEL_CONTACTS_NAME: "Contactos" + LABEL_DOMAINS_NAME: "Dominios" + LABEL_SECURITY_NAME: "Seguridad" + LABEL_INTEGRATION_NAME: "Integración" + LABEL_PLUGINS_NAME: "Complementos" + LABEL_PACKAGES_NAME: "Paquetes" + LABEL_LICENSING_NAME: "Licencias" + LABEL_ABOUT_NAME: "Acerca" + TAB_GENERAL: + LEGEND_INTERFACE: "Interfaz" + LABEL_LANGUAGE: "Idioma" + LABEL_LANGUAGE_ADMIN: "Idioma (Panel de Control)" + LABEL_THEME: "Temas" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Permitir selección del idioma" + LABEL_ALLOW_THEMES_ON_SETTINGS: "Permitir personalización de la interfaz" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Permitir cambiar el fondo de pantalla" + LABEL_NEW_FOLDER_MOVE: "Nuevo botón \"mover a carpeta\"" + LABEL_SHOW_THUMBNAILS: "Mostrar previsualización (adjuntos)" + LABEL_ALLOW_GRAVATAR: "Usar Gravatar" + LEGEND_MAIN: "Principal" + LABEL_ATTACHMENT_SIZE_LIMIT: "Tamaño máximo para adjuntos" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Permitir cuentas adicionales" + LABEL_ALLOW_IDENTITIES: "Permitir múltiples identidades" + LABEL_ALLOW_TEMPLATES: "Permitir plantillas" + ALERT_WARNING: "¡Atención!" + HTML_ALERT_WEAK_PASSWORD: | + Estas utilizando la contraseña por defecto. +
+ Debido a razones de seguridad, debes + cambiar + tu contraseña inmediatamente. + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "Pantalla de Ingreso" + LABEL_DEFAULT_DOMAIN: "Dominio por defecto" + LABEL_DETERMINE_USER_DOMAIN: "Intentar encontrar el dominio del usuario" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Permitir la selección de idioma en la pantalla de ingreso" + LABEL_DETERMINE_USER_LANGUAGE: "Intentar definir el idioma del usuari" + TAB_BRANDING: + LEGEND_BRANDING: "Personalización" + LABEL_PAGE_TITLE: "Título de la página" + LABEL_LOADING_DESCRIPTION: "Descripción" + LABEL_FAVICON_URL: "Favicon" + LEGEND_LOGIN: "Ingresar" + LABEL_LOGIN_LOGO: "Logo" + LABEL_LOGIN_DESCRIPTION: "Descripción" + LABEL_LOGIN_BACKGROUND: "Fondo" + LABEL_LOGIN_CUSTOM_CSS: "CSS Personalizado" + LABEL_LOGIN_SHOW_POWERED_LINK: "Mostrar el enlace \"Potenciado por RainLoop\" " + LEGEND_USER: "Usuario" + LABEL_USER_LOGO: "Logo" + LABEL_USER_LOGO_TITLE: "Título del Logo" + LABEL_USER_LOGO_MESSAGE: "Logo (Vista desde mensaje)" + LABEL_USER_CUSTOM_CSS: "CSS Personalizado" + LEGEND_WELCOME_PAGE: "Pantalla de bienvenida" + LABEL_WELCOME_PAGE_TITLE: "Título" + LABEL_WELCOME_PAGE_URL: "URL" + LABEL_WELCOME_PAGE_DISPLAY: "Mostrar" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "Ninguno" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Una vez" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Siempre" + HTML_ALERT_PREMIUM: "Esta función se encuentra disponible para Usuarios Premium." + TAB_CONTACTS: + LEGEND_CONTACTS: "Contactos" + LEGEND_STORAGE: "Almacenamiento (PDO)" + LABEL_ENABLE_CONTACTS: "Permitir contactos" + LABEL_ALLOW_SYNC: "Permitir sincronización de contactos (servidor externo de CardDAV)" + LABEL_STORAGE_TYPE: "Tip" + LABEL_STORAGE_DSN: "Dsn" + LABEL_STORAGE_USER: "Usuario" + LABEL_STORAGE_PASSWORD: "Contraseña" + BUTTON_TEST: "Probar" + ALERT_NOTICE: "¡Advertencia!" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "No utilices este tipo de Base de Datos para un número grande de usuarios." + HTML_ALERT_DOES_NOT_SUPPORTED: | + Tu sistema no soporta el uso de Contactos. +
+ Debes instalar o habilitar el uso de PDO (SQLite / MySQL / PostgreSQL) en tu servidor. + TAB_DOMAINS: + LEGEND_DOMAINS: "Dominios" + BUTTON_ADD_DOMAIN: "Agregar dominio" + BUTTON_ADD_ALIAS: "Agregar alias" + DELETE_ARE_YOU_SURE: "¿Estás seguro?" + HTML_DOMAINS_HELPER: | + Lista de los dominios de correo al que se permite ingresar. +
+ Haz click en el nombre de un dominio para modificarlo. + TAB_SECURITY: + LEGEND_SECURITY: "Seguridad" + LABEL_ALLOW_TWO_STEP: "Activar la verificación de 2 pasos" + LABEL_FORCE_TWO_STEP: "Forzar la Autenticación en 2 pasos" + LABEL_USE_IMAGE_PROXY: "Utilizar un proxy local para mostrar imágenes externas" + LABEL_ALLOW_OPEN_PGP: "Permitir OpenPGP" + LABEL_SHOW_PHP_INFO: "Mostrar información de PHP" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Credenciales de Acceso al panel de control" + LABEL_CURRENT_PASSWORD: "Contraseña actual" + LABEL_NEW_LOGIN: "Nuevo login" + LABEL_NEW_PASSWORD: "Nueva contraseña" + LABEL_REPEAT_PASSWORD: "Re-ingresar" + BUTTON_UPDATE_PASSWORD: "Actualizar contraseña" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "Requerir verificación del certificado SSL (IMAP / SMTP)" + LABEL_ALLOW_SELF_SIGNED: "Permitir certificados auto-firmados" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "Activar la integración con Google" + LABEL_GOOGLE_AUTH: "Autorización" + LABEL_GOOGLE_DRIVE: "Google Drive Integration (vista del editor)" + LABEL_GOOGLE_PREVIEW: "Google Viewer Integration (Previsualizar archivos de Microsoft Word, Excel y PowerPoint)" + LABEL_GOOGLE_CLIENT_ID: "ID del Cliente" + LABEL_GOOGLE_CLIENT_SECRET: "Clave secreta de Cliente" + LABEL_GOOGLE_API_KEY: "Llave API" + HINT_GOOGLE_API_KEY: "Requerido para seleccionar archivos con Google Drive" + LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "Activar la integración con Facebook (Ingreso)" + LABEL_FACEBOOK_APP_ID: "ID de la Aplicación" + LABEL_FACEBOOK_APP_SECRET: "Clave secreta de la Aplicación" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "Activar la integración con Twitter (Ingreso)" + LABEL_TWITTER_CONSUMER_KEY: "Llave del Cliente" + LABEL_TWITTER_CONSUMER_SECRET: "Llave secreta del Cliente" + LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "Activar la integración con Dropbox" + LABEL_DROPBOX_API_KEY: "Llave API" + TOP_ALERT: "Puedes encontrar más información sobre integración de redes sociales en" + TAB_PLUGINS: + LEGEND_PLUGINS: "Complementos" + LABEL_ENABLE_PLUGINS: "Activar Plugins" + ALERT_NO_PLUGINS: "No hay plugins instalados." + LINK_INSTALL_NEW: "¡Haz click aquí para instalar uno nuevo!" + HINT_CLICK_NAME: "Haz click en el nombre para configurar el plugin." + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "Actualización disponible" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Instalación disponible" + LEGEND_INSTALLED_PACKAGES: "Paquetes instalados" + ALERT_CANNOT_ACCESS_REPOSITORY: "No se puede acceder al repositorio en estos momentos." + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "Tu dominio" + LABEL_VERSION: "Versión" + LABEL_CHECKING: "Verificando" + TYPE_BASIC_HINT: "Este dominio no ha sido licenciado para uso comercial (algunas características no disponibles)." + TYPE_BASIC_HINT_2: "Este dominio no puede ser licenciado." + HTML_ALERT_TOP_1: "RainLoop Webmail está licenciado bajo" + HTML_ALERT_TOP_2: "Eres libre de usarlo para un uso personal." + HTML_ALERT_TOP_3: | + Para utilizar RainLoop Webmail de forma comercial (con características adicionales) debes adquirir una licencia + Premium. + TYPE_PREMIUM_LIFETIME: "De por vida" + LABEL_SUB_EXPIRES: "La suscripción finaliza" + BUTTON_ACTIVATE: "Activar clave de suscripción para este dominio" + BUTTON_PURCHASE: "Comprar" + BUTTON_TRIAL: "Versión de Prueba" + TAB_ABOUT: + LEGEND_ABOUT: "Acerca" + LABEL_TAG_HINT: "Moderno, simple y rápido cliente web de correo electrónico" + LABEL_ALL_RIGHTS_RESERVED: "Todos los Derechos Reservados." + HINT_READ_CHANGE_LOG: "Revisa la lista de cambios antes de actualizar." + HINT_IS_UP_TO_DATE: "RainLoop está actualizado." + HTML_NEW_VERSION: "Nueva versión ( %VERSION% ) está disponible." + LABEL_UPDATING: "Actualizando" + LABEL_CHECKING: "Buscando actualizaciones" + BUTTON_UPDATE: "Actualizar" + BUTTON_DOWNLOAD: "Descargar" + BUTTON_CHANGELOG: "Lista de Cambios" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "¿Activar la clave de suscripción?" + TITLE_ACTIVATION: "Activando..." + LABEL_DOMAIN: "Dominio" + LABEL_SUB_KEY: "Clave de Suscripción" + BUTTON_ACTIVATE: "Activar" + LABEL_ACTIVATED: "Activado" + ERROR_INVALID_SUBS_KEY: "Clave de Suscripción inválida" + SUBS_KEY_ACTIVATED: "Clave de Suscripción activada correctamente" + HTML_DESC: "Después de la activación, la suscripción para %DOMAIN% será extendida.\n
\nTome nota que esta llave de suscripci\tón podrá\ + \ ser activada solo para un dominio.\n

\nUna vez comenzado, el proceso de activación no puede ser abortado ni cancelado.\n" + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "Agregar alias" + LABEL_ALIAS: "Alias" + LABEL_DOMAIN: "Dominio" + BUTTON_CLOSE: "Cerrar" + BUTTON_ADD: "Agregar" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "Agregar dominio" + TITLE_ADD_DOMAIN_WITH_NAME: "Agregar \"%NAME%\" como dominio" + TITLE_EDIT_DOMAIN: "Editar \"&NAME&\"" + LABEL_NAME: "Nombre" + NAME_HELPER: "wildcards soportados" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "FILTRO" + LABEL_SERVER: "Servidor" + LABEL_PORT: "Puerto" + LABEL_SECURE: "Seguridad" + LABEL_WHITE_LIST: "Lista blanca" + SECURE_OPTION_NONE: "Ninguno" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "Permitir scripts de filtro" + LABEL_ALLOW_USER_SCRIPT: "Permitir scripts propios" + LABEL_USE_SHORT_LOGIN: "Inicio de Sesión corto" + LABEL_USE_AUTH: "Usar autenticación" + LABEL_USE_PHP_MAIL: "Utilizar la función mail() de PHP" + BUTTON_TEST: "Probar" + BUTTON_WHITE_LIST: "Lista blanca" + BUTTON_SIEVE_CONFIGURATION: "Configuraciones de Filtro" + BUTTON_BACK_TO_IMAP: "Volver a la configuración IMAP" + BUTTON_BACK: "Volver" + BUTTON_CLOSE: "Cerrar" + BUTTON_ADD: "Agregar" + BUTTON_UPDATE: "Actualizar" + NEW_DOMAIN_DESC: "Esta configuración de Dominio le permitirá trabajar
con direcciones de correo tipo @%NAME%." + WHITE_LIST_ALERT: | + Lista de dominios con que los usuarios pueden ingresar. + Use un espacio como delimitador. + POPUPS_PLUGIN: + TITLE_PLUGIN: "Plugin" + DESC_NOTHING_TO_CONFIGURE: "Nada para configurar" + BUTTON_CLOSE: "Cerrar" + BUTTON_SAVE: "Guardar" + TOOLTIP_ABOUT_TITLE: "Acerca" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "¿Estás seguro de que deseas cerrar esta ventana?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Seleccionar idioma" + HINTS: + BETA: "beta" + UNSTABLE: "inestable" + WARNING: "¡Atención!" + NOT_SUPPORTED: "no soportado" + REQUIRES_PHP_54: "requiere PHP 5.4 o superior" + ERRORS: + DOMAIN_ALREADY_EXISTS: "El Dominio ya existe" + UNKNOWN_ERROR: "Error desconocido" + NOTIFICATIONS: + INVALID_TOKEN: "Token inválido" + AUTH_ERROR: "Autenticación fallida" + ACCESS_ERROR: "Error de acceso" + CONNECTION_ERROR: "No se puede conectar al servidor" + CAPTCHA_ERROR: "CAPTCHA Incorrecto." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + La cuenta social (ID) no está asignada a ninguna cuenta de correo todavía. + Inicie sesión con las credenciales de correo electrónico y habilite esta característica + en la configuración de cuenta. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + La cuenta social (ID) no está asignada a ninguna cuenta de correo todavía. + Inicie sesión con las credenciales de correo electrónico y habilite esta característica + en la configuración de cuenta. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >+ + La cuenta social (ID) no está asignada a ninguna cuenta de correo todavía. + Inicie sesión con las credenciales de correo electrónico y habilite esta característica + en la configuración de cuenta. + + DOMAIN_NOT_ALLOWED: "Dominio no permitido" + ACCOUNT_NOT_ALLOWED: "La cuenta no está permitida" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "La verificación en 2 pasos es obligatoria" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Error en la verificación de dos pasos" + COULD_NOT_SAVE_NEW_PASSWORD: "No se ha podido guardar la nueva contraseña" + CURRENT_PASSWORD_INCORRECT: "La contraseña actual es incorrecta" + NEW_PASSWORD_SHORT: "La contraseña es muy corta" + NEW_PASSWORD_WEAK: "La contraseña es muy fácil" + NEW_PASSWORD_FORBIDDENT: "La contraseña contiene caracteres prohibidos" + CONTACTS_SYNC_ERROR: "Error de sincronización de Contactos" + CANT_GET_MESSAGE_LIST: "No se puede obtener la lista de mensajes" + CANT_GET_MESSAGE: "No se puede obtener el mensaje" + CANT_DELETE_MESSAGE: "No se puede eliminar el mensaje" + CANT_MOVE_MESSAGE: "No se puede mover el mensaje" + CANT_SAVE_MESSAGE: "No se puede guardar el mensaje" + CANT_SEND_MESSAGE: "No se puede enviar el mensaje" + INVALID_RECIPIENTS: "Los destinatarios no son válidos" + CANT_SAVE_FILTERS: "No se han podido guardar los filtros" + CANT_GET_FILTERS: "No se pudieron obtener los filtros" + FILTERS_ARE_NOT_CORRECT: "Los filtros no son correctos" + CANT_CREATE_FOLDER: "No se puede crear la carpeta" + CANT_RENAME_FOLDER: "No se puede renombrar la carpeta" + CANT_DELETE_FOLDER: "No se puede eliminar la carpeta" + CANT_DELETE_NON_EMPTY_FOLDER: "No se puede eliminar una carpeta que no está vacía" + CANT_SUBSCRIBE_FOLDER: "No se pudo suscribir a la carpeta" + CANT_UNSUBSCRIBE_FOLDER: "No se pudo dessuscribir a la carpeta" + CANT_SAVE_SETTINGS: "No se pudieron guardar las configuraciones" + CANT_SAVE_PLUGIN_SETTINGS: "No se pudieron guardar las configuraciones" + DOMAIN_ALREADY_EXISTS: "El Dominio ya existe" + CANT_INSTALL_PACKAGE: "No se ha podido instalar el paquete" + CANT_DELETE_PACKAGE: "No se ha podido eliminar el paquete" + INVALID_PLUGIN_PACKAGE: "El paquete del plugin es inválido" + UNSUPPORTED_PLUGIN_PACKAGE: "El paquete del plugin es incompatible" + LICENSING_SERVER_IS_UNAVAILABLE: "El Servidor de Suscripción no está disponible" + LICENSING_DOMAIN_EXPIRED: "La suscripción para este dominio ha expirado." + LICENSING_DOMAIN_BANNED: "La suscripción para este dominio se ha bloqueado." + DEMO_SEND_MESSAGE_ERROR: "Por razones de seguridad, esta cuenta no permite enviar mensajes a direcciones de correo electrónico externas" + DEMO_ACCOUNT_ERROR: "Debido a razones de seguridad, esta cuenta no puede realizar esta acción" + ACCOUNT_ALREADY_EXISTS: "La cuenta ya existe" + ACCOUNT_DOES_NOT_EXIST: "La cuenta no existe" + MAIL_SERVER_ERROR: "Ocurrió un error mientras se accedía al servidor" + INVALID_INPUT_ARGUMENT: "Los datos ingresados son inválidos" + UNKNOWN_ERROR: "Error desconocido" + STATIC: + BACK_LINK: "Actualizar" + DOMAIN_LIST_DESC: "Lista de dominios de correo web que se le permite acceder." + PHP_EXSTENSIONS_ERROR_DESC: "¡La extensión de PHP requerida no está disponible en su configuración de PHP!" + PHP_VERSION_ERROR_DESC: "¡La versión de PHP (%VERSION%) es menor a la mínima requerida 5.3.0!" + NO_SCRIPT_TITLE: "JavaScript es requerido para esta aplicación." + NO_SCRIPT_DESC: | + JavaScript está desactivado. Por favor habilite JavaScript en la configuración de su navegador e inténtelo de nuevo. + NO_COOKIE_TITLE: "Las Cookies son requeridas para esta aplicación." + NO_COOKIE_DESC: | + Las Cookies están desactivadas. Por favor habilite las Cookies en la configuración de su navegador e inténtelo de nuevo. + BAD_BROWSER_TITLE: "El navegador no está actualizado" + BAD_BROWSER_DESC: | + Para usar todas las características de esta aplicación, + descargue e instale uno de estos navegadores: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fa_IR.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fa_IR.yml new file mode 100755 index 00000000..68f6c7a1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fa_IR.yml @@ -0,0 +1,325 @@ +fa_IR: + LOGIN: + LABEL_LOGIN: "ورود" + LABEL_PASSWORD: "گذرواژه" + BUTTON_LOGIN: "ورود به صفحه مدیریت" + TOP_PANEL: + LABEL_PREMIUM: "پریمیوم" + LABEL_ADMIN_PANEL: "صفحه مدیریت" + TABS_LABELS: + LABEL_GENERAL_NAME: "عمومی" + LABEL_LOGIN_NAME: "ورود" + LABEL_BRANDING_NAME: "برندسازی" + LABEL_CONTACTS_NAME: "تماس‌ها" + LABEL_DOMAINS_NAME: "دامنه‌ها" + LABEL_SECURITY_NAME: "امنیت" + LABEL_INTEGRATION_NAME: "یکپارچه‌سازی" + LABEL_PLUGINS_NAME: "افزونه‌ها" + LABEL_PACKAGES_NAME: "بسته‌ها" + LABEL_LICENSING_NAME: "مجوزها" + LABEL_ABOUT_NAME: "درباره" + TAB_GENERAL: + LEGEND_INTERFACE: "رابط" + LABEL_LANGUAGE: "زبان" + LABEL_LANGUAGE_ADMIN: "زبان (مدیر)" + LABEL_THEME: "پوسته" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "زبان در صفحه تنظیمات قابل انتخاب باشد" + LABEL_ALLOW_THEMES_ON_SETTINGS: "پوسته در صفحه تنظیمات قابل انتخاب باشد" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "تصویر پشت زمینه در صفحه تنظیمات قابل انتخاب باشد" + LABEL_SHOW_THUMBNAILS: "اندازه کوچک را نشان بده (پیوست‌ها)" + LABEL_ALLOW_GRAVATAR: "اجازه استفاده از آواتار" + LEGEND_MAIN: "اصلی" + LABEL_ATTACHMENT_SIZE_LIMIT: "محدودیت اندازه پیوست" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "مجوز استفاده از نام‌های کاربری دیگر" + LABEL_ALLOW_IDENTITIES: "اجازه استفاده از چندین شناسه" + LABEL_ALLOW_TEMPLATES: "اجازه استفاده از پوسته‌ها" + ALERT_WARNING: "اخطار!" + HTML_ALERT_WEAK_PASSWORD: |+ + شما در حال استفاده از گذرواژه پیش‌فرض کاربر مدیر هستید. +
+ بدلیل رعایت مسائل امنیتی + گذرواژه + را به کلمه دیگری تغییر دهید. + + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "صفحه ورود" + LABEL_DEFAULT_DOMAIN: "دامنه پیش‌فرض" + LABEL_DETERMINE_USER_DOMAIN: "برای تشخیص دامنه کاربر تلاش شود" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "انتخاب زبان در صفحه ورود" + LABEL_DETERMINE_USER_LANGUAGE: "برای تشخیص زبان کاربر تلاش شود" + TAB_BRANDING: + LEGEND_BRANDING: "برندسازی" + LABEL_PAGE_TITLE: "عنوان صفحه" + LABEL_LOADING_DESCRIPTION: "بارگذاری توضیحات" + LABEL_FAVICON_URL: "Favicon" + LEGEND_LOGIN: "ورود" + LABEL_LOGIN_LOGO: "لوگو" + LABEL_LOGIN_DESCRIPTION: "توضیحات" + LABEL_LOGIN_BACKGROUND: "پشت‌زمینه" + LABEL_LOGIN_CUSTOM_CSS: "CSS سفارشی‌سازی" + LABEL_LOGIN_SHOW_POWERED_LINK: "نمایش لینک \"قدرت گرفته از RainLoop\"" + LEGEND_USER: "کاربر" + LABEL_USER_LOGO: "لوگو" + LABEL_USER_LOGO_TITLE: "عنوان لوگو" + LABEL_USER_LOGO_MESSAGE: "لوگو (مشاهده پیام)" + LABEL_USER_CUSTOM_CSS: "CSS سفارشی‌سازی" + LEGEND_WELCOME_PAGE: "صفحه خوش‌آمدگویی" + LABEL_WELCOME_PAGE_TITLE: "عنوان" + LABEL_WELCOME_PAGE_URL: "تارنما" + LABEL_WELCOME_PAGE_DISPLAY: "نمایش" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "هیچ‌کدام" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "یک‌بار" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "همیشه" + HTML_ALERT_PREMIUM: "این قابلیت برای نسخه Premium مشترکین در دسترس هست." + TAB_CONTACTS: + LEGEND_CONTACTS: "تماس‌ها" + LEGEND_STORAGE: "فضای‌ ذخیره‌سازی (pdo)" + LABEL_ENABLE_CONTACTS: "فعال‌سازی تماس‌ها" + LABEL_ALLOW_SYNC: "اجازه‌ همگام‌سازی تماس‌ها (با یک سرویس خارجی CardDAV)" + LABEL_STORAGE_TYPE: "نوع" + LABEL_STORAGE_DSN: "Dsn" + LABEL_STORAGE_USER: "کاربر" + LABEL_STORAGE_PASSWORD: "گذرواژه" + BUTTON_TEST: "تست" + ALERT_NOTICE: "توجه!" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "از این پایگاه داده برای کاربران زیاد استفاده نکنید." + HTML_ALERT_DOES_NOT_SUPPORTED: | + سیستم از تماس‌ها پشتیبانی نمی‌کند +
+ شما باید افزونه PDO (SQLite / MySQL / PostgreSQL) را نصب کنید یا اینکه فعال کنید. + TAB_DOMAINS: + LEGEND_DOMAINS: "دامنه‌ها" + BUTTON_ADD_DOMAIN: "اضافه‌کردن دامنه" + BUTTON_ADD_ALIAS: "اضافه‌کردن نام مستعار" + DELETE_ARE_YOU_SURE: "آیا مطمئن هستید؟" + HTML_DOMAINS_HELPER: | + لیستی از دامنه‌هایی که وب‌میل اجازه دسترسی به آنها را دارد. +
+ روی دامنه دامنه جهت پیکربندی کلیک کنید. + TAB_SECURITY: + LEGEND_SECURITY: "امنیت" + LABEL_ALLOW_TWO_STEP: "اعتبارسنجی دو مرحله‌ای" + LABEL_FORCE_TWO_STEP: "اعتبارسنجی دو مرحله‌ای اجباری" + LABEL_USE_IMAGE_PROXY: "از پروکسی محلی برای عکسهای خارج از سرور استفاده شود" + LABEL_ALLOW_OPEN_PGP: "فعال‌سازی OpenPGP" + LABEL_SHOW_PHP_INFO: "نمایش اطلاعات PHP" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "اعتبار مجوز دسترسی به صفحه مدیریت" + LABEL_CURRENT_PASSWORD: "گذرواژه فعلی" + LABEL_NEW_LOGIN: "نام کاربری جدید" + LABEL_NEW_PASSWORD: "گذرواژه جدید" + LABEL_REPEAT_PASSWORD: "تکرار" + BUTTON_UPDATE_PASSWORD: "بروز‌رسانی گذرواژه" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "به بررسی گواهینامه SSL نیاز داشته باشد (IMAP/SMTP)" + LABEL_ALLOW_SELF_SIGNED: "به گواهی‌نامه‌هایی که توسط خودشان امضاء شده‌اند اجازه بده" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "گوگل" + LABEL_ENABLE_GOOGLE: "فعال‌سازی یکپارچگی با گوگل" + LABEL_GOOGLE_AUTH: "احراز مجوز" + LABEL_GOOGLE_DRIVE: "یکپارچگی با گوگل درایور (قسمت ایجاد پیام)" + LABEL_GOOGLE_PREVIEW: "یکپارچگی با نمایش فایلهای اداری گوگل (پیش نمایش برای Work, Excel, PowerPoint)" + LABEL_GOOGLE_CLIENT_ID: "شناسه کلاینت" + LABEL_GOOGLE_CLIENT_SECRET: "رمز کلاینت" + LABEL_GOOGLE_API_KEY: "کلید API" + HINT_GOOGLE_API_KEY: "اجباری برای دریافت کننده فایل گوگل درایو" + LEGEND_FACEBOOK: "فیس‌بوک" + LABEL_ENABLE_FACEBOOK: "فعال‌سازی یکپارچگی با فیس‌بوک (احراز هویت)" + LABEL_FACEBOOK_APP_ID: "شناسه برنامه" + LABEL_FACEBOOK_APP_SECRET: "رمز برنامه" + LEGEND_TWITTER: "توییتر" + LABEL_ENABLE_TWITTER: "فعال‌سازی یکپارچگی با توییتر (احراز هویت)" + LABEL_TWITTER_CONSUMER_KEY: "کلید مشتری" + LABEL_TWITTER_CONSUMER_SECRET: "رمز مشتری" + LEGEND_DROPBOX: "دارپ‌باکس" + LABEL_ENABLE_DROPBOX: "فعال‌سازی یکپارچگی با دراپ‌باکس" + LABEL_DROPBOX_API_KEY: "کلید API" + TOP_ALERT: "جزییات اطلاعات یکپارچگی با شبکه اجتماعی پیدا شد" + TAB_PLUGINS: + LEGEND_PLUGINS: "افزونه‌ها" + LABEL_ENABLE_PLUGINS: "فعال‌سازی افزونه‌ها" + ALERT_NO_PLUGINS: "هیچ افزونه‌ای نصب نشده است" + LINK_INSTALL_NEW: "اینجا برای نصب جدید کلیک کنید" + HINT_CLICK_NAME: "روی نام هر افزونه برای پیکربندی آن کلیک کنید" + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "برای بروزرسانی در دسترس هست" + LEGEND_AVAILABLE_FOR_INSTALLATION: "برای نصب در دسترس هست" + LEGEND_INSTALLED_PACKAGES: "بسته‌های نصب شده" + ALERT_CANNOT_ACCESS_REPOSITORY: "در این لحظه دسترسی به مخزن امکان‌پذیر نیست" + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "دامنه شما" + LABEL_VERSION: "نسخه" + LABEL_CHECKING: "در حال چک کردن" + TYPE_BASIC_HINT: "این دامنه مجوز استفاده تجاری را ندارد (با قابلیت‌های بیشتر)" + TYPE_BASIC_HINT_2: "به این دامنه مجوز داده نشده است." + HTML_ALERT_TOP_1: "وبمیل RainLoop تحت مجوز" + HTML_ALERT_TOP_2: " شما برای استفاده از آن آزاد personal projects. هستید" + HTML_ALERT_TOP_3: | + استفاده تجاری (با قابلیت‌های بیشتر) از RainLoop Webmail نیاز به پرداخت حق اشتراک دارد. + TYPE_PREMIUM_LIFETIME: "مادام العمر" + LABEL_SUB_EXPIRES: "انقضای حق اشتراک" + BUTTON_ACTIVATE: "فعال‌کردن حق اشتراک این دامنه" + BUTTON_PURCHASE: "خرید" + BUTTON_TRIAL: "آزمایشی" + TAB_ABOUT: + LEGEND_ABOUT: "درباره" + LABEL_TAG_HINT: "یک رابط کاربری پست الکترونیک ساده، پیشرفته و سریع" + LABEL_ALL_RIGHTS_RESERVED: "همه حقوق محفوظ هست" + HINT_READ_CHANGE_LOG: "فایل وقایع را قبل از بروزرسانی بخوانید." + HINT_IS_UP_TO_DATE: "RainLoop بروز هست" + HTML_NEW_VERSION: "نسخه %VERSION% در دسترس هست" + LABEL_UPDATING: "در حال بروزرسانی" + LABEL_CHECKING: "چک کردن برای بروزرسانی" + BUTTON_UPDATE: "بروزرسانی" + BUTTON_DOWNLOAD: "دریافت" + BUTTON_CHANGELOG: "تغییرات" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "حق اشتراک فعال شده است؟" + TITLE_ACTIVATION: "در حال فعال‌سازی..." + LABEL_DOMAIN: "دامن" + LABEL_SUB_KEY: "کلید حق اشتراک" + BUTTON_ACTIVATE: "فعال‌سازی" + LABEL_ACTIVATED: "فعال شده است" + ERROR_INVALID_SUBS_KEY: "کلید حق اشتراک نامعتبر" + SUBS_KEY_ACTIVATED: "کلید حق اشتراک با موفقیت فعال شد" + HTML_DESC: | + بعد از فعال‌سازی، سطح بالاتر اشتراک برای %DOMAIN% گسترش خواهد یافت. +
+ توجه کنید که کلید اشتراک فقط برای یک دامنه می‌تواند فعال شود. +

+ زمانی که شروع کردید، فرآیند فعال‌سازی قابل انصراف نیست. + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "اضافه کردن نام مستعار" + LABEL_ALIAS: "مستعار" + LABEL_DOMAIN: "دامنه" + BUTTON_CLOSE: "بستن" + BUTTON_ADD: "اضافه‌کردن" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "اضافه‌کردن دامنه" + TITLE_ADD_DOMAIN_WITH_NAME: "اضافه کردن دامنه \"%NAME%\"" + TITLE_EDIT_DOMAIN: "ویرایش دامنه \"%NAME%\"" + LABEL_NAME: "نام" + NAME_HELPER: "پشتیبانی از wildcard" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "سرور" + LABEL_PORT: "پورت" + LABEL_SECURE: "امن" + LABEL_WHITE_LIST: "لیست سفید" + SECURE_OPTION_NONE: "هیچ‌کدام" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "اجازه به اجرا‌شونده‌های sieve" + LABEL_ALLOW_USER_SCRIPT: "اجازه به اجرا‌شونده‌های سفارشی کاربر" + LABEL_USE_SHORT_LOGIN: "استفاده از ورود کوتاه بدون دامنه" + LABEL_USE_AUTH: "استفاده از احراز هویت" + LABEL_USE_PHP_MAIL: "استفاده از تابع mail() زبان PHP" + BUTTON_TEST: "تست" + BUTTON_WHITE_LIST: "لیست سفید" + BUTTON_SIEVE_CONFIGURATION: "پیکربندی Sieve" + BUTTON_BACK_TO_IMAP: "برگشت به تنظیمات IMAP" + BUTTON_BACK: "برگشت" + BUTTON_CLOSE: "بستن" + BUTTON_ADD: "اضافه‌کردن" + BUTTON_UPDATE: "بروزرسانی" + NEW_DOMAIN_DESC: "این تنظیمات دامنه به شما اجازه کار کردن
با پست الکترونیک %NAME% را می‌دهد." + WHITE_LIST_ALERT: | + لیستی از دامنه‌ها که کاربران وب‌میل می‌توانند به آنها دسترسی داشته باشند. + از فاصله جهت جدا کردن استفاده کنید. + POPUPS_PLUGIN: + TITLE_PLUGIN: "افزونه" + DESC_NOTHING_TO_CONFIGURE: "چیزی برای پیکربندی نیست" + BUTTON_CLOSE: "بستن" + BUTTON_SAVE: "ذخیره" + TOOLTIP_ABOUT_TITLE: "درباره" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "آیا شما از بستن این پنجره اطمینان دارید؟" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "زبان خود را انتخاب کنید" + HINTS: + BETA: "آزمایشی" + UNSTABLE: "ناپایدار" + WARNING: "هشدار!" + NOT_SUPPORTED: "پشتیبانی نمی‌شود" + REQUIRES_PHP_54: "به نسخه PHP 5.4 و بالاتر نیاز دارید" + ERRORS: + DOMAIN_ALREADY_EXISTS: "دامنه وجود دارد" + UNKNOWN_ERROR: "خطای نامشخص" + NOTIFICATIONS: + INVALID_TOKEN: "توکن نامعتبر" + AUTH_ERROR: "احراز هویت انجام نشد" + ACCESS_ERROR: "خطا در دسترسی" + CONNECTION_ERROR: "عدم اتصال به سرور" + CAPTCHA_ERROR: "تصویر اشتباه وارد شده است" + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + این شناسه اجتماعی برای هیچ کاربر پست الکترونیکی تاکنون تخصیص داده نشده است. + با استفاده از اعتبار کاربر پست الکترونیک خود وارد شوید و سپس این ویژگی را + در تنظیمات کاربر خود فعال کنید. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + این شناسه اجتماعی برای هیچ کاربر پست الکترونیکی تاکنون تخصیص داده نشده است. + با استفاده از اعتبار کاربر پست الکترونیک خود وارد شوید و سپس این ویژگی را + در تنظیمات کاربر خود فعال کنید. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + این شناسه اجتماعی برای هیچ کاربر پست الکترونیکی تاکنون تخصیص داده نشده است. + با استفاده از اعتبار کاربر پست الکترونیک خود وارد شوید و سپس این ویژگی را + در تنظیمات کاربر خود فعال کنید. + DOMAIN_NOT_ALLOWED: "دامنه اجازه داده نشده است" + ACCOUNT_NOT_ALLOWED: "کاربر اجازه داده نشده است" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "اعتبارسنجی دو مرحله‌ای مورد نیاز است" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "خطا در اعتبارسنجی دو مرحله‌ای" + COULD_NOT_SAVE_NEW_PASSWORD: "گذرواژه جدید ذخیره نشد" + CURRENT_PASSWORD_INCORRECT: "گذرواژه فعلی اشتباه است" + NEW_PASSWORD_SHORT: "گذرواژه کوتاه است" + NEW_PASSWORD_WEAK: "گذرواژه بسیار ساده است" + NEW_PASSWORD_FORBIDDENT: "گذرواژه شامل کاراکترهای غیرمجاز است" + CONTACTS_SYNC_ERROR: "همگام‌سازی تماس‌ها با خطا همراه بود" + CANT_GET_MESSAGE_LIST: "امکان دریافت لیست پیام‌ها نیست" + CANT_GET_MESSAGE: "امکان دریافت پیام نیست" + CANT_DELETE_MESSAGE: "امکان حذف پیام نیست" + CANT_MOVE_MESSAGE: "امکان انتقال پیام نیست" + CANT_SAVE_MESSAGE: "امکان ذخیره پیام نیست" + CANT_SEND_MESSAGE: "امکان ارسال پیام نیست" + INVALID_RECIPIENTS: "گیرنده نامعتبر" + CANT_SAVE_FILTERS: "امکان ذخیره فیلترها نیست" + CANT_GET_FILTERS: "امکان دریافت فیلترها نیست" + FILTERS_ARE_NOT_CORRECT: "فیلترها صحیح نیستند" + CANT_CREATE_FOLDER: "امکان ایجاد شاخه وجود ندارد" + CANT_RENAME_FOLDER: "امکان تغییر نام شاخه نیست" + CANT_DELETE_FOLDER: "امکان حذف شاخه نیست" + CANT_DELETE_NON_EMPTY_FOLDER: "امکان حذف شاخه‌ای که خالی نیست وجود ندارد" + CANT_SUBSCRIBE_FOLDER: "امکان اشتراک شاخه نیست" + CANT_UNSUBSCRIBE_FOLDER: "امکان عدم اشتراک شاخه نیست" + CANT_SAVE_SETTINGS: "امکان ذخیره تنظیمات نیست" + CANT_SAVE_PLUGIN_SETTINGS: "امکان ذخیره تنظیمات نیست" + DOMAIN_ALREADY_EXISTS: "دامنه در حال حاضر موجود است" + CANT_INSTALL_PACKAGE: "نصب بسته با خطا همراه بود" + CANT_DELETE_PACKAGE: "حذف بسته با خطا همراه بو" + INVALID_PLUGIN_PACKAGE: "بسته افزونه نامعتبر است" + UNSUPPORTED_PLUGIN_PACKAGE: "بسته افزونه پشتیبانی نمی‌شود" + LICENSING_SERVER_IS_UNAVAILABLE: "سرور مشترک شدن در دسترس نیست" + LICENSING_DOMAIN_EXPIRED: "اشتراک برای این دامنه منقضی شده است" + LICENSING_DOMAIN_BANNED: "اشتراک برای این دامنه مسدود شده است" + DEMO_SEND_MESSAGE_ERROR: "بنابر اهداف امنیتی، این کاربر اجازه ارسال ایمیل به یک ایمیل خارج از دامنه را ندارد!" + DEMO_ACCOUNT_ERROR: "بنابر اهداف امنیتی، این کاربر اجازه انجام این عملیات را ندارد!" + ACCOUNT_ALREADY_EXISTS: "کاربر وجود دارد" + ACCOUNT_DOES_NOT_EXIST: "کاربر وجود ندارد" + MAIL_SERVER_ERROR: "یک خطا در زمان دسترسی به سرویس پست الکترونیک رخ داد" + INVALID_INPUT_ARGUMENT: "پارامترهای ورودی نامعتبر" + UNKNOWN_ERROR: "خطای نامشخص" + STATIC: + BACK_LINK: "بارگذاری مجدد" + DOMAIN_LIST_DESC: "لیستی از دامنه‌های وب‌میل که برای دسترسی مجاز است." + PHP_EXSTENSIONS_ERROR_DESC: "به یک افزونه PHP نیاز دارد که در تنظیمات مربوط به PHP شما وجود ندارد!" + PHP_VERSION_ERROR_DESC: "نسخه PHP شما (%VERSION%) کمتر از حداقل نسخه مورد انتظار 5.3.0 هست!" + NO_SCRIPT_TITLE: "جاوا‌اسکریپت برای این برنامه مورد نیاز است." + NO_SCRIPT_DESC: | + پشتیبانی از جاوااسکریپت در مرورگر شما وجود ندارد. + لطفا پشتیبانی از جاوا‌اسکریپت را در تنظیمات مرورگر خود فعال کنید و مجددا تلاش کنید. + NO_COOKIE_TITLE: "Cookie باید بر روی مرورگر شما جهت استفاده از برنامه فعال باشد." + NO_COOKIE_DESC: | + پشتیبانی از Cookie در مرورگر شما فعال نیست. + لطفا Cookie را در تنظیمات مرورگر خود فعال کنید و مجددا تلاش کنید. + BAD_BROWSER_TITLE: "نسخه مرورگر شما قدیمی است." + BAD_BROWSER_DESC: | + برای استفاده از تمام قابلیتهای برنامه، + یکی از مرورگرهای زیر را دریافت و نصب کنید. diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fi_FI.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fi_FI.yml new file mode 100755 index 00000000..fe6852c8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fi_FI.yml @@ -0,0 +1,322 @@ +fi_FI: + LOGIN: + LABEL_LOGIN: "Tunnus" + LABEL_PASSWORD: "Salasana" + BUTTON_LOGIN: "Kirjaudu hallintapaneliin" + TOP_PANEL: + LABEL_PREMIUM: "Premium" + LABEL_ADMIN_PANEL: "Halintapaneli" + TABS_LABELS: + LABEL_GENERAL_NAME: "Yleiset" + LABEL_LOGIN_NAME: "Kirjautuminen" + LABEL_BRANDING_NAME: "Brändäys" + LABEL_CONTACTS_NAME: "Yhteystiedot" + LABEL_DOMAINS_NAME: "Verkkotunnutkset" + LABEL_SECURITY_NAME: "Turvallisuus" + LABEL_INTEGRATION_NAME: "Integroinnit" + LABEL_PLUGINS_NAME: "Pluginit" + LABEL_PACKAGES_NAME: "Paketit" + LABEL_LICENSING_NAME: "Lisensointi" + LABEL_ABOUT_NAME: "Tietoja" + TAB_GENERAL: + LEGEND_INTERFACE: "Käyttöliittymä" + LABEL_LANGUAGE: "Kieli" + LABEL_LANGUAGE_ADMIN: "Kieli (admin)" + LABEL_THEME: "Teema" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Salli kielivalinta asetuksissa" + LABEL_ALLOW_THEMES_ON_SETTINGS: "Salli teemavalinta asetuksissa" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Salli taustavalinta asetuksissa" + LABEL_SHOW_THUMBNAILS: "Näytä kuvakkeet (liitteet)" + LABEL_ALLOW_GRAVATAR: "Salli Gravatar" + LEGEND_MAIN: "Yleiset" + LABEL_ATTACHMENT_SIZE_LIMIT: "Liitetiedoston kokorajoitus" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Salli ylimääräiset tilit" + LABEL_ALLOW_IDENTITIES: "Salli useat identiteetit" + LABEL_ALLOW_TEMPLATES: "Salli mallipohjat" + ALERT_WARNING: "Varoitus!" + HTML_ALERT_WEAK_PASSWORD: | + Sinulla on käytössäsi hallintatunnuksen oletussalasana. +
+ Tietoturvasyistä, ole ystävällinen ja + vaihda + salasanasi nyt. + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "Kirjautumissivu" + LABEL_DEFAULT_DOMAIN: "Oletus domain" + LABEL_DETERMINE_USER_DOMAIN: "Koita päätellä käyttäjän domain" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Salli kielivalinta kirjautumissivulla" + LABEL_DETERMINE_USER_LANGUAGE: "Koita päätellä käyttäjän kieli" + TAB_BRANDING: + LEGEND_BRANDING: "Brändäys" + LABEL_PAGE_TITLE: "Sivun otsikko" + LABEL_LOADING_DESCRIPTION: "Ladataan kuvausta" + LABEL_FAVICON_URL: "Favicon" + LEGEND_LOGIN: "Kirjaudu" + LABEL_LOGIN_LOGO: "Logo" + LABEL_LOGIN_DESCRIPTION: "Kuvaus" + LABEL_LOGIN_BACKGROUND: "Tausta" + LABEL_LOGIN_CUSTOM_CSS: "Muokattu CSS" + LABEL_LOGIN_SHOW_POWERED_LINK: "Näytä \"Powered by RainLoop\" linkki" + LEGEND_USER: "Käyttäjä" + LABEL_USER_LOGO: "Logo" + LABEL_USER_LOGO_TITLE: "Logo otsikko" + LABEL_USER_LOGO_MESSAGE: "Logo (Viestinäkymä)" + LABEL_USER_CUSTOM_CSS: "Muokattu CSS" + LEGEND_WELCOME_PAGE: "Tervetuloa sivu" + LABEL_WELCOME_PAGE_TITLE: "Otsikko" + LABEL_WELCOME_PAGE_URL: "URL" + LABEL_WELCOME_PAGE_DISPLAY: "Näytä" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "Ei mitään" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Kerran" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Aina" + HTML_ALERT_PREMIUM: "Tämä toiminto on saatavissa vain Premium tilaajille." + TAB_CONTACTS: + LEGEND_CONTACTS: "Yhteystiedot" + LEGEND_STORAGE: "Tallennus (PDO)" + LABEL_ENABLE_CONTACTS: "Salli yhteystiedot" + LABEL_ALLOW_SYNC: "Salli yhteystietojen synkronointi (ulkoisella CardDAV palvelimella)" + LABEL_STORAGE_TYPE: "Tyyppi" + LABEL_STORAGE_DSN: "Dsn" + LABEL_STORAGE_USER: "Käyttäjä" + LABEL_STORAGE_PASSWORD: "Salasana" + BUTTON_TEST: "Testi" + ALERT_NOTICE: "Huomio!" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Älä käytä tätä tietokantatyyppiä suurella määrällä aktiivisia käyttäjiä." + HTML_ALERT_DOES_NOT_SUPPORTED: | + Järjestelmäsi ei tue yhteystietoja. +
+ Asenna tai aktivoi PDO (SQLite / MySQL / PostgreSQL) lisäosa palvelimellasi. + TAB_DOMAINS: + LEGEND_DOMAINS: "Domainit" + BUTTON_ADD_DOMAIN: "Lisää domain" + BUTTON_ADD_ALIAS: "Lisää alias" + DELETE_ARE_YOU_SURE: "Oletko varma?" + HTML_DOMAINS_HELPER: | + Lista domaineista joilla webmaililla on pääsy. +
+ Klikkaa nimeä konfiguroidaksesi domain. + TAB_SECURITY: + LEGEND_SECURITY: "Tietoturva" + LABEL_ALLOW_TWO_STEP: "Salli 2 vaiheinen todentaminen" + LABEL_FORCE_TWO_STEP: "Pakota 2 vaiheinen todentaminen" + LABEL_USE_IMAGE_PROXY: "Käytä paikallista proxya ulkoisille kuville." + LABEL_ALLOW_OPEN_PGP: "Salli OpenPGP" + LABEL_SHOW_PHP_INFO: "Näytä PHP tiedot" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Hallintapaneeli kirjautumistiedot" + LABEL_CURRENT_PASSWORD: "Nykyinen salasana" + LABEL_NEW_LOGIN: "Uusi tunnus" + LABEL_NEW_PASSWORD: "Uusi salasana" + LABEL_REPEAT_PASSWORD: "Toista" + BUTTON_UPDATE_PASSWORD: "Päivitä salasana" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "Vaadi SSL sertifikaatin varmistus (IMAP/SMTP)" + LABEL_ALLOW_SELF_SIGNED: "Salli itse-allekirjoitetut sertifikaatit" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "Aktivoi Google integrointi" + LABEL_GOOGLE_AUTH: "Valtuutus" + LABEL_GOOGLE_DRIVE: "Google Drive integraatio" + LABEL_GOOGLE_PREVIEW: "Google esikatselun integrointi (MS Word, Excel ja PowerPoint)" + LABEL_GOOGLE_CLIENT_ID: "Asiakkaan ID" + LABEL_GOOGLE_CLIENT_SECRET: "Asiakkaan salasana" + LABEL_GOOGLE_API_KEY: "API avain" + HINT_GOOGLE_API_KEY: "Vaaditaan Google Drive File Picker:lle" + LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "Aktivoi Facebook integrointi (Tunnistus)" + LABEL_FACEBOOK_APP_ID: "App ID" + LABEL_FACEBOOK_APP_SECRET: "App secret" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "Aktivoi Twitter integrointi (Tunnistus)" + LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" + LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" + LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "Aktivoi Dropbox integrointi" + LABEL_DROPBOX_API_KEY: "Api Key" + TOP_ALERT: "Yksityiskohtaiset tiedot some-integraatioista löytyy täältä" + TAB_PLUGINS: + LEGEND_PLUGINS: "Pluginit" + LABEL_ENABLE_PLUGINS: "Aktivoi pluginit" + ALERT_NO_PLUGINS: "Yhtään pluginia ei ole asennettu" + LINK_INSTALL_NEW: "Asenna tästä uusi!" + HINT_CLICK_NAME: "Klikkaa nimeä konfiguroidaksesi plugin" + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "Voidaan päivittää" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Voidaan asentaa" + LEGEND_INSTALLED_PACKAGES: "Aennetut pakkaukset" + ALERT_CANNOT_ACCESS_REPOSITORY: "Pääsy varastoon ei toimi tällä hetkellä." + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "Sinun domain" + LABEL_VERSION: "Versio" + LABEL_CHECKING: "Tarkastaa" + TYPE_BASIC_HINT: "Tämä domain ei ole lisensoitu kaupalliseen käyttöön (lisäominaisuuksilla)." + TYPE_BASIC_HINT_2: "Tätä verkkotunnusta ei voi lisensoida." + HTML_ALERT_TOP_1: "RainLoop Webmail on lisensoitu" + HTML_ALERT_TOP_2: "Voit käyttää ilmaiseksi omissa projekteissasi. " + HTML_ALERT_TOP_3: | + RainLoop Webmailin kaupallinen käyttö (lisäominaisuuksilla) vaatii + tilauksen. + TYPE_PREMIUM_LIFETIME: "Kesto" + LABEL_SUB_EXPIRES: "Tilaus päättyy" + BUTTON_ACTIVATE: "Aktivoi Tilaus Avain tälle verkkotunnukselle" + BUTTON_PURCHASE: "Osta" + BUTTON_TRIAL: "Koeaika" + TAB_ABOUT: + LEGEND_ABOUT: "Tietoja" + LABEL_TAG_HINT: "Helppo, moderni ja nopea web-pohjainen sähköpostiohjelma" + LABEL_ALL_RIGHTS_RESERVED: "Kaikki oikeudet pidätetään." + HINT_READ_CHANGE_LOG: "Lue muutosloki ennen päivitystä." + HINT_IS_UP_TO_DATE: "RainLoop on ajan tasalla." + HTML_NEW_VERSION: "Uusi versio %VERSION% on saatavissa." + LABEL_UPDATING: "Päivitetään" + LABEL_CHECKING: "Tarkastetaan päivityksiä" + BUTTON_UPDATE: "Päivitä" + BUTTON_DOWNLOAD: "Lataa" + BUTTON_CHANGELOG: "Muutosloki" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "Aktivoi tilausavain?" + TITLE_ACTIVATION: "Aktivoidaan..." + LABEL_DOMAIN: "Verkkotunnus" + LABEL_SUB_KEY: "Tilaus avain" + BUTTON_ACTIVATE: "Aktivoi" + LABEL_ACTIVATED: "Aktivoitu" + ERROR_INVALID_SUBS_KEY: "Väärä tilausavain" + SUBS_KEY_ACTIVATED: "Tilausavain aktivoitu onnistuneesti" + HTML_DESC: | + Aktivoinninn jälkeen tilaus %DOMAIN% verkkotunnukselle jatkuu. +
+ Huomioi että tilausavain voidaan aktivoida vain yhdelle verkkotunnukselle. +

+ Aloituksen jälkeen aktivointia ei voi keskeyttää tai peruuttaa. + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "Lisää Alias" + LABEL_ALIAS: "Alias" + LABEL_DOMAIN: "Verkkotunnus" + BUTTON_CLOSE: "Sulje" + BUTTON_ADD: "Lisää" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "Lisää verkkotunnus" + TITLE_ADD_DOMAIN_WITH_NAME: "Lisää verkkotunnus \"%NAME%\"" + TITLE_EDIT_DOMAIN: "Muokkaa verkkotunnusta \"%NAME%\"" + LABEL_NAME: "Nimi" + NAME_HELPER: "wildcard tuettu" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "Palvelin" + LABEL_PORT: "Portti" + LABEL_SECURE: "Secure" + LABEL_WHITE_LIST: "Sallitut Lista" + SECURE_OPTION_NONE: "Ei mitään" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "Salli sieve skriptit" + LABEL_ALLOW_USER_SCRIPT: "Salli käyttäjän omat skriptit" + LABEL_USE_SHORT_LOGIN: "Käytä lyhyttä kirjautumista" + LABEL_USE_AUTH: "Käytä tunnistautumista" + LABEL_USE_PHP_MAIL: "Käytä php mail() funktiota" + BUTTON_TEST: "Test" + BUTTON_WHITE_LIST: "Sallitut Lista" + BUTTON_SIEVE_CONFIGURATION: "Sieve asetukset" + BUTTON_BACK_TO_IMAP: "Takaisin IMAP asetuksiin" + BUTTON_BACK: "Takaisin" + BUTTON_CLOSE: "Sulje" + BUTTON_ADD: "Lisää" + BUTTON_UPDATE: "Päivitä" + NEW_DOMAIN_DESC: "Tämän verkkotunnuksen asetukset sallivat käyttää
%NAME% säkhöpostiosoitteita." + WHITE_LIST_ALERT: | + Lista domain käyttäjistä joihin webmaililla on oikeus. + Erottele välilyönnillä. + POPUPS_PLUGIN: + TITLE_PLUGIN: "Lisäosa" + DESC_NOTHING_TO_CONFIGURE: "Ei mitään asetettavaa" + BUTTON_CLOSE: "Sulje" + BUTTON_SAVE: "Tallenna" + TOOLTIP_ABOUT_TITLE: "Tietoja" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "Haluatko varmasti sulkea tämän ikkunan?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Valitse kieli" + HINTS: + BETA: "beta" + UNSTABLE: "epävakaa" + WARNING: "Varoitus!" + NOT_SUPPORTED: "ei tuettu" + REQUIRES_PHP_54: "Vaatii PHP version 5.4 tai uudemman" + ERRORS: + DOMAIN_ALREADY_EXISTS: "Verkkotunnus on jo olemassa" + UNKNOWN_ERROR: "Tuntematon virhe" + NOTIFICATIONS: + INVALID_TOKEN: "Väärä token" + AUTH_ERROR: "Tunnistautuminen epäonnistui" + ACCESS_ERROR: "Pääsyvirhe" + CONNECTION_ERROR: "Palvelimeen ei saa yhteyttä" + CAPTCHA_ERROR: "Väärä CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Tätä some ID:tä ei ole vielä liitetty mihinkään sähköpostitiliin. Kirjaudu + sähköpostitunnuksilla ja aktivoi tämä ominaisuus tilin asetuksissa. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Tätä some ID:tä ei ole vielä liitetty mihinkään sähköpostitiliin. Kirjaudu + sähköpostitunnuksilla ja aktivoi tämä ominaisuus tilin asetuksissa. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Tätä some ID:tä ei ole vielä liitetty mihinkään sähköpostitiliin. Kirjaudu + sähköpostitunnuksilla ja aktivoi tämä ominaisuus tilin asetuksissa. + DOMAIN_NOT_ALLOWED: "Verkkotunnue ei ole sallittu" + ACCOUNT_NOT_ALLOWED: "Tili ei ole sallittu" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Kaksiosainen tunnistus vaaditaan" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Kaksiosaisen tunnistuksen virhe" + COULD_NOT_SAVE_NEW_PASSWORD: "Uutta salasanaa ei voitu tallettaa" + CURRENT_PASSWORD_INCORRECT: "Nykyinen salasana on väärin" + NEW_PASSWORD_SHORT: "Salasana on liian lyhyt" + NEW_PASSWORD_WEAK: "Salasana on liian helppo" + NEW_PASSWORD_FORBIDDENT: "Salasana sisältää kielettyjä merkkejä" + CONTACTS_SYNC_ERROR: "Yhteystietojen syknronointivirhe" + CANT_GET_MESSAGE_LIST: "Viestilistaa ei voi ladata" + CANT_GET_MESSAGE: "Viestiä ei voi ladata" + CANT_DELETE_MESSAGE: "Viestiä ei voi poistaa" + CANT_MOVE_MESSAGE: "Viestiä ei voi siirtää" + CANT_SAVE_MESSAGE: "Viestiä ei voi tallentaa" + CANT_SEND_MESSAGE: "Viestiä ei voi lähettää" + INVALID_RECIPIENTS: "Virheelinen vastaanottaja" + CANT_SAVE_FILTERS: "Suodatinta ei voi tallentaa" + CANT_GET_FILTERS: "Suodattimia ei voi ladata" + FILTERS_ARE_NOT_CORRECT: "Suodattimissa on virhe" + CANT_CREATE_FOLDER: "Kansiota ei voi luoda" + CANT_RENAME_FOLDER: "Kansiota ei voi uudelleennimetä" + CANT_DELETE_FOLDER: "Kasiota ei voi poistaa" + CANT_DELETE_NON_EMPTY_FOLDER: "Kansio ei ole tyhjä, ei voida poistaa" + CANT_SUBSCRIBE_FOLDER: "Kansiota ei voi tilata" + CANT_UNSUBSCRIBE_FOLDER: "Kansion tilausta ei voi purkaa" + CANT_SAVE_SETTINGS: "Asetuksia ei voida tallentaa" + CANT_SAVE_PLUGIN_SETTINGS: "Asetuksia ei voida tallentaa" + DOMAIN_ALREADY_EXISTS: "Verkkotunnus on jo olemassa" + CANT_INSTALL_PACKAGE: "Paketin asennus epäonnistui" + CANT_DELETE_PACKAGE: "Paketin poisto epäonnistui" + INVALID_PLUGIN_PACKAGE: "Virheellinen lisäosa-paketti" + UNSUPPORTED_PLUGIN_PACKAGE: "Ei tuettu lisäosa-paketti" + LICENSING_SERVER_IS_UNAVAILABLE: "Tilauspalvelimeen ei saa yhteyttä" + LICENSING_DOMAIN_EXPIRED: "Tänä verkkotunnuksen tilaus on päättynyt." + LICENSING_DOMAIN_BANNED: "Tämän verkkotunnuksen tilaus on estetty." + DEMO_SEND_MESSAGE_ERROR: "Turvallisuus syistä tältä tililtä ei saa lähettää sähköposteja ulkoisiin osoitteisiin!" + DEMO_ACCOUNT_ERROR: "Turvallisuus syistä tämä toiminto on estettuy tälle tilille!" + ACCOUNT_ALREADY_EXISTS: "Tili on jo olemassa." + ACCOUNT_DOES_NOT_EXIST: "Tiliä ei ole olemassa" + MAIL_SERVER_ERROR: "Palvelin yhteydessä on tapahtunut virhe" + INVALID_INPUT_ARGUMENT: "Virheellinen syöte" + UNKNOWN_ERROR: "Tuntematon virhe" + STATIC: + BACK_LINK: "Päivitä" + DOMAIN_LIST_DESC: "Lista verkkotunnuksista joihin webmaililla on pääsy." + PHP_EXSTENSIONS_ERROR_DESC: "Vaadittavaa PHP lisäosaa ei ole saatavilla PHP määrittelyissäsi!" + PHP_VERSION_ERROR_DESC: "PHP versiosi (%VERSION%) on alle vaaditun 5.3.0!" + NO_SCRIPT_TITLE: "Javascript vaaditaan tälle sovellukselle." + NO_SCRIPT_DESC: | + Selaimesi ei tue JavaScriptiä. + Salli JavaScript selaimessasi ja yritä uudelleen. + NO_COOKIE_TITLE: "Esvästetuki vaaditaan tässä sovelluksessa." + NO_COOKIE_DESC: | + Selaimesi ei tue evästeitä. + Salli evästeet selaimessasi ja yritä uudelleen. + BAD_BROWSER_TITLE: "Selaimesi on vanhentunut." + BAD_BROWSER_DESC: | + Käyttääksesi kaikki ominaisuuksia + lataa ja asenna jokin näistä selaimista: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fr_FR.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fr_FR.yml new file mode 100755 index 00000000..e4062d83 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fr_FR.yml @@ -0,0 +1,326 @@ +fr_FR: + LOGIN: + LABEL_LOGIN: "Identifiant" + LABEL_PASSWORD: "Mot de passe" + BUTTON_LOGIN: "Se connecter au panneau d'administration" + TOP_PANEL: + LABEL_PREMIUM: "Premium" + LABEL_ADMIN_PANEL: "Panneau d'Administration" + TABS_LABELS: + LABEL_GENERAL_NAME: "Général" + LABEL_LOGIN_NAME: "Identifiant" + LABEL_BRANDING_NAME: "Logo & Marque" + LABEL_CONTACTS_NAME: "Contacts" + LABEL_DOMAINS_NAME: "Domaines" + LABEL_SECURITY_NAME: "Sécurité" + LABEL_INTEGRATION_NAME: "Intégrations" + LABEL_PLUGINS_NAME: "Plugins" + LABEL_PACKAGES_NAME: "Paquets" + LABEL_LICENSING_NAME: "Licences" + LABEL_ABOUT_NAME: "A propos" + TAB_GENERAL: + LEGEND_INTERFACE: "Interface" + LABEL_LANGUAGE: "Langue" + LABEL_LANGUAGE_ADMIN: "Langue (admin)" + LABEL_THEME: "Thème" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Permettre la sélection de la langue dans les paramètres" + LABEL_ALLOW_THEMES_ON_SETTINGS: "Permettre la sélection du thème dans les paramètres" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Permettre la sélection de l'arrière-plan dans les paramètres" + LABEL_NEW_FOLDER_MOVE: "Nouveau bouton \"déplacer vers le dossier\"" + LABEL_SHOW_THUMBNAILS: "Montrer les miniatures (pièces jointes)" + LABEL_ALLOW_GRAVATAR: "Autoriser Gravatar" + LEGEND_MAIN: "Principal" + LABEL_ATTACHMENT_SIZE_LIMIT: "Taille limite des pièces jointes" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Autoriser les comptes supplémentaires" + LABEL_ALLOW_IDENTITIES: "Autoriser les identités multiples" + LABEL_ALLOW_TEMPLATES: "Autoriser les modèles" + ALERT_WARNING: "ATTENTION !" + HTML_ALERT_WEAK_PASSWORD: | + Vous utilisez le mot de passe administrateur par défaut. +
+ Pour des raisons de sécurité, veuillez + changer le mot de passe + dès maintenant. + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "Ecran de connexion" + LABEL_DEFAULT_DOMAIN: "Domaine par défaut" + LABEL_DETERMINE_USER_DOMAIN: "Deviner le domaine de l'utilisateur" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Permettre la sélection de la langue sur l'écran de connexion" + LABEL_DETERMINE_USER_LANGUAGE: "Deviner la langue de l'utilisateur" + TAB_BRANDING: + LEGEND_BRANDING: "Logo & Marque" + LABEL_PAGE_TITLE: "Titre de la page" + LABEL_LOADING_DESCRIPTION: "Description pendant le chargement" + LABEL_FAVICON_URL: "Favicon" + LEGEND_LOGIN: "Connexion" + LABEL_LOGIN_LOGO: "Logo" + LABEL_LOGIN_DESCRIPTION: "Description" + LABEL_LOGIN_BACKGROUND: "Arrière-plan" + LABEL_LOGIN_CUSTOM_CSS: "CSS personnalisés" + LABEL_LOGIN_SHOW_POWERED_LINK: "Afficher le lien \"Powered by RainLoop\"" + LEGEND_USER: "Utilisateur" + LABEL_USER_LOGO: "Logo" + LABEL_USER_LOGO_TITLE: "Titre du logo" + LABEL_USER_LOGO_MESSAGE: "Logo (vue message)" + LABEL_USER_CUSTOM_CSS: "CSS personnalisés" + LEGEND_WELCOME_PAGE: "Page d'accueil" + LABEL_WELCOME_PAGE_TITLE: "Titre" + LABEL_WELCOME_PAGE_URL: "URL" + LABEL_WELCOME_PAGE_DISPLAY: "Affichage" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "Aucun" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Une seule fois" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Toujours" + HTML_ALERT_PREMIUM: "Cette fonctionnalité est réservé aux utilisateurs Premium." + TAB_CONTACTS: + LEGEND_CONTACTS: "Contacts" + LEGEND_STORAGE: "Stockage (PDO)" + LABEL_ENABLE_CONTACTS: "Activer les contacts" + LABEL_ALLOW_SYNC: "Autoriser la synchronisation des contacts (avec un serveur CardDAV externe)" + LABEL_STORAGE_TYPE: "Type" + LABEL_STORAGE_DSN: "Dsn" + LABEL_STORAGE_USER: "Utilisateur" + LABEL_STORAGE_PASSWORD: "Mot de passe" + BUTTON_TEST: "Test" + ALERT_NOTICE: "Avis !" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "N'utilisez pas ce type de base de données avec un grand nombre d'utilisateurs actifs." + HTML_ALERT_DOES_NOT_SUPPORTED: | + Votre système ne supporte pas les contacts. +
+ Vous devez installer ou autoriser l'extension PDO (SQLite / MySQL / PostgreSQL) sur votre serveur. + TAB_DOMAINS: + LEGEND_DOMAINS: "Domaines" + BUTTON_ADD_DOMAIN: "Ajouter un domaine" + BUTTON_ADD_ALIAS: "Ajouter un alias" + DELETE_ARE_YOU_SURE: "Êtes-vous sûr ?" + HTML_DOMAINS_HELPER: | + Liste des domaines autorisés. +
+ Cliquez sur le nom pour configurer le domaine. + TAB_SECURITY: + LEGEND_SECURITY: "Sécurité" + LABEL_ALLOW_TWO_STEP: "Autoriser l'authentification en deux étapes" + LABEL_FORCE_TWO_STEP: "Forcer l'authentification en deux étapes" + LABEL_USE_IMAGE_PROXY: "Utiliser un proxy local pour les images externes" + LABEL_ALLOW_OPEN_PGP: "Autoriser OpenPGP" + LABEL_SHOW_PHP_INFO: "Voir les informations PHP" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Codes d'accès au panneau d'administration" + LABEL_CURRENT_PASSWORD: "Mot de passe actuel" + LABEL_NEW_LOGIN: "Nouvel identifiant" + LABEL_NEW_PASSWORD: "Nouveau mot de passe" + LABEL_REPEAT_PASSWORD: "Répéter" + BUTTON_UPDATE_PASSWORD: "Changer le mot de passe" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "S'assurer qu'un certificat SSL (IMAP/SMTP) est utilisé" + LABEL_ALLOW_SELF_SIGNED: "Autoriser les certificats auto-signés" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "Activer l'intégration Google" + LABEL_GOOGLE_AUTH: "Autorisation" + LABEL_GOOGLE_DRIVE: "Intégration de Google Drive (Panneau de rédaction)" + LABEL_GOOGLE_PREVIEW: "Intégration de Google Viewer (Prévisualisation pour les fichiers Microsoft Word, Excel and PowerPoint)" + LABEL_GOOGLE_CLIENT_ID: "Client ID" + LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" + LABEL_GOOGLE_API_KEY: "Clé API" + HINT_GOOGLE_API_KEY: "Nécessaire pour le sélecteur de fichier de Google Drive" + LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "Activer l'intégration Facebook (Autorisation)" + LABEL_FACEBOOK_APP_ID: "App ID" + LABEL_FACEBOOK_APP_SECRET: "App Secret" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "Activer l'intégration Twitter (Autorisation)" + LABEL_TWITTER_CONSUMER_KEY: "Clé client" + LABEL_TWITTER_CONSUMER_SECRET: "Secret client" + LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "Activer l'intégration Dropbox" + LABEL_DROPBOX_API_KEY: "Clé API" + TOP_ALERT: "Les informations détaillées sur l'intégration des réseaux sociaux se trouve à" + TAB_PLUGINS: + LEGEND_PLUGINS: "Plugins" + LABEL_ENABLE_PLUGINS: "Activer les plugins" + ALERT_NO_PLUGINS: "Aucun plugin n'a été installé." + LINK_INSTALL_NEW: "Cliquez ici pour installer un nouveau plugin !" + HINT_CLICK_NAME: "Cliquez sur le nom pour configurer le plugin." + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "Disponible pour la mise à jour" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Disponible pour l'installation" + LEGEND_INSTALLED_PACKAGES: "Paquets installés" + ALERT_CANNOT_ACCESS_REPOSITORY: "Impossible d'accéder au dépôt pour l'instant." + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "Votre domaine" + LABEL_VERSION: "Version" + LABEL_CHECKING: "Vérification" + TYPE_BASIC_HINT: "Ce domaine ne possède pas de licence pour un usage commercial (avec des fonctionnalités supplémentaires)." + TYPE_BASIC_HINT_2: "Ce domaine ne peut pas obtenir de licence." + HTML_ALERT_TOP_1: "La licence RainLoop Webmail appartient à" + HTML_ALERT_TOP_2: "Vous êtes libre de l'utiliser pour vos projets personnels" + HTML_ALERT_TOP_3: | + L'usage commercial (avec des fonctionnalités supplémentaires) de RainLoop Webmail nécessite une + souscription. + TYPE_PREMIUM_LIFETIME: "A vie" + LABEL_SUB_EXPIRES: "La souscription expire" + BUTTON_ACTIVATE: "Activer une clé de souscription pour ce domaine" + BUTTON_PURCHASE: "Acheter" + BUTTON_TRIAL: "Essai" + TAB_ABOUT: + LEGEND_ABOUT: "A propos" + LABEL_TAG_HINT: "Un client webmail simple, moderne et rapide " + LABEL_ALL_RIGHTS_RESERVED: "Tous droits réservés." + HINT_READ_CHANGE_LOG: "Veuillez lire le journal des modifications avant de faire la mise à jour." + HINT_IS_UP_TO_DATE: "Rainloop est à jour." + HTML_NEW_VERSION: "Une nouvelle version %VERSION% est disponible." + LABEL_UPDATING: "Mise à jour" + LABEL_CHECKING: "Vérification des mises à jour" + BUTTON_UPDATE: "Mettre à jour" + BUTTON_DOWNLOAD: "Télécharger" + BUTTON_CHANGELOG: "Journal des modifications" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "Activer une clé de souscription ?" + TITLE_ACTIVATION: "Activation..." + LABEL_DOMAIN: "Domaine" + LABEL_SUB_KEY: "Clé de souscription" + BUTTON_ACTIVATE: "Activer" + LABEL_ACTIVATED: "Activé" + ERROR_INVALID_SUBS_KEY: "Clé de souscription invalide" + SUBS_KEY_ACTIVATED: "Activation de la clé de souscription réussie" + HTML_DESC: | + Après l'activation, la souscription premium pour %DOMAIN% va être prolongée. +
+ Notez que la clé de souscription ne peut être activée que pour un seul domaine. +

+ Une fois lancé, le processus d'activation ne peut pas être annulé ou abandonné. + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "Ajouter un alias" + LABEL_ALIAS: "Alias" + LABEL_DOMAIN: "Domaine" + BUTTON_CLOSE: "Fermer" + BUTTON_ADD: "Ajouter" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "Ajouter un domaine" + TITLE_ADD_DOMAIN_WITH_NAME: "Ajouter le domaine \"%NAME%\"" + TITLE_EDIT_DOMAIN: "Modifier le domaine \"%NAME%\"" + LABEL_NAME: "Nom" + NAME_HELPER: "Jokers autorisés" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "Serveur" + LABEL_PORT: "Port" + LABEL_SECURE: "Sécurité" + LABEL_WHITE_LIST: "Liste Blanche" + SECURE_OPTION_NONE: "Aucun" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "Autoriser les scripts sieve" + LABEL_ALLOW_USER_SCRIPT: "Autoriser les scripts personnels" + LABEL_USE_SHORT_LOGIN: "Utiliser l'identifiant court" + LABEL_USE_AUTH: "Utiliser l'authentification" + LABEL_USE_PHP_MAIL: "Utiliser la fonction mail() de php" + BUTTON_TEST: "Test" + BUTTON_WHITE_LIST: "Liste Blanche" + BUTTON_SIEVE_CONFIGURATION: "Configuration sieve" + BUTTON_BACK_TO_IMAP: "Retour à la configuration IMAP" + BUTTON_BACK: "Retour" + BUTTON_CLOSE: "Fermer" + BUTTON_ADD: "Ajouter" + BUTTON_UPDATE: "Modifier" + NEW_DOMAIN_DESC: "Cette configuration de domaine vous permettra de travailler
avec %NAME% dans les adresses électroniques." + WHITE_LIST_ALERT: | + Liste des utilisateurs du domaine auxquels le webmail est autorisé à accéder. + Utilisez un espace comme séparateur. + POPUPS_PLUGIN: + TITLE_PLUGIN: "Plugin" + DESC_NOTHING_TO_CONFIGURE: "Rien à configurer" + BUTTON_CLOSE: "Fermer" + BUTTON_SAVE: "Enregistrer" + TOOLTIP_ABOUT_TITLE: "A propos" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "Êtes-vous sûr de vouloir fermer cette fenêtre ?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Choisir la langue" + HINTS: + BETA: "bêta" + UNSTABLE: "instable" + WARNING: "ATTENTION !" + NOT_SUPPORTED: "non supporté" + REQUIRES_PHP_54: "nécessite PHP 5.4 ou supérieur" + ERRORS: + DOMAIN_ALREADY_EXISTS: "Le domaine existe déjà" + UNKNOWN_ERROR: "Erreur inconnue" + NOTIFICATIONS: + INVALID_TOKEN: "Jeton invalide" + AUTH_ERROR: "L'authentification a échoué" + ACCESS_ERROR: "Erreur d'accès" + CONNECTION_ERROR: "Serveur injoignable" + CAPTCHA_ERROR: "CAPTCHA incorrect." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Cet ID social n'est pas encore assigné à une adresse email. Connectez-vous + en utilisant les informations d'identification du courrier électronique et + activez cette fonctionnalité dans les paramètres de votre compte. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Cet ID social n'est pas encore assigné à une adresse email. Connectez-vous + en utilisant les informations d'identification du courrier électronique et + activez cette fonctionnalité dans les paramètres de votre compte. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Cet ID social n'est pas encore assigné à une adresse email. Connectez-vous + en utilisant les informations d'identification du courrier électronique et + activez cette fonctionnalité dans les paramètres de votre compte. + DOMAIN_NOT_ALLOWED: "Ce domaine n'est pas autorisé" + ACCOUNT_NOT_ALLOWED: "Ce compte n'est pas autorisé" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Double authentification requise" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Erreur lors de la double authentification" + COULD_NOT_SAVE_NEW_PASSWORD: "Impossible d'enregistrer le nouveau mot de passe" + CURRENT_PASSWORD_INCORRECT: "Le mot de passe actuel est incorrect" + NEW_PASSWORD_SHORT: "Le mot de passe est trop court" + NEW_PASSWORD_WEAK: "Le mot de passe n'est pas assez fort" + NEW_PASSWORD_FORBIDDENT: "Le mot de passe contient des caractères invalides" + CONTACTS_SYNC_ERROR: "Erreur de synchronisation des contacts" + CANT_GET_MESSAGE_LIST: "Impossible d'obtenir la liste des messages" + CANT_GET_MESSAGE: "Impossible d'obtenir le message" + CANT_DELETE_MESSAGE: "Impossible de supprimer le message" + CANT_MOVE_MESSAGE: "Impossible de déplacer le message" + CANT_SAVE_MESSAGE: "Impossible d'enregistrer le message" + CANT_SEND_MESSAGE: "Impossible d'envoyer le message" + INVALID_RECIPIENTS: "Destinataires invalides" + CANT_SAVE_FILTERS: "Impossible d'enregistrer les filtres" + CANT_GET_FILTERS: "Impossible d'obtenir les filtres" + FILTERS_ARE_NOT_CORRECT: "Les filtres ne sont pas corrects" + CANT_CREATE_FOLDER: "Impossible de créer le dossier" + CANT_RENAME_FOLDER: "Impossible de renommer le dossier" + CANT_DELETE_FOLDER: "Impossible de supprimer le dossier" + CANT_DELETE_NON_EMPTY_FOLDER: "Impossible de supprimer un dossier non vide" + CANT_SUBSCRIBE_FOLDER: "Impossible de s'abonner au dossier" + CANT_UNSUBSCRIBE_FOLDER: "Impossible de se désabonner du dossier" + CANT_SAVE_SETTINGS: "Vous ne pouvez pas enregistrer les paramètres" + CANT_SAVE_PLUGIN_SETTINGS: "Vous ne pouvez pas enregistrer les paramètres" + DOMAIN_ALREADY_EXISTS: "Le domaine existe déjà" + CANT_INSTALL_PACKAGE: "Impossible d'installer le paquet" + CANT_DELETE_PACKAGE: "Impossible de supprimer le paquet" + INVALID_PLUGIN_PACKAGE: "Ce plugin est invalide" + UNSUPPORTED_PLUGIN_PACKAGE: "Ce plugin n'est pas supporté" + LICENSING_SERVER_IS_UNAVAILABLE: "Le serveur d'abonnement est inaccessible" + LICENSING_DOMAIN_EXPIRED: "L'abonnement de ce domaine a expiré." + LICENSING_DOMAIN_BANNED: "L'abonnement pour ce domaine est interdit." + DEMO_SEND_MESSAGE_ERROR: "Pour des raisons de sécurité, ce compte de démonstration n'est pas autorisé à envoyer des messages à des adresses e-mail externes !" + DEMO_ACCOUNT_ERROR: "Pour des raisons de sécurité, ce compte n'est pas autorisé à faire cette action !" + ACCOUNT_ALREADY_EXISTS: "Ce compte existe déjà" + ACCOUNT_DOES_NOT_EXIST: "Ce compte n'existe pas" + MAIL_SERVER_ERROR: "Une erreur est survenue lors de l'accès au serveur de messagerie" + INVALID_INPUT_ARGUMENT: "Argument invalide" + UNKNOWN_ERROR: "Erreur inconnue" + STATIC: + BACK_LINK: "Recharger" + DOMAIN_LIST_DESC: "Liste des domaines autorisés." + PHP_EXSTENSIONS_ERROR_DESC: "Les extensions PHP nécessaires ne sont pas disponibles dans votre configuration de PHP !" + PHP_VERSION_ERROR_DESC: "Votre version de PHP (% VERSION%) est inférieure au minimum requis 5.3.0!" + NO_SCRIPT_TITLE: "JavaScript est nécessaire pour cette application." + NO_SCRIPT_DESC: | + Le support de JavaScript n'est pas disponible dans votre navigateur. + Veuillez activer le support de JavaScript dans les paramètres de votre navigateur et réessayer. + NO_COOKIE_TITLE: "Le support des cookies est nécessaire pour cette application." + NO_COOKIE_DESC: | + Le support des cookies n'est pas disponible dans votre navigateur. + Veuillez activer le support des cookies dans les paramètres de votre navigateur et réessayer. + BAD_BROWSER_TITLE: "Votre navigateur n'est pas à jour." + BAD_BROWSER_DESC: | + Pour utiliser toutes les fonctionnalités de l'application, + téléchargez et installez l'un de ces navigateurs : diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/hu_HU.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/hu_HU.yml new file mode 100755 index 00000000..df08e6c5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/hu_HU.yml @@ -0,0 +1,322 @@ +hu_HU: + LOGIN: + LABEL_LOGIN: "Belépés" + LABEL_PASSWORD: "Jelszó" + BUTTON_LOGIN: "Bejelentkezés az admin felületre" + TOP_PANEL: + LABEL_PREMIUM: "Prémuim" + LABEL_ADMIN_PANEL: "Adminisztrációs felület" + TABS_LABELS: + LABEL_GENERAL_NAME: "Általános" + LABEL_LOGIN_NAME: "Belépés" + LABEL_BRANDING_NAME: "Arculat" + LABEL_CONTACTS_NAME: "Névjegyek" + LABEL_DOMAINS_NAME: "Domainek" + LABEL_SECURITY_NAME: "Biztonság" + LABEL_INTEGRATION_NAME: "Integrációk" + LABEL_PLUGINS_NAME: "Beépülők" + LABEL_PACKAGES_NAME: "Csomagok" + LABEL_LICENSING_NAME: "Licencelés" + LABEL_ABOUT_NAME: "Névjegy" + TAB_GENERAL: + LEGEND_INTERFACE: "Felület" + LABEL_LANGUAGE: "Nyelv" + LABEL_LANGUAGE_ADMIN: "Nyelv (admin)" + LABEL_THEME: "Téma" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Nyelv választás engedélyezés a beállításoknál" + LABEL_ALLOW_THEMES_ON_SETTINGS: "Téma választás engedélyezés a beállításoknál" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Háttér választás engedélyezés a beállításoknál" + LABEL_NEW_FOLDER_MOVE: "Új \"áthelyezés mappába\" gomb" + LABEL_SHOW_THUMBNAILS: "Előnézetek megjelenítése (mellékletek)" + LABEL_ALLOW_GRAVATAR: "Gravatar engedélyezés" + LEGEND_MAIN: "Fontos" + LABEL_ATTACHMENT_SIZE_LIMIT: "Melléklet méret korlát" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "További fiókok engedélyezése" + LABEL_ALLOW_IDENTITIES: "Több identitás engedélyezése" + LABEL_ALLOW_TEMPLATES: "Sablonok engedélyezése" + ALERT_WARNING: "Figyelmeztetés!" + HTML_ALERT_WEAK_PASSWORD: | + Az alapértelmezett admin jelszót használod +
+ Biztonsági okokból kérlek + változtasd meg + a jelszót valami másra! + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "Bejelentkező képernyő" + LABEL_DEFAULT_DOMAIN: "Alapértelmezett domain" + LABEL_DETERMINE_USER_DOMAIN: "Próbálja megállapítani a felhasználó domainjét" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Nyel választás engedélyezése a bejelentkező képernyőn" + LABEL_DETERMINE_USER_LANGUAGE: "Próbálja megállapítani a felhasználó nyelvét" + TAB_BRANDING: + LEGEND_BRANDING: "Arculat" + LABEL_PAGE_TITLE: "Oldal címe" + LABEL_LOADING_DESCRIPTION: "Betöltés leírás" + LABEL_FAVICON_URL: "Favicon" + LEGEND_LOGIN: "Belépés" + LABEL_LOGIN_LOGO: "Logo" + LABEL_LOGIN_DESCRIPTION: "Leírás" + LABEL_LOGIN_BACKGROUND: "Háttér" + LABEL_LOGIN_CUSTOM_CSS: "Saját CSS" + LABEL_LOGIN_SHOW_POWERED_LINK: "\"Powered by RainLoop\" link megjelenítése" + LEGEND_USER: "Felhasználó" + LABEL_USER_LOGO: "Logo" + LABEL_USER_LOGO_TITLE: "Logo cím" + LABEL_USER_LOGO_MESSAGE: "Logo (üzenet nézet)" + LABEL_USER_CUSTOM_CSS: "Saját CSS" + LEGEND_WELCOME_PAGE: "Üdvözlő oldal" + LABEL_WELCOME_PAGE_TITLE: "Cím" + LABEL_WELCOME_PAGE_URL: "URL" + LABEL_WELCOME_PAGE_DISPLAY: "Megjelenítés" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "Semmi" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Egyszer" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Mindig" + HTML_ALERT_PREMIUM: "Ez a funkció csak a Prémium előfizetők számára érhető el." + TAB_CONTACTS: + LEGEND_CONTACTS: "Névjegyek" + LEGEND_STORAGE: "Tárhely (PDO)" + LABEL_ENABLE_CONTACTS: "Címtár engedélyezése" + LABEL_ALLOW_SYNC: "Címtár szinkronizálás engedélyezése (külső CardDAV szerverrel)" + LABEL_STORAGE_TYPE: "Típus" + LABEL_STORAGE_DSN: "DSN" + LABEL_STORAGE_USER: "Felhasználó" + LABEL_STORAGE_PASSWORD: "Jelszó" + BUTTON_TEST: "Teszt" + ALERT_NOTICE: "Megjegyzés!" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Ne használd ezt az adatbázis típust nagy számú aktív felhasználóval." + HTML_ALERT_DOES_NOT_SUPPORTED: | + A rendszer nem támogatja a címtárat. +
+ Telepítened vagy engedélyezned kell egy PDO (SQLite / MySQL / PostgreSQL) kiterjesztést a szervereden. + TAB_DOMAINS: + LEGEND_DOMAINS: "Domainek" + BUTTON_ADD_DOMAIN: "Domain hozzáadás" + BUTTON_ADD_ALIAS: "Álnév hozzáadás" + DELETE_ARE_YOU_SURE: "Biztos vagy benne?" + HTML_DOMAINS_HELPER: | + Hozzáféréshez engedélyezett domainek listája: +
+ A domain beállításához kattints a névre. + TAB_SECURITY: + LEGEND_SECURITY: "Biztonság" + LABEL_ALLOW_TWO_STEP: "2 lépcsős hitelesítés engedélyezése" + LABEL_FORCE_TWO_STEP: "2 lépcsős hitelesítés kényszerítése" + LABEL_USE_IMAGE_PROXY: "Helyi proxy használata a külső képekhez" + LABEL_ALLOW_OPEN_PGP: "OpenPGP engedélyezése" + LABEL_SHOW_PHP_INFO: "PHP információ megjelenítése" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Admin panel hozzáférés hitelesítés" + LABEL_CURRENT_PASSWORD: "Jelenlegi jelszó" + LABEL_NEW_LOGIN: "Új felhasználó" + LABEL_NEW_PASSWORD: "Új jelszó" + LABEL_REPEAT_PASSWORD: "Újra" + BUTTON_UPDATE_PASSWORD: "Jelszó frissítés" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "A használt (IMAP/SMTP) tanúsítvány ellenőrzés megkövetelése" + LABEL_ALLOW_SELF_SIGNED: "Saját aláírt tanúsítványok engedélyezése" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "Google integráció engedélyezése" + LABEL_GOOGLE_AUTH: "Hitelesítés" + LABEL_GOOGLE_DRIVE: "Google Drive integráció (levélírás nézet)" + LABEL_GOOGLE_PREVIEW: "Google Viewer integráció (Microsoft Word, Excel és PowerPoint fájlok előnézetéhez)" + LABEL_GOOGLE_CLIENT_ID: "Kliens ID" + LABEL_GOOGLE_CLIENT_SECRET: "Kliens titok" + LABEL_GOOGLE_API_KEY: "API kulcs" + HINT_GOOGLE_API_KEY: "Google Drive fájl választóhoz szükséges" + LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "Facebook integráció engedélyezése (hitelesítés)" + LABEL_FACEBOOK_APP_ID: "Alkalmazás ID" + LABEL_FACEBOOK_APP_SECRET: "Alkalmazás titok" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "Twitter integráció engedélyezése (hitelesítés)" + LABEL_TWITTER_CONSUMER_KEY: "Consumer kulcs" + LABEL_TWITTER_CONSUMER_SECRET: "Consumer titok" + LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "Dropbox integráció engedélyezése" + LABEL_DROPBOX_API_KEY: "API kulcs" + TOP_ALERT: "A közösségi integrációról részletes információkat itt találsz:" + TAB_PLUGINS: + LEGEND_PLUGINS: "Beépülők" + LABEL_ENABLE_PLUGINS: "Beépülők engedélyezése" + ALERT_NO_PLUGINS: "Még nincsenek telepítve beépülők." + LINK_INSTALL_NEW: "Új telepítéséhez kattints ide!" + HINT_CLICK_NAME: "A beépülő beállításához kattints a nevére." + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "Frissíthető" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Telepíthető" + LEGEND_INSTALLED_PACKAGES: "Telepített csomagok" + ALERT_CANNOT_ACCESS_REPOSITORY: "Jelenleg nem lehet csatlakozni a tárolóhoz" + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "Domained" + LABEL_VERSION: "Verzió" + LABEL_CHECKING: "Ellenőrzés" + TYPE_BASIC_HINT: "Ez a domain nem licencelt kereskedelmi használatra (hozzáadott funkciókkal)." + TYPE_BASIC_HINT_2: "Ez a domain nem licencelhető." + HTML_ALERT_TOP_1: "RainLoop Webmail licence:" + HTML_ALERT_TOP_2: "Szabadon felhasználható a személyes projektjeidhez." + HTML_ALERT_TOP_3: | + A RainLoop Webmail kereskedelmi használatához (további funkciókkal) előfizetés szükséges. + TYPE_PREMIUM_LIFETIME: "Örökös" + LABEL_SUB_EXPIRES: "Előfizetés lejár" + BUTTON_ACTIVATE: "Előfizetési kulcs aktiválása ehhez a domainhez" + BUTTON_PURCHASE: "Vásárlás" + BUTTON_TRIAL: "Próba" + TAB_ABOUT: + LEGEND_ABOUT: "Névjegy" + LABEL_TAG_HINT: "Egyszerű, modern és gyors webes email kliens" + LABEL_ALL_RIGHTS_RESERVED: "Minden jog fenntartva." + HINT_READ_CHANGE_LOG: "Frissítés előtt kérlek olvasd el a változások listáját." + HINT_IS_UP_TO_DATE: "A RainLoop naprakész." + HTML_NEW_VERSION: "Új verzió érhető el: %VERSION%" + LABEL_UPDATING: "Frissítés" + LABEL_CHECKING: "Frissítések ellenőrzése" + BUTTON_UPDATE: "Frissítés" + BUTTON_DOWNLOAD: "Letöltés" + BUTTON_CHANGELOG: "Változások listája" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "Előfizetési kulcs aktiválása?" + TITLE_ACTIVATION: "Aktiválás..." + LABEL_DOMAIN: "Domain" + LABEL_SUB_KEY: "Előfizetési kulcs" + BUTTON_ACTIVATE: "Aktivál" + LABEL_ACTIVATED: "Akitválva" + ERROR_INVALID_SUBS_KEY: "Érvénytelen előfizetési kulcs" + SUBS_KEY_ACTIVATED: "Előfizetési kulcs sikeresen aktiválva" + HTML_DESC: | + Aktiválás után a %DOMAIN% prémium előfizetése meg lesz hosszabbítva. +
+ Egy előfizetési kulcs csak egy domainhez aktiválható. +

+ Miután elindult, az aktiválási folyamat nem szakítható meg vagy vonható vissza. + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "Álnév hozzáadás" + LABEL_ALIAS: "Álnév" + LABEL_DOMAIN: "Domain" + BUTTON_CLOSE: "Bezár" + BUTTON_ADD: "Hozzáad" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "Domain hozzáadás" + TITLE_ADD_DOMAIN_WITH_NAME: "\"%NAME%\" domain hozzáadása" + TITLE_EDIT_DOMAIN: "\"%NAME%\" domain szerkesztése" + LABEL_NAME: "Név" + NAME_HELPER: "helyettesítő karakter használható" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "Szerver" + LABEL_PORT: "Port" + LABEL_SECURE: "Biztonság" + LABEL_WHITE_LIST: "Fehér lista" + SECURE_OPTION_NONE: "Semmi" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "SIEVE szkriptek engedélyezése" + LABEL_ALLOW_USER_SCRIPT: "Saját felhasználói szkript engedélyezése" + LABEL_USE_SHORT_LOGIN: "Rövid felhasználónév használata" + LABEL_USE_AUTH: "Hitelesítés használata" + LABEL_USE_PHP_MAIL: "A PHP mail() funkció használata" + BUTTON_TEST: "Teszt" + BUTTON_WHITE_LIST: "Fehér lista" + BUTTON_SIEVE_CONFIGURATION: "SIEVE beállítás" + BUTTON_BACK_TO_IMAP: "Vissza az IMAP beállításokhoz" + BUTTON_BACK: "Vissza" + BUTTON_CLOSE: "Bezár" + BUTTON_ADD: "Hozzáad" + BUTTON_UPDATE: "Frissítés" + NEW_DOMAIN_DESC: "Ez a domain konfiguráció lehetővé teszi
a %NAME% email címek használatát." + WHITE_LIST_ALERT: | + Hozzáféréshez engedélyezett domainek listája. + Elválasztáshoz használd a szóközt. + POPUPS_PLUGIN: + TITLE_PLUGIN: "Beépülő" + DESC_NOTHING_TO_CONFIGURE: "Nincs mit beállítani" + BUTTON_CLOSE: "Bezár" + BUTTON_SAVE: "Mentés" + TOOLTIP_ABOUT_TITLE: "Névjegy" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "Biztos, hogy be akarod zárni ezt az ablakot?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Válaszd ki a nyelvet" + HINTS: + BETA: "béta" + UNSTABLE: "instabil" + WARNING: "Figyelmeztetés!" + NOT_SUPPORTED: "nem támogatott" + REQUIRES_PHP_54: "PHP 5.4 vagy újabb szükséges" + ERRORS: + DOMAIN_ALREADY_EXISTS: "A domain már létezik" + UNKNOWN_ERROR: "Ismeretlen hiba" + NOTIFICATIONS: + INVALID_TOKEN: "Érvénytelen token" + AUTH_ERROR: "Sikertelen hitelesítés" + ACCESS_ERROR: "Hozzáférési hiba" + CONNECTION_ERROR: "Nem lehet csatlakozni a szerverhez" + CAPTCHA_ERROR: "Helytelen CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Ez a közösségi azonosító még nincs összekapcsolva egy email fiókkal sem. Lépj + be az email fiókba és a beállításoknál engedélyezd ezt a funkciót. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Ez a közösségi azonosító még nincs összekapcsolva egy email fiókkal sem. Lépj + be az email fiókba és a beállításoknál engedélyezd ezt a funkciót. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Ez a közösségi azonosító még nincs összekapcsolva egy email fiókkal sem. Lépj + be az email fiókba és a beállításoknál engedélyezd ezt a funkciót. + DOMAIN_NOT_ALLOWED: "A domain nem engedélyezett" + ACCOUNT_NOT_ALLOWED: "A fiók nem engedélyezett" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Kétlépcsős hitelesítés szükséges" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Kétlépcsős hitelesítés hiba" + COULD_NOT_SAVE_NEW_PASSWORD: "Nem lehet menteni az új jelszót" + CURRENT_PASSWORD_INCORRECT: "A jelenlegi jelszó érvénytelen" + NEW_PASSWORD_SHORT: "A jelszó túl rövid" + NEW_PASSWORD_WEAK: "A jelszó túl könnyű" + NEW_PASSWORD_FORBIDDENT: "A jelszó tiltott karaktereket tartalmaz" + CONTACTS_SYNC_ERROR: "Hiba lépett fel a névjegyek szinkronizálása közben" + CANT_GET_MESSAGE_LIST: "Nem tudom letölteni az üzenetlistát" + CANT_GET_MESSAGE: "Nem tudom letölteni az üzenetet" + CANT_DELETE_MESSAGE: "Nem lehet törölni az üzenetet" + CANT_MOVE_MESSAGE: "Nem lehet áthelyezni az üzenetet" + CANT_SAVE_MESSAGE: "Nem lehet menteni az üzenetet" + CANT_SEND_MESSAGE: "Nem lehet elküldeni az üzenetet" + INVALID_RECIPIENTS: "Érvénytelent címzettek" + CANT_SAVE_FILTERS: "Nem lehet menteni a szűrőket" + CANT_GET_FILTERS: "Nem lehet letölteni a szűrőket" + FILTERS_ARE_NOT_CORRECT: "A szűrők nem megfelelőek" + CANT_CREATE_FOLDER: "Nem lehet létrehozni a mappát" + CANT_RENAME_FOLDER: "Nem lehet átnevezni a mappát" + CANT_DELETE_FOLDER: "Nem lehet törölni a mappát" + CANT_DELETE_NON_EMPTY_FOLDER: "Nem üres mappát nem lehet törölni" + CANT_SUBSCRIBE_FOLDER: "Nem lehet feliratkozni mappára" + CANT_UNSUBSCRIBE_FOLDER: "Nem lehet leiratkozni mappáról" + CANT_SAVE_SETTINGS: "Nem lehet menteni a beállításokat" + CANT_SAVE_PLUGIN_SETTINGS: "Nem lehet menteni a beállításokat" + DOMAIN_ALREADY_EXISTS: "A domain már létezik" + CANT_INSTALL_PACKAGE: "Nem sikerült telepíteni a csomagot" + CANT_DELETE_PACKAGE: "Nem sikerült eltávolítani a csomagot" + INVALID_PLUGIN_PACKAGE: "Érvénytelen beépülő csomag" + UNSUPPORTED_PLUGIN_PACKAGE: "Nem támogatott beépülő csomag" + LICENSING_SERVER_IS_UNAVAILABLE: "A előfizetési szerver nem érhető el" + LICENSING_DOMAIN_EXPIRED: "A domain előfizetése lejárt." + LICENSING_DOMAIN_BANNED: "A domain előfizetése letiltva." + DEMO_SEND_MESSAGE_ERROR: "Biztonsági okokból, ebből a demó fiókból nem lehet külső email címekre üzenetet küldeni." + DEMO_ACCOUNT_ERROR: "Biztonsági okokból, ebből a fiókból nem lehet elvégezni ezt a műveletet!" + ACCOUNT_ALREADY_EXISTS: "A fiók már létezik" + ACCOUNT_DOES_NOT_EXIST: "A fiók nem létezik" + MAIL_SERVER_ERROR: "Hiba történt a levelező szerverhez történő hozzáférés közben" + INVALID_INPUT_ARGUMENT: "Érvénytelen input argumentum" + UNKNOWN_ERROR: "Ismeretlen hiba" + STATIC: + BACK_LINK: "Újratöltés" + DOMAIN_LIST_DESC: "A webmailhez hozzáférhető domainek listája." + PHP_EXSTENSIONS_ERROR_DESC: "Szükséges PHP kiterjesztés nem érhető el a PHP konfigurációdban!" + PHP_VERSION_ERROR_DESC: "A PHP verziód (%VERSION%) kisebb mint a minimálisan szükséges 5.3.0!" + NO_SCRIPT_TITLE: "Az alkalmazáshoz JavaScript szükséges." + NO_SCRIPT_DESC: | + A JavaScript támogatás nem érhető el a böngésződben. + Kérlek engedélyezd böngésződben a JavaScript támogatást, majd próbáld újra. + NO_COOKIE_TITLE: "Az alkalmazáshoz Cookie támogatásra van szükség." + NO_COOKIE_DESC: | + A Cookie támogatás nem érhető el a böngésződben. + Kérlek engedélyezd böngésződben a Cookie támogatást, majd próbáld újra. + BAD_BROWSER_TITLE: "A böngésződ elavult." + BAD_BROWSER_DESC: | + Az alkalmazás összes funkciójának használatához + tölts le és telepítsd az alábbi böngészők egyikét: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/it_IT.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/it_IT.yml new file mode 100755 index 00000000..e5b381f0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/it_IT.yml @@ -0,0 +1,326 @@ +it_IT: + LOGIN: + LABEL_LOGIN: "Nome utente" + LABEL_PASSWORD: "Password" + BUTTON_LOGIN: "Accedi all'amministrazione" + TOP_PANEL: + LABEL_PREMIUM: "Premium" + LABEL_ADMIN_PANEL: "Amministrazione" + TABS_LABELS: + LABEL_GENERAL_NAME: "Generali" + LABEL_LOGIN_NAME: "Accesso" + LABEL_BRANDING_NAME: "Personalizzazione" + LABEL_CONTACTS_NAME: "Contatti" + LABEL_DOMAINS_NAME: "Domini" + LABEL_SECURITY_NAME: "Sicurezza" + LABEL_INTEGRATION_NAME: "Integrazioni" + LABEL_PLUGINS_NAME: "Plugin" + LABEL_PACKAGES_NAME: "Pacchetti" + LABEL_LICENSING_NAME: "Licenze" + LABEL_ABOUT_NAME: "Informazioni" + TAB_GENERAL: + LEGEND_INTERFACE: "Interfaccia" + LABEL_LANGUAGE: "Lingua" + LABEL_LANGUAGE_ADMIN: "Lingua (amministrazione)" + LABEL_THEME: "Tema" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Permetti di cambiare lingua all'accesso" + LABEL_ALLOW_THEMES_ON_SETTINGS: "Permetti di cambiare tema dalle impostazioni" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Permetti di scegliere lo sfondo dalle impostazioni" + LABEL_NEW_FOLDER_MOVE: "Nuovo bottone \"Sposta in\"" + LABEL_SHOW_THUMBNAILS: "Visualizza anteprime degli allegati" + LABEL_ALLOW_GRAVATAR: "Abilita Gravatar" + LEGEND_MAIN: "Principale" + LABEL_ATTACHMENT_SIZE_LIMIT: "Limite di grandezza degli allegati" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Permetti di possedere più account" + LABEL_ALLOW_IDENTITIES: "Permetti di registrare identità multiple" + LABEL_ALLOW_TEMPLATES: "Permetti di creare template" + ALERT_WARNING: "Attenzione!" + HTML_ALERT_WEAK_PASSWORD: | + Stai usando la password di amministrazione predefinita. +
+ Per ragioni di sicurezza, + cambiala + con una nuova password immediatamente. + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "Schermata di accesso" + LABEL_DEFAULT_DOMAIN: "Dominio predefinito" + LABEL_DETERMINE_USER_DOMAIN: "Prova a determinare il dominio dell'utente" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Permetti di cambiare lingua all'accesso" + LABEL_DETERMINE_USER_LANGUAGE: "Prova a determinare la lingua dell'utente" + TAB_BRANDING: + LEGEND_BRANDING: "Personalizzazione" + LABEL_PAGE_TITLE: "Titolo della pagina" + LABEL_LOADING_DESCRIPTION: "Messaggio di caricamento" + LABEL_FAVICON_URL: "Favicon" + LEGEND_LOGIN: "Pagina di accesso" + LABEL_LOGIN_LOGO: "Logo" + LABEL_LOGIN_DESCRIPTION: "Descrizione" + LABEL_LOGIN_BACKGROUND: "Sfondo" + LABEL_LOGIN_CUSTOM_CSS: "CSS personalizzato" + LABEL_LOGIN_SHOW_POWERED_LINK: "Visualizza il link \"Powered by RainLoop\"" + LEGEND_USER: "Vista utente" + LABEL_USER_LOGO: "Logo" + LABEL_USER_LOGO_TITLE: "Titolo del logo" + LABEL_USER_LOGO_MESSAGE: "Logo (vista del messaggio)" + LABEL_USER_CUSTOM_CSS: "CSS personalizzato" + LEGEND_WELCOME_PAGE: "Pagina di benvenuto" + LABEL_WELCOME_PAGE_TITLE: "Titolo" + LABEL_WELCOME_PAGE_URL: "Indirizzo" + LABEL_WELCOME_PAGE_DISPLAY: "Visualizza" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "Mai" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Solo una volta" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Sempre" + HTML_ALERT_PREMIUM: "Questa funzionalità è disponibile solo per coloro che hanno acquistato una licenza Premium.\n" + TAB_CONTACTS: + LEGEND_CONTACTS: "Contatti" + LEGEND_STORAGE: "Metodo di salvataggio (PDO)" + LABEL_ENABLE_CONTACTS: "Abilita contatti" + LABEL_ALLOW_SYNC: "Abilita la sincronizzazione dei contatti (con un server CardDAV esterno)" + LABEL_STORAGE_TYPE: "Tipo" + LABEL_STORAGE_DSN: "DSN" + LABEL_STORAGE_USER: "Nome utente" + LABEL_STORAGE_PASSWORD: "Password" + BUTTON_TEST: "Verifica dati" + ALERT_NOTICE: "Attenzione!" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Non usare questo tipo di database con un alto numero di utenti attivi." + HTML_ALERT_DOES_NOT_SUPPORTED: | + Il tuo server non supporta il salvataggio dei contatti. +
+ Devi abilitare l'estensione PDO (SQLite / MySQL / PostgreSQL) sul tuo server. + TAB_DOMAINS: + LEGEND_DOMAINS: "Domini" + BUTTON_ADD_DOMAIN: "Aggiungi dominio" + BUTTON_ADD_ALIAS: "Aggiungi alias" + DELETE_ARE_YOU_SURE: "Ne sei sicuro?" + HTML_DOMAINS_HELPER: | + Lista di domini a cui la webmail è abilitata ad accedere. +
+ Clicca su un nome per configurare quel dominio. + TAB_SECURITY: + LEGEND_SECURITY: "Security" + LABEL_ALLOW_TWO_STEP: "Abilita l'autenticazione a due fattori" + LABEL_FORCE_TWO_STEP: "Forza l'autenticazione a due fattori" + LABEL_USE_IMAGE_PROXY: "Usa un proxy locale per le immagini" + LABEL_ALLOW_OPEN_PGP: "Abilita OpenPGP" + LABEL_SHOW_PHP_INFO: "Visualizza informazioni su PHP" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Dati di accesso al pannello di controllo" + LABEL_CURRENT_PASSWORD: "Password corrente" + LABEL_NEW_LOGIN: "Nuovo nome utente" + LABEL_NEW_PASSWORD: "Nuova password" + LABEL_REPEAT_PASSWORD: "Ripeti nuova password" + BUTTON_UPDATE_PASSWORD: "Aggiorna password" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "Richiedi verifica dei certificati SSL (IMAP/SMTP)" + LABEL_ALLOW_SELF_SIGNED: "Abilita certificati autofirmati" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "Abilita integrazione con Google" + LABEL_GOOGLE_AUTH: "Autenticazione" + LABEL_GOOGLE_DRIVE: "Integrazione con Google Drive (finestra di scrittura)" + LABEL_GOOGLE_PREVIEW: "Integrazione con Google Docs (anteprima per i file di Microsoft Word, Excel e PowerPoint)" + LABEL_GOOGLE_CLIENT_ID: "Client ID" + LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" + LABEL_GOOGLE_API_KEY: "API Key" + HINT_GOOGLE_API_KEY: "Richiesta per la selezione dei file di Google Drive" + LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "Abilita l'integrazione con Facebook (autenticazione)" + LABEL_FACEBOOK_APP_ID: "App ID" + LABEL_FACEBOOK_APP_SECRET: "App Secret" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "Abilita l'integrazione con Twitter (autenticazione)" + LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" + LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" + LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "Abilita l'integrazione con Dropbox" + LABEL_DROPBOX_API_KEY: "API Key" + TOP_ALERT: "Informazioni dettagliate circa l'integrazione con i social network è disponibile su" + TAB_PLUGINS: + LEGEND_PLUGINS: "Plugin" + LABEL_ENABLE_PLUGINS: "Abilita plugin" + ALERT_NO_PLUGINS: "Nessun plugin è stato installato." + LINK_INSTALL_NEW: "Clicca qui per installarne di nuovi!" + HINT_CLICK_NAME: "Clicca sul nome di un plugin per configurarlo." + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "Disponibili per l'aggiornamento" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Disponibili per l'installazione" + LEGEND_INSTALLED_PACKAGES: "Pacchetti installati" + ALERT_CANNOT_ACCESS_REPOSITORY: "Impossibile accedere al repository in questo momento." + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "Il tuo dominio" + LABEL_VERSION: "Licenza" + LABEL_CHECKING: "Controllo in corso..." + TYPE_BASIC_HINT: "Questo dominio non possiede una licenza commerciale (con funzionalità aggiuntive)." + TYPE_BASIC_HINT_2: "Questo dominio non può possedere una licenza." + HTML_ALERT_TOP_1: "RainLoop Webmail è rilasciato sotto la licenza" + HTML_ALERT_TOP_2: "Sei libero di usarla per i tuoi progetti personali." + HTML_ALERT_TOP_3: | + L'uso commerciale (con funzionalità aggiuntive) di RainLoop Webmail richiede di ottenere una + licenza. + TYPE_PREMIUM_LIFETIME: "A vita" + LABEL_SUB_EXPIRES: "La licenza scade il" + BUTTON_ACTIVATE: "Attiva una chiave di licenza per questo dominio" + BUTTON_PURCHASE: "Compra una licenza" + BUTTON_TRIAL: "Versione di prova" + TAB_ABOUT: + LEGEND_ABOUT: "Informazioni" + LABEL_TAG_HINT: "Semplice, moderno e veloce client email online" + LABEL_ALL_RIGHTS_RESERVED: "Tutti i diritti riservati." + HINT_READ_CHANGE_LOG: "Leggere il changelog prima di effettuare l'aggiornamento." + HINT_IS_UP_TO_DATE: "RainLoop è aggiornato." + HTML_NEW_VERSION: "La nuova versione %VERSION% è disponibile." + LABEL_UPDATING: "Aggiornamento in corso..." + LABEL_CHECKING: "Controllo della presenza di aggiornamenti..." + BUTTON_UPDATE: "Aggiorna" + BUTTON_DOWNLOAD: "Scarica" + BUTTON_CHANGELOG: "Changelog" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "Attivare chiave di licenza?" + TITLE_ACTIVATION: "Attivazione..." + LABEL_DOMAIN: "Dominio" + LABEL_SUB_KEY: "Chiave di licenza" + BUTTON_ACTIVATE: "Attiva" + LABEL_ACTIVATED: "Attivata" + ERROR_INVALID_SUBS_KEY: "Chiave di licenza non valida" + SUBS_KEY_ACTIVATED: "Chiave di licenza attivata correttamente" + HTML_DESC: | + Dopo l'attivazione, la licenza Premium per %DOMAIN% sarà estesa. +
+ Una chiave di licenza può essere attivata su un solo dominio. +

+ Una volta iniziato, il processo di attivazione non potrà essere bloccato od annullato. + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "Aggiungi alias" + LABEL_ALIAS: "Alias" + LABEL_DOMAIN: "Dominio" + BUTTON_CLOSE: "Chiudi" + BUTTON_ADD: "Aggiungi" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "Aggiungi dominio" + TITLE_ADD_DOMAIN_WITH_NAME: "Aggiungi il dominio \"%NAME%\"" + TITLE_EDIT_DOMAIN: "Modifica il dominio \"%NAME%\"" + LABEL_NAME: "Nome dominio" + NAME_HELPER: "asterischi supportati" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "Server" + LABEL_PORT: "porta" + LABEL_SECURE: "Sicuro" + LABEL_WHITE_LIST: "Whitelist" + SECURE_OPTION_NONE: "Nessuna" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "Abilita script sieve" + LABEL_ALLOW_USER_SCRIPT: "Abilita script personalizzati" + LABEL_USE_SHORT_LOGIN: "Utilizza login corto" + LABEL_USE_AUTH: "Utilizza autenticazione" + LABEL_USE_PHP_MAIL: "Usa la funzione mail() di PHP" + BUTTON_TEST: "Verifica" + BUTTON_WHITE_LIST: "Whitelist" + BUTTON_SIEVE_CONFIGURATION: "Configurazione di Sieve" + BUTTON_BACK_TO_IMAP: "Torna alle impostazioni IMAP" + BUTTON_BACK: "Indietro" + BUTTON_CLOSE: "Chiudi" + BUTTON_ADD: "Aggiungi" + BUTTON_UPDATE: "Aggiorna" + NEW_DOMAIN_DESC: "La configurazione di questo dominio ti permette di lavorare
con %NAME% indirizzi email." + WHITE_LIST_ALERT: | + Lista di domini a cui gli utenti sono autorizzati ad accedere. + Utilizzare uno spazio come separatore. + POPUPS_PLUGIN: + TITLE_PLUGIN: "Plugin" + DESC_NOTHING_TO_CONFIGURE: "Niente da configurare" + BUTTON_CLOSE: "Chiudi" + BUTTON_SAVE: "Salva" + TOOLTIP_ABOUT_TITLE: "Informazioni" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "Sei sicuro di voler chiudere questa finestra?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Scegli la tua lingua" + HINTS: + BETA: "beta" + UNSTABLE: "instabile" + WARNING: "Attenzione!" + NOT_SUPPORTED: "non supportato" + REQUIRES_PHP_54: "richiede PHP 5.4 o maggiori" + ERRORS: + DOMAIN_ALREADY_EXISTS: "Il dominio esiste già" + UNKNOWN_ERROR: "Errore sconosciuto" + NOTIFICATIONS: + INVALID_TOKEN: "Token invalido" + AUTH_ERROR: "Autenticazione fallita" + ACCESS_ERROR: "Errore di accesso" + CONNECTION_ERROR: "Impossibile connettersi al server" + CAPTCHA_ERROR: "CAPTCHA non corretto." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Questo account social non è assegnato ancora a nessun indirizzo email. Accedi + utilizzando le credenziali dell'indirizzo e abilita la funzionalità nelle + impostazioni. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Questo account social non è assegnato ancora a nessun indirizzo email. Accedi + utilizzando le credenziali dell'indirizzo e abilita la funzionalità nelle + impostazioni. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Questo account social non è assegnato ancora a nessun indirizzo email. Accedi + utilizzando le credenziali dell'indirizzo e abilita la funzionalità nelle + impostazioni. + DOMAIN_NOT_ALLOWED: "Dominio non autorizzato" + ACCOUNT_NOT_ALLOWED: "Account non autorizzato" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Autenticazione a due fattori richiesta" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Errore durante l'autenticazione a due fattori" + COULD_NOT_SAVE_NEW_PASSWORD: "Impossibile salvare la nuova password" + CURRENT_PASSWORD_INCORRECT: "Password corrente incorreta" + NEW_PASSWORD_SHORT: "Password troppo corta" + NEW_PASSWORD_WEAK: "Password troppo facile" + NEW_PASSWORD_FORBIDDENT: "Password vietata" + CONTACTS_SYNC_ERROR: "Errore durante la sincronizzazione dei contatti" + CANT_GET_MESSAGE_LIST: "Errore durante il caricamento della lista dei messaggi" + CANT_GET_MESSAGE: "Errore durante il caricamento del messaggio" + CANT_DELETE_MESSAGE: "Impossibile cancellare il messaggio" + CANT_MOVE_MESSAGE: "Impossibile spostare il messaggio" + CANT_SAVE_MESSAGE: "Impossibile salvare il messaggio" + CANT_SEND_MESSAGE: "Impossibile inviare il messaggio" + INVALID_RECIPIENTS: "Destinatari invalidi" + CANT_SAVE_FILTERS: "Impossibile salvare i filtri" + CANT_GET_FILTERS: "Impossibile caricare i filtri" + FILTERS_ARE_NOT_CORRECT: "I filtri non sono corretti" + CANT_CREATE_FOLDER: "Impossibile creare la cartella" + CANT_RENAME_FOLDER: "Impossibile rinominare la cartella" + CANT_DELETE_FOLDER: "Impossibile cancellare la cartella" + CANT_DELETE_NON_EMPTY_FOLDER: "Non è possibile cancellare cartelle piene" + CANT_SUBSCRIBE_FOLDER: "Impossibile sottoscriversi alla cartella" + CANT_UNSUBSCRIBE_FOLDER: "Impossibile rimuovere la sottoscrizione dalla cartella" + CANT_SAVE_SETTINGS: "Impossibile salvare le impostazioni" + CANT_SAVE_PLUGIN_SETTINGS: "Impossibile salvare le impostazioni" + DOMAIN_ALREADY_EXISTS: "Il dominio già esiste" + CANT_INSTALL_PACKAGE: "Impossibile installare il pacchetto" + CANT_DELETE_PACKAGE: "Impossibile rimuovere il pacchetto" + INVALID_PLUGIN_PACKAGE: "Pacchetto non valido" + UNSUPPORTED_PLUGIN_PACKAGE: "Pacchetto non supportato" + LICENSING_SERVER_IS_UNAVAILABLE: "Il server dlele licenze non è dispobibile" + LICENSING_DOMAIN_EXPIRED: "La licenza per questo dominio è scaduta" + LICENSING_DOMAIN_BANNED: "La licenza per questo dominio è stata revocata" + DEMO_SEND_MESSAGE_ERROR: "Per ragioni di sicurezza, questo account non è abilitato ad inviare email all'esterno." + DEMO_ACCOUNT_ERROR: "Per ragioni di sicurezza, questa funzionalità è bloccata." + ACCOUNT_ALREADY_EXISTS: "Questo account esiste già" + ACCOUNT_DOES_NOT_EXIST: "L'account non esiste" + MAIL_SERVER_ERROR: "Errore durante la connessione con il server mail" + INVALID_INPUT_ARGUMENT: "Argomento non valido" + UNKNOWN_ERROR: "Errore sconosciuto" + STATIC: + BACK_LINK: "Ricarica" + DOMAIN_LIST_DESC: "Lista di domini a cui la webmail è abilitata ad accedere" + PHP_EXSTENSIONS_ERROR_DESC: "Un estensione di PHP richiesta non è disponibile." + PHP_VERSION_ERROR_DESC: "La versione di PHP corrente (%VERSION%) è più vecchia di quella minima supportata (PHP 5.3.0)" + NO_SCRIPT_TITLE: "Questa applicazione richiede JacaScript" + NO_SCRIPT_DESC: | + Il supporto a JavaScript è disabilitato nel browser. + Abilita JavaScript e ricarica la pagina. + NO_COOKIE_TITLE: "Questa applicazione richiede i cookie" + NO_COOKIE_DESC: | + Il supporto ai cookie è disabilitato nel browser. + Abilita i cookie e ricarica la pagina. + BAD_BROWSER_TITLE: "Il tuo browser è troppo vecchio" + BAD_BROWSER_DESC: | + Per usare tutte le funzionalità dell'applicazione, + scarica ed installa uno dei seguenti browser: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/ja_JP.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/ja_JP.yml new file mode 100755 index 00000000..640e9285 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/ja_JP.yml @@ -0,0 +1,321 @@ +ja_JP: + LOGIN: + LABEL_LOGIN: "ログイン" + LABEL_PASSWORD: "パスワード" + BUTTON_LOGIN: "管理画面へログイン" + TOP_PANEL: + LABEL_PREMIUM: "プレミアム" + LABEL_ADMIN_PANEL: "管理画面" + TABS_LABELS: + LABEL_GENERAL_NAME: "全般" + LABEL_LOGIN_NAME: "ログイン" + LABEL_BRANDING_NAME: "ブランド化" + LABEL_CONTACTS_NAME: "連絡先" + LABEL_DOMAINS_NAME: "ドメイン" + LABEL_SECURITY_NAME: "セキュリティ" + LABEL_INTEGRATION_NAME: "連携" + LABEL_PLUGINS_NAME: "プラグイン" + LABEL_PACKAGES_NAME: "パッケージ" + LABEL_LICENSING_NAME: "ライセンス" + LABEL_ABOUT_NAME: "RainLoop について" + TAB_GENERAL: + LEGEND_INTERFACE: "インターフェース" + LABEL_LANGUAGE: "言語" + LABEL_LANGUAGE_ADMIN: "言語 (管理画面)" + LABEL_THEME: "テーマ" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "設定画面で言語選択を使用する" + LABEL_ALLOW_THEMES_ON_SETTINGS: "設定画面でテーマ選択を使用する" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "設定画面で背景選択を使用する" + LABEL_NEW_FOLDER_MOVE: "新しい \"フォルダへ移動\" ボタン" + LABEL_SHOW_THUMBNAILS: "サムネイルを表示 (添付ファイル)" + LABEL_ALLOW_GRAVATAR: "Gravatar を使用する" + LEGEND_MAIN: "メイン" + LABEL_ATTACHMENT_SIZE_LIMIT: "添付サイズ制限" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "追加のアカウントを使用する" + LABEL_ALLOW_IDENTITIES: "複数の表示名を使用する" + LABEL_ALLOW_TEMPLATES: "テンプレートを許可する" + ALERT_WARNING: "警告!" + HTML_ALERT_WEAK_PASSWORD: | + デフォルトの管理者パスワードを使用しています。 +
+ セキュリティ上の理由から、いますぐパスワードを + 変更 + してください。 + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "ログイン画面" + LABEL_DEFAULT_DOMAIN: "デフォルトドメイン" + LABEL_DETERMINE_USER_DOMAIN: "ユーザードメインを自動で選ぶ" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "ログイン画面で言語選択を使用する" + LABEL_DETERMINE_USER_LANGUAGE: "ユーザー言語を自動で選ぶ" + TAB_BRANDING: + LEGEND_BRANDING: "ブランド化" + LABEL_PAGE_TITLE: "ページタイトル" + LABEL_LOADING_DESCRIPTION: "説明を読み込み中" + LABEL_FAVICON_URL: "Favicon" + LEGEND_LOGIN: "ログイン" + LABEL_LOGIN_LOGO: "ロゴ" + LABEL_LOGIN_DESCRIPTION: "説明" + LABEL_LOGIN_BACKGROUND: "背景" + LABEL_LOGIN_CUSTOM_CSS: "カスタム CSS" + LABEL_LOGIN_SHOW_POWERED_LINK: "\"Powered by RainLoop\" リンクを表示する" + LEGEND_USER: "ユーザー" + LABEL_USER_LOGO: "ロゴ" + LABEL_USER_LOGO_TITLE: "ページタイトル" + LABEL_USER_LOGO_MESSAGE: "ロゴ(メッセージ画面)" + LABEL_USER_CUSTOM_CSS: "カスタム CSS" + LEGEND_WELCOME_PAGE: "ようこそページ" + LABEL_WELCOME_PAGE_TITLE: "タイトル" + LABEL_WELCOME_PAGE_URL: "URL" + LABEL_WELCOME_PAGE_DISPLAY: "表示" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "なし" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "1回だけ" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "いつも" + HTML_ALERT_PREMIUM: "この機能にはプレミアムが必要です" + TAB_CONTACTS: + LEGEND_CONTACTS: "連絡先" + LEGEND_STORAGE: "ストレージ (PDO)" + LABEL_ENABLE_CONTACTS: "連絡先を有効化" + LABEL_ALLOW_SYNC: " (外部の CardDAV サーバーと) 連絡先の同期を使用する" + LABEL_STORAGE_TYPE: "タイプ" + LABEL_STORAGE_DSN: "Dsn" + LABEL_STORAGE_USER: "ユーザー" + LABEL_STORAGE_PASSWORD: "パスワード" + BUTTON_TEST: "テスト" + ALERT_NOTICE: "注意!" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "アクティブユーザーの数が多いとき、このデータベース・タイプを使用しないでください。" + HTML_ALERT_DOES_NOT_SUPPORTED: | + このシステムでは連絡先はサポートされていません。 +
+ サーバーへPDO (SQLite / MySQL / PostgreSQL) + 拡張モジュールのインストールが必要です。 + TAB_DOMAINS: + LEGEND_DOMAINS: "ドメイン" + BUTTON_ADD_DOMAIN: "ドメインを追加" + BUTTON_ADD_ALIAS: "エイリアスを追加" + DELETE_ARE_YOU_SURE: "よろしいですか?" + HTML_DOMAINS_HELPER: | + ドメインの一覧は、Web メールのアクセスを許可されています。 +
+ ドメインを設定するには、名前をクリックしてください。 + TAB_SECURITY: + LEGEND_SECURITY: "セキュリティ" + LABEL_ALLOW_TWO_STEP: "2段階認証を使用する" + LABEL_FORCE_TWO_STEP: "必ず 2段階認証 を使う" + LABEL_USE_IMAGE_PROXY: "外部イメージにローカル Proxy を使う" + LABEL_ALLOW_OPEN_PGP: "OpenPGP を使う" + LABEL_SHOW_PHP_INFO: "PHP 情報を表示" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "管理画面アクセス情報" + LABEL_CURRENT_PASSWORD: "現在のパスワード" + LABEL_NEW_LOGIN: "新しいログイン名" + LABEL_NEW_PASSWORD: "新しいパスワード" + LABEL_REPEAT_PASSWORD: "再入力" + BUTTON_UPDATE_PASSWORD: "パスワード更新" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: " (IMAP/SMTP) のSSL 証明書の検証を有効にする" + LABEL_ALLOW_SELF_SIGNED: "自己署名証明書を使う" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "Google 連携を有効にする" + LABEL_GOOGLE_AUTH: "Authorization" + LABEL_GOOGLE_DRIVE: "Google ドライブ連携 (編集画面)" + LABEL_GOOGLE_PREVIEW: "Google ビューア連携 (Microsoft Word/Excel/PowerPoint ファイルのプレビュー)" + LABEL_GOOGLE_CLIENT_ID: "Client ID" + LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" + LABEL_GOOGLE_API_KEY: "Api Key" + HINT_GOOGLE_API_KEY: "Googleドライブのファイルピッカーの場合は必須" + LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "Facebook 連携を有効にする (Authorization)" + LABEL_FACEBOOK_APP_ID: "App ID" + LABEL_FACEBOOK_APP_SECRET: "App Secret" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "Twitter 連携を有効にする (Authorization)" + LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" + LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" + LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "Dropbox 連携を有効にする" + LABEL_DROPBOX_API_KEY: "Api Key" + TOP_ALERT: "SNS 連携の詳細は情報は、" + TAB_PLUGINS: + LEGEND_PLUGINS: "プラグイン" + LABEL_ENABLE_PLUGINS: "プラグイン有効" + ALERT_NO_PLUGINS: "プラグインは、インストールされていません" + LINK_INSTALL_NEW: "ここをクリックしてインストール" + HINT_CLICK_NAME: "プラグインを設定するには名前をクリックします" + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "更新があります" + LEGEND_AVAILABLE_FOR_INSTALLATION: "インストール可能なパッケージ" + LEGEND_INSTALLED_PACKAGES: "インストールされたパッケージ" + ALERT_CANNOT_ACCESS_REPOSITORY: "現時点でリポジトリにアクセスすることはできません。" + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "ドメイン" + LABEL_VERSION: "バージョン" + LABEL_CHECKING: "チェック中" + TYPE_BASIC_HINT: "このドメインは、 (追加の機能を備えた)商業的使用のためにライセンスされていません。" + TYPE_BASIC_HINT_2: "このドメインはライセンスされていません" + HTML_ALERT_TOP_1: "RainLoop Webmail is licensed under" + HTML_ALERT_TOP_2: "You are free to use it for your personal projects." + HTML_ALERT_TOP_3: | + RainLoop Webmailの(付加的な機能を備えた)商業的使用は、 + サブスクリプションを取得する必要があります。 + TYPE_PREMIUM_LIFETIME: "ライフタイム" + LABEL_SUB_EXPIRES: "サブスクリプションの有効期限切れ" + BUTTON_ACTIVATE: "このドメインサブスクリプションキーをアクティベートする" + BUTTON_PURCHASE: "購入" + BUTTON_TRIAL: "試用" + TAB_ABOUT: + LEGEND_ABOUT: "RainLoop について" + LABEL_TAG_HINT: "シンプル・モダン・高速なウェブベースのメールクライアント" + LABEL_ALL_RIGHTS_RESERVED: "All Rights Reserved." + HINT_READ_CHANGE_LOG: "更新する前に変更ログをお読みください。" + HINT_IS_UP_TO_DATE: "RainLoopは最新のものです。" + HTML_NEW_VERSION: "新しいバージョン %VERSION% があります" + LABEL_UPDATING: "更新中" + LABEL_CHECKING: "アップデートの確認" + BUTTON_UPDATE: "更新" + BUTTON_DOWNLOAD: "ダウンロード" + BUTTON_CHANGELOG: "変更履歴" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "サブスクリプションキーをアクティベートしますか?" + TITLE_ACTIVATION: "アクティベーション ..." + LABEL_DOMAIN: "ドメイン" + LABEL_SUB_KEY: "サブスクリプションキー" + BUTTON_ACTIVATE: "アクティベート" + LABEL_ACTIVATED: "アクティベート済み" + ERROR_INVALID_SUBS_KEY: "無効なサブスクリプションキー" + SUBS_KEY_ACTIVATED: "サブスクリプションキーのアクティベートに成功しました" + HTML_DESC: | + %DOMAIN% のプレミアムサブスクリプションをアクティベートした後、拡張されます。 +
+ そのサブスクリプションキーは、1つのドメインのみアクティベートできます。 +

+ 一度アクティベーションの処理を開始すると、中止またはキャンセルすることはできません。 + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "エイリアスを追加" + LABEL_ALIAS: "エイリアス" + LABEL_DOMAIN: "ドメイン" + BUTTON_CLOSE: "閉じる" + BUTTON_ADD: "追加" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "ドメインを追加" + TITLE_ADD_DOMAIN_WITH_NAME: "ドメイン \"%NAME%\" を追加" + TITLE_EDIT_DOMAIN: "ドメイン \"%NAME%\" を編集" + LABEL_NAME: "名前" + NAME_HELPER: "ワイルドカード利用可" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "サーバー" + LABEL_PORT: "ポート" + LABEL_SECURE: "セキュリティ" + LABEL_WHITE_LIST: "ホワイトリスト" + SECURE_OPTION_NONE: "なし" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "SIEVE スクリプトを使用する" + LABEL_ALLOW_USER_SCRIPT: "カスタムユーザースクリプトを使用する" + LABEL_USE_SHORT_LOGIN: "短いログイン名を使う" + LABEL_USE_AUTH: "認証を使用する" + LABEL_USE_PHP_MAIL: "PHP mail() 関数を使用する" + BUTTON_TEST: "接続テスト" + BUTTON_WHITE_LIST: "ホワイトリスト" + BUTTON_SIEVE_CONFIGURATION: "SIEVE 設定" + BUTTON_BACK_TO_IMAP: "IMAP 設定に戻る" + BUTTON_BACK: "戻る" + BUTTON_CLOSE: "閉じる" + BUTTON_ADD: "追加" + BUTTON_UPDATE: "更新" + NEW_DOMAIN_DESC: "このドメイン設定を使用すると、 %NAME% メールアドレスで動作するようになります。" + WHITE_LIST_ALERT: | + ドメインの一覧は、Web メールのアクセスを許可されています。 + 区切り文字としてスペースを使用してください。 + POPUPS_PLUGIN: + TITLE_PLUGIN: "プラグイン" + DESC_NOTHING_TO_CONFIGURE: "何も設定されていません" + BUTTON_CLOSE: "閉じる" + BUTTON_SAVE: "保存" + TOOLTIP_ABOUT_TITLE: "RainLoop について" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "このウィンドウを閉じてもよろしいですか?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "言語を選択してください" + HINTS: + BETA: "beta" + UNSTABLE: "unstable" + WARNING: "警告!" + NOT_SUPPORTED: "サポートされません" + REQUIRES_PHP_54: "PHP 5.4 以上が必要です" + ERRORS: + DOMAIN_ALREADY_EXISTS: "ドメインが既に存在しています" + UNKNOWN_ERROR: "不明なエラー" + NOTIFICATIONS: + INVALID_TOKEN: "無効なトークン" + AUTH_ERROR: "認証に失敗しました" + ACCESS_ERROR: "アクセスエラー" + CONNECTION_ERROR: "サーバーへ接続できません" + CAPTCHA_ERROR: "間違った CAPTCHA" + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + このSNSユーザーIDは、まだメールアカウント用に割り当てられていません。電子メールの資格情報を使用してログインし、アカウント設定でこの機能を有効にします。 + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + このSNSユーザーIDは、まだメールアカウント用に割り当てられていません。電子メールの資格情報を使用してログインし、アカウント設定でこの機能を有効にします。 + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + このSNSユーザーIDは、まだメールアカウント用に割り当てられていません。電子メールの資格情報を使用してログインし、アカウント設定でこの機能を有効にします。 + DOMAIN_NOT_ALLOWED: "ドメインは、許可されていません" + ACCOUNT_NOT_ALLOWED: "アカウントは、許可されていません" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2段階認証が必要です" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2段階認証エラー" + COULD_NOT_SAVE_NEW_PASSWORD: "新しいパスワードを保存できません。" + CURRENT_PASSWORD_INCORRECT: "現在のパスワードが間違っています" + NEW_PASSWORD_SHORT: "パスワードが短すぎます" + NEW_PASSWORD_WEAK: "パスワードが簡単すぎます" + NEW_PASSWORD_FORBIDDENT: "パスワードに、禁止された文字が含まれています" + CONTACTS_SYNC_ERROR: "連絡先 同期 エラー" + CANT_GET_MESSAGE_LIST: "メッセージ一覧が取得できません" + CANT_GET_MESSAGE: "メッセージが取得できません" + CANT_DELETE_MESSAGE: "メッセージが削除できません" + CANT_MOVE_MESSAGE: "メッセージが移動できません" + CANT_SAVE_MESSAGE: "メッセージが保存できません" + CANT_SEND_MESSAGE: "メッセージが送信できません" + INVALID_RECIPIENTS: "無効な受信者" + CANT_SAVE_FILTERS: "フィルターが保存できません" + CANT_GET_FILTERS: "フィルターを取得できません" + FILTERS_ARE_NOT_CORRECT: "フィルターが正しくありません" + CANT_CREATE_FOLDER: "フォルダーを作成できません" + CANT_RENAME_FOLDER: "フォルダの名前が変更できません" + CANT_DELETE_FOLDER: "フォルダを削除できません" + CANT_DELETE_NON_EMPTY_FOLDER: "空ではないディレクトリを削除できません" + CANT_SUBSCRIBE_FOLDER: "フォルダを購読できません" + CANT_UNSUBSCRIBE_FOLDER: "フォルダを購読解除できません" + CANT_SAVE_SETTINGS: "設定が保存できません" + CANT_SAVE_PLUGIN_SETTINGS: "設定が保存できません" + DOMAIN_ALREADY_EXISTS: "ドメインが既に存在しています" + CANT_INSTALL_PACKAGE: "パッケージのインストールに失敗しました" + CANT_DELETE_PACKAGE: "パッケージの削除に失敗しました" + INVALID_PLUGIN_PACKAGE: "無効なプラグインパッケージ" + UNSUPPORTED_PLUGIN_PACKAGE: "サポートされていないプラグインパッケージ" + LICENSING_SERVER_IS_UNAVAILABLE: "サブスクリプションサーバーが利用できません" + LICENSING_DOMAIN_EXPIRED: "このドメインのサブスクリプションの有効期限が切れました" + LICENSING_DOMAIN_BANNED: "このドメインのサブスクリプションが無効化されました" + DEMO_SEND_MESSAGE_ERROR: "セキュリティ上の理由から、アカウントは、外部の電子メールアドレスにメッセージを送信することを許可されていません!" + DEMO_ACCOUNT_ERROR: "セキュリティ上の理由から、アカウントには、このアクションが許可されていません!" + ACCOUNT_ALREADY_EXISTS: "アカウントがすでに存在します" + ACCOUNT_DOES_NOT_EXIST: "アカウントは存在しません" + MAIL_SERVER_ERROR: "メールサーバーへのアクセス中にエラーが発生しました" + INVALID_INPUT_ARGUMENT: "無効な入力引数" + UNKNOWN_ERROR: "不明なエラー" + STATIC: + BACK_LINK: "更新" + DOMAIN_LIST_DESC: "ドメインの一覧は、Web メールのアクセスを許可されています。" + PHP_EXSTENSIONS_ERROR_DESC: "必要な PHP 拡張モジュールが、有効になっていません。" + PHP_VERSION_ERROR_DESC: "PHP バージョン (%VERSION%) が、 最低バージョンの 5.3.0 よりも低いです!" + NO_SCRIPT_TITLE: "このアプリケーションでは JavaScript が必要です。" + NO_SCRIPT_DESC: | + ブラウザで JavaScript が、有効になっていません。 + JavaScript を有効にして、再度試してください。 + NO_COOKIE_TITLE: "このアプリケーションでは Cookie が必要です。" + NO_COOKIE_DESC: | + ブラウザで Cookie が、有効になっていません。 + Cookie を有効にして、再度試してください。 + BAD_BROWSER_TITLE: "お使いのブラウザが古いです。" + BAD_BROWSER_DESC: | + アプリケーションのすべての機能を使用するには、 + これらのブラウザの1つをダウンロードしてインストールします: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/lt_LT.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/lt_LT.yml new file mode 100755 index 00000000..7a7b2300 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/lt_LT.yml @@ -0,0 +1,323 @@ +lt_LT: + LOGIN: + LABEL_LOGIN: "Prisijungimo vardas" + LABEL_PASSWORD: "Slaptažodis" + BUTTON_LOGIN: "Prisijungti prie valdymo skydo" + TOP_PANEL: + LABEL_PREMIUM: "Premium" + LABEL_ADMIN_PANEL: "Administratoriaus valdymo skydas" + TABS_LABELS: + LABEL_GENERAL_NAME: "Pagrindiniai" + LABEL_LOGIN_NAME: "Prisijungimo vardas" + LABEL_BRANDING_NAME: "Įdaguoti" + LABEL_CONTACTS_NAME: "Kontaktai" + LABEL_DOMAINS_NAME: "Domenai" + LABEL_SECURITY_NAME: "Sauga" + LABEL_INTEGRATION_NAME: "Integracija" + LABEL_PLUGINS_NAME: "Įskiepiai" + LABEL_PACKAGES_NAME: "Paketai" + LABEL_LICENSING_NAME: "Licencijavimas" + LABEL_ABOUT_NAME: "Apie" + TAB_GENERAL: + LEGEND_INTERFACE: "Sąsaja" + LABEL_LANGUAGE: "Kalba" + LABEL_LANGUAGE_ADMIN: "Kalba (administravimo pulto)" + LABEL_THEME: "Tema" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Leisti kalbos keitimą nustatymuose" + LABEL_ALLOW_THEMES_ON_SETTINGS: "Leisti temos keitimą nustatymuose" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Leisti keisti foną nustatymuose" + LABEL_NEW_FOLDER_MOVE: "Naujas \"\"perkelti į katalogą\" mygtukas" + LABEL_SHOW_THUMBNAILS: "Rodyti miniatiūrą (prisegtuko)" + LABEL_ALLOW_GRAVATAR: "Leisti naudoti Gravatar'ą" + LEGEND_MAIN: "Pagrindinis" + LABEL_ATTACHMENT_SIZE_LIMIT: "Prisegtukų dydžio limitas" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Leisti papildomas paskyras" + LABEL_ALLOW_IDENTITIES: "Leisti daugiau tapatybių" + LABEL_ALLOW_TEMPLATES: "Leisti šablonus" + ALERT_WARNING: "Dėmesio!" + HTML_ALERT_WEAK_PASSWORD: |+ + Naudojate numatytąjį administratoriaus slaptažodį. +
+ Dėl Jūsų saugumo prašome + pakeiskite + slaptažodį kitu. + + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "Prisijungimo langas" + LABEL_DEFAULT_DOMAIN: "Numatytasis Domenas" + LABEL_DETERMINE_USER_DOMAIN: "Bandyti nuspėti vartotojo domeną" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Leisti kalbų keitimą prisijungimo lange" + LABEL_DETERMINE_USER_LANGUAGE: "bandyti nuspėti vartotojo kalbą" + TAB_BRANDING: + LEGEND_BRANDING: "Prekės ženklo derinimas" + LABEL_PAGE_TITLE: "Puslapio pavadinimas" + LABEL_LOADING_DESCRIPTION: "Krovimosi aprašas" + LABEL_FAVICON_URL: "Favicon" + LEGEND_LOGIN: "Prisijungimo vardas" + LABEL_LOGIN_LOGO: "Logotipas" + LABEL_LOGIN_DESCRIPTION: "Aprašymas" + LABEL_LOGIN_BACKGROUND: "Fonas" + LABEL_LOGIN_CUSTOM_CSS: "Pritaikytas CSS" + LABEL_LOGIN_SHOW_POWERED_LINK: "Rodyti \"Powered by RainLoop\" nuorodą" + LEGEND_USER: "Vartotojas" + LABEL_USER_LOGO: "Logotipas" + LABEL_USER_LOGO_TITLE: "Logotipo pavadinimas" + LABEL_USER_LOGO_MESSAGE: "Logotipas (Laiško peržiūroje)" + LABEL_USER_CUSTOM_CSS: "Pritaikytas CSS" + LEGEND_WELCOME_PAGE: "Prisistatymo puslapis" + LABEL_WELCOME_PAGE_TITLE: "Pavadinimas" + LABEL_WELCOME_PAGE_URL: "Nuoroda" + LABEL_WELCOME_PAGE_DISPLAY: "Rodyti" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "Nieko" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Kartą" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Visada" + HTML_ALERT_PREMIUM: "Ši funkcija leidžiama tik Premium vartotojams." + TAB_CONTACTS: + LEGEND_CONTACTS: "Kontaktai" + LEGEND_STORAGE: "Saugykla (PDO)" + LABEL_ENABLE_CONTACTS: "Įjungti kontaktus" + LABEL_ALLOW_SYNC: "Leisti kontaktų sinchronizavimą (su išoriniu CardDAV serveriu)" + LABEL_STORAGE_TYPE: "Tipas" + LABEL_STORAGE_DSN: "Dsn" + LABEL_STORAGE_USER: "Vartotojas" + LABEL_STORAGE_PASSWORD: "Slaptažodis" + BUTTON_TEST: "Bandymas" + ALERT_NOTICE: "Pastaba!" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Nenaudokite šio duomenų bazės tipo, jei turite daug aktyvių vartotojų" + HTML_ALERT_DOES_NOT_SUPPORTED: | + Jūsų sistema nepalaiko kontaktų sąrašo. + Reikia įdiegti ar įjungti PDO (SĄLite / MySQL / PostgreSQL) plėtinius jūsų serveryje. + TAB_DOMAINS: + LEGEND_DOMAINS: "Domenai" + BUTTON_ADD_DOMAIN: "Pridėti Domeną" + BUTTON_ADD_ALIAS: "Pridėti Alias" + DELETE_ARE_YOU_SURE: "Ar jūs įsitikinę?" + HTML_DOMAINS_HELPER: | + Leidžiamų Domenų sąrašas +
+ Spauskite ant pavadinimo norėdami redaguoti. + TAB_SECURITY: + LEGEND_SECURITY: "Sauga" + LABEL_ALLOW_TWO_STEP: "Leisti 2-jų žingsnių patikrinimą" + LABEL_FORCE_TWO_STEP: "Priverstinai naudoti 2-jų žingsnių patikrinimą" + LABEL_USE_IMAGE_PROXY: "naudoti vietinį šliuzą (proxy) išoriniams paveikslėliams" + LABEL_ALLOW_OPEN_PGP: "Leisti OpenPGP" + LABEL_SHOW_PHP_INFO: "Rodyti PHP informaciją" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Valdymo skydo prieigos rekvizitai" + LABEL_CURRENT_PASSWORD: "Dabartinis slaptažodis" + LABEL_NEW_LOGIN: "Naujas prisijungimo vardas" + LABEL_NEW_PASSWORD: "Naujas slaptažodis" + LABEL_REPEAT_PASSWORD: "Pakartokite" + BUTTON_UPDATE_PASSWORD: "Atnaujinti slaptažodį" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "Reikalauti SSL sertifikato (IMAP/SMTP)" + LABEL_ALLOW_SELF_SIGNED: "Leisti pačių sukurtus sertifikatus" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "Įjungti Google integraciją" + LABEL_GOOGLE_AUTH: "Authorization" + LABEL_GOOGLE_DRIVE: "Google Drive Integracija (Laiško kūrimo rodinys)" + LABEL_GOOGLE_PREVIEW: "Google peržiūros įrankių integracija (Galimybė peržiūrėti Microsoft Word, Excel ir Powerpoint failus)" + LABEL_GOOGLE_CLIENT_ID: "Kliento ID" + LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" + LABEL_GOOGLE_API_KEY: "Api Key" + HINT_GOOGLE_API_KEY: "Reikia dėl Google Drive Failų parinkimo" + LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "Įjungt Facebook Integraciją (Autorizavimui)" + LABEL_FACEBOOK_APP_ID: "App ID" + LABEL_FACEBOOK_APP_SECRET: "App Secret" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "jungt Twitter Integraciją (Autorizavimui)" + LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" + LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" + LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "Įjungti Dropbox Integraciją" + LABEL_DROPBOX_API_KEY: "Api Key" + TOP_ALERT: "Detalią Informaciją apie socialinių tinklų integraciją rasite čia" + TAB_PLUGINS: + LEGEND_PLUGINS: "Įskiepiai" + LABEL_ENABLE_PLUGINS: "leisti įskiepius" + ALERT_NO_PLUGINS: "Nėra įdiegtų įskiepių." + LINK_INSTALL_NEW: "Spauskite čia norėdami įdiegti!" + HINT_CLICK_NAME: "Spauskite ant vardo norėdami redaguoti įskiepį." + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "Yra galimybė atnaujinti" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Galima diegti" + LEGEND_INSTALLED_PACKAGES: "Įdiegti paketai" + ALERT_CANNOT_ACCESS_REPOSITORY: "Šiuo momentu negaliu prisijungti prie saugyklos." + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "Jūsų domenas" + LABEL_VERSION: "Versija" + LABEL_CHECKING: "Tikrinu" + TYPE_BASIC_HINT: "Šis domenas nelicencijuotas komerciniam naudojimui (su papildomomis galimybėmis)" + TYPE_BASIC_HINT_2: "Šis domenas negali būti licencijuotas." + HTML_ALERT_TOP_1: "RainLoop Webmail licencijuotas" + HTML_ALERT_TOP_2: "Jūs galite nemokamai naudoti savo asmeniniams projektams." + HTML_ALERT_TOP_3: | + Komerciniam RainLoop Webmail naudojimui (su papildomomis galimybėmis) turite įsigyti + prenumeratą. + TYPE_PREMIUM_LIFETIME: "Visam laikui" + LABEL_SUB_EXPIRES: "Prenumerata baigiasi" + BUTTON_ACTIVATE: "Aktyvuoti prenumeratos raktą šiam domenui" + BUTTON_PURCHASE: "Pirkti" + BUTTON_TRIAL: "Bandomasis" + TAB_ABOUT: + LEGEND_ABOUT: "Apie" + LABEL_TAG_HINT: "Paprastas, modernus ir greitas web pašto klientas" + LABEL_ALL_RIGHTS_RESERVED: "Visos teisės saugomos." + HINT_READ_CHANGE_LOG: "Prašom perskaityti pasikeitimų eigą prieš atnaujinant." + HINT_IS_UP_TO_DATE: "RainLoop naujausios laidos." + HTML_NEW_VERSION: "Nauja %VERSION% versija jau prieinama." + LABEL_UPDATING: "Atnaujinama" + LABEL_CHECKING: "Ieškau atnaujinimų" + BUTTON_UPDATE: "Atnaujinti" + BUTTON_DOWNLOAD: "Atsisiųsti" + BUTTON_CHANGELOG: "Pakeitimų žurnalas" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "Aktyvuoti prenumeratos raktą?" + TITLE_ACTIVATION: "Aktyvavimas..." + LABEL_DOMAIN: "Domenas" + LABEL_SUB_KEY: "Prenumeratos raktas" + BUTTON_ACTIVATE: "Aktyvuoti" + LABEL_ACTIVATED: "Aktyvuota" + ERROR_INVALID_SUBS_KEY: "Neteisingas prenumeratos raktas" + SUBS_KEY_ACTIVATED: "Prenumeratos raktas sėkmingai aktyvuotas" + HTML_DESC: | + Aktyvavus premium prenumeratą, papildomos galimybės domenui %DOMAIN% bus įjungtos. +
+ Įsidėmėkite, kad prenumeratos raktas gali būti aktyvuotas tik vienam domenui. +

+ Pradėjus aktyvavimo procesą jis nebegalės būti atšauktas. + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "Pridėti Alias" + LABEL_ALIAS: "Alias" + LABEL_DOMAIN: "Domenas" + BUTTON_CLOSE: "Uždaryti" + BUTTON_ADD: "Pridėti" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "Pridėti Domeną" + TITLE_ADD_DOMAIN_WITH_NAME: "Pridėti Domeną \"%NAME%\"" + TITLE_EDIT_DOMAIN: "Redaguoti Domeną \"%NAME%\"" + LABEL_NAME: "Pavadinimas" + NAME_HELPER: "wildcard palaikymas" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "Serveris" + LABEL_PORT: "Prievadas" + LABEL_SECURE: "Sauga" + LABEL_WHITE_LIST: "Baltas Sąrašas" + SECURE_OPTION_NONE: "Nėra" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "Leisti sieve programavimą" + LABEL_ALLOW_USER_SCRIPT: "Leisti vartotojo programavimą" + LABEL_USE_SHORT_LOGIN: "Naudoti trumpą prisijungimo vardą" + LABEL_USE_AUTH: "Naudoti autentifikavimą " + LABEL_USE_PHP_MAIL: "Naudoti php mail() funkciją" + BUTTON_TEST: "Bandyti" + BUTTON_WHITE_LIST: "Baltas sąrašas" + BUTTON_SIEVE_CONFIGURATION: "Sieve konfiguracija" + BUTTON_BACK_TO_IMAP: "Atgal į IMAP nustatymus" + BUTTON_BACK: "Atgal" + BUTTON_CLOSE: "Uždaryti" + BUTTON_ADD: "Pridėti" + BUTTON_UPDATE: "Atnaujinti" + NEW_DOMAIN_DESC: "Šie nustatymai leis jums dirbti
su %NAME% domeno pašto adresais." + WHITE_LIST_ALERT: | + Domeno vartotojų sąrašas, kuriems leista naudotis web paštu. + Naudokite tarpo simbolį kaip skyriklį. + POPUPS_PLUGIN: + TITLE_PLUGIN: "Įskiepis" + DESC_NOTHING_TO_CONFIGURE: "Nėra ką konfiguruoti" + BUTTON_CLOSE: "Uždaryti" + BUTTON_SAVE: "Saugoti" + TOOLTIP_ABOUT_TITLE: "Apie" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "Ar tikrai norite uždaryti šį langą?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Pasirinkite kalbą" + HINTS: + BETA: "beta" + UNSTABLE: "nestabilus" + WARNING: "Dėmesio!" + NOT_SUPPORTED: "Nepalaikoma" + REQUIRES_PHP_54: "būtina PHP 5.4 ar aukštesnė versija" + ERRORS: + DOMAIN_ALREADY_EXISTS: "Toks domenas jau yra" + UNKNOWN_ERROR: "Nežinoma klaida" + NOTIFICATIONS: + INVALID_TOKEN: "Neteisingas raktas" + AUTH_ERROR: "Autorizacija nepavyko" + ACCESS_ERROR: "Prieigos klaida" + CONNECTION_ERROR: "Nepavyskta prisijungti prie serverio" + CAPTCHA_ERROR: "Neteisingas CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Šis socialinis ID nepriskirtas jokiai e-pašto paskyrai. Prisijunkite naudojant + elektroninio pašto rekvizitus ir įjunkite šią funkciją paskyros nustatymuose. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Šis socialinis ID nepriskirtas jokiai e-pašto paskyrai. Prisijunkite naudojant + elektroninio pašto rekvizitus ir įjunkite šią funkciją paskyros nustatymuose. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Šis socialinis ID nepriskirtas jokiai e-pašto paskyrai. Prisijunkite naudojant + elektroninio pašto rekvizitus ir įjunkite šią funkciją paskyros nustatymuose. + DOMAIN_NOT_ALLOWED: "Šis subdomenas neleidžiamas" + ACCOUNT_NOT_ALLOWED: "Paskyra neleidžiama" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Būtinas dviejų veiksnių patikrinimas" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Dviejų veiksnių patikrinimo klaida" + COULD_NOT_SAVE_NEW_PASSWORD: "Negaliu išsaugoti slaptažodžio" + CURRENT_PASSWORD_INCORRECT: "Dabartinis slaptažodis neteisingas" + NEW_PASSWORD_SHORT: "Slaptažodis per trumpas" + NEW_PASSWORD_WEAK: "Slaptažodis per lengvas" + NEW_PASSWORD_FORBIDDENT: "Slaptažodyte bandote naudoti neleistinus simbolius" + CONTACTS_SYNC_ERROR: "Kontaktų sinchronizavimo klaida" + CANT_GET_MESSAGE_LIST: "Nepavyksta gauti laiškų sąrašo" + CANT_GET_MESSAGE: "Nepavyksta gauti laiško" + CANT_DELETE_MESSAGE: "Nepavyko pašalinti laiško" + CANT_MOVE_MESSAGE: "Nepavyko perkelti laiško" + CANT_SAVE_MESSAGE: "Nepavyko išsaugoti laiško" + CANT_SEND_MESSAGE: "Nepavyko išsiųsti laiško" + INVALID_RECIPIENTS: "Netinkamas gavėjas" + CANT_SAVE_FILTERS: "Nepavyko išsaugoti filtrų" + CANT_GET_FILTERS: "Nepavyko gauti filtrų" + FILTERS_ARE_NOT_CORRECT: "Filtrai neteisingi" + CANT_CREATE_FOLDER: "Nepavyksta sukurti katalogo" + CANT_RENAME_FOLDER: "Nepavyksta pervadinti katalogo" + CANT_DELETE_FOLDER: "Nepavyksta pašalinti katalogo" + CANT_DELETE_NON_EMPTY_FOLDER: "Negalima pašalinti ne tuščio katalogo" + CANT_SUBSCRIBE_FOLDER: "Nepavyskta užprenumeruoti katalogo" + CANT_UNSUBSCRIBE_FOLDER: "Nepavyksta nutraukti katalogo prenumeratos" + CANT_SAVE_SETTINGS: "Nepavyksta išsaugoti nustatymų" + CANT_SAVE_PLUGIN_SETTINGS: "Nepavyksta išsaugoti nustatymų" + DOMAIN_ALREADY_EXISTS: "Toks domenas jau yra" + CANT_INSTALL_PACKAGE: "Nepavyksta įdiegti paketo" + CANT_DELETE_PACKAGE: "Nepavyksta pašalinti paketo" + INVALID_PLUGIN_PACKAGE: "Netinkamas įskiepio paketas" + UNSUPPORTED_PLUGIN_PACKAGE: "Nepalaikomas įskiepio paketas" + LICENSING_SERVER_IS_UNAVAILABLE: "Prenumeratos serveris nepasiekimas" + LICENSING_DOMAIN_EXPIRED: "Šio subdomeno prenumeratos laikas baigėsi." + LICENSING_DOMAIN_BANNED: "Šio subdomeno prenumerata uždrausta." + DEMO_SEND_MESSAGE_ERROR: "Saugumo sumetimais, ši demo paskyra neleidžia siųsti laiškų išoriniais e-pašto adresais!" + DEMO_ACCOUNT_ERROR: "Saugumo sumetimais, su šia paskyra negalima atlikti norimo veiksmo!" + ACCOUNT_ALREADY_EXISTS: "Paskyra jau egzistuoja" + ACCOUNT_DOES_NOT_EXIST: "Nėra tokios paskyros" + MAIL_SERVER_ERROR: "Klaida bandant pasiekti pašto serverį" + INVALID_INPUT_ARGUMENT: "Neteisingas įvesties argumentas" + UNKNOWN_ERROR: "Nežinoma klaida" + STATIC: + BACK_LINK: "Perkrauti" + DOMAIN_LIST_DESC: "Leidžiamų naudoti subdomenų sąrašas." + PHP_EXSTENSIONS_ERROR_DESC: "Trūksta būtinų PHP plėtinių!" + PHP_VERSION_ERROR_DESC: "Jūsų PHP versija (%VERSION%) žemesnė, nei reikalaujama 5.3.0!" + NO_SCRIPT_TITLE: "Šiai aplikacijai reikalinga JavaScript." + NO_SCRIPT_DESC: | + JavaScript nepalaikoma Jūsų naršyklėje. + Įjunkite JavaScript palaikymą naršyklėje ir bandykite vėl. + NO_COOKIE_TITLE: "Slapukų palaikymas būtinas šiai aplikacijai." + NO_COOKIE_DESC: | + Slapukų palaikymas negalimas jūsų naršyklėje. + Įjunkite slapukų palaikymą naršyklėje ir bandykite vėl. + BAD_BROWSER_TITLE: "Jūsų naršyklė pasenusi." + BAD_BROWSER_DESC: | + Norint naudotis visais šios aplikacijos privalumais, + parsisiųskite ir įsidiekite vieną iš šių naršyklių: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/nb_NO.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/nb_NO.yml new file mode 100755 index 00000000..1d4bf245 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/nb_NO.yml @@ -0,0 +1,323 @@ +nb_NO: + LOGIN: + LABEL_LOGIN: "Brukernavn" + LABEL_PASSWORD: "Passord" + BUTTON_LOGIN: "Logg inn på admin-panel" + TOP_PANEL: + LABEL_PREMIUM: "Premium" + LABEL_ADMIN_PANEL: "Admin-panel" + TABS_LABELS: + LABEL_GENERAL_NAME: "Generelt" + LABEL_LOGIN_NAME: "Brukernavn" + LABEL_BRANDING_NAME: "Utforming" + LABEL_CONTACTS_NAME: "Kontakter" + LABEL_DOMAINS_NAME: "Domener" + LABEL_SECURITY_NAME: "Sikkerhet" + LABEL_INTEGRATION_NAME: "Integrasjon" + LABEL_PLUGINS_NAME: "Tillegg" + LABEL_PACKAGES_NAME: "Pakker" + LABEL_LICENSING_NAME: "Lisens" + LABEL_ABOUT_NAME: "Om" + TAB_GENERAL: + LEGEND_INTERFACE: "Grensesnitt" + LABEL_LANGUAGE: "Språk" + LABEL_LANGUAGE_ADMIN: "Språk (admin)" + LABEL_THEME: "Tema" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "La brukere velge språk på oppsettsskjerm" + LABEL_ALLOW_THEMES_ON_SETTINGS: "La brukere velge tema på oppsettsskjerm" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "La brukere velge bakgrunn på oppsettsskjerm" + LABEL_NEW_FOLDER_MOVE: "Ny «flytt til mappe»-knapp" + LABEL_SHOW_THUMBNAILS: "Vis miniatyrer (vedlegg)" + LABEL_ALLOW_GRAVATAR: "Tillat Gravatar" + LEGEND_MAIN: "Hoved" + LABEL_ATTACHMENT_SIZE_LIMIT: "Maksimal størrelse på vedlegg" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Tillat bruk av flere kontoer" + LABEL_ALLOW_IDENTITIES: "Tillat bruk av flere identiteter" + LABEL_ALLOW_TEMPLATES: "Tillat bruk av maler" + ALERT_WARNING: "Advarsel!" + HTML_ALERT_WEAK_PASSWORD: | + Du bruker forvalgt admin-passord. +
+ Av sikkerhetshensyn bør du + endre + passordet umiddelbart. + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "Innloggingsskjerm" + LABEL_DEFAULT_DOMAIN: "Standard-domene" + LABEL_DETERMINE_USER_DOMAIN: "Prøv å finne brukerens domene" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "La brukere velge språk på innloggingsskjerm" + LABEL_DETERMINE_USER_LANGUAGE: "Prøv å finne brukerens språk" + TAB_BRANDING: + LEGEND_BRANDING: "Utforming" + LABEL_PAGE_TITLE: "Sidetittel" + LABEL_LOADING_DESCRIPTION: "Tekst under innlasting" + LABEL_FAVICON_URL: "Favorittikon" + LEGEND_LOGIN: "Innlogging" + LABEL_LOGIN_LOGO: "Logo" + LABEL_LOGIN_DESCRIPTION: "Beskrivelse" + LABEL_LOGIN_BACKGROUND: "Bakgrunn" + LABEL_LOGIN_CUSTOM_CSS: "Selvvalgt CSS" + LABEL_LOGIN_SHOW_POWERED_LINK: "Vis «Powered by RainLoop»-lenke" + LEGEND_USER: "Bruker" + LABEL_USER_LOGO: "Logo" + LABEL_USER_LOGO_TITLE: "Logotittel" + LABEL_USER_LOGO_MESSAGE: "Logo (meldingsvisning)" + LABEL_USER_CUSTOM_CSS: "Selvvalgt CSS" + LEGEND_WELCOME_PAGE: "Velkomstside" + LABEL_WELCOME_PAGE_TITLE: "Tittel" + LABEL_WELCOME_PAGE_URL: "Nettadresse" + LABEL_WELCOME_PAGE_DISPLAY: "Vis" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "Ingen" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Én gang" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Alltid" + HTML_ALERT_PREMIUM: "Denne funksjonaliteten er bare tilgjengelig for Premium-brukere." + TAB_CONTACTS: + LEGEND_CONTACTS: "Kontakter" + LEGEND_STORAGE: "Lagring (PDO)" + LABEL_ENABLE_CONTACTS: "Slå på kontakter" + LABEL_ALLOW_SYNC: "Tillat synkronisering av kontakter (med ekstern CardDAV-tjener)" + LABEL_STORAGE_TYPE: "Type" + LABEL_STORAGE_DSN: "Dsn" + LABEL_STORAGE_USER: "Bruker" + LABEL_STORAGE_PASSWORD: "Passord" + BUTTON_TEST: "Test" + ALERT_NOTICE: "Varsel!" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Ikke bruk denne databasetypen hvis dette systemet har mange brukere." + HTML_ALERT_DOES_NOT_SUPPORTED: | + Dette systemet støtter ikke kontakter. +
+ Du må installere eller slå på utvidelsen PDO (SQLite / MySQL / PostgreSQL) på tjeneren. + TAB_DOMAINS: + LEGEND_DOMAINS: "Domener" + BUTTON_ADD_DOMAIN: "Legg til domene" + BUTTON_ADD_ALIAS: "Legg til alias" + DELETE_ARE_YOU_SURE: "Er du sikker?" + HTML_DOMAINS_HELPER: | + Liste over domener som programmet kan få tilgang til. +
+ Trykk på et navn for å sette opp domenet. + TAB_SECURITY: + LEGEND_SECURITY: "Sikkerhet" + LABEL_ALLOW_TWO_STEP: "Tillat tostegsbekreftelse" + LABEL_FORCE_TWO_STEP: "Krev tostegsbekreftelse" + LABEL_USE_IMAGE_PROXY: "Bruk lokal mellomtjener for eksterne bilder" + LABEL_ALLOW_OPEN_PGP: "Tillat OpenPGP" + LABEL_SHOW_PHP_INFO: "Vis PHP-informasjon" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Akkreditiver for admin-panel" + LABEL_CURRENT_PASSWORD: "Gjeldende passord" + LABEL_NEW_LOGIN: "Nytt brukernavn" + LABEL_NEW_PASSWORD: "Nytt passord" + LABEL_REPEAT_PASSWORD: "Gjenta" + BUTTON_UPDATE_PASSWORD: "Oppdater passord" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "Krev bekreftelse av SSL-sertifikat (IMAP/SMTP)" + LABEL_ALLOW_SELF_SIGNED: "Tillat selvutstedt sertifikat" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "Integrer med Google" + LABEL_GOOGLE_AUTH: "Autentisering" + LABEL_GOOGLE_DRIVE: "Google Drive-integrasjon (skrivevisning)" + LABEL_GOOGLE_PREVIEW: "Google Viewer-integrasjon (forhåndsvisning av Microsoft Word-, Excel- og PowerPoint-filer)" + LABEL_GOOGLE_CLIENT_ID: "Klient-ID" + LABEL_GOOGLE_CLIENT_SECRET: "Klientnøkkel" + LABEL_GOOGLE_API_KEY: "API-nøkkel" + HINT_GOOGLE_API_KEY: "Kreves av Google Drive File Picker" + LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "Integrer med Facebook (autentisering)" + LABEL_FACEBOOK_APP_ID: "Program-ID" + LABEL_FACEBOOK_APP_SECRET: "Programnøkkel" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "Integrer med Twitter (autentisering)" + LABEL_TWITTER_CONSUMER_KEY: "Brukernummer" + LABEL_TWITTER_CONSUMER_SECRET: "Brukernøkkel" + LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "Integrer med Dropbox" + LABEL_DROPBOX_API_KEY: "API-nøkkel" + TOP_ALERT: "Detaljert informasjon om integrering med sosiale medier finnes på" + TAB_PLUGINS: + LEGEND_PLUGINS: "Tillegg" + LABEL_ENABLE_PLUGINS: "Slå på tillegg" + ALERT_NO_PLUGINS: "Ingen tillegg er installert." + LINK_INSTALL_NEW: "Trykk her for å installere." + HINT_CLICK_NAME: "Trykk på et programtillegg-navn for å sette det opp." + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "Tilgjengelig for oppdatering" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Tilgjengelig for installasjon" + LEGEND_INSTALLED_PACKAGES: "Installerte pakker" + ALERT_CANNOT_ACCESS_REPOSITORY: "Fikk ikke tilgang til pakkelageret." + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "Domenenavn" + LABEL_VERSION: "Versjon" + LABEL_CHECKING: "Sjekker" + TYPE_BASIC_HINT: "Dette domenet har ikke lisens for kommersiell bruk (med ekstrafunksjoner)." + TYPE_BASIC_HINT_2: "Dette domenet kan ikke brukes med lisens for ekstrafunksjoner." + HTML_ALERT_TOP_1: "RainLoop Webmail er utgitt på betingelsene i" + HTML_ALERT_TOP_2: "Du står fritt til å bruke programmet til personlige formål." + HTML_ALERT_TOP_3: | + Hvis du vil bruke RainLoop Webmail kommersielt (med ekstrafunksjoner), må du kjøpe et + abonnement. + TYPE_PREMIUM_LIFETIME: "Livstid" + LABEL_SUB_EXPIRES: "Abonnement utgår" + BUTTON_ACTIVATE: "Ta i bruk abonnementsnøkkel for dette domenet" + BUTTON_PURCHASE: "Kjøp" + BUTTON_TRIAL: "Prøv" + TAB_ABOUT: + LEGEND_ABOUT: "Om" + LABEL_TAG_HINT: "Rask, enkel, moderne og web-basert e-postklient" + LABEL_ALL_RIGHTS_RESERVED: "All Rights Reserved." + HINT_READ_CHANGE_LOG: "Les endringslogg før du oppdaterer." + HINT_IS_UP_TO_DATE: "RainLoop er oppdatert." + HTML_NEW_VERSION: "Versjon %VERSION% er nå tilgjengelig." + LABEL_UPDATING: "Oppdaterer" + LABEL_CHECKING: "Ser etter oppdateringer" + BUTTON_UPDATE: "Oppdater" + BUTTON_DOWNLOAD: "Last ned" + BUTTON_CHANGELOG: "Endringslogg" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "Vil du ta abonnementsnøkkelen i bruk?" + TITLE_ACTIVATION: "Aktivering …" + LABEL_DOMAIN: "Domene" + LABEL_SUB_KEY: "Abonnementsnøkkel" + BUTTON_ACTIVATE: "Bruk" + LABEL_ACTIVATED: "I bruk" + ERROR_INVALID_SUBS_KEY: "Ugyldig abonnementsnøkkel" + SUBS_KEY_ACTIVATED: "Abonnementsnøkkelen er nå i bruk" + HTML_DESC: | + Premium-abonnement for %DOMAIN% fonyes. +
+ Nøkkelen kan bare tas i bruk for ett domene. +

+ Du kan ikke angre på å ta en nøkkel i bruk. + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "Legg til alias" + LABEL_ALIAS: "Alias" + LABEL_DOMAIN: "Domene" + BUTTON_CLOSE: "Lukk" + BUTTON_ADD: "Legg til" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "Legg til domene" + TITLE_ADD_DOMAIN_WITH_NAME: "Legg til «%NAME%»" + TITLE_EDIT_DOMAIN: "Rediger «%NAME%»" + LABEL_NAME: "Navn" + NAME_HELPER: "jokertegn støttes" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "Tjener" + LABEL_PORT: "Port" + LABEL_SECURE: "Sikker" + LABEL_WHITE_LIST: "Hvitliste" + SECURE_OPTION_NONE: "None" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "Tillat sieve-skript" + LABEL_ALLOW_USER_SCRIPT: "Tillat selvvalgt brukerskript" + LABEL_USE_SHORT_LOGIN: "Bruk forkortet brukernavn" + LABEL_USE_AUTH: "Bruk autentisering" + LABEL_USE_PHP_MAIL: "Bruk php-funksjonen «mail()»" + BUTTON_TEST: "Test" + BUTTON_WHITE_LIST: "Hvitliste" + BUTTON_SIEVE_CONFIGURATION: "Sieve-oppsett" + BUTTON_BACK_TO_IMAP: "Tilbake til IMAP-innstillinger" + BUTTON_BACK: "Tilbake" + BUTTON_CLOSE: "Lukk" + BUTTON_ADD: "Legg til" + BUTTON_UPDATE: "Oppdater" + NEW_DOMAIN_DESC: "Dette domeneoppsettet lar deg jobbe
med e-postadresser ved %NAME%." + WHITE_LIST_ALERT: | + Liste over domenebrukere som programmet skal ha tilgang til. + Hold verdier adskilt med mellomrom. + POPUPS_PLUGIN: + TITLE_PLUGIN: "Tillegg" + DESC_NOTHING_TO_CONFIGURE: "Ingenting å sette opp" + BUTTON_CLOSE: "Lukk" + BUTTON_SAVE: "Lagre" + TOOLTIP_ABOUT_TITLE: "Om" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "Er du sikker på at du vil lukke dette vinduet?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Velg språk" + HINTS: + BETA: "beta" + UNSTABLE: "ustabil" + WARNING: "Advarsel!" + NOT_SUPPORTED: "støttes ikke" + REQUIRES_PHP_54: "krever PHP versjon 5.4 eller nyere" + ERRORS: + DOMAIN_ALREADY_EXISTS: "Domenet finnes allerede" + UNKNOWN_ERROR: "Ukjent feil" + NOTIFICATIONS: + INVALID_TOKEN: "Ugyldig symbol" + AUTH_ERROR: "Autentisering mislyktes" + ACCESS_ERROR: "Tilgangsfeil" + CONNECTION_ERROR: "Klarte ikke å koble til tjener" + CAPTCHA_ERROR: "Feil CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- + Denne sosiale ID-en er ikke knyttet til en e-postkonto enda. Logg inn med + e-post-akkreditiver og slå på denne funksjonen i kontooppsettet. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- + Denne sosiale ID-en er ikke knyttet til en e-postkonto enda. Logg inn med + e-post-akkreditiver og slå på denne funksjonen i kontooppsettet. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- + Denne sosiale ID-en er ikke knyttet til en e-postkonto enda. Logg inn med + e-post-akkreditiver og slå på denne funksjonen i kontooppsettet. + DOMAIN_NOT_ALLOWED: "Domenet tillates ikke" + ACCOUNT_NOT_ALLOWED: "Kontoen tillates ikke" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "To-stegsbekreftelse kreves" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Feil under to-stegsbekreftelse" + COULD_NOT_SAVE_NEW_PASSWORD: "Klarte ikke å lagre nytt passord" + CURRENT_PASSWORD_INCORRECT: "Gjeldende passord er feil" + NEW_PASSWORD_SHORT: "Passordet er for kort" + NEW_PASSWORD_WEAK: "Passordet er for enkelt" + NEW_PASSWORD_FORBIDDENT: "Passordet inneholder forbudte tegn" + CONTACTS_SYNC_ERROR: "Feil under synkronisering av kontakter" + CANT_GET_MESSAGE_LIST: "Klarte ikke å hente meldingsliste" + CANT_GET_MESSAGE: "Klarte ikke å hente melding" + CANT_DELETE_MESSAGE: "Klarte ikke å slette melding" + CANT_MOVE_MESSAGE: "Klarte ikke å flytte melding" + CANT_SAVE_MESSAGE: "Klarte ikke å lagre melding" + CANT_SEND_MESSAGE: "Klarte ikke å sende melding" + INVALID_RECIPIENTS: "Ugyldige mottakere" + CANT_SAVE_FILTERS: "Klarte ikke å lagre filtre" + CANT_GET_FILTERS: "Klarte ikke å hente filtre" + FILTERS_ARE_NOT_CORRECT: "Ugyldige filtre" + CANT_CREATE_FOLDER: "Klarte ikke å lage mappe" + CANT_RENAME_FOLDER: "Klarte ikke å gi nytt navn til mappe" + CANT_DELETE_FOLDER: "Klarte ikke å slette mappe" + CANT_DELETE_NON_EMPTY_FOLDER: "Mappa er ikke tom, og kan derfor ikke slettes" + CANT_SUBSCRIBE_FOLDER: "Klarte ikke å abonnere på mappe" + CANT_UNSUBSCRIBE_FOLDER: "Klarte ikke å avslutte abonnement på mappe" + CANT_SAVE_SETTINGS: "Klarte ikke å lagre innstillinger" + CANT_SAVE_PLUGIN_SETTINGS: "Klarte ikke å lagre innstillinger" + DOMAIN_ALREADY_EXISTS: "Domenet finnes allerede" + CANT_INSTALL_PACKAGE: "Klarte ikke å installere pakke" + CANT_DELETE_PACKAGE: "Klarte ikke å fjerne pakke" + INVALID_PLUGIN_PACKAGE: "Ugyldig tilleggspakke" + UNSUPPORTED_PLUGIN_PACKAGE: "Tilleggspakke støttes ikke" + LICENSING_SERVER_IS_UNAVAILABLE: "Abonnementstjener er utilgjengelig" + LICENSING_DOMAIN_EXPIRED: "Abonnementet for dette domenet er utgått." + LICENSING_DOMAIN_BANNED: "Abonnementet for dette domenet er blokkert." + DEMO_SEND_MESSAGE_ERROR: "Av sikkerhetshensyn er denne demo-kontoen blokkert fra å sende meldinger til eksterne e-postadresser." + DEMO_ACCOUNT_ERROR: "Av sikkerhetshensyn er denne demo-kontoen blokkert fra å utføre denne handlinga" + ACCOUNT_ALREADY_EXISTS: "Kontoen finnes allerede" + ACCOUNT_DOES_NOT_EXIST: "Kontoen finnes ikke" + MAIL_SERVER_ERROR: "Det oppstod en feil under tilkobling til e-posttjener" + INVALID_INPUT_ARGUMENT: "Ugyldig inndata-argument" + UNKNOWN_ERROR: "Ukjent feil" + STATIC: + BACK_LINK: "Last inn på nytt" + DOMAIN_LIST_DESC: "Liste over domener som programmet skal ha tilgang til." + PHP_EXSTENSIONS_ERROR_DESC: "PHP-oppsettet ditt mangler en påkrevet utvidelse." + PHP_VERSION_ERROR_DESC: "PHP-installasjonen din (%VERSION%) er eldre enn versjon 5.3.0" + NO_SCRIPT_TITLE: "Dette programmet krever Javascript." + NO_SCRIPT_DESC: | + Nettleseren din støtter ikke Javascript. + Slå på Javascript-støtte i nettleserens innstillinger, og prøv på nytt. + NO_COOKIE_TITLE: "Dette programmet krever støtte for informasjonskapsler («cookies»)." + NO_COOKIE_DESC: | + Nettleseren din støtter ikke bruk av informasjonskapsler («cookies»). + Slå på cookie-støtte i nettleserens innstillinger, og prøv på nytt. + BAD_BROWSER_TITLE: "Nettleseren din er utdatert." + BAD_BROWSER_DESC: | + Hvis du vil bruke alle funksjonene i programmet, + må du laste ned og installere en av disse nettleserne: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/nl_NL.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/nl_NL.yml new file mode 100755 index 00000000..998a7e41 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/nl_NL.yml @@ -0,0 +1,321 @@ +nl_NL: + LOGIN: + LABEL_LOGIN: "Inlognaam" + LABEL_PASSWORD: "Wachtwoord" + BUTTON_LOGIN: "Aanmelden in het beheer paneel" + TOP_PANEL: + LABEL_PREMIUM: "Premium" + LABEL_ADMIN_PANEL: "Beheer paneel" + TABS_LABELS: + LABEL_GENERAL_NAME: "Algemeen" + LABEL_LOGIN_NAME: "Inlognaam" + LABEL_BRANDING_NAME: "Huisstijl" + LABEL_CONTACTS_NAME: "Contactpersonen" + LABEL_DOMAINS_NAME: "Domeinen" + LABEL_SECURITY_NAME: "Beveiliging" + LABEL_INTEGRATION_NAME: "Integratie" + LABEL_PLUGINS_NAME: "Invoegtoepassingen" + LABEL_PACKAGES_NAME: "Paketten" + LABEL_LICENSING_NAME: "Licentieovereenkomst" + LABEL_ABOUT_NAME: "Over" + TAB_GENERAL: + LEGEND_INTERFACE: "Interface" + LABEL_LANGUAGE: "Taal" + LABEL_LANGUAGE_ADMIN: "Taal (admin)" + LABEL_THEME: "Thema" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Sta taalselectie toe in het instellingen scherm" + LABEL_ALLOW_THEMES_ON_SETTINGS: "Sta thema selectie toe in het instellingen scherm" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Sta achtergrond selectie toe in het instellingen scherm" + LABEL_NEW_FOLDER_MOVE: "Nieuwe \"verplaats naar map\" knop" + LABEL_SHOW_THUMBNAILS: "Toon miniaturen (bijlage)" + LABEL_ALLOW_GRAVATAR: "Toon Gravatar" + LEGEND_MAIN: "Diverse" + LABEL_ATTACHMENT_SIZE_LIMIT: "Maximale bijlage grootte" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Sta extra accounts toe" + LABEL_ALLOW_IDENTITIES: "Meerdere identiteiten toestaan" + LABEL_ALLOW_TEMPLATES: "Sta templates toe" + ALERT_WARNING: "Waarschuwing!" + HTML_ALERT_WEAK_PASSWORD: | + U gebruikt het standaard beheer wachtwoord. +
+ Wijzig + a.u.b. voor uw veiligheid direct het wachtwoord. + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "Inlogscherm" + LABEL_DEFAULT_DOMAIN: "Standaard domein" + LABEL_DETERMINE_USER_DOMAIN: "Probeer gebruikersdomein te bepalen" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Sta taal selectie toe in het login scherm" + LABEL_DETERMINE_USER_LANGUAGE: "Probeer gebruiker taal te bepalen" + TAB_BRANDING: + LEGEND_BRANDING: "Huisstijl" + LABEL_PAGE_TITLE: "Pagina titel" + LABEL_LOADING_DESCRIPTION: "Beschrijving tijdens laden" + LABEL_FAVICON_URL: "Favicon" + LEGEND_LOGIN: "Login scherm" + LABEL_LOGIN_LOGO: "Logo" + LABEL_LOGIN_DESCRIPTION: "Beschrijving" + LABEL_LOGIN_BACKGROUND: "Achtergrond" + LABEL_LOGIN_CUSTOM_CSS: "Aangepaste CSS" + LABEL_LOGIN_SHOW_POWERED_LINK: "Toon \"Powered by RainLoop\" link" + LEGEND_USER: "Gebruiker" + LABEL_USER_LOGO: "Logo" + LABEL_USER_LOGO_TITLE: "Logo titel" + LABEL_USER_LOGO_MESSAGE: "Logo (berichtweergave)" + LABEL_USER_CUSTOM_CSS: "Aangepaste CSS" + LEGEND_WELCOME_PAGE: "Welkom pagina" + LABEL_WELCOME_PAGE_TITLE: "Titel" + LABEL_WELCOME_PAGE_URL: "URL" + LABEL_WELCOME_PAGE_DISPLAY: "Weergave" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "Nooit" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Eenmalig" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Altijd" + HTML_ALERT_PREMIUM: "Deze functionaliteit is alleen beschikbaar voor Premium abonnees.\n" + TAB_CONTACTS: + LEGEND_CONTACTS: "Contactpersonen" + LEGEND_STORAGE: "Opslag (PDO)" + LABEL_ENABLE_CONTACTS: "Contactpersonen inschakelen" + LABEL_ALLOW_SYNC: "Contactpersoon synchronisatie (met externe CardDAV server) inschakelen" + LABEL_STORAGE_TYPE: "Soort" + LABEL_STORAGE_DSN: "Dsn" + LABEL_STORAGE_USER: "Gebruikersnaam" + LABEL_STORAGE_PASSWORD: "Wachtwoord" + BUTTON_TEST: "Test" + ALERT_NOTICE: "Aandacht!" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Gegruik deze database soort niet met een groot aantal actieve gebrukers." + HTML_ALERT_DOES_NOT_SUPPORTED: | + Uw systeem ondersteund geen contactpersonen. +
+ U moet een PDO (SQLite / MySQL / PostgreSQL) extentie op uw server installeren of activeren. + TAB_DOMAINS: + LEGEND_DOMAINS: "Domeinen" + BUTTON_ADD_DOMAIN: "Domein toevoegen" + BUTTON_ADD_ALIAS: "Voeg alias toe" + DELETE_ARE_YOU_SURE: "Weet u het zeker?" + HTML_DOMAINS_HELPER: | + Lijst van toegestane domeinen. +
+ Klik op de domeinnaam om deze te configureren. + TAB_SECURITY: + LEGEND_SECURITY: "Beveiliging" + LABEL_ALLOW_TWO_STEP: "2-Stap verificatie toestaan" + LABEL_FORCE_TWO_STEP: "2-Stap verificatie afdwingen" + LABEL_USE_IMAGE_PROXY: "Gebruik de server als proxy voor externe afbeeldingen" + LABEL_ALLOW_OPEN_PGP: "OpenPGP toestaan" + LABEL_SHOW_PHP_INFO: "PHP informatie tonen" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Toegangsgegevens beheer paneel" + LABEL_CURRENT_PASSWORD: "Huidig wachtwoord" + LABEL_NEW_LOGIN: "Nieuwe gebruikersnaam" + LABEL_NEW_PASSWORD: "Nieuw wachtwoord" + LABEL_REPEAT_PASSWORD: "Herhaal nieuw wachtwoord" + BUTTON_UPDATE_PASSWORD: "Gegevens bijwerken" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "Verificatie van SSL certificaten (IMAP/SMTP)" + LABEL_ALLOW_SELF_SIGNED: "Sta zelf ondertekende certificaten toe" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "Google integratie inschakelen" + LABEL_GOOGLE_AUTH: "Autorisatie" + LABEL_GOOGLE_DRIVE: "Google Drive integratie (tijdens bericht opstellen)" + LABEL_GOOGLE_PREVIEW: "Google Viewer integratie (Microsoft Word, Excel en PowerPoint voorbeelweergave)" + LABEL_GOOGLE_CLIENT_ID: "Client ID" + LABEL_GOOGLE_CLIENT_SECRET: "Geheime sleutel" + LABEL_GOOGLE_API_KEY: "API sleutel" + HINT_GOOGLE_API_KEY: "Vereist voor Google Drive bestand verkenner" + LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "Facebook integratie (autorisatie) inschakelen" + LABEL_FACEBOOK_APP_ID: "App ID" + LABEL_FACEBOOK_APP_SECRET: "App sleutel" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "Twitter integratie (autorisatie) inschakelen" + LABEL_TWITTER_CONSUMER_KEY: "Consumer sleutel" + LABEL_TWITTER_CONSUMER_SECRET: "Consumer geheime sleutel" + LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "Dropbox integratie" + LABEL_DROPBOX_API_KEY: "API sleutel" + TOP_ALERT: "Gedetaileerde informatie over integraties is te vinden op" + TAB_PLUGINS: + LEGEND_PLUGINS: "Invoegtoepassingen" + LABEL_ENABLE_PLUGINS: "Invoegtoepassingen inschakelen" + ALERT_NO_PLUGINS: "Er zijn nog geen invoegtoepassingen geïnstalleerd" + LINK_INSTALL_NEW: "Klik hier om een invoegtoepassing te installeren!" + HINT_CLICK_NAME: "Klik op de naam om de invoegtoepassing te configuren." + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "Update beschikbaar" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Gereed voor installatie" + LEGEND_INSTALLED_PACKAGES: "Geïnstalleerde pakketten" + ALERT_CANNOT_ACCESS_REPOSITORY: "De installatie bron is op het moment niet beschikbaar." + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "Uw domein" + LABEL_VERSION: "Versie" + LABEL_CHECKING: "Controleren" + TYPE_BASIC_HINT: "Dit domein is niet gelicentieerd voor commercieel gebruik (met aditionele functies)." + TYPE_BASIC_HINT_2: "Dit domein kan niet worden gelicentieerd." + HTML_ALERT_TOP_1: "RainLoop Webmail is gelicentieerd onder de" + HTML_ALERT_TOP_2: "U staat u vrij om dit voor uw persoonlijk project te gebruiken." + HTML_ALERT_TOP_3: | + Voor commercieel gebruik (met additionele functies) van RainLoop Webmail moet u een activatie code. + TYPE_PREMIUM_LIFETIME: "Levenslang" + LABEL_SUB_EXPIRES: "Activatie verloopt" + BUTTON_ACTIVATE: "Activeer de activatie code voor dit domein." + BUTTON_PURCHASE: "Aanschaffen" + BUTTON_TRIAL: "Proefperiode" + TAB_ABOUT: + LEGEND_ABOUT: "Over" + LABEL_TAG_HINT: "Simpel, modern en snelle web-based e-mail client" + LABEL_ALL_RIGHTS_RESERVED: "Alle rechten gereserveerd." + HINT_READ_CHANGE_LOG: "Lees a.u.b. het veranderingen logboek alvorens te updaten." + HINT_IS_UP_TO_DATE: "De laatste versie van RainLoop is geïnstalleerd." + HTML_NEW_VERSION: "Een nieuwe versie %VERSION% is beschikbaar." + LABEL_UPDATING: "Bezig met updaten" + LABEL_CHECKING: "Controleren op updates" + BUTTON_UPDATE: "Bijwerken" + BUTTON_DOWNLOAD: "Download" + BUTTON_CHANGELOG: "Veranderingen logboek" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "Activatie code activeren?" + TITLE_ACTIVATION: "Activeren..." + LABEL_DOMAIN: "Domein" + LABEL_SUB_KEY: "Activatie code" + BUTTON_ACTIVATE: "Activeer" + LABEL_ACTIVATED: "Geactiveerd" + ERROR_INVALID_SUBS_KEY: "Onjuiste activatie code" + SUBS_KEY_ACTIVATED: "Activatie code is al succesvol geactiveerd" + HTML_DESC: | + Na activatie wordt het premium abonnement voor %DOMAIN% verlengd. +
+ Let op: een activatie code kan slechts voor één domein worden gebruikt. +

+ Het activatieproces kan niet meer worden afgebroken of geannuleerd nadat het is gestart. + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "Voeg alias toe" + LABEL_ALIAS: "Alias" + LABEL_DOMAIN: "Domein" + BUTTON_CLOSE: "Sluiten" + BUTTON_ADD: "Toevoegen" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "Voeg domein toe" + TITLE_ADD_DOMAIN_WITH_NAME: "Voeg domein \"%NAME%\" toe" + TITLE_EDIT_DOMAIN: "Pas domein \"%NAME%\" aan" + LABEL_NAME: "Naam" + NAME_HELPER: "ondersteunt joker tekens" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "Server" + LABEL_PORT: "Poort" + LABEL_SECURE: "Encryptie" + LABEL_WHITE_LIST: "Witte lijst" + SECURE_OPTION_NONE: "Geen" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "Sta Sieve scripts toe" + LABEL_ALLOW_USER_SCRIPT: "Sta gebruiker scripts toe" + LABEL_USE_SHORT_LOGIN: "Gebruik verkorte login" + LABEL_USE_AUTH: "Gebruik authenticatie" + LABEL_USE_PHP_MAIL: "Gebruik php mail() functie" + BUTTON_TEST: "Test" + BUTTON_WHITE_LIST: "Witte lijst" + BUTTON_SIEVE_CONFIGURATION: "Sieve configuratie" + BUTTON_BACK_TO_IMAP: "Terug naar IMAP instellingen" + BUTTON_BACK: "Terug" + BUTTON_CLOSE: "Annuleer" + BUTTON_ADD: "Toevoegen" + BUTTON_UPDATE: "Update" + NEW_DOMAIN_DESC: "Dit domein stelt u in staat om
met %NAME% e-mail adressen te werken." + WHITE_LIST_ALERT: | + Lijst van gebruikers die dit domein mogen gebruiken. + Gebruik een spatie als scheidingsteken. + POPUPS_PLUGIN: + TITLE_PLUGIN: "Invoegtoepassing" + DESC_NOTHING_TO_CONFIGURE: "Niets om te configureren" + BUTTON_CLOSE: "Annuleer" + BUTTON_SAVE: "Opslaan" + TOOLTIP_ABOUT_TITLE: "Over" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "Weet u zeker dat u dit venster wilt stuiten?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Kies uw taal" + HINTS: + BETA: "bèta" + UNSTABLE: "onstabiel" + WARNING: "Waarschuwing!" + NOT_SUPPORTED: "niet ondersteund" + REQUIRES_PHP_54: "vereist PHP 5.4 of hoger" + ERRORS: + DOMAIN_ALREADY_EXISTS: "Domein bestaat al" + UNKNOWN_ERROR: "Onbekende fout" + NOTIFICATIONS: + INVALID_TOKEN: "Onjuiste token" + AUTH_ERROR: "Authenticatie mislukt" + ACCESS_ERROR: "Fout bij toegang" + CONNECTION_ERROR: "Verbinding met Server mislukt" + CAPTCHA_ERROR: "Onjuiste CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Deze integratie ID is nog niet gekoppeld aan een e-mail adres. Log in met + uw e-mail aanmeldingsgegevens en activeer deze functie in de instellingen. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Deze integratie ID is nog niet gekoppeld aan een e-mail adres. Log in met + uw e-mail aanmeldingsgegevens en activeer deze functie in de instellingen. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Deze integratie ID is nog niet gekoppeld aan een e-mail adres. Log in met + uw e-mail aanmeldingsgegevens en activeer deze functie in de instellingen. + DOMAIN_NOT_ALLOWED: "Domein is niet toegestaan" + ACCOUNT_NOT_ALLOWED: "Account is niet toegestaan" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2-Stap verificatie is vereist" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2-Stap verificatie fout" + COULD_NOT_SAVE_NEW_PASSWORD: "Kan het nieuwe wachtwoord niet opslaan" + CURRENT_PASSWORD_INCORRECT: "Huidig wachtwoord is onjuist" + NEW_PASSWORD_SHORT: "Wachtwoord is te kort" + NEW_PASSWORD_WEAK: "Wachtwoord is te gemakkelijk" + NEW_PASSWORD_FORBIDDENT: "Wachtwoord bevat verboden karakters" + CONTACTS_SYNC_ERROR: "Contactpersonen synchronisatie fout" + CANT_GET_MESSAGE_LIST: "Kan berichtenlijst niet ophalen" + CANT_GET_MESSAGE: "Kan bericht niet ophalen" + CANT_DELETE_MESSAGE: "Kan bericht niet verwijderen" + CANT_MOVE_MESSAGE: "Kan bericht niet verplaatsen" + CANT_SAVE_MESSAGE: "Kan bericht niet opslaan" + CANT_SEND_MESSAGE: "Kan bericht niet verzenden" + INVALID_RECIPIENTS: "ongeldige ontvanger(s)" + CANT_SAVE_FILTERS: "Kan filters niet opslaan" + CANT_GET_FILTERS: "Kan filters niet ophalen" + FILTERS_ARE_NOT_CORRECT: "Filters zijn niet correct" + CANT_CREATE_FOLDER: "Kan map niet maken" + CANT_RENAME_FOLDER: "Kan map geen andere naam geven" + CANT_DELETE_FOLDER: "Kan map niet verwijderen" + CANT_DELETE_NON_EMPTY_FOLDER: "Kan folder die niet leeg is niet verwijderen" + CANT_SUBSCRIBE_FOLDER: "Kan niet abonneren op map" + CANT_UNSUBSCRIBE_FOLDER: "Kan abonnement op map niet opheffen" + CANT_SAVE_SETTINGS: "Kan instellingen niet opslaan" + CANT_SAVE_PLUGIN_SETTINGS: "Kan instellingen niet opslaan" + DOMAIN_ALREADY_EXISTS: "Domein bestaat al" + CANT_INSTALL_PACKAGE: "Kan pakket niet installeren" + CANT_DELETE_PACKAGE: "Kan pakket niet de-installeren" + INVALID_PLUGIN_PACKAGE: "Onjuist invoegtoepassing pakket" + UNSUPPORTED_PLUGIN_PACKAGE: "niet ondersteund invoegtoepassing pakket" + LICENSING_SERVER_IS_UNAVAILABLE: "Activatie server is niet beschikbaar" + LICENSING_DOMAIN_EXPIRED: "Activatie voor dit domein is verlopen." + LICENSING_DOMAIN_BANNED: "Activatie voor dit domein niet mogelijk." + DEMO_SEND_MESSAGE_ERROR: "Vanwege beveiliging is het deze account niet toegestaan om e-mail naar externe adressen te versturen!" + DEMO_ACCOUNT_ERROR: "Vanwege beveiliging is het deze account niet toegestaan om deze actie uit te voeren!" + ACCOUNT_ALREADY_EXISTS: "Account bestaat al" + ACCOUNT_DOES_NOT_EXIST: "Account bestaat niet." + MAIL_SERVER_ERROR: "Fout bij toegang tot de mail Server" + INVALID_INPUT_ARGUMENT: "Invalid input argument" + UNKNOWN_ERROR: "Unknown error" + STATIC: + BACK_LINK: "Reload" + DOMAIN_LIST_DESC: "List of domains webmail is allowed to access." + PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" + PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" + NO_SCRIPT_TITLE: "JavaScript is required for this application." + NO_SCRIPT_DESC: | + JavaScript support is not available in your browser. + Please enable JavaScript support in your browser settings and retry. + NO_COOKIE_TITLE: "Cookies support is required for this application." + NO_COOKIE_DESC: | + Cookies support is not available in your browser. + Please enable Cookie support in your browser settings and retry. + BAD_BROWSER_TITLE: "Your browser is outdated." + BAD_BROWSER_DESC: | + Om alle functies van deze applicatie te gebruiken, + download en installeer een van de volgende browsers: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/pl_PL.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/pl_PL.yml new file mode 100755 index 00000000..3925ff5d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/pl_PL.yml @@ -0,0 +1,326 @@ +pl_PL: + LOGIN: + LABEL_LOGIN: "Login" + LABEL_PASSWORD: "Hasło" + BUTTON_LOGIN: "Zaloguj" + TOP_PANEL: + LABEL_PREMIUM: "Premium" + LABEL_ADMIN_PANEL: "Panel administracyjny" + TABS_LABELS: + LABEL_GENERAL_NAME: "Ogólne" + LABEL_LOGIN_NAME: "Login" + LABEL_BRANDING_NAME: "Personalizacja" + LABEL_CONTACTS_NAME: "Kontakty" + LABEL_DOMAINS_NAME: "Domeny" + LABEL_SECURITY_NAME: "Bezpieczeństwo" + LABEL_INTEGRATION_NAME: "Integracja" + LABEL_PLUGINS_NAME: "Wtyczki" + LABEL_PACKAGES_NAME: "Zarządzanie wtyczkami" + LABEL_LICENSING_NAME: "Licencjonowanie" + LABEL_ABOUT_NAME: "O skrypcie" + TAB_GENERAL: + LEGEND_INTERFACE: "Interfejs" + LABEL_LANGUAGE: "Język:" + LABEL_LANGUAGE_ADMIN: "Język (admin):" + LABEL_THEME: "Motyw:" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Zezwól użytkownikowi na wybór języka" + LABEL_ALLOW_THEMES_ON_SETTINGS: "Zezwól użytkownikowi na zmianę motywu" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Zezwól użytkownikowi na użycie własnego tła" + LABEL_NEW_FOLDER_MOVE: "Nowy przycisk \"przenieś do folderu\"" + LABEL_SHOW_THUMBNAILS: "Pokaż miniatury (załączniki)" + LABEL_ALLOW_GRAVATAR: "Zezwól na używanie gravatarów" + LEGEND_MAIN: "Główne" + LABEL_ATTACHMENT_SIZE_LIMIT: "Maks. rozmiar zał.:" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Zezwól na dodatkowe konta" + LABEL_ALLOW_IDENTITIES: "Zezwól na posiadanie wielu tożsamości" + LABEL_ALLOW_TEMPLATES: "Zezwól na używanie szablonów" + ALERT_WARNING: "Ostrzeżenie!" + HTML_ALERT_WEAK_PASSWORD: | + Korzystasz z domyślnego hasła administratora. +
+ Ze względów bezpieczeństwa, proszę + zmienić hasło + na inne. + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "Logowanie" + LABEL_DEFAULT_DOMAIN: "Domyślna domena:" + LABEL_DETERMINE_USER_DOMAIN: "Spróbuj określić domenę użytkownika" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Zezwól na zmianę języka podczas logowania" + LABEL_DETERMINE_USER_LANGUAGE: "Spróbuj określić język użytkownika" + TAB_BRANDING: + LEGEND_BRANDING: "Personalizacja" + LABEL_PAGE_TITLE: "Tytuł strony:" + LABEL_LOADING_DESCRIPTION: "Komunikat ład. strony:" + LABEL_FAVICON_URL: "Favicon:" + LEGEND_LOGIN: "Login" + LABEL_LOGIN_LOGO: "Logo:" + LABEL_LOGIN_DESCRIPTION: "Opis:" + LABEL_LOGIN_BACKGROUND: "Tło:" + LABEL_LOGIN_CUSTOM_CSS: "Własny arkusz stylów:" + LABEL_LOGIN_SHOW_POWERED_LINK: "Pokaż link: \"Powered by RainLoop\"" + LEGEND_USER: "Użytkownik" + LABEL_USER_LOGO: "Logo:" + LABEL_USER_LOGO_TITLE: "Tytuł loga:" + LABEL_USER_LOGO_MESSAGE: "Logo (widok wiad.)" + LABEL_USER_CUSTOM_CSS: "Własny arkusz stylów:" + LEGEND_WELCOME_PAGE: "Str. główna" + LABEL_WELCOME_PAGE_TITLE: "Tytuł:" + LABEL_WELCOME_PAGE_URL: "Adres URL:" + LABEL_WELCOME_PAGE_DISPLAY: "Wyświetl:" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "nigdy" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "raz" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "zawsze" + HTML_ALERT_PREMIUM: "Ta opcja jest dostępna tylko dla licencji + Musisz zainstalować lub uruchomić na serwerze jedno z rozszerzeń PDO (SQLite / MySQL / PostgreSQL). + TAB_DOMAINS: + LEGEND_DOMAINS: "Domeny" + BUTTON_ADD_DOMAIN: "Dodaj domenę" + BUTTON_ADD_ALIAS: "Dodaj Alias" + DELETE_ARE_YOU_SURE: "Czy na pewno?" + HTML_DOMAINS_HELPER: | + Lista domen, do których można uzyskać dostęp poprzez tego klienta. +
+ Kliknij na nazwę, aby skonfigurować domenę. + TAB_SECURITY: + LEGEND_SECURITY: "Bezpieczeństwo" + LABEL_ALLOW_TWO_STEP: "Zezwól na dwuskładnikową autoryzację" + LABEL_FORCE_TWO_STEP: "Wymuś dwuskładnikową autoryzację" + LABEL_USE_IMAGE_PROXY: "Użyj lokalnego serwera proxy dla zewnętrznych obrazów" + LABEL_ALLOW_OPEN_PGP: "Zezwól na użycie OpenPGP" + LABEL_SHOW_PHP_INFO: "Pokaż informacje o wersji PHP" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Dane dostępowe panelu administracyjnego" + LABEL_CURRENT_PASSWORD: "Bieżące hasło:" + LABEL_NEW_LOGIN: "Nowy login:" + LABEL_NEW_PASSWORD: "Nowe hasło:" + LABEL_REPEAT_PASSWORD: "Powtórz hasło:" + BUTTON_UPDATE_PASSWORD: "Zaktualizuj hasło" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "Wymagaj sprawdzania poprawności certyfikatów SSL (IMAP/SMTP)" + LABEL_ALLOW_SELF_SIGNED: "Zezwól na używanie certyfikatów podpisanych przez siebie" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "Włącz obsługę platformy Google" + LABEL_GOOGLE_AUTH: "Autoryzacja" + LABEL_GOOGLE_DRIVE: "Obsługa dysku Google (widok tworz. wiadomości)" + LABEL_GOOGLE_PREVIEW: "Obsługa przeglądarki Google (podgląd dla plików: Microsoft Word, Excel i PowerPoint)" + LABEL_GOOGLE_CLIENT_ID: "Identyfikator:" + LABEL_GOOGLE_CLIENT_SECRET: "Hasło:" + LABEL_GOOGLE_API_KEY: "Klucz API:" + HINT_GOOGLE_API_KEY: "Wymagane dla obsługi interfejsu usługi: 'Dysk Google'" + LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "Włącz obsługę platformy Facebook (autoryzacja)" + LABEL_FACEBOOK_APP_ID: "Identyfikator aplikacji:" + LABEL_FACEBOOK_APP_SECRET: "Hasło aplikacji:" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "Włącz obsługę platformy Twitter (autoryzacja)" + LABEL_TWITTER_CONSUMER_KEY: "Klucz użytkownika:" + LABEL_TWITTER_CONSUMER_SECRET: "Hasło użytkownika:" + LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "Włącz obsługę platformy Dropbox" + LABEL_DROPBOX_API_KEY: "Klucz API:" + TOP_ALERT: "Szczegółowe informacje na temat obsługi platform, można znaleźść pod adresem: " + TAB_PLUGINS: + LEGEND_PLUGINS: "Wtyczki" + LABEL_ENABLE_PLUGINS: "Włącz obsługę wtyczek" + ALERT_NO_PLUGINS: "Nie zainstalowano żadnych wtyczek." + LINK_INSTALL_NEW: "Kliknij tutaj, aby zainstalować nowe wtyczki!" + HINT_CLICK_NAME: "Kliknij na nazwę, aby skonfigurować wtyczkę." + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "Aktualizacja" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Do zainstalowania" + LEGEND_INSTALLED_PACKAGES: "Zainstalowane" + ALERT_CANNOT_ACCESS_REPOSITORY: "Nie można uzyskać dostępu do repozytorium." + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "Domena:" + LABEL_VERSION: "Wersja:" + LABEL_CHECKING: "sprawdzanie..." + TYPE_BASIC_HINT: "Ta domena nie jest licencjonowana do użytku komercyjnego." + TYPE_BASIC_HINT_2: "Nie można dodać licencji dla tej domeny." + HTML_ALERT_TOP_1: "RainLoop Webmail korzysta z licencji:" + HTML_ALERT_TOP_2: "Możesz używać tego klienta za darmo, tylko dla prywatnych (własnych) projektów." + HTML_ALERT_TOP_3: | + Do komercyjnego użytku (używania dodatkowych opcji) RainLoop Webmail, wymagane jest posiadanie +
ważnej subskrypcji. + TYPE_PREMIUM_LIFETIME: "Dożywotnia" + LABEL_SUB_EXPIRES: "Subskrypcja wygasa:" + BUTTON_ACTIVATE: "Aktywuj klucz" + BUTTON_PURCHASE: "Kup klucz" + BUTTON_TRIAL: "Wersja testowa" + TAB_ABOUT: + LEGEND_ABOUT: "O skrypcie" + LABEL_TAG_HINT: "Prosty, nowoczesny i szybki klient pocztowy" + LABEL_ALL_RIGHTS_RESERVED: "Wszystkie prawa zastrzeżone." + HINT_READ_CHANGE_LOG: "Przed aktualizacją, proszę przeczytać listę zmian." + HINT_IS_UP_TO_DATE: "Klient RainLoop jest aktualny." + HTML_NEW_VERSION: "Dostępna jest nowa wersja: %VERSION%." + LABEL_UPDATING: "Aktualizowanie..." + LABEL_CHECKING: "Szukanie aktualizacji..." + BUTTON_UPDATE: "Zaktualizuj" + BUTTON_DOWNLOAD: "Pobierz" + BUTTON_CHANGELOG: "Lista zmian" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "Aktywacja klucza subskrypcji" + TITLE_ACTIVATION: "Aktywowanie..." + LABEL_DOMAIN: "Domena:" + LABEL_SUB_KEY: "Klucz subskrypcji:" + BUTTON_ACTIVATE: "Aktywuj" + LABEL_ACTIVATED: "Aktywowano" + ERROR_INVALID_SUBS_KEY: "Niepoprawny klucz subskrypcji" + SUBS_KEY_ACTIVATED: "Aktywowano klucz subskrypcji" + HTML_DESC: | + Subskrypcja premium dla domeny: %DOMAIN%, zostanie przedłużona po aktywacji. +
+ Zwróc uwagę, że klucz subskrypcji może być aktywowany tylko dla jednej domeny. +

+ Po uruchomieniu aktywacji, nie można jej przerwac lub anulować. + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "Dodaj Alias" + LABEL_ALIAS: "Alias" + LABEL_DOMAIN: "Domena" + BUTTON_CLOSE: "Zamknij" + BUTTON_ADD: "Dodaj" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "Dodawanie domeny" + TITLE_ADD_DOMAIN_WITH_NAME: "Dodawanie domeny: \"%NAME%\"" + TITLE_EDIT_DOMAIN: "Edycja domeny: \"%NAME%\"" + LABEL_NAME: "Nazwa" + NAME_HELPER: "obsługiwany znak wieloznaczności - *" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "Serwer:" + LABEL_PORT: "Port:" + LABEL_SECURE: "Rodzaj połączenia:" + LABEL_WHITE_LIST: "Biała lista" + SECURE_OPTION_NONE: "Bez zabezpieczeń" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "Zezwól na skrypty sieve" + LABEL_ALLOW_USER_SCRIPT: "Zezwól na spersonalizowany skrypt użytkownika" + LABEL_USE_SHORT_LOGIN: "Użyj krótkiego loginu" + LABEL_USE_AUTH: "Użyj autoryzacji" + LABEL_USE_PHP_MAIL: "Użyj funkcji php: 'mail()'" + BUTTON_TEST: "Test" + BUTTON_WHITE_LIST: "Biała lista" + BUTTON_SIEVE_CONFIGURATION: "Konfiguracja sieve" + BUTTON_BACK_TO_IMAP: "Powrót do ustawień serwera IMAP" + BUTTON_BACK: "Wstecz" + BUTTON_CLOSE: "Zamknij" + BUTTON_ADD: "Dodaj" + BUTTON_UPDATE: "Zaktualizuj" + NEW_DOMAIN_DESC: "Konfiguracja tej domeny pozwala na pracę
z adresami email: %NAME%" + WHITE_LIST_ALERT: | + Lista użytkowników domeny, którzy mogą uzyskać dostęp poprzez tego klienta. + Użyj spacji do rozdzielenia. + POPUPS_PLUGIN: + TITLE_PLUGIN: "Wtyczka: " + DESC_NOTHING_TO_CONFIGURE: "Brak opcji do skonfigurowania" + BUTTON_CLOSE: "Zamknij" + BUTTON_SAVE: "Zapisz" + TOOLTIP_ABOUT_TITLE: "O wtyczce" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "Czy na pewno chcesz zamknąć to okno?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Wybierz swój język" + HINTS: + BETA: "Beta" + UNSTABLE: "Niestabilna" + WARNING: "Ostrzeżenie!" + NOT_SUPPORTED: "nieobsługiwana" + REQUIRES_PHP_54: "Wymaga PHP w wersji 5.4 lub wyższej" + ERRORS: + DOMAIN_ALREADY_EXISTS: "Ta domena już istnieje" + UNKNOWN_ERROR: "Nieznany błąd" + NOTIFICATIONS: + INVALID_TOKEN: "Nieważny token" + AUTH_ERROR: "Autoryzacja zakończona niepowodzeniem" + ACCESS_ERROR: "Błąd dostępu" + CONNECTION_ERROR: "Nie można połączyć się z serwerem" + CAPTCHA_ERROR: "Niepoprawny kod CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- + Logowanie poprzez tą platformę, nie zostało jeszcze aktywowane dla żadnego + z kont e-mail. Zaloguj się używając loginu i hasła, a następnie włącz tą funkcję + w ustawieniach konta. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- + Logowanie poprzez tą platformę, nie zostało jeszcze aktywowane dla żadnego + z kont e-mail. Zaloguj się używając loginu i hasła, a następnie włącz tą funkcję + w ustawieniach konta. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- + Logowanie poprzez tą platformę, nie zostało jeszcze aktywowane dla żadnego + z kont e-mail. Zaloguj się używając loginu i hasła, a następnie włącz tą funkcję + w ustawieniach konta. + DOMAIN_NOT_ALLOWED: "Brak zezwolenia na użycie tej domeny" + ACCOUNT_NOT_ALLOWED: "Brak zezwolenia dla tego konta" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Wymagana dwuskładnikowa autoryzacja" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Błąd autoryzacji dwuskładnikowej" + COULD_NOT_SAVE_NEW_PASSWORD: "Nie można było zapisać nowego hasła" + CURRENT_PASSWORD_INCORRECT: "Bieżące hasło jest niepoprawne" + NEW_PASSWORD_SHORT: "Wybrane hasło jest za krótkie" + NEW_PASSWORD_WEAK: "Wybrane hasło jest zbyt proste" + NEW_PASSWORD_FORBIDDENT: "Wybrane hasło zawiera zakazane znaki" + CONTACTS_SYNC_ERROR: "Błąd synchronizacji kontaktów" + CANT_GET_MESSAGE_LIST: "Nie można pobrać listy wiadomości" + CANT_GET_MESSAGE: "Nie można pobrać wiadomości" + CANT_DELETE_MESSAGE: "Nie można usunąć wiadomości" + CANT_MOVE_MESSAGE: "Nie można przenieść wiadomości" + CANT_SAVE_MESSAGE: "Nie można zapisać wiadomości" + CANT_SEND_MESSAGE: "Nie można wysłać wiadomości" + INVALID_RECIPIENTS: "Niepoprawny adres odbiorcy" + CANT_SAVE_FILTERS: "Nie można zapisać filtrów" + CANT_GET_FILTERS: "Nie można pobrać filtrów" + FILTERS_ARE_NOT_CORRECT: "Brak poprawności filtrów" + CANT_CREATE_FOLDER: "Nie można utworzyć folderu" + CANT_RENAME_FOLDER: "Nie można zmienić nazwy folderu" + CANT_DELETE_FOLDER: "Nie można usunąć folderu" + CANT_DELETE_NON_EMPTY_FOLDER: "Nie można usunąć folderu, w którym znajduje się zawartość" + CANT_SUBSCRIBE_FOLDER: "Nie można zasubskrybować folderu" + CANT_UNSUBSCRIBE_FOLDER: "Nie można usunąć subskrypcji folderu" + CANT_SAVE_SETTINGS: "Nie można zapisać ustawień" + CANT_SAVE_PLUGIN_SETTINGS: "Nie można zapisać ustawień wtyczki" + DOMAIN_ALREADY_EXISTS: "Ta domena już istnieje" + CANT_INSTALL_PACKAGE: "Instalacja wtyczki zakończona niepowodzeniem" + CANT_DELETE_PACKAGE: "Usunięcie wtyczki zakończone niepowodzeniem" + INVALID_PLUGIN_PACKAGE: "Niepoprawna wtyczka" + UNSUPPORTED_PLUGIN_PACKAGE: "Nieobsługiwana wtyczka" + LICENSING_SERVER_IS_UNAVAILABLE: "Serwer aktywacji subskrypcji jest niedostępny" + LICENSING_DOMAIN_EXPIRED: "Subskrypcja dla tej domeny wygasła." + LICENSING_DOMAIN_BANNED: "Subskrypcja dla tej domeny została zawieszona." + DEMO_SEND_MESSAGE_ERROR: "Ze względów bezpieczeństwa, to konto nie posiada zezwolenia na wysyłanie wiadomości na zewnętrzne adresy e-mail!" + DEMO_ACCOUNT_ERROR: "Ze względów bezpieczeństwa, to konto nie posiada uprawnień do wykonania tego zadania!" + ACCOUNT_ALREADY_EXISTS: "To konto już istnieje" + ACCOUNT_DOES_NOT_EXIST: "Konto nie istnieje" + MAIL_SERVER_ERROR: "Wystąpił błąd podczas dostępu do serwera" + INVALID_INPUT_ARGUMENT: "Niepoprawny argument wejścia" + UNKNOWN_ERROR: "Nieznany błąd" + STATIC: + BACK_LINK: "Odśwież" + DOMAIN_LIST_DESC: "Lista domen, do których można uzyskać dostęp za pomocą tego klienta." + PHP_EXSTENSIONS_ERROR_DESC: "Brak wymaganych rozszerzeń w konfiguracji PHP!" + PHP_VERSION_ERROR_DESC: "Twoja wersja PHP: (%VERSION%), jest niższa niż minimalna: 5.3.0!" + NO_SCRIPT_TITLE: "Ta aplikacja do poprawnej pracy wymaga javascript-u." + NO_SCRIPT_DESC: | + Twoja przeglądarka nie obsługuje javascript-u. + Proszę o jego włączenie i ponowną próbę. + NO_COOKIE_TITLE: "Obsługa plików cookies jest wymagana dla poprawnego działania skryptu." + NO_COOKIE_DESC: | + Twoja przeglądarka nie obsługuje plików cookies. + Proszę o ich włączenie i ponowną próbę. + BAD_BROWSER_TITLE: "Posiadasz nieaktualną wersję przeglądarki." + BAD_BROWSER_DESC: | + W celu wykorzystania wszystkich funkcji tej aplikacji, + zaktualizuj aktualnie używaną lub pobierz i zainstaluj jedną z poniższych przeglądarek: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/pt_BR.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/pt_BR.yml new file mode 100755 index 00000000..0179fb8f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/pt_BR.yml @@ -0,0 +1,323 @@ +pt_BR: + LOGIN: + LABEL_LOGIN: "Usuário" + LABEL_PASSWORD: "Senha" + BUTTON_LOGIN: "Entrar no painel administrativo" + TOP_PANEL: + LABEL_PREMIUM: "Premium" + LABEL_ADMIN_PANEL: "Painel Administrativo" + TABS_LABELS: + LABEL_GENERAL_NAME: "Geral" + LABEL_LOGIN_NAME: "Login" + LABEL_BRANDING_NAME: "Personalizar" + LABEL_CONTACTS_NAME: "Contatos" + LABEL_DOMAINS_NAME: "Domínios" + LABEL_SECURITY_NAME: "Segurança" + LABEL_INTEGRATION_NAME: "Integrações" + LABEL_PLUGINS_NAME: "Plugins" + LABEL_PACKAGES_NAME: "Pacotes" + LABEL_LICENSING_NAME: "Licença" + LABEL_ABOUT_NAME: "Sobre" + TAB_GENERAL: + LEGEND_INTERFACE: "Interface" + LABEL_LANGUAGE: "Idioma" + LABEL_LANGUAGE_ADMIN: "Idioma (admin)" + LABEL_THEME: "Tema Padrão" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Permitir escolha do idioma na tela de configurações" + LABEL_ALLOW_THEMES_ON_SETTINGS: "Permitir escolha do tema na tela de configurações" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Permitir escolha de Imagem de Fundo na tela de configurações" + LABEL_NEW_FOLDER_MOVE: "Novo botão \"Mover para pasta\"" + LABEL_SHOW_THUMBNAILS: "Mostrar imagem miniatura (Anexos)" + LABEL_ALLOW_GRAVATAR: "Permitir Gravatar" + LEGEND_MAIN: "Principal" + LABEL_ATTACHMENT_SIZE_LIMIT: "Tamanho limite de anexo" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Permitir contas adicionais" + LABEL_ALLOW_IDENTITIES: "Permitir identidades multiplas" + LABEL_ALLOW_TEMPLATES: "Permitir templates" + ALERT_WARNING: "Aviso!" + HTML_ALERT_WEAK_PASSWORD: | + Você está usando a senha administrativa padrão. +
+ Por motivo de segurança por favor + troque a senha + agora. + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "Tela de entrada" + LABEL_DEFAULT_DOMAIN: "Domínio padrão" + LABEL_DETERMINE_USER_DOMAIN: "Tentar determinar o domínio do usuário" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Permitir escolha do idioma na tela de entrada" + LABEL_DETERMINE_USER_LANGUAGE: "Tentar determinar o idioma do usuário" + TAB_BRANDING: + LEGEND_BRANDING: "Personalização" + LABEL_PAGE_TITLE: "Título da página" + LABEL_LOADING_DESCRIPTION: "Descrição do 'carregando'" + LABEL_FAVICON_URL: "Favicon" + LEGEND_LOGIN: "Tela de Entrada" + LABEL_LOGIN_LOGO: "Logo" + LABEL_LOGIN_DESCRIPTION: "Descrição" + LABEL_LOGIN_BACKGROUND: "Imagem de fundo" + LABEL_LOGIN_CUSTOM_CSS: "CSS personalizado" + LABEL_LOGIN_SHOW_POWERED_LINK: "Mostrar link \"Powered by RainLoop\"" + LEGEND_USER: "Internas" + LABEL_USER_LOGO: "Logo" + LABEL_USER_LOGO_TITLE: "Título do logo" + LABEL_USER_LOGO_MESSAGE: "Logo (Visualização de Mensagens)" + LABEL_USER_CUSTOM_CSS: "CSS personalizado" + LEGEND_WELCOME_PAGE: "Página de boas-vindas" + LABEL_WELCOME_PAGE_TITLE: "Título" + LABEL_WELCOME_PAGE_URL: "URL" + LABEL_WELCOME_PAGE_DISPLAY: "Mostrar" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "Nunca" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Única vez" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Sempre" + HTML_ALERT_PREMIUM: "Essa funcionalidade está disponível apenas para usuários Premium." + TAB_CONTACTS: + LEGEND_CONTACTS: "Contatos" + LEGEND_STORAGE: "Armazenamento (PDO)" + LABEL_ENABLE_CONTACTS: "Habilitar contatos" + LABEL_ALLOW_SYNC: "Permitir sincronização de contatos (com servidor externo CardDAV)" + LABEL_STORAGE_TYPE: "Tipo" + LABEL_STORAGE_DSN: "Dsn" + LABEL_STORAGE_USER: "Usuário" + LABEL_STORAGE_PASSWORD: "Senha" + BUTTON_TEST: "Testar" + ALERT_NOTICE: "Aviso!" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Não use este tipo de banco de dados com um grande número de usuários ativos." + HTML_ALERT_DOES_NOT_SUPPORTED: | + O seu sistema não suporta o uso dos contatos. +
+ Você precisa instalar ou habilitar a extensão PDO (SQLite / MySQL / PostgreSQL) em seu servidor. + TAB_DOMAINS: + LEGEND_DOMAINS: "Domínios" + BUTTON_ADD_DOMAIN: "Adicionar Domínio" + BUTTON_ADD_ALIAS: "Adicionar apelido (Alias)" + DELETE_ARE_YOU_SURE: "Você tem certeza?" + HTML_DOMAINS_HELPER: | + Lista dos domínios com acesso permitido ao webmail. +
+ Clique no domínio para configurá-lo. + TAB_SECURITY: + LEGEND_SECURITY: "Segurança" + LABEL_ALLOW_TWO_STEP: "Permitir verificação em duas etapas (Login 2-Step)" + LABEL_FORCE_TWO_STEP: "Obrigar o uso da verificação em duas etapas" + LABEL_USE_IMAGE_PROXY: "Usar proxy local para imagens externas" + LABEL_ALLOW_OPEN_PGP: "Permitir OpenPGP" + LABEL_SHOW_PHP_INFO: "Mostar informações PHP" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Credenciais de acesso ao Painel Administrativo" + LABEL_CURRENT_PASSWORD: "Senha atual" + LABEL_NEW_LOGIN: "Usuário" + LABEL_NEW_PASSWORD: "Nova senha" + LABEL_REPEAT_PASSWORD: "Confirmar nova senha" + BUTTON_UPDATE_PASSWORD: "Atualizar" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "Exigir verificação do certificado SSL (IMAP/SMTP)" + LABEL_ALLOW_SELF_SIGNED: "Permitir certificados auto-assinados" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "Habilitar integração com o Google" + LABEL_GOOGLE_AUTH: "Autenticação" + LABEL_GOOGLE_DRIVE: "Integração com Google Drive (Anexos)" + LABEL_GOOGLE_PREVIEW: "Integração com Leitor Google (Pré-visualização para Microsoft Word, Excel e PowerPoint)" + LABEL_GOOGLE_CLIENT_ID: "Client ID" + LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" + LABEL_GOOGLE_API_KEY: "Api Key" + HINT_GOOGLE_API_KEY: "Requerido para o uso da seleção de arquivos do Google Drive" + LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "Habilitar integração com o Facebook (Autenticação)" + LABEL_FACEBOOK_APP_ID: "App ID" + LABEL_FACEBOOK_APP_SECRET: "App Secret" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "Habilitar integração com o Twitter (Autenticação)" + LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" + LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" + LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "Habilitar integração com o Dropbox" + LABEL_DROPBOX_API_KEY: "Api Key" + TOP_ALERT: "Informações detalhadas sobre as integrações em" + TAB_PLUGINS: + LEGEND_PLUGINS: "Plugins" + LABEL_ENABLE_PLUGINS: "Habilitar uso de plugins" + ALERT_NO_PLUGINS: "Nenhum plugin instalado." + LINK_INSTALL_NEW: "Clique aqui para instalar!" + HINT_CLICK_NAME: "Clique no nome para configurar o plugin." + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "Atualização disponível" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Disponíveis para instalação" + LEGEND_INSTALLED_PACKAGES: "Pacotes já instalados" + ALERT_CANNOT_ACCESS_REPOSITORY: "Não foi possível acessar o repositório no momento." + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "Seu domínio" + LABEL_VERSION: "Versão" + LABEL_CHECKING: "Checando" + TYPE_BASIC_HINT: "Esse domínio não está licenciado para uso comercial (com recursos adicionais)." + TYPE_BASIC_HINT_2: "Esse domínio não pode ser licenciado." + HTML_ALERT_TOP_1: "RainLoop Webmail é licenciado sob" + HTML_ALERT_TOP_2: "Você é livre para usá-lo em seus projetos pessoais." + HTML_ALERT_TOP_3: | + Uso comercial (com recursos adicionais) do RainLoop Webmail + requer uma assinatura. + TYPE_PREMIUM_LIFETIME: "Lifetime" + LABEL_SUB_EXPIRES: "A assinatura expira em" + BUTTON_ACTIVATE: "Ative a chave de assinatura para este domínio" + BUTTON_PURCHASE: "Comprar assinatura" + BUTTON_TRIAL: "Trial" + TAB_ABOUT: + LEGEND_ABOUT: "Sobre" + LABEL_TAG_HINT: "Leitor de email web simples, moderno & rápido." + LABEL_ALL_RIGHTS_RESERVED: "Todos os direitos reservados." + HINT_READ_CHANGE_LOG: "Por favor, leia o registro de alterações antes de atualizar." + HINT_IS_UP_TO_DATE: "RainLoop está atualizado." + HTML_NEW_VERSION: "Está disponível uma nova versão: %VERSION%." + LABEL_UPDATING: "Atualizando" + LABEL_CHECKING: "Checar por atualizações" + BUTTON_UPDATE: "Atualizar" + BUTTON_DOWNLOAD: "Baixar" + BUTTON_CHANGELOG: "Registro de alterações" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "Ativar chave de assinatura?" + TITLE_ACTIVATION: "Ativação..." + LABEL_DOMAIN: "Domínio" + LABEL_SUB_KEY: "Chave de assinatura" + BUTTON_ACTIVATE: "Ativar" + LABEL_ACTIVATED: "Ativado" + ERROR_INVALID_SUBS_KEY: "Chave de assinatura inválida" + SUBS_KEY_ACTIVATED: "Chave de assinatura ativada com sucesso" + HTML_DESC: | + Após a ativação, a assinatura premium para %DOMAIN% será extendida. +
+ Note que chave de assinatura é ativada apenas para um único domínio. +

+ Uma vez iniciado, o processo de ativação não poderá ser interrompido ou cancelado. + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "Adicionar apelido (Alias)" + LABEL_ALIAS: "Apelido (Alias)" + LABEL_DOMAIN: "Domínio" + BUTTON_CLOSE: "Fechar" + BUTTON_ADD: "Adicionar" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "Adicionar Domínio" + TITLE_ADD_DOMAIN_WITH_NAME: "Adicionar Domínio \"%NAME%\"" + TITLE_EDIT_DOMAIN: "Editar Domínio \"%NAME%\"" + LABEL_NAME: "Domínio" + NAME_HELPER: "curinga (wildcard) suportado" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "Servidor" + LABEL_PORT: "Porta" + LABEL_SECURE: "Criptografia" + LABEL_WHITE_LIST: "Lista branca" + SECURE_OPTION_NONE: "Nenhuma" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "Permitir scripts sieve" + LABEL_ALLOW_USER_SCRIPT: "Permitir scripts personalizados por usuários" + LABEL_USE_SHORT_LOGIN: "Usar login curto" + LABEL_USE_AUTH: "Usar autenticação" + LABEL_USE_PHP_MAIL: "Usar função php mail()" + BUTTON_TEST: "Testar" + BUTTON_WHITE_LIST: "Lista branca" + BUTTON_SIEVE_CONFIGURATION: "Configurações Sieve" + BUTTON_BACK_TO_IMAP: "Voltar para as configurações IMAP" + BUTTON_BACK: "Voltar" + BUTTON_CLOSE: "Fechar" + BUTTON_ADD: "Adicionar" + BUTTON_UPDATE: "Atualizar" + NEW_DOMAIN_DESC: "Esta configuração de domínio lhe permitirá trabalhar
com endereços de e-mail do %NAME%." + WHITE_LIST_ALERT: | + Filtrar com lista dos únicos usuários do domínio que terão acesso ao webmail. + Use um espaço como delimitador. + POPUPS_PLUGIN: + TITLE_PLUGIN: "Plugin" + DESC_NOTHING_TO_CONFIGURE: "Nada para configurar" + BUTTON_CLOSE: "Fechar" + BUTTON_SAVE: "Salvar" + TOOLTIP_ABOUT_TITLE: "Sobre" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "Você tem certeza que deseja fechar esta janela?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Selecionar idioma" + HINTS: + BETA: "beta" + UNSTABLE: "instável" + WARNING: "Aviso!" + NOT_SUPPORTED: "não suportado" + REQUIRES_PHP_54: "requer PHP 5.4 ou superior" + ERRORS: + DOMAIN_ALREADY_EXISTS: "Domínio já existente" + UNKNOWN_ERROR: "Erro desconhecido" + NOTIFICATIONS: + INVALID_TOKEN: "Senha inválida" + AUTH_ERROR: "Falha na autenticação" + ACCESS_ERROR: "Erro ao acessar" + CONNECTION_ERROR: "Não foi possível conectar ao servidor" + CAPTCHA_ERROR: "Verificação CAPTCHA inválido." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- + Esse usuário Facebook não está associado a nenhuma conta de email ainda. Entre + utilizando seu email e senha e habilite essa função em configurações de conta. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- + Esse usuário Twitter não está associado a nenhuma conta de email ainda. Entre + utilizando seu email e senha e habilite essa função em configurações de conta. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- + Esse usuário Google não está associado a nenhuma conta de email ainda. Entre + utilizando seu email e senha e habilite essa função em configurações de conta. + DOMAIN_NOT_ALLOWED: "Este domínio não é permitido" + ACCOUNT_NOT_ALLOWED: "Conta não permitida" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Verificação de duas etapas requerida" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Erro na verificação de duas etapas" + COULD_NOT_SAVE_NEW_PASSWORD: "Não foi possível salvar a nova senha" + CURRENT_PASSWORD_INCORRECT: "Senha atual incorreta" + NEW_PASSWORD_SHORT: "A senha é muito curta" + NEW_PASSWORD_WEAK: "A senha é muito fácil" + NEW_PASSWORD_FORBIDDENT: "A senha contém caracteres não permitidos" + CONTACTS_SYNC_ERROR: "Erro na sincronização dos contatos" + CANT_GET_MESSAGE_LIST: "Não foi possível obter a lista de mensagens" + CANT_GET_MESSAGE: "Não foi possível obter a mensagem" + CANT_DELETE_MESSAGE: "Não foi possível excluir a mensagem" + CANT_MOVE_MESSAGE: "Não foi possível mover a mensagem" + CANT_SAVE_MESSAGE: "Não foi possível salvar a mensagem" + CANT_SEND_MESSAGE: "Não foi possível enviar a mensagem" + INVALID_RECIPIENTS: "Destinatário inválido" + CANT_SAVE_FILTERS: "Não é possível salvar os filtros" + CANT_GET_FILTERS: "Não é possível obter os filtros" + FILTERS_ARE_NOT_CORRECT: "Os filtros não estão corretos" + CANT_CREATE_FOLDER: "Não foi possível criar a pasta" + CANT_RENAME_FOLDER: "Não foi possível renomear a pasta" + CANT_DELETE_FOLDER: "Não foi possível exluir a pasta" + CANT_DELETE_NON_EMPTY_FOLDER: "Não é possível excluir diretório não vazio" + CANT_SUBSCRIBE_FOLDER: "Não foi possível inscrever esta pasta" + CANT_UNSUBSCRIBE_FOLDER: "Não foi possível desinscrever esta pasta" + CANT_SAVE_SETTINGS: "Não foi possível salvar as configurações" + CANT_SAVE_PLUGIN_SETTINGS: "Não foi possível salvar as configurações" + DOMAIN_ALREADY_EXISTS: "O domínio já existe" + CANT_INSTALL_PACKAGE: "Erro ao instalar pacote de plugin" + CANT_DELETE_PACKAGE: "Erro ao remover pacote de plugin" + INVALID_PLUGIN_PACKAGE: "Pacote de plugins inválido" + UNSUPPORTED_PLUGIN_PACKAGE: "Pacote de plugins insuportados" + LICENSING_SERVER_IS_UNAVAILABLE: "A assinatura do servidor está indisponível" + LICENSING_DOMAIN_EXPIRED: "A assinatura para este domínio expirou." + LICENSING_DOMAIN_BANNED: "A assinatura para este domínio é proibida." + DEMO_SEND_MESSAGE_ERROR: "Por motivos de segurança, esta conta demo não tem permissão para enviar mensagens para endereços de e-mail externo!" + DEMO_ACCOUNT_ERROR: "Por motivos de segurança, esta conta não tem permição para esta ação!" + ACCOUNT_ALREADY_EXISTS: "Esta conta já existe" + ACCOUNT_DOES_NOT_EXIST: "Conta não existente" + MAIL_SERVER_ERROR: "Ocorreu um erro ao acessar o servidor de e-mail" + INVALID_INPUT_ARGUMENT: "Argumento de entrada inválido" + UNKNOWN_ERROR: "Erro desconhecido" + STATIC: + BACK_LINK: "Recarregar" + DOMAIN_LIST_DESC: "A lista de domínios de webmail tem permissão para acessar." + PHP_EXSTENSIONS_ERROR_DESC: "Extensões necessárias PHP não estão disponíveis na sua configuração do PHP!" + PHP_VERSION_ERROR_DESC: "Sua versão PHP (%VERSION%) é menor do que o mínimo exigido 5.3.0!" + NO_SCRIPT_TITLE: "JavaScript é necessário para esta aplicação." + NO_SCRIPT_DESC: | + O JavaScript não está disponível em seu navegador. + Por favor ative o suporte a JavaScript nas configurações do seu navegador e tente novamente. + NO_COOKIE_TITLE: "É necessário suporte a cookies para esta aplicação." + NO_COOKIE_DESC: | + Os Cookies não estão disponíveis em seu navegador. + Por favor ative o suporte a Cookies nas configurações do seu navegador e tente novamente. + BAD_BROWSER_TITLE: "Seu navegador está desatualizado." + BAD_BROWSER_DESC: | + Para usar todos os recursos do aplicativo, + baixe e instale um desses navegadores: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/ru_RU.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/ru_RU.yml new file mode 100755 index 00000000..17bfde0f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/ru_RU.yml @@ -0,0 +1,323 @@ +ru_RU: + LOGIN: + LABEL_LOGIN: "Логин" + LABEL_PASSWORD: "Пароль" + BUTTON_LOGIN: "Войти в админ панель" + TOP_PANEL: + LABEL_PREMIUM: "Премиум" + LABEL_ADMIN_PANEL: "Админка" + TABS_LABELS: + LABEL_GENERAL_NAME: "Основные" + LABEL_LOGIN_NAME: "Логин" + LABEL_BRANDING_NAME: "Брендинг" + LABEL_CONTACTS_NAME: "Контакты" + LABEL_DOMAINS_NAME: "Домены" + LABEL_SECURITY_NAME: "Безопасность" + LABEL_INTEGRATION_NAME: "Интеграция" + LABEL_PLUGINS_NAME: "Плагины" + LABEL_PACKAGES_NAME: "Пакеты" + LABEL_LICENSING_NAME: "Лицензия" + LABEL_ABOUT_NAME: "О Программе" + TAB_GENERAL: + LEGEND_INTERFACE: "Интерфейс" + LABEL_LANGUAGE: "Язык" + LABEL_LANGUAGE_ADMIN: "Язык (Админ)" + LABEL_THEME: "Тема" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Разрешить выбор языка на экране настроек" + LABEL_ALLOW_THEMES_ON_SETTINGS: "Разрешить выбор темы на экране настроек" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Allow background selection on settings screen" + LABEL_NEW_FOLDER_MOVE: "Новая кнопка \"переместить в папку\"" + LABEL_SHOW_THUMBNAILS: "Показывать миниатюры (для вложений)" + LABEL_ALLOW_GRAVATAR: "Разрешить граватары" + LEGEND_MAIN: "Основное" + LABEL_ATTACHMENT_SIZE_LIMIT: "Предельный размер вложений" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Разрешить дополнительные аккаунты" + LABEL_ALLOW_IDENTITIES: "Разрешить множественные профили" + LABEL_ALLOW_TEMPLATES: "Разрешить шаблоны" + ALERT_DATA_ACCESS: "Папка данных RainLoop доступна. Пожалуйста, настройте свой веб-сервер так, чтобы скрыть папку данных с внешнего доступа. Подробнее здесь:" + ALERT_WARNING: "Внимание!" + HTML_ALERT_WEAK_PASSWORD: | + Вы используете пароль администратора по умолчанию. +
+ По соображениям безопасности, пожалуйста, + измените пароль прямо сейчас. + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "Cтраница Входа" + LABEL_DEFAULT_DOMAIN: "Основной домен" + LABEL_DETERMINE_USER_DOMAIN: "Пытаться определить домен пользователя" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Разрешить выбор языка на странице входа" + LABEL_DETERMINE_USER_LANGUAGE: "Пытаться определить язык пользователя" + TAB_BRANDING: + LEGEND_BRANDING: "Брендинг" + LABEL_PAGE_TITLE: "Название страницы" + LABEL_LOADING_DESCRIPTION: "Описание при загрузке" + LABEL_FAVICON_URL: "Иконка (favicon)" + LEGEND_LOGIN: "Экран входа" + LABEL_LOGIN_LOGO: "Логотип" + LABEL_LOGIN_DESCRIPTION: "Описание" + LABEL_LOGIN_BACKGROUND: "Фоновая картинка" + LABEL_LOGIN_CUSTOM_CSS: "Кастомный CSS" + LABEL_LOGIN_SHOW_POWERED_LINK: "Показывать ссылку \"Powered by RainLoop\"" + LEGEND_USER: "Экран пользователя" + LABEL_USER_LOGO: "Логотип" + LABEL_USER_LOGO_TITLE: "Название логотипа" + LABEL_USER_LOGO_MESSAGE: "Логотип (Message View)" + LABEL_USER_CUSTOM_CSS: "Кастомный CSS" + LEGEND_WELCOME_PAGE: "Приветствие" + LABEL_WELCOME_PAGE_TITLE: "Название" + LABEL_WELCOME_PAGE_URL: "URL" + LABEL_WELCOME_PAGE_DISPLAY: "Показывать" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "Никогда" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Один раз" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Всегда" + HTML_ALERT_PREMIUM: "Эти функции доступны для премиум подписчиков." + TAB_CONTACTS: + LEGEND_CONTACTS: "Контакты" + LEGEND_STORAGE: "Хранилище (PDO)" + LABEL_ENABLE_CONTACTS: "Включить контакты" + LABEL_ALLOW_SYNC: "Разрешить синхронизацию контактов (с внешним CardDAV сервером)" + LABEL_STORAGE_TYPE: "Тип" + LABEL_STORAGE_DSN: "Dsn" + LABEL_STORAGE_USER: "Пользователь" + LABEL_STORAGE_PASSWORD: "Пароль" + BUTTON_TEST: "Тест" + ALERT_NOTICE: "Внимание!" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Не используйте этот тип базы данных с большим числом активных пользователей." + HTML_ALERT_DOES_NOT_SUPPORTED: | + Ваша система не поддерживает контакты. +
+ Вам необходимо установить или включить PDO (SQLite / MySQL / PostgreSQL) расширения на вашем сервере. + TAB_DOMAINS: + LEGEND_DOMAINS: "Домены" + BUTTON_ADD_DOMAIN: "Добавить домен" + BUTTON_ADD_ALIAS: "Добавить Алиас" + DELETE_ARE_YOU_SURE: "Вы уверены?" + HTML_DOMAINS_HELPER: | + Список доменов к которым разрешен доступ. +
+ Нажмите на имя, чтобы настроить домен. + TAB_SECURITY: + LEGEND_SECURITY: "Безопасность" + LABEL_ALLOW_TWO_STEP: "Разрешить 2-шаговую проверку" + LABEL_FORCE_TWO_STEP: "Форсировать 2-шаговую проверку" + LABEL_USE_IMAGE_PROXY: "Использовать локальный прокси для внешних изображений" + LABEL_ALLOW_OPEN_PGP: "Разрешить OpenPGP" + LABEL_SHOW_PHP_INFO: "Показать PHP информацию" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Admin Panel Access Credentials" + LABEL_CURRENT_PASSWORD: "Текущий пароль" + LABEL_NEW_LOGIN: "Новый логин" + LABEL_NEW_PASSWORD: "Новый пароль" + LABEL_REPEAT_PASSWORD: "Повторить пароль" + BUTTON_UPDATE_PASSWORD: "Обновить пароль" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "Требовать проверку SSL сертификата для IMAP и SMTP" + LABEL_ALLOW_SELF_SIGNED: "Разрешить cамоподписанные сертификаты" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "Включить Google интеграцию" + LABEL_GOOGLE_AUTH: "Авторизация" + LABEL_GOOGLE_DRIVE: "Google диск интеграция (Экран нового сообщения)" + LABEL_GOOGLE_PREVIEW: "Google просмотрщик интеграция (Превью для Microsoft Word, Excel и PowerPoint файлов)" + LABEL_GOOGLE_CLIENT_ID: "Client ID" + LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" + LABEL_GOOGLE_API_KEY: "Api Key" + HINT_GOOGLE_API_KEY: "Требуется для Google Drive File Picker" + LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "Включить Facebook интеграцию (Авторизация)" + LABEL_FACEBOOK_APP_ID: "App ID" + LABEL_FACEBOOK_APP_SECRET: "App Secret" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "Включить Twitter интеграцию (Авторизация)" + LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" + LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" + LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "Включить Dropbox интеграцию" + LABEL_DROPBOX_API_KEY: "Api Key" + TOP_ALERT: "Подробная информация о социальной интеграции находится на" + TAB_PLUGINS: + LEGEND_PLUGINS: "Плагины" + LABEL_ENABLE_PLUGINS: "Включить плагины" + ALERT_NO_PLUGINS: "Плагины пока не установлены." + LINK_INSTALL_NEW: "Нажмите здесь, чтобы установить плагин" + HINT_CLICK_NAME: "Нажмите на имя, чтобы настроить плагин." + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "Доступно для обновления" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Доступно для установки" + LEGEND_INSTALLED_PACKAGES: "Установленные пакеты" + ALERT_CANNOT_ACCESS_REPOSITORY: "Не удается получить доступ к хранилищу пакетов в данный момент." + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "Ваш домен" + LABEL_VERSION: "Версия" + LABEL_CHECKING: "Проверка" + TYPE_BASIC_HINT: "Этот домен не имеет лицензию для коммерческого использования (с дополнительными функциями)." + TYPE_BASIC_HINT_2: "Этот домен не может быть лицензирован." + HTML_ALERT_TOP_1: "Код RainLoop Webmail лицензирован под" + HTML_ALERT_TOP_2: "Вы можете свободно использовать его в своих личных проектах." + HTML_ALERT_TOP_3: | + Коммерческое использование (с дополнительными функциями) RainLoop Webmail требует получение + лицензии. + TYPE_PREMIUM_LIFETIME: "бесконечная" + LABEL_SUB_EXPIRES: "Подписка истекает" + BUTTON_ACTIVATE: "Активировать ключ для этого домена" + BUTTON_PURCHASE: "Купить" + BUTTON_TRIAL: "Пробная лицензия" + TAB_ABOUT: + LEGEND_ABOUT: "О программе" + LABEL_TAG_HINT: "Простой, современный и быстрый веб-клиент электронной почты\n" + LABEL_ALL_RIGHTS_RESERVED: "Все права защищены." + HINT_READ_CHANGE_LOG: "Пожалуйста, ознакомьтесь с изменениями перед обновлением.\n" + HINT_IS_UP_TO_DATE: "Версия RainLoop актуальна." + HTML_NEW_VERSION: "Новая %VERSION% версия доступна." + LABEL_UPDATING: "Обновление" + LABEL_CHECKING: "Проверка" + BUTTON_UPDATE: "Обновить" + BUTTON_DOWNLOAD: "Скачать" + BUTTON_CHANGELOG: "Изменения" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "Активировать ключ подписки?" + TITLE_ACTIVATION: "Активация..." + LABEL_DOMAIN: "Домен" + LABEL_SUB_KEY: "Ключ подписки" + BUTTON_ACTIVATE: "Активировать" + LABEL_ACTIVATED: "Активировано" + ERROR_INVALID_SUBS_KEY: "Неверный ключ подписки" + SUBS_KEY_ACTIVATED: "Ключ подписки активирован удачно" + HTML_DESC: | + После активации премиум подписка для %DOMAIN% будет продлена. +
+ Обратите внимание, что ключ может быть активирован только один раз. +

+ После запуска процесс активации не может быть прерван или отменен. + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "Добавить Алиас" + LABEL_ALIAS: "Алиас" + LABEL_DOMAIN: "Домен" + BUTTON_CLOSE: "Закрыть" + BUTTON_ADD: "Добавить" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "Добавить домен" + TITLE_ADD_DOMAIN_WITH_NAME: "Добавить домен \"%NAME%\"" + TITLE_EDIT_DOMAIN: "Редактировать домен \"%NAME%\"" + LABEL_NAME: "Имя" + NAME_HELPER: "wildcard supported" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "Сервер" + LABEL_PORT: "Порт" + LABEL_SECURE: "Безопасность" + LABEL_WHITE_LIST: "Белый список" + SECURE_OPTION_NONE: "Нет" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "Разрешить sieve скрипты" + LABEL_ALLOW_USER_SCRIPT: "Разрешить использовать пользовательский sieve скрипт" + LABEL_USE_SHORT_LOGIN: "Использовать короткий логин" + LABEL_USE_AUTH: "Использовать аутентификацию" + LABEL_USE_PHP_MAIL: "Использовать mail() функцию" + BUTTON_TEST: "Тест" + BUTTON_WHITE_LIST: "Белый список" + BUTTON_SIEVE_CONFIGURATION: "настройки Sieve" + BUTTON_BACK_TO_IMAP: "Назад к IMAP настройкам" + BUTTON_BACK: "Назад" + BUTTON_CLOSE: "Закрыть" + BUTTON_ADD: "Добавить" + BUTTON_UPDATE: "Обновить" + NEW_DOMAIN_DESC: "Эта конфигурация позволит вам работать
с %NAME% адресами." + WHITE_LIST_ALERT: | + Список пользователей домена к которым разрешен доступ. + Используйте пробел в качестве разделителя. + POPUPS_PLUGIN: + TITLE_PLUGIN: "Плагин" + DESC_NOTHING_TO_CONFIGURE: "Без настроек" + BUTTON_CLOSE: "Закрыть" + BUTTON_SAVE: "Сохранить" + TOOLTIP_ABOUT_TITLE: "О плагине" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "Вы уверены, что хотите закрыть это окно?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Выберите язык" + HINTS: + BETA: "beta" + UNSTABLE: "unstable" + WARNING: "Внимание!" + NOT_SUPPORTED: "не поддерживается" + REQUIRES_PHP_54: "требует PHP 5.4 или выше" + ERRORS: + DOMAIN_ALREADY_EXISTS: "Домен уже существует" + UNKNOWN_ERROR: "Неизвестная ошибка" + NOTIFICATIONS: + INVALID_TOKEN: "Неверный токен запроса" + AUTH_ERROR: "Не удалось авторизоваться" + ACCESS_ERROR: "Ошибка доступа" + CONNECTION_ERROR: "Ошибка соединения с сервером." + CAPTCHA_ERROR: "Неправильное проверочное слово." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + К данному социальному пользователю еще не прикреплен почтовый аккаунт. Войдите + в систему под своим почтовым аккаунтом и включите эту возможность в настройках. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + К данному социальному пользователю еще не прикреплен почтовый аккаунт. Войдите + в систему под своим почтовым аккаунтом и включите эту возможность в настройках. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + К данному социальному пользователю еще не прикреплен почтовый аккаунт. Войдите + в систему под своим почтовым аккаунтом и включите эту возможность в настройках. + DOMAIN_NOT_ALLOWED: "Данный домен не разрешен" + ACCOUNT_NOT_ALLOWED: "Данный аккаунт не разрешен" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Необходима двухфакторная верификация" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Ошибка двухфакторной верификации" + COULD_NOT_SAVE_NEW_PASSWORD: "Не удалось сохранить новый пароль" + CURRENT_PASSWORD_INCORRECT: "Текущий пароль неверный" + NEW_PASSWORD_SHORT: "Пароль слишком короткий" + NEW_PASSWORD_WEAK: "Пароль слишком простой" + NEW_PASSWORD_FORBIDDENT: "Пароль содержит запрещенные символы" + CONTACTS_SYNC_ERROR: "Ошибка синхронизации контактов" + CANT_GET_MESSAGE_LIST: "Не могу получить список писем" + CANT_GET_MESSAGE: "Не могу получить письмо" + CANT_DELETE_MESSAGE: "Не могу удалить письмо" + CANT_MOVE_MESSAGE: "Не могу переместить письмо" + CANT_SAVE_MESSAGE: "Не могу сохранить письмо" + CANT_SEND_MESSAGE: "Не могу отправить письмо" + INVALID_RECIPIENTS: "Проверьте правильность ввода всех адресов." + CANT_SAVE_FILTERS: "Не могу сохранить фильтры" + CANT_GET_FILTERS: "Не могу загрузить фильтры" + FILTERS_ARE_NOT_CORRECT: "Фильтры неправильны" + CANT_CREATE_FOLDER: "Не могу создать папку" + CANT_RENAME_FOLDER: "Не могу переименовать папку" + CANT_DELETE_FOLDER: "Не могу удалить папку" + CANT_DELETE_NON_EMPTY_FOLDER: "Не могу удалить непустую папку" + CANT_SUBSCRIBE_FOLDER: "Не могу подписать папку" + CANT_UNSUBSCRIBE_FOLDER: "Не могу отписать папку" + CANT_SAVE_SETTINGS: "Не могу сохранить настройки" + CANT_SAVE_PLUGIN_SETTINGS: "Не могу сохранить настройки" + DOMAIN_ALREADY_EXISTS: "Домен уже существует" + CANT_INSTALL_PACKAGE: "Ошибка установки пакета" + CANT_DELETE_PACKAGE: "Ошибка удаления пакета" + INVALID_PLUGIN_PACKAGE: "Ошибка пакета плагина" + UNSUPPORTED_PLUGIN_PACKAGE: "Для работы плагина необходима полная поддержка сервера" + LICENSING_SERVER_IS_UNAVAILABLE: "Сервер подписок временно не доступен." + LICENSING_DOMAIN_EXPIRED: "Подписка на данный домен устарела." + LICENSING_DOMAIN_BANNED: "Подписка на данный домен заблокирована." + DEMO_SEND_MESSAGE_ERROR: "Демо аккаунту отправка писем на внешние почтовые адреса запрещена!" + DEMO_ACCOUNT_ERROR: "По соображениям безопасности данный аккаунт не может выполнить это действие." + ACCOUNT_ALREADY_EXISTS: "Аккаунт уже добавлен" + ACCOUNT_DOES_NOT_EXIST: "Аккаунт не существует" + MAIL_SERVER_ERROR: "Ошибка доступа к почтовому серверу" + INVALID_INPUT_ARGUMENT: "Неверный параметр" + UNKNOWN_ERROR: "Неизвестная ошибка" + STATIC: + BACK_LINK: "Обновить" + DOMAIN_LIST_DESC: "Список доменов, к которым разрешен доступ через веб почту." + PHP_EXSTENSIONS_ERROR_DESC: "Необходимые расширения PHP не установлены на вашем сервере!" + PHP_VERSION_ERROR_DESC: "Ваша версия PHP (%VERSION%) ниже требуемой 5.3.0!" + NO_SCRIPT_TITLE: "Для работы приложения необходим JavaScript." + NO_SCRIPT_DESC: | + По-видимому, JavaScript либо не поддерживается вашим браузером, либо отключен. + Включите JavaScript, изменив настройки браузера, затем повторите попытку. + NO_COOKIE_TITLE: "Для работы приложения необходимы Cookie." + NO_COOKIE_DESC: | + По-видимому, Cookie либо не поддерживаются вашим браузером, либо отключены. + Включите Cookie, изменив настройки браузера, затем повторите попытку. + BAD_BROWSER_TITLE: "Ваш браузер устарел." + BAD_BROWSER_DESC: | + Чтобы использовать все возможности приложения, + загрузите и установите один из этих браузеров diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sk_SK.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sk_SK.yml new file mode 100755 index 00000000..dfe63b1a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sk_SK.yml @@ -0,0 +1,204 @@ +sk_SK: + LOGIN: + LABEL_LOGIN: "Používateľské meno" + LABEL_PASSWORD: "Heslo" + BUTTON_LOGIN: "Prihlásiť sa do admin panelu" + TOP_PANEL: + LABEL_ADMIN_PANEL: "Admin Panel" + TABS_LABELS: + LABEL_GENERAL_NAME: "Všeobecné" + LABEL_LOGIN_NAME: "Používateľské meno" + LABEL_BRANDING_NAME: "Branding" + LABEL_CONTACTS_NAME: "Kontakty" + LABEL_DOMAINS_NAME: "Domény" + LABEL_SECURITY_NAME: "Zabezpečenie" + LABEL_INTEGRATION_NAME: "Integrácie" + LABEL_PACKAGES_NAME: "Balíčky" + LABEL_LICENSING_NAME: "Licencovanie" + LABEL_ABOUT_NAME: "O programe" + TAB_GENERAL: + LEGEND_INTERFACE: "Rozhranie" + LABEL_LANGUAGE: "Jazyk" + LABEL_LANGUAGE_ADMIN: "Jazyk (admin)" + LABEL_THEME: "Téma" + LEGEND_MAIN: "Všeobecné" + LABEL_ALLOW_TEMPLATES: "Povoliť šablóny" + ALERT_WARNING: "Upozornenie!" + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "Prihlasovacia obrazovka" + LABEL_DEFAULT_DOMAIN: "Predvolená doména" + TAB_BRANDING: + LABEL_FAVICON_URL: "Favicon" + LEGEND_LOGIN: "Používateľské meno" + LABEL_LOGIN_LOGO: "Logo" + LABEL_LOGIN_DESCRIPTION: "Popis" + LABEL_LOGIN_BACKGROUND: "Pozadie" + LABEL_LOGIN_CUSTOM_CSS: "Vlastné CSS" + LABEL_LOGIN_SHOW_POWERED_LINK: "Zobraziť link \"Powered by RainLoop\"" + LEGEND_USER: "Užívateľ" + LABEL_USER_LOGO: "Logo" + LABEL_USER_CUSTOM_CSS: "Vlastné CSS" + LEGEND_WELCOME_PAGE: "Uvítacia stránka" + LABEL_WELCOME_PAGE_TITLE: "Nadpis" + LABEL_WELCOME_PAGE_URL: "URL" + LABEL_WELCOME_PAGE_DISPLAY: "Zobraziť" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "Žiadne" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Jednorázovo" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Vždy" + TAB_CONTACTS: + LEGEND_CONTACTS: "Kontakty" + LABEL_ENABLE_CONTACTS: "Zapnúť kontakty" + LABEL_STORAGE_TYPE: "Typ" + LABEL_STORAGE_DSN: "Dsn" + LABEL_STORAGE_USER: "Užívateľ" + LABEL_STORAGE_PASSWORD: "Heslo" + BUTTON_TEST: "Test" + TAB_DOMAINS: + LEGEND_DOMAINS: "Domény" + BUTTON_ADD_DOMAIN: "Pridať doménu" + BUTTON_ADD_ALIAS: "Pridať alias" + DELETE_ARE_YOU_SURE: "Ste si istí?" + TAB_SECURITY: + LEGEND_SECURITY: "Bezpečnosť" + LABEL_CURRENT_PASSWORD: "Súčasné heslo" + LABEL_NEW_PASSWORD: "Nové heslo" + LABEL_REPEAT_PASSWORD: "Opakovať" + LEGEND_SSL: "SSL" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_GOOGLE_AUTH: "Overenie" + LABEL_GOOGLE_CLIENT_ID: "ID klienta" + LABEL_GOOGLE_API_KEY: "Api kľúč" + LEGEND_FACEBOOK: "Facebook" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "Povoliť Twitter intergáciu (overenie)" + LEGEND_DROPBOX: "Dropbox" + LABEL_DROPBOX_API_KEY: "Api kľúč" + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "Dostupné na aktualizáciu" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Dostupné na inštaláciu" + LEGEND_INSTALLED_PACKAGES: "Nainštalované balíčky" + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "Vaša doména" + LABEL_VERSION: "Verzia" + LABEL_CHECKING: "Kontrolujem" + TYPE_BASIC_HINT_2: "Táto doména nemôže byť licencovaná" + HTML_ALERT_TOP_1: "RainLoop Webmail je licencovaný pod" + TYPE_PREMIUM_LIFETIME: "Doživotná" + BUTTON_PURCHASE: "Kúpiť" + BUTTON_TRIAL: "Skúšobná verzia" + TAB_ABOUT: + LABEL_TAG_HINT: "Jednoduchý, moderný a rýchly webmail klient" + LABEL_ALL_RIGHTS_RESERVED: "Všetky práva vyhradené." + HINT_READ_CHANGE_LOG: "Prosím prečítajte si zoznam zmien pred aktualizáciou." + HINT_IS_UP_TO_DATE: "RainLoop je aktuálny." + HTML_NEW_VERSION: "Dostupná nová %VERSION% verzia." + LABEL_UPDATING: "Aktualizujem" + LABEL_CHECKING: "Kontrolujem aktualizácie" + BUTTON_UPDATE: "Aktualizovať" + BUTTON_DOWNLOAD: "Stiahnuť" + BUTTON_CHANGELOG: "Zoznam zmien" + POPUPS_ACTIVATE: + TITLE_ACTIVATION: "Aktivácia..." + LABEL_DOMAIN: "Doména" + BUTTON_ACTIVATE: "Aktivovať" + LABEL_ACTIVATED: "Aktivované" + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "Pridať alias" + LABEL_ALIAS: "Alias" + LABEL_DOMAIN: "Doména" + BUTTON_CLOSE: "Zatvoriť" + BUTTON_ADD: "Pridať" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "Pridať doménu" + TITLE_ADD_DOMAIN_WITH_NAME: "Pridať doménu \"%NAME%\"" + TITLE_EDIT_DOMAIN: "Upraviť doménu \"%NAME%\"" + LABEL_NAME: "Meno" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "Server" + LABEL_PORT: "Port" + LABEL_SECURE: "Bezpečné" + SECURE_OPTION_NONE: "Žiadne" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_USE_SHORT_LOGIN: "Použiť skrátené prihlásenie" + LABEL_USE_AUTH: "Použiť overenie" + LABEL_USE_PHP_MAIL: "Použiť php mail() funkciu" + BUTTON_TEST: "Test" + BUTTON_SIEVE_CONFIGURATION: "Uložiť nastavenia" + BUTTON_BACK_TO_IMAP: "Späť do IMAP nastavení" + BUTTON_BACK: "Späť" + BUTTON_CLOSE: "Zatvoriť" + BUTTON_ADD: "Pridať" + BUTTON_UPDATE: "Aktualizovať" + POPUPS_PLUGIN: + BUTTON_CLOSE: "Zatvoriť" + BUTTON_SAVE: "Uložiť" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Zvoľte jazyk" + HINTS: + BETA: "beta" + UNSTABLE: "nestabilné" + WARNING: "Upozornenie!" + NOT_SUPPORTED: "nie je podporované" + REQUIRES_PHP_54: "vyžaduje PHP 5.4 alebo vyššie" + ERRORS: + DOMAIN_ALREADY_EXISTS: "Táto Doména už existuje" + UNKNOWN_ERROR: "Neznáma chyba" + NOTIFICATIONS: + INVALID_TOKEN: "Neplatný token" + AUTH_ERROR: "Overenie zlyhalo" + ACCESS_ERROR: "Chyba prístupu" + CONNECTION_ERROR: "Nepodarilo sa pripojiť k serveru" + CAPTCHA_ERROR: "Nesprávne CAPTCHA." + DOMAIN_NOT_ALLOWED: "Doména nie je povolená" + ACCOUNT_NOT_ALLOWED: "Účet nie je povolený" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Dvojfaktorové overenie vyžadované" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Chyba dvojfaktorového overenia" + COULD_NOT_SAVE_NEW_PASSWORD: "Nepodarilo sa uložiť nové heslo" + CURRENT_PASSWORD_INCORRECT: "Chybné aktuálne heslo" + NEW_PASSWORD_SHORT: "Heslo je príliš krátke" + NEW_PASSWORD_WEAK: "Heslo je príliš jednoduché" + NEW_PASSWORD_FORBIDDENT: "Heslo obsahuje nepovolené znaky" + CONTACTS_SYNC_ERROR: "Chyba synchronizovania kontaktov" + CANT_GET_MESSAGE_LIST: "Chyba pri vytváraní zoznamu správ." + CANT_GET_MESSAGE: "Správu sa nepodarilo načítať" + CANT_DELETE_MESSAGE: "Správu sa nepodarilo odstrániť" + CANT_MOVE_MESSAGE: "Správu sa nepodarilo presunúť" + CANT_SAVE_MESSAGE: "Správu sa nepodarilo uložiť" + CANT_SEND_MESSAGE: "Správu sa nepodarilo odoslať" + INVALID_RECIPIENTS: "Neplatný príjemcovia" + CANT_SAVE_FILTERS: "Nepodarilo sa uložiť filtre" + CANT_GET_FILTERS: "Nepodarilo sa načítať filtre" + FILTERS_ARE_NOT_CORRECT: "Filtre nie sú správne" + CANT_CREATE_FOLDER: "Priečinok sa nepodarilo vytvoriť" + CANT_RENAME_FOLDER: "Priečinok sa nepodarilo premenovať" + CANT_DELETE_FOLDER: "Priečinok sa nepodarilo odstrániť" + CANT_DELETE_NON_EMPTY_FOLDER: "Nemôžem odstrániť neprázdny priečinok" + CANT_SAVE_SETTINGS: "Nastavenia sa nepodarilo uložiť" + CANT_SAVE_PLUGIN_SETTINGS: "Nastavenia sa nepodarilo uložiť" + DOMAIN_ALREADY_EXISTS: "Táto Doména už existuje" + CANT_INSTALL_PACKAGE: "Inštalácia balíčka zlyhala" + CANT_DELETE_PACKAGE: "Odstránenie balíčka zlyhalo" + LICENSING_DOMAIN_EXPIRED: "Prihlásenie pre túto doménu vypršalo." + LICENSING_DOMAIN_BANNED: "Prihlásenie pre túto doménu je zablokované." + ACCOUNT_ALREADY_EXISTS: "Účet už existuje" + ACCOUNT_DOES_NOT_EXIST: "Účet neexistuje" + MAIL_SERVER_ERROR: "Nastala chyba počas prístupu na poštový server" + UNKNOWN_ERROR: "Neznáma chyba" + STATIC: + BACK_LINK: "Obnoviť" + DOMAIN_LIST_DESC: "Zoznam domén ku ktorým je povolené pristupovať cez webmail." + PHP_EXSTENSIONS_ERROR_DESC: "Vyžadované PHP rozšírenia nie sú dostupné vo vašej PHP konfigurácii!" + PHP_VERSION_ERROR_DESC: "Vaša PHP verzia (%VERSION%) je nižšia ako minimálne vyžadovaná 5.3.0!" + NO_SCRIPT_TITLE: "Táto aplikácia vyžaduje JavaScript." + NO_SCRIPT_DESC: | + Váš internetový prehliadač nepodporuje JavaScript. + Prosím povoľte podporu JavaScriptu v nastaveniach vášho internetového prehliadača a skúste to znova. + NO_COOKIE_TITLE: "Táto aplikácia vyžaduje podporu Cookies." + NO_COOKIE_DESC: | + Váš internetový prehliadač nepodporuje Cookies. + Prosím povoľte podporu Cookies v nastaveniach vášho internetového prehliadača a skúste to znova. + BAD_BROWSER_TITLE: "Používate zastaralý internetový prehliadač." diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sl_SI.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sl_SI.yml new file mode 100755 index 00000000..13ef86af --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sl_SI.yml @@ -0,0 +1,323 @@ +sl_SI: + LOGIN: + LABEL_LOGIN: "Prijava" + LABEL_PASSWORD: "Geslo" + BUTTON_LOGIN: "Prijava v administracijsko ploščo" + TOP_PANEL: + LABEL_PREMIUM: "Premium" + LABEL_ADMIN_PANEL: "Administracijska plošča" + TABS_LABELS: + LABEL_GENERAL_NAME: "Splošno" + LABEL_LOGIN_NAME: "Prijava" + LABEL_BRANDING_NAME: "Prilagoditev" + LABEL_CONTACTS_NAME: "Stiki" + LABEL_DOMAINS_NAME: "Domene" + LABEL_SECURITY_NAME: "Varnost" + LABEL_INTEGRATION_NAME: "Integracije" + LABEL_PLUGINS_NAME: "Vtičniki" + LABEL_PACKAGES_NAME: "Paketi" + LABEL_LICENSING_NAME: "Licence" + LABEL_ABOUT_NAME: "Več o" + TAB_GENERAL: + LEGEND_INTERFACE: "Vmesnik" + LABEL_LANGUAGE: "Jezik" + LABEL_LANGUAGE_ADMIN: "Jezik (administrator)" + LABEL_THEME: "Tema" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Dovoli izbor jezika v nastavitvah" + LABEL_ALLOW_THEMES_ON_SETTINGS: "Dovoli izbor teme v nastavitvah" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Dovoli izbor ozadja v nastavitvah" + LABEL_NEW_FOLDER_MOVE: "Novi gumb \"Premakni v mapo\"" + LABEL_SHOW_THUMBNAILS: "Pokaži predoglede (priloge)" + LABEL_ALLOW_GRAVATAR: "Dovoli Gravatar" + LEGEND_MAIN: "Glavno" + LABEL_ATTACHMENT_SIZE_LIMIT: "Omejitev velikosti prilog" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Dovoli dodatne račune" + LABEL_ALLOW_IDENTITIES: "Dovoli več identitet" + LABEL_ALLOW_TEMPLATES: "Dovoli predloge" + ALERT_WARNING: "Pozor!" + HTML_ALERT_WEAK_PASSWORD: | + V uporabi je privzeto geslo administratorja +
+ Iz varnostnih razlogov + spremenite + geslo v nekaj drugega. + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "Prijavni zaslon" + LABEL_DEFAULT_DOMAIN: "Privzeta domena" + LABEL_DETERMINE_USER_DOMAIN: "Poskusi ugotoviti domeno uporabnika" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Dovoli izbor jezika na prijavnem zaslonu" + LABEL_DETERMINE_USER_LANGUAGE: "Poskusi ugotoviti jezik uporabnika" + TAB_BRANDING: + LEGEND_BRANDING: "Prilagoditev" + LABEL_PAGE_TITLE: "Naslov strani" + LABEL_LOADING_DESCRIPTION: "Opis med nalaganjem" + LABEL_FAVICON_URL: "Favicon" + LEGEND_LOGIN: "Prijava" + LABEL_LOGIN_LOGO: "Logo" + LABEL_LOGIN_DESCRIPTION: "Opis" + LABEL_LOGIN_BACKGROUND: "Ozadje" + LABEL_LOGIN_CUSTOM_CSS: "CSS po meri" + LABEL_LOGIN_SHOW_POWERED_LINK: "Pokaži povezavo \"Powered by RainLoop\"" + LEGEND_USER: "Uporabnik" + LABEL_USER_LOGO: "Logo" + LABEL_USER_LOGO_TITLE: "Naziv loga" + LABEL_USER_LOGO_MESSAGE: "Logo (pogled sporočil)" + LABEL_USER_CUSTOM_CSS: "CSS po meri" + LEGEND_WELCOME_PAGE: "Pozdravna stran" + LABEL_WELCOME_PAGE_TITLE: "Naslov" + LABEL_WELCOME_PAGE_URL: "URL" + LABEL_WELCOME_PAGE_DISPLAY: "Prikaz" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "Brez" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Enkrat" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Vedno" + HTML_ALERT_PREMIUM: "Ta funkcija je na voljo samo za Premium uporabnike." + TAB_CONTACTS: + LEGEND_CONTACTS: "Stiki" + LEGEND_STORAGE: "Shramba (PDO)" + LABEL_ENABLE_CONTACTS: "Omogoči stike" + LABEL_ALLOW_SYNC: "Dovoli sinhronizacijo stikov (zunanji CardDAV strežnik)" + LABEL_STORAGE_TYPE: "Tip" + LABEL_STORAGE_DSN: "Ime podatkovnega vira (DSN)" + LABEL_STORAGE_USER: "Uporabnik" + LABEL_STORAGE_PASSWORD: "Geslo" + BUTTON_TEST: "Preizkus" + ALERT_NOTICE: "Obvestilo!" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Ta tip podatkovne baze ni priporočljiv za večje število uporabnikov." + HTML_ALERT_DOES_NOT_SUPPORTED: | + Sistem ne podpira stikov. +
+ Namestite ali omogočite PDO (SQLite / MySQL / PostgreSQL) razširitev na strežniku. + TAB_DOMAINS: + LEGEND_DOMAINS: "Domene" + BUTTON_ADD_DOMAIN: "Dodaj domeno" + BUTTON_ADD_ALIAS: "Dodaj vzdevek" + DELETE_ARE_YOU_SURE: "Ste prepričani?" + HTML_DOMAINS_HELPER: | + Seznam domen, do katerih je omogočen dostop. +
+ Kliknite ime za konfiguracijo domene. + TAB_SECURITY: + LEGEND_SECURITY: "Varnost" + LABEL_ALLOW_TWO_STEP: "Dovoli 2-stopenjsko overjanje" + LABEL_FORCE_TWO_STEP: "Prisili 2-stopenjsko overjanje" + LABEL_USE_IMAGE_PROXY: "Uporabni lokalni posredniški strežnik za zunanje slike" + LABEL_ALLOW_OPEN_PGP: "Dovoli OpenPGP" + LABEL_SHOW_PHP_INFO: "Prikaz PHP informacij" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Prijavni podatki za administracijsko ploščo" + LABEL_CURRENT_PASSWORD: "Trenutno geslo" + LABEL_NEW_LOGIN: "Novo uporabniško ime" + LABEL_NEW_PASSWORD: "Novo geslo" + LABEL_REPEAT_PASSWORD: "Ponovno" + BUTTON_UPDATE_PASSWORD: "Posodobi geslo" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "Obvezno overjanje uporabljenega SSL certifikata (IMAP/SMTP)" + LABEL_ALLOW_SELF_SIGNED: "Dovoli samopodpisane certifikate" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "Omogoči integracijo z Google računom" + LABEL_GOOGLE_AUTH: "Pooblastilo" + LABEL_GOOGLE_DRIVE: "Integracija Google Drive (pogled sestavljanja)" + LABEL_GOOGLE_PREVIEW: "Integracija Google Viewer (Predogled za datoteke Microsoft Word, Excel in PowerPoint)" + LABEL_GOOGLE_CLIENT_ID: "ID odjemalca" + LABEL_GOOGLE_CLIENT_SECRET: "Skrivnost odjemalca" + LABEL_GOOGLE_API_KEY: "API ključ" + HINT_GOOGLE_API_KEY: "Potrebno za Google Drive izbirnik datotek" + LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "Omogoči Facebook integracijo (Pooblastilo)" + LABEL_FACEBOOK_APP_ID: "ID aplikacije" + LABEL_FACEBOOK_APP_SECRET: "Skrivnost aplikacije" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "Omogoči Twitter integracijo (Pooblastilo)" + LABEL_TWITTER_CONSUMER_KEY: "Ključ porabnika" + LABEL_TWITTER_CONSUMER_SECRET: "Skrivnost porabnika" + LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "Omogoči Dropbox integracijo" + LABEL_DROPBOX_API_KEY: "API ključ" + TOP_ALERT: "Podrobne informacije o integraciji z družabnimi omrežji so dostopne na" + TAB_PLUGINS: + LEGEND_PLUGINS: "Vtičniki" + LABEL_ENABLE_PLUGINS: "Omogoči vtičnike" + ALERT_NO_PLUGINS: "Ni nameščenih vtičnikov." + LINK_INSTALL_NEW: "Kliknite sem za namestitev novih!" + HINT_CLICK_NAME: "Kliknite na ime, da konfigurirate vtičnik." + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "Na voljo za posodobitev" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Na voljo za namestitev" + LEGEND_INSTALLED_PACKAGES: "Nameščeni paketi" + ALERT_CANNOT_ACCESS_REPOSITORY: "Trenutno ni možen dostop do repozitorija" + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "Vaša domena" + LABEL_VERSION: "Verzija" + LABEL_CHECKING: "Preverjanje" + TYPE_BASIC_HINT: "Ta domena nima licence za komercialno uporabo (z dodatnimi funkcijami)." + TYPE_BASIC_HINT_2: "Ni mogoče pridobiti licence za to domeno." + HTML_ALERT_TOP_1: "RainLoop Webmail izdana pod licenco" + HTML_ALERT_TOP_2: "Smete jo prosto in zastonj uporabljati za osebne projekte." + HTML_ALERT_TOP_3: | + Za komercialno uporabo (z dodatnimi funkcijami) RainLoop Webmail je potrebno pridobiti + naročnino. + TYPE_PREMIUM_LIFETIME: "Obdobje" + LABEL_SUB_EXPIRES: "Naročnina poteče" + BUTTON_ACTIVATE: "Aktiviraj naročniški ključ za to domeno" + BUTTON_PURCHASE: "Kupi" + BUTTON_TRIAL: "Preizkusi" + TAB_ABOUT: + LEGEND_ABOUT: "Več o" + LABEL_TAG_HINT: "Preprost, sodoben, in hiter spletni e-poštni odjemalec" + LABEL_ALL_RIGHTS_RESERVED: "Vse pravice pridržane." + HINT_READ_CHANGE_LOG: "Preberite dnevnik sprememb pred posodobitvijo." + HINT_IS_UP_TO_DATE: "Ni novih posodobitev." + HTML_NEW_VERSION: "Na voljo je nova verzija %VERSION%." + LABEL_UPDATING: "Posodabljanje" + LABEL_CHECKING: "Preverjanje za posdodobitve" + BUTTON_UPDATE: "Posodobi" + BUTTON_DOWNLOAD: "Prenesi" + BUTTON_CHANGELOG: "Dnevnik sprememb" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "Aktiviram naročniški ključ?" + TITLE_ACTIVATION: "Aktiviranje..." + LABEL_DOMAIN: "Domena" + LABEL_SUB_KEY: "Naročniški ključ" + BUTTON_ACTIVATE: "Aktiviraj" + LABEL_ACTIVATED: "Aktivirano" + ERROR_INVALID_SUBS_KEY: "Neveljaven naročniški ključ" + SUBS_KEY_ACTIVATED: "Naročniški ključ je bil uspešno aktiviran" + HTML_DESC: | + Po aktivaciji bo premium naročnina za %DOMAIN% podaljšana. +
+ Naročniški ključ je lahko uporabljen zgolj za eno domeno. +

+ Po začetku procesa aktivacije ni mogoče prekiniti ali preklicati. + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "Dodajanje domene" + LABEL_ALIAS: "Vzdevek" + LABEL_DOMAIN: "Domena" + BUTTON_CLOSE: "Zapri" + BUTTON_ADD: "Dodaj" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "Dodajanje domene" + TITLE_ADD_DOMAIN_WITH_NAME: "Dodajanje domene \"%NAME%\"" + TITLE_EDIT_DOMAIN: "Urejanje domene \"%NAME%\"" + LABEL_NAME: "Ime" + NAME_HELPER: "podpora za nadomestne znake" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "Strežnik" + LABEL_PORT: "Vrata" + LABEL_SECURE: "Varno" + LABEL_WHITE_LIST: "Bela lista" + SECURE_OPTION_NONE: "Nobeno" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "Dovoljene sieve skripte" + LABEL_ALLOW_USER_SCRIPT: "Dovoljene uporabniške skripte po meri" + LABEL_USE_SHORT_LOGIN: "Uporaba uporabniškega imena brez domene" + LABEL_USE_AUTH: "Uporaba overjanja" + LABEL_USE_PHP_MAIL: "Uporaba php mail() funkcije" + BUTTON_TEST: "Preizkus" + BUTTON_WHITE_LIST: "Dodaj na belo listo" + BUTTON_SIEVE_CONFIGURATION: "Konfiguriraj Sieve" + BUTTON_BACK_TO_IMAP: "Nazaj na nastavitve IMAP" + BUTTON_BACK: "Nazaj" + BUTTON_CLOSE: "Zapri" + BUTTON_ADD: "Dodaj" + BUTTON_UPDATE: "Posodobi" + NEW_DOMAIN_DESC: "Ta konfiguiracija domene bo omogočala delo
z %NAME% e-naslovi." + WHITE_LIST_ALERT: | + Seznam uporabnikov domene, do katerih je omogočen dostop. + Uporabnike ločite s presledkom. + POPUPS_PLUGIN: + TITLE_PLUGIN: "Vtičnik" + DESC_NOTHING_TO_CONFIGURE: "Ni nastavitev za spreminjati" + BUTTON_CLOSE: "Zapri" + BUTTON_SAVE: "Shrani" + TOOLTIP_ABOUT_TITLE: "Več o" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "Želite zapreti to okno?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Izberite jezik" + HINTS: + BETA: "beta" + UNSTABLE: "nestabilno" + WARNING: "Pozor!" + NOT_SUPPORTED: "ni podprto" + REQUIRES_PHP_54: "zahteva PHP 5.4 ali več" + ERRORS: + DOMAIN_ALREADY_EXISTS: "Domena že obstaja" + UNKNOWN_ERROR: "Neznana napaka" + NOTIFICATIONS: + INVALID_TOKEN: "Neveljaven žeton" + AUTH_ERROR: "Spodletelo overjanje" + ACCESS_ERROR: "Napaka dostopa" + CONNECTION_ERROR: "Neuspešna povezava s strežnikom" + CAPTCHA_ERROR: "Napačen CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Ta družabni ID ni še določen nobenemu E-poštnemu računu. Prijavite se z podatki + za E-pošto in omogočite to v nastavitvah računa. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Ta družabni ID ni še določen nobenemu E-poštnemu računu. Prijavite se z podatki + za E-pošto in omogočite to v nastavitvah računa. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Ta družabni ID ni še določen nobenemu E-poštnemu računu. Prijavite se z podatki + za E-pošto in omogočite to v nastavitvah računa. + DOMAIN_NOT_ALLOWED: "Domena ni dovoljena" + ACCOUNT_NOT_ALLOWED: "Račun ni dovoljen" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Obvezno 2-stopenjsko overjanje" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Napaka 2-stopenjskega overjanja" + COULD_NOT_SAVE_NEW_PASSWORD: "Ni bilo mogoče shraniti novega gesla" + CURRENT_PASSWORD_INCORRECT: "Napačno trenutno geslo" + NEW_PASSWORD_SHORT: "Prekratko geslo" + NEW_PASSWORD_WEAK: "Preveč enostavno geslo" + NEW_PASSWORD_FORBIDDENT: "Geslo vsebuje nedovoljene znake" + CONTACTS_SYNC_ERROR: "Napaka sinhronizacije stikov" + CANT_GET_MESSAGE_LIST: "Ni bilo mogoče pridobiti seznama sporočil" + CANT_GET_MESSAGE: "Ni bilo mogoče pridobiti sporočila" + CANT_DELETE_MESSAGE: "Ni bilo mogoče izbrisati sporočila" + CANT_MOVE_MESSAGE: "Ni mogoče premakniti sporočila" + CANT_SAVE_MESSAGE: "Ni mogoče shraniti sporočila" + CANT_SEND_MESSAGE: "Ni mogoče poslati sporočila" + INVALID_RECIPIENTS: "Neveljavni prejemniki" + CANT_SAVE_FILTERS: "Ni mogoče shraniti filtrov" + CANT_GET_FILTERS: "Ni mogoče pridobiti filtrov" + FILTERS_ARE_NOT_CORRECT: "Filtri so nepravilni" + CANT_CREATE_FOLDER: "Ni mogoče ustvariti mape" + CANT_RENAME_FOLDER: "Ni mogoče preimenovati mape" + CANT_DELETE_FOLDER: "Ni mogoče izbrisati mape" + CANT_DELETE_NON_EMPTY_FOLDER: "Ni mogoče izbrisati neprazne mape" + CANT_SUBSCRIBE_FOLDER: "Ni mogoče slediti mapi" + CANT_UNSUBSCRIBE_FOLDER: "Ni mogoče prenehati slediti mapi" + CANT_SAVE_SETTINGS: "Ni mogoče shraniti nastavitev" + CANT_SAVE_PLUGIN_SETTINGS: "Ni mogoče shraniti nastavitev" + DOMAIN_ALREADY_EXISTS: "Domena že obstaja" + CANT_INSTALL_PACKAGE: "Neuspešna namestitev paketa" + CANT_DELETE_PACKAGE: "Neuspešno odstranjevanje paketa" + INVALID_PLUGIN_PACKAGE: "Neveljaven paket vtičnika" + UNSUPPORTED_PLUGIN_PACKAGE: "Nepodprt paket vtičnika" + LICENSING_SERVER_IS_UNAVAILABLE: "Naročniški strežnik ni dosegljiv" + LICENSING_DOMAIN_EXPIRED: "Naročnina na to domeno je potekla." + LICENSING_DOMAIN_BANNED: "Naročnina na to domeno ni dovoljena" + DEMO_SEND_MESSAGE_ERROR: "Iz varnostnih razlogov ta račun ne sme pošiljati pošte na zunanje e-naslove!" + DEMO_ACCOUNT_ERROR: "Iz varnostnih razlogov ta račun ne sme izvršiti tega dejanja!" + ACCOUNT_ALREADY_EXISTS: "Račun že obstaja" + ACCOUNT_DOES_NOT_EXIST: "Račun ne obstaja" + MAIL_SERVER_ERROR: "Napaka pri dostopu do poštnega strežnika" + INVALID_INPUT_ARGUMENT: "Neveljaven vhodni argument" + UNKNOWN_ERROR: "Neznana napaka" + STATIC: + BACK_LINK: "Ponovno naloži" + DOMAIN_LIST_DESC: "Seznam domen, na katere je dovoljen dostop" + PHP_EXSTENSIONS_ERROR_DESC: "Potrebne PHP razširitve niso omogočene v vaši PHP nastavitveni datoteki!" + PHP_VERSION_ERROR_DESC: "Vaša PHP verzija (%VERSION%) je manjša kot potrebna 5.3.0!" + NO_SCRIPT_TITLE: "Ta aplikacija potrebuje omogočen JavaScript." + NO_SCRIPT_DESC: | + Brskalnik nima podpore za JavaScript. + Omogočite JavaScript v brskalniku in poskusite znova. + NO_COOKIE_TITLE: "Ta aplikacije potrebuje omogočene piškotke." + NO_COOKIE_DESC: | + Brskalnik nima omogočenih piškotkov. + Omogočite piškotke v brskalniku in poskusite znova. + BAD_BROWSER_TITLE: "Brskalnik je zastarel." + BAD_BROWSER_DESC: | + Za uporabo vseh funkcij te aplikacije + prenesite in namestite enega od teh brskalnikov: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sv_SE.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sv_SE.yml new file mode 100755 index 00000000..fd9912cb --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sv_SE.yml @@ -0,0 +1,324 @@ +sv_SE: + LOGIN: + LABEL_LOGIN: "Logga in" + LABEL_PASSWORD: "Lösenord" + BUTTON_LOGIN: "Logga in till admin-panelen" + TOP_PANEL: + LABEL_PREMIUM: "Premium" + LABEL_ADMIN_PANEL: "Adminpanel" + TABS_LABELS: + LABEL_GENERAL_NAME: "Allmän" + LABEL_LOGIN_NAME: "Logga in" + LABEL_BRANDING_NAME: "Branding" + LABEL_CONTACTS_NAME: "Kontakter" + LABEL_DOMAINS_NAME: "Domäner" + LABEL_SECURITY_NAME: "Säkerhet" + LABEL_INTEGRATION_NAME: "integrationer" + LABEL_PLUGINS_NAME: "Plugins" + LABEL_PACKAGES_NAME: "Paket" + LABEL_LICENSING_NAME: "Licensiering" + LABEL_ABOUT_NAME: "Om" + TAB_GENERAL: + LEGEND_INTERFACE: "Gränssnitt" + LABEL_LANGUAGE: "Språk" + LABEL_LANGUAGE_ADMIN: "Språk (administratör)" + LABEL_THEME: "Tema" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Tillåt språkändringar på konfigurationspanelen " + LABEL_ALLOW_THEMES_ON_SETTINGS: "Tillåt tema val på konfigurationspanelen" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Tillåt bakgrundsändringar på konfigurationspanelen" + LABEL_NEW_FOLDER_MOVE: "Ny \"Flytta mapp\" knapp" + LABEL_SHOW_THUMBNAILS: "Visa miniatyrer (bilagor)" + LABEL_ALLOW_GRAVATAR: "Tillåt Gravatar" + LEGEND_MAIN: "Huvud" + LABEL_ATTACHMENT_SIZE_LIMIT: "Bilagor storlek" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Tillåt ytterligare konton" + LABEL_ALLOW_IDENTITIES: "Tillåt multiidentiteter" + LABEL_ALLOW_TEMPLATES: "Tillåt mallar" + ALERT_WARNING: "Advarsel!" + HTML_ALERT_WEAK_PASSWORD: | + Du använder standardlösenord. +
+ För säkerhetsskäl + ändra + lösenord till något annat + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "Inloggningsskärm" + LABEL_DEFAULT_DOMAIN: "Standarddomän" + LABEL_DETERMINE_USER_DOMAIN: "Försök att bestämma användardomän" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Tillåt språkändringar på inloggningsskärmen" + LABEL_DETERMINE_USER_LANGUAGE: "Försök att bestämma användarens språk" + TAB_BRANDING: + LEGEND_BRANDING: "Branding" + LABEL_PAGE_TITLE: "Namn på sidan" + LABEL_LOADING_DESCRIPTION: "Laddar beskrivning" + LABEL_FAVICON_URL: "Favicon" + LEGEND_LOGIN: "Logga in" + LABEL_LOGIN_LOGO: "Logotyp" + LABEL_LOGIN_DESCRIPTION: "Beskrivning" + LABEL_LOGIN_BACKGROUND: "Bakgrund" + LABEL_LOGIN_CUSTOM_CSS: "Anpassad CSS" + LABEL_LOGIN_SHOW_POWERED_LINK: "Visa \"Powered by RainLoop\" länk" + LEGEND_USER: "Användare" + LABEL_USER_LOGO: "Logotyp" + LABEL_USER_LOGO_TITLE: "Logotyp namn" + LABEL_USER_LOGO_MESSAGE: "Logo (Visa meddelande)" + LABEL_USER_CUSTOM_CSS: "Anpassad CSS" + LEGEND_WELCOME_PAGE: "Välkomstsida" + LABEL_WELCOME_PAGE_TITLE: "Titel" + LABEL_WELCOME_PAGE_URL: "URL" + LABEL_WELCOME_PAGE_DISPLAY: "Visa" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "Ingen" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "En gång" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Alltid" + HTML_ALERT_PREMIUM: "Denna funktion är tillgänglig för Premium abonnenter." + TAB_CONTACTS: + LEGEND_CONTACTS: "Kontakter" + LEGEND_STORAGE: "Storage (PDO)" + LABEL_ENABLE_CONTACTS: "göra det möjligt för kontakterna" + LABEL_ALLOW_SYNC: "Tillåt kontakter synkronisering (med extern CardDAV server)" + LABEL_STORAGE_TYPE: "Typ" + LABEL_STORAGE_DSN: "Dsn" + LABEL_STORAGE_USER: "Användare" + LABEL_STORAGE_PASSWORD: "Lösenord" + BUTTON_TEST: "Test" + ALERT_NOTICE: "Notis" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Använd inte denna typ av databas med ett stort antal aktiva användare." + HTML_ALERT_DOES_NOT_SUPPORTED: | + Systemet stöder inte kontakter +
+ Du behöver installera eller aktivera SUB (SQLite/MySQL/PostgreSQL) förlängning på server. + TAB_DOMAINS: + LEGEND_DOMAINS: "Domäner" + BUTTON_ADD_DOMAIN: "Lägg till domän" + BUTTON_ADD_ALIAS: "Lägg till Alias" + DELETE_ARE_YOU_SURE: "Är du säker?" + HTML_DOMAINS_HELPER: | + Lista med domäner webmail tillåts access. +
+ Klicka på namnet för att konfigurera domain. + TAB_SECURITY: + LEGEND_SECURITY: "Säkerhet" + LABEL_ALLOW_TWO_STEP: "Låt 2-tvåstegsverifiering" + LABEL_FORCE_TWO_STEP: "Driva 2-tvåstegsverifiering" + LABEL_USE_IMAGE_PROXY: "Använd lokal proxy för externa bilder" + LABEL_ALLOW_OPEN_PGP: "Tillåt OpenPGP" + LABEL_SHOW_PHP_INFO: "Visa PHP-information" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Administrativsuppgifter" + LABEL_CURRENT_PASSWORD: "Nuvarande lösenord" + LABEL_NEW_LOGIN: "Ny inloggning" + LABEL_NEW_PASSWORD: "Nytt lösenord" + LABEL_REPEAT_PASSWORD: "Upprepa" + BUTTON_UPDATE_PASSWORD: "Uppdatera lösenord" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "Kräver verifiering av SSL-certifikat som används (IMAP/SMTP)" + LABEL_ALLOW_SELF_SIGNED: "Låt självsignerade certifikat" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "Aktivera Google Integration" + LABEL_GOOGLE_AUTH: "Tillstånd" + LABEL_GOOGLE_DRIVE: "Google Drive Integration (Compose view)" + LABEL_GOOGLE_PREVIEW: "Google Viewer Integration (Preview för Microsoft Word, Excel och PowerPoint-filer)" + LABEL_GOOGLE_CLIENT_ID: "Client ID" + LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" + LABEL_GOOGLE_API_KEY: "Api Nyckel" + HINT_GOOGLE_API_KEY: "Nödvändigt för Google Drive File Picker" + LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "Aktivera Facebook Integration (Tillstånd)" + LABEL_FACEBOOK_APP_ID: "App ID" + LABEL_FACEBOOK_APP_SECRET: "App Secret" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "Aktivera Twitter Integration (Tillstånd)" + LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" + LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" + LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "Aktivera Dropbok Integration" + LABEL_DROPBOX_API_KEY: "Api Key" + TOP_ALERT: "Detaljerad information om social integration återfinns på" + TAB_PLUGINS: + LEGEND_PLUGINS: "Plugin" + LABEL_ENABLE_PLUGINS: "Aktivera Plugin" + ALERT_NO_PLUGINS: "Inga plugin har ännu blivit installerade" + LINK_INSTALL_NEW: "Klicka här för att installera nya" + HINT_CLICK_NAME: "Klicka på namnet för att konfigurera pluginet" + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "Tillåt uppdateringar" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Tillåt installation" + LEGEND_INSTALLED_PACKAGES: "installerade paket" + ALERT_CANNOT_ACCESS_REPOSITORY: "Det går inte att komma åt arkivet för tillfället." + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "Din domän" + LABEL_VERSION: "Version" + LABEL_CHECKING: "Kontroll" + TYPE_BASIC_HINT: "Denna domän är inte godkänt för kommersiellt bruk (med ytterligare funktioner)." + TYPE_BASIC_HINT_2: "Denna domän kan inte licensieras." + HTML_ALERT_TOP_1: "RainLoop Webmail är licensierat under" + HTML_ALERT_TOP_2: "Du är gratis för att använda den för dina personliga projekt." + HTML_ALERT_TOP_3: | + Kommersiellt bruk (med ytterligare funktioner) av RainLoop Webmail kräver att få + prenumerations. + TYPE_PREMIUM_LIFETIME: "Livstid" + LABEL_SUB_EXPIRES: "Abonnemang löper ut" + BUTTON_ACTIVATE: "Aktivera prenumerationsnyckel för den här domänen" + BUTTON_PURCHASE: "Inköp" + BUTTON_TRIAL: "Rättegång" + TAB_ABOUT: + LEGEND_ABOUT: "Om" + LABEL_TAG_HINT: "Enkel, modern & snabb e-postklient" + LABEL_ALL_RIGHTS_RESERVED: "Alla rättigheter förbehållna." + HINT_READ_CHANGE_LOG: "Vänligen läs ändringsloggen innan du uppdaterar." + HINT_IS_UP_TO_DATE: "RainLoop är aktuell." + HTML_NEW_VERSION: "Ny %VERSION% version är tillgänglig" + LABEL_UPDATING: "Uppdaterar" + LABEL_CHECKING: "Letar efter uppdaterar" + BUTTON_UPDATE: "Uppdatera" + BUTTON_DOWNLOAD: "Ladda ner" + BUTTON_CHANGELOG: "Ändringslogg" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "Aktivera prenumerationsnyckel?" + TITLE_ACTIVATION: "Aktivering..." + LABEL_DOMAIN: "Domän" + LABEL_SUB_KEY: "Prenumerationsnyckel" + BUTTON_ACTIVATE: "Aktivera" + LABEL_ACTIVATED: "Aktiverad" + ERROR_INVALID_SUBS_KEY: "Ogiltig prenumerationsnyckel" + SUBS_KEY_ACTIVATED: "Lyckades aktivera prenumerationsnyckel" + HTML_DESC: | + Efter aktivering, premium prenumeration för %DOMAIN% kommer att förängas. +
+ Observera att prenumerationsnyckel kan aktiveras för en enda domän. +

+ När processen för aktivering har påbörjats så kan den inte avbrytas. + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "Lägg till Alias" + LABEL_ALIAS: "Alias" + LABEL_DOMAIN: "Domän" + BUTTON_CLOSE: "Stäng" + BUTTON_ADD: "Lägg till" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "Lägg till domän" + TITLE_ADD_DOMAIN_WITH_NAME: "Lägg till domän \"%NAME%\"" + TITLE_EDIT_DOMAIN: "Ändra domän \"%NAME%\"" + LABEL_NAME: "Namn" + NAME_HELPER: "jokertecken stöds" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "Server" + LABEL_PORT: "Port" + LABEL_SECURE: "Säkerhet" + LABEL_WHITE_LIST: "Vitlista" + SECURE_OPTION_NONE: "Ingen" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "StartTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "Tillåta sikt skript" + LABEL_ALLOW_USER_SCRIPT: "Tillåt anpassade användarskript" + LABEL_USE_SHORT_LOGIN: "Använda korta inloggning" + LABEL_USE_AUTH: "Använd autentisering" + LABEL_USE_PHP_MAIL: "Använd php mail() funktionen" + BUTTON_TEST: "Test" + BUTTON_WHITE_LIST: "Vitlista" + BUTTON_SIEVE_CONFIGURATION: "sil-konfiguration" + BUTTON_BACK_TO_IMAP: "Tillbaka till IMAP inställningar" + BUTTON_BACK: "Tillbaka" + BUTTON_CLOSE: "Stäng" + BUTTON_ADD: "Lägg till" + BUTTON_UPDATE: "Uppdatera" + NEW_DOMAIN_DESC: "Denna domän konfiguration gör att du kan arbeta
med %NAME% e-postadresser." + WHITE_LIST_ALERT: | + Lista över domänanvändare som tillåts. + Använda ett utrymme som avgränsare. + POPUPS_PLUGIN: + TITLE_PLUGIN: "Plugin" + DESC_NOTHING_TO_CONFIGURE: "Inget att konfigurera" + BUTTON_CLOSE: "Stäng" + BUTTON_SAVE: "Spara" + TOOLTIP_ABOUT_TITLE: "Om" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "Är du säker på att du vill stänga sidan?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Välj ditt språk" + HINTS: + BETA: "beta" + UNSTABLE: "instabil" + WARNING: "Varning!" + NOT_SUPPORTED: "stöds inte" + REQUIRES_PHP_54: "kräver PHP 5.4 eller högre" + ERRORS: + DOMAIN_ALREADY_EXISTS: "Domänen finns redan" + UNKNOWN_ERROR: "Okänt fel" + NOTIFICATIONS: + INVALID_TOKEN: "ogiltiga symboler" + AUTH_ERROR: "Autentisering misslyckades" + ACCESS_ERROR: "Åtkomstfel" + CONNECTION_ERROR: "Kan inte ansluta till servern" + CAPTCHA_ERROR: "Felaktigt CAPTCHA" + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Denna sociala ID inte tilldelas någon e-postkonto ännu. Logga in med e-referenser + och aktivera den här funktionen på kontots inställningar. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >+ + Denna sociala ID inte tilldelas någon e-postkonto ännu. Logga in med e-referenser + och aktivera den här funktionen på kontots inställningar. + + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Denna sociala ID inte tilldelas någon e-postkonto ännu. Logga in med e-referenser + och aktivera denna funktion i kontoinställningarna. + DOMAIN_NOT_ALLOWED: "Domänen är inte tillåten" + ACCOUNT_NOT_ALLOWED: "Kontot är inte tillåtet" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Två faktor kontroll som krävs" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Två faktor verifiering fel" + COULD_NOT_SAVE_NEW_PASSWORD: "Kan inte spara ditt nya lösenord" + CURRENT_PASSWORD_INCORRECT: "Nuvarande lösenord är fel" + NEW_PASSWORD_SHORT: "Lösenordet är för kort" + NEW_PASSWORD_WEAK: "Lösenordet är för lätt" + NEW_PASSWORD_FORBIDDENT: "Lösenordet innehåller otillåtna tecken" + CONTACTS_SYNC_ERROR: "Kontaktsynkroniseringsfel" + CANT_GET_MESSAGE_LIST: "Kan inte få tag i dina meddelanden" + CANT_GET_MESSAGE: "Det går inte att få tag i meddelanden" + CANT_DELETE_MESSAGE: "Kan inte ta bort meddelande" + CANT_MOVE_MESSAGE: "Kan inte flytta meddelande" + CANT_SAVE_MESSAGE: "Kan inte spara meddelande" + CANT_SEND_MESSAGE: "Kan inte skicka meddelande" + INVALID_RECIPIENTS: "Ogiltiga mottagare" + CANT_SAVE_FILTERS: "Kan inte spara filter" + CANT_GET_FILTERS: "Det går inte att få filter" + FILTERS_ARE_NOT_CORRECT: "Filter är inte korrekt" + CANT_CREATE_FOLDER: "Kan inte skapa mapp" + CANT_RENAME_FOLDER: "Kan inte ändra namn på mappen" + CANT_DELETE_FOLDER: "Kan inte ta bort mappen" + CANT_DELETE_NON_EMPTY_FOLDER: "Kan inte ta bort mappar som innehåller meddelanden" + CANT_SUBSCRIBE_FOLDER: "Kan inte prenumerera på mapp" + CANT_UNSUBSCRIBE_FOLDER: "Kan inte avprenumerera på mapp" + CANT_SAVE_SETTINGS: "Kan inte spara inställningarna" + CANT_SAVE_PLUGIN_SETTINGS: "Kan inte spara inställningarna" + DOMAIN_ALREADY_EXISTS: "Domänen finns redan" + CANT_INSTALL_PACKAGE: "Det gick inte att installera paketet" + CANT_DELETE_PACKAGE: "Det gick inte att ta bort paket" + INVALID_PLUGIN_PACKAGE: "Ogiltig plugin" + UNSUPPORTED_PLUGIN_PACKAGE: "Pluginet stöds inte" + LICENSING_SERVER_IS_UNAVAILABLE: "Prenumerations servern inte är tillgänglig" + LICENSING_DOMAIN_EXPIRED: "Abonnemang för den här domänen har gått ut." + LICENSING_DOMAIN_BANNED: "Abonnemang för den här domänen är förbjudet." + DEMO_SEND_MESSAGE_ERROR: "Av säkerhetsskäl är det här kontot inte tillåtet att skicka meddelanden till externa e-postadresser!" + DEMO_ACCOUNT_ERROR: "Av säkerhetsskäl är det här kontot inte tillåtet för denna åtgärd!" + ACCOUNT_ALREADY_EXISTS: "Kontot finns redan" + ACCOUNT_DOES_NOT_EXIST: "Kontot finns inte" + MAIL_SERVER_ERROR: "Kunde ansluta till mailservern" + INVALID_INPUT_ARGUMENT: "Ogiltig inmatning argument" + UNKNOWN_ERROR: "Okänt fel" + STATIC: + BACK_LINK: "Ladda om" + DOMAIN_LIST_DESC: "Lista av domäner som tillåsts" + PHP_EXSTENSIONS_ERROR_DESC: "Krävs PHP förlängning inte är tillgängliga i din PHP-konfiguration!" + PHP_VERSION_ERROR_DESC: "Din PHP version (%VERSION%) är lägre än den minimala som krävs 5.3.0!" + NO_SCRIPT_TITLE: "JavaScript krävs för denna applikation." + NO_SCRIPT_DESC: | + JavaScript stöd är inte tillgängligt i din webläsare. + Vänligen aktivera JavaScript stöd i din webbläsares inställningar och försök igen. + NO_COOKIE_TITLE: "Cookies stöd krävs för denna applikation." + NO_COOKIE_DESC: | + Cookies stöd är inte tillgängligt i din webbläsare. + Vänligen aktivera Cookie stöd i webbläsarens inställningar och försök igen. + BAD_BROWSER_TITLE: "Din webbläsare är föråldrad." + BAD_BROWSER_DESC: | + För att kunna använda alla funktioner i ansökan, + hämta och installera en av dessa webbläsare: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/zh_CN.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/zh_CN.yml new file mode 100755 index 00000000..a43c67df --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/zh_CN.yml @@ -0,0 +1,317 @@ +zh_CN: + LOGIN: + LABEL_LOGIN: "登陆" + LABEL_PASSWORD: "密码" + BUTTON_LOGIN: "登录到控制面板" + TOP_PANEL: + LABEL_PREMIUM: "高级" + LABEL_ADMIN_PANEL: "控制面板" + TABS_LABELS: + LABEL_GENERAL_NAME: "常规" + LABEL_LOGIN_NAME: "登陆" + LABEL_BRANDING_NAME: "Logo" + LABEL_CONTACTS_NAME: "联系人" + LABEL_DOMAINS_NAME: "域名" + LABEL_SECURITY_NAME: "安全" + LABEL_INTEGRATION_NAME: "整合" + LABEL_PLUGINS_NAME: "插件" + LABEL_PACKAGES_NAME: "插件包" + LABEL_LICENSING_NAME: "许可证" + LABEL_ABOUT_NAME: "关于" + TAB_GENERAL: + LEGEND_INTERFACE: "界面" + LABEL_LANGUAGE: "语言" + LABEL_LANGUAGE_ADMIN: "语言(后台)" + LABEL_THEME: "主题" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "允许在设置界面中选择语言" + LABEL_ALLOW_THEMES_ON_SETTINGS: "允许在设置界面中选择主题" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "允许在设置界面中选择背景" + LABEL_SHOW_THUMBNAILS: "显示缩略图(附件)" + LABEL_ALLOW_GRAVATAR: "允许使用头像" + LEGEND_MAIN: "主" + LABEL_ATTACHMENT_SIZE_LIMIT: "附件大小限制" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "允许额外的账户" + LABEL_ALLOW_IDENTITIES: "允许多重身份" + LABEL_ALLOW_TEMPLATES: "允许使用模板" + ALERT_WARNING: "警告" + HTML_ALERT_WEAK_PASSWORD: | + 您正在使用默认的管理员密码 +
+ 安全起见,请立即将密码 + 更改 + 为其他的字符串。 + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "登陆界面" + LABEL_DEFAULT_DOMAIN: "默认域名" + LABEL_DETERMINE_USER_DOMAIN: "尝试确定用户域名" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "允许在登陆界面选择语言" + LABEL_DETERMINE_USER_LANGUAGE: "尝试确定用户语言" + TAB_BRANDING: + LEGEND_BRANDING: "Logo" + LABEL_PAGE_TITLE: "页面标题" + LABEL_LOADING_DESCRIPTION: "正在加载介绍" + LABEL_FAVICON_URL: "图标" + LEGEND_LOGIN: "登陆" + LABEL_LOGIN_LOGO: "Logo" + LABEL_LOGIN_DESCRIPTION: "介绍" + LABEL_LOGIN_BACKGROUND: "背景" + LABEL_LOGIN_CUSTOM_CSS: "自定义CSS样式" + LABEL_LOGIN_SHOW_POWERED_LINK: "显示\"Powered by RainLoop\"链接" + LEGEND_USER: "用户" + LABEL_USER_LOGO: "Logo" + LABEL_USER_LOGO_TITLE: "Logo标题" + LABEL_USER_LOGO_MESSAGE: "Logo(邮件界面)" + LABEL_USER_CUSTOM_CSS: "自定义CSS样式" + LEGEND_WELCOME_PAGE: "欢迎页面" + LABEL_WELCOME_PAGE_TITLE: "标题" + LABEL_WELCOME_PAGE_URL: "URL地址" + LABEL_WELCOME_PAGE_DISPLAY: "显示" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "无" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "一次" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "永远" + HTML_ALERT_PREMIUM: "此功能仅限于高级 订阅者." + TAB_CONTACTS: + LEGEND_CONTACTS: "联系人" + LEGEND_STORAGE: "存储(PDO)" + LABEL_ENABLE_CONTACTS: "启用联系人" + LABEL_ALLOW_SYNC: "允许同步联系人(依靠外部CardDAV服务器)" + LABEL_STORAGE_TYPE: "类型" + LABEL_STORAGE_DSN: "Dsn" + LABEL_STORAGE_USER: "用户" + LABEL_STORAGE_PASSWORD: "密码" + BUTTON_TEST: "测试" + ALERT_NOTICE: "提示!" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "如果有大量的活跃用户,请不要选择此数据库类型." + HTML_ALERT_DOES_NOT_SUPPORTED: | + 你的系统不支持联系人 +
+ 你需要在你的服务器上安装或启用PDO (SQLite / MySQL / PostgreSQL) 组件. + TAB_DOMAINS: + LEGEND_DOMAINS: "域名" + BUTTON_ADD_DOMAIN: "添加域名" + BUTTON_ADD_ALIAS: "添加别名" + DELETE_ARE_YOU_SURE: "你确定吗?" + HTML_DOMAINS_HELPER: | + 允许访问的域。 +
+ 点击域名进行设置。 + TAB_SECURITY: + LEGEND_SECURITY: "安全" + LABEL_ALLOW_TWO_STEP: "允许2步验证" + LABEL_FORCE_TWO_STEP: "强制使用2步验证" + LABEL_USE_IMAGE_PROXY: "对外部图片使用本地代理" + LABEL_ALLOW_OPEN_PGP: "允许使用OpenPGP" + LABEL_SHOW_PHP_INFO: "显示PHP信息" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "管理员面板访问凭据" + LABEL_CURRENT_PASSWORD: "当前密码" + LABEL_NEW_LOGIN: "新的登陆用户名" + LABEL_NEW_PASSWORD: "新密码" + LABEL_REPEAT_PASSWORD: "重复" + BUTTON_UPDATE_PASSWORD: "更新密码" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "要求验证SSL证书(IMAP/SMTP)" + LABEL_ALLOW_SELF_SIGNED: "允许自签署的证书" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "启用Google整合" + LABEL_GOOGLE_AUTH: "认证" + LABEL_GOOGLE_DRIVE: "Google Drive 整合(撰写视图)" + LABEL_GOOGLE_PREVIEW: "Google Viewer 整合(预览Microsoft Word,Excel,和Powerpoint文档)" + LABEL_GOOGLE_CLIENT_ID: "用户ID" + LABEL_GOOGLE_CLIENT_SECRET: "用户密码" + LABEL_GOOGLE_API_KEY: "Api密钥" + HINT_GOOGLE_API_KEY: "要求使用Google Drive文件选择器" + LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "启用Facebook整合(认证)" + LABEL_FACEBOOK_APP_ID: "应用ID" + LABEL_FACEBOOK_APP_SECRET: "应用密钥" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "启用Twitter整合(认证)" + LABEL_TWITTER_CONSUMER_KEY: "用户Key" + LABEL_TWITTER_CONSUMER_SECRET: "用户Secret" + LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "启用Dropbox整合" + LABEL_DROPBOX_API_KEY: "Api密钥" + TOP_ALERT: "社交媒体整合的详细信息找到于" + TAB_PLUGINS: + LEGEND_PLUGINS: "插件" + LABEL_ENABLE_PLUGINS: "启用插件" + ALERT_NO_PLUGINS: "当前还未安装插件." + LINK_INSTALL_NEW: "点击此处安装新插件!" + HINT_CLICK_NAME: "点击名称来配置插件." + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "有更新可用" + LEGEND_AVAILABLE_FOR_INSTALLATION: "可用于安装" + LEGEND_INSTALLED_PACKAGES: "已安装的插件包" + ALERT_CANNOT_ACCESS_REPOSITORY: "目前无法使用仓库" + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "你的域名" + LABEL_VERSION: "版本" + LABEL_CHECKING: "检查中" + TYPE_BASIC_HINT: "此域名不被许可用于商业用途(包括额外功能)." + TYPE_BASIC_HINT_2: "此域名无法被许可" + HTML_ALERT_TOP_1: "RainLoop Webmail位于的许可证下" + HTML_ALERT_TOP_2: "你可以自由地将它用于你的 私人 项目." + HTML_ALERT_TOP_3: | + 商业版的RainLoop Webmail自带更多功能,需要订阅。 + TYPE_PREMIUM_LIFETIME: "永久" + LABEL_SUB_EXPIRES: "订阅失效" + BUTTON_ACTIVATE: "为此域名启用订阅密钥" + BUTTON_PURCHASE: "订购" + BUTTON_TRIAL: "试用" + TAB_ABOUT: + LEGEND_ABOUT: "关于" + LABEL_TAG_HINT: "简洁,现代化&快捷的基于网络的邮件客户端" + LABEL_ALL_RIGHTS_RESERVED: "保留所有权利" + HINT_READ_CHANGE_LOG: "请在更新前阅读更新日志" + HINT_IS_UP_TO_DATE: "RainLoop已经是最新版本的" + HTML_NEW_VERSION: "有新的%VERSION% 版本可用." + LABEL_UPDATING: "更新中" + LABEL_CHECKING: "检查更新" + BUTTON_UPDATE: "更新" + BUTTON_DOWNLOAD: "下载" + BUTTON_CHANGELOG: "更新日志" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "启用订阅密钥?" + TITLE_ACTIVATION: "激活中..." + LABEL_DOMAIN: "域名" + LABEL_SUB_KEY: "订阅密钥" + BUTTON_ACTIVATE: "激活" + LABEL_ACTIVATED: "已激活" + ERROR_INVALID_SUBS_KEY: "无效的订阅密钥" + SUBS_KEY_ACTIVATED: "订阅密钥成功启用" + HTML_DESC: | + 激活后,域%DOMAIN%的订阅时间将会续展。 + 请注意,订阅密匙只可用于一个域。 +

+ 激活开始后,激活过程中不可被中断或取消。 + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "添加别名" + LABEL_ALIAS: "别名" + LABEL_DOMAIN: "域名" + BUTTON_CLOSE: "关闭" + BUTTON_ADD: "添加" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "添加域名" + TITLE_ADD_DOMAIN_WITH_NAME: "添加域名 \"%NAME%\"" + TITLE_EDIT_DOMAIN: "编辑域名 \"%NAME%\"" + LABEL_NAME: "名字" + NAME_HELPER: "可使用通配符" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "服务器" + LABEL_PORT: "端口" + LABEL_SECURE: "加密" + LABEL_WHITE_LIST: "白名单" + SECURE_OPTION_NONE: "无" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "可使用筛选脚本" + LABEL_ALLOW_USER_SCRIPT: "允许用户自定义脚本" + LABEL_USE_SHORT_LOGIN: "使用短用户名登录" + LABEL_USE_AUTH: "使用认证" + LABEL_USE_PHP_MAIL: "使用 php mail() 函数" + BUTTON_TEST: "测试" + BUTTON_WHITE_LIST: "白名单" + BUTTON_SIEVE_CONFIGURATION: "筛选设置" + BUTTON_BACK_TO_IMAP: "回到IMAP设置" + BUTTON_BACK: "返回" + BUTTON_CLOSE: "关闭" + BUTTON_ADD: "添加" + BUTTON_UPDATE: "更新" + NEW_DOMAIN_DESC: "此域名配置将允许你
%NAME%电子邮件地址一起工作." + WHITE_LIST_ALERT: | + 允许访问的域用户。 + 使用空格分隔。 + POPUPS_PLUGIN: + TITLE_PLUGIN: "插件" + DESC_NOTHING_TO_CONFIGURE: "无可用配置" + BUTTON_CLOSE: "关闭" + BUTTON_SAVE: "保存" + TOOLTIP_ABOUT_TITLE: "关于" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "你确定要关闭此窗口吗?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "选择您的语言" + HINTS: + BETA: "测试版本" + UNSTABLE: "不稳定版本" + WARNING: "警告" + NOT_SUPPORTED: "不支持" + REQUIRES_PHP_54: "要求PHP 5.4或更高版本" + ERRORS: + DOMAIN_ALREADY_EXISTS: "域名已经存在" + UNKNOWN_ERROR: "未知错误" + NOTIFICATIONS: + INVALID_TOKEN: "无效标记" + AUTH_ERROR: "认证失败" + ACCESS_ERROR: "访问错误" + CONNECTION_ERROR: "无法连接到服务器" + CAPTCHA_ERROR: "验证码不正确。" + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + 这个社交媒体ID并未与任何电邮账户关联。请使用电邮登录然后再在账户设置用启用此功能。 + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + 这个社交媒体ID并未与任何电邮账户关联。请使用电邮登录然后再在账户设置用启用此功能。 + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + 这个社交媒体ID并未与任何电邮账户关联。请使用电邮登录然后再在账户设置用启用此功能。 + DOMAIN_NOT_ALLOWED: "域名不被允许。" + ACCOUNT_NOT_ALLOWED: "账户不允许" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "需要两步验证" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "两步验证错误" + COULD_NOT_SAVE_NEW_PASSWORD: "无法保存新密码" + CURRENT_PASSWORD_INCORRECT: "当前密码不正确" + NEW_PASSWORD_SHORT: "密码太短" + NEW_PASSWORD_WEAK: "密码过于简单" + NEW_PASSWORD_FORBIDDENT: "密码包含禁止字符" + CONTACTS_SYNC_ERROR: "联系人同步错误" + CANT_GET_MESSAGE_LIST: "无法获取邮件列表" + CANT_GET_MESSAGE: "无法获取邮件" + CANT_DELETE_MESSAGE: "无法删除邮件" + CANT_MOVE_MESSAGE: "无法移动邮件" + CANT_SAVE_MESSAGE: "无法保存邮件" + CANT_SEND_MESSAGE: "无法发送邮件" + INVALID_RECIPIENTS: "无效接收者" + CANT_SAVE_FILTERS: "无法保存过滤器" + CANT_GET_FILTERS: "无法获取过滤器" + FILTERS_ARE_NOT_CORRECT: "过滤器不正确" + CANT_CREATE_FOLDER: "无法创建文件夹" + CANT_RENAME_FOLDER: "无法重命名文件夹" + CANT_DELETE_FOLDER: "无法删除文件夹" + CANT_DELETE_NON_EMPTY_FOLDER: "无法删除非空文件夹" + CANT_SUBSCRIBE_FOLDER: "无法订阅文件夹" + CANT_UNSUBSCRIBE_FOLDER: "无法取消订阅文件夹" + CANT_SAVE_SETTINGS: "无法保存设置" + CANT_SAVE_PLUGIN_SETTINGS: "无法保存设置" + DOMAIN_ALREADY_EXISTS: "域名已经存在" + CANT_INSTALL_PACKAGE: "安装插件包失败" + CANT_DELETE_PACKAGE: "移除插件包失败" + INVALID_PLUGIN_PACKAGE: "无效插件包" + UNSUPPORTED_PLUGIN_PACKAGE: "不支持的插件包" + LICENSING_SERVER_IS_UNAVAILABLE: "订阅服务器不可用" + LICENSING_DOMAIN_EXPIRED: "此域名的订阅服务已过期。" + LICENSING_DOMAIN_BANNED: "此域名的订阅服务已被禁止。" + DEMO_SEND_MESSAGE_ERROR: "出于安全考虑,此账号无法发送外部邮件!" + DEMO_ACCOUNT_ERROR: "出于安全考虑,此账户不允许进行此操作。" + ACCOUNT_ALREADY_EXISTS: "账户已存在" + ACCOUNT_DOES_NOT_EXIST: "账户不存在" + MAIL_SERVER_ERROR: "访问邮件服务器时遇到错误。" + INVALID_INPUT_ARGUMENT: "无效输入参数" + UNKNOWN_ERROR: "未知错误" + STATIC: + BACK_LINK: "重新加载" + DOMAIN_LIST_DESC: "可允许通过webmail访问的域名列表" + PHP_EXSTENSIONS_ERROR_DESC: "需要的PHP扩展在你的PHP配置中不可用!" + PHP_VERSION_ERROR_DESC: "您的PHP版本 (%VERSION%) 低于最低所需的 5.3.0!" + NO_SCRIPT_TITLE: "此应用需要JavaScript支持!" + NO_SCRIPT_DESC: | + 您的浏览器不支持JavaScript。 + 请启用浏览器的JavaScript支持并重试。 + NO_COOKIE_TITLE: "此应用需要Cookies支持!" + NO_COOKIE_DESC: | + 您的浏览器不支持Cookies。 + 请启用浏览器的Cookies支持并重试。 + BAD_BROWSER_TITLE: "您的浏览器过时了。" + BAD_BROWSER_DESC: | + 为了使用所有特性, + 下载并安装其中一款浏览器: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/langs.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/langs.yml new file mode 100755 index 00000000..620c5527 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/langs.yml @@ -0,0 +1,91 @@ + +Common: + LANGS_NAMES: + LANG_EN: English + LANG_EN_US: English + LANG_EN_GB: English (UK) + LANG_EN_UK: English (UK) + LANG_EN_CA: English (Canadian) + + LANG_TH_TH: ภาษาไทย + LANG_EL_GR: Ελληνικά + LANG_NL_NL: Nederlands + LANG_NB_NO: Norsk (bokmål) + LANG_PL_PL: Polski + LANG_RU_RU: Русский + LANG_RO_RO: Română + LANG_UK_UA: Українська + LANG_DE_DE: Deutsch + LANG_FI_FI: Suomi + LANG_FR_FR: Français (France) + LANG_FR_CA: Français (Canada) + LANG_PT_PT: Português (Portugal) + LANG_PT_BR: Português (Brasil) + LANG_ES_ES: Español (España) + LANG_ES_LA: Español + LANG_ET_EE: Eesti + LANG_FA_IR: ‏فارسی‏ + LANG_IT_IT: Italiano + LANG_LT_LT: Lietuvių + LANG_LV_LV: Latviešu + LANG_IS_IS: Íslenska + LANG_HU_HU: Magyar + LANG_TR_TR: Türkçe + LANG_SK_SK: Slovenčina + LANG_SV_SE: Svenska + LANG_SL_SI: Slovenščina + LANG_JA_JP: 日本語 + LANG_ZH_TW: 中文(台灣) + LANG_ZH_CN: 中文(简体) + LANG_ZH_HK: 中文(香港) + LANG_KO_KR: 한국어 + LANG_BG_BG: Български + LANG_CS_CZ: Čeština + LANG_AR_SA: ‏العربية‏ + LANG_DA_DK: Dansk + LANG_ID_ID: Bahasa Indonesia + + LANGS_NAMES_EN: + LANG_EN: English + LANG_EN_US: English (US) + LANG_EN_GB: English (UK) + LANG_EN_UK: English (UK) + LANG_EN_CA: English (Canadian) + + LANG_TH_TH: Thai + LANG_EL_GR: Greek + LANG_NL_NL: Dutch + LANG_NB_NO: Norwegian (bokmal) + LANG_PL_PL: Polish + LANG_RU_RU: Russian + LANG_RO_RO: Romanian + LANG_UK_UA: Ukrainian + LANG_DE_DE: German + LANG_FI_FI: Finnish + LANG_FR_FR: French (France) + LANG_FR_CA: France (Canada) + LANG_PT_PT: Portuguese (Portugal) + LANG_PT_BR: Portuguese (Brazil) + LANG_ES_ES: Spanish + LANG_ES_LA: Spanish + LANG_ET_EE: Estonian + LANG_FA_IR: Persian + LANG_IT_IT: Italian + LANG_LT_LT: Lithuanian + LANG_LV_LV: Latvian + LANG_IS_IS: Icelandic + LANG_HU_HU: Hungarian + LANG_TR_TR: Turkish + LANG_SK_SK: Slovak + LANG_SL_SI: Slovenian + LANG_SV_SE: Swedish + LANG_JA_JP: Japanese + LANG_ZH_TW: Traditional Chinese (Taiwan) + LANG_ZH_CN: Simplified Chinese (China) + LANG_ZH_HK: Traditional Chinese (Hong Kong) + LANG_KO_KR: Korean + LANG_BG_BG: Bulgarian + LANG_CS_CZ: Czech + LANG_AR_SA: Arabic + LANG_DA_DK: Danish + LANG_ID_ID: Indonesian diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/af.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/af.js new file mode 100755 index 00000000..0b2bb26e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/af.js @@ -0,0 +1,72 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var af = moment.defineLocale('af', { + months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'), + weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'), + weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'), + meridiemParse: /vm|nm/i, + isPM : function (input) { + return /^nm$/i.test(input); + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower ? 'vm' : 'VM'; + } else { + return isLower ? 'nm' : 'NM'; + } + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Vandag om] LT', + nextDay : '[Môre om] LT', + nextWeek : 'dddd [om] LT', + lastDay : '[Gister om] LT', + lastWeek : '[Laas] dddd [om] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'oor %s', + past : '%s gelede', + s : '\'n paar sekondes', + ss : '%d sekondes', + m : '\'n minuut', + mm : '%d minute', + h : '\'n uur', + hh : '%d ure', + d : '\'n dag', + dd : '%d dae', + M : '\'n maand', + MM : '%d maande', + y : '\'n jaar', + yy : '%d jaar' + }, + dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter + }, + week : { + dow : 1, // Maandag is die eerste dag van die week. + doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. + } + }); + + return af; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-dz.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-dz.js new file mode 100755 index 00000000..26a7ccb2 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-dz.js @@ -0,0 +1,58 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var arDz = moment.defineLocale('ar-dz', { + months : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + monthsShort : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'أح_إث_ثلا_أر_خم_جم_سب'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'في %s', + past : 'منذ %s', + s : 'ثوان', + ss : '%d ثانية', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 4 // The week that contains Jan 1st is the first week of the year. + } + }); + + return arDz; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-kw.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-kw.js new file mode 100755 index 00000000..10092ba3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-kw.js @@ -0,0 +1,58 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var arKw = moment.defineLocale('ar-kw', { + months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'في %s', + past : 'منذ %s', + s : 'ثوان', + ss : '%d ثانية', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); + + return arKw; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-ly.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-ly.js new file mode 100755 index 00000000..2e3cb1a7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-ly.js @@ -0,0 +1,121 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var symbolMap = { + '1': '1', + '2': '2', + '3': '3', + '4': '4', + '5': '5', + '6': '6', + '7': '7', + '8': '8', + '9': '9', + '0': '0' + }, pluralForm = function (n) { + return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; + }, plurals = { + s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], + m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], + h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], + d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], + M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], + y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] + }, pluralize = function (u) { + return function (number, withoutSuffix, string, isFuture) { + var f = pluralForm(number), + str = plurals[u][pluralForm(number)]; + if (f === 2) { + str = str[withoutSuffix ? 0 : 1]; + } + return str.replace(/%d/i, number); + }; + }, months = [ + 'يناير', + 'فبراير', + 'مارس', + 'أبريل', + 'مايو', + 'يونيو', + 'يوليو', + 'أغسطس', + 'سبتمبر', + 'أكتوبر', + 'نوفمبر', + 'ديسمبر' + ]; + + var arLy = moment.defineLocale('ar-ly', { + months : months, + monthsShort : months, + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'D/\u200FM/\u200FYYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + meridiemParse: /ص|م/, + isPM : function (input) { + return 'م' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'م'; + } + }, + calendar : { + sameDay: '[اليوم عند الساعة] LT', + nextDay: '[غدًا عند الساعة] LT', + nextWeek: 'dddd [عند الساعة] LT', + lastDay: '[أمس عند الساعة] LT', + lastWeek: 'dddd [عند الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'بعد %s', + past : 'منذ %s', + s : pluralize('s'), + ss : pluralize('s'), + m : pluralize('m'), + mm : pluralize('m'), + h : pluralize('h'), + hh : pluralize('h'), + d : pluralize('d'), + dd : pluralize('d'), + M : pluralize('M'), + MM : pluralize('M'), + y : pluralize('y'), + yy : pluralize('y') + }, + preparse: function (string) { + return string.replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, '،'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); + + return arLy; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-ma.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-ma.js new file mode 100755 index 00000000..3d8503d1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-ma.js @@ -0,0 +1,58 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var arMa = moment.defineLocale('ar-ma', { + months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'في %s', + past : 'منذ %s', + s : 'ثوان', + ss : '%d ثانية', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); + + return arMa; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-sa.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-sa.js new file mode 100755 index 00000000..a62f8da4 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-sa.js @@ -0,0 +1,103 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var symbolMap = { + '1': '١', + '2': '٢', + '3': '٣', + '4': '٤', + '5': '٥', + '6': '٦', + '7': '٧', + '8': '٨', + '9': '٩', + '0': '٠' + }, numberMap = { + '١': '1', + '٢': '2', + '٣': '3', + '٤': '4', + '٥': '5', + '٦': '6', + '٧': '7', + '٨': '8', + '٩': '9', + '٠': '0' + }; + + var arSa = moment.defineLocale('ar-sa', { + months : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + monthsShort : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + meridiemParse: /ص|م/, + isPM : function (input) { + return 'م' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'م'; + } + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'في %s', + past : 'منذ %s', + s : 'ثوان', + ss : '%d ثانية', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, '،'); + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); + + return arSa; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-tn.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-tn.js new file mode 100755 index 00000000..8437717b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-tn.js @@ -0,0 +1,58 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var arTn = moment.defineLocale('ar-tn', { + months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd D MMMM YYYY HH:mm' + }, + calendar: { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'في %s', + past: 'منذ %s', + s: 'ثوان', + ss : '%d ثانية', + m: 'دقيقة', + mm: '%d دقائق', + h: 'ساعة', + hh: '%d ساعات', + d: 'يوم', + dd: '%d أيام', + M: 'شهر', + MM: '%d أشهر', + y: 'سنة', + yy: '%d سنوات' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return arTn; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar.js new file mode 100755 index 00000000..3c6506b3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar.js @@ -0,0 +1,134 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var symbolMap = { + '1': '١', + '2': '٢', + '3': '٣', + '4': '٤', + '5': '٥', + '6': '٦', + '7': '٧', + '8': '٨', + '9': '٩', + '0': '٠' + }, numberMap = { + '١': '1', + '٢': '2', + '٣': '3', + '٤': '4', + '٥': '5', + '٦': '6', + '٧': '7', + '٨': '8', + '٩': '9', + '٠': '0' + }, pluralForm = function (n) { + return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; + }, plurals = { + s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], + m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], + h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], + d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], + M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], + y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] + }, pluralize = function (u) { + return function (number, withoutSuffix, string, isFuture) { + var f = pluralForm(number), + str = plurals[u][pluralForm(number)]; + if (f === 2) { + str = str[withoutSuffix ? 0 : 1]; + } + return str.replace(/%d/i, number); + }; + }, months = [ + 'يناير', + 'فبراير', + 'مارس', + 'أبريل', + 'مايو', + 'يونيو', + 'يوليو', + 'أغسطس', + 'سبتمبر', + 'أكتوبر', + 'نوفمبر', + 'ديسمبر' + ]; + + var ar = moment.defineLocale('ar', { + months : months, + monthsShort : months, + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'D/\u200FM/\u200FYYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + meridiemParse: /ص|م/, + isPM : function (input) { + return 'م' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'م'; + } + }, + calendar : { + sameDay: '[اليوم عند الساعة] LT', + nextDay: '[غدًا عند الساعة] LT', + nextWeek: 'dddd [عند الساعة] LT', + lastDay: '[أمس عند الساعة] LT', + lastWeek: 'dddd [عند الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'بعد %s', + past : 'منذ %s', + s : pluralize('s'), + ss : pluralize('s'), + m : pluralize('m'), + mm : pluralize('m'), + h : pluralize('h'), + hh : pluralize('h'), + d : pluralize('d'), + dd : pluralize('d'), + M : pluralize('M'), + MM : pluralize('M'), + y : pluralize('y'), + yy : pluralize('y') + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, '،'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); + + return ar; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/az.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/az.js new file mode 100755 index 00000000..04930726 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/az.js @@ -0,0 +1,104 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var suffixes = { + 1: '-inci', + 5: '-inci', + 8: '-inci', + 70: '-inci', + 80: '-inci', + 2: '-nci', + 7: '-nci', + 20: '-nci', + 50: '-nci', + 3: '-üncü', + 4: '-üncü', + 100: '-üncü', + 6: '-ncı', + 9: '-uncu', + 10: '-uncu', + 30: '-uncu', + 60: '-ıncı', + 90: '-ıncı' + }; + + var az = moment.defineLocale('az', { + months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'), + monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'), + weekdays : 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'), + weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'), + weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[sabah saat] LT', + nextWeek : '[gələn həftə] dddd [saat] LT', + lastDay : '[dünən] LT', + lastWeek : '[keçən həftə] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s əvvəl', + s : 'birneçə saniyyə', + ss : '%d saniyə', + m : 'bir dəqiqə', + mm : '%d dəqiqə', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir il', + yy : '%d il' + }, + meridiemParse: /gecə|səhər|gündüz|axşam/, + isPM : function (input) { + return /^(gündüz|axşam)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'gecə'; + } else if (hour < 12) { + return 'səhər'; + } else if (hour < 17) { + return 'gündüz'; + } else { + return 'axşam'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '-ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return az; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/be.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/be.js new file mode 100755 index 00000000..46a2a11f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/be.js @@ -0,0 +1,131 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'ss': withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд', + 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін', + 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін', + 'dd': 'дзень_дні_дзён', + 'MM': 'месяц_месяцы_месяцаў', + 'yy': 'год_гады_гадоў' + }; + if (key === 'm') { + return withoutSuffix ? 'хвіліна' : 'хвіліну'; + } + else if (key === 'h') { + return withoutSuffix ? 'гадзіна' : 'гадзіну'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + var be = moment.defineLocale('be', { + months : { + format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_'), + standalone: 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_') + }, + monthsShort : 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'), + weekdays : { + format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_'), + standalone: 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'), + isFormat: /\[ ?[Вв] ?(?:мінулую|наступную)? ?\] ?dddd/ + }, + weekdaysShort : 'нд_пн_ат_ср_чц_пт_сб'.split('_'), + weekdaysMin : 'нд_пн_ат_ср_чц_пт_сб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., HH:mm', + LLLL : 'dddd, D MMMM YYYY г., HH:mm' + }, + calendar : { + sameDay: '[Сёння ў] LT', + nextDay: '[Заўтра ў] LT', + lastDay: '[Учора ў] LT', + nextWeek: function () { + return '[У] dddd [ў] LT'; + }, + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return '[У мінулую] dddd [ў] LT'; + case 1: + case 2: + case 4: + return '[У мінулы] dddd [ў] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'праз %s', + past : '%s таму', + s : 'некалькі секунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : relativeTimeWithPlural, + hh : relativeTimeWithPlural, + d : 'дзень', + dd : relativeTimeWithPlural, + M : 'месяц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + meridiemParse: /ночы|раніцы|дня|вечара/, + isPM : function (input) { + return /^(дня|вечара)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночы'; + } else if (hour < 12) { + return 'раніцы'; + } else if (hour < 17) { + return 'дня'; + } else { + return 'вечара'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}-(і|ы|га)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы'; + case 'D': + return number + '-га'; + default: + return number; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return be; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bg.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bg.js new file mode 100755 index 00000000..f8528a2a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bg.js @@ -0,0 +1,89 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var bg = moment.defineLocale('bg', { + months : 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'), + monthsShort : 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'), + weekdays : 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'), + weekdaysShort : 'нед_пон_вто_сря_чет_пет_съб'.split('_'), + weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[Днес в] LT', + nextDay : '[Утре в] LT', + nextWeek : 'dddd [в] LT', + lastDay : '[Вчера в] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[В изминалата] dddd [в] LT'; + case 1: + case 2: + case 4: + case 5: + return '[В изминалия] dddd [в] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'след %s', + past : 'преди %s', + s : 'няколко секунди', + ss : '%d секунди', + m : 'минута', + mm : '%d минути', + h : 'час', + hh : '%d часа', + d : 'ден', + dd : '%d дни', + M : 'месец', + MM : '%d месеца', + y : 'година', + yy : '%d години' + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return bg; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bm.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bm.js new file mode 100755 index 00000000..2bb50f51 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bm.js @@ -0,0 +1,57 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var bm = moment.defineLocale('bm', { + months : 'Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo'.split('_'), + monthsShort : 'Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des'.split('_'), + weekdays : 'Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri'.split('_'), + weekdaysShort : 'Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib'.split('_'), + weekdaysMin : 'Ka_Nt_Ta_Ar_Al_Ju_Si'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'MMMM [tile] D [san] YYYY', + LLL : 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm', + LLLL : 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm' + }, + calendar : { + sameDay : '[Bi lɛrɛ] LT', + nextDay : '[Sini lɛrɛ] LT', + nextWeek : 'dddd [don lɛrɛ] LT', + lastDay : '[Kunu lɛrɛ] LT', + lastWeek : 'dddd [tɛmɛnen lɛrɛ] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s kɔnɔ', + past : 'a bɛ %s bɔ', + s : 'sanga dama dama', + ss : 'sekondi %d', + m : 'miniti kelen', + mm : 'miniti %d', + h : 'lɛrɛ kelen', + hh : 'lɛrɛ %d', + d : 'tile kelen', + dd : 'tile %d', + M : 'kalo kelen', + MM : 'kalo %d', + y : 'san kelen', + yy : 'san %d' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return bm; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bn.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bn.js new file mode 100755 index 00000000..d7d33f53 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bn.js @@ -0,0 +1,118 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var symbolMap = { + '1': '১', + '2': '২', + '3': '৩', + '4': '৪', + '5': '৫', + '6': '৬', + '7': '৭', + '8': '৮', + '9': '৯', + '0': '০' + }, + numberMap = { + '১': '1', + '২': '2', + '৩': '3', + '৪': '4', + '৫': '5', + '৬': '6', + '৭': '7', + '৮': '8', + '৯': '9', + '০': '0' + }; + + var bn = moment.defineLocale('bn', { + months : 'জানুয়ারী_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'), + monthsShort : 'জানু_ফেব_মার্চ_এপ্র_মে_জুন_জুল_আগ_সেপ্ট_অক্টো_নভে_ডিসে'.split('_'), + weekdays : 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split('_'), + weekdaysShort : 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'), + weekdaysMin : 'রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি'.split('_'), + longDateFormat : { + LT : 'A h:mm সময়', + LTS : 'A h:mm:ss সময়', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm সময়', + LLLL : 'dddd, D MMMM YYYY, A h:mm সময়' + }, + calendar : { + sameDay : '[আজ] LT', + nextDay : '[আগামীকাল] LT', + nextWeek : 'dddd, LT', + lastDay : '[গতকাল] LT', + lastWeek : '[গত] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s পরে', + past : '%s আগে', + s : 'কয়েক সেকেন্ড', + ss : '%d সেকেন্ড', + m : 'এক মিনিট', + mm : '%d মিনিট', + h : 'এক ঘন্টা', + hh : '%d ঘন্টা', + d : 'এক দিন', + dd : '%d দিন', + M : 'এক মাস', + MM : '%d মাস', + y : 'এক বছর', + yy : '%d বছর' + }, + preparse: function (string) { + return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if ((meridiem === 'রাত' && hour >= 4) || + (meridiem === 'দুপুর' && hour < 5) || + meridiem === 'বিকাল') { + return hour + 12; + } else { + return hour; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'রাত'; + } else if (hour < 10) { + return 'সকাল'; + } else if (hour < 17) { + return 'দুপুর'; + } else if (hour < 20) { + return 'বিকাল'; + } else { + return 'রাত'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); + + return bn; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bo.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bo.js new file mode 100755 index 00000000..ff0dcbec --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bo.js @@ -0,0 +1,118 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var symbolMap = { + '1': '༡', + '2': '༢', + '3': '༣', + '4': '༤', + '5': '༥', + '6': '༦', + '7': '༧', + '8': '༨', + '9': '༩', + '0': '༠' + }, + numberMap = { + '༡': '1', + '༢': '2', + '༣': '3', + '༤': '4', + '༥': '5', + '༦': '6', + '༧': '7', + '༨': '8', + '༩': '9', + '༠': '0' + }; + + var bo = moment.defineLocale('bo', { + months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'), + weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'A h:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm', + LLLL : 'dddd, D MMMM YYYY, A h:mm' + }, + calendar : { + sameDay : '[དི་རིང] LT', + nextDay : '[སང་ཉིན] LT', + nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT', + lastDay : '[ཁ་སང] LT', + lastWeek : '[བདུན་ཕྲག་མཐའ་མ] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ལ་', + past : '%s སྔན་ལ', + s : 'ལམ་སང', + ss : '%d སྐར་ཆ།', + m : 'སྐར་མ་གཅིག', + mm : '%d སྐར་མ', + h : 'ཆུ་ཚོད་གཅིག', + hh : '%d ཆུ་ཚོད', + d : 'ཉིན་གཅིག', + dd : '%d ཉིན་', + M : 'ཟླ་བ་གཅིག', + MM : '%d ཟླ་བ', + y : 'ལོ་གཅིག', + yy : '%d ལོ' + }, + preparse: function (string) { + return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if ((meridiem === 'མཚན་མོ' && hour >= 4) || + (meridiem === 'ཉིན་གུང' && hour < 5) || + meridiem === 'དགོང་དག') { + return hour + 12; + } else { + return hour; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'མཚན་མོ'; + } else if (hour < 10) { + return 'ཞོགས་ཀས'; + } else if (hour < 17) { + return 'ཉིན་གུང'; + } else if (hour < 20) { + return 'དགོང་དག'; + } else { + return 'མཚན་མོ'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); + + return bo; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/br.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/br.js new file mode 100755 index 00000000..42994ca6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/br.js @@ -0,0 +1,107 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + function relativeTimeWithMutation(number, withoutSuffix, key) { + var format = { + 'mm': 'munutenn', + 'MM': 'miz', + 'dd': 'devezh' + }; + return number + ' ' + mutation(format[key], number); + } + function specialMutationForYears(number) { + switch (lastNumber(number)) { + case 1: + case 3: + case 4: + case 5: + case 9: + return number + ' bloaz'; + default: + return number + ' vloaz'; + } + } + function lastNumber(number) { + if (number > 9) { + return lastNumber(number % 10); + } + return number; + } + function mutation(text, number) { + if (number === 2) { + return softMutation(text); + } + return text; + } + function softMutation(text) { + var mutationTable = { + 'm': 'v', + 'b': 'v', + 'd': 'z' + }; + if (mutationTable[text.charAt(0)] === undefined) { + return text; + } + return mutationTable[text.charAt(0)] + text.substring(1); + } + + var br = moment.defineLocale('br', { + months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'), + monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'), + weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'), + weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'), + weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'h[e]mm A', + LTS : 'h[e]mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D [a viz] MMMM YYYY', + LLL : 'D [a viz] MMMM YYYY h[e]mm A', + LLLL : 'dddd, D [a viz] MMMM YYYY h[e]mm A' + }, + calendar : { + sameDay : '[Hiziv da] LT', + nextDay : '[Warc\'hoazh da] LT', + nextWeek : 'dddd [da] LT', + lastDay : '[Dec\'h da] LT', + lastWeek : 'dddd [paset da] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'a-benn %s', + past : '%s \'zo', + s : 'un nebeud segondennoù', + ss : '%d eilenn', + m : 'ur vunutenn', + mm : relativeTimeWithMutation, + h : 'un eur', + hh : '%d eur', + d : 'un devezh', + dd : relativeTimeWithMutation, + M : 'ur miz', + MM : relativeTimeWithMutation, + y : 'ur bloaz', + yy : specialMutationForYears + }, + dayOfMonthOrdinalParse: /\d{1,2}(añ|vet)/, + ordinal : function (number) { + var output = (number === 1) ? 'añ' : 'vet'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return br; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bs.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bs.js new file mode 100755 index 00000000..0aaf0e14 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bs.js @@ -0,0 +1,150 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'ss': + if (number === 1) { + result += 'sekunda'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sekunde'; + } else { + result += 'sekundi'; + } + return result; + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + var bs = moment.defineLocale('bs', { + months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd, D. MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[jučer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[prošlu] dddd [u] LT'; + case 6: + return '[prošle] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prošli] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return bs; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ca.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ca.js new file mode 100755 index 00000000..9a823b93 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ca.js @@ -0,0 +1,87 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var ca = moment.defineLocale('ca', { + months : { + standalone: 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'), + format: 'de gener_de febrer_de març_d\'abril_de maig_de juny_de juliol_d\'agost_de setembre_d\'octubre_de novembre_de desembre'.split('_'), + isFormat: /D[oD]?(\s)+MMMM/ + }, + monthsShort : 'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split('_'), + monthsParseExact : true, + weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'), + weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), + weekdaysMin : 'dg_dl_dt_dc_dj_dv_ds'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM [de] YYYY', + ll : 'D MMM YYYY', + LLL : 'D MMMM [de] YYYY [a les] H:mm', + lll : 'D MMM YYYY, H:mm', + LLLL : 'dddd D MMMM [de] YYYY [a les] H:mm', + llll : 'ddd D MMM YYYY, H:mm' + }, + calendar : { + sameDay : function () { + return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextDay : function () { + return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastDay : function () { + return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'd\'aquí %s', + past : 'fa %s', + s : 'uns segons', + ss : '%d segons', + m : 'un minut', + mm : '%d minuts', + h : 'una hora', + hh : '%d hores', + d : 'un dia', + dd : '%d dies', + M : 'un mes', + MM : '%d mesos', + y : 'un any', + yy : '%d anys' + }, + dayOfMonthOrdinalParse: /\d{1,2}(r|n|t|è|a)/, + ordinal : function (number, period) { + var output = (number === 1) ? 'r' : + (number === 2) ? 'n' : + (number === 3) ? 'r' : + (number === 4) ? 't' : 'è'; + if (period === 'w' || period === 'W') { + output = 'a'; + } + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return ca; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cs.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cs.js new file mode 100755 index 00000000..5ae9b627 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cs.js @@ -0,0 +1,178 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var months = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_'), + monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_'); + function plural(n) { + return (n > 1) && (n < 5) && (~~(n / 10) !== 1); + } + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami'; + case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'sekundy' : 'sekund'); + } else { + return result + 'sekundami'; + } + break; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minuty' : 'minut'); + } else { + return result + 'minutami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodin'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'den' : 'dnem'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dny' : 'dní'); + } else { + return result + 'dny'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'měsíce' : 'měsíců'); + } else { + return result + 'měsíci'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'let'); + } else { + return result + 'lety'; + } + break; + } + } + + var cs = moment.defineLocale('cs', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (červenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + shortMonthsParse : (function (monthsShort) { + var i, _shortMonthsParse = []; + for (i = 0; i < 12; i++) { + _shortMonthsParse[i] = new RegExp('^' + monthsShort[i] + '$', 'i'); + } + return _shortMonthsParse; + }(monthsShort)), + longMonthsParse : (function (months) { + var i, _longMonthsParse = []; + for (i = 0; i < 12; i++) { + _longMonthsParse[i] = new RegExp('^' + months[i] + '$', 'i'); + } + return _longMonthsParse; + }(months)), + weekdays : 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'), + weekdaysShort : 'ne_po_út_st_čt_pá_so'.split('_'), + weekdaysMin : 'ne_po_út_st_čt_pá_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd D. MMMM YYYY H:mm', + l : 'D. M. YYYY' + }, + calendar : { + sameDay: '[dnes v] LT', + nextDay: '[zítra v] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v neděli v] LT'; + case 1: + case 2: + return '[v] dddd [v] LT'; + case 3: + return '[ve středu v] LT'; + case 4: + return '[ve čtvrtek v] LT'; + case 5: + return '[v pátek v] LT'; + case 6: + return '[v sobotu v] LT'; + } + }, + lastDay: '[včera v] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulou neděli v] LT'; + case 1: + case 2: + return '[minulé] dddd [v] LT'; + case 3: + return '[minulou středu v] LT'; + case 4: + case 5: + return '[minulý] dddd [v] LT'; + case 6: + return '[minulou sobotu v] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'před %s', + s : translate, + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + dayOfMonthOrdinalParse : /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return cs; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cv.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cv.js new file mode 100755 index 00000000..9b99c3c4 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cv.js @@ -0,0 +1,62 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var cv = moment.defineLocale('cv', { + months : 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split('_'), + monthsShort : 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'), + weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split('_'), + weekdaysShort : 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'), + weekdaysMin : 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD-MM-YYYY', + LL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]', + LLL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm', + LLLL : 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm' + }, + calendar : { + sameDay: '[Паян] LT [сехетре]', + nextDay: '[Ыран] LT [сехетре]', + lastDay: '[Ӗнер] LT [сехетре]', + nextWeek: '[Ҫитес] dddd LT [сехетре]', + lastWeek: '[Иртнӗ] dddd LT [сехетре]', + sameElse: 'L' + }, + relativeTime : { + future : function (output) { + var affix = /сехет$/i.exec(output) ? 'рен' : /ҫул$/i.exec(output) ? 'тан' : 'ран'; + return output + affix; + }, + past : '%s каялла', + s : 'пӗр-ик ҫеккунт', + ss : '%d ҫеккунт', + m : 'пӗр минут', + mm : '%d минут', + h : 'пӗр сехет', + hh : '%d сехет', + d : 'пӗр кун', + dd : '%d кун', + M : 'пӗр уйӑх', + MM : '%d уйӑх', + y : 'пӗр ҫул', + yy : '%d ҫул' + }, + dayOfMonthOrdinalParse: /\d{1,2}-мӗш/, + ordinal : '%d-мӗш', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return cv; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cy.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cy.js new file mode 100755 index 00000000..84cbd463 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cy.js @@ -0,0 +1,79 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var cy = moment.defineLocale('cy', { + months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'), + monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'), + weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'), + weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'), + weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'), + weekdaysParseExact : true, + // time formats are the same as en-gb + longDateFormat: { + LT: 'HH:mm', + LTS : 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd, D MMMM YYYY HH:mm' + }, + calendar: { + sameDay: '[Heddiw am] LT', + nextDay: '[Yfory am] LT', + nextWeek: 'dddd [am] LT', + lastDay: '[Ddoe am] LT', + lastWeek: 'dddd [diwethaf am] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'mewn %s', + past: '%s yn ôl', + s: 'ychydig eiliadau', + ss: '%d eiliad', + m: 'munud', + mm: '%d munud', + h: 'awr', + hh: '%d awr', + d: 'diwrnod', + dd: '%d diwrnod', + M: 'mis', + MM: '%d mis', + y: 'blwyddyn', + yy: '%d flynedd' + }, + dayOfMonthOrdinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/, + // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh + ordinal: function (number) { + var b = number, + output = '', + lookup = [ + '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed + 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed + ]; + if (b > 20) { + if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) { + output = 'fed'; // not 30ain, 70ain or 90ain + } else { + output = 'ain'; + } + } else if (b > 0) { + output = lookup[b]; + } + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return cy; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/da.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/da.js new file mode 100755 index 00000000..22a1a5b9 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/da.js @@ -0,0 +1,59 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var da = moment.defineLocale('da', { + months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY HH:mm', + LLLL : 'dddd [d.] D. MMMM YYYY [kl.] HH:mm' + }, + calendar : { + sameDay : '[i dag kl.] LT', + nextDay : '[i morgen kl.] LT', + nextWeek : 'på dddd [kl.] LT', + lastDay : '[i går kl.] LT', + lastWeek : '[i] dddd[s kl.] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s siden', + s : 'få sekunder', + ss : '%d sekunder', + m : 'et minut', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dage', + M : 'en måned', + MM : '%d måneder', + y : 'et år', + yy : '%d år' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return da; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de-at.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de-at.js new file mode 100755 index 00000000..e3ac47b4 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de-at.js @@ -0,0 +1,75 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + var deAt = moment.defineLocale('de-at', { + months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY HH:mm', + LLLL : 'dddd, D. MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + ss : '%d Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return deAt; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de-ch.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de-ch.js new file mode 100755 index 00000000..2676afbc --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de-ch.js @@ -0,0 +1,75 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + var deCh = moment.defineLocale('de-ch', { + months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY HH:mm', + LLLL : 'dddd, D. MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + ss : '%d Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return deCh; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de.js new file mode 100755 index 00000000..d5c084a2 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de.js @@ -0,0 +1,75 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + var de = moment.defineLocale('de', { + months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY HH:mm', + LLLL : 'dddd, D. MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + ss : '%d Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return de; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/dv.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/dv.js new file mode 100755 index 00000000..6f057ca1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/dv.js @@ -0,0 +1,98 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var months = [ + 'ޖެނުއަރީ', + 'ފެބްރުއަރީ', + 'މާރިޗު', + 'އޭޕްރީލު', + 'މޭ', + 'ޖޫން', + 'ޖުލައި', + 'އޯގަސްޓު', + 'ސެޕްޓެމްބަރު', + 'އޮކްޓޯބަރު', + 'ނޮވެމްބަރު', + 'ޑިސެމްބަރު' + ], weekdays = [ + 'އާދިއްތަ', + 'ހޯމަ', + 'އަންގާރަ', + 'ބުދަ', + 'ބުރާސްފަތި', + 'ހުކުރު', + 'ހޮނިހިރު' + ]; + + var dv = moment.defineLocale('dv', { + months : months, + monthsShort : months, + weekdays : weekdays, + weekdaysShort : weekdays, + weekdaysMin : 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'), + longDateFormat : { + + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'D/M/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + meridiemParse: /މކ|މފ/, + isPM : function (input) { + return 'މފ' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'މކ'; + } else { + return 'މފ'; + } + }, + calendar : { + sameDay : '[މިއަދު] LT', + nextDay : '[މާދަމާ] LT', + nextWeek : 'dddd LT', + lastDay : '[އިއްޔެ] LT', + lastWeek : '[ފާއިތުވި] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : 'ތެރޭގައި %s', + past : 'ކުރިން %s', + s : 'ސިކުންތުކޮޅެއް', + ss : 'd% ސިކުންތު', + m : 'މިނިޓެއް', + mm : 'މިނިޓު %d', + h : 'ގަޑިއިރެއް', + hh : 'ގަޑިއިރު %d', + d : 'ދުވަހެއް', + dd : 'ދުވަސް %d', + M : 'މަހެއް', + MM : 'މަސް %d', + y : 'އަހަރެއް', + yy : 'އަހަރު %d' + }, + preparse: function (string) { + return string.replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/,/g, '،'); + }, + week : { + dow : 7, // Sunday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); + + return dv; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/el.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/el.js new file mode 100755 index 00000000..f01fa772 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/el.js @@ -0,0 +1,99 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + function isFunction(input) { + return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; + } + + + var el = moment.defineLocale('el', { + monthsNominativeEl : 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'), + monthsGenitiveEl : 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split('_'), + months : function (momentToFormat, format) { + if (!momentToFormat) { + return this._monthsNominativeEl; + } else if (typeof format === 'string' && /D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM' + return this._monthsGenitiveEl[momentToFormat.month()]; + } else { + return this._monthsNominativeEl[momentToFormat.month()]; + } + }, + monthsShort : 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'), + weekdays : 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split('_'), + weekdaysShort : 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'), + weekdaysMin : 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'), + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'μμ' : 'ΜΜ'; + } else { + return isLower ? 'πμ' : 'ΠΜ'; + } + }, + isPM : function (input) { + return ((input + '').toLowerCase()[0] === 'μ'); + }, + meridiemParse : /[ΠΜ]\.?Μ?\.?/i, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendarEl : { + sameDay : '[Σήμερα {}] LT', + nextDay : '[Αύριο {}] LT', + nextWeek : 'dddd [{}] LT', + lastDay : '[Χθες {}] LT', + lastWeek : function () { + switch (this.day()) { + case 6: + return '[το προηγούμενο] dddd [{}] LT'; + default: + return '[την προηγούμενη] dddd [{}] LT'; + } + }, + sameElse : 'L' + }, + calendar : function (key, mom) { + var output = this._calendarEl[key], + hours = mom && mom.hours(); + if (isFunction(output)) { + output = output.apply(mom); + } + return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις')); + }, + relativeTime : { + future : 'σε %s', + past : '%s πριν', + s : 'λίγα δευτερόλεπτα', + ss : '%d δευτερόλεπτα', + m : 'ένα λεπτό', + mm : '%d λεπτά', + h : 'μία ώρα', + hh : '%d ώρες', + d : 'μία μέρα', + dd : '%d μέρες', + M : 'ένας μήνας', + MM : '%d μήνες', + y : 'ένας χρόνος', + yy : '%d χρόνια' + }, + dayOfMonthOrdinalParse: /\d{1,2}η/, + ordinal: '%dη', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4st is the first week of the year. + } + }); + + return el; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-au.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-au.js new file mode 100755 index 00000000..37202378 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-au.js @@ -0,0 +1,66 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var enAu = moment.defineLocale('en-au', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return enAu; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-ca.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-ca.js new file mode 100755 index 00000000..5d0dab08 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-ca.js @@ -0,0 +1,62 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var enCa = moment.defineLocale('en-ca', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'YYYY-MM-DD', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY h:mm A', + LLLL : 'dddd, MMMM D, YYYY h:mm A' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); + + return enCa; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-gb.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-gb.js new file mode 100755 index 00000000..85302e5d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-gb.js @@ -0,0 +1,66 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var enGb = moment.defineLocale('en-gb', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return enGb; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-ie.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-ie.js new file mode 100755 index 00000000..ede6c671 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-ie.js @@ -0,0 +1,66 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var enIe = moment.defineLocale('en-ie', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return enIe; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-il.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-il.js new file mode 100755 index 00000000..b18eab86 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-il.js @@ -0,0 +1,61 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var enIl = moment.defineLocale('en-il', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); + + return enIl; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-nz.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-nz.js new file mode 100755 index 00000000..f4325d4c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-nz.js @@ -0,0 +1,66 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var enNz = moment.defineLocale('en-nz', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return enNz; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/eo.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/eo.js new file mode 100755 index 00000000..40eaee2f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/eo.js @@ -0,0 +1,70 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var eo = moment.defineLocale('eo', { + months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec'.split('_'), + weekdays : 'dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato'.split('_'), + weekdaysShort : 'dim_lun_mard_merk_ĵaŭ_ven_sab'.split('_'), + weekdaysMin : 'di_lu_ma_me_ĵa_ve_sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'D[-a de] MMMM, YYYY', + LLL : 'D[-a de] MMMM, YYYY HH:mm', + LLLL : 'dddd, [la] D[-a de] MMMM, YYYY HH:mm' + }, + meridiemParse: /[ap]\.t\.m/i, + isPM: function (input) { + return input.charAt(0).toLowerCase() === 'p'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'p.t.m.' : 'P.T.M.'; + } else { + return isLower ? 'a.t.m.' : 'A.T.M.'; + } + }, + calendar : { + sameDay : '[Hodiaŭ je] LT', + nextDay : '[Morgaŭ je] LT', + nextWeek : 'dddd [je] LT', + lastDay : '[Hieraŭ je] LT', + lastWeek : '[pasinta] dddd [je] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'post %s', + past : 'antaŭ %s', + s : 'sekundoj', + ss : '%d sekundoj', + m : 'minuto', + mm : '%d minutoj', + h : 'horo', + hh : '%d horoj', + d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo + dd : '%d tagoj', + M : 'monato', + MM : '%d monatoj', + y : 'jaro', + yy : '%d jaroj' + }, + dayOfMonthOrdinalParse: /\d{1,2}a/, + ordinal : '%da', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return eo; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es-do.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es-do.js new file mode 100755 index 00000000..829c2de8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es-do.js @@ -0,0 +1,91 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); + + var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i]; + var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; + + var esDo = moment.defineLocale('es-do', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortDot; + } else if (/-MMM-/.test(format)) { + return monthsShort[m.month()]; + } else { + return monthsShortDot[m.month()]; + } + }, + monthsRegex: monthsRegex, + monthsShortRegex: monthsRegex, + monthsStrictRegex: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, + monthsShortStrictRegex: /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, + monthsParse: monthsParse, + longMonthsParse: monthsParse, + shortMonthsParse: monthsParse, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY h:mm A', + LLLL : 'dddd, D [de] MMMM [de] YYYY h:mm A' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + ss : '%d segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return esDo; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es-us.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es-us.js new file mode 100755 index 00000000..c12b5326 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es-us.js @@ -0,0 +1,82 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); + + var esUs = moment.defineLocale('es-us', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortDot; + } else if (/-MMM-/.test(format)) { + return monthsShort[m.month()]; + } else { + return monthsShortDot[m.month()]; + } + }, + monthsParseExact : true, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'MM/DD/YYYY', + LL : 'MMMM [de] D [de] YYYY', + LLL : 'MMMM [de] D [de] YYYY h:mm A', + LLLL : 'dddd, MMMM [de] D [de] YYYY h:mm A' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + ss : '%d segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); + + return esUs; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es.js new file mode 100755 index 00000000..aed68026 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es.js @@ -0,0 +1,91 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); + + var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i]; + var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; + + var es = moment.defineLocale('es', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortDot; + } else if (/-MMM-/.test(format)) { + return monthsShort[m.month()]; + } else { + return monthsShortDot[m.month()]; + } + }, + monthsRegex : monthsRegex, + monthsShortRegex : monthsRegex, + monthsStrictRegex : /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, + monthsShortStrictRegex : /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY H:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + ss : '%d segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return es; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/et.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/et.js new file mode 100755 index 00000000..8a81b040 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/et.js @@ -0,0 +1,79 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], + 'ss': [number + 'sekundi', number + 'sekundit'], + 'm' : ['ühe minuti', 'üks minut'], + 'mm': [number + ' minuti', number + ' minutit'], + 'h' : ['ühe tunni', 'tund aega', 'üks tund'], + 'hh': [number + ' tunni', number + ' tundi'], + 'd' : ['ühe päeva', 'üks päev'], + 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], + 'MM': [number + ' kuu', number + ' kuud'], + 'y' : ['ühe aasta', 'aasta', 'üks aasta'], + 'yy': [number + ' aasta', number + ' aastat'] + }; + if (withoutSuffix) { + return format[key][2] ? format[key][2] : format[key][1]; + } + return isFuture ? format[key][0] : format[key][1]; + } + + var et = moment.defineLocale('et', { + months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), + monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), + weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), + weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), + weekdaysMin : 'P_E_T_K_N_R_L'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd, D. MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[Täna,] LT', + nextDay : '[Homme,] LT', + nextWeek : '[Järgmine] dddd LT', + lastDay : '[Eile,] LT', + lastWeek : '[Eelmine] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s pärast', + past : '%s tagasi', + s : processRelativeTime, + ss : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : '%d päeva', + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return et; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/eu.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/eu.js new file mode 100755 index 00000000..afe919fd --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/eu.js @@ -0,0 +1,65 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var eu = moment.defineLocale('eu', { + months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), + monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), + monthsParseExact : true, + weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), + weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), + weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY[ko] MMMM[ren] D[a]', + LLL : 'YYYY[ko] MMMM[ren] D[a] HH:mm', + LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm', + l : 'YYYY-M-D', + ll : 'YYYY[ko] MMM D[a]', + lll : 'YYYY[ko] MMM D[a] HH:mm', + llll : 'ddd, YYYY[ko] MMM D[a] HH:mm' + }, + calendar : { + sameDay : '[gaur] LT[etan]', + nextDay : '[bihar] LT[etan]', + nextWeek : 'dddd LT[etan]', + lastDay : '[atzo] LT[etan]', + lastWeek : '[aurreko] dddd LT[etan]', + sameElse : 'L' + }, + relativeTime : { + future : '%s barru', + past : 'duela %s', + s : 'segundo batzuk', + ss : '%d segundo', + m : 'minutu bat', + mm : '%d minutu', + h : 'ordu bat', + hh : '%d ordu', + d : 'egun bat', + dd : '%d egun', + M : 'hilabete bat', + MM : '%d hilabete', + y : 'urte bat', + yy : '%d urte' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return eu; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fa.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fa.js new file mode 100755 index 00000000..c042e315 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fa.js @@ -0,0 +1,105 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var symbolMap = { + '1': '۱', + '2': '۲', + '3': '۳', + '4': '۴', + '5': '۵', + '6': '۶', + '7': '۷', + '8': '۸', + '9': '۹', + '0': '۰' + }, numberMap = { + '۱': '1', + '۲': '2', + '۳': '3', + '۴': '4', + '۵': '5', + '۶': '6', + '۷': '7', + '۸': '8', + '۹': '9', + '۰': '0' + }; + + var fa = moment.defineLocale('fa', { + months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + meridiemParse: /قبل از ظهر|بعد از ظهر/, + isPM: function (input) { + return /بعد از ظهر/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'قبل از ظهر'; + } else { + return 'بعد از ظهر'; + } + }, + calendar : { + sameDay : '[امروز ساعت] LT', + nextDay : '[فردا ساعت] LT', + nextWeek : 'dddd [ساعت] LT', + lastDay : '[دیروز ساعت] LT', + lastWeek : 'dddd [پیش] [ساعت] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'در %s', + past : '%s پیش', + s : 'چند ثانیه', + ss : 'ثانیه d%', + m : 'یک دقیقه', + mm : '%d دقیقه', + h : 'یک ساعت', + hh : '%d ساعت', + d : 'یک روز', + dd : '%d روز', + M : 'یک ماه', + MM : '%d ماه', + y : 'یک سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/[۰-۹]/g, function (match) { + return numberMap[match]; + }).replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, '،'); + }, + dayOfMonthOrdinalParse: /\d{1,2}م/, + ordinal : '%dم', + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); + + return fa; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fi.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fi.js new file mode 100755 index 00000000..b0115993 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fi.js @@ -0,0 +1,108 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), + numbersFuture = [ + 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', + numbersPast[7], numbersPast[8], numbersPast[9] + ]; + function translate(number, withoutSuffix, key, isFuture) { + var result = ''; + switch (key) { + case 's': + return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; + case 'ss': + return isFuture ? 'sekunnin' : 'sekuntia'; + case 'm': + return isFuture ? 'minuutin' : 'minuutti'; + case 'mm': + result = isFuture ? 'minuutin' : 'minuuttia'; + break; + case 'h': + return isFuture ? 'tunnin' : 'tunti'; + case 'hh': + result = isFuture ? 'tunnin' : 'tuntia'; + break; + case 'd': + return isFuture ? 'päivän' : 'päivä'; + case 'dd': + result = isFuture ? 'päivän' : 'päivää'; + break; + case 'M': + return isFuture ? 'kuukauden' : 'kuukausi'; + case 'MM': + result = isFuture ? 'kuukauden' : 'kuukautta'; + break; + case 'y': + return isFuture ? 'vuoden' : 'vuosi'; + case 'yy': + result = isFuture ? 'vuoden' : 'vuotta'; + break; + } + result = verbalNumber(number, isFuture) + ' ' + result; + return result; + } + function verbalNumber(number, isFuture) { + return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; + } + + var fi = moment.defineLocale('fi', { + months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), + monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), + weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), + weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), + weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'Do MMMM[ta] YYYY', + LLL : 'Do MMMM[ta] YYYY, [klo] HH.mm', + LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm', + l : 'D.M.YYYY', + ll : 'Do MMM YYYY', + lll : 'Do MMM YYYY, [klo] HH.mm', + llll : 'ddd, Do MMM YYYY, [klo] HH.mm' + }, + calendar : { + sameDay : '[tänään] [klo] LT', + nextDay : '[huomenna] [klo] LT', + nextWeek : 'dddd [klo] LT', + lastDay : '[eilen] [klo] LT', + lastWeek : '[viime] dddd[na] [klo] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s päästä', + past : '%s sitten', + s : translate, + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return fi; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fo.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fo.js new file mode 100755 index 00000000..eac46d2b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fo.js @@ -0,0 +1,59 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var fo = moment.defineLocale('fo', { + months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), + weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), + weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D. MMMM, YYYY HH:mm' + }, + calendar : { + sameDay : '[Í dag kl.] LT', + nextDay : '[Í morgin kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[Í gjár kl.] LT', + lastWeek : '[síðstu] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'um %s', + past : '%s síðani', + s : 'fá sekund', + ss : '%d sekundir', + m : 'ein minutt', + mm : '%d minuttir', + h : 'ein tími', + hh : '%d tímar', + d : 'ein dagur', + dd : '%d dagar', + M : 'ein mánaði', + MM : '%d mánaðir', + y : 'eitt ár', + yy : '%d ár' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return fo; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr-ca.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr-ca.js new file mode 100755 index 00000000..ad1f77d5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr-ca.js @@ -0,0 +1,73 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var frCa = moment.defineLocale('fr-ca', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + monthsParseExact : true, + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Aujourd’hui à] LT', + nextDay : '[Demain à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[Hier à] LT', + lastWeek : 'dddd [dernier à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + ss : '%d secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + dayOfMonthOrdinalParse: /\d{1,2}(er|e)/, + ordinal : function (number, period) { + switch (period) { + // Words with masculine grammatical gender: mois, trimestre, jour + default: + case 'M': + case 'Q': + case 'D': + case 'DDD': + case 'd': + return number + (number === 1 ? 'er' : 'e'); + + // Words with feminine grammatical gender: semaine + case 'w': + case 'W': + return number + (number === 1 ? 're' : 'e'); + } + } + }); + + return frCa; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr-ch.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr-ch.js new file mode 100755 index 00000000..54033d14 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr-ch.js @@ -0,0 +1,77 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var frCh = moment.defineLocale('fr-ch', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + monthsParseExact : true, + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Aujourd’hui à] LT', + nextDay : '[Demain à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[Hier à] LT', + lastWeek : 'dddd [dernier à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + ss : '%d secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + dayOfMonthOrdinalParse: /\d{1,2}(er|e)/, + ordinal : function (number, period) { + switch (period) { + // Words with masculine grammatical gender: mois, trimestre, jour + default: + case 'M': + case 'Q': + case 'D': + case 'DDD': + case 'd': + return number + (number === 1 ? 'er' : 'e'); + + // Words with feminine grammatical gender: semaine + case 'w': + case 'W': + return number + (number === 1 ? 're' : 'e'); + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return frCh; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr.js new file mode 100755 index 00000000..92867073 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr.js @@ -0,0 +1,82 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var fr = moment.defineLocale('fr', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + monthsParseExact : true, + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Aujourd’hui à] LT', + nextDay : '[Demain à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[Hier à] LT', + lastWeek : 'dddd [dernier à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + ss : '%d secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + dayOfMonthOrdinalParse: /\d{1,2}(er|)/, + ordinal : function (number, period) { + switch (period) { + // TODO: Return 'e' when day of month > 1. Move this case inside + // block for masculine words below. + // See https://github.com/moment/moment/issues/3375 + case 'D': + return number + (number === 1 ? 'er' : ''); + + // Words with masculine grammatical gender: mois, trimestre, jour + default: + case 'M': + case 'Q': + case 'DDD': + case 'd': + return number + (number === 1 ? 'er' : 'e'); + + // Words with feminine grammatical gender: semaine + case 'w': + case 'W': + return number + (number === 1 ? 're' : 'e'); + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return fr; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fy.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fy.js new file mode 100755 index 00000000..9a672bf4 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fy.js @@ -0,0 +1,74 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); + + var fy = moment.defineLocale('fy', { + months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortWithDots; + } else if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + monthsParseExact : true, + weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), + weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), + weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[hjoed om] LT', + nextDay: '[moarn om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[juster om] LT', + lastWeek: '[ôfrûne] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'oer %s', + past : '%s lyn', + s : 'in pear sekonden', + ss : '%d sekonden', + m : 'ien minút', + mm : '%d minuten', + h : 'ien oere', + hh : '%d oeren', + d : 'ien dei', + dd : '%d dagen', + M : 'ien moanne', + MM : '%d moannen', + y : 'ien jier', + yy : '%d jierren' + }, + dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return fy; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gd.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gd.js new file mode 100755 index 00000000..4d0d88a7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gd.js @@ -0,0 +1,75 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var months = [ + 'Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd' + ]; + + var monthsShort = ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh']; + + var weekdays = ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne']; + + var weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis']; + + var weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa']; + + var gd = moment.defineLocale('gd', { + months : months, + monthsShort : monthsShort, + monthsParseExact : true, + weekdays : weekdays, + weekdaysShort : weekdaysShort, + weekdaysMin : weekdaysMin, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[An-diugh aig] LT', + nextDay : '[A-màireach aig] LT', + nextWeek : 'dddd [aig] LT', + lastDay : '[An-dè aig] LT', + lastWeek : 'dddd [seo chaidh] [aig] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'ann an %s', + past : 'bho chionn %s', + s : 'beagan diogan', + ss : '%d diogan', + m : 'mionaid', + mm : '%d mionaidean', + h : 'uair', + hh : '%d uairean', + d : 'latha', + dd : '%d latha', + M : 'mìos', + MM : '%d mìosan', + y : 'bliadhna', + yy : '%d bliadhna' + }, + dayOfMonthOrdinalParse : /\d{1,2}(d|na|mh)/, + ordinal : function (number) { + var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return gd; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gl.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gl.js new file mode 100755 index 00000000..1cc4177c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gl.js @@ -0,0 +1,76 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var gl = moment.defineLocale('gl', { + months : 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split('_'), + monthsShort : 'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'), + weekdaysMin : 'do_lu_ma_mé_xo_ve_sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY H:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm' + }, + calendar : { + sameDay : function () { + return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextDay : function () { + return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextWeek : function () { + return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + lastDay : function () { + return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; + }, + lastWeek : function () { + return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : function (str) { + if (str.indexOf('un') === 0) { + return 'n' + str; + } + return 'en ' + str; + }, + past : 'hai %s', + s : 'uns segundos', + ss : '%d segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'unha hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un ano', + yy : '%d anos' + }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return gl; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gom-latn.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gom-latn.js new file mode 100755 index 00000000..f26f8f9c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gom-latn.js @@ -0,0 +1,122 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's': ['thodde secondanim', 'thodde second'], + 'ss': [number + ' secondanim', number + ' second'], + 'm': ['eka mintan', 'ek minute'], + 'mm': [number + ' mintanim', number + ' mintam'], + 'h': ['eka horan', 'ek hor'], + 'hh': [number + ' horanim', number + ' horam'], + 'd': ['eka disan', 'ek dis'], + 'dd': [number + ' disanim', number + ' dis'], + 'M': ['eka mhoinean', 'ek mhoino'], + 'MM': [number + ' mhoineanim', number + ' mhoine'], + 'y': ['eka vorsan', 'ek voros'], + 'yy': [number + ' vorsanim', number + ' vorsam'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + var gomLatn = moment.defineLocale('gom-latn', { + months : 'Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr'.split('_'), + monthsShort : 'Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays : 'Aitar_Somar_Mongllar_Budvar_Brestar_Sukrar_Son\'var'.split('_'), + weekdaysShort : 'Ait._Som._Mon._Bud._Bre._Suk._Son.'.split('_'), + weekdaysMin : 'Ai_Sm_Mo_Bu_Br_Su_Sn'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'A h:mm [vazta]', + LTS : 'A h:mm:ss [vazta]', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY A h:mm [vazta]', + LLLL : 'dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]', + llll: 'ddd, D MMM YYYY, A h:mm [vazta]' + }, + calendar : { + sameDay: '[Aiz] LT', + nextDay: '[Faleam] LT', + nextWeek: '[Ieta to] dddd[,] LT', + lastDay: '[Kal] LT', + lastWeek: '[Fatlo] dddd[,] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s', + past : '%s adim', + s : processRelativeTime, + ss : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse : /\d{1,2}(er)/, + ordinal : function (number, period) { + switch (period) { + // the ordinal 'er' only applies to day of the month + case 'D': + return number + 'er'; + default: + case 'M': + case 'Q': + case 'DDD': + case 'd': + case 'w': + case 'W': + return number; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + }, + meridiemParse: /rati|sokalli|donparam|sanje/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'rati') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'sokalli') { + return hour; + } else if (meridiem === 'donparam') { + return hour > 12 ? hour : hour + 12; + } else if (meridiem === 'sanje') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'rati'; + } else if (hour < 12) { + return 'sokalli'; + } else if (hour < 16) { + return 'donparam'; + } else if (hour < 20) { + return 'sanje'; + } else { + return 'rati'; + } + } + }); + + return gomLatn; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gu.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gu.js new file mode 100755 index 00000000..c025aacd --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gu.js @@ -0,0 +1,123 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var symbolMap = { + '1': '૧', + '2': '૨', + '3': '૩', + '4': '૪', + '5': '૫', + '6': '૬', + '7': '૭', + '8': '૮', + '9': '૯', + '0': '૦' + }, + numberMap = { + '૧': '1', + '૨': '2', + '૩': '3', + '૪': '4', + '૫': '5', + '૬': '6', + '૭': '7', + '૮': '8', + '૯': '9', + '૦': '0' + }; + + var gu = moment.defineLocale('gu', { + months: 'જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર'.split('_'), + monthsShort: 'જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.'.split('_'), + monthsParseExact: true, + weekdays: 'રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર'.split('_'), + weekdaysShort: 'રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ'.split('_'), + weekdaysMin: 'ર_સો_મં_બુ_ગુ_શુ_શ'.split('_'), + longDateFormat: { + LT: 'A h:mm વાગ્યે', + LTS: 'A h:mm:ss વાગ્યે', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY, A h:mm વાગ્યે', + LLLL: 'dddd, D MMMM YYYY, A h:mm વાગ્યે' + }, + calendar: { + sameDay: '[આજ] LT', + nextDay: '[કાલે] LT', + nextWeek: 'dddd, LT', + lastDay: '[ગઇકાલે] LT', + lastWeek: '[પાછલા] dddd, LT', + sameElse: 'L' + }, + relativeTime: { + future: '%s મા', + past: '%s પેહલા', + s: 'અમુક પળો', + ss: '%d સેકંડ', + m: 'એક મિનિટ', + mm: '%d મિનિટ', + h: 'એક કલાક', + hh: '%d કલાક', + d: 'એક દિવસ', + dd: '%d દિવસ', + M: 'એક મહિનો', + MM: '%d મહિનો', + y: 'એક વર્ષ', + yy: '%d વર્ષ' + }, + preparse: function (string) { + return string.replace(/[૧૨૩૪૫૬૭૮૯૦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Gujarati notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Gujarati. + meridiemParse: /રાત|બપોર|સવાર|સાંજ/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'રાત') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'સવાર') { + return hour; + } else if (meridiem === 'બપોર') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'સાંજ') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) { + if (hour < 4) { + return 'રાત'; + } else if (hour < 10) { + return 'સવાર'; + } else if (hour < 17) { + return 'બપોર'; + } else if (hour < 20) { + return 'સાંજ'; + } else { + return 'રાત'; + } + }, + week: { + dow: 0, // Sunday is the first day of the week. + doy: 6 // The week that contains Jan 1st is the first week of the year. + } + }); + + return gu; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/he.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/he.js new file mode 100755 index 00000000..7a22e8d7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/he.js @@ -0,0 +1,96 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var he = moment.defineLocale('he', { + months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'), + monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'), + weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), + weekdaysShort : 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'), + weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [ב]MMMM YYYY', + LLL : 'D [ב]MMMM YYYY HH:mm', + LLLL : 'dddd, D [ב]MMMM YYYY HH:mm', + l : 'D/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY HH:mm', + llll : 'ddd, D MMM YYYY HH:mm' + }, + calendar : { + sameDay : '[היום ב־]LT', + nextDay : '[מחר ב־]LT', + nextWeek : 'dddd [בשעה] LT', + lastDay : '[אתמול ב־]LT', + lastWeek : '[ביום] dddd [האחרון בשעה] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'בעוד %s', + past : 'לפני %s', + s : 'מספר שניות', + ss : '%d שניות', + m : 'דקה', + mm : '%d דקות', + h : 'שעה', + hh : function (number) { + if (number === 2) { + return 'שעתיים'; + } + return number + ' שעות'; + }, + d : 'יום', + dd : function (number) { + if (number === 2) { + return 'יומיים'; + } + return number + ' ימים'; + }, + M : 'חודש', + MM : function (number) { + if (number === 2) { + return 'חודשיים'; + } + return number + ' חודשים'; + }, + y : 'שנה', + yy : function (number) { + if (number === 2) { + return 'שנתיים'; + } else if (number % 10 === 0 && number !== 10) { + return number + ' שנה'; + } + return number + ' שנים'; + } + }, + meridiemParse: /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i, + isPM : function (input) { + return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 5) { + return 'לפנות בוקר'; + } else if (hour < 10) { + return 'בבוקר'; + } else if (hour < 12) { + return isLower ? 'לפנה"צ' : 'לפני הצהריים'; + } else if (hour < 18) { + return isLower ? 'אחה"צ' : 'אחרי הצהריים'; + } else { + return 'בערב'; + } + } + }); + + return he; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hi.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hi.js new file mode 100755 index 00000000..5145c31e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hi.js @@ -0,0 +1,123 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + var hi = moment.defineLocale('hi', { + months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'), + monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'), + monthsParseExact: true, + weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'), + longDateFormat : { + LT : 'A h:mm बजे', + LTS : 'A h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm बजे', + LLLL : 'dddd, D MMMM YYYY, A h:mm बजे' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[कल] LT', + nextWeek : 'dddd, LT', + lastDay : '[कल] LT', + lastWeek : '[पिछले] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s में', + past : '%s पहले', + s : 'कुछ ही क्षण', + ss : '%d सेकंड', + m : 'एक मिनट', + mm : '%d मिनट', + h : 'एक घंटा', + hh : '%d घंटे', + d : 'एक दिन', + dd : '%d दिन', + M : 'एक महीने', + MM : '%d महीने', + y : 'एक वर्ष', + yy : '%d वर्ष' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Hindi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. + meridiemParse: /रात|सुबह|दोपहर|शाम/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रात') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सुबह') { + return hour; + } else if (meridiem === 'दोपहर') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'शाम') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'रात'; + } else if (hour < 10) { + return 'सुबह'; + } else if (hour < 17) { + return 'दोपहर'; + } else if (hour < 20) { + return 'शाम'; + } else { + return 'रात'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); + + return hi; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hr.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hr.js new file mode 100755 index 00000000..07ce5279 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hr.js @@ -0,0 +1,153 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'ss': + if (number === 1) { + result += 'sekunda'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sekunde'; + } else { + result += 'sekundi'; + } + return result; + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + var hr = moment.defineLocale('hr', { + months : { + format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split('_'), + standalone: 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_') + }, + monthsShort : 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'), + monthsParseExact: true, + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd, D. MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[jučer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[prošlu] dddd [u] LT'; + case 6: + return '[prošle] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prošli] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return hr; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hu.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hu.js new file mode 100755 index 00000000..53e9bb6e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hu.js @@ -0,0 +1,109 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' '); + function translate(number, withoutSuffix, key, isFuture) { + var num = number; + switch (key) { + case 's': + return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; + case 'ss': + return num + (isFuture || withoutSuffix) ? ' másodperc' : ' másodperce'; + case 'm': + return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'mm': + return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'h': + return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'hh': + return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'd': + return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'dd': + return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'M': + return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'MM': + return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'y': + return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); + case 'yy': + return num + (isFuture || withoutSuffix ? ' év' : ' éve'); + } + return ''; + } + function week(isFuture) { + return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; + } + + var hu = moment.defineLocale('hu', { + months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), + monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), + weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'), + weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), + weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'YYYY.MM.DD.', + LL : 'YYYY. MMMM D.', + LLL : 'YYYY. MMMM D. H:mm', + LLLL : 'YYYY. MMMM D., dddd H:mm' + }, + meridiemParse: /de|du/i, + isPM: function (input) { + return input.charAt(1).toLowerCase() === 'u'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower === true ? 'de' : 'DE'; + } else { + return isLower === true ? 'du' : 'DU'; + } + }, + calendar : { + sameDay : '[ma] LT[-kor]', + nextDay : '[holnap] LT[-kor]', + nextWeek : function () { + return week.call(this, true); + }, + lastDay : '[tegnap] LT[-kor]', + lastWeek : function () { + return week.call(this, false); + }, + sameElse : 'L' + }, + relativeTime : { + future : '%s múlva', + past : '%s', + s : translate, + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return hu; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hy-am.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hy-am.js new file mode 100755 index 00000000..d709d3bd --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hy-am.js @@ -0,0 +1,94 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var hyAm = moment.defineLocale('hy-am', { + months : { + format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_'), + standalone: 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_') + }, + monthsShort : 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'), + weekdays : 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_'), + weekdaysShort : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'), + weekdaysMin : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY թ.', + LLL : 'D MMMM YYYY թ., HH:mm', + LLLL : 'dddd, D MMMM YYYY թ., HH:mm' + }, + calendar : { + sameDay: '[այսօր] LT', + nextDay: '[վաղը] LT', + lastDay: '[երեկ] LT', + nextWeek: function () { + return 'dddd [օրը ժամը] LT'; + }, + lastWeek: function () { + return '[անցած] dddd [օրը ժամը] LT'; + }, + sameElse: 'L' + }, + relativeTime : { + future : '%s հետո', + past : '%s առաջ', + s : 'մի քանի վայրկյան', + ss : '%d վայրկյան', + m : 'րոպե', + mm : '%d րոպե', + h : 'ժամ', + hh : '%d ժամ', + d : 'օր', + dd : '%d օր', + M : 'ամիս', + MM : '%d ամիս', + y : 'տարի', + yy : '%d տարի' + }, + meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/, + isPM: function (input) { + return /^(ցերեկվա|երեկոյան)$/.test(input); + }, + meridiem : function (hour) { + if (hour < 4) { + return 'գիշերվա'; + } else if (hour < 12) { + return 'առավոտվա'; + } else if (hour < 17) { + return 'ցերեկվա'; + } else { + return 'երեկոյան'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/, + ordinal: function (number, period) { + switch (period) { + case 'DDD': + case 'w': + case 'W': + case 'DDDo': + if (number === 1) { + return number + '-ին'; + } + return number + '-րդ'; + default: + return number; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return hyAm; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/id.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/id.js new file mode 100755 index 00000000..63eb080d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/id.js @@ -0,0 +1,81 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var id = moment.defineLocale('id', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /pagi|siang|sore|malam/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'siang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sore' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'siang'; + } else if (hours < 19) { + return 'sore'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Besok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kemarin pukul] LT', + lastWeek : 'dddd [lalu pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lalu', + s : 'beberapa detik', + ss : '%d detik', + m : 'semenit', + mm : '%d menit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return id; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/is.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/is.js new file mode 100755 index 00000000..9856e927 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/is.js @@ -0,0 +1,131 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + function plural(n) { + if (n % 100 === 11) { + return true; + } else if (n % 10 === 1) { + return false; + } + return true; + } + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; + case 'ss': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'sekúndur' : 'sekúndum'); + } + return result + 'sekúnda'; + case 'm': + return withoutSuffix ? 'mínúta' : 'mínútu'; + case 'mm': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); + } else if (withoutSuffix) { + return result + 'mínúta'; + } + return result + 'mínútu'; + case 'hh': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); + } + return result + 'klukkustund'; + case 'd': + if (withoutSuffix) { + return 'dagur'; + } + return isFuture ? 'dag' : 'degi'; + case 'dd': + if (plural(number)) { + if (withoutSuffix) { + return result + 'dagar'; + } + return result + (isFuture ? 'daga' : 'dögum'); + } else if (withoutSuffix) { + return result + 'dagur'; + } + return result + (isFuture ? 'dag' : 'degi'); + case 'M': + if (withoutSuffix) { + return 'mánuður'; + } + return isFuture ? 'mánuð' : 'mánuði'; + case 'MM': + if (plural(number)) { + if (withoutSuffix) { + return result + 'mánuðir'; + } + return result + (isFuture ? 'mánuði' : 'mánuðum'); + } else if (withoutSuffix) { + return result + 'mánuður'; + } + return result + (isFuture ? 'mánuð' : 'mánuði'); + case 'y': + return withoutSuffix || isFuture ? 'ár' : 'ári'; + case 'yy': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); + } + return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); + } + } + + var is = moment.defineLocale('is', { + months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), + weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), + weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), + weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] H:mm', + LLLL : 'dddd, D. MMMM YYYY [kl.] H:mm' + }, + calendar : { + sameDay : '[í dag kl.] LT', + nextDay : '[á morgun kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[í gær kl.] LT', + lastWeek : '[síðasta] dddd [kl.] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'eftir %s', + past : 'fyrir %s síðan', + s : translate, + ss : translate, + m : translate, + mm : translate, + h : 'klukkustund', + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return is; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/it.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/it.js new file mode 100755 index 00000000..f42ff8fa --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/it.js @@ -0,0 +1,68 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var it = moment.defineLocale('it', { + months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), + monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), + weekdays : 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split('_'), + weekdaysShort : 'dom_lun_mar_mer_gio_ven_sab'.split('_'), + weekdaysMin : 'do_lu_ma_me_gi_ve_sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[Oggi alle] LT', + nextDay: '[Domani alle] LT', + nextWeek: 'dddd [alle] LT', + lastDay: '[Ieri alle] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[la scorsa] dddd [alle] LT'; + default: + return '[lo scorso] dddd [alle] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : function (s) { + return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; + }, + past : '%s fa', + s : 'alcuni secondi', + ss : '%d secondi', + m : 'un minuto', + mm : '%d minuti', + h : 'un\'ora', + hh : '%d ore', + d : 'un giorno', + dd : '%d giorni', + M : 'un mese', + MM : '%d mesi', + y : 'un anno', + yy : '%d anni' + }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal: '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return it; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ja.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ja.js new file mode 100755 index 00000000..5ec1be53 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ja.js @@ -0,0 +1,91 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var ja = moment.defineLocale('ja', { + months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'), + weekdaysShort : '日_月_火_水_木_金_土'.split('_'), + weekdaysMin : '日_月_火_水_木_金_土'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日 HH:mm', + LLLL : 'YYYY年M月D日 dddd HH:mm', + l : 'YYYY/MM/DD', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日(ddd) HH:mm' + }, + meridiemParse: /午前|午後/i, + isPM : function (input) { + return input === '午後'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return '午前'; + } else { + return '午後'; + } + }, + calendar : { + sameDay : '[今日] LT', + nextDay : '[明日] LT', + nextWeek : function (now) { + if (now.week() < this.week()) { + return '[来週]dddd LT'; + } else { + return 'dddd LT'; + } + }, + lastDay : '[昨日] LT', + lastWeek : function (now) { + if (this.week() < now.week()) { + return '[先週]dddd LT'; + } else { + return 'dddd LT'; + } + }, + sameElse : 'L' + }, + dayOfMonthOrdinalParse : /\d{1,2}日/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '日'; + default: + return number; + } + }, + relativeTime : { + future : '%s後', + past : '%s前', + s : '数秒', + ss : '%d秒', + m : '1分', + mm : '%d分', + h : '1時間', + hh : '%d時間', + d : '1日', + dd : '%d日', + M : '1ヶ月', + MM : '%dヶ月', + y : '1年', + yy : '%d年' + } + }); + + return ja; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/jv.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/jv.js new file mode 100755 index 00000000..f4544a25 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/jv.js @@ -0,0 +1,81 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var jv = moment.defineLocale('jv', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'), + weekdays : 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /enjing|siyang|sonten|ndalu/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'enjing') { + return hour; + } else if (meridiem === 'siyang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sonten' || meridiem === 'ndalu') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'enjing'; + } else if (hours < 15) { + return 'siyang'; + } else if (hours < 19) { + return 'sonten'; + } else { + return 'ndalu'; + } + }, + calendar : { + sameDay : '[Dinten puniko pukul] LT', + nextDay : '[Mbenjang pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kala wingi pukul] LT', + lastWeek : 'dddd [kepengker pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'wonten ing %s', + past : '%s ingkang kepengker', + s : 'sawetawis detik', + ss : '%d detik', + m : 'setunggal menit', + mm : '%d menit', + h : 'setunggal jam', + hh : '%d jam', + d : 'sedinten', + dd : '%d dinten', + M : 'sewulan', + MM : '%d wulan', + y : 'setaun', + yy : '%d taun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return jv; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ka.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ka.js new file mode 100755 index 00000000..0ec5eb24 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ka.js @@ -0,0 +1,88 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var ka = moment.defineLocale('ka', { + months : { + standalone: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'), + format: 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_') + }, + monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'), + weekdays : { + standalone: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'), + format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_'), + isFormat: /(წინა|შემდეგ)/ + }, + weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'), + weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendar : { + sameDay : '[დღეს] LT[-ზე]', + nextDay : '[ხვალ] LT[-ზე]', + lastDay : '[გუშინ] LT[-ზე]', + nextWeek : '[შემდეგ] dddd LT[-ზე]', + lastWeek : '[წინა] dddd LT-ზე', + sameElse : 'L' + }, + relativeTime : { + future : function (s) { + return (/(წამი|წუთი|საათი|წელი)/).test(s) ? + s.replace(/ი$/, 'ში') : + s + 'ში'; + }, + past : function (s) { + if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) { + return s.replace(/(ი|ე)$/, 'ის წინ'); + } + if ((/წელი/).test(s)) { + return s.replace(/წელი$/, 'წლის წინ'); + } + }, + s : 'რამდენიმე წამი', + ss : '%d წამი', + m : 'წუთი', + mm : '%d წუთი', + h : 'საათი', + hh : '%d საათი', + d : 'დღე', + dd : '%d დღე', + M : 'თვე', + MM : '%d თვე', + y : 'წელი', + yy : '%d წელი' + }, + dayOfMonthOrdinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, + ordinal : function (number) { + if (number === 0) { + return number; + } + if (number === 1) { + return number + '-ლი'; + } + if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { + return 'მე-' + number; + } + return number + '-ე'; + }, + week : { + dow : 1, + doy : 7 + } + }); + + return ka; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/kk.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/kk.js new file mode 100755 index 00000000..db9d7519 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/kk.js @@ -0,0 +1,86 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var suffixes = { + 0: '-ші', + 1: '-ші', + 2: '-ші', + 3: '-ші', + 4: '-ші', + 5: '-ші', + 6: '-шы', + 7: '-ші', + 8: '-ші', + 9: '-шы', + 10: '-шы', + 20: '-шы', + 30: '-шы', + 40: '-шы', + 50: '-ші', + 60: '-шы', + 70: '-ші', + 80: '-ші', + 90: '-шы', + 100: '-ші' + }; + + var kk = moment.defineLocale('kk', { + months : 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split('_'), + monthsShort : 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'), + weekdays : 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split('_'), + weekdaysShort : 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'), + weekdaysMin : 'жк_дй_сй_ср_бй_жм_сн'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Бүгін сағат] LT', + nextDay : '[Ертең сағат] LT', + nextWeek : 'dddd [сағат] LT', + lastDay : '[Кеше сағат] LT', + lastWeek : '[Өткен аптаның] dddd [сағат] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ішінде', + past : '%s бұрын', + s : 'бірнеше секунд', + ss : '%d секунд', + m : 'бір минут', + mm : '%d минут', + h : 'бір сағат', + hh : '%d сағат', + d : 'бір күн', + dd : '%d күн', + M : 'бір ай', + MM : '%d ай', + y : 'бір жыл', + yy : '%d жыл' + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ші|шы)/, + ordinal : function (number) { + var a = number % 10, + b = number >= 100 ? 100 : null; + return number + (suffixes[number] || suffixes[a] || suffixes[b]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return kk; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/km.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/km.js new file mode 100755 index 00000000..fee36238 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/km.js @@ -0,0 +1,109 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var symbolMap = { + '1': '១', + '2': '២', + '3': '៣', + '4': '៤', + '5': '៥', + '6': '៦', + '7': '៧', + '8': '៨', + '9': '៩', + '0': '០' + }, numberMap = { + '១': '1', + '២': '2', + '៣': '3', + '៤': '4', + '៥': '5', + '៦': '6', + '៧': '7', + '៨': '8', + '៩': '9', + '០': '0' + }; + + var km = moment.defineLocale('km', { + months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split( + '_' + ), + monthsShort: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split( + '_' + ), + weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'), + weekdaysShort: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'), + weekdaysMin: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'), + weekdaysParseExact: true, + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd, D MMMM YYYY HH:mm' + }, + meridiemParse: /ព្រឹក|ល្ងាច/, + isPM: function (input) { + return input === 'ល្ងាច'; + }, + meridiem: function (hour, minute, isLower) { + if (hour < 12) { + return 'ព្រឹក'; + } else { + return 'ល្ងាច'; + } + }, + calendar: { + sameDay: '[ថ្ងៃនេះ ម៉ោង] LT', + nextDay: '[ស្អែក ម៉ោង] LT', + nextWeek: 'dddd [ម៉ោង] LT', + lastDay: '[ម្សិលមិញ ម៉ោង] LT', + lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT', + sameElse: 'L' + }, + relativeTime: { + future: '%sទៀត', + past: '%sមុន', + s: 'ប៉ុន្មានវិនាទី', + ss: '%d វិនាទី', + m: 'មួយនាទី', + mm: '%d នាទី', + h: 'មួយម៉ោង', + hh: '%d ម៉ោង', + d: 'មួយថ្ងៃ', + dd: '%d ថ្ងៃ', + M: 'មួយខែ', + MM: '%d ខែ', + y: 'មួយឆ្នាំ', + yy: '%d ឆ្នាំ' + }, + dayOfMonthOrdinalParse : /ទី\d{1,2}/, + ordinal : 'ទី%d', + preparse: function (string) { + return string.replace(/[១២៣៤៥៦៧៨៩០]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return km; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/kn.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/kn.js new file mode 100755 index 00000000..85b35cf7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/kn.js @@ -0,0 +1,125 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var symbolMap = { + '1': '೧', + '2': '೨', + '3': '೩', + '4': '೪', + '5': '೫', + '6': '೬', + '7': '೭', + '8': '೮', + '9': '೯', + '0': '೦' + }, + numberMap = { + '೧': '1', + '೨': '2', + '೩': '3', + '೪': '4', + '೫': '5', + '೬': '6', + '೭': '7', + '೮': '8', + '೯': '9', + '೦': '0' + }; + + var kn = moment.defineLocale('kn', { + months : 'ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್'.split('_'), + monthsShort : 'ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ'.split('_'), + monthsParseExact: true, + weekdays : 'ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ'.split('_'), + weekdaysShort : 'ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ'.split('_'), + weekdaysMin : 'ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'A h:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm', + LLLL : 'dddd, D MMMM YYYY, A h:mm' + }, + calendar : { + sameDay : '[ಇಂದು] LT', + nextDay : '[ನಾಳೆ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ನಿನ್ನೆ] LT', + lastWeek : '[ಕೊನೆಯ] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ನಂತರ', + past : '%s ಹಿಂದೆ', + s : 'ಕೆಲವು ಕ್ಷಣಗಳು', + ss : '%d ಸೆಕೆಂಡುಗಳು', + m : 'ಒಂದು ನಿಮಿಷ', + mm : '%d ನಿಮಿಷ', + h : 'ಒಂದು ಗಂಟೆ', + hh : '%d ಗಂಟೆ', + d : 'ಒಂದು ದಿನ', + dd : '%d ದಿನ', + M : 'ಒಂದು ತಿಂಗಳು', + MM : '%d ತಿಂಗಳು', + y : 'ಒಂದು ವರ್ಷ', + yy : '%d ವರ್ಷ' + }, + preparse: function (string) { + return string.replace(/[೧೨೩೪೫೬೭೮೯೦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'ರಾತ್ರಿ') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'ಬೆಳಿಗ್ಗೆ') { + return hour; + } else if (meridiem === 'ಮಧ್ಯಾಹ್ನ') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'ಸಂಜೆ') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ರಾತ್ರಿ'; + } else if (hour < 10) { + return 'ಬೆಳಿಗ್ಗೆ'; + } else if (hour < 17) { + return 'ಮಧ್ಯಾಹ್ನ'; + } else if (hour < 20) { + return 'ಸಂಜೆ'; + } else { + return 'ರಾತ್ರಿ'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}(ನೇ)/, + ordinal : function (number) { + return number + 'ನೇ'; + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); + + return kn; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ko.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ko.js new file mode 100755 index 00000000..40f1bb5d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ko.js @@ -0,0 +1,80 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var ko = moment.defineLocale('ko', { + months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), + monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), + weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'), + weekdaysShort : '일_월_화_수_목_금_토'.split('_'), + weekdaysMin : '일_월_화_수_목_금_토'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'A h:mm:ss', + L : 'YYYY.MM.DD.', + LL : 'YYYY년 MMMM D일', + LLL : 'YYYY년 MMMM D일 A h:mm', + LLLL : 'YYYY년 MMMM D일 dddd A h:mm', + l : 'YYYY.MM.DD.', + ll : 'YYYY년 MMMM D일', + lll : 'YYYY년 MMMM D일 A h:mm', + llll : 'YYYY년 MMMM D일 dddd A h:mm' + }, + calendar : { + sameDay : '오늘 LT', + nextDay : '내일 LT', + nextWeek : 'dddd LT', + lastDay : '어제 LT', + lastWeek : '지난주 dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s 후', + past : '%s 전', + s : '몇 초', + ss : '%d초', + m : '1분', + mm : '%d분', + h : '한 시간', + hh : '%d시간', + d : '하루', + dd : '%d일', + M : '한 달', + MM : '%d달', + y : '일 년', + yy : '%d년' + }, + dayOfMonthOrdinalParse : /\d{1,2}(일|월|주)/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '일'; + case 'M': + return number + '월'; + case 'w': + case 'W': + return number + '주'; + default: + return number; + } + }, + meridiemParse : /오전|오후/, + isPM : function (token) { + return token === '오후'; + }, + meridiem : function (hour, minute, isUpper) { + return hour < 12 ? '오전' : '오후'; + } + }); + + return ko; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ky.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ky.js new file mode 100755 index 00000000..7b0c9f39 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ky.js @@ -0,0 +1,86 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var suffixes = { + 0: '-чү', + 1: '-чи', + 2: '-чи', + 3: '-чү', + 4: '-чү', + 5: '-чи', + 6: '-чы', + 7: '-чи', + 8: '-чи', + 9: '-чу', + 10: '-чу', + 20: '-чы', + 30: '-чу', + 40: '-чы', + 50: '-чү', + 60: '-чы', + 70: '-чи', + 80: '-чи', + 90: '-чу', + 100: '-чү' + }; + + var ky = moment.defineLocale('ky', { + months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'), + monthsShort : 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'), + weekdays : 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split('_'), + weekdaysShort : 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'), + weekdaysMin : 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Бүгүн саат] LT', + nextDay : '[Эртең саат] LT', + nextWeek : 'dddd [саат] LT', + lastDay : '[Кече саат] LT', + lastWeek : '[Өткен аптанын] dddd [күнү] [саат] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ичинде', + past : '%s мурун', + s : 'бирнече секунд', + ss : '%d секунд', + m : 'бир мүнөт', + mm : '%d мүнөт', + h : 'бир саат', + hh : '%d саат', + d : 'бир күн', + dd : '%d күн', + M : 'бир ай', + MM : '%d ай', + y : 'бир жыл', + yy : '%d жыл' + }, + dayOfMonthOrdinalParse: /\d{1,2}-(чи|чы|чү|чу)/, + ordinal : function (number) { + var a = number % 10, + b = number >= 100 ? 100 : null; + return number + (suffixes[number] || suffixes[a] || suffixes[b]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return ky; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lb.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lb.js new file mode 100755 index 00000000..599a6e58 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lb.js @@ -0,0 +1,135 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eng Minutt', 'enger Minutt'], + 'h': ['eng Stonn', 'enger Stonn'], + 'd': ['een Dag', 'engem Dag'], + 'M': ['ee Mount', 'engem Mount'], + 'y': ['ee Joer', 'engem Joer'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + function processFutureTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'a ' + string; + } + return 'an ' + string; + } + function processPastTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'viru ' + string; + } + return 'virun ' + string; + } + /** + * Returns true if the word before the given number loses the '-n' ending. + * e.g. 'an 10 Deeg' but 'a 5 Deeg' + * + * @param number {integer} + * @returns {boolean} + */ + function eifelerRegelAppliesToNumber(number) { + number = parseInt(number, 10); + if (isNaN(number)) { + return false; + } + if (number < 0) { + // Negative Number --> always true + return true; + } else if (number < 10) { + // Only 1 digit + if (4 <= number && number <= 7) { + return true; + } + return false; + } else if (number < 100) { + // 2 digits + var lastDigit = number % 10, firstDigit = number / 10; + if (lastDigit === 0) { + return eifelerRegelAppliesToNumber(firstDigit); + } + return eifelerRegelAppliesToNumber(lastDigit); + } else if (number < 10000) { + // 3 or 4 digits --> recursively check first digit + while (number >= 10) { + number = number / 10; + } + return eifelerRegelAppliesToNumber(number); + } else { + // Anything larger than 4 digits: recursively check first n-3 digits + number = number / 1000; + return eifelerRegelAppliesToNumber(number); + } + } + + var lb = moment.defineLocale('lb', { + months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), + weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), + weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat: { + LT: 'H:mm [Auer]', + LTS: 'H:mm:ss [Auer]', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm [Auer]', + LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]' + }, + calendar: { + sameDay: '[Haut um] LT', + sameElse: 'L', + nextDay: '[Muer um] LT', + nextWeek: 'dddd [um] LT', + lastDay: '[Gëschter um] LT', + lastWeek: function () { + // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule + switch (this.day()) { + case 2: + case 4: + return '[Leschten] dddd [um] LT'; + default: + return '[Leschte] dddd [um] LT'; + } + } + }, + relativeTime : { + future : processFutureTime, + past : processPastTime, + s : 'e puer Sekonnen', + ss : '%d Sekonnen', + m : processRelativeTime, + mm : '%d Minutten', + h : processRelativeTime, + hh : '%d Stonnen', + d : processRelativeTime, + dd : '%d Deeg', + M : processRelativeTime, + MM : '%d Méint', + y : processRelativeTime, + yy : '%d Joer' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal: '%d.', + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return lb; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lo.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lo.js new file mode 100755 index 00000000..7cd6cfc8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lo.js @@ -0,0 +1,69 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var lo = moment.defineLocale('lo', { + months : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'), + monthsShort : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'), + weekdays : 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'), + weekdaysShort : 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'), + weekdaysMin : 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'ວັນdddd D MMMM YYYY HH:mm' + }, + meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/, + isPM: function (input) { + return input === 'ຕອນແລງ'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ຕອນເຊົ້າ'; + } else { + return 'ຕອນແລງ'; + } + }, + calendar : { + sameDay : '[ມື້ນີ້ເວລາ] LT', + nextDay : '[ມື້ອື່ນເວລາ] LT', + nextWeek : '[ວັນ]dddd[ໜ້າເວລາ] LT', + lastDay : '[ມື້ວານນີ້ເວລາ] LT', + lastWeek : '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'ອີກ %s', + past : '%sຜ່ານມາ', + s : 'ບໍ່ເທົ່າໃດວິນາທີ', + ss : '%d ວິນາທີ' , + m : '1 ນາທີ', + mm : '%d ນາທີ', + h : '1 ຊົ່ວໂມງ', + hh : '%d ຊົ່ວໂມງ', + d : '1 ມື້', + dd : '%d ມື້', + M : '1 ເດືອນ', + MM : '%d ເດືອນ', + y : '1 ປີ', + yy : '%d ປີ' + }, + dayOfMonthOrdinalParse: /(ທີ່)\d{1,2}/, + ordinal : function (number) { + return 'ທີ່' + number; + } + }); + + return lo; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lt.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lt.js new file mode 100755 index 00000000..bc7d7e7a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lt.js @@ -0,0 +1,117 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var units = { + 'ss' : 'sekundė_sekundžių_sekundes', + 'm' : 'minutė_minutės_minutę', + 'mm': 'minutės_minučių_minutes', + 'h' : 'valanda_valandos_valandą', + 'hh': 'valandos_valandų_valandas', + 'd' : 'diena_dienos_dieną', + 'dd': 'dienos_dienų_dienas', + 'M' : 'mėnuo_mėnesio_mėnesį', + 'MM': 'mėnesiai_mėnesių_mėnesius', + 'y' : 'metai_metų_metus', + 'yy': 'metai_metų_metus' + }; + function translateSeconds(number, withoutSuffix, key, isFuture) { + if (withoutSuffix) { + return 'kelios sekundės'; + } else { + return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; + } + } + function translateSingular(number, withoutSuffix, key, isFuture) { + return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); + } + function special(number) { + return number % 10 === 0 || (number > 10 && number < 20); + } + function forms(key) { + return units[key].split('_'); + } + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + if (number === 1) { + return result + translateSingular(number, withoutSuffix, key[0], isFuture); + } else if (withoutSuffix) { + return result + (special(number) ? forms(key)[1] : forms(key)[0]); + } else { + if (isFuture) { + return result + forms(key)[1]; + } else { + return result + (special(number) ? forms(key)[1] : forms(key)[2]); + } + } + } + var lt = moment.defineLocale('lt', { + months : { + format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'), + standalone: 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_'), + isFormat: /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/ + }, + monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), + weekdays : { + format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split('_'), + standalone: 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_'), + isFormat: /dddd HH:mm/ + }, + weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'), + weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY [m.] MMMM D [d.]', + LLL : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', + LLLL : 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]', + l : 'YYYY-MM-DD', + ll : 'YYYY [m.] MMMM D [d.]', + lll : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', + llll : 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]' + }, + calendar : { + sameDay : '[Šiandien] LT', + nextDay : '[Rytoj] LT', + nextWeek : 'dddd LT', + lastDay : '[Vakar] LT', + lastWeek : '[Praėjusį] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : 'po %s', + past : 'prieš %s', + s : translateSeconds, + ss : translate, + m : translateSingular, + mm : translate, + h : translateSingular, + hh : translate, + d : translateSingular, + dd : translate, + M : translateSingular, + MM : translate, + y : translateSingular, + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}-oji/, + ordinal : function (number) { + return number + '-oji'; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return lt; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lv.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lv.js new file mode 100755 index 00000000..b5b8ea84 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lv.js @@ -0,0 +1,96 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var units = { + 'ss': 'sekundes_sekundēm_sekunde_sekundes'.split('_'), + 'm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), + 'mm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), + 'h': 'stundas_stundām_stunda_stundas'.split('_'), + 'hh': 'stundas_stundām_stunda_stundas'.split('_'), + 'd': 'dienas_dienām_diena_dienas'.split('_'), + 'dd': 'dienas_dienām_diena_dienas'.split('_'), + 'M': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), + 'MM': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), + 'y': 'gada_gadiem_gads_gadi'.split('_'), + 'yy': 'gada_gadiem_gads_gadi'.split('_') + }; + /** + * @param withoutSuffix boolean true = a length of time; false = before/after a period of time. + */ + function format(forms, number, withoutSuffix) { + if (withoutSuffix) { + // E.g. "21 minūte", "3 minūtes". + return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3]; + } else { + // E.g. "21 minūtes" as in "pēc 21 minūtes". + // E.g. "3 minūtēm" as in "pēc 3 minūtēm". + return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1]; + } + } + function relativeTimeWithPlural(number, withoutSuffix, key) { + return number + ' ' + format(units[key], number, withoutSuffix); + } + function relativeTimeWithSingular(number, withoutSuffix, key) { + return format(units[key], number, withoutSuffix); + } + function relativeSeconds(number, withoutSuffix) { + return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm'; + } + + var lv = moment.defineLocale('lv', { + months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'), + weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), + weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY.', + LL : 'YYYY. [gada] D. MMMM', + LLL : 'YYYY. [gada] D. MMMM, HH:mm', + LLLL : 'YYYY. [gada] D. MMMM, dddd, HH:mm' + }, + calendar : { + sameDay : '[Šodien pulksten] LT', + nextDay : '[Rīt pulksten] LT', + nextWeek : 'dddd [pulksten] LT', + lastDay : '[Vakar pulksten] LT', + lastWeek : '[Pagājušā] dddd [pulksten] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'pēc %s', + past : 'pirms %s', + s : relativeSeconds, + ss : relativeTimeWithPlural, + m : relativeTimeWithSingular, + mm : relativeTimeWithPlural, + h : relativeTimeWithSingular, + hh : relativeTimeWithPlural, + d : relativeTimeWithSingular, + dd : relativeTimeWithPlural, + M : relativeTimeWithSingular, + MM : relativeTimeWithPlural, + y : relativeTimeWithSingular, + yy : relativeTimeWithPlural + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return lv; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/me.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/me.js new file mode 100755 index 00000000..ee7bd396 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/me.js @@ -0,0 +1,111 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var translator = { + words: { //Different grammatical cases + ss: ['sekund', 'sekunda', 'sekundi'], + m: ['jedan minut', 'jednog minuta'], + mm: ['minut', 'minuta', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mjesec', 'mjeseca', 'mjeseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + var me = moment.defineLocale('me', { + months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'), + monthsParseExact : true, + weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), + weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), + weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'), + weekdaysParseExact : true, + longDateFormat: { + LT: 'H:mm', + LTS : 'H:mm:ss', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm', + LLLL: 'dddd, D. MMMM YYYY H:mm' + }, + calendar: { + sameDay: '[danas u] LT', + nextDay: '[sjutra u] LT', + + nextWeek: function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juče u] LT', + lastWeek : function () { + var lastWeekDays = [ + '[prošle] [nedjelje] [u] LT', + '[prošlog] [ponedjeljka] [u] LT', + '[prošlog] [utorka] [u] LT', + '[prošle] [srijede] [u] LT', + '[prošlog] [četvrtka] [u] LT', + '[prošlog] [petka] [u] LT', + '[prošle] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'nekoliko sekundi', + ss : translator.translate, + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'dan', + dd : translator.translate, + M : 'mjesec', + MM : translator.translate, + y : 'godinu', + yy : translator.translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return me; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mi.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mi.js new file mode 100755 index 00000000..29f1c7a3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mi.js @@ -0,0 +1,63 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var mi = moment.defineLocale('mi', { + months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split('_'), + monthsShort: 'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split('_'), + monthsRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, + monthsStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, + monthsShortRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, + monthsShortStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i, + weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'), + weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'), + weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY [i] HH:mm', + LLLL: 'dddd, D MMMM YYYY [i] HH:mm' + }, + calendar: { + sameDay: '[i teie mahana, i] LT', + nextDay: '[apopo i] LT', + nextWeek: 'dddd [i] LT', + lastDay: '[inanahi i] LT', + lastWeek: 'dddd [whakamutunga i] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'i roto i %s', + past: '%s i mua', + s: 'te hēkona ruarua', + ss: '%d hēkona', + m: 'he meneti', + mm: '%d meneti', + h: 'te haora', + hh: '%d haora', + d: 'he ra', + dd: '%d ra', + M: 'he marama', + MM: '%d marama', + y: 'he tau', + yy: '%d tau' + }, + dayOfMonthOrdinalParse: /\d{1,2}º/, + ordinal: '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return mi; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mk.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mk.js new file mode 100755 index 00000000..e2d44989 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mk.js @@ -0,0 +1,89 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var mk = moment.defineLocale('mk', { + months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'), + monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'), + weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'), + weekdaysShort : 'нед_пон_вто_сре_чет_пет_саб'.split('_'), + weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[Денес во] LT', + nextDay : '[Утре во] LT', + nextWeek : '[Во] dddd [во] LT', + lastDay : '[Вчера во] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Изминатата] dddd [во] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Изминатиот] dddd [во] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'после %s', + past : 'пред %s', + s : 'неколку секунди', + ss : '%d секунди', + m : 'минута', + mm : '%d минути', + h : 'час', + hh : '%d часа', + d : 'ден', + dd : '%d дена', + M : 'месец', + MM : '%d месеци', + y : 'година', + yy : '%d години' + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return mk; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ml.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ml.js new file mode 100755 index 00000000..806db47b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ml.js @@ -0,0 +1,80 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var ml = moment.defineLocale('ml', { + months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'), + monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'), + monthsParseExact : true, + weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'), + weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'), + weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'), + longDateFormat : { + LT : 'A h:mm -നു', + LTS : 'A h:mm:ss -നു', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm -നു', + LLLL : 'dddd, D MMMM YYYY, A h:mm -നു' + }, + calendar : { + sameDay : '[ഇന്ന്] LT', + nextDay : '[നാളെ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ഇന്നലെ] LT', + lastWeek : '[കഴിഞ്ഞ] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s കഴിഞ്ഞ്', + past : '%s മുൻപ്', + s : 'അൽപ നിമിഷങ്ങൾ', + ss : '%d സെക്കൻഡ്', + m : 'ഒരു മിനിറ്റ്', + mm : '%d മിനിറ്റ്', + h : 'ഒരു മണിക്കൂർ', + hh : '%d മണിക്കൂർ', + d : 'ഒരു ദിവസം', + dd : '%d ദിവസം', + M : 'ഒരു മാസം', + MM : '%d മാസം', + y : 'ഒരു വർഷം', + yy : '%d വർഷം' + }, + meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if ((meridiem === 'രാത്രി' && hour >= 4) || + meridiem === 'ഉച്ച കഴിഞ്ഞ്' || + meridiem === 'വൈകുന്നേരം') { + return hour + 12; + } else { + return hour; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'രാത്രി'; + } else if (hour < 12) { + return 'രാവിലെ'; + } else if (hour < 17) { + return 'ഉച്ച കഴിഞ്ഞ്'; + } else if (hour < 20) { + return 'വൈകുന്നേരം'; + } else { + return 'രാത്രി'; + } + } + }); + + return ml; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mn.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mn.js new file mode 100755 index 00000000..f4b95c81 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mn.js @@ -0,0 +1,103 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + function translate(number, withoutSuffix, key, isFuture) { + switch (key) { + case 's': + return withoutSuffix ? 'хэдхэн секунд' : 'хэдхэн секундын'; + case 'ss': + return number + (withoutSuffix ? ' секунд' : ' секундын'); + case 'm': + case 'mm': + return number + (withoutSuffix ? ' минут' : ' минутын'); + case 'h': + case 'hh': + return number + (withoutSuffix ? ' цаг' : ' цагийн'); + case 'd': + case 'dd': + return number + (withoutSuffix ? ' өдөр' : ' өдрийн'); + case 'M': + case 'MM': + return number + (withoutSuffix ? ' сар' : ' сарын'); + case 'y': + case 'yy': + return number + (withoutSuffix ? ' жил' : ' жилийн'); + default: + return number; + } + } + + var mn = moment.defineLocale('mn', { + months : 'Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар'.split('_'), + monthsShort : '1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар'.split('_'), + monthsParseExact : true, + weekdays : 'Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба'.split('_'), + weekdaysShort : 'Ням_Дав_Мяг_Лха_Пүр_Баа_Бям'.split('_'), + weekdaysMin : 'Ня_Да_Мя_Лх_Пү_Ба_Бя'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY оны MMMMын D', + LLL : 'YYYY оны MMMMын D HH:mm', + LLLL : 'dddd, YYYY оны MMMMын D HH:mm' + }, + meridiemParse: /ҮӨ|ҮХ/i, + isPM : function (input) { + return input === 'ҮХ'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ҮӨ'; + } else { + return 'ҮХ'; + } + }, + calendar : { + sameDay : '[Өнөөдөр] LT', + nextDay : '[Маргааш] LT', + nextWeek : '[Ирэх] dddd LT', + lastDay : '[Өчигдөр] LT', + lastWeek : '[Өнгөрсөн] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s дараа', + past : '%s өмнө', + s : translate, + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2} өдөр/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + ' өдөр'; + default: + return number; + } + } + }); + + return mn; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mr.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mr.js new file mode 100755 index 00000000..fdeaa3d9 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mr.js @@ -0,0 +1,159 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + function relativeTimeMr(number, withoutSuffix, string, isFuture) + { + var output = ''; + if (withoutSuffix) { + switch (string) { + case 's': output = 'काही सेकंद'; break; + case 'ss': output = '%d सेकंद'; break; + case 'm': output = 'एक मिनिट'; break; + case 'mm': output = '%d मिनिटे'; break; + case 'h': output = 'एक तास'; break; + case 'hh': output = '%d तास'; break; + case 'd': output = 'एक दिवस'; break; + case 'dd': output = '%d दिवस'; break; + case 'M': output = 'एक महिना'; break; + case 'MM': output = '%d महिने'; break; + case 'y': output = 'एक वर्ष'; break; + case 'yy': output = '%d वर्षे'; break; + } + } + else { + switch (string) { + case 's': output = 'काही सेकंदां'; break; + case 'ss': output = '%d सेकंदां'; break; + case 'm': output = 'एका मिनिटा'; break; + case 'mm': output = '%d मिनिटां'; break; + case 'h': output = 'एका तासा'; break; + case 'hh': output = '%d तासां'; break; + case 'd': output = 'एका दिवसा'; break; + case 'dd': output = '%d दिवसां'; break; + case 'M': output = 'एका महिन्या'; break; + case 'MM': output = '%d महिन्यां'; break; + case 'y': output = 'एका वर्षा'; break; + case 'yy': output = '%d वर्षां'; break; + } + } + return output.replace(/%d/i, number); + } + + var mr = moment.defineLocale('mr', { + months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'), + monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'), + monthsParseExact : true, + weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'), + longDateFormat : { + LT : 'A h:mm वाजता', + LTS : 'A h:mm:ss वाजता', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm वाजता', + LLLL : 'dddd, D MMMM YYYY, A h:mm वाजता' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[उद्या] LT', + nextWeek : 'dddd, LT', + lastDay : '[काल] LT', + lastWeek: '[मागील] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future: '%sमध्ये', + past: '%sपूर्वी', + s: relativeTimeMr, + ss: relativeTimeMr, + m: relativeTimeMr, + mm: relativeTimeMr, + h: relativeTimeMr, + hh: relativeTimeMr, + d: relativeTimeMr, + dd: relativeTimeMr, + M: relativeTimeMr, + MM: relativeTimeMr, + y: relativeTimeMr, + yy: relativeTimeMr + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /रात्री|सकाळी|दुपारी|सायंकाळी/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रात्री') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सकाळी') { + return hour; + } else if (meridiem === 'दुपारी') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'सायंकाळी') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) { + if (hour < 4) { + return 'रात्री'; + } else if (hour < 10) { + return 'सकाळी'; + } else if (hour < 17) { + return 'दुपारी'; + } else if (hour < 20) { + return 'सायंकाळी'; + } else { + return 'रात्री'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); + + return mr; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ms-my.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ms-my.js new file mode 100755 index 00000000..72188205 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ms-my.js @@ -0,0 +1,81 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var msMy = moment.defineLocale('ms-my', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + ss : '%d saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return msMy; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ms.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ms.js new file mode 100755 index 00000000..1fe21443 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ms.js @@ -0,0 +1,81 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var ms = moment.defineLocale('ms', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + ss : '%d saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return ms; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mt.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mt.js new file mode 100755 index 00000000..4a34c5de --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mt.js @@ -0,0 +1,59 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var mt = moment.defineLocale('mt', { + months : 'Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru'.split('_'), + monthsShort : 'Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ'.split('_'), + weekdays : 'Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt'.split('_'), + weekdaysShort : 'Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib'.split('_'), + weekdaysMin : 'Ħa_Tn_Tl_Er_Ħa_Ġi_Si'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Illum fil-]LT', + nextDay : '[Għada fil-]LT', + nextWeek : 'dddd [fil-]LT', + lastDay : '[Il-bieraħ fil-]LT', + lastWeek : 'dddd [li għadda] [fil-]LT', + sameElse : 'L' + }, + relativeTime : { + future : 'f’ %s', + past : '%s ilu', + s : 'ftit sekondi', + ss : '%d sekondi', + m : 'minuta', + mm : '%d minuti', + h : 'siegħa', + hh : '%d siegħat', + d : 'ġurnata', + dd : '%d ġranet', + M : 'xahar', + MM : '%d xhur', + y : 'sena', + yy : '%d sni' + }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal: '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return mt; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/my.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/my.js new file mode 100755 index 00000000..bc87c7f7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/my.js @@ -0,0 +1,92 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var symbolMap = { + '1': '၁', + '2': '၂', + '3': '၃', + '4': '၄', + '5': '၅', + '6': '၆', + '7': '၇', + '8': '၈', + '9': '၉', + '0': '၀' + }, numberMap = { + '၁': '1', + '၂': '2', + '၃': '3', + '၄': '4', + '၅': '5', + '၆': '6', + '၇': '7', + '၈': '8', + '၉': '9', + '၀': '0' + }; + + var my = moment.defineLocale('my', { + months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'), + monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), + weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'), + weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd D MMMM YYYY HH:mm' + }, + calendar: { + sameDay: '[ယနေ.] LT [မှာ]', + nextDay: '[မနက်ဖြန်] LT [မှာ]', + nextWeek: 'dddd LT [မှာ]', + lastDay: '[မနေ.က] LT [မှာ]', + lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]', + sameElse: 'L' + }, + relativeTime: { + future: 'လာမည့် %s မှာ', + past: 'လွန်ခဲ့သော %s က', + s: 'စက္ကန်.အနည်းငယ်', + ss : '%d စက္ကန့်', + m: 'တစ်မိနစ်', + mm: '%d မိနစ်', + h: 'တစ်နာရီ', + hh: '%d နာရီ', + d: 'တစ်ရက်', + dd: '%d ရက်', + M: 'တစ်လ', + MM: '%d လ', + y: 'တစ်နှစ်', + yy: '%d နှစ်' + }, + preparse: function (string) { + return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 1st is the first week of the year. + } + }); + + return my; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nb.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nb.js new file mode 100755 index 00000000..f2298104 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nb.js @@ -0,0 +1,61 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var nb = moment.defineLocale('nb', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.'.split('_'), + monthsParseExact : true, + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'sø._ma._ti._on._to._fr._lø.'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] HH:mm', + LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' + }, + calendar : { + sameDay: '[i dag kl.] LT', + nextDay: '[i morgen kl.] LT', + nextWeek: 'dddd [kl.] LT', + lastDay: '[i går kl.] LT', + lastWeek: '[forrige] dddd [kl.] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s siden', + s : 'noen sekunder', + ss : '%d sekunder', + m : 'ett minutt', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dager', + M : 'en måned', + MM : '%d måneder', + y : 'ett år', + yy : '%d år' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return nb; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ne.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ne.js new file mode 100755 index 00000000..2ec063ee --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ne.js @@ -0,0 +1,122 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + var ne = moment.defineLocale('ne', { + months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'), + monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'), + monthsParseExact : true, + weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'), + weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'), + weekdaysMin : 'आ._सो._मं._बु._बि._शु._श.'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'Aको h:mm बजे', + LTS : 'Aको h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, Aको h:mm बजे', + LLLL : 'dddd, D MMMM YYYY, Aको h:mm बजे' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /राति|बिहान|दिउँसो|साँझ/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'राति') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'बिहान') { + return hour; + } else if (meridiem === 'दिउँसो') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'साँझ') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 3) { + return 'राति'; + } else if (hour < 12) { + return 'बिहान'; + } else if (hour < 16) { + return 'दिउँसो'; + } else if (hour < 20) { + return 'साँझ'; + } else { + return 'राति'; + } + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[भोलि] LT', + nextWeek : '[आउँदो] dddd[,] LT', + lastDay : '[हिजो] LT', + lastWeek : '[गएको] dddd[,] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%sमा', + past : '%s अगाडि', + s : 'केही क्षण', + ss : '%d सेकेण्ड', + m : 'एक मिनेट', + mm : '%d मिनेट', + h : 'एक घण्टा', + hh : '%d घण्टा', + d : 'एक दिन', + dd : '%d दिन', + M : 'एक महिना', + MM : '%d महिना', + y : 'एक बर्ष', + yy : '%d बर्ष' + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); + + return ne; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nl-be.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nl-be.js new file mode 100755 index 00000000..0e5bdc96 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nl-be.js @@ -0,0 +1,86 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); + + var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i]; + var monthsRegex = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; + + var nlBe = moment.defineLocale('nl-be', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortWithDots; + } else if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + + monthsRegex: monthsRegex, + monthsShortRegex: monthsRegex, + monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i, + monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, + + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, + + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'zo_ma_di_wo_do_vr_za'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + ss : '%d seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + y : 'één jaar', + yy : '%d jaar' + }, + dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return nlBe; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nl.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nl.js new file mode 100755 index 00000000..842f4fe1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nl.js @@ -0,0 +1,86 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); + + var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i]; + var monthsRegex = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; + + var nl = moment.defineLocale('nl', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortWithDots; + } else if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + + monthsRegex: monthsRegex, + monthsShortRegex: monthsRegex, + monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i, + monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, + + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, + + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'zo_ma_di_wo_do_vr_za'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + ss : '%d seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + y : 'één jaar', + yy : '%d jaar' + }, + dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return nl; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nn.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nn.js new file mode 100755 index 00000000..5fa35504 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nn.js @@ -0,0 +1,59 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var nn = moment.defineLocale('nn', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), + weekdaysShort : 'sun_mån_tys_ons_tor_fre_lau'.split('_'), + weekdaysMin : 'su_må_ty_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] H:mm', + LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' + }, + calendar : { + sameDay: '[I dag klokka] LT', + nextDay: '[I morgon klokka] LT', + nextWeek: 'dddd [klokka] LT', + lastDay: '[I går klokka] LT', + lastWeek: '[Føregåande] dddd [klokka] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s sidan', + s : 'nokre sekund', + ss : '%d sekund', + m : 'eit minutt', + mm : '%d minutt', + h : 'ein time', + hh : '%d timar', + d : 'ein dag', + dd : '%d dagar', + M : 'ein månad', + MM : '%d månader', + y : 'eit år', + yy : '%d år' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return nn; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pa-in.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pa-in.js new file mode 100755 index 00000000..f17b8dd9 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pa-in.js @@ -0,0 +1,123 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var symbolMap = { + '1': '੧', + '2': '੨', + '3': '੩', + '4': '੪', + '5': '੫', + '6': '੬', + '7': '੭', + '8': '੮', + '9': '੯', + '0': '੦' + }, + numberMap = { + '੧': '1', + '੨': '2', + '੩': '3', + '੪': '4', + '੫': '5', + '੬': '6', + '੭': '7', + '੮': '8', + '੯': '9', + '੦': '0' + }; + + var paIn = moment.defineLocale('pa-in', { + // There are months name as per Nanakshahi Calender but they are not used as rigidly in modern Punjabi. + months : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'), + monthsShort : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'), + weekdays : 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split('_'), + weekdaysShort : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'), + weekdaysMin : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'), + longDateFormat : { + LT : 'A h:mm ਵਜੇ', + LTS : 'A h:mm:ss ਵਜੇ', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm ਵਜੇ', + LLLL : 'dddd, D MMMM YYYY, A h:mm ਵਜੇ' + }, + calendar : { + sameDay : '[ਅਜ] LT', + nextDay : '[ਕਲ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ਕਲ] LT', + lastWeek : '[ਪਿਛਲੇ] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ਵਿੱਚ', + past : '%s ਪਿਛਲੇ', + s : 'ਕੁਝ ਸਕਿੰਟ', + ss : '%d ਸਕਿੰਟ', + m : 'ਇਕ ਮਿੰਟ', + mm : '%d ਮਿੰਟ', + h : 'ਇੱਕ ਘੰਟਾ', + hh : '%d ਘੰਟੇ', + d : 'ਇੱਕ ਦਿਨ', + dd : '%d ਦਿਨ', + M : 'ਇੱਕ ਮਹੀਨਾ', + MM : '%d ਮਹੀਨੇ', + y : 'ਇੱਕ ਸਾਲ', + yy : '%d ਸਾਲ' + }, + preparse: function (string) { + return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Punjabi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi. + meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'ਰਾਤ') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'ਸਵੇਰ') { + return hour; + } else if (meridiem === 'ਦੁਪਹਿਰ') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'ਸ਼ਾਮ') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ਰਾਤ'; + } else if (hour < 10) { + return 'ਸਵੇਰ'; + } else if (hour < 17) { + return 'ਦੁਪਹਿਰ'; + } else if (hour < 20) { + return 'ਸ਼ਾਮ'; + } else { + return 'ਰਾਤ'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); + + return paIn; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pl.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pl.js new file mode 100755 index 00000000..4c9c71a0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pl.js @@ -0,0 +1,125 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_'), + monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_'); + function plural(n) { + return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); + } + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'ss': + return result + (plural(number) ? 'sekundy' : 'sekund'); + case 'm': + return withoutSuffix ? 'minuta' : 'minutę'; + case 'mm': + return result + (plural(number) ? 'minuty' : 'minut'); + case 'h': + return withoutSuffix ? 'godzina' : 'godzinę'; + case 'hh': + return result + (plural(number) ? 'godziny' : 'godzin'); + case 'MM': + return result + (plural(number) ? 'miesiące' : 'miesięcy'); + case 'yy': + return result + (plural(number) ? 'lata' : 'lat'); + } + } + + var pl = moment.defineLocale('pl', { + months : function (momentToFormat, format) { + if (!momentToFormat) { + return monthsNominative; + } else if (format === '') { + // Hack: if format empty we know this is used to generate + // RegExp by moment. Give then back both valid forms of months + // in RegExp ready format. + return '(' + monthsSubjective[momentToFormat.month()] + '|' + monthsNominative[momentToFormat.month()] + ')'; + } else if (/D MMMM/.test(format)) { + return monthsSubjective[momentToFormat.month()]; + } else { + return monthsNominative[momentToFormat.month()]; + } + }, + monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), + weekdays : 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'), + weekdaysShort : 'ndz_pon_wt_śr_czw_pt_sob'.split('_'), + weekdaysMin : 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[Dziś o] LT', + nextDay: '[Jutro o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[W niedzielę o] LT'; + + case 2: + return '[We wtorek o] LT'; + + case 3: + return '[W środę o] LT'; + + case 6: + return '[W sobotę o] LT'; + + default: + return '[W] dddd [o] LT'; + } + }, + lastDay: '[Wczoraj o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[W zeszłą niedzielę o] LT'; + case 3: + return '[W zeszłą środę o] LT'; + case 6: + return '[W zeszłą sobotę o] LT'; + default: + return '[W zeszły] dddd [o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : '%s temu', + s : 'kilka sekund', + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : '1 dzień', + dd : '%d dni', + M : 'miesiąc', + MM : translate, + y : 'rok', + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return pl; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pt-br.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pt-br.js new file mode 100755 index 00000000..64e0d01e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pt-br.js @@ -0,0 +1,60 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var ptBr = moment.defineLocale('pt-br', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'), + weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), + weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY [às] HH:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY [às] HH:mm' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : 'há %s', + s : 'poucos segundos', + ss : '%d segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + dayOfMonthOrdinalParse: /\d{1,2}º/, + ordinal : '%dº' + }); + + return ptBr; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pt.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pt.js new file mode 100755 index 00000000..b21ac45b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pt.js @@ -0,0 +1,64 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var pt = moment.defineLocale('pt', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'), + weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), + weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY HH:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY HH:mm' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : 'há %s', + s : 'segundos', + ss : '%d segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + dayOfMonthOrdinalParse: /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return pt; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ro.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ro.js new file mode 100755 index 00000000..47ec3d60 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ro.js @@ -0,0 +1,74 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'ss': 'secunde', + 'mm': 'minute', + 'hh': 'ore', + 'dd': 'zile', + 'MM': 'luni', + 'yy': 'ani' + }, + separator = ' '; + if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { + separator = ' de '; + } + return number + separator + format[key]; + } + + var ro = moment.defineLocale('ro', { + months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), + monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'), + weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), + weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' + }, + calendar : { + sameDay: '[azi la] LT', + nextDay: '[mâine la] LT', + nextWeek: 'dddd [la] LT', + lastDay: '[ieri la] LT', + lastWeek: '[fosta] dddd [la] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'peste %s', + past : '%s în urmă', + s : 'câteva secunde', + ss : relativeTimeWithPlural, + m : 'un minut', + mm : relativeTimeWithPlural, + h : 'o oră', + hh : relativeTimeWithPlural, + d : 'o zi', + dd : relativeTimeWithPlural, + M : 'o lună', + MM : relativeTimeWithPlural, + y : 'un an', + yy : relativeTimeWithPlural + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return ro; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ru.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ru.js new file mode 100755 index 00000000..7afb7b5d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ru.js @@ -0,0 +1,181 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'ss': withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд', + 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', + 'hh': 'час_часа_часов', + 'dd': 'день_дня_дней', + 'MM': 'месяц_месяца_месяцев', + 'yy': 'год_года_лет' + }; + if (key === 'm') { + return withoutSuffix ? 'минута' : 'минуту'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + var monthsParse = [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[йя]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i]; + + // http://new.gramota.ru/spravka/rules/139-prop : § 103 + // Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637 + // CLDR data: http://www.unicode.org/cldr/charts/28/summary/ru.html#1753 + var ru = moment.defineLocale('ru', { + months : { + format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_'), + standalone: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_') + }, + monthsShort : { + // по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку ? + format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_'), + standalone: 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_') + }, + weekdays : { + standalone: 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'), + format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_'), + isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/ + }, + weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), + weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, + + // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки + monthsRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i, + + // копия предыдущего + monthsShortRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i, + + // полные названия с падежами + monthsStrictRegex: /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i, + + // Выражение, которое соотвествует только сокращённым формам + monthsShortStrictRegex: /^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., H:mm', + LLLL : 'dddd, D MMMM YYYY г., H:mm' + }, + calendar : { + sameDay: '[Сегодня, в] LT', + nextDay: '[Завтра, в] LT', + lastDay: '[Вчера, в] LT', + nextWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[В следующее] dddd, [в] LT'; + case 1: + case 2: + case 4: + return '[В следующий] dddd, [в] LT'; + case 3: + case 5: + case 6: + return '[В следующую] dddd, [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd, [в] LT'; + } else { + return '[В] dddd, [в] LT'; + } + } + }, + lastWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[В прошлое] dddd, [в] LT'; + case 1: + case 2: + case 4: + return '[В прошлый] dddd, [в] LT'; + case 3: + case 5: + case 6: + return '[В прошлую] dddd, [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd, [в] LT'; + } else { + return '[В] dddd, [в] LT'; + } + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'через %s', + past : '%s назад', + s : 'несколько секунд', + ss : relativeTimeWithPlural, + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'час', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'месяц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + meridiemParse: /ночи|утра|дня|вечера/i, + isPM : function (input) { + return /^(дня|вечера)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночи'; + } else if (hour < 12) { + return 'утра'; + } else if (hour < 17) { + return 'дня'; + } else { + return 'вечера'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}-(й|го|я)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + return number + '-й'; + case 'D': + return number + '-го'; + case 'w': + case 'W': + return number + '-я'; + default: + return number; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return ru; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sd.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sd.js new file mode 100755 index 00000000..12992382 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sd.js @@ -0,0 +1,97 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var months = [ + 'جنوري', + 'فيبروري', + 'مارچ', + 'اپريل', + 'مئي', + 'جون', + 'جولاءِ', + 'آگسٽ', + 'سيپٽمبر', + 'آڪٽوبر', + 'نومبر', + 'ڊسمبر' + ]; + var days = [ + 'آچر', + 'سومر', + 'اڱارو', + 'اربع', + 'خميس', + 'جمع', + 'ڇنڇر' + ]; + + var sd = moment.defineLocale('sd', { + months : months, + monthsShort : months, + weekdays : days, + weekdaysShort : days, + weekdaysMin : days, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd، D MMMM YYYY HH:mm' + }, + meridiemParse: /صبح|شام/, + isPM : function (input) { + return 'شام' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'صبح'; + } + return 'شام'; + }, + calendar : { + sameDay : '[اڄ] LT', + nextDay : '[سڀاڻي] LT', + nextWeek : 'dddd [اڳين هفتي تي] LT', + lastDay : '[ڪالهه] LT', + lastWeek : '[گزريل هفتي] dddd [تي] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s پوء', + past : '%s اڳ', + s : 'چند سيڪنڊ', + ss : '%d سيڪنڊ', + m : 'هڪ منٽ', + mm : '%d منٽ', + h : 'هڪ ڪلاڪ', + hh : '%d ڪلاڪ', + d : 'هڪ ڏينهن', + dd : '%d ڏينهن', + M : 'هڪ مهينو', + MM : '%d مهينا', + y : 'هڪ سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/,/g, '،'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return sd; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/se.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/se.js new file mode 100755 index 00000000..4b046780 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/se.js @@ -0,0 +1,59 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var se = moment.defineLocale('se', { + months : 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split('_'), + monthsShort : 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'), + weekdays : 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split('_'), + weekdaysShort : 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'), + weekdaysMin : 's_v_m_g_d_b_L'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'MMMM D. [b.] YYYY', + LLL : 'MMMM D. [b.] YYYY [ti.] HH:mm', + LLLL : 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm' + }, + calendar : { + sameDay: '[otne ti] LT', + nextDay: '[ihttin ti] LT', + nextWeek: 'dddd [ti] LT', + lastDay: '[ikte ti] LT', + lastWeek: '[ovddit] dddd [ti] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s geažes', + past : 'maŋit %s', + s : 'moadde sekunddat', + ss: '%d sekunddat', + m : 'okta minuhta', + mm : '%d minuhtat', + h : 'okta diimmu', + hh : '%d diimmut', + d : 'okta beaivi', + dd : '%d beaivvit', + M : 'okta mánnu', + MM : '%d mánut', + y : 'okta jahki', + yy : '%d jagit' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return se; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/si.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/si.js new file mode 100755 index 00000000..52dc6080 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/si.js @@ -0,0 +1,70 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + /*jshint -W100*/ + var si = moment.defineLocale('si', { + months : 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split('_'), + monthsShort : 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split('_'), + weekdays : 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'), + weekdaysShort : 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'), + weekdaysMin : 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'a h:mm', + LTS : 'a h:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY MMMM D', + LLL : 'YYYY MMMM D, a h:mm', + LLLL : 'YYYY MMMM D [වැනි] dddd, a h:mm:ss' + }, + calendar : { + sameDay : '[අද] LT[ට]', + nextDay : '[හෙට] LT[ට]', + nextWeek : 'dddd LT[ට]', + lastDay : '[ඊයේ] LT[ට]', + lastWeek : '[පසුගිය] dddd LT[ට]', + sameElse : 'L' + }, + relativeTime : { + future : '%sකින්', + past : '%sකට පෙර', + s : 'තත්පර කිහිපය', + ss : 'තත්පර %d', + m : 'මිනිත්තුව', + mm : 'මිනිත්තු %d', + h : 'පැය', + hh : 'පැය %d', + d : 'දිනය', + dd : 'දින %d', + M : 'මාසය', + MM : 'මාස %d', + y : 'වසර', + yy : 'වසර %d' + }, + dayOfMonthOrdinalParse: /\d{1,2} වැනි/, + ordinal : function (number) { + return number + ' වැනි'; + }, + meridiemParse : /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./, + isPM : function (input) { + return input === 'ප.ව.' || input === 'පස් වරු'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'ප.ව.' : 'පස් වරු'; + } else { + return isLower ? 'පෙ.ව.' : 'පෙර වරු'; + } + } + }); + + return si; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sk.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sk.js new file mode 100755 index 00000000..6938f95e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sk.js @@ -0,0 +1,155 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'), + monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); + function plural(n) { + return (n > 1) && (n < 5); + } + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; + case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'sekundy' : 'sekúnd'); + } else { + return result + 'sekundami'; + } + break; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minúty' : 'minút'); + } else { + return result + 'minútami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodín'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dni' : 'dní'); + } else { + return result + 'dňami'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mesiace' : 'mesiacov'); + } else { + return result + 'mesiacmi'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'rokov'); + } else { + return result + 'rokmi'; + } + break; + } + } + + var sk = moment.defineLocale('sk', { + months : months, + monthsShort : monthsShort, + weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'), + weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'), + weekdaysMin : 'ne_po_ut_st_št_pi_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd D. MMMM YYYY H:mm' + }, + calendar : { + sameDay: '[dnes o] LT', + nextDay: '[zajtra o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedeľu o] LT'; + case 1: + case 2: + return '[v] dddd [o] LT'; + case 3: + return '[v stredu o] LT'; + case 4: + return '[vo štvrtok o] LT'; + case 5: + return '[v piatok o] LT'; + case 6: + return '[v sobotu o] LT'; + } + }, + lastDay: '[včera o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulú nedeľu o] LT'; + case 1: + case 2: + return '[minulý] dddd [o] LT'; + case 3: + return '[minulú stredu o] LT'; + case 4: + case 5: + return '[minulý] dddd [o] LT'; + case 6: + return '[minulú sobotu o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pred %s', + s : translate, + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return sk; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sl.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sl.js new file mode 100755 index 00000000..8dec7813 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sl.js @@ -0,0 +1,172 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami'; + case 'ss': + if (number === 1) { + result += withoutSuffix ? 'sekundo' : 'sekundi'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'sekundi' : 'sekundah'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'sekunde' : 'sekundah'; + } else { + result += withoutSuffix || isFuture ? 'sekund' : 'sekund'; + } + return result; + case 'm': + return withoutSuffix ? 'ena minuta' : 'eno minuto'; + case 'mm': + if (number === 1) { + result += withoutSuffix ? 'minuta' : 'minuto'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'minuti' : 'minutama'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'minute' : 'minutami'; + } else { + result += withoutSuffix || isFuture ? 'minut' : 'minutami'; + } + return result; + case 'h': + return withoutSuffix ? 'ena ura' : 'eno uro'; + case 'hh': + if (number === 1) { + result += withoutSuffix ? 'ura' : 'uro'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'uri' : 'urama'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'ure' : 'urami'; + } else { + result += withoutSuffix || isFuture ? 'ur' : 'urami'; + } + return result; + case 'd': + return withoutSuffix || isFuture ? 'en dan' : 'enim dnem'; + case 'dd': + if (number === 1) { + result += withoutSuffix || isFuture ? 'dan' : 'dnem'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'dni' : 'dnevoma'; + } else { + result += withoutSuffix || isFuture ? 'dni' : 'dnevi'; + } + return result; + case 'M': + return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem'; + case 'MM': + if (number === 1) { + result += withoutSuffix || isFuture ? 'mesec' : 'mesecem'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'meseca' : 'mesecema'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'mesece' : 'meseci'; + } else { + result += withoutSuffix || isFuture ? 'mesecev' : 'meseci'; + } + return result; + case 'y': + return withoutSuffix || isFuture ? 'eno leto' : 'enim letom'; + case 'yy': + if (number === 1) { + result += withoutSuffix || isFuture ? 'leto' : 'letom'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'leti' : 'letoma'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'leta' : 'leti'; + } else { + result += withoutSuffix || isFuture ? 'let' : 'leti'; + } + return result; + } + } + + var sl = moment.defineLocale('sl', { + months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'), + weekdaysShort : 'ned._pon._tor._sre._čet._pet._sob.'.split('_'), + weekdaysMin : 'ne_po_to_sr_če_pe_so'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd, D. MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[danes ob] LT', + nextDay : '[jutri ob] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[v] [nedeljo] [ob] LT'; + case 3: + return '[v] [sredo] [ob] LT'; + case 6: + return '[v] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[v] dddd [ob] LT'; + } + }, + lastDay : '[včeraj ob] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + return '[prejšnjo] [nedeljo] [ob] LT'; + case 3: + return '[prejšnjo] [sredo] [ob] LT'; + case 6: + return '[prejšnjo] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prejšnji] dddd [ob] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'čez %s', + past : 'pred %s', + s : processRelativeTime, + ss : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return sl; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sq.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sq.js new file mode 100755 index 00000000..eb081df0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sq.js @@ -0,0 +1,67 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var sq = moment.defineLocale('sq', { + months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), + monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), + weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), + weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), + weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), + weekdaysParseExact : true, + meridiemParse: /PD|MD/, + isPM: function (input) { + return input.charAt(0) === 'M'; + }, + meridiem : function (hours, minutes, isLower) { + return hours < 12 ? 'PD' : 'MD'; + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Sot në] LT', + nextDay : '[Nesër në] LT', + nextWeek : 'dddd [në] LT', + lastDay : '[Dje në] LT', + lastWeek : 'dddd [e kaluar në] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'në %s', + past : '%s më parë', + s : 'disa sekonda', + ss : '%d sekonda', + m : 'një minutë', + mm : '%d minuta', + h : 'një orë', + hh : '%d orë', + d : 'një ditë', + dd : '%d ditë', + M : 'një muaj', + MM : '%d muaj', + y : 'një vit', + yy : '%d vite' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return sq; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sr-cyrl.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sr-cyrl.js new file mode 100755 index 00000000..ccd92b95 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sr-cyrl.js @@ -0,0 +1,110 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var translator = { + words: { //Different grammatical cases + ss: ['секунда', 'секунде', 'секунди'], + m: ['један минут', 'једне минуте'], + mm: ['минут', 'минуте', 'минута'], + h: ['један сат', 'једног сата'], + hh: ['сат', 'сата', 'сати'], + dd: ['дан', 'дана', 'дана'], + MM: ['месец', 'месеца', 'месеци'], + yy: ['година', 'године', 'година'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + var srCyrl = moment.defineLocale('sr-cyrl', { + months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split('_'), + monthsShort: 'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'), + monthsParseExact: true, + weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'), + weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'), + weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'), + weekdaysParseExact : true, + longDateFormat: { + LT: 'H:mm', + LTS : 'H:mm:ss', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm', + LLLL: 'dddd, D. MMMM YYYY H:mm' + }, + calendar: { + sameDay: '[данас у] LT', + nextDay: '[сутра у] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[у] [недељу] [у] LT'; + case 3: + return '[у] [среду] [у] LT'; + case 6: + return '[у] [суботу] [у] LT'; + case 1: + case 2: + case 4: + case 5: + return '[у] dddd [у] LT'; + } + }, + lastDay : '[јуче у] LT', + lastWeek : function () { + var lastWeekDays = [ + '[прошле] [недеље] [у] LT', + '[прошлог] [понедељка] [у] LT', + '[прошлог] [уторка] [у] LT', + '[прошле] [среде] [у] LT', + '[прошлог] [четвртка] [у] LT', + '[прошлог] [петка] [у] LT', + '[прошле] [суботе] [у] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'за %s', + past : 'пре %s', + s : 'неколико секунди', + ss : translator.translate, + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'дан', + dd : translator.translate, + M : 'месец', + MM : translator.translate, + y : 'годину', + yy : translator.translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return srCyrl; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sr.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sr.js new file mode 100755 index 00000000..9e1f4a3a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sr.js @@ -0,0 +1,110 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var translator = { + words: { //Different grammatical cases + ss: ['sekunda', 'sekunde', 'sekundi'], + m: ['jedan minut', 'jedne minute'], + mm: ['minut', 'minute', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mesec', 'meseca', 'meseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + var sr = moment.defineLocale('sr', { + months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split('_'), + weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'), + weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'), + weekdaysParseExact : true, + longDateFormat: { + LT: 'H:mm', + LTS : 'H:mm:ss', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm', + LLLL: 'dddd, D. MMMM YYYY H:mm' + }, + calendar: { + sameDay: '[danas u] LT', + nextDay: '[sutra u] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[u] [nedelju] [u] LT'; + case 3: + return '[u] [sredu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juče u] LT', + lastWeek : function () { + var lastWeekDays = [ + '[prošle] [nedelje] [u] LT', + '[prošlog] [ponedeljka] [u] LT', + '[prošlog] [utorka] [u] LT', + '[prošle] [srede] [u] LT', + '[prošlog] [četvrtka] [u] LT', + '[prošlog] [petka] [u] LT', + '[prošle] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pre %s', + s : 'nekoliko sekundi', + ss : translator.translate, + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'dan', + dd : translator.translate, + M : 'mesec', + MM : translator.translate, + y : 'godinu', + yy : translator.translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return sr; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ss.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ss.js new file mode 100755 index 00000000..a401149c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ss.js @@ -0,0 +1,87 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var ss = moment.defineLocale('ss', { + months : "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split('_'), + monthsShort : 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'), + weekdays : 'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split('_'), + weekdaysShort : 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'), + weekdaysMin : 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendar : { + sameDay : '[Namuhla nga] LT', + nextDay : '[Kusasa nga] LT', + nextWeek : 'dddd [nga] LT', + lastDay : '[Itolo nga] LT', + lastWeek : 'dddd [leliphelile] [nga] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'nga %s', + past : 'wenteka nga %s', + s : 'emizuzwana lomcane', + ss : '%d mzuzwana', + m : 'umzuzu', + mm : '%d emizuzu', + h : 'lihora', + hh : '%d emahora', + d : 'lilanga', + dd : '%d emalanga', + M : 'inyanga', + MM : '%d tinyanga', + y : 'umnyaka', + yy : '%d iminyaka' + }, + meridiemParse: /ekuseni|emini|entsambama|ebusuku/, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'ekuseni'; + } else if (hours < 15) { + return 'emini'; + } else if (hours < 19) { + return 'entsambama'; + } else { + return 'ebusuku'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'ekuseni') { + return hour; + } else if (meridiem === 'emini') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') { + if (hour === 0) { + return 0; + } + return hour + 12; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}/, + ordinal : '%d', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return ss; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sv.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sv.js new file mode 100755 index 00000000..494fedba --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sv.js @@ -0,0 +1,68 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var sv = moment.defineLocale('sv', { + months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), + weekdaysShort : 'sön_mån_tis_ons_tor_fre_lör'.split('_'), + weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [kl.] HH:mm', + LLLL : 'dddd D MMMM YYYY [kl.] HH:mm', + lll : 'D MMM YYYY HH:mm', + llll : 'ddd D MMM YYYY HH:mm' + }, + calendar : { + sameDay: '[Idag] LT', + nextDay: '[Imorgon] LT', + lastDay: '[Igår] LT', + nextWeek: '[På] dddd LT', + lastWeek: '[I] dddd[s] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'för %s sedan', + s : 'några sekunder', + ss : '%d sekunder', + m : 'en minut', + mm : '%d minuter', + h : 'en timme', + hh : '%d timmar', + d : 'en dag', + dd : '%d dagar', + M : 'en månad', + MM : '%d månader', + y : 'ett år', + yy : '%d år' + }, + dayOfMonthOrdinalParse: /\d{1,2}(e|a)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'e' : + (b === 1) ? 'a' : + (b === 2) ? 'a' : + (b === 3) ? 'e' : 'e'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return sv; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sw.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sw.js new file mode 100755 index 00000000..1f564e09 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sw.js @@ -0,0 +1,58 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var sw = moment.defineLocale('sw', { + months : 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split('_'), + weekdaysShort : 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'), + weekdaysMin : 'J2_J3_J4_J5_Al_Ij_J1'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[leo saa] LT', + nextDay : '[kesho saa] LT', + nextWeek : '[wiki ijayo] dddd [saat] LT', + lastDay : '[jana] LT', + lastWeek : '[wiki iliyopita] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s baadaye', + past : 'tokea %s', + s : 'hivi punde', + ss : 'sekunde %d', + m : 'dakika moja', + mm : 'dakika %d', + h : 'saa limoja', + hh : 'masaa %d', + d : 'siku moja', + dd : 'masiku %d', + M : 'mwezi mmoja', + MM : 'miezi %d', + y : 'mwaka mmoja', + yy : 'miaka %d' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return sw; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ta.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ta.js new file mode 100755 index 00000000..92142c92 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ta.js @@ -0,0 +1,128 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var symbolMap = { + '1': '௧', + '2': '௨', + '3': '௩', + '4': '௪', + '5': '௫', + '6': '௬', + '7': '௭', + '8': '௮', + '9': '௯', + '0': '௦' + }, numberMap = { + '௧': '1', + '௨': '2', + '௩': '3', + '௪': '4', + '௫': '5', + '௬': '6', + '௭': '7', + '௮': '8', + '௯': '9', + '௦': '0' + }; + + var ta = moment.defineLocale('ta', { + months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), + monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), + weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'), + weekdaysShort : 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split('_'), + weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, HH:mm', + LLLL : 'dddd, D MMMM YYYY, HH:mm' + }, + calendar : { + sameDay : '[இன்று] LT', + nextDay : '[நாளை] LT', + nextWeek : 'dddd, LT', + lastDay : '[நேற்று] LT', + lastWeek : '[கடந்த வாரம்] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s இல்', + past : '%s முன்', + s : 'ஒரு சில விநாடிகள்', + ss : '%d விநாடிகள்', + m : 'ஒரு நிமிடம்', + mm : '%d நிமிடங்கள்', + h : 'ஒரு மணி நேரம்', + hh : '%d மணி நேரம்', + d : 'ஒரு நாள்', + dd : '%d நாட்கள்', + M : 'ஒரு மாதம்', + MM : '%d மாதங்கள்', + y : 'ஒரு வருடம்', + yy : '%d ஆண்டுகள்' + }, + dayOfMonthOrdinalParse: /\d{1,2}வது/, + ordinal : function (number) { + return number + 'வது'; + }, + preparse: function (string) { + return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // refer http://ta.wikipedia.org/s/1er1 + meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/, + meridiem : function (hour, minute, isLower) { + if (hour < 2) { + return ' யாமம்'; + } else if (hour < 6) { + return ' வைகறை'; // வைகறை + } else if (hour < 10) { + return ' காலை'; // காலை + } else if (hour < 14) { + return ' நண்பகல்'; // நண்பகல் + } else if (hour < 18) { + return ' எற்பாடு'; // எற்பாடு + } else if (hour < 22) { + return ' மாலை'; // மாலை + } else { + return ' யாமம்'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'யாமம்') { + return hour < 2 ? hour : hour + 12; + } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { + return hour; + } else if (meridiem === 'நண்பகல்') { + return hour >= 10 ? hour : hour + 12; + } else { + return hour + 12; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); + + return ta; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/te.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/te.js new file mode 100755 index 00000000..fe9ec2b3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/te.js @@ -0,0 +1,88 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var te = moment.defineLocale('te', { + months : 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జూలై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split('_'), + monthsShort : 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జూలై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split('_'), + monthsParseExact : true, + weekdays : 'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split('_'), + weekdaysShort : 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'), + weekdaysMin : 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'A h:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm', + LLLL : 'dddd, D MMMM YYYY, A h:mm' + }, + calendar : { + sameDay : '[నేడు] LT', + nextDay : '[రేపు] LT', + nextWeek : 'dddd, LT', + lastDay : '[నిన్న] LT', + lastWeek : '[గత] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s లో', + past : '%s క్రితం', + s : 'కొన్ని క్షణాలు', + ss : '%d సెకన్లు', + m : 'ఒక నిమిషం', + mm : '%d నిమిషాలు', + h : 'ఒక గంట', + hh : '%d గంటలు', + d : 'ఒక రోజు', + dd : '%d రోజులు', + M : 'ఒక నెల', + MM : '%d నెలలు', + y : 'ఒక సంవత్సరం', + yy : '%d సంవత్సరాలు' + }, + dayOfMonthOrdinalParse : /\d{1,2}వ/, + ordinal : '%dవ', + meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'రాత్రి') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'ఉదయం') { + return hour; + } else if (meridiem === 'మధ్యాహ్నం') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'సాయంత్రం') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'రాత్రి'; + } else if (hour < 10) { + return 'ఉదయం'; + } else if (hour < 17) { + return 'మధ్యాహ్నం'; + } else if (hour < 20) { + return 'సాయంత్రం'; + } else { + return 'రాత్రి'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); + + return te; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tet.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tet.js new file mode 100755 index 00000000..efa53da1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tet.js @@ -0,0 +1,66 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var tet = moment.defineLocale('tet', { + months : 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru'.split('_'), + monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'), + weekdays : 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu'.split('_'), + weekdaysShort : 'Dom_Seg_Ters_Kua_Kint_Sest_Sab'.split('_'), + weekdaysMin : 'Do_Seg_Te_Ku_Ki_Ses_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[Ohin iha] LT', + nextDay: '[Aban iha] LT', + nextWeek: 'dddd [iha] LT', + lastDay: '[Horiseik iha] LT', + lastWeek: 'dddd [semana kotuk] [iha] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'iha %s', + past : '%s liuba', + s : 'minutu balun', + ss : 'minutu %d', + m : 'minutu ida', + mm : 'minutu %d', + h : 'oras ida', + hh : 'oras %d', + d : 'loron ida', + dd : 'loron %d', + M : 'fulan ida', + MM : 'fulan %d', + y : 'tinan ida', + yy : 'tinan %d' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return tet; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tg.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tg.js new file mode 100755 index 00000000..c2833680 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tg.js @@ -0,0 +1,115 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var suffixes = { + 0: '-ум', + 1: '-ум', + 2: '-юм', + 3: '-юм', + 4: '-ум', + 5: '-ум', + 6: '-ум', + 7: '-ум', + 8: '-ум', + 9: '-ум', + 10: '-ум', + 12: '-ум', + 13: '-ум', + 20: '-ум', + 30: '-юм', + 40: '-ум', + 50: '-ум', + 60: '-ум', + 70: '-ум', + 80: '-ум', + 90: '-ум', + 100: '-ум' + }; + + var tg = moment.defineLocale('tg', { + months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'), + monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'), + weekdays : 'якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе'.split('_'), + weekdaysShort : 'яшб_дшб_сшб_чшб_пшб_ҷум_шнб'.split('_'), + weekdaysMin : 'яш_дш_сш_чш_пш_ҷм_шб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Имрӯз соати] LT', + nextDay : '[Пагоҳ соати] LT', + lastDay : '[Дирӯз соати] LT', + nextWeek : 'dddd[и] [ҳафтаи оянда соати] LT', + lastWeek : 'dddd[и] [ҳафтаи гузашта соати] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'баъди %s', + past : '%s пеш', + s : 'якчанд сония', + m : 'як дақиқа', + mm : '%d дақиқа', + h : 'як соат', + hh : '%d соат', + d : 'як рӯз', + dd : '%d рӯз', + M : 'як моҳ', + MM : '%d моҳ', + y : 'як сол', + yy : '%d сол' + }, + meridiemParse: /шаб|субҳ|рӯз|бегоҳ/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'шаб') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'субҳ') { + return hour; + } else if (meridiem === 'рӯз') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'бегоҳ') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) { + if (hour < 4) { + return 'шаб'; + } else if (hour < 11) { + return 'субҳ'; + } else if (hour < 16) { + return 'рӯз'; + } else if (hour < 19) { + return 'бегоҳ'; + } else { + return 'шаб'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ум|юм)/, + ordinal: function (number) { + var a = number % 10, + b = number >= 100 ? 100 : null; + return number + (suffixes[number] || suffixes[a] || suffixes[b]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1th is the first week of the year. + } + }); + + return tg; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/th.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/th.js new file mode 100755 index 00000000..87489a4e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/th.js @@ -0,0 +1,66 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var th = moment.defineLocale('th', { + months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'), + monthsShort : 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split('_'), + monthsParseExact: true, + weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'), + weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference + weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY เวลา H:mm', + LLLL : 'วันddddที่ D MMMM YYYY เวลา H:mm' + }, + meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/, + isPM: function (input) { + return input === 'หลังเที่ยง'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ก่อนเที่ยง'; + } else { + return 'หลังเที่ยง'; + } + }, + calendar : { + sameDay : '[วันนี้ เวลา] LT', + nextDay : '[พรุ่งนี้ เวลา] LT', + nextWeek : 'dddd[หน้า เวลา] LT', + lastDay : '[เมื่อวานนี้ เวลา] LT', + lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'อีก %s', + past : '%sที่แล้ว', + s : 'ไม่กี่วินาที', + ss : '%d วินาที', + m : '1 นาที', + mm : '%d นาที', + h : '1 ชั่วโมง', + hh : '%d ชั่วโมง', + d : '1 วัน', + dd : '%d วัน', + M : '1 เดือน', + MM : '%d เดือน', + y : '1 ปี', + yy : '%d ปี' + } + }); + + return th; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tl-ph.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tl-ph.js new file mode 100755 index 00000000..3f7e45ee --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tl-ph.js @@ -0,0 +1,61 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var tlPh = moment.defineLocale('tl-ph', { + months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), + monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), + weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), + weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), + weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'MM/D/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY HH:mm', + LLLL : 'dddd, MMMM DD, YYYY HH:mm' + }, + calendar : { + sameDay: 'LT [ngayong araw]', + nextDay: '[Bukas ng] LT', + nextWeek: 'LT [sa susunod na] dddd', + lastDay: 'LT [kahapon]', + lastWeek: 'LT [noong nakaraang] dddd', + sameElse: 'L' + }, + relativeTime : { + future : 'sa loob ng %s', + past : '%s ang nakalipas', + s : 'ilang segundo', + ss : '%d segundo', + m : 'isang minuto', + mm : '%d minuto', + h : 'isang oras', + hh : '%d oras', + d : 'isang araw', + dd : '%d araw', + M : 'isang buwan', + MM : '%d buwan', + y : 'isang taon', + yy : '%d taon' + }, + dayOfMonthOrdinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return tlPh; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tlh.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tlh.js new file mode 100755 index 00000000..7ea953b8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tlh.js @@ -0,0 +1,121 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_'); + + function translateFuture(output) { + var time = output; + time = (output.indexOf('jaj') !== -1) ? + time.slice(0, -3) + 'leS' : + (output.indexOf('jar') !== -1) ? + time.slice(0, -3) + 'waQ' : + (output.indexOf('DIS') !== -1) ? + time.slice(0, -3) + 'nem' : + time + ' pIq'; + return time; + } + + function translatePast(output) { + var time = output; + time = (output.indexOf('jaj') !== -1) ? + time.slice(0, -3) + 'Hu’' : + (output.indexOf('jar') !== -1) ? + time.slice(0, -3) + 'wen' : + (output.indexOf('DIS') !== -1) ? + time.slice(0, -3) + 'ben' : + time + ' ret'; + return time; + } + + function translate(number, withoutSuffix, string, isFuture) { + var numberNoun = numberAsNoun(number); + switch (string) { + case 'ss': + return numberNoun + ' lup'; + case 'mm': + return numberNoun + ' tup'; + case 'hh': + return numberNoun + ' rep'; + case 'dd': + return numberNoun + ' jaj'; + case 'MM': + return numberNoun + ' jar'; + case 'yy': + return numberNoun + ' DIS'; + } + } + + function numberAsNoun(number) { + var hundred = Math.floor((number % 1000) / 100), + ten = Math.floor((number % 100) / 10), + one = number % 10, + word = ''; + if (hundred > 0) { + word += numbersNouns[hundred] + 'vatlh'; + } + if (ten > 0) { + word += ((word !== '') ? ' ' : '') + numbersNouns[ten] + 'maH'; + } + if (one > 0) { + word += ((word !== '') ? ' ' : '') + numbersNouns[one]; + } + return (word === '') ? 'pagh' : word; + } + + var tlh = moment.defineLocale('tlh', { + months : 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split('_'), + monthsShort : 'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split('_'), + monthsParseExact : true, + weekdays : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), + weekdaysShort : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), + weekdaysMin : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[DaHjaj] LT', + nextDay: '[wa’leS] LT', + nextWeek: 'LLL', + lastDay: '[wa’Hu’] LT', + lastWeek: 'LLL', + sameElse: 'L' + }, + relativeTime : { + future : translateFuture, + past : translatePast, + s : 'puS lup', + ss : translate, + m : 'wa’ tup', + mm : translate, + h : 'wa’ rep', + hh : translate, + d : 'wa’ jaj', + dd : translate, + M : 'wa’ jar', + MM : translate, + y : 'wa’ DIS', + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return tlh; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tr.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tr.js new file mode 100755 index 00000000..2e1dd730 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tr.js @@ -0,0 +1,93 @@ + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + var suffixes = { + 1: '\'inci', + 5: '\'inci', + 8: '\'inci', + 70: '\'inci', + 80: '\'inci', + 2: '\'nci', + 7: '\'nci', + 20: '\'nci', + 50: '\'nci', + 3: '\'üncü', + 4: '\'üncü', + 100: '\'üncü', + 6: '\'ncı', + 9: '\'uncu', + 10: '\'uncu', + 30: '\'uncu', + 60: '\'ıncı', + 90: '\'ıncı' + }; + + var tr = moment.defineLocale('tr', { + months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'), + monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'), + weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'), + weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), + weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[yarın saat] LT', + nextWeek : '[gelecek] dddd [saat] LT', + lastDay : '[dün] LT', + lastWeek : '[geçen] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s önce', + s : 'birkaç saniye', + ss : '%d saniye', + m : 'bir dakika', + mm : '%d dakika', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir yıl', + yy : '%d yıl' + }, + ordinal: function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'Do': + case 'DD': + return number; + default: + if (number === 0) { // special case for zero + return number + '\'ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return tr; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzl.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzl.js new file mode 100755 index 00000000..d32601bc --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzl.js @@ -0,0 +1,90 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + // After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals. + // This is currently too difficult (maybe even impossible) to add. + var tzl = moment.defineLocale('tzl', { + months : 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split('_'), + monthsShort : 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'), + weekdays : 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'), + weekdaysShort : 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'), + weekdaysMin : 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM [dallas] YYYY', + LLL : 'D. MMMM [dallas] YYYY HH.mm', + LLLL : 'dddd, [li] D. MMMM [dallas] YYYY HH.mm' + }, + meridiemParse: /d\'o|d\'a/i, + isPM : function (input) { + return 'd\'o' === input.toLowerCase(); + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'd\'o' : 'D\'O'; + } else { + return isLower ? 'd\'a' : 'D\'A'; + } + }, + calendar : { + sameDay : '[oxhi à] LT', + nextDay : '[demà à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[ieiri à] LT', + lastWeek : '[sür el] dddd [lasteu à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'osprei %s', + past : 'ja%s', + s : processRelativeTime, + ss : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's': ['viensas secunds', '\'iensas secunds'], + 'ss': [number + ' secunds', '' + number + ' secunds'], + 'm': ['\'n míut', '\'iens míut'], + 'mm': [number + ' míuts', '' + number + ' míuts'], + 'h': ['\'n þora', '\'iensa þora'], + 'hh': [number + ' þoras', '' + number + ' þoras'], + 'd': ['\'n ziua', '\'iensa ziua'], + 'dd': [number + ' ziuas', '' + number + ' ziuas'], + 'M': ['\'n mes', '\'iens mes'], + 'MM': [number + ' mesen', '' + number + ' mesen'], + 'y': ['\'n ar', '\'iens ar'], + 'yy': [number + ' ars', '' + number + ' ars'] + }; + return isFuture ? format[key][0] : (withoutSuffix ? format[key][0] : format[key][1]); + } + + return tzl; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzm-latn.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzm-latn.js new file mode 100755 index 00000000..2f6a6f19 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzm-latn.js @@ -0,0 +1,57 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var tzmLatn = moment.defineLocale('tzm-latn', { + months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), + weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), + weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[asdkh g] LT', + nextDay: '[aska g] LT', + nextWeek: 'dddd [g] LT', + lastDay: '[assant g] LT', + lastWeek: 'dddd [g] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dadkh s yan %s', + past : 'yan %s', + s : 'imik', + ss : '%d imik', + m : 'minuḍ', + mm : '%d minuḍ', + h : 'saɛa', + hh : '%d tassaɛin', + d : 'ass', + dd : '%d ossan', + M : 'ayowr', + MM : '%d iyyirn', + y : 'asgas', + yy : '%d isgasn' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); + + return tzmLatn; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzm.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzm.js new file mode 100755 index 00000000..1badf81b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzm.js @@ -0,0 +1,57 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var tzm = moment.defineLocale('tzm', { + months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), + monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), + weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[ⴰⵙⴷⵅ ⴴ] LT', + nextDay: '[ⴰⵙⴽⴰ ⴴ] LT', + nextWeek: 'dddd [ⴴ] LT', + lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT', + lastWeek: 'dddd [ⴴ] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s', + past : 'ⵢⴰⵏ %s', + s : 'ⵉⵎⵉⴽ', + ss : '%d ⵉⵎⵉⴽ', + m : 'ⵎⵉⵏⵓⴺ', + mm : '%d ⵎⵉⵏⵓⴺ', + h : 'ⵙⴰⵄⴰ', + hh : '%d ⵜⴰⵙⵙⴰⵄⵉⵏ', + d : 'ⴰⵙⵙ', + dd : '%d oⵙⵙⴰⵏ', + M : 'ⴰⵢoⵓⵔ', + MM : '%d ⵉⵢⵢⵉⵔⵏ', + y : 'ⴰⵙⴳⴰⵙ', + yy : '%d ⵉⵙⴳⴰⵙⵏ' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); + + return tzm; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ug-cn.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ug-cn.js new file mode 100755 index 00000000..d6c9d654 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ug-cn.js @@ -0,0 +1,118 @@ +//! moment.js language configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var ugCn = moment.defineLocale('ug-cn', { + months: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split( + '_' + ), + monthsShort: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split( + '_' + ), + weekdays: 'يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە'.split( + '_' + ), + weekdaysShort: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'), + weekdaysMin: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'YYYY-MM-DD', + LL: 'YYYY-يىلىM-ئاينىڭD-كۈنى', + LLL: 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm', + LLLL: 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm' + }, + meridiemParse: /يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if ( + meridiem === 'يېرىم كېچە' || + meridiem === 'سەھەر' || + meridiem === 'چۈشتىن بۇرۇن' + ) { + return hour; + } else if (meridiem === 'چۈشتىن كېيىن' || meridiem === 'كەچ') { + return hour + 12; + } else { + return hour >= 11 ? hour : hour + 12; + } + }, + meridiem: function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return 'يېرىم كېچە'; + } else if (hm < 900) { + return 'سەھەر'; + } else if (hm < 1130) { + return 'چۈشتىن بۇرۇن'; + } else if (hm < 1230) { + return 'چۈش'; + } else if (hm < 1800) { + return 'چۈشتىن كېيىن'; + } else { + return 'كەچ'; + } + }, + calendar: { + sameDay: '[بۈگۈن سائەت] LT', + nextDay: '[ئەتە سائەت] LT', + nextWeek: '[كېلەركى] dddd [سائەت] LT', + lastDay: '[تۆنۈگۈن] LT', + lastWeek: '[ئالدىنقى] dddd [سائەت] LT', + sameElse: 'L' + }, + relativeTime: { + future: '%s كېيىن', + past: '%s بۇرۇن', + s: 'نەچچە سېكونت', + ss: '%d سېكونت', + m: 'بىر مىنۇت', + mm: '%d مىنۇت', + h: 'بىر سائەت', + hh: '%d سائەت', + d: 'بىر كۈن', + dd: '%d كۈن', + M: 'بىر ئاي', + MM: '%d ئاي', + y: 'بىر يىل', + yy: '%d يىل' + }, + + dayOfMonthOrdinalParse: /\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/, + ordinal: function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '-كۈنى'; + case 'w': + case 'W': + return number + '-ھەپتە'; + default: + return number; + } + }, + preparse: function (string) { + return string.replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/,/g, '،'); + }, + week: { + // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 + dow: 1, // Monday is the first day of the week. + doy: 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return ugCn; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uk.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uk.js new file mode 100755 index 00000000..a8e7eddd --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uk.js @@ -0,0 +1,150 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'ss': withoutSuffix ? 'секунда_секунди_секунд' : 'секунду_секунди_секунд', + 'mm': withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин', + 'hh': withoutSuffix ? 'година_години_годин' : 'годину_години_годин', + 'dd': 'день_дні_днів', + 'MM': 'місяць_місяці_місяців', + 'yy': 'рік_роки_років' + }; + if (key === 'm') { + return withoutSuffix ? 'хвилина' : 'хвилину'; + } + else if (key === 'h') { + return withoutSuffix ? 'година' : 'годину'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'), + 'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'), + 'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_') + }; + + if (!m) { + return weekdays['nominative']; + } + + var nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? + 'accusative' : + ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ? + 'genitive' : + 'nominative'); + return weekdays[nounCase][m.day()]; + } + function processHoursFunction(str) { + return function () { + return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; + }; + } + + var uk = moment.defineLocale('uk', { + months : { + 'format': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_'), + 'standalone': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_') + }, + monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), + weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY р.', + LLL : 'D MMMM YYYY р., HH:mm', + LLLL : 'dddd, D MMMM YYYY р., HH:mm' + }, + calendar : { + sameDay: processHoursFunction('[Сьогодні '), + nextDay: processHoursFunction('[Завтра '), + lastDay: processHoursFunction('[Вчора '), + nextWeek: processHoursFunction('[У] dddd ['), + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return processHoursFunction('[Минулої] dddd [').call(this); + case 1: + case 2: + case 4: + return processHoursFunction('[Минулого] dddd [').call(this); + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'за %s', + past : '%s тому', + s : 'декілька секунд', + ss : relativeTimeWithPlural, + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'годину', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'місяць', + MM : relativeTimeWithPlural, + y : 'рік', + yy : relativeTimeWithPlural + }, + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + meridiemParse: /ночі|ранку|дня|вечора/, + isPM: function (input) { + return /^(дня|вечора)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночі'; + } else if (hour < 12) { + return 'ранку'; + } else if (hour < 17) { + return 'дня'; + } else { + return 'вечора'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}-(й|го)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return number + '-й'; + case 'D': + return number + '-го'; + default: + return number; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return uk; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ur.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ur.js new file mode 100755 index 00000000..16093125 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ur.js @@ -0,0 +1,97 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var months = [ + 'جنوری', + 'فروری', + 'مارچ', + 'اپریل', + 'مئی', + 'جون', + 'جولائی', + 'اگست', + 'ستمبر', + 'اکتوبر', + 'نومبر', + 'دسمبر' + ]; + var days = [ + 'اتوار', + 'پیر', + 'منگل', + 'بدھ', + 'جمعرات', + 'جمعہ', + 'ہفتہ' + ]; + + var ur = moment.defineLocale('ur', { + months : months, + monthsShort : months, + weekdays : days, + weekdaysShort : days, + weekdaysMin : days, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd، D MMMM YYYY HH:mm' + }, + meridiemParse: /صبح|شام/, + isPM : function (input) { + return 'شام' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'صبح'; + } + return 'شام'; + }, + calendar : { + sameDay : '[آج بوقت] LT', + nextDay : '[کل بوقت] LT', + nextWeek : 'dddd [بوقت] LT', + lastDay : '[گذشتہ روز بوقت] LT', + lastWeek : '[گذشتہ] dddd [بوقت] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s بعد', + past : '%s قبل', + s : 'چند سیکنڈ', + ss : '%d سیکنڈ', + m : 'ایک منٹ', + mm : '%d منٹ', + h : 'ایک گھنٹہ', + hh : '%d گھنٹے', + d : 'ایک دن', + dd : '%d دن', + M : 'ایک ماہ', + MM : '%d ماہ', + y : 'ایک سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/,/g, '،'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return ur; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uz-latn.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uz-latn.js new file mode 100755 index 00000000..cb32115b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uz-latn.js @@ -0,0 +1,57 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var uzLatn = moment.defineLocale('uz-latn', { + months : 'Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr'.split('_'), + monthsShort : 'Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek'.split('_'), + weekdays : 'Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba'.split('_'), + weekdaysShort : 'Yak_Dush_Sesh_Chor_Pay_Jum_Shan'.split('_'), + weekdaysMin : 'Ya_Du_Se_Cho_Pa_Ju_Sha'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'D MMMM YYYY, dddd HH:mm' + }, + calendar : { + sameDay : '[Bugun soat] LT [da]', + nextDay : '[Ertaga] LT [da]', + nextWeek : 'dddd [kuni soat] LT [da]', + lastDay : '[Kecha soat] LT [da]', + lastWeek : '[O\'tgan] dddd [kuni soat] LT [da]', + sameElse : 'L' + }, + relativeTime : { + future : 'Yaqin %s ichida', + past : 'Bir necha %s oldin', + s : 'soniya', + ss : '%d soniya', + m : 'bir daqiqa', + mm : '%d daqiqa', + h : 'bir soat', + hh : '%d soat', + d : 'bir kun', + dd : '%d kun', + M : 'bir oy', + MM : '%d oy', + y : 'bir yil', + yy : '%d yil' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); + + return uzLatn; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uz.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uz.js new file mode 100755 index 00000000..0e4ad22d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uz.js @@ -0,0 +1,57 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var uz = moment.defineLocale('uz', { + months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'), + monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'), + weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), + weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'), + weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'D MMMM YYYY, dddd HH:mm' + }, + calendar : { + sameDay : '[Бугун соат] LT [да]', + nextDay : '[Эртага] LT [да]', + nextWeek : 'dddd [куни соат] LT [да]', + lastDay : '[Кеча соат] LT [да]', + lastWeek : '[Утган] dddd [куни соат] LT [да]', + sameElse : 'L' + }, + relativeTime : { + future : 'Якин %s ичида', + past : 'Бир неча %s олдин', + s : 'фурсат', + ss : '%d фурсат', + m : 'бир дакика', + mm : '%d дакика', + h : 'бир соат', + hh : '%d соат', + d : 'бир кун', + dd : '%d кун', + M : 'бир ой', + MM : '%d ой', + y : 'бир йил', + yy : '%d йил' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 4th is the first week of the year. + } + }); + + return uz; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/vi.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/vi.js new file mode 100755 index 00000000..6fcbeafc --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/vi.js @@ -0,0 +1,78 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var vi = moment.defineLocale('vi', { + months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), + monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), + monthsParseExact : true, + weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'), + weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysParseExact : true, + meridiemParse: /sa|ch/i, + isPM : function (input) { + return /^ch$/i.test(input); + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower ? 'sa' : 'SA'; + } else { + return isLower ? 'ch' : 'CH'; + } + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM [năm] YYYY', + LLL : 'D MMMM [năm] YYYY HH:mm', + LLLL : 'dddd, D MMMM [năm] YYYY HH:mm', + l : 'DD/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY HH:mm', + llll : 'ddd, D MMM YYYY HH:mm' + }, + calendar : { + sameDay: '[Hôm nay lúc] LT', + nextDay: '[Ngày mai lúc] LT', + nextWeek: 'dddd [tuần tới lúc] LT', + lastDay: '[Hôm qua lúc] LT', + lastWeek: 'dddd [tuần rồi lúc] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s tới', + past : '%s trước', + s : 'vài giây', + ss : '%d giây' , + m : 'một phút', + mm : '%d phút', + h : 'một giờ', + hh : '%d giờ', + d : 'một ngày', + dd : '%d ngày', + M : 'một tháng', + MM : '%d tháng', + y : 'một năm', + yy : '%d năm' + }, + dayOfMonthOrdinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return vi; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/x-pseudo.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/x-pseudo.js new file mode 100755 index 00000000..9723c7ba --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/x-pseudo.js @@ -0,0 +1,67 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var xPseudo = moment.defineLocale('x-pseudo', { + months : 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split('_'), + monthsShort : 'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split('_'), + monthsParseExact : true, + weekdays : 'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split('_'), + weekdaysShort : 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'), + weekdaysMin : 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[T~ódá~ý át] LT', + nextDay : '[T~ómó~rró~w át] LT', + nextWeek : 'dddd [át] LT', + lastDay : '[Ý~ést~érdá~ý át] LT', + lastWeek : '[L~ást] dddd [át] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'í~ñ %s', + past : '%s á~gó', + s : 'á ~féw ~sécó~ñds', + ss : '%d s~écóñ~ds', + m : 'á ~míñ~úté', + mm : '%d m~íñú~tés', + h : 'á~ñ hó~úr', + hh : '%d h~óúrs', + d : 'á ~dáý', + dd : '%d d~áýs', + M : 'á ~móñ~th', + MM : '%d m~óñt~hs', + y : 'á ~ýéár', + yy : '%d ý~éárs' + }, + dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return xPseudo; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/yo.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/yo.js new file mode 100755 index 00000000..1a356dca --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/yo.js @@ -0,0 +1,59 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var yo = moment.defineLocale('yo', { + months : 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split('_'), + monthsShort : 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'), + weekdays : 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'), + weekdaysShort : 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'), + weekdaysMin : 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendar : { + sameDay : '[Ònì ni] LT', + nextDay : '[Ọ̀la ni] LT', + nextWeek : 'dddd [Ọsẹ̀ tón\'bọ] [ni] LT', + lastDay : '[Àna ni] LT', + lastWeek : 'dddd [Ọsẹ̀ tólọ́] [ni] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'ní %s', + past : '%s kọjá', + s : 'ìsẹjú aayá die', + ss :'aayá %d', + m : 'ìsẹjú kan', + mm : 'ìsẹjú %d', + h : 'wákati kan', + hh : 'wákati %d', + d : 'ọjọ́ kan', + dd : 'ọjọ́ %d', + M : 'osù kan', + MM : 'osù %d', + y : 'ọdún kan', + yy : 'ọdún %d' + }, + dayOfMonthOrdinalParse : /ọjọ́\s\d{1,2}/, + ordinal : 'ọjọ́ %d', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return yo; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-cn.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-cn.js new file mode 100755 index 00000000..b051f33c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-cn.js @@ -0,0 +1,109 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var zhCn = moment.defineLocale('zh-cn', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), + weekdaysMin : '日_一_二_三_四_五_六'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日Ah点mm分', + LLLL : 'YYYY年M月D日ddddAh点mm分', + l : 'YYYY/M/D', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日dddd HH:mm' + }, + meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || + meridiem === '上午') { + return hour; + } else if (meridiem === '下午' || meridiem === '晚上') { + return hour + 12; + } else { + // '中午' + return hour >= 11 ? hour : hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上午'; + } else if (hm < 1230) { + return '中午'; + } else if (hm < 1800) { + return '下午'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + dayOfMonthOrdinalParse: /\d{1,2}(日|月|周)/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '日'; + case 'M': + return number + '月'; + case 'w': + case 'W': + return number + '周'; + default: + return number; + } + }, + relativeTime : { + future : '%s内', + past : '%s前', + s : '几秒', + ss : '%d 秒', + m : '1 分钟', + mm : '%d 分钟', + h : '1 小时', + hh : '%d 小时', + d : '1 天', + dd : '%d 天', + M : '1 个月', + MM : '%d 个月', + y : '1 年', + yy : '%d 年' + }, + week : { + // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return zhCn; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-hk.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-hk.js new file mode 100755 index 00000000..0ad0ae31 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-hk.js @@ -0,0 +1,102 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var zhHk = moment.defineLocale('zh-hk', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : '日_一_二_三_四_五_六'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日 HH:mm', + LLLL : 'YYYY年M月D日dddd HH:mm', + l : 'YYYY/M/D', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日dddd HH:mm' + }, + meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') { + return hour; + } else if (meridiem === '中午') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下午' || meridiem === '晚上') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上午'; + } else if (hm < 1230) { + return '中午'; + } else if (hm < 1800) { + return '下午'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + '日'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } + }, + relativeTime : { + future : '%s內', + past : '%s前', + s : '幾秒', + ss : '%d 秒', + m : '1 分鐘', + mm : '%d 分鐘', + h : '1 小時', + hh : '%d 小時', + d : '1 天', + dd : '%d 天', + M : '1 個月', + MM : '%d 個月', + y : '1 年', + yy : '%d 年' + } + }); + + return zhHk; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-tw.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-tw.js new file mode 100755 index 00000000..6875cfed --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-tw.js @@ -0,0 +1,102 @@ +//! moment.js locale configuration + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + + var zhTw = moment.defineLocale('zh-tw', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : '日_一_二_三_四_五_六'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日 HH:mm', + LLLL : 'YYYY年M月D日dddd HH:mm', + l : 'YYYY/M/D', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日dddd HH:mm' + }, + meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') { + return hour; + } else if (meridiem === '中午') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下午' || meridiem === '晚上') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上午'; + } else if (hm < 1230) { + return '中午'; + } else if (hm < 1800) { + return '下午'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天] LT', + nextDay : '[明天] LT', + nextWeek : '[下]dddd LT', + lastDay : '[昨天] LT', + lastWeek : '[上]dddd LT', + sameElse : 'L' + }, + dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + '日'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } + }, + relativeTime : { + future : '%s內', + past : '%s前', + s : '幾秒', + ss : '%d 秒', + m : '1 分鐘', + mm : '%d 分鐘', + h : '1 小時', + hh : '%d 小時', + d : '1 天', + dd : '%d 天', + M : '1 個月', + MM : '%d 個月', + y : '1 年', + yy : '%d 年' + } + }); + + return zhTw; + +}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/README b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/README new file mode 100755 index 00000000..7f2baf21 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/README @@ -0,0 +1 @@ +https://www.transifex.com/rainloop/rainloop-webmail/ \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/_source.en.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/_source.en.yml new file mode 100755 index 00000000..f4f17c60 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/_source.en.yml @@ -0,0 +1,713 @@ +en: + LOGIN: + LABEL_EMAIL: "Email" + LABEL_LOGIN: "Login" + LABEL_PASSWORD: "Password" + LABEL_SIGN_ME: "Remember Me" + LABEL_VERIFICATION_CODE: "Verification Code" + LABEL_DONT_ASK_VERIFICATION_CODE: "Don't ask for the code for 2 weeks" + BUTTON_SIGN_IN: "Sign In" + TITLE_SIGN_IN_GOOGLE: "Sign In using Google" + TITLE_SIGN_IN_FACEBOOK: "Sign In using Facebook" + TITLE_SIGN_IN_TWITTER: "Sign In using Twitter" + LABEL_FORGOT_PASSWORD: "Forgot password" + LABEL_REGISTRATION: "Registration" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Add Account" + BUTTON_SETTINGS: "Settings" + BUTTON_HELP: "Help" + BUTTON_LOGOUT: "Logout" + MOBILE: + BUTTON_MOBILE_VERSION: "Mobile version" + BUTTON_DESKTOP_VERSION: "Desktop version" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Search" + TITLE_ADV: "Advanced Search" + LABEL_ADV_FROM: "From" + LABEL_ADV_TO: "To" + LABEL_ADV_SUBJECT: "Subject" + LABEL_ADV_TEXT: "Text" + LABEL_ADV_HAS_ATTACHMENT: "Has attachment" + LABEL_ADV_HAS_ATTACHMENTS: "Has attachments" + LABEL_ADV_FLAGGED: "Flagged" + LABEL_ADV_UNSEEN: "Unseen" + LABEL_ADV_DATE: "Date" + LABEL_ADV_DATE_ALL: "All" + LABEL_ADV_DATE_3_DAYS: "Up to 3 days old" + LABEL_ADV_DATE_7_DAYS: "Up to 1 week old" + LABEL_ADV_DATE_MONTH: "Up to 1 month old" + LABEL_ADV_DATE_3_MONTHS: "Up to 3 months old" + LABEL_ADV_DATE_6_MONTHS: "Up to 6 months old" + LABEL_ADV_DATE_YEAR: "Up to 1 year old" + BUTTON_ADV_SEARCH: "Search" + PREVIEW_POPUP: + FULLSCREEN: "Toggle fullscreen" + ZOOM: "Zoom in/out" + CLOSE: "Close (Esc)" + LOADING: "Loading..." + GALLERY_PREV: "Previous (arrow left)" + GALLERY_NEXT: "Next (arrow right)" + GALLERY_COUNTER: "%curr% of %total%" + IMAGE_ERROR: "The image could not be loaded." + AJAX_ERROR: "The content could not be loaded." + FOLDER_LIST: + BUTTON_COMPOSE: "Compose" + BUTTON_CONTACTS: "Contacts" + BUTTON_NEW_MESSAGE: "New message" + INBOX_NAME: "Inbox" + SENT_NAME: "Sent" + DRAFTS_NAME: "Drafts" + SPAM_NAME: "Spam" + TRASH_NAME: "Trash" + ARCHIVE_NAME: "Archive" + QUOTA: + TITLE: "Quota usage" + MESSAGE_LIST: + BUTTON_RELOAD: "Reload Message List" + BUTTON_MOVE_TO: "Move To" + BUTTON_DELETE: "Delete" + BUTTON_ARCHIVE: "Archive" + BUTTON_SPAM: "Spam" + BUTTON_NOT_SPAM: "Not Spam" + BUTTON_EMPTY_FOLDER: "Clear Folder" + BUTTON_MULTY_FORWARD: "Forward as attachment(s)" + BUTTON_DELETE_WITHOUT_MOVE: "Delete permanently" + BUTTON_MORE: "More" + MENU_SET_SEEN: "Mark as read" + MENU_SET_ALL_SEEN: "Mark all as read" + MENU_UNSET_SEEN: "Mark as unread" + MENU_SET_FLAG: "Flag" + MENU_UNSET_FLAG: "Unflag" + MENU_SELECT_ALL: "All" + MENU_SELECT_NONE: "None" + MENU_SELECT_INVERT: "Invert" + MENU_SELECT_UNSEEN: "Unread" + MENU_SELECT_SEEN: "Read" + MENU_SELECT_FLAGGED: "Flagged" + MENU_SELECT_UNFLAGGED: "Unflagged" + EMPTY_LIST: "Empty list." + EMPTY_SEARCH_LIST: "No messages matched your search." + SEARCH_RESULT_FOR: "Search results for \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "back to message list" + LIST_LOADING: "Loading" + EMPTY_SUBJECT_TEXT: "(No subject)" + PUT_MESSAGE_HERE: "Drop message here to view it in the list" + TODAY_AT: "today at %TIME%" + YESTERDAY_AT: "yesterday at %TIME%" + SEARCH_PLACEHOLDER: "Search" + NEW_MESSAGE_NOTIFICATION: "You have %COUNT% new messages!" + QUOTA_SIZE: "Using %SIZE% (%PROC%%) of your %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Edit" + BUTTON_BACK: "Back" + BUTTON_CLOSE: "Close" + BUTTON_DELETE: "Delete" + BUTTON_UNSUBSCRIBE: "Unsubscribe from this list" + BUTTON_ARCHIVE: "Archive" + BUTTON_SPAM: "Spam" + BUTTON_NOT_SPAM: "Not Spam" + BUTTON_MOVE_TO: "Move To" + BUTTON_MORE: "More" + BUTTON_REPLY: "Reply" + BUTTON_REPLY_ALL: "Reply All" + BUTTON_FORWARD: "Forward" + BUTTON_FORWARD_AS_ATTACHMENT: "Forward as attachment" + BUTTON_EDIT_AS_NEW: "Edit as New" + BUTTON_SHOW_IMAGES: "Display external images" + BUTTON_NOTIFY_READ_RECEIPT: "The sender has asked to be notified when you read this message." + BUTTON_IN_NEW_WINDOW: "View in separate window" + BUTTON_THREAD_LIST: "Thread list" + BUTTON_THREAD_PREV: "Previous" + BUTTON_THREAD_NEXT: "Next" + BUTTON_THREAD_MORE: "More messages" + MENU_HEADERS: "Show message headers" + MENU_VIEW_ORIGINAL: "Show Source" + MENU_DOWNLOAD_ORIGINAL: "Download as .eml file" + MENU_FILTER_SIMILAR: "Filter messages like this" + MENU_PRINT: "Print" + EMPTY_SUBJECT_TEXT: "(No subject)" + LABEL_SUBJECT: "Subject" + LABEL_DATE: "Date" + LABEL_FROM: "From" + LABEL_FROM_SHORT: "from" + LABEL_TO: "To" + LABEL_TO_SHORT: "to" + LABEL_CC: "CC" + LABEL_BCC: "BCC" + LABEL_REPLY_TO: "Reply-To" + PRINT_LABEL_FROM: "From" + PRINT_LABEL_TO: "To" + PRINT_LABEL_CC: "CC" + PRINT_LABEL_BCC: "BCC" + PRINT_LABEL_REPLY_TO: "Reply-To" + PRINT_LABEL_DATE: "Date" + PRINT_LABEL_SUBJECT: "Subject" + PRINT_LABEL_ATTACHMENTS: "Attachments" + MESSAGE_LOADING: "Loading" + MESSAGE_VIEW_DESC: "Select any message in the list to view it here." + MESSAGE_VIEW_MOVE_DESC: "Click folder name in the left panel to select the destination." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" + LINK_DOWNLOAD_AS_ZIP: "Download as zip" + LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" + LINK_SAVE_TO_CLOUD: "Save to Cloud" + LINK_SAVE_TO_DROPBOX: "Save to Dropbox" + READ_RECEIPT: + SUBJECT: "Return Receipt (displayed) - %SUBJECT%" + BODY: | + This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. + + Note: "This Return Receipt only acknowledges that the message was displayed on the recipient's computer." + There is no guarantee that the recipient has read or understood the message contents. + SUGGESTIONS: + SEARCHING_DESC: "Searching..." + CONTACTS: + LEGEND_CONTACTS: "Contacts" + SEARCH_INPUT_PLACEHOLDER: "Search" + BUTTON_ADD_CONTACT: "Add Contact" + BUTTON_CREATE_CONTACT: "Create" + BUTTON_UPDATE_CONTACT: "Update" + BUTTON_IMPORT: "Import (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" + BUTTON_EXPORT_CSV: "Export (csv)" + ERROR_IMPORT_FILE: "Import error (invalid file format)" + LIST_LOADING: "Loading" + EMPTY_LIST: "No contacts here" + EMPTY_SEARCH: "No contacts found" + CLEAR_SEARCH: "Clear search" + CONTACT_VIEW_DESC: "Select contact in the list to view it here." + LABEL_DISPLAY_NAME: "Display name" + LABEL_EMAIL: "Email" + LABEL_PHONE: "Phone" + LABEL_WEB: "Web" + LABEL_BIRTHDAY: "Birthday" + LINK_ADD_EMAIL: "Add an email address" + LINK_ADD_PHONE: "Add a phone" + LINK_BIRTHDAY: "Birthday" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Enter display name" + PLACEHOLDER_ENTER_LAST_NAME: "Enter last name" + PLACEHOLDER_ENTER_FIRST_NAME: "Enter first name" + PLACEHOLDER_ENTER_NICK_NAME: "Enter nickname" + LABEL_READ_ONLY: "Read only" + LABEL_SHARE: "Share" + ADD_MENU_LABEL: "Add" + ADD_MENU_NICKNAME: "Nickname" + ADD_MENU_NOTES: "Notes" + ADD_MENU_EMAIL: "Email" + ADD_MENU_PHONE: "Phone" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Address" + ADD_MENU_BIRTHDAY: "Birthday" + ADD_MENU_TAGS: "Tags" + BUTTON_SHARE_NONE: "None" + BUTTON_SHARE_ALL: "Everyone" + BUTTON_SYNC: "Synchronization (CardDAV)" + COMPOSE: + TITLE_FROM: "From" + TITLE_TO: "To" + TITLE_CC: "CC" + TITLE_BCC: "BCC" + TITLE_REPLY_TO: "Reply-To" + TITLE_SUBJECT: "Subject" + LINK_SHOW_INPUTS: "show all fields" + BUTTON_SEND: "Send" + BUTTON_SAVE: "Save" + BUTTON_DELETE: "Delete" + BUTTON_CANCEL: "Cancel" + BUTTON_MINIMIZE: "Minimize" + SAVED_TIME: "Saved at %TIME%" + SAVED_ERROR_ON_SEND: "Message was sent but not saved to sent items folder" + DISCARD_UNSAVED_DATA: "Discard unsaved data?" + ATTACH_FILES: "Attach files" + ATTACH_DROP_FILES_DESC: "Drop files here" + ATTACH_ITEM_CANCEL: "Cancel" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" + FORWARD_MESSAGE_TOP_TITLE: "-------- Forwarded message -------" + FORWARD_MESSAGE_TOP_FROM: "From" + FORWARD_MESSAGE_TOP_TO: "To" + FORWARD_MESSAGE_TOP_CC: "CC" + FORWARD_MESSAGE_TOP_SENT: "Sent" + FORWARD_MESSAGE_TOP_SUBJECT: "Subject" + EMPTY_TO_ERROR_DESC: "Please specify at least one recipient" + NO_ATTACHMENTS_HERE_DESC: "No attachments here." + ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet." + BUTTON_REQUEST_READ_RECEIPT: "Request a read receipt" + BUTTON_MARK_AS_IMPORTANT: "Mark as important" + BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" + BUTTON_REQUEST_DSN: "Request a delivery receipt" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Close" + POPUPS_ASK: + BUTTON_YES: "Yes" + BUTTON_NO: "No" + DESC_WANT_CLOSE_THIS_WINDOW: "Are you sure you want to close this window?" + DESC_WANT_DELETE_MESSAGES: "Are you sure you want to delete the message(s)?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Choose your language" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Add Account?" + BUTTON_ADD_ACCOUNT: "Add" + TITLE_UPDATE_ACCOUNT: "Update Account?" + BUTTON_UPDATE_ACCOUNT: "Update" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Add Identity?" + TITLE_UPDATE_IDENTITY: "Update Identity?" + BUTTON_ADD_IDENTITY: "Add" + BUTTON_UPDATE_IDENTITY: "Update" + LABEL_EMAIL: "Email" + LABEL_NAME: "Name" + LABEL_REPLY_TO: "Reply-To" + LABEL_SIGNATURE: "Signature" + LABEL_CC: "Cc" + LABEL_BCC: "Bcc" + LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Create a folder?" + LABEL_NAME: "Folder name" + LABEL_PARENT: "Parent folder" + BUTTON_CREATE: "Create" + BUTTON_CANCEL: "Cancel" + BUTTON_CLOSE: "Close" + TITLE_CREATING_PROCESS: "Creating a folder" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Purge all messages from the folder?" + BUTTON_CLEAR: "Clear" + BUTTON_CANCEL: "Cancel" + BUTTON_CLOSE: "Close" + DANGER_DESC_WARNING: "Warning!" + DANGER_DESC_HTML_1: "This action will result in removing all mails from %FOLDER% folder completely." + DANGER_DESC_HTML_2: "Once started, the process cannot be aborted or cancelled." + TITLE_CLEARING_PROCESS: "Purging the folder..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Import OpenPGP key" + BUTTON_IMPORT_OPEN_PGP_KEY: "Import" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "View OpenPGP key" + BUTTON_SELECT: "Select" + BUTTON_CLOSE: "Close" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP keys" + LABEL_EMAIL: "Email" + LABEL_NAME: "Name" + LABEL_PASSWORD: "Password" + LABEL_KEY_BIT_LENGTH: "Key length" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" + LABEL_SIGN: "Sign" + LABEL_ENCRYPT: "Encrypt" + LABEL_PASSWORD: "Password" + BUTTON_SIGN: "Sign" + BUTTON_ENCRYPT: "Encrypt" + BUTTON_SIGN_AND_ENCRYPT: "Sign and encrypt" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" + LABEL_KEY: "Private Key" + LABEL_PASSWORD: "Password" + BUTTON_DECRYPT: "Decrypt" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "2-Step verification test" + LABEL_CODE: "Code" + BUTTON_TEST: "Test" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Create a filter?" + TITLE_EDIT_FILTER: "Update filter?" + FILTER_NAME: "Name" + LEGEND_CONDITIONS: "Conditions" + LEGEND_ACTIONS: "Actions" + BUTTON_DONE: "Done" + BUTTON_ADD_CONDITION: "Add a Condition" + SELECT_ACTION_NONE: "None" + SELECT_ACTION_MOVE_TO: "Move to" + SELECT_ACTION_FORWARD_TO: "Forward to" + SELECT_ACTION_REJECT: "Reject" + SELECT_ACTION_VACATION_MESSAGE: "Vacation message" + SELECT_ACTION_DISCARD: "Discard" + SELECT_FIELD_FROM: "From" + SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" + SELECT_FIELD_SUBJECT: "Subject" + SELECT_FIELD_HEADER: "Header" + SELECT_FIELD_SIZE: "Size" + SELECT_TYPE_CONTAINS: "Contains" + SELECT_TYPE_NOT_CONTAINS: "Not Contains" + SELECT_TYPE_MATCHES: "Matches (* and ? supported)" + SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" + SELECT_TYPE_REGEXP: "Regexp" + SELECT_TYPE_NOT_REGEXP: "Not Regexp" + SELECT_TYPE_EQUAL_TO: "Equal To" + SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" + SELECT_TYPE_OVER: "Over" + SELECT_TYPE_UNDER: "Under" + SELECT_MATCH_ANY: "Matching ANY of the following rules" + SELECT_MATCH_ALL: "Matching ALL of the following rules" + MARK_AS_READ_LABEL: "Mark as read" + REPLY_INTERVAL_LABEL: "Reply interval (days)" + KEEP_LABEL: "Keep" + STOP_LABEL: "Don't stop processing rules" + EMAIL_LABEL: "Email" + VACATION_SUBJECT_LABEL: "Subject (optional)" + VACATION_MESSAGE_LABEL: "Message" + VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" + REJECT_MESSAGE_LABEL: "Reject message" + ALL_INCOMING_MESSAGES_DESC: "All incoming messages" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Select system folders" + SELECT_CHOOSE_ONE: "Choose one" + SELECT_UNUSE_NAME: "Do not use" + LABEL_SENT: "Sent" + LABEL_DRAFTS: "Drafts" + LABEL_SPAM: "Spam" + LABEL_TRASH: "Trash" + LABEL_ARCHIVE: "Archive" + BUTTON_CANCEL: "Cancel" + BUTTON_CLOSE: "Close" + NOTIFICATION_SENT: | + You haven't selected "Sent" system folder messages are put to after sending. + If you don't want to save sent message, please select "Do not use" option. + NOTIFICATION_DRAFTS: "You haven't selected \"Drafts\" system folder messages are saved to while composing." + NOTIFICATION_SPAM: | + You haven't selected "Spam" system folder spamed messages are placed to. + If you wish to remove messages permanently, please select "Do not use" option. + NOTIFICATION_TRASH: | + You haven't selected "Trash" system folder deleted messages are placed to. + If you wish to remove messages permanently, please select "Do not use" option. + NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "2-Step Verification (TOTP)" + LABEL_ENABLE_TWO_FACTOR: "Enable 2-Step verification" + LABEL_TWO_FACTOR_USER: "User" + LABEL_TWO_FACTOR_STATUS: "Status" + LABEL_TWO_FACTOR_SECRET: "Secret" + LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" + BUTTON_CREATE: "Create a secret" + BUTTON_ACTIVATE: "Activate" + BUTTON_CLEAR: "Clear" + BUTTON_LOGOUT: "Logout" + BUTTON_DONE: "Done" + BUTTON_TEST: "Test" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Show Secret" + BUTTON_HIDE_SECRET: "Hide Secret" + TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" + TWO_FACTOR_SECRET_DESC: > + Import this info into your Google Authenticator client (or other TOTP client) + using the provided QR code below or by entering the code manually. + TWO_FACTOR_BACKUP_CODES_DESC: > + If you can't receive codes via Google Authenticator (or other TOTP client), + you can use backup codes to sign in. After you’ve used a backup code to sign + in, it will become inactive. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." + TITLES: + LOADING: "Loading" + LOGIN: "Login" + MAILBOX: "MailBox" + SETTINGS: "Settings" + COMPOSE: "Compose" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "File is too big" + ERROR_FILE_PARTIALLY_UPLOADED: "File was partially uploaded due to unknown error" + ERROR_NO_FILE_UPLOADED: "No file uploaded" + ERROR_MISSING_TEMP_FOLDER: "The temporary file is missing" + ERROR_ON_SAVING_FILE: "An unknown file upload error occurred" + ERROR_FILE_TYPE: "Invalid file type" + ERROR_UNKNOWN: "An unknown file upload error occurred" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" + TEXT_SWITCHER_RICH_FORMATTING: "Rich formatting" + TEXT_SWITCHER_CONFIRM: "Text formatting and images will be lost. Are you sure you want to continue?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Personal" + LABEL_GENERAL_NAME: "General" + LABEL_CONTACTS_NAME: "Contacts" + LABEL_FOLDERS_NAME: "Folders" + LABEL_ACCOUNTS_NAME: "Accounts" + LABEL_IDENTITY_NAME: "Identity" + LABEL_IDENTITIES_NAME: "Identities" + LABEL_FILTERS_NAME: "Filters" + LABEL_TEMPLATES_NAME: "Templates" + LABEL_SECURITY_NAME: "Security" + LABEL_SOCIAL_NAME: "Social" + LABEL_THEMES_NAME: "Themes" + LABEL_CHANGE_PASSWORD_NAME: "Password" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Back" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filters" + BUTTON_SAVE: "Save" + BUTTON_ADD_FILTER: "Add a Filter" + BUTTON_DELETE: "Delete" + BUTTON_RAW_SCRIPT: "Use Custom User Script" + SUBNAME_NONE: "None" + SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" + SUBNAME_REJECT: "Reject" + SUBNAME_VACATION_MESSAGE: "Vacation message" + SUBNAME_DISCARD: "Discard" + CAPABILITY_LABEL: "Capability" + LOADING_PROCESS: "Updating filter list" + DELETING_ASK: "Are you sure?" + CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identity" + LABEL_DISPLAY_NAME: "Name" + LABEL_REPLY_TO: "Reply-To" + LABEL_SIGNATURE: "Signature" + LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Security" + LABEL_CONFIGURE_TWO_FACTOR: "Configure 2-Step verification" + LABEL_AUTOLOGOUT: "Auto Logout" + AUTOLOGIN_NEVER_OPTION_NAME: "Never" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hour(s)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "General" + LABEL_LANGUAGE: "Language" + LABEL_IDENTITY: "Identity" + LABEL_LAYOUT: "Layout" + LABEL_LAYOUT_NO_SPLIT: "No Split" + LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" + LABEL_EDITOR: "Default text editor" + LABEL_EDITOR_HTML: "Html" + LABEL_EDITOR_PLAIN: "Plain" + LABEL_EDITOR_HTML_FORCED: "Html (forced)" + LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" + LABEL_ANIMATION: "Interface animation" + LABEL_ANIMATION_FULL: "Full" + LABEL_ANIMATION_NORMAL: "Normal" + LABEL_ANIMATION_NONE: "None" + LABEL_VIEW_OPTIONS: "View options" + LABEL_USE_PREVIEW_PANE: "Use preview pane" + LABEL_USE_CHECKBOXES_IN_LIST: "Display checkboxes in list" + LABEL_USE_THREADS: "Use threads" + LABEL_REPLY_SAME_FOLDER: "Place replies in the folder of the message being replied to" + LABEL_SHOW_IMAGES: "Always display external images in message body" + LABEL_SHOW_ANIMATION: "Show animation" + LABEL_MESSAGE_PER_PAGE: "Messages on page" + LABEL_NOTIFICATIONS: "Notifications" + LABEL_SOUND_NOTIFICATION: "Sound notification" + LABEL_CHROME_NOTIFICATION_DESC: "Show new messages notification popups" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Blocked by the browser)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Contacts" + LABEL_CONTACTS_AUTOSAVE: "Automatically add recipients to your address book" + LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" + LABEL_CONTACTS_SYNC_SERVER: "Server" + LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" + LABEL_CONTACTS_SYNC_USER: "User" + LABEL_CONTACTS_SYNC_PASSWORD: "Password" + SETTINGS_THEMES: + LEGEND_THEMES: "Themes" + LEGEND_THEMES_CUSTOM: "Custom Theme Configuration" + LABEL_CUSTOM_TYPE: "Type" + LABEL_CUSTOM_TYPE_LIGHT: "Light" + LABEL_CUSTOM_TYPE_DARK: "Dark" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Background" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Upload background image (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "File is too big" + ERROR_FILE_TYPE_ERROR: "Invalid file type (JPG and PNG only)" + ERROR_UNKNOWN: "An unknown file upload error occurred" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Connect Google" + BUTTON_GOOGLE_DISCONNECT: "Disconnect Google" + MAIN_GOOGLE_DESC: "After enabling login via Google, you can log into this account using Google button on the login screen." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Connect Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Disconnect Facebook" + MAIN_FACEBOOK_DESC: "After enabling login via Facebook, you can log into this account using Facebook button on the login screen." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Connect Twitter" + BUTTON_TWITTER_DISCONNECT: "Disconnect Twitter" + MAIN_TWITTER_DESC: "After enabling login via Twitter, you can log into this account using Twitter button on the login screen." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Folder List" + BUTTON_CREATE: "Create Folder" + BUTTON_SYSTEM: "System Folders" + BUTTON_DELETE: "Delete" + BUTTON_SUBSCRIBE: "Subscribe" + BUTTON_UNSUBSCRIBE: "Unsubscribe" + LOADING_PROCESS: "Updating folder list" + CREATING_PROCESS: "Creating a folder" + DELETING_PROCESS: "Deleting a folder" + RENAMING_PROCESS: "Renaming a folder" + DELETING_ASK: "Are you sure?" + TO_MANY_FOLDERS_DESC_1: "You have too many folders!" + TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." + HELP_DELETE_FOLDER: "Delete folder" + HELP_SHOW_HIDE_FOLDER: "Show/hide folder" + HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Accounts" + LEGEND_IDENTITIES: "Identities" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" + BUTTON_ADD_ACCOUNT: "Add an Account" + BUTTON_ADD_IDENTITY: "Add an Identity" + BUTTON_DELETE: "Delete" + LOADING_PROCESS: "Updating..." + DELETING_ASK: "Are you sure?" + DEFAULT_IDENTITY_LABEL: "default" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identity" + LEGEND_IDENTITIES: "Additional Identities" + LABEL_DEFAULT: "Default" + LABEL_DISPLAY_NAME: "Name" + LABEL_REPLY_TO: "Reply-To" + LABEL_SIGNATURE: "Signature" + LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" + BUTTON_ADD_IDENTITY: "Add Identity" + BUTTON_DELETE: "Delete" + LOADING_PROCESS: "Updating identity list" + DELETING_ASK: "Are you sure?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Change Password" + LABEL_CURRENT_PASSWORD: "Current password" + LABEL_NEW_PASSWORD: "New password" + LABEL_REPEAT_PASSWORD: "Confirm New Password" + BUTTON_UPDATE_PASSWORD: "Set New Password" + ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" + TITLE_PRIVATE: "Private" + TITLE_PUBLIC: "Public" + DELETING_ASK: "Are you sure?" + GENERATE_ONLY_HTTPS: "HTTPS only" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Automatically save draft" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" + TAB_MAILBOX: "Mailbox" + TAB_MESSAGE_LIST: "Message list" + TAB_MESSAGE_VIEW: "Message view" + TAB_COMPOSE: "Compose" + LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" + LABEL_REPLY: "Reply" + LABEL_REPLY_ALL: "Reply All" + LABEL_FORWARD: "Forward" + LABEL_FORWARD_MULTIPLY: "Forward as attachment(s)" + LABEL_HELP: "Help" + LABEL_CHECK_ALL: "Select all messages" + LABEL_ARCHIVE: "Archive" + LABEL_DELETE: "Delete" + LABEL_OPEN_THREAD: "Open selected thread" + LABEL_MOVE: "Move" + LABEL_READ: "Read selected messages" + LABEL_UNREAD: "Unread selected messages" + LABEL_IMPORTANT: "Important, flag selected messages" + LABEL_SEARCH: "Search" + LABEL_CANCEL_SEARCH: "Cancel search" + LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" + LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" + LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" + LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" + LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" + LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" + LABEL_THREAD_NEXT: "Next message in thread" + LABEL_THREAD_PREV: "Previous message in thread" + LABEL_PRINT: "Print" + LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" + LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" + LABEL_SWITCH_TO_LIST: "Switch focus back to message list" + LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" + LABEL_SAVE_MESSAGE: "Save message" + LABEL_SEND_MESSAGE: "Send message" + LABEL_CLOSE_COMPOSE: "Close compose" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "No public keys found" + NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" + NO_PRIVATE_KEY_FOUND: "No private key found" + NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" + ADD_A_PUBLICK_KEY: "Add a public key" + SELECT_A_PRIVATE_KEY: "Select a private key" + UNVERIFIRED_SIGNATURE: "Unverified signature" + DECRYPTION_ERROR: "OpenPGP decryption error" + GOOD_SIGNATURE: "Good signature from %USER%" + PGP_ERROR: "OpenPGP error: %ERROR%" + SPECIFY_FROM_EMAIL: "Please specify FROM email address" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" + NOTIFICATIONS: + INVALID_TOKEN: "Invalid token" + AUTH_ERROR: "Authentication failed" + ACCESS_ERROR: "Access error" + CONNECTION_ERROR: "Can't connect to server" + CAPTCHA_ERROR: "Incorrect CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + DOMAIN_NOT_ALLOWED: "Domain is not allowed" + ACCOUNT_NOT_ALLOWED: "Account is not allowed" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" + COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" + CURRENT_PASSWORD_INCORRECT: "Current password incorrect" + NEW_PASSWORD_SHORT: "Password is too short" + NEW_PASSWORD_WEAK: "Password is too easy" + NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" + CONTACTS_SYNC_ERROR: "Contacts synchronization error" + CANT_GET_MESSAGE_LIST: "Can't get message list" + CANT_GET_MESSAGE: "Can't get message" + CANT_DELETE_MESSAGE: "Can't delete message" + CANT_MOVE_MESSAGE: "Can't move message" + CANT_SAVE_MESSAGE: "Can't save message" + CANT_SEND_MESSAGE: "Can't send message" + INVALID_RECIPIENTS: "Invalid recipients" + CANT_SAVE_FILTERS: "Can't save filters" + CANT_GET_FILTERS: "Can't get filters" + FILTERS_ARE_NOT_CORRECT: "Filters are not correct" + CANT_CREATE_FOLDER: "Can't create folder" + CANT_RENAME_FOLDER: "Can't rename folder" + CANT_DELETE_FOLDER: "Can't delete folder" + CANT_DELETE_NON_EMPTY_FOLDER: "Can't delete non-empty directory" + CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" + CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" + CANT_SAVE_SETTINGS: "Can't save settings" + CANT_SAVE_PLUGIN_SETTINGS: "Can't save settings" + DOMAIN_ALREADY_EXISTS: "Domain already exists" + CANT_INSTALL_PACKAGE: "Failed to install package" + CANT_DELETE_PACKAGE: "Failed to remove package" + INVALID_PLUGIN_PACKAGE: "Invalid plugin package" + UNSUPPORTED_PLUGIN_PACKAGE: "Unsupported plugin package" + LICENSING_SERVER_IS_UNAVAILABLE: "Subscription server is unvailable" + LICENSING_DOMAIN_EXPIRED: "Subscription for this domain has expired." + LICENSING_DOMAIN_BANNED: "Subscription for this domain is banned." + DEMO_SEND_MESSAGE_ERROR: "For security purposes, this account is not allowed to send messages to external e-mail addresses!" + DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" + ACCOUNT_ALREADY_EXISTS: "Account already exists" + ACCOUNT_DOES_NOT_EXIST: "Account doesn't exist" + MAIL_SERVER_ERROR: "An error has occured while accessing mail server" + INVALID_INPUT_ARGUMENT: "Invalid input argument" + UNKNOWN_ERROR: "Unknown error" + STATIC: + BACK_LINK: "Reload" + DOMAIN_LIST_DESC: "List of domains webmail is allowed to access." + PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" + PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" + NO_SCRIPT_TITLE: "JavaScript is required for this application." + NO_SCRIPT_DESC: | + JavaScript support is not available in your browser. + Please enable JavaScript support in your browser settings and retry. + NO_COOKIE_TITLE: "Cookies support is required for this application." + NO_COOKIE_DESC: | + Cookies support is not available in your browser. + Please enable Cookie support in your browser settings and retry. + BAD_BROWSER_TITLE: "Your browser is outdated." + BAD_BROWSER_DESC: | + To use all the features of the application, + download and install one of these browsers: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ar_SA.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ar_SA.yml new file mode 100755 index 00000000..9741c660 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ar_SA.yml @@ -0,0 +1,695 @@ +ar_SA: + LOGIN: + LABEL_EMAIL: "إيميل" + LABEL_LOGIN: "تسيجيل الدخول" + LABEL_PASSWORD: "كلمة السر" + LABEL_SIGN_ME: "تذكرني" + LABEL_VERIFICATION_CODE: "كود التحقق" + LABEL_DONT_ASK_VERIFICATION_CODE: "لاتسألني عن الكود الا بعد مرور اسبوعين" + BUTTON_SIGN_IN: "الدخول" + TITLE_SIGN_IN_GOOGLE: "Google+ الدخول باستخدام" + TITLE_SIGN_IN_FACEBOOK: "Facebook الدخول باستخدام" + TITLE_SIGN_IN_TWITTER: "Twitter الدخول باستخدام" + LABEL_FORGOT_PASSWORD: "نسيت كلمة السر" + LABEL_REGISTRATION: "التسجيل" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "ضفّ حساب" + BUTTON_SETTINGS: "الإعدادات" + BUTTON_HELP: "المساعدة" + BUTTON_LOGOUT: "تسجيل الخروج" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "بحث" + TITLE_ADV: "البحث المطور" + LABEL_ADV_FROM: "من" + LABEL_ADV_TO: "الى" + LABEL_ADV_SUBJECT: "الموضوع" + LABEL_ADV_TEXT: "النص" + LABEL_ADV_HAS_ATTACHMENT: "يحتوي على مرفق" + LABEL_ADV_HAS_ATTACHMENTS: "يحتوي مرفقات" + LABEL_ADV_FLAGGED: "عليه علم" + LABEL_ADV_UNSEEN: "لم يقرأ" + LABEL_ADV_DATE: "التاريخ" + LABEL_ADV_DATE_ALL: "الكل" + LABEL_ADV_DATE_3_DAYS: "منذ 3 أيام" + LABEL_ADV_DATE_7_DAYS: "منذ أسبوع" + LABEL_ADV_DATE_MONTH: "منذ شهر" + LABEL_ADV_DATE_3_MONTHS: "منذ 3 أشهر" + LABEL_ADV_DATE_6_MONTHS: "منذ 6 أشهر" + LABEL_ADV_DATE_YEAR: "منذ سنة" + BUTTON_ADV_SEARCH: "إبحث" + PREVIEW_POPUP: + FULLSCREEN: "إعداد افتراضي لوضع ملء الشاشة" + ZOOM: "Zoom in/out" + CLOSE: "أغلق (Esc)" + LOADING: "..جاري التحميل" + GALLERY_PREV: "السابق( السهم اليسار)" + GALLERY_NEXT: "اليمين(السهم اليميني)" + GALLERY_COUNTER: "%curr% of %total%" + IMAGE_ERROR: "الصورة لم نتمكن من عرض." + AJAX_ERROR: "المحتوى لم نتمكن من عرض." + FOLDER_LIST: + BUTTON_COMPOSE: "إنشاء" + BUTTON_CONTACTS: "جهات الإتصال" + INBOX_NAME: "البريد الوارد" + SENT_NAME: "البريد المرسل" + DRAFTS_NAME: "المسودات" + SPAM_NAME: "الرسائل غير المرغوب فيها" + TRASH_NAME: "المهملات" + ARCHIVE_NAME: "الأرشيف" + QUOTA: + TITLE: "Quota usage" + MESSAGE_LIST: + BUTTON_RELOAD: "أعد تحميل قائمة الرسائل" + BUTTON_MOVE_TO: "..انقل الى" + BUTTON_DELETE: "حذف" + BUTTON_ARCHIVE: "وضع في الأرشيف" + BUTTON_SPAM: "الإبلاغ عن الرسائل غير المرغوب فيها" + BUTTON_NOT_SPAM: "ليست رسائل غير مرغوب فيها" + BUTTON_EMPTY_FOLDER: "افرغ محتويات المجلد" + BUTTON_MULTY_FORWARD: "إعادة توجيه كملحقات" + BUTTON_DELETE_WITHOUT_MOVE: "الحذف نهائياً" + BUTTON_MORE: "المزيد" + MENU_SET_SEEN: "تعليمها بـ مقروءة" + MENU_SET_ALL_SEEN: "تعليم جميع الرسائل كـ مقروءة" + MENU_UNSET_SEEN: "تعليمها بـ غير مقروءة" + MENU_SET_FLAG: "مهمة" + MENU_UNSET_FLAG: "إزالة الأهمية" + MENU_SELECT_ALL: "الكل" + MENU_SELECT_NONE: "بدون" + MENU_SELECT_INVERT: "Invert" + MENU_SELECT_UNSEEN: "غير مقروء" + MENU_SELECT_SEEN: "مقروء" + MENU_SELECT_FLAGGED: "محدد كـ مهم" + MENU_SELECT_UNFLAGGED: "إزالة الأهمية" + EMPTY_LIST: "إفراغ القائمة" + EMPTY_SEARCH_LIST: "ليست هناك أية رسائل تطابق بحثك." + SEARCH_RESULT_FOR: "نتيجة البحث لـ \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "العودة الى قائمة الرسائل" + LIST_LOADING: "..جاري التحميل" + EMPTY_SUBJECT_TEXT: "(لايوجدموضوع)" + PUT_MESSAGE_HERE: "حرك الرسالة الى هنا.. لكي تراها في قائمة الرسائل" + TODAY_AT: "اليوم عند %TIME%" + YESTERDAY_AT: "البارحة عند %TIME%" + SEARCH_PLACEHOLDER: "البحث" + NEW_MESSAGE_NOTIFICATION: "يوجد لديك %COUNT% رسالة جديدة!" + QUOTA_SIZE: "Using %SIZE% (%PROC%%) of your %LIMIT%" + MESSAGE: + BUTTON_EDIT: "تعديل" + BUTTON_BACK: "العودة" + BUTTON_CLOSE: "إغلاق" + BUTTON_DELETE: "حذف" + BUTTON_ARCHIVE: "أرشيف" + BUTTON_SPAM: "رسالة غير مرغوبة" + BUTTON_NOT_SPAM: "ليست رسالة غير مرغوبة" + BUTTON_MOVE_TO: "انقل الى" + BUTTON_MORE: "المزيد" + BUTTON_REPLY: "الرد" + BUTTON_REPLY_ALL: "الرد على الجميع" + BUTTON_FORWARD: "إعادة توجيه" + BUTTON_FORWARD_AS_ATTACHMENT: "إعادة توجيه كملحقات" + BUTTON_EDIT_AS_NEW: "التعديل كـ جديد" + BUTTON_SHOW_IMAGES: "عرض الصور الخارجية" + BUTTON_NOTIFY_READ_RECEIPT: "لقد طلب المرسل أن يتم إعلامه في حال قراءة الرسالة" + BUTTON_IN_NEW_WINDOW: "العرض في نافذة منفصلة" + BUTTON_THREAD_LIST: "قائمة المواضيع" + BUTTON_THREAD_PREV: "السابق" + BUTTON_THREAD_NEXT: "التالي" + BUTTON_THREAD_MORE: "المزيد من الرسائل" + MENU_HEADERS: "Show message headers" + MENU_VIEW_ORIGINAL: "إظهار المصدر" + MENU_DOWNLOAD_ORIGINAL: ".eml التنزيل كملف" + MENU_FILTER_SIMILAR: "تصفية رسائل مثل هذه" + MENU_PRINT: "طباعة" + EMPTY_SUBJECT_TEXT: "(لايوجد موضوع)" + LABEL_SUBJECT: "الموضوع" + LABEL_DATE: "التاريخ" + LABEL_FROM: "من" + LABEL_FROM_SHORT: "من" + LABEL_TO: "الى" + LABEL_TO_SHORT: "الى" + LABEL_CC: "نسخة الى" + LABEL_BCC: "نسخة مخفية الوجهة" + LABEL_REPLY_TO: "الرد-الى" + PRINT_LABEL_FROM: "من" + PRINT_LABEL_TO: "الى" + PRINT_LABEL_CC: "نسخة الى" + PRINT_LABEL_BCC: "نسخة مخفية الوجهة" + PRINT_LABEL_REPLY_TO: "الرد-الى" + PRINT_LABEL_DATE: "التاريخ" + PRINT_LABEL_SUBJECT: "الموضوع" + PRINT_LABEL_ATTACHMENTS: "الملحقات" + MESSAGE_LOADING: "..جاري التحميل" + MESSAGE_VIEW_DESC: "حدد رسالة من القائمة ليتم عرضها هنا" + PGP_PASSWORD_INPUT_PLACEHOLDER: "كلمة السر" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" + LINK_DOWNLOAD_AS_ZIP: "zip تنزيل كـ" + LINK_SAVE_TO_OWNCLOUD: "ownCloud الحفظ الى" + LINK_SAVE_TO_DROPBOX: "Dropbox الحفظ الى" + READ_RECEIPT: + SUBJECT: "إعلام بالقراءة (تم عرضها) - %SUBJECT%" + BODY: |- + هذا إعلام بأن الرسالة المرسلة قد تمت قرائتها %READ-RECEIPT%. + SUGGESTIONS: + SEARCHING_DESC: "يتم البحث..." + CONTACTS: + LEGEND_CONTACTS: "جهات الإتصال" + SEARCH_INPUT_PLACEHOLDER: "بحث" + BUTTON_ADD_CONTACT: "إضافة جهة إتصال" + BUTTON_CREATE_CONTACT: "إنشاء" + BUTTON_UPDATE_CONTACT: "تحديث" + BUTTON_IMPORT: "إستيراد (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "تصدير كـ (vcf, vCard)" + BUTTON_EXPORT_CSV: "تصدير كـ (csv)" + ERROR_IMPORT_FILE: "خطأ في الإستيراد(نوع ملف غير صحيح)" + LIST_LOADING: "جاري التحميل" + EMPTY_LIST: "لايوجد جهات إتصال" + EMPTY_SEARCH: "لم يتم ايجاد جهة الإتصال" + CLEAR_SEARCH: "إزالة البحث" + CONTACT_VIEW_DESC: "حدد جهة إتصال من القائمة لكي يتم عرضها هنا" + LABEL_DISPLAY_NAME: "الإسم المعروض" + LABEL_EMAIL: "البريد الإلكتروني" + LABEL_PHONE: "رقم الهاتف" + LABEL_WEB: "الموقع" + LABEL_BIRTHDAY: "تاريخ الميلاد" + LINK_ADD_EMAIL: "قم باضافة البريد الالكتروني" + LINK_ADD_PHONE: "قم باضافة رقم الهاتف" + LINK_BIRTHDAY: "تاريخ الميلاد" + PLACEHOLDER_ENTER_DISPLAY_NAME: "ادخل الاسم المعروض" + PLACEHOLDER_ENTER_LAST_NAME: "ادخل اسم العائلة" + PLACEHOLDER_ENTER_FIRST_NAME: "ادخل الاسم" + PLACEHOLDER_ENTER_NICK_NAME: "ادخل اللقب" + LABEL_READ_ONLY: "قراءة فقط" + LABEL_SHARE: "مشاركة" + ADD_MENU_LABEL: "اضافة" + ADD_MENU_NICKNAME: "اللقب" + ADD_MENU_NOTES: "الملاحظات" + ADD_MENU_EMAIL: "البريد الإلكتروني" + ADD_MENU_PHONE: "الهاتف" + ADD_MENU_URL: "الرابط" + ADD_MENU_ADDRESS: "العنوان" + ADD_MENU_BIRTHDAY: "تاريخ الميلاد" + ADD_MENU_TAGS: "Tags" + BUTTON_SHARE_NONE: "لاأحد" + BUTTON_SHARE_ALL: "الجميع" + BUTTON_SYNC: "المزامنة (CardDAV)" + COMPOSE: + TITLE_FROM: "من" + TITLE_TO: "الى" + TITLE_CC: "نسخة الى" + TITLE_BCC: "نسخة مخفية الوجهة" + TITLE_REPLY_TO: "الرد-الى" + TITLE_SUBJECT: "الموضوع" + LINK_SHOW_INPUTS: "إظهار جميع الحقول" + BUTTON_SEND: "إرسال" + BUTTON_SAVE: "حفظ" + BUTTON_DELETE: "حذف" + BUTTON_CANCEL: "إلغاء" + BUTTON_MINIMIZE: "تصغير" + SAVED_TIME: "تم الحفظ عند %TIME%" + SAVED_ERROR_ON_SEND: "تم إرسال الرسالة.. ولكن لم يتم حفظها في مجلد المرسلات" + DISCARD_UNSAVED_DATA: "تجاهل البيانات الغير محفوظة؟" + ATTACH_FILES: "ارفاق الملفات" + ATTACH_DROP_FILES_DESC: "حرك الملفات الى هنا" + ATTACH_ITEM_CANCEL: "الغاء" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" + FORWARD_MESSAGE_TOP_TITLE: "-------- رسالة معاد توجيهها -------" + FORWARD_MESSAGE_TOP_FROM: "من" + FORWARD_MESSAGE_TOP_TO: "الى" + FORWARD_MESSAGE_TOP_CC: "نسخة الى" + FORWARD_MESSAGE_TOP_SENT: "تم الإرسال" + FORWARD_MESSAGE_TOP_SUBJECT: "الموضوع" + EMPTY_TO_ERROR_DESC: "رجاءً حدد مستلم واحد على الأقل." + NO_ATTACHMENTS_HERE_DESC: "لايوجد مرفقات" + ATTACHMENTS_ERROR_DESC: "تحذير! لم يتم إرفاق جميع المرفقات" + ATTACHMENTS_UPLOAD_ERROR_DESC: "لم تنتهي عملية الإرفاق بعد" + BUTTON_REQUEST_READ_RECEIPT: "اطلب اعلاماً بالقراءة" + BUTTON_MARK_AS_IMPORTANT: "تحديده كـ هام" + BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" + BUTTON_REQUEST_DSN: "اطلب اعلاماً بايصال البريد" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "إغلاق" + POPUPS_ASK: + BUTTON_YES: "نعم" + BUTTON_NO: "لا" + DESC_WANT_CLOSE_THIS_WINDOW: "هل أنت متأكد من رغبتك باغلاق هذه النافذة؟" + DESC_WANT_DELETE_MESSAGES: "هل أنت متأكد من رغبتك بحذف هذه الرسائل؟" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "حدّد لغتك" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "قم باضافة حساب؟" + BUTTON_ADD_ACCOUNT: "إضافة" + TITLE_UPDATE_ACCOUNT: "تحديث الحساب؟" + BUTTON_UPDATE_ACCOUNT: "تحديث" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "إضافة هوية؟" + TITLE_UPDATE_IDENTITY: "تحديث الهوية؟" + BUTTON_ADD_IDENTITY: "إضافة" + BUTTON_UPDATE_IDENTITY: "تحديث" + LABEL_EMAIL: "البريد الإلكتروني" + LABEL_NAME: "الإسم" + LABEL_REPLY_TO: "الرد-الى" + LABEL_SIGNATURE: "التوقيع" + LABEL_CC: "نسخة الى" + LABEL_BCC: "نسخة مخفية الوجهة" + LABEL_SIGNATURE_INSERT_BEFORE: "قم بوضع التوقيع قبل النص المأخوذ من الرسائل في عملية الرد" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "إنشاء مجلد؟" + LABEL_NAME: "إسم المجلد" + LABEL_PARENT: "المجلد الأساسي" + BUTTON_CREATE: "إنشاء" + BUTTON_CANCEL: "إلغاء" + BUTTON_CLOSE: "إغلاق" + TITLE_CREATING_PROCESS: "يتم إنشاء المجلد" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "دمج جميع الرسائل من المجلد؟" + BUTTON_CLEAR: "Clear" + BUTTON_CANCEL: "إلغاء" + BUTTON_CLOSE: "إغلاق" + DANGER_DESC_WARNING: "تحذير!" + DANGER_DESC_HTML_1: "هذا الإجراء سينجم عنه إزالة جميع محتويات المجلد %FOLDER% بشكل كامل" + DANGER_DESC_HTML_2: "في حال بدء العملية , فلا يمكن ايقافها او الغائها" + TITLE_CLEARING_PROCESS: "...يتم دمج المجلد" + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "OpenPGP استيراد مفتاح" + BUTTON_IMPORT_OPEN_PGP_KEY: "استيراد" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "عرض OpenPGP key" + BUTTON_SELECT: "تحديد" + BUTTON_CLOSE: "إغلاق" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "OpenPGP توليد مفتاح" + LABEL_EMAIL: "البريد الإلكتروني" + LABEL_NAME: "الإسم" + LABEL_PASSWORD: "كلمة السر" + LABEL_KEY_BIT_LENGTH: "طول المفتاح" + BUTTON_GENERATE_OPEN_PGP_KEYS: "قم بالتوليد" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" + LABEL_SIGN: "تسجيل" + LABEL_ENCRYPT: "تشفير" + LABEL_PASSWORD: "كلمة السر" + BUTTON_SIGN: "تسجيل" + BUTTON_ENCRYPT: "تشفير" + BUTTON_SIGN_AND_ENCRYPT: "سجل و قم بالتشفير" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP فك تشفير" + LABEL_KEY: "مفتاح خاص" + LABEL_PASSWORD: "كلمة السر" + BUTTON_DECRYPT: "فك تشفير" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "التأكد من الهوية على مرحلتين" + LABEL_CODE: "الكود" + BUTTON_TEST: "تجريب" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "إنشاء عامل تصفية؟" + TITLE_EDIT_FILTER: "تحديث عامل التصفية؟" + FILTER_NAME: "الإسم" + LEGEND_CONDITIONS: "الشروط" + LEGEND_ACTIONS: "التطبيقات" + BUTTON_DONE: "إنتهاء" + BUTTON_ADD_CONDITION: "إضافة تطبيق" + SELECT_ACTION_NONE: "None" + SELECT_ACTION_MOVE_TO: "إنقل الى" + SELECT_ACTION_FORWARD_TO: "أعد التوجيه الى" + SELECT_ACTION_REJECT: "الرفض" + SELECT_ACTION_VACATION_MESSAGE: "رسالة العطلة" + SELECT_ACTION_DISCARD: "تجاهل" + SELECT_FIELD_FROM: "من" + SELECT_FIELD_RECIPIENTS: "المستلمين (الى أو نسخة الى)" + SELECT_FIELD_SUBJECT: "الموضوع" + SELECT_FIELD_HEADER: "Header" + SELECT_FIELD_SIZE: "الحجم" + SELECT_TYPE_CONTAINS: "يحتوي" + SELECT_TYPE_NOT_CONTAINS: "لايحتوي" + SELECT_TYPE_MATCHES: "يطابق (* و ? مدعوم)" + SELECT_TYPE_NOT_MATCHES: "لايطابق (* و ? مدعوم)" + SELECT_TYPE_REGEXP: "ممنهج" + SELECT_TYPE_NOT_REGEXP: "غير ممنهج" + SELECT_TYPE_EQUAL_TO: "مساوي الى" + SELECT_TYPE_NOT_EQUAL_TO: "غير مساوي الى" + SELECT_TYPE_OVER: "فوق" + SELECT_TYPE_UNDER: "تحت" + SELECT_MATCH_ANY: "مطابق لإحدى الشروط" + SELECT_MATCH_ALL: "مطابق لجميع الشروط" + MARK_AS_READ_LABEL: "تعليمها بـ مقروءة" + REPLY_INTERVAL_LABEL: "فترة الرد (بلأيام)" + KEEP_LABEL: "الإحتفاظ بها" + STOP_LABEL: "لاتتوقف عن المعالجة بالشروط" + EMAIL_LABEL: "البريد الإلكتروني" + VACATION_SUBJECT_LABEL: "الموضوع (خياري)" + VACATION_MESSAGE_LABEL: "الرسالة" + VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" + REJECT_MESSAGE_LABEL: "رفض الرسالة" + ALL_INCOMING_MESSAGES_DESC: "جميع الرسائل الواردة" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "حدد مجلدات النظام" + SELECT_CHOOSE_ONE: "إختر واحد" + SELECT_UNUSE_NAME: "لاتستخدم" + LABEL_SENT: "أرسلت" + LABEL_DRAFTS: "المسودات" + LABEL_SPAM: "الرسائل غير المرغوب فيها" + LABEL_TRASH: "المهملات" + LABEL_ARCHIVE: "الأرشيف" + BUTTON_CANCEL: "إلغاء" + BUTTON_CLOSE: "إغلاق" + NOTIFICATION_SENT: | + You haven't selected "Sent" system folder messages are put to after sending. + If you don't want to save sent message, please select "Do not use" option. + NOTIFICATION_DRAFTS: "You haven't selected \"Drafts\" system folder messages are saved to while composing.\n" + NOTIFICATION_SPAM: | + You haven't selected "Spam" system folder spamed messages are placed to. + If you wish to remove messages permanently, please select "Do not use" option. + NOTIFICATION_TRASH: | + You haven't selected "Trash" system folder deleted messages are placed to. + If you wish to remove messages permanently, please select "Do not use" option. + NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "التحقق الثنائي (TOTP)" + LABEL_ENABLE_TWO_FACTOR: "تفعيل عملية التحقق الثنائي" + LABEL_TWO_FACTOR_USER: "المستخدم" + LABEL_TWO_FACTOR_STATUS: "الحالة" + LABEL_TWO_FACTOR_SECRET: "السر" + LABEL_TWO_FACTOR_BACKUP_CODES: "كود التحقق الإحتياطي" + BUTTON_CREATE: "قم بإنشاء سر" + BUTTON_ACTIVATE: "فعل" + BUTTON_CLEAR: "Clear" + BUTTON_LOGOUT: "تسجيل خروج" + BUTTON_DONE: "إنتهى" + BUTTON_TEST: "تجريب" + LINK_TEST: "تجريب" + BUTTON_SHOW_SECRET: "إظهار السر" + BUTTON_HIDE_SECRET: "إخفاء السر" + TWO_FACTOR_REQUIRE_DESC: "حسابك بحاجة الى إعداد مراحل التحقق الثنائية" + TWO_FACTOR_SECRET_CONFIGURED_DESC: "تم التكوين" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "لم يتم التكوين" + TWO_FACTOR_SECRET_DESC: >- + قم باستيراد هذه المعلومات لمركز توثيق غوغل باستخدام رمز الكيو-اّر او بنسخ + الكود يدوياً (or other TOTP client) + TWO_FACTOR_BACKUP_CODES_DESC: >- + إذا لم تتمكن من الحصول على الكود من مركز التوثيق في غوغل يمكنك إستخدام الكود + الإحتياطي لتسجيل الدخول,ولكن سيصبح كود الإحتياط غير فعال بعد ذلك + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "لايمكنك تغيير هذه الإعدادات بدون تجريب." + TITLES: + LOADING: "..جاري التحميل" + LOGIN: "تسجيل الدخول" + MAILBOX: "صندوق البريد" + SETTINGS: "الإعدادات" + COMPOSE: "إنشاء" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "حجم الملف كبير جداً" + ERROR_FILE_PARTIALLY_UPLOADED: "لقد تم إضافة الملف بشكل جزئي ..بسبب خطأ غير معروف" + ERROR_NO_FILE_UPLOADED: "لم تتم عملية إضافة الملفات" + ERROR_MISSING_TEMP_FOLDER: "الملف المؤقت مفقود" + ERROR_ON_SAVING_FILE: "حدث خطأ نتيجة إضافة ملف غير معروف النوع" + ERROR_FILE_TYPE: "نوع الملف مرفوض" + ERROR_UNKNOWN: "حدث خطأ نتيجة إضافة ملف غير معروف النوع" + EDITOR: + TEXT_SWITCHER_RICH_FORMATTING: "غني بالتنسيقات" + TEXT_SWITCHER_CONFIRM: "التنسيقات و الصور المضافة ستزال.. هل أنت متأكد من الإستمرار" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "الشخصي" + LABEL_GENERAL_NAME: "العام" + LABEL_CONTACTS_NAME: "جهات الإتصال" + LABEL_FOLDERS_NAME: "المجلدات" + LABEL_ACCOUNTS_NAME: "الحسابات" + LABEL_IDENTITY_NAME: "الهوية" + LABEL_IDENTITIES_NAME: "الهويات" + LABEL_FILTERS_NAME: "عوامل التصفية" + LABEL_TEMPLATES_NAME: "القوالب" + LABEL_SECURITY_NAME: "الأمان" + LABEL_SOCIAL_NAME: "الشبكات الإجتماعية" + LABEL_THEMES_NAME: "المظاهر العامة" + LABEL_CHANGE_PASSWORD_NAME: "كلمة السر" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "العودة" + SETTINGS_FILTERS: + LEGEND_FILTERS: "عوامل التصفية" + BUTTON_SAVE: "حفظ" + BUTTON_ADD_FILTER: "إضافة عامل تصفية" + BUTTON_DELETE: "حذف" + BUTTON_RAW_SCRIPT: "إستخدام سكربت مخصصة للمستخدم" + SUBNAME_NONE: "None" + SUBNAME_MOVE_TO: "\"%FOLDER%\" نقل الى" + SUBNAME_FORWARD_TO: "\"%EMAIL%\" إعادة توجيه الى" + SUBNAME_REJECT: "رفض" + SUBNAME_VACATION_MESSAGE: "رسالة العطلة" + SUBNAME_DISCARD: "تجاهل" + CAPABILITY_LABEL: "القدرة" + LOADING_PROCESS: "تحديث قائمة عوامل التصفية" + DELETING_ASK: "هل أنت متأكد؟" + CHACHES_NEED_TO_BE_SAVED_DESC: "هذه التغييرات بحاجة الى أن يتم حفظها على المخدم." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "الهوية" + LABEL_DISPLAY_NAME: "الإسم" + LABEL_REPLY_TO: "الرد-الى" + LABEL_SIGNATURE: "التوقيع" + LABEL_ADD_SIGNATURE_TO_ALL: "قم بإضافة توقيعك على جميع الرسائل الصادرة" + SETTINGS_SECURITY: + LEGEND_SECURITY: "الأمان" + LABEL_CONFIGURE_TWO_FACTOR: "تكوين عملية التأكد ثنائية المراحل" + LABEL_AUTOLOGOUT: "تسجيل الخروج التلقائي" + AUTOLOGIN_NEVER_OPTION_NAME: "أبداَ" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% دقيقة" + SETTINGS_GENERAL: + LEGEND_GENERAL: "عام" + LABEL_LANGUAGE: "اللغة" + LABEL_IDENTITY: "الهوية" + LABEL_LAYOUT: "التصميم" + LABEL_LAYOUT_NO_SPLIT: "بدون إنقسام" + LABEL_LAYOUT_VERTICAL_SPLIT: "إنقسام عمودي" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "إنقسام أفقي" + LABEL_EDITOR: "المحرر النصي الأساسي" + LABEL_EDITOR_HTML: "Html" + LABEL_EDITOR_PLAIN: "عادي" + LABEL_EDITOR_HTML_FORCED: "Html (إجباري)" + LABEL_EDITOR_PLAIN_FORCED: "عادي (إجباري)" + LABEL_ANIMATION: "مؤثرات الواجهة الحية" + LABEL_ANIMATION_FULL: "كامل" + LABEL_ANIMATION_NORMAL: "عادي" + LABEL_ANIMATION_NONE: "بدون" + LABEL_VIEW_OPTIONS: "إظهار الخيارات" + LABEL_USE_PREVIEW_PANE: "استخدام جزئية العرض الجانبي" + LABEL_USE_CHECKBOXES_IN_LIST: "عرض مربعات التحديد في القائمة" + LABEL_USE_THREADS: "إستخدام المواضيع" + LABEL_REPLY_SAME_FOLDER: "ضع الردود في مجلد الرسالة التي يتم الرد عليها" + LABEL_SHOW_IMAGES: "قم دائماَ بعرض الصور القادمة في الرسالة" + LABEL_SHOW_ANIMATION: "أظهر التأثيرات الخاصة" + LABEL_MESSAGE_PER_PAGE: "الرسائل في الصفحة" + LABEL_NOTIFICATIONS: "التنبيهات" + LABEL_SOUND_NOTIFICATION: "صوت التنبيهات" + LABEL_CHROME_NOTIFICATION_DESC: "إظهار نافذة منبثقة في حالة قدوم ايميل جديد" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(تم إعتراضها من قبل المتصفح)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "جهات الإتصال" + LABEL_CONTACTS_AUTOSAVE: "قم باضافة المستلمين تلقائيا الى دفتر العناوين" + LEGEND_CONTACTS_SYNC: "(CardDAV)التزامن عن بعد" + LABEL_CONTACTS_SYNC_ENABLE: "تفعيل التزامن عن بعد" + LABEL_CONTACTS_SYNC_SERVER: "المخدم" + LABEL_CONTACTS_SYNC_AB_URL: "وصلة دفتر العناوين" + LABEL_CONTACTS_SYNC_USER: "المستخدم" + LABEL_CONTACTS_SYNC_PASSWORD: "كلمة السر" + SETTINGS_THEMES: + LEGEND_THEMES: "المظاهر العامة" + LEGEND_THEMES_CUSTOM: "تجهيز المظهر المخصص" + LABEL_CUSTOM_TYPE: "النوع" + LABEL_CUSTOM_TYPE_LIGHT: "فاتح" + LABEL_CUSTOM_TYPE_DARK: "غامق" + LABEL_CUSTOM_BACKGROUND_IMAGE: "الخلفية" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "(JPG, PNG)حمل صورة الخلفية" + ERROR_FILE_IS_TOO_BIG: "حجم الملف كبير جداً" + ERROR_FILE_TYPE_ERROR: "مسموحة فقط(JPG,PNG)نوع الملف خطأ" + ERROR_UNKNOWN: "حدث خطأ أثناء رفع الملف" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "غوغل" + BUTTON_GOOGLE_CONNECT: "إتصل بغوغل" + BUTTON_GOOGLE_DISCONNECT: "إفصل الإتصال مع غوغل" + MAIN_GOOGLE_DESC: "بعد تفعيل الإتصال مع غوغل.. يمكنك تسجيل الدخول الى حسابك باستخدام زر غوغل على صفحة تسجيل الدخول" + LEGEND_FACEBOOK: "فيسبوك" + BUTTON_FACEBOOK_CONNECT: "إتصل بفيسبوك" + BUTTON_FACEBOOK_DISCONNECT: "إفصل الإتصال مع فيسبوك" + MAIN_FACEBOOK_DESC: "بعد تفعيل الإتصال مع فيسبوك.. يمكنك تسجيل الدخول الى حسابك باستخدام زر فيسبوك على صفحة تسجيل الدخول" + LEGEND_TWITTER: "تويتر" + BUTTON_TWITTER_CONNECT: "إتصل بتويتر" + BUTTON_TWITTER_DISCONNECT: "إفصل الإتصال بتويتر" + MAIN_TWITTER_DESC: "بعد تفعيل الإتصال مع تويتر.. يمكنك تسجيل الدخول الى حسابك باستخدام زر تويتر على صفحة تسجيل الدخول" + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "قائمة المجلدات" + BUTTON_CREATE: "أنشأ مجلد" + BUTTON_DELETE: "حذف" + BUTTON_SUBSCRIBE: "الإشتراك" + BUTTON_UNSUBSCRIBE: "الغاء الإشتراك" + LOADING_PROCESS: "جاري تحديث قائمة المجلدات" + CREATING_PROCESS: "جاري إنشاء المجلد" + DELETING_PROCESS: "جاري حذف المجلد" + RENAMING_PROCESS: "جاري إعادة تسمية المجلد" + DELETING_ASK: "هل أنت متأكد؟" + TO_MANY_FOLDERS_DESC_1: "لديك الكثير من المجلدات!" + TO_MANY_FOLDERS_DESC_2: "لقد قمنا بإظهار جزء منهم تفادياَ لضعف الأداء" + HELP_DELETE_FOLDER: "إحذف المجلد" + HELP_SHOW_HIDE_FOLDER: "إخفاء\\إظهار المجلد" + HELP_CHECK_FOR_NEW_MESSAGES: "تأكد\\لاتتأكد من وصول ايميلات جديدة" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "الحسابات" + LEGEND_IDENTITIES: "الهويات" + LEGEND_ACCOUNTS_AND_IDENTITIES: "الحسابات و الهويات" + BUTTON_ADD_ACCOUNT: "قم باضافة حساب" + BUTTON_ADD_IDENTITY: "قم باضافة هوية" + BUTTON_DELETE: "إحذف" + LOADING_PROCESS: "..جاري التحميل" + DELETING_ASK: "هل أنت متأكد؟" + DEFAULT_IDENTITY_LABEL: "الافتراضي" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "الهوية" + LEGEND_IDENTITIES: "الهويات الإضافية" + LABEL_DEFAULT: "الافتراضي" + LABEL_DISPLAY_NAME: "الإسم" + LABEL_REPLY_TO: "الرد-الى" + LABEL_SIGNATURE: "التوفيع" + LABEL_ADD_SIGNATURE_TO_ALL: "قم باضافة التوقيع الى جميع الرسائل الصادرة" + BUTTON_ADD_IDENTITY: "قم بإضافة هوية" + BUTTON_DELETE: "حذف" + LOADING_PROCESS: "جاري تحديث قائمة الهويات" + DELETING_ASK: "هل أنت متأكد؟" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "غيّر كلمة السر" + LABEL_CURRENT_PASSWORD: "كلمة السر الحالية" + LABEL_NEW_PASSWORD: "كلمة السر الجديدة" + LABEL_REPEAT_PASSWORD: "تأكيد كلمة السر الجديدة" + BUTTON_UPDATE_PASSWORD: "تعيين كلمة السر الجديدة" + ERROR_PASSWORD_MISMATCH: "كلمات السر غير متطابقة,لطفاَ أعد كتابتها" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "OpenPGP إستيراد مفتاح" + BUTTON_GENERATE_OPEN_PGP_KEYS: "OpenPGP توليد مفتاح" + TITLE_PRIVATE: "خاص" + TITLE_PUBLIC: "عام" + DELETING_ASK: "هل أنت متأكد؟" + GENERATE_ONLY_HTTPS: "HTTPS فقط" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "مساعدة في إختصارات لوحة المفاتيح" + TAB_MAILBOX: "صندوق البريد" + TAB_MESSAGE_LIST: "قائمة الرسائل" + TAB_MESSAGE_VIEW: "عرض الرسائل" + TAB_COMPOSE: "إنشاء" + LABEL_OPEN_USER_DROPDOWN: "فتح نافذة الأعضاء المنبثقة" + LABEL_REPLY: "الرد" + LABEL_REPLY_ALL: "الرد للجميع" + LABEL_FORWARD: "إعادة التوجيه" + LABEL_FORWARD_MULTIPLY: "إعادة التوجيه كملف مرفق" + LABEL_HELP: "المساعدة" + LABEL_CHECK_ALL: "تحديد جميع الرسائل" + LABEL_ARCHIVE: "أرشيف" + LABEL_DELETE: "حذف" + LABEL_OPEN_THREAD: "فتح المواضيع المحددة" + LABEL_MOVE: "نقل" + LABEL_READ: "إقرأ الرسائل المحددة" + LABEL_UNREAD: "لاتقم بقراءة الرسائل المحددة" + LABEL_IMPORTANT: "هام, النجمة/العلم الرسائل المحددة" + LABEL_SEARCH: "بحث" + LABEL_CANCEL_SEARCH: "إلغاء البحث" + LABEL_FULLSCREEN_ENTER: "وضع ملء الشاشة" + LABEL_VIEW_MESSAGE_ENTER: "مشاهدة الرسائل (بدون نافذة المشاهدة)" + LABEL_SWITCH_TO_MESSAGE: "تحويل التركيز الى الرسائل المحددة" + LABEL_SWITCH_TO_FOLDER_LIST: "تحويل التركيز الى قائمة المجلدات" + LABEL_FULLSCREEN_TOGGLE: "تفعيل وضعية ملء الشاشة" + LABEL_BLOCKQUOTES_TOGGLE: "إقتباس الرسائل" + LABEL_THREAD_NEXT: "الرسالة التالية في الموضوع" + LABEL_THREAD_PREV: "الرسالة السابقة من الموضوع" + LABEL_PRINT: "طباعة" + LABEL_EXIT_FULLSCREEN: "الخروج من وضع ملء الشاشة" + LABEL_CLOSE_MESSAGE: "إغلاق الرسالة (بدون نافذة العرض)" + LABEL_SWITCH_TO_LIST: "تحويل التركيز الى قائمة الرسائل" + LABEL_OPEN_COMPOSE_POPUP: "إفتح نافذة خاصة لإنشاء الرسائل" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "فتح قائمة الهويات" + LABEL_SAVE_MESSAGE: "حفظ الرسالة" + LABEL_SEND_MESSAGE: "إرسال الرسالة" + LABEL_CLOSE_COMPOSE: "إغلاق الرسالة" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "لم يتم إيجاد المفتاح العام" + NO_PUBLIC_KEYS_FOUND_FOR: "لم يتم إيجاد مفتاح عام\"%EMAIL%\" email" + NO_PRIVATE_KEY_FOUND: "لم يتم إيجاد مفتاح خاص" + NO_PRIVATE_KEY_FOUND_FOR: "لم يتم إيجاد المفتاح الخاص لـ \"%EMAIL%\" email" + ADD_A_PUBLICK_KEY: "Add a public key" + UNVERIFIRED_SIGNATURE: "توقيع غير موثق" + DECRYPTION_ERROR: "OpenPGP خطأ فك تشفير" + GOOD_SIGNATURE: "توقيع جيد من %USER%" + PGP_ERROR: "OpenPGP error: %ERROR%" + SPECIFY_FROM_EMAIL: "يرجى التأكد من الإيميل" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "يرجى تحديد مستلم واحد على الأقل" + NOTIFICATIONS: + INVALID_TOKEN: "خاطىء token" + AUTH_ERROR: "خطأ في كلمة السر \\اسم المستخدم" + ACCESS_ERROR: "خطأ في الوصول" + CONNECTION_ERROR: "لايمكن الإتصال بالمخدم" + CAPTCHA_ERROR: "رمز تحقق خاطىء." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- + إن المعرف الإجتماعي غير مرتبط بـ أي حساب حالياَ. سجل الدخول الى مركز التوثيق + في بريدك الإلكتروني وفعل هذه الخاصية في إعدادات حسابك + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- + إن المعرف الإجتماعي غير مرتبط بـ أي حساب حالياَ. سجل الدخول الى مركز التوثيق + في بريدك الإلكتروني وفعل هذه الخاصية في إعدادات حسابك + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- + إن المعرف الإجتماعي غير مرتبط بـ أي حساب حالياَ. سجل الدخول الى مركز التوثيق + في بريدك الإلكتروني وفعل هذه الخاصية في إعدادات حسابك + DOMAIN_NOT_ALLOWED: "غير مسموح لهذا الموقع" + ACCOUNT_NOT_ALLOWED: "الحساب غير مسموح له" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "عامل التحقق الثنائي من الهوية مطلوب" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "خطأ في عملية التحقق الثنائية" + COULD_NOT_SAVE_NEW_PASSWORD: "لم نتمكن من حفظ كلمة السر الجديدة" + CURRENT_PASSWORD_INCORRECT: "كلمة السر الحالية خاطئة" + NEW_PASSWORD_SHORT: "كلمة السر قصيرة جداً" + NEW_PASSWORD_WEAK: "كلمة السر سهلة جداً" + NEW_PASSWORD_FORBIDDENT: "كلمة السر تحتوي على محارف غير مسموح بها" + CONTACTS_SYNC_ERROR: "خطأ في مزامنة جهات الإتصال" + CANT_GET_MESSAGE_LIST: "لايمكن الوصول الى قائمة الرسائل" + CANT_GET_MESSAGE: "لايمكن الوصول الى الرسالة" + CANT_DELETE_MESSAGE: "لايمكن حذف الرسالة" + CANT_MOVE_MESSAGE: "لايمكن نقل الرسالة" + CANT_SAVE_MESSAGE: "لايمكن حفظ الرسالة" + CANT_SEND_MESSAGE: "لايمكن إرسال الرسالة" + INVALID_RECIPIENTS: "يرجى التأكد من عناوين المرسل اليهم" + CANT_SAVE_FILTERS: "لايمكن حفظ عامل التصفية" + CANT_GET_FILTERS: "لايمكن الوصول الى عوامل التصفية" + FILTERS_ARE_NOT_CORRECT: "عوامل التصفية خطأ" + CANT_CREATE_FOLDER: "لايمكن إنشاء مجلد" + CANT_RENAME_FOLDER: "لايمكن إعادة تسمية المجلد" + CANT_DELETE_FOLDER: "لايمكن حذف المجلد" + CANT_DELETE_NON_EMPTY_FOLDER: "لايمكن حذف مجلد ممتلأ" + CANT_SUBSCRIBE_FOLDER: "لايمكن الإشتراك بالمجلد" + CANT_UNSUBSCRIBE_FOLDER: "لايمكن حذف الإشتراك من المجلد" + CANT_SAVE_SETTINGS: "لايمكن حفظ الإعدادات" + CANT_SAVE_PLUGIN_SETTINGS: "لايمكن حفظ الإعدادات" + DOMAIN_ALREADY_EXISTS: "الموقع موجود مسبقاَ" + CANT_INSTALL_PACKAGE: "فشل في تنزيل الحزمة" + CANT_DELETE_PACKAGE: "فشل في إزالة الحزمة" + INVALID_PLUGIN_PACKAGE: "خطأ في الحزمة المراد تنزيلها" + UNSUPPORTED_PLUGIN_PACKAGE: "حزمة غير مدعومة" + LICENSING_SERVER_IS_UNAVAILABLE: "مخدم الإشتراكات غير متوفر" + LICENSING_DOMAIN_EXPIRED: "الإشتراك لهذا الموقع قد انتهى" + LICENSING_DOMAIN_BANNED: "الإشتراك لهذا الموقع قد تم حجبه" + DEMO_SEND_MESSAGE_ERROR: "لأسباب أمنية, هذا الحساب غير مسموح له إرسال رسائل" + DEMO_ACCOUNT_ERROR: "لأسباب أمنية , هذا الحساب قد منع من هذا الإجراء" + ACCOUNT_ALREADY_EXISTS: "الحساب موجود مسبقاَ" + ACCOUNT_DOES_NOT_EXIST: "الحساب المطلوب غير موجود" + MAIL_SERVER_ERROR: "حدث خطأ أثناء محاولة الوصول الى المخدم البريدي" + INVALID_INPUT_ARGUMENT: "Invalid input argument" + UNKNOWN_ERROR: "خطأ غير معروف" + STATIC: + BACK_LINK: "إعادة التحميل" + DOMAIN_LIST_DESC: "قائمة المواقع البريدية المسموح فيها لهذا البريد بالوصول" + PHP_EXSTENSIONS_ERROR_DESC: "!إضافات الـ بي إتش بي المطلوبة,غير متوافرة في إعدادات الـ بي إتش بي لديك" + PHP_VERSION_ERROR_DESC: "أقل من الإصدار المطلوب 5.3.0!(%VERSION%) PHP إصدار" + NO_SCRIPT_TITLE: "الجافا سكريبت مطلوبة لهذا البرنامج" + NO_SCRIPT_DESC: |- + إن متصفحك لايدعم الجافا سكريبت . يرجى تفعيل الدعم أو تجريب متصفح أخر + NO_COOKIE_TITLE: "Cookies support is required for this application." + NO_COOKIE_DESC: | + Cookies support is not available in your browser. + Please enable Cookie support in your browser settings and retry. + BAD_BROWSER_TITLE: "متصفحك بحاجة الى تحديث" + BAD_BROWSER_DESC: |- + لإصتخدام جميع ميزات هذا البرنامج يرجى تنزيل أحد المتصفحات التالية الداعمة: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/bg_BG.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/bg_BG.yml new file mode 100755 index 00000000..53bbc3df --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/bg_BG.yml @@ -0,0 +1,713 @@ +bg_BG: + LOGIN: + LABEL_EMAIL: "Акаунт" + LABEL_LOGIN: "Логин" + LABEL_PASSWORD: "Парола" + LABEL_SIGN_ME: "Впиши ме" + LABEL_VERIFICATION_CODE: "Код за потвърждение" + LABEL_DONT_ASK_VERIFICATION_CODE: "Не питай за код в продължение на 2 седмици" + BUTTON_SIGN_IN: "Вход" + TITLE_SIGN_IN_GOOGLE: "Вход с Google" + TITLE_SIGN_IN_FACEBOOK: "Вход с Facebook" + TITLE_SIGN_IN_TWITTER: "Вход с Twitter" + LABEL_FORGOT_PASSWORD: "Забравена парола" + LABEL_REGISTRATION: "Регистрация" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Добави акаунт" + BUTTON_SETTINGS: "Настройки" + BUTTON_HELP: "Помощ" + BUTTON_LOGOUT: "Изход" + MOBILE: + BUTTON_MOBILE_VERSION: "Мобилна версия" + BUTTON_DESKTOP_VERSION: "Десктоп версия" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Търсене" + TITLE_ADV: "Разширено търсене" + LABEL_ADV_FROM: "От" + LABEL_ADV_TO: "За" + LABEL_ADV_SUBJECT: "Заглавие" + LABEL_ADV_TEXT: "Текст" + LABEL_ADV_HAS_ATTACHMENT: "Има приложен файл" + LABEL_ADV_HAS_ATTACHMENTS: "Има приложени файлове" + LABEL_ADV_FLAGGED: "Отбелязано с флаг" + LABEL_ADV_UNSEEN: "Невидяно" + LABEL_ADV_DATE: "Дата" + LABEL_ADV_DATE_ALL: "Всички" + LABEL_ADV_DATE_3_DAYS: "До 3 дена" + LABEL_ADV_DATE_7_DAYS: "До 1 седмица" + LABEL_ADV_DATE_MONTH: "До 1 месец" + LABEL_ADV_DATE_3_MONTHS: "До 3 месеца" + LABEL_ADV_DATE_6_MONTHS: "До 6 месеца" + LABEL_ADV_DATE_YEAR: "До 1 година" + BUTTON_ADV_SEARCH: "Търси" + PREVIEW_POPUP: + FULLSCREEN: "На цял екран" + ZOOM: "Приближи/отдалечи" + CLOSE: "Затваряне (Esc)" + LOADING: "Зареждане..." + GALLERY_PREV: "Предишно (Бутон лява стрелка)" + GALLERY_NEXT: "Следващо (Бутон дясна стрелка)" + GALLERY_COUNTER: "%curr% от %total%" + IMAGE_ERROR: "Изображението не беше заредено." + AJAX_ERROR: "Съдържанието не беше заредено." + FOLDER_LIST: + BUTTON_COMPOSE: "Създай" + BUTTON_CONTACTS: "Контакти" + BUTTON_NEW_MESSAGE: "Ново съобщение" + INBOX_NAME: "Вх. кутия" + SENT_NAME: "Изпратени" + DRAFTS_NAME: "Чернови" + SPAM_NAME: "Спам" + TRASH_NAME: "Кошче" + ARCHIVE_NAME: "Архив" + QUOTA: + TITLE: "Използване по дялове" + MESSAGE_LIST: + BUTTON_RELOAD: "Презареди списъка със съобщения" + BUTTON_MOVE_TO: "Премести в" + BUTTON_DELETE: "Изтрий" + BUTTON_ARCHIVE: "Архивирай" + BUTTON_SPAM: "Спам" + BUTTON_NOT_SPAM: "Не е спам" + BUTTON_EMPTY_FOLDER: "Изчисти папката" + BUTTON_MULTY_FORWARD: "Препрати като прикачен/и файл/ове" + BUTTON_DELETE_WITHOUT_MOVE: "Изтриване завинаги" + BUTTON_MORE: "Още" + MENU_SET_SEEN: "Маркирай като прочетено" + MENU_SET_ALL_SEEN: "Маркирай всички като прочетени" + MENU_UNSET_SEEN: "Маркиране като непрочетено" + MENU_SET_FLAG: "Отбележи с флаг" + MENU_UNSET_FLAG: "Премахни флага" + MENU_SELECT_ALL: "Всичко" + MENU_SELECT_NONE: "Нито едно" + MENU_SELECT_INVERT: "Размени" + MENU_SELECT_UNSEEN: "Непрочетени" + MENU_SELECT_SEEN: "Прочетени" + MENU_SELECT_FLAGGED: "Маркирани с флаг" + MENU_SELECT_UNFLAGGED: "С премахнат флаг" + EMPTY_LIST: "Празен списък." + EMPTY_SEARCH_LIST: "Няма съобщения, които да отговарят на търсенето." + SEARCH_RESULT_FOR: "Резултати от търсенето за \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "Обратно при съобщенията" + LIST_LOADING: "Зареждане" + EMPTY_SUBJECT_TEXT: "(Няма заглавие)" + PUT_MESSAGE_HERE: "Пуснете съобщението тук, за да го видите в списъка" + TODAY_AT: "днес в %TIME%" + YESTERDAY_AT: "вчера в %TIME%" + SEARCH_PLACEHOLDER: "Търсене" + NEW_MESSAGE_NOTIFICATION: "Имате %COUNT% нови съобщения!" + QUOTA_SIZE: "Използване на %SIZE% (%PROC%%) от вашите %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Редактирай" + BUTTON_BACK: "Назад" + BUTTON_CLOSE: "Затвори" + BUTTON_DELETE: "Изтрий" + BUTTON_UNSUBSCRIBE: "Отписване от този лист" + BUTTON_ARCHIVE: "Архивирай" + BUTTON_SPAM: "Спам" + BUTTON_NOT_SPAM: "Не е спам" + BUTTON_MOVE_TO: "Премести в" + BUTTON_MORE: "Още" + BUTTON_REPLY: "Отговори" + BUTTON_REPLY_ALL: "Отговори на всички" + BUTTON_FORWARD: "Препрати" + BUTTON_FORWARD_AS_ATTACHMENT: "Препрати като прикрепен файл" + BUTTON_EDIT_AS_NEW: "Редактирай като ново" + BUTTON_SHOW_IMAGES: "Показване на външните изображения" + BUTTON_NOTIFY_READ_RECEIPT: "Изпращачът е помолил да бъде уведомен, когато прочетете това съобщение." + BUTTON_IN_NEW_WINDOW: "Прегледай в отделен прозорец" + BUTTON_THREAD_LIST: "Списък с разговори" + BUTTON_THREAD_PREV: "Предишно" + BUTTON_THREAD_NEXT: "Следващо" + BUTTON_THREAD_MORE: "Още съобщения" + MENU_HEADERS: "Покажи хедъра на съобщението" + MENU_VIEW_ORIGINAL: "Покажи източника" + MENU_DOWNLOAD_ORIGINAL: "Изтегли като .eml файл" + MENU_FILTER_SIMILAR: "Филтрирай съобщения като това" + MENU_PRINT: "Принтирай" + EMPTY_SUBJECT_TEXT: "(Няма заглавие)" + LABEL_SUBJECT: "Заглавие" + LABEL_DATE: "Дата" + LABEL_FROM: "От" + LABEL_FROM_SHORT: "от" + LABEL_TO: "До" + LABEL_TO_SHORT: "до" + LABEL_CC: "Копие до" + LABEL_BCC: "Скрито копие до" + LABEL_REPLY_TO: "Отговори на" + PRINT_LABEL_FROM: "От" + PRINT_LABEL_TO: "До" + PRINT_LABEL_CC: "Копие до" + PRINT_LABEL_BCC: "Скрито копие до" + PRINT_LABEL_REPLY_TO: "Отговори на" + PRINT_LABEL_DATE: "Дата" + PRINT_LABEL_SUBJECT: "Заглавие" + PRINT_LABEL_ATTACHMENTS: "Прикрепени файлове" + MESSAGE_LOADING: "Зареждане" + MESSAGE_VIEW_DESC: "Изберете съобщение, за да го видите тук." + MESSAGE_VIEW_MOVE_DESC: "Изберете цел от папките в лявото поле" + PGP_PASSWORD_INPUT_PLACEHOLDER: "Парола" + PGP_SIGNED_MESSAGE_DESC: "Подписано с OpenPGP (кликни за проверка)" + PGP_ENCRYPTED_MESSAGE_DESC: "Шифровано с OpenPGP (кликни за проверка)" + LINK_DOWNLOAD_AS_ZIP: "Свали като ZIP файл" + LINK_SAVE_TO_OWNCLOUD: "Запази в ownCloud" + LINK_SAVE_TO_CLOUD: "Запазване в облака" + LINK_SAVE_TO_DROPBOX: "Запази в Dropbox" + READ_RECEIPT: + SUBJECT: "Обратна разписка (видяно) - %SUBJECT%" + BODY: | + Това е обратна разписка за съобщението, което изпратихте до %READ-RECEIPT%. + + Note: Тази обратна разписка само указва, че съобщението е показано на компютъра на получателя. + Няма гаранция, че получателят е прочел или разбрал съдържанието на съобщението. + SUGGESTIONS: + SEARCHING_DESC: "Търсене..." + CONTACTS: + LEGEND_CONTACTS: "Контакти" + SEARCH_INPUT_PLACEHOLDER: "Търсене" + BUTTON_ADD_CONTACT: "Добави контакт" + BUTTON_CREATE_CONTACT: "Създай" + BUTTON_UPDATE_CONTACT: "Обнови" + BUTTON_IMPORT: "Импортирай (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Експортирай (vcf, vCard)" + BUTTON_EXPORT_CSV: "Експортирай (csv)" + ERROR_IMPORT_FILE: "Грешка при импортирането (невалиден формат на файла)" + LIST_LOADING: "Зареждане" + EMPTY_LIST: "Тук няма контакти" + EMPTY_SEARCH: "Не са намерени контакти" + CLEAR_SEARCH: "Изчистване на търсенето" + CONTACT_VIEW_DESC: "Изберете контакт от списъка, за да го видите тук." + LABEL_DISPLAY_NAME: "Показване на име" + LABEL_EMAIL: "Имейл" + LABEL_PHONE: "Телефон" + LABEL_WEB: "Страница" + LABEL_BIRTHDAY: "Рожден ден" + LINK_ADD_EMAIL: "Добави имейл адрес" + LINK_ADD_PHONE: "Добави телефон" + LINK_BIRTHDAY: "Рожден ден" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Въвеждете името, което ще се показва" + PLACEHOLDER_ENTER_LAST_NAME: "Въведете фамилия" + PLACEHOLDER_ENTER_FIRST_NAME: "Въведете име" + PLACEHOLDER_ENTER_NICK_NAME: "Въведете прякор" + LABEL_READ_ONLY: "Само за четене" + LABEL_SHARE: "Сподели" + ADD_MENU_LABEL: "Добави" + ADD_MENU_NICKNAME: "Прякор" + ADD_MENU_NOTES: "Бележки" + ADD_MENU_EMAIL: "Имейл" + ADD_MENU_PHONE: "Телефон" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Адрес" + ADD_MENU_BIRTHDAY: "Рожден ден" + ADD_MENU_TAGS: "Етикети" + BUTTON_SHARE_NONE: "Няма" + BUTTON_SHARE_ALL: "Всички" + BUTTON_SYNC: "Синхронизация (CardDAV)" + COMPOSE: + TITLE_FROM: "От" + TITLE_TO: "За" + TITLE_CC: "Копие до" + TITLE_BCC: "Скрито копие до" + TITLE_REPLY_TO: "Отговори на" + TITLE_SUBJECT: "Заглавие" + LINK_SHOW_INPUTS: "покажи всички полета" + BUTTON_SEND: "Изпрати" + BUTTON_SAVE: "Запази" + BUTTON_DELETE: "Изтрий" + BUTTON_CANCEL: "Отказ" + BUTTON_MINIMIZE: "Свий прозореца" + SAVED_TIME: "Запазено в %TIME%" + SAVED_ERROR_ON_SEND: "Съобщението беше изпратено, но не беше запазено в папката с изпратени съобщения" + DISCARD_UNSAVED_DATA: "Изтрий незапаметеното?" + ATTACH_FILES: "Прикрепете файлове" + ATTACH_DROP_FILES_DESC: "Пуснете файловете тук" + ATTACH_ITEM_CANCEL: "Отказ" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% написа" + FORWARD_MESSAGE_TOP_TITLE: "-------- Препратено съобщение -------" + FORWARD_MESSAGE_TOP_FROM: "От" + FORWARD_MESSAGE_TOP_TO: "За" + FORWARD_MESSAGE_TOP_CC: "Копие до" + FORWARD_MESSAGE_TOP_SENT: "Изпратено" + FORWARD_MESSAGE_TOP_SUBJECT: "Заглавие" + EMPTY_TO_ERROR_DESC: "Моля, изберте поне един получател" + NO_ATTACHMENTS_HERE_DESC: "Няма прикрепени файлове." + ATTACHMENTS_ERROR_DESC: "Внимание! Не всички прикачени файлове са качени." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Все още не са качени всички прикрепени файлове" + BUTTON_REQUEST_READ_RECEIPT: "Поискайте разписка за прочитане на съобщението" + BUTTON_MARK_AS_IMPORTANT: "Отбележи като важно" + BUTTON_OPEN_PGP: "OpenPGP (Чист текст)" + BUTTON_REQUEST_DSN: "Уведомяване при доставка" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Затвори" + POPUPS_ASK: + BUTTON_YES: "Да" + BUTTON_NO: "Не" + DESC_WANT_CLOSE_THIS_WINDOW: "Сигурни ли сте, че желаете да затворите този прозорец?" + DESC_WANT_DELETE_MESSAGES: "Сигурни ли сте, че желаете да изтриете съобщението/съобщенията?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Избери език" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Добавяне на акаунт?" + BUTTON_ADD_ACCOUNT: "Добави" + TITLE_UPDATE_ACCOUNT: "Обнови акаунта?" + BUTTON_UPDATE_ACCOUNT: "Обнови" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Добавяне на идентичност?" + TITLE_UPDATE_IDENTITY: "Обновяване на идентичност?" + BUTTON_ADD_IDENTITY: "Добавяне" + BUTTON_UPDATE_IDENTITY: "Обновяване" + LABEL_EMAIL: "Имейл" + LABEL_NAME: "Име" + LABEL_REPLY_TO: "Отговорете на" + LABEL_SIGNATURE: "Подпис" + LABEL_CC: "Копие до" + LABEL_BCC: "Скрито копие до" + LABEL_SIGNATURE_INSERT_BEFORE: "Подписа да се поставя преди цитирания текст при отговор" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Създаване на папка?" + LABEL_NAME: "Име на папка" + LABEL_PARENT: "Родителска папка" + BUTTON_CREATE: "Създай" + BUTTON_CANCEL: "Отказ" + BUTTON_CLOSE: "Затвори" + TITLE_CREATING_PROCESS: "Създаване на папка" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Прочистване на всички съобщения от папката?" + BUTTON_CLEAR: "Изчисти" + BUTTON_CANCEL: "Отказ" + BUTTON_CLOSE: "Затвори" + DANGER_DESC_WARNING: "Внимание!" + DANGER_DESC_HTML_1: "Това действие ще доведе до премахването на всички мейли от папката %FOLDER%." + DANGER_DESC_HTML_2: "Веднъж започнат, този процес не може да бъде прекратен или отказан." + TITLE_CLEARING_PROCESS: "Прочистване на папката..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Внасяне на OpenPGP ключ" + BUTTON_IMPORT_OPEN_PGP_KEY: "Внеси" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "Виж OpenPGP ключа" + BUTTON_SELECT: "Избери" + BUTTON_CLOSE: "Затвори" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Създаване на OpenPGP ключове" + LABEL_EMAIL: "Email" + LABEL_NAME: "Име" + LABEL_PASSWORD: "Парола" + LABEL_KEY_BIT_LENGTH: "Дължина на ключа" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Създай" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "Подпиши/шифровай с OpenPGP" + LABEL_SIGN: "Подпиши" + LABEL_ENCRYPT: "Шифровай" + LABEL_PASSWORD: "Парола" + BUTTON_SIGN: "Подпиши" + BUTTON_ENCRYPT: "Шифровай" + BUTTON_SIGN_AND_ENCRYPT: "Подпиши и шифровай" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "Дешифриране с OpenPGP" + LABEL_KEY: "Частен ключ" + LABEL_PASSWORD: "Парола" + BUTTON_DECRYPT: "Дешифрирай" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "Двустъпков тест за удостоверяване" + LABEL_CODE: "Код" + BUTTON_TEST: "Тест" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Въздай филтър?" + TITLE_EDIT_FILTER: "Обнови филтъра?" + FILTER_NAME: "Име" + LEGEND_CONDITIONS: "Условия" + LEGEND_ACTIONS: "Действия" + BUTTON_DONE: "Готово" + BUTTON_ADD_CONDITION: "Добави условие" + SELECT_ACTION_NONE: "Няма" + SELECT_ACTION_MOVE_TO: "Премести в" + SELECT_ACTION_FORWARD_TO: "Препрати към" + SELECT_ACTION_REJECT: "Отхвърли" + SELECT_ACTION_VACATION_MESSAGE: "Съобщение в отпуска" + SELECT_ACTION_DISCARD: "Отхвърли" + SELECT_FIELD_FROM: "От" + SELECT_FIELD_RECIPIENTS: "Получатели (\"До\" и \"Копие до\")" + SELECT_FIELD_SUBJECT: "Тема" + SELECT_FIELD_HEADER: "Заглавие" + SELECT_FIELD_SIZE: "Размер" + SELECT_TYPE_CONTAINS: "Съдържа" + SELECT_TYPE_NOT_CONTAINS: "Не съдържа" + SELECT_TYPE_MATCHES: "Съвпада с (поддържат се ? и *)" + SELECT_TYPE_NOT_MATCHES: "Не съвпада с (поддържат се ? и *)" + SELECT_TYPE_REGEXP: "Регулярен израз" + SELECT_TYPE_NOT_REGEXP: "Не регулярен израз" + SELECT_TYPE_EQUAL_TO: "Равно на" + SELECT_TYPE_NOT_EQUAL_TO: "Не е равно на" + SELECT_TYPE_OVER: "Над" + SELECT_TYPE_UNDER: "Под" + SELECT_MATCH_ANY: "Съвпада с КОЕТО И ДА Е правило от" + SELECT_MATCH_ALL: "Съвпада с ВСИЧКИ правила от" + MARK_AS_READ_LABEL: "Отбележи като прочетено" + REPLY_INTERVAL_LABEL: "За колко време (дни)" + KEEP_LABEL: "Запази" + STOP_LABEL: "Да не спира да обработва правилата" + EMAIL_LABEL: "Email" + VACATION_SUBJECT_LABEL: "Тема (незадължително)" + VACATION_MESSAGE_LABEL: "Съобщение" + VACATION_RECIPIENTS_LABEL: "Получатели (разделени със запетая)" + REJECT_MESSAGE_LABEL: "Отхвърли съобщението" + ALL_INCOMING_MESSAGES_DESC: "Всички пристигащи съобщения" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Избери системни папки" + SELECT_CHOOSE_ONE: "Избери един" + SELECT_UNUSE_NAME: "Не използвай" + LABEL_SENT: "Изпратени" + LABEL_DRAFTS: "Чернови" + LABEL_SPAM: "Спам" + LABEL_TRASH: "Кошче" + LABEL_ARCHIVE: "Архив" + BUTTON_CANCEL: "Отказ" + BUTTON_CLOSE: "Затвори" + NOTIFICATION_SENT: | + Не сте избрали системна папка, в която изпратените съобщения "Изпратени" да бъдат съхранявани след изпращането им. + Ако нежелаете да запазвате изпратено съобщение, моля, изберете опцията "Не използвай". + NOTIFICATION_DRAFTS: "Не сте избрали системна папка, в която съобщенията \"Чернови\" да бъдат съхранявани по време на съставянето на имейл." + NOTIFICATION_SPAM: | + Не сте избрали системна папка, в която съобщенията "Спам" да бъдат поставяни. + Ако желаете да премахнете съобщенията окончателно, моля, изберете опцята "Не използвай". + NOTIFICATION_TRASH: | + Не сте избрали системна папка, в която изтритите съобщения "Отпадък" да бъдат поставяни. + Ако желаете да премахнете съобщенията окончателно, моля изберете опцията "Не използвай". + NOTIFICATION_ARCHIVE: "Не сте избрали истемна папка, в която архивираните съобщения \"Архив\" да бъдат поставяни." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "Двустъпкова проверка" + LABEL_ENABLE_TWO_FACTOR: "Включи двустъпковата проверка" + LABEL_TWO_FACTOR_USER: "Потребител" + LABEL_TWO_FACTOR_STATUS: "Състояние" + LABEL_TWO_FACTOR_SECRET: "Тайна" + LABEL_TWO_FACTOR_BACKUP_CODES: "Резервни кодове" + BUTTON_CREATE: "Създай нова тайна" + BUTTON_ACTIVATE: "Активирай" + BUTTON_CLEAR: "Изчисти" + BUTTON_LOGOUT: "Излез" + BUTTON_DONE: "Готово" + BUTTON_TEST: "Тест" + LINK_TEST: "тест" + BUTTON_SHOW_SECRET: "Покажи тайната" + BUTTON_HIDE_SECRET: "Скрий тайната" + TWO_FACTOR_REQUIRE_DESC: "Вашият акаунт изисква двустъпкова проверка." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Настроена" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Не е настроена" + TWO_FACTOR_SECRET_DESC: > + Внесете тази информация във вашият Google Authenticator клиент (или друг TOTP + клиент) чрез предоставения QR код или чрез въвеждане на кода ръчно. + TWO_FACTOR_BACKUP_CODES_DESC: > + Ако не можете да получавате кодове от Google Authenticator (или друг TOTP + клиент), можете да използвате резервни кодове за влизане. След като използвате + някой, той става невалиден. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Не можете да промените настройките, преди да ги тествате." + TITLES: + LOADING: "Зареждане" + LOGIN: "Вписване" + MAILBOX: "Пощенска кутия" + SETTINGS: "Настройки" + COMPOSE: "Ново съобщение" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Файлът е твърде голям" + ERROR_FILE_PARTIALLY_UPLOADED: "Файлът е частично качен поради неизвестна грешка" + ERROR_NO_FILE_UPLOADED: "Няма качен файл" + ERROR_MISSING_TEMP_FOLDER: "Временният файл липсва" + ERROR_ON_SAVING_FILE: "Възникна неизвестна грешка при записването на файла" + ERROR_FILE_TYPE: "Невалиден тип на файла" + ERROR_UNKNOWN: "Възникна неизвестна грешка при качването на файла" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> ТЕКСТ" + TEXT_SWITCHER_RICH_FORMATTING: "Форматиран текст" + TEXT_SWITCHER_CONFIRM: "Форматирането и изображенията ще бъдат изгубени. Сигурни ли сте, че желаете да продължите?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Лични" + LABEL_GENERAL_NAME: "Общи" + LABEL_CONTACTS_NAME: "Контакти" + LABEL_FOLDERS_NAME: "Папки" + LABEL_ACCOUNTS_NAME: "Акаунти" + LABEL_IDENTITY_NAME: "Идентичност" + LABEL_IDENTITIES_NAME: "Идентичности" + LABEL_FILTERS_NAME: "Филтри" + LABEL_TEMPLATES_NAME: "Шаблони" + LABEL_SECURITY_NAME: "Сигурност" + LABEL_SOCIAL_NAME: "Социални" + LABEL_THEMES_NAME: "Теми" + LABEL_CHANGE_PASSWORD_NAME: "Парола" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Назад" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Филтри" + BUTTON_SAVE: "Запази" + BUTTON_ADD_FILTER: "Добави филтър" + BUTTON_DELETE: "Изтрий" + BUTTON_RAW_SCRIPT: "Използвай специфичен потребителски скрипт" + SUBNAME_NONE: "Няма" + SUBNAME_MOVE_TO: "Премести в \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Препрати към \"%EMAIL%\"" + SUBNAME_REJECT: "Откажи" + SUBNAME_VACATION_MESSAGE: "Съобщение в отпуска" + SUBNAME_DISCARD: "Отхвърли" + CAPABILITY_LABEL: "Способности" + LOADING_PROCESS: "Обнови списъка с филтри" + DELETING_ASK: "Сигурни ли си?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Промените трябва да се запаметят на сървъра." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Идентичност" + LABEL_DISPLAY_NAME: "Име" + LABEL_REPLY_TO: "Отговори на" + LABEL_SIGNATURE: "Подпис" + LABEL_ADD_SIGNATURE_TO_ALL: "Добави подпис към всички изходящи съобщения" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Сигурност" + LABEL_CONFIGURE_TWO_FACTOR: "Конфигурирай двустъпкова проверка" + LABEL_AUTOLOGOUT: "Автоматично излизане" + AUTOLOGIN_NEVER_OPTION_NAME: "Никога" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% минута(и)" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% час(а)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Общи" + LABEL_LANGUAGE: "Език" + LABEL_IDENTITY: "Идентичност" + LABEL_LAYOUT: "Стил" + LABEL_LAYOUT_NO_SPLIT: "Не разделяй" + LABEL_LAYOUT_VERTICAL_SPLIT: "Вертикално разделяне" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Хоризонтално разделяне" + LABEL_EDITOR: "Текстов редактор по подразбиране" + LABEL_EDITOR_HTML: "HTML" + LABEL_EDITOR_PLAIN: "Чист текст" + LABEL_EDITOR_HTML_FORCED: "HTML (задължително)" + LABEL_EDITOR_PLAIN_FORCED: "Чист текст (задължително)" + LABEL_ANIMATION: "Анимация в интерфейса" + LABEL_ANIMATION_FULL: "Пълна" + LABEL_ANIMATION_NORMAL: "Нормална" + LABEL_ANIMATION_NONE: "Никаква" + LABEL_VIEW_OPTIONS: "Настройки на изгледа" + LABEL_USE_PREVIEW_PANE: "Използвай поле за преглед" + LABEL_USE_CHECKBOXES_IN_LIST: "Показавай отметките в списъка" + LABEL_USE_THREADS: "Използвай групиране на съобщенията" + LABEL_REPLY_SAME_FOLDER: "Постави отговорите с папката на отговаряното съобщение" + LABEL_SHOW_IMAGES: "Винаги показвай външни картинки в текста на съобщението" + LABEL_SHOW_ANIMATION: "Покажи анимация" + LABEL_MESSAGE_PER_PAGE: "Съобщения на страница" + LABEL_NOTIFICATIONS: "Известия" + LABEL_SOUND_NOTIFICATION: "Звуково известяване" + LABEL_CHROME_NOTIFICATION_DESC: "Покажи известие при ново съобщение" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Блокирано от браузъра)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Контакти" + LABEL_CONTACTS_AUTOSAVE: "Автоматично добавяне на получателите към адресната ви книга" + LEGEND_CONTACTS_SYNC: "Отдалечено синхронизиране (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Разрешаване на отдалечено синхронизиране" + LABEL_CONTACTS_SYNC_SERVER: "Сървър" + LABEL_CONTACTS_SYNC_AB_URL: "URL на адресната книга" + LABEL_CONTACTS_SYNC_USER: "Потребител" + LABEL_CONTACTS_SYNC_PASSWORD: "Парола" + SETTINGS_THEMES: + LEGEND_THEMES: "Теми" + LEGEND_THEMES_CUSTOM: "Специфична настройка на темата" + LABEL_CUSTOM_TYPE: "Тип" + LABEL_CUSTOM_TYPE_LIGHT: "Светла" + LABEL_CUSTOM_TYPE_DARK: "Тъмна" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Фон" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Качи снимка за фон (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Файла е прекалено голям" + ERROR_FILE_TYPE_ERROR: "Невалиден тип (Само JPG или PNG)" + ERROR_UNKNOWN: "Възникна неизвестна грешка при качването на файла" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Свържи Google" + BUTTON_GOOGLE_DISCONNECT: "Разкачи Google" + MAIN_GOOGLE_DESC: "След включването на влизане чрез Google, можете да влизате в този акаунт чрез бутона Google на началния екран." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Свържи Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Рзкачи Facebook" + MAIN_FACEBOOK_DESC: "След включването на влизане чрез Facebook, можете да влизате в този акаунт чрез бутона Facebook на началния екран." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Свържи Twitter" + BUTTON_TWITTER_DISCONNECT: "Разкачи Twitter" + MAIN_TWITTER_DESC: "След включването на влизане чрез Twitter, можете да влизате в този акаунт чрез бутона Twitter на началния екран." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Списък с папки" + BUTTON_CREATE: "Създай папка" + BUTTON_SYSTEM: "Системни папки" + BUTTON_DELETE: "Изтриване" + BUTTON_SUBSCRIBE: "Абонирай се" + BUTTON_UNSUBSCRIBE: "Отписване" + LOADING_PROCESS: "Обнови списъка с папки" + CREATING_PROCESS: "Създаване на папка" + DELETING_PROCESS: "Изтриване на папка" + RENAMING_PROCESS: "Преименуване на папка" + DELETING_ASK: "Сигурни ли сте?" + TO_MANY_FOLDERS_DESC_1: "Имате прекалено много папки!" + TO_MANY_FOLDERS_DESC_2: "Ще се показват само част от тях, за да се избегнат проблеми с производителността." + HELP_DELETE_FOLDER: "Изтрий папка" + HELP_SHOW_HIDE_FOLDER: "Покажи/скрий папка" + HELP_CHECK_FOR_NEW_MESSAGES: "Провери/не проверявай за нови съобщения" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Списък с акаунти" + LEGEND_IDENTITIES: "Идентичности" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Акаунти и идентичности" + BUTTON_ADD_ACCOUNT: "Добавяне на акаунт" + BUTTON_ADD_IDENTITY: "Добавяне на идентичност" + BUTTON_DELETE: "Изтрий" + LOADING_PROCESS: "Обновяване на списъка с акаунти" + DELETING_ASK: "Сигурни ли сте?" + DEFAULT_IDENTITY_LABEL: "по подразбиране" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Идентичност" + LEGEND_IDENTITIES: "Допълнителни идентичности" + LABEL_DEFAULT: "По подразбиране" + LABEL_DISPLAY_NAME: "Име" + LABEL_REPLY_TO: "Отговори на" + LABEL_SIGNATURE: "Подпис" + LABEL_ADD_SIGNATURE_TO_ALL: "Добавяне на вашия подпис към всички изходящи съобщения" + BUTTON_ADD_IDENTITY: "Добавяне на идентичност" + BUTTON_DELETE: "Изтрий" + LOADING_PROCESS: "Обновяване на списъка с идентичности" + DELETING_ASK: "Сигурни ли сте?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Промяна на парола" + LABEL_CURRENT_PASSWORD: "Настояща парола" + LABEL_NEW_PASSWORD: "Нова парола" + LABEL_REPEAT_PASSWORD: "Потвърдете новата парола" + BUTTON_UPDATE_PASSWORD: "Задайте нова парола" + ERROR_PASSWORD_MISMATCH: "Паролите не съвпадат, моля, опитайте отново" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Внеси OpenPGP ключ" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Генерирай OpenPGP ключ" + TITLE_PRIVATE: "Частен" + TITLE_PUBLIC: "Публичен" + DELETING_ASK: "Сигурни ли сте?" + GENERATE_ONLY_HTTPS: "Само през HTTPS" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Автоматично запазване на чернова" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Помощ за клавишните комбинации" + TAB_MAILBOX: "Пощенска кутия" + TAB_MESSAGE_LIST: "Списък със съобщения" + TAB_MESSAGE_VIEW: "Изглед на съобщение" + TAB_COMPOSE: "Писане" + LABEL_OPEN_USER_DROPDOWN: "Отваряне на падащото меню за потребители" + LABEL_REPLY: "Отговори" + LABEL_REPLY_ALL: "Отговори до всички" + LABEL_FORWARD: "Препрати" + LABEL_FORWARD_MULTIPLY: "Препрати като прикачен файл" + LABEL_HELP: "Помощ" + LABEL_CHECK_ALL: "Провери всички съобщения" + LABEL_ARCHIVE: "Архивирай" + LABEL_DELETE: "Изтрий" + LABEL_OPEN_THREAD: "Отвори избраната нишка" + LABEL_MOVE: "Премести" + LABEL_READ: "Прочети избраните съобщения" + LABEL_UNREAD: "Маркирай като непрочетени избраните съобщения" + LABEL_IMPORTANT: "Важно, отбележи със флаг избраните съобщения" + LABEL_SEARCH: "Търсене" + LABEL_CANCEL_SEARCH: "Отказ от търсенето" + LABEL_FULLSCREEN_ENTER: "Цял екран (Изглед за преглед)" + LABEL_VIEW_MESSAGE_ENTER: "Преглед на съобщението (без изглед за преглед)" + LABEL_SWITCH_TO_MESSAGE: "Превключи фокуса върху избраното съобщение" + LABEL_SWITCH_TO_FOLDER_LIST: "Превключи фокуса върху списъка с папки" + LABEL_FULLSCREEN_TOGGLE: "Превключи на режим на цял екран" + LABEL_BLOCKQUOTES_TOGGLE: "Включи цитатите в съобщението" + LABEL_THREAD_NEXT: "Следващо съобщение в групираните" + LABEL_THREAD_PREV: "Предно съобщение в групираните" + LABEL_PRINT: "Принтиране" + LABEL_EXIT_FULLSCREEN: "Излез от режим на цял екран" + LABEL_CLOSE_MESSAGE: "Затвори съобщението (Няма изглед за преглед)" + LABEL_SWITCH_TO_LIST: "Превключи фокуса обратно към списъка със съобщения" + LABEL_OPEN_COMPOSE_POPUP: "Отвори прозорец за писане" + LABEL_MINIMIZE_COMPOSE_POPUP: "Намали прозореца за писане" + LABEL_OPEN_IDENTITIES_DROPDOWN: "отвори падащото меню с идентичности" + LABEL_SAVE_MESSAGE: "Запази съобщението" + LABEL_SEND_MESSAGE: "Изпрати съобщението" + LABEL_CLOSE_COMPOSE: "Затвори създаването" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "Няма публични ключове" + NO_PUBLIC_KEYS_FOUND_FOR: "Няма публичен ключ за \"%EMAIL%\"" + NO_PRIVATE_KEY_FOUND: "Няма частен ключ" + NO_PRIVATE_KEY_FOUND_FOR: "Няма частен ключ за \"%EMAIL%\"" + ADD_A_PUBLICK_KEY: "Добави публичен ключ" + SELECT_A_PRIVATE_KEY: "Избери частен ключ" + UNVERIFIRED_SIGNATURE: "Непроверен подпис" + DECRYPTION_ERROR: "Грешка при дешифрирането" + GOOD_SIGNATURE: "Валиден подпис за %USER%" + PGP_ERROR: "OpenPGP грешка: %ERROR%" + SPECIFY_FROM_EMAIL: "Моля въведете email адрес От" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Моля въведете поне един получател" + NOTIFICATIONS: + INVALID_TOKEN: "Невалиден токен" + AUTH_ERROR: "Неуспешно удостоверяване" + ACCESS_ERROR: "Грешка при опит за достъп" + CONNECTION_ERROR: "Не може да се свърже със сървъра" + CAPTCHA_ERROR: "Некорекно въведена CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Това социално ID не е присвоено към никой email акаунт. Влезте чрез email-а + и пуснете тази опция чрез Настройки. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Това социално ID не е присвоено към никой email акаунт. Влезте чрез email-а + и пуснете тази опция чрез Настройки. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Това социално ID не е присвоено към никой email акаунт. Влезте чрез email-а + и пуснете тази опция чрез Настройки. + DOMAIN_NOT_ALLOWED: "Този домейн не е разрешен" + ACCOUNT_NOT_ALLOWED: "Този акаунт не е разрешен" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Задължителна е двустъпкова проверка" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Грешка при двустъпковата проверка" + COULD_NOT_SAVE_NEW_PASSWORD: "Неуспешно запазване на новата парола" + CURRENT_PASSWORD_INCORRECT: "Текущата парола не е правилна" + NEW_PASSWORD_SHORT: "Паролата е твърде къса" + NEW_PASSWORD_WEAK: "Паролата е твърде лесна" + NEW_PASSWORD_FORBIDDENT: "Паролата съдържа забранени символи" + CONTACTS_SYNC_ERROR: "Грешка при синхронизацията" + CANT_GET_MESSAGE_LIST: "Не може да се изтегли списъка със съобщения" + CANT_GET_MESSAGE: "Не може да се изтегли съобщението" + CANT_DELETE_MESSAGE: "Не може да се изтрие съобщението" + CANT_MOVE_MESSAGE: "Не може да се премести съобщението" + CANT_SAVE_MESSAGE: "Не може да се запамети съобщението" + CANT_SEND_MESSAGE: "Не може да се изпрати съобщението" + INVALID_RECIPIENTS: "Невалидни получатели" + CANT_SAVE_FILTERS: "Не може да се запаметят филтрите" + CANT_GET_FILTERS: "Не могат да се изтеглят филтрите" + FILTERS_ARE_NOT_CORRECT: "Грешни филтри" + CANT_CREATE_FOLDER: "Не може да се създаде папка" + CANT_RENAME_FOLDER: "Не може да се преименува папка" + CANT_DELETE_FOLDER: "Не може да се изтрие папка" + CANT_DELETE_NON_EMPTY_FOLDER: "Не може да се изтрие папка, която не е празна" + CANT_SUBSCRIBE_FOLDER: "Не може да се абонира за папка" + CANT_UNSUBSCRIBE_FOLDER: "Не може да се махне абонамента за папка" + CANT_SAVE_SETTINGS: "Не могат да се запаметят настройките" + CANT_SAVE_PLUGIN_SETTINGS: "Не могат да се запаметят настройките" + DOMAIN_ALREADY_EXISTS: "Домейна вече съществува" + CANT_INSTALL_PACKAGE: "Не е възможно да се инсталира пакета" + CANT_DELETE_PACKAGE: "Не е възможно да се премахне пакета" + INVALID_PLUGIN_PACKAGE: "Невалиден пакет с приставка" + UNSUPPORTED_PLUGIN_PACKAGE: "Неподдържан пакет с приставка" + LICENSING_SERVER_IS_UNAVAILABLE: "Сървъра за абонамент е недостъпен" + LICENSING_DOMAIN_EXPIRED: "Абонаментът за този домейн е изтекъл." + LICENSING_DOMAIN_BANNED: "Абонаментът за този домейн е забранен." + DEMO_SEND_MESSAGE_ERROR: "С цел сугурност, на този акаунт е забранено да изпраща съобщения до външни email адреси!" + DEMO_ACCOUNT_ERROR: "С цел сигурност, това действие не е разрешено за този акаунт!" + ACCOUNT_ALREADY_EXISTS: "Акаунта вече съществува" + ACCOUNT_DOES_NOT_EXIST: "Акаунта не съществува" + MAIL_SERVER_ERROR: "Възникна грешка при комуникацията с пощенския сървър" + INVALID_INPUT_ARGUMENT: "Невалидни входни аргументи" + UNKNOWN_ERROR: "Неизвестна грешка" + STATIC: + BACK_LINK: "Презареди" + DOMAIN_LIST_DESC: "Списък то домейни, достъпни за тази поща" + PHP_EXSTENSIONS_ERROR_DESC: "Задължително PHP разширение не е налично във вашата PHP конфигурация!" + PHP_VERSION_ERROR_DESC: "Вашата персия на PHP (%VERSION%) е по-стара от минималната 5.3.0!" + NO_SCRIPT_TITLE: "За това приложение е необходим JavaScript." + NO_SCRIPT_DESC: | + Поддръжката на JavaScript не е налична във вашия браузър. + Моля, разрешете поддръжката на JavaScript в настройките на вашия браузър и опитайте отново. + NO_COOKIE_TITLE: "За това приложение е необходимо да се поддъжат Бисквитки." + NO_COOKIE_DESC: | + Поддръжката на Бисквитки не е налична във вашия браузър. + Моля, разрешете поддръжката на Бисквитки в настройките на вашия браузър и опитайте отново. + BAD_BROWSER_TITLE: "Вашият браузър е остарял." + BAD_BROWSER_DESC: | + За да използвате всички функции на приложението, + изтеглете и инсталирайте един от тези браузъри: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/cs_CZ.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/cs_CZ.yml new file mode 100755 index 00000000..970aa02e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/cs_CZ.yml @@ -0,0 +1,704 @@ +cs_CZ: + LOGIN: + LABEL_EMAIL: "Email" + LABEL_LOGIN: "Uživatelské jméno" + LABEL_PASSWORD: "Heslo" + LABEL_SIGN_ME: "Zapamatovat" + LABEL_VERIFICATION_CODE: "Ověřovací kód" + LABEL_DONT_ASK_VERIFICATION_CODE: "Nepožadovat ověřovací kód 2 týdny." + BUTTON_SIGN_IN: "Přihlásit" + TITLE_SIGN_IN_GOOGLE: "Přihlásit pomocí Google" + TITLE_SIGN_IN_FACEBOOK: "Přihlásit pomocí Facebook" + TITLE_SIGN_IN_TWITTER: "Přihlásit pomocí Twitter" + LABEL_FORGOT_PASSWORD: "Zapomenout heslo" + LABEL_REGISTRATION: "Registrace" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Přidat účet" + BUTTON_SETTINGS: "Nastavení" + BUTTON_HELP: "Nápověda" + BUTTON_LOGOUT: "Odhlásit" + MOBILE: + BUTTON_MOBILE_VERSION: "Mobilní verze" + BUTTON_DESKTOP_VERSION: "Desktop verze" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Hledat" + TITLE_ADV: "Rozšířené hledání" + LABEL_ADV_FROM: "Odesílatel" + LABEL_ADV_TO: "Příjemce" + LABEL_ADV_SUBJECT: "Předmět" + LABEL_ADV_TEXT: "Text" + LABEL_ADV_HAS_ATTACHMENT: "S přílohu" + LABEL_ADV_HAS_ATTACHMENTS: "S přílohami" + LABEL_ADV_FLAGGED: "Označené hvězdičkou" + LABEL_ADV_UNSEEN: "Nepřečtené" + LABEL_ADV_DATE: "Datum" + LABEL_ADV_DATE_ALL: "Kdykoliv" + LABEL_ADV_DATE_3_DAYS: "Ne starší než 3 dny" + LABEL_ADV_DATE_7_DAYS: "Ne starší než týden" + LABEL_ADV_DATE_MONTH: "Ne starší než měsíc" + LABEL_ADV_DATE_3_MONTHS: "Ne starší než 3 měsíce" + LABEL_ADV_DATE_6_MONTHS: "Ne starší než 6 měsíců" + LABEL_ADV_DATE_YEAR: "Ne starší než 1 rok" + BUTTON_ADV_SEARCH: "Hledat" + PREVIEW_POPUP: + FULLSCREEN: "Celá obrazovka" + ZOOM: "Zvětšit/zmenšit" + CLOSE: "Zavřít (Esc)" + LOADING: "Načítám..." + GALLERY_PREV: "Předchozí" + GALLERY_NEXT: "Další" + GALLERY_COUNTER: "%curr% z %total%" + IMAGE_ERROR: "Obrázek se nepodařilo načíst." + AJAX_ERROR: "Obsah sa nepodařilo načíst." + FOLDER_LIST: + BUTTON_COMPOSE: "Vytvořit" + BUTTON_CONTACTS: "Adresář" + BUTTON_NEW_MESSAGE: "Nová zpráva" + INBOX_NAME: "Přijaté" + SENT_NAME: "Odeslané" + DRAFTS_NAME: "Koncepty" + SPAM_NAME: "Spam" + TRASH_NAME: "Koš" + ARCHIVE_NAME: "Archiv" + QUOTA: + TITLE: "Využití kvóty" + MESSAGE_LIST: + BUTTON_RELOAD: "Obnovit seznam zpráv" + BUTTON_MOVE_TO: "Přesunout do" + BUTTON_DELETE: "Odstranit" + BUTTON_ARCHIVE: "Archivovat" + BUTTON_SPAM: "Je to spam" + BUTTON_NOT_SPAM: "Není to spam" + BUTTON_EMPTY_FOLDER: "Vyprázdnit složku" + BUTTON_MULTY_FORWARD: "Přeposlat zprávy" + BUTTON_DELETE_WITHOUT_MOVE: "Navždy odstranit" + BUTTON_MORE: "Více" + MENU_SET_SEEN: "Označit jako přečtené" + MENU_SET_ALL_SEEN: "Označit vše jako přečtené" + MENU_UNSET_SEEN: "Označit jako neprečtené" + MENU_SET_FLAG: "Označit hvězdičkou" + MENU_UNSET_FLAG: "Zrušit označení hvězdičkou" + MENU_SELECT_ALL: "Vše" + MENU_SELECT_NONE: "Žádné" + MENU_SELECT_INVERT: "Invertovat" + MENU_SELECT_UNSEEN: "Nepřečtené" + MENU_SELECT_SEEN: "Přečtené" + MENU_SELECT_FLAGGED: "Označené" + MENU_SELECT_UNFLAGGED: "Neoznačené" + EMPTY_LIST: "Seznam je prázdný" + EMPTY_SEARCH_LIST: "Vašemu vyhledávání neodpovídají žádné zprávy." + SEARCH_RESULT_FOR: "Výsledky vyhledávání pro \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "Zpět na seznam zpráv" + LIST_LOADING: "Načítám" + EMPTY_SUBJECT_TEXT: "(Bez předmětu)" + PUT_MESSAGE_HERE: "Přesuňte zprávu sem pro její zobrazení v seznamu" + TODAY_AT: "Dnes v %TIME%" + YESTERDAY_AT: "Včera v %TIME%" + SEARCH_PLACEHOLDER: "Hledat" + NEW_MESSAGE_NOTIFICATION: "Máte %COUNT% nových zpráv!" + QUOTA_SIZE: "Používáte %SIZE% (%PROC%%) z vašich %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Editovat" + BUTTON_BACK: "Zpět" + BUTTON_CLOSE: "Zavřít" + BUTTON_DELETE: "Odstranit" + BUTTON_ARCHIVE: "Archivovat" + BUTTON_SPAM: "Je to SPAM" + BUTTON_NOT_SPAM: "Není to SPAM" + BUTTON_MOVE_TO: "Přesunout do" + BUTTON_MORE: "Více" + BUTTON_REPLY: "Odpovědět" + BUTTON_REPLY_ALL: "Odpovědaě všem" + BUTTON_FORWARD: "Přeposlat" + BUTTON_FORWARD_AS_ATTACHMENT: "Přeposlat jako přílohu" + BUTTON_EDIT_AS_NEW: "Použit jako šablonu" + BUTTON_SHOW_IMAGES: "Zobrazit externí obrázky" + BUTTON_NOTIFY_READ_RECEIPT: "Odesílatel požádal o potvrzení přečtení této zprávy." + BUTTON_IN_NEW_WINDOW: "Zobrazit v novém okně" + BUTTON_THREAD_LIST: "Konverzace" + BUTTON_THREAD_PREV: "Předchozí" + BUTTON_THREAD_NEXT: "Další" + BUTTON_THREAD_MORE: "Více zpráv" + MENU_HEADERS: "Zobrazit hlavičku zprávy" + MENU_VIEW_ORIGINAL: "Zobrazit zdroj" + MENU_DOWNLOAD_ORIGINAL: "Stáhnout jako soubor .eml" + MENU_FILTER_SIMILAR: "Filtrovat zprávy jako tato" + MENU_PRINT: "Tisknout" + EMPTY_SUBJECT_TEXT: "(Bez předmětu)" + LABEL_SUBJECT: "Předmět" + LABEL_DATE: "Datum" + LABEL_FROM: "Odesílatel" + LABEL_FROM_SHORT: "Od" + LABEL_TO: "Příjemce" + LABEL_TO_SHORT: "Komu" + LABEL_CC: "Kopie" + LABEL_BCC: "Skrytá kopie" + LABEL_REPLY_TO: "Adresa odpovědi" + PRINT_LABEL_FROM: "Odesílatel" + PRINT_LABEL_TO: "Příjemce" + PRINT_LABEL_CC: "Kopie" + PRINT_LABEL_BCC: "Skrytá kopie" + PRINT_LABEL_REPLY_TO: "Adresa odpovědi" + PRINT_LABEL_DATE: "Datum" + PRINT_LABEL_SUBJECT: "Předmět" + PRINT_LABEL_ATTACHMENTS: "Přílohy" + MESSAGE_LOADING: "Načítám" + MESSAGE_VIEW_DESC: "Vyberte zprávu ze seznamu pro její zobrazení zde." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Heslo" + PGP_SIGNED_MESSAGE_DESC: "Zpráva podepsaná OpenPGP (klikněte pro ověření)" + PGP_ENCRYPTED_MESSAGE_DESC: "Zpráva šifrovaná OpenPGP (klikněte pro dešifraci)" + LINK_DOWNLOAD_AS_ZIP: "Stáhnout jako zip" + LINK_SAVE_TO_OWNCLOUD: "Uložit do ownCloud" + LINK_SAVE_TO_DROPBOX: "Uložit do Dropbox" + READ_RECEIPT: + SUBJECT: "Potvrzení o zobrazení zprávy - %SUBJECT%" + BODY: | + Toto je potrvzení o zaslání emailu na adresu %READ-RECEIPT%. + + Poznámka: Toto potvrzení zajištujě, že zpráva byla zobrazena v poštovní schrnánce příjemce. Nezajišťuje, že ji příjemce čelt a rozuměl jí. + SUGGESTIONS: + SEARCHING_DESC: "Hledám..." + CONTACTS: + LEGEND_CONTACTS: "Adresář" + SEARCH_INPUT_PLACEHOLDER: "Hledat" + BUTTON_ADD_CONTACT: "Přidat kontakt" + BUTTON_CREATE_CONTACT: "Vytvořit" + BUTTON_UPDATE_CONTACT: "Aktualizovat" + BUTTON_IMPORT: "Importovat (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Exportovat (vcf, vCard)" + BUTTON_EXPORT_CSV: "Exportovat (csv)" + ERROR_IMPORT_FILE: "Chyba importu (nesprávny formát souboru)" + LIST_LOADING: "Načítám" + EMPTY_LIST: "Nemáte žádné kontakty" + EMPTY_SEARCH: "Nebyly nalezeny žádné kontakty" + CLEAR_SEARCH: "Smazat vyhledávání" + CONTACT_VIEW_DESC: "Vyberte kontakt ze seznamu pro zobrazení zde." + LABEL_DISPLAY_NAME: "Zobrazit jako" + LABEL_EMAIL: "Email" + LABEL_PHONE: "Telefon" + LABEL_WEB: "Web" + LABEL_BIRTHDAY: "Narozeniny" + LINK_ADD_EMAIL: "Přidat email" + LINK_ADD_PHONE: "Přidat telefon" + LINK_BIRTHDAY: "Narozeniny" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Zadejte zobrazované jméno" + PLACEHOLDER_ENTER_LAST_NAME: "Zadejte příjmení" + PLACEHOLDER_ENTER_FIRST_NAME: "Zadejte jméno" + PLACEHOLDER_ENTER_NICK_NAME: "Zadejte přezdívku" + LABEL_READ_ONLY: "Jen pro čtění" + LABEL_SHARE: "Sdílet" + ADD_MENU_LABEL: "Přidat" + ADD_MENU_NICKNAME: "Přezdívka" + ADD_MENU_NOTES: "Poznámka" + ADD_MENU_EMAIL: "Email" + ADD_MENU_PHONE: "Telefon" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Adresa" + ADD_MENU_BIRTHDAY: "Narozeniny" + ADD_MENU_TAGS: "Tagy" + BUTTON_SHARE_NONE: "Žádné" + BUTTON_SHARE_ALL: "Vše" + BUTTON_SYNC: "Synchronizace (CardDAV)" + COMPOSE: + TITLE_FROM: "Odesílatel" + TITLE_TO: "Příjemce" + TITLE_CC: "Kopie" + TITLE_BCC: "Skrytá kopie" + TITLE_REPLY_TO: "Odpovědět" + TITLE_SUBJECT: "Předmět" + LINK_SHOW_INPUTS: "zobrazit všechna pole" + BUTTON_SEND: "Odeslat" + BUTTON_SAVE: "Uložit" + BUTTON_DELETE: "Odstranit" + BUTTON_CANCEL: "Zrušit" + BUTTON_MINIMIZE: "Minimalizovat" + SAVED_TIME: "Uložené v %TIME%" + SAVED_ERROR_ON_SEND: "Zpráva byla odesláná, ale nebyla uložená do složky odeslaných zpráv." + DISCARD_UNSAVED_DATA: "Neuložit změny?" + ATTACH_FILES: "Připojit soubory" + ATTACH_DROP_FILES_DESC: "Soubory přetáhněte sem" + ATTACH_ITEM_CANCEL: "Zrušit" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" + FORWARD_MESSAGE_TOP_TITLE: "-------- Forwarded message -------" + FORWARD_MESSAGE_TOP_FROM: "Odesílatel" + FORWARD_MESSAGE_TOP_TO: "Příjemce" + FORWARD_MESSAGE_TOP_CC: "Kopie" + FORWARD_MESSAGE_TOP_SENT: "Odeslat" + FORWARD_MESSAGE_TOP_SUBJECT: "Předmět" + EMPTY_TO_ERROR_DESC: "Zadejte prosím alespoň jednoho příjemce" + NO_ATTACHMENTS_HERE_DESC: "Žádné přílohy." + ATTACHMENTS_ERROR_DESC: "Upozornění! Některé přílohy nebyly nahrány." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Některé přílohy ještě nebyly nahrány" + BUTTON_REQUEST_READ_RECEIPT: "Vyžádat si potvrzení o příjetí" + BUTTON_MARK_AS_IMPORTANT: "Označit jako důležité" + BUTTON_OPEN_PGP: "OpenPGP (jen Plain Text)" + BUTTON_REQUEST_DSN: "Request a delivery receipt" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Zavřít" + POPUPS_ASK: + BUTTON_YES: "Ano" + BUTTON_NO: "Ne" + DESC_WANT_CLOSE_THIS_WINDOW: "Opravdu chcete zavřít toto okno?" + DESC_WANT_DELETE_MESSAGES: "Opravdu chcete odstranit tyto zprávy?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Zvolte jazyk" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Přidat účet?" + BUTTON_ADD_ACCOUNT: "Přidat" + TITLE_UPDATE_ACCOUNT: "Upravit účet?" + BUTTON_UPDATE_ACCOUNT: "Upravit" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Opravdu přidat?" + TITLE_UPDATE_IDENTITY: "Uložit změny?" + BUTTON_ADD_IDENTITY: "Přidat" + BUTTON_UPDATE_IDENTITY: "Uložit" + LABEL_EMAIL: "Email" + LABEL_NAME: "Jméno" + LABEL_REPLY_TO: "Adresa odpovědi" + LABEL_SIGNATURE: "Podpis" + LABEL_CC: "Kopie" + LABEL_BCC: "Skrytá" + LABEL_SIGNATURE_INSERT_BEFORE: "V odpovědích vložit podpis před citovaný text." + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Vytvořit složku?" + LABEL_NAME: "Název složky" + LABEL_PARENT: "Nadřazená složka" + BUTTON_CREATE: "Vytvořit" + BUTTON_CANCEL: "Zrušit" + BUTTON_CLOSE: "Zavřít" + TITLE_CREATING_PROCESS: "Vytvářím složku" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Odstranit všechny zprávy ve složce?" + BUTTON_CLEAR: "Vyčistit" + BUTTON_CANCEL: "Zrušit" + BUTTON_CLOSE: "Zavřít" + DANGER_DESC_WARNING: "Upozornění!" + DANGER_DESC_HTML_1: "Chystáte se nenávratně odstranit všechny zprávy ze složky %FOLDER%." + DANGER_DESC_HTML_2: "Tento proces není možné přerušit." + TITLE_CLEARING_PROCESS: "Odstraňuje se složka..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Import OpenPGP klíče" + BUTTON_IMPORT_OPEN_PGP_KEY: "Import" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "Zobrazit OpenPGP klíč" + BUTTON_SELECT: "Vybart" + BUTTON_CLOSE: "Zavřít" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Generovat OpenPGP klíče" + LABEL_EMAIL: "Email" + LABEL_NAME: "Jméno" + LABEL_PASSWORD: "Heslo" + LABEL_KEY_BIT_LENGTH: "Délka klíče" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generovat" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP Podpis/Šifrování" + LABEL_SIGN: "Podpis" + LABEL_ENCRYPT: "Šifrování" + LABEL_PASSWORD: "Heslo" + BUTTON_SIGN: "Podepsat" + BUTTON_ENCRYPT: "Šifrovat" + BUTTON_SIGN_AND_ENCRYPT: "Podepsat a šifrovat" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP Dešifrování" + LABEL_KEY: "Soukromý klíč" + LABEL_PASSWORD: "Heslo" + BUTTON_DECRYPT: "Dešifrovat" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "Dvoufázové ověření" + LABEL_CODE: "Kód" + BUTTON_TEST: "Test" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Vytvořit filtr?" + TITLE_EDIT_FILTER: "Změnit filtr?" + FILTER_NAME: "Jméno" + LEGEND_CONDITIONS: "Podmínka" + LEGEND_ACTIONS: "Akce" + BUTTON_DONE: "Dokončit" + BUTTON_ADD_CONDITION: "Přidat podmínku" + SELECT_ACTION_NONE: "Nic" + SELECT_ACTION_MOVE_TO: "Přesunout do" + SELECT_ACTION_FORWARD_TO: "Přesměrovat do" + SELECT_ACTION_REJECT: "Odmítnout" + SELECT_ACTION_VACATION_MESSAGE: "Odpověď v nepřítomnosti" + SELECT_ACTION_DISCARD: "Zahodit" + SELECT_FIELD_FROM: "Od" + SELECT_FIELD_RECIPIENTS: "Přijemci (Komu nebo Kopie)" + SELECT_FIELD_SUBJECT: "Předmět" + SELECT_FIELD_HEADER: "Hlavička" + SELECT_FIELD_SIZE: "Velikost" + SELECT_TYPE_CONTAINS: "Obsahuje" + SELECT_TYPE_NOT_CONTAINS: "Neobsahuje" + SELECT_TYPE_MATCHES: "Odpovídá (můžete použit * a ? )" + SELECT_TYPE_NOT_MATCHES: "Neodpovídá (můžete použit * a ? )" + SELECT_TYPE_REGEXP: "Regexp" + SELECT_TYPE_NOT_REGEXP: "Not Regexp" + SELECT_TYPE_EQUAL_TO: "Rovná se" + SELECT_TYPE_NOT_EQUAL_TO: "Nerovná se" + SELECT_TYPE_OVER: "Over" + SELECT_TYPE_UNDER: "Under" + SELECT_MATCH_ANY: "Vyhovuje alespoň jednomu pravidlu" + SELECT_MATCH_ALL: "Vyhovuje všem pravidlům" + MARK_AS_READ_LABEL: "Odznačit jako přečtené" + REPLY_INTERVAL_LABEL: "Interval odpovědi (dny)" + KEEP_LABEL: "Zachovat" + STOP_LABEL: "Neukončovat zpracování pravidel" + EMAIL_LABEL: "Email" + VACATION_SUBJECT_LABEL: "Předmět (volitelný)" + VACATION_MESSAGE_LABEL: "Zpráva" + VACATION_RECIPIENTS_LABEL: "Příjemci (odděleni čárkou)" + REJECT_MESSAGE_LABEL: "Odmítnout zprávu" + ALL_INCOMING_MESSAGES_DESC: "Všechny příchozí zprávy" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Spravovat systémové složky" + SELECT_CHOOSE_ONE: "Vybrat" + SELECT_UNUSE_NAME: "Nepoužívat" + LABEL_SENT: "Odeslané" + LABEL_DRAFTS: "Koncepty" + LABEL_SPAM: "Spam" + LABEL_TRASH: "Koš" + LABEL_ARCHIVE: "Archiv" + BUTTON_CANCEL: "Zrušit" + BUTTON_CLOSE: "Zavřít" + NOTIFICATION_SENT: | + Nevybrali jste systémovou složku "Odeslané" kam budou uložené zprávy po jejich odeslání. + Pokud nechcete ukládat odeslané zprávy, vyberete možnost "Nepoužívat". + NOTIFICATION_DRAFTS: "Nevybrali jste systémovou složku pro \"Koncepty\" kam jsou ukládány zprávy během jejich psaní." + NOTIFICATION_SPAM: | + Nevybrali jste systémovou složku pro "Spam" kam je ukládána nevyžádaná pošta. + Pokud chcete tyto zprávy odstranit natrvalo, vyberte prosím možnost "Nepoužívat". + NOTIFICATION_TRASH: | + Nevybrali jste systémovou složku pro "Koš" kam jsou zprávy přesunuté pro jejich odstranění. + Pokud chcete zprávy odstranit natrvalo, vyberte prosím možnost "Nepoužívat". + NOTIFICATION_ARCHIVE: "Nevybrali jste systémovou složku \"Archiv\", kam se ukládají archivované zprávy." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "Dvoufázové ověření" + LABEL_ENABLE_TWO_FACTOR: "Povlit dvoufázové ověření" + LABEL_TWO_FACTOR_USER: "Uživatel" + LABEL_TWO_FACTOR_STATUS: "Status" + LABEL_TWO_FACTOR_SECRET: "Secret" + LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" + BUTTON_CREATE: "Create New Secret" + BUTTON_ACTIVATE: "Aktivovat" + BUTTON_CLEAR: "Clear" + BUTTON_LOGOUT: "Odhlásit" + BUTTON_DONE: "Hotovo" + BUTTON_TEST: "Test" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Show Secret" + BUTTON_HIDE_SECRET: "Hide Secret" + TWO_FACTOR_REQUIRE_DESC: "Váš účet vyžaduje nastavení dvoufázového ověření" + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Nastaveno" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Nenastaveno" + TWO_FACTOR_SECRET_DESC: >- + Import this info into your Google Authenticator client (or other TOTP client) + using the provided QR code below or by entering the code manually. + TWO_FACTOR_BACKUP_CODES_DESC: >- + If you can't receive codes via Google Authenticator, you can use backup codes + to sign in. After you’ve used a backup code to sign in, it will become inactive. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." + TITLES: + LOADING: "Načítám" + LOGIN: "Uživatelské jméno" + MAILBOX: "Schránka zpráv" + SETTINGS: "Nastavení" + COMPOSE: "Napsat" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Soubor je příliš velký." + ERROR_FILE_PARTIALLY_UPLOADED: "Z důvodu neznámé chyby byl soubor nahrán jen částečně" + ERROR_NO_FILE_UPLOADED: "Soubor nebyl nahrán" + ERROR_MISSING_TEMP_FOLDER: "Chybí dočasný soubor" + ERROR_ON_SAVING_FILE: "Nastala neznámá chyba při ukládání" + ERROR_FILE_TYPE: "Nesprávny typ souboru" + ERROR_UNKNOWN: "Nastala neznámá chyba při nahrávaní" + EDITOR: + TEXT_SWITCHER_RICH_FORMATTING: "Formátovaný text" + TEXT_SWITCHER_CONFIRM: "Formátování textu a obrázky budou odstraněné. Chcete pokračovat?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Osobní" + LABEL_GENERAL_NAME: "Všeobecné" + LABEL_CONTACTS_NAME: "Kontakty" + LABEL_FOLDERS_NAME: "Složky" + LABEL_ACCOUNTS_NAME: "Účty" + LABEL_IDENTITY_NAME: "Identita" + LABEL_IDENTITIES_NAME: "Identity" + LABEL_FILTERS_NAME: "Filtry" + LABEL_TEMPLATES_NAME: "Šablony" + LABEL_SECURITY_NAME: "Zabezpečení" + LABEL_SOCIAL_NAME: "Sociální" + LABEL_THEMES_NAME: "Motivy" + LABEL_CHANGE_PASSWORD_NAME: "Heslo" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Zpět" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filtry" + BUTTON_SAVE: "Uložit" + BUTTON_ADD_FILTER: "Přidat filtr" + BUTTON_DELETE: "Smazat" + BUTTON_RAW_SCRIPT: "Použít uživatelský skript" + SUBNAME_NONE: "Žádný" + SUBNAME_MOVE_TO: "Přesunout do \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Přeposlat to \"%EMAIL%\"" + SUBNAME_REJECT: "Odmítnout" + SUBNAME_VACATION_MESSAGE: "Odpověď v nepřítomnosti" + SUBNAME_DISCARD: "Zahodit" + CAPABILITY_LABEL: "Capability" + LOADING_PROCESS: "Aktualizovat seznam filtrů" + DELETING_ASK: "Opravdu to chcete?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Změny musí být uloženy na serveru." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identita" + LABEL_DISPLAY_NAME: "Jméno" + LABEL_REPLY_TO: "Adresa pro odpovědi" + LABEL_SIGNATURE: "Podpis" + LABEL_ADD_SIGNATURE_TO_ALL: "Připojit podpis ke všem odchozím zprávám" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Zapezpečení" + LABEL_CONFIGURE_TWO_FACTOR: "Nastavení dvoufázového ověření" + LABEL_AUTOLOGOUT: "Automatické odhlášení" + AUTOLOGIN_NEVER_OPTION_NAME: "Nikdy" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minut" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Všeobecné" + LABEL_LANGUAGE: "Jazyk" + LABEL_IDENTITY: "Identity" + LABEL_LAYOUT: "Layout" + LABEL_LAYOUT_NO_SPLIT: "Nerozdělovat" + LABEL_LAYOUT_VERTICAL_SPLIT: "Vertikální rozdělení" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontální rozdělění" + LABEL_EDITOR: "Přednastavený editor zpráv" + LABEL_EDITOR_HTML: "Html" + LABEL_EDITOR_PLAIN: "Text" + LABEL_EDITOR_HTML_FORCED: "Html (vynucený)" + LABEL_EDITOR_PLAIN_FORCED: "Plain (vynucený)" + LABEL_ANIMATION: "Animace prostředí" + LABEL_ANIMATION_FULL: "Všechny" + LABEL_ANIMATION_NORMAL: "Normální" + LABEL_ANIMATION_NONE: "Žádné" + LABEL_VIEW_OPTIONS: "Možnosti zobrazení" + LABEL_USE_PREVIEW_PANE: "Používate panel rychlého zobrazení" + LABEL_USE_CHECKBOXES_IN_LIST: "Zobrazení zaškrtávacích políček v seznamu" + LABEL_USE_THREADS: "Zobrazit jako konverzace" + LABEL_REPLY_SAME_FOLDER: "Ukládat odpovědi do složky se zprávou, které se týkají" + LABEL_SHOW_IMAGES: "Vždy zobrazovat obrázky v těle správy" + LABEL_SHOW_ANIMATION: "Animovat" + LABEL_MESSAGE_PER_PAGE: "Zpráv na stranu" + LABEL_NOTIFICATIONS: "Notifikace" + LABEL_SOUND_NOTIFICATION: "Zvukové notifikace" + LABEL_CHROME_NOTIFICATION_DESC: "Zobrazovat upozornění na nové zprávy" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Zablokované prohlížečem)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Kontakty" + LABEL_CONTACTS_AUTOSAVE: "Automaticky přidávat adresy příjemců do Adresáře" + LEGEND_CONTACTS_SYNC: "Vzdálená synchronizace (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Povolit vzdálenou synchronizaci" + LABEL_CONTACTS_SYNC_SERVER: "Server" + LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" + LABEL_CONTACTS_SYNC_USER: "Uživatel" + LABEL_CONTACTS_SYNC_PASSWORD: "Heslo" + SETTINGS_THEMES: + LEGEND_THEMES: "Motivy" + LEGEND_THEMES_CUSTOM: "Správa vlastního motivu" + LABEL_CUSTOM_TYPE: "Typ" + LABEL_CUSTOM_TYPE_LIGHT: "Světlý" + LABEL_CUSTOM_TYPE_DARK: "Tmavý" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Pozadí" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Nahrát obrázek pozadí (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Soubor je příliš velký" + ERROR_FILE_TYPE_ERROR: "Nesprávný typ souboru (povolené jsou pouze JPG a PNG)" + ERROR_UNKNOWN: "Nastala neznámá chyba při nahrávání souboru" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Propojit Google" + BUTTON_GOOGLE_DISCONNECT: "Odpojit Google" + MAIN_GOOGLE_DESC: "Po povolení přihlášení přes Google se můžete na úvodní stránce přihlásit přes tlačítko Google." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Propojit Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Odpojit Facebook" + MAIN_FACEBOOK_DESC: "Po povolení přihlášení přes Facebook se můžete na úvodní stránce přihlásit přes tlačítko Facebook." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Propojit Twitter" + BUTTON_TWITTER_DISCONNECT: "Odpojit Twitter" + MAIN_TWITTER_DESC: "Po povolení přihlášení přes Twitter se můžete na úvodní stránce přihlásit přes tlačítko Twitter." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Seznam složek" + BUTTON_CREATE: "Vytvořit složku" + BUTTON_DELETE: "Odstranit" + BUTTON_SUBSCRIBE: "Přihlásit se" + BUTTON_UNSUBSCRIBE: "Odhlásit se" + LOADING_PROCESS: "Aktualizuji seznam složek" + CREATING_PROCESS: "Vytvářím složku" + DELETING_PROCESS: "Odstraňuji složku" + RENAMING_PROCESS: "Přejmenovávám složku" + DELETING_ASK: "Opravdu to chcete?" + TO_MANY_FOLDERS_DESC_1: "Máte moc složek!" + TO_MANY_FOLDERS_DESC_2: "Můžeme zobrazit jen část z nich, abychom zabránili problémům s výkonem." + HELP_DELETE_FOLDER: "Smazat složku" + HELP_SHOW_HIDE_FOLDER: "Zobrazit/skrýt složku" + HELP_CHECK_FOR_NEW_MESSAGES: "Kontrovat/nekontrolovat nové příchozí zprávy" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Seznam účtů" + LEGEND_IDENTITIES: "Identity" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Účty a identity" + BUTTON_ADD_ACCOUNT: "Přidat účet" + BUTTON_ADD_IDENTITY: "Přidat identitu" + BUTTON_DELETE: "Odstranit" + LOADING_PROCESS: "Aktualizace seznamu účtů" + DELETING_ASK: "Opravdu to chcete?" + DEFAULT_IDENTITY_LABEL: "výchozí" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identita" + LEGEND_IDENTITIES: "Další identity" + LABEL_DEFAULT: "Výchozí" + LABEL_DISPLAY_NAME: "Jméno" + LABEL_REPLY_TO: "Adresa pro odpověď" + LABEL_SIGNATURE: "Podpis" + LABEL_ADD_SIGNATURE_TO_ALL: "Připojit ke všem odeslaným zprávám" + BUTTON_ADD_IDENTITY: "Přidat Identitu" + BUTTON_DELETE: "Odstranit" + LOADING_PROCESS: "Aktualizace seznamu identit" + DELETING_ASK: "Opravdu to chcete?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Změnit heslo" + LABEL_CURRENT_PASSWORD: "Současné heslo" + LABEL_NEW_PASSWORD: "Nové heslo" + LABEL_REPEAT_PASSWORD: "Nové heslo znovu" + BUTTON_UPDATE_PASSWORD: "Nastavit nové heslo" + ERROR_PASSWORD_MISMATCH: "Hesla nejsou stejná, zkuste to znovu" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Importovat OpenPGP klíč" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generovat OpenPGP klíče" + TITLE_PRIVATE: "Soukromý" + TITLE_PUBLIC: "Veřejný" + DELETING_ASK: "Opravdu to chcete?" + GENERATE_ONLY_HTTPS: "Pouze HTTPS" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Klávesové zkratky" + TAB_MAILBOX: "Schránka" + TAB_MESSAGE_LIST: "Seznam zpráv" + TAB_MESSAGE_VIEW: "Detail zprávy" + TAB_COMPOSE: "Napsat" + LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" + LABEL_REPLY: "Odpovědět" + LABEL_REPLY_ALL: "Odpovědět všem" + LABEL_FORWARD: "Přeposlat" + LABEL_FORWARD_MULTIPLY: "Přeposlat jako přílohu" + LABEL_HELP: "Nápověda" + LABEL_CHECK_ALL: "Zjistit nové zprávy" + LABEL_ARCHIVE: "Archivovat" + LABEL_DELETE: "Smazat" + LABEL_OPEN_THREAD: "Otevřít označenou konverzaci" + LABEL_MOVE: "Přesunout" + LABEL_READ: "Označit vybrané zprávy jako přečtené" + LABEL_UNREAD: "Označit vybrané zprávy jako nepřečtené" + LABEL_IMPORTANT: "Označit vybrané zprávy jako důležité" + LABEL_SEARCH: "Hledat" + LABEL_CANCEL_SEARCH: "Zrušit hledání" + LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" + LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" + LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" + LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" + LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" + LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" + LABEL_THREAD_NEXT: "Next message in thread" + LABEL_THREAD_PREV: "Previous message in thread" + LABEL_PRINT: "Tisk" + LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" + LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" + LABEL_SWITCH_TO_LIST: "Switch focus back to message list" + LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" + LABEL_SAVE_MESSAGE: "Save message" + LABEL_SEND_MESSAGE: "Send message" + LABEL_CLOSE_COMPOSE: "Close compose" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "No public keys found" + NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" + NO_PRIVATE_KEY_FOUND: "No private key found" + NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" + ADD_A_PUBLICK_KEY: "Add a public key" + SELECT_A_PRIVATE_KEY: "Vyberte soukromý klíč" + UNVERIFIRED_SIGNATURE: "Unverified signature" + DECRYPTION_ERROR: "OpenPGP decryption error" + GOOD_SIGNATURE: "Good signature from %USER%" + PGP_ERROR: "OpenPGP error: %ERROR%" + SPECIFY_FROM_EMAIL: "Please specify FROM email address" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" + NOTIFICATIONS: + INVALID_TOKEN: "Neplatný token" + AUTH_ERROR: "Ověření selhalo" + ACCESS_ERROR: "Chyba přístupu" + CONNECTION_ERROR: "Nepodařilo se připojit k serveru" + CAPTCHA_ERROR: "Nesprávná CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- + Toto ID není přiřazeno k žádnému účtu. Přihlašte se pomocí vaší emailové adresy + a nastavte si tuto možnost. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- + Toto ID není přiřazeno k žádnému účtu. Přihlašte se pomocí vaší emailové adresy + a nastavte si tuto možnost. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- + Toto ID není přiřazeno k žádnému účtu. Přihlašte se pomocí vaší emailové adresy + a nastavte si tuto možnost. + DOMAIN_NOT_ALLOWED: "Doména není povolená" + ACCOUNT_NOT_ALLOWED: "Účet není povolený" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Je vyžadováno dvoufázové ověření" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Chyba dvoufázového ověření" + COULD_NOT_SAVE_NEW_PASSWORD: "Nelze uložit nové heslo" + CURRENT_PASSWORD_INCORRECT: "Současné heslo neodpovídá" + NEW_PASSWORD_SHORT: "Heslo je krátké" + NEW_PASSWORD_WEAK: "Heslo je moc jednoduché" + NEW_PASSWORD_FORBIDDENT: "Heslo obsahuje zakázané znaky" + CONTACTS_SYNC_ERROR: "Chyba při synchronizaci kontaktů" + CANT_GET_MESSAGE_LIST: "Chyba při vytváření seznamu zpráv" + CANT_GET_MESSAGE: "Zprávu se nepodařilo načíst" + CANT_DELETE_MESSAGE: "Zprávu se nepodařilo odstranit" + CANT_MOVE_MESSAGE: "Zprávu se nepodařilo přesunout" + CANT_SAVE_MESSAGE: "Zprávu se nepodařilo uložit" + CANT_SEND_MESSAGE: "Zprávu se nepodařilo odeslat" + INVALID_RECIPIENTS: "Neplatný příjemci" + CANT_SAVE_FILTERS: "Nelze uložit filtry" + CANT_GET_FILTERS: "Nelze načíst filtry" + FILTERS_ARE_NOT_CORRECT: "Filtry nejsou validní" + CANT_CREATE_FOLDER: "Složku se nepodařilo vytvořit" + CANT_RENAME_FOLDER: "Složku se nepodařilo přejmenovat" + CANT_DELETE_FOLDER: "Složku se nepodařilo odstranit" + CANT_DELETE_NON_EMPTY_FOLDER: "Nelze odstranit neprázdnou složku" + CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" + CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" + CANT_SAVE_SETTINGS: "Nastavení se nepodařilo uložit" + CANT_SAVE_PLUGIN_SETTINGS: "Nastavení se nepodařilo uložit" + DOMAIN_ALREADY_EXISTS: "Táto doména již existuje" + CANT_INSTALL_PACKAGE: "Instalace balíčku se nezdařila" + CANT_DELETE_PACKAGE: "Odstranění balíčku se nezdařilo" + INVALID_PLUGIN_PACKAGE: "Nevalidní balíček" + UNSUPPORTED_PLUGIN_PACKAGE: "Nepodporovaný balíček rozšíření" + LICENSING_SERVER_IS_UNAVAILABLE: "Licenční server je nedostupný" + LICENSING_DOMAIN_EXPIRED: "Licence pro tuto doménu vypršela." + LICENSING_DOMAIN_BANNED: "Licence pro tuto doménu byla zablokována." + DEMO_SEND_MESSAGE_ERROR: "Z důvodu bezpečnosti tento demo účet není oprávněn posílat zprávy na externí emaily!" + DEMO_ACCOUNT_ERROR: "Z důvodu bezpečnosti tento účet nemá oprávnění toto provést!" + ACCOUNT_ALREADY_EXISTS: "Účet už existuje" + ACCOUNT_DOES_NOT_EXIST: "Účet neexistuje" + MAIL_SERVER_ERROR: "Nastala chyba během přístupu na poštovní server" + INVALID_INPUT_ARGUMENT: "Nevalidní vstupní argument" + UNKNOWN_ERROR: "Neznámá chyba" + STATIC: + BACK_LINK: "Obnovit" + DOMAIN_LIST_DESC: "Seznam domén, ke kterým je možné přistupovat přes webmail." + PHP_EXSTENSIONS_ERROR_DESC: "Potřebné rošíření PHP nejsou dostupné v konfiguraci PHP!" + PHP_VERSION_ERROR_DESC: "Vaše verze PHP (%VERSION%) je nižší než požadovaná 5.3.0!" + NO_SCRIPT_TITLE: "Tato aplikace vyžaduje JavaScript." + NO_SCRIPT_DESC: | + Váš internetový prohlížeč nepodporuje JavaScript. + Prosím povolte podporu JavaScriptu v nastavení vašeho internetového prohlížeče a zkuste to znovu. + NO_COOKIE_TITLE: "Tato aplikace vyžaduje podporu Cookies." + NO_COOKIE_DESC: | + Váš internetový prohlížeč nepodporuje Cookies. + Prosím povolte podporu Cookies v nastavení vašeho internetového prohlížeče a zkuste to znovu. + BAD_BROWSER_TITLE: "Používáte zastaralý internetový prohlížeč." + BAD_BROWSER_DESC: | + Abyste mohli využívat všechny funkcie této aplikace, + použijte některý z následujících internetových prohlížečů: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/da_DK.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/da_DK.yml new file mode 100755 index 00000000..25afb6f6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/da_DK.yml @@ -0,0 +1,710 @@ +da_DK: + LOGIN: + LABEL_EMAIL: "E-mail" + LABEL_LOGIN: "Brugernavn" + LABEL_PASSWORD: "Adgangskode" + LABEL_SIGN_ME: "Husk mig" + LABEL_VERIFICATION_CODE: "Verifikationskode" + LABEL_DONT_ASK_VERIFICATION_CODE: "Husk kode i 2 uger" + BUTTON_SIGN_IN: "Log ind" + TITLE_SIGN_IN_GOOGLE: "Log ind med Google" + TITLE_SIGN_IN_FACEBOOK: "Log ind med Facebook" + TITLE_SIGN_IN_TWITTER: "Log ind med Twitter" + LABEL_FORGOT_PASSWORD: "Glemt adgangskode" + LABEL_REGISTRATION: "Registrering" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Tilføj konto" + BUTTON_SETTINGS: "Indstillinger" + BUTTON_HELP: "Hjælp" + BUTTON_LOGOUT: "Log ud" + MOBILE: + BUTTON_MOBILE_VERSION: "Mobil udgave" + BUTTON_DESKTOP_VERSION: "Desktop udgave" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Søg" + TITLE_ADV: "Avanceret søgning" + LABEL_ADV_FROM: "Fra" + LABEL_ADV_TO: "Til" + LABEL_ADV_SUBJECT: "Emne" + LABEL_ADV_TEXT: "Tekst" + LABEL_ADV_HAS_ATTACHMENT: "Har vedhæftet fil" + LABEL_ADV_HAS_ATTACHMENTS: "Har vedhæftede filer" + LABEL_ADV_FLAGGED: "Markeret med flag" + LABEL_ADV_UNSEEN: "Ulæst" + LABEL_ADV_DATE: "Dato" + LABEL_ADV_DATE_ALL: "Alle" + LABEL_ADV_DATE_3_DAYS: "Nyere end 3 dage" + LABEL_ADV_DATE_7_DAYS: "Nyere end 1 uge" + LABEL_ADV_DATE_MONTH: "Nyere end 1 måned" + LABEL_ADV_DATE_3_MONTHS: "Nyere end 3 måneder" + LABEL_ADV_DATE_6_MONTHS: "Nyere end 6 måneder" + LABEL_ADV_DATE_YEAR: "Nyere end 1 år" + BUTTON_ADV_SEARCH: "Søg" + PREVIEW_POPUP: + FULLSCREEN: "Fuld skærm" + ZOOM: "Zoom ind/ud" + CLOSE: "Luk (Esc)" + LOADING: "Indlæser..." + GALLERY_PREV: "Forrige (venstrepil)" + GALLERY_NEXT: "Næste (højrepil)" + GALLERY_COUNTER: "%curr% af %total%" + IMAGE_ERROR: "Billedet kunne ikke indlæses." + AJAX_ERROR: "Indholdet kunne ikke indlæses." + FOLDER_LIST: + BUTTON_COMPOSE: "Forfat" + BUTTON_CONTACTS: "Kontakter" + BUTTON_NEW_MESSAGE: "Ny meddelelse" + INBOX_NAME: "Indbakke" + SENT_NAME: "Sendte meddelelser" + DRAFTS_NAME: "Kladder" + SPAM_NAME: "Uønskede meddelelser" + TRASH_NAME: "Slettede meddelelser" + ARCHIVE_NAME: "Arkiverede meddelelser" + QUOTA: + TITLE: "Forbrug" + MESSAGE_LIST: + BUTTON_RELOAD: "Genindlæs meddelelser" + BUTTON_MOVE_TO: "Flyt til" + BUTTON_DELETE: "Slet" + BUTTON_ARCHIVE: "Arkivér" + BUTTON_SPAM: "Uønsket" + BUTTON_NOT_SPAM: "Ikke uønsket" + BUTTON_EMPTY_FOLDER: "Tøm mappe" + BUTTON_MULTY_FORWARD: "Videresend som vedhæftning(er)" + BUTTON_DELETE_WITHOUT_MOVE: "Slet permanent" + BUTTON_MORE: "Mere" + MENU_SET_SEEN: "Markér som læst" + MENU_SET_ALL_SEEN: "Markér alle som læst" + MENU_UNSET_SEEN: "Markér som ulæst" + MENU_SET_FLAG: "Markér med flag" + MENU_UNSET_FLAG: "Fjern flag" + MENU_SELECT_ALL: "Alle" + MENU_SELECT_NONE: "Ingen" + MENU_SELECT_INVERT: "Vend valg" + MENU_SELECT_UNSEEN: "Ulæst" + MENU_SELECT_SEEN: "Læst" + MENU_SELECT_FLAGGED: "Markeret med flag" + MENU_SELECT_UNFLAGGED: "Ikke markeret med flag" + EMPTY_LIST: "Ingen meddelelser." + EMPTY_SEARCH_LIST: "Ingen meddelelser passede på søgningen." + SEARCH_RESULT_FOR: "Resultat for søgningen på \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "Tilbage til meddelelsesoversigt" + LIST_LOADING: "Indlæser" + EMPTY_SUBJECT_TEXT: "(Intet emne)" + PUT_MESSAGE_HERE: "Slip meddelelse her for visning i oversigten" + TODAY_AT: "i dag klokken %TIME%" + YESTERDAY_AT: "i går klokken %TIME%" + SEARCH_PLACEHOLDER: "Søg" + NEW_MESSAGE_NOTIFICATION: "%COUNT% nye meddelelser!" + QUOTA_SIZE: "Du bruger %SIZE% (%PROC%%) af %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Rediger" + BUTTON_BACK: "Tilbage" + BUTTON_CLOSE: "Luk" + BUTTON_DELETE: "Slet" + BUTTON_UNSUBSCRIBE: "Frameld liste" + BUTTON_ARCHIVE: "Arkivér" + BUTTON_SPAM: "Uønsket" + BUTTON_NOT_SPAM: "Ikke uønsket" + BUTTON_MOVE_TO: "Flyt til" + BUTTON_MORE: "Mere" + BUTTON_REPLY: "Svar" + BUTTON_REPLY_ALL: "Svar alle" + BUTTON_FORWARD: "Videresend" + BUTTON_FORWARD_AS_ATTACHMENT: "Videresend som vedhæftning" + BUTTON_EDIT_AS_NEW: "Rediger som ny" + BUTTON_SHOW_IMAGES: "Vis eksterne billeder" + BUTTON_NOTIFY_READ_RECEIPT: "Afsender har bedt om modtagelseskvittering." + BUTTON_IN_NEW_WINDOW: "Vis i separat vindue" + BUTTON_THREAD_LIST: "Samtaleoversigt" + BUTTON_THREAD_PREV: "Forrige" + BUTTON_THREAD_NEXT: "Næste" + BUTTON_THREAD_MORE: "Flere meddelelser" + MENU_HEADERS: "Vis meddelelseoplysninger" + MENU_VIEW_ORIGINAL: "Vis kilder" + MENU_DOWNLOAD_ORIGINAL: "Hent som .eml fil" + MENU_FILTER_SIMILAR: "Find lignende meddelelser" + MENU_PRINT: "Udskriv" + EMPTY_SUBJECT_TEXT: "(Intet emne)" + LABEL_SUBJECT: "Emne" + LABEL_DATE: "Dato" + LABEL_FROM: "Fra" + LABEL_FROM_SHORT: "fra" + LABEL_TO: "Til" + LABEL_TO_SHORT: "til" + LABEL_CC: "CC" + LABEL_BCC: "BCC" + LABEL_REPLY_TO: "Svar til" + PRINT_LABEL_FROM: "Fra" + PRINT_LABEL_TO: "Til" + PRINT_LABEL_CC: "CC" + PRINT_LABEL_BCC: "BCC" + PRINT_LABEL_REPLY_TO: "Svar til" + PRINT_LABEL_DATE: "Dato" + PRINT_LABEL_SUBJECT: "Emne" + PRINT_LABEL_ATTACHMENTS: "Vedhæftninger" + MESSAGE_LOADING: "Indlæser" + MESSAGE_VIEW_DESC: "Vælg meddelelse i oversigten for visning." + MESSAGE_VIEW_MOVE_DESC: "Vælg modtagemappe i panelet til venstre." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Adgangskode" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP signeret meddelelse (tryk for at verificere)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP krypteret meddelelse (tryk for at dekryptere)" + LINK_DOWNLOAD_AS_ZIP: "Hent som zip-fil" + LINK_SAVE_TO_OWNCLOUD: "Gem til ownCloud" + LINK_SAVE_TO_DROPBOX: "Gem til Dropbox" + READ_RECEIPT: + SUBJECT: "Kvittering for læsning af - %SUBJECT%" + BODY: | + Kvittering for læsning af %READ-RECEIPT%. + + Bemærk: "Dette bekræfter bare at meddelelsen er blevet vist på modtagerens computer." + Der er ingen garanti for at modtager har læst meddelelsen. + SUGGESTIONS: + SEARCHING_DESC: "Søger..." + CONTACTS: + LEGEND_CONTACTS: "Kontakter" + SEARCH_INPUT_PLACEHOLDER: "Søg" + BUTTON_ADD_CONTACT: "Tilføj kontakt" + BUTTON_CREATE_CONTACT: "Ny kontakt" + BUTTON_UPDATE_CONTACT: "Opdater kontakt" + BUTTON_IMPORT: "Importer kontakter (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Eksporter kontakter (vcf, vCard)" + BUTTON_EXPORT_CSV: "Eksporter kontakter (csv)" + ERROR_IMPORT_FILE: "Importfejl (forkert fil type)" + LIST_LOADING: "Indlæser" + EMPTY_LIST: "Ingen kontakter" + EMPTY_SEARCH: "Ingen kontakter fundet" + CLEAR_SEARCH: "Fjern søgning" + CONTACT_VIEW_DESC: "Vælg kontakt i oversigten for visning." + LABEL_DISPLAY_NAME: "Visningsnavn" + LABEL_EMAIL: "E-mail" + LABEL_PHONE: "Telefon" + LABEL_WEB: "Hjemmeside" + LABEL_BIRTHDAY: "Fødselsdag" + LINK_ADD_EMAIL: "Tilføj e-mail adresse" + LINK_ADD_PHONE: "Tilføj telefonnummer" + LINK_BIRTHDAY: "Fødselsdag" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Indtast kaldenavn" + PLACEHOLDER_ENTER_LAST_NAME: "Indtast efternavn" + PLACEHOLDER_ENTER_FIRST_NAME: "Indtast fornavn(e)" + PLACEHOLDER_ENTER_NICK_NAME: "Indtast kaldenavn" + LABEL_READ_ONLY: "Skrivebeskyttet" + LABEL_SHARE: "Del" + ADD_MENU_LABEL: "Tilføj" + ADD_MENU_NICKNAME: "Kaldenavn" + ADD_MENU_NOTES: "Noter" + ADD_MENU_EMAIL: "E-mail" + ADD_MENU_PHONE: "Telefon" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Adresse" + ADD_MENU_BIRTHDAY: "Fødselsdag" + ADD_MENU_TAGS: "Mærkater" + BUTTON_SHARE_NONE: "Ingen" + BUTTON_SHARE_ALL: "Alle" + BUTTON_SYNC: "Synkronisering (CardDAV)" + COMPOSE: + TITLE_FROM: "Fra" + TITLE_TO: "Til" + TITLE_CC: "CC" + TITLE_BCC: "BCC" + TITLE_REPLY_TO: "Svar til" + TITLE_SUBJECT: "Emne" + LINK_SHOW_INPUTS: "Vis alle felter" + BUTTON_SEND: "Send" + BUTTON_SAVE: "Gem" + BUTTON_DELETE: "Slet" + BUTTON_CANCEL: "Annuller" + BUTTON_MINIMIZE: "Minimer" + SAVED_TIME: "Gemt klokken %TIME%" + SAVED_ERROR_ON_SEND: "Meddelelse blev afsendt, men ikke gemt i mappen for sendte meddelelser" + DISCARD_UNSAVED_DATA: "Slet ikke gemt data?" + ATTACH_FILES: "Vedhæft filer" + ATTACH_DROP_FILES_DESC: "Slip filer her" + ATTACH_ITEM_CANCEL: "Annuller" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drev" + REPLY_MESSAGE_TITLE: "Den %DATE% klokken %TIME%, skrev %EMAIL%:" + FORWARD_MESSAGE_TOP_TITLE: "-------- Videresendt meddelelse -------" + FORWARD_MESSAGE_TOP_FROM: "Fra" + FORWARD_MESSAGE_TOP_TO: "Til" + FORWARD_MESSAGE_TOP_CC: "CC" + FORWARD_MESSAGE_TOP_SENT: "Sendt" + FORWARD_MESSAGE_TOP_SUBJECT: "Emne" + EMPTY_TO_ERROR_DESC: "Tilføj minimum en modtager" + NO_ATTACHMENTS_HERE_DESC: "Ingen vedhæftninger." + ATTACHMENTS_ERROR_DESC: "Advarsels! Ikke alle vedhæftninger er overført." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Overførsel af vedhæftninger igang." + BUTTON_REQUEST_READ_RECEIPT: "Bed om kvittering for læsning" + BUTTON_MARK_AS_IMPORTANT: "Markér som vigtig" + BUTTON_OPEN_PGP: "OpenPGP (kun plain tekst)" + BUTTON_REQUEST_DSN: "Bed om kvittering for modtagelse" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Luk" + POPUPS_ASK: + BUTTON_YES: "Ja" + BUTTON_NO: "Nej" + DESC_WANT_CLOSE_THIS_WINDOW: "Vil du lukke vinduet?" + DESC_WANT_DELETE_MESSAGES: "Vil du slette denne/disse meddelelse(r)?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Vælg sprog" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Tilføj konto?" + BUTTON_ADD_ACCOUNT: "Tilføj" + TITLE_UPDATE_ACCOUNT: "Opdater konto?" + BUTTON_UPDATE_ACCOUNT: "Opdater" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Tilføj identitet?" + TITLE_UPDATE_IDENTITY: "Opdater identitet?" + BUTTON_ADD_IDENTITY: "Tilføj" + BUTTON_UPDATE_IDENTITY: "Opdater" + LABEL_EMAIL: "E-mail" + LABEL_NAME: "Navn" + LABEL_REPLY_TO: "Svar til" + LABEL_SIGNATURE: "Signatur" + LABEL_CC: "Cc" + LABEL_BCC: "Bcc" + LABEL_SIGNATURE_INSERT_BEFORE: "Indsæt signatur før citeret tekst" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Opret ny mappe?" + LABEL_NAME: "Mappenavn" + LABEL_PARENT: "Hovedmappe" + BUTTON_CREATE: "Opret ny mappe" + BUTTON_CANCEL: "Annuller" + BUTTON_CLOSE: "Luk" + TITLE_CREATING_PROCESS: "Opretter mappe" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Tøm mappe?" + BUTTON_CLEAR: "Tøm mappe" + BUTTON_CANCEL: "Annuller" + BUTTON_CLOSE: "Luk" + DANGER_DESC_WARNING: "Advarsel!" + DANGER_DESC_HTML_1: "Dette vil slette alle e-mails i %FOLDER%." + DANGER_DESC_HTML_2: "Handlingen kan ikke afbrydes når den er startet." + TITLE_CLEARING_PROCESS: "Tømmer mappe..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Importer OpenPGP nøgle" + BUTTON_IMPORT_OPEN_PGP_KEY: "Importer" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "Vis OpenPGP nøgle" + BUTTON_SELECT: "Vælg" + BUTTON_CLOSE: "Luk" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Generér OpenPGP nøgler" + LABEL_EMAIL: "E-mail" + LABEL_NAME: "Navn" + LABEL_PASSWORD: "Adgangskode" + LABEL_KEY_BIT_LENGTH: "Nøglelængde" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generér" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP signér/krypter" + LABEL_SIGN: "Signér" + LABEL_ENCRYPT: "Krypter" + LABEL_PASSWORD: "Adgangskode" + BUTTON_SIGN: "Signér" + BUTTON_ENCRYPT: "Krypter" + BUTTON_SIGN_AND_ENCRYPT: "Signér og krypter" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP dekrypter" + LABEL_KEY: "Privat nøgle" + LABEL_PASSWORD: "Adgangskode" + BUTTON_DECRYPT: "Dekrypter" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "2-trins verifikationstest" + LABEL_CODE: "Kode" + BUTTON_TEST: "Test" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Opret filter?" + TITLE_EDIT_FILTER: "Opdater filter?" + FILTER_NAME: "Navn" + LEGEND_CONDITIONS: "Betingelser" + LEGEND_ACTIONS: "Handlinger" + BUTTON_DONE: "Færdig" + BUTTON_ADD_CONDITION: "Tilføj betingelse" + SELECT_ACTION_NONE: "Ingen" + SELECT_ACTION_MOVE_TO: "Flyt til" + SELECT_ACTION_FORWARD_TO: "Videresend til" + SELECT_ACTION_REJECT: "Afvis" + SELECT_ACTION_VACATION_MESSAGE: "Feriemeddelelse" + SELECT_ACTION_DISCARD: "Kassér" + SELECT_FIELD_FROM: "Fra" + SELECT_FIELD_RECIPIENTS: "Modtagere (Til eller CC)" + SELECT_FIELD_SUBJECT: "Emne" + SELECT_FIELD_HEADER: "Meddelelsesoplysninger" + SELECT_FIELD_SIZE: "Størrelse" + SELECT_TYPE_CONTAINS: "Indeholder" + SELECT_TYPE_NOT_CONTAINS: "Indeholder ikke" + SELECT_TYPE_MATCHES: "Svarer til (* og ? kan bruges)" + SELECT_TYPE_NOT_MATCHES: "Svarer ikke til (* og ? kan bruges)" + SELECT_TYPE_REGEXP: "Regexp" + SELECT_TYPE_NOT_REGEXP: "Ikke regexp" + SELECT_TYPE_EQUAL_TO: "Lig med" + SELECT_TYPE_NOT_EQUAL_TO: "Ikke lige med" + SELECT_TYPE_OVER: "Over" + SELECT_TYPE_UNDER: "Under" + SELECT_MATCH_ANY: "Passer til en af følgende regler" + SELECT_MATCH_ALL: "Passer til alle følgende regler" + MARK_AS_READ_LABEL: "Markér som læst" + REPLY_INTERVAL_LABEL: "Svarinterval (dage)" + KEEP_LABEL: "Behold" + STOP_LABEL: "Forsæt med at tjekke regler" + EMAIL_LABEL: "E-mail" + VACATION_SUBJECT_LABEL: "Emne (valgfrit)" + VACATION_MESSAGE_LABEL: "Meddelelse" + VACATION_RECIPIENTS_LABEL: "Modtagere (kommaseparerede)" + REJECT_MESSAGE_LABEL: "Afvis meddelelse" + ALL_INCOMING_MESSAGES_DESC: "Alle modtagne meddelelser" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Vælg systemmapper" + SELECT_CHOOSE_ONE: "Vælg en" + SELECT_UNUSE_NAME: "Brug ikke" + LABEL_SENT: "Sendte meddelelser" + LABEL_DRAFTS: "Kladder" + LABEL_SPAM: "Uønskede meddelelser" + LABEL_TRASH: "Slettede meddelelser" + LABEL_ARCHIVE: "Arkiverede meddelelser" + BUTTON_CANCEL: "Annuller" + BUTTON_CLOSE: "Luk" + NOTIFICATION_SENT: | + Du har ikke valgt en systemmappe til sendte meddelelser. + NOTIFICATION_DRAFTS: "Du har ikke valgt en systemmappe til kladder." + NOTIFICATION_SPAM: | + Du har ikke valgt en systemmappe til uønskede meddelelser. + NOTIFICATION_TRASH: | + Du har ikke valgt en systemmappe til slettede meddelelser. + Hvis du vil slette meddelelser permanent, vælg "Brug ikke". + NOTIFICATION_ARCHIVE: "Du har ikke valgt en systemmappe til arkiverede meddelelser." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "2-trins verifikation (TOTP)" + LABEL_ENABLE_TWO_FACTOR: "Aktivér 2-trins verifikation" + LABEL_TWO_FACTOR_USER: "Bruger" + LABEL_TWO_FACTOR_STATUS: "Status" + LABEL_TWO_FACTOR_SECRET: "2-trins verificeringshemmelighed" + LABEL_TWO_FACTOR_BACKUP_CODES: "Tag backup af 2-trins verificeringshemmeligheder" + BUTTON_CREATE: "Opret en hemmelighed" + BUTTON_ACTIVATE: "Aktivér" + BUTTON_CLEAR: "Slet" + BUTTON_LOGOUT: "Log ud" + BUTTON_DONE: "Færdig" + BUTTON_TEST: "Test" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Vis hemmelighed" + BUTTON_HIDE_SECRET: "Skjul hemmelighed" + TWO_FACTOR_REQUIRE_DESC: "Din konto kræver 2-trins verifikation." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Konfigureret" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Ikke konfigureret" + TWO_FACTOR_SECRET_DESC: > + Importer denne information til din Google Autentificering app (eller en anden + TOTP klient) ved hjælp af QR koden herunder eller ved at indtaste koden manuelt. + TWO_FACTOR_BACKUP_CODES_DESC: > + Hvis du ikke kan modtage koder ved hjælp af Google Autentificering appen (eller + en anden TOTP klient), kan du bruge backup koder til at logge ind med. Når + en backup kode er brugt en gang bliver den inaktiv. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Indstillingen kan ikke ændres før den er testet." + TITLES: + LOADING: "Indlæser" + LOGIN: "Log ind" + MAILBOX: "Postkasse" + SETTINGS: "Indstillinger" + COMPOSE: "Forfat" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Filen er for stor" + ERROR_FILE_PARTIALLY_UPLOADED: "Upload ufuldent, ukendt fejl." + ERROR_NO_FILE_UPLOADED: "Ingen fil uploaded" + ERROR_MISSING_TEMP_FOLDER: "Midlertidig fil findes ikke" + ERROR_ON_SAVING_FILE: "Ukendt upload fejl" + ERROR_FILE_TYPE: "Forkert filtype" + ERROR_UNKNOWN: "Ukendt upload fejl" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" + TEXT_SWITCHER_RICH_FORMATTING: "Rig formatering" + TEXT_SWITCHER_CONFIRM: "Formatering og billeder vil gå tabt. Forsæt?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Personlig" + LABEL_GENERAL_NAME: "Generelt" + LABEL_CONTACTS_NAME: "Kontakter" + LABEL_FOLDERS_NAME: "Mapper" + LABEL_ACCOUNTS_NAME: "Kontoer" + LABEL_IDENTITY_NAME: "Identitet" + LABEL_IDENTITIES_NAME: "Identiteter" + LABEL_FILTERS_NAME: "Filtre" + LABEL_TEMPLATES_NAME: "Skabeloner" + LABEL_SECURITY_NAME: "Sikkerhed" + LABEL_SOCIAL_NAME: "Social" + LABEL_THEMES_NAME: "Temaer" + LABEL_CHANGE_PASSWORD_NAME: "Adgangskode" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Tilbage" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filtre" + BUTTON_SAVE: "Gem" + BUTTON_ADD_FILTER: "Tilføj filter" + BUTTON_DELETE: "Slet" + BUTTON_RAW_SCRIPT: "Anvend brugerdefineret script" + SUBNAME_NONE: "Ingen" + SUBNAME_MOVE_TO: "Flyt til \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Videresend til \"%EMAIL%\"" + SUBNAME_REJECT: "Afvis" + SUBNAME_VACATION_MESSAGE: "Feriemeddelelse" + SUBNAME_DISCARD: "Kassér" + CAPABILITY_LABEL: "Evner" + LOADING_PROCESS: "Opdater oversigten over filtre" + DELETING_ASK: "Er du sikker?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Ændringerne skal gemmes til serveren." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identitet" + LABEL_DISPLAY_NAME: "Navn" + LABEL_REPLY_TO: "Svar til" + LABEL_SIGNATURE: "Signatur" + LABEL_ADD_SIGNATURE_TO_ALL: "Tilføj din signatur til alle meddelelser" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Sikkerhed" + LABEL_CONFIGURE_TWO_FACTOR: "Opsæt 2-trins verifikation" + LABEL_AUTOLOGOUT: "Automatisk log ud" + AUTOLOGIN_NEVER_OPTION_NAME: "Aldrig" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minut(ter)" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% time(r)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Generelt" + LABEL_LANGUAGE: "Sprog" + LABEL_IDENTITY: "Identitet" + LABEL_LAYOUT: "Layout" + LABEL_LAYOUT_NO_SPLIT: "Del ikke" + LABEL_LAYOUT_VERTICAL_SPLIT: "Del lodret" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Del vandret" + LABEL_EDITOR: "Standard tekst program" + LABEL_EDITOR_HTML: "Html" + LABEL_EDITOR_PLAIN: "Plain" + LABEL_EDITOR_HTML_FORCED: "Html (gennemtvunget)" + LABEL_EDITOR_PLAIN_FORCED: "Plain (gennemtvunget)" + LABEL_ANIMATION: "Grænsefladeanimation" + LABEL_ANIMATION_FULL: "Fuld" + LABEL_ANIMATION_NORMAL: "Normal" + LABEL_ANIMATION_NONE: "Ingen" + LABEL_VIEW_OPTIONS: "Visningsindstillinger" + LABEL_USE_PREVIEW_PANE: "Brug preview panel" + LABEL_USE_CHECKBOXES_IN_LIST: "Vis afkrydsningsfelt i oversigten" + LABEL_USE_THREADS: "Brug samtaler" + LABEL_REPLY_SAME_FOLDER: "Placer svar i samme mappe som oprindelig meddelelse" + LABEL_SHOW_IMAGES: "Vis altid eksterne billeder" + LABEL_SHOW_ANIMATION: "Vis animationer" + LABEL_MESSAGE_PER_PAGE: "Meddelelser per side" + LABEL_NOTIFICATIONS: "Notifikationer" + LABEL_SOUND_NOTIFICATION: "Lyd notifikationer" + LABEL_CHROME_NOTIFICATION_DESC: "Vis ny meddelelses notifikations popup" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Blokeret af browseren)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Kontakter" + LABEL_CONTACTS_AUTOSAVE: "Tilføj automatisk modtager til adressebog" + LEGEND_CONTACTS_SYNC: "Synkronisering (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Aktivér synkronisering" + LABEL_CONTACTS_SYNC_SERVER: "Server" + LABEL_CONTACTS_SYNC_AB_URL: "Adressebogs URL" + LABEL_CONTACTS_SYNC_USER: "Bruger" + LABEL_CONTACTS_SYNC_PASSWORD: "Adgangskode" + SETTINGS_THEMES: + LEGEND_THEMES: "Temaer" + LEGEND_THEMES_CUSTOM: "Brugerdefineret temakonfiguration" + LABEL_CUSTOM_TYPE: "Type" + LABEL_CUSTOM_TYPE_LIGHT: "Lys" + LABEL_CUSTOM_TYPE_DARK: "Mørk" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Baggrund" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Upload baggrundsbillede (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Fil for stor" + ERROR_FILE_TYPE_ERROR: "Forkert filtype (kun JPG og PNG )" + ERROR_UNKNOWN: "Ukendt upload fejl" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Forbind til Google" + BUTTON_GOOGLE_DISCONNECT: "Afbryd forbindelse til Google" + MAIN_GOOGLE_DESC: "Ved aktivering af log ind via Google, kan der logges ind ved hjælp af Google knappen på log ind skærmen." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Forbind til Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Afbryd forbindelse til Facebook" + MAIN_FACEBOOK_DESC: "Ved aktivering af log ind via Facebook, kan der logges ind ved hjælp af Facebook knappen på log ind skærmen." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Forbind til Twitter" + BUTTON_TWITTER_DISCONNECT: "Afbryd forbindelse til Twitter" + MAIN_TWITTER_DESC: "Ved aktivering af log ind via Twitter, kan der logges ind ved hjælp af Twitter knappen på log ind skærmen." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Mappeoversigt" + BUTTON_CREATE: "Opret ny mappe" + BUTTON_SYSTEM: "Systemmapper" + BUTTON_DELETE: "Slet" + BUTTON_SUBSCRIBE: "Tilmeld" + BUTTON_UNSUBSCRIBE: "Afmeld" + LOADING_PROCESS: "Opdaterer mappeoversigt" + CREATING_PROCESS: "Opretter mappe" + DELETING_PROCESS: "Sletter mappe" + RENAMING_PROCESS: "Omdøber mappe" + DELETING_ASK: "Er du sikker?" + TO_MANY_FOLDERS_DESC_1: "For mange mapper!" + TO_MANY_FOLDERS_DESC_2: "Kun nogle mapper vises for at undgå problemer." + HELP_DELETE_FOLDER: "Slet mappe" + HELP_SHOW_HIDE_FOLDER: "Vis/skjul mappe" + HELP_CHECK_FOR_NEW_MESSAGES: "Markér/fjern markering for nye meddelelser" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Kontoer" + LEGEND_IDENTITIES: "Identiteter" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Kontoer og identiteter" + BUTTON_ADD_ACCOUNT: "Tilføj konto" + BUTTON_ADD_IDENTITY: "Tilføj identitet?" + BUTTON_DELETE: "Slet" + LOADING_PROCESS: "Opdaterer..." + DELETING_ASK: "Er du sikker?" + DEFAULT_IDENTITY_LABEL: "standard" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identitet" + LEGEND_IDENTITIES: "Ekstra identiteter" + LABEL_DEFAULT: "Standard" + LABEL_DISPLAY_NAME: "Navn" + LABEL_REPLY_TO: "Svar til" + LABEL_SIGNATURE: "Signatur" + LABEL_ADD_SIGNATURE_TO_ALL: "Tilføj din signatur til alle meddelelser" + BUTTON_ADD_IDENTITY: "Tilføj identitet" + BUTTON_DELETE: "Slet" + LOADING_PROCESS: "Opdaterer identitetsoversigt" + DELETING_ASK: "Er du sikker?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Skift adgangskode" + LABEL_CURRENT_PASSWORD: "Nuværende adgangskode" + LABEL_NEW_PASSWORD: "Ny adgangskode" + LABEL_REPEAT_PASSWORD: "Bekræft ny adgangskode" + BUTTON_UPDATE_PASSWORD: "Ny adgangskode" + ERROR_PASSWORD_MISMATCH: "Adgangskoder er ikke ens, prøv igen" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Importer OpenPGP nøgle" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generer OpenPGP nøgler" + TITLE_PRIVATE: "Privat" + TITLE_PUBLIC: "Offentlig" + DELETING_ASK: "Er du sikker?" + GENERATE_ONLY_HTTPS: "Kun HTTPS" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Gem kladde automatisk" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Hjælp til tasteturgenveje" + TAB_MAILBOX: "Postkasse" + TAB_MESSAGE_LIST: "Meddelelsesoversigt" + TAB_MESSAGE_VIEW: "Meddelelsesvisning" + TAB_COMPOSE: "Forfat" + LABEL_OPEN_USER_DROPDOWN: "Åben brugermenu" + LABEL_REPLY: "Svar" + LABEL_REPLY_ALL: "Svar alle" + LABEL_FORWARD: "Videresend" + LABEL_FORWARD_MULTIPLY: "Videresend som vedhæftning(er)" + LABEL_HELP: "Hjælp" + LABEL_CHECK_ALL: "Vælg alle meddelelser" + LABEL_ARCHIVE: "Arkivér" + LABEL_DELETE: "Slet" + LABEL_OPEN_THREAD: "Åben valgte samtale" + LABEL_MOVE: "Flyt" + LABEL_READ: "Markér valgte meddelelser som læste" + LABEL_UNREAD: "Markér valgte meddelelser som ulæste" + LABEL_IMPORTANT: "Markér valgte meddelelser som vigtige" + LABEL_SEARCH: "Søg" + LABEL_CANCEL_SEARCH: "Annuller søgning" + LABEL_FULLSCREEN_ENTER: "Fuld skærm (Preview panel layout)" + LABEL_VIEW_MESSAGE_ENTER: "Vis meddelelser (Uden preview panel layout)" + LABEL_SWITCH_TO_MESSAGE: "Fokuser på valgte meddelelser" + LABEL_SWITCH_TO_FOLDER_LIST: "Fokuser på mappeoversigt" + LABEL_FULLSCREEN_TOGGLE: "Fuld skærm" + LABEL_BLOCKQUOTES_TOGGLE: "Slå blokcitater til/fra i meddelelser" + LABEL_THREAD_NEXT: "Næste besked i samtale" + LABEL_THREAD_PREV: "Forrige besked i samtale" + LABEL_PRINT: "Udskriv" + LABEL_EXIT_FULLSCREEN: "Luk fuld skærm" + LABEL_CLOSE_MESSAGE: "Luk meddelelse (Uden preview panel layout)" + LABEL_SWITCH_TO_LIST: "Fokuser på meddelelsesoversigt" + LABEL_OPEN_COMPOSE_POPUP: "Åben forfatter popup" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimer forfatter popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Åben identitetsmenu" + LABEL_SAVE_MESSAGE: "Gem meddelelse" + LABEL_SEND_MESSAGE: "Send meddelelse" + LABEL_CLOSE_COMPOSE: "Luk forfatter mode" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "Ingen offentlige nøgler fundet" + NO_PUBLIC_KEYS_FOUND_FOR: "Ingen offentlige nøgler fundet tilhørende \"%EMAIL%\"" + NO_PRIVATE_KEY_FOUND: "Ingen privat nøgle fundet" + NO_PRIVATE_KEY_FOUND_FOR: "Ingen privat nøgle fundet tilhørende \"%EMAIL%\"" + ADD_A_PUBLICK_KEY: "Tilføj privat nøgle" + SELECT_A_PRIVATE_KEY: "Vælg privat nøgle" + UNVERIFIRED_SIGNATURE: "Ikke verificeret signatur" + DECRYPTION_ERROR: "OpenPGP dekrypteringsfejl" + GOOD_SIGNATURE: "Accepteret signatur for %USER\"" + PGP_ERROR: "OpenPGP fejl: %ERROR%" + SPECIFY_FROM_EMAIL: "Udfyld afsenderadresse" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Angiv mindst en modtager" + NOTIFICATIONS: + INVALID_TOKEN: "Ugyldigt tegn" + AUTH_ERROR: "Godkendelse fejlede" + ACCESS_ERROR: "Adgangsfejl" + CONNECTION_ERROR: "Kan ikke kontakte server" + CAPTCHA_ERROR: "Forkert CAPTCHA" + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Dette sociale ID er ikke knyttet til en e-mail konto endnu. Log ind ved brug + af e-mail og tilføj ID'et under kontoindstillinger. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Dette sociale ID er ikke knyttet til en e-mail konto endnu. Log ind ved brug + af e-mail og tilføj ID'et under kontoindstillinger. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Dette sociale ID er ikke knyttet til en e-mail konto endnu. Log ind ved brug + af e-mail og tilføj ID'et under kontoindstillinger. + DOMAIN_NOT_ALLOWED: "Domæne ikke tilladt" + ACCOUNT_NOT_ALLOWED: "Konto ikke tilladt" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2-faktor verifikation påbudt." + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2-faktor verifikationsfejl" + COULD_NOT_SAVE_NEW_PASSWORD: "Kunne ikke gemme ny adgangskode" + CURRENT_PASSWORD_INCORRECT: "Nuværende adgangskode forkert" + NEW_PASSWORD_SHORT: "Adgangskoden for kort" + NEW_PASSWORD_WEAK: "Adgangskoden for simpel" + NEW_PASSWORD_FORBIDDENT: "Adgangskode indeholder forbudte tegn" + CONTACTS_SYNC_ERROR: "Fejl ved synkronisering af kontakter" + CANT_GET_MESSAGE_LIST: "Kan ikke indlæse meddelelsesoversigt " + CANT_GET_MESSAGE: "Kan ikke indlæse meddelelse" + CANT_DELETE_MESSAGE: "Kan ikke slette meddelelse" + CANT_MOVE_MESSAGE: "Kan ikke flytte meddelelse" + CANT_SAVE_MESSAGE: "Kan ikke gemme meddelelse" + CANT_SEND_MESSAGE: "Kan ikke sende meddelelse" + INVALID_RECIPIENTS: "Ugyldige modtagere" + CANT_SAVE_FILTERS: "Kan ikke gemme filtre" + CANT_GET_FILTERS: "Kan ikke indlæse filtre" + FILTERS_ARE_NOT_CORRECT: "Fejl i filtre" + CANT_CREATE_FOLDER: "Kan ikke oprette mappe" + CANT_RENAME_FOLDER: "Kan ikke omdøbe mappe" + CANT_DELETE_FOLDER: "Kan ikke slette mappe" + CANT_DELETE_NON_EMPTY_FOLDER: "Kan ikke slette mappe som ikke er tom" + CANT_SUBSCRIBE_FOLDER: "Kan ikke abonnere på mappe" + CANT_UNSUBSCRIBE_FOLDER: "Kan ikke afmelde mappe" + CANT_SAVE_SETTINGS: "Kan ikke gemme instillinger" + CANT_SAVE_PLUGIN_SETTINGS: "Kan ikke gemme instillinger" + DOMAIN_ALREADY_EXISTS: "Domæne eksisterer allerede" + CANT_INSTALL_PACKAGE: "Installation af pakke mislykkedes" + CANT_DELETE_PACKAGE: "Fjernelse af pakke mislykkedes" + INVALID_PLUGIN_PACKAGE: "Ugyldig tilføjelsespakke" + UNSUPPORTED_PLUGIN_PACKAGE: "Tilføjelsespakke ikke understøttet" + LICENSING_SERVER_IS_UNAVAILABLE: "Abonnementsserver ikke tilgængelig" + LICENSING_DOMAIN_EXPIRED: "Abonnement på domæne udløbet." + LICENSING_DOMAIN_BANNED: "Abonnement på domæne forbudt." + DEMO_SEND_MESSAGE_ERROR: "Denne konto kan af sikkerhedshensyn ikke sende e-mails til eksterne adresser!" + DEMO_ACCOUNT_ERROR: "Denne konto kan af sikkerhedshensyn ikke udføre denne handling!" + ACCOUNT_ALREADY_EXISTS: "Kontoen eksisterer allerede" + ACCOUNT_DOES_NOT_EXIST: "Kontoen eksisterer ikke" + MAIL_SERVER_ERROR: "Der skete en fejl under adgang til e-mail serveren" + INVALID_INPUT_ARGUMENT: "Ugyldigt argument" + UNKNOWN_ERROR: "Ukendt fejl" + STATIC: + BACK_LINK: "Genindlæs" + DOMAIN_LIST_DESC: "Liste over domæner webmail er tilladt adgang til." + PHP_EXSTENSIONS_ERROR_DESC: "Nødvendige PHP udvidelser er ikke tilgængelige!" + PHP_VERSION_ERROR_DESC: "PHP versionen (%VERSION%) er for gammel. Minimum 5.3.0 er nødvendig!" + NO_SCRIPT_TITLE: "JavaScript er nødvendigt for dette program." + NO_SCRIPT_DESC: | + JavaScript er slået fra i din browser. + Slå JavaScript til og prøv igen. + NO_COOKIE_TITLE: "Cookies er nødvendige for dette program." + NO_COOKIE_DESC: | + Cookies er slået fra i din browser. + Slå Cookies til og prøv igen. + BAD_BROWSER_TITLE: "Din browser er forældet." + BAD_BROWSER_DESC: | + Enkelte funktioner fungerer ikke med denne browser. + For at bruge alle funktioner, hent en af følgende: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/de_DE.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/de_DE.yml new file mode 100755 index 00000000..2ca96aa3 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/de_DE.yml @@ -0,0 +1,715 @@ +de_DE: + LOGIN: + LABEL_EMAIL: "E-Mail" + LABEL_LOGIN: "Login" + LABEL_PASSWORD: "Passwort" + LABEL_SIGN_ME: "Anmeldung merken" + LABEL_VERIFICATION_CODE: "Verifizierungscode" + LABEL_DONT_ASK_VERIFICATION_CODE: "Für zwei Wochen nicht nach dem Code fragen" + BUTTON_SIGN_IN: "Anmelden" + TITLE_SIGN_IN_GOOGLE: "Mit Google anmelden" + TITLE_SIGN_IN_FACEBOOK: "Mit Facebook anmelden" + TITLE_SIGN_IN_TWITTER: "Mit Twitter anmelden" + LABEL_FORGOT_PASSWORD: "Passwort vergessen" + LABEL_REGISTRATION: "Registrierung" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Konto hinzufügen" + BUTTON_SETTINGS: "Einstellungen" + BUTTON_HELP: "Hilfe" + BUTTON_LOGOUT: "Abmelden" + MOBILE: + BUTTON_MOBILE_VERSION: "mobile Version" + BUTTON_DESKTOP_VERSION: "Desktop Version" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Suche" + TITLE_ADV: "Erweiterte Suche" + LABEL_ADV_FROM: "Von" + LABEL_ADV_TO: "An" + LABEL_ADV_SUBJECT: "Betreff" + LABEL_ADV_TEXT: "Text" + LABEL_ADV_HAS_ATTACHMENT: "Anhang vorhanden" + LABEL_ADV_HAS_ATTACHMENTS: "Anhänge vorhanden" + LABEL_ADV_FLAGGED: "Markiert" + LABEL_ADV_UNSEEN: "Ungelesen" + LABEL_ADV_DATE: "Datum" + LABEL_ADV_DATE_ALL: "Alle" + LABEL_ADV_DATE_3_DAYS: "Nicht älter als 3 Tage" + LABEL_ADV_DATE_7_DAYS: "Nicht älter als 1 Woche" + LABEL_ADV_DATE_MONTH: "Nicht älter als 1 Monat" + LABEL_ADV_DATE_3_MONTHS: "Nicht älter als 3 Monate" + LABEL_ADV_DATE_6_MONTHS: "Nicht älter als 6 Monate" + LABEL_ADV_DATE_YEAR: "Nicht älter als 1 Jahr" + BUTTON_ADV_SEARCH: "Suchen" + PREVIEW_POPUP: + FULLSCREEN: "Vollbild umschalten" + ZOOM: "Herein-/Herauszoomen" + CLOSE: "Schließen (Esc)" + LOADING: "Wird geladen ..." + GALLERY_PREV: "Zurück (Linke Pfeil-Taste)" + GALLERY_NEXT: "Weiter (Rechte Pfeil-Taste)" + GALLERY_COUNTER: "%curr% von %total%" + IMAGE_ERROR: "Die Grafikdatei konnte nicht geladen werden." + AJAX_ERROR: "Der Inhalt konnte nicht geladen werden." + FOLDER_LIST: + BUTTON_COMPOSE: "Erstellen" + BUTTON_CONTACTS: "Kontakte" + BUTTON_NEW_MESSAGE: "Neue Nachricht" + INBOX_NAME: "Posteingang" + SENT_NAME: "Gesendet" + DRAFTS_NAME: "Entwürfe" + SPAM_NAME: "Spam" + TRASH_NAME: "Papierkorb" + ARCHIVE_NAME: "Archiv" + QUOTA: + TITLE: "Speicherplatz-Nutzung" + MESSAGE_LIST: + BUTTON_RELOAD: "Nachrichtenliste neu laden" + BUTTON_MOVE_TO: "Verschieben nach" + BUTTON_DELETE: "Löschen" + BUTTON_ARCHIVE: "Archiv" + BUTTON_SPAM: "Spam" + BUTTON_NOT_SPAM: "Kein Spam" + BUTTON_EMPTY_FOLDER: "Ordner leeren" + BUTTON_MULTY_FORWARD: "Nachrichten weiterleiten" + BUTTON_DELETE_WITHOUT_MOVE: "Endgültig löschen" + BUTTON_MORE: "Mehr" + MENU_SET_SEEN: "Als gelesen markieren" + MENU_SET_ALL_SEEN: "Alle als gelesen markieren" + MENU_UNSET_SEEN: "Als ungelesen markieren" + MENU_SET_FLAG: "Markieren" + MENU_UNSET_FLAG: "Markierung entfernen" + MENU_SELECT_ALL: "Alle" + MENU_SELECT_NONE: "Keine" + MENU_SELECT_INVERT: "Umkehren" + MENU_SELECT_UNSEEN: "Ungelesen" + MENU_SELECT_SEEN: "Gelesen" + MENU_SELECT_FLAGGED: "Markiert" + MENU_SELECT_UNFLAGGED: "Nicht markiert" + EMPTY_LIST: "Liste ist leer." + EMPTY_SEARCH_LIST: "Keine Treffer für Ihre Suche." + SEARCH_RESULT_FOR: "Suchergebnisse für \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "Zurück zur Nachrichtenliste" + LIST_LOADING: "Die Liste wird geladen" + EMPTY_SUBJECT_TEXT: "(Kein Betreff)" + PUT_MESSAGE_HERE: "Ziehen Sie die Nachricht hierhin, um sie in der Liste anzuzeigen" + TODAY_AT: "Heute um %TIME%" + YESTERDAY_AT: "Gestern um %TIME%" + SEARCH_PLACEHOLDER: "Suche" + NEW_MESSAGE_NOTIFICATION: "Sie haben %COUNT% neue Nachrichten!" + QUOTA_SIZE: "Sie nutzen %SIZE% (%PROC%%) von %LIMIT%." + MESSAGE: + BUTTON_EDIT: "Bearbeiten" + BUTTON_BACK: "Zurück" + BUTTON_CLOSE: "Schließen" + BUTTON_DELETE: "Löschen" + BUTTON_UNSUBSCRIBE: "Diese Liste abbestellen" + BUTTON_ARCHIVE: "Archiv" + BUTTON_SPAM: "Spam" + BUTTON_NOT_SPAM: "Kein Spam" + BUTTON_MOVE_TO: "Verschieben nach" + BUTTON_MORE: "Mehr" + BUTTON_REPLY: "Antworten" + BUTTON_REPLY_ALL: "Allen antworten" + BUTTON_FORWARD: "Weiterleiten" + BUTTON_FORWARD_AS_ATTACHMENT: "Als Anhang weiterleiten" + BUTTON_EDIT_AS_NEW: "Als neue Nachricht öffnen" + BUTTON_SHOW_IMAGES: "Bilder anzeigen" + BUTTON_NOTIFY_READ_RECEIPT: "Der Absender hat darum gebeten, benachrichtigt zu werden, wenn Sie diese Nachricht lesen." + BUTTON_IN_NEW_WINDOW: "In neuem Fenster anzeigen" + BUTTON_THREAD_LIST: "Unterhaltungsliste" + BUTTON_THREAD_PREV: "Zurück" + BUTTON_THREAD_NEXT: "Weiter" + BUTTON_THREAD_MORE: "Mehr Nachrichten" + MENU_HEADERS: "Kopfzeilen anzeigen" + MENU_VIEW_ORIGINAL: "Original anzeigen" + MENU_DOWNLOAD_ORIGINAL: "Als .eml-Datei herunterladen" + MENU_FILTER_SIMILAR: "Ähnliche Nachrichten" + MENU_PRINT: "Drucken" + EMPTY_SUBJECT_TEXT: "(Kein Betreff)" + LABEL_SUBJECT: "Betreff" + LABEL_DATE: "Datum" + LABEL_FROM: "Von" + LABEL_FROM_SHORT: "von" + LABEL_TO: "An" + LABEL_TO_SHORT: "an" + LABEL_CC: "CC" + LABEL_BCC: "BCC" + LABEL_REPLY_TO: "Antwort an" + PRINT_LABEL_FROM: "Von" + PRINT_LABEL_TO: "An" + PRINT_LABEL_CC: "CC" + PRINT_LABEL_BCC: "BCC" + PRINT_LABEL_REPLY_TO: "Antwort an" + PRINT_LABEL_DATE: "Datum" + PRINT_LABEL_SUBJECT: "Betreff" + PRINT_LABEL_ATTACHMENTS: "Anhänge" + MESSAGE_LOADING: "Nachricht wird geladen" + MESSAGE_VIEW_DESC: "Wählen Sie eine Nachricht aus der Liste aus, um sie anzuzeigen." + MESSAGE_VIEW_MOVE_DESC: "Klicke auf den Ordnernamen auf der linken Seite, um die Nachricht zu verschieben." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Passwort" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP-signierte Nachricht (klicken, um zu überprüfen)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP-verschlüsselte Nachricht (klicken, um zu entschlüsseln)" + LINK_DOWNLOAD_AS_ZIP: "Als ZIP-Datei herunterladen" + LINK_SAVE_TO_OWNCLOUD: "In ownCloud speichern" + LINK_SAVE_TO_DROPBOX: "In Dropbox speichern" + READ_RECEIPT: + SUBJECT: "Empfangsbestätigung (angezeigt) - %SUBJECT%" + BODY: | + Dies ist eine Empfangsbestätigung für die Nachricht, die Sie an %READ-RECEIPT% gesendet haben. + + Hinweis: Diese Empfangsbestätigung bestätigt nur, dass die Nachricht auf dem Computer des Empfängers angezeigt wurde. + Es besteht keine Garantie, dass der Empfänger den Inhalt der Nachricht gelesen oder verstanden hat. + SUGGESTIONS: + SEARCHING_DESC: "Suche läuft..." + CONTACTS: + LEGEND_CONTACTS: "Kontakte" + SEARCH_INPUT_PLACEHOLDER: "Suche" + BUTTON_ADD_CONTACT: "Kontakt hinzufügen" + BUTTON_CREATE_CONTACT: "Kontakt anlegen" + BUTTON_UPDATE_CONTACT: "Kontakt aktualisieren" + BUTTON_IMPORT: "Import (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" + BUTTON_EXPORT_CSV: "Export (csv)" + ERROR_IMPORT_FILE: "Importfehler (ungültiges Dateiformat)" + LIST_LOADING: "Kontakte werden geladen" + EMPTY_LIST: "Keine Kontakte" + EMPTY_SEARCH: "Keine Kontakte gefunden" + CLEAR_SEARCH: "Suche leeren" + CONTACT_VIEW_DESC: "Kontakt aus der Liste wählen, um ihn anzuzeigen." + LABEL_DISPLAY_NAME: "Anzeigename" + LABEL_EMAIL: "E-Mail" + LABEL_PHONE: "Telefon" + LABEL_WEB: "Web" + LABEL_BIRTHDAY: "Geburtstag" + LINK_ADD_EMAIL: "E-Mail-Adresse hinzufügen" + LINK_ADD_PHONE: "Nummer hinzufügen" + LINK_BIRTHDAY: "Geburtstag" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Anzeigename eingeben" + PLACEHOLDER_ENTER_LAST_NAME: "Nachnamen eingeben" + PLACEHOLDER_ENTER_FIRST_NAME: "Vornamen eingeben" + PLACEHOLDER_ENTER_NICK_NAME: "Spitzname eingeben" + LABEL_READ_ONLY: "Schreibgeschützt" + LABEL_SHARE: "Teilen" + ADD_MENU_LABEL: "Hinzufügen" + ADD_MENU_NICKNAME: "Spitzname" + ADD_MENU_NOTES: "Anmerkung" + ADD_MENU_EMAIL: "E-Mail" + ADD_MENU_PHONE: "Telefon" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Adresse" + ADD_MENU_BIRTHDAY: "Geburtstag" + ADD_MENU_TAGS: "Tags" + BUTTON_SHARE_NONE: "Niemand" + BUTTON_SHARE_ALL: "Jeder" + BUTTON_SYNC: "Synchronisierung (CardDAV)" + COMPOSE: + TITLE_FROM: "Von" + TITLE_TO: "An" + TITLE_CC: "CC" + TITLE_BCC: "BCC" + TITLE_REPLY_TO: "Antwort an" + TITLE_SUBJECT: "Betreff" + LINK_SHOW_INPUTS: "alle Felder anzeigen" + BUTTON_SEND: "Senden" + BUTTON_SAVE: "Speichern" + BUTTON_DELETE: "Löschen" + BUTTON_CANCEL: "Abbrechen" + BUTTON_MINIMIZE: "Minimieren" + SAVED_TIME: "Gespeichert um %TIME%" + SAVED_ERROR_ON_SEND: "Die Nachricht wurde gesendet, konnte aber nicht im Gesendet-Ordner gespeichert werden." + DISCARD_UNSAVED_DATA: "Nicht gespeicherte Daten löschen?" + ATTACH_FILES: "Dateien anhängen" + ATTACH_DROP_FILES_DESC: "Fügen Sie hier Dateien ein" + ATTACH_ITEM_CANCEL: "Abbrechen" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% schrieb" + FORWARD_MESSAGE_TOP_TITLE: "-------- Weitergeleitete Nachricht -------" + FORWARD_MESSAGE_TOP_FROM: "Von" + FORWARD_MESSAGE_TOP_TO: "An" + FORWARD_MESSAGE_TOP_CC: "CC" + FORWARD_MESSAGE_TOP_SENT: "Gesendet" + FORWARD_MESSAGE_TOP_SUBJECT: "Betreff" + EMPTY_TO_ERROR_DESC: "Geben Sie bitte mindestens einen Empfänger an" + NO_ATTACHMENTS_HERE_DESC: "Keine Anhänge vorhanden." + ATTACHMENTS_ERROR_DESC: "Warnung! Nicht alle Anhänge wurden hochgeladen." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Es wurden noch nicht alle Anhänge hochgeladen." + BUTTON_REQUEST_READ_RECEIPT: "Empfangsbestätigung anfordern" + BUTTON_MARK_AS_IMPORTANT: "Als Wichtig markieren" + BUTTON_OPEN_PGP: "OpenPGP (nur bei unformatiertem Text)" + BUTTON_REQUEST_DSN: "Übermittlungsstatus anfordern" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Schließen" + POPUPS_ASK: + BUTTON_YES: "Ja" + BUTTON_NO: "Nein" + DESC_WANT_CLOSE_THIS_WINDOW: "Sind Sie sicher, dass Sie dieses Fenster schließen möchten?" + DESC_WANT_DELETE_MESSAGES: "Sind Sie sicher, dass Sie diese Nachricht(en) löschen möchten?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Sprache auswählen" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Konto hinzufügen?" + BUTTON_ADD_ACCOUNT: "Hinzufügen" + TITLE_UPDATE_ACCOUNT: "Konto aktualisieren?" + BUTTON_UPDATE_ACCOUNT: "Aktualisieren" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Identität hinzufügen?" + TITLE_UPDATE_IDENTITY: "Identität aktualisieren?" + BUTTON_ADD_IDENTITY: "Hinzufügen" + BUTTON_UPDATE_IDENTITY: "Aktualisieren" + LABEL_EMAIL: "E-Mail" + LABEL_NAME: "Name" + LABEL_REPLY_TO: "Antwort an" + LABEL_SIGNATURE: "Signatur" + LABEL_CC: "CC" + LABEL_BCC: "BCC" + LABEL_SIGNATURE_INSERT_BEFORE: "Diese Signatur in Antworten vor dem zitierten Text einfügen" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Ordner anlegen?" + LABEL_NAME: "Ordnername" + LABEL_PARENT: "Übergeordneter Ordner" + BUTTON_CREATE: "Anlegen" + BUTTON_CANCEL: "Abbrechen" + BUTTON_CLOSE: "Schließen" + TITLE_CREATING_PROCESS: "Ordner wird angelegt" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Alle Nachrichten in diesem Ordner löschen?" + BUTTON_CLEAR: "Bereinigen" + BUTTON_CANCEL: "Abbrechen" + BUTTON_CLOSE: "Schließen" + DANGER_DESC_WARNING: "Achtung!" + DANGER_DESC_HTML_1: "Dieser Schritt wird alle Nachrichten im Ordner %FOLDER% endgültig löschen." + DANGER_DESC_HTML_2: "Einmal begonnen, kann dieser Vorgang nicht mehr abgebrochen oder beendet werden." + TITLE_CLEARING_PROCESS: "Ordner wird gelöscht ..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "OpenPGP-Schlüssel importieren" + BUTTON_IMPORT_OPEN_PGP_KEY: "Importieren" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "OpenPGP-Schlüssel anzeigen" + BUTTON_SELECT: "Auswählen" + BUTTON_CLOSE: "Schließen" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "OpenPGP-Schlüssel generieren" + LABEL_EMAIL: "E-Mail" + LABEL_NAME: "Name" + LABEL_PASSWORD: "Passwort" + LABEL_KEY_BIT_LENGTH: "Schlüssellänge" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generieren" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP unterschreiben/verschlüsseln" + LABEL_SIGN: "Unterschrift" + LABEL_ENCRYPT: "Verschlüsselung" + LABEL_PASSWORD: "Passwort" + BUTTON_SIGN: "Unterschreiben" + BUTTON_ENCRYPT: "Verschlüsseln" + BUTTON_SIGN_AND_ENCRYPT: "Unterschreiben und verschlüsseln" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" + LABEL_KEY: "Private Key" + LABEL_PASSWORD: "Password" + BUTTON_DECRYPT: "Decrypt" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "Zwei-Faktor-Authentifizierung" + LABEL_CODE: "Code" + BUTTON_TEST: "Testen" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Filter erstellen?" + TITLE_EDIT_FILTER: "Filter bearbeiten?" + FILTER_NAME: "Name" + LEGEND_CONDITIONS: "Bedingungen" + LEGEND_ACTIONS: "Aktionen" + BUTTON_DONE: "Erledigt" + BUTTON_ADD_CONDITION: "Bedingung hinzufügen" + SELECT_ACTION_NONE: "Keine" + SELECT_ACTION_MOVE_TO: "Verschieben nach" + SELECT_ACTION_FORWARD_TO: "Weiterleiten nach" + SELECT_ACTION_REJECT: "Ablehnen" + SELECT_ACTION_VACATION_MESSAGE: "Urlaubsbenachrichtigung" + SELECT_ACTION_DISCARD: "Verwerfen" + SELECT_FIELD_FROM: "Von" + SELECT_FIELD_RECIPIENTS: "Empfänger (An oder CC)" + SELECT_FIELD_SUBJECT: "Betreff" + SELECT_FIELD_HEADER: "Nachrichtenkopf" + SELECT_FIELD_SIZE: "Größe" + SELECT_TYPE_CONTAINS: "Enthält" + SELECT_TYPE_NOT_CONTAINS: "Enthält nicht" + SELECT_TYPE_MATCHES: "Übereinstimmung (* und ? unterstützt)" + SELECT_TYPE_NOT_MATCHES: "Keine Übereinstimmung (* und ? unterstützt)" + SELECT_TYPE_REGEXP: "Regulärer Ausdruck" + SELECT_TYPE_NOT_REGEXP: "Regulärer Ausdruck (negiert)" + SELECT_TYPE_EQUAL_TO: "Gleich" + SELECT_TYPE_NOT_EQUAL_TO: "Ungleich" + SELECT_TYPE_OVER: "Über" + SELECT_TYPE_UNDER: "Unter" + SELECT_MATCH_ANY: "Eine der folgenden Regeln trifft zu" + SELECT_MATCH_ALL: "Alle folgenden Regeln treffen zu" + MARK_AS_READ_LABEL: "Als Gelesen markieren" + REPLY_INTERVAL_LABEL: "Antwortintervall (Tage)" + KEEP_LABEL: "Behalten" + STOP_LABEL: "Weiterverarbeitung der Regeln nicht verhindern" + EMAIL_LABEL: "E-Mail" + VACATION_SUBJECT_LABEL: "Betreff (optional)" + VACATION_MESSAGE_LABEL: "Nachricht" + VACATION_RECIPIENTS_LABEL: "Empfänger (durch Komma getrennt)" + REJECT_MESSAGE_LABEL: "Ablehnnachricht" + ALL_INCOMING_MESSAGES_DESC: "Alle eingehenden Nachrichten" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Wählen Sie die Systemordner aus" + SELECT_CHOOSE_ONE: "Wählen Sie einen aus" + SELECT_UNUSE_NAME: "Nicht anwenden" + LABEL_SENT: "Gesendet" + LABEL_DRAFTS: "Entwürfe" + LABEL_SPAM: "Spam" + LABEL_TRASH: "Papierkorb" + LABEL_ARCHIVE: "Archiv" + BUTTON_CANCEL: "Abbrechen" + BUTTON_CLOSE: "Schließen" + NOTIFICATION_SENT: | + Sie haben keinen "Gesendet"-Systemordner gewählt, in dem Nachrichten nach dem Versenden gespeichert werden. + Falls Sie versandte Nachrichten nicht speichern möchten, wählen Sie die Option "Nicht anwenden". + NOTIFICATION_DRAFTS: "Sie haben keinen \"Entwürfe\"-Systemordner gewählt, in dem Nachrichten beim Erstellen gespeichert werden." + NOTIFICATION_SPAM: | + Sie haben keinen "Spam"-Systemordner gewählt, in dem die Spam-Nachrichten abgelegt werden. + Falls Sie Spam-Nachrichten endgültig löschen möchten, wählen Sie die Option "Nicht anwenden". + NOTIFICATION_TRASH: | + Sie haben keinen "Papierkorb"-Systemordner gewählt, in dem die gelöschten Nachrichten abgelegt werden. + Falls Sie gelöschte Nachrichten endgültig löschen möchten, wählen Sie die Option "Nicht anwenden". + NOTIFICATION_ARCHIVE: "Sie haben keinen \"Archiv\"-Systemordner gewählt, in dem die archivierten Nachrichten abgelegt werden." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "Zwei-Faktor-Authentifizierung" + LABEL_ENABLE_TWO_FACTOR: "Zwei-Faktor-Authentifizierung aktivieren" + LABEL_TWO_FACTOR_USER: "Benutzer" + LABEL_TWO_FACTOR_STATUS: "Status" + LABEL_TWO_FACTOR_SECRET: "Geheimnis" + LABEL_TWO_FACTOR_BACKUP_CODES: "Sicherungscodes" + BUTTON_CREATE: "Neues Geheimnis erstellen" + BUTTON_ACTIVATE: "Aktivieren" + BUTTON_CLEAR: "Löschen" + BUTTON_LOGOUT: "Abmelden" + BUTTON_DONE: "Erledigt" + BUTTON_TEST: "Test" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Geheimnis einblenden" + BUTTON_HIDE_SECRET: "Geheminis ausblenden" + TWO_FACTOR_REQUIRE_DESC: "Ihr Benutzerkonto erfordert die Einrichtung der Zwei-Faktor-Authentifizierung." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Konfiguriert" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Nicht konfiguriert" + TWO_FACTOR_SECRET_DESC: >- + Importieren Sie diese Information in Ihre Google-Authenticator-Anwendung (oder + andere TOTP-Anwendung), indem Sie den unten bereitgestellten QR-Code verwenden + oder den Code manuell eingeben. + TWO_FACTOR_BACKUP_CODES_DESC: >- + Sollten Sie keine Codes über den Google Authenticator erhalten, können Sie + einen Sicherungscode zur Anmeldung verwenden. Der Sicherungscode wird inaktiv, + sobald Sie ihn zur Anmeldung verwendet haben. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Sie können diese Einstellung nicht ohne vorherigen Test verändern." + TITLES: + LOADING: "Wird geladen" + LOGIN: "Anmeldung" + MAILBOX: "Postfach" + SETTINGS: "Einstellungen" + COMPOSE: "Erstellen" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Datei ist zu groß" + ERROR_FILE_PARTIALLY_UPLOADED: "Die Datei wurde aus einem unbekannten Grund unvollständig hochgeladen." + ERROR_NO_FILE_UPLOADED: "Keine Datei hochgeladen" + ERROR_MISSING_TEMP_FOLDER: "Die temporäre Datei fehlt" + ERROR_ON_SAVING_FILE: "Ein unbekannter Fehler trat beim Hochladen auf" + ERROR_FILE_TYPE: "Ungültiger Dateityp" + ERROR_UNKNOWN: "Ein unbekannter Fehler trat beim Hochladen auf" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" + TEXT_SWITCHER_RICH_FORMATTING: "Formatierter Text (Rich Text)" + TEXT_SWITCHER_CONFIRM: "Alle Textformatierungen und Grafiken gehen verloren. Wollen Sie wirklich fortfahren?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Persönlich" + LABEL_GENERAL_NAME: "Allgemein" + LABEL_CONTACTS_NAME: "Kontakte" + LABEL_FOLDERS_NAME: "Ordner" + LABEL_ACCOUNTS_NAME: "Konten" + LABEL_IDENTITY_NAME: "Identität" + LABEL_IDENTITIES_NAME: "Identitäten" + LABEL_FILTERS_NAME: "Filter" + LABEL_TEMPLATES_NAME: "Vorlagen" + LABEL_SECURITY_NAME: "Sicherheit" + LABEL_SOCIAL_NAME: "Social" + LABEL_THEMES_NAME: "Themen" + LABEL_CHANGE_PASSWORD_NAME: "Passwort" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Zurück" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filter" + BUTTON_SAVE: "Speichern" + BUTTON_ADD_FILTER: "Filter hinzufügen" + BUTTON_DELETE: "Löschen" + BUTTON_RAW_SCRIPT: "Benutzerdefiniertes Skript verwenden" + SUBNAME_NONE: "Keine" + SUBNAME_MOVE_TO: "Verschieben nach \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Weiterleiten nach \"%EMAIL%\"" + SUBNAME_REJECT: "Ablehnen" + SUBNAME_VACATION_MESSAGE: "Urlaubsbenachrichtigung" + SUBNAME_DISCARD: "Verwerfen" + CAPABILITY_LABEL: "Unterstützte Module" + LOADING_PROCESS: "Aktualisiere Filterliste" + DELETING_ASK: "Sind Sie sicher?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Die Änderungen müssen auf dem Server gespeichert werden." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identität" + LABEL_DISPLAY_NAME: "Name" + LABEL_REPLY_TO: "Antwort an" + LABEL_SIGNATURE: "Signatur" + LABEL_ADD_SIGNATURE_TO_ALL: "Signatur zu allen ausgehenden Nachrichten hinzufügen" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Sicherheit" + LABEL_CONFIGURE_TWO_FACTOR: "Zwei-Faktor-Authentifizierung konfigurieren" + LABEL_AUTOLOGOUT: "Automatische Abmeldung" + AUTOLOGIN_NEVER_OPTION_NAME: "Nie" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% Minute(n)" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% Stunde(n)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Allgemein" + LABEL_LANGUAGE: "Sprache" + LABEL_IDENTITY: "Identity" + LABEL_LAYOUT: "Layout" + LABEL_LAYOUT_NO_SPLIT: "Keine Aufteilung" + LABEL_LAYOUT_VERTICAL_SPLIT: "Vertikale Aufteilung" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontale Aufteilung" + LABEL_EDITOR: "Standard-Texteditor" + LABEL_EDITOR_HTML: "HTML" + LABEL_EDITOR_PLAIN: "Unformatierter Text" + LABEL_EDITOR_HTML_FORCED: "HTML (erzwungen)" + LABEL_EDITOR_PLAIN_FORCED: "Unformatierter Text (erzwungen)" + LABEL_ANIMATION: "Interface-Animation" + LABEL_ANIMATION_FULL: "Komplett" + LABEL_ANIMATION_NORMAL: "Normal" + LABEL_ANIMATION_NONE: "Keine" + LABEL_VIEW_OPTIONS: "Optionen anzeigen" + LABEL_USE_PREVIEW_PANE: "Vorschaufenster nutzen" + LABEL_USE_CHECKBOXES_IN_LIST: "Kontrollkästchen in der Liste anzeigen" + LABEL_USE_THREADS: "Als Unterhaltungen anzeigen" + LABEL_REPLY_SAME_FOLDER: "Antworten im gleichen Ordner wie die Nachricht, auf die geantwortet wurde, abspeichern" + LABEL_SHOW_IMAGES: "In der Nachricht enthaltene Bilder immer anzeigen" + LABEL_SHOW_ANIMATION: "Animation anzeigen" + LABEL_MESSAGE_PER_PAGE: "Nachrichten pro Seite" + LABEL_NOTIFICATIONS: "Benachrichtigungen" + LABEL_SOUND_NOTIFICATION: "Benachrichtigungston" + LABEL_CHROME_NOTIFICATION_DESC: "Popups einblenden, wenn neue Nachrichten vorhanden sind" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Vom Browser blockiert.)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Kontakte" + LABEL_CONTACTS_AUTOSAVE: "Empfänger automatisch zu Ihrem Adressbuch hinzuzufügen" + LEGEND_CONTACTS_SYNC: "Remote-Synchronisierung (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Remote-Synchronisierung aktivieren" + LABEL_CONTACTS_SYNC_SERVER: "Server" + LABEL_CONTACTS_SYNC_AB_URL: "Adressbuch-URL" + LABEL_CONTACTS_SYNC_USER: "Benutzer" + LABEL_CONTACTS_SYNC_PASSWORD: "Passwort" + SETTINGS_THEMES: + LEGEND_THEMES: "Themen" + LEGEND_THEMES_CUSTOM: "Konfiguration der selbsterstellten Themen" + LABEL_CUSTOM_TYPE: "Typ" + LABEL_CUSTOM_TYPE_LIGHT: "Hell" + LABEL_CUSTOM_TYPE_DARK: "Dunkel" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Hintergrund" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Hintergrundbild hochladen (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Datei ist zu groß" + ERROR_FILE_TYPE_ERROR: "Ungültiger Dateityp (nur JPG und PNG)" + ERROR_UNKNOWN: "Ein unbekannter Fehler trat beim Hochladen auf" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Mit Google verbinden" + BUTTON_GOOGLE_DISCONNECT: "Von Google abmelden" + MAIN_GOOGLE_DESC: "Nach der Aktivierung der Anmeldung per Google können Sie sich hier mit dem Google-Button im Anmeldedialog anmelden." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Mit Facebook verbinden" + BUTTON_FACEBOOK_DISCONNECT: "Von Facebook abmelden" + MAIN_FACEBOOK_DESC: "Nach der Aktivierung der Anmeldung per Facebook können Sie sich hier mit dem Facebook-Button im Anmeldedialog anmelden." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Mit Twitter verbinden" + BUTTON_TWITTER_DISCONNECT: "Von Twitter abmelden" + MAIN_TWITTER_DESC: "Nach der Aktivierung der Anmeldung per Twitter können Sie sich hier mit dem Twitter-Button im Anmeldedialog anmelden." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Ordnerliste" + BUTTON_CREATE: "Ordner anlegen" + BUTTON_SYSTEM: "Systemordner" + BUTTON_DELETE: "Löschen" + BUTTON_SUBSCRIBE: "Abonnieren" + BUTTON_UNSUBSCRIBE: "Abonnement beenden" + LOADING_PROCESS: "Ordnerliste wird geladen" + CREATING_PROCESS: "Ordner wird angelegt" + DELETING_PROCESS: "Ordner wird gelöscht" + RENAMING_PROCESS: "Ordner wird umbenannt" + DELETING_ASK: "Sind Sie sicher?" + TO_MANY_FOLDERS_DESC_1: "Sie haben zu viele Ordner!" + TO_MANY_FOLDERS_DESC_2: "Aus Leistungsgründen zeigen wir nur einen Teil davon an." + HELP_DELETE_FOLDER: "Ordner löschen" + HELP_SHOW_HIDE_FOLDER: "Ordner ein-/ausblenden" + HELP_CHECK_FOR_NEW_MESSAGES: "Auf neue Nachrichten prüfen/nicht prüfen" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Konten" + LEGEND_IDENTITIES: "Identitäten" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Konten und Identitäten" + BUTTON_ADD_ACCOUNT: "Konto hinzufügen" + BUTTON_ADD_IDENTITY: "Identität hinzufügen" + BUTTON_DELETE: "Löschen" + LOADING_PROCESS: "Aktualisiere Kontenliste" + DELETING_ASK: "Sind Sie sicher?" + DEFAULT_IDENTITY_LABEL: "Standard" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identität" + LEGEND_IDENTITIES: "Zusätzliche Identitäten" + LABEL_DEFAULT: "Standard" + LABEL_DISPLAY_NAME: "Name" + LABEL_REPLY_TO: "Antwort an" + LABEL_SIGNATURE: "Signatur" + LABEL_ADD_SIGNATURE_TO_ALL: "Signatur zu allen ausgehenden Nachrichten hinzufügen" + BUTTON_ADD_IDENTITY: "Identität hinzufügen" + BUTTON_DELETE: "Löschen" + LOADING_PROCESS: "Aktualisiere Identitätsliste" + DELETING_ASK: "Sind Sie sicher?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Passwort ändern" + LABEL_CURRENT_PASSWORD: "Aktuelles Passwort" + LABEL_NEW_PASSWORD: "Neues Passwort" + LABEL_REPEAT_PASSWORD: "Neues Passwort bestätigen" + BUTTON_UPDATE_PASSWORD: "Neues Passwort setzen" + ERROR_PASSWORD_MISMATCH: "Passwörter stimmen nicht überein; versuchen Sie es bitte erneut" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "OpenPGP-Schlüssel importieren" + BUTTON_GENERATE_OPEN_PGP_KEYS: "OpenPGP-Schlüssel generieren" + TITLE_PRIVATE: "Privat" + TITLE_PUBLIC: "Öffentlich" + DELETING_ASK: "Sind Sie sicher?" + GENERATE_ONLY_HTTPS: "Nur HTTPS" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Tastaturkürzel-Hilfe" + TAB_MAILBOX: "Postfach" + TAB_MESSAGE_LIST: "Nachrichtenliste" + TAB_MESSAGE_VIEW: "Nachrichtenansicht" + TAB_COMPOSE: "Nachricht schreiben" + LABEL_OPEN_USER_DROPDOWN: "Benutzerauswahl öffnen" + LABEL_REPLY: "Antworten" + LABEL_REPLY_ALL: "Allen Antworten" + LABEL_FORWARD: "Weiterleiten" + LABEL_FORWARD_MULTIPLY: "Als Anhang/Anhänge weiterleiten" + LABEL_HELP: "Hilfe" + LABEL_CHECK_ALL: "Alle Nachrichten auswählen" + LABEL_ARCHIVE: "Archivieren" + LABEL_DELETE: "Löschen" + LABEL_OPEN_THREAD: "Ausgewählte Unterhaltung öffnen" + LABEL_MOVE: "Verschieben" + LABEL_READ: "Ausgewählte Nachrichten als gelesen markieren" + LABEL_UNREAD: "Ausgewählte Nachrichten als ungelesen markieren" + LABEL_IMPORTANT: "Wichtig, ausgewählte Nachrichten markieren" + LABEL_SEARCH: "Suchen" + LABEL_CANCEL_SEARCH: "Suche abbrechen" + LABEL_FULLSCREEN_ENTER: "Vollbild (Vorschaubereich-Layout)" + LABEL_VIEW_MESSAGE_ENTER: "Nachricht anzeigen (kein Vorschaubereich-Layout)" + LABEL_SWITCH_TO_MESSAGE: "Fokus auf ausgewählte Nachricht schalten" + LABEL_SWITCH_TO_FOLDER_LIST: "Fokus auf Ordnerliste schalten" + LABEL_FULLSCREEN_TOGGLE: "Vollbildmodus umschalten" + LABEL_BLOCKQUOTES_TOGGLE: "Nachrichten-Blockzitate umschalten" + LABEL_THREAD_NEXT: "Nächste Nachricht in Unterhaltung" + LABEL_THREAD_PREV: "Vorherige Nachricht in Unterhaltung" + LABEL_PRINT: "Drucken" + LABEL_EXIT_FULLSCREEN: "Vollbildmodus verlassen" + LABEL_CLOSE_MESSAGE: "Nachricht schließen (kein Vorschaubereich-Layout)" + LABEL_SWITCH_TO_LIST: "Fokus auf Nachrichtenliste zurückschalten" + LABEL_OPEN_COMPOSE_POPUP: "Erstellen-Popup öffnen" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Identitätsauswahl öffnen" + LABEL_SAVE_MESSAGE: "Nachricht speichern" + LABEL_SEND_MESSAGE: "Nachricht senden" + LABEL_CLOSE_COMPOSE: "Popup schließen" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "Keine öffentlichen Schlüssel gefunden" + NO_PUBLIC_KEYS_FOUND_FOR: "Keine öffentlichen Schlüssel für die E-Mail \"%EMAIL%\" gefunden" + NO_PRIVATE_KEY_FOUND: "Keine privaten Schlüssel gefunden" + NO_PRIVATE_KEY_FOUND_FOR: "Keine privaten Schlüssel für die E-Mail \"%EMAIL%\" gefunden" + ADD_A_PUBLICK_KEY: "Öffentlicher Schlüssel hinzufügen" + SELECT_A_PRIVATE_KEY: "Privaten Schlüssel auswählen" + UNVERIFIRED_SIGNATURE: "Nich verifizierte Unterschrift" + DECRYPTION_ERROR: "OpenPGP-Entschlüsselungsfehler" + GOOD_SIGNATURE: "Gültige Unterschrift von %USER%" + PGP_ERROR: "OpenPGP-Fehler: %ERROR%" + SPECIFY_FROM_EMAIL: "Bitte die VON-E-Mail-Adresse angeben" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Bitte geben Sie mindestens einen Empfänger an" + NOTIFICATIONS: + INVALID_TOKEN: "Ungültiger Token" + AUTH_ERROR: "Authentifizierung fehlgeschlagen" + ACCESS_ERROR: "Zugriffsfehler" + CONNECTION_ERROR: "Serververbindung kann nicht hergestellt werden" + CAPTCHA_ERROR: "Falsche CAPTCHA-Eingabe." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Diese Social-ID ist bisher mit keinem E-Mail-Konto verbunden. Melden Sie sich + mit Ihren E-Mail-Anmeldedaten an und aktivieren Sie diese Funktion in Ihren + Konteneinstellungen. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Diese Social-ID ist bisher mit keinem E-Mail-Konto verbunden. Melden Sie sich + mit Ihren E-Mail-Anmeldedaten an und aktivieren Sie diese Funktion in Ihren + Konteneinstellungen. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Diese Social-ID ist bisher mit keinem E-Mail-Konto verbunden. Melden Sie sich + mit Ihren E-Mail-Anmeldedaten an und aktivieren Sie diese Funktion in Ihren + Konteneinstellungen. + DOMAIN_NOT_ALLOWED: "Diese Domain ist nicht zugelassen." + ACCOUNT_NOT_ALLOWED: "Konto ist nicht zugelassen." + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Zwei-Faktor-Authentifizierung erforderlich" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Fehler bei Zwei-Faktor-Authentifizierung" + COULD_NOT_SAVE_NEW_PASSWORD: "Neues Passwort konnte nicht gespeichert werden" + CURRENT_PASSWORD_INCORRECT: "Aktuelles Passwort falsch" + NEW_PASSWORD_SHORT: "Passwort ist zu kurz" + NEW_PASSWORD_WEAK: "Passwort ist zu einfach" + NEW_PASSWORD_FORBIDDENT: "Passwort enthält unzulässige Zeichen" + CONTACTS_SYNC_ERROR: "Fehler bei Kontakte-Synchronisierung" + CANT_GET_MESSAGE_LIST: "Die Nachrichtenliste ist nicht verfügbar" + CANT_GET_MESSAGE: "Diese Nachricht ist nicht verfügbar" + CANT_DELETE_MESSAGE: "Diese Nachricht kann nicht gelöscht werden" + CANT_MOVE_MESSAGE: "Diese Nachricht kann nicht verschoben werden" + CANT_SAVE_MESSAGE: "Diese Nachricht kann nicht gespeichert werden" + CANT_SEND_MESSAGE: "Diese Nachricht kann nicht gesendet werden" + INVALID_RECIPIENTS: "Ungültige Empfängeradressen" + CANT_SAVE_FILTERS: "Die Filter können nicht gespeichert werden" + CANT_GET_FILTERS: "Die Filter sind nicht verfügbar" + FILTERS_ARE_NOT_CORRECT: "Die Filter sind fehlerhaft" + CANT_CREATE_FOLDER: "Dieser Ordner kann nicht angelegt werden" + CANT_RENAME_FOLDER: "Dieser Ordner kann nicht umbenannt werden" + CANT_DELETE_FOLDER: "Dieser Ordner kann nicht gelöscht werden" + CANT_DELETE_NON_EMPTY_FOLDER: "Der Ordner kann nicht gelöscht werden; er ist nicht leer" + CANT_SUBSCRIBE_FOLDER: "Dieser Ordner kann nicht abonniert werden" + CANT_UNSUBSCRIBE_FOLDER: "Das Abonnement dieses Ordners kann nicht gelöscht werden" + CANT_SAVE_SETTINGS: "Einstellungen können nicht gespeichert werden" + CANT_SAVE_PLUGIN_SETTINGS: "Einstellungen können nicht gespeichert werden" + DOMAIN_ALREADY_EXISTS: "Diese Domain existiert bereits" + CANT_INSTALL_PACKAGE: "Paket konnte nicht installiert werden" + CANT_DELETE_PACKAGE: "Paket konnte nicht entfernt werden" + INVALID_PLUGIN_PACKAGE: "Plugin-Paket ist ungültig" + UNSUPPORTED_PLUGIN_PACKAGE: "Plugin-Paket wird nicht unterstützt" + LICENSING_SERVER_IS_UNAVAILABLE: "Der Subscription-Server kann nicht erreicht werden" + LICENSING_DOMAIN_EXPIRED: "Die Subscription dieser Domain ist abgelaufen." + LICENSING_DOMAIN_BANNED: "Die Subscription dieser Domain ist gesperrt." + DEMO_SEND_MESSAGE_ERROR: "Dieses Demokonto darf aus Sicherheitsgründen keine Nachrichten an externe E-Mail-Adressen versenden!" + DEMO_ACCOUNT_ERROR: "Aus Sicherheitsgründen ist dieses Konto nicht zu dieser Aktion berechtigt!" + ACCOUNT_ALREADY_EXISTS: "Dieses Konto existiert bereits" + ACCOUNT_DOES_NOT_EXIST: "Dieser Account existiert nicht." + MAIL_SERVER_ERROR: "Beim Zugriff auf den E-Mail-Server trat ein Fehler auf." + INVALID_INPUT_ARGUMENT: "Ungültige Eingabe" + UNKNOWN_ERROR: "Unbekannter Fehler" + STATIC: + BACK_LINK: "Aktualisieren" + DOMAIN_LIST_DESC: "Liste der Domains, auf die zugegriffen werden darf" + PHP_EXSTENSIONS_ERROR_DESC: "Notwendige PHP-Erweiterungen sind in Ihrer PHP-Konfiguration nicht vorhanden!" + PHP_VERSION_ERROR_DESC: "Ihre PHP Version (%VERSION%) ist älter als die notwendige Version: 5.3.0!" + NO_SCRIPT_TITLE: "Diese Anwendung benötigt JavaScript." + NO_SCRIPT_DESC: | + Ihr Browser unterstützt JavaScript nicht. + Aktivieren Sie bitte die JavaScript-Unterstützung in Ihrem Browser und versuchen Sie es erneut. + NO_COOKIE_TITLE: "Diese Anwendung benötigt Cookies." + NO_COOKIE_DESC: | + Ihr Browser unterstützt Cookies nicht. + Aktivieren Sie bitte die Cookie-Unterstützung in Ihrem Browser und versuchen Sie es erneut. + BAD_BROWSER_TITLE: "Ihr Browser ist veraltet." + BAD_BROWSER_DESC: | + Um alle Funktionen dieser Anwendung nutzen zu können, + sollten Sie einen der folgenden Browser herunterladen und installieren diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/el_GR.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/el_GR.yml new file mode 100755 index 00000000..1a190bc8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/el_GR.yml @@ -0,0 +1,547 @@ +el_GR: + LOGIN: + LABEL_EMAIL: "Διεύθυνση ηλεκτρονικού ταχυδρομείου" + LABEL_LOGIN: "Είσοδος" + LABEL_PASSWORD: "Κωδικός πρόσβασης" + LABEL_SIGN_ME: "Μείνετε συνδεδεμένοι" + LABEL_VERIFICATION_CODE: "Κωδικός επαλήθευσης" + LABEL_DONT_ASK_VERIFICATION_CODE: "Να μην ζητηθεί κωδικός για 2 εβδομάδες" + BUTTON_SIGN_IN: "Σύνδεση" + TITLE_SIGN_IN_GOOGLE: "Σύνδεση με χρήση του Google" + TITLE_SIGN_IN_FACEBOOK: "Σύνδεση με χρήση του Facebook" + TITLE_SIGN_IN_TWITTER: "Σύνδεση με χρήση του Twitter" + LABEL_FORGOT_PASSWORD: "Ξέχασα τον κωδικό μου" + LABEL_REGISTRATION: "Εγγραφή" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Προσθήκη λογαριασμού" + BUTTON_SETTINGS: "Ρυθμίσεις" + BUTTON_HELP: "Βοήθεια" + BUTTON_LOGOUT: "Έξοδος" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Αναζήτηση" + TITLE_ADV: "Προχωρημένη αναζήτηση" + LABEL_ADV_FROM: "Από" + LABEL_ADV_TO: "Προς" + LABEL_ADV_SUBJECT: "Θέμα" + LABEL_ADV_TEXT: "Κείμενο" + LABEL_ADV_HAS_ATTACHMENT: "Έχει συνημμένο" + LABEL_ADV_HAS_ATTACHMENTS: "Έχει συνημμένα" + LABEL_ADV_FLAGGED: "Με σημαία" + LABEL_ADV_UNSEEN: "Δεν έχουν διαβαστεί" + LABEL_ADV_DATE: "Ημερομηνία" + LABEL_ADV_DATE_ALL: "Όλα" + LABEL_ADV_DATE_3_DAYS: "Έως 3 ημέρες πρίν" + LABEL_ADV_DATE_7_DAYS: "Έως 1 εβδομάδα πριν" + LABEL_ADV_DATE_MONTH: "Έως 1 μήνα πριν" + LABEL_ADV_DATE_3_MONTHS: "Έως 3 μήνες πριν" + LABEL_ADV_DATE_6_MONTHS: "Έως 6 μήνες πριν" + LABEL_ADV_DATE_YEAR: "Έως 1 χρόνο πριν" + BUTTON_ADV_SEARCH: "Αναζήτηση" + PREVIEW_POPUP: + FULLSCREEN: "Ενναλαγή πλήρους οθόνης" + ZOOM: "Μεγέθυνση/Σμίκρυνση" + CLOSE: "Κλείσιμο (Esc)" + LOADING: "Φορτώνει..." + GALLERY_PREV: "Προηγούμενο (αριστερό βέλος)" + GALLERY_NEXT: "Επόμενο (δεξί βέλος)" + GALLERY_COUNTER: "%curr% από %total%" + IMAGE_ERROR: "Η εικόνα δεν μπόρεσε να φορτωθεί." + AJAX_ERROR: "Το περιεχόμενο δεν μπόρεσε να φορτωθεί." + FOLDER_LIST: + BUTTON_COMPOSE: "Νέο μήνυμα" + BUTTON_CONTACTS: "Επαφές" + INBOX_NAME: "Εισερχόμενα" + SENT_NAME: "Απεσταλμένα" + DRAFTS_NAME: "Πρόχειρα" + SPAM_NAME: "Ανεπιθύμητα" + TRASH_NAME: "Άχρηστα" + ARCHIVE_NAME: "Αρχείο" + QUOTA: + TITLE: "Χρήση αποθηκευτικού χώρου" + MESSAGE_LIST: + BUTTON_RELOAD: "Φόρτωσε ξανά τη λίστα των μηνυμάτων" + BUTTON_MOVE_TO: "Μετακίνησε σε" + BUTTON_DELETE: "Διαγραφή" + BUTTON_ARCHIVE: "Αρχειοθέτηση" + BUTTON_SPAM: "Ανεπιθύμητο" + BUTTON_NOT_SPAM: "Όχι ανεπιθύμητο" + BUTTON_EMPTY_FOLDER: "Καθάρισε το φάκελο" + BUTTON_MULTY_FORWARD: "Προώθησε σαν συνημμένο(α)" + BUTTON_DELETE_WITHOUT_MOVE: "Διέγραψε μόνιμα" + BUTTON_MORE: "Περισσότερα" + MENU_SET_SEEN: "Σήμανε σαν διαβασμένο" + MENU_SET_ALL_SEEN: "Σήμανση όλων σαν διαβασμένα" + MENU_UNSET_SEEN: "Σήμανση σαν μη διαβασμένο" + MENU_SET_FLAG: "Σήμανση" + MENU_UNSET_FLAG: "Διαγραφή σήμανσης" + MENU_SELECT_ALL: "Όλα" + MENU_SELECT_NONE: "Κανένα" + MENU_SELECT_INVERT: "Αντέστρεψε" + MENU_SELECT_UNSEEN: "Μη διαβασμένο" + MENU_SELECT_SEEN: "Διαβασμένο" + MENU_SELECT_FLAGGED: "Σημαδεμένο" + MENU_SELECT_UNFLAGGED: "Μη σημαδεμένο" + EMPTY_LIST: "Άδεια λίστα." + EMPTY_SEARCH_LIST: "Δεν υπάρχουν μηνύματα που να ταιριάζουν στην αναζήτηση." + SEARCH_RESULT_FOR: "Αποτελέσματα αναζήτησης για \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "πίσω στη λίστα των μηνυμάτων" + LIST_LOADING: "Φορτώνει" + EMPTY_SUBJECT_TEXT: "(Κανένα θέμα)" + PUT_MESSAGE_HERE: "Σύρετε εδώ το μήνυμα για να φανεί στη λίστα" + TODAY_AT: "σήμερα στις %TIME%" + YESTERDAY_AT: "εχθές στις %TIME% " + SEARCH_PLACEHOLDER: "Αναζήτηση" + NEW_MESSAGE_NOTIFICATION: "Έχετε %COUNT% νέα μηνύματα!" + QUOTA_SIZE: "Χρησιμοποιούνται %SIZE% (%PROC%%) από %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Σύνταξη" + BUTTON_BACK: "Πίσω" + BUTTON_CLOSE: "Κλείσιμο" + BUTTON_DELETE: "Διαγραφή" + BUTTON_ARCHIVE: "Αρχειοθέτηση" + BUTTON_SPAM: "Ανεπιθύμητο" + BUTTON_NOT_SPAM: "Όχι ανεπιθύμητο" + BUTTON_MOVE_TO: "Μετακίνησε σε" + BUTTON_MORE: "Περισσότερα" + BUTTON_REPLY: "Απάντηση" + BUTTON_REPLY_ALL: "Απάντηση σε όλους" + BUTTON_FORWARD: "Προώθηση" + BUTTON_FORWARD_AS_ATTACHMENT: "Προώθηση ως συνημμένο" + BUTTON_EDIT_AS_NEW: "Σύνταξη σαν νέο" + BUTTON_SHOW_IMAGES: "Εμφάνιση εξωτερικών εικόνων" + BUTTON_NOTIFY_READ_RECEIPT: "Ο αποστολέας ζήτησε να ειδοποιηθεί όταν διαβάσετε αυτό το μήνυμα." + BUTTON_IN_NEW_WINDOW: "Άνοιγμα σε ξεχωριστό παράθυρο" + BUTTON_THREAD_LIST: "Λίστα νημάτων" + BUTTON_THREAD_PREV: "Προηγούμενο" + BUTTON_THREAD_NEXT: "Επόμενο" + BUTTON_THREAD_MORE: "Περισσότερα μηνύματα" + MENU_HEADERS: "Εμφάνιση των επικεφαλίδων του μηνύματος" + MENU_VIEW_ORIGINAL: "Εμφάνιση πηγαίου μηνύματος" + MENU_DOWNLOAD_ORIGINAL: "Μεταφόρτωση σαν αρχείο .eml" + MENU_FILTER_SIMILAR: "Φιλτράρισμα μηνυμάτων όπως αυτό" + MENU_PRINT: "Εκτύπωση" + EMPTY_SUBJECT_TEXT: "(Κανένα θέμα)" + LABEL_SUBJECT: "Θέμα" + LABEL_DATE: "Ημερομηνία" + LABEL_FROM: "Από" + LABEL_FROM_SHORT: "από" + LABEL_TO: "Προς" + LABEL_TO_SHORT: "προς" + LABEL_CC: "Κοινοποίηση" + LABEL_BCC: "Τυφλή κοινοποίηση" + LABEL_REPLY_TO: "Απάντηση στον" + PRINT_LABEL_FROM: "Από" + PRINT_LABEL_TO: "Προς" + PRINT_LABEL_CC: "Κοινοποίηση" + PRINT_LABEL_BCC: "Τυφλή κοινοποίηση" + PRINT_LABEL_REPLY_TO: "Απάντηση στον" + PRINT_LABEL_DATE: "Ημερομηνία" + PRINT_LABEL_SUBJECT: "Θέμα" + PRINT_LABEL_ATTACHMENTS: "Συνημμένα" + MESSAGE_LOADING: "Φορτώνει" + MESSAGE_VIEW_DESC: "Επιλέξτε ένα μήνυμα από τη λίστα για να εμφανιστεί εδώ." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Κωδικός" + PGP_SIGNED_MESSAGE_DESC: "Μήνυμα υπογεγραμμένο με OpenPGP (κάντε κλικ για έλεγχο)" + PGP_ENCRYPTED_MESSAGE_DESC: "Μήνυμα κωδικοποιημένο με OpenPGP (κάντε κλίκ για αποκωδικοποίηση)" + LINK_DOWNLOAD_AS_ZIP: "Μεταφόρτωση σαν zip" + LINK_SAVE_TO_OWNCLOUD: "Αποθήκευση στο ownCloud" + LINK_SAVE_TO_DROPBOX: "Αποθήκευση στο Dropbox" + READ_RECEIPT: + SUBJECT: "Αποδεικτικό Ανάγνωσης (παρουσιάστηκε) - %SUBJECT%" + BODY: | + Αυτή είναι ένα αποδεικτικό ανάγωσης από το μήνυμα που στείλατε προς %READ-RECEIPT%. + + Παρατήρηση: "Αυτή το αποδεικτικό ανάγνωσης είναι απλώς μια ένδειξη ότι το μήνυμα παρουσιάστηκε στον υπολογιστή του παραλήπτη." + Δεν υπάρχει καμία εγγύηση πως ο παραλήπτης διάβασε ή κατανόησε το περιεχόμενο του μηνύματος. + SUGGESTIONS: + SEARCHING_DESC: "Αναζήτηση..." + CONTACTS: + LEGEND_CONTACTS: "Επαφές" + SEARCH_INPUT_PLACEHOLDER: "Αναζήτηση" + BUTTON_ADD_CONTACT: "Προσθήκη επαφής" + BUTTON_CREATE_CONTACT: "Δημιουργία" + BUTTON_UPDATE_CONTACT: "Ενημέρωση" + BUTTON_IMPORT: "Εισαγωγή (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Εξαγωγή (csv, vcf, vCard)" + BUTTON_EXPORT_CSV: "Εξαγωγή (csv)" + ERROR_IMPORT_FILE: "Λάθος εισαγωγής (άκυρη μορφοποίηση αρχείου)" + LIST_LOADING: "Φορτώνει" + EMPTY_LIST: "Δεν υπάρχουν επαφές εδώ" + EMPTY_SEARCH: "Δεν βρέθηκαν επαφές" + CLEAR_SEARCH: "Καθαρισμός αναζήτησης" + CONTACT_VIEW_DESC: "Επιλέξτε μια επαφή από τη λίστα για να εμφανιστεί εδώ." + LABEL_DISPLAY_NAME: "Εμφάνιση ονόματος" + LABEL_EMAIL: "Ηλεκτρονική αλληλογραφία" + LABEL_PHONE: "Τηλέφωνο" + LABEL_WEB: "Ιστός" + LABEL_BIRTHDAY: "Γενέθλια" + LINK_ADD_EMAIL: "Προσθήκη ηλεκτρονικής διεύθυνσης αλληλογραφίας" + LINK_ADD_PHONE: "Προσθήκη τηλεφώνου" + LINK_BIRTHDAY: "Γενέθλια" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Εισαγωγή ονόματος εμφάνισης" + PLACEHOLDER_ENTER_LAST_NAME: "Εισαγωγή επωνύμου" + PLACEHOLDER_ENTER_FIRST_NAME: "Εισαγωγή ονόματος" + PLACEHOLDER_ENTER_NICK_NAME: "Εισαγωγή πρόσθετου ονόματος" + LABEL_READ_ONLY: "Μόνο για ανάγνωση" + LABEL_SHARE: "Διαμοιρασμός " + ADD_MENU_LABEL: "Προσθήκη" + ADD_MENU_NICKNAME: "Πρόσθετο όνομα" + ADD_MENU_NOTES: "Σημειώσεις" + ADD_MENU_EMAIL: "Ηλεκτρονική αλληλογραφία" + ADD_MENU_PHONE: "Τηλέφωνο" + ADD_MENU_URL: "Τοποθεσία ιστού" + ADD_MENU_ADDRESS: "Διεύθυνση" + ADD_MENU_BIRTHDAY: "Γενέθλια" + ADD_MENU_TAGS: "Ετικέτες" + BUTTON_SHARE_NONE: "Κανένα" + BUTTON_SHARE_ALL: "Όλοι" + BUTTON_SYNC: "Συγχρονισμός (CardDAV)" + COMPOSE: + TITLE_FROM: "Από" + TITLE_TO: "Προς" + TITLE_CC: "Κοινοποίηση" + TITLE_BCC: "Τυφλή κοινοποίηση" + TITLE_REPLY_TO: "Απάντηση στον" + TITLE_SUBJECT: "Θέμα" + LINK_SHOW_INPUTS: "Εμφάνισε όλα τα πεδία" + BUTTON_SEND: "Αποστολή" + BUTTON_SAVE: "Αποθήκευση" + BUTTON_DELETE: "Διαγραφή" + BUTTON_CANCEL: "Ακύρωση" + BUTTON_MINIMIZE: "Ελαχιστοποίηση" + SAVED_TIME: "Αποθηκεύτηκε στις %TIME%" + SAVED_ERROR_ON_SEND: "Το μήνυμα απεστάλη αλλά δεν αποθηκεύτηκε στο φάκελο απεσταλμένων " + DISCARD_UNSAVED_DATA: "Να απορριφθούν τα μη αποθηκευμένα δεδομένα;" + ATTACH_FILES: "Επισύναψη αρχείων" + ATTACH_DROP_FILES_DESC: "Σύρετε εδώ αρχεία" + ATTACH_ITEM_CANCEL: "Ακύρωση" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% έγραψε" + FORWARD_MESSAGE_TOP_TITLE: "-------- Προωθημένο μήνυμα -------" + FORWARD_MESSAGE_TOP_FROM: "Από" + FORWARD_MESSAGE_TOP_TO: "Προς" + FORWARD_MESSAGE_TOP_CC: "Κοινοποίηση" + FORWARD_MESSAGE_TOP_SENT: "Απεσταλμένα" + FORWARD_MESSAGE_TOP_SUBJECT: "Θέμα" + EMPTY_TO_ERROR_DESC: "Παρακαλώ ορίστε τουλάχιστον ένα παραλήπτη" + NO_ATTACHMENTS_HERE_DESC: "Δεν υπάρχουν συνημμένα εδώ." + ATTACHMENTS_ERROR_DESC: "Προειδοποίηση! Δεν έχουν μεταφορτωθεί όλα τα συνημμένα." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Δεν έχουν μεταφορτωθεί ακόμη όλα τα συνημμένα." + BUTTON_REQUEST_READ_RECEIPT: "Ζητήστε αποδεικτικό ανάγνωσης" + BUTTON_MARK_AS_IMPORTANT: "Σημειώστε το σαν σημαντικό" + BUTTON_OPEN_PGP: "OpenPGP (Απλό κείμενο μόνο)" + BUTTON_REQUEST_DSN: "Ζητήστε αποδεικτικό παράδοσης" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Κλείσιμο" + POPUPS_ASK: + BUTTON_YES: "Ναι" + BUTTON_NO: "Όχι" + DESC_WANT_CLOSE_THIS_WINDOW: "Είστε σίγουροι πως θέλετε να κλείσετε αυτό το παράθυρο;" + DESC_WANT_DELETE_MESSAGES: "Είστε σίγουροι πως θέλετε να διαγράψετε το (τα) μήνυμα(τα);" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Επιλέξτε τη γλώσσα σας" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Προσθήκη λογαριασμού;" + BUTTON_ADD_ACCOUNT: "Προσθήκη" + TITLE_UPDATE_ACCOUNT: "Ενημέρωση λογαριασμού;" + BUTTON_UPDATE_ACCOUNT: "Ενημέρωση" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Προσθήκη ταυτότητας;" + TITLE_UPDATE_IDENTITY: "Ενημέρωση ταυτότητας;" + BUTTON_ADD_IDENTITY: "Προσθήκη" + BUTTON_UPDATE_IDENTITY: "Ενημέρωση" + LABEL_EMAIL: "Ηλεκτρονική αλληλογραφία" + LABEL_NAME: "Όνομα" + LABEL_REPLY_TO: "Απάντηση στον" + LABEL_SIGNATURE: "Υπογραφή" + LABEL_CC: "Cc" + LABEL_BCC: "Bcc" + LABEL_SIGNATURE_INSERT_BEFORE: "Προσθήκη της υπογραφής πριν το προτότυπο κείμενο στις απαντήσεις" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Δημιουργία φακέλου;" + LABEL_NAME: "Όνομα φακέλου" + LABEL_PARENT: "Φάκελος γονέας" + BUTTON_CREATE: "Δημιουργία" + BUTTON_CANCEL: "Ακύρωση" + BUTTON_CLOSE: "Κλείσιμο" + TITLE_CREATING_PROCESS: "Δημιουργία φακέλου" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Διαγραφή όλων των μηνυμάτων στο φάκελο;" + BUTTON_CLEAR: "Καθαρισμός" + BUTTON_CANCEL: "Ακύρωση" + BUTTON_CLOSE: "Κλείσιμο" + DANGER_DESC_WARNING: "Προειδοποίηση!" + DANGER_DESC_HTML_1: "Το αποτέλεσμα της ενέργειας θα είναι η πλήρης μετακίνηση των μηνυμάτων από το φάκελο %FOLDER%." + DANGER_DESC_HTML_2: "Αφού ξεκινήσει, η διαδικασία δεν σταματά ή ακυρώνεται." + TITLE_CLEARING_PROCESS: "Διαγραφή όλων των μηνυμάτων στο φάκελο..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Εισαγωγή κλειδιού OpenPGP" + BUTTON_IMPORT_OPEN_PGP_KEY: "Εισαγωγή" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "Προβολή κλειδιού OpenPGP" + BUTTON_SELECT: "Επιλογή" + BUTTON_CLOSE: "Κλείσιμο" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Δημιουργία κλειδιών OpenPGP" + LABEL_EMAIL: "Διεύθυνση ηλεκτρονικής αλληλογραφίας" + LABEL_NAME: "Όνομα" + LABEL_PASSWORD: "Κωδικός" + LABEL_KEY_BIT_LENGTH: "Μήκος κλειδιού" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Δημιουργία" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP Υπογραφή/Κρυπρογράφηση" + LABEL_SIGN: "Υπογραφή" + LABEL_ENCRYPT: "Κρυπτογράφηση" + LABEL_PASSWORD: "Κωδικός" + BUTTON_SIGN: "Υπογραφή" + BUTTON_ENCRYPT: "Κρυπτογράφηση" + BUTTON_SIGN_AND_ENCRYPT: "Υπογραφή και κρυπτογράφηση" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "Αποκρυπτογράφηση OpenPGP" + LABEL_KEY: "Προσωπικό κλειδί" + LABEL_PASSWORD: "Κωδικός" + BUTTON_DECRYPT: "Αποκρυπτογράφηση" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "Τεστ ελέγχου 2 βημάτων" + LABEL_CODE: "Κώδικας" + BUTTON_TEST: "Τεστ" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Δημιουργία φίλτρου;" + TITLE_EDIT_FILTER: "Ενημέρωση φίλτρου;" + FILTER_NAME: "Όνομα" + LEGEND_CONDITIONS: "Συνθήκες" + LEGEND_ACTIONS: "Ενέργειες" + BUTTON_DONE: "Έγινε" + BUTTON_ADD_CONDITION: "Προσθήκη συνθήκης" + SELECT_ACTION_NONE: "Κανένα" + SELECT_ACTION_MOVE_TO: "Μετακίνηση σε" + SELECT_ACTION_FORWARD_TO: "Προώθηση σε" + SELECT_ACTION_REJECT: "Απόρριψη" + SELECT_ACTION_VACATION_MESSAGE: "Μήνυμα διακοπών" + SELECT_ACTION_DISCARD: "Απόρριψη" + SELECT_FIELD_FROM: "Από" + SELECT_FIELD_RECIPIENTS: "Παραλήπτες (Προς ή κοινοποίηση)" + SELECT_FIELD_SUBJECT: "Θέμα" + SELECT_FIELD_HEADER: "Επικεφαλίδα" + SELECT_FIELD_SIZE: "Μέγεθος" + SELECT_TYPE_CONTAINS: "Περιέχει" + SELECT_TYPE_NOT_CONTAINS: "Δεν περιέχει" + SELECT_TYPE_MATCHES: "Ταιριάζει (* και ? υποστηρίζονται)" + SELECT_TYPE_NOT_MATCHES: "Δεν ταιριάζει (* και ? υποστηρίζονται)" + SELECT_TYPE_REGEXP: "Κανονική έκφραση" + SELECT_TYPE_NOT_REGEXP: "Μη κανονική έκφραση" + SELECT_TYPE_EQUAL_TO: "Ίσο με" + SELECT_TYPE_NOT_EQUAL_TO: "Δεν είναι ίσο με" + SELECT_TYPE_OVER: "Πάνω" + SELECT_TYPE_UNDER: "Κάτω" + SELECT_MATCH_ANY: "Ταιριάζει ΜΕ ΟΠΟΙΟΝΔΗΠΟΤΕ από τους επόμενους κανόνες" + SELECT_MATCH_ALL: "Ταιριάζει ΜΕ ΟΛΟΥΣ τους επόμενους κανόνες" + MARK_AS_READ_LABEL: "Σήμανε σαν διαβασμένο" + REPLY_INTERVAL_LABEL: "Μεσοδιάστημα απαντήσεων (σε ημέρες)" + KEEP_LABEL: "Κράτησε" + STOP_LABEL: "Μην σταματάς να επεξεργάζεσαι κανόνες" + EMAIL_LABEL: "Ηλεκτρονική αλληλογραφία" + VACATION_SUBJECT_LABEL: "Θέμα (προαιρετικό)" + VACATION_MESSAGE_LABEL: "Μήνυμα" + VACATION_RECIPIENTS_LABEL: "Παραλήπτες (χωρισμένοι με κόμμα)" + REJECT_MESSAGE_LABEL: "Απόρριψη μηνύματος" + ALL_INCOMING_MESSAGES_DESC: "Όλα τα εισερχόμενα μηνύματα" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Επιλογή φακέλων συστήματος" + SELECT_CHOOSE_ONE: "Επέλεξε ένα" + SELECT_UNUSE_NAME: "Μην χρησιμοποιείς" + LABEL_SENT: "Απεσταλμένα" + LABEL_DRAFTS: "Πρόχειρα" + LABEL_SPAM: "Ανεπιθύμητα" + LABEL_TRASH: "Άχρηστα" + LABEL_ARCHIVE: "Αρχείο" + BUTTON_CANCEL: "Ακύρωση" + BUTTON_CLOSE: "Κλείσιμο" + NOTIFICATION_SENT: | + Δεν έχετε επιλέξει το φάκελο συστήματος "Απεσταλμένα" όπου θα τοποθετούνται τα μηνύματα μετά την αποστολή. + Αν δεν θέλετε να σώσετε τα απεσταλμένα μηνύματα, παρακαλώ επιλέξτε "Μην το χρησιμοποιείς". + NOTIFICATION_DRAFTS: "Δεν έχετε επιλέξει το φάκελο συστήματος \"Πρόχειρα\" όπου θα σώζονται τα μηνύματα κατά τη σύνθεσή τους." + NOTIFICATION_SPAM: | + Δεν έχετε επιλέξει το φάκελο συστήματος "Ανεπιθύμητα" όπου θα τοποθετούνται τα ανεπιθύμητα μηνύματα. + Αν θέλετε να απορρίπτονται τα μηνύματα οριστικά, παρακαλώ επιλέξτε "Μην τον χρησιμοποιείς". + NOTIFICATION_TRASH: | + Δεν έχετε επιλέξει τα φάκελο συστήματος "Απορρίμματα" όπου θα τοποθετούνται τα διαγραμμένα μηνύματα. + Αν επιθυμείτε να απορρίπτονται τα μηνύματα οριστικά, παρακαλώ επιλέξτε "Μην το χρησιμοποιείς". + NOTIFICATION_ARCHIVE: "Δεν έχετε επιλέξει το φάκελο συστήματος \"Αρχείο\" όπου θα τοποθετούνται τα αρχειοθετημένα μηνύματα." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "Επαλήθευση 2 επιπέδων (TOTP)" + LABEL_ENABLE_TWO_FACTOR: "Ενεργοποίηση επαλήθευσης 2 επιπέδων" + LABEL_TWO_FACTOR_USER: "Χρήστης" + LABEL_TWO_FACTOR_STATUS: "Κατάσταση" + LABEL_TWO_FACTOR_SECRET: "Μυστικό" + LABEL_TWO_FACTOR_BACKUP_CODES: "Εφεδρικοί κωδικοί" + BUTTON_CREATE: "Δημιουργία μυστικού" + BUTTON_ACTIVATE: "Ενεργοποίηση" + BUTTON_CLEAR: "Καθαρισμός" + BUTTON_LOGOUT: "Έξοδος" + BUTTON_DONE: "Έγινε" + BUTTON_TEST: "Τεστ" + LINK_TEST: "τέστ" + BUTTON_SHOW_SECRET: "Δείξε το μυστικό" + BUTTON_HIDE_SECRET: "Κρύψε το μυστικό" + TWO_FACTOR_REQUIRE_DESC: "Ο λογαριασμός σας απαιτεί να διαμορφώσετε την επαλήθευση 2 επιπέδων" + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Διαμορφωμένος" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Μη διαμορφωμένος" + TWO_FACTOR_SECRET_DESC: > + Εισάγετε την πληροφορία στον πελάτη Google Authenticator (ή οποιοδήποτε άλλο + πελάτη TOTP) χρησιμοποιώντας τον κωδικό QR που φαίνεται παρακάτω ή πληκτρολογήστε + τον κωδικό χειροκίνητα. + TWO_FACTOR_BACKUP_CODES_DESC: > + Αν δεν μπορείτε να παραλάβετε κωδικούς μέσω του Google Authenticator (ή οποιουδήποτε + άλλου πελάτη TOTP), μπορείτε να χρησιμοποιήσετε εφεδρικούς κωδικούς για την + είσοδό σας. Μετά τη χρήση ενός εφεδρικού κωδικού για είσοδο, αυτός γίνεται + ανενεργός. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Δεν μπορείτε να αλλάξετε αυτή τη ρύθμιση πριν τον έλεγχο." + TITLES: + LOADING: "Φορτώνει" + LOGIN: "Είσοδος" + MAILBOX: "Γραμματοθυρίδα" + SETTINGS: "Ρυθμίσεις" + COMPOSE: "Νέο μήνυμα" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Το αρχείο είναι πολύ μεγάλο" + ERROR_FILE_PARTIALLY_UPLOADED: "Το αρχείο μεταφορτώθηκε μερικώς λόγω αγνώστου σφάλματος" + ERROR_NO_FILE_UPLOADED: "Δεν μεταφορτώθηκε αρχείο" + ERROR_MISSING_TEMP_FOLDER: "Το προσωρινό αρχείο δεν υπάρχει" + ERROR_ON_SAVING_FILE: "Υπήρξε άγνωστο λάθος κατα τη διαδικασία μεταφόρτωσης του αρχείου" + ERROR_FILE_TYPE: "Άκυρος τύπος αρχείου" + ERROR_UNKNOWN: "Υπήρξε άγνωστο λάθος κατα τη διαδικασία μεταφόρτωσης του αρχείου" + EDITOR: + TEXT_SWITCHER_RICH_FORMATTING: "Πλούσια μορφοποίηση" + TEXT_SWITCHER_CONFIRM: "Η μορφοποίηση του κειμένου και οι εικόνες θα χαθούν. Είστε σίγουροι πως θέλετε να συνεχίσετε;" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Προσωπικό" + LABEL_GENERAL_NAME: "Γενικό" + LABEL_CONTACTS_NAME: "Επαφές" + LABEL_FOLDERS_NAME: "Φάκελοι" + LABEL_ACCOUNTS_NAME: "Λογαρισμοί" + LABEL_IDENTITY_NAME: "Ταυτότητα" + LABEL_IDENTITIES_NAME: "Ταυτότητες" + LABEL_FILTERS_NAME: "Φίλτρα" + LABEL_TEMPLATES_NAME: "Πρότυπα" + LABEL_SECURITY_NAME: "Ασφάλεια" + LABEL_SOCIAL_NAME: "Κοινωνικά" + LABEL_THEMES_NAME: "Θέματα" + LABEL_CHANGE_PASSWORD_NAME: "Κωδικός" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Πίσω" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Φίλτρα" + BUTTON_SAVE: "Αποθήκευση" + BUTTON_ADD_FILTER: "Προσθήκη φίλτρου" + BUTTON_DELETE: "Διαγραφή" + BUTTON_RAW_SCRIPT: "Χρησιμοποίησε ένα προσαρμοσμένο σενάριο χρήστη" + SUBNAME_NONE: "Κανένα" + SUBNAME_MOVE_TO: "Μετακίνηση στο \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Προώθηση στο \"%EMAIL%\"" + SUBNAME_REJECT: "Απόρριψη" + SUBNAME_VACATION_MESSAGE: "Μήνυμα διακοπών" + SUBNAME_DISCARD: "Απόρριψη" + CAPABILITY_LABEL: "Ικανότητα" + LOADING_PROCESS: "Ενημέρωση λίστας φίλτρων" + DELETING_ASK: "Είστε σίγουροι;" + CHACHES_NEED_TO_BE_SAVED_DESC: "Αυτές οι αλλαγές πρέπει να αποθηκευτούν στον εξυπηρετητή." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Ταυτότητα" + LABEL_DISPLAY_NAME: "Όνομα" + LABEL_REPLY_TO: "Απάντηση στον" + LABEL_SIGNATURE: "Υπογραφή" + LABEL_ADD_SIGNATURE_TO_ALL: "Προσθήκη της υπογραφής σας σε όλα τα εξερχόμενα μηνύματα" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Ασφάλεια" + LABEL_CONFIGURE_TWO_FACTOR: "Διαμόρφωση της επαλήθευσης 2 επιπέδων" + LABEL_AUTOLOGOUT: "Αυτόματη αποσύνδεση" + AUTOLOGIN_NEVER_OPTION_NAME: "Ποτέ" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% λεπτό(α)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Γενικό" + LABEL_LANGUAGE: "Γλώσσα" + LABEL_IDENTITY: "Ταυτότητα" + LABEL_LAYOUT: "Σχέδιο" + LABEL_LAYOUT_NO_SPLIT: "Χωρίς χώρισμα" + LABEL_LAYOUT_VERTICAL_SPLIT: "Κάθετο χώρισμα" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Οριζόντιο χώρισμα" + LABEL_EDITOR: "Προεπιλεγμένος συντάκτης κειμένου" + LABEL_EDITOR_HTML: "Html" + LABEL_EDITOR_PLAIN: "Απλό" + LABEL_EDITOR_HTML_FORCED: "Html (επιβολή)" + LABEL_EDITOR_PLAIN_FORCED: "Απλό (επιβολή)" + LABEL_ANIMATION: "Εμψύχωση διεπαφής" + LABEL_ANIMATION_FULL: "Γεμάτο" + LABEL_ANIMATION_NORMAL: "Φυσιολογικό" + LABEL_ANIMATION_NONE: "Κανένα" + LABEL_VIEW_OPTIONS: "Επιλογές προβολής" + LABEL_USE_PREVIEW_PANE: "Χρήση προεπισκόπησης " + LABEL_USE_CHECKBOXES_IN_LIST: "Εμφάνιση των κουτιών επιλογής σε λίστα" + LABEL_USE_THREADS: "Χρήση νημάτων" + LABEL_REPLY_SAME_FOLDER: "Τοποθέτηση απαντήσεων στο φάκελο που ανήκει το μήνυμα που απαντάται" + LABEL_SHOW_IMAGES: "Να εμφανίζονται πάντα οι εξωτερικές εικόνες στο σώμα του μηνύματος" + LABEL_SHOW_ANIMATION: "Επίδειξη εμψύχωσης" + LABEL_MESSAGE_PER_PAGE: "Μηνύματα στη σελίδα" + LABEL_NOTIFICATIONS: "Επισημάνσεις" + LABEL_SOUND_NOTIFICATION: "Ηχητική επισήμανση" + LABEL_CHROME_NOTIFICATION_DESC: "Να εμφανίζονται τα νέα μηνύματα σε αναδυόμενες επισημάνσεις" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Αποκλείστηκε από το φυλλομετρητή)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Επαφές" + LABEL_CONTACTS_AUTOSAVE: "Αυτόματη προσθήκη επαφών στον κατάλογο διευθύνσεων" + LEGEND_CONTACTS_SYNC: "Απομακρυσμένος συγχρονισμός (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Ενεργοποίηση απομακρυσμένου συγχρονισμού" + LABEL_CONTACTS_SYNC_SERVER: "Εξυπηρετητής" + LABEL_CONTACTS_SYNC_AB_URL: "URL του καταλόγου διεθύνσεων" + LABEL_CONTACTS_SYNC_USER: "Χρήστης" + LABEL_CONTACTS_SYNC_PASSWORD: "Κωδικός" + SETTINGS_THEMES: + LEGEND_THEMES: "Θέματα" + LEGEND_THEMES_CUSTOM: "Διαμόρφωση προσαρμοσμένου θέματος" + LABEL_CUSTOM_TYPE: "Τύπος" + LABEL_CUSTOM_TYPE_LIGHT: "Ανοικτόχρωμο" + LABEL_CUSTOM_TYPE_DARK: "Σκουρόχρωμο" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Υπόβαθρο" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Μεταφόρτωση εικόνας υποβάθρου (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Το αρχείο είναι πολύ μεγάλο" + ERROR_FILE_TYPE_ERROR: "Άκυρος τύπος αρχείου (μόνο JPG και PNG)" + ERROR_UNKNOWN: "Υπήρξε άγνωστο λάθος κατα τη διαδικασία μεταφόρτωσης του αρχείου" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Σύνδεση του Google" + BUTTON_GOOGLE_DISCONNECT: "Αποσύνδεση του Google" + SETTINGS_FOLDERS: + BUTTON_DELETE: "Διαγραφή" + CREATING_PROCESS: "Δημιουργία φακέλου" + DELETING_ASK: "Είστε σίγουροι;" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Λογαρισμοί" + LEGEND_IDENTITIES: "Ταυτότητες" + BUTTON_DELETE: "Διαγραφή" + DELETING_ASK: "Είστε σίγουροι;" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Ταυτότητα" + LABEL_DISPLAY_NAME: "Όνομα" + LABEL_REPLY_TO: "Απάντηση στον" + LABEL_SIGNATURE: "Υπογραφή" + LABEL_ADD_SIGNATURE_TO_ALL: "Προσθήκη της υπογραφής σας σε όλα τα εξερχόμενα μηνύματα" + BUTTON_DELETE: "Διαγραφή" + DELETING_ASK: "Είστε σίγουροι;" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + DELETING_ASK: "Είστε σίγουροι;" + SHORTCUTS_HELP: + TAB_COMPOSE: "Νέο μήνυμα" + LABEL_REPLY: "Απάντηση" + LABEL_REPLY_ALL: "Απάντηση σε όλους" + LABEL_FORWARD: "Προώθηση" + LABEL_FORWARD_MULTIPLY: "Προώθησε σαν συνημμένο(α)" + LABEL_HELP: "Βοήθεια" + LABEL_ARCHIVE: "Αρχείο" + LABEL_DELETE: "Διέγραψε" + LABEL_SEARCH: "Αναζήτηση" + LABEL_PRINT: "Εκτύπωση" + PGP_NOTIFICATIONS: + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Παρακαλώ ορίστε τουλάχιστον ένα παραλήπτη" diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/en_GB.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/en_GB.yml new file mode 100755 index 00000000..fb777f9d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/en_GB.yml @@ -0,0 +1,713 @@ +en_GB: + LOGIN: + LABEL_EMAIL: "Email" + LABEL_LOGIN: "Login" + LABEL_PASSWORD: "Password" + LABEL_SIGN_ME: "Remember Me" + LABEL_VERIFICATION_CODE: "Verification Code" + LABEL_DONT_ASK_VERIFICATION_CODE: "Don't ask for the code for 2 weeks" + BUTTON_SIGN_IN: "Sign In" + TITLE_SIGN_IN_GOOGLE: "Sign In using Google" + TITLE_SIGN_IN_FACEBOOK: "Sign In using Facebook" + TITLE_SIGN_IN_TWITTER: "Sign In using Twitter" + LABEL_FORGOT_PASSWORD: "Forgot password" + LABEL_REGISTRATION: "Registration" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Add Account" + BUTTON_SETTINGS: "Settings" + BUTTON_HELP: "Help" + BUTTON_LOGOUT: "Logout" + MOBILE: + BUTTON_MOBILE_VERSION: "Mobile version" + BUTTON_DESKTOP_VERSION: "Desktop version" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Search" + TITLE_ADV: "Advanced Search" + LABEL_ADV_FROM: "From" + LABEL_ADV_TO: "To" + LABEL_ADV_SUBJECT: "Subject" + LABEL_ADV_TEXT: "Text" + LABEL_ADV_HAS_ATTACHMENT: "Has attachment" + LABEL_ADV_HAS_ATTACHMENTS: "Has attachments" + LABEL_ADV_FLAGGED: "Flagged" + LABEL_ADV_UNSEEN: "Unseen" + LABEL_ADV_DATE: "Date" + LABEL_ADV_DATE_ALL: "All" + LABEL_ADV_DATE_3_DAYS: "Up to 3 days old" + LABEL_ADV_DATE_7_DAYS: "Up to 1 week old" + LABEL_ADV_DATE_MONTH: "Up to 1 month old" + LABEL_ADV_DATE_3_MONTHS: "Up to 3 months old" + LABEL_ADV_DATE_6_MONTHS: "Up to 6 months old" + LABEL_ADV_DATE_YEAR: "Up to 1 year old" + BUTTON_ADV_SEARCH: "Search" + PREVIEW_POPUP: + FULLSCREEN: "Toggle fullscreen" + ZOOM: "Zoom in/out" + CLOSE: "Close (Esc)" + LOADING: "Loading..." + GALLERY_PREV: "Previous (arrow left)" + GALLERY_NEXT: "Next (arrow right)" + GALLERY_COUNTER: "%curr% of %total%" + IMAGE_ERROR: "The image could not be loaded." + AJAX_ERROR: "The content could not be loaded." + FOLDER_LIST: + BUTTON_COMPOSE: "Compose" + BUTTON_CONTACTS: "Contacts" + BUTTON_NEW_MESSAGE: "New message" + INBOX_NAME: "Inbox" + SENT_NAME: "Sent" + DRAFTS_NAME: "Drafts" + SPAM_NAME: "Spam" + TRASH_NAME: "Trash" + ARCHIVE_NAME: "Archive" + QUOTA: + TITLE: "Quota usage" + MESSAGE_LIST: + BUTTON_RELOAD: "Reload Message List" + BUTTON_MOVE_TO: "Move To" + BUTTON_DELETE: "Delete" + BUTTON_ARCHIVE: "Archive" + BUTTON_SPAM: "Spam" + BUTTON_NOT_SPAM: "Not Spam" + BUTTON_EMPTY_FOLDER: "Clear Folder" + BUTTON_MULTY_FORWARD: "Forward as attachment(s)" + BUTTON_DELETE_WITHOUT_MOVE: "Delete permanently" + BUTTON_MORE: "More" + MENU_SET_SEEN: "Mark as read" + MENU_SET_ALL_SEEN: "Mark all as read" + MENU_UNSET_SEEN: "Mark as unread" + MENU_SET_FLAG: "Flag" + MENU_UNSET_FLAG: "Unflag" + MENU_SELECT_ALL: "All" + MENU_SELECT_NONE: "None" + MENU_SELECT_INVERT: "Invert" + MENU_SELECT_UNSEEN: "Unread" + MENU_SELECT_SEEN: "Read" + MENU_SELECT_FLAGGED: "Flagged" + MENU_SELECT_UNFLAGGED: "Unflagged" + EMPTY_LIST: "Empty list." + EMPTY_SEARCH_LIST: "No messages matched your search." + SEARCH_RESULT_FOR: "Search results for \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "back to message list" + LIST_LOADING: "Loading" + EMPTY_SUBJECT_TEXT: "(No subject)" + PUT_MESSAGE_HERE: "Drop message here to view it in the list" + TODAY_AT: "today at %TIME%" + YESTERDAY_AT: "yesterday at %TIME%" + SEARCH_PLACEHOLDER: "Search" + NEW_MESSAGE_NOTIFICATION: "You have %COUNT% new messages!" + QUOTA_SIZE: "Using %SIZE% (%PROC%%) of your %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Edit" + BUTTON_BACK: "Back" + BUTTON_CLOSE: "Close" + BUTTON_DELETE: "Delete" + BUTTON_UNSUBSCRIBE: "Unsubscribe from this list" + BUTTON_ARCHIVE: "Archive" + BUTTON_SPAM: "Spam" + BUTTON_NOT_SPAM: "Not Spam" + BUTTON_MOVE_TO: "Move To" + BUTTON_MORE: "More" + BUTTON_REPLY: "Reply" + BUTTON_REPLY_ALL: "Reply All" + BUTTON_FORWARD: "Forward" + BUTTON_FORWARD_AS_ATTACHMENT: "Forward as attachment" + BUTTON_EDIT_AS_NEW: "Edit as New" + BUTTON_SHOW_IMAGES: "Display external images" + BUTTON_NOTIFY_READ_RECEIPT: "The sender has asked to be notified when you read this message." + BUTTON_IN_NEW_WINDOW: "View in separate window" + BUTTON_THREAD_LIST: "Thread list" + BUTTON_THREAD_PREV: "Previous" + BUTTON_THREAD_NEXT: "Next" + BUTTON_THREAD_MORE: "More messages" + MENU_HEADERS: "Show message headers" + MENU_VIEW_ORIGINAL: "Show Source" + MENU_DOWNLOAD_ORIGINAL: "Download as .eml file" + MENU_FILTER_SIMILAR: "Filter messages like this" + MENU_PRINT: "Print" + EMPTY_SUBJECT_TEXT: "(No subject)" + LABEL_SUBJECT: "Subject" + LABEL_DATE: "Date" + LABEL_FROM: "From" + LABEL_FROM_SHORT: "from" + LABEL_TO: "To" + LABEL_TO_SHORT: "to" + LABEL_CC: "CC" + LABEL_BCC: "BCC" + LABEL_REPLY_TO: "Reply-To" + PRINT_LABEL_FROM: "From" + PRINT_LABEL_TO: "To" + PRINT_LABEL_CC: "CC" + PRINT_LABEL_BCC: "BCC" + PRINT_LABEL_REPLY_TO: "Reply-To" + PRINT_LABEL_DATE: "Date" + PRINT_LABEL_SUBJECT: "Subject" + PRINT_LABEL_ATTACHMENTS: "Attachments" + MESSAGE_LOADING: "Loading" + MESSAGE_VIEW_DESC: "Select any message in the list to view it here." + MESSAGE_VIEW_MOVE_DESC: "Click folder name in the left panel to select the destination." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" + LINK_DOWNLOAD_AS_ZIP: "Download as zip" + LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" + LINK_SAVE_TO_CLOUD: "Save to Cloud" + LINK_SAVE_TO_DROPBOX: "Save to Dropbox" + READ_RECEIPT: + SUBJECT: "Return Receipt (displayed) - %SUBJECT%" + BODY: | + This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. + + Note: "This Return Receipt only acknowledges that the message was displayed on the recipient's computer." + There is no guarantee that the recipient has read or understood the message contents. + SUGGESTIONS: + SEARCHING_DESC: "Searching..." + CONTACTS: + LEGEND_CONTACTS: "Contacts" + SEARCH_INPUT_PLACEHOLDER: "Search" + BUTTON_ADD_CONTACT: "Add Contact" + BUTTON_CREATE_CONTACT: "Create" + BUTTON_UPDATE_CONTACT: "Update" + BUTTON_IMPORT: "Import (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" + BUTTON_EXPORT_CSV: "Export (csv)" + ERROR_IMPORT_FILE: "Import error (invalid file format)" + LIST_LOADING: "Loading" + EMPTY_LIST: "No contacts here" + EMPTY_SEARCH: "No contacts found" + CLEAR_SEARCH: "Clear search" + CONTACT_VIEW_DESC: "Select contact in the list to view it here." + LABEL_DISPLAY_NAME: "Display name" + LABEL_EMAIL: "Email" + LABEL_PHONE: "Phone" + LABEL_WEB: "Web" + LABEL_BIRTHDAY: "Birthday" + LINK_ADD_EMAIL: "Add an email address" + LINK_ADD_PHONE: "Add a phone" + LINK_BIRTHDAY: "Birthday" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Enter display name" + PLACEHOLDER_ENTER_LAST_NAME: "Enter last name" + PLACEHOLDER_ENTER_FIRST_NAME: "Enter first name" + PLACEHOLDER_ENTER_NICK_NAME: "Enter nickname" + LABEL_READ_ONLY: "Read only" + LABEL_SHARE: "Share" + ADD_MENU_LABEL: "Add" + ADD_MENU_NICKNAME: "Nickname" + ADD_MENU_NOTES: "Notes" + ADD_MENU_EMAIL: "Email" + ADD_MENU_PHONE: "Phone" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Address" + ADD_MENU_BIRTHDAY: "Birthday" + ADD_MENU_TAGS: "Tags" + BUTTON_SHARE_NONE: "None" + BUTTON_SHARE_ALL: "Everyone" + BUTTON_SYNC: "Synchronization (CardDAV)" + COMPOSE: + TITLE_FROM: "From" + TITLE_TO: "To" + TITLE_CC: "CC" + TITLE_BCC: "BCC" + TITLE_REPLY_TO: "Reply-To" + TITLE_SUBJECT: "Subject" + LINK_SHOW_INPUTS: "show all fields" + BUTTON_SEND: "Send" + BUTTON_SAVE: "Save" + BUTTON_DELETE: "Delete" + BUTTON_CANCEL: "Cancel" + BUTTON_MINIMIZE: "Minimize" + SAVED_TIME: "Saved at %TIME%" + SAVED_ERROR_ON_SEND: "Message was sent but not saved to sent items folder" + DISCARD_UNSAVED_DATA: "Discard unsaved data?" + ATTACH_FILES: "Attach files" + ATTACH_DROP_FILES_DESC: "Drop files here" + ATTACH_ITEM_CANCEL: "Cancel" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" + FORWARD_MESSAGE_TOP_TITLE: "-------- Forwarded message -------" + FORWARD_MESSAGE_TOP_FROM: "From" + FORWARD_MESSAGE_TOP_TO: "To" + FORWARD_MESSAGE_TOP_CC: "CC" + FORWARD_MESSAGE_TOP_SENT: "Sent" + FORWARD_MESSAGE_TOP_SUBJECT: "Subject" + EMPTY_TO_ERROR_DESC: "Please specify at least one recipient" + NO_ATTACHMENTS_HERE_DESC: "No attachments here." + ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet." + BUTTON_REQUEST_READ_RECEIPT: "Request a read receipt" + BUTTON_MARK_AS_IMPORTANT: "Mark as important" + BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" + BUTTON_REQUEST_DSN: "Request a delivery receipt" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Close" + POPUPS_ASK: + BUTTON_YES: "Yes" + BUTTON_NO: "No" + DESC_WANT_CLOSE_THIS_WINDOW: "Are you sure you want to close this window?" + DESC_WANT_DELETE_MESSAGES: "Are you sure you want to delete the message(s)?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Choose your language" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Add Account?" + BUTTON_ADD_ACCOUNT: "Add" + TITLE_UPDATE_ACCOUNT: "Update Account?" + BUTTON_UPDATE_ACCOUNT: "Update" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Add Identity?" + TITLE_UPDATE_IDENTITY: "Update Identity?" + BUTTON_ADD_IDENTITY: "Add" + BUTTON_UPDATE_IDENTITY: "Update" + LABEL_EMAIL: "Email" + LABEL_NAME: "Name" + LABEL_REPLY_TO: "Reply-To" + LABEL_SIGNATURE: "Signature" + LABEL_CC: "Cc" + LABEL_BCC: "Bcc" + LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Create a folder?" + LABEL_NAME: "Folder name" + LABEL_PARENT: "Parent folder" + BUTTON_CREATE: "Create" + BUTTON_CANCEL: "Cancel" + BUTTON_CLOSE: "Close" + TITLE_CREATING_PROCESS: "Creating a folder" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Purge all messages from the folder?" + BUTTON_CLEAR: "Clear" + BUTTON_CANCEL: "Cancel" + BUTTON_CLOSE: "Close" + DANGER_DESC_WARNING: "Warning!" + DANGER_DESC_HTML_1: "This action will result in removing all mails from %FOLDER% folder completely." + DANGER_DESC_HTML_2: "Once started, the process cannot be aborted or cancelled." + TITLE_CLEARING_PROCESS: "Purging the folder..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Import OpenPGP key" + BUTTON_IMPORT_OPEN_PGP_KEY: "Import" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "View OpenPGP key" + BUTTON_SELECT: "Select" + BUTTON_CLOSE: "Close" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP keys" + LABEL_EMAIL: "Email" + LABEL_NAME: "Name" + LABEL_PASSWORD: "Password" + LABEL_KEY_BIT_LENGTH: "Key length" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" + LABEL_SIGN: "Sign" + LABEL_ENCRYPT: "Encrypt" + LABEL_PASSWORD: "Password" + BUTTON_SIGN: "Sign" + BUTTON_ENCRYPT: "Encrypt" + BUTTON_SIGN_AND_ENCRYPT: "Sign and encrypt" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" + LABEL_KEY: "Private Key" + LABEL_PASSWORD: "Password" + BUTTON_DECRYPT: "Decrypt" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "2-Step verification test" + LABEL_CODE: "Code" + BUTTON_TEST: "Test" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Create a filter?" + TITLE_EDIT_FILTER: "Update filter?" + FILTER_NAME: "Name" + LEGEND_CONDITIONS: "Conditions" + LEGEND_ACTIONS: "Actions" + BUTTON_DONE: "Done" + BUTTON_ADD_CONDITION: "Add a Condition" + SELECT_ACTION_NONE: "None" + SELECT_ACTION_MOVE_TO: "Move to" + SELECT_ACTION_FORWARD_TO: "Forward to" + SELECT_ACTION_REJECT: "Reject" + SELECT_ACTION_VACATION_MESSAGE: "Vacation message" + SELECT_ACTION_DISCARD: "Discard" + SELECT_FIELD_FROM: "From" + SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" + SELECT_FIELD_SUBJECT: "Subject" + SELECT_FIELD_HEADER: "Header" + SELECT_FIELD_SIZE: "Size" + SELECT_TYPE_CONTAINS: "Contains" + SELECT_TYPE_NOT_CONTAINS: "Not Contains" + SELECT_TYPE_MATCHES: "Matches (* and ? supported)" + SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" + SELECT_TYPE_REGEXP: "Regexp" + SELECT_TYPE_NOT_REGEXP: "Not Regexp" + SELECT_TYPE_EQUAL_TO: "Equal To" + SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" + SELECT_TYPE_OVER: "Over" + SELECT_TYPE_UNDER: "Under" + SELECT_MATCH_ANY: "Matching ANY of the following rules" + SELECT_MATCH_ALL: "Matching ALL of the following rules" + MARK_AS_READ_LABEL: "Mark as read" + REPLY_INTERVAL_LABEL: "Reply interval (days)" + KEEP_LABEL: "Keep" + STOP_LABEL: "Don't stop processing rules" + EMAIL_LABEL: "Email" + VACATION_SUBJECT_LABEL: "Subject (optional)" + VACATION_MESSAGE_LABEL: "Message" + VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" + REJECT_MESSAGE_LABEL: "Reject message" + ALL_INCOMING_MESSAGES_DESC: "All incoming messages" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Select system folders" + SELECT_CHOOSE_ONE: "Choose one" + SELECT_UNUSE_NAME: "Do not use" + LABEL_SENT: "Sent" + LABEL_DRAFTS: "Drafts" + LABEL_SPAM: "Spam" + LABEL_TRASH: "Trash" + LABEL_ARCHIVE: "Archive" + BUTTON_CANCEL: "Cancel" + BUTTON_CLOSE: "Close" + NOTIFICATION_SENT: | + You haven't selected "Sent" system folder messages are put to after sending. + If you don't want to save sent message, please select "Do not use" option. + NOTIFICATION_DRAFTS: "You haven't selected \"Drafts\" system folder messages are saved to while composing." + NOTIFICATION_SPAM: | + You haven't selected "Spam" system folder spamed messages are placed to. + If you wish to remove messages permanently, please select "Do not use" option. + NOTIFICATION_TRASH: | + You haven't selected "Trash" system folder deleted messages are placed to. + If you wish to remove messages permanently, please select "Do not use" option. + NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "2-Step Verification (TOTP)" + LABEL_ENABLE_TWO_FACTOR: "Enable 2-Step verification" + LABEL_TWO_FACTOR_USER: "User" + LABEL_TWO_FACTOR_STATUS: "Status" + LABEL_TWO_FACTOR_SECRET: "Secret" + LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" + BUTTON_CREATE: "Create a secret" + BUTTON_ACTIVATE: "Activate" + BUTTON_CLEAR: "Clear" + BUTTON_LOGOUT: "Logout" + BUTTON_DONE: "Done" + BUTTON_TEST: "Test" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Show Secret" + BUTTON_HIDE_SECRET: "Hide Secret" + TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" + TWO_FACTOR_SECRET_DESC: > + Import this info into your Google Authenticator client (or other TOTP client) + using the provided QR code below or by entering the code manually. + TWO_FACTOR_BACKUP_CODES_DESC: > + If you can't receive codes via Google Authenticator (or other TOTP client), + you can use backup codes to sign in. After you’ve used a backup code to sign + in, it will become inactive. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." + TITLES: + LOADING: "Loading" + LOGIN: "Login" + MAILBOX: "MailBox" + SETTINGS: "Settings" + COMPOSE: "Compose" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "File is too big" + ERROR_FILE_PARTIALLY_UPLOADED: "File was partially uploaded due to unknown error" + ERROR_NO_FILE_UPLOADED: "No file uploaded" + ERROR_MISSING_TEMP_FOLDER: "The temporary file is missing" + ERROR_ON_SAVING_FILE: "An unknown file upload error occurred" + ERROR_FILE_TYPE: "Invalid file type" + ERROR_UNKNOWN: "An unknown file upload error occurred" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" + TEXT_SWITCHER_RICH_FORMATTING: "Rich formatting" + TEXT_SWITCHER_CONFIRM: "Text formatting and images will be lost. Are you sure you want to continue?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Personal" + LABEL_GENERAL_NAME: "General" + LABEL_CONTACTS_NAME: "Contacts" + LABEL_FOLDERS_NAME: "Folders" + LABEL_ACCOUNTS_NAME: "Accounts" + LABEL_IDENTITY_NAME: "Identity" + LABEL_IDENTITIES_NAME: "Identities" + LABEL_FILTERS_NAME: "Filters" + LABEL_TEMPLATES_NAME: "Templates" + LABEL_SECURITY_NAME: "Security" + LABEL_SOCIAL_NAME: "Social" + LABEL_THEMES_NAME: "Themes" + LABEL_CHANGE_PASSWORD_NAME: "Password" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Back" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filters" + BUTTON_SAVE: "Save" + BUTTON_ADD_FILTER: "Add a Filter" + BUTTON_DELETE: "Delete" + BUTTON_RAW_SCRIPT: "Use Custom User Script" + SUBNAME_NONE: "None" + SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" + SUBNAME_REJECT: "Reject" + SUBNAME_VACATION_MESSAGE: "Vacation message" + SUBNAME_DISCARD: "Discard" + CAPABILITY_LABEL: "Capability" + LOADING_PROCESS: "Updating filter list" + DELETING_ASK: "Are you sure?" + CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identity" + LABEL_DISPLAY_NAME: "Name" + LABEL_REPLY_TO: "Reply-To" + LABEL_SIGNATURE: "Signature" + LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Security" + LABEL_CONFIGURE_TWO_FACTOR: "Configure 2-Step verification" + LABEL_AUTOLOGOUT: "Auto Logout" + AUTOLOGIN_NEVER_OPTION_NAME: "Never" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hour(s)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "General" + LABEL_LANGUAGE: "Language" + LABEL_IDENTITY: "Identity" + LABEL_LAYOUT: "Layout" + LABEL_LAYOUT_NO_SPLIT: "No Split" + LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" + LABEL_EDITOR: "Default text editor" + LABEL_EDITOR_HTML: "Html" + LABEL_EDITOR_PLAIN: "Plain" + LABEL_EDITOR_HTML_FORCED: "Html (forced)" + LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" + LABEL_ANIMATION: "Interface animation" + LABEL_ANIMATION_FULL: "Full" + LABEL_ANIMATION_NORMAL: "Normal" + LABEL_ANIMATION_NONE: "None" + LABEL_VIEW_OPTIONS: "View options" + LABEL_USE_PREVIEW_PANE: "Use preview pane" + LABEL_USE_CHECKBOXES_IN_LIST: "Display checkboxes in list" + LABEL_USE_THREADS: "Use threads" + LABEL_REPLY_SAME_FOLDER: "Place replies in the folder of the message being replied to" + LABEL_SHOW_IMAGES: "Always display external images in message body" + LABEL_SHOW_ANIMATION: "Show animation" + LABEL_MESSAGE_PER_PAGE: "Messages on page" + LABEL_NOTIFICATIONS: "Notifications" + LABEL_SOUND_NOTIFICATION: "Sound notification" + LABEL_CHROME_NOTIFICATION_DESC: "Show new messages notification popups" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Blocked by the browser)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Contacts" + LABEL_CONTACTS_AUTOSAVE: "Automatically add recipients to your address book" + LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" + LABEL_CONTACTS_SYNC_SERVER: "Server" + LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" + LABEL_CONTACTS_SYNC_USER: "User" + LABEL_CONTACTS_SYNC_PASSWORD: "Password" + SETTINGS_THEMES: + LEGEND_THEMES: "Themes" + LEGEND_THEMES_CUSTOM: "Custom Theme Configuration" + LABEL_CUSTOM_TYPE: "Type" + LABEL_CUSTOM_TYPE_LIGHT: "Light" + LABEL_CUSTOM_TYPE_DARK: "Dark" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Background" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Upload background image (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "File is too big" + ERROR_FILE_TYPE_ERROR: "Invalid file type (JPG and PNG only)" + ERROR_UNKNOWN: "An unknown file upload error occurred" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Connect Google" + BUTTON_GOOGLE_DISCONNECT: "Disconnect Google" + MAIN_GOOGLE_DESC: "After enabling login via Google, you can log into this account using Google button on the login screen." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Connect Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Disconnect Facebook" + MAIN_FACEBOOK_DESC: "After enabling login via Facebook, you can log into this account using Facebook button on the login screen." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Connect Twitter" + BUTTON_TWITTER_DISCONNECT: "Disconnect Twitter" + MAIN_TWITTER_DESC: "After enabling login via Twitter, you can log into this account using Twitter button on the login screen." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Folder List" + BUTTON_CREATE: "Create Folder" + BUTTON_SYSTEM: "System Folders" + BUTTON_DELETE: "Delete" + BUTTON_SUBSCRIBE: "Subscribe" + BUTTON_UNSUBSCRIBE: "Unsubscribe" + LOADING_PROCESS: "Updating folder list" + CREATING_PROCESS: "Creating a folder" + DELETING_PROCESS: "Deleting a folder" + RENAMING_PROCESS: "Renaming a folder" + DELETING_ASK: "Are you sure?" + TO_MANY_FOLDERS_DESC_1: "You have too many folders!" + TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." + HELP_DELETE_FOLDER: "Delete folder" + HELP_SHOW_HIDE_FOLDER: "Show/hide folder" + HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Accounts" + LEGEND_IDENTITIES: "Identities" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" + BUTTON_ADD_ACCOUNT: "Add an Account" + BUTTON_ADD_IDENTITY: "Add an Identity" + BUTTON_DELETE: "Delete" + LOADING_PROCESS: "Updating..." + DELETING_ASK: "Are you sure?" + DEFAULT_IDENTITY_LABEL: "default" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identity" + LEGEND_IDENTITIES: "Additional Identities" + LABEL_DEFAULT: "Default" + LABEL_DISPLAY_NAME: "Name" + LABEL_REPLY_TO: "Reply-To" + LABEL_SIGNATURE: "Signature" + LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" + BUTTON_ADD_IDENTITY: "Add Identity" + BUTTON_DELETE: "Delete" + LOADING_PROCESS: "Updating identity list" + DELETING_ASK: "Are you sure?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Change Password" + LABEL_CURRENT_PASSWORD: "Current password" + LABEL_NEW_PASSWORD: "New password" + LABEL_REPEAT_PASSWORD: "Confirm New Password" + BUTTON_UPDATE_PASSWORD: "Set New Password" + ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" + TITLE_PRIVATE: "Private" + TITLE_PUBLIC: "Public" + DELETING_ASK: "Are you sure?" + GENERATE_ONLY_HTTPS: "HTTPS only" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Automatically save draft" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" + TAB_MAILBOX: "Mailbox" + TAB_MESSAGE_LIST: "Message list" + TAB_MESSAGE_VIEW: "Message view" + TAB_COMPOSE: "Compose" + LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" + LABEL_REPLY: "Reply" + LABEL_REPLY_ALL: "Reply All" + LABEL_FORWARD: "Forward" + LABEL_FORWARD_MULTIPLY: "Forward as attachment(s)" + LABEL_HELP: "Help" + LABEL_CHECK_ALL: "Select all messages" + LABEL_ARCHIVE: "Archive" + LABEL_DELETE: "Delete" + LABEL_OPEN_THREAD: "Open selected thread" + LABEL_MOVE: "Move" + LABEL_READ: "Read selected messages" + LABEL_UNREAD: "Unread selected messages" + LABEL_IMPORTANT: "Important, flag selected messages" + LABEL_SEARCH: "Search" + LABEL_CANCEL_SEARCH: "Cancel search" + LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" + LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" + LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" + LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" + LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" + LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" + LABEL_THREAD_NEXT: "Next message in thread" + LABEL_THREAD_PREV: "Previous message in thread" + LABEL_PRINT: "Print" + LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" + LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" + LABEL_SWITCH_TO_LIST: "Switch focus back to message list" + LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" + LABEL_SAVE_MESSAGE: "Save message" + LABEL_SEND_MESSAGE: "Send message" + LABEL_CLOSE_COMPOSE: "Close compose" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "No public keys found" + NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" + NO_PRIVATE_KEY_FOUND: "No private key found" + NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" + ADD_A_PUBLICK_KEY: "Add a public key" + SELECT_A_PRIVATE_KEY: "Select a private key" + UNVERIFIRED_SIGNATURE: "Unverified signature" + DECRYPTION_ERROR: "OpenPGP decryption error" + GOOD_SIGNATURE: "Good signature from %USER%" + PGP_ERROR: "OpenPGP error: %ERROR%" + SPECIFY_FROM_EMAIL: "Please specify FROM email address" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" + NOTIFICATIONS: + INVALID_TOKEN: "Invalid token" + AUTH_ERROR: "Authentication failed" + ACCESS_ERROR: "Access error" + CONNECTION_ERROR: "Can't connect to server" + CAPTCHA_ERROR: "Incorrect CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + DOMAIN_NOT_ALLOWED: "Domain is not allowed" + ACCOUNT_NOT_ALLOWED: "Account is not allowed" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" + COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" + CURRENT_PASSWORD_INCORRECT: "Current password incorrect" + NEW_PASSWORD_SHORT: "Password is too short" + NEW_PASSWORD_WEAK: "Password is too easy" + NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" + CONTACTS_SYNC_ERROR: "Contacts synchronization error" + CANT_GET_MESSAGE_LIST: "Can't get message list" + CANT_GET_MESSAGE: "Can't get message" + CANT_DELETE_MESSAGE: "Can't delete message" + CANT_MOVE_MESSAGE: "Can't move message" + CANT_SAVE_MESSAGE: "Can't save message" + CANT_SEND_MESSAGE: "Can't send message" + INVALID_RECIPIENTS: "Invalid recipients" + CANT_SAVE_FILTERS: "Can't save filters" + CANT_GET_FILTERS: "Can't get filters" + FILTERS_ARE_NOT_CORRECT: "Filters are not correct" + CANT_CREATE_FOLDER: "Can't create folder" + CANT_RENAME_FOLDER: "Can't rename folder" + CANT_DELETE_FOLDER: "Can't delete folder" + CANT_DELETE_NON_EMPTY_FOLDER: "Can't delete non-empty directory" + CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" + CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" + CANT_SAVE_SETTINGS: "Can't save settings" + CANT_SAVE_PLUGIN_SETTINGS: "Can't save settings" + DOMAIN_ALREADY_EXISTS: "Domain already exists" + CANT_INSTALL_PACKAGE: "Failed to install package" + CANT_DELETE_PACKAGE: "Failed to remove package" + INVALID_PLUGIN_PACKAGE: "Invalid plugin package" + UNSUPPORTED_PLUGIN_PACKAGE: "Unsupported plugin package" + LICENSING_SERVER_IS_UNAVAILABLE: "Subscription server is unvailable" + LICENSING_DOMAIN_EXPIRED: "Subscription for this domain has expired." + LICENSING_DOMAIN_BANNED: "Subscription for this domain is banned." + DEMO_SEND_MESSAGE_ERROR: "For security purposes, this account is not allowed to send messages to external e-mail addresses!" + DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" + ACCOUNT_ALREADY_EXISTS: "Account already exists" + ACCOUNT_DOES_NOT_EXIST: "Account doesn't exist" + MAIL_SERVER_ERROR: "An error has occured while accessing mail server" + INVALID_INPUT_ARGUMENT: "Invalid input argument" + UNKNOWN_ERROR: "Unknown error" + STATIC: + BACK_LINK: "Reload" + DOMAIN_LIST_DESC: "List of domains webmail is allowed to access." + PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" + PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" + NO_SCRIPT_TITLE: "JavaScript is required for this application." + NO_SCRIPT_DESC: | + JavaScript support is not available in your browser. + Please enable JavaScript support in your browser settings and retry. + NO_COOKIE_TITLE: "Cookies support is required for this application." + NO_COOKIE_DESC: | + Cookies support is not available in your browser. + Please enable Cookie support in your browser settings and retry. + BAD_BROWSER_TITLE: "Your browser is outdated." + BAD_BROWSER_DESC: | + To use all the features of the application, + download and install one of these browsers: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/en_US.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/en_US.yml new file mode 100755 index 00000000..1ded9fc4 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/en_US.yml @@ -0,0 +1,713 @@ +en_US: + LOGIN: + LABEL_EMAIL: "Email" + LABEL_LOGIN: "Login" + LABEL_PASSWORD: "Password" + LABEL_SIGN_ME: "Remember Me" + LABEL_VERIFICATION_CODE: "Verification Code" + LABEL_DONT_ASK_VERIFICATION_CODE: "Don't ask for the code for 2 weeks" + BUTTON_SIGN_IN: "Sign In" + TITLE_SIGN_IN_GOOGLE: "Sign In using Google" + TITLE_SIGN_IN_FACEBOOK: "Sign In using Facebook" + TITLE_SIGN_IN_TWITTER: "Sign In using Twitter" + LABEL_FORGOT_PASSWORD: "Forgot password" + LABEL_REGISTRATION: "Registration" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Add Account" + BUTTON_SETTINGS: "Settings" + BUTTON_HELP: "Help" + BUTTON_LOGOUT: "Logout" + MOBILE: + BUTTON_MOBILE_VERSION: "Mobile version" + BUTTON_DESKTOP_VERSION: "Desktop version" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Search" + TITLE_ADV: "Advanced Search" + LABEL_ADV_FROM: "From" + LABEL_ADV_TO: "To" + LABEL_ADV_SUBJECT: "Subject" + LABEL_ADV_TEXT: "Text" + LABEL_ADV_HAS_ATTACHMENT: "Has attachment" + LABEL_ADV_HAS_ATTACHMENTS: "Has attachments" + LABEL_ADV_FLAGGED: "Flagged" + LABEL_ADV_UNSEEN: "Unseen" + LABEL_ADV_DATE: "Date" + LABEL_ADV_DATE_ALL: "All" + LABEL_ADV_DATE_3_DAYS: "Up to 3 days old" + LABEL_ADV_DATE_7_DAYS: "Up to 1 week old" + LABEL_ADV_DATE_MONTH: "Up to 1 month old" + LABEL_ADV_DATE_3_MONTHS: "Up to 3 months old" + LABEL_ADV_DATE_6_MONTHS: "Up to 6 months old" + LABEL_ADV_DATE_YEAR: "Up to 1 year old" + BUTTON_ADV_SEARCH: "Search" + PREVIEW_POPUP: + FULLSCREEN: "Toggle fullscreen" + ZOOM: "Zoom in/out" + CLOSE: "Close (Esc)" + LOADING: "Loading..." + GALLERY_PREV: "Previous (arrow left)" + GALLERY_NEXT: "Next (arrow right)" + GALLERY_COUNTER: "%curr% of %total%" + IMAGE_ERROR: "The image could not be loaded." + AJAX_ERROR: "The content could not be loaded." + FOLDER_LIST: + BUTTON_COMPOSE: "Compose" + BUTTON_CONTACTS: "Contacts" + BUTTON_NEW_MESSAGE: "New message" + INBOX_NAME: "Inbox" + SENT_NAME: "Sent" + DRAFTS_NAME: "Drafts" + SPAM_NAME: "Spam" + TRASH_NAME: "Trash" + ARCHIVE_NAME: "Archive" + QUOTA: + TITLE: "Quota usage" + MESSAGE_LIST: + BUTTON_RELOAD: "Reload Message List" + BUTTON_MOVE_TO: "Move To" + BUTTON_DELETE: "Delete" + BUTTON_ARCHIVE: "Archive" + BUTTON_SPAM: "Spam" + BUTTON_NOT_SPAM: "Not Spam" + BUTTON_EMPTY_FOLDER: "Clear Folder" + BUTTON_MULTY_FORWARD: "Forward as attachment(s)" + BUTTON_DELETE_WITHOUT_MOVE: "Delete permanently" + BUTTON_MORE: "More" + MENU_SET_SEEN: "Mark as read" + MENU_SET_ALL_SEEN: "Mark all as read" + MENU_UNSET_SEEN: "Mark as unread" + MENU_SET_FLAG: "Flag" + MENU_UNSET_FLAG: "Unflag" + MENU_SELECT_ALL: "All" + MENU_SELECT_NONE: "None" + MENU_SELECT_INVERT: "Invert" + MENU_SELECT_UNSEEN: "Unread" + MENU_SELECT_SEEN: "Read" + MENU_SELECT_FLAGGED: "Flagged" + MENU_SELECT_UNFLAGGED: "Unflagged" + EMPTY_LIST: "Empty list." + EMPTY_SEARCH_LIST: "No messages matched your search." + SEARCH_RESULT_FOR: "Search results for \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "back to message list" + LIST_LOADING: "Loading" + EMPTY_SUBJECT_TEXT: "(No subject)" + PUT_MESSAGE_HERE: "Drop message here to view it in the list" + TODAY_AT: "today at %TIME%" + YESTERDAY_AT: "yesterday at %TIME%" + SEARCH_PLACEHOLDER: "Search" + NEW_MESSAGE_NOTIFICATION: "You have %COUNT% new messages!" + QUOTA_SIZE: "Using %SIZE% (%PROC%%) of your %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Edit" + BUTTON_BACK: "Back" + BUTTON_CLOSE: "Close" + BUTTON_DELETE: "Delete" + BUTTON_UNSUBSCRIBE: "Unsubscribe from this list" + BUTTON_ARCHIVE: "Archive" + BUTTON_SPAM: "Spam" + BUTTON_NOT_SPAM: "Not Spam" + BUTTON_MOVE_TO: "Move To" + BUTTON_MORE: "More" + BUTTON_REPLY: "Reply" + BUTTON_REPLY_ALL: "Reply All" + BUTTON_FORWARD: "Forward" + BUTTON_FORWARD_AS_ATTACHMENT: "Forward as attachment" + BUTTON_EDIT_AS_NEW: "Edit as New" + BUTTON_SHOW_IMAGES: "Display external images" + BUTTON_NOTIFY_READ_RECEIPT: "The sender has asked to be notified when you read this message." + BUTTON_IN_NEW_WINDOW: "View in separate window" + BUTTON_THREAD_LIST: "Thread list" + BUTTON_THREAD_PREV: "Previous" + BUTTON_THREAD_NEXT: "Next" + BUTTON_THREAD_MORE: "More messages" + MENU_HEADERS: "Show message headers" + MENU_VIEW_ORIGINAL: "Show Source" + MENU_DOWNLOAD_ORIGINAL: "Download as .eml file" + MENU_FILTER_SIMILAR: "Filter messages like this" + MENU_PRINT: "Print" + EMPTY_SUBJECT_TEXT: "(No subject)" + LABEL_SUBJECT: "Subject" + LABEL_DATE: "Date" + LABEL_FROM: "From" + LABEL_FROM_SHORT: "from" + LABEL_TO: "To" + LABEL_TO_SHORT: "to" + LABEL_CC: "CC" + LABEL_BCC: "BCC" + LABEL_REPLY_TO: "Reply-To" + PRINT_LABEL_FROM: "From" + PRINT_LABEL_TO: "To" + PRINT_LABEL_CC: "CC" + PRINT_LABEL_BCC: "BCC" + PRINT_LABEL_REPLY_TO: "Reply-To" + PRINT_LABEL_DATE: "Date" + PRINT_LABEL_SUBJECT: "Subject" + PRINT_LABEL_ATTACHMENTS: "Attachments" + MESSAGE_LOADING: "Loading" + MESSAGE_VIEW_DESC: "Select any message in the list to view it here." + MESSAGE_VIEW_MOVE_DESC: "Click folder name in the left panel to select the destination." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" + LINK_DOWNLOAD_AS_ZIP: "Download as zip" + LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" + LINK_SAVE_TO_CLOUD: "Save to Cloud" + LINK_SAVE_TO_DROPBOX: "Save to Dropbox" + READ_RECEIPT: + SUBJECT: "Return Receipt (displayed) - %SUBJECT%" + BODY: | + This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. + + Note: "This Return Receipt only acknowledges that the message was displayed on the recipient's computer." + There is no guarantee that the recipient has read or understood the message contents. + SUGGESTIONS: + SEARCHING_DESC: "Searching..." + CONTACTS: + LEGEND_CONTACTS: "Contacts" + SEARCH_INPUT_PLACEHOLDER: "Search" + BUTTON_ADD_CONTACT: "Add Contact" + BUTTON_CREATE_CONTACT: "Create" + BUTTON_UPDATE_CONTACT: "Update" + BUTTON_IMPORT: "Import (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" + BUTTON_EXPORT_CSV: "Export (csv)" + ERROR_IMPORT_FILE: "Import error (invalid file format)" + LIST_LOADING: "Loading" + EMPTY_LIST: "No contacts here" + EMPTY_SEARCH: "No contacts found" + CLEAR_SEARCH: "Clear search" + CONTACT_VIEW_DESC: "Select contact in the list to view it here." + LABEL_DISPLAY_NAME: "Display name" + LABEL_EMAIL: "Email" + LABEL_PHONE: "Phone" + LABEL_WEB: "Web" + LABEL_BIRTHDAY: "Birthday" + LINK_ADD_EMAIL: "Add an email address" + LINK_ADD_PHONE: "Add a phone" + LINK_BIRTHDAY: "Birthday" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Enter display name" + PLACEHOLDER_ENTER_LAST_NAME: "Enter last name" + PLACEHOLDER_ENTER_FIRST_NAME: "Enter first name" + PLACEHOLDER_ENTER_NICK_NAME: "Enter nickname" + LABEL_READ_ONLY: "Read only" + LABEL_SHARE: "Share" + ADD_MENU_LABEL: "Add" + ADD_MENU_NICKNAME: "Nickname" + ADD_MENU_NOTES: "Notes" + ADD_MENU_EMAIL: "Email" + ADD_MENU_PHONE: "Phone" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Address" + ADD_MENU_BIRTHDAY: "Birthday" + ADD_MENU_TAGS: "Tags" + BUTTON_SHARE_NONE: "None" + BUTTON_SHARE_ALL: "Everyone" + BUTTON_SYNC: "Synchronization (CardDAV)" + COMPOSE: + TITLE_FROM: "From" + TITLE_TO: "To" + TITLE_CC: "CC" + TITLE_BCC: "BCC" + TITLE_REPLY_TO: "Reply-To" + TITLE_SUBJECT: "Subject" + LINK_SHOW_INPUTS: "show all fields" + BUTTON_SEND: "Send" + BUTTON_SAVE: "Save" + BUTTON_DELETE: "Delete" + BUTTON_CANCEL: "Cancel" + BUTTON_MINIMIZE: "Minimize" + SAVED_TIME: "Saved at %TIME%" + SAVED_ERROR_ON_SEND: "Message was sent but not saved to sent items folder" + DISCARD_UNSAVED_DATA: "Discard unsaved data?" + ATTACH_FILES: "Attach files" + ATTACH_DROP_FILES_DESC: "Drop files here" + ATTACH_ITEM_CANCEL: "Cancel" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" + FORWARD_MESSAGE_TOP_TITLE: "-------- Forwarded message -------" + FORWARD_MESSAGE_TOP_FROM: "From" + FORWARD_MESSAGE_TOP_TO: "To" + FORWARD_MESSAGE_TOP_CC: "CC" + FORWARD_MESSAGE_TOP_SENT: "Sent" + FORWARD_MESSAGE_TOP_SUBJECT: "Subject" + EMPTY_TO_ERROR_DESC: "Please specify at least one recipient" + NO_ATTACHMENTS_HERE_DESC: "No attachments here." + ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet." + BUTTON_REQUEST_READ_RECEIPT: "Request a read receipt" + BUTTON_MARK_AS_IMPORTANT: "Mark as important" + BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" + BUTTON_REQUEST_DSN: "Request a delivery receipt" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Close" + POPUPS_ASK: + BUTTON_YES: "Yes" + BUTTON_NO: "No" + DESC_WANT_CLOSE_THIS_WINDOW: "Are you sure you want to close this window?" + DESC_WANT_DELETE_MESSAGES: "Are you sure you want to delete the message(s)?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Choose your language" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Add Account?" + BUTTON_ADD_ACCOUNT: "Add" + TITLE_UPDATE_ACCOUNT: "Update Account?" + BUTTON_UPDATE_ACCOUNT: "Update" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Add Identity?" + TITLE_UPDATE_IDENTITY: "Update Identity?" + BUTTON_ADD_IDENTITY: "Add" + BUTTON_UPDATE_IDENTITY: "Update" + LABEL_EMAIL: "Email" + LABEL_NAME: "Name" + LABEL_REPLY_TO: "Reply-To" + LABEL_SIGNATURE: "Signature" + LABEL_CC: "Cc" + LABEL_BCC: "Bcc" + LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Create a folder?" + LABEL_NAME: "Folder name" + LABEL_PARENT: "Parent folder" + BUTTON_CREATE: "Create" + BUTTON_CANCEL: "Cancel" + BUTTON_CLOSE: "Close" + TITLE_CREATING_PROCESS: "Creating a folder" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Purge all messages from the folder?" + BUTTON_CLEAR: "Clear" + BUTTON_CANCEL: "Cancel" + BUTTON_CLOSE: "Close" + DANGER_DESC_WARNING: "Warning!" + DANGER_DESC_HTML_1: "This action will result in removing all mails from %FOLDER% folder completely." + DANGER_DESC_HTML_2: "Once started, the process cannot be aborted or cancelled." + TITLE_CLEARING_PROCESS: "Purging the folder..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Import OpenPGP key" + BUTTON_IMPORT_OPEN_PGP_KEY: "Import" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "View OpenPGP key" + BUTTON_SELECT: "Select" + BUTTON_CLOSE: "Close" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP keys" + LABEL_EMAIL: "Email" + LABEL_NAME: "Name" + LABEL_PASSWORD: "Password" + LABEL_KEY_BIT_LENGTH: "Key length" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" + LABEL_SIGN: "Sign" + LABEL_ENCRYPT: "Encrypt" + LABEL_PASSWORD: "Password" + BUTTON_SIGN: "Sign" + BUTTON_ENCRYPT: "Encrypt" + BUTTON_SIGN_AND_ENCRYPT: "Sign and encrypt" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" + LABEL_KEY: "Private Key" + LABEL_PASSWORD: "Password" + BUTTON_DECRYPT: "Decrypt" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "2-Step verification test" + LABEL_CODE: "Code" + BUTTON_TEST: "Test" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Create a filter?" + TITLE_EDIT_FILTER: "Update filter?" + FILTER_NAME: "Name" + LEGEND_CONDITIONS: "Conditions" + LEGEND_ACTIONS: "Actions" + BUTTON_DONE: "Done" + BUTTON_ADD_CONDITION: "Add a Condition" + SELECT_ACTION_NONE: "None" + SELECT_ACTION_MOVE_TO: "Move to" + SELECT_ACTION_FORWARD_TO: "Forward to" + SELECT_ACTION_REJECT: "Reject" + SELECT_ACTION_VACATION_MESSAGE: "Vacation message" + SELECT_ACTION_DISCARD: "Discard" + SELECT_FIELD_FROM: "From" + SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" + SELECT_FIELD_SUBJECT: "Subject" + SELECT_FIELD_HEADER: "Header" + SELECT_FIELD_SIZE: "Size" + SELECT_TYPE_CONTAINS: "Contains" + SELECT_TYPE_NOT_CONTAINS: "Not Contains" + SELECT_TYPE_MATCHES: "Matches (* and ? supported)" + SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" + SELECT_TYPE_REGEXP: "Regexp" + SELECT_TYPE_NOT_REGEXP: "Not Regexp" + SELECT_TYPE_EQUAL_TO: "Equal To" + SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" + SELECT_TYPE_OVER: "Over" + SELECT_TYPE_UNDER: "Under" + SELECT_MATCH_ANY: "Matching ANY of the following rules" + SELECT_MATCH_ALL: "Matching ALL of the following rules" + MARK_AS_READ_LABEL: "Mark as read" + REPLY_INTERVAL_LABEL: "Reply interval (days)" + KEEP_LABEL: "Keep" + STOP_LABEL: "Don't stop processing rules" + EMAIL_LABEL: "Email" + VACATION_SUBJECT_LABEL: "Subject (optional)" + VACATION_MESSAGE_LABEL: "Message" + VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" + REJECT_MESSAGE_LABEL: "Reject message" + ALL_INCOMING_MESSAGES_DESC: "All incoming messages" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Select system folders" + SELECT_CHOOSE_ONE: "Choose one" + SELECT_UNUSE_NAME: "Do not use" + LABEL_SENT: "Sent" + LABEL_DRAFTS: "Drafts" + LABEL_SPAM: "Spam" + LABEL_TRASH: "Trash" + LABEL_ARCHIVE: "Archive" + BUTTON_CANCEL: "Cancel" + BUTTON_CLOSE: "Close" + NOTIFICATION_SENT: | + You haven't selected "Sent" system folder messages are put to after sending. + If you don't want to save sent message, please select "Do not use" option. + NOTIFICATION_DRAFTS: "You haven't selected \"Drafts\" system folder messages are saved to while composing." + NOTIFICATION_SPAM: | + You haven't selected "Spam" system folder spamed messages are placed to. + If you wish to remove messages permanently, please select "Do not use" option. + NOTIFICATION_TRASH: | + You haven't selected "Trash" system folder deleted messages are placed to. + If you wish to remove messages permanently, please select "Do not use" option. + NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "2-Step Verification (TOTP)" + LABEL_ENABLE_TWO_FACTOR: "Enable 2-Step verification" + LABEL_TWO_FACTOR_USER: "User" + LABEL_TWO_FACTOR_STATUS: "Status" + LABEL_TWO_FACTOR_SECRET: "Secret" + LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" + BUTTON_CREATE: "Create a secret" + BUTTON_ACTIVATE: "Activate" + BUTTON_CLEAR: "Clear" + BUTTON_LOGOUT: "Logout" + BUTTON_DONE: "Done" + BUTTON_TEST: "Test" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Show Secret" + BUTTON_HIDE_SECRET: "Hide Secret" + TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" + TWO_FACTOR_SECRET_DESC: > + Import this info into your Google Authenticator client (or other TOTP client) + using the provided QR code below or by entering the code manually. + TWO_FACTOR_BACKUP_CODES_DESC: > + If you can't receive codes via Google Authenticator (or other TOTP client), + you can use backup codes to sign in. After you’ve used a backup code to sign + in, it will become inactive. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." + TITLES: + LOADING: "Loading" + LOGIN: "Login" + MAILBOX: "MailBox" + SETTINGS: "Settings" + COMPOSE: "Compose" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "File is too big" + ERROR_FILE_PARTIALLY_UPLOADED: "File was partially uploaded due to unknown error" + ERROR_NO_FILE_UPLOADED: "No file uploaded" + ERROR_MISSING_TEMP_FOLDER: "The temporary file is missing" + ERROR_ON_SAVING_FILE: "An unknown file upload error occurred" + ERROR_FILE_TYPE: "Invalid file type" + ERROR_UNKNOWN: "An unknown file upload error occurred" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" + TEXT_SWITCHER_RICH_FORMATTING: "Rich formatting" + TEXT_SWITCHER_CONFIRM: "Text formatting and images will be lost. Are you sure you want to continue?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Personal" + LABEL_GENERAL_NAME: "General" + LABEL_CONTACTS_NAME: "Contacts" + LABEL_FOLDERS_NAME: "Folders" + LABEL_ACCOUNTS_NAME: "Accounts" + LABEL_IDENTITY_NAME: "Identity" + LABEL_IDENTITIES_NAME: "Identities" + LABEL_FILTERS_NAME: "Filters" + LABEL_TEMPLATES_NAME: "Templates" + LABEL_SECURITY_NAME: "Security" + LABEL_SOCIAL_NAME: "Social" + LABEL_THEMES_NAME: "Themes" + LABEL_CHANGE_PASSWORD_NAME: "Password" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Back" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filters" + BUTTON_SAVE: "Save" + BUTTON_ADD_FILTER: "Add a Filter" + BUTTON_DELETE: "Delete" + BUTTON_RAW_SCRIPT: "Use Custom User Script" + SUBNAME_NONE: "None" + SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" + SUBNAME_REJECT: "Reject" + SUBNAME_VACATION_MESSAGE: "Vacation message" + SUBNAME_DISCARD: "Discard" + CAPABILITY_LABEL: "Capability" + LOADING_PROCESS: "Updating filter list" + DELETING_ASK: "Are you sure?" + CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identity" + LABEL_DISPLAY_NAME: "Name" + LABEL_REPLY_TO: "Reply-To" + LABEL_SIGNATURE: "Signature" + LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Security" + LABEL_CONFIGURE_TWO_FACTOR: "Configure 2-Step verification" + LABEL_AUTOLOGOUT: "Auto Logout" + AUTOLOGIN_NEVER_OPTION_NAME: "Never" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hour(s)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "General" + LABEL_LANGUAGE: "Language" + LABEL_IDENTITY: "Identity" + LABEL_LAYOUT: "Layout" + LABEL_LAYOUT_NO_SPLIT: "No Split" + LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" + LABEL_EDITOR: "Default text editor" + LABEL_EDITOR_HTML: "Html" + LABEL_EDITOR_PLAIN: "Plain" + LABEL_EDITOR_HTML_FORCED: "Html (forced)" + LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" + LABEL_ANIMATION: "Interface animation" + LABEL_ANIMATION_FULL: "Full" + LABEL_ANIMATION_NORMAL: "Normal" + LABEL_ANIMATION_NONE: "None" + LABEL_VIEW_OPTIONS: "View options" + LABEL_USE_PREVIEW_PANE: "Use preview pane" + LABEL_USE_CHECKBOXES_IN_LIST: "Display checkboxes in list" + LABEL_USE_THREADS: "Use threads" + LABEL_REPLY_SAME_FOLDER: "Place replies in the folder of the message being replied to" + LABEL_SHOW_IMAGES: "Always display external images in message body" + LABEL_SHOW_ANIMATION: "Show animation" + LABEL_MESSAGE_PER_PAGE: "Messages on page" + LABEL_NOTIFICATIONS: "Notifications" + LABEL_SOUND_NOTIFICATION: "Sound notification" + LABEL_CHROME_NOTIFICATION_DESC: "Show new messages notification popups" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Blocked by the browser)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Contacts" + LABEL_CONTACTS_AUTOSAVE: "Automatically add recipients to your address book" + LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" + LABEL_CONTACTS_SYNC_SERVER: "Server" + LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" + LABEL_CONTACTS_SYNC_USER: "User" + LABEL_CONTACTS_SYNC_PASSWORD: "Password" + SETTINGS_THEMES: + LEGEND_THEMES: "Themes" + LEGEND_THEMES_CUSTOM: "Custom Theme Configuration" + LABEL_CUSTOM_TYPE: "Type" + LABEL_CUSTOM_TYPE_LIGHT: "Light" + LABEL_CUSTOM_TYPE_DARK: "Dark" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Background" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Upload background image (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "File is too big" + ERROR_FILE_TYPE_ERROR: "Invalid file type (JPG and PNG only)" + ERROR_UNKNOWN: "An unknown file upload error occurred" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Connect Google" + BUTTON_GOOGLE_DISCONNECT: "Disconnect Google" + MAIN_GOOGLE_DESC: "After enabling login via Google, you can log into this account using Google button on the login screen." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Connect Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Disconnect Facebook" + MAIN_FACEBOOK_DESC: "After enabling login via Facebook, you can log into this account using Facebook button on the login screen." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Connect Twitter" + BUTTON_TWITTER_DISCONNECT: "Disconnect Twitter" + MAIN_TWITTER_DESC: "After enabling login via Twitter, you can log into this account using Twitter button on the login screen." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Folder List" + BUTTON_CREATE: "Create Folder" + BUTTON_SYSTEM: "System Folders" + BUTTON_DELETE: "Delete" + BUTTON_SUBSCRIBE: "Subscribe" + BUTTON_UNSUBSCRIBE: "Unsubscribe" + LOADING_PROCESS: "Updating folder list" + CREATING_PROCESS: "Creating a folder" + DELETING_PROCESS: "Deleting a folder" + RENAMING_PROCESS: "Renaming a folder" + DELETING_ASK: "Are you sure?" + TO_MANY_FOLDERS_DESC_1: "You have too many folders!" + TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." + HELP_DELETE_FOLDER: "Delete folder" + HELP_SHOW_HIDE_FOLDER: "Show/hide folder" + HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Accounts" + LEGEND_IDENTITIES: "Identities" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" + BUTTON_ADD_ACCOUNT: "Add an Account" + BUTTON_ADD_IDENTITY: "Add an Identity" + BUTTON_DELETE: "Delete" + LOADING_PROCESS: "Updating..." + DELETING_ASK: "Are you sure?" + DEFAULT_IDENTITY_LABEL: "default" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identity" + LEGEND_IDENTITIES: "Additional Identities" + LABEL_DEFAULT: "Default" + LABEL_DISPLAY_NAME: "Name" + LABEL_REPLY_TO: "Reply-To" + LABEL_SIGNATURE: "Signature" + LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" + BUTTON_ADD_IDENTITY: "Add Identity" + BUTTON_DELETE: "Delete" + LOADING_PROCESS: "Updating identity list" + DELETING_ASK: "Are you sure?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Change Password" + LABEL_CURRENT_PASSWORD: "Current password" + LABEL_NEW_PASSWORD: "New password" + LABEL_REPEAT_PASSWORD: "Confirm New Password" + BUTTON_UPDATE_PASSWORD: "Set New Password" + ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" + TITLE_PRIVATE: "Private" + TITLE_PUBLIC: "Public" + DELETING_ASK: "Are you sure?" + GENERATE_ONLY_HTTPS: "HTTPS only" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Automatically save draft" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" + TAB_MAILBOX: "Mailbox" + TAB_MESSAGE_LIST: "Message list" + TAB_MESSAGE_VIEW: "Message view" + TAB_COMPOSE: "Compose" + LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" + LABEL_REPLY: "Reply" + LABEL_REPLY_ALL: "Reply All" + LABEL_FORWARD: "Forward" + LABEL_FORWARD_MULTIPLY: "Forward as attachment(s)" + LABEL_HELP: "Help" + LABEL_CHECK_ALL: "Select all messages" + LABEL_ARCHIVE: "Archive" + LABEL_DELETE: "Delete" + LABEL_OPEN_THREAD: "Open selected thread" + LABEL_MOVE: "Move" + LABEL_READ: "Read selected messages" + LABEL_UNREAD: "Unread selected messages" + LABEL_IMPORTANT: "Important, flag selected messages" + LABEL_SEARCH: "Search" + LABEL_CANCEL_SEARCH: "Cancel search" + LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" + LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" + LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" + LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" + LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" + LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" + LABEL_THREAD_NEXT: "Next message in thread" + LABEL_THREAD_PREV: "Previous message in thread" + LABEL_PRINT: "Print" + LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" + LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" + LABEL_SWITCH_TO_LIST: "Switch focus back to message list" + LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" + LABEL_SAVE_MESSAGE: "Save message" + LABEL_SEND_MESSAGE: "Send message" + LABEL_CLOSE_COMPOSE: "Close compose" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "No public keys found" + NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" + NO_PRIVATE_KEY_FOUND: "No private key found" + NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" + ADD_A_PUBLICK_KEY: "Add a public key" + SELECT_A_PRIVATE_KEY: "Select a private key" + UNVERIFIRED_SIGNATURE: "Unverified signature" + DECRYPTION_ERROR: "OpenPGP decryption error" + GOOD_SIGNATURE: "Good signature from %USER%" + PGP_ERROR: "OpenPGP error: %ERROR%" + SPECIFY_FROM_EMAIL: "Please specify FROM email address" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" + NOTIFICATIONS: + INVALID_TOKEN: "Invalid token" + AUTH_ERROR: "Authentication failed" + ACCESS_ERROR: "Access error" + CONNECTION_ERROR: "Can't connect to server" + CAPTCHA_ERROR: "Incorrect CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + DOMAIN_NOT_ALLOWED: "Domain is not allowed" + ACCOUNT_NOT_ALLOWED: "Account is not allowed" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" + COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" + CURRENT_PASSWORD_INCORRECT: "Current password incorrect" + NEW_PASSWORD_SHORT: "Password is too short" + NEW_PASSWORD_WEAK: "Password is too easy" + NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" + CONTACTS_SYNC_ERROR: "Contacts synchronization error" + CANT_GET_MESSAGE_LIST: "Can't get message list" + CANT_GET_MESSAGE: "Can't get message" + CANT_DELETE_MESSAGE: "Can't delete message" + CANT_MOVE_MESSAGE: "Can't move message" + CANT_SAVE_MESSAGE: "Can't save message" + CANT_SEND_MESSAGE: "Can't send message" + INVALID_RECIPIENTS: "Invalid recipients" + CANT_SAVE_FILTERS: "Can't save filters" + CANT_GET_FILTERS: "Can't get filters" + FILTERS_ARE_NOT_CORRECT: "Filters are not correct" + CANT_CREATE_FOLDER: "Can't create folder" + CANT_RENAME_FOLDER: "Can't rename folder" + CANT_DELETE_FOLDER: "Can't delete folder" + CANT_DELETE_NON_EMPTY_FOLDER: "Can't delete non-empty directory" + CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" + CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" + CANT_SAVE_SETTINGS: "Can't save settings" + CANT_SAVE_PLUGIN_SETTINGS: "Can't save settings" + DOMAIN_ALREADY_EXISTS: "Domain already exists" + CANT_INSTALL_PACKAGE: "Failed to install package" + CANT_DELETE_PACKAGE: "Failed to remove package" + INVALID_PLUGIN_PACKAGE: "Invalid plugin package" + UNSUPPORTED_PLUGIN_PACKAGE: "Unsupported plugin package" + LICENSING_SERVER_IS_UNAVAILABLE: "Subscription server is unvailable" + LICENSING_DOMAIN_EXPIRED: "Subscription for this domain has expired." + LICENSING_DOMAIN_BANNED: "Subscription for this domain is banned." + DEMO_SEND_MESSAGE_ERROR: "For security purposes, this account is not allowed to send messages to external e-mail addresses!" + DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" + ACCOUNT_ALREADY_EXISTS: "Account already exists" + ACCOUNT_DOES_NOT_EXIST: "Account doesn't exist" + MAIL_SERVER_ERROR: "An error has occured while accessing mail server" + INVALID_INPUT_ARGUMENT: "Invalid input argument" + UNKNOWN_ERROR: "Unknown error" + STATIC: + BACK_LINK: "Reload" + DOMAIN_LIST_DESC: "List of domains webmail is allowed to access." + PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" + PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" + NO_SCRIPT_TITLE: "JavaScript is required for this application." + NO_SCRIPT_DESC: | + JavaScript support is not available in your browser. + Please enable JavaScript support in your browser settings and retry. + NO_COOKIE_TITLE: "Cookies support is required for this application." + NO_COOKIE_DESC: | + Cookies support is not available in your browser. + Please enable Cookie support in your browser settings and retry. + BAD_BROWSER_TITLE: "Your browser is outdated." + BAD_BROWSER_DESC: | + To use all the features of the application, + download and install one of these browsers: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/es_ES.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/es_ES.yml new file mode 100755 index 00000000..2dd795bb --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/es_ES.yml @@ -0,0 +1,716 @@ +es_ES: + LOGIN: + LABEL_EMAIL: "Email" + LABEL_LOGIN: "Login" + LABEL_PASSWORD: "Contraseña" + LABEL_SIGN_ME: "Recuérdame" + LABEL_VERIFICATION_CODE: "Código de verificación" + LABEL_DONT_ASK_VERIFICATION_CODE: "No solicitar el código de verificación durante 2 semanas" + BUTTON_SIGN_IN: "Acceder" + TITLE_SIGN_IN_GOOGLE: "Acceder usando Google" + TITLE_SIGN_IN_FACEBOOK: "Acceder usando Facebook" + TITLE_SIGN_IN_TWITTER: "Acceder usando Twitter" + LABEL_FORGOT_PASSWORD: "Olvidé mi contraseña" + LABEL_REGISTRATION: "Registro" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Agregar cuenta" + BUTTON_SETTINGS: "Configuración" + BUTTON_HELP: "Ayuda" + BUTTON_LOGOUT: "Cerrar sesión" + MOBILE: + BUTTON_MOBILE_VERSION: "Versión móvil" + BUTTON_DESKTOP_VERSION: "Versión escritorio" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Buscar" + TITLE_ADV: "Búsqueda avanzada" + LABEL_ADV_FROM: "De" + LABEL_ADV_TO: "Para" + LABEL_ADV_SUBJECT: "Asunto" + LABEL_ADV_TEXT: "Texto" + LABEL_ADV_HAS_ATTACHMENT: "Tiene adjunto" + LABEL_ADV_HAS_ATTACHMENTS: "Tiene adjuntos" + LABEL_ADV_FLAGGED: "Seleccionado" + LABEL_ADV_UNSEEN: "No leído" + LABEL_ADV_DATE: "Fecha" + LABEL_ADV_DATE_ALL: "Todo" + LABEL_ADV_DATE_3_DAYS: "Hasta 3 días de antigüedad" + LABEL_ADV_DATE_7_DAYS: "Hasta una semana de antigüedad" + LABEL_ADV_DATE_MONTH: "Hasta 1 mes de antigüedad" + LABEL_ADV_DATE_3_MONTHS: "Hasta 3 meses de antigüedad" + LABEL_ADV_DATE_6_MONTHS: "Hasta 6 meses de antigüedad" + LABEL_ADV_DATE_YEAR: "Hasta 1 año de antigüedad" + BUTTON_ADV_SEARCH: "Buscar" + PREVIEW_POPUP: + FULLSCREEN: "Cambiar a pantalla completa" + ZOOM: "Acercar / Alejar" + CLOSE: "Cerrar (Esc)" + LOADING: "Cargando..." + GALLERY_PREV: "Anterior (Flecha Izquierda)" + GALLERY_NEXT: "Siguiente (Flecha Derecha)" + GALLERY_COUNTER: "%curr% de %total%" + IMAGE_ERROR: "La imagen no se pudo cargar." + AJAX_ERROR: "El contenido no se pudo cargar." + FOLDER_LIST: + BUTTON_COMPOSE: "Redactar" + BUTTON_CONTACTS: "Contactos" + BUTTON_NEW_MESSAGE: "Nuevo mensaje" + INBOX_NAME: "Bandeja de Entrada" + SENT_NAME: "Enviados" + DRAFTS_NAME: "Borradores" + SPAM_NAME: "Correo electrónico no deseado" + TRASH_NAME: "Papelera" + ARCHIVE_NAME: "Archivo" + QUOTA: + TITLE: "Cuota" + MESSAGE_LIST: + BUTTON_RELOAD: "Actualizar lista de mensajes" + BUTTON_MOVE_TO: "Mover" + BUTTON_DELETE: "Eliminar" + BUTTON_ARCHIVE: "Archivar" + BUTTON_SPAM: "Correo no deseado" + BUTTON_NOT_SPAM: "Es correo deseado" + BUTTON_EMPTY_FOLDER: "Vaciar carpeta" + BUTTON_MULTY_FORWARD: "Reenviar como adjunto(s)" + BUTTON_DELETE_WITHOUT_MOVE: "Eliminar permanentemente" + BUTTON_MORE: "Más" + MENU_SET_SEEN: "Marcar como leído" + MENU_SET_ALL_SEEN: "Marcar todo como leído" + MENU_UNSET_SEEN: "Marcar como no leído" + MENU_SET_FLAG: "Marcar" + MENU_UNSET_FLAG: "Desmarcar" + MENU_SELECT_ALL: "Todos" + MENU_SELECT_NONE: "Ninguno" + MENU_SELECT_INVERT: "Invertir" + MENU_SELECT_UNSEEN: "No leído" + MENU_SELECT_SEEN: "Leído" + MENU_SELECT_FLAGGED: "Destacado" + MENU_SELECT_UNFLAGGED: "No Destacado" + EMPTY_LIST: "No hay mensajes." + EMPTY_SEARCH_LIST: "La búsqueda no ha producido resultados." + SEARCH_RESULT_FOR: "Resultados de búsqueda para \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "volver a la lista de mensajes" + LIST_LOADING: "Cargando" + EMPTY_SUBJECT_TEXT: "(Sin asunto)" + PUT_MESSAGE_HERE: "Arrastre su mensaje aquí para verlo en la lista" + TODAY_AT: "hoy a las %TIME%" + YESTERDAY_AT: "ayer a las %TIME%" + SEARCH_PLACEHOLDER: "Buscar" + NEW_MESSAGE_NOTIFICATION: "Tiene %COUNT% nuevos mensajes." + QUOTA_SIZE: "Usando %SIZE% (%PROC%%) de sus %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Editar" + BUTTON_BACK: "Atrás" + BUTTON_CLOSE: "Cerrar" + BUTTON_DELETE: "Eliminar" + BUTTON_UNSUBSCRIBE: "Eliminar suscripción de esta lista" + BUTTON_ARCHIVE: "Archivar" + BUTTON_SPAM: "Correo electrónico no deseado" + BUTTON_NOT_SPAM: "Es correo deseado" + BUTTON_MOVE_TO: "Mover" + BUTTON_MORE: "Más" + BUTTON_REPLY: "Responder" + BUTTON_REPLY_ALL: "Responder a todos" + BUTTON_FORWARD: "Reenviar" + BUTTON_FORWARD_AS_ATTACHMENT: "Reenviar como adjunto" + BUTTON_EDIT_AS_NEW: "Editar como Nuevo" + BUTTON_SHOW_IMAGES: "Mostrar imágenes externas" + BUTTON_NOTIFY_READ_RECEIPT: "El remitente ha pedido que se le notifique cuando lea este mensaje." + BUTTON_IN_NEW_WINDOW: "Ver en una ventana nueva" + BUTTON_THREAD_LIST: "Hilo" + BUTTON_THREAD_PREV: "Anterior" + BUTTON_THREAD_NEXT: "Siguiente" + BUTTON_THREAD_MORE: "Más mensajes" + MENU_HEADERS: "Mostrar los encabezados del mensaje" + MENU_VIEW_ORIGINAL: "Mostrar original" + MENU_DOWNLOAD_ORIGINAL: "Descargar como archivo .eml" + MENU_FILTER_SIMILAR: "Filtrar mensajes como este" + MENU_PRINT: "Imprimir" + EMPTY_SUBJECT_TEXT: "(Sin asunto)" + LABEL_SUBJECT: "Asunto" + LABEL_DATE: "Fecha" + LABEL_FROM: "De" + LABEL_FROM_SHORT: "de" + LABEL_TO: "Para" + LABEL_TO_SHORT: "para" + LABEL_CC: "CC" + LABEL_BCC: "CCO (BCC)" + LABEL_REPLY_TO: "Responder" + PRINT_LABEL_FROM: "De" + PRINT_LABEL_TO: "Para" + PRINT_LABEL_CC: "CC" + PRINT_LABEL_BCC: "CCO (BCC)" + PRINT_LABEL_REPLY_TO: "Responder" + PRINT_LABEL_DATE: "Fecha" + PRINT_LABEL_SUBJECT: "Asunto" + PRINT_LABEL_ATTACHMENTS: "Adjuntos" + MESSAGE_LOADING: "Cargando" + MESSAGE_VIEW_DESC: "Seleccione un mensaje de la lista para verlo aquí." + MESSAGE_VIEW_MOVE_DESC: "Haga clic en el nombre de la carpeta del panel izquierdo para seleccionar el destino." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Contraseña" + PGP_SIGNED_MESSAGE_DESC: "Mensaje firmado mediante OpenPGP (click para verificar)" + PGP_ENCRYPTED_MESSAGE_DESC: "Mensaje cifrado mediante OpenPGP (click para desencriptar)" + LINK_DOWNLOAD_AS_ZIP: "Descargar todo (archivo ZIP)" + LINK_SAVE_TO_OWNCLOUD: "Guardar en ownCloud" + LINK_SAVE_TO_DROPBOX: "Guardar en Dropbox" + READ_RECEIPT: + SUBJECT: "Acuse de recibo (se visualiza) - %SUBJECT%" + BODY: | + Esta es una confirmación del correo que usted envió a %READ-RECEIPT%. + + Nota: Este acuse de recibo sólo reconoce que el mensaje se muestra en el ordenador del receptor. + No hay garantía de que el destinatario ha leído o entendido el contenido del mensaje. + SUGGESTIONS: + SEARCHING_DESC: "Buscando..." + CONTACTS: + LEGEND_CONTACTS: "Contactos" + SEARCH_INPUT_PLACEHOLDER: "Buscar" + BUTTON_ADD_CONTACT: "Añadir Contacto" + BUTTON_CREATE_CONTACT: "Crear" + BUTTON_UPDATE_CONTACT: "Actualizar" + BUTTON_IMPORT: "Importar (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Exportar (vcf, vCard)" + BUTTON_EXPORT_CSV: "Exportar (csv)" + ERROR_IMPORT_FILE: "Error de importación (formato de archivo no válido)" + LIST_LOADING: "Cargando" + EMPTY_LIST: "No hay contactos aquí" + EMPTY_SEARCH: "No se encontraron contactos" + CLEAR_SEARCH: "Limpiar búsqueda" + CONTACT_VIEW_DESC: "Seleccionar un contacto de la lista para verlo aquí." + LABEL_DISPLAY_NAME: "Nombre a visualizar" + LABEL_EMAIL: "Correo Electrónico" + LABEL_PHONE: "Teléfono" + LABEL_WEB: "Web" + LABEL_BIRTHDAY: "Cumpleaños" + LINK_ADD_EMAIL: "Agregar una dirección de correo electrónico" + LINK_ADD_PHONE: "Agregar un teléfono" + LINK_BIRTHDAY: "Cumpleaños" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Introduzca el nombre a visualizar" + PLACEHOLDER_ENTER_LAST_NAME: "Introduzca los apellidos" + PLACEHOLDER_ENTER_FIRST_NAME: "Introduzca el nombre" + PLACEHOLDER_ENTER_NICK_NAME: "Introduzca un alias" + LABEL_READ_ONLY: "Solo lectura" + LABEL_SHARE: "Compartir" + ADD_MENU_LABEL: "Añadir" + ADD_MENU_NICKNAME: "Alias" + ADD_MENU_NOTES: "Notas" + ADD_MENU_EMAIL: "Correo electrónico" + ADD_MENU_PHONE: "Teléfono" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Dirección" + ADD_MENU_BIRTHDAY: "Cumpleaños" + ADD_MENU_TAGS: "Etiquetas" + BUTTON_SHARE_NONE: "Ninguno" + BUTTON_SHARE_ALL: "Todos" + BUTTON_SYNC: "Sincronización (CardDAV)" + COMPOSE: + TITLE_FROM: "De" + TITLE_TO: "Para" + TITLE_CC: "CC" + TITLE_BCC: "CCO (BCC)" + TITLE_REPLY_TO: "Responder" + TITLE_SUBJECT: "Asunto" + LINK_SHOW_INPUTS: "mostrar todos los campos" + BUTTON_SEND: "Enviar" + BUTTON_SAVE: "Guardar" + BUTTON_DELETE: "Eliminar" + BUTTON_CANCEL: "Cancelar" + BUTTON_MINIMIZE: "Minimizar" + SAVED_TIME: "Guardado a las %TIME%" + SAVED_ERROR_ON_SEND: "El mensaje se envió, pero no se guardó en la carpeta de enviados" + DISCARD_UNSAVED_DATA: "¿Descartar cambios?" + ATTACH_FILES: "Añadir archivos" + ATTACH_DROP_FILES_DESC: "Arrastre los archivos aquí" + ATTACH_ITEM_CANCEL: "Cancelar" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% escribió" + FORWARD_MESSAGE_TOP_TITLE: "-------- Mensaje reenviado -------" + FORWARD_MESSAGE_TOP_FROM: "De" + FORWARD_MESSAGE_TOP_TO: "Para" + FORWARD_MESSAGE_TOP_CC: "CC" + FORWARD_MESSAGE_TOP_SENT: "Enviado" + FORWARD_MESSAGE_TOP_SUBJECT: "Asunto" + EMPTY_TO_ERROR_DESC: "Por favor, especifique al menos un destinatario" + NO_ATTACHMENTS_HERE_DESC: "No hay adjuntos aquí." + ATTACHMENTS_ERROR_DESC: "¡Atención! No se han subido todos los archivos adjuntos." + ATTACHMENTS_UPLOAD_ERROR_DESC: "No se han subido todos los archivos adjuntos." + BUTTON_REQUEST_READ_RECEIPT: "Solicitar confirmación de lectura" + BUTTON_MARK_AS_IMPORTANT: "Marcar como importante" + BUTTON_OPEN_PGP: "OpenPGP (solo texto plano)" + BUTTON_REQUEST_DSN: "Solicitar una confirmación de entrega" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Cerrar" + POPUPS_ASK: + BUTTON_YES: "Sí" + BUTTON_NO: "No" + DESC_WANT_CLOSE_THIS_WINDOW: "¿Está seguro de que desea cerrar esta ventana?" + DESC_WANT_DELETE_MESSAGES: "¿Está seguro de que desea eliminar los mensajes?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Seleccionar idioma" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Añadir cuenta" + BUTTON_ADD_ACCOUNT: "Añadir" + TITLE_UPDATE_ACCOUNT: "¿Actualizar cuenta?" + BUTTON_UPDATE_ACCOUNT: "Actualizar" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "¿Añadir Identidad?" + TITLE_UPDATE_IDENTITY: "¿Actualizar identidad?" + BUTTON_ADD_IDENTITY: "Añadir" + BUTTON_UPDATE_IDENTITY: "Actualizar" + LABEL_EMAIL: "Correo electrónico" + LABEL_NAME: "Nombre" + LABEL_REPLY_TO: "Responder" + LABEL_SIGNATURE: "Firma" + LABEL_CC: "CC" + LABEL_BCC: "CCO" + LABEL_SIGNATURE_INSERT_BEFORE: "Insertar esta firma antes de el texto entre comillas en las respuestas" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Crear una carpeta" + LABEL_NAME: "Nombre de la carpeta" + LABEL_PARENT: "Carpeta superior" + BUTTON_CREATE: "Crear" + BUTTON_CANCEL: "Cancelar" + BUTTON_CLOSE: "Cerrar" + TITLE_CREATING_PROCESS: "Creando carpeta" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "¿Purgar todos los mensajes de la carpeta?" + BUTTON_CLEAR: "Limpiar" + BUTTON_CANCEL: "Cancelar" + BUTTON_CLOSE: "Cerrar" + DANGER_DESC_WARNING: "¡Atención!" + DANGER_DESC_HTML_1: "Con esta acción usted puede borrar todos los emails de la carpeta %FOLDER% completamente." + DANGER_DESC_HTML_2: "Una vez comenzado el proceso no se puede abortar ni cancelar." + TITLE_CLEARING_PROCESS: "Purgando carpeta..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Importar clave OpenPGP" + BUTTON_IMPORT_OPEN_PGP_KEY: "Importar" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "Ver clave OpenPGP" + BUTTON_SELECT: "Seleccionar" + BUTTON_CLOSE: "Cerrar" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Generar clave OpenPGP" + LABEL_EMAIL: "Correo electrónico" + LABEL_NAME: "Nombre" + LABEL_PASSWORD: "Contraseña" + LABEL_KEY_BIT_LENGTH: "Longitud de la clave" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generar" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "Firmar/Cifrar con OpenPGP" + LABEL_SIGN: "Firmar" + LABEL_ENCRYPT: "Encriptar" + LABEL_PASSWORD: "Contraseña" + BUTTON_SIGN: "Firmar" + BUTTON_ENCRYPT: "Encriptar" + BUTTON_SIGN_AND_ENCRYPT: "Firmar y encriptar" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "Descifrar OpenPGP" + LABEL_KEY: "Clave privada" + LABEL_PASSWORD: "Contraseña" + BUTTON_DECRYPT: "Descifrar" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "Prueba de verificación de 2 pasos" + LABEL_CODE: "Código" + BUTTON_TEST: "Probar" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "¿Crear un filtro?" + TITLE_EDIT_FILTER: "¿Actualizar un filtro?" + FILTER_NAME: "Nombre" + LEGEND_CONDITIONS: "Condiciones" + LEGEND_ACTIONS: "Acciones" + BUTTON_DONE: "Hecho" + BUTTON_ADD_CONDITION: "Añadir condición" + SELECT_ACTION_NONE: "Ninguna" + SELECT_ACTION_MOVE_TO: "Mover" + SELECT_ACTION_FORWARD_TO: "Reenviar" + SELECT_ACTION_REJECT: "Rechazar" + SELECT_ACTION_VACATION_MESSAGE: "Mensaje fuera de línea" + SELECT_ACTION_DISCARD: "Descartar" + SELECT_FIELD_FROM: "De" + SELECT_FIELD_RECIPIENTS: "Destinatarios (A o CC)" + SELECT_FIELD_SUBJECT: "Asunto" + SELECT_FIELD_HEADER: "Encabezado" + SELECT_FIELD_SIZE: "Tamaño" + SELECT_TYPE_CONTAINS: "Contiene" + SELECT_TYPE_NOT_CONTAINS: "No Contiene" + SELECT_TYPE_MATCHES: "Coincide (* and ? supported)" + SELECT_TYPE_NOT_MATCHES: "No Coindide (* and ? supported)" + SELECT_TYPE_REGEXP: "Regexp" + SELECT_TYPE_NOT_REGEXP: "Not Regexp" + SELECT_TYPE_EQUAL_TO: "Igual A" + SELECT_TYPE_NOT_EQUAL_TO: "Distinto De" + SELECT_TYPE_OVER: "Por Encima" + SELECT_TYPE_UNDER: "Por Debajo" + SELECT_MATCH_ANY: "Si coincide alguna de estas reglas" + SELECT_MATCH_ALL: "Si coinciden todas las reglas" + MARK_AS_READ_LABEL: "Marcar como leído" + REPLY_INTERVAL_LABEL: "Intervalo de respuesta (días)" + KEEP_LABEL: "Mantener" + STOP_LABEL: "Don't stop processing rules" + EMAIL_LABEL: "Email" + VACATION_SUBJECT_LABEL: "Asunto (opcional)" + VACATION_MESSAGE_LABEL: "Mensaje" + VACATION_RECIPIENTS_LABEL: "Destinatarios (separados por coma)" + REJECT_MESSAGE_LABEL: "Rechazar mensaje" + ALL_INCOMING_MESSAGES_DESC: "Todos los mensajes entrantes" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Seleccione las carpetas del sistema" + SELECT_CHOOSE_ONE: "Elija una" + SELECT_UNUSE_NAME: "No usar" + LABEL_SENT: "Enviados" + LABEL_DRAFTS: "Borradores" + LABEL_SPAM: "Correo no deseado" + LABEL_TRASH: "Papelera" + LABEL_ARCHIVE: "Archivo" + BUTTON_CANCEL: "Cancelar" + BUTTON_CLOSE: "Cerrar" + NOTIFICATION_SENT: | + Usted no ha seleccionado la carpeta del sistema para guardar los "Enviados". + Si no desea guardar los mensajes enviados, por favor seleccione la opción "No usar". + NOTIFICATION_DRAFTS: "Usted no ha seleccionado la carpeta del sistema para guardar los \"Borradores\"." + NOTIFICATION_SPAM: | + Usted no ha seleccionado la carpeta del sistema para alojar los mensajes marcados como "Spam". + Si desea eliminar los mensajes permanentemente, por favor seleccione la opción "No usar". + NOTIFICATION_TRASH: | + Usted no ha seleccionado la carpeta del sistema para alojar los mensajes enviados a la "Papelera" . + Si desea eliminar los mensajes permanentemente, por favor seleccione la opción "No usar". + NOTIFICATION_ARCHIVE: "Usted no ha seleccionado la carpeta del sistema para alojar los mensajes enviados al \"Archivo\"." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "Verificación de 2 Pasos" + LABEL_ENABLE_TWO_FACTOR: "Activar la verificación de 2 pasos" + LABEL_TWO_FACTOR_USER: "Usuario" + LABEL_TWO_FACTOR_STATUS: "Estado" + LABEL_TWO_FACTOR_SECRET: "Clave secreta" + LABEL_TWO_FACTOR_BACKUP_CODES: "Códigos de copia de seguridad" + BUTTON_CREATE: "Crear nueva clave secreta" + BUTTON_ACTIVATE: "Activate" + BUTTON_CLEAR: "Borrar" + BUTTON_LOGOUT: "Logout" + BUTTON_DONE: "Hecho" + BUTTON_TEST: "Probar" + LINK_TEST: "probar" + BUTTON_SHOW_SECRET: "Mostrar clave secreta" + BUTTON_HIDE_SECRET: "Ocultar clave secreta" + TWO_FACTOR_REQUIRE_DESC: "Se requiere que configure la verificación de 2-pasos." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configurado" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "No configurado" + TWO_FACTOR_SECRET_DESC: >- + Importar esta información en su cliente Google Authenticator (u otro cliente + TOTP) utilizando el código QR ​​se indica debajo o introduciendo el código + manualmente. + TWO_FACTOR_BACKUP_CODES_DESC: >- + Si usted no puede recibir los códigos a través de Google Authenticator, puede + utilizar códigos de copia de seguridad para firmar pulg Después de que usted + ha utilizado un código de copia de seguridad para iniciar sesión, se convertirá + en inactiva. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." + TITLES: + LOADING: "Cargando" + LOGIN: "Ingresar" + MAILBOX: "Buzón" + SETTINGS: "Configuraciones" + COMPOSE: "Redactar" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "El archivo es muy grande" + ERROR_FILE_PARTIALLY_UPLOADED: "El archivo fue subido parcialmente debido a un error desconocido" + ERROR_NO_FILE_UPLOADED: "Ningún archivo subido" + ERROR_MISSING_TEMP_FOLDER: "El archivo temporal no se encuentra" + ERROR_ON_SAVING_FILE: "Se ha producido un error de carga de archivo desconocido" + ERROR_FILE_TYPE: "Tipo de archivo inválido" + ERROR_UNKNOWN: "Se ha producido un error de carga de archivo desconocido" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXTO" + TEXT_SWITCHER_RICH_FORMATTING: "Texto enriquecido" + TEXT_SWITCHER_CONFIRM: "Se perderá el formato de texto e imágenes. ¿Está seguro que desea continuar?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Personal" + LABEL_GENERAL_NAME: "General" + LABEL_CONTACTS_NAME: "Contactos" + LABEL_FOLDERS_NAME: "Carpetas" + LABEL_ACCOUNTS_NAME: "Cuentas" + LABEL_IDENTITY_NAME: "Identidad" + LABEL_IDENTITIES_NAME: "Identidades" + LABEL_FILTERS_NAME: "Filtros" + LABEL_TEMPLATES_NAME: "Plantillas" + LABEL_SECURITY_NAME: "Seguridad" + LABEL_SOCIAL_NAME: "Social" + LABEL_THEMES_NAME: "Temas" + LABEL_CHANGE_PASSWORD_NAME: "Contraseña" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Atrás" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filtros" + BUTTON_SAVE: "Guardar" + BUTTON_ADD_FILTER: "Añadir un Filtro" + BUTTON_DELETE: "Borrar" + BUTTON_RAW_SCRIPT: "Usar Script Personalizado" + SUBNAME_NONE: "Ninguno" + SUBNAME_MOVE_TO: "Mover a \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Reenviar a \"%EMAIL%\"" + SUBNAME_REJECT: "Rechazar" + SUBNAME_VACATION_MESSAGE: "Mensaje de vacaciones" + SUBNAME_DISCARD: "Descartar" + CAPABILITY_LABEL: "Capability" + LOADING_PROCESS: "Actualizando lista de filtros" + DELETING_ASK: "¿Está seguro?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Estos cambios deben ser cambiados en el servidor." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identidad" + LABEL_DISPLAY_NAME: "Nombre" + LABEL_REPLY_TO: "Responder a" + LABEL_SIGNATURE: "Firma" + LABEL_ADD_SIGNATURE_TO_ALL: "Agregar su firma a todos los mensajes salientes" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Seguridad" + LABEL_CONFIGURE_TWO_FACTOR: "Configurar verificación de 2-Pasos" + LABEL_AUTOLOGOUT: "Salir Automáticamente" + AUTOLOGIN_NEVER_OPTION_NAME: "Nunca" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minuto(s)" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hora(s)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "General" + LABEL_LANGUAGE: "Idioma" + LABEL_IDENTITY: "Identidad" + LABEL_LAYOUT: "Layout" + LABEL_LAYOUT_NO_SPLIT: "Sin División" + LABEL_LAYOUT_VERTICAL_SPLIT: "División Vertical" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "División Horizontal" + LABEL_EDITOR: "Editor de texto predeterminado" + LABEL_EDITOR_HTML: "HTML" + LABEL_EDITOR_PLAIN: "Texto plano" + LABEL_EDITOR_HTML_FORCED: "Html (forzado)" + LABEL_EDITOR_PLAIN_FORCED: "Texto plano (forzado)" + LABEL_ANIMATION: "Interface animation" + LABEL_ANIMATION_FULL: "Todo" + LABEL_ANIMATION_NORMAL: "Normal" + LABEL_ANIMATION_NONE: "Ninguno" + LABEL_VIEW_OPTIONS: "Ver opciones" + LABEL_USE_PREVIEW_PANE: "Utilice el panel de vista previa" + LABEL_USE_CHECKBOXES_IN_LIST: "Mostrar casillas de verificación en la lista" + LABEL_USE_THREADS: "Usar hilos de conversación" + LABEL_REPLY_SAME_FOLDER: "Coloque las respuestas en la carpeta del mensaje que esta respondiendo." + LABEL_SHOW_IMAGES: "Mostrar siempre las imágenes en el cuerpo del mensaje" + LABEL_SHOW_ANIMATION: "Mostrar animación" + LABEL_MESSAGE_PER_PAGE: "Mensajes en página" + LABEL_NOTIFICATIONS: "Notificaciones" + LABEL_SOUND_NOTIFICATION: "Sonido de la notificación" + LABEL_CHROME_NOTIFICATION_DESC: "Mostrar notificación de nuevos mensajes en Popup" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Bloqueado por el explorador)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Contactos" + LABEL_CONTACTS_AUTOSAVE: "Agregar automáticamente destinatarios a la libreta de direcciones" + LEGEND_CONTACTS_SYNC: "Sincronización remota (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Activar la sincronización remota" + LABEL_CONTACTS_SYNC_SERVER: "Servidor" + LABEL_CONTACTS_SYNC_AB_URL: "Libreta de direcciones URL" + LABEL_CONTACTS_SYNC_USER: "Usuario" + LABEL_CONTACTS_SYNC_PASSWORD: "Contraseña" + SETTINGS_THEMES: + LEGEND_THEMES: "Temas" + LEGEND_THEMES_CUSTOM: "Configuración de tema personalizado" + LABEL_CUSTOM_TYPE: "Tipo" + LABEL_CUSTOM_TYPE_LIGHT: "Claro" + LABEL_CUSTOM_TYPE_DARK: "Oscuro" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Fondo" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Suba una imagen de fondo (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "La imagen es muy grande" + ERROR_FILE_TYPE_ERROR: "Tipo de archivo inválido (Solo permitido: JPG y PNG)" + ERROR_UNKNOWN: "Se ha producido un error de carga de archivo desconocido" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Conectar con Google" + BUTTON_GOOGLE_DISCONNECT: "Desconectar de Google" + MAIN_GOOGLE_DESC: "Despues de habilitar el ingreso via Google, usted puede iniciar sesión en la cuenta usando el botón de Google que aparece en la pantalla de ingreso." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Conectar con Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Desconectar Facebook" + MAIN_FACEBOOK_DESC: "Despues de habilitar el ingreso via Facebook, usted puede iniciar sesión en la cuenta usando el botón de Facebook que aparece en la pantalla de ingreso." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Conectar con Twitter" + BUTTON_TWITTER_DISCONNECT: "Desconectar Twitter" + MAIN_TWITTER_DESC: "Despues de habilitar el ingreso via Twitter, usted puede iniciar sesión en la cuenta usando el botón de Twitter que aparece en la pantalla de ingreso." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Lista de Carpetas" + BUTTON_CREATE: "Crear carpeta" + BUTTON_SYSTEM: "Carpetas del sistema" + BUTTON_DELETE: "Eliminar" + BUTTON_SUBSCRIBE: "Suscribir" + BUTTON_UNSUBSCRIBE: "Darse de baja" + LOADING_PROCESS: "Actualizando lista de carpetas" + CREATING_PROCESS: "Creando carpeta" + DELETING_PROCESS: "Eliminado carpeta" + RENAMING_PROCESS: "Renombrando carpeta" + DELETING_ASK: "¿Está usted seguro?" + TO_MANY_FOLDERS_DESC_1: "Tiene muchas carpetas!" + TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." + HELP_DELETE_FOLDER: "Eliminar carpeta" + HELP_SHOW_HIDE_FOLDER: "Mostrar/ocultar carpeta" + HELP_CHECK_FOR_NEW_MESSAGES: "Chequear/no chequear nuevos mensajes" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Lista de cuentas" + LEGEND_IDENTITIES: "Identidades" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Cuentas e identidades" + BUTTON_ADD_ACCOUNT: "Añadir cuenta" + BUTTON_ADD_IDENTITY: "Añadir identidad" + BUTTON_DELETE: "Eliminar" + LOADING_PROCESS: "Actualizando lista de cuentas" + DELETING_ASK: "¿Está usted seguro?" + DEFAULT_IDENTITY_LABEL: "predeterminado" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identidad" + LEGEND_IDENTITIES: "Identidades adicionales" + LABEL_DEFAULT: "Predeterminado" + LABEL_DISPLAY_NAME: "Nombre" + LABEL_REPLY_TO: "Responder a" + LABEL_SIGNATURE: "Firma" + LABEL_ADD_SIGNATURE_TO_ALL: "Agregar firma a todos los mensajes salientes" + BUTTON_ADD_IDENTITY: "Añadir Identidad" + BUTTON_DELETE: "Eliminar" + LOADING_PROCESS: "Actualización de la lista de la identidad" + DELETING_ASK: "¿Está usted seguro?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Cambiar contraseña" + LABEL_CURRENT_PASSWORD: "Contraseña actual" + LABEL_NEW_PASSWORD: "Nueva contraseña" + LABEL_REPEAT_PASSWORD: "Confirmar nueva contraseña" + BUTTON_UPDATE_PASSWORD: "Establecer nueva contraseña" + ERROR_PASSWORD_MISMATCH: "Las contraseñas no coinciden, por favor intente de nuevo" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Importar llave OpenPGP" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generar llaves OpenPGP" + TITLE_PRIVATE: "Privado" + TITLE_PUBLIC: "Público" + DELETING_ASK: "¿Está usted seguro?" + GENERATE_ONLY_HTTPS: "Solo HTTPS" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Ayuda de atajos de teclado" + TAB_MAILBOX: "Buzón" + TAB_MESSAGE_LIST: "Lista de mensajes" + TAB_MESSAGE_VIEW: "Vista de avisos" + TAB_COMPOSE: "Redactar" + LABEL_OPEN_USER_DROPDOWN: "Desplegar lista de usuarios" + LABEL_REPLY: "Responder" + LABEL_REPLY_ALL: "Responder a todos" + LABEL_FORWARD: "Adelante" + LABEL_FORWARD_MULTIPLY: "Reenviar (multiplicar)" + LABEL_HELP: "Ayuda" + LABEL_CHECK_ALL: "Comprobar todos los mensajes" + LABEL_ARCHIVE: "Archivo" + LABEL_DELETE: "Eliminar" + LABEL_OPEN_THREAD: "Abrir hilo seleccionado" + LABEL_MOVE: "Mover" + LABEL_READ: "Marcar los mensajes seleccionados como leídos" + LABEL_UNREAD: "Marcar los mensajes seleccionados como no leídos" + LABEL_IMPORTANT: "Importante, marcar mensajes seleccionados" + LABEL_SEARCH: "Buscar" + LABEL_CANCEL_SEARCH: "Cancelar la búsqueda" + LABEL_FULLSCREEN_ENTER: "Pantalla completa (panel de vista previa)" + LABEL_VIEW_MESSAGE_ENTER: "Ver mensaje (No hay diseño panel de vista previa)" + LABEL_SWITCH_TO_MESSAGE: "Cambiar foco a mensaje seleccionado" + LABEL_SWITCH_TO_FOLDER_LIST: "Cambiar foco a la lista de carpetas" + LABEL_FULLSCREEN_TOGGLE: "Cambiar a modo de pantalla completa" + LABEL_BLOCKQUOTES_TOGGLE: "Cambiar blockquotes de mensaje" + LABEL_THREAD_NEXT: "Próximo mensaje del hilo" + LABEL_THREAD_PREV: "Mensaje anterior del hilo" + LABEL_PRINT: "Imprimir" + LABEL_EXIT_FULLSCREEN: "Salir del modo de pantalla completa" + LABEL_CLOSE_MESSAGE: "Cerrar el mensaje (No hay diseño panel de vista previa)" + LABEL_SWITCH_TO_LIST: "Cambiar foco de nuevo a la lista de mensajes" + LABEL_OPEN_COMPOSE_POPUP: "Abrir ventana de redacción" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimizar componer" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Abrir ventana de identidades" + LABEL_SAVE_MESSAGE: "Guardar aviso" + LABEL_SEND_MESSAGE: "Enviar mensaje" + LABEL_CLOSE_COMPOSE: "Cerrar componer" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "No se encontraron claves públicas" + NO_PUBLIC_KEYS_FOUND_FOR: "No hay claves públicas encontrados para el email %MAIL%" + NO_PRIVATE_KEY_FOUND: "No se encontró la clave privada" + NO_PRIVATE_KEY_FOUND_FOR: "No hay una clave privada para el email %EMAIL%" + ADD_A_PUBLICK_KEY: "Añadir llave pública" + SELECT_A_PRIVATE_KEY: "Seleccionar una clave privada" + UNVERIFIRED_SIGNATURE: "Firma no verificada" + DECRYPTION_ERROR: "Error de descifrado OpenPGP" + GOOD_SIGNATURE: "Buena firma de %USER%" + PGP_ERROR: "Error OpenPGP: %ERROR%" + SPECIFY_FROM_EMAIL: "Por favor, especifique dirección de correo electrónico PARA" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Por favor, especifique al menos un destinatario" + NOTIFICATIONS: + INVALID_TOKEN: "Elemento no válido" + AUTH_ERROR: "Autentificación fallida" + ACCESS_ERROR: "Error de acceso" + CONNECTION_ERROR: "No se puede conectar al servidor" + CAPTCHA_ERROR: "CAPTCHA Incorrecto." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- + Este ID no está asignado a ninguna cuenta de Email todavía. Inicie sesión + con las credenciales de correo electrónico y habilite esta característica + en la configuración de cuenta. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- + Este ID no está asignado a ninguna cuenta de Email todavía. Inicie sesión + con las credenciales de correo electrónico y habilite esta característica + en la configuración de cuenta. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- + Este ID no está asignado a ninguna cuenta de Email todavía. Inicie sesión + con las credenciales de correo electrónico y habilite esta característica + en la configuración de cuenta. + DOMAIN_NOT_ALLOWED: "Dominio no permitido" + ACCOUNT_NOT_ALLOWED: "La cuenta no está permitida" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Factor de verificación en dos pasos requerido" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Error de verificación en dos pasos" + COULD_NOT_SAVE_NEW_PASSWORD: "No se puede guardar la nueva contraseña" + CURRENT_PASSWORD_INCORRECT: "La contraseña actual es incorrecta" + NEW_PASSWORD_SHORT: "La contraseña es muy corta" + NEW_PASSWORD_WEAK: "La contraseña es muy fácil" + NEW_PASSWORD_FORBIDDENT: "La contraseña contiene caracteres prohibidos" + CONTACTS_SYNC_ERROR: "Error de sincronización de Contactos" + CANT_GET_MESSAGE_LIST: "No se puede obtener la lista de mensajes" + CANT_GET_MESSAGE: "No se puede obtener el mensaje" + CANT_DELETE_MESSAGE: "No se puede eliminar el mensaje" + CANT_MOVE_MESSAGE: "No se puede mover el mensaje" + CANT_SAVE_MESSAGE: "No se puede guardar el mensaje" + CANT_SEND_MESSAGE: "No se puede enviar el mensaje" + INVALID_RECIPIENTS: "Los destinatarios no son válidos" + CANT_SAVE_FILTERS: "No se pueden guardar los filtros" + CANT_GET_FILTERS: "No se pueden obtener los filtros" + FILTERS_ARE_NOT_CORRECT: "Filtros incorrectos" + CANT_CREATE_FOLDER: "No se puede crear la carpeta" + CANT_RENAME_FOLDER: "No se puede renombrar la carpeta" + CANT_DELETE_FOLDER: "No se puede eliminar la carpeta" + CANT_DELETE_NON_EMPTY_FOLDER: "No se puede eliminar un directorio que no está vacío" + CANT_SUBSCRIBE_FOLDER: "No se puede suscribir carpeta" + CANT_UNSUBSCRIBE_FOLDER: "No puede darse de baja de la carpeta" + CANT_SAVE_SETTINGS: "No puede guardar la configuración" + CANT_SAVE_PLUGIN_SETTINGS: "No puede guardar la configuración" + DOMAIN_ALREADY_EXISTS: "El Dominio ya existe" + CANT_INSTALL_PACKAGE: "No se pudo instalar el paquete" + CANT_DELETE_PACKAGE: "No se pudo eliminar el paquete" + INVALID_PLUGIN_PACKAGE: "Paquete de plugins no válido" + UNSUPPORTED_PLUGIN_PACKAGE: "Paquete de plugins incompatible" + LICENSING_SERVER_IS_UNAVAILABLE: "El Servidor de Suscripción no está disponible" + LICENSING_DOMAIN_EXPIRED: "La suscripción para este dominio ha expirado." + LICENSING_DOMAIN_BANNED: "La suscripción para este dominio se prohibió." + DEMO_SEND_MESSAGE_ERROR: "Por razones de seguridad, esta cuenta demo no permite enviar mensajes a direcciones de correo electrónico externas!" + DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" + ACCOUNT_ALREADY_EXISTS: "La cuenta ya existe" + ACCOUNT_DOES_NOT_EXIST: "La cuenta no existe" + MAIL_SERVER_ERROR: "Ocurrió un error mientras se accedía al servidor" + INVALID_INPUT_ARGUMENT: "Argumento no válido" + UNKNOWN_ERROR: "Error desconocido" + STATIC: + BACK_LINK: "Recargar" + DOMAIN_LIST_DESC: "Lista de dominios de correo web que se le permite acceder." + PHP_EXSTENSIONS_ERROR_DESC: "La extensión de PHP requerida no está disponible en su configuración de PHP!" + PHP_VERSION_ERROR_DESC: "Su versión de PHP (%VERSION%) es menor a la mínima requerida 5.3.0!" + NO_SCRIPT_TITLE: "Esta aplicación requiere de JavaScript." + NO_SCRIPT_DESC: | + JavaScript no está disponible en su navegador. + Por favor habilite el soporte JavaScript en la configuración de su navegador e inténtelo de nuevo. + NO_COOKIE_TITLE: "Esta aplicación requiere de Cookies." + NO_COOKIE_DESC: | + Su navegador no soporta Cookies. + Por favor habilite los Cookie en la configuración de su navegador e inténtelo de nuevo. + BAD_BROWSER_TITLE: "Su navegador no está actualizado." + BAD_BROWSER_DESC: | + Para usar todas las características de esta aplicación, + descargue e instale uno de estos navegadores: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/et_EE.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/et_EE.yml new file mode 100755 index 00000000..21ec9bab --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/et_EE.yml @@ -0,0 +1,710 @@ +et_EE: + LOGIN: + LABEL_EMAIL: "E-post" + LABEL_LOGIN: "Logi sisse" + LABEL_PASSWORD: "Salasõna" + LABEL_SIGN_ME: "Pea mind meeles" + LABEL_VERIFICATION_CODE: "Kontrollkood" + LABEL_DONT_ASK_VERIFICATION_CODE: "Ära küsi koodi järgmised 2 nädalat" + BUTTON_SIGN_IN: "Sisene" + TITLE_SIGN_IN_GOOGLE: "Sisene Google'i abil" + TITLE_SIGN_IN_FACEBOOK: "Sisene Facebooki abil" + TITLE_SIGN_IN_TWITTER: "Sisene Twitteri abil" + LABEL_FORGOT_PASSWORD: "Unustasin salasõna" + LABEL_REGISTRATION: "Registreerimine" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Lisa konto" + BUTTON_SETTINGS: "Sätted" + BUTTON_HELP: "Abi" + BUTTON_LOGOUT: "Logi välja" + MOBILE: + BUTTON_MOBILE_VERSION: "Mobiiliversioon" + BUTTON_DESKTOP_VERSION: "Töölauaversioon" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Otsing" + TITLE_ADV: "Täpsem otsing" + LABEL_ADV_FROM: "Saatja" + LABEL_ADV_TO: "Saaja" + LABEL_ADV_SUBJECT: "Pealkiri" + LABEL_ADV_TEXT: "Tekst" + LABEL_ADV_HAS_ATTACHMENT: "Manusega" + LABEL_ADV_HAS_ATTACHMENTS: "Manustega" + LABEL_ADV_FLAGGED: "Lipuga tähistatud" + LABEL_ADV_UNSEEN: "Lugemata" + LABEL_ADV_DATE: "Kuupäev" + LABEL_ADV_DATE_ALL: "Kõik" + LABEL_ADV_DATE_3_DAYS: "Kuni 3 päeva vanune" + LABEL_ADV_DATE_7_DAYS: "Kuni 1 nädal vanune" + LABEL_ADV_DATE_MONTH: "Kuni 1 kuu vanune" + LABEL_ADV_DATE_3_MONTHS: "Kuni 3 kuu vanune " + LABEL_ADV_DATE_6_MONTHS: "Kuni 6 kuu vanune" + LABEL_ADV_DATE_YEAR: "Kuni 1 aasta vanune" + BUTTON_ADV_SEARCH: "Otsi" + PREVIEW_POPUP: + FULLSCREEN: "Täisekraan sisse/välja" + ZOOM: "Suurenda/vähenda" + CLOSE: "Sulge (Esc)" + LOADING: "Laadin..." + GALLERY_PREV: "Eelmine (nool vasakule)" + GALLERY_NEXT: "Järgmine (nool paremale)" + GALLERY_COUNTER: "%curr%. %total%-st" + IMAGE_ERROR: "Pilti ei olnud võimalik laadida." + AJAX_ERROR: "Sisu ei olnud võimalik laadida." + FOLDER_LIST: + BUTTON_COMPOSE: "Koosta uus kiri" + BUTTON_CONTACTS: "Kontaktid" + BUTTON_NEW_MESSAGE: "Uus kiri" + INBOX_NAME: "Saabunud kirjad" + SENT_NAME: "Saadetud kirjad" + DRAFTS_NAME: "Mustandid" + SPAM_NAME: "Rämpspost" + TRASH_NAME: "Prügikast" + ARCHIVE_NAME: "Arhiiv" + QUOTA: + TITLE: "Andmemaht" + MESSAGE_LIST: + BUTTON_RELOAD: "Laadi kirjade nimekiri uuesti" + BUTTON_MOVE_TO: "Liiguta kausta" + BUTTON_DELETE: "Kustuta" + BUTTON_ARCHIVE: "Arhiveeri" + BUTTON_SPAM: "Märgi rämpspostiks" + BUTTON_NOT_SPAM: "Ei ole rämpspost" + BUTTON_EMPTY_FOLDER: "Tühjenda kaust" + BUTTON_MULTY_FORWARD: "Edasta manus(t)ena" + BUTTON_DELETE_WITHOUT_MOVE: "Kustuta lõplikult" + BUTTON_MORE: "Näita rohkem" + MENU_SET_SEEN: "Märgi loetuks" + MENU_SET_ALL_SEEN: "Märgi kõik loetuks" + MENU_UNSET_SEEN: "Märgi lugemata kirjaks" + MENU_SET_FLAG: "Tähista lipuga" + MENU_UNSET_FLAG: "Eemalda lipp" + MENU_SELECT_ALL: "Kõik" + MENU_SELECT_NONE: "Ühtegi" + MENU_SELECT_INVERT: "Pööra valik ümber" + MENU_SELECT_UNSEEN: "Lugemata" + MENU_SELECT_SEEN: "Loetud" + MENU_SELECT_FLAGGED: "Lipuga märgitud" + MENU_SELECT_UNFLAGGED: "Lipuga märkimata" + EMPTY_LIST: "Tühi nimekiri" + EMPTY_SEARCH_LIST: "Otsingule ei vastanud ühtegi kirja" + SEARCH_RESULT_FOR: "Vasted otsingule \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "tagasi kirjade nimekirja" + LIST_LOADING: "Laadimine" + EMPTY_SUBJECT_TEXT: "(Pealkiri puudub)" + PUT_MESSAGE_HERE: "Sikuta siia kiri, mida soovid nimekirjas näha" + TODAY_AT: "täna kell %TIME%" + YESTERDAY_AT: "eile kell %TIME%" + SEARCH_PLACEHOLDER: "Otsi" + NEW_MESSAGE_NOTIFICATION: "Sulle on %COUNT% uut kirja!" + QUOTA_SIZE: "Kasutad %SIZE% (%PROC%%) lubatud kettamahust %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Muuda" + BUTTON_BACK: "Tagasi" + BUTTON_CLOSE: "Sulge" + BUTTON_DELETE: "Kustuta" + BUTTON_ARCHIVE: "Arhiveeri" + BUTTON_SPAM: "Märgi rämpspostiks" + BUTTON_NOT_SPAM: "Ei ole rämpspost" + BUTTON_MOVE_TO: "Liiguta kausta" + BUTTON_MORE: "Näita rohkem" + BUTTON_REPLY: "Vasta" + BUTTON_REPLY_ALL: "Vasta kõigile" + BUTTON_FORWARD: "Edasta" + BUTTON_FORWARD_AS_ATTACHMENT: "Edasta manusena" + BUTTON_EDIT_AS_NEW: "Kasuta uue kirja põhjana" + BUTTON_SHOW_IMAGES: "Näita väljast lingitud pilte" + BUTTON_NOTIFY_READ_RECEIPT: "Saatja palub end teavitada kirja kättesaamisest." + BUTTON_IN_NEW_WINDOW: "Näita eraldi aknas" + BUTTON_THREAD_LIST: "Vestluse lõimede nimekiri" + BUTTON_THREAD_PREV: "Eelmine" + BUTTON_THREAD_NEXT: "Järgmine" + BUTTON_THREAD_MORE: "Rohkem kirju" + MENU_HEADERS: "Näita kirja päised" + MENU_VIEW_ORIGINAL: "Näita lähteteksti" + MENU_DOWNLOAD_ORIGINAL: "Laadi alla .eml failina" + MENU_FILTER_SIMILAR: "Filtreeri sarnased kirjad" + MENU_PRINT: "Prindi" + EMPTY_SUBJECT_TEXT: "(Pealkiri puudub)" + LABEL_SUBJECT: "Pealkiri" + LABEL_DATE: "Kuupäev" + LABEL_FROM: "Saatja" + LABEL_FROM_SHORT: "saatja" + LABEL_TO: "Saaja" + LABEL_TO_SHORT: "saaja" + LABEL_CC: "Koopia" + LABEL_BCC: "Pimekoopia" + LABEL_REPLY_TO: "Vastuse saaja" + PRINT_LABEL_FROM: "Saatja" + PRINT_LABEL_TO: "Saaja" + PRINT_LABEL_CC: "Koopia" + PRINT_LABEL_BCC: "Pimekoopia" + PRINT_LABEL_REPLY_TO: "Vastuse saaja " + PRINT_LABEL_DATE: "Kuupäev" + PRINT_LABEL_SUBJECT: "Pealkiri" + PRINT_LABEL_ATTACHMENTS: "Manused" + MESSAGE_LOADING: "Laadimine" + MESSAGE_VIEW_DESC: "Vali nimekirjast kiri, mida siin näidata" + PGP_PASSWORD_INPUT_PLACEHOLDER: "Salasõna" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP abil signeeritud kiri (kliki verifitseerimiseks)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP abil krüpteeritud kiri (kliki dekrüpteerimiseks)" + LINK_DOWNLOAD_AS_ZIP: "Laadi alla .zip failina" + LINK_SAVE_TO_OWNCLOUD: "Salvesta ownCloudi" + LINK_SAVE_TO_DROPBOX: "Salvesta Dropboxi" + READ_RECEIPT: + SUBJECT: "Kohaletoimetamise kinnitus - %SUBJECT%" + BODY: | + See on kohaletoimetamise kinnitus kirjale, mille saatsid aadressile %READ-RECEIPT%. + + Tähelepanu: Kinnitus tähendab vaid seda, et kirja kuvati saaja arvutis. + Kirja sisu lugemise või mõistmise kohta see teavitus granatiisid ei anna. + SUGGESTIONS: + SEARCHING_DESC: "Otsin..." + CONTACTS: + LEGEND_CONTACTS: "Kontaktid" + SEARCH_INPUT_PLACEHOLDER: "Otsi" + BUTTON_ADD_CONTACT: "Lisa kontakt" + BUTTON_CREATE_CONTACT: "Lisa" + BUTTON_UPDATE_CONTACT: "Salvesta" + BUTTON_IMPORT: "Impordi (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Ekspordi (vcf, vCard)" + BUTTON_EXPORT_CSV: "Ekspordi (csv)" + ERROR_IMPORT_FILE: "Viga importimisel (puudulik faili formaat)" + LIST_LOADING: "Laadimine" + EMPTY_LIST: "Kontaktid puuduvad" + EMPTY_SEARCH: "Kontakte ei leitud" + CLEAR_SEARCH: "Puhasta otsinguväli" + CONTACT_VIEW_DESC: "Vali nimekirjast kontakt, mida siin näidata" + LABEL_DISPLAY_NAME: "Kuvatav nimi" + LABEL_EMAIL: "E-post" + LABEL_PHONE: "Telefon" + LABEL_WEB: "Veebileht" + LABEL_BIRTHDAY: "Sünnipäev" + LINK_ADD_EMAIL: "Lisa e-posti aadress" + LINK_ADD_PHONE: "Lisa telefon" + LINK_BIRTHDAY: "Sünnipäev" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Sisesta kuvatav nimi" + PLACEHOLDER_ENTER_LAST_NAME: "Sisesta perenimi" + PLACEHOLDER_ENTER_FIRST_NAME: "Sisesta eesnimi" + PLACEHOLDER_ENTER_NICK_NAME: "Sisesta hüüdnimi" + LABEL_READ_ONLY: "Ainult lugemisõigus" + LABEL_SHARE: "Jaga" + ADD_MENU_LABEL: "Lisa" + ADD_MENU_NICKNAME: "Hüüdnimi" + ADD_MENU_NOTES: "Märkmed" + ADD_MENU_EMAIL: "E-post" + ADD_MENU_PHONE: "Telefon" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Aadress" + ADD_MENU_BIRTHDAY: "Sünnipäev" + ADD_MENU_TAGS: "Sildid" + BUTTON_SHARE_NONE: "Puudub" + BUTTON_SHARE_ALL: "Kõigiga" + BUTTON_SYNC: "Sünkroniseerimine (CardDAV)" + COMPOSE: + TITLE_FROM: "Saatja" + TITLE_TO: "Saaja" + TITLE_CC: "Koopia" + TITLE_BCC: "Pimekoopia" + TITLE_REPLY_TO: "Vastuse saaja " + TITLE_SUBJECT: "Pealkiri" + LINK_SHOW_INPUTS: "näita kõiki väljasid" + BUTTON_SEND: "Saada" + BUTTON_SAVE: "Salvesta" + BUTTON_DELETE: "Kustuta" + BUTTON_CANCEL: "Tühista" + BUTTON_MINIMIZE: "Vähenda miinimumini" + SAVED_TIME: "Salvestati %TIME%" + SAVED_ERROR_ON_SEND: "Kiri saadeti, aga seda ei salvestatud saadetud kirjade kausta" + DISCARD_UNSAVED_DATA: "Kustutan salvestamata andmed?" + ATTACH_FILES: "Lisa faile" + ATTACH_DROP_FILES_DESC: "Sikuta failid siia" + ATTACH_ITEM_CANCEL: "Tühista" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% kirjutas" + FORWARD_MESSAGE_TOP_TITLE: "-------- Edastatud kiri -------" + FORWARD_MESSAGE_TOP_FROM: "Saatja" + FORWARD_MESSAGE_TOP_TO: "Saaja" + FORWARD_MESSAGE_TOP_CC: "Koopia" + FORWARD_MESSAGE_TOP_SENT: "Saadetud" + FORWARD_MESSAGE_TOP_SUBJECT: "Pealkiri" + EMPTY_TO_ERROR_DESC: "Lisa vähemalt üks adressaat" + NO_ATTACHMENTS_HERE_DESC: "Manused puuduvad." + ATTACHMENTS_ERROR_DESC: "Tähelepanu! Kõiki manuseid ei ole üles laetud." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Kõiki manuseid ei ole veel üles laetud." + BUTTON_REQUEST_READ_RECEIPT: "Palu lugemise kohta kinnitust" + BUTTON_MARK_AS_IMPORTANT: "Tähista olulisena" + BUTTON_OPEN_PGP: "OpenPGP (Vaid lihttekstina)" + BUTTON_REQUEST_DSN: "Palu kättesaamise kohta kinnitust" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Sulge" + POPUPS_ASK: + BUTTON_YES: "Jah" + BUTTON_NO: "Ei" + DESC_WANT_CLOSE_THIS_WINDOW: "Kas oled kindel, et soovid akna sulgeda?" + DESC_WANT_DELETE_MESSAGES: "Kas oled kindel, et soovid sõnumi(d) kustutada?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Vali oma keel" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Lisan konto?" + BUTTON_ADD_ACCOUNT: "Lisa" + TITLE_UPDATE_ACCOUNT: "Muudan kontot?" + BUTTON_UPDATE_ACCOUNT: "Muuda" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Lisan identiteedi?" + TITLE_UPDATE_IDENTITY: "Muudan identiteeti?" + BUTTON_ADD_IDENTITY: "Lisa" + BUTTON_UPDATE_IDENTITY: "Muuda" + LABEL_EMAIL: "E-post" + LABEL_NAME: "Nimi" + LABEL_REPLY_TO: "Vastuse saaja " + LABEL_SIGNATURE: "Signatuur" + LABEL_CC: "Koopia" + LABEL_BCC: "Pimekoopia" + LABEL_SIGNATURE_INSERT_BEFORE: "Sisesta see signatuur kirjades enne tsiteeritud teksti" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Loon kausta?" + LABEL_NAME: "Kausta nimi" + LABEL_PARENT: "Ülemkaust" + BUTTON_CREATE: "Loo" + BUTTON_CANCEL: "Tühista" + BUTTON_CLOSE: "Sulge" + TITLE_CREATING_PROCESS: "Loon kausta" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Tühjendan kausta kirjadest?" + BUTTON_CLEAR: "Tühjenda" + BUTTON_CANCEL: "Tühista" + BUTTON_CLOSE: "Sulge" + DANGER_DESC_WARNING: "Tähelepanu!" + DANGER_DESC_HTML_1: "See tegevus kustutab täielikult kõik kirjad kaustast %FOLDER%." + DANGER_DESC_HTML_2: "Juba alustatud protsessi ei saa tühistada või katkestada." + TITLE_CLEARING_PROCESS: "Tühjendan kausta..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Impordi OpenPGP võti" + BUTTON_IMPORT_OPEN_PGP_KEY: "Impordi" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "Vaata OpenPGP võtit" + BUTTON_SELECT: "Vali" + BUTTON_CLOSE: "Sulge" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Genereeri OpenPGP võtmed" + LABEL_EMAIL: "E-post" + LABEL_NAME: "Nimi" + LABEL_PASSWORD: "Salasõna" + LABEL_KEY_BIT_LENGTH: "Võtme pikkus" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Genereeri" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP allkirjastamine/krüpteerimine" + LABEL_SIGN: "Allkirjasta" + LABEL_ENCRYPT: "Krüpteeri" + LABEL_PASSWORD: "Salasõna" + BUTTON_SIGN: "Allkirjasta" + BUTTON_ENCRYPT: "Krüpteeri" + BUTTON_SIGN_AND_ENCRYPT: "Allkirjasta ja krüpteeri" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP dekrüpteerimine" + LABEL_KEY: "Privaatne võti " + LABEL_PASSWORD: "Salasõna" + BUTTON_DECRYPT: "Dekrüpteeri" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "2. faktori kontroll" + LABEL_CODE: "Kood" + BUTTON_TEST: "Kontrolli" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Filtri loomine" + TITLE_EDIT_FILTER: "Filtri muutmine" + FILTER_NAME: "Nimi" + LEGEND_CONDITIONS: "Tingimused" + LEGEND_ACTIONS: "Tegevused" + BUTTON_DONE: "Valmis" + BUTTON_ADD_CONDITION: "Lisa tingimus" + SELECT_ACTION_NONE: "Puudub" + SELECT_ACTION_MOVE_TO: "Liiguta kausta" + SELECT_ACTION_FORWARD_TO: "Edasta saajale" + SELECT_ACTION_REJECT: "Lükka tagasi" + SELECT_ACTION_VACATION_MESSAGE: "Puhkuse teade" + SELECT_ACTION_DISCARD: "Hülga" + SELECT_FIELD_FROM: "Saatja" + SELECT_FIELD_RECIPIENTS: "Saaja" + SELECT_FIELD_SUBJECT: "Pealkiri" + SELECT_FIELD_HEADER: "Päis" + SELECT_FIELD_SIZE: "Suurus" + SELECT_TYPE_CONTAINS: "Sisaldab" + SELECT_TYPE_NOT_CONTAINS: "Ei sisalda" + SELECT_TYPE_MATCHES: "On vaste päringule (* ja ? on toetatud)" + SELECT_TYPE_NOT_MATCHES: "Ei ole vaste päringule (* ja ? on toetatud)" + SELECT_TYPE_REGEXP: "Vastab regulaaravaldisele" + SELECT_TYPE_NOT_REGEXP: "Ei vasta regulaaravaldisele" + SELECT_TYPE_EQUAL_TO: "Võrdub" + SELECT_TYPE_NOT_EQUAL_TO: "Ei võrdu" + SELECT_TYPE_OVER: "Üle" + SELECT_TYPE_UNDER: "Alla" + SELECT_MATCH_ANY: "Vastab ÜHELE järgmistest reeglitest" + SELECT_MATCH_ALL: "Vastab KÕIGILE järgmistest reeglitest" + MARK_AS_READ_LABEL: "Märgi loetuks" + REPLY_INTERVAL_LABEL: "Vastuse intervall (päevades)" + KEEP_LABEL: "Salvesta" + STOP_LABEL: "Ära peata reeglite protsessimist" + EMAIL_LABEL: "E-post" + VACATION_SUBJECT_LABEL: "Pealkiri (valikuline)" + VACATION_MESSAGE_LABEL: "Sõnum" + VACATION_RECIPIENTS_LABEL: "Saajad (eraldatud komaga)" + REJECT_MESSAGE_LABEL: "Tagasilükkamise sõnum" + ALL_INCOMING_MESSAGES_DESC: "Kõik sisenevad kirjad" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Vali süsteemsed kaustad" + SELECT_CHOOSE_ONE: "Vali üks" + SELECT_UNUSE_NAME: "Ära kasuta" + LABEL_SENT: "Saadetud" + LABEL_DRAFTS: "Mustandid" + LABEL_SPAM: "Rämpspost" + LABEL_TRASH: "Prügikast" + LABEL_ARCHIVE: "Arhiiv" + BUTTON_CANCEL: "Tühista" + BUTTON_CLOSE: "Sulge" + NOTIFICATION_SENT: | + Sa pole valinud süsteemset kausta saadetud kirjadele. + Kui sa ei soovi saadetud kirju salvestada, vali "Ära kasuta". + NOTIFICATION_DRAFTS: "Sa pole valinud kausta, kuhu mustandid kirjutamise ajal salvestatakse." + NOTIFICATION_SPAM: | + Sa pole valinud süsteemset kausta rämpspostiks märgitud kirjadele. + Kui sa ei soovi rämpspostiks märgitud kirju salvestada, vali "Ära kasuta". + NOTIFICATION_TRASH: | + Sa pole valinud süsteemset kausta kustutatud kirjadele. + Kui sa ei soovi kustutatud kirju salvestada, vali "Ära kasuta". + NOTIFICATION_ARCHIVE: "Sa pole valinud kausta, kuhu arhiveeritud kirjad salvestatakse." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "2. faktoriga autentimine (TOTP)" + LABEL_ENABLE_TWO_FACTOR: "Luba 2. faktoriga autentimine" + LABEL_TWO_FACTOR_USER: "Kasutaja" + LABEL_TWO_FACTOR_STATUS: "Staatus" + LABEL_TWO_FACTOR_SECRET: "Kood" + LABEL_TWO_FACTOR_BACKUP_CODES: "Tagavarakoodid" + BUTTON_CREATE: "Loo kood" + BUTTON_ACTIVATE: "Aktiveeri" + BUTTON_CLEAR: "Puhasta" + BUTTON_LOGOUT: "Logi välja" + BUTTON_DONE: "Valmis" + BUTTON_TEST: "Test" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Näita koodi" + BUTTON_HIDE_SECRET: "Peida kood" + TWO_FACTOR_REQUIRE_DESC: "Sinu konto nõuab 2. faktoriga autentimist." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Seadistatud" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Seadistamata" + TWO_FACTOR_SECRET_DESC: > + Impordi see info oma Google Authenticator klienti (või mõnesse teise TOTP + klienti) kasutades juuresolevat QR koodi või käsitsi sisestades. + TWO_FACTOR_BACKUP_CODES_DESC: > + Kui sul ei õnnestu Google Authenticatori (või muu TOTP kliendi) abil siseneda, + võid kasutada sisenemiseks varukoode. Kui oled varukoodi korra kasutanud, + lõpetab see töö. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Seda sätet ei saa enne testimist muuta." + TITLES: + LOADING: "Laadin" + LOGIN: "Sisenemine" + MAILBOX: "Postkast" + SETTINGS: "Sätted" + COMPOSE: "Koosta uus kiri" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Fail on liiga suur" + ERROR_FILE_PARTIALLY_UPLOADED: "Tundmatu vea tõttu laaditi fail üles osaliselt" + ERROR_NO_FILE_UPLOADED: "Faili pole üles laetud" + ERROR_MISSING_TEMP_FOLDER: "Ajutine fail puudub" + ERROR_ON_SAVING_FILE: "Faili üleslaadimisel tekkis tundmatu iseloomuga viga" + ERROR_FILE_TYPE: "Puudulik faili tüüp" + ERROR_UNKNOWN: "Faili üleslaadimisel tekkis tundmatu iseloomuga viga" + EDITOR: + TEXT_SWITCHER_RICH_FORMATTING: "Rikastekst" + TEXT_SWITCHER_CONFIRM: "Teksti vorming ja sellesse sisestatud pildid lähevad kaduma. Kas oled kindel, et soovid jätkata?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Isiklik" + LABEL_GENERAL_NAME: "Üldine" + LABEL_CONTACTS_NAME: "Kontaktid" + LABEL_FOLDERS_NAME: "Kaustad" + LABEL_ACCOUNTS_NAME: "Kontod" + LABEL_IDENTITY_NAME: "Identiteet" + LABEL_IDENTITIES_NAME: "Identiteedid" + LABEL_FILTERS_NAME: "Filtrid" + LABEL_TEMPLATES_NAME: "Põhjad" + LABEL_SECURITY_NAME: "Turvalisus" + LABEL_SOCIAL_NAME: "Sotsiaalne" + LABEL_THEMES_NAME: "Teemad" + LABEL_CHANGE_PASSWORD_NAME: "Salasõna" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Tagasi" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filtrid" + BUTTON_SAVE: "Salvesta" + BUTTON_ADD_FILTER: "Lisa filter" + BUTTON_DELETE: "Kustuta" + BUTTON_RAW_SCRIPT: "Kasuta oma skripti" + SUBNAME_NONE: "Puuduvad" + SUBNAME_MOVE_TO: "Liiguta kausta \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Edasta aadressile \"%EMAIL%\"" + SUBNAME_REJECT: "Lükka tagasi" + SUBNAME_VACATION_MESSAGE: "Puhkuse teade" + SUBNAME_DISCARD: "Hülga" + CAPABILITY_LABEL: "Võimekus" + LOADING_PROCESS: "Värskendan filtrite nimekirja" + DELETING_ASK: "Kas oled kindel?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Need muudatused tuleb salvestada serverisse." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identiteet" + LABEL_DISPLAY_NAME: "Nimi" + LABEL_REPLY_TO: "Vastuse saaja" + LABEL_SIGNATURE: "Signatuur" + LABEL_ADD_SIGNATURE_TO_ALL: "Lisa oma signatuur kõikidele väljuvatele kirjadele" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Turvalisus" + LABEL_CONFIGURE_TWO_FACTOR: "Seadista 2. faktoriga autentimine" + LABEL_AUTOLOGOUT: "Automaatne välja logimine" + AUTOLOGIN_NEVER_OPTION_NAME: "Mitte kunagi" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minutit" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% tund(i)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Üldine" + LABEL_LANGUAGE: "Keel" + LABEL_IDENTITY: "Identiteet" + LABEL_LAYOUT: "Vaade" + LABEL_LAYOUT_NO_SPLIT: "Jaotuseta" + LABEL_LAYOUT_VERTICAL_SPLIT: "Vertikaalse jaotusega" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horisontaalse jaotusega" + LABEL_EDITOR: "Vaikimisi tekstiredaktor" + LABEL_EDITOR_HTML: "HTML" + LABEL_EDITOR_PLAIN: "Lihttekst" + LABEL_EDITOR_HTML_FORCED: "HTML (kohustuslik)" + LABEL_EDITOR_PLAIN_FORCED: "Lihttekst (kohustuslik)" + LABEL_ANIMATION: "Kasutajaliidese animatsioonid" + LABEL_ANIMATION_FULL: "Kõik" + LABEL_ANIMATION_NORMAL: "Normaalne" + LABEL_ANIMATION_NONE: "Puuduvad" + LABEL_VIEW_OPTIONS: "Vaate seaded" + LABEL_USE_PREVIEW_PANE: "Kasuta eelvaadet" + LABEL_USE_CHECKBOXES_IN_LIST: "Kuva nimekirjas valikukastikesi" + LABEL_USE_THREADS: "Kasuta vestluse lõimesid" + LABEL_REPLY_SAME_FOLDER: "Pane vastused samasse kausta, kus asub vastatud kiri" + LABEL_SHOW_IMAGES: "Näita alati kirja sisus viidatud väliseid pilte" + LABEL_SHOW_ANIMATION: "Näita anomatsioone" + LABEL_MESSAGE_PER_PAGE: "Lehel kuvatavate kirjade arv" + LABEL_NOTIFICATIONS: "Teavitused" + LABEL_SOUND_NOTIFICATION: "Teavitused heliga" + LABEL_CHROME_NOTIFICATION_DESC: "Näita uute kirjade teavitust hüpikaknaga" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Veebilehitseja poolt blokeeritud)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Kontaktid" + LABEL_CONTACTS_AUTOSAVE: "Lisa saajad automaatselt aadressiraamatusse" + LEGEND_CONTACTS_SYNC: "Väline sünkroniseerimine (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Luba väline sünkroniseerimine" + LABEL_CONTACTS_SYNC_SERVER: "Server" + LABEL_CONTACTS_SYNC_AB_URL: "Aadressiraamatu URL" + LABEL_CONTACTS_SYNC_USER: "Kasutaja" + LABEL_CONTACTS_SYNC_PASSWORD: "Salasõna" + SETTINGS_THEMES: + LEGEND_THEMES: "Teemad" + LEGEND_THEMES_CUSTOM: "Teema kohandamine" + LABEL_CUSTOM_TYPE: "Tüüp" + LABEL_CUSTOM_TYPE_LIGHT: "Hele" + LABEL_CUSTOM_TYPE_DARK: "Tume" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Taust" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Laadi üles taustapilt (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Fail on liiga suur" + ERROR_FILE_TYPE_ERROR: "Faili tüüp ei sobi (lubatud on ainult JPG ja PNG)" + ERROR_UNKNOWN: "Leidis aset tundmatu faili üleslaadimise viga" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Ühenda Google" + BUTTON_GOOGLE_DISCONNECT: "Ühenda Google lahti" + MAIN_GOOGLE_DESC: "Peale Google abil sisselogimise võimaldamist, saad sellele kontole siseneda klikkides Google nupule sisselogimise lehel" + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Ühenda Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Ühenda Facebook lahti" + MAIN_FACEBOOK_DESC: "Peale Facebooki abil sisselogimise võimaldamist, saad sellele kontole siseneda klikkides Facebook nupule sisselogimise lehel" + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Ühenda Twitter" + BUTTON_TWITTER_DISCONNECT: "Ühenda Twitter lahti" + MAIN_TWITTER_DESC: "Peale Twitteri abil sisselogimise võimaldamist, saad sellele kontole siseneda klikkides Twitter nupule sisselogimise lehel" + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Kaustade nimekiri" + BUTTON_CREATE: "Loo kaust" + BUTTON_DELETE: "Kustuta" + BUTTON_SUBSCRIBE: "Telli" + BUTTON_UNSUBSCRIBE: "Loobu tellimusest" + LOADING_PROCESS: "Värskendan kaustada nimekirja" + CREATING_PROCESS: "Loon kasuta" + DELETING_PROCESS: "Kustutan kausta" + RENAMING_PROCESS: "Nimetan kausta ümber" + DELETING_ASK: "Oled kindel?" + TO_MANY_FOLDERS_DESC_1: "Sul on liiga palju kaustu!" + TO_MANY_FOLDERS_DESC_2: "Näitame sulle neist vaid osa, et vältida jõudlusprobleeme." + HELP_DELETE_FOLDER: "Kustuta kaust" + HELP_SHOW_HIDE_FOLDER: "Näita/peida kaust" + HELP_CHECK_FOR_NEW_MESSAGES: "Kontrolli/ära kontrolli uusi kirju" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Kontod" + LEGEND_IDENTITIES: "Identiteedid" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Kontod ja identiteedid" + BUTTON_ADD_ACCOUNT: "Lisa konto" + BUTTON_ADD_IDENTITY: "Lisa identiteet" + BUTTON_DELETE: "Kustuta" + LOADING_PROCESS: "Värskendan..." + DELETING_ASK: "Kas oled kindel?" + DEFAULT_IDENTITY_LABEL: "vaikimisi" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identiteet" + LEGEND_IDENTITIES: "Täiendavad identiteedid" + LABEL_DEFAULT: "Vaikimisi" + LABEL_DISPLAY_NAME: "Nimi" + LABEL_REPLY_TO: "Vastuse saaja " + LABEL_SIGNATURE: "Signatuur" + LABEL_ADD_SIGNATURE_TO_ALL: "Lisa oma signatuur väljuvatele kirjadele" + BUTTON_ADD_IDENTITY: "Lisa identiteet" + BUTTON_DELETE: "Kustuta" + LOADING_PROCESS: "Värskendan identiteetide nimekirja" + DELETING_ASK: "Kas oled kindel?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Muuda salasõna" + LABEL_CURRENT_PASSWORD: "Kehtiv salasõna" + LABEL_NEW_PASSWORD: "Uus salasõna" + LABEL_REPEAT_PASSWORD: "Kinnita uus salasõna" + BUTTON_UPDATE_PASSWORD: "Määra uus salasõna" + ERROR_PASSWORD_MISMATCH: "Salasõnad ei kattu, palun proovi uuesti" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Impordi OpenPGP võti" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Genereeri OpenPGP võti" + TITLE_PRIVATE: "Privaatne" + TITLE_PUBLIC: "Avalik" + DELETING_ASK: "Oled kindel?" + GENERATE_ONLY_HTTPS: "Ainult HTTPS" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Klaviatuuri kombinatsioonide abi" + TAB_MAILBOX: "Postkast" + TAB_MESSAGE_LIST: "Kirjade nimekiri" + TAB_MESSAGE_VIEW: "Kirja vaade" + TAB_COMPOSE: "Kirja koostamine" + LABEL_OPEN_USER_DROPDOWN: "Ava kasutaja sätted" + LABEL_REPLY: "Vasta" + LABEL_REPLY_ALL: "Vasta kõigile" + LABEL_FORWARD: "Edasta" + LABEL_FORWARD_MULTIPLY: "Edasta manusena" + LABEL_HELP: "Abi" + LABEL_CHECK_ALL: "Vali kõik kirjad" + LABEL_ARCHIVE: "Arhiveeri" + LABEL_DELETE: "Kustuta" + LABEL_OPEN_THREAD: "Ava valitud lõim" + LABEL_MOVE: "Liiguta" + LABEL_READ: "Märgi valitud kiri loetuks" + LABEL_UNREAD: "Märgi valitud kiri kui lugemata" + LABEL_IMPORTANT: "Märgi kiri lipuga" + LABEL_SEARCH: "Otsi" + LABEL_CANCEL_SEARCH: "Tühista otsing" + LABEL_FULLSCREEN_ENTER: "Täisekraan (eelvaatega)" + LABEL_VIEW_MESSAGE_ENTER: "Näita kirja (ilma eelvaateta)" + LABEL_SWITCH_TO_MESSAGE: "Vii fookus valitud kirjale" + LABEL_SWITCH_TO_FOLDER_LIST: "Vii fookus kirjade nimekirjale" + LABEL_FULLSCREEN_TOGGLE: "Täisekraani vaate lülitamine" + LABEL_BLOCKQUOTES_TOGGLE: "Tsitaatide lülitamine" + LABEL_THREAD_NEXT: "Järgmine kiri lõimes" + LABEL_THREAD_PREV: "Eelmine kiri lõimes" + LABEL_PRINT: "Prindi" + LABEL_EXIT_FULLSCREEN: "Välju täisekraani vaatest" + LABEL_CLOSE_MESSAGE: "Sulge kiri (ilma eelvaateta)" + LABEL_SWITCH_TO_LIST: "Vii fookus tagasi kirjade nimekirjale" + LABEL_OPEN_COMPOSE_POPUP: "Ava uue kirja hüpikaken" + LABEL_MINIMIZE_COMPOSE_POPUP: "Tee uue kirja aken väikseks" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Ava identiteetide valik" + LABEL_SAVE_MESSAGE: "Salvesta kiri" + LABEL_SEND_MESSAGE: "Saada kiri" + LABEL_CLOSE_COMPOSE: "Sulge kirja koostamise aken" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "Avalikke võtmeid ei leitud" + NO_PUBLIC_KEYS_FOUND_FOR: "Avalikke võtmeid aadressile \"%EMAIL%\" ei leitud" + NO_PRIVATE_KEY_FOUND: "Salajasi võtmeid ei leitud" + NO_PRIVATE_KEY_FOUND_FOR: "Salajast võtit aadressile \"%EMAIL%\" ei leitud" + ADD_A_PUBLICK_KEY: "Lisa avalik võti" + SELECT_A_PRIVATE_KEY: "Lisa privaatne võti" + UNVERIFIRED_SIGNATURE: "Verifitseerimata allkiri" + DECRYPTION_ERROR: "OpenPGP dekrüpteerimise viga" + GOOD_SIGNATURE: "Korralik signatuur kasutajalt %USER%" + PGP_ERROR: "OpenPGP viga: %ERROR%" + SPECIFY_FROM_EMAIL: "Palun määra KELLELT e-posti aadress" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Palun määra vähemalt üks saaja" + NOTIFICATIONS: + INVALID_TOKEN: "Puudulik tõend" + AUTH_ERROR: "Autentimine ebaõnnestus" + ACCESS_ERROR: "Ligipääsu viga" + CONNECTION_ERROR: "Serveriga ühendumine ebaõnnestus" + CAPTCHA_ERROR: "Puudulik CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + See sotsiaalvõrgustiku kasutaja ei ole seotud ühegi e-posti kontoga. Sisene + esmalt e-posti konto andmetega ja seo sotsiaalvõrgustiku konto sellega konto + sätete all. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + See sotsiaalvõrgustiku kasutaja ei ole seotud ühegi e-posti kontoga. Sisene + esmalt e-posti konto andmetega ja seo sotsiaalvõrgustiku konto sellega konto + sätete all. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + See sotsiaalvõrgustiku kasutaja ei ole seotud ühegi e-posti kontoga. Sisene + esmalt e-posti konto andmetega ja seo sotsiaalvõrgustiku konto sellega konto + sätete all. + DOMAIN_NOT_ALLOWED: "Domeenil ei ole lubatud siseneda" + ACCOUNT_NOT_ALLOWED: "Kasutajakontol ei ole lubatud siseneda" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Kahe faktoriga autentimine on kohustuslik" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Kahe faktoriga autentimise viga" + COULD_NOT_SAVE_NEW_PASSWORD: "Uut salasõna ei suudetud salvestada" + CURRENT_PASSWORD_INCORRECT: "Sisestatud kehtiv salasõna oli vale" + NEW_PASSWORD_SHORT: "Salasõna on liiga lühikene" + NEW_PASSWORD_WEAK: "Salasõna on liiga lihtne" + NEW_PASSWORD_FORBIDDENT: "Salasõna sisaldab keelatud märke" + CONTACTS_SYNC_ERROR: "Kontaktide sünkroniseerimise viga" + CANT_GET_MESSAGE_LIST: "Kirjade nimekirja laadimine ebaõnnestus" + CANT_GET_MESSAGE: "Kirja laadimine ebaõnnestus" + CANT_DELETE_MESSAGE: "Kirja kustutamine ebaõnnestus" + CANT_MOVE_MESSAGE: "Kirja liigutamine ebaõnnestus" + CANT_SAVE_MESSAGE: "Kirja salvestamine ebaõnnestus" + CANT_SEND_MESSAGE: "Kirja saatmine ebaõnnestus" + INVALID_RECIPIENTS: "Puudulikud saajad" + CANT_SAVE_FILTERS: "Filtri salvestamine ebaõnnestus" + CANT_GET_FILTERS: "Filtrite laadimine ebaõnnestus" + FILTERS_ARE_NOT_CORRECT: "Filtrid on puudulikud" + CANT_CREATE_FOLDER: "Kausta loomine ebaõnnestus" + CANT_RENAME_FOLDER: "Kausta ümbernimetamine ebaõnnestus" + CANT_DELETE_FOLDER: "Kausta kustutamine ebaõnnestus" + CANT_DELETE_NON_EMPTY_FOLDER: "Kirju sisaldavat kausta pole võimalik kustutada" + CANT_SUBSCRIBE_FOLDER: "Kausta tellimine ebaõnnestus." + CANT_UNSUBSCRIBE_FOLDER: "Kausta tellimisest loobumine ebaõnnestus." + CANT_SAVE_SETTINGS: "Sätete salvestamine ebaõnnestus" + CANT_SAVE_PLUGIN_SETTINGS: "Sätete salvestamine ebaõnnestus" + DOMAIN_ALREADY_EXISTS: "Domeen juba eksisteerib" + CANT_INSTALL_PACKAGE: "Laienduse paigaldamine ebaõnnestus" + CANT_DELETE_PACKAGE: "Laienduse eemaldamine ebaõnnestus" + INVALID_PLUGIN_PACKAGE: "Puudulik laienduse pakk" + UNSUPPORTED_PLUGIN_PACKAGE: "Laienduse pakk pole toetatud" + LICENSING_SERVER_IS_UNAVAILABLE: "Litsentsiserver ei olnud saadaval" + LICENSING_DOMAIN_EXPIRED: "Selle domeeni litents on aegunud" + LICENSING_DOMAIN_BANNED: "Selle domeeni litents on kehtetu" + DEMO_SEND_MESSAGE_ERROR: "Turvalisusega seotud põhjustel ei ole sellel kontol lubatud saata kirju välistele aadressidele!" + DEMO_ACCOUNT_ERROR: "Turvalisusega seotud põhjustel ei ole sellel kontol lubatud soovitud toimingut teostada!" + ACCOUNT_ALREADY_EXISTS: "Konto juba eksisteerib" + ACCOUNT_DOES_NOT_EXIST: "Kontot veel ei eksisteeri" + MAIL_SERVER_ERROR: "E-posti serveri poole pöördumisel tekkis viga" + INVALID_INPUT_ARGUMENT: "Puudulik sisendi arument" + UNKNOWN_ERROR: "Tundmatu viga" + STATIC: + BACK_LINK: "Taaslae" + DOMAIN_LIST_DESC: "Nimekiri domeenidest, mille poole veebipõhisel e-posti kliendil on lubatud pöörduda" + PHP_EXSTENSIONS_ERROR_DESC: "Sinu PHP konfiguratsioon ei sisalda nõutud PHP laiendusi." + PHP_VERSION_ERROR_DESC: "Sinu PHP versioon (%VERSION%) on väiksem, kui minimaalselt nõutud 5.3.0!" + NO_SCRIPT_TITLE: "See rakendus vajab tööks JavaScripti" + NO_SCRIPT_DESC: | + Sinu veebilehitseja ei toeta JavaScripti. + Luba selle kasutus veebilehitseja sätetes ja proovi uuesti. + NO_COOKIE_TITLE: "See rakendus vajab oma tööks veebiküpsiste tuge" + NO_COOKIE_DESC: | + Sinu veebilehitseja ei toeta veebiküpsiseid. + Luba nende kasutus veebilehitseja sätetes ja proovi uuesti. + BAD_BROWSER_TITLE: "Sinu veebilehitseja on aegunud" + BAD_BROWSER_DESC: | + Rakenduse kõikide võimaluste kasutamiseks, + lae alla ja paigalda mõni nendest veebilehitsejatest: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fa_IR.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fa_IR.yml new file mode 100755 index 00000000..76c95e25 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fa_IR.yml @@ -0,0 +1,713 @@ +fa_IR: + LOGIN: + LABEL_EMAIL: "پست الکترونیک" + LABEL_LOGIN: "ورود" + LABEL_PASSWORD: "گذرواژه" + LABEL_SIGN_ME: "مرا به خاطر بسپار" + LABEL_VERIFICATION_CODE: "کد تایید" + LABEL_DONT_ASK_VERIFICATION_CODE: "کد را برای 2 هفته سوال نکن" + BUTTON_SIGN_IN: "ورود" + TITLE_SIGN_IN_GOOGLE: "ورود با گوگل" + TITLE_SIGN_IN_FACEBOOK: "ورود با فیس‌بوک" + TITLE_SIGN_IN_TWITTER: "ورود با توییتر" + LABEL_FORGOT_PASSWORD: "فراموشی گذرواژه" + LABEL_REGISTRATION: "ثبت‌نام" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "ساخت کاربر" + BUTTON_SETTINGS: "تنظیمات" + BUTTON_HELP: "راهنما" + BUTTON_LOGOUT: "خروج" + MOBILE: + BUTTON_MOBILE_VERSION: "نسخه موبایل" + BUTTON_DESKTOP_VERSION: "نسخه رومیزی" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "جستجو" + TITLE_ADV: "جستجوی پیشرفته" + LABEL_ADV_FROM: "از" + LABEL_ADV_TO: "به" + LABEL_ADV_SUBJECT: "موضوع" + LABEL_ADV_TEXT: "متن" + LABEL_ADV_HAS_ATTACHMENT: "داشتن پیوست" + LABEL_ADV_HAS_ATTACHMENTS: "داشتن پیوست‌ها" + LABEL_ADV_FLAGGED: "پرچم" + LABEL_ADV_UNSEEN: "خوانده نشده" + LABEL_ADV_DATE: "تاریخ" + LABEL_ADV_DATE_ALL: "همه" + LABEL_ADV_DATE_3_DAYS: "تا 3 روز گذشته" + LABEL_ADV_DATE_7_DAYS: "تا 1 هفته گذشته" + LABEL_ADV_DATE_MONTH: "تا 1 ماه گذشته" + LABEL_ADV_DATE_3_MONTHS: "تا 3 ماه گذشته" + LABEL_ADV_DATE_6_MONTHS: "تا 6 ماه گذشته" + LABEL_ADV_DATE_YEAR: "تا 1 سال گذشته" + BUTTON_ADV_SEARCH: "جستجو" + PREVIEW_POPUP: + FULLSCREEN: "ضامن تمام صفحه" + ZOOM: "بزرگنمایی داخل/بیرون" + CLOSE: "بستن (Esc)" + LOADING: "در حال بارگذاری" + GALLERY_PREV: "قبلی (جهت چپ)" + GALLERY_NEXT: "بعدی (جهت راست)" + GALLERY_COUNTER: "%curr% از %total%" + IMAGE_ERROR: "تصویر مورد نظر قابل بارگذاری نیست." + AJAX_ERROR: "محتویات مورد نظر قابل بارگذاری نیست." + FOLDER_LIST: + BUTTON_COMPOSE: "ایجاد" + BUTTON_CONTACTS: "تماس‌ها" + BUTTON_NEW_MESSAGE: "پیام جدید" + INBOX_NAME: "صندوق ورودی" + SENT_NAME: "ارسالی‌" + DRAFTS_NAME: "پیش نویس" + SPAM_NAME: "هرزنامه" + TRASH_NAME: "سطل آشغال" + ARCHIVE_NAME: "بایگانی" + QUOTA: + TITLE: "سهمیه استفاده شده" + MESSAGE_LIST: + BUTTON_RELOAD: "بازنگری لیست پیام‌ها" + BUTTON_MOVE_TO: "انتقال به" + BUTTON_DELETE: "حذف" + BUTTON_ARCHIVE: "بایگانی" + BUTTON_SPAM: "هرزنامه" + BUTTON_NOT_SPAM: "هرزنامه نیست" + BUTTON_EMPTY_FOLDER: "پاک کردن شاخه" + BUTTON_MULTY_FORWARD: "ارسال بهمراه پیوست(ها)" + BUTTON_DELETE_WITHOUT_MOVE: "حذف همیشگی" + BUTTON_MORE: "بیشتر" + MENU_SET_SEEN: "علامت‌گذاری به عنوان خوانده شده" + MENU_SET_ALL_SEEN: "علامت‌گذاری همه بعنوان خوانده شده" + MENU_UNSET_SEEN: "علامت‌گذاری به عنوان خوانده نشده" + MENU_SET_FLAG: "پرچم زدن" + MENU_UNSET_FLAG: "حذف پرچم" + MENU_SELECT_ALL: "همه" + MENU_SELECT_NONE: "هیچ‌کدام" + MENU_SELECT_INVERT: "برعکس" + MENU_SELECT_UNSEEN: "نخوانده" + MENU_SELECT_SEEN: "خوانده" + MENU_SELECT_FLAGGED: "پرچم‌دار کردن" + MENU_SELECT_UNFLAGGED: "پرچم‌دار نشده" + EMPTY_LIST: "فهرست خالی" + EMPTY_SEARCH_LIST: "پیامی مطابق جستجوی شما پیدا نشد" + SEARCH_RESULT_FOR: "نتایج جستجو مطابق \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "برگشت به لیست پیام‌ها" + LIST_LOADING: "در حال بارگذاری" + EMPTY_SUBJECT_TEXT: "(بدون موضوع)" + PUT_MESSAGE_HERE: "برای دیدن پیام در این لیست آن را به اینجا بکشید" + TODAY_AT: "امروز در %TIME%" + YESTERDAY_AT: " دیروز در %TIME%" + SEARCH_PLACEHOLDER: "جستجو" + NEW_MESSAGE_NOTIFICATION: "شما تعداد %COUNT% پیام جدید دارید!" + QUOTA_SIZE: "استفاده %SIZE% (%PROC%%) از%LIMIT% برای شما" + MESSAGE: + BUTTON_EDIT: "ویرایش" + BUTTON_BACK: "برگشتن" + BUTTON_CLOSE: "بستن" + BUTTON_DELETE: "حذف" + BUTTON_UNSUBSCRIBE: "خروج از این لیست" + BUTTON_ARCHIVE: "بایگانی" + BUTTON_SPAM: "هرزنامه" + BUTTON_NOT_SPAM: "عدم هرزنامه" + BUTTON_MOVE_TO: "انتقال به" + BUTTON_MORE: "انتقال" + BUTTON_REPLY: "پاسخ" + BUTTON_REPLY_ALL: "پاسخ به همه" + BUTTON_FORWARD: "ارسال به دیگران" + BUTTON_FORWARD_AS_ATTACHMENT: "ارسال بهمراه پیوست" + BUTTON_EDIT_AS_NEW: "ویرایش بعنوان جدید" + BUTTON_SHOW_IMAGES: "نمایش تصاویر خارجی" + BUTTON_NOTIFY_READ_RECEIPT: "فرستنده از خواندن نامه توسط شما مطلع خواهد شد" + BUTTON_IN_NEW_WINDOW: "مشاهده در پنجره جداگانه" + BUTTON_THREAD_LIST: "لیست نخ‌ها" + BUTTON_THREAD_PREV: "قبلی" + BUTTON_THREAD_NEXT: "بعدی" + BUTTON_THREAD_MORE: "پیام‌های بیشتر" + MENU_HEADERS: "نمایش سرصفحه پیام" + MENU_VIEW_ORIGINAL: "نمایش منبع" + MENU_DOWNLOAD_ORIGINAL: "دریافت با پسوند eml." + MENU_FILTER_SIMILAR: " فیلتر کردن پیام‌های مشابه" + MENU_PRINT: "چاپ" + EMPTY_SUBJECT_TEXT: "(بدون موضوع)" + LABEL_SUBJECT: "موضوع" + LABEL_DATE: "تاریخ" + LABEL_FROM: "از" + LABEL_FROM_SHORT: "از" + LABEL_TO: "به" + LABEL_TO_SHORT: "به" + LABEL_CC: "رونوشت" + LABEL_BCC: "رونوشت پنهان" + LABEL_REPLY_TO: "پاسخ به" + PRINT_LABEL_FROM: "از" + PRINT_LABEL_TO: "به" + PRINT_LABEL_CC: "رونوشت" + PRINT_LABEL_BCC: "رونوشت پنهان" + PRINT_LABEL_REPLY_TO: "پاسخ به" + PRINT_LABEL_DATE: "تاریخ" + PRINT_LABEL_SUBJECT: "موضوع" + PRINT_LABEL_ATTACHMENTS: "پیوست‌ها" + MESSAGE_LOADING: "در حال بارگذاری" + MESSAGE_VIEW_DESC: "پیام را در لیست جهت مشاهده انتخاب کنید" + PGP_PASSWORD_INPUT_PLACEHOLDER: "گذرواژه" + PGP_SIGNED_MESSAGE_DESC: "پیام توسط OpenPGP امضاء شد (برای بررسی کلیک کنید)" + PGP_ENCRYPTED_MESSAGE_DESC: "پیام توسط OpenPGP رمزنگاری شد (برای خارج شدن از حالت رمز کلیک کنید)" + LINK_DOWNLOAD_AS_ZIP: "دریافت با پسوند zip" + LINK_SAVE_TO_OWNCLOUD: "ذخیره در OwnCloud" + LINK_SAVE_TO_DROPBOX: "ذخیره در Dropbox" + READ_RECEIPT: + SUBJECT: "برگرداندن گیرنده (نمایش داده شد) - %SUBJECT%" + BODY: | + این پیام برگشت برای نامه‌ای است که شما برای %READ-RECEIPT% ارسال کرده‌اید. + + نکته: این پیام تنها اطلاع‌رسانی در مورد این هست که پیام شما بر روی کامپیوتر گیرنده نمایش داده شده است. + هیچ تضمینی بابت اینکه گیرنده این پیام را خوانده باشد یا درست متوجه شده باشد وجود ندارد. + SUGGESTIONS: + SEARCHING_DESC: "در حال جستجو..." + CONTACTS: + LEGEND_CONTACTS: "تماس‌ها" + SEARCH_INPUT_PLACEHOLDER: "جستجو" + BUTTON_ADD_CONTACT: "اضافه‌کردن تماس" + BUTTON_CREATE_CONTACT: "ایجاد" + BUTTON_UPDATE_CONTACT: "بروزرسانی" + BUTTON_IMPORT: "وارد کردن(csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "صدور (csv, vcf, vCard)" + BUTTON_EXPORT_CSV: "صدور (csv)" + ERROR_IMPORT_FILE: "خطا در وارد کردن (فرمت فایل معتبر نیست)" + LIST_LOADING: "در حال بارگذاری" + EMPTY_LIST: "هیچ تماسی وجود ندارد" + EMPTY_SEARCH: "هیچ تماسی پیدا نشد" + CLEAR_SEARCH: "پاک‌کردن جستجو" + CONTACT_VIEW_DESC: "تماس مورد نظر در لیست را جهت مشاهده، انتخاب کنید." + LABEL_DISPLAY_NAME: "نمایش نام" + LABEL_EMAIL: "آدرس پست الکترونیک" + LABEL_PHONE: "تلفن" + LABEL_WEB: "تارنما" + LABEL_BIRTHDAY: "تاریخ تولد" + LINK_ADD_EMAIL: "اضافه کردن آدرس پست الکترونیک" + LINK_ADD_PHONE: "اضافه کردن تلفن" + LINK_BIRTHDAY: "تاریخ تولد" + PLACEHOLDER_ENTER_DISPLAY_NAME: "ورود نام" + PLACEHOLDER_ENTER_LAST_NAME: "ورود نام خانوادگی" + PLACEHOLDER_ENTER_FIRST_NAME: "ورود نام" + PLACEHOLDER_ENTER_NICK_NAME: "ورود نام مستعار" + LABEL_READ_ONLY: "فقط خواندنی" + LABEL_SHARE: "اشتراک‌گذاری" + ADD_MENU_LABEL: "اضافه‌کردن" + ADD_MENU_NICKNAME: "نام مستعار" + ADD_MENU_NOTES: "یادداشت‌ها" + ADD_MENU_EMAIL: "آدرس پست الکترونیک" + ADD_MENU_PHONE: "تلفن" + ADD_MENU_URL: "تارنما" + ADD_MENU_ADDRESS: "آدرس" + ADD_MENU_BIRTHDAY: "تاریخ تولد" + ADD_MENU_TAGS: "برچسب" + BUTTON_SHARE_NONE: "هیچ‌کدام" + BUTTON_SHARE_ALL: "هرکسی" + BUTTON_SYNC: "همگام‌سازی (CardDAV)" + COMPOSE: + TITLE_FROM: "از" + TITLE_TO: "به" + TITLE_CC: "رونوشت" + TITLE_BCC: "رونوشت پنهان" + TITLE_REPLY_TO: "پاسخ به" + TITLE_SUBJECT: "موضوع" + LINK_SHOW_INPUTS: "نمایش همه فیلدها" + BUTTON_SEND: "فرستادن" + BUTTON_SAVE: "ذخیره کن" + BUTTON_DELETE: "حذف" + BUTTON_CANCEL: "انصراف" + BUTTON_MINIMIZE: "کوچک‌کردن" + SAVED_TIME: "ذخیره شده در %TIME%" + SAVED_ERROR_ON_SEND: "پیام فرستاده شد اما در شاخه ارسالی‌ها ذخیره نشد" + DISCARD_UNSAVED_DATA: "اطلاعات ذخیره نشده از بین برود؟" + ATTACH_FILES: "پیوست کردن فایلها" + ATTACH_DROP_FILES_DESC: "فایل‌ها را اینجا بیاندازید" + ATTACH_ITEM_CANCEL: "انصراف" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "گوگل درایو" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% نوشت" + FORWARD_MESSAGE_TOP_TITLE: "-------- پیام ارسال شده -------" + FORWARD_MESSAGE_TOP_FROM: "از" + FORWARD_MESSAGE_TOP_TO: "به" + FORWARD_MESSAGE_TOP_CC: "رونوشت" + FORWARD_MESSAGE_TOP_SENT: "ارسال" + FORWARD_MESSAGE_TOP_SUBJECT: "موضوع" + EMPTY_TO_ERROR_DESC: "لطفا حداقل یک گیرنده را مشخص نمایید" + NO_ATTACHMENTS_HERE_DESC: "هیچ پیوستی اینجا وجود ندارد." + ATTACHMENTS_ERROR_DESC: "اخطار! همه پیوست‌ها هنوز بارگذاری نشده است." + ATTACHMENTS_UPLOAD_ERROR_DESC: "همه پیوست‌ها هنوز بارگذاری نشده است." + BUTTON_REQUEST_READ_RECEIPT: "درخواست دریافت رسید خواندن" + BUTTON_MARK_AS_IMPORTANT: "علامت زدن به عنوان مهم" + BUTTON_OPEN_PGP: "OpenPGP (فقط متن ساده)" + BUTTON_REQUEST_DSN: "درخواست دریافت رسید تحویل درمقصد" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "بستن" + POPUPS_ASK: + BUTTON_YES: "بلی" + BUTTON_NO: "خیر" + DESC_WANT_CLOSE_THIS_WINDOW: "آیا از بستن این پنجره مطمئن هستید؟" + DESC_WANT_DELETE_MESSAGES: "آیا از حذف این پیام(ها) اطمینان دارید؟" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "زبان خود را انتخاب کنید" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "اضافه کردن کاربر؟" + BUTTON_ADD_ACCOUNT: "اضافه کردن" + TITLE_UPDATE_ACCOUNT: "بروزرسانی کاربر؟" + BUTTON_UPDATE_ACCOUNT: "بروزرسانی" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "اضافه کردن هویت؟" + TITLE_UPDATE_IDENTITY: "بروزرسانی هویت؟" + BUTTON_ADD_IDENTITY: "اضافه‌کردن" + BUTTON_UPDATE_IDENTITY: "بروزرسانی" + LABEL_EMAIL: "پست الکترونیک" + LABEL_NAME: "نام" + LABEL_REPLY_TO: "پاسخ به" + LABEL_SIGNATURE: "امضاء" + LABEL_CC: "رونوشت" + LABEL_BCC: "رونوشت پنهان" + LABEL_SIGNATURE_INSERT_BEFORE: "قراردادن امضاء‌ قبل از متن مشخص شده در جواب" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "یک شاخه ایجاد شود؟" + LABEL_NAME: "نام شاخه" + LABEL_PARENT: "شاخه بالایی" + BUTTON_CREATE: "ایجاد" + BUTTON_CANCEL: "انصراف" + BUTTON_CLOSE: "بستن" + TITLE_CREATING_PROCESS: "ایجاد کردن یک شاخه" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "خالی‌کردن همه پیام‌ها از این شاخه؟" + BUTTON_CLEAR: "پاک کردن" + BUTTON_CANCEL: "انصراف" + BUTTON_CLOSE: "بستن" + DANGER_DESC_WARNING: "اخطار!" + DANGER_DESC_HTML_1: "نتیجه این عمل پاک شدن همه نامه‌ها از شاخه %FOLDER% بطور کامل خواهد بود." + DANGER_DESC_HTML_2: "زمانی که این عملیات شروع شود قابل لغو یا انصراف نیست." + TITLE_CLEARING_PROCESS: "خالی کردن شاخه..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "واردکردن کلید OpenPGP" + BUTTON_IMPORT_OPEN_PGP_KEY: "وارد‌کردن" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "مشاهده کلید OpenGPG" + BUTTON_SELECT: "انتخاب" + BUTTON_CLOSE: "بستن" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "تولید کلید‌های OpenPGP" + LABEL_EMAIL: "پست الکترونیک" + LABEL_NAME: "نام" + LABEL_PASSWORD: "گذرواژه" + LABEL_KEY_BIT_LENGTH: "طول کلید" + BUTTON_GENERATE_OPEN_PGP_KEYS: "تولید" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "امضاء/رمزنگاری OpenPGP" + LABEL_SIGN: "امضاء" + LABEL_ENCRYPT: "رمزنگاری" + LABEL_PASSWORD: "گذرواژه" + BUTTON_SIGN: "امضاء" + BUTTON_ENCRYPT: "رمزنگاری" + BUTTON_SIGN_AND_ENCRYPT: "امضاء و رمزنگاری" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "رمزگشایی OpenPGP" + LABEL_KEY: "کلید خصوصی" + LABEL_PASSWORD: "گذرواژه" + BUTTON_DECRYPT: "رمزگشایی" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "تست اعتبارسنجی دو مرحله‌ای" + LABEL_CODE: "سورس" + BUTTON_TEST: "تست" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "یک فیلتر ایجاد شود؟" + TITLE_EDIT_FILTER: "بروزرسانی فیلتر؟" + FILTER_NAME: "نام" + LEGEND_CONDITIONS: "شرایط" + LEGEND_ACTIONS: "عملیات" + BUTTON_DONE: "انجام شد" + BUTTON_ADD_CONDITION: "اضافه کردن یک شرط" + SELECT_ACTION_NONE: "هیچ‌کدام" + SELECT_ACTION_MOVE_TO: "انتقال به" + SELECT_ACTION_FORWARD_TO: "ارسال به" + SELECT_ACTION_REJECT: "رد کردن" + SELECT_ACTION_VACATION_MESSAGE: "پیام تعطیلات" + SELECT_ACTION_DISCARD: "دور انداختن" + SELECT_FIELD_FROM: "از" + SELECT_FIELD_RECIPIENTS: "گیرندگان (به یا رونوشت)" + SELECT_FIELD_SUBJECT: "موضوع" + SELECT_FIELD_HEADER: "سرصفحه" + SELECT_FIELD_SIZE: "اندازه" + SELECT_TYPE_CONTAINS: "شامل" + SELECT_TYPE_NOT_CONTAINS: "شامل نبودن" + SELECT_TYPE_MATCHES: "تطابق (* و ? پشتیبانی می‌شود)" + SELECT_TYPE_NOT_MATCHES: "عدم تطابق (* و ? پشتیبانی می‌شود)" + SELECT_TYPE_REGEXP: "عبارت منظم" + SELECT_TYPE_NOT_REGEXP: "عدم عبارت منظم" + SELECT_TYPE_EQUAL_TO: "برابر" + SELECT_TYPE_NOT_EQUAL_TO: "برابر نیست" + SELECT_TYPE_OVER: "بالاتر" + SELECT_TYPE_UNDER: "پایینتر" + SELECT_MATCH_ANY: "مطابقت با هر یک از قوانین روبرو" + SELECT_MATCH_ALL: "مطابق با همه قوانین روبرو" + MARK_AS_READ_LABEL: "علامت بعنوان خوانده شده" + REPLY_INTERVAL_LABEL: "دوره جواب (بر پایه روز)" + KEEP_LABEL: "نگه‌داشتن" + STOP_LABEL: "پردازش قوانین را متوقف نکن" + EMAIL_LABEL: "پست الکترونیک" + VACATION_SUBJECT_LABEL: "موضوع (اختیاری)" + VACATION_MESSAGE_LABEL: "پیام" + VACATION_RECIPIENTS_LABEL: "گیرندگان (جداسازی با , )" + REJECT_MESSAGE_LABEL: "برگشت زدن پیام" + ALL_INCOMING_MESSAGES_DESC: "همه پیام‌های ورودی" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "انتخاب شاخه سیستمی" + SELECT_CHOOSE_ONE: "یکی را انتخاب کنید" + SELECT_UNUSE_NAME: "استفاده نکنید" + LABEL_SENT: "ارسالی" + LABEL_DRAFTS: "پیش‌نویس‌ها" + LABEL_SPAM: "هرزنامه" + LABEL_TRASH: "سطل آشغال" + LABEL_ARCHIVE: "بایگانی" + BUTTON_CANCEL: "انصراف" + BUTTON_CLOSE: "بستن" + NOTIFICATION_SENT: | + شما پوشه سیستمی "ارسالی" را برای قرار گرفتن پیام‌ها در داخل آن، پس از ارسال را انتخاب نکرده‌اید. + اگر شما نمی‌خواهید که پیام‌های ارسالی شما ذخیره شود، لطفا گزینه "استفاده نکن" را انتخاب کنید. + NOTIFICATION_DRAFTS: "شما پوشه سیستمی \"پیش‌نویس‌ها\" را برای ذخیره پیام در زمانی که در حال ایجاد ایمیل جدید هستید را انتخاب نکرده‌اید." + NOTIFICATION_SPAM: | + شما پوشه سیستمی "هرزنامه‌" را جهت قرارگرفتن پیام‌های هرزنامه‌ای انتخاب نکرده‌اید. + اگر شما می‌خواهید که پیام‌ها بصورت همیشگی حذف شوند، لطفا گزینه "استفاده نکن" را انتخاب کنید. + NOTIFICATION_TRASH: | + شما پوشه سیستمی "سطل آشغال" را برای قرارگرفتن پیام‌های حذف شده انتخاب نکرده‌اید. + اگر شما می‌خواهید پیام‌ها بصورت همیشگی حذف شوند، لطفا گزینه "استفاده نکن" را انتخاب کنید. + NOTIFICATION_ARCHIVE: "شما پوشه سیستمی \"بایگانی\" را جهت قرارگرفتن پیام‌های بایگانی‌شده انتخاب نکرده‌اید." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "اعتبارسنجی 2 مرحله‌ای (TOTP)" + LABEL_ENABLE_TWO_FACTOR: "فعال‌سازی اعتبار‌سنجی دو مرحله‌ای" + LABEL_TWO_FACTOR_USER: "کاربر" + LABEL_TWO_FACTOR_STATUS: "وضعیت" + LABEL_TWO_FACTOR_SECRET: "رمز" + LABEL_TWO_FACTOR_BACKUP_CODES: "پشتیبان‌گیری از سورس" + BUTTON_CREATE: "ایجاد یک رمز" + BUTTON_ACTIVATE: "فعال‌کردن" + BUTTON_CLEAR: "پاک‌کردن" + BUTTON_LOGOUT: "خروج" + BUTTON_DONE: "انجام شد" + BUTTON_TEST: "تست" + LINK_TEST: "تست" + BUTTON_SHOW_SECRET: "نمایش رمز" + BUTTON_HIDE_SECRET: "مخفی کردن رمز" + TWO_FACTOR_REQUIRE_DESC: "کاربر شما به پیکربندی اعتبار‌سنجی دو مرحله‌ای نیاز دارد." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "پیکربندی شده" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "عدم پیکربندی" + TWO_FACTOR_SECRET_DESC: > + این اطلاعات را به کلاینت احراز هویت کننده گوگل (یا کلاینتهای TOTP دیگر) توسط + کد QR یا با وارد کردن دستی کد، وارد کنید. + TWO_FACTOR_BACKUP_CODES_DESC: > + اگر شما نمی‌توانید کد‌ها را توسط احرازهویت کننده گوگل (یا کلاینت‌های TOTP + دیگر) دریافت کنید، شما می‌تونید از کد‌های پشتیبان برای ورود استفاده کنید. + بعد از اینکه شما از کد‌ پشتیبان جهت ورود استفاده کردید، غیر فعال خواهد شد. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "شما نمی‌توانید قبل از تست این تنظیمات را تغییر دهید." + TITLES: + LOADING: "در حال بارگذاری" + LOGIN: "ورود" + MAILBOX: "صندوق پست الکترونیک" + SETTINGS: "تنظیمات" + COMPOSE: "ایجاد" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "اندازه فایل بیش از حد بزرگ است" + ERROR_FILE_PARTIALLY_UPLOADED: "قسمتی از فایل به دلیل خطای مشخص فقط بارگذاری شد" + ERROR_NO_FILE_UPLOADED: "هیچ فایل بارگذاری نشده است" + ERROR_MISSING_TEMP_FOLDER: "فایل موقتی از دست رفته است" + ERROR_ON_SAVING_FILE: "یک خطای نامشخص در بارگذاری فایل روی داده است" + ERROR_FILE_TYPE: "نوع فایل نامعتبر است" + ERROR_UNKNOWN: "یک خطای نامشخص در بارگذاری فایل روی داده است" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" + TEXT_SWITCHER_RICH_FORMATTING: "قالب‌بندی پیشرفته" + TEXT_SWITCHER_CONFIRM: "قالب‌بندی متن و تصاویر از بین خواهد رفت. آیا برای ادامه دادن اطمینان دارید؟" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "شخصی" + LABEL_GENERAL_NAME: "عمومی" + LABEL_CONTACTS_NAME: "تماس‌ها" + LABEL_FOLDERS_NAME: "پوشه‌ها" + LABEL_ACCOUNTS_NAME: "حساب‌های کاربری" + LABEL_IDENTITY_NAME: "شناسه" + LABEL_IDENTITIES_NAME: "شناسه‌ها" + LABEL_FILTERS_NAME: "فیلترها" + LABEL_TEMPLATES_NAME: "قالب‌ها" + LABEL_SECURITY_NAME: "امنیت" + LABEL_SOCIAL_NAME: "اجتماعی" + LABEL_THEMES_NAME: "پوسته‌ها" + LABEL_CHANGE_PASSWORD_NAME: "گذرواژه" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "برگشت" + SETTINGS_FILTERS: + LEGEND_FILTERS: "فیلترها" + BUTTON_SAVE: "ذخیره" + BUTTON_ADD_FILTER: "اضافه کردن یک فیلتر" + BUTTON_DELETE: "حذف" + BUTTON_RAW_SCRIPT: "استفاده از اسکریپت سفارشی‌سازی شده کاربر" + SUBNAME_NONE: "هیچ‌کدام" + SUBNAME_MOVE_TO: "انتقال به \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "ارسال به \"%EMAIL%\"" + SUBNAME_REJECT: "برگشت‌زدن" + SUBNAME_VACATION_MESSAGE: "پیام تعطیلات" + SUBNAME_DISCARD: "دور انداختن" + CAPABILITY_LABEL: "قابلیت" + LOADING_PROCESS: "بروزرسانی لیست فیلتر" + DELETING_ASK: "اطمینان دارید؟" + CHACHES_NEED_TO_BE_SAVED_DESC: "این تغییرات نیازمند ذخیره شدن بر روی سرور هستند." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "شناسه" + LABEL_DISPLAY_NAME: "نام" + LABEL_REPLY_TO: "پاسخ به" + LABEL_SIGNATURE: "امضاء" + LABEL_ADD_SIGNATURE_TO_ALL: "اضافه کردن امضاء شما به تمام پیام‌های خروجی" + SETTINGS_SECURITY: + LEGEND_SECURITY: "امنیت" + LABEL_CONFIGURE_TWO_FACTOR: "تنظیم اعتبار‌سنجی دو مرحله‌ای" + LABEL_AUTOLOGOUT: "خروج خودکار" + AUTOLOGIN_NEVER_OPTION_NAME: "هرگز" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% دقیقه(ها)" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% ساعت‌(ها)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "عمومی" + LABEL_LANGUAGE: "زبان" + LABEL_IDENTITY: "شناسه" + LABEL_LAYOUT: "لایه" + LABEL_LAYOUT_NO_SPLIT: "بدون تقسیم" + LABEL_LAYOUT_VERTICAL_SPLIT: "تقسیم عمودی" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "تقسیم افقی" + LABEL_EDITOR: "ویرایشگر پیش‌فرض" + LABEL_EDITOR_HTML: "تحت فرمت Html" + LABEL_EDITOR_PLAIN: "ساده" + LABEL_EDITOR_HTML_FORCED: "Html (اجباری)" + LABEL_EDITOR_PLAIN_FORCED: "Plain (اجباری)" + LABEL_ANIMATION: "انیمیشن رابط کاربری" + LABEL_ANIMATION_FULL: "تمام" + LABEL_ANIMATION_NORMAL: "عادی" + LABEL_ANIMATION_NONE: "هیچ‌کدام" + LABEL_VIEW_OPTIONS: "مشاهده گزینه‌ها" + LABEL_USE_PREVIEW_PANE: "استفاده از پنجره پیش‌نمایش" + LABEL_USE_CHECKBOXES_IN_LIST: "نمایش چک‌باکس در لیست" + LABEL_USE_THREADS: "استفاده از حالت موضوعی" + LABEL_REPLY_SAME_FOLDER: " جوابها را در پوشه‌ای که پیامها در آن جواب داده شده است قراردهید" + LABEL_SHOW_IMAGES: "همیشه تصاویر بیرونی را در بدنه پیام‌ها نشان بده" + LABEL_SHOW_ANIMATION: "نمایش انیمیشن" + LABEL_MESSAGE_PER_PAGE: "پیام‌ها در صفحه" + LABEL_NOTIFICATIONS: "اطلاعیه‌ها" + LABEL_SOUND_NOTIFICATION: "آگاه‌سازی با صدا" + LABEL_CHROME_NOTIFICATION_DESC: "پنجره اعلان دریافت پیام جدید را نمایش بده" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(مسدود شده توسط مرورگر)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "تماس‌ها" + LABEL_CONTACTS_AUTOSAVE: "اطلاعات تماس گیرندگان را بصورت خودکار در آدرس‌بوک ذخیره کن" + LEGEND_CONTACTS_SYNC: "همگام‌سازی از راه دور (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "فعال‌سازی همگام‌سازی از راه دور" + LABEL_CONTACTS_SYNC_SERVER: "سرور" + LABEL_CONTACTS_SYNC_AB_URL: "تارنمای آدرس‌بوک" + LABEL_CONTACTS_SYNC_USER: "کاربر" + LABEL_CONTACTS_SYNC_PASSWORD: "گذرواژه" + SETTINGS_THEMES: + LEGEND_THEMES: "پوسته‌ها" + LEGEND_THEMES_CUSTOM: "پیکربندی سفارشی پوسته" + LABEL_CUSTOM_TYPE: "نوع" + LABEL_CUSTOM_TYPE_LIGHT: "روشن" + LABEL_CUSTOM_TYPE_DARK: "تیره" + LABEL_CUSTOM_BACKGROUND_IMAGE: "پشت زمینه" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "بارگذاری تصاویر پشت زمینه (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "اندازه فایل بیش از حد بزرگ است" + ERROR_FILE_TYPE_ERROR: "نوع فایل نامعتبر (فقط PNG و JPG)" + ERROR_UNKNOWN: "یک خطای نامشخص در بارگذاری فایل روی داده است" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "گوگل" + BUTTON_GOOGLE_CONNECT: "اتصال به گوگل" + BUTTON_GOOGLE_DISCONNECT: "قطع اتصال از گوگل" + MAIN_GOOGLE_DESC: "بعد از فعال‌سازی ورود با گوگل، شما می‌توانید به این حساب کاربری توسط دکمه Google بر روی صفحه ورود متصل شوید." + LEGEND_FACEBOOK: "فیس‌بوک" + BUTTON_FACEBOOK_CONNECT: "اتصال به فیس‌بوک" + BUTTON_FACEBOOK_DISCONNECT: "قطع اتصال از فیس‌بوک" + MAIN_FACEBOOK_DESC: "بعد از فعال‌سازی ورود با فیس‌بوک، شما می‌توانید به این حساب کاربری توسط دکمه Facebook بر روی صفحه ورود متصل شوید." + LEGEND_TWITTER: "توییتر" + BUTTON_TWITTER_CONNECT: "اتصال به توییتر" + BUTTON_TWITTER_DISCONNECT: "قطع اتصال از توییتر" + MAIN_TWITTER_DESC: "بعد از فعال‌سازی ورود با توییتر، شما می‌توانید به این حساب کاربری توسط دکمه Twitter بر روی صفحه ورود متصل شوید." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "لیست پوشه‌ها" + BUTTON_CREATE: "ایجاد پوشه" + BUTTON_SYSTEM: "پوشه‌های سیستم" + BUTTON_DELETE: "حذف" + BUTTON_SUBSCRIBE: "اشتراک" + BUTTON_UNSUBSCRIBE: "قطع اشتراک" + LOADING_PROCESS: "بروزرسانی لیست پوشه‌ها" + CREATING_PROCESS: "در حال ایجاد یک پوشه" + DELETING_PROCESS: "در حال حذف یک پوشه" + RENAMING_PROCESS: "تغییر نام یک پوشه" + DELETING_ASK: "اطمینان دارید؟" + TO_MANY_FOLDERS_DESC_1: "شما پوشه‌های خیلی زیادی دارید!" + TO_MANY_FOLDERS_DESC_2: "جهت جلوگیری از کاهش کارایی سیستم، ما فقط قسمتی از آنها را به شما نشان می‌دهیم." + HELP_DELETE_FOLDER: "حذف پوشه" + HELP_SHOW_HIDE_FOLDER: "نمایش/مخفی‌بودن پوشه" + HELP_CHECK_FOR_NEW_MESSAGES: "بررسی/عدم‌بررسی برای پیام جدید" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "حساب‌های کاربری" + LEGEND_IDENTITIES: "شناسه‌ها" + LEGEND_ACCOUNTS_AND_IDENTITIES: "حساب‌های کاربری و شناسه‌ها" + BUTTON_ADD_ACCOUNT: "اضافه کردن یک حساب کاربری" + BUTTON_ADD_IDENTITY: "اضافه کردن یک شناسه" + BUTTON_DELETE: "حذف" + LOADING_PROCESS: "بروزرسانی..." + DELETING_ASK: "اطمینان دارید؟" + DEFAULT_IDENTITY_LABEL: "پیش‌فرض" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "شناسه" + LEGEND_IDENTITIES: "شناسه‌های اضافی‌" + LABEL_DEFAULT: "پیش‌فرض" + LABEL_DISPLAY_NAME: "نام" + LABEL_REPLY_TO: "پاسخ به" + LABEL_SIGNATURE: "امضاء" + LABEL_ADD_SIGNATURE_TO_ALL: "اضافه کردن امضاء شما به تمام پیام‌های خروجی" + BUTTON_ADD_IDENTITY: "اضافه کردن شناسه" + BUTTON_DELETE: "حذف" + LOADING_PROCESS: "بروزرسانی لیست شناسه‌ها" + DELETING_ASK: "اطمینان دارید؟" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "تغییر گذرواژه" + LABEL_CURRENT_PASSWORD: "گذرواژه فعلی" + LABEL_NEW_PASSWORD: "گذرواژه جدید" + LABEL_REPEAT_PASSWORD: "تکرار گذرواژه جدید" + BUTTON_UPDATE_PASSWORD: "ثبت گذرواژه جدید" + ERROR_PASSWORD_MISMATCH: "گذرواژه‌های وارد شده یکسان نیست، مجددا تلاش کنید." + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "وارد کردن کلید OpenPGP" + BUTTON_GENERATE_OPEN_PGP_KEYS: "تولید کلیدهای OpenPGP" + TITLE_PRIVATE: "خصوصی" + TITLE_PUBLIC: "عمومی" + DELETING_ASK: "اطمینان دارید؟" + GENERATE_ONLY_HTTPS: "تنها HTTPS" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "راهنمای میانبر‌های کیبرد" + TAB_MAILBOX: "صندوق پستی" + TAB_MESSAGE_LIST: "لیست پیام" + TAB_MESSAGE_VIEW: "مشاهده پیام" + TAB_COMPOSE: "ایجاد" + LABEL_OPEN_USER_DROPDOWN: "قسمت کرکره‌ای کاربر را باز کنید" + LABEL_REPLY: "پاسخ" + LABEL_REPLY_ALL: "پاسخ به همه" + LABEL_FORWARD: "ارسال به دیگران" + LABEL_FORWARD_MULTIPLY: "ارسال بصورت پیوست(ها)" + LABEL_HELP: "راهنما" + LABEL_CHECK_ALL: "انتخاب همه پیام‌ها" + LABEL_ARCHIVE: "بایگانی" + LABEL_DELETE: "حذف" + LABEL_OPEN_THREAD: "باز کردن موضوع انتخاب شده" + LABEL_MOVE: "انتقال" + LABEL_READ: "خواندن پیام‌های انتخاب شده" + LABEL_UNREAD: "عدم خواندن پیام‌های انتخاب شده" + LABEL_IMPORTANT: "مهم، پرچم‌دار شدن پیام‌های انتخاب شده" + LABEL_SEARCH: "جستجو" + LABEL_CANCEL_SEARCH: "لغو جستجو" + LABEL_FULLSCREEN_ENTER: "تمام صفحه (لایه پنجره پیش‌نمایش)" + LABEL_VIEW_MESSAGE_ENTER: "مشاهده پیام (بدون پنجره پیش‌نمایش)" + LABEL_SWITCH_TO_MESSAGE: "تغییر تمرکز به پیام انتخاب شده" + LABEL_SWITCH_TO_FOLDER_LIST: "تغییر تمرکز به لیست پوشه‌ها" + LABEL_FULLSCREEN_TOGGLE: "ضامن حالت تمام صفحه" + LABEL_BLOCKQUOTES_TOGGLE: "ضامن نقل‌قولهای پیام" + LABEL_THREAD_NEXT: "پیام بعدی در موضوع" + LABEL_THREAD_PREV: "پیام قبلی در موضوع" + LABEL_PRINT: "چاپ" + LABEL_EXIT_FULLSCREEN: "خروج از حالت تمام صفحه" + LABEL_CLOSE_MESSAGE: "بستن پیام (بدون لایه پنجره پیش‌نمایش)" + LABEL_SWITCH_TO_LIST: "برگشت به لیست پیام‌ها" + LABEL_OPEN_COMPOSE_POPUP: "بازکردن صفحه ایجاد" + LABEL_MINIMIZE_COMPOSE_POPUP: "کوچک‌سازی پنجره ایجاد" + LABEL_OPEN_IDENTITIES_DROPDOWN: "لیست کرکره‌ای شناسه‌ها را باز کنید" + LABEL_SAVE_MESSAGE: "ذخیره پیام" + LABEL_SEND_MESSAGE: "فرستادن پیام" + LABEL_CLOSE_COMPOSE: "بستن صفحه ایجاد" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "کلید عمومی پیدا نشد" + NO_PUBLIC_KEYS_FOUND_FOR: "هیچ کلید عمومی برای آدرس پست الکترونیک \"%EMAIL%\" پیدا نشد" + NO_PRIVATE_KEY_FOUND: "هیچ کلید خصوصی پیدا نشد" + NO_PRIVATE_KEY_FOUND_FOR: "هیچ کلید خصوصی برای آدرس پست الکترونیک \"%EMAIL%\" پیدا نشد" + ADD_A_PUBLICK_KEY: "اضافه کردن کلید عمومی" + SELECT_A_PRIVATE_KEY: "انتخاب کلید خصوصی" + UNVERIFIRED_SIGNATURE: "امضای تایید نشده" + DECRYPTION_ERROR: "خطای رمزگشایی در OpenPGP" + GOOD_SIGNATURE: "امضای صحیح از %USER%" + PGP_ERROR: "خطای OpenPGP: %ERROR%" + SPECIFY_FROM_EMAIL: "لطفا قسمت FROM را مشخص نمایید" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "لطفا حداقل یک گیرنده را مشخص نمایید" + NOTIFICATIONS: + INVALID_TOKEN: "توکن نامعتبر" + AUTH_ERROR: "احراز هویت با موفقیت همراه نبود" + ACCESS_ERROR: "خطای دسترسی" + CONNECTION_ERROR: "عدم اتصال به سرور" + CAPTCHA_ERROR: "تصویر امنیتی اشتباه هست" + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + این شناسه اجتماعی برای هیچ کاربر پست الکترونیکی تاکنون تخصیص داده نشده است. + با استفاده از اعتبار کاربر پست الکترونیک خود وارد شوید و سپس این ویژگی را + در تنظیمات کاربر خود فعال کنید. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + این شناسه اجتماعی برای هیچ کاربر پست الکترونیکی تاکنون تخصیص داده نشده است. + با استفاده از اعتبار کاربر پست الکترونیک خود وارد شوید و سپس این ویژگی را + در تنظیمات کاربر خود فعال کنید. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + این شناسه اجتماعی برای هیچ کاربر پست الکترونیکی تاکنون تخصیص داده نشده است. + با استفاده از اعتبار کاربر پست الکترونیک خود وارد شوید و سپس این ویژگی را + در تنظیمات کاربر خود فعال کنید. + DOMAIN_NOT_ALLOWED: "به دامنه اجازه داده نشده است" + ACCOUNT_NOT_ALLOWED: "به حساب کاربری اجازه داده نشده است" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "اعتبار‌سنجی دو مرحله‌ای مورد نیاز است" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "خطای تایید اعتبار سنجی دو مرحله‌ای" + COULD_NOT_SAVE_NEW_PASSWORD: "عدم امکان ذخیره گذرواژه جدید" + CURRENT_PASSWORD_INCORRECT: "گذرواژه فعلی شما اشتباه است" + NEW_PASSWORD_SHORT: "گذرواژه شما بسیار کوتاه است" + NEW_PASSWORD_WEAK: "گذرواژه بسیار ساده است" + NEW_PASSWORD_FORBIDDENT: "گذرواژه شامل کاراکترهای غیرمجاز است" + CONTACTS_SYNC_ERROR: "همگام‌سازی تماس‌ها با خطا همراه بود" + CANT_GET_MESSAGE_LIST: "امکان دریافت لیست پیام‌ها نیست" + CANT_GET_MESSAGE: "امکان دریافت پیام نیست" + CANT_DELETE_MESSAGE: "امکان حذف پیام نیست" + CANT_MOVE_MESSAGE: "امکان انتقال پیام نیست" + CANT_SAVE_MESSAGE: "امکان ذخیره پیام نیست" + CANT_SEND_MESSAGE: "امکان ارسال پیام نیست" + INVALID_RECIPIENTS: "گیرنده نامعتبر" + CANT_SAVE_FILTERS: "امکان ذخیره فیلترها نیست" + CANT_GET_FILTERS: "امکان دریافت فیلترها نیست" + FILTERS_ARE_NOT_CORRECT: "فیلترها صحیح نیستند" + CANT_CREATE_FOLDER: "امکان ایجاد شاخه وجود ندارد" + CANT_RENAME_FOLDER: "امکان تغییر نام شاخه نیست" + CANT_DELETE_FOLDER: "امکان حذف شاخه نیست" + CANT_DELETE_NON_EMPTY_FOLDER: "امکان حذف شاخه‌ای که خالی نیست وجود ندارد" + CANT_SUBSCRIBE_FOLDER: "امکان اشتراک شاخه نیست" + CANT_UNSUBSCRIBE_FOLDER: "امکان عدم اشتراک شاخه نیست" + CANT_SAVE_SETTINGS: "امکان ذخیره تنظیمات نیست" + CANT_SAVE_PLUGIN_SETTINGS: "امکان ذخیره تنظیمات نیست" + DOMAIN_ALREADY_EXISTS: "دامنه در حال حاضر موجود است" + CANT_INSTALL_PACKAGE: "نصب بسته با خطا همراه بود" + CANT_DELETE_PACKAGE: "حذف بسته با خطا همراه بو" + INVALID_PLUGIN_PACKAGE: "بسته افزونه نامعتبر است" + UNSUPPORTED_PLUGIN_PACKAGE: "بسته افزونه پشتیبانی نمی‌شود" + LICENSING_SERVER_IS_UNAVAILABLE: "سرور مشترک شدن در دسترس نیست" + LICENSING_DOMAIN_EXPIRED: "اشتراک برای این دامنه منقضی شده است" + LICENSING_DOMAIN_BANNED: "اشتراک برای این دامنه مسدود شده است" + DEMO_SEND_MESSAGE_ERROR: "بنابر اهداف امنیتی، این کاربر اجازه ارسال ایمیل به یک ایمیل خارج از دامنه را ندارد!" + DEMO_ACCOUNT_ERROR: "بنابر اهداف امنیتی، این کاربر اجازه انجام این عملیات را ندارد!" + ACCOUNT_ALREADY_EXISTS: "کاربر وجود دارد" + ACCOUNT_DOES_NOT_EXIST: "کاربر وجود ندارد" + MAIL_SERVER_ERROR: "یک خطا در زمان دسترسی به سرویس پست الکترونیک رخ داد" + INVALID_INPUT_ARGUMENT: "پارامترهای ورودی نامعتبر" + UNKNOWN_ERROR: "خطای نامشخص" + STATIC: + BACK_LINK: "بارگذاری مجدد" + DOMAIN_LIST_DESC: "لیستی از دامنه‌های وب‌میل که برای دسترسی مجاز است." + PHP_EXSTENSIONS_ERROR_DESC: "به یک افزونه PHP نیاز دارد که در تنظیمات مربوط به PHP شما وجود ندارد!" + PHP_VERSION_ERROR_DESC: "نسخه PHP شما (%VERSION%) کمتر از حداقل نسخه مورد انتظار 5.3.0 هست!" + NO_SCRIPT_TITLE: "جاوا‌اسکریپت برای این برنامه مورد نیاز است." + NO_SCRIPT_DESC: | + پشتیبانی از جاوااسکریپت در مرورگر شما وجود ندارد. + لطفا پشتیبانی از جاوا‌اسکریپت را در تنظیمات مرورگر خود فعال کنید و مجددا تلاش کنید. + NO_COOKIE_TITLE: "Cookie باید بر روی مرورگر شما جهت استفاده از برنامه فعال باشد." + NO_COOKIE_DESC: | + پشتیبانی از Cookie در مرورگر شما فعال نیست. + لطفا Cookie را در تنظیمات مرورگر خود فعال کنید و مجددا تلاش کنید. + BAD_BROWSER_TITLE: "نسخه مرورگر شما قدیمی است." + BAD_BROWSER_DESC: | + برای استفاده از تمام قابلیتهای برنامه، + یکی از مرورگرهای زیر را دریافت و نصب کنید. diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fi_FI.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fi_FI.yml new file mode 100755 index 00000000..02abf710 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fi_FI.yml @@ -0,0 +1,708 @@ +fi_FI: + LOGIN: + LABEL_EMAIL: "Sähköpostisi" + LABEL_LOGIN: "Tunnus" + LABEL_PASSWORD: "Salasana" + LABEL_SIGN_ME: "Muista minut" + LABEL_VERIFICATION_CODE: "Vahvistuskoodi" + LABEL_DONT_ASK_VERIFICATION_CODE: "Älä kysy koodia 2 viikkoon" + BUTTON_SIGN_IN: "Kirjaudu" + TITLE_SIGN_IN_GOOGLE: "Kirjaudu käyttäen Googlea" + TITLE_SIGN_IN_FACEBOOK: "Kirjaudu käyttäen Facebookia" + TITLE_SIGN_IN_TWITTER: "Kirjaudu käyttäen Twitteriä" + LABEL_FORGOT_PASSWORD: "Unohdin salasanani" + LABEL_REGISTRATION: "Rekisteröidy" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Lisää tili" + BUTTON_SETTINGS: "Asetukset" + BUTTON_HELP: "Ohje" + BUTTON_LOGOUT: "Kirjaudu ulos" + MOBILE: + BUTTON_MOBILE_VERSION: "Mobiiliversio" + BUTTON_DESKTOP_VERSION: "Työpöytäversio" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Haku" + TITLE_ADV: "Tarkka haku" + LABEL_ADV_FROM: "Läh." + LABEL_ADV_TO: "Vast. ott." + LABEL_ADV_SUBJECT: "Aihe" + LABEL_ADV_TEXT: "Teksti" + LABEL_ADV_HAS_ATTACHMENT: "Sisältää liitteen" + LABEL_ADV_HAS_ATTACHMENTS: "Sisältää liitteitä" + LABEL_ADV_FLAGGED: "Merkitty" + LABEL_ADV_UNSEEN: "Ei luettu" + LABEL_ADV_DATE: "Pvm" + LABEL_ADV_DATE_ALL: "Kaikki" + LABEL_ADV_DATE_3_DAYS: "3 päivän ajalta" + LABEL_ADV_DATE_7_DAYS: "1 viikon ajalta" + LABEL_ADV_DATE_MONTH: "1 kk ajalta" + LABEL_ADV_DATE_3_MONTHS: "3 kk ajalta" + LABEL_ADV_DATE_6_MONTHS: "6 kk ajalta" + LABEL_ADV_DATE_YEAR: "1 vuoden ajalta" + BUTTON_ADV_SEARCH: "Hae" + PREVIEW_POPUP: + FULLSCREEN: "Koko ruutu" + ZOOM: "Zoomaa" + CLOSE: "Sulje (Esc)" + LOADING: "Lataa..." + GALLERY_PREV: "Edellinen (nuoli vasemmalle)" + GALLERY_NEXT: "Seuraava (nuoli oikealle)" + GALLERY_COUNTER: "%curr% %total% sta" + IMAGE_ERROR: "Kuvaa ei voitu ladata." + AJAX_ERROR: "Sisältöä ei voitu ladata." + FOLDER_LIST: + BUTTON_COMPOSE: "Luo" + BUTTON_CONTACTS: "Yhteystiedot" + BUTTON_NEW_MESSAGE: "Uusi viesti" + INBOX_NAME: "Postilaatikko" + SENT_NAME: "Lähetetyt" + DRAFTS_NAME: "Luonnokset" + SPAM_NAME: "Roskaposti" + TRASH_NAME: "Roskakori" + ARCHIVE_NAME: "Arkisto" + QUOTA: + TITLE: "Kiintiö" + MESSAGE_LIST: + BUTTON_RELOAD: "Päivitä viestit" + BUTTON_MOVE_TO: "Siirrä" + BUTTON_DELETE: "Poista" + BUTTON_ARCHIVE: "Arkistoi" + BUTTON_SPAM: "Merkitse roskapostiksi" + BUTTON_NOT_SPAM: "Ei roskapostia" + BUTTON_EMPTY_FOLDER: "Tyhjennä kansio" + BUTTON_MULTY_FORWARD: "Välitä liitteenä" + BUTTON_DELETE_WITHOUT_MOVE: "Poista lopullisesti" + BUTTON_MORE: "Lisää" + MENU_SET_SEEN: "Merkitse luetuksi" + MENU_SET_ALL_SEEN: "Merkitse kaikki luetuksi" + MENU_UNSET_SEEN: "Merkitse lukemattomaksi" + MENU_SET_FLAG: "Merkkaa" + MENU_UNSET_FLAG: "Poista merkki" + MENU_SELECT_ALL: "Kaikki" + MENU_SELECT_NONE: "Ei mitään" + MENU_SELECT_INVERT: "Vaihda valinta" + MENU_SELECT_UNSEEN: "Lukemattomat" + MENU_SELECT_SEEN: "Luetut" + MENU_SELECT_FLAGGED: "Merkityt" + MENU_SELECT_UNFLAGGED: "Merkkaamattomat" + EMPTY_LIST: "Tyhjennä lista" + EMPTY_SEARCH_LIST: "Yhtään viestiä ei löytynyt ehdoillasi." + SEARCH_RESULT_FOR: "Hakutulokset haulle \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "Takaisin viestilistaan" + LIST_LOADING: "Lataa" + EMPTY_SUBJECT_TEXT: "(Ei aihetta)" + PUT_MESSAGE_HERE: "Pudota viesti tähän nähdäksesi sen listassa" + TODAY_AT: "tänään klo %TIME%" + YESTERDAY_AT: "eilen klo %TIME%" + SEARCH_PLACEHOLDER: "Hae" + NEW_MESSAGE_NOTIFICATION: "Sinulle on %COUNT% uutta viestiä!" + QUOTA_SIZE: "Käytät %SIZE% (%PROC%%) sinulle varatusta %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Muokkaa" + BUTTON_BACK: "Takaisin" + BUTTON_CLOSE: "Sulje" + BUTTON_DELETE: "Poista" + BUTTON_UNSUBSCRIBE: "Peruuta tilaus" + BUTTON_ARCHIVE: "Arkistoi" + BUTTON_SPAM: "Roskapostia" + BUTTON_NOT_SPAM: "Ei roskapostia" + BUTTON_MOVE_TO: "Siirrä" + BUTTON_MORE: "Lisää" + BUTTON_REPLY: "Vastaa" + BUTTON_REPLY_ALL: "Vastaa kaikille" + BUTTON_FORWARD: "Välitä" + BUTTON_FORWARD_AS_ATTACHMENT: "Välitä liitteenä" + BUTTON_EDIT_AS_NEW: "Muokkaa uutena" + BUTTON_SHOW_IMAGES: "Näytä ulkopuoliset kuvat" + BUTTON_NOTIFY_READ_RECEIPT: "Lähettäjä on pyytänyt kuittausta kun olet lukenut tämän viestin" + BUTTON_IN_NEW_WINDOW: "Avaa uudessa ikkunassa" + BUTTON_THREAD_LIST: "Viestiketjunäkymä" + BUTTON_THREAD_PREV: "Edellinen" + BUTTON_THREAD_NEXT: "Seuraava" + BUTTON_THREAD_MORE: "Lisää viestejä" + MENU_HEADERS: "Näytä viestin tiedot" + MENU_VIEW_ORIGINAL: "Näytä lähdekoodi" + MENU_DOWNLOAD_ORIGINAL: "Lataa .eml tiedostona" + MENU_FILTER_SIMILAR: "Suodata samankaltaiset" + MENU_PRINT: "Tulosta" + EMPTY_SUBJECT_TEXT: "(Ei aihetta)" + LABEL_SUBJECT: "Aihe" + LABEL_DATE: "Pvm" + LABEL_FROM: "Lähettäjä" + LABEL_FROM_SHORT: "läh" + LABEL_TO: "Vastaanottaja" + LABEL_TO_SHORT: "vast. ott." + LABEL_CC: "CC" + LABEL_BCC: "BCC" + LABEL_REPLY_TO: "Vastaa" + PRINT_LABEL_FROM: "Lähettäjä" + PRINT_LABEL_TO: "Vastaanottaja" + PRINT_LABEL_CC: "CC" + PRINT_LABEL_BCC: "BCC" + PRINT_LABEL_REPLY_TO: "Vastaa" + PRINT_LABEL_DATE: "Pvm" + PRINT_LABEL_SUBJECT: "Aihe" + PRINT_LABEL_ATTACHMENTS: "Liite" + MESSAGE_LOADING: "Lataa" + MESSAGE_VIEW_DESC: "Valitse viesti listasta nähdäksesi sen tässä" + PGP_PASSWORD_INPUT_PLACEHOLDER: "Salasana" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP allekirjoitettu viesti (klikkaa verifioidaksesi)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP salattu visti (klikkaa avataksesi salaus)" + LINK_DOWNLOAD_AS_ZIP: "Lataa zip-tiedostona" + LINK_SAVE_TO_OWNCLOUD: "Tallenna ownCloudiin" + LINK_SAVE_TO_DROPBOX: "Tallenna Dropboxiin" + READ_RECEIPT: + SUBJECT: "Kuitattu luetuksi - %SUBJECT%" + BODY: | + Tämä on Kuitattu luetuksi viestille jonka lähetit %READ-RECEIPT%lle. + + Huom: Tämä viesti kertoo vain että lähetetty viesti on näytetty vastaanottajan koneella. + SUGGESTIONS: + SEARCHING_DESC: "Hakee..." + CONTACTS: + LEGEND_CONTACTS: "Yhteystiedot" + SEARCH_INPUT_PLACEHOLDER: "Hae" + BUTTON_ADD_CONTACT: "Lisää yhteystieto" + BUTTON_CREATE_CONTACT: "Luo" + BUTTON_UPDATE_CONTACT: "Päivitä" + BUTTON_IMPORT: "Tuo (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Vie (vcf, vCard)" + BUTTON_EXPORT_CSV: "Vie (csv)" + ERROR_IMPORT_FILE: "Tuonti virhe (väärä tiedostomuoto)" + LIST_LOADING: "Lataa" + EMPTY_LIST: "Ei yhteystietoja" + EMPTY_SEARCH: "Yhtään yhteystietoa ei löytynyt" + CLEAR_SEARCH: "Poista haku" + CONTACT_VIEW_DESC: "Valitse yhteystieto nähdäksesi sen tässä." + LABEL_DISPLAY_NAME: "Nimi" + LABEL_EMAIL: "Sähköposti" + LABEL_PHONE: "Puhelin" + LABEL_WEB: "Web" + LABEL_BIRTHDAY: "Syntymäpäivä" + LINK_ADD_EMAIL: "Lisää sähköpostiosoite" + LINK_ADD_PHONE: "Lisää puhelinnumero" + LINK_BIRTHDAY: "Syntymäpäivä" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Lisää näytettävä nimi" + PLACEHOLDER_ENTER_LAST_NAME: "Lisää sukunimi" + PLACEHOLDER_ENTER_FIRST_NAME: "Lisää etunimi" + PLACEHOLDER_ENTER_NICK_NAME: "Lisää lempinimi" + LABEL_READ_ONLY: "Vain luku" + LABEL_SHARE: "Jaa" + ADD_MENU_LABEL: "Lisää" + ADD_MENU_NICKNAME: "Lempinimi" + ADD_MENU_NOTES: "Muistiinpanot" + ADD_MENU_EMAIL: "Sähköposti" + ADD_MENU_PHONE: "Puhelin" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Osoite" + ADD_MENU_BIRTHDAY: "Syntymäpäivä" + ADD_MENU_TAGS: "Tagit" + BUTTON_SHARE_NONE: "Ei kenellekään" + BUTTON_SHARE_ALL: "Kaikille" + BUTTON_SYNC: "Synkronoi (CardDAV)" + COMPOSE: + TITLE_FROM: "Lähettäjä" + TITLE_TO: "Vastaanottaja" + TITLE_CC: "CC" + TITLE_BCC: "BCC" + TITLE_REPLY_TO: "Vastaa" + TITLE_SUBJECT: "Aihe" + LINK_SHOW_INPUTS: "näytä kaikki kentät" + BUTTON_SEND: "Lähetä" + BUTTON_SAVE: "Tallenna" + BUTTON_DELETE: "Poista" + BUTTON_CANCEL: "Peruuta" + BUTTON_MINIMIZE: "Pienennä" + SAVED_TIME: "Tallennettu klo %TIME%" + SAVED_ERROR_ON_SEND: "Viesti lähetettiin mutta ei tallennettu lähetetyt kanisoon" + DISCARD_UNSAVED_DATA: "Poista tallentamaton tieto?" + ATTACH_FILES: "Liitä tiedostoja" + ATTACH_DROP_FILES_DESC: "Pudota tiedostot tähän" + ATTACH_ITEM_CANCEL: "Peruuta" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% kirjoitti" + FORWARD_MESSAGE_TOP_TITLE: "-------- Välitetty viesti -------" + FORWARD_MESSAGE_TOP_FROM: "Lähettäjä" + FORWARD_MESSAGE_TOP_TO: "Vastaanottaja" + FORWARD_MESSAGE_TOP_CC: "CC" + FORWARD_MESSAGE_TOP_SENT: "Lähetetty" + FORWARD_MESSAGE_TOP_SUBJECT: "Aihe" + EMPTY_TO_ERROR_DESC: "Lisää ainakin yksi vastaanottaja" + NO_ATTACHMENTS_HERE_DESC: "Ei liitteitä" + ATTACHMENTS_ERROR_DESC: "Huom! Yhtään liitetiedostoa ei ole ladattu." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Kaikkia liitetiedostoja ei ole vielä ladattu." + BUTTON_REQUEST_READ_RECEIPT: "Pyydä kuittaus" + BUTTON_MARK_AS_IMPORTANT: "Merkitse tärkeäksi" + BUTTON_OPEN_PGP: "OpenPGP (pelkkä teksti)" + BUTTON_REQUEST_DSN: "Pyydä toimituskuittaus" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Sulje" + POPUPS_ASK: + BUTTON_YES: "Kyllä" + BUTTON_NO: "Ei" + DESC_WANT_CLOSE_THIS_WINDOW: "Haluatko varmasti sulkea tämän ikkunan?" + DESC_WANT_DELETE_MESSAGES: "Haluatko varmasti poistaa viestin/viestit?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Valitse kieli" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Lisää tili?" + BUTTON_ADD_ACCOUNT: "Lisää" + TITLE_UPDATE_ACCOUNT: "Päivitä tili?" + BUTTON_UPDATE_ACCOUNT: "Päivitä" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Lisää identiteetti?" + TITLE_UPDATE_IDENTITY: "Päivitä identiteetti?" + BUTTON_ADD_IDENTITY: "Lisää" + BUTTON_UPDATE_IDENTITY: "Päivitä" + LABEL_EMAIL: "Sähköposti" + LABEL_NAME: "Nimi" + LABEL_REPLY_TO: "Vastaa" + LABEL_SIGNATURE: "Allekirjoitus" + LABEL_CC: "Cc" + LABEL_BCC: "Bcc" + LABEL_SIGNATURE_INSERT_BEFORE: "Lisää tämä allekirjoitus ennen lainattua tekstiä vastauksissa" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Luo kansio?" + LABEL_NAME: "Kansion nimi" + LABEL_PARENT: "Emo-kansio" + BUTTON_CREATE: "Luo" + BUTTON_CANCEL: "Peruuta" + BUTTON_CLOSE: "Sulje" + TITLE_CREATING_PROCESS: "Luodaan kansiota" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Poista kaikki viestit tästä kansiosta?" + BUTTON_CLEAR: "Poista" + BUTTON_CANCEL: "Peruuta" + BUTTON_CLOSE: "Sulje" + DANGER_DESC_WARNING: "Huom!" + DANGER_DESC_HTML_1: "Tämä toiminto poistaa kaikki viestit kansiosta %FOLDER% lopullisesti." + DANGER_DESC_HTML_2: "Tätä toimintoa ei voi peruuttaa." + TITLE_CLEARING_PROCESS: "Tyhjennetään kansiota..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Tuo OpenPGP avain" + BUTTON_IMPORT_OPEN_PGP_KEY: "Tuo" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "Näytä OpenPGP avain" + BUTTON_SELECT: "Valitse" + BUTTON_CLOSE: "Sulje" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Luo OpenPGP avain" + LABEL_EMAIL: "Sähköposti" + LABEL_NAME: "Nimi" + LABEL_PASSWORD: "Salasana" + LABEL_KEY_BIT_LENGTH: "Avaimen pituus" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generoi" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP Allekirjoitus/Salaus" + LABEL_SIGN: "Allekirjoita" + LABEL_ENCRYPT: "Salaa" + LABEL_PASSWORD: "Salasana" + BUTTON_SIGN: "Allekirjoita" + BUTTON_ENCRYPT: "Salaa" + BUTTON_SIGN_AND_ENCRYPT: "Allekirjoita ja salaa" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "Pura OpenPGP" + LABEL_KEY: "Yksityinen avain" + LABEL_PASSWORD: "Salasana" + BUTTON_DECRYPT: "Pura" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "2-vaiheisen tunnistautumisen testi" + LABEL_CODE: "Koodi" + BUTTON_TEST: "Testaa" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Luo suodatin?" + TITLE_EDIT_FILTER: "Päivitä suodatin?" + FILTER_NAME: "Nimi" + LEGEND_CONDITIONS: "Ehdot" + LEGEND_ACTIONS: "Toimenpiteet" + BUTTON_DONE: "Valmis" + BUTTON_ADD_CONDITION: "Lisää ehto" + SELECT_ACTION_NONE: "Ei mitään" + SELECT_ACTION_MOVE_TO: "Siirrä" + SELECT_ACTION_FORWARD_TO: "Välitä" + SELECT_ACTION_REJECT: "Hylkää" + SELECT_ACTION_VACATION_MESSAGE: "Lomaviesti" + SELECT_ACTION_DISCARD: "Poista" + SELECT_FIELD_FROM: "Lähettäjä" + SELECT_FIELD_RECIPIENTS: "Vastaanottajat (Vast. ott. tai CC)" + SELECT_FIELD_SUBJECT: "Aihe" + SELECT_FIELD_HEADER: "Header" + SELECT_FIELD_SIZE: "Koko" + SELECT_TYPE_CONTAINS: "Sisältää" + SELECT_TYPE_NOT_CONTAINS: "Ei sisällä" + SELECT_TYPE_MATCHES: "Vastaa hakukyselyä (* ja ? tuettu)" + SELECT_TYPE_NOT_MATCHES: "Ei vastaa hakukyselyä (* ja ? tuettu)" + SELECT_TYPE_REGEXP: "Regexp" + SELECT_TYPE_NOT_REGEXP: "Not Regexp" + SELECT_TYPE_EQUAL_TO: "Yhtä kuin" + SELECT_TYPE_NOT_EQUAL_TO: "Ei yhtä kuin" + SELECT_TYPE_OVER: "Yli" + SELECT_TYPE_UNDER: "Alle" + SELECT_MATCH_ANY: "Vastaa mitä tahansa säännöistä" + SELECT_MATCH_ALL: "Vastaa kaikkia sääntöjä" + MARK_AS_READ_LABEL: "Merkitse luetuksi" + REPLY_INTERVAL_LABEL: "Vastaus intervalli (päivissä)" + KEEP_LABEL: "Säästä" + STOP_LABEL: "Älä lopeta sääntöjen prosessointia" + EMAIL_LABEL: "Sähköposti" + VACATION_SUBJECT_LABEL: "Aihe (valinnainen)" + VACATION_MESSAGE_LABEL: "Viesti" + VACATION_RECIPIENTS_LABEL: "Vastaanottajat (erotettu pilkulla)" + REJECT_MESSAGE_LABEL: "Hylkää viesti" + ALL_INCOMING_MESSAGES_DESC: "Kaikki saapuvat viestit" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Valitse järjestelmäkansiot" + SELECT_CHOOSE_ONE: "Valitse yksi" + SELECT_UNUSE_NAME: "Älä käytä" + LABEL_SENT: "Lähetetyt" + LABEL_DRAFTS: "Luonnokset" + LABEL_SPAM: "Roskaposti" + LABEL_TRASH: "Roskakori" + LABEL_ARCHIVE: "Arkisto" + BUTTON_CANCEL: "Peruuta" + BUTTON_CLOSE: "Sulje" + NOTIFICATION_SENT: | + Et ole valinnut "Lähetetyt" järjestelmäkansiota jonne viestit laitetaan lähetyksen jälkeen. + Jos et halua tallentaa lähetettyjä viestejä, valitse "Älä käytä". + NOTIFICATION_DRAFTS: "Et ole valinnut \"Luonnokset\" kansiota minne tallennetaan viestit kirjoitettaessa." + NOTIFICATION_SPAM: | + Et ole valinnut "Roskaposti" kansiota mihin roskapostiksi merkityt viestit siirretään. + Jos haluat positaa viestit lopullisesti, valitse "Älä käytä". + NOTIFICATION_TRASH: | + Et ole valinnut "Roskakori" järjestelmäkansiota mihin poistetut viestit laitetaan. + Jos haluat positaa viestit lopullisesti, valitse "Älä käytä". + NOTIFICATION_ARCHIVE: "Et ole valinnut \"Arkisto\" järjestelmäkansiota." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "2-osainen todentaminen" + LABEL_ENABLE_TWO_FACTOR: "Aktivoi 2-osainen todentaminen" + LABEL_TWO_FACTOR_USER: "Käyttäjä" + LABEL_TWO_FACTOR_STATUS: "Tila" + LABEL_TWO_FACTOR_SECRET: "Salasana" + LABEL_TWO_FACTOR_BACKUP_CODES: "Varmuuskoodi" + BUTTON_CREATE: "Luo salasana" + BUTTON_ACTIVATE: "Aktivoi" + BUTTON_CLEAR: "Poista" + BUTTON_LOGOUT: "Kirjaudu ulos" + BUTTON_DONE: "Valmis" + BUTTON_TEST: "Testaa" + LINK_TEST: "testi" + BUTTON_SHOW_SECRET: "Näytä salasana" + BUTTON_HIDE_SECRET: "Piilota salasana" + TWO_FACTOR_REQUIRE_DESC: "Tilisi vaatii 2-osasisen tunnistuksen" + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Konfiguroitu" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Ei konfiguroitu" + TWO_FACTOR_SECRET_DESC: > + Vie tämä tieto Google Authenticator (tai toiseen )asiakasohjelmaan käyttämällä + QR koodia tai syöttämällä koodi manuaalisesti. + TWO_FACTOR_BACKUP_CODES_DESC: > + Jos et voi vastaanottaa koodeja Google Authenticator:lla, voit käyttää varmuus + koodeja kirjautumiseen. Käytettyäsi varmuuskoodin se poistuu käytötstä. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Et voi muuttaa asetusta ennen testiä." + TITLES: + LOADING: "Lataa" + LOGIN: "Kirjaudu" + MAILBOX: "Postilaatikko" + SETTINGS: "Asetukset" + COMPOSE: "Luo viesti" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Tiedosto on liian iso" + ERROR_FILE_PARTIALLY_UPLOADED: "Tiedostoa ei voitu ladata kokonaan tuntemattoman vierheen vuoksi" + ERROR_NO_FILE_UPLOADED: "Tiedostoa ei ladattu" + ERROR_MISSING_TEMP_FOLDER: "Väliaikainen tiedosto puuttuu" + ERROR_ON_SAVING_FILE: "Tuntematon virhe ladattaessa" + ERROR_FILE_TYPE: "Väärä tiedostotyyppi" + ERROR_UNKNOWN: "Tuntematon virhe ladattaessa" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEKSTI" + TEXT_SWITCHER_RICH_FORMATTING: "Muotoiluilla" + TEXT_SWITCHER_CONFIRM: "Muotoilu ja kuvat häviävät. Haluatko varmasti jatkaa?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Henkilökohtainen" + LABEL_GENERAL_NAME: "Yleinen" + LABEL_CONTACTS_NAME: "Yhteystiedot" + LABEL_FOLDERS_NAME: "kansiot" + LABEL_ACCOUNTS_NAME: "Tilit" + LABEL_IDENTITY_NAME: "Identiteetti" + LABEL_IDENTITIES_NAME: "Identiteetit" + LABEL_FILTERS_NAME: "Suodattimet" + LABEL_TEMPLATES_NAME: "Mallipohjat" + LABEL_SECURITY_NAME: "Turvallisuus" + LABEL_SOCIAL_NAME: "Sosiaalinen" + LABEL_THEMES_NAME: "emat" + LABEL_CHANGE_PASSWORD_NAME: "Salasana" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Takaisin" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Suodattimet" + BUTTON_SAVE: "Tallenna" + BUTTON_ADD_FILTER: "Lisää suodatin" + BUTTON_DELETE: "Poista" + BUTTON_RAW_SCRIPT: "Käytä muokattua skriptiä" + SUBNAME_NONE: "Ei mitään" + SUBNAME_MOVE_TO: "Siirrä kansioon \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Välitä osoitteeseen \"%EMAIL%\"" + SUBNAME_REJECT: "Hylkää" + SUBNAME_VACATION_MESSAGE: "Lomaviesti" + SUBNAME_DISCARD: "Poista" + CAPABILITY_LABEL: "Valmius" + LOADING_PROCESS: "Asetetaan suodattimet" + DELETING_ASK: "Oletko varma?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Nämä asetukset on tallennettava palvelimelle." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identiteetti" + LABEL_DISPLAY_NAME: "nimi" + LABEL_REPLY_TO: "Vastaa-osoite" + LABEL_SIGNATURE: "Allekirjoitus" + LABEL_ADD_SIGNATURE_TO_ALL: "Lisää allekirjoitus kaikkiin lähteviin viesteihin" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Turvallisuus" + LABEL_CONFIGURE_TWO_FACTOR: "Aseta 2-osainen tunnistus" + LABEL_AUTOLOGOUT: "Automaattinen uloskirjautuminen" + AUTOLOGIN_NEVER_OPTION_NAME: "Ei koskaan" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minuuttia" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% tuntia" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Yleiset" + LABEL_LANGUAGE: "Kieli" + LABEL_IDENTITY: "Identiteetti" + LABEL_LAYOUT: "Asettelu" + LABEL_LAYOUT_NO_SPLIT: "Ei jakoa" + LABEL_LAYOUT_VERTICAL_SPLIT: "Pystysuora jako" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Vaakataso jako" + LABEL_EDITOR: "Oletus tekstieditori" + LABEL_EDITOR_HTML: "Html" + LABEL_EDITOR_PLAIN: "Pelkkä teksti" + LABEL_EDITOR_HTML_FORCED: "Html (pakotettu)" + LABEL_EDITOR_PLAIN_FORCED: "Pelkkä teksti (pakotettu)" + LABEL_ANIMATION: "Käyttöliittymän animointi" + LABEL_ANIMATION_FULL: "Täysi" + LABEL_ANIMATION_NORMAL: "Normaali" + LABEL_ANIMATION_NONE: "Ei mitään" + LABEL_VIEW_OPTIONS: "Näyttö-valinnat" + LABEL_USE_PREVIEW_PANE: "Käytä esikatselua" + LABEL_USE_CHECKBOXES_IN_LIST: "Näytä valintaruudut listassa" + LABEL_USE_THREADS: "Käytä keskustelunäkymää" + LABEL_REPLY_SAME_FOLDER: "Siirrä vastaukset samaan kansioon vastattavien kanssa" + LABEL_SHOW_IMAGES: "Näytä aina ulkopuoliset kuvat viestissä" + LABEL_SHOW_ANIMATION: "Näytä animaatio" + LABEL_MESSAGE_PER_PAGE: "Viestiä sivulla" + LABEL_NOTIFICATIONS: "Ilmoitukset" + LABEL_SOUND_NOTIFICATION: "Äänimerkit" + LABEL_CHROME_NOTIFICATION_DESC: "Näytä uusien viestien ponnahdusikkuna" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Estetty selaimessa)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Yhteystiedot" + LABEL_CONTACTS_AUTOSAVE: "Lisää yhetystieto automaattisesti osoitekirjaan" + LEGEND_CONTACTS_SYNC: "Etä-synkronointi (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Aktivoi etä-synkronointi" + LABEL_CONTACTS_SYNC_SERVER: "Palvelin" + LABEL_CONTACTS_SYNC_AB_URL: "Osoitekirjan URL" + LABEL_CONTACTS_SYNC_USER: "Käyttäjä" + LABEL_CONTACTS_SYNC_PASSWORD: "Salasana" + SETTINGS_THEMES: + LEGEND_THEMES: "Teemat" + LEGEND_THEMES_CUSTOM: "Muokatun teeman asetukset" + LABEL_CUSTOM_TYPE: "Tyyppi" + LABEL_CUSTOM_TYPE_LIGHT: "Vaalea" + LABEL_CUSTOM_TYPE_DARK: "Tumma" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Tausta" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Lataa taustakuva (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Tiedosto on liian iso" + ERROR_FILE_TYPE_ERROR: "Väärä tiedostotyyppi (ainoastaan JPG ja PNG)" + ERROR_UNKNOWN: "Tuntematon virhe ladattaessa" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Liitä Google" + BUTTON_GOOGLE_DISCONNECT: "Katkaise yhteys Googleen" + MAIN_GOOGLE_DESC: "Aktivoituasi Google kirjautumisen, voit kirjautua tälle tilille käyttämällä Google nappia kirjautumissivulla" + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Liitä Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Katkaise yhteys Facebookiin" + MAIN_FACEBOOK_DESC: "Aktivoituasi facebook kirjautumisen, voit kirjautua tälle tilille käyttämällä facebook nappia kirjautumissivulla" + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Yhdistä Twitter" + BUTTON_TWITTER_DISCONNECT: "Katkaise yhteys Twitteriin" + MAIN_TWITTER_DESC: "Aktivoituasi Twitter kirjautumisen, voit kirjautua tälle tilille käyttämällä Twitter nappia kirjautumissivulla" + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Kansiolista" + BUTTON_CREATE: "Luo Kansio" + BUTTON_SYSTEM: "Järjestelmäkansiot" + BUTTON_DELETE: "Poista" + BUTTON_SUBSCRIBE: "Tilaa" + BUTTON_UNSUBSCRIBE: "Peruuta tilaus" + LOADING_PROCESS: "Päivitetään listaa" + CREATING_PROCESS: "Luodaan kansiota" + DELETING_PROCESS: "Poistetaan kansiota" + RENAMING_PROCESS: "Uudelleennimetään kansiota" + DELETING_ASK: "Oletko varma?" + TO_MANY_FOLDERS_DESC_1: "Sinulla on liikaa kansioita!" + TO_MANY_FOLDERS_DESC_2: "Näytetään vain osa." + HELP_DELETE_FOLDER: "Poista kansio" + HELP_SHOW_HIDE_FOLDER: "Näytä/Piilota kansio" + HELP_CHECK_FOR_NEW_MESSAGES: "Tarkista/Älä tarkista uudet viestit" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Tilit" + LEGEND_IDENTITIES: "Identiteetit" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Tilit ja Identiteetit" + BUTTON_ADD_ACCOUNT: "Lisää Tili" + BUTTON_ADD_IDENTITY: "Lisää identiteetti" + BUTTON_DELETE: "Poista" + LOADING_PROCESS: "Päivitetään..." + DELETING_ASK: "Oletko varma?" + DEFAULT_IDENTITY_LABEL: "oletus" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identiteetti" + LEGEND_IDENTITIES: "Lisä identiteetit" + LABEL_DEFAULT: "Oletus" + LABEL_DISPLAY_NAME: "Nimi" + LABEL_REPLY_TO: "Vastaa osoite" + LABEL_SIGNATURE: "Allekirjoitus" + LABEL_ADD_SIGNATURE_TO_ALL: "Lisää allekirjoitus kaikkiin ulosmeneviin viesteihin" + BUTTON_ADD_IDENTITY: "Lisää identiteetti" + BUTTON_DELETE: "Poista" + LOADING_PROCESS: "Päivitetään identiteettilistaa" + DELETING_ASK: "Oletko varma?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Vaihda salasana" + LABEL_CURRENT_PASSWORD: "Nykyinen salasana" + LABEL_NEW_PASSWORD: "Uusi salasana" + LABEL_REPEAT_PASSWORD: "Vahvista uusi salasana" + BUTTON_UPDATE_PASSWORD: "Aseta uusi salasana" + ERROR_PASSWORD_MISMATCH: "Salasanat eivät täsmää, yritä uudelleen" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Tuo OpenPGP avain" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Luo OpenPGP avain" + TITLE_PRIVATE: "Yksityinen" + TITLE_PUBLIC: "Julkinen" + DELETING_ASK: "Oletko varma?" + GENERATE_ONLY_HTTPS: "Vain HTTPS" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Näppäimistö oikotie apu" + TAB_MAILBOX: "Postilaatikko" + TAB_MESSAGE_LIST: "Viestilista" + TAB_MESSAGE_VIEW: "Viestinäkymä" + TAB_COMPOSE: "Luo" + LABEL_OPEN_USER_DROPDOWN: "Avaa käyttäjävalikko" + LABEL_REPLY: "Vastaa" + LABEL_REPLY_ALL: "Vastaa kaikille" + LABEL_FORWARD: "Lähetä edelleen" + LABEL_FORWARD_MULTIPLY: "Lähetä edelleen liitteenä" + LABEL_HELP: "Ohje" + LABEL_CHECK_ALL: "Valitse kaikki viestit" + LABEL_ARCHIVE: "Arkisto" + LABEL_DELETE: "Poista" + LABEL_OPEN_THREAD: "Avaa valittu ketju" + LABEL_MOVE: "Siirrä" + LABEL_READ: "Lue valitut viestit" + LABEL_UNREAD: "Lukemattomat valitut viestit" + LABEL_IMPORTANT: "Tärkeät, merkitse valitut" + LABEL_SEARCH: "Etsi" + LABEL_CANCEL_SEARCH: "Peruuta etsi" + LABEL_FULLSCREEN_ENTER: "Koko näyttö (Esikatselu näkymä)" + LABEL_VIEW_MESSAGE_ENTER: "Katso viesti (Ei esikatselu näkymää)" + LABEL_SWITCH_TO_MESSAGE: "Fokusoi valittuu viestiin" + LABEL_SWITCH_TO_FOLDER_LIST: "Fokusoi viestilistaan" + LABEL_FULLSCREEN_TOGGLE: "Aseta täyden ruudun näkymä" + LABEL_BLOCKQUOTES_TOGGLE: "Aseta lainaus" + LABEL_THREAD_NEXT: "Seuraava viesti ketjussa" + LABEL_THREAD_PREV: "Edellinen viesti ketjussa" + LABEL_PRINT: "Tulosta" + LABEL_EXIT_FULLSCREEN: "Poistu täyden ruudun näkymästä" + LABEL_CLOSE_MESSAGE: "Sulje viesti" + LABEL_SWITCH_TO_LIST: "Fokusoi viestilistaan" + LABEL_OPEN_COMPOSE_POPUP: "Avaa luo viesti popup" + LABEL_MINIMIZE_COMPOSE_POPUP: "Sulje luo viesti popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Avaa idetiteetit valikko" + LABEL_SAVE_MESSAGE: "Tallenna viesti" + LABEL_SEND_MESSAGE: "Lähetä viesti" + LABEL_CLOSE_COMPOSE: "Sule luo viesti" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "Julkisia avaimia ei löytynyt" + NO_PUBLIC_KEYS_FOUND_FOR: "%EMAIL% lle ei löytynyt julkisia avaimia" + NO_PRIVATE_KEY_FOUND: "Ykrityistä avainta ei löytynyt" + NO_PRIVATE_KEY_FOUND_FOR: "%EMAIL% lle ei löytynyt yksityistä avainta" + ADD_A_PUBLICK_KEY: "Lisää julkinen avain" + SELECT_A_PRIVATE_KEY: "Valitse yksityinen avain" + UNVERIFIRED_SIGNATURE: "Tarkistamaton allekirjoitus" + DECRYPTION_ERROR: "OpenPGP avausvierhe" + GOOD_SIGNATURE: "Oikea allekirjoitus %USER% lle" + PGP_ERROR: "OpenPGP virhe: %ERROR%" + SPECIFY_FROM_EMAIL: "Aseta lähettäjän osoite" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Aseta vähintään yksi vastaanottaja" + NOTIFICATIONS: + INVALID_TOKEN: "Väärä suojaustunnus" + AUTH_ERROR: "Tunnistusvirhe" + ACCESS_ERROR: "Kirjautumisvirhe" + CONNECTION_ERROR: "Ei voi yhdistää palvelimeen" + CAPTCHA_ERROR: "Väärä CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Tätä some ID:tä ei ole liitetty mihinkään tiliin. Kirjaudu sähköpostiosoitteella + ja aktivoi tämä ominaisuus tilin asetuksissa. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Tätä some ID:tä ei ole liitetty mihinkään tiliin. Kirjaudu sähköpostiosoitteella + ja aktivoi tämä ominaisuus tilin asetuksissa. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Tätä some ID:tä ei ole liitetty mihinkään tiliin. Kirjaudu sähköpostiosoitteella + ja aktivoi tämä ominaisuus tilin asetuksissa. + DOMAIN_NOT_ALLOWED: "Verkkotunnus ei ole sallittu" + ACCOUNT_NOT_ALLOWED: "Tili ei ole sallittu" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2-osainen tunnistus vaaditaan" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2-osainen tunnistusvirhe" + COULD_NOT_SAVE_NEW_PASSWORD: "Salasanan tallennus ei onnistunut" + CURRENT_PASSWORD_INCORRECT: "Nykyinen salasana väärin" + NEW_PASSWORD_SHORT: "Salasana liian lyhyt" + NEW_PASSWORD_WEAK: "Salasana liian helppo" + NEW_PASSWORD_FORBIDDENT: "Salasana sisältää kiellettyjä merkkejä" + CONTACTS_SYNC_ERROR: "Yhteystietojen synkronointivirhe" + CANT_GET_MESSAGE_LIST: "Viestilistaa ei voi näyttää" + CANT_GET_MESSAGE: "Viestiä ei voi näyttää" + CANT_DELETE_MESSAGE: "Viestiä ei voi poistaa" + CANT_MOVE_MESSAGE: "Viestiä ei voi siirtää" + CANT_SAVE_MESSAGE: "Viestiä ei voi tallentaa" + CANT_SEND_MESSAGE: "Viestiä ei voi lähettää" + INVALID_RECIPIENTS: "Vastaanottajassa virhe" + CANT_SAVE_FILTERS: "Suodattimia ei voi tallentaa" + CANT_GET_FILTERS: "Suodattimia ei voi ladata" + FILTERS_ARE_NOT_CORRECT: "Suodattimet väärin" + CANT_CREATE_FOLDER: "Kansiota ei voi luoda" + CANT_RENAME_FOLDER: "Kansiota ei voi uudelleennimetä" + CANT_DELETE_FOLDER: "Kansiota ei voi poistaa" + CANT_DELETE_NON_EMPTY_FOLDER: "Kansiossa on viestejä, ei voi poistaa" + CANT_SUBSCRIBE_FOLDER: "Kansiota ei voi tilata" + CANT_UNSUBSCRIBE_FOLDER: "Kansiotilausta ei voi peruuttaa" + CANT_SAVE_SETTINGS: "Asetuksia ei voi tallentaa" + CANT_SAVE_PLUGIN_SETTINGS: "Asetuksia ei voi tallentaa" + DOMAIN_ALREADY_EXISTS: "Verkkotunnus on jo olemassa" + CANT_INSTALL_PACKAGE: "Pakkauksen asennus epäonnistui" + CANT_DELETE_PACKAGE: "Pakkauksen poisto epäonnistui" + INVALID_PLUGIN_PACKAGE: "Viallinen paketti" + UNSUPPORTED_PLUGIN_PACKAGE: "Ei-tuettu plugin paketti" + LICENSING_SERVER_IS_UNAVAILABLE: "Tilauspalvelin ei ole saatavilla" + LICENSING_DOMAIN_EXPIRED: "Tämän verkkotunnuksen tilaus on päättynyt." + LICENSING_DOMAIN_BANNED: "Tämän verkkotunnuksen tilaus on estetty." + DEMO_SEND_MESSAGE_ERROR: "Turvallisuus syistä tältä tililtä ei voi lähettää viestejä ulkopuolisiin osoitteisiin!" + DEMO_ACCOUNT_ERROR: "Turvallisuus syistä tämä ei ole sallittua!" + ACCOUNT_ALREADY_EXISTS: "Tili on jo olemassa." + ACCOUNT_DOES_NOT_EXIST: "Tiliä ei ole olemassa" + MAIL_SERVER_ERROR: "Palvelinyhteydessä tapahtui virhe" + INVALID_INPUT_ARGUMENT: "Virheelinen komento" + UNKNOWN_ERROR: "Tuntematon virhe" + STATIC: + BACK_LINK: "Lataa uudelleen" + DOMAIN_LIST_DESC: "Lista sallituista verkkotunnuksista" + PHP_EXSTENSIONS_ERROR_DESC: "Vaadittava PHP lisäosa ei ole saatavilla PHP konfiguraatiossa!" + PHP_VERSION_ERROR_DESC: "PHP versiosi (%VERSION%) on alle vaaditun 5.3.0!" + NO_SCRIPT_TITLE: "JavaScript vaaditaan." + NO_SCRIPT_DESC: | + JavaScript tuki ei ole saatavilla selaimessasi. + Aktivoi JavaScript selaimessasi ja yritä uudelleen. + NO_COOKIE_TITLE: "Eväste-tuki vaaditaan." + NO_COOKIE_DESC: | + Eväste (cookie) tuki ei ole saatavilla selaimessasi. + Aktivoi evästeet (cookiet) selaimessasi ja yritä uudelleen. + BAD_BROWSER_TITLE: "Selaimesi on vanhentunut." + BAD_BROWSER_DESC: | + Käyttääksesi kaikkia ominaisuuksia, + lataa ja asenna jokin näistä selaimista: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fr_FR.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fr_FR.yml new file mode 100755 index 00000000..84a9671b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fr_FR.yml @@ -0,0 +1,717 @@ +fr_FR: + LOGIN: + LABEL_EMAIL: "Email" + LABEL_LOGIN: "Identifiant" + LABEL_PASSWORD: "Mot de passe" + LABEL_SIGN_ME: "Se souvenir de moi" + LABEL_VERIFICATION_CODE: "Code de vérification" + LABEL_DONT_ASK_VERIFICATION_CODE: "Ne plus demander le code pendant 2 semaines" + BUTTON_SIGN_IN: "Se connecter" + TITLE_SIGN_IN_GOOGLE: "Se connecter avec Google" + TITLE_SIGN_IN_FACEBOOK: "Se connecter avec Facebook" + TITLE_SIGN_IN_TWITTER: "Se connecter avec Twitter" + LABEL_FORGOT_PASSWORD: "Mot de passe oublié" + LABEL_REGISTRATION: "S'enregistrer" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Ajouter un compte" + BUTTON_SETTINGS: "Paramètres" + BUTTON_HELP: "Aide" + BUTTON_LOGOUT: "Déconnexion" + MOBILE: + BUTTON_MOBILE_VERSION: "Version mobile" + BUTTON_DESKTOP_VERSION: "Version grand écran" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Recherche" + TITLE_ADV: "Recherche avancée" + LABEL_ADV_FROM: "De" + LABEL_ADV_TO: "À" + LABEL_ADV_SUBJECT: "Objet" + LABEL_ADV_TEXT: "Texte" + LABEL_ADV_HAS_ATTACHMENT: "Pièce jointe" + LABEL_ADV_HAS_ATTACHMENTS: "Pièces jointes" + LABEL_ADV_FLAGGED: "Signalé" + LABEL_ADV_UNSEEN: "Non lu" + LABEL_ADV_DATE: "Date" + LABEL_ADV_DATE_ALL: "Tous" + LABEL_ADV_DATE_3_DAYS: "Jusqu'à 3 jours" + LABEL_ADV_DATE_7_DAYS: "Jusqu'à 1 semaine" + LABEL_ADV_DATE_MONTH: "Jusqu'à 1 mois" + LABEL_ADV_DATE_3_MONTHS: "Jusqu'à 3 mois" + LABEL_ADV_DATE_6_MONTHS: "Jusqu'à 6 mois" + LABEL_ADV_DATE_YEAR: "Jusqu'à 1 an" + BUTTON_ADV_SEARCH: "Rechercher" + PREVIEW_POPUP: + FULLSCREEN: "Basculer en plein écran" + ZOOM: "Zoom Avant/Arrière" + CLOSE: "Fermer (Esc)" + LOADING: "Chargement..." + GALLERY_PREV: "Précédent (flèche gauche)" + GALLERY_NEXT: "Suivant (flèche droite)" + GALLERY_COUNTER: "%curr% de %total%" + IMAGE_ERROR: "L'image ne peut être chargée." + AJAX_ERROR: "Le contenu ne peut être chargé." + FOLDER_LIST: + BUTTON_COMPOSE: "Nouveau message" + BUTTON_CONTACTS: "Contacts" + BUTTON_NEW_MESSAGE: "Nouveau message" + INBOX_NAME: "Boîte de réception" + SENT_NAME: "Envoyés" + DRAFTS_NAME: "Brouillons" + SPAM_NAME: "Indésirables" + TRASH_NAME: "Corbeille" + ARCHIVE_NAME: "Archive" + QUOTA: + TITLE: "Quota" + MESSAGE_LIST: + BUTTON_RELOAD: "Recharger la liste des messages" + BUTTON_MOVE_TO: "Déplacer vers" + BUTTON_DELETE: "Supprimer" + BUTTON_ARCHIVE: "Archiver" + BUTTON_SPAM: "Indésirable" + BUTTON_NOT_SPAM: "Acceptable" + BUTTON_EMPTY_FOLDER: "Vider le dossier" + BUTTON_MULTY_FORWARD: "Transmettre les messages" + BUTTON_DELETE_WITHOUT_MOVE: "Supprimer définitivement" + BUTTON_MORE: "Plus" + MENU_SET_SEEN: "Marquer comme lu" + MENU_SET_ALL_SEEN: "Marquer tous comme lus" + MENU_UNSET_SEEN: "Marquer comme non-lu" + MENU_SET_FLAG: "Signaler" + MENU_UNSET_FLAG: "Enlever le signal" + MENU_SELECT_ALL: "Tous" + MENU_SELECT_NONE: "Aucun" + MENU_SELECT_INVERT: "Inverser" + MENU_SELECT_UNSEEN: "Non-lu" + MENU_SELECT_SEEN: "Lu" + MENU_SELECT_FLAGGED: "Signalés" + MENU_SELECT_UNFLAGGED: "Non signalés" + EMPTY_LIST: "Liste vide." + EMPTY_SEARCH_LIST: "Aucun message ne correspond à votre recherche." + SEARCH_RESULT_FOR: "Résultats de recherche pour \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "retour à la liste des messages" + LIST_LOADING: "Chargement" + EMPTY_SUBJECT_TEXT: "(Pas d'objet)" + PUT_MESSAGE_HERE: "Glisser un message ici pour l'afficher dans la liste" + TODAY_AT: "aujourd'hui à %TIME%" + YESTERDAY_AT: "hier à %TIME%" + SEARCH_PLACEHOLDER: "Recherche" + NEW_MESSAGE_NOTIFICATION: "Vous avez %COUNT% nouveaux messages !" + QUOTA_SIZE: "Vous utilisez %SIZE% (%PROC%%) sur %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Modifier" + BUTTON_BACK: "Retour" + BUTTON_CLOSE: "Fermer" + BUTTON_DELETE: "Supprimer" + BUTTON_UNSUBSCRIBE: "Se désinscrire de cette liste" + BUTTON_ARCHIVE: "Archive" + BUTTON_SPAM: "Indésirable" + BUTTON_NOT_SPAM: "Acceptable" + BUTTON_MOVE_TO: "Déplacer vers" + BUTTON_MORE: "Plus" + BUTTON_REPLY: "Répondre" + BUTTON_REPLY_ALL: "Répondre à tous" + BUTTON_FORWARD: "Transférer" + BUTTON_FORWARD_AS_ATTACHMENT: "Transférer comme pièce-jointe" + BUTTON_EDIT_AS_NEW: "Éditer comme nouveau" + BUTTON_SHOW_IMAGES: "Afficher les images" + BUTTON_NOTIFY_READ_RECEIPT: "L'expéditeur a demandé à être prévenu lorsque vous lirez ce message." + BUTTON_IN_NEW_WINDOW: "Voir dans une nouvelle fenêtre" + BUTTON_THREAD_LIST: "Liste des discussions" + BUTTON_THREAD_PREV: "Précédent" + BUTTON_THREAD_NEXT: "Suivant" + BUTTON_THREAD_MORE: "Plus de messages" + MENU_HEADERS: "Voir les en-têtes du message" + MENU_VIEW_ORIGINAL: "Voir la source" + MENU_DOWNLOAD_ORIGINAL: "Télécharger comme fichier .eml" + MENU_FILTER_SIMILAR: "Filtrer les messages similaires" + MENU_PRINT: "Imprimer" + EMPTY_SUBJECT_TEXT: "(Pas d'objet)" + LABEL_SUBJECT: "Objet" + LABEL_DATE: "Date" + LABEL_FROM: "De" + LABEL_FROM_SHORT: "de" + LABEL_TO: "À" + LABEL_TO_SHORT: "à" + LABEL_CC: "CC" + LABEL_BCC: "CCI" + LABEL_REPLY_TO: "Répondre à" + PRINT_LABEL_FROM: "De" + PRINT_LABEL_TO: "À" + PRINT_LABEL_CC: "CC" + PRINT_LABEL_BCC: "CCI" + PRINT_LABEL_REPLY_TO: "Répondre à" + PRINT_LABEL_DATE: "Date" + PRINT_LABEL_SUBJECT: "Objet" + PRINT_LABEL_ATTACHMENTS: "Pièces jointes" + MESSAGE_LOADING: "Chargement" + MESSAGE_VIEW_DESC: "Sélectionner un message dans la liste pour l'afficher ici." + MESSAGE_VIEW_MOVE_DESC: "Cliquez sur le nom du dossier dans le panneau de gauche pour sélectionner la destination." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Mot de passe" + PGP_SIGNED_MESSAGE_DESC: "Message signé par OpenPGP (cliquer pour vérifier)" + PGP_ENCRYPTED_MESSAGE_DESC: "Message chiffré par OpenPGP (cliquer pour déchiffrer)" + LINK_DOWNLOAD_AS_ZIP: "Télécharger le zip" + LINK_SAVE_TO_OWNCLOUD: "Enregistrer sur ownCloud" + LINK_SAVE_TO_CLOUD: "Enregistrer sur le cloud" + LINK_SAVE_TO_DROPBOX: "Enregistrer sur Dropbox" + READ_RECEIPT: + SUBJECT: "Accusé de réception (affiché) - %SUBJECT%" + BODY: | + Il s'agit d'un accusé de réception pour le courrier que vous avez envoyé à %READ-RECEIPT%. + + Note: Cet accusé de réception reconnaît que le message a été affiché sur l'ordinateur du destinataire. + Il n'y a aucune garantie que le destinataire ait lu ou compris le contenu du message. + SUGGESTIONS: + SEARCHING_DESC: "Recherche..." + CONTACTS: + LEGEND_CONTACTS: "Carnet d'adresses" + SEARCH_INPUT_PLACEHOLDER: "Recherche" + BUTTON_ADD_CONTACT: "Ajouter un contact" + BUTTON_CREATE_CONTACT: "Créer" + BUTTON_UPDATE_CONTACT: "Modifier" + BUTTON_IMPORT: "Importer (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Exporter (vcf, vCard)" + BUTTON_EXPORT_CSV: "Exporter (csv)" + ERROR_IMPORT_FILE: "Erreur d'importation (format de fichier invalide)" + LIST_LOADING: "Chargement" + EMPTY_LIST: "Aucun contact" + EMPTY_SEARCH: "Aucun contact trouvé" + CLEAR_SEARCH: "Effacer la recherche" + CONTACT_VIEW_DESC: "Sélectionner un contact dans la liste pour l'afficher ici." + LABEL_DISPLAY_NAME: "Nom affiché" + LABEL_EMAIL: "Email" + LABEL_PHONE: "Téléphone" + LABEL_WEB: "Web" + LABEL_BIRTHDAY: "Anniversaire" + LINK_ADD_EMAIL: "Ajouter une adresse email" + LINK_ADD_PHONE: "Ajouter un numéro de téléphone" + LINK_BIRTHDAY: "Anniversaire" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Entrez le nom à afficher" + PLACEHOLDER_ENTER_LAST_NAME: "Entrez votre nom" + PLACEHOLDER_ENTER_FIRST_NAME: "Entrez votre prénom" + PLACEHOLDER_ENTER_NICK_NAME: "Enter le pseudonyme" + LABEL_READ_ONLY: "Lecture seule" + LABEL_SHARE: "Partager" + ADD_MENU_LABEL: "Ajouter" + ADD_MENU_NICKNAME: "Pseudonyme" + ADD_MENU_NOTES: "Notes" + ADD_MENU_EMAIL: "Email" + ADD_MENU_PHONE: "Téléphone" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Adresse" + ADD_MENU_BIRTHDAY: "Anniversaire" + ADD_MENU_TAGS: "Tags" + BUTTON_SHARE_NONE: "Personne" + BUTTON_SHARE_ALL: "Tout le monde" + BUTTON_SYNC: "Synchronisation (CardDAV)" + COMPOSE: + TITLE_FROM: "De" + TITLE_TO: "À" + TITLE_CC: "CC" + TITLE_BCC: "CCI" + TITLE_REPLY_TO: "Répondre à" + TITLE_SUBJECT: "Sujet" + LINK_SHOW_INPUTS: "voir tous les champs" + BUTTON_SEND: "Envoyer" + BUTTON_SAVE: "Enregistrer" + BUTTON_DELETE: "Supprimer" + BUTTON_CANCEL: "Annuler" + BUTTON_MINIMIZE: "Réduire" + SAVED_TIME: "Enregistré à %TIME%" + SAVED_ERROR_ON_SEND: "Le message a été envoyé mais n'a pas été enregistré dans le dossier des messages envoyés" + DISCARD_UNSAVED_DATA: "Abandonner les données non enregistrées ?" + ATTACH_FILES: "Joindre des fichiers" + ATTACH_DROP_FILES_DESC: "Glisser les fichiers ici" + ATTACH_ITEM_CANCEL: "Annuler" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME% %EMAIL% a écrit" + FORWARD_MESSAGE_TOP_TITLE: "-------- Message transféré -------" + FORWARD_MESSAGE_TOP_FROM: "De" + FORWARD_MESSAGE_TOP_TO: "À" + FORWARD_MESSAGE_TOP_CC: "CC" + FORWARD_MESSAGE_TOP_SENT: "Envoyé" + FORWARD_MESSAGE_TOP_SUBJECT: "Objet" + EMPTY_TO_ERROR_DESC: "Merci de spécifier au moins un destinataire" + NO_ATTACHMENTS_HERE_DESC: "Aucune pièce jointe." + ATTACHMENTS_ERROR_DESC: "Attention ! Toutes les pièces jointes n'ont pas été téléchargées." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Toutes les pièces jointes n'ont pas encore été téléchargées" + BUTTON_REQUEST_READ_RECEIPT: "Demander une confirmation de lecture" + BUTTON_MARK_AS_IMPORTANT: "Marquer comme important" + BUTTON_OPEN_PGP: "OpenPGP (Texte non formaté uniquement)" + BUTTON_REQUEST_DSN: "Demander un accusé de réception" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Fermer" + POPUPS_ASK: + BUTTON_YES: "Oui" + BUTTON_NO: "Non" + DESC_WANT_CLOSE_THIS_WINDOW: "Êtes-vous sûr de vouloir fermer cette fenêtre ?" + DESC_WANT_DELETE_MESSAGES: "Êtes-vous sûr de vouloir supprimer ce(s) message(s) ?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Choisir la langue" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Ajouter un compte ?" + BUTTON_ADD_ACCOUNT: "Ajouter" + TITLE_UPDATE_ACCOUNT: "Mettre à jour le compte ?" + BUTTON_UPDATE_ACCOUNT: "Mettre à jour" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Ajouter une identité ?" + TITLE_UPDATE_IDENTITY: "Mettre à jour l'identité ?" + BUTTON_ADD_IDENTITY: "Ajouter" + BUTTON_UPDATE_IDENTITY: "Mettre à jour" + LABEL_EMAIL: "Adresse email" + LABEL_NAME: "Nom" + LABEL_REPLY_TO: "Répondre à" + LABEL_SIGNATURE: "Signature" + LABEL_CC: "Cc" + LABEL_BCC: "Cci" + LABEL_SIGNATURE_INSERT_BEFORE: "Insérer la signature avant le texte cité dans les réponses" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Créer un dossier ?" + LABEL_NAME: "Nom du dossier" + LABEL_PARENT: "Dossier parent" + BUTTON_CREATE: "Créer" + BUTTON_CANCEL: "Annuler" + BUTTON_CLOSE: "Fermer" + TITLE_CREATING_PROCESS: "Création du dossier" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Purger tous les messages du dossier ?" + BUTTON_CLEAR: "Vider" + BUTTON_CANCEL: "Annuler" + BUTTON_CLOSE: "Fermer" + DANGER_DESC_WARNING: "ATTENTION !" + DANGER_DESC_HTML_1: "Cette action effacera tous les emails du dossier %FOLDER% de manière définitive." + DANGER_DESC_HTML_2: "Une fois lancé, le processus ne peut pas être interrompu ou annulé." + TITLE_CLEARING_PROCESS: "Purge du dossier..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Importer la clef OpenPGP" + BUTTON_IMPORT_OPEN_PGP_KEY: "Importer" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "Voir la clef OpenPGP" + BUTTON_SELECT: "Sélectionner" + BUTTON_CLOSE: "Fermer" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Générer les clés OpenPGP" + LABEL_EMAIL: "Email" + LABEL_NAME: "Nom" + LABEL_PASSWORD: "Mot de passe" + LABEL_KEY_BIT_LENGTH: "Longueur de la clé" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Générer" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "Signer/chiffrer avec OpenPGP" + LABEL_SIGN: "Signer" + LABEL_ENCRYPT: "Chiffer" + LABEL_PASSWORD: "Mot de passe" + BUTTON_SIGN: "Signer" + BUTTON_ENCRYPT: "Chiffrer" + BUTTON_SIGN_AND_ENCRYPT: "Signer et chiffrer" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" + LABEL_KEY: "Clé Privée" + LABEL_PASSWORD: "Mot de passe" + BUTTON_DECRYPT: "Déchiffrer" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "Test d'authentification en deux étapes" + LABEL_CODE: "Code" + BUTTON_TEST: "Test" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Créer un filtre ?" + TITLE_EDIT_FILTER: "Mettre à jour le filtre ?" + FILTER_NAME: "Nom" + LEGEND_CONDITIONS: "Conditions" + LEGEND_ACTIONS: "Actions" + BUTTON_DONE: "Fait" + BUTTON_ADD_CONDITION: "Ajouter une condition" + SELECT_ACTION_NONE: "Aucune" + SELECT_ACTION_MOVE_TO: "Déplacer vers" + SELECT_ACTION_FORWARD_TO: "Faire suivre à" + SELECT_ACTION_REJECT: "Rejeter" + SELECT_ACTION_VACATION_MESSAGE: "Message d'absence" + SELECT_ACTION_DISCARD: "Exclure" + SELECT_FIELD_FROM: "De" + SELECT_FIELD_RECIPIENTS: "Destinataires (A ou CC)" + SELECT_FIELD_SUBJECT: "Sujet" + SELECT_FIELD_HEADER: "En-tête" + SELECT_FIELD_SIZE: "Taille" + SELECT_TYPE_CONTAINS: "Contient" + SELECT_TYPE_NOT_CONTAINS: "Ne contient pas" + SELECT_TYPE_MATCHES: "Substitutions (* et ? supportés)" + SELECT_TYPE_NOT_MATCHES: "Pas de substitutions (* et ? supportés)" + SELECT_TYPE_REGEXP: "Expression régulière" + SELECT_TYPE_NOT_REGEXP: "Pas d'expression régulière" + SELECT_TYPE_EQUAL_TO: "Égal à" + SELECT_TYPE_NOT_EQUAL_TO: "Différent de" + SELECT_TYPE_OVER: "Au-dessus de" + SELECT_TYPE_UNDER: "Au-dessous de" + SELECT_MATCH_ANY: "Correspondant à l'une des règles suivantes" + SELECT_MATCH_ALL: "Correspondant à toutes les règles suivantes" + MARK_AS_READ_LABEL: "Marquer comme lu" + REPLY_INTERVAL_LABEL: "Délai de réponse (jours)" + KEEP_LABEL: "Garder" + STOP_LABEL: "Ne pas arrêter le traitement des règles" + EMAIL_LABEL: "Email" + VACATION_SUBJECT_LABEL: "Sujet (optionnel)" + VACATION_MESSAGE_LABEL: "Message" + VACATION_RECIPIENTS_LABEL: "Destinataires (séparés par des virgules)" + REJECT_MESSAGE_LABEL: "Message rejeté" + ALL_INCOMING_MESSAGES_DESC: "Tous les messages entrants" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Sélectionner les dossiers systèmes" + SELECT_CHOOSE_ONE: "Faites un choix" + SELECT_UNUSE_NAME: "Ne pas utiliser" + LABEL_SENT: "Envoyés" + LABEL_DRAFTS: "Brouillons" + LABEL_SPAM: "Indésirables" + LABEL_TRASH: "Corbeille" + LABEL_ARCHIVE: "Archiver" + BUTTON_CANCEL: "Annuler" + BUTTON_CLOSE: "Fermer" + NOTIFICATION_SENT: | + Vous n'avez pas sélectionné de dossier "Envoyés" où copier les messages après envoi. + Si vous ne souhaitez pas enregistrer une copie des messages envoyés, sélectionnez l'option "Ne pas utiliser". + NOTIFICATION_DRAFTS: "Vous n'avez pas sélectionné de dossier \"Brouillons\" où enregistrer les messages en cours de rédaction." + NOTIFICATION_SPAM: | + Vous n'avez pas sélectionné de dossier "Spam" où placer les indésirables. + Si vous ne souhaitez pas supprimer définitivement les messages, sélectionnez l'option "Ne pas utiliser". + NOTIFICATION_TRASH: | + Vous n'avez pas sélectionné de dossier "Corbeille" où placer les messages supprimés. + Si vous ne souhaitez pas supprimer définitivement les messages, sélectionnez l'option "Ne pas utiliser". + NOTIFICATION_ARCHIVE: "Vous n'avez pas sélectionné de dossier \"Archive\" où placer les messages archivés.\n" + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "Authentification en deux étapes" + LABEL_ENABLE_TWO_FACTOR: "Activer l'authentification en deux étapes" + LABEL_TWO_FACTOR_USER: "Utilisateur" + LABEL_TWO_FACTOR_STATUS: "Statut" + LABEL_TWO_FACTOR_SECRET: "Secret" + LABEL_TWO_FACTOR_BACKUP_CODES: "Code de sauvegarde" + BUTTON_CREATE: "Créer une nouvelle clé secrète" + BUTTON_ACTIVATE: "Activer" + BUTTON_CLEAR: "Effacer" + BUTTON_LOGOUT: "Déconnexion" + BUTTON_DONE: "Fait" + BUTTON_TEST: "Tester" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Montrer la clé secrète" + BUTTON_HIDE_SECRET: "Masquer la clé secrète" + TWO_FACTOR_REQUIRE_DESC: "Votre compte requiert la configuration d'une vérification en deux étapes." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configuré" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Non configuré" + TWO_FACTOR_SECRET_DESC: >- + Importez ces informations dans votre client Google Authenticator (ou un autre + client TOTP) en utilisant le code QR fourni ci-dessous ou en entrant les valeurs + manuellement. + TWO_FACTOR_BACKUP_CODES_DESC: >- + Si vous ne pouvez pas recevoir les codes par Google Authenticator, vous pouvez + utiliser les codes de sauvegarde pour vous connecter. Après avoir fait cela, + il deviendra inactif. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Vous ne pouvez pas modifier ce paramètre avant de l'avoir essayé." + TITLES: + LOADING: "Chargement" + LOGIN: "Identifiant" + MAILBOX: "Boîte mail" + SETTINGS: "Paramètres" + COMPOSE: "Nouveau message" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Le fichier est trop volumineux" + ERROR_FILE_PARTIALLY_UPLOADED: "Le fichier a été envoyé partiellement à cause d'une erreur inconnue" + ERROR_NO_FILE_UPLOADED: "Aucun fichier téléversé" + ERROR_MISSING_TEMP_FOLDER: "Le fichier temporaire est manquant" + ERROR_ON_SAVING_FILE: "Une erreur inconnue s'est produite" + ERROR_FILE_TYPE: "Type de fichier invalide" + ERROR_UNKNOWN: "Une erreur inconnue de téléversement de fichier s'est produite" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> Non-formaté" + TEXT_SWITCHER_RICH_FORMATTING: "Format riche" + TEXT_SWITCHER_CONFIRM: "Le formatage du texte et les images seront perdus. Êtes-vous sûr de vouloir continuer ?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Personnel" + LABEL_GENERAL_NAME: "Général" + LABEL_CONTACTS_NAME: "Contacts" + LABEL_FOLDERS_NAME: "Dossiers" + LABEL_ACCOUNTS_NAME: "Comptes" + LABEL_IDENTITY_NAME: "Identité" + LABEL_IDENTITIES_NAME: "Identités" + LABEL_FILTERS_NAME: "Filtres" + LABEL_TEMPLATES_NAME: "Modèles" + LABEL_SECURITY_NAME: "Sécurité" + LABEL_SOCIAL_NAME: "Social" + LABEL_THEMES_NAME: "Thèmes" + LABEL_CHANGE_PASSWORD_NAME: "Mot de passe" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Retour" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filtres" + BUTTON_SAVE: "Enregistrer" + BUTTON_ADD_FILTER: "Ajouter un filtre" + BUTTON_DELETE: "Effacer" + BUTTON_RAW_SCRIPT: "Utiliser le script d'un utilisateur" + SUBNAME_NONE: "Aucun" + SUBNAME_MOVE_TO: "Déplacer vers \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Faire suivre à \"%EMAIL%\"" + SUBNAME_REJECT: "Rejeter" + SUBNAME_VACATION_MESSAGE: "Message d'absence" + SUBNAME_DISCARD: "Exclure" + CAPABILITY_LABEL: "Capacité" + LOADING_PROCESS: "Mise à jour de la liste de filtres" + DELETING_ASK: "Êtes-vous sûr ?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Ces changements doivent être enregistrés sur le serveur." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identité" + LABEL_DISPLAY_NAME: "Nom" + LABEL_REPLY_TO: "Répondre à" + LABEL_SIGNATURE: "Signature" + LABEL_ADD_SIGNATURE_TO_ALL: "Ajouter votre signature à tous les messages sortants" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Sécurité" + LABEL_CONFIGURE_TWO_FACTOR: "Configurer l'authentification en deux étapes" + LABEL_AUTOLOGOUT: "Déconnexion automatique" + AUTOLOGIN_NEVER_OPTION_NAME: "Jamais" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% heure(s)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Général" + LABEL_LANGUAGE: "Langue" + LABEL_IDENTITY: "Identité" + LABEL_LAYOUT: "Disposition" + LABEL_LAYOUT_NO_SPLIT: "Pas de séparation" + LABEL_LAYOUT_VERTICAL_SPLIT: "Séparation verticale" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Séparation horizontale" + LABEL_EDITOR: "Éditeur de texte par défaut" + LABEL_EDITOR_HTML: "HTML" + LABEL_EDITOR_PLAIN: "Non-formaté" + LABEL_EDITOR_HTML_FORCED: "HTML (forcé)" + LABEL_EDITOR_PLAIN_FORCED: "Non-formaté (forcé)" + LABEL_ANIMATION: "Animation de l'interface" + LABEL_ANIMATION_FULL: "Plein" + LABEL_ANIMATION_NORMAL: "Normal" + LABEL_ANIMATION_NONE: "Aucune" + LABEL_VIEW_OPTIONS: "Voir les options" + LABEL_USE_PREVIEW_PANE: "Utiliser le panneau de prévisualisation" + LABEL_USE_CHECKBOXES_IN_LIST: "Afficher des cases à cocher dans la liste" + LABEL_USE_THREADS: "Regrouper en conversations" + LABEL_REPLY_SAME_FOLDER: "Placer les réponses dans le dossier du message" + LABEL_SHOW_IMAGES: "Toujours afficher les images dans le mail" + LABEL_SHOW_ANIMATION: "Voir les animations" + LABEL_MESSAGE_PER_PAGE: "Messages par page" + LABEL_NOTIFICATIONS: "Notifications" + LABEL_SOUND_NOTIFICATION: "Son de notification" + LABEL_CHROME_NOTIFICATION_DESC: "Afficher un pop-up de notification pour les nouveaux messages" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Bloqué par le navigateur)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Contacts" + LABEL_CONTACTS_AUTOSAVE: "Ajouter automatiquement les destinataires à votre carnet d'adresses" + LEGEND_CONTACTS_SYNC: "Synchronisation à distance (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Activer la synchronisation à distance" + LABEL_CONTACTS_SYNC_SERVER: "Serveur" + LABEL_CONTACTS_SYNC_AB_URL: "URL du carnet d'adresses" + LABEL_CONTACTS_SYNC_USER: "Utilisateur" + LABEL_CONTACTS_SYNC_PASSWORD: "Mot de passe" + SETTINGS_THEMES: + LEGEND_THEMES: "Thèmes" + LEGEND_THEMES_CUSTOM: "Configuration du thème personnel" + LABEL_CUSTOM_TYPE: "Type" + LABEL_CUSTOM_TYPE_LIGHT: "Lumineux" + LABEL_CUSTOM_TYPE_DARK: "Sombre" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Image de fond" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Envoyer une image de fond (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Fichier trop volumineux" + ERROR_FILE_TYPE_ERROR: "Type de fichier invalide (JPG et PNG seulement)" + ERROR_UNKNOWN: "Une erreur inconnue de téléversement de fichier s'est produite" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Se connecter à Google" + BUTTON_GOOGLE_DISCONNECT: "Se déconnecter de Google" + MAIN_GOOGLE_DESC: "Après l'activation de la connexion via Google, vous pouvez vous connecter à ce compte en utilisant le bouton Google sur l'écran de connexion." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Se connecter à Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Se déconnecter de Facebook" + MAIN_FACEBOOK_DESC: "Après l'activation de la connexion via Facebook, vous pouvez vous connecter à ce compte en utilisant le bouton Facebook sur l'écran de connexion." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Se connecter à Twitter" + BUTTON_TWITTER_DISCONNECT: "Se déconnecter de Twitter" + MAIN_TWITTER_DESC: "Après l'activation de la connexion via Twitter, vous pouvez vous connecter à ce compte en utilisant le bouton Twitter sur l'écran de connexion." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Liste des dossiers" + BUTTON_CREATE: "Créer un dossier" + BUTTON_SYSTEM: "Dossiers systèmes" + BUTTON_DELETE: "Supprimer" + BUTTON_SUBSCRIBE: "S'abonner" + BUTTON_UNSUBSCRIBE: "Se désabonner" + LOADING_PROCESS: "Mise à jour de la liste des dossiers" + CREATING_PROCESS: "Création d'un dossier" + DELETING_PROCESS: "Suppression d'un dossier" + RENAMING_PROCESS: "Renommer un dossier" + DELETING_ASK: "Êtes-vous sûr ?" + TO_MANY_FOLDERS_DESC_1: "Vous avez trop de dossiers !" + TO_MANY_FOLDERS_DESC_2: "Seulement une partie d'entre eux ont été affichés afin de limiter les problèmes de performance." + HELP_DELETE_FOLDER: "Supprimer le dossier" + HELP_SHOW_HIDE_FOLDER: "Afficher/masquer le dossier" + HELP_CHECK_FOR_NEW_MESSAGES: "Cocher/Décocher pour les nouveaux messages" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Liste des comptes" + LEGEND_IDENTITIES: "Identités" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Comptes et Identités" + BUTTON_ADD_ACCOUNT: "Ajouter un compte" + BUTTON_ADD_IDENTITY: "Ajouter une identité" + BUTTON_DELETE: "Supprimer" + LOADING_PROCESS: "Mise à jour de la liste des comptes" + DELETING_ASK: "Êtes-vous sûr ?" + DEFAULT_IDENTITY_LABEL: "défaut" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identité" + LEGEND_IDENTITIES: "Identités supplémentaires" + LABEL_DEFAULT: "Défaut" + LABEL_DISPLAY_NAME: "Nom" + LABEL_REPLY_TO: "Répondre à" + LABEL_SIGNATURE: "Signature" + LABEL_ADD_SIGNATURE_TO_ALL: "Ajouter votre signature à tous les messages sortants" + BUTTON_ADD_IDENTITY: "Ajouter une identitié" + BUTTON_DELETE: "Supprimer" + LOADING_PROCESS: "Met à jour la liste d'identités" + DELETING_ASK: "Êtes-vous sûr ?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Modifier le mot de passe" + LABEL_CURRENT_PASSWORD: "Mot de passe actuel" + LABEL_NEW_PASSWORD: "Nouveau mot de passe" + LABEL_REPEAT_PASSWORD: "Confirmation du nouveau mot de passe" + BUTTON_UPDATE_PASSWORD: "Enregistrer le nouveau mot de passe" + ERROR_PASSWORD_MISMATCH: "Les mots de passe ne correspondent pas, merci de réessayer" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Importer la clé OpenPGP" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Générer les clés OpenPGP" + TITLE_PRIVATE: "Privée" + TITLE_PUBLIC: "Publique" + DELETING_ASK: "Êtes-vous sûr ?" + GENERATE_ONLY_HTTPS: "HTTPS seulement" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Brouillon sauvegardé automatiquement" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Aide pour les raccourcis clavier" + TAB_MAILBOX: "Boîte aux lettres" + TAB_MESSAGE_LIST: "Liste des messages" + TAB_MESSAGE_VIEW: "Message" + TAB_COMPOSE: "Écrire" + LABEL_OPEN_USER_DROPDOWN: "Ouvrir la liste déroulante des utilisateurs" + LABEL_REPLY: "Répondre" + LABEL_REPLY_ALL: "Répondre à tous" + LABEL_FORWARD: "Transférer" + LABEL_FORWARD_MULTIPLY: "Transférer comme pièce(s) jointe(s)" + LABEL_HELP: "Aide" + LABEL_CHECK_ALL: "Sélectionner tous les messages" + LABEL_ARCHIVE: "Archiver" + LABEL_DELETE: "Supprimer" + LABEL_OPEN_THREAD: "Ouvrir le message selectionné" + LABEL_MOVE: "Déplacer" + LABEL_READ: "Marquer les messages sélectionnés comme lus" + LABEL_UNREAD: "Marquer les messages sélectionnés comme non-lus" + LABEL_IMPORTANT: "Important, drapeau sélectionnés" + LABEL_SEARCH: "Rechercher" + LABEL_CANCEL_SEARCH: "Annuler la recherche" + LABEL_FULLSCREEN_ENTER: "Plein écran (Mise en page avec aperçu)" + LABEL_VIEW_MESSAGE_ENTER: "Voir le message (Mise en page sans aperçu)" + LABEL_SWITCH_TO_MESSAGE: "Aller au message sélectionné" + LABEL_SWITCH_TO_FOLDER_LIST: "Aller à la liste des dossiers" + LABEL_FULLSCREEN_TOGGLE: "Basculer en mode plein écran" + LABEL_BLOCKQUOTES_TOGGLE: "Basculer les citations en bloc" + LABEL_THREAD_NEXT: "Message précédent de la liste" + LABEL_THREAD_PREV: "Message suivant de la liste" + LABEL_PRINT: "Imprimer" + LABEL_EXIT_FULLSCREEN: "Quitter le mode plein écran" + LABEL_CLOSE_MESSAGE: "Fermer le message (Mise en page sans aperçu)" + LABEL_SWITCH_TO_LIST: "Retourner à la liste des messages" + LABEL_OPEN_COMPOSE_POPUP: "Ouvrir la fenêtre d'édition" + LABEL_MINIMIZE_COMPOSE_POPUP: "Réduire la fenêtre d'édition" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Liste de sélection des identités" + LABEL_SAVE_MESSAGE: "Enregistrer le message" + LABEL_SEND_MESSAGE: "Envoyer le message" + LABEL_CLOSE_COMPOSE: "Fermer la fenêtre d'édition" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "Aucune clé publique n'a pu être trouvée" + NO_PUBLIC_KEYS_FOUND_FOR: "Aucune clé publique n'a pu être trouvée pour \"%EMAIL%\"" + NO_PRIVATE_KEY_FOUND: "Aucune clé privée n'a pu être trouvée" + NO_PRIVATE_KEY_FOUND_FOR: "Aucune clé privée n'a pu être trouvée pour \"%EMAIL%\"" + ADD_A_PUBLICK_KEY: "Ajouter une clé publique" + SELECT_A_PRIVATE_KEY: "Choisir une clé privée" + UNVERIFIRED_SIGNATURE: "Signature non vérifiée" + DECRYPTION_ERROR: "Erreur lors du déchiffrement OpenPGP" + GOOD_SIGNATURE: "Signature valide pour %USER%" + PGP_ERROR: "Erreur OpenPGP: %ERROR%" + SPECIFY_FROM_EMAIL: "Merci de spécifier une adresse email pour DE" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Merci de spécifier au moins un destinataire" + NOTIFICATIONS: + INVALID_TOKEN: "Jeton invalide" + AUTH_ERROR: "L'authentification a échoué" + ACCESS_ERROR: "Erreur d'accès" + CONNECTION_ERROR: "Serveur injoignable" + CAPTCHA_ERROR: "CAPTCHA incorrect." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Cet ID social n'est pas encore assigné à une adresse email. Connectez-vous + en utilisant les informations d'identification du courrier électronique et + activez cette fonctionnalité dans les paramètres de votre compte. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Cet ID social n'est pas encore assigné à une adresse email. Connectez-vous + en utilisant les informations d'identification du courrier électronique et + activez cette fonctionnalité dans les paramètres de votre compte. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Cet ID social n'est pas encore assigné à une adresse email. Connectez-vous + en utilisant les informations d'identification du courrier électronique et + activez cette fonctionnalité dans les paramètres de votre compte. + DOMAIN_NOT_ALLOWED: "Ce domaine n'est pas autorisé" + ACCOUNT_NOT_ALLOWED: "Ce compte n'est pas autorisé" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Double authentification requise" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Erreur lors de la double authentification" + COULD_NOT_SAVE_NEW_PASSWORD: "Impossible d'enregistrer le nouveau mot de passe" + CURRENT_PASSWORD_INCORRECT: "Le mot de passe actuel est incorrect" + NEW_PASSWORD_SHORT: "Le mot de passe est trop court" + NEW_PASSWORD_WEAK: "Le mot de passe n'est pas assez fort" + NEW_PASSWORD_FORBIDDENT: "Le mot de passe contient des caractères invalides" + CONTACTS_SYNC_ERROR: "Erreur de synchronisation des contacts" + CANT_GET_MESSAGE_LIST: "Impossible d'obtenir la liste des messages" + CANT_GET_MESSAGE: "Impossible d'obtenir le message" + CANT_DELETE_MESSAGE: "Impossible de supprimer le message" + CANT_MOVE_MESSAGE: "Impossible de déplacer le message" + CANT_SAVE_MESSAGE: "Impossible d'enregistrer le message" + CANT_SEND_MESSAGE: "Impossible d'envoyer le message" + INVALID_RECIPIENTS: "Destinataires invalides" + CANT_SAVE_FILTERS: "Impossible d'enregistrer les filtres" + CANT_GET_FILTERS: "Impossible d'obtenir les filtres" + FILTERS_ARE_NOT_CORRECT: "Les filtres ne sont pas corrects" + CANT_CREATE_FOLDER: "Impossible de créer le dossier" + CANT_RENAME_FOLDER: "Impossible de renommer le dossier" + CANT_DELETE_FOLDER: "Impossible de supprimer le dossier" + CANT_DELETE_NON_EMPTY_FOLDER: "Impossible de supprimer un dossier non vide" + CANT_SUBSCRIBE_FOLDER: "Impossible de s'abonner au dossier" + CANT_UNSUBSCRIBE_FOLDER: "Impossible de se désabonner du dossier" + CANT_SAVE_SETTINGS: "Impossible d'enregistrer les paramètres" + CANT_SAVE_PLUGIN_SETTINGS: "Impossible d'enregistrer les paramètres" + DOMAIN_ALREADY_EXISTS: "Le domaine existe déjà" + CANT_INSTALL_PACKAGE: "Impossible d'installer le paquet" + CANT_DELETE_PACKAGE: "Impossible de supprimer le paquet" + INVALID_PLUGIN_PACKAGE: "Ce plug-in est invalide" + UNSUPPORTED_PLUGIN_PACKAGE: "Ce plug-in n'est pas supporté" + LICENSING_SERVER_IS_UNAVAILABLE: "Le serveur d'abonnement est inaccessible" + LICENSING_DOMAIN_EXPIRED: "L'abonnement pour ce domaine a expiré." + LICENSING_DOMAIN_BANNED: "L'abonnement pour ce domaine est interdit." + DEMO_SEND_MESSAGE_ERROR: "Pour des raisons de sécurité, ce compte de démonstration n'est pas autorisé à envoyer des messages à des adresses e-mail externes !" + DEMO_ACCOUNT_ERROR: "Pour des raisons de sécurité, ce compte n'est pas autorisé à faire cette action !" + ACCOUNT_ALREADY_EXISTS: "Ce compte existe déjà" + ACCOUNT_DOES_NOT_EXIST: "Ce compte n'existe pas" + MAIL_SERVER_ERROR: "Une erreur est survenue lors de l'accès au serveur mail" + INVALID_INPUT_ARGUMENT: "Argument invalide" + UNKNOWN_ERROR: "Erreur inconnue" + STATIC: + BACK_LINK: "Recharger" + DOMAIN_LIST_DESC: "Liste des domaines auxquels le webmail est autorisé à accéder." + PHP_EXSTENSIONS_ERROR_DESC: "Les extensions PHP nécessaires ne sont pas disponibles dans votre configuration de PHP !" + PHP_VERSION_ERROR_DESC: "Votre version de PHP (% VERSION%) est inférieure à la minimale requise 5.3.0 !" + NO_SCRIPT_TITLE: "JavaScript est nécessaire pour cette application." + NO_SCRIPT_DESC: | + Le support de JavaScript n'est pas disponible dans votre navigateur. + S'il vous plaît activez le support de JavaScript dans les paramètres de votre navigateur et réessayez. + NO_COOKIE_TITLE: "Le support des cookies est nécessaire pour cette application." + NO_COOKIE_DESC: | + Le support des cookies n'est pas disponible dans votre navigateur. + S'il vous plaît activez le support des cookies dans les paramètres de votre navigateur et réessayez. + BAD_BROWSER_TITLE: "Votre navigateur est obsolète." + BAD_BROWSER_DESC: | + Pour utiliser toutes les fonctionnalités de l'application, + téléchargez et installez l'un de ces navigateurs : diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/hu_HU.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/hu_HU.yml new file mode 100755 index 00000000..86b72272 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/hu_HU.yml @@ -0,0 +1,717 @@ +hu_HU: + LOGIN: + LABEL_EMAIL: "E-mail" + LABEL_LOGIN: "Bejelentkezés" + LABEL_PASSWORD: "Jelszó" + LABEL_SIGN_ME: "Megjegyzés" + LABEL_VERIFICATION_CODE: "Megerősítő kód" + LABEL_DONT_ASK_VERIFICATION_CODE: "Két hétig ne kérje a kódot" + BUTTON_SIGN_IN: "Belépés" + TITLE_SIGN_IN_GOOGLE: "Belépés Google használatával" + TITLE_SIGN_IN_FACEBOOK: "Belépés Facebook használatával" + TITLE_SIGN_IN_TWITTER: "Belépés Twitter használatával" + LABEL_FORGOT_PASSWORD: "Elfelejtett jelszó" + LABEL_REGISTRATION: "Regisztráció" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Fiók hozzáadás" + BUTTON_SETTINGS: "Beállítások" + BUTTON_HELP: "Súgó" + BUTTON_LOGOUT: "Kilépés" + MOBILE: + BUTTON_MOBILE_VERSION: "Mobil verzió" + BUTTON_DESKTOP_VERSION: "Asztali verzió" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Keresés" + TITLE_ADV: "Részletes keresés" + LABEL_ADV_FROM: "Feladó" + LABEL_ADV_TO: "Címzett" + LABEL_ADV_SUBJECT: "Tárgy" + LABEL_ADV_TEXT: "Szöveg" + LABEL_ADV_HAS_ATTACHMENT: "Van melléklete" + LABEL_ADV_HAS_ATTACHMENTS: "Vannak mellékletei" + LABEL_ADV_FLAGGED: "Megjelölve" + LABEL_ADV_UNSEEN: "Észrevétlen" + LABEL_ADV_DATE: "Dátum" + LABEL_ADV_DATE_ALL: "Összes" + LABEL_ADV_DATE_3_DAYS: "Legfeljebb 3 napos" + LABEL_ADV_DATE_7_DAYS: "Legfeljebb 1 hetes" + LABEL_ADV_DATE_MONTH: "Legfeljebb 1 hónapos" + LABEL_ADV_DATE_3_MONTHS: "Legfeljebb 3 hónapos" + LABEL_ADV_DATE_6_MONTHS: "Legfeljebb 6 hónapos" + LABEL_ADV_DATE_YEAR: "Legfeljebb 1 éves" + BUTTON_ADV_SEARCH: "Keresés" + PREVIEW_POPUP: + FULLSCREEN: "Teljes képernyő váltása" + ZOOM: "Nagyítás ki/be" + CLOSE: "Bezárás (Esc)" + LOADING: "Betöltés..." + GALLERY_PREV: "Előző (Bal nyíl gomb)" + GALLERY_NEXT: "Következő (Jobb nyíl gomb)" + GALLERY_COUNTER: "%curr% / %total%" + IMAGE_ERROR: "A képet nem sikerült betölteni." + AJAX_ERROR: "A tartalmat nem sikerült betölteni." + FOLDER_LIST: + BUTTON_COMPOSE: "Levélírás" + BUTTON_CONTACTS: "Névjegyek" + BUTTON_NEW_MESSAGE: "Új üzenet" + INBOX_NAME: "Beérkező levelek" + SENT_NAME: "Elküldött levelek" + DRAFTS_NAME: "Piszkozatok" + SPAM_NAME: "Levélszemét" + TRASH_NAME: "Lomtár" + ARCHIVE_NAME: "Archívum" + QUOTA: + TITLE: "Helyfoglalás" + MESSAGE_LIST: + BUTTON_RELOAD: "Üzenetlista újratöltés" + BUTTON_MOVE_TO: "Áthelyezés ide" + BUTTON_DELETE: "Törlés" + BUTTON_ARCHIVE: "Archívum" + BUTTON_SPAM: "Levélszemét" + BUTTON_NOT_SPAM: "Nem szemét" + BUTTON_EMPTY_FOLDER: "Mappa ürítés" + BUTTON_MULTY_FORWARD: "Továbbítás melléklet(en)ként" + BUTTON_DELETE_WITHOUT_MOVE: "Törlés véglegesen" + BUTTON_MORE: "Tovább" + MENU_SET_SEEN: "Megjelölés olvasottként" + MENU_SET_ALL_SEEN: "Összes megjelölése olvasottként" + MENU_UNSET_SEEN: "Megjelölés olvasatlanként" + MENU_SET_FLAG: "Megjelölés" + MENU_UNSET_FLAG: "Jelöletlen" + MENU_SELECT_ALL: "Összes" + MENU_SELECT_NONE: "Nincs" + MENU_SELECT_INVERT: "Invertálás" + MENU_SELECT_UNSEEN: "Olvasatlan" + MENU_SELECT_SEEN: "Olvasott" + MENU_SELECT_FLAGGED: "Megjelölt" + MENU_SELECT_UNFLAGGED: "Jelöletlen" + EMPTY_LIST: "Lista üres." + EMPTY_SEARCH_LIST: "Nincs a keresésnek megfelelő levél." + SEARCH_RESULT_FOR: "Keresési eredmények ehhez: \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "vissza az üzenetlistához" + LIST_LOADING: "Betöltés" + EMPTY_SUBJECT_TEXT: "(Nincs tárgy)" + PUT_MESSAGE_HERE: "Húzz ide egy üzenetet, hogy megjelenjen a listában" + TODAY_AT: "ma ekkor: %TIME%" + YESTERDAY_AT: "tegnap ekkor: %TIME%" + SEARCH_PLACEHOLDER: "Keresés" + NEW_MESSAGE_NOTIFICATION: "%COUNT% olvasatlan üzeneted van!" + QUOTA_SIZE: "Felhasználva %SIZE% (%PROC%%) ebből: %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Szerkesztés" + BUTTON_BACK: "Vissza" + BUTTON_CLOSE: "Bezárás" + BUTTON_DELETE: "Tőrlés" + BUTTON_UNSUBSCRIBE: "Leiratkozás erről a listáról" + BUTTON_ARCHIVE: "Archívum" + BUTTON_SPAM: "Levélszemét" + BUTTON_NOT_SPAM: "Nem levélszemét" + BUTTON_MOVE_TO: "Áthelyezés" + BUTTON_MORE: "Tovább" + BUTTON_REPLY: "Válasz" + BUTTON_REPLY_ALL: "Válasz mindenkinek" + BUTTON_FORWARD: "Továbbítás" + BUTTON_FORWARD_AS_ATTACHMENT: "Továbbítás mellékletként" + BUTTON_EDIT_AS_NEW: "Szerkesztés újként" + BUTTON_SHOW_IMAGES: "Külső képek megjelenítése" + BUTTON_NOTIFY_READ_RECEIPT: "A feladó értesítést kért a levél elolvasása után." + BUTTON_IN_NEW_WINDOW: "Megtekintés új ablakban" + BUTTON_THREAD_LIST: "Szál lista" + BUTTON_THREAD_PREV: "Előző" + BUTTON_THREAD_NEXT: "Következő" + BUTTON_THREAD_MORE: "További üzenetek" + MENU_HEADERS: "Üzenet fejléc megjelenítése" + MENU_VIEW_ORIGINAL: "Eredeti megjelenítése" + MENU_DOWNLOAD_ORIGINAL: ".eml fájl letöltés" + MENU_FILTER_SIMILAR: "Hasonló üzenetek szűrése" + MENU_PRINT: "Nyomtatás" + EMPTY_SUBJECT_TEXT: "(Nincs tárgy)" + LABEL_SUBJECT: "Tárgy" + LABEL_DATE: "Dátum" + LABEL_FROM: "Feladó" + LABEL_FROM_SHORT: "feladó" + LABEL_TO: "Címzett" + LABEL_TO_SHORT: "címzett" + LABEL_CC: "Másolat" + LABEL_BCC: "Titkos másolat" + LABEL_REPLY_TO: "Válaszcím" + PRINT_LABEL_FROM: "Feladó" + PRINT_LABEL_TO: "Címzett" + PRINT_LABEL_CC: "Másolat" + PRINT_LABEL_BCC: "Titkos másolat" + PRINT_LABEL_REPLY_TO: "Válaszcím" + PRINT_LABEL_DATE: "Dátum" + PRINT_LABEL_SUBJECT: "Tárgy" + PRINT_LABEL_ATTACHMENTS: "Mellékletek" + MESSAGE_LOADING: "Betöltés" + MESSAGE_VIEW_DESC: "Válassz egy üzenetet a listából, hogy megjelenjen itt." + MESSAGE_VIEW_MOVE_DESC: "A cél kiválasztásához a bal oldali panelen kattints a mappa nevére." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Jelszó" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP aláírt üzenet (kattints az ellenőrzéshez)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP kódolt üzenet (kattints a visszafejtéshez)" + LINK_DOWNLOAD_AS_ZIP: "Letöltés zip fájlként" + LINK_SAVE_TO_OWNCLOUD: "Mentés ownCloud-ra" + LINK_SAVE_TO_CLOUD: "Mentés a felhőbe" + LINK_SAVE_TO_DROPBOX: "Mentés Dropbox-ra" + READ_RECEIPT: + SUBJECT: "Visszaigazolás (megjelenítve) - %SUBJECT%" + BODY: | + Ez egy ide küldött üzenet olvasási visszaigazolása: %READ-RECEIPT%. + + Megjegyzés: Ez az olvasási visszaigazolás csak azt igazolja, hogy az üzenet megjelenítésre került a címzett számítógépén. + Nincs rá garancia, hogy a címzett elolvasta volna az üzenetet illetve megértette volna annak tartalmát. + SUGGESTIONS: + SEARCHING_DESC: "Keresés..." + CONTACTS: + LEGEND_CONTACTS: "Névjegyek" + SEARCH_INPUT_PLACEHOLDER: "Keresés" + BUTTON_ADD_CONTACT: "Névjegy hozzáadás" + BUTTON_CREATE_CONTACT: "Létrehozás" + BUTTON_UPDATE_CONTACT: "Frissítés" + BUTTON_IMPORT: "Importálás (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" + BUTTON_EXPORT_CSV: "Export (csv)" + ERROR_IMPORT_FILE: "Importálás hiba (érvénytelen fájl formátum)" + LIST_LOADING: "Betöltés" + EMPTY_LIST: "Nincsenek névjegyek" + EMPTY_SEARCH: "Nem találtam névjegyeket" + CLEAR_SEARCH: "Keresés törlése" + CONTACT_VIEW_DESC: "Válassz egy névjegyet a listából, hogy itt megjelenjen." + LABEL_DISPLAY_NAME: "Megjelenítendő név" + LABEL_EMAIL: "E-mail" + LABEL_PHONE: "Telefonszám" + LABEL_WEB: "Web" + LABEL_BIRTHDAY: "Születésnap" + LINK_ADD_EMAIL: "Adj meg egy e-mail címet" + LINK_ADD_PHONE: "Adj meg egy telefonszámot" + LINK_BIRTHDAY: "Születésnap" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Add meg a megjelenítendő nevet" + PLACEHOLDER_ENTER_LAST_NAME: "Add meg a vezetéknevet" + PLACEHOLDER_ENTER_FIRST_NAME: "Add meg a keresztnevet" + PLACEHOLDER_ENTER_NICK_NAME: "Add meg a felhasználónevet" + LABEL_READ_ONLY: "Csak olvasás" + LABEL_SHARE: "Megosztás" + ADD_MENU_LABEL: "Hozzáadás" + ADD_MENU_NICKNAME: "Felhasználónév" + ADD_MENU_NOTES: "Jegyzetek" + ADD_MENU_EMAIL: "E-mail" + ADD_MENU_PHONE: "Telefonszám" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Cím" + ADD_MENU_BIRTHDAY: "Születésnap" + ADD_MENU_TAGS: "Címkék" + BUTTON_SHARE_NONE: "Semmi" + BUTTON_SHARE_ALL: "Mindenki" + BUTTON_SYNC: "Szinkronizálás (CardDAV)" + COMPOSE: + TITLE_FROM: "Feladó" + TITLE_TO: "Címzett" + TITLE_CC: "Másolat" + TITLE_BCC: "Titkos másolat" + TITLE_REPLY_TO: "Válaszcím" + TITLE_SUBJECT: "Tárgy" + LINK_SHOW_INPUTS: "összes mező" + BUTTON_SEND: "Küldés" + BUTTON_SAVE: "Mentés" + BUTTON_DELETE: "Törlés" + BUTTON_CANCEL: "Mégse" + BUTTON_MINIMIZE: "Kis méret" + SAVED_TIME: "Mentve ekkor: %TIME%" + SAVED_ERROR_ON_SEND: "Üzenet elküldve, de nem lett mentve az elküldött elemek mappájába" + DISCARD_UNSAVED_DATA: "Nem mentett adatok elvetése?" + ATTACH_FILES: "Melléklet" + ATTACH_DROP_FILES_DESC: "Húzd ide a fájlokat" + ATTACH_ITEM_CANCEL: "Mégse" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% írta" + FORWARD_MESSAGE_TOP_TITLE: "-------- Továbbított üzenet -------" + FORWARD_MESSAGE_TOP_FROM: "Feladó" + FORWARD_MESSAGE_TOP_TO: "Címzett" + FORWARD_MESSAGE_TOP_CC: "Másolat" + FORWARD_MESSAGE_TOP_SENT: "Elküldött levelek" + FORWARD_MESSAGE_TOP_SUBJECT: "Tárgy" + EMPTY_TO_ERROR_DESC: "Legalább egy címzettet meg kell adni" + NO_ATTACHMENTS_HERE_DESC: "Nincsenek mellékletek." + ATTACHMENTS_ERROR_DESC: "Figyelem! Még nem lett feltöltve minden melléklet." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Még nem lett feltöltve minden melléklet." + BUTTON_REQUEST_READ_RECEIPT: "Olvasási visszaigazolás kérése" + BUTTON_MARK_AS_IMPORTANT: "Megjelölés fontosként" + BUTTON_OPEN_PGP: "OpenPGP (csak egyszerű szöveg)" + BUTTON_REQUEST_DSN: "Továbbítási visszaigazolás kérés" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Bezár" + POPUPS_ASK: + BUTTON_YES: "Igen" + BUTTON_NO: "Nem" + DESC_WANT_CLOSE_THIS_WINDOW: "Biztos, hogy be akarod zárni ezt az ablakot?" + DESC_WANT_DELETE_MESSAGES: "Biztos, hogy törölni akarod az üzenete(ke)t?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Nyelv kiválasztás" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Új fiók?" + BUTTON_ADD_ACCOUNT: "Hozzáadás" + TITLE_UPDATE_ACCOUNT: "Fiók frissítése?" + BUTTON_UPDATE_ACCOUNT: "Frissítés" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Identitás hozzáadás?" + TITLE_UPDATE_IDENTITY: "Frissítsük az identitást?" + BUTTON_ADD_IDENTITY: "Hozzáadás" + BUTTON_UPDATE_IDENTITY: "Frissítés" + LABEL_EMAIL: "E-mail" + LABEL_NAME: "Név" + LABEL_REPLY_TO: "Válaszcím" + LABEL_SIGNATURE: "Aláírás" + LABEL_CC: "Másolat" + LABEL_BCC: "Titkos másolat" + LABEL_SIGNATURE_INSERT_BEFORE: "Szúrja be ezt az aláírást az idézett szöveg elé a válaszokban" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Létrehozzuk a mappát?" + LABEL_NAME: "Mappa név" + LABEL_PARENT: "Szülő mappa" + BUTTON_CREATE: "Létrehozás" + BUTTON_CANCEL: "Mégse" + BUTTON_CLOSE: "Bezárás" + TITLE_CREATING_PROCESS: "Mappa létrehozás" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Töröljük az összes üzenetet a mappából?" + BUTTON_CLEAR: "Törlés" + BUTTON_CANCEL: "Mégse" + BUTTON_CLOSE: "Bezárás" + DANGER_DESC_WARNING: "Figyelem!" + DANGER_DESC_HTML_1: "Ez a művelet az összes %FOLDER% mappában lévő üzenet teljes törlését eredményezi." + DANGER_DESC_HTML_2: "Ha egyszer elindult, a folyamatot nem lehet megszakítani." + TITLE_CLEARING_PROCESS: "Mappa ürítés..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "OpenPGP kulcs importálás" + BUTTON_IMPORT_OPEN_PGP_KEY: "Importálás" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "OpenPGP kulcs megtekintés" + BUTTON_SELECT: "Kiválasztás" + BUTTON_CLOSE: "Bezárás" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "OpenPGP kulcs generálás" + LABEL_EMAIL: "E-mail" + LABEL_NAME: "Név" + LABEL_PASSWORD: "Jelszó" + LABEL_KEY_BIT_LENGTH: "Kulcs hossz" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generálás" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP aláírás/titkosítás" + LABEL_SIGN: "Aláírás" + LABEL_ENCRYPT: "Titkosítás" + LABEL_PASSWORD: "Jelszó" + BUTTON_SIGN: "Aláírás" + BUTTON_ENCRYPT: "Titkosítás" + BUTTON_SIGN_AND_ENCRYPT: "Aláírás és titkosítás" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP visszafejtés" + LABEL_KEY: "Privát kulcs" + LABEL_PASSWORD: "Jelszó" + BUTTON_DECRYPT: "Visszafejtés" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "2-lépéses hitelesítés teszt" + LABEL_CODE: "Kód" + BUTTON_TEST: "Tesztelés" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Szűrő létrehozás?" + TITLE_EDIT_FILTER: "Szűrő frissítés?" + FILTER_NAME: "Név" + LEGEND_CONDITIONS: "Feltételek" + LEGEND_ACTIONS: "Műveletek" + BUTTON_DONE: "Kész" + BUTTON_ADD_CONDITION: "Feltétel hozzáadás" + SELECT_ACTION_NONE: "Semmi" + SELECT_ACTION_MOVE_TO: "Áthelyezés ide" + SELECT_ACTION_FORWARD_TO: "Továbbítás ide" + SELECT_ACTION_REJECT: "Visszautasít" + SELECT_ACTION_VACATION_MESSAGE: "Vakáció üzenet" + SELECT_ACTION_DISCARD: "Elvetés" + SELECT_FIELD_FROM: "Feladó" + SELECT_FIELD_RECIPIENTS: "Címzettek (címzett vagy másolat)" + SELECT_FIELD_SUBJECT: "Tárgy" + SELECT_FIELD_HEADER: "Fejléc" + SELECT_FIELD_SIZE: "Méret" + SELECT_TYPE_CONTAINS: "Tartalmazza" + SELECT_TYPE_NOT_CONTAINS: "Nem tartalmazza" + SELECT_TYPE_MATCHES: "Hasonló (* és ? támogatott)" + SELECT_TYPE_NOT_MATCHES: "Nem hasonló (* és ? támogatott)" + SELECT_TYPE_REGEXP: "Regexp" + SELECT_TYPE_NOT_REGEXP: "Not Regexp" + SELECT_TYPE_EQUAL_TO: "Egyezik" + SELECT_TYPE_NOT_EQUAL_TO: "Nem egyezik" + SELECT_TYPE_OVER: "Fölött" + SELECT_TYPE_UNDER: "Alatt" + SELECT_MATCH_ANY: "Egyezzen VALAMELYIK következő szabállyal" + SELECT_MATCH_ALL: "Egyezzen MINDEN következő szabállyal" + MARK_AS_READ_LABEL: "Megjelölés olvasottként" + REPLY_INTERVAL_LABEL: "Válasz időköz (nap)" + KEEP_LABEL: "Megtart" + STOP_LABEL: "Ne hagyja abba a szabályok feldolgozását" + EMAIL_LABEL: "E-mail" + VACATION_SUBJECT_LABEL: "Tárgy (nem kötelező)" + VACATION_MESSAGE_LABEL: "Üzenet" + VACATION_RECIPIENTS_LABEL: "Címzettek (vesszővel elválasztva)" + REJECT_MESSAGE_LABEL: "Üzenet visszautasítása" + ALL_INCOMING_MESSAGES_DESC: "Minden bejövő üzenet" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Rendszermappák kiválasztása" + SELECT_CHOOSE_ONE: "Válassz egyet" + SELECT_UNUSE_NAME: "Ne használd" + LABEL_SENT: "Elküldött levelek" + LABEL_DRAFTS: "Piszkozatok" + LABEL_SPAM: "Levélszemét" + LABEL_TRASH: "Lomtár" + LABEL_ARCHIVE: "Archívum" + BUTTON_CANCEL: "Mégse" + BUTTON_CLOSE: "Bezárás" + NOTIFICATION_SENT: | + Nem választottál "Elküldött" rendszermappát a törölt levelek tárolásához. + Ha nem szeretnéd tárolni az elküldött leveleket, akkor válaszd a "Ne használd" lehetőséget. + NOTIFICATION_DRAFTS: "Nem választottál \"Piszkozatok\" rendszermappát a szerkesztett üzenetek tárolásához." + NOTIFICATION_SPAM: |+ + Nem választottál "Levélszemét" rendszermappát a kéretlen üzenetek tárolásához. + Az üzenetek végleges törléséhez válaszd a "Ne használd" lehetőséget. + + NOTIFICATION_TRASH: | + Nem választottál "Lomtár" rendszermappát a törölt levelek tárolásához. + Az üzenetek végleges törléséhez válaszd a "Ne használd" lehetőséget. + NOTIFICATION_ARCHIVE: "Nem választottál \"Archívum\" rendszermappát az archivált üzenetek tárolásához." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "2 lépcsős hitelesítés" + LABEL_ENABLE_TWO_FACTOR: "2 lépcsős hitelesítés engedélyezése" + LABEL_TWO_FACTOR_USER: "Felhasználó" + LABEL_TWO_FACTOR_STATUS: "Állapot" + LABEL_TWO_FACTOR_SECRET: "Titok" + LABEL_TWO_FACTOR_BACKUP_CODES: "Biztonsági kódok" + BUTTON_CREATE: "Új titok létrehozás" + BUTTON_ACTIVATE: "Aktivál" + BUTTON_CLEAR: "Töröl" + BUTTON_LOGOUT: "Kijelentkezés" + BUTTON_DONE: "Kész" + BUTTON_TEST: "Teszt" + LINK_TEST: "teszt" + BUTTON_SHOW_SECRET: "Titok megjelenítése" + BUTTON_HIDE_SECRET: "Titok elrejtése" + TWO_FACTOR_REQUIRE_DESC: "A fiókhoz 2 lépcsős hitelesítés szükséges." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Beállítva" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Nincs beállítva" + TWO_FACTOR_SECRET_DESC: > + Importáld ezt az infót a Google Authenticator kliensedbe (vagy más TOTP kliensbe) + az alábbi QR kód használatával vagy a kód manuális megadatásával. + TWO_FACTOR_BACKUP_CODES_DESC: > + Ha nem kapod meg a kódokat a Google Authenticator kliensből (vagy más TOTP + kliensből), akkor a bejelentkezéshez használhatod a biztonsági kódot. A biztonsági + kód használata után inaktívvá válik. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Tesztelés nélkül nem lehet megváltoztatni ezt a beállítást." + TITLES: + LOADING: "Betöltés" + LOGIN: "Bejelentkezés" + MAILBOX: "Postaláda" + SETTINGS: "Beállítások" + COMPOSE: "Levélírás" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "A fájl túl nagy" + ERROR_FILE_PARTIALLY_UPLOADED: "A fájl egy ismeretlen hiba miatt csak részben lett feltöltve" + ERROR_NO_FILE_UPLOADED: "Nem lett fájl feltöltve" + ERROR_MISSING_TEMP_FOLDER: "Hiányzik az ideiglenes fájl" + ERROR_ON_SAVING_FILE: "Ismeretlen fájl feltöltési hiba történt" + ERROR_FILE_TYPE: "Érvénytelen fájltípus" + ERROR_UNKNOWN: "Ismeretlen fájl feltöltési hiba történt" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" + TEXT_SWITCHER_RICH_FORMATTING: "Formázott szöveg" + TEXT_SWITCHER_CONFIRM: "A szövegformázás és a képek el fognak veszni. Biztos, hogy folytatni akarod?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Személyes" + LABEL_GENERAL_NAME: "Általános" + LABEL_CONTACTS_NAME: "Névjegyek" + LABEL_FOLDERS_NAME: "Mappák" + LABEL_ACCOUNTS_NAME: "Fiókok" + LABEL_IDENTITY_NAME: "Identitás" + LABEL_IDENTITIES_NAME: "Identitások" + LABEL_FILTERS_NAME: "Szűrők" + LABEL_TEMPLATES_NAME: "Sablonok" + LABEL_SECURITY_NAME: "Biztonság" + LABEL_SOCIAL_NAME: "Közösség" + LABEL_THEMES_NAME: "Témák" + LABEL_CHANGE_PASSWORD_NAME: "Jelszó" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Vissza" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Szűrők" + BUTTON_SAVE: "Mentés" + BUTTON_ADD_FILTER: "Szűrő hozzáadás" + BUTTON_DELETE: "Törlés" + BUTTON_RAW_SCRIPT: "Saját felhasználói szkript használata" + SUBNAME_NONE: "Semmi" + SUBNAME_MOVE_TO: "Áthelyezés ide \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Továbbítás ide: \"%EMAIL%\"" + SUBNAME_REJECT: "Visszautasít" + SUBNAME_VACATION_MESSAGE: "Vakáció üzenet" + SUBNAME_DISCARD: "Elvetés" + CAPABILITY_LABEL: "Képesség" + LOADING_PROCESS: "Szűrő lista frissítése" + DELETING_ASK: "Biztos vagy benne?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Ezeket a módosításokat el kell menteni a szerverre." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identitás" + LABEL_DISPLAY_NAME: "Név" + LABEL_REPLY_TO: "Válaszcím" + LABEL_SIGNATURE: "Aláírás" + LABEL_ADD_SIGNATURE_TO_ALL: "Az aláírásod hozzáadása a kimenő üzenetekhez" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Biztonság" + LABEL_CONFIGURE_TWO_FACTOR: "2 lépcsős hitelesítés beállítása" + LABEL_AUTOLOGOUT: "Automatikus kijelentkezés" + AUTOLOGIN_NEVER_OPTION_NAME: "Soha" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% perc" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% óra" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Általános" + LABEL_LANGUAGE: "Nyelv" + LABEL_IDENTITY: "Identitás" + LABEL_LAYOUT: "Elrendezés" + LABEL_LAYOUT_NO_SPLIT: "Felosztás nélkül" + LABEL_LAYOUT_VERTICAL_SPLIT: "Függőleges felosztás" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Vízszintes felosztás" + LABEL_EDITOR: "Alapértelmezett szövegszerkesztő" + LABEL_EDITOR_HTML: "HTML" + LABEL_EDITOR_PLAIN: "Egyszerű" + LABEL_EDITOR_HTML_FORCED: "HTML (kényszerített)" + LABEL_EDITOR_PLAIN_FORCED: "Egyszerű (kényszerített)" + LABEL_ANIMATION: "Felület animáció" + LABEL_ANIMATION_FULL: "Teljes" + LABEL_ANIMATION_NORMAL: "Normál" + LABEL_ANIMATION_NONE: "Semmi" + LABEL_VIEW_OPTIONS: "Nézet beállítások" + LABEL_USE_PREVIEW_PANE: "Előnézeti ablak használata" + LABEL_USE_CHECKBOXES_IN_LIST: "Jelölőnégyzetek megjelenítése a listában" + LABEL_USE_THREADS: "Szálak használata" + LABEL_REPLY_SAME_FOLDER: "Válaszüzenetek elhelyezése az eredeti üzenet mappájában" + LABEL_SHOW_IMAGES: "Mindig jelenítse meg a külső képeket az üzenet törzsében" + LABEL_SHOW_ANIMATION: "Animáció megjelenítés" + LABEL_MESSAGE_PER_PAGE: "Üzenetek egy oldalon" + LABEL_NOTIFICATIONS: "Értesítések" + LABEL_SOUND_NOTIFICATION: "Hangos értesítés" + LABEL_CHROME_NOTIFICATION_DESC: "Új üzenetek értesítő ablakainak megjelenítése" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(a böngésző blokkolta)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Névjegyek" + LABEL_CONTACTS_AUTOSAVE: "Címzettek automatikus hozzáadása a címtárhoz" + LEGEND_CONTACTS_SYNC: "Távoli szinkronizálás (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Távoli szinkronizálás engedélyezése" + LABEL_CONTACTS_SYNC_SERVER: "Szerver" + LABEL_CONTACTS_SYNC_AB_URL: "Címtár URL" + LABEL_CONTACTS_SYNC_USER: "Felhasználó" + LABEL_CONTACTS_SYNC_PASSWORD: "Jelszó" + SETTINGS_THEMES: + LEGEND_THEMES: "Témák" + LEGEND_THEMES_CUSTOM: "Saját téma beállítások" + LABEL_CUSTOM_TYPE: "Típus" + LABEL_CUSTOM_TYPE_LIGHT: "Világos" + LABEL_CUSTOM_TYPE_DARK: "Sötét" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Háttér" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Háttérkép feltöltés (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "A fájl túl nagy" + ERROR_FILE_TYPE_ERROR: "Érvénytelen fájl típus (csak JPG és PNG lehet)" + ERROR_UNKNOWN: "Ismeretlen fájl feltöltési hiba történt" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Google kapcsolódás" + BUTTON_GOOGLE_DISCONNECT: "Google szétkapcsolás" + MAIN_GOOGLE_DESC: "A Google bejelentkezés engedélyezése után, ebbe a fiókba is be lehet lépni a Google gombbal a bejelentkező képernyőn." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Facebook kapcsolódás" + BUTTON_FACEBOOK_DISCONNECT: "Facebook szétkapcsolás" + MAIN_FACEBOOK_DESC: "A Facebook bejelentkezés engedélyezése után, ebbe a fiókba is be lehet lépni a Facebook gombbal a bejelentkező képernyőn." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Twitter kapcsolódás" + BUTTON_TWITTER_DISCONNECT: "Twitter szétkapcsolás" + MAIN_TWITTER_DESC: "A Twitter bejelentkezés engedélyezése után, ebbe a fiókba is be lehet lépni a Twitter gombbal a bejelentkező képernyőn." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Mappa lista" + BUTTON_CREATE: "Mappa létrehozás" + BUTTON_SYSTEM: "Rendszermappák" + BUTTON_DELETE: "Törlés" + BUTTON_SUBSCRIBE: "Feliratkozás" + BUTTON_UNSUBSCRIBE: "Leiratkozás" + LOADING_PROCESS: "Mappa lista frissítése" + CREATING_PROCESS: "Mappa létrehozás" + DELETING_PROCESS: "Mappa törlés" + RENAMING_PROCESS: "Mappa átnevezés" + DELETING_ASK: "Biztos vagy benne?" + TO_MANY_FOLDERS_DESC_1: "Túl sok mappád van!" + TO_MANY_FOLDERS_DESC_2: "Teljesítény problémák elkerülése miatt, csak egy részét jelenítjük meg." + HELP_DELETE_FOLDER: "Mappa törlés" + HELP_SHOW_HIDE_FOLDER: "Mappa mutatás/elrejtés" + HELP_CHECK_FOR_NEW_MESSAGES: "Ellenőrizze/ne ellenőrizze az új üzeneteket" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Fiók lista" + LEGEND_IDENTITIES: "Identitások" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Fiókok és identitások" + BUTTON_ADD_ACCOUNT: "Fiók hozzáadás" + BUTTON_ADD_IDENTITY: "Identitás hozzáadás" + BUTTON_DELETE: "Tőrlés" + LOADING_PROCESS: "Fiók lista frissítés" + DELETING_ASK: "Biztos vagy benne?" + DEFAULT_IDENTITY_LABEL: "default" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identitás" + LEGEND_IDENTITIES: "További identitások" + LABEL_DEFAULT: "Alapértelmezett" + LABEL_DISPLAY_NAME: "Név" + LABEL_REPLY_TO: "Válaszcím" + LABEL_SIGNATURE: "Aláírás" + LABEL_ADD_SIGNATURE_TO_ALL: "Az aláírásod hozzáadása az összes kimenő üzenetekhez" + BUTTON_ADD_IDENTITY: "Identitás hozzáadás" + BUTTON_DELETE: "Törlés" + LOADING_PROCESS: "Identitás lista frissítése" + DELETING_ASK: "Biztos vagy benne?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Jelszó változtatás" + LABEL_CURRENT_PASSWORD: "Jelenlegi jelszó" + LABEL_NEW_PASSWORD: "Új jelszó" + LABEL_REPEAT_PASSWORD: "Új jelszó újra" + BUTTON_UPDATE_PASSWORD: "Új jelszó beállítás" + ERROR_PASSWORD_MISMATCH: "A jelszavak nem egyeznek, próbáld újra" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "OpenPGP kulcs importálás" + BUTTON_GENERATE_OPEN_PGP_KEYS: "OpenPGP kulcs generálás" + TITLE_PRIVATE: "Privát" + TITLE_PUBLIC: "Publikus" + DELETING_ASK: "Biztos vagy benne?" + GENERATE_ONLY_HTTPS: "csak HTTPS" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Piszkozat automatikus mentése" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Billentyű kombináció súgó" + TAB_MAILBOX: "Postaláda" + TAB_MESSAGE_LIST: "Üzenetlista" + TAB_MESSAGE_VIEW: "Üzenet nézet" + TAB_COMPOSE: "Levélírás" + LABEL_OPEN_USER_DROPDOWN: "Felhasználó legördülő megnyitása" + LABEL_REPLY: "Válasz" + LABEL_REPLY_ALL: "Válasz mindenkinek" + LABEL_FORWARD: "Továbbítás" + LABEL_FORWARD_MULTIPLY: "Továbbítás melléklet(en)ként" + LABEL_HELP: "Súgó" + LABEL_CHECK_ALL: "Minden üzenet kijelölése" + LABEL_ARCHIVE: "Archívum" + LABEL_DELETE: "Törlés" + LABEL_OPEN_THREAD: "Kijelölt szál megnyitása" + LABEL_MOVE: "Áthelyez" + LABEL_READ: "Kijelölt üzenetek megjelölése olvasottként" + LABEL_UNREAD: "Kijelölt üzenetek megjelölése olvasatlanként" + LABEL_IMPORTANT: "Kijelölt üzenetek megjelölése fontosként zászlóval" + LABEL_SEARCH: "Keresés" + LABEL_CANCEL_SEARCH: "Keresés megszakítása" + LABEL_FULLSCREEN_ENTER: "Teljes képernyő (előnézeti panales elrendezés)" + LABEL_VIEW_MESSAGE_ENTER: "Üzenet megtekintése (előnézeti panel nélküli elrendezés)" + LABEL_SWITCH_TO_MESSAGE: "Fókusz váltás a kijelölt üzenetre" + LABEL_SWITCH_TO_FOLDER_LIST: "Fókusz váltás a mappa listára" + LABEL_FULLSCREEN_TOGGLE: "Teljes képernyős mód váltása" + LABEL_BLOCKQUOTES_TOGGLE: "Idézetek váltása az üzenetben" + LABEL_THREAD_NEXT: "Következő üzenet a szálban" + LABEL_THREAD_PREV: "Előző üzenet a szálban" + LABEL_PRINT: "Nyomtatás" + LABEL_EXIT_FULLSCREEN: "Kilépés a teljes képernyős módból" + LABEL_CLOSE_MESSAGE: "Üzenet bezárás (előnézeti panel nélküli elrendezés)" + LABEL_SWITCH_TO_LIST: "Fókusz váltása vissza az üzenetlistára" + LABEL_OPEN_COMPOSE_POPUP: "Levélírás ablak megnyitás" + LABEL_MINIMIZE_COMPOSE_POPUP: "Levélírás ablak minimalizálás" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Identitások legördülő megnyitása" + LABEL_SAVE_MESSAGE: "Üzenet mentés" + LABEL_SEND_MESSAGE: "Üzenet küldés" + LABEL_CLOSE_COMPOSE: "Levélírás bezárása" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "Nem találtam publikus kulcsokat" + NO_PUBLIC_KEYS_FOUND_FOR: "Nem találtam publikus kulcsokat ehhez az e-mailhez: \"%EMAIL%\"" + NO_PRIVATE_KEY_FOUND: "Nem találtam privát kulcsot" + NO_PRIVATE_KEY_FOUND_FOR: "Nem találtam privát kulcsot ehhez az e-mailhez: \"%EMAIL%\"" + ADD_A_PUBLICK_KEY: "Publikus kulcs hozzáadás" + SELECT_A_PRIVATE_KEY: "Privát kulcs választás" + UNVERIFIRED_SIGNATURE: "Nem ellenőrzött aláírás" + DECRYPTION_ERROR: "OpenPGP visszafejtési hiba" + GOOD_SIGNATURE: "Jó aláírás tőle: %USER%" + PGP_ERROR: "OpenPGP hiba: %ERROR%" + SPECIFY_FROM_EMAIL: "Kérlek add meg a Feladó e-mail címét" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Legalább egy címzettet meg kell adni" + NOTIFICATIONS: + INVALID_TOKEN: "Érvénytelen kulcs" + AUTH_ERROR: "Érvénytelen hitelesítés" + ACCESS_ERROR: "Érvénytelen hozzáférés" + CONNECTION_ERROR: "Nem lehet kapcsolódni a szerverhez" + CAPTCHA_ERROR: "Érvénytelen CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Ez a közösségi azonosító még egyetlen e-mail fiókhoz sincs hozzárendelve. + Lépj be az e-mail fiókod hitelesítő adataival majd engedélyezd ezt a lehetőséget + a fiók beállításoknál. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Ez a közösségi azonosító még egyetlen e-mail fiókhoz sincs hozzárendelve. + Lépj be az e-mail fiókod hitelesítő adataival majd engedélyezd ezt a lehetőséget + a fiók beállításoknál. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Ez a közösségi azonosító még egyetlen e-mail fiókhoz sincs hozzárendelve. + Lépj be az e-mail fiókod hitelesítő adataival majd engedélyezd ezt a lehetőséget + a fiók beállításoknál. + DOMAIN_NOT_ALLOWED: "A domain nem engedélyezett" + ACCOUNT_NOT_ALLOWED: "A fiók nem engedélyezett" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Kétlépcsős azonosítás kötelező" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Kétlépcsős azonosítás hiba" + COULD_NOT_SAVE_NEW_PASSWORD: "Az új jelszó nem került törlésre" + CURRENT_PASSWORD_INCORRECT: "Érvénytelen jelszó" + NEW_PASSWORD_SHORT: "A jelszó túl rövid" + NEW_PASSWORD_WEAK: "A jelszó túl egyszerű" + NEW_PASSWORD_FORBIDDENT: "A jelszó tíltott karaktereket tartalmaz" + CONTACTS_SYNC_ERROR: "Hiba lépett fel a névjegyek szinkronizálása közben" + CANT_GET_MESSAGE_LIST: "Nem tudom letölteni az üzenetlistát" + CANT_GET_MESSAGE: "Nem tudom letölteni az üzenetet" + CANT_DELETE_MESSAGE: "Nem lehet törölni az üzenetet" + CANT_MOVE_MESSAGE: "Nem lehet áthelyezni az üzenetet" + CANT_SAVE_MESSAGE: "Nem lehet menteni az üzenetet" + CANT_SEND_MESSAGE: "Nem lehet elküldeni az üzenetet" + INVALID_RECIPIENTS: "Érvénytelent címzettek" + CANT_SAVE_FILTERS: "Nem lehet menteni a szűrőket" + CANT_GET_FILTERS: "Nem lehet letölteni a szűrőket" + FILTERS_ARE_NOT_CORRECT: "A szűrők nem megfelelőek" + CANT_CREATE_FOLDER: "Nem lehet létrehozni a mappát" + CANT_RENAME_FOLDER: "Nem lehet átnevezni a mappát" + CANT_DELETE_FOLDER: "Nem lehet törölni a mappát" + CANT_DELETE_NON_EMPTY_FOLDER: "Nem üres mappát nem lehet törölni" + CANT_SUBSCRIBE_FOLDER: "Nem lehet feliratkozni mappára" + CANT_UNSUBSCRIBE_FOLDER: "Nem lehet leiratkozni mappáról" + CANT_SAVE_SETTINGS: "Nem lehet menteni a beállításokat" + CANT_SAVE_PLUGIN_SETTINGS: "Nem lehet menteni a beállításokat" + DOMAIN_ALREADY_EXISTS: "A domain már létezik" + CANT_INSTALL_PACKAGE: "Nem sikerült telepíteni a csomagot" + CANT_DELETE_PACKAGE: "Nem sikerült eltávolítani a csomagot" + INVALID_PLUGIN_PACKAGE: "Érvénytelen beépülő csomag" + UNSUPPORTED_PLUGIN_PACKAGE: "Nem támogatott beépülő csomag" + LICENSING_SERVER_IS_UNAVAILABLE: "A előfizetési szerver nem érhető el" + LICENSING_DOMAIN_EXPIRED: "A domain előfizetése lejárt." + LICENSING_DOMAIN_BANNED: "A domain előfizetése letiltva." + DEMO_SEND_MESSAGE_ERROR: "Biztonsági okokból, ebből a demó fiókból nem lehet külső e-mail címekre üzenetet küldeni." + DEMO_ACCOUNT_ERROR: "Biztonsági okokból, ebből a fiókból nem lehet elvégezni ezt a műveletet!" + ACCOUNT_ALREADY_EXISTS: "A fiók már létezik" + ACCOUNT_DOES_NOT_EXIST: "A fiók nem létezik" + MAIL_SERVER_ERROR: "Hiba történt a levelező szerverhez történő hozzáférés közben" + INVALID_INPUT_ARGUMENT: "Érvénytelen input argumentum" + UNKNOWN_ERROR: "Ismeretlen hiba" + STATIC: + BACK_LINK: "Újratöltés" + DOMAIN_LIST_DESC: "A webmailhez hozzáférhető domainek listája." + PHP_EXSTENSIONS_ERROR_DESC: "Szükséges PHP kiterjesztés nem érhető el a PHP konfigurációdban!" + PHP_VERSION_ERROR_DESC: "A PHP verziód (%VERSION%) kisebb mint a minimálisan szükséges 5.3.0!" + NO_SCRIPT_TITLE: "Az alkalmazáshoz JavaScript szükséges." + NO_SCRIPT_DESC: | + A JavaScript támogatás nem érhető el a böngésződben. + Kérlek engedélyezd böngésződben a JavaScript támogatást, majd próbáld újra. + NO_COOKIE_TITLE: "Az alkalmazáshoz Cookie támogatásra van szükség." + NO_COOKIE_DESC: | + A Cookie támogatás nem érhető el a böngésződben. + Kérlek engedélyezd böngésződben a Cookie támogatást, majd próbáld újra. + BAD_BROWSER_TITLE: "A böngésződ elavult." + BAD_BROWSER_DESC: | + Az alkalmazás összes funkciójának használatához + tölts le és telepítsd az alábbi böngészők egyikét: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/id_ID.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/id_ID.yml new file mode 100755 index 00000000..2b4c3188 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/id_ID.yml @@ -0,0 +1,713 @@ +id_ID: + LOGIN: + LABEL_EMAIL: "Email" + LABEL_LOGIN: "Login" + LABEL_PASSWORD: "Sandi" + LABEL_SIGN_ME: "Ingat Saya" + LABEL_VERIFICATION_CODE: "Kode Verifikasi" + LABEL_DONT_ASK_VERIFICATION_CODE: "Jangan tanya kode untuk 2 minggu" + BUTTON_SIGN_IN: "Masuk" + TITLE_SIGN_IN_GOOGLE: "Masuk dengan akun Google" + TITLE_SIGN_IN_FACEBOOK: "Masuk dengan akun Facebook" + TITLE_SIGN_IN_TWITTER: "Masuk dengan akun Twitter" + LABEL_FORGOT_PASSWORD: "Lupa Sandi" + LABEL_REGISTRATION: "Registrasi" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Tambah Akun" + BUTTON_SETTINGS: "Pengaturan" + BUTTON_HELP: "Bantuan" + BUTTON_LOGOUT: "Keluar" + MOBILE: + BUTTON_MOBILE_VERSION: "Versi Mobile" + BUTTON_DESKTOP_VERSION: "Versi Desktop" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Cari" + TITLE_ADV: "Pencarian lanjutan" + LABEL_ADV_FROM: "Dari" + LABEL_ADV_TO: "Kepada" + LABEL_ADV_SUBJECT: "Judul" + LABEL_ADV_TEXT: "Teks" + LABEL_ADV_HAS_ATTACHMENT: "Memiliki lampiran" + LABEL_ADV_HAS_ATTACHMENTS: "Memiliki lampiran" + LABEL_ADV_FLAGGED: "Ditandai" + LABEL_ADV_UNSEEN: "Belum dilihat" + LABEL_ADV_DATE: "Tanggal" + LABEL_ADV_DATE_ALL: "Semua" + LABEL_ADV_DATE_3_DAYS: "Sudah 3 hari lalu" + LABEL_ADV_DATE_7_DAYS: "Sudah 1 bulan lalu" + LABEL_ADV_DATE_MONTH: "Lebih dari 1 bulan lalu" + LABEL_ADV_DATE_3_MONTHS: "Lebih dari 3 bulan lalu" + LABEL_ADV_DATE_6_MONTHS: "Lebih dari 6 bulan lalu" + LABEL_ADV_DATE_YEAR: "Lebih dari 1 tahun lalu" + BUTTON_ADV_SEARCH: "Cari" + PREVIEW_POPUP: + FULLSCREEN: "Beralih ke layar penuh" + ZOOM: "Perbesar/perkecil" + CLOSE: "Tutup (esc)" + LOADING: "Memuat" + GALLERY_PREV: "Sebelumnya (panah kiri)" + GALLERY_NEXT: "Selanjutnya (panah kanan)" + GALLERY_COUNTER: "%curr% dari %total%" + IMAGE_ERROR: "The image tidak dapat dimuat." + AJAX_ERROR: "The content tidak dapat dimuat." + FOLDER_LIST: + BUTTON_COMPOSE: "Tulis baru" + BUTTON_CONTACTS: "Kontak" + BUTTON_NEW_MESSAGE: "Pesan Baru" + INBOX_NAME: "Kotak Masuk" + SENT_NAME: "Terkirim" + DRAFTS_NAME: "Konsep" + SPAM_NAME: "Spam" + TRASH_NAME: "Sampah" + ARCHIVE_NAME: "Arsip" + QUOTA: + TITLE: "Jatah digunakan" + MESSAGE_LIST: + BUTTON_RELOAD: "Muat Ulang Daftar Pesan" + BUTTON_MOVE_TO: "Pindahkan Ke" + BUTTON_DELETE: "Hapus" + BUTTON_ARCHIVE: "Arsipkan" + BUTTON_SPAM: "Spam" + BUTTON_NOT_SPAM: "Bukan Spam" + BUTTON_EMPTY_FOLDER: "Buat Folder" + BUTTON_MULTY_FORWARD: "Teruskan sebagai lampiran" + BUTTON_DELETE_WITHOUT_MOVE: "Hapus permanen" + BUTTON_MORE: "Lagi" + MENU_SET_SEEN: "Tandai sudah dibaca" + MENU_SET_ALL_SEEN: "Tandai semua sudah dibaca" + MENU_UNSET_SEEN: "Tandai belum dibaca" + MENU_SET_FLAG: "Tandai" + MENU_UNSET_FLAG: "Hapus tanda" + MENU_SELECT_ALL: "Semua" + MENU_SELECT_NONE: "Tak satupun" + MENU_SELECT_INVERT: "Balikkan" + MENU_SELECT_UNSEEN: "Belum dibaca" + MENU_SELECT_SEEN: "Dibaca" + MENU_SELECT_FLAGGED: "Ditandai" + MENU_SELECT_UNFLAGGED: "Jangan tandai" + EMPTY_LIST: "Daftar kosong" + EMPTY_SEARCH_LIST: "Tidak ada pesan yang sesuai dengan pencarian" + SEARCH_RESULT_FOR: "Hasil pencarian untuk \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "Kembali ke daftar pesan" + LIST_LOADING: "Memuat" + EMPTY_SUBJECT_TEXT: "(Tanpa Judul)" + PUT_MESSAGE_HERE: "Taruh pesan di sini untuk melihatnya dalam daftar" + TODAY_AT: "hari ini pada %TIME%" + YESTERDAY_AT: "Kemarin pada %TIME%" + SEARCH_PLACEHOLDER: "Pencarian" + NEW_MESSAGE_NOTIFICATION: "Anda memiliki %COUNT% pesan baru!" + QUOTA_SIZE: "Menggunakan %SIZE% (%PROC%%) dari %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Ubah" + BUTTON_BACK: "Kembali" + BUTTON_CLOSE: "Tutup" + BUTTON_DELETE: "Hapus" + BUTTON_UNSUBSCRIBE: "Berhenti berlangganan dari daftar ini" + BUTTON_ARCHIVE: "Arsip" + BUTTON_SPAM: "Spam" + BUTTON_NOT_SPAM: "Bukan Spam" + BUTTON_MOVE_TO: "Pindahkan Ke" + BUTTON_MORE: "Lagi" + BUTTON_REPLY: "Balas" + BUTTON_REPLY_ALL: "Balas Semua" + BUTTON_FORWARD: "Teruskan Pesan" + BUTTON_FORWARD_AS_ATTACHMENT: "Teruskan sebagai lampiran" + BUTTON_EDIT_AS_NEW: "Ubah sebagai Pesan Baru" + BUTTON_SHOW_IMAGES: "Tampilkan gambar eksternal" + BUTTON_NOTIFY_READ_RECEIPT: "Pengirim meminta diberitahu saat anda membaca pesan ini." + BUTTON_IN_NEW_WINDOW: "Tampilkan di jendela terpisah" + BUTTON_THREAD_LIST: "Daftar kegiatan" + BUTTON_THREAD_PREV: "Sebelumnya" + BUTTON_THREAD_NEXT: "Selanjutnya" + BUTTON_THREAD_MORE: "Pesan lainnya" + MENU_HEADERS: "Tampilkan header pesan" + MENU_VIEW_ORIGINAL: "Tampilkan kode sumber" + MENU_DOWNLOAD_ORIGINAL: "Unduh sebagai berkas .eml" + MENU_FILTER_SIMILAR: "Saring pesan seperti ini" + MENU_PRINT: "Cetak" + EMPTY_SUBJECT_TEXT: "(Tanpa Judul)" + LABEL_SUBJECT: "Judul" + LABEL_DATE: "Tanggal" + LABEL_FROM: "Dari" + LABEL_FROM_SHORT: "dari" + LABEL_TO: "Kepada" + LABEL_TO_SHORT: "kepada" + LABEL_CC: "CC" + LABEL_BCC: "BCC" + LABEL_REPLY_TO: "Balas-Ke" + PRINT_LABEL_FROM: "Dari" + PRINT_LABEL_TO: "Kepada" + PRINT_LABEL_CC: "CC" + PRINT_LABEL_BCC: "BCC" + PRINT_LABEL_REPLY_TO: "Balas-Ke" + PRINT_LABEL_DATE: "Tanggal" + PRINT_LABEL_SUBJECT: "Judul" + PRINT_LABEL_ATTACHMENTS: "Lampiran" + MESSAGE_LOADING: "Memuat" + MESSAGE_VIEW_DESC: "Pilih pesan pada daftar untuk menampilkannya di sini." + MESSAGE_VIEW_MOVE_DESC: "Klik pada nama folder pada panel kiri untuk memilih tujuan." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Sandi" + PGP_SIGNED_MESSAGE_DESC: "Pesan bertanda-tangan OpenPGP (klik untuk verifikasi)" + PGP_ENCRYPTED_MESSAGE_DESC: "Pesan terenkripsi OpenPGP (klik untuk mendekripsi)" + LINK_DOWNLOAD_AS_ZIP: "Unduh sebagai berkas zip" + LINK_SAVE_TO_OWNCLOUD: "Simpan ke ownCloud" + LINK_SAVE_TO_CLOUD: "Simpan ke Cloud" + LINK_SAVE_TO_DROPBOX: "Simpan ke Dropbox" + READ_RECEIPT: + SUBJECT: "Tanda terima (ditampilkan) - %SUBJECT%" + BODY: | + Ini adalah Tanda terima untuk surat yang anda kirim kepada %READ-RECEIPT%. + + Catatan: "Tanda terima ini hanya pernyataan bahwa pesan telah ditampilkan pada komputer penerima ." + Tidak ada jaminan apapun bahwa penerima telah membaca atau memahami isi pesan tersebut. + SUGGESTIONS: + SEARCHING_DESC: "Pencarian..." + CONTACTS: + LEGEND_CONTACTS: "Kontak" + SEARCH_INPUT_PLACEHOLDER: "Cari" + BUTTON_ADD_CONTACT: "Tambah Kontak" + BUTTON_CREATE_CONTACT: "Simpan" + BUTTON_UPDATE_CONTACT: "Perbarui" + BUTTON_IMPORT: "Impor (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Expor (vcf, vCard)" + BUTTON_EXPORT_CSV: "Expor (csv)" + ERROR_IMPORT_FILE: "Impor gagal (format berkas tidak sah)" + LIST_LOADING: "Memuat" + EMPTY_LIST: "Tidak ada kontak di sini" + EMPTY_SEARCH: "Tidak ditemukan kontak" + CLEAR_SEARCH: "Bersihkan pencarian" + CONTACT_VIEW_DESC: "Pilih kontak pada daftar untuk ditampilkan di sini." + LABEL_DISPLAY_NAME: "Nama tampilan" + LABEL_EMAIL: "Email" + LABEL_PHONE: "Telepon" + LABEL_WEB: "Web" + LABEL_BIRTHDAY: "Ultah" + LINK_ADD_EMAIL: "Tambah alamat email" + LINK_ADD_PHONE: "Tambah telepon" + LINK_BIRTHDAY: "Ultah" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Isi nama tampilan" + PLACEHOLDER_ENTER_LAST_NAME: "Isi nama belakang " + PLACEHOLDER_ENTER_FIRST_NAME: "Isi nama depan" + PLACEHOLDER_ENTER_NICK_NAME: "Isi nama panggilan" + LABEL_READ_ONLY: "Hanya bisa dibaca" + LABEL_SHARE: "Bagikan" + ADD_MENU_LABEL: "Tambah" + ADD_MENU_NICKNAME: "Nama panggilan" + ADD_MENU_NOTES: "Catatan" + ADD_MENU_EMAIL: "Email" + ADD_MENU_PHONE: "Telepon" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Alamat" + ADD_MENU_BIRTHDAY: "Ultah" + ADD_MENU_TAGS: "Penanda" + BUTTON_SHARE_NONE: "Kosongkan" + BUTTON_SHARE_ALL: "Semuanya" + BUTTON_SYNC: "Sinkronisasi (CardDAV)" + COMPOSE: + TITLE_FROM: "Dari" + TITLE_TO: "Kepada" + TITLE_CC: "CC" + TITLE_BCC: "BCC" + TITLE_REPLY_TO: "Balas-Ke" + TITLE_SUBJECT: "Judul" + LINK_SHOW_INPUTS: "tampikan semua isian" + BUTTON_SEND: "Kirim" + BUTTON_SAVE: "Simpan" + BUTTON_DELETE: "Hapus" + BUTTON_CANCEL: "Batal" + BUTTON_MINIMIZE: "Kecilkan layar" + SAVED_TIME: "Disimpan pada %TIME%" + SAVED_ERROR_ON_SEND: "Pesan telah dikirim namun tidak disimpan pada folder terkirim" + DISCARD_UNSAVED_DATA: "Buang data tanpa menyimpan?" + ATTACH_FILES: "Lampirkan berkas" + ATTACH_DROP_FILES_DESC: "Taruh file di sini" + ATTACH_ITEM_CANCEL: "Batal" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% ditulis" + FORWARD_MESSAGE_TOP_TITLE: "-------- Pesan terusan -------" + FORWARD_MESSAGE_TOP_FROM: "Dari" + FORWARD_MESSAGE_TOP_TO: "Kepada" + FORWARD_MESSAGE_TOP_CC: "CC" + FORWARD_MESSAGE_TOP_SENT: "Dikirim" + FORWARD_MESSAGE_TOP_SUBJECT: "Judul" + EMPTY_TO_ERROR_DESC: "Mohon sertakan setidaknya satu penerima" + NO_ATTACHMENTS_HERE_DESC: "Tidak ada lampiran" + ATTACHMENTS_ERROR_DESC: "Peringatan! belum semua lampiran terunggah." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Belum semua lampiran terunggah." + BUTTON_REQUEST_READ_RECEIPT: "Minta pemberitahuan telah dibaca" + BUTTON_MARK_AS_IMPORTANT: "Tandai sebagai penting" + BUTTON_OPEN_PGP: "OpenPGP (Teks Biasa)" + BUTTON_REQUEST_DSN: "Minta pemberitahuan berhasil kirim" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Tutup" + POPUPS_ASK: + BUTTON_YES: "Ya" + BUTTON_NO: "Tidak" + DESC_WANT_CLOSE_THIS_WINDOW: "Anda yakin untuk menutup jendela ini?" + DESC_WANT_DELETE_MESSAGES: "Anda yakin untuk menutup semua jendela ini?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Pilih bahasa" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Tambah Akun?" + BUTTON_ADD_ACCOUNT: "Tambah" + TITLE_UPDATE_ACCOUNT: "Perbarui Akun?" + BUTTON_UPDATE_ACCOUNT: "Perbarui" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Tambah Identitas?" + TITLE_UPDATE_IDENTITY: "Perbarui Identitas?" + BUTTON_ADD_IDENTITY: "Tambah" + BUTTON_UPDATE_IDENTITY: "Perbarui" + LABEL_EMAIL: "Email" + LABEL_NAME: "Nama" + LABEL_REPLY_TO: "Balas-Ke" + LABEL_SIGNATURE: "Tanda tangan" + LABEL_CC: "Cc" + LABEL_BCC: "Bcc" + LABEL_SIGNATURE_INSERT_BEFORE: "Sisipkan tanda tangan ini sebelum teks kutipan pada balasan" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Buat folder?" + LABEL_NAME: "Nama folder" + LABEL_PARENT: "Folder induk" + BUTTON_CREATE: "Buat" + BUTTON_CANCEL: "Batal" + BUTTON_CLOSE: "Tutup" + TITLE_CREATING_PROCESS: "Membuat folder" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Singkirkan semua pesan dari folder ini?" + BUTTON_CLEAR: "Bersihkan" + BUTTON_CANCEL: "Batal" + BUTTON_CLOSE: "Tutup" + DANGER_DESC_WARNING: "Peringatan!" + DANGER_DESC_HTML_1: "Aksi ini akan menyebabkan dibuangnya surat dari folder%FOLDER% secara menyeluruh." + DANGER_DESC_HTML_2: "Begitu dimulai, proses tidak dapat dibatalkan atau ditunda." + TITLE_CLEARING_PROCESS: "Membersihkan folder..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Impor kunci OpenPGP" + BUTTON_IMPORT_OPEN_PGP_KEY: "Impor" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "Tampikan kunci OpenPGP" + BUTTON_SELECT: "Pilih" + BUTTON_CLOSE: "Tutup" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Buat kunci OpenPGP" + LABEL_EMAIL: "Email" + LABEL_NAME: "Nama" + LABEL_PASSWORD: "Sandi" + LABEL_KEY_BIT_LENGTH: "Panjang kunci" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Buat" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP Tandatangan/Enkripsi" + LABEL_SIGN: "Tandatangan" + LABEL_ENCRYPT: "Enkripsi" + LABEL_PASSWORD: "Sandi" + BUTTON_SIGN: "Tandatangani" + BUTTON_ENCRYPT: "Enkripsi" + BUTTON_SIGN_AND_ENCRYPT: "Tandatangani dan Enkripsi" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP Deksipsi" + LABEL_KEY: "Private Key" + LABEL_PASSWORD: "Sandi" + BUTTON_DECRYPT: "Deskripsi" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "Uji verifikasi 2-Langkah" + LABEL_CODE: "Kode" + BUTTON_TEST: "Uji" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Buat filter?" + TITLE_EDIT_FILTER: "Perbarui filter?" + FILTER_NAME: "Nama" + LEGEND_CONDITIONS: "Kondisi" + LEGEND_ACTIONS: "Aksi" + BUTTON_DONE: "Selesai" + BUTTON_ADD_CONDITION: "Tambah kondisi" + SELECT_ACTION_NONE: "Tidak ada" + SELECT_ACTION_MOVE_TO: "Pindahkan ke" + SELECT_ACTION_FORWARD_TO: "Teruskan ke" + SELECT_ACTION_REJECT: "Tolak" + SELECT_ACTION_VACATION_MESSAGE: "Pesan liburan" + SELECT_ACTION_DISCARD: "Buang" + SELECT_FIELD_FROM: "Dari" + SELECT_FIELD_RECIPIENTS: "Penerima (Kepada atau tembusan)" + SELECT_FIELD_SUBJECT: "Subjek" + SELECT_FIELD_HEADER: "Header" + SELECT_FIELD_SIZE: "Ukuran" + SELECT_TYPE_CONTAINS: "Berisi" + SELECT_TYPE_NOT_CONTAINS: "Tidak berisi" + SELECT_TYPE_MATCHES: "Cocok (mendukung * dan ?)" + SELECT_TYPE_NOT_MATCHES: "Tidak Cocok (mendukung * dan ?)" + SELECT_TYPE_REGEXP: "Regexp" + SELECT_TYPE_NOT_REGEXP: "Bukan Regexp" + SELECT_TYPE_EQUAL_TO: "Sama Dengan" + SELECT_TYPE_NOT_EQUAL_TO: "Tidak sama Dengan" + SELECT_TYPE_OVER: "Di atas" + SELECT_TYPE_UNDER: "Di bawah" + SELECT_MATCH_ANY: "Cocokkan dengan Salah satu pengaturan berikut" + SELECT_MATCH_ALL: "Cocokkan dengan semua pengaturan berikut" + MARK_AS_READ_LABEL: "Tandai sudah dibaca" + REPLY_INTERVAL_LABEL: "Selang waktu balasan (hari)" + KEEP_LABEL: "Tahan" + STOP_LABEL: "Jangan hentikan peraturan proses" + EMAIL_LABEL: "Email" + VACATION_SUBJECT_LABEL: "Subjek (opsional)" + VACATION_MESSAGE_LABEL: "Pesan" + VACATION_RECIPIENTS_LABEL: "Penerima (dipisahkan koma)" + REJECT_MESSAGE_LABEL: "Pesan terakhir" + ALL_INCOMING_MESSAGES_DESC: "Semua pesan masuk" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Piih folder sistem" + SELECT_CHOOSE_ONE: "Pilih satu" + SELECT_UNUSE_NAME: "Jangan gunakan" + LABEL_SENT: "Kirim" + LABEL_DRAFTS: "Konsep" + LABEL_SPAM: "Spam" + LABEL_TRASH: "Sampah" + LABEL_ARCHIVE: "Arsip" + BUTTON_CANCEL: "Batal" + BUTTON_CLOSE: "Tutup" + NOTIFICATION_SENT: | + Anda belum memilih folder sistem "Kirim" untuk menyimpan pesan setelah dikirim. + Jika anda tidak ingin meyimpan pesan terkirim, silahkan gunakan opsi "Jangan gunakan". + NOTIFICATION_DRAFTS: "Anda belum memilih folder sistem untuk \"Konsep\", tempat pesan yang sedang dibuat." + NOTIFICATION_SPAM: | + Anda belum memilih folder "Spam" tempat pesan spam disimpan. + Jika anda ingin membuang pesan secara permanen, gunakan opsi "Jangan Gunakan". + NOTIFICATION_TRASH: | + Anda belum memilih folder "Sampah" tempat pesan buangan ditempatkan. + Jika anda ingin membuang pesan secara permanen, gunakan opsi "Jangan gunakan". + NOTIFICATION_ARCHIVE: "Anda belum memilih folder \"Arsip\" untuk menempatkan pesan arsip." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "Verifikasi 2-Langkah (OTP)" + LABEL_ENABLE_TWO_FACTOR: "Nyalakan verifikasi 2-Langkah" + LABEL_TWO_FACTOR_USER: "User" + LABEL_TWO_FACTOR_STATUS: "Status" + LABEL_TWO_FACTOR_SECRET: "Kode Rahasia" + LABEL_TWO_FACTOR_BACKUP_CODES: "Kode cadangan" + BUTTON_CREATE: "Buah kode rahasia" + BUTTON_ACTIVATE: "Aktivasi" + BUTTON_CLEAR: "Bersihkan" + BUTTON_LOGOUT: "Logout" + BUTTON_DONE: "Selesai" + BUTTON_TEST: "Ujicoba" + LINK_TEST: "ujicoba" + BUTTON_SHOW_SECRET: "Tampilkan kode rahasia" + BUTTON_HIDE_SECRET: "Lenyapkan kode rahasia" + TWO_FACTOR_REQUIRE_DESC: "Akun anda butuh konfigurasi verifikasi 2-Langkah" + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Telah dikonfigurasi" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Belum dikonfigurasi" + TWO_FACTOR_SECRET_DESC: > + Impor info ini ke Google Authenticator client (atau TOTP client lain) menggunakan + QR Code yang disediakan di bawah atau dengan menginput kode secara manual. + TWO_FACTOR_BACKUP_CODES_DESC: > + Jika anda tidak mendapatkan kode melalui Google Authenticator (or other TOTP + client), anda bisa menggunakan kode cadangan untuk masuk. Setelah anda gunakan + kode cadangan, maka kode tersebut akan kadaluarsa. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Anda tidak bisa mengubah pengaturan ini sebelum diujicoba." + TITLES: + LOADING: "Memuat" + LOGIN: "Login" + MAILBOX: "Kotak surat" + SETTINGS: "Pengaturan" + COMPOSE: "Buat pesan" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "File terlalu besar" + ERROR_FILE_PARTIALLY_UPLOADED: "File terunggah separuh disebabkan sesuatu kesalahan" + ERROR_NO_FILE_UPLOADED: "Tidak ada file yang diunggah" + ERROR_MISSING_TEMP_FOLDER: "File temporer hilang" + ERROR_ON_SAVING_FILE: "Kesalahan tidak diketahui terkait unggahan file" + ERROR_FILE_TYPE: "Tipe file tidak sah" + ERROR_UNKNOWN: "Kesalahan tidak diketahui saat unggah file" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" + TEXT_SWITCHER_RICH_FORMATTING: "Rich formatting" + TEXT_SWITCHER_CONFIRM: "Format teks dan gambar akan lenyap. Anda yakin untuk melanjutkan?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Pribadi" + LABEL_GENERAL_NAME: "Umum" + LABEL_CONTACTS_NAME: "Kontak" + LABEL_FOLDERS_NAME: "Folder" + LABEL_ACCOUNTS_NAME: "Akun" + LABEL_IDENTITY_NAME: "Identitas" + LABEL_IDENTITIES_NAME: "Identitas" + LABEL_FILTERS_NAME: "Filter" + LABEL_TEMPLATES_NAME: "Template" + LABEL_SECURITY_NAME: "Keamanan" + LABEL_SOCIAL_NAME: "Sosial" + LABEL_THEMES_NAME: "Tema" + LABEL_CHANGE_PASSWORD_NAME: "Sandi" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Kembali" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filter" + BUTTON_SAVE: "Simpan" + BUTTON_ADD_FILTER: "Tambah Filter" + BUTTON_DELETE: "Hapus" + BUTTON_RAW_SCRIPT: "Gunakan User Script khusus" + SUBNAME_NONE: "Tidak ada" + SUBNAME_MOVE_TO: "Pindahkan ke \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Teruskan ke \"%EMAIL%\"" + SUBNAME_REJECT: "Tolak" + SUBNAME_VACATION_MESSAGE: "Pesan liburan" + SUBNAME_DISCARD: "Buang" + CAPABILITY_LABEL: "Kapabilitas" + LOADING_PROCESS: "Perbarui daftar filter" + DELETING_ASK: "Anda yakin?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Perubahan ini perlu disimpan di server." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identitas" + LABEL_DISPLAY_NAME: "Nama" + LABEL_REPLY_TO: "Balas-Ke" + LABEL_SIGNATURE: "Tandatangan" + LABEL_ADD_SIGNATURE_TO_ALL: "Tambah tandatangan anda ke semua pesan keluar" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Keamanan" + LABEL_CONFIGURE_TWO_FACTOR: "Atur verifikasi 2-Langkah" + LABEL_AUTOLOGOUT: "Logout otomatis" + AUTOLOGIN_NEVER_OPTION_NAME: "Tidak pernah" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% menit" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% jam" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Umum" + LABEL_LANGUAGE: "Bahasa" + LABEL_IDENTITY: "Identitas" + LABEL_LAYOUT: "Tampilan" + LABEL_LAYOUT_NO_SPLIT: "Tanpa pemisah" + LABEL_LAYOUT_VERTICAL_SPLIT: "Pemisah vertikal" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Pemisah horizontal" + LABEL_EDITOR: "Editor teks bawaan" + LABEL_EDITOR_HTML: "Html" + LABEL_EDITOR_PLAIN: "Polos" + LABEL_EDITOR_HTML_FORCED: "Html (paksa)" + LABEL_EDITOR_PLAIN_FORCED: "Polos (paksa)" + LABEL_ANIMATION: "Animasi tampilan" + LABEL_ANIMATION_FULL: "Penuh" + LABEL_ANIMATION_NORMAL: "Normal" + LABEL_ANIMATION_NONE: "Tidak ada" + LABEL_VIEW_OPTIONS: "Tampilkan Opsi" + LABEL_USE_PREVIEW_PANE: "Gunakan panel pratinjau" + LABEL_USE_CHECKBOXES_IN_LIST: "Tampilkan centang dalam daftar" + LABEL_USE_THREADS: "Gunakan tread" + LABEL_REPLY_SAME_FOLDER: "Tempatkan pesan balasan di folder pesan yang dibalas" + LABEL_SHOW_IMAGES: "Selalu tampilkan gambar eksternal di dalam pesan" + LABEL_SHOW_ANIMATION: "Tampikan animasi" + LABEL_MESSAGE_PER_PAGE: "Pesan di halaman" + LABEL_NOTIFICATIONS: "Notifikasi" + LABEL_SOUND_NOTIFICATION: "Notifikasi suara" + LABEL_CHROME_NOTIFICATION_DESC: "Tampilkan jendela sembul notifikasi pesan" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(diblokir oleh browser)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Kontak" + LABEL_CONTACTS_AUTOSAVE: "Tambah penerima ke daftar alamat secara otomatis" + LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Nyalakan sinkronisasi remote" + LABEL_CONTACTS_SYNC_SERVER: "Server" + LABEL_CONTACTS_SYNC_AB_URL: "URL Buku alamat" + LABEL_CONTACTS_SYNC_USER: "User" + LABEL_CONTACTS_SYNC_PASSWORD: "Sandi" + SETTINGS_THEMES: + LEGEND_THEMES: "Tema" + LEGEND_THEMES_CUSTOM: "Konfigurasi tema khusus" + LABEL_CUSTOM_TYPE: "Tipe" + LABEL_CUSTOM_TYPE_LIGHT: "Terang" + LABEL_CUSTOM_TYPE_DARK: "Gelap" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Latar" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Unggah gambar latar (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "File terlalu besar" + ERROR_FILE_TYPE_ERROR: "Tipe file tidak sah (JPG dan PNG saja)" + ERROR_UNKNOWN: "Kesalahan tidak diketahui saat unggah file" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Hubungkan ke Google" + BUTTON_GOOGLE_DISCONNECT: "Putuskan dari Google" + MAIN_GOOGLE_DESC: "Setelah menyalakan login via Google, Anda bisa login ke akun ini menggunakan tombol Google pada halaman login." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Hubungkan Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Putuskan dari Facebook" + MAIN_FACEBOOK_DESC: "Setelah menyalakan login via Facebook, Anda bisa login ke akun ini menggunakan tombol Facebook pada halaman login." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Hubungkan Twitter" + BUTTON_TWITTER_DISCONNECT: "Putuskan Twitter" + MAIN_TWITTER_DESC: "Setelah menyalakan login via Twitter, Anda bisa login ke akun ini menggunakan tombol Twitter pada halaman login." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Daftar folder" + BUTTON_CREATE: "Buat folder" + BUTTON_SYSTEM: "Folder sistem" + BUTTON_DELETE: "Hapus" + BUTTON_SUBSCRIBE: "Langganan" + BUTTON_UNSUBSCRIBE: "Batal langganan" + LOADING_PROCESS: "Perbarui daftar folder" + CREATING_PROCESS: "Buat folder" + DELETING_PROCESS: "Hapus folder" + RENAMING_PROCESS: "Ubah nama folder" + DELETING_ASK: "Anda yakin?" + TO_MANY_FOLDERS_DESC_1: "Anda punya terlalu banyak folder!" + TO_MANY_FOLDERS_DESC_2: "Kami hanya menampilkan sebagian, untuk mencegah turunnya performa." + HELP_DELETE_FOLDER: "Hapus folder" + HELP_SHOW_HIDE_FOLDER: "Tampil/lenyapkan folder" + HELP_CHECK_FOR_NEW_MESSAGES: "Cek/jangan cek pesan baru" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Akun" + LEGEND_IDENTITIES: "Identitas" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Akun dan identitas" + BUTTON_ADD_ACCOUNT: "Tambahkan akun" + BUTTON_ADD_IDENTITY: "Tambahkan identitas" + BUTTON_DELETE: "Hapus" + LOADING_PROCESS: "Memperbarui..." + DELETING_ASK: "Anda yakin?" + DEFAULT_IDENTITY_LABEL: "Bawaan" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identitas" + LEGEND_IDENTITIES: "Identitas tambahan" + LABEL_DEFAULT: "Bawaan" + LABEL_DISPLAY_NAME: "Nama" + LABEL_REPLY_TO: "Balas-ke" + LABEL_SIGNATURE: "Tandatangan" + LABEL_ADD_SIGNATURE_TO_ALL: "Tambah tandatangan anda ke pesan keluar" + BUTTON_ADD_IDENTITY: "Tambah identitas" + BUTTON_DELETE: "Hapus" + LOADING_PROCESS: "Perbarui daftar identitas" + DELETING_ASK: "Anda yakin?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Ubah sandi" + LABEL_CURRENT_PASSWORD: "Sandi saat ini" + LABEL_NEW_PASSWORD: "Sandi Baru" + LABEL_REPEAT_PASSWORD: "Konfirmasi Sandi Baru" + BUTTON_UPDATE_PASSWORD: "Tetapkan Sandi Baru" + ERROR_PASSWORD_MISMATCH: "Sandi tidak sama, coba lagi" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Impor kunci OpenPGP" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Buat kunci OpenPGP" + TITLE_PRIVATE: "Pribadi" + TITLE_PUBLIC: "Publik" + DELETING_ASK: "Anda yakin?" + GENERATE_ONLY_HTTPS: "Hanya HTTPS" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Simpan konsep otomatis" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Bantuan pintasan keyboard" + TAB_MAILBOX: "Kotak surat" + TAB_MESSAGE_LIST: "Daftar pesan" + TAB_MESSAGE_VIEW: "Tampilan pesan" + TAB_COMPOSE: "Buat pesan" + LABEL_OPEN_USER_DROPDOWN: "Buka dropdown user" + LABEL_REPLY: "Balas" + LABEL_REPLY_ALL: "Balas semua" + LABEL_FORWARD: "Teruskan" + LABEL_FORWARD_MULTIPLY: "Teruskan sebagai berkas" + LABEL_HELP: "Bantuan" + LABEL_CHECK_ALL: "Pilih semua pesan" + LABEL_ARCHIVE: "Arsip" + LABEL_DELETE: "Hapus" + LABEL_OPEN_THREAD: "Buka pekerjaan terpilih" + LABEL_MOVE: "Pindahkan" + LABEL_READ: "Tandai sudah baca pesan terpilih" + LABEL_UNREAD: "Tandai belum baca pesan terpilih" + LABEL_IMPORTANT: "Penting, tandai pesan terplilih" + LABEL_SEARCH: "Pencarian" + LABEL_CANCEL_SEARCH: "Batalkan pencarian" + LABEL_FULLSCREEN_ENTER: "Layar penuh (panel pratinjau)" + LABEL_VIEW_MESSAGE_ENTER: "Tampilkan pesan (Tanpa pratinjau)" + LABEL_SWITCH_TO_MESSAGE: "Pindahkan fokus ke pesan terpilih" + LABEL_SWITCH_TO_FOLDER_LIST: "Pindahkan fokuske daftar folder" + LABEL_FULLSCREEN_TOGGLE: "Tetapkan mode layar penuh" + LABEL_BLOCKQUOTES_TOGGLE: "Tetapkan kutip pesan" + LABEL_THREAD_NEXT: "Pesan berikutnya dalam rentang" + LABEL_THREAD_PREV: "Pesan sebelumnya dalam rentang" + LABEL_PRINT: "Cetak" + LABEL_EXIT_FULLSCREEN: "Keluar dari mode Layar penuh" + LABEL_CLOSE_MESSAGE: "Tutup pesan (Tanpa panel pratinjau)" + LABEL_SWITCH_TO_LIST: "Pindahkan fokus kembali ke daftar pesan" + LABEL_OPEN_COMPOSE_POPUP: "Buka popup buat pesan" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimalkan popup buat pesan" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Buka dropdown identitas" + LABEL_SAVE_MESSAGE: "Simpan pesan" + LABEL_SEND_MESSAGE: "Kirim pesan" + LABEL_CLOSE_COMPOSE: "Tutup buat pesan" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "Tidak ada kunci publik" + NO_PUBLIC_KEYS_FOUND_FOR: "Tidak ada kunci publik untuk \"%EMAIL%\" email" + NO_PRIVATE_KEY_FOUND: "Tidak ada kunci privat" + NO_PRIVATE_KEY_FOUND_FOR: "Tidak ada kunci privat untuk \"%EMAIL%\" email" + ADD_A_PUBLICK_KEY: "Tambah kunci publik" + SELECT_A_PRIVATE_KEY: "Pilih sebuah kunci privat" + UNVERIFIRED_SIGNATURE: "Tandatangan belum diverifikasi" + DECRYPTION_ERROR: "Kesalahan dekripsi OpenPGP" + GOOD_SIGNATURE: "Tandatangan sah dari user %USER%" + PGP_ERROR: "Kesalahan OpenPGP: %ERROR%" + SPECIFY_FROM_EMAIL: "Silahkan tentukan alamat ASAL email" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Silahkan tentukan setidaknya satu penerima" + NOTIFICATIONS: + INVALID_TOKEN: "Token tidak sah" + AUTH_ERROR: "Otentikasi gagal" + ACCESS_ERROR: "Kesalahan akses" + CONNECTION_ERROR: "Tidak terhubung ke server" + CAPTCHA_ERROR: "CAPTCHA salah." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Sosial ID ini tidak terkait dengan akun email manapun. Login dengan akses + email dan aktifkan fitur ini dari pengaturan akun. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Sosial ID ini tidak terkait dengan akun email manapun. Login dengan akses + email dan aktifkan fitur ini dari pengaturan akun. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Sosial ID ini tidak terkait dengan akun email manapun. Login dengan akses + email dan aktifkan fitur ini dari pengaturan akun. + DOMAIN_NOT_ALLOWED: "Domain tidak diizinkan" + ACCOUNT_NOT_ALLOWED: "Akun ini tidak diizinkan" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Diperlukan verifikasi 2 faktor" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Kesalahan verifikasi 2 faktor" + COULD_NOT_SAVE_NEW_PASSWORD: "Tidak bisa menyimpan password baru" + CURRENT_PASSWORD_INCORRECT: "Password sekarang tidak benar" + NEW_PASSWORD_SHORT: "Password terlalu pendek" + NEW_PASSWORD_WEAK: "Password terlalu mudah" + NEW_PASSWORD_FORBIDDENT: "Password mengandung karakter terlarang" + CONTACTS_SYNC_ERROR: "Kesalahan sinkronisasi kontak" + CANT_GET_MESSAGE_LIST: "Gagal memperoleh daftar pesan" + CANT_GET_MESSAGE: "Gagal memperoleh pesan" + CANT_DELETE_MESSAGE: "Gagal menghapus pesan" + CANT_MOVE_MESSAGE: "Gagal memindahkan pesan" + CANT_SAVE_MESSAGE: "Gagal menyimpan pesan" + CANT_SEND_MESSAGE: "Gagal mengirim pesan" + INVALID_RECIPIENTS: "Penerima tidak valid" + CANT_SAVE_FILTERS: "Gagal menyimpan filter" + CANT_GET_FILTERS: "Gagal memperoleh filter" + FILTERS_ARE_NOT_CORRECT: "Filter tidak benar" + CANT_CREATE_FOLDER: "Gagal membuat folder" + CANT_RENAME_FOLDER: "Gagal mengubah nama folder" + CANT_DELETE_FOLDER: "Gagal menghapus folder" + CANT_DELETE_NON_EMPTY_FOLDER: "Gagal menghapus direkori yang berisi" + CANT_SUBSCRIBE_FOLDER: "Gagal mengkaitkan folder" + CANT_UNSUBSCRIBE_FOLDER: "Tidak bisa memutus folder" + CANT_SAVE_SETTINGS: "Gagal menyimpan pengaturan" + CANT_SAVE_PLUGIN_SETTINGS: "Gagal menyimpan pengaturan" + DOMAIN_ALREADY_EXISTS: "Domain telah ada" + CANT_INSTALL_PACKAGE: "Gagal menginstall paket" + CANT_DELETE_PACKAGE: "Gagal membuang paket" + INVALID_PLUGIN_PACKAGE: "Paket plugin tidak sah" + UNSUPPORTED_PLUGIN_PACKAGE: "Paket plugin tidak didukung" + LICENSING_SERVER_IS_UNAVAILABLE: "Server langganan tidak tersedia." + LICENSING_DOMAIN_EXPIRED: "Langganan domain ini telah kadaluarsa." + LICENSING_DOMAIN_BANNED: "Langganan untuk domain ini dilarang." + DEMO_SEND_MESSAGE_ERROR: "Atas alasan keamanan, akun ini tidak diizinkan mengirim pesan ke alamat luar!" + DEMO_ACCOUNT_ERROR: "Atas alasan keamanan, akun ini tidak diizinkan melakukan aksi ini!" + ACCOUNT_ALREADY_EXISTS: "Akun sudah ada" + ACCOUNT_DOES_NOT_EXIST: "Akun tidak ada" + MAIL_SERVER_ERROR: "Terjadi kesalahan saat mengakses server mail" + INVALID_INPUT_ARGUMENT: "Uraian input tidak sah" + UNKNOWN_ERROR: "Kesalahan tidak diketahui" + STATIC: + BACK_LINK: "Muat ulang" + DOMAIN_LIST_DESC: "Daftar domain webmail yang boleh diakses." + PHP_EXSTENSIONS_ERROR_DESC: "Extensi PHP yang disyaratkan tidak tersedia dalam konfigurasi PHP anda!" + PHP_VERSION_ERROR_DESC: "Versi PHP anda (%VERSION%) lebih rendah dari syarat minimal yaitu 5.3.0!" + NO_SCRIPT_TITLE: "JavaScript diperlukan oleh aplikasi ini." + NO_SCRIPT_DESC: | + Dukungan Javascript tidak tersedia di peramban anda + Silahkan aktifkan dukungan Javascript di pengaturan peramban anda dan coba lagi. + NO_COOKIE_TITLE: "Dukurangan Cookies diperlukan oleh aplikasi ini." + NO_COOKIE_DESC: | + Dukungan cookies tidak tersedia di peramban anda. + Silahkan aktifkan dukungan Cookies di pengaturan peramban dan coba lagi. + BAD_BROWSER_TITLE: "Peramban anda kadaluarsa." + BAD_BROWSER_DESC: | + Untuk bisa menggunakan semua fitur aplikasi, + unduh dan pasang salah satu peramban berikut: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/is_IS.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/is_IS.yml new file mode 100755 index 00000000..ce8e24f5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/is_IS.yml @@ -0,0 +1,706 @@ +is_IS: + LOGIN: + LABEL_EMAIL: "Netfang" + LABEL_LOGIN: "Innskrá" + LABEL_PASSWORD: "Lykilorð" + LABEL_SIGN_ME: "Muna" + LABEL_VERIFICATION_CODE: "Sannvottunarkóði" + LABEL_DONT_ASK_VERIFICATION_CODE: "Ekki spyrja um kóðann næstu 2 vikur" + BUTTON_SIGN_IN: "Innskrá" + TITLE_SIGN_IN_GOOGLE: "Innskráning með Google" + TITLE_SIGN_IN_FACEBOOK: "Innskráning með Facebook" + TITLE_SIGN_IN_TWITTER: "Innskráning með Twitter" + LABEL_FORGOT_PASSWORD: "Gleymdi lykilorði" + LABEL_REGISTRATION: "Nýskráning" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Bæta við aðgangi" + BUTTON_SETTINGS: "Stillingar" + BUTTON_HELP: "Hjálp" + BUTTON_LOGOUT: "Útskrá" + MOBILE: + BUTTON_MOBILE_VERSION: "Farsímaútgáfa" + BUTTON_DESKTOP_VERSION: "Skjáborðsútgáfa" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Leita" + TITLE_ADV: "Ítarleg leit" + LABEL_ADV_FROM: "Frá" + LABEL_ADV_TO: "Til" + LABEL_ADV_SUBJECT: "Viðfangsefni" + LABEL_ADV_TEXT: "Texti" + LABEL_ADV_HAS_ATTACHMENT: "Er með viðhengi" + LABEL_ADV_HAS_ATTACHMENTS: "Er með viðhengi" + LABEL_ADV_FLAGGED: "Flaggað" + LABEL_ADV_UNSEEN: "Ólesið" + LABEL_ADV_DATE: "Dagsetning" + LABEL_ADV_DATE_ALL: "Allt" + LABEL_ADV_DATE_3_DAYS: "Allt að 3 daga gömlu" + LABEL_ADV_DATE_7_DAYS: "Allt að viku gömlu" + LABEL_ADV_DATE_MONTH: "Allt að mánaðar gömlu" + LABEL_ADV_DATE_3_MONTHS: "Allt að 3 mánaða gömlu" + LABEL_ADV_DATE_6_MONTHS: "Allt að 6 mánaða gömlu" + LABEL_ADV_DATE_YEAR: "Allt að 1 árs gömlu" + BUTTON_ADV_SEARCH: "Leita" + PREVIEW_POPUP: + FULLSCREEN: "Víxla heilskjá af/á" + ZOOM: "Aðdráttir að/frá" + CLOSE: "Loka (Esc)" + LOADING: "Hleð..." + GALLERY_PREV: "Fyrra (vinstri örvarhnappur)" + GALLERY_NEXT: "Næsta (hægri örvarhnappur)" + GALLERY_COUNTER: "%curr% af %total%" + IMAGE_ERROR: "Myndina var ekki hægt að birta." + AJAX_ERROR: "Efnið var ekki hægt að birta." + FOLDER_LIST: + BUTTON_COMPOSE: "Semja" + BUTTON_CONTACTS: "Tengiliðir" + BUTTON_NEW_MESSAGE: "Ný skilaboð" + INBOX_NAME: "Innhólf" + SENT_NAME: "Sent" + DRAFTS_NAME: "Drög" + SPAM_NAME: "Ruslpóstur" + TRASH_NAME: "Ruslafata" + ARCHIVE_NAME: "Safnskrá" + QUOTA: + TITLE: "Disknotkun" + MESSAGE_LIST: + BUTTON_RELOAD: "Endurhlaða skilaboðalista" + BUTTON_MOVE_TO: "Færa í" + BUTTON_DELETE: "Eyða" + BUTTON_ARCHIVE: "Safnskrá" + BUTTON_SPAM: "Ruslpóstur" + BUTTON_NOT_SPAM: "Ekki ruslpóstur" + BUTTON_EMPTY_FOLDER: "Hreinsa möppu" + BUTTON_MULTY_FORWARD: "Áframsenda skilaboð" + BUTTON_DELETE_WITHOUT_MOVE: "Eyða endanlega" + BUTTON_MORE: "Meira" + MENU_SET_SEEN: "Merkja lesið" + MENU_SET_ALL_SEEN: "Merkja allt lesið" + MENU_UNSET_SEEN: "Merkja ólesið" + MENU_SET_FLAG: "Merkja" + MENU_UNSET_FLAG: "Afmerkja" + MENU_SELECT_ALL: "Allt" + MENU_SELECT_NONE: "Ekkert" + MENU_SELECT_INVERT: "Snúa við" + MENU_SELECT_UNSEEN: "Ólesið" + MENU_SELECT_SEEN: "Lesið" + MENU_SELECT_FLAGGED: "Flaggað" + MENU_SELECT_UNFLAGGED: "Afflaggað" + EMPTY_LIST: "Tómur listi." + EMPTY_SEARCH_LIST: "Engin skilaboð stemmdu við leitina þína." + SEARCH_RESULT_FOR: "Leitarniðurstöður fyrir \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "til baka í skilaboðalista" + LIST_LOADING: "Hleð" + EMPTY_SUBJECT_TEXT: "(Ekkert viðfangsefni)" + PUT_MESSAGE_HERE: "Slepptu skilaboðum hér til að skoða það í listanum" + TODAY_AT: "í dag kl. %TIME%" + YESTERDAY_AT: "í gær kl. %TIME%" + SEARCH_PLACEHOLDER: "Leita" + NEW_MESSAGE_NOTIFICATION: "Þú átt %COUNT% ný bréf!" + QUOTA_SIZE: "Notar %SIZE% (%PROC%%) af %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Breyta" + BUTTON_BACK: "Til baka" + BUTTON_CLOSE: "Loka" + BUTTON_DELETE: "Eyða" + BUTTON_UNSUBSCRIBE: "Hætta í áskrift að þessum lista" + BUTTON_ARCHIVE: "Safnskrá" + BUTTON_SPAM: "Ruslpóstur" + BUTTON_NOT_SPAM: "Ekki ruslpóstur" + BUTTON_MOVE_TO: "Færa í" + BUTTON_MORE: "Meira" + BUTTON_REPLY: "Svara" + BUTTON_REPLY_ALL: "Svara öllum" + BUTTON_FORWARD: "Áframsenda" + BUTTON_FORWARD_AS_ATTACHMENT: "Áframsenda sem viðhengi" + BUTTON_EDIT_AS_NEW: "Breyta sem nýju" + BUTTON_SHOW_IMAGES: "Sýna myndir" + BUTTON_NOTIFY_READ_RECEIPT: "Sendandinn hefur beðið um að vera látinn vita þegar þú lest þessi skilaboð." + BUTTON_IN_NEW_WINDOW: "Skoða í öðrum glugga" + BUTTON_THREAD_LIST: "Listi yfir samræður" + BUTTON_THREAD_PREV: "Fyrra" + BUTTON_THREAD_NEXT: "Næsta" + BUTTON_THREAD_MORE: "Fleiri skilaboð" + MENU_HEADERS: "Sýna bréfahausa" + MENU_VIEW_ORIGINAL: "Sýna upprunalegt" + MENU_DOWNLOAD_ORIGINAL: "Niðurhala sem .eml skrá" + MENU_FILTER_SIMILAR: "Sía skilaboð eins og þetta" + MENU_PRINT: "Prenta" + EMPTY_SUBJECT_TEXT: "(Ekkert viðhengi)" + LABEL_SUBJECT: "Viðhengi" + LABEL_DATE: "Dagsetning" + LABEL_FROM: "Frá" + LABEL_FROM_SHORT: "frá" + LABEL_TO: "Til" + LABEL_TO_SHORT: "til" + LABEL_CC: "CC" + LABEL_BCC: "BCC" + LABEL_REPLY_TO: "Svara á" + PRINT_LABEL_FROM: "Frá" + PRINT_LABEL_TO: "Til" + PRINT_LABEL_CC: "CC" + PRINT_LABEL_BCC: "BCC" + PRINT_LABEL_REPLY_TO: "Svara á" + PRINT_LABEL_DATE: "Dagsetning" + PRINT_LABEL_SUBJECT: "Viðhengi" + PRINT_LABEL_ATTACHMENTS: "Viðhengi" + MESSAGE_LOADING: "Hleð" + MESSAGE_VIEW_DESC: "Veldu bréf úr listanum til að skoða hér." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Lykilorð" + PGP_SIGNED_MESSAGE_DESC: "Skeyti undirritað með OpenPGP (smelltu til að sannvotta)" + PGP_ENCRYPTED_MESSAGE_DESC: "Skeyti dulritað með OpenPGP (smelltu til að afkóða)" + LINK_DOWNLOAD_AS_ZIP: "Sækja sem .zip skrá" + LINK_SAVE_TO_OWNCLOUD: "Vista í ownCloud" + LINK_SAVE_TO_DROPBOX: "Vista í Dropbox" + READ_RECEIPT: + SUBJECT: "Móttökukvittun (birt) - %SUBJECT%" + BODY: | + Þetta er kvittun fyrir móttöku á pósti sem þú sendir %READ-RECEIPT%. + + Athugaðu: Þessi móttökukvittun er aðeins staðfesting á því að skeytið var birt á skjá viðtakandans. + Ekkert getur ábyrgst að viðtakandinn hafi lesið eða skilið efni skilaboðanna. + SUGGESTIONS: + SEARCHING_DESC: "Leita..." + CONTACTS: + LEGEND_CONTACTS: "Tengiliðir" + SEARCH_INPUT_PLACEHOLDER: "Leita" + BUTTON_ADD_CONTACT: "Bæta við tengilið" + BUTTON_CREATE_CONTACT: "Búa til" + BUTTON_UPDATE_CONTACT: "Uppfæra" + BUTTON_IMPORT: "Flytja inn (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Flytja út (csv, vcf, vCard)" + BUTTON_EXPORT_CSV: "Flytja út (csv)" + ERROR_IMPORT_FILE: "Villa í innflutningi (ógilt skráasnið)" + LIST_LOADING: "Hleð" + EMPTY_LIST: "Engir tengiliðir hér" + EMPTY_SEARCH: "Engir tengiliðir fundust" + CLEAR_SEARCH: "Hreinsa leit" + CONTACT_VIEW_DESC: "Veldu tengilið í listanum til að skoða hér." + LABEL_DISPLAY_NAME: "Birtingarnafn" + LABEL_EMAIL: "Tölvupóstfang" + LABEL_PHONE: "Sími" + LABEL_WEB: "Vefsíða" + LABEL_BIRTHDAY: "Afmælisdagur" + LINK_ADD_EMAIL: "Bæta við tölvupóstfangi" + LINK_ADD_PHONE: "Bæta við síma" + LINK_BIRTHDAY: "Afmælisdagur" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Settu inn birtingarnafn" + PLACEHOLDER_ENTER_LAST_NAME: "Settu inn kenninafn" + PLACEHOLDER_ENTER_FIRST_NAME: "Settu inn eiginnafn" + PLACEHOLDER_ENTER_NICK_NAME: "Enter nickname" + LABEL_READ_ONLY: "Aðeins lesanlegt" + LABEL_SHARE: "Deila" + ADD_MENU_LABEL: "Bæta við" + ADD_MENU_NICKNAME: "Stuttnefni" + ADD_MENU_NOTES: "Minnispunktar" + ADD_MENU_EMAIL: "Tölvupóstfang" + ADD_MENU_PHONE: "Sími" + ADD_MENU_URL: "URL-slóð" + ADD_MENU_ADDRESS: "Heimilisfang" + ADD_MENU_BIRTHDAY: "Afmælisdagur" + ADD_MENU_TAGS: "Merki" + BUTTON_SHARE_NONE: "Ekkert" + BUTTON_SHARE_ALL: "Allir" + BUTTON_SYNC: "Samstilling (CardDAV)" + COMPOSE: + TITLE_FROM: "Frá" + TITLE_TO: "Til" + TITLE_CC: "CC" + TITLE_BCC: "BCC" + TITLE_REPLY_TO: "Svara á" + TITLE_SUBJECT: "Viðhengi" + LINK_SHOW_INPUTS: "sýna alla reiti" + BUTTON_SEND: "Senda" + BUTTON_SAVE: "Vista" + BUTTON_DELETE: "Eyða" + BUTTON_CANCEL: "Hætta við" + BUTTON_MINIMIZE: "Lágmarka" + SAVED_TIME: "Vistað kl. %TIME%" + SAVED_ERROR_ON_SEND: "Skeyti var sent en ekki vistað í sendingamöppu" + DISCARD_UNSAVED_DATA: "Henda óvistuðum gögnum?" + ATTACH_FILES: "Hengja við skrár" + ATTACH_DROP_FILES_DESC: "Setja skrár hér" + ATTACH_ITEM_CANCEL: "Hætta við" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, skrifaði %EMAIL%" + FORWARD_MESSAGE_TOP_TITLE: "-------- Áframsend skilaboð -------" + FORWARD_MESSAGE_TOP_FROM: "Frá" + FORWARD_MESSAGE_TOP_TO: "Til" + FORWARD_MESSAGE_TOP_CC: "CC" + FORWARD_MESSAGE_TOP_SENT: "Sent" + FORWARD_MESSAGE_TOP_SUBJECT: "Viðfangsefni" + EMPTY_TO_ERROR_DESC: "Vinsamlegast tiltaktu að minnsta kosti einn viðtakanda" + NO_ATTACHMENTS_HERE_DESC: "Engin viðhengi hér." + ATTACHMENTS_ERROR_DESC: "Aðvörun! Ekki er búið að senda inn öll viðhengi." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Ekki er búið að senda inn öll viðhengi." + BUTTON_REQUEST_READ_RECEIPT: "Biðja um staðfestingu á lestri" + BUTTON_MARK_AS_IMPORTANT: "Merkja sem mikilvægt" + BUTTON_OPEN_PGP: "OpenPGP (einungis hreinn texti)" + BUTTON_REQUEST_DSN: "Biðja um staðfestingu á afhendingu" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Loka" + POPUPS_ASK: + BUTTON_YES: "Já" + BUTTON_NO: "Nei" + DESC_WANT_CLOSE_THIS_WINDOW: "Ertu viss um að þú viljir loka þessum glugga?" + DESC_WANT_DELETE_MESSAGES: "Ertu viss um að þú viljir eyða skeytunum?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Veldu tungumálið þitt" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Bæta við aðgangi?" + BUTTON_ADD_ACCOUNT: "Bæta við" + TITLE_UPDATE_ACCOUNT: "Uppfæra aðgang?" + BUTTON_UPDATE_ACCOUNT: "Uppfæra" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Bæta við auðkenni?" + TITLE_UPDATE_IDENTITY: "Uppfæra auðkenni?" + BUTTON_ADD_IDENTITY: "Bæta við" + BUTTON_UPDATE_IDENTITY: "Uppfæra" + LABEL_EMAIL: "Tölvupóstfang" + LABEL_NAME: "Nafn" + LABEL_REPLY_TO: "Svara á" + LABEL_SIGNATURE: "Undirskrift" + LABEL_CC: "Cc" + LABEL_BCC: "Bcc" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Búa til möppu?" + LABEL_NAME: "Nafn á möppu" + LABEL_PARENT: "Undirmappa" + BUTTON_CREATE: "Búa til" + BUTTON_CANCEL: "Hætta við" + BUTTON_CLOSE: "Loka" + TITLE_CREATING_PROCESS: "Bý til möppu" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Fjarlægja öll bréf úr þessari möppu?" + BUTTON_CLEAR: "Hreinsa" + BUTTON_CANCEL: "Hætta við" + BUTTON_CLOSE: "Loka" + DANGER_DESC_WARNING: "Aðvörun!" + DANGER_DESC_HTML_1: "Þessi aðgerð veldur því að öll bréf úr %FOLDER% möppunni." + DANGER_DESC_HTML_2: "Það er ekki hægt að hætta við aðgerðina eftir að búið er að keyra hana." + TITLE_CLEARING_PROCESS: "Tæmi möppu..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Flytja inn OpenPGP-lykil" + BUTTON_IMPORT_OPEN_PGP_KEY: "Flytja inn" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "Skoða OpenPGP-lykil" + BUTTON_SELECT: "Velja" + BUTTON_CLOSE: "Loka" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Búa til OpenPGP-lykla" + LABEL_EMAIL: "Tölvupóstfang" + LABEL_NAME: "Nafn" + LABEL_PASSWORD: "Lykilorð" + LABEL_KEY_BIT_LENGTH: "Lengd lykils" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Útbúa" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "Undirrita/Dulrita OpenPGP" + LABEL_SIGN: "Undirrita" + LABEL_ENCRYPT: "Dulrita" + LABEL_PASSWORD: "Lykilorð" + BUTTON_SIGN: "Undirrita" + BUTTON_ENCRYPT: "Dulrita" + BUTTON_SIGN_AND_ENCRYPT: "Undirrita og dulrita" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "Afkóða OpenPGP" + LABEL_KEY: "Einkalykill" + LABEL_PASSWORD: "Lykilorð" + BUTTON_DECRYPT: "Afkóða" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "Prófun á 2-þrepa sannvottun" + LABEL_CODE: "Kóði" + BUTTON_TEST: "Prófa" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Búa til síu?" + TITLE_EDIT_FILTER: "Uppfæra síu?" + FILTER_NAME: "Heiti" + LEGEND_CONDITIONS: "Skilyrði" + LEGEND_ACTIONS: "Aðgerðir" + BUTTON_DONE: "Lokið" + BUTTON_ADD_CONDITION: "Bæta við skilyrði" + SELECT_ACTION_NONE: "Ekkert" + SELECT_ACTION_MOVE_TO: "Færa í" + SELECT_ACTION_FORWARD_TO: "Áframsenda til" + SELECT_ACTION_REJECT: "Hafna" + SELECT_ACTION_VACATION_MESSAGE: "Skilaboð vegna frís" + SELECT_ACTION_DISCARD: "Henda" + SELECT_FIELD_FROM: "Frá" + SELECT_FIELD_RECIPIENTS: "Viðtakendur (Til eða CC)" + SELECT_FIELD_SUBJECT: "Viðfangsefni" + SELECT_FIELD_HEADER: "Haus" + SELECT_FIELD_SIZE: "Size" + SELECT_TYPE_CONTAINS: "Inniheldur" + SELECT_TYPE_NOT_CONTAINS: "Inniheldur ekki" + SELECT_TYPE_MATCHES: "Samsvaranir (stuðningur við * og ?)" + SELECT_TYPE_NOT_MATCHES: "Ekki-samsvaranir (stuðningur við * og ?)" + SELECT_TYPE_REGEXP: "Regluleg segð" + SELECT_TYPE_NOT_REGEXP: "Ekki regluleg segð" + SELECT_TYPE_EQUAL_TO: "Jafnt og" + SELECT_TYPE_NOT_EQUAL_TO: "Ekki jafnt og" + SELECT_TYPE_OVER: "Yfir" + SELECT_TYPE_UNDER: "Undir" + SELECT_MATCH_ANY: "Samsvarar EINHVERRI af eftirfarandi reglum" + SELECT_MATCH_ALL: "Samsvarar ÖLLUM eftirfarandi reglum" + MARK_AS_READ_LABEL: "Merkja sem lesið" + KEEP_LABEL: "Halda" + STOP_LABEL: "Ekki hætta að vinna með reglur" + EMAIL_LABEL: "Tölvupóstfang" + VACATION_SUBJECT_LABEL: "Viðfangsefni (valkvætt)" + VACATION_MESSAGE_LABEL: "Skilaboð" + VACATION_RECIPIENTS_LABEL: "Viðtakendur (aðgreindir með kommu)" + REJECT_MESSAGE_LABEL: "Hafna skilaboðum" + ALL_INCOMING_MESSAGES_DESC: "Öll innsend skeyti" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Veldu kerfismöppur" + SELECT_CHOOSE_ONE: "Veldu eitt" + SELECT_UNUSE_NAME: "Ekki nota" + LABEL_SENT: "Sent" + LABEL_DRAFTS: "Drög" + LABEL_SPAM: "Ruslpóstur" + LABEL_TRASH: "Ruslafata" + LABEL_ARCHIVE: "Safnskrá" + BUTTON_CANCEL: "Hætta við" + BUTTON_CLOSE: "Loka" + NOTIFICATION_SENT: | + Þú hefur ekki valið kerfismöppuna "Sent" fyrir bréf eftir sendingu. + Ef þú vilt fjarlægja bréfið endanlega, veldu þá valkostinn "Ekki nota". + NOTIFICATION_DRAFTS: "Þú hefur ekki valið kerfismöppuna \"Drög\" þar sem bréf sem eru vistuð í á meðan þú skrifar." + NOTIFICATION_SPAM: | + Þú hefur ekki valið kerfismöppuna "Ruslpóstur" sem ruslsendingar eru settar í. + Ef þú vilt fjarlægja bréfið endanlega, veldu þá valkostinn "Ekki nota". + NOTIFICATION_TRASH: | + Þú hefur ekki valið kerfismöppuna "Ruslafata" sem eydd bréf eru sett í. + Ef þú vilt fjarlægja bréfið endanlega, veldu þá valkostinn "Ekki nota". + NOTIFICATION_ARCHIVE: "Þú hefur ekki valið kerfismöppuna \"Safnskrá\" undir bréf sem á að geyma til langs tíma." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "2-þrepa sannvottun (TOTP)" + LABEL_ENABLE_TWO_FACTOR: "Virkja 2-þrepa sannvottun" + LABEL_TWO_FACTOR_USER: "Notandi" + LABEL_TWO_FACTOR_STATUS: "Staða" + LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" + BUTTON_CREATE: "Create New Secret" + BUTTON_ACTIVATE: "Activate" + BUTTON_CLEAR: "Clear" + BUTTON_LOGOUT: "Logout" + BUTTON_DONE: "Done" + BUTTON_TEST: "Test" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Show Secret" + BUTTON_HIDE_SECRET: "Hide Secret" + TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" + TWO_FACTOR_SECRET_DESC: >- + Import this info into your Google Authenticator client (or other TOTP client) + using the provided QR code below or by entering the code manually. + TWO_FACTOR_BACKUP_CODES_DESC: >- + If you can't receive codes via Google Authenticator, you can use backup codes + to sign in. After you’ve used a backup code to sign in, it will become inactive. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." + TITLES: + LOADING: "Hleð" + LOGIN: "Innskrá" + MAILBOX: "Pósthólf" + SETTINGS: "Stillingar" + COMPOSE: "Semja" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Skráin er of stór" + ERROR_FILE_PARTIALLY_UPLOADED: "Innsending á skrá heppnaðist ekki vegna óþekktrar villu" + ERROR_NO_FILE_UPLOADED: "Engin skrá send inn" + ERROR_MISSING_TEMP_FOLDER: "Tímabundna skráin er ekki til staðar" + ERROR_ON_SAVING_FILE: "Óþekkt innsendingar villa kom upp" + ERROR_FILE_TYPE: "Röng skráar tegund" + ERROR_UNKNOWN: "Óþekkt innsendingar villa kom upp" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXTI" + TEXT_SWITCHER_RICH_FORMATTING: "Rich forsnið" + TEXT_SWITCHER_CONFIRM: "Texta forsnið og myndir munu týnast. Ertu viss um að þú viljir halda áfram?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Persónulegt" + LABEL_GENERAL_NAME: "Almennt" + LABEL_CONTACTS_NAME: "Contacts" + LABEL_FOLDERS_NAME: "Möppur" + LABEL_ACCOUNTS_NAME: "Aðgangar" + LABEL_IDENTITY_NAME: "Identity" + LABEL_IDENTITIES_NAME: "Identities" + LABEL_FILTERS_NAME: "Filters" + LABEL_TEMPLATES_NAME: "Templates" + LABEL_SECURITY_NAME: "Security" + LABEL_SOCIAL_NAME: "Social" + LABEL_THEMES_NAME: "Þemur" + LABEL_CHANGE_PASSWORD_NAME: "Lykilorð" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Til baka" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filters" + BUTTON_SAVE: "Save" + BUTTON_ADD_FILTER: "Add a Filter" + BUTTON_DELETE: "Delete" + BUTTON_RAW_SCRIPT: "Use Custom User Script" + SUBNAME_NONE: "None" + SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" + SUBNAME_REJECT: "Reject" + SUBNAME_VACATION_MESSAGE: "Vacation message" + SUBNAME_DISCARD: "Discard" + CAPABILITY_LABEL: "Capability" + LOADING_PROCESS: "Updating filter list" + DELETING_ASK: "Are you sure?" + CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identity" + LABEL_DISPLAY_NAME: "Nafn" + LABEL_REPLY_TO: "Svara" + LABEL_SIGNATURE: "Undirskrift" + LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Security" + LABEL_CONFIGURE_TWO_FACTOR: "Stilla 2-þrepa sannvottun" + LABEL_AUTOLOGOUT: "Auto Logout" + AUTOLOGIN_NEVER_OPTION_NAME: "Never" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% klukkustund(ir)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Almennt" + LABEL_LANGUAGE: "Tungumál" + LABEL_IDENTITY: "Identity" + LABEL_LAYOUT: "Layout" + LABEL_LAYOUT_NO_SPLIT: "No Split" + LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" + LABEL_EDITOR: "Sjálfgefinn textaritill" + LABEL_EDITOR_HTML: "Html" + LABEL_EDITOR_PLAIN: "Venjulegur" + LABEL_EDITOR_HTML_FORCED: "Html (forced)" + LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" + LABEL_ANIMATION: "Interface animation" + LABEL_ANIMATION_FULL: "Full" + LABEL_ANIMATION_NORMAL: "Normal" + LABEL_ANIMATION_NONE: "None" + LABEL_VIEW_OPTIONS: "Sýni valmöguleikar" + LABEL_USE_PREVIEW_PANE: "Nota forskoðunarham" + LABEL_USE_CHECKBOXES_IN_LIST: "Sýna valkassa í listanum" + LABEL_USE_THREADS: "Nota þræði" + LABEL_REPLY_SAME_FOLDER: "Setja svör í möppu þar sem bréfið sem er verið að svara" + LABEL_SHOW_IMAGES: "Sýna ávallt myndir í bréfum" + LABEL_SHOW_ANIMATION: "Sýna hreyfingar" + LABEL_MESSAGE_PER_PAGE: "Bréf á síðu" + LABEL_NOTIFICATIONS: "Tilkynningar" + LABEL_SOUND_NOTIFICATION: "Sound notification" + LABEL_CHROME_NOTIFICATION_DESC: "Sýna tilkynningarglugga fyrir ný bréf" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Lokað af vafra)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Contacts" + LABEL_CONTACTS_AUTOSAVE: "Automatically add recipients to your address book" + LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" + LABEL_CONTACTS_SYNC_SERVER: "Server" + LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" + LABEL_CONTACTS_SYNC_USER: "User" + LABEL_CONTACTS_SYNC_PASSWORD: "Password" + SETTINGS_THEMES: + LEGEND_THEMES: "Þemur" + LEGEND_THEMES_CUSTOM: "Sérsniðin þemu stilling" + LABEL_CUSTOM_TYPE: "Tegund" + LABEL_CUSTOM_TYPE_LIGHT: "Ljós" + LABEL_CUSTOM_TYPE_DARK: "Dökk" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Bakgrunnur" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Senda inn bakgrunnsmynd (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Skrá er of stór" + ERROR_FILE_TYPE_ERROR: "Röng skráartegund (aðeins JPG and PNG)" + ERROR_UNKNOWN: "Óþekkt innsendingarvilla kom upp" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Tengja Google" + BUTTON_GOOGLE_DISCONNECT: "Aftengja Google" + MAIN_GOOGLE_DESC: "Eftir að Google innskráing hefur verið gerð virk, þá getur þú skráð þig inná þennan aðgang með Google takkanum á innskráningarsíðu." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Tengja Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Aftengja Facebook" + MAIN_FACEBOOK_DESC: "Eftir að Facebook innskráing hefur verið gerð virk, þá getur þú skráð þig inná þennan aðgang með Facebook takkanum á innskráningarsíðu." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Tengja Twitter" + BUTTON_TWITTER_DISCONNECT: "Aftengja Twitter" + MAIN_TWITTER_DESC: "Eftir að Twitter innskráing hefur verið gerð virk, þá getur þú skráð þig inná þennan aðgang með Twitter takkanum á innskráningarsíðu.." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Möppulisti" + BUTTON_CREATE: "Búa til möppu" + BUTTON_SYSTEM: "Kerfismöppur" + BUTTON_DELETE: "Eyða" + BUTTON_SUBSCRIBE: "Áskrift" + BUTTON_UNSUBSCRIBE: "Afskrá" + LOADING_PROCESS: "Uppfæri möppu lista" + CREATING_PROCESS: "Bý til möppu" + DELETING_PROCESS: "Eyði möppu" + RENAMING_PROCESS: "Endurnefna möppu" + DELETING_ASK: "Ertu viss?" + TO_MANY_FOLDERS_DESC_1: "You have too many folders!" + TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." + HELP_DELETE_FOLDER: "Delete folder" + HELP_SHOW_HIDE_FOLDER: "Show/hide folder" + HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Aðgangslisti" + LEGEND_IDENTITIES: "Identities" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" + BUTTON_ADD_ACCOUNT: "Bæta við aðgangi" + BUTTON_ADD_IDENTITY: "Add an Identity" + BUTTON_DELETE: "Eyða" + LOADING_PROCESS: "Uppfæri aðgangslista" + DELETING_ASK: "Ertu viss?" + DEFAULT_IDENTITY_LABEL: "default" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identity" + LEGEND_IDENTITIES: "Additional Identities" + LABEL_DEFAULT: "Default" + LABEL_DISPLAY_NAME: "Nafn" + LABEL_REPLY_TO: "Svara" + LABEL_SIGNATURE: "Undirskrift" + LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" + BUTTON_ADD_IDENTITY: "Add Identity" + BUTTON_DELETE: "Delete" + LOADING_PROCESS: "Updating identity list" + DELETING_ASK: "Are you sure?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Breyta lykilorði" + LABEL_CURRENT_PASSWORD: "Núverandi lykilorð" + LABEL_NEW_PASSWORD: "Nýtt lykilorð" + LABEL_REPEAT_PASSWORD: "Nýtt lykilorð aftur" + BUTTON_UPDATE_PASSWORD: "Setja nýtt lykilorð" + ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" + TITLE_PRIVATE: "Private" + TITLE_PUBLIC: "Public" + DELETING_ASK: "Are you sure?" + GENERATE_ONLY_HTTPS: "HTTPS only" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" + TAB_MAILBOX: "Mailbox" + TAB_MESSAGE_LIST: "Message list" + TAB_MESSAGE_VIEW: "Message view" + TAB_COMPOSE: "Compose" + LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" + LABEL_REPLY: "Reply" + LABEL_REPLY_ALL: "Reply All" + LABEL_FORWARD: "Forward" + LABEL_FORWARD_MULTIPLY: "Forward (multiply)" + LABEL_HELP: "Help" + LABEL_CHECK_ALL: "Select all messages" + LABEL_ARCHIVE: "Archive" + LABEL_DELETE: "Delete" + LABEL_OPEN_THREAD: "Open selected thread" + LABEL_MOVE: "Move" + LABEL_READ: "Read selected messages" + LABEL_UNREAD: "Unread selected messages" + LABEL_IMPORTANT: "Mikilvægt, flagga valin skeyti" + LABEL_SEARCH: "Search" + LABEL_CANCEL_SEARCH: "Cancel search" + LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" + LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" + LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" + LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" + LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" + LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" + LABEL_THREAD_NEXT: "Next message in thread" + LABEL_THREAD_PREV: "Previous message in thread" + LABEL_PRINT: "Print" + LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" + LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" + LABEL_SWITCH_TO_LIST: "Switch focus back to message list" + LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" + LABEL_SAVE_MESSAGE: "Save message" + LABEL_SEND_MESSAGE: "Send message" + LABEL_CLOSE_COMPOSE: "Close compose" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "No public keys found" + NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" + NO_PRIVATE_KEY_FOUND: "No private key found" + NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" + ADD_A_PUBLICK_KEY: "Add a public key" + SELECT_A_PRIVATE_KEY: "Veldu einkalykil" + UNVERIFIRED_SIGNATURE: "Unverified signature" + DECRYPTION_ERROR: "OpenPGP decryption error" + GOOD_SIGNATURE: "Good signature from %USER%" + PGP_ERROR: "OpenPGP error: %ERROR%" + SPECIFY_FROM_EMAIL: "Please specify FROM email address" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" + NOTIFICATIONS: + INVALID_TOKEN: "Rangt tákn" + AUTH_ERROR: "Auðkenning mistókst" + ACCESS_ERROR: "Aðgangsvilla" + CONNECTION_ERROR: "Get ekki tengst á netþjón" + CAPTCHA_ERROR: "Rangt CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- + Þetta samfélags ID er ekki úthlutað á neitt netfang ennþá. Skráðu þig inn + með netfangs upplýsingum og bættu þessum valmöguleika við í aðgangsstillingum. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- + Þetta samfélags ID er ekki úthlutað á neitt netfang ennþá. Skráðu þig inn + með netfangs upplýsingum og bættu þessum valmöguleika við í aðgangsstillingum. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- + Þetta samfélags ID er ekki úthlutað á neitt netfang ennþá. Skráðu þig inn + með netfangs upplýsingum og bættu þessum valmöguleika við í aðgangsstillingum. + DOMAIN_NOT_ALLOWED: "Lén ekki leyft" + ACCOUNT_NOT_ALLOWED: "Account is not allowed" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" + COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" + CURRENT_PASSWORD_INCORRECT: "Current password incorrect" + NEW_PASSWORD_SHORT: "Password is too short" + NEW_PASSWORD_WEAK: "Password is too easy" + NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" + CONTACTS_SYNC_ERROR: "Contacts synchronization error" + CANT_GET_MESSAGE_LIST: "Get ekki sótt bréfa lista" + CANT_GET_MESSAGE: "Get ekki sótt bréf" + CANT_DELETE_MESSAGE: "Get ekki eytt bréfi" + CANT_MOVE_MESSAGE: "Get ekki fært bréf" + CANT_SAVE_MESSAGE: "Get ekki vistað bréf" + CANT_SEND_MESSAGE: "Get ekki sent bréf" + INVALID_RECIPIENTS: "Rangir viðtakendur" + CANT_SAVE_FILTERS: "Can't save filters" + CANT_GET_FILTERS: "Can't get filters" + FILTERS_ARE_NOT_CORRECT: "Filters are not correct" + CANT_CREATE_FOLDER: "Get ekki búið til möppu" + CANT_RENAME_FOLDER: "Get ekki endurnefnt möppu" + CANT_DELETE_FOLDER: "Get ekki eytt möppu" + CANT_DELETE_NON_EMPTY_FOLDER: "Get ekki eytt möppu í notkun" + CANT_SUBSCRIBE_FOLDER: "Get ekki gerst áskrifandi á möppu" + CANT_UNSUBSCRIBE_FOLDER: "Get ekki hætt áskrift á möppu" + CANT_SAVE_SETTINGS: "Get ekki vistað stillingar" + CANT_SAVE_PLUGIN_SETTINGS: "Get ekki stillingar" + DOMAIN_ALREADY_EXISTS: "Lén tilstaðar núþegar" + CANT_INSTALL_PACKAGE: "Mistókst að setja inn pakka" + CANT_DELETE_PACKAGE: "Mistókst að fjarlægja pakka" + INVALID_PLUGIN_PACKAGE: "Rangur forrita pakki" + UNSUPPORTED_PLUGIN_PACKAGE: "Óstuddur forrita pakki" + LICENSING_SERVER_IS_UNAVAILABLE: "Áskriftar netþjónn er ekki aðgengilegur" + LICENSING_DOMAIN_EXPIRED: "Áskrift furir þetta lén hefur runnið út." + LICENSING_DOMAIN_BANNED: "Áskrift fyrir þetta lén er bönnuð." + DEMO_SEND_MESSAGE_ERROR: "Vegna öryggissjónarmiða, þá hefur þessi sýni aðgangur ekki leyfi til að senda bréf á utanaðkomandi netföng!" + DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" + ACCOUNT_ALREADY_EXISTS: "Aðgangur er til núþegar" + ACCOUNT_DOES_NOT_EXIST: "Aðgangur er ekki til" + MAIL_SERVER_ERROR: "Villa kom upp við tilraun til að tengjast netþjóni" + INVALID_INPUT_ARGUMENT: "Invalid input argument" + UNKNOWN_ERROR: "Óþekkt villa" + STATIC: + BACK_LINK: "Endurhlaða" + DOMAIN_LIST_DESC: "Listi yfir lén sem vefpóstur má tengjast." + PHP_EXSTENSIONS_ERROR_DESC: "Nauðsynlegar PHP framlenginar eru ekki til staðar í PHP uppsetningunni þinni!" + PHP_VERSION_ERROR_DESC: "PHP útgáfan þín (%VERSION%) er eldri en lágmarks útgáfa sem krafist er (5.3.0)!" + NO_SCRIPT_TITLE: "JavaScript er nauðsynlegt fyrir þetta forrit." + NO_SCRIPT_DESC: | + JavaScript stuðningur er ekki til staðar fyrir vafrann þinn. + Vinsamlegast gerðu JavaScript virkt í vafranum þínum og reyndu aftur. + NO_COOKIE_TITLE: "Köku stuðningur er nauðsynlegur fyrir þetta forrit." + NO_COOKIE_DESC: | + Köku stuðningur er ekki til staðar í vafranum þínum. + Vinsamlegast gerðu JavaScript virkt í vafranum þínum og reyndu aftur. + BAD_BROWSER_TITLE: "Vafrinn þinn er úreltur." + BAD_BROWSER_DESC: | + Til að geta notað alla valmöguleika í þessu forriti, + niðurhalaðu og settu upp einn af þessum vöfrum: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/it_IT.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/it_IT.yml new file mode 100755 index 00000000..0468eaa6 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/it_IT.yml @@ -0,0 +1,713 @@ +it_IT: + LOGIN: + LABEL_EMAIL: "Email" + LABEL_LOGIN: "Login" + LABEL_PASSWORD: "Password" + LABEL_SIGN_ME: "Ricordami" + LABEL_VERIFICATION_CODE: "Codice di verifica" + LABEL_DONT_ASK_VERIFICATION_CODE: "Non chiedere il codice per 2 settimane" + BUTTON_SIGN_IN: "Accedi" + TITLE_SIGN_IN_GOOGLE: "Accedi usando Google" + TITLE_SIGN_IN_FACEBOOK: "Accedi usando Facebook" + TITLE_SIGN_IN_TWITTER: "Accedi usando Twitter" + LABEL_FORGOT_PASSWORD: "Ho dimenticato la password" + LABEL_REGISTRATION: "Registrazione" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Aggiungi account" + BUTTON_SETTINGS: "Impostazioni" + BUTTON_HELP: "Aiuto" + BUTTON_LOGOUT: "Esci" + MOBILE: + BUTTON_MOBILE_VERSION: "Versione mobile" + BUTTON_DESKTOP_VERSION: "Versione desktop" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Cerca" + TITLE_ADV: "Ricerca avanzata" + LABEL_ADV_FROM: "Da" + LABEL_ADV_TO: "A" + LABEL_ADV_SUBJECT: "Oggetto" + LABEL_ADV_TEXT: "Messaggio" + LABEL_ADV_HAS_ATTACHMENT: "Ha un allegato" + LABEL_ADV_HAS_ATTACHMENTS: "Ha più allegati" + LABEL_ADV_FLAGGED: "Preferiti" + LABEL_ADV_UNSEEN: "Non letti" + LABEL_ADV_DATE: "Data" + LABEL_ADV_DATE_ALL: "Tutte" + LABEL_ADV_DATE_3_DAYS: "Meno di 3 giorni fa" + LABEL_ADV_DATE_7_DAYS: "Meno di una settimana fa" + LABEL_ADV_DATE_MONTH: "Meno di un mese fa" + LABEL_ADV_DATE_3_MONTHS: "Meno di 3 mesi fa" + LABEL_ADV_DATE_6_MONTHS: "Meno di 6 mesi fa" + LABEL_ADV_DATE_YEAR: "Meno di un anno fa" + BUTTON_ADV_SEARCH: "Cerca" + PREVIEW_POPUP: + FULLSCREEN: "Passa a schermo intero" + ZOOM: "Ingrandisci +/-" + CLOSE: "Chiudi (Esc)" + LOADING: "Caricamento..." + GALLERY_PREV: "Precedente (Freccia sinistra)" + GALLERY_NEXT: "Successivo (Freccia destra)" + GALLERY_COUNTER: "%curr% di %total%" + IMAGE_ERROR: "L'immagine non può essere caricata." + AJAX_ERROR: "Il contenuto non può essere caricato." + FOLDER_LIST: + BUTTON_COMPOSE: "Scrivi messaggio" + BUTTON_CONTACTS: "Contatti" + BUTTON_NEW_MESSAGE: "Nuovo messaggio" + INBOX_NAME: "Posta in arrivo" + SENT_NAME: "Posta inviata" + DRAFTS_NAME: "Bozze" + SPAM_NAME: "Spam" + TRASH_NAME: "Cestino" + ARCHIVE_NAME: "Archivio" + QUOTA: + TITLE: "Uso della quota" + MESSAGE_LIST: + BUTTON_RELOAD: "Aggiorna" + BUTTON_MOVE_TO: "Sposta in" + BUTTON_DELETE: "Elimina" + BUTTON_ARCHIVE: "Archivia" + BUTTON_SPAM: "Segnala come spam" + BUTTON_NOT_SPAM: "Segnala come non spam" + BUTTON_EMPTY_FOLDER: "Svuota cartella" + BUTTON_MULTY_FORWARD: "Inoltra messaggi" + BUTTON_DELETE_WITHOUT_MOVE: "Elimina definitivamente" + BUTTON_MORE: "Altro" + MENU_SET_SEEN: "Marca come letto" + MENU_SET_ALL_SEEN: "Marca tutti come letti" + MENU_UNSET_SEEN: "Marca come non letto" + MENU_SET_FLAG: "Marca come preferito" + MENU_UNSET_FLAG: "Marca come non preferito" + MENU_SELECT_ALL: "Tutti" + MENU_SELECT_NONE: "Nessuno" + MENU_SELECT_INVERT: "Inverti" + MENU_SELECT_UNSEEN: "Non letti" + MENU_SELECT_SEEN: "Letti" + MENU_SELECT_FLAGGED: "Preferiti" + MENU_SELECT_UNFLAGGED: "Non preferiti" + EMPTY_LIST: "Lista vuota" + EMPTY_SEARCH_LIST: "Nessun messaggio corrisponde alla tua ricerca" + SEARCH_RESULT_FOR: "Risultati di ricerca per \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "ritorna alla lista dei messaggi" + LIST_LOADING: "Caricamento..." + EMPTY_SUBJECT_TEXT: "(Nessun oggetto)" + PUT_MESSAGE_HERE: "Trascina il messaggio qui per vederlo nella lista" + TODAY_AT: "oggi alle %TIME%" + YESTERDAY_AT: "ieri alle %TIME%" + SEARCH_PLACEHOLDER: "Cerca" + NEW_MESSAGE_NOTIFICATION: "Hai %COUNT% nuovi messaggi!" + QUOTA_SIZE: "Stai usando %SIZE% (%PROC%%) su %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Modifica" + BUTTON_BACK: "Indietro" + BUTTON_CLOSE: "Chiudi" + BUTTON_DELETE: "Elimina" + BUTTON_UNSUBSCRIBE: "Disiscriviti da questa lista" + BUTTON_ARCHIVE: "Archivia" + BUTTON_SPAM: "Spam" + BUTTON_NOT_SPAM: "Non spam" + BUTTON_MOVE_TO: "Sposta in" + BUTTON_MORE: "Altro" + BUTTON_REPLY: "Rispondi" + BUTTON_REPLY_ALL: "Rispondi a tutti" + BUTTON_FORWARD: "Inoltra" + BUTTON_FORWARD_AS_ATTACHMENT: "Inoltra come allegato" + BUTTON_EDIT_AS_NEW: "Modifica come nuovo" + BUTTON_SHOW_IMAGES: "Mostra immagini esterne" + BUTTON_NOTIFY_READ_RECEIPT: "Chi ha inviato il messaggio ha richiesto di essere avvisato quando lo leggi." + BUTTON_IN_NEW_WINDOW: "Leggi in una finestra separata" + BUTTON_THREAD_LIST: "Messaggi in questa conversazione" + BUTTON_THREAD_PREV: "Messaggio precedente" + BUTTON_THREAD_NEXT: "Prossimo messaggio" + BUTTON_THREAD_MORE: "Più messaggi" + MENU_HEADERS: "Mostra le intestazioni del messaggio" + MENU_VIEW_ORIGINAL: "Visualizza sorgente" + MENU_DOWNLOAD_ORIGINAL: "Scarica come file .eml" + MENU_FILTER_SIMILAR: "Mostra messaggi come questo" + MENU_PRINT: "Stampa" + EMPTY_SUBJECT_TEXT: "(Nessun oggetto)" + LABEL_SUBJECT: "Oggetto" + LABEL_DATE: "Data" + LABEL_FROM: "Da" + LABEL_FROM_SHORT: "da" + LABEL_TO: "A" + LABEL_TO_SHORT: "a" + LABEL_CC: "CC" + LABEL_BCC: "CCN" + LABEL_REPLY_TO: "Rispondi a" + PRINT_LABEL_FROM: "Da" + PRINT_LABEL_TO: "A" + PRINT_LABEL_CC: "CC" + PRINT_LABEL_BCC: "CCN" + PRINT_LABEL_REPLY_TO: "Rispondi a" + PRINT_LABEL_DATE: "Data" + PRINT_LABEL_SUBJECT: "Oggetto" + PRINT_LABEL_ATTACHMENTS: "Allegati" + MESSAGE_LOADING: "Caricamento..." + MESSAGE_VIEW_DESC: "Seleziona un messaggio dalla lista per visualizzarlo qui" + MESSAGE_VIEW_MOVE_DESC: "Clicca sul nome della cartella nel pannello sinistro per selezionare la destinazione." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" + PGP_SIGNED_MESSAGE_DESC: "Messaggio firmato con OpenPGP (clicca qui per verificarlo)" + PGP_ENCRYPTED_MESSAGE_DESC: "Messaggio cifrato con OpenPGP (clicca qui per decifrarlo)" + LINK_DOWNLOAD_AS_ZIP: "Scarica come archivio ZIP" + LINK_SAVE_TO_OWNCLOUD: "Salva su OwnCloud" + LINK_SAVE_TO_CLOUD: "Salva nel cloud" + LINK_SAVE_TO_DROPBOX: "Salva su DropBox" + READ_RECEIPT: + SUBJECT: "Avviso di lettura - %SUBJECT%" + BODY: | + Questo è un avviso di lettura per la mail che hai inviato a %READ-RECEIPT%. + + Attenzione: questa notifica di lettura significa solo che il messaggio è stato visualizzato nel computer del destinatario. + Non c'è alcuna garanzia che il destinatario abbia letto o capito il contenuto del messaggio. + SUGGESTIONS: + SEARCHING_DESC: "Cerca..." + CONTACTS: + LEGEND_CONTACTS: "Contatti" + SEARCH_INPUT_PLACEHOLDER: "Cerca" + BUTTON_ADD_CONTACT: "Aggiungi contatto" + BUTTON_CREATE_CONTACT: "Crea" + BUTTON_UPDATE_CONTACT: "Aggiorna" + BUTTON_IMPORT: "Importa (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Esporta (vcf, vCard)" + BUTTON_EXPORT_CSV: "Esporta (csv)" + ERROR_IMPORT_FILE: "Errore di importazione (formato del file non valido)" + LIST_LOADING: "Caricamento..." + EMPTY_LIST: "Nessun contatto qui" + EMPTY_SEARCH: "Nessun contatto trovato" + CLEAR_SEARCH: "Pulisci ricerca" + CONTACT_VIEW_DESC: "Seleziona un contatto dalla lista per visualizzarlo qui" + LABEL_DISPLAY_NAME: "Nome visualizzato" + LABEL_EMAIL: "Email" + LABEL_PHONE: "Telefono" + LABEL_WEB: "Sito web" + LABEL_BIRTHDAY: "Compleanno" + LINK_ADD_EMAIL: "Aggiungi un'indirizzo email" + LINK_ADD_PHONE: "Aggiungi un numero di telefono" + LINK_BIRTHDAY: "Compleanno" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Inserisci il nome visualizzato" + PLACEHOLDER_ENTER_LAST_NAME: "Inserisci il cognome" + PLACEHOLDER_ENTER_FIRST_NAME: "Inserisci il nome" + PLACEHOLDER_ENTER_NICK_NAME: "Inserisci il nickname" + LABEL_READ_ONLY: "Sola lettura" + LABEL_SHARE: "Condividi" + ADD_MENU_LABEL: "Aggiungi" + ADD_MENU_NICKNAME: "Nickname" + ADD_MENU_NOTES: "Note" + ADD_MENU_EMAIL: "Indirizzo email" + ADD_MENU_PHONE: "Telefono" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Indirizzo" + ADD_MENU_BIRTHDAY: "Compleanno" + ADD_MENU_TAGS: "Tag" + BUTTON_SHARE_NONE: "Nessuno" + BUTTON_SHARE_ALL: "Tutti" + BUTTON_SYNC: "Sincronizzazione (CardDAV)" + COMPOSE: + TITLE_FROM: "Da" + TITLE_TO: "A" + TITLE_CC: "CC" + TITLE_BCC: "CCN" + TITLE_REPLY_TO: "Rispondi a" + TITLE_SUBJECT: "Oggetto" + LINK_SHOW_INPUTS: "Visualizza tutti i campi" + BUTTON_SEND: "Invia" + BUTTON_SAVE: "Salva" + BUTTON_DELETE: "Elimina" + BUTTON_CANCEL: "Annulla" + BUTTON_MINIMIZE: "Minimizza" + SAVED_TIME: "Salvata il %TIME%" + SAVED_ERROR_ON_SEND: "Il messaggio è stato inviato ma non è stato salvato nella cartella \"Posta inviata\"" + DISCARD_UNSAVED_DATA: "Elimino i dati non salvati?" + ATTACH_FILES: "Allega file" + ATTACH_DROP_FILES_DESC: "Trascina i file qui" + ATTACH_ITEM_CANCEL: "Annulla" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" + FORWARD_MESSAGE_TOP_TITLE: "------- Messaggio inoltrato -------" + FORWARD_MESSAGE_TOP_FROM: "Da" + FORWARD_MESSAGE_TOP_TO: "A" + FORWARD_MESSAGE_TOP_CC: "CC" + FORWARD_MESSAGE_TOP_SENT: "Inviato il" + FORWARD_MESSAGE_TOP_SUBJECT: "Oggetto" + EMPTY_TO_ERROR_DESC: "Specifica almeno un destinatario" + NO_ATTACHMENTS_HERE_DESC: "Nessun allegato." + ATTACHMENTS_ERROR_DESC: "Attenzione! Non tutti gli allegati sono stati caricati." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Non tutti gli allegati sono stati caricati al momento." + BUTTON_REQUEST_READ_RECEIPT: "Richiedi conferma di lettura" + BUTTON_MARK_AS_IMPORTANT: "Marca come importante" + BUTTON_OPEN_PGP: "OpenPGP (Solo testo semplice)" + BUTTON_REQUEST_DSN: "Richiedi conferma del ricevimento" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Chiudi" + POPUPS_ASK: + BUTTON_YES: "Si" + BUTTON_NO: "No" + DESC_WANT_CLOSE_THIS_WINDOW: "Sei sicuro di voler chiudere questa finestra?" + DESC_WANT_DELETE_MESSAGES: "Sei sicuro di voler eliminare il messaggio?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Seleziona lingua" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Aggiungo un account?" + BUTTON_ADD_ACCOUNT: "Aggiungi" + TITLE_UPDATE_ACCOUNT: "Aggiorno account?" + BUTTON_UPDATE_ACCOUNT: "Aggiorna" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Aggiungo un'identità?" + TITLE_UPDATE_IDENTITY: "Aggiorno identità?" + BUTTON_ADD_IDENTITY: "Aggiungi" + BUTTON_UPDATE_IDENTITY: "Aggiorna" + LABEL_EMAIL: "Email" + LABEL_NAME: "Nome" + LABEL_REPLY_TO: "Rispondi a" + LABEL_SIGNATURE: "Firma" + LABEL_CC: "CC" + LABEL_BCC: "CCN" + LABEL_SIGNATURE_INSERT_BEFORE: "Inserisci questa firma prima del messaggio citato nelle risposte" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Creo una cartella?" + LABEL_NAME: "Nome cartella" + LABEL_PARENT: "Genitore" + BUTTON_CREATE: "Crea" + BUTTON_CANCEL: "Annulla" + BUTTON_CLOSE: "Chiudi" + TITLE_CREATING_PROCESS: "Creazione cartella..." + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Elimino tutti i messaggi dalla cartella?" + BUTTON_CLEAR: "Elimina" + BUTTON_CANCEL: "Annulla" + BUTTON_CLOSE: "Chiudi" + DANGER_DESC_WARNING: "Attenzione!" + DANGER_DESC_HTML_1: "Questa azione eliminerà tutti i messaggi presenti nella cartella %FOLDER%." + DANGER_DESC_HTML_2: "Una volta iniziato, il processo non può più essere annullato." + TITLE_CLEARING_PROCESS: "Eliminazione cartella..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Importa chiave OpenPGP" + BUTTON_IMPORT_OPEN_PGP_KEY: "Importa" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "Visualizza chiave OpenPGP" + BUTTON_SELECT: "Seleziona tutto" + BUTTON_CLOSE: "Chiudi" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Genera chiavi OpenPGP" + LABEL_EMAIL: "Indirizzo email" + LABEL_NAME: "Nome" + LABEL_PASSWORD: "Password" + LABEL_KEY_BIT_LENGTH: "Lunghezza della chiave" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Genera" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "Firma/Cifra con OpenPGP" + LABEL_SIGN: "Firma" + LABEL_ENCRYPT: "Cifra" + LABEL_PASSWORD: "Password" + BUTTON_SIGN: "Firma" + BUTTON_ENCRYPT: "Cifra" + BUTTON_SIGN_AND_ENCRYPT: "Firma e cifra" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" + LABEL_KEY: "Private Key" + LABEL_PASSWORD: "Password" + BUTTON_DECRYPT: "Decrypt" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "Verifica a 2 fattori" + LABEL_CODE: "Codice" + BUTTON_TEST: "Esegui test" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Creo un filtro?" + TITLE_EDIT_FILTER: "Aggiorno il filtro?" + FILTER_NAME: "Nome" + LEGEND_CONDITIONS: "Condizioni" + LEGEND_ACTIONS: "Azioni" + BUTTON_DONE: "Fatto" + BUTTON_ADD_CONDITION: "Aggiungi una condizione" + SELECT_ACTION_NONE: "Nessuna" + SELECT_ACTION_MOVE_TO: "Sposta in" + SELECT_ACTION_FORWARD_TO: "Inoltra a" + SELECT_ACTION_REJECT: "Rifiuta" + SELECT_ACTION_VACATION_MESSAGE: "Messaggio fuori-ufficio" + SELECT_ACTION_DISCARD: "Scarta" + SELECT_FIELD_FROM: "Da" + SELECT_FIELD_RECIPIENTS: "Destinatari (A oppure CC)" + SELECT_FIELD_SUBJECT: "Oggetto" + SELECT_FIELD_HEADER: "Intestazione" + SELECT_FIELD_SIZE: "Dimensione" + SELECT_TYPE_CONTAINS: "Contiene" + SELECT_TYPE_NOT_CONTAINS: "Non contiene" + SELECT_TYPE_MATCHES: "Corrisponde (* e ? supportati)" + SELECT_TYPE_NOT_MATCHES: "Non corrisponde (* e ? supportati)" + SELECT_TYPE_REGEXP: "Corrisponde Regexp" + SELECT_TYPE_NOT_REGEXP: "Non corrisponde regexp" + SELECT_TYPE_EQUAL_TO: "Uguale a" + SELECT_TYPE_NOT_EQUAL_TO: "Non uguale a" + SELECT_TYPE_OVER: "Maggiore di" + SELECT_TYPE_UNDER: "Minore di" + SELECT_MATCH_ANY: "Corrisponde ad una delle seguenti regole" + SELECT_MATCH_ALL: "Corrisponde a tutte le seguenti regole" + MARK_AS_READ_LABEL: "Marca come letto" + REPLY_INTERVAL_LABEL: "Intervallo di risposta (giorni)" + KEEP_LABEL: "Mantieni" + STOP_LABEL: "Non interrompere l'elaborazione delle regole" + EMAIL_LABEL: "Email" + VACATION_SUBJECT_LABEL: "Oggetto (opzionale)" + VACATION_MESSAGE_LABEL: "Messaggio" + VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" + REJECT_MESSAGE_LABEL: "Rifiuta messagio" + ALL_INCOMING_MESSAGES_DESC: "Tutti i messaggi in ingresso" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Seleziona le cartelle di sistema" + SELECT_CHOOSE_ONE: "Selezionane una" + SELECT_UNUSE_NAME: "Non usarla" + LABEL_SENT: "Posta inviata" + LABEL_DRAFTS: "Bozze" + LABEL_SPAM: "Spam" + LABEL_TRASH: "Cestino" + LABEL_ARCHIVE: "Archivio" + BUTTON_CANCEL: "Annulla" + BUTTON_CLOSE: "Chiudi" + NOTIFICATION_SENT: | + Non hai selezionato una cartella di sistema per la posta inviata. + Se non vuoi salvare i messaggi inviati seleziona "Non usarla". + NOTIFICATION_DRAFTS: "Non hai selezionato una cartella di sistema per le bozze." + NOTIFICATION_SPAM: | + Non hai selezionato una cartella di sistema per i messaggi spam. + Se li vuoi eliminare permanentemente seleziona "Non usarla". + NOTIFICATION_TRASH: | + Non hai selezionato una cartella di sistema per il cestino. + Se non lo vuoi usare (e quindi eliminare i messaggi permanentemente) seleziona "Non usarla". + NOTIFICATION_ARCHIVE: "Non hai selezionato una cartella di sistema per i messaggi archiviati." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "Autenticazione a due fattori" + LABEL_ENABLE_TWO_FACTOR: "Abilita autenticazione a due fattori" + LABEL_TWO_FACTOR_USER: "Utente" + LABEL_TWO_FACTOR_STATUS: "Stato" + LABEL_TWO_FACTOR_SECRET: "Codice segreto" + LABEL_TWO_FACTOR_BACKUP_CODES: "Codici di riserva" + BUTTON_CREATE: "Crea un nuovo codice segreto" + BUTTON_ACTIVATE: "Attiva" + BUTTON_CLEAR: "Disattiva" + BUTTON_LOGOUT: "Esci" + BUTTON_DONE: "Fatto" + BUTTON_TEST: "Esegui verifica" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Mostra codice segreto" + BUTTON_HIDE_SECRET: "Nascondi codice segreto" + TWO_FACTOR_REQUIRE_DESC: "Il tuo account richiede l'autenticazione a due fattori." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configurato" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Non configurato" + TWO_FACTOR_SECRET_DESC: >- + Importa questo codice nel tuo client di Google Authenticator (o un altro client + TOTP) usando il codice QR presente sotto o inserendo il codice manualmente. + TWO_FACTOR_BACKUP_CODES_DESC: >- + Se non puoi ricevere codici da Google Authenticator, puoi usare i codici di + riserva per entrare. Dopo aver usato un codice di riserva per entrare, esso + si disattiverà. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Non puoi salvare quest'impostazione senza prima verificarne il funzionamento." + TITLES: + LOADING: "Caricamento..." + LOGIN: "Accedi" + MAILBOX: "Casella di posta" + SETTINGS: "Impostazioni" + COMPOSE: "Scrivi messaggio" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Il file è troppo grande" + ERROR_FILE_PARTIALLY_UPLOADED: "Il file è stato caricato solo parzialmente per un motivo sconosciuto" + ERROR_NO_FILE_UPLOADED: "Nessun file è stato caricato" + ERROR_MISSING_TEMP_FOLDER: "Il file temporaneo non è presente" + ERROR_ON_SAVING_FILE: "Si è verificato un errore sconosciuto durante il caricamento del file" + ERROR_FILE_TYPE: "Il tipo di file non è valido" + ERROR_UNKNOWN: "Si è verificato un errore sconosciuto durante il caricamento del file" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> Testo semplice" + TEXT_SWITCHER_RICH_FORMATTING: "Testo formattato" + TEXT_SWITCHER_CONFIRM: "La formattazione del testo e le immagini andranno perse. Sei sicuro di voler continuare?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Personali" + LABEL_GENERAL_NAME: "Generali" + LABEL_CONTACTS_NAME: "Contatti" + LABEL_FOLDERS_NAME: "Cartelle" + LABEL_ACCOUNTS_NAME: "Account" + LABEL_IDENTITY_NAME: "Identità" + LABEL_IDENTITIES_NAME: "Identità" + LABEL_FILTERS_NAME: "Filtri" + LABEL_TEMPLATES_NAME: "Modelli" + LABEL_SECURITY_NAME: "Sicurezza" + LABEL_SOCIAL_NAME: "Social" + LABEL_THEMES_NAME: "Temi" + LABEL_CHANGE_PASSWORD_NAME: "Password" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Indietro" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filtri" + BUTTON_SAVE: "Salva" + BUTTON_ADD_FILTER: "Aggiungi filtro" + BUTTON_DELETE: "Elimina" + BUTTON_RAW_SCRIPT: "Usa script personalizzato" + SUBNAME_NONE: "Nessuno" + SUBNAME_MOVE_TO: "Sposta in \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Inoltra a \"%EMAIL%\"" + SUBNAME_REJECT: "Rifiuta" + SUBNAME_VACATION_MESSAGE: "Messaggio fuori-ufficio" + SUBNAME_DISCARD: "Scarta" + CAPABILITY_LABEL: "Caratteristiche" + LOADING_PROCESS: "Aggiornamento lista filtri" + DELETING_ASK: "Sei sicuro?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Queste modifiche devono essere salvate nel server." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identità" + LABEL_DISPLAY_NAME: "Nome" + LABEL_REPLY_TO: "Rispondi a" + LABEL_SIGNATURE: "Firma" + LABEL_ADD_SIGNATURE_TO_ALL: "Aggiungi la firma a tutti i messaggi in uscita" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Sicurezza" + LABEL_CONFIGURE_TWO_FACTOR: "Configura autenticazione a due fattori" + LABEL_AUTOLOGOUT: "Disconnessione automatica" + AUTOLOGIN_NEVER_OPTION_NAME: "Mai" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minuti" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% ore" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Generali" + LABEL_LANGUAGE: "Lingua" + LABEL_IDENTITY: "Identità" + LABEL_LAYOUT: "Struttura" + LABEL_LAYOUT_NO_SPLIT: "A pagina intera" + LABEL_LAYOUT_VERTICAL_SPLIT: "Divisione verticale" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Divisione orizzontale" + LABEL_EDITOR: "Editor di testo predefinito" + LABEL_EDITOR_HTML: "HTML" + LABEL_EDITOR_PLAIN: "Testo semplice" + LABEL_EDITOR_HTML_FORCED: "Html (forzato)" + LABEL_EDITOR_PLAIN_FORCED: "Testo semplice (forzato)" + LABEL_ANIMATION: "Animazioni dell'interfaccia" + LABEL_ANIMATION_FULL: "Tutte" + LABEL_ANIMATION_NORMAL: "Normali" + LABEL_ANIMATION_NONE: "Nessuna" + LABEL_VIEW_OPTIONS: "Impostazioni di visualizzazione" + LABEL_USE_PREVIEW_PANE: "Mosta l'anteprima del messaggio" + LABEL_USE_CHECKBOXES_IN_LIST: "Mostra le caselle di spunta nella lista" + LABEL_USE_THREADS: "Usa le conversazioni" + LABEL_REPLY_SAME_FOLDER: "Posiziona le risposte nella cartella del messaggio a cui si è risposto" + LABEL_SHOW_IMAGES: "Visualizza sempre le immagini esterne nel messaggio" + LABEL_SHOW_ANIMATION: "Mostra le animazioni" + LABEL_MESSAGE_PER_PAGE: "Messaggi per pagina" + LABEL_NOTIFICATIONS: "Notifiche" + LABEL_SOUND_NOTIFICATION: "Notifica sonora" + LABEL_CHROME_NOTIFICATION_DESC: "Mostra le notifiche in caso di nuovi messaggi" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Bloccate dal browser)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Contatti" + LABEL_CONTACTS_AUTOSAVE: "Aggiungi automaticamente le persone che ti inviano mail alla rubrica" + LEGEND_CONTACTS_SYNC: "Sincronizzazione remota (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Abilita sincronizzazione remota" + LABEL_CONTACTS_SYNC_SERVER: "Server" + LABEL_CONTACTS_SYNC_AB_URL: "Indirizzo della rubrica" + LABEL_CONTACTS_SYNC_USER: "Utente" + LABEL_CONTACTS_SYNC_PASSWORD: "Password" + SETTINGS_THEMES: + LEGEND_THEMES: "Temi" + LEGEND_THEMES_CUSTOM: "Configurazione del tema personalizzato" + LABEL_CUSTOM_TYPE: "Tipo" + LABEL_CUSTOM_TYPE_LIGHT: "Chiaro" + LABEL_CUSTOM_TYPE_DARK: "Scuro" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Sfondo" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Carica immagine di sfondo (.jpg o .png)" + ERROR_FILE_IS_TOO_BIG: "Il file è più grande di 1MB" + ERROR_FILE_TYPE_ERROR: "Tipo di file invalido (solo .jpg o .png)" + ERROR_UNKNOWN: "Si è verificato un errore sconosciuto durante il caricamento del file" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Connetti a Google" + BUTTON_GOOGLE_DISCONNECT: "Disconnetti da Google" + MAIN_GOOGLE_DESC: "Dopo aver abilitato il login tramite Google, puoi accedere a questo account utilizzando il bottone \"Google\" nella schermata di login.\n" + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Connettiti a Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Disconnetti da Facebook" + MAIN_FACEBOOK_DESC: "Dopo aver abilitato il login tramite Facebook, puoi accedere a questo account utilizzando il bottone \"Facebook\" nella schermata di login.\n" + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Connettiti a Twitter" + BUTTON_TWITTER_DISCONNECT: "Disconnetti da Twitter" + MAIN_TWITTER_DESC: "Dopo aver abilitato il login tramite Twitter, puoi accedere a questo account utilizzando il bottone \"Twitter\" nella schermata di login.\n" + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Lista delle cartelle" + BUTTON_CREATE: "Crea una cartella" + BUTTON_SYSTEM: "Cartelle di sistema" + BUTTON_DELETE: "Elimina" + BUTTON_SUBSCRIBE: "Sottoscrivi" + BUTTON_UNSUBSCRIBE: "Rimuovi sottoscrizione" + LOADING_PROCESS: "Aggiornamento della lista delle cartelle..." + CREATING_PROCESS: "Creazione cartella..." + DELETING_PROCESS: "Eliminazione cartella..." + RENAMING_PROCESS: "Rinomina cartella..." + DELETING_ASK: "Sei sicuro?" + TO_MANY_FOLDERS_DESC_1: "Ci sono troppe cartelle!" + TO_MANY_FOLDERS_DESC_2: "Vengono visualizzate solo una parte per evitare problemi di performance." + HELP_DELETE_FOLDER: "Cancella cartella" + HELP_SHOW_HIDE_FOLDER: "Mostra/nascondi cartella" + HELP_CHECK_FOR_NEW_MESSAGES: "Controlla/non controlla la presenza di nuovi messaggi" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Lista degli account" + LEGEND_IDENTITIES: "Identità" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Account ed identità" + BUTTON_ADD_ACCOUNT: "Aggiungi account" + BUTTON_ADD_IDENTITY: "Aggiungi identità" + BUTTON_DELETE: "Elimina" + LOADING_PROCESS: "Aggiornamento della lista degli account..." + DELETING_ASK: "Sei sicuro?" + DEFAULT_IDENTITY_LABEL: "predefinito" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identità" + LEGEND_IDENTITIES: "Identità aggiuntive" + LABEL_DEFAULT: "Predefinita" + LABEL_DISPLAY_NAME: "Nome" + LABEL_REPLY_TO: "Rispondi a" + LABEL_SIGNATURE: "Firma" + LABEL_ADD_SIGNATURE_TO_ALL: "Aggiungi la firma a tutti i messaggi in uscita" + BUTTON_ADD_IDENTITY: "Aggiungi identità" + BUTTON_DELETE: "Elimina" + LOADING_PROCESS: "Aggiornamento lista delle identità" + DELETING_ASK: "Sei sicuro?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Cambia password" + LABEL_CURRENT_PASSWORD: "Password attuale" + LABEL_NEW_PASSWORD: "Nuova password" + LABEL_REPEAT_PASSWORD: "Ripeti nuova password" + BUTTON_UPDATE_PASSWORD: "Cambia password" + ERROR_PASSWORD_MISMATCH: "Le password non corrispondono, riprova" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Importa chiave OpenPGP" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Genera chiave OpenPGP" + TITLE_PRIVATE: "Privata" + TITLE_PUBLIC: "Pubblica" + DELETING_ASK: "Sei sicuro?" + GENERATE_ONLY_HTTPS: "solo tramite HTTPS" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Salva automaticamente la bozza" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Aiuto sulle scorciatoie da tastiera" + TAB_MAILBOX: "Casella di posta" + TAB_MESSAGE_LIST: "Lista messaggi" + TAB_MESSAGE_VIEW: "Lettura messaggio" + TAB_COMPOSE: "Scrittura messaggio" + LABEL_OPEN_USER_DROPDOWN: "Apri menu utente" + LABEL_REPLY: "Rispondi" + LABEL_REPLY_ALL: "Rispondi a tutti" + LABEL_FORWARD: "Inoltra" + LABEL_FORWARD_MULTIPLY: "Inoltro multiplo" + LABEL_HELP: "Aiuto" + LABEL_CHECK_ALL: "Seleziona tutti i messaggi" + LABEL_ARCHIVE: "Archivia messaggio" + LABEL_DELETE: "Elimina messaggio" + LABEL_OPEN_THREAD: "Apri la conversazione selezionata" + LABEL_MOVE: "Sposta messaggio" + LABEL_READ: "Marca come letti i messaggi selezionati" + LABEL_UNREAD: "Marca come non letti i messaggi selezionati" + LABEL_IMPORTANT: "Marca importanti o preferiti/non preferiti i messaggi selezionati" + LABEL_SEARCH: "Cerca" + LABEL_CANCEL_SEARCH: "Annulla ricerca" + LABEL_FULLSCREEN_ENTER: "Schermo intero (con anteprima messaggi)" + LABEL_VIEW_MESSAGE_ENTER: "Visualizza messaggio (senza anteprima messaggi)" + LABEL_SWITCH_TO_MESSAGE: "Sposta la selezione sul messaggio corrente" + LABEL_SWITCH_TO_FOLDER_LIST: "Sposta la selezione sulla lista delle cartelle" + LABEL_FULLSCREEN_TOGGLE: "Attiva/disattiva la modalità a schermo intero" + LABEL_BLOCKQUOTES_TOGGLE: "Mostra/nascondi le citazioni" + LABEL_THREAD_NEXT: "Prossimo messaggio nella conversazione" + LABEL_THREAD_PREV: "Messaggio precedente nella conversazione" + LABEL_PRINT: "Stampa" + LABEL_EXIT_FULLSCREEN: "Esci dalla modalità a schermo intero" + LABEL_CLOSE_MESSAGE: "Chiudi messaggio (senza anteprima messaggi)" + LABEL_SWITCH_TO_LIST: "Sposta la selezione sulla lista messaggi" + LABEL_OPEN_COMPOSE_POPUP: "Apri finestra di scrittura" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Apri il menu di selezione delle identità" + LABEL_SAVE_MESSAGE: "Salva messaggio" + LABEL_SEND_MESSAGE: "Invia messaggio" + LABEL_CLOSE_COMPOSE: "Chiudi finestra di scrittura" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "Nessuna chiave pubblica trovata" + NO_PUBLIC_KEYS_FOUND_FOR: "Nessuna chiave pubblica trovata per l'indirizzo email \"%EMAIL%\"\n" + NO_PRIVATE_KEY_FOUND: "Nessuna chiave privata trovata" + NO_PRIVATE_KEY_FOUND_FOR: "Nessuna chiave privata trovata per l'indirizzo email \"%EMAIL%\"\n" + ADD_A_PUBLICK_KEY: "Add a public key" + SELECT_A_PRIVATE_KEY: "Seleziona una chiave privata" + UNVERIFIRED_SIGNATURE: "Firma non verificata" + DECRYPTION_ERROR: "Decriptazione con OpenPGP fallita" + GOOD_SIGNATURE: "Firma valida da %USER%" + PGP_ERROR: "Errore di OpenPGP: %ERROR%" + SPECIFY_FROM_EMAIL: "Specificare il mittente" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Specificare almeno un destinatario" + NOTIFICATIONS: + INVALID_TOKEN: "Token invalido" + AUTH_ERROR: "Autenticazione fallita" + ACCESS_ERROR: "Errore di accesso" + CONNECTION_ERROR: "Impossibile connettersi al server" + CAPTCHA_ERROR: "CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Questo ID sociale non è collegato ad alcun indirizzo email. Entra utilizzando + le credenziali delle email e abilita questa funzionalità nelle impostazioni. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Questo ID sociale non è collegato ad alcun indirizzo email. Entra utilizzando + le credenziali delle email e abilita questa funzionalità nelle impostazioni. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Questo ID sociale non è collegato ad alcun indirizzo email. Entra utilizzando + le credenziali delle email e abilita questa funzionalità nelle impostazioni. + DOMAIN_NOT_ALLOWED: "Il dominio non è autorizzato" + ACCOUNT_NOT_ALLOWED: "L'account non è autorizzato" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "La verifica a due fattori è richiesta" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "La verifica a due fattori è fallita" + COULD_NOT_SAVE_NEW_PASSWORD: "Impossibile salvare la nuova password" + CURRENT_PASSWORD_INCORRECT: "La password attuale è scorretta" + NEW_PASSWORD_SHORT: "La password è troppo corta" + NEW_PASSWORD_WEAK: "La password è troppo facile" + NEW_PASSWORD_FORBIDDENT: "La password contiene caratteri non consentiti" + CONTACTS_SYNC_ERROR: "Errore durante la sincronizzazione dei contatti" + CANT_GET_MESSAGE_LIST: "Impossibile ottenere la lista dei messaggi" + CANT_GET_MESSAGE: "Impossibile caricare il messaggio" + CANT_DELETE_MESSAGE: "Impossibile eliminare il messaggio" + CANT_MOVE_MESSAGE: "Impossibile spostare il messaggio" + CANT_SAVE_MESSAGE: "Impossibile salvare il messaggio" + CANT_SEND_MESSAGE: "Impossibile inviare il messaggio" + INVALID_RECIPIENTS: "Destinatario non valido" + CANT_SAVE_FILTERS: "Impossibile salvare i filtri" + CANT_GET_FILTERS: "Impossibile caricare i filtri" + FILTERS_ARE_NOT_CORRECT: "I filtri non sono corretti" + CANT_CREATE_FOLDER: "Impossibile creare la cartella" + CANT_RENAME_FOLDER: "Impossibile rinominare la cartella" + CANT_DELETE_FOLDER: "Impossibile eliminare la cartella" + CANT_DELETE_NON_EMPTY_FOLDER: "Impossibile eliminare una cartella non vuota" + CANT_SUBSCRIBE_FOLDER: "Impossibile sottoscrivere la cartella" + CANT_UNSUBSCRIBE_FOLDER: "Impossibile rimuovere la sottoscrizione alla cartella" + CANT_SAVE_SETTINGS: "Impossibile salvare le impostazioni" + CANT_SAVE_PLUGIN_SETTINGS: "Impossibile salvare le impostazioni delle estensioni" + DOMAIN_ALREADY_EXISTS: "Il dominio esiste già" + CANT_INSTALL_PACKAGE: "Impossibile installare il pacchetto" + CANT_DELETE_PACKAGE: "Impossibile rimuovere il pacchetto" + INVALID_PLUGIN_PACKAGE: "Estensione non valida" + UNSUPPORTED_PLUGIN_PACKAGE: "Estensione non supportata" + LICENSING_SERVER_IS_UNAVAILABLE: "Il server delle licenze non è raggiungibile" + LICENSING_DOMAIN_EXPIRED: "La licenza per questo dominio è scaduta" + LICENSING_DOMAIN_BANNED: "Questo dominio è stato bannato" + DEMO_SEND_MESSAGE_ERROR: "Per ragioni di sicurezza, questa demo non è abilitata ad inviare email ad inidirizzi esterni" + DEMO_ACCOUNT_ERROR: "Per ragioni di sicurezza, questo account non è autorizzato ad effettuare questa operazione!" + ACCOUNT_ALREADY_EXISTS: "L'account esiste già" + ACCOUNT_DOES_NOT_EXIST: "L'account non esiste" + MAIL_SERVER_ERROR: "Si è verificato un errore nel server mail" + INVALID_INPUT_ARGUMENT: "Argomento non valido" + UNKNOWN_ERROR: "Errore sconosciuto" + STATIC: + BACK_LINK: "Ricarica" + DOMAIN_LIST_DESC: "Lista dei domini abilitati ad accedere" + PHP_EXSTENSIONS_ERROR_DESC: "È richiesta un'estensione di PHP non installata!" + PHP_VERSION_ERROR_DESC: "La tua versione di PHP (%VERSION%) è meno recente della 5.3.0!" + NO_SCRIPT_TITLE: "È richiesto JavaScript per questa applicazione." + NO_SCRIPT_DESC: | + Il supporto a JavaScript è disabilitato. + Abilitare il supporto a JavaScript e riprovare. + NO_COOKIE_TITLE: "Sono richiesti i Cookie per questa applicazione." + NO_COOKIE_DESC: | + Il supporto ai Cookie è disabilitato. + Abilitare il supporto ai Cookie e riprovare. + BAD_BROWSER_TITLE: "Il tuo browser è troppo vecchio" + BAD_BROWSER_DESC: | + Per usare tutte le funzionalità dell'applicazione, + scarica ed installa uno dei seguenti browser: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ja_JP.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ja_JP.yml new file mode 100755 index 00000000..1f2bf114 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ja_JP.yml @@ -0,0 +1,709 @@ +ja_JP: + LOGIN: + LABEL_EMAIL: "メールアドレス" + LABEL_LOGIN: "ログイン" + LABEL_PASSWORD: "パスワード" + LABEL_SIGN_ME: "サインイン状態を保持する" + LABEL_VERIFICATION_CODE: "確認コード" + LABEL_DONT_ASK_VERIFICATION_CODE: "2週間、コードを確認しない" + BUTTON_SIGN_IN: "サインイン" + TITLE_SIGN_IN_GOOGLE: "Googleアカウントでログイン" + TITLE_SIGN_IN_FACEBOOK: "Facebookアカウントでログイン" + TITLE_SIGN_IN_TWITTER: "Twitterアカウントでログイン" + LABEL_FORGOT_PASSWORD: "パスワードを忘れた" + LABEL_REGISTRATION: "初回登録" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "アカウントを追加" + BUTTON_SETTINGS: "設定" + BUTTON_HELP: "ヘルプ" + BUTTON_LOGOUT: "ログアウト" + MOBILE: + BUTTON_MOBILE_VERSION: "モバイル版" + BUTTON_DESKTOP_VERSION: "デスクトップ版" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "検索" + TITLE_ADV: "高度な検索" + LABEL_ADV_FROM: "差出人" + LABEL_ADV_TO: "宛先" + LABEL_ADV_SUBJECT: "件名" + LABEL_ADV_TEXT: "キーワード" + LABEL_ADV_HAS_ATTACHMENT: "添付ファイルあり" + LABEL_ADV_HAS_ATTACHMENTS: "添付ファイルあり" + LABEL_ADV_FLAGGED: "スター付き" + LABEL_ADV_UNSEEN: "未読メール" + LABEL_ADV_DATE: "日付" + LABEL_ADV_DATE_ALL: "全て" + LABEL_ADV_DATE_3_DAYS: "3日前まで" + LABEL_ADV_DATE_7_DAYS: "1週間前まで" + LABEL_ADV_DATE_MONTH: "1ヶ月前まで" + LABEL_ADV_DATE_3_MONTHS: "3ヶ月前まで" + LABEL_ADV_DATE_6_MONTHS: "6ヶ月前まで" + LABEL_ADV_DATE_YEAR: "1年前まで" + BUTTON_ADV_SEARCH: "検索" + PREVIEW_POPUP: + FULLSCREEN: "フルスクリーン" + ZOOM: "拡大/縮小" + CLOSE: "閉じる (Esc)" + LOADING: "読み込み中..." + GALLERY_PREV: "前 (←)" + GALLERY_NEXT: "次 (→)" + GALLERY_COUNTER: "%curr% / %total%" + IMAGE_ERROR: "画像 が読み込めませんでした" + AJAX_ERROR: "コンテンツ が読み込めませんでした" + FOLDER_LIST: + BUTTON_COMPOSE: "作成" + BUTTON_CONTACTS: "連絡先" + BUTTON_NEW_MESSAGE: "新規作成" + INBOX_NAME: "受信トレイ" + SENT_NAME: "送信済み" + DRAFTS_NAME: "下書き" + SPAM_NAME: "迷惑メール" + TRASH_NAME: "ごみ箱" + ARCHIVE_NAME: "アーカイブ" + QUOTA: + TITLE: "クォータ使用量" + MESSAGE_LIST: + BUTTON_RELOAD: "リスト更新" + BUTTON_MOVE_TO: "移動" + BUTTON_DELETE: "削除" + BUTTON_ARCHIVE: "アーカイブ" + BUTTON_SPAM: "迷惑メールにする" + BUTTON_NOT_SPAM: "迷惑メールを解除" + BUTTON_EMPTY_FOLDER: "フォルダを空にする" + BUTTON_MULTY_FORWARD: "転送 (元のメッセージを添付)" + BUTTON_DELETE_WITHOUT_MOVE: "完全に削除" + BUTTON_MORE: "その他" + MENU_SET_SEEN: "既読にする" + MENU_SET_ALL_SEEN: "すべて既読にする" + MENU_UNSET_SEEN: "未読にする" + MENU_SET_FLAG: "スターをつける" + MENU_UNSET_FLAG: "スターをはずす" + MENU_SELECT_ALL: "全て" + MENU_SELECT_NONE: "選択解除" + MENU_SELECT_INVERT: "反転" + MENU_SELECT_UNSEEN: "未読" + MENU_SELECT_SEEN: "既読" + MENU_SELECT_FLAGGED: "フラグ付き" + MENU_SELECT_UNFLAGGED: "フラグなし" + EMPTY_LIST: "メッセージはありません" + EMPTY_SEARCH_LIST: "検索条件に一致するメールは見つかりませんでした。高度な検索を試してみてください。" + SEARCH_RESULT_FOR: "\"%SEARCH%\"の検索結果" + BACK_TO_MESSAGE_LIST: "メッセージ一覧に戻る" + LIST_LOADING: "読み込み中" + EMPTY_SUBJECT_TEXT: "(件名なし)" + PUT_MESSAGE_HERE: "ここにメッセージをドロップ" + TODAY_AT: "今日 %TIME%" + YESTERDAY_AT: "昨日 %TIME%" + SEARCH_PLACEHOLDER: "検索" + NEW_MESSAGE_NOTIFICATION: "%COUNT% の新しいメッセージ!" + QUOTA_SIZE: "%SIZE% (%PROC%%) / %LIMIT%を使用中" + MESSAGE: + BUTTON_EDIT: "編集" + BUTTON_BACK: "戻る" + BUTTON_CLOSE: "閉じる" + BUTTON_DELETE: "削除" + BUTTON_UNSUBSCRIBE: "このリストから登録解除" + BUTTON_ARCHIVE: "アーカイブ" + BUTTON_SPAM: "迷惑メール" + BUTTON_NOT_SPAM: "非スパム" + BUTTON_MOVE_TO: "移動" + BUTTON_MORE: "その他" + BUTTON_REPLY: "返信" + BUTTON_REPLY_ALL: "全員に返信" + BUTTON_FORWARD: "転送" + BUTTON_FORWARD_AS_ATTACHMENT: "添付ファイルとして転送" + BUTTON_EDIT_AS_NEW: "新しいメールとして編集" + BUTTON_SHOW_IMAGES: "外部画像を表示する" + BUTTON_NOTIFY_READ_RECEIPT: "差出人がメールの開封確認メッセージを求めています。" + BUTTON_IN_NEW_WINDOW: "新しいウインドウで開く" + BUTTON_THREAD_LIST: "スレッド一覧" + BUTTON_THREAD_PREV: "前へ" + BUTTON_THREAD_NEXT: "次へ" + BUTTON_THREAD_MORE: "さらに読み込む" + MENU_HEADERS: "メールのヘッダーを表示" + MENU_VIEW_ORIGINAL: "メールのソースを表示" + MENU_DOWNLOAD_ORIGINAL: ".emlファイルでダウンロード" + MENU_FILTER_SIMILAR: "このようなメッセージをフィルタ" + MENU_PRINT: "印刷" + EMPTY_SUBJECT_TEXT: "(件名なし)" + LABEL_SUBJECT: "件名" + LABEL_DATE: "日付" + LABEL_FROM: "差出人" + LABEL_FROM_SHORT: "差出人" + LABEL_TO: "宛先" + LABEL_TO_SHORT: "宛先" + LABEL_CC: "CC" + LABEL_BCC: "BCC" + LABEL_REPLY_TO: "Reply-To" + PRINT_LABEL_FROM: "差出人" + PRINT_LABEL_TO: "宛先" + PRINT_LABEL_CC: "CC" + PRINT_LABEL_BCC: "BCC" + PRINT_LABEL_REPLY_TO: "Reply-To" + PRINT_LABEL_DATE: "日付" + PRINT_LABEL_SUBJECT: "件名" + PRINT_LABEL_ATTACHMENTS: "添付ファイル" + MESSAGE_LOADING: "読み込み中" + MESSAGE_VIEW_DESC: "選択したメールがここに表示されます。" + MESSAGE_VIEW_MOVE_DESC: "左側のパネルでフォルダ名をクリックして移動先を選択します。" + PGP_PASSWORD_INPUT_PLACEHOLDER: "パスワード" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP 署名済みメッセージ (クリックして検証)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP 暗号化メッセージ (クリックして復号化)" + LINK_DOWNLOAD_AS_ZIP: "Zip としてダウンロード" + LINK_SAVE_TO_OWNCLOUD: "ownCloud へ保存" + LINK_SAVE_TO_CLOUD: "クラウドに保存する" + LINK_SAVE_TO_DROPBOX: "Dropbox へ保存" + READ_RECEIPT: + SUBJECT: "開封確認メッセージ - %SUBJECT%" + BODY: | + これは %READ-RECEIPT% に送信されたメールの開封確認です。 + + 注: 「この開封確認は、メッセージが受信者のコンピュータ上に表示されたことだけを意味しています。 」 + 受信者が読んだり、メッセージの内容を理解しているという保証はありません。 + SUGGESTIONS: + SEARCHING_DESC: "検索中..." + CONTACTS: + LEGEND_CONTACTS: "連絡先" + SEARCH_INPUT_PLACEHOLDER: "検索" + BUTTON_ADD_CONTACT: "連絡先を追加" + BUTTON_CREATE_CONTACT: "作成" + BUTTON_UPDATE_CONTACT: "更新" + BUTTON_IMPORT: "インポート (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "エクスポート (vcf, vCard)" + BUTTON_EXPORT_CSV: "エクスポート (csv)" + ERROR_IMPORT_FILE: "インポートエラー (ファイルフォーマットが不正です)" + LIST_LOADING: "読み込み中" + EMPTY_LIST: "連絡先がありません" + EMPTY_SEARCH: "連絡先が見つかりません" + CLEAR_SEARCH: "検索をクリア" + CONTACT_VIEW_DESC: "選択した連絡先がここに表示されます。" + LABEL_DISPLAY_NAME: "表示名" + LABEL_EMAIL: "メールアドレス" + LABEL_PHONE: "電話番号" + LABEL_WEB: "Web" + LABEL_BIRTHDAY: "誕生日" + LINK_ADD_EMAIL: "メールアドレスを追加" + LINK_ADD_PHONE: "電話番号を追加" + LINK_BIRTHDAY: "誕生日を追加" + PLACEHOLDER_ENTER_DISPLAY_NAME: "表示名を入力してください" + PLACEHOLDER_ENTER_LAST_NAME: "姓を入力してください" + PLACEHOLDER_ENTER_FIRST_NAME: "名を入力してください" + PLACEHOLDER_ENTER_NICK_NAME: "ニックネームを入力してください" + LABEL_READ_ONLY: "読み取り専用" + LABEL_SHARE: "共有" + ADD_MENU_LABEL: "追加" + ADD_MENU_NICKNAME: "ニックネーム" + ADD_MENU_NOTES: "注釈" + ADD_MENU_EMAIL: "メールアドレス" + ADD_MENU_PHONE: "電話番号" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "住所" + ADD_MENU_BIRTHDAY: "誕生日" + ADD_MENU_TAGS: "タグ" + BUTTON_SHARE_NONE: "なし" + BUTTON_SHARE_ALL: "すべて" + BUTTON_SYNC: "同期 (CardDAV)" + COMPOSE: + TITLE_FROM: "差出人" + TITLE_TO: "宛先" + TITLE_CC: "CC" + TITLE_BCC: "BCC" + TITLE_REPLY_TO: "返信先" + TITLE_SUBJECT: "件名" + LINK_SHOW_INPUTS: "すべて表示" + BUTTON_SEND: "送信" + BUTTON_SAVE: "保存" + BUTTON_DELETE: "削除" + BUTTON_CANCEL: "キャンセル" + BUTTON_MINIMIZE: "最小化" + SAVED_TIME: "%TIME% に保存しました" + SAVED_ERROR_ON_SEND: "メールは送信できましたが、送信済みに保存できませんでした" + DISCARD_UNSAVED_DATA: "保存していないデータを破棄しますか?" + ATTACH_FILES: "ファイルを添付" + ATTACH_DROP_FILES_DESC: "ここにファイルをドロップ" + ATTACH_ITEM_CANCEL: "キャンセル" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" + FORWARD_MESSAGE_TOP_TITLE: "-------- Forwarded message -------" + FORWARD_MESSAGE_TOP_FROM: "From" + FORWARD_MESSAGE_TOP_TO: "To" + FORWARD_MESSAGE_TOP_CC: "CC" + FORWARD_MESSAGE_TOP_SENT: "送信済み" + FORWARD_MESSAGE_TOP_SUBJECT: "件名" + EMPTY_TO_ERROR_DESC: "少なくとも一つの受信者を指定してください" + NO_ATTACHMENTS_HERE_DESC: "添付ファイルがありません" + ATTACHMENTS_ERROR_DESC: "警告!すべての添付ファイルがアップロードされているわけではありません。" + ATTACHMENTS_UPLOAD_ERROR_DESC: "すべての添付ファイルがアップロードされているわけではありません。" + BUTTON_REQUEST_READ_RECEIPT: "開封確認を要求する" + BUTTON_MARK_AS_IMPORTANT: "重要フラグをつける" + BUTTON_OPEN_PGP: "OpenPGP (プレーンテキストのみ)" + BUTTON_REQUEST_DSN: "配信確認を要求する" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "閉じる" + POPUPS_ASK: + BUTTON_YES: "はい" + BUTTON_NO: "いいえ" + DESC_WANT_CLOSE_THIS_WINDOW: "このウインドウを閉じていいですか?" + DESC_WANT_DELETE_MESSAGES: "メッセージを削除していいですか?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "言語を選択" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "アカウントを追加しますか?" + BUTTON_ADD_ACCOUNT: "追加" + TITLE_UPDATE_ACCOUNT: "アカウント更新しますか?" + BUTTON_UPDATE_ACCOUNT: "更新" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "メールの表示名を追加しますか?" + TITLE_UPDATE_IDENTITY: "メールの表示名を更新しますか?" + BUTTON_ADD_IDENTITY: "追加" + BUTTON_UPDATE_IDENTITY: "更新" + LABEL_EMAIL: "メールアドレス" + LABEL_NAME: "表示名" + LABEL_REPLY_TO: "返信先" + LABEL_SIGNATURE: "署名" + LABEL_CC: "Cc" + LABEL_BCC: "Bcc" + LABEL_SIGNATURE_INSERT_BEFORE: "返信の引用テキストの前に署名を挿入する" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "フォルダを作成しますか?" + LABEL_NAME: "フォルダ名" + LABEL_PARENT: "親フォルダ" + BUTTON_CREATE: "作成" + BUTTON_CANCEL: "キャンセル" + BUTTON_CLOSE: "閉じる" + TITLE_CREATING_PROCESS: "フォルダを作成中" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "フォルダ内のすべてのメールを消去しますか?" + BUTTON_CLEAR: "消去" + BUTTON_CANCEL: "キャンセル" + BUTTON_CLOSE: "閉じる" + DANGER_DESC_WARNING: "警告!" + DANGER_DESC_HTML_1: "この操作をすると、%FOLDER%フォルダからすべてのメールを完全に消去してしまいます。" + DANGER_DESC_HTML_2: "一度始めると、中止やキャンセルができません。" + TITLE_CLEARING_PROCESS: "フォルダを消去しています..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "OpenPGP キーをインポート" + BUTTON_IMPORT_OPEN_PGP_KEY: "インポート" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "OpenPGP キーを表示" + BUTTON_SELECT: "選択" + BUTTON_CLOSE: "閉じる" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "OpenPGP キーを生成" + LABEL_EMAIL: "メールアドレス" + LABEL_NAME: "名前" + LABEL_PASSWORD: "パスワード" + LABEL_KEY_BIT_LENGTH: "キーの長さ" + BUTTON_GENERATE_OPEN_PGP_KEYS: "生成" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP 署名/暗号化" + LABEL_SIGN: "署名" + LABEL_ENCRYPT: "暗号化" + LABEL_PASSWORD: "パスワード" + BUTTON_SIGN: "署名" + BUTTON_ENCRYPT: "暗号化" + BUTTON_SIGN_AND_ENCRYPT: "署名と暗号化" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP 復号化" + LABEL_KEY: "秘密鍵" + LABEL_PASSWORD: "パスワード" + BUTTON_DECRYPT: "復号化" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "2段階認証テスト" + LABEL_CODE: "コード" + BUTTON_TEST: "テスト" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "フィルターを作成しますか?" + TITLE_EDIT_FILTER: "フィルターを更新しますか?" + FILTER_NAME: "名前" + LEGEND_CONDITIONS: "条件" + LEGEND_ACTIONS: "アクション" + BUTTON_DONE: "完了" + BUTTON_ADD_CONDITION: "条件の追加" + SELECT_ACTION_NONE: "なし" + SELECT_ACTION_MOVE_TO: "移動" + SELECT_ACTION_FORWARD_TO: "転送" + SELECT_ACTION_REJECT: "拒否" + SELECT_ACTION_VACATION_MESSAGE: "バケーションメッセージ" + SELECT_ACTION_DISCARD: "破棄" + SELECT_FIELD_FROM: "送信者 (From)" + SELECT_FIELD_RECIPIENTS: "受信者 (To or CC)" + SELECT_FIELD_SUBJECT: "件名" + SELECT_FIELD_HEADER: "ヘッダー" + SELECT_FIELD_SIZE: "サイズ" + SELECT_TYPE_CONTAINS: "含む" + SELECT_TYPE_NOT_CONTAINS: "含まない" + SELECT_TYPE_MATCHES: "マッチする (* と ? が使用可)" + SELECT_TYPE_NOT_MATCHES: "マッチしない (* と ? が使用可)" + SELECT_TYPE_REGEXP: "正規表現" + SELECT_TYPE_NOT_REGEXP: "正規表現を使わない" + SELECT_TYPE_EQUAL_TO: "一致" + SELECT_TYPE_NOT_EQUAL_TO: "一致しない" + SELECT_TYPE_OVER: "Over" + SELECT_TYPE_UNDER: "Under" + SELECT_MATCH_ANY: "以下のルールのいずれかにマッチ" + SELECT_MATCH_ALL: "以下のルールのすべてにマッチ" + MARK_AS_READ_LABEL: "既読にする" + REPLY_INTERVAL_LABEL: "返信間隔 (日)" + KEEP_LABEL: "保持" + STOP_LABEL: "ルールの処理を止めない" + EMAIL_LABEL: "メールアドレス" + VACATION_SUBJECT_LABEL: "件名 (オプション)" + VACATION_MESSAGE_LABEL: "メッセージ" + VACATION_RECIPIENTS_LABEL: "受信者 (カンマ区切り)" + REJECT_MESSAGE_LABEL: "拒否メッセージ" + ALL_INCOMING_MESSAGES_DESC: "すべての受信メッセージ" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "システムフォルダーを選択" + SELECT_CHOOSE_ONE: "1つ選択" + SELECT_UNUSE_NAME: "使用しない" + LABEL_SENT: "送信済み" + LABEL_DRAFTS: "下書き" + LABEL_SPAM: "迷惑メール" + LABEL_TRASH: "ゴミ箱" + LABEL_ARCHIVE: "アーカイブ" + BUTTON_CANCEL: "キャンセル" + BUTTON_CLOSE: "閉じる" + NOTIFICATION_SENT: | + 送信済みメッセージを置くための ”Sent” システムフォルダが選択されていません。 + 送信済みメッセージを保存する必要がないのなら、"使用しない"オプションを選択してください。 + NOTIFICATION_DRAFTS: "下書きメッセージを置くための ”Sent” システムフォルダが選択されていません。" + NOTIFICATION_SPAM: | + 迷惑メールを置くための ”Spam” システムフォルダが選択されていません。 + 迷惑メールが完全に削除されるのを望むのなら、"使用しない"オプションを選択してください。 + NOTIFICATION_TRASH: | + 削除されたメッセージを置くための ”Trash” システムフォルダが選択されていません。 + 削除されたメッセージが完全に削除されるのを望むのなら、"使用しない"オプションを選択してください。 + NOTIFICATION_ARCHIVE: "アーカイブされたメッセージを置くための ”Archive” システムフォルダが選択されていません。" + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "2段階認証 (TOTP)" + LABEL_ENABLE_TWO_FACTOR: "2段階認証を有効にする" + LABEL_TWO_FACTOR_USER: "ユーザー" + LABEL_TWO_FACTOR_STATUS: "ステータス" + LABEL_TWO_FACTOR_SECRET: "シークレット" + LABEL_TWO_FACTOR_BACKUP_CODES: "バックアップコード" + BUTTON_CREATE: "新しいシークレットを作成" + BUTTON_ACTIVATE: "アクティベート" + BUTTON_CLEAR: "クリア" + BUTTON_LOGOUT: "ログアウト" + BUTTON_DONE: "完了" + BUTTON_TEST: "テスト" + LINK_TEST: "テスト" + BUTTON_SHOW_SECRET: "シークレットを表示" + BUTTON_HIDE_SECRET: "シークレットを非表示" + TWO_FACTOR_REQUIRE_DESC: "あなたのアカウントは、2段階認証の設定を必要としています" + TWO_FACTOR_SECRET_CONFIGURED_DESC: "設定済み" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "未設定" + TWO_FACTOR_SECRET_DESC: > + 提供された QR コードを使用するか、もしくは、手動でコードを入力することによって、Google 認証システム(もしくは、他の TOTP クライアント)へインポートします。 + TWO_FACTOR_BACKUP_CODES_DESC: > + Google認証システム(もしくは、他のTOTPクライアント)でコードを受け取ることができない場合は、バックアップコードを使用してサインインすることができます。 + + バックアップコードを使用してサインインすると、2段階認証は非アクティブになります。 + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "テストをしなければ設定を変更できません" + TITLES: + LOADING: "読み込み中" + LOGIN: "ログイン" + MAILBOX: "メールボックス" + SETTINGS: "設定" + COMPOSE: "作成" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "ファイルが大きすぎます" + ERROR_FILE_PARTIALLY_UPLOADED: "ファイルは、不明なエラーのため一部しかアップロードされませんでした" + ERROR_NO_FILE_UPLOADED: "ファイルはアップロードされていません" + ERROR_MISSING_TEMP_FOLDER: "一時ファイルが見つかりません" + ERROR_ON_SAVING_FILE: "不明なファイルアップロードエラーが発生しました" + ERROR_FILE_TYPE: "無効なファイル種類" + ERROR_UNKNOWN: "不明なファイルアップロードエラーが発生しました" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" + TEXT_SWITCHER_RICH_FORMATTING: "書式付きテキスト" + TEXT_SWITCHER_CONFIRM: "テキスト書式と画像は、失われます。続けてもよろしいですか?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "個人" + LABEL_GENERAL_NAME: "全般" + LABEL_CONTACTS_NAME: "連絡先" + LABEL_FOLDERS_NAME: "フォルダー" + LABEL_ACCOUNTS_NAME: "アカウント" + LABEL_IDENTITY_NAME: "表示名" + LABEL_IDENTITIES_NAME: "表示名" + LABEL_FILTERS_NAME: "フィルター" + LABEL_TEMPLATES_NAME: "テンプレート" + LABEL_SECURITY_NAME: "セキュリティ" + LABEL_SOCIAL_NAME: "SNS" + LABEL_THEMES_NAME: "テーマ" + LABEL_CHANGE_PASSWORD_NAME: "パスワード" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "戻る" + SETTINGS_FILTERS: + LEGEND_FILTERS: "フィルター" + BUTTON_SAVE: "保存" + BUTTON_ADD_FILTER: "フィルターを追加" + BUTTON_DELETE: "削除" + BUTTON_RAW_SCRIPT: "カスタムユーザースクリプトを使用する" + SUBNAME_NONE: "なし" + SUBNAME_MOVE_TO: "\"%FOLDER%\" へ移動" + SUBNAME_FORWARD_TO: "\"%EMAIL%\" へ転送" + SUBNAME_REJECT: "拒否" + SUBNAME_VACATION_MESSAGE: "バケーションメッセージ" + SUBNAME_DISCARD: "破棄" + CAPABILITY_LABEL: "Capability" + LOADING_PROCESS: "フィルターリストの更新中" + DELETING_ASK: "よろしいですか?" + CHACHES_NEED_TO_BE_SAVED_DESC: "これらの変更は、サーバーへ保存する必要があります。" + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "表示名" + LABEL_DISPLAY_NAME: "名前" + LABEL_REPLY_TO: "Reply-To" + LABEL_SIGNATURE: "署名" + LABEL_ADD_SIGNATURE_TO_ALL: "すべての送信メッセージに署名を追加する" + SETTINGS_SECURITY: + LEGEND_SECURITY: "セキュリティ" + LABEL_CONFIGURE_TWO_FACTOR: "2段階認証の設定" + LABEL_AUTOLOGOUT: "自動ログアウト" + AUTOLOGIN_NEVER_OPTION_NAME: "しない" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% 分" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% 時間" + SETTINGS_GENERAL: + LEGEND_GENERAL: "全般" + LABEL_LANGUAGE: "言語" + LABEL_IDENTITY: "表示名" + LABEL_LAYOUT: "レイアウト" + LABEL_LAYOUT_NO_SPLIT: "分割しない" + LABEL_LAYOUT_VERTICAL_SPLIT: "縦に分割" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "横に分割" + LABEL_EDITOR: "メール形式" + LABEL_EDITOR_HTML: "Html" + LABEL_EDITOR_PLAIN: "プレーンテキスト" + LABEL_EDITOR_HTML_FORCED: "Html (強制)" + LABEL_EDITOR_PLAIN_FORCED: "プレーンテキスト (強制)" + LABEL_ANIMATION: "インターフェース アニメーション" + LABEL_ANIMATION_FULL: "フル" + LABEL_ANIMATION_NORMAL: "標準" + LABEL_ANIMATION_NONE: "なし" + LABEL_VIEW_OPTIONS: "表示" + LABEL_USE_PREVIEW_PANE: "プレビューペインを使用する" + LABEL_USE_CHECKBOXES_IN_LIST: "リストにチェックボックスを表示" + LABEL_USE_THREADS: "スレッドを使う" + LABEL_REPLY_SAME_FOLDER: "返信したメッセージのフォルダに送信メールを置く" + LABEL_SHOW_IMAGES: "外部画像を常に表示する" + LABEL_SHOW_ANIMATION: "アニメーションを表示" + LABEL_MESSAGE_PER_PAGE: "1ページに表示する件数" + LABEL_NOTIFICATIONS: "通知設定" + LABEL_SOUND_NOTIFICATION: "サウンド通知" + LABEL_CHROME_NOTIFICATION_DESC: "新しいメッセージを受信したらポップアップで知らせる" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(ブラウザでブロックされています)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "連絡先" + LABEL_CONTACTS_AUTOSAVE: "返信したアドレスをアドレス帳へ自動的に追加する" + LEGEND_CONTACTS_SYNC: "リモート同期 (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "リモート同期を有効化" + LABEL_CONTACTS_SYNC_SERVER: "サーバー" + LABEL_CONTACTS_SYNC_AB_URL: "アドレス帳 URL" + LABEL_CONTACTS_SYNC_USER: "ユーザー" + LABEL_CONTACTS_SYNC_PASSWORD: "パスワード" + SETTINGS_THEMES: + LEGEND_THEMES: "テーマ" + LEGEND_THEMES_CUSTOM: "カスタムテーマ設定" + LABEL_CUSTOM_TYPE: "種類" + LABEL_CUSTOM_TYPE_LIGHT: "ライト" + LABEL_CUSTOM_TYPE_DARK: "ダーク" + LABEL_CUSTOM_BACKGROUND_IMAGE: "背景" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "背景画像をアップロード (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "ファイルが大きすぎます" + ERROR_FILE_TYPE_ERROR: "無効なファイル種類 (JPG/PNG のみ)" + ERROR_UNKNOWN: "不明なファイルアップロードエラーが発生しました" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Google に接続" + BUTTON_GOOGLE_DISCONNECT: "Google から切断" + MAIN_GOOGLE_DESC: "Google 経由のログインを有効にしたら、ログイン画面の Google ボタンを使ってこのアカウントにログインすることができます。" + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Facebook に接続" + BUTTON_FACEBOOK_DISCONNECT: "Facebook から切断" + MAIN_FACEBOOK_DESC: "Facebook 経由のログインを有効にしたら、ログイン画面の Facebook ボタンを使ってこのアカウントにログインすることができます。" + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Twitter に接続" + BUTTON_TWITTER_DISCONNECT: "Twitter から切断" + MAIN_TWITTER_DESC: "Twitter 経由のログインを有効にしたら、ログイン画面の Twitter ボタンを使ってこのアカウントにログインすることができます。" + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "フォルダー一覧" + BUTTON_CREATE: "フォルダを作成" + BUTTON_SYSTEM: "システムフォルダー" + BUTTON_DELETE: "削除" + BUTTON_SUBSCRIBE: "購読" + BUTTON_UNSUBSCRIBE: "購読解除" + LOADING_PROCESS: "フォルダーリストの更新" + CREATING_PROCESS: "フォルダーの作成" + DELETING_PROCESS: "フォルダーの削除" + RENAMING_PROCESS: "フォルダーの名前を変更" + DELETING_ASK: "よろしいですか?" + TO_MANY_FOLDERS_DESC_1: "フォルダーが多すぎます" + TO_MANY_FOLDERS_DESC_2: "パフォーマンスの問題を回避するために、それらの一部のみを示しています。" + HELP_DELETE_FOLDER: "フォルダーを削除" + HELP_SHOW_HIDE_FOLDER: "フォルダーの表示/非表示" + HELP_CHECK_FOR_NEW_MESSAGES: "新しいメッセージをチェックする/しない" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "アカウント一覧" + LEGEND_IDENTITIES: "表示名" + LEGEND_ACCOUNTS_AND_IDENTITIES: "アカウトと表示名" + BUTTON_ADD_ACCOUNT: "アカウントを追加" + BUTTON_ADD_IDENTITY: "表示名を追加" + BUTTON_DELETE: "削除" + LOADING_PROCESS: "更新中" + DELETING_ASK: "よろしいですか?" + DEFAULT_IDENTITY_LABEL: "デフォルト" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "表示名" + LEGEND_IDENTITIES: "追加の表示名" + LABEL_DEFAULT: "デフォルト" + LABEL_DISPLAY_NAME: "名前" + LABEL_REPLY_TO: "Reply-To" + LABEL_SIGNATURE: "署名" + LABEL_ADD_SIGNATURE_TO_ALL: "すべての送信メッセージに署名を追加する" + BUTTON_ADD_IDENTITY: "表示名の追加" + BUTTON_DELETE: "削除" + LOADING_PROCESS: "表示名の一覧の更新中" + DELETING_ASK: "よろしいですか?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "パスワードを変更" + LABEL_CURRENT_PASSWORD: "現在のパスワード" + LABEL_NEW_PASSWORD: "新しいパスワード" + LABEL_REPEAT_PASSWORD: "新しいパスワードの確認" + BUTTON_UPDATE_PASSWORD: "パスワードを変更" + ERROR_PASSWORD_MISMATCH: "パスワードが一致しません。もう一度やり直してください。" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "OpenPGP キーをインポート" + BUTTON_GENERATE_OPEN_PGP_KEYS: "OpenPGP キーを生成" + TITLE_PRIVATE: "プライベート" + TITLE_PUBLIC: "パブリック" + DELETING_ASK: "よろしいですか?" + GENERATE_ONLY_HTTPS: "HTTPS only" + LABEL_ALLOW_DRAFT_AUTOSAVE: "下書きを自動的に保存する" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "キーボード ショートカット ヘルプ" + TAB_MAILBOX: "メールボックス" + TAB_MESSAGE_LIST: "メッセージ一覧" + TAB_MESSAGE_VIEW: "メッセージ表示画面" + TAB_COMPOSE: "作成画面" + LABEL_OPEN_USER_DROPDOWN: "ユーザーメニューを開く" + LABEL_REPLY: "返信" + LABEL_REPLY_ALL: "全員に返信" + LABEL_FORWARD: "転送" + LABEL_FORWARD_MULTIPLY: "転送 (元のメッセージを添付)" + LABEL_HELP: "ヘルプ" + LABEL_CHECK_ALL: "すべてのメッセージを選択" + LABEL_ARCHIVE: "アーカイブ" + LABEL_DELETE: "削除" + LABEL_OPEN_THREAD: "選択したスレッドを開く" + LABEL_MOVE: "移動" + LABEL_READ: "選択したメッセージを既読にする" + LABEL_UNREAD: "選択したメッセージを未読にする" + LABEL_IMPORTANT: "選択したメッセージに重要フラグをつける" + LABEL_SEARCH: "検索" + LABEL_CANCEL_SEARCH: "検索を取り消す" + LABEL_FULLSCREEN_ENTER: "全画面 (プレビューペインレイアウト)" + LABEL_VIEW_MESSAGE_ENTER: "メッセージの表示 (非プレビューペインレイアウト)" + LABEL_SWITCH_TO_MESSAGE: "選択されたメッセージへ切り替える" + LABEL_SWITCH_TO_FOLDER_LIST: "フォルダー一覧へ切り替える" + LABEL_FULLSCREEN_TOGGLE: "フルスクリーンモードへの切り替え" + LABEL_BLOCKQUOTES_TOGGLE: "メッセージ引用の切り替え" + LABEL_THREAD_NEXT: "スレッドの次のメーッセージ" + LABEL_THREAD_PREV: "スレッドの前のメーッセージ" + LABEL_PRINT: "印刷" + LABEL_EXIT_FULLSCREEN: "フルスクリーンモードの終了" + LABEL_CLOSE_MESSAGE: "メッセージを閉じる (非プレビューペインレイアウト)" + LABEL_SWITCH_TO_LIST: "メッセージ一覧へ切り替える" + LABEL_OPEN_COMPOSE_POPUP: "作成画面を開く" + LABEL_MINIMIZE_COMPOSE_POPUP: "作成画面を最小化" + LABEL_OPEN_IDENTITIES_DROPDOWN: "表示名メニューを開く" + LABEL_SAVE_MESSAGE: "メッセージを保存" + LABEL_SEND_MESSAGE: "メッセージを送信" + LABEL_CLOSE_COMPOSE: "作成画面を閉じる" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "公開鍵が見つかりません" + NO_PUBLIC_KEYS_FOUND_FOR: "メールアドレス \"%EMAIL%\" の公開鍵が見つかりません" + NO_PRIVATE_KEY_FOUND: "秘密鍵が見つかりません" + NO_PRIVATE_KEY_FOUND_FOR: "メールアドレス \"%EMAIL%\" の秘密鍵が見つかりません" + ADD_A_PUBLICK_KEY: "公開鍵の追加" + SELECT_A_PRIVATE_KEY: "秘密鍵を選択してください" + UNVERIFIRED_SIGNATURE: "未確認の署名" + DECRYPTION_ERROR: "OpenPGP 復号化エラー" + GOOD_SIGNATURE: "%USER% からの正しい署名" + PGP_ERROR: "OpenPGP エラー: %ERROR%" + SPECIFY_FROM_EMAIL: "FROMのメールアドレスを指定してください" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "少なくても1つの受信者を指定してください" + NOTIFICATIONS: + INVALID_TOKEN: "無効なトークン" + AUTH_ERROR: "認証に失敗しました" + ACCESS_ERROR: "アクセスエラー" + CONNECTION_ERROR: "サーバーへ接続できません" + CAPTCHA_ERROR: "間違った CAPTCHA" + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + このSNSユーザーIDは、まだメールアカウント用に割り当てられていません。電子メールの資格情報を使用してログインし、アカウント設定でこの機能を有効にします。 + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + このSNSユーザーIDは、まだメールアカウント用に割り当てられていません。電子メールの資格情報を使用してログインし、アカウント設定でこの機能を有効にします。 + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + このSNSユーザーIDは、まだメールアカウント用に割り当てられていません。電子メールの資格情報を使用してログインし、アカウント設定でこの機能を有効にします。 + DOMAIN_NOT_ALLOWED: "ドメインは、許可されていません" + ACCOUNT_NOT_ALLOWED: "アカウントは、許可されていません" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2要素認証が必要です" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2要素認証エラー" + COULD_NOT_SAVE_NEW_PASSWORD: "新しいパスワードを保存できません。" + CURRENT_PASSWORD_INCORRECT: "現在のパスワードが間違っています" + NEW_PASSWORD_SHORT: "パスワードが短すぎます" + NEW_PASSWORD_WEAK: "パスワードが簡単すぎます" + NEW_PASSWORD_FORBIDDENT: "パスワードに、禁止された文字が含まれています" + CONTACTS_SYNC_ERROR: "連絡先 同期 エラー" + CANT_GET_MESSAGE_LIST: "メッセージ一覧が取得できません" + CANT_GET_MESSAGE: "メッセージを取得できません" + CANT_DELETE_MESSAGE: "メッセージを削除できません" + CANT_MOVE_MESSAGE: "メッセージを移動できません" + CANT_SAVE_MESSAGE: "メッセージを保存できません" + CANT_SEND_MESSAGE: "メッセージ送信できません" + INVALID_RECIPIENTS: "無効な受信者" + CANT_SAVE_FILTERS: "フィルターを保存できません" + CANT_GET_FILTERS: "フィルターを取得できません" + FILTERS_ARE_NOT_CORRECT: "フィルターが正しくありません" + CANT_CREATE_FOLDER: "フォルダを作成できません" + CANT_RENAME_FOLDER: "フォルダの名前を変更できません" + CANT_DELETE_FOLDER: "フォルダを削除できません" + CANT_DELETE_NON_EMPTY_FOLDER: "空ではないディレクトリを削除できません" + CANT_SUBSCRIBE_FOLDER: "フォルダを購読できません" + CANT_UNSUBSCRIBE_FOLDER: "フォルダを購読解除できません" + CANT_SAVE_SETTINGS: "設定が保存できません" + CANT_SAVE_PLUGIN_SETTINGS: "設定が保存できません" + DOMAIN_ALREADY_EXISTS: "ドメインが既に存在しています" + CANT_INSTALL_PACKAGE: "パッケージのインストールに失敗しました" + CANT_DELETE_PACKAGE: "パッケージの削除に失敗しました" + INVALID_PLUGIN_PACKAGE: "プラグインパッケージが不正です" + UNSUPPORTED_PLUGIN_PACKAGE: "プラグインパッケージがサポートされていません" + LICENSING_SERVER_IS_UNAVAILABLE: "サブスクリプションサーバーが利用できません" + LICENSING_DOMAIN_EXPIRED: "このドメインのサブスクリプションの有効期限が切れました" + LICENSING_DOMAIN_BANNED: "このドメインのサブスクリプションが無効化されました" + DEMO_SEND_MESSAGE_ERROR: "セキュリティ上の理由から、アカウントは、外部の電子メールアドレスにメッセージを送信することを許可されていません!" + DEMO_ACCOUNT_ERROR: "セキュリティ上の理由から、アカウントには、このアクションが許可されていません!" + ACCOUNT_ALREADY_EXISTS: "アカウントがすでに存在します" + ACCOUNT_DOES_NOT_EXIST: "アカウントは存在しません" + MAIL_SERVER_ERROR: "メールサーバーへのアクセス中にエラーが発生しました" + INVALID_INPUT_ARGUMENT: "無効な入力引数" + UNKNOWN_ERROR: "不明なエラー" + STATIC: + BACK_LINK: "更新" + DOMAIN_LIST_DESC: "ドメインの一覧は、Web メールのアクセスを許可されています。" + PHP_EXSTENSIONS_ERROR_DESC: "必要な PHP 拡張モジュールが、有効になっていません。" + PHP_VERSION_ERROR_DESC: "PHP バージョン (%VERSION%) が、 最低バージョンの 5.3.0 よりも低いです!" + NO_SCRIPT_TITLE: "このアプリケーションでは JavaScript が必要です。" + NO_SCRIPT_DESC: | + ブラウザで JavaScript が、有効になっていません。 + JavaScript を有効にして、再度試してください。 + NO_COOKIE_TITLE: "このアプリケーションでは Cookie が必要です。" + NO_COOKIE_DESC: | + ブラウザで Cookie が、有効になっていません。 + Cookie を有効にして、再度試してください。 + BAD_BROWSER_TITLE: "ブラウザが古いです。" + BAD_BROWSER_DESC: | + アプリケーションのすべての機能を使用するには、 + これらのブラウザの1つをダウンロードしてインストールします: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ko_KR.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ko_KR.yml new file mode 100755 index 00000000..8ea7948d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ko_KR.yml @@ -0,0 +1,685 @@ +ko_KR: + LOGIN: + LABEL_EMAIL: "이메일 주소" + LABEL_LOGIN: "아이디" + LABEL_PASSWORD: "비밀번호" + LABEL_SIGN_ME: "아이디 기억" + LABEL_DONT_ASK_VERIFICATION_CODE: "2주 동안 코드를 물어보지 않기" + BUTTON_SIGN_IN: "로그인" + TITLE_SIGN_IN_GOOGLE: "구글 계정으로 로그인" + TITLE_SIGN_IN_FACEBOOK: "페이스북 계정으로 로그인" + TITLE_SIGN_IN_TWITTER: "트위터 계정으로 로그인" + LABEL_FORGOT_PASSWORD: "비밀번호 분실" + LABEL_REGISTRATION: "회원가입" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "계정 추가" + BUTTON_SETTINGS: "설정" + BUTTON_HELP: "도움말" + BUTTON_LOGOUT: "로그아웃" + MOBILE: + BUTTON_MOBILE_VERSION: "모바일 버전" + BUTTON_DESKTOP_VERSION: "데스크탑 버전" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "검색" + TITLE_ADV: "고급 검색" + LABEL_ADV_FROM: "보낸 이" + LABEL_ADV_TO: "받는 이" + LABEL_ADV_SUBJECT: "제목" + LABEL_ADV_TEXT: "본문" + LABEL_ADV_HAS_ATTACHMENT: "첨부파일이 있는 메시지" + LABEL_ADV_HAS_ATTACHMENTS: "첨부파일이 있는 메시지" + LABEL_ADV_FLAGGED: "즐겨찾기" + LABEL_ADV_UNSEEN: "Unseen" + LABEL_ADV_DATE: "수신일" + LABEL_ADV_DATE_ALL: "모두" + LABEL_ADV_DATE_3_DAYS: "3일 이내" + LABEL_ADV_DATE_7_DAYS: "1주일 이내" + LABEL_ADV_DATE_MONTH: "1개월 이내" + LABEL_ADV_DATE_3_MONTHS: "3개월 이내" + LABEL_ADV_DATE_6_MONTHS: "6개월 이내" + LABEL_ADV_DATE_YEAR: "1년 이내" + BUTTON_ADV_SEARCH: "찾기" + PREVIEW_POPUP: + FULLSCREEN: "전체화면" + ZOOM: "확대/축소" + CLOSE: "닫기 (Esc)" + LOADING: "로딩 중..." + GALLERY_PREV: "이전 (왼쪽 방향키)" + GALLERY_NEXT: "다음 (오른쪽 방향키)" + GALLERY_COUNTER: "%total% 중 %curr%" + IMAGE_ERROR: "이미지를 불러오지 못했습니다." + AJAX_ERROR: "내용을 불러오지 못했습니다." + FOLDER_LIST: + BUTTON_COMPOSE: "메일 쓰기" + BUTTON_CONTACTS: "연락처" + BUTTON_NEW_MESSAGE: "새로운 메일" + INBOX_NAME: "받은 편지함" + SENT_NAME: "보낸 편지함" + DRAFTS_NAME: "임시 보관함" + SPAM_NAME: "스팸함" + TRASH_NAME: "휴지통" + ARCHIVE_NAME: "어카이브" + QUOTA: + TITLE: "사용량" + MESSAGE_LIST: + BUTTON_RELOAD: "메일 목록 새로고침" + BUTTON_MOVE_TO: "이동" + BUTTON_DELETE: "삭제" + BUTTON_ARCHIVE: "어카이브" + BUTTON_SPAM: "스팸" + BUTTON_NOT_SPAM: "스팸이 아님" + BUTTON_EMPTY_FOLDER: "폴더 비우기" + BUTTON_MULTY_FORWARD: "전달" + BUTTON_DELETE_WITHOUT_MOVE: "완전히 삭제" + BUTTON_MORE: "더 보기" + MENU_SET_SEEN: "읽음으로 표시" + MENU_SET_ALL_SEEN: "모두 읽음으로 표시" + MENU_UNSET_SEEN: "읽지않음으로 표시" + MENU_SET_FLAG: "즐겨찾기로 표시" + MENU_UNSET_FLAG: "즐겨찾기 해제" + MENU_SELECT_ALL: "모두" + MENU_SELECT_NONE: "없음" + MENU_SELECT_INVERT: "반전" + MENU_SELECT_UNSEEN: "읽지 않음" + MENU_SELECT_SEEN: "읽음" + MENU_SELECT_FLAGGED: "즐겨찾기" + MENU_SELECT_UNFLAGGED: "일반" + EMPTY_LIST: "메일함이 비어있습니다." + EMPTY_SEARCH_LIST: "검색 조건에 맞는 결과가 없습니다.." + SEARCH_RESULT_FOR: "\"%SEARCH%\"에 대한 검색결과" + BACK_TO_MESSAGE_LIST: "메일 목록으로 돌아가기" + LIST_LOADING: "로딩 중" + EMPTY_SUBJECT_TEXT: "(제목 없음)" + PUT_MESSAGE_HERE: "목록에서 표시할 메시지를 여기로 끌어 넣으세요." + TODAY_AT: "오늘 %TIME%" + YESTERDAY_AT: "어제 %TIME%" + SEARCH_PLACEHOLDER: "검색" + NEW_MESSAGE_NOTIFICATION: "새 메시지가 %COUNT% 건 있습니다." + QUOTA_SIZE: "총 %LIMIT%%PROC%%를 사용중입니다." + MESSAGE: + BUTTON_EDIT: "수정" + BUTTON_BACK: "뒤로" + BUTTON_CLOSE: "닫기" + BUTTON_DELETE: "삭제" + BUTTON_UNSUBSCRIBE: "이 메일링 리스트를 수신거부" + BUTTON_ARCHIVE: "어카이브" + BUTTON_SPAM: "스팸" + BUTTON_NOT_SPAM: "스팸이 아님" + BUTTON_MOVE_TO: "이동" + BUTTON_MORE: "더보기" + BUTTON_REPLY: "답장" + BUTTON_REPLY_ALL: "모두 답장" + BUTTON_FORWARD: "전달" + BUTTON_FORWARD_AS_ATTACHMENT: "첨부파일로 전달" + BUTTON_EDIT_AS_NEW: "새로 편집하기" + BUTTON_SHOW_IMAGES: "외부이미지 표시" + BUTTON_NOTIFY_READ_RECEIPT: "수신자가 메일을 확인하면 알람을 표시합니다." + BUTTON_IN_NEW_WINDOW: "분할화면에서 보기" + BUTTON_THREAD_LIST: "Thread list" + BUTTON_THREAD_PREV: "Previous" + BUTTON_THREAD_NEXT: "다음" + BUTTON_THREAD_MORE: "더보기" + MENU_HEADERS: "메시지 헤더 보기" + MENU_VIEW_ORIGINAL: "원본 보기" + MENU_DOWNLOAD_ORIGINAL: ".eml 파일로 다운로드" + MENU_FILTER_SIMILAR: "이러한 메시지를 필터링합니다" + MENU_PRINT: "인쇄" + EMPTY_SUBJECT_TEXT: "(제목없음)" + LABEL_SUBJECT: "제목" + LABEL_DATE: "날짜" + LABEL_FROM: "보낸이" + LABEL_FROM_SHORT: "보낸이" + LABEL_TO: "받는이" + LABEL_TO_SHORT: "받는이" + LABEL_CC: "참조" + LABEL_BCC: "숨은 참조" + LABEL_REPLY_TO: "답장" + PRINT_LABEL_FROM: "보낸 이" + PRINT_LABEL_TO: "받는 이" + PRINT_LABEL_CC: "참조" + PRINT_LABEL_BCC: "숨은 참조" + PRINT_LABEL_REPLY_TO: "답장하기" + PRINT_LABEL_DATE: "날짜" + PRINT_LABEL_SUBJECT: "제목" + PRINT_LABEL_ATTACHMENTS: "첨부파일" + MESSAGE_LOADING: "여는 중..." + MESSAGE_VIEW_DESC: "목록에서 선택한 메시지가 여기에 표시됩니다." + PGP_PASSWORD_INPUT_PLACEHOLDER: "비밀번호" + PGP_SIGNED_MESSAGE_DESC: "암호화로 서명된 메세지입니다. (클릭하여 확인하십시오)" + PGP_ENCRYPTED_MESSAGE_DESC: "암호화로 서명된 메세지입니다. (클릭하여 복호화 합니다)" + LINK_DOWNLOAD_AS_ZIP: "압축파일로 다운로드" + LINK_SAVE_TO_OWNCLOUD: "ownCloud에 저장하기" + LINK_SAVE_TO_DROPBOX: "Dropbox에 저장하기" + SUGGESTIONS: + SEARCHING_DESC: "검색중..." + CONTACTS: + LEGEND_CONTACTS: "연락처" + SEARCH_INPUT_PLACEHOLDER: "검색" + BUTTON_ADD_CONTACT: "연락처 추가" + BUTTON_CREATE_CONTACT: "연락처 추가" + BUTTON_UPDATE_CONTACT: "연락처 갱신" + BUTTON_IMPORT: "파일 첨부 (확장자 csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "내보내기 (확장자 vcf, vCard)" + BUTTON_EXPORT_CSV: "내보내기 (확장자 csv)" + ERROR_IMPORT_FILE: "지원하지 않는 형식의 포맷입니다." + LIST_LOADING: "여는중" + EMPTY_LIST: "연락처가 없습니다." + EMPTY_SEARCH: "연락처를 찾을 수 없습니다." + CLEAR_SEARCH: "검색 초기화" + CONTACT_VIEW_DESC: "선택한 연락처가 이 곳에 표시됩니다" + LABEL_DISPLAY_NAME: "이름 표시" + LABEL_EMAIL: "이메일" + LABEL_PHONE: "연락처" + LABEL_WEB: "홈페이지" + LABEL_BIRTHDAY: "생일" + LINK_ADD_EMAIL: "새 주소록 등록" + LINK_ADD_PHONE: "새 연락처 등록" + LINK_BIRTHDAY: "생일" + PLACEHOLDER_ENTER_DISPLAY_NAME: "표시할 이름을 입력해주세요." + PLACEHOLDER_ENTER_LAST_NAME: "성" + PLACEHOLDER_ENTER_FIRST_NAME: "이름" + PLACEHOLDER_ENTER_NICK_NAME: "별칭" + LABEL_READ_ONLY: "읽기 전용" + LABEL_SHARE: "공유하기" + ADD_MENU_LABEL: "추가" + ADD_MENU_NICKNAME: "별칭" + ADD_MENU_NOTES: "메모" + ADD_MENU_EMAIL: "이메일" + ADD_MENU_PHONE: "연락처" + ADD_MENU_URL: "웹 주소" + ADD_MENU_ADDRESS: "주소" + ADD_MENU_BIRTHDAY: "생일" + ADD_MENU_TAGS: "태그" + BUTTON_SHARE_NONE: "비어 있음" + BUTTON_SYNC: "동기화 (서비스 CardDAV)" + COMPOSE: + TITLE_FROM: "보낸 이" + TITLE_TO: "받는 이" + TITLE_CC: "참조" + TITLE_BCC: "숨은 참조" + TITLE_REPLY_TO: "답장하기" + TITLE_SUBJECT: "제목" + LINK_SHOW_INPUTS: "모든 입력창 보기" + BUTTON_SEND: "보내기" + BUTTON_SAVE: "저장" + BUTTON_DELETE: "삭제" + BUTTON_CANCEL: "취소" + BUTTON_MINIMIZE: "최소화" + SAVED_TIME: "%TIME% 에 저장됨" + SAVED_ERROR_ON_SEND: "메시지는 전송되었지만, 보낸 보관함에 저장되지 않았습니다." + DISCARD_UNSAVED_DATA: "저장되지 않은 데이터를 삭제하시겠습니까 ?" + ATTACH_FILES: "첨부파일" + ATTACH_DROP_FILES_DESC: "파일을 드래그해 넣으세요" + ATTACH_ITEM_CANCEL: "취소" + DROPBOX: "드롭박스" + GOOGLE_DRIVE: "구글 드라이브" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" + FORWARD_MESSAGE_TOP_TITLE: "-------- 전달된 메시지 -------" + FORWARD_MESSAGE_TOP_FROM: "보낸 이" + FORWARD_MESSAGE_TOP_TO: "받는 이" + FORWARD_MESSAGE_TOP_CC: "참조" + FORWARD_MESSAGE_TOP_SENT: "보냄" + FORWARD_MESSAGE_TOP_SUBJECT: "제목" + EMPTY_TO_ERROR_DESC: "수신인을 한 명 이상 선택하세요" + NO_ATTACHMENTS_HERE_DESC: "첨부된 파일이 없습니다." + ATTACHMENTS_ERROR_DESC: "경고 ! 모든 첨부파일이 업로드 되지 않습니다." + ATTACHMENTS_UPLOAD_ERROR_DESC: "첨부파일이 아직 업로드되지 않았습니다." + BUTTON_REQUEST_READ_RECEIPT: "수신확인 메일 요청" + BUTTON_MARK_AS_IMPORTANT: "중요메일 표시" + BUTTON_OPEN_PGP: "OpenPGP (글씨만)" + BUTTON_REQUEST_DSN: "영수증 요청" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "닫기" + POPUPS_ASK: + BUTTON_YES: "네" + BUTTON_NO: "아니요" + DESC_WANT_CLOSE_THIS_WINDOW: "정말 이 페이지를 닫으시겠습니까 ?" + DESC_WANT_DELETE_MESSAGES: "정말 이 메세지들을 삭제하시겠습니까 ?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "사용할 언어를 선택하세요" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "새 사용자 추가?" + BUTTON_ADD_ACCOUNT: "추가" + TITLE_UPDATE_ACCOUNT: "사용자 적용" + BUTTON_UPDATE_ACCOUNT: "적용" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "새 서명 추가?" + TITLE_UPDATE_IDENTITY: "서명을 수정하시겠습니까?" + BUTTON_ADD_IDENTITY: "추가" + BUTTON_UPDATE_IDENTITY: "수정" + LABEL_EMAIL: "이메일" + LABEL_NAME: "이름" + LABEL_REPLY_TO: "답장" + LABEL_SIGNATURE: "서명" + LABEL_CC: "Cc" + LABEL_BCC: "숨은 참조" + LABEL_SIGNATURE_INSERT_BEFORE: "답장에 이 서명을 사용합니다." + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "새 폴더 생성?" + LABEL_NAME: "폴더명" + LABEL_PARENT: "상위 폴더" + BUTTON_CREATE: "생성" + BUTTON_CANCEL: "취소" + BUTTON_CLOSE: "닫기" + TITLE_CREATING_PROCESS: "폴더 생성 중" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "이 폴더의 모든 메시지를 완전 삭제하시겠습니까?" + BUTTON_CLEAR: "초기화" + BUTTON_CANCEL: "취소" + BUTTON_CLOSE: "닫기" + DANGER_DESC_WARNING: "경고!" + DANGER_DESC_HTML_1: "이 동작은 %FOLDER% 폴더의 메시지를 모두 삭제할 것입니다." + DANGER_DESC_HTML_2: "작업이 시작되면 중지하거나 취소할 수 없습니다." + TITLE_CLEARING_PROCESS: "폴더 비우는 중..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "OpenPGP키를 입력합니다." + BUTTON_IMPORT_OPEN_PGP_KEY: "입력" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "OpenPGP키 보기" + BUTTON_SELECT: "선택" + BUTTON_CLOSE: "닫기" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "OpenPGP키 생성" + LABEL_EMAIL: "이메일" + LABEL_NAME: "이름" + LABEL_PASSWORD: "비밀번호" + LABEL_KEY_BIT_LENGTH: "키 길이" + BUTTON_GENERATE_OPEN_PGP_KEYS: "생성" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP 로그인/암호화" + LABEL_SIGN: "로그인" + LABEL_ENCRYPT: "암호화" + LABEL_PASSWORD: "비밀번호" + BUTTON_SIGN: "로그인" + BUTTON_ENCRYPT: "암호화" + BUTTON_SIGN_AND_ENCRYPT: "서명과 암호화" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP 복호화" + LABEL_KEY: "비공개 키" + LABEL_PASSWORD: "비밀번호" + BUTTON_DECRYPT: "복호화" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "2단계 인증" + LABEL_CODE: "번호" + BUTTON_TEST: "테스트" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "필터를 생성 하시겠습니까 ?" + TITLE_EDIT_FILTER: "필터를 적용 하시겠습니까 ?" + FILTER_NAME: "Name" + LEGEND_CONDITIONS: "Conditions" + LEGEND_ACTIONS: "Actions" + BUTTON_DONE: "Done" + BUTTON_ADD_CONDITION: "Add a Condition" + SELECT_ACTION_NONE: "None" + SELECT_ACTION_MOVE_TO: "Move to" + SELECT_ACTION_FORWARD_TO: "Forward to" + SELECT_ACTION_REJECT: "Reject" + SELECT_ACTION_VACATION_MESSAGE: "Vacation message" + SELECT_ACTION_DISCARD: "Discard" + SELECT_FIELD_FROM: "From" + SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" + SELECT_FIELD_SUBJECT: "Subject" + SELECT_FIELD_HEADER: "Header" + SELECT_FIELD_SIZE: "Size" + SELECT_TYPE_CONTAINS: "Contains" + SELECT_TYPE_NOT_CONTAINS: "Not Contains" + SELECT_TYPE_MATCHES: "Matches (* and ? supported)" + SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" + SELECT_TYPE_REGEXP: "Regexp" + SELECT_TYPE_NOT_REGEXP: "Not Regexp" + SELECT_TYPE_EQUAL_TO: "Equal To" + SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" + SELECT_TYPE_OVER: "Over" + SELECT_TYPE_UNDER: "Under" + SELECT_MATCH_ANY: "Matching any of the following rules" + SELECT_MATCH_ALL: "Matching all of the following rules" + MARK_AS_READ_LABEL: "Mark as read" + REPLY_INTERVAL_LABEL: "Reply interval (days)" + KEEP_LABEL: "Keep" + STOP_LABEL: "Don't stop processing rules" + EMAIL_LABEL: "Email" + VACATION_SUBJECT_LABEL: "Subject (optional)" + VACATION_MESSAGE_LABEL: "Message" + VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" + REJECT_MESSAGE_LABEL: "Reject message" + ALL_INCOMING_MESSAGES_DESC: "All incoming messages" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "메일함을 지정해주세요" + SELECT_CHOOSE_ONE: "선택해주세요" + SELECT_UNUSE_NAME: "사용하지 않음" + LABEL_SENT: "보낸 편지함" + LABEL_DRAFTS: "임시 보관함" + LABEL_SPAM: "스팸함" + LABEL_TRASH: "휴지통" + LABEL_ARCHIVE: "Archive" + BUTTON_CANCEL: "취소" + BUTTON_CLOSE: "닫기" + NOTIFICATION_SENT: |- + 보낸 편지함 폴더가 지정되지 않았습니다. 보낸 메시지를 보관하지 않고 삭제하려면 "사용하지 않음" 옵션을 선택해주세요. + NOTIFICATION_DRAFTS: "임시 보관함 폴더가 지정되지 않았습니다." + NOTIFICATION_SPAM: |- + 스팸함 폴더가 지정되지 않았습니다. 스팸처리한 메시지를 보관하지 않고 바로 삭제하려면 "사용하지 않음" 옵션을 선택해주세요. + NOTIFICATION_TRASH: |- + 휴지통 폴더가 지정되지 않았습니다. 삭제한 메시지를 휴지통에 보관하지 않고 바로 삭제하려면 "사용하지 않음" 옵션을 선택해주세요. + NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "2-Step Verification" + LABEL_ENABLE_TWO_FACTOR: "Enable 2-Step verification" + LABEL_TWO_FACTOR_USER: "User" + LABEL_TWO_FACTOR_STATUS: "Status" + LABEL_TWO_FACTOR_SECRET: "Secret" + LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" + BUTTON_CREATE: "Create New Secret" + BUTTON_ACTIVATE: "Activate" + BUTTON_CLEAR: "Clear" + BUTTON_LOGOUT: "Logout" + BUTTON_DONE: "Done" + BUTTON_TEST: "Test" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Show Secret" + BUTTON_HIDE_SECRET: "Hide Secret" + TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" + TWO_FACTOR_SECRET_DESC: >- + Import this info into your Google Authenticator client (or other TOTP client) + using the provided QR code below or by entering the code manually. + TWO_FACTOR_BACKUP_CODES_DESC: >- + If you can't receive codes via Google Authenticator, you can use backup codes + to sign in. After you’ve used a backup code to sign in, it will become inactive. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." + TITLES: + LOADING: "로딩 중" + LOGIN: "로그인" + MAILBOX: "메일함" + SETTINGS: "설정" + COMPOSE: "편지쓰기" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "파일이 너무 큽니다." + ERROR_FILE_PARTIALLY_UPLOADED: "알 수 없는 오류로 인해 파일이 부분적으로만 업로드 되었습니다." + ERROR_NO_FILE_UPLOADED: "파일이 업로드되지 않았습니다." + ERROR_MISSING_TEMP_FOLDER: "업로드한 임시 파일을 찾을 수 없습니다." + ERROR_ON_SAVING_FILE: "알 수 없는 오류가 발생했습니다." + ERROR_FILE_TYPE: "정상적인 파일 형식이 아닙니다." + ERROR_UNKNOWN: "알 수 없는 오류가 발생했습니다." + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" + TEXT_SWITCHER_RICH_FORMATTING: "위지윅 모드" + TEXT_SWITCHER_CONFIRM: "본문 형식과 이미지가 삭제됩니다. 정말 진행하시겠습니까?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "개인" + LABEL_GENERAL_NAME: "일반" + LABEL_CONTACTS_NAME: "Contacts" + LABEL_FOLDERS_NAME: "메일함" + LABEL_ACCOUNTS_NAME: "계정" + LABEL_IDENTITY_NAME: "신원" + LABEL_IDENTITIES_NAME: "신원" + LABEL_FILTERS_NAME: "Filters" + LABEL_TEMPLATES_NAME: "Templates" + LABEL_SECURITY_NAME: "Security" + LABEL_SOCIAL_NAME: "소셜" + LABEL_THEMES_NAME: "테마" + LABEL_CHANGE_PASSWORD_NAME: "비밀번호" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "뒤로" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filters" + BUTTON_SAVE: "Save" + BUTTON_ADD_FILTER: "Add a Filter" + BUTTON_DELETE: "Delete" + BUTTON_RAW_SCRIPT: "Use Custom User Script" + SUBNAME_NONE: "None" + SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" + SUBNAME_REJECT: "Reject" + SUBNAME_VACATION_MESSAGE: "Vacation message" + SUBNAME_DISCARD: "Discard" + CAPABILITY_LABEL: "Capability" + LOADING_PROCESS: "Updating filter list" + DELETING_ASK: "Are you sure?" + CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "신원" + LABEL_DISPLAY_NAME: "이름" + LABEL_REPLY_TO: "답장" + LABEL_SIGNATURE: "서명" + LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Security" + LABEL_AUTOLOGOUT: "Auto Logout" + AUTOLOGIN_NEVER_OPTION_NAME: "Never" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "일반" + LABEL_LANGUAGE: "언어" + LABEL_IDENTITY: "Identity" + LABEL_LAYOUT: "Layout" + LABEL_LAYOUT_NO_SPLIT: "No Split" + LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" + LABEL_EDITOR: "기본 본문 편집 도구" + LABEL_EDITOR_HTML: "Html 편집기" + LABEL_EDITOR_PLAIN: "텍스트 편집기" + LABEL_EDITOR_HTML_FORCED: "Html (forced)" + LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" + LABEL_ANIMATION: "인터페이스 애니메이션" + LABEL_ANIMATION_FULL: "최대 애니메이션" + LABEL_ANIMATION_NORMAL: "보통 애니메이션" + LABEL_ANIMATION_NONE: "없음" + LABEL_VIEW_OPTIONS: "화면 보기 설정" + LABEL_USE_PREVIEW_PANE: "미리보기 창 사용" + LABEL_USE_CHECKBOXES_IN_LIST: "목록에서 체크박스 보이기" + LABEL_USE_THREADS: "대화형식 사용" + LABEL_REPLY_SAME_FOLDER: "답장 메시지를 같은 폴더에 위치시킵니다." + LABEL_SHOW_IMAGES: "본문 내 외부 이미지를 항상 표시합니다." + LABEL_SHOW_ANIMATION: "애니메이션 보기" + LABEL_MESSAGE_PER_PAGE: "페이지 당 메시지 수" + LABEL_NOTIFICATIONS: "알림" + LABEL_SOUND_NOTIFICATION: "Sound notification" + LABEL_CHROME_NOTIFICATION_DESC: "새 메시지 알림 팝업 사용" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(브라우저에 의해 차단됨)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Contacts" + LABEL_CONTACTS_AUTOSAVE: "Automatically add recipients to your address book" + LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" + LABEL_CONTACTS_SYNC_SERVER: "Server" + LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" + LABEL_CONTACTS_SYNC_USER: "User" + LABEL_CONTACTS_SYNC_PASSWORD: "Password" + SETTINGS_THEMES: + LEGEND_THEMES: "테마" + LEGEND_THEMES_CUSTOM: "사용자 테마 설정" + LABEL_CUSTOM_TYPE: "종류" + LABEL_CUSTOM_TYPE_LIGHT: "밝음" + LABEL_CUSTOM_TYPE_DARK: "어두움" + LABEL_CUSTOM_BACKGROUND_IMAGE: "배경" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "배경 이미지 업로드 (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "파일이 너무 큽니다 (1MB 초과)" + ERROR_FILE_TYPE_ERROR: "파일 형식이 잘못 되었습니다. (JPG 또는 PNG만 가능)" + ERROR_UNKNOWN: "파일 업로드 중 알 수 없는 오류가 발생했습니다." + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "구글" + BUTTON_GOOGLE_CONNECT: "구글 계정에 연결" + BUTTON_GOOGLE_DISCONNECT: "구글 계정 연결 끊기" + MAIN_GOOGLE_DESC: "구글 계정에 연결을 활성화하면, 로그인 화면에서 구글 로그인 버튼을 통해 이 메일 계정에 로그인 할 수 있습니다." + LEGEND_FACEBOOK: "페이스북" + BUTTON_FACEBOOK_CONNECT: "페이스북 계정에 연결" + BUTTON_FACEBOOK_DISCONNECT: "페이스북 계정 연결 끊기" + MAIN_FACEBOOK_DESC: "페이스북 계정에 연결을 활성화하면, 로그인 화면에서 페이스북 로그인 버튼을 통해 이 메일 계정에 로그인 할 수 있습니다." + LEGEND_TWITTER: "트위터" + BUTTON_TWITTER_CONNECT: "트위터 계정에 연결" + BUTTON_TWITTER_DISCONNECT: "트위터 계정 연결 끊기" + MAIN_TWITTER_DESC: "트위터 계정에 연결을 활성화하면, 로그인 화면에서 트위터 로그인 버튼을 통해 이 메일 계정에 로그인 할 수 있습니다." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "폴더 목록" + BUTTON_CREATE: "새 폴더 만들기" + BUTTON_DELETE: "삭제" + BUTTON_SUBSCRIBE: "보기" + BUTTON_UNSUBSCRIBE: "보이지 않기" + LOADING_PROCESS: "폴더 목록을 업데이트하고 있습니다." + CREATING_PROCESS: "폴더를 생성하고 있습니다." + DELETING_PROCESS: "폴더를 삭제하고 있습니다." + RENAMING_PROCESS: "폴더명을 변경하고 있습니다." + DELETING_ASK: "정말로 삭제하시겠습니까?" + TO_MANY_FOLDERS_DESC_1: "You have too many folders!" + TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." + HELP_DELETE_FOLDER: "Delete folder" + HELP_SHOW_HIDE_FOLDER: "Show/hide folder" + HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "계정 목록" + LEGEND_IDENTITIES: "Identities" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" + BUTTON_ADD_ACCOUNT: "계정 추가" + BUTTON_ADD_IDENTITY: "Add an Identity" + BUTTON_DELETE: "삭제" + LOADING_PROCESS: "계정 목록을 업데이트하고 있습니다." + DELETING_ASK: "정말로 삭제하시겠습니까?" + DEFAULT_IDENTITY_LABEL: "default" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "신원" + LEGEND_IDENTITIES: "새 신원 추가" + LABEL_DEFAULT: "Default" + LABEL_DISPLAY_NAME: "이름" + LABEL_REPLY_TO: "답장" + LABEL_SIGNATURE: "서명" + LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" + BUTTON_ADD_IDENTITY: "신원 추가" + BUTTON_DELETE: "삭제" + LOADING_PROCESS: "신원 목록을 업데이트하고 있습니다." + DELETING_ASK: "정말로 삭제하시겠습니까?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "비밀번호 변경" + LABEL_CURRENT_PASSWORD: "현재 비밀번호" + LABEL_NEW_PASSWORD: "새 비밀번호" + LABEL_REPEAT_PASSWORD: "비밀번호 재입력" + BUTTON_UPDATE_PASSWORD: "비밀번호 변경" + ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" + TITLE_PRIVATE: "Private" + TITLE_PUBLIC: "Public" + DELETING_ASK: "Are you sure?" + GENERATE_ONLY_HTTPS: "HTTPS only" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" + TAB_MAILBOX: "Mailbox" + TAB_MESSAGE_LIST: "Message list" + TAB_MESSAGE_VIEW: "Message view" + TAB_COMPOSE: "Compose" + LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" + LABEL_REPLY: "Reply" + LABEL_REPLY_ALL: "Reply All" + LABEL_FORWARD: "Forward" + LABEL_FORWARD_MULTIPLY: "Forward (multiply)" + LABEL_HELP: "Help" + LABEL_CHECK_ALL: "Select all messages" + LABEL_ARCHIVE: "Archive" + LABEL_DELETE: "Delete" + LABEL_OPEN_THREAD: "Open selected thread" + LABEL_MOVE: "Move" + LABEL_READ: "Read selected messages" + LABEL_UNREAD: "Unread selected messages" + LABEL_SEARCH: "Search" + LABEL_CANCEL_SEARCH: "Cancel search" + LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" + LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" + LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" + LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" + LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" + LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" + LABEL_THREAD_NEXT: "Next message in thread" + LABEL_THREAD_PREV: "Previous message in thread" + LABEL_PRINT: "Print" + LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" + LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" + LABEL_SWITCH_TO_LIST: "Switch focus back to message list" + LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" + LABEL_SAVE_MESSAGE: "Save message" + LABEL_SEND_MESSAGE: "Send message" + LABEL_CLOSE_COMPOSE: "Close compose" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "No public keys found" + NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" + NO_PRIVATE_KEY_FOUND: "No private key found" + NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" + ADD_A_PUBLICK_KEY: "Add a public key" + UNVERIFIRED_SIGNATURE: "Unverified signature" + DECRYPTION_ERROR: "OpenPGP decryption error" + GOOD_SIGNATURE: "Good signature from %USER%" + PGP_ERROR: "OpenPGP error: %ERROR%" + SPECIFY_FROM_EMAIL: "Please specify FROM email address" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" + NOTIFICATIONS: + INVALID_TOKEN: "잘못된 토큰입니다." + AUTH_ERROR: "인증 실패" + ACCESS_ERROR: "접근 오류" + CONNECTION_ERROR: "서버에 연결할 수 없습니다." + CAPTCHA_ERROR: "보안문자를 잘못 입력하였습니다." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- + 이 페이스북 아이디는 아직 어떠한 이메일 계정에도 연결되지 않았습니다. 이메일 계정으로 로그인 하신 후 소셜 설정에서 소셜 계정에 연결해주세요. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- + 이 트위터 아이디는 아직 어떠한 이메일 계정에도 연결되지 않았습니다. 이메일 계정으로 로그인 하신 후 소셜 설정에서 소셜 계정에 연결해주세요. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- + 이 구글 아이디는 아직 어떠한 이메일 계정에도 연결되지 않았습니다. 이메일 계정으로 로그인 하신 후 소셜 설정에서 소셜 계정에 연결해주세요. + DOMAIN_NOT_ALLOWED: "허용된 도메인이 아닙니다." + ACCOUNT_NOT_ALLOWED: "허용된 계정이 아닙니다." + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" + COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" + CURRENT_PASSWORD_INCORRECT: "Current password incorrect" + NEW_PASSWORD_SHORT: "Password is too short" + NEW_PASSWORD_WEAK: "Password is too easy" + NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" + CONTACTS_SYNC_ERROR: "Contacts synchronization error" + CANT_GET_MESSAGE_LIST: "메시지 목록을 불러 올 수 없습니다." + CANT_GET_MESSAGE: "메시지를 가져올 수 없습니다." + CANT_DELETE_MESSAGE: "메시지를 삭제할 수 없습니다." + CANT_MOVE_MESSAGE: "메시지를 이동할 수 없습니다." + CANT_SAVE_MESSAGE: "메시지를 저장할 수 없습니다." + CANT_SEND_MESSAGE: "메시지를 보낼 수 없습니다." + INVALID_RECIPIENTS: "수신인 오류" + CANT_SAVE_FILTERS: "Can't save filters" + CANT_GET_FILTERS: "Can't get filters" + FILTERS_ARE_NOT_CORRECT: "Filters are not correct" + CANT_CREATE_FOLDER: "폴더를 생성할 수 없습니다." + CANT_RENAME_FOLDER: "폴더명을 변경할 수 없습니다." + CANT_DELETE_FOLDER: "폴더를 삭제할 수 없습니다." + CANT_DELETE_NON_EMPTY_FOLDER: "비어있지 않은 디렉터리를 삭제할 수 없습니다." + CANT_SUBSCRIBE_FOLDER: "폴더를 볼 수 없습니다." + CANT_UNSUBSCRIBE_FOLDER: "폴더를 보이지 않게 할 수 없습니다." + CANT_SAVE_SETTINGS: "설정을 저장할 수 없습니다." + CANT_SAVE_PLUGIN_SETTINGS: "설정을 저장할 수 없습니다." + DOMAIN_ALREADY_EXISTS: "이미 존재하는 도메인입니다." + CANT_INSTALL_PACKAGE: "패키지 설치에 실패했습니다." + CANT_DELETE_PACKAGE: "패키지 제거에 실패했습니다." + INVALID_PLUGIN_PACKAGE: "정상적인 플러그인 패키지가 아닙니다." + UNSUPPORTED_PLUGIN_PACKAGE: "지원되지 않는 플러그인 패키지입니다." + LICENSING_SERVER_IS_UNAVAILABLE: "서버가 사용가능 상태가 아닙니다." + LICENSING_DOMAIN_EXPIRED: "이 도메인의 라이센스가 만료되었습니다." + LICENSING_DOMAIN_BANNED: "사용 금지된 도메인입니다." + DEMO_SEND_MESSAGE_ERROR: "이 테스트 계정은 외부 메일 발송이 금지되어있습니다." + DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" + ACCOUNT_ALREADY_EXISTS: "이미 존재하는 계정입니다." + MAIL_SERVER_ERROR: "메일 서버에 연결하는 중 오류가 발생했습니다." + INVALID_INPUT_ARGUMENT: "Invalid input argument" + UNKNOWN_ERROR: "알 수 없는 오류" + STATIC: + BACK_LINK: "새로고침" + DOMAIN_LIST_DESC: "접근이 허가된 도메인 목록입니다." + PHP_EXSTENSIONS_ERROR_DESC: "필요한 PHP 확장이 구성되지 않았습니다!" + PHP_VERSION_ERROR_DESC: "현재 사용 중인 PHP 버전 (%VERSION%)이 너무 낮습니다. 최소 5.3.0 이상을 설치해주세요!" + NO_SCRIPT_TITLE: "자바스크립트 필요" + NO_SCRIPT_DESC: |- + 사용 중인 브라우저가 자바스크립트를 지원하지 않습니다. 브라우저 설정을 확인하여 자바스크립트 사용을 활성화하고 다시 시도해주세요. + NO_COOKIE_TITLE: "이 어플리케이션을 사용하려면 쿠키 사용이 지원되야 합니다." + NO_COOKIE_DESC: |- + 사용 중인 브라우저가 쿠키를 지원하지 않습니다. 브라우저 설정을 확인하여 쿠키 사용을 활성화하고 다시 시도해주세요. + BAD_BROWSER_TITLE: "사용 중인 브라우저가 구버전입니다." + BAD_BROWSER_DESC: |- + 이 어플리케이션을 정상적으로 사용하시려면 아래의 브라우저들 중 하나를 설치해주세요: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/lt_LT.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/lt_LT.yml new file mode 100755 index 00000000..3ff7d4cd --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/lt_LT.yml @@ -0,0 +1,711 @@ +lt_LT: + LOGIN: + LABEL_EMAIL: "E-paštas" + LABEL_LOGIN: "Prisijungimo vardas" + LABEL_PASSWORD: "Slaptažodis" + LABEL_SIGN_ME: "Prisimink mane" + LABEL_VERIFICATION_CODE: "Saugos kodas" + LABEL_DONT_ASK_VERIFICATION_CODE: "Neklausk saugos kodo kitas 2 savaites" + BUTTON_SIGN_IN: "Prisijungti" + TITLE_SIGN_IN_GOOGLE: "Prisijungti naudojant Google paskyrą" + TITLE_SIGN_IN_FACEBOOK: "Prisijungti naudojant Facebook paskyrą" + TITLE_SIGN_IN_TWITTER: "Prisijungti naudojant Twitter paskyrą" + LABEL_FORGOT_PASSWORD: "Pamiršau slaptažodį" + LABEL_REGISTRATION: "Registracija" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Pridėti paskyrą" + BUTTON_SETTINGS: "Nustatymai" + BUTTON_HELP: "Pagalba" + BUTTON_LOGOUT: "Atsijungti" + MOBILE: + BUTTON_MOBILE_VERSION: "Mobili versija" + BUTTON_DESKTOP_VERSION: "Standartinė versija" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Paieška" + TITLE_ADV: "Detali paieška" + LABEL_ADV_FROM: "Nuo" + LABEL_ADV_TO: "Kam" + LABEL_ADV_SUBJECT: "Tema" + LABEL_ADV_TEXT: "Laiško Tekstas" + LABEL_ADV_HAS_ATTACHMENT: "Turi priedą" + LABEL_ADV_HAS_ATTACHMENTS: "Turi priedą" + LABEL_ADV_FLAGGED: "Pažymėtas" + LABEL_ADV_UNSEEN: "Neskaitytas" + LABEL_ADV_DATE: "Data" + LABEL_ADV_DATE_ALL: "Visi" + LABEL_ADV_DATE_3_DAYS: "Nesenesni kaip 3 dienų" + LABEL_ADV_DATE_7_DAYS: "Nesenesni kaip 1 savaitės" + LABEL_ADV_DATE_MONTH: "Nesenesni kaip 1 mėnesio" + LABEL_ADV_DATE_3_MONTHS: "Nesenesni kaip 3 mėnesių" + LABEL_ADV_DATE_6_MONTHS: "Nesenesni kaip 6 mėnesių" + LABEL_ADV_DATE_YEAR: "Nesenesni kaip 1 metų" + BUTTON_ADV_SEARCH: "Ieškoti" + PREVIEW_POPUP: + FULLSCREEN: "Perjungti viso ekrano režimą" + ZOOM: "Didinti / mažinti" + CLOSE: "Uždaryti (Esc)" + LOADING: "Kraunasi..." + GALLERY_PREV: "Ankstesnis (Rodyklė kairėn)" + GALLERY_NEXT: "Kitas (Rodyklė dešinėn)" + GALLERY_COUNTER: "%curr% iš %total%" + IMAGE_ERROR: "Paveikslėlis negali būti įkeltas." + AJAX_ERROR: "Turinys negalėji būti įkeltas." + FOLDER_LIST: + BUTTON_COMPOSE: "Sukurti" + BUTTON_CONTACTS: "Kontaktai" + BUTTON_NEW_MESSAGE: "Rašyti naują" + INBOX_NAME: "Gautieji" + SENT_NAME: "Išsiųsti" + DRAFTS_NAME: "Juodraščiai" + SPAM_NAME: "Šlamštas" + TRASH_NAME: "Šiukšlynas" + ARCHIVE_NAME: "Archyvas" + QUOTA: + TITLE: "Kvotos naudojimas" + MESSAGE_LIST: + BUTTON_RELOAD: "Atnaujinti žinučių sąrašą" + BUTTON_MOVE_TO: "Perkelti į" + BUTTON_DELETE: "Naikinti" + BUTTON_ARCHIVE: "Archyvuoti" + BUTTON_SPAM: "Žymėti kaip šlamštas" + BUTTON_NOT_SPAM: "Ne šlamštas" + BUTTON_EMPTY_FOLDER: "Valyti katalogą" + BUTTON_MULTY_FORWARD: "Persiųsti kaip priedą(us)" + BUTTON_DELETE_WITHOUT_MOVE: "Naikinti visam laikui" + BUTTON_MORE: "Daugiau" + MENU_SET_SEEN: "Pažymėti kaip skaitytą" + MENU_SET_ALL_SEEN: "Pažymėti visus kaip skaitytus" + MENU_UNSET_SEEN: "Pažymėti kaip neskaitytą" + MENU_SET_FLAG: "Pažymėti žvaigždute" + MENU_UNSET_FLAG: "Panaikinti žymėjimą" + MENU_SELECT_ALL: "Visi" + MENU_SELECT_NONE: "Nieko" + MENU_SELECT_INVERT: "Apversti" + MENU_SELECT_UNSEEN: "Neskaityta" + MENU_SELECT_SEEN: "Skaityta" + MENU_SELECT_FLAGGED: "Pažymėta" + MENU_SELECT_UNFLAGGED: "Nepažymėta" + EMPTY_LIST: "Tuščias sąrašas." + EMPTY_SEARCH_LIST: "Nėra pranešimų, atitinkančių jūsų paiešką." + SEARCH_RESULT_FOR: "Ieškoti \"%SEARCH%\" rezultatuose" + BACK_TO_MESSAGE_LIST: "grįžti į sąrašą" + LIST_LOADING: "Kraunasi" + EMPTY_SUBJECT_TEXT: "(Be temos)" + PUT_MESSAGE_HERE: "Įkelkite žinutę čia, kad matytumėte ją sąraše" + TODAY_AT: "šiandien %TIME%" + YESTERDAY_AT: "vakar %TIME%" + SEARCH_PLACEHOLDER: "Ieškoti" + NEW_MESSAGE_NOTIFICATION: "Jūs turite %COUNT% naujų laiškų!" + QUOTA_SIZE: "Naudojate %SIZE% (%PROC%%) iš savo turimų %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Taisyti" + BUTTON_BACK: "Atgal" + BUTTON_CLOSE: "Uždaryti" + BUTTON_DELETE: "Naikinti" + BUTTON_UNSUBSCRIBE: "Atsisakyti šios prenumeratos" + BUTTON_ARCHIVE: "Archyvas" + BUTTON_SPAM: "Šlamštas" + BUTTON_NOT_SPAM: "Ne šlamštas" + BUTTON_MOVE_TO: "Perkelti į" + BUTTON_MORE: "Daugiau" + BUTTON_REPLY: "Atsakyti" + BUTTON_REPLY_ALL: "Atsakyti visiems" + BUTTON_FORWARD: "Persiųsti" + BUTTON_FORWARD_AS_ATTACHMENT: "Persiųsti kaip priedą" + BUTTON_EDIT_AS_NEW: "Redaguoti kaip naują" + BUTTON_SHOW_IMAGES: "Rodyti išorinius paveikslėlius" + BUTTON_NOTIFY_READ_RECEIPT: "Siuntėjas pageidavo būti informuotas, kai jūs perskaitysite šį pranešimą." + BUTTON_IN_NEW_WINDOW: "Peržiūrėti atskirame lange" + BUTTON_THREAD_LIST: "Temų sąrašas" + BUTTON_THREAD_PREV: "Ankstesnis" + BUTTON_THREAD_NEXT: "Kitas" + BUTTON_THREAD_MORE: "Daugiau žinučių" + MENU_HEADERS: "Rodyti pranešimų antraštės" + MENU_VIEW_ORIGINAL: "Rodyti šaltinį" + MENU_DOWNLOAD_ORIGINAL: "Atsisiųsti .eml failą" + MENU_FILTER_SIMILAR: "Filtruoti laiškus, kaip šis" + MENU_PRINT: "Spausdinti" + EMPTY_SUBJECT_TEXT: "(Be temos)" + LABEL_SUBJECT: "Tema" + LABEL_DATE: "Data" + LABEL_FROM: "Nuo" + LABEL_FROM_SHORT: "nuo" + LABEL_TO: "Kam" + LABEL_TO_SHORT: "kam" + LABEL_CC: "Kopija" + LABEL_BCC: "Nematoma kopija" + LABEL_REPLY_TO: "Kam atsakyti" + PRINT_LABEL_FROM: "Nuo" + PRINT_LABEL_TO: "Kam" + PRINT_LABEL_CC: "Kopija" + PRINT_LABEL_BCC: "Nematoma kopija" + PRINT_LABEL_REPLY_TO: "Kam atsakyti" + PRINT_LABEL_DATE: "Data" + PRINT_LABEL_SUBJECT: "Tema" + PRINT_LABEL_ATTACHMENTS: "Priedai" + MESSAGE_LOADING: "Kraunasi" + MESSAGE_VIEW_DESC: "Pasirinkite žinutę sąraše, kad matytumėte jos turinį čia." + MESSAGE_VIEW_MOVE_DESC: "Kairėje pasirinkite katalogą, į kurį norite perkelti." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Slaptažodis" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP pasirašytas pranešimas (spustelkite patikrinimui)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP šifruotas pranešimas (spustelkite iššifravimui)" + LINK_DOWNLOAD_AS_ZIP: "Atsisiųsti zip archyvą" + LINK_SAVE_TO_OWNCLOUD: "Išsaugoti į ownCloud" + LINK_SAVE_TO_DROPBOX: "Išsaugoti į Dropbox" + READ_RECEIPT: + SUBJECT: "Pristatymo patvirtinimas (laiškas parodytas) - %SUBJECT%" + BODY: | + Tai yra laiško pristatymo patvirtinimas, kurį Jūs siuntėte gavėjui %READ-RECEIPT%. + + Pastaba: Šis pranešimas įrodo, kad laiškas buvo rodomas gavėjo kompiuteryje. + Nėra jokios garantijos, kad gavėjas perskaitė ar suprato laiško turinį. + SUGGESTIONS: + SEARCHING_DESC: "Ieškome..." + CONTACTS: + LEGEND_CONTACTS: "Kontaktai" + SEARCH_INPUT_PLACEHOLDER: "Ieškoti" + BUTTON_ADD_CONTACT: "Pridėti kontaktą" + BUTTON_CREATE_CONTACT: "Sukurti" + BUTTON_UPDATE_CONTACT: "Atnaujinti" + BUTTON_IMPORT: "Importuoti (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Eksportuoti (vcf, vCard)" + BUTTON_EXPORT_CSV: "Eksportuoti (csv)" + ERROR_IMPORT_FILE: "Importavimo klaida (neteisingas failo formatas)" + LIST_LOADING: "Kraunasi" + EMPTY_LIST: "Tuščias sąrašas" + EMPTY_SEARCH: "Kontaktų nerasta" + CLEAR_SEARCH: "Išvalyti paiešką" + CONTACT_VIEW_DESC: "Pasirinkite kontaktą sąraše, kad matytumėte informaciją čia." + LABEL_DISPLAY_NAME: "Rodomas vardas" + LABEL_EMAIL: "E-paštas" + LABEL_PHONE: "Telefonas" + LABEL_WEB: "Tinklapis" + LABEL_BIRTHDAY: "Gimtadienis" + LINK_ADD_EMAIL: "Pridėti elektroninio pašto adresą" + LINK_ADD_PHONE: "Pridėti telefono Nr." + LINK_BIRTHDAY: "Gimtadienis" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Įveskite rodomą vardą" + PLACEHOLDER_ENTER_LAST_NAME: "Įveskite pavardę" + PLACEHOLDER_ENTER_FIRST_NAME: "Įveskite vardą" + PLACEHOLDER_ENTER_NICK_NAME: "Įveskite slapyvardį" + LABEL_READ_ONLY: "Tik skaitymui" + LABEL_SHARE: "Dalintis" + ADD_MENU_LABEL: "Pridėti" + ADD_MENU_NICKNAME: "Slapyvardis" + ADD_MENU_NOTES: "Pastabos" + ADD_MENU_EMAIL: "E-paštas" + ADD_MENU_PHONE: "Telefono Nr." + ADD_MENU_URL: "URL nuoroda" + ADD_MENU_ADDRESS: "Adresas" + ADD_MENU_BIRTHDAY: "Gimtadienis" + ADD_MENU_TAGS: "Žymos" + BUTTON_SHARE_NONE: "Nesidalinti" + BUTTON_SHARE_ALL: "Visiems" + BUTTON_SYNC: "Sinchronizavimas (CardDAV)" + COMPOSE: + TITLE_FROM: "Nuo" + TITLE_TO: "Kam" + TITLE_CC: "Kopija" + TITLE_BCC: "Nematoma kopija BCC" + TITLE_REPLY_TO: "Atsakyti" + TITLE_SUBJECT: "Tema" + LINK_SHOW_INPUTS: "rodyti visus laukus" + BUTTON_SEND: "Siųsti" + BUTTON_SAVE: "Išsaugoti" + BUTTON_DELETE: "Naikinti" + BUTTON_CANCEL: "Atšaukti" + BUTTON_MINIMIZE: "Minimizuoti" + SAVED_TIME: "Išsaugota %TIME%" + SAVED_ERROR_ON_SEND: "Pranešimas buvo išsiųstas, bet neišsaugotas išsiųstų kataloge" + DISCARD_UNSAVED_DATA: "Atmesti neišsaugotus duomenis?" + ATTACH_FILES: "Prisegti failų" + ATTACH_DROP_FILES_DESC: "Įkelkite failus čia" + ATTACH_ITEM_CANCEL: "Atšaukti" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Diskas" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% parašė" + FORWARD_MESSAGE_TOP_TITLE: "-------- Persiųstas pranešimas -------" + FORWARD_MESSAGE_TOP_FROM: "Nuo" + FORWARD_MESSAGE_TOP_TO: "Kam" + FORWARD_MESSAGE_TOP_CC: "Kopija CC" + FORWARD_MESSAGE_TOP_SENT: "Išsiųstas" + FORWARD_MESSAGE_TOP_SUBJECT: "Tema" + EMPTY_TO_ERROR_DESC: "Prašome nurodyti bent vieną gavėją" + NO_ATTACHMENTS_HERE_DESC: "Nėra priedų." + ATTACHMENTS_ERROR_DESC: "Dėmesio! Ne visi priedai buvo įkelti." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Dar ne visi priedai buvo įkelti" + BUTTON_REQUEST_READ_RECEIPT: "Prašyti pranešti kada bus perskaitytas" + BUTTON_MARK_AS_IMPORTANT: "Žymėti svarbiu" + BUTTON_OPEN_PGP: "OpenPGP (Tik paprastas tekstas)" + BUTTON_REQUEST_DSN: "Prašyti laiško gavimo pažymos" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Uždaryti" + POPUPS_ASK: + BUTTON_YES: "Taip" + BUTTON_NO: "Ne" + DESC_WANT_CLOSE_THIS_WINDOW: "Ar tikrai norite uždaryti šį langą??" + DESC_WANT_DELETE_MESSAGES: "Ar tikrai norite ištrinti pranešimą(us)?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Pasirinkite kalbą" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Pridėti paskyrą?" + BUTTON_ADD_ACCOUNT: "Pridėti" + TITLE_UPDATE_ACCOUNT: "Atnaujinti paskyrą?" + BUTTON_UPDATE_ACCOUNT: "Atnaujinti" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Pridėti tapatybę?" + TITLE_UPDATE_IDENTITY: "Atnaujinti tapatybę?" + BUTTON_ADD_IDENTITY: "Pridėti" + BUTTON_UPDATE_IDENTITY: "Atnaujinti" + LABEL_EMAIL: "E-paštas" + LABEL_NAME: "Vardas" + LABEL_REPLY_TO: "Atsakyti" + LABEL_SIGNATURE: "Parašas" + LABEL_CC: "Cc" + LABEL_BCC: "Nematoma kopija" + LABEL_SIGNATURE_INSERT_BEFORE: "Įterpti šį parašą prieš citatą rašant atsakymą" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Sukurti aplanką?" + LABEL_NAME: "Aplanko pavadinimas" + LABEL_PARENT: "Pirminis katalogas" + BUTTON_CREATE: "Sukurti" + BUTTON_CANCEL: "Atšaukti" + BUTTON_CLOSE: "Uždaryti" + TITLE_CREATING_PROCESS: "Kuriamas katalogas" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Pašalinti visus pranešimus iš aplanko?" + BUTTON_CLEAR: "Išvalyti" + BUTTON_CANCEL: "Atšaukti" + BUTTON_CLOSE: "Uždaryti" + DANGER_DESC_WARNING: "Dėmesio!" + DANGER_DESC_HTML_1: "Šiuo veiksmu Jūs panaikinsite viską iš katalogo %FOLDER%." + DANGER_DESC_HTML_2: "Pradėjus veiksmą, jis nebesustabdomas." + TITLE_CLEARING_PROCESS: "Valomas katalogas..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Importuoti OpenPGP raktą" + BUTTON_IMPORT_OPEN_PGP_KEY: "Importuoti" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "Peržiūrėti OpenPGP raktą" + BUTTON_SELECT: "Pasirinkti" + BUTTON_CLOSE: "Uždaryti" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Sukurti OpenPGP raktą" + LABEL_EMAIL: "E-paštas" + LABEL_NAME: "Vardas" + LABEL_PASSWORD: "Slaptažodis" + LABEL_KEY_BIT_LENGTH: "Rakto ilgis" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Sukurti" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP Parašas/Šifravimas" + LABEL_SIGN: "Parašas" + LABEL_ENCRYPT: "Šifravimas" + LABEL_PASSWORD: "Slaptažodis" + BUTTON_SIGN: "Pasirašyti" + BUTTON_ENCRYPT: "Šifruoti" + BUTTON_SIGN_AND_ENCRYPT: "Pasirašyti ir šifruoti" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" + LABEL_KEY: "Private Key" + LABEL_PASSWORD: "Password" + BUTTON_DECRYPT: "Decrypt" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "2-jų žingsnių patikrinimo bandymas" + LABEL_CODE: "Kodas" + BUTTON_TEST: "Bandyti" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Sukurti filtrą?" + TITLE_EDIT_FILTER: "Atnaujinti filtrą?" + FILTER_NAME: "Pavadinimas" + LEGEND_CONDITIONS: "Sąlygos" + LEGEND_ACTIONS: "Veiksmai" + BUTTON_DONE: "Atlikta" + BUTTON_ADD_CONDITION: "Pridėti sąlygą" + SELECT_ACTION_NONE: "Nieko" + SELECT_ACTION_MOVE_TO: "Perkelti į" + SELECT_ACTION_FORWARD_TO: "Persiūsti" + SELECT_ACTION_REJECT: "Atmesti" + SELECT_ACTION_VACATION_MESSAGE: "Atostogų atsakiklis" + SELECT_ACTION_DISCARD: "Nepaisyti" + SELECT_FIELD_FROM: "Nuo" + SELECT_FIELD_RECIPIENTS: "Gavėjai (Kam ar CC)" + SELECT_FIELD_SUBJECT: "Tema" + SELECT_FIELD_HEADER: "Antraštė" + SELECT_FIELD_SIZE: "Dydis" + SELECT_TYPE_CONTAINS: "Turi" + SELECT_TYPE_NOT_CONTAINS: "Neturi" + SELECT_TYPE_MATCHES: "Atitinka (* ir ? galioja)" + SELECT_TYPE_NOT_MATCHES: "Neatitinka (* ir ? galioja)" + SELECT_TYPE_REGEXP: "Regexp" + SELECT_TYPE_NOT_REGEXP: "Ne Regexp" + SELECT_TYPE_EQUAL_TO: "Tiksliai atitinka" + SELECT_TYPE_NOT_EQUAL_TO: "Ne tiksliai" + SELECT_TYPE_OVER: "Daugiau kaip" + SELECT_TYPE_UNDER: "Mažiau nei" + SELECT_MATCH_ANY: "Atitinka bet kurią iš šių taisyklių" + SELECT_MATCH_ALL: "Atitinka visas šias taisykles" + MARK_AS_READ_LABEL: "Žymėti skaitytu" + REPLY_INTERVAL_LABEL: "Atsakymų intervalai (dienomis)" + KEEP_LABEL: "laikyti" + STOP_LABEL: "Nesustoti vykdyti taisykles" + EMAIL_LABEL: "E-paštas" + VACATION_SUBJECT_LABEL: "Tema (nebūtina)" + VACATION_MESSAGE_LABEL: "Žinutė" + VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" + REJECT_MESSAGE_LABEL: "Atmesti žinutę" + ALL_INCOMING_MESSAGES_DESC: "Visi ateinantys laiškai" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Pasirinkti sisteminius katalogus" + SELECT_CHOOSE_ONE: "Pasirinkite vieną" + SELECT_UNUSE_NAME: "Nenaudoti" + LABEL_SENT: "Siųsti" + LABEL_DRAFTS: "Juodraščiai" + LABEL_SPAM: "Šlamštas" + LABEL_TRASH: "Šiukšliadėžė" + LABEL_ARCHIVE: "Archyvas" + BUTTON_CANCEL: "Atšaukti" + BUTTON_CLOSE: "Uždaryti" + NOTIFICATION_SENT: | + Nepasirinkote "Išsiųstieji" katalogo išsiųstiems laiškams saugoti. + Jei nenorite saugoti laiškų po išsiuntimo, pasirinkite "Nenaudoti" variantą. + NOTIFICATION_DRAFTS: "Nepasirinkote \"Juodraščiai\" sisteminio katalogo žinutėms, kurios saugomos kol jas rašote." + NOTIFICATION_SPAM: | + Nepasirinkote "Šlamštas" sisteminio katalogo laikyti nepageidaujamies laiškams. + Jei norite nekaupti šlamšto ir iškart išmesti, pasirinkite "Nenaudoti" variantą. + NOTIFICATION_TRASH: | + Nepasirinkote "Šiukšliadėžė" sisteminio katalogo ištrintoms žinutėms. + Jei nenorite naudotis šiukšliadėže ir išmesti laiškus visam laikui iškart juos trinant, pasirinkite "Nenaudoti" variantą. + NOTIFICATION_ARCHIVE: "Nepasirinkote \"Archyvas\" sisteminio katalogo." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "2-jų žingsnių patikrinimas" + LABEL_ENABLE_TWO_FACTOR: "Įjungti 2-jų žingsnių patikrinimą" + LABEL_TWO_FACTOR_USER: "Vartotojas" + LABEL_TWO_FACTOR_STATUS: "Statusas" + LABEL_TWO_FACTOR_SECRET: "Slaptažodis" + LABEL_TWO_FACTOR_BACKUP_CODES: "Sukurti kodų atsarginę kopiją" + BUTTON_CREATE: "Sukurti naują slaptažodį" + BUTTON_ACTIVATE: "Activate" + BUTTON_CLEAR: "Išvalytis" + BUTTON_LOGOUT: "Logout" + BUTTON_DONE: "Done" + BUTTON_TEST: "Bandyti" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Rodyti slaptažodį" + BUTTON_HIDE_SECRET: "Slėpti slaptažodį" + TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Sukonfiguruota" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Nesukonfiguruota" + TWO_FACTOR_SECRET_DESC: >- + Importuoti šią informaciją į Google autentifikavimo klientą naudojant žemiau + pateiktą QR kodą arba įveskite kodą rankiniu būdu. + TWO_FACTOR_BACKUP_CODES_DESC: >- + Jei negaunate kodo per Google autentifikavimo klientą, galite nautotis savo + sukurta atsargine kodų kopija. Kai panaudosite atsarginę kopiją prisijungimui, + ji taps neaktyvi. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Negalite paksiti šio nustatymo nepratestavę." + TITLES: + LOADING: "Kraunasi" + LOGIN: "Vartotojas" + MAILBOX: "Pašto dėžutė" + SETTINGS: "Nustatymai" + COMPOSE: "Sukurti" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Prisegamas failas per didelis" + ERROR_FILE_PARTIALLY_UPLOADED: "Dėl nežinomos klaidos failas tik dalinai prisegtas" + ERROR_NO_FILE_UPLOADED: "Neįkelti failai" + ERROR_MISSING_TEMP_FOLDER: "Trūktsta laikino failo" + ERROR_ON_SAVING_FILE: "Nežinoma klaida įkeliant failą" + ERROR_FILE_TYPE: "Neleidžiamas failo tipas" + ERROR_UNKNOWN: "Nežinoma klaida įkeliant failą" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEKSTAS" + TEXT_SWITCHER_RICH_FORMATTING: "Raiškusis formatas" + TEXT_SWITCHER_CONFIRM: "Teksto farmatas ir paveikslėliai bus prarasti. Tikrai norite tęsti?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Asmeniniai" + LABEL_GENERAL_NAME: "Pagrindiniai" + LABEL_CONTACTS_NAME: "Kontaktai" + LABEL_FOLDERS_NAME: "Katalogai" + LABEL_ACCOUNTS_NAME: "Paskyros" + LABEL_IDENTITY_NAME: "Tapatybės" + LABEL_IDENTITIES_NAME: "Tapatybės" + LABEL_FILTERS_NAME: "Filtrai" + LABEL_TEMPLATES_NAME: "Templates" + LABEL_SECURITY_NAME: "Sauga" + LABEL_SOCIAL_NAME: "Socialiniai" + LABEL_THEMES_NAME: "Temos" + LABEL_CHANGE_PASSWORD_NAME: "Slaptažodis" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Atgal" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filtrai" + BUTTON_SAVE: "Saugoti" + BUTTON_ADD_FILTER: "Pridėti filtrą" + BUTTON_DELETE: "Naikinti" + BUTTON_RAW_SCRIPT: "Naudoti savo sukurtą kodą" + SUBNAME_NONE: "Nieko" + SUBNAME_MOVE_TO: "Perkelti į \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "persiūsti \"%EMAIL%\"" + SUBNAME_REJECT: "Atmesti" + SUBNAME_VACATION_MESSAGE: "Atostogų žinutė" + SUBNAME_DISCARD: "Nepaisyti" + CAPABILITY_LABEL: "Galimybės" + LOADING_PROCESS: "Atnaujinamas filtrų sąrašas" + DELETING_ASK: "Ar Jūs įsitikinę?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Šios nuostatos turi būti išsaugotos serveryje." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Tapatybė" + LABEL_DISPLAY_NAME: "Vardas" + LABEL_REPLY_TO: "Atsakyti" + LABEL_SIGNATURE: "Parašas" + LABEL_ADD_SIGNATURE_TO_ALL: "Pridėti parašą visiems rašomiems laiškams" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Sauga" + LABEL_CONFIGURE_TWO_FACTOR: "Konfiguruoti 2-žingsnių patikrinimą" + LABEL_AUTOLOGOUT: "Automatinis atsijungimas" + AUTOLOGIN_NEVER_OPTION_NAME: "Niekada" + AUTOLOGIN_MINUTES_OPTION_NAME: "po %MINUTES% minučių" + AUTOLOGIN_HOURS_OPTION_NAME: "po %HOURS% valandų" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Pagrindiniai" + LABEL_LANGUAGE: "Kalba" + LABEL_IDENTITY: "Tapatybė" + LABEL_LAYOUT: "Išdėstymas" + LABEL_LAYOUT_NO_SPLIT: "Skaidymo nėra" + LABEL_LAYOUT_VERTICAL_SPLIT: "Vertikalus skaidymas" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontalus skaidymas" + LABEL_EDITOR: "Numatytas teksto redaktorius" + LABEL_EDITOR_HTML: "Html" + LABEL_EDITOR_PLAIN: "Paprastas" + LABEL_EDITOR_HTML_FORCED: "Html (priverstinis)" + LABEL_EDITOR_PLAIN_FORCED: "Paprastas (priverstinis)" + LABEL_ANIMATION: "Sąsajos animacija" + LABEL_ANIMATION_FULL: "Pilnai" + LABEL_ANIMATION_NORMAL: "Normaliai" + LABEL_ANIMATION_NONE: "Be animacijos" + LABEL_VIEW_OPTIONS: "Peržiūros parinktys" + LABEL_USE_PREVIEW_PANE: "Naudokite peržiūros sritį" + LABEL_USE_CHECKBOXES_IN_LIST: "Rodyti žymėjimo langelius sąraše" + LABEL_USE_THREADS: "Naudoti gijas" + LABEL_REPLY_SAME_FOLDER: "Atsakymus dėti į katalogą, kuriame yra pradinė žinutė" + LABEL_SHOW_IMAGES: "Visada rodyti išorinius vaizdus žinutėse" + LABEL_SHOW_ANIMATION: "Rodyti animaciją" + LABEL_MESSAGE_PER_PAGE: "Žinučių lape" + LABEL_NOTIFICATIONS: "Pranešimai" + LABEL_SOUND_NOTIFICATION: "Garsinis pranešimas" + LABEL_CHROME_NOTIFICATION_DESC: "Rodyti iššokančius pranešimus apie naujas žinutes" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Blokuoja naršyklė)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Kontaktai" + LABEL_CONTACTS_AUTOSAVE: "Automatiškai pridėti gavėjus į adresų knygą" + LEGEND_CONTACTS_SYNC: "Nuotolinis sinchronizavimas (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Įjungti nuotolinį sinchronizavimą" + LABEL_CONTACTS_SYNC_SERVER: "Serveris" + LABEL_CONTACTS_SYNC_AB_URL: "Adresų knygos URL adresas" + LABEL_CONTACTS_SYNC_USER: "Vartotojas" + LABEL_CONTACTS_SYNC_PASSWORD: "Slaptažodis" + SETTINGS_THEMES: + LEGEND_THEMES: "Temos" + LEGEND_THEMES_CUSTOM: "Individualizuotos temos konfigūravimas" + LABEL_CUSTOM_TYPE: "Tipas" + LABEL_CUSTOM_TYPE_LIGHT: "Šviesi" + LABEL_CUSTOM_TYPE_DARK: "Tamsi" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Fonas" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Įkelti fono paveiksliuką (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Per didelis failas" + ERROR_FILE_TYPE_ERROR: "Netinkamas failo tipas (tik JPG ir PNG)" + ERROR_UNKNOWN: "Nežinoma klaida įkeliant failą" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Prijungti Google" + BUTTON_GOOGLE_DISCONNECT: "Atjungti Google" + MAIN_GOOGLE_DESC: "Įjungus Google autentikaciją,galėsite prisijungti prie šios paskyros naudodami Google mygtuką prisijungimo ekrane." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Prijungti Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Atjungti Facebook" + MAIN_FACEBOOK_DESC: "Įjungus Facebook autentikaciją,galėsite prisijungti prie šios paskyros naudodami Facebook mygtuką prisijungimo ekrane." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Prijungti Twitter" + BUTTON_TWITTER_DISCONNECT: "Atjungti Twitter" + MAIN_TWITTER_DESC: "Įjungus Twitter autentikaciją,galėsite prisijungti prie šios paskyros naudodami Twitter mygtuką prisijungimo ekrane." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Katalogų sąrašas" + BUTTON_CREATE: "Sukurti katalogą" + BUTTON_SYSTEM: "Sisteminiai katalogai" + BUTTON_DELETE: "Pašalinti" + BUTTON_SUBSCRIBE: "Prenumeruoti" + BUTTON_UNSUBSCRIBE: "Atsisakyti prenumeratos" + LOADING_PROCESS: "Atnaujinamas katalogų sąrašas" + CREATING_PROCESS: "Kuriamas katalogas" + DELETING_PROCESS: "Šalinamas katalogas" + RENAMING_PROCESS: "Pervardinamas katalogas" + DELETING_ASK: "Ar Jūs įsitikinę?" + TO_MANY_FOLDERS_DESC_1: "Pas jus per daug katalogų!" + TO_MANY_FOLDERS_DESC_2: "Mes rodome ne visus juos, kad išvengti našumo problemų." + HELP_DELETE_FOLDER: "Naikinti katalogą" + HELP_SHOW_HIDE_FOLDER: "Rodyti/Slėpti katalogą" + HELP_CHECK_FOR_NEW_MESSAGES: "Tikrinti/Netikrinti ar yra naujų laiškų" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Paskyrų sąrašas" + LEGEND_IDENTITIES: "Tapatybės" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Paskyros ir tapatybės" + BUTTON_ADD_ACCOUNT: "Pridėti paskyrą" + BUTTON_ADD_IDENTITY: "Pridėti tapatybę" + BUTTON_DELETE: "Šalinti" + LOADING_PROCESS: "Atnaujinamas paskyrų sąrašas" + DELETING_ASK: "Ar Jūs įsitikinę?" + DEFAULT_IDENTITY_LABEL: "numatytasis" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Tapatybės" + LEGEND_IDENTITIES: "Papildomos tapatybės" + LABEL_DEFAULT: "Numatytoji" + LABEL_DISPLAY_NAME: "Vardas" + LABEL_REPLY_TO: "Atsakyti" + LABEL_SIGNATURE: "Parašas" + LABEL_ADD_SIGNATURE_TO_ALL: "Pridėti parašą visiems rašomiems laiškams" + BUTTON_ADD_IDENTITY: "Sukurti tapatybę" + BUTTON_DELETE: "Šalinti" + LOADING_PROCESS: "Atnaujinamas tapatybių sąrašas" + DELETING_ASK: "Ar Jūs įsitikinę?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Keisti slaptažodį" + LABEL_CURRENT_PASSWORD: "Dabartinis slaptažodis" + LABEL_NEW_PASSWORD: "Naujas slaptažodis" + LABEL_REPEAT_PASSWORD: "Patvirtinkite naują slaptažodį" + BUTTON_UPDATE_PASSWORD: "Nustatyti naują slaptažodį" + ERROR_PASSWORD_MISMATCH: "Slaptažodžiai nesutampa, bandykite dar kartą" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Importuoti OpenPGP raktą" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Sukurti OpenPGP raktus" + TITLE_PRIVATE: "Privatus" + TITLE_PUBLIC: "Viešas" + DELETING_ASK: "Jūs įsitikinę?" + GENERATE_ONLY_HTTPS: "HTTPS only" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Sparčiųjų klavišų pagalba" + TAB_MAILBOX: "Pašto dėžutė" + TAB_MESSAGE_LIST: "Laiškų sąrašas" + TAB_MESSAGE_VIEW: "laiško peržiūra" + TAB_COMPOSE: "Sukurti" + LABEL_OPEN_USER_DROPDOWN: "Išskleisti vartotojo meniu" + LABEL_REPLY: "Atsakyti" + LABEL_REPLY_ALL: "Atsakyti visiems" + LABEL_FORWARD: "Persiųsti" + LABEL_FORWARD_MULTIPLY: "Persiųsti kaip prisegtuką" + LABEL_HELP: "Pagalba" + LABEL_CHECK_ALL: "Žymėti visus laiškus" + LABEL_ARCHIVE: "Archyvuoti" + LABEL_DELETE: "Šalinti" + LABEL_OPEN_THREAD: "Atidaryti pasirinktą giją" + LABEL_MOVE: "Perkelti" + LABEL_READ: "Pasirinktus žymėti kaip skaitytus" + LABEL_UNREAD: "Pasirinktus žymėti kaip neskaitytus" + LABEL_IMPORTANT: "Svarbūs, žvaigždute pažymėti laiškai" + LABEL_SEARCH: "Ieškoti" + LABEL_CANCEL_SEARCH: "Atšaukti paiešką" + LABEL_FULLSCREEN_ENTER: "Visas ekranas (Peržiūros lauko išdėstymas)" + LABEL_VIEW_MESSAGE_ENTER: "Žiūrėti laišką (Be peržiūros lauko)" + LABEL_SWITCH_TO_MESSAGE: "Perjungti į pasirinktą laišką" + LABEL_SWITCH_TO_FOLDER_LIST: "Perjungti į laiškų sąrašą" + LABEL_FULLSCREEN_TOGGLE: "Perjungti viso ekrano režimą" + LABEL_BLOCKQUOTES_TOGGLE: "Pereiti į citatą" + LABEL_THREAD_NEXT: "Kita šios gijos žinutė" + LABEL_THREAD_PREV: "Ankstesnė šios gijos žinutė" + LABEL_PRINT: "Spausdinti" + LABEL_EXIT_FULLSCREEN: "Išeiti iš viso ekrano režimo" + LABEL_CLOSE_MESSAGE: "Uždaryti laišką (Be peržiūros lauko)" + LABEL_SWITCH_TO_LIST: "Perjungti atgal į laiškų sąrašą" + LABEL_OPEN_COMPOSE_POPUP: "Sukurti naują laišką atskirame lange" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Atidaryti tapatybių sąrašą" + LABEL_SAVE_MESSAGE: "Išsaugoti laišką" + LABEL_SEND_MESSAGE: "Siųsti laišką" + LABEL_CLOSE_COMPOSE: "Uždaryti laišką" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "Viešų raktų nerasta" + NO_PUBLIC_KEYS_FOUND_FOR: "Viešų raktų nerasta \"%EMAIL%\" laiškui" + NO_PRIVATE_KEY_FOUND: "Privačių raktų nerasta" + NO_PRIVATE_KEY_FOUND_FOR: "Privačių raktų nerasta \"%EMAIL%\" laiškui" + ADD_A_PUBLICK_KEY: "Add a public key" + SELECT_A_PRIVATE_KEY: "Parinkti privatų raktą" + UNVERIFIRED_SIGNATURE: "Nepatikrintas parašas" + DECRYPTION_ERROR: "OpenPGP dekodavimo klaida" + GOOD_SIGNATURE: "Tinkamas parašas nuo %USER%" + PGP_ERROR: "OpenPGP klaida: %ERROR%" + SPECIFY_FROM_EMAIL: "Prašome nurodyti NUO e-pašto adresą" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Nurodykite bent vieną gavėją" + NOTIFICATIONS: + INVALID_TOKEN: "Neteisingas raktas" + AUTH_ERROR: "Autorizacija nepavyko" + ACCESS_ERROR: "Prieigos klaida" + CONNECTION_ERROR: "Nepavyskta prisijungti prie serverio" + CAPTCHA_ERROR: "Neteisingas CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- + Šis socialinis ID nepriskirtas jokiai e-pašto paskyrai. Prisijunkite naudojant + elektroninio pašto rekvizitus ir įjunkite šią funkciją paskyros nustatymuose. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- + Šis socialinis ID nepriskirtas jokiai e-pašto paskyrai. Prisijunkite naudojant + elektroninio pašto rekvizitus ir įjunkite šią funkciją paskyros nustatymuose. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- + Šis socialinis ID nepriskirtas jokiai e-pašto paskyrai. Prisijunkite naudojant + elektroninio pašto rekvizitus ir įjunkite šią funkciją paskyros nustatymuose. + DOMAIN_NOT_ALLOWED: "Šis subdomenas neleidžiamas" + ACCOUNT_NOT_ALLOWED: "Paskyra neleidžiama" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Būtinas dviejų veiksnių patikrinimas" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "dviejų veiksnių patikrinimo klaida" + COULD_NOT_SAVE_NEW_PASSWORD: "Negaliu išsaugoti slaptažodžio" + CURRENT_PASSWORD_INCORRECT: "Dabartinis slaptažodis netinkamas" + NEW_PASSWORD_SHORT: "Slaptažodis per trumpas" + NEW_PASSWORD_WEAK: "Slaptažodis per lengvas" + NEW_PASSWORD_FORBIDDENT: "Slaptažodyte bandote naudoti neleistinus simbolius" + CONTACTS_SYNC_ERROR: "Kontaktų sinchronizavimo klaida" + CANT_GET_MESSAGE_LIST: "Nepavyksta gauti laiškų sąrašo" + CANT_GET_MESSAGE: "Nepavyksta gauti laiško" + CANT_DELETE_MESSAGE: "Nepavyko pašalinti laiško" + CANT_MOVE_MESSAGE: "Nepavyko perkelti laiško" + CANT_SAVE_MESSAGE: "Nepavyko išsaugoti laiško" + CANT_SEND_MESSAGE: "Nepavyko išsiųsti laiško" + INVALID_RECIPIENTS: "Netinkamas gavėjas" + CANT_SAVE_FILTERS: "Nepavyko išsaugoti filtrų" + CANT_GET_FILTERS: "Nepavyko gauti filtrų" + FILTERS_ARE_NOT_CORRECT: "Filtrai neteisingi" + CANT_CREATE_FOLDER: "Nepavyksta sukurti katalogo" + CANT_RENAME_FOLDER: "Nepavyksta pervadinti katalogo" + CANT_DELETE_FOLDER: "Nepavyksta pašalinti katalogo" + CANT_DELETE_NON_EMPTY_FOLDER: "Negalima pašalinti ne tuščio katalogo" + CANT_SUBSCRIBE_FOLDER: "Nepavyskta užprenumeruoti katalogo" + CANT_UNSUBSCRIBE_FOLDER: "Nepavyksta nutraukti katalogo prenumeratos" + CANT_SAVE_SETTINGS: "Nepavyksta išsaugoti nustatymų" + CANT_SAVE_PLUGIN_SETTINGS: "Nepavyksta išsaugoti nustatymų" + DOMAIN_ALREADY_EXISTS: "Subdomenas jau egzistuoja" + CANT_INSTALL_PACKAGE: "Nepavyksta instaliuoti paketo" + CANT_DELETE_PACKAGE: "Nepavyksta pašalinti paketo" + INVALID_PLUGIN_PACKAGE: "Netinkamas įskiepio paketas" + UNSUPPORTED_PLUGIN_PACKAGE: "Nepalaikomas įskiepio paketas" + LICENSING_SERVER_IS_UNAVAILABLE: "Prenumeratos serveris nepasiekimas" + LICENSING_DOMAIN_EXPIRED: "Šio subdomeno prenumeratos laikas baigėsi." + LICENSING_DOMAIN_BANNED: "Šio subdomeno prenumerata uždrausta." + DEMO_SEND_MESSAGE_ERROR: "Saugumo sumetimais, ši demo paskyra neleidžia siųsti laiškų išoriniais e-pašto adresais!" + DEMO_ACCOUNT_ERROR: "Saugumo sumetimais, su šia paskyra negalima atlikti norimo veiksmo!" + ACCOUNT_ALREADY_EXISTS: "Paskyra jau egzistuoja" + ACCOUNT_DOES_NOT_EXIST: "Nėra tokios paskyros" + MAIL_SERVER_ERROR: "Klaida bandant pasiekti pašto serverį" + INVALID_INPUT_ARGUMENT: "Neteisingas įvesties argumentas" + UNKNOWN_ERROR: "Nežinoma klaida" + STATIC: + BACK_LINK: "Perkrauti" + DOMAIN_LIST_DESC: "Leidžiamų naudoti subdomenų sąrašas." + PHP_EXSTENSIONS_ERROR_DESC: "Trūksta būtinų PHP plėtinių!" + PHP_VERSION_ERROR_DESC: "Jūsų PHP versija (%VERSION%) žemesnė, nei reikalaujama 5.3.0!" + NO_SCRIPT_TITLE: "Šiai aplikacijai reikalinga JavaScript." + NO_SCRIPT_DESC: | + JavaScript nepalaikoma Jūsų naršyklėje. + Įjunkite JavaScript palaikymą naršyklėje ir bandykite vėl. + NO_COOKIE_TITLE: "Slapukų palaikymas būtinas šiai aplikacijai." + NO_COOKIE_DESC: | + Slapukų palaikymas negalimas jūsų naršyklėje. + Įjunkite slapukų palaikymą naršyklėje ir bandykite vėl. + BAD_BROWSER_TITLE: "Jūsų naršyklė pasenusi." + BAD_BROWSER_DESC: | + Norint naudotis visais šios aplikacijos privalumais, + parsisiųskite ir įsidiekite vieną iš šių naršyklių: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/lv_LV.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/lv_LV.yml new file mode 100755 index 00000000..3a9d0398 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/lv_LV.yml @@ -0,0 +1,709 @@ +lv_LV: + LOGIN: + LABEL_EMAIL: "E-pasts" + LABEL_LOGIN: "Ielogoties" + LABEL_PASSWORD: "Parole" + LABEL_SIGN_ME: "Atcerēties mani" + LABEL_VERIFICATION_CODE: "Autentifikācijas kods" + LABEL_DONT_ASK_VERIFICATION_CODE: "Don't ask for the code for 2 weeks" + BUTTON_SIGN_IN: "Ielogoties" + TITLE_SIGN_IN_GOOGLE: "Ielogoties izmantojot Google" + TITLE_SIGN_IN_FACEBOOK: "Ielogoties izmantojot Facebook" + TITLE_SIGN_IN_TWITTER: "Ielogoties izmantojot Twitter" + LABEL_FORGOT_PASSWORD: "Forgot password" + LABEL_REGISTRATION: "Registration" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Pievienot kontu" + BUTTON_SETTINGS: "Uzstādijumi" + BUTTON_HELP: "Palīdzība" + BUTTON_LOGOUT: "Izlogoties" + MOBILE: + BUTTON_MOBILE_VERSION: "Mobilā versija" + BUTTON_DESKTOP_VERSION: "Darba virsmas versija" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Meklēt" + TITLE_ADV: "Papildus meklēšana" + LABEL_ADV_FROM: "No" + LABEL_ADV_TO: "Kam" + LABEL_ADV_SUBJECT: "Tēma" + LABEL_ADV_TEXT: "Teksts" + LABEL_ADV_HAS_ATTACHMENT: "Ir pielikums" + LABEL_ADV_HAS_ATTACHMENTS: "Ir pielikumi" + LABEL_ADV_FLAGGED: "Atzīmētie" + LABEL_ADV_UNSEEN: "Unseen" + LABEL_ADV_DATE: "Datums" + LABEL_ADV_DATE_ALL: "Viss periods" + LABEL_ADV_DATE_3_DAYS: "Līdz 3 dienas vecs" + LABEL_ADV_DATE_7_DAYS: "Līdz 1 nedēļu vecs" + LABEL_ADV_DATE_MONTH: "Līdz 1 mēnesi vecs" + LABEL_ADV_DATE_3_MONTHS: "Līdz 3 mēnešus vecs" + LABEL_ADV_DATE_6_MONTHS: "Līdz 6 mēnešus vecs" + LABEL_ADV_DATE_YEAR: "Līdz 1 gadu vecs" + BUTTON_ADV_SEARCH: "Meklēt" + PREVIEW_POPUP: + FULLSCREEN: "Toggle fullscreen" + ZOOM: "Zoom in/out" + CLOSE: "Aizvērt (Esc)" + LOADING: "Lādējas..." + GALLERY_PREV: "Iepriekšejā (Kreisā būltiņa)" + GALLERY_NEXT: "Nākamā (Labā būltiņa)" + GALLERY_COUNTER: "%curr% no %total%" + IMAGE_ERROR: "Attēlu nevar ielādēt." + AJAX_ERROR: "Saturunevar ielādēt." + FOLDER_LIST: + BUTTON_COMPOSE: "Rakstīt" + BUTTON_CONTACTS: "Kontakti" + BUTTON_NEW_MESSAGE: "Jauns ziņojums" + INBOX_NAME: "Iesūtne" + SENT_NAME: "Nosūtītie" + DRAFTS_NAME: "Melnraksti" + SPAM_NAME: "Spams" + TRASH_NAME: "Miskaste" + ARCHIVE_NAME: "Arhīvs" + QUOTA: + TITLE: "Kvotas izmantojums" + MESSAGE_LIST: + BUTTON_RELOAD: "Pārlādēt ziņojumu sarakstu" + BUTTON_MOVE_TO: "Pārvietot uz" + BUTTON_DELETE: "Dzēst" + BUTTON_ARCHIVE: "Archive" + BUTTON_SPAM: "Spams" + BUTTON_NOT_SPAM: "Not Spam" + BUTTON_EMPTY_FOLDER: "Iztīrīt mapi" + BUTTON_MULTY_FORWARD: "Pārsūtīt ziņojumus" + BUTTON_DELETE_WITHOUT_MOVE: "Dzēst pavisam" + BUTTON_MORE: "Vairāk" + MENU_SET_SEEN: "Atzīmēt kā izlasītu" + MENU_SET_ALL_SEEN: "Atzīmēt visu kā izlasītu" + MENU_UNSET_SEEN: "Atzīmēt kā neizlasītu" + MENU_SET_FLAG: "Atzīmēt" + MENU_UNSET_FLAG: "Noņemt atzīmi" + MENU_SELECT_ALL: "Viss" + MENU_SELECT_NONE: "Neviens" + MENU_SELECT_INVERT: "Pretēji" + MENU_SELECT_UNSEEN: "Neizlasīts" + MENU_SELECT_SEEN: "Izlasīts" + MENU_SELECT_FLAGGED: "Atzīmētie" + MENU_SELECT_UNFLAGGED: "Noņemtās atzīmes" + EMPTY_LIST: "Tukšs saraksts." + EMPTY_SEARCH_LIST: "Neviens ziņojums neatbilda jūsu meklētajiem kritērijiem." + SEARCH_RESULT_FOR: "Meklēšanas rezultāti: \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "back to message list" + LIST_LOADING: "Lādējas" + EMPTY_SUBJECT_TEXT: "(Nav virsraksta)" + PUT_MESSAGE_HERE: "Ievelciet ziņojumus šeit lai tos apskatītu." + TODAY_AT: "šodien %TIME%" + YESTERDAY_AT: "vakardien %TIME%" + SEARCH_PLACEHOLDER: "Meklēt" + NEW_MESSAGE_NOTIFICATION: "Jums ir %COUNT% jaunas ziņas!" + QUOTA_SIZE: "Izmantots %SIZE% (%PROC%%) no %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Labot" + BUTTON_BACK: "Atpakaļ" + BUTTON_CLOSE: "Aizvērt" + BUTTON_DELETE: "Dzēst" + BUTTON_UNSUBSCRIBE: "Atrakstīties no saraksta" + BUTTON_ARCHIVE: "Archive" + BUTTON_SPAM: "Spams" + BUTTON_NOT_SPAM: "Not Spam" + BUTTON_MOVE_TO: "Pārvietot uz" + BUTTON_MORE: "Vairāk" + BUTTON_REPLY: "Atbildēt" + BUTTON_REPLY_ALL: "Atbildēt visiem" + BUTTON_FORWARD: "Pārsūtīt" + BUTTON_FORWARD_AS_ATTACHMENT: "Pārsūtīt kā pielikumu" + BUTTON_EDIT_AS_NEW: "Edit as New" + BUTTON_SHOW_IMAGES: "Rādīt attēlus" + BUTTON_NOTIFY_READ_RECEIPT: "The sender has asked to be notified when you read this message." + BUTTON_IN_NEW_WINDOW: "Skatīt jaunā logā" + BUTTON_THREAD_LIST: "Thread list" + BUTTON_THREAD_PREV: "Previous" + BUTTON_THREAD_NEXT: "Next" + BUTTON_THREAD_MORE: "More messages" + MENU_HEADERS: "Rādīt ziņojuma galveni" + MENU_VIEW_ORIGINAL: "Rādīt orģinālu" + MENU_DOWNLOAD_ORIGINAL: "Lejuplādēt kā .eml failu" + MENU_FILTER_SIMILAR: "Atfiltrēt šādus ziņojumus" + MENU_PRINT: "Printēt" + EMPTY_SUBJECT_TEXT: "(Nav tēmas)" + LABEL_SUBJECT: "Tēma" + LABEL_DATE: "Datums" + LABEL_FROM: "No" + LABEL_FROM_SHORT: "no" + LABEL_TO: "Kam" + LABEL_TO_SHORT: "kam" + LABEL_CC: "CC" + LABEL_BCC: "BCC" + LABEL_REPLY_TO: "Reply-To" + PRINT_LABEL_FROM: "No" + PRINT_LABEL_TO: "Kam" + PRINT_LABEL_CC: "CC" + PRINT_LABEL_BCC: "BCC" + PRINT_LABEL_REPLY_TO: "Reply-To" + PRINT_LABEL_DATE: "Datums" + PRINT_LABEL_SUBJECT: "Tēma" + PRINT_LABEL_ATTACHMENTS: "Pielikumi" + MESSAGE_LOADING: "Lādējās" + MESSAGE_VIEW_DESC: "Izvēlaties ziņojumu no saraksta lai to apskatītu." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" + LINK_DOWNLOAD_AS_ZIP: "Download as zip" + LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" + LINK_SAVE_TO_DROPBOX: "Save to Dropbox" + READ_RECEIPT: + SUBJECT: "Return Receipt (displayed) - %SUBJECT%" + BODY: | + This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. + + Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. + There is no guarantee that the recipient has read or understood the message contents. + SUGGESTIONS: + SEARCHING_DESC: "Meklē..." + CONTACTS: + LEGEND_CONTACTS: "Kontakti" + SEARCH_INPUT_PLACEHOLDER: "Meklēt" + BUTTON_ADD_CONTACT: "Pievienot kontaktu" + BUTTON_CREATE_CONTACT: "Izveidot" + BUTTON_UPDATE_CONTACT: "Atjaunot" + BUTTON_IMPORT: "Import (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" + BUTTON_EXPORT_CSV: "Export (csv)" + ERROR_IMPORT_FILE: "Import error (invalid file format)" + LIST_LOADING: "Lādējās" + EMPTY_LIST: "Nav kontaktu" + EMPTY_SEARCH: "Kontakti nav atrasti" + CLEAR_SEARCH: "Nodzēt meklēšanu" + CONTACT_VIEW_DESC: "Izvēlaties kontaktu no saraksta lai to apskatītu." + LABEL_DISPLAY_NAME: "Display name" + LABEL_EMAIL: "Email" + LABEL_PHONE: "Phone" + LABEL_WEB: "Web" + LABEL_BIRTHDAY: "Birthday" + LINK_ADD_EMAIL: "Add an email address" + LINK_ADD_PHONE: "Add a phone" + LINK_BIRTHDAY: "Birthday" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Enter display name" + PLACEHOLDER_ENTER_LAST_NAME: "Enter last name" + PLACEHOLDER_ENTER_FIRST_NAME: "Enter first name" + PLACEHOLDER_ENTER_NICK_NAME: "Enter nickname" + LABEL_READ_ONLY: "Read only" + LABEL_SHARE: "Share" + ADD_MENU_LABEL: "Add" + ADD_MENU_NICKNAME: "Nickname" + ADD_MENU_NOTES: "Notes" + ADD_MENU_EMAIL: "Email" + ADD_MENU_PHONE: "Phone" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Address" + ADD_MENU_BIRTHDAY: "Birthday" + ADD_MENU_TAGS: "Tags" + BUTTON_SHARE_NONE: "None" + BUTTON_SHARE_ALL: "Everyone" + BUTTON_SYNC: "Synchronization (CardDAV)" + COMPOSE: + TITLE_FROM: "No" + TITLE_TO: "Kam" + TITLE_CC: "CC" + TITLE_BCC: "BCC" + TITLE_REPLY_TO: "Reply To" + TITLE_SUBJECT: "Tēma" + LINK_SHOW_INPUTS: "rādīt visus laukus" + BUTTON_SEND: "Sūtīt" + BUTTON_SAVE: "Saglabāt" + BUTTON_DELETE: "Dzēst" + BUTTON_CANCEL: "Atcelt" + BUTTON_MINIMIZE: "Minimize" + SAVED_TIME: "Saglabāts %TIME%" + SAVED_ERROR_ON_SEND: "Ziņojums nosūtīts, bet tas nav saglabāts izsūtnē." + DISCARD_UNSAVED_DATA: "Discard unsaved data?" + ATTACH_FILES: "Pievienot failus" + ATTACH_DROP_FILES_DESC: "Iemet failus šeit" + ATTACH_ITEM_CANCEL: "Atcelt" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% rakstija" + FORWARD_MESSAGE_TOP_TITLE: "-------- Forwarded message -------" + FORWARD_MESSAGE_TOP_FROM: "No" + FORWARD_MESSAGE_TOP_TO: "Kam" + FORWARD_MESSAGE_TOP_CC: "CC" + FORWARD_MESSAGE_TOP_SENT: "Nosūtīts" + FORWARD_MESSAGE_TOP_SUBJECT: "Tēma" + EMPTY_TO_ERROR_DESC: "Pievienojat vismaz vienu saņēmēju" + NO_ATTACHMENTS_HERE_DESC: "No attachments here." + ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet" + BUTTON_REQUEST_READ_RECEIPT: "Request a read receipt" + BUTTON_MARK_AS_IMPORTANT: "Mark as important" + BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" + BUTTON_REQUEST_DSN: "Request a delivery receipt" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Close" + POPUPS_ASK: + BUTTON_YES: "Jā" + BUTTON_NO: "Nē" + DESC_WANT_CLOSE_THIS_WINDOW: "Are you sure you want to close this window?" + DESC_WANT_DELETE_MESSAGES: "Are you sure you want to delete the message(s)?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Choose your language" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Pievienot kontu?" + BUTTON_ADD_ACCOUNT: "Pievienot" + TITLE_UPDATE_ACCOUNT: "Update Account?" + BUTTON_UPDATE_ACCOUNT: "Update" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Add Identity?" + TITLE_UPDATE_IDENTITY: "Update Identity?" + BUTTON_ADD_IDENTITY: "Add" + BUTTON_UPDATE_IDENTITY: "Update" + LABEL_EMAIL: "Email" + LABEL_NAME: "Name" + LABEL_REPLY_TO: "Reply To" + LABEL_SIGNATURE: "Signature" + LABEL_CC: "Cc" + LABEL_BCC: "Bcc" + LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Izveidot mapi?" + LABEL_NAME: "Mapes nosaukums" + LABEL_PARENT: "Zem kuras mapes" + BUTTON_CREATE: "Izveidot" + BUTTON_CANCEL: "Atcelt" + BUTTON_CLOSE: "Aizvērt" + TITLE_CREATING_PROCESS: "Izveidot mapi" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Iztīrīt visus ziņojumus no šis mapes?" + BUTTON_CLEAR: "Notīrīt" + BUTTON_CANCEL: "Atcelt" + BUTTON_CLOSE: "Aizvērt" + DANGER_DESC_WARNING: "Brīdinājums!" + DANGER_DESC_HTML_1: "Šī darbība izdzēsīs visus ziņojumus no %FOLDER% mapes pavisam." + DANGER_DESC_HTML_2: "Šo procesu nevarēs apturēt." + TITLE_CLEARING_PROCESS: "Mape tiek iztīrīta..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Import OpenPGP key" + BUTTON_IMPORT_OPEN_PGP_KEY: "Import" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "View OpenPGP key" + BUTTON_SELECT: "Select" + BUTTON_CLOSE: "Close" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP keys" + LABEL_EMAIL: "Email" + LABEL_NAME: "Name" + LABEL_PASSWORD: "Password" + LABEL_KEY_BIT_LENGTH: "Key length" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" + LABEL_SIGN: "Sign" + LABEL_ENCRYPT: "Encrypt" + LABEL_PASSWORD: "Password" + BUTTON_SIGN: "Sign" + BUTTON_ENCRYPT: "Encrypt" + BUTTON_SIGN_AND_ENCRYPT: "Sign and encrypt" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" + LABEL_KEY: "Private Key" + LABEL_PASSWORD: "Password" + BUTTON_DECRYPT: "Decrypt" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "2-Step verification test" + LABEL_CODE: "Code" + BUTTON_TEST: "Test" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Create a filter?" + TITLE_EDIT_FILTER: "Update filter?" + FILTER_NAME: "Name" + LEGEND_CONDITIONS: "Conditions" + LEGEND_ACTIONS: "Actions" + BUTTON_DONE: "Done" + BUTTON_ADD_CONDITION: "Add a Condition" + SELECT_ACTION_NONE: "None" + SELECT_ACTION_MOVE_TO: "Move to" + SELECT_ACTION_FORWARD_TO: "Forward to" + SELECT_ACTION_REJECT: "Reject" + SELECT_ACTION_VACATION_MESSAGE: "Vacation message" + SELECT_ACTION_DISCARD: "Discard" + SELECT_FIELD_FROM: "From" + SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" + SELECT_FIELD_SUBJECT: "Subject" + SELECT_FIELD_HEADER: "Header" + SELECT_FIELD_SIZE: "Size" + SELECT_TYPE_CONTAINS: "Contains" + SELECT_TYPE_NOT_CONTAINS: "Not Contains" + SELECT_TYPE_MATCHES: "Matches (* and ? supported)" + SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" + SELECT_TYPE_REGEXP: "Regexp" + SELECT_TYPE_NOT_REGEXP: "Not Regexp" + SELECT_TYPE_EQUAL_TO: "Equal To" + SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" + SELECT_TYPE_OVER: "Over" + SELECT_TYPE_UNDER: "Under" + SELECT_MATCH_ANY: "Matching any of the following rules" + SELECT_MATCH_ALL: "Matching all of the following rules" + MARK_AS_READ_LABEL: "Mark as read" + REPLY_INTERVAL_LABEL: "Reply interval (days)" + KEEP_LABEL: "Keep" + STOP_LABEL: "Don't stop processing rules" + EMAIL_LABEL: "Email" + VACATION_SUBJECT_LABEL: "Subject (optional)" + VACATION_MESSAGE_LABEL: "Message" + VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" + REJECT_MESSAGE_LABEL: "Reject message" + ALL_INCOMING_MESSAGES_DESC: "All incoming messages" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Izvēlaties sistēmas mapes" + SELECT_CHOOSE_ONE: "Izvēlaties vienu" + SELECT_UNUSE_NAME: "Nelietot" + LABEL_SENT: "Nosūtīts" + LABEL_DRAFTS: "Melnraksts" + LABEL_SPAM: "Spams" + LABEL_TRASH: "Miskaste" + LABEL_ARCHIVE: "Archive" + BUTTON_CANCEL: "Atcelt" + BUTTON_CLOSE: "Aizvērt" + NOTIFICATION_SENT: | + Tu neesi izvēlējies "Izsūtne" sistēmas mapi, kurā ziņojumi tiek ielikti pēc nosūtīšanas. + Ja nevēlie saglabāt nosūtīto ziņu, lūdzu izvēlies "Nelietot" opciju. + NOTIFICATION_DRAFTS: "Tu neesi izvēlējies \"Melnraksti\" sistemas mapi, kurā tiktu saglabāti ziņojumi, kamēr tie tiek rakstīti." + NOTIFICATION_SPAM: | + Tu neesi izvēlējies "Spams" sistēmas mapi, kurā tiks ievietoti spam ziņojumi. + Ja tu vēlies izdzēst ziņojumus pavisam, izvēlies "Neizmantot" opciju. + NOTIFICATION_TRASH: | + Tu neesi izvēlējies "Miskaste" sistēmas mapi. + Ja tu vēlies izdzēst ziņojumus pavisam, izvēlies "Neizmantot" opciju. + NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "2-Step Verification" + LABEL_ENABLE_TWO_FACTOR: "Enable 2-Step verification" + LABEL_TWO_FACTOR_USER: "User" + LABEL_TWO_FACTOR_STATUS: "Status" + LABEL_TWO_FACTOR_SECRET: "Secret" + LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" + BUTTON_CREATE: "Create New Secret" + BUTTON_ACTIVATE: "Activate" + BUTTON_CLEAR: "Clear" + BUTTON_LOGOUT: "Logout" + BUTTON_DONE: "Done" + BUTTON_TEST: "Test" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Show Secret" + BUTTON_HIDE_SECRET: "Hide Secret" + TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" + TWO_FACTOR_SECRET_DESC: >- + Import this info into your Google Authenticator client (or other TOTP client) + using the provided QR code below or by entering the code manually. + TWO_FACTOR_BACKUP_CODES_DESC: >- + If you can't receive codes via Google Authenticator, you can use backup codes + to sign in. After you’ve used a backup code to sign in, it will become inactive. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." + TITLES: + LOADING: "Lādējas" + LOGIN: "Ielogoties" + MAILBOX: "Pastkastīte" + SETTINGS: "Uzstādijumi" + COMPOSE: "Rakstīt" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Fails ir par lielu" + ERROR_FILE_PARTIALLY_UPLOADED: "Nezināmas kļūdas dēļ fails tika ielādēts daļēji" + ERROR_NO_FILE_UPLOADED: "Fails nav ielādēts" + ERROR_MISSING_TEMP_FOLDER: "Trūkst tmp mape" + ERROR_ON_SAVING_FILE: "Nezināma faila ielādes kļūda" + ERROR_FILE_TYPE: "Nepareizs faila tips" + ERROR_UNKNOWN: "Nezināma faila ielādes kļūda" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEKSTS" + TEXT_SWITCHER_RICH_FORMATTING: "Papildus teksta noformēums" + TEXT_SWITCHER_CONFIRM: "Bildes un teksta noformējums pazudīs. Vai tiešām turpināt?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Personīgie" + LABEL_GENERAL_NAME: "Vispārējie" + LABEL_CONTACTS_NAME: "Contacts" + LABEL_FOLDERS_NAME: "Mapes" + LABEL_ACCOUNTS_NAME: "Konti" + LABEL_IDENTITY_NAME: "Identity" + LABEL_IDENTITIES_NAME: "Identities" + LABEL_FILTERS_NAME: "Filters" + LABEL_TEMPLATES_NAME: "Templates" + LABEL_SECURITY_NAME: "Security" + LABEL_SOCIAL_NAME: "Sociālie" + LABEL_THEMES_NAME: "Tēmas" + LABEL_CHANGE_PASSWORD_NAME: "Parole" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Atpakaļ" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filters" + BUTTON_SAVE: "Save" + BUTTON_ADD_FILTER: "Add a Filter" + BUTTON_DELETE: "Delete" + BUTTON_RAW_SCRIPT: "Use Custom User Script" + SUBNAME_NONE: "None" + SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" + SUBNAME_REJECT: "Reject" + SUBNAME_VACATION_MESSAGE: "Vacation message" + SUBNAME_DISCARD: "Discard" + CAPABILITY_LABEL: "Capability" + LOADING_PROCESS: "Updating filter list" + DELETING_ASK: "Are you sure?" + CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identity" + LABEL_DISPLAY_NAME: "Vārds" + LABEL_REPLY_TO: "Atbildēt uz" + LABEL_SIGNATURE: "Paraksts" + LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Security" + LABEL_CONFIGURE_TWO_FACTOR: "Iestatīt 2 soļu autentifikāciju" + LABEL_AUTOLOGOUT: "Auto Logout" + AUTOLOGIN_NEVER_OPTION_NAME: "Never" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% Stunda(s)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Vispārējie" + LABEL_LANGUAGE: "Valoda" + LABEL_IDENTITY: "Identity" + LABEL_LAYOUT: "Layout" + LABEL_LAYOUT_NO_SPLIT: "No Split" + LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" + LABEL_EDITOR: "Galvenais teksta editors" + LABEL_EDITOR_HTML: "Html" + LABEL_EDITOR_PLAIN: "Teksts" + LABEL_EDITOR_HTML_FORCED: "Html (forced)" + LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" + LABEL_ANIMATION: "Interface animation" + LABEL_ANIMATION_FULL: "Full" + LABEL_ANIMATION_NORMAL: "Normal" + LABEL_ANIMATION_NONE: "None" + LABEL_VIEW_OPTIONS: "Apskates opcijas" + LABEL_USE_PREVIEW_PANE: "Lietot priekšskatu" + LABEL_USE_CHECKBOXES_IN_LIST: "Rādīt checkboxes sarakstā" + LABEL_USE_THREADS: "Lietot saraksti" + LABEL_REPLY_SAME_FOLDER: "Atbildes ziņojumus ielikt mapē kurā atrodas vēstule uz kuru tiek atbildēts." + LABEL_SHOW_IMAGES: "Vienmēr rādīt attēlus ziņojumos" + LABEL_SHOW_ANIMATION: "Rādīt animāciju" + LABEL_MESSAGE_PER_PAGE: "Ziņojumi lapā" + LABEL_NOTIFICATIONS: "Paziņojumi" + LABEL_SOUND_NOTIFICATION: "Sound notification" + LABEL_CHROME_NOTIFICATION_DESC: "Rādīt jaunus paziņojumus kā izlecošus logus" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Parlūkprogramma bloķēja)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Contacts" + LABEL_CONTACTS_AUTOSAVE: "Automatically add recipients to your address book" + LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" + LABEL_CONTACTS_SYNC_SERVER: "Server" + LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" + LABEL_CONTACTS_SYNC_USER: "User" + LABEL_CONTACTS_SYNC_PASSWORD: "Password" + SETTINGS_THEMES: + LEGEND_THEMES: "Tēmas" + LEGEND_THEMES_CUSTOM: "Tēmas konfigurācija" + LABEL_CUSTOM_TYPE: "Tips" + LABEL_CUSTOM_TYPE_LIGHT: "Gaišs" + LABEL_CUSTOM_TYPE_DARK: "Tumšs" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Fons" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Ielādēt fona attēlu (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Fails ir par lielu" + ERROR_FILE_TYPE_ERROR: "Nepareizs faila tips (Tikai JPG un PNG)" + ERROR_UNKNOWN: "Nezināma faila ielādes kļūda" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Connect Google" + BUTTON_GOOGLE_DISCONNECT: "Disconnect Google" + MAIN_GOOGLE_DESC: "Pēc ieslēgšanas ielogošanos caur Google, tu varēsi ielogoties izmantojot Google pogu." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Connect Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Disconnect Facebook" + MAIN_FACEBOOK_DESC: "Pēc ieslēgšanas ielogošanos caur Facebook, tu varēsi ielogoties izmantojot Facebook pogu." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Connect Twitter" + BUTTON_TWITTER_DISCONNECT: "Disconnect Twitter" + MAIN_TWITTER_DESC: "Pēc ieslēgšanas ielogošanos caur Twitter, tu varēsi ielogoties izmantojot Twitter pogu." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Mapes" + BUTTON_CREATE: "Izveidot mapi" + BUTTON_SYSTEM: "Sistēmas mapes" + BUTTON_DELETE: "Dzēst" + BUTTON_SUBSCRIBE: "Abonēt" + BUTTON_UNSUBSCRIBE: "Atcelt abonēšanu" + LOADING_PROCESS: "Atjauno mapju sarakstu" + CREATING_PROCESS: "Izveidot mapi" + DELETING_PROCESS: "Dzēst mapi" + RENAMING_PROCESS: "Pārsaukt mapi" + DELETING_ASK: "Tiešām?" + TO_MANY_FOLDERS_DESC_1: "You have too many folders!" + TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." + HELP_DELETE_FOLDER: "Delete folder" + HELP_SHOW_HIDE_FOLDER: "Show/hide folder" + HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Kontu saraksts" + LEGEND_IDENTITIES: "Identities" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" + BUTTON_ADD_ACCOUNT: "Pievienot kontu" + BUTTON_ADD_IDENTITY: "Add an Identity" + BUTTON_DELETE: "Dzēst" + LOADING_PROCESS: "Atjauno kontu sarakstu" + DELETING_ASK: "Tiešām?" + DEFAULT_IDENTITY_LABEL: "default" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identity" + LEGEND_IDENTITIES: "Additional Identities" + LABEL_DEFAULT: "Default" + LABEL_DISPLAY_NAME: "Vārds" + LABEL_REPLY_TO: "Atbildēt uz" + LABEL_SIGNATURE: "Paraksts" + LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" + BUTTON_ADD_IDENTITY: "Add Identity" + BUTTON_DELETE: "Delete" + LOADING_PROCESS: "Updating identity list" + DELETING_ASK: "Are you sure?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Mainīt paroli" + LABEL_CURRENT_PASSWORD: "Tagadējā parole" + LABEL_NEW_PASSWORD: "Jaunā parole" + LABEL_REPEAT_PASSWORD: "Jaunā parole vēlreiz" + BUTTON_UPDATE_PASSWORD: "Saglabāt paroli" + ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" + TITLE_PRIVATE: "Private" + TITLE_PUBLIC: "Public" + DELETING_ASK: "Are you sure?" + GENERATE_ONLY_HTTPS: "HTTPS only" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" + TAB_MAILBOX: "Mailbox" + TAB_MESSAGE_LIST: "Message list" + TAB_MESSAGE_VIEW: "Message view" + TAB_COMPOSE: "Compose" + LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" + LABEL_REPLY: "Reply" + LABEL_REPLY_ALL: "Reply All" + LABEL_FORWARD: "Forward" + LABEL_FORWARD_MULTIPLY: "Forward (multiply)" + LABEL_HELP: "Help" + LABEL_CHECK_ALL: "Select all messages" + LABEL_ARCHIVE: "Archive" + LABEL_DELETE: "Delete" + LABEL_OPEN_THREAD: "Open selected thread" + LABEL_MOVE: "Move" + LABEL_READ: "Read selected messages" + LABEL_UNREAD: "Unread selected messages" + LABEL_IMPORTANT: "Svarīgi, atzīmēt iezīmētos ziņojumus" + LABEL_SEARCH: "Search" + LABEL_CANCEL_SEARCH: "Cancel search" + LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" + LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" + LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" + LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" + LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" + LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" + LABEL_THREAD_NEXT: "Next message in thread" + LABEL_THREAD_PREV: "Previous message in thread" + LABEL_PRINT: "Print" + LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" + LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" + LABEL_SWITCH_TO_LIST: "Switch focus back to message list" + LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" + LABEL_SAVE_MESSAGE: "Save message" + LABEL_SEND_MESSAGE: "Send message" + LABEL_CLOSE_COMPOSE: "Close compose" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "No public keys found" + NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" + NO_PRIVATE_KEY_FOUND: "No private key found" + NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" + ADD_A_PUBLICK_KEY: "Add a public key" + SELECT_A_PRIVATE_KEY: "Izvēlies privāto atslēgu" + UNVERIFIRED_SIGNATURE: "Unverified signature" + DECRYPTION_ERROR: "OpenPGP decryption error" + GOOD_SIGNATURE: "Good signature from %USER%" + PGP_ERROR: "OpenPGP error: %ERROR%" + SPECIFY_FROM_EMAIL: "Please specify FROM email address" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" + NOTIFICATIONS: + INVALID_TOKEN: "Nepareizs tokens" + AUTH_ERROR: "Autorizācija neizdevās" + ACCESS_ERROR: "Piekļuves kļūda" + CONNECTION_ERROR: "Nevar savienoties ar serveri" + CAPTCHA_ERROR: "Nepareizs kods" + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- + Sociālā ID nav pievienot nevienam e-pastam. Ielogojaties ar e-pastu un ieslēdzat + šādu iespeju uzstādijumos. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- + Sociālā ID nav pievienot nevienam e-pastam. Ielogojaties ar e-pastu un ieslēdzat + šādu iespeju uzstādijumos. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- + Sociālā ID nav pievienot nevienam e-pastam. Ielogojaties ar e-pastu un ieslēdzat + šādu iespeju uzstādijumos. + DOMAIN_NOT_ALLOWED: "Šis domēns nav atļauts" + ACCOUNT_NOT_ALLOWED: "Account is not allowed" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" + COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" + CURRENT_PASSWORD_INCORRECT: "Current password incorrect" + NEW_PASSWORD_SHORT: "Password is too short" + NEW_PASSWORD_WEAK: "Password is too easy" + NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" + CONTACTS_SYNC_ERROR: "Contacts synchronization error" + CANT_GET_MESSAGE_LIST: "Nevar ielādēt ziņojumu sarakstu" + CANT_GET_MESSAGE: "Nevar ielādēt ziņojumu" + CANT_DELETE_MESSAGE: "Nevar izdzēst ziņojumu" + CANT_MOVE_MESSAGE: "Nevar pārvietot ziņojumu" + CANT_SAVE_MESSAGE: "Nevar saglabāt ziņojumu" + CANT_SEND_MESSAGE: "Nevar nosūtīt ziņojumu" + INVALID_RECIPIENTS: "Nepareizi saņēmēji" + CANT_SAVE_FILTERS: "Can't save filters" + CANT_GET_FILTERS: "Can't get filters" + FILTERS_ARE_NOT_CORRECT: "Filters are not correct" + CANT_CREATE_FOLDER: "Nevar izveidot mapi" + CANT_RENAME_FOLDER: "Nevar pārsaukt mapi" + CANT_DELETE_FOLDER: "Nevar izdzēst mapi" + CANT_DELETE_NON_EMPTY_FOLDER: "Nevar izdzēst pilnu mapi" + CANT_SUBSCRIBE_FOLDER: "Nevar pierakstīties mapei" + CANT_UNSUBSCRIBE_FOLDER: "Nevar atrakstīties mapei" + CANT_SAVE_SETTINGS: "Nevar saglabāt uzstādijumus" + CANT_SAVE_PLUGIN_SETTINGS: "Nevar saglabāt uzstādijumus" + DOMAIN_ALREADY_EXISTS: "Domeņes jau eksistē" + CANT_INSTALL_PACKAGE: "Neizdevās instālēt paku" + CANT_DELETE_PACKAGE: "Neizdevās nodzēst paku" + INVALID_PLUGIN_PACKAGE: "Nepareiza spraudņa paka" + UNSUPPORTED_PLUGIN_PACKAGE: "Neatbalstīta spraudņa paka" + LICENSING_SERVER_IS_UNAVAILABLE: "Abonēšanas serveris nav pieejams" + LICENSING_DOMAIN_EXPIRED: "Abonēšana šim domēnam ir beigusies." + LICENSING_DOMAIN_BANNED: "Abonēšana šim domēnam ir bloķēta." + DEMO_SEND_MESSAGE_ERROR: "Drošīnas iemeslu dēļ, demo konts nedrīks sūtīt e-pastu uz ārējiem e-pastiem!" + DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" + ACCOUNT_ALREADY_EXISTS: "Konts jau eksistē" + ACCOUNT_DOES_NOT_EXIST: "Konts neeksistē" + MAIL_SERVER_ERROR: "Radās kļūda savienojoties ar serveri" + INVALID_INPUT_ARGUMENT: "Invalid input argument" + UNKNOWN_ERROR: "Nezināma kļūda" + STATIC: + BACK_LINK: "Pārlādēt" + DOMAIN_LIST_DESC: "Saraksts ar atļautajiem domēniem" + PHP_EXSTENSIONS_ERROR_DESC: "Nepieciešamie PHP extension nav pieejami jūsu PHP konfigurācijā!" + PHP_VERSION_ERROR_DESC: "Jūsus PHP versija (%VERSION%) ir zemāka nekā atļauts 5.3.0!" + NO_SCRIPT_TITLE: "JavaScript ir nepieciešams." + NO_SCRIPT_DESC: | + Jūsu pārlūkprogramma neatbalsta JavaScript. + Lūdzu ieslēdziet JavaScript atbalstu. + NO_COOKIE_TITLE: "Cookies atbalsts ir nepieciešams." + NO_COOKIE_DESC: | + Cookies atbalsts nav pieejams šai pārlūkprogrammai. + Lūdzu ieslēdziet Cookies atbalstu. + BAD_BROWSER_TITLE: "Jūsu pārlūkprogramma ir novecojusi." + BAD_BROWSER_DESC: | + Lai izmantotu pilnas šis aplikācijas iespējas, + lejupielādējat un uzinstalējas kādu no šīm pārlukprogrammām: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/nb_NO.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/nb_NO.yml new file mode 100755 index 00000000..ea528954 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/nb_NO.yml @@ -0,0 +1,712 @@ +nb_NO: + LOGIN: + LABEL_EMAIL: "E-postadresse" + LABEL_LOGIN: "Logg inn" + LABEL_PASSWORD: "Passord" + LABEL_SIGN_ME: "Husk meg" + LABEL_VERIFICATION_CODE: "Bekreftelseskode" + LABEL_DONT_ASK_VERIFICATION_CODE: "Ikke be om kode før om to uker" + BUTTON_SIGN_IN: "Logg inn" + TITLE_SIGN_IN_GOOGLE: "Logg inn med Google" + TITLE_SIGN_IN_FACEBOOK: "Logg inn med Facebook" + TITLE_SIGN_IN_TWITTER: "Logg inn med Twitter" + LABEL_FORGOT_PASSWORD: "Glemt passord" + LABEL_REGISTRATION: "Registrering" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Legg til konto" + BUTTON_SETTINGS: "Innstillinger" + BUTTON_HELP: "Hjelp" + BUTTON_LOGOUT: "Logg ut" + MOBILE: + BUTTON_MOBILE_VERSION: "Mobilversjon" + BUTTON_DESKTOP_VERSION: "Skrivebordsversjon" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Søk" + TITLE_ADV: "Avansert søk" + LABEL_ADV_FROM: "Fra" + LABEL_ADV_TO: "Til" + LABEL_ADV_SUBJECT: "Emne" + LABEL_ADV_TEXT: "Tekst" + LABEL_ADV_HAS_ATTACHMENT: "Har vedlegg" + LABEL_ADV_HAS_ATTACHMENTS: "Har vedlegg" + LABEL_ADV_FLAGGED: "Stjernemerket" + LABEL_ADV_UNSEEN: "Ulest" + LABEL_ADV_DATE: "Dato" + LABEL_ADV_DATE_ALL: "Alle" + LABEL_ADV_DATE_3_DAYS: "Inntil 3 dager gamle" + LABEL_ADV_DATE_7_DAYS: "Inntil 1 uke gamle" + LABEL_ADV_DATE_MONTH: "Inntil 1 måned gamle" + LABEL_ADV_DATE_3_MONTHS: "Inntil 3 måneder gamle" + LABEL_ADV_DATE_6_MONTHS: "Inntil 6 måneder gamle" + LABEL_ADV_DATE_YEAR: "Inntil 1 år gamle" + BUTTON_ADV_SEARCH: "Søk" + PREVIEW_POPUP: + FULLSCREEN: "Toggle fullscreen" + ZOOM: "Zoom in/out" + CLOSE: "Lukk (Esc)" + LOADING: "Laster inn …" + GALLERY_PREV: "Forrige (venstre piltast)" + GALLERY_NEXT: "Neste (høyre piltast)" + GALLERY_COUNTER: "%curr% av %total%" + IMAGE_ERROR: "Klarte ikke å laste inn bilde." + AJAX_ERROR: "Klarte ikke å laste inn innhold." + FOLDER_LIST: + BUTTON_COMPOSE: "Skriv" + BUTTON_CONTACTS: "Kontakter" + BUTTON_NEW_MESSAGE: "Ny melding" + INBOX_NAME: "Innboks" + SENT_NAME: "Sendt" + DRAFTS_NAME: "Kladd" + SPAM_NAME: "Søppelpost" + TRASH_NAME: "Papirkurv" + ARCHIVE_NAME: "Arkiv" + QUOTA: + TITLE: "Kvote bruk" + MESSAGE_LIST: + BUTTON_RELOAD: "Hent nye meldinger" + BUTTON_MOVE_TO: "Flytt til" + BUTTON_DELETE: "Slett" + BUTTON_ARCHIVE: "Arkiv" + BUTTON_SPAM: "Søppelpost" + BUTTON_NOT_SPAM: "Ikke søppelpost" + BUTTON_EMPTY_FOLDER: "Tøm mappa for meldinger" + BUTTON_MULTY_FORWARD: "Videresend meldinger" + BUTTON_DELETE_WITHOUT_MOVE: "Slett permanent" + BUTTON_MORE: "Mer" + MENU_SET_SEEN: "Merk som lest" + MENU_SET_ALL_SEEN: "Merk alle som lest" + MENU_UNSET_SEEN: "Merk som ulest" + MENU_SET_FLAG: "Legg til stjerne" + MENU_UNSET_FLAG: "Fjern stjerne" + MENU_SELECT_ALL: "Alle" + MENU_SELECT_NONE: "Ingen" + MENU_SELECT_INVERT: "Inverter" + MENU_SELECT_UNSEEN: "Ulest" + MENU_SELECT_SEEN: "Lest" + MENU_SELECT_FLAGGED: "Stjernemerket" + MENU_SELECT_UNFLAGGED: "Ikke stjernemerket" + EMPTY_LIST: "Tom liste" + EMPTY_SEARCH_LIST: "Søket ga ingen treff." + SEARCH_RESULT_FOR: "Søketreff for «%SEARCH%»" + BACK_TO_MESSAGE_LIST: "tilbake til meldingsliste" + LIST_LOADING: "Laster inn" + EMPTY_SUBJECT_TEXT: "(uten emne)" + PUT_MESSAGE_HERE: "Dra en melding hit for å vise den i lista" + TODAY_AT: "i dag, %TIME%" + YESTERDAY_AT: "i går, %TIME%" + SEARCH_PLACEHOLDER: "Søk" + NEW_MESSAGE_NOTIFICATION: "Du har %count% nye meldinger" + QUOTA_SIZE: "Bruker %SIZE% ( %PROC%% ) av %LIMIT% " + MESSAGE: + BUTTON_EDIT: "Rediger" + BUTTON_BACK: "Tilbake" + BUTTON_CLOSE: "Lukk" + BUTTON_DELETE: "Slett" + BUTTON_UNSUBSCRIBE: "Meld av e-postliste" + BUTTON_ARCHIVE: "Arkiv" + BUTTON_SPAM: "Søppelpost" + BUTTON_NOT_SPAM: "Ikke søppelpost" + BUTTON_MOVE_TO: "Flytt til" + BUTTON_MORE: "Mer" + BUTTON_REPLY: "Svar" + BUTTON_REPLY_ALL: "Svar alle" + BUTTON_FORWARD: "Videresend" + BUTTON_FORWARD_AS_ATTACHMENT: "Videresend som vedlegg" + BUTTON_EDIT_AS_NEW: "Endre som ny" + BUTTON_SHOW_IMAGES: "Vis eksterne bilder" + BUTTON_NOTIFY_READ_RECEIPT: "Avsender har bedt om lesebekreftelse" + BUTTON_IN_NEW_WINDOW: "Vis i eget vindu" + BUTTON_THREAD_LIST: "Trådliste" + BUTTON_THREAD_PREV: "Forrige" + BUTTON_THREAD_NEXT: "Neste" + BUTTON_THREAD_MORE: "Flere meldinger" + MENU_HEADERS: "Vis meldingshoder" + MENU_VIEW_ORIGINAL: "Vis original" + MENU_DOWNLOAD_ORIGINAL: "Last ned som .eml-fil" + MENU_FILTER_SIMILAR: "Filtrer slike meldinger" + MENU_PRINT: "Skriv ut" + EMPTY_SUBJECT_TEXT: "(tomt emne)" + LABEL_SUBJECT: "Emne" + LABEL_DATE: "Dato" + LABEL_FROM: "Fra" + LABEL_FROM_SHORT: "fra" + LABEL_TO: "Til" + LABEL_TO_SHORT: "til" + LABEL_CC: "Kopi" + LABEL_BCC: "Blindkopi" + LABEL_REPLY_TO: "Svar til" + PRINT_LABEL_FROM: "Fra" + PRINT_LABEL_TO: "Til" + PRINT_LABEL_CC: "Kopi" + PRINT_LABEL_BCC: "Blindkopi" + PRINT_LABEL_REPLY_TO: "Svar til" + PRINT_LABEL_DATE: "Dato" + PRINT_LABEL_SUBJECT: "Emne" + PRINT_LABEL_ATTACHMENTS: "Vedlegg" + MESSAGE_LOADING: "Laster inn" + MESSAGE_VIEW_DESC: "Trykk på en melding for å lese den" + MESSAGE_VIEW_MOVE_DESC: "Trykk på mappenavn i panelet til venstre for å velge mål." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Passord" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP-signert melding (trykk for å bekrefte)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP-kryptert melding (trykk for å dekryptere)" + LINK_DOWNLOAD_AS_ZIP: "Last ned som zip-fil" + LINK_SAVE_TO_OWNCLOUD: "Lage i Owncloud" + LINK_SAVE_TO_CLOUD: "Lagre på nett" + LINK_SAVE_TO_DROPBOX: "Lagre i Dropbox" + READ_RECEIPT: + SUBJECT: "Lesebekreftelse (meldinga er lest) - %SUBJECT%" + BODY: | + Dette er en lesebekreftelse på e-postmeldinga du sendte til %READ-RECEIPT%. + + Merk: Denne bekreftelsen bekrefter bare at meldinga ble åpnet på mottakerens datamaskin, + og er ingen garanti for at mottakeren har lest, forstått eller er enig i innholdet. + SUGGESTIONS: + SEARCHING_DESC: "Søker …" + CONTACTS: + LEGEND_CONTACTS: "Kontakter" + SEARCH_INPUT_PLACEHOLDER: "Søk" + BUTTON_ADD_CONTACT: "Legg til kontakt" + BUTTON_CREATE_CONTACT: "Lag" + BUTTON_UPDATE_CONTACT: "Oppdater" + BUTTON_IMPORT: "Importer (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Eksporter (vcf, vCard)" + BUTTON_EXPORT_CSV: "Eksporter (csv)" + ERROR_IMPORT_FILE: "Feil ved importering (ugyldig filformat)" + LIST_LOADING: "Laster inn" + EMPTY_LIST: "Ingen kontakter" + EMPTY_SEARCH: "Fant ingen kontakter" + CLEAR_SEARCH: "Tøm søk" + CONTACT_VIEW_DESC: "Velg en kontakt i lista" + LABEL_DISPLAY_NAME: "Navn" + LABEL_EMAIL: "E-post" + LABEL_PHONE: "Telefon" + LABEL_WEB: "Nettside" + LABEL_BIRTHDAY: "Bursdag" + LINK_ADD_EMAIL: "Legg til e-postadresse" + LINK_ADD_PHONE: "Legg til telefon" + LINK_BIRTHDAY: "Bursdag" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Visningsnavn" + PLACEHOLDER_ENTER_LAST_NAME: "Etternavn" + PLACEHOLDER_ENTER_FIRST_NAME: "Fornavn" + PLACEHOLDER_ENTER_NICK_NAME: "Kallenavn" + LABEL_READ_ONLY: "Skrivebeskyttet" + LABEL_SHARE: "Del" + ADD_MENU_LABEL: "Legg til" + ADD_MENU_NICKNAME: "Kallenavn" + ADD_MENU_NOTES: "Notater" + ADD_MENU_EMAIL: "E-post" + ADD_MENU_PHONE: "Telefon" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Adresse" + ADD_MENU_BIRTHDAY: "Bursdag" + ADD_MENU_TAGS: "Tagger" + BUTTON_SHARE_NONE: "Ingen" + BUTTON_SHARE_ALL: "Alle" + BUTTON_SYNC: "Synkronisering (CardDAV)" + COMPOSE: + TITLE_FROM: "Fra" + TITLE_TO: "Til" + TITLE_CC: "Kopi" + TITLE_BCC: "Blindkopi" + TITLE_REPLY_TO: "Svar til" + TITLE_SUBJECT: "Emne" + LINK_SHOW_INPUTS: "Vis alle felt" + BUTTON_SEND: "Send" + BUTTON_SAVE: "Lagre" + BUTTON_DELETE: "Slett" + BUTTON_CANCEL: "Avbryt" + BUTTON_MINIMIZE: "Minimer" + SAVED_TIME: "Lagret %TIME%" + SAVED_ERROR_ON_SEND: "Meldinga er sendt, men ble ikke lagret i mappa for sendte elementer" + DISCARD_UNSAVED_DATA: "Vil du forkaste data som ikke er lagret?" + ATTACH_FILES: "Legg ved filer" + ATTACH_DROP_FILES_DESC: "Slipp filer her" + ATTACH_ITEM_CANCEL: "Avbryt" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Disk" + REPLY_MESSAGE_TITLE: "%EMAIL% skrev %DATETIME%" + FORWARD_MESSAGE_TOP_TITLE: "-------- Videresendt melding -------" + FORWARD_MESSAGE_TOP_FROM: "Fra" + FORWARD_MESSAGE_TOP_TO: "Til" + FORWARD_MESSAGE_TOP_CC: "Kopi" + FORWARD_MESSAGE_TOP_SENT: "Sendt" + FORWARD_MESSAGE_TOP_SUBJECT: "Emne" + EMPTY_TO_ERROR_DESC: "Velg minst én mottaker" + NO_ATTACHMENTS_HERE_DESC: "Ingen vedlegg." + ATTACHMENTS_ERROR_DESC: "Advarsel: ett eller flere vedlegg er ikke blitt lastet opp enda." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Ett eller flere vedlegg er ikke blitt lastet opp enda" + BUTTON_REQUEST_READ_RECEIPT: "Be om en bekreftelse fra mottaker på at meldinga er lest" + BUTTON_MARK_AS_IMPORTANT: "Marker som viktig" + BUTTON_OPEN_PGP: "OpenPGP (kun ren tekst)" + BUTTON_REQUEST_DSN: "Be om leveringsbekreftelse" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Lukk" + POPUPS_ASK: + BUTTON_YES: "Ja" + BUTTON_NO: "Nei" + DESC_WANT_CLOSE_THIS_WINDOW: "Er du sikker på at du vil lukke dette vinduet?" + DESC_WANT_DELETE_MESSAGES: "Er du sikker på at du vil slette meldingen(e)?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Velg språk" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Legg til konto" + BUTTON_ADD_ACCOUNT: "Legg til" + TITLE_UPDATE_ACCOUNT: "Oppdater konto" + BUTTON_UPDATE_ACCOUNT: "Oppdater" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Vil du legge til en identitet?" + TITLE_UPDATE_IDENTITY: "Oppdater identitet" + BUTTON_ADD_IDENTITY: "Legg til" + BUTTON_UPDATE_IDENTITY: "Oppdater" + LABEL_EMAIL: "E-post" + LABEL_NAME: "Navn" + LABEL_REPLY_TO: "Svar til" + LABEL_SIGNATURE: "Signatur" + LABEL_CC: "Kopi" + LABEL_BCC: "Blindkopi" + LABEL_SIGNATURE_INSERT_BEFORE: "Legg til denne signaturen før sitert tekst" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Vil du lage en mappe?" + LABEL_NAME: "Mappenavn" + LABEL_PARENT: "Forelder" + BUTTON_CREATE: "Lag" + BUTTON_CANCEL: "Avbryt" + BUTTON_CLOSE: "Lukk" + TITLE_CREATING_PROCESS: "Lager mappe" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Vil du slette alle meldinger som ligger i mappa?" + BUTTON_CLEAR: "Slett" + BUTTON_CANCEL: "Avbryt" + BUTTON_CLOSE: "Lukk" + DANGER_DESC_WARNING: "Advarsel!" + DANGER_DESC_HTML_1: "Du er i ferd med å slette alle meldinger i mappa %FOLDER%" + DANGER_DESC_HTML_2: "Hvis du går videre, blir meldingene slettet for godt." + TITLE_CLEARING_PROCESS: "Tømmer mappe …" + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Importer OpenPGP-nøkkel" + BUTTON_IMPORT_OPEN_PGP_KEY: "Importer" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "Vis OpenPGP-nøkkel" + BUTTON_SELECT: "Velg" + BUTTON_CLOSE: "Lukk" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Lag OpenPGP-nøkler" + LABEL_EMAIL: "E-post" + LABEL_NAME: "Navn" + LABEL_PASSWORD: "Passord" + LABEL_KEY_BIT_LENGTH: "Nøkkellengde" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Lag" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "Signer/krypter med OpenPGP" + LABEL_SIGN: "Signer" + LABEL_ENCRYPT: "Krypter" + LABEL_PASSWORD: "Passord" + BUTTON_SIGN: "Signer" + BUTTON_ENCRYPT: "Krypter" + BUTTON_SIGN_AND_ENCRYPT: "Signer og krypter" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "Dekrypter med OpenPGP" + LABEL_KEY: "Privatnøkkel" + LABEL_PASSWORD: "Passord" + BUTTON_DECRYPT: "Dekrypter" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "To-stegs-bekreftelsestest" + LABEL_CODE: "Kode" + BUTTON_TEST: "Test" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Vil du lage et filter?" + TITLE_EDIT_FILTER: "Oppdater filter" + FILTER_NAME: "Navn" + LEGEND_CONDITIONS: "Betingelser" + LEGEND_ACTIONS: "Handlinger" + BUTTON_DONE: "Ferdig" + BUTTON_ADD_CONDITION: "Legg til betingelse" + SELECT_ACTION_NONE: "Ingen" + SELECT_ACTION_MOVE_TO: "Flytt til" + SELECT_ACTION_FORWARD_TO: "Videresend til" + SELECT_ACTION_REJECT: "Avvis" + SELECT_ACTION_VACATION_MESSAGE: "Feriemelding" + SELECT_ACTION_DISCARD: "Forkast" + SELECT_FIELD_FROM: "Fra" + SELECT_FIELD_RECIPIENTS: "Hoved- eller kopimottaker" + SELECT_FIELD_SUBJECT: "Emne" + SELECT_FIELD_HEADER: "Meldingshode" + SELECT_FIELD_SIZE: "Størrelse" + SELECT_TYPE_CONTAINS: "Inneholder" + SELECT_TYPE_NOT_CONTAINS: "Inneholder ikke" + SELECT_TYPE_MATCHES: "Samsvarer med («*» og «?» støttes)" + SELECT_TYPE_NOT_MATCHES: "Samsvarer ikke med («*» og «?» støttes)" + SELECT_TYPE_REGEXP: "Reg.uttrykk" + SELECT_TYPE_NOT_REGEXP: "Ikke reg.uttrykk" + SELECT_TYPE_EQUAL_TO: "Er lik" + SELECT_TYPE_NOT_EQUAL_TO: "Er ikke lik" + SELECT_TYPE_OVER: "Større enn" + SELECT_TYPE_UNDER: "Mindre enn" + SELECT_MATCH_ANY: "Samsvarer med én av følgende regler" + SELECT_MATCH_ALL: "Samsvarer med alle følgende regler" + MARK_AS_READ_LABEL: "Merk som lest" + REPLY_INTERVAL_LABEL: "Svar-intervall (dager)" + KEEP_LABEL: "Behold" + STOP_LABEL: "Ikke slutt å bruke regler" + EMAIL_LABEL: "E-post" + VACATION_SUBJECT_LABEL: "Emne (valgfritt)" + VACATION_MESSAGE_LABEL: "Melding" + VACATION_RECIPIENTS_LABEL: "Mottakere (adskilt med komma)" + REJECT_MESSAGE_LABEL: "Avvis melding" + ALL_INCOMING_MESSAGES_DESC: "Alle inngående meldinger" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Velg systemmapper" + SELECT_CHOOSE_ONE: "Velg" + SELECT_UNUSE_NAME: "Ikke bruk" + LABEL_SENT: "Sendt" + LABEL_DRAFTS: "Kladd" + LABEL_SPAM: "Søppelpost" + LABEL_TRASH: "Papirkurv" + LABEL_ARCHIVE: "Arkiv" + BUTTON_CANCEL: "Avbryt" + BUTTON_CLOSE: "Lukk" + NOTIFICATION_SENT: | + Du har ikke valgt «Sendt» som mappe for sendte meldinger. + Velg «Ikke bruk» hvis du ikke vil lagre sendte meldinger. + NOTIFICATION_DRAFTS: "Du har ikke valgt «Kladd» som mappe hvor meldinger lagres mens du skriver." + NOTIFICATION_SPAM: | + Du har ikke valgt «Søppelpost» som mappe for søppelpost. + Velg «Ikke bruk» hvis du vil slette slike meldinger for godt. + NOTIFICATION_TRASH: | + Du har ikke valgt «Papirkurv» som mappe for slettede meldinger. + Velg «Ikke bruk» hvis du vil slette slike meldinger for godt. + NOTIFICATION_ARCHIVE: "Du har ikke valgt «Arkiv» som mappe for arkiverte meldinger." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "To-stegsbekreftelse" + LABEL_ENABLE_TWO_FACTOR: "Slå på to-stegsbekreftelse" + LABEL_TWO_FACTOR_USER: "Bruker" + LABEL_TWO_FACTOR_STATUS: "Status" + LABEL_TWO_FACTOR_SECRET: "Secret" + LABEL_TWO_FACTOR_BACKUP_CODES: "Reservekoder" + BUTTON_CREATE: "Lag ny hemmelig kode" + BUTTON_ACTIVATE: "Slå på" + BUTTON_CLEAR: "Tøm" + BUTTON_LOGOUT: "Logg ut" + BUTTON_DONE: "Ferdig" + BUTTON_TEST: "Test" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Vis hemmelig kode" + BUTTON_HIDE_SECRET: "Skjul hemmelig kode" + TWO_FACTOR_REQUIRE_DESC: "Denne kontoen krever to-stegsbekreftelse." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Satt opp" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Ikke satt opp" + TWO_FACTOR_SECRET_DESC: >- + Importer denne informasjonen til din Google Authenticator klient (eller andre + klienter) ved å bruke QR-koden under, eller ved å skrive inn koden manuelt. + TWO_FACTOR_BACKUP_CODES_DESC: >- + Hvis du ikke mottar koder fra Google Authenticator, kan du bruke reservekodene + for å logge inn. Disse kodene kan bare brukes én gang. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Du kan ikke endre denne innstillinga før du tester den." + TITLES: + LOADING: "Laster inn" + LOGIN: "Logg inn" + MAILBOX: "E-post" + SETTINGS: "Innstillinger" + COMPOSE: "Skriv" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Fila er for stor" + ERROR_FILE_PARTIALLY_UPLOADED: "Fila ble delvis lastet opp på grunn av ukjent feil" + ERROR_NO_FILE_UPLOADED: "Ingen fil lastet opp" + ERROR_MISSING_TEMP_FOLDER: "Midlertidig fil mangler" + ERROR_ON_SAVING_FILE: "Det oppstod en ukjent feil under opplasting av fil" + ERROR_FILE_TYPE: "Ugyldig filtype" + ERROR_UNKNOWN: "Det oppstod en ukjent feil under opplasting av fil" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEKST" + TEXT_SWITCHER_RICH_FORMATTING: "Rik tekst" + TEXT_SWITCHER_CONFIRM: "Tekstformatering og bilder går tapt. Er du sikker på at du vil fortsette?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Personlig" + LABEL_GENERAL_NAME: "Generelt" + LABEL_CONTACTS_NAME: "Kontakter" + LABEL_FOLDERS_NAME: "Mapper" + LABEL_ACCOUNTS_NAME: "Kontoer" + LABEL_IDENTITY_NAME: "Identitet" + LABEL_IDENTITIES_NAME: "Identiteter" + LABEL_FILTERS_NAME: "Filters" + LABEL_TEMPLATES_NAME: "Maler" + LABEL_SECURITY_NAME: "Sikkerhet" + LABEL_SOCIAL_NAME: "Sosialt" + LABEL_THEMES_NAME: "Tema" + LABEL_CHANGE_PASSWORD_NAME: "Passord" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Tilbake" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filtre" + BUTTON_SAVE: "Lagre" + BUTTON_ADD_FILTER: "Legg til et filter" + BUTTON_DELETE: "Slett" + BUTTON_RAW_SCRIPT: "Bruk selvvalgt skript" + SUBNAME_NONE: "Ingen" + SUBNAME_MOVE_TO: "Flytt til «%FOLDER%»" + SUBNAME_FORWARD_TO: "Videresend til «%EMAIL%»" + SUBNAME_REJECT: "Avvis" + SUBNAME_VACATION_MESSAGE: "Feriemelding" + SUBNAME_DISCARD: "Forkast" + CAPABILITY_LABEL: "Evne" + LOADING_PROCESS: "Oppdater filterliste" + DELETING_ASK: "Er du sikker?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Disse endringene må lagres på tjeneren." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identitet" + LABEL_DISPLAY_NAME: "Navn" + LABEL_REPLY_TO: "Svar til" + LABEL_SIGNATURE: "Signatur" + LABEL_ADD_SIGNATURE_TO_ALL: "Vil du legge til signatur i alle utgående meldinger?" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Sikkerhet" + LABEL_CONFIGURE_TWO_FACTOR: "Sett opp to-stegsbekreftelse" + LABEL_AUTOLOGOUT: "Logg ut automatisk etter" + AUTOLOGIN_NEVER_OPTION_NAME: "Aldri" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minutt(er)" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% time(r)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Generelt" + LABEL_LANGUAGE: "Språk" + LABEL_IDENTITY: "Identitet" + LABEL_LAYOUT: "Utforming" + LABEL_LAYOUT_NO_SPLIT: "Ingen deling" + LABEL_LAYOUT_VERTICAL_SPLIT: "Vertikal deling" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horisontal deling" + LABEL_EDITOR: "Standard tekstbehandler" + LABEL_EDITOR_HTML: "Html" + LABEL_EDITOR_PLAIN: "Ren tekst" + LABEL_EDITOR_HTML_FORCED: "Html (tvungen)" + LABEL_EDITOR_PLAIN_FORCED: "Ren tekst (tvungen)" + LABEL_ANIMATION: "Animasjon av grensesnitt" + LABEL_ANIMATION_FULL: "Fullstendig" + LABEL_ANIMATION_NORMAL: "Normal" + LABEL_ANIMATION_NONE: "Ingen" + LABEL_VIEW_OPTIONS: "Vis valg" + LABEL_USE_PREVIEW_PANE: "Bruk forhåndsvisningsrute" + LABEL_USE_CHECKBOXES_IN_LIST: "Vis avkrysningsbokser i liste" + LABEL_USE_THREADS: "Bruk tråder" + LABEL_REPLY_SAME_FOLDER: "Legg svar i samme mappe som opprinnelig melding" + LABEL_SHOW_IMAGES: "Vis alltid eksterne bilder i meldingstekst" + LABEL_SHOW_ANIMATION: "Vis animasjon" + LABEL_MESSAGE_PER_PAGE: "Meldinger per side" + LABEL_NOTIFICATIONS: "Varsler" + LABEL_SOUND_NOTIFICATION: "Lydvarsel" + LABEL_CHROME_NOTIFICATION_DESC: "Vis sprettopp-varsel om nye meldinger" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Blokkert av nettleser)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Kontakter" + LABEL_CONTACTS_AUTOSAVE: "Legg til mottakere i adresseboka automatisk" + LEGEND_CONTACTS_SYNC: "Fjernstyrt synkronisering (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Slå på fjernstyrt synkronisering" + LABEL_CONTACTS_SYNC_SERVER: "Tjener" + LABEL_CONTACTS_SYNC_AB_URL: "Nettadresse til adressebok" + LABEL_CONTACTS_SYNC_USER: "Bruker" + LABEL_CONTACTS_SYNC_PASSWORD: "Passord" + SETTINGS_THEMES: + LEGEND_THEMES: "Tema" + LEGEND_THEMES_CUSTOM: "Selvvalgt tema" + LABEL_CUSTOM_TYPE: "Type" + LABEL_CUSTOM_TYPE_LIGHT: "Lys" + LABEL_CUSTOM_TYPE_DARK: "Mørk" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Bakgrunn" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Last opp bakgrunnsbilde (.jpg eller .png)" + ERROR_FILE_IS_TOO_BIG: "Fila er for stor (1mb +)" + ERROR_FILE_TYPE_ERROR: "Ugyldig filtype (bruk .jpg eller .png)" + ERROR_UNKNOWN: "Det oppstod en ukjent feil under opplasting av fil" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Koble til Google" + BUTTON_GOOGLE_DISCONNECT: "Koble fra Google" + MAIN_GOOGLE_DESC: "Når du har slått på innlogging via Google kan du logge inn på denne kontoen ved å bruke Google-knappen på innloggingsskjermen." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Koble til Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Koble fra Facebook" + MAIN_FACEBOOK_DESC: "Når du har slått på innlogging via Facebook kan du logge inn på denne kontoen ved å bruke Facebook-knappen på innloggingsskjermen." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Koble til Twitter" + BUTTON_TWITTER_DISCONNECT: "Koble fra Twitter" + MAIN_TWITTER_DESC: "Når du har slått på innlogging via Twitter kan du logge inn på denne kontoen ved å bruke Twitter-knappen på innloggingsskjermen." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Mappeliste" + BUTTON_CREATE: "Lag mappe" + BUTTON_SYSTEM: "Systemmapper" + BUTTON_DELETE: "Slett" + BUTTON_SUBSCRIBE: "Abonner" + BUTTON_UNSUBSCRIBE: "Stopp abonnement" + LOADING_PROCESS: "Oppdaterer mappeliste" + CREATING_PROCESS: "Lager mappe" + DELETING_PROCESS: "Sletter mappe" + RENAMING_PROCESS: "Endrer navn på mappe" + DELETING_ASK: "Er du sikker?" + TO_MANY_FOLDERS_DESC_1: "Du har for mange mapper!" + TO_MANY_FOLDERS_DESC_2: "For å unngå ytelsesproblemer får du bare se noen av dem." + HELP_DELETE_FOLDER: "Slett mappe" + HELP_SHOW_HIDE_FOLDER: "Vis/skjul mappe" + HELP_CHECK_FOR_NEW_MESSAGES: "Se/ikke se etter nye meldinger" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Kontoer" + LEGEND_IDENTITIES: "Identiteter" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Kontoer og identiteter" + BUTTON_ADD_ACCOUNT: "Legg til konto" + BUTTON_ADD_IDENTITY: "Legg til identitet" + BUTTON_DELETE: "Slett" + LOADING_PROCESS: "Oppdaterer …" + DELETING_ASK: "Er du sikker?" + DEFAULT_IDENTITY_LABEL: "Standard" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identitet" + LEGEND_IDENTITIES: "Identiteter" + LABEL_DEFAULT: "Standard" + LABEL_DISPLAY_NAME: "Navn" + LABEL_REPLY_TO: "Svar til" + LABEL_SIGNATURE: "Signatur" + LABEL_ADD_SIGNATURE_TO_ALL: "Legg til signatur i alle utgående meldinger" + BUTTON_ADD_IDENTITY: "Legg til identitet" + BUTTON_DELETE: "Slett" + LOADING_PROCESS: "Oppdaterer identiteter" + DELETING_ASK: "Er du sikker?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Endre passord" + LABEL_CURRENT_PASSWORD: "Gjeldende passord" + LABEL_NEW_PASSWORD: "Nytt passord" + LABEL_REPEAT_PASSWORD: "Gjenta passordet" + BUTTON_UPDATE_PASSWORD: "Oppdater passord" + ERROR_PASSWORD_MISMATCH: "Passordene stemmer ikke overens. Prøv på nytt" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Importer OpenPGP-nøkkel" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Lag OpenPGP-nøkler" + TITLE_PRIVATE: "Privat" + TITLE_PUBLIC: "Offentlig" + DELETING_ASK: "Er du sikker?" + GENERATE_ONLY_HTTPS: "Kun HTTPS" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Lagre utkast automatisk" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Tastatursnarveier" + TAB_MAILBOX: "Innboks" + TAB_MESSAGE_LIST: "Meldingsliste" + TAB_MESSAGE_VIEW: "Meldingsvisning" + TAB_COMPOSE: "Skriv ny melding" + LABEL_OPEN_USER_DROPDOWN: "Åpne brukerliste" + LABEL_REPLY: "Svar" + LABEL_REPLY_ALL: "Svar alle" + LABEL_FORWARD: "Videresend" + LABEL_FORWARD_MULTIPLY: "Videresend som vedlegg" + LABEL_HELP: "Hjelp" + LABEL_CHECK_ALL: "Merk alle meldinger" + LABEL_ARCHIVE: "Arkiver" + LABEL_DELETE: "Slett" + LABEL_OPEN_THREAD: "Åpne valgt tråd" + LABEL_MOVE: "Flytt" + LABEL_READ: "Merk som lest" + LABEL_UNREAD: "Merk som ulest" + LABEL_IMPORTANT: "Merk valgte meldinger med stjerne" + LABEL_SEARCH: "Søk" + LABEL_CANCEL_SEARCH: "Avbryt søk" + LABEL_FULLSCREEN_ENTER: "Fullskjerm" + LABEL_VIEW_MESSAGE_ENTER: "Vis melding" + LABEL_SWITCH_TO_MESSAGE: "Flytt fokus til valgt melding" + LABEL_SWITCH_TO_FOLDER_LIST: "Flytt fokus til mappeliste" + LABEL_FULLSCREEN_TOGGLE: "Fullskjerm-modus" + LABEL_BLOCKQUOTES_TOGGLE: "Vis/skjul sitert melding" + LABEL_THREAD_NEXT: "Neste melding i tråd" + LABEL_THREAD_PREV: "Forrige melding i tråd" + LABEL_PRINT: "Skriv ut" + LABEL_EXIT_FULLSCREEN: "Avslutt fullskjerm-modus" + LABEL_CLOSE_MESSAGE: "Lukk melding" + LABEL_SWITCH_TO_LIST: "Flytt fokus til meldingsliste" + LABEL_OPEN_COMPOSE_POPUP: "Ny melding i popup" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Åpne identitetsliste" + LABEL_SAVE_MESSAGE: "Lagre melding" + LABEL_SEND_MESSAGE: "Send melding" + LABEL_CLOSE_COMPOSE: "Lukk ny melding" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "Fant ingen offentlige nøkler" + NO_PUBLIC_KEYS_FOUND_FOR: "Fant ingen offentlige nøkler for «%EMAIL%»" + NO_PRIVATE_KEY_FOUND: "Fant ingen privatnøkler" + NO_PRIVATE_KEY_FOUND_FOR: "Fant ingen privatnøkler for «%EMAIL%»" + ADD_A_PUBLICK_KEY: "Legg til en offentlig nøkkel" + SELECT_A_PRIVATE_KEY: "Velg privatnøkkel" + UNVERIFIRED_SIGNATURE: "Ubekreftet signatur" + DECRYPTION_ERROR: "Feil under OpenPGP-dekryptering" + GOOD_SIGNATURE: "Gyldig signatur fra %USER%" + PGP_ERROR: "OpenPGP-feil: %ERROR%" + SPECIFY_FROM_EMAIL: "Velg avsender-adresse" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Velg minst én mottaker" + NOTIFICATIONS: + INVALID_TOKEN: "Ugyldig info" + AUTH_ERROR: "Autentisering mislyktes" + ACCESS_ERROR: "Tilgangsfeil" + CONNECTION_ERROR: "Klarte ikke å koble til tjeneren" + CAPTCHA_ERROR: "Feil CAPTCHA" + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Denne kontoen er ikke knyttet til en e-postadresse ennå. Logg inn med e-postadresse + og passord, og slå på denne funksjonen i kontoinnstillingene. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Denne kontoen er ikke knyttet til en e-postadresse ennå. Logg inn med e-postadresse + og passord, og slå på denne funksjonen i kontoinnstillingene. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Denne kontoen er ikke knyttet til en e-postadresse ennå. Logg inn med e-postadresse + og passord, og slå på denne funksjonen i kontoinnstillingene. + DOMAIN_NOT_ALLOWED: "Dette domenet tillates ikke" + ACCOUNT_NOT_ALLOWED: "Denne kontoen tillates ikke" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "To-stegsbekreftelse kreves" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "To-stegsbekreftelse mislyktes" + COULD_NOT_SAVE_NEW_PASSWORD: "Klarte ikke å lagre nytt passord" + CURRENT_PASSWORD_INCORRECT: "Gjeldende passord er feil" + NEW_PASSWORD_SHORT: "Passordet er for kort" + NEW_PASSWORD_WEAK: "Passordet er for svakt" + NEW_PASSWORD_FORBIDDENT: "Passordet inneholder ugyldige tegn" + CONTACTS_SYNC_ERROR: "Synkronisering av kontakter mislyktes" + CANT_GET_MESSAGE_LIST: "Klarte ikke å hente liste over meldinger" + CANT_GET_MESSAGE: "Klarte ikke å hente melding" + CANT_DELETE_MESSAGE: "Klarte ikke å slette melding" + CANT_MOVE_MESSAGE: "Klarte ikke å flytte melding" + CANT_SAVE_MESSAGE: "Klarte ikke å lagre melding" + CANT_SEND_MESSAGE: "Klarte ikke å sende melding" + INVALID_RECIPIENTS: "Ugyldige mottakere" + CANT_SAVE_FILTERS: "Klarte ikke å lagre filtre" + CANT_GET_FILTERS: "Klarte ikke å hente filtre" + FILTERS_ARE_NOT_CORRECT: "Feilutformet filter" + CANT_CREATE_FOLDER: "Klarte ikke å lage mappe" + CANT_RENAME_FOLDER: "Klarte ikke å endre navn på mappe" + CANT_DELETE_FOLDER: "Klarte ikke å slette mappe" + CANT_DELETE_NON_EMPTY_FOLDER: "Klarte ikke å slette mappe med innhold" + CANT_SUBSCRIBE_FOLDER: "Klarte ikke å abonnere på mappe" + CANT_UNSUBSCRIBE_FOLDER: "Klarte ikke å avslutte abonnement" + CANT_SAVE_SETTINGS: "Klarte ikke å lagre innstillinger" + CANT_SAVE_PLUGIN_SETTINGS: "Klarte ikke å lagre innstillinger" + DOMAIN_ALREADY_EXISTS: "Domenet finnes allerede" + CANT_INSTALL_PACKAGE: "Klarte ikke å installere pakke" + CANT_DELETE_PACKAGE: "Klarte ikke å fjerne pakken" + INVALID_PLUGIN_PACKAGE: "Ugyldig tilleggspakke" + UNSUPPORTED_PLUGIN_PACKAGE: "Denne illeggspakka støttes ikke" + LICENSING_SERVER_IS_UNAVAILABLE: "Abonnementstjeneren er utilgjengelig" + LICENSING_DOMAIN_EXPIRED: "Abonnementet på dette domenet er utløpt." + LICENSING_DOMAIN_BANNED: "Abonnementet på dette domenet er forbudt." + DEMO_SEND_MESSAGE_ERROR: "Denne demo-kontoen er blokkert fra å sende meldinger til eksterne e-postadresser av sikkerhetshensyn." + DEMO_ACCOUNT_ERROR: "Av sikkerhetshensyn er denne kontoen blokkert fra å utføre denne handlinga." + ACCOUNT_ALREADY_EXISTS: "Kontoen finnes allerede" + ACCOUNT_DOES_NOT_EXIST: "Kontoen finnes ikke" + MAIL_SERVER_ERROR: "Fikk ikke tilgang til e-posttjener" + INVALID_INPUT_ARGUMENT: "Ugyldig inndata-argument" + UNKNOWN_ERROR: "Ukjent feil" + STATIC: + BACK_LINK: "Oppdater" + DOMAIN_LIST_DESC: "Liste over domener som dette webmail-programmet kan få tilgang til" + PHP_EXSTENSIONS_ERROR_DESC: "PHP-oppsettet ditt mangler en PHP-utvidelse." + PHP_VERSION_ERROR_DESC: "PHP-installasjonen din (%VERSION%) er eldre enn versjon 5.3.0" + NO_SCRIPT_TITLE: "Dette programmet krever Javascript." + NO_SCRIPT_DESC: | + Nettleseren din støtter ikke Javascript. + Slå på Javascript-støtte i nettleserens innstillinger, og prøv på nytt. + NO_COOKIE_TITLE: "Dette programmet krever støtte for informasjonskapsler («cookies»)." + NO_COOKIE_DESC: | + Nettleseren din støtter ikke bruk av informasjonskapsler («cookies»). + Slå på cookie-støtte i nettleserens innstillinger, og prøv på nytt. + BAD_BROWSER_TITLE: "Nettleseren din er utdatert." + BAD_BROWSER_DESC: | + Hvis du vil bruke alle funksjonene i programmet, + må du laste ned og installere en av disse nettleserne: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/nl_NL.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/nl_NL.yml new file mode 100755 index 00000000..61298ec5 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/nl_NL.yml @@ -0,0 +1,714 @@ +nl_NL: + LOGIN: + LABEL_EMAIL: "E-mail" + LABEL_LOGIN: "Inlognaam" + LABEL_PASSWORD: "Wachtwoord" + LABEL_SIGN_ME: "Aangemeld blijven" + LABEL_VERIFICATION_CODE: "Verificatie Code" + LABEL_DONT_ASK_VERIFICATION_CODE: "Vraag 2 weken niet naar code" + BUTTON_SIGN_IN: "Aanmelden" + TITLE_SIGN_IN_GOOGLE: "Aanmelden met Google" + TITLE_SIGN_IN_FACEBOOK: "Aanmelden met Facebook" + TITLE_SIGN_IN_TWITTER: "Aanmelden met Twitter" + LABEL_FORGOT_PASSWORD: "Wachtwoord vergeten" + LABEL_REGISTRATION: "Registratie" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Account toevoegen" + BUTTON_SETTINGS: "Instellingen" + BUTTON_HELP: "Help" + BUTTON_LOGOUT: "Afmelden" + MOBILE: + BUTTON_MOBILE_VERSION: "Mobiele versie" + BUTTON_DESKTOP_VERSION: "Desktop versie" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Zoeken" + TITLE_ADV: "Geavanceerd zoeken" + LABEL_ADV_FROM: "Van" + LABEL_ADV_TO: "Naar" + LABEL_ADV_SUBJECT: "Onderwerp" + LABEL_ADV_TEXT: "Tekst" + LABEL_ADV_HAS_ATTACHMENT: "Heeft bijlage" + LABEL_ADV_HAS_ATTACHMENTS: "Heeft bijlages" + LABEL_ADV_FLAGGED: "Gemarkeerd" + LABEL_ADV_UNSEEN: "Ongelezen" + LABEL_ADV_DATE: "Datum" + LABEL_ADV_DATE_ALL: "Alles" + LABEL_ADV_DATE_3_DAYS: "Tot 3 dagen oud" + LABEL_ADV_DATE_7_DAYS: "Tot 1 week oud" + LABEL_ADV_DATE_MONTH: "Tot 1 maand oud" + LABEL_ADV_DATE_3_MONTHS: "Tot 3 maanden oud" + LABEL_ADV_DATE_6_MONTHS: "Tot 6 maanden oud" + LABEL_ADV_DATE_YEAR: "Tot 1 jaar oud" + BUTTON_ADV_SEARCH: "Zoeken" + PREVIEW_POPUP: + FULLSCREEN: "Schakel volledig scherm in/uit" + ZOOM: "Zoom in/uit" + CLOSE: "Sluiten (Esc)" + LOADING: "Ophalen..." + GALLERY_PREV: "Vorige (Linker Pijl toets)" + GALLERY_NEXT: "Volgende (Rechter Pijl toets)" + GALLERY_COUNTER: "%curr% van %total%" + IMAGE_ERROR: "De afbeelding kan niet worden geladen" + AJAX_ERROR: "De inhoud kan niet worden geladen" + FOLDER_LIST: + BUTTON_COMPOSE: "Nieuw bericht" + BUTTON_CONTACTS: "Contactpersonen" + BUTTON_NEW_MESSAGE: "Nieuw bericht" + INBOX_NAME: "Postvak IN" + SENT_NAME: "Verzonden items" + DRAFTS_NAME: "Concepten" + SPAM_NAME: "Ongewenste e-mail" + TRASH_NAME: "Verwijderde items" + ARCHIVE_NAME: "Archief" + QUOTA: + TITLE: "Quota gebruik" + MESSAGE_LIST: + BUTTON_RELOAD: "Berichten controleren" + BUTTON_MOVE_TO: "Verplaatsen" + BUTTON_DELETE: "Verwijderen" + BUTTON_ARCHIVE: "Archiveren" + BUTTON_SPAM: "Ongewenste e-mail" + BUTTON_NOT_SPAM: "Geen ongewenste e-mail" + BUTTON_EMPTY_FOLDER: "Map leegmaken" + BUTTON_MULTY_FORWARD: "Doorsturen als bijlage(n)" + BUTTON_DELETE_WITHOUT_MOVE: "Permanent verwijderen" + BUTTON_MORE: "Meer" + MENU_SET_SEEN: "Markeer als gelezen" + MENU_SET_ALL_SEEN: "Markeer alles als gelezen" + MENU_UNSET_SEEN: "Markeer als ongelezen" + MENU_SET_FLAG: "Vlag" + MENU_UNSET_FLAG: "Vlag verwijderen" + MENU_SELECT_ALL: "Alle" + MENU_SELECT_NONE: "Geen" + MENU_SELECT_INVERT: "Selectie omkeren" + MENU_SELECT_UNSEEN: "Ongelezen" + MENU_SELECT_SEEN: "Gelezen" + MENU_SELECT_FLAGGED: "Met Vlag" + MENU_SELECT_UNFLAGGED: "Zonder Vlag" + EMPTY_LIST: "Geen berichten" + EMPTY_SEARCH_LIST: "Geen items gevonden" + SEARCH_RESULT_FOR: "Zoekresultaten voor\"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "terug naar berichtenlijst" + LIST_LOADING: "Ophalen..." + EMPTY_SUBJECT_TEXT: "(Geen onderwerp)" + PUT_MESSAGE_HERE: "Sleep bericht hier om ze te bekijken in de lijst" + TODAY_AT: "vandaag om %TIME%" + YESTERDAY_AT: "gisteren om %TIME%" + SEARCH_PLACEHOLDER: "Zoeken" + NEW_MESSAGE_NOTIFICATION: "U heeft %COUNT% nieuwe berichten!" + QUOTA_SIZE: "U gebruikt %SIZE% (%PROC%%) van %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Aanpassen" + BUTTON_BACK: "Terug" + BUTTON_CLOSE: "Sluiten" + BUTTON_DELETE: "Verwijderen" + BUTTON_UNSUBSCRIBE: "Abonnement op deze e-mail lijst opzeggen" + BUTTON_ARCHIVE: "Archiveren" + BUTTON_SPAM: "Ongewenste e-mail" + BUTTON_NOT_SPAM: "Geen ongewenste e-mail" + BUTTON_MOVE_TO: "Verplaatsen" + BUTTON_MORE: "Meer" + BUTTON_REPLY: "Beantwoorden" + BUTTON_REPLY_ALL: "Allen beantwoorden" + BUTTON_FORWARD: "Doorsturen" + BUTTON_FORWARD_AS_ATTACHMENT: "Doorsturen als bijlage" + BUTTON_EDIT_AS_NEW: "Bewerken om opnieuw te verzenden" + BUTTON_SHOW_IMAGES: "Toon afbeeldingen" + BUTTON_NOTIFY_READ_RECEIPT: "De afzender heeft om een leesbevestiging gevraagd" + BUTTON_IN_NEW_WINDOW: "Toon in nieuw venster" + BUTTON_THREAD_LIST: "Groep lijst" + BUTTON_THREAD_PREV: "Vorige" + BUTTON_THREAD_NEXT: "Volgende" + BUTTON_THREAD_MORE: "Meer berichten" + MENU_HEADERS: "Toon berichtkoppen" + MENU_VIEW_ORIGINAL: "Toon origineel" + MENU_DOWNLOAD_ORIGINAL: "Download als .eml bestand" + MENU_FILTER_SIMILAR: "Filter gelijksoortige berichten" + MENU_PRINT: "Afdrukken" + EMPTY_SUBJECT_TEXT: "(Geen onderwerp)" + LABEL_SUBJECT: "Onderwerp" + LABEL_DATE: "Datum" + LABEL_FROM: "Van" + LABEL_FROM_SHORT: "van" + LABEL_TO: "Naar" + LABEL_TO_SHORT: "naar" + LABEL_CC: "CC" + LABEL_BCC: "BCC" + LABEL_REPLY_TO: "Antwoordadres" + PRINT_LABEL_FROM: "Van" + PRINT_LABEL_TO: "Naar" + PRINT_LABEL_CC: "CC" + PRINT_LABEL_BCC: "BCC" + PRINT_LABEL_REPLY_TO: "Antwoordadres" + PRINT_LABEL_DATE: "Datum" + PRINT_LABEL_SUBJECT: "Onderwerp" + PRINT_LABEL_ATTACHMENTS: "Bijlagen" + MESSAGE_LOADING: "Bericht ophalen" + MESSAGE_VIEW_DESC: "Selecteer een bericht in de lijst om hier te bekijken" + MESSAGE_VIEW_MOVE_DESC: "Klik op de doel map in het linker paneel." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Wachtwoord" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP ondertekend bericht (klik om te verifiëren)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP versleuteld bericht (klik om te ontsleutelen)" + LINK_DOWNLOAD_AS_ZIP: "Download als zip" + LINK_SAVE_TO_OWNCLOUD: "Sla op in ownCloud" + LINK_SAVE_TO_DROPBOX: "Sla op in Dropbox" + READ_RECEIPT: + SUBJECT: "Ontvangstbevestiging (weergegeven) - %SUBJECT%" + BODY: | + Dit is een bevestiging dat uw bericht aan %READ-RECEIPT% is ontvangen. + + Let op: Deze ontvangstbevestiging bevestigd slechts dat uw bericht was weergegeven op het scherm van de ontvanger. + Er is geen enkele garantie dat uw bericht is gelezen of begrepen. + SUGGESTIONS: + SEARCHING_DESC: "Zoeken..." + CONTACTS: + LEGEND_CONTACTS: "Contactpersonen" + SEARCH_INPUT_PLACEHOLDER: "Zoeken" + BUTTON_ADD_CONTACT: "Contactpersoon Toevoegen" + BUTTON_CREATE_CONTACT: "Toevoegen" + BUTTON_UPDATE_CONTACT: "Bijwerken" + BUTTON_IMPORT: "Importeer (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Exporteer (vcf, vCard)" + BUTTON_EXPORT_CSV: "Exporteer (csv)" + ERROR_IMPORT_FILE: "Fout bij importeren (ongeldige bestandsindeling)" + LIST_LOADING: "Ophalen..." + EMPTY_LIST: "Geen contactpersonen" + EMPTY_SEARCH: "Geen items gevonden" + CLEAR_SEARCH: "Wis zoekopdracht" + CONTACT_VIEW_DESC: "Selecteer een contactpersoon in de lijst om hier te bekijken" + LABEL_DISPLAY_NAME: "Weergeven als" + LABEL_EMAIL: "E-mail adres" + LABEL_PHONE: "Telefoon" + LABEL_WEB: "Web" + LABEL_BIRTHDAY: "Geboortedatum" + LINK_ADD_EMAIL: "E-mail adres toevoegen" + LINK_ADD_PHONE: "Telefoonnummer toevoegen" + LINK_BIRTHDAY: "Geboortedatum" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Weergeven als" + PLACEHOLDER_ENTER_LAST_NAME: "Achternaam" + PLACEHOLDER_ENTER_FIRST_NAME: "Voornaam" + PLACEHOLDER_ENTER_NICK_NAME: "Bijnaam" + LABEL_READ_ONLY: "Alleen lezen" + LABEL_SHARE: "Deel" + ADD_MENU_LABEL: "Toevoegen" + ADD_MENU_NICKNAME: "Bijnaam" + ADD_MENU_NOTES: "Notities" + ADD_MENU_EMAIL: "E-mail adres" + ADD_MENU_PHONE: "Telefoonnummer" + ADD_MENU_URL: "Webpagina" + ADD_MENU_ADDRESS: "Adres" + ADD_MENU_BIRTHDAY: "Geboortedatum" + ADD_MENU_TAGS: "Labels" + BUTTON_SHARE_NONE: "Niemand" + BUTTON_SHARE_ALL: "Iedereen" + BUTTON_SYNC: "Synchroniseren (CardDAV)" + COMPOSE: + TITLE_FROM: "Van" + TITLE_TO: "Naar" + TITLE_CC: "CC" + TITLE_BCC: "BCC" + TITLE_REPLY_TO: "Antwoordadres" + TITLE_SUBJECT: "Onderwerp" + LINK_SHOW_INPUTS: "Toon alle velden" + BUTTON_SEND: "Verzenden" + BUTTON_SAVE: "Concept opslaan" + BUTTON_DELETE: "Verwijder" + BUTTON_CANCEL: "Annuleer" + BUTTON_MINIMIZE: "Minimaliseer" + SAVED_TIME: "Bewaard op %TIME%" + SAVED_ERROR_ON_SEND: "Bericht is verzonden maar niet bewaard in de VERZONDEN map" + DISCARD_UNSAVED_DATA: "Niet opgeslagen gegevens verwijderen?" + ATTACH_FILES: "Bestand(en) toevoegen" + ATTACH_DROP_FILES_DESC: "Sleep bestanden naar hier" + ATTACH_ITEM_CANCEL: "Annuleer" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%EMAIL% schreef op %DATETIME%" + FORWARD_MESSAGE_TOP_TITLE: "-------- Doorgestuurd bericht -------" + FORWARD_MESSAGE_TOP_FROM: "Van" + FORWARD_MESSAGE_TOP_TO: "Naar" + FORWARD_MESSAGE_TOP_CC: "CC" + FORWARD_MESSAGE_TOP_SENT: "Verzonden" + FORWARD_MESSAGE_TOP_SUBJECT: "Onderwerp" + EMPTY_TO_ERROR_DESC: "Kies ten minste één ontvanger voordat u het bericht verstuurd" + NO_ATTACHMENTS_HERE_DESC: "Er zijn geen bijlagen" + ATTACHMENTS_ERROR_DESC: "Waarschuwing! Nog niet alle bijlagen zijn klaar met uploaden" + ATTACHMENTS_UPLOAD_ERROR_DESC: "Toevoegen van bijlage(n) is nog niet gereed" + BUTTON_REQUEST_READ_RECEIPT: "Leesbevestiging vragen" + BUTTON_MARK_AS_IMPORTANT: "Marker als belangrijk" + BUTTON_OPEN_PGP: "OpenPGP (allen bij Platte Tekst)" + BUTTON_REQUEST_DSN: "Ontvangstbevestiging vragen" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Close" + POPUPS_ASK: + BUTTON_YES: "Ja" + BUTTON_NO: "Nee" + DESC_WANT_CLOSE_THIS_WINDOW: "Weet u zeker dat u dit venster wilt sluiten?" + DESC_WANT_DELETE_MESSAGES: "Weet u zeker dat u dit/deze bericht/berichten wilt verwijderen?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Kies uw taal" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Account toevoegen?" + BUTTON_ADD_ACCOUNT: "Toevoegen" + TITLE_UPDATE_ACCOUNT: "Account updaten?" + BUTTON_UPDATE_ACCOUNT: "Update" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Identiteit toevoegen?" + TITLE_UPDATE_IDENTITY: "Identiteit bijwerken?" + BUTTON_ADD_IDENTITY: "Toevoegen" + BUTTON_UPDATE_IDENTITY: "Bijwerken" + LABEL_EMAIL: "E-mail adres" + LABEL_NAME: "Naam" + LABEL_REPLY_TO: "Antwoordadres" + LABEL_SIGNATURE: "Signature" + LABEL_CC: "Cc" + LABEL_BCC: "BCC" + LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Map aanmaken?" + LABEL_NAME: "Map naam" + LABEL_PARENT: "Onderliggende map" + BUTTON_CREATE: "Maken" + BUTTON_CANCEL: "Annuleer" + BUTTON_CLOSE: "Sluiten" + TITLE_CREATING_PROCESS: "Maak een nieuwe map" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Alle inhoud van deze map verwijderen?" + BUTTON_CLEAR: "Wissen" + BUTTON_CANCEL: "Annuleer" + BUTTON_CLOSE: "Sluiten" + DANGER_DESC_WARNING: "Opgelet!" + DANGER_DESC_HTML_1: "Deze actie verwijdert alle e-mails in de map %FOLDER%!" + DANGER_DESC_HTML_2: "Eens in gang gezet kan het proces niet geannuleerd worden!" + TITLE_CLEARING_PROCESS: "Folder aan het leegmaken..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Importeer OpenPGP sleutel" + BUTTON_IMPORT_OPEN_PGP_KEY: "Importeer" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "Bekijk OpenPGP sleutel" + BUTTON_SELECT: "Selecteer" + BUTTON_CLOSE: "Sluiten" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Genereer OpenPGP sleutels" + LABEL_EMAIL: "E-mail" + LABEL_NAME: "Naam" + LABEL_PASSWORD: "Wachtwoord" + LABEL_KEY_BIT_LENGTH: "Sleutel lengte" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Genereer" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP ondertekenen/versleutelen" + LABEL_SIGN: "Ondertekenen" + LABEL_ENCRYPT: "Versleutelen" + LABEL_PASSWORD: "Wachtwoord" + BUTTON_SIGN: "Ondertekenen" + BUTTON_ENCRYPT: "Versleutelen" + BUTTON_SIGN_AND_ENCRYPT: "Ondertekenen en versleutelen" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" + LABEL_KEY: "Privé sleutel" + LABEL_PASSWORD: "Password" + BUTTON_DECRYPT: "Decrypt" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "2-Stap verificatie test" + LABEL_CODE: "Code" + BUTTON_TEST: "Test" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Filter toevoegen" + TITLE_EDIT_FILTER: "Filter aanpassen" + FILTER_NAME: "Naam" + LEGEND_CONDITIONS: "Voorwaarden" + LEGEND_ACTIONS: "Akties" + BUTTON_DONE: "Klaar" + BUTTON_ADD_CONDITION: "Voorwaarde toevoegen" + SELECT_ACTION_NONE: "Geen" + SELECT_ACTION_MOVE_TO: "Verplaats naar" + SELECT_ACTION_FORWARD_TO: "Doorsturen naar" + SELECT_ACTION_REJECT: "Afwijzen" + SELECT_ACTION_VACATION_MESSAGE: "Afwezigheidbericht" + SELECT_ACTION_DISCARD: "Gooi weg" + SELECT_FIELD_FROM: "Van" + SELECT_FIELD_RECIPIENTS: "Ontvanger(s) (Aan of CC)" + SELECT_FIELD_SUBJECT: "Onderwerp" + SELECT_FIELD_HEADER: "Berichtkop" + SELECT_FIELD_SIZE: "Grootte" + SELECT_TYPE_CONTAINS: "Bevat" + SELECT_TYPE_NOT_CONTAINS: "Bevat niet" + SELECT_TYPE_MATCHES: "Komt overeen met (* and ? supported)" + SELECT_TYPE_NOT_MATCHES: "Komt niet overeen met (* and ? supported)" + SELECT_TYPE_REGEXP: "Reguliere expressie (Regexp)" + SELECT_TYPE_NOT_REGEXP: "Niet reguliere expressie (Regexp)" + SELECT_TYPE_EQUAL_TO: "Gelijk aan" + SELECT_TYPE_NOT_EQUAL_TO: "Niet gelijk aan" + SELECT_TYPE_OVER: "Meer dan" + SELECT_TYPE_UNDER: "Minder dan" + SELECT_MATCH_ANY: "Komt overeen met een van de volgende voorwaarden" + SELECT_MATCH_ALL: "Komt overeen met alle voorwaarden" + MARK_AS_READ_LABEL: "Markeer als gelezen" + REPLY_INTERVAL_LABEL: "Antwoord interval (dagen)" + KEEP_LABEL: "Behoud" + STOP_LABEL: "Stop niet met uitvoeren van volgende filters" + EMAIL_LABEL: "E-mail" + VACATION_SUBJECT_LABEL: "Onderwerp (optioneel)" + VACATION_MESSAGE_LABEL: "Bericht" + VACATION_RECIPIENTS_LABEL: "Ontvangers (comma gescheiden)" + REJECT_MESSAGE_LABEL: "Afwijsbericht" + ALL_INCOMING_MESSAGES_DESC: "Alle inkomende berichten" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Selecteer systeem mappen" + SELECT_CHOOSE_ONE: "Kies één" + SELECT_UNUSE_NAME: "Niet gebruiken" + LABEL_SENT: "Verzonden items" + LABEL_DRAFTS: "Concepten" + LABEL_SPAM: "Ongewenste e-mail" + LABEL_TRASH: "Verwijderde items" + LABEL_ARCHIVE: "Archief" + BUTTON_CANCEL: "Annuleer" + BUTTON_CLOSE: "Sluiten" + NOTIFICATION_SENT: | + U heeft nog geen "Verzonden items" folder aangeduid waar de berichten geplaatst worden na het versturen. + Indien u geen verzonden berichten wilt bewaren, kies de "Niet gebruiken" optie. + NOTIFICATION_DRAFTS: "U heeft nog geen \"Concepten\" folder aangeduid waar de berichten bewaard worden tijdens het opstellen." + NOTIFICATION_SPAM: | + U heeft nog geen "Ongewenste e-mail" folder aangeduid waar de spam berichten geplaatst worden. + Indien u berichten permanent wilt verwijderen, kies de "Niet gebruiken" optie. + NOTIFICATION_TRASH: | + U heeft nog geen "Verwijderde items" folder aangeduid waar de verwijderde berichten geplaatst worden. + Indien u berichten permanent wilt verwijderen, kies de "Niet gebruiken" optie. + NOTIFICATION_ARCHIVE: "U heeft nog geen \"Archief\" map aangeduid waar de gearchiveerde berichten geplaatst worden." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "2-Stap verificatie" + LABEL_ENABLE_TWO_FACTOR: "Gebruik 2-Stap verificatie" + LABEL_TWO_FACTOR_USER: "Gebruikersnaam" + LABEL_TWO_FACTOR_STATUS: "Status" + LABEL_TWO_FACTOR_SECRET: "Geheime sleutel" + LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" + BUTTON_CREATE: "Nieuwe geheime sleutel aanmaken" + BUTTON_ACTIVATE: "Activate" + BUTTON_CLEAR: "Wissen" + BUTTON_LOGOUT: "Logout" + BUTTON_DONE: "Klaar" + BUTTON_TEST: "Test" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Bekijk geheime sleutel" + BUTTON_HIDE_SECRET: "Verberg geheime sleutel" + TWO_FACTOR_REQUIRE_DESC: "Uw account vereist 2-Stap verificatie configuratie." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Geconfigureerd" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Niet geconfigureerd" + TWO_FACTOR_SECRET_DESC: >- + Importeer deze informatie in uw Google Authenticator-client (of andere TOTP-client) + door gebruik te maken van de QR code hier beneden of door de code handmatig + in te voeren. + TWO_FACTOR_BACKUP_CODES_DESC: >- + Als u geen codes ontvangt via de Google Authenticator kunt u de backup codes + gebruiken om in te loggen. Na gebruik van de backup code wordt deze inactief. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "U kunt 2-stap verificatie niet activeren voordat u het succesvol getest heeft." + TITLES: + LOADING: "Ophalen..." + LOGIN: "Inloggen" + MAILBOX: "Mailbox" + SETTINGS: "Instellingen" + COMPOSE: "Opstellen" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Bestand is te groot" + ERROR_FILE_PARTIALLY_UPLOADED: "Bestand is slechts deels geüpload door onbekende oorzaak" + ERROR_NO_FILE_UPLOADED: "Geen bestand geüpload" + ERROR_MISSING_TEMP_FOLDER: "Tijdelijk bestand ontbreekt" + ERROR_ON_SAVING_FILE: "Onbekende fout bij het opslaan van het bestand" + ERROR_FILE_TYPE: "Onjuist bestandstype" + ERROR_UNKNOWN: "Er is een onbekende fout opgetreden" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEKST" + TEXT_SWITCHER_RICH_FORMATTING: "Tekst met opmaak" + TEXT_SWITCHER_CONFIRM: "Tekst opmaak zal verloren gaan. Wenst u verder te gaan?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Persoonlijk" + LABEL_GENERAL_NAME: "Algemeen" + LABEL_CONTACTS_NAME: "Contactpersonen" + LABEL_FOLDERS_NAME: "Mappen" + LABEL_ACCOUNTS_NAME: "Accounts" + LABEL_IDENTITY_NAME: "Identiteit" + LABEL_IDENTITIES_NAME: "Identiteiten" + LABEL_FILTERS_NAME: "Filters" + LABEL_TEMPLATES_NAME: "Templates" + LABEL_SECURITY_NAME: "Beveiliging" + LABEL_SOCIAL_NAME: "Social" + LABEL_THEMES_NAME: "Thema's" + LABEL_CHANGE_PASSWORD_NAME: "Wachtwoord" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Terug" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filters" + BUTTON_SAVE: "Opslaan" + BUTTON_ADD_FILTER: "Filter toevoegen" + BUTTON_DELETE: "Verwijder" + BUTTON_RAW_SCRIPT: "Maak een custom script" + SUBNAME_NONE: "Geen" + SUBNAME_MOVE_TO: "Verplaats naar map \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Doorsturen naar \"%EMAIL%\"" + SUBNAME_REJECT: "Afwijzen" + SUBNAME_VACATION_MESSAGE: "Afwezigheidsbericht" + SUBNAME_DISCARD: "Gooi weg" + CAPABILITY_LABEL: "Mogelijkheden" + LOADING_PROCESS: "Bezig met updaten van de filter lijst" + DELETING_ASK: "Weet u het zeker?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Wijzigingen moeten nog opgeslagen worden op de server." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identiteit" + LABEL_DISPLAY_NAME: "Naam" + LABEL_REPLY_TO: "Antwoordadres" + LABEL_SIGNATURE: "Handtekening" + LABEL_ADD_SIGNATURE_TO_ALL: "Handtekening standaard toevoegen aan bericht" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Beveiliging" + LABEL_CONFIGURE_TWO_FACTOR: "Configureer 2-stap verificatie" + LABEL_AUTOLOGOUT: "Automatisch uitloggen" + AUTOLOGIN_NEVER_OPTION_NAME: "Nooit" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minuten" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% uur" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Algemeen" + LABEL_LANGUAGE: "Taal" + LABEL_IDENTITY: "Identiteit" + LABEL_LAYOUT: "Indeling" + LABEL_LAYOUT_NO_SPLIT: "Geen splitsing" + LABEL_LAYOUT_VERTICAL_SPLIT: "Verticale splitsing" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontale splitsing" + LABEL_EDITOR: "Standaard tekst editor" + LABEL_EDITOR_HTML: "HTML" + LABEL_EDITOR_PLAIN: "Platte tekst" + LABEL_EDITOR_HTML_FORCED: "Html (geforceerd)" + LABEL_EDITOR_PLAIN_FORCED: "Platte tekst (geforceerd)" + LABEL_ANIMATION: "Interface animatie" + LABEL_ANIMATION_FULL: "Volledig" + LABEL_ANIMATION_NORMAL: "Normaal" + LABEL_ANIMATION_NONE: "Geen" + LABEL_VIEW_OPTIONS: "Bekijk opties" + LABEL_USE_PREVIEW_PANE: "Toon leesvenster" + LABEL_USE_CHECKBOXES_IN_LIST: "Toon selectievakjes in de lijst" + LABEL_USE_THREADS: "Groepeer berichten" + LABEL_REPLY_SAME_FOLDER: "Plaats antwoorden in de map van het originele bericht" + LABEL_SHOW_IMAGES: "Afbeeldingen altijd weergeven in het bericht" + LABEL_SHOW_ANIMATION: "Toon animaties" + LABEL_MESSAGE_PER_PAGE: "Berichten op pagina" + LABEL_NOTIFICATIONS: "Notificaties" + LABEL_SOUND_NOTIFICATION: "Notificatie geluid" + LABEL_CHROME_NOTIFICATION_DESC: "Toon nieuwe berichten popup" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Geblokkeerd door de browser)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Contactpersonen" + LABEL_CONTACTS_AUTOSAVE: "Automatisch ontvangers toevoegen aan uw adresboek" + LEGEND_CONTACTS_SYNC: "Server Synchronisatie (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Server synchronisatie inschakelen" + LABEL_CONTACTS_SYNC_SERVER: "Server" + LABEL_CONTACTS_SYNC_AB_URL: "Adresboek URL" + LABEL_CONTACTS_SYNC_USER: "Gebruikersnaam" + LABEL_CONTACTS_SYNC_PASSWORD: "Wachtwoord" + SETTINGS_THEMES: + LEGEND_THEMES: "Thema's" + LEGEND_THEMES_CUSTOM: "Aangepaste thema configuratie" + LABEL_CUSTOM_TYPE: "Soort" + LABEL_CUSTOM_TYPE_LIGHT: "Licht" + LABEL_CUSTOM_TYPE_DARK: "Donker" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Achtergrond" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Upload achtergrond afbeelding (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Bestand is te groot" + ERROR_FILE_TYPE_ERROR: "Onjuist bestandstype (alleen JPG and PNG)" + ERROR_UNKNOWN: "Er is een onbekende fout opgetreden" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Via Google verbinden" + BUTTON_GOOGLE_DISCONNECT: "Verbinding met Google verbreken" + MAIN_GOOGLE_DESC: "Na activatie van inloggen via Google kunt u hiermee inloggen d.m.v. de Google knop op het login scherm." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Via Facebook verbinden" + BUTTON_FACEBOOK_DISCONNECT: "Verbinding met Facebook verbreken" + MAIN_FACEBOOK_DESC: "Na activatie van inloggen via Facebook kunt u hiermee inloggen d.m.v. de Google knop op het login scherm." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Via Twitter verbinden" + BUTTON_TWITTER_DISCONNECT: "Verbinding via Twitter verbreken" + MAIN_TWITTER_DESC: "Na activatie van inloggen via Twitter kunt u hiermee inloggen d.m.v. de Google knop op het login scherm." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Mappen lijst" + BUTTON_CREATE: "Maak een map" + BUTTON_SYSTEM: "Systeem mappen" + BUTTON_DELETE: "Verwijder" + BUTTON_SUBSCRIBE: "Abonneer" + BUTTON_UNSUBSCRIBE: "Abonnement opzeggen" + LOADING_PROCESS: "Mappen lijst aan het bijwerken" + CREATING_PROCESS: "Map aan het aanmaken" + DELETING_PROCESS: "Map aan het wissen" + RENAMING_PROCESS: "Map hernoemen" + DELETING_ASK: "Weet u het zeker?" + TO_MANY_FOLDERS_DESC_1: "U heeft te veel mappen!" + TO_MANY_FOLDERS_DESC_2: "Er worden er maar een deel weergegeven om prestatieproblemen te voorkomen." + HELP_DELETE_FOLDER: "Verwijder map" + HELP_SHOW_HIDE_FOLDER: "Toon/verberg map" + HELP_CHECK_FOR_NEW_MESSAGES: "Controleer wel of niet op nieuwe berichten" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Account Lijst" + LEGEND_IDENTITIES: "Identiteiten" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts en Identiteiten" + BUTTON_ADD_ACCOUNT: "Account toevoegen" + BUTTON_ADD_IDENTITY: "Identiteit toevoegen" + BUTTON_DELETE: "Wissen" + LOADING_PROCESS: "Account lijst aan het bijwerken" + DELETING_ASK: "Weet u het zeker?" + DEFAULT_IDENTITY_LABEL: "standaard" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identiteit" + LEGEND_IDENTITIES: "Additionele Identiteit" + LABEL_DEFAULT: "Standaard" + LABEL_DISPLAY_NAME: "Naam" + LABEL_REPLY_TO: "Antwoordadres" + LABEL_SIGNATURE: "Handtekening" + LABEL_ADD_SIGNATURE_TO_ALL: "Handtekening standaard toevoegen aan bericht" + BUTTON_ADD_IDENTITY: "Identiteit toevoegen" + BUTTON_DELETE: "Verwijder" + LOADING_PROCESS: "Identiteit lijst bijwerken" + DELETING_ASK: "Weet u het zeker?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Wachtwoord aanpassen" + LABEL_CURRENT_PASSWORD: "Huidig wachtwoord" + LABEL_NEW_PASSWORD: "Nieuw wachtwoord" + LABEL_REPEAT_PASSWORD: "Bevestig wachtwoord" + BUTTON_UPDATE_PASSWORD: "Wachtwoord wijzigen" + ERROR_PASSWORD_MISMATCH: "Wachtwoorden zijn niet gelijk, probeer opnieuw" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Importeer OpenPGP sleutel" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Genereer OpenPGP sleutels" + TITLE_PRIVATE: "Privé sleutel" + TITLE_PUBLIC: "Publieke sleutel" + DELETING_ASK: "Weet u het zeker?" + GENERATE_ONLY_HTTPS: "Alleen HTTPS" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Hulp bij toetsenbord sneltoetsen" + TAB_MAILBOX: "Mailbox" + TAB_MESSAGE_LIST: "Berichtenlijst" + TAB_MESSAGE_VIEW: "Bericht leesvenster" + TAB_COMPOSE: "Opstellen" + LABEL_OPEN_USER_DROPDOWN: "Open gebruikers menu" + LABEL_REPLY: "Beantwoord" + LABEL_REPLY_ALL: "Alle beantwoorden" + LABEL_FORWARD: "Doorsturen" + LABEL_FORWARD_MULTIPLY: "Doorsturen als bijlage(n)" + LABEL_HELP: "Help" + LABEL_CHECK_ALL: "Selecteer alle berichten" + LABEL_ARCHIVE: "Archiveren" + LABEL_DELETE: "Verwijderen" + LABEL_OPEN_THREAD: "Open geselecteerde berichtenlijst" + LABEL_MOVE: "Verplaatsen" + LABEL_READ: "Markeer geselecteerde berichten als gelezen" + LABEL_UNREAD: "Markeer geselecteerde berichten als ongelezen" + LABEL_IMPORTANT: "Belangrijk, vlag geselecteerde berichten" + LABEL_SEARCH: "Zoeken" + LABEL_CANCEL_SEARCH: "Zoekopdracht afbreken" + LABEL_FULLSCREEN_ENTER: "Bericht in volledig scherm lezen(leesvenster ingeschakeld)" + LABEL_VIEW_MESSAGE_ENTER: "Bericht lezen (leesvenster uitgeschakeld)" + LABEL_SWITCH_TO_MESSAGE: "Schakel focus naar bericht" + LABEL_SWITCH_TO_FOLDER_LIST: "Schakel focus naar berichtenlijst" + LABEL_FULLSCREEN_TOGGLE: "Schakel tussen normaal en lezen in volledig scherm" + LABEL_BLOCKQUOTES_TOGGLE: "Schakel blok citaten aan of uit" + LABEL_THREAD_NEXT: "Volgende bericht in groep" + LABEL_THREAD_PREV: "Vorige bericht in groep" + LABEL_PRINT: "Afdrukken" + LABEL_EXIT_FULLSCREEN: "Volledig scherm sluiten" + LABEL_CLOSE_MESSAGE: "Bericht sluiten (leesvenster uitgeschakeld)" + LABEL_SWITCH_TO_LIST: "Schakel focus terug naar berichtenlijst" + LABEL_OPEN_COMPOSE_POPUP: "Open nieuw bericht venster" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identiteiten menu" + LABEL_SAVE_MESSAGE: "Concept opslaan" + LABEL_SEND_MESSAGE: "Bericht versturen" + LABEL_CLOSE_COMPOSE: "Nieuw bericht venster sluiten" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "Geen publieke sleutels gevonden" + NO_PUBLIC_KEYS_FOUND_FOR: "Geen publieke sleutels gevonden voor e-mail adres \"%EMAIL%\"" + NO_PRIVATE_KEY_FOUND: "Geen privé sleutel gevonden" + NO_PRIVATE_KEY_FOUND_FOR: "Geen privé sleutel gevonden voor e-mail adres \"%EMAIL%\"" + ADD_A_PUBLICK_KEY: "Voeg een publieke sleutel toe" + SELECT_A_PRIVATE_KEY: "Selecteer een privé sleutel" + UNVERIFIRED_SIGNATURE: "Ongeverifieerde handtekening" + DECRYPTION_ERROR: "OpenPGP decryptie fout" + GOOD_SIGNATURE: "Juiste handtekening van %USER%" + PGP_ERROR: "OpenPGP foutmelding: %ERROR%" + SPECIFY_FROM_EMAIL: "Geef a.u.b. een VAN e-mail adres op" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Geef a.u.b. minimaal één ontvanger op" + NOTIFICATIONS: + INVALID_TOKEN: "Ongeldige token" + AUTH_ERROR: "Authenticatie mislukt" + ACCESS_ERROR: "Toegangsfout" + CONNECTION_ERROR: "Kan geen verbinding maken met de Server" + CAPTCHA_ERROR: "Onjuiste CAPTCHA" + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Deze social ID is nog niet aan een e-mail account gekoppeld. Log in met e-mail + adres en wachtwoord en schakel deze functie in in het account instellingen + menu. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Deze social ID is nog niet aan een e-mail account gekoppeld. Log in met e-mail + adres en wachtwoord en schakel deze functie in in het account instellingen + menu. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Deze social ID is nog niet aan een e-mail account gekoppeld. Log in met e-mail + adres en wachtwoord en schakel deze functie in in het account instellingen + menu. + DOMAIN_NOT_ALLOWED: "Domein is niet toegestaan" + ACCOUNT_NOT_ALLOWED: "Account is niet toegestaan" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2-Stap verificatie vereist" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2-Stap verificatie fout" + COULD_NOT_SAVE_NEW_PASSWORD: "Nieuwe wachtwoord kon niet opgeslagen worden" + CURRENT_PASSWORD_INCORRECT: "Huidig wachtwoord onjuist" + NEW_PASSWORD_SHORT: "Wachtwoord is te kort" + NEW_PASSWORD_WEAK: "Wachtwoord is te makkelijk" + NEW_PASSWORD_FORBIDDENT: "Wachtwoord bevat verboden tekens" + CONTACTS_SYNC_ERROR: "Contactpersonen synchronisatie fout" + CANT_GET_MESSAGE_LIST: "Berichtenlijst kan niet worden opgehaald" + CANT_GET_MESSAGE: "Bericht kan niet worden opgehaald" + CANT_DELETE_MESSAGE: "Kan bericht niet verwijderen" + CANT_MOVE_MESSAGE: "Kan bericht niet verplaatsen" + CANT_SAVE_MESSAGE: "Kan bericht niet opslaan" + CANT_SEND_MESSAGE: "Kan bericht niet verzenden" + INVALID_RECIPIENTS: "Onjuiste ontvangers" + CANT_SAVE_FILTERS: "Kan filters niet opslaan" + CANT_GET_FILTERS: "Kan filters niet ophalen" + FILTERS_ARE_NOT_CORRECT: "Filters zijn onjuist" + CANT_CREATE_FOLDER: "Kan map niet aanmaken" + CANT_RENAME_FOLDER: "Kan map niet hernoemen" + CANT_DELETE_FOLDER: "Kan map niet verwijderen" + CANT_DELETE_NON_EMPTY_FOLDER: "Een niet lege map kan niet verwijderd worden" + CANT_SUBSCRIBE_FOLDER: "Kan niet abonneren op folder" + CANT_UNSUBSCRIBE_FOLDER: "Kan abonnement op folder niet opzeggen" + CANT_SAVE_SETTINGS: "Instellingen kunnen niet opgeslagen worden" + CANT_SAVE_PLUGIN_SETTINGS: "Instellingen kunnen niet opgeslagen worden" + DOMAIN_ALREADY_EXISTS: "Domein bestaat reeds" + CANT_INSTALL_PACKAGE: "Package installeren mislukt" + CANT_DELETE_PACKAGE: "Package verwijderen mislukt" + INVALID_PLUGIN_PACKAGE: "Ongeldig plug-in package" + UNSUPPORTED_PLUGIN_PACKAGE: "Niet ondersteund plug-in package" + LICENSING_SERVER_IS_UNAVAILABLE: "Licentie Server is niet beschikbaar" + LICENSING_DOMAIN_EXPIRED: "Licentie voor dit domein is verlopen" + LICENSING_DOMAIN_BANNED: "Licentie voor dit domein is verboden" + DEMO_SEND_MESSAGE_ERROR: "Vanwege beveiliging is het niet toegestaan dat deze demo account e-mail naar extern verzend!" + DEMO_ACCOUNT_ERROR: "Vanwege beveiliging is deze actie niet toegestaan voor deze account!" + ACCOUNT_ALREADY_EXISTS: "Account bestaat al" + ACCOUNT_DOES_NOT_EXIST: "Account bestaat niet." + MAIL_SERVER_ERROR: "Fout bij toegang tot de mail Server" + INVALID_INPUT_ARGUMENT: "Ongeldig invoer argument" + UNKNOWN_ERROR: "Er is een onbekende fout opgetreden" + STATIC: + BACK_LINK: "Opnieuw laden" + DOMAIN_LIST_DESC: "Lijst van webmail domeinen die toegankelijk zijn" + PHP_EXSTENSIONS_ERROR_DESC: "Vereiste PHP extensies zijn niet beschikbaar in uw PHP configuratie!" + PHP_VERSION_ERROR_DESC: "Uw PHP versie (%VERSION%) is lager dan de minimaal vereiste 5.3.0!" + NO_SCRIPT_TITLE: "JavaScript is benodigd voor deze applicatie" + NO_SCRIPT_DESC: | + JavaScript ondersteuning is niet beschikbaar in uw browser. + Gelieve Javascript in te schakelen en opnieuw te proberen. + NO_COOKIE_TITLE: "Cookies ondersteuning is nodig voor deze applicatie" + NO_COOKIE_DESC: | + Cookies ondersteuning is niet beschikbaar in uw browser. + Gelieve Cookies in te schakelen en opnieuw te proberen. + BAD_BROWSER_TITLE: "Uw browser is verouderd" + BAD_BROWSER_DESC: | + Om alle functies van deze applicatie te gebruiken, + download en installeer een van de volgende browsers: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pl_PL.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pl_PL.yml new file mode 100755 index 00000000..5fa1378a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pl_PL.yml @@ -0,0 +1,712 @@ +pl_PL: + LOGIN: + LABEL_EMAIL: "Adres e-mail" + LABEL_LOGIN: "Login" + LABEL_PASSWORD: "Hasło" + LABEL_SIGN_ME: "Zapamiętaj mnie" + LABEL_VERIFICATION_CODE: "Kod weryfikujący" + LABEL_DONT_ASK_VERIFICATION_CODE: "Nie pytaj o kod przez 2 tygodnie" + BUTTON_SIGN_IN: "Zaloguj" + TITLE_SIGN_IN_GOOGLE: "Zaloguj się przez Google" + TITLE_SIGN_IN_FACEBOOK: "Zaloguj się przez Facebook" + TITLE_SIGN_IN_TWITTER: "Zaloguj się przez Twitter" + LABEL_FORGOT_PASSWORD: "Zapomniałem hasło" + LABEL_REGISTRATION: "Rejestracja" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Dodaj konto" + BUTTON_SETTINGS: "Ustawienia" + BUTTON_HELP: "Pomoc" + BUTTON_LOGOUT: "Wyloguj" + MOBILE: + BUTTON_MOBILE_VERSION: "Wersja mobilna" + BUTTON_DESKTOP_VERSION: "Wersja desktopowa" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Szukaj" + TITLE_ADV: "Wyszukiwanie zaawansowane" + LABEL_ADV_FROM: "Od:" + LABEL_ADV_TO: "Do:" + LABEL_ADV_SUBJECT: "Temat:" + LABEL_ADV_TEXT: "Tekst:" + LABEL_ADV_HAS_ATTACHMENT: "Załącznik" + LABEL_ADV_HAS_ATTACHMENTS: "Ma załączniki" + LABEL_ADV_FLAGGED: "Oznaczona" + LABEL_ADV_UNSEEN: "Nieprzeczytana" + LABEL_ADV_DATE: "Data:" + LABEL_ADV_DATE_ALL: "wszystkie" + LABEL_ADV_DATE_3_DAYS: "do 3 dni" + LABEL_ADV_DATE_7_DAYS: "do tygodnia" + LABEL_ADV_DATE_MONTH: "do miesiąca" + LABEL_ADV_DATE_3_MONTHS: "do 3 miesięcy" + LABEL_ADV_DATE_6_MONTHS: "do 6 miesięcy" + LABEL_ADV_DATE_YEAR: "do roku" + BUTTON_ADV_SEARCH: "Szukaj" + PREVIEW_POPUP: + FULLSCREEN: "Pełny ekran" + ZOOM: "Przybliż/oddal" + CLOSE: "Zamknij (Esc)" + LOADING: "Ładowanie..." + GALLERY_PREV: "Poprzedni (strzałka w lewo)" + GALLERY_NEXT: "Następny (strzałka w prawo)" + GALLERY_COUNTER: "%curr% z: %total%" + IMAGE_ERROR: "Nie można załadować obrazu." + AJAX_ERROR: "Nie można załadować zawartości." + FOLDER_LIST: + BUTTON_COMPOSE: "Utwórz" + BUTTON_CONTACTS: "Kontakty" + BUTTON_NEW_MESSAGE: "Nowa wiadomość" + INBOX_NAME: "Odebrane" + SENT_NAME: "Wysłane" + DRAFTS_NAME: "Wersje robocze" + SPAM_NAME: "Wiadomości śmieci - SPAM" + TRASH_NAME: "Kosz" + ARCHIVE_NAME: "Archiwum" + QUOTA: + TITLE: "Wykorzystanie miejsca" + MESSAGE_LIST: + BUTTON_RELOAD: "Odśwież" + BUTTON_MOVE_TO: "Przenieś" + BUTTON_DELETE: "Usuń" + BUTTON_ARCHIVE: "Archiwizuj" + BUTTON_SPAM: "Oznacz jako SPAM" + BUTTON_NOT_SPAM: "Oznacz jako pożądane" + BUTTON_EMPTY_FOLDER: "Usuń zawartość folderu" + BUTTON_MULTY_FORWARD: "Przekaż dalej" + BUTTON_DELETE_WITHOUT_MOVE: "Usuń (pernamentnie)" + BUTTON_MORE: "Więcej" + MENU_SET_SEEN: "Oznacz jako przeczytane" + MENU_SET_ALL_SEEN: "Oznacz wszystkie jako przeczytane" + MENU_UNSET_SEEN: "Oznacz jako nieprzeczytane" + MENU_SET_FLAG: "Oznacz jako ważne" + MENU_UNSET_FLAG: "Oznacz jako nieważne" + MENU_SELECT_ALL: "Wszystkie" + MENU_SELECT_NONE: "Żadne" + MENU_SELECT_INVERT: "Odwróć zaznaczenie" + MENU_SELECT_UNSEEN: "Nieprzeczytane" + MENU_SELECT_SEEN: "Przeczytane" + MENU_SELECT_FLAGGED: "Oznaczone jako ważne" + MENU_SELECT_UNFLAGGED: "Oznaczone jako nieważne" + EMPTY_LIST: "Pusta lista" + EMPTY_SEARCH_LIST: "Brak wiadomości spełniających kryteria wyszukiwania" + SEARCH_RESULT_FOR: "Wyniki wyszukiwania dla: \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "powrót do listy wiadomości" + LIST_LOADING: "Ładowanie..." + EMPTY_SUBJECT_TEXT: "(Brak tematu)" + PUT_MESSAGE_HERE: "Przeciągnij tutaj wiadomość, żeby zobaczyć ją na liście" + TODAY_AT: "dzisiaj: %TIME%" + YESTERDAY_AT: "wczoraj: %TIME%" + SEARCH_PLACEHOLDER: "Szukaj" + NEW_MESSAGE_NOTIFICATION: "Masz: %COUNT% now(-ą,-e,-ych) wiadomości!" + QUOTA_SIZE: "Wykorzystano: %SIZE% (%PROC%%) z: %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Edytuj" + BUTTON_BACK: "Wstecz" + BUTTON_CLOSE: "Zamknij" + BUTTON_DELETE: "Usuń" + BUTTON_UNSUBSCRIBE: "Zrezygnuj z subskrypcji" + BUTTON_ARCHIVE: "Archiwizuj" + BUTTON_SPAM: "Oznacz jako niechcianą" + BUTTON_NOT_SPAM: "Oznacz jako pożądaną" + BUTTON_MOVE_TO: "Przenieś" + BUTTON_MORE: "Więcej" + BUTTON_REPLY: "Odpowiedz" + BUTTON_REPLY_ALL: "Odpowiedz wszystkim" + BUTTON_FORWARD: "Przekaż dalej" + BUTTON_FORWARD_AS_ATTACHMENT: "Przekaż jako załącznik" + BUTTON_EDIT_AS_NEW: "Zredaguj jako nową wiadomość" + BUTTON_SHOW_IMAGES: "Wyświetl obrazy" + BUTTON_NOTIFY_READ_RECEIPT: "Nadawca prosi o potwierdzenie odczytania tej wiadomości" + BUTTON_IN_NEW_WINDOW: "Wyświetl w osobnym oknie" + BUTTON_THREAD_LIST: "Lista wątków" + BUTTON_THREAD_PREV: "Poprzedni" + BUTTON_THREAD_NEXT: "Następny" + BUTTON_THREAD_MORE: "Więcej wiadomości" + MENU_HEADERS: "Pokaż nagłówki wiadomości" + MENU_VIEW_ORIGINAL: "Pokaż zródło" + MENU_DOWNLOAD_ORIGINAL: "Pobierz jako plik eml" + MENU_FILTER_SIMILAR: "Filtruj podobne wiadomości" + MENU_PRINT: "Drukuj" + EMPTY_SUBJECT_TEXT: "(Brak tematu)" + LABEL_SUBJECT: "Temat" + LABEL_DATE: "Data" + LABEL_FROM: "Od" + LABEL_FROM_SHORT: "Od" + LABEL_TO: "Do" + LABEL_TO_SHORT: "Do" + LABEL_CC: "Kopia" + LABEL_BCC: "Ukr. kopia" + LABEL_REPLY_TO: "Zwrot do" + PRINT_LABEL_FROM: "Od" + PRINT_LABEL_TO: "Do" + PRINT_LABEL_CC: "Kopia" + PRINT_LABEL_BCC: "Ukr. kopia" + PRINT_LABEL_REPLY_TO: "Zwrot do" + PRINT_LABEL_DATE: "Data" + PRINT_LABEL_SUBJECT: "Temat" + PRINT_LABEL_ATTACHMENTS: "Załączniki" + MESSAGE_LOADING: "Ładowanie wiadomości..." + MESSAGE_VIEW_DESC: "Wybierz wiadomość do wyświetlenia" + PGP_PASSWORD_INPUT_PLACEHOLDER: "Hasło" + PGP_SIGNED_MESSAGE_DESC: "Podpisana" + PGP_ENCRYPTED_MESSAGE_DESC: "Zaszyfrowana" + LINK_DOWNLOAD_AS_ZIP: "Pobierz jako plik zip" + LINK_SAVE_TO_OWNCLOUD: "Zapisz w ownCloud" + LINK_SAVE_TO_DROPBOX: "Zapisz w Dropbox-ie" + READ_RECEIPT: + SUBJECT: "Potwierdzenie wyświetlenia wiadomości o tytule: %SUBJECT%" + BODY: | + Potwierdzenie wyświetlenia wiadomości wysłanej na adres: %READ-RECEIPT%. + + Uwaga: Otrzymanie tego potwierdzenia jest dowodem na to, że wiadomość została wyświetlona na komputerze odbiorcy. + Nie ma jednak żadnej gwarancji, że odbiorca faktycznie zapoznał się z jej treścią. + SUGGESTIONS: + SEARCHING_DESC: "Wyszukiwanie..." + CONTACTS: + LEGEND_CONTACTS: "Kontakty" + SEARCH_INPUT_PLACEHOLDER: "Szukaj" + BUTTON_ADD_CONTACT: "Dodaj Kontakt" + BUTTON_CREATE_CONTACT: "Utwórz" + BUTTON_UPDATE_CONTACT: "Zaktualizuj" + BUTTON_IMPORT: "Importuj (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Eksportuj (vcf, vCard)" + BUTTON_EXPORT_CSV: "Eksportuj (csv)" + ERROR_IMPORT_FILE: "Błąd importu (nieprawidłowy format pliku)" + LIST_LOADING: "Ładowanie..." + EMPTY_LIST: "Brak kontaktów" + EMPTY_SEARCH: "Nie znaleziono żadnych kontaktów" + CLEAR_SEARCH: "Wyczyść wyniki" + CONTACT_VIEW_DESC: "Wybierz kontakt do wyświetlenia" + LABEL_DISPLAY_NAME: "Nazwa:" + LABEL_EMAIL: "Adres e-mail:" + LABEL_PHONE: "Telefon:" + LABEL_WEB: "Strona WWW:" + LABEL_BIRTHDAY: "Urodziny:" + LINK_ADD_EMAIL: "Dodaj adres e-mail" + LINK_ADD_PHONE: "Dodaj nr telefonu" + LINK_BIRTHDAY: "Urodziny" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Nazwa" + PLACEHOLDER_ENTER_LAST_NAME: "Nazwisko" + PLACEHOLDER_ENTER_FIRST_NAME: "Imię" + PLACEHOLDER_ENTER_NICK_NAME: "Pseudonim" + LABEL_READ_ONLY: "Tylko do odczytu" + LABEL_SHARE: "Udostępnij kontakt" + ADD_MENU_LABEL: "Dodaj" + ADD_MENU_NICKNAME: "Pseudonim" + ADD_MENU_NOTES: "Notatki" + ADD_MENU_EMAIL: "Adres e-mail" + ADD_MENU_PHONE: "Telefon" + ADD_MENU_URL: "Adres www" + ADD_MENU_ADDRESS: "Adres" + ADD_MENU_BIRTHDAY: "Urodziny" + ADD_MENU_TAGS: "Tagi" + BUTTON_SHARE_NONE: "Nikomu" + BUTTON_SHARE_ALL: "Wszystkim" + BUTTON_SYNC: "Synchronizacja (CardDAV)" + COMPOSE: + TITLE_FROM: "Od" + TITLE_TO: "Do" + TITLE_CC: "Kopia" + TITLE_BCC: "Ukr. kopia" + TITLE_REPLY_TO: "Zwrot do" + TITLE_SUBJECT: "Temat" + LINK_SHOW_INPUTS: "Pokaż wszystkie pola" + BUTTON_SEND: "Wyślij" + BUTTON_SAVE: "Zapisz" + BUTTON_DELETE: "Usuń" + BUTTON_CANCEL: "Anuluj" + BUTTON_MINIMIZE: "Minimalizuj" + SAVED_TIME: "Zapisane: %TIME%" + SAVED_ERROR_ON_SEND: "Wiadomość została wysłana, ale nie została zapisana w folderze: Wysłane" + DISCARD_UNSAVED_DATA: "Odrzucić niezapisane dane?" + ATTACH_FILES: "Dodaj załącznik" + ATTACH_DROP_FILES_DESC: "Przeciągnij pliki tutaj" + ATTACH_ITEM_CANCEL: "Anuluj" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Dysk Google" + REPLY_MESSAGE_TITLE: "%DATETIME% - %EMAIL%" + FORWARD_MESSAGE_TOP_TITLE: "-------- Przekierowana wiadomość -------" + FORWARD_MESSAGE_TOP_FROM: "Od:" + FORWARD_MESSAGE_TOP_TO: "Do:" + FORWARD_MESSAGE_TOP_CC: "Kopia do:" + FORWARD_MESSAGE_TOP_SENT: "Wysłany:" + FORWARD_MESSAGE_TOP_SUBJECT: "Temat:" + EMPTY_TO_ERROR_DESC: "Wprowadź co najmniej jednego odbiorcę" + NO_ATTACHMENTS_HERE_DESC: "Brak załączników" + ATTACHMENTS_ERROR_DESC: "Ostrzeżenie! Nie wszystkie załaczniki zostały przesłane" + ATTACHMENTS_UPLOAD_ERROR_DESC: "Nie przesłano jeszcze wszystkich załączników" + BUTTON_REQUEST_READ_RECEIPT: "Potwierdzenie wyświetlenia wiadomości" + BUTTON_MARK_AS_IMPORTANT: "Oznacz jako ważną" + BUTTON_OPEN_PGP: "OpenPGP (tylko wiadomości tekstowe)" + BUTTON_REQUEST_DSN: "Potwierdzenie dostarczenia wiadomości" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Zamknij" + POPUPS_ASK: + BUTTON_YES: "Tak" + BUTTON_NO: "Nie" + DESC_WANT_CLOSE_THIS_WINDOW: "Na pewno zamknąć to okno?" + DESC_WANT_DELETE_MESSAGES: "Na pewno usunąć wiadomość(-i)?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Wybierz język" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Dodawanie konta" + BUTTON_ADD_ACCOUNT: "Dodaj" + TITLE_UPDATE_ACCOUNT: "Aktualizacja konta" + BUTTON_UPDATE_ACCOUNT: "Aktualizuj" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Dodawanie tożsamości" + TITLE_UPDATE_IDENTITY: "Aktualizacja tożsamości" + BUTTON_ADD_IDENTITY: "Dodaj" + BUTTON_UPDATE_IDENTITY: "Aktualizuj" + LABEL_EMAIL: "Adres e-mail:" + LABEL_NAME: "Nazwa:" + LABEL_REPLY_TO: "Zwrot do" + LABEL_SIGNATURE: "Podpis:" + LABEL_CC: "Kopia" + LABEL_BCC: "Ukr. kopia" + LABEL_SIGNATURE_INSERT_BEFORE: "Umieść podpis przed cytowanym tekstem" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Tworzenie folderu" + LABEL_NAME: "Nazwa folderu:" + LABEL_PARENT: "Folder nadrzędny:" + BUTTON_CREATE: "Utwórz" + BUTTON_CANCEL: "Anuluj" + BUTTON_CLOSE: "Zamknij" + TITLE_CREATING_PROCESS: "Tworzenie folderu" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Usuwanie wszystkich wiadomości z folderu" + BUTTON_CLEAR: "Usuń wszystkie" + BUTTON_CANCEL: "Anuluj" + BUTTON_CLOSE: "Zamknij" + DANGER_DESC_WARNING: "Ostrzeżenie!" + DANGER_DESC_HTML_1: "Wszystkie wiadomości w folderze: %FOLDER%, zostaną bezpowrotnie usunięte!" + DANGER_DESC_HTML_2: "Po rozpoczęciu, nie można przerwać lub anulować zadania." + TITLE_CLEARING_PROCESS: "Trwa usuwanie wszystkich wiadomości z folderu..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Importowanie klucza OpenPGP" + BUTTON_IMPORT_OPEN_PGP_KEY: "Importuj" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "Klucz OpenPGP" + BUTTON_SELECT: "Zaznacz" + BUTTON_CLOSE: "Zamknij" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Generowanie klucza OpenPGP" + LABEL_EMAIL: "Adres e-mail:" + LABEL_NAME: "Imię i nazwisko:" + LABEL_PASSWORD: "Hasło:" + LABEL_KEY_BIT_LENGTH: "Długość klucza:" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generuj" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "Podpisywanie/szyfrowanie" + LABEL_SIGN: "Podpisz" + LABEL_ENCRYPT: "Szyfruj" + LABEL_PASSWORD: "Hasło:" + BUTTON_SIGN: "Podpisz" + BUTTON_ENCRYPT: "Szyfruj" + BUTTON_SIGN_AND_ENCRYPT: "Podpisz i szyfruj" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" + LABEL_KEY: "Klucz prywatny" + LABEL_PASSWORD: "Password" + BUTTON_DECRYPT: "Decrypt" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "Test autoryzacji dwuskładnikowej" + LABEL_CODE: "Kod" + BUTTON_TEST: "Testuj" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Tworzenie filtra" + TITLE_EDIT_FILTER: "Aktualizacja filtra" + FILTER_NAME: "Nazwa" + LEGEND_CONDITIONS: "Warunki" + LEGEND_ACTIONS: "Działania" + BUTTON_DONE: "Gotowe" + BUTTON_ADD_CONDITION: "Dodaj warunek" + SELECT_ACTION_NONE: "Brak" + SELECT_ACTION_MOVE_TO: "Przenieś" + SELECT_ACTION_FORWARD_TO: "Prześlij dalej" + SELECT_ACTION_REJECT: "Odrzuć" + SELECT_ACTION_VACATION_MESSAGE: "Wiadomość urlopowa" + SELECT_ACTION_DISCARD: "Usuń" + SELECT_FIELD_FROM: "Pole 'Od'" + SELECT_FIELD_RECIPIENTS: "Pole 'Kopia' lub 'Ukr. kopia'" + SELECT_FIELD_SUBJECT: "Pole 'Temat'" + SELECT_FIELD_HEADER: "Nagłówek" + SELECT_FIELD_SIZE: "Rozmiar" + SELECT_TYPE_CONTAINS: "zawiera" + SELECT_TYPE_NOT_CONTAINS: "nie zawiera" + SELECT_TYPE_MATCHES: "zawiera (*,?)" + SELECT_TYPE_NOT_MATCHES: "nie zawiera (*,?)" + SELECT_TYPE_REGEXP: "Wyrażenie regularne:" + SELECT_TYPE_NOT_REGEXP: "Niepoprawne wyrażenie regularne:" + SELECT_TYPE_EQUAL_TO: "Zawiera:" + SELECT_TYPE_NOT_EQUAL_TO: "Nie zawiera:" + SELECT_TYPE_OVER: "powyżej" + SELECT_TYPE_UNDER: "poniżej" + SELECT_MATCH_ANY: "Spełnia dowolny z warunków" + SELECT_MATCH_ALL: "Spełnia wszystkie warunki" + MARK_AS_READ_LABEL: "Oznacz jako przeczytane" + REPLY_INTERVAL_LABEL: "Liczba dni, po których wysłać odp." + KEEP_LABEL: "Zachowaj" + STOP_LABEL: "Nie zatrzymuj przetwarzania reguł" + EMAIL_LABEL: "Adres e-mail" + VACATION_SUBJECT_LABEL: "Temat (opcjonalnie)" + VACATION_MESSAGE_LABEL: "Wiadomość" + VACATION_RECIPIENTS_LABEL: "Odbiorcy (rodzielone przecinkami)" + REJECT_MESSAGE_LABEL: "Powód odrzucenia" + ALL_INCOMING_MESSAGES_DESC: "Wszystkie przychodzące wiadomości" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Wybieranie folderów systemowych" + SELECT_CHOOSE_ONE: "wybierz" + SELECT_UNUSE_NAME: "nie używaj" + LABEL_SENT: "Wysłane:" + LABEL_DRAFTS: "Wersje robocze:" + LABEL_SPAM: "Niechciane:" + LABEL_TRASH: "Kosz:" + LABEL_ARCHIVE: "Archiwum:" + BUTTON_CANCEL: "Anuluj" + BUTTON_CLOSE: "Zamknij" + NOTIFICATION_SENT: | + Nie wybrano folderu: "Wysłane", do którego przenoszone są wysłane wiadomości. + Jeżeli wysyłane wiadomości nie mają być przechowywane, proszę zaznaczyć opcję: "Nie używaj". + NOTIFICATION_DRAFTS: "Nie wybrano folderu: \"Wersje robocze\", do którego są zapisywane wiadomości w trakcie ich tworzenia." + NOTIFICATION_SPAM: | + Nie wybrano folderu: "Niechciane", do którego przenoszone są niepożadane wiadomości. + Jeżeli niechciane wiadomości mają być usuwane na stałe, proszę o zaznaczenie opcji: "Nie używaj". + NOTIFICATION_TRASH: | + Nie wybrano folderu: "Kosz", do którego przenoszone są wszystkie usunięte wiadomości. + Jeżeli wiadomości mają być usuwane na stałe, proszę o zaznaczenie opcji: "Nie używaj". + NOTIFICATION_ARCHIVE: "Nie został wybrany folder \"Archiwum\", zostanie użyty systemowy folder archiwizacji wiadomości." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "Dwuskładnikowa autoryzacja" + LABEL_ENABLE_TWO_FACTOR: "Włącz dwuskładnikową autoryzację" + LABEL_TWO_FACTOR_USER: "Użytkownik:" + LABEL_TWO_FACTOR_STATUS: "Status:" + LABEL_TWO_FACTOR_SECRET: "Tajna fraza:" + LABEL_TWO_FACTOR_BACKUP_CODES: "Kody zapasowe:" + BUTTON_CREATE: "Utwórz nową frazę" + BUTTON_ACTIVATE: "Aktywuj" + BUTTON_CLEAR: "Wyczyść" + BUTTON_LOGOUT: "Wyloguj" + BUTTON_DONE: "Zamknij" + BUTTON_TEST: "Testuj" + LINK_TEST: "Test" + BUTTON_SHOW_SECRET: "Pokaż frazę" + BUTTON_HIDE_SECRET: "Ukryj frazę" + TWO_FACTOR_REQUIRE_DESC: "Twoje konto wymaga skonfigurowania dwuskładnikowej autoryzacji ." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Skonfigurowana" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Nie skonfigurowana" + TWO_FACTOR_SECRET_DESC: >- + Użyj tych informacji w usłudze Google Authenticator (lub innym kliencie TOTP), + używając poniższego kodu QR lub wpisując kod ręcznie. + TWO_FACTOR_BACKUP_CODES_DESC: >- + Jeżeli nie możesz otrzymać kodu poprzez usługę Google Authenticator, możesz + użyć kodów zapasowych. Po zużyciu kodów, opcja ta będzie nieaktywna. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Nie możesz zmienić tego ustawienia przed jego przetestowaniem." + TITLES: + LOADING: "Ładowanie..." + LOGIN: "Login" + MAILBOX: "Skrzynka Pocztowa" + SETTINGS: "Ustawienia" + COMPOSE: "Utwórz" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Plik jest za duży" + ERROR_FILE_PARTIALLY_UPLOADED: "Z powodu nieokreślonego błędu, plik nie został przesłany w całości" + ERROR_NO_FILE_UPLOADED: "Nie przesłano żadnego pliku" + ERROR_MISSING_TEMP_FOLDER: "Brakuje pliku tymczasowego" + ERROR_ON_SAVING_FILE: "Wystąpił nieoczekiwany błąd w trakcie przesyłania pliku" + ERROR_FILE_TYPE: "Nieprawidłowy typ pliku" + ERROR_UNKNOWN: "Wystąpił nieznany błąd w trakcie przesyłania pliku" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> zwykły tekst" + TEXT_SWITCHER_RICH_FORMATTING: "Wzbogacony format tekstowy" + TEXT_SWITCHER_CONFIRM: "Formatowanie tekstu oraz wszystkie wstawione obrazy zostaną utracone. Czy na pewno chcesz kontynuować?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Osobiste" + LABEL_GENERAL_NAME: "Ogólne" + LABEL_CONTACTS_NAME: "Kontakty" + LABEL_FOLDERS_NAME: "Foldery" + LABEL_ACCOUNTS_NAME: "Konta" + LABEL_IDENTITY_NAME: "Tożsamość" + LABEL_IDENTITIES_NAME: "Tożsamości" + LABEL_FILTERS_NAME: "Filtry" + LABEL_TEMPLATES_NAME: "Szablony" + LABEL_SECURITY_NAME: "Bezpieczeństwo" + LABEL_SOCIAL_NAME: "Sieci społecznościowe" + LABEL_THEMES_NAME: "Motywy" + LABEL_CHANGE_PASSWORD_NAME: "Hasło" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Wstecz" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filtry" + BUTTON_SAVE: "Zapisz" + BUTTON_ADD_FILTER: "Dodaj filtr" + BUTTON_DELETE: "Usuń" + BUTTON_RAW_SCRIPT: "Utwórz własny skrypt użytkownika" + SUBNAME_NONE: "Brak" + SUBNAME_MOVE_TO: "Przenieś do \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Przekaż do \"%EMAIL%\"" + SUBNAME_REJECT: "Odrzuć" + SUBNAME_VACATION_MESSAGE: "Wiadomość urlopowa" + SUBNAME_DISCARD: "Usuń" + CAPABILITY_LABEL: "Możliwości" + LOADING_PROCESS: "Aktualizowanie listy filtrów" + DELETING_ASK: "Czy jesteś pewny(a)?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Zmiany te muszą zostać zapisane na serwerze." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Tożsamość" + LABEL_DISPLAY_NAME: "Imię i nazwisko" + LABEL_REPLY_TO: "Zwrot do" + LABEL_SIGNATURE: "Podpis" + LABEL_ADD_SIGNATURE_TO_ALL: "Dadawaj podpis do wszystkich wiadomości" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Bezpieczeństwo" + LABEL_CONFIGURE_TWO_FACTOR: "Konfiguracja dwuskładnikowej autoryzacji" + LABEL_AUTOLOGOUT: "Auto. wylogowanie:" + AUTOLOGIN_NEVER_OPTION_NAME: "Nidgy" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minut" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% godzina(-y)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Ogólne" + LABEL_LANGUAGE: "Język:" + LABEL_IDENTITY: "Tożsamość:" + LABEL_LAYOUT: "Układ:" + LABEL_LAYOUT_NO_SPLIT: "bez podziału" + LABEL_LAYOUT_VERTICAL_SPLIT: "podział w pionie" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "podział w poziomie" + LABEL_EDITOR: "Format wiadomości:" + LABEL_EDITOR_HTML: "HTML" + LABEL_EDITOR_PLAIN: "zwykły tekst" + LABEL_EDITOR_HTML_FORCED: "HTML (wymuszony)" + LABEL_EDITOR_PLAIN_FORCED: "zwykły tekst (wymuszony)" + LABEL_ANIMATION: "Animacja interfejsu" + LABEL_ANIMATION_FULL: "pełna" + LABEL_ANIMATION_NORMAL: "zwykła" + LABEL_ANIMATION_NONE: "brak" + LABEL_VIEW_OPTIONS: "Opcje wyświetlania" + LABEL_USE_PREVIEW_PANE: "Wyświetl okno podglądu" + LABEL_USE_CHECKBOXES_IN_LIST: "Wyświetl pola zaznaczenia w listach" + LABEL_USE_THREADS: "Używaj wątków" + LABEL_REPLY_SAME_FOLDER: "Umieść odpowiedzi w folderach, z których pochodzą wiadomości" + LABEL_SHOW_IMAGES: "Zawsze wyświetlaj obrazy w wiadomościach" + LABEL_SHOW_ANIMATION: "Użyj animacji" + LABEL_MESSAGE_PER_PAGE: "Wiad. na stronie:" + LABEL_NOTIFICATIONS: "Powiadomienia" + LABEL_SOUND_NOTIFICATION: "Powiadomienia dźwiękowe" + LABEL_CHROME_NOTIFICATION_DESC: "Wyświetlaj powiadomienia o nowych wiadomościach" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Zablokowane przez przeglądarkę)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Kontakty" + LABEL_CONTACTS_AUTOSAVE: "Automatycznie dodaj nieznanych nadawców i odbiorców do książki adresowej" + LEGEND_CONTACTS_SYNC: "Zdalna synchronizacja (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Włącz zdalną synchronizację" + LABEL_CONTACTS_SYNC_SERVER: "Serwer:" + LABEL_CONTACTS_SYNC_AB_URL: "Adres URL:" + LABEL_CONTACTS_SYNC_USER: "Użytkownik:" + LABEL_CONTACTS_SYNC_PASSWORD: "Hasło:" + SETTINGS_THEMES: + LEGEND_THEMES: "Motyw" + LEGEND_THEMES_CUSTOM: "Własny motyw" + LABEL_CUSTOM_TYPE: "Typ" + LABEL_CUSTOM_TYPE_LIGHT: "Jasny" + LABEL_CUSTOM_TYPE_DARK: "Ciemny" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Tło" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Prześlij własne tło (.JPG, .PNG)" + ERROR_FILE_IS_TOO_BIG: "Plik jest za duży (1MB+)" + ERROR_FILE_TYPE_ERROR: "Nieprawidłowy format pliku (obsługiwane są wyłącznie pliki .JPG i .PNG)" + ERROR_UNKNOWN: "Wystąpił nieznany błąd w trakcie przesyłania" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Konto Google" + BUTTON_GOOGLE_CONNECT: "Połącz z Google" + BUTTON_GOOGLE_DISCONNECT: "Odłącz" + MAIN_GOOGLE_DESC: "Po zezwoleniu na logowanie przez: Google, możesz zalogować się na to konto używając przycisku: \"Google\" w panelu logowania." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Połącz z Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Odłącz" + MAIN_FACEBOOK_DESC: "Po zezwoleniu na logowanie przez: Facebook, możesz zalogować się na to konto używając przycisku: \"Facebook\" w panelu logowania." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Połącz z Twitter" + BUTTON_TWITTER_DISCONNECT: "Odłącz" + MAIN_TWITTER_DESC: "Po zezwoleniu na logowanie przez: Twitter, możesz zalogować się na to konto używając przycisku: \"Twitter\" w panelu logowania." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Lista folderów" + BUTTON_CREATE: "Utwórz folder" + BUTTON_SYSTEM: "Foldery systemowe" + BUTTON_DELETE: "Usuń" + BUTTON_SUBSCRIBE: "Subskrybuj" + BUTTON_UNSUBSCRIBE: "Zrezygnuj z subskrypcji" + LOADING_PROCESS: "Aktualizacja listy folderów" + CREATING_PROCESS: "Tworzenie folderu" + DELETING_PROCESS: "Usuwanie folderu" + RENAMING_PROCESS: "Zmiana nazwy folderu" + DELETING_ASK: "Czy na pewno usunąć?" + TO_MANY_FOLDERS_DESC_1: "Masz za dużo folderów!" + TO_MANY_FOLDERS_DESC_2: "Pokazaliśmy tylko część z nich aby uniknąć problemów z wydajnością." + HELP_DELETE_FOLDER: "Usuń folder" + HELP_SHOW_HIDE_FOLDER: "Pokaż/ukryj folder" + HELP_CHECK_FOR_NEW_MESSAGES: "Sprawdzaj/nie sprawdzaj nowych wiadomości" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Konta" + LEGEND_IDENTITIES: "Tożsamości" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Konta i tożsamości" + BUTTON_ADD_ACCOUNT: "Dodaj konto" + BUTTON_ADD_IDENTITY: "Dodaj tożsamość" + BUTTON_DELETE: "Usuń" + LOADING_PROCESS: "Trwa aktualizowanie listy kont" + DELETING_ASK: "Czy na pewno usunąć?" + DEFAULT_IDENTITY_LABEL: "domyślna" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Tożsamość" + LEGEND_IDENTITIES: "Dodatkowe tożsamości" + LABEL_DEFAULT: "Domyślna" + LABEL_DISPLAY_NAME: "Nazwa:" + LABEL_REPLY_TO: "Odpowiedź do:" + LABEL_SIGNATURE: "Podpis:" + LABEL_ADD_SIGNATURE_TO_ALL: "Dodaj podpis do wszystkich wysyłanych wiadomości" + BUTTON_ADD_IDENTITY: "Dodaj tożsamość" + BUTTON_DELETE: "Usuń" + LOADING_PROCESS: "Trwa aktualizowanie listy tożsamości" + DELETING_ASK: "Czy na pewno chcesz usunąć?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Zmiana hasła" + LABEL_CURRENT_PASSWORD: "Aktualne hasło:" + LABEL_NEW_PASSWORD: "Nowe hasło:" + LABEL_REPEAT_PASSWORD: "Powtórz nowe hasło:" + BUTTON_UPDATE_PASSWORD: "Zmień hasło na nowe" + ERROR_PASSWORD_MISMATCH: "Wpisane hasła nie pasują do siebie, proszę spróbować ponownie" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Importuj klucz OpenPGP" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generuj klucz OpenPGP" + TITLE_PRIVATE: "Prywatny" + TITLE_PUBLIC: "Publiczny" + DELETING_ASK: "Czy na pewno chcesz usunąć?" + GENERATE_ONLY_HTTPS: "Tylko HTTPS" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Skróty klawiaturowe" + TAB_MAILBOX: "Skrzynka pocztowa" + TAB_MESSAGE_LIST: "Lista wiadomości" + TAB_MESSAGE_VIEW: "Widok wiadomości" + TAB_COMPOSE: "Tworzenie wiadomości" + LABEL_OPEN_USER_DROPDOWN: "Otwórz podręczne menu użytkownika" + LABEL_REPLY: "Odpowiedz" + LABEL_REPLY_ALL: "Odpowiedz wszystkim" + LABEL_FORWARD: "Przekaż" + LABEL_FORWARD_MULTIPLY: "Przekaż (wielokrotnie)" + LABEL_HELP: "Pomoc" + LABEL_CHECK_ALL: "Sprawdź wszystkie wiadomości" + LABEL_ARCHIVE: "Archiwum" + LABEL_DELETE: "Usuń" + LABEL_OPEN_THREAD: "Otwórz wybrany wątek" + LABEL_MOVE: "Przenieś" + LABEL_READ: "Oznacz zaznaczone wiadomości, jako przeczytane" + LABEL_UNREAD: "Oznacz zaznaczone wiadomości, jako nieprzeczytane" + LABEL_IMPORTANT: "Oznacz zaznaczone wiadomości, jako ważne" + LABEL_SEARCH: "Szukaj" + LABEL_CANCEL_SEARCH: "Anuluj szukanie" + LABEL_FULLSCREEN_ENTER: "Pełny ekran (aktywny podgląd wiadomości)" + LABEL_VIEW_MESSAGE_ENTER: "Pokaż wiadomość (nieaktywny podgląd wiadomości)" + LABEL_SWITCH_TO_MESSAGE: "Wybrana wiadomość na pierwszym planie" + LABEL_SWITCH_TO_FOLDER_LIST: "Lista folderów na pierwszym planie" + LABEL_FULLSCREEN_TOGGLE: "Tryb pełnoekranowy" + LABEL_BLOCKQUOTES_TOGGLE: "Cytowanie wiadomości" + LABEL_THREAD_NEXT: "Następna wiadomość w wątku" + LABEL_THREAD_PREV: "Poprzednia wiadomość w wątku" + LABEL_PRINT: "Drukuj" + LABEL_EXIT_FULLSCREEN: "Opuść tryb pełnoekranowy" + LABEL_CLOSE_MESSAGE: "Zamknij wiadomość (nieaktywny podgląd wiadomości)" + LABEL_SWITCH_TO_LIST: "Wróć do widoku listy wiadomości" + LABEL_OPEN_COMPOSE_POPUP: "Otwórz okno tworzenia wiadomości" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Otwórz menu wyboru tożsamości" + LABEL_SAVE_MESSAGE: "Zapisz wiadomość" + LABEL_SEND_MESSAGE: "Wyślij wiadomość" + LABEL_CLOSE_COMPOSE: "Zamknij okno tworzenia wiadomości" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "Nie znaleziono klucza publicznego" + NO_PUBLIC_KEYS_FOUND_FOR: "Nie znaleziono klucza publicznego dla adresu: \"%EMAIL%\"" + NO_PRIVATE_KEY_FOUND: "Nie znaleziono klucza prywatnego" + NO_PRIVATE_KEY_FOUND_FOR: "Nie znaleziono klucza prywatnego dla adresu: \"%EMAIL%\"" + ADD_A_PUBLICK_KEY: "Dodaj klucz publiczny" + SELECT_A_PRIVATE_KEY: "Wybierz klucz prywatny" + UNVERIFIRED_SIGNATURE: "Niezweryfikowana" + DECRYPTION_ERROR: "Błąd deszyfrowania OpenPGP" + GOOD_SIGNATURE: "Podpisana przez: %USER%" + PGP_ERROR: "Błąd OpenPGP: %ERROR%" + SPECIFY_FROM_EMAIL: "Proszę podać adres e-mail w polu: OD" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Proszę podać przynajmniej jednego odbiorcę" + NOTIFICATIONS: + INVALID_TOKEN: "Nieprawidłowy token" + AUTH_ERROR: "Błąd autoryzacji" + ACCESS_ERROR: "Błąd dostępu" + CONNECTION_ERROR: "Błąd połączenia z serwerem" + CAPTCHA_ERROR: "Nieprawidłowy kod CAPTCHA" + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + To społecznościowe ID (Facebooku), nie jest powiązane z żadnym kontem pocztowym. + Zaloguj się używając danych swojego konta e-mail i skonfiguruj tę opcję w: + Ustawienia > Sieci społecznościowe. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + To społecznościowe ID (Twitter), nie jest powiązane z żadnym kontem pocztowym. + Zaloguj się używając danych swojego konta e-mail i skonfiguruj tę opcję w: + Ustawienia > Sieci społecznościowe. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + To społecznościowe ID (Konto Google), nie jest powiązane z żadnym kontem pocztowym. + Zaloguj się używając danych swojego konta e-mail i skonfiguruj tę opcję w: + Ustawienia > Sieci społecznościowe. + DOMAIN_NOT_ALLOWED: "Domena niedozwolona" + ACCOUNT_NOT_ALLOWED: "Konto nie jest dozwolone" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Wymagana dwuskładnikowa autoryzacja" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Błąd dwuskładnikowej autoryzacji" + COULD_NOT_SAVE_NEW_PASSWORD: "Nie można było zapisać nowego hasła" + CURRENT_PASSWORD_INCORRECT: "Obecne hasło jest niepoprawne" + NEW_PASSWORD_SHORT: "Hasło jest za krótkie" + NEW_PASSWORD_WEAK: "Hasło jest zbyt łatwe" + NEW_PASSWORD_FORBIDDENT: "Hasło zawiera zakazane znaki" + CONTACTS_SYNC_ERROR: "Błąd synchronizacji kontaktów" + CANT_GET_MESSAGE_LIST: "Nie jest możliwe pobranie listy wiadomości" + CANT_GET_MESSAGE: "Nie można pobrać wiadomości" + CANT_DELETE_MESSAGE: "Nie można usunąć wiadomości" + CANT_MOVE_MESSAGE: "Nie można przenieść wiadomości" + CANT_SAVE_MESSAGE: "Nie można zapisać wiadomości" + CANT_SEND_MESSAGE: "Nie można wysłać wiadomości" + INVALID_RECIPIENTS: "Nieprawidłowy adres odbiorcy" + CANT_SAVE_FILTERS: "Nie można zapisać filtrów" + CANT_GET_FILTERS: "Nie można pobrać filtrów" + FILTERS_ARE_NOT_CORRECT: "Filtry sa nieprawidłowe" + CANT_CREATE_FOLDER: "Nie można utworzyć folderu" + CANT_RENAME_FOLDER: "Nie można zmienić nazwy folderu" + CANT_DELETE_FOLDER: "Nie można usunąć folderu" + CANT_DELETE_NON_EMPTY_FOLDER: "Nie można usunąć folderu w którym znajdują się wiadomości" + CANT_SUBSCRIBE_FOLDER: "Nie można przypisać folderu" + CANT_UNSUBSCRIBE_FOLDER: "Nie można wypisać z folderu" + CANT_SAVE_SETTINGS: "Nie można zmienić ustawień" + CANT_SAVE_PLUGIN_SETTINGS: "Nie mozna zmienić ustawień wtyczki" + DOMAIN_ALREADY_EXISTS: "Domena już istnieje" + CANT_INSTALL_PACKAGE: "Nieudana instalacja pakietu" + CANT_DELETE_PACKAGE: "Nieudane usunięcie pakietu" + INVALID_PLUGIN_PACKAGE: "Nieprawidłowy pakiet rozszerzenia" + UNSUPPORTED_PLUGIN_PACKAGE: "Nieobsługiwany pakiet rozszerzenia" + LICENSING_SERVER_IS_UNAVAILABLE: "Serwer subskrypcji jest niedostępny" + LICENSING_DOMAIN_EXPIRED: "Subskrypcja dla tej domeny wygasła" + LICENSING_DOMAIN_BANNED: "Subskrypcja dla tej domeny została zablokowana" + DEMO_SEND_MESSAGE_ERROR: "Ze względów bezpieczeństwa, to konto testowe nie ma możliwości przesyłania, wiadomości na zewnętrzne adresy e-mail." + DEMO_ACCOUNT_ERROR: "Ze względów bezpieczeństwa, ta akcja jest niedozwolona na tym koncie!" + ACCOUNT_ALREADY_EXISTS: "Konto o takiej nazwie już istnieje" + ACCOUNT_DOES_NOT_EXIST: "Konto nie istnieje" + MAIL_SERVER_ERROR: "Wystąpił błąd w trakcie połączenia z serwerem poczty" + INVALID_INPUT_ARGUMENT: "Nieprawidłowy argument" + UNKNOWN_ERROR: "Nieznany błąd" + STATIC: + BACK_LINK: "Odśwież" + DOMAIN_LIST_DESC: "Lista domen do których webmail ma dostęp" + PHP_EXSTENSIONS_ERROR_DESC: "Wymagane rozszerzenia PHP są niedostępne!" + PHP_VERSION_ERROR_DESC: "Aktualnie zainstalowana wersja PHP: (%VERSION%), jest niższa niż minimalnie wymagana 5.3.0!" + NO_SCRIPT_TITLE: "Ta aplikacja wymaga JavaScript" + NO_SCRIPT_DESC: | + Twoja przeglądarka nie obsługuje JavaScript + Proszę o umożliwienie obsługi JavaScript w przeglądarce, oraz ponowne załadowanie tej strony. + NO_COOKIE_TITLE: "Ta aplikacja wymaga plików Cookies" + NO_COOKIE_DESC: | + Obsługa Cookies jest wyłączona w twojej przeglądarce + Proszę o umożliwienie obsługi plików Cookie w przeglądarce oraz ponowne uruchomienie tej strony. + BAD_BROWSER_TITLE: "Twoja przeglądarka jest przestarzała!" + BAD_BROWSER_DESC: | + W celu wykorzystania wszystkich funkcji tej aplikacji, + zaktualizuj aktualnie używaną lub pobierz i zainstaluj jedną z poniższych przeglądarek: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pt_BR.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pt_BR.yml new file mode 100755 index 00000000..0b1e144c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pt_BR.yml @@ -0,0 +1,714 @@ +pt_BR: + LOGIN: + LABEL_EMAIL: "E-mail" + LABEL_LOGIN: "Usuário" + LABEL_PASSWORD: "Senha" + LABEL_SIGN_ME: "Lembrar-me" + LABEL_VERIFICATION_CODE: "Código de verificação" + LABEL_DONT_ASK_VERIFICATION_CODE: "Não perguntar o código por 2 semanas" + BUTTON_SIGN_IN: "Entrar" + TITLE_SIGN_IN_GOOGLE: "Entrar com a conta do Google" + TITLE_SIGN_IN_FACEBOOK: "Entrar com a conta do Facebook" + TITLE_SIGN_IN_TWITTER: "Entrar com a conta do Twitter" + LABEL_FORGOT_PASSWORD: "Esqueceu a senha?" + LABEL_REGISTRATION: "Registre-se" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Adicionar Conta" + BUTTON_SETTINGS: "Configurações" + BUTTON_HELP: "Ajuda" + BUTTON_LOGOUT: "Sair" + MOBILE: + BUTTON_MOBILE_VERSION: "Versão Mobile" + BUTTON_DESKTOP_VERSION: "Versão Desktop" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Pesquisar" + TITLE_ADV: "Pesquisa Avançada" + LABEL_ADV_FROM: "De" + LABEL_ADV_TO: "Para" + LABEL_ADV_SUBJECT: "Assunto" + LABEL_ADV_TEXT: "Texto" + LABEL_ADV_HAS_ATTACHMENT: "Com anexo" + LABEL_ADV_HAS_ATTACHMENTS: "Com anexos" + LABEL_ADV_FLAGGED: "Sinalizada" + LABEL_ADV_UNSEEN: "Não Lida" + LABEL_ADV_DATE: "Data" + LABEL_ADV_DATE_ALL: "Qualquer" + LABEL_ADV_DATE_3_DAYS: "Até 3 dias atrás" + LABEL_ADV_DATE_7_DAYS: "Até 1 semana atrás" + LABEL_ADV_DATE_MONTH: "Até 1 mês atrás" + LABEL_ADV_DATE_3_MONTHS: "Até 3 meses atrás" + LABEL_ADV_DATE_6_MONTHS: "Até 6 meses atrás" + LABEL_ADV_DATE_YEAR: "Até 1 ano atrás" + BUTTON_ADV_SEARCH: "Pesquisar" + PREVIEW_POPUP: + FULLSCREEN: "Em tela cheia" + ZOOM: "Zoom in/out" + CLOSE: "Fechar (Esc)" + LOADING: "Carregando..." + GALLERY_PREV: "Anterior (Seta p/ Esquerda)" + GALLERY_NEXT: "Posterior (Seta p/ Direita)" + GALLERY_COUNTER: "%curr% de %total%" + IMAGE_ERROR: "A imagem não pôde ser carregada." + AJAX_ERROR: "O conteúdo não pôde ser carregado." + FOLDER_LIST: + BUTTON_COMPOSE: "Compor" + BUTTON_CONTACTS: "Contatos" + BUTTON_NEW_MESSAGE: "Nova mensagem" + INBOX_NAME: "Caixa de Entrada" + SENT_NAME: "Enviadas" + DRAFTS_NAME: "Rascunhos" + SPAM_NAME: "Lixo Eletrônico" + TRASH_NAME: "Lixeira" + ARCHIVE_NAME: "Arquivadas" + QUOTA: + TITLE: "Uso do Armazenamento" + MESSAGE_LIST: + BUTTON_RELOAD: "Atualizar Lista de Mensagens" + BUTTON_MOVE_TO: "Mover Para" + BUTTON_DELETE: "Excluir" + BUTTON_ARCHIVE: "Arquivar" + BUTTON_SPAM: "Lixo Eletrônico" + BUTTON_NOT_SPAM: "Não é Lixo Eletrônico" + BUTTON_EMPTY_FOLDER: "Esvaziar Pasta" + BUTTON_MULTY_FORWARD: "Encaminhar mensagens" + BUTTON_DELETE_WITHOUT_MOVE: "Excluir permanentemente" + BUTTON_MORE: "Mais" + MENU_SET_SEEN: "Marcar como lida" + MENU_SET_ALL_SEEN: "Marcar todas como lidas" + MENU_UNSET_SEEN: "Marcar como não lida" + MENU_SET_FLAG: "Sinalizar" + MENU_UNSET_FLAG: "Remover sinalizador" + MENU_SELECT_ALL: "Tudo" + MENU_SELECT_NONE: "Nenhum" + MENU_SELECT_INVERT: "Inverter" + MENU_SELECT_UNSEEN: "Não Lidas" + MENU_SELECT_SEEN: "Lidas" + MENU_SELECT_FLAGGED: "Sinalizadas" + MENU_SELECT_UNFLAGGED: "Não Sinalizadas" + EMPTY_LIST: "Lista Vazia." + EMPTY_SEARCH_LIST: "Nenhuma mensagem corresponde a sua pesquisa." + SEARCH_RESULT_FOR: "Resultados de pesquisa para \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "Voltar para a lista de mensagens" + LIST_LOADING: "Carregando" + EMPTY_SUBJECT_TEXT: "(Sem assunto)" + PUT_MESSAGE_HERE: "Coloque a mensagem aqui para vê-la na lista" + TODAY_AT: "Hoje as %TIME%" + YESTERDAY_AT: "Ontem as %TIME%" + SEARCH_PLACEHOLDER: "Pesquisar" + NEW_MESSAGE_NOTIFICATION: "Você tem %COUNT% novas mensagens!" + QUOTA_SIZE: "Utilizando %SIZE% (%PROC%%) de %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Editar" + BUTTON_BACK: "Voltar" + BUTTON_CLOSE: "Fechar" + BUTTON_DELETE: "Excluir" + BUTTON_UNSUBSCRIBE: "Cancelar a assinatura desta lista" + BUTTON_ARCHIVE: "Arquivar" + BUTTON_SPAM: "Lixo Eletrônico" + BUTTON_NOT_SPAM: "Não é Lixo Eletrônico" + BUTTON_MOVE_TO: "Mover para" + BUTTON_MORE: "Mais" + BUTTON_REPLY: "Responder" + BUTTON_REPLY_ALL: "Responder a todos" + BUTTON_FORWARD: "Encaminhar" + BUTTON_FORWARD_AS_ATTACHMENT: "Encaminhar como anexo" + BUTTON_EDIT_AS_NEW: "Editar como novo" + BUTTON_SHOW_IMAGES: "Exibir Imagens" + BUTTON_NOTIFY_READ_RECEIPT: "O emissor pediu para ser notificado quando você lesse essa mensagem." + BUTTON_IN_NEW_WINDOW: "Ver em janela separada" + BUTTON_THREAD_LIST: "Tópicos da Conversa" + BUTTON_THREAD_PREV: "Anterior" + BUTTON_THREAD_NEXT: "Próximo" + BUTTON_THREAD_MORE: "Mais mensagens" + MENU_HEADERS: "Mostrar cabeçalho das mensagens" + MENU_VIEW_ORIGINAL: "Mostrar original" + MENU_DOWNLOAD_ORIGINAL: "Baixar como arquivo .eml" + MENU_FILTER_SIMILAR: "Filtrar mensagens como esta" + MENU_PRINT: "Imprimir" + EMPTY_SUBJECT_TEXT: "(Sem assunto)" + LABEL_SUBJECT: "Assunto" + LABEL_DATE: "Data" + LABEL_FROM: "De" + LABEL_FROM_SHORT: "de" + LABEL_TO: "Para" + LABEL_TO_SHORT: "para" + LABEL_CC: "Cc" + LABEL_BCC: "Cco" + LABEL_REPLY_TO: "Responder para" + PRINT_LABEL_FROM: "De" + PRINT_LABEL_TO: "Para" + PRINT_LABEL_CC: "Cc" + PRINT_LABEL_BCC: "Cco" + PRINT_LABEL_REPLY_TO: "Responder para" + PRINT_LABEL_DATE: "Data" + PRINT_LABEL_SUBJECT: "Assunto" + PRINT_LABEL_ATTACHMENTS: "Anexos" + MESSAGE_LOADING: "Carregando" + MESSAGE_VIEW_DESC: "Selecione uma mensagem para visualizá-la aqui." + MESSAGE_VIEW_MOVE_DESC: "Clique no nome da pasta no painel esquerdo para selecionar o destino." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Senha" + PGP_SIGNED_MESSAGE_DESC: "Mensagem assinada com OpenPGP (clique para verificar)" + PGP_ENCRYPTED_MESSAGE_DESC: "Mensagem criptografada com OpenPGP (clique para descriptografar)" + LINK_DOWNLOAD_AS_ZIP: "Baixar como zip" + LINK_SAVE_TO_OWNCLOUD: "Salvar no ownCloud" + LINK_SAVE_TO_DROPBOX: "Salvar no Dropbox" + READ_RECEIPT: + SUBJECT: "Aviso de recepção (Visualizada) - %SUBJECT%" + BODY: | + Comprovante de retorno para o e-mail que você enviou para %READ-RECEIPT%. + + Nota: Este comprovante de retorno apenas reconhece que a mensagem foi exibida no computador do destinatário. + Não há garantia de que o destinatário tenha lido ou compreendido o conteúdo da mensagem. + SUGGESTIONS: + SEARCHING_DESC: "Procurando..." + CONTACTS: + LEGEND_CONTACTS: "Contatos" + SEARCH_INPUT_PLACEHOLDER: "Pesquisar" + BUTTON_ADD_CONTACT: "Adicionar Contato" + BUTTON_CREATE_CONTACT: "Criar" + BUTTON_UPDATE_CONTACT: "Atualizar" + BUTTON_IMPORT: "Importar (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Exportar (vcf, vCard)" + BUTTON_EXPORT_CSV: "Exportar (csv)" + ERROR_IMPORT_FILE: "Erro ao importar (formato de arquivo inválido)" + LIST_LOADING: "Carregando" + EMPTY_LIST: "Nenhum contato aqui" + EMPTY_SEARCH: "Nenhum contato encontrado" + CLEAR_SEARCH: "Limpar pesquisa" + CONTACT_VIEW_DESC: "Selecione um contato na lista para visualizá-lo." + LABEL_DISPLAY_NAME: "Nome de Exibição" + LABEL_EMAIL: "E-mail" + LABEL_PHONE: "Telefone" + LABEL_WEB: "Web" + LABEL_BIRTHDAY: "Aniversário" + LINK_ADD_EMAIL: "Adicionar um endereço e-mail" + LINK_ADD_PHONE: "Adicionar um telefone" + LINK_BIRTHDAY: "Aniversário" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Digite o nome de exibição" + PLACEHOLDER_ENTER_LAST_NAME: "Digite o sobrenome" + PLACEHOLDER_ENTER_FIRST_NAME: "Digite o primeiro nome" + PLACEHOLDER_ENTER_NICK_NAME: "Digite o apelido" + LABEL_READ_ONLY: "Somente Leitura" + LABEL_SHARE: "Compartilhar" + ADD_MENU_LABEL: "Adicionar" + ADD_MENU_NICKNAME: "Apelido" + ADD_MENU_NOTES: "Observações" + ADD_MENU_EMAIL: "E-mail" + ADD_MENU_PHONE: "Telefone" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Endereço" + ADD_MENU_BIRTHDAY: "Aniversário" + ADD_MENU_TAGS: "Tags" + BUTTON_SHARE_NONE: "Ninguém" + BUTTON_SHARE_ALL: "Todos" + BUTTON_SYNC: "Sincronização (CardDAV)" + COMPOSE: + TITLE_FROM: "De" + TITLE_TO: "Para" + TITLE_CC: "Cc" + TITLE_BCC: "Cco" + TITLE_REPLY_TO: "Responder para" + TITLE_SUBJECT: "Assunto" + LINK_SHOW_INPUTS: "Exibir todos os campos" + BUTTON_SEND: "Enviar" + BUTTON_SAVE: "Salvar" + BUTTON_DELETE: "Excluir" + BUTTON_CANCEL: "Cancelar" + BUTTON_MINIMIZE: "Minimizar" + SAVED_TIME: "Salvo às %TIME%" + SAVED_ERROR_ON_SEND: "Sua mensagem foi enviada mas não foi salva na pasta de itens enviados." + DISCARD_UNSAVED_DATA: "Descartar os dados não-salvos?" + ATTACH_FILES: "Anexar arquivos" + ATTACH_DROP_FILES_DESC: "Arraste os arquivos aqui" + ATTACH_ITEM_CANCEL: "Cancelar" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% escreveu" + FORWARD_MESSAGE_TOP_TITLE: "-------- Mensagem Encaminhada -------" + FORWARD_MESSAGE_TOP_FROM: "De" + FORWARD_MESSAGE_TOP_TO: "Para" + FORWARD_MESSAGE_TOP_CC: "CC" + FORWARD_MESSAGE_TOP_SENT: "Recebida" + FORWARD_MESSAGE_TOP_SUBJECT: "Assunto" + EMPTY_TO_ERROR_DESC: "Por favor, especifique pelo menos um destinatário" + NO_ATTACHMENTS_HERE_DESC: "Não há anexos aqui." + ATTACHMENTS_ERROR_DESC: "Alerta! Nem todos os arquivos foram anexados." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Alguns anexos ainda não foram completamente enviados" + BUTTON_REQUEST_READ_RECEIPT: "Pedir recibo de leitura" + BUTTON_MARK_AS_IMPORTANT: "Marcar como importante" + BUTTON_OPEN_PGP: "OpenPGP (Somente Texto)" + BUTTON_REQUEST_DSN: "Pedir recibo de entrega" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Fechar" + POPUPS_ASK: + BUTTON_YES: "Sim" + BUTTON_NO: "Não" + DESC_WANT_CLOSE_THIS_WINDOW: "Você tem certeza que deseja fechar esta janela?" + DESC_WANT_DELETE_MESSAGES: "Você tem certeza de que deseja excluir essa(s) mensagem(s)?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Escolha o idioma" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Nova conta" + BUTTON_ADD_ACCOUNT: "Adicionar" + TITLE_UPDATE_ACCOUNT: "Atualizar Conta?" + BUTTON_UPDATE_ACCOUNT: "Atualizar" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Adicionar identidade" + TITLE_UPDATE_IDENTITY: "Atualizar identidade?" + BUTTON_ADD_IDENTITY: "Adicionar" + BUTTON_UPDATE_IDENTITY: "Atualizar" + LABEL_EMAIL: "E-mail" + LABEL_NAME: "Nome" + LABEL_REPLY_TO: "Responder para" + LABEL_SIGNATURE: "Assinatura" + LABEL_CC: "Cc" + LABEL_BCC: "Cco" + LABEL_SIGNATURE_INSERT_BEFORE: "Inserir esta assinatura antes do texto citado nas respostas" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Nova pasta" + LABEL_NAME: "Nome da pasta" + LABEL_PARENT: "Pasta principal" + BUTTON_CREATE: "Criar" + BUTTON_CANCEL: "Cancelar" + BUTTON_CLOSE: "Fechar" + TITLE_CREATING_PROCESS: "Criando a pasta" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Excluir todas as mensagens da pasta?" + BUTTON_CLEAR: "Limpar" + BUTTON_CANCEL: "Cancelar" + BUTTON_CLOSE: "Fechar" + DANGER_DESC_WARNING: "Atenção!" + DANGER_DESC_HTML_1: "Esta ação irá resultar na remoção de todos os e-mails da pasta %FOLDER%." + DANGER_DESC_HTML_2: "Uma vez iniciado, o processo não poderá ser interrompido ou cancelado." + TITLE_CLEARING_PROCESS: "Excluindo a pasta..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Importar chave OpenPGP" + BUTTON_IMPORT_OPEN_PGP_KEY: "Importar" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "Ver chave OpenPGP" + BUTTON_SELECT: "Selecionar" + BUTTON_CLOSE: "Fechar" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Gerar chave OpenPGP" + LABEL_EMAIL: "E-mail" + LABEL_NAME: "Nome" + LABEL_PASSWORD: "Senha" + LABEL_KEY_BIT_LENGTH: "Tamanho da chave" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Gerar" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP Assinar/Criptografar" + LABEL_SIGN: "Assinar" + LABEL_ENCRYPT: "Criptografar" + LABEL_PASSWORD: "Senha" + BUTTON_SIGN: "Assinar" + BUTTON_ENCRYPT: "Criptografar" + BUTTON_SIGN_AND_ENCRYPT: "Assinar e criptografar" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" + LABEL_KEY: "Private Key" + LABEL_PASSWORD: "Password" + BUTTON_DECRYPT: "Decrypt" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "Testar verificação de duas etapas" + LABEL_CODE: "Código" + BUTTON_TEST: "Testar" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Criar um filtro?" + TITLE_EDIT_FILTER: "Atualizar filtro?" + FILTER_NAME: "Nome" + LEGEND_CONDITIONS: "Condições" + LEGEND_ACTIONS: "Ações" + BUTTON_DONE: "Concluir" + BUTTON_ADD_CONDITION: "Adicionar uma Condição" + SELECT_ACTION_NONE: "Nenhuma" + SELECT_ACTION_MOVE_TO: "Mover para" + SELECT_ACTION_FORWARD_TO: "Encaminhar para" + SELECT_ACTION_REJECT: "Rejeitar" + SELECT_ACTION_VACATION_MESSAGE: "Mensagem de férias" + SELECT_ACTION_DISCARD: "Descartar" + SELECT_FIELD_FROM: "De" + SELECT_FIELD_RECIPIENTS: "Destinatários (Para ou Cc)" + SELECT_FIELD_SUBJECT: "Assunto" + SELECT_FIELD_HEADER: "Cabeçalho" + SELECT_FIELD_SIZE: "Tamanho" + SELECT_TYPE_CONTAINS: "Contém" + SELECT_TYPE_NOT_CONTAINS: "Não Contém" + SELECT_TYPE_MATCHES: "Corresponde (* e ? são suportados)" + SELECT_TYPE_NOT_MATCHES: "Não Corresponde (* e ? são suportados)" + SELECT_TYPE_REGEXP: "Regexp" + SELECT_TYPE_NOT_REGEXP: "Não Regexp" + SELECT_TYPE_EQUAL_TO: "Igual à" + SELECT_TYPE_NOT_EQUAL_TO: "Não é igual à" + SELECT_TYPE_OVER: "Maior que" + SELECT_TYPE_UNDER: "Menor que" + SELECT_MATCH_ANY: "Corresponde à qualquer regra seguinte" + SELECT_MATCH_ALL: "Corresponde à todas as regras seguintes" + MARK_AS_READ_LABEL: "Marcar como Lida" + REPLY_INTERVAL_LABEL: "Responder intervalo (dias)" + KEEP_LABEL: "Manter" + STOP_LABEL: "Não parar o processamento das regras" + EMAIL_LABEL: "Email" + VACATION_SUBJECT_LABEL: "Assunto (opcional)" + VACATION_MESSAGE_LABEL: "Mensagem" + VACATION_RECIPIENTS_LABEL: "Destinatários (separados por vírgulas)" + REJECT_MESSAGE_LABEL: "Rejeitar mensagem" + ALL_INCOMING_MESSAGES_DESC: "Todas as mensagens recebidas" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Selecionar pastas do sistema" + SELECT_CHOOSE_ONE: "Selecione uma" + SELECT_UNUSE_NAME: "Não usar" + LABEL_SENT: "Enviadas" + LABEL_DRAFTS: "Rascunhos" + LABEL_SPAM: "Lixo Eletrônico" + LABEL_TRASH: "Lixeira" + LABEL_ARCHIVE: "Arquivadas" + BUTTON_CANCEL: "Cancelar" + BUTTON_CLOSE: "Fechar" + NOTIFICATION_SENT: | + Você não selecionou a pasta "Enviadas" do sistema que será colocada as mensagens após o envio. + Se você não quiser salvar a mensagem enviada, por favor selecione a opção"Não usar". + NOTIFICATION_DRAFTS: "Você não selecionou a pasta \"Rascunhos\" do sistema que será colocada as mensagens salvas durante a composição." + NOTIFICATION_SPAM: | + Você não selecionou a pasta "Lixo Eletrônico" do sistema que será colocada as mensagens spams. + Se você deseja remover a mensagem permanentemente, por favor selecione a opção"Não usar". + NOTIFICATION_TRASH: | + Você não selecionou a pasta do sistema que serão colocadas as mensagens excluídas. + Se você deseja remover a mensagem permanentemente, por favor selecione a opção"Não usar". + NOTIFICATION_ARCHIVE: "Você não selecionou a pasta \"Arquivadas\" do sistema que serão colocadas as mensagens arquivadas." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "Verificação de duas etapas" + LABEL_ENABLE_TWO_FACTOR: "Habilitar verificação de duas etapas" + LABEL_TWO_FACTOR_USER: "Usuário" + LABEL_TWO_FACTOR_STATUS: "Status" + LABEL_TWO_FACTOR_SECRET: "Segredo" + LABEL_TWO_FACTOR_BACKUP_CODES: "Códigos de backup" + BUTTON_CREATE: "Criar novo segredo" + BUTTON_ACTIVATE: "Ativar" + BUTTON_CLEAR: "Limpar" + BUTTON_LOGOUT: "Sair" + BUTTON_DONE: "Completo" + BUTTON_TEST: "Testar" + LINK_TEST: "teste" + BUTTON_SHOW_SECRET: "Mostrar segredo" + BUTTON_HIDE_SECRET: "Esconder segredo" + TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configurado" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Não configurado" + TWO_FACTOR_SECRET_DESC: >- + Importe este código no seu cliente Google Authenticator (ou outro cliente + TOTP) usando o QR code abaixo ou informando o código manualmente. + TWO_FACTOR_BACKUP_CODES_DESC: >- + Se você não puder receber os códigos via Google Authenticator, você pode usar + esses códigos de backup para acessar sua conta. Depois de você usar um código + de backup, ele se expira. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Você não pode alterar essa configuração antes do teste." + TITLES: + LOADING: "Carregando" + LOGIN: "Login" + MAILBOX: "Caixa de Correio" + SETTINGS: "Configurações" + COMPOSE: "Compor" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "O arquivo é muito grande" + ERROR_FILE_PARTIALLY_UPLOADED: "O arquivo foi apenas parcialmente enviado devido a um erro desconhecido" + ERROR_NO_FILE_UPLOADED: "Arquivo não enviado" + ERROR_MISSING_TEMP_FOLDER: "O arquivo temporário está faltando" + ERROR_ON_SAVING_FILE: "Ocorreu um erro de envio de arquivo desconhecido" + ERROR_FILE_TYPE: "Tipo de arquivo inválido" + ERROR_UNKNOWN: "Ocorreu um erro de envio de arquivo desconhecido" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXTO" + TEXT_SWITCHER_RICH_FORMATTING: "Formatação avançada" + TEXT_SWITCHER_CONFIRM: "A formatação de texto e as imagens serão perdidas. Tem certeza de que deseja continuar?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Pessoal" + LABEL_GENERAL_NAME: "Geral" + LABEL_CONTACTS_NAME: "Contatos" + LABEL_FOLDERS_NAME: "Pastas" + LABEL_ACCOUNTS_NAME: "Contas" + LABEL_IDENTITY_NAME: "Identidade" + LABEL_IDENTITIES_NAME: "Identidades" + LABEL_FILTERS_NAME: "Filtros" + LABEL_TEMPLATES_NAME: "Templates" + LABEL_SECURITY_NAME: "Segurança" + LABEL_SOCIAL_NAME: "Social" + LABEL_THEMES_NAME: "Temas" + LABEL_CHANGE_PASSWORD_NAME: "Senha" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Voltar" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filtros" + BUTTON_SAVE: "Salvar" + BUTTON_ADD_FILTER: "Adicionar um Filtro" + BUTTON_DELETE: "Deletar" + BUTTON_RAW_SCRIPT: "Usar Script de usuário personalizado" + SUBNAME_NONE: "Nenhum" + SUBNAME_MOVE_TO: "Mover para \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Encaminhar para \"%EMAIL%\"" + SUBNAME_REJECT: "Rejeitar" + SUBNAME_VACATION_MESSAGE: "Mensagem de férias" + SUBNAME_DISCARD: "Descartar" + CAPABILITY_LABEL: "Capacidade" + LOADING_PROCESS: "Atualizando Lista de filtros" + DELETING_ASK: "Você tem certeza?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Estas alterações precisam ser salvas no servidor." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identidade" + LABEL_DISPLAY_NAME: "Nome" + LABEL_REPLY_TO: "Responder para" + LABEL_SIGNATURE: "Assinatura" + LABEL_ADD_SIGNATURE_TO_ALL: "Adicionar sua assinatura em todas as mensagens de saída" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Segurança" + LABEL_CONFIGURE_TWO_FACTOR: "Configurar verificação de 2 etapas" + LABEL_AUTOLOGOUT: "Deslogar Automaticamente" + AUTOLOGIN_NEVER_OPTION_NAME: "Nunca" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minutos" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hora(s)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Geral" + LABEL_LANGUAGE: "Idioma" + LABEL_IDENTITY: "Identidade" + LABEL_LAYOUT: "Painel de Leitura" + LABEL_LAYOUT_NO_SPLIT: "Sem divisão" + LABEL_LAYOUT_VERTICAL_SPLIT: "Divisão Vertical" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Divisão Horizontal" + LABEL_EDITOR: "Editor de texto padrão" + LABEL_EDITOR_HTML: "Html" + LABEL_EDITOR_PLAIN: "Texto Simples" + LABEL_EDITOR_HTML_FORCED: "Html (forçado)" + LABEL_EDITOR_PLAIN_FORCED: "Texto Simples (forçado)" + LABEL_ANIMATION: "Animação de interface" + LABEL_ANIMATION_FULL: "Completa" + LABEL_ANIMATION_NORMAL: "Normal" + LABEL_ANIMATION_NONE: "Nenhuma" + LABEL_VIEW_OPTIONS: "Opções de Visualização" + LABEL_USE_PREVIEW_PANE: "Usar painel de pré-visualização" + LABEL_USE_CHECKBOXES_IN_LIST: "Exibir caixas de seleção na lista" + LABEL_USE_THREADS: "Agrupar mensagens por conversa" + LABEL_REPLY_SAME_FOLDER: "Colocar resposta na mesma pasta da mensagem respondida" + LABEL_SHOW_IMAGES: "Sempre exibir imagens no corpo da mensagem" + LABEL_SHOW_ANIMATION: "Mostrar animação" + LABEL_MESSAGE_PER_PAGE: "Mensagens por Página" + LABEL_NOTIFICATIONS: "Notificações" + LABEL_SOUND_NOTIFICATION: "Notificação sonora" + LABEL_CHROME_NOTIFICATION_DESC: "Mostrar notificação popup para novas mensagens" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Bloqueado pelo navegador)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Contatos" + LABEL_CONTACTS_AUTOSAVE: "Adicionar automaticamente os destinatários na lista de endereços" + LEGEND_CONTACTS_SYNC: "Sincronização remota (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Habilitar sincronização remota" + LABEL_CONTACTS_SYNC_SERVER: "Servidor" + LABEL_CONTACTS_SYNC_AB_URL: "URL da lista de contatos" + LABEL_CONTACTS_SYNC_USER: "Usuário" + LABEL_CONTACTS_SYNC_PASSWORD: "Senha" + SETTINGS_THEMES: + LEGEND_THEMES: "Temas" + LEGEND_THEMES_CUSTOM: "Configurar tema personalizado" + LABEL_CUSTOM_TYPE: "Tipo" + LABEL_CUSTOM_TYPE_LIGHT: "Claro" + LABEL_CUSTOM_TYPE_DARK: "Escuro" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Plano de fundo" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Enviar imagem de plano de fundo(JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Arquivo muito grande" + ERROR_FILE_TYPE_ERROR: "Tipo de arquivo inválido (somente JPG e PNG)" + ERROR_UNKNOWN: "Ocorreu um erro de envio de arquivo desconhecido" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Conectar ao Google" + BUTTON_GOOGLE_DISCONNECT: "Desconectar do Google" + MAIN_GOOGLE_DESC: "Depois de ativar com o login do Google, você poderá entrar nessa conta utilizando o botão Google na tela de login." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Conectar ao Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Desconectar do Facebook" + MAIN_FACEBOOK_DESC: "Depois de ativar com o login do Facebook, você poderá entrar nessa conta utilizando o botão Facebook na tela de login." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Conectar ao Twitter" + BUTTON_TWITTER_DISCONNECT: "Desconectar do Twitter" + MAIN_TWITTER_DESC: "Depois de ativar com o login do Twitter, você poderá entrar nessa conta utilizando o botão Twitter na tela de login" + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Lista de pastas" + BUTTON_CREATE: "Criar pasta" + BUTTON_SYSTEM: "Pastas do Sistema" + BUTTON_DELETE: "Excluir" + BUTTON_SUBSCRIBE: "Acompanhar" + BUTTON_UNSUBSCRIBE: "Não acompanhar" + LOADING_PROCESS: "Atualizar lista de pastas" + CREATING_PROCESS: "Criando a pasta" + DELETING_PROCESS: "Excluindo a pasta" + RENAMING_PROCESS: "Renomeando a pasta" + DELETING_ASK: "Você tem certeza?" + TO_MANY_FOLDERS_DESC_1: "Você possui muitas pastas!" + TO_MANY_FOLDERS_DESC_2: "Mostraremos apenas uma parte delas, para evitar problemas de desempenho." + HELP_DELETE_FOLDER: "Deletar pasta" + HELP_SHOW_HIDE_FOLDER: "Mostrar/esconder pasta" + HELP_CHECK_FOR_NEW_MESSAGES: "Ativar/Desativar verificação por novas mensagens" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Lista de contas" + LEGEND_IDENTITIES: "Identidades" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Contas e Identidades" + BUTTON_ADD_ACCOUNT: "Adicionar uma conta" + BUTTON_ADD_IDENTITY: "Adicionar uma identidade" + BUTTON_DELETE: "Excluir" + LOADING_PROCESS: "Atualizando a lista de contas" + DELETING_ASK: "Você tem certeza?" + DEFAULT_IDENTITY_LABEL: "padrão" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identidade" + LEGEND_IDENTITIES: "Identidades adicionais" + LABEL_DEFAULT: "Padrão" + LABEL_DISPLAY_NAME: "Nome" + LABEL_REPLY_TO: "Responder para" + LABEL_SIGNATURE: "Assinatura" + LABEL_ADD_SIGNATURE_TO_ALL: "Adicionar sua assinatura em todas as mensagens de saída" + BUTTON_ADD_IDENTITY: "Adicionar identidade" + BUTTON_DELETE: "Excluir" + LOADING_PROCESS: "Atualizando a lista de identidades" + DELETING_ASK: "Você tem certeza?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Mudar a Senha" + LABEL_CURRENT_PASSWORD: "Senha atual" + LABEL_NEW_PASSWORD: "Nova senha" + LABEL_REPEAT_PASSWORD: "Repita a nova senha" + BUTTON_UPDATE_PASSWORD: "Definir nova senha" + ERROR_PASSWORD_MISMATCH: "As senhas não conferem, por favor tente novamente" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Importa chave OpenPGP" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Gerar chave OpenPGP" + TITLE_PRIVATE: "Privado" + TITLE_PUBLIC: "Público" + DELETING_ASK: "Você tem certeza?" + GENERATE_ONLY_HTTPS: "HTTPS only" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Ajuda com os atalhos de teclado" + TAB_MAILBOX: "Caixa de correio" + TAB_MESSAGE_LIST: "Lista de mensagens" + TAB_MESSAGE_VIEW: "Visualização de mensagem" + TAB_COMPOSE: "Composição" + LABEL_OPEN_USER_DROPDOWN: "Abrir menu de usuário" + LABEL_REPLY: "Responder" + LABEL_REPLY_ALL: "Responder todos" + LABEL_FORWARD: "Encaminhar" + LABEL_FORWARD_MULTIPLY: "Encaminhar como anexo" + LABEL_HELP: "Ajuda" + LABEL_CHECK_ALL: "Selecionar todas as mensagens" + LABEL_ARCHIVE: "Arquivar" + LABEL_DELETE: "Excluir" + LABEL_OPEN_THREAD: "Abrir conversa selecionada" + LABEL_MOVE: "Mover" + LABEL_READ: "Marcar mensagens selecionadas como lidas" + LABEL_UNREAD: "Marcar mensagens selecionadas como não lidas" + LABEL_IMPORTANT: "Sinalizar mensagens selecionadas" + LABEL_SEARCH: "Pesquisar" + LABEL_CANCEL_SEARCH: "Cancelar pesquisa" + LABEL_FULLSCREEN_ENTER: "Tela-cheia (Com pré-visualização)" + LABEL_VIEW_MESSAGE_ENTER: "Ver mensagem (Sem pré-visualização)" + LABEL_SWITCH_TO_MESSAGE: "Mudar o foco para mensagem selecionada" + LABEL_SWITCH_TO_FOLDER_LIST: "Mudar o foco para a lista de pastas" + LABEL_FULLSCREEN_TOGGLE: "Alternar modo tela-cheia" + LABEL_BLOCKQUOTES_TOGGLE: "Alternar blocos de citações de mensagem" + LABEL_THREAD_NEXT: "Mensagem seguinte na conversa" + LABEL_THREAD_PREV: "Mensagem anterior na conversa" + LABEL_PRINT: "Imprimir" + LABEL_EXIT_FULLSCREEN: "Sair do modo tela-cheia" + LABEL_CLOSE_MESSAGE: "Fechar mensagem (Sem pré-visualização)" + LABEL_SWITCH_TO_LIST: "Mudar o foco volta para a lista de mensagens" + LABEL_OPEN_COMPOSE_POPUP: "Abrir pop-up de composição" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Abrir menu de identidades" + LABEL_SAVE_MESSAGE: "Salvar mensagem" + LABEL_SEND_MESSAGE: "Enviar mensagem" + LABEL_CLOSE_COMPOSE: "Fechar composição" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "Nenhuma chave pública encontrada" + NO_PUBLIC_KEYS_FOUND_FOR: "Nenhuma chave pública encontrada para o e-mail \"%EMAIL%\"" + NO_PRIVATE_KEY_FOUND: "Nenhuma chave privada encontrada" + NO_PRIVATE_KEY_FOUND_FOR: "Nenhuma chave privada encontrada para o e-mail \"%EMAIL%\"" + ADD_A_PUBLICK_KEY: "Adicionar uma chave pública" + SELECT_A_PRIVATE_KEY: "Selecione a chave privada" + UNVERIFIRED_SIGNATURE: "Assinatura não verificada" + DECRYPTION_ERROR: "Erro de decripitação de OpenPGP" + GOOD_SIGNATURE: "Boa assinatura de %USER%" + PGP_ERROR: "Erro OpenPGP: %ERROR%" + SPECIFY_FROM_EMAIL: "Por favor, especifique endereço de e-mail remetente" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Especifique pelo menos um destinatário" + NOTIFICATIONS: + INVALID_TOKEN: "Senha inválida" + AUTH_ERROR: "Falha na autenticação" + ACCESS_ERROR: "Erro ao acessar" + CONNECTION_ERROR: "Não foi possível conectar-se ao servidor" + CAPTCHA_ERROR: "Verificação CAPTCHA incorreta." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Esta ID social não é atribuído para qualquer conta de e-mail ainda. Entre + usando suas credenciais de e-mail e ative o recursso de logar pelo Facebook + em configurações de conta. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Esta ID social não é atribuído para qualquer conta de e-mail ainda. Entre + usando suas credenciais de e-mail e ative o recursso de logar pelo Twitter + em configurações de conta. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Esta ID social não é atribuído para qualquer conta de e-mail ainda. Entre + usando suas credenciais de e-mail e ative o recursso de logar pelo Google + em configurações de conta. + DOMAIN_NOT_ALLOWED: "Este domínio não é permitido" + ACCOUNT_NOT_ALLOWED: "Conta não permitida" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Verificação de duas etapas requerida" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Erro na verificação de duas etapas" + COULD_NOT_SAVE_NEW_PASSWORD: "Não foi possível salvar a nova senha" + CURRENT_PASSWORD_INCORRECT: "Senha atual incorreta" + NEW_PASSWORD_SHORT: "A senha é muito curta" + NEW_PASSWORD_WEAK: "A senha é muito fácil" + NEW_PASSWORD_FORBIDDENT: "A senha contém caracteres não permitidos" + CONTACTS_SYNC_ERROR: "Erro na sincronização dos contatos" + CANT_GET_MESSAGE_LIST: "Não foi possível obter a lista de mensagens" + CANT_GET_MESSAGE: "Não foi possível obter a mensagem" + CANT_DELETE_MESSAGE: "Não foi possível excluir a mensagem" + CANT_MOVE_MESSAGE: "Não foi possível mover a mensagem" + CANT_SAVE_MESSAGE: "Não foi possível salvar a mensagem" + CANT_SEND_MESSAGE: "Não foi possível enviar a mensagem" + INVALID_RECIPIENTS: "Destinatário inválido" + CANT_SAVE_FILTERS: "Não é possível salvar os filtros" + CANT_GET_FILTERS: "Não é possível obter os filtros" + FILTERS_ARE_NOT_CORRECT: "Os filtros não estão corretos" + CANT_CREATE_FOLDER: "Não foi possível criar a pasta" + CANT_RENAME_FOLDER: "Não foi possível renomear a pasta" + CANT_DELETE_FOLDER: "Não foi possível exluir a pasta" + CANT_DELETE_NON_EMPTY_FOLDER: "Não é possível excluir diretório não vazio" + CANT_SUBSCRIBE_FOLDER: "Não foi possível inscrever esta pasta" + CANT_UNSUBSCRIBE_FOLDER: "Não foi possível desinscrever esta pasta" + CANT_SAVE_SETTINGS: "Não foi possível salvar as configurações" + CANT_SAVE_PLUGIN_SETTINGS: "Não foi possível salvar as configurações" + DOMAIN_ALREADY_EXISTS: "O domínio já existe" + CANT_INSTALL_PACKAGE: "Erro ao instalar pacote de plugin" + CANT_DELETE_PACKAGE: "Erro ao remover pacote de plugin" + INVALID_PLUGIN_PACKAGE: "Pacote de plugins inválido" + UNSUPPORTED_PLUGIN_PACKAGE: "Pacote de plugins insuportados" + LICENSING_SERVER_IS_UNAVAILABLE: "A assinatura do servidor está indisponível" + LICENSING_DOMAIN_EXPIRED: "A assinatura para este domínio expirou." + LICENSING_DOMAIN_BANNED: "A assinatura para este domínio é proibida." + DEMO_SEND_MESSAGE_ERROR: "Por motivos de segurança, esta conta demo não tem permissão para enviar mensagens para endereços de e-mail externo!" + DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" + ACCOUNT_ALREADY_EXISTS: "Esta conta já existe" + ACCOUNT_DOES_NOT_EXIST: "Conta não existente" + MAIL_SERVER_ERROR: "Ocorreu um erro ao acessar o servidor de e-mail" + INVALID_INPUT_ARGUMENT: "Argumento de entrada inválido" + UNKNOWN_ERROR: "Erro desconhecido" + STATIC: + BACK_LINK: "Recarregar" + DOMAIN_LIST_DESC: "A lista de domínios de webmail tem permissão para acessar." + PHP_EXSTENSIONS_ERROR_DESC: "Extensões necessárias PHP não estão disponíveis na sua configuração do PHP!" + PHP_VERSION_ERROR_DESC: "Sua versão PHP (%VERSION%) é menor do que o mínimo exigido 5.3.0!" + NO_SCRIPT_TITLE: "JavaScript é necessário para esta aplicação." + NO_SCRIPT_DESC: | + O JavaScript não está disponível em seu navegador. + Por favor ative o suporte a JavaScript nas configurações do seu navegador e tente novamente. + NO_COOKIE_TITLE: "É necessário suporte a cookies para esta aplicação." + NO_COOKIE_DESC: | + Os Cookies não estão disponíveis em seu navegador. + Por favor ative o suporte a Cookies nas configurações do seu navegador e tente novamente. + BAD_BROWSER_TITLE: "Seu navegador está desatualizado." + BAD_BROWSER_DESC: | + Para usar todos os recursos do aplicativo, + baixe e instale um desses navegadores: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pt_PT.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pt_PT.yml new file mode 100755 index 00000000..ef6d67d0 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pt_PT.yml @@ -0,0 +1,704 @@ +pt_PT: + LOGIN: + LABEL_EMAIL: "Email" + LABEL_LOGIN: "Utilizador" + LABEL_PASSWORD: "Palavra-passe" + LABEL_SIGN_ME: "Lembrar-me" + LABEL_VERIFICATION_CODE: "Código de verificação" + LABEL_DONT_ASK_VERIFICATION_CODE: "Não pedir o código durante 2 semanas" + BUTTON_SIGN_IN: "Entrar" + TITLE_SIGN_IN_GOOGLE: "Entre com a conta do Google" + TITLE_SIGN_IN_FACEBOOK: "Entre com a conta do Facebook" + TITLE_SIGN_IN_TWITTER: "Entre com a conta do Twitter" + LABEL_FORGOT_PASSWORD: "Esqueci-me da palavra-passe" + LABEL_REGISTRATION: "Registo" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Adicionar conta" + BUTTON_SETTINGS: "Definições" + BUTTON_HELP: "Ajuda" + BUTTON_LOGOUT: "Sair" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Pesquisar" + TITLE_ADV: "Pesquisa avançada" + LABEL_ADV_FROM: "De" + LABEL_ADV_TO: "Para" + LABEL_ADV_SUBJECT: "Assunto" + LABEL_ADV_TEXT: "Texto" + LABEL_ADV_HAS_ATTACHMENT: "Tem anexo" + LABEL_ADV_HAS_ATTACHMENTS: "Tem anexos" + LABEL_ADV_FLAGGED: "Sinalizada" + LABEL_ADV_UNSEEN: "Não lida" + LABEL_ADV_DATE: "Data" + LABEL_ADV_DATE_ALL: "Qualquer" + LABEL_ADV_DATE_3_DAYS: "Até 3 dias atrás" + LABEL_ADV_DATE_7_DAYS: "Até 1 semana atrás" + LABEL_ADV_DATE_MONTH: "Até 1 mês atrás" + LABEL_ADV_DATE_3_MONTHS: "Até 3 meses atrás" + LABEL_ADV_DATE_6_MONTHS: "Até 6 meses atrás" + LABEL_ADV_DATE_YEAR: "Até 1 ano atrás" + BUTTON_ADV_SEARCH: "Pesquisar" + PREVIEW_POPUP: + FULLSCREEN: "Alternar ecrã-inteiro" + ZOOM: "Zoom +/-" + CLOSE: "Fechar (Esc)" + LOADING: "A carregar..." + GALLERY_PREV: "Anterior (seta p/ esquerda)" + GALLERY_NEXT: "Próxima (seta p/ direita)" + GALLERY_COUNTER: "%curr% de %total%" + IMAGE_ERROR: "Imagem não pode ser carregado." + AJAX_ERROR: "Conteúdo não pode ser carregado." + FOLDER_LIST: + BUTTON_COMPOSE: "Compor" + BUTTON_CONTACTS: "Contactos" + INBOX_NAME: "Caixa de entrada" + SENT_NAME: "Correio enviado" + DRAFTS_NAME: "Rascunhos" + SPAM_NAME: "Spam" + TRASH_NAME: "Lixo" + ARCHIVE_NAME: "Arquivo" + QUOTA: + TITLE: "Uso da Cota" + MESSAGE_LIST: + BUTTON_RELOAD: "Atualizar lista de mensagens" + BUTTON_MOVE_TO: "Mover para" + BUTTON_DELETE: "Eliminar" + BUTTON_ARCHIVE: "Arquivar" + BUTTON_SPAM: "Marcar como spam" + BUTTON_NOT_SPAM: "Não é spam" + BUTTON_EMPTY_FOLDER: "Esvaziar pasta" + BUTTON_MULTY_FORWARD: "Encaminhar mensagens" + BUTTON_DELETE_WITHOUT_MOVE: "Eliminar definitivamente" + BUTTON_MORE: "Mais" + MENU_SET_SEEN: "Marcar como lida" + MENU_SET_ALL_SEEN: "Marcar todas como lidas" + MENU_UNSET_SEEN: "Marcar como não lida" + MENU_SET_FLAG: "Sinalizar" + MENU_UNSET_FLAG: "Remover sinalização" + MENU_SELECT_ALL: "Todas" + MENU_SELECT_NONE: "Nenhuma" + MENU_SELECT_INVERT: "Inverter" + MENU_SELECT_UNSEEN: "Não lida" + MENU_SELECT_SEEN: "Lida" + MENU_SELECT_FLAGGED: "Sinalizada" + MENU_SELECT_UNFLAGGED: "Não sinalizada" + EMPTY_LIST: "Lista vazia." + EMPTY_SEARCH_LIST: "Nenhuma mensagem corresponde à sua pesquisa." + SEARCH_RESULT_FOR: "Resultados de pesquisa para \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "voltar à lista de mensagens" + LIST_LOADING: "A carregar" + EMPTY_SUBJECT_TEXT: "(Sem assunto)" + PUT_MESSAGE_HERE: "Coloque a mensagem aqui para vê-la na lista" + TODAY_AT: "Hoje às %TIME%" + YESTERDAY_AT: "Ontem às %TIME%" + SEARCH_PLACEHOLDER: "Pesquisar" + NEW_MESSAGE_NOTIFICATION: "Você tem %COUNT% novas mensagens!" + QUOTA_SIZE: "Está a usar %SIZE% (%PROC%%) dos %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Editar" + BUTTON_BACK: "Voltar" + BUTTON_CLOSE: "Fechar" + BUTTON_DELETE: "Eliminar" + BUTTON_ARCHIVE: "Arquivar" + BUTTON_SPAM: "Marcar como spam" + BUTTON_NOT_SPAM: "Não é spam" + BUTTON_MOVE_TO: "Mover para" + BUTTON_MORE: "Mais" + BUTTON_REPLY: "Responder" + BUTTON_REPLY_ALL: "Responder a todos" + BUTTON_FORWARD: "Encaminhar" + BUTTON_FORWARD_AS_ATTACHMENT: "Enviar como anexo" + BUTTON_EDIT_AS_NEW: "Editar como novo" + BUTTON_SHOW_IMAGES: "Mostrar imagens" + BUTTON_NOTIFY_READ_RECEIPT: "O remetente pediu para ser notificado quando você lesse esta mensagem." + BUTTON_IN_NEW_WINDOW: "Ver em janela separada" + BUTTON_THREAD_LIST: "Lista de tópicos" + BUTTON_THREAD_PREV: "Anterior" + BUTTON_THREAD_NEXT: "Seguinte" + BUTTON_THREAD_MORE: "Mais mensagens" + MENU_HEADERS: "Mostrar título das mensagens" + MENU_VIEW_ORIGINAL: "Mostrar original" + MENU_DOWNLOAD_ORIGINAL: "Transferir como ficheiro .eml" + MENU_FILTER_SIMILAR: "Filtrar mensagens semelhantes a esta" + MENU_PRINT: "Imprimir" + EMPTY_SUBJECT_TEXT: "(Sem assunto)" + LABEL_SUBJECT: "Assunto" + LABEL_DATE: "Data" + LABEL_FROM: "De" + LABEL_FROM_SHORT: "de" + LABEL_TO: "Para" + LABEL_TO_SHORT: "para" + LABEL_CC: "CC" + LABEL_BCC: "BCC" + LABEL_REPLY_TO: "Resp.-Para" + PRINT_LABEL_FROM: "De" + PRINT_LABEL_TO: "Para" + PRINT_LABEL_CC: "CC" + PRINT_LABEL_BCC: "BCC" + PRINT_LABEL_REPLY_TO: "Resp.-Para" + PRINT_LABEL_DATE: "Data" + PRINT_LABEL_SUBJECT: "Assunto" + PRINT_LABEL_ATTACHMENTS: "Anexos" + MESSAGE_LOADING: "A carregar" + MESSAGE_VIEW_DESC: "Selecione uma mensagem na lista para ver o conteúdo aqui." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Palavra-passe" + PGP_SIGNED_MESSAGE_DESC: "Mensagem assinada com OpenPGP (clique para verificar)" + PGP_ENCRYPTED_MESSAGE_DESC: "Mensagem encriptada com OpenPGP (clique para desencriptar)" + LINK_DOWNLOAD_AS_ZIP: "Transferir em arquivo zip" + LINK_SAVE_TO_OWNCLOUD: "Guardar no ownCloud" + LINK_SAVE_TO_DROPBOX: "Guardar no Dropbox" + READ_RECEIPT: + SUBJECT: "Recibo de leitura (apresentado) - %SUBJECT%" + BODY: | + Este é um comprovativo de leitura para o e-mail que você enviou para %READ-RECEIPT%. + + Nota: Este comprovativo apenas confirma que a mensagem foi apresentada no computador do destinatário. + Não existe nenhuma garantia de que o destinatário tenha lido ou compreendido o conteúdo da mensagem. + SUGGESTIONS: + SEARCHING_DESC: "A procurar..." + CONTACTS: + LEGEND_CONTACTS: "Contactos" + SEARCH_INPUT_PLACEHOLDER: "Procurar" + BUTTON_ADD_CONTACT: "Adicionar contacto" + BUTTON_CREATE_CONTACT: "Criar" + BUTTON_UPDATE_CONTACT: "Atualizar" + BUTTON_IMPORT: "Importar (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Exportar (vcf, vCard)" + BUTTON_EXPORT_CSV: "Exportar (csv)" + ERROR_IMPORT_FILE: "Erro ao importar (formato do ficheiro inválido)" + LIST_LOADING: "A carregar" + EMPTY_LIST: "Nenhum contacto aqui" + EMPTY_SEARCH: "Nenhum contacto encontrado" + CLEAR_SEARCH: "Limpar pesquisa" + CONTACT_VIEW_DESC: "Selecione o contacto na lista para visualizá-lo." + LABEL_DISPLAY_NAME: "Nome a apresentar" + LABEL_EMAIL: "Email" + LABEL_PHONE: "Telefone" + LABEL_WEB: "Página web" + LABEL_BIRTHDAY: "Aniversário" + LINK_ADD_EMAIL: "Adicionar um endereço e-mail" + LINK_ADD_PHONE: "Adicionar um telefone" + LINK_BIRTHDAY: "Aniversário" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Introduza o nome a apresentar" + PLACEHOLDER_ENTER_LAST_NAME: "Introduza o último nome" + PLACEHOLDER_ENTER_FIRST_NAME: "Introduza o primeiro nome" + PLACEHOLDER_ENTER_NICK_NAME: "Introduza uma alcunha" + LABEL_READ_ONLY: "Ler apenas" + LABEL_SHARE: "Partilhar" + ADD_MENU_LABEL: "Adicionar" + ADD_MENU_NICKNAME: "Alcunha" + ADD_MENU_NOTES: "Notas" + ADD_MENU_EMAIL: "Email" + ADD_MENU_PHONE: "Telefone" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Morada" + ADD_MENU_BIRTHDAY: "Aniversário" + ADD_MENU_TAGS: "Marcadores" + BUTTON_SHARE_NONE: "Ninguém" + BUTTON_SHARE_ALL: "Todos" + BUTTON_SYNC: "Sincronização (CardDAV)" + COMPOSE: + TITLE_FROM: "De" + TITLE_TO: "Para" + TITLE_CC: "CC" + TITLE_BCC: "BCC" + TITLE_REPLY_TO: "Resp.-Para" + TITLE_SUBJECT: "Assunto" + LINK_SHOW_INPUTS: "Mostrar todos os campos" + BUTTON_SEND: "Enviar" + BUTTON_SAVE: "Guardar" + BUTTON_DELETE: "Eliminar" + BUTTON_CANCEL: "Cancelar" + BUTTON_MINIMIZE: "Minimizar" + SAVED_TIME: "Guardado às %TIME%" + SAVED_ERROR_ON_SEND: "A sua mensagem foi enviada, mas não foi guardada na pasta dos itens enviados." + DISCARD_UNSAVED_DATA: "Rejeitar o conteúdo que não foi guardado?" + ATTACH_FILES: "Anexar ficheiros" + ATTACH_DROP_FILES_DESC: "Arraste os ficheiros para aqui" + ATTACH_ITEM_CANCEL: "Cancelar" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% escreveu" + FORWARD_MESSAGE_TOP_TITLE: "-------- Mensagem Encaminhada -------" + FORWARD_MESSAGE_TOP_FROM: "De" + FORWARD_MESSAGE_TOP_TO: "Para" + FORWARD_MESSAGE_TOP_CC: "CC" + FORWARD_MESSAGE_TOP_SENT: "Enviado" + FORWARD_MESSAGE_TOP_SUBJECT: "Assunto" + EMPTY_TO_ERROR_DESC: "Por favor, especifique pelo menos um destinatário" + NO_ATTACHMENTS_HERE_DESC: "Sem anexos aqui." + ATTACHMENTS_ERROR_DESC: "Aviso! Nem todos os anexos foram carregados." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Ainda não foram carregados todos os anexos" + BUTTON_REQUEST_READ_RECEIPT: "Pedir um recibo de leitura" + BUTTON_MARK_AS_IMPORTANT: "Marcar como importante" + BUTTON_OPEN_PGP: "OpenPGP (apenas texto simples)" + BUTTON_REQUEST_DSN: "Pedir um recibo de entrega" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Close" + POPUPS_ASK: + BUTTON_YES: "Sim" + BUTTON_NO: "Não" + DESC_WANT_CLOSE_THIS_WINDOW: "Tem a certeza que deseja fechar esta janela?" + DESC_WANT_DELETE_MESSAGES: "Tem a certeza de que deseja eliminar esta(s) mensagem(s)?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Escolha o idioma" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Adicionar conta?" + BUTTON_ADD_ACCOUNT: "Adicionar" + TITLE_UPDATE_ACCOUNT: "Atualizar conta?" + BUTTON_UPDATE_ACCOUNT: "Atualizar" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Adicionar identidade?" + TITLE_UPDATE_IDENTITY: "Atualizar identidade?" + BUTTON_ADD_IDENTITY: "Adicionar" + BUTTON_UPDATE_IDENTITY: "Atualizar" + LABEL_EMAIL: "E-mail" + LABEL_NAME: "Nome" + LABEL_REPLY_TO: "Resp.-Para" + LABEL_SIGNATURE: "Assinatura" + LABEL_CC: "Cc" + LABEL_BCC: "Bcc" + LABEL_SIGNATURE_INSERT_BEFORE: "Nas respostas, inserir esta assinatura acima da mensagem citada" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Criar pasta?" + LABEL_NAME: "Nome da pasta" + LABEL_PARENT: "Pasta principal" + BUTTON_CREATE: "Criar" + BUTTON_CANCEL: "Cancelar" + BUTTON_CLOSE: "Fechar" + TITLE_CREATING_PROCESS: "A criar pasta" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Eliminar todas as mensagens da pasta?" + BUTTON_CLEAR: "Limpar" + BUTTON_CANCEL: "Cancelar" + BUTTON_CLOSE: "Fechar" + DANGER_DESC_WARNING: "Atenção!" + DANGER_DESC_HTML_1: "Esta ação irá resultar na remoção definitiva de todos os e-mails na pasta %FOLDER%." + DANGER_DESC_HTML_2: "Uma vez iniciado, o processo não pode ser interrompido ou cancelado." + TITLE_CLEARING_PROCESS: "A eliminar a pasta..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Importar chave OpenPGP" + BUTTON_IMPORT_OPEN_PGP_KEY: "Importar" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "Ver chave OpenPGP" + BUTTON_SELECT: "Escolher" + BUTTON_CLOSE: "Fechar" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Gerar chaves OpenPGP" + LABEL_EMAIL: "Email" + LABEL_NAME: "Nome" + LABEL_PASSWORD: "Palavra-passe" + LABEL_KEY_BIT_LENGTH: "Comprimento da chave" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Gerar" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "Assinar/Encriptar com OpenPGP" + LABEL_SIGN: "Assinar" + LABEL_ENCRYPT: "Encriptar" + LABEL_PASSWORD: "Palavra-passe" + BUTTON_SIGN: "Assinar" + BUTTON_ENCRYPT: "Encriptar" + BUTTON_SIGN_AND_ENCRYPT: "Assinar e encriptar" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" + LABEL_KEY: "Private Key" + LABEL_PASSWORD: "Password" + BUTTON_DECRYPT: "Decrypt" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "Teste de verificação em 2-Etapas" + LABEL_CODE: "Código" + BUTTON_TEST: "Testar" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Criar um filtro?" + TITLE_EDIT_FILTER: "Atualizar um filtro?" + FILTER_NAME: "Nome" + LEGEND_CONDITIONS: "Condições" + LEGEND_ACTIONS: "Ações" + BUTTON_DONE: "Terminado" + BUTTON_ADD_CONDITION: "Adicionar uma condição" + SELECT_ACTION_NONE: "Nenhuma" + SELECT_ACTION_MOVE_TO: "Mover para" + SELECT_ACTION_FORWARD_TO: "Encaminhar para" + SELECT_ACTION_REJECT: "Rejeitar" + SELECT_ACTION_VACATION_MESSAGE: "Mensagem de férias" + SELECT_ACTION_DISCARD: "Descartar" + SELECT_FIELD_FROM: "De" + SELECT_FIELD_RECIPIENTS: "Destinatários (Para ou CC)" + SELECT_FIELD_SUBJECT: "Assunto" + SELECT_FIELD_HEADER: "Cebeçalho" + SELECT_FIELD_SIZE: "Tamanho" + SELECT_TYPE_CONTAINS: "Contém" + SELECT_TYPE_NOT_CONTAINS: "Não contém" + SELECT_TYPE_MATCHES: "Corresponde (* e ? suportados)" + SELECT_TYPE_NOT_MATCHES: "Não correponde (* e ? suportados)" + SELECT_TYPE_REGEXP: "Regexp" + SELECT_TYPE_NOT_REGEXP: "Sem Regexp" + SELECT_TYPE_EQUAL_TO: "Igual a" + SELECT_TYPE_NOT_EQUAL_TO: "Não é igual a" + SELECT_TYPE_OVER: "Superior" + SELECT_TYPE_UNDER: "Inferior" + SELECT_MATCH_ANY: "Correspondendo a qualquer uma das regras que se seguem" + SELECT_MATCH_ALL: "Correspondendo a todas as regras que se seguem" + MARK_AS_READ_LABEL: "Marcar como lida" + REPLY_INTERVAL_LABEL: "Intervalo de resposta (dias)" + KEEP_LABEL: "Manter" + STOP_LABEL: "Não parar de processar as regras" + EMAIL_LABEL: "Email" + VACATION_SUBJECT_LABEL: "Assunto (opcional)" + VACATION_MESSAGE_LABEL: "Mensagem" + VACATION_RECIPIENTS_LABEL: "Destinatários (separados por vírgula)" + REJECT_MESSAGE_LABEL: "Rejeitar mensagem" + ALL_INCOMING_MESSAGES_DESC: "Todas as mensagens recebidas" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Selecione as pastas do sistema" + SELECT_CHOOSE_ONE: "Escolha uma" + SELECT_UNUSE_NAME: "Não usar" + LABEL_SENT: "Enviadas" + LABEL_DRAFTS: "Rascunhos" + LABEL_SPAM: "Spam" + LABEL_TRASH: "Lixo" + LABEL_ARCHIVE: "Arquivos" + BUTTON_CANCEL: "Cancelar" + BUTTON_CLOSE: "Fechar" + NOTIFICATION_SENT: | + Você não selecionou a pasta "Sent" de sistema, onde as mensagens enviadas são colocadas. + Se você não quiser salvar as mensagens enviadas, por favor selecione a opção "Do not use". + NOTIFICATION_DRAFTS: "Você não selecionou a pasta \"Drafts\" de sistema, onde as mensagens são guardadas enquanto são escritas." + NOTIFICATION_SPAM: | + Você não selecionou a pasta "Spam" de sistema, onde as mensagens de spam são colocadas. + Se você deseja remover as mensagens definitivamente, por favor selecione a opção "Do not use". + NOTIFICATION_TRASH: | + Você não selecionou a pasta "Trash" de sistema, onde as mensagens eliminadas são colocadas. + Se você deseja remover as mensagens definitivamente, por favor selecione a opção "Do not use". + NOTIFICATION_ARCHIVE: "Você não selecionou a pasta \"Archive\" de sistema, onde as mensagens arquivadas são colocadas." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "Verificação em 2-Etapas" + LABEL_ENABLE_TWO_FACTOR: "Ativar verificação em 2-Etapas" + LABEL_TWO_FACTOR_USER: "Utilizador" + LABEL_TWO_FACTOR_STATUS: "Estado" + LABEL_TWO_FACTOR_SECRET: "Segredo" + LABEL_TWO_FACTOR_BACKUP_CODES: "Códigos secundários" + BUTTON_CREATE: "Criar novo Segredo" + BUTTON_ACTIVATE: "Activate" + BUTTON_CLEAR: "Limpar" + BUTTON_LOGOUT: "Logout" + BUTTON_DONE: "Done" + BUTTON_TEST: "Testar" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Mostrar Segredo" + BUTTON_HIDE_SECRET: "Ocultar Segredo" + TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configurado" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Não configurado" + TWO_FACTOR_SECRET_DESC: >- + Importe esta informação no seu cliente Google Authenticator (ou outro cliente + TOTP) utilizando o código QR fornecido abaixo ou introduzindo o código manualmente. + TWO_FACTOR_BACKUP_CODES_DESC: >- + Se não consegue receber códigos através do Google Authenticator, pode usar + os códigos secundários para entrar. Após ter usado um código secundário para + entrar, este será desativado. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Não pode alterar este parâmetro antes de testar." + TITLES: + LOADING: "A carregar" + LOGIN: "Utilizador" + MAILBOX: "Caixa de correio" + SETTINGS: "Definições" + COMPOSE: "Compor" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "O ficheiro é muito grande" + ERROR_FILE_PARTIALLY_UPLOADED: "O ficheiro foi carregado parcialmente devido a um erro desconhecido" + ERROR_NO_FILE_UPLOADED: "Nenhum ficheiro carregado" + ERROR_MISSING_TEMP_FOLDER: "O ficheiro temporário está em falta" + ERROR_ON_SAVING_FILE: "Ocorreu um erro desconhecido durante o carregamento do ficheiro" + ERROR_FILE_TYPE: "Tipo de ficheiro inválido" + ERROR_UNKNOWN: "Ocorreu um erro desconhecido durante o carregamento do ficheiro" + EDITOR: + TEXT_SWITCHER_RICH_FORMATTING: "Formatação avançada" + TEXT_SWITCHER_CONFIRM: "A formatação de texto e as imagens serão perdidas. Tem certeza de que deseja continuar?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Pessoal" + LABEL_GENERAL_NAME: "Geral" + LABEL_CONTACTS_NAME: "Contactos" + LABEL_FOLDERS_NAME: "Pastas" + LABEL_ACCOUNTS_NAME: "Contas" + LABEL_IDENTITY_NAME: "Identidade" + LABEL_IDENTITIES_NAME: "Identidades" + LABEL_FILTERS_NAME: "Filtros" + LABEL_TEMPLATES_NAME: "Modelos" + LABEL_SECURITY_NAME: "Segurança" + LABEL_SOCIAL_NAME: "Social" + LABEL_THEMES_NAME: "Temas" + LABEL_CHANGE_PASSWORD_NAME: "Palavra-passe" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Voltar" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filtros" + BUTTON_SAVE: "Guardar" + BUTTON_ADD_FILTER: "Adicionar um filtro" + BUTTON_DELETE: "Eliminar" + BUTTON_RAW_SCRIPT: "Usar um script personalizado de utilizador" + SUBNAME_NONE: "Nenhum" + SUBNAME_MOVE_TO: "Mover para \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Encaminhar para \"%EMAIL%\"" + SUBNAME_REJECT: "Rejeitar" + SUBNAME_VACATION_MESSAGE: "Mensagem de férias" + SUBNAME_DISCARD: "Descartar" + CAPABILITY_LABEL: "Capacidade" + LOADING_PROCESS: "A atualizar lista de filtros" + DELETING_ASK: "Tem a certeza?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Estas alterações têm que ser guardadas no servidor." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identidade" + LABEL_DISPLAY_NAME: "Nome" + LABEL_REPLY_TO: "Resp.-Para" + LABEL_SIGNATURE: "Assinatura" + LABEL_ADD_SIGNATURE_TO_ALL: "Adicionar a sua assinatura a todas as mensagens de saída" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Segurança" + LABEL_CONFIGURE_TWO_FACTOR: "Configurar verificação de 2 etapas" + LABEL_AUTOLOGOUT: "Terminar sessão auto." + AUTOLOGIN_NEVER_OPTION_NAME: "Nunca" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minuto(s)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Geral" + LABEL_LANGUAGE: "Idioma" + LABEL_IDENTITY: "Identidade" + LABEL_LAYOUT: "Apresentação" + LABEL_LAYOUT_NO_SPLIT: "Sem separação" + LABEL_LAYOUT_VERTICAL_SPLIT: "Separação vertical" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Separação horizontal" + LABEL_EDITOR: "Editor de texto padrão" + LABEL_EDITOR_HTML: "Html" + LABEL_EDITOR_PLAIN: "Texto simples" + LABEL_EDITOR_HTML_FORCED: "Html (forçado)" + LABEL_EDITOR_PLAIN_FORCED: "Texto simples (forçado)" + LABEL_ANIMATION: "Animação de interface" + LABEL_ANIMATION_FULL: "Completa" + LABEL_ANIMATION_NORMAL: "Normal" + LABEL_ANIMATION_NONE: "Nenhuma" + LABEL_VIEW_OPTIONS: "Ver opções" + LABEL_USE_PREVIEW_PANE: "Use o painel de pré-visualização" + LABEL_USE_CHECKBOXES_IN_LIST: "Apresentar caixas de seleção na lista" + LABEL_USE_THREADS: "Usar tópicos de conversa" + LABEL_REPLY_SAME_FOLDER: "Colocar respostas na pasta das mensagens a que responde" + LABEL_SHOW_IMAGES: "Apresentar sempre as imagens no corpo da mensagem" + LABEL_SHOW_ANIMATION: "Mostrar animação" + LABEL_MESSAGE_PER_PAGE: "Mensagens por página" + LABEL_NOTIFICATIONS: "Notificações" + LABEL_SOUND_NOTIFICATION: "Notificações sonoras" + LABEL_CHROME_NOTIFICATION_DESC: "Apresentar notificações para novas mensagens" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Bloqueado pelo navegador)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Contactos" + LABEL_CONTACTS_AUTOSAVE: "Adicionar automaticamente destinatários à sua lista de endereços" + LEGEND_CONTACTS_SYNC: "Sincronização Remota (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Ativar sincronização remota" + LABEL_CONTACTS_SYNC_SERVER: "Servidor" + LABEL_CONTACTS_SYNC_AB_URL: "URL do livro de endereços" + LABEL_CONTACTS_SYNC_USER: "Utilizador" + LABEL_CONTACTS_SYNC_PASSWORD: "Palavra-passe" + SETTINGS_THEMES: + LEGEND_THEMES: "Temas" + LEGEND_THEMES_CUSTOM: "Configuração de tema personalizado" + LABEL_CUSTOM_TYPE: "Tipo" + LABEL_CUSTOM_TYPE_LIGHT: "Claro" + LABEL_CUSTOM_TYPE_DARK: "Escuro" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Imagem de fundo" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Carregar imagem de fundo (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Ficheiro muito grande" + ERROR_FILE_TYPE_ERROR: "Tipo de ficheiro inválido (apenas JPG e PNG)" + ERROR_UNKNOWN: "Ocorreu um erro desconhecido durante o carregamento do ficheiro" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Ligar ao Google" + BUTTON_GOOGLE_DISCONNECT: "Desligar do Google" + MAIN_GOOGLE_DESC: "Depois de ativar o início de sessão através do Google, poderá entrar nesta conta usando o botão do Google no ecrã de início de sessão." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Ligar ao Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Desligar do Facebook" + MAIN_FACEBOOK_DESC: "Depois de ativar o início de sessão através do Facebook, poderá entrar nesta conta usando o botão do Facebook no ecrã de início de sessão." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Ligar ao Twitter" + BUTTON_TWITTER_DISCONNECT: "Desligar do Twitter" + MAIN_TWITTER_DESC: "Depois de ativar o início de sessão através do Twitter, poderá entrar nesta conta usando o botão do Twitter no ecrã de início de sessão." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Lista de pastas" + BUTTON_CREATE: "Criar pasta" + BUTTON_DELETE: "Excluir" + BUTTON_SUBSCRIBE: "Assinar" + BUTTON_UNSUBSCRIBE: "Anular" + LOADING_PROCESS: "Atualizar lista de pastas" + CREATING_PROCESS: "Criar a pasta" + DELETING_PROCESS: "Eliminar a pasta" + RENAMING_PROCESS: "Renomear a pasta" + DELETING_ASK: "Tem a certeza?" + TO_MANY_FOLDERS_DESC_1: "Você tem demasiadas pastas!" + TO_MANY_FOLDERS_DESC_2: "Apenas apresentámos parte delas, para evitar problemas de desempenho." + HELP_DELETE_FOLDER: "Eliminar pasta" + HELP_SHOW_HIDE_FOLDER: "Mostrar/ocultar pasta" + HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Lista de contas" + LEGEND_IDENTITIES: "Identidades" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Contas e Identidades" + BUTTON_ADD_ACCOUNT: "Adicionar uma conta" + BUTTON_ADD_IDENTITY: "Adicionar uma identidade" + BUTTON_DELETE: "Eliminar" + LOADING_PROCESS: "A atualizar..." + DELETING_ASK: "Tem a certeza?" + DEFAULT_IDENTITY_LABEL: "predefinida" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identidade" + LEGEND_IDENTITIES: "Identidades adicionais" + LABEL_DEFAULT: "Predefinida" + LABEL_DISPLAY_NAME: "Nome" + LABEL_REPLY_TO: "Resp.-Para" + LABEL_SIGNATURE: "Assinatura" + LABEL_ADD_SIGNATURE_TO_ALL: "Adicione a sua assinatura a todas as mensagens enviadas" + BUTTON_ADD_IDENTITY: "Adicionar identidade" + BUTTON_DELETE: "Eliminar" + LOADING_PROCESS: "A atualizar lista de identidades" + DELETING_ASK: "Tem a certeza?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Mudar a palavra-passe" + LABEL_CURRENT_PASSWORD: "Palavra-passe atual" + LABEL_NEW_PASSWORD: "Nova palavra-passe" + LABEL_REPEAT_PASSWORD: "Repita a nova palavra-passe" + BUTTON_UPDATE_PASSWORD: "Defina a nova palavra-passe" + ERROR_PASSWORD_MISMATCH: "As palavras-passe não são idênticas, tente novamente por favor" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Importar chave OpenPGP" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Gerar chaves OpenPGP" + TITLE_PRIVATE: "Privada" + TITLE_PUBLIC: "Pública" + DELETING_ASK: "Tem a certeza?" + GENERATE_ONLY_HTTPS: "Apenas HTTPS" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Ajuda para atalhos de teclado" + TAB_MAILBOX: "Caixa de correio" + TAB_MESSAGE_LIST: "Lista de mensagens" + TAB_MESSAGE_VIEW: "Vista da mensagem" + TAB_COMPOSE: "Compor" + LABEL_OPEN_USER_DROPDOWN: "Abrir menu do utilizador" + LABEL_REPLY: "Responder" + LABEL_REPLY_ALL: "Responder a todos" + LABEL_FORWARD: "Encaminhar" + LABEL_FORWARD_MULTIPLY: "Encaminhar (multiplicar)" + LABEL_HELP: "Ajuda" + LABEL_CHECK_ALL: "Selecionar todas as mensagens" + LABEL_ARCHIVE: "Arquivar" + LABEL_DELETE: "Eliminar" + LABEL_OPEN_THREAD: "Abrir tópico selecionado" + LABEL_MOVE: "Mover" + LABEL_READ: "Ler as mensagens selecionadas" + LABEL_UNREAD: "Marcar as mensagens selecionadas como não lidas" + LABEL_IMPORTANT: "Marcar como Importantes as mensagens selecionadas" + LABEL_SEARCH: "Pesquisar" + LABEL_CANCEL_SEARCH: "Cancelar pesquisa" + LABEL_FULLSCREEN_ENTER: "Ecrã-inteiro (com janela de pré-visualização)" + LABEL_VIEW_MESSAGE_ENTER: "Ver mensagem (sem janela de pré-visualização)" + LABEL_SWITCH_TO_MESSAGE: "Dar foco à mensagem selecionada" + LABEL_SWITCH_TO_FOLDER_LIST: "Dar foco à lista de pastas" + LABEL_FULLSCREEN_TOGGLE: "Alternar modo ecrã-inteiro" + LABEL_BLOCKQUOTES_TOGGLE: "Alternar visibilidade do texto citado" + LABEL_THREAD_NEXT: "Mensagem seguinte deste tópico" + LABEL_THREAD_PREV: "Mensagem anterior deste tópico" + LABEL_PRINT: "Imprimir" + LABEL_EXIT_FULLSCREEN: "Sair do modo ecrã-inteiro" + LABEL_CLOSE_MESSAGE: "Fechar mensagem (sem janela de pré-visualização)" + LABEL_SWITCH_TO_LIST: "Dar foco à lista de mensagens" + LABEL_OPEN_COMPOSE_POPUP: "Abrir janela de composição" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Abrir menu de identidades" + LABEL_SAVE_MESSAGE: "Guardar mensagem" + LABEL_SEND_MESSAGE: "Enviar mensagem" + LABEL_CLOSE_COMPOSE: "Fechar janela de composição" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "Nenhuma chave pública encontrada" + NO_PUBLIC_KEYS_FOUND_FOR: "Nenhuma chave pública encontrada para o email \"%EMAIL%\"" + NO_PRIVATE_KEY_FOUND: "Nenhuma chave privada encontrada" + NO_PRIVATE_KEY_FOUND_FOR: "Nenhuma chave privada encontrada para o email \"%EMAIL%\"" + ADD_A_PUBLICK_KEY: "Adicionar uma chave pública" + UNVERIFIRED_SIGNATURE: "Assinatura não verificada" + DECRYPTION_ERROR: "Erro de desencriptação OpenPGP" + GOOD_SIGNATURE: "Boa assinatura de %USER%" + PGP_ERROR: "Erro OpenPGP: %ERROR%" + SPECIFY_FROM_EMAIL: "Por favor especifique o endereço de email DE" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Por favor especifique pelo menos um destinatário" + NOTIFICATIONS: + INVALID_TOKEN: "Token inválido" + AUTH_ERROR: "Falha na autenticação" + ACCESS_ERROR: "Erro de acesso" + CONNECTION_ERROR: "Não foi possível conectar ao servidor" + CAPTCHA_ERROR: "Verificação CAPTCHA inválido." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- + Esse usuário Facebook não está associado a nenhuma conta de email ainda. Entre + utilizando seu email e senha e habilite essa função em suas configurações + de conta. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- + Esse usuário Twitter não está associado a nenhuma conta de email ainda. Entre + utilizando seu email e senha e habilite essa função em suas configurações + de conta. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- + Esse usuário Google não está associado a nenhuma conta de email ainda. Entre + utilizando seu email e senha e habilite essa função em suas configurações + de conta. + DOMAIN_NOT_ALLOWED: "Este domínio não é permitido" + ACCOUNT_NOT_ALLOWED: "Esta conta não é permitida" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "É necessária a verificação em duas etapas" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Erro na verifricação em duas etapas" + COULD_NOT_SAVE_NEW_PASSWORD: "Não foi possível guardar a nova palavra-passe" + CURRENT_PASSWORD_INCORRECT: "A palavra-passe atual está incorreta" + NEW_PASSWORD_SHORT: "A palavra-passe é muito curta" + NEW_PASSWORD_WEAK: "A palavra-passe é muito simples" + NEW_PASSWORD_FORBIDDENT: "A palavra-passe contém caracteres proibidos" + CONTACTS_SYNC_ERROR: "Erro na sincronização de contactos" + CANT_GET_MESSAGE_LIST: "Não é possível obter a lista de mensagens" + CANT_GET_MESSAGE: "Não é possível obter a mensagem" + CANT_DELETE_MESSAGE: "Não é possível eliminar a mensagem" + CANT_MOVE_MESSAGE: "Não é possível mover a mensagem" + CANT_SAVE_MESSAGE: "Não é possível guardar a mensagem" + CANT_SEND_MESSAGE: "Não é possível enviar a mensagem" + INVALID_RECIPIENTS: "Destinatário inválido" + CANT_SAVE_FILTERS: "Não é possível guardar os filtros" + CANT_GET_FILTERS: "Não é possível obter os filtros" + FILTERS_ARE_NOT_CORRECT: "Os filtros não estão corretos" + CANT_CREATE_FOLDER: "Não é possível criar a pasta" + CANT_RENAME_FOLDER: "Não é possível renomear a pasta" + CANT_DELETE_FOLDER: "Não é possível eliminar a pasta" + CANT_DELETE_NON_EMPTY_FOLDER: "Não é possível eliminar pastas com conteúdos" + CANT_SUBSCRIBE_FOLDER: "Não é possível assinar esta pasta" + CANT_UNSUBSCRIBE_FOLDER: "Não é possível cancelar esta pasta" + CANT_SAVE_SETTINGS: "Não é possível salvar as definições" + CANT_SAVE_PLUGIN_SETTINGS: "Não é possível guardar as definições" + DOMAIN_ALREADY_EXISTS: "O domínio já existe" + CANT_INSTALL_PACKAGE: "Erro ao instalar pacote" + CANT_DELETE_PACKAGE: "Erro ao remover pacote" + INVALID_PLUGIN_PACKAGE: "Pacote de plugin inválido" + UNSUPPORTED_PLUGIN_PACKAGE: "Pacote de plugin não suportado" + LICENSING_SERVER_IS_UNAVAILABLE: "O servidor de subscrição está indisponível" + LICENSING_DOMAIN_EXPIRED: "A subscrição para este domínio expirou." + LICENSING_DOMAIN_BANNED: "A subscrição para este domínio está proibida." + DEMO_SEND_MESSAGE_ERROR: "Por motivos de segurança, esta conta de demonstração não tem permissão para enviar mensagens para endereços de e-mail externos!" + DEMO_ACCOUNT_ERROR: "Por motivos de segurança, esta conta não tem permissão de executar esta ação!" + ACCOUNT_ALREADY_EXISTS: "Esta conta já existe" + ACCOUNT_DOES_NOT_EXIST: "Conta inexistente" + MAIL_SERVER_ERROR: "Ocorreu um erro ao aceder ao servidor de email" + INVALID_INPUT_ARGUMENT: "Parâmetro de entrada inválido" + UNKNOWN_ERROR: "Erro desconhecido" + STATIC: + BACK_LINK: "Recarregar" + DOMAIN_LIST_DESC: "Lista de domínios que o webmail tem permissão para aceder." + PHP_EXSTENSIONS_ERROR_DESC: "As extensões PHP necessárias não estão disponíveis na sua configuração do PHP!" + PHP_VERSION_ERROR_DESC: "A sua versão do PHP (%VERSION%) é menor do que a mínima exigida: 5.3.0!" + NO_SCRIPT_TITLE: "É necessário JavaScript para esta aplicação." + NO_SCRIPT_DESC: | + O suporte de JavaScript não está disponível no seu navegador. + Por favor ative o suporte de JavaScript nas definições do seu navegador e tente novamente. + NO_COOKIE_TITLE: "É necessário suporte de cookies para esta aplicação." + NO_COOKIE_DESC: | + O suport de Cookies não está disponível no seu navegador. + Por favor ative o suporte de Cookies nas definições do seu navegador e tente novamente. + BAD_BROWSER_TITLE: "O seu navegador está desatualizado." + BAD_BROWSER_DESC: | + Para usar todas as funções da aplicação, + transfira e instale um destes navegadores: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ro_RO.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ro_RO.yml new file mode 100755 index 00000000..7d216b6a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ro_RO.yml @@ -0,0 +1,711 @@ +ro_RO: + LOGIN: + LABEL_EMAIL: "Email" + LABEL_LOGIN: "Conectare" + LABEL_PASSWORD: "Parolă" + LABEL_SIGN_ME: "Ține-mă minte" + LABEL_VERIFICATION_CODE: "Cod de verificare" + LABEL_DONT_ASK_VERIFICATION_CODE: "Nu mai cereți codul timp de 2 săptămâni" + BUTTON_SIGN_IN: "Conectare" + TITLE_SIGN_IN_GOOGLE: "Conectați-vă cu Google" + TITLE_SIGN_IN_FACEBOOK: "Conectați-vă cu Facebook" + TITLE_SIGN_IN_TWITTER: "Conectați-vă cu Twitter" + LABEL_FORGOT_PASSWORD: "Am uitat parola" + LABEL_REGISTRATION: "Înregistrare" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Adaugă un cont" + BUTTON_SETTINGS: "Opțiuni" + BUTTON_HELP: "Help" + BUTTON_LOGOUT: "Deconectare" + MOBILE: + BUTTON_MOBILE_VERSION: "Versiunea de mobil" + BUTTON_DESKTOP_VERSION: "Versiunea desktop" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Caută în mesaje" + TITLE_ADV: "Căutare avansată" + LABEL_ADV_FROM: "De la" + LABEL_ADV_TO: "către" + LABEL_ADV_SUBJECT: "Subiect" + LABEL_ADV_TEXT: "Conținut" + LABEL_ADV_HAS_ATTACHMENT: "Are atașament" + LABEL_ADV_HAS_ATTACHMENTS: "Atașamente" + LABEL_ADV_FLAGGED: "Importante" + LABEL_ADV_UNSEEN: "Necitit" + LABEL_ADV_DATE: "Data" + LABEL_ADV_DATE_ALL: "Tot timpul" + LABEL_ADV_DATE_3_DAYS: "З zile" + LABEL_ADV_DATE_7_DAYS: "7 zile" + LABEL_ADV_DATE_MONTH: "în această lună" + LABEL_ADV_DATE_3_MONTHS: "3 luni" + LABEL_ADV_DATE_6_MONTHS: "6 luni" + LABEL_ADV_DATE_YEAR: "în acest an" + BUTTON_ADV_SEARCH: "căutare" + PREVIEW_POPUP: + FULLSCREEN: "Toggle fullscreen" + ZOOM: "Zoom in/out" + CLOSE: "Închide (Esc)" + LOADING: "Se îcarcă..." + GALLERY_PREV: "Precedentul (Стрелка ←)" + GALLERY_NEXT: "Următorul (Стрелка →)" + GALLERY_COUNTER: "%curr% din %total%" + IMAGE_ERROR: "Imaginea nu a putut fi încărcată" + AJAX_ERROR: "Conținutul nu a putut fi încărcat" + FOLDER_LIST: + BUTTON_COMPOSE: "Compune" + BUTTON_CONTACTS: "Contacte" + BUTTON_NEW_MESSAGE: "Mesaj nou" + INBOX_NAME: "Intrări" + SENT_NAME: "Trimise" + DRAFTS_NAME: "Salvate" + SPAM_NAME: "SPAM" + TRASH_NAME: "Șterse" + ARCHIVE_NAME: "Archive" + QUOTA: + TITLE: "Cotă" + MESSAGE_LIST: + BUTTON_RELOAD: "Actualizare" + BUTTON_MOVE_TO: "Mută la" + BUTTON_DELETE: "Șterge" + BUTTON_ARCHIVE: "Archive" + BUTTON_SPAM: "SPAM" + BUTTON_NOT_SPAM: "Not SPAM" + BUTTON_EMPTY_FOLDER: "Golește folderul" + BUTTON_MULTY_FORWARD: "Redirecționează mesajul" + BUTTON_DELETE_WITHOUT_MOVE: "Șterge definitiv" + BUTTON_MORE: "Mai mult" + MENU_SET_SEEN: "Marchează ca citit" + MENU_SET_ALL_SEEN: "Marchează toate ca citite" + MENU_UNSET_SEEN: "Marchează ca necitit" + MENU_SET_FLAG: "Seteaza ca important" + MENU_UNSET_FLAG: "Setează ca neimportant" + MENU_SELECT_ALL: "Toate" + MENU_SELECT_NONE: "Deselectează" + MENU_SELECT_INVERT: "Inversează selecția" + MENU_SELECT_UNSEEN: "Necitit" + MENU_SELECT_SEEN: "Citit" + MENU_SELECT_FLAGGED: "Important" + MENU_SELECT_UNFLAGGED: "Neimportant" + EMPTY_LIST: "Nimic aici, deocamdată" + EMPTY_SEARCH_LIST: "Nu am găsit nimic." + SEARCH_RESULT_FOR: "Rezultat căutare \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "înapoi la lista de mesaje" + LIST_LOADING: "Caut..." + EMPTY_SUBJECT_TEXT: "(nici un subiect)" + PUT_MESSAGE_HERE: "EROARE! CONTACTAȚI ADIMISTRATORUL! (trimiteți un prt.scr)" + TODAY_AT: "azi %TIME%" + YESTERDAY_AT: "ieri %TIME%" + SEARCH_PLACEHOLDER: "caută mesaje" + NEW_MESSAGE_NOTIFICATION: "Aveți %COUNT% mesaje noi!" + QUOTA_SIZE: "Ați folosit %SIZE% (%PROC%%) din %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Editează" + BUTTON_BACK: "Înapoi" + BUTTON_CLOSE: "Închide" + BUTTON_DELETE: "Șterge" + BUTTON_UNSUBSCRIBE: "Dezabonare de la această listă" + BUTTON_ARCHIVE: "Archive" + BUTTON_SPAM: "Spam" + BUTTON_NOT_SPAM: "Not Spam" + BUTTON_MOVE_TO: "Mută la" + BUTTON_MORE: "Mai mult" + BUTTON_REPLY: "Răspunde" + BUTTON_REPLY_ALL: "Răspunde la toți" + BUTTON_FORWARD: "Redirecționează" + BUTTON_FORWARD_AS_ATTACHMENT: "Redirecționează cu atașament" + BUTTON_EDIT_AS_NEW: "Editează ca nou" + BUTTON_SHOW_IMAGES: "Arată imaginile" + BUTTON_NOTIFY_READ_RECEIPT: "Anunță expeditorul că am citit mesajul" + BUTTON_IN_NEW_WINDOW: "Deschide într-o fereastră separată" + BUTTON_THREAD_LIST: "Thread list" + BUTTON_THREAD_PREV: "Înapoi" + BUTTON_THREAD_NEXT: "Înainte" + BUTTON_THREAD_MORE: "Mai multe mesaje" + MENU_HEADERS: "Vezi titlurile" + MENU_VIEW_ORIGINAL: "Vezi originalul" + MENU_DOWNLOAD_ORIGINAL: "Descărcați ca fișier eml" + MENU_FILTER_SIMILAR: "Filtrează similarele" + MENU_PRINT: "Printează" + EMPTY_SUBJECT_TEXT: "(nici un subiect)" + LABEL_SUBJECT: "Subiect" + LABEL_DATE: "Data" + LABEL_FROM: "De la" + LABEL_FROM_SHORT: "de la" + LABEL_TO: "către" + LABEL_TO_SHORT: "către" + LABEL_CC: "copie către" + LABEL_BCC: "copie 2 către" + LABEL_REPLY_TO: "Reply-To" + PRINT_LABEL_FROM: "de la" + PRINT_LABEL_TO: "către" + PRINT_LABEL_CC: "copie către" + PRINT_LABEL_BCC: "a doua copie către" + PRINT_LABEL_REPLY_TO: "Reply-To" + PRINT_LABEL_DATE: "Data" + PRINT_LABEL_SUBJECT: "Subiect" + PRINT_LABEL_ATTACHMENTS: "Atașament" + MESSAGE_LOADING: "Se încarcă..." + MESSAGE_VIEW_DESC: "Selectați un mesaj pentru a-l vizualiza." + MESSAGE_VIEW_MOVE_DESC: "Faceți clic pe numele dosarului din panoul din stânga pentru a selecta destinația." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Parolă" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" + LINK_DOWNLOAD_AS_ZIP: "Download as zip" + LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" + LINK_SAVE_TO_CLOUD: "Salvați în Cloud" + LINK_SAVE_TO_DROPBOX: "Save to Dropbox" + READ_RECEIPT: + SUBJECT: "Mesajul dumneavoastră a fost citit - %SUBJECT%" + BODY: | + Aceasta este o confirmare de citire pentru mesajul trimis la adresa %READ-RECEIPT%. + + Примечание: Această notificare de citire însemnă că mesajul ajuns la destinatar. Această funție nu garanteză că destinatarul a citit conținutul mesajului + SUGGESTIONS: + SEARCHING_DESC: "Căutare..." + CONTACTS: + LEGEND_CONTACTS: "Contact" + SEARCH_INPUT_PLACEHOLDER: "Caută contacte" + BUTTON_ADD_CONTACT: "Adugă un contact" + BUTTON_CREATE_CONTACT: "Salvează" + BUTTON_UPDATE_CONTACT: "Actualizează" + BUTTON_IMPORT: "Importă (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" + BUTTON_EXPORT_CSV: "Export (csv)" + ERROR_IMPORT_FILE: "Nu s-a putut importa (formatul fișierului este greșit)" + LIST_LOADING: "Se încarcă..." + EMPTY_LIST: "Agenda este goală" + EMPTY_SEARCH: "Nu am găsit nimic." + CLEAR_SEARCH: "Golește căutarea" + CONTACT_VIEW_DESC: "Selectați un contact pentru a-l vizualiza" + LABEL_DISPLAY_NAME: "Nume complet" + LABEL_EMAIL: "Adresa de eMail" + LABEL_PHONE: "Тelefon" + LABEL_WEB: "Web" + LABEL_BIRTHDAY: "Birthday" + LINK_ADD_EMAIL: "Adugă Mail nou" + LINK_ADD_PHONE: "Adaugă un număr nou" + LINK_BIRTHDAY: "Birthday" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Introduceți numele complet" + PLACEHOLDER_ENTER_LAST_NAME: "Prenume" + PLACEHOLDER_ENTER_FIRST_NAME: "Nume" + PLACEHOLDER_ENTER_NICK_NAME: "Enter nickname" + LABEL_READ_ONLY: "Doar pentru citire" + LABEL_SHARE: "Distribuie" + ADD_MENU_LABEL: "Add" + ADD_MENU_NICKNAME: "Nickname" + ADD_MENU_NOTES: "Notes" + ADD_MENU_EMAIL: "Email" + ADD_MENU_PHONE: "Phone" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Address" + ADD_MENU_BIRTHDAY: "Birthday" + ADD_MENU_TAGS: "Tags" + BUTTON_SHARE_NONE: "Nimic" + BUTTON_SHARE_ALL: "Toate" + BUTTON_SYNC: "Synchronization (CardDAV)" + COMPOSE: + TITLE_FROM: "De la" + TITLE_TO: "Către" + TITLE_CC: "Copie" + TITLE_BCC: "Copie 2" + TITLE_REPLY_TO: "Răspune la" + TITLE_SUBJECT: "Subiect" + LINK_SHOW_INPUTS: "Extinde" + BUTTON_SEND: "Trimite" + BUTTON_SAVE: "Salvează" + BUTTON_DELETE: "Șterge" + BUTTON_CANCEL: "Anulează" + BUTTON_MINIMIZE: "Minimize" + SAVED_TIME: "Salvat la %TIME%" + SAVED_ERROR_ON_SEND: "Mesajul a fost trimis, dar nu a fost slavat" + DISCARD_UNSAVED_DATA: "Discard unsaved data?" + ATTACH_FILES: "Atașează fișiere" + ATTACH_DROP_FILES_DESC: "Puneți fișierele aici" + ATTACH_ITEM_CANCEL: "Anulează" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% a scris" + FORWARD_MESSAGE_TOP_TITLE: "-------- Mesajul original -------" + FORWARD_MESSAGE_TOP_FROM: "De la" + FORWARD_MESSAGE_TOP_TO: "Către" + FORWARD_MESSAGE_TOP_CC: "Copie" + FORWARD_MESSAGE_TOP_SENT: "Primit la" + FORWARD_MESSAGE_TOP_SUBJECT: "Subiect" + EMPTY_TO_ERROR_DESC: "Vă rugăm să specificați cel puțin un destinatar" + NO_ATTACHMENTS_HERE_DESC: "No attachments here." + ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet" + BUTTON_REQUEST_READ_RECEIPT: "Cere confirmare de citire" + BUTTON_MARK_AS_IMPORTANT: "Mark as important" + BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" + BUTTON_REQUEST_DSN: "Request a delivery receipt" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Close" + POPUPS_ASK: + BUTTON_YES: "Da" + BUTTON_NO: "Nu" + DESC_WANT_CLOSE_THIS_WINDOW: "Sigur doriți să închideți această fereastră?" + DESC_WANT_DELETE_MESSAGES: "Sigur doriți să ștergeți mesajul(e)?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Limbă" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Adăugați un cont" + BUTTON_ADD_ACCOUNT: "Adaugă" + TITLE_UPDATE_ACCOUNT: "Update Account?" + BUTTON_UPDATE_ACCOUNT: "Update" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Adăugați un profil" + TITLE_UPDATE_IDENTITY: "Actualizați profilul" + BUTTON_ADD_IDENTITY: "Adăugați" + BUTTON_UPDATE_IDENTITY: "Actualizați" + LABEL_EMAIL: "eMail" + LABEL_NAME: "Nume" + LABEL_REPLY_TO: "Răspune la" + LABEL_SIGNATURE: "Signature" + LABEL_CC: "Cc" + LABEL_BCC: "Copie" + LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Creați un dosar" + LABEL_NAME: "Nume" + LABEL_PARENT: "Dosar părinte" + BUTTON_CREATE: "Сrează" + BUTTON_CANCEL: "Anulează" + BUTTON_CLOSE: "Închide" + TITLE_CREATING_PROCESS: "Creez dosarul" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Goliți dosarul ?" + BUTTON_CLEAR: "Curăță" + BUTTON_CANCEL: "Anulează" + BUTTON_CLOSE: "Închide" + DANGER_DESC_WARNING: "Atenție!" + DANGER_DESC_HTML_1: "Această acțiune va conduce la eliminarea completă a tuturor mesajelor din dosarul %FOLDER%." + DANGER_DESC_HTML_2: "După începerea procesului de curățare nu mai puteți anula procesul." + TITLE_CLEARING_PROCESS: "Curăț dosarul..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Import OpenPGP key" + BUTTON_IMPORT_OPEN_PGP_KEY: "Import" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "View OpenPGP key" + BUTTON_SELECT: "Select" + BUTTON_CLOSE: "Close" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP keys" + LABEL_EMAIL: "Email" + LABEL_NAME: "Name" + LABEL_PASSWORD: "Password" + LABEL_KEY_BIT_LENGTH: "Key length" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" + LABEL_SIGN: "Sign" + LABEL_ENCRYPT: "Encrypt" + LABEL_PASSWORD: "Password" + BUTTON_SIGN: "Sign" + BUTTON_ENCRYPT: "Encrypt" + BUTTON_SIGN_AND_ENCRYPT: "Sign and encrypt" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" + LABEL_KEY: "Private Key" + LABEL_PASSWORD: "Password" + BUTTON_DECRYPT: "Decrypt" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "2-Step verification test" + LABEL_CODE: "Code" + BUTTON_TEST: "Test" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Create a filter?" + TITLE_EDIT_FILTER: "Update filter?" + FILTER_NAME: "Name" + LEGEND_CONDITIONS: "Conditions" + LEGEND_ACTIONS: "Actions" + BUTTON_DONE: "Done" + BUTTON_ADD_CONDITION: "Add a Condition" + SELECT_ACTION_NONE: "None" + SELECT_ACTION_MOVE_TO: "Move to" + SELECT_ACTION_FORWARD_TO: "Forward to" + SELECT_ACTION_REJECT: "Reject" + SELECT_ACTION_VACATION_MESSAGE: "Vacation message" + SELECT_ACTION_DISCARD: "Discard" + SELECT_FIELD_FROM: "From" + SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" + SELECT_FIELD_SUBJECT: "Subject" + SELECT_FIELD_HEADER: "Header" + SELECT_FIELD_SIZE: "Size" + SELECT_TYPE_CONTAINS: "Contains" + SELECT_TYPE_NOT_CONTAINS: "Not Contains" + SELECT_TYPE_MATCHES: "Matches (* and ? supported)" + SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" + SELECT_TYPE_REGEXP: "Regexp" + SELECT_TYPE_NOT_REGEXP: "Not Regexp" + SELECT_TYPE_EQUAL_TO: "Equal To" + SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" + SELECT_TYPE_OVER: "Over" + SELECT_TYPE_UNDER: "Under" + SELECT_MATCH_ANY: "Matching any of the following rules" + SELECT_MATCH_ALL: "Matching all of the following rules" + MARK_AS_READ_LABEL: "Mark as read" + REPLY_INTERVAL_LABEL: "Reply interval (days)" + KEEP_LABEL: "Keep" + STOP_LABEL: "Don't stop processing rules" + EMAIL_LABEL: "Email" + VACATION_SUBJECT_LABEL: "Subject (optional)" + VACATION_MESSAGE_LABEL: "Message" + VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" + REJECT_MESSAGE_LABEL: "Reject message" + ALL_INCOMING_MESSAGES_DESC: "All incoming messages" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Selectați dosarul de sistem" + SELECT_CHOOSE_ONE: "Nu a fost încă selectat" + SELECT_UNUSE_NAME: "Nu uitilizați" + LABEL_SENT: "Trimise" + LABEL_DRAFTS: "Salvate" + LABEL_SPAM: "SPAM" + LABEL_TRASH: "Șterse" + LABEL_ARCHIVE: "Archive" + BUTTON_CANCEL: "Anulează" + BUTTON_CLOSE: "Închide" + NOTIFICATION_SENT: | + Вы еще не выбрали системную папку "Отправленные", в которую складываются все сообщения после отправки. + Если вы не хотите сохранять отправленные письма, пожалуйста, выберите пункт "Не использовать". + NOTIFICATION_DRAFTS: "Вы еще не выбрали системную папку \"Черновики\", в которую складываются все сохраненые сообщения." + NOTIFICATION_SPAM: | + Вы еще не выбрали системную папку "Спам", в которую складываются все спамовые сообщения. + Если же вы хотите удалять письма сразу, пожалуйста, выберите пункт "Не использовать". + NOTIFICATION_TRASH: | + Вы еще не выбрали системную папку "Удаленные", в которую складываются все сообщения после удаления. + Если же вы хотите удалять письма сразу, пожалуйста, выберите пункт "Не использовать". + NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "2-Step Verification" + LABEL_ENABLE_TWO_FACTOR: "Enable 2-Step verification" + LABEL_TWO_FACTOR_USER: "User" + LABEL_TWO_FACTOR_STATUS: "Status" + LABEL_TWO_FACTOR_SECRET: "Secret" + LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" + BUTTON_CREATE: "Create New Secret" + BUTTON_ACTIVATE: "Activate" + BUTTON_CLEAR: "Clear" + BUTTON_LOGOUT: "Logout" + BUTTON_DONE: "Done" + BUTTON_TEST: "Test" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Show Secret" + BUTTON_HIDE_SECRET: "Hide Secret" + TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" + TWO_FACTOR_SECRET_DESC: >- + Import this info into your Google Authenticator client (or other TOTP client) + using the provided QR code below or by entering the code manually. + TWO_FACTOR_BACKUP_CODES_DESC: >- + If you can't receive codes via Google Authenticator, you can use backup codes + to sign in. After you’ve used a backup code to sign in, it will become inactive. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." + TITLES: + LOADING: "Se încarcă" + LOGIN: "Conectare" + MAILBOX: "Poștă" + SETTINGS: "Opțiuni" + COMPOSE: "Compune" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Fișierul este prea mare" + ERROR_FILE_PARTIALLY_UPLOADED: "Fișierul nu este încărcat complet" + ERROR_NO_FILE_UPLOADED: "Nici un fișier încărcat" + ERROR_MISSING_TEMP_FOLDER: "Eroare la salvarea unui fișier" + ERROR_ON_SAVING_FILE: "Eroare la salvarea unui fișier" + ERROR_FILE_TYPE: "Tip de fișier invalid" + ERROR_UNKNOWN: "Eroare la încărcarea de fișiere" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" + TEXT_SWITCHER_RICH_FORMATTING: "Text formatat" + TEXT_SWITCHER_CONFIRM: "Formatarea textului și imaginile vor fi pierdute. Sigur doriți să continuați?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Personal" + LABEL_GENERAL_NAME: "De bază" + LABEL_CONTACTS_NAME: "Contacte" + LABEL_FOLDERS_NAME: "Dosare" + LABEL_ACCOUNTS_NAME: "Conturi" + LABEL_IDENTITY_NAME: "Profil" + LABEL_IDENTITIES_NAME: "Profiluri" + LABEL_FILTERS_NAME: "Filters" + LABEL_TEMPLATES_NAME: "Templates" + LABEL_SECURITY_NAME: "Security" + LABEL_SOCIAL_NAME: "Social" + LABEL_THEMES_NAME: "Subiecte" + LABEL_CHANGE_PASSWORD_NAME: "Parolă" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Înapoi" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filters" + BUTTON_SAVE: "Save" + BUTTON_ADD_FILTER: "Add a Filter" + BUTTON_DELETE: "Delete" + BUTTON_RAW_SCRIPT: "Use Custom User Script" + SUBNAME_NONE: "None" + SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" + SUBNAME_REJECT: "Reject" + SUBNAME_VACATION_MESSAGE: "Vacation message" + SUBNAME_DISCARD: "Discard" + CAPABILITY_LABEL: "Capability" + LOADING_PROCESS: "Updating filter list" + DELETING_ASK: "Are you sure?" + CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Setările de profil" + LABEL_DISPLAY_NAME: "Nume" + LABEL_REPLY_TO: "Răspunde la" + LABEL_SIGNATURE: "Semnătură" + LABEL_ADD_SIGNATURE_TO_ALL: "Adăugă semnătura la toate mesajele trimise" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Security" + LABEL_CONFIGURE_TWO_FACTOR: "Configurați verificarea în 2 pași" + LABEL_AUTOLOGOUT: "Auto Logout" + AUTOLOGIN_NEVER_OPTION_NAME: "Never" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% oră(ore)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Setări de bază" + LABEL_LANGUAGE: "Limbă" + LABEL_IDENTITY: "Identity" + LABEL_LAYOUT: "Layout" + LABEL_LAYOUT_NO_SPLIT: "No Split" + LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" + LABEL_EDITOR: "Editor de text implicit" + LABEL_EDITOR_HTML: "Formatat" + LABEL_EDITOR_PLAIN: "Simplu" + LABEL_EDITOR_HTML_FORCED: "Html (forced)" + LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" + LABEL_ANIMATION: "Interfață animație" + LABEL_ANIMATION_FULL: "Complet" + LABEL_ANIMATION_NORMAL: "Normal" + LABEL_ANIMATION_NONE: "nu" + LABEL_VIEW_OPTIONS: "Afișare" + LABEL_USE_PREVIEW_PANE: "Folosiți un mod de afișare cu trei coloane" + LABEL_USE_CHECKBOXES_IN_LIST: "Afișează listele checkbox" + LABEL_USE_THREADS: "Minimizează scrisorile" + LABEL_REPLY_SAME_FOLDER: "Răspunsurile în același folder cu originalul" + LABEL_SHOW_IMAGES: "Arată imaginile externe în corpul mesajului, fără avertisment" + LABEL_SHOW_ANIMATION: "Utilizați animația" + LABEL_MESSAGE_PER_PAGE: "Mesaje pe o pagină" + LABEL_NOTIFICATIONS: "Notificări" + LABEL_SOUND_NOTIFICATION: "Sound notification" + LABEL_CHROME_NOTIFICATION_DESC: "Afișați notificări desktop pentru mesaje noi" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(browser-ul blocat)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Contacte" + LABEL_CONTACTS_AUTOSAVE: "Adaugă automat destinatarii la agenda de scrisori" + LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" + LABEL_CONTACTS_SYNC_SERVER: "Server" + LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" + LABEL_CONTACTS_SYNC_USER: "User" + LABEL_CONTACTS_SYNC_PASSWORD: "Password" + SETTINGS_THEMES: + LEGEND_THEMES: "Tematică" + LEGEND_THEMES_CUSTOM: "Setați o temă particularizată" + LABEL_CUSTOM_TYPE: "Tip Teme" + LABEL_CUSTOM_TYPE_LIGHT: "Lumina" + LABEL_CUSTOM_TYPE_DARK: "Umbră" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Imaginea de pe fundal" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Încărcați o imagine de fundal (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Fișier prea mare" + ERROR_FILE_TYPE_ERROR: "Tip de fișier invalid (numai JPG sau PNG)" + ERROR_UNKNOWN: "Eroare la încărcarea de fișiere" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Conectează-te cu Google" + BUTTON_GOOGLE_DISCONNECT: "Deconectați contul Google" + MAIN_GOOGLE_DESC: "După conectarea la Google, vă puteți conecta la acest cont folosind butonul Google de pe ecranul de login." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Conectați-va cu Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Deconectați contul de Facebook" + MAIN_FACEBOOK_DESC: "După conectarea la Facebook, vă puteți conecta la acest cont folosind butonul Facebook de pe ecranul de login." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Conectați-vă cu Twitter" + BUTTON_TWITTER_DISCONNECT: "Deconectați contul de Twitter" + MAIN_TWITTER_DESC: "După conectarea la Twitter, vă puteți conecta la acest cont folosind butonul Twitter de pe ecranul de login." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Lista de dosare" + BUTTON_CREATE: "Creare dosar" + BUTTON_SYSTEM: "System Folders" + BUTTON_DELETE: "Șterge" + BUTTON_SUBSCRIBE: "Abonare" + BUTTON_UNSUBSCRIBE: "Dezabonare" + LOADING_PROCESS: "Actualizez lista de dosare" + CREATING_PROCESS: "Crearea dosarului..." + DELETING_PROCESS: "Șterg dosarul..." + RENAMING_PROCESS: "Redenumesc dosarul" + DELETING_ASK: "Sunteți sigur?" + TO_MANY_FOLDERS_DESC_1: "You have too many folders!" + TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." + HELP_DELETE_FOLDER: "Delete folder" + HELP_SHOW_HIDE_FOLDER: "Show/hide folder" + HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Lista de Conturi" + LEGEND_IDENTITIES: "Identities" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" + BUTTON_ADD_ACCOUNT: "Adaugă un alt cont" + BUTTON_ADD_IDENTITY: "Add an Identity" + BUTTON_DELETE: "Șterge" + LOADING_PROCESS: "Actualizez lista de conturi" + DELETING_ASK: "Sunteți sigur?" + DEFAULT_IDENTITY_LABEL: "default" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Setările de profil de bază" + LEGEND_IDENTITIES: "Profiluri suplimentare" + LABEL_DEFAULT: "Default" + LABEL_DISPLAY_NAME: "Nume" + LABEL_REPLY_TO: "Răspunde la" + LABEL_SIGNATURE: "Semnătură" + LABEL_ADD_SIGNATURE_TO_ALL: "Adaugă semnătura la toate mesajele trimise" + BUTTON_ADD_IDENTITY: "Adăugați un profil" + BUTTON_DELETE: "Șterge" + LOADING_PROCESS: "Actualizez lista de profile" + DELETING_ASK: "Sunteți sigur?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Schimbare parolă" + LABEL_CURRENT_PASSWORD: "Parola curentă" + LABEL_NEW_PASSWORD: "Noua parolă" + LABEL_REPEAT_PASSWORD: "Confirmați parola" + BUTTON_UPDATE_PASSWORD: "Salvați noua parolă" + ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" + TITLE_PRIVATE: "Private" + TITLE_PUBLIC: "Public" + DELETING_ASK: "Are you sure?" + GENERATE_ONLY_HTTPS: "HTTPS only" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Salvează ciorna automat" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" + TAB_MAILBOX: "Mailbox" + TAB_MESSAGE_LIST: "Message list" + TAB_MESSAGE_VIEW: "Message view" + TAB_COMPOSE: "Compose" + LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" + LABEL_REPLY: "Reply" + LABEL_REPLY_ALL: "Reply All" + LABEL_FORWARD: "Forward" + LABEL_FORWARD_MULTIPLY: "Forward (multiply)" + LABEL_HELP: "Help" + LABEL_CHECK_ALL: "Select all messages" + LABEL_ARCHIVE: "Archive" + LABEL_DELETE: "Delete" + LABEL_OPEN_THREAD: "Open selected thread" + LABEL_MOVE: "Move" + LABEL_READ: "Read selected messages" + LABEL_UNREAD: "Unread selected messages" + LABEL_IMPORTANT: "Important, flag selected messages" + LABEL_SEARCH: "Search" + LABEL_CANCEL_SEARCH: "Cancel search" + LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" + LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" + LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" + LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" + LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" + LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" + LABEL_THREAD_NEXT: "Next message in thread" + LABEL_THREAD_PREV: "Previous message in thread" + LABEL_PRINT: "Print" + LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" + LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" + LABEL_SWITCH_TO_LIST: "Switch focus back to message list" + LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" + LABEL_SAVE_MESSAGE: "Save message" + LABEL_SEND_MESSAGE: "Send message" + LABEL_CLOSE_COMPOSE: "Close compose" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "No public keys found" + NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" + NO_PRIVATE_KEY_FOUND: "No private key found" + NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" + ADD_A_PUBLICK_KEY: "Add a public key" + SELECT_A_PRIVATE_KEY: "Setectați o cheie privată" + UNVERIFIRED_SIGNATURE: "Unverified signature" + DECRYPTION_ERROR: "OpenPGP decryption error" + GOOD_SIGNATURE: "Good signature from %USER%" + PGP_ERROR: "OpenPGP error: %ERROR%" + SPECIFY_FROM_EMAIL: "Please specify FROM email address" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" + NOTIFICATIONS: + INVALID_TOKEN: "Semn invalid" + AUTH_ERROR: "Nu se poate realiza conectarea" + ACCESS_ERROR: "Eroare de acces" + CONNECTION_ERROR: "Eroare la conectarea la server." + CAPTCHA_ERROR: "Cuvântul de securitate nu este corect." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- + Pentru acest utilizator nu sa asigurat încă un cont de e-mail. Conectați-vă + cu contul dvs. de e-mail și activați această caracteristică în setările. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- + Pentru acest utilizator nu sa asigurat încă un cont de e-mail. Conectați-vă + cu contul dvs. de e-mail și activați această caracteristică în setările. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- + Pentru acest utilizator nu sa asigurat încă un cont de e-mail. Conectați-vă + cu contul dvs. de e-mail și activați această caracteristică în setările. + DOMAIN_NOT_ALLOWED: "Domeniul nu apartine de Wey5" + ACCOUNT_NOT_ALLOWED: "Contul nu are permisiunea de conectare" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" + COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" + CURRENT_PASSWORD_INCORRECT: "Current password incorrect" + NEW_PASSWORD_SHORT: "Password is too short" + NEW_PASSWORD_WEAK: "Password is too easy" + NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" + CONTACTS_SYNC_ERROR: "Contacts synchronization error" + CANT_GET_MESSAGE_LIST: "Nu găsesc o lista de scrisori" + CANT_GET_MESSAGE: "Nu pot obține scrisoarea. Încercați din nou" + CANT_DELETE_MESSAGE: "Nu pot șterge scrisoarea. Încercați din nou" + CANT_MOVE_MESSAGE: "Nu pot muta scrisoarea.Încercați din nou" + CANT_SAVE_MESSAGE: "Nu pot salva mesajul. Încercați din nou" + CANT_SEND_MESSAGE: "Nu pot trimite scrisoarea.Încercați din nou" + INVALID_RECIPIENTS: "Verificați dacă ați introdus toate adresele." + CANT_SAVE_FILTERS: "Can't save filters" + CANT_GET_FILTERS: "Can't get filters" + FILTERS_ARE_NOT_CORRECT: "Filters are not correct" + CANT_CREATE_FOLDER: "Nu crea dosarul. Încercați din nou" + CANT_RENAME_FOLDER: "Nu pot redenumi dosarul. Încercați din nou" + CANT_DELETE_FOLDER: "Nu pot șterge dosarul. Încercați din nou" + CANT_DELETE_NON_EMPTY_FOLDER: "Nu pot șterge un dosar care nu este gol" + CANT_SUBSCRIBE_FOLDER: "Nu pot semna dosarul. Încercați din nou" + CANT_UNSUBSCRIBE_FOLDER: "Nu mă pot dezbona. Încercați din nou" + CANT_SAVE_SETTINGS: "Nu pot salva opțiunile. Încercați din nou" + CANT_SAVE_PLUGIN_SETTINGS: "Nu pot salva setările. Încercați din nou" + DOMAIN_ALREADY_EXISTS: "Domeniu există deja." + CANT_INSTALL_PACKAGE: "Nu pot instala pachetul.Încercați din nou" + CANT_DELETE_PACKAGE: "Nu pot șterge pachetul. Încercați din nou" + INVALID_PLUGIN_PACKAGE: "Pachetul este invalid" + UNSUPPORTED_PLUGIN_PACKAGE: "Plugin-ul necesită sprijinul complet al serverului" + LICENSING_SERVER_IS_UNAVAILABLE: "Server de abonamente este temporar indisponibil." + LICENSING_DOMAIN_EXPIRED: "Subscription for this domain has expired." + LICENSING_DOMAIN_BANNED: "Subscription for this domain is banned." + DEMO_SEND_MESSAGE_ERROR: "Cont demo trimite e-mail la adresele de e-mail externe este interzisă!" + DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" + ACCOUNT_ALREADY_EXISTS: "Contul deja există" + ACCOUNT_DOES_NOT_EXIST: "contul nu există" + MAIL_SERVER_ERROR: "Nu am reușit să accesez serverul de e-mail" + INVALID_INPUT_ARGUMENT: "Invalid input argument" + UNKNOWN_ERROR: "Eroare necunoscută" + STATIC: + BACK_LINK: "Actualizare" + DOMAIN_LIST_DESC: "Lista de domenii care au permisiunea de a fi accesate prin webmail." + PHP_EXSTENSIONS_ERROR_DESC: "Extensiile PHP necesare nu sunt instalate pe server-ul dvs.!" + PHP_VERSION_ERROR_DESC: "Versiunea dvs. de PHP (%VERSION%) este mai mica de cea dorită, 5.3.0!" + NO_SCRIPT_TITLE: "Pentru rulare este necesar JavaScript." + NO_SCRIPT_DESC: | + Aparent, JavaScript nu este instalat, sau nu este acceptat de browserul dumneavoastră. + Activați JavaScript, schimband optiunile browserului dvs., apoi încercați din nou. + NO_COOKIE_TITLE: "Cererea necesită Cookie-uri." + NO_COOKIE_DESC: | + Aparent, Cookie sau nu este acceptat de browser-ul dvs. sau oprit. + Întoarceți Cookie, schimband optiunile browserului dvs., apoi încercați din nou. + BAD_BROWSER_TITLE: "Browser-ul dvs. este depășit." + BAD_BROWSER_DESC: | + Pentru a utiliza toate caracteristicile cererii, + descărcați și instalați unul dintre aceste browsere: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ru_RU.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ru_RU.yml new file mode 100755 index 00000000..50310276 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ru_RU.yml @@ -0,0 +1,713 @@ +ru_RU: + LOGIN: + LABEL_EMAIL: "Почта" + LABEL_LOGIN: "Логин" + LABEL_PASSWORD: "Пароль" + LABEL_SIGN_ME: "Запомнить меня" + LABEL_VERIFICATION_CODE: "Код подтверждения" + LABEL_DONT_ASK_VERIFICATION_CODE: "Не спрашивать код в течение 2-х недель" + BUTTON_SIGN_IN: "Войти" + TITLE_SIGN_IN_GOOGLE: "Войти, используя Google" + TITLE_SIGN_IN_FACEBOOK: "Войти, используя Facebook" + TITLE_SIGN_IN_TWITTER: "Войти, используя Twitter" + LABEL_FORGOT_PASSWORD: "Забытый пароль" + LABEL_REGISTRATION: "Регистрация" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Добавить ещё аккаунт" + BUTTON_SETTINGS: "Настройки" + BUTTON_HELP: "Помощь" + BUTTON_LOGOUT: "Выйти" + MOBILE: + BUTTON_MOBILE_VERSION: "Мобильная версия" + BUTTON_DESKTOP_VERSION: "Полная версия" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Поиск писем" + TITLE_ADV: "Расширенный поиск писем" + LABEL_ADV_FROM: "От" + LABEL_ADV_TO: "Кому" + LABEL_ADV_SUBJECT: "Тема" + LABEL_ADV_TEXT: "Текст" + LABEL_ADV_HAS_ATTACHMENT: "С файлами" + LABEL_ADV_HAS_ATTACHMENTS: "С файлами" + LABEL_ADV_FLAGGED: "Помеченные" + LABEL_ADV_UNSEEN: "Непрочитанные" + LABEL_ADV_DATE: "Дата" + LABEL_ADV_DATE_ALL: "За все время" + LABEL_ADV_DATE_3_DAYS: "За три дня" + LABEL_ADV_DATE_7_DAYS: "За неделю" + LABEL_ADV_DATE_MONTH: "За месяц" + LABEL_ADV_DATE_3_MONTHS: "За 3 месяца" + LABEL_ADV_DATE_6_MONTHS: "За полгода" + LABEL_ADV_DATE_YEAR: "За год" + BUTTON_ADV_SEARCH: "Искать" + PREVIEW_POPUP: + FULLSCREEN: "Полный экран" + ZOOM: "Увеличить/уменьшить" + CLOSE: "Закрыть (Esc)" + LOADING: "Загрузка..." + GALLERY_PREV: "Назад (Стрелка ←)" + GALLERY_NEXT: "Вперед (Стрелка →)" + GALLERY_COUNTER: "%curr% из %total%" + IMAGE_ERROR: "Изображение не загрузилось." + AJAX_ERROR: "Данные не загрузились." + FOLDER_LIST: + BUTTON_COMPOSE: "Написать" + BUTTON_CONTACTS: "Контакты" + BUTTON_NEW_MESSAGE: "Новое сообщение" + INBOX_NAME: "Входящие" + SENT_NAME: "Отправленные" + DRAFTS_NAME: "Черновики" + SPAM_NAME: "Спам" + TRASH_NAME: "Корзина" + ARCHIVE_NAME: "Архив" + QUOTA: + TITLE: "Дисковая квота" + MESSAGE_LIST: + BUTTON_RELOAD: "Обновить Список Писем" + BUTTON_MOVE_TO: "Переместить" + BUTTON_DELETE: "Удалить" + BUTTON_ARCHIVE: "Архивировать" + BUTTON_SPAM: "В спам" + BUTTON_NOT_SPAM: "Не спам" + BUTTON_EMPTY_FOLDER: "Очистить всю папку" + BUTTON_MULTY_FORWARD: "Переслать сообщения" + BUTTON_DELETE_WITHOUT_MOVE: "Удалить мимо корзины" + BUTTON_MORE: "Еще" + MENU_SET_SEEN: "Отметить как прочитанное" + MENU_SET_ALL_SEEN: "Отметить все как прочитанные" + MENU_UNSET_SEEN: "Отметить как непрочитанное" + MENU_SET_FLAG: "Установить флаг" + MENU_UNSET_FLAG: "Снять флаг" + MENU_SELECT_ALL: "Все" + MENU_SELECT_NONE: "Ни одного" + MENU_SELECT_INVERT: "Инвентировать" + MENU_SELECT_UNSEEN: "Непрочитанные" + MENU_SELECT_SEEN: "Прочитанные" + MENU_SELECT_FLAGGED: "Помеченные" + MENU_SELECT_UNFLAGGED: "Без пометок" + EMPTY_LIST: "В папке нет писем." + EMPTY_SEARCH_LIST: "Письма не найдены." + SEARCH_RESULT_FOR: "Результат поиска \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "back to message list" + LIST_LOADING: "Загрузка" + EMPTY_SUBJECT_TEXT: "(Без темы)" + PUT_MESSAGE_HERE: "Киньте сообщение сюда, чтобы посмотреть его в списке" + TODAY_AT: "сегодня в %TIME%" + YESTERDAY_AT: "вчера в %TIME%" + SEARCH_PLACEHOLDER: "Поиск писем" + NEW_MESSAGE_NOTIFICATION: "У вас %COUNT% новых сообщений!" + QUOTA_SIZE: "Использовано %SIZE% (%PROC%%) из %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Редактировать" + BUTTON_BACK: "Назад" + BUTTON_CLOSE: "Закрыть" + BUTTON_DELETE: "Удалить" + BUTTON_UNSUBSCRIBE: "Отписаться" + BUTTON_ARCHIVE: "Архивировать" + BUTTON_SPAM: "В спам" + BUTTON_NOT_SPAM: "Не спам" + BUTTON_MOVE_TO: "Переместить" + BUTTON_MORE: "Еще" + BUTTON_REPLY: "Ответить на Письмо" + BUTTON_REPLY_ALL: "Ответить Всем" + BUTTON_FORWARD: "Переслать" + BUTTON_FORWARD_AS_ATTACHMENT: "Переслать как файл" + BUTTON_EDIT_AS_NEW: "Редактировать как новое" + BUTTON_SHOW_IMAGES: "Показать внешние изображения в письме" + BUTTON_NOTIFY_READ_RECEIPT: "Уведомить отправителя о прочтении этого сообщения." + BUTTON_IN_NEW_WINDOW: "В отдельном окне" + BUTTON_THREAD_LIST: "Список" + BUTTON_THREAD_PREV: "Предыдущее" + BUTTON_THREAD_NEXT: "Следующее" + BUTTON_THREAD_MORE: "Больше сообщений" + MENU_HEADERS: "Просмотреть заголовки" + MENU_VIEW_ORIGINAL: "Просмотреть оригинал" + MENU_DOWNLOAD_ORIGINAL: "Скачать как .eml файл" + MENU_FILTER_SIMILAR: "Фильтровать похожие" + MENU_PRINT: "Распечатать" + EMPTY_SUBJECT_TEXT: "(Без темы)" + LABEL_SUBJECT: "Тема" + LABEL_DATE: "Дата" + LABEL_FROM: "От" + LABEL_FROM_SHORT: "от" + LABEL_TO: "Кому" + LABEL_TO_SHORT: "кому" + LABEL_CC: "Копия" + LABEL_BCC: "Скрытая" + LABEL_REPLY_TO: "Ответить-на" + PRINT_LABEL_FROM: "От" + PRINT_LABEL_TO: "Кому" + PRINT_LABEL_CC: "Копия" + PRINT_LABEL_BCC: "Скрытая" + PRINT_LABEL_REPLY_TO: "Ответить-на" + PRINT_LABEL_DATE: "Дата" + PRINT_LABEL_SUBJECT: "Тема" + PRINT_LABEL_ATTACHMENTS: "Файлы" + MESSAGE_LOADING: "Загрузка" + MESSAGE_VIEW_DESC: "Выберите сообщение для просмотра." + MESSAGE_VIEW_MOVE_DESC: "Выберите имя папки в левой панели, чтобы переместить сообщение." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Пароль" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP подписанное сообщение (нажмите, чтобы подтвердить)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP шифрованное сообщение (нажмите, чтобы расшифровать)" + LINK_DOWNLOAD_AS_ZIP: "Сохранить как zip" + LINK_SAVE_TO_OWNCLOUD: "Сохранить в ownCloud" + LINK_SAVE_TO_CLOUD: "Сохранить в облаке" + LINK_SAVE_TO_DROPBOX: "Сохранить в Dropbox" + READ_RECEIPT: + SUBJECT: "Уведомление о прочтении письма - %SUBJECT%" + BODY: | + Это уведомление о прочтении для сообщения, которое вы отправили в адрес %READ-RECEIPT%. + + Примечание: Это уведомление о прочтении означает лишь то, что сообщение было отображено на машине получателя. + Оно не гарантирует того, что получатель прочёл или понял содержимое сообщения. + SUGGESTIONS: + SEARCHING_DESC: "Поиск..." + CONTACTS: + LEGEND_CONTACTS: "Контакты" + SEARCH_INPUT_PLACEHOLDER: "Поиск контактов" + BUTTON_ADD_CONTACT: "Добавить контакт" + BUTTON_CREATE_CONTACT: "Сохранить" + BUTTON_UPDATE_CONTACT: "Обновить" + BUTTON_IMPORT: "Импорт (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Экспорт (vcf, vCard)" + BUTTON_EXPORT_CSV: "Экспорт (csv)" + ERROR_IMPORT_FILE: "Ошибка импорта (Неправильный формат файла)" + LIST_LOADING: "Загрузка" + EMPTY_LIST: "Нет контактов" + EMPTY_SEARCH: "Контакты не найдены" + CLEAR_SEARCH: "Очистить поиск" + CONTACT_VIEW_DESC: "Выберите контакт для просмотра." + LABEL_DISPLAY_NAME: "Полное имя" + LABEL_EMAIL: "Электронная почта" + LABEL_PHONE: "Телефон" + LABEL_WEB: "Сайт" + LABEL_BIRTHDAY: "День рождения" + LINK_ADD_EMAIL: "Добавьте адрес электронной почты" + LINK_ADD_PHONE: "Добавьте телефон" + LINK_BIRTHDAY: "День рождения" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Введите полное имя" + PLACEHOLDER_ENTER_LAST_NAME: "Введите имя" + PLACEHOLDER_ENTER_FIRST_NAME: "Введите фамилию" + PLACEHOLDER_ENTER_NICK_NAME: "Введите ник" + LABEL_READ_ONLY: "Только чтение" + LABEL_SHARE: "Поделиться" + ADD_MENU_LABEL: "Добавить" + ADD_MENU_NICKNAME: "Ник" + ADD_MENU_NOTES: "Примечания" + ADD_MENU_EMAIL: "Почту" + ADD_MENU_PHONE: "Телефон" + ADD_MENU_URL: "Сайт" + ADD_MENU_ADDRESS: "Адрес" + ADD_MENU_BIRTHDAY: "День рождения" + ADD_MENU_TAGS: "Тэги" + BUTTON_SHARE_NONE: "Отменить" + BUTTON_SHARE_ALL: "Всем" + BUTTON_SYNC: "Синхронизация (CardDAV)" + COMPOSE: + TITLE_FROM: "От" + TITLE_TO: "Кому" + TITLE_CC: "Копия" + TITLE_BCC: "Скрытая" + TITLE_REPLY_TO: "Отвечать на" + TITLE_SUBJECT: "Тема" + LINK_SHOW_INPUTS: "Показать все поля" + BUTTON_SEND: "Отправить" + BUTTON_SAVE: "Сохранить" + BUTTON_DELETE: "Удалить" + BUTTON_CANCEL: "Отменить" + BUTTON_MINIMIZE: "Minimize" + SAVED_TIME: "Сохранено в %TIME%" + SAVED_ERROR_ON_SEND: "Сообщение было отправлено, но не было сохранено" + DISCARD_UNSAVED_DATA: "Discard unsaved data?" + ATTACH_FILES: "Прикрепить файлы" + ATTACH_DROP_FILES_DESC: "Поместите файлы сюда" + ATTACH_ITEM_CANCEL: "Отменить" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% написал" + FORWARD_MESSAGE_TOP_TITLE: "-------- Пересланное сообщение -------" + FORWARD_MESSAGE_TOP_FROM: "От" + FORWARD_MESSAGE_TOP_TO: "Кому" + FORWARD_MESSAGE_TOP_CC: "Копия" + FORWARD_MESSAGE_TOP_SENT: "Отправлено" + FORWARD_MESSAGE_TOP_SUBJECT: "Тема" + EMPTY_TO_ERROR_DESC: "Укажите как минимум одного получателя" + NO_ATTACHMENTS_HERE_DESC: "Прикреплённые файлы отсутствуют." + ATTACHMENTS_ERROR_DESC: "Внимание! Не все прикреплённые файлы были загружены." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Не все прикреплённые файлы были загружены" + BUTTON_REQUEST_READ_RECEIPT: "Запрос о прочтении письма" + BUTTON_MARK_AS_IMPORTANT: "Отметить как важное" + BUTTON_OPEN_PGP: "OpenPGP (только обычный текст)" + BUTTON_REQUEST_DSN: "Запросить уведомление о доставке" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Close" + POPUPS_ASK: + BUTTON_YES: "Да" + BUTTON_NO: "Нет" + DESC_WANT_CLOSE_THIS_WINDOW: "Вы уверены, что хотите закрыть это окно?" + DESC_WANT_DELETE_MESSAGES: "Вы уверены, что хотите удалить сообщение(я)?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Выберите язык" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Добавить ещё аккаунт?" + BUTTON_ADD_ACCOUNT: "Добавить" + TITLE_UPDATE_ACCOUNT: "Обновить аккаунт?" + BUTTON_UPDATE_ACCOUNT: "Обновить" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Добавить Профиль?" + TITLE_UPDATE_IDENTITY: "Обновить Профиль?" + BUTTON_ADD_IDENTITY: "Добавить" + BUTTON_UPDATE_IDENTITY: "Обновить" + LABEL_EMAIL: "Почта" + LABEL_NAME: "Имя" + LABEL_REPLY_TO: "Отвечать на" + LABEL_SIGNATURE: "Подпись" + LABEL_CC: "Cc" + LABEL_BCC: "Скрытая" + LABEL_SIGNATURE_INSERT_BEFORE: "Вставлять подпись перед отцитированным текстом в ответах" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Создать папку?" + LABEL_NAME: "Имя папки" + LABEL_PARENT: "Родительская папка" + BUTTON_CREATE: "Создать" + BUTTON_CANCEL: "Отменить" + BUTTON_CLOSE: "Закрыть" + TITLE_CREATING_PROCESS: "Cоздание папки" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Очистить папку от писем?" + BUTTON_CLEAR: "Очистить" + BUTTON_CANCEL: "Отменить" + BUTTON_CLOSE: "Закрыть" + DANGER_DESC_WARNING: "Внимание!" + DANGER_DESC_HTML_1: "Данное действие приведет к полному удалению всех писем из папки %FOLDER%." + DANGER_DESC_HTML_2: "После начала очистки, процесс нельзя будет остановить или отменить." + TITLE_CLEARING_PROCESS: "Очистка папки..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Импорт OpenPGP ключа" + BUTTON_IMPORT_OPEN_PGP_KEY: "Импорт" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "Просмотр OpenPGP ключа" + BUTTON_SELECT: "Выбрать" + BUTTON_CLOSE: "Закрыть" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Генерация OpenPGP ключа" + LABEL_EMAIL: "Почта" + LABEL_NAME: "Имя" + LABEL_PASSWORD: "Пароль" + LABEL_KEY_BIT_LENGTH: "Длина ключа" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Создать" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP подпись и шифрование" + LABEL_SIGN: "Подпись" + LABEL_ENCRYPT: "Шифрование" + LABEL_PASSWORD: "Пароль" + BUTTON_SIGN: "Подпись" + BUTTON_ENCRYPT: "Шифрование" + BUTTON_SIGN_AND_ENCRYPT: "Подпись и шифрование" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "Расшифровать (OpenPGP)" + LABEL_KEY: "Приватный ключ" + LABEL_PASSWORD: "Пароль" + BUTTON_DECRYPT: "Расшифровать" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "Тест двухфакторной верификации" + LABEL_CODE: "Код" + BUTTON_TEST: "Тест" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Создать фильтр?" + TITLE_EDIT_FILTER: "Обновить фильтр?" + FILTER_NAME: "Название" + LEGEND_CONDITIONS: "Правила" + LEGEND_ACTIONS: "Действия" + BUTTON_DONE: "Закончить" + BUTTON_ADD_CONDITION: "Добавить правило" + SELECT_ACTION_NONE: "Ничего" + SELECT_ACTION_MOVE_TO: "Переместить в" + SELECT_ACTION_FORWARD_TO: "Переслать на" + SELECT_ACTION_REJECT: "Не принимать" + SELECT_ACTION_VACATION_MESSAGE: "Автоответчик" + SELECT_ACTION_DISCARD: "Уничтожить" + SELECT_FIELD_FROM: "От" + SELECT_FIELD_RECIPIENTS: "Получатели (To или CC)" + SELECT_FIELD_SUBJECT: "Тема" + SELECT_FIELD_HEADER: "Заголовок" + SELECT_FIELD_SIZE: "Размер" + SELECT_TYPE_CONTAINS: "Содержит" + SELECT_TYPE_NOT_CONTAINS: "Не содержит" + SELECT_TYPE_MATCHES: "Содержит (поддерживаются * и ?)" + SELECT_TYPE_NOT_MATCHES: "Не содержит (поддерживаются * и ?)" + SELECT_TYPE_REGEXP: "Regexp" + SELECT_TYPE_NOT_REGEXP: "Не Regexp" + SELECT_TYPE_EQUAL_TO: "Совпадает с" + SELECT_TYPE_NOT_EQUAL_TO: "Не совпадает с" + SELECT_TYPE_OVER: "Больше" + SELECT_TYPE_UNDER: "Меньше" + SELECT_MATCH_ANY: "Подходит под хотя бы одно из нижеперечисленных правил" + SELECT_MATCH_ALL: "Подходит под все нижеперечисленные правила" + MARK_AS_READ_LABEL: "Отметить как прочитанное" + REPLY_INTERVAL_LABEL: "Отвечать каждые (в днях)" + KEEP_LABEL: "Сохранить копию" + STOP_LABEL: "Не преращать обработку правил" + EMAIL_LABEL: "Почтка" + VACATION_SUBJECT_LABEL: "Тема (необязательно)" + VACATION_MESSAGE_LABEL: "Сообщение" + VACATION_RECIPIENTS_LABEL: "Получатели (через запятую)" + REJECT_MESSAGE_LABEL: "Причина (будет послана отправителю)" + ALL_INCOMING_MESSAGES_DESC: "Все входящие сообщения" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Выберите системые папки" + SELECT_CHOOSE_ONE: "Еще не выбрана" + SELECT_UNUSE_NAME: "Не использовать" + LABEL_SENT: "Отправленные" + LABEL_DRAFTS: "Черновики" + LABEL_SPAM: "Спам" + LABEL_TRASH: "Удаленные" + LABEL_ARCHIVE: "Архив" + BUTTON_CANCEL: "Отменить" + BUTTON_CLOSE: "Закрыть" + NOTIFICATION_SENT: | + Вы еще не выбрали системную папку "Отправленные", в которую складываются все сообщения после отправки. + Если вы не хотите сохранять отправленные письма, пожалуйста, выберите пункт "Не использовать". + NOTIFICATION_DRAFTS: "Вы еще не выбрали системную папку \"Черновики\", в которую складываются все сохраненные сообщения." + NOTIFICATION_SPAM: | + Вы еще не выбрали системную папку "Спам", в которую складываются все спамовые сообщения. + Если же вы хотите удалять письма сразу, пожалуйста, выберите пункт "Не использовать". + NOTIFICATION_TRASH: | + Вы еще не выбрали системную папку "Удаленные", в которую складываются все сообщения после удаления. + Если же вы хотите удалять письма сразу, пожалуйста, выберите пункт "Не использовать". + NOTIFICATION_ARCHIVE: "Вы еще не выбрали системную папку \"Архив\", в которую складываются все сообщения после архивации." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "Двухфакторная верификация" + LABEL_ENABLE_TWO_FACTOR: "Включить двухфакторную верификацию" + LABEL_TWO_FACTOR_USER: "Пользователь" + LABEL_TWO_FACTOR_STATUS: "Статус" + LABEL_TWO_FACTOR_SECRET: "Секретный ключ" + LABEL_TWO_FACTOR_BACKUP_CODES: "Резервные коды" + BUTTON_CREATE: "Создать новый секретный ключ" + BUTTON_ACTIVATE: "Активировать" + BUTTON_CLEAR: "Очистить" + BUTTON_LOGOUT: "Выйти" + BUTTON_DONE: "Закончить" + BUTTON_TEST: "Тест" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Показать секретный ключ" + BUTTON_HIDE_SECRET: "Скрыть секретный ключ" + TWO_FACTOR_REQUIRE_DESC: "Ваш аккаунт требует двухфакторную настройку." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Настроен" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Не настроен" + TWO_FACTOR_SECRET_DESC: > + Используйте эту информацию для настройки Google Authenticator клиента (или + другого TOTP клиента) с помощью прилагаемого QR-кода, или вручную. + TWO_FACTOR_BACKUP_CODES_DESC: > + Если вы не можете получить коды через Google Authenticator, вы можете использовать + резервные коды, чтобы войти. После того как вы использовали резервный код + для входа в систему, он становится неактивным. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Вы должны выполнить тест перед тем, как вы сможете поменять эту настройку." + TITLES: + LOADING: "Загрузка" + LOGIN: "Вход" + MAILBOX: "Почта" + SETTINGS: "Настройки" + COMPOSE: "Написать письмо" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Файл слишком большой" + ERROR_FILE_PARTIALLY_UPLOADED: "Файл не загрузился полностью" + ERROR_NO_FILE_UPLOADED: "Файл не был загружен" + ERROR_MISSING_TEMP_FOLDER: "Ошибка при сохранении файла" + ERROR_ON_SAVING_FILE: "Ошибка при сохранении файла" + ERROR_FILE_TYPE: "Неверный тип файла" + ERROR_UNKNOWN: "Ошибка загрузки файла" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" + TEXT_SWITCHER_RICH_FORMATTING: "Форматированный текст" + TEXT_SWITCHER_CONFIRM: "Форматирование текста и изображения будут потеряны. Вы уверены, что хотите продолжить?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Персональные" + LABEL_GENERAL_NAME: "Основные" + LABEL_CONTACTS_NAME: "Контакты" + LABEL_FOLDERS_NAME: "Папки" + LABEL_ACCOUNTS_NAME: "Аккаунты" + LABEL_IDENTITY_NAME: "Профиль" + LABEL_IDENTITIES_NAME: "Профили" + LABEL_FILTERS_NAME: "Фильтры" + LABEL_TEMPLATES_NAME: "Шаблоны" + LABEL_SECURITY_NAME: "Безопасность" + LABEL_SOCIAL_NAME: "Социальные" + LABEL_THEMES_NAME: "Темы" + LABEL_CHANGE_PASSWORD_NAME: "Пароль" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Назад" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Фильтры" + BUTTON_SAVE: "Сохранить" + BUTTON_ADD_FILTER: "Добавить фильтр" + BUTTON_DELETE: "Удалить" + BUTTON_RAW_SCRIPT: "Использовать собственный скрипт" + SUBNAME_NONE: "Ничего" + SUBNAME_MOVE_TO: "Переместить в \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Переслать на \"%EMAIL%\"" + SUBNAME_REJECT: "Не принимать" + SUBNAME_VACATION_MESSAGE: "Сообщение автоответчика" + SUBNAME_DISCARD: "Уничтожить" + CAPABILITY_LABEL: "Возможность" + LOADING_PROCESS: "Обновление списка фильтров" + DELETING_ASK: "Точно?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Изменения ещё не сохранены на сервер." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Настройки профиля" + LABEL_DISPLAY_NAME: "Имя" + LABEL_REPLY_TO: "Отвечать на" + LABEL_SIGNATURE: "Подпись" + LABEL_ADD_SIGNATURE_TO_ALL: "Добавлять подпись ко всем исходящим сообщениям" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Безопасность" + LABEL_CONFIGURE_TWO_FACTOR: "Настроить двухфакторную верификацию" + LABEL_AUTOLOGOUT: "Автоматический выход" + AUTOLOGIN_NEVER_OPTION_NAME: "Никогда" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% минут(ы)" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% час(ы)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Основные Настройки" + LABEL_LANGUAGE: "Язык" + LABEL_IDENTITY: "Профиль" + LABEL_LAYOUT: "Разметка" + LABEL_LAYOUT_NO_SPLIT: "Одна панель" + LABEL_LAYOUT_VERTICAL_SPLIT: "Вертикальные панели" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Горизонтальные панели" + LABEL_EDITOR: "Редактор текста по умолчанию" + LABEL_EDITOR_HTML: "Форматированный" + LABEL_EDITOR_PLAIN: "Простой" + LABEL_EDITOR_HTML_FORCED: "Форматированный (форсированный)" + LABEL_EDITOR_PLAIN_FORCED: "Простой (форсированный)" + LABEL_ANIMATION: "Анимация интерфейса" + LABEL_ANIMATION_FULL: "Полная" + LABEL_ANIMATION_NORMAL: "Нормальная" + LABEL_ANIMATION_NONE: "Отсутствует" + LABEL_VIEW_OPTIONS: "Отображение" + LABEL_USE_PREVIEW_PANE: "Использовать трехколоночный режим отображения" + LABEL_USE_CHECKBOXES_IN_LIST: "Показывать чекбоксы в списках" + LABEL_USE_THREADS: "Сворачивать письма в переписках" + LABEL_REPLY_SAME_FOLDER: "Помещать ответы в ту же папку, где находится оригинал" + LABEL_SHOW_IMAGES: "Показывать внешние изображения в теле письма без предупреждения" + LABEL_SHOW_ANIMATION: "Использовать анимацию" + LABEL_MESSAGE_PER_PAGE: "Cообщений на одной странице" + LABEL_NOTIFICATIONS: "Уведомления" + LABEL_SOUND_NOTIFICATION: "Звуковые уведомления" + LABEL_CHROME_NOTIFICATION_DESC: "Показывать уведомления о новых сообщениях в всплывающих подсказках" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Блокировано браузером)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Контакты" + LABEL_CONTACTS_AUTOSAVE: "Автоматически добавлять получателей писем в адресную книгу" + LEGEND_CONTACTS_SYNC: "Синхронизация (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Включить синхронизация" + LABEL_CONTACTS_SYNC_SERVER: "Сервер" + LABEL_CONTACTS_SYNC_AB_URL: "Адресная книга (URL)" + LABEL_CONTACTS_SYNC_USER: "Пользователь" + LABEL_CONTACTS_SYNC_PASSWORD: "Пароль" + SETTINGS_THEMES: + LEGEND_THEMES: "Темы Оформления" + LEGEND_THEMES_CUSTOM: "Настройка Пользовательской Темы" + LABEL_CUSTOM_TYPE: "Тип Темы" + LABEL_CUSTOM_TYPE_LIGHT: "Светлая" + LABEL_CUSTOM_TYPE_DARK: "Темная" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Картинка на фоне" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Загрузить фоновую картинку (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Файл слишком большой" + ERROR_FILE_TYPE_ERROR: "Неверный тип файла (только JPG и PNG)" + ERROR_UNKNOWN: "Ошибка загрузки файла" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Подключить Google аккаунт" + BUTTON_GOOGLE_DISCONNECT: "Отключить Google аккаунт" + MAIN_GOOGLE_DESC: "После подключения к Google вы сможете залогиниться в данный аккаунт, используя кнопку Google на экране логина." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Подключить Facebook аккаунт" + BUTTON_FACEBOOK_DISCONNECT: "Отключить Facebook аккаунт" + MAIN_FACEBOOK_DESC: "После подключения к Facebook вы сможете залогиниться в данный аккаунт, используя кнопку Facebook на экране логина." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Подключить Twitter аккаунт" + BUTTON_TWITTER_DISCONNECT: "Отключить Twitter аккаунт" + MAIN_TWITTER_DESC: "После подключения к Twitter вы сможете залогиниться в данный аккаунт, используя кнопку Twitter на экране логина." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Список Папок" + BUTTON_CREATE: "Создать Папку" + BUTTON_SYSTEM: "Системые папки" + BUTTON_DELETE: "Удалить" + BUTTON_SUBSCRIBE: "Подписаться" + BUTTON_UNSUBSCRIBE: "Отписаться" + LOADING_PROCESS: "Обновление списка папок" + CREATING_PROCESS: "Cоздание папки" + DELETING_PROCESS: "Удаление папки" + RENAMING_PROCESS: "Переименование папки" + DELETING_ASK: "Точно?" + TO_MANY_FOLDERS_DESC_1: "У вас слишком много папок!" + TO_MANY_FOLDERS_DESC_2: "Мы показали только часть из них, чтобы избежать проблем с производительностью." + HELP_DELETE_FOLDER: "Удалить папку" + HELP_SHOW_HIDE_FOLDER: "Показывать/прятать папку" + HELP_CHECK_FOR_NEW_MESSAGES: "Проверять/не проверять новые сообщения" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Список Аккаунтов" + LEGEND_IDENTITIES: "Персоны" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Аккаунты и персоны" + BUTTON_ADD_ACCOUNT: "Добавить ещё аккаунт" + BUTTON_ADD_IDENTITY: "Добавить персону" + BUTTON_DELETE: "Удалить" + LOADING_PROCESS: "Обновление списка аккаунтов" + DELETING_ASK: "Точно?" + DEFAULT_IDENTITY_LABEL: "основной" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Настройки основного профиля" + LEGEND_IDENTITIES: "Дополнительные профили" + LABEL_DEFAULT: "Основной" + LABEL_DISPLAY_NAME: "Имя" + LABEL_REPLY_TO: "Отвечать на" + LABEL_SIGNATURE: "Подпись" + LABEL_ADD_SIGNATURE_TO_ALL: "Добавлять свою подпись ко всем исходящим сообщениям" + BUTTON_ADD_IDENTITY: "Добавить профиль" + BUTTON_DELETE: "Удалить" + LOADING_PROCESS: "Обновление списка профилей" + DELETING_ASK: "Точно?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Изменить Пароль" + LABEL_CURRENT_PASSWORD: "Текущий пароль" + LABEL_NEW_PASSWORD: "Новый пароль" + LABEL_REPEAT_PASSWORD: "Повторить" + BUTTON_UPDATE_PASSWORD: "Установить Новый Пароль" + ERROR_PASSWORD_MISMATCH: "Пароли не совпадают, попробуйте еще раз" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Ипортировать OpenPGP ключ" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Новый OpenPGP ключ" + TITLE_PRIVATE: "Приватный" + TITLE_PUBLIC: "Публичный" + DELETING_ASK: "Точно?" + GENERATE_ONLY_HTTPS: "HTTPS only" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Автоматически сохранять черновик" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Сочетания клавиш" + TAB_MAILBOX: "Почта" + TAB_MESSAGE_LIST: "Список сообщений" + TAB_MESSAGE_VIEW: "Просмотр сообщения" + TAB_COMPOSE: "Написание письма" + LABEL_OPEN_USER_DROPDOWN: "Открыть выпадающий список пользователя" + LABEL_REPLY: "Ответить" + LABEL_REPLY_ALL: "Ответить всем" + LABEL_FORWARD: "Переслать" + LABEL_FORWARD_MULTIPLY: "Переслать все выбранные сообщения" + LABEL_HELP: "Помощь" + LABEL_CHECK_ALL: "Выбрать все сообщения" + LABEL_ARCHIVE: "Архивировать" + LABEL_DELETE: "Удалить" + LABEL_OPEN_THREAD: "Open selected thread" + LABEL_MOVE: "Переместить" + LABEL_READ: "Пометить выбранные письма прочитанными" + LABEL_UNREAD: "Пометить выбранные письма непрочитанными" + LABEL_IMPORTANT: "Пометить выбранные письма как важные" + LABEL_SEARCH: "Поиск" + LABEL_CANCEL_SEARCH: "Отменить поиск" + LABEL_FULLSCREEN_ENTER: "Полноэкранный режим" + LABEL_VIEW_MESSAGE_ENTER: "Просмотр сообщения" + LABEL_SWITCH_TO_MESSAGE: "Переключить фокус на выбранное сообщение" + LABEL_SWITCH_TO_FOLDER_LIST: "Переключить фокус на список папок" + LABEL_FULLSCREEN_TOGGLE: "Переключить полноэкранный режим" + LABEL_BLOCKQUOTES_TOGGLE: "Переключение видимости цитат в письме" + LABEL_THREAD_NEXT: "Следующее сообщение в цепочке" + LABEL_THREAD_PREV: "Предыдущее сообщение в цепочке" + LABEL_PRINT: "Распечатать" + LABEL_EXIT_FULLSCREEN: "Выйти из полноэкранного режима" + LABEL_CLOSE_MESSAGE: "Закрыть сообщение" + LABEL_SWITCH_TO_LIST: "Переключить фокус на список писем" + LABEL_OPEN_COMPOSE_POPUP: "Написать письмо" + LABEL_MINIMIZE_COMPOSE_POPUP: "Минимизировать окно" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Выбрать отправителя" + LABEL_SAVE_MESSAGE: "Сохранить сообщение" + LABEL_SEND_MESSAGE: "Отправить сообщение" + LABEL_CLOSE_COMPOSE: "Закрыть сообщение" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "Публичные ключи не найдены" + NO_PUBLIC_KEYS_FOUND_FOR: "Публичные ключи для \"%EMAIL%\" не найдены" + NO_PRIVATE_KEY_FOUND: "Приватный ключ не найден" + NO_PRIVATE_KEY_FOUND_FOR: "Приватный ключ для \"%EMAIL%\" не найден" + ADD_A_PUBLICK_KEY: "Добавить публичный ключ" + SELECT_A_PRIVATE_KEY: "Выберите секретный ключ" + UNVERIFIRED_SIGNATURE: "Неподтвержденная сигнатура" + DECRYPTION_ERROR: "OpenPGP ошибка расшифровки" + GOOD_SIGNATURE: "Подтвержденная сигнатура для %USER%" + PGP_ERROR: "OpenPGP ошибка: %ERROR%" + SPECIFY_FROM_EMAIL: "Укажите почтовый адрес отправителя" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Укажите как минимум одного получателя" + NOTIFICATIONS: + INVALID_TOKEN: "Неверный токен запроса" + AUTH_ERROR: "Не удалось авторизоваться" + ACCESS_ERROR: "Ошибка доступа" + CONNECTION_ERROR: "Ошибка соединения с сервером." + CAPTCHA_ERROR: "Неправильное проверочное слово." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + К данному социальному пользователю еще не прикреплен почтовый аккаунт. Войдите + в систему под своим почтовым аккаунтом и включите эту возможность в настройках. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + К данному социальному пользователю еще не прикреплен почтовый аккаунт. Войдите + в систему под своим почтовым аккаунтом и включите эту возможность в настройках. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + К данному социальному пользователю еще не прикреплен почтовый аккаунт. Войдите + в систему под своим почтовым аккаунтом и включите эту возможность в настройках. + DOMAIN_NOT_ALLOWED: "Данный домен не разрешен" + ACCOUNT_NOT_ALLOWED: "Данный аккаунт не разрешен" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Необходима двухфакторная верификация" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Ошибка двухфакторной верификации" + COULD_NOT_SAVE_NEW_PASSWORD: "Не удалось сохранить новый пароль" + CURRENT_PASSWORD_INCORRECT: "Текущий пароль неверный" + NEW_PASSWORD_SHORT: "Пароль слишком короткий" + NEW_PASSWORD_WEAK: "Пароль слишком простой" + NEW_PASSWORD_FORBIDDENT: "Пароль содержит запрещенные символы" + CONTACTS_SYNC_ERROR: "Ошибка синхронизации контактов" + CANT_GET_MESSAGE_LIST: "Не могу получить список писем" + CANT_GET_MESSAGE: "Не могу получить письмо" + CANT_DELETE_MESSAGE: "Не могу удалить письмо" + CANT_MOVE_MESSAGE: "Не могу переместить письмо" + CANT_SAVE_MESSAGE: "Не могу сохранить письмо" + CANT_SEND_MESSAGE: "Не могу отправить письмо" + INVALID_RECIPIENTS: "Проверьте правильность ввода всех адресов." + CANT_SAVE_FILTERS: "Не могу сохранить фильтры" + CANT_GET_FILTERS: "Не могу загрузить фильтры" + FILTERS_ARE_NOT_CORRECT: "Фильтры неправильны" + CANT_CREATE_FOLDER: "Не могу создать папку" + CANT_RENAME_FOLDER: "Не могу переименовать папку" + CANT_DELETE_FOLDER: "Не могу удалить папку" + CANT_DELETE_NON_EMPTY_FOLDER: "Не могу удалить непустую папку" + CANT_SUBSCRIBE_FOLDER: "Не могу подписать папку" + CANT_UNSUBSCRIBE_FOLDER: "Не могу отписать папку" + CANT_SAVE_SETTINGS: "Не могу сохранить настройки" + CANT_SAVE_PLUGIN_SETTINGS: "Не могу сохранить настройки" + DOMAIN_ALREADY_EXISTS: "Домен уже существует" + CANT_INSTALL_PACKAGE: "Ошибка установки пакета" + CANT_DELETE_PACKAGE: "Ошибка удаления пакета" + INVALID_PLUGIN_PACKAGE: "Ошибка пакета плагина" + UNSUPPORTED_PLUGIN_PACKAGE: "Для работы плагина необходима полная поддержка сервера" + LICENSING_SERVER_IS_UNAVAILABLE: "Сервер подписок временно не доступен." + LICENSING_DOMAIN_EXPIRED: "Подписка на данный домен устарела." + LICENSING_DOMAIN_BANNED: "Подписка на данный домен заблокирована." + DEMO_SEND_MESSAGE_ERROR: "Демо аккаунту отправка писем на внешние почтовые адреса запрещена!" + DEMO_ACCOUNT_ERROR: "По соображениям безопасности данный аккаунт не может выполнить это действие." + ACCOUNT_ALREADY_EXISTS: "Аккаунт уже добавлен" + ACCOUNT_DOES_NOT_EXIST: "Аккаунт не существует" + MAIL_SERVER_ERROR: "Ошибка доступа к почтовому серверу" + INVALID_INPUT_ARGUMENT: "Неверный параметр" + UNKNOWN_ERROR: "Неизвестная ошибка" + STATIC: + BACK_LINK: "Обновить" + DOMAIN_LIST_DESC: "Список доменов, к которым разрешен доступ через веб почту." + PHP_EXSTENSIONS_ERROR_DESC: "Необходимые расширения PHP не установлены на вашем сервере!" + PHP_VERSION_ERROR_DESC: "Ваша версия PHP (%VERSION%) ниже требуемой 5.3.0!" + NO_SCRIPT_TITLE: "Для работы приложения необходим JavaScript." + NO_SCRIPT_DESC: | + По-видимому, JavaScript либо не поддерживается вашим браузером, либо отключен. + Включите JavaScript, изменив настройки браузера, затем повторите попытку. + NO_COOKIE_TITLE: "Для работы приложения необходимы Cookie." + NO_COOKIE_DESC: | + По-видимому, Cookie либо не поддерживаются вашим браузером, либо отключены. + Включите Cookie, изменив настройки браузера, затем повторите попытку. + BAD_BROWSER_TITLE: "Ваш браузер устарел." + BAD_BROWSER_DESC: | + Чтобы использовать все возможности приложения, + загрузите и установите один из этих браузеров diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sk_SK.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sk_SK.yml new file mode 100755 index 00000000..d58f7f2d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sk_SK.yml @@ -0,0 +1,710 @@ +sk_SK: + LOGIN: + LABEL_EMAIL: "Email" + LABEL_LOGIN: "Používateľské meno" + LABEL_PASSWORD: "Heslo" + LABEL_SIGN_ME: "Zapamätať" + LABEL_VERIFICATION_CODE: "Verifikačný kód" + LABEL_DONT_ASK_VERIFICATION_CODE: "Don't ask for the code for 2 weeks" + BUTTON_SIGN_IN: "Prihlásiť" + TITLE_SIGN_IN_GOOGLE: "Prihlásiť pomocu Google" + TITLE_SIGN_IN_FACEBOOK: "Prihlásiť pomocou Facebook" + TITLE_SIGN_IN_TWITTER: "Prihlásiť pomocou Twitter" + LABEL_FORGOT_PASSWORD: "Forgot password" + LABEL_REGISTRATION: "Registration" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Pridať účet" + BUTTON_SETTINGS: "Nastavenia" + BUTTON_HELP: "Pomoc" + BUTTON_LOGOUT: "Odhlásiť" + MOBILE: + BUTTON_MOBILE_VERSION: "Verzia pre mobil" + BUTTON_DESKTOP_VERSION: "Verzia pre desktop" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Hľadať" + TITLE_ADV: "Rozšírené hľadanie" + LABEL_ADV_FROM: "Odosielateľ" + LABEL_ADV_TO: "Príjemca" + LABEL_ADV_SUBJECT: "Predmet" + LABEL_ADV_TEXT: "Text" + LABEL_ADV_HAS_ATTACHMENT: "S prílohou" + LABEL_ADV_HAS_ATTACHMENTS: "S prílohami" + LABEL_ADV_FLAGGED: "Označené hviezdičkou" + LABEL_ADV_UNSEEN: "Neprečítané" + LABEL_ADV_DATE: "Dátum" + LABEL_ADV_DATE_ALL: "Kedykoľvek" + LABEL_ADV_DATE_3_DAYS: "Nie staršie ako 3 dni" + LABEL_ADV_DATE_7_DAYS: "Nie staršie ako týždeň" + LABEL_ADV_DATE_MONTH: "Nie staršie ako mesiac" + LABEL_ADV_DATE_3_MONTHS: "Nie staršie ako 3 mesiace" + LABEL_ADV_DATE_6_MONTHS: "Nie staršie ako 6 mesiacov" + LABEL_ADV_DATE_YEAR: "Nie staršie ako 1 rok" + BUTTON_ADV_SEARCH: "Hľadať" + PREVIEW_POPUP: + FULLSCREEN: "Toggle fullscreen" + ZOOM: "Zoom in/out" + CLOSE: "Zatvoriť (Esc)" + LOADING: "Načítavam..." + GALLERY_PREV: "Predchádzajúci (šípka vľavo)" + GALLERY_NEXT: "Nasledujúci (šípka vpravo)" + GALLERY_COUNTER: "%curr% z %total%" + IMAGE_ERROR: "Obrázok sa nepodarilo načítať." + AJAX_ERROR: "Obsah sa nepodarilo načítať." + FOLDER_LIST: + BUTTON_COMPOSE: "Vytvoriť" + BUTTON_CONTACTS: "Adresár" + BUTTON_NEW_MESSAGE: "Nová správa" + INBOX_NAME: "Prijaté" + SENT_NAME: "Odoslané" + DRAFTS_NAME: "Koncepty" + SPAM_NAME: "Spam" + TRASH_NAME: "Kôš" + ARCHIVE_NAME: "Archív" + QUOTA: + TITLE: "Využitie kvóty" + MESSAGE_LIST: + BUTTON_RELOAD: "Obnoviť zoznam správ" + BUTTON_MOVE_TO: "Presunúť do" + BUTTON_DELETE: "Odstrániť" + BUTTON_ARCHIVE: "Archív" + BUTTON_SPAM: "Spam" + BUTTON_NOT_SPAM: "Not Spam" + BUTTON_EMPTY_FOLDER: "Vyčistiť priečinok" + BUTTON_MULTY_FORWARD: "Preposlať správy" + BUTTON_DELETE_WITHOUT_MOVE: "Navždy odstrániť" + BUTTON_MORE: "Viac" + MENU_SET_SEEN: "Označiť ako prečítané" + MENU_SET_ALL_SEEN: "Označiť všetko ako prečítané" + MENU_UNSET_SEEN: "Označiť ako neprečítané" + MENU_SET_FLAG: "Označiť hviezdičkou" + MENU_UNSET_FLAG: "Zrušiť označenie hviezdičkou" + MENU_SELECT_ALL: "Všetko" + MENU_SELECT_NONE: "Žiadne" + MENU_SELECT_INVERT: "Invertovať" + MENU_SELECT_UNSEEN: "Neprečítané" + MENU_SELECT_SEEN: "Prečítané" + MENU_SELECT_FLAGGED: "Označené" + MENU_SELECT_UNFLAGGED: "Neoznačené" + EMPTY_LIST: "Zoznam je prázdny." + EMPTY_SEARCH_LIST: "Vášmu vyhľadávaniu nezodpovedajú žiadne správy." + SEARCH_RESULT_FOR: "Výsledky vyhľadávania pre \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "späť do zoznamu správ" + LIST_LOADING: "Načítavam" + EMPTY_SUBJECT_TEXT: "(Bez predmetu)" + PUT_MESSAGE_HERE: "Pusťte správu tu pre jej zobrazenie v zozname" + TODAY_AT: "dnes o %TIME%" + YESTERDAY_AT: "včera o %TIME%" + SEARCH_PLACEHOLDER: "Hľadať" + NEW_MESSAGE_NOTIFICATION: "Máte %COUNT% nových správ!" + QUOTA_SIZE: "Používate %SIZE% (%PROC%%) z vašich %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Editovať" + BUTTON_BACK: "Späť" + BUTTON_CLOSE: "Zatvoriť" + BUTTON_DELETE: "Odstrániť" + BUTTON_UNSUBSCRIBE: "Odhlásiť sa z mailing listu" + BUTTON_ARCHIVE: "Archív" + BUTTON_SPAM: "Spam" + BUTTON_NOT_SPAM: "Not Spam" + BUTTON_MOVE_TO: "Presunúť do" + BUTTON_MORE: "Viac" + BUTTON_REPLY: "Odpovedať" + BUTTON_REPLY_ALL: "Odpovedať všetkým" + BUTTON_FORWARD: "Preposlať" + BUTTON_FORWARD_AS_ATTACHMENT: "Preposlať ako prílohu" + BUTTON_EDIT_AS_NEW: "Použiť ako predlohu" + BUTTON_SHOW_IMAGES: "Zobraziť externé obrázky" + BUTTON_NOTIFY_READ_RECEIPT: "Odosielateľ požiadal o potvrdenie prečítania tejto správy." + BUTTON_IN_NEW_WINDOW: "Zobraziť v novom okne" + BUTTON_THREAD_LIST: "Thread list" + BUTTON_THREAD_PREV: "Previous" + BUTTON_THREAD_NEXT: "Next" + BUTTON_THREAD_MORE: "More messages" + MENU_HEADERS: "Zobraziť hlavičku správy" + MENU_VIEW_ORIGINAL: "Zobraziť zdroj" + MENU_DOWNLOAD_ORIGINAL: "Prevziať ako súbor .eml" + MENU_FILTER_SIMILAR: "Filtrovať správy ako táto" + MENU_PRINT: "Tlačiť" + EMPTY_SUBJECT_TEXT: "(Bez predmetu)" + LABEL_SUBJECT: "Predmet" + LABEL_DATE: "Dátum" + LABEL_FROM: "Odosielateľ" + LABEL_FROM_SHORT: "od" + LABEL_TO: "Príjemca" + LABEL_TO_SHORT: "pre" + LABEL_CC: "Kópia" + LABEL_BCC: "Skrytá kópia" + LABEL_REPLY_TO: "Adresa pre odpoveď" + PRINT_LABEL_FROM: "Odosielateľ" + PRINT_LABEL_TO: "Príjemca" + PRINT_LABEL_CC: "Kópia" + PRINT_LABEL_BCC: "Skrytá kópia" + PRINT_LABEL_REPLY_TO: "Adresa pre odpoveď" + PRINT_LABEL_DATE: "Dátum" + PRINT_LABEL_SUBJECT: "Predmet" + PRINT_LABEL_ATTACHMENTS: "Prílohy" + MESSAGE_LOADING: "Načítavam" + MESSAGE_VIEW_DESC: "Vyberte správu zo zoznamu pre jej zobrazenie tu." + MESSAGE_VIEW_MOVE_DESC: "Zvoľte cieľ kliknutím na názov priečinka v ľavom stĺpci." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Heslo" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" + LINK_DOWNLOAD_AS_ZIP: "Download as zip" + LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" + LINK_SAVE_TO_DROPBOX: "Save to Dropbox" + READ_RECEIPT: + SUBJECT: "Return Receipt (displayed) - %SUBJECT%" + BODY: | + This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. + + Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. + There is no guarantee that the recipient has read or understood the message contents. + SUGGESTIONS: + SEARCHING_DESC: "Hľadám..." + CONTACTS: + LEGEND_CONTACTS: "Adresár" + SEARCH_INPUT_PLACEHOLDER: "Hľadať" + BUTTON_ADD_CONTACT: "Pridať kontakt" + BUTTON_CREATE_CONTACT: "Vytvoriť" + BUTTON_UPDATE_CONTACT: "Aktualizovať" + BUTTON_IMPORT: "Importovať (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" + BUTTON_EXPORT_CSV: "Export (csv)" + ERROR_IMPORT_FILE: "Chyba importu (nesprávny formát súboru)" + LIST_LOADING: "Načítavam" + EMPTY_LIST: "Nemáte žiadne kontakty" + EMPTY_SEARCH: "Nenašli sa žiadne kontakty" + CLEAR_SEARCH: "Clear search" + CONTACT_VIEW_DESC: "Zvoľte kontakt zo zoznamu pre jeho zobrazenie tu." + LABEL_DISPLAY_NAME: "Zobraziť ako" + LABEL_EMAIL: "Email" + LABEL_PHONE: "Telefón" + LABEL_WEB: "Web" + LABEL_BIRTHDAY: "Birthday" + LINK_ADD_EMAIL: "Pridať emailovú adresu" + LINK_ADD_PHONE: "Pridať telefón" + LINK_BIRTHDAY: "Birthday" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Zadajte Zobrazované meno" + PLACEHOLDER_ENTER_LAST_NAME: "Zadajte Priezvisko" + PLACEHOLDER_ENTER_FIRST_NAME: "Zadajte Meno" + PLACEHOLDER_ENTER_NICK_NAME: "Enter nickname" + LABEL_READ_ONLY: "Len pre čítanie" + LABEL_SHARE: "Zdielať" + ADD_MENU_LABEL: "Add" + ADD_MENU_NICKNAME: "Nickname" + ADD_MENU_NOTES: "Notes" + ADD_MENU_EMAIL: "Email" + ADD_MENU_PHONE: "Phone" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Address" + ADD_MENU_BIRTHDAY: "Birthday" + ADD_MENU_TAGS: "Tags" + BUTTON_SHARE_NONE: "Žiadne" + BUTTON_SHARE_ALL: "Všetko" + BUTTON_SYNC: "Synchronization (CardDAV)" + COMPOSE: + TITLE_FROM: "Odosielateľ" + TITLE_TO: "Príjemca" + TITLE_CC: "Kópia" + TITLE_BCC: "Skrytá kópia" + TITLE_REPLY_TO: "Reply To" + TITLE_SUBJECT: "Predmet" + LINK_SHOW_INPUTS: "zobraziť všetky polia" + BUTTON_SEND: "Odoslať" + BUTTON_SAVE: "Uložiť" + BUTTON_DELETE: "Odstrániť" + BUTTON_CANCEL: "Zrušiť" + BUTTON_MINIMIZE: "Minimize" + SAVED_TIME: "Uložené o %TIME%" + SAVED_ERROR_ON_SEND: "Správa bola odoslaná ale nebola uložená do priečinka odoslaných správ" + DISCARD_UNSAVED_DATA: "Discard unsaved data?" + ATTACH_FILES: "Pripojiť súbory" + ATTACH_DROP_FILES_DESC: "Súbory pusťte tu" + ATTACH_ITEM_CANCEL: "Zrušiť" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" + FORWARD_MESSAGE_TOP_TITLE: "-------- Forwarded message -------" + FORWARD_MESSAGE_TOP_FROM: "Odosielateľ" + FORWARD_MESSAGE_TOP_TO: "Príjemca" + FORWARD_MESSAGE_TOP_CC: "Kópia" + FORWARD_MESSAGE_TOP_SENT: "Odoslať" + FORWARD_MESSAGE_TOP_SUBJECT: "Predmet" + EMPTY_TO_ERROR_DESC: "Zadajte prosím aspoň jedného príjemcu" + NO_ATTACHMENTS_HERE_DESC: "No attachments here." + ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet" + BUTTON_REQUEST_READ_RECEIPT: "Vyžiadať potvrdenie o prečítaní" + BUTTON_MARK_AS_IMPORTANT: "Mark as important" + BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" + BUTTON_REQUEST_DSN: "Request a delivery receipt" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Close" + POPUPS_ASK: + BUTTON_YES: "Áno" + BUTTON_NO: "Nie" + DESC_WANT_CLOSE_THIS_WINDOW: "Ste si istý že chcete zatvoriť toto okno?" + DESC_WANT_DELETE_MESSAGES: "Ste si istý že chcete odstrániť tieto správy?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Zvoľte jazyk" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Pridať účet?" + BUTTON_ADD_ACCOUNT: "Pridať" + TITLE_UPDATE_ACCOUNT: "Update Account?" + BUTTON_UPDATE_ACCOUNT: "Update" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Pridať Identitu?" + TITLE_UPDATE_IDENTITY: "Upraviť Identitu?" + BUTTON_ADD_IDENTITY: "Pridať" + BUTTON_UPDATE_IDENTITY: "Upraviť" + LABEL_EMAIL: "Email" + LABEL_NAME: "Meno" + LABEL_REPLY_TO: "Adresa pre odpoveď" + LABEL_SIGNATURE: "Signature" + LABEL_CC: "Cc" + LABEL_BCC: "Skrytá kópia" + LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Vytvoriť priečinok?" + LABEL_NAME: "Názov priečinka" + LABEL_PARENT: "Nadradený priečinok" + BUTTON_CREATE: "Vytvoriť" + BUTTON_CANCEL: "Zrušiť" + BUTTON_CLOSE: "Zatvoriť" + TITLE_CREATING_PROCESS: "Vytváram priečinok" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Odstrániť všetky správy v priečinku?" + BUTTON_CLEAR: "Vyčistiť" + BUTTON_CANCEL: "Zrušiť" + BUTTON_CLOSE: "Zatvoriť" + DANGER_DESC_WARNING: "Upozornenie!" + DANGER_DESC_HTML_1: "Chystáte sa nenávratne odstrániť všetky správy z priečinka %FOLDER%." + DANGER_DESC_HTML_2: "Tento proces nie je možné prerušiť." + TITLE_CLEARING_PROCESS: "Odstraňujem priečinok..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Import OpenPGP key" + BUTTON_IMPORT_OPEN_PGP_KEY: "Import" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "View OpenPGP key" + BUTTON_SELECT: "Select" + BUTTON_CLOSE: "Close" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP keys" + LABEL_EMAIL: "Email" + LABEL_NAME: "Name" + LABEL_PASSWORD: "Password" + LABEL_KEY_BIT_LENGTH: "Key length" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" + LABEL_SIGN: "Sign" + LABEL_ENCRYPT: "Encrypt" + LABEL_PASSWORD: "Password" + BUTTON_SIGN: "Sign" + BUTTON_ENCRYPT: "Encrypt" + BUTTON_SIGN_AND_ENCRYPT: "Sign and encrypt" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" + LABEL_KEY: "Private Key" + LABEL_PASSWORD: "Password" + BUTTON_DECRYPT: "Decrypt" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "2-Step verification test" + LABEL_CODE: "Code" + BUTTON_TEST: "Test" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Create a filter?" + TITLE_EDIT_FILTER: "Update filter?" + FILTER_NAME: "Name" + LEGEND_CONDITIONS: "Conditions" + LEGEND_ACTIONS: "Actions" + BUTTON_DONE: "Done" + BUTTON_ADD_CONDITION: "Add a Condition" + SELECT_ACTION_NONE: "None" + SELECT_ACTION_MOVE_TO: "Move to" + SELECT_ACTION_FORWARD_TO: "Forward to" + SELECT_ACTION_REJECT: "Reject" + SELECT_ACTION_VACATION_MESSAGE: "Vacation message" + SELECT_ACTION_DISCARD: "Discard" + SELECT_FIELD_FROM: "From" + SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" + SELECT_FIELD_SUBJECT: "Subject" + SELECT_FIELD_HEADER: "Header" + SELECT_FIELD_SIZE: "Size" + SELECT_TYPE_CONTAINS: "Contains" + SELECT_TYPE_NOT_CONTAINS: "Not Contains" + SELECT_TYPE_MATCHES: "Matches (* and ? supported)" + SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" + SELECT_TYPE_REGEXP: "Regexp" + SELECT_TYPE_NOT_REGEXP: "Not Regexp" + SELECT_TYPE_EQUAL_TO: "Equal To" + SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" + SELECT_TYPE_OVER: "Over" + SELECT_TYPE_UNDER: "Under" + SELECT_MATCH_ANY: "Matching any of the following rules" + SELECT_MATCH_ALL: "Matching all of the following rules" + MARK_AS_READ_LABEL: "Mark as read" + REPLY_INTERVAL_LABEL: "Reply interval (days)" + KEEP_LABEL: "Keep" + STOP_LABEL: "Don't stop processing rules" + EMAIL_LABEL: "Email" + VACATION_SUBJECT_LABEL: "Subject (optional)" + VACATION_MESSAGE_LABEL: "Message" + VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" + REJECT_MESSAGE_LABEL: "Reject message" + ALL_INCOMING_MESSAGES_DESC: "All incoming messages" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Spravovať Systémové priečinky" + SELECT_CHOOSE_ONE: "Vybrať" + SELECT_UNUSE_NAME: "Nepoužívať" + LABEL_SENT: "Odoslané" + LABEL_DRAFTS: "Koncepty" + LABEL_SPAM: "Spam" + LABEL_TRASH: "Kôš" + LABEL_ARCHIVE: "Archive" + BUTTON_CANCEL: "Zrušiť" + BUTTON_CLOSE: "Zatvoriť" + NOTIFICATION_SENT: | + Nepriradili ste systémový priečinok "Odoslané" kam budú správy presunuté po ich odoslaní. + Ak nechcete ukladať odoslané správy, vyberte prosím možnosť "Nepoužívať". + NOTIFICATION_DRAFTS: "Nepriradili ste systémový priečinok pre \"Koncepty\" kam sú správy ukladané počas ich písania." + NOTIFICATION_SPAM: | + Nepriradili ste systémový priečinok pre "Spam" kam sú ukladané nevyžiadané správy. + Ak si želáte takéto správy odstraňovať natrvalo, vyberte prosím možnosť "Nepoužívať". + NOTIFICATION_TRASH: | + Nepriradili ste systémový priečinok pre "Kôš" kam sú správy presunuté po ich odstránení. + Ak si želáte takéto správy odstraňovať natrvalo, vyberte prosím možnosť "Nepoužívať". + NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "2-Step Verification" + LABEL_ENABLE_TWO_FACTOR: "Enable 2-Step verification" + LABEL_TWO_FACTOR_USER: "User" + LABEL_TWO_FACTOR_STATUS: "Status" + LABEL_TWO_FACTOR_SECRET: "Secret" + LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" + BUTTON_CREATE: "Create New Secret" + BUTTON_ACTIVATE: "Activate" + BUTTON_CLEAR: "Clear" + BUTTON_LOGOUT: "Logout" + BUTTON_DONE: "Done" + BUTTON_TEST: "Test" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Show Secret" + BUTTON_HIDE_SECRET: "Hide Secret" + TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" + TWO_FACTOR_SECRET_DESC: >- + Import this info into your Google Authenticator client (or other TOTP client) + using the provided QR code below or by entering the code manually. + TWO_FACTOR_BACKUP_CODES_DESC: >- + If you can't receive codes via Google Authenticator, you can use backup codes + to sign in. After you’ve used a backup code to sign in, it will become inactive. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." + TITLES: + LOADING: "Načítavam" + LOGIN: "Používateľské meno" + MAILBOX: "Schránka správ" + SETTINGS: "Nastavenia" + COMPOSE: "Napísať" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Súbor je príliš veľký" + ERROR_FILE_PARTIALLY_UPLOADED: "Z dôvodu neznámej chyby bol súbor nahraný len čiastočne" + ERROR_NO_FILE_UPLOADED: "Súbor nebol nahraný" + ERROR_MISSING_TEMP_FOLDER: "Dočasný súbor chýba" + ERROR_ON_SAVING_FILE: "Nastala neznáma chyba pri nahrávaní" + ERROR_FILE_TYPE: "Nesprávny typ súboru" + ERROR_UNKNOWN: "Nastala neznáma chyba pri nahrávaní" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" + TEXT_SWITCHER_RICH_FORMATTING: "Formátovaný text" + TEXT_SWITCHER_CONFIRM: "Formátovanie textu a obrázky budú stratené. Želáte si pokračovať?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Osobné" + LABEL_GENERAL_NAME: "Všeobecné" + LABEL_CONTACTS_NAME: "Kontakty" + LABEL_FOLDERS_NAME: "Priečinky" + LABEL_ACCOUNTS_NAME: "Účty" + LABEL_IDENTITY_NAME: "Identita" + LABEL_IDENTITIES_NAME: "Identity" + LABEL_FILTERS_NAME: "Filters" + LABEL_TEMPLATES_NAME: "Templates" + LABEL_SECURITY_NAME: "Security" + LABEL_SOCIAL_NAME: "Social" + LABEL_THEMES_NAME: "Motívy" + LABEL_CHANGE_PASSWORD_NAME: "Heslo" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Späť" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filters" + BUTTON_SAVE: "Save" + BUTTON_ADD_FILTER: "Add a Filter" + BUTTON_DELETE: "Delete" + BUTTON_RAW_SCRIPT: "Use Custom User Script" + SUBNAME_NONE: "None" + SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" + SUBNAME_REJECT: "Reject" + SUBNAME_VACATION_MESSAGE: "Vacation message" + SUBNAME_DISCARD: "Discard" + CAPABILITY_LABEL: "Capability" + LOADING_PROCESS: "Updating filter list" + DELETING_ASK: "Are you sure?" + CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identita" + LABEL_DISPLAY_NAME: "Meno" + LABEL_REPLY_TO: "Adresa pre odpoveď" + LABEL_SIGNATURE: "Podpis" + LABEL_ADD_SIGNATURE_TO_ALL: "Pripojiť podpis k všetkých odchádzajúcim správam" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Security" + LABEL_CONFIGURE_TWO_FACTOR: "Nakonfigurovať 2-krokovú verifikáciu" + LABEL_AUTOLOGOUT: "Auto Logout" + AUTOLOGIN_NEVER_OPTION_NAME: "Never" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hodín" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Všeobecné" + LABEL_LANGUAGE: "Jazyk" + LABEL_IDENTITY: "Identity" + LABEL_LAYOUT: "Layout" + LABEL_LAYOUT_NO_SPLIT: "No Split" + LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" + LABEL_EDITOR: "Predvolený editor správ" + LABEL_EDITOR_HTML: "Html" + LABEL_EDITOR_PLAIN: "Text" + LABEL_EDITOR_HTML_FORCED: "Html (forced)" + LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" + LABEL_ANIMATION: "Animácie prostredia" + LABEL_ANIMATION_FULL: "Full" + LABEL_ANIMATION_NORMAL: "Normal" + LABEL_ANIMATION_NONE: "None" + LABEL_VIEW_OPTIONS: "Možnosti zobrazenia" + LABEL_USE_PREVIEW_PANE: "Používať panel rýchleho zobrazenia" + LABEL_USE_CHECKBOXES_IN_LIST: "Zobrazenie zaštkrtávacích políčok v zozname" + LABEL_USE_THREADS: "Zobraziť ako konverzácie" + LABEL_REPLY_SAME_FOLDER: "Umiestňovať odpovede do priečinka so správou ktorej sa týkajú" + LABEL_SHOW_IMAGES: "Vždy zobrazovať obrázky v tele správy" + LABEL_SHOW_ANIMATION: "Animovať" + LABEL_MESSAGE_PER_PAGE: "Správ na stranu" + LABEL_NOTIFICATIONS: "Notifikácie" + LABEL_SOUND_NOTIFICATION: "Sound notification" + LABEL_CHROME_NOTIFICATION_DESC: "Zobrazovať upozornenia na nové správy" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Zablokované prehliadačom)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Kontakty" + LABEL_CONTACTS_AUTOSAVE: "Automaticky pridávať príjemcov správ do Adresára" + LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" + LABEL_CONTACTS_SYNC_SERVER: "Server" + LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" + LABEL_CONTACTS_SYNC_USER: "User" + LABEL_CONTACTS_SYNC_PASSWORD: "Password" + SETTINGS_THEMES: + LEGEND_THEMES: "Motívy" + LEGEND_THEMES_CUSTOM: "Správa vlastného motívu" + LABEL_CUSTOM_TYPE: "Typ" + LABEL_CUSTOM_TYPE_LIGHT: "Svetlý" + LABEL_CUSTOM_TYPE_DARK: "Tmavý" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Pozadie" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Nahrať obrázok pozadia (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Súbor je príliš veľký" + ERROR_FILE_TYPE_ERROR: "Nesprávny typ súboru (JPG and PNG only)" + ERROR_UNKNOWN: "Nastala nezáma chyba pri nahrávaní súboru" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Pripojiť Google" + BUTTON_GOOGLE_DISCONNECT: "Odpojiť Google" + MAIN_GOOGLE_DESC: "After enabling login via Google, you can log into this account using Google button on the login screen." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Pripojiť Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Odpojiť Facebook" + MAIN_FACEBOOK_DESC: "After enabling login via Facebook, you can log into this account using Facebook button on the login screen." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Pripojiť Twitter" + BUTTON_TWITTER_DISCONNECT: "Odpojiť Twitter" + MAIN_TWITTER_DESC: "After enabling login via Twitter, you can log into this account using Twitter button on the login screen." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Zoznam priečinkov" + BUTTON_CREATE: "Vytvoriť priečinok" + BUTTON_SYSTEM: "Systémové priečinky" + BUTTON_DELETE: "Odstrániť" + BUTTON_SUBSCRIBE: "Prihlásiť sa" + BUTTON_UNSUBSCRIBE: "Odhlásiť sa" + LOADING_PROCESS: "Aktualizujem zoznam priečinkov" + CREATING_PROCESS: "Vytváram priečinok" + DELETING_PROCESS: "Odstraňujem priečinok" + RENAMING_PROCESS: "Premenovávam prečinok" + DELETING_ASK: "Ste si istý?" + TO_MANY_FOLDERS_DESC_1: "You have too many folders!" + TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." + HELP_DELETE_FOLDER: "Delete folder" + HELP_SHOW_HIDE_FOLDER: "Show/hide folder" + HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Zoznam účtov" + LEGEND_IDENTITIES: "Identities" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" + BUTTON_ADD_ACCOUNT: "Pridať účet" + BUTTON_ADD_IDENTITY: "Add an Identity" + BUTTON_DELETE: "Odstrániť" + LOADING_PROCESS: "Aktualizácia zoznamu účtov" + DELETING_ASK: "Ste si istý?" + DEFAULT_IDENTITY_LABEL: "default" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identita" + LEGEND_IDENTITIES: "Ďalšie identity" + LABEL_DEFAULT: "Default" + LABEL_DISPLAY_NAME: "Meno" + LABEL_REPLY_TO: "Adresa pre odpoveď" + LABEL_SIGNATURE: "Podpis" + LABEL_ADD_SIGNATURE_TO_ALL: "Pripojiť podpis ku všetkým odosielaným správam" + BUTTON_ADD_IDENTITY: "Pridať Identitu" + BUTTON_DELETE: "Odstrániť" + LOADING_PROCESS: "Aktualizácia zoznamu identít" + DELETING_ASK: "Ste si istý?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Zmeniť heslo" + LABEL_CURRENT_PASSWORD: "Súčasné heslo" + LABEL_NEW_PASSWORD: "Nové heslo" + LABEL_REPEAT_PASSWORD: "Nové heslo znova" + BUTTON_UPDATE_PASSWORD: "Nastaviť nové heslo" + ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" + TITLE_PRIVATE: "Private" + TITLE_PUBLIC: "Public" + DELETING_ASK: "Are you sure?" + GENERATE_ONLY_HTTPS: "HTTPS only" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" + TAB_MAILBOX: "Mailbox" + TAB_MESSAGE_LIST: "Message list" + TAB_MESSAGE_VIEW: "Message view" + TAB_COMPOSE: "Compose" + LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" + LABEL_REPLY: "Reply" + LABEL_REPLY_ALL: "Reply All" + LABEL_FORWARD: "Forward" + LABEL_FORWARD_MULTIPLY: "Forward (multiply)" + LABEL_HELP: "Help" + LABEL_CHECK_ALL: "Select all messages" + LABEL_ARCHIVE: "Archive" + LABEL_DELETE: "Delete" + LABEL_OPEN_THREAD: "Open selected thread" + LABEL_MOVE: "Move" + LABEL_READ: "Read selected messages" + LABEL_UNREAD: "Unread selected messages" + LABEL_IMPORTANT: "Označiť vybrané správy ako Dôležité" + LABEL_SEARCH: "Search" + LABEL_CANCEL_SEARCH: "Cancel search" + LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" + LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" + LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" + LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" + LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" + LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" + LABEL_THREAD_NEXT: "Next message in thread" + LABEL_THREAD_PREV: "Previous message in thread" + LABEL_PRINT: "Print" + LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" + LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" + LABEL_SWITCH_TO_LIST: "Switch focus back to message list" + LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" + LABEL_SAVE_MESSAGE: "Save message" + LABEL_SEND_MESSAGE: "Send message" + LABEL_CLOSE_COMPOSE: "Close compose" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "No public keys found" + NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" + NO_PRIVATE_KEY_FOUND: "No private key found" + NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" + ADD_A_PUBLICK_KEY: "Add a public key" + SELECT_A_PRIVATE_KEY: "Vybrať súkromný kľúč" + UNVERIFIRED_SIGNATURE: "Unverified signature" + DECRYPTION_ERROR: "OpenPGP decryption error" + GOOD_SIGNATURE: "Good signature from %USER%" + PGP_ERROR: "OpenPGP error: %ERROR%" + SPECIFY_FROM_EMAIL: "Please specify FROM email address" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" + NOTIFICATIONS: + INVALID_TOKEN: "Neplatný token" + AUTH_ERROR: "Overenie zlyhalo" + ACCESS_ERROR: "Chyba prístupu" + CONNECTION_ERROR: "Nepodarilo sa pripojiť k serveru" + CAPTCHA_ERROR: "Nesprávne CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + DOMAIN_NOT_ALLOWED: "Doména nie je povolená" + ACCOUNT_NOT_ALLOWED: "Účet nie je povolený" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" + COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" + CURRENT_PASSWORD_INCORRECT: "Current password incorrect" + NEW_PASSWORD_SHORT: "Password is too short" + NEW_PASSWORD_WEAK: "Password is too easy" + NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" + CONTACTS_SYNC_ERROR: "Contacts synchronization error" + CANT_GET_MESSAGE_LIST: "Chyba pri vytváraní zoznamu správ." + CANT_GET_MESSAGE: "Správu sa nepodarilo načítať" + CANT_DELETE_MESSAGE: "Správu sa nepodarilo odstrániť" + CANT_MOVE_MESSAGE: "Správu sa nepodarilo presunúť" + CANT_SAVE_MESSAGE: "Správu sa nepodarilo uložiť" + CANT_SEND_MESSAGE: "Správu sa nepodarilo odoslať" + INVALID_RECIPIENTS: "Neplatný príjemcovia" + CANT_SAVE_FILTERS: "Can't save filters" + CANT_GET_FILTERS: "Can't get filters" + FILTERS_ARE_NOT_CORRECT: "Filters are not correct" + CANT_CREATE_FOLDER: "Priečinok sa nepodarilo vytvoriť" + CANT_RENAME_FOLDER: "Priečinok sa nepodarilo premenovať" + CANT_DELETE_FOLDER: "Priečinok sa nepodarilo odstrániť" + CANT_DELETE_NON_EMPTY_FOLDER: "Nemôžem odstrániť neprázdny priečinok" + CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" + CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" + CANT_SAVE_SETTINGS: "Nastavenia sa nepodarilo uložiť" + CANT_SAVE_PLUGIN_SETTINGS: "Nastavenia sa nepodarilo uložiť" + DOMAIN_ALREADY_EXISTS: "Táto Doména už existuje" + CANT_INSTALL_PACKAGE: "Inštalácia balíčka zlyhala" + CANT_DELETE_PACKAGE: "Odstránenie balíčka zlyhalo" + INVALID_PLUGIN_PACKAGE: "Invalid plugin package" + UNSUPPORTED_PLUGIN_PACKAGE: "Nepodporovaný balíček rozšírenia" + LICENSING_SERVER_IS_UNAVAILABLE: "Subscription server is unvailable" + LICENSING_DOMAIN_EXPIRED: "Subscription for this domain has expired." + LICENSING_DOMAIN_BANNED: "Subscription for this domain is banned." + DEMO_SEND_MESSAGE_ERROR: "For security purposes, this demo account is not allowed to send messages to external e-mail addresses!" + DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" + ACCOUNT_ALREADY_EXISTS: "účet už existuje" + ACCOUNT_DOES_NOT_EXIST: "Účet neexistuje" + MAIL_SERVER_ERROR: "Nastala chyba počas prístupu na poštový server" + INVALID_INPUT_ARGUMENT: "Invalid input argument" + UNKNOWN_ERROR: "Neznáma chyba" + STATIC: + BACK_LINK: "Obnoviť" + DOMAIN_LIST_DESC: "Zoznam domén ku ktorým je povolené pristupovať cez webmail." + PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" + PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" + NO_SCRIPT_TITLE: "Táto aplikácia vyžaduje JavaScript." + NO_SCRIPT_DESC: | + Váš internetový prehliadač nepodporuje JavaScript. + Prosím povoľte podporu JavaScriptu v nastaveniach vášho internetového prehliadača a skúste to znova. + NO_COOKIE_TITLE: "Táto aplikácia vyžaduje podporu Cookies." + NO_COOKIE_DESC: | + Váš internetový prehliadač nepodporuje Cookies. + Prosím povoľte podporu Cookies v nastaveniach vášho internetového prehliadača a skúste to znova. + BAD_BROWSER_TITLE: "Používate zastaralý internetový prehliadač." + BAD_BROWSER_DESC: | + Aby ste mohli využívať všetky funkcie tejto aplikácie, + použite niektorý z nasledujúcich internetových prehliadačov: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sl_SI.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sl_SI.yml new file mode 100755 index 00000000..e92a7ff7 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sl_SI.yml @@ -0,0 +1,710 @@ +sl_SI: + LOGIN: + LABEL_EMAIL: "E-pošta" + LABEL_LOGIN: "Prijava" + LABEL_PASSWORD: "Geslo" + LABEL_SIGN_ME: "Zapomni si prijavo" + LABEL_VERIFICATION_CODE: "Potrditvena koda" + LABEL_DONT_ASK_VERIFICATION_CODE: "Ponoven vnos kode čez 2 tedna" + BUTTON_SIGN_IN: "Prijavi se" + TITLE_SIGN_IN_GOOGLE: "Za prijavo uporabi Google" + TITLE_SIGN_IN_FACEBOOK: "Za prijavo uporabi Facebook" + TITLE_SIGN_IN_TWITTER: "Za prijavo uporabi Twitter" + LABEL_FORGOT_PASSWORD: "Pozabljeno geslo" + LABEL_REGISTRATION: "Registracija" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Dodaj račun" + BUTTON_SETTINGS: "Nastavitve" + BUTTON_HELP: "Pomoč" + BUTTON_LOGOUT: "Odjavi" + MOBILE: + BUTTON_MOBILE_VERSION: "Mobilna različica" + BUTTON_DESKTOP_VERSION: "Namizna različica" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Iskanje" + TITLE_ADV: "Napredno iskanje" + LABEL_ADV_FROM: "Od" + LABEL_ADV_TO: "Za" + LABEL_ADV_SUBJECT: "Zadeva" + LABEL_ADV_TEXT: "Besedilo" + LABEL_ADV_HAS_ATTACHMENT: "Ima prilogo" + LABEL_ADV_HAS_ATTACHMENTS: "Ima prilogi/-e" + LABEL_ADV_FLAGGED: "Z zvezdico" + LABEL_ADV_UNSEEN: "Neprebrano" + LABEL_ADV_DATE: "Datum" + LABEL_ADV_DATE_ALL: "Vsa" + LABEL_ADV_DATE_3_DAYS: "Do 3 dni nazaj" + LABEL_ADV_DATE_7_DAYS: "Do 1 tedna nazaj" + LABEL_ADV_DATE_MONTH: "Do 1 meseca nazaj" + LABEL_ADV_DATE_3_MONTHS: "Do 3 mesecev nazaj" + LABEL_ADV_DATE_6_MONTHS: "Do 6 mesecev nazaj" + LABEL_ADV_DATE_YEAR: "Do 1 leta nazaj" + BUTTON_ADV_SEARCH: "Išči" + PREVIEW_POPUP: + FULLSCREEN: "Preklopi celozaslonski pogled" + ZOOM: "Približaj/oddalji" + CLOSE: "Zapri (Esc)" + LOADING: "Nalaganje..." + GALLERY_PREV: "Nazaj (puščica levo)" + GALLERY_NEXT: "Naprej (puščica desno)" + GALLERY_COUNTER: "%curr% od %total%" + IMAGE_ERROR: "Slike ni bilo mogoče naložiti." + AJAX_ERROR: "Vsebine ni bilo mogoče naložiti." + FOLDER_LIST: + BUTTON_COMPOSE: "Sestavi" + BUTTON_CONTACTS: "Stiki" + BUTTON_NEW_MESSAGE: "Novo sporočilo" + INBOX_NAME: "Prejeto" + SENT_NAME: "Poslano" + DRAFTS_NAME: "Osnutki" + SPAM_NAME: "Vsiljena pošta" + TRASH_NAME: "Smeti" + ARCHIVE_NAME: "Arhiv" + QUOTA: + TITLE: "Poraba prostora" + MESSAGE_LIST: + BUTTON_RELOAD: "Ponovno naloži seznam sporočil" + BUTTON_MOVE_TO: "Premakni v" + BUTTON_DELETE: "Izbriši" + BUTTON_ARCHIVE: "Arhiviraj" + BUTTON_SPAM: "Vsiljena pošta" + BUTTON_NOT_SPAM: "Ni vsiljena pošta" + BUTTON_EMPTY_FOLDER: "Izprazni mapo" + BUTTON_MULTY_FORWARD: "Posreduj kot prilogo/-e" + BUTTON_DELETE_WITHOUT_MOVE: "Trajno izbriši" + BUTTON_MORE: "Več" + MENU_SET_SEEN: "Označi kot prebrano" + MENU_SET_ALL_SEEN: "Označi vsa kot prebrano" + MENU_UNSET_SEEN: "Označi kot neprebrano" + MENU_SET_FLAG: "Dodaj zvezdico" + MENU_UNSET_FLAG: "Odstrani zvezdico" + MENU_SELECT_ALL: "Vsa" + MENU_SELECT_NONE: "Nobeno" + MENU_SELECT_INVERT: "Obrni izbiro" + MENU_SELECT_UNSEEN: "Neprebrana" + MENU_SELECT_SEEN: "Prebrana" + MENU_SELECT_FLAGGED: "Z zvezdico" + MENU_SELECT_UNFLAGGED: "Brez zvezdice" + EMPTY_LIST: "Prazen seznam." + EMPTY_SEARCH_LIST: "Brez ujemanj." + SEARCH_RESULT_FOR: "Ujemanja za \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "nazaj na seznam sporočil" + LIST_LOADING: "Nalaganje" + EMPTY_SUBJECT_TEXT: "(Brez zadeve)" + PUT_MESSAGE_HERE: "Spustite sporočilo tu za ogled na seznamu" + TODAY_AT: "danes ob %TIME%" + YESTERDAY_AT: "včeraj ob %TIME%" + SEARCH_PLACEHOLDER: "Iskanje" + NEW_MESSAGE_NOTIFICATION: "Imate %COUNT% novih sporočil!" + QUOTA_SIZE: "Uporabljenih %SIZE% (%PROC%%) od %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Uredi" + BUTTON_BACK: "Nazaj" + BUTTON_CLOSE: "Zapri" + BUTTON_DELETE: "Izbriši" + BUTTON_UNSUBSCRIBE: "Odjava s tega seznama" + BUTTON_ARCHIVE: "Arhiviraj" + BUTTON_SPAM: "Vsiljena pošta" + BUTTON_NOT_SPAM: "Ni vsiljena pošta" + BUTTON_MOVE_TO: "Premakni v" + BUTTON_MORE: "Več" + BUTTON_REPLY: "Odgovori" + BUTTON_REPLY_ALL: "Odgovori vsem" + BUTTON_FORWARD: "Posreduj" + BUTTON_FORWARD_AS_ATTACHMENT: "Posreduj kot prilogo" + BUTTON_EDIT_AS_NEW: "Uredi kot novo" + BUTTON_SHOW_IMAGES: "Prikaži zunanje slike" + BUTTON_NOTIFY_READ_RECEIPT: "Pošiljatelj želi biti obveščen, ko bo pismo prebrano." + BUTTON_IN_NEW_WINDOW: "Ogled v novem oknu" + BUTTON_THREAD_LIST: "Seznam niti" + BUTTON_THREAD_PREV: "Prejšnja" + BUTTON_THREAD_NEXT: "Naslednja" + BUTTON_THREAD_MORE: "Več sporočil" + MENU_HEADERS: "Pokaži glavo sporočila" + MENU_VIEW_ORIGINAL: "Pokaži izvorno" + MENU_DOWNLOAD_ORIGINAL: "Prenesi kot .eml datoteko" + MENU_FILTER_SIMILAR: "Filtriraj sporočila, kot je to" + MENU_PRINT: "Natisni" + EMPTY_SUBJECT_TEXT: "(Brez zadeve)" + LABEL_SUBJECT: "Zadeva" + LABEL_DATE: "Datum" + LABEL_FROM: "Od" + LABEL_FROM_SHORT: "od" + LABEL_TO: "Za" + LABEL_TO_SHORT: "za" + LABEL_CC: "Kp" + LABEL_BCC: "Skp" + LABEL_REPLY_TO: "Odgovor na" + PRINT_LABEL_FROM: "Od" + PRINT_LABEL_TO: "Za" + PRINT_LABEL_CC: "Kp" + PRINT_LABEL_BCC: "Skp" + PRINT_LABEL_REPLY_TO: "Odgovor na" + PRINT_LABEL_DATE: "Datum" + PRINT_LABEL_SUBJECT: "Zadeva" + PRINT_LABEL_ATTACHMENTS: "Priloge" + MESSAGE_LOADING: "Nalaganje" + MESSAGE_VIEW_DESC: "Izberite sporočilo s seznama za ogled." + MESSAGE_VIEW_MOVE_DESC: "Za izbor cilja kliknite na ime mape na levi strani." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Geslo" + PGP_SIGNED_MESSAGE_DESC: "Sporočilo, podpisano z OpenPGP (kliknite za overovitev)" + PGP_ENCRYPTED_MESSAGE_DESC: "Sporočilo, šifrirano z OpenPGP (kliknite za dešifriranje)" + LINK_DOWNLOAD_AS_ZIP: "Prenesi kot .zip datoteko" + LINK_SAVE_TO_OWNCLOUD: "Shrani na ownCloud" + LINK_SAVE_TO_DROPBOX: "Shrani na Dropbox" + READ_RECEIPT: + SUBJECT: "Povratno poročilo (prikazano) - %SUBJECT%" + BODY: | + To je povratno poročilo za sporočilo, ki je bilo poslano na %READ-RECEIPT%. + + Opomba: "To povratno poročilo pomeni le, da je bilo sporočilo prikazano na računalniku prejemnika." + Ni jamstva za prejemnikovo razumevanje vsebine sporočila. + SUGGESTIONS: + SEARCHING_DESC: "Iskanje..." + CONTACTS: + LEGEND_CONTACTS: "Stiki" + SEARCH_INPUT_PLACEHOLDER: "Iskanje" + BUTTON_ADD_CONTACT: "Dodaj stik" + BUTTON_CREATE_CONTACT: "Ustvari" + BUTTON_UPDATE_CONTACT: "Posodobi" + BUTTON_IMPORT: "Uvozi (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Izvozi (vcf, vCard)" + BUTTON_EXPORT_CSV: "Izvozi (csv)" + ERROR_IMPORT_FILE: "Napaka uvoza (neveljaven format datoteke)" + LIST_LOADING: "Nalaganje" + EMPTY_LIST: "Ni stikov" + EMPTY_SEARCH: "Ni ujemajočih stikov" + CLEAR_SEARCH: "Počisti iskalne kriterije" + CONTACT_VIEW_DESC: "Izberite stik s seznama za ogled." + LABEL_DISPLAY_NAME: "Prikazno ime" + LABEL_EMAIL: "E-pošta" + LABEL_PHONE: "Telefon" + LABEL_WEB: "Splet" + LABEL_BIRTHDAY: "Rojstni dan" + LINK_ADD_EMAIL: "Dodaj e-poštni naslov" + LINK_ADD_PHONE: "Dodaj telefon" + LINK_BIRTHDAY: "Rojstni dan" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Vnos prikaznega imena" + PLACEHOLDER_ENTER_LAST_NAME: "Vnos priimka" + PLACEHOLDER_ENTER_FIRST_NAME: "Vnos imena" + PLACEHOLDER_ENTER_NICK_NAME: "Vnos vzdevka" + LABEL_READ_ONLY: "Samo za branje" + LABEL_SHARE: "Deljenje" + ADD_MENU_LABEL: "Dodajanje" + ADD_MENU_NICKNAME: "Vzdevek" + ADD_MENU_NOTES: "Zapiski" + ADD_MENU_EMAIL: "E-pošta" + ADD_MENU_PHONE: "Telefon" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Naslov" + ADD_MENU_BIRTHDAY: "Rojstni dan" + ADD_MENU_TAGS: "Značke" + BUTTON_SHARE_NONE: "Nobenega" + BUTTON_SHARE_ALL: "Vse" + BUTTON_SYNC: "Sinhronizacija (CardDAV)" + COMPOSE: + TITLE_FROM: "Od" + TITLE_TO: "Za" + TITLE_CC: "Kp" + TITLE_BCC: "Skp" + TITLE_REPLY_TO: "Odgovor na" + TITLE_SUBJECT: "Zadeva" + LINK_SHOW_INPUTS: "prikaz vseh polj" + BUTTON_SEND: "Pošlji" + BUTTON_SAVE: "Shrani" + BUTTON_DELETE: "Izbriši" + BUTTON_CANCEL: "Prekliči" + BUTTON_MINIMIZE: "Minimiraj" + SAVED_TIME: "Shranjeno ob %TIME%" + SAVED_ERROR_ON_SEND: "Sporočilo je bilo poslano, a ne shranjeno med poslana sporočila" + DISCARD_UNSAVED_DATA: "Zavržem neshranjene podatke?" + ATTACH_FILES: "Priloži datoteke" + ATTACH_DROP_FILES_DESC: "Spustite datoteke tu" + ATTACH_ITEM_CANCEL: "Prekliči" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% je napisal/-a" + FORWARD_MESSAGE_TOP_TITLE: "-------- Posredovano sporočilo -------" + FORWARD_MESSAGE_TOP_FROM: "Od" + FORWARD_MESSAGE_TOP_TO: "Za" + FORWARD_MESSAGE_TOP_CC: "Kp" + FORWARD_MESSAGE_TOP_SENT: "Poslano" + FORWARD_MESSAGE_TOP_SUBJECT: "Zadeva" + EMPTY_TO_ERROR_DESC: "Navedite vsaj enega/-o prejemnika/-co" + NO_ATTACHMENTS_HERE_DESC: "Ni prilog." + ATTACHMENTS_ERROR_DESC: "Pozor! Priloge niso bile vse naložene." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Priloge še niso bile naložene v celoti." + BUTTON_REQUEST_READ_RECEIPT: "Zahtevaj potrdilo o branju" + BUTTON_MARK_AS_IMPORTANT: "Označi kot pomembno" + BUTTON_OPEN_PGP: "OpenPGP (Navadno besedilo)" + BUTTON_REQUEST_DSN: "Zahtevaj potrdilo o dostavi" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Zapri" + POPUPS_ASK: + BUTTON_YES: "Da" + BUTTON_NO: "Ne" + DESC_WANT_CLOSE_THIS_WINDOW: "Želite zapreti to okno?" + DESC_WANT_DELETE_MESSAGES: "Želite izbrisati sporočilo/-a?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Izberite jezik" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Dodam račun?" + BUTTON_ADD_ACCOUNT: "Dodaj" + TITLE_UPDATE_ACCOUNT: "Posodobim račun?" + BUTTON_UPDATE_ACCOUNT: "Posodobi" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Dodam identiteto?" + TITLE_UPDATE_IDENTITY: "Posodobim identiteto?" + BUTTON_ADD_IDENTITY: "Dodaj" + BUTTON_UPDATE_IDENTITY: "Posodobi" + LABEL_EMAIL: "E-pošta" + LABEL_NAME: "Ime" + LABEL_REPLY_TO: "Odgovor na" + LABEL_SIGNATURE: "Podpis" + LABEL_CC: "Kp" + LABEL_BCC: "Skp" + LABEL_SIGNATURE_INSERT_BEFORE: "Vstavi ta podpis pred citirano besedilo v odgovorih" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Ustvarim mapo?" + LABEL_NAME: "Ime mape" + LABEL_PARENT: "Nadrejena mapa" + BUTTON_CREATE: "Ustvari" + BUTTON_CANCEL: "Prekliči" + BUTTON_CLOSE: "Zapri" + TITLE_CREATING_PROCESS: "Ustvarjam mapo" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Počistim vsa sporočila iz mape?" + BUTTON_CLEAR: "Počisti" + BUTTON_CANCEL: "Prekliči" + BUTTON_CLOSE: "Zapri" + DANGER_DESC_WARNING: "Pozor!" + DANGER_DESC_HTML_1: "To dejanje bo izbrisalo vsa sporočila iz mape %FOLDER% v celoti." + DANGER_DESC_HTML_2: "Tega postopka ne bo mogoče preklicati ali zaustaviti." + TITLE_CLEARING_PROCESS: "Čistim mapo." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Uvoz OpenPGP ključa" + BUTTON_IMPORT_OPEN_PGP_KEY: "Uvozi" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "Ogled OpenPGP ključa" + BUTTON_SELECT: "Izberi" + BUTTON_CLOSE: "Zapri" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Generiraj OpenPGP ključe" + LABEL_EMAIL: "E-pošta" + LABEL_NAME: "Ime" + LABEL_PASSWORD: "Geslo" + LABEL_KEY_BIT_LENGTH: "Dolžina ključa" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generiraj" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP podpis/šifriranje" + LABEL_SIGN: "Podpis" + LABEL_ENCRYPT: "Šifriranje" + LABEL_PASSWORD: "Geslo" + BUTTON_SIGN: "Podpiši" + BUTTON_ENCRYPT: "Šifriraj" + BUTTON_SIGN_AND_ENCRYPT: "Podpiši in šifriraj" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP dešifriranje" + LABEL_KEY: "Zasebni ključ" + LABEL_PASSWORD: "Geslo" + BUTTON_DECRYPT: "Dešifriraj" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "2-stopenjski overitveni preizkus" + LABEL_CODE: "Koda" + BUTTON_TEST: "Preizkusi" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Ustvarim filter?" + TITLE_EDIT_FILTER: "Posodobim filter?" + FILTER_NAME: "Ime" + LEGEND_CONDITIONS: "Pogoji" + LEGEND_ACTIONS: "Dejanja" + BUTTON_DONE: "Končaj" + BUTTON_ADD_CONDITION: "Dodaj pogoj" + SELECT_ACTION_NONE: "Nobeno" + SELECT_ACTION_MOVE_TO: "Premakni v" + SELECT_ACTION_FORWARD_TO: "Posreduj na" + SELECT_ACTION_REJECT: "Zavrni" + SELECT_ACTION_VACATION_MESSAGE: "Sporočilo odsotnosti" + SELECT_ACTION_DISCARD: "Zavrzi" + SELECT_FIELD_FROM: "Od" + SELECT_FIELD_RECIPIENTS: "Prejemniki (Za ali Kp)" + SELECT_FIELD_SUBJECT: "Zadeva" + SELECT_FIELD_HEADER: "Glava" + SELECT_FIELD_SIZE: "Velikost" + SELECT_TYPE_CONTAINS: "Vsebuje" + SELECT_TYPE_NOT_CONTAINS: "Ne vsebuje" + SELECT_TYPE_MATCHES: "Se ujema (* in ? sta podprta)" + SELECT_TYPE_NOT_MATCHES: "Se ne ujema (* in ? sta podprta)" + SELECT_TYPE_REGEXP: "Regularni izraz" + SELECT_TYPE_NOT_REGEXP: "Inverz regularnega izraza" + SELECT_TYPE_EQUAL_TO: "Enako kot" + SELECT_TYPE_NOT_EQUAL_TO: "Različno od" + SELECT_TYPE_OVER: "Nad" + SELECT_TYPE_UNDER: "Pod" + SELECT_MATCH_ANY: "Ustreza katerem koli od sledečih pravil" + SELECT_MATCH_ALL: "Ustreza vsem od sledečih pravil" + MARK_AS_READ_LABEL: "Označi kot prebrano" + REPLY_INTERVAL_LABEL: "Interval odgovorov (dnevi)" + KEEP_LABEL: "Obdrži" + STOP_LABEL: "Ne prenehaj z obdelovanjem pravil" + EMAIL_LABEL: "E-pošta" + VACATION_SUBJECT_LABEL: "Zadeva (izbirno)" + VACATION_MESSAGE_LABEL: "Sporočilo" + VACATION_RECIPIENTS_LABEL: "Prejemniki (ločeni z vejico)" + REJECT_MESSAGE_LABEL: "Zavrni sporočilo" + ALL_INCOMING_MESSAGES_DESC: "Vsa dohodna sporočila" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Izbor sistemskih map" + SELECT_CHOOSE_ONE: "Izberite eno" + SELECT_UNUSE_NAME: "Ne uporabi" + LABEL_SENT: "Poslano" + LABEL_DRAFTS: "Osnutki" + LABEL_SPAM: "Vsiljena pošta" + LABEL_TRASH: "Smeti" + LABEL_ARCHIVE: "Arhiv" + BUTTON_CANCEL: "Prekliči" + BUTTON_CLOSE: "Zapri" + NOTIFICATION_SENT: | + Niste izbrali sistemske mape "Poslano" za shranjevanje poslanih sporočil. + Če ne želite shranjevati poslanih sporočil, izberite možnost "Ne uporabi". + NOTIFICATION_DRAFTS: "Niste izbrali sistemske mape \"Osnutki\" za začasno shranjevanje sporočil med sestavljanjem." + NOTIFICATION_SPAM: | + Niste izbrali sistemske mape "Vsiljena pošta" za shranjevanje vsiljene pošte. + Če želite vsiljeno pošto sproti brisati, izberite možnost "Ne uporabi". + NOTIFICATION_TRASH: | + Niste izbrali sistemske mape "Smetnjak" za izbrisana sporočila pred trajnim brisanjem. + Če jih želite vedno trajno izbrisati, izberite možnost "Ne uporabi". + NOTIFICATION_ARCHIVE: "Niste izbrali sistemske mape \"Arhiv\" za trajno arhiviranje sporočil." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "2-stopenjsko overjanje (TOTP)" + LABEL_ENABLE_TWO_FACTOR: "Omogoči 2-stopenjsko overjanje" + LABEL_TWO_FACTOR_USER: "Uporabnik" + LABEL_TWO_FACTOR_STATUS: "Stanje" + LABEL_TWO_FACTOR_SECRET: "Skrivnost" + LABEL_TWO_FACTOR_BACKUP_CODES: "Pomožne kode" + BUTTON_CREATE: "Ustvari skrivnost" + BUTTON_ACTIVATE: "Aktiviraj" + BUTTON_CLEAR: "Počisti" + BUTTON_LOGOUT: "Odjavi" + BUTTON_DONE: "Končaj" + BUTTON_TEST: "Preizkusi" + LINK_TEST: "preizkus" + BUTTON_SHOW_SECRET: "Pokaži skrivnost" + BUTTON_HIDE_SECRET: "Skrij skrivnost" + TWO_FACTOR_REQUIRE_DESC: "Račun zahteva 2-stopenjsko overjanje." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Nastavljena" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Ni nastavljena" + TWO_FACTOR_SECRET_DESC: > + Uvozite te podatke v Google Authenticator (ali drugo TOTP aplikacijo) z uporabo + spodnje QR kode ali ročnim vnosom kode. + TWO_FACTOR_BACKUP_CODES_DESC: > + Če ne morete prejeti kode preko Google Authenticator (ali druge TOTP aplikacije), + lahko uporabite pomožne kode za vpis. Vsaka pomožna koda je za enkratno uporabo. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Ne morete spremenite te nastavitve brez preizkusa." + TITLES: + LOADING: "Nalaganje" + LOGIN: "Prijava" + MAILBOX: "Nabiralnik" + SETTINGS: "Nastavitve" + COMPOSE: "Sestavi" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Prevelika datoteka" + ERROR_FILE_PARTIALLY_UPLOADED: "Zaradi napake je bila datoteka delno naložena" + ERROR_NO_FILE_UPLOADED: "Nobena datoteka ni bila naložena" + ERROR_MISSING_TEMP_FOLDER: "Manjkajoča začasna mapa" + ERROR_ON_SAVING_FILE: "Neznana napaka pri nalaganju datoteke" + ERROR_FILE_TYPE: "Neveljaven tip datoteke" + ERROR_UNKNOWN: "Neznana napaka pri nalaganju datoteke" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> Navadno besedilo" + TEXT_SWITCHER_RICH_FORMATTING: "Obogateno besedilo" + TEXT_SWITCHER_CONFIRM: "Oblikovanje ter postavitev besedila in slik bosta izgubljena. Želite nadaljevati?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Osebno" + LABEL_GENERAL_NAME: "Splošno" + LABEL_CONTACTS_NAME: "Stiki" + LABEL_FOLDERS_NAME: "Mape" + LABEL_ACCOUNTS_NAME: "Računi" + LABEL_IDENTITY_NAME: "Identiteta" + LABEL_IDENTITIES_NAME: "Identitete" + LABEL_FILTERS_NAME: "Filtri" + LABEL_TEMPLATES_NAME: "Predloge" + LABEL_SECURITY_NAME: "Varnost" + LABEL_SOCIAL_NAME: "Družabno" + LABEL_THEMES_NAME: "Teme" + LABEL_CHANGE_PASSWORD_NAME: "Geslo" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Nazaj" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filtri" + BUTTON_SAVE: "Shrani" + BUTTON_ADD_FILTER: "Dodaj filter" + BUTTON_DELETE: "Izbriši" + BUTTON_RAW_SCRIPT: "Uporabi lastno skriptno datoteko" + SUBNAME_NONE: "Nobeno" + SUBNAME_MOVE_TO: "Premakni v \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Posreduj na \"%EMAIL%\"" + SUBNAME_REJECT: "Zavrni" + SUBNAME_VACATION_MESSAGE: "Sporočilo odsotnosti" + SUBNAME_DISCARD: "Zavrzi" + CAPABILITY_LABEL: "Zmožnosti" + LOADING_PROCESS: "Posodabljanje seznama filtrov" + DELETING_ASK: "Ste prepričani?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Spremembe morajo biti shranjene na strežnik." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identiteta" + LABEL_DISPLAY_NAME: "Ime" + LABEL_REPLY_TO: "Odgovor na" + LABEL_SIGNATURE: "Podpis" + LABEL_ADD_SIGNATURE_TO_ALL: "Dodaj podpis vsem odhodnim sporočilom" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Varnost" + LABEL_CONFIGURE_TWO_FACTOR: "Nastavljanje 2-stopenjskega overjanja" + LABEL_AUTOLOGOUT: "Samodejna odjava" + AUTOLOGIN_NEVER_OPTION_NAME: "Nikoli" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minut" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% ur" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Splošno" + LABEL_LANGUAGE: "Jezik" + LABEL_IDENTITY: "Identiteta" + LABEL_LAYOUT: "Postavitev" + LABEL_LAYOUT_NO_SPLIT: "Brez razdelitve" + LABEL_LAYOUT_VERTICAL_SPLIT: "Navpično razdeljeno" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Vodoravno razdeljeno" + LABEL_EDITOR: "Privzeta vrsta besedila" + LABEL_EDITOR_HTML: "HTML" + LABEL_EDITOR_PLAIN: "Navadno besedilo" + LABEL_EDITOR_HTML_FORCED: "HTML (obvezno)" + LABEL_EDITOR_PLAIN_FORCED: "Navadno besedilo (obvezno)" + LABEL_ANIMATION: "Animacije vmesnika" + LABEL_ANIMATION_FULL: "Vse" + LABEL_ANIMATION_NORMAL: "Normalno" + LABEL_ANIMATION_NONE: "Nobena" + LABEL_VIEW_OPTIONS: "Možnosti ogleda" + LABEL_USE_PREVIEW_PANE: "Uporabi polje za predogled" + LABEL_USE_CHECKBOXES_IN_LIST: "Na seznamu pokaži kvadratke za izbor" + LABEL_USE_THREADS: "Uporabi niti" + LABEL_REPLY_SAME_FOLDER: "Shrani odgovore v mapo sporočila, na katerega se odgovarja" + LABEL_SHOW_IMAGES: "Vedno prikaži zunanje slike v telesu sporočila" + LABEL_SHOW_ANIMATION: "Prikazna animacija" + LABEL_MESSAGE_PER_PAGE: "Sporočil na strani" + LABEL_NOTIFICATIONS: "Obvestila" + LABEL_SOUND_NOTIFICATION: "Zvočno obvestilo" + LABEL_CHROME_NOTIFICATION_DESC: "Prikaži obvestila ob novih sporočilih" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Zavrnil brskalnik)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Stiki" + LABEL_CONTACTS_AUTOSAVE: "Samodejno dodaj prejemnike v imenik" + LEGEND_CONTACTS_SYNC: "Oddaljena sinhronizacija (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Omogoči oddaljeno sinhronizacijo" + LABEL_CONTACTS_SYNC_SERVER: "Strežnik" + LABEL_CONTACTS_SYNC_AB_URL: "URL imenika" + LABEL_CONTACTS_SYNC_USER: "Uporabnik" + LABEL_CONTACTS_SYNC_PASSWORD: "Geslo" + SETTINGS_THEMES: + LEGEND_THEMES: "Teme" + LEGEND_THEMES_CUSTOM: "Prilagojena konfiguracija teme" + LABEL_CUSTOM_TYPE: "Tip" + LABEL_CUSTOM_TYPE_LIGHT: "Svetla" + LABEL_CUSTOM_TYPE_DARK: "Temna" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Ozadje" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Naloži sliko ozadja (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Prevelika datoteka" + ERROR_FILE_TYPE_ERROR: "Neveljaven tip datoteke (samo JPG in PNG)" + ERROR_UNKNOWN: "Neznana napaka pri nalaganju datoteke" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Poveži Google" + BUTTON_GOOGLE_DISCONNECT: "Odklopi Google" + MAIN_GOOGLE_DESC: "Ko omogočite prijavo z Google računom, se lahko prijavite v ta račun z Google gumbom na prijavnem zaslonu." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Poveži Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Odklopi Facebook" + MAIN_FACEBOOK_DESC: "Ko omogočite prijavo s Facebook računom, se lahko prijavite v ta račun s Facebook gumbom na prijavnem zaslonu." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Poveži Twitter" + BUTTON_TWITTER_DISCONNECT: "Odklopi Twitter" + MAIN_TWITTER_DESC: "Ko omogočite prijavo s Twitter računom, se lahko prijavite v ta račun s Twitter gumbom na prijavnem zaslonu." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Seznam map" + BUTTON_CREATE: "Ustvari mapo" + BUTTON_SYSTEM: "Sistemske mape" + BUTTON_DELETE: "Izbriši" + BUTTON_SUBSCRIBE: "Spremljaj" + BUTTON_UNSUBSCRIBE: "Ne spremljaj" + LOADING_PROCESS: "Posodabljanje seznama map" + CREATING_PROCESS: "Ustvarjanje mape" + DELETING_PROCESS: "Brisanje mape" + RENAMING_PROCESS: "Preimenovanje mape" + DELETING_ASK: "Ste prepričani?" + TO_MANY_FOLDERS_DESC_1: "Imate preveč map!" + TO_MANY_FOLDERS_DESC_2: "Prikazanih je le del, da se izognemo tehničnim težavam." + HELP_DELETE_FOLDER: "Izbriši mapo" + HELP_SHOW_HIDE_FOLDER: "Prikaži/skrij mapo" + HELP_CHECK_FOR_NEW_MESSAGES: "Preverjaj/ne preverjaj za nova sporočila" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Računi" + LEGEND_IDENTITIES: "Identitete" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Računi in identitete" + BUTTON_ADD_ACCOUNT: "Dodaj račun" + BUTTON_ADD_IDENTITY: "Dodaj identiteto" + BUTTON_DELETE: "Izbriši" + LOADING_PROCESS: "Posodabljanje..." + DELETING_ASK: "Ste prepričani?" + DEFAULT_IDENTITY_LABEL: "privzeto" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identiteta" + LEGEND_IDENTITIES: "Dodatne identitete" + LABEL_DEFAULT: "Privzeto" + LABEL_DISPLAY_NAME: "Ime" + LABEL_REPLY_TO: "Odgovor na" + LABEL_SIGNATURE: "Podpis" + LABEL_ADD_SIGNATURE_TO_ALL: "Dodaj podpis vsem odhodnim sporočilom" + BUTTON_ADD_IDENTITY: "Dodaj identiteto" + BUTTON_DELETE: "Izbriši" + LOADING_PROCESS: "Posodabljanje seznama identitet" + DELETING_ASK: "Ste prepričani?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Sprememba gesla" + LABEL_CURRENT_PASSWORD: "Trenutno geslo" + LABEL_NEW_PASSWORD: "Novo geslo" + LABEL_REPEAT_PASSWORD: "Potrditev novega gesla" + BUTTON_UPDATE_PASSWORD: "Nastavi novo geslo" + ERROR_PASSWORD_MISMATCH: "Gesli se ne ujemata, poskusite znova" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Uvozi OpenPGP ključ" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generiraj OpenPGP ključe" + TITLE_PRIVATE: "Zasebni" + TITLE_PUBLIC: "Javni" + DELETING_ASK: "Ste prepričani?" + GENERATE_ONLY_HTTPS: "Samo HTTPS" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Tipkovne bližnjice" + TAB_MAILBOX: "Nabiralnik" + TAB_MESSAGE_LIST: "Seznam sporočil" + TAB_MESSAGE_VIEW: "Pogled sporočil" + TAB_COMPOSE: "Sestavi" + LABEL_OPEN_USER_DROPDOWN: "Prikaz seznama uporabnikov" + LABEL_REPLY: "Odgovori" + LABEL_REPLY_ALL: "Odgovori vsem" + LABEL_FORWARD: "Posreduj" + LABEL_FORWARD_MULTIPLY: "Posreduj kot prilogo/-e" + LABEL_HELP: "Pomoč" + LABEL_CHECK_ALL: "Izberi vsa sporočila" + LABEL_ARCHIVE: "Arhiv" + LABEL_DELETE: "Izbriši" + LABEL_OPEN_THREAD: "Odpri izbrano nit" + LABEL_MOVE: "Premakni" + LABEL_READ: "Označi kot prebrano" + LABEL_UNREAD: "Označi kot neprebrano" + LABEL_IMPORTANT: "Pomembno, dodaj zvezdico" + LABEL_SEARCH: "Iskanje" + LABEL_CANCEL_SEARCH: "Preklic iskanja" + LABEL_FULLSCREEN_ENTER: "Celozaslonsko (polje za predogled)" + LABEL_VIEW_MESSAGE_ENTER: "Ogled sporočila (brez polja za predogled)" + LABEL_SWITCH_TO_MESSAGE: "Osredotoči na izbrano sporočilo" + LABEL_SWITCH_TO_FOLDER_LIST: "Osredotoči na seznam map" + LABEL_FULLSCREEN_TOGGLE: "Preklopi celozaslonski način" + LABEL_BLOCKQUOTES_TOGGLE: "Preklopi bločne citate v sporočilu" + LABEL_THREAD_NEXT: "Naslednje sporočilo v niti" + LABEL_THREAD_PREV: "Prejšnje sporočilo v niti" + LABEL_PRINT: "Natisni" + LABEL_EXIT_FULLSCREEN: "Izhod iz celozaslonskega načina" + LABEL_CLOSE_MESSAGE: "Zapri sporočilo (brez polja za predogled)" + LABEL_SWITCH_TO_LIST: "Osredotoči na seznam sporočil" + LABEL_OPEN_COMPOSE_POPUP: "Odpri okno za sestavljanje" + LABEL_MINIMIZE_COMPOSE_POPUP: "Skrij okno za sestavljanje" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Odpri izbor identitet" + LABEL_SAVE_MESSAGE: "Shrani sporočilo" + LABEL_SEND_MESSAGE: "Pošlji sporočilo" + LABEL_CLOSE_COMPOSE: "Zapri sestavljanje" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "Ni najdenih javnih ključev" + NO_PUBLIC_KEYS_FOUND_FOR: "Ni najdenih javnih ključev za naslov \"%EMAIL%\"" + NO_PRIVATE_KEY_FOUND: "Ni najdenega zasebnega ključa" + NO_PRIVATE_KEY_FOUND_FOR: "Ni najdenega zasebnega ključa za naslov \"%EMAIL%\"" + ADD_A_PUBLICK_KEY: "Dodaj javni ključ" + SELECT_A_PRIVATE_KEY: "Izberite zasebni ključ" + UNVERIFIRED_SIGNATURE: "Neoverjen podpis" + DECRYPTION_ERROR: "OpenPGP napaka dešifriranja" + GOOD_SIGNATURE: "Dober podpis od %USER%" + PGP_ERROR: "OpenPGP napaka: %ERROR%" + SPECIFY_FROM_EMAIL: "Določite naslov pošiljatelja/-ice" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Navedite vsaj enega/-o prejemnika/-co" + NOTIFICATIONS: + INVALID_TOKEN: "Neveljaven žeton" + AUTH_ERROR: "Spodletelo overjanje" + ACCESS_ERROR: "Napaka dostopa" + CONNECTION_ERROR: "Ni mogoče vzpostaviti povezave s strežnikom" + CAPTCHA_ERROR: "Napačen CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Ta družabni ID še ni določen nobenemu e-poštnemu računu. Prijavite se z podatki + za e-pošto in omogočite to v nastavitvah računa. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Ta družabni ID še ni določen nobenemu e-poštnemu računu. Prijavite se z podatki + za e-pošto in omogočite to v nastavitvah računa. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Ta družabni ID še ni določen nobenemu e-poštnemu računu. Prijavite se z podatki + za e-pošto in omogočite to v nastavitvah računa. + DOMAIN_NOT_ALLOWED: "Domena ni dovoljena" + ACCOUNT_NOT_ALLOWED: "Račun ni dovoljen" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Obvezno 2-stopenjsko overjanje" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Napaka 2-stopenjskega overjanja" + COULD_NOT_SAVE_NEW_PASSWORD: "Ni bilo mogoče shraniti novega gesla" + CURRENT_PASSWORD_INCORRECT: "Napačno trenutno geslo" + NEW_PASSWORD_SHORT: "Prekratko geslo" + NEW_PASSWORD_WEAK: "Preveč enostavno geslo" + NEW_PASSWORD_FORBIDDENT: "Geslo vsebuje nedovoljene znake" + CONTACTS_SYNC_ERROR: "Napaka sinhronizacije stikov" + CANT_GET_MESSAGE_LIST: "Ni mogoče pridobiti seznama sporočil" + CANT_GET_MESSAGE: "Ni mogoče pridobiti sporočila" + CANT_DELETE_MESSAGE: "Ni mogoče izbrisati sporočila" + CANT_MOVE_MESSAGE: "Ni mogoče premakniti sporočila" + CANT_SAVE_MESSAGE: "Ni mogoče shraniti sporočila" + CANT_SEND_MESSAGE: "Ni mogoče poslati sporočila" + INVALID_RECIPIENTS: "Neveljavni prejemniki" + CANT_SAVE_FILTERS: "Ni mogoče shraniti filtrov" + CANT_GET_FILTERS: "Ni mogoče pridobiti filtrov" + FILTERS_ARE_NOT_CORRECT: "Filtri so nepravilni" + CANT_CREATE_FOLDER: "Ni mogoče ustvariti mape" + CANT_RENAME_FOLDER: "Ni mogoče preimenovati mape" + CANT_DELETE_FOLDER: "Ni mogoče izbrisati mape" + CANT_DELETE_NON_EMPTY_FOLDER: "Ni mogoče izbrisati neprazne mape" + CANT_SUBSCRIBE_FOLDER: "Ni mogoče slediti mapi" + CANT_UNSUBSCRIBE_FOLDER: "Ni mogoče prenehati slediti mapi" + CANT_SAVE_SETTINGS: "Ni mogoče shraniti nastavitev" + CANT_SAVE_PLUGIN_SETTINGS: "Ni mogoče shraniti nastavitev" + DOMAIN_ALREADY_EXISTS: "Domena že obstaja" + CANT_INSTALL_PACKAGE: "Neuspešna namestitev paketa" + CANT_DELETE_PACKAGE: "Neuspešno odstranjevanje paketa" + INVALID_PLUGIN_PACKAGE: "Neveljaven paket vtičnika" + UNSUPPORTED_PLUGIN_PACKAGE: "Nepodprt paket vtičnika" + LICENSING_SERVER_IS_UNAVAILABLE: "Naročniški strežnik ni dosegljiv" + LICENSING_DOMAIN_EXPIRED: "Naročnina na to domeno je potekla." + LICENSING_DOMAIN_BANNED: "Naročnina na to domeno ni dovoljena" + DEMO_SEND_MESSAGE_ERROR: "Iz varnostnih razlogov ta račun ne sme pošiljati pošte na zunanje e-naslove!" + DEMO_ACCOUNT_ERROR: "Iz varnostnih razlogov ta račun ne sme izvršiti tega dejanja!" + ACCOUNT_ALREADY_EXISTS: "Račun že obstaja" + ACCOUNT_DOES_NOT_EXIST: "Račun ne obstaja" + MAIL_SERVER_ERROR: "Napaka pri dostopu do poštnega strežnika" + INVALID_INPUT_ARGUMENT: "Neveljaven vhodni argument" + UNKNOWN_ERROR: "Neznana napaka" + STATIC: + BACK_LINK: "Ponovno naloži" + DOMAIN_LIST_DESC: "Seznam domen, na katere je dovoljen dostop" + PHP_EXSTENSIONS_ERROR_DESC: "Potrebne PHP razširitve niso omogočene v vaši PHP nastavitveni datoteki!" + PHP_VERSION_ERROR_DESC: "Vaša PHP verzija (%VERSION%) je manjša kot potrebna 5.3.0!" + NO_SCRIPT_TITLE: "Ta aplikacija potrebuje omogočen JavaScript." + NO_SCRIPT_DESC: | + Brskalnik nima podpore za JavaScript. + Omogočite JavaScript v brskalniku in poskusite znova. + NO_COOKIE_TITLE: "Ta aplikacije potrebuje omogočene piškotke." + NO_COOKIE_DESC: | + Brskalnik nima omogočenih piškotkov. + Omogočite piškotke v brskalniku in poskusite znova. + BAD_BROWSER_TITLE: "Brskalnik je zastarel." + BAD_BROWSER_DESC: | + Za uporabo vseh funkcij te aplikacije + prenesite in namestite enega od teh brskalnikov: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sv_SE.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sv_SE.yml new file mode 100755 index 00000000..28ef04d1 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sv_SE.yml @@ -0,0 +1,713 @@ +sv_SE: + LOGIN: + LABEL_EMAIL: "Epost" + LABEL_LOGIN: "Användarnamn" + LABEL_PASSWORD: "Lösenord" + LABEL_SIGN_ME: "Kom ihåg mig" + LABEL_VERIFICATION_CODE: "Verifikationskod" + LABEL_DONT_ASK_VERIFICATION_CODE: "Fråga inte efter koden på 2 veckor" + BUTTON_SIGN_IN: "Logga in" + TITLE_SIGN_IN_GOOGLE: "Logga in med Google" + TITLE_SIGN_IN_FACEBOOK: "Logga in med Facebook" + TITLE_SIGN_IN_TWITTER: "Logga in med Twitter" + LABEL_FORGOT_PASSWORD: "Glömt lösenord" + LABEL_REGISTRATION: "Registrera" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Lägg till konto" + BUTTON_SETTINGS: "Inställningar" + BUTTON_HELP: "Hjälp" + BUTTON_LOGOUT: "Logga ut" + MOBILE: + BUTTON_MOBILE_VERSION: "Mobilversion" + BUTTON_DESKTOP_VERSION: "Datorversion" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Sök" + TITLE_ADV: "Avancerad sök" + LABEL_ADV_FROM: "Från" + LABEL_ADV_TO: "Till" + LABEL_ADV_SUBJECT: "Ämne" + LABEL_ADV_TEXT: "Text" + LABEL_ADV_HAS_ATTACHMENT: "Har bilaga" + LABEL_ADV_HAS_ATTACHMENTS: "Har bilagor" + LABEL_ADV_FLAGGED: "Flaggad" + LABEL_ADV_UNSEEN: "Oläst" + LABEL_ADV_DATE: "Datum" + LABEL_ADV_DATE_ALL: "Alla" + LABEL_ADV_DATE_3_DAYS: "Upp till 3 dagar gammalt" + LABEL_ADV_DATE_7_DAYS: "Upp till 1 vecka gammalt" + LABEL_ADV_DATE_MONTH: "Upp till 1 månad gammalt" + LABEL_ADV_DATE_3_MONTHS: "Upp till 3 månader gammalt" + LABEL_ADV_DATE_6_MONTHS: "Upp till 6 månader gammalt" + LABEL_ADV_DATE_YEAR: "Upp till 1 år gammalt" + BUTTON_ADV_SEARCH: "Sök" + PREVIEW_POPUP: + FULLSCREEN: "Växla fullskärmsläge" + ZOOM: "Zooma in/ut" + CLOSE: "Stäng (Esc)" + LOADING: "Laddar..." + GALLERY_PREV: "Föregående (Vänster pil knapp)" + GALLERY_NEXT: "Nästa (Höger pil knapp)" + GALLERY_COUNTER: "%curr% av %total%" + IMAGE_ERROR: "Bilden kunde inte laddas." + AJAX_ERROR: "Innehållet kunde inte laddas." + FOLDER_LIST: + BUTTON_COMPOSE: "Skriv nytt" + BUTTON_CONTACTS: "Kontakter" + BUTTON_NEW_MESSAGE: "Nytt meddelande" + INBOX_NAME: "Inkorg" + SENT_NAME: "Skickat" + DRAFTS_NAME: "Utkast" + SPAM_NAME: "Spam" + TRASH_NAME: "Papperskorg" + ARCHIVE_NAME: "Arkiv" + QUOTA: + TITLE: "Kvotanvändning" + MESSAGE_LIST: + BUTTON_RELOAD: "Ladda meddelandelista" + BUTTON_MOVE_TO: "Flytta till" + BUTTON_DELETE: "Ta bort" + BUTTON_ARCHIVE: "Arkivera" + BUTTON_SPAM: "Spam" + BUTTON_NOT_SPAM: "Inte spam" + BUTTON_EMPTY_FOLDER: "Rensa mapp" + BUTTON_MULTY_FORWARD: "Vidarebefordra som bilaga(or)" + BUTTON_DELETE_WITHOUT_MOVE: "Ta bort permanent" + BUTTON_MORE: "Mera" + MENU_SET_SEEN: "Markera som läst" + MENU_SET_ALL_SEEN: "Markera alla som lästa" + MENU_UNSET_SEEN: "Markera som oläst" + MENU_SET_FLAG: "Flagga" + MENU_UNSET_FLAG: "Avflagga" + MENU_SELECT_ALL: "Alla" + MENU_SELECT_NONE: "Ingen" + MENU_SELECT_INVERT: "Vänd" + MENU_SELECT_UNSEEN: "Oläst" + MENU_SELECT_SEEN: "Läst" + MENU_SELECT_FLAGGED: "Flaggad" + MENU_SELECT_UNFLAGGED: "Avflaggad" + EMPTY_LIST: "Tom lista" + EMPTY_SEARCH_LIST: "Inga meddelanden matchar din sökning." + SEARCH_RESULT_FOR: "Sök resultat för \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "Tillbaka till meddelanden" + LIST_LOADING: "Laddar" + EMPTY_SUBJECT_TEXT: "(Inget ämne)" + PUT_MESSAGE_HERE: "Släpp meddelandet för att se det i listan" + TODAY_AT: "idag kl %TIME%" + YESTERDAY_AT: "igår kl %TIME%" + SEARCH_PLACEHOLDER: "Sök" + NEW_MESSAGE_NOTIFICATION: "Du har %COUNT% nya meddelanden!" + QUOTA_SIZE: "Använder %SIZE% (%PROC%%) av dina %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Redigera" + BUTTON_BACK: "Backa" + BUTTON_CLOSE: "Stäng" + BUTTON_DELETE: "Ta bort" + BUTTON_UNSUBSCRIBE: "Avprenumerera från denna lista" + BUTTON_ARCHIVE: "Arkivera" + BUTTON_SPAM: "Spam" + BUTTON_NOT_SPAM: "Inte spam" + BUTTON_MOVE_TO: "Flytta till" + BUTTON_MORE: "Mera" + BUTTON_REPLY: "Svara" + BUTTON_REPLY_ALL: "Svara alla" + BUTTON_FORWARD: "Vidarebefordra" + BUTTON_FORWARD_AS_ATTACHMENT: "Vidarebefordra som bilaga" + BUTTON_EDIT_AS_NEW: "Redigera som nytt" + BUTTON_SHOW_IMAGES: "Visa yttre bilder" + BUTTON_NOTIFY_READ_RECEIPT: "Avsändaren vill ha kvitto när du läst detta meddelande." + BUTTON_IN_NEW_WINDOW: "Visa i separat fönster" + BUTTON_THREAD_LIST: "trådremsa" + BUTTON_THREAD_PREV: "Föregående" + BUTTON_THREAD_NEXT: "Nästa" + BUTTON_THREAD_MORE: "Mer meddelanden" + MENU_HEADERS: "Visa meddelanderubriker" + MENU_VIEW_ORIGINAL: "Visa källa" + MENU_DOWNLOAD_ORIGINAL: "Ladda ner som .eml fil" + MENU_FILTER_SIMILAR: "Filtrera meddelanden som detta" + MENU_PRINT: "Skriv ut" + EMPTY_SUBJECT_TEXT: "(Inget ämne)" + LABEL_SUBJECT: "Ämne" + LABEL_DATE: "Datum" + LABEL_FROM: "Från" + LABEL_FROM_SHORT: "från" + LABEL_TO: "Till" + LABEL_TO_SHORT: "till" + LABEL_CC: "CC" + LABEL_BCC: "BCC" + LABEL_REPLY_TO: "Svara-till" + PRINT_LABEL_FROM: "Från" + PRINT_LABEL_TO: "Till" + PRINT_LABEL_CC: "CC" + PRINT_LABEL_BCC: "BCC" + PRINT_LABEL_REPLY_TO: "Svara-till" + PRINT_LABEL_DATE: "Datum" + PRINT_LABEL_SUBJECT: "Ämne" + PRINT_LABEL_ATTACHMENTS: "Bilagor" + MESSAGE_LOADING: "Laddar" + MESSAGE_VIEW_DESC: "Välj meddelande i listan att visa här." + MESSAGE_VIEW_MOVE_DESC: "Klicka på mapp till vänster för att välja mål mapp." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Lösenord" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP-signerat meddelande (klicka för att verifiera)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP-krypterat meddelande (klicka för att dekryptera)" + LINK_DOWNLOAD_AS_ZIP: "Ladda ner som ZIP-fil" + LINK_SAVE_TO_OWNCLOUD: "Spara till ownCloud" + LINK_SAVE_TO_CLOUD: "Spara till Molnet" + LINK_SAVE_TO_DROPBOX: "Spara i Dropbox" + READ_RECEIPT: + SUBJECT: "Mottagar kvitto (visad) - %SUBJECT%" + BODY: | + Detta är ett kvitto på det meddelande du skickat till %READ-RECEIPT%. + + Notera: Detta kvitto säger bara att mottagaren öppnat meddelandet. + Det finns ingen garanti att mottagare vare sig läst eller förstått innehållet. + SUGGESTIONS: + SEARCHING_DESC: "Söker..." + CONTACTS: + LEGEND_CONTACTS: "Kontakter" + SEARCH_INPUT_PLACEHOLDER: "Sök" + BUTTON_ADD_CONTACT: "Lägg till" + BUTTON_CREATE_CONTACT: "Ny" + BUTTON_UPDATE_CONTACT: "Uppdatera" + BUTTON_IMPORT: "Importera (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Exportera (vcf, vCard)" + BUTTON_EXPORT_CSV: "Exportera (csv)" + ERROR_IMPORT_FILE: "Importfel (ogiltigt filformat)" + LIST_LOADING: "Laddar" + EMPTY_LIST: "Inga kontakter här" + EMPTY_SEARCH: "Inga kontakter funna" + CLEAR_SEARCH: "Nollställ sök" + CONTACT_VIEW_DESC: "Välj kontakt i listan för att visa här." + LABEL_DISPLAY_NAME: "Visnings namn" + LABEL_EMAIL: "Epost" + LABEL_PHONE: "Telefon" + LABEL_WEB: "Web" + LABEL_BIRTHDAY: "Födelsedag" + LINK_ADD_EMAIL: "Lägg till epostadress" + LINK_ADD_PHONE: "Lägg till telefonnummer" + LINK_BIRTHDAY: "Födelsedag" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Ange visningsnamn" + PLACEHOLDER_ENTER_LAST_NAME: "Ange efternamn" + PLACEHOLDER_ENTER_FIRST_NAME: "Ange förnamn" + PLACEHOLDER_ENTER_NICK_NAME: "Ange smeknamn" + LABEL_READ_ONLY: "Endast läs" + LABEL_SHARE: "Dela" + ADD_MENU_LABEL: "Lägg till..." + ADD_MENU_NICKNAME: "Smeknamn" + ADD_MENU_NOTES: "Anteckning" + ADD_MENU_EMAIL: "Epost" + ADD_MENU_PHONE: "Telefon" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Adress" + ADD_MENU_BIRTHDAY: "Födelsedag" + ADD_MENU_TAGS: "Taggar" + BUTTON_SHARE_NONE: "Ingen" + BUTTON_SHARE_ALL: "Alla" + BUTTON_SYNC: "Synkronisering (CardDAV)" + COMPOSE: + TITLE_FROM: "Från" + TITLE_TO: "Till" + TITLE_CC: "CC" + TITLE_BCC: "BCC" + TITLE_REPLY_TO: "Svara-till" + TITLE_SUBJECT: "Ämne" + LINK_SHOW_INPUTS: "visa alla fält" + BUTTON_SEND: "Skicka" + BUTTON_SAVE: "Spara" + BUTTON_DELETE: "Ta bort" + BUTTON_CANCEL: "Avbryt" + BUTTON_MINIMIZE: "Minimera" + SAVED_TIME: "Sparat kl %TIME%" + SAVED_ERROR_ON_SEND: "Meddelandet skickat men inte sparat i skickat-mappen" + DISCARD_UNSAVED_DATA: "Kasta osparade data?" + ATTACH_FILES: "Bifoga filer" + ATTACH_DROP_FILES_DESC: "Släpp filer här" + ATTACH_ITEM_CANCEL: "Avbryt" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% skrev" + FORWARD_MESSAGE_TOP_TITLE: "-------- Vidarebefordrat -------" + FORWARD_MESSAGE_TOP_FROM: "Från" + FORWARD_MESSAGE_TOP_TO: "Till" + FORWARD_MESSAGE_TOP_CC: "CC" + FORWARD_MESSAGE_TOP_SENT: "Skickat" + FORWARD_MESSAGE_TOP_SUBJECT: "Ämne" + EMPTY_TO_ERROR_DESC: "Ange minst en mottagare" + NO_ATTACHMENTS_HERE_DESC: "Inga filer är ännu valda" + ATTACHMENTS_ERROR_DESC: "Varning! Inte alla bilagor har överförts." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Alla bilagor är inte uppladddade än" + BUTTON_REQUEST_READ_RECEIPT: "Begär mottagningskvitto" + BUTTON_MARK_AS_IMPORTANT: "Markera som viktigt" + BUTTON_OPEN_PGP: "OpenPGP (Endast enkel text)" + BUTTON_REQUEST_DSN: "Begär ett leveranskvitto" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Stäng" + POPUPS_ASK: + BUTTON_YES: "Ja" + BUTTON_NO: "Nej" + DESC_WANT_CLOSE_THIS_WINDOW: "Vill du stänga detta fönster?" + DESC_WANT_DELETE_MESSAGES: "Är du säker att du vill ta bort meddelandet?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Välj språk" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Lägg till konto?" + BUTTON_ADD_ACCOUNT: "Lägg till" + TITLE_UPDATE_ACCOUNT: "Uppdatera konto?" + BUTTON_UPDATE_ACCOUNT: "Uppdatera" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Lägg till identitet" + TITLE_UPDATE_IDENTITY: "Uppdatera identitet" + BUTTON_ADD_IDENTITY: "Lägg till" + BUTTON_UPDATE_IDENTITY: "Uppdatera" + LABEL_EMAIL: "Epost" + LABEL_NAME: "Namn" + LABEL_REPLY_TO: "Svara-till" + LABEL_SIGNATURE: "Signatur" + LABEL_CC: "Cc" + LABEL_BCC: "Bcc" + LABEL_SIGNATURE_INSERT_BEFORE: "Sätt denna signatur före citerad text i svar" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Skapa mapp?" + LABEL_NAME: "Mappnamn" + LABEL_PARENT: "Överliggande mapp" + BUTTON_CREATE: "Skapa" + BUTTON_CANCEL: "Avbryt" + BUTTON_CLOSE: "Stäng" + TITLE_CREATING_PROCESS: "Skapar mapp" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Rensa alla meddelanden i mappen?" + BUTTON_CLEAR: "Rensa" + BUTTON_CANCEL: "Avbryt" + BUTTON_CLOSE: "Stäng" + DANGER_DESC_WARNING: "Varning!" + DANGER_DESC_HTML_1: "Denna åtgärd kommer att rensa alla mail i %FOLDER%." + DANGER_DESC_HTML_2: "När detta är startat kan det inte avbrytas." + TITLE_CLEARING_PROCESS: "Rensar mappen..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Import av OpenPGP-nyckel" + BUTTON_IMPORT_OPEN_PGP_KEY: "Importera" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "Visa OpenPGP-nyckel" + BUTTON_SELECT: "Välj" + BUTTON_CLOSE: "Stäng" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Skapa OpenPGP-nycklar" + LABEL_EMAIL: "Epost" + LABEL_NAME: "Namn" + LABEL_PASSWORD: "Lösenord" + LABEL_KEY_BIT_LENGTH: "Nyckellängd" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Skapa" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP signera/kryptera" + LABEL_SIGN: "Signera" + LABEL_ENCRYPT: "Kryptera" + LABEL_PASSWORD: "Lösenord" + BUTTON_SIGN: "Singera" + BUTTON_ENCRYPT: "Kryptera" + BUTTON_SIGN_AND_ENCRYPT: "Signera och kryptera" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP avkryptera" + LABEL_KEY: "Privat Key" + LABEL_PASSWORD: "Lösenord" + BUTTON_DECRYPT: "Avkryptera" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "Tvåstegsverifieringstest" + LABEL_CODE: "Kod" + BUTTON_TEST: "Test" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Skapa ett filter?" + TITLE_EDIT_FILTER: "Uppdatera filter?" + FILTER_NAME: "Namn" + LEGEND_CONDITIONS: "Villkor" + LEGEND_ACTIONS: "Handlingar" + BUTTON_DONE: "Klar" + BUTTON_ADD_CONDITION: "Lägg till ett villkor" + SELECT_ACTION_NONE: "Inget" + SELECT_ACTION_MOVE_TO: "Flytta till" + SELECT_ACTION_FORWARD_TO: "Vidarebefordra till" + SELECT_ACTION_REJECT: "Avvisa" + SELECT_ACTION_VACATION_MESSAGE: "Autosvar" + SELECT_ACTION_DISCARD: "Ta bort" + SELECT_FIELD_FROM: "Från" + SELECT_FIELD_RECIPIENTS: "Mottagare (Till eller CC)" + SELECT_FIELD_SUBJECT: "Rubrik" + SELECT_FIELD_HEADER: "Rubrik" + SELECT_FIELD_SIZE: "Storlek" + SELECT_TYPE_CONTAINS: "innehåller" + SELECT_TYPE_NOT_CONTAINS: "innehåller inte" + SELECT_TYPE_MATCHES: "Matchar (* och ? stöds)" + SELECT_TYPE_NOT_MATCHES: "Matchar inte (* och ? stöds)" + SELECT_TYPE_REGEXP: "regexp" + SELECT_TYPE_NOT_REGEXP: "inte regexp" + SELECT_TYPE_EQUAL_TO: "lika med" + SELECT_TYPE_NOT_EQUAL_TO: "inte lika med" + SELECT_TYPE_OVER: "över" + SELECT_TYPE_UNDER: "under" + SELECT_MATCH_ANY: "Matcha någon av följande regler" + SELECT_MATCH_ALL: "Matcha samtliga av följande regler" + MARK_AS_READ_LABEL: "Markera som läst" + REPLY_INTERVAL_LABEL: "Svarsintervall (dagar)" + KEEP_LABEL: "Behåll" + STOP_LABEL: "Sluta inte bearbeta andra regler" + EMAIL_LABEL: "Epost" + VACATION_SUBJECT_LABEL: "Ämne (valfritt)" + VACATION_MESSAGE_LABEL: "Meddelande" + VACATION_RECIPIENTS_LABEL: "Mottagare (kommaseparerade)" + REJECT_MESSAGE_LABEL: "meddelande" + ALL_INCOMING_MESSAGES_DESC: "Alla inkommande meddelanden" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Välj systemmappar" + SELECT_CHOOSE_ONE: "Välj en" + SELECT_UNUSE_NAME: "Använd inte" + LABEL_SENT: "Skickat" + LABEL_DRAFTS: "Utkast" + LABEL_SPAM: "Spam" + LABEL_TRASH: "Papperskorg" + LABEL_ARCHIVE: "Arkiv" + BUTTON_CANCEL: "Avbryt" + BUTTON_CLOSE: "Stäng" + NOTIFICATION_SENT: | + Du har inte valt "Skickat" systemmapp, där skickade meddelande ska sparas. + Om du inte vill spara skickade meddelanden, välj då "Använd inte" valet. + NOTIFICATION_DRAFTS: "Du har inte valt \"Drafts\" systemmapp, där meddelanden sparas medan det skrivs." + NOTIFICATION_SPAM: | + Du har inte valt "Spam"-systemmapp, där spam-meddelanden ska sparas. + Om du vill ta bort meddelanden permanent, välj då "Använd inte"-valet. + NOTIFICATION_TRASH: | + Du har inte valt "Papperskorg" systemmapp, där borttagna meddelanden ska sparas. + Om du vill ta meddelanden permanent, väl då "Använd inte" valet. + NOTIFICATION_ARCHIVE: "Du har inte valt \"Arkiv\" systemmapp, där arkiverade meddelanden ska läggas." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "Tvåstegsverifiering (TOTP)" + LABEL_ENABLE_TWO_FACTOR: "Aktivera tvåstegsverifiering" + LABEL_TWO_FACTOR_USER: "Användare" + LABEL_TWO_FACTOR_STATUS: "Status" + LABEL_TWO_FACTOR_SECRET: "Hemlig kod" + LABEL_TWO_FACTOR_BACKUP_CODES: "Backupkoder" + BUTTON_CREATE: "Skapa ny hemlig kod" + BUTTON_ACTIVATE: "Aktivera" + BUTTON_CLEAR: "Rensa" + BUTTON_LOGOUT: "Logga ut" + BUTTON_DONE: "Klar" + BUTTON_TEST: "Testa" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Visa hemlig kod" + BUTTON_HIDE_SECRET: "Göm hemlig kod" + TWO_FACTOR_REQUIRE_DESC: "Ditt konto kräver tvåstegsverifiering." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Konfigurerad" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Inte konfigurarad" + TWO_FACTOR_SECRET_DESC: >- + Importera denna information till din Google Authenticator klient (eller annan + TOTP klient) med denna QR kod eller manuellt med koden här nedan. + TWO_FACTOR_BACKUP_CODES_DESC: >- + Om du inte kan ta emot koderna med Google Authenticator, så använd backupkoderna + för att logga in. När du använt backupkoderna för att logga in så blir dom + inaktiva. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Du kan inte ändra denna inställning innan test." + TITLES: + LOADING: "Laddar" + LOGIN: "Logga in" + MAILBOX: "Brevlåda" + SETTINGS: "Inställningar" + COMPOSE: "Skriv" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Filen är för stor" + ERROR_FILE_PARTIALLY_UPLOADED: "Filen blev delvis uppladdad av okänd anledning" + ERROR_NO_FILE_UPLOADED: "Ingen fil uppladdad" + ERROR_MISSING_TEMP_FOLDER: "Den temporära filen saknas" + ERROR_ON_SAVING_FILE: "Okänt uppladdingsfel" + ERROR_FILE_TYPE: "Ogiltig filtyp" + ERROR_UNKNOWN: "Okänt uppladdingsfel" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" + TEXT_SWITCHER_RICH_FORMATTING: "HTML-formatering" + TEXT_SWITCHER_CONFIRM: "Textformatering och bilder kommer att försvinna. Vill du fortsätta?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Personligt" + LABEL_GENERAL_NAME: "Allmänt" + LABEL_CONTACTS_NAME: "Kontakter" + LABEL_FOLDERS_NAME: "Mappar" + LABEL_ACCOUNTS_NAME: "Konton" + LABEL_IDENTITY_NAME: "Identitet" + LABEL_IDENTITIES_NAME: "Identiteter" + LABEL_FILTERS_NAME: "Filter" + LABEL_TEMPLATES_NAME: "Templates" + LABEL_SECURITY_NAME: "Säkerhet" + LABEL_SOCIAL_NAME: "Socialt" + LABEL_THEMES_NAME: "Teman" + LABEL_CHANGE_PASSWORD_NAME: "Lösenord" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Tillbaka" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filter" + BUTTON_SAVE: "Spara" + BUTTON_ADD_FILTER: "Lägg till filter" + BUTTON_DELETE: "Ta bort" + BUTTON_RAW_SCRIPT: "Använd anpassat användarscript" + SUBNAME_NONE: "Ingen" + SUBNAME_MOVE_TO: "Flytta till \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Vidarebefordra till \"%EMAIL%\"" + SUBNAME_REJECT: "Avvisa" + SUBNAME_VACATION_MESSAGE: "semestermeddelande" + SUBNAME_DISCARD: "Kassera" + CAPABILITY_LABEL: "Förmåga" + LOADING_PROCESS: "Uppdaterar filter listan" + DELETING_ASK: "Är du säker?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Dessa förändringar måste sparas på servern." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Identitet" + LABEL_DISPLAY_NAME: "Namn" + LABEL_REPLY_TO: "Svara-till" + LABEL_SIGNATURE: "Signatur" + LABEL_ADD_SIGNATURE_TO_ALL: "Lägg till din signatur på alla utgående meddelanden." + SETTINGS_SECURITY: + LEGEND_SECURITY: "Säkerhet" + LABEL_CONFIGURE_TWO_FACTOR: "Konfigurera tvåstegsverifiering" + LABEL_AUTOLOGOUT: "Automatisk utloggning" + AUTOLOGIN_NEVER_OPTION_NAME: "Aldrig" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minut(er)" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% timme/timmar" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Allmänt" + LABEL_LANGUAGE: "Språk" + LABEL_IDENTITY: "Identitet" + LABEL_LAYOUT: "Stil" + LABEL_LAYOUT_NO_SPLIT: "Utan delad vy" + LABEL_LAYOUT_VERTICAL_SPLIT: "Vertikalt delad vy" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horisontellt delad vy" + LABEL_EDITOR: "Textredigerare" + LABEL_EDITOR_HTML: "HTML" + LABEL_EDITOR_PLAIN: "Oformaterad text" + LABEL_EDITOR_HTML_FORCED: "HTML (tvinga)" + LABEL_EDITOR_PLAIN_FORCED: "Oformaterad text (tvinga)" + LABEL_ANIMATION: "Animerat utseende" + LABEL_ANIMATION_FULL: "Full" + LABEL_ANIMATION_NORMAL: "Normal" + LABEL_ANIMATION_NONE: "Ingen" + LABEL_VIEW_OPTIONS: "Visa alternativ" + LABEL_USE_PREVIEW_PANE: "Avänd förhandsgranskningsfönster" + LABEL_USE_CHECKBOXES_IN_LIST: "Visa kryssrutor i listan" + LABEL_USE_THREADS: "Använd trådar" + LABEL_REPLY_SAME_FOLDER: "Placera svar i samma mapp som mottagna meddelandet" + LABEL_SHOW_IMAGES: "Visa alltid bilder i mail" + LABEL_SHOW_ANIMATION: "Visa animeringar" + LABEL_MESSAGE_PER_PAGE: "Meddelanden per sida" + LABEL_NOTIFICATIONS: "Aviseringar" + LABEL_SOUND_NOTIFICATION: "Ljudnotifikation" + LABEL_CHROME_NOTIFICATION_DESC: "Visa nya meddelande-aviseringar som popup-fönster" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Blockat av webbläsaren)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Kontakter" + LABEL_CONTACTS_AUTOSAVE: "Lägg till mottagare automatiskt i din adressbok" + LEGEND_CONTACTS_SYNC: "Fjärrsynkronisering (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Aktivera fjärrsynkronisering" + LABEL_CONTACTS_SYNC_SERVER: "Server" + LABEL_CONTACTS_SYNC_AB_URL: "Adressboks-URL" + LABEL_CONTACTS_SYNC_USER: "Användare" + LABEL_CONTACTS_SYNC_PASSWORD: "Lösenord" + SETTINGS_THEMES: + LEGEND_THEMES: "Teman" + LEGEND_THEMES_CUSTOM: "Anpassad temakonfiguration" + LABEL_CUSTOM_TYPE: "Typ" + LABEL_CUSTOM_TYPE_LIGHT: "Ljus" + LABEL_CUSTOM_TYPE_DARK: "Mörk" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Bakgrund" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Ladda upp bakgrundsbild (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Filen är för stor" + ERROR_FILE_TYPE_ERROR: "Ogiltig fil typ (endast JPG och PNG)" + ERROR_UNKNOWN: "Okänt uppladdingsfel" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Anslut till Google" + BUTTON_GOOGLE_DISCONNECT: "Koppla från Google" + MAIN_GOOGLE_DESC: "Efter aktivering av Googleinloggning, kan du logga in på detta konto med Google-knappen på inloggningssidan." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Anslut till Facebook" + BUTTON_FACEBOOK_DISCONNECT: "Koppla från Facebook" + MAIN_FACEBOOK_DESC: "Efter aktivering av Facebookinloggning, kan du logga in på detta konto med Facebook-knappen på inloggningssidan." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Anslut till Twitter" + BUTTON_TWITTER_DISCONNECT: "Koppla från Twitter" + MAIN_TWITTER_DESC: "Efter aktivering av Twitterinloggning, kan du logga in på detta konto med Twitterknappen på inloggningssidan." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Mapplista" + BUTTON_CREATE: "Skapa mapp" + BUTTON_SYSTEM: "Systemmappar" + BUTTON_DELETE: "Ta bort" + BUTTON_SUBSCRIBE: "Prenumerera" + BUTTON_UNSUBSCRIBE: "Avprenumerera" + LOADING_PROCESS: "Uppdaterar mapplista" + CREATING_PROCESS: "Skapar en mapp" + DELETING_PROCESS: "Ta bort en mapp" + RENAMING_PROCESS: "Byter namn på en mapp" + DELETING_ASK: "Är du säker?" + TO_MANY_FOLDERS_DESC_1: "Du har för många mappar" + TO_MANY_FOLDERS_DESC_2: "Vi har visat endast en del av dem, för att undvika prestandaproblem." + HELP_DELETE_FOLDER: "Ta bort mapp" + HELP_SHOW_HIDE_FOLDER: "Visa/dölj mapp" + HELP_CHECK_FOR_NEW_MESSAGES: "Kontrollera/inte söka efter nya meddelanden" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Kontolista" + LEGEND_IDENTITIES: "Indentiteter" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Konton och identiteter" + BUTTON_ADD_ACCOUNT: "Lägg till konto" + BUTTON_ADD_IDENTITY: "Lägg till identitet" + BUTTON_DELETE: "Ta bort" + LOADING_PROCESS: "Uppdaterar kontolista" + DELETING_ASK: "Är du säker?" + DEFAULT_IDENTITY_LABEL: "standard" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Identitet" + LEGEND_IDENTITIES: "Ytterligare identiteter" + LABEL_DEFAULT: "Standard" + LABEL_DISPLAY_NAME: "Namn" + LABEL_REPLY_TO: "Svara-till" + LABEL_SIGNATURE: "Signatur" + LABEL_ADD_SIGNATURE_TO_ALL: "Lägg till din signatur på alla utgående meddelanden." + BUTTON_ADD_IDENTITY: "Lägg till identitet" + BUTTON_DELETE: "Ta bort" + LOADING_PROCESS: "Uppdaterar identitetslistan" + DELETING_ASK: "Är du säker?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Ändra lösenord" + LABEL_CURRENT_PASSWORD: "Nuvarande lösenord" + LABEL_NEW_PASSWORD: "Nytt lösenord" + LABEL_REPEAT_PASSWORD: "Bekräfta nytt lösenord" + BUTTON_UPDATE_PASSWORD: "Byt lösenord" + ERROR_PASSWORD_MISMATCH: "Lösenorden matchar inte, vänligen försök igen" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Importera OpenPGP-nyckel" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Skapa OpenPGP-nycklar" + TITLE_PRIVATE: "Privat" + TITLE_PUBLIC: "Publik" + DELETING_ASK: "Är du säker?" + GENERATE_ONLY_HTTPS: "Endast HTTPS" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Spara utkast automatiskt" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Tangentbordsgenvägar hjälp" + TAB_MAILBOX: "Inkorg" + TAB_MESSAGE_LIST: "Meddelandelista" + TAB_MESSAGE_VIEW: "Meddelandevy" + TAB_COMPOSE: "Skapa" + LABEL_OPEN_USER_DROPDOWN: "Öppna användarval" + LABEL_REPLY: "Svara" + LABEL_REPLY_ALL: "Svara alla" + LABEL_FORWARD: "Vidarebefordra" + LABEL_FORWARD_MULTIPLY: "Vidarebefordra som bilaga(or)" + LABEL_HELP: "Hjälp" + LABEL_CHECK_ALL: "Kontrollera alla meddelanden" + LABEL_ARCHIVE: "Arkiv" + LABEL_DELETE: "Ta bort" + LABEL_OPEN_THREAD: "Öppna valda trådar" + LABEL_MOVE: "Flytta" + LABEL_READ: "Markera valda meddelanden som lästa" + LABEL_UNREAD: "Markera valda meddelanden som olästa" + LABEL_IMPORTANT: "Markera valda meddelanden som viktigt" + LABEL_SEARCH: "Sök" + LABEL_CANCEL_SEARCH: "Avbryt sökning" + LABEL_FULLSCREEN_ENTER: "Fullskärm (förhandsgranskningslayout)" + LABEL_VIEW_MESSAGE_ENTER: "Visa meddelande (ingen förhandsgranskningslayout)" + LABEL_SWITCH_TO_MESSAGE: "Flytta fokus till valda meddelande" + LABEL_SWITCH_TO_FOLDER_LIST: "Flytta fokus till mapplistan" + LABEL_FULLSCREEN_TOGGLE: "Växla fullskärmsläge" + LABEL_BLOCKQUOTES_TOGGLE: "Växla meddelandecitat" + LABEL_THREAD_NEXT: "Nästa meddelande i tråden" + LABEL_THREAD_PREV: "Föregående meddelande i tråden" + LABEL_PRINT: "Skriv ut" + LABEL_EXIT_FULLSCREEN: "Avsluta fullskärmsläge" + LABEL_CLOSE_MESSAGE: "Stäng meddelande (ingen förhandsgranskningslayout)" + LABEL_SWITCH_TO_LIST: "Växla fokus tillbaka till meddelandelistan" + LABEL_OPEN_COMPOSE_POPUP: "Öppna skrivfönster" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimera skrivfönster" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Öppna identitetsval" + LABEL_SAVE_MESSAGE: "Spara meddelande" + LABEL_SEND_MESSAGE: "Skicka meddelande" + LABEL_CLOSE_COMPOSE: "Stäng fönster" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "Inga publika nycklar funna" + NO_PUBLIC_KEYS_FOUND_FOR: "Inga publika nycklar funna för \"%EMAIL%\" epost" + NO_PRIVATE_KEY_FOUND: "Inga privata nycklar funna" + NO_PRIVATE_KEY_FOUND_FOR: "Inga privata nycklar funna för \"%EMAIL%\" epost" + ADD_A_PUBLICK_KEY: "Lägg till en publicerad nyckel" + SELECT_A_PRIVATE_KEY: "Välj en privat nyckel" + UNVERIFIRED_SIGNATURE: "Overifierad signatur" + DECRYPTION_ERROR: "OpenPGP dekrypteringsfel" + GOOD_SIGNATURE: "Godkänd signatur för %USER%" + PGP_ERROR: "OpenPGP-fel: %ERROR%" + SPECIFY_FROM_EMAIL: "Ange FRÅN epost adress" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Ange minst en mottagare" + NOTIFICATIONS: + INVALID_TOKEN: "Ogiltigt tecken" + AUTH_ERROR: "Autentisering misslyckades" + ACCESS_ERROR: "Åtkomstfel" + CONNECTION_ERROR: "Kan inte ansluta till servern" + CAPTCHA_ERROR: "Felaktig CAPTCHA." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- + Detta ID är inte tilldelat något epost konto än. Logga in med epost uppgifter + och aktivera detta i konto inställningarna. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- + Detta ID är inte tilldelat något epost konto än. Logga in med epost uppgifter + och aktivera detta i konto inställningarna. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- + Detta ID är inte tilldelat något epost konto än. Logga in med epost uppgifter + och aktivera detta i konto inställningarna. + DOMAIN_NOT_ALLOWED: "Domän är inte tillåtet" + ACCOUNT_NOT_ALLOWED: "Konto är inte tillåtet" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Tvåstegsverifiering krävs" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Tvåstegsverifieringsfel" + COULD_NOT_SAVE_NEW_PASSWORD: "Kunde inte spara lösenord" + CURRENT_PASSWORD_INCORRECT: "Nuvarande lösenord är felaktigt" + NEW_PASSWORD_SHORT: "Lösenordet är för kort" + NEW_PASSWORD_WEAK: "Lösenordet är för enkelt" + NEW_PASSWORD_FORBIDDENT: "Lösenordet innehåller ogiltiga tecken" + CONTACTS_SYNC_ERROR: "Kontakt-synkroniseringsfel" + CANT_GET_MESSAGE_LIST: "Kan inte hämta meddelandelista" + CANT_GET_MESSAGE: "Kan inte hämta meddelande" + CANT_DELETE_MESSAGE: "Kan inte ta bort meddelande" + CANT_MOVE_MESSAGE: "Kan inte flytta meddelande" + CANT_SAVE_MESSAGE: "Kan inte spara meddelande" + CANT_SEND_MESSAGE: "Kan inte skicka meddelande" + INVALID_RECIPIENTS: "Ogiltig mottagare" + CANT_SAVE_FILTERS: "Kan inte spara filter" + CANT_GET_FILTERS: "Kan inte ta emot filter" + FILTERS_ARE_NOT_CORRECT: "Filter är inte korrekt" + CANT_CREATE_FOLDER: "Kan inte skapa mapp" + CANT_RENAME_FOLDER: "Kan inte byta namn på mapp" + CANT_DELETE_FOLDER: "Kan inte ta bort mapp" + CANT_DELETE_NON_EMPTY_FOLDER: "Kan inte ta bort mapp med innehåll" + CANT_SUBSCRIBE_FOLDER: "Kan inte prenumerera på mapp" + CANT_UNSUBSCRIBE_FOLDER: "Kan inte avprenumerera på mapp" + CANT_SAVE_SETTINGS: "Kan inte spara inställningarna" + CANT_SAVE_PLUGIN_SETTINGS: "Kan inte spara inställningarna" + DOMAIN_ALREADY_EXISTS: "Domänen finns redan" + CANT_INSTALL_PACKAGE: "Misslyckades att installera paket" + CANT_DELETE_PACKAGE: "Misslyckades ta bort paket" + INVALID_PLUGIN_PACKAGE: "Ogiltigt pluginpaket" + UNSUPPORTED_PLUGIN_PACKAGE: "Inget stöd för detta pluginpaket" + LICENSING_SERVER_IS_UNAVAILABLE: "Prenumerationsserver inte tillgänglig" + LICENSING_DOMAIN_EXPIRED: "Prenumeration för denna domän har gått ut." + LICENSING_DOMAIN_BANNED: "Prenumeration för denna domän är bannad." + DEMO_SEND_MESSAGE_ERROR: "Av säkerhets skäl kan inte detta demo-konto skicka epost till externa adressater!" + DEMO_ACCOUNT_ERROR: "Av säkerhetsskäl är det här kontot inte tillåtet för denna åtgärd!" + ACCOUNT_ALREADY_EXISTS: "Kontot finns redan" + ACCOUNT_DOES_NOT_EXIST: "Kontot finns inte" + MAIL_SERVER_ERROR: "Ett fel har inträffat vid anslutning till epostservern" + INVALID_INPUT_ARGUMENT: "Ogiltigt argument" + UNKNOWN_ERROR: "Okänt fel" + STATIC: + BACK_LINK: "Ladda om" + DOMAIN_LIST_DESC: "Lista över domän(er) som webbmailen har åtkomst till." + PHP_EXSTENSIONS_ERROR_DESC: "Erfodrade PHP-tillägg finns inte i PHP konfigurationen!" + PHP_VERSION_ERROR_DESC: "Din PHP version (%VERSION%) uppfyller inte kravet på 5.3.0!" + NO_SCRIPT_TITLE: "JavaScript krävs för denna applikation." + NO_SCRIPT_DESC: | + JavaScript är inte tillgängligt i webb läsaren. + Aktivera JavaScript stöd och försök igen. + NO_COOKIE_TITLE: "Kakstöd krävs för denna applikation." + NO_COOKIE_DESC: | + Kakstöd är inte tillgängligt i webbläsaren. + Aktivera kakstöd och försök igen. + BAD_BROWSER_TITLE: "Webbläsaren är för gammal." + BAD_BROWSER_DESC: | + För att använda funktioner i denna applikation, + ladda ner och installera någon av följande webbläsare: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/tr_TR.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/tr_TR.yml new file mode 100755 index 00000000..23ac4509 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/tr_TR.yml @@ -0,0 +1,710 @@ +tr_TR: + LOGIN: + LABEL_EMAIL: "E-Posta" + LABEL_LOGIN: "Giriş" + LABEL_PASSWORD: "Şifre" + LABEL_SIGN_ME: "Beni Hatırla" + LABEL_VERIFICATION_CODE: "Doğrulama Kodu" + LABEL_DONT_ASK_VERIFICATION_CODE: "2 hafta boyunca kodu sormayın" + BUTTON_SIGN_IN: "Giriş Yap" + TITLE_SIGN_IN_GOOGLE: "Google İle Giriş Yap" + TITLE_SIGN_IN_FACEBOOK: "Facebook ile Giriş yap" + TITLE_SIGN_IN_TWITTER: "Twitter İle Giriş Yap" + LABEL_FORGOT_PASSWORD: "Şifremi Unuttum" + LABEL_REGISTRATION: "Registration" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Hesap Ekle" + BUTTON_SETTINGS: "Ayarlar" + BUTTON_HELP: "Yardım" + BUTTON_LOGOUT: "Çıkış" + MOBILE: + BUTTON_MOBILE_VERSION: "Mobil versiyonu" + BUTTON_DESKTOP_VERSION: "Masaüstü versiyonu" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Arama" + TITLE_ADV: "Detaylı Arama" + LABEL_ADV_FROM: "Kimden" + LABEL_ADV_TO: "Kime" + LABEL_ADV_SUBJECT: "Konu" + LABEL_ADV_TEXT: "Metin" + LABEL_ADV_HAS_ATTACHMENT: "Eki" + LABEL_ADV_HAS_ATTACHMENTS: "Ekleri" + LABEL_ADV_FLAGGED: "İşaretli" + LABEL_ADV_UNSEEN: "Görünmeyen" + LABEL_ADV_DATE: "Tarih" + LABEL_ADV_DATE_ALL: "Hepsi" + LABEL_ADV_DATE_3_DAYS: "3 gün önceki" + LABEL_ADV_DATE_7_DAYS: "1 hafta önceki" + LABEL_ADV_DATE_MONTH: "1 ay önceki" + LABEL_ADV_DATE_3_MONTHS: "3 ay önceki" + LABEL_ADV_DATE_6_MONTHS: "6 ay önceki" + LABEL_ADV_DATE_YEAR: "1 yıl önceki" + BUTTON_ADV_SEARCH: "Arama" + PREVIEW_POPUP: + FULLSCREEN: "Toggle fullscreen" + ZOOM: "Yakınlaştır/Uzaklaştır" + CLOSE: "Kapat (Esc)" + LOADING: "Yükleniyor..." + GALLERY_PREV: "Önceki (Sol yön tuşu)" + GALLERY_NEXT: "Sonraki (Sağ yön tuşu)" + GALLERY_COUNTER: "%curr% of %total%" + IMAGE_ERROR: "Bu resim yüklenemedi." + AJAX_ERROR: "Bu içerik yüklenemedi." + FOLDER_LIST: + BUTTON_COMPOSE: "Yaz" + BUTTON_CONTACTS: "Kişi Listesi" + BUTTON_NEW_MESSAGE: "Yeni Mesaj" + INBOX_NAME: "Gelen Kutusu" + SENT_NAME: "Gönderilen" + DRAFTS_NAME: "Taslaklar" + SPAM_NAME: "Spam" + TRASH_NAME: "Çöp Kutusu" + ARCHIVE_NAME: "Arşiv" + QUOTA: + TITLE: "Kota Kullanımı" + MESSAGE_LIST: + BUTTON_RELOAD: "Mesaj Listesini Yenile" + BUTTON_MOVE_TO: "Taşı" + BUTTON_DELETE: "Sil" + BUTTON_ARCHIVE: "Arşiv" + BUTTON_SPAM: "Spam" + BUTTON_NOT_SPAM: "Spam Değil" + BUTTON_EMPTY_FOLDER: "Klasörü temizle" + BUTTON_MULTY_FORWARD: "Mesajları İlet" + BUTTON_DELETE_WITHOUT_MOVE: "Kalıcı olarak sil" + BUTTON_MORE: "devamı" + MENU_SET_SEEN: "Okundu olarak işaretle" + MENU_SET_ALL_SEEN: "Tümünü okundu olarak işaretle" + MENU_UNSET_SEEN: "Okunmadı olarak işaretle" + MENU_SET_FLAG: "İşaretle" + MENU_UNSET_FLAG: "İşaretleme" + MENU_SELECT_ALL: "Tümü" + MENU_SELECT_NONE: "Hiçbiri" + MENU_SELECT_INVERT: "Invert" + MENU_SELECT_UNSEEN: "Okunmamış" + MENU_SELECT_SEEN: "Oku" + MENU_SELECT_FLAGGED: "İşaretlenmiş" + MENU_SELECT_UNFLAGGED: "İşaretlenmemiş" + EMPTY_LIST: "Herhangi Bir Sonuç Bulunamadı." + EMPTY_SEARCH_LIST: "Arama sonuçlarına uyan herhangi bir mesaj bulunamadı." + SEARCH_RESULT_FOR: "\"%SEARCH%\" için arama sonuçları" + BACK_TO_MESSAGE_LIST: "mesaj listesine geri dön" + LIST_LOADING: "Yükleniyor" + EMPTY_SUBJECT_TEXT: "(Konu Yok)" + PUT_MESSAGE_HERE: "Listede görüntülemek istediğiniz mesajı buraya sürükleyin." + TODAY_AT: "bugün %TIME%" + YESTERDAY_AT: "dün %TIME%" + SEARCH_PLACEHOLDER: "Arama" + NEW_MESSAGE_NOTIFICATION: "Toplam %COUNT% yeni mesajınız var!" + QUOTA_SIZE: "Size ayrılan %LIMIT%'dan %SIZE% (%PROC%%) kullanıyorsunuz" + MESSAGE: + BUTTON_EDIT: "Düzenle" + BUTTON_BACK: "Geri" + BUTTON_CLOSE: "Kapat" + BUTTON_DELETE: "Sil" + BUTTON_UNSUBSCRIBE: "Bu listeden aboneliği sonlandir" + BUTTON_ARCHIVE: "Arşiv" + BUTTON_SPAM: "Spam" + BUTTON_NOT_SPAM: "Spam Değil" + BUTTON_MOVE_TO: "Taşı" + BUTTON_MORE: "More" + BUTTON_REPLY: "Yanıtla" + BUTTON_REPLY_ALL: "Tümünü Yanıtla" + BUTTON_FORWARD: "Yönlendir" + BUTTON_FORWARD_AS_ATTACHMENT: "Tümünü Yönlendir(ekler dahil)" + BUTTON_EDIT_AS_NEW: "Düzenle ve yeni" + BUTTON_SHOW_IMAGES: "Resimleri görüntüle" + BUTTON_NOTIFY_READ_RECEIPT: "Gönderen, bu mesaj için okundu onayı istedi." + BUTTON_IN_NEW_WINDOW: "Ayrı bir pencerede görüntüle" + BUTTON_THREAD_LIST: "Thread list" + BUTTON_THREAD_PREV: "Önceki" + BUTTON_THREAD_NEXT: "Sonraki" + BUTTON_THREAD_MORE: "More messages" + MENU_HEADERS: "İleti başlıklarını göster" + MENU_VIEW_ORIGINAL: "Kaynağı görüntüle" + MENU_DOWNLOAD_ORIGINAL: ".eml dosyası olarak indir" + MENU_FILTER_SIMILAR: "Bunun gibi iletileri filtrele" + MENU_PRINT: "yazdır" + EMPTY_SUBJECT_TEXT: "(Konu Yok)" + LABEL_SUBJECT: "Konu" + LABEL_DATE: "Tarih" + LABEL_FROM: "Kimden" + LABEL_FROM_SHORT: "kimden" + LABEL_TO: "Kime" + LABEL_TO_SHORT: "kime" + LABEL_CC: "CC" + LABEL_BCC: "BCC" + LABEL_REPLY_TO: "Reply-To" + PRINT_LABEL_FROM: "Kimden" + PRINT_LABEL_TO: "To" + PRINT_LABEL_CC: "CC" + PRINT_LABEL_BCC: "BCC" + PRINT_LABEL_REPLY_TO: "Reply-To" + PRINT_LABEL_DATE: "Tarih" + PRINT_LABEL_SUBJECT: "Konu" + PRINT_LABEL_ATTACHMENTS: "Ekler" + MESSAGE_LOADING: "Yükleniyor" + MESSAGE_VIEW_DESC: "Burada görüntülemek için listeden mesaj seçin." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Şifre" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP imzalı mesaj (onay için tıklayın)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP şifreli mesaj (çözmek için tıklayın)" + LINK_DOWNLOAD_AS_ZIP: "Download as zip" + LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" + LINK_SAVE_TO_DROPBOX: "Dropbox'a Kaydet" + READ_RECEIPT: + SUBJECT: "Return Receipt (displayed) - %SUBJECT%" + BODY: | + This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. + + Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. + There is no guarantee that the recipient has read or understood the message contents. + SUGGESTIONS: + SEARCHING_DESC: "Aranıyor..." + CONTACTS: + LEGEND_CONTACTS: "Adres Defteri" + SEARCH_INPUT_PLACEHOLDER: "Arama" + BUTTON_ADD_CONTACT: "Ekle" + BUTTON_CREATE_CONTACT: "Oluştur" + BUTTON_UPDATE_CONTACT: "Güncelle" + BUTTON_IMPORT: "İçe Aktar (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Dışa Aktar (vcf, vCard)" + BUTTON_EXPORT_CSV: "Dışa Aktar (csv)" + ERROR_IMPORT_FILE: "İçe aktarma hatası (geçersiz dosya formatı)" + LIST_LOADING: "Yükleniyor" + EMPTY_LIST: "Adres defterinizide kayıt bulunmuyor" + EMPTY_SEARCH: "Kişi bulunamadı" + CLEAR_SEARCH: "Aramayı temizle" + CONTACT_VIEW_DESC: "Görüntülemek istediğiniz kişiyi listeden seçin." + LABEL_DISPLAY_NAME: "Ekran Adı" + LABEL_EMAIL: "E-Posta" + LABEL_PHONE: "Telefon" + LABEL_WEB: "Web" + LABEL_BIRTHDAY: "Doğum Günü" + LINK_ADD_EMAIL: "Bir e-posta adresi ekleyin" + LINK_ADD_PHONE: "Bir telefon numarası ekleyin" + LINK_BIRTHDAY: "Doğrum Günü" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Görüntülenecek Ad" + PLACEHOLDER_ENTER_LAST_NAME: "Soyadını yazın" + PLACEHOLDER_ENTER_FIRST_NAME: "Adı yazın" + PLACEHOLDER_ENTER_NICK_NAME: "Nickname yazın" + LABEL_READ_ONLY: "Sadece Okunabilir" + LABEL_SHARE: "paylaş" + ADD_MENU_LABEL: "Ekle" + ADD_MENU_NICKNAME: "Nickname" + ADD_MENU_NOTES: "Notlar" + ADD_MENU_EMAIL: "E-Posta" + ADD_MENU_PHONE: "Gsm" + ADD_MENU_URL: "URL" + ADD_MENU_ADDRESS: "Adres" + ADD_MENU_BIRTHDAY: "Doğum Günü" + ADD_MENU_TAGS: "Etiketler" + BUTTON_SHARE_NONE: "Hiçbiri" + BUTTON_SHARE_ALL: "Herkes" + BUTTON_SYNC: "Senkronize Et (CardDAV)" + COMPOSE: + TITLE_FROM: "Kimden" + TITLE_TO: "Kime" + TITLE_CC: "CC" + TITLE_BCC: "BCC" + TITLE_REPLY_TO: "Yanıtla" + TITLE_SUBJECT: "Konu" + LINK_SHOW_INPUTS: "tüm alanları görüntüle" + BUTTON_SEND: "Gönder" + BUTTON_SAVE: "Kaydet" + BUTTON_DELETE: "Sil" + BUTTON_CANCEL: "Vazgeç" + BUTTON_MINIMIZE: "Minimize" + SAVED_TIME: "%TIME% tarihinde kaydedildi" + SAVED_ERROR_ON_SEND: "Mesaj gönderildi fakat gönderilenler klasörüne kaydedilmedi" + DISCARD_UNSAVED_DATA: "Discard unsaved data?" + ATTACH_FILES: "Ek dosyalar" + ATTACH_DROP_FILES_DESC: "Dosyaları buraya sürükleyin" + ATTACH_ITEM_CANCEL: "Vazgeç" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% yazdı" + FORWARD_MESSAGE_TOP_TITLE: "-------- Yönlendirilmiş İleti -------" + FORWARD_MESSAGE_TOP_FROM: "Kimden" + FORWARD_MESSAGE_TOP_TO: "Kime" + FORWARD_MESSAGE_TOP_CC: "CC" + FORWARD_MESSAGE_TOP_SENT: "Gönder" + FORWARD_MESSAGE_TOP_SUBJECT: "Konu" + EMPTY_TO_ERROR_DESC: "En az bir alıcı belirtin" + NO_ATTACHMENTS_HERE_DESC: "No attachments here." + ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet" + BUTTON_REQUEST_READ_RECEIPT: "Okundu bilgisi iste" + BUTTON_MARK_AS_IMPORTANT: "Mark as important" + BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" + BUTTON_REQUEST_DSN: "Request a delivery receipt" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Close" + POPUPS_ASK: + BUTTON_YES: "Evet" + BUTTON_NO: "Hayır" + DESC_WANT_CLOSE_THIS_WINDOW: "Bu pencereyi kapatmak istediğinizden emin misiniz?" + DESC_WANT_DELETE_MESSAGES: "Mesaj(ları) silmek istediğinizden emin misiniz?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Dil Seçimi" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Hesap Ekle?" + BUTTON_ADD_ACCOUNT: "Ekle" + TITLE_UPDATE_ACCOUNT: "Update Account?" + BUTTON_UPDATE_ACCOUNT: "Update" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Kimlik Ekle?" + TITLE_UPDATE_IDENTITY: "Kimlik Güncelle?" + BUTTON_ADD_IDENTITY: "Ekle" + BUTTON_UPDATE_IDENTITY: "Güncelle" + LABEL_EMAIL: "E-Posta" + LABEL_NAME: "Ad" + LABEL_REPLY_TO: "Yanıtla" + LABEL_SIGNATURE: "Signature" + LABEL_CC: "Cc" + LABEL_BCC: "Bcc" + LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Klasör Oluştur?" + LABEL_NAME: "Klasör Adı" + LABEL_PARENT: "Üst Klasör" + BUTTON_CREATE: "Oluştur" + BUTTON_CANCEL: "Vazgeç" + BUTTON_CLOSE: "Kapat" + TITLE_CREATING_PROCESS: "Klasör Oluştur" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Klasördeki tüm mesajları temizle?" + BUTTON_CLEAR: "Temizle" + BUTTON_CANCEL: "Vazgeç" + BUTTON_CLOSE: "Kapat" + DANGER_DESC_WARNING: "Uyarı!" + DANGER_DESC_HTML_1: "Bu işlem ile %FOLDER% klasöründeki tüm mailler silinecek." + DANGER_DESC_HTML_2: "Bu işlem bir kez başladıktan sonra, işlem durdurulamaz veya iptal edilemez." + TITLE_CLEARING_PROCESS: "Klasör temizleniyor..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "OpenPGP key'i içe aktar" + BUTTON_IMPORT_OPEN_PGP_KEY: "İçe aktar" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "OpenPGP key'i göster" + BUTTON_SELECT: "Seç" + BUTTON_CLOSE: "Kapat" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "OpenPGP key'leri Oluştur" + LABEL_EMAIL: "E-Posta" + LABEL_NAME: "Ad" + LABEL_PASSWORD: "Şifre" + LABEL_KEY_BIT_LENGTH: "Key Uzunluğu" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Oluştur" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP Giriş/Şifrele" + LABEL_SIGN: "Giriş Yap" + LABEL_ENCRYPT: "Şifrele" + LABEL_PASSWORD: "Password" + BUTTON_SIGN: "Giriş Yap" + BUTTON_ENCRYPT: "Şifrele" + BUTTON_SIGN_AND_ENCRYPT: "Giriş Yap and şifrele" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" + LABEL_KEY: "Private Key" + LABEL_PASSWORD: "Password" + BUTTON_DECRYPT: "Decrypt" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "2-Basamaklı doğrulama testi" + LABEL_CODE: "Kod" + BUTTON_TEST: "Test" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Create a filter?" + TITLE_EDIT_FILTER: "Update filter?" + FILTER_NAME: "Name" + LEGEND_CONDITIONS: "Conditions" + LEGEND_ACTIONS: "Actions" + BUTTON_DONE: "Done" + BUTTON_ADD_CONDITION: "Add a Condition" + SELECT_ACTION_NONE: "None" + SELECT_ACTION_MOVE_TO: "Move to" + SELECT_ACTION_FORWARD_TO: "Forward to" + SELECT_ACTION_REJECT: "Reject" + SELECT_ACTION_VACATION_MESSAGE: "Vacation message" + SELECT_ACTION_DISCARD: "Discard" + SELECT_FIELD_FROM: "From" + SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" + SELECT_FIELD_SUBJECT: "Subject" + SELECT_FIELD_HEADER: "Header" + SELECT_FIELD_SIZE: "Size" + SELECT_TYPE_CONTAINS: "Contains" + SELECT_TYPE_NOT_CONTAINS: "Not Contains" + SELECT_TYPE_MATCHES: "Matches (* and ? supported)" + SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" + SELECT_TYPE_REGEXP: "Regexp" + SELECT_TYPE_NOT_REGEXP: "Not Regexp" + SELECT_TYPE_EQUAL_TO: "Equal To" + SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" + SELECT_TYPE_OVER: "Over" + SELECT_TYPE_UNDER: "Under" + SELECT_MATCH_ANY: "Matching any of the following rules" + SELECT_MATCH_ALL: "Matching all of the following rules" + MARK_AS_READ_LABEL: "Okundu olarak işaretle" + REPLY_INTERVAL_LABEL: "Reply interval (days)" + KEEP_LABEL: "Keep" + STOP_LABEL: "Don't stop processing rules" + EMAIL_LABEL: "Eposta" + VACATION_SUBJECT_LABEL: "Konu (Opsiyonel)" + VACATION_MESSAGE_LABEL: "Mesaj" + VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" + REJECT_MESSAGE_LABEL: "Reject message" + ALL_INCOMING_MESSAGES_DESC: "All incoming messages" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Sistem klasörü seç" + SELECT_CHOOSE_ONE: "Birini seçin" + SELECT_UNUSE_NAME: "Kullanmayın" + LABEL_SENT: "Gönderilen" + LABEL_DRAFTS: "Taslaklar" + LABEL_SPAM: "Spam" + LABEL_TRASH: "Çöp" + LABEL_ARCHIVE: "Arşiv" + BUTTON_CANCEL: "Vazgeç" + BUTTON_CLOSE: "Kapat" + NOTIFICATION_SENT: | + Herhangi bir sistem gönderilen klasörü seçmediniz normalde mesaj gönderildikten sonra "Gönderilen"'ler klasörüne kaydedilir + Eğer gönderilenlerin kaydedilmesini istemiyorsanız lütfen ayarlardan "Kullanma" seçeneğini seçin. + NOTIFICATION_DRAFTS: "Herhangi bir sistem taslak klasörü seçmediniz.\"Taslak\" klasörü otomatik mesajınızı kaydeder" + NOTIFICATION_SPAM: |- + Herhangi bir sistem spam klasörü seçmediniz."Spam" klasörü spam iletileri barındırır. + NOTIFICATION_TRASH: |- + Herhangi bir sistem çöp kutusu klasörü seçmediniz normalde mesaj silindikten sonra "Çöp Kutusu" klasörüne kaydedilir + NOTIFICATION_ARCHIVE: "Herhangi bir sistem arşiv klasörü seçmediniz." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "2-Basamaklı doğrumalama" + LABEL_ENABLE_TWO_FACTOR: "2-Basamaklı Doğrulama Etkinleştir" + LABEL_TWO_FACTOR_USER: "Kullanıcı Adı" + LABEL_TWO_FACTOR_STATUS: "Durum" + LABEL_TWO_FACTOR_SECRET: "Gizli" + LABEL_TWO_FACTOR_BACKUP_CODES: "Kodları yedekle" + BUTTON_CREATE: "Yeni Secret kodu oluştur" + BUTTON_ACTIVATE: "Activate" + BUTTON_CLEAR: "Temizle" + BUTTON_LOGOUT: "Oturumu Kapat" + BUTTON_DONE: "Tamamla" + BUTTON_TEST: "Test" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Gizli kodu göster" + BUTTON_HIDE_SECRET: "Gizli kodu gizle" + TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Yapılandırılmış" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Yapılandırılmamış" + TWO_FACTOR_SECRET_DESC: >- + Aşağıda sunulan QR kodu kullanarak Google Şifrematik istemcisi (veya başka + TOTP istemci) içine veya elle kod girerek bu bilgi aktarın. + TWO_FACTOR_BACKUP_CODES_DESC: >- + Google Şifrematik'te aracılığıyla kodları alamıyorsa Eğer oturum için bir + yedek kod kullandım sonra, bunu pasif olacaktır, oturum yedekleme kodlarını + kullanabilirsiniz. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." + TITLES: + LOADING: "Yükleniyor" + LOGIN: "Giriş" + MAILBOX: "PostaKutusu" + SETTINGS: "Ayarlar" + COMPOSE: "Yaz" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Dosya çok büyük" + ERROR_FILE_PARTIALLY_UPLOADED: "Dosya yüklenirken kısmen bilinmeyen hata oluştu" + ERROR_NO_FILE_UPLOADED: "Hiç bir dosya yüklenmedi" + ERROR_MISSING_TEMP_FOLDER: "Geçici dosya eksik" + ERROR_ON_SAVING_FILE: "Bilinmeyen bir dosya yükleme bir hatası oluştu" + ERROR_FILE_TYPE: "Geçersiz dosya tipi" + ERROR_UNKNOWN: "Bilinmeyen bir dosya yükleme bir hatası oluştu" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> Yazi Formati" + TEXT_SWITCHER_RICH_FORMATTING: "Zengin yazı formatı" + TEXT_SWITCHER_CONFIRM: "Metin biçimlendirme ve görüntüleri kaybolacak. Devam etmek istediğinizden emin misiniz?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Kişisel" + LABEL_GENERAL_NAME: "Genel" + LABEL_CONTACTS_NAME: "Kişi Listesi" + LABEL_FOLDERS_NAME: "Klasörler" + LABEL_ACCOUNTS_NAME: "Hesaplar" + LABEL_IDENTITY_NAME: "Kimlik" + LABEL_IDENTITIES_NAME: "Kimlikler" + LABEL_FILTERS_NAME: "Filtreler" + LABEL_TEMPLATES_NAME: "Templates" + LABEL_SECURITY_NAME: "Güvenlik" + LABEL_SOCIAL_NAME: "Sosyal Media" + LABEL_THEMES_NAME: "Temalar" + LABEL_CHANGE_PASSWORD_NAME: "Şifre" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Geri" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filters" + BUTTON_SAVE: "Kaydet" + BUTTON_ADD_FILTER: "Add a Filter" + BUTTON_DELETE: "Sil" + BUTTON_RAW_SCRIPT: "Use Custom User Script" + SUBNAME_NONE: "None" + SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" + SUBNAME_REJECT: "Reject" + SUBNAME_VACATION_MESSAGE: "Vacation message" + SUBNAME_DISCARD: "Discard" + CAPABILITY_LABEL: "Capability" + LOADING_PROCESS: "Updating filter list" + DELETING_ASK: "Are you sure?" + CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Kimlik" + LABEL_DISPLAY_NAME: "İsim" + LABEL_REPLY_TO: "Yanıt-için" + LABEL_SIGNATURE: "İmza" + LABEL_ADD_SIGNATURE_TO_ALL: "Tüm giden iletilere imza ekle" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Security" + LABEL_CONFIGURE_TWO_FACTOR: "2 Aşamali Güvenlik Konfikasyonu" + LABEL_AUTOLOGOUT: "Auto Logout" + AUTOLOGIN_NEVER_OPTION_NAME: "Never" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% saat" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Genel" + LABEL_LANGUAGE: "Dil" + LABEL_IDENTITY: "Identity" + LABEL_LAYOUT: "Layout" + LABEL_LAYOUT_NO_SPLIT: "No Split" + LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" + LABEL_EDITOR: "Varsayılan text editör" + LABEL_EDITOR_HTML: "Html" + LABEL_EDITOR_PLAIN: "Düz" + LABEL_EDITOR_HTML_FORCED: "Html (forced)" + LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" + LABEL_ANIMATION: "Arayüz animasyonu" + LABEL_ANIMATION_FULL: "Tam Ekran" + LABEL_ANIMATION_NORMAL: "Normal" + LABEL_ANIMATION_NONE: "Yok" + LABEL_VIEW_OPTIONS: "Ayarları görüntüle" + LABEL_USE_PREVIEW_PANE: "Önizleme bölmesini kullanın" + LABEL_USE_CHECKBOXES_IN_LIST: "Listede ekran onay kutularını göster" + LABEL_USE_THREADS: "Konuları kullanın" + LABEL_REPLY_SAME_FOLDER: "Klasördeki cevapları mesajlarda göster" + LABEL_SHOW_IMAGES: "Herzaman gelen maillerdeki resimleri görüntüle." + LABEL_SHOW_ANIMATION: "Animasyonu göster" + LABEL_MESSAGE_PER_PAGE: "Messages on page" + LABEL_NOTIFICATIONS: "Bildirimler" + LABEL_SOUND_NOTIFICATION: "Sound notification" + LABEL_CHROME_NOTIFICATION_DESC: "Yeni mesajları pop-up ile göster" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Tarayıcınız tarafından engellendi)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Kişi Listesi" + LABEL_CONTACTS_AUTOSAVE: "Otomatik olarak adres defterinize alıcıyı ekle" + LEGEND_CONTACTS_SYNC: "Uzaktan Eşleştirme (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Uzaktan eşleştirme etkin" + LABEL_CONTACTS_SYNC_SERVER: "Sunucu" + LABEL_CONTACTS_SYNC_AB_URL: "Adres Defteri URL" + LABEL_CONTACTS_SYNC_USER: "Kullanıcı Adı" + LABEL_CONTACTS_SYNC_PASSWORD: "Şifre" + SETTINGS_THEMES: + LEGEND_THEMES: "Temalar" + LEGEND_THEMES_CUSTOM: "Özel Tema Yapılandırması" + LABEL_CUSTOM_TYPE: "Tip" + LABEL_CUSTOM_TYPE_LIGHT: "Aydınlık" + LABEL_CUSTOM_TYPE_DARK: "Koyu" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Arka Plan" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Arka Plan Resmi Yükleyin(JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Dosya çok büyük (1MB+)" + ERROR_FILE_TYPE_ERROR: "Geçersiz dosya tipi (sadece JPG ve PNG kabul edilir)" + ERROR_UNKNOWN: "Bilinmeyen bir dosya yükleme bir hatası oluştu" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Google'a bağlan" + BUTTON_GOOGLE_DISCONNECT: "Google bağlantısını kes" + MAIN_GOOGLE_DESC: "Google üzerinden giriş etkinleştirdikten sonra, giriş ekranında Google düğmesini kullanarak bu hesaba oturum açabilirsiniz." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Facebook'a bağlan" + BUTTON_FACEBOOK_DISCONNECT: "Facebook bağlantısını kes" + MAIN_FACEBOOK_DESC: "Facebook üzerinden giriş etkinleştirdikten sonra, giriş ekranında Facebook düğmesini kullanarak bu hesaba oturum açabilirsiniz." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Twitter'a bağlan" + BUTTON_TWITTER_DISCONNECT: "Twitter bağlantısını kes" + MAIN_TWITTER_DESC: "Twitter üzerinden giriş etkinleştirdikten sonra, giriş ekranında Twitter düğmesini kullanarak bu hesaba oturum açabilirsiniz." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Klasör Listesi" + BUTTON_CREATE: "Klasör Oluştur" + BUTTON_SYSTEM: "Sistem Klasörleri" + BUTTON_DELETE: "Sil" + BUTTON_SUBSCRIBE: "Abone" + BUTTON_UNSUBSCRIBE: "Abonelikten Çık" + LOADING_PROCESS: "Klasör listesi güncelleniyor" + CREATING_PROCESS: "Klasör oluşturuluyor" + DELETING_PROCESS: "Klasör siliniyor" + RENAMING_PROCESS: "Klasör değiştiriliyor" + DELETING_ASK: "Eminmisiniz?" + TO_MANY_FOLDERS_DESC_1: "You have too many folders!" + TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." + HELP_DELETE_FOLDER: "Delete folder" + HELP_SHOW_HIDE_FOLDER: "Show/hide folder" + HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Hesap Listesi" + LEGEND_IDENTITIES: "Identities" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" + BUTTON_ADD_ACCOUNT: "Hesap Ekle" + BUTTON_ADD_IDENTITY: "Add an Identity" + BUTTON_DELETE: "Sil" + LOADING_PROCESS: "Hesap listesi güncelleniyor" + DELETING_ASK: "Eminmisiniz?" + DEFAULT_IDENTITY_LABEL: "default" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Kimlik" + LEGEND_IDENTITIES: "Ek kimlikler" + LABEL_DEFAULT: "Default" + LABEL_DISPLAY_NAME: "Ad" + LABEL_REPLY_TO: "Yanıt için" + LABEL_SIGNATURE: "İmza" + LABEL_ADD_SIGNATURE_TO_ALL: "Tüm gönderilen mailler imza ekle" + BUTTON_ADD_IDENTITY: "Kimlik ekle" + BUTTON_DELETE: "Sil" + LOADING_PROCESS: "Kimlik listesi güncelleniyor" + DELETING_ASK: "Eminmisiniz?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Şifreyi Değiştir" + LABEL_CURRENT_PASSWORD: "Şimdiki Şifreniz" + LABEL_NEW_PASSWORD: "Yeni Şifreniz" + LABEL_REPEAT_PASSWORD: "Yeni Şifre Tekrar" + BUTTON_UPDATE_PASSWORD: "Yeni Şifreyi Kaydet" + ERROR_PASSWORD_MISMATCH: "Şifre eşleşmesi hatalı,lütfen tekrar deneyiniz" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "OpenPGP Key İçe Aktar" + BUTTON_GENERATE_OPEN_PGP_KEYS: "OpenPGP Key Oluştur" + TITLE_PRIVATE: "Private" + TITLE_PUBLIC: "Public" + DELETING_ASK: "Eminmisiniz?" + GENERATE_ONLY_HTTPS: "HTTPS only" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Klavye kısayolları yardım" + TAB_MAILBOX: "Posta Kutusu" + TAB_MESSAGE_LIST: "Mesaj Listesi" + TAB_MESSAGE_VIEW: "Mesaj görünümü" + TAB_COMPOSE: "Oluştur" + LABEL_OPEN_USER_DROPDOWN: "Kullanıcı açılır pencresini aç" + LABEL_REPLY: "Yanıtla" + LABEL_REPLY_ALL: "Tümünü Yanıtla" + LABEL_FORWARD: "Yönlendir" + LABEL_FORWARD_MULTIPLY: "Yönlendir (çoklu)" + LABEL_HELP: "Yardım" + LABEL_CHECK_ALL: "Tüm mesajları seç" + LABEL_ARCHIVE: "Arşiv" + LABEL_DELETE: "Sil" + LABEL_OPEN_THREAD: "Open selected thread" + LABEL_MOVE: "Taşı" + LABEL_READ: "Seçili mesajları oku" + LABEL_UNREAD: "Seçili mesajları okuma" + LABEL_IMPORTANT: "Seçili işaretli mesajları içe aktar" + LABEL_SEARCH: "Arama" + LABEL_CANCEL_SEARCH: "Aramayı durdur" + LABEL_FULLSCREEN_ENTER: "Tam Ekran (Önizleme bölmesi düzeni)" + LABEL_VIEW_MESSAGE_ENTER: "Mesaj görünümü (Önizleme bölmesi taslağı bulunamadı)" + LABEL_SWITCH_TO_MESSAGE: "Görünen ile seçilen mesajı değiştir" + LABEL_SWITCH_TO_FOLDER_LIST: "Görüntülen ile klasör listesini değiştir" + LABEL_FULLSCREEN_TOGGLE: "Tam ekran modunu aç kapat" + LABEL_BLOCKQUOTES_TOGGLE: "Alıntılanan metni aç kapat" + LABEL_THREAD_NEXT: "Next message in thread" + LABEL_THREAD_PREV: "Previous message in thread" + LABEL_PRINT: "Yazdır" + LABEL_EXIT_FULLSCREEN: "Tam ekran modundan çık" + LABEL_CLOSE_MESSAGE: "Mesajı kapat (önizleme bölmedüzen taslağı bulunamadı)" + LABEL_SWITCH_TO_LIST: "Görüntülenen'den mesaj listesine geri dön" + LABEL_OPEN_COMPOSE_POPUP: "Yazma pencresini popup olarak aç" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Kimlik açılır pencresini aç" + LABEL_SAVE_MESSAGE: "Mesajı Kaydet" + LABEL_SEND_MESSAGE: "Mesajı Gönder" + LABEL_CLOSE_COMPOSE: "Oluşturulanı Kapat" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "Public key bulunamadı" + NO_PUBLIC_KEYS_FOUND_FOR: "Public key bulunamadı %EMAIL%" + NO_PRIVATE_KEY_FOUND: "Private key bulunamadı" + NO_PRIVATE_KEY_FOUND_FOR: "Private key bulunamadı %EMAIL%" + ADD_A_PUBLICK_KEY: "Add a public key" + SELECT_A_PRIVATE_KEY: "Özel anahtari seç" + UNVERIFIRED_SIGNATURE: "Doğrulanmamış imza" + DECRYPTION_ERROR: "OpenPGP çözme hatası" + GOOD_SIGNATURE: "Geçerli imza %USER%" + PGP_ERROR: "OpenPGP hatası: %ERROR%" + SPECIFY_FROM_EMAIL: "Lütfen bir gönderici belirtin" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "En az bir alıcı belirtin" + NOTIFICATIONS: + INVALID_TOKEN: "Geçersiz token" + AUTH_ERROR: "Kimlik doğrulama başarısız oldu" + ACCESS_ERROR: "Erişim hatası" + CONNECTION_ERROR: "Sunucuya bağlanılamadı" + CAPTCHA_ERROR: "Yanlış Güvenlik Kodu." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- + Bu, sosyal kimliği henüz herhangi bir e-posta hesabı için atanmadı.E-kimlik + bilgilerini kullanarak oturum ve hesap ayarlarında bu özelliği etkinleştirmek + ekleyin. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- + Bu, sosyal kimliği henüz herhangi bir e-posta hesabı için atanmadı.E-kimlik + bilgilerini kullanarak oturum ve hesap ayarlarında bu özelliği etkinleştirmek + ekleyin. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- + Bu, sosyal kimliği henüz herhangi bir e-posta hesabı için atanmadı.E-kimlik + bilgilerini kullanarak oturum ve hesap ayarlarında bu özelliği etkinleştirmek + ekleyin. + DOMAIN_NOT_ALLOWED: "Alan Adına izin verilmemiş" + ACCOUNT_NOT_ALLOWED: "Hesaba izin verilmemiş" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "İki Aşamalı Doğrulama Gerekiyor" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Tİki Aşamalı Doğrulama Hatası" + COULD_NOT_SAVE_NEW_PASSWORD: "Yeni Şifre Kaydedilemedi" + CURRENT_PASSWORD_INCORRECT: "Şimdiki şifreniz hatalı" + NEW_PASSWORD_SHORT: "Şifreniz çok kısa" + NEW_PASSWORD_WEAK: "Şifreniz çok kolay" + NEW_PASSWORD_FORBIDDENT: "Şifrenizde geçersiz karekterler bulunuyor" + CONTACTS_SYNC_ERROR: "Kişi listesi senkronizasyon hatası" + CANT_GET_MESSAGE_LIST: "Mesaj listesi alınamadı" + CANT_GET_MESSAGE: "Mesaj alınamadı" + CANT_DELETE_MESSAGE: "Mesaj silinemedi" + CANT_MOVE_MESSAGE: "Mesaj taşınamadı" + CANT_SAVE_MESSAGE: "Mesaj kaydedilemedi" + CANT_SEND_MESSAGE: "Mesaj gönderilemedi" + INVALID_RECIPIENTS: "Geçersiz alıcılar" + CANT_SAVE_FILTERS: "Can't save filters" + CANT_GET_FILTERS: "Can't get filters" + FILTERS_ARE_NOT_CORRECT: "Filters are not correct" + CANT_CREATE_FOLDER: "Klasör oluşturulamadı" + CANT_RENAME_FOLDER: "Klasör oluşturulamadı" + CANT_DELETE_FOLDER: "Klasör silimedi" + CANT_DELETE_NON_EMPTY_FOLDER: "Boş olmayan dizin silinemedi" + CANT_SUBSCRIBE_FOLDER: "Klasöre abone olunamadı" + CANT_UNSUBSCRIBE_FOLDER: "Klasör Aboneliğinden çıkılamadı" + CANT_SAVE_SETTINGS: "Ayarlar kaydedilemedi" + CANT_SAVE_PLUGIN_SETTINGS: "Ayarlar kaydedilemedi" + DOMAIN_ALREADY_EXISTS: "Alanadı bulunuyor" + CANT_INSTALL_PACKAGE: "Paket kurulamadı" + CANT_DELETE_PACKAGE: "Paket silinemedi" + INVALID_PLUGIN_PACKAGE: "Geçersiz eklenti paketi" + UNSUPPORTED_PLUGIN_PACKAGE: "Desteklenmeyen eklenti paketi" + LICENSING_SERVER_IS_UNAVAILABLE: "Abone sunucusu cevap vermiyor" + LICENSING_DOMAIN_EXPIRED: "Bu etki alanı için abonelik süresi doldu." + LICENSING_DOMAIN_BANNED: "Bu etki alanı için abonelik yasaklandı." + DEMO_SEND_MESSAGE_ERROR: "Güvenlik amacıyla, bu demo hesabı harici e-posta adreslerine mesaj göndermek için izin verilmez!" + DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" + ACCOUNT_ALREADY_EXISTS: "Hesap zaten var" + MAIL_SERVER_ERROR: "Posta sunucusuna erişirken bir hata oluştu" + INVALID_INPUT_ARGUMENT: "Invalid input argument" + UNKNOWN_ERROR: "Bilinmeyen Hata" + STATIC: + BACK_LINK: "Yenile" + DOMAIN_LIST_DESC: "Alanadı webmail listesi erişime izini." + PHP_EXSTENSIONS_ERROR_DESC: "Gerekli PHP eklentileri PHP yapılandırmasında mevcut değildir!" + PHP_VERSION_ERROR_DESC: "PHP sürümünüz (%VERSION%) en az php 5.3.0 sürümü gerekli!" + NO_SCRIPT_TITLE: "JavaScript bu uygulama için gereklidir." + NO_SCRIPT_DESC: | + JavaScript desteği tarayıcınızda mevcut değil. + Tarayıcı ayarlarında JavaScript desteğini etkinleştirin ve yeniden deneyin. + NO_COOKIE_TITLE: "Çerezler desteği bu uygulama için gerekli." + NO_COOKIE_DESC: | + Çerezler destek tarayıcınızda mevcut değil. + Tarayıcı ayarlarında Cookie desteği etkinleştirin ve yeniden deneyin. + BAD_BROWSER_TITLE: "Tarayıcınız çok eski." + BAD_BROWSER_DESC: | + Uygulamanın tüm özelliklerini kullanmak için, + Bu tarayıcılardan birini indirmek ve yükleyin: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/uk_UA.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/uk_UA.yml new file mode 100755 index 00000000..47eef352 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/uk_UA.yml @@ -0,0 +1,704 @@ +uk_UA: + LOGIN: + LABEL_EMAIL: "Пошта" + LABEL_LOGIN: "Логін" + LABEL_PASSWORD: "Пароль" + LABEL_SIGN_ME: "Запам'ятати мене" + LABEL_VERIFICATION_CODE: "Код підтвердження" + LABEL_DONT_ASK_VERIFICATION_CODE: "Не питати код на протязі 2-х тижнів" + BUTTON_SIGN_IN: "Увійти" + TITLE_SIGN_IN_GOOGLE: "Увійти, використовуючи Google" + TITLE_SIGN_IN_FACEBOOK: "Увійти, використовуючи Facebook" + TITLE_SIGN_IN_TWITTER: "Увійти, використовуючи Twitter" + LABEL_FORGOT_PASSWORD: "Забули пароль?" + LABEL_REGISTRATION: "Реєстрація" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "Додати ще акаунт" + BUTTON_SETTINGS: "Налаштування" + BUTTON_HELP: "Допомога" + BUTTON_LOGOUT: "Вийти" + MOBILE: + BUTTON_MOBILE_VERSION: "Мобільна версія" + BUTTON_DESKTOP_VERSION: "Повна версія" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "Пошук листів" + TITLE_ADV: "Розширений пошук листів" + LABEL_ADV_FROM: "Від" + LABEL_ADV_TO: "Кому" + LABEL_ADV_SUBJECT: "Тема" + LABEL_ADV_TEXT: "Текст" + LABEL_ADV_HAS_ATTACHMENT: "З файлами" + LABEL_ADV_HAS_ATTACHMENTS: "З файлами" + LABEL_ADV_FLAGGED: "Відмічені" + LABEL_ADV_UNSEEN: "Непрочитані" + LABEL_ADV_DATE: "Дата" + LABEL_ADV_DATE_ALL: "За весь час" + LABEL_ADV_DATE_3_DAYS: "За три дні" + LABEL_ADV_DATE_7_DAYS: "За тиждень" + LABEL_ADV_DATE_MONTH: "За місяць" + LABEL_ADV_DATE_3_MONTHS: "За 3 місяці" + LABEL_ADV_DATE_6_MONTHS: "За півроку" + LABEL_ADV_DATE_YEAR: "За рік" + BUTTON_ADV_SEARCH: "Шукати" + PREVIEW_POPUP: + FULLSCREEN: "Toggle fullscreen" + ZOOM: "Zoom in/out" + CLOSE: "Закрити (Esc)" + LOADING: "Завантаження..." + GALLERY_PREV: "Назад (Стрілка ←)" + GALLERY_NEXT: "Вперед (Стрілка →)" + GALLERY_COUNTER: "%curr% з %total%" + IMAGE_ERROR: "Зображення не завантажилося." + AJAX_ERROR: "Дані не завантажились." + FOLDER_LIST: + BUTTON_COMPOSE: "Написати" + BUTTON_CONTACTS: "Контакти" + INBOX_NAME: "Вхідні" + SENT_NAME: "Вихідні" + DRAFTS_NAME: "Чорновики" + SPAM_NAME: "Спам" + TRASH_NAME: "Кошик" + ARCHIVE_NAME: "Архів" + QUOTA: + TITLE: "Дискова квота" + MESSAGE_LIST: + BUTTON_RELOAD: "Оновити список листів" + BUTTON_MOVE_TO: "Перемістити" + BUTTON_DELETE: "Видалити" + BUTTON_ARCHIVE: "Архівувати" + BUTTON_SPAM: "В спам" + BUTTON_NOT_SPAM: "Не спам" + BUTTON_EMPTY_FOLDER: "Очистити всю папку" + BUTTON_MULTY_FORWARD: "Переслати як вкладення" + BUTTON_DELETE_WITHOUT_MOVE: "Видалити повз кошик" + BUTTON_MORE: "Ще" + MENU_SET_SEEN: "Відмітити як прочитане" + MENU_SET_ALL_SEEN: "Відмітити всі як прочитані" + MENU_UNSET_SEEN: "Відмітити як непрочитане" + MENU_SET_FLAG: "Встановити флаг" + MENU_UNSET_FLAG: "Зняти флаг" + MENU_SELECT_ALL: "Все" + MENU_SELECT_NONE: "Жодного" + MENU_SELECT_INVERT: "Інвертувати" + MENU_SELECT_UNSEEN: "Непрочитані" + MENU_SELECT_SEEN: "Прочитані" + MENU_SELECT_FLAGGED: "Відмічені" + MENU_SELECT_UNFLAGGED: "Без поміток" + EMPTY_LIST: "В папці немає листів." + EMPTY_SEARCH_LIST: "Листи не знайдено." + SEARCH_RESULT_FOR: "Результат пошуку \"%SEARCH%\"" + BACK_TO_MESSAGE_LIST: "повернутись до списку листів" + LIST_LOADING: "Завантаження" + EMPTY_SUBJECT_TEXT: "(Без теми)" + PUT_MESSAGE_HERE: "Киньте повідомлення сюди, щоб подивитися його в списку" + TODAY_AT: "сьогодні в %TIME%" + YESTERDAY_AT: "вчора в %TIME%" + SEARCH_PLACEHOLDER: "Пошук листів" + NEW_MESSAGE_NOTIFICATION: "У вас %COUNT% нових повідомлень!" + QUOTA_SIZE: "Використано %SIZE% (%PROC%%) з %LIMIT%" + MESSAGE: + BUTTON_EDIT: "Редагувати" + BUTTON_BACK: "Назад" + BUTTON_CLOSE: "Закрити" + BUTTON_DELETE: "Видалити" + BUTTON_ARCHIVE: "Архівувати" + BUTTON_SPAM: "В спам" + BUTTON_NOT_SPAM: "Не спам" + BUTTON_MOVE_TO: "Перемістити" + BUTTON_MORE: "Ще" + BUTTON_REPLY: "Відповісти на Листа" + BUTTON_REPLY_ALL: "Відповісти Всім" + BUTTON_FORWARD: "Переслати" + BUTTON_FORWARD_AS_ATTACHMENT: "Переслати як файл" + BUTTON_EDIT_AS_NEW: "Редагувати як нове" + BUTTON_SHOW_IMAGES: "Показати зовнішні зображення в листі" + BUTTON_NOTIFY_READ_RECEIPT: "Сповістити відправника про прочитання цього повідомлення." + BUTTON_IN_NEW_WINDOW: "В окремому вікні" + BUTTON_THREAD_LIST: "Листування" + BUTTON_THREAD_PREV: "Попереднє" + BUTTON_THREAD_NEXT: "Наступне" + BUTTON_THREAD_MORE: "ще листи" + MENU_HEADERS: "Подивитися заголовки" + MENU_VIEW_ORIGINAL: "Подивитися оригінал" + MENU_DOWNLOAD_ORIGINAL: "Завантажити як .eml файл" + MENU_FILTER_SIMILAR: "Фільтрувати схожі" + MENU_PRINT: "Надрукувати" + EMPTY_SUBJECT_TEXT: "(Без теми)" + LABEL_SUBJECT: "Тема" + LABEL_DATE: "Дата" + LABEL_FROM: "Від" + LABEL_FROM_SHORT: "від" + LABEL_TO: "Кому" + LABEL_TO_SHORT: "кому" + LABEL_CC: "Копія" + LABEL_BCC: "Прихована" + LABEL_REPLY_TO: "Reply-To" + PRINT_LABEL_FROM: "Від" + PRINT_LABEL_TO: "Кому" + PRINT_LABEL_CC: "Копія" + PRINT_LABEL_BCC: "Прихована" + PRINT_LABEL_REPLY_TO: "Reply-To" + PRINT_LABEL_DATE: "Дата" + PRINT_LABEL_SUBJECT: "Тема" + PRINT_LABEL_ATTACHMENTS: "Файли" + MESSAGE_LOADING: "Завантаження" + MESSAGE_VIEW_DESC: "Виберіть повідомлення для перегляду." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Пароль" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP підписане повідомлення (натисніть, щоб підтвердити)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP шифроване повідомлення (натисніть, щоб розшифрувати)" + LINK_DOWNLOAD_AS_ZIP: "Завантажити як zip" + LINK_SAVE_TO_OWNCLOUD: "Зберегти в ownCloud" + LINK_SAVE_TO_DROPBOX: "Зберегти в Dropbox" + READ_RECEIPT: + SUBJECT: "Сповіщення про прочитання цього повідомлення - %SUBJECT%" + BODY: | + Це сповіщення про прочитання для повідомлення, яке ви надіслали в адресу %READ-RECEIPT%. + + Примітка: Це сповіщення про прочитання означає лише, що повідомлення було відображено на машину отримувача. + Воно не гарантує, що отримувач прочитав чи зрозумів зміст повідомлення. + SUGGESTIONS: + SEARCHING_DESC: "Пошук..." + CONTACTS: + LEGEND_CONTACTS: "Контакти" + SEARCH_INPUT_PLACEHOLDER: "Пошук контактів" + BUTTON_ADD_CONTACT: "Додати контакт" + BUTTON_CREATE_CONTACT: "Зберегти" + BUTTON_UPDATE_CONTACT: "Оновити" + BUTTON_IMPORT: "Імпорт (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "Експорт (vcf, vCard)" + BUTTON_EXPORT_CSV: "Експорт (csv)" + ERROR_IMPORT_FILE: "Помилка імпорту (Неправильний формат файлу)" + LIST_LOADING: "Завантаження" + EMPTY_LIST: "Немає контактів" + EMPTY_SEARCH: "Контакти не знайдено" + CLEAR_SEARCH: "Очистити пошук" + CONTACT_VIEW_DESC: "Виберіть контакт для перегляду." + LABEL_DISPLAY_NAME: "Повне ім'я" + LABEL_EMAIL: "Електронна пошта" + LABEL_PHONE: "Телефон" + LABEL_WEB: "Сайт" + LABEL_BIRTHDAY: "День нарождення" + LINK_ADD_EMAIL: "Додайте адресу електронної пошти" + LINK_ADD_PHONE: "Додайте телефон" + LINK_BIRTHDAY: "День народження" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Введіть повне ім'я" + PLACEHOLDER_ENTER_LAST_NAME: "Введіть ім'я" + PLACEHOLDER_ENTER_FIRST_NAME: "Введіть прізвище" + PLACEHOLDER_ENTER_NICK_NAME: "Введіть нік" + LABEL_READ_ONLY: "Тільки читання" + LABEL_SHARE: "Поділитися" + ADD_MENU_LABEL: "Додати" + ADD_MENU_NICKNAME: "Нік" + ADD_MENU_NOTES: "Примітки" + ADD_MENU_EMAIL: "Пошту" + ADD_MENU_PHONE: "Телефон" + ADD_MENU_URL: "Сайт" + ADD_MENU_ADDRESS: "Адреса" + ADD_MENU_BIRTHDAY: "День народження" + ADD_MENU_TAGS: "Теги" + BUTTON_SHARE_NONE: "Відмінити" + BUTTON_SHARE_ALL: "Всім" + BUTTON_SYNC: "Синхронизація (CardDAV)" + COMPOSE: + TITLE_FROM: "Від" + TITLE_TO: "Кому" + TITLE_CC: "Копія" + TITLE_BCC: "Прихована" + TITLE_REPLY_TO: "Відповісти на" + TITLE_SUBJECT: "Тема" + LINK_SHOW_INPUTS: "Показати всі поля" + BUTTON_SEND: "Надіслати" + BUTTON_SAVE: "Зберегти" + BUTTON_DELETE: "Видалити" + BUTTON_CANCEL: "Відмінити" + BUTTON_MINIMIZE: "Minimize" + SAVED_TIME: "Збережено в %TIME%" + SAVED_ERROR_ON_SEND: "Повідомлення було надіслано, але не збережено" + DISCARD_UNSAVED_DATA: "Discard unsaved data?" + ATTACH_FILES: "Додати файли" + ATTACH_DROP_FILES_DESC: "Помістити файли сюди" + ATTACH_ITEM_CANCEL: "Відмінити" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% написав" + FORWARD_MESSAGE_TOP_TITLE: "-------- Переслане повідомлення -------" + FORWARD_MESSAGE_TOP_FROM: "Від" + FORWARD_MESSAGE_TOP_TO: "Кому" + FORWARD_MESSAGE_TOP_CC: "Копія" + FORWARD_MESSAGE_TOP_SENT: "Надіслано" + FORWARD_MESSAGE_TOP_SUBJECT: "Тема" + EMPTY_TO_ERROR_DESC: "Вкажіть як мінімум одного отримувача" + NO_ATTACHMENTS_HERE_DESC: "No attachments here." + ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet" + BUTTON_REQUEST_READ_RECEIPT: "Запит про прочитання листа" + BUTTON_MARK_AS_IMPORTANT: "Mark as important" + BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" + BUTTON_REQUEST_DSN: "Request a delivery receipt" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Закрити" + POPUPS_ASK: + BUTTON_YES: "Так" + BUTTON_NO: "Ні" + DESC_WANT_CLOSE_THIS_WINDOW: "Ви впевнені, що хочете закрити це вікно?" + DESC_WANT_DELETE_MESSAGES: "Ви впевнені, що хочете видалити повідомлення?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Виберіть мову" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "Додати ще акаунт?" + BUTTON_ADD_ACCOUNT: "Додати" + TITLE_UPDATE_ACCOUNT: "Update Account?" + BUTTON_UPDATE_ACCOUNT: "Update" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "Додати Профіль?" + TITLE_UPDATE_IDENTITY: "Оновити Профіль?" + BUTTON_ADD_IDENTITY: "Додати" + BUTTON_UPDATE_IDENTITY: "Оновити" + LABEL_EMAIL: "Пошта" + LABEL_NAME: "Ім'я" + LABEL_REPLY_TO: "Відповісти на" + LABEL_SIGNATURE: "Signature" + LABEL_CC: "Cc" + LABEL_BCC: "Прихована" + LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "Створити теку?" + LABEL_NAME: "Ім'я теки" + LABEL_PARENT: "Батьківська тека" + BUTTON_CREATE: "Створити" + BUTTON_CANCEL: "Відмінити" + BUTTON_CLOSE: "Закрити" + TITLE_CREATING_PROCESS: "Створення теки" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "Очистити теку від листів?" + BUTTON_CLEAR: "Очистити" + BUTTON_CANCEL: "Відмінити" + BUTTON_CLOSE: "Закрити" + DANGER_DESC_WARNING: "Увага!" + DANGER_DESC_HTML_1: "Ця дія призведе до повного видалення всіх листів з теки %FOLDER%." + DANGER_DESC_HTML_2: "Після початку очищення, процес неможливо буде зупинити чи відмінити." + TITLE_CLEARING_PROCESS: "Очищення теки..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "Імпорт OpenPGP ключа" + BUTTON_IMPORT_OPEN_PGP_KEY: "Імпорт" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "Перегляд OpenPGP ключа" + BUTTON_SELECT: "Вибрати" + BUTTON_CLOSE: "Закрити" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "Генерація OpenPGP ключа" + LABEL_EMAIL: "Пошта" + LABEL_NAME: "Ім'я" + LABEL_PASSWORD: "Пароль" + LABEL_KEY_BIT_LENGTH: "Довжина ключа" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Створити" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP підпис і шифрування" + LABEL_SIGN: "Підпис" + LABEL_ENCRYPT: "Шифрування" + LABEL_PASSWORD: "Пароль" + BUTTON_SIGN: "Підпис" + BUTTON_ENCRYPT: "Шифрування" + BUTTON_SIGN_AND_ENCRYPT: "Підпис и шифрування" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" + LABEL_KEY: "Private Key" + LABEL_PASSWORD: "Пароль" + BUTTON_DECRYPT: "Дешифрувати" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "Тест двофакторної верифікації" + LABEL_CODE: "Код" + BUTTON_TEST: "Тест" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Створити фільтер?" + TITLE_EDIT_FILTER: "Оновити фільтер?" + FILTER_NAME: "Им'я" + LEGEND_CONDITIONS: "Умови" + LEGEND_ACTIONS: "Дії" + BUTTON_DONE: "Зроблено" + BUTTON_ADD_CONDITION: "Додати умову" + SELECT_ACTION_NONE: "Нічого" + SELECT_ACTION_MOVE_TO: "Перемістити в" + SELECT_ACTION_FORWARD_TO: "Переслати до" + SELECT_ACTION_REJECT: "Відклонити" + SELECT_ACTION_VACATION_MESSAGE: "Повідомлення про відпустку" + SELECT_ACTION_DISCARD: "Відклонити" + SELECT_FIELD_FROM: "Від" + SELECT_FIELD_RECIPIENTS: "Отримувачі (To or CC)" + SELECT_FIELD_SUBJECT: "Тема" + SELECT_FIELD_HEADER: "Заголовок" + SELECT_FIELD_SIZE: "Розмір" + SELECT_TYPE_CONTAINS: "Містить" + SELECT_TYPE_NOT_CONTAINS: "Не містить" + SELECT_TYPE_MATCHES: "Matches (* and ? supported)" + SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" + SELECT_TYPE_REGEXP: "Regexp" + SELECT_TYPE_NOT_REGEXP: "Not Regexp" + SELECT_TYPE_EQUAL_TO: "Дорівнює" + SELECT_TYPE_NOT_EQUAL_TO: "Не дорівнює" + SELECT_TYPE_OVER: "Over" + SELECT_TYPE_UNDER: "Under" + SELECT_MATCH_ANY: "Matching any of the following rules" + SELECT_MATCH_ALL: "Matching all of the following rules" + MARK_AS_READ_LABEL: "Mark as read" + REPLY_INTERVAL_LABEL: "Reply interval (days)" + KEEP_LABEL: "Keep" + STOP_LABEL: "Don't stop processing rules" + EMAIL_LABEL: "Email" + VACATION_SUBJECT_LABEL: "Тема (не обов'язково)" + VACATION_MESSAGE_LABEL: "Повідомлення" + VACATION_RECIPIENTS_LABEL: "Отримувачі (розділяти комами)" + REJECT_MESSAGE_LABEL: "Відклонити повідомлення" + ALL_INCOMING_MESSAGES_DESC: "Всі повідомлення, що надійшли" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "Виберіть системні теки" + SELECT_CHOOSE_ONE: "Ще не вибрано" + SELECT_UNUSE_NAME: "Не використовувати" + LABEL_SENT: "Вихідні" + LABEL_DRAFTS: "Чорновики" + LABEL_SPAM: "Спам" + LABEL_TRASH: "Видалені" + LABEL_ARCHIVE: "Архів" + BUTTON_CANCEL: "Відмінити" + BUTTON_CLOSE: "Закрити" + NOTIFICATION_SENT: | + Ви ще не обрали системну теку "Вихідні", в яку складаються всі повідомлення післе надсилання. + Якщо ви не хочете зберігати вихідні листи, будь ласка, виберіть пункт "Не використовувати". + NOTIFICATION_DRAFTS: "Ви ще не обрали системну теку \"Чорновики\", в яку складаються всі збережені повідомлення." + NOTIFICATION_SPAM: | + Ви ще не обрали системну теку "Спам", в яку складаються всі спам повідомлення. + Якщо ви не хочете видаляти листи одразу, будь ласка, виберіть пункт "Не використовувати". + NOTIFICATION_TRASH: | + Ви ще не обрали системну теку "Удаленные", в яку складаються всі повідомлення після видалення. + Якщо ви не хочете видаляти листи одразу, будь ласка, виберіть пункт "Не використовувати". + NOTIFICATION_ARCHIVE: "Ви ще не обрали системну теку \"Архив\", в яку складаються всі повідомлення після архівації." + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "Двофакторна верификація" + LABEL_ENABLE_TWO_FACTOR: "Увімкнути двофакторну верифікацію" + LABEL_TWO_FACTOR_USER: "Користувач" + LABEL_TWO_FACTOR_STATUS: "Статус" + LABEL_TWO_FACTOR_SECRET: "Секретний ключ" + LABEL_TWO_FACTOR_BACKUP_CODES: "Резервні коди" + BUTTON_CREATE: "Створити новий секретний ключ" + BUTTON_ACTIVATE: "Activate" + BUTTON_CLEAR: "Очистити" + BUTTON_LOGOUT: "Logout" + BUTTON_DONE: "Done" + BUTTON_TEST: "Тест" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Показати секретний ключ" + BUTTON_HIDE_SECRET: "Приховати секретний ключ" + TWO_FACTOR_REQUIRE_DESC: "Ваш обліковий запис вимагає 2-факторну ідентифікацію" + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Налаштований" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Не налаштований" + TWO_FACTOR_SECRET_DESC: >- + Використовуйте цю інформацію для налаштування Google Authenticator клиенту + (чи іншого TOTP клиенту) за допомогою прикладеного QR-коду, чи вручну. + TWO_FACTOR_BACKUP_CODES_DESC: >- + Якщо Ви не можете отримати коди через Google Authenticator, ви можете використовувати + резервні коди, щоб увійти. Після того як Ви використали резервний код для + входу в систему, він стає неактивним. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Ви не можете змінити ці налаштування до тесту." + TITLES: + LOADING: "Завантаження" + LOGIN: "Вхід" + MAILBOX: "Пошта" + SETTINGS: "Налаштування" + COMPOSE: "Написати листа" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "Файл надто великий" + ERROR_FILE_PARTIALLY_UPLOADED: "Файл не завантажився повністю" + ERROR_NO_FILE_UPLOADED: "Файл не було завантажено" + ERROR_MISSING_TEMP_FOLDER: "Помилка при збереженні файлу" + ERROR_ON_SAVING_FILE: "Помилка при збереженні файлу" + ERROR_FILE_TYPE: "Неправильний тип файлу" + ERROR_UNKNOWN: "Помилка завантаження файлу" + EDITOR: + TEXT_SWITCHER_RICH_FORMATTING: "Форматований текст" + TEXT_SWITCHER_CONFIRM: "Форматування тексту і зображень будуть втрачені. Ви впевнені, що хочете продовжити?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "Персональні" + LABEL_GENERAL_NAME: "Основні" + LABEL_CONTACTS_NAME: "Контакти" + LABEL_FOLDERS_NAME: "Теки" + LABEL_ACCOUNTS_NAME: "Акаунти" + LABEL_IDENTITY_NAME: "Профіль" + LABEL_IDENTITIES_NAME: "Профілі" + LABEL_FILTERS_NAME: "Фильтры" + LABEL_TEMPLATES_NAME: "Templates" + LABEL_SECURITY_NAME: "Безпека" + LABEL_SOCIAL_NAME: "Соціальні" + LABEL_THEMES_NAME: "Теми" + LABEL_CHANGE_PASSWORD_NAME: "Пароль" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "Назад" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filters" + BUTTON_SAVE: "Save" + BUTTON_ADD_FILTER: "Add a Filter" + BUTTON_DELETE: "Delete" + BUTTON_RAW_SCRIPT: "Use Custom User Script" + SUBNAME_NONE: "None" + SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" + SUBNAME_REJECT: "Reject" + SUBNAME_VACATION_MESSAGE: "Повідомлення про відпустку" + SUBNAME_DISCARD: "Відклонити" + CAPABILITY_LABEL: "Capability" + LOADING_PROCESS: "Updating filter list" + DELETING_ASK: "Ви впевнені?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Ці зміни необхідно зберегти на сервер." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "Налаштування профілю" + LABEL_DISPLAY_NAME: "Ім'я" + LABEL_REPLY_TO: "Відповідати на" + LABEL_SIGNATURE: "Підпис" + LABEL_ADD_SIGNATURE_TO_ALL: "Додавати Ваш підпис до всіх вихідних повідомлень" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Безпека" + LABEL_CONFIGURE_TWO_FACTOR: "Налаштувати 2-факторну верифікацію" + LABEL_AUTOLOGOUT: "Автовихід" + AUTOLOGIN_NEVER_OPTION_NAME: "Ніколи" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "Основні налаштування" + LABEL_LANGUAGE: "Мова" + LABEL_IDENTITY: "Identity" + LABEL_LAYOUT: "Layout" + LABEL_LAYOUT_NO_SPLIT: "No Split" + LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" + LABEL_EDITOR: "Редактор тексту за змовчуванням" + LABEL_EDITOR_HTML: "Форматований" + LABEL_EDITOR_PLAIN: "Простий" + LABEL_EDITOR_HTML_FORCED: "Html (forced)" + LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" + LABEL_ANIMATION: "Анімація інтерфейсу" + LABEL_ANIMATION_FULL: "Повна" + LABEL_ANIMATION_NORMAL: "Нормальна" + LABEL_ANIMATION_NONE: "Відсутня" + LABEL_VIEW_OPTIONS: "Відображення" + LABEL_USE_PREVIEW_PANE: "Використовувати трьохколонний режим відображення" + LABEL_USE_CHECKBOXES_IN_LIST: "Показувати чекбокси у списках" + LABEL_USE_THREADS: "Згортати листи у листуваннях" + LABEL_REPLY_SAME_FOLDER: "Поміщати відповіді в ту ж теку, де знаходиться оригінал" + LABEL_SHOW_IMAGES: "Показувати зовнішні зображення в тілі листа без попередження" + LABEL_SHOW_ANIMATION: "Використовувати анімацію" + LABEL_MESSAGE_PER_PAGE: "Повідомлень на одній сторінці" + LABEL_NOTIFICATIONS: "Сповіщення" + LABEL_SOUND_NOTIFICATION: "Звукове сповіщення" + LABEL_CHROME_NOTIFICATION_DESC: "Показувати сповіщення про нові повідомлення у підказках" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Заблоковано браузером)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "Контакти" + LABEL_CONTACTS_AUTOSAVE: "Автоматично додавати отримувачів у адресну книгу" + LEGEND_CONTACTS_SYNC: "Синхронізація (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Увімкнути синхронизацію" + LABEL_CONTACTS_SYNC_SERVER: "Сервер" + LABEL_CONTACTS_SYNC_AB_URL: "Адресна книга (URL)" + LABEL_CONTACTS_SYNC_USER: "Користувач" + LABEL_CONTACTS_SYNC_PASSWORD: "Пароль" + SETTINGS_THEMES: + LEGEND_THEMES: "Теми Оформлення" + LEGEND_THEMES_CUSTOM: "Налаштування Користувацької Теми" + LABEL_CUSTOM_TYPE: "Тип Теми" + LABEL_CUSTOM_TYPE_LIGHT: "Світла" + LABEL_CUSTOM_TYPE_DARK: "Темна" + LABEL_CUSTOM_BACKGROUND_IMAGE: "Картинка на фоні" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Завантажити фонову картинку (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Файл надто великий" + ERROR_FILE_TYPE_ERROR: "Невірний тип файлу (тільки JPG и PNG)" + ERROR_UNKNOWN: "Помилка завантаження файлу" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "Підключити Google акаунт" + BUTTON_GOOGLE_DISCONNECT: "Відключити Google акаунт" + MAIN_GOOGLE_DESC: "Після підключення до Google ви зможете залогінітися в цей акаунт, використовуючи кнопку Google на екрані логіну." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "Підключити Facebook акаунт" + BUTTON_FACEBOOK_DISCONNECT: "Відключити Facebook акаунт" + MAIN_FACEBOOK_DESC: "Після підключення до Facebook ви зможете залогінітися в цей акаунт, використовуючи кнопку Facebook на екрані логіну." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "Підключити Twitter акаунт" + BUTTON_TWITTER_DISCONNECT: "Відключити Twitter акаунт" + MAIN_TWITTER_DESC: "Після підключення до Twitter ви зможете залогінітися в цей акаунт, використовуючи кнопку Twitter на екрані логіну." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "Список Тек" + BUTTON_CREATE: "Створити Теку" + BUTTON_SYSTEM: "Системні теки" + BUTTON_DELETE: "Видалити" + BUTTON_SUBSCRIBE: "Підписатися" + BUTTON_UNSUBSCRIBE: "Відписатися" + LOADING_PROCESS: "Оновлення списку тек" + CREATING_PROCESS: "Створення теки" + DELETING_PROCESS: "Видалення теки" + RENAMING_PROCESS: "Перейменування теки" + DELETING_ASK: "Впевнені?" + TO_MANY_FOLDERS_DESC_1: "You have too many folders!" + TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." + HELP_DELETE_FOLDER: "Видалити теку" + HELP_SHOW_HIDE_FOLDER: "Відобразити/приховати теку" + HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "Список акаунтів" + LEGEND_IDENTITIES: "Identities" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" + BUTTON_ADD_ACCOUNT: "Додати ще акаунт" + BUTTON_ADD_IDENTITY: "Add an Identity" + BUTTON_DELETE: "Видалити" + LOADING_PROCESS: "Оновлення списку акаунтів" + DELETING_ASK: "Впевнені?" + DEFAULT_IDENTITY_LABEL: "default" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "Налаштування основного профілю" + LEGEND_IDENTITIES: "Додаткові профілі" + LABEL_DEFAULT: "Default" + LABEL_DISPLAY_NAME: "Ім'я" + LABEL_REPLY_TO: "Відповідати на" + LABEL_SIGNATURE: "Підпис" + LABEL_ADD_SIGNATURE_TO_ALL: "Додавати Ваш підпис до всіх вихідних повідомлень" + BUTTON_ADD_IDENTITY: "Додати профіль" + BUTTON_DELETE: "Видалити" + LOADING_PROCESS: "Оновлення списку профілів" + DELETING_ASK: "Впевнені?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "Змінити Пароль" + LABEL_CURRENT_PASSWORD: "Порочний пароль" + LABEL_NEW_PASSWORD: "Новий пароль" + LABEL_REPEAT_PASSWORD: "Повторити" + BUTTON_UPDATE_PASSWORD: "Встановити Новий Пароль" + ERROR_PASSWORD_MISMATCH: "Паролі не співпадають, спробуйте ще раз" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "Імпортувати OpenPGP ключ" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Новий OpenPGP ключ" + TITLE_PRIVATE: "Приватний" + TITLE_PUBLIC: "Публічний" + DELETING_ASK: "Впевнені?" + GENERATE_ONLY_HTTPS: "тільки HTTPS" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Сполучення клавіш" + TAB_MAILBOX: "Пошта" + TAB_MESSAGE_LIST: "Список повідомлень" + TAB_MESSAGE_VIEW: "Перегляд повідомлень" + TAB_COMPOSE: "Написанні повідомлення" + LABEL_OPEN_USER_DROPDOWN: "Відкрити випадаючий список користувача" + LABEL_REPLY: "Відповісти" + LABEL_REPLY_ALL: "Відповісти всім" + LABEL_FORWARD: "Переслати" + LABEL_FORWARD_MULTIPLY: "Переслати всі вибрані повідомлення" + LABEL_HELP: "Допомога" + LABEL_CHECK_ALL: "Вибрати всі повідомлення" + LABEL_ARCHIVE: "Архівувати" + LABEL_DELETE: "Видалити" + LABEL_OPEN_THREAD: "Відкрити відмічене листування" + LABEL_MOVE: "Перемістити" + LABEL_READ: "Відмітити вибрані листи прочитаними" + LABEL_UNREAD: "Відмітити вибрані листи непрочитаними" + LABEL_IMPORTANT: "Відпітити вибрані листи як важливі" + LABEL_SEARCH: "Пошук" + LABEL_CANCEL_SEARCH: "Відмінити пошук" + LABEL_FULLSCREEN_ENTER: "Повноекранний режим" + LABEL_VIEW_MESSAGE_ENTER: "Перегляд повідомлення" + LABEL_SWITCH_TO_MESSAGE: "Переключити фокус на вибране повідомлення" + LABEL_SWITCH_TO_FOLDER_LIST: "Переключити фокус на список тек" + LABEL_FULLSCREEN_TOGGLE: "Переключити повноекранний режим" + LABEL_BLOCKQUOTES_TOGGLE: "Перемикання видимості цитат у листі" + LABEL_THREAD_NEXT: "Наступний лист у листуванні" + LABEL_THREAD_PREV: "Попередній лист у листуванні" + LABEL_PRINT: "Надрукувати" + LABEL_EXIT_FULLSCREEN: "Вийти з повноекранного режиму" + LABEL_CLOSE_MESSAGE: "Закрити повідомлення" + LABEL_SWITCH_TO_LIST: "Переключити фокус на список листів" + LABEL_OPEN_COMPOSE_POPUP: "Написати листа" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Вибрати відправника" + LABEL_SAVE_MESSAGE: "Зберегти повідомлення" + LABEL_SEND_MESSAGE: "Надіслати повідомлення" + LABEL_CLOSE_COMPOSE: "Закрити повідомлення" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "Публічні ключі не знайдено" + NO_PUBLIC_KEYS_FOUND_FOR: "Публічні ключі для \"%EMAIL%\" не знайдено" + NO_PRIVATE_KEY_FOUND: "Приватний ключ не знайдено" + NO_PRIVATE_KEY_FOUND_FOR: "Приватний ключ для \"%EMAIL%\" не знайдено" + ADD_A_PUBLICK_KEY: "Add a public key" + UNVERIFIRED_SIGNATURE: "Непідтверджена сигнатура" + DECRYPTION_ERROR: "OpenPGP помилка розшифрування" + GOOD_SIGNATURE: "Підтверджена сигнатура для %USER%" + PGP_ERROR: "OpenPGP помилка: %ERROR%" + SPECIFY_FROM_EMAIL: "Вкажіть поштову адресу відправника" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Вкажіть як мінімум одного отримувача" + NOTIFICATIONS: + INVALID_TOKEN: "Невірний токен запиту" + AUTH_ERROR: "Не вдалося авторизуватися" + ACCESS_ERROR: "Помилка доступу" + CONNECTION_ERROR: "Помилка з'єднання з сервером." + CAPTCHA_ERROR: "Неправильне перевірочне слово." + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + До даного соціального користувача ще не прикріплений поштовий акаунт. Увійдіть + у систему під своїм поштовим акаунтом і включіть цю можливість у налаштуваннях. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + До даного соціального користувача ще не прикріплений поштовий акаунт. Увійдіть + у систему під своїм поштовим акаунтом і включіть цю можливість у налаштуваннях. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + До даного соціального користувача ще не прикріплений поштовий акаунт. Увійдіть + у систему під своїм поштовим акаунтом і включіть цю можливість у налаштуваннях. + DOMAIN_NOT_ALLOWED: "Цей домен заборонений" + ACCOUNT_NOT_ALLOWED: "Цей акаунт заборонений" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Необхідна двофакторна верификація" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Помилка двофакторної верифікації" + COULD_NOT_SAVE_NEW_PASSWORD: "Не вдалося зберегти новий пароль" + CURRENT_PASSWORD_INCORRECT: "Поточний пароль є хибним" + NEW_PASSWORD_SHORT: "Пароль надто короткий" + NEW_PASSWORD_WEAK: "Пароль надто простий" + NEW_PASSWORD_FORBIDDENT: "Пароль містить заборонені символи" + CONTACTS_SYNC_ERROR: "Помилка синхронізації контактів" + CANT_GET_MESSAGE_LIST: "Не можу отримати список листів" + CANT_GET_MESSAGE: "Не можу отримати листа" + CANT_DELETE_MESSAGE: "Не можу видалити листа" + CANT_MOVE_MESSAGE: "Не можу перемістити листа" + CANT_SAVE_MESSAGE: "Не можу зберегти листа" + CANT_SEND_MESSAGE: "Не можу відправити листа" + INVALID_RECIPIENTS: "Перевірити правильність вводу всіх адрес." + CANT_SAVE_FILTERS: "Не можу зберегти фільтри" + CANT_GET_FILTERS: "Can't get filters" + FILTERS_ARE_NOT_CORRECT: "Filters are not correct" + CANT_CREATE_FOLDER: "Не можу створити теку" + CANT_RENAME_FOLDER: "Не можу перейменувати теку" + CANT_DELETE_FOLDER: "Не можу видалити теку" + CANT_DELETE_NON_EMPTY_FOLDER: "Не можу видалити не порожню теку" + CANT_SUBSCRIBE_FOLDER: "Не можу підписати теку" + CANT_UNSUBSCRIBE_FOLDER: "Не можу відписати теку" + CANT_SAVE_SETTINGS: "Не можу зберегти налаштування" + CANT_SAVE_PLUGIN_SETTINGS: "Не можу зберегти налаштування" + DOMAIN_ALREADY_EXISTS: "Домен вже існує" + CANT_INSTALL_PACKAGE: "Помилка встановлення пакету" + CANT_DELETE_PACKAGE: "Помилка видалення пакету" + INVALID_PLUGIN_PACKAGE: "Помилка пакету плагіну" + UNSUPPORTED_PLUGIN_PACKAGE: "Для роботи плагину необхідна повна підтримка серверу" + LICENSING_SERVER_IS_UNAVAILABLE: "Сервер підписок тимчасово не доступний." + LICENSING_DOMAIN_EXPIRED: "Підписка на цей домен застаріла." + LICENSING_DOMAIN_BANNED: "Підписка на цей домен заблокована." + DEMO_SEND_MESSAGE_ERROR: "Демо акаунту надсилання листів на зовнішні поштові адреси заборонена!" + DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" + ACCOUNT_ALREADY_EXISTS: "акаунт вже додано" + MAIL_SERVER_ERROR: "Помилка доступу до поштового серверу" + INVALID_INPUT_ARGUMENT: "Invalid input argument" + UNKNOWN_ERROR: "Невідома помилка" + STATIC: + BACK_LINK: "Оновити" + DOMAIN_LIST_DESC: "Список доменів, до яких дозволено доступ через веб пошту." + PHP_EXSTENSIONS_ERROR_DESC: "Необхідні розширення PHP не встановлені на вашому сервері!" + PHP_VERSION_ERROR_DESC: "Ваша версія PHP (%VERSION%) нижче потрібної 5.3.0!" + NO_SCRIPT_TITLE: "Для роботи додатку необхідний JavaScript." + NO_SCRIPT_DESC: | + Здається, JavaScript або не підтримується вашим браузером, або вимкнений. + Увімкніть JavaScript, змінив налаштівання браузера, і спробуйте знову. + NO_COOKIE_TITLE: "Для роботи додатку необхідні Cookie." + NO_COOKIE_DESC: | + Здається, Cookie або не підтримуються вашим браузером, або вимкнені. + Увімкніть Cookie, змінив налаштівання браузера, і спробуйте знову. + BAD_BROWSER_TITLE: "Ваш браузер застарів." + BAD_BROWSER_DESC: | + Щоб використовувати всі можливості додатку, + завантажте і встановіть один з цих браузерів diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/zh_CN.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/zh_CN.yml new file mode 100755 index 00000000..3acbc26d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/zh_CN.yml @@ -0,0 +1,708 @@ +zh_CN: + LOGIN: + LABEL_EMAIL: "邮箱" + LABEL_LOGIN: "登入" + LABEL_PASSWORD: "密码" + LABEL_SIGN_ME: "记住我" + LABEL_VERIFICATION_CODE: "验证码" + LABEL_DONT_ASK_VERIFICATION_CODE: "在两周内不再询问密码" + BUTTON_SIGN_IN: "登陆" + TITLE_SIGN_IN_GOOGLE: "使用Google帐号登陆" + TITLE_SIGN_IN_FACEBOOK: "使用Facebook帐号登陆" + TITLE_SIGN_IN_TWITTER: "使用Twitter帐号登陆" + LABEL_FORGOT_PASSWORD: "忘记密码" + LABEL_REGISTRATION: "注册" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "添加账户" + BUTTON_SETTINGS: "设置" + BUTTON_HELP: "帮助" + BUTTON_LOGOUT: "注销" + MOBILE: + BUTTON_MOBILE_VERSION: "移动端版本" + BUTTON_DESKTOP_VERSION: "桌面端版本" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "搜索" + TITLE_ADV: "高级搜索" + LABEL_ADV_FROM: "发送自" + LABEL_ADV_TO: "发送到" + LABEL_ADV_SUBJECT: "主题" + LABEL_ADV_TEXT: "内容" + LABEL_ADV_HAS_ATTACHMENT: "带有附件" + LABEL_ADV_HAS_ATTACHMENTS: "有附件" + LABEL_ADV_FLAGGED: "标记" + LABEL_ADV_UNSEEN: "不可见" + LABEL_ADV_DATE: "日期" + LABEL_ADV_DATE_ALL: "所有邮件" + LABEL_ADV_DATE_3_DAYS: "3天以内" + LABEL_ADV_DATE_7_DAYS: "1周以内" + LABEL_ADV_DATE_MONTH: "1月以内" + LABEL_ADV_DATE_3_MONTHS: "3月以内" + LABEL_ADV_DATE_6_MONTHS: "半年以内" + LABEL_ADV_DATE_YEAR: "1年以内" + BUTTON_ADV_SEARCH: "搜索" + PREVIEW_POPUP: + FULLSCREEN: "切换全屏" + ZOOM: "放大/缩小" + CLOSE: "关闭 (Esc)" + LOADING: "加载..." + GALLERY_PREV: "向前 (左箭头键)" + GALLERY_NEXT: "向后 (右箭头键)" + GALLERY_COUNTER: "%curr% / %total%" + IMAGE_ERROR: "图片 无法加载。" + AJAX_ERROR: "内容 无法加载。" + FOLDER_LIST: + BUTTON_COMPOSE: "写邮件" + BUTTON_CONTACTS: "联系人" + BUTTON_NEW_MESSAGE: "新信息" + INBOX_NAME: "收件箱" + SENT_NAME: "已发邮件" + DRAFTS_NAME: "草稿" + SPAM_NAME: "垃圾邮件" + TRASH_NAME: "已删除邮件" + ARCHIVE_NAME: "存档" + QUOTA: + TITLE: "存储空间使用量" + MESSAGE_LIST: + BUTTON_RELOAD: "重新加载邮件列表" + BUTTON_MOVE_TO: "移至" + BUTTON_DELETE: "已删除邮件" + BUTTON_ARCHIVE: "存档" + BUTTON_SPAM: "垃圾邮件" + BUTTON_NOT_SPAM: "不是垃圾邮件" + BUTTON_EMPTY_FOLDER: "清空文件夹" + BUTTON_MULTY_FORWARD: "转发邮件" + BUTTON_DELETE_WITHOUT_MOVE: "永久删除" + BUTTON_MORE: "更多" + MENU_SET_SEEN: "标记为已读" + MENU_SET_ALL_SEEN: "标记全部为已读" + MENU_UNSET_SEEN: "标记为未读" + MENU_SET_FLAG: "加注星标" + MENU_UNSET_FLAG: "移除星标" + MENU_SELECT_ALL: "全部" + MENU_SELECT_NONE: "无" + MENU_SELECT_INVERT: "选择" + MENU_SELECT_UNSEEN: "未读" + MENU_SELECT_SEEN: "已读" + MENU_SELECT_FLAGGED: "已加星标" + MENU_SELECT_UNFLAGGED: "未加星标" + EMPTY_LIST: "空列表。" + EMPTY_SEARCH_LIST: "未找到您想要的。" + SEARCH_RESULT_FOR: "搜索 \"%SEARCH%\" 的结果" + BACK_TO_MESSAGE_LIST: "回到信息列表" + LIST_LOADING: "加载中" + EMPTY_SUBJECT_TEXT: "(无主题)" + PUT_MESSAGE_HERE: "在这里查看邮件" + TODAY_AT: "今日于 %TIME%" + YESTERDAY_AT: "昨天 %TIME%" + SEARCH_PLACEHOLDER: "搜索" + NEW_MESSAGE_NOTIFICATION: "您有 %COUNT% 封新邮件!" + QUOTA_SIZE: "使用了%LIMIT% 存储空间中的%SIZE% (%PROC%%)" + MESSAGE: + BUTTON_EDIT: "编辑" + BUTTON_BACK: "返回" + BUTTON_CLOSE: "关闭" + BUTTON_DELETE: "删除" + BUTTON_UNSUBSCRIBE: "从此列表取消订阅" + BUTTON_ARCHIVE: "存档" + BUTTON_SPAM: "垃圾邮件" + BUTTON_NOT_SPAM: "不是垃圾邮件" + BUTTON_MOVE_TO: "移至" + BUTTON_MORE: "更多" + BUTTON_REPLY: "回复" + BUTTON_REPLY_ALL: "全部回复" + BUTTON_FORWARD: "转发" + BUTTON_FORWARD_AS_ATTACHMENT: "带附件转发" + BUTTON_EDIT_AS_NEW: "Edit as New" + BUTTON_SHOW_IMAGES: "显示外部图片" + BUTTON_NOTIFY_READ_RECEIPT: "发送人请求您发送阅读回执。" + BUTTON_IN_NEW_WINDOW: "在新窗口中查看" + BUTTON_THREAD_LIST: "Thread list" + BUTTON_THREAD_PREV: "上一页" + BUTTON_THREAD_NEXT: "下一页" + BUTTON_THREAD_MORE: "更多信息" + MENU_HEADERS: "显示详细信息" + MENU_VIEW_ORIGINAL: "显示原始内容" + MENU_DOWNLOAD_ORIGINAL: "作为 .eml 文件下载" + MENU_FILTER_SIMILAR: "筛选类似邮件" + MENU_PRINT: "打印邮件" + EMPTY_SUBJECT_TEXT: "(无主题)" + LABEL_SUBJECT: "主题" + LABEL_DATE: "日期" + LABEL_FROM: "发送自" + LABEL_FROM_SHORT: "from" + LABEL_TO: "发送到" + LABEL_TO_SHORT: "to" + LABEL_CC: "抄送" + LABEL_BCC: "密送" + LABEL_REPLY_TO: "回复" + PRINT_LABEL_FROM: "发送自" + PRINT_LABEL_TO: "发送到" + PRINT_LABEL_CC: "抄送" + PRINT_LABEL_BCC: "密送" + PRINT_LABEL_REPLY_TO: "回复" + PRINT_LABEL_DATE: "日期" + PRINT_LABEL_SUBJECT: "主题" + PRINT_LABEL_ATTACHMENTS: "附件" + MESSAGE_LOADING: "加载中" + MESSAGE_VIEW_DESC: "在此查看列表中选中的邮件。" + PGP_PASSWORD_INPUT_PLACEHOLDER: "密码" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" + LINK_DOWNLOAD_AS_ZIP: "下载为zip压缩包" + LINK_SAVE_TO_OWNCLOUD: "保存到ownCloud" + LINK_SAVE_TO_DROPBOX: "保存到Dropbox" + READ_RECEIPT: + SUBJECT: "妥投回执 - %SUBJECT%" + BODY: | + 本回执表示您发送给 %READ-RECEIPT% 的邮件已妥投。 + + 注意:本回执仅意味着邮件已妥投并已在收件人的电脑中出示过,但并不能保证收件人已阅读或已明白邮件内容。 + SUGGESTIONS: + SEARCHING_DESC: "搜索中..." + CONTACTS: + LEGEND_CONTACTS: "联系人" + SEARCH_INPUT_PLACEHOLDER: "搜索" + BUTTON_ADD_CONTACT: "添加联系人" + BUTTON_CREATE_CONTACT: "新增联系人" + BUTTON_UPDATE_CONTACT: "更新联系人" + BUTTON_IMPORT: "导入 (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "导出 (vcf, vCard)" + BUTTON_EXPORT_CSV: "导出 (csv)" + ERROR_IMPORT_FILE: "导入错误 (invalid file format)" + LIST_LOADING: "加载中" + EMPTY_LIST: "暂无联系人" + EMPTY_SEARCH: "没找到联系人" + CLEAR_SEARCH: "清除搜索" + CONTACT_VIEW_DESC: "在此查看在列表中选中的联系人。" + LABEL_DISPLAY_NAME: "显示名字" + LABEL_EMAIL: "邮箱" + LABEL_PHONE: "电话" + LABEL_WEB: "网站" + LABEL_BIRTHDAY: "生日" + LINK_ADD_EMAIL: "添加 Email 地址" + LINK_ADD_PHONE: "添加电话" + LINK_BIRTHDAY: "生日" + PLACEHOLDER_ENTER_DISPLAY_NAME: "显示名称" + PLACEHOLDER_ENTER_LAST_NAME: "姓" + PLACEHOLDER_ENTER_FIRST_NAME: "名" + PLACEHOLDER_ENTER_NICK_NAME: "昵称" + LABEL_READ_ONLY: "只读" + LABEL_SHARE: "分享" + ADD_MENU_LABEL: "添加" + ADD_MENU_NICKNAME: "昵称" + ADD_MENU_NOTES: "笔记" + ADD_MENU_EMAIL: "邮箱" + ADD_MENU_PHONE: "电话" + ADD_MENU_URL: "网址" + ADD_MENU_ADDRESS: "地址" + ADD_MENU_BIRTHDAY: "生日" + ADD_MENU_TAGS: "标签" + BUTTON_SHARE_NONE: "无" + BUTTON_SHARE_ALL: "所有人" + BUTTON_SYNC: "同步 (CardDAV)" + COMPOSE: + TITLE_FROM: "发送自" + TITLE_TO: "发送到" + TITLE_CC: "抄送" + TITLE_BCC: "密送" + TITLE_REPLY_TO: "回复" + TITLE_SUBJECT: "主题" + LINK_SHOW_INPUTS: "显示所有信息" + BUTTON_SEND: "发送" + BUTTON_SAVE: "保存" + BUTTON_DELETE: "删除" + BUTTON_CANCEL: "取消" + BUTTON_MINIMIZE: "最小化" + SAVED_TIME: "保存于 %TIME%" + SAVED_ERROR_ON_SEND: "邮件已发送但并未保存在已发邮件列表中。" + DISCARD_UNSAVED_DATA: "放弃未保存的数据?" + ATTACH_FILES: "添加附件" + ATTACH_DROP_FILES_DESC: "拖动文件至此" + ATTACH_ITEM_CANCEL: "取消" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% 写到" + FORWARD_MESSAGE_TOP_TITLE: "-------- 转发邮件 -------" + FORWARD_MESSAGE_TOP_FROM: "发送自" + FORWARD_MESSAGE_TOP_TO: "发送到" + FORWARD_MESSAGE_TOP_CC: "抄送" + FORWARD_MESSAGE_TOP_SENT: "发送" + FORWARD_MESSAGE_TOP_SUBJECT: "主题" + EMPTY_TO_ERROR_DESC: "请至少选择一位接收人" + NO_ATTACHMENTS_HERE_DESC: "无附件。" + ATTACHMENTS_ERROR_DESC: "注意!还有正在上传的附件。" + ATTACHMENTS_UPLOAD_ERROR_DESC: "还有附件正在上传" + BUTTON_REQUEST_READ_RECEIPT: "要求阅读回执" + BUTTON_MARK_AS_IMPORTANT: "标记为“重要”" + BUTTON_OPEN_PGP: "OpenPGP (仅限普通文本)" + BUTTON_REQUEST_DSN: "要求妥投回执" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "关闭" + POPUPS_ASK: + BUTTON_YES: "是" + BUTTON_NO: "否" + DESC_WANT_CLOSE_THIS_WINDOW: "你确定要关闭此窗口吗?" + DESC_WANT_DELETE_MESSAGES: "你确定你要删除这条消息吗?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "选择语言" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "添加账户?" + BUTTON_ADD_ACCOUNT: "添加" + TITLE_UPDATE_ACCOUNT: "更新账户?" + BUTTON_UPDATE_ACCOUNT: "更新" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "添加签名?" + TITLE_UPDATE_IDENTITY: "更新签名?" + BUTTON_ADD_IDENTITY: "添加" + BUTTON_UPDATE_IDENTITY: "更新" + LABEL_EMAIL: "邮箱" + LABEL_NAME: "姓名" + LABEL_REPLY_TO: "回复" + LABEL_SIGNATURE: "签名" + LABEL_CC: "Cc" + LABEL_BCC: "密送" + LABEL_SIGNATURE_INSERT_BEFORE: "在回信中插入签名再引用来信。" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "创建文件夹?" + LABEL_NAME: "文件夹名称" + LABEL_PARENT: "父文件夹" + BUTTON_CREATE: "创建" + BUTTON_CANCEL: "取消" + BUTTON_CLOSE: "关闭" + TITLE_CREATING_PROCESS: "文件夹创建中" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "清理文件夹中所有邮件?" + BUTTON_CLEAR: "清理" + BUTTON_CANCEL: "取消" + BUTTON_CLOSE: "关闭" + DANGER_DESC_WARNING: "警告!" + DANGER_DESC_HTML_1: "此操作将完全删除文件夹 %FOLDER% 中的所有邮件!" + DANGER_DESC_HTML_2: "一旦操作执行,不可中断和撤销!" + TITLE_CLEARING_PROCESS: "文件夹清理中..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "导入 OpenPGP 密匙" + BUTTON_IMPORT_OPEN_PGP_KEY: "导入" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "查看 OpenPGP 密匙" + BUTTON_SELECT: "选择" + BUTTON_CLOSE: "关闭" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "生成 OpenPGP 密匙" + LABEL_EMAIL: "邮箱" + LABEL_NAME: "名字" + LABEL_PASSWORD: "密码" + LABEL_KEY_BIT_LENGTH: "密匙长度" + BUTTON_GENERATE_OPEN_PGP_KEYS: "生成" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP 签名/加密" + LABEL_SIGN: "签名" + LABEL_ENCRYPT: "加密" + LABEL_PASSWORD: "密码" + BUTTON_SIGN: "签名" + BUTTON_ENCRYPT: "加密" + BUTTON_SIGN_AND_ENCRYPT: "签名加密" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP 解密" + LABEL_KEY: "私钥" + LABEL_PASSWORD: "密码" + BUTTON_DECRYPT: "解密" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "两步验证测试" + LABEL_CODE: "代码" + BUTTON_TEST: "测试" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "创建筛选条件?" + TITLE_EDIT_FILTER: "更新筛选条件?" + FILTER_NAME: "名字" + LEGEND_CONDITIONS: "条件" + LEGEND_ACTIONS: "操作" + BUTTON_DONE: "完成" + BUTTON_ADD_CONDITION: "添加条件" + SELECT_ACTION_NONE: "无操作" + SELECT_ACTION_MOVE_TO: "移动到" + SELECT_ACTION_FORWARD_TO: "转发到" + SELECT_ACTION_REJECT: "拒收" + SELECT_ACTION_VACATION_MESSAGE: "假期自动回复" + SELECT_ACTION_DISCARD: "取消" + SELECT_FIELD_FROM: "发送自" + SELECT_FIELD_RECIPIENTS: "接收人 (To 或 CC)" + SELECT_FIELD_SUBJECT: "主题" + SELECT_FIELD_HEADER: "标题" + SELECT_FIELD_SIZE: "大小" + SELECT_TYPE_CONTAINS: "包含" + SELECT_TYPE_NOT_CONTAINS: "不包含" + SELECT_TYPE_MATCHES: "满足条件 (可用通配符 * 或 ?)" + SELECT_TYPE_NOT_MATCHES: "不满足条件 (可用通配符 * and ?)" + SELECT_TYPE_REGEXP: "正则表达式" + SELECT_TYPE_NOT_REGEXP: "无正则表达式" + SELECT_TYPE_EQUAL_TO: "等于" + SELECT_TYPE_NOT_EQUAL_TO: "不等于" + SELECT_TYPE_OVER: "超过" + SELECT_TYPE_UNDER: "不超过" + SELECT_MATCH_ANY: "满足下列任何条件" + SELECT_MATCH_ALL: "满足下列所有条件" + MARK_AS_READ_LABEL: "标记为已读" + REPLY_INTERVAL_LABEL: "答复间隔 (天) " + KEEP_LABEL: "Keep" + STOP_LABEL: "Don't stop processing rules" + EMAIL_LABEL: "Email" + VACATION_SUBJECT_LABEL: "Subject (optional)" + VACATION_MESSAGE_LABEL: "Message" + VACATION_RECIPIENTS_LABEL: "收件人 (半角逗号“,”分隔)" + REJECT_MESSAGE_LABEL: "拒收邮件" + ALL_INCOMING_MESSAGES_DESC: "所有来信" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "选择系统文件夹" + SELECT_CHOOSE_ONE: "选择一个" + SELECT_UNUSE_NAME: "不使用" + LABEL_SENT: "已发邮件" + LABEL_DRAFTS: "草稿" + LABEL_SPAM: "垃圾邮件" + LABEL_TRASH: "已删除邮件" + LABEL_ARCHIVE: "存档" + BUTTON_CANCEL: "取消" + BUTTON_CLOSE: "关闭" + NOTIFICATION_SENT: | + 您没有选择 已发邮件 文件夹来存储已发送邮件。 + 如果您不希望保存已发邮件,请选择 不使用 选项。 + NOTIFICATION_DRAFTS: "您没有选择 草稿 文件夹来存储邮件草稿。" + NOTIFICATION_SPAM: | + 您没有选择 垃圾邮件 文件夹来存储垃圾邮件。 + 如果您希望永久删除邮件,请选择 不使用 选项。 + NOTIFICATION_TRASH: | + 您没有选择 已删除邮件 文件夹来存储垃圾邮件。 + 如果您希望永久删除邮件,请选择 不使用 选项。 + NOTIFICATION_ARCHIVE: "您没有选择“已归档邮件”文件夹来存储归档邮件。" + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "两步验证" + LABEL_ENABLE_TWO_FACTOR: "启用两步验证" + LABEL_TWO_FACTOR_USER: "用户" + LABEL_TWO_FACTOR_STATUS: "状态" + LABEL_TWO_FACTOR_SECRET: "密钥" + LABEL_TWO_FACTOR_BACKUP_CODES: "备份代码" + BUTTON_CREATE: "创建新密钥" + BUTTON_ACTIVATE: "已启用" + BUTTON_CLEAR: "清除" + BUTTON_LOGOUT: "登出" + BUTTON_DONE: "完成" + BUTTON_TEST: "测试" + LINK_TEST: "测试" + BUTTON_SHOW_SECRET: "显示密钥" + BUTTON_HIDE_SECRET: "隐藏密钥" + TWO_FACTOR_REQUIRE_DESC: "您的账户需要设置两步验证。" + TWO_FACTOR_SECRET_CONFIGURED_DESC: "已设置" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "未设置" + TWO_FACTOR_SECRET_DESC: >- + Import this info into your Google Authenticator client (or other TOTP client) + using the provided QR code below or by entering the code manually. + TWO_FACTOR_BACKUP_CODES_DESC: >- + If you can't receive codes via Google Authenticator, you can use backup codes + to sign in. After you’ve used a backup code to sign in, it will become inactive. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." + TITLES: + LOADING: "加载中" + LOGIN: "登陆" + MAILBOX: "邮箱" + SETTINGS: "设置" + COMPOSE: "写邮件" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "文件太大" + ERROR_FILE_PARTIALLY_UPLOADED: "遭遇未知错误,文件部分上传" + ERROR_NO_FILE_UPLOADED: "没有文件上传" + ERROR_MISSING_TEMP_FOLDER: "临时文件丢失" + ERROR_ON_SAVING_FILE: "遭遇未知错误" + ERROR_FILE_TYPE: "无效文件类型" + ERROR_UNKNOWN: "未知文件上传错误" + EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" + TEXT_SWITCHER_RICH_FORMATTING: "富文本" + TEXT_SWITCHER_CONFIRM: "文件格式及图片将丢失,您确定继续这么做?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "个人" + LABEL_GENERAL_NAME: "一般设置" + LABEL_CONTACTS_NAME: "联系人" + LABEL_FOLDERS_NAME: "文件夹" + LABEL_ACCOUNTS_NAME: "账户" + LABEL_IDENTITY_NAME: "签名" + LABEL_IDENTITIES_NAME: "签名" + LABEL_FILTERS_NAME: "筛选条件" + LABEL_TEMPLATES_NAME: "模版" + LABEL_SECURITY_NAME: "安全" + LABEL_SOCIAL_NAME: "社交" + LABEL_THEMES_NAME: "主题" + LABEL_CHANGE_PASSWORD_NAME: "密码" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "返回" + SETTINGS_FILTERS: + LEGEND_FILTERS: "筛选器" + BUTTON_SAVE: "保存" + BUTTON_ADD_FILTER: "添加筛选条件" + BUTTON_DELETE: "删除" + BUTTON_RAW_SCRIPT: "使用自定义脚本" + SUBNAME_NONE: "无" + SUBNAME_MOVE_TO: "移动到 \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "转发到 \"%EMAIL%\"" + SUBNAME_REJECT: "拒绝" + SUBNAME_VACATION_MESSAGE: "假期自动回复" + SUBNAME_DISCARD: "取消" + CAPABILITY_LABEL: "Capability" + LOADING_PROCESS: "正在更新筛选规则列表" + DELETING_ASK: "确定删除?" + CHACHES_NEED_TO_BE_SAVED_DESC: "这些更改需要保存。" + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "签名" + LABEL_DISPLAY_NAME: "名称" + LABEL_REPLY_TO: "回复" + LABEL_SIGNATURE: "签名" + LABEL_ADD_SIGNATURE_TO_ALL: "发送邮件时均附加签名" + SETTINGS_SECURITY: + LEGEND_SECURITY: "安全" + LABEL_CONFIGURE_TWO_FACTOR: "配置两步验证" + LABEL_AUTOLOGOUT: "自动登出" + AUTOLOGIN_NEVER_OPTION_NAME: "从不" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% 分钟" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS%小时" + SETTINGS_GENERAL: + LEGEND_GENERAL: "一般设置" + LABEL_LANGUAGE: "语言" + LABEL_IDENTITY: "Identity" + LABEL_LAYOUT: "布局" + LABEL_LAYOUT_NO_SPLIT: "不分隔" + LABEL_LAYOUT_VERTICAL_SPLIT: "垂直分隔" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "水平分隔" + LABEL_EDITOR: "默认格式" + LABEL_EDITOR_HTML: "Html文本" + LABEL_EDITOR_PLAIN: "普通文本" + LABEL_EDITOR_HTML_FORCED: "强制HTML文本" + LABEL_EDITOR_PLAIN_FORCED: "强制普通文本" + LABEL_ANIMATION: "界面动画" + LABEL_ANIMATION_FULL: "完整" + LABEL_ANIMATION_NORMAL: "正常" + LABEL_ANIMATION_NONE: "无" + LABEL_VIEW_OPTIONS: "视图选项" + LABEL_USE_PREVIEW_PANE: "使用预览" + LABEL_USE_CHECKBOXES_IN_LIST: "列表中显示多选框" + LABEL_USE_THREADS: "使用对话" + LABEL_REPLY_SAME_FOLDER: "将回复的邮件放置到其回复的邮件所在文件夹" + LABEL_SHOW_IMAGES: "总是显示外部图片信息" + LABEL_SHOW_ANIMATION: "显示动画" + LABEL_MESSAGE_PER_PAGE: "封邮件每页" + LABEL_NOTIFICATIONS: "通知" + LABEL_SOUND_NOTIFICATION: "提示音" + LABEL_CHROME_NOTIFICATION_DESC: "显示新邮件弹窗" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(被浏览器阻止)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "联系人" + LABEL_CONTACTS_AUTOSAVE: "自动添加到你的地址簿" + LEGEND_CONTACTS_SYNC: "远程同步(CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "启用远程同步" + LABEL_CONTACTS_SYNC_SERVER: "服务器" + LABEL_CONTACTS_SYNC_AB_URL: "地址簿URL" + LABEL_CONTACTS_SYNC_USER: "用户名" + LABEL_CONTACTS_SYNC_PASSWORD: "密码" + SETTINGS_THEMES: + LEGEND_THEMES: "主题" + LEGEND_THEMES_CUSTOM: "自定义主题设置" + LABEL_CUSTOM_TYPE: "类型" + LABEL_CUSTOM_TYPE_LIGHT: "明亮" + LABEL_CUSTOM_TYPE_DARK: "暗沉" + LABEL_CUSTOM_BACKGROUND_IMAGE: "背景" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "上传背景 (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "文件太大" + ERROR_FILE_TYPE_ERROR: "无效类型 (只支持JPG和PNG)" + ERROR_UNKNOWN: "上传时发生未知错误" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "谷歌" + BUTTON_GOOGLE_CONNECT: "连接到 Google" + BUTTON_GOOGLE_DISCONNECT: "断开 Google 连接" + MAIN_GOOGLE_DESC: "After enabling login via Google, you can log into this account using Google button on the login screen." + LEGEND_FACEBOOK: "非死不可" + BUTTON_FACEBOOK_CONNECT: "连接到 Facebook" + BUTTON_FACEBOOK_DISCONNECT: "断开 Facebook 链接" + MAIN_FACEBOOK_DESC: "After enabling login via Facebook, you can log into this account using Facebook button on the login screen." + LEGEND_TWITTER: "推特" + BUTTON_TWITTER_CONNECT: "连接到 Twitter" + BUTTON_TWITTER_DISCONNECT: "断开 Twitter 连接" + MAIN_TWITTER_DESC: "After enabling login via Twitter, you can log into this account using Twitter button on the login screen." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "文件夹" + BUTTON_CREATE: "新建文件夹" + BUTTON_SYSTEM: "系统文件夹" + BUTTON_DELETE: "删除" + BUTTON_SUBSCRIBE: "订阅" + BUTTON_UNSUBSCRIBE: "取消订阅" + LOADING_PROCESS: "文件夹列表更新" + CREATING_PROCESS: "文件夹创建中" + DELETING_PROCESS: "文件夹删除中" + RENAMING_PROCESS: "文件夹重命名" + DELETING_ASK: "确定?" + TO_MANY_FOLDERS_DESC_1: "文件夹数量已达上限!" + TO_MANY_FOLDERS_DESC_2: "为避免性能问题,暂时只显示部分(文件夹)。" + HELP_DELETE_FOLDER: "删除文件夹" + HELP_SHOW_HIDE_FOLDER: "显示/隐藏文件夹" + HELP_CHECK_FOR_NEW_MESSAGES: "检查/不检查新邮件" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "账户列表" + LEGEND_IDENTITIES: "Identities" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" + BUTTON_ADD_ACCOUNT: "添加一个账户" + BUTTON_ADD_IDENTITY: "Add an Identity" + BUTTON_DELETE: "删除" + LOADING_PROCESS: "更新账户列表中" + DELETING_ASK: "确定?" + DEFAULT_IDENTITY_LABEL: "默认" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "签名" + LEGEND_IDENTITIES: "附加签名" + LABEL_DEFAULT: "默认" + LABEL_DISPLAY_NAME: "名称" + LABEL_REPLY_TO: "回复" + LABEL_SIGNATURE: "签名" + LABEL_ADD_SIGNATURE_TO_ALL: "发送的所有邮件均附加签名" + BUTTON_ADD_IDENTITY: "添加签名" + BUTTON_DELETE: "删除" + LOADING_PROCESS: "更新签名中" + DELETING_ASK: "确定?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "修改密码" + LABEL_CURRENT_PASSWORD: "当前密码" + LABEL_NEW_PASSWORD: "新密码" + LABEL_REPEAT_PASSWORD: "再次新密码" + BUTTON_UPDATE_PASSWORD: "设置新密码" + ERROR_PASSWORD_MISMATCH: "密码不匹配,请再试一次" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "导入 OpenPGP 密匙" + BUTTON_GENERATE_OPEN_PGP_KEYS: "生成 OpenPGP 密匙" + TITLE_PRIVATE: "私有" + TITLE_PUBLIC: "公开" + DELETING_ASK: "你确定吗?" + GENERATE_ONLY_HTTPS: "仅限HTTPS" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "快捷键说明" + TAB_MAILBOX: "邮箱目录" + TAB_MESSAGE_LIST: "邮件列表" + TAB_MESSAGE_VIEW: "邮件视图" + TAB_COMPOSE: "撰写" + LABEL_OPEN_USER_DROPDOWN: "打开用户菜单" + LABEL_REPLY: "回复" + LABEL_REPLY_ALL: "回复所有" + LABEL_FORWARD: "转发" + LABEL_FORWARD_MULTIPLY: "转发所有" + LABEL_HELP: "帮助" + LABEL_CHECK_ALL: "检查所有消息" + LABEL_ARCHIVE: "存档" + LABEL_DELETE: "删除" + LABEL_OPEN_THREAD: "打开选定的邮件往来" + LABEL_MOVE: "移动" + LABEL_READ: "将选定的邮件标记为“已读”" + LABEL_UNREAD: "将选定的邮件标记为“未读”" + LABEL_IMPORTANT: "将选定的邮件标记为“重要”" + LABEL_SEARCH: "搜索" + LABEL_CANCEL_SEARCH: "取消搜索" + LABEL_FULLSCREEN_ENTER: "全屏邮件阅读窗格" + LABEL_VIEW_MESSAGE_ENTER: "取消全屏邮件阅读窗格" + LABEL_SWITCH_TO_MESSAGE: "切换邮件阅读窗格" + LABEL_SWITCH_TO_FOLDER_LIST: "切换邮件阅读窗格" + LABEL_FULLSCREEN_TOGGLE: "全屏窗格切换" + LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" + LABEL_THREAD_NEXT: "下一封往来邮件" + LABEL_THREAD_PREV: "上一封往来邮件" + LABEL_PRINT: "打印" + LABEL_EXIT_FULLSCREEN: "退出全屏模式" + LABEL_CLOSE_MESSAGE: "关闭独立邮件阅读窗格" + LABEL_SWITCH_TO_LIST: "切换到邮件列表" + LABEL_OPEN_COMPOSE_POPUP: "打开撰写窗格" + LABEL_MINIMIZE_COMPOSE_POPUP: "最小化撰写窗格" + LABEL_OPEN_IDENTITIES_DROPDOWN: "打开账户管理窗格" + LABEL_SAVE_MESSAGE: "保存邮件" + LABEL_SEND_MESSAGE: "发送邮件" + LABEL_CLOSE_COMPOSE: "退出撰写" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "无法找到公钥" + NO_PUBLIC_KEYS_FOUND_FOR: "无法找到 \\\"%EMAIL%\\\" 的公钥" + NO_PRIVATE_KEY_FOUND: "无法找到私钥" + NO_PRIVATE_KEY_FOUND_FOR: "无法找到 \\\"%EMAIL%\\\" 的私钥" + ADD_A_PUBLICK_KEY: "添加公钥" + SELECT_A_PRIVATE_KEY: "选择一个私钥" + UNVERIFIRED_SIGNATURE: "未验证的签名" + DECRYPTION_ERROR: "OpenPGP 解密出错" + GOOD_SIGNATURE: "来自 %USER% 的可用签名" + PGP_ERROR: "OpenPGP 错误: %ERROR%" + SPECIFY_FROM_EMAIL: "请指定发件人电邮地址" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "请指定至少一个收件人地址" + NOTIFICATIONS: + INVALID_TOKEN: "无效标记" + AUTH_ERROR: "认证失败" + ACCESS_ERROR: "访问错误" + CONNECTION_ERROR: "无法连接服务器" + CAPTCHA_ERROR: "验证码不正确。" + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + DOMAIN_NOT_ALLOWED: "域不允许" + ACCOUNT_NOT_ALLOWED: "账户不允许" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "需要进行两步验证" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "两步验证错误" + COULD_NOT_SAVE_NEW_PASSWORD: "无法保存新密码" + CURRENT_PASSWORD_INCORRECT: "当前密码不正确" + NEW_PASSWORD_SHORT: "密码太短" + NEW_PASSWORD_WEAK: "密码过于简单" + NEW_PASSWORD_FORBIDDENT: "密码包含禁止字符" + CONTACTS_SYNC_ERROR: "联系人同步错误" + CANT_GET_MESSAGE_LIST: "无法获取邮件列表" + CANT_GET_MESSAGE: "无法获取邮件" + CANT_DELETE_MESSAGE: "无法删除邮件" + CANT_MOVE_MESSAGE: "无法移动邮件" + CANT_SAVE_MESSAGE: "无法保存邮件" + CANT_SEND_MESSAGE: "无法发送邮件" + INVALID_RECIPIENTS: "无效接收人" + CANT_SAVE_FILTERS: "无法保存筛选器规则" + CANT_GET_FILTERS: "无法获取筛选器规则" + FILTERS_ARE_NOT_CORRECT: "不正确的筛选器规则" + CANT_CREATE_FOLDER: "无法创建文件夹" + CANT_RENAME_FOLDER: "无法重命名文件夹" + CANT_DELETE_FOLDER: "无法删除文件夹" + CANT_DELETE_NON_EMPTY_FOLDER: "无法删除非空文件夹" + CANT_SUBSCRIBE_FOLDER: "无法订阅文件夹" + CANT_UNSUBSCRIBE_FOLDER: "无法取消订阅文件夹" + CANT_SAVE_SETTINGS: "无法保存设置" + CANT_SAVE_PLUGIN_SETTINGS: "无法保存设置" + DOMAIN_ALREADY_EXISTS: "域已经存在" + CANT_INSTALL_PACKAGE: "安装包失败" + CANT_DELETE_PACKAGE: "移除包失败" + INVALID_PLUGIN_PACKAGE: "无效插件" + UNSUPPORTED_PLUGIN_PACKAGE: "不支持的插件" + LICENSING_SERVER_IS_UNAVAILABLE: "订阅服务器无效" + LICENSING_DOMAIN_EXPIRED: "此域订阅服务已失效。" + LICENSING_DOMAIN_BANNED: "此域订阅服务已禁止。" + DEMO_SEND_MESSAGE_ERROR: "出于安全考虑,测试账号无法发送外部邮件。" + DEMO_ACCOUNT_ERROR: "由于安保原因,本账号无法进行此操作!" + ACCOUNT_ALREADY_EXISTS: "账户已存在" + ACCOUNT_DOES_NOT_EXIST: "账户不存在" + MAIL_SERVER_ERROR: "访问邮件服务器遇到错误。" + INVALID_INPUT_ARGUMENT: "无效的参数输入" + UNKNOWN_ERROR: "未知错误" + STATIC: + BACK_LINK: "重新加载" + DOMAIN_LIST_DESC: "可以通过webmail访问的域列表" + PHP_EXSTENSIONS_ERROR_DESC: "需要的PHP扩展未配置!" + PHP_VERSION_ERROR_DESC: "您的PHP版本 (%VERSION%) 低于所需的 5.3.0!" + NO_SCRIPT_TITLE: "JavaScript 需要启用!" + NO_SCRIPT_DESC: | + 您的浏览器不支持JavaScript。 + 请启用浏览器的JavaScript支持并重试。 + NO_COOKIE_TITLE: "Cookies 需要启用!" + NO_COOKIE_DESC: | + 您的浏览器不支持Cookies。 + 请启用浏览器的Cookies支持并重试。 + BAD_BROWSER_TITLE: "您的浏览器版本太低" + BAD_BROWSER_DESC: | + 如果想使用所有功能, + 下载并安装下列其中一款浏览器: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/zh_TW.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/zh_TW.yml new file mode 100755 index 00000000..82bae7f8 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/zh_TW.yml @@ -0,0 +1,697 @@ +zh_TW: + LOGIN: + LABEL_EMAIL: "郵件" + LABEL_LOGIN: "登錄" + LABEL_PASSWORD: "密碼" + LABEL_SIGN_ME: "記住我" + LABEL_VERIFICATION_CODE: "驗證碼" + LABEL_DONT_ASK_VERIFICATION_CODE: "Don't ask for the code for 2 weeks" + BUTTON_SIGN_IN: "登入" + TITLE_SIGN_IN_GOOGLE: "使用Google帳號登錄" + TITLE_SIGN_IN_FACEBOOK: "使用Facebook帳號登錄" + TITLE_SIGN_IN_TWITTER: "使用Twitter帳號登錄" + LABEL_FORGOT_PASSWORD: "Forgot password" + LABEL_REGISTRATION: "Registration" + TOP_TOOLBAR: + BUTTON_ADD_ACCOUNT: "添加帳戶" + BUTTON_SETTINGS: "設置" + BUTTON_HELP: "Help" + BUTTON_LOGOUT: "註銷" + SEARCH: + MAIN_INPUT_PLACEHOLDER: "搜索" + TITLE_ADV: "高級搜索" + LABEL_ADV_FROM: "發送自" + LABEL_ADV_TO: "發送到" + LABEL_ADV_SUBJECT: "主題" + LABEL_ADV_TEXT: "內容" + LABEL_ADV_HAS_ATTACHMENT: "有附件" + LABEL_ADV_HAS_ATTACHMENTS: "有附件" + LABEL_ADV_FLAGGED: "標記" + LABEL_ADV_UNSEEN: "Unseen" + LABEL_ADV_DATE: "日期" + LABEL_ADV_DATE_ALL: "所有郵件" + LABEL_ADV_DATE_3_DAYS: "3天以內" + LABEL_ADV_DATE_7_DAYS: "1周以內" + LABEL_ADV_DATE_MONTH: "1月以內" + LABEL_ADV_DATE_3_MONTHS: "3月以內" + LABEL_ADV_DATE_6_MONTHS: "半年以內" + LABEL_ADV_DATE_YEAR: "1年以內" + BUTTON_ADV_SEARCH: "搜索" + PREVIEW_POPUP: + FULLSCREEN: "Toggle fullscreen" + ZOOM: "Zoom in/out" + CLOSE: "關閉 (Esc)" + LOADING: "載入..." + GALLERY_PREV: "向前 (Left arrow key)" + GALLERY_NEXT: "向後 (Right arrow key)" + GALLERY_COUNTER: "%curr% / %total%" + IMAGE_ERROR: "圖片 無法載入。" + AJAX_ERROR: "內容 無法載入。" + FOLDER_LIST: + BUTTON_COMPOSE: "寫郵件" + BUTTON_CONTACTS: "連絡人" + INBOX_NAME: "收件箱" + SENT_NAME: "已發郵件" + DRAFTS_NAME: "草稿" + SPAM_NAME: "垃圾郵件" + TRASH_NAME: "已刪除郵件" + ARCHIVE_NAME: "存檔" + QUOTA: + TITLE: "存儲空間使用量" + MESSAGE_LIST: + BUTTON_RELOAD: "重新載入郵寄清單" + BUTTON_MOVE_TO: "移至" + BUTTON_DELETE: "已刪除郵件" + BUTTON_ARCHIVE: "存檔" + BUTTON_SPAM: "垃圾郵件" + BUTTON_NOT_SPAM: "Not Spam" + BUTTON_EMPTY_FOLDER: "清空資料夾" + BUTTON_MULTY_FORWARD: "轉發郵件" + BUTTON_DELETE_WITHOUT_MOVE: "永久刪除" + BUTTON_MORE: "更多" + MENU_SET_SEEN: "標記為已讀" + MENU_SET_ALL_SEEN: "標記全部為已讀" + MENU_UNSET_SEEN: "標記為未讀" + MENU_SET_FLAG: "加注星標" + MENU_UNSET_FLAG: "移除星標" + MENU_SELECT_ALL: "全部" + MENU_SELECT_NONE: "無" + MENU_SELECT_INVERT: "選擇" + MENU_SELECT_UNSEEN: "未讀" + MENU_SELECT_SEEN: "已讀" + MENU_SELECT_FLAGGED: "已加星標" + MENU_SELECT_UNFLAGGED: "未加星標" + EMPTY_LIST: "空列表。" + EMPTY_SEARCH_LIST: "未找到您想要的。" + SEARCH_RESULT_FOR: "搜索 \"%SEARCH%\" 的結果" + BACK_TO_MESSAGE_LIST: "back to message list" + LIST_LOADING: "載入中" + EMPTY_SUBJECT_TEXT: "(無主題)" + PUT_MESSAGE_HERE: "在這裡查看郵件" + TODAY_AT: "今日於 %TIME%" + YESTERDAY_AT: "昨天 %TIME%" + SEARCH_PLACEHOLDER: "搜索" + NEW_MESSAGE_NOTIFICATION: "您有 %COUNT% 封新郵件!" + QUOTA_SIZE: "使用了%LIMIT% 存儲空間中的%SIZE% (%PROC%%)" + MESSAGE: + BUTTON_EDIT: "編輯" + BUTTON_BACK: "返回" + BUTTON_CLOSE: "關閉" + BUTTON_DELETE: "刪除" + BUTTON_ARCHIVE: "存檔" + BUTTON_SPAM: "垃圾郵件" + BUTTON_NOT_SPAM: "Not Spam" + BUTTON_MOVE_TO: "移至" + BUTTON_MORE: "更多" + BUTTON_REPLY: "回復" + BUTTON_REPLY_ALL: "全部回復" + BUTTON_FORWARD: "轉發" + BUTTON_FORWARD_AS_ATTACHMENT: "帶附件轉發" + BUTTON_EDIT_AS_NEW: "Edit as New" + BUTTON_SHOW_IMAGES: "顯示外部圖片" + BUTTON_NOTIFY_READ_RECEIPT: "The sender has asked to be notified when you read this message." + BUTTON_IN_NEW_WINDOW: "在新窗口中查看" + BUTTON_THREAD_LIST: "Thread list" + BUTTON_THREAD_PREV: "Previous" + BUTTON_THREAD_NEXT: "Next" + BUTTON_THREAD_MORE: "More messages" + MENU_HEADERS: "顯示詳細資訊" + MENU_VIEW_ORIGINAL: "顯示原始內容" + MENU_DOWNLOAD_ORIGINAL: "作為 .eml 文件下載" + MENU_FILTER_SIMILAR: "過濾郵件如此" + MENU_PRINT: "列印郵件" + EMPTY_SUBJECT_TEXT: "(無主題)" + LABEL_SUBJECT: "主題" + LABEL_DATE: "日期" + LABEL_FROM: "發送自" + LABEL_FROM_SHORT: "from" + LABEL_TO: "發送到" + LABEL_TO_SHORT: "to" + LABEL_CC: "複本" + LABEL_BCC: "密件複本" + LABEL_REPLY_TO: "Reply-To" + PRINT_LABEL_FROM: "發送自" + PRINT_LABEL_TO: "發送到" + PRINT_LABEL_CC: "複本" + PRINT_LABEL_BCC: "密件複本" + PRINT_LABEL_REPLY_TO: "Reply-To" + PRINT_LABEL_DATE: "日期" + PRINT_LABEL_SUBJECT: "主題" + PRINT_LABEL_ATTACHMENTS: "附件" + MESSAGE_LOADING: "載入中" + MESSAGE_VIEW_DESC: "在此查看列表中選中的郵件。" + PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" + LINK_DOWNLOAD_AS_ZIP: "Download as zip" + LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" + LINK_SAVE_TO_DROPBOX: "Save to Dropbox" + READ_RECEIPT: + SUBJECT: "Return Receipt (displayed) - %SUBJECT%" + BODY: | + This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. + + Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. + There is no guarantee that the recipient has read or understood the message contents. + SUGGESTIONS: + SEARCHING_DESC: "搜索中..." + CONTACTS: + LEGEND_CONTACTS: "連絡人" + SEARCH_INPUT_PLACEHOLDER: "搜索" + BUTTON_ADD_CONTACT: "添加連絡人" + BUTTON_CREATE_CONTACT: "新增連絡人" + BUTTON_UPDATE_CONTACT: "更新連絡人" + BUTTON_IMPORT: "導入 (csv, vcf, vCard)" + BUTTON_EXPORT_VCARD: "匯出 (vcf, vCard)" + BUTTON_EXPORT_CSV: "匯出 (csv)" + ERROR_IMPORT_FILE: "導入錯誤 (invalid file format)" + LIST_LOADING: "載入中" + EMPTY_LIST: "暫無連絡人" + EMPTY_SEARCH: "沒找到連絡人" + CLEAR_SEARCH: "清除搜索" + CONTACT_VIEW_DESC: "在此查看在列表中選中的連絡人。" + LABEL_DISPLAY_NAME: "顯示名字" + LABEL_EMAIL: "Email" + LABEL_PHONE: "電話" + LABEL_WEB: "網站" + LABEL_BIRTHDAY: "生日" + LINK_ADD_EMAIL: "添加 Email 地址" + LINK_ADD_PHONE: "添加電話" + LINK_BIRTHDAY: "生日" + PLACEHOLDER_ENTER_DISPLAY_NAME: "顯示名稱" + PLACEHOLDER_ENTER_LAST_NAME: "姓" + PLACEHOLDER_ENTER_FIRST_NAME: "名" + PLACEHOLDER_ENTER_NICK_NAME: "昵稱" + LABEL_READ_ONLY: "Read only" + LABEL_SHARE: "分享" + ADD_MENU_LABEL: "添加" + ADD_MENU_NICKNAME: "暱稱" + ADD_MENU_NOTES: "Notes" + ADD_MENU_EMAIL: "Email" + ADD_MENU_PHONE: "電話" + ADD_MENU_URL: "網址" + ADD_MENU_ADDRESS: "地址" + ADD_MENU_BIRTHDAY: "生日" + ADD_MENU_TAGS: "Tags" + BUTTON_SHARE_NONE: "無" + BUTTON_SHARE_ALL: "所有人" + BUTTON_SYNC: "同步 (CardDAV)" + COMPOSE: + TITLE_FROM: "發送自" + TITLE_TO: "發送到" + TITLE_CC: "複本" + TITLE_BCC: "密件複本" + TITLE_REPLY_TO: "回復" + TITLE_SUBJECT: "主題" + LINK_SHOW_INPUTS: "顯示所有資訊" + BUTTON_SEND: "發送" + BUTTON_SAVE: "保存" + BUTTON_DELETE: "刪除" + BUTTON_CANCEL: "取消" + BUTTON_MINIMIZE: "Minimize" + SAVED_TIME: "保存於 %TIME%" + SAVED_ERROR_ON_SEND: "郵件已發送但並未保存在已發郵寄清單中。" + DISCARD_UNSAVED_DATA: "Discard unsaved data?" + ATTACH_FILES: "添加附件" + ATTACH_DROP_FILES_DESC: "拖動文件至此" + ATTACH_ITEM_CANCEL: "取消" + DROPBOX: "Dropbox" + GOOGLE_DRIVE: "Google Drive" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% 寫到" + FORWARD_MESSAGE_TOP_TITLE: "-------- 轉發郵件 -------" + FORWARD_MESSAGE_TOP_FROM: "發送自" + FORWARD_MESSAGE_TOP_TO: "發送到" + FORWARD_MESSAGE_TOP_CC: "複本" + FORWARD_MESSAGE_TOP_SENT: "發送" + FORWARD_MESSAGE_TOP_SUBJECT: "主題" + EMPTY_TO_ERROR_DESC: "請至少選擇一位接收人" + NO_ATTACHMENTS_HERE_DESC: "No attachments here." + ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet" + BUTTON_REQUEST_READ_RECEIPT: "Request a read receipt" + BUTTON_MARK_AS_IMPORTANT: "Mark as important" + BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" + BUTTON_REQUEST_DSN: "Request a delivery receipt" + POPUPS_WELCOME_PAGE: + BUTTON_CLOSE: "Close" + POPUPS_ASK: + BUTTON_YES: "是" + BUTTON_NO: "否" + DESC_WANT_CLOSE_THIS_WINDOW: "你確定要關閉此窗口嗎?" + DESC_WANT_DELETE_MESSAGES: "你確定你要刪除這條消息嗎?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "選擇語言" + POPUPS_ADD_ACCOUNT: + TITLE_ADD_ACCOUNT: "添加帳戶?" + BUTTON_ADD_ACCOUNT: "添加" + TITLE_UPDATE_ACCOUNT: "Update Account?" + BUTTON_UPDATE_ACCOUNT: "Update" + POPUPS_IDENTITY: + TITLE_ADD_IDENTITY: "添加簽名?" + TITLE_UPDATE_IDENTITY: "更新簽名?" + BUTTON_ADD_IDENTITY: "添加" + BUTTON_UPDATE_IDENTITY: "更新" + LABEL_EMAIL: "Email" + LABEL_NAME: "姓名" + LABEL_REPLY_TO: "回復" + LABEL_SIGNATURE: "Signature" + LABEL_CC: "Cc" + LABEL_BCC: "密件複本" + LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" + POPUPS_CREATE_FOLDER: + TITLE_CREATE_FOLDER: "創建資料夾?" + LABEL_NAME: "資料夾名稱" + LABEL_PARENT: "父資料夾" + BUTTON_CREATE: "創建" + BUTTON_CANCEL: "取消" + BUTTON_CLOSE: "關閉" + TITLE_CREATING_PROCESS: "資料夾創建中" + POPUPS_CLEAR_FOLDER: + TITLE_CLEAR_FOLDER: "清理資料夾中所有郵件?" + BUTTON_CLEAR: "清理" + BUTTON_CANCEL: "取消" + BUTTON_CLOSE: "關閉" + DANGER_DESC_WARNING: "警告!" + DANGER_DESC_HTML_1: "此操作將完全刪除資料夾 %FOLDER% 中的所有郵件!" + DANGER_DESC_HTML_2: "一旦操作執行,不可中斷和撤銷!" + TITLE_CLEARING_PROCESS: "資料夾清理中..." + POPUPS_IMPORT_OPEN_PGP_KEY: + TITLE_IMPORT_OPEN_PGP_KEY: "導入 OpenPGP 密鑰" + BUTTON_IMPORT_OPEN_PGP_KEY: "導入" + POPUPS_VIEW_OPEN_PGP_KEY: + TITLE_VIEW_OPEN_PGP_KEY: "查看 OpenPGP 密鑰" + BUTTON_SELECT: "選擇" + BUTTON_CLOSE: "關閉" + POPUPS_GENERATE_OPEN_PGP_KEYS: + TITLE_GENERATE_OPEN_PGP_KEYS: "生成 OpenPGP 密鑰" + LABEL_EMAIL: "Email" + LABEL_NAME: "名字" + LABEL_PASSWORD: "密碼" + LABEL_KEY_BIT_LENGTH: "密鑰長度" + BUTTON_GENERATE_OPEN_PGP_KEYS: "生成" + POPUPS_COMPOSE_OPEN_PGP: + TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" + LABEL_SIGN: "Sign" + LABEL_ENCRYPT: "Encrypt" + LABEL_PASSWORD: "Password" + BUTTON_SIGN: "Sign" + BUTTON_ENCRYPT: "Encrypt" + BUTTON_SIGN_AND_ENCRYPT: "Sign and encrypt" + POPUPS_MESSAGE_OPEN_PGP: + TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" + LABEL_KEY: "Private Key" + LABEL_PASSWORD: "Password" + BUTTON_DECRYPT: "Decrypt" + POPUPS_TWO_FACTOR_TEST: + TITLE_TEST_CODE: "兩步驗證測試" + LABEL_CODE: "代碼" + BUTTON_TEST: "測試" + POPUPS_FILTER: + TITLE_CREATE_FILTER: "Create a filter?" + TITLE_EDIT_FILTER: "Update filter?" + FILTER_NAME: "Name" + LEGEND_CONDITIONS: "Conditions" + LEGEND_ACTIONS: "Actions" + BUTTON_DONE: "Done" + BUTTON_ADD_CONDITION: "Add a Condition" + SELECT_ACTION_NONE: "None" + SELECT_ACTION_MOVE_TO: "Move to" + SELECT_ACTION_FORWARD_TO: "Forward to" + SELECT_ACTION_REJECT: "Reject" + SELECT_ACTION_VACATION_MESSAGE: "Vacation message" + SELECT_ACTION_DISCARD: "Discard" + SELECT_FIELD_FROM: "From" + SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" + SELECT_FIELD_SUBJECT: "Subject" + SELECT_FIELD_HEADER: "Header" + SELECT_FIELD_SIZE: "Size" + SELECT_TYPE_CONTAINS: "Contains" + SELECT_TYPE_NOT_CONTAINS: "Not Contains" + SELECT_TYPE_MATCHES: "Matches (* and ? supported)" + SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" + SELECT_TYPE_REGEXP: "Regexp" + SELECT_TYPE_NOT_REGEXP: "Not Regexp" + SELECT_TYPE_EQUAL_TO: "Equal To" + SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" + SELECT_TYPE_OVER: "Over" + SELECT_TYPE_UNDER: "Under" + SELECT_MATCH_ANY: "Matching any of the following rules" + SELECT_MATCH_ALL: "Matching all of the following rules" + MARK_AS_READ_LABEL: "Mark as read" + REPLY_INTERVAL_LABEL: "Reply interval (days)" + KEEP_LABEL: "Keep" + STOP_LABEL: "Don't stop processing rules" + EMAIL_LABEL: "Email" + VACATION_SUBJECT_LABEL: "Subject (optional)" + VACATION_MESSAGE_LABEL: "Message" + VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" + REJECT_MESSAGE_LABEL: "Reject message" + ALL_INCOMING_MESSAGES_DESC: "All incoming messages" + POPUPS_SYSTEM_FOLDERS: + TITLE_SYSTEM_FOLDERS: "選擇系統資料夾" + SELECT_CHOOSE_ONE: "選擇一個" + SELECT_UNUSE_NAME: "不使用" + LABEL_SENT: "已發郵件" + LABEL_DRAFTS: "草稿" + LABEL_SPAM: "垃圾郵件" + LABEL_TRASH: "已刪除郵件" + LABEL_ARCHIVE: "存檔" + BUTTON_CANCEL: "取消" + BUTTON_CLOSE: "關閉" + NOTIFICATION_SENT: | + 您沒有選擇 已發郵件 資料夾來存儲已發送郵件。 + 如果您不希望保存已發郵件,請選擇 不使用 選項。 + NOTIFICATION_DRAFTS: "您沒有選擇 草稿 資料夾來存儲郵件草稿。" + NOTIFICATION_SPAM: | + 您沒有選擇 垃圾郵件 資料夾來存儲垃圾郵件。 + 如果您希望永久刪除郵件,請選擇 不使用 選項。 + NOTIFICATION_TRASH: | + 您沒有選擇 已刪除郵件 資料夾來存儲垃圾郵件。 + 如果您希望永久刪除郵件,請選擇 不使用 選項。 + NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" + POPUPS_TWO_FACTOR_CFG: + LEGEND_TWO_FACTOR_AUTH: "兩步驗證" + LABEL_ENABLE_TWO_FACTOR: "啟用兩步驗證" + LABEL_TWO_FACTOR_USER: "用戶" + LABEL_TWO_FACTOR_STATUS: "狀態" + LABEL_TWO_FACTOR_SECRET: "Secret" + LABEL_TWO_FACTOR_BACKUP_CODES: "備份代碼" + BUTTON_CREATE: "Create New Secret" + BUTTON_ACTIVATE: "Activate" + BUTTON_CLEAR: "Clear" + BUTTON_LOGOUT: "Logout" + BUTTON_DONE: "Done" + BUTTON_TEST: "測試" + LINK_TEST: "test" + BUTTON_SHOW_SECRET: "Show Secret" + BUTTON_HIDE_SECRET: "Hide Secret" + TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" + TWO_FACTOR_SECRET_DESC: >- + Import this info into your Google Authenticator client (or other TOTP client) + using the provided QR code below or by entering the code manually. + TWO_FACTOR_BACKUP_CODES_DESC: >- + If you can't receive codes via Google Authenticator, you can use backup codes + to sign in. After you’ve used a backup code to sign in, it will become inactive. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." + TITLES: + LOADING: "載入中" + LOGIN: "登錄" + MAILBOX: "郵箱" + SETTINGS: "設置" + COMPOSE: "寫郵件" + UPLOAD: + ERROR_FILE_IS_TOO_BIG: "文件太大" + ERROR_FILE_PARTIALLY_UPLOADED: "遭遇未知錯誤,檔無法上傳" + ERROR_NO_FILE_UPLOADED: "沒有檔上傳" + ERROR_MISSING_TEMP_FOLDER: "暫存檔案丟失" + ERROR_ON_SAVING_FILE: "遭遇未知錯誤" + ERROR_FILE_TYPE: "無效檔案類型" + ERROR_UNKNOWN: "未知檔上傳錯誤" + EDITOR: + TEXT_SWITCHER_RICH_FORMATTING: "完整文本" + TEXT_SWITCHER_CONFIRM: "檔案格式及圖片將丟失,您確定繼續這麼做?" + SETTINGS_LABELS: + LABEL_PERSONAL_NAME: "個人" + LABEL_GENERAL_NAME: "一般設置" + LABEL_CONTACTS_NAME: "連絡人" + LABEL_FOLDERS_NAME: "資料夾" + LABEL_ACCOUNTS_NAME: "帳戶" + LABEL_IDENTITY_NAME: "簽名" + LABEL_IDENTITIES_NAME: "簽名" + LABEL_FILTERS_NAME: "Filters" + LABEL_TEMPLATES_NAME: "Templates" + LABEL_SECURITY_NAME: "安全" + LABEL_SOCIAL_NAME: "社交" + LABEL_THEMES_NAME: "主題" + LABEL_CHANGE_PASSWORD_NAME: "密碼" + LABEL_OPEN_PGP_NAME: "OpenPGP" + BUTTON_BACK: "返回" + SETTINGS_FILTERS: + LEGEND_FILTERS: "Filters" + BUTTON_SAVE: "Save" + BUTTON_ADD_FILTER: "Add a Filter" + BUTTON_DELETE: "Delete" + BUTTON_RAW_SCRIPT: "Use Custom User Script" + SUBNAME_NONE: "None" + SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" + SUBNAME_REJECT: "Reject" + SUBNAME_VACATION_MESSAGE: "Vacation message" + SUBNAME_DISCARD: "Discard" + CAPABILITY_LABEL: "Capability" + LOADING_PROCESS: "Updating filter list" + DELETING_ASK: "Are you sure?" + CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." + SETTINGS_IDENTITY: + LEGEND_IDENTITY: "簽名" + LABEL_DISPLAY_NAME: "名稱" + LABEL_REPLY_TO: "回復" + LABEL_SIGNATURE: "簽名" + LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" + SETTINGS_SECURITY: + LEGEND_SECURITY: "Security" + LABEL_AUTOLOGOUT: "Auto Logout" + AUTOLOGIN_NEVER_OPTION_NAME: "Never" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" + SETTINGS_GENERAL: + LEGEND_GENERAL: "一般設置" + LABEL_LANGUAGE: "語言" + LABEL_IDENTITY: "Identity" + LABEL_LAYOUT: "Layout" + LABEL_LAYOUT_NO_SPLIT: "No Split" + LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" + LABEL_EDITOR: "默認格式" + LABEL_EDITOR_HTML: "Html" + LABEL_EDITOR_PLAIN: "Plain" + LABEL_EDITOR_HTML_FORCED: "Html (forced)" + LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" + LABEL_ANIMATION: "介面動畫" + LABEL_ANIMATION_FULL: "完整" + LABEL_ANIMATION_NORMAL: "正常" + LABEL_ANIMATION_NONE: "無" + LABEL_VIEW_OPTIONS: "視圖選項" + LABEL_USE_PREVIEW_PANE: "使用預覽" + LABEL_USE_CHECKBOXES_IN_LIST: "清單中顯示多選框" + LABEL_USE_THREADS: "使用對話" + LABEL_REPLY_SAME_FOLDER: "將回復的郵件放置到其回復的郵件所在資料夾" + LABEL_SHOW_IMAGES: "總是顯示外部圖片資訊" + LABEL_SHOW_ANIMATION: "顯示動畫" + LABEL_MESSAGE_PER_PAGE: "封郵件每頁" + LABEL_NOTIFICATIONS: "通知" + LABEL_SOUND_NOTIFICATION: "Sound notification" + LABEL_CHROME_NOTIFICATION_DESC: "顯示新郵件彈窗" + LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(被瀏覽器阻止)" + SETTINGS_CONTACTS: + LEGEND_CONTACTS: "連絡人" + LABEL_CONTACTS_AUTOSAVE: "自動添加到你的位址簿" + LEGEND_CONTACTS_SYNC: "遠程同步(CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "啟用遠程同步" + LABEL_CONTACTS_SYNC_SERVER: "伺服器" + LABEL_CONTACTS_SYNC_AB_URL: "地址簿URL" + LABEL_CONTACTS_SYNC_USER: "用戶名" + LABEL_CONTACTS_SYNC_PASSWORD: "密碼" + SETTINGS_THEMES: + LEGEND_THEMES: "主題" + LEGEND_THEMES_CUSTOM: "自訂主題設置" + LABEL_CUSTOM_TYPE: "類型" + LABEL_CUSTOM_TYPE_LIGHT: "明亮" + LABEL_CUSTOM_TYPE_DARK: "暗沉" + LABEL_CUSTOM_BACKGROUND_IMAGE: "背景" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "上傳背景 (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "文件太大" + ERROR_FILE_TYPE_ERROR: "無效類型 (只支援JPG和PNG)" + ERROR_UNKNOWN: "上傳時發生未知錯誤" + SETTINGS_SOCIAL: + LEGEND_GOOGLE: "Google" + BUTTON_GOOGLE_CONNECT: "連接到 Google" + BUTTON_GOOGLE_DISCONNECT: "斷開 Google 連接" + MAIN_GOOGLE_DESC: "After enabling login via Google, you can log into this account using Google button on the login screen." + LEGEND_FACEBOOK: "Facebook" + BUTTON_FACEBOOK_CONNECT: "連接到 Facebook" + BUTTON_FACEBOOK_DISCONNECT: "斷開 Facebook 連結" + MAIN_FACEBOOK_DESC: "After enabling login via Facebook, you can log into this account using Facebook button on the login screen." + LEGEND_TWITTER: "Twitter" + BUTTON_TWITTER_CONNECT: "連接到 Twitter" + BUTTON_TWITTER_DISCONNECT: "斷開 Twitter 連接" + MAIN_TWITTER_DESC: "After enabling login via Twitter, you can log into this account using Twitter button on the login screen." + SETTINGS_FOLDERS: + LEGEND_FOLDERS: "資料夾" + BUTTON_CREATE: "新建資料夾" + BUTTON_DELETE: "刪除" + BUTTON_SUBSCRIBE: "訂閱" + BUTTON_UNSUBSCRIBE: "取消訂閱" + LOADING_PROCESS: "資料夾清單更新" + CREATING_PROCESS: "資料夾創建中" + DELETING_PROCESS: "資料夾刪除中" + RENAMING_PROCESS: "資料夾重命名" + DELETING_ASK: "確定?" + TO_MANY_FOLDERS_DESC_1: "You have too many folders!" + TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." + HELP_DELETE_FOLDER: "Delete folder" + HELP_SHOW_HIDE_FOLDER: "Show/hide folder" + HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" + SETTINGS_ACCOUNTS: + LEGEND_ACCOUNTS: "帳戶列表" + LEGEND_IDENTITIES: "Identities" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" + BUTTON_ADD_ACCOUNT: "添加一個帳戶" + BUTTON_ADD_IDENTITY: "Add an Identity" + BUTTON_DELETE: "刪除" + LOADING_PROCESS: "更新帳戶列表中" + DELETING_ASK: "確定?" + DEFAULT_IDENTITY_LABEL: "default" + SETTINGS_IDENTITIES: + LEGEND_IDENTITY: "簽名" + LEGEND_IDENTITIES: "附加簽名" + LABEL_DEFAULT: "Default" + LABEL_DISPLAY_NAME: "名稱" + LABEL_REPLY_TO: "回復" + LABEL_SIGNATURE: "簽名" + LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" + BUTTON_ADD_IDENTITY: "添加簽名" + BUTTON_DELETE: "刪除" + LOADING_PROCESS: "更新簽名中" + DELETING_ASK: "確定?" + SETTINGS_CHANGE_PASSWORD: + LEGEND_CHANGE_PASSWORD: "修改密碼" + LABEL_CURRENT_PASSWORD: "當前密碼" + LABEL_NEW_PASSWORD: "新密碼" + LABEL_REPEAT_PASSWORD: "再次新密碼" + BUTTON_UPDATE_PASSWORD: "設置新密碼" + ERROR_PASSWORD_MISMATCH: "密碼不匹配,請再試一次" + SETTINGS_OPEN_PGP: + LEGEND_OPEN_PGP: "OpenPGP" + BUTTON_ADD_OPEN_PGP_KEY: "導入 OpenPGP Key" + BUTTON_GENERATE_OPEN_PGP_KEYS: "生成 OpenPGP 密鑰" + TITLE_PRIVATE: "私有" + TITLE_PUBLIC: "公開" + DELETING_ASK: "你確定嗎?" + GENERATE_ONLY_HTTPS: "HTTPS only" + SHORTCUTS_HELP: + LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" + TAB_MAILBOX: "Mailbox" + TAB_MESSAGE_LIST: "Message list" + TAB_MESSAGE_VIEW: "Message view" + TAB_COMPOSE: "Compose" + LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" + LABEL_REPLY: "回復" + LABEL_REPLY_ALL: "回復所有" + LABEL_FORWARD: "Forward" + LABEL_FORWARD_MULTIPLY: "Forward (multiply)" + LABEL_HELP: "幫助" + LABEL_CHECK_ALL: "檢查所有消息" + LABEL_ARCHIVE: "存檔" + LABEL_DELETE: "刪除" + LABEL_OPEN_THREAD: "Open selected thread" + LABEL_MOVE: "移動" + LABEL_READ: "Read selected messages" + LABEL_UNREAD: "Unread selected messages" + LABEL_SEARCH: "Search" + LABEL_CANCEL_SEARCH: "Cancel search" + LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" + LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" + LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" + LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" + LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" + LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" + LABEL_THREAD_NEXT: "Next message in thread" + LABEL_THREAD_PREV: "Previous message in thread" + LABEL_PRINT: "Print" + LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" + LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" + LABEL_SWITCH_TO_LIST: "Switch focus back to message list" + LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" + LABEL_SAVE_MESSAGE: "Save message" + LABEL_SEND_MESSAGE: "Send message" + LABEL_CLOSE_COMPOSE: "Close compose" + PGP_NOTIFICATIONS: + NO_PUBLIC_KEYS_FOUND: "No public keys found" + NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" + NO_PRIVATE_KEY_FOUND: "No private key found" + NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" + ADD_A_PUBLICK_KEY: "Add a public key" + UNVERIFIRED_SIGNATURE: "Unverified signature" + DECRYPTION_ERROR: "OpenPGP decryption error" + GOOD_SIGNATURE: "Good signature from %USER%" + PGP_ERROR: "OpenPGP error: %ERROR%" + SPECIFY_FROM_EMAIL: "Please specify FROM email address" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" + NOTIFICATIONS: + INVALID_TOKEN: "無效標記" + AUTH_ERROR: "認證失敗" + ACCESS_ERROR: "訪問錯誤" + CONNECTION_ERROR: "無法連接伺服器" + CAPTCHA_ERROR: "驗證碼不正確。" + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + DOMAIN_NOT_ALLOWED: "無法連接到該域或者未輸入域" + ACCOUNT_NOT_ALLOWED: "帳戶不允許" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "兩步驗證錯誤" + COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" + CURRENT_PASSWORD_INCORRECT: "當前密碼不正確" + NEW_PASSWORD_SHORT: "密碼太短" + NEW_PASSWORD_WEAK: "密碼過於簡單" + NEW_PASSWORD_FORBIDDENT: "密碼包含禁止字元" + CONTACTS_SYNC_ERROR: "連絡人同步錯誤" + CANT_GET_MESSAGE_LIST: "無法獲取郵寄清單" + CANT_GET_MESSAGE: "無法獲取郵件" + CANT_DELETE_MESSAGE: "無法刪除郵件" + CANT_MOVE_MESSAGE: "無法移動郵件" + CANT_SAVE_MESSAGE: "無法保存郵件" + CANT_SEND_MESSAGE: "無法發送郵件" + INVALID_RECIPIENTS: "無效接收人" + CANT_SAVE_FILTERS: "Can't save filters" + CANT_GET_FILTERS: "Can't get filters" + FILTERS_ARE_NOT_CORRECT: "Filters are not correct" + CANT_CREATE_FOLDER: "無法創建資料夾" + CANT_RENAME_FOLDER: "無法重命名資料夾" + CANT_DELETE_FOLDER: "無法刪除資料夾" + CANT_DELETE_NON_EMPTY_FOLDER: "無法刪除非空資料夾" + CANT_SUBSCRIBE_FOLDER: "無法訂閱資料夾" + CANT_UNSUBSCRIBE_FOLDER: "無法取消訂閱資料夾" + CANT_SAVE_SETTINGS: "無法保存設置" + CANT_SAVE_PLUGIN_SETTINGS: "無法保存設置" + DOMAIN_ALREADY_EXISTS: "域已經存在" + CANT_INSTALL_PACKAGE: "安裝包失敗" + CANT_DELETE_PACKAGE: "移除包失敗" + INVALID_PLUGIN_PACKAGE: "無效外掛程式" + UNSUPPORTED_PLUGIN_PACKAGE: "不支持的外掛程式" + LICENSING_SERVER_IS_UNAVAILABLE: "訂閱伺服器無效" + LICENSING_DOMAIN_EXPIRED: "此域訂閱服務已失效。" + LICENSING_DOMAIN_BANNED: "此域訂閱服務已禁止。" + DEMO_SEND_MESSAGE_ERROR: "出於安全考慮,測試帳號無法發送外部郵件。" + DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" + ACCOUNT_ALREADY_EXISTS: "帳戶已存在" + MAIL_SERVER_ERROR: "訪問郵件伺服器遇到錯誤。" + INVALID_INPUT_ARGUMENT: "Invalid input argument" + UNKNOWN_ERROR: "未知錯誤" + STATIC: + BACK_LINK: "重新載入" + DOMAIN_LIST_DESC: "可以通過webmail訪問的域列表" + PHP_EXSTENSIONS_ERROR_DESC: "需要的PHP擴展未配置!" + PHP_VERSION_ERROR_DESC: "您的PHP版本 (%VERSION%) 低於所需的 5.3.0!" + NO_SCRIPT_TITLE: "JavaScript 需要啟用!" + NO_SCRIPT_DESC: | + 您的瀏覽器不支持JavaScript。 + 請啟用瀏覽器的JavaScript支持並重試。 + NO_COOKIE_TITLE: "Cookies 需要啟用!" + NO_COOKIE_DESC: | + 您的瀏覽器不支持Cookies。 + 請啟用瀏覽器的Cookies支持並重試。 + BAD_BROWSER_TITLE: "您的瀏覽器過時了" + BAD_BROWSER_DESC: | + 為了使用所有特性, + 下載並安裝其中一款瀏覽器: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/RainLoop.asc b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/RainLoop.asc new file mode 100755 index 00000000..9c171afa --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/RainLoop.asc @@ -0,0 +1,18 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v2 + +mQENBFVN/RoBCAD4NYpb/iMtDARKdTnvV/9ycoTOWdAJoGAasuLprVqyI8bB0z6X +ztJTqswgQcMzEwba5hQ9vuJ/Ylfww6mPvWJs/nmTUKxs2LlBldoSg25UDm7hyt59 +hi9zvOTwmeDNjGf5DXMib4Uuk5pH/jsmprRDZx25xA8qD2pDo0LOv5hexTwl5teA +Zh8EAAzyiNsXbX+kab9IFwSArsvYK0YJln+tPHvT29X5B5YVt9gkwY+CWA3QV/ZG +d71KEp+zReHICSjSy9G646JHDoG8CQ4Nytaih5oboqjU+Hkt8GeGlRlaPm3AIXqc +3q76Og/KD1Itx7MKrfXUvCau/4HowSiO9neJABEBAAG0H1JhaW5Mb29wIDxzdXBw +b3J0QHJhaW5sb29wLm5ldD6JATkEEwEIACMFAlVN/RoCGw8HCwkIBwMCAQYVCAIJ +CgsEFgIDAQIeAQIXgAAKCRDtfEnZh9pFkTxVCAD0S4RMXVKsbjLm22zXE01yHWQM +25QBRb5Z8p4ER3GcRNiKRWsNRTMRpiTdPgCyfj+tgIooMbBravDJwTkoztfWOb/P +l3oazxhY/ivvLalk5kVY7lflWyYYn9tfGwVJYIZCKuZ67VZwtTcf6dBhbc4DizVw +LuJAY6VNwycSHe8nrESabWzYRnw5c5ex/dmk8a1rsFXcDJBUB9MdZR7pxpniS9qB +JByxjP6hHo5vo1y6mPDiN1wWBd+objA7ZJaXd0jnsXRHlBAk74/O5cWvmVeExYjx +aERJEMQdBoAZNG1uTnQwjNdHfVoWDpqDSUr4QPfRv8M2pwvP4V1i6qji1r5T +=dVNE +-----END PGP PUBLIC KEY BLOCK----- diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/empty-contact.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/empty-contact.png new file mode 100755 index 0000000000000000000000000000000000000000..b2f2071d177ee53ecfaa3e46f780e9794cf05530 GIT binary patch literal 1881 zcmV-f2d4OmP)b)ZP^ncP8ubTS^(jwODW#<%A%Q?3 zB#3}*F244xJzm4k!JZl0WF*U;nKNhBzO8++*RY2PIqLPgNhA`6%RJAM)i{@HUcxjl znM$Q*s@1C8=Q=z;G?bESxSve+$$ELze*3#!9@taAgTGyfUKDUX&~8IWT`ZoOH*emU zi;D{ZUa3?>sJ^~F`9SdD;bAj6I%?ACK>=N_TNosi`S5Fp#wO?3#oRTw5s)_>O>U%@m78b9i`Y3Rc?y zhY!pOaQMbrx*5;uMgTuPK5m5=4qV06dXyDn0p}+C2B7`@eRFVdU=n@()^C#n7Mdnl zXpP#&J$$eZ*UIIxxpCu$$>;NCxat3{*7ZKEED#Gg06~*HN~Mz7+uJjzr>8c${Ohe^ zoPmXB0Tycp1_pwChK7dB2eZ>65ckkQjo4^+!~*V0k3ihr-SuB)5`kv%BD#eZgx9Ef z1TPK<0pQTSUgHYUwZ>gnIX*r%TU%RAI`n;7Yu%+VK9B2+1^%9y&Y6*s5wU1oDwIHu zqC#%G>|mA1x||gv<0YS) ze2Wg_S}s!Kt|qYY^XJda%aO#73^@H+in3-ahhU$bwc4J@zEv5zm1w(tV*__< za@5ptnXT=eP~h}&f~WQ7=H?{TqvyoYs>|xRkpM{erRy><_sXA-Vi5ra;HYDHdD(XS zDU)bc#qR{TF8=ikAP|6~EdwyP5WXQKuCZ|z+O%$hZ`@C%Qs&N`J2F=Ra5ufjNk);b z5~a?6{{7Fqdi5%JIl(aq-GLIWqo}%d>y{PJc2DXBQT2(&5(%8z4x+g^dLUaIpA^m7 z+M2KgdPr*5?LDy`0g0@+xVUKBwfAJpsjr%& z0O-sJAs8C~eRg&xb;-iQf>0ou_*Nr0mqJ@vJr-~+xu!*E`O#m0i?-dDaX3Ul5Dyr` zp+Zl=Xm9@@D8L{ft)c^(9X#t6tQi{{Gq-Qw zHmO0s)@c=>VVaKx+%*+IZ*OnQhyt0DRL2*!nyp|D&JuAStTR79Zx%mZ5O>l7b3PMB z43WUKo50*i_W+FKBU)7{->o<30#b}MYZUCksTeGow+xfB6(Z}EC>IGxqHb4~ZQ924 z6bJk+Vab&w9+g-kd371dS>&o6QPMa(>R| z+yv#7E44;4d382Yt@;yKl&>gbQJX+hUdCy%gdh%Cf@gI zR^|9x1AXMm%8CS^NYu=bnjy#@6bc&XRpYc8>64&Iojgyc)8_8oyP|#Z|7xw#K;w(- zhsBI~`Vv7x7;a8WXol!U+uV~@eAZ6nKJSQ(o4e*68820C`S2NuGwAP6_%KwbkRNB06+KdXIQ zyDEMoL7`0q9w-adrT5E&UmGZX2vkd~|KGeWfZgmv9AqB&yZ7TyKU+Gi2o1G!jc#6c zUC+224voVC-gn>sU|Ged8P^p$9sPC(_UgO+eXb@&9e3WBUwzx454+{%b^CE^!J>f^ zho(yJ{ukc}a54%5L!Wo2$+%C21J^;TaeANM|5}O-R&bg@;#O*LA$Ftjb|v!vQy9V& T6R?S>00000NkvXXu0mjf(mH~* literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/amazon.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/amazon.com.png new file mode 100755 index 0000000000000000000000000000000000000000..07ad04dffd215534a87c774774749e5e9d12c845 GIT binary patch literal 18032 zcmXt=1yEaE*M)I+cXucaTCBJ`!QEYoySuwP6e-2sU5iVx;!xbJIQ;khW_}owkU&W8 zJ!kK=p0$T4Wko4eBqAgT2nbXeX>l-c9r)iD0vvETC}=zZT)~;hNr^*z{P$VdU7iBm zgXk!&?E(RTjQ!siBt&*D0dOb0tBisK{5lF0EIq23gP{Th1Ovr_5&ZLN3b<>lR9*Q%N~Z%_QgJDH9~CU}Wx5LCy493+eq5V+K|c78B+bi^*4 zO+!$I7$~bc&ndwO8;D_Y#Y{vA1C}jGMWBpchWkbnW!ki)l^(W~4MJ)3sk8U?C!c7j z`$SxdyWz0RlqOqmziPz^6n=7|=H0iuDhPNoPIwvAircw|W{6ITg6{zJh2a>f${ zJkhcnCPFf2Kj-8j%=U3CjZ8G`7X|FK7R~O9`{z{VG&{&*1WK4P>tq_laO1j$2IsIt zFU{Jjs=BT&`PMaBgkVwZzd8~KDpq*QZcZfd6Add3=EzePs=rU}MJaB4Fu}<`aZIJ# zoQwEaEWOi4o>Yj-4WUU6FAqDvJs!H&y(H5VX;den;ngpno^vX=Jmh(7R($I`=RP<% zxbiDdEFWB7CuwYKWMO5UKX;c=_fFklsI$)jSBSUkjkMTL^B$74*sqNY4Z)v)U z=zTuO`F8NLvc|;19WKzjTCqaS#M&Bht;I<{16&bmzZUjq=G;4(X2_|m2U31vsDVX( z!OY1iX+O;zLh^*#m5-D&8`;1U@>{^m+Eduaa|~yWLK3n~wT7HpD9f!k{&N zU^BKWC*-vNdMQq`4k{z9F~LnAH2RSgnOCUL$KPgwt3K$v7eA&nBy4Q##~vkuaCv!o zjBw+fzlfB|vbYws3aU2EMAq4OLg+crjI<&c%B⪙A9$^gR52dB6V=}W18U;?&iOi z*6UsTUM;oCMNuvLHNp8_t=m^u zE7X{1WJD_$sTQ*xTIEW?JGix;u;08Ubld(W%ZXPTSXw(>KhMq0O~g0fhEWz^2b!X8 zJ=C+rWMvV)HP`yZo!0i|cV2WLueD_5=a1C0JiqzZ*S+}{xScM|o!&<~Dlj%Py>g&@ z2Nn;(63^31^HOG+w!p!_UoSFI1ldxo0Z?Rdq<`aHE6E&27h6AjV&<>7RX zP2!BuDZ3r4DJdyu8=VEKJR%=fuMjY?cf4U*9k>u7WBA2eU9AIQsPjL9@K zG_1IDGRtJL%Sd<}A!cqp&utAS$lrI!Z#Zf_!w|lrm+MXYe?b80AJXeWsNqn$O|*y@QE1?{+{dHDTVt(1 zYK!$80bwZ{`*=~7wy02{LG{kVSJ$6EG;M)Dl9;{Vy;#X5Z#`?>j7hW$8mPB({aL4g z9A#wV{FS;~&_*1{Ra8QAZMom!;M_^Im^KYHDgu zB2@W>lI7E+GHc8={&=zMGD3=5Y6#PE>*zh6;du1mLIgIK?UPuJ>20BlM|6mqo@bi_ zON%D!>`1-aHyY$XFw#WJ)4%H0ldY$`E#uKuek)F*$?0i4CPxz!s6o)t!wXM*2u83& ztB<(BwreZ}!mN&JwMG&ckB&kL?$d00^4jqUKZZg5!ypR~8 zbuaz!_nJL7xc|=AG|#fHubq6iMqBLvoO8F>bMWy+A9?`?xN+6Y+&qjN7Io?JL1qDm z5@yPxu@BR^*WA~)3j;3jv+oWv%hZ(hExiOZjEM5~nQaihweIU_uU|}p;R_gi&}%x{TFTeY#fwt8igLQea`SAq90XJR483~Vs?Y)Coc1U0XoK7bQKy1V)M7p z44g=Dx~wYI%SSI{(m~{KcB{^CUjlCN-gj;bs1cxx8K}svP@Siez89$Aym=x7o_2(F zbEACkTZioN86|!0zV!R7JF^nKl)b-iuD47ZU94`sWJ(#9CL0Fa0TdR+(zyZOf(>UQ1zA@dwx++-Q_6*YFDQl0g*urR=#p3!6kzQ0t~q!5fJEGDJP0Q+!z}t^FV3P-1}MOa ziY9B^`_5S*@aW)b4WLX}n3x3HG)H3u^TbCL|B%M~{OJ>}zx0J}sIfE#OsH|>X@?X- zA4q6N9FIX^fvO@kK(bx$py%asuPnzw#~kTa&Evg&uq)W|D_Y{{MTry#d|zqMuH2XM)^O7XXsh*gDDUm$2EI`?N?np^?`Z>!Q**F z5hoc!BZHLVDGw$zBIFdSoWM^#o{ z9(K%A$i=6CStirEKp9besHM24^jcja~bUi5u zACbb115=01kST#3EO0j~_I&yAe))7)E~L<`Q>w;fp4A&?t~+KUh^OF-#{EM~X$DsZ?uR`xQ91Pu|^ee)GT0c{<;Ew>Kt$ zD>LsGPWu@&YEJ++-yod=v(Rwl)|o0xYje-{+5b8w%$PvOcFJv8Kf*dYRkqXwUnp%O zD~FxY91~K8@!F4k)ZKGC2;Otb)`|O#huoSTM6Y~cC@U)iv@8FIiw&S$ z{8*lwQz02GS~v!=v5B;f2}1( zW`(r z?~tIr*!Xw@myfrH#;)YBOlD^0FedVUO9@;+RRznEj52a&n`^Ut{;cXO*R*EuyY*SE z=kf*66_4^W-jHKX*T(T1udf2Yq5`3)$YR2X)bA-Ql;~80E7YP9IZ&VhO-K>}Xu{JD zSnCA>kTbAIJvVF(M?Zhue1=ZMk9e&+G83HUJ7sa&$JK23=<^>L9Yq{WR4fm%U!yN6 zTH=czWb4I%nz_C53phM3P7vCI!jMqe;X&=Wx=#?eL8#V<@$NP_lU?8h)D>sWRPffJ z7a4e*iV#q3NB7>a??62l!J$$Jap)c0|9H!*+5*vH6wc9D2jh|4dN+j46s)yO5pO+? zK+R2leOY(S`$3*+I5=HtOaQ#wj*W|ur_*wi?cLLJ%^(!7>lnky3B&grzb7hKV67aR>Q`03=rF_ZZk(Q-Te=+0QUZcB zO}4a;JwKYGDtuC>cwFHf=DQ;F;WJ){2XX;L3UG$63II-8nYojNy`7H!fbzX#c` zNl2@+W@uKt`Ln67PnMZwQI{`|J%*kiPvM?Sj<*S}1evA~fO@vHsU{>Q#>O}B zEb7?~Mt*z<`0$V)V)DsXZMR=zeSEN`XZ6@FNo~^k1jxw$Iw)htgj0UOr7IsSjPF@> zyCg!qNepou+@cL`DbB>iMA);^!dMkgoARMFHn z&3`T^P^@CP-RX}P%42iVB`VbZELw3w5RjAqcb+UQH6itshA~Ovp_Y*P=U{fUKS2zF zbJwm(D1e14$`~fMPqdx=+I)R~y3(>o0KtHVY%DS}H8tnZ%6s{AxCMBa z&yDi7g>xM0#KUtZO!{a_?~YUc25m`u(6)I4{R+SslK6_Q>ySL#oD!veJ`>^b7s;}M&)0RFtdGt=eCaJiAPT0 z?R5sr)Zm62|8ADnxo|~Ws0x39P95JDeXE7CgZm?CJ2gL_thkUW+aA2f!%%wVM@|XT zVl7AyF;fCZP;*M|ux+NTp;FDCYfVDd?xpqeMFX+Fu#F>{Dwv{e^WjY{gn}WEteOiR zjl{^<7;=I0*uAroNd206)8ue;0DesUpJS9ql2{^K1zFz@Z7c{b5VkRa!MYW<$NtCi z<%71i_8ic;04MV|ia=n-6!5-)i36lc-{d3;@Bm<2(WXgCbSeOmRBxXX6%|!1p@0E1 z!y7bnHx^aGE9x0KGHaA+p`tTQA+`PTe*fnGF+bz~uMt)#0C+AyT{Q%J_ydc|x^*p7 z#bOXO>-^PAL zV363o#~Q`*#`~A84?)A%U3{Q7_lUMG>%U2$Hae~YJq}y}*f3}Dyn&Pr55@Cwu{rV# zr$1c6y<6pckK-uKC;wG zIf)g@zSuD|jXH`|?8N5EVinVfyb_%4S~f$dMFghj3ev%gPjM;$TBEIM>k@xB<6*<2 zpyzg)|7khkO|$1Z?i&U?WSVo>@$qqS+u*}na2O{$dxOojrq}a~GyKJ!^Z*qw)-VruiYqmN0Nv$!Bfo%(XBJQ#UEc zw_J$aC1Qd)lbhYy-uKhqCGzLl2&-ltyR9D5ncK|#d^!ZE^o)#p`%VZGyS0&O4P*_4 ze3L2CvE~iFWgCdy>X9^`1iMmt_U~Ny{>Jq zLlx#UCxw^`*_ajdA8F$};Zae2Z1UniK_odfmqjIg)f$n_R3dvC%m@=SV8%?idW~Th zTG)CGE!tL$bb;<1u|6;GuZK6PR}x}k=1?~t`0HFao)H2#w@?g;IAI(Kt@O0p=R0*x z{b8Z^J)s6`Z|rbm5I?`}BlIY=wR0QKH<<3WHtEidGCfxO)j>c4@T7ZH2OoL?6sNdV zNpTisFp-BB1!M7Nb1^sQ@H3o}-VXz&o0kpbzRv*?I~u4CEEB~#)p)Btrl>Qw(eY$nw-LEcIjXgQ9`brjis0pO zNlexqK=%dsS=XEWx5Eej%ZF$ivr(t_Ij7t&=nJi~`|OPz9DIP1ewz9Q2B_G_j=0s1 z&@~iAD8ufnaR9`2!TWK+-G9^sXyOYC3oI-wW;Sly-317WLfqUV05_~TowwsYcIA8Q znE{OB_wV0zrP!THm{y zEKc(KBX7Lvx}}%FHX(lCy6z0V;OEEnPLJC6oZcs5ltCk43IE3eI-8eINuB0L>Wd?H z+yPgoTDcgxmnlW=mkLPxG)=uJWcHXy)fTxUgmzl42n_Yx*X6%_?f~OTEyk=E= z>{stFC2*kq4g57`HoJY=@0MBjsmY(lWV;Q%{p50c_1b0dP$mrhp)@i`o{QzK0w8Dw z)$x7jAOL;@GVZ$&ZHw>TtyiRgZ?a~5!+}DXpP1r7MO3C!J%4(CC6J)meWKoVs()E* zQ2Rv=nvySjTcA`X`6eA)(G;DLX&ZEy*oPen)ZOZ^tu8c@iot?E(5kqLfhrUJmy zvUG5`DDj-*{jO;{HG)dq{vRF18Xbb3KS*JH&&H}VMHEJp-4{9xO$OuujDoO(A-V6B z$c9ZbU`>Go)PD5)$(2hU;6T8Z{SPXt{ZyY6fj&H$CG?kKc~^aWWr!ABzkFaTae`?) z;)Udy9xKue1i)&HY^iAZ0;A$P4&suS&Yielxo1U72jPMGi7YjRh`VeUxj`5utB)fu4NlE?jOLu6s zMIYw}$`@B(MTq!4Xo$1bM$1#`1OYH-=wv%2y-CP2o(Gztm*(~1*Gn%orZiok2y7@u z=yd1vT1#2OG;0VCf><_FLWG|V;i2<)Nj=ut&ah`M9|{_<`6nfbYBbMW`R-oc)X^+A zjh;uTP)IU^b~7_xCvxbE>e!|B!gFK}to59roSt>$w}@!MLQ^BF$}jiP1+IiOTtG*b zdQ52m-J{5HPiST(^zuEsBkmX#Vm#FA0{bZI|2kcf+&s(gf{@V>9ZpH07Qc{O}Uv^I6 z?6Q&*$Gs71Ji}8{!*)gj&pRfCV|PBnEHwncQIfrkeCg@``}gakfQA{-zPdsZUN`(Z`i+D z8M3O$Jc8?{M#A(N;r*}c>-x)jE~tR1phE}_t^`HeDI%ePczJ()>3ve*%bQ-*IfbG| z9K1?3BUX|j$XsZ?b#-Kgp*MxPmE8jNc|iZI0MypZ_;A6%1-S!b$Pz(W)bgdvUfh>= z*Prvnvt~SJ0@?~Ba-~>44;TAuTkrpV!YouEu_;AC{KfvVKDTFP9r(Yz=RoM=R_NN# z@Zsfc;@0t698U&KRD!WF9NhlrtLIf=&-DoLs`rRSdU`sL5DgCx7h_c{+T^9`2^)+( z1LuWs=C-P9vDzzIXC}7+ni^0G4{y6Xsa=@23#2MIZ0zgN@{Ag0uaeMPVe7Mta5!43G!-2)!LEo&KjBSc$*_Dg4sJ&Wo$k z9-ChDK+@)!zih`zG%;xJq?o?vJ03)_^fJHNo&jMz{(~*Yah`5L=vu%QxVUzW{YpGGH5;T-bJMXlRHrDiNSo zI<{zJ0%PUCtLQ?0zL~>VwETny0($Jwkhl}raxVMcIzEp03&2QLIz2v5Nv8ZyLT~v`mwRGIOP$!EVAmG=ciST(*th$fI3F~<_Z0Asjhh( z0*`j24lhQcAr~gYAF#uH1TO^$_Jv9mmDd~RwD4D6VbFxO|aEIIJBR~|# zIydiG$^0LUyZ>_tR_+?DK+;lOpz%KdFqPmL{4 zp2Mx{WoAbB#FfwPPg7LqWlxUK+k(*W!&|qMZPk61Gt{lAKEy@)A=z7UMpx+hS}T6M z(lpY05!YnjQw{(%=cLHZU0rdixd4jd-lmDt8M{1kQk0TC(B5!Ot((yM=H2J(F5XQD_`0k)Ic!-4d8UA&K+9^x4wQ zCA6Z|&b7~`Lq}KU9@V4 z*Qe30MmQykm|{;QW%b7IF4dd4hNmV6K2XtzCI8eh(xlXmGbn zN=^>6?wYa4JS3J^E8&T{j;XKL0?EH%y#a;GsQ?frF$9%dpUi@9Ko~w5F48+-Y7K$tl6*Y#bF;OaD3sb|SsWMV#n7g~i4Nz&qLqCN{c-)`P-4y zYP~5updiIn)YNGA(e!{{26#Mu>NIXrp^Agio}<+VOFg~{JBh>F$a4EpaRK&ygHN0_ z0tFmY=uM-XPhdik9||d6#w?}iC_-MK#wu6Wm2FcWBW7UN!OX3IEf6sR;f%qPRKT4S zFwX!&ZMo!$&}bdp9cL%zR#-sy{Wn8m_BMjb(9c$jt-np*nFv*)<(6&r6BkM0CvK^1 z)`(ULJo)Anv*8od`)=)f^2dA47EZvmW`=d8TE9j@AE?H>0%q3iLF88HIQwr6X;!9kd`=582DIo!*Q)(j7WcSY9TS7!sqepo1@kG+J`|HA36!-vhm+nE6W zxk``_o#17#bJtV#P94Abq-Nuze0pP-O0ROk|qWt%Q)~SQJpQ zV9zq-ZRAkK$zw(~!}-^-hBeY_c9&>I1kF@I{H2dL=n+Ok+0X0fdH(Rz?!E5qPO7+9 z1rh)t#?LPZrBaTUPZ#MCiu*B0#yqp}%C`5Pt?yrIa?Ean8DPG~Y1(Squ=l)W z?G6CULn|vhhkqeL$Sp1A>S@814^xy^TOXUUa?tzDk!NJdQ@14UyJXvLE_ z8#GpY`JL@1RI^aD^!g)tZ)DtydSr+DB7$B^V1Jmv07s0-*L0cH@4R{0`Lw##WKCNj z*JaPSgVU`2_7&k72-WVt`Ua2vN#UE=XYV#h0HMU}S-C8JTjQ>VJh3Ez1L*n@xBI5o z;q`xUmq+)hzRCI5+KzyQzqbW1x$je3uL?jd2I4tDnhqR)N|R;z^hu>c%~3xiEiDbo zBtI)}=OAEp7}@YqG&`;gB8Uv;o2)sJfDHR5`XLIGNu{sk>!Oo8oDn2{l1pfUh#90}Oqf1$-RtTH7VzjnjfJ0hc^4 zXCG-1n(5{$wads&pl?`tG>G|!<`_5IzB|n&vCUFV2QqnpIB3dE*lUaACYquHQW;ph z03bi`KhE%vs;uqFUj7*Pj1Vtov?yEev^QcelPvI&?{h(kA_iof=kCOew7`;UoaU=M z(!1b61LlG3HagOJyDz@+UP>IY&6D67ZPQa4V-jc{enl&4H?$ze-Z z4gS+>e159Ku&NfOMMw)IKnPJrsBT15dmeM~x*1iEphFYnmT8P~%{xJ_PHtYhCZ z!TK-$%Jl>GtTII;@J5%rF94~qad`kFrr7SE)`XK3r5Ao<=?tYGQ-q3;3~7~x%w}N_ zptQq<=pK(RA`8Yo%izSPBH%E^&03@IHKS0P#!k*)$Vy3(6oOE~|8nzdrZ_9yNZRg& zy1%4UC^ORJxvx2s(7WqpfDqcA4sz}d-xdw)Pft4&MFC<`v3yz*(&E4?&QfaDWFU0X zKiRHLAgIMY`fq`=bomt6Rfuq;A^~s90eR@Y+t9$NXim)Ug5OEWs(pQd6$#wq0gl6e zN!<~;-;tQSg2I2=ItUt`2as)mr3Fl11TdtvsONLuoEz}|Wa8v>9ewh6#P#+gpkCa! z+%6+yIFSi}S;=3mOuvi#;Bxgq?Q!z-hb?rA{{1vVwEU~+2q&)uI+!)_P;ht1u=(hQ zV3n5(0yliir5NhUOceCRM>-)P0ePb3*sYVHwCZ_Gn&eRsP|M}-oxLyo|0yg0stR&u zqpA`EC*yNRY^K;$5pwo&;R%C~f#8Gj4L27sI&!vB9|DN5+mnKq&w9Ss!!H04n~B|P zOS<+bD83L{!jG(Tl;1SBozWTW7H6O{!jb9XQt%XfK&sV2s1#v zY7qn7Tfa|~COgU_M-5O&6wdOAGQiT{hj=6F=w}D<9~%djU;X;q)4$h@@Z^^0BRmq( z9S8}^<;Q_mU>*38q0+MKczbi}j@s@Wl)}kqH5YD7QC9$FKZqn9I&o(Gdc?pTy8zho zBfz^}{TDx7`X2JHdmZMTZS|7JjU;DfFWF+CGqMwT<4DE+ZiEf!M>gmKpwxf!dWX3# zXu7QqxM@k=#%RvHPz}LTJJgo>@(9k@fOiC-BEDwjqJI3IBVgK2h#lI3G%6*!4G!;X z1HR%L`m#0aDDcF)XfZ>oz=XrB!Bk`Ij*W7I<+N;w>pv){;7F6c(yfM#*MMM+%`#Fc z>@m2dnSFlKNuTPKbQ801!r4%u@Zm!&aB7~P&?o@8s3plLI#a2mzDJcF>t{L2xufEb z&w=*p`Oe%9>bvF?QOA9}6JP%d_!3=^0P|SxHC0stD-Ny53wJBu6Yw^AB07B!74keT z*0ujq0`m*N3=|M^4&aEJ4d@Z&vNW_cc>)s3!X~y=(2^t!&9V&wi~F7&K(Bo?KhTkfKo5DifvmllJ?h4{ME{ zEGTXd?v>bXMSSIU%H$oS9+yOp0?C6&K>AH8k~!w!W3X+Fl&(5TxqnpML}!zubP{1x ziHNupxvhd?&*go!Lo4x9&kTU#fkOW4*ROh;QXP5OpKx&nB`-}dgP_L z$d(trSE#dR2Ab4`LXpUCrLh)Txq>?gd5xzV#!rp$Da>qYIH=jw;Vs5U(x zO-DSQ8JJ9IR$b6vFRr+@h9RzVW&Zbmz|}9 zMwY*)(5#i5RA4 zR1^p~#C%RoXYYAGEX=}%WeTA{_&mfORBl4>M*wN^XZ(#Hj!E6K&WWfV*u}L~Bv#P` zFTI1r*H@@|ReMsL156H2Iv+y?)fj!MXqt&ltIu5Mxg9>y&U|kcD*B2q zjJ06s4OP2fVdn5Tg?M_1?Y0yE@s9Uif4$KL^pJL81z!h;eCD(2$wppf+VPa8>AX1>tW z<~i3tOAK84*&3hN^%$1>YC;+)acN{t{<((~V6cP7k~AU((*ux^x+_izR_;lw zPnT?1cZ><~)FWSvQ->6c5Ear0+Eo$XrJyv?Ikz%#SaSFZQi3q5bX?tBA;;)d$rYp( z8zFvtPyBR8fla??BcINqw@B68@U6I|`FS(Md<}=Ik|aT?fO3RBJG(7s|3e{WgMKi>xonyY4&&rCn?kW8o~4tH0@|mqu~{vRj48BDt{{72v0#b;(c)%r((yL9 z!6A7^bY07@M`@{$y+&%^gv&A-o&?HVMKNGKW0XKAG^ye_b<5@#K8EFd+{2Ftq>;ym zBBqtBSvuls9xqY#i<}~TJ=7eLSjr`p@0w)8?}z!nRDSc|NLp|{#)n53FC!ONh+E}ZQ z#pIK8bC7WcgXSs1vc%83JImvrg8NPtUJ$`5Y`|k4_psiX*tH$B8Dq{6YaY?y2Kj1_e7eI{Z-)*rY^3qJRJ0Nr^!JMSS`$auiahj+(pD^jH%?I@q?*v*Ika{tZ&AU#6xG8m8H(NNC+=ih)M}Dh!~)FD7~BY!{-SnXd!S; zbj{F8duIJ>97mTLAsx&t{Z<)IRQZuaaJ^h=dDRURO*~PR3o>->HAj#rjcYMv7z6z!jU(8G&>{_@8=X6rr6DK{B`B- zqNWoe1gP?ZxD}Lj>U_#jt6TETB2|>?tAF?1^4i(C;5x@KC}I~9;Ap5AV*|qRh_XIP zIBe6tU?zo>nVA%_I1iVGas>`y%~FEhno^o54Z_=o=lvcUI2++Pj@c;%T-zh$edTo< z9jbz*Udob5MdyRsM}I^|Mq3wx5KL0;o862Sh51|NuiZo=c`4;nlVEqtq6Qe;Gl_hI z27UQaxgZ&gu~g~%F)U6=WJXHrm2jG`I$R#}#5}7B zV^`_x=v$1H^2640mrB8;V3$IASn$drlJy05HI}Rn$|!;tMB$>bWaV!XO^Emi7(sp1 zLUEg*ST~W9xvZ^n7#$fqF|#FEOB%FlRg@x*7)r_{s604=pXGD@Na|A9c+ zL8OvNw?M@GU8kl&A6m_EHQWWaOOd(?gMZ1%d=hH}>w@9C&@EhYh!UvN?yKqfYb>D*7I9`$=rsDQhBTTHNzq%F_61zEMHVa#qB~ zD-329Qj5l0N+;NR178=aEW>Jo4Dif8P=ux9QlTnvtqDv~NVKTs`Z?!*(M#VmE8Ey^ zd!@3#_G5LwJ#c&+c|;wO7gN5(Y8qQR34L!S5?#`|0Ym8*_c$@D>U#8rPf2e~af|q* zzu%yk%WaP)cHlCZS`IvF8^s|u#bC@`h@4ah?kYIJL^8&BaluFCz;*_0Xjf;&fxUS( z+~LTSdc)RfDTrJ2cuhOkD5vdhNjGY6+OC8n7Kj+f&{VwW$MEG=UWXD6^ zsxxRUFX}>?D%H=hC2k^WLb3jgDw^3#4N8ZNSnD4bwQMivMZ(z_j42rY1jVI%j6{81 zD_o{&dVqg&8;tDOsW-6dKbey>oKX%MiEs1R9@J1jm3bvjzb*Oi(R|{#mrI9ON;Ue zeuIPK!mBI|w_X;6lJY7iJIV4)baePTdkzjM8E+GN%k-fCa+lOIG24OTg6_w=^8tA# z6r}>#7>nsjRiU`=3pd3%mP56OwQI7C3sE^Q?7f?^L!c`3aWbsv4P0V@SVe0hO~y}7 zi8a+-*X+QtEBI`%Q8I7csz6!cUd-H_!VyLjdOy4Cfs9VXQ4>Dm8=1??Md69`N&0}S zcjP7&)diTFHvJrnDW|4pF3B|3&X4W8WjD;+x}=W2ln}SWk2Q2XrnOJ$7wsX_rXMmg zo{v!3mc6-2E+5RC{*nylXyY*8RGl6Jq9uMTCa1zrlPGnGwzK#cB?RIG;ZUS!lLT}Y zC>MPWmY2HVlouv&t~R$6<2R;b)MC-rKQ!4}VznL^Yx1CZGRY(Aqa6eZnSme1fs9&C zk_gFU{Wnx^`)@4M7sDjl32Q5XED3CU?SwnO9c8H_ou9xc5A$bmswL9A8&cevE34u^ zs!pTg2bs-?3_s0dfXR1RLz%6?OVBm0{h5{572S98BijK7L>YMZhKfsmX#5%wvqlMhQ$6H zo{Sm}nzeSWz`8CCZwj3?s?m9+JX9(aF2|$lMwsuVh;98jBrFTlz;`tSu~vfaV|osN z%UbOH>U7owwPPU$t<^P&NCIXREvHy{F=c;A%Q#gGqUxVK;bF$uFljcr`)qvid0Ovbu4u#imfoxG*AjZVVGh)=u|wL5ul}?31kZ3FP=Qa zn?$i#3U|#*PK<~#X?0cI3)lU3uSOba5%8P(mb3kTM4qcmuRmd}JcEDO4aP8Ox?}6= z;!dB_>hamg7OTx&zqHAw&}1JU(8$}tG{zPPr#381P4b9Z!ltU&#Ld zP$`(TS^MgQ2{cW{YN_uD5w3a81H7)T`7d^7!8xGjRo8z{xn7%c(oP_oltY{IGYzlm zE2GAkqSU(uJP5Ae7y3u8g}f%p{r9uIsY@bVPotSWuVfvK=-<1vZQO;w(=hTUFWs=T zFxD$TkFtYGgsmj9ZNQ}>T8|Y$1=1$x#d%EOs-v#9(t`(yhsN1>@v7x&6?+;vsZ0ti zt??i^0>v;jKBH`e2}vRi$sP`r#9%FTc$i6+r9?hLwIz$;jPXlRtfV2oWC{ut@1Y_k z61WnkBDZakS+?-#y3~j~?^RPQBPMj*yC3OxB&{$q!ONG}!;JB&z{FHNMoXeamX^kq zTAEh8aa{iJ%H30J)f(E=6vYI^hM)9aYvRZ!!d0;$1QE{Xe+->sNf$ zucq)$hNkK{hc@hx%9&%|5&9M`f=l2_RH{V~5SgZ!v`|>ZPBmxO>zdC9>^@~R5mCDy z{=;y!(3b6J+Rgkm7xYgWdsi!|1TMTKF_S<#w5blBWGFe$gpcx%4o##5;`hiXgUEC^ z@QT$j1~F^W4pnGKGB*Kjld*Zsw^f3cFzZzW4pY?8s7^k^T2qv23_g*>Z8x1lQ&%GM z7CuB}Yx!&o9G5{mN=z+jI~rOPJ$bwD;k1>J^9(9SbC>tCVB>bW{p6@6wzr}0)O3+z zGB&C8wx@);y&?6-x0t8X;U_plc#$`>vVS_860ImPM5*Dt62)TtsP;j8E%8&97bSen zu%Ti%C!RS1YCFbI)&3+FzkJtNR! zj1NiENWTA|6*bT0o?ydFr%-`3I7>P~802!&&$;x;aU7?PjaA~Pzb478AO*3bI>UhB z#U*G4MCDE$546c@AWzosy*ALP>B_jl2Ccj?xv5dhF^;EuP}Zn@{z>LOF(lc7GDJo{ z6b;cMS&=aQh$2U6x4{0fP1cfYW38%HVN7VWzC*ELMy~P=fE1HvDXLS5GcOzC6e)o$ zVVh?Y87AP{{rGmS=f1}m4|-MiDBu{JP^OX4ZrF|aLExC0*Nuo_mJ{}dGL3D9DaCx$5ieynQ!+>pel6+Jcq@Bf`*m!76joX?N`Rw}4 zC9y>*WEhoBA4xh!$R}nqWN5aC*7>6bh+PC-T@&K~vNx8*9H#s>14iOdd$9UmR}76}Tv?*EJTDH@Z>mh#6`c z66gnrvK||sPW*!0C33ga4v`+e(61^Y6{`Q!ES;c-k)>eltN6NXn5i(6g_4jJM{e3^ z$`o!F%INon8Yb*G(Lw;qjbs;snr4ul+_GU9BtH>{ar5 zh~{y;Hudp<_CplS&lp;Zo~CT#=PeuM5*S{L2C|-N`eIHV%{sx@6KNEkhyVTaUL&>Z z>nA}{RVNX9Q@w0ac~3V_n_#s}Z{?k0M%8(T5Q20#yeLHR!p>fD!JP=$iWO zq%=55Y?;O!Zb5q!Q+mis8cT*ohpkxccZhAQNrCmcWaX*d#iq$eS}TI)R$%qlwkJ9a z!8vZfSsIVfwYIpeA+KKc7G@9+H1)3hacfE!@_ZLsPOb8x(on3|F~K{R&E9d^;Qb{?g;pMX08W6KknqrWaauROl5W} z%oJWC5@p2>_H~;>K)~+*_kRJxkE)6^2?kYB0+g0tz=uUNAp5nf-Yrxs5-KbxOvG4jUDs)`|bZ3`sHli zuYuZ<_+4Sj=6g@{-F8L8bi%T!(@NF;g0;!zu_a?T961J;-zG^v8>Z0hFe^!&c>jUe zEq;3)fGa#-z@n8KsoV8!iGId_zNYu+a}aq={oQ8=)rdJnS;F@5bgEC2Z*oqErG!bW z`b3zf1cScgDvzK&Re2*pP9XudtN&eGKU~D?GU6!hu;lvCa4e@`mC01!RIEy=72c5{ z!os>xI~n@}Spu`QK7?+Rh1cYy$RBxt^|y~z+d#EP0PH;kx4W?^J@yyh-lm>?>4E08 zjg{(zEPZyb8VHG!%0TOYxjxgNuUeYny4UaKb>}g}eP*bbd+8`axPhT*)uT7MimyM` z3(eHPYOhsqc`@hYvy7AZeUEGljqtezWNaOe*%schWyp2mtt0qa8NZKF#1W}rzO6Dg z>4yq5s%yX{W>O@h+u-2$Machl;o8nrEX(|>H;@bOay0*200lnt4#7C0BOvWOZ+Uf- zzr)gg zCLY5P>Rzc31k8kFLezw&yo8+I_$7nwUG@)dGPwFW?A(BAH)r$O2fr;EdZenCK{m`K zpY{Q+7$-m4$SQW0H4rolJJ{+XYqI^^iC^X4ta2A#LIj9wab4Gpp}U0~YE5Lt36DJ= zJNUD}{{$X+ILRob22YFE<|{!DGsHUO_}tE*jhVzS`X`*9(>(r$N8df<$?5krlOd)v zyeK!XA0U=6jgS;84^>6XXlt8$kKi%MRjiIddoi5Qs*x0`y3hXpRc_pTjjfwEVQ&w3 zCs!4#I`=1hDBDs`G*74o66uks*8O)MU{{w6K<4Gy#aP;9h{+|&A+o`W(TW^ zQ)q_Jj7aU2hxfmlYv@_h`EhcjoXCyZ$wK_1stLZrg(@?gd|-F)fUWHv!roQb*)2sU zh0z42Q#kmwAey(fHUrnbr;raaHLZHc}w zKgO_n26^p;4Ir%{bKN|bPD?kkFaX0ZmVg42qC4N&8MRs&r}^UGTDjDX7|Y z!+jZg8*K+)&s#@XNo+f{@}^C+ZF>iVUZ_6r)oz~sm@1lD&^Aw_BZoUNtV;sBHF<6F ztuT$OD`(q6B}@f+JnsbdP8DRGr|^;@!03{#%Hrp^WUn2~)6bm`pq6`BS&6K4JyUn!e*E@w}RuYm{v|~;0zr8L`2Fq&{1`I zY^*D5y26bxtmH0qDCMw_W*gfXPHG&vfhAo@yePHy!*Ye}0^Iats`i6U`qk`E<{mG4 vS+{LI`F2S*&}VW<)Nq%OQPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000RLNkle0j6oB(b9kCQjo26~K zq)C^gJGQh)5m#`bprbNwqcSSsK8%X`Lm8L418PweM3hzirH%_f;Ezk4QFIgmL1$c8 z3$&$ex+H0n`rUWpZTi|en#SHabLYPI?z{KPIp>~x?u%vMzm~|z(iaR-hXTP1&%eM| zkZU3tiq$tjHXM4wxw}y*R5{DHTICkXdWtUv)u-UzZMfq+|y4{hN>+;eJ4?dJ` z(Cb%55Thgvi^(=`+?1Q0la=X2Rhj7-*3>kZM0pP{dx$pPx`r=L82f?D`S6{92!>%h&x7>7d!;?>K+p?7rM0xFPr($10O_4}MVYRll3W47!(x&X#v18GqMO9T* zMMiPCTp1Y|xDGyqJI}A5w_*KTn$INr_UwJ8;b}}+R8T0V?=i=FG zUVRN!L4T^XjkjorLLtZ$mR3wK7^LPwQ&UrYeSKM3S*lU;^74E>pWE$DPfurYvA0aE zsAML))mBkfe&0R!Zr!{^+!>lxD^^}HZ$9otxPpM``56ce-R4)xvJhWnZ{S@qG^$eC z5(@$d4Gk_=uU-vAetv#IK>Awd zwQ}XktgNi0q@T1?scXzi1ApF1e_zC3% zhJo^p`P@b}Vyfd7Pqz6E3g$QP%khoe++3`&c=6(vmKLQWWkh2=H$47?ub?m&C$T$9 zy*|iHqr@!$X^Fj$p3XS!^y1=ToCGF<;<4k+{_d_pto?iTmKT?}va;z-4HIgM9bzmp z91F!G;%BTO7SqCo3$dMqJSht6kq4J~@KdYJn_p1oD^8o7^1o_Ju*AbqRc&o8wqw~1 z!RqS`R8>?$Bkzye?Wt*5 zcp_<2%(!Ee(Xdbzo5X?z3%a_LKT)Hqo<3|Nd1NPa-+@OKVkRaZ_$Nkl9bBMtRh;#7r_0nq?u>$%;?|rCFJhn8E0G3* z{`9zGl+m!rok*o#cmZM!f!wwGqy`{e&$=#`y=GS(?85N|Zz` zdXhZYM5DztdfbBhvIUc^u+6~KWqhPiXGV_eV6~oXDaE&pvjAi;u|`msiAIZQ^tc5* zO*$(Hw`Q+fa@*~SCK!r-BEX24lQTF<5<7y$u>xzxqQr`6^tgpog%w7&!U|*U-+J>c z`lE(AzH;&Ms+ZspEcg)A7K;)qrqSaTfN(F!YR;~jl01nZb>p?y9s2WNSEnDZx8P#G z>_5P<7#gi4+M2^8rqSaT_7W5}wXB@nle7v~BSNuD?%T7sy}jKcpG|6~)xbm`!K)D5 z%S5BaG|`EiI_od0Am1`GFxk~Vs|WcHlsVILt({JeJ`cQGFZmQMpC zifQz?1r*c+nIwGJ^z8DANfVRb+3>cCTQG$JL2>*=x805r!IC5Ih!Q*WSOmj?g{rV4 zdg2&C(4RH)Tz^Mr6ia`-{POcJYO1G=k8hzQ+?+KC8BD~BiDyoDZ`-?yM6jY?dBYL5 zBtk1O44s*1w3tSZThI;r51x)4C6Bu4`WsHQwyA9qtmwCLBk*HQG*{v)W>uPKkk~=T zF2qm#i5fjgjQIYWZ;1)=t<*v)&5kV>6u;lU>zi*OGmV1iJnlb<>9=XIrlwVvSIFAO zIP2HF*?jbvSdd~doJxJt1&*TbMFy5X`dIAH!!yi(FD4o-pkNcu*1jU|<(FP2{|iO2 b1_u5DZZJDCvVAz{00000NkvXXu0mjfrX--& literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/asana.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/asana.com.png new file mode 100755 index 0000000000000000000000000000000000000000..35d3e1db58fb8760866ace03d158304986f50089 GIT binary patch literal 995 zcmV<9104K`P)G#Cv zwc+#Gk<)em|Nly(-aoPqrqb_Yui}Hi=;ZPGI-A=el-Azy)za<8_xt{Y&1A^q^_|V_ zX2CzQ;GXRF=lT5ip4f$DvE#GY@j;&4-tPHQt=@dR=V8A&jm7H4;q>|Z{yMJ*ddXNy zwj8_Us-w{E*YC}U&uOaNlq!?h^ZM{w(EZ*psMAVX6$ z2C~zj0007FNklRH%?a6N zfIt;kf$f@r$4t*c*J=RaH*UTlM8R=jSx&d~jgF!y9iuJlQ6ad;fXO!7?t}BKcza=L z_1}}xR~iU08OB;JB|lZUiC>~9PH!QgkU<;fRk~7kPA-o>i&>mPK+eYWIQMCgn=22W z2rz|!o{ed70GCulSR9@b;0*v0I0qF00m_10f5?C{2=qM9n{e_?9Rg_n^Wppi!CN>G zO5Ps0+7iR^*D=7I75#zPJ;epgmbST<^-4?C1x#(?FI7j11Q_)I*Y09YKh*&`oQ71T zT7bpgPW0XaVF;|Rr%&@epiO5=jw-h|SsRBCxVTE|=yFa0ewp~u8T&?{^>;Ix5cp0? z`3nS;Vp_QaHv|U2Y^J>0Bs*a(6b0N6;0FM#e7*K3X92^zH2>WN0LThNoO~KU;mhFd zD*^!7QCFON`YC|e0^JPYZAgf&0|r2@pv%iQj+b)p&>HwPdSR141=d4U^g7LCO8Fpz z8kNLlgH(ax`&$Y?b}`JGXi2{RCX3lvVz%@1gLpNf095JZ2s`Nq2BvnD9dJe}@tFe5 z121RY0l+l@?kFJbXL=JW(hU>?U_gNLJplE4``a0ovzMxw+EEES65wVZNNd(=ubg7x zB4>QR*uKw#*(}}-8(oUxfL_F1B(7!!L7?&8lxeIVKNUa!#}Ca0Xn=nK{062G^tsKJ Rrx^eM002ovPDHLkV1h^d?aBZE literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/battle.net.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/battle.net.png new file mode 100755 index 0000000000000000000000000000000000000000..f5baf8db852946a1c01959356339aa4a65c8b473 GIT binary patch literal 3194 zcmV-=42AQFP)b}02jiuZxKgf4a783`Toterha!NDp^Sx%LvTXb0)$FpGtwZmZ;Uh&Go#T+ zGt)i2ynFJ;>mF^RStP~Isk&WVuiv}x`|kP9x#!##$~J1$s85d@H}1>nbb2BGkFB@2 zx4EsY?ZNKu?#BQGprN7R-|On?KJ&YUHZtqz=y;^Hwe?S2CX>0lv9a-i-!-6-S}K)V z+}qo`%{4SMJeo)(8ZTxtQ9;Ea5`ch;paO`XqNoI5c8Q>$GUwd%Ae~Mxy0~csF#$2~ z#YmHYsUl_|;3;8TdIITmdXYNk5*Ig(VItr?R#Oj+vmjH8dXM731TmnW+NCq+Tq3ym zX$12ju?5TUAN~?P1dbiWHvSa0yhNm>$Q%C`UeJ-_6+|=|2m%D@8o1;0cym~`3xYWQ z`cGm_w_)Cha2q1!C(7}0E*L>nQ2|jc&wi;182!Kz!7y~m?@_94ghDSufM|f^bI27p zpmSD$g&<%Um2lAkoFNrr$?Ecjq2Y{}fIY{O|-fA_7ugaS~~y=@w|1jRG=uA{6sjDh2y~15f=u z{%8M$+q@2qCkU_k11z3Eh*myQ&w1e0UxqLA09FqE!EN|KTz01dvDKfWFrx|I)j_cS zal8v6Q5B2WubxCoB@89pwt*OmUHcK3y%c-rWhw!Ul(Ul<9!1O}K^(?ShAsb7ewlzD zoW-y`AP8oLPM%3=?o!BhBkhObikl;kxB!msN7`G;YwH0hZhM(v>xo;xjd{_g(boYY8XMg~iukK>};t9RV3V z9+@x`89x;pJsL@8NKTnU>8?MAcQ+As9zsqY$DiyZtYj#SBeSl?Ui}FsM3HVoNAZvZ zM8L!<3yP#`v3MNbT@T(v>s~b913?VYBzD~=&`C3~LJr^4iDkPf6bsjIZLbx(zVca7!ql0_7!mJpCJ<`6VDw(fB6K(m(~%Yn1Xpf zd=Cg7r{zqbRZz?!$4?S=974?FOLjYNYh)lg4Kh}^ShQId1NYl+w z%%MH)NXKF1&`xaMR($(m?8GrF*A3IILJqtI*#g0yckr+NguWX;O>o=2B*#rB`^>jd z6T(5^4T$W;Kq+1 z|F`|{qXGxaqUuqjfQr^X+A=KHi)*?8@4+{}41jhYN1ASoDvUQ?0LqI1(GK0-g6w=9 z`OUB4{ry;}L}}toN>xd$c092~A3%Fg;?2Q~t06N6cDxoX&=5g<27$=z)Tf_lQoeCUyMU z6~W>gaeLmvKmR@0y%|h~EWt-q3snHgTkDZb4bpfS;tSD4d$&L)gVaqK@Rd@jsux}l zpZ_kZ4*TIhAkA+==MhRhS&9m_>UOHGUV$?YHh2aaF@cKtmR;zP-Plz(AVhmyVb9xu zL+YoU30xJC=q|Z@1>F5561!f<-d>M1%))kUhDZJy={yYHDCP^~Z~p?ZPuz#7m0O4N z@5m!2Ab=k?1I>m6bC+SM>L^nk-b>Kdg1>AbqT0U`N~P|Ze=V%JpP=U$w(i@6`7BJC z55;^`Q~k#`k*+qx3;t*;eNC%Lth{STJcAMtqV7whq8Skd7lWmD5boWAv>iZ}-yV_b z%c8qqhbgn5swQe$Dg>^&5&P)Z3Bq374<8`k)d8_MHf;`aWDg#N&ZF?3j{qLRJaitT zc-=?PG4`B5{5^IG!tuYAwOk4y7M*U&My!)-AFv&i~I4n$n9wclps@0xbkl7r{5{dAOuyI zzXA&lEA${$DJ*~h*?yt*3y z^M?tO)%dZKkj7b9{R~V?_*jx+!IOLOQ3@NLr8i%oudk0{sW5=d2W=Y!L~!NJOz!+k z;)`z~*z{u(o1P_}sKPlR76iEYE6};i2x5X>{rgZoie&qKcziAS)_qtkgXOviuU~`S zb`Sowm&l=*OOP*lO1Uh>o;HfdyXb4#hJR;0di;G*2i`F812$(v^aF+y#mwU}^@LLw z(&tOqjBChl{w3DYiFXb+W&%Dr2Bs~>kDEkHt4O_fgu=f*NMGwgoO!J6ZEWQqp{wsB z{?Hfc+wflyOGZ6QDG#LrnmtKa?CW1yFVUG(8One*WJ6;XM#WrBEmk)XDR|uUdD#7r zLDvx^Q-hy46-$l+frL|%|NU>|N6)6veh_JG#=;`p^vCFzAEs*Ecj12e4&7fLPgVd$^)W;KaGHh z3|Y(#8N?!rLx2*@T@D}r8gA?aL_(zfAoAJ^6gNCa>85)T6?pY2sG9^=-Gp3w2SGy} ziKo}n_t@W23;|V~ca$id(YW`YYLD>zbO-{VD&^zE7-og2OsK9#^Cjr(p=6-xG59Y& z0+|}9N@2Bi=$O$|?c0KD*+=h>)?!C?Aufo{N>#Bi#2C6*8_I?e142~ahls`y6uP?c zxf~@FCjpi_L9p{R;>jd2io|!nMezOmDSUM`xu^dbf5WFBh@%!FJ1tUzq?2fOPOq^{2m^w9eF;f>i z=Y8k9KFApMjTbd^%tQ-r`mAX@V=6K%0>dG5K@H6X+3_Q=a}&(J4xBsVr;2O_(*96V z8ZrwF*VM%ZeVM95eTa=22f1#nc;>O84~u8$f4H%5NeK-0LRA<21sjHV=Quq9R-QTA z1H%bq0kS~V1))A0=Gg3z7^*y&(=SUhK(4OU(395N$Fp>H~% z3s`e02mqLQY>?v+QFqQY9~S$c5p{z;f0q44<;z3-meMJwrNb}02jiuZxKgf4a783`Toterha!NDp^Sx%LvTXb0)$FpGtwZmZ;Uh&Go#T+ zGt)i2ynFJ;>mF^RStP~Isk&WVuiv}x`|kP9x#!##$~J1$s85d@H}1>nbb2BGkFB@2 zx4EsY?ZNKu?#BQGprN7R-|On?KJ&YUHZtqz=y;^Hwe?S2CX>0lv9a-i-!-6-S}K)V z+}qo`%{4SMJeo)(8ZTxtQ9;Ea5`ch;paO`XqNoI5c8Q>$GUwd%Ae~Mxy0~csF#$2~ z#YmHYsUl_|;3;8TdIITmdXYNk5*Ig(VItr?R#Oj+vmjH8dXM731TmnW+NCq+Tq3ym zX$12ju?5TUAN~?P1dbiWHvSa0yhNm>$Q%C`UeJ-_6+|=|2m%D@8o1;0cym~`3xYWQ z`cGm_w_)Cha2q1!C(7}0E*L>nQ2|jc&wi;182!Kz!7y~m?@_94ghDSufM|f^bI27p zpmSD$g&<%Um2lAkoFNrr$?Ecjq2Y{}fIY{O|-fA_7ugaS~~y=@w|1jRG=uA{6sjDh2y~15f=u z{%8M$+q@2qCkU_k11z3Eh*myQ&w1e0UxqLA09FqE!EN|KTz01dvDKfWFrx|I)j_cS zal8v6Q5B2WubxCoB@89pwt*OmUHcK3y%c-rWhw!Ul(Ul<9!1O}K^(?ShAsb7ewlzD zoW-y`AP8oLPM%3=?o!BhBkhObikl;kxB!msN7`G;YwH0hZhM(v>xo;xjd{_g(boYY8XMg~iukK>};t9RV3V z9+@x`89x;pJsL@8NKTnU>8?MAcQ+As9zsqY$DiyZtYj#SBeSl?Ui}FsM3HVoNAZvZ zM8L!<3yP#`v3MNbT@T(v>s~b913?VYBzD~=&`C3~LJr^4iDkPf6bsjIZLbx(zVca7!ql0_7!mJpCJ<`6VDw(fB6K(m(~%Yn1Xpf zd=Cg7r{zqbRZz?!$4?S=974?FOLjYNYh)lg4Kh}^ShQId1NYl+w z%%MH)NXKF1&`xaMR($(m?8GrF*A3IILJqtI*#g0yckr+NguWX;O>o=2B*#rB`^>jd z6T(5^4T$W;Kq+1 z|F`|{qXGxaqUuqjfQr^X+A=KHi)*?8@4+{}41jhYN1ASoDvUQ?0LqI1(GK0-g6w=9 z`OUB4{ry;}L}}toN>xd$c092~A3%Fg;?2Q~t06N6cDxoX&=5g<27$=z)Tf_lQoeCUyMU z6~W>gaeLmvKmR@0y%|h~EWt-q3snHgTkDZb4bpfS;tSD4d$&L)gVaqK@Rd@jsux}l zpZ_kZ4*TIhAkA+==MhRhS&9m_>UOHGUV$?YHh2aaF@cKtmR;zP-Plz(AVhmyVb9xu zL+YoU30xJC=q|Z@1>F5561!f<-d>M1%))kUhDZJy={yYHDCP^~Z~p?ZPuz#7m0O4N z@5m!2Ab=k?1I>m6bC+SM>L^nk-b>Kdg1>AbqT0U`N~P|Ze=V%JpP=U$w(i@6`7BJC z55;^`Q~k#`k*+qx3;t*;eNC%Lth{STJcAMtqV7whq8Skd7lWmD5boWAv>iZ}-yV_b z%c8qqhbgn5swQe$Dg>^&5&P)Z3Bq374<8`k)d8_MHf;`aWDg#N&ZF?3j{qLRJaitT zc-=?PG4`B5{5^IG!tuYAwOk4y7M*U&My!)-AFv&i~I4n$n9wclps@0xbkl7r{5{dAOuyI zzXA&lEA${$DJ*~h*?yt*3y z^M?tO)%dZKkj7b9{R~V?_*jx+!IOLOQ3@NLr8i%oudk0{sW5=d2W=Y!L~!NJOz!+k z;)`z~*z{u(o1P_}sKPlR76iEYE6};i2x5X>{rgZoie&qKcziAS)_qtkgXOviuU~`S zb`Sowm&l=*OOP*lO1Uh>o;HfdyXb4#hJR;0di;G*2i`F812$(v^aF+y#mwU}^@LLw z(&tOqjBChl{w3DYiFXb+W&%Dr2Bs~>kDEkHt4O_fgu=f*NMGwgoO!J6ZEWQqp{wsB z{?Hfc+wflyOGZ6QDG#LrnmtKa?CW1yFVUG(8One*WJ6;XM#WrBEmk)XDR|uUdD#7r zLDvx^Q-hy46-$l+frL|%|NU>|N6)6veh_JG#=;`p^vCFzAEs*Ecj12e4&7fLPgVd$^)W;KaGHh z3|Y(#8N?!rLx2*@T@D}r8gA?aL_(zfAoAJ^6gNCa>85)T6?pY2sG9^=-Gp3w2SGy} ziKo}n_t@W23;|V~ca$id(YW`YYLD>zbO-{VD&^zE7-og2OsK9#^Cjr(p=6-xG59Y& z0+|}9N@2Bi=$O$|?c0KD*+=h>)?!C?Aufo{N>#Bi#2C6*8_I?e142~ahls`y6uP?c zxf~@FCjpi_L9p{R;>jd2io|!nMezOmDSUM`xu^dbf5WFBh@%!FJ1tUzq?2fOPOq^{2m^w9eF;f>i z=Y8k9KFApMjTbd^%tQ-r`mAX@V=6K%0>dG5K@H6X+3_Q=a}&(J4xBsVr;2O_(*96V z8ZrwF*VM%ZeVM95eTa=22f1#nc;>O84~u8$f4H%5NeK-0LRA<21sjHV=Quq9R-QTA z1H%bq0kS~V1))A0=Gg3z7^*y&(=SUhK(4OU(395N$Fp>H~% z3s`e02mqLQY>?v+QFqQY9~S$c5p{z;f0q44<;z3-meMJwrNae)w}T?9#|G3}=dum})MlU<9xwoa09NL92Fk($$_i&M>Fb%GF#24a&JeH@ z2gZe)-9bdyRSfHd6*ZBS)>l(=l9arveDl)icq=Ht zmp};j@*&)b2#qF%lVTzh5|UBi6bvj`kUN(hT*SdyfC1+Ub3PUlPdz14AR+uf@$3sY z^bG>@k`wkqn2XE~Z$)vDIpJh({sys=6%xYl# z1WlbLO`QxK%~S)!I0vUJGm|{~D^Kz6iQZm`0YQZ~uD>wTe_>-@?&3f;)@ikLXtXka z=i*Qs;NQ)L`of0k=0x>!agHL8lWbhW81@NH?yo|U)Kg+Tk}_YUl{!`A1}>;hN=Z%2 zt4ye!ow%U93_`A;_?9^ZcL26Mr0_nM=mrONRZ#kXP5glW6ywy16m8pwG;%_p0r%k=}^Kl@S|* zaVN)FXOGW#=Z>&|Pf>R!y*x+mM*XL6_S?jE^{O-7$aK%lmg!(fzhb}S>P>Ubo=Guy>T=6cVOtDmk-S+9~uN4?+FlUV_|#r|2F})d#sYjT|opIJB9!N+T(u= zs?dIU^VlgAYTyuR8{ich?h$+gu=2R+A9~ipzz$1LI(y;lIYq_o;1U4fy=bDZV@GuR z&*^q%!BW_#%Y1OL2b+A{NC^pl6>&3p=eo1C4hb&0LHSVR<<;%}Y1iJ;=dt?Jxiy}Y zEq`-Itf&u*@lP~c>=PpPYkQCh7Vna$>+17B7;^DqP$ySicWB{RnbQpBirU`n@*y>v zSm-77RWSYi*6Z-{y{D1uQS1LSHs}HySJU=jEedl-Riy5fkKYvnh(3o+VSi3cZ}z;M z;CL{tkj~deB6XMKO;o#B%jMGPbknFUG>2*Z6=8zdy9^Onx;^DMnB8nwY2TOY3!~Jw zJWP#BTu2RT&KOB83y1`g|yx=Rt=UHv8I$<>Gy@qvG^XUo{wM(lya!TsF_3Fb>Syu z(MDXGHdPm?Xb2k>f05=$y#&{H;D|u&yPV+Ks-Di3Y99p~PMrDIC@N(G4;_L@c=#`m z<`ts3Tyd@8nwW@y-JClokf5Q6n9GpC2Dgf&s%`4&{Pu5NQ#F^uhhBM*&>?0s4~3Rj z$Ruju5cx@d(TLwT-Wd;m|85DeA?xG2We>2W6h}&mS}6&~&U22ft^$nR32P4Jmg1v2 zz@lqg1)Wgh=q`Y*3y*!+J5=P7RfsJTKYEUo;-NZ}@1p}>ADYpS#$wrugW!iCrDBff zU%4mR6Tsu+EC&xB%-r&C-LYp(Mqc8U+1%HwqVR&cLBcxrY{hYrYjh8Di8=LtoJZ&) zL6N=WOy&=X8h%w{S`Xlhi{LzCtcSa_({e6BF_z@&)5axJyuCLsj&zZ;!!;aZO(AP6 z#3xCO4HkkeT)+EG6`aPu8Ic*&fS!ptirVAm5eIk01##$y;4`Oiw@AqB``wq*e?paY zA(`_i@|>28B3fpcjHBJaCeRGP3(27GcYef%2G3XtNaHox0}-SHJaadk6kr?Yh>@|% z)V6^<0{N2Qf-IrMO5Y#PcxiBa0qPX`8FVAY<2Wn%2-g7F+Z&;3r|NX8BwLR4!X zj!?qcyA%0rm%&2$O!^qW2hb!LMk;iqr;L6jMIwPtatE7(pOl1xQVR4qUy~O=DYJq(@%KHQNauMF32kzvkP6V&f$WO8 z8^)i76ZE=);ZMLp*CLi8twBG1YeYs#A*4ES8!Ch~f|Bu4mHN1$pLVZ?6m{eMqhff0 z?VK;}exPCnCulB^$LDg8}yY_h;Ojdz8%gwl1F zXZ>2M1RQXscdQ{SNUvkl)6=^ob&)hMAva<6N~}pSm@VmGz3c$g_6tV?S>suFB++N1 z1rvVZMxddal39WGmE0*#&4{iZMe+FZqZbAKTxg!O9}F>(wYJqHVc(IIFu2{F42%24 znP2#*_iwOu#6IPn-%b0GI)_XCfqY70d0U3Wdf?}hP!{U@oni-*$uWoT|1nK3%mlBN z-`6^rGBcpSl>YWBSw5@B6kPwgQdKfj0ebsHK?D= zJ|Eja(cgqZUJ;GuP??6Z!JqTaEa^upAhpXP41G5dJa>gesr$F!TA7u>Xk(~McS{y3 z+g!)!TE?>=uzjBD)84j)$qdw0`27GOkrut5v_9759@);xrHJJZE|uL{)7$ljc|4v5 zQWvcDep7mS+EsLBAFr(3`&LOoIK-lEBArgMbvcu-7GJHMk{58bepdCgho~TJDI)kC8Y!={uCt48gu(c}rpN}fq z_L8>rZmmxY=6$=bJ-jZ&oqo zB$TaHU#6UH36gWbid;W!y5zeqQTww#t^nTGOL$h{p0nEPBRvE0?cgHG-OYMgNE$2W z;&QASoR$l4?^qa+fEWMt;;rF-Ewxl#SY76?Ca1{E2ySSyvSwa88~NhteuUI@j$+=| zfHFv9LG*7-mSsLESJLi$_dn@1`4t_HZLnFpP*EF!DWz5?au9p{QyR;3)|<=y<+CHJ zTl*K=tKx5{`~ zd)%v>kp5?`WMBU88~}St@~nZoGH@bN`cP%ntm`I!)i@OiF9*!65$^W4U(W+mf3I;^ zQGNz1gLXYfc&q}_S~KD5m?B}`VvdKV?j!4jX5>AeK#qqySGm<{Hk{EKo0QhQh2?eD zb^94}&`LsBK%~uz8VgqiMZe|30_m;vagpNDK#`yww8$RvI&Ak;wo`)2BU4$;=_?pd zb^+kAx!e~IhwA$f#Uh3;P8s&0s==xAA;NH8-%cL(dWBTHpl;Q7*C~CMH!?EvpP!z~ z{gk+M^Glz2YTzCu;kXJCkzu)LCWoT~R-;VDVO*Aseu7$!>HFONrE5L03jw{>dj4iX zqHxcqV~i>f%z;p5I8+tM7c|&fc^S^=&48`-)qjbqY41XCLN6Hg)bL`5OL{T;;jlLl zNhaHevPmxQ^EX5Ae(J)-q3y&t#65D7a26TqDq=tluWk`mk1tf~xftY%1*-VC@t@R4 zf-l9px~d5+c2IQmi_PKMdEYTe##oxsGC-iWqn_?a@fpxEj^ab%$W3p ziry0g&pxcqC%GoNSz9?({&^Vh-7TK1B4*q6_g0;1?_)@Q#I~VvX57hNa|3%zlfv{? zwj|w;Dn%yU={MW%NoJ;Nu8Wf5K5JucrPO22!=0CZmmVLlgtZp(DB0eU7-FFT6H{MW z{2)KO=2AYPws|424qv@z8z?$~El+I9-r|T3;;WwBYR~z_7HRpS;nV~2SaLEtO=RXg zt2*l1Gf#YMbUSnf-jOJmXtbTSeEU12>#OsWkP7*vX9!+0{$<>?-f~>qofPKmKMucH z<>gxGB-$tX$+x;T(te3xA4(GgcZiRoX;7ODSD?iHUJI05B0E8j;;6P=Q31*Hm2Kd- z0PuXIprK?pE8@cJxZ&t&(<-K(vQ|HfA?Q>?`N<~&b{o(5WiPO$roNtP(!$p})MX$j40 zrMk6DJNx3D9Z>bK4}SM**=DWhLF7jIX!0u1jP5(y6)pa>dtW${UNGeH#3q^;ID5tN z_P)X=D&LFZ9lLK1s-UuNOS{y>g)P?bj~@btZmEm8IIf+#{;J`96Ax(ztKeo?epR7W zs2TIl`KaHky76D*?Qi6OAGHvHx!w(X-)8<)8bWe<4EF*Y7O7 zre9&(qokSbxfVd$az*BJHA(xgYoRJ6Z za$(U0bM#(1dB#I-P6?!*CuT*7TKUBXaI?0h!h&HWJH}GdmfD!xagtA#wc(+49 z=O2q)#GWD9nR?+pCTIwm{MWX{-C}(>2g=}?qZWYFju2#>=ZkjN{eVK?7?0OaywP!F zj*zH;CnE*a#8wa1=ik~GO@fJhw9mo8+Y`{0oo%3|^HXon>Sw$p4$W@}7c)Zy&v2z_ z6Uwc@;-J~isk{1dLq63VqT=35%MrK?>Fgpe7}#`(9**po*Tby@OnQJGXz-mU+&EdB znn^F->Cti%(7ca6G>XgH;wEVP>HzX$vM?91Cn=GtUvs`pj+N!(KwIgF-uyqkcmAT| zMM!TCL!|`Tw%wg!mmt^9xu(gU1PjGHUhPhFJ!iooufBNV)6nm-zaxi|5lKVz`2BhM z-hL;GK8&cn06SM1cxQB1B9jVQ(`Zto&1(fK94613?esrTG-+Fp14qE&NdSg-F6sgV zG36pvkOwugn@h`7-^MRl(nB*ooDiR&!MHS61!Js8B`0vo2pZyTk32h>S0amV0%~9A z@FREK^siBp7Om<)wo!^Qz$y~8##VM-8L_$UWpE$9So&EeO3`bbC=eCSkBSl3L#Mj; zWz^b&D=m{_Dws~!6$Elh9C1IN@Q_0_1*Wel3bI$IYPF}S+zfTSBaVrbiMW0A_6T(s zR3(2^FiWov2(YYFFHiW+=Jl=(aa*4H@7h7)`E}RLO#Hl3gdeD!X}ob7XnRkZuZvMs z9-V#hjrted@(sgdMDP{&RzXahz+0B{r~V=4j-J||rq}QGvJ;#cDG(jz_1Z_$L5Fll zy#T+dh1+V*lTsL}Lst)V3R^1uAh3Caf5F>>uKVnZ@%LD*sy#PbIb0`eX84yjAq<;# z8!)XBsdVCpa_2V*@&_r*+~JUJiUp_)@v(H}X4*$sYlCG3e`}K^1QYolm?Sx!&FLrK z*?6{iM~MU7|KFDsC^0g7n}TKSmMf9|Tg|)*uXFd~_l4gp+p9f5HoC`bYZH<@TZey* zdB6WMx!9`S2y9$&5jf}jT-QQkwMm{3l{q1{ew(s(;dqp699`l;(+-@m2H~zNZPcIaU;#yQ)ab&Kt&Q zu#rebdcnBZ&p>_9?6*9uRc1)csar0{c46{NM@u!l=L^HZtpAE_GFrqDcrxOR>%7Bp z`57aGv&q2!WWx8C;k#s)6SIJM+$wx?HquM0BJ_dq+CPM*;mYMT;>~?V+qa3AUGJe* z9pI5+!XvE|h^Pl)I!5kGo1fG6S3W@F2$o$k+p%cvZx(IVKcM|IX+L!pwb^p?@fJuR zDkA&erwM@IB-Xqp8_w!0q$&iWd<&P)H+xI`Gc#^`YPhH}SLNT<%aiKWrxs*jz=ogu z-6@Uh7vN!Uc1~So1b(*edaD`%iX)S?8)>O96yHF>g@ExhjL4-0>2ML(MUJ*&pfhrI tzVksD$ECQVg5%%FEdSG#Cv zwc+#Gk<)em|Nly(-aoPqrqb_Yui}Hi=;ZPGI-A=el-Azy)za<8_xt{Y&1A^q^_|V_ zX2CzQ;GXRF=lT5ip4f$DvE#GY@j;&4-tPHQt=@dR=V8A&jm7H4;q>|Z{yMJ*ddXNy zwj8_Us-w{E*YC}U&uOaNlq!?h^ZM{w(EZ*psMAVX6$ z2C~zj0007FNklRH%?a6N zfIt;kf$f@r$4t*c*J=RaH*UTlM8R=jSx&d~jgF!y9iuJlQ6ad;fXO!7?t}BKcza=L z_1}}xR~iU08OB;JB|lZUiC>~9PH!QgkU<;fRk~7kPA-o>i&>mPK+eYWIQMCgn=22W z2rz|!o{ed70GCulSR9@b;0*v0I0qF00m_10f5?C{2=qM9n{e_?9Rg_n^Wppi!CN>G zO5Ps0+7iR^*D=7I75#zPJ;epgmbST<^-4?C1x#(?FI7j11Q_)I*Y09YKh*&`oQ71T zT7bpgPW0XaVF;|Rr%&@epiO5=jw-h|SsRBCxVTE|=yFa0ewp~u8T&?{^>;Ix5cp0? z`3nS;Vp_QaHv|U2Y^J>0Bs*a(6b0N6;0FM#e7*K3X92^zH2>WN0LThNoO~KU;mhFd zD*^!7QCFON`YC|e0^JPYZAgf&0|r2@pv%iQj+b)p&>HwPdSR141=d4U^g7LCO8Fpz z8kNLlgH(ax`&$Y?b}`JGXi2{RCX3lvVz%@1gLpNf095JZ2s`Nq2BvnD9dJe}@tFe5 z121RY0l+l@?kFJbXL=JW(hU>?U_gNLJplE4``a0ovzMxw+EEES65wVZNNd(=ubg7x zB4>QR*uKw#*(}}-8(oUxfL_F1B(7!!L7?&8lxeIVKNUa!#}Ca0Xn=nK{062G^tsKJ Rrx^eM002ovPDHLkV1h^d?aBZE literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/e.paypal.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/e.paypal.com.png new file mode 100755 index 0000000000000000000000000000000000000000..7ddea03c9940de970baf32efa1ecc986a101b6c9 GIT binary patch literal 4545 zcma)=Wm^+~0)aCC#nfYA*Cj+jbHmm`&!2uQ;yNg2rX z-d}J(yyrac`3Wc42&hd$#7KmNg+-#Pqha!|js6QE&cDPCa=ZOsnP{tFH6xk#{|TOl zs(~sN)`v{uJ7@fV{@7o~ItUAkbnw4mkNVZU_%|{JYgz@H`nd$>mZ`sDg80S21Q)Y_Q)e=vlutK{lWa6@h^HHv z#F?L|7(z;>O0RB+NNy#NX;l#Yo6}F1!JfoL8O+-+_+sNlN5DYl)I*=wb0JUq3GO;L z<}{7Uj{yq|5AgHa8BL~Q>E@0rdIpnkWp=OdBY&(yDE0_o6&_2)L*_|1=@}Qq^layA z8dLdd?DM?SQz+`{PyLYm!x<;l$O}$gd5UX!^rSxNk9>sIYwP1F zw)5>vf9z$781gwMEV159Y*yT)4UR}s3g7V<7`Ogif?M5U{=5nw+d;k0?-!k&BCW=`hePq???Nqz)^ab$1h?79t)qL zDXhp`W!?7W$9><0?TVa=njkzq^1pm=Q)VBF)s^t}H0U0Gte$o$;qE@g4L1&W&Q-ug zNS(v_kv&d}#X^IB#=#eHG%j$*eKZFKIE2ameKHbx(8k7X|D)8hMt;?$TUQ7~$+W#5 zflwp=e3Q)GpY{T$<|K$&paFBLcR0$^6G?=rYz{^%uHAT*a~#{OCDYo<8eoI1)=9Z5 zRn=lA?W7C2kY-^2-k?{>@(3MpbIrr^a17)yLVb--oMSSXm7FD<*mInrKyJWl4w4`r z+r`T-2@sg;QETf)?5+n5FQExxxe2I%iMaQcDxGdycKBcy}{viVQcd0tAzD88E-ysmYHD@j5jmbvqS|%Z(S45 z-AagbI3Bu=wlH#<^vQw$JOYqAeL2Q<&x#zvri&q4mIEB82%P?m4m9!X^z)xs=m3|r z%mB$|(@}ZyN^+5bRvDH$zZD2F#EbgnBr8bk$$;W99TtIVR7?Q-IHG*5FV zhM|Mvq0HJdh5Qr^fEwIv9Uf>FeugmK4=nV0kkN=3)?JvwO5S;$W*j&+923r%y*B%S z95QZ2NC=KL;YcbJuvEXrbp-9GXo-t|pz(K58veS_sYDy;=Jh&A)AgMEguavbXf>*a zVp+AdC8>%Bx6`ztUpkYQDYVwWjJeA(TgjB+-dD{S7~pqN-}xT=R3XxKAYN5`vlB+V zMB%z+&ATbe7)dpq7flbogYC6EaQ&`0&b>k}*W@hiJLC}+ zY>(h#>WBi{mGklX9p%@HZGG)r$C%rJ*z#yRxzOO?bV5)N@EYWUqV(A&GH|_4f=b|k zoVG{q3`rHql3X^?d6U~KYfnLr@bk7a+jBr-6{ZakF~pV{kUhON zE6@^cg$1mI@k{lhGH&ralv{ZQWyNL{PTOMMx%@4#^6WI~w7R!w_t06%dry#mq9>g` zAVo{%$~%E^hj=Ja(<{4fmU0H_>luLFc7{5DzEXJ|3AW!_$dU5U^bSn?75{xF2_4bS zArY;z43@kac|6#%u>IHg_ESJl+c(@)DV9ms2@6f|tG&1nG*Df7U$HiiO>g%RgphuN zO{Js}GIx{YHX-Dx>i8JpB zDs;#)8^r8i05KL@={#9l1IbHppvNWqH`b2 zUG^9102;13x6(`g`)5D3e@);>$(9&;MQc?%GOix5p}JHQ;Rh;b*@e+2)n8c2P4AOF zhgjSFVcI3YrqQKIE}Aj1;2Mx6n`noBnT25g{BqZ5D$7#*QP}U-NYgvc7AF=9nTynx zVd`5vo;AdN(DeFJ55DEo0$0Nv;I%z%RZ46=3HWA&_pa6QhQE}~lyp0v6M`P+ zhn7!aH23JpKuIsXdmcya(k@P|wqMiPDwk5{mn+T38Em!$3nvRcxOrc0j{CG^d9Y7d zLz8>{xE-ZDAEY)o$=N%IW0K7Vkve$ZHz3XCdFiK`KzUJipbOJ?$T82$)cRyW?}1QE zuMhEzjL1T$B1@1tim(;$NhvZQRfFse)@p^B`u=Wplp~N>kC`oBS`oc>?gzefH`_Sj z1U5zOp5~Dlo2m!)sAsmk=IN;#baB37^(8z%WQ>@$|IXGkcQ;M3%equ?WmS6C%Gp@f zzBs^~%&Ql*s2P^9gYnI1^rlC*!#nyGr+JfhEk+FF*Ht#x`yGUcjHtnFsKbgh z*hl}C1{ce3y5-c+*PeQ<*Cyms-oPz*eA%g ztMu|q*NaMpoErXLyneI&u56?k_HcW16QwjY|4$9qmt%2nyQG2~ekeypO~u=uv;Cys zXDQiXsIjHbH(K?kV7bbrVaa^s1rRiG=WpjtO+WKM)d(&~zWr>CYP;HoC9GhkzOSQK zwpR{DU7Dv2kHchoL7KtK^DA&|vJT;NuP~8~-!%&-A|2LQ+AS&Q9%B0<6FrOil>9~! z(Tw|OYqiy!k2Vi=OvF^)`cJhYH9GvhUBAYKlH`?S5D!?JKe{QBdJOQ`4LbdSF!6 z3?Jg!3o2z0^IPk5olEJ}8jl4{$!{crl<9tKFFV;K zwm7ABzQcXo`r`=9`Pvh|M?XXIp$p2>u1#u`TFtxux*2HlzB~{|gwkUo9(|=n3jN+A z&@O1dx_8}FKko_Mxk=Pw)j_t%hJwxKj=H1+QzSyPtVUiEWSG(kqy>|<#Tb3t`pQq1 z$YV%mP(T?Nmh(H6U~%*{RgCV+{+G4b>sv($wKt$3z*CKrg@~L6^b1 z2jQE5H?pS63h5n$ANMbdHl({n3yf;R?}M~1V_{g`Jf zbswSbo*pV|I@++>?zc4DqD^=x7b59UCCS1zl(nUAo0QYh;9cbOAm_$R{F4c9%yMcZ zQFq?HjzBK1X%KKVCR8^#iKC048+R0XkWs>$H|u~392Jzj3*ElIJ{!3X8E%U=&s7Vd z%F{N=&-iAfsDi*ZMBO@S*YKNk=Rr5)=3fs;?BHn?_r?y=o@uPE_@h^v76MDFe&Z*m z7=BYn#0^!>Z~Jh<=*yj_gxcC_&DXx_NFWV-!K#*heFN>+3WFmTjl`9Dck_ii01H~F zvM!I8@IyN9hI~(3TodoYGNXf?=;CK}#8vrO)sDwdii$$|9BE_d=KHY*Pcau|hoK-r z?9lIi0F{|t2Lm>`0y*(#^MYa_z$917P>4;MM4qFYa0ST~# zyg2#kZja{WNg{Bmm;}r9E3<8}%`@K1k@kf{L!La@tL*RZFC=g>$GK)%)`5bq3h+rf zmhPQW-;%z*z!1=O>dGxImjJGru%Wl{+=Y*Yg`2ZJ)kT}jAx=Aqs&*j<2dw%;rEYMq z8m|&!S^DwsmVP$)A@nN6UU&LI#Ais2<2b8~NKksuNi~qjJ(flqe#y3je6k|xXF8Pd zDx?(V^Cxi?-|#riszd*LqIYwU+?3Jfij>bL3VvJezxq+Qo^KZWfzmedMat<&vZ{;p zrJd8xHx>Kg&&6|==M5OX4>`K^aqP2B3ZKiE!%dWLXWxbBQ#LDCe!836M`j9E&BP%? zEQA zD=Z^M!YN`LP{@9cH9bLc{}l!r(&EL(oi1AxVPaCFR&!B^P@Rt%a!?412rNMIa<6)< z{*79$_UD>Vuw;a&3FMvWr}o#=A1@jIq$cYUZmL=QA?1l1EymE= zrXJ7glo|Y23I#310~cD^+HPUv*C={jq*|v&`k(znw?Wj#L3%0q^_M~YNie>M(Cn?b^~WgVY5#@zVp&vz)&st-4JBwfs1rB>WIu43+Iam_8SYkf`wtdZD~L z`iIy};|W`nxHy#d&1IJV{G74JO(U;KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000d*NklqP(HOdYhLgD@rJdlwAE|&|J%LTi`0fu2< zv07ob*)TCC21b(+R;vv{kq9oDhDay`%d)Uo%u(H1ZL&e9OLaOOab~kA(q^%Qx?C;| zP176z;Bt8$KA+zy5DGi_K|$ArB2kk}F0bP81vLt#;u?qI!fv<2X0bph6vE9g06{<; z91JH-L!(whXV8Oo(ufET2T2eZH!cd(Q&Pd@QgFN7gJPr*0Ag7dJU$;>UJyKt2kqCc zrR%!2ncdpXg?gPXg<%--cKR+C4VR0SS}f-HzUd@MvJ$DRTB%YUl_`{8iY3z1Qke`U ziv>=nGZ0lDnFCms1((NzQmsa7ON;pXi}h>TuU~sg-_xBIh{`bxL+Euqsd`;cDuCC; z5=nK;#MnYrX!u7mrP9c!DA*m2f4l=&mIa5yflRJIkG4y2{Ocndzpty?XtPm z8dGYkE~HT0x;Nqyro5YYU(%lyDwUO@D6lLuESsd?;28#Di3C9c0j@OEuRBq3r1AXO zGk>_-;QNx><&s~juiaYyd0FH4wYBR70wKf_85oASdp&?6ZrIm)frV_|W0c4_>-_@#1Q!Opc%+!H|0cH5Bkdkq9!m0$-K?bz5E4`8RNH68GHc zlSOWqbLt}tGhYu02^o?T$UAj=flvgu$Ad!$ivMyCgZEO^x$icY7VRq%3Pn&T74UdG z!*hV!?S@1mfl{eNV_i+j50@@IgHb|PTbftDv*SMwu`COfN_E?X5II=4m&+BfJ8A6O zyXO-yo)s8n)KFiSwSL{&VjhnVl}ZJcWkHZcKPD-PLSN=^I1mbjh>VKFE4drDeS7-U zQy8UGT~)Pm!-n6!EmJ5!ayX!A7hEp44|A3*&4$zI^s>!vN7T6ScrQPH$-a+2+KEw4 zO^uE77?!=fV8Npe+O96Jy}=FaO(sgpKKBZHJRU?wMd61lS5(iheWnXzhzdUVFg!jX z;l}mr*FbVO{}%&XZZ}+RH(V|kxI7-5G>zYHed`d$7;XFAmM?5JTknq6NyA0=GHEax zU@#h>)9Vo=5aPogenOSQet-VAR&u zkY%O&-^UoGlH#IWlO`t?@q_qotHlBk1juobk%)?n#PqZ@oIY9k8sqTI?tY*>OWCmC1Uiewubd9U6+m z<$rz7;cy5>VtmV%Es#p3BdVZ8B0*_sDUKdJ3IGrag_tyH5^8E{000~g2ONq6+DQ*@ zEA4jk&YeB8eo@xacMS#uD4|dUtHq4EnwpnJQt^L&;RU?))>{E-rM$d6@9)iC=_@sGZXRg3HYhK4f*-`e%r6FseW<6qnYo@<#LcL2wXUSKDnn`J88HT zmP)1A`QCd00lzFe8x0K&0D$1&U~Jm72>`Hr_ig}y(P+S#Z_l8mr3F1Y-LT3q==Bro zYHDV%EP(&oy%*{8GX4nf#Na{=>WrB?^70En zIUII0H~z4AxGgqk&K!&%KOW7^%_C}gnx?U8HB{QkEcyfVIpm?&|6qu$R32a&ExN$X@ki7}<9H`mB+7(qJ%v zW!ZpERd2ujC#Y1aK?39ssMYF#lw-GA=U`^~oUMUwy^(NC%!E6}isQ$R2c)dDnX|W( zMuQ>lURtP>9W1+}%!3a;h{v`2>j<{F`L36 z6p4QDr`t#*QZ`T&5fSON8yp~jp8&u*RE6i)uMY_LlG0Ki zyAS;8SN&w1PA4l62z=xoe>|(7TvK!NupPkVaxKJ72MF&pUif@IzWVAbXfztQ-ENpn zCd`{Rub*6NYb(rV^PqODRx2KU_+i*=HgDRE8yyG@)%eJ*UcDN{#l_z5ps1k@0g9qn9*^h!UbA*>|JG<~_IpwE$L-tu**SCO zjE~ITy&rn>YzD)NJZSgXy}uM#OKseajsjg1`;Ow_n>UYS|5 zXAfyuRa6`sUJwio3p?en;^D)G0}_!hT)5EB&bDpad}P|%+J+ok9?#11t9+$O{VgWM z#_sn=={JiO^((lxw$5+xYoB|rpPjb$b|0BNd-nJhT#Y6Z%i(Z_T!#sP z)HI}^L6Rhj3XA%sQxpeSZ=+jS&{q99FxqLudNl8On z8!TS3EE_qipVkaTcuHd8T?6kJV9p;ZZ`io8pS??$FAqugrQA&shMv`G{a(oV(2#$oDxNq;+a zqH^+J!s+ShXl`yscXxL{ffEFQ#-=6|78Z`kPIh)ScJD6m#vOtnkeZSTxm*t2Am@fj z(~`?$C&q#@nM{bDF!8{t6P2$GR=}}i$1r*FDKVM<~N!+1b8 zHa0@4P*w$pgftE&>~gtAx%ESBEe z;af{pgTa94m>5sivg{YessonhEPrw4tXZ@$h>!5FP=tkQK%m1uVlNchlyqvDW%q|FC_r zL?QvpFc1la5DI#kzeGpJ;Q4iHw;%p{`R36K{?`j1{qu((f1KOe(h8^334-vws~`q? zG{rCsWHK2-#1gDrkyBh5A@CqgB^VI^z?vs zI`F~Xk5(m4z3+?B20lb0Eq`On)*L>Mhix{TJ$ZTU^(7NxF9i&#avySE|3cSCFeTp(mC<_3V^cbLRe~N2`Uy;kaYV z`{jUJr#FnpgKljXX%!a8#lOUTKbOw&gJq<35iqx zGk!{9o?N9eT1+OmX&OO-AixjsemkJABRn1t^tv8!c|3Ds(zM@=i;2na>g-r^t)=B@ zgI}BBO{N-OpN`z%k4fP6oo(}5<=J0 z4X`W-k{pp!1M+&DAPCTOuOq+$3Z?qw#JEW(L6EPR4Eh+e$(W+=(WP3gmN z6f{kTfMvzK`lOl1=b3mszAi{0XcLRYO%j=`N}~y_rg;1ou|y1!NQ8#^dKe9QP#h8@ fhZB&0r~U5$Ma9=hMC7!q00000NkvXXu0mjf*kQ-@ literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/ebay.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/ebay.com.png new file mode 100755 index 0000000000000000000000000000000000000000..b38920ca3eaf7547f9388e0d244257b19a67d3a4 GIT binary patch literal 4621 zcmV+o67ubdP)00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000quNkl#A$qsB7<{iG`02U%B`D zpLgc+f#r9jtH0+z$M?(`=H8h*^FH(T4`%v*POkyHYI+UeRnuz#ubN&1crwZA-zSoy z{v}e!PhJ01dS(DMPX{Rqy%7EHA-)pq636CmtEhS`%d$Fp!p_xbG5Z`6c$V9G`1D73 zF+V=erFg;lr_tjJzy`fk{tFdS6eHjNQBtSP^!U-7WX>K21(gr3mt4MGcH?%*)%?=y z=6196`rV4#d`kt~imz(!CYy+X=LcYvO$MWaX5>9@>Q#x}Ob;E(X8~T84YE;>xu5SH z?3CrwHP<&h*EcN3$J~czd-vSl2EfE8{PSw!o6yVW1VA5G@5z-4mqb{&WFI2BJ#iZG zZLB2G@dZ<_Al*jZVsae{tUMgq%rh_UR4gJ2s!ELL%-7G%b*Ig-Xd~rSO#T!EsaB z&EvN+JEXgH+2Iws%PS<;JvhfBIL9qG+pB$+Q~zBZOLZmu^Xfgt7=-aN0|0K$r93tv zhxtvh>^P4F&XI!VvNkhZ-&t0vGhmInca_5Mo^D;%6`0O1G3^aivYRSfE#xf{nlVK( zW!E1)-O*#BM~7wZp_%T%J3KmOdjddcu20+a#u?W)Vh6Jj$RKDtI_Tit-Or;!P zzuGBvh^yUmu_kh%W%q?FY=Ot{Rb~Kup^8M+nY(*T*^crLlDvr-lbO7Q0fUliY20FI zN@Kg1*R~zt>>B0d`+-Zx^_pt6LG$b3QL zmhO-OXIn-lvWP^Bu1T7Zc-Ns{1AuvV5FZ+8P;gw?Vhz?!TdkBW7D|dnPSq$InfwDa zV+u2+OVOV-wj1p1GT6~$h->E!o}qc}owMCTay|c;>2T=YUNC@L7dyiN;PF(!Kig+H zKLUWW_Edrj2?+oI3z}`!Es1p{08((g>yXu40%oNb@rWzWzV6_j?mI*j-Y8?{7s=7_0T|I_7JH6}FBGxrD&jSG9i(ubVkB#9+8$^IJ$d!1U{m)OK zV9#U3!cqkQl0er)DFOiI3khIK_y;1+y;6KZNv$QPGF&{kC(Xg#pG%^7Sw{=5{?)h< z!qG&qpZBIPq%>(cC4(^B-+^x00ud=Tj2qx1Qx?` zyr{`c>m@*pnT=dJdHffD8#YiX=RgBb(diZJd3Xd{s1HV{Mm7L(?M*wKLR7*go z=N$8_#%Sal!ep+jGlA)h`bydxN?JWAk}2Cksk}=oNt>bDrE-o3SxA~@;HOPs39#m% z#oi%1$qaD)9kN||?PyzAp~WYlU(53&^I9NQV2TNzon%csPbW$uLWja#{gwV!Jhk;u9vm~8;qZa*md_^Tc6F{|tKUQ)YfqFw*5!oT=o z`_T)4As1gVotm!f3NU3hgfS?a8M&s-l4%qCl4RJ*3|q*bZd*~$<{c*hP*o_~t5c3g zXpSd@aQyBe#I=@N8`AY>aRAx|zD2gpwRX*mnzqq8v<0IW(_`b-h0WTa(b%>nmKD_V zcwprURQD~NOf5s_w;N#U37i!c0x4_!83H1I97BnbdsVIzMuj?=Huu2q3uOI>}h zZ#6E_l3yF2;jG&tGK0|grcuj1hpb{9;)F~Pp@GdJBA#{q%lpH+9U05C-$+Wj6@@VJ zr`3T>`8#nh;sXgGlVvWf-73xx00ft40tvDs7_@j4jj5bjyO#8h(QQgIoII;s&o^AZ zWjuAZGGlw`sLu-Ca4)p+DQxHmoC3)Mo8~$@|21`*4`ROKm`i~BVAgF33tylKPtbIn zXW2Euamd$oA{VmG^Q4FbDQu~C@6V1+lz#eHb840bDsD=qYc_7SP=4xWIyFtXutd4E z64{Xu3#Aw-3}Io+8i&9<&yZ~7ry{*mF^BKl910t?xNqZYu=QVM?Kg<|kI?v!VIHn;PLR4Uh7jxrE47DkSJTB2MS}Fj#O=%P_g5lsMLvSGoU63JbbQMX$pFB|Qd{mD{Np1c229z;~47 z|2}i?V-pHvfKytQaun-DG}wFcDj7hRMeD{oADh7T$4dJ?Vt3bQNCF3WekNB^B$f^2 zMymjjE~Q$MYMq%m`pB?=bUUPU!sVMAOad5S)&Ut!8H}=Ycr0yKef?@8fJcDA0P?{y zX#W!cXnaRXKBG0wZ8}b8T@p`RxQ+F~&z4l^9izWyVY4$nX>cS~0FZ7hwIBdzX4C%Q zo}WmkiWb69!9#q8sl&AWwhwmV7Or_j~|j zxO`RCYRf0ZX)Wvv8@H$lU{x(&02s~uV;E_XTZ{45{Z{^VpNbEP+Y|`pz>hc93Yq+4 zY@I`~>_9BrGfujc!~vXN$^js|B&?_tm>a~G-%R7_#f2^q4785UaOP`t*DVNj2HmcTKmHW0ARS}H;#FFd5y9e z_H9XNIXFYfCaSiGNn2RwX?YXs1AtJWbMr0W^^K=zfN!osJa^KbAO}j>9&a3g@$_^| zZNHKHW`-Tu1>b}r8zmc!VZK2b4oB}EBrim6w1MyA4cH3);6vkv-dLlK5fBhsfV*2v)0lM?6*^o!6a#h)7W>cGieR_-<7USuX!gfi5P&#K{=B=#nGCyCRITb zkD@hhQDE!OBO1jx!~uQN7T?zP8_ayhNWP;b-%psEyZi8FBmb)7*(eAA&_~Tq)dVFi z{;GOjF+WxUl?WZ;in&cSx zxu*S0mzXu?bXwSP)T|U1kn~RUkY7HR_Qq-e;Pe~{w8ZXa$(ZY=WI2#aO}4~9#4=cj zaVrP#%NGK`d;5A)=*{u2DFKu+la74=X)~liW$%5?S5{Rag6Qj-e^tVxn#`@(&4L$O z_F2Jtt(1DNU?B_41&vT43*w>ZAb*j9GEgPr<>q7PxyPONI?h-q%yy-Kd{> zlMM(7a2P@Y0DvPXnS-l=p3qvIPW)acV2B`KypfM=w171gDJt3nX0Ma%*D>c|%yk@d zAH&?nSbEoLH?8rzUkfh;*uo2SpS%f1Y#F%#358>?DPP94JvO(2DT8Z#+8gqYR=9X7 z%0LCjO$YiY2cwk31C>LAXnbn2kN^NYqC&8T8a4oXwQw#SJrNJIQB4x5MEqBfQjz_e zTHBT|X!H*nlMy2qf)^TL(Q*uP332MnA{IC3v-oZSW&b2TUKV$r@I7)nWOc~)EF%!A z6Gz1-o0J>If>XwdTO?^Z6j#QT@?jDzV8B&K1t3yrvjn&eRHdS&(c|Q?!VV+|q3##K_Xr$mc7MVm-sLN2bwVN~W%M^S_K3a_~PlKUK zKrwytkLbv}7H{ti=)L_dv|c;jdV6P3c&_i(Xvuq zagnZ|Sg$SC6{$_H#hY?N85S`(d!vD@UhFGA;_UKhAb#`WRgO8#8Te0&;^%dX4slZ8 z9Q4d*a_o}4{ikn9p$SyQhsKjYfFxuAaH6fu`Wav0`uQ0T0eIxGN;3Q^G4;sg!$cCG zMe4Sqz!RkIt3Ff_#==Xk&HY!und!q5vWCTHq3<^{ZEem;ygza2x2V}^4pA#094MG= zzh#ks+O+p)`cDx&CAg`%+Y{-b<5UKO%c@DL`+DZzMjyWqI)fjBG5r&U56a5*SAW%B z%r7b^p`sMtT~+s99a!ss~x z2ofAVLgx2mF(B|?^^$+|g6Y2k@V^n~UuCxj*TOVkFufE2|CjWF0aRW5OS$YP(u)J| zQZ)QO(@R#NmyhbT4ZLc44d7MNYXGmBUITcwWHS8^WiW!0h;Ok&00000NkvXXu0mjf D$PlZ| literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/em.ea.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/em.ea.com.png new file mode 100755 index 0000000000000000000000000000000000000000..e88b641c6f749d4683f3eeca84f10492012cbd41 GIT binary patch literal 6157 zcmV+o81mKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000d*NklqP(HOdYhLgD@rJdlwAE|&|J%LTi`0fu2< zv07ob*)TCC21b(+R;vv{kq9oDhDay`%d)Uo%u(H1ZL&e9OLaOOab~kA(q^%Qx?C;| zP176z;Bt8$KA+zy5DGi_K|$ArB2kk}F0bP81vLt#;u?qI!fv<2X0bph6vE9g06{<; z91JH-L!(whXV8Oo(ufET2T2eZH!cd(Q&Pd@QgFN7gJPr*0Ag7dJU$;>UJyKt2kqCc zrR%!2ncdpXg?gPXg<%--cKR+C4VR0SS}f-HzUd@MvJ$DRTB%YUl_`{8iY3z1Qke`U ziv>=nGZ0lDnFCms1((NzQmsa7ON;pXi}h>TuU~sg-_xBIh{`bxL+Euqsd`;cDuCC; z5=nK;#MnYrX!u7mrP9c!DA*m2f4l=&mIa5yflRJIkG4y2{Ocndzpty?XtPm z8dGYkE~HT0x;Nqyro5YYU(%lyDwUO@D6lLuESsd?;28#Di3C9c0j@OEuRBq3r1AXO zGk>_-;QNx><&s~juiaYyd0FH4wYBR70wKf_85oASdp&?6ZrIm)frV_|W0c4_>-_@#1Q!Opc%+!H|0cH5Bkdkq9!m0$-K?bz5E4`8RNH68GHc zlSOWqbLt}tGhYu02^o?T$UAj=flvgu$Ad!$ivMyCgZEO^x$icY7VRq%3Pn&T74UdG z!*hV!?S@1mfl{eNV_i+j50@@IgHb|PTbftDv*SMwu`COfN_E?X5II=4m&+BfJ8A6O zyXO-yo)s8n)KFiSwSL{&VjhnVl}ZJcWkHZcKPD-PLSN=^I1mbjh>VKFE4drDeS7-U zQy8UGT~)Pm!-n6!EmJ5!ayX!A7hEp44|A3*&4$zI^s>!vN7T6ScrQPH$-a+2+KEw4 zO^uE77?!=fV8Npe+O96Jy}=FaO(sgpKKBZHJRU?wMd61lS5(iheWnXzhzdUVFg!jX z;l}mr*FbVO{}%&XZZ}+RH(V|kxI7-5G>zYHed`d$7;XFAmM?5JTknq6NyA0=GHEax zU@#h>)9Vo=5aPogenOSQet-VAR&u zkY%O&-^UoGlH#IWlO`t?@q_qotHlBk1juobk%)?n#PqZ@oIY9k8sqTI?tY*>OWCmC1Uiewubd9U6+m z<$rz7;cy5>VtmV%Es#p3BdVZ8B0*_sDUKdJ3IGrag_tyH5^8E{000~g2ONq6+DQ*@ zEA4jk&YeB8eo@xacMS#uD4|dUtHq4EnwpnJQt^L&;RU?))>{E-rM$d6@9)iC=_@sGZXRg3HYhK4f*-`e%r6FseW<6qnYo@<#LcL2wXUSKDnn`J88HT zmP)1A`QCd00lzFe8x0K&0D$1&U~Jm72>`Hr_ig}y(P+S#Z_l8mr3F1Y-LT3q==Bro zYHDV%EP(&oy%*{8GX4nf#Na{=>WrB?^70En zIUII0H~z4AxGgqk&K!&%KOW7^%_C}gnx?U8HB{QkEcyfVIpm?&|6qu$R32a&ExN$X@ki7}<9H`mB+7(qJ%v zW!ZpERd2ujC#Y1aK?39ssMYF#lw-GA=U`^~oUMUwy^(NC%!E6}isQ$R2c)dDnX|W( zMuQ>lURtP>9W1+}%!3a;h{v`2>j<{F`L36 z6p4QDr`t#*QZ`T&5fSON8yp~jp8&u*RE6i)uMY_LlG0Ki zyAS;8SN&w1PA4l62z=xoe>|(7TvK!NupPkVaxKJ72MF&pUif@IzWVAbXfztQ-ENpn zCd`{Rub*6NYb(rV^PqODRx2KU_+i*=HgDRE8yyG@)%eJ*UcDN{#l_z5ps1k@0g9qn9*^h!UbA*>|JG<~_IpwE$L-tu**SCO zjE~ITy&rn>YzD)NJZSgXy}uM#OKseajsjg1`;Ow_n>UYS|5 zXAfyuRa6`sUJwio3p?en;^D)G0}_!hT)5EB&bDpad}P|%+J+ok9?#11t9+$O{VgWM z#_sn=={JiO^((lxw$5+xYoB|rpPjb$b|0BNd-nJhT#Y6Z%i(Z_T!#sP z)HI}^L6Rhj3XA%sQxpeSZ=+jS&{q99FxqLudNl8On z8!TS3EE_qipVkaTcuHd8T?6kJV9p;ZZ`io8pS??$FAqugrQA&shMv`G{a(oV(2#$oDxNq;+a zqH^+J!s+ShXl`yscXxL{ffEFQ#-=6|78Z`kPIh)ScJD6m#vOtnkeZSTxm*t2Am@fj z(~`?$C&q#@nM{bDF!8{t6P2$GR=}}i$1r*FDKVM<~N!+1b8 zHa0@4P*w$pgftE&>~gtAx%ESBEe z;af{pgTa94m>5sivg{YessonhEPrw4tXZ@$h>!5FP=tkQK%m1uVlNchlyqvDW%q|FC_r zL?QvpFc1la5DI#kzeGpJ;Q4iHw;%p{`R36K{?`j1{qu((f1KOe(h8^334-vws~`q? zG{rCsWHK2-#1gDrkyBh5A@CqgB^VI^z?vs zI`F~Xk5(m4z3+?B20lb0Eq`On)*L>Mhix{TJ$ZTU^(7NxF9i&#avySE|3cSCFeTp(mC<_3V^cbLRe~N2`Uy;kaYV z`{jUJr#FnpgKljXX%!a8#lOUTKbOw&gJq<35iqx zGk!{9o?N9eT1+OmX&OO-AixjsemkJABRn1t^tv8!c|3Ds(zM@=i;2na>g-r^t)=B@ zgI}BBO{N-OpN`z%k4fP6oo(}5<=J0 z4X`W-k{pp!1M+&DAPCTOuOq+$3Z?qw#JEW(L6EPR4Eh+e$(W+=(WP3gmN z6f{kTfMvzK`lOl1=b3mszAi{0XcLRYO%j=`N}~y_rg;1ou|y1!NQ8#^dKe9QP#h8@ fhZB&0r~U5$Ma9=hMC7!q00000NkvXXu0mjf*kQ-@ literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/email.blizzard.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/email.blizzard.com.png new file mode 100755 index 0000000000000000000000000000000000000000..f5baf8db852946a1c01959356339aa4a65c8b473 GIT binary patch literal 3194 zcmV-=42AQFP)b}02jiuZxKgf4a783`Toterha!NDp^Sx%LvTXb0)$FpGtwZmZ;Uh&Go#T+ zGt)i2ynFJ;>mF^RStP~Isk&WVuiv}x`|kP9x#!##$~J1$s85d@H}1>nbb2BGkFB@2 zx4EsY?ZNKu?#BQGprN7R-|On?KJ&YUHZtqz=y;^Hwe?S2CX>0lv9a-i-!-6-S}K)V z+}qo`%{4SMJeo)(8ZTxtQ9;Ea5`ch;paO`XqNoI5c8Q>$GUwd%Ae~Mxy0~csF#$2~ z#YmHYsUl_|;3;8TdIITmdXYNk5*Ig(VItr?R#Oj+vmjH8dXM731TmnW+NCq+Tq3ym zX$12ju?5TUAN~?P1dbiWHvSa0yhNm>$Q%C`UeJ-_6+|=|2m%D@8o1;0cym~`3xYWQ z`cGm_w_)Cha2q1!C(7}0E*L>nQ2|jc&wi;182!Kz!7y~m?@_94ghDSufM|f^bI27p zpmSD$g&<%Um2lAkoFNrr$?Ecjq2Y{}fIY{O|-fA_7ugaS~~y=@w|1jRG=uA{6sjDh2y~15f=u z{%8M$+q@2qCkU_k11z3Eh*myQ&w1e0UxqLA09FqE!EN|KTz01dvDKfWFrx|I)j_cS zal8v6Q5B2WubxCoB@89pwt*OmUHcK3y%c-rWhw!Ul(Ul<9!1O}K^(?ShAsb7ewlzD zoW-y`AP8oLPM%3=?o!BhBkhObikl;kxB!msN7`G;YwH0hZhM(v>xo;xjd{_g(boYY8XMg~iukK>};t9RV3V z9+@x`89x;pJsL@8NKTnU>8?MAcQ+As9zsqY$DiyZtYj#SBeSl?Ui}FsM3HVoNAZvZ zM8L!<3yP#`v3MNbT@T(v>s~b913?VYBzD~=&`C3~LJr^4iDkPf6bsjIZLbx(zVca7!ql0_7!mJpCJ<`6VDw(fB6K(m(~%Yn1Xpf zd=Cg7r{zqbRZz?!$4?S=974?FOLjYNYh)lg4Kh}^ShQId1NYl+w z%%MH)NXKF1&`xaMR($(m?8GrF*A3IILJqtI*#g0yckr+NguWX;O>o=2B*#rB`^>jd z6T(5^4T$W;Kq+1 z|F`|{qXGxaqUuqjfQr^X+A=KHi)*?8@4+{}41jhYN1ASoDvUQ?0LqI1(GK0-g6w=9 z`OUB4{ry;}L}}toN>xd$c092~A3%Fg;?2Q~t06N6cDxoX&=5g<27$=z)Tf_lQoeCUyMU z6~W>gaeLmvKmR@0y%|h~EWt-q3snHgTkDZb4bpfS;tSD4d$&L)gVaqK@Rd@jsux}l zpZ_kZ4*TIhAkA+==MhRhS&9m_>UOHGUV$?YHh2aaF@cKtmR;zP-Plz(AVhmyVb9xu zL+YoU30xJC=q|Z@1>F5561!f<-d>M1%))kUhDZJy={yYHDCP^~Z~p?ZPuz#7m0O4N z@5m!2Ab=k?1I>m6bC+SM>L^nk-b>Kdg1>AbqT0U`N~P|Ze=V%JpP=U$w(i@6`7BJC z55;^`Q~k#`k*+qx3;t*;eNC%Lth{STJcAMtqV7whq8Skd7lWmD5boWAv>iZ}-yV_b z%c8qqhbgn5swQe$Dg>^&5&P)Z3Bq374<8`k)d8_MHf;`aWDg#N&ZF?3j{qLRJaitT zc-=?PG4`B5{5^IG!tuYAwOk4y7M*U&My!)-AFv&i~I4n$n9wclps@0xbkl7r{5{dAOuyI zzXA&lEA${$DJ*~h*?yt*3y z^M?tO)%dZKkj7b9{R~V?_*jx+!IOLOQ3@NLr8i%oudk0{sW5=d2W=Y!L~!NJOz!+k z;)`z~*z{u(o1P_}sKPlR76iEYE6};i2x5X>{rgZoie&qKcziAS)_qtkgXOviuU~`S zb`Sowm&l=*OOP*lO1Uh>o;HfdyXb4#hJR;0di;G*2i`F812$(v^aF+y#mwU}^@LLw z(&tOqjBChl{w3DYiFXb+W&%Dr2Bs~>kDEkHt4O_fgu=f*NMGwgoO!J6ZEWQqp{wsB z{?Hfc+wflyOGZ6QDG#LrnmtKa?CW1yFVUG(8One*WJ6;XM#WrBEmk)XDR|uUdD#7r zLDvx^Q-hy46-$l+frL|%|NU>|N6)6veh_JG#=;`p^vCFzAEs*Ecj12e4&7fLPgVd$^)W;KaGHh z3|Y(#8N?!rLx2*@T@D}r8gA?aL_(zfAoAJ^6gNCa>85)T6?pY2sG9^=-Gp3w2SGy} ziKo}n_t@W23;|V~ca$id(YW`YYLD>zbO-{VD&^zE7-og2OsK9#^Cjr(p=6-xG59Y& z0+|}9N@2Bi=$O$|?c0KD*+=h>)?!C?Aufo{N>#Bi#2C6*8_I?e142~ahls`y6uP?c zxf~@FCjpi_L9p{R;>jd2io|!nMezOmDSUM`xu^dbf5WFBh@%!FJ1tUzq?2fOPOq^{2m^w9eF;f>i z=Y8k9KFApMjTbd^%tQ-r`mAX@V=6K%0>dG5K@H6X+3_Q=a}&(J4xBsVr;2O_(*96V z8ZrwF*VM%ZeVM95eTa=22f1#nc;>O84~u8$f4H%5NeK-0LRA<21sjHV=Quq9R-QTA z1H%bq0kS~V1))A0=Gg3z7^*y&(=SUhK(4OU(395N$Fp>H~% z3s`e02mqLQY>?v+QFqQY9~S$c5p{z;f0q44<;z3-meMJwrNRa8`8{O>S=Qo_(7!qBCFgft8=)X+HyN+SbEcO#8R2m=Vx9RkuJA>G{}Dcvx1 z-TAHia9{4zfBhf!IcJ}<&R%=3wZHpQ5$dY)&vB`70RX^rMFprP`X2CK!v>kSVN$|(x~ zpleZtN@;r-9xO)w)}6R`c6?u+zCIqJ4WqFAAQYjg8EsIo9{awLkpn6#4JQymYBDe> zQqbS{PT!P?Hy^myEo`S=UZ417oDW)-HEdEke?3Wa9u!{Y5~pa~W^2TBq5J?8`O1ay zQZ6ZgAV&!jHpZOUu}wT`;)1iy^FROm-UR4ZHrC|w2J^iqFh!q2Mn(|JmGbceun}*q zvR(|sRrfKg5~M^Nn;E$hBcMG#?qerI(n{?)m28|F8jZL;GyX-&6u#_x`C)f!I86&z{pBh~ zteS}u^PucS7@ePbx`-?6cYiXUW%YK3+vwTtQ7d=3Kgatx!0I+dk0uo;xhW)KGJzjC z&dOg1)j{UeCPZjIh}93W;9HKQt8@+O;O+$=?wO(k@sfA+PX(e-G@@?%e?C76BX}v| zxCW&z1y~3SX5a_ewp*Cu4(&`7#L!7{x#b@RfZFU^uI0l1B{Jac<_qg;UmPtz9(NEf z``sQ0F8iFJb|#K~AGN$TsP#GNqS#SXoV`IWg)A1#QD^s;L(?6-qEun$!$wTI-v_mG zRhF%&aV3i`V`+$EJRI}WV*N??3;U*<-IDUg-Qtt=o|u=S7v=u>AQRzuIleo2M5RIB!T; zRhxG5f5=5q3wWNI`xGKP_bYm$X~pM90{Sy0MYtF;Pks~XD?ipPdD+ZYTg@1H+XCI$ z7acmDV|$$Tu`)9RG8mTp9EaD=h2T+qX^G%I)W&JP*&fU3TZ71Xnia@ijfrZ* z28_M0Fb#Q6ZwM5$TNKiG0m2U07)bKJJ*d;RIM;h-(w@lKiBuQ(IQTsryP5m|TYc`A zNl;ooRXt(CJAVWUS=4WEe)TgB`*5L7ZHYnv6cb|nftxn=X-B=qdWu8T z&31~LrV!5YP)`{Uu=Z$~;aiIsV>sb8s4~IT^+uh6|5Q0`>`oMnupoSuN*ZPT@6TuO z$X`)P_*{LZ;^Vzkx&AVU!@p>by_e%k7><#-gt!jMrq8_Uv+V0BnXEADAqX2#9{Kd+ zT%>S~Wi2E~YqG9~yF9Nbj!}m6h>Y!$?Km=rUF2^{oz|ZL+nt3>j9EB!JCaWS z6uh|+6~hnrNB#u{lKdR=qdpIhGHPaaKib6eiq5O_Xv91mmYO_=AI^WOofeg;HaBZo z+B90# zc#+fuzd66DEkdF$>ssvpK3!&6*)l^$wTQUCITa*a#urK9R${NDdy}jFc+0p4#w-Lw z@PLWjMsxNg!>-gcZ)E2j(ADTv&%5z5O5$ca2R#SM`OMOf&!hW;9_?4mq$af2lf+kg zZY<4RCyviXB;9WX?rr1pTkF>$jXVcQuikm}ysQdYh|dEb<`Dyl`#=!Zkg-%N0=+)M z4A|3}T70bP`;SbR2mf!9g(OmEmK>wi4B*lxj#5*44do08aZ9K?DYHk7t;FSG;j#-F;wb$K@kW;Ham#uS6|AZH;i#qw z{i5$Ts3D_B-YLRnTPFhGcpWY_RQe~J_CyU}Xm>Si^s#0vR&AxBt1O20;FXc>lR2E- z{y&)2x&aZNU{oX%hF+UBFT28e6Vo}6q$ACNa4>@iL&7XGImWl|S!JgFupB$;$T+=O z`+Aqr^oJJdH|56|UYk1pRgo+f%LO0Vwb^?uM~myIcBNegUe_^gj}rjn{HuiqTJJAf zhkWfL{8Xi;+w!mjJS@QS26<|4W?0J?SNw-1yP`0NY=@LGYB+HCH|Tth+ct-OWcXgZ z+xjbidpv6vgFb`z8@AHD(M5?qb^n&P+!XICVrETFM876UHTh(RB|79ds^$N3T>iF) z&cDg`*6n8I=ex6coAQJCnmu%>5i&Pk>l2P&S+FTJ=Q1MioN&L0z^A(+De#!}F#Dvj zdG3#z&W0J~qxCRSLJa2>QG0jJePj?zl>gOg7{4THROawK!2_Y>-Epfmf|P{-+Z6NJ zXM&R^l$ht*!Us_|$@9+2-&?~O^P;wED)B5|Gdw2ham?%}MZG4!zbKnXWd`eDD? zHJ+!m?6Lm*@{XhIoGDNJYqm2Q5-Z}rDeL(E`zEiqhuSx-_J8zaX!p9axbl4*bb$BMt|aD47u^=$ z1wE#Tx`zcomo>3Tk{B{$M=Wozf0=abGY`YnKXk}NHD1iy>X+WBwY8r%htF_jm8(hV zptxlr9Q|lii%h3X$`Isu?fQY;UVVv!tgz>qD>F56-$fM-)wi+k2U8uvq8j9;Qt)Kn z20>+ybM^sKF|KZ13Tlmx&-}L+3-RuPd0U4wK<;G~~Z%!L^JU z1$^9ISbnRkzv#*Ztv)CoPh|d37?OIwYnla+;(Z0@^5B5ENrzt}% zJ2{mD=MjSy8MgX~1Fd{E5{4M%4KsF(EYrWxYwnK<`-9E2MG{K0kOo%MQS+}-C{G)vc}L3Me2!s6_O!h z_ufqGUR)3~yzMFRGltp|bkTYU4EdJge`h0@dYdfwce3Ww>@RxjjyD@de%E<6`-K`g z`7=;4ZdZ9IHxk>GDvyhho&pQ;Pk2noW6V`qw~vjWlk zrX+#^hCfu#Fv0-yQ?X8LMQZ>$||Fa*j$KL;^+B}<`s?l{%S3^Plt({LE zD0X{`zR;f&RS&P%dD(~P#E%@u#+0Rv*||~4El~;nm_q2bwP&!lG}d7^`QJ){lmK`{ppc{1$A`P?Guh?#m6CeP!+vSQ5=rD%?vok_&ww$< zQ=VM-60Qo@%Qr+A(?s!=(ZLc8Y=H-uY+5_=5O#rLQeba>YeZ2ncgvM28a-)LcfkyY zD06DBDTMd?2B(eBPo5F0u$_rmaI~y-cTxzv_#xw~8LS4Xk^$T!3;2U!*y_AORZ9nh zMUzWZj{PdvWz+y9amz0v7CB z|F(?4M&scjfEbU^0E|n(Te4+s5QI-{O{d=v6NG6di(8Lci{wtUC_{>%>Sk4{UwLM^ z_*D&1g?J=$!d|P}Snsxsb6cBkIige({#j>x2o=u_~C#J^8Go@m%{+D zqzn%5`{5vp@oM-dw|CO`wyK0(7RxiB0#O9Aal2~KbcB#Q&|q36HcRUy!o-C^$4aPt zKC-3=4Bp8D0YbHS4Xj4*aNOF7wHRriqh8?s+ItHjTo-t zE?l@#Xe{F#;B4EldZQ7~syg4`+cP&|IsACMKCoW( zehj-MzR&Oz^KWAlz-V}OmxNuYV(-@_?tU1C<|EpT~EX>g+SvwqMc6 zX^+&G7RvDR6o(5SL@pUK-AYA%&6Kz|DOZ|y6{FctBM1;x_LQcaw#e>iiSV%Atkz*n zCbhjjGcK9wyZAzF3q6V!PA0zzUAC^bTD%e{(ajKgsEOc4N%}o@tYC&eBrs$uKXSJS zx!oSPg98>qjeWoK+*|PVP)2aJDntU=*NZ1b{4jK^2#Z0_gO!M4`%2P7glwkKq~dV; zns_W}jbj;W1+`Q4L$EdF{%wV3fy(A;H06@(j2QGnh}X#boF~gYj1zP>@4x0di(&|DOo>4L_+E-1qgm|kBEsqk37dxB*-#yqkz#tM)j*H}&T~$s zBnf&|acRlBc_LU}4?`~@i(8<-SoL-lV+L;HKgL5vXcDvWT&2Z5HY7zJT+q3xlE^&rZvL^)u6;Dzw6BEh# zGv+S=7PQk`MlGj<$wyZ+*yj-f++@Y@^&fv9Z)S2#6E>56iFo$&m)(Oi5E zPA;NyAKdYARY*5k%@6xS-?O0u9HkNkQOuQBcSdBmD>g@u$(&Yxp42MQ;#)7|jV|mBI;yQ8HfQ9@j6k!qy z-jcwtcJDPv3autSqAB-pDz5o2+MLy%7YDb9&B1rtWNIXa)>X-(rYjZlUIzzh);R+( zdLGx^$-9P;00b)pg++!j>V><@iG?iPaz9#1mUtCz&(5w<_Tkp2foe+YS`0|ebtmeL zZ{D^`qNXqhSZsCMpVhd%{T&N_YQ>IeZrDBFNq{kowKLs2si363L_l-p(fxJ7DX@1^ zLz8p3BQ)wepJkarpq;qB^FXf$MQRotQY3tDhSNmX9|JPC;922lZt#l>sa2rrj-|Av3;jhWapxe}&QzwHMrq&3X^W37 zEq$UvI%n0h-uCj%&e@40VwqHzj+i zbb)BboK9bc4Wpd->B&M63h1EvYsLXKo+%T*p?o`r%`l5=OXu_JXxiX0bO51VDM{4v z1&u1<%AmMO!F43qe^^8 z$4{b*H}XB7a(NgEm-j_b<6$rxdg5Yu)pi#U?a3Utgxuc}E_!a!RD2oI_}&Ap!=aP# z>9lQN)$S1-6g!`EdZu?8brYG@d`Bq{rHV4&uxJ}P{7Z2&U!MZlNdGHpPs2B@WmHun z*)WvWk*9WjH}5KZ{*go%Z3Onyg2_=mV)@i#e#Te|C1q{b=dXDXQhY9W)@Pjj;@12s z&r{M%F-iNyOW6yd4KFXIv?U&{j_ZZFbK z39q}0smCa*iB}>VWtfcj5$?s2*y>UNl^`%O7>QP329@Sk-KM_cP@M|1sk#Qo7>S!g z-)sWEkWSKhTUDh|7i$@_{SgY?azFjaxS#8p$DaCvtC3Si!KZ!fXKl|Ygg2^^g>E~7 zadmu%6#shh%3=S95NS~i%d-ZIucbsWG(@04u^;8%$ zAfbw6r6sE9mb}?!6rW4Ykfr~o@}bK{fg{RCTM%j}m7$r~`n{`m*F*i09$(KHtsWMt z3PiAo2su_i8w;^CaBLdMiwe%r!f}hTwf?aGt07a5`e)G>$E@lXY$neq9i?v>gn@H> z_Y^prwJ#6(dv{(Ox7(o9gcvSu|Q*%CaJbJU)`*Ju%fRm(^O&i`842#i~ z_-RlVO=-|!xcckm;}amVXma&tr?l=<7t0DIu?3ViPkLUlqxoak7oErJk+5saHI_K% z;NDA>LtM*YpRLmd=PlK&)`o{x;w7Im6>a9jSlF$RQqj5*5jZOhARhVc2}3c+7-+)Z z*0%^Rczp=R3~yQQd`9O3`W)OcI~mQH5Qu^kC;&*GA?GQ$4aGjqVn4Gm`&LCD9oiH4 zM`hcw)u_d11FioL|K7Gmkg%fNBUF)=Wy{0O4>gJF$(^obv{#b2=oC3*wl6UAzGLrS ze4rmDwz_gi7D;S3az6}>i`@R@5d+iQLvvwL&GOWhV`*ZZaS+~^elVwTrb>N#0y8+F zl2!O<;9NRZ%EF&aO%5#?Uc7Z zc-5}qC!K0yDg?_P?fQI8B}Hmegd+$|_M-x;R~voGpEQn1VQ~WpXG3>Sx@nT{o69$9psa>E(*aEgwHzVWj%8H4A$^z zju(^kA)EE7utkW!sOGe>bUBhH!|!GXvvGOUa6Q88_U3%gnSzgtTa1(^Q&;QW#&@Ao z4ROr0cnxFnwN5V%$;dccLdPGK`?EAvL;yY79NglOi>c2Vmm3LCPBE$k6KdTn&qTLem#!pRu?cWM{CEmC;DZC)cbK^OeR*b zvq8R6!5m$lP(r5=W2)vl_hOse@0+k4ooy0}T_TXzu3pk|5eGGLey9!KR)i7E37!~+ z>{o}E2IwI^s%!VO-k1s9J_DkD-j}G)34&5a1fH)#HjY<2(3^rOL?~SKBdY!t)8ZS3 z_9A?2_Fn3dSCQULr=u3p;CKCeO#DFKU+WwEiS=Q8v|c(Rk{TRus~PNa4`Zt=M?{^s zmZE})7|Y`Iaw)!bNo`7W;kb(uBrJ2j!I2+a#!WA z^Vqy;gqz>k>HGt*@?W%_#-N^J>RfZPNq3&Cv!?rAG@!lNs$c^CV6BVXblF%|^MAXU zT=mA=o@blF8AvH-T7g(|HW6kGzzia(W-;9%|3~Hy&bOB|jYRBx<9ldvO8#1(iFEL4 zBcq5s5jGIe%Z(H(%IT^7@`OZ%rWt+Qt-q!5TKoFI-jGDv`TUUG^{IKGbKHWeX-FxC z)WqfTqsPU*@ZJjAOmnaI*-Wl+U-B%dS8u0so(3hToX2n$si!x5O$OCCthOf^`3XNt zk}B9;|855Rm%Xc!Lw$qFn05+~#nyOe+`%>~M^*T7pK+|^97czR8a-4I+=oj4LGx1w zv=bSb*v?u0>EhGUU2zl2`uQaeZUkplZg$4zh~#7HfkwBBCg2gQqS8QB+;bP7D_HzSx(i^@KV!q_rNs?9?ak z)~3EZSm@!XeG_NTo;;+GaAy;sAZ0thq2a|KWcfT3I%j4_?ppNk3|#ma>Kl)If^Ti= zJN@yz;fQrZ-!V@svb?`((`GSr{M{U3O<=h82p4CJQ3ukU`)eHnWk3J zdXX{$Cx}{#9P=p|v-6*@LLkgXKz-}@WWBZm89N87J~?&lTW`dVos3SWB{0BB03aUl64|A#^^a_w zx}(%TTbv!u#4l`vX0W)}I@~LIp>EmO!8mCF9Ei+JKz-BT*1%#QVkgHZe({$tPdzx5 z*g_9n1T|f}9Y6>%66V0!A}oy-%oM&G5{_vwqSQo%4Z2Ge9e~yHeE3L4gP;B7uUSFn@uwKi;1H z!H%|;md-2$70B6zH((j5>W)qxzj^<{NTp9*W_+7Y)MO8#K+F`ZzPm8>jq3_m_YY-8 z16eC1}x|V(E;H^))e?D|Lc4knr`A!PJ0H^Zf z<0pPN-KtT+%s_yAGhILh-HNWDpvg=UW?qFeq35nw_?07%#*&^5S!AS&__Xp5C+hIM zh*A)%jiyNxhzbHp50c>G3IPOAfx?Lx!PTOS6t{q|@$)a#fuDTtl3&R}qTm`klX{lL z&b@Tv*!BCWRW}G^=QDGtz>M(FShlz6rR8XAi*_X{z+`H#&D)__KU^_*gA;Yq#3aPT zO4JkI87kbhdnmKuRy#mM2w>0Dd=(u+Pn<_pBCwR5CB18V@uL?Mc9)~pL{^`KGj$%A z_CFY@KXjr#S_z0n)(E9Qs_+}{Ib6B4fB2gIiyFw5c3B7^v2f2zkKXsnDf z4bb!UErq|mylqE00zhLRh=zrTKp{>65dbIV{nw7v{_aTCawV^ptwJ+gTRi^wt=mea z9@3U*KmmbelarUjVxgVex|!MCL&Zn-cI+s-)H4eVgnr_-L1U~|d6r#HEMbD<@YEYOJvB=z>;Eu}lQEIfR4L6cP; zKtf`FY9jup7pq^qG6X0|5s5$muD9zooZd={o2pC%^xWN(T-zN7=AKU#IaRX{J~j3H z=@d&L8S%j3`FHgu-@LA4S4WfvIu#?c!1wnj4-Z#`+H42+y^;DK?VK;Smdz-Dl7Q3Q zor93b&Y~>=V7#&`idBt-zyJ~X)^PRt(Ry4IjT_x1qOm-4rhfa+rjA!b5-G_B*yi^ppn!2KlXZLcbp7aDCc1dIW}O6_KRVGrGU;;Uk%$`291YDOTEC>A5m7m^T+XQDI17#-rf z2u68SBN9d?HY1HS%A=aqR6$6DSEtj5PSieiaod8o7$O1{WWfZ|ndqK^+p{70{UKCR zJ2ad9_hk0-vHBBd(qGJFP!)%B(g#F5ef#Ozc5F0IqD4~)wOT6z#TmGk!2l2f!RHRl z?COZG?J1bi8*{3GAQ%YdE88Nuwx@7yPvJ9{w2fB%gKt#7^77nxHAr;U=qlF>eW6y% zeNJ`x13Vf@M6<;t6l1k;+fT>-{*}3Euq4vhsZ)^512iY1B7w+)<$a*!{%mLY$y@t& zZHSqLvq$jxjs`Rm0$u*He0OI#6Ddw6Q@dyX$8pi|(oo@%sjgxAYhHbS0%&LtuVuP9zvVw7K-9 zwrH#xWF7qwphZ%c=c6~4W< z=hHjdEe(+_&ona71V|EL#{W2317wLq^S67Ad?jjN|tAZt&1r z9*3@6s00FU>@5V7S{71IZ~WR-U03xN{X&Rk6|V?rB*Du%mupwX?p-Cd=s1(nrqoaY^LnW?~uL@FfPV|{RM?@(8qEd(wb3oX#s z!iO$u`;D!wM$1V~MXH${oKDd++{&SYwB$hT47g}p0x@uB*QO8j1LkG5stLl$f1aw% zXF*krbRyokqceW|{eyR3S{`gs0YQrd7nP$gU$f!C8+wZ>AY{?7_KnqFoleC`Q*}um z-h^mmq95?fWjB&hq3x4fl1D}=Y1%F;f?Ffh$>E9mH(r_j!tM=q9{{R|58TokJ@D?n z(W-xSHcO2yk?ib9Itz|QW6mj5K`{RHOH&MVDxnz#H6kxEcn@+hmKOnOqBr$zx^v_3 z_lCtq3@ZXJk{aR52POwg?o&e@G|P-C@J50IB{$Hr{4(eK4KNrIClLAUbK_5rR5jM7 zm=_rShL|>+Wxz4&Eu2^D~kJGP6%VefkT}k4LSy7Jl#P(_ejYN+U5ld$yPFploebtSP&Zq-a#H+<)lUAHM9=Vy-60 zMre`Qj_$%IwzuE0rS+0>;@q078URD!k=gW-ElNIP3b) zPE=+6$EM8*L#DsBt@^LmZ;VSlO$y)&7|`9}aR{nidR83@U+DRZM9BG_(RU;a? z(D@PNs-j2|es@z;EOhy0PF#If0S!9P-~YfBrMoW>Lu7%j@vLG^9U&Ojb)Lhz*LA4C zyuYn~{JBHSx{EQ-5SwV{XiLX?Q?OQmQxVaSh1&dNrTWHH<@FlgsM^@fTs>S~W+KOV!+XLYu2 zE4c&!XvJ8rEc3Sp_09|1`g?mrlqd}=RQ?uVVJS6{ywD6~fY0btnk{85A|mPlOwCnZ z9IHG(9S+X;v6)JqS#`FzzM~vpUB;gNa(`Eu#a2ROHKw-=s|miwpTj0iKnp`{}181XC+POwi*Bc N002ovPDHLkV1ju=ilqPm literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/facebook.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/facebook.com.png new file mode 100755 index 0000000000000000000000000000000000000000..2d416f898d2aae613c9fc79f0897ce880393f980 GIT binary patch literal 10088 zcmV-uCzsfXP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00115NklA#H`06FTVMt7P&?g@>iqROOG2y{@K?5Qv49pDEbLsA?zEpSBIeRZ3_S$=|z5oBz zFyow>rccsPQ|Huw{(oQA`quZYwKgC7;IBME;$A2K0we)dlo!eJ7Es?Y(2?Rh1!xeS@la^~L)ZJtG4yfkq6A+n@qT<@Yb)4BbgZI4aE%^D5 zy$_GQ?NR%Qrk5E5CjxZ`(}2}tM&I#y5FYqm-Sjn6@-EeAc3zw^#Xq8@!!VL zDnhu6r0e}jh>HNu*YEcaMgnAgizIZMAQAU*874>P6E#eph}aFY8-k>%4mP`S_SY1& z+fjf5k$lfLZyte&_}L$SA3pxkAI76^{7!p3wa?llFn@EI(0qG@LTC5trlgKaKH0~u{`+0gL0gX;qOSh z=lrZ+`}%WOuObNM=_1$D;^jjC)K&lmNYQ?_l`3rzQ%VqqVM59Pi@V)CP_{1Y#{A%G z_i!vbyzDj-ROzqJY!HaN#aD5SgM&l-^5Y-IU{d_vZ$6G6dC%Lc->GJmug(Ohvj|`L`Xz)Qc?|7#Cc1&{CZnu& z=0Pt5PtNR(GZ3+x9Hl}i&0i_x4i2 zonOMc-}z=FjbPoC`l_w|W~P7`Bc6SJ4^zlbRMznX_wZ$~F$@yvw|=wD#Q|0S0I9%0 z{R&{)6WL~)38SF|ZIdq$z)W03L<1-UwJm`BU5ccNo7ZpPw|@QS@a}iMIp1%GMqb6i zubWSB`RX2?eEKqWb|yC_z*OO*pRU2ov_Y@Hte+tN8R78l6|Xc%OMlGfUvH>_hLyM}OiyZfkQ92)r6Ev3uCNehUXjw=jhOwVj=y5RyHV1Z^;~ zT^HxT)OmWpYckHYfdU~)2n0ct$Qpy2oA zNMJeG;()Tb(VeC2$VuF|c^jYj_y=(ReHWS;RIyFSJ7WgyHvZ>{r|m2BC}tu!$H!%7)GbLOsm>gEQUydRD9ur1Gm9lINSeR<=qTdRM;^q7 z-v3xNU3C8D4%z|$fv-OKY=?--2uxC4V;f+Bw8#?3p@a>p447I-Y*@1Po}nl|(8Fic zAuw;|6ad|1`S%VESNO<>eh}x*o-&|-JMvY4%`?yLVRt9ne@X@(s>I}1w#V&twkQzA zESTY7UO4||V@G`SEI{FcL@X9bfOEjjKElN(4FC{8RN%t7)A-T%es5%8)mu1TynP zg`-hhB@D!^gCo4_?Qg(qAH07c>F&(ewQC2sytj{F6Mz=nW0Gz_dYh}Gxu`CIj_c?L zz70f)D^d-fNFWtj!|o(=MC$k=?FPOEe-?BBinvBsEdxo1M&i=an1izGpn_~jSI!4@g z;T}Bv+WTkZ@SXa4?uDx@c%->LbzBe!h**B7<}AHA5DVH;N@gxX4SxQ=rhpOvGg(W~ zlu)qJgp2o{!9C~BoIv=bAO!0e@o)e6zxdqepTJX>p2z`E#f79p82z9)07(c0C0MjICE;JKCde4?&(ZW?;wl4PscdsULf}{v<7g4E}W^00F@G7XeHc#phMoB+WbP+>=l_FUj(G=_CYl(sfk-Z_CCTSM=4u!ehGVcG^&wm9^ zJ#!iN-Fv1*?Uso_k-F&es?Jb7At7si1hl|+(05tr2B9IE$+ zCUzBMnRkF}#O_t#urDL0%(;|3Ia3NoR><6qHY%-!6-DZFywIjZ3;N6m!M5rCZ+zo& zPCQ@$5K%_agNn{S6`eaXmNj4n1kOj-T~Jg;QZX$tchyD}TP?*rn3eC$6r1S~?@w9D zJaR)am#ysf*$uR6;e)jBw%gqXSFazKLrutwd~P9BhcTldNMQ@qsYqxUAe4;o*kX+d zBX@)3Qc{Am&1LmUH-MQyTY#P&yxc4iiUgNw=08I3?dvW)iNH6d1Q9V|KZBAPFD4}}D+yufGbZfweym{;a57v^Lk3Oc_fc@O!9fV+c4L9n%67HEo5*OIww-9N(LRPP=LoYS7O-$GAGig>M~L?n%OT^MP@C_1n9sj&`}Rash2~$ z%n4LQEe}Ekc3Yi*!*#S+$caZ5XsN2pwb2E@AOos%qibfX?SzsSByxPvHM8x~Arz&} zu9Fq(>KADP=5=0sAh=}K5`AZlLTl1($)qT1DurA20c*4W0Yq%czZDjT?*8VSm(F=C zRX_+$QXRW$!bFDoit?#^E=z7inL6f!mZUBi5CDOcTq??(Q)*dvEu3#APdh)PC&d1f z!4^&nsQf<)4dZL}5koqE2}E093rEc$Phg6miX~>v;9j$VOZGlRbaYa9JTHsX$?7rxc4B0;s7; zItx2oM>doqZnZD3QaI9~=6f1k?M>H9(ito3NqA<}p$9IK^;>=ADjQdJRVTsnNeU22 zEm%}d<{MCJDn{~ZItHeJ3G6 zwmkvn_$f#}38@}1k`OgE&NZ9Zx(U^|B&8 zxAV*6r&M^L9OEPiL{~U_<`g7|rJ}ee+LRT+u2ukZN9oM~eL-7Y)0OM+;X20pDGSqo z>V4mXGpBcubTe+sTRUO3N_gYL4{R+HP62%2y>G!Ik33j2*%q^{wdMEF%v4Dp^Vy#} zLGX|N{NK3r{8a?;pd^_S7O9*y7HEdq@6b}yyJC)7)#B_qW!N19G6Eoo_{E?8AzZxw z!b=p+bvwR56(9Mr$6nD(e*Vi(;>k-_tTrH7Wu_o$gp7kvY)&u97J^8^Of^WZX6bfF zoeVKX(f=FFn~mVXt<}p2mbT*vUg_)JK0L(!wOa@wv~e(+ha#>-XoIct|Whehn)m%VZWkA5uC ze%I`PHK1Z@p;oHDAi}9sE9Np6S+M%O(B8A0SPnK8e&13U8#)r93uf-l*VVo2Sgj&X zo!QOlb2VE+K?#^Rg^dAui~d7jvA#$Vj5gk9JL`agJR!9?ZSih+UD>;d)jHw~h(tKj zj=dn$_-^TK^+NEpqZFiR_6_7%M&zI$J{4p+^B)CMH1dcx!YW|zmmw7Po-DvKXk zq+KacjTMH~b}n&+Z;b@=m;X9AxD5#bwT7`|1KN{Mjq6~~>d4y!hunc~!d&{i~IHL(Nt$ZB8#+k^FIi*^bH%oEMlOW3!_g!p? z_OBh}l*KSXQ$&hQYlfN+sO6w;&^9$I>Q=8?<**#c&6s}4*=o1j?oJ;N5vu*qY;KB8 zH=cU(&5J6jwjgMcTj+8emx#PYG-ZiPOHTLh2BE->>jzd3(Rlj`$>H<>a*l+W(@aJp z@tdR>EVIFj59rk(5y=_Xi?wHW$1A0XEBgo7nRZNVWUVJyts)L?-OibDqaDv~4FlRuR{493e~rDJ2}P);Ky`VYNC!T(6<2 z6zMUzK?ts-G;GB1T~)iAoVrt7S!-8*8X6gu9r;W30Vk1~;=4L5`L1v7`;!vaZX95L z?^-hkULy&ni1k@-eWW@PaHYLuH8-ghPs}HVEtAZ3Wh_1?Un*jE=cQD<9A7^5$_)NU zHNLzFk168nwVSz+Ls&Bi)%rv*MNI2;goJ<~zC@`>k)@46OV1d4{jl}xTzFrs7tm7W zeV&AXFMjnhp1*PvG4>+MQn_l15f40Y9*?~4fvv6oC!Ts9m-h}Z1!;j|)r18aSBNn} zQ{SSk+%*k&yl~|P)={yuyHhJbTmEv^1g5Kd*CAoT6o@HI2vfi`O_-*T2TuZMg?wd@ z$MnOoi-^FU3ooQSj;%KFaQK9Q2BrtPpDY-(tRPxfTf=F=Y%xQ=KDJq1D zsJ-vZ>FKIitrY9^3OHQV87jDSXJ-c?Ute`RBXbr5_Rs+Bt?Cb)&BvemZ$V99AjeXUOB^|5tB_f2X z0El&>707~2E5>Gr3R6-fO^9*TK~z#9BqRueCjKE*0u0!zQ6)=JYezFkt91VH1^20A};=`vt}nAdY# zlcl0$jT6)y43IQojb!G5eIXiY@`6o(W!;tC)tWC^u93mi)}SfnnnN})s}S6{c^gN! zx0{wSNy>{#T7X)z9#q$E(YQd=vLliv>V8u3?^P zsk3oe)UcX!_Ua#Ll{dalcxV|}%4~d#8W{>FTJoxct{huSqRZtkr957&VHn6j*Ce)l zPu5XcO&zyvf^ws&Oc|sYYn?Dvp(@rNLNV*&Zi|EzBi*#I%UWQ2%Dt{F=$%^I_yO~a zbOpto62<``m;a&F#TL0zwMW+FeddYDeU)`la~OlZ%B7q@(5ya|5vfU7g_Z$>GnEC` z=W^}ZlDYm}LhawnJT{utYU>Ia=bp$oYWw-_$IUKxnxzX&s{5D zt*B9ml;TYAB7sRYmzol7#>L>FI>_Zs(IPigf~eAAoxzlUb(<$QRV{-~`?>V0SC@?& zNW^FlNaV^$rg@I(mR`c-S`kE-0q%TXf@1*M?h%=gQmhlCmH|ib(`{Jr4@l-4x4!n7~SOL5K#6|bW#&)yviO z-O241a;jxYsVQG17$(FRhw-)lmf-3GfL;fnI+HRNV4$`dLOY@(x3N@*qI5>iZS1+r zg(pX2VIl71jIBe_((!#b(@0pMc^8nmTvwSHCAL8 z+T{BmY$eM4Jfljpo z&ks=PQ-*G}VnK-UZD{Dv+;R)5EC{%~qjC?FB}wPvdmw;|%^!yM7pA&RScUY8y&fRIz59 zj9V$Sp`SYnkxqn3nkv(($o5pcDf8ybH;O7%l$CXLXA5k*b*0PJRAs;V*`K;rn=fO^E1kD*E}fF6@rAQCXu{tzxnH`CWzv@|CNaH-f$JCj-t&V@wJ%q_ru+{~oE?I3cQY!gQL$o|7H$!=s z>zY`a2{jPFnzAFVeQ>AOO5ZnVDY){d@pVvipg@+!v~FMTmv}NjsFY$!CZg&9+l|@4 zSoM4A`$2$&OaUpTPEjkXKBZWX{+hak+>$QnAR&j=##l%(>22IX{-?-Gj$XS~XntZ( zgp4a^BsBa}L4x`+Y_%3CF8Pd#m|{DNq4wF<1?s)lh@nA0wq)9}RgxwI2@6!UZLiwV zu>E&8_%0x++ps&DWH`HW6K&x=w<|>&wn~&q{y=vFYXsOHzqb4^*mwxq&gpCx*D{qFFl`Ftf%Ik`0 ziMFMCaO>}y|AsmHArE|?xTY2_2&bHu(kW1`FZ4_waD%^O`#qUe$T(dvC)Hj$`eIa` zmInW%&x)xnYW!I@!x?Fn6AH~DxuGlX)CRTIm{ zl~_>74Am5yKd$B~^vt`Xc$hh|q?@wfbm?sSlQKU($-s$5B~1oC2GWwyW)ozxBO8kE zCeEKuKKVggLL3{ny>Gwe{lNku)wjm~=8q3wY!)S9>nMn53AD=8B`d(VG96i5bMlW3hxxioQXtqN+i=qhO{tLoE1N<>L_ zkOR5(Fd#Bm9Ka!6%E`15ttnM8-zM1j$X;C(UHi{C4sX)dwYx(r^eeJ-2sa)k0lii* z3%r6mmW2Ln4;xqSAFQRL9b?#9fz=GI;Y+qZ0Rd?MZ5`S*tb#lCidDeTc9>>8 zX{j7xQYLqrrciBH#@7~tyOxcOZBuuFyrsg>%`$1JIV*B=aX1zUmO3;o#ecT@rpfvE zcJ@G4!=$Eo?{5DD6EFyNcLdYU1dYS0)skjFq(sa4@t9qaQj3~%Q`?A`1S*2GULmHG zOXWaJ?|9pHSKL~WjaQ*uWz5(Evt&MVsA};mgEfKIC1u%J#2)Vp+u=^-EEa{OgO~3T z;_ChdJoxSBwmJb1KXfm?@2xwyaQ?I*7@YwSb;zi!^wJ$YmO~mGHBw@mkEhma8)%7}Z4GW79udTVbdOk9tc7Wg6Ife7*PvgOd9)RS2J*>c^oUmP1 zpbovO>4X>YI=hZlfXgBd#`6Ze9MqjHKR9|to$zf7GOa}$on&e>h%0I=i>Bpb^#}e4 z+o8aUa)3iNS*ukvE{N#6)|O*qle)ZrM+KKu^jS+BC5`VVrznkQRw_=m&5h1} z)^?hBIpt#jB0l}T9QR(UOC6$Omv2Q*HABI#N-14lo9XCLQtuZ=PU%Iv=<>ynK^z&; z)_vt9TG;nyv`MPtc?amqPo?^~)U~^=)K1S1Op^kaNv=!LnSKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00115NklA#H`06FTVMt7P&?g@>iqROOG2y{@K?5Qv49pDEbLsA?zEpSBIeRZ3_S$=|z5oBz zFyow>rccsPQ|Huw{(oQA`quZYwKgC7;IBME;$A2K0we)dlo!eJ7Es?Y(2?Rh1!xeS@la^~L)ZJtG4yfkq6A+n@qT<@Yb)4BbgZI4aE%^D5 zy$_GQ?NR%Qrk5E5CjxZ`(}2}tM&I#y5FYqm-Sjn6@-EeAc3zw^#Xq8@!!VL zDnhu6r0e}jh>HNu*YEcaMgnAgizIZMAQAU*874>P6E#eph}aFY8-k>%4mP`S_SY1& z+fjf5k$lfLZyte&_}L$SA3pxkAI76^{7!p3wa?llFn@EI(0qG@LTC5trlgKaKH0~u{`+0gL0gX;qOSh z=lrZ+`}%WOuObNM=_1$D;^jjC)K&lmNYQ?_l`3rzQ%VqqVM59Pi@V)CP_{1Y#{A%G z_i!vbyzDj-ROzqJY!HaN#aD5SgM&l-^5Y-IU{d_vZ$6G6dC%Lc->GJmug(Ohvj|`L`Xz)Qc?|7#Cc1&{CZnu& z=0Pt5PtNR(GZ3+x9Hl}i&0i_x4i2 zonOMc-}z=FjbPoC`l_w|W~P7`Bc6SJ4^zlbRMznX_wZ$~F$@yvw|=wD#Q|0S0I9%0 z{R&{)6WL~)38SF|ZIdq$z)W03L<1-UwJm`BU5ccNo7ZpPw|@QS@a}iMIp1%GMqb6i zubWSB`RX2?eEKqWb|yC_z*OO*pRU2ov_Y@Hte+tN8R78l6|Xc%OMlGfUvH>_hLyM}OiyZfkQ92)r6Ev3uCNehUXjw=jhOwVj=y5RyHV1Z^;~ zT^HxT)OmWpYckHYfdU~)2n0ct$Qpy2oA zNMJeG;()Tb(VeC2$VuF|c^jYj_y=(ReHWS;RIyFSJ7WgyHvZ>{r|m2BC}tu!$H!%7)GbLOsm>gEQUydRD9ur1Gm9lINSeR<=qTdRM;^q7 z-v3xNU3C8D4%z|$fv-OKY=?--2uxC4V;f+Bw8#?3p@a>p447I-Y*@1Po}nl|(8Fic zAuw;|6ad|1`S%VESNO<>eh}x*o-&|-JMvY4%`?yLVRt9ne@X@(s>I}1w#V&twkQzA zESTY7UO4||V@G`SEI{FcL@X9bfOEjjKElN(4FC{8RN%t7)A-T%es5%8)mu1TynP zg`-hhB@D!^gCo4_?Qg(qAH07c>F&(ewQC2sytj{F6Mz=nW0Gz_dYh}Gxu`CIj_c?L zz70f)D^d-fNFWtj!|o(=MC$k=?FPOEe-?BBinvBsEdxo1M&i=an1izGpn_~jSI!4@g z;T}Bv+WTkZ@SXa4?uDx@c%->LbzBe!h**B7<}AHA5DVH;N@gxX4SxQ=rhpOvGg(W~ zlu)qJgp2o{!9C~BoIv=bAO!0e@o)e6zxdqepTJX>p2z`E#f79p82z9)07(c0C0MjICE;JKCde4?&(ZW?;wl4PscdsULf}{v<7g4E}W^00F@G7XeHc#phMoB+WbP+>=l_FUj(G=_CYl(sfk-Z_CCTSM=4u!ehGVcG^&wm9^ zJ#!iN-Fv1*?Uso_k-F&es?Jb7At7si1hl|+(05tr2B9IE$+ zCUzBMnRkF}#O_t#urDL0%(;|3Ia3NoR><6qHY%-!6-DZFywIjZ3;N6m!M5rCZ+zo& zPCQ@$5K%_agNn{S6`eaXmNj4n1kOj-T~Jg;QZX$tchyD}TP?*rn3eC$6r1S~?@w9D zJaR)am#ysf*$uR6;e)jBw%gqXSFazKLrutwd~P9BhcTldNMQ@qsYqxUAe4;o*kX+d zBX@)3Qc{Am&1LmUH-MQyTY#P&yxc4iiUgNw=08I3?dvW)iNH6d1Q9V|KZBAPFD4}}D+yufGbZfweym{;a57v^Lk3Oc_fc@O!9fV+c4L9n%67HEo5*OIww-9N(LRPP=LoYS7O-$GAGig>M~L?n%OT^MP@C_1n9sj&`}Rash2~$ z%n4LQEe}Ekc3Yi*!*#S+$caZ5XsN2pwb2E@AOos%qibfX?SzsSByxPvHM8x~Arz&} zu9Fq(>KADP=5=0sAh=}K5`AZlLTl1($)qT1DurA20c*4W0Yq%czZDjT?*8VSm(F=C zRX_+$QXRW$!bFDoit?#^E=z7inL6f!mZUBi5CDOcTq??(Q)*dvEu3#APdh)PC&d1f z!4^&nsQf<)4dZL}5koqE2}E093rEc$Phg6miX~>v;9j$VOZGlRbaYa9JTHsX$?7rxc4B0;s7; zItx2oM>doqZnZD3QaI9~=6f1k?M>H9(ito3NqA<}p$9IK^;>=ADjQdJRVTsnNeU22 zEm%}d<{MCJDn{~ZItHeJ3G6 zwmkvn_$f#}38@}1k`OgE&NZ9Zx(U^|B&8 zxAV*6r&M^L9OEPiL{~U_<`g7|rJ}ee+LRT+u2ukZN9oM~eL-7Y)0OM+;X20pDGSqo z>V4mXGpBcubTe+sTRUO3N_gYL4{R+HP62%2y>G!Ik33j2*%q^{wdMEF%v4Dp^Vy#} zLGX|N{NK3r{8a?;pd^_S7O9*y7HEdq@6b}yyJC)7)#B_qW!N19G6Eoo_{E?8AzZxw z!b=p+bvwR56(9Mr$6nD(e*Vi(;>k-_tTrH7Wu_o$gp7kvY)&u97J^8^Of^WZX6bfF zoeVKX(f=FFn~mVXt<}p2mbT*vUg_)JK0L(!wOa@wv~e(+ha#>-XoIct|Whehn)m%VZWkA5uC ze%I`PHK1Z@p;oHDAi}9sE9Np6S+M%O(B8A0SPnK8e&13U8#)r93uf-l*VVo2Sgj&X zo!QOlb2VE+K?#^Rg^dAui~d7jvA#$Vj5gk9JL`agJR!9?ZSih+UD>;d)jHw~h(tKj zj=dn$_-^TK^+NEpqZFiR_6_7%M&zI$J{4p+^B)CMH1dcx!YW|zmmw7Po-DvKXk zq+KacjTMH~b}n&+Z;b@=m;X9AxD5#bwT7`|1KN{Mjq6~~>d4y!hunc~!d&{i~IHL(Nt$ZB8#+k^FIi*^bH%oEMlOW3!_g!p? z_OBh}l*KSXQ$&hQYlfN+sO6w;&^9$I>Q=8?<**#c&6s}4*=o1j?oJ;N5vu*qY;KB8 zH=cU(&5J6jwjgMcTj+8emx#PYG-ZiPOHTLh2BE->>jzd3(Rlj`$>H<>a*l+W(@aJp z@tdR>EVIFj59rk(5y=_Xi?wHW$1A0XEBgo7nRZNVWUVJyts)L?-OibDqaDv~4FlRuR{493e~rDJ2}P);Ky`VYNC!T(6<2 z6zMUzK?ts-G;GB1T~)iAoVrt7S!-8*8X6gu9r;W30Vk1~;=4L5`L1v7`;!vaZX95L z?^-hkULy&ni1k@-eWW@PaHYLuH8-ghPs}HVEtAZ3Wh_1?Un*jE=cQD<9A7^5$_)NU zHNLzFk168nwVSz+Ls&Bi)%rv*MNI2;goJ<~zC@`>k)@46OV1d4{jl}xTzFrs7tm7W zeV&AXFMjnhp1*PvG4>+MQn_l15f40Y9*?~4fvv6oC!Ts9m-h}Z1!;j|)r18aSBNn} zQ{SSk+%*k&yl~|P)={yuyHhJbTmEv^1g5Kd*CAoT6o@HI2vfi`O_-*T2TuZMg?wd@ z$MnOoi-^FU3ooQSj;%KFaQK9Q2BrtPpDY-(tRPxfTf=F=Y%xQ=KDJq1D zsJ-vZ>FKIitrY9^3OHQV87jDSXJ-c?Ute`RBXbr5_Rs+Bt?Cb)&BvemZ$V99AjeXUOB^|5tB_f2X z0El&>707~2E5>Gr3R6-fO^9*TK~z#9BqRueCjKE*0u0!zQ6)=JYezFkt91VH1^20A};=`vt}nAdY# zlcl0$jT6)y43IQojb!G5eIXiY@`6o(W!;tC)tWC^u93mi)}SfnnnN})s}S6{c^gN! zx0{wSNy>{#T7X)z9#q$E(YQd=vLliv>V8u3?^P zsk3oe)UcX!_Ua#Ll{dalcxV|}%4~d#8W{>FTJoxct{huSqRZtkr957&VHn6j*Ce)l zPu5XcO&zyvf^ws&Oc|sYYn?Dvp(@rNLNV*&Zi|EzBi*#I%UWQ2%Dt{F=$%^I_yO~a zbOpto62<``m;a&F#TL0zwMW+FeddYDeU)`la~OlZ%B7q@(5ya|5vfU7g_Z$>GnEC` z=W^}ZlDYm}LhawnJT{utYU>Ia=bp$oYWw-_$IUKxnxzX&s{5D zt*B9ml;TYAB7sRYmzol7#>L>FI>_Zs(IPigf~eAAoxzlUb(<$QRV{-~`?>V0SC@?& zNW^FlNaV^$rg@I(mR`c-S`kE-0q%TXf@1*M?h%=gQmhlCmH|ib(`{Jr4@l-4x4!n7~SOL5K#6|bW#&)yviO z-O241a;jxYsVQG17$(FRhw-)lmf-3GfL;fnI+HRNV4$`dLOY@(x3N@*qI5>iZS1+r zg(pX2VIl71jIBe_((!#b(@0pMc^8nmTvwSHCAL8 z+T{BmY$eM4Jfljpo z&ks=PQ-*G}VnK-UZD{Dv+;R)5EC{%~qjC?FB}wPvdmw;|%^!yM7pA&RScUY8y&fRIz59 zj9V$Sp`SYnkxqn3nkv(($o5pcDf8ybH;O7%l$CXLXA5k*b*0PJRAs;V*`K;rn=fO^E1kD*E}fF6@rAQCXu{tzxnH`CWzv@|CNaH-f$JCj-t&V@wJ%q_ru+{~oE?I3cQY!gQL$o|7H$!=s z>zY`a2{jPFnzAFVeQ>AOO5ZnVDY){d@pVvipg@+!v~FMTmv}NjsFY$!CZg&9+l|@4 zSoM4A`$2$&OaUpTPEjkXKBZWX{+hak+>$QnAR&j=##l%(>22IX{-?-Gj$XS~XntZ( zgp4a^BsBa}L4x`+Y_%3CF8Pd#m|{DNq4wF<1?s)lh@nA0wq)9}RgxwI2@6!UZLiwV zu>E&8_%0x++ps&DWH`HW6K&x=w<|>&wn~&q{y=vFYXsOHzqb4^*mwxq&gpCx*D{qFFl`Ftf%Ik`0 ziMFMCaO>}y|AsmHArE|?xTY2_2&bHu(kW1`FZ4_waD%^O`#qUe$T(dvC)Hj$`eIa` zmInW%&x)xnYW!I@!x?Fn6AH~DxuGlX)CRTIm{ zl~_>74Am5yKd$B~^vt`Xc$hh|q?@wfbm?sSlQKU($-s$5B~1oC2GWwyW)ozxBO8kE zCeEKuKKVggLL3{ny>Gwe{lNku)wjm~=8q3wY!)S9>nMn53AD=8B`d(VG96i5bMlW3hxxioQXtqN+i=qhO{tLoE1N<>L_ zkOR5(Fd#Bm9Ka!6%E`15ttnM8-zM1j$X;C(UHi{C4sX)dwYx(r^eeJ-2sa)k0lii* z3%r6mmW2Ln4;xqSAFQRL9b?#9fz=GI;Y+qZ0Rd?MZ5`S*tb#lCidDeTc9>>8 zX{j7xQYLqrrciBH#@7~tyOxcOZBuuFyrsg>%`$1JIV*B=aX1zUmO3;o#ecT@rpfvE zcJ@G4!=$Eo?{5DD6EFyNcLdYU1dYS0)skjFq(sa4@t9qaQj3~%Q`?A`1S*2GULmHG zOXWaJ?|9pHSKL~WjaQ*uWz5(Evt&MVsA};mgEfKIC1u%J#2)Vp+u=^-EEa{OgO~3T z;_ChdJoxSBwmJb1KXfm?@2xwyaQ?I*7@YwSb;zi!^wJ$YmO~mGHBw@mkEhma8)%7}Z4GW79udTVbdOk9tc7Wg6Ife7*PvgOd9)RS2J*>c^oUmP1 zpbovO>4X>YI=hZlfXgBd#`6Ze9MqjHKR9|to$zf7GOa}$on&e>h%0I=i>Bpb^#}e4 z+o8aUa)3iNS*ukvE{N#6)|O*qle)ZrM+KKu^jS+BC5`VVrznkQRw_=m&5h1} z)^?hBIpt#jB0l}T9QR(UOC6$Omv2Q*HABI#N-14lo9XCLQtuZ=PU%Iv=<>ynK^z&; z)_vt9TG;nyv`MPtc?amqPo?^~)U~^=)K1S1Op^kaNv=!LnSgEx`YwzB@HDZ_sK$a|7WZ%Ahk~eQ&rvpH? zZ{IE}SFSVbK$h=>U3)vK3z01*3ePDur4b^iQ$2@4C8&!0bQ;^XG# zCIt!<(7*2P?h+RlCowTG`g-^7oqYZJRX>L|RjXD_s#dM~pLyfsRt5-5%!UTEn;6bY9_VMwNnKNf?veQ){En7CN4JuZwC?iIU(DBu) zSL^2uY1F8Zc}$>g-MX@5$r8u?*s){f;>C*^9jFF5Q5FlN{rmUJojZ4uorhB=#$!_0 z`Sj`2W$V_hT1_U*GVv#^TenX2=F<#7zI^#KO?7c`(R)t$_U+qJv}jQoK76>$m@z}g zQCrO8=+UFe&O?>R=I70ur}sG5Cr_TJBc&{!GG&U6<5ZLS9H#>)Sg@eJNJQ}FG11ZD zW>-~LS63ZllV!@3(PwdfXV0Eh`wt8Zbod9<`Q*uya`WcRWWOV4&YZGn(IOc+a-`k| z*dt5Gfdg71_w3ozF@EI85!te3i>?DrA#&h5h#qJi=0j5^O#qZFTUJl@&6_v+G6Z!6 z2#cnk=Y)Fn=%MdzwmZ8G8#d_mv}x1q3yPA6M-k%NxwFDBY?nD$G+JTEoH=te&PPT@ zO8fThW$4hMI*vKCYSl`w@h^snefjc5H;h>rf=047o6RP7@7_%v05(s9g41N-Hk+&c zZ@hjXp^nWXXhP7sb>ijitqa0tiS5LCY?mmocI{eKX+wbV;>8O&c<`WOEO+kQ`aGXQ zdw8Gg-Me>7u3Wj~#*G^e$A|y{C(C=Rl{K;!)&GAWZ?-=hCk2l`B^? zLBfHNJQ3Te-w}KS6<+1am9@!9&d{=DOHEivj7pX)sh>~!151VgfUt19|IY*;;pyoq zwQAMU$N&Heo9oxFYl=+Di}Q14d)=u35SkbrJ9gAGntYukhx`Clr=M4@TsZ|mkplqI zXaE3Y;J|?yA3$=lY}qoYQ>Tvh3IGED3MNd1Dlt<62n`L@pU^Wc07_%B!b|~R`SRtO z5heui&#`0LS4axr+O=ykYSgH|2LL_3ojZ4GJDif3-w;WODT2ra_(hp8NLPt`!5I7W z=~KoBKxs^xjQUfW^7A%H61l;G1q-yVFnjiF%^bUS?J7%`E>#U7Br^W&*|UrdphATT znjnRTKa$g@Lp9FR2)S_Kg0{{mhuLV8CQUR%(od*gzrI4?8H%F}4Irst?>N3wr%q}0 zX9%07iMnUco)+%o02TlXfCaz;klu^109XJl02TlXKzaf2@$rdsG5)n96Ux6O Wc;aeWiumpT0000715%Zz zJj7Lg2!x6qBNTz5R5r1Lg>XPZ$j}1KtyZ^sxZQUi&$##c{qnGfv(LHb-WI8>s&)5x z_g>%cZ(P5%kB~K01&Dx2U>a}$B7&N6Yd7ZEH+FdWTAN;Q7@!Ioln|5<$ILb0Up;Yx zhfhrqIpMHoam>yOFS7byze2ROMookYM#YQ>@E9KOfQ)p@o{{fc>6`(Ybt@fPhA(Vy zcjL>KcayEH?gx^j0Gxww0*?ZJANV^N5ttd>Sb1lo$E&xxyt@@hOf&EhR7v7MlEh5- zz^lt`?pmxf(};#Zi=>2@88}BYJBzDU=wH2x>-X>&X8FLa0CX6Qhk-Aj*HRB=iMHFz zVQ=p_OOhX4aqjwARgJR2HO=hPBJ!`z>~WwjBA6NdU|hJ_;ZH8?@RJ*TI*CI~2nr!F zlEl(&Y$S2Q*Iry>z8Uf9hv)GnEikhI5#H0d>n>(L_3LcD@(SVNJ6O^O3JMo0$V10RAoTgosr0fttaUt(dR=bcYvj#3WM1xd_Aq z4rEk8g_WHiD?43&<*rHQng_KYC&JaL)Xtp2Rjc%0e*?d>O~q0($exZXJ()4!4`~xx5g8hBFBs2XY4h^U7;{y86d}$d&LNT#AbEElah^cL zOYgP$#>;E8`(b!+W<$q*W`>#1e~#wwe4b=-ih!VFK#hVeQ-0Wehmn@GMT386Fz-nH zz%gLj%!)y(8tbiu=dX0=s7Jg98A#m#tTYrMz3x1n#PRJ5n_RfsIt0$3MaPaY^QA8# zAN(NwsDkFtejn|2_l=S^(oPyQU3TC^#O2ZiNDMA+^m%tHNr54lrDkD9{s*(%Wu-)j z2<9R#t;c-lm34MH$!$g{)E|0~iGTFFB=d75B84+61GO>d#*r}21Yqp{JHWZ(L?-=Q z1CpRz--&7W4NOqW?*TI{h{*p()v}kQM06AQ$>n|CUF{rA06-Mc{P^F)-Fq*I*#U1p z3UHjm8%M_bX)c#|xrqpg8q2$V;v@y9A@77^l; zaqr4o_3nG9ef;CZ;s_#Rr8gS#%5Bu?jdOzI?sKD#2~w#h3ay@!XqM=x5encV-LkGW zFcA^9+scKj`)uyV#d8m9(x_AW@P`SFI)UMsK5pQLfgVTLQ3MqxAZ3p(0+u>LO^lFB zJ}9aK4Jgb;^IkR+p_jnhw>m6u_YMVKyx)5&cb$c)X$pnnU}pFKtLM!PWoQg++Bv8= zNJ2<8py(+XW_nNq%uuDs=+uPetv=T`dj!3Wg*rzxKaWgLj|F{LmiKuvh`A|P^bX0}Q*GPe6M&Vk_u&Q3G%ne=l9X(fUH;siGL<029q)wI(g zbUJtrN^TT9jMsw0OyjWghiiZcCub@gn{ceP1KvBp(A+teOrbD=!a-({AbUwK4!8FK zsw7)mB)fZ5B>n$@2LWl!NlA1$EvWO4@ zn&iGf3zM*d0UIQ?x500!^e$f^?Cl&FXvq3uz``N>@8@_Z6C7=gs^_sYO(r5GNfJT` zgb=bKh-F=i<6Ij|Gw^0OjAqpl`J)}6b~>~#T!2nD4Z(*19oKJX^X2~^CD#qj(??px z36Gqfn@Eb@ZB^Uft7cc=}a`Nk&32qHdtk2~;~uwHt83#+uQn z7AX*wixlJ9Oe5mS^K*Rv%^hC6(!sN)9HjvOPT>6UCja1p8Q#3nX1$YSB;+-LLXMf_6-*IL zSeg_*_23+57aQpvqu|Zxt*)~2ji=~bd;_K(Yv<>=`RFV+&rh>;yiRMv(~lf|5fX#M zEZr&uHDZNekZ4MV1;cff#!k!~H#(eub(?$N-s9A@7S(P*^_L_7U~VGfi;pky_RSXm z^KUn4B?(BB)d{llh(Stof>^?0!}!v#+`$)r^#qgkgRe1F`m1Za_a|TD(vQB)>XXx~ ze)KGx4^7i+`XbyW3Z{mrAQ)nTSXP$-L<})N1apvx5I2SGhUe<>20wmemWl0{2VUFZ zv6nZv_nkeaxBFO}PP?Pat8JP!&rBntc0{Ij*HVK&_~a?p_WC^k)-J8YvIm{R}7P>IcD_(q3QTt>?bUPnZ9kYhRk7b$$w&^mu_tjgV!NMJg;= zr9rZ8gKeQ#S+ujYeFQ0gh!#673TZJc4%LUq)AQ2-fP*mT~D>*?X#0yU#P6S zd!qJC^z@7COf@6E|JF8_R@;2`!%Li9Yz&pO^H%Y~$Ii`h&#@-2-)M1tv&(KLK?G)- z5qB;&ICp%4rRge_adF>_Yb$T_H<$i`AMZU!>r{(sy+SqB;bQVLF7%D2u*D;>k_OoD z#Ze(@svfHgHEukcm;0BtIW{$6*sbHRa0MMV@-?D_m^9PSR{ss|w-_6VSqsq>(}qG*7*=b7mui41p~# ztPGesEPn_N;;JJ8K^&+ExAv89{d9xZZtU~VK6Zl7Ji5evcQotv}}HtqVleKs5r~K*h<_G;g7#x@A?i(mo{;4%3zcL=4?;cs}&ysyKPfIeAhf zWqWlm=7(=>@mIfC=ki*Mb}yal2Q`vl#97uCImZ!YzM^e(Hu%#w{+O3me~46Kq6mB> z#k$Jqz;pWzkj_3S*>!fVxMmQr5&s~CKM1*B7`hIz>WZ2^6Q#Ec4u=Cw1i{k_fs41g zytls0w_aM|%wmnR3k^=p)tIh(&Yf)X7Mw15{wT)x1OIwf!rS z;)zpy;`|cahJc`fYrEIk>TP4rFv%s8j^0F2FE(fyn#1|GsTKDVwefZt<%!L6UTv|x3BVe z@tm4E#Z+aER(B8YEn8D8_(de2nx>;FoLGr~6u6a0NTY;hk-`d~1MuajaKK4s2hMAZ z*932a9%)QUOdzs^C_itZNPcc@?6cR2--q;t^9v8~(G$N$g(m$Nk|cGeiKa_%LDQb* z`e~k@UrVxU!ECV2G@u}cl8KBYLpEe812f4ybt zk5xpUj3g9*o#j1Mf2Rq~5}d|3i_y5p>c%d|X6xMdfjJ_7bW$V;ji|wciw|;U>P~L% zuCmeDBGCXcNPmktyQKj-WHEnK)kEg_ha^s^05Xz444x+i zYn^WBmArU~jMCr-iH{81f95wrNi%|unny{Kaxzp`FnuQS+9L`=gu_%)8+Ssp9x>Id zvN+phVY<%ZY=gy_CiByErkYizn^l_ii0O$cGn4gn>iRyi!kmPMmmXreI>mf_p8tLA zdu+!WILj97vs|Pg1&RVpP#Y#@NDGXhl4Y$q(1AweVK^v7=`ym=Lrp+DGZR%#9h>If z)AO9WbAgjf)0|wKVt%^8WV1@MUZGm?I1yYal>NUn?>u+T+{y3V|GP|7Ci$~V-(j=A zj;mPyJ;qRKoKJ=dX)>A{q$RonD7m(jeL@~Gtr$midTD~$={onGp6Bt0PjmjxMNTYD zF*ntqTJg8F?O(Q)tIs0B@yR>*{JGBpj%VKaHtYRWd?aa7P$t0!&T%kNvLOv9n}X&V zz##PH$5t9o^q>FDXP9VInVV`bH(jSzjd1T#;xjSJ9M~W#*pLQj`MeICoo3l$p&^+Dlw0(X^QW?J z0*=C|DY(!j^mj=58zkKoLVummzlrs4r9D|C#2aWZqb;&Xr`B`hcRwR{Bn$ znERWe$sS4fCcXVP>9^h?^j5HBAEAZQ4$k%v-G;D#H`gFTLXYb;FB;I?M>9hZw z+SGlBs}xc{upWtU*UTAy``*v+=JsV);#FK$D9k4@mH{fv0V}C{X8WYkU_gkJCV9j2 zoao@9h>>(x*}wTMx~tzr+CQcm^{G@FRH6n>YB=#=h7f~x5bFS43`Ipy5%7jYhV)nI zT>tMR-3?~$`2(5@A3jnOs=mS_OXqoH@nODu?Rf&4R*qyC^l;(R2D42YOpo(pOBo+7 zA7$HUR0>Jw7CTq|8{L~Kcc&Pc`We!xE|HGXXXs^^?Blu&klt|Wq4MYtsf+2>B>;HkTN9s zJdPHH!4eZDgXM7zeOhZjV*lDx`1mGupRNu&6Ve)%puu6mVS%hWH1C>UleDW~>JSy2 zr5{|?q)&JGyKG&0iqPLbbWPHUu+&^&zBW$?5Nle8OtPi0!IU{W&ZpBk_-xHGEv}Tn z7lcT0tso%jZPHqK9&KMHlJv86Q2|ZCN0V1vwWI--fj5W4gLu3|coDR>izY2Z7KeO6?g)FK z&wkP+Rz+RzzsetETWK((t*oNiJytr-yOx&6(-~+wSj*JSuoO6C)yv!x@)t-ktt1~< zruL~uI3)Y|lizA^h>5vR{z`t z%nWfAYSU+^&YUM{Uq!V~Bn}Zx1Agk=GO3S~gk)MFnR*Linc8Orn0Ztql2AeYJdLGC zag{+Ctx$iA%iA~k!S$cfO1e-fZWxd90O<18hKV>(Whs3q88wd4So{bUEfGQm)hcKO zu_{7kOpi+2Xymvubd5~%K_e2a;b-orzVy)8PxIPwmltoo%4?hNW<`;bY6F9CFsjZa z@Z~vew%n{bsiOp2FKQu=#Q{uo4+|1Tg|8ii$=+0<4P2 zZe{ZH?96??$5wZX?#53r`c!;`cZ!qz_gr?Mcp`;_2EX<*%RjI8#EGXLDunuJrXTnx zOq~44fq8(Mvfkd|tG{@bm)G7JEEN~HN3>v=x#9i8y#Fu>%b2ty5$T)R1v7g|oc~nw z*dviW`1@?XQK7f>8lk^M#RZ&CCpIEFND7At$igCN1PGe-;7DW=x9}h{cmD>HcYYFA zX)@Y2JG(sn=3n#l#lNO&{fvM^Y`i$Ok@KUVOHME+EzO?RG5#0gHX{*HRecBeBcLv> z^7zE@zgzdUX}W8#&|Q9!-tI-Dzlm5MFQHh*%D>V|69h=VAWf5>U=ix4a5HDAAAgMI zsgF{dzZVw`KAg(E|8{quufO(}{NaUfveDm3r=R7FjnZ)$@gcE&$O#Txu43H6?CY35 zD;nAYjQ{bp>7>Rj`g_atHr}MS@eBG}7t!_#j-()>rpPcT=*Po1T@^dTB|JVJHu zE~5G@h#&qDH4sdB?!BM!pI-PHuWw%_@nP_r*&%6junlR)5eZMK0Z9_Vax3mU*G>9A zaHiMw-@lapc-lFKsPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000RLNkle0j6oB(b9kCQjo26~K zq)C^gJGQh)5m#`bprbNwqcSSsK8%X`Lm8L418PweM3hzirH%_f;Ezk4QFIgmL1$c8 z3$&$ex+H0n`rUWpZTi|en#SHabLYPI?z{KPIp>~x?u%vMzm~|z(iaR-hXTP1&%eM| zkZU3tiq$tjHXM4wxw}y*R5{DHTICkXdWtUv)u-UzZMfq+|y4{hN>+;eJ4?dJ` z(Cb%55Thgvi^(=`+?1Q0la=X2Rhj7-*3>kZM0pP{dx$pPx`r=L82f?D`S6{92!>%h&x7>7d!;?>K+p?7rM0xFPr($10O_4}MVYRll3W47!(x&X#v18GqMO9T* zMMiPCTp1Y|xDGyqJI}A5w_*KTn$INr_UwJ8;b}}+R8T0V?=i=FG zUVRN!L4T^XjkjorLLtZ$mR3wK7^LPwQ&UrYeSKM3S*lU;^74E>pWE$DPfurYvA0aE zsAML))mBkfe&0R!Zr!{^+!>lxD^^}HZ$9otxPpM``56ce-R4)xvJhWnZ{S@qG^$eC z5(@$d4Gk_=uU-vAetv#IK>Awd zwQ}XktgNi0q@T1?scXzi1ApF1e_zC3% zhJo^p`P@b}Vyfd7Pqz6E3g$QP%khoe++3`&c=6(vmKLQWWkh2=H$47?ub?m&C$T$9 zy*|iHqr@!$X^Fj$p3XS!^y1=ToCGF<;<4k+{_d_pto?iTmKT?}va;z-4HIgM9bzmp z91F!G;%BTO7SqCo3$dMqJSht6kq4J~@KdYJn_p1oD^8o7^1o_Ju*AbqRc&o8wqw~1 z!RqS`R8>?$Bkzye?Wt*5 zcp_<2%(!Ee(Xdbzo5X?z3%a_LKT)Hqo<3|Nd1NPa-+@OKVkRaZ_$Nkl9bBMtRh;#7r_0nq?u>$%;?|rCFJhn8E0G3* z{`9zGl+m!rok*o#cmZM!f!wwGqy`{e&$=#`y=GS(?85N|Zz` zdXhZYM5DztdfbBhvIUc^u+6~KWqhPiXGV_eV6~oXDaE&pvjAi;u|`msiAIZQ^tc5* zO*$(Hw`Q+fa@*~SCK!r-BEX24lQTF<5<7y$u>xzxqQr`6^tgpog%w7&!U|*U-+J>c z`lE(AzH;&Ms+ZspEcg)A7K;)qrqSaTfN(F!YR;~jl01nZb>p?y9s2WNSEnDZx8P#G z>_5P<7#gi4+M2^8rqSaT_7W5}wXB@nle7v~BSNuD?%T7sy}jKcpG|6~)xbm`!K)D5 z%S5BaG|`EiI_od0Am1`GFxk~Vs|WcHlsVILt({JeJ`cQGFZmQMpC zifQz?1r*c+nIwGJ^z8DANfVRb+3>cCTQG$JL2>*=x805r!IC5Ih!Q*WSOmj?g{rV4 zdg2&C(4RH)Tz^Mr6ia`-{POcJYO1G=k8hzQ+?+KC8BD~BiDyoDZ`-?yM6jY?dBYL5 zBtk1O44s*1w3tSZThI;r51x)4C6Bu4`WsHQwyA9qtmwCLBk*HQG*{v)W>uPKkk~=T zF2qm#i5fjgjQIYWZ;1)=t<*v)&5kV>6u;lU>zi*OGmV1iJnlb<>9=XIrlwVvSIFAO zIP2HF*?jbvSdd~doJxJt1&*TbMFy5X`dIAH!!yi(FD4o-pkNcu*1jU|<(FP2{|iO2 b1_u5DZZJDCvVAz{00000NkvXXu0mjfrX--& literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/intl.paypal.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/intl.paypal.com.png new file mode 100755 index 0000000000000000000000000000000000000000..7ddea03c9940de970baf32efa1ecc986a101b6c9 GIT binary patch literal 4545 zcma)=Wm^+~0)aCC#nfYA*Cj+jbHmm`&!2uQ;yNg2rX z-d}J(yyrac`3Wc42&hd$#7KmNg+-#Pqha!|js6QE&cDPCa=ZOsnP{tFH6xk#{|TOl zs(~sN)`v{uJ7@fV{@7o~ItUAkbnw4mkNVZU_%|{JYgz@H`nd$>mZ`sDg80S21Q)Y_Q)e=vlutK{lWa6@h^HHv z#F?L|7(z;>O0RB+NNy#NX;l#Yo6}F1!JfoL8O+-+_+sNlN5DYl)I*=wb0JUq3GO;L z<}{7Uj{yq|5AgHa8BL~Q>E@0rdIpnkWp=OdBY&(yDE0_o6&_2)L*_|1=@}Qq^layA z8dLdd?DM?SQz+`{PyLYm!x<;l$O}$gd5UX!^rSxNk9>sIYwP1F zw)5>vf9z$781gwMEV159Y*yT)4UR}s3g7V<7`Ogif?M5U{=5nw+d;k0?-!k&BCW=`hePq???Nqz)^ab$1h?79t)qL zDXhp`W!?7W$9><0?TVa=njkzq^1pm=Q)VBF)s^t}H0U0Gte$o$;qE@g4L1&W&Q-ug zNS(v_kv&d}#X^IB#=#eHG%j$*eKZFKIE2ameKHbx(8k7X|D)8hMt;?$TUQ7~$+W#5 zflwp=e3Q)GpY{T$<|K$&paFBLcR0$^6G?=rYz{^%uHAT*a~#{OCDYo<8eoI1)=9Z5 zRn=lA?W7C2kY-^2-k?{>@(3MpbIrr^a17)yLVb--oMSSXm7FD<*mInrKyJWl4w4`r z+r`T-2@sg;QETf)?5+n5FQExxxe2I%iMaQcDxGdycKBcy}{viVQcd0tAzD88E-ysmYHD@j5jmbvqS|%Z(S45 z-AagbI3Bu=wlH#<^vQw$JOYqAeL2Q<&x#zvri&q4mIEB82%P?m4m9!X^z)xs=m3|r z%mB$|(@}ZyN^+5bRvDH$zZD2F#EbgnBr8bk$$;W99TtIVR7?Q-IHG*5FV zhM|Mvq0HJdh5Qr^fEwIv9Uf>FeugmK4=nV0kkN=3)?JvwO5S;$W*j&+923r%y*B%S z95QZ2NC=KL;YcbJuvEXrbp-9GXo-t|pz(K58veS_sYDy;=Jh&A)AgMEguavbXf>*a zVp+AdC8>%Bx6`ztUpkYQDYVwWjJeA(TgjB+-dD{S7~pqN-}xT=R3XxKAYN5`vlB+V zMB%z+&ATbe7)dpq7flbogYC6EaQ&`0&b>k}*W@hiJLC}+ zY>(h#>WBi{mGklX9p%@HZGG)r$C%rJ*z#yRxzOO?bV5)N@EYWUqV(A&GH|_4f=b|k zoVG{q3`rHql3X^?d6U~KYfnLr@bk7a+jBr-6{ZakF~pV{kUhON zE6@^cg$1mI@k{lhGH&ralv{ZQWyNL{PTOMMx%@4#^6WI~w7R!w_t06%dry#mq9>g` zAVo{%$~%E^hj=Ja(<{4fmU0H_>luLFc7{5DzEXJ|3AW!_$dU5U^bSn?75{xF2_4bS zArY;z43@kac|6#%u>IHg_ESJl+c(@)DV9ms2@6f|tG&1nG*Df7U$HiiO>g%RgphuN zO{Js}GIx{YHX-Dx>i8JpB zDs;#)8^r8i05KL@={#9l1IbHppvNWqH`b2 zUG^9102;13x6(`g`)5D3e@);>$(9&;MQc?%GOix5p}JHQ;Rh;b*@e+2)n8c2P4AOF zhgjSFVcI3YrqQKIE}Aj1;2Mx6n`noBnT25g{BqZ5D$7#*QP}U-NYgvc7AF=9nTynx zVd`5vo;AdN(DeFJ55DEo0$0Nv;I%z%RZ46=3HWA&_pa6QhQE}~lyp0v6M`P+ zhn7!aH23JpKuIsXdmcya(k@P|wqMiPDwk5{mn+T38Em!$3nvRcxOrc0j{CG^d9Y7d zLz8>{xE-ZDAEY)o$=N%IW0K7Vkve$ZHz3XCdFiK`KzUJipbOJ?$T82$)cRyW?}1QE zuMhEzjL1T$B1@1tim(;$NhvZQRfFse)@p^B`u=Wplp~N>kC`oBS`oc>?gzefH`_Sj z1U5zOp5~Dlo2m!)sAsmk=IN;#baB37^(8z%WQ>@$|IXGkcQ;M3%equ?WmS6C%Gp@f zzBs^~%&Ql*s2P^9gYnI1^rlC*!#nyGr+JfhEk+FF*Ht#x`yGUcjHtnFsKbgh z*hl}C1{ce3y5-c+*PeQ<*Cyms-oPz*eA%g ztMu|q*NaMpoErXLyneI&u56?k_HcW16QwjY|4$9qmt%2nyQG2~ekeypO~u=uv;Cys zXDQiXsIjHbH(K?kV7bbrVaa^s1rRiG=WpjtO+WKM)d(&~zWr>CYP;HoC9GhkzOSQK zwpR{DU7Dv2kHchoL7KtK^DA&|vJT;NuP~8~-!%&-A|2LQ+AS&Q9%B0<6FrOil>9~! z(Tw|OYqiy!k2Vi=OvF^)`cJhYH9GvhUBAYKlH`?S5D!?JKe{QBdJOQ`4LbdSF!6 z3?Jg!3o2z0^IPk5olEJ}8jl4{$!{crl<9tKFFV;K zwm7ABzQcXo`r`=9`Pvh|M?XXIp$p2>u1#u`TFtxux*2HlzB~{|gwkUo9(|=n3jN+A z&@O1dx_8}FKko_Mxk=Pw)j_t%hJwxKj=H1+QzSyPtVUiEWSG(kqy>|<#Tb3t`pQq1 z$YV%mP(T?Nmh(H6U~%*{RgCV+{+G4b>sv($wKt$3z*CKrg@~L6^b1 z2jQE5H?pS63h5n$ANMbdHl({n3yf;R?}M~1V_{g`Jf zbswSbo*pV|I@++>?zc4DqD^=x7b59UCCS1zl(nUAo0QYh;9cbOAm_$R{F4c9%yMcZ zQFq?HjzBK1X%KKVCR8^#iKC048+R0XkWs>$H|u~392Jzj3*ElIJ{!3X8E%U=&s7Vd z%F{N=&-iAfsDi*ZMBO@S*YKNk=Rr5)=3fs;?BHn?_r?y=o@uPE_@h^v76MDFe&Z*m z7=BYn#0^!>Z~Jh<=*yj_gxcC_&DXx_NFWV-!K#*heFN>+3WFmTjl`9Dck_ii01H~F zvM!I8@IyN9hI~(3TodoYGNXf?=;CK}#8vrO)sDwdii$$|9BE_d=KHY*Pcau|hoK-r z?9lIi0F{|t2Lm>`0y*(#^MYa_z$917P>4;MM4qFYa0ST~# zyg2#kZja{WNg{Bmm;}r9E3<8}%`@K1k@kf{L!La@tL*RZFC=g>$GK)%)`5bq3h+rf zmhPQW-;%z*z!1=O>dGxImjJGru%Wl{+=Y*Yg`2ZJ)kT}jAx=Aqs&*j<2dw%;rEYMq z8m|&!S^DwsmVP$)A@nN6UU&LI#Ais2<2b8~NKksuNi~qjJ(flqe#y3je6k|xXF8Pd zDx?(V^Cxi?-|#riszd*LqIYwU+?3Jfij>bL3VvJezxq+Qo^KZWfzmedMat<&vZ{;p zrJd8xHx>Kg&&6|==M5OX4>`K^aqP2B3ZKiE!%dWLXWxbBQ#LDCe!836M`j9E&BP%? zEQA zD=Z^M!YN`LP{@9cH9bLc{}l!r(&EL(oi1AxVPaCFR&!B^P@Rt%a!?412rNMIa<6)< z{*79$_UD>Vuw;a&3FMvWr}o#=A1@jIq$cYUZmL=QA?1l1EymE= zrXJ7glo|Y23I#310~cD^+HPUv*C={jq*|v&`k(znw?Wj#L3%0q^_M~YNie>M(Cn?b^~WgVY5#@zVp&vz)&st-4JBwfs1rB>WIu43+Iam_8SYkf`wtdZD~L z`iIy};|W`nxHy#d&1IJV{G74JO(U;Ra8`8{O>S=Qo_(7!qBCFgft8=)X+HyN+SbEcO#8R2m=Vx9RkuJA>G{}Dcvx1 z-TAHia9{4zfBhf!IcJ}<&R%=3wZHpQ5$dY)&vB`70RX^rMFprP`X2CK!v>kSVN$|(x~ zpleZtN@;r-9xO)w)}6R`c6?u+zCIqJ4WqFAAQYjg8EsIo9{awLkpn6#4JQymYBDe> zQqbS{PT!P?Hy^myEo`S=UZ417oDW)-HEdEke?3Wa9u!{Y5~pa~W^2TBq5J?8`O1ay zQZ6ZgAV&!jHpZOUu}wT`;)1iy^FROm-UR4ZHrC|w2J^iqFh!q2Mn(|JmGbceun}*q zvR(|sRrfKg5~M^Nn;E$hBcMG#?qerI(n{?)m28|F8jZL;GyX-&6u#_x`C)f!I86&z{pBh~ zteS}u^PucS7@ePbx`-?6cYiXUW%YK3+vwTtQ7d=3Kgatx!0I+dk0uo;xhW)KGJzjC z&dOg1)j{UeCPZjIh}93W;9HKQt8@+O;O+$=?wO(k@sfA+PX(e-G@@?%e?C76BX}v| zxCW&z1y~3SX5a_ewp*Cu4(&`7#L!7{x#b@RfZFU^uI0l1B{Jac<_qg;UmPtz9(NEf z``sQ0F8iFJb|#K~AGN$TsP#GNqS#SXoV`IWg)A1#QD^s;L(?6-qEun$!$wTI-v_mG zRhF%&aV3i`V`+$EJRI}WV*N??3;U*<-IDUg-Qtt=o|u=S7v=u>AQRzuIleo2M5RIB!T; zRhxG5f5=5q3wWNI`xGKP_bYm$X~pM90{Sy0MYtF;Pks~XD?ipPdD+ZYTg@1H+XCI$ z7acmDV|$$Tu`)9RG8mTp9EaD=h2T+qX^G%I)W&JP*&fU3TZ71Xnia@ijfrZ* z28_M0Fb#Q6ZwM5$TNKiG0m2U07)bKJJ*d;RIM;h-(w@lKiBuQ(IQTsryP5m|TYc`A zNl;ooRXt(CJAVWUS=4WEe)TgB`*5L7ZHYnv6cb|nftxn=X-B=qdWu8T z&31~LrV!5YP)`{Uu=Z$~;aiIsV>sb8s4~IT^+uh6|5Q0`>`oMnupoSuN*ZPT@6TuO z$X`)P_*{LZ;^Vzkx&AVU!@p>by_e%k7><#-gt!jMrq8_Uv+V0BnXEADAqX2#9{Kd+ zT%>S~Wi2E~YqG9~yF9Nbj!}m6h>Y!$?Km=rUF2^{oz|ZL+nt3>j9EB!JCaWS z6uh|+6~hnrNB#u{lKdR=qdpIhGHPaaKib6eiq5O_Xv91mmYO_=AI^WOofeg;HaBZo z+B90# zc#+fuzd66DEkdF$>ssvpK3!&6*)l^$wTQUCITa*a#urK9R${NDdy}jFc+0p4#w-Lw z@PLWjMsxNg!>-gcZ)E2j(ADTv&%5z5O5$ca2R#SM`OMOf&!hW;9_?4mq$af2lf+kg zZY<4RCyviXB;9WX?rr1pTkF>$jXVcQuikm}ysQdYh|dEb<`Dyl`#=!Zkg-%N0=+)M z4A|3}T70bP`;SbR2mf!9g(OmEmK>wi4B*lxj#5*44do08aZ9K?DYHk7t;FSG;j#-F;wb$K@kW;Ham#uS6|AZH;i#qw z{i5$Ts3D_B-YLRnTPFhGcpWY_RQe~J_CyU}Xm>Si^s#0vR&AxBt1O20;FXc>lR2E- z{y&)2x&aZNU{oX%hF+UBFT28e6Vo}6q$ACNa4>@iL&7XGImWl|S!JgFupB$;$T+=O z`+Aqr^oJJdH|56|UYk1pRgo+f%LO0Vwb^?uM~myIcBNegUe_^gj}rjn{HuiqTJJAf zhkWfL{8Xi;+w!mjJS@QS26<|4W?0J?SNw-1yP`0NY=@LGYB+HCH|Tth+ct-OWcXgZ z+xjbidpv6vgFb`z8@AHD(M5?qb^n&P+!XICVrETFM876UHTh(RB|79ds^$N3T>iF) z&cDg`*6n8I=ex6coAQJCnmu%>5i&Pk>l2P&S+FTJ=Q1MioN&L0z^A(+De#!}F#Dvj zdG3#z&W0J~qxCRSLJa2>QG0jJePj?zl>gOg7{4THROawK!2_Y>-Epfmf|P{-+Z6NJ zXM&R^l$ht*!Us_|$@9+2-&?~O^P;wED)B5|Gdw2ham?%}MZG4!zbKnXWd`eDD? zHJ+!m?6Lm*@{XhIoGDNJYqm2Q5-Z}rDeL(E`zEiqhuSx-_J8zaX!p9axbl4*bb$BMt|aD47u^=$ z1wE#Tx`zcomo>3Tk{B{$M=Wozf0=abGY`YnKXk}NHD1iy>X+WBwY8r%htF_jm8(hV zptxlr9Q|lii%h3X$`Isu?fQY;UVVv!tgz>qD>F56-$fM-)wi+k2U8uvq8j9;Qt)Kn z20>+ybM^sKF|KZ13Tlmx&-}L+3-RuPd0U4wK<;G~~Z%!L^JU z1$^9ISbnRkzv#*Ztv)CoPh|d37?OIwYnla+;(Z0@^5B5ENrzt}% zJ2{mD=MjSy8MgX~1Fd{E5{4M%4KsF(EYrWxYwnK<`-9E2MG{K0kOo%MQS+}-C{G)vc}L3Me2!s6_O!h z_ufqGUR)3~yzMFRGltp|bkTYU4EdJge`h0@dYdfwce3Ww>@RxjjyD@de%E<6`-K`g z`7=;4ZdZ9IHxk>GDvyhho&pQ;Pk2noW6V`qw~vjWlk zrX+#^hCfu#Fv0-yQ?X8LMQZ>$||Fa*j$KL;^+B}<`s?l{%S3^Plt({LE zD0X{`zR;f&RS&P%dD(~P#E%@u#+0Rv*||~4El~;nm_q2bwP&!lG}d7^`QJ){lmK`{ppc{1$A`P?Guh?#m6CeP!+vSQ5=rD%?vok_&ww$< zQ=VM-60Qo@%Qr+A(?s!=(ZLc8Y=H-uY+5_=5O#rLQeba>YeZ2ncgvM28a-)LcfkyY zD06DBDTMd?2B(eBPo5F0u$_rmaI~y-cTxzv_#xw~8LS4Xk^$T!3;2U!*y_AORZ9nh zMUzWZj{PdvWz+y9amz0v7CB z|F(?4M&scjfEbU^0E|n(Te4+s5QI-{O{d=v6NG6di(8Lci{wtUC_{>%>Sk4{UwLM^ z_*D&1g?J=$!d|P}Snsxsb6cBkIige({#j>x2o=u_~C#J^8Go@m%{+D zqzn%5`{5vp@oM-dw|CO`wyK0(7RxiB0#O9Aal2~KbcB#Q&|q36HcRUy!o-C^$4aPt zKC-3=4Bp8D0YbHS4Xj4*aNOF7wHRriqh8?s+ItHjTo-t zE?l@#Xe{F#;B4EldZQ7~syg4`+cP&|IsACMKCoW( zehj-MzR&Oz^KWAlz-V}OmxNuYV(-@_?tU1C<|EpT~EX>g+SvwqMc6 zX^+&G7RvDR6o(5SL@pUK-AYA%&6Kz|DOZ|y6{FctBM1;x_LQcaw#e>iiSV%Atkz*n zCbhjjGcK9wyZAzF3q6V!PA0zzUAC^bTD%e{(ajKgsEOc4N%}o@tYC&eBrs$uKXSJS zx!oSPg98>qjeWoK+*|PVP)2aJDntU=*NZ1b{4jK^2#Z0_gO!M4`%2P7glwkKq~dV; zns_W}jbj;W1+`Q4L$EdF{%wV3fy(A;H06@(j2QGnh}X#boF~gYj1zP>@4x0di(&|DOo>4L_+E-1qgm|kBEsqk37dxB*-#yqkz#tM)j*H}&T~$s zBnf&|acRlBc_LU}4?`~@i(8<-SoL-lV+L;HKgL5vXcDvWT&2Z5HY7zJT+q3xlE^&rZvL^)u6;Dzw6BEh# zGv+S=7PQk`MlGj<$wyZ+*yj-f++@Y@^&fv9Z)S2#6E>56iFo$&m)(Oi5E zPA;NyAKdYARY*5k%@6xS-?O0u9HkNkQOuQBcSdBmD>g@u$(&Yxp42MQ;#)7|jV|mBI;yQ8HfQ9@j6k!qy z-jcwtcJDPv3autSqAB-pDz5o2+MLy%7YDb9&B1rtWNIXa)>X-(rYjZlUIzzh);R+( zdLGx^$-9P;00b)pg++!j>V><@iG?iPaz9#1mUtCz&(5w<_Tkp2foe+YS`0|ebtmeL zZ{D^`qNXqhSZsCMpVhd%{T&N_YQ>IeZrDBFNq{kowKLs2si363L_l-p(fxJ7DX@1^ zLz8p3BQ)wepJkarpq;qB^FXf$MQRotQY3tDhSNmX9|JPC;922lZt#l>sa2rrj-|Av3;jhWapxe}&QzwHMrq&3X^W37 zEq$UvI%n0h-uCj%&e@40VwqHzj+i zbb)BboK9bc4Wpd->B&M63h1EvYsLXKo+%T*p?o`r%`l5=OXu_JXxiX0bO51VDM{4v z1&u1<%AmMO!F43qe^^8 z$4{b*H}XB7a(NgEm-j_b<6$rxdg5Yu)pi#U?a3Utgxuc}E_!a!RD2oI_}&Ap!=aP# z>9lQN)$S1-6g!`EdZu?8brYG@d`Bq{rHV4&uxJ}P{7Z2&U!MZlNdGHpPs2B@WmHun z*)WvWk*9WjH}5KZ{*go%Z3Onyg2_=mV)@i#e#Te|C1q{b=dXDXQhY9W)@Pjj;@12s z&r{M%F-iNyOW6yd4KFXIv?U&{j_ZZFbK z39q}0smCa*iB}>VWtfcj5$?s2*y>UNl^`%O7>QP329@Sk-KM_cP@M|1sk#Qo7>S!g z-)sWEkWSKhTUDh|7i$@_{SgY?azFjaxS#8p$DaCvtC3Si!KZ!fXKl|Ygg2^^g>E~7 zadmu%6#shh%3=S95NS~i%d-ZIucbsWG(@04u^;8%$ zAfbw6r6sE9mb}?!6rW4Ykfr~o@}bK{fg{RCTM%j}m7$r~`n{`m*F*i09$(KHtsWMt z3PiAo2su_i8w;^CaBLdMiwe%r!f}hTwf?aGt07a5`e)G>$E@lXY$neq9i?v>gn@H> z_Y^prwJ#6(dv{(Ox7(o9gcvSu|Q*%CaJbJU)`*Ju%fRm(^O&i`842#i~ z_-RlVO=-|!xcckm;}amVXma&tr?l=<7t0DIu?3ViPkLUlqxoak7oErJk+5saHI_K% z;NDA>LtM*YpRLmd=PlK&)`o{x;w7Im6>a9jSlF$RQqj5*5jZOhARhVc2}3c+7-+)Z z*0%^Rczp=R3~yQQd`9O3`W)OcI~mQH5Qu^kC;&*GA?GQ$4aGjqVn4Gm`&LCD9oiH4 zM`hcw)u_d11FioL|K7Gmkg%fNBUF)=Wy{0O4>gJF$(^obv{#b2=oC3*wl6UAzGLrS ze4rmDwz_gi7D;S3az6}>i`@R@5d+iQLvvwL&GOWhV`*ZZaS+~^elVwTrb>N#0y8+F zl2!O<;9NRZ%EF&aO%5#?Uc7Z zc-5}qC!K0yDg?_P?fQI8B}Hmegd+$|_M-x;R~voGpEQn1VQ~WpXG3>Sx@nT{o69$9psa>E(*aEgwHzVWj%8H4A$^z zju(^kA)EE7utkW!sOGe>bUBhH!|!GXvvGOUa6Q88_U3%gnSzgtTa1(^Q&;QW#&@Ao z4ROr0cnxFnwN5V%$;dccLdPGK`?EAvL;yY79NglOi>c2Vmm3LCPBE$k6KdTn&qTLem#!pRu?cWM{CEmC;DZC)cbK^OeR*b zvq8R6!5m$lP(r5=W2)vl_hOse@0+k4ooy0}T_TXzu3pk|5eGGLey9!KR)i7E37!~+ z>{o}E2IwI^s%!VO-k1s9J_DkD-j}G)34&5a1fH)#HjY<2(3^rOL?~SKBdY!t)8ZS3 z_9A?2_Fn3dSCQULr=u3p;CKCeO#DFKU+WwEiS=Q8v|c(Rk{TRus~PNa4`Zt=M?{^s zmZE})7|Y`Iaw)!bNo`7W;kb(uBrJ2j!I2+a#!WA z^Vqy;gqz>k>HGt*@?W%_#-N^J>RfZPNq3&Cv!?rAG@!lNs$c^CV6BVXblF%|^MAXU zT=mA=o@blF8AvH-T7g(|HW6kGzzia(W-;9%|3~Hy&bOB|jYRBx<9ldvO8#1(iFEL4 zBcq5s5jGIe%Z(H(%IT^7@`OZ%rWt+Qt-q!5TKoFI-jGDv`TUUG^{IKGbKHWeX-FxC z)WqfTqsPU*@ZJjAOmnaI*-Wl+U-B%dS8u0so(3hToX2n$si!x5O$OCCthOf^`3XNt zk}B9;|855Rm%Xc!Lw$qFn05+~#nyOe+`%>~M^*T7pK+|^97czR8a-4I+=oj4LGx1w zv=bSb*v?u0>EhGUU2zl2`uQaeZUkplZg$4zh~#7HfkwBBCg2gQqS8QB+;bP7D_HzSx(i^@KV!q_rNs?9?ak z)~3EZSm@!XeG_NTo;;+GaAy;sAZ0thq2a|KWcfT3I%j4_?ppNk3|#ma>Kl)If^Ti= zJN@yz;fQrZ-!V@svb?`((`GSr{M{U3O<=h82p4CJQ3ukU`)eHnWk3J zdXX{$Cx}{#9P=p|v-6*@LLkgRa8`8{O>S=Qo_(7!qBCFgft8=)X+HyN+SbEcO#8R2m=Vx9RkuJA>G{}Dcvx1 z-TAHia9{4zfBhf!IcJ}<&R%=3wZHpQ5$dY)&vB`70RX^rMFprP`X2CK!v>kSVN$|(x~ zpleZtN@;r-9xO)w)}6R`c6?u+zCIqJ4WqFAAQYjg8EsIo9{awLkpn6#4JQymYBDe> zQqbS{PT!P?Hy^myEo`S=UZ417oDW)-HEdEke?3Wa9u!{Y5~pa~W^2TBq5J?8`O1ay zQZ6ZgAV&!jHpZOUu}wT`;)1iy^FROm-UR4ZHrC|w2J^iqFh!q2Mn(|JmGbceun}*q zvR(|sRrfKg5~M^Nn;E$hBcMG#?qerI(n{?)m28|F8jZL;GyX-&6u#_x`C)f!I86&z{pBh~ zteS}u^PucS7@ePbx`-?6cYiXUW%YK3+vwTtQ7d=3Kgatx!0I+dk0uo;xhW)KGJzjC z&dOg1)j{UeCPZjIh}93W;9HKQt8@+O;O+$=?wO(k@sfA+PX(e-G@@?%e?C76BX}v| zxCW&z1y~3SX5a_ewp*Cu4(&`7#L!7{x#b@RfZFU^uI0l1B{Jac<_qg;UmPtz9(NEf z``sQ0F8iFJb|#K~AGN$TsP#GNqS#SXoV`IWg)A1#QD^s;L(?6-qEun$!$wTI-v_mG zRhF%&aV3i`V`+$EJRI}WV*N??3;U*<-IDUg-Qtt=o|u=S7v=u>AQRzuIleo2M5RIB!T; zRhxG5f5=5q3wWNI`xGKP_bYm$X~pM90{Sy0MYtF;Pks~XD?ipPdD+ZYTg@1H+XCI$ z7acmDV|$$Tu`)9RG8mTp9EaD=h2T+qX^G%I)W&JP*&fU3TZ71Xnia@ijfrZ* z28_M0Fb#Q6ZwM5$TNKiG0m2U07)bKJJ*d;RIM;h-(w@lKiBuQ(IQTsryP5m|TYc`A zNl;ooRXt(CJAVWUS=4WEe)TgB`*5L7ZHYnv6cb|nftxn=X-B=qdWu8T z&31~LrV!5YP)`{Uu=Z$~;aiIsV>sb8s4~IT^+uh6|5Q0`>`oMnupoSuN*ZPT@6TuO z$X`)P_*{LZ;^Vzkx&AVU!@p>by_e%k7><#-gt!jMrq8_Uv+V0BnXEADAqX2#9{Kd+ zT%>S~Wi2E~YqG9~yF9Nbj!}m6h>Y!$?Km=rUF2^{oz|ZL+nt3>j9EB!JCaWS z6uh|+6~hnrNB#u{lKdR=qdpIhGHPaaKib6eiq5O_Xv91mmYO_=AI^WOofeg;HaBZo z+B90# zc#+fuzd66DEkdF$>ssvpK3!&6*)l^$wTQUCITa*a#urK9R${NDdy}jFc+0p4#w-Lw z@PLWjMsxNg!>-gcZ)E2j(ADTv&%5z5O5$ca2R#SM`OMOf&!hW;9_?4mq$af2lf+kg zZY<4RCyviXB;9WX?rr1pTkF>$jXVcQuikm}ysQdYh|dEb<`Dyl`#=!Zkg-%N0=+)M z4A|3}T70bP`;SbR2mf!9g(OmEmK>wi4B*lxj#5*44do08aZ9K?DYHk7t;FSG;j#-F;wb$K@kW;Ham#uS6|AZH;i#qw z{i5$Ts3D_B-YLRnTPFhGcpWY_RQe~J_CyU}Xm>Si^s#0vR&AxBt1O20;FXc>lR2E- z{y&)2x&aZNU{oX%hF+UBFT28e6Vo}6q$ACNa4>@iL&7XGImWl|S!JgFupB$;$T+=O z`+Aqr^oJJdH|56|UYk1pRgo+f%LO0Vwb^?uM~myIcBNegUe_^gj}rjn{HuiqTJJAf zhkWfL{8Xi;+w!mjJS@QS26<|4W?0J?SNw-1yP`0NY=@LGYB+HCH|Tth+ct-OWcXgZ z+xjbidpv6vgFb`z8@AHD(M5?qb^n&P+!XICVrETFM876UHTh(RB|79ds^$N3T>iF) z&cDg`*6n8I=ex6coAQJCnmu%>5i&Pk>l2P&S+FTJ=Q1MioN&L0z^A(+De#!}F#Dvj zdG3#z&W0J~qxCRSLJa2>QG0jJePj?zl>gOg7{4THROawK!2_Y>-Epfmf|P{-+Z6NJ zXM&R^l$ht*!Us_|$@9+2-&?~O^P;wED)B5|Gdw2ham?%}MZG4!zbKnXWd`eDD? zHJ+!m?6Lm*@{XhIoGDNJYqm2Q5-Z}rDeL(E`zEiqhuSx-_J8zaX!p9axbl4*bb$BMt|aD47u^=$ z1wE#Tx`zcomo>3Tk{B{$M=Wozf0=abGY`YnKXk}NHD1iy>X+WBwY8r%htF_jm8(hV zptxlr9Q|lii%h3X$`Isu?fQY;UVVv!tgz>qD>F56-$fM-)wi+k2U8uvq8j9;Qt)Kn z20>+ybM^sKF|KZ13Tlmx&-}L+3-RuPd0U4wK<;G~~Z%!L^JU z1$^9ISbnRkzv#*Ztv)CoPh|d37?OIwYnla+;(Z0@^5B5ENrzt}% zJ2{mD=MjSy8MgX~1Fd{E5{4M%4KsF(EYrWxYwnK<`-9E2MG{K0kOo%MQS+}-C{G)vc}L3Me2!s6_O!h z_ufqGUR)3~yzMFRGltp|bkTYU4EdJge`h0@dYdfwce3Ww>@RxjjyD@de%E<6`-K`g z`7=;4ZdZ9IHxk>GDvyhho&pQ;Pk2noW6V`qw~vjWlk zrX+#^hCfu#Fv0-yQ?X8LMQZ>$||Fa*j$KL;^+B}<`s?l{%S3^Plt({LE zD0X{`zR;f&RS&P%dD(~P#E%@u#+0Rv*||~4El~;nm_q2bwP&!lG}d7^`QJ){lmK`{ppc{1$A`P?Guh?#m6CeP!+vSQ5=rD%?vok_&ww$< zQ=VM-60Qo@%Qr+A(?s!=(ZLc8Y=H-uY+5_=5O#rLQeba>YeZ2ncgvM28a-)LcfkyY zD06DBDTMd?2B(eBPo5F0u$_rmaI~y-cTxzv_#xw~8LS4Xk^$T!3;2U!*y_AORZ9nh zMUzWZj{PdvWz+y9amz0v7CB z|F(?4M&scjfEbU^0E|n(Te4+s5QI-{O{d=v6NG6di(8Lci{wtUC_{>%>Sk4{UwLM^ z_*D&1g?J=$!d|P}Snsxsb6cBkIige({#j>x2o=u_~C#J^8Go@m%{+D zqzn%5`{5vp@oM-dw|CO`wyK0(7RxiB0#O9Aal2~KbcB#Q&|q36HcRUy!o-C^$4aPt zKC-3=4Bp8D0YbHS4Xj4*aNOF7wHRriqh8?s+ItHjTo-t zE?l@#Xe{F#;B4EldZQ7~syg4`+cP&|IsACMKCoW( zehj-MzR&Oz^KWAlz-V}OmxNuYV(-@_?tU1C<|EpT~EX>g+SvwqMc6 zX^+&G7RvDR6o(5SL@pUK-AYA%&6Kz|DOZ|y6{FctBM1;x_LQcaw#e>iiSV%Atkz*n zCbhjjGcK9wyZAzF3q6V!PA0zzUAC^bTD%e{(ajKgsEOc4N%}o@tYC&eBrs$uKXSJS zx!oSPg98>qjeWoK+*|PVP)2aJDntU=*NZ1b{4jK^2#Z0_gO!M4`%2P7glwkKq~dV; zns_W}jbj;W1+`Q4L$EdF{%wV3fy(A;H06@(j2QGnh}X#boF~gYj1zP>@4x0di(&|DOo>4L_+E-1qgm|kBEsqk37dxB*-#yqkz#tM)j*H}&T~$s zBnf&|acRlBc_LU}4?`~@i(8<-SoL-lV+L;HKgL5vXcDvWT&2Z5HY7zJT+q3xlE^&rZvL^)u6;Dzw6BEh# zGv+S=7PQk`MlGj<$wyZ+*yj-f++@Y@^&fv9Z)S2#6E>56iFo$&m)(Oi5E zPA;NyAKdYARY*5k%@6xS-?O0u9HkNkQOuQBcSdBmD>g@u$(&Yxp42MQ;#)7|jV|mBI;yQ8HfQ9@j6k!qy z-jcwtcJDPv3autSqAB-pDz5o2+MLy%7YDb9&B1rtWNIXa)>X-(rYjZlUIzzh);R+( zdLGx^$-9P;00b)pg++!j>V><@iG?iPaz9#1mUtCz&(5w<_Tkp2foe+YS`0|ebtmeL zZ{D^`qNXqhSZsCMpVhd%{T&N_YQ>IeZrDBFNq{kowKLs2si363L_l-p(fxJ7DX@1^ zLz8p3BQ)wepJkarpq;qB^FXf$MQRotQY3tDhSNmX9|JPC;922lZt#l>sa2rrj-|Av3;jhWapxe}&QzwHMrq&3X^W37 zEq$UvI%n0h-uCj%&e@40VwqHzj+i zbb)BboK9bc4Wpd->B&M63h1EvYsLXKo+%T*p?o`r%`l5=OXu_JXxiX0bO51VDM{4v z1&u1<%AmMO!F43qe^^8 z$4{b*H}XB7a(NgEm-j_b<6$rxdg5Yu)pi#U?a3Utgxuc}E_!a!RD2oI_}&Ap!=aP# z>9lQN)$S1-6g!`EdZu?8brYG@d`Bq{rHV4&uxJ}P{7Z2&U!MZlNdGHpPs2B@WmHun z*)WvWk*9WjH}5KZ{*go%Z3Onyg2_=mV)@i#e#Te|C1q{b=dXDXQhY9W)@Pjj;@12s z&r{M%F-iNyOW6yd4KFXIv?U&{j_ZZFbK z39q}0smCa*iB}>VWtfcj5$?s2*y>UNl^`%O7>QP329@Sk-KM_cP@M|1sk#Qo7>S!g z-)sWEkWSKhTUDh|7i$@_{SgY?azFjaxS#8p$DaCvtC3Si!KZ!fXKl|Ygg2^^g>E~7 zadmu%6#shh%3=S95NS~i%d-ZIucbsWG(@04u^;8%$ zAfbw6r6sE9mb}?!6rW4Ykfr~o@}bK{fg{RCTM%j}m7$r~`n{`m*F*i09$(KHtsWMt z3PiAo2su_i8w;^CaBLdMiwe%r!f}hTwf?aGt07a5`e)G>$E@lXY$neq9i?v>gn@H> z_Y^prwJ#6(dv{(Ox7(o9gcvSu|Q*%CaJbJU)`*Ju%fRm(^O&i`842#i~ z_-RlVO=-|!xcckm;}amVXma&tr?l=<7t0DIu?3ViPkLUlqxoak7oErJk+5saHI_K% z;NDA>LtM*YpRLmd=PlK&)`o{x;w7Im6>a9jSlF$RQqj5*5jZOhARhVc2}3c+7-+)Z z*0%^Rczp=R3~yQQd`9O3`W)OcI~mQH5Qu^kC;&*GA?GQ$4aGjqVn4Gm`&LCD9oiH4 zM`hcw)u_d11FioL|K7Gmkg%fNBUF)=Wy{0O4>gJF$(^obv{#b2=oC3*wl6UAzGLrS ze4rmDwz_gi7D;S3az6}>i`@R@5d+iQLvvwL&GOWhV`*ZZaS+~^elVwTrb>N#0y8+F zl2!O<;9NRZ%EF&aO%5#?Uc7Z zc-5}qC!K0yDg?_P?fQI8B}Hmegd+$|_M-x;R~voGpEQn1VQ~WpXG3>Sx@nT{o69$9psa>E(*aEgwHzVWj%8H4A$^z zju(^kA)EE7utkW!sOGe>bUBhH!|!GXvvGOUa6Q88_U3%gnSzgtTa1(^Q&;QW#&@Ao z4ROr0cnxFnwN5V%$;dccLdPGK`?EAvL;yY79NglOi>c2Vmm3LCPBE$k6KdTn&qTLem#!pRu?cWM{CEmC;DZC)cbK^OeR*b zvq8R6!5m$lP(r5=W2)vl_hOse@0+k4ooy0}T_TXzu3pk|5eGGLey9!KR)i7E37!~+ z>{o}E2IwI^s%!VO-k1s9J_DkD-j}G)34&5a1fH)#HjY<2(3^rOL?~SKBdY!t)8ZS3 z_9A?2_Fn3dSCQULr=u3p;CKCeO#DFKU+WwEiS=Q8v|c(Rk{TRus~PNa4`Zt=M?{^s zmZE})7|Y`Iaw)!bNo`7W;kb(uBrJ2j!I2+a#!WA z^Vqy;gqz>k>HGt*@?W%_#-N^J>RfZPNq3&Cv!?rAG@!lNs$c^CV6BVXblF%|^MAXU zT=mA=o@blF8AvH-T7g(|HW6kGzzia(W-;9%|3~Hy&bOB|jYRBx<9ldvO8#1(iFEL4 zBcq5s5jGIe%Z(H(%IT^7@`OZ%rWt+Qt-q!5TKoFI-jGDv`TUUG^{IKGbKHWeX-FxC z)WqfTqsPU*@ZJjAOmnaI*-Wl+U-B%dS8u0so(3hToX2n$si!x5O$OCCthOf^`3XNt zk}B9;|855Rm%Xc!Lw$qFn05+~#nyOe+`%>~M^*T7pK+|^97czR8a-4I+=oj4LGx1w zv=bSb*v?u0>EhGUU2zl2`uQaeZUkplZg$4zh~#7HfkwBBCg2gQqS8QB+;bP7D_HzSx(i^@KV!q_rNs?9?ak z)~3EZSm@!XeG_NTo;;+GaAy;sAZ0thq2a|KWcfT3I%j4_?ppNk3|#ma>Kl)If^Ti= zJN@yz;fQrZ-!V@svb?`((`GSr{M{U3O<=h82p4CJQ3ukU`)eHnWk3J zdXX{$Cx}{#9P=p|v-6*@LLkgKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000uKNkl_PMr!5jOlXz4jgjnS1tJFe(EZ83TqQ~T{&D5+z z&K6h(6ZZJ8KKILqzx!04XIAQxc0xq!1{rDcXv2qdCrx<}o92a-#?Sc<{l`-#XEzYun<}-<_Ktoin?;JBg-y z*3UZ0Hz(uJoU%|#^Xl*%<5PJoQ=--Kc72QT0+1^>96vM5bsJhpCrmn;EQThWw$|o# zH+6Ql?>E!Q1j1?=upN=?O_^ARAXjiXKRk~>qpp(hN@R-Q8XL%~UFdMszBrNyJSMFga6TKJQ=}0(FJxUMcVbWg1c< z<>L3|3NGnngd5+~$)>fh(O5-Vw=V@{U7p*i(ES*Rw4X&#|fN4mi2uKL9U4@i_yWX{qTX(OZ zr#%6{=wzP314I1B&(2V=JtC$=X;>(@eB?d-eEQA}i~eSNbBsT_do!zgl6?I;hlxa3 z5(yejq2OUV9;P7!L@H@TEW^}Fp$&vq8m%>2D_mEhm1ZdbpY!?!Bb&;r8B}S2Hr6 zn^)$-QhAIfqm7Jx-0b1!Y2`U-lfYJj>D>Ob^Htb6IB#Gvc z$4@sLkmD+Tdf+^#hq4?xF}b7whfhs&;=(K^FJxbr0*;)T_Q#}4C?L2Fdf=*+(r8r0 z%*&CY5ZJa&KA%Sjfe;de?>kG7(OUc0fnsA(gI^pR<}2U&4Ks7a^2;tx<@v(jKgW?% z(?~;d{{z2eA@43a_(IX+YyW;2q~OI9lbjx!driV;7aX2=euRi6gQQUVM?ec*<_3)q zMIj_YN^IMv5Xfunddp66angP3Q_qav($x_sm56X|I7`7+n5Kac!hfj%jR;;YkcQyb zFOKrqvqPLbpJniw3*7&}A)Y-vP9`12G$rRQE^z4N6a#BpXl;sC4gU1d9AEgx3p{&t zf@IuezTh%GQ{=YmS6sFN{_de8{PH&=M5AUfVU#Bd1VRdglztrGy0kYLOifPl)1N<2 zjL9Qwd({ujQYF}PT(a3L7e`Hw{q|+1vkuMet)!bWB$5dt(J0c8fWYxQTu*WLyVrBu z?rZ37OQ1FEy>m0GfLWY-DY3xSddB2NYw8`fSBmu3q^`{5!ZImo>yI{H4MLorxe2QWdR-3^=c7-C`ljGl}hJ9ElddT zpk-w%_k4W!k`Vpuog4Z1?bot-ZEM5tGf9iP-noVwwsi2(FFnSgSI%R_OgyE?it94a z-$hU7(ms22Pv)|SY;|{vZ+`wp-ult+GWO~`2*F#nui&oRHgVIAm8|T_kcgSsj>pBx z98Vt_=E0vF<7ZEu0Z&2H^qrpy6rpR2W2!QNA~eZWD?{ZkWrLXyJ_|IMh()e=^=Exw z8(;i`J$&UGPx942eFq=BZ6i|FM^J6e2{x~5=M%rTm7hI%hClh*;~Y9N0?8;yKZN&Z zR+W5Vs7M$>KnM*LRR|*l{QwOmB$Ux0gVM#7Z=cvVz|#+Yln=doQ$yiv+uq%4_{FzB z%)VPUL(U1tX@rhOWdh4Gh|pxpkOImAhlDSopoEAp8s31GPDWVO_1ePW=5&+?|7ss^ z+r1VFZbh(gmkkskst}+{ORLp4$eI@jSxqF%q{X5p-}>^qXlYCNJP;PRgorAoh>#q* zWCEet4|@U`n*H#Lmswl8qKSL%-T_6gMgfbMK$-K(CP1~&lEy?BdT_b5kMA2G-IlDZ zic}%FM)1%iRuCW>AVAc50l91yu(~J1j?LZR=<2bG1`}9^fD#8#!<4c{_z-(8$F^l% zyPx~kl3!RBN(c}&aexd~6{}o@s0oPtd||n^_NG`x_)-L@v>zjsQBWNdm~|Ym80>|F zc!YzeCb;FEM||H=HW|OWMUVIY&N}Y7bIaA-DN&C9L4s7EWi@}56j2FL77NUZvufSo7Egp6A9M&&cGCsW__X*a7Z*_ zU0nr~OhA?LfIt!DF{&yem*pz5D7n8HXxDm$Ms6`|CRcOoNCVEQLUbkHFDHH>4yd;0 zhBGW{gq1asRrNNKtA~J6VkbkpS!4|dRC$5AI6zdVkaFoPaan}QVfU>Ss4xlEWP{Yj z0iwQOP&?yQh^Qf)AoMJ)zFs{qATANbhI!6Mhgk=m#iA$K$VJu=rD-rSQ{?%R(`em@ z4l29Ll+tu$qO9pkya6OAD6f17RUHFR9SK$yMXP52vU&{mrH-fw8cl@6;#$PCKxuTOx&?z-9wRGo{Z zv#DC2E9K%|gGSGaH^>W!0RA=nML6G~CJqR*qo|$z%isek8z4b0u0UzLF$$=wY-yhm z%kjUciUVXAJ{p0P0?RUL%z`DnLj(BN21jy{6!i@YhN{PDng*s}RFXJRyF4CzB7~qh z9j!M77V!eL^)}I{rci4V@{KcrMqNWH5g`^cnVGl2_R9Ptr9Ti2FqJI=f}Zvi7_vtA z*Wn^--KDH9u81pKT#qC)iPQg`!*`6H3*^tbhsJ{j>1!6-}D-GriPaRB@|s<@6I(uVis$9(kQJN zpDBQbxam#;m}BFUqP;tHAs+X#BNO?|Lf#>jim|P~ou3~Z3f3AgXU3_|Ar@U*kPtWc z!Qok+{qmt;R;qS2g}1F#j#^dHTor6|QvSIiG!t`0NJc8@uNI(SU|lm!$p}Tq(1%?3; z)9=xsM?%L)utXm*8XqkQmg!$d4Brj{*yCze^`zOer32HD6l{+dPfvl6Y;7I?WmLN7 z99OwUOG^t~-MzHNU77c+4MWq(-mz?sYr4`zBPKm<3EG^3lQOHQZa*V>zdhlZ8H(mKr6*lN5&W#v*}7_ zFW%gB_MdFWd+F%0V+-cU$Oyy3!wYNrR-N44d-3}d#rVn#lbNo;gG1c3eFZH|an|&t z=;=r@I$dCBs=#dC!&ac`*4`SO8`UdJ!e|gNih2&Hg1invzjW<^GW^XCT4A9{MJ3&t z2rFBoB%>0cHQD(h&%HdsnG1Q6ai_4i`_zL`QyjWDGoKwD9Ytg^8CqLgxn=L(R4N|X zk$1%V9zEN4_qmzoP9r85Sli0Fl}$9Kqga-S2waKMpzBs#MdQkHqp(_rWA=~|bm;GR zr5&9m1%&?}q*NIZ0*yfVRE5TIJQnf}Cx_-ZdTxgNoFWrj$o+2Dk%zlu3;S(lJpK6N zk4>I9aRSlQ)P!x@Y}vAfUDsdVZb`k%arHZ&8SlCEg~{#>o?}UoFzIZL(vpdhh*>nH zqUhROpi%rUWqpOYVQ|zy0cC+zX`^2?8fuUs(B$$C*#(>Vyu;W`k>b1y!lOTV@xo25 zCkLCX;*UKMdFthtj|~qF4l2vC5b<~%fP6mB)~#FRo;`co4Jo#p!rOH*pV)ac+qwDl zLUYfo6HoYCivzN$T7fm{p{w`pE{_KPa~~^M~@yEe&UHIywZlSx>$6_jveBL8*XR<`c0v>NTK@+ zp1E??iFM?amDC7X@c@e)YYQyYBwLN{t%`$mhyZoyI&2=gK5p>MK}UpJ$Qb#Fq$~~r zr(Dd#LWq}-A3r`hI5?<0&!aT)4gWnpFfhRO?b{=%RH{`KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000uKNkl_PMr!5jOlXz4jgjnS1tJFe(EZ83TqQ~T{&D5+z z&K6h(6ZZJ8KKILqzx!04XIAQxc0xq!1{rDcXv2qdCrx<}o92a-#?Sc<{l`-#XEzYun<}-<_Ktoin?;JBg-y z*3UZ0Hz(uJoU%|#^Xl*%<5PJoQ=--Kc72QT0+1^>96vM5bsJhpCrmn;EQThWw$|o# zH+6Ql?>E!Q1j1?=upN=?O_^ARAXjiXKRk~>qpp(hN@R-Q8XL%~UFdMszBrNyJSMFga6TKJQ=}0(FJxUMcVbWg1c< z<>L3|3NGnngd5+~$)>fh(O5-Vw=V@{U7p*i(ES*Rw4X&#|fN4mi2uKL9U4@i_yWX{qTX(OZ zr#%6{=wzP314I1B&(2V=JtC$=X;>(@eB?d-eEQA}i~eSNbBsT_do!zgl6?I;hlxa3 z5(yejq2OUV9;P7!L@H@TEW^}Fp$&vq8m%>2D_mEhm1ZdbpY!?!Bb&;r8B}S2Hr6 zn^)$-QhAIfqm7Jx-0b1!Y2`U-lfYJj>D>Ob^Htb6IB#Gvc z$4@sLkmD+Tdf+^#hq4?xF}b7whfhs&;=(K^FJxbr0*;)T_Q#}4C?L2Fdf=*+(r8r0 z%*&CY5ZJa&KA%Sjfe;de?>kG7(OUc0fnsA(gI^pR<}2U&4Ks7a^2;tx<@v(jKgW?% z(?~;d{{z2eA@43a_(IX+YyW;2q~OI9lbjx!driV;7aX2=euRi6gQQUVM?ec*<_3)q zMIj_YN^IMv5Xfunddp66angP3Q_qav($x_sm56X|I7`7+n5Kac!hfj%jR;;YkcQyb zFOKrqvqPLbpJniw3*7&}A)Y-vP9`12G$rRQE^z4N6a#BpXl;sC4gU1d9AEgx3p{&t zf@IuezTh%GQ{=YmS6sFN{_de8{PH&=M5AUfVU#Bd1VRdglztrGy0kYLOifPl)1N<2 zjL9Qwd({ujQYF}PT(a3L7e`Hw{q|+1vkuMet)!bWB$5dt(J0c8fWYxQTu*WLyVrBu z?rZ37OQ1FEy>m0GfLWY-DY3xSddB2NYw8`fSBmu3q^`{5!ZImo>yI{H4MLorxe2QWdR-3^=c7-C`ljGl}hJ9ElddT zpk-w%_k4W!k`Vpuog4Z1?bot-ZEM5tGf9iP-noVwwsi2(FFnSgSI%R_OgyE?it94a z-$hU7(ms22Pv)|SY;|{vZ+`wp-ult+GWO~`2*F#nui&oRHgVIAm8|T_kcgSsj>pBx z98Vt_=E0vF<7ZEu0Z&2H^qrpy6rpR2W2!QNA~eZWD?{ZkWrLXyJ_|IMh()e=^=Exw z8(;i`J$&UGPx942eFq=BZ6i|FM^J6e2{x~5=M%rTm7hI%hClh*;~Y9N0?8;yKZN&Z zR+W5Vs7M$>KnM*LRR|*l{QwOmB$Ux0gVM#7Z=cvVz|#+Yln=doQ$yiv+uq%4_{FzB z%)VPUL(U1tX@rhOWdh4Gh|pxpkOImAhlDSopoEAp8s31GPDWVO_1ePW=5&+?|7ss^ z+r1VFZbh(gmkkskst}+{ORLp4$eI@jSxqF%q{X5p-}>^qXlYCNJP;PRgorAoh>#q* zWCEet4|@U`n*H#Lmswl8qKSL%-T_6gMgfbMK$-K(CP1~&lEy?BdT_b5kMA2G-IlDZ zic}%FM)1%iRuCW>AVAc50l91yu(~J1j?LZR=<2bG1`}9^fD#8#!<4c{_z-(8$F^l% zyPx~kl3!RBN(c}&aexd~6{}o@s0oPtd||n^_NG`x_)-L@v>zjsQBWNdm~|Ym80>|F zc!YzeCb;FEM||H=HW|OWMUVIY&N}Y7bIaA-DN&C9L4s7EWi@}56j2FL77NUZvufSo7Egp6A9M&&cGCsW__X*a7Z*_ zU0nr~OhA?LfIt!DF{&yem*pz5D7n8HXxDm$Ms6`|CRcOoNCVEQLUbkHFDHH>4yd;0 zhBGW{gq1asRrNNKtA~J6VkbkpS!4|dRC$5AI6zdVkaFoPaan}QVfU>Ss4xlEWP{Yj z0iwQOP&?yQh^Qf)AoMJ)zFs{qATANbhI!6Mhgk=m#iA$K$VJu=rD-rSQ{?%R(`em@ z4l29Ll+tu$qO9pkya6OAD6f17RUHFR9SK$yMXP52vU&{mrH-fw8cl@6;#$PCKxuTOx&?z-9wRGo{Z zv#DC2E9K%|gGSGaH^>W!0RA=nML6G~CJqR*qo|$z%isek8z4b0u0UzLF$$=wY-yhm z%kjUciUVXAJ{p0P0?RUL%z`DnLj(BN21jy{6!i@YhN{PDng*s}RFXJRyF4CzB7~qh z9j!M77V!eL^)}I{rci4V@{KcrMqNWH5g`^cnVGl2_R9Ptr9Ti2FqJI=f}Zvi7_vtA z*Wn^--KDH9u81pKT#qC)iPQg`!*`6H3*^tbhsJ{j>1!6-}D-GriPaRB@|s<@6I(uVis$9(kQJN zpDBQbxam#;m}BFUqP;tHAs+X#BNO?|Lf#>jim|P~ou3~Z3f3AgXU3_|Ar@U*kPtWc z!Qok+{qmt;R;qS2g}1F#j#^dHTor6|QvSIiG!t`0NJc8@uNI(SU|lm!$p}Tq(1%?3; z)9=xsM?%L)utXm*8XqkQmg!$d4Brj{*yCze^`zOer32HD6l{+dPfvl6Y;7I?WmLN7 z99OwUOG^t~-MzHNU77c+4MWq(-mz?sYr4`zBPKm<3EG^3lQOHQZa*V>zdhlZ8H(mKr6*lN5&W#v*}7_ zFW%gB_MdFWd+F%0V+-cU$Oyy3!wYNrR-N44d-3}d#rVn#lbNo;gG1c3eFZH|an|&t z=;=r@I$dCBs=#dC!&ac`*4`SO8`UdJ!e|gNih2&Hg1invzjW<^GW^XCT4A9{MJ3&t z2rFBoB%>0cHQD(h&%HdsnG1Q6ai_4i`_zL`QyjWDGoKwD9Ytg^8CqLgxn=L(R4N|X zk$1%V9zEN4_qmzoP9r85Sli0Fl}$9Kqga-S2waKMpzBs#MdQkHqp(_rWA=~|bm;GR zr5&9m1%&?}q*NIZ0*yfVRE5TIJQnf}Cx_-ZdTxgNoFWrj$o+2Dk%zlu3;S(lJpK6N zk4>I9aRSlQ)P!x@Y}vAfUDsdVZb`k%arHZ&8SlCEg~{#>o?}UoFzIZL(vpdhh*>nH zqUhROpi%rUWqpOYVQ|zy0cC+zX`^2?8fuUs(B$$C*#(>Vyu;W`k>b1y!lOTV@xo25 zCkLCX;*UKMdFthtj|~qF4l2vC5b<~%fP6mB)~#FRo;`co4Jo#p!rOH*pV)ac+qwDl zLUYfo6HoYCivzN$T7fm{p{w`pE{_KPa~~^M~@yEe&UHIywZlSx>$6_jveBL8*XR<`c0v>NTK@+ zp1E??iFM?amDC7X@c@e)YYQyYBwLN{t%`$mhyZoyI&2=gK5p>MK}UpJ$Qb#Fq$~~r zr(Dd#LWq}-A3r`hI5?<0&!aT)4gWnpFfhRO?b{=%RH{`i6;(auOQ7WBbGTU?{|N8a*qFJb^s{i`z?RzECzPA3C zM1w&L?Ck6R{PMPdRg^~wr)oLvoMHKU9RK;~ww8VPnpgk+`pKn-%W^GYTULjMhh!`Q z@pBZ~m}l&lR{ZYd%9(QVdLOk|4gdG>?0hQ!_2~cf$=Q)w%xx)YCOE9SbI|N8OVZyo&n{N;Nqt5XO5OzTJX9!d?>p# zX)4dGj7LL2@@fdnjb7r>xb}=g|B^WF&9ZbW0M?6Q)Nmr~fiM5CY>rzr|J9xNb`t*m z{KaS@*sYWQ!GGzIOx$`fwXCJOqK~(CK<&ev^x@RszoqPuS@rep_<$sogmwS>*4ML_ z$+Dm9^!me+TIlHK{{8>*cN_2T@&Enj&|(w(`}vzr56x#C_xt}@!f-PF|NsC0{r>*`|Ni~|{{Q{{ z|KWEj{{Q~>co*j7~|8j_0iU0r*9!W$&RCwC7nF(A|SN6w4!XgQf0EuiG zNCE~77=mD;sR;;Z7$JZ}pR%~H39={{MHVf4gedyAwn(IlNUeo}X!uvAT3e>$OzQ?R zK-IQs%}bE#2!HJ#rdr#~ePK<20RHEHK4LyE$vfYB?>YCp-#tNTrkaDp_Y#Q&(#+3b zIWg_IdwK(gRq3PnPJ=!<+xuF09VK%T($k<_Cao6)w4OIVUKd_u#*PJ$@V?Z)9ZTno)ye z(M+!H5=o^p-GJxQR-|_S@jNLm*T9f#NxcBjJmp`ku7NJ&pww1!-gCf z2FR1mHhsuzwy126s;UBm4=D&RPD>N#s1W+T-Hv+e5@b zZ2`u{K|xKfuAQc)>0}HC$LWYDGRYJPW$=6f%%83uPIFHB_4H}08@$?D9EYq|(9@%|+xdK@ zecXp}S^$_rLQM^Mpra!~QNgA*c!?6B`2Zxl{(5f1<+3A38h;>e*j=*V;-_nk-2(FV z^hQ0N0HmjXxIkLPlwkz9Y|GVbq@7^2?PHuSboM%9D zeB7C!ygUSu3YG}t?SrBi)SSsws`_Nf#l9uG zH;M0!15C+e4hQ2+3uO`6YqGN!3nh?xT7bDZQ$3ljrg$9)$9J*WT~utejG-FYny{K) z9W0}~wb;e8ySsZ!YHBLE2ARS@#F~lKOn!2_!fXPVI^%#+Q0#bWo8LiV9RHp39|n{c%KxV*q>?75%of+Ax4Zvc^)mTq3w5w1R6Q3O4k(VA2IkEm5>U zl#hZ)^l6Ocva!~g0@xrxxHKF1=i-5XR0V#sNH!rDl+(xqVX@g(nop?02Zd?`QHbp- zY9L4q0br437jO^!qfjUXdZ`GS@UJy}0^E1gy~rAkui#b?@$A@G>dJDGApo=s%Ldtl zN1=Rtd=zWSll1`zV=_ezw47N{%bM7V3NQgSJJ!V3*APJXOBdKQ_)x8XMN1}uJ_*1a zGu=R#=L(KxKSzU=jb#&KBTp7i1Axc#0?kDcN5=2%t+4c(0|0qA2{xif0PLYfueNYw1_-Qo7 z;Y`7Ffa+=Fnc!McECOhx-QPX6RE*DAvXQHZi0J6>rg>u$5-^98`+l6Gc>hsoi^k%! zv0a?@^^h8#2@q_8_dx(O8Ylr|%#P$f}EbR4d(wbPYsJ3jzZZJE$s8x;ira=ncRMf0 z(`^arc`cFXO8+HZ)r}{EdT9zz)Y9jXoP;thAj7pOeF(UZExX;Bk(%n7msc}C03~yEX%;W)MpoFHGXg}Gk+@C(NJRkR*42c0?SrfPO6}Wu z@s(dz>(!$1bGuAn5{NUpecNaRka2t-F@OqppU=w*NwP??7?jTpI2%}Jblb=^HMOZJ zPn`NYK|R+}0SjzXnnNnH0ARh&flU`6vSn?#ZM5efr%s&;5{tL^&l#W`Y}nTOPE}NG zfOEkzNHY^aEhuMo-`)cNIXOAv-ctbZXimdtnlIYu`QV+ZdmlSH7ko;eqD_?(qT=vF zqkA8I7?hLK*4tZ76=!PhjeX!R0^tN9xsbtxW8y3yZ7WVNWZu_P_lP8Jm#N%~h zEuakm`csO(F`ovYpZ~)0y#;aY&Hc^=?d@5{dwmUwUs?H;?mR22?rsDSyM95O3JdT;#s8G3Jn3^;*<=rl~r3?TR?n#keiv1sRvN&`BzH_*G%rG zWwl$KvB>I;;`Q$Y@c95LT#;5#U>p#T6d!-4^!Nk-qEB7@pM}0x@Bh;?t+Y*iCM2Xc z?m=99sUJMcF;;MGMF4Og5)~B{V(jlrF_4^zB(oG;Q-Rn>T+m!l(0e1UD!%Ra=IeySI0G+9;xBv0bBFT!!i;Jo> zPTMJ+>FiNlzWO1kSWS6Bd2#n#gW7V$A>v+Re}ZN<037VKp+Bke(xs}XB)5G_rU%Fq z_n$aSI|?2epsMHHy9YLAPM$dFJ2yZ2tN?IjmSSA__!6(Z*TQ*gF+5ENHdwSYoJQ`v z4XhIs#_#szAjK=F`^o`GGdn;7`|d8?!{a^XWd#JJ_)fWn9!&YuvFDLT>rAzP&Ww!j z_B3Urp6U;3-AkCM8KR@fnSF^TJwqz(?Q27lvOX==buJVgI$+77u{aoVO}eRRO>1jw z2AD-gM(UQ-bNiKs023do6U#5`>8Ug~V4yHNW2=rO;uB4pEY&ht677utRAH2?q}X z^%u!P^cgaZnuiZ-THQVnXbb};5rTJqyS~YyGQO&+nPt6@B9j1n>rcmuvbk$$3ZEkf z4;}>i6$n^F!IqV!r{n6pDtzUc9iUy*9piefM%KFrduQTrD6X0#%^}cy|l{8B0z$ z*qXpuVLMaPVJ3hY5|SErT=8(LjCxEYf&(y{%SI09BS&Z-#JpLUjt&e5hf@UZFcV4U z+nAM01SGTHJ(@xuR7DbFLs7A@crJIW2Y{H5PiO}Rhlz;5M6N6s(dXUy1&2O!X7Y)x z#%Io4u3P@Y4@AVY2rkmcKp->)SSwnfj5ckMy(MB^8Wj4)Z7(fS-%E7^lK=3-$@Yl^IU^8S>wMmP9{+G8u zqCoKMqRb$GJ^~O3L?RNwE7SLo*@=dRrAr$Y9?J9*Nao<(06?itBy;mgJykWG4nY(O zC0GVQb8~JG0ICz>ovHah8fs=etJe_z4+As^K=c0z0INN}pG(J@J$mCp&D`7o2ISn> zDGjc^GwIX5zHj7mHDZ%zJZdumn3Cd>ojbphIE*a4Zy~98L5Z*L&XGcIE|LaMJ{Nqg z(Wo?&HnCjO!vHVfuP0yAqtS$E?DPOk2gyfI|9*J$qR}Ck9r*0+_xCkzslgsG!x_Wm_z9uZpz20%i@mZMW<{}q&U4W9{SL(6V-~W@-r}t}%qyN5* z8+Yv3xY5L9H$pJ4|JR)#$J;U*7d`?A8>%0Dr`{1U9kWhL(H8V?>rg_ zfpvKj&5r?BH{Wm^4%76=Cj(%~SMP-{DE{8T!Qsn~?(ar6s`FX_s1X7|@~-Y>YAxW$ zv3;S^fEhf|Mq)S`S$TQ%@Twk0{wsj7d&1D%e8G3pAc2?wK)1~Pe*7!x&tNLwlg{}g z3FEw;AOb}QK(@JoHM0gbha{)cPTnHna?l%g_ruohbp!j{Z7wXi(rrg(e)Ggr((DaKN$)3a16ML;e&|wta5a+iE*)s ziFp=d!(XR61G(Ttc=@PslI?Co0JR@W?*PDHHN4&eRDEW>qxqzq90@WoM@PVObY%3X zz&wV4IU;|K!>^Exod75uKJUIbDnkVyxcv>htgoan9UPF2vwpoq3;5f(y3E(a46hn# zw>{&((!AoYV=y!f#*mF2_z3*#u^S7)cos3Ymo6Jo(rT~EYaO&R7zZFTU_?8bo8O%P zjKl!=8FI3V9$ExK!02%r()9G$F|-?wk*_lY&Cj>?{_lcYFml+pUEznMi`z1!os87f zO`8Cj`4_(XyG$ko0q^-eV2QpSz0-#OYS;z|tV+I$54MFJ82dUKcl}bKy!GwgD_3(R zk}t1@uhyQ`-L{PZE^h*=jrrTZ>Rn#G`0ckBFOj0)GByL%D!wEC4Gkk7%)#y%-)UVK zW0eiRK1`$1t3^M(x$D0_Dc!KG^ou1UKUF>5!DLFMz(0NKR%B@?i--AI8v>)Xiy3}7 zc4su-iNP3+{kmZgXg=SjXUzWuK>kyrm*0i8%Rc=!b3{hj+KvG(F467)O3%x6&;I=9 zXX`X}a@9+hn`3uAiFu(J|H0GF-NnUy(Rhe;iXAf;qUS#vKZqm?m`oB0JToc2#Ulwi z*r)1&=pfQP2BeT&TTxZhJ`Z3W1xOeNkR}UTSlcI7$tRa;)obgb|A75lfB^svE1tgi SJ+A2h0000i6;(auOQ7WBbGTU?{|N8a*qFJb^s{i`z?RzECzPA3C zM1w&L?Ck6R{PMPdRg^~wr)oLvoMHKU9RK;~ww8VPnpgk+`pKn-%W^GYTULjMhh!`Q z@pBZ~m}l&lR{ZYd%9(QVdLOk|4gdG>?0hQ!_2~cf$=Q)w%xx)YCOE9SbI|N8OVZyo&n{N;Nqt5XO5OzTJX9!d?>p# zX)4dGj7LL2@@fdnjb7r>xb}=g|B^WF&9ZbW0M?6Q)Nmr~fiM5CY>rzr|J9xNb`t*m z{KaS@*sYWQ!GGzIOx$`fwXCJOqK~(CK<&ev^x@RszoqPuS@rep_<$sogmwS>*4ML_ z$+Dm9^!me+TIlHK{{8>*cN_2T@&Enj&|(w(`}vzr56x#C_xt}@!f-PF|NsC0{r>*`|Ni~|{{Q{{ z|KWEj{{Q~>co*j7~|8j_0iU0r*9!W$&RCwC7nF(A|SN6w4!XgQf0EuiG zNCE~77=mD;sR;;Z7$JZ}pR%~H39={{MHVf4gedyAwn(IlNUeo}X!uvAT3e>$OzQ?R zK-IQs%}bE#2!HJ#rdr#~ePK<20RHEHK4LyE$vfYB?>YCp-#tNTrkaDp_Y#Q&(#+3b zIWg_IdwK(gRq3PnPJ=!<+xuF09VK%T($k<_Cao6)w4OIVUKd_u#*PJ$@V?Z)9ZTno)ye z(M+!H5=o^p-GJxQR-|_S@jNLm*T9f#NxcBjJmp`ku7NJ&pww1!-gCf z2FR1mHhsuzwy126s;UBm4=D&RPD>N#s1W+T-Hv+e5@b zZ2`u{K|xKfuAQc)>0}HC$LWYDGRYJPW$=6f%%83uPIFHB_4H}08@$?D9EYq|(9@%|+xdK@ zecXp}S^$_rLQM^Mpra!~QNgA*c!?6B`2Zxl{(5f1<+3A38h;>e*j=*V;-_nk-2(FV z^hQ0N0HmjXxIkLPlwkz9Y|GVbq@7^2?PHuSboM%9D zeB7C!ygUSu3YG}t?SrBi)SSsws`_Nf#l9uG zH;M0!15C+e4hQ2+3uO`6YqGN!3nh?xT7bDZQ$3ljrg$9)$9J*WT~utejG-FYny{K) z9W0}~wb;e8ySsZ!YHBLE2ARS@#F~lKOn!2_!fXPVI^%#+Q0#bWo8LiV9RHp39|n{c%KxV*q>?75%of+Ax4Zvc^)mTq3w5w1R6Q3O4k(VA2IkEm5>U zl#hZ)^l6Ocva!~g0@xrxxHKF1=i-5XR0V#sNH!rDl+(xqVX@g(nop?02Zd?`QHbp- zY9L4q0br437jO^!qfjUXdZ`GS@UJy}0^E1gy~rAkui#b?@$A@G>dJDGApo=s%Ldtl zN1=Rtd=zWSll1`zV=_ezw47N{%bM7V3NQgSJJ!V3*APJXOBdKQ_)x8XMN1}uJ_*1a zGu=R#=L(KxKSzU=jb#&KBTp7i1Axc#0?kDcN5=2%t+4c(0|0qA2{xif0PLYfueNYw1_-Qo7 z;Y`7Ffa+=Fnc!McECOhx-QPX6RE*DAvXQHZi0J6>rg>u$5-^98`+l6Gc>hsoi^k%! zv0a?@^^h8#2@q_8_dx(O8Ylr|%#P$f}EbR4d(wbPYsJ3jzZZJE$s8x;ira=ncRMf0 z(`^arc`cFXO8+HZ)r}{EdT9zz)Y9jXoP;thAj7pOeF(UZExX;Bk(%n7msc}C03~yEX%;W)MpoFHGXg}Gk+@C(NJRkR*42c0?SrfPO6}Wu z@s(dz>(!$1bGuAn5{NUpecNaRka2t-F@OqppU=w*NwP??7?jTpI2%}Jblb=^HMOZJ zPn`NYK|R+}0SjzXnnNnH0ARh&flU`6vSn?#ZM5efr%s&;5{tL^&l#W`Y}nTOPE}NG zfOEkzNHY^aEhuMo-`)cNIXOAv-ctbZXimdtnlIYu`QV+ZdmlSH7ko;eqD_?(qT=vF zqkA8I7?hLK*4tZ76=!PhjeX!R0^tN9xsbtxW8y3yZ7WVNWZu_P_lP8Jm#N%~h zEuakm`csO(F`ovYpZ~)0y#;aY&Hc^=?d@5{dwmUwUs?H;?mR22?rsDSyM95O3JdT;#s8G3Jn3^;*<=rl~r3?TR?n#keiv1sRvN&`BzH_*G%rG zWwl$KvB>I;;`Q$Y@c95LT#;5#U>p#T6d!-4^!Nk-qEB7@pM}0x@Bh;?t+Y*iCM2Xc z?m=99sUJMcF;;MGMF4Og5)~B{V(jlrF_4^zB(oG;Q-Rn>T+m!l(0e1UD!%Ra=IeySI0G+9;xBv0bBFT!!i;Jo> zPTMJ+>FiNlzWO1kSWS6Bd2#n#gW7V$A>v+Re}ZN<037VKp+Bke(xs}XB)5G_rU%Fq z_n$aSI|?2epsMHHy9YLAPM$dFJ2yZ2tN?IjmSSA__!6(Z*TQ*gF+5ENHdwSYoJQ`v z4XhIs#_#szAjK=F`^o`GGdn;7`|d8?!{a^XWd#JJ_)fWn9!&YuvFDLT>rAzP&Ww!j z_B3Urp6U;3-AkCM8KR@fnSF^TJwqz(?Q27lvOX==buJVgI$+77u{aoVO}eRRO>1jw z2AD-gM(UQ-bNiKs023do6U#5`>8Ug~V4yHNW2=rO;uB4pEY&ht677utRAH2?q}X z^%u!P^cgaZnuiZ-THQVnXbb};5rTJqyS~YyGQO&+nPt6@B9j1n>rcmuvbk$$3ZEkf z4;}>i6$n^F!IqV!r{n6pDtzUc9iUy*9piefM%KFrduQTrD6X0#%^}cy|l{8B0z$ z*qXpuVLMaPVJ3hY5|SErT=8(LjCxEYf&(y{%SI09BS&Z-#JpLUjt&e5hf@UZFcV4U z+nAM01SGTHJ(@xuR7DbFLs7A@crJIW2Y{H5PiO}Rhlz;5M6N6s(dXUy1&2O!X7Y)x z#%Io4u3P@Y4@AVY2rkmcKp->)SSwnfj5ckMy(MB^8Wj4)Z7(fS-%E7^lK=3-$@Yl^IU^8S>wMmP9{+G8u zqCoKMqRb$GJ^~O3L?RNwE7SLo*@=dRrAr$Y9?J9*Nao<(06?itBy;mgJykWG4nY(O zC0GVQb8~JG0ICz>ovHah8fs=etJe_z4+As^K=c0z0INN}pG(J@J$mCp&D`7o2ISn> zDGjc^GwIX5zHj7mHDZ%zJZdumn3Cd>ojbphIE*a4Zy~98L5Z*L&XGcIE|LaMJ{Nqg z(Wo?&HnCjO!vHVfuP0yAqtS$E?DPOk2gyfI|9*J$qR}Ck9r*0+_xCkzslgsG!x_Wm_z9uZpz20%i@mZMW<{}q&U4W9{SL(6V-~W@-r}t}%qyN5* z8+Yv3xY5L9H$pJ4|JR)#$J;U*7d`?A8>%0Dr`{1U9kWhL(H8V?>rg_ zfpvKj&5r?BH{Wm^4%76=Cj(%~SMP-{DE{8T!Qsn~?(ar6s`FX_s1X7|@~-Y>YAxW$ zv3;S^fEhf|Mq)S`S$TQ%@Twk0{wsj7d&1D%e8G3pAc2?wK)1~Pe*7!x&tNLwlg{}g z3FEw;AOb}QK(@JoHM0gbha{)cPTnHna?l%g_ruohbp!j{Z7wXi(rrg(e)Ggr((DaKN$)3a16ML;e&|wta5a+iE*)s ziFp=d!(XR61G(Ttc=@PslI?Co0JR@W?*PDHHN4&eRDEW>qxqzq90@WoM@PVObY%3X zz&wV4IU;|K!>^Exod75uKJUIbDnkVyxcv>htgoan9UPF2vwpoq3;5f(y3E(a46hn# zw>{&((!AoYV=y!f#*mF2_z3*#u^S7)cos3Ymo6Jo(rT~EYaO&R7zZFTU_?8bo8O%P zjKl!=8FI3V9$ExK!02%r()9G$F|-?wk*_lY&Cj>?{_lcYFml+pUEznMi`z1!os87f zO`8Cj`4_(XyG$ko0q^-eV2QpSz0-#OYS;z|tV+I$54MFJ82dUKcl}bKy!GwgD_3(R zk}t1@uhyQ`-L{PZE^h*=jrrTZ>Rn#G`0ckBFOj0)GByL%D!wEC4Gkk7%)#y%-)UVK zW0eiRK1`$1t3^M(x$D0_Dc!KG^ou1UKUF>5!DLFMz(0NKR%B@?i--AI8v>)Xiy3}7 zc4su-iNP3+{kmZgXg=SjXUzWuK>kyrm*0i8%Rc=!b3{hj+KvG(F467)O3%x6&;I=9 zXX`X}a@9+hn`3uAiFu(J|H0GF-NnUy(Rhe;iXAf;qUS#vKZqm?m`oB0JToc2#Ulwi z*r)1&=pfQP2BeT&TTxZhJ`Z3W1xOeNkR}UTSlcI7$tRa;)obgb|A75lfB^svE1tgi SJ+A2h0000aCC#nfYA*Cj+jbHmm`&!2uQ;yNg2rX z-d}J(yyrac`3Wc42&hd$#7KmNg+-#Pqha!|js6QE&cDPCa=ZOsnP{tFH6xk#{|TOl zs(~sN)`v{uJ7@fV{@7o~ItUAkbnw4mkNVZU_%|{JYgz@H`nd$>mZ`sDg80S21Q)Y_Q)e=vlutK{lWa6@h^HHv z#F?L|7(z;>O0RB+NNy#NX;l#Yo6}F1!JfoL8O+-+_+sNlN5DYl)I*=wb0JUq3GO;L z<}{7Uj{yq|5AgHa8BL~Q>E@0rdIpnkWp=OdBY&(yDE0_o6&_2)L*_|1=@}Qq^layA z8dLdd?DM?SQz+`{PyLYm!x<;l$O}$gd5UX!^rSxNk9>sIYwP1F zw)5>vf9z$781gwMEV159Y*yT)4UR}s3g7V<7`Ogif?M5U{=5nw+d;k0?-!k&BCW=`hePq???Nqz)^ab$1h?79t)qL zDXhp`W!?7W$9><0?TVa=njkzq^1pm=Q)VBF)s^t}H0U0Gte$o$;qE@g4L1&W&Q-ug zNS(v_kv&d}#X^IB#=#eHG%j$*eKZFKIE2ameKHbx(8k7X|D)8hMt;?$TUQ7~$+W#5 zflwp=e3Q)GpY{T$<|K$&paFBLcR0$^6G?=rYz{^%uHAT*a~#{OCDYo<8eoI1)=9Z5 zRn=lA?W7C2kY-^2-k?{>@(3MpbIrr^a17)yLVb--oMSSXm7FD<*mInrKyJWl4w4`r z+r`T-2@sg;QETf)?5+n5FQExxxe2I%iMaQcDxGdycKBcy}{viVQcd0tAzD88E-ysmYHD@j5jmbvqS|%Z(S45 z-AagbI3Bu=wlH#<^vQw$JOYqAeL2Q<&x#zvri&q4mIEB82%P?m4m9!X^z)xs=m3|r z%mB$|(@}ZyN^+5bRvDH$zZD2F#EbgnBr8bk$$;W99TtIVR7?Q-IHG*5FV zhM|Mvq0HJdh5Qr^fEwIv9Uf>FeugmK4=nV0kkN=3)?JvwO5S;$W*j&+923r%y*B%S z95QZ2NC=KL;YcbJuvEXrbp-9GXo-t|pz(K58veS_sYDy;=Jh&A)AgMEguavbXf>*a zVp+AdC8>%Bx6`ztUpkYQDYVwWjJeA(TgjB+-dD{S7~pqN-}xT=R3XxKAYN5`vlB+V zMB%z+&ATbe7)dpq7flbogYC6EaQ&`0&b>k}*W@hiJLC}+ zY>(h#>WBi{mGklX9p%@HZGG)r$C%rJ*z#yRxzOO?bV5)N@EYWUqV(A&GH|_4f=b|k zoVG{q3`rHql3X^?d6U~KYfnLr@bk7a+jBr-6{ZakF~pV{kUhON zE6@^cg$1mI@k{lhGH&ralv{ZQWyNL{PTOMMx%@4#^6WI~w7R!w_t06%dry#mq9>g` zAVo{%$~%E^hj=Ja(<{4fmU0H_>luLFc7{5DzEXJ|3AW!_$dU5U^bSn?75{xF2_4bS zArY;z43@kac|6#%u>IHg_ESJl+c(@)DV9ms2@6f|tG&1nG*Df7U$HiiO>g%RgphuN zO{Js}GIx{YHX-Dx>i8JpB zDs;#)8^r8i05KL@={#9l1IbHppvNWqH`b2 zUG^9102;13x6(`g`)5D3e@);>$(9&;MQc?%GOix5p}JHQ;Rh;b*@e+2)n8c2P4AOF zhgjSFVcI3YrqQKIE}Aj1;2Mx6n`noBnT25g{BqZ5D$7#*QP}U-NYgvc7AF=9nTynx zVd`5vo;AdN(DeFJ55DEo0$0Nv;I%z%RZ46=3HWA&_pa6QhQE}~lyp0v6M`P+ zhn7!aH23JpKuIsXdmcya(k@P|wqMiPDwk5{mn+T38Em!$3nvRcxOrc0j{CG^d9Y7d zLz8>{xE-ZDAEY)o$=N%IW0K7Vkve$ZHz3XCdFiK`KzUJipbOJ?$T82$)cRyW?}1QE zuMhEzjL1T$B1@1tim(;$NhvZQRfFse)@p^B`u=Wplp~N>kC`oBS`oc>?gzefH`_Sj z1U5zOp5~Dlo2m!)sAsmk=IN;#baB37^(8z%WQ>@$|IXGkcQ;M3%equ?WmS6C%Gp@f zzBs^~%&Ql*s2P^9gYnI1^rlC*!#nyGr+JfhEk+FF*Ht#x`yGUcjHtnFsKbgh z*hl}C1{ce3y5-c+*PeQ<*Cyms-oPz*eA%g ztMu|q*NaMpoErXLyneI&u56?k_HcW16QwjY|4$9qmt%2nyQG2~ekeypO~u=uv;Cys zXDQiXsIjHbH(K?kV7bbrVaa^s1rRiG=WpjtO+WKM)d(&~zWr>CYP;HoC9GhkzOSQK zwpR{DU7Dv2kHchoL7KtK^DA&|vJT;NuP~8~-!%&-A|2LQ+AS&Q9%B0<6FrOil>9~! z(Tw|OYqiy!k2Vi=OvF^)`cJhYH9GvhUBAYKlH`?S5D!?JKe{QBdJOQ`4LbdSF!6 z3?Jg!3o2z0^IPk5olEJ}8jl4{$!{crl<9tKFFV;K zwm7ABzQcXo`r`=9`Pvh|M?XXIp$p2>u1#u`TFtxux*2HlzB~{|gwkUo9(|=n3jN+A z&@O1dx_8}FKko_Mxk=Pw)j_t%hJwxKj=H1+QzSyPtVUiEWSG(kqy>|<#Tb3t`pQq1 z$YV%mP(T?Nmh(H6U~%*{RgCV+{+G4b>sv($wKt$3z*CKrg@~L6^b1 z2jQE5H?pS63h5n$ANMbdHl({n3yf;R?}M~1V_{g`Jf zbswSbo*pV|I@++>?zc4DqD^=x7b59UCCS1zl(nUAo0QYh;9cbOAm_$R{F4c9%yMcZ zQFq?HjzBK1X%KKVCR8^#iKC048+R0XkWs>$H|u~392Jzj3*ElIJ{!3X8E%U=&s7Vd z%F{N=&-iAfsDi*ZMBO@S*YKNk=Rr5)=3fs;?BHn?_r?y=o@uPE_@h^v76MDFe&Z*m z7=BYn#0^!>Z~Jh<=*yj_gxcC_&DXx_NFWV-!K#*heFN>+3WFmTjl`9Dck_ii01H~F zvM!I8@IyN9hI~(3TodoYGNXf?=;CK}#8vrO)sDwdii$$|9BE_d=KHY*Pcau|hoK-r z?9lIi0F{|t2Lm>`0y*(#^MYa_z$917P>4;MM4qFYa0ST~# zyg2#kZja{WNg{Bmm;}r9E3<8}%`@K1k@kf{L!La@tL*RZFC=g>$GK)%)`5bq3h+rf zmhPQW-;%z*z!1=O>dGxImjJGru%Wl{+=Y*Yg`2ZJ)kT}jAx=Aqs&*j<2dw%;rEYMq z8m|&!S^DwsmVP$)A@nN6UU&LI#Ais2<2b8~NKksuNi~qjJ(flqe#y3je6k|xXF8Pd zDx?(V^Cxi?-|#riszd*LqIYwU+?3Jfij>bL3VvJezxq+Qo^KZWfzmedMat<&vZ{;p zrJd8xHx>Kg&&6|==M5OX4>`K^aqP2B3ZKiE!%dWLXWxbBQ#LDCe!836M`j9E&BP%? zEQA zD=Z^M!YN`LP{@9cH9bLc{}l!r(&EL(oi1AxVPaCFR&!B^P@Rt%a!?412rNMIa<6)< z{*79$_UD>Vuw;a&3FMvWr}o#=A1@jIq$cYUZmL=QA?1l1EymE= zrXJ7glo|Y23I#310~cD^+HPUv*C={jq*|v&`k(znw?Wj#L3%0q^_M~YNie>M(Cn?b^~WgVY5#@zVp&vz)&st-4JBwfs1rB>WIu43+Iam_8SYkf`wtdZD~L z`iIy};|W`nxHy#d&1IJV{G74JO(U;dg7KX~>BtaZKSP9OAJA@o;QQJR17C3hDecmfv%t$M2bF+QtP^ zNi5|7&52s`E2&|%@~VlZYusV_6dG15fi96kf}UuS#urjZ1iD0NAq<^i^)gV1HSZ|Q znI%{y^YP9uMOYRpuK-U`@u(8j^3oGDKlT739(C2;)|w?Rd^(_h$9I=v2r*=TErg*4 zTe=Js5;*H3^1gZozBvnA5i=6RI@_qcXDyMf@8eg}74ZOZXYh@SI~v1q!2m!VzWGM+ zEQ(hDoT;atJ!pqSIE3=~T@mLNO`G21zjxn`8EnU|Bm#Gf2e8u!Zo2vb(4aILtt^Tz zyN1H^Rw3k}YcSpuq~_(PY1sH0!K$4IKq!-(c?&2gTgLoVSKyfva82;xa1wDU|8_qO z&p%48GVmz_L-sCz7z;>S?_vy%M)?+(G4Hl=yt7MFe%8P9Dpe1aBf8qKq@c*F5C}9H zyXFg8_U@wL)n}P~$>l6qbw$RB!c7PG_{JX+X{ z4f}y41C&UPo$bxSXjTgJ~Xsy#0f$n95p!MY^Y2NZ-#tHqU3z_z#8?c@9V-B|rx-hr>0eSc!t)Fc|G}K@j z0_k#V1mKa9T+^WHzIDWVf*IRSKYtaTg~v_~yG!d-326P`Exd;Nd$S6z*hX7|Pu1CBtXrYdV~YzTqZkTkvgBz82Cv29@Kazx?iT9Mgcz!69^)+afl zvnvXL(b>j<4X+G2dETjK;W*jPmGQ23*;i{#sv8&y56cqk4=KQug0>IeV%E9e%h=Yp z;21izMjj?{w$>c;?}69aaPgH_w!3bdA^}1v5So#EN<#P6_lXBPGfwQEw}3>yzA?wi zdePY;g#m_t%7{f$A}}?y3~?n|g)?v*ozmAH|MjObK;=(kq{=yIC_!k?u8i#rpMS)2 zjRsO~0pHyDWQq;Ag&_o?>dXvq67fl43#h{-z+bwEE(b;$7nMM?wmM^*M0XI;Pm>$K zhBKBBaj6R&tvUbgfsB56#iA7DnhwFPQ0grZC|gE7{jY}X;B>ZS{2ys)I;i~mU`hyh zB)Qt%4n)%^jeu!jx!FY}QzgJVeI}lg`RKYmBXUxN03DCwB;rVA4%#MIwPS#}Err1A zB9b!{EJM2T2D^kvRe}Kdr>{i!)6T;!LW9r(ZQE%lZ{PG@(&m^*LkI>kpyM1K|-}oxwFDi&s?;={a56=-LsKV*wE&mn;r=5fBckOl8 z)v)>2tB?n3$W_LKM}Y@IBVND$3jK|BcVSH}7}cS>_U&f#^*_Ms>BMiy5yk)0A!0jp z#O)N5*fJzjO#`nBQ+QuX7slCZxRLDkP!#dp3A6Off;_^uLri%nT)u+BrOTLh!YSm=nv)e_+kSf^ z;rHJlXBaQN6M^dHPLvb^pA?uv5_jT+-g}LXjjysxYitJ$pAY}+c>shO>c~ItWKRD5 z18D~hHy)tt{WqB+4?V0*R%k$JlA`1h0#gdST9DAm``po>ofyu(N&s?!c`GlYmFR=PC-&a zqyT(=q}P|xzV^>4#ap^?QiQvPLa#UIzJn8q;MjI%=R`{$)9$Y^aXJ5Jvp{b z_rBdj4xGF27)tK?Da#bKSdz^P|4YyBh0K;h`Q!XqqN_dWp(rUx`&l^%_! zWG4LP6AcMh)MX4)aLv-s06UKxc&7FvE8AUUPE9>i4w{8Izxa!AOwRF zsY!Z|5nI!3JLD`ojm0krerKJJgpw>gx?h#s2dyo3Flv&M$Vlx*|PCl;Hp71>F4j= zF)z=LB~x>PvqhgYC?PPkL({u&5{oCuFFPq?Kb1R$j*s4ku8wij1r0qBq)#5o3m#1? z%Rt~0l00S5`plzLK3G1a6nKw22|XIQgKi5+9XDnimjWy)$ukXtuRl-Si%(``fKfCP zXB;)bu-)No(5Dx24N2oaA0kv=o8ECUt*jqpvw=n#GL6HcU0Y8nklkqoQpL}I}1w|@LC zvL`sAWNkMHCv57v!!-1Sw>Z&wxw@*lz4PhCENcu+U(*;0Uo3uit!0000(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<)=5M`RCwC#+G~iEWfTYS-`HB_7S(oBvUbQY7l~tu%y&t zzb1ZOf#qmTF{wOP1Bo0?#2I-cHew!za&ycllEImIpJ#_#C#OK96IZ2RCmY`B#1uS& z=LS9rJFptJU~P>r&)}YvJUbZnx^PPT?!sao$rKqp4Xf~Ao@=YY$v7t^BI9v> zkoX&O!bATd(vNK=3>=8ZBENT3`SKY>l1jbkkMMf8*kaFOT^R!x;A6ZI_m$w7lu3LS zh4k&=T9kJxG&UD&q9)uNd4AaHn<5q#Td##LSrLq^a?D)JLoAE35kFd?8H0Nx&?l+f_-ij8Y9vq6(!dn-mNCNuG5ji@t zz^!-|Pv-iVQHHJMLTd-k!_{%Wu}Ih1Z0y38avs@h(50^zt$w33L zTYR`w0UBZKj6FzAy4J*K-DkwQ+1zAr{9H}1m5(`?kKb`X)RtyoH=d|O6exuca2RId zEF9buVX@QpIyKCDQ5j(i69HSQ)mr)~ljS!XEr7ktJIt;&r=3TkQxj zA#Lo5HfTXKtLh~(JsQMz$%)dqP(m7c#@LOA)Gm$}T_dX_8!d_j-PS-7U*aao+2Pu> zjOI_a506I(-57D3)`?XgUXuuT=i+50gtmG^DUenY-wZ#Etj>vk85!xfhj>|YJ^`dd+m+M_r|`Zr_mEHL}u(uHDg4^i2Of@{4)TT WU&sEBduajy000000001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000quNkl#A$qsB7<{iG`02U%B`D zpLgc+f#r9jtH0+z$M?(`=H8h*^FH(T4`%v*POkyHYI+UeRnuz#ubN&1crwZA-zSoy z{v}e!PhJ01dS(DMPX{Rqy%7EHA-)pq636CmtEhS`%d$Fp!p_xbG5Z`6c$V9G`1D73 zF+V=erFg;lr_tjJzy`fk{tFdS6eHjNQBtSP^!U-7WX>K21(gr3mt4MGcH?%*)%?=y z=6196`rV4#d`kt~imz(!CYy+X=LcYvO$MWaX5>9@>Q#x}Ob;E(X8~T84YE;>xu5SH z?3CrwHP<&h*EcN3$J~czd-vSl2EfE8{PSw!o6yVW1VA5G@5z-4mqb{&WFI2BJ#iZG zZLB2G@dZ<_Al*jZVsae{tUMgq%rh_UR4gJ2s!ELL%-7G%b*Ig-Xd~rSO#T!EsaB z&EvN+JEXgH+2Iws%PS<;JvhfBIL9qG+pB$+Q~zBZOLZmu^Xfgt7=-aN0|0K$r93tv zhxtvh>^P4F&XI!VvNkhZ-&t0vGhmInca_5Mo^D;%6`0O1G3^aivYRSfE#xf{nlVK( zW!E1)-O*#BM~7wZp_%T%J3KmOdjddcu20+a#u?W)Vh6Jj$RKDtI_Tit-Or;!P zzuGBvh^yUmu_kh%W%q?FY=Ot{Rb~Kup^8M+nY(*T*^crLlDvr-lbO7Q0fUliY20FI zN@Kg1*R~zt>>B0d`+-Zx^_pt6LG$b3QL zmhO-OXIn-lvWP^Bu1T7Zc-Ns{1AuvV5FZ+8P;gw?Vhz?!TdkBW7D|dnPSq$InfwDa zV+u2+OVOV-wj1p1GT6~$h->E!o}qc}owMCTay|c;>2T=YUNC@L7dyiN;PF(!Kig+H zKLUWW_Edrj2?+oI3z}`!Es1p{08((g>yXu40%oNb@rWzWzV6_j?mI*j-Y8?{7s=7_0T|I_7JH6}FBGxrD&jSG9i(ubVkB#9+8$^IJ$d!1U{m)OK zV9#U3!cqkQl0er)DFOiI3khIK_y;1+y;6KZNv$QPGF&{kC(Xg#pG%^7Sw{=5{?)h< z!qG&qpZBIPq%>(cC4(^B-+^x00ud=Tj2qx1Qx?` zyr{`c>m@*pnT=dJdHffD8#YiX=RgBb(diZJd3Xd{s1HV{Mm7L(?M*wKLR7*go z=N$8_#%Sal!ep+jGlA)h`bydxN?JWAk}2Cksk}=oNt>bDrE-o3SxA~@;HOPs39#m% z#oi%1$qaD)9kN||?PyzAp~WYlU(53&^I9NQV2TNzon%csPbW$uLWja#{gwV!Jhk;u9vm~8;qZa*md_^Tc6F{|tKUQ)YfqFw*5!oT=o z`_T)4As1gVotm!f3NU3hgfS?a8M&s-l4%qCl4RJ*3|q*bZd*~$<{c*hP*o_~t5c3g zXpSd@aQyBe#I=@N8`AY>aRAx|zD2gpwRX*mnzqq8v<0IW(_`b-h0WTa(b%>nmKD_V zcwprURQD~NOf5s_w;N#U37i!c0x4_!83H1I97BnbdsVIzMuj?=Huu2q3uOI>}h zZ#6E_l3yF2;jG&tGK0|grcuj1hpb{9;)F~Pp@GdJBA#{q%lpH+9U05C-$+Wj6@@VJ zr`3T>`8#nh;sXgGlVvWf-73xx00ft40tvDs7_@j4jj5bjyO#8h(QQgIoII;s&o^AZ zWjuAZGGlw`sLu-Ca4)p+DQxHmoC3)Mo8~$@|21`*4`ROKm`i~BVAgF33tylKPtbIn zXW2Euamd$oA{VmG^Q4FbDQu~C@6V1+lz#eHb840bDsD=qYc_7SP=4xWIyFtXutd4E z64{Xu3#Aw-3}Io+8i&9<&yZ~7ry{*mF^BKl910t?xNqZYu=QVM?Kg<|kI?v!VIHn;PLR4Uh7jxrE47DkSJTB2MS}Fj#O=%P_g5lsMLvSGoU63JbbQMX$pFB|Qd{mD{Np1c229z;~47 z|2}i?V-pHvfKytQaun-DG}wFcDj7hRMeD{oADh7T$4dJ?Vt3bQNCF3WekNB^B$f^2 zMymjjE~Q$MYMq%m`pB?=bUUPU!sVMAOad5S)&Ut!8H}=Ycr0yKef?@8fJcDA0P?{y zX#W!cXnaRXKBG0wZ8}b8T@p`RxQ+F~&z4l^9izWyVY4$nX>cS~0FZ7hwIBdzX4C%Q zo}WmkiWb69!9#q8sl&AWwhwmV7Or_j~|j zxO`RCYRf0ZX)Wvv8@H$lU{x(&02s~uV;E_XTZ{45{Z{^VpNbEP+Y|`pz>hc93Yq+4 zY@I`~>_9BrGfujc!~vXN$^js|B&?_tm>a~G-%R7_#f2^q4785UaOP`t*DVNj2HmcTKmHW0ARS}H;#FFd5y9e z_H9XNIXFYfCaSiGNn2RwX?YXs1AtJWbMr0W^^K=zfN!osJa^KbAO}j>9&a3g@$_^| zZNHKHW`-Tu1>b}r8zmc!VZK2b4oB}EBrim6w1MyA4cH3);6vkv-dLlK5fBhsfV*2v)0lM?6*^o!6a#h)7W>cGieR_-<7USuX!gfi5P&#K{=B=#nGCyCRITb zkD@hhQDE!OBO1jx!~uQN7T?zP8_ayhNWP;b-%psEyZi8FBmb)7*(eAA&_~Tq)dVFi z{;GOjF+WxUl?WZ;in&cSx zxu*S0mzXu?bXwSP)T|U1kn~RUkY7HR_Qq-e;Pe~{w8ZXa$(ZY=WI2#aO}4~9#4=cj zaVrP#%NGK`d;5A)=*{u2DFKu+la74=X)~liW$%5?S5{Rag6Qj-e^tVxn#`@(&4L$O z_F2Jtt(1DNU?B_41&vT43*w>ZAb*j9GEgPr<>q7PxyPONI?h-q%yy-Kd{> zlMM(7a2P@Y0DvPXnS-l=p3qvIPW)acV2B`KypfM=w171gDJt3nX0Ma%*D>c|%yk@d zAH&?nSbEoLH?8rzUkfh;*uo2SpS%f1Y#F%#358>?DPP94JvO(2DT8Z#+8gqYR=9X7 z%0LCjO$YiY2cwk31C>LAXnbn2kN^NYqC&8T8a4oXwQw#SJrNJIQB4x5MEqBfQjz_e zTHBT|X!H*nlMy2qf)^TL(Q*uP332MnA{IC3v-oZSW&b2TUKV$r@I7)nWOc~)EF%!A z6Gz1-o0J>If>XwdTO?^Z6j#QT@?jDzV8B&K1t3yrvjn&eRHdS&(c|Q?!VV+|q3##K_Xr$mc7MVm-sLN2bwVN~W%M^S_K3a_~PlKUK zKrwytkLbv}7H{ti=)L_dv|c;jdV6P3c&_i(Xvuq zagnZ|Sg$SC6{$_H#hY?N85S`(d!vD@UhFGA;_UKhAb#`WRgO8#8Te0&;^%dX4slZ8 z9Q4d*a_o}4{ikn9p$SyQhsKjYfFxuAaH6fu`Wav0`uQ0T0eIxGN;3Q^G4;sg!$cCG zMe4Sqz!RkIt3Ff_#==Xk&HY!und!q5vWCTHq3<^{ZEem;ygza2x2V}^4pA#094MG= zzh#ks+O+p)`cDx&CAg`%+Y{-b<5UKO%c@DL`+DZzMjyWqI)fjBG5r&U56a5*SAW%B z%r7b^p`sMtT~+s99a!ss~x z2ofAVLgx2mF(B|?^^$+|g6Y2k@V^n~UuCxj*TOVkFufE2|CjWF0aRW5OS$YP(u)J| zQZ)QO(@R#NmyhbT4ZLc44d7MNYXGmBUITcwWHS8^WiW!0h;Ok&00000NkvXXu0mjf D$PlZ| literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/reply1.ebay.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/reply1.ebay.com.png new file mode 100755 index 0000000000000000000000000000000000000000..b38920ca3eaf7547f9388e0d244257b19a67d3a4 GIT binary patch literal 4621 zcmV+o67ubdP)00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000quNkl#A$qsB7<{iG`02U%B`D zpLgc+f#r9jtH0+z$M?(`=H8h*^FH(T4`%v*POkyHYI+UeRnuz#ubN&1crwZA-zSoy z{v}e!PhJ01dS(DMPX{Rqy%7EHA-)pq636CmtEhS`%d$Fp!p_xbG5Z`6c$V9G`1D73 zF+V=erFg;lr_tjJzy`fk{tFdS6eHjNQBtSP^!U-7WX>K21(gr3mt4MGcH?%*)%?=y z=6196`rV4#d`kt~imz(!CYy+X=LcYvO$MWaX5>9@>Q#x}Ob;E(X8~T84YE;>xu5SH z?3CrwHP<&h*EcN3$J~czd-vSl2EfE8{PSw!o6yVW1VA5G@5z-4mqb{&WFI2BJ#iZG zZLB2G@dZ<_Al*jZVsae{tUMgq%rh_UR4gJ2s!ELL%-7G%b*Ig-Xd~rSO#T!EsaB z&EvN+JEXgH+2Iws%PS<;JvhfBIL9qG+pB$+Q~zBZOLZmu^Xfgt7=-aN0|0K$r93tv zhxtvh>^P4F&XI!VvNkhZ-&t0vGhmInca_5Mo^D;%6`0O1G3^aivYRSfE#xf{nlVK( zW!E1)-O*#BM~7wZp_%T%J3KmOdjddcu20+a#u?W)Vh6Jj$RKDtI_Tit-Or;!P zzuGBvh^yUmu_kh%W%q?FY=Ot{Rb~Kup^8M+nY(*T*^crLlDvr-lbO7Q0fUliY20FI zN@Kg1*R~zt>>B0d`+-Zx^_pt6LG$b3QL zmhO-OXIn-lvWP^Bu1T7Zc-Ns{1AuvV5FZ+8P;gw?Vhz?!TdkBW7D|dnPSq$InfwDa zV+u2+OVOV-wj1p1GT6~$h->E!o}qc}owMCTay|c;>2T=YUNC@L7dyiN;PF(!Kig+H zKLUWW_Edrj2?+oI3z}`!Es1p{08((g>yXu40%oNb@rWzWzV6_j?mI*j-Y8?{7s=7_0T|I_7JH6}FBGxrD&jSG9i(ubVkB#9+8$^IJ$d!1U{m)OK zV9#U3!cqkQl0er)DFOiI3khIK_y;1+y;6KZNv$QPGF&{kC(Xg#pG%^7Sw{=5{?)h< z!qG&qpZBIPq%>(cC4(^B-+^x00ud=Tj2qx1Qx?` zyr{`c>m@*pnT=dJdHffD8#YiX=RgBb(diZJd3Xd{s1HV{Mm7L(?M*wKLR7*go z=N$8_#%Sal!ep+jGlA)h`bydxN?JWAk}2Cksk}=oNt>bDrE-o3SxA~@;HOPs39#m% z#oi%1$qaD)9kN||?PyzAp~WYlU(53&^I9NQV2TNzon%csPbW$uLWja#{gwV!Jhk;u9vm~8;qZa*md_^Tc6F{|tKUQ)YfqFw*5!oT=o z`_T)4As1gVotm!f3NU3hgfS?a8M&s-l4%qCl4RJ*3|q*bZd*~$<{c*hP*o_~t5c3g zXpSd@aQyBe#I=@N8`AY>aRAx|zD2gpwRX*mnzqq8v<0IW(_`b-h0WTa(b%>nmKD_V zcwprURQD~NOf5s_w;N#U37i!c0x4_!83H1I97BnbdsVIzMuj?=Huu2q3uOI>}h zZ#6E_l3yF2;jG&tGK0|grcuj1hpb{9;)F~Pp@GdJBA#{q%lpH+9U05C-$+Wj6@@VJ zr`3T>`8#nh;sXgGlVvWf-73xx00ft40tvDs7_@j4jj5bjyO#8h(QQgIoII;s&o^AZ zWjuAZGGlw`sLu-Ca4)p+DQxHmoC3)Mo8~$@|21`*4`ROKm`i~BVAgF33tylKPtbIn zXW2Euamd$oA{VmG^Q4FbDQu~C@6V1+lz#eHb840bDsD=qYc_7SP=4xWIyFtXutd4E z64{Xu3#Aw-3}Io+8i&9<&yZ~7ry{*mF^BKl910t?xNqZYu=QVM?Kg<|kI?v!VIHn;PLR4Uh7jxrE47DkSJTB2MS}Fj#O=%P_g5lsMLvSGoU63JbbQMX$pFB|Qd{mD{Np1c229z;~47 z|2}i?V-pHvfKytQaun-DG}wFcDj7hRMeD{oADh7T$4dJ?Vt3bQNCF3WekNB^B$f^2 zMymjjE~Q$MYMq%m`pB?=bUUPU!sVMAOad5S)&Ut!8H}=Ycr0yKef?@8fJcDA0P?{y zX#W!cXnaRXKBG0wZ8}b8T@p`RxQ+F~&z4l^9izWyVY4$nX>cS~0FZ7hwIBdzX4C%Q zo}WmkiWb69!9#q8sl&AWwhwmV7Or_j~|j zxO`RCYRf0ZX)Wvv8@H$lU{x(&02s~uV;E_XTZ{45{Z{^VpNbEP+Y|`pz>hc93Yq+4 zY@I`~>_9BrGfujc!~vXN$^js|B&?_tm>a~G-%R7_#f2^q4785UaOP`t*DVNj2HmcTKmHW0ARS}H;#FFd5y9e z_H9XNIXFYfCaSiGNn2RwX?YXs1AtJWbMr0W^^K=zfN!osJa^KbAO}j>9&a3g@$_^| zZNHKHW`-Tu1>b}r8zmc!VZK2b4oB}EBrim6w1MyA4cH3);6vkv-dLlK5fBhsfV*2v)0lM?6*^o!6a#h)7W>cGieR_-<7USuX!gfi5P&#K{=B=#nGCyCRITb zkD@hhQDE!OBO1jx!~uQN7T?zP8_ayhNWP;b-%psEyZi8FBmb)7*(eAA&_~Tq)dVFi z{;GOjF+WxUl?WZ;in&cSx zxu*S0mzXu?bXwSP)T|U1kn~RUkY7HR_Qq-e;Pe~{w8ZXa$(ZY=WI2#aO}4~9#4=cj zaVrP#%NGK`d;5A)=*{u2DFKu+la74=X)~liW$%5?S5{Rag6Qj-e^tVxn#`@(&4L$O z_F2Jtt(1DNU?B_41&vT43*w>ZAb*j9GEgPr<>q7PxyPONI?h-q%yy-Kd{> zlMM(7a2P@Y0DvPXnS-l=p3qvIPW)acV2B`KypfM=w171gDJt3nX0Ma%*D>c|%yk@d zAH&?nSbEoLH?8rzUkfh;*uo2SpS%f1Y#F%#358>?DPP94JvO(2DT8Z#+8gqYR=9X7 z%0LCjO$YiY2cwk31C>LAXnbn2kN^NYqC&8T8a4oXwQw#SJrNJIQB4x5MEqBfQjz_e zTHBT|X!H*nlMy2qf)^TL(Q*uP332MnA{IC3v-oZSW&b2TUKV$r@I7)nWOc~)EF%!A z6Gz1-o0J>If>XwdTO?^Z6j#QT@?jDzV8B&K1t3yrvjn&eRHdS&(c|Q?!VV+|q3##K_Xr$mc7MVm-sLN2bwVN~W%M^S_K3a_~PlKUK zKrwytkLbv}7H{ti=)L_dv|c;jdV6P3c&_i(Xvuq zagnZ|Sg$SC6{$_H#hY?N85S`(d!vD@UhFGA;_UKhAb#`WRgO8#8Te0&;^%dX4slZ8 z9Q4d*a_o}4{ikn9p$SyQhsKjYfFxuAaH6fu`Wav0`uQ0T0eIxGN;3Q^G4;sg!$cCG zMe4Sqz!RkIt3Ff_#==Xk&HY!und!q5vWCTHq3<^{ZEem;ygza2x2V}^4pA#094MG= zzh#ks+O+p)`cDx&CAg`%+Y{-b<5UKO%c@DL`+DZzMjyWqI)fjBG5r&U56a5*SAW%B z%r7b^p`sMtT~+s99a!ss~x z2ofAVLgx2mF(B|?^^$+|g6Y2k@V^n~UuCxj*TOVkFufE2|CjWF0aRW5OS$YP(u)J| zQZ)QO(@R#NmyhbT4ZLc44d7MNYXGmBUITcwWHS8^WiW!0h;Ok&00000NkvXXu0mjf D$PlZ| literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/reply2.ebay.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/reply2.ebay.com.png new file mode 100755 index 0000000000000000000000000000000000000000..b38920ca3eaf7547f9388e0d244257b19a67d3a4 GIT binary patch literal 4621 zcmV+o67ubdP)00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000quNkl#A$qsB7<{iG`02U%B`D zpLgc+f#r9jtH0+z$M?(`=H8h*^FH(T4`%v*POkyHYI+UeRnuz#ubN&1crwZA-zSoy z{v}e!PhJ01dS(DMPX{Rqy%7EHA-)pq636CmtEhS`%d$Fp!p_xbG5Z`6c$V9G`1D73 zF+V=erFg;lr_tjJzy`fk{tFdS6eHjNQBtSP^!U-7WX>K21(gr3mt4MGcH?%*)%?=y z=6196`rV4#d`kt~imz(!CYy+X=LcYvO$MWaX5>9@>Q#x}Ob;E(X8~T84YE;>xu5SH z?3CrwHP<&h*EcN3$J~czd-vSl2EfE8{PSw!o6yVW1VA5G@5z-4mqb{&WFI2BJ#iZG zZLB2G@dZ<_Al*jZVsae{tUMgq%rh_UR4gJ2s!ELL%-7G%b*Ig-Xd~rSO#T!EsaB z&EvN+JEXgH+2Iws%PS<;JvhfBIL9qG+pB$+Q~zBZOLZmu^Xfgt7=-aN0|0K$r93tv zhxtvh>^P4F&XI!VvNkhZ-&t0vGhmInca_5Mo^D;%6`0O1G3^aivYRSfE#xf{nlVK( zW!E1)-O*#BM~7wZp_%T%J3KmOdjddcu20+a#u?W)Vh6Jj$RKDtI_Tit-Or;!P zzuGBvh^yUmu_kh%W%q?FY=Ot{Rb~Kup^8M+nY(*T*^crLlDvr-lbO7Q0fUliY20FI zN@Kg1*R~zt>>B0d`+-Zx^_pt6LG$b3QL zmhO-OXIn-lvWP^Bu1T7Zc-Ns{1AuvV5FZ+8P;gw?Vhz?!TdkBW7D|dnPSq$InfwDa zV+u2+OVOV-wj1p1GT6~$h->E!o}qc}owMCTay|c;>2T=YUNC@L7dyiN;PF(!Kig+H zKLUWW_Edrj2?+oI3z}`!Es1p{08((g>yXu40%oNb@rWzWzV6_j?mI*j-Y8?{7s=7_0T|I_7JH6}FBGxrD&jSG9i(ubVkB#9+8$^IJ$d!1U{m)OK zV9#U3!cqkQl0er)DFOiI3khIK_y;1+y;6KZNv$QPGF&{kC(Xg#pG%^7Sw{=5{?)h< z!qG&qpZBIPq%>(cC4(^B-+^x00ud=Tj2qx1Qx?` zyr{`c>m@*pnT=dJdHffD8#YiX=RgBb(diZJd3Xd{s1HV{Mm7L(?M*wKLR7*go z=N$8_#%Sal!ep+jGlA)h`bydxN?JWAk}2Cksk}=oNt>bDrE-o3SxA~@;HOPs39#m% z#oi%1$qaD)9kN||?PyzAp~WYlU(53&^I9NQV2TNzon%csPbW$uLWja#{gwV!Jhk;u9vm~8;qZa*md_^Tc6F{|tKUQ)YfqFw*5!oT=o z`_T)4As1gVotm!f3NU3hgfS?a8M&s-l4%qCl4RJ*3|q*bZd*~$<{c*hP*o_~t5c3g zXpSd@aQyBe#I=@N8`AY>aRAx|zD2gpwRX*mnzqq8v<0IW(_`b-h0WTa(b%>nmKD_V zcwprURQD~NOf5s_w;N#U37i!c0x4_!83H1I97BnbdsVIzMuj?=Huu2q3uOI>}h zZ#6E_l3yF2;jG&tGK0|grcuj1hpb{9;)F~Pp@GdJBA#{q%lpH+9U05C-$+Wj6@@VJ zr`3T>`8#nh;sXgGlVvWf-73xx00ft40tvDs7_@j4jj5bjyO#8h(QQgIoII;s&o^AZ zWjuAZGGlw`sLu-Ca4)p+DQxHmoC3)Mo8~$@|21`*4`ROKm`i~BVAgF33tylKPtbIn zXW2Euamd$oA{VmG^Q4FbDQu~C@6V1+lz#eHb840bDsD=qYc_7SP=4xWIyFtXutd4E z64{Xu3#Aw-3}Io+8i&9<&yZ~7ry{*mF^BKl910t?xNqZYu=QVM?Kg<|kI?v!VIHn;PLR4Uh7jxrE47DkSJTB2MS}Fj#O=%P_g5lsMLvSGoU63JbbQMX$pFB|Qd{mD{Np1c229z;~47 z|2}i?V-pHvfKytQaun-DG}wFcDj7hRMeD{oADh7T$4dJ?Vt3bQNCF3WekNB^B$f^2 zMymjjE~Q$MYMq%m`pB?=bUUPU!sVMAOad5S)&Ut!8H}=Ycr0yKef?@8fJcDA0P?{y zX#W!cXnaRXKBG0wZ8}b8T@p`RxQ+F~&z4l^9izWyVY4$nX>cS~0FZ7hwIBdzX4C%Q zo}WmkiWb69!9#q8sl&AWwhwmV7Or_j~|j zxO`RCYRf0ZX)Wvv8@H$lU{x(&02s~uV;E_XTZ{45{Z{^VpNbEP+Y|`pz>hc93Yq+4 zY@I`~>_9BrGfujc!~vXN$^js|B&?_tm>a~G-%R7_#f2^q4785UaOP`t*DVNj2HmcTKmHW0ARS}H;#FFd5y9e z_H9XNIXFYfCaSiGNn2RwX?YXs1AtJWbMr0W^^K=zfN!osJa^KbAO}j>9&a3g@$_^| zZNHKHW`-Tu1>b}r8zmc!VZK2b4oB}EBrim6w1MyA4cH3);6vkv-dLlK5fBhsfV*2v)0lM?6*^o!6a#h)7W>cGieR_-<7USuX!gfi5P&#K{=B=#nGCyCRITb zkD@hhQDE!OBO1jx!~uQN7T?zP8_ayhNWP;b-%psEyZi8FBmb)7*(eAA&_~Tq)dVFi z{;GOjF+WxUl?WZ;in&cSx zxu*S0mzXu?bXwSP)T|U1kn~RUkY7HR_Qq-e;Pe~{w8ZXa$(ZY=WI2#aO}4~9#4=cj zaVrP#%NGK`d;5A)=*{u2DFKu+la74=X)~liW$%5?S5{Rag6Qj-e^tVxn#`@(&4L$O z_F2Jtt(1DNU?B_41&vT43*w>ZAb*j9GEgPr<>q7PxyPONI?h-q%yy-Kd{> zlMM(7a2P@Y0DvPXnS-l=p3qvIPW)acV2B`KypfM=w171gDJt3nX0Ma%*D>c|%yk@d zAH&?nSbEoLH?8rzUkfh;*uo2SpS%f1Y#F%#358>?DPP94JvO(2DT8Z#+8gqYR=9X7 z%0LCjO$YiY2cwk31C>LAXnbn2kN^NYqC&8T8a4oXwQw#SJrNJIQB4x5MEqBfQjz_e zTHBT|X!H*nlMy2qf)^TL(Q*uP332MnA{IC3v-oZSW&b2TUKV$r@I7)nWOc~)EF%!A z6Gz1-o0J>If>XwdTO?^Z6j#QT@?jDzV8B&K1t3yrvjn&eRHdS&(c|Q?!VV+|q3##K_Xr$mc7MVm-sLN2bwVN~W%M^S_K3a_~PlKUK zKrwytkLbv}7H{ti=)L_dv|c;jdV6P3c&_i(Xvuq zagnZ|Sg$SC6{$_H#hY?N85S`(d!vD@UhFGA;_UKhAb#`WRgO8#8Te0&;^%dX4slZ8 z9Q4d*a_o}4{ikn9p$SyQhsKjYfFxuAaH6fu`Wav0`uQ0T0eIxGN;3Q^G4;sg!$cCG zMe4Sqz!RkIt3Ff_#==Xk&HY!und!q5vWCTHq3<^{ZEem;ygza2x2V}^4pA#094MG= zzh#ks+O+p)`cDx&CAg`%+Y{-b<5UKO%c@DL`+DZzMjyWqI)fjBG5r&U56a5*SAW%B z%r7b^p`sMtT~+s99a!ss~x z2ofAVLgx2mF(B|?^^$+|g6Y2k@V^n~UuCxj*TOVkFufE2|CjWF0aRW5OS$YP(u)J| zQZ)QO(@R#NmyhbT4ZLc44d7MNYXGmBUITcwWHS8^WiW!0h;Ok&00000NkvXXu0mjf D$PlZ| literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/reply3.ebay.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/reply3.ebay.com.png new file mode 100755 index 0000000000000000000000000000000000000000..b38920ca3eaf7547f9388e0d244257b19a67d3a4 GIT binary patch literal 4621 zcmV+o67ubdP)00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000quNkl#A$qsB7<{iG`02U%B`D zpLgc+f#r9jtH0+z$M?(`=H8h*^FH(T4`%v*POkyHYI+UeRnuz#ubN&1crwZA-zSoy z{v}e!PhJ01dS(DMPX{Rqy%7EHA-)pq636CmtEhS`%d$Fp!p_xbG5Z`6c$V9G`1D73 zF+V=erFg;lr_tjJzy`fk{tFdS6eHjNQBtSP^!U-7WX>K21(gr3mt4MGcH?%*)%?=y z=6196`rV4#d`kt~imz(!CYy+X=LcYvO$MWaX5>9@>Q#x}Ob;E(X8~T84YE;>xu5SH z?3CrwHP<&h*EcN3$J~czd-vSl2EfE8{PSw!o6yVW1VA5G@5z-4mqb{&WFI2BJ#iZG zZLB2G@dZ<_Al*jZVsae{tUMgq%rh_UR4gJ2s!ELL%-7G%b*Ig-Xd~rSO#T!EsaB z&EvN+JEXgH+2Iws%PS<;JvhfBIL9qG+pB$+Q~zBZOLZmu^Xfgt7=-aN0|0K$r93tv zhxtvh>^P4F&XI!VvNkhZ-&t0vGhmInca_5Mo^D;%6`0O1G3^aivYRSfE#xf{nlVK( zW!E1)-O*#BM~7wZp_%T%J3KmOdjddcu20+a#u?W)Vh6Jj$RKDtI_Tit-Or;!P zzuGBvh^yUmu_kh%W%q?FY=Ot{Rb~Kup^8M+nY(*T*^crLlDvr-lbO7Q0fUliY20FI zN@Kg1*R~zt>>B0d`+-Zx^_pt6LG$b3QL zmhO-OXIn-lvWP^Bu1T7Zc-Ns{1AuvV5FZ+8P;gw?Vhz?!TdkBW7D|dnPSq$InfwDa zV+u2+OVOV-wj1p1GT6~$h->E!o}qc}owMCTay|c;>2T=YUNC@L7dyiN;PF(!Kig+H zKLUWW_Edrj2?+oI3z}`!Es1p{08((g>yXu40%oNb@rWzWzV6_j?mI*j-Y8?{7s=7_0T|I_7JH6}FBGxrD&jSG9i(ubVkB#9+8$^IJ$d!1U{m)OK zV9#U3!cqkQl0er)DFOiI3khIK_y;1+y;6KZNv$QPGF&{kC(Xg#pG%^7Sw{=5{?)h< z!qG&qpZBIPq%>(cC4(^B-+^x00ud=Tj2qx1Qx?` zyr{`c>m@*pnT=dJdHffD8#YiX=RgBb(diZJd3Xd{s1HV{Mm7L(?M*wKLR7*go z=N$8_#%Sal!ep+jGlA)h`bydxN?JWAk}2Cksk}=oNt>bDrE-o3SxA~@;HOPs39#m% z#oi%1$qaD)9kN||?PyzAp~WYlU(53&^I9NQV2TNzon%csPbW$uLWja#{gwV!Jhk;u9vm~8;qZa*md_^Tc6F{|tKUQ)YfqFw*5!oT=o z`_T)4As1gVotm!f3NU3hgfS?a8M&s-l4%qCl4RJ*3|q*bZd*~$<{c*hP*o_~t5c3g zXpSd@aQyBe#I=@N8`AY>aRAx|zD2gpwRX*mnzqq8v<0IW(_`b-h0WTa(b%>nmKD_V zcwprURQD~NOf5s_w;N#U37i!c0x4_!83H1I97BnbdsVIzMuj?=Huu2q3uOI>}h zZ#6E_l3yF2;jG&tGK0|grcuj1hpb{9;)F~Pp@GdJBA#{q%lpH+9U05C-$+Wj6@@VJ zr`3T>`8#nh;sXgGlVvWf-73xx00ft40tvDs7_@j4jj5bjyO#8h(QQgIoII;s&o^AZ zWjuAZGGlw`sLu-Ca4)p+DQxHmoC3)Mo8~$@|21`*4`ROKm`i~BVAgF33tylKPtbIn zXW2Euamd$oA{VmG^Q4FbDQu~C@6V1+lz#eHb840bDsD=qYc_7SP=4xWIyFtXutd4E z64{Xu3#Aw-3}Io+8i&9<&yZ~7ry{*mF^BKl910t?xNqZYu=QVM?Kg<|kI?v!VIHn;PLR4Uh7jxrE47DkSJTB2MS}Fj#O=%P_g5lsMLvSGoU63JbbQMX$pFB|Qd{mD{Np1c229z;~47 z|2}i?V-pHvfKytQaun-DG}wFcDj7hRMeD{oADh7T$4dJ?Vt3bQNCF3WekNB^B$f^2 zMymjjE~Q$MYMq%m`pB?=bUUPU!sVMAOad5S)&Ut!8H}=Ycr0yKef?@8fJcDA0P?{y zX#W!cXnaRXKBG0wZ8}b8T@p`RxQ+F~&z4l^9izWyVY4$nX>cS~0FZ7hwIBdzX4C%Q zo}WmkiWb69!9#q8sl&AWwhwmV7Or_j~|j zxO`RCYRf0ZX)Wvv8@H$lU{x(&02s~uV;E_XTZ{45{Z{^VpNbEP+Y|`pz>hc93Yq+4 zY@I`~>_9BrGfujc!~vXN$^js|B&?_tm>a~G-%R7_#f2^q4785UaOP`t*DVNj2HmcTKmHW0ARS}H;#FFd5y9e z_H9XNIXFYfCaSiGNn2RwX?YXs1AtJWbMr0W^^K=zfN!osJa^KbAO}j>9&a3g@$_^| zZNHKHW`-Tu1>b}r8zmc!VZK2b4oB}EBrim6w1MyA4cH3);6vkv-dLlK5fBhsfV*2v)0lM?6*^o!6a#h)7W>cGieR_-<7USuX!gfi5P&#K{=B=#nGCyCRITb zkD@hhQDE!OBO1jx!~uQN7T?zP8_ayhNWP;b-%psEyZi8FBmb)7*(eAA&_~Tq)dVFi z{;GOjF+WxUl?WZ;in&cSx zxu*S0mzXu?bXwSP)T|U1kn~RUkY7HR_Qq-e;Pe~{w8ZXa$(ZY=WI2#aO}4~9#4=cj zaVrP#%NGK`d;5A)=*{u2DFKu+la74=X)~liW$%5?S5{Rag6Qj-e^tVxn#`@(&4L$O z_F2Jtt(1DNU?B_41&vT43*w>ZAb*j9GEgPr<>q7PxyPONI?h-q%yy-Kd{> zlMM(7a2P@Y0DvPXnS-l=p3qvIPW)acV2B`KypfM=w171gDJt3nX0Ma%*D>c|%yk@d zAH&?nSbEoLH?8rzUkfh;*uo2SpS%f1Y#F%#358>?DPP94JvO(2DT8Z#+8gqYR=9X7 z%0LCjO$YiY2cwk31C>LAXnbn2kN^NYqC&8T8a4oXwQw#SJrNJIQB4x5MEqBfQjz_e zTHBT|X!H*nlMy2qf)^TL(Q*uP332MnA{IC3v-oZSW&b2TUKV$r@I7)nWOc~)EF%!A z6Gz1-o0J>If>XwdTO?^Z6j#QT@?jDzV8B&K1t3yrvjn&eRHdS&(c|Q?!VV+|q3##K_Xr$mc7MVm-sLN2bwVN~W%M^S_K3a_~PlKUK zKrwytkLbv}7H{ti=)L_dv|c;jdV6P3c&_i(Xvuq zagnZ|Sg$SC6{$_H#hY?N85S`(d!vD@UhFGA;_UKhAb#`WRgO8#8Te0&;^%dX4slZ8 z9Q4d*a_o}4{ikn9p$SyQhsKjYfFxuAaH6fu`Wav0`uQ0T0eIxGN;3Q^G4;sg!$cCG zMe4Sqz!RkIt3Ff_#==Xk&HY!und!q5vWCTHq3<^{ZEem;ygza2x2V}^4pA#094MG= zzh#ks+O+p)`cDx&CAg`%+Y{-b<5UKO%c@DL`+DZzMjyWqI)fjBG5r&U56a5*SAW%B z%r7b^p`sMtT~+s99a!ss~x z2ofAVLgx2mF(B|?^^$+|g6Y2k@V^n~UuCxj*TOVkFufE2|CjWF0aRW5OS$YP(u)J| zQZ)QO(@R#NmyhbT4ZLc44d7MNYXGmBUITcwWHS8^WiW!0h;Ok&00000NkvXXu0mjf D$PlZ| literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/skype.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/skype.com.png new file mode 100755 index 0000000000000000000000000000000000000000..881b13cf887002f5c0fd336ee506baa1681d6a63 GIT binary patch literal 3435 zcmV-x4V3bUP)XKz-}@WWBZm89N87J~?&lTW`dVos3SWB{0BB03aUl64|A#^^a_w zx}(%TTbv!u#4l`vX0W)}I@~LIp>EmO!8mCF9Ei+JKz-BT*1%#QVkgHZe({$tPdzx5 z*g_9n1T|f}9Y6>%66V0!A}oy-%oM&G5{_vwqSQo%4Z2Ge9e~yHeE3L4gP;B7uUSFn@uwKi;1H z!H%|;md-2$70B6zH((j5>W)qxzj^<{NTp9*W_+7Y)MO8#K+F`ZzPm8>jq3_m_YY-8 z16eC1}x|V(E;H^))e?D|Lc4knr`A!PJ0H^Zf z<0pPN-KtT+%s_yAGhILh-HNWDpvg=UW?qFeq35nw_?07%#*&^5S!AS&__Xp5C+hIM zh*A)%jiyNxhzbHp50c>G3IPOAfx?Lx!PTOS6t{q|@$)a#fuDTtl3&R}qTm`klX{lL z&b@Tv*!BCWRW}G^=QDGtz>M(FShlz6rR8XAi*_X{z+`H#&D)__KU^_*gA;Yq#3aPT zO4JkI87kbhdnmKuRy#mM2w>0Dd=(u+Pn<_pBCwR5CB18V@uL?Mc9)~pL{^`KGj$%A z_CFY@KXjr#S_z0n)(E9Qs_+}{Ib6B4fB2gIiyFw5c3B7^v2f2zkKXsnDf z4bb!UErq|mylqE00zhLRh=zrTKp{>65dbIV{nw7v{_aTCawV^ptwJ+gTRi^wt=mea z9@3U*KmmbelarUjVxgVex|!MCL&Zn-cI+s-)H4eVgnr_-L1U~|d6r#HEMbD<@YEYOJvB=z>;Eu}lQEIfR4L6cP; zKtf`FY9jup7pq^qG6X0|5s5$muD9zooZd={o2pC%^xWN(T-zN7=AKU#IaRX{J~j3H z=@d&L8S%j3`FHgu-@LA4S4WfvIu#?c!1wnj4-Z#`+H42+y^;DK?VK;Smdz-Dl7Q3Q zor93b&Y~>=V7#&`idBt-zyJ~X)^PRt(Ry4IjT_x1qOm-4rhfa+rjA!b5-G_B*yi^ppn!2KlXZLcbp7aDCc1dIW}O6_KRVGrGU;;Uk%$`291YDOTEC>A5m7m^T+XQDI17#-rf z2u68SBN9d?HY1HS%A=aqR6$6DSEtj5PSieiaod8o7$O1{WWfZ|ndqK^+p{70{UKCR zJ2ad9_hk0-vHBBd(qGJFP!)%B(g#F5ef#Ozc5F0IqD4~)wOT6z#TmGk!2l2f!RHRl z?COZG?J1bi8*{3GAQ%YdE88Nuwx@7yPvJ9{w2fB%gKt#7^77nxHAr;U=qlF>eW6y% zeNJ`x13Vf@M6<;t6l1k;+fT>-{*}3Euq4vhsZ)^512iY1B7w+)<$a*!{%mLY$y@t& zZHSqLvq$jxjs`Rm0$u*He0OI#6Ddw6Q@dyX$8pi|(oo@%sjgxAYhHbS0%&LtuVuP9zvVw7K-9 zwrH#xWF7qwphZ%c=c6~4W< z=hHjdEe(+_&ona71V|EL#{W2317wLq^S67Ad?jjN|tAZt&1r z9*3@6s00FU>@5V7S{71IZ~WR-U03xN{X&Rk6|V?rB*Du%mupwX?p-Cd=s1(nrqoaY^LnW?~uL@FfPV|{RM?@(8qEd(wb3oX#s z!iO$u`;D!wM$1V~MXH${oKDd++{&SYwB$hT47g}p0x@uB*QO8j1LkG5stLl$f1aw% zXF*krbRyokqceW|{eyR3S{`gs0YQrd7nP$gU$f!C8+wZ>AY{?7_KnqFoleC`Q*}um z-h^mmq95?fWjB&hq3x4fl1D}=Y1%F;f?Ffh$>E9mH(r_j!tM=q9{{R|58TokJ@D?n z(W-xSHcO2yk?ib9Itz|QW6mj5K`{RHOH&MVDxnz#H6kxEcn@+hmKOnOqBr$zx^v_3 z_lCtq3@ZXJk{aR52POwg?o&e@G|P-C@J50IB{$Hr{4(eK4KNrIClLAUbK_5rR5jM7 zm=_rShL|>+Wxz4&Eu2^D~kJGP6%VefkT}k4LSy7Jl#P(_ejYN+U5ld$yPFploebtSP&Zq-a#H+<)lUAHM9=Vy-60 zMre`Qj_$%IwzuE0rS+0>;@q078URD!k=gW-ElNIP3b) zPE=+6$EM8*L#DsBt@^LmZ;VSlO$y)&7|`9}aR{nidR83@U+DRZM9BG_(RU;a? z(D@PNs-j2|es@z;EOhy0PF#If0S!9P-~YfBrMoW>Lu7%j@vLG^9U&Ojb)Lhz*LA4C zyuYn~{JBHSx{EQ-5SwV{XiLX?Q?OQmQxVaSh1&dNrTWHH<@FlgsM^@fTs>S~W+KOV!+XLYu2 zE4c&!XvJ8rEc3Sp_09|1`g?mrlqd}=RQ?uVVJS6{ywD6~fY0btnk{85A|mPlOwCnZ z9IHG(9S+X;v6)JqS#`FzzM~vpUB;gNa(`Eu#a2ROHKw-=s|miwpTj0iKnp`{}181XC+POwi*Bc N002ovPDHLkV1ju=ilqPm literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/steampowered.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/steampowered.com.png new file mode 100755 index 0000000000000000000000000000000000000000..de610701022a85be849724c38117e764de40ca5a GIT binary patch literal 2697 zcmV;43U>90P)U^x*L z0k{J|DgYfoD}YZJWBVCn2P2V)ex*A9CkRj!g%ME+5k1Zro5&agV8V3J@4FN82h0`N!9`SXK=gLEnV()9@9i^Ab> zC;-YCW3wemf-K7;M3STtVj+kTQNAQesh7)y8=3%{&GvHu_sOyho6R;VcylzfA~r*G zUBAn2x3`AF;kvPG+^}09B_$<)U|`@4S(ceB%ix?3ue96k4iy&{AIr(fX%RxO`uh5` zx88ayHxvrlbzO&5qS0uNqA2%ucXwZiXXl0_AUivob$54f(==^CY^u+iHS5&&?c3k< z`FuS9qQ(@txw+Z<=%bI89zT9O(+J!o0E(i#+}YV#7SGld6TmsY6Tln*=>Q@CK4Xmi zUDx%NFB@O~P$Y?)s;J}M+x4RucH-G^n20H+6M@NTm;lhO* z+uGVDSP5`Coq@aWzI)kw@4Ywbc;uIJMwaEzz@Itivtlc*Au{KDHDl~gs;Z6)37a=><~QGb^Q~sk zW>Eux*|TTY0%!_{!{<5YeT*@UF{W|Odxa3K0Gj5^nNtg3xF{MU%gxQr+PHD!sEi+z z0GG?92qCs`&b?;9@s1$FNG^b%jRyfaIXRq&T%3<|O$dRcq@?D?#>OsHRU@(UBuNT) zbaY%$Rkg+J2Y`!20B~nzWsM?09?KC`RlgmLMzgIev1G}TPuHwj^RcFB($=k8zwzOR zA5P|+L)Uc(A-p9h0M)pXw4;G8^pazb5QU3jdyAAImZSXI>t zLWmKaB4Z3085x?_>*WB%WeHfibSV!8gNx6cIWxS<%a<=dwrkg}HvohIuoWv-oVfSi zd)FU7emv7K!utFBf9dgfR`&Gt415U=SX*1$1nVD663WZV7xnk|A02Drv17-mzP^4@ zECB#SW@ctfOUvkb9d`?ql$6+-nwlnCSO1Ym9ytV{8New3r&LuvS6W(n#QF??EM3=s zarH4@L}zCwtEs8U0YuK>gr~WHMgRoqHzEI{VU9jG3EB#Z$F)$p5B*| zk}|3-j!VGYxpNhp%_doU?r1dHrD?Nz&PiKMx!fLRsG=? zC7`;xdh&@AC-O}KtovCAAqN71Ke*lQ@7wKmyE#WyRhP%(`9Vud%N8QyR?-0A!3Q5a z3?OW`+pmlOkH;hD=H{NWrqPxyTjrOSm-l36XKU%{>4WdS`)+8*jvey=43lJ%Ktzu# zit>!jW>c;v_>7E<2^AF;zagR#ExL6z0oWsv$WMh3H8z`Vx6Nkz3laS@5{dj6fMSwm z!teLDty#0?kfv#a9*<`f0i*5$9UUFa<#O43dwXv=c<|soCJATHo}F~`=+WtZzdtf@ z;>2lHRaH;7x3}MECBTGHyzU~RC5*9F&iR>G$6{f(+rJqKg?>*&U$gf2v9Rc|0q}9o zeP+)P=e8(bdF7Q?r%s*v@4>;r4v)tZjnx;o6C4;AaEHU;=>-J^FSWO~r^GQn>PiY= zIPHv60lKc6EB84O9RTnNhU!Q!02hE;8Dn=a#uhNfrdp3%Ns>nBwx+d3?+9P4#4*O` z*=L`vdhD^s_6Q+Pg~Q=ahr==A1h^Cds@-nC?fv)PFIu%~)dpSHZKknUqt^4<>SU~p zl>xEaC-!P<)os-uj{q}xyWOt6@WKmKrKP2Z0i20MA}xxdXz}dFtpTzuM~JAasHo_8 zWo6~7KA*448vK<6VwKpSE+_Hc_*nH@+uRtvV(HSQpBz4X_@&a)(jx$xbzN_hBx%gv zVa&^ruIno2{1yO{dV70)J9qA!v3Kv@=_gN~OjcD@pFVwhdqF`#b6#HFxwN#j3yPvd z`uqDG!C)}Cwzf9oop;`u76=4<)&drfKqDxzV8Mb0zu(_eTU(nI30QdnU z15j}>YXpX_qo$bpWDFH3xw^VK>$&HiTUb+5lWh&c{LC1Gq9~E7s;cruixvd{h)5(N zZ`iQmfy&CtS+SWwL{wZ{{I7NE*450IF{6bsMur~(LpRhAfGz-S06K|ikaK>?>U+uS zFcC2T3IGoPF95gkoeYD6hC~b}B;$7nfF$F2=WDOMcF$8!J@uWz!NF0-;zJKTbhxan ztP(@376st!?d_d7Wy+LiG))`6U~$g%va+(ul9G~-F?0loQzOU5$}gSd%n*RCCyHf`GZ;^N}9eSLkyL780| zfPk*+?Es>TF{j(@4yC1~oo{Sx%rrA#{rdI)C@Cp93ZNap1pxg<@VX&UWBwJt62GP( zB1S|C5hW8*4iU}YyLazTl9H0@T`pIH%jIftI-LyFJ!zco0W&W8K%zyD1lx+@xudURbM*TAm} ziB)O~7zr6rA&;oby&)*S}6gnbzW0QBm=`;^N}Jb#-;MCMPG4 zYl>gDG!jBEB1+<%Pdaqy(6^Q?Ted;hbvd@d0x(?p8Dl6cEc|rezJ0&aH0_kb;piD} zzb^YuaNG=WPDB(UqSnH~!eiUEZF`e*9tB1>SmyVt0DM z_25ytAxGrRNh@>&!{=?8G0h|UTjI%QeDqI3Of@s%7ULI}nf zb71J-+c#mTUr;c#C8HSX=sE$k5mC3fRjviTva{4U$IXVxg^L83U0n!(#uyv3j~@@* z5X}S;aa=6O1V9*FXaWf&kU#*`5Dik00udUMf)N!WFI5v0^~uDT;FB-Lzd+yRP2-bb ze5t<@iJEAF(F7!bu!5JVefiwZB3Zw{-geM@`Dgd@5y#z>j4W#pc zR0UEMNL3)|Dv*{yN`e5^*Pp}m)bcDc9(fcsJq4F8F5TDmT`>D6>ddKlhM5dz^LAuy z2iTc#1n4h5L64qZmIS!3ypA3nLI3#u(tXu8!sIyiNAJfJc#YIIB5mz>`-YHBTalHk z7AHY9If44^{PN)H+6-KoTo!*admTM<^{#xWv2$?d6zbAA-hmhJ2KFG$t#=~e9&a~q zppPGe!YxEwc!N(tHkUjV&?6_XvN@!=1@qY8!V)NDKx$VYt8)LeG6v=fsJTL=N6SVW z$CqHlwh2-fS+Nqd6_L!UkRV@8t>D~O`Y~64+3TqM4gVzk{1aAJFXrLRNH&KoM1Z$t z2h!Mb2YmAA3!|v9Un@J#<}h9Bk=1J|&(${tj>+`zL{?^_aX`!csPm(Xp7-`Xi)mk1 zs`=?D^y!o6Gbd3qS1UOoKZ`m$f;x2^8Q230x5eGp-mEm3oFMbzduYD|badgq_$uBL z`zr0u{Q^ga7Y(}j#@m>l4bkCy?Ayf?u=^Rj{+)mKefbjB@L{SBy$i*n&zQ#1qa&Ds z-GHFwHduoW-#Zg{NFcRH%!3%dO!I2oeM1z7UItyc*ws^4(7#_OUvGy-N`wevHs|0= z;5d=4ojdqev<#GQu}12f@CKhIbL0abhXuHqFWcF&qzw4qYZV6Ri(}EX{Q9+E67-9~ zaWHE;{UZ?p6~-sq#G!HGKu^yQ5@=597DxFU_rZo!#Xa z0}-Gi@l$*R*qF~G9)!`28i7a)2(CzF-H8xX- zT(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<)=5M`RCwC#+G~iEWfTYS-`HB_7S(oBvUbQY7l~tu%y&t zzb1ZOf#qmTF{wOP1Bo0?#2I-cHew!za&ycllEImIpJ#_#C#OK96IZ2RCmY`B#1uS& z=LS9rJFptJU~P>r&)}YvJUbZnx^PPT?!sao$rKqp4Xf~Ao@=YY$v7t^BI9v> zkoX&O!bATd(vNK=3>=8ZBENT3`SKY>l1jbkkMMf8*kaFOT^R!x;A6ZI_m$w7lu3LS zh4k&=T9kJxG&UD&q9)uNd4AaHn<5q#Td##LSrLq^a?D)JLoAE35kFd?8H0Nx&?l+f_-ij8Y9vq6(!dn-mNCNuG5ji@t zz^!-|Pv-iVQHHJMLTd-k!_{%Wu}Ih1Z0y38avs@h(50^zt$w33L zTYR`w0UBZKj6FzAy4J*K-DkwQ+1zAr{9H}1m5(`?kKb`X)RtyoH=d|O6exuca2RId zEF9buVX@QpIyKCDQ5j(i69HSQ)mr)~ljS!XEr7ktJIt;&r=3TkQxj zA#Lo5HfTXKtLh~(JsQMz$%)dqP(m7c#@LOA)Gm$}T_dX_8!d_j-PS-7U*aao+2Pu> zjOI_a506I(-57D3)`?XgUXuuT=i+50gtmG^DUenY-wZ#Etj>vk85!xfhj>|YJ^`dd+m+M_r|`Zr_mEHL}u(uHDg4^i2Of@{4)TT WU&sEBduajy0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf2(?K>K~!i%?U`F_ zlvNPNeeuCJRJ$IcT-V7a2-IPH~^sK%a>bw{`~op zOeRg%om3PM6veGZjT$X0R;-Zb=4Jyxd)>Nq=}{u>?d=vf0M7>Jd7jOI`KAvSrQOld zksj4GDhddMCB}>yV{t)D;8L_}YHF;X-$jcSnH&aic0A3RHQVNr9FQ+qu)xL@8(&2O zK^a^LMhUEeBH?h@7$t`d8*cKEBS#wJeh?s$1DqJc5|bxSmXeYZS-*b0jp-^C4Fng! zolp>^Py%;@NCr;P^70DHa)6@kMWbegY#>tzJ2>lNf@_+`DU&I!hF_QyLPRu(N+3e zKwO-l05Rd{Uk8M=ic6rt;>C;8(*J?_<>>Q94e%v3e17 zJYs|-`}GsK>MHy7b4EUBkbNhH4U^cUNzyT4f<(ucrq+AzSz9|Yd$#Qt+pu2ZCr@?? zs8b+zYE!4$rpdvB^RnE0bEoVL86xcu+%J)P?=$exDN`i&{BshWHB-Eq)9ttQ_17f+ z<^nr3fHKA`nuqcN!Muq_CrWa_0MYbf%xU^Lm%{lNFjx;ju_vA|3nX89QR0ghN^FT* zedPzz_~klj`tDn4Q%^|Dn=4684CcZC6bJ-UdTZ8Xl#LG@7|4Zyacg9c%>a7%A&EZz zSjt^hX{-UD(CUw*VbeD$K+~p4BKTQBUwOAD_5ps$~P971^?*L7Wl*l7UD1yi{G~2 zq{a$*<)UEMA_Z!EV3F9+l9XBXMVQ>N!}=*|-uK^|jFSrr_Kd*O0tAMOSq zb2*fsGsj#G_lq4#{c*!j!NIP1oy9E3*@$1#r!K7TTOq}) z?_KL})b+zU*SQ>Vl-RW^rJ#=jfy8tI3lsu`ap9kTwi74!vpH!KA||5OUYh~Zx_`g4 zpU_)@5`XwcVfFw#2f@0I!gY0)B=W1ELC|7?uG@XyZm(2Ul`H zAd5YfdB6T*Z98Gz12^r^izZ;>Uwn~C4y}9lnk5*6+a)$^Fu9-pQ6Ovf#xk4K~b;|boR{-JE9T5I{ z30sX)#;xqx&=XxN9}ox&Sv98!Dsv-tWuT~FC;f(Qy;a(EGK#?zDk`l5(o$NQDqcD+ z14Q2ujRUSZ4G6`JOk{OLV}!OJ2sH&FMp|whXnc6=15#W1u*DF15Ic68$U%WXD2N0c zn}#$vjn%Y%AjsG#8%RUnzS5FDIRm0&GC;H-(r%pmxb^d@M8WJ}=O6&reB`irk+2n2 z=AeU1%YF)WEj_8m+ix?aSlAZl8wJupsL;pz^pO*qE&*cy+2xjd&)pJ9XB>bqj~gsR z`u$x`m)kT%x;5aqtWt|+vEPOcl{y|@EzNe@rNY-;dYS3dxXN~o=#nL)C#=*Q$2n523;wBXrUzphlt{l)`4vrsZ zfylR$S81G}2y%c`>FJ?F^__R5`nAnG#$iDoSoCMF0W+R;=x0v(rI(oer}NLVL+tXy z3gQ&^UVM=;3&Pg!eZK6y@PgCj+GaB+x8L+Q*PofEY-6?U=KI%iYdJY>7gxC`FA#2@ zoX`(vpDnx2J@>$whgAKm;Bp-g3@4wjjSjytP-aE_1GR9J~E?>i#a7 z1W~6zAcD63(@&)8<@r*sFEz((z)3m&S}XWhy?YnTKWKbp&u6{t_1Uj>&1& + + + + + + + {{ErrorTitle}} + + + +
+ {{ErrorHeader}} +
+
+
+
+ {{ErrorDesc}} +
+
+ +
+ + \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Error.html b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Error.html new file mode 100755 index 00000000..50d5719b --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Error.html @@ -0,0 +1,56 @@ + + + + + + + + {{ErrorTitle}} + + + +
+ {{ErrorHeader}} +
+
+
+
+ {{ErrorDesc}} +
+
+
+
+ {{BackLink}} +
+
+ + \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Index.html b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Index.html new file mode 100755 index 00000000..e13fe479 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Index.html @@ -0,0 +1,30 @@ + + + + + + + + + + + + + {{BaseContentSecurityPolicy}} + + {{BaseAppFaviconPngLinkTag}} + {{BaseAppFaviconTouchLinkTag}} + + + + + +
+
+ + + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Social.html b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Social.html new file mode 100755 index 00000000..2aac940f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Social.html @@ -0,0 +1,20 @@ + + + + {{RefreshMeta}} + + + + + + + + + + {{Script}} + + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Themes/template.less b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Themes/template.less new file mode 100755 index 00000000..b4ebb2ab --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Themes/template.less @@ -0,0 +1,357 @@ + +// mixins +++ +.thm-linear-gradient-mixin(@start, @end) when (iscolor(@start)) and (iscolor(@end)) { + background-color: mix(@start, @end, 60%) !important; + background-image: -moz-linear-gradient(top, @start, @end) !important; // FF 3.6+ + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@start), to(@end)) !important; // Safari 4+, Chrome 2+ + background-image: -webkit-linear-gradient(top, @start, @end) !important; // Safari 5.1+, Chrome 10+ + background-image: -o-linear-gradient(top, @start, @end !important); // Opera 11.10 + background-image: linear-gradient(to bottom, @start, @end) !important; // Standard, IE10 + background-repeat: repeat-x !important; + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start),argb(@end))) !important; // IE9 and down +} + +.thm-border-radius(@radius) when (ispixel(@radius)) { + -webkit-border-radius: @radius !important; + -moz-border-radius: @radius !important; + border-radius: @radius !important; +} + +.thm-box-shadow(@shadow) { + -webkit-box-shadow: @shadow !important; + -moz-box-shadow: @shadow !important; + box-shadow: @shadow !important; +} +.thm-body-background-image(@value) when (isstring(@value)) { + background-image: url("@{base}@{value}") !important; +} +.thm-body-background-image(@value) when not (isstring(@value)) { + background-image: @value !important; +} +.thm-rgba-background-color(@simple, @rgba) when (@rgba = false) { + background-color: @simple !important; +} +.thm-rgba-background-color(@simple, @rgba) when not (@rgba = false) { + background-color: @simple !important; + background-color: @rgba !important; +} +// --- mixins + +.thm-body { + color: @main-color; + background-color: @main-background-color; + background-size: @main-background-size; + .thm-body-background-image(@main-background-image); +} + +.thm-loading { + color: @loading-color !important; + text-shadow: @loading-text-shadow !important; + + .e-spinner .e-bounce { + background-color: @loading-color !important; + } +} + +.thm-login-desc .desc { + color: @loading-color !important; + text-shadow: @loading-text-shadow !important; +} + +.thm-login { + border: @login-border !important; + .thm-rgba-background-color(@login-background-color, @login-rgba-background-color); + .thm-linear-gradient-mixin(@login-gradient-start, @login-gradient-end); + .thm-border-radius(@login-border-radius); + .thm-box-shadow(@login-box-shadow); + + &.submitting-pane.submitting { + &:before{ + background: @spinner-background; + .thm-border-radius(@login-border-radius); + } + &:after{ + border-top-color: @spinner-color; + } + } +} + +.thm-login-text { + color: @login-color !important; + + .legend, .e-checkbox-icon, .g-ui-link, .social-button, .language-button { + color: @login-color !important; + } +} + +.thm-powered, .thm-mobile-switcher { + color: @powered-color; + a { + color: @powered-color; + &:hover { + color: lighten(@powered-color, 20%); + } + } +} + +.thm-languages { + color: @languages-color; + .flag-name { + color: @languages-color; + border-color: @languages-color; + } +} + +.g-ui-menu { + color: @dropdown-menu-color !important; + background-color: @dropdown-menu-background-color !important; +} + +.g-ui-menu .e-item > .e-link { + color: @dropdown-menu-color !important; + background-color: @dropdown-menu-background-color !important; + + > i { + color: @dropdown-menu-color !important; + } +} + +.g-ui-menu .e-item.selected > .e-link { + background-color: @dropdown-menu-selected-background-color !important; +} + +.g-ui-menu .e-item > .e-link:hover, .g-ui-menu .e-item > .e-link:focus { + color: @dropdown-menu-hover-color !important; + background-color: @dropdown-menu-hover-background-color !important; + + > i { + color: @dropdown-menu-hover-color !important; + } +} + +.g-ui-menu .e-item.disabled > .e-link, .g-ui-menu .e-item.disabled > .e-link:hover { + color: @dropdown-menu-disabled-color !important; + background-color: @dropdown-menu-background-color !important; + + > i { + color: @dropdown-menu-disabled-color !important; + } +} + +.thm-message-list-top-toolbar, .thm-message-list-bottom-toolbar { + .thm-rgba-background-color(@message-list-toolbar-background-color, @message-list-toolbar-rgba-background-color); + .thm-linear-gradient-mixin(@message-list-toolbar-gradient-start, @message-list-toolbar-gradient-end); +} + +.thm-folders .e-link { + + color: @folders-disabled-color !important; + + &.selectable { + color: @folders-color !important; + } + + &.selectable:hover { + color: @folders-hover-color !important; + .thm-rgba-background-color(@folders-hover-background-color, @folders-hover-rgba-background-color); + } + + &.selectable.selected { + color: @folders-selected-color !important; + .thm-rgba-background-color(@folders-selected-background-color, @folders-selected-rgba-background-color); + } + + &.focused { + color: @folders-focused-color !important; + .thm-rgba-background-color(@folders-focused-background-color, @folders-focused-rgba-background-color); + } + + &.selectable.droppableHover { + color: @folders-drop-color !important; + .thm-rgba-background-color(@folders-drop-background-color, @folders-drop-rgba-background-color); + } +} + +.thm-settings-menu .e-item { + + .e-link { + color: @settings-menu-disabled-color !important; + } + + &.selectable .e-link { + color: @settings-menu-color !important; + } + + &.selectable:hover .e-link { + .thm-rgba-background-color(@settings-menu-hover-background-color, @settings-menu-hover-rgba-background-color); + color: @settings-menu-hover-color !important; + } + + &.selectable.selected .e-link { + .thm-rgba-background-color(@settings-menu-selected-background-color, @settings-menu-selected-rgba-background-color); + color: @settings-menu-selected-color !important; + } +} + +.thm-message-view-background-color { + .thm-rgba-background-color(@message-background-color, @message-rgba-background-color); +} + +#rl-app{ + display: block; +} + +html.no-css { + + margin: 0; + padding: 0; + font-family: Arial, Verdana, Geneva, sans-serif; + + body { + margin: 0; + padding: 0; + } + + #rl-loading, #rl-loading-error { + position: absolute; + font-size: 30px; + line-height: 130%; + top: 50%; + width: 100%; + height: 65px; + margin: 0; + margin-top: -60px; + background-color: transparent; + text-align: center; + color: #333; + } + + .progressjs-container { + display: none; + } + + .thm-body { + color: #333; + background-color: #aaa; + background-image: none; + } + + .thm-loading { + color: #333 !important; + text-shadow: none !important; + + .e-spinner .e-bounce { + display: none !important; + } + } + + .thm-login-desc .desc { + color: #333 !important; + text-shadow: none !important; + } +} + +// glass style +html.glass { + + @glass-color: #fff !important; + @glass-p-color: #aaa !important; + @glass-error-color: #f76260 !important; + @glass-m-color: rgba(255, 255, 255, .8) !important; + + .thm-login { + background: none !important; + background: rgba(0, 0, 0, .5) !important; + box-shadow: none !important; + + border: none !important; + border: 1px solid rgba(255, 255, 255, .2) !important; + + .controls { + .input-append .add-on i { + color: @glass-m-color; + text-shadow: none !important; + outline: none !important; + box-shadow: none !important; + } + + input { + border: 1px solid none !important; + background: none !important; + outline: none !important; + text-shadow: none !important; + box-shadow: none !important; + + color: @glass-color; + border-color: @glass-m-color; + + &::-webkit-input-placeholder { + color: @glass-color; + text-shadow: none !important; + } + &::-moz-placeholder { + color: @glass-color; + text-shadow: none !important; + } + &:-moz-placeholder { + color: @glass-color; + text-shadow: none !important; + } + &:-ms-input-placeholder { + color: @glass-color; + text-shadow: none !important; + } + &:input-placeholder { + color: @glass-color; + text-shadow: none !important; + } + &:placeholder { + color: @glass-color; + text-shadow: none !important; + } + + &:focus, &:hover { + border-color: @glass-color; + } + } + .btn { + border: 1px solid none !important; + background: none !important; + outline: none !important; + text-shadow: none !important; + box-shadow: none !important; + + color: @glass-color; + border-color: @glass-m-color; + + text-transform: uppercase; + font-size: 13px; + + &:hover, &:active{ + border-color: @glass-color; + } + } + + &.error { + .input-append .add-on i { + color: @glass-error-color; + } + + input { + color: @glass-error-color; + border-color: @glass-error-color; + } + } + } + } + + .thm-login-text { + color: @glass-m-color; + text-shadow: none !important; + + .legend, .e-checkbox-icon, .g-ui-link, .social-button, .language-button { + color: @glass-m-color; + text-shadow: none !important; + } + } +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Themes/values.less b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Themes/values.less new file mode 100755 index 00000000..32043ece --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Themes/values.less @@ -0,0 +1,69 @@ + +// MAIN +@main-color: #333; +@main-background-color: #e3e3e3; +@main-background-image: none; // "images/background.png" +@main-background-size: inherit; + +// LOADING +@loading-color: #000; // #ddd +@loading-text-shadow: none; // 0px 1px 0px rgba(0, 0, 0, 0.5); + +// LOGIN +@login-color: #555; +@login-background-color: #eee; +@login-rgba-background-color: false; // rgba(0,0,0,0.7) +@login-box-shadow: none; // 0px 2px 10px rgba(0,0,0,0.5) +@login-border: 1px solid #ccc; +@login-border-radius: 7px; +@login-gradient-start: none; // #f4f4f4 +@login-gradient-end: none; // #dfdfdf +@powered-color: #333; +@languages-color: #333; + +@spinner-background: rgba(0,0,0,.3); +@spinner-color: #fff; + +// MENU +@dropdown-menu-color: #333; +@dropdown-menu-background-color: #fff; +@dropdown-menu-hover-background-color: #444; +@dropdown-menu-hover-color: #eee; +@dropdown-menu-disabled-color: #999; +@dropdown-menu-selected-background-color: #eee; + +// FOLDERS +@folders-color: #333; +@folders-disabled-color: #666; +@folders-selected-color: #eee; +@folders-selected-background-color: #333; +@folders-selected-rgba-background-color: false; +@folders-focused-color: #eee; +@folders-focused-background-color: #333; +@folders-focused-rgba-background-color: false; +@folders-hover-color: #eee; +@folders-hover-background-color: #333; +@folders-hover-rgba-background-color: false; +@folders-drop-color: #eee; +@folders-drop-background-color: #333; +@folders-drop-rgba-background-color: false; + +// SETTINGS +@settings-menu-color: #333; +@settings-menu-disabled-color: #666; +@settings-menu-selected-color: #eee; +@settings-menu-selected-background-color: #333; +@settings-menu-selected-rgba-background-color: false; +@settings-menu-hover-color: #eee; +@settings-menu-hover-background-color: #333; +@settings-menu-hover-rgba-background-color: false; + +// MESSAGE LIST +@message-list-toolbar-background-color: #eee; +@message-list-toolbar-rgba-background-color: false; +@message-list-toolbar-gradient-start: none; // #f4f4f4 +@message-list-toolbar-gradient-end: none; // #dfdfdf + +// MESSAGE +@message-background-color: #fff; +@message-rgba-background-color: false; diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminLogin.html b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminLogin.html new file mode 100755 index 00000000..db784c2a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminLogin.html @@ -0,0 +1,50 @@ + \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsThemes.html b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsThemes.html new file mode 100755 index 00000000..cc86478e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsThemes.html @@ -0,0 +1,44 @@ +
+
+
+ +    +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ + + +     + +
+ +
+
+
\ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SystemDropDown.html b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SystemDropDown.html new file mode 100755 index 00000000..ec7e2d41 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SystemDropDown.html @@ -0,0 +1,101 @@ +
+
+
+ +
+
+
+
+
+
+
+ +
+ +
+ +
+ +
+
+
\ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/check.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/check.php new file mode 100755 index 00000000..b389b812 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/check.php @@ -0,0 +1,42 @@ + function_exists('curl_init'), + 'iconv' => function_exists('iconv'), + 'json' => function_exists('json_decode'), + 'DateTime' => class_exists('DateTime') && class_exists('DateTimeZone'), + 'libxml' => function_exists('libxml_use_internal_errors'), + 'dom' => class_exists('DOMDocument'), + 'Zlib' => function_exists('gzopen') || function_exists('gzopen64'), + 'PCRE' => function_exists('preg_replace'), + 'SPL' => function_exists('spl_autoload_register') + ); + + if (version_compare(PHP_VERSION, '5.4.0', '<')) + { + echo '

'; + echo '[301] Your PHP version ('.PHP_VERSION.') is lower than the minimal required 5.4.0!'; + echo '

'; + exit(301); + } + + if (in_array(false, $aRequirements)) + { + echo '

'; + echo '[302] The following PHP extensions are not available in your PHP configuration!'; + echo '

    '; + + foreach ($aRequirements as $sKey => $bValue) + { + if (!$bValue) + { + echo '
  • '.$sKey.'
  • '; + } + } + + echo '
'; + exit(302); + } + } diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/include.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/include.php new file mode 100755 index 00000000..5b51731d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/include.php @@ -0,0 +1,234 @@ + 'localhost' !== $sClearedSiteName? 'imap.'.$sClearedSiteName : $sClearedSiteName, +// 'IMAP_PORT' => '993', +// 'SMTP_HOST' => 'localhost' !== $sClearedSiteName? 'smtp.'.$sClearedSiteName : $sClearedSiteName, +// 'SMTP_PORT' => '465' +// ))); +// } +// +// unset($sConfigTemplate); +// } + + unset($aFiles, $sFile, $sNewFileName, $sNewFile); + } + } + } + + unset($sSalt, $sData, $sInstalled, $sPrivateDataFolderInternalName); + } + + include APP_VERSION_ROOT_PATH.'app/handle.php'; + + if (defined('RAINLOOP_EXIT_ON_END') && RAINLOOP_EXIT_ON_END) + { + exit(0); + } + } diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/index.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/index.php new file mode 100755 index 00000000..e69de29b diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/index.php.root b/copper-server/core/rainloop/app/rainloop/v/1.12.0/index.php.root new file mode 100755 index 00000000..91bc1257 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/index.php.root @@ -0,0 +1,19 @@ +uS?sB&YJIOH^?kF&1iOgZGdmnmz))8{a1 zmIX?_q7nf^m2)?XFv?2q(TW+m($Fy7y1_(yQwCiX^l*2V&dgk-rN~SF;fLabq<{hE z-`gEq>RWg`4#FX6ntSDDg#m{1|8Ux5{X%*%HL z>O0{d9*dnf+ce{r*#pix13lYx{oDH7MpeD|Uk5`Z!|j_zuXdDfynR37r(CX_!Iy?} zTRAhG`rMZPK)=ymInkllq)q9#$4_;bS>ZjDuhpJ)L@h>M7-nZ~nBAz&E(S_`%R7c@xuc*9L`N+7(25A`>FE%Vol zup9X@3%5^VD%G|lTT7{?Q*zF)@bUnuKoxnGK}P(OL&NOZ#j0!~lbbaF#ZWFpzwd5u zDpiwk7-8uC0kvFKhWT6p@_qD--V>4CX=?H_jx@cNC2ALn#n4gJD+h%i1F2#ftwDJhGKpnu% z+`IP5Myd^~0{E@F4BfX%ptQaUq;_JQ0wGhfz!95B8b-6N7@}F=|}Q8B58CetO0J|zp{Dj(y3-dQI^|X#&Tr=MwAUdRY>}iZ4Z8o^9px! zLyY|%Xdz9GTu{j7^u*eUt8>ydu&(50ek7CSc7;Dc5i*g z>V$8bSfef>*TCeF#S;c!HTADOZt@0_l0B}ZIt@e6bJ%V!YjDKeOB+tE){I9kL(l4CdS%X5o?O$aHRJUT(~76t zT~I)Eyj&CCyjeEa)u-z-mD7ibb6L`B;raGx^*LJU(eeK93b-rvOq#b3OM#wQ zLi$TD=_ECx>vJ;mms(TXwxauguOTEt3cI1tXm@J;qgiz)pXt)Sb^)kJ!(#R`8O<-< z#MT}AY)Z>vKk3onS(4w}AKJ5Lx_jl6ODCK<0EJx@Xf+TP&}+^oMt`2LY6X-)M#Cd2 zVU;GTzbESOZv2aAuA?3jJEvSDIT1Qo zwl#0j=_qbqE~P^5hX`tnahSskr{etsRRYd$(8GS&(?$4A-i&iAt-5BR=66&yb6U*C zYb@uXMxf}N$$@EFiJ(_ZMEIzE7im_^0y_68XUO^?QYlZPvdFE~a1H}<2aUP`Bb|wd zaBz+eB|{hC;ZakP0iodjqqN7$&tVpR{gtg1asv)yu9gRPj|%UX^dYo2_%~r_?`>bI z@%dh*XdCqmrWSWVf4<)&dIroQWLI;ItHb}J%!Wmx%@fy?iVqlSRc1Hk=2q!~GqoA4 zG{i8rRAe@2qHKuUh+Rh|W}B)v=dgmmHmNQ2l}LgR(CRDuCA5ZbeCl-q;n17Y)_+Jz)iLv8F~z4P?^T2w zPw1f!WituWOb4J@b^Url%%rG1h~_wTViRt}f9TeAijchE%RjgHxz)k>|Nuc=U)Zlk#Q`l0!-&p7_QU~8{eMmTF91LCmqDk}z1I&MPA4MMs&uyLB z5f=m9l;HCO1Zy~6%D9^;DqH-|XcQ-}*_vSNatU1i{tUoO!c?#x?4CtvEJb+H(y0wX zUM&72r;(-!2Wdpd?hAQUko^xlzI=ST=P%zG$WP z+})ItQuQN>-rmMQ!ZF>pSh`@$U{H`llS0Tvv6a}5g$auHQcrq*W=T}RrnG@S?;f3H zdOiNC^zF~Y@gHxh&5z-z--iiSVqV z&mviGj$yEFBPVKKv8Ym2&3-2P2k3`(#YN^yH?j#TtU36p-^v!p;3>6LGpa+_Ss6Y@b%d=Pl7m1PjsjXIFN6Q(PPKy;Q3^jjyR`B`N*vv2UO~Y&x51NT&x0|pY znx_z5Td_JsxJL6d`m({tv8Yn5Z4aR@--rT6Id<6B2C-Ag`_$7ZX9)+^rHBJM%HF$A z44Tq)v7THE5uQT)DIYkhl~Vo9MHA+bE4?TWJr^_}*5PVGZH6QI_`owAvBXH(MiSEw zN2^F_M{YIk8;DEbKo6%2*H7nB(Y(@M5t7L%trgb~Oj^TsyYi5XJhk!GI2sz&*v@}| z$^8(~gHvVovxVi_f*v$*Qd{#}vvr?4(gV{d)JXrcSIKlA(pM{{QDL`K z1@R6oXYssZ+^9E_->60~w1Mhaqk(>zB-&U_hnoqZeXmc}4Y*m5%#qO`3SH0#38hri z_SNLbETu97*DdZFnO<$><UGqLC4V9hGNRZ}d1KQ0$xzIwR6bAC z{F^fER*_7g^OFL~!DuG_xw4Ob))pcOrzC3}6IIOH268J@$a`C0;jR3yyDA(ht&N1o^g9ynoPfNV3VAne`B^fq#wjpM zjlNvJTEi5g6VD_cxIok3qp^eW0N$l=Q=C=mUKw}r;k1yLdbwe&1T_`4g;>bxk*w(N z#E^$m&q%zZk%pA)N!Dqd289hJS9F0gc%CKJLyrR>K?1|H6%1PP*9F{I>(z)X(|ECy zoV>$orrEu6?Nv<+;8${m!j1#}gBVbNz5WG>CT}-y{6hU5R7$UzcOmU?l!VOzN_-@CQk0IZVkq?sse%WXNapI4dczu)TP`hIL;soMnQV`zNW5=>j%NL7_G@R4iyl0OiznwmvQ)}GeZL$D77}M-G@WsZ zuTjqkZ_NYRjtad%I6RiLCdecHfqH2=_Zt$6&TG`Ji{KcN&-#=nt zHC+KF#ERMD4I>5L>|x#SlX2gvujZ0lJ3VE;@@bKX0SoXbXvBZfWn6eC$rA<%bZ|oT?B-Jr3*|H~E zPOjFrYDw3JdOU#fj4Zl1njT*-CU(EZUQ|-4@S1}+o8osOCe%gE;-yD+7mgy&CNYVF zq1c8%+3EI`I2rudj~G6ukm9~w^J*@|eGTH2P-AghiMqG0`&^};|FG)ArX1lE?~HUo zicyj8tOrhQjKv?6H1@8Ps>|0qYA#3RX(Ti~IgTnC{|rs+N4}#dubB}fY~71PuZl*m zr-QrIoy)1%A4?~?ycBIN7!%o{MwL!QCM=Ef{>*t!)>;lLT<++9VACLg-J$MP_;Vmp zdVK8F0X<)#jeeEgFKN^8J$W0@QO$uQMJj9^9RH(oAy3`2VNh}5DGWAc1GLPpl*v6} zSU>(9bl&x4RpZgAFxZRMc~ zoE2QzulDv@P0IP$trnA2=#9`1vRm!BA}E579Fovdx{7tD%veX&pZ{%`fPgtZsPGm zU+`o3g8ni5y^4SEaDy%Qi}cmx9jcIZju_I@UDmjNlm{pj&){jGt`OlQ z7n)EbUlUQBe^)*maF_LRR!1hnir)ve*VEniWppKxbeOFcGY>k#qt^onp_t$Wy=fO9 zK__+7%IxqQrQ3z~X(J;_iELc@ip90VCd2R{AEIp!A*pLP(pdyo7n51T|3$lXH$k2X zS*WXN#Egl$$96=fT~C%ww*J&aNFT7kKDAvt?O z&>q)wJ_H5r^U8;e6pfhAPCle?lgAWqdW+4cmGa=dpi|8K!ty&iB-tGP!JBM?Xt;%p zS!*|7vPr+CKE{~spbIWk!ewA8IXri^rEqp0cXD-hQ0oV;5*3h_P+>n6>DNe2r--bERWqK8Rl`kVEsI}D{ zDB=A;k&VPuca7Wi*A3@9j7gilRrm>v`hqXN&caYd$3;T4;}&i%ew0gC;6hRNhZ^aN zmsYcB(O1Ds{5+;X30#)8g$M6xUMqdEXei{cR4Z}lWq7|X@(4Pw5>tv`_Ryp%nDC!g z_wQRO{CvyUIO+*~|F<#KwQYvp*gc(iFh`e;i|opT!wgFmdM-l$9*X8sa!-v7f%u>= zO^NzI_$WM!dxm{?iNBg}GS?V4ID?nMD8FCH9$Iu(48hI}a-mjCZp^^0J){)jW_bfK zSCf}XT`_RFw-p_sD0VvelHvU8GtI?ZWi{KpS6GobblO9(KbntsD0SJ}#sW=ZMhm%L>Cdt!AbK-~JT+)lVhQ0OD;L7X0ni zd2lrz(r?YQxqjirI8cku-`6CV=I_b+JGX@}zfVKFbk_=4z?+?jtF1?XQNwLaE1q{I zpPVuKs^3hQR@efH&RQ!~We}XfR)YRQ%t-uT;|} zZ$~L4t#hs|jDzfz@-hETNK&R;HQ!^Az6ty9!`l@m9Ljl*1#l?<8TH4Sj}RiE8O=Ia<`?w9Yd zA@}}!(*Mty|NoR;Rtgdiij#7$tG+$<^K`*0z@e5_yavAckmq>H`z57YL2A2vZKIVg zMH4%!)Uzk!zUa@JujYVqmWQBgWDBj!{I961d_iF=xzs667A1ZSfQ~@XqvYKo79(ax zlp$a<->DyS8K}$yS`WCF1@)EU0xOl8Au4>QDILV*-~h!Rz+`e|Ptl3VY+1Uu+vu3R z)ceQ_;#vI8GJ=InegHPEr*;oz|494TM#kNXF`9=C-(Ch~g?`z^gYhG#W#p?-!wqw7k5n2o-LI+dd*8hy&_3|ihP0fM^ z?J?cmTf!l@B<;SRQX`_smyGFbOAu)yo8Pbw5_>is@hLYABV4u|dy3q|Y&RZOJG{>D zmAtzYdY;y;Xqo53`5k1_mTs4u^m5@MxQ9wZM(({00{j&$`)t~zUtr++5kzah4p!|r zqNx(?HKLuq$|;p5@vovCSR!xm_E-v`@b9uRA3K=Lez#6Sr6m3z{%Do##LLoLQ*nRN z?C9I9@TPxrP1odv);vl$bXOcrs3d#Y5PA zL-ShJ7 z*;aGV<@2Cnacbl4mSM;bix6(A9i*18Ni;lK=n! literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/apple-touch-icon.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/apple-touch-icon.png new file mode 100755 index 0000000000000000000000000000000000000000..ce1dd1a886c906ec36cee1dec72b9df605886f02 GIT binary patch literal 832 zcmV-G1Hb%k7RCwC#n$brDK^(`2<+!Jah`6UC zB6^C5h=@4)4|jR5=a_ zzRF^}svNfv^ZdeBqWN>ez`6O3CP!Ob6K4KgljDGB{)*sTz z^!1_w(9GG-TyfDP!Xo{00A?<4KW=CfaL&!$~?mW93ud- z3_)ie1;GE|1Obpm2w~>A#vwlZ0OULT3;~cO2o&>Dvk;$t01|?#%xy-f#%wh&H3#uH z%$L{-A&Pnb^MGX;LLBpvWebE<%-aGXRr6^>@B+0UGRf&e7>ied9i0f84^6TZJ!A+9whO+(;!!F#YF;zg_o!^}%< zGkk06A@JD`#0GHz6bHf##J%YUURb+q4dR=rH)D8#QX6s=7zaZ2Kh67ZKWsPpMwF>h zmcl094*z1_Z=xoi4f_x)S#E};)g`u~9hP>B+z5nnM$H?8a7BP%`{qb22=eStDWm3x zg)jxNiZw*A)>t0*2B$?WvJ%!1$@}hbPqxO2d_LeA15oG_B85LARQOY3?wp_|o{0^U zHL<40a`3hPI3dTTW*ofXI!ef~!-ywEDQATr105Wd)|viX?ieA*mL>=98jTQg>=7rG z!(@x>@8onp!CAW{&f2af2c=}kUg0{JbIi%f$;rvd$*HLN6<`1!uF_d9==`$)0000< KMNUMnLSTX$7j)+U literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/browsers/chrome.gif b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/browsers/chrome.gif new file mode 100755 index 0000000000000000000000000000000000000000..10df50bcf288827531010e5f3d3e3d174788203f GIT binary patch literal 3803 zcmV<14kYnMNk%w1VMYK$0Qdg@v9hshl0BQu^<<4bsMGerIV5|7rwDh*jFN7}-}T3E zP)&3>&CsfqFeY$sSgcbz$H&S2_~RH>sE49w_vn`Y`@v_YEuEk~Eqb8%biuve_@XpE-XSnj!Idzywx@bzY$glIyix^4oHmvS|JN`}5s+ucTG(%(ci? zHR-vq0+ZxQP;^{&LyD+L%U4QThCi~yja7p{lBjjh-|TdnJNM|LW{ybP;?nfnSmUdg zgSzaTvWWlmq+)rvM`p1}RgY&*Lea``G)IY*tAz5`M^k}5q`G@BS~RGWZ-}K@enm9L zvq;izV*rKM9Z8#)n4N@(h82L&?9yo^c*Zw3IC+i5v&E8;tY_VjiTUiZTwPrJ@0NL< zJiW}0dzx!Djo0qYB`8&;`}EXOo8E1aSJHY>@XsFZ+k$eGV(#c}SX(=AtoK;+bX zxVXL|J&&EQcCw~n%Vj)TPe{f~Fnyh2tiXhCmORqk#-zMwZj?#r;F74gmjC&&eW5y@ zwpzlMf5^LH*uOV*h*t6S@Y#ZT+RTaM(L!8UPi>H4?8+we-g%pnjews|?9*C_zweZ< zT1-qi?zso)q-ACf=BDkBk|HDz%L-b zFCg&ICIA2bA^8LW00930EC2ui07d{q000R80RIUbNU)$mgR)3G(X~kok%te(xOwtp zn~sARGiuyeaGNeM9QYL|z@el`lOqcd+4Mse$Coe**3v~}BnL$$ao$wK(}&NWIu(g& z8M7$HTAM{6Rlfc z5)oMd(XSaCo}xv2b}wJQXh-%`#E%GxxEud830dIRj~+J)=ncCUtX{Hb&qf;y)eT(4 z1C_Ob6hN|q9z9s(jY`>aU#Lw1qb=KyNG;F;H5nSf#DS*=91uO(!&Elk*OQ}WX5Ejr zqQi)9En+gjff_Z`B0DV$Hn#W6eq-R=^=s$2ExH2 zGR?iF0F5`S@<0PvX88aLGx&&4USZKDUSIue@{%KT=)nXMOHS~D17$E14hr6Jz|ICY zD1apxU|5mJpL}BZ05mIp^-YQP~+ zF1bwM>=bLbkU^?g61u@2{apszQ%_`c3pRS_v4t>^ig4l=l|lf40*VydKqAR%um%+p zNKit(_)-yVB49LNEw+h{CGcLfVkCkeek5~55sM%J2{$Jo(FiSN_=3!xdcrHu8h6-R zLK+8z9P+&qP@#b*{jT!F28ft7WM4fTGz=Y|h$~1DMZECB00RWjNC4#!0s#xFysL%* zRFLuUJG@{3!_zRFF|q`A$z zkyJ)jd``$r1=(7xXZB6yVZ85fK&3Iq^hc@j`y9dTm!cl%NpSC_^OwMnHi+41xivFasQpah+p`!V> z8sHx*1kf~Il){DyNFxpf(1Km~4G2IWLlD%^4k=V%1bpDbEJ(o#W0+xDWgtgAPO%Or z{395C5C=A|Iouns$3fDhn&sY_!iODD7<2CcwGMS(ZZv~iIQ zZIDA4MFzmSdGdxhwB|?aP|!KXV-hlO!ZozI)o+4R3%?9&BOQ6s6gFaoTu?$PsvrR% z9N-LfAch$Wh|~kJaTgeXgfPk(EJ^@yWZh^2` z?AgzH$^|(XqY7jI!WeYRTLHGfZY|&iX8m@6&1Uctc)e;?oofd>?86nRXvH+%8Bem} zteBRg2W?F;gjDcv4333C9rQ+wUF?Dws*75CRXN8GjGzKC&_YY+>(bHMp&H**#UjN4 zPuR+Dr;TVtPit$4FiN0@V>p9?n?d6`JZ)-nJO((>@L7a5SD~ZzFo;!)ifK#(6~a6M zF)^CrM%Zr|%NRn7vB1objrR;#mfD0VEUHUL;j>!6YB);^WIzmA3n`dJGEm_=>}s+9 za!r=Q3hiN!At0d);ALhB_T1h**Xy`*JjNm7AcG2Am9OFiXEi_pP8+B|8RE!CFX+(7 z6Q06hKxJm)%X3%=0(sy#z=%g2@cK$@&o{_g1;sZ5frGE5 zK$ux*g$WCrwiIhx4wQ(vDcn7WdyE4D$y0*^K7fFBTp<)v!0Ts6z}(UHHPJ!;hVDLW zKne<6s1Hma_N zg=JUoO4xb;G9fe2y4e-jz@qe=U2&B4S-M#fk1*K z_!5860TVDCC$I=`wg6pV3&(H?02qaAXM+I<3V`5#IIx4#7k@ARF${Rvg^(}`kU%M2 zAPs8p0fX3vvKD}C2wko~dsirZJFo-{$Pth@0eN@=tf&Nn@P{?LZywsQEjh`dMv)fX3kU@ofI2E+J$ zWat3qXNXGYSJhBofDnhWWCALH1~?E3Ru~GVh#NY94inG@^hl3i;DP$r-S>BxvXU=FVU z3v-7X1n~#xP>&D!2(PG1P1t%aX#=1T2pfq5R|pI0*p6tpumsgek_O=jT;Px?=?&6g z3vj>#T3`Z5ISWX+kxt+Qq|gnpkbu$`3f*9ky*QFQc@R3_lMk5#k6;RZC=Ej34i|6% zu)vP5kd`}$2JFa-1xW!|nUxu#1K+?1DG37i*acl61UxVZWod;wz>eL327xJkBk%@s zDVH4a2MoXnmGB54kOSV(f(!5gmvEM8NsxW81aA-l38|Pd@dw|)0QUd_rg;uSa1K`x R32*QQ+Mo@dDVG5O06Sn0stqPU-?eF;$p3mp`JpO@xPR=|10B_)%3Rrv^HaapId;6(C zKC*BYH=Sh;JMNA+eQ)tGw5)RY`SZt8bGX|6Yn;-a7m1c9i;EH-41S*l7soIG8P^sY zu**vUKiiV;YLJ{#>Rx3NUL@*dw7ncp(S4CZ`1^d=&!_gw-!Y_sd}W5&QVaI)XU(_q zU{l)4E$1IXnt`h~oD3B;E&q77$9I)|UQ2%G_*AB0uM2MZyVNe>O!B^@_p|T*<^mvO zJO4a>B!So?m*+*T9w=NjnP#9;oqKv})9)!k;?!Nif|AdlKVLm`sLz*(H;sG|2&tCS zsK~(^%6C!KUCrXnb$`CyZKJK+f}K8tYinzJlV?AAg{%5rU~ZXXzH!ejU-jSf_oXKA zy37fG{q8pVQqC>BJu>)awjQb&Q7U&57ltk_&mL;Nd~%_N(QJj8$<-L<(TgbH*{75H zHv7Iw(wx1UWnq<8TU$GxLerq_^VygdS|@*h2cscuZz^2(x>tI&Jht5)`y`V1HW!My z*1!DIXjj9dx|O(^@>11L{!+W+c(Ru8{_CYCi;0Pe#dEImQ>UVDJ~|n1H{h#%Eg+zN zm(IjN?K3CZm#2ANqK3%$)Pu>_m1*<`O#GjjkV9}pf6KKmVu%!3xruu|LeiGc^P9@h zT&neqZjiS~ANTjX?%k@j_=?#C08KF_!#v}{3nzE{Uf1uc^-sE4RO9n=4z$@+#y?d_ zrEZ+JHSECP;CiOcc&f&1I`iFKPx|j>h#|k^>KwDHZ9V0I5#@A!d3DA8 zUk)Gr`t|G1*obXm@waM@F!Yf1M#e>oS8Lr1xHo#gzs{aGps!M?*o#;Y091e#@E`x* z1OTf5711C-D(T1q-vquQ)Uyp%os$Ul4oR!zh0N7MfN3DFAcSQLxXOUII>y*>=h-S& z_2aXIcR~&A6`GKX8k(#xtEopf%k=Ce5q90{6SwnM$(^1Ku0NlOUVEjiO8Wgu;1H$J zB>>=5m3z$$F_JDvio(_oR(2IP7J3TG`JtUYtD~=*7wDnYmhU3VD(x@J-)Uc;v^j9Y z&ekpQMValtjZBLn?#8BvxR&i^@S5(Z+tIocp%rh))7$I+3Al`tY%$axcvT|*aWV(@ z%lTg7GG#!XGa(bwW&}=8W&a?Xmh%`RRt@`7<@gIF-J~ za)R;a9Ya^by^m%ZANaGCkHmWWOJR-nbZK+syE8bl)rJ6_O=I1%(4ea+PaIwY2Rbdk zHE4!g(`SB}%wDo;RT2pXk^!yY;SSiOOl<4LF`3h#9tyfSna|DvDuY8EFOP`0YHw1q z2|#Rem^C!B77_o3a8SUjMY0mlD?@q+C$BbB*gz(ylhd`p&BLtu)hCPn#wWQD@@3LH z%UOm2y>71QQ~j7ErVQ}#rsl(jDU_Bi+^554>VI6#pEkzte$ zvi#?4MY^=%ShBD7-Kpd11&NadgoU?PvI#crgZ<=(Wn8)WpK0U{vvex4qmx1wd$pES z^1au__@Kab^&({|?!=+ta^3 zrw~_SSWUSaYknXd2C&4bh`AB@^a&v)e!|e2?T7LnZzWqhP5LN3yJ<-D2G>>NtSP5A z;M*R9`WRaov0}Q#LryT*tcdy6)+-E@Ks3LyvzirLXfqF^ zbLvX;%LSn@nyhdnQ8PtM+_dx4OK_EG>mwsZW+@T^NQ^vvXDV_&(DuLDLTO<8Mu?zp=~9@ z|LP{7<$8Tr&9X(-+PGGA=G~>%1XdoDl5y8#l}gUFl?BEvz4iV9_d?y zN$M)xn)wZSqP$v1$h_ioR>Nbp@aMx5C%SKettuO=PffnkdfL&$h@iM3@M3 zgs8Q*$Z$Tnpqbg=(W;xham1ujZgMfC6fG27I8f$mp}BH>;0CP_7Tliq)GkAjbujgW z;XzpT>jx>6(vI$TOBb@XF-HuG}huZbr}F z8Ngx+%e-g+0+PfXItTu&)(&CA@9$Rv#mXzn7#7JxGTD+S^Ve#m=Le|xveT_!-Vj@r zV>j1p8(S!Fcn+ON>f6hh!2oAqFiNWqTj>j{?`E}%CGg-%l3qo707e+m9^78(&>?G(LX0>GJz58=n z#uwR;mQz_3{evi=PhlJofx!K2afXZ923hJC5k^*)(pBE!I%!x zSBSzBV+emN^h9$#PwdYe{SsSt-x2XN0045D)od3F05KeO7yvwvnT6p@mup{W7p~|a zS$pg9>1x4zK8Al04c{LUZ>W#nNBqE`DQ=-ZU8#EV%{Gd|Vdq2*puTAmtlM(-i+}E; zFmcq*Xbym)d`zgj)S9bo>Bs#ZD<7{yFoNfMvR1%ZPuzJ7kPh5|x%>v#yo<;ORw3ga zFX@GEuJI#IB2$LK1~bQ@VYJwvc6M;>oSf>$%61)K;XK8uznR8E`W#3<8TO&ULgI8v z6b9Sc!3Yui3mH{R9Wfq(>R;(Jy&B%26c{)i9+U#X~&0=b(J` zdt(dZ{-h7;c}xJ%G+znd<*8x0sQmoXz)7o#?x`o%SwL3BUptIC{ z&3rY%O7`vkUTN`>58i6VsyyNOvxioYUh|uIV;>Q!Cy9`#q@3=HSEdVc1cm!E!<1kl zp}#5ie@c9)?9NbDJ8hL<3i40K>RND%|7vL=NL$x>Vz`)yG7SDgdKU_<>%v*j8CK;r z+Ba_7zW4j|+pB%Oj&C2N>MN_&zDo&OA>0$#5-512q37=mPPU;{F{|IgZKTS`;N zDfX_+A{6hz^JM7twc~x*q!sPe#MB$E4-QU}9cE&$y^SiV0+3C%D>0;uAH8g)aH=AF zv%pP>QaWVc9hBg0-q$Wk(Kbc{qkn3-7I*w0^3Iy_Hp;LDe!xdl&U*w0tJ2$C3ed&`@HQ&Ct`pEm@d(_t#y}umrS1F#CYM^I#E))JKZ}q!JiteQzaVxgmbyo&4rDpD+6~jy62|Cl zg8Vjdjy#8A#XX)WhvH@A@HuSAZHzw<8$&;!bBe<2JF<)rMGB&q4iaU;g?Y)tEVx@h z8Bo#%lFV)iILzNJd=6&_ib@fD1RZ)7XI&&n*SUG51|jN6;1c>~8x{tvb$H!e?Bbs@ ztRPWYq*^{nPeE!#ibQLPrCj1}2|fYk)NR(P4j#aF{G)wcWPrJ7` zZ8qR;_YELhWjR1!@qZEUL8;ikSfF+_B%0B%=Te@}Bt7qgcE*xsqz4 zY&V1^t!~DLNq^IzXA4X~rINyZtKqB?fX@@Lk^DR=-K^w4H$Z?5z}=>aG)wj>hC(+e zNigP*PtqBsaSh9C@e<+TH zNr}weggtDti1j-ir%tE997>WBKUB@=7oX(s!tN-~rb=+52&o33&2ZgUpw!C(ymPCV z^3vU!h}V@lGY$uJAfSuXFu|63yd1|7l-2Ons0eBU(+YJQ>cph{*6cl7x39~CO6Rb_ zePayH- zbB-MxO1z3*(J9iEmsd0_mJZy#_<=}ML|(Y=hxHK?4x^AEm-u=S8^a+4EnxK|_|AS& zJR5tAMegq}Gv#7Fyu7Fb(5OjjqjO3BMqc__4lX(qVmSH7oGWg9qRj(1UfxAgo8tL>o|AVnLz^T~v**H~7;*-1SI;C~=$My*T literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/browsers/opera.gif b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/browsers/opera.gif new file mode 100755 index 0000000000000000000000000000000000000000..6886f6b8921240010cd49d837e30a45eea807af8 GIT binary patch literal 3508 zcmWla`#;l*C%&R8x~)iC(m^o|;$?IUR}vz)hKK%EDspfK#1;!Th3hX=pSW1UGr{zx__GJ9EbS zhGs@)QbEX~h2;l%`Kh7tuZjv^+j^wI=N6V^|F(8jQIuceaMHY+RcMU#!o^pCXMam& zxe&;wyA>N=$2aWkmQ73sYhNzcy_DRmya|D=#m%D>1}`== zZg4!%vD0drMymn9A$5(-q~uSJYNZ#iPVHx}`1`*EfVqjeE~4B>{i|6eweC}AmUr8} zaB`Kr?Hk#$WyQgv<7)gfkE0*`POa?Qzo?~EZecl?cjFtCy5f7{9tM+-#;k8Q-#i`k zoT@9?MxQ9U(Rx1o8-p?Ff9k%bRySU*Lr(540yTWUYSD3DBnYX5qi-TGT^YHRAh^I{ z{tgTnh)Z6aoR_7huS#Tn;g?2DXq%TKZ)xdFXi}FhUS9aQny#t6yn`{TOl}|$Hf?R* z7niRD1+P1@H;ic??H!(*TfRH$v&v)%L2&u!@^bjaj^vCRXt?B5@X~&E>u!f3B5_n* zb9Qc{3i&a?2Kt0SYCTAeVuJCc@!u+vu$b^u~rvDwPRPsFk#=V)ntc<<-}6#8oS+ z6r5r;0@Hv%6cO>CDazj|{{;PIU9EVhq1o&aqWbm;n%^DO8{PS zCHgWFHb1klG_|;}*Ip)*X|KUR0FVJR;J^KU697sE$k6I+K?w_Cu=`rnYMSF~fTROM ziLSRlyrgxzm@5>PbX=#hAf5Bu+yHe`A9a=aQRKk_-K@q?*8D)Sf_C_nVyE~h!GSUJ zD8Viwt{1|_PW0V(|Erc{8Ua&5Jcnq0}>j)p4-Iflrhfur9^+_nPiFn^$>pkGXQ*gYI;Q>w1!h*9uSl zz&rjk(ua&3^}WfqL-nPFac9pQHwR19iUK~7;2d3BLEa>&^^VKslsgsd@HCvEvvkK1 zrar-gzlRgsk@;HEe?M*_GaX@uNq3cH=Cw=i=y_N6mici^Pq`u0RoSc**0RmD=Ry6q z_oJUo<#vgHLnlSoxJ8OL^jzaEr=0O)ljz6#nvqsx^v*=3>b@?Bp;Hq=)kZ=s!{}|s zb>SI?=3Gx)k`PKVqt0XH&00AiO^L_>2~R`_*TaW5 zNpFlAqpURGABx=C;f(PJ53F)4%N~C51A6lAZDAP{c11M;g4eAlr^YmLnxLwI#P#lN zE_|zTlSdO~Mqs3~%*z0b;Sd2B)nzhHPLb1#hTFi@%H*2bwf`U%B}FtNPPGp6paMIL z2~BXNnQdKE5kv$?9F|Usw(0}B948%UYTZ#=|8A=&20h8(y&cx1c2hD8DThY`?@ac& zbINk;#TUj*&4^|WThzE76zEfT*L1xT;^8-qFdJ_(-E4c_H1jZi#O@}f1|4vVEmDcM zdL-gkIRm_2Ats0IBy9EXG{?-ANJr#-56T);0B(X@%*(;DI2Isvk(y`Xqym-q3 zwrpWW*`E!Wr__iW?Y7GC_<`rFXfA2nW9$z-@6WN1PF0(R#m&BIBw8?rYu;XXGvQ4Y z*ePs3BKAKSPmAqT{o{4!zSf!_Bk#!}5~8pN5Q_mblMLr|@;zNH9&$Y)XMLn99PH8) zY~*%R`hK|9YsKWbreo70@>+I%B!;KXf6RN2(ru;ZfM#cd-C7WD&pM3DH&^63Zyo#} zsX?nvm(NmIpFr;0O@w;&mysu}Paw$kOs{%hJT&UW?<4l{Tk2bYlcH~A!4D)X?-x&{ zzReWUo6EF`gFox!sj0HD$QQ9>S|JQO#ev$FW+EPkI_ly=u|Ks-;!!9+jO<`oI>KJ8 z;vF7uW-e+bSBq08*~w-Z*;yL(cajut$rH@7;ZW*`<`-)!N==lYPi@9-19%-7Poc_o zVQJPWchoP5GgQkCn*3t~rPKg8d&^SAdx1Cl9izs58_G) zP_7?=Qt$7%;sJGf%S8-LjM{dwyRJqxVTEFzy5b1b@fTBLiaVwkVAbvD?o03#jX5)p z!qwDU5JI3`#d*Jz>8)Y(SFuo0(H!CBd?7hArQ8zFJ$P)&)u3@qXvPqNYBs~@0Mrk& z>>`|7D@*$$ok_lH^zPz;a0H^TX=`{x@$G>UjJgv1vSh_2e+*Q!?x_R3p z;touy9XNfU@48PcVSt%rH)R%2yS0?tfePX@42v%NSQu=31kpe+lT8@Qn2RYv8a$>4 zbVxPDMAY5<`QB;i9;cz6Cx)lfPf8p?K-)>vvuT;KkDkzSVZv!E@0*97m16E4KNsYphL`6v z5zd2&DitGfcD%B>{J*z4p?3lJ2~T9>@f$i{#0eh=J5}4ZKMvaQmRM-Q`*aik&7=jM!8)RHHjh+}92K37q-ho0=l8g-vx;X{R= zsNX^f0Zz{KZkfYl0!Uf=DH`fH*#WNei%?fFojJ(~gudkc8>t1^Lib9ct;?b%3Week5wb z;CrTE7NU{Hxv}qY8C0Jy77H$|>@F0JA?nN*Q zn6jEJ-!r2tbWT+i;9xW{RxmAHj_hDs_Jkz^*LcQ&@*CtJ3q?KI^6T-X(6{1{E-{A1 zcSwVPYINiVAE`&Vx*-6RMc6eS=*&6o$AgmuASo2-7fL7;A>VQ@=O$k>LK6I|HM~L4 zk_)M1Mq^ilFC~L?G3+88=%m8V(SbG*vN`OMp26kEKk&XxDBEC<0RTcuVBbnY#!7-q z3}QV0jSo)(yCV~`%R{ouaYl2PX4Dye8d4NmO{ODC5lMo z0~!MKF%jaW@a*q<=Qqlc?fHn(B>W&1sx5$3^W@4xujETEx$9skBJea9oi9SzhI-vE z#D5M=vz-I}5@BwNKr}CTay1R!L=pkuQvs+Uf*5fTJRZTT1Rg3xx^O`>5k}-0b);nE bG?CEr;6H{K77WYBI!*MlHSIV(lO|ewtb9BsZ~v~o3>-$Gmdp;NRm`< zsgPAeViKBhrbE-AP%(56+MUv;)v-I@zRy44^~>w={NcHDS%|k!j2KuB{9^>fRj-y_ z?2k^qKL7Y%6B844Pv1Ry^k`kj$Em5Qd27DLny5;kt!IQik9u&}TcviX#% zd+^1J?Ma3I{`;@}mU9lfu2ygV5ijYrimlcXzbrk{5Onf(Sk`DnL_}g%bpVdLZYYc2 zwX06^_|1B!;o;$k!`FYR>a$o{?kpp7FSNM?A1trBntr_U(CHiX#}0+;D0{TYV`O;n zWOc{s>h6L5{yhcPCdc2n9DKAVr}TkD>z9iK=dWk{smm{^ICbuFWBZfL zYrU((r2k3bt;tvV`<@1@ONlPNJwEz!RYG-m&5PUJU0yL~)@OJ0^ze_~=vlFVGm;Fy3)n9Mwc=4A`r)$v- zdmrie^y!nixw%|BX)qW{w9kTe*52%X_VU#$>*y1us@u<>4-olR>jpoLj*eYv>-+UY z!;>dZG#bsfFQ3=k{JW*O+3L4(r81AmIe+AQTUkZzC13uRuU|Fo-77B-9WOeyt%u?doXo4dR&w(6mEI+}nk9LUz8?09jg5`lzTGdrxoi0A(}9;?{`sgMc+$}Q z@b};aH}3WtjYiwg2nYa1z!mt;|2qNDjewCcD^x{lf1mGvoO!%kP@at1FE0t@$2e`F z|F`#x=VVMru4u{3tVl!TS*26t%oJswNFj0Aa*^GepbtCgy`<3Yb8f%$wzJYVvu5UT zOIOcu4YsOrr9UXAC8L+Rw2H-|B2;Iqxn^E&FUjy-w4He9w!EBOkn?KJF)!Xp|4MpR zzNXTjMPK3idXciOa!f#Ky>Lw_uMgr`iVX%5!=&GZ0;r0vqY~*pB5t{mM^Hp|Nfp z3dhL(opyI0j1~Hh?jSEk75JqaVUO5W#1+mhi{R}fD1Jfqu8I1X%$%tghnkv(3slJG2-I+>C)-zUbl z2ZGE4|8VOKdXS9vOE6pKJT^>aItk=rEVV$KkzxkC9OMb(U^aqO03eroD`*+}#lOj# zxz9AZKr5>8~Y&V`xm}VwaiAg*v}PeL_ut{WGWkMm{znca}NK&wlL0m zz?|8?0;Bj+mH8R`?4%fE(SoR$bjD|WOeG`DNz_4$w-B@D+5;dg^~Q-*igy%|@8)gx zJ~yl2n^70IxKO!S&W~qqZe>`-lYpCA0A;CWnEk9^95HC$Sd#6`cAwYZBsp%+ze(Al zQLbfo_?mZ65YJ)EgdvFUNpN)yA{8|LJ^jP9^J(pKuBg_9)^yQW-ilRbbCdLJMtR&6 z>}bBX_O4q_rG|r=CdqDB|MWN_zR4<-Sne)}C+?tEqheBRguhSHZl#rI-(pAO;AC&% z<71qnC1VTt*lUq2$aQd4DaY}dXK}a6_LMuqw?eetj2Nf+AE-w@4pc!c9{&=S+KQT- zJH37rEMIr2UAT>Vdjeu{V~xAqixvN}gO--=S8KlQ)k6yZ`eUrkdeihJ%^>rxapWJW zs(t<)>Wd_~Vy4C8ZEI zSjWVLSfxwTyv$VJEg_M<8pWJjICWB)X7^EQzqe!y5}wrQCX+Ff0oXdxN#S+I7TG-p z&3Jh#b;kK{jYT~uS4cuE?-C#-v6SN-L?RA)1+68J<~0^F*C>o)%qX%4gVWnT7it|@ z?V^P>fY>1#1QQ>Zt!>00%?XroK{EBbs75sr(~QseupEgB(LkO=Q{j<{C0> zr;>m>%Gy1Ay_Nj*WPmCN@FMVx!=wn@B&G4$d7blpBeG5CV$=akv0V{JJzf;zD9~|4 z`5+};4O@kDr|s|~nB`GHUVfS&dVCoLb`JT1>Oqq=!?_m>3NyqVSyHE^9A{s|{y?b= zsh+N;2MSyQ8W&+C!&j#@*SrTJYDyKd_;E#moA|A9g%=)Kyj(~XXHb+ zMV(z>XSfzJktlY&8YvTToI~4y^dIRkJYR$G*g0oI?Znt5znjxlqi)CFbZlN)VbEkdw_3Gku7+=9l$H zO`d?WBr0u8bacCtoK-yy9k};3ed_XhU=f`(K6TeaDQmz2UTF3nDA5>v0JyI`Ep*hOw(jykn^9MNY*eIpPD z6%qbX0_`g*Ys(b`B3t=#dUjI#Dx6}e#NVt`3p(4U3D6+}WFw#vRws4Lae4pJb-VAt$`^F@qZx8wqSjpADm zXvLT9LoqqHe#Ho9W1raZuNsPrWY}bnnl>|2m6JfX-NyT0yYsj^lqhNCN9c%im4>*` zrM?|o*VW7cw1}Ih*rrn&!WmIz_Emc@U z!CAX-k;zuHwe74y@x!#9YD$woJbs4h?Y-&clc*q9Cvvx-0-%QjJTycjk0c@ zJo&XpVMP#zMFus1%cpnVT55?`v_hA;Y@TSgDgA#6s)1nnm*C(`DP)?DA0E#Yiwbm| zZXWODy+Z_bsRlQ~yOl>1U5CGgB|$9Tn&buOe;l?1wr~Zron7rs@N~J?HVNVZHt($g@iai@21tOzum6#cjZ%NsANkop zO(v;laIk2KjY=rJ2DXuadq~cJ)Y6dzH>zkJ1jBH!sE=dJh|prw)2IEj}j2Ju5c%)k?Tw5U(q|7~3##-<66z}u{dg^HvwNeFFq8!Ai+5Re=i;e4{41`_GBjsZ*rXIW@4ZwW7Un%9U?=98S0 zYR=d;24qO)#3@B2#b}glbtLwiouv710F79lKLfCo6a>EoEcJl3hIvlMs8ms{aGHx0 za6oNFFwoT8NeqB4C}ph_G}F@yq|{|7{fRnpw+x=A;>|+od>O~zr{DkpC{d(d2Lj3y zmO56*h5}FrzSQKM*3oz3z!@onX+r72K*SDp0FXtI04GHs zyAVBbz^53Hvg+~TgWV?%F#u}}n8JYFN~WO#;!|vxwQPjXT1?C|l~5j*Li>jiTcR*p zPnYUr-%5_2KY4?D#)`3$P@3c(OAVCHbgt$?~JmiVqm+*qI z+%e3$24!rM&?@!tZVmJU#^H--fy;{Ty#<_gpdUaP(sN+V*~iOHFF$$O8Y^m$v7)5F z`WZGK<4_kBSE%8<2SGE5ZJv&jpr<~S(pojgJ~MzW)mdjHZBWmVU|hf#u#^GVZ(z5Q z*6+g$BN-poTfGKts!&Jj14t}oxa;7xDpnrKYLqfsCA1up!s}vsV#Qy(zmGtt^&E2@ z667rUo8VvZco5r#JfoIWj0N8exg%7#_eAqWQEM);PfKmk85-Wk!kI zc8Pefl535fc)+MwJHT=_(0<3b(*$FlvZ7lFHRG_yZ77;3+p!Y}-05VhV!p!o?ii?1 zu@__DsFYDaP~ud8m5%;ByH;Zt6 zxxN>jZxFgmd3U1iSvV_L3Yf|0tFaUJ4zT5o)dS3`KQS(>fx7{Qv!*y&&(oGc92f38 zUvNSPFRpNytpkuu!QdVEDxs=r{V|x-T z7XpYbrMl=@xQc5C7gniQRkd7GloF1Cfh_hT_gYd@N7e8yYnU7zi~X!YDP>*6n8i5l z3(1V;i^ni15tRJ}_8BlC`Jq>4L%x#W?oV3gH>14jX-PQ@#hK|c^o<{QRQT>VAD zPJ6~&bwunq?FiMrIUbbk?Yn%~GP#RD_X%(;a4y#FqbZ%rf=>?Za>{Fv- zH~@bl)s0HiO9Wh{QXBGah;`8H^H8FWNq=h)%*Ws+3A;lhpweRusB*xaKMvYOc5BJNxq@|y%#ycc?-?c#Wpu4irA(vGRvBT9~C rN`gHO-NA*CdiHZ2bNvcFouHyP^i4qVysO0wu!iI`lAS($6j=0s**o*? literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/FIXES.txt b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/FIXES.txt new file mode 100755 index 00000000..e1f06cd9 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/FIXES.txt @@ -0,0 +1,12 @@ +:(t=!!k[n],"br"!=n||!e.data("cke-eol") +:(t=!k||!!k[n],"br"!=n||!e.data("cke-eol") + +--- + +for(F=null;y&&!p[y.getName()][L.name];){ +for(F=null;y&&(!p||!p[y.getName()]||!p[y.getName()][L.name]);){ + +--- + +a.window.$.getSelection().removeAllRanges() +a.window&&a.window.$&&a.window.$.getSelection().removeAllRanges() diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/build-config.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/build-config.js new file mode 100755 index 00000000..9e672885 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/build-config.js @@ -0,0 +1,152 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * This file was added automatically by CKEditor builder. + * You may re-use it at any time to build CKEditor again. + * + * If you would like to build CKEditor online again + * (for example to upgrade), visit one the following links: + * + * (1) http://ckeditor.com/builder + * Visit online builder to build CKEditor from scratch. + * + * (2) http://ckeditor.com/builder/9b9471acfb896c4f73b825ccf971b5bc + * Visit online builder to build CKEditor, starting with the same setup as before. + * + * (3) http://ckeditor.com/builder/download/9b9471acfb896c4f73b825ccf971b5bc + * Straight download link to the latest version of CKEditor (Optimized) with the same setup as before. + * + * NOTE: + * This file is not used by CKEditor, you may remove it. + * Changing this file will not change your CKEditor configuration. + */ + +var CKBUILDER_CONFIG = { + skin: 'moono-lisa', + preset: 'basic', + ignore: [ + '.bender', + 'bender.js', + 'bender-err.log', + 'bender-out.log', + 'dev', + '.DS_Store', + '.editorconfig', + '.gitattributes', + '.gitignore', + 'gruntfile.js', + '.idea', + '.jscsrc', + '.jshintignore', + '.jshintrc', + 'less', + '.mailmap', + 'node_modules', + 'package.json', + 'README.md', + 'tests' + ], + plugins : { + 'about' : 1, + 'autolink' : 1, + 'base64image' : 1, + 'basicstyles' : 1, + 'bidi' : 1, + 'blockquote' : 1, + 'clipboard' : 1, + 'colorbutton' : 1, + 'colordialog' : 1, + 'divarea' : 1, + 'enterkey' : 1, + 'entities' : 1, + 'floatingspace' : 1, + 'font' : 1, + 'image' : 1, + 'image2' : 1, + 'indentlist' : 1, + 'link' : 1, + 'list' : 1, + 'maximize' : 1, + 'pastebase64' : 1, + 'quicktable' : 1, + 'removeformat' : 1, + 'sourcearea' : 1, + 'toolbar' : 1, + 'undo' : 1, + 'wysiwygarea' : 1 + }, + languages : { + 'af' : 1, + 'ar' : 1, + 'az' : 1, + 'bg' : 1, + 'bn' : 1, + 'bs' : 1, + 'ca' : 1, + 'cs' : 1, + 'cy' : 1, + 'da' : 1, + 'de' : 1, + 'de-ch' : 1, + 'el' : 1, + 'en' : 1, + 'en-au' : 1, + 'en-ca' : 1, + 'en-gb' : 1, + 'eo' : 1, + 'es' : 1, + 'et' : 1, + 'eu' : 1, + 'fa' : 1, + 'fi' : 1, + 'fo' : 1, + 'fr' : 1, + 'fr-ca' : 1, + 'gl' : 1, + 'gu' : 1, + 'he' : 1, + 'hi' : 1, + 'hr' : 1, + 'hu' : 1, + 'id' : 1, + 'is' : 1, + 'it' : 1, + 'ja' : 1, + 'ka' : 1, + 'km' : 1, + 'ko' : 1, + 'ku' : 1, + 'lt' : 1, + 'lv' : 1, + 'mk' : 1, + 'mn' : 1, + 'ms' : 1, + 'nb' : 1, + 'nl' : 1, + 'no' : 1, + 'oc' : 1, + 'pl' : 1, + 'pt' : 1, + 'pt-br' : 1, + 'ro' : 1, + 'ru' : 1, + 'si' : 1, + 'sk' : 1, + 'sl' : 1, + 'sq' : 1, + 'sr' : 1, + 'sr-latn' : 1, + 'sv' : 1, + 'th' : 1, + 'tr' : 1, + 'tt' : 1, + 'ug' : 1, + 'uk' : 1, + 'vi' : 1, + 'zh' : 1, + 'zh-cn' : 1 + } +}; \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/ckeditor.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/ckeditor.js new file mode 100755 index 00000000..aff82757 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/ckeditor.js @@ -0,0 +1,1010 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){if(window.CKEDITOR&&window.CKEDITOR.dom)return;window.CKEDITOR||(window.CKEDITOR=function(){var a=/(^|.*[\\\/])ckeditor\.js(?:\?.*|;.*)?$/i,d={timestamp:"H0CG",version:"4.6.2",revision:"20af917",rnd:Math.floor(900*Math.random())+100,_:{pending:[],basePathSrcPattern:a},status:"unloaded",basePath:function(){var b=window.CKEDITOR_BASEPATH||"";if(!b)for(var c=document.getElementsByTagName("script"),d=0;df.getListenerIndex(d)){f=f.listeners;g||(g=this);isNaN(h)&&(h=10);var B=this;p.fn=d;p.priority=h;for(var u=f.length-1;0<=u;u--)if(f[u].priority<=h)return f.splice(u+1,0,p),{removeListener:r};f.unshift(p)}return{removeListener:r}}, +once:function(){var a=Array.prototype.slice.call(arguments),b=a[1];a[1]=function(a){a.removeListener();return b.apply(this,arguments)};return this.on.apply(this,a)},capture:function(){CKEDITOR.event.useCapture=1;var a=this.on.apply(this,arguments);CKEDITOR.event.useCapture=0;return a},fire:function(){var a=0,b=function(){a=1},g=0,k=function(){g=1};return function(h,p,r){var f=d(this)[h];h=a;var B=g;a=g=0;if(f){var u=f.listeners;if(u.length)for(var u=u.slice(0),z,y=0;ydocument.documentMode),mobile:-1c||b.quirks);b.gecko&&(d=a.match(/rv:([\d\.]+)/))&&(d=d[1].split("."),c=1E4*d[0]+100*(d[1]||0)+1*(d[2]||0));b.air&&(c=parseFloat(a.match(/ adobeair\/(\d+)/)[1])); +b.webkit&&(c=parseFloat(a.match(/ applewebkit\/(\d+)/)[1]));b.version=c;b.isCompatible=!(b.ie&&7>c)&&!(b.gecko&&4E4>c)&&!(b.webkit&&534>c);b.hidpi=2<=window.devicePixelRatio;b.needsBrFiller=b.gecko||b.webkit||b.ie&&10c;b.cssClass="cke_browser_"+(b.ie?"ie":b.gecko?"gecko":b.webkit?"webkit":"unknown");b.quirks&&(b.cssClass+=" cke_browser_quirks");b.ie&&(b.cssClass+=" cke_browser_ie"+(b.quirks?"6 cke_browser_iequirks":b.version));b.air&&(b.cssClass+=" cke_browser_air"); +b.iOS&&(b.cssClass+=" cke_browser_ios");b.hidpi&&(b.cssClass+=" cke_hidpi");return b}()); +"unloaded"==CKEDITOR.status&&function(){CKEDITOR.event.implementOn(CKEDITOR);CKEDITOR.loadFullCore=function(){if("basic_ready"!=CKEDITOR.status)CKEDITOR.loadFullCore._load=1;else{delete CKEDITOR.loadFullCore;var a=document.createElement("script");a.type="text/javascript";a.src=CKEDITOR.basePath+"ckeditor.js";document.getElementsByTagName("head")[0].appendChild(a)}};CKEDITOR.loadFullCoreTimeout=0;CKEDITOR.add=function(a){(this._.pending||(this._.pending=[])).push(a)};(function(){CKEDITOR.domReady(function(){var a= +CKEDITOR.loadFullCore,d=CKEDITOR.loadFullCoreTimeout;a&&(CKEDITOR.status="basic_ready",a&&a._load?a():d&&setTimeout(function(){CKEDITOR.loadFullCore&&CKEDITOR.loadFullCore()},1E3*d))})})();CKEDITOR.status="basic_loaded"}();"use strict";CKEDITOR.VERBOSITY_WARN=1;CKEDITOR.VERBOSITY_ERROR=2;CKEDITOR.verbosity=CKEDITOR.VERBOSITY_WARN|CKEDITOR.VERBOSITY_ERROR;CKEDITOR.warn=function(a,d){CKEDITOR.verbosity&CKEDITOR.VERBOSITY_WARN&&CKEDITOR.fire("log",{type:"warn",errorCode:a,additionalData:d})}; +CKEDITOR.error=function(a,d){CKEDITOR.verbosity&CKEDITOR.VERBOSITY_ERROR&&CKEDITOR.fire("log",{type:"error",errorCode:a,additionalData:d})}; +CKEDITOR.on("log",function(a){if(window.console&&window.console.log){var d=console[a.data.type]?a.data.type:"log",b=a.data.errorCode;if(a=a.data.additionalData)console[d]("[CKEDITOR] Error code: "+b+".",a);else console[d]("[CKEDITOR] Error code: "+b+".");console[d]("[CKEDITOR] For more information about this error go to http://docs.ckeditor.com/#!/guide/dev_errors-section-"+b)}},null,null,999);CKEDITOR.dom={}; +(function(){var a=[],d=CKEDITOR.env.gecko?"-moz-":CKEDITOR.env.webkit?"-webkit-":CKEDITOR.env.ie?"-ms-":"",b=/&/g,c=/>/g,e=/|\s) /g, +function(a,f){return f+"\x26nbsp;"}).replace(/ (?=<)/g,"\x26nbsp;")},getNextNumber:function(){var a=0;return function(){return++a}}(),getNextId:function(){return"cke_"+this.getNextNumber()},getUniqueId:function(){for(var a="e",f=0;8>f;f++)a+=Math.floor(65536*(1+Math.random())).toString(16).substring(1);return a},override:function(a,f){var b=f(a);b.prototype=a.prototype;return b},setTimeout:function(a,f,b,c,h){h||(h=window);b||(b=h);return h.setTimeout(function(){c?a.apply(b,[].concat(c)):a.apply(b)}, +f||0)},trim:function(){var a=/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;return function(f){return f.replace(a,"")}}(),ltrim:function(){var a=/^[ \t\n\r]+/g;return function(f){return f.replace(a,"")}}(),rtrim:function(){var a=/[ \t\n\r]+$/g;return function(f){return f.replace(a,"")}}(),indexOf:function(a,f){if("function"==typeof f)for(var b=0,c=a.length;bb;b++)a[b]=("0"+parseInt(a[b],10).toString(16)).slice(-2); +return"#"+a.join("")})},normalizeHex:function(a){return a.replace(/#(([0-9a-f]{3}){1,2})($|;|\s+)/gi,function(a,b,c,h){a=b.toLowerCase();3==a.length&&(a=a.split(""),a=[a[0],a[0],a[1],a[1],a[2],a[2]].join(""));return"#"+a+h})},parseCssText:function(a,f,b){var c={};b&&(a=(new CKEDITOR.dom.element("span")).setAttribute("style",a).getAttribute("style")||"");a&&(a=CKEDITOR.tools.normalizeHex(CKEDITOR.tools.convertRgbToHex(a)));if(!a||";"==a)return c;a.replace(/"/g,'"').replace(/\s*([^:;\s]+)\s*:\s*([^;]+)\s*(?=;|$)/g, +function(a,b,h){f&&(b=b.toLowerCase(),"font-family"==b&&(h=h.replace(/\s*,\s*/g,",")),h=CKEDITOR.tools.trim(h));c[b]=h});return c},writeCssText:function(a,b){var c,h=[];for(c in a)h.push(c+":"+a[c]);b&&h.sort();return h.join("; ")},objectCompare:function(a,b,c){var h;if(!a&&!b)return!0;if(!a||!b)return!1;for(h in a)if(a[h]!=b[h])return!1;if(!c)for(h in b)if(a[h]!=b[h])return!1;return!0},objectKeys:function(a){var b=[],c;for(c in a)b.push(c);return b},convertArrayToObject:function(a,b){var c={};1== +arguments.length&&(b=!0);for(var h=0,d=a.length;hc;c++)a.push(Math.floor(256*Math.random()));for(c=0;cCKEDITOR.env.version&&(this.type==CKEDITOR.NODE_ELEMENT||this.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT)&&c(e);return e},hasPrevious:function(){return!!this.$.previousSibling},hasNext:function(){return!!this.$.nextSibling},insertAfter:function(a){a.$.parentNode.insertBefore(this.$,a.$.nextSibling);return a},insertBefore:function(a){a.$.parentNode.insertBefore(this.$, +a.$);return a},insertBeforeMe:function(a){this.$.parentNode.insertBefore(a.$,this.$);return a},getAddress:function(a){for(var d=[],b=this.getDocument().$.documentElement,c=this.$;c&&c!=b;){var e=c.parentNode;e&&d.unshift(this.getIndex.call({$:c},a));c=e}return d},getDocument:function(){return new CKEDITOR.dom.document(this.$.ownerDocument||this.$.parentNode.ownerDocument)},getIndex:function(a){function d(a,c){var p=c?a.nextSibling:a.previousSibling;return p&&p.nodeType==CKEDITOR.NODE_TEXT?b(p)?d(p, +c):p:null}function b(a){return!a.nodeValue||a.nodeValue==CKEDITOR.dom.selection.FILLING_CHAR_SEQUENCE}var c=this.$,e=-1,g;if(!this.$.parentNode||a&&c.nodeType==CKEDITOR.NODE_TEXT&&b(c)&&!d(c)&&!d(c,!0))return-1;do a&&c!=this.$&&c.nodeType==CKEDITOR.NODE_TEXT&&(g||b(c))||(e++,g=c.nodeType==CKEDITOR.NODE_TEXT);while(c=c.previousSibling);return e},getNextSourceNode:function(a,d,b){if(b&&!b.call){var c=b;b=function(a){return!a.equals(c)}}a=!a&&this.getFirst&&this.getFirst();var e;if(!a){if(this.type== +CKEDITOR.NODE_ELEMENT&&b&&!1===b(this,!0))return null;a=this.getNext()}for(;!a&&(e=(e||this).getParent());){if(b&&!1===b(e,!0))return null;a=e.getNext()}return!a||b&&!1===b(a)?null:d&&d!=a.type?a.getNextSourceNode(!1,d,b):a},getPreviousSourceNode:function(a,d,b){if(b&&!b.call){var c=b;b=function(a){return!a.equals(c)}}a=!a&&this.getLast&&this.getLast();var e;if(!a){if(this.type==CKEDITOR.NODE_ELEMENT&&b&&!1===b(this,!0))return null;a=this.getPrevious()}for(;!a&&(e=(e||this).getParent());){if(b&&!1=== +b(e,!0))return null;a=e.getPrevious()}return!a||b&&!1===b(a)?null:d&&a.type!=d?a.getPreviousSourceNode(!1,d,b):a},getPrevious:function(a){var d=this.$,b;do b=(d=d.previousSibling)&&10!=d.nodeType&&new CKEDITOR.dom.node(d);while(b&&a&&!a(b));return b},getNext:function(a){var d=this.$,b;do b=(d=d.nextSibling)&&new CKEDITOR.dom.node(d);while(b&&a&&!a(b));return b},getParent:function(a){var d=this.$.parentNode;return d&&(d.nodeType==CKEDITOR.NODE_ELEMENT||a&&d.nodeType==CKEDITOR.NODE_DOCUMENT_FRAGMENT)? +new CKEDITOR.dom.node(d):null},getParents:function(a){var d=this,b=[];do b[a?"push":"unshift"](d);while(d=d.getParent());return b},getCommonAncestor:function(a){if(a.equals(this))return this;if(a.contains&&a.contains(this))return a;var d=this.contains?this:this.getParent();do if(d.contains(a))return d;while(d=d.getParent());return null},getPosition:function(a){var d=this.$,b=a.$;if(d.compareDocumentPosition)return d.compareDocumentPosition(b);if(d==b)return CKEDITOR.POSITION_IDENTICAL;if(this.type== +CKEDITOR.NODE_ELEMENT&&a.type==CKEDITOR.NODE_ELEMENT){if(d.contains){if(d.contains(b))return CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_PRECEDING;if(b.contains(d))return CKEDITOR.POSITION_IS_CONTAINED+CKEDITOR.POSITION_FOLLOWING}if("sourceIndex"in d)return 0>d.sourceIndex||0>b.sourceIndex?CKEDITOR.POSITION_DISCONNECTED:d.sourceIndex=document.documentMode||!d||(a=d+":"+a);return new CKEDITOR.dom.nodeList(this.$.getElementsByTagName(a))},getHead:function(){var a=this.$.getElementsByTagName("head")[0]; +return a=a?new CKEDITOR.dom.element(a):this.getDocumentElement().append(new CKEDITOR.dom.element("head"),!0)},getBody:function(){return new CKEDITOR.dom.element(this.$.body)},getDocumentElement:function(){return new CKEDITOR.dom.element(this.$.documentElement)},getWindow:function(){return new CKEDITOR.dom.window(this.$.parentWindow||this.$.defaultView)},write:function(a){this.$.open("text/html","replace");CKEDITOR.env.ie&&(a=a.replace(/(?:^\s*]*?>)|^/i,'$\x26\n\x3cscript data-cke-temp\x3d"1"\x3e('+ +CKEDITOR.tools.fixDomain+")();\x3c/script\x3e"));this.$.write(a);this.$.close()},find:function(a){return new CKEDITOR.dom.nodeList(this.$.querySelectorAll(a))},findOne:function(a){return(a=this.$.querySelector(a))?new CKEDITOR.dom.element(a):null},_getHtml5ShivFrag:function(){var a=this.getCustomData("html5ShivFrag");a||(a=this.$.createDocumentFragment(),CKEDITOR.tools.enableHtml5Elements(a,!0),this.setCustomData("html5ShivFrag",a));return a}});CKEDITOR.dom.nodeList=function(a){this.$=a}; +CKEDITOR.dom.nodeList.prototype={count:function(){return this.$.length},getItem:function(a){return 0>a||a>=this.$.length?null:(a=this.$[a])?new CKEDITOR.dom.node(a):null}};CKEDITOR.dom.element=function(a,d){"string"==typeof a&&(a=(d?d.$:document).createElement(a));CKEDITOR.dom.domObject.call(this,a)};CKEDITOR.dom.element.get=function(a){return(a="string"==typeof a?document.getElementById(a)||document.getElementsByName(a)[0]:a)&&(a.$?a:new CKEDITOR.dom.element(a))};CKEDITOR.dom.element.prototype=new CKEDITOR.dom.node; +CKEDITOR.dom.element.createFromHtml=function(a,d){var b=new CKEDITOR.dom.element("div",d);b.setHtml(a);return b.getFirst().remove()};CKEDITOR.dom.element.setMarker=function(a,d,b,c){var e=d.getCustomData("list_marker_id")||d.setCustomData("list_marker_id",CKEDITOR.tools.getNextNumber()).getCustomData("list_marker_id"),g=d.getCustomData("list_marker_names")||d.setCustomData("list_marker_names",{}).getCustomData("list_marker_names");a[e]=d;g[b]=1;return d.setCustomData(b,c)}; +CKEDITOR.dom.element.clearAllMarkers=function(a){for(var d in a)CKEDITOR.dom.element.clearMarkers(a,a[d],1)};CKEDITOR.dom.element.clearMarkers=function(a,d,b){var c=d.getCustomData("list_marker_names"),e=d.getCustomData("list_marker_id"),g;for(g in c)d.removeCustomData(g);d.removeCustomData("list_marker_names");b&&(d.removeCustomData("list_marker_id"),delete a[e])}; +(function(){function a(a,b){return-1<(" "+a+" ").replace(g," ").indexOf(" "+b+" ")}function d(a){var b=!0;a.$.id||(a.$.id="cke_tmp_"+CKEDITOR.tools.getNextNumber(),b=!1);return function(){b||a.removeAttribute("id")}}function b(a,b){var c=CKEDITOR.tools.escapeCss(a.$.id);return"#"+c+" "+b.split(/,\s*/).join(", #"+c+" ")}function c(a){for(var b=0,c=0,f=k[a].length;cCKEDITOR.env.version?this.$.text+=a:this.append(new CKEDITOR.dom.text(a))},appendBogus:function(a){if(a||CKEDITOR.env.needsBrFiller){for(a=this.getLast();a&&a.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.rtrim(a.getText());)a=a.getPrevious();a&&a.is&&a.is("br")||(a=this.getDocument().createElement("br"),CKEDITOR.env.gecko&&a.setAttribute("type","_moz"),this.append(a))}},breakParent:function(a,b){var c=new CKEDITOR.dom.range(this.getDocument());c.setStartAfter(this);c.setEndAfter(a); +var f=c.extractContents(!1,b||!1),d;c.insertNode(this.remove());if(CKEDITOR.env.ie&&!CKEDITOR.env.edge){for(c=new CKEDITOR.dom.element("div");d=f.getFirst();)d.$.style.backgroundColor&&(d.$.style.backgroundColor=d.$.style.backgroundColor),c.append(d);c.insertAfter(this);c.remove(!0)}else f.insertAfterNode(this)},contains:document.compareDocumentPosition?function(a){return!!(this.$.compareDocumentPosition(a.$)&16)}:function(a){var b=this.$;return a.type!=CKEDITOR.NODE_ELEMENT?b.contains(a.getParent().$): +b!=a.$&&b.contains(a.$)},focus:function(){function a(){try{this.$.focus()}catch(b){}}return function(b){b?CKEDITOR.tools.setTimeout(a,100,this):a.call(this)}}(),getHtml:function(){var a=this.$.innerHTML;return CKEDITOR.env.ie?a.replace(/<\?[^>]*>/g,""):a},getOuterHtml:function(){if(this.$.outerHTML)return this.$.outerHTML.replace(/<\?[^>]*>/,"");var a=this.$.ownerDocument.createElement("div");a.appendChild(this.$.cloneNode(!0));return a.innerHTML},getClientRect:function(){var a=CKEDITOR.tools.extend({}, +this.$.getBoundingClientRect());!a.width&&(a.width=a.right-a.left);!a.height&&(a.height=a.bottom-a.top);return a},setHtml:CKEDITOR.env.ie&&9>CKEDITOR.env.version?function(a){try{var b=this.$;if(this.getParent())return b.innerHTML=a;var c=this.getDocument()._getHtml5ShivFrag();c.appendChild(b);b.innerHTML=a;c.removeChild(b);return a}catch(f){this.$.innerHTML="";b=new CKEDITOR.dom.element("body",this.getDocument());b.$.innerHTML=a;for(b=b.getChildren();b.count();)this.append(b.getItem(0));return a}}: +function(a){return this.$.innerHTML=a},setText:function(){var a=document.createElement("p");a.innerHTML="x";a=a.textContent;return function(b){this.$[a?"textContent":"innerText"]=b}}(),getAttribute:function(){var a=function(a){return this.$.getAttribute(a,2)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?function(a){switch(a){case "class":a="className";break;case "http-equiv":a="httpEquiv";break;case "name":return this.$.name;case "tabindex":return a=this.$.getAttribute(a, +2),0!==a&&0===this.$.tabIndex&&(a=null),a;case "checked":return a=this.$.attributes.getNamedItem(a),(a.specified?a.nodeValue:this.$.checked)?"checked":null;case "hspace":case "value":return this.$[a];case "style":return this.$.style.cssText;case "contenteditable":case "contentEditable":return this.$.attributes.getNamedItem("contentEditable").specified?this.$.getAttribute("contentEditable"):null}return this.$.getAttribute(a,2)}:a}(),getAttributes:function(a){var b={},c=this.$.attributes,f;a=CKEDITOR.tools.isArray(a)? +a:[];for(f=0;f=document.documentMode){var b=this.$.scopeName;"HTML"!=b&&(a=b.toLowerCase()+":"+a)}this.getName=function(){return a};return this.getName()},getValue:function(){return this.$.value},getFirst:function(a){var b=this.$.firstChild;(b=b&&new CKEDITOR.dom.node(b))&&a&&!a(b)&&(b=b.getNext(a));return b},getLast:function(a){var b=this.$.lastChild;(b=b&&new CKEDITOR.dom.node(b))&&a&&!a(b)&&(b=b.getPrevious(a));return b},getStyle:function(a){return this.$.style[CKEDITOR.tools.cssStyleToDomStyle(a)]}, +is:function(){var a=this.getName();if("object"==typeof arguments[0])return!!arguments[0][a];for(var b=0;bCKEDITOR.env.version&&this.is("a")){var c=this.getParent();c.type==CKEDITOR.NODE_ELEMENT&&(c=c.clone(),c.setHtml(b),b=c.getHtml(),c.setHtml(a),a=c.getHtml())}return b==a},isVisible:function(){var a=(this.$.offsetHeight||this.$.offsetWidth)&&"hidden"!=this.getComputedStyle("visibility"),b,c;a&&CKEDITOR.env.webkit&&(b=this.getWindow(),!b.equals(CKEDITOR.document.getWindow())&&(c=b.$.frameElement)&&(a=(new CKEDITOR.dom.element(c)).isVisible()));return!!a},isEmptyInlineRemoveable:function(){if(!CKEDITOR.dtd.$removeEmpty[this.getName()])return!1; +for(var a=this.getChildren(),b=0,c=a.count();bCKEDITOR.env.version?function(b){return"name"==b?!!this.$.name:a.call(this,b)}:a:function(a){return!!this.$.attributes.getNamedItem(a)}}(),hide:function(){this.setStyle("display","none")},moveChildren:function(a,b){var c=this.$;a=a.$;if(c!=a){var f;if(b)for(;f=c.lastChild;)a.insertBefore(c.removeChild(f),a.firstChild);else for(;f=c.firstChild;)a.appendChild(c.removeChild(f))}},mergeSiblings:function(){function a(b,c,f){if(c&&c.type==CKEDITOR.NODE_ELEMENT){for(var d= +[];c.data("cke-bookmark")||c.isEmptyInlineRemoveable();)if(d.push(c),c=f?c.getNext():c.getPrevious(),!c||c.type!=CKEDITOR.NODE_ELEMENT)return;if(b.isIdentical(c)){for(var h=f?b.getLast():b.getFirst();d.length;)d.shift().move(b,!f);c.moveChildren(b,!f);c.remove();h&&h.type==CKEDITOR.NODE_ELEMENT&&h.mergeSiblings()}}}return function(b){if(!1===b||CKEDITOR.dtd.$removeEmpty[this.getName()]||this.is("a"))a(this,this.getNext(),!0),a(this,this.getPrevious())}}(),show:function(){this.setStyles({display:"", +visibility:""})},setAttribute:function(){var a=function(a,b){this.$.setAttribute(a,b);return this};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?function(b,c){"class"==b?this.$.className=c:"style"==b?this.$.style.cssText=c:"tabindex"==b?this.$.tabIndex=c:"checked"==b?this.$.checked=c:"contenteditable"==b?a.call(this,"contentEditable",c):a.apply(this,arguments);return this}:CKEDITOR.env.ie8Compat&&CKEDITOR.env.secure?function(b,c){if("src"==b&&c.match(/^http:\/\//))try{a.apply(this, +arguments)}catch(f){}else a.apply(this,arguments);return this}:a}(),setAttributes:function(a){for(var b in a)this.setAttribute(b,a[b]);return this},setValue:function(a){this.$.value=a;return this},removeAttribute:function(){var a=function(a){this.$.removeAttribute(a)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?function(a){"class"==a?a="className":"tabindex"==a?a="tabIndex":"contenteditable"==a&&(a="contentEditable");this.$.removeAttribute(a)}:a}(),removeAttributes:function(a){if(CKEDITOR.tools.isArray(a))for(var b= +0;bCKEDITOR.env.version?(a=Math.round(100*a),this.setStyle("filter",100<=a?"":"progid:DXImageTransform.Microsoft.Alpha(opacity\x3d"+a+")")):this.setStyle("opacity",a)},unselectable:function(){this.setStyles(CKEDITOR.tools.cssVendorPrefix("user-select", +"none"));if(CKEDITOR.env.ie){this.setAttribute("unselectable","on");for(var a,b=this.getElementsByTag("*"),c=0,f=b.count();cz||0z?z:d);c&&(0>e||0e?e:f,0)},setState:function(a,b,c){b=b||"cke";switch(a){case CKEDITOR.TRISTATE_ON:this.addClass(b+"_on");this.removeClass(b+ +"_off");this.removeClass(b+"_disabled");c&&this.setAttribute("aria-pressed",!0);c&&this.removeAttribute("aria-disabled");break;case CKEDITOR.TRISTATE_DISABLED:this.addClass(b+"_disabled");this.removeClass(b+"_off");this.removeClass(b+"_on");c&&this.setAttribute("aria-disabled",!0);c&&this.removeAttribute("aria-pressed");break;default:this.addClass(b+"_off"),this.removeClass(b+"_on"),this.removeClass(b+"_disabled"),c&&this.removeAttribute("aria-pressed"),c&&this.removeAttribute("aria-disabled")}}, +getFrameDocument:function(){var a=this.$;try{a.contentWindow.document}catch(b){a.src=a.src}return a&&new CKEDITOR.dom.document(a.contentWindow.document)},copyAttributes:function(a,b){var c=this.$.attributes;b=b||{};for(var f=0;f=n.getChildCount()?(n=n.getChild(A-1),D=!0):n=n.getChild(A):H=D=!0;q.type==CKEDITOR.NODE_TEXT?l?p=!0:q.split(t):0fa)for(;X;)X=m(X,K,!0);K=L}l||h()}}function b(){var a=!1,b=CKEDITOR.dom.walker.whitespaces(), +c=CKEDITOR.dom.walker.bookmark(!0),d=CKEDITOR.dom.walker.bogus();return function(e){return c(e)||b(e)?!0:d(e)&&!a?a=!0:e.type==CKEDITOR.NODE_TEXT&&(e.hasAscendant("pre")||CKEDITOR.tools.trim(e.getText()).length)||e.type==CKEDITOR.NODE_ELEMENT&&!e.is(g)?!1:!0}}function c(a){var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(1);return function(d){return c(d)||b(d)?!0:!a&&k(d)||d.type==CKEDITOR.NODE_ELEMENT&&d.is(CKEDITOR.dtd.$removeEmpty)}}function e(a){return function(){var b;return this[a? +"getPreviousNode":"getNextNode"](function(a){!b&&r(a)&&(b=a);return p(a)&&!(k(a)&&a.equals(b))})}}var g={abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,"var":1},k=CKEDITOR.dom.walker.bogus(),h=/^[\t\r\n ]*(?: |\xa0)$/,p=CKEDITOR.dom.walker.editable(),r=CKEDITOR.dom.walker.ignored(!0);CKEDITOR.dom.range.prototype={clone:function(){var a=new CKEDITOR.dom.range(this.root);a._setStartContainer(this.startContainer); +a.startOffset=this.startOffset;a._setEndContainer(this.endContainer);a.endOffset=this.endOffset;a.collapsed=this.collapsed;return a},collapse:function(a){a?(this._setEndContainer(this.startContainer),this.endOffset=this.startOffset):(this._setStartContainer(this.endContainer),this.startOffset=this.endOffset);this.collapsed=!0},cloneContents:function(a){var b=new CKEDITOR.dom.documentFragment(this.document);this.collapsed||d(this,2,b,!1,"undefined"==typeof a?!0:a);return b},deleteContents:function(a){this.collapsed|| +d(this,0,null,a)},extractContents:function(a,b){var c=new CKEDITOR.dom.documentFragment(this.document);this.collapsed||d(this,1,c,a,"undefined"==typeof b?!0:b);return c},createBookmark:function(a){var b,c,d,e,m=this.collapsed;b=this.document.createElement("span");b.data("cke-bookmark",1);b.setStyle("display","none");b.setHtml("\x26nbsp;");a&&(d="cke_bm_"+CKEDITOR.tools.getNextNumber(),b.setAttribute("id",d+(m?"C":"S")));m||(c=b.clone(),c.setHtml("\x26nbsp;"),a&&c.setAttribute("id",d+"E"),e=this.clone(), +e.collapse(),e.insertNode(c));e=this.clone();e.collapse(!0);e.insertNode(b);c?(this.setStartAfter(b),this.setEndBefore(c)):this.moveToPosition(b,CKEDITOR.POSITION_AFTER_END);return{startNode:a?d+(m?"C":"S"):b,endNode:a?d+"E":c,serializable:a,collapsed:m}},createBookmark2:function(){function a(b){var f=b.container,d=b.offset,e;e=f;var g=d;e=e.type!=CKEDITOR.NODE_ELEMENT||0===g||g==e.getChildCount()?0:e.getChild(g-1).type==CKEDITOR.NODE_TEXT&&e.getChild(g).type==CKEDITOR.NODE_TEXT;e&&(f=f.getChild(d- +1),d=f.getLength());if(f.type==CKEDITOR.NODE_ELEMENT&&0=a.offset&&(a.offset=d.getIndex(),a.container=d.getParent()))}}var c=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_TEXT,!0);return function(c){var d=this.collapsed,e={container:this.startContainer,offset:this.startOffset},g={container:this.endContainer,offset:this.endOffset};c&&(a(e),b(e,this.root),d||(a(g),b(g,this.root)));return{start:e.container.getAddress(c),end:d?null:g.container.getAddress(c), +startOffset:e.offset,endOffset:g.offset,normalized:c,collapsed:d,is2:!0}}}(),moveToBookmark:function(a){if(a.is2){var b=this.document.getByAddress(a.start,a.normalized),c=a.startOffset,d=a.end&&this.document.getByAddress(a.end,a.normalized);a=a.endOffset;this.setStart(b,c);d?this.setEnd(d,a):this.collapse(!0)}else b=(c=a.serializable)?this.document.getById(a.startNode):a.startNode,a=c?this.document.getById(a.endNode):a.endNode,this.setStartBefore(b),b.remove(),a?(this.setEndBefore(a),a.remove()): +this.collapse(!0)},getBoundaryNodes:function(){var a=this.startContainer,b=this.endContainer,c=this.startOffset,d=this.endOffset,e;if(a.type==CKEDITOR.NODE_ELEMENT)if(e=a.getChildCount(),e>c)a=a.getChild(c);else if(1>e)a=a.getPreviousSourceNode();else{for(a=a.$;a.lastChild;)a=a.lastChild;a=new CKEDITOR.dom.node(a);a=a.getNextSourceNode()||a}if(b.type==CKEDITOR.NODE_ELEMENT)if(e=b.getChildCount(),e>d)b=b.getChild(d).getPreviousSourceNode(!0);else if(1>e)b=b.getPreviousSourceNode();else{for(b=b.$;b.lastChild;)b= +b.lastChild;b=new CKEDITOR.dom.node(b)}a.getPosition(b)&CKEDITOR.POSITION_FOLLOWING&&(a=b);return{startNode:a,endNode:b}},getCommonAncestor:function(a,b){var c=this.startContainer,d=this.endContainer,c=c.equals(d)?a&&c.type==CKEDITOR.NODE_ELEMENT&&this.startOffset==this.endOffset-1?c.getChild(this.startOffset):c:c.getCommonAncestor(d);return b&&!c.is?c.getParent():c},optimize:function(){var a=this.startContainer,b=this.startOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=a.getLength()&&this.setStartAfter(a): +this.setStartBefore(a));a=this.endContainer;b=this.endOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=a.getLength()&&this.setEndAfter(a):this.setEndBefore(a))},optimizeBookmark:function(){var a=this.startContainer,b=this.endContainer;a.is&&a.is("span")&&a.data("cke-bookmark")&&this.setStartAt(a,CKEDITOR.POSITION_BEFORE_START);b&&b.is&&b.is("span")&&b.data("cke-bookmark")&&this.setEndAt(b,CKEDITOR.POSITION_AFTER_END)},trim:function(a,b){var c=this.startContainer,d=this.startOffset,e=this.collapsed;if((!a|| +e)&&c&&c.type==CKEDITOR.NODE_TEXT){if(d)if(d>=c.getLength())d=c.getIndex()+1,c=c.getParent();else{var m=c.split(d),d=c.getIndex()+1,c=c.getParent();this.startContainer.equals(this.endContainer)?this.setEnd(m,this.endOffset-this.startOffset):c.equals(this.endContainer)&&(this.endOffset+=1)}else d=c.getIndex(),c=c.getParent();this.setStart(c,d);if(e){this.collapse(!0);return}}c=this.endContainer;d=this.endOffset;b||e||!c||c.type!=CKEDITOR.NODE_TEXT||(d?(d>=c.getLength()||c.split(d),d=c.getIndex()+1): +d=c.getIndex(),c=c.getParent(),this.setEnd(c,d))},enlarge:function(a,b){function c(a){return a&&a.type==CKEDITOR.NODE_ELEMENT&&a.hasAttribute("contenteditable")?null:a}var d=new RegExp(/[^\s\ufeff]/);switch(a){case CKEDITOR.ENLARGE_INLINE:var e=1;case CKEDITOR.ENLARGE_ELEMENT:var m=function(a,b){var c=new CKEDITOR.dom.range(h);c.setStart(a,b);c.setEndAt(h,CKEDITOR.POSITION_BEFORE_END);var c=new CKEDITOR.dom.walker(c),f;for(c.guard=function(a){return!(a.type==CKEDITOR.NODE_ELEMENT&&a.isBlockBoundary())};f= +c.next();){if(f.type!=CKEDITOR.NODE_TEXT)return!1;C=f!=a?f.getText():f.substring(b);if(d.test(C))return!1}return!0};if(this.collapsed)break;var g=this.getCommonAncestor(),h=this.root,k,r,l,q,n,t=!1,A,C;A=this.startContainer;var D=this.startOffset;A.type==CKEDITOR.NODE_TEXT?(D&&(A=!CKEDITOR.tools.trim(A.substring(0,D)).length&&A,t=!!A),A&&((q=A.getPrevious())||(l=A.getParent()))):(D&&(q=A.getChild(D-1)||A.getLast()),q||(l=A));for(l=c(l);l||q;){if(l&&!q){!n&&l.equals(g)&&(n=!0);if(e?l.isBlockBoundary(): +!h.contains(l))break;t&&"inline"==l.getComputedStyle("display")||(t=!1,n?k=l:this.setStartBefore(l));q=l.getPrevious()}for(;q;)if(A=!1,q.type==CKEDITOR.NODE_COMMENT)q=q.getPrevious();else{if(q.type==CKEDITOR.NODE_TEXT)C=q.getText(),d.test(C)&&(q=null),A=/[\s\ufeff]$/.test(C);else if((q.$.offsetWidth>(CKEDITOR.env.webkit?1:0)||b&&q.is("br"))&&!q.data("cke-bookmark"))if(t&&CKEDITOR.dtd.$removeEmpty[q.getName()]){C=q.getText();if(d.test(C))q=null;else for(var D=q.$.getElementsByTagName("*"),M=0,H;H= +D[M++];)if(!CKEDITOR.dtd.$removeEmpty[H.nodeName.toLowerCase()]){q=null;break}q&&(A=!!C.length)}else q=null;A&&(t?n?k=l:l&&this.setStartBefore(l):t=!0);if(q){A=q.getPrevious();if(!l&&!A){l=q;q=null;break}q=A}else l=null}l&&(l=c(l.getParent()))}A=this.endContainer;D=this.endOffset;l=q=null;n=t=!1;A.type==CKEDITOR.NODE_TEXT?CKEDITOR.tools.trim(A.substring(D)).length?t=!0:(t=!A.getLength(),D==A.getLength()?(q=A.getNext())||(l=A.getParent()):m(A,D)&&(l=A.getParent())):(q=A.getChild(D))||(l=A);for(;l|| +q;){if(l&&!q){!n&&l.equals(g)&&(n=!0);if(e?l.isBlockBoundary():!h.contains(l))break;t&&"inline"==l.getComputedStyle("display")||(t=!1,n?r=l:l&&this.setEndAfter(l));q=l.getNext()}for(;q;){A=!1;if(q.type==CKEDITOR.NODE_TEXT)C=q.getText(),m(q,0)||(q=null),A=/^[\s\ufeff]/.test(C);else if(q.type==CKEDITOR.NODE_ELEMENT){if((0=e.getLength()?d.setStartAfter(e):(d.setStartBefore(e),k=0):d.setStartBefore(e));m&&m.type==CKEDITOR.NODE_TEXT&&(h?h>=m.getLength()?d.setEndAfter(m): +(d.setEndAfter(m),r=0):d.setEndBefore(m));var d=new CKEDITOR.dom.walker(d),l=CKEDITOR.dom.walker.bookmark();d.evaluator=function(b){return b.type==(a==CKEDITOR.SHRINK_ELEMENT?CKEDITOR.NODE_ELEMENT:CKEDITOR.NODE_TEXT)};var q;d.guard=function(b,d){if(l(b))return!0;if(a==CKEDITOR.SHRINK_ELEMENT&&b.type==CKEDITOR.NODE_TEXT||d&&b.equals(q)||!1===c&&b.type==CKEDITOR.NODE_ELEMENT&&b.isBlockBoundary()||b.type==CKEDITOR.NODE_ELEMENT&&b.hasAttribute("contenteditable"))return!1;d||b.type!=CKEDITOR.NODE_ELEMENT|| +(q=b);return!0};k&&(e=d[a==CKEDITOR.SHRINK_ELEMENT?"lastForward":"next"]())&&this.setStartAt(e,b?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_START);r&&(d.reset(),(d=d[a==CKEDITOR.SHRINK_ELEMENT?"lastBackward":"previous"]())&&this.setEndAt(d,b?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_END));return!(!k&&!r)}},insertNode:function(a){this.optimizeBookmark();this.trim(!1,!0);var b=this.startContainer,c=b.getChild(this.startOffset);c?a.insertBefore(c):b.append(a);a.getParent()&&a.getParent().equals(this.endContainer)&& +this.endOffset++;this.setStartBefore(a)},moveToPosition:function(a,b){this.setStartAt(a,b);this.collapse(!0)},moveToRange:function(a){this.setStart(a.startContainer,a.startOffset);this.setEnd(a.endContainer,a.endOffset)},selectNodeContents:function(a){this.setStart(a,0);this.setEnd(a,a.type==CKEDITOR.NODE_TEXT?a.getLength():a.getChildCount())},setStart:function(b,c){b.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[b.getName()]&&(c=b.getIndex(),b=b.getParent());this._setStartContainer(b);this.startOffset= +c;this.endContainer||(this._setEndContainer(b),this.endOffset=c);a(this)},setEnd:function(b,c){b.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[b.getName()]&&(c=b.getIndex()+1,b=b.getParent());this._setEndContainer(b);this.endOffset=c;this.startContainer||(this._setStartContainer(b),this.startOffset=c);a(this)},setStartAfter:function(a){this.setStart(a.getParent(),a.getIndex()+1)},setStartBefore:function(a){this.setStart(a.getParent(),a.getIndex())},setEndAfter:function(a){this.setEnd(a.getParent(), +a.getIndex()+1)},setEndBefore:function(a){this.setEnd(a.getParent(),a.getIndex())},setStartAt:function(b,c){switch(c){case CKEDITOR.POSITION_AFTER_START:this.setStart(b,0);break;case CKEDITOR.POSITION_BEFORE_END:b.type==CKEDITOR.NODE_TEXT?this.setStart(b,b.getLength()):this.setStart(b,b.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setStartBefore(b);break;case CKEDITOR.POSITION_AFTER_END:this.setStartAfter(b)}a(this)},setEndAt:function(b,c){switch(c){case CKEDITOR.POSITION_AFTER_START:this.setEnd(b, +0);break;case CKEDITOR.POSITION_BEFORE_END:b.type==CKEDITOR.NODE_TEXT?this.setEnd(b,b.getLength()):this.setEnd(b,b.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setEndBefore(b);break;case CKEDITOR.POSITION_AFTER_END:this.setEndAfter(b)}a(this)},fixBlock:function(a,b){var c=this.createBookmark(),d=this.document.createElement(b);this.collapse(a);this.enlarge(CKEDITOR.ENLARGE_BLOCK_CONTENTS);this.extractContents().appendTo(d);d.trim();this.insertNode(d);var e=d.getBogus();e&&e.remove(); +d.appendBogus();this.moveToBookmark(c);return d},splitBlock:function(a,b){var c=new CKEDITOR.dom.elementPath(this.startContainer,this.root),d=new CKEDITOR.dom.elementPath(this.endContainer,this.root),e=c.block,m=d.block,g=null;if(!c.blockLimit.equals(d.blockLimit))return null;"br"!=a&&(e||(e=this.fixBlock(!0,a),m=(new CKEDITOR.dom.elementPath(this.endContainer,this.root)).block),m||(m=this.fixBlock(!1,a)));c=e&&this.checkStartOfBlock();d=m&&this.checkEndOfBlock();this.deleteContents();e&&e.equals(m)&& +(d?(g=new CKEDITOR.dom.elementPath(this.startContainer,this.root),this.moveToPosition(m,CKEDITOR.POSITION_AFTER_END),m=null):c?(g=new CKEDITOR.dom.elementPath(this.startContainer,this.root),this.moveToPosition(e,CKEDITOR.POSITION_BEFORE_START),e=null):(m=this.splitElement(e,b||!1),e.is("ul","ol")||e.appendBogus()));return{previousBlock:e,nextBlock:m,wasStartOfBlock:c,wasEndOfBlock:d,elementPath:g}},splitElement:function(a,b){if(!this.collapsed)return null;this.setEndAt(a,CKEDITOR.POSITION_BEFORE_END); +var c=this.extractContents(!1,b||!1),d=a.clone(!1,b||!1);c.appendTo(d);d.insertAfter(a);this.moveToPosition(a,CKEDITOR.POSITION_AFTER_END);return d},removeEmptyBlocksAtEnd:function(){function a(d){return function(a){return b(a)||c(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.isEmptyInlineRemoveable()||d.is("table")&&a.is("caption")?!1:!0}}var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(!1);return function(b){for(var c=this.createBookmark(),d=this[b?"endPath":"startPath"](),e=d.block|| +d.blockLimit,g;e&&!e.equals(d.root)&&!e.getFirst(a(e));)g=e.getParent(),this[b?"setEndAt":"setStartAt"](e,CKEDITOR.POSITION_AFTER_END),e.remove(1),e=g;this.moveToBookmark(c)}}(),startPath:function(){return new CKEDITOR.dom.elementPath(this.startContainer,this.root)},endPath:function(){return new CKEDITOR.dom.elementPath(this.endContainer,this.root)},checkBoundaryOfElement:function(a,b){var d=b==CKEDITOR.START,e=this.clone();e.collapse(d);e[d?"setStartAt":"setEndAt"](a,d?CKEDITOR.POSITION_AFTER_START: +CKEDITOR.POSITION_BEFORE_END);e=new CKEDITOR.dom.walker(e);e.evaluator=c(d);return e[d?"checkBackward":"checkForward"]()},checkStartOfBlock:function(){var a=this.startContainer,c=this.startOffset;CKEDITOR.env.ie&&c&&a.type==CKEDITOR.NODE_TEXT&&(a=CKEDITOR.tools.ltrim(a.substring(0,c)),h.test(a)&&this.trim(0,1));this.trim();a=new CKEDITOR.dom.elementPath(this.startContainer,this.root);c=this.clone();c.collapse(!0);c.setStartAt(a.block||a.blockLimit,CKEDITOR.POSITION_AFTER_START);a=new CKEDITOR.dom.walker(c); +a.evaluator=b();return a.checkBackward()},checkEndOfBlock:function(){var a=this.endContainer,c=this.endOffset;CKEDITOR.env.ie&&a.type==CKEDITOR.NODE_TEXT&&(a=CKEDITOR.tools.rtrim(a.substring(c)),h.test(a)&&this.trim(1,0));this.trim();a=new CKEDITOR.dom.elementPath(this.endContainer,this.root);c=this.clone();c.collapse(!1);c.setEndAt(a.block||a.blockLimit,CKEDITOR.POSITION_BEFORE_END);a=new CKEDITOR.dom.walker(c);a.evaluator=b();return a.checkForward()},getPreviousNode:function(a,b,c){var d=this.clone(); +d.collapse(1);d.setStartAt(c||this.root,CKEDITOR.POSITION_AFTER_START);c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.previous()},getNextNode:function(a,b,c){var d=this.clone();d.collapse();d.setEndAt(c||this.root,CKEDITOR.POSITION_BEFORE_END);c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.next()},checkReadOnly:function(){function a(b,c){for(;b;){if(b.type==CKEDITOR.NODE_ELEMENT){if("false"==b.getAttribute("contentEditable")&&!b.data("cke-editable"))return 0;if(b.is("html")|| +"true"==b.getAttribute("contentEditable")&&(b.contains(c)||b.equals(c)))break}b=b.getParent()}return 1}return function(){var b=this.startContainer,c=this.endContainer;return!(a(b,c)&&a(c,b))}}(),moveToElementEditablePosition:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&!a.isEditable(!1))return this.moveToPosition(a,b?CKEDITOR.POSITION_AFTER_END:CKEDITOR.POSITION_BEFORE_START),!0;for(var c=0;a;){if(a.type==CKEDITOR.NODE_TEXT){b&&this.endContainer&&this.checkEndOfBlock()&&h.test(a.getText())?this.moveToPosition(a, +CKEDITOR.POSITION_BEFORE_START):this.moveToPosition(a,b?CKEDITOR.POSITION_AFTER_END:CKEDITOR.POSITION_BEFORE_START);c=1;break}if(a.type==CKEDITOR.NODE_ELEMENT)if(a.isEditable())this.moveToPosition(a,b?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_START),c=1;else if(b&&a.is("br")&&this.endContainer&&this.checkEndOfBlock())this.moveToPosition(a,CKEDITOR.POSITION_BEFORE_START);else if("false"==a.getAttribute("contenteditable")&&a.is(CKEDITOR.dtd.$block))return this.setStartBefore(a),this.setEndAfter(a), +!0;var d=a,e=c,m=void 0;d.type==CKEDITOR.NODE_ELEMENT&&d.isEditable(!1)&&(m=d[b?"getLast":"getFirst"](r));e||m||(m=d[b?"getPrevious":"getNext"](r));a=m}return!!c},moveToClosestEditablePosition:function(a,b){var c,d=0,e,m,g=[CKEDITOR.POSITION_AFTER_END,CKEDITOR.POSITION_BEFORE_START];a?(c=new CKEDITOR.dom.range(this.root),c.moveToPosition(a,g[b?0:1])):c=this.clone();if(a&&!a.is(CKEDITOR.dtd.$block))d=1;else if(e=c[b?"getNextEditableNode":"getPreviousEditableNode"]())d=1,(m=e.type==CKEDITOR.NODE_ELEMENT)&& +e.is(CKEDITOR.dtd.$block)&&"false"==e.getAttribute("contenteditable")?(c.setStartAt(e,CKEDITOR.POSITION_BEFORE_START),c.setEndAt(e,CKEDITOR.POSITION_AFTER_END)):!CKEDITOR.env.needsBrFiller&&m&&e.is(CKEDITOR.dom.walker.validEmptyBlockContainers)?(c.setEnd(e,0),c.collapse()):c.moveToPosition(e,g[b?1:0]);d&&this.moveToRange(c);return!!d},moveToElementEditStart:function(a){return this.moveToElementEditablePosition(a)},moveToElementEditEnd:function(a){return this.moveToElementEditablePosition(a,!0)},getEnclosedNode:function(){var a= +this.clone();a.optimize();if(a.startContainer.type!=CKEDITOR.NODE_ELEMENT||a.endContainer.type!=CKEDITOR.NODE_ELEMENT)return null;var a=new CKEDITOR.dom.walker(a),b=CKEDITOR.dom.walker.bookmark(!1,!0),c=CKEDITOR.dom.walker.whitespaces(!0);a.evaluator=function(a){return c(a)&&b(a)};var d=a.next();a.reset();return d&&d.equals(a.previous())?d:null},getTouchedStartNode:function(){var a=this.startContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.startOffset)||a},getTouchedEndNode:function(){var a= +this.endContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.endOffset-1)||a},getNextEditableNode:e(),getPreviousEditableNode:e(1),scrollIntoView:function(){var a=new CKEDITOR.dom.element.createFromHtml("\x3cspan\x3e\x26nbsp;\x3c/span\x3e",this.document),b,c,d,e=this.clone();e.optimize();(d=e.startContainer.type==CKEDITOR.NODE_TEXT)?(c=e.startContainer.getText(),b=e.startContainer.split(e.startOffset),a.insertAfter(e.startContainer)):e.insertNode(a);a.scrollIntoView(); +d&&(e.startContainer.setText(c),b.remove());a.remove()},_setStartContainer:function(a){this.startContainer=a},_setEndContainer:function(a){this.endContainer=a},_find:function(a,b){var c=this.getCommonAncestor(),d=this.getBoundaryNodes(),e=[],m,g,h,k;if(c&&c.find)for(g=c.find(a),m=0;marguments.length||(this.range=a,this.forceBrBreak=0,this.enlargeBr=1,this.enforceRealBlocks=0,this._||(this._={}))}function d(a){var b=[];a.forEach(function(a){if("true"==a.getAttribute("contenteditable"))return b.push(a),!1},CKEDITOR.NODE_ELEMENT,!0);return b}function b(a,c,e,g){a:{null==g&&(g=d(e));for(var h;h=g.shift();)if(h.getDtd().p){g={element:h,remaining:g};break a}g=null}if(!g)return 0;if((h=CKEDITOR.filter.instances[g.element.data("cke-filter")])&&!h.check(c))return b(a, +c,e,g.remaining);c=new CKEDITOR.dom.range(g.element);c.selectNodeContents(g.element);c=c.createIterator();c.enlargeBr=a.enlargeBr;c.enforceRealBlocks=a.enforceRealBlocks;c.activeFilter=c.filter=h;a._.nestedEditable={element:g.element,container:e,remaining:g.remaining,iterator:c};return 1}function c(a,b,c){if(!b)return!1;a=a.clone();a.collapse(!c);return a.checkBoundaryOfElement(b,c?CKEDITOR.START:CKEDITOR.END)}var e=/^[\r\n\t ]+$/,g=CKEDITOR.dom.walker.bookmark(!1,!0),k=CKEDITOR.dom.walker.whitespaces(!0), +h=function(a){return g(a)&&k(a)},p={dd:1,dt:1,li:1};a.prototype={getNextParagraph:function(a){var d,k,u,z,y;a=a||"p";if(this._.nestedEditable){if(d=this._.nestedEditable.iterator.getNextParagraph(a))return this.activeFilter=this._.nestedEditable.iterator.activeFilter,d;this.activeFilter=this.filter;if(b(this,a,this._.nestedEditable.container,this._.nestedEditable.remaining))return this.activeFilter=this._.nestedEditable.iterator.activeFilter,this._.nestedEditable.iterator.getNextParagraph(a);this._.nestedEditable= +null}if(!this.range.root.getDtd()[a])return null;if(!this._.started){var m=this.range.clone();k=m.startPath();var x=m.endPath(),J=!m.collapsed&&c(m,k.block),w=!m.collapsed&&c(m,x.block,1);m.shrink(CKEDITOR.SHRINK_ELEMENT,!0);J&&m.setStartAt(k.block,CKEDITOR.POSITION_BEFORE_END);w&&m.setEndAt(x.block,CKEDITOR.POSITION_AFTER_START);k=m.endContainer.hasAscendant("pre",!0)||m.startContainer.hasAscendant("pre",!0);m.enlarge(this.forceBrBreak&&!k||!this.enlargeBr?CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:CKEDITOR.ENLARGE_BLOCK_CONTENTS); +m.collapsed||(k=new CKEDITOR.dom.walker(m.clone()),x=CKEDITOR.dom.walker.bookmark(!0,!0),k.evaluator=x,this._.nextNode=k.next(),k=new CKEDITOR.dom.walker(m.clone()),k.evaluator=x,k=k.previous(),this._.lastNode=k.getNextSourceNode(!0,null,m.root),this._.lastNode&&this._.lastNode.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(this._.lastNode.getText())&&this._.lastNode.getParent().isBlockBoundary()&&(x=this.range.clone(),x.moveToPosition(this._.lastNode,CKEDITOR.POSITION_AFTER_END),x.checkEndOfBlock()&& +(x=new CKEDITOR.dom.elementPath(x.endContainer,x.root),this._.lastNode=(x.block||x.blockLimit).getNextSourceNode(!0))),this._.lastNode&&m.root.contains(this._.lastNode)||(this._.lastNode=this._.docEndMarker=m.document.createText(""),this._.lastNode.insertAfter(k)),m=null);this._.started=1;k=m}x=this._.nextNode;m=this._.lastNode;for(this._.nextNode=null;x;){var J=0,w=x.hasAscendant("pre"),F=x.type!=CKEDITOR.NODE_ELEMENT,l=0;if(F)x.type==CKEDITOR.NODE_TEXT&&e.test(x.getText())&&(F=0);else{var q=x.getName(); +if(CKEDITOR.dtd.$block[q]&&"false"==x.getAttribute("contenteditable")){d=x;b(this,a,d);break}else if(x.isBlockBoundary(this.forceBrBreak&&!w&&{br:1})){if("br"==q)F=1;else if(!k&&!x.getChildCount()&&"hr"!=q){d=x;u=x.equals(m);break}k&&(k.setEndAt(x,CKEDITOR.POSITION_BEFORE_START),"br"!=q&&(this._.nextNode=x));J=1}else{if(x.getFirst()){k||(k=this.range.clone(),k.setStartAt(x,CKEDITOR.POSITION_BEFORE_START));x=x.getFirst();continue}F=1}}F&&!k&&(k=this.range.clone(),k.setStartAt(x,CKEDITOR.POSITION_BEFORE_START)); +u=(!J||F)&&x.equals(m);if(k&&!J)for(;!x.getNext(h)&&!u;){q=x.getParent();if(q.isBlockBoundary(this.forceBrBreak&&!w&&{br:1})){J=1;F=0;u||q.equals(m);k.setEndAt(q,CKEDITOR.POSITION_BEFORE_END);break}x=q;F=1;u=x.equals(m);l=1}F&&k.setEndAt(x,CKEDITOR.POSITION_AFTER_END);x=this._getNextSourceNode(x,l,m);if((u=!x)||J&&k)break}if(!d){if(!k)return this._.docEndMarker&&this._.docEndMarker.remove(),this._.nextNode=null;d=new CKEDITOR.dom.elementPath(k.startContainer,k.root);x=d.blockLimit;J={div:1,th:1,td:1}; +d=d.block;!d&&x&&!this.enforceRealBlocks&&J[x.getName()]&&k.checkStartOfBlock()&&k.checkEndOfBlock()&&!x.equals(k.root)?d=x:!d||this.enforceRealBlocks&&d.is(p)?(d=this.range.document.createElement(a),k.extractContents().appendTo(d),d.trim(),k.insertNode(d),z=y=!0):"li"!=d.getName()?k.checkStartOfBlock()&&k.checkEndOfBlock()||(d=d.clone(!1),k.extractContents().appendTo(d),d.trim(),y=k.splitBlock(),z=!y.wasStartOfBlock,y=!y.wasEndOfBlock,k.insertNode(d)):u||(this._.nextNode=d.equals(m)?null:this._getNextSourceNode(k.getBoundaryNodes().endNode, +1,m))}z&&(z=d.getPrevious())&&z.type==CKEDITOR.NODE_ELEMENT&&("br"==z.getName()?z.remove():z.getLast()&&"br"==z.getLast().$.nodeName.toLowerCase()&&z.getLast().remove());y&&(z=d.getLast())&&z.type==CKEDITOR.NODE_ELEMENT&&"br"==z.getName()&&(!CKEDITOR.env.needsBrFiller||z.getPrevious(g)||z.getNext(g))&&z.remove();this._.nextNode||(this._.nextNode=u||d.equals(m)||!m?null:this._getNextSourceNode(d,1,m));return d},_getNextSourceNode:function(a,b,c){function d(a){return!(a.equals(c)||a.equals(e))}var e= +this.range.root;for(a=a.getNextSourceNode(b,null,d);!g(a);)a=a.getNextSourceNode(b,null,d);return a}};CKEDITOR.dom.range.prototype.createIterator=function(){return new a(this)}})(); +CKEDITOR.command=function(a,d){this.uiItems=[];this.exec=function(b){if(this.state==CKEDITOR.TRISTATE_DISABLED||!this.checkAllowed())return!1;this.editorFocus&&a.focus();return!1===this.fire("exec")?!0:!1!==d.exec.call(this,a,b)};this.refresh=function(a,b){if(!this.readOnly&&a.readOnly)return!0;if(this.context&&!b.isContextFor(this.context)||!this.checkAllowed(!0))return this.disable(),!0;this.startDisabled||this.enable();this.modes&&!this.modes[a.mode]&&this.disable();return!1===this.fire("refresh", +{editor:a,path:b})?!0:d.refresh&&!1!==d.refresh.apply(this,arguments)};var b;this.checkAllowed=function(c){return c||"boolean"!=typeof b?b=a.activeFilter.checkFeature(this):b};CKEDITOR.tools.extend(this,d,{modes:{wysiwyg:1},editorFocus:1,contextSensitive:!!d.context,state:CKEDITOR.TRISTATE_DISABLED});CKEDITOR.event.call(this)}; +CKEDITOR.command.prototype={enable:function(){this.state==CKEDITOR.TRISTATE_DISABLED&&this.checkAllowed()&&this.setState(this.preserveState&&"undefined"!=typeof this.previousState?this.previousState:CKEDITOR.TRISTATE_OFF)},disable:function(){this.setState(CKEDITOR.TRISTATE_DISABLED)},setState:function(a){if(this.state==a||a!=CKEDITOR.TRISTATE_DISABLED&&!this.checkAllowed())return!1;this.previousState=this.state;this.state=a;this.fire("state");return!0},toggleState:function(){this.state==CKEDITOR.TRISTATE_OFF? +this.setState(CKEDITOR.TRISTATE_ON):this.state==CKEDITOR.TRISTATE_ON&&this.setState(CKEDITOR.TRISTATE_OFF)}};CKEDITOR.event.implementOn(CKEDITOR.command.prototype);CKEDITOR.ENTER_P=1;CKEDITOR.ENTER_BR=2;CKEDITOR.ENTER_DIV=3; +CKEDITOR.config={customConfig:"config.js",autoUpdateElement:!0,language:"",defaultLanguage:"en",contentsLangDirection:"",enterMode:CKEDITOR.ENTER_P,forceEnterMode:!1,shiftEnterMode:CKEDITOR.ENTER_BR,docType:"\x3c!DOCTYPE html\x3e",bodyId:"",bodyClass:"",fullPage:!1,height:200,contentsCss:CKEDITOR.getUrl("contents.css"),extraPlugins:"",removePlugins:"",protectedSource:[],tabIndex:0,width:"",baseFloatZIndex:1E4,blockedKeystrokes:[CKEDITOR.CTRL+66,CKEDITOR.CTRL+73,CKEDITOR.CTRL+85]}; +(function(){function a(a,b,c,d,l){var e,q;a=[];for(e in b){q=b[e];q="boolean"==typeof q?{}:"function"==typeof q?{match:q}:M(q);"$"!=e.charAt(0)&&(q.elements=e);c&&(q.featureName=c.toLowerCase());var n=q;n.elements=k(n.elements,/\s+/)||null;n.propertiesOnly=n.propertiesOnly||!0===n.elements;var f=/\s*,\s*/,t=void 0;for(t in Q){n[t]=k(n[t],f)||null;var m=n,g=P[t],E=k(n[P[t]],f),v=n[t],A=[],I=!0,C=void 0;E?I=!1:E={};for(C in v)"!"==C.charAt(0)&&(C=C.slice(1),A.push(C),E[C]=!0,I=!1);for(;C=A.pop();)v[C]= +v["!"+C],delete v["!"+C];m[g]=(I?!1:E)||null}n.match=n.match||null;d.push(q);a.push(q)}b=l.elements;l=l.generic;var h;c=0;for(d=a.length;c=--h&&(g&&CKEDITOR.document.getDocumentElement().removeStyle("cursor"),f(b))},u=function(b,c){a[b]=1;var e=d[b];delete d[b];for(var f=0;f=CKEDITOR.env.version||CKEDITOR.env.ie9Compat)?f.$.onreadystatechange=function(){if("loaded"==f.$.readyState||"complete"==f.$.readyState)f.$.onreadystatechange=null,u(b,!0)}:(f.$.onload=function(){setTimeout(function(){u(b,!0)},0)},f.$.onerror=function(){u(b,!1)}));f.appendTo(CKEDITOR.document.getHead())}}};g&&CKEDITOR.document.getDocumentElement().setStyle("cursor","wait");for(var y=0;y]+)>)|(?:!--([\S|\s]*?)--\x3e)|(?:([^\/\s>]+)((?:\s+[\w\-:.]+(?:\s*=\s*?(?:(?:"[^"]*")|(?:'[^']*')|[^\s"'\/>]+))?)*)[\S\s]*?(\/?)>))/g}}; +(function(){var a=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,d={checked:1,compact:1,declare:1,defer:1,disabled:1,ismap:1,multiple:1,nohref:1,noresize:1,noshade:1,nowrap:1,readonly:1,selected:1};CKEDITOR.htmlParser.prototype={onTagOpen:function(){},onTagClose:function(){},onText:function(){},onCDATA:function(){},onComment:function(){},parse:function(b){for(var c,e,g=0,k;c=this._.htmlPartsRegex.exec(b);){e=c.index;if(e>g)if(g=b.substring(g,e),k)k.push(g);else this.onText(g); +g=this._.htmlPartsRegex.lastIndex;if(e=c[1])if(e=e.toLowerCase(),k&&CKEDITOR.dtd.$cdata[e]&&(this.onCDATA(k.join("")),k=null),!k){this.onTagClose(e);continue}if(k)k.push(c[0]);else if(e=c[3]){if(e=e.toLowerCase(),!/="/.test(e)){var h={},p,r=c[4];c=!!c[5];if(r)for(;p=a.exec(r);){var f=p[1].toLowerCase();p=p[2]||p[3]||p[4]||"";h[f]=!p&&d[f]?f:CKEDITOR.tools.htmlDecodeAttr(p)}this.onTagOpen(e,h,c);!k&&CKEDITOR.dtd.$cdata[e]&&(k=[])}}else if(e=c[2])this.onComment(e)}if(b.length>g)this.onText(b.substring(g, +b.length))}}})(); +CKEDITOR.htmlParser.basicWriter=CKEDITOR.tools.createClass({$:function(){this._={output:[]}},proto:{openTag:function(a){this._.output.push("\x3c",a)},openTagClose:function(a,d){d?this._.output.push(" /\x3e"):this._.output.push("\x3e")},attribute:function(a,d){"string"==typeof d&&(d=CKEDITOR.tools.htmlEncodeAttr(d));this._.output.push(" ",a,'\x3d"',d,'"')},closeTag:function(a){this._.output.push("\x3c/",a,"\x3e")},text:function(a){this._.output.push(a)},comment:function(a){this._.output.push("\x3c!--",a, +"--\x3e")},write:function(a){this._.output.push(a)},reset:function(){this._.output=[];this._.indent=!1},getHtml:function(a){var d=this._.output.join("");a&&this.reset();return d}}});"use strict"; +(function(){CKEDITOR.htmlParser.node=function(){};CKEDITOR.htmlParser.node.prototype={remove:function(){var a=this.parent.children,d=CKEDITOR.tools.indexOf(a,this),b=this.previous,c=this.next;b&&(b.next=c);c&&(c.previous=b);a.splice(d,1);this.parent=null},replaceWith:function(a){var d=this.parent.children,b=CKEDITOR.tools.indexOf(d,this),c=a.previous=this.previous,e=a.next=this.next;c&&(c.next=a);e&&(e.previous=a);d[b]=a;a.parent=this.parent;this.parent=null},insertAfter:function(a){var d=a.parent.children, +b=CKEDITOR.tools.indexOf(d,a),c=a.next;d.splice(b+1,0,this);this.next=a.next;this.previous=a;a.next=this;c&&(c.previous=this);this.parent=a.parent},insertBefore:function(a){var d=a.parent.children,b=CKEDITOR.tools.indexOf(d,a);d.splice(b,0,this);this.next=a;(this.previous=a.previous)&&(a.previous.next=this);a.previous=this;this.parent=a.parent},getAscendant:function(a){var d="function"==typeof a?a:"string"==typeof a?function(b){return b.name==a}:function(b){return b.name in a},b=this.parent;for(;b&& +b.type==CKEDITOR.NODE_ELEMENT;){if(d(b))return b;b=b.parent}return null},wrapWith:function(a){this.replaceWith(a);a.add(this);return a},getIndex:function(){return CKEDITOR.tools.indexOf(this.parent.children,this)},getFilterContext:function(a){return a||{}}}})();"use strict";CKEDITOR.htmlParser.comment=function(a){this.value=a;this._={isBlockLike:!1}}; +CKEDITOR.htmlParser.comment.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_COMMENT,filter:function(a,d){var b=this.value;if(!(b=a.onComment(d,b,this)))return this.remove(),!1;if("string"!=typeof b)return this.replaceWith(b),!1;this.value=b;return!0},writeHtml:function(a,d){d&&this.filter(d);a.comment(this.value)}});"use strict"; +(function(){CKEDITOR.htmlParser.text=function(a){this.value=a;this._={isBlockLike:!1}};CKEDITOR.htmlParser.text.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_TEXT,filter:function(a,d){if(!(this.value=a.onText(d,this.value,this)))return this.remove(),!1},writeHtml:function(a,d){d&&this.filter(d);a.text(this.value)}})})();"use strict"; +(function(){CKEDITOR.htmlParser.cdata=function(a){this.value=a};CKEDITOR.htmlParser.cdata.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_TEXT,filter:function(){},writeHtml:function(a){a.write(this.value)}})})();"use strict";CKEDITOR.htmlParser.fragment=function(){this.children=[];this.parent=null;this._={isBlockLike:!0,hasInlineStarted:!1}}; +(function(){function a(a){return a.attributes["data-cke-survive"]?!1:"a"==a.name&&a.attributes.href||CKEDITOR.dtd.$removeEmpty[a.name]}var d=CKEDITOR.tools.extend({table:1,ul:1,ol:1,dl:1},CKEDITOR.dtd.table,CKEDITOR.dtd.ul,CKEDITOR.dtd.ol,CKEDITOR.dtd.dl),b={ol:1,ul:1},c=CKEDITOR.tools.extend({},{html:1},CKEDITOR.dtd.html,CKEDITOR.dtd.body,CKEDITOR.dtd.head,{style:1,script:1}),e={ul:"li",ol:"li",dl:"dd",table:"tbody",tbody:"tr",thead:"tr",tfoot:"tr",tr:"td"};CKEDITOR.htmlParser.fragment.fromHtml= +function(g,k,h){function p(a){var b;if(0k;k++)if(g=d[k]){g=g.exec(a,c,this);if(!1===g)return null;if(g&&g!=c)return this.onNode(a,g);if(c.parent&&!c.name)break}return c}, +onNode:function(a,c){var d=c.type;return d==CKEDITOR.NODE_ELEMENT?this.onElement(a,c):d==CKEDITOR.NODE_TEXT?new CKEDITOR.htmlParser.text(this.onText(a,c.value)):d==CKEDITOR.NODE_COMMENT?new CKEDITOR.htmlParser.comment(this.onComment(a,c.value)):null},onAttribute:function(a,c,d,g){return(d=this.attributesRules[d])?d.exec(a,g,c,this):g}}});CKEDITOR.htmlParser.filterRulesGroup=a;a.prototype={add:function(a,c,d){this.rules.splice(this.findIndex(c),0,{value:a,priority:c,options:d})},addMany:function(a, +c,d){for(var g=[this.findIndex(c),0],k=0,h=a.length;k/g,"\x26gt;")+"\x3c/textarea\x3e");return"\x3ccke:encoded\x3e"+encodeURIComponent(a)+"\x3c/cke:encoded\x3e"})}function B(a){return a.replace(Q,function(a,b){return decodeURIComponent(b)})}function u(a){return a.replace(/\x3c!--(?!{cke_protected})[\s\S]+?--\x3e/g, +function(a){return"\x3c!--"+J+"{C}"+encodeURIComponent(a).replace(/--/g,"%2D%2D")+"--\x3e"})}function z(a){return a.replace(/\x3c!--\{cke_protected\}\{C\}([\s\S]+?)--\x3e/g,function(a,b){return decodeURIComponent(b)})}function y(a,b){var c=b._.dataStore;return a.replace(/\x3c!--\{cke_protected\}([\s\S]+?)--\x3e/g,function(a,b){return decodeURIComponent(b)}).replace(/\{cke_protected_(\d+)\}/g,function(a,b){return c&&c[b]||""})}function m(a,b){var c=[],d=b.config.protectedSource,l=b._.dataStore||(b._.dataStore= +{id:1}),e=/<\!--\{cke_temp(comment)?\}(\d*?)--\x3e/g,d=[/|$)/gi,//gi,//gi].concat(d);a=a.replace(/\x3c!--[\s\S]*?--\x3e/g,function(a){return"\x3c!--{cke_tempcomment}"+(c.push(a)-1)+"--\x3e"});for(var f=0;f]+\s*=\s*(?:[^'"\s>]+|'[^']*'|"[^"]*"))|[^\s=\/>]+))+\s*\/?>/g,function(a){return a.replace(/\x3c!--\{cke_protected\}([^>]*)--\x3e/g,function(a,b){l[l.id]=decodeURIComponent(b);return"{cke_protected_"+l.id++ +"}"})});return a=a.replace(/<(title|iframe|textarea)([^>]*)>([\s\S]*?)<\/\1>/g,function(a,c,d,l){return"\x3c"+c+d+"\x3e"+y(z(l),b)+"\x3c/"+c+"\x3e"})}CKEDITOR.htmlDataProcessor=function(b){var c, +l,e=this;this.editor=b;this.dataFilter=c=new CKEDITOR.htmlParser.filter;this.htmlFilter=l=new CKEDITOR.htmlParser.filter;this.writer=new CKEDITOR.htmlParser.basicWriter;c.addRules(q);c.addRules(n,{applyToAll:!0});c.addRules(a(b,"data"),{applyToAll:!0});l.addRules(t);l.addRules(A,{applyToAll:!0});l.addRules(a(b,"html"),{applyToAll:!0});b.on("toHtml",function(a){a=a.data;var c=a.dataValue,l,c=m(c,b),c=f(c,R),c=r(c),c=f(c,H),c=c.replace(P,"$1cke:$2"),c=c.replace(G,"\x3ccke:$1$2\x3e\x3c/cke:$1\x3e"), +c=c.replace(/(]*>)(\r\n|\n)/g,"$1$2$2"),c=c.replace(/([^a-z0-9<\-])(on\w{3,})(?!>)/gi,"$1data-cke-"+CKEDITOR.rnd+"-$2");l=a.context||b.editable().getName();var e;CKEDITOR.env.ie&&9>CKEDITOR.env.version&&"pre"==l&&(l="div",c="\x3cpre\x3e"+c+"\x3c/pre\x3e",e=1);l=b.document.createElement(l);l.setHtml("a"+c);c=l.getHtml().substr(1);c=c.replace(new RegExp("data-cke-"+CKEDITOR.rnd+"-","ig"),"");e&&(c=c.replace(/^
|<\/pre>$/gi,""));c=c.replace(v,"$1$2");c=B(c);c=z(c);l=!1===a.fixForBody?!1:
+d(a.enterMode,b.config.autoParagraph);c=CKEDITOR.htmlParser.fragment.fromHtml(c,a.context,l);l&&(e=c,!e.children.length&&CKEDITOR.dtd[e.name][l]&&(l=new CKEDITOR.htmlParser.element(l),e.add(l)));a.dataValue=c},null,null,5);b.on("toHtml",function(a){a.data.filter.applyTo(a.data.dataValue,!0,a.data.dontFilter,a.data.enterMode)&&b.fire("dataFiltered")},null,null,6);b.on("toHtml",function(a){a.data.dataValue.filterChildren(e.dataFilter,!0)},null,null,10);b.on("toHtml",function(a){a=a.data;var b=a.dataValue,
+c=new CKEDITOR.htmlParser.basicWriter;b.writeChildrenHtml(c);b=c.getHtml(!0);a.dataValue=u(b)},null,null,15);b.on("toDataFormat",function(a){var c=a.data.dataValue;a.data.enterMode!=CKEDITOR.ENTER_BR&&(c=c.replace(/^
/i,""));a.data.dataValue=CKEDITOR.htmlParser.fragment.fromHtml(c,a.data.context,d(a.data.enterMode,b.config.autoParagraph))},null,null,5);b.on("toDataFormat",function(a){a.data.dataValue.filterChildren(e.htmlFilter,!0)},null,null,10);b.on("toDataFormat",function(a){a.data.filter.applyTo(a.data.dataValue, +!1,!0)},null,null,11);b.on("toDataFormat",function(a){var c=a.data.dataValue,d=e.writer;d.reset();c.writeChildrenHtml(d);c=d.getHtml(!0);c=z(c);c=y(c,b);a.data.dataValue=c},null,null,15)};CKEDITOR.htmlDataProcessor.prototype={toHtml:function(a,b,c,d){var l=this.editor,e,f,n,q;b&&"object"==typeof b?(e=b.context,c=b.fixForBody,d=b.dontFilter,f=b.filter,n=b.enterMode,q=b.protectedWhitespaces):e=b;e||null===e||(e=l.editable().getName());return l.fire("toHtml",{dataValue:a,context:e,fixForBody:c,dontFilter:d, +filter:f||l.filter,enterMode:n||l.enterMode,protectedWhitespaces:q}).dataValue},toDataFormat:function(a,b){var c,d,l;b&&(c=b.context,d=b.filter,l=b.enterMode);c||null===c||(c=this.editor.editable().getName());return this.editor.fire("toDataFormat",{dataValue:a,filter:d||this.editor.filter,context:c,enterMode:l||this.editor.enterMode}).dataValue}};var x=/(?: |\xa0)$/,J="{cke_protected}",w=CKEDITOR.dtd,F="caption colgroup col thead tfoot tbody".split(" "),l=CKEDITOR.tools.extend({},w.$blockLimit, +w.$block),q={elements:{input:h,textarea:h}},n={attributeNames:[[/^on/,"data-cke-pa-on"],[/^data-cke-expando$/,""]]},t={elements:{embed:function(a){var b=a.parent;if(b&&"object"==b.name){var c=b.attributes.width,b=b.attributes.height;c&&(a.attributes.width=c);b&&(a.attributes.height=b)}},a:function(a){var b=a.attributes;if(!(a.children.length||b.name||b.id||a.attributes["data-cke-saved-name"]))return!1}}},A={elementNames:[[/^cke:/,""],[/^\?xml:namespace$/,""]],attributeNames:[[/^data-cke-(saved|pa)-/, +""],[/^data-cke-.*/,""],["hidefocus",""]],elements:{$:function(a){var b=a.attributes;if(b){if(b["data-cke-temp"])return!1;for(var c=["name","href","src"],d,l=0;ld? +1:-1})},param:function(a){a.children=[];a.isEmpty=!0;return a},span:function(a){"Apple-style-span"==a.attributes["class"]&&delete a.name},html:function(a){delete a.attributes.contenteditable;delete a.attributes["class"]},body:function(a){delete a.attributes.spellcheck;delete a.attributes.contenteditable},style:function(a){var b=a.children[0];b&&b.value&&(b.value=CKEDITOR.tools.trim(b.value));a.attributes.type||(a.attributes.type="text/css")},title:function(a){var b=a.children[0];!b&&k(a,b=new CKEDITOR.htmlParser.text); +b.value=a.attributes["data-cke-title"]||""},input:p,textarea:p},attributes:{"class":function(a){return CKEDITOR.tools.ltrim(a.replace(/(?:^|\s+)cke_[^\s]*/g,""))||!1}}};CKEDITOR.env.ie&&(A.attributes.style=function(a){return a.replace(/(^|;)([^\:]+)/g,function(a){return a.toLowerCase()})});var C=/<(a|area|img|input|source)\b([^>]*)>/gi,D=/([\w-:]+)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+))/gi,M=/^(href|src|name)$/i,H=/(?:])[^>]*>[\s\S]*?<\/style>)|(?:<(:?link|meta|base)[^>]*>)/gi, +R=/(])[^>]*>)([\s\S]*?)(?:<\/textarea>)/gi,Q=/([^<]*)<\/cke:encoded>/gi,P=/(<\/?)((?:object|embed|param|html|body|head|title)[^>]*>)/gi,v=/(<\/?)cke:((?:html|body|head|title)[^>]*>)/gi,G=/]*?)\/?>(?!\s*<\/cke:\1)/gi})();"use strict"; +CKEDITOR.htmlParser.element=function(a,d){this.name=a;this.attributes=d||{};this.children=[];var b=a||"",c=b.match(/^cke:(.*)/);c&&(b=c[1]);b=!!(CKEDITOR.dtd.$nonBodyContent[b]||CKEDITOR.dtd.$block[b]||CKEDITOR.dtd.$listItem[b]||CKEDITOR.dtd.$tableContent[b]||CKEDITOR.dtd.$nonEditable[b]||"br"==b);this.isEmpty=!!CKEDITOR.dtd.$empty[a];this.isUnknown=!CKEDITOR.dtd[a];this._={isBlockLike:b,hasInlineStarted:this.isEmpty||!b}}; +CKEDITOR.htmlParser.cssStyle=function(a){var d={};((a instanceof CKEDITOR.htmlParser.element?a.attributes.style:a)||"").replace(/"/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(a,c,e){"font-family"==c&&(e=e.replace(/["']/g,""));d[c.toLowerCase()]=e});return{rules:d,populate:function(a){var c=this.toString();c&&(a instanceof CKEDITOR.dom.element?a.setAttribute("style",c):a instanceof CKEDITOR.htmlParser.element?a.attributes.style=c:a.style=c)},toString:function(){var a=[],c; +for(c in d)d[c]&&a.push(c,":",d[c],";");return a.join("")}}}; +(function(){function a(a){return function(b){return b.type==CKEDITOR.NODE_ELEMENT&&("string"==typeof a?b.name==a:b.name in a)}}var d=function(a,b){a=a[0];b=b[0];return ab?1:0},b=CKEDITOR.htmlParser.fragment.prototype;CKEDITOR.htmlParser.element.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_ELEMENT,add:b.add,clone:function(){return new CKEDITOR.htmlParser.element(this.name,this.attributes)},filter:function(a,b){var d=this,k,h;b=d.getFilterContext(b);if(b.off)return!0; +if(!d.parent)a.onRoot(b,d);for(;;){k=d.name;if(!(h=a.onElementName(b,k)))return this.remove(),!1;d.name=h;if(!(d=a.onElement(b,d)))return this.remove(),!1;if(d!==this)return this.replaceWith(d),!1;if(d.name==k)break;if(d.type!=CKEDITOR.NODE_ELEMENT)return this.replaceWith(d),!1;if(!d.name)return this.replaceWithChildren(),!1}k=d.attributes;var p,r;for(p in k){for(h=k[p];;)if(r=a.onAttributeName(b,p))if(r!=p)delete k[p],p=r;else break;else{delete k[p];break}r&&(!1===(h=a.onAttribute(b,d,r,h))?delete k[r]: +k[r]=h)}d.isEmpty||this.filterChildren(a,!1,b);return!0},filterChildren:b.filterChildren,writeHtml:function(a,b){b&&this.filter(b);var g=this.name,k=[],h=this.attributes,p,r;a.openTag(g,h);for(p in h)k.push([p,h[p]]);a.sortAttributes&&k.sort(d);p=0;for(r=k.length;pCKEDITOR.env.version||CKEDITOR.env.quirks))this.hasFocus&&(this.focus(),b());else if(this.hasFocus)this.focus(),a();else this.once("focus",function(){a()}, +null,null,-999)},getHtmlFromRange:function(a){if(a.collapsed)return new CKEDITOR.dom.documentFragment(a.document);a={doc:this.getDocument(),range:a.clone()};w.eol.detect(a,this);w.bogus.exclude(a);w.cell.shrink(a);a.fragment=a.range.cloneContents();w.tree.rebuild(a,this);w.eol.fix(a,this);return new CKEDITOR.dom.documentFragment(a.fragment.$)},extractHtmlFromRange:function(a,b){var c=F,d={range:a,doc:a.document},e=this.getHtmlFromRange(a);if(a.collapsed)return a.optimize(),e;a.enlarge(CKEDITOR.ENLARGE_INLINE, +1);c.table.detectPurge(d);d.bookmark=a.createBookmark();delete d.range;var f=this.editor.createRange();f.moveToPosition(d.bookmark.startNode,CKEDITOR.POSITION_BEFORE_START);d.targetBookmark=f.createBookmark();c.list.detectMerge(d,this);c.table.detectRanges(d,this);c.block.detectMerge(d,this);d.tableContentsRanges?(c.table.deleteRanges(d),a.moveToBookmark(d.bookmark),d.range=a):(a.moveToBookmark(d.bookmark),d.range=a,a.extractContents(c.detectExtractMerge(d)));a.moveToBookmark(d.targetBookmark);a.optimize(); +c.fixUneditableRangePosition(a);c.list.merge(d,this);c.table.purge(d,this);c.block.merge(d,this);if(b){c=a.startPath();if(d=a.checkStartOfBlock()&&a.checkEndOfBlock()&&c.block&&!a.root.equals(c.block)){a:{var d=c.block.getElementsByTag("span"),f=0,g;if(d)for(;g=d.getItem(f++);)if(!B(g)){d=!0;break a}d=!1}d=!d}d&&(a.moveToPosition(c.block,CKEDITOR.POSITION_BEFORE_START),c.block.remove())}else c.autoParagraph(this.editor,a),u(a.startContainer)&&a.startContainer.appendBogus();a.startContainer.mergeSiblings(); +return e},setup:function(){var a=this.editor;this.attachListener(a,"beforeGetData",function(){var b=this.getData();this.is("textarea")||!1!==a.config.ignoreEmptyParagraph&&(b=b.replace(y,function(a,b){return b}));a.setData(b,null,1)},this);this.attachListener(a,"getSnapshot",function(a){a.data=this.getData(1)},this);this.attachListener(a,"afterSetData",function(){this.setData(a.getData(1))},this);this.attachListener(a,"loadSnapshot",function(a){this.setData(a.data,1)},this);this.attachListener(a, +"beforeFocus",function(){var b=a.getSelection();(b=b&&b.getNative())&&"Control"==b.type||this.focus()},this);this.attachListener(a,"insertHtml",function(a){this.insertHtml(a.data.dataValue,a.data.mode,a.data.range)},this);this.attachListener(a,"insertElement",function(a){this.insertElement(a.data)},this);this.attachListener(a,"insertText",function(a){this.insertText(a.data)},this);this.setReadOnly(a.readOnly);this.attachClass("cke_editable");a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?this.attachClass("cke_editable_inline"): +a.elementMode!=CKEDITOR.ELEMENT_MODE_REPLACE&&a.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO||this.attachClass("cke_editable_themed");this.attachClass("cke_contents_"+a.config.contentsLangDirection);a.keystrokeHandler.blockedKeystrokes[8]=+a.readOnly;a.keystrokeHandler.attach(this);this.on("blur",function(){this.hasFocus=!1},null,null,-1);this.on("focus",function(){this.hasFocus=!0},null,null,-1);if(CKEDITOR.env.webkit)this.on("scroll",function(){a._.previousScrollTop=a.editable().$.scrollTop},null, +null,-1);if(CKEDITOR.env.edge&&14CKEDITOR.env.version?h.$.styleSheet.cssText=k:h.setText(k)):(k=e.appendStyleText(k),k=new CKEDITOR.dom.element(k.ownerNode||k.owningElement),t.setCustomData("stylesheet", +k),k.data("cke-temp",1))}t=e.getCustomData("stylesheet_ref")||0;e.setCustomData("stylesheet_ref",t+1);this.setCustomData("cke_includeReadonly",!a.config.disableReadonlyStyling);this.attachListener(this,"click",function(a){a=a.data;var b=(new CKEDITOR.dom.elementPath(a.getTarget(),this)).contains("a");b&&2!=a.$.button&&b.isReadOnly()&&a.preventDefault()});var D={8:1,46:1};this.attachListener(a,"key",function(b){if(a.readOnly)return!0;var c=b.data.domEvent.getKey(),d;if(c in D){b=a.getSelection();var e, +n=b.getRanges()[0],q=n.startPath(),t,k,h,c=8==c;CKEDITOR.env.ie&&11>CKEDITOR.env.version&&(e=b.getSelectedElement())||(e=g(b))?(a.fire("saveSnapshot"),n.moveToPosition(e,CKEDITOR.POSITION_BEFORE_START),e.remove(),n.select(),a.fire("saveSnapshot"),d=1):n.collapsed&&((t=q.block)&&(h=t[c?"getPrevious":"getNext"](f))&&h.type==CKEDITOR.NODE_ELEMENT&&h.is("table")&&n[c?"checkStartOfBlock":"checkEndOfBlock"]()?(a.fire("saveSnapshot"),n[c?"checkEndOfBlock":"checkStartOfBlock"]()&&t.remove(),n["moveToElementEdit"+ +(c?"End":"Start")](h),n.select(),a.fire("saveSnapshot"),d=1):q.blockLimit&&q.blockLimit.is("td")&&(k=q.blockLimit.getAscendant("table"))&&n.checkBoundaryOfElement(k,c?CKEDITOR.START:CKEDITOR.END)&&(h=k[c?"getPrevious":"getNext"](f))?(a.fire("saveSnapshot"),n["moveToElementEdit"+(c?"End":"Start")](h),n.checkStartOfBlock()&&n.checkEndOfBlock()?h.remove():n.select(),a.fire("saveSnapshot"),d=1):(k=q.contains(["td","th","caption"]))&&n.checkBoundaryOfElement(k,c?CKEDITOR.START:CKEDITOR.END)&&(d=1))}return!d}); +a.blockless&&CKEDITOR.env.ie&&CKEDITOR.env.needsBrFiller&&this.attachListener(this,"keyup",function(b){b.data.getKeystroke()in D&&!this.getFirst(c)&&(this.appendBogus(),b=a.createRange(),b.moveToPosition(this,CKEDITOR.POSITION_AFTER_START),b.select())});this.attachListener(this,"dblclick",function(b){if(a.readOnly)return!1;b={element:b.data.getTarget()};a.fire("doubleclick",b)});CKEDITOR.env.ie&&this.attachListener(this,"click",b);CKEDITOR.env.ie&&!CKEDITOR.env.edge||this.attachListener(this,"mousedown", +function(b){var c=b.data.getTarget();c.is("img","hr","input","textarea","select")&&!c.isReadOnly()&&(a.getSelection().selectElement(c),c.is("input","textarea","select")&&b.data.preventDefault())});CKEDITOR.env.edge&&this.attachListener(this,"mouseup",function(b){(b=b.data.getTarget())&&b.is("img")&&a.getSelection().selectElement(b)});CKEDITOR.env.gecko&&this.attachListener(this,"mouseup",function(b){if(2==b.data.$.button&&(b=b.data.getTarget(),!b.getOuterHtml().replace(y,""))){var c=a.createRange(); +c.moveToElementEditStart(b);c.select(!0)}});CKEDITOR.env.webkit&&(this.attachListener(this,"click",function(a){a.data.getTarget().is("input","select")&&a.data.preventDefault()}),this.attachListener(this,"mouseup",function(a){a.data.getTarget().is("input","textarea")&&a.data.preventDefault()}));CKEDITOR.env.webkit&&this.attachListener(a,"key",function(b){if(a.readOnly)return!0;b=b.data.domEvent.getKey();if(b in D){var c=8==b,d=a.getSelection().getRanges()[0];b=d.startPath();if(d.collapsed)a:{var e= +b.block;if(e&&d[c?"checkStartOfBlock":"checkEndOfBlock"]()&&d.moveToClosestEditablePosition(e,!c)&&d.collapsed){if(d.startContainer.type==CKEDITOR.NODE_ELEMENT){var f=d.startContainer.getChild(d.startOffset-(c?1:0));if(f&&f.type==CKEDITOR.NODE_ELEMENT&&f.is("hr")){a.fire("saveSnapshot");f.remove();b=!0;break a}}d=d.startPath().block;if(!d||d&&d.contains(e))b=void 0;else{a.fire("saveSnapshot");var n;(n=(c?d:e).getBogus())&&n.remove();n=a.getSelection();f=n.createBookmarks();(c?e:d).moveChildren(c? +d:e,!1);b.lastElement.mergeSiblings();r(e,d,!c);n.selectBookmarks(f);b=!0}}else b=!1}else c=d,n=b.block,d=c.endPath().block,n&&d&&!n.equals(d)?(a.fire("saveSnapshot"),(e=n.getBogus())&&e.remove(),c.enlarge(CKEDITOR.ENLARGE_INLINE),c.deleteContents(),d.getParent()&&(d.moveChildren(n,!1),b.lastElement.mergeSiblings(),r(n,d,!0)),c=a.getSelection().getRanges()[0],c.collapse(1),c.optimize(),""===c.startContainer.getHtml()&&c.startContainer.appendBogus(),c.select(),b=!0):b=!1;if(!b)return;a.getSelection().scrollIntoView(); +a.fire("saveSnapshot");return!1}},this,null,100)}}},_:{detach:function(){this.editor.setData(this.editor.getData(),0,1);this.clearListeners();this.restoreAttrs();var a;if(a=this.removeCustomData("classes"))for(;a.length;)this.removeClass(a.pop());if(!this.is("textarea")){a=this.getDocument();var b=a.getHead();if(b.getCustomData("stylesheet")){var c=a.getCustomData("stylesheet_ref");--c?a.setCustomData("stylesheet_ref",c):(a.removeCustomData("stylesheet_ref"),b.removeCustomData("stylesheet").remove())}}this.editor.fire("contentDomUnload"); +delete this.editor}}});CKEDITOR.editor.prototype.editable=function(a){var b=this._.editable;if(b&&a)return 0;arguments.length&&(b=this._.editable=a?a instanceof CKEDITOR.editable?a:new CKEDITOR.editable(this,a):(b&&b.detach(),null));return b};CKEDITOR.on("instanceLoaded",function(b){var c=b.editor;c.on("insertElement",function(a){a=a.data;a.type==CKEDITOR.NODE_ELEMENT&&(a.is("input")||a.is("textarea"))&&("false"!=a.getAttribute("contentEditable")&&a.data("cke-editable",a.hasAttribute("contenteditable")? +"true":"1"),a.setAttribute("contentEditable",!1))});c.on("selectionChange",function(b){if(!c.readOnly){var d=c.getSelection();d&&!d.isLocked&&(d=c.checkDirty(),c.fire("lockSnapshot"),a(b),c.fire("unlockSnapshot"),!d&&c.resetDirty())}})});CKEDITOR.on("instanceCreated",function(a){var b=a.editor;b.on("mode",function(){var a=b.editable();if(a&&a.isInline()){var c=b.title;a.changeAttr("role","textbox");a.changeAttr("aria-label",c);c&&a.changeAttr("title",c);var d=b.fire("ariaEditorHelpLabel",{}).label; +if(d&&(c=this.ui.space(this.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?"top":"contents"))){var e=CKEDITOR.tools.getNextId(),d=CKEDITOR.dom.element.createFromHtml('\x3cspan id\x3d"'+e+'" class\x3d"cke_voice_label"\x3e'+d+"\x3c/span\x3e");c.append(d);a.changeAttr("aria-describedby",e)}}})});CKEDITOR.addCss(".cke_editable{cursor:text}.cke_editable img,.cke_editable input,.cke_editable textarea{cursor:default}");f=CKEDITOR.dom.walker.whitespaces(!0);B=CKEDITOR.dom.walker.bookmark(!1,!0);u=CKEDITOR.dom.walker.empty(); +z=CKEDITOR.dom.walker.bogus();y=/(^|]*>)\s*<(p|div|address|h\d|center|pre)[^>]*>\s*(?:]*>| |\u00A0| )?\s*(:?<\/\2>)?\s*(?=$|<\/body>)/gi;m=function(){function a(b){return b.type==CKEDITOR.NODE_ELEMENT}function b(c,d){var e,f,n,t,g=[],k=d.range.startContainer;e=d.range.startPath();for(var k=p[k.getName()],h=0,C=c.getChildren(),A=C.count(),D=-1,m=-1,r=0,H=e.contains(p.$list);hCKEDITOR.env.version&&d.getChildCount()&&d.getFirst().remove())}return function(d){var e=d.startContainer,f=e.getAscendant("table",1),g=!1;c(f.getElementsByTag("td"));c(f.getElementsByTag("th"));f=d.clone();f.setStart(e,0);f=a(f).lastBackward();f||(f=d.clone(),f.setEndAt(e,CKEDITOR.POSITION_BEFORE_END),f=a(f).lastForward(),g=!0);f||(f=e);f.is("table")?(d.setStartAt(f,CKEDITOR.POSITION_BEFORE_START), +d.collapse(!0),f.remove()):(f.is({tbody:1,thead:1,tfoot:1})&&(f=b(f,"tr",g)),f.is("tr")&&(f=b(f,f.getParent().is("thead")?"th":"td",g)),(e=f.getBogus())&&e.remove(),d.moveToPosition(f,g?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_END))}}();J=function(){function a(b){b=new CKEDITOR.dom.walker(b);b.guard=function(a,b){if(b)return!1;if(a.type==CKEDITOR.NODE_ELEMENT)return a.is(CKEDITOR.dtd.$list)||a.is(CKEDITOR.dtd.$listItem)};b.evaluator=function(a){return a.type==CKEDITOR.NODE_ELEMENT&& +a.is(CKEDITOR.dtd.$listItem)};return b}return function(b){var c=b.startContainer,d=!1,e;e=b.clone();e.setStart(c,0);e=a(e).lastBackward();e||(e=b.clone(),e.setEndAt(c,CKEDITOR.POSITION_BEFORE_END),e=a(e).lastForward(),d=!0);e||(e=c);e.is(CKEDITOR.dtd.$list)?(b.setStartAt(e,CKEDITOR.POSITION_BEFORE_START),b.collapse(!0),e.remove()):((c=e.getBogus())&&c.remove(),b.moveToPosition(e,d?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_END),b.select())}}();w={eol:{detect:function(a,b){var c=a.range, +d=c.clone(),e=c.clone(),f=new CKEDITOR.dom.elementPath(c.startContainer,b),g=new CKEDITOR.dom.elementPath(c.endContainer,b);d.collapse(1);e.collapse();f.block&&d.checkBoundaryOfElement(f.block,CKEDITOR.END)&&(c.setStartAfter(f.block),a.prependEolBr=1);g.block&&e.checkBoundaryOfElement(g.block,CKEDITOR.START)&&(c.setEndBefore(g.block),a.appendEolBr=1)},fix:function(a,b){var c=b.getDocument(),d;a.appendEolBr&&(d=this.createEolBr(c),a.fragment.append(d));!a.prependEolBr||d&&!d.getPrevious()||a.fragment.append(this.createEolBr(c), +1)},createEolBr:function(a){return a.createElement("br",{attributes:{"data-cke-eol":1}})}},bogus:{exclude:function(a){var b=a.range.getBoundaryNodes(),c=b.startNode,b=b.endNode;!b||!z(b)||c&&c.equals(b)||a.range.setEndBefore(b)}},tree:{rebuild:function(a,b){var c=a.range,d=c.getCommonAncestor(),e=new CKEDITOR.dom.elementPath(d,b),f=new CKEDITOR.dom.elementPath(c.startContainer,b),c=new CKEDITOR.dom.elementPath(c.endContainer,b),g;d.type==CKEDITOR.NODE_TEXT&&(d=d.getParent());if(e.blockLimit.is({tr:1, +table:1})){var k=e.contains("table").getParent();g=function(a){return!a.equals(k)}}else if(e.block&&e.block.is(CKEDITOR.dtd.$listItem)&&(f=f.contains(CKEDITOR.dtd.$list),c=c.contains(CKEDITOR.dtd.$list),!f.equals(c))){var h=e.contains(CKEDITOR.dtd.$list).getParent();g=function(a){return!a.equals(h)}}g||(g=function(a){return!a.equals(e.block)&&!a.equals(e.blockLimit)});this.rebuildFragment(a,b,d,g)},rebuildFragment:function(a,b,c,d){for(var e;c&&!c.equals(b)&&d(c);)e=c.clone(0,1),a.fragment.appendTo(e), +a.fragment=e,c=c.getParent()}},cell:{shrink:function(a){a=a.range;var b=a.startContainer,c=a.endContainer,d=a.startOffset,e=a.endOffset;b.type==CKEDITOR.NODE_ELEMENT&&b.equals(c)&&b.is("tr")&&++d==e&&a.shrink(CKEDITOR.SHRINK_TEXT)}}};F=function(){function a(b,c){var d=b.getParent();if(d.is(CKEDITOR.dtd.$inline))b[c?"insertBefore":"insertAfter"](d)}function b(c,d,e){a(d);a(e,1);for(var f;f=e.getNext();)f.insertAfter(d),d=f;u(c)&&c.remove()}function c(a,b){var d=new CKEDITOR.dom.range(a);d.setStartAfter(b.startNode); +d.setEndBefore(b.endNode);return d}return{list:{detectMerge:function(a,b){var d=c(b,a.bookmark),e=d.startPath(),f=d.endPath(),l=e.contains(CKEDITOR.dtd.$list),g=f.contains(CKEDITOR.dtd.$list);a.mergeList=l&&g&&l.getParent().equals(g.getParent())&&!l.equals(g);a.mergeListItems=e.block&&f.block&&e.block.is(CKEDITOR.dtd.$listItem)&&f.block.is(CKEDITOR.dtd.$listItem);if(a.mergeList||a.mergeListItems)d=d.clone(),d.setStartBefore(a.bookmark.startNode),d.setEndAfter(a.bookmark.endNode),a.mergeListBookmark= +d.createBookmark()},merge:function(a,c){if(a.mergeListBookmark){var d=a.mergeListBookmark.startNode,e=a.mergeListBookmark.endNode,f=new CKEDITOR.dom.elementPath(d,c),l=new CKEDITOR.dom.elementPath(e,c);if(a.mergeList){var g=f.contains(CKEDITOR.dtd.$list),n=l.contains(CKEDITOR.dtd.$list);g.equals(n)||(n.moveChildren(g),n.remove())}a.mergeListItems&&(f=f.contains(CKEDITOR.dtd.$listItem),l=l.contains(CKEDITOR.dtd.$listItem),f.equals(l)||b(l,d,e));d.remove();e.remove()}}},block:{detectMerge:function(a, +b){if(!a.tableContentsRanges&&!a.mergeListBookmark){var c=new CKEDITOR.dom.range(b);c.setStartBefore(a.bookmark.startNode);c.setEndAfter(a.bookmark.endNode);a.mergeBlockBookmark=c.createBookmark()}},merge:function(a,c){if(a.mergeBlockBookmark&&!a.purgeTableBookmark){var d=a.mergeBlockBookmark.startNode,e=a.mergeBlockBookmark.endNode,f=new CKEDITOR.dom.elementPath(d,c),l=new CKEDITOR.dom.elementPath(e,c),f=f.block,l=l.block;f&&l&&!f.equals(l)&&b(l,d,e);d.remove();e.remove()}}},table:function(){function a(c){var e= +[],f,l=new CKEDITOR.dom.walker(c),g=c.startPath().contains(d),n=c.endPath().contains(d),k={};l.guard=function(a,l){if(a.type==CKEDITOR.NODE_ELEMENT){var h="visited_"+(l?"out":"in");if(a.getCustomData(h))return;CKEDITOR.dom.element.setMarker(k,a,h,1)}if(l&&g&&a.equals(g))f=c.clone(),f.setEndAt(g,CKEDITOR.POSITION_BEFORE_END),e.push(f);else if(!l&&n&&a.equals(n))f=c.clone(),f.setStartAt(n,CKEDITOR.POSITION_AFTER_START),e.push(f);else{if(h=!l)h=a.type==CKEDITOR.NODE_ELEMENT&&a.is(d)&&(!g||b(a,g))&&(!n|| +b(a,n));h&&(f=c.clone(),f.selectNodeContents(a),e.push(f))}};l.lastForward();CKEDITOR.dom.element.clearAllMarkers(k);return e}function b(a,c){var d=CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_IS_CONTAINED,e=a.getPosition(c);return e===CKEDITOR.POSITION_IDENTICAL?!1:0===(e&d)}var d={td:1,th:1,caption:1};return{detectPurge:function(a){var b=a.range,c=b.clone();c.enlarge(CKEDITOR.ENLARGE_ELEMENT);var c=new CKEDITOR.dom.walker(c),e=0;c.evaluator=function(a){a.type==CKEDITOR.NODE_ELEMENT&&a.is(d)&&++e}; +c.checkForward();if(1f&&e&&e.intersectsNode(c.$)){var g=[{node:d.anchorNode,offset:d.anchorOffset},{node:d.focusNode,offset:d.focusOffset}]; +d.anchorNode==c.$&&d.anchorOffset>f&&(g[0].offset-=f);d.focusNode==c.$&&d.focusOffset>f&&(g[1].offset-=f)}}c.setText(h(c.getText(),1));g&&(c=a.getDocument().$,d=c.getSelection(),c=c.createRange(),c.setStart(g[0].node,g[0].offset),c.collapse(!0),d.removeAllRanges(),d.addRange(c),d.extend(g[1].node,g[1].offset))}}function h(a,b){return b?a.replace(y,function(a,b){return b?" ":""}):a.replace(z,"")}function p(a,b){var c=CKEDITOR.dom.element.createFromHtml('\x3cdiv data-cke-hidden-sel\x3d"1" data-cke-temp\x3d"1" style\x3d"'+ +(CKEDITOR.env.ie&&14>CKEDITOR.env.version?"display:none":"position:fixed;top:0;left:-1000px")+'"\x3e'+(b||"\x26nbsp;")+"\x3c/div\x3e",a.document);a.fire("lockSnapshot");a.editable().append(c);var d=a.getSelection(1),e=a.createRange(),f=d.root.on("selectionchange",function(a){a.cancel()},null,null,0);e.setStartAt(c,CKEDITOR.POSITION_AFTER_START);e.setEndAt(c,CKEDITOR.POSITION_BEFORE_END);d.selectRanges([e]);f.removeListener();a.fire("unlockSnapshot");a._.hiddenSelectionContainer=c}function r(a){var b= +{37:1,39:1,8:1,46:1};return function(c){var d=c.data.getKeystroke();if(b[d]){var e=a.getSelection().getRanges(),f=e[0];1==e.length&&f.collapsed&&(d=f[38>d?"getPreviousEditableNode":"getNextEditableNode"]())&&d.type==CKEDITOR.NODE_ELEMENT&&"false"==d.getAttribute("contenteditable")&&(a.getSelection().fake(d),c.data.preventDefault(),c.cancel())}}}function f(a){for(var b=0;b=d.getLength()?h.setStartAfter(d):h.setStartBefore(d));e&&e.type==CKEDITOR.NODE_TEXT&&(g?h.setEndAfter(e):h.setEndBefore(e));d=new CKEDITOR.dom.walker(h);d.evaluator=function(d){if(d.type==CKEDITOR.NODE_ELEMENT&& +d.isReadOnly()){var e=c.clone();c.setEndBefore(d);c.collapsed&&a.splice(b--,1);d.getPosition(h.endContainer)&CKEDITOR.POSITION_CONTAINS||(e.setStartAfter(d),e.collapsed||a.splice(b+1,0,e));return!0}return!1};d.next()}}return a}var B="function"!=typeof window.getSelection,u=1,z=CKEDITOR.tools.repeat("​",7),y=new RegExp(z+"( )?","g"),m,x,J=CKEDITOR.dom.walker.invisible(1),w=function(){function a(b){return function(a){var c=a.editor.createRange();c.moveToClosestEditablePosition(a.selected,b)&&a.editor.getSelection().selectRanges([c]); +return!1}}function b(a){return function(b){var c=b.editor,d=c.createRange(),e;(e=d.moveToClosestEditablePosition(b.selected,a))||(e=d.moveToClosestEditablePosition(b.selected,!a));e&&c.getSelection().selectRanges([d]);c.fire("saveSnapshot");b.selected.remove();e||(d.moveToElementEditablePosition(c.editable()),c.getSelection().selectRanges([d]));c.fire("saveSnapshot");return!1}}var c=a(),d=a(1);return{37:c,38:c,39:d,40:d,8:b(),46:b(1)}}();CKEDITOR.on("instanceCreated",function(b){function c(){var a= +e.getSelection();a&&a.removeAllRanges()}var e=b.editor;e.on("contentDom",function(){function b(){v=new CKEDITOR.dom.selection(e.getSelection());v.lock()}function c(){l.removeListener("mouseup",c);q.removeListener("mouseup",c);var a=CKEDITOR.document.$.selection,b=a.createRange();"None"!=a.type&&b.parentElement().ownerDocument==f.$&&b.select()}var f=e.document,l=CKEDITOR.document,g=e.editable(),h=f.getBody(),q=f.getDocumentElement(),m=g.isInline(),p,v;CKEDITOR.env.gecko&&g.attachListener(g,"focus", +function(a){a.removeListener();0!==p&&(a=e.getSelection().getNative())&&a.isCollapsed&&a.anchorNode==g.$&&(a=e.createRange(),a.moveToElementEditStart(g),a.select())},null,null,-2);g.attachListener(g,CKEDITOR.env.webkit?"DOMFocusIn":"focus",function(){p&&CKEDITOR.env.webkit&&(p=e._.previousActive&&e._.previousActive.equals(f.getActive()))&&null!=e._.previousScrollTop&&e._.previousScrollTop!=g.$.scrollTop&&(g.$.scrollTop=e._.previousScrollTop);e.unlockSelection(p);p=0},null,null,-1);g.attachListener(g, +"mousedown",function(){p=0});if(CKEDITOR.env.ie||m)B?g.attachListener(g,"beforedeactivate",b,null,null,-1):g.attachListener(e,"selectionCheck",b,null,null,-1),g.attachListener(g,CKEDITOR.env.webkit?"DOMFocusOut":"blur",function(){e.lockSelection(v);p=1},null,null,-1),g.attachListener(g,"mousedown",function(){p=0});if(CKEDITOR.env.ie&&!m){var G;g.attachListener(g,"mousedown",function(a){2==a.data.$.button&&((a=e.document.getSelection())&&a.getType()!=CKEDITOR.SELECTION_NONE||(G=e.window.getScrollPosition()))}); +g.attachListener(g,"mouseup",function(a){2==a.data.$.button&&G&&(e.document.$.documentElement.scrollLeft=G.x,e.document.$.documentElement.scrollTop=G.y);G=null});if("BackCompat"!=f.$.compatMode){if(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat){var E,I;q.on("mousedown",function(a){function b(a){a=a.data.$;if(E){var c=h.$.createTextRange();try{c.moveToPoint(a.clientX,a.clientY)}catch(d){}E.setEndPoint(0>I.compareEndPoints("StartToStart",c)?"EndToEnd":"StartToStart",c);E.select()}}function c(){q.removeListener("mousemove", +b);l.removeListener("mouseup",c);q.removeListener("mouseup",c);E.select()}a=a.data;if(a.getTarget().is("html")&&a.$.yCKEDITOR.env.version)q.on("mousedown",function(a){a.data.getTarget().is("html")&&(l.on("mouseup",c),q.on("mouseup",c))})}}g.attachListener(g,"selectionchange",a, +e);g.attachListener(g,"keyup",d,e);g.attachListener(g,CKEDITOR.env.webkit?"DOMFocusIn":"focus",function(){e.forceNextSelectionCheck();e.selectionChange(1)});if(m&&(CKEDITOR.env.webkit||CKEDITOR.env.gecko)){var K;g.attachListener(g,"mousedown",function(){K=1});g.attachListener(f.getDocumentElement(),"mouseup",function(){K&&d.call(e);K=0})}else g.attachListener(CKEDITOR.env.ie?g:f.getDocumentElement(),"mouseup",d,e);CKEDITOR.env.webkit&&g.attachListener(f,"keydown",function(a){switch(a.data.getKey()){case 13:case 33:case 34:case 35:case 36:case 37:case 39:case 8:case 45:case 46:k(g)}}, +null,null,-1);g.attachListener(g,"keydown",r(e),null,null,-1)});e.on("setData",function(){e.unlockSelection();CKEDITOR.env.webkit&&c()});e.on("contentDomUnload",function(){e.unlockSelection()});if(CKEDITOR.env.ie9Compat)e.on("beforeDestroy",c,null,null,9);e.on("dataReady",function(){delete e._.fakeSelection;delete e._.hiddenSelectionContainer;e.selectionChange(1)});e.on("loadSnapshot",function(){var a=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT),b=e.editable().getLast(a);b&&b.hasAttribute("data-cke-hidden-sel")&& +(b.remove(),CKEDITOR.env.gecko&&(a=e.editable().getFirst(a))&&a.is("br")&&a.getAttribute("_moz_editor_bogus_node")&&a.remove())},null,null,100);e.on("key",function(a){if("wysiwyg"==e.mode){var b=e.getSelection();if(b.isFake){var c=w[a.data.keyCode];if(c)return c({editor:e,selected:b.getSelectedElement(),selection:b,keyEvent:a})}}})});if(CKEDITOR.env.webkit)CKEDITOR.on("instanceReady",function(a){var b=a.editor;b.on("selectionChange",function(){var a=b.editable(),c=a.getCustomData("cke-fillingChar"); +c&&(c.getCustomData("ready")?k(a):c.setCustomData("ready",1))},null,null,-1);b.on("beforeSetMode",function(){k(b.editable())},null,null,-1);b.on("getSnapshot",function(a){a.data&&(a.data=h(a.data))},b,null,20);b.on("toDataFormat",function(a){a.data.dataValue=h(a.data.dataValue)},null,null,0)});CKEDITOR.editor.prototype.selectionChange=function(b){(b?a:d).call(this)};CKEDITOR.editor.prototype.getSelection=function(a){return!this._.savedSelection&&!this._.fakeSelection||a?(a=this.editable())&&"wysiwyg"== +this.mode?new CKEDITOR.dom.selection(a):null:this._.savedSelection||this._.fakeSelection};CKEDITOR.editor.prototype.lockSelection=function(a){a=a||this.getSelection(1);return a.getType()!=CKEDITOR.SELECTION_NONE?(!a.isLocked&&a.lock(),this._.savedSelection=a,!0):!1};CKEDITOR.editor.prototype.unlockSelection=function(a){var b=this._.savedSelection;return b?(b.unlock(a),delete this._.savedSelection,!0):!1};CKEDITOR.editor.prototype.forceNextSelectionCheck=function(){delete this._.selectionPreviousPath}; +CKEDITOR.dom.document.prototype.getSelection=function(){return new CKEDITOR.dom.selection(this)};CKEDITOR.dom.range.prototype.select=function(){var a=this.root instanceof CKEDITOR.editable?this.root.editor.getSelection():new CKEDITOR.dom.selection(this.root);a.selectRanges([this]);return a};CKEDITOR.SELECTION_NONE=1;CKEDITOR.SELECTION_TEXT=2;CKEDITOR.SELECTION_ELEMENT=3;CKEDITOR.dom.selection=function(a){if(a instanceof CKEDITOR.dom.selection){var b=a;a=a.root}var c=a instanceof CKEDITOR.dom.element; +this.rev=b?b.rev:u++;this.document=a instanceof CKEDITOR.dom.document?a:a.getDocument();this.root=c?a:this.document.getBody();this.isLocked=0;this._={cache:{}};if(b)return CKEDITOR.tools.extend(this._.cache,b._.cache),this.isFake=b.isFake,this.isLocked=b.isLocked,this;a=this.getNative();var d,e;if(a)if(a.getRangeAt)d=(e=a.rangeCount&&a.getRangeAt(0))&&new CKEDITOR.dom.node(e.commonAncestorContainer);else{try{e=a.createRange()}catch(f){}d=e&&CKEDITOR.dom.element.get(e.item&&e.item(0)||e.parentElement())}if(!d|| +d.type!=CKEDITOR.NODE_ELEMENT&&d.type!=CKEDITOR.NODE_TEXT||!this.root.equals(d)&&!this.root.contains(d))this._.cache.type=CKEDITOR.SELECTION_NONE,this._.cache.startElement=null,this._.cache.selectedElement=null,this._.cache.selectedText="",this._.cache.ranges=new CKEDITOR.dom.rangeList;return this};var F={img:1,hr:1,li:1,table:1,tr:1,td:1,th:1,embed:1,object:1,ol:1,ul:1,a:1,input:1,form:1,select:1,textarea:1,button:1,fieldset:1,thead:1,tfoot:1};CKEDITOR.tools.extend(CKEDITOR.dom.selection,{_removeFillingCharSequenceString:h, +_createFillingCharSequenceNode:g,FILLING_CHAR_SEQUENCE:z});CKEDITOR.dom.selection.prototype={getNative:function(){return void 0!==this._.cache.nativeSel?this._.cache.nativeSel:this._.cache.nativeSel=B?this.document.$.selection:this.document.getWindow().$.getSelection()},getType:B?function(){var a=this._.cache;if(a.type)return a.type;var b=CKEDITOR.SELECTION_NONE;try{var c=this.getNative(),d=c.type;"Text"==d&&(b=CKEDITOR.SELECTION_TEXT);"Control"==d&&(b=CKEDITOR.SELECTION_ELEMENT);c.createRange().parentElement()&& +(b=CKEDITOR.SELECTION_TEXT)}catch(e){}return a.type=b}:function(){var a=this._.cache;if(a.type)return a.type;var b=CKEDITOR.SELECTION_TEXT,c=this.getNative();if(!c||!c.rangeCount)b=CKEDITOR.SELECTION_NONE;else if(1==c.rangeCount){var c=c.getRangeAt(0),d=c.startContainer;d==c.endContainer&&1==d.nodeType&&1==c.endOffset-c.startOffset&&F[d.childNodes[c.startOffset].nodeName.toLowerCase()]&&(b=CKEDITOR.SELECTION_ELEMENT)}return a.type=b},getRanges:function(){var a=B?function(){function a(b){return(new CKEDITOR.dom.node(b)).getIndex()} +var b=function(b,c){b=b.duplicate();b.collapse(c);var d=b.parentElement();if(!d.hasChildNodes())return{container:d,offset:0};for(var e=d.children,f,l,g=b.duplicate(),h=0,k=e.length-1,v=-1,n,m;h<=k;)if(v=Math.floor((h+k)/2),f=e[v],g.moveToElementText(f),n=g.compareEndPoints("StartToStart",b),0n)h=v+1;else return{container:d,offset:a(f)};if(-1==v||v==e.length-1&&0>n){g.moveToElementText(d);g.setEndPoint("StartToStart",b);g=g.text.replace(/(\r\n|\r)/g,"\n").length;e=d.childNodes;if(!g)return f= +e[e.length-1],f.nodeType!=CKEDITOR.NODE_TEXT?{container:d,offset:e.length}:{container:f,offset:f.nodeValue.length};for(d=e.length;0]*>)[ \t\r\n]*/gi,"$1");g=g.replace(/([ \t\n\r]+| )/g, +" ");g=g.replace(/]*>/gi,"\n");if(CKEDITOR.env.ie){var h=a.getDocument().createElement("div");h.append(e);e.$.outerHTML="\x3cpre\x3e"+g+"\x3c/pre\x3e";e.copyAttributes(h.getFirst());e=h.getFirst().remove()}else e.setHtml(g);b=e}else g?b=u(c?[a.getHtml()]:f(a),b):a.moveChildren(b);b.replace(a);if(d){var c=b,k;(k=c.getPrevious(R))&&k.type==CKEDITOR.NODE_ELEMENT&&k.is("pre")&&(d=B(k.getHtml(),/\n$/,"")+"\n\n"+B(c.getHtml(),/^\n/,""),CKEDITOR.env.ie?c.$.outerHTML="\x3cpre\x3e"+d+"\x3c/pre\x3e": +c.setHtml(d),k.remove())}else c&&x(b)}function f(a){var b=[];B(a.getOuterHtml(),/(\S\s*)\n(?:\s|(]+data-cke-bookmark.*?\/span>))*\n(?!$)/gi,function(a,b,c){return b+"\x3c/pre\x3e"+c+"\x3cpre\x3e"}).replace(/([\s\S]*?)<\/pre>/gi,function(a,c){b.push(c)});return b}function B(a,b,c){var d="",e="";a=a.replace(/(^]+data-cke-bookmark.*?\/span>)|(]+data-cke-bookmark.*?\/span>$)/gi,function(a,b,c){b&&(d=b);c&&(e=c);return""});return d+a.replace(b,c)+e}function u(a,b){var c; +1=c?(g=e.createText(""),g.insertAfter(this)):(a=e.createText(""),a.insertAfter(g),a.remove()));return g},substring:function(a, +d){return"number"!=typeof d?this.$.nodeValue.substr(a):this.$.nodeValue.substring(a,d)}}); +(function(){function a(a,c,d){var g=a.serializable,k=c[d?"endContainer":"startContainer"],h=d?"endOffset":"startOffset",p=g?c.document.getById(a.startNode):a.startNode;a=g?c.document.getById(a.endNode):a.endNode;k.equals(p.getPrevious())?(c.startOffset=c.startOffset-k.getLength()-a.getPrevious().getLength(),k=a.getNext()):k.equals(a.getPrevious())&&(c.startOffset-=k.getLength(),k=a.getNext());k.equals(p.getParent())&&c[h]++;k.equals(a.getParent())&&c[h]++;c[d?"endContainer":"startContainer"]=k;return c} +CKEDITOR.dom.rangeList=function(a){if(a instanceof CKEDITOR.dom.rangeList)return a;a?a instanceof CKEDITOR.dom.range&&(a=[a]):a=[];return CKEDITOR.tools.extend(a,d)};var d={createIterator:function(){var a=this,c=CKEDITOR.dom.walker.bookmark(),d=[],g;return{getNextRange:function(k){g=void 0===g?0:g+1;var h=a[g];if(h&&1b?-1:1}),e=0,g;eCKEDITOR.env.version? +a[h].$.styleSheet.cssText+=g:a[h].$.innerHTML+=g}}var g={};CKEDITOR.skin={path:a,loadPart:function(c,d){CKEDITOR.skin.name!=CKEDITOR.skinName.split(",")[0]?CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(a()+"skin.js"),function(){b(c,d)}):b(c,d)},getPath:function(a){return CKEDITOR.getUrl(d(a))},icons:{},addIcon:function(a,b,c,d){a=a.toLowerCase();this.icons[a]||(this.icons[a]={path:b,offset:c||0,bgsize:d||"16px"})},getIconStyle:function(a,b,c,d,e){var g;a&&(a=a.toLowerCase(),b&&(g=this.icons[a+"-rtl"]), +g||(g=this.icons[a]));a=c||g&&g.path||"";d=d||g&&g.offset;e=e||g&&g.bgsize||"16px";a&&(a=a.replace(/'/g,"\\'"));return a&&"background-image:url('"+CKEDITOR.getUrl(a)+"');background-position:0 "+d+"px;background-size:"+e+";"}};CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{getUiColor:function(){return this.uiColor},setUiColor:function(a){var b=c(CKEDITOR.document);return(this.setUiColor=function(a){this.uiColor=a;var c=CKEDITOR.skin.chameleon,d="",g="";"function"==typeof c&&(d=c(this,"editor"),g= +c(this,"panel"));a=[[p,a]];e([b],d,a);e(h,g,a)}).call(this,a)}});var k="cke_ui_color",h=[],p=/\$color/g;CKEDITOR.on("instanceLoaded",function(a){if(!CKEDITOR.env.ie||!CKEDITOR.env.quirks){var b=a.editor;a=function(a){a=(a.data[0]||a.data).element.getElementsByTag("iframe").getItem(0).getFrameDocument();if(!a.getById("cke_ui_color")){a=c(a);h.push(a);var d=b.getUiColor();d&&e([a],CKEDITOR.skin.chameleon(b,"panel"),[[p,d]])}};b.on("panelShow",a);b.on("menuShow",a);b.config.uiColor&&b.setUiColor(b.config.uiColor)}})})(); +(function(){if(CKEDITOR.env.webkit)CKEDITOR.env.hc=!1;else{var a=CKEDITOR.dom.element.createFromHtml('\x3cdiv style\x3d"width:0;height:0;position:absolute;left:-10000px;border:1px solid;border-color:red blue"\x3e\x3c/div\x3e',CKEDITOR.document);a.appendTo(CKEDITOR.document.getHead());try{var d=a.getComputedStyle("border-top-color"),b=a.getComputedStyle("border-right-color");CKEDITOR.env.hc=!(!d||d!=b)}catch(c){CKEDITOR.env.hc=!1}a.remove()}CKEDITOR.env.hc&&(CKEDITOR.env.cssClass+=" cke_hc");CKEDITOR.document.appendStyleText(".cke{visibility:hidden;}"); +CKEDITOR.status="loaded";CKEDITOR.fireOnce("loaded");if(a=CKEDITOR._.pending)for(delete CKEDITOR._.pending,d=0;de;e++){var f=e,c;c=parseInt(a[e],16);c=("0"+(0>d?0|c*(1+d):0|c+(255-c)*d).toString(16)).slice(-2);a[f]=c}return"#"+a.join("")}}(),f={editor:new CKEDITOR.template("{id}.cke_chrome [border-color:{defaultBorder};] {id} .cke_top [ background-color:{defaultBackground};border-bottom-color:{defaultBorder};] {id} .cke_bottom [background-color:{defaultBackground};border-top-color:{defaultBorder};] {id} .cke_resizer [border-right-color:{ckeResizer}] {id} .cke_dialog_title [background-color:{defaultBackground};border-bottom-color:{defaultBorder};] {id} .cke_dialog_footer [background-color:{defaultBackground};outline-color:{defaultBorder};] {id} .cke_dialog_tab [background-color:{dialogTab};border-color:{defaultBorder};] {id} .cke_dialog_tab:hover [background-color:{lightBackground};] {id} .cke_dialog_contents [border-top-color:{defaultBorder};] {id} .cke_dialog_tab_selected, {id} .cke_dialog_tab_selected:hover [background:{dialogTabSelected};border-bottom-color:{dialogTabSelectedBorder};] {id} .cke_dialog_body [background:{dialogBody};border-color:{defaultBorder};] {id} a.cke_button_off:hover,{id} a.cke_button_off:focus,{id} a.cke_button_off:active [background-color:{darkBackground};border-color:{toolbarElementsBorder};] {id} .cke_button_on [background-color:{ckeButtonOn};border-color:{toolbarElementsBorder};] {id} .cke_toolbar_separator,{id} .cke_toolgroup a.cke_button:last-child:after,{id} .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after [background-color: {toolbarElementsBorder};border-color: {toolbarElementsBorder};] {id} a.cke_combo_button:hover,{id} a.cke_combo_button:focus,{id} .cke_combo_on a.cke_combo_button [border-color:{toolbarElementsBorder};background-color:{darkBackground};] {id} .cke_combo:after [border-color:{toolbarElementsBorder};] {id} .cke_path_item [color:{elementsPathColor};] {id} a.cke_path_item:hover,{id} a.cke_path_item:focus,{id} a.cke_path_item:active [background-color:{darkBackground};] {id}.cke_panel [border-color:{defaultBorder};] "),panel:new CKEDITOR.template(".cke_panel_grouptitle [background-color:{lightBackground};border-color:{defaultBorder};] .cke_menubutton_icon [background-color:{menubuttonIcon};] .cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active [background-color:{menubuttonHover};] .cke_menubutton:hover .cke_menubutton_icon, .cke_menubutton:focus .cke_menubutton_icon, .cke_menubutton:active .cke_menubutton_icon [background-color:{menubuttonIconHover};] .cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon [background-color:{menubuttonIcon};] .cke_menuseparator [background-color:{menubuttonIcon};] a:hover.cke_colorbox, a:active.cke_colorbox [border-color:{defaultBorder};] a:hover.cke_colorauto, a:hover.cke_colormore, a:active.cke_colorauto, a:active.cke_colormore [background-color:{ckeColorauto};border-color:{defaultBorder};] ")}; +return function(g,d){var a=b(g.uiColor,.4),a={id:"."+g.id,defaultBorder:b(a,-.2),toolbarElementsBorder:b(a,-.25),defaultBackground:a,lightBackground:b(a,.8),darkBackground:b(a,-.15),ckeButtonOn:b(a,.4),ckeResizer:b(a,-.4),ckeColorauto:b(a,.8),dialogBody:b(a,.7),dialogTab:b(a,.65),dialogTabSelected:"#FFF",dialogTabSelectedBorder:"#FFF",elementsPathColor:b(a,-.6),menubuttonHover:b(a,.1),menubuttonIcon:b(a,.5),menubuttonIconHover:b(a,.3)};return f[d].output(a).replace(/\[/g,"{").replace(/\]/g,"}")}}();CKEDITOR.plugins.add("dialogui",{onLoad:function(){var h=function(b){this._||(this._={});this._["default"]=this._.initValue=b["default"]||"";this._.required=b.required||!1;for(var a=[this._],d=1;darguments.length)){var c=h.call(this,a);c.labelId=CKEDITOR.tools.getNextId()+ +"_label";this._.children=[];var e={role:a.role||"presentation"};a.includeLabel&&(e["aria-labelledby"]=c.labelId);CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,"div",null,e,function(){var e=[],g=a.required?" cke_required":"";"horizontal"!=a.labelLayout?e.push('\x3clabel class\x3d"cke_dialog_ui_labeled_label'+g+'" ',' id\x3d"'+c.labelId+'"',c.inputId?' for\x3d"'+c.inputId+'"':"",(a.labelStyle?' style\x3d"'+a.labelStyle+'"':"")+"\x3e",a.label,"\x3c/label\x3e",'\x3cdiv class\x3d"cke_dialog_ui_labeled_content"', +a.controlStyle?' style\x3d"'+a.controlStyle+'"':"",' role\x3d"presentation"\x3e',f.call(this,b,a),"\x3c/div\x3e"):(g={type:"hbox",widths:a.widths,padding:0,children:[{type:"html",html:'\x3clabel class\x3d"cke_dialog_ui_labeled_label'+g+'" id\x3d"'+c.labelId+'" for\x3d"'+c.inputId+'"'+(a.labelStyle?' style\x3d"'+a.labelStyle+'"':"")+"\x3e"+CKEDITOR.tools.htmlEncode(a.label)+"\x3c/label\x3e"},{type:"html",html:'\x3cspan class\x3d"cke_dialog_ui_labeled_content"'+(a.controlStyle?' style\x3d"'+a.controlStyle+ +'"':"")+"\x3e"+f.call(this,b,a)+"\x3c/span\x3e"}]},CKEDITOR.dialog._.uiElementBuilders.hbox.build(b,g,e));return e.join("")})}},textInput:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);var f=this._.inputId=CKEDITOR.tools.getNextId()+"_textInput",c={"class":"cke_dialog_ui_input_"+a.type,id:f,type:a.type};a.validate&&(this.validate=a.validate);a.maxLength&&(c.maxlength=a.maxLength);a.size&&(c.size=a.size);a.inputStyle&&(c.style=a.inputStyle);var e=this,m=!1;b.on("load",function(){e.getInputElement().on("keydown", +function(a){13==a.data.getKeystroke()&&(m=!0)});e.getInputElement().on("keyup",function(a){13==a.data.getKeystroke()&&m&&(b.getButton("ok")&&setTimeout(function(){b.getButton("ok").click()},0),m=!1);e.bidi&&w.call(e,a)},null,null,1E3)});CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){var b=['\x3cdiv class\x3d"cke_dialog_ui_input_',a.type,'" role\x3d"presentation"'];a.width&&b.push('style\x3d"width:'+a.width+'" ');b.push("\x3e\x3cinput ");c["aria-labelledby"]=this._.labelId;this._.required&& +(c["aria-required"]=this._.required);for(var e in c)b.push(e+'\x3d"'+c[e]+'" ');b.push(" /\x3e\x3c/div\x3e");return b.join("")})}},textarea:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);var f=this,c=this._.inputId=CKEDITOR.tools.getNextId()+"_textarea",e={};a.validate&&(this.validate=a.validate);e.rows=a.rows||5;e.cols=a.cols||20;e["class"]="cke_dialog_ui_input_textarea "+(a["class"]||"");"undefined"!=typeof a.inputStyle&&(e.style=a.inputStyle);a.dir&&(e.dir=a.dir);if(f.bidi)b.on("load", +function(){f.getInputElement().on("keyup",w)},f);CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){e["aria-labelledby"]=this._.labelId;this._.required&&(e["aria-required"]=this._.required);var a=['\x3cdiv class\x3d"cke_dialog_ui_input_textarea" role\x3d"presentation"\x3e\x3ctextarea id\x3d"',c,'" '],b;for(b in e)a.push(b+'\x3d"'+CKEDITOR.tools.htmlEncode(e[b])+'" ');a.push("\x3e",CKEDITOR.tools.htmlEncode(f._["default"]),"\x3c/textarea\x3e\x3c/div\x3e");return a.join("")})}},checkbox:function(b, +a,d){if(!(3>arguments.length)){var f=h.call(this,a,{"default":!!a["default"]});a.validate&&(this.validate=a.validate);CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,"span",null,null,function(){var c=CKEDITOR.tools.extend({},a,{id:a.id?a.id+"_checkbox":CKEDITOR.tools.getNextId()+"_checkbox"},!0),e=[],d=CKEDITOR.tools.getNextId()+"_label",g={"class":"cke_dialog_ui_checkbox_input",type:"checkbox","aria-labelledby":d};t(c);a["default"]&&(g.checked="checked");"undefined"!=typeof c.inputStyle&&(c.style=c.inputStyle); +f.checkbox=new CKEDITOR.ui.dialog.uiElement(b,c,e,"input",null,g);e.push(' \x3clabel id\x3d"',d,'" for\x3d"',g.id,'"'+(a.labelStyle?' style\x3d"'+a.labelStyle+'"':"")+"\x3e",CKEDITOR.tools.htmlEncode(a.label),"\x3c/label\x3e");return e.join("")})}},radio:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);this._["default"]||(this._["default"]=this._.initValue=a.items[0][1]);a.validate&&(this.validate=a.validate);var f=[],c=this;a.role="radiogroup";a.includeLabel=!0;CKEDITOR.ui.dialog.labeledElement.call(this, +b,a,d,function(){for(var e=[],d=[],g=(a.id?a.id:CKEDITOR.tools.getNextId())+"_radio",k=0;karguments.length)){var f=h.call(this,a);a.validate&&(this.validate=a.validate);f.inputId=CKEDITOR.tools.getNextId()+"_select";CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){var c=CKEDITOR.tools.extend({},a,{id:a.id?a.id+"_select":CKEDITOR.tools.getNextId()+"_select"},!0),e=[],d=[],g={id:f.inputId,"class":"cke_dialog_ui_input_select","aria-labelledby":this._.labelId};e.push('\x3cdiv class\x3d"cke_dialog_ui_input_', +a.type,'" role\x3d"presentation"');a.width&&e.push('style\x3d"width:'+a.width+'" ');e.push("\x3e");void 0!==a.size&&(g.size=a.size);void 0!==a.multiple&&(g.multiple=a.multiple);t(c);for(var k=0,l;karguments.length)){void 0===a["default"]&&(a["default"]="");var f=CKEDITOR.tools.extend(h.call(this,a),{definition:a,buttons:[]});a.validate&&(this.validate=a.validate);b.on("load",function(){CKEDITOR.document.getById(f.frameId).getParent().addClass("cke_dialog_ui_input_file")});CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){f.frameId=CKEDITOR.tools.getNextId()+"_fileInput";var b=['\x3ciframe frameborder\x3d"0" allowtransparency\x3d"0" class\x3d"cke_dialog_ui_input_file" role\x3d"presentation" id\x3d"', +f.frameId,'" title\x3d"',a.label,'" src\x3d"javascript:void('];b.push(CKEDITOR.env.ie?"(function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+"})()":"0");b.push(')"\x3e\x3c/iframe\x3e');return b.join("")})}},fileButton:function(b,a,d){var f=this;if(!(3>arguments.length)){h.call(this,a);a.validate&&(this.validate=a.validate);var c=CKEDITOR.tools.extend({},a),e=c.onClick;c.className=(c.className?c.className+" ":"")+"cke_dialog_ui_button";c.onClick=function(c){var d= +a["for"];e&&!1===e.call(this,c)||(b.getContentElement(d[0],d[1]).submit(),this.disable())};b.on("load",function(){b.getContentElement(a["for"][0],a["for"][1])._.buttons.push(f)});CKEDITOR.ui.dialog.button.call(this,b,c,d)}},html:function(){var b=/^\s*<[\w:]+\s+([^>]*)?>/,a=/^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/,d=/\/$/;return function(f,c,e){if(!(3>arguments.length)){var m=[],g=c.html;"\x3c"!=g.charAt(0)&&(g="\x3cspan\x3e"+g+"\x3c/span\x3e");var k=c.focus;if(k){var l=this.focus;this.focus=function(){("function"== +typeof k?k:l).call(this);this.fire("focus")};c.isFocusable&&(this.isFocusable=this.isFocusable);this.keyboardFocusable=!0}CKEDITOR.ui.dialog.uiElement.call(this,f,c,m,"span",null,null,"");m=m.join("").match(b);g=g.match(a)||["","",""];d.test(g[1])&&(g[1]=g[1].slice(0,-1),g[2]="/"+g[2]);e.push([g[1]," ",m[1]||"",g[2]].join(""))}}}(),fieldset:function(b,a,d,f,c){var e=c.label;this._={children:a};CKEDITOR.ui.dialog.uiElement.call(this,b,c,f,"fieldset",null,null,function(){var a=[];e&&a.push("\x3clegend"+ +(c.labelStyle?' style\x3d"'+c.labelStyle+'"':"")+"\x3e"+e+"\x3c/legend\x3e");for(var b=0;ba.getChildCount()?(new CKEDITOR.dom.text(b,CKEDITOR.document)).appendTo(a):a.getChild(0).$.nodeValue=b;return this},getLabel:function(){var b= +CKEDITOR.document.getById(this._.labelId);return!b||1>b.getChildCount()?"":b.getChild(0).getText()},eventProcessors:r},!0);CKEDITOR.ui.dialog.button.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{click:function(){return this._.disabled?!1:this.fire("click",{dialog:this._.dialog})},enable:function(){this._.disabled=!1;var b=this.getElement();b&&b.removeClass("cke_disabled")},disable:function(){this._.disabled=!0;this.getElement().addClass("cke_disabled")},isVisible:function(){return this.getElement().getFirst().isVisible()}, +isEnabled:function(){return!this._.disabled},eventProcessors:CKEDITOR.tools.extend({},CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,{onClick:function(b,a){this.on("click",function(){a.apply(this,arguments)})}},!0),accessKeyUp:function(){this.click()},accessKeyDown:function(){this.focus()},keyboardFocusable:!0},!0);CKEDITOR.ui.dialog.textInput.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return CKEDITOR.document.getById(this._.inputId)}, +focus:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&a.$.focus()},0)},select:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&(a.$.focus(),a.$.select())},0)},accessKeyUp:function(){this.select()},setValue:function(b){if(this.bidi){var a=b&&b.charAt(0);(a="‪"==a?"ltr":"‫"==a?"rtl":null)&&(b=b.slice(1));this.setDirectionMarker(a)}b||(b="");return CKEDITOR.ui.dialog.uiElement.prototype.setValue.apply(this,arguments)}, +getValue:function(){var b=CKEDITOR.ui.dialog.uiElement.prototype.getValue.call(this);if(this.bidi&&b){var a=this.getDirectionMarker();a&&(b=("ltr"==a?"‪":"‫")+b)}return b},setDirectionMarker:function(b){var a=this.getInputElement();b?a.setAttributes({dir:b,"data-cke-dir-marker":b}):this.getDirectionMarker()&&a.removeAttributes(["dir","data-cke-dir-marker"])},getDirectionMarker:function(){return this.getInputElement().data("cke-dir-marker")},keyboardFocusable:!0},q,!0);CKEDITOR.ui.dialog.textarea.prototype= +new CKEDITOR.ui.dialog.textInput;CKEDITOR.ui.dialog.select.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return this._.select.getElement()},add:function(b,a,d){var f=new CKEDITOR.dom.element("option",this.getDialog().getParentEditor().document),c=this.getInputElement().$;f.$.text=b;f.$.value=void 0===a||null===a?b:a;void 0===d||null===d?CKEDITOR.env.ie?c.add(f.$):c.add(f.$,null):c.add(f.$,d);return this},remove:function(b){this.getInputElement().$.remove(b); +return this},clear:function(){for(var b=this.getInputElement().$;0b-a;c--)if(this._.tabs[this._.tabIdList[c%a]][0].$.offsetHeight)return this._.tabIdList[c%a];return null}function A(){for(var a=this._.tabIdList.length,b=CKEDITOR.tools.indexOf(this._.tabIdList,this._.currentTabId),c=b+1;ck.width-c.width-g?k.width-c.width+("rtl"==f.lang.dir?0:h[1]):d.x,d.y+h[0]k.height-c.height-g?k.height-c.height+h[2]:d.y,1);b.data.preventDefault()} +function c(){CKEDITOR.document.removeListener("mousemove",b);CKEDITOR.document.removeListener("mouseup",c);if(CKEDITOR.env.ie6Compat){var a=u.getChild(0).getFrameDocument();a.removeListener("mousemove",b);a.removeListener("mouseup",c)}}var e=null,d=null,f=a.getParentEditor(),g=f.config.dialog_magnetDistance,h=CKEDITOR.skin.margins||[0,0,0,0];"undefined"==typeof g&&(g=20);a.parts.title.on("mousedown",function(g){e={x:g.data.$.screenX,y:g.data.$.screenY};CKEDITOR.document.on("mousemove",b);CKEDITOR.document.on("mouseup", +c);d=a.getPosition();if(CKEDITOR.env.ie6Compat){var f=u.getChild(0).getFrameDocument();f.on("mousemove",b);f.on("mouseup",c)}g.data.preventDefault()},a)}function Z(a){function b(b){var c="rtl"==f.lang.dir,n=k.width,q=k.height,G=n+(b.data.$.screenX-m.x)*(c?-1:1)*(a._.moved?1:2),H=q+(b.data.$.screenY-m.y)*(a._.moved?1:2),B=a._.element.getFirst(),B=c&&B.getComputedStyle("right"),C=a.getPosition();C.y+H>p.height&&(H=p.height-C.y);(c?B:C.x)+G>p.width&&(G=p.width-(c?B:C.x));if(d==CKEDITOR.DIALOG_RESIZE_WIDTH|| +d==CKEDITOR.DIALOG_RESIZE_BOTH)n=Math.max(e.minWidth||0,G-g);if(d==CKEDITOR.DIALOG_RESIZE_HEIGHT||d==CKEDITOR.DIALOG_RESIZE_BOTH)q=Math.max(e.minHeight||0,H-h);a.resize(n,q);a._.moved||a.layout();b.data.preventDefault()}function c(){CKEDITOR.document.removeListener("mouseup",c);CKEDITOR.document.removeListener("mousemove",b);q&&(q.remove(),q=null);if(CKEDITOR.env.ie6Compat){var a=u.getChild(0).getFrameDocument();a.removeListener("mouseup",c);a.removeListener("mousemove",b)}}var e=a.definition,d=e.resizable; +if(d!=CKEDITOR.DIALOG_RESIZE_NONE){var f=a.getParentEditor(),g,h,p,m,k,q,n=CKEDITOR.tools.addFunction(function(d){k=a.getSize();var e=a.parts.contents;e.$.getElementsByTagName("iframe").length&&(q=CKEDITOR.dom.element.createFromHtml('\x3cdiv class\x3d"cke_dialog_resize_cover" style\x3d"height: 100%; position: absolute; width: 100%;"\x3e\x3c/div\x3e'),e.append(q));h=k.height-a.parts.contents.getSize("height",!(CKEDITOR.env.gecko||CKEDITOR.env.ie&&CKEDITOR.env.quirks));g=k.width-a.parts.contents.getSize("width", +1);m={x:d.screenX,y:d.screenY};p=CKEDITOR.document.getWindow().getViewPaneSize();CKEDITOR.document.on("mousemove",b);CKEDITOR.document.on("mouseup",c);CKEDITOR.env.ie6Compat&&(e=u.getChild(0).getFrameDocument(),e.on("mousemove",b),e.on("mouseup",c));d.preventDefault&&d.preventDefault()});a.on("load",function(){var b="";d==CKEDITOR.DIALOG_RESIZE_WIDTH?b=" cke_resizer_horizontal":d==CKEDITOR.DIALOG_RESIZE_HEIGHT&&(b=" cke_resizer_vertical");b=CKEDITOR.dom.element.createFromHtml('\x3cdiv class\x3d"cke_resizer'+ +b+" cke_resizer_"+f.lang.dir+'" title\x3d"'+CKEDITOR.tools.htmlEncode(f.lang.common.resize)+'" onmousedown\x3d"CKEDITOR.tools.callFunction('+n+', event )"\x3e'+("ltr"==f.lang.dir?"◢":"◣")+"\x3c/div\x3e");a.parts.footer.append(b,1)});f.on("destroy",function(){CKEDITOR.tools.removeFunction(n)})}}function I(a){a.data.preventDefault(1)}function N(a){var b=CKEDITOR.document.getWindow(),c=a.config,e=CKEDITOR.skinName||a.config.skin,d=c.dialog_backgroundCoverColor||("moono-lisa"==e?"black":"white"),e=c.dialog_backgroundCoverOpacity, +f=c.baseFloatZIndex,c=CKEDITOR.tools.genKey(d,e,f),g=z[c];g?g.show():(f=['\x3cdiv tabIndex\x3d"-1" style\x3d"position: ',CKEDITOR.env.ie6Compat?"absolute":"fixed","; z-index: ",f,"; top: 0px; left: 0px; ",CKEDITOR.env.ie6Compat?"":"background-color: "+d,'" class\x3d"cke_dialog_background_cover"\x3e'],CKEDITOR.env.ie6Compat&&(d="\x3chtml\x3e\x3cbody style\x3d\\'background-color:"+d+";\\'\x3e\x3c/body\x3e\x3c/html\x3e",f.push('\x3ciframe hidefocus\x3d"true" frameborder\x3d"0" id\x3d"cke_dialog_background_iframe" src\x3d"javascript:'), +f.push("void((function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.write( '"+d+"' );document.close();")+"})())"),f.push('" style\x3d"position:absolute;left:0;top:0;width:100%;height: 100%;filter: progid:DXImageTransform.Microsoft.Alpha(opacity\x3d0)"\x3e\x3c/iframe\x3e')),f.push("\x3c/div\x3e"),g=CKEDITOR.dom.element.createFromHtml(f.join("")),g.setOpacity(void 0!==e?e:.5),g.on("keydown",I),g.on("keypress",I),g.on("keyup",I),g.appendTo(CKEDITOR.document.getBody()), +z[c]=g);a.focusManager.add(g);u=g;a=function(){var a=b.getViewPaneSize();g.setStyles({width:a.width+"px",height:a.height+"px"})};var h=function(){var a=b.getScrollPosition(),c=CKEDITOR.dialog._.currentTop;g.setStyles({left:a.x+"px",top:a.y+"px"});if(c){do a=c.getPosition(),c.move(a.x,a.y);while(c=c._.parentDialog)}};J=a;b.on("resize",a);a();CKEDITOR.env.mac&&CKEDITOR.env.webkit||g.focus();if(CKEDITOR.env.ie6Compat){var p=function(){h();arguments.callee.prevScrollHandler.apply(this,arguments)};b.$.setTimeout(function(){p.prevScrollHandler= +window.onscroll||function(){};window.onscroll=p},0);h()}}function O(a){u&&(a.focusManager.remove(u),a=CKEDITOR.document.getWindow(),u.hide(),a.removeListener("resize",J),CKEDITOR.env.ie6Compat&&a.$.setTimeout(function(){window.onscroll=window.onscroll&&window.onscroll.prevScrollHandler||null},0),J=null)}var v=CKEDITOR.tools.cssLength,W='\x3cdiv class\x3d"cke_reset_all {editorId} {editorDialogClass} {hidpi}" dir\x3d"{langDir}" lang\x3d"{langCode}" role\x3d"dialog" aria-labelledby\x3d"cke_dialog_title_{id}"\x3e\x3ctable class\x3d"cke_dialog '+ +CKEDITOR.env.cssClass+' cke_{langDir}" style\x3d"position:absolute" role\x3d"presentation"\x3e\x3ctr\x3e\x3ctd role\x3d"presentation"\x3e\x3cdiv class\x3d"cke_dialog_body" role\x3d"presentation"\x3e\x3cdiv id\x3d"cke_dialog_title_{id}" class\x3d"cke_dialog_title" role\x3d"presentation"\x3e\x3c/div\x3e\x3ca id\x3d"cke_dialog_close_button_{id}" class\x3d"cke_dialog_close_button" href\x3d"javascript:void(0)" title\x3d"{closeTitle}" role\x3d"button"\x3e\x3cspan class\x3d"cke_label"\x3eX\x3c/span\x3e\x3c/a\x3e\x3cdiv id\x3d"cke_dialog_tabs_{id}" class\x3d"cke_dialog_tabs" role\x3d"tablist"\x3e\x3c/div\x3e\x3ctable class\x3d"cke_dialog_contents" role\x3d"presentation"\x3e\x3ctr\x3e\x3ctd id\x3d"cke_dialog_contents_{id}" class\x3d"cke_dialog_contents_body" role\x3d"presentation"\x3e\x3c/td\x3e\x3c/tr\x3e\x3ctr\x3e\x3ctd id\x3d"cke_dialog_footer_{id}" class\x3d"cke_dialog_footer" role\x3d"presentation"\x3e\x3c/td\x3e\x3c/tr\x3e\x3c/table\x3e\x3c/div\x3e\x3c/td\x3e\x3c/tr\x3e\x3c/table\x3e\x3c/div\x3e'; +CKEDITOR.dialog=function(a,b){function c(){var a=l._.focusList;a.sort(function(a,b){return a.tabIndex!=b.tabIndex?b.tabIndex-a.tabIndex:a.focusIndex-b.focusIndex});for(var b=a.length,c=0;cb.length)){var c=l._.currentFocusIndex;l._.tabBarMode&&0>a&&(c=0);try{b[c].getInputElement().$.blur()}catch(d){}var e=c,g=1c.height|| +b.width+(0c.width?a.setStyle("position","absolute"):a.setStyle("position","fixed"));this.move(this._.moved?this._.position.x:e,this._.moved?this._.position.y:d)},foreach:function(a){for(var b in this._.contents)for(var c in this._.contents[b])a.call(this,this._.contents[b][c]);return this},reset:function(){var a=function(a){a.reset&&a.reset(1)};return function(){this.foreach(a);return this}}(),setupContent:function(){var a=arguments;this.foreach(function(b){b.setup&&b.setup.apply(b,a)})}, +commitContent:function(){var a=arguments;this.foreach(function(b){CKEDITOR.env.ie&&this._.currentFocusIndex==b.focusIndex&&b.getInputElement().$.blur();b.commit&&b.commit.apply(b,a)})},hide:function(){if(this.parts.dialog.isVisible()){this.fire("hide",{});this._.editor.fire("dialogHide",this);this.selectPage(this._.tabIdList[0]);var a=this._.element;a.setStyle("display","none");this.parts.dialog.setStyle("visibility","hidden");for(ba(this);CKEDITOR.dialog._.currentTop!=this;)CKEDITOR.dialog._.currentTop.hide(); +if(this._.parentDialog){var b=this._.parentDialog.getElement().getFirst();b.setStyle("z-index",parseInt(b.$.style.zIndex,10)+Math.floor(this._.editor.config.baseFloatZIndex/2))}else O(this._.editor);if(CKEDITOR.dialog._.currentTop=this._.parentDialog)CKEDITOR.dialog._.currentZIndex-=10;else{CKEDITOR.dialog._.currentZIndex=null;a.removeListener("keydown",Q);a.removeListener("keyup",R);var c=this._.editor;c.focus();setTimeout(function(){c.focusManager.unlock();CKEDITOR.env.iOS&&c.window.focus()},0)}delete this._.parentDialog; +this.foreach(function(a){a.resetInitValue&&a.resetInitValue()});this.setState(CKEDITOR.DIALOG_STATE_IDLE)}},addPage:function(a){if(!a.requiredContent||this._.editor.filter.check(a.requiredContent)){for(var b=[],c=a.label?' title\x3d"'+CKEDITOR.tools.htmlEncode(a.label)+'"':"",e=CKEDITOR.dialog._.uiElementBuilders.vbox.build(this,{type:"vbox",className:"cke_dialog_page_contents",children:a.elements,expand:!!a.expand,padding:a.padding,style:a.style||"width: 100%;"},b),d=this._.contents[a.id]={},f=e.getChild(), +g=0;e=f.shift();)e.notAllowed||"hbox"==e.type||"vbox"==e.type||g++,d[e.id]=e,"function"==typeof e.getChild&&f.push.apply(f,e.getChild());g||(a.hidden=!0);b=CKEDITOR.dom.element.createFromHtml(b.join(""));b.setAttribute("role","tabpanel");e=CKEDITOR.env;d="cke_"+a.id+"_"+CKEDITOR.tools.getNextNumber();c=CKEDITOR.dom.element.createFromHtml(['\x3ca class\x3d"cke_dialog_tab"',0arguments.length)){var h=(e.call?e(b):e)|| +"div",p=["\x3c",h," "],m=(d&&d.call?d(b):d)||{},k=(f&&f.call?f(b):f)||{},q=(g&&g.call?g.call(this,a,b):g)||"",n=this.domId=k.id||CKEDITOR.tools.getNextId()+"_uiElement";b.requiredContent&&!a.getParentEditor().filter.check(b.requiredContent)&&(m.display="none",this.notAllowed=!0);k.id=n;var r={};b.type&&(r["cke_dialog_ui_"+b.type]=1);b.className&&(r[b.className]=1);b.disabled&&(r.cke_disabled=1);for(var l=k["class"]&&k["class"].split?k["class"].split(" "):[],n=0;nCKEDITOR.env.version?"cke_dialog_ui_focused":"";b.on("focus",function(){a._.tabBarMode=!1;a._.hasFocus=!0;t.fire("focus");c&&this.addClass(c)});b.on("blur",function(){t.fire("blur");c&&this.removeClass(c)})}});CKEDITOR.tools.extend(this,b);this.keyboardFocusable&&(this.tabIndex= +b.tabIndex||0,this.focusIndex=a._.focusList.push(this)-1,this.on("focus",function(){a._.currentFocusIndex=t.focusIndex}))}},hbox:function(a,b,c,e,d){if(!(4>arguments.length)){this._||(this._={});var f=this._.children=b,g=d&&d.widths||null,h=d&&d.height||null,p,m={role:"presentation"};d&&d.align&&(m.align=d.align);CKEDITOR.ui.dialog.uiElement.call(this,a,d||{type:"hbox"},e,"table",{},m,function(){var a=['\x3ctbody\x3e\x3ctr class\x3d"cke_dialog_ui_hbox"\x3e'];for(p=0;parguments.length)){this._||(this._={});var f=this._.children=b,g=d&&d.width||null,h=d&&d.heights||null;CKEDITOR.ui.dialog.uiElement.call(this,a,d||{type:"vbox"},e,"div",null,{role:"presentation"},function(){var b=['\x3ctable role\x3d"presentation" cellspacing\x3d"0" border\x3d"0" '];b.push('style\x3d"');d&&d.expand&&b.push("height:100%;");b.push("width:"+v(g||"100%"),";");CKEDITOR.env.webkit&&b.push("float:none;");b.push('"');b.push('align\x3d"', +CKEDITOR.tools.htmlEncode(d&&d.align||("ltr"==a.getParentEditor().lang.dir?"left":"right")),'" ');b.push("\x3e\x3ctbody\x3e");for(var e=0;earguments.length)return this._.children.concat();a.splice||(a=[a]);return 2> +a.length?this._.children[a[0]]:this._.children[a[0]]&&this._.children[a[0]].getChild?this._.children[a[0]].getChild(a.slice(1,a.length)):null}},!0);CKEDITOR.ui.dialog.vbox.prototype=new CKEDITOR.ui.dialog.hbox;(function(){var a={build:function(a,c,e){for(var d=c.children,f,g=[],h=[],p=0;p]+data-cke-bookmark[^<]*?<\/span>/ig,"");d&&q(b,c)})}function r(){if("wysiwyg"==b.mode){var a=t("paste");b.getCommand("cut").setState(t("cut")); +b.getCommand("copy").setState(t("copy"));b.getCommand("paste").setState(a);b.fire("pasteState",a)}}function t(a){if(x&&a in{paste:1,cut:1})return CKEDITOR.TRISTATE_DISABLED;if("paste"==a)return CKEDITOR.TRISTATE_OFF;a=b.getSelection();var c=a.getRanges();return a.getType()==CKEDITOR.SELECTION_NONE||1==c.length&&c[0].collapsed?CKEDITOR.TRISTATE_DISABLED:CKEDITOR.TRISTATE_OFF}var m=CKEDITOR.plugins.clipboard,p=0,v=0,x=0;(function(){b.on("key",k);b.on("contentDom",a);b.on("selectionChange",function(b){x= +b.data.selection.getRanges()[0].checkReadOnly();r()});b.contextMenu&&b.contextMenu.addListener(function(b,a){x=a.getRanges()[0].checkReadOnly();return{cut:t("cut"),copy:t("copy"),paste:t("paste")}})})();(function(){function a(c,d,g,e,h){var k=b.lang.clipboard[d];b.addCommand(d,g);b.ui.addButton&&b.ui.addButton(c,{label:k,command:d,toolbar:"clipboard,"+e});b.addMenuItems&&b.addMenuItem(d,{label:k,command:d,group:"clipboard",order:h})}a("Cut","cut",c("cut"),10,1);a("Copy","copy",c("copy"),20,4);a("Paste", +"paste",e(),30,8)})();b.getClipboardData=function(a,c){function d(a){a.removeListener();a.cancel();c(a.data)}function g(a){a.removeListener();a.cancel();f=!0;c({type:k,dataValue:a.data.dataValue,dataTransfer:a.data.dataTransfer,method:"paste"})}function e(){this.customTitle=a&&a.title}var h=!1,k="auto",f=!1;c||(c=a,a=null);b.on("paste",d,null,null,0);b.on("beforePaste",function(a){a.removeListener();h=!0;k=a.data.type},null,null,1E3);!1===w()&&(b.removeListener("paste",d),h&&b.fire("pasteDialog", +e)?(b.on("pasteDialogCommit",g),b.on("dialogHide",function(a){a.removeListener();a.data.removeListener("pasteDialogCommit",g);setTimeout(function(){f||c(null)},10)})):c(null))}}function A(b){if(CKEDITOR.env.webkit){if(!b.match(/^[^<]*$/g)&&!b.match(/^(
<\/div>|
[^<]*<\/div>)*$/gi))return"html"}else if(CKEDITOR.env.ie){if(!b.match(/^([^<]|)*$/gi)&&!b.match(/^(

([^<]|)*<\/p>|(\r\n))*$/gi))return"html"}else if(CKEDITOR.env.gecko){if(!b.match(/^([^<]|)*$/gi))return"html"}else return"html"; +return"htmlifiedtext"}function B(b,a){function c(a){return CKEDITOR.tools.repeat("\x3c/p\x3e\x3cp\x3e",~~(a/2))+(1==a%2?"\x3cbr\x3e":"")}a=a.replace(/\s+/g," ").replace(/> +/gi,"\x3cbr\x3e");a=a.replace(/<\/?[A-Z]+>/g,function(a){return a.toLowerCase()});if(a.match(/^[^<]$/))return a;CKEDITOR.env.webkit&&-1(
|)<\/div>)(?!$|(

(
|)<\/div>))/g,"\x3cbr\x3e").replace(/^(
(
|)<\/div>){2}(?!$)/g,"\x3cdiv\x3e\x3c/div\x3e"), +a.match(/
(
|)<\/div>/)&&(a="\x3cp\x3e"+a.replace(/(
(
|)<\/div>)+/g,function(a){return c(a.split("\x3c/div\x3e\x3cdiv\x3e").length+1)})+"\x3c/p\x3e"),a=a.replace(/<\/div>
/g,"\x3cbr\x3e"),a=a.replace(/<\/?div>/g,""));CKEDITOR.env.gecko&&b.enterMode!=CKEDITOR.ENTER_BR&&(CKEDITOR.env.gecko&&(a=a.replace(/^

$/,"\x3cbr\x3e")),-1){2,}/g,function(a){return c(a.length/4)})+"\x3c/p\x3e"));return C(b,a)}function D(){function b(){var a= +{},b;for(b in CKEDITOR.dtd)"$"!=b.charAt(0)&&"div"!=b&&"span"!=b&&(a[b]=1);return a}var a={};return{get:function(c){return"plain-text"==c?a.plainText||(a.plainText=new CKEDITOR.filter("br")):"semantic-content"==c?((c=a.semanticContent)||(c=new CKEDITOR.filter,c.allow({$1:{elements:b(),attributes:!0,styles:!1,classes:!1}}),c=a.semanticContent=c),c):c?new CKEDITOR.filter(c):null}}}function y(b,a,c){a=CKEDITOR.htmlParser.fragment.fromHtml(a);var e=new CKEDITOR.htmlParser.basicWriter;c.applyTo(a,!0,!1, +b.activeEnterMode);a.writeHtml(e);return e.getHtml()}function C(b,a){b.enterMode==CKEDITOR.ENTER_BR?a=a.replace(/(<\/p>

)+/g,function(a){return CKEDITOR.tools.repeat("\x3cbr\x3e",a.length/7*2)}).replace(/<\/?p>/g,""):b.enterMode==CKEDITOR.ENTER_DIV&&(a=a.replace(/<(\/)?p>/g,"\x3c$1div\x3e"));return a}function E(b){b.data.preventDefault();b.data.$.dataTransfer.dropEffect="none"}function F(b){var a=CKEDITOR.plugins.clipboard;b.on("contentDom",function(){function c(a,c,d){c.select();q(b,{dataTransfer:d, +method:"drop"},1);d.sourceEditor.fire("saveSnapshot");d.sourceEditor.editable().extractHtmlFromRange(a);d.sourceEditor.getSelection().selectRanges([a]);d.sourceEditor.fire("saveSnapshot")}function e(d,c){d.select();q(b,{dataTransfer:c,method:"drop"},1);a.resetDragDataTransfer()}function f(a,d,c){var g={$:a.data.$,target:a.data.getTarget()};d&&(g.dragRange=d);c&&(g.dropRange=c);!1===b.fire(a.name,g)&&a.data.preventDefault()}function g(a){a.type!=CKEDITOR.NODE_ELEMENT&&(a=a.getParent());return a.getChildCount()} +var d=b.editable(),h=CKEDITOR.plugins.clipboard.getDropTarget(b),n=b.ui.space("top"),w=b.ui.space("bottom");a.preventDefaultDropOnElement(n);a.preventDefaultDropOnElement(w);d.attachListener(h,"dragstart",f);d.attachListener(b,"dragstart",a.resetDragDataTransfer,a,null,1);d.attachListener(b,"dragstart",function(d){a.initDragDataTransfer(d,b)},null,null,2);d.attachListener(b,"dragstart",function(){var d=a.dragRange=b.getSelection().getRanges()[0];CKEDITOR.env.ie&&10>CKEDITOR.env.version&&(a.dragStartContainerChildCount= +d?g(d.startContainer):null,a.dragEndContainerChildCount=d?g(d.endContainer):null)},null,null,100);d.attachListener(h,"dragend",f);d.attachListener(b,"dragend",a.initDragDataTransfer,a,null,1);d.attachListener(b,"dragend",a.resetDragDataTransfer,a,null,100);d.attachListener(h,"dragover",function(a){var b=a.data.getTarget();b&&b.is&&b.is("html")?a.data.preventDefault():CKEDITOR.env.ie&&CKEDITOR.plugins.clipboard.isFileApiSupported&&a.data.$.dataTransfer.types.contains("Files")&&a.data.preventDefault()}); +d.attachListener(h,"drop",function(d){if(!d.data.$.defaultPrevented){d.data.preventDefault();var c=d.data.getTarget();if(!c.isReadOnly()||c.type==CKEDITOR.NODE_ELEMENT&&c.is("html")){var c=a.getRangeAtDropPosition(d,b),g=a.dragRange;c&&f(d,g,c)}}},null,null,9999);d.attachListener(b,"drop",a.initDragDataTransfer,a,null,1);d.attachListener(b,"drop",function(d){if(d=d.data){var g=d.dropRange,h=d.dragRange,f=d.dataTransfer;f.getTransferType(b)==CKEDITOR.DATA_TRANSFER_INTERNAL?setTimeout(function(){a.internalDrop(h, +g,f,b)},0):f.getTransferType(b)==CKEDITOR.DATA_TRANSFER_CROSS_EDITORS?c(h,g,f):e(g,f)}},null,null,9999)})}CKEDITOR.plugins.add("clipboard",{requires:"dialog",init:function(b){var a,c=D();b.config.forcePasteAsPlainText?a="plain-text":b.config.pasteFilter?a=b.config.pasteFilter:!CKEDITOR.env.webkit||"pasteFilter"in b.config||(a="semantic-content");b.pasteFilter=c.get(a);z(b);F(b);CKEDITOR.dialog.add("paste",CKEDITOR.getUrl(this.path+"dialogs/paste.js"));if(CKEDITOR.env.gecko){var e=["image/png","image/jpeg", +"image/gif"],f;b.on("paste",function(a){var d=a.data,c=d.dataTransfer;if(!d.dataValue&&"paste"==d.method&&c&&1==c.getFilesCount()&&f!=c.id&&(c=c.getFile(0),-1!=CKEDITOR.tools.indexOf(e,c.type))){var n=new FileReader;n.addEventListener("load",function(){a.data.dataValue='\x3cimg src\x3d"'+n.result+'" /\x3e';b.fire("paste",a.data)},!1);n.addEventListener("abort",function(){b.fire("paste",a.data)},!1);n.addEventListener("error",function(){b.fire("paste",a.data)},!1);n.readAsDataURL(c);f=d.dataTransfer.id; +a.stop()}},null,null,1)}b.on("paste",function(a){a.data.dataTransfer||(a.data.dataTransfer=new CKEDITOR.plugins.clipboard.dataTransfer);if(!a.data.dataValue){var d=a.data.dataTransfer,c=d.getData("text/html");if(c)a.data.dataValue=c,a.data.type="html";else if(c=d.getData("text/plain"))a.data.dataValue=b.editable().transformPlainTextToHtml(c),a.data.type="text"}},null,null,1);b.on("paste",function(a){var b=a.data.dataValue,c=CKEDITOR.dtd.$block;-1 <\/span>/gi, +" "),"html"!=a.data.type&&(b=b.replace(/]*>([^<]*)<\/span>/gi,function(a,b){return b.replace(/\t/g,"\x26nbsp;\x26nbsp; \x26nbsp;")})),-1/,"")),b=b.replace(/(<[^>]+) class="Apple-[^"]*"/gi,"$1"));if(b.match(/^<[^<]+cke_(editable|contents)/i)){var e,f,k=new CKEDITOR.dom.element("div");for(k.setHtml(b);1==k.getChildCount()&& +(e=k.getFirst())&&e.type==CKEDITOR.NODE_ELEMENT&&(e.hasClass("cke_editable")||e.hasClass("cke_contents"));)k=f=e;f&&(b=f.getHtml().replace(/
$/i,""))}CKEDITOR.env.ie?b=b.replace(/^ (?: |\r\n)?<(\w+)/g,function(b,d){return d.toLowerCase()in c?(a.data.preSniffing="html","\x3c"+d):b}):CKEDITOR.env.webkit?b=b.replace(/<\/(\w+)>


<\/div>$/,function(b,d){return d in c?(a.data.endsWithEOL=1,"\x3c/"+d+"\x3e"):b}):CKEDITOR.env.gecko&&(b=b.replace(/(\s)
$/,"$1"));a.data.dataValue=b},null, +null,3);b.on("paste",function(a){a=a.data;var d=a.type,e=a.dataValue,f,p=b.config.clipboard_defaultContentType||"html",k=a.dataTransfer.getTransferType(b);f="html"==d||"html"==a.preSniffing?"html":A(e);"htmlifiedtext"==f&&(e=B(b.config,e));"text"==d&&"html"==f?e=y(b,e,c.get("plain-text")):k==CKEDITOR.DATA_TRANSFER_EXTERNAL&&b.pasteFilter&&!a.dontFilter&&(e=y(b,e,b.pasteFilter));a.startsWithEOL&&(e='\x3cbr data-cke-eol\x3d"1"\x3e'+e);a.endsWithEOL&&(e+='\x3cbr data-cke-eol\x3d"1"\x3e');"auto"==d&& +(d="html"==f||"html"==p?"html":"text");a.type=d;a.dataValue=e;delete a.preSniffing;delete a.startsWithEOL;delete a.endsWithEOL},null,null,6);b.on("paste",function(a){a=a.data;a.dataValue&&(b.insertHtml(a.dataValue,a.type,a.range),setTimeout(function(){b.fire("afterPaste")},0))},null,null,1E3);b.on("pasteDialog",function(a){setTimeout(function(){b.openDialog("paste",a.data)},0)})}});CKEDITOR.plugins.clipboard={isCustomCopyCutSupported:!CKEDITOR.env.ie&&!CKEDITOR.env.iOS,isCustomDataTypesSupported:!CKEDITOR.env.ie, +isFileApiSupported:!CKEDITOR.env.ie||9CKEDITOR.env.version||a.isInline()?a:b.document},fixSplitNodesAfterDrop:function(b,a,c,e){function f(b, +c,e){var f=b;f.type==CKEDITOR.NODE_TEXT&&(f=b.getParent());if(f.equals(c)&&e!=c.getChildCount())return b=a.startContainer.getChild(a.startOffset-1),c=a.startContainer.getChild(a.startOffset),b&&b.type==CKEDITOR.NODE_TEXT&&c&&c.type==CKEDITOR.NODE_TEXT&&(e=b.getLength(),b.setText(b.getText()+c.getText()),c.remove(),a.setStart(b,e),a.collapse(!0)),!0}var g=a.startContainer;"number"==typeof e&&"number"==typeof c&&g.type==CKEDITOR.NODE_ELEMENT&&(f(b.startContainer,g,c)||f(b.endContainer,g,e))},isDropRangeAffectedByDragRange:function(b, +a){var c=a.startContainer,e=a.endOffset;return b.endContainer.equals(c)&&b.endOffset<=e||b.startContainer.getParent().equals(c)&&b.startContainer.getIndex()CKEDITOR.env.version&&this.fixSplitNodesAfterDrop(b,a,f.dragStartContainerChildCount,f.dragEndContainerChildCount); +(h=this.isDropRangeAffectedByDragRange(b,a))||(d=b.createBookmark(!1));f=a.clone().createBookmark(!1);h&&(d=b.createBookmark(!1));b=d.startNode;a=d.endNode;h=f.startNode;a&&b.getPosition(h)&CKEDITOR.POSITION_PRECEDING&&a.getPosition(h)&CKEDITOR.POSITION_FOLLOWING&&h.insertBefore(b);b=e.createRange();b.moveToBookmark(d);g.extractHtmlFromRange(b,1);a=e.createRange();a.moveToBookmark(f);q(e,{dataTransfer:c,method:"drop",range:a},1);e.fire("unlockSnapshot")},getRangeAtDropPosition:function(b,a){var c= +b.data.$,e=c.clientX,f=c.clientY,g=a.getSelection(!0).getRanges()[0],d=a.createRange();if(b.data.testRange)return b.data.testRange;if(document.caretRangeFromPoint)c=a.document.$.caretRangeFromPoint(e,f),d.setStart(CKEDITOR.dom.node(c.startContainer),c.startOffset),d.collapse(!0);else if(c.rangeParent)d.setStart(CKEDITOR.dom.node(c.rangeParent),c.rangeOffset),d.collapse(!0);else{if(CKEDITOR.env.ie&&8n&&!h;n++){if(!h)try{c.moveToPoint(e,f-n),h=!0}catch(p){}if(!h)try{c.moveToPoint(e,f+n),h=!0}catch(k){}}if(h){var u="cke-temp-"+(new Date).getTime();c.pasteHTML('\x3cspan id\x3d"'+u+'"\x3e​\x3c/span\x3e');var r=a.document.getById(u);d.moveToPosition(r,CKEDITOR.POSITION_BEFORE_START);r.remove()}else{var t=a.document.$.elementFromPoint(e,f),m=new CKEDITOR.dom.element(t),q;if(m.equals(a.editable())||"html"==m.getName())return g&&g.startContainer&& +!g.startContainer.equals(a.editable())?g:null;q=m.getClientRect();e/i,bodyRegExp:/([\s\S]*)<\/body>/i,fragmentRegExp:/\x3c!--(?:Start|End)Fragment--\x3e/g,data:{},files:[],normalizeType:function(a){a=a.toLowerCase();return"text"==a||"text/plain"==a?"Text":"url"==a?"URL":a}};this.id=this.getData(p);this.id||(this.id="Text"==p?"":"cke-"+CKEDITOR.tools.getUniqueId());if("Text"!=p)try{this.$.setData(p,this.id)}catch(c){}a&&(this.sourceEditor= +a,this.setData("text/html",a.getSelectedHtml(1)),"Text"==p||this.getData("text/plain")||this.setData("text/plain",a.getSelection().getSelectedText()))};CKEDITOR.DATA_TRANSFER_INTERNAL=1;CKEDITOR.DATA_TRANSFER_CROSS_EDITORS=2;CKEDITOR.DATA_TRANSFER_EXTERNAL=3;CKEDITOR.plugins.clipboard.dataTransfer.prototype={getData:function(b){b=this._.normalizeType(b);var a=this._.data[b];if(void 0===a||null===a||""===a)try{a=this.$.getData(b)}catch(c){}if(void 0===a||null===a||""===a)a="";"text/html"==b?(a=a.replace(this._.metaRegExp, +""),(b=this._.bodyRegExp.exec(a))&&b.length&&(a=b[1],a=a.replace(this._.fragmentRegExp,""))):"Text"==b&&CKEDITOR.env.gecko&&this.getFilesCount()&&"file://"==a.substring(0,7)&&(a="");return a},setData:function(b,a){b=this._.normalizeType(b);this._.data[b]=a;if(CKEDITOR.plugins.clipboard.isCustomDataTypesSupported||"URL"==b||"Text"==b){"Text"==p&&"Text"==b&&(this.id=a);try{this.$.setData(b,a)}catch(c){}}},getTransferType:function(b){return this.sourceEditor?this.sourceEditor==b?CKEDITOR.DATA_TRANSFER_INTERNAL: +CKEDITOR.DATA_TRANSFER_CROSS_EDITORS:CKEDITOR.DATA_TRANSFER_EXTERNAL},cacheData:function(){function b(b){b=a._.normalizeType(b);var c=a.getData(b);c&&(a._.data[b]=c)}if(this.$){var a=this,c,e;if(CKEDITOR.plugins.clipboard.isCustomDataTypesSupported){if(this.$.types)for(c=0;ce.length&&(a=g.document.createElement(g.config.enterMode==CKEDITOR.ENTER_P?"p":"div"),b=h.shift(),c.insertNode(a),a.append(new CKEDITOR.dom.text("",g.document)),c.moveToBookmark(b),c.selectNodeContents(a),c.collapse(!0),b=c.createBookmark(),e.push(a),h.unshift(b));d=e[0].getParent();c=[];for(b=0;bc?d+c:b.width>c?d-a.left:d-a.right+b.width): +lc?d-c:b.width>c?d-a.right+b.width:d-a.left);c=a.top;b.height-a.tope?n-e:b.height>e?n-a.bottom+b.height:n-a.top);CKEDITOR.env.ie&&(b=a=new CKEDITOR.dom.element(k.$.offsetParent),"html"==b.getName()&&(b=b.getDocument().getBody()),"rtl"==b.getComputedStyle("direction")&&(d=CKEDITOR.env.ie8Compat?d-2*k.getDocument().getDocumentElement().$.scrollLeft:d-(a.$.scrollWidth-a.$.clientWidth)));var a=k.getFirst(),f;(f=a.getCustomData("activePanel"))&&f.onHide&&f.onHide.call(this,1);a.setCustomData("activePanel", +this);k.setStyles({top:n+"px",left:d+"px"});k.setOpacity(1);g&&g()},this);m.isLoaded?a():m.onLoad=a;CKEDITOR.tools.setTimeout(function(){var a=CKEDITOR.env.webkit&&CKEDITOR.document.getWindow().getScrollPosition().y;this.focus();p.element.focus();CKEDITOR.env.webkit&&(CKEDITOR.document.getBody().$.scrollTop=a);this.allowBlur(!0);this._.editor.fire("panelShow",this)},0,this)},CKEDITOR.env.air?200:0,this);this.visible=1;this.onShow&&this.onShow.call(this)},reposition:function(){var a=this._.showBlockParams; +this.visible&&this._.showBlockParams&&(this.hide(),this.showBlock.apply(this,a))},focus:function(){if(CKEDITOR.env.webkit){var a=CKEDITOR.document.getActive();a&&!a.equals(this._.iframe)&&a.$.blur()}(this._.lastFocused||this._.iframe.getFrameDocument().getWindow()).focus()},blur:function(){var a=this._.iframe.getFrameDocument().getActive();a&&a.is("a")&&(this._.lastFocused=a)},hide:function(a){if(this.visible&&(!this.onHide||!0!==this.onHide.call(this))){this.hideChild();CKEDITOR.env.gecko&&this._.iframe.getFrameDocument().$.activeElement.blur(); +this.element.setStyle("display","none");this.visible=0;this.element.getFirst().removeCustomData("activePanel");if(a=a&&this._.returnFocus)CKEDITOR.env.webkit&&a.type&&a.getWindow().$.focus(),a.focus();delete this._.lastFocused;this._.showBlockParams=null;this._.editor.fire("panelHide",this)}},allowBlur:function(a){var b=this._.panel;void 0!==a&&(b.allowBlur=a);return b.allowBlur},showAsChild:function(a,b,c,f,h,g){if(this._.activeChild!=a||a._.panel._.offsetParentId!=c.getId())this.hideChild(),a.onHide= +CKEDITOR.tools.bind(function(){CKEDITOR.tools.setTimeout(function(){this._.focused||this.hide()},0,this)},this),this._.activeChild=a,this._.focused=!1,a.showBlock(b,c,f,h,g),this.blur(),(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)&&setTimeout(function(){a.element.getChild(0).$.style.cssText+=""},100)},hideChild:function(a){var b=this._.activeChild;b&&(delete b.onHide,delete this._.activeChild,b.hide(),a&&this.focus())}}});CKEDITOR.on("instanceDestroyed",function(){var a=CKEDITOR.tools.isEmpty(CKEDITOR.instances), +b;for(b in f){var c=f[b];a?c.destroy():c.element.hide()}a&&(f={})})})();CKEDITOR.plugins.add("colorbutton",{requires:"panelbutton,floatpanel",init:function(e){function t(a,c,f,g,l){var m=new CKEDITOR.style(k["colorButton_"+c+"Style"]),n=CKEDITOR.tools.getNextId()+"_colorBox";l=l||{};e.ui.add(a,CKEDITOR.UI_PANELBUTTON,{label:f,title:f,modes:{wysiwyg:1},editorFocus:0,toolbar:"colors,"+g,allowedContent:m,requiredContent:m,contentTransformations:l.contentTransformations,panel:{css:CKEDITOR.skin.getPath("editor"),attributes:{role:"listbox","aria-label":h.panelTitle}},onBlock:function(a, +b){b.autoSize=!0;b.element.addClass("cke_colorblock");b.element.setHtml(x(a,c,n));b.element.getDocument().getBody().setStyle("overflow","hidden");CKEDITOR.ui.fire("ready",this);var d=b.keys,f="rtl"==e.lang.dir;d[f?37:39]="next";d[40]="next";d[9]="next";d[f?39:37]="prev";d[38]="prev";d[CKEDITOR.SHIFT+9]="prev";d[32]="click"},refresh:function(){e.activeFilter.check(m)||this.setState(CKEDITOR.TRISTATE_DISABLED)},onOpen:function(){var a=e.getSelection(),a=a&&a.getStartElement(),a=e.elementPath(a),b;if(a){a= +a.block||a.blockLimit||e.document.getBody();do b=a&&a.getComputedStyle("back"==c?"background-color":"color")||"transparent";while("back"==c&&"transparent"==b&&a&&(a=a.getParent()));b&&"transparent"!=b||(b="#ffffff");!1!==k.colorButton_enableAutomatic&&this._.panel._.iframe.getFrameDocument().getById(n).setStyle("background-color",b);return b}}})}function x(a,c,f){var g=[],l=k.colorButton_colors.split(","),m=k.colorButton_colorsPerRow||6,n=e.plugins.colordialog&&!1!==k.colorButton_enableMore,p=l.length+ +(n?2:1),b=CKEDITOR.tools.addFunction(function(b,c){function d(a){this.removeListener("ok",d);this.removeListener("cancel",d);"ok"==a.name&&f(this.getContentElement("picker","selectedColor").getValue(),c)}var f=arguments.callee;if("?"==b)e.openDialog("colordialog",function(){this.on("ok",d);this.on("cancel",d)});else{e.focus();a.hide();e.fire("saveSnapshot");e.removeStyle(new CKEDITOR.style(k["colorButton_"+c+"Style"],{color:"inherit"}));if(b){var g=k["colorButton_"+c+"Style"];g.childRule="back"== +c?function(a){return u(a)}:function(a){return!(a.is("a")||a.getElementsByTag("a").count())||u(a)};e.applyStyle(new CKEDITOR.style(g,{color:b}))}e.fire("saveSnapshot")}});!1!==k.colorButton_enableAutomatic&&g.push('\x3ca class\x3d"cke_colorauto" _cke_focus\x3d1 hidefocus\x3dtrue title\x3d"',h.auto,'" onclick\x3d"CKEDITOR.tools.callFunction(',b,",null,'",c,"');return false;\" href\x3d\"javascript:void('",h.auto,'\')" role\x3d"option" aria-posinset\x3d"1" aria-setsize\x3d"',p,'"\x3e\x3ctable role\x3d"presentation" cellspacing\x3d0 cellpadding\x3d0 width\x3d"100%"\x3e\x3ctr\x3e\x3ctd colspan\x3d"'+ +m+'" align\x3d"center"\x3e\x3cspan class\x3d"cke_colorbox" id\x3d"',f,'"\x3e\x3c/span\x3e',h.auto,"\x3c/td\x3e\x3c/tr\x3e\x3c/table\x3e\x3c/a\x3e");g.push('\x3ctable role\x3d"presentation" cellspacing\x3d0 cellpadding\x3d0 width\x3d"100%"\x3e');for(f=0;fCKEDITOR.env.version?f.createText("\r"):f.createElement("br"),a.deleteContents(),a.insertNode(b),CKEDITOR.env.needsBrFiller?(f.createText("").insertAfter(b),k&&(l||m.blockLimit).appendBogus(),b.getNext().$.nodeValue="",a.setStartAt(b.getNext(),CKEDITOR.POSITION_AFTER_START)): +a.setStartAt(b,CKEDITOR.POSITION_AFTER_END)),a.collapse(!0),a.select(),a.scrollIntoView()):u(b,d,a,h)}}};var x=CKEDITOR.plugins.enterkey,t=x.enterBr,u=x.enterBlock,w=/^h[1-6]$/})();(function(){function k(b,f){var g={},c=[],e={nbsp:" ",shy:"­",gt:"\x3e",lt:"\x3c",amp:"\x26",apos:"'",quot:'"'};b=b.replace(/\b(nbsp|shy|gt|lt|amp|apos|quot)(?:,|$)/g,function(b,a){var d=f?"\x26"+a+";":e[a];g[d]=f?e[a]:"\x26"+a+";";c.push(d);return""});if(!f&&b){b=b.split(",");var a=document.createElement("div"),d;a.innerHTML="\x26"+b.join(";\x26")+";";d=a.innerHTML;a=null;for(a=0;ah.height-c.bottom?e("pin"):e("bottom"),d=h.width/2,d=l.floatSpacePreferRight?"right":0n.width?"rtl"==l.contentsLangDirection? +"right":"left":d-c.left>c.right-d?"left":"right",n.width>h.width?(d="left",f=0):(f="left"==d?0h.width&&(d="left"==d?"right":"left",f=0)),b.setStyle(d,w(("pin"==m?u:p)+f+("pin"==m?0:"left"==d?v:-v)))):(m="pin",e("pin"),t(d))}}}();if(p){var k=new CKEDITOR.template('\x3cdiv id\x3d"cke_{name}" class\x3d"cke {id} cke_reset_all cke_chrome cke_editor_{name} cke_float cke_{langDir} '+CKEDITOR.env.cssClass+'" dir\x3d"{langDir}" title\x3d"'+(CKEDITOR.env.gecko? +" ":"")+'" lang\x3d"{langCode}" role\x3d"application" style\x3d"{style}"'+(a.title?' aria-labelledby\x3d"cke_{name}_arialbl"':" ")+"\x3e"+(a.title?'\x3cspan id\x3d"cke_{name}_arialbl" class\x3d"cke_voice_label"\x3e{voiceLabel}\x3c/span\x3e':" ")+'\x3cdiv class\x3d"cke_inner"\x3e\x3cdiv id\x3d"{topId}" class\x3d"cke_top" role\x3d"presentation"\x3e{content}\x3c/div\x3e\x3c/div\x3e\x3c/div\x3e'),b=CKEDITOR.document.getBody().append(CKEDITOR.dom.element.createFromHtml(k.output({content:p,id:a.id,langDir:a.lang.dir, +langCode:a.langCode,name:a.name,style:"display:none;z-index:"+(l.baseFloatZIndex-1),topId:a.ui.spaceId("top"),voiceLabel:a.title}))),u=CKEDITOR.tools.eventsBuffer(500,t),e=CKEDITOR.tools.eventsBuffer(100,t);b.unselectable();b.on("mousedown",function(a){a=a.data;a.getTarget().hasAscendant("a",1)||a.preventDefault()});a.on("focus",function(b){t(b);a.on("change",u.input);g.on("scroll",e.input);g.on("resize",e.input)});a.on("blur",function(){b.hide();a.removeListener("change",u.input);g.removeListener("scroll", +e.input);g.removeListener("resize",e.input)});a.on("destroy",function(){g.removeListener("scroll",e.input);g.removeListener("resize",e.input);b.clearCustomData();b.remove()});a.focusManager.hasFocus&&b.show();a.focusManager.add(b,1)}}var g=CKEDITOR.document.getWindow(),w=CKEDITOR.tools.cssLength;CKEDITOR.plugins.add("floatingspace",{init:function(a){a.on("loaded",function(){k(this)},null,null,20)}})})();CKEDITOR.plugins.add("listblock",{requires:"panel",onLoad:function(){var f=CKEDITOR.addTemplate("panel-list",'\x3cul role\x3d"presentation" class\x3d"cke_panel_list"\x3e{items}\x3c/ul\x3e'),g=CKEDITOR.addTemplate("panel-list-item",'\x3cli id\x3d"{id}" class\x3d"cke_panel_listItem" role\x3dpresentation\x3e\x3ca id\x3d"{id}_option" _cke_focus\x3d1 hidefocus\x3dtrue title\x3d"{title}" href\x3d"javascript:void(\'{val}\')" {onclick}\x3d"CKEDITOR.tools.callFunction({clickFn},\'{val}\'); return false;" role\x3d"option"\x3e{text}\x3c/a\x3e\x3c/li\x3e'), +h=CKEDITOR.addTemplate("panel-list-group",'\x3ch1 id\x3d"{id}" class\x3d"cke_panel_grouptitle" role\x3d"presentation" \x3e{label}\x3c/h1\x3e'),k=/\'/g;CKEDITOR.ui.panel.prototype.addListBlock=function(a,b){return this.addBlock(a,new CKEDITOR.ui.listBlock(this.getHolderElement(),b))};CKEDITOR.ui.listBlock=CKEDITOR.tools.createClass({base:CKEDITOR.ui.panel.block,$:function(a,b){b=b||{};var c=b.attributes||(b.attributes={});(this.multiSelect=!!b.multiSelect)&&(c["aria-multiselectable"]=!0);!c.role&& +(c.role="listbox");this.base.apply(this,arguments);this.element.setAttribute("role",c.role);c=this.keys;c[40]="next";c[9]="next";c[38]="prev";c[CKEDITOR.SHIFT+9]="prev";c[32]=CKEDITOR.env.ie?"mouseup":"click";CKEDITOR.env.ie&&(c[13]="mouseup");this._.pendingHtml=[];this._.pendingList=[];this._.items={};this._.groups={}},_:{close:function(){if(this._.started){var a=f.output({items:this._.pendingList.join("")});this._.pendingList=[];this._.pendingHtml.push(a);delete this._.started}},getClick:function(){this._.click|| +(this._.click=CKEDITOR.tools.addFunction(function(a){var b=this.toggle(a);if(this.onClick)this.onClick(a,b)},this));return this._.click}},proto:{add:function(a,b,c){var d=CKEDITOR.tools.getNextId();this._.started||(this._.started=1,this._.size=this._.size||0);this._.items[a]=d;var e;e=CKEDITOR.tools.htmlEncodeAttr(a).replace(k,"\\'");a={id:d,val:e,onclick:CKEDITOR.env.ie?'onclick\x3d"return false;" onmouseup':"onclick",clickFn:this._.getClick(),title:CKEDITOR.tools.htmlEncodeAttr(c||a),text:b||a}; +this._.pendingList.push(g.output(a))},startGroup:function(a){this._.close();var b=CKEDITOR.tools.getNextId();this._.groups[a]=b;this._.pendingHtml.push(h.output({id:b,label:a}))},commit:function(){this._.close();this.element.appendHtml(this._.pendingHtml.join(""));delete this._.size;this._.pendingHtml=[]},toggle:function(a){var b=this.isMarked(a);b?this.unmark(a):this.mark(a);return!b},hideGroup:function(a){var b=(a=this.element.getDocument().getById(this._.groups[a]))&&a.getNext();a&&(a.setStyle("display", +"none"),b&&"ul"==b.getName()&&b.setStyle("display","none"))},hideItem:function(a){this.element.getDocument().getById(this._.items[a]).setStyle("display","none")},showAll:function(){var a=this._.items,b=this._.groups,c=this.element.getDocument(),d;for(d in a)c.getById(a[d]).setStyle("display","");for(var e in b)a=c.getById(b[e]),d=a.getNext(),a.setStyle("display",""),d&&"ul"==d.getName()&&d.setStyle("display","")},mark:function(a){this.multiSelect||this.unmarkAll();a=this._.items[a];var b=this.element.getDocument().getById(a); +b.addClass("cke_selected");this.element.getDocument().getById(a+"_option").setAttribute("aria-selected",!0);this.onMark&&this.onMark(b)},unmark:function(a){var b=this.element.getDocument();a=this._.items[a];var c=b.getById(a);c.removeClass("cke_selected");b.getById(a+"_option").removeAttribute("aria-selected");this.onUnmark&&this.onUnmark(c)},unmarkAll:function(){var a=this._.items,b=this.element.getDocument(),c;for(c in a){var d=a[c];b.getById(d).removeClass("cke_selected");b.getById(d+"_option").removeAttribute("aria-selected")}this.onUnmark&& +this.onUnmark()},isMarked:function(a){return this.element.getDocument().getById(this._.items[a]).hasClass("cke_selected")},focus:function(a){this._.focusIndex=-1;var b=this.element.getElementsByTag("a"),c,d=-1;if(a)for(c=this.element.getDocument().getById(this._.items[a]).getFirst();a=b.getItem(++d);){if(a.equals(c)){this._.focusIndex=d;break}}else this.element.focus();c&&setTimeout(function(){c.focus()},0)}}})}});CKEDITOR.plugins.add("richcombo",{requires:"floatpanel,listblock,button",beforeInit:function(d){d.ui.addHandler(CKEDITOR.UI_RICHCOMBO,CKEDITOR.ui.richCombo.handler)}}); +(function(){var d='\x3cspan id\x3d"{id}" class\x3d"cke_combo cke_combo__{name} {cls}" role\x3d"presentation"\x3e\x3cspan id\x3d"{id}_label" class\x3d"cke_combo_label"\x3e{label}\x3c/span\x3e\x3ca class\x3d"cke_combo_button" title\x3d"{title}" tabindex\x3d"-1"'+(CKEDITOR.env.gecko&&!CKEDITOR.env.hc?"":" href\x3d\"javascript:void('{titleJs}')\"")+' hidefocus\x3d"true" role\x3d"button" aria-labelledby\x3d"{id}_label" aria-haspopup\x3d"true"';CKEDITOR.env.gecko&&CKEDITOR.env.mac&&(d+=' onkeypress\x3d"return false;"'); +CKEDITOR.env.gecko&&(d+=' onblur\x3d"this.style.cssText \x3d this.style.cssText;"');var d=d+(' onkeydown\x3d"return CKEDITOR.tools.callFunction({keydownFn},event,this);" onfocus\x3d"return CKEDITOR.tools.callFunction({focusFn},event);" '+(CKEDITOR.env.ie?'onclick\x3d"return false;" onmouseup':"onclick")+'\x3d"CKEDITOR.tools.callFunction({clickFn},this);return false;"\x3e\x3cspan id\x3d"{id}_text" class\x3d"cke_combo_text cke_combo_inlinelabel"\x3e{label}\x3c/span\x3e\x3cspan class\x3d"cke_combo_open"\x3e\x3cspan class\x3d"cke_combo_arrow"\x3e'+ +(CKEDITOR.env.hc?"\x26#9660;":CKEDITOR.env.air?"\x26nbsp;":"")+"\x3c/span\x3e\x3c/span\x3e\x3c/a\x3e\x3c/span\x3e"),k=CKEDITOR.addTemplate("combo",d);CKEDITOR.UI_RICHCOMBO="richcombo";CKEDITOR.ui.richCombo=CKEDITOR.tools.createClass({$:function(a){CKEDITOR.tools.extend(this,a,{canGroup:!1,title:a.label,modes:{wysiwyg:1},editorFocus:1});a=this.panel||{};delete this.panel;this.id=CKEDITOR.tools.getNextNumber();this.document=a.parent&&a.parent.getDocument()||CKEDITOR.document;a.className="cke_combopanel"; +a.block={multiSelect:a.multiSelect,attributes:a.attributes};a.toolbarRelated=!0;this._={panelDefinition:a,items:{}}},proto:{renderHtml:function(a){var b=[];this.render(a,b);return b.join("")},render:function(a,b){function g(){if(this.getState()!=CKEDITOR.TRISTATE_ON){var c=this.modes[a.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED;a.readOnly&&!this.readOnly&&(c=CKEDITOR.TRISTATE_DISABLED);this.setState(c);this.setValue("");c!=CKEDITOR.TRISTATE_DISABLED&&this.refresh&&this.refresh()}}var d= +CKEDITOR.env,h="cke_"+this.id,e=CKEDITOR.tools.addFunction(function(b){l&&(a.unlockSelection(1),l=0);c.execute(b)},this),f=this,c={id:h,combo:this,focus:function(){CKEDITOR.document.getById(h).getChild(1).focus()},execute:function(c){var b=f._;if(b.state!=CKEDITOR.TRISTATE_DISABLED)if(f.createPanel(a),b.on)b.panel.hide();else{f.commit();var d=f.getValue();d?b.list.mark(d):b.list.unmarkAll();b.panel.showBlock(f.id,new CKEDITOR.dom.element(c),4)}},clickFn:e};a.on("activeFilterChange",g,this);a.on("mode", +g,this);a.on("selectionChange",g,this);!this.readOnly&&a.on("readOnly",g,this);var m=CKEDITOR.tools.addFunction(function(b,d){b=new CKEDITOR.dom.event(b);var g=b.getKeystroke();if(40==g)a.once("panelShow",function(a){a.data._.panel._.currentBlock.onKeyDown(40)});switch(g){case 13:case 32:case 40:CKEDITOR.tools.callFunction(e,d);break;default:c.onkey(c,g)}b.preventDefault()}),n=CKEDITOR.tools.addFunction(function(){c.onfocus&&c.onfocus()}),l=0;c.keyDownFn=m;d={id:h,name:this.name||this.command,label:this.label, +title:this.title,cls:this.className||"",titleJs:d.gecko&&!d.hc?"":(this.title||"").replace("'",""),keydownFn:m,focusFn:n,clickFn:e};k.output(d,b);if(this.onRender)this.onRender();return c},createPanel:function(a){if(!this._.panel){var b=this._.panelDefinition,d=this._.panelDefinition.block,k=b.parent||CKEDITOR.document.getBody(),h="cke_combopanel__"+this.name,e=new CKEDITOR.ui.floatPanel(a,k,b),f=e.addListBlock(this.id,d),c=this;e.onShow=function(){this.element.addClass(h);c.setState(CKEDITOR.TRISTATE_ON); +c._.on=1;c.editorFocus&&!a.focusManager.hasFocus&&a.focus();if(c.onOpen)c.onOpen();a.once("panelShow",function(){f.focus(!f.multiSelect&&c.getValue())})};e.onHide=function(b){this.element.removeClass(h);c.setState(c.modes&&c.modes[a.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);c._.on=0;if(!b&&c.onClose)c.onClose()};e.onEscape=function(){e.hide(1)};f.onClick=function(a,b){c.onClick&&c.onClick.call(c,a,b);e.hide()};this._.panel=e;this._.list=f;e.getBlock(this.id).onHide=function(){c._.on= +0;c.setState(CKEDITOR.TRISTATE_OFF)};this.init&&this.init()}},setValue:function(a,b){this._.value=a;var d=this.document.getById("cke_"+this.id+"_text");d&&(a||b?d.removeClass("cke_combo_inlinelabel"):(b=this.label,d.addClass("cke_combo_inlinelabel")),d.setText("undefined"!=typeof b?b:a))},getValue:function(){return this._.value||""},unmarkAll:function(){this._.list.unmarkAll()},mark:function(a){this._.list.mark(a)},hideItem:function(a){this._.list.hideItem(a)},hideGroup:function(a){this._.list.hideGroup(a)}, +showAll:function(){this._.list.showAll()},add:function(a,b,d){this._.items[a]=d||a;this._.list.add(a,b,d)},startGroup:function(a){this._.list.startGroup(a)},commit:function(){this._.committed||(this._.list.commit(),this._.committed=1,CKEDITOR.ui.fire("ready",this));this._.committed=1},setState:function(a){if(this._.state!=a){var b=this.document.getById("cke_"+this.id);b.setState(a,"cke_combo");a==CKEDITOR.TRISTATE_DISABLED?b.setAttribute("aria-disabled",!0):b.removeAttribute("aria-disabled");this._.state= +a}},getState:function(){return this._.state},enable:function(){this._.state==CKEDITOR.TRISTATE_DISABLED&&this.setState(this._.lastState)},disable:function(){this._.state!=CKEDITOR.TRISTATE_DISABLED&&(this._.lastState=this._.state,this.setState(CKEDITOR.TRISTATE_DISABLED))}},statics:{handler:{create:function(a){return new CKEDITOR.ui.richCombo(a)}}}});CKEDITOR.ui.prototype.addRichCombo=function(a,b){this.add(a,CKEDITOR.UI_RICHCOMBO,b)}})();(function(){function n(a,c,h,e,q,n,u,w){var x=a.config,r=new CKEDITOR.style(u),g=q.split(";");q=[];for(var m={},d=0;d=this.rect.right||a<=this.rect.top||a>=this.rect.bottom)&&this.hideVisible();(0>=b||b>=this.winTopPane.width||0>=a||a>=this.winTopPane.height)&&this.hideVisible()},this);b.attachListener(a,"resize",c);b.attachListener(a,"mode",g);a.on("destroy",g);this.lineTpl=(new CKEDITOR.template('\x3cdiv data-cke-lineutils-line\x3d"1" class\x3d"cke_reset_all" style\x3d"{lineStyle}"\x3e\x3cspan style\x3d"{tipLeftStyle}"\x3e\x26nbsp;\x3c/span\x3e\x3cspan style\x3d"{tipRightStyle}"\x3e\x26nbsp;\x3c/span\x3e\x3c/div\x3e')).output({lineStyle:CKEDITOR.tools.writeCssText(CKEDITOR.tools.extend({}, +t,this.lineStyle,!0)),tipLeftStyle:CKEDITOR.tools.writeCssText(CKEDITOR.tools.extend({},q,{left:"0px","border-left-color":"red","border-width":"6px 0 6px 6px"},this.tipCss,this.tipLeftStyle,!0)),tipRightStyle:CKEDITOR.tools.writeCssText(CKEDITOR.tools.extend({},q,{right:"0px","border-right-color":"red","border-width":"6px 6px 6px 0"},this.tipCss,this.tipRightStyle,!0))})}function l(a){var d;if(d=a&&a.type==CKEDITOR.NODE_ELEMENT)d=!(r[a.getComputedStyle("float")]||r[a.getAttribute("align")]);return d&& +!u[a.getComputedStyle("position")]}CKEDITOR.plugins.add("lineutils");CKEDITOR.LINEUTILS_BEFORE=1;CKEDITOR.LINEUTILS_AFTER=2;CKEDITOR.LINEUTILS_INSIDE=4;m.prototype={start:function(a){var d=this,b=this.editor,c=this.doc,e,g,f,h,k=CKEDITOR.tools.eventsBuffer(50,function(){b.readOnly||"wysiwyg"!=b.mode||(d.relations={},(g=c.$.elementFromPoint(f,h))&&g.nodeType&&(e=new CKEDITOR.dom.element(g),d.traverseSearch(e),isNaN(f+h)||d.pixelSearch(e,f,h),a&&a(d.relations,f,h)))});this.listener=this.editable.attachListener(this.target, +"mousemove",function(a){f=a.data.$.clientX;h=a.data.$.clientY;k.input()});this.editable.attachListener(this.inline?this.editable:this.frame,"mouseout",function(){k.reset()})},stop:function(){this.listener&&this.listener.removeListener()},getRange:function(){var a={};a[CKEDITOR.LINEUTILS_BEFORE]=CKEDITOR.POSITION_BEFORE_START;a[CKEDITOR.LINEUTILS_AFTER]=CKEDITOR.POSITION_AFTER_END;a[CKEDITOR.LINEUTILS_INSIDE]=CKEDITOR.POSITION_AFTER_START;return function(d){var b=this.editor.createRange();b.moveToPosition(this.relations[d.uid].element, +a[d.type]);return b}}(),store:function(){function a(a,b,c){var e=a.getUniqueId();e in c?c[e].type|=b:c[e]={element:a,type:b}}return function(d,b){var c;b&CKEDITOR.LINEUTILS_AFTER&&l(c=d.getNext())&&c.isVisible()&&(a(c,CKEDITOR.LINEUTILS_BEFORE,this.relations),b^=CKEDITOR.LINEUTILS_AFTER);b&CKEDITOR.LINEUTILS_INSIDE&&l(c=d.getFirst())&&c.isVisible()&&(a(c,CKEDITOR.LINEUTILS_BEFORE,this.relations),b^=CKEDITOR.LINEUTILS_INSIDE);a(d,b,this.relations)}}(),traverseSearch:function(a){var d,b,c;do if(c=a.$["data-cke-expando"], +!(c&&c in this.relations)){if(a.equals(this.editable))break;if(l(a))for(d in this.lookups)(b=this.lookups[d](a))&&this.store(a,b)}while((!a||a.type!=CKEDITOR.NODE_ELEMENT||"true"!=a.getAttribute("contenteditable"))&&(a=a.getParent()))},pixelSearch:function(){function a(a,c,e,g,f){for(var h=0,k;f(e);){e+=g;if(25==++h)break;if(k=this.doc.$.elementFromPoint(c,e))if(k==a)h=0;else if(d(a,k)&&(h=0,l(k=new CKEDITOR.dom.element(k))))return k}}var d=CKEDITOR.env.ie||CKEDITOR.env.webkit?function(a,c){return a.contains(c)}: +function(a,c){return!!(a.compareDocumentPosition(c)&16)};return function(b,c,d){var g=this.win.getViewPaneSize().height,f=a.call(this,b.$,c,d,-1,function(a){return 0this.rect.bottom)return!1;this.inline? +e.left=b.elementRect.left-this.rect.relativeX:(0[^<]* +c});0>e&&(e=a._.upcasts.length);a._.upcasts.splice(e,0,[b,d,c])}var d=b.upcast,e=b.upcastPriority||10;if(d)if("string"==typeof d)for(d=d.split(",");d.length;)c(b.upcasts[d.pop()],b.name,e);else c(d,b.name,e)}function t(a,b){a.focused=null;if(b.isInited()){var c=b.editor.checkDirty();a.fire("widgetBlurred",{widget:b});b.setFocused(!1);!c&&b.editor.resetDirty()}}function H(a){a=a.data;if("wysiwyg"==this.editor.mode){var b=this.editor.editable(),c=this.instances,d,e,f,h;if(b){for(d in c)c[d].isReady()&& +!b.contains(c[d].wrapper)&&this.destroy(c[d],!0);if(a&&a.initOnlyNew)c=this.initOnAll();else{var l=b.find(".cke_widget_wrapper"),c=[];d=0;for(e=l.count();dCKEDITOR.tools.indexOf(b,a)&&c.push(a);a=CKEDITOR.tools.indexOf(d,a);0<=a&&d.splice(a,1);return this},focus:function(a){e=a;return this},commit:function(){var f=a.focused!==e,h,g;a.editor.fire("lockSnapshot");for(f&& +(h=a.focused)&&t(a,h);h=d.pop();)b.splice(CKEDITOR.tools.indexOf(b,h),1),h.isInited()&&(g=h.editor.checkDirty(),h.setSelected(!1),!g&&h.editor.resetDirty());f&&e&&(g=a.editor.checkDirty(),a.focused=e,a.fire("widgetFocused",{widget:e}),e.setFocused(!0),!g&&a.editor.resetDirty());for(;h=c.pop();)b.push(h),h.setSelected(!0);a.editor.fire("unlockSnapshot")}}}function A(a,b,c){var d=0;b=B(b);var e=a.data.classes||{},f;if(b){for(e=CKEDITOR.tools.clone(e);f=b.pop();)c?e[f]||(d=e[f]=1):e[f]&&(delete e[f], +d=1);d&&a.setData("classes",e)}}function C(a){a.cancel()}function y(a,b){var c=a.editor,d=c.document;if(!d.getById("cke_copybin")){var e=c.blockless||CKEDITOR.env.ie?"span":"div",f=d.createElement(e),h=d.createElement(e),e=CKEDITOR.env.ie&&9>CKEDITOR.env.version;h.setAttributes({id:"cke_copybin","data-cke-temp":"1"});f.setStyles({position:"absolute",width:"1px",height:"1px",overflow:"hidden"});f.setStyle("ltr"==c.config.contentsLangDirection?"left":"right","-5000px");var g=c.createRange();g.setStartBefore(a.wrapper); +g.setEndAfter(a.wrapper);f.setHtml('\x3cspan data-cke-copybin-start\x3d"1"\x3e​\x3c/span\x3e'+c.editable().getHtmlFromRange(g).getHtml()+'\x3cspan data-cke-copybin-end\x3d"1"\x3e​\x3c/span\x3e');c.fire("saveSnapshot");c.fire("lockSnapshot");h.append(f);c.editable().append(h);var k=c.on("selectionChange",C,null,null,0),m=a.repository.on("checkSelection",C,null,null,0);if(e)var n=d.getDocumentElement().$,p=n.scrollTop;g=c.createRange();g.selectNodeContents(f);g.select();e&&(n.scrollTop=p);setTimeout(function(){b|| +a.focus();h.remove();k.removeListener();m.removeListener();c.fire("unlockSnapshot");b&&(a.repository.del(a),c.fire("saveSnapshot"))},100)}}function B(a){return(a=(a=a.getDefinition().attributes)&&a["class"])?a.split(/\s+/):null}function D(){var a=CKEDITOR.document.getActive(),b=this.editor,c=b.editable();(c.isInline()?c:b.document.getWindow().getFrame()).equals(a)&&b.focusManager.focus(c)}function E(){CKEDITOR.env.gecko&&this.editor.unlockSelection();CKEDITOR.env.webkit||(this.editor.forceNextSelectionCheck(), +this.editor.selectionChange(1))}function V(a){var b=null;a.on("data",function(){var a=this.data.classes,d;if(b!=a){for(d in b)a&&a[d]||this.removeClass(d);for(d in a)this.addClass(d);b=a}})}function W(a){a.on("data",function(){if(a.wrapper){var b=this.getLabel?this.getLabel():this.editor.lang.widget.label.replace(/%1/,this.pathName||this.element.getName());a.wrapper.setAttribute("role","region");a.wrapper.setAttribute("aria-label",b)}},null,null,9999)}function X(a){if(a.draggable){var b=a.editor, +c=a.wrapper.getLast(g.isDomDragHandlerContainer),d;c?d=c.findOne("img"):(c=new CKEDITOR.dom.element("span",b.document),c.setAttributes({"class":"cke_reset cke_widget_drag_handler_container",style:"background:rgba(220,220,220,0.5);background-image:url("+b.plugins.widget.path+"images/handle.png)"}),d=new CKEDITOR.dom.element("img",b.document),d.setAttributes({"class":"cke_reset cke_widget_drag_handler","data-cke-widget-drag-handler":"1",src:CKEDITOR.tools.transparentImageData,width:15,title:b.lang.widget.move, +height:15,role:"presentation"}),a.inline&&d.setAttribute("draggable","true"),c.append(d),a.wrapper.append(c));a.wrapper.on("dragover",function(a){a.data.preventDefault()});a.wrapper.on("mouseenter",a.updateDragHandlerPosition,a);setTimeout(function(){a.on("data",a.updateDragHandlerPosition,a)},50);if(!a.inline&&(d.on("mousedown",Y,a),CKEDITOR.env.ie&&9>CKEDITOR.env.version))d.on("dragstart",function(a){a.data.preventDefault(!0)});a.dragHandlerContainer=c}}function Y(a){function b(){var b;for(q.reset();b= +g.pop();)b.removeListener();var c=k;b=a.sender;var d=this.repository.finder,e=this.repository.liner,f=this.editor,h=this.editor.editable();CKEDITOR.tools.isEmpty(e.visible)||(c=d.getRange(c[0]),this.focus(),f.fire("drop",{dropRange:c,target:c.startContainer}));h.removeClass("cke_widget_dragging");e.hideVisible();f.fire("dragend",{target:b})}var c=this.repository.finder,d=this.repository.locator,e=this.repository.liner,f=this.editor,h=f.editable(),g=[],k=[],m,n;this.repository._.draggedWidget=this; +var p=c.greedySearch(),q=CKEDITOR.tools.eventsBuffer(50,function(){m=d.locate(p);k=d.sort(n,1);k.length&&(e.prepare(p,m),e.placeLine(k[0]),e.cleanup())});h.addClass("cke_widget_dragging");g.push(h.on("mousemove",function(a){n=a.data.$.clientY;q.input()}));f.fire("dragstart",{target:a.sender});g.push(f.document.once("mouseup",b,this));h.isInline()||g.push(CKEDITOR.document.once("mouseup",b,this))}function Z(a){var b,c,d=a.editables;a.editables={};if(a.editables)for(b in d)c=d[b],a.initEditable(b,"string"== +typeof c?{selector:c}:c)}function aa(a){if(a.mask){var b=a.wrapper.findOne(".cke_widget_mask");b||(b=new CKEDITOR.dom.element("img",a.editor.document),b.setAttributes({src:CKEDITOR.tools.transparentImageData,"class":"cke_reset cke_widget_mask"}),a.wrapper.append(b));a.mask=b}}function ba(a){if(a.parts){var b={},c,d;for(d in a.parts)c=a.wrapper.findOne(a.parts[d]),b[d]=c;a.parts=b}}function N(a,b){ca(a);ba(a);Z(a);aa(a);X(a);V(a);W(a);if(CKEDITOR.env.ie&&9>CKEDITOR.env.version)a.wrapper.on("dragstart", +function(b){var d=b.data.getTarget();g.getNestedEditable(a,d)||a.inline&&g.isDomDragHandler(d)||b.data.preventDefault()});a.wrapper.removeClass("cke_widget_new");a.element.addClass("cke_widget_element");a.on("key",function(b){b=b.data.keyCode;if(13==b)a.edit();else{if(b==CKEDITOR.CTRL+67||b==CKEDITOR.CTRL+88){y(a,b==CKEDITOR.CTRL+88);return}if(b in da||CKEDITOR.CTRL&b||CKEDITOR.ALT&b)return}return!1},null,null,999);a.on("doubleclick",function(b){a.edit()&&b.cancel()});if(b.data)a.on("data",b.data); +if(b.edit)a.on("edit",b.edit)}function ca(a){(a.wrapper=a.element.getParent()).setAttribute("data-cke-widget-id",a.id)}function r(a){a.element.data("cke-widget-data",encodeURIComponent(JSON.stringify(a.data)))}CKEDITOR.plugins.add("widget",{requires:"lineutils,clipboard,widgetselection",onLoad:function(){CKEDITOR.addCss(".cke_widget_wrapper{position:relative;outline:none}.cke_widget_inline{display:inline-block}.cke_widget_wrapper:hover\x3e.cke_widget_element{outline:2px solid yellow;cursor:default}.cke_widget_wrapper:hover .cke_widget_editable{outline:2px solid yellow}.cke_widget_wrapper.cke_widget_focused\x3e.cke_widget_element,.cke_widget_wrapper .cke_widget_editable.cke_widget_editable_focused{outline:2px solid #ace}.cke_widget_editable{cursor:text}.cke_widget_drag_handler_container{position:absolute;width:15px;height:0;display:none;opacity:0.75;transition:height 0s 0.2s;line-height:0}.cke_widget_wrapper:hover\x3e.cke_widget_drag_handler_container{height:15px;transition:none}.cke_widget_drag_handler_container:hover{opacity:1}img.cke_widget_drag_handler{cursor:move;width:15px;height:15px;display:inline-block}.cke_widget_mask{position:absolute;top:0;left:0;width:100%;height:100%;display:block}.cke_editable.cke_widget_dragging, .cke_editable.cke_widget_dragging *{cursor:move !important}")}, +beforeInit:function(a){a.widgets=new p(a)},afterInit:function(a){var b=a.widgets.registered,c,d,e;for(d in b)c=b[d],(e=c.button)&&a.ui.addButton&&a.ui.addButton(CKEDITOR.tools.capitalize(c.name,!0),{label:e,command:c.name,toolbar:"insert,10"});S(a)}});p.prototype={MIN_SELECTION_CHECK_INTERVAL:500,add:function(a,b){b=CKEDITOR.tools.prototypedCopy(b);b.name=a;b._=b._||{};this.editor.fire("widgetDefinition",b);b.template&&(b.template=new CKEDITOR.template(b.template));O(this.editor,b);P(this,b);return this.registered[a]= +b},addUpcastCallback:function(a){this._.upcastCallbacks.push(a)},checkSelection:function(){var a=this.editor.getSelection(),b=a.getSelectedElement(),c=z(this),d;if(b&&(d=this.getByElement(b,!0)))return c.focus(d).select(d).commit();a=a.getRanges()[0];if(!a||a.collapsed)return c.commit();a=new CKEDITOR.dom.walker(a);for(a.evaluator=g.isDomWidgetWrapper;b=a.next();)c.select(this.getByElement(b));c.commit()},checkWidgets:function(a){this.fire("checkWidgets",CKEDITOR.tools.copy(a||{}))},del:function(a){if(this.focused=== +a){var b=a.editor,c=b.createRange(),d;(d=c.moveToClosestEditablePosition(a.wrapper,!0))||(d=c.moveToClosestEditablePosition(a.wrapper,!1));d&&b.getSelection().selectRanges([c])}a.wrapper.remove();this.destroy(a,!0)},destroy:function(a,b){this.widgetHoldingFocusedEditable===a&&n(this,a,null,b);a.destroy(b);delete this.instances[a.id];this.fire("instanceDestroyed",a)},destroyAll:function(a,b){var c,d,e=this.instances;if(b&&!a){d=b.find(".cke_widget_wrapper");for(var e=d.count(),f=0;f)?(?:<(?:div|span)(?: style="[^"]+")?>)?]*data-cke-copybin-start="1"[^>]*>.?<\/span>([\s\S]+)]*data-cke-copybin-end="1"[^>]*>.?<\/span>(?:<\/(?:div|span)>)?(?:<\/(?:div|span)>)?$/i,da={37:1,38:1,39:1,40:1,8:1,46:1};(function(){function a(){} +function b(a,b,c){return c&&this.checkElement(a)?(a=c.widgets.getByElement(a,!0))&&a.checkStyleActive(this):!1}var c={};CKEDITOR.style.addCustomHandler({type:"widget",setup:function(a){this.widget=a.widget;if(this.group="string"==typeof a.group?[a.group]:a.group){a=this.widget;var b;c[a]||(c[a]={});for(var f=0,h=this.group.length;f=x?0>=p?e():y>=v?e():w():0>=p?y>=v?w():e():w():0>=x?0>=p?y>= +v?w():e():w():0>=p?e():y>=v?e():w();15<=t&&15<=u?(h.setAttributes({width:t,height:u}),z=!0):z=!1},n);l("mouseup",function(){for(var d;d=n.pop();)d.removeListener();c.removeClass(r);f.removeClass("cke_image_resizing");z&&(a.setData({width:t,height:u}),b.fire("saveSnapshot"));z=!1},n);c.addClass(r);f.addClass("cke_image_resizing")});a.on("data",function(){f["right"==a.data.align?"addClass":"removeClass"]("cke_image_resizer_left")})}function L(a){var b=[],c;return function(g){var f=a.getCommand("justify"+ +g);if(f){b.push(function(){f.refresh(a,a.elementPath())});if(g in{right:1,left:1,center:1})f.on("exec",function(d){var c=k(a);if(c){c.setData("align",g);for(c=b.length;c--;)b[c]();d.cancel()}});f.on("refresh",function(b){var f=k(a),h={right:1,left:1,center:1};f&&(void 0===c&&(c=a.filter.checkFeature(a.widgets.registered.image.features.align)),c?this.setState(f.data.align==g?CKEDITOR.TRISTATE_ON:g in h?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED):this.setState(CKEDITOR.TRISTATE_DISABLED),b.cancel())})}}} +function M(a){a.plugins.link&&(CKEDITOR.on("dialogDefinition",function(b){b=b.data;if("link"==b.name){b=b.definition;var c=b.onShow,g=b.onOk;b.onShow=function(){var b=k(a),d=this.getContentElement("info","linkDisplayText").getElement().getParent().getParent();b&&(b.inline?!b.wrapper.getAscendant("a"):1)?(this.setupContent(b.data.link||{}),d.hide()):(d.show(),c.apply(this,arguments))};b.onOk=function(){var b=k(a);if(b&&(b.inline?!b.wrapper.getAscendant("a"):1)){var c={};this.commitContent(c);b.setData("link", +c)}else g.apply(this,arguments)}}}),a.getCommand("unlink").on("exec",function(b){var c=k(a);c&&c.parts.link&&(c.setData("link",null),this.refresh(a,a.elementPath()),b.cancel())}),a.getCommand("unlink").on("refresh",function(b){var c=k(a);c&&(this.setState(c.data.link||c.wrapper.getAscendant("a")?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED),b.cancel())}))}function k(a){return(a=a.widgets.focused)&&"image"==a.name?a:null}function E(a){var b=a.config.image2_alignClasses;a={div:{match:n(a)},p:{match:n(a)}, +img:{attributes:"!src,alt,width,height"},figure:{classes:"!"+a.config.image2_captionedClass},figcaption:!0};b?(a.div.classes=b[1],a.p.classes=a.div.classes,a.img.classes=b[0]+","+b[2],a.figure.classes+=","+a.img.classes):(a.div.styles="text-align",a.p.styles="text-align",a.img.styles="float",a.figure.styles="float,display");return a}function F(a){a=a.config.image2_alignClasses;return{dimension:{requiredContent:"img[width,height]"},align:{requiredContent:"img"+(a?"("+a[0]+")":"{float}")},caption:{requiredContent:"figcaption"}}} +function m(a){return a.data.hasCaption?a.element:a.parts.image}var N=new CKEDITOR.template('\x3cfigure class\x3d"{captionedClass}"\x3e\x3cimg alt\x3d"" src\x3d"" /\x3e\x3cfigcaption\x3e{captionPlaceholder}\x3c/figcaption\x3e\x3c/figure\x3e'),q={left:0,center:1,right:2},J=/^\s*(\d+\%)\s*$/i;CKEDITOR.plugins.add("image2",{requires:"widget,dialog",icons:"image",hidpi:!0,onLoad:function(){CKEDITOR.addCss(".cke_image_nocaption{line-height:0}.cke_editable.cke_image_sw, .cke_editable.cke_image_sw *{cursor:sw-resize !important}.cke_editable.cke_image_se, .cke_editable.cke_image_se *{cursor:se-resize !important}.cke_image_resizer{display:none;position:absolute;width:10px;height:10px;bottom:-5px;right:-5px;background:#000;outline:1px solid #fff;line-height:0;cursor:se-resize;}.cke_image_resizer_wrapper{position:relative;display:inline-block;line-height:0;}.cke_image_resizer.cke_image_resizer_left{right:auto;left:-5px;cursor:sw-resize;}.cke_widget_wrapper:hover .cke_image_resizer,.cke_image_resizer.cke_image_resizing{display:block}.cke_widget_wrapper\x3ea{display:inline-block}")}, +init:function(a){var b=a.config,c=a.lang.image2,g=D(a);b.filebrowserImage2BrowseUrl=b.filebrowserImageBrowseUrl;b.filebrowserImage2UploadUrl=b.filebrowserImageUploadUrl;g.pathName=c.pathName;g.editables.caption.pathName=c.pathNameCaption;a.widgets.add("image",g);a.ui.addButton&&a.ui.addButton("Image",{label:a.lang.common.image,command:"image",toolbar:"insert,10"});a.contextMenu&&(a.addMenuGroup("image",10),a.addMenuItem("image",{label:c.menu,command:"image",group:"image"}));CKEDITOR.dialog.add("image2", +this.path+"dialogs/image2.js")},afterInit:function(a){var b={left:1,right:1,center:1,block:1},c=L(a),g;for(g in b)c(g);M(a)}});CKEDITOR.plugins.image2={stateShifter:function(a){function b(a,b){var d={};f?d.attributes={"class":f[1]}:d.styles={"text-align":"center"};d=g.createElement(a.activeEnterMode==CKEDITOR.ENTER_P?"p":"div",d);c(d,b);b.move(d);return d}function c(b,d){if(d.getParent()){var c=a.createRange();c.moveToPosition(d,CKEDITOR.POSITION_BEFORE_START);d.remove();e.insertElementIntoRange(b, +c)}else b.replace(d)}var g=a.document,f=a.config.image2_alignClasses,d=a.config.image2_captionedClass,e=a.editable(),h=["hasCaption","align","link"],k={align:function(d,c,g){var e=d.element;d.changed.align?d.newData.hasCaption||("center"==g&&(d.deflate(),d.element=b(a,e)),d.changed.hasCaption||"center"!=c||"center"==g||(d.deflate(),c=e.findOne("a,img"),c.replace(e),d.element=c)):"center"==g&&d.changed.hasCaption&&!d.newData.hasCaption&&(d.deflate(),d.element=b(a,e));!f&&e.is("figure")&&("center"== +g?e.setStyle("display","inline-block"):e.removeStyle("display"))},hasCaption:function(b,e,f){b.changed.hasCaption&&(e=b.element.is({img:1,a:1})?b.element:b.element.findOne("a,img"),b.deflate(),f?(f=CKEDITOR.dom.element.createFromHtml(N.output({captionedClass:d,captionPlaceholder:a.lang.image2.captionPlaceholder}),g),c(f,b.element),e.replace(f.findOne("img")),b.element=f):(e.replace(b.element),b.element=e))},link:function(b,d,c){if(b.changed.link){var e=b.element.is("img")?b.element:b.element.findOne("img"), +f=b.element.is("a")?b.element:b.element.findOne("a"),h=b.element.is("a")&&!c||b.element.is("img")&&c,k;h&&b.deflate();c?(d||(k=g.createElement("a",{attributes:{href:b.newData.link.url}}),k.replace(e),e.move(k)),c=CKEDITOR.plugins.image2.getLinkAttributesGetter()(a,c),CKEDITOR.tools.isEmpty(c.set)||(k||f).setAttributes(c.set),c.removed.length&&(k||f).removeAttributes(c.removed)):(c=f.findOne("img"),c.replace(f),k=c);h&&(b.element=k)}}};return function(a){var b,c;a.changed={};for(c=0;ce.length)return!1;g=b.getParents(!0);for(a=0;an;a++)k[a].indent+=g;e=CKEDITOR.plugins.list.arrayToList(k,q,null,c.config.enterMode,b.getDirection());if(!l.isIndent){var f;if((f=b.getParent())&&f.is("li"))for(var g=e.listNode.getChildren(),r=[],m,a=g.count()-1;0<=a;a--)(m=g.getItem(a))&&m.is&&m.is("li")&& +r.push(m)}e&&e.listNode.replace(b);if(r&&r.length)for(a=0;af[k-1].indent+1){g=f[k-1].indent+1-f[k].indent;for(h=f[k].indent;f[k]&&f[k].indent>=h;)f[k].indent+=g,k++;k--}var d=CKEDITOR.plugins.list.arrayToList(f,e,null,b.config.enterMode,m.root.getAttribute("dir")).listNode,a,p;c(!0);c();d.replace(m.root);b.fire("contentDomInvalidated")}function B(b,m){this.name=b;this.context=this.type=m;this.allowedContent= +m+" li";this.requiredContent=m}function E(b,m,e,c){for(var f,g;f=b[c?"getLast":"getFirst"](J);)(g=f.getDirection(1))!==m.getDirection(1)&&f.setAttribute("dir",g),f.remove(),e?f[c?"insertBefore":"insertAfter"](e):m.append(f,c)}function F(b){function m(e){var c=b[e?"getPrevious":"getNext"](u);c&&c.type==CKEDITOR.NODE_ELEMENT&&c.is(b.getName())&&(E(b,c,null,!e),b.remove(),b=c)}m();m(1)}function G(b){return b.type==CKEDITOR.NODE_ELEMENT&&(b.getName()in CKEDITOR.dtd.$block||b.getName()in CKEDITOR.dtd.$listItem)&& +CKEDITOR.dtd[b.getName()]["#"]}function C(b,m,e){b.fire("saveSnapshot");e.enlarge(CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS);var c=e.extractContents();m.trim(!1,!0);var f=m.createBookmark(),g=new CKEDITOR.dom.elementPath(m.startContainer),k=g.block,g=g.lastElement.getAscendant("li",1)||k,h=new CKEDITOR.dom.elementPath(e.startContainer),d=h.contains(CKEDITOR.dtd.$listItem),h=h.contains(CKEDITOR.dtd.$list);k?(k=k.getBogus())&&k.remove():h&&(k=h.getPrevious(u))&&z(k)&&k.remove();(k=c.getLast())&&k.type==CKEDITOR.NODE_ELEMENT&& +k.is("br")&&k.remove();(k=m.startContainer.getChild(m.startOffset))?c.insertBefore(k):m.startContainer.append(c);d&&(c=A(d))&&(g.contains(d)?(E(c,d.getParent(),d),c.remove()):g.append(c));for(;e.checkStartOfBlock()&&e.checkEndOfBlock();){h=e.startPath();c=h.block;if(!c)break;c.is("li")&&(g=c.getParent(),c.equals(g.getLast(u))&&c.equals(g.getFirst(u))&&(c=g));e.moveToPosition(c,CKEDITOR.POSITION_BEFORE_START);c.remove()}e=e.clone();c=b.editable();e.setEndAt(c,CKEDITOR.POSITION_BEFORE_END);e=new CKEDITOR.dom.walker(e); +e.evaluator=function(a){return u(a)&&!z(a)};(e=e.next())&&e.type==CKEDITOR.NODE_ELEMENT&&e.getName()in CKEDITOR.dtd.$list&&F(e);m.moveToBookmark(f);m.select();b.fire("saveSnapshot")}function A(b){return(b=b.getLast(u))&&b.type==CKEDITOR.NODE_ELEMENT&&b.getName()in v?b:null}var v={ol:1,ul:1},K=CKEDITOR.dom.walker.whitespaces(),H=CKEDITOR.dom.walker.bookmark(),u=function(b){return!(K(b)||H(b))},z=CKEDITOR.dom.walker.bogus();CKEDITOR.plugins.list={listToArray:function(b,m,e,c,f){if(!v[b.getName()])return[]; +c||(c=0);e||(e=[]);for(var g=0,k=b.getChildCount();g=k.$.documentMode&&l.append(k.createText(" ")),l.append(a.listNode),a=a.nextIndex;else if(-1== +r.indent&&!e&&g){v[g.getName()]?(l=r.element.clone(!1,!0),q!=g.getDirection(1)&&l.setAttribute("dir",q)):l=new CKEDITOR.dom.documentFragment(k);var d=g.getDirection(1)!=q,y=r.element,D=y.getAttribute("class"),z=y.getAttribute("style"),A=l.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT&&(c!=CKEDITOR.ENTER_BR||d||z||D),w,B=r.contents.length,x;for(g=0;gh.length)){l= +h[h.length-1].getNext();n=c.createElement(this.type);d.push(n);for(t=d=void 0;h.length;)d=h.shift(),t=c.createElement("li"),r=d,r.is("pre")||L.test(r.getName())||"false"==r.getAttribute("contenteditable")?d.appendTo(t):(d.copyAttributes(t),a&&d.getDirection()&&(t.removeStyle("direction"),t.removeAttribute("dir")),d.moveChildren(t),d.remove()),t.appendTo(n);a&&p&&n.setAttribute("dir",a);l?n.insertBefore(l):n.appendTo(g)}}else this.state==CKEDITOR.TRISTATE_ON&&v[a.root.getName()]&&I.call(this,b,a,k); +for(n=0;n');for(var h=0;h");for(var e=0;e");b.push("")}b.push("
");return b.join("")}function j(a,b,c,h){for(var b=b.$.tBodies[0].rows,e=0;ed||0>g?this.panel.hide():((d>n-1||g>o-1)&&f.execCommand("table"),j(c,b,d+1,g+ +1),a.data.preventDefault(),a.data.stopPropagation())});return b},createMoreButton:function(){var a=new CKEDITOR.dom.element("a");a.setAttributes({_cke_focus:1,hidefocus:!0,title:f.lang.quicktable.more,href:'javascript:void("'+f.lang.quicktable.more+'")',role:"option"});a.addClass("cke_colormore");a.setText(f.lang.quicktable.more);a.setStyle("text-align","center");a.on("click",function(a){f.execCommand("table");a.data.preventDefault()});return a},onOpen:function(){j(this.caption,this.table,1,1)}})}});CKEDITOR.plugins.add("removeformat",{init:function(a){a.addCommand("removeFormat",CKEDITOR.plugins.removeformat.commands.removeformat);a.ui.addButton&&a.ui.addButton("RemoveFormat",{label:a.lang.removeformat.toolbar,command:"removeFormat",toolbar:"cleanup,10"})}}); +CKEDITOR.plugins.removeformat={commands:{removeformat:{exec:function(a){for(var h=a._.removeFormatRegex||(a._.removeFormatRegex=new RegExp("^(?:"+a.config.removeFormatTags.replace(/,/g,"|")+")$","i")),e=a._.removeAttributes||(a._.removeAttributes=a.config.removeFormatAttributes.split(",")),f=CKEDITOR.plugins.removeformat.filter,m=a.getSelection().getRanges(),n=m.createIterator(),p=function(a){return a.type==CKEDITOR.NODE_ELEMENT},c;c=n.getNextRange();){c.collapsed||c.enlarge(CKEDITOR.ENLARGE_ELEMENT); +var l=c.createBookmark(),b=l.startNode,d=l.endNode,k=function(b){for(var c=a.elementPath(b),e=c.elements,d=1,g;(g=e[d])&&!g.equals(c.block)&&!g.equals(c.blockLimit);d++)h.test(g.getName())&&f(a,g)&&b.breakParent(g)};k(b);if(d)for(k(d),b=b.getNextSourceNode(!0,CKEDITOR.NODE_ELEMENT);b&&!b.equals(d);)if(b.isReadOnly()){if(b.getPosition(d)&CKEDITOR.POSITION_CONTAINS)break;b=b.getNext(p)}else k=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT),"img"==b.getName()&&b.data("cke-realelement")||!f(a,b)||(h.test(b.getName())? +b.remove(1):(b.removeAttributes(e),a.fire("removeFormatCleanup",b))),b=k;c.moveToBookmark(l)}a.forceNextSelectionCheck();a.getSelection().selectRanges(m)}}},filter:function(a,h){for(var e=a._.removeFormatFilters||[],f=0;fa.order?-1:0>b.order?1:b.order=this.strokesLimit;this.typing||(this.hasUndo=this.typing=!0,this.hasRedo=!1,this.onChange());b?(d=0,this.editor.fire("saveSnapshot")):this.editor.fire("change");this.strokesRecorded[c]= +d;this.previousKeyGroup=c},keyGroupChanged:function(a){return e.getKeyGroup(a)!=this.previousKeyGroup},reset:function(){this.snapshots=[];this.index=-1;this.currentImage=null;this.hasRedo=this.hasUndo=!1;this.locked=null;this.resetType()},resetType:function(){this.strokesRecorded=[0,0];this.typing=!1;this.previousKeyGroup=-1},refreshState:function(){this.hasUndo=!!this.getNextImage(!0);this.hasRedo=!!this.getNextImage(!1);this.resetType();this.onChange()},save:function(a,b,c){var d=this.editor;if(this.locked|| +"ready"!=d.status||"wysiwyg"!=d.mode)return!1;var e=d.editable();if(!e||"ready"!=e.status)return!1;e=this.snapshots;b||(b=new f(d));if(!1===b.contents)return!1;if(this.currentImage)if(b.equalsContent(this.currentImage)){if(a||b.equalsSelection(this.currentImage))return!1}else!1!==c&&d.fire("change");e.splice(this.index+1,e.length-this.index-1);e.length==this.limit&&e.shift();this.index=e.push(b)-1;this.currentImage=b;!1!==c&&this.refreshState();return!0},restoreImage:function(a){var b=this.editor, +c;a.bookmarks&&(b.focus(),c=b.getSelection());this.locked={level:999};this.editor.loadSnapshot(a.contents);a.bookmarks?c.selectBookmarks(a.bookmarks):CKEDITOR.env.ie&&(c=this.editor.document.getBody().$.createTextRange(),c.collapse(!0),c.select());this.locked=null;this.index=a.index;this.currentImage=this.snapshots[this.index];this.update();this.refreshState();b.fire("change")},getNextImage:function(a){var b=this.snapshots,c=this.currentImage,d;if(c)if(a)for(d=this.index-1;0<=d;d--){if(a=b[d],!c.equalsContent(a))return a.index= +d,a}else for(d=this.index+1;d=this.undoManager.strokesLimit&&(this.undoManager.type(a.keyCode,!0),this.keyEventsStack.resetInputs())}},onKeyup:function(a){var b=this.undoManager; +a=a.data.getKey();var c=this.keyEventsStack.getTotalInputs();this.keyEventsStack.remove(a);if(!(e.ieFunctionalKeysBug(a)&&this.lastKeydownImage&&this.lastKeydownImage.equalsContent(new f(b.editor,!0))))if(0this.$.offsetHeight){var d=b.createRange();d[33==c?"moveToElementEditStart":"moveToElementEditEnd"](this);d.select();a.data.preventDefault()}});CKEDITOR.env.ie&&this.attachListener(c,"blur",function(){try{c.$.selection.empty()}catch(a){}});CKEDITOR.env.iOS&&this.attachListener(c,"touchend",function(){a.focus()});d=b.document.getElementsByTag("title").getItem(0);d.data("cke-title",d.getText());CKEDITOR.env.ie&&(b.document.$.title=this._.docTitle);CKEDITOR.tools.setTimeout(function(){"unloaded"== +this.status&&(this.status="ready");b.fire("contentDom");this._.isPendingFocus&&(b.focus(),this._.isPendingFocus=!1);setTimeout(function(){b.fire("dataReady")},0)},0,this)}function n(a){function f(){var c;a.editable().attachListener(a,"selectionChange",function(){var d=a.getSelection().getSelectedElement();d&&(c&&(c.detachEvent("onresizestart",b),c=null),d.$.attachEvent("onresizestart",b),c=d.$)})}function b(a){a.returnValue=!1}if(CKEDITOR.env.gecko)try{var c=a.document.$;c.execCommand("enableObjectResizing", +!1,!a.config.disableObjectResizing);c.execCommand("enableInlineTableEditing",!1,!a.config.disableNativeTableHandles)}catch(d){}else CKEDITOR.env.ie&&11>CKEDITOR.env.version&&a.config.disableObjectResizing&&f(a)}function p(){var a=[];if(8<=CKEDITOR.document.$.documentMode){a.push("html.CSS1Compat [contenteditable\x3dfalse]{min-height:0 !important}");var f=[],b;for(b in CKEDITOR.dtd.$removeEmpty)f.push("html.CSS1Compat "+b+"[contenteditable\x3dfalse]");a.push(f.join(",")+"{display:inline-block}")}else CKEDITOR.env.gecko&& +(a.push("html{height:100% !important}"),a.push("img:-moz-broken{-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}"));a.push("html{cursor:text;*cursor:auto}");a.push("img,input,textarea{cursor:default}");return a.join("\n")}var l;CKEDITOR.plugins.add("wysiwygarea",{init:function(a){a.config.fullPage&&a.addFeature({allowedContent:"html head title; style [media,type]; body (*)[id]; meta link [*]",requiredContent:"body"});a.addMode("wysiwyg",function(f){function b(b){b&&b.removeListener(); +a.editable(new l(a,d.$.contentWindow.document.body));a.setData(a.getData(1),f)}var c="document.open();"+(CKEDITOR.env.ie?"("+CKEDITOR.tools.fixDomain+")();":"")+"document.close();",c=CKEDITOR.env.air?"javascript:void(0)":CKEDITOR.env.ie&&!CKEDITOR.env.edge?"javascript:void(function(){"+encodeURIComponent(c)+"}())":"",d=CKEDITOR.dom.element.createFromHtml('\x3ciframe src\x3d"'+c+'" frameBorder\x3d"0"\x3e\x3c/iframe\x3e');d.setStyles({width:"100%",height:"100%"});d.addClass("cke_wysiwyg_frame").addClass("cke_reset"); +c=a.ui.space("contents");c.append(d);var e=CKEDITOR.env.ie&&!CKEDITOR.env.edge||CKEDITOR.env.gecko;if(e)d.on("load",b);var g=a.title,h=a.fire("ariaEditorHelpLabel",{}).label;g&&(CKEDITOR.env.ie&&h&&(g+=", "+h),d.setAttribute("title",g));if(h){var g=CKEDITOR.tools.getNextId(),k=CKEDITOR.dom.element.createFromHtml('\x3cspan id\x3d"'+g+'" class\x3d"cke_voice_label"\x3e'+h+"\x3c/span\x3e");c.append(k,1);d.setAttribute("aria-describedby",g)}a.on("beforeModeUnload",function(a){a.removeListener();k&&k.remove()}); +d.setAttributes({tabIndex:a.tabIndex,allowTransparency:"true"});!e&&b();a.fire("ariaWidget",d)})}});CKEDITOR.editor.prototype.addContentsCss=function(a){var f=this.config,b=f.contentsCss;CKEDITOR.tools.isArray(b)||(f.contentsCss=b?[b]:[]);f.contentsCss.push(a)};l=CKEDITOR.tools.createClass({$:function(){this.base.apply(this,arguments);this._.frameLoadedHandler=CKEDITOR.tools.addFunction(function(a){CKEDITOR.tools.setTimeout(m,0,this,a)},this);this._.docTitle=this.getWindow().getFrame().getAttribute("title")}, +base:CKEDITOR.editable,proto:{setData:function(a,f){var b=this.editor;if(f)this.setHtml(a),this.fixInitialSelection(),b.fire("dataReady");else{this._.isLoadingData=!0;b._.dataStore={id:1};var c=b.config,d=c.fullPage,e=c.docType,g=CKEDITOR.tools.buildStyleHtml(p()).replace(/ + + + <%=content%> + + \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/signature/plugin.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/signature/plugin.js new file mode 100755 index 00000000..2169c84f --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/signature/plugin.js @@ -0,0 +1,141 @@ + +(function(CKEDITOR, $, undefined) { + + 'use strict'; + + var rl_signature_replacer = function(editor, text, signature, isHtml, insertBefore) { + + var + skipInsert = false, + isEmptyText = false, + newLine = (isHtml ? '
' : "\n"), + clearHtmlLine = function(html) { + return $.trim(editor.__textUtils.htmlToPlain(html)); + }; + + isEmptyText = '' === $.trim(text); + if (!isEmptyText && isHtml) + { + isEmptyText = '' === clearHtmlLine(text); + } + + if (editor.__previos_signature && !isEmptyText) + { + if (isHtml && !editor.__previos_signature_is_html) + { + editor.__previos_signature = editor.__textUtils.plainToHtml(editor.__previos_signature); + editor.__previos_signature_is_html = true; + } + else if (!isHtml && editor.__previos_signature_is_html) + { + editor.__previos_signature = editor.__textUtils.htmlToPlain(editor.__previos_signature); + editor.__previos_signature_is_html = false; + } + + skipInsert = false; + if (isHtml) + { + var clearSig = clearHtmlLine(editor.__previos_signature); + text = text.replace(/([\s\S]*)<\/signature>/igm, function(all){ + var c = clearSig === clearHtmlLine(all); + if (!c) { + skipInsert = true; + } + return c ? '' : all; + }); + } + else + { + var textLen = text.length; + text = text + .replace('' + editor.__previos_signature, '') + .replace('' + editor.__previos_signature, ''); + + if (textLen === text.length) + { + skipInsert = true; + } + } + } + + if (!skipInsert) + { + signature = newLine + newLine + (isHtml ? '' : '') + signature + (isHtml ? '' : ''); + + text = insertBefore ? signature + text : text + signature; + + if (10 < signature.length) + { + editor.__previos_signature = signature; + editor.__previos_signature_is_html = isHtml; + } + } + + return text; + }; + + CKEDITOR.plugins.add('signature', { + init: function(editor) { + editor.addCommand('insertSignature', { + modes: {wysiwyg: 1, plain: 1}, + exec: function(editor, cfg) { + + if (cfg && cfg.clearCache) + { + editor.__previos_signature = undefined; + editor.__previos_signature_is_html = undefined; + return true; + } + + var + bIsHtml = false, + bInsertBefore = false, + sSignature = '', + sResultSignature = ''; + + if (cfg) + { + bIsHtml = undefined === cfg.isHtml ? false : !!cfg.isHtml; + bInsertBefore = undefined === cfg.insertBefore ? false : !!cfg.insertBefore; + sSignature = undefined === cfg.signature ? '' : cfg.signature; + } + + sResultSignature = sSignature; + + try + { + if ('plain' === editor.mode && editor.__plain && editor.__textUtils) + { + if (editor.__textUtils && editor.__textUtils.htmlToPlain) + { + if (bIsHtml) + { + sResultSignature = editor.__textUtils.htmlToPlain(sResultSignature); + } + } + + editor.__plain.setRawData( + rl_signature_replacer(editor, editor.__plain.getRawData(), sResultSignature, false, bInsertBefore)); + + } + else + { + if (editor.__textUtils && editor.__textUtils.plainToHtml) + { + if (!bIsHtml) + { + sResultSignature = editor.__textUtils.plainToHtml(sResultSignature); + } + } + + editor.setData( + rl_signature_replacer(editor, editor.getData(), sResultSignature, true, bInsertBefore)); + } + } + catch (e) {} + } + }); + } + }); + +}(CKEDITOR, $)); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/table/dialogs/table.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/table/dialogs/table.js new file mode 100755 index 00000000..7387effd --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/table/dialogs/table.js @@ -0,0 +1,21 @@ +/* + Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function v(a){for(var f=0,n=0,l=0,p,e=a.$.rows.length;ln&&(n=f)}return n}function r(a){return function(){var f=this.getValue(),f=!!(CKEDITOR.dialog.validate.integer()(f)&&0q.getSize("width")?"100%":500:0,getValue:u,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1", +a.lang.common.width)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles");a&&a.updateStyle("width",this.getValue())},setup:function(a){a=a.getStyle("width");this.setValue(a)},commit:l}]},{type:"hbox",widths:["5em"],children:[{type:"text",id:"txtHeight",requiredContent:"table{height}",controlStyle:"width:5em",label:a.lang.common.height,title:a.lang.common.cssLengthTooltip,"default":"",getValue:u,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1", +a.lang.common.height)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles");a&&a.updateStyle("height",this.getValue())},setup:function(a){(a=a.getStyle("height"))&&this.setValue(a)},commit:l}]},{type:"html",html:"\x26nbsp;"},{type:"text",id:"txtCellSpace",requiredContent:"table[cellspacing]",controlStyle:"width:3em",label:a.lang.table.cellSpace,"default":a.filter.check("table[cellspacing]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellSpacing), +setup:function(a){this.setValue(a.getAttribute("cellSpacing")||"")},commit:function(a,d){this.getValue()?d.setAttribute("cellSpacing",this.getValue()):d.removeAttribute("cellSpacing")}},{type:"text",id:"txtCellPad",requiredContent:"table[cellpadding]",controlStyle:"width:3em",label:a.lang.table.cellPad,"default":a.filter.check("table[cellpadding]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellPadding),setup:function(a){this.setValue(a.getAttribute("cellPadding")||"")},commit:function(a, +d){this.getValue()?d.setAttribute("cellPadding",this.getValue()):d.removeAttribute("cellPadding")}}]}]},{type:"html",align:"right",html:""},{type:"vbox",padding:0,children:[{type:"text",id:"txtCaption",requiredContent:"caption",label:a.lang.table.caption,setup:function(a){this.enable();a=a.getElementsByTag("caption");if(0Q&R(y%F4>B zs;Uq!kbwq_7Top+>f$X4@(X6LuyOG4sc+bE;L!1t|K@(+14@K=x;Tb#Tu;8Rb9cks z#J94nZHsw$wz2W7VVBS|FgP>!0K<|7o;WsvWX2Z8B?>%jY}0rZj)}3g-PxTm;lP0# v3__VH4l5d8H_c`?|H*MfZyGa?!EHvRt#Zd+?pApQG@rrK)z4*}Q$iB}(WFB8 literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog.css new file mode 100755 index 00000000..76f88543 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#fff}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:12px;cursor:move;position:relative;color:#484848;border-bottom:1px solid #d1d1d1;padding:12px 19px 12px 12px;background:#f8f8f8;letter-spacing:.3px}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border:2px solid rgba(102,102,102,0.2);border-left-color:rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:43px;border-top:1px solid #d1d1d1}.cke_dialog_contents_body{overflow:auto;padding:9px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:33px;display:inline-block;margin:9px 0 0;position:absolute;z-index:2;left:11px}.cke_rtl .cke_dialog_tabs{left:auto;right:11px}a.cke_dialog_tab{height:25px;padding:4px 8px;display:inline-block;cursor:pointer;line-height:26px;outline:0;color:#484848;border:1px solid #d1d1d1;border-radius:3px 3px 0 0;background:#f8f8f8;min-width:90px;text-align:center;margin-left:-1px;letter-spacing:.3px}a.cke_dialog_tab:hover{background-color:#fff}a.cke_dialog_tab:focus{border:2px solid #139ff7;border-bottom-color:#d1d1d1;padding:3px 7px;position:relative;z-index:1}a.cke_dialog_tab_selected{background:#fff;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus{border-bottom-color:#fff}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:16px;width:16px;top:11px;z-index:5;opacity:.7;filter:alpha(opacity = 70)}.cke_rtl .cke_dialog_close_button{left:12px}.cke_ltr .cke_dialog_close_button{right:12px}.cke_hc a.cke_dialog_close_button{background-image:none}.cke_hidpi a.cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}a.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}a.cke_dialog_close_button span{display:none}.cke_hc a.cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%;margin-top:12px}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #bcbcbc;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:2px;min-height:28px;margin-left:1px}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:2px solid #139ff7}input.cke_dialog_ui_input_text:focus{padding-left:5px}textarea.cke_dialog_ui_input_textarea:focus{padding:3px 5px}select.cke_dialog_ui_input_select:focus{margin:0;width:100%!important}input.cke_dialog_ui_checkbox_input,input.cke_dialog_ui_radio_input{margin-left:1px;margin-right:2px}input.cke_dialog_ui_checkbox_input:focus,input.cke_dialog_ui_checkbox_input:active,input.cke_dialog_ui_radio_input:focus,input.cke_dialog_ui_radio_input:active{border:0;outline:2px solid #139ff7}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 1px;margin:0;text-align:center;color:#484848;vertical-align:middle;cursor:pointer;border:1px solid #bcbcbc;border-radius:2px;background:#f8f8f8;letter-spacing:.3px;line-height:18px;box-sizing:border-box}.cke_hc a.cke_dialog_ui_button{border-width:3px}span.cke_dialog_ui_button{padding:0 10px;cursor:pointer}a.cke_dialog_ui_button:hover{background:#fff}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border:2px solid #139ff7;outline:0;padding:3px 0}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;background:#09863e;border:1px solid #09863e}.cke_hc a.cke_dialog_ui_button{border:3px solid #bcbcbc}a.cke_dialog_ui_button_ok:hover{background:#53aa78;border-color:#53aa78}a.cke_dialog_ui_button_ok:focus{box-shadow:inset 0 0 0 2px #FFF}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#139ff7}.cke_hc a.cke_dialog_ui_button_ok:hover,.cke_hc a.cke_dialog_ui_button_ok:focus,.cke_hc a.cke_dialog_ui_button_ok:active{border-color:#484848}a.cke_dialog_ui_button_ok.cke_disabled{background:#d1d1d1;border-color:#d1d1d1;cursor:default}a.cke_dialog_ui_button_ok.cke_disabled span{cursor:default}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:28px;line-height:28px;background-color:#fff;border:1px solid #bcbcbc;padding:3px 3px 3px 6px;outline:0;border-radius:2px;margin:0 1px;box-sizing:border-box;width:calc(100% - 2px)!important}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog_ui_labeled_label{margin-left:1px}.cke_dialog .cke_dark_background{background-color:transparent}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked,.cke_dialog a.cke_btn_reset{margin:2px}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_dialog a.cke_btn_over,.cke_dialog a.cke_btn_locked:hover,.cke_dialog a.cke_btn_locked:focus,.cke_dialog a.cke_btn_locked:active,.cke_dialog a.cke_btn_unlocked:hover,.cke_dialog a.cke_btn_unlocked:focus,.cke_dialog a.cke_btn_unlocked:active,.cke_dialog a.cke_btn_reset:hover,.cke_dialog a.cke_btn_reset:focus,.cke_dialog a.cke_btn_reset:active{cursor:pointer;outline:0;margin:0;border:2px solid #139ff7}.cke_dialog fieldset{border:1px solid #bcbcbc}.cke_dialog fieldset legend{padding:0 6px}.cke_dialog_ui_checkbox,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{display:inline-block}.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{padding-top:5px}.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label{vertical-align:middle}.cke_dialog .ImagePreviewBox{border:1px ridge #bcbcbc;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:1px solid #bcbcbc;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;cursor:default;letter-spacing:.3px}.cke_dialog_body label+.cke_dialog_ui_labeled_content{margin-top:2px}.cke_dialog_contents_body .cke_dialog_ui_text,.cke_dialog_contents_body .cke_dialog_ui_select,.cke_dialog_contents_body .cke_dialog_ui_hbox_last>a.cke_dialog_ui_button{margin-top:4px}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:2px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_contents_body .cke_accessibility_legend{margin:2px 7px 2px 2px}.cke_dialog_contents_body .cke_accessibility_legend:focus,.cke_dialog_contents_body .cke_accessibility_legend:active{outline:0;border:2px solid #139ff7;margin:0 5px 0 0}.cke_dialog_contents_body input[type=file]:focus,.cke_dialog_contents_body input[type=file]:active{border:2px solid #139ff7}.cke_dialog_find_fieldset{margin-top:10px!important}.cke_dialog_image_ratiolock{margin-top:52px!important}.cke_dialog_forms_select_order label.cke_dialog_ui_labeled_label{margin-left:0}.cke_dialog_forms_select_order div.cke_dialog_ui_input_select{width:100%}.cke_dialog_forms_select_order_txtsize .cke_dialog_ui_hbox_last{padding-top:4px}.cke_dialog_image_url .cke_dialog_ui_hbox_last,.cke_dialog_flash_url .cke_dialog_ui_hbox_last{vertical-align:bottom}a.cke_dialog_ui_button.cke_dialog_image_browse{margin-top:10px}.cke_dialog_contents_body .cke_tpl_list{border:#bcbcbc 1px solid;margin:1px}.cke_dialog_contents_body .cke_tpl_list:focus,.cke_dialog_contents_body .cke_tpl_list:active{outline:0;margin:0;border:2px solid #139ff7}.cke_dialog_contents_body .cke_tpl_list a:focus,.cke_dialog_contents_body .cke_tpl_list a:active{outline:0}.cke_dialog_contents_body .cke_tpl_list a:focus .cke_tpl_item,.cke_dialog_contents_body .cke_tpl_list a:active .cke_tpl_item{border:2px solid #139ff7;padding:6px} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_ie.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_ie.css new file mode 100755 index 00000000..cc53ab1e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_ie.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#fff}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:12px;cursor:move;position:relative;color:#484848;border-bottom:1px solid #d1d1d1;padding:12px 19px 12px 12px;background:#f8f8f8;letter-spacing:.3px}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border:2px solid rgba(102,102,102,0.2);border-left-color:rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:43px;border-top:1px solid #d1d1d1}.cke_dialog_contents_body{overflow:auto;padding:9px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:33px;display:inline-block;margin:9px 0 0;position:absolute;z-index:2;left:11px}.cke_rtl .cke_dialog_tabs{left:auto;right:11px}a.cke_dialog_tab{height:25px;padding:4px 8px;display:inline-block;cursor:pointer;line-height:26px;outline:0;color:#484848;border:1px solid #d1d1d1;border-radius:3px 3px 0 0;background:#f8f8f8;min-width:90px;text-align:center;margin-left:-1px;letter-spacing:.3px}a.cke_dialog_tab:hover{background-color:#fff}a.cke_dialog_tab:focus{border:2px solid #139ff7;border-bottom-color:#d1d1d1;padding:3px 7px;position:relative;z-index:1}a.cke_dialog_tab_selected{background:#fff;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus{border-bottom-color:#fff}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:16px;width:16px;top:11px;z-index:5;opacity:.7;filter:alpha(opacity = 70)}.cke_rtl .cke_dialog_close_button{left:12px}.cke_ltr .cke_dialog_close_button{right:12px}.cke_hc a.cke_dialog_close_button{background-image:none}.cke_hidpi a.cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}a.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}a.cke_dialog_close_button span{display:none}.cke_hc a.cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%;margin-top:12px}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #bcbcbc;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:2px;min-height:28px;margin-left:1px}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:2px solid #139ff7}input.cke_dialog_ui_input_text:focus{padding-left:5px}textarea.cke_dialog_ui_input_textarea:focus{padding:3px 5px}select.cke_dialog_ui_input_select:focus{margin:0;width:100%!important}input.cke_dialog_ui_checkbox_input,input.cke_dialog_ui_radio_input{margin-left:1px;margin-right:2px}input.cke_dialog_ui_checkbox_input:focus,input.cke_dialog_ui_checkbox_input:active,input.cke_dialog_ui_radio_input:focus,input.cke_dialog_ui_radio_input:active{border:0;outline:2px solid #139ff7}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 1px;margin:0;text-align:center;color:#484848;vertical-align:middle;cursor:pointer;border:1px solid #bcbcbc;border-radius:2px;background:#f8f8f8;letter-spacing:.3px;line-height:18px;box-sizing:border-box}.cke_hc a.cke_dialog_ui_button{border-width:3px}span.cke_dialog_ui_button{padding:0 10px;cursor:pointer}a.cke_dialog_ui_button:hover{background:#fff}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border:2px solid #139ff7;outline:0;padding:3px 0}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;background:#09863e;border:1px solid #09863e}.cke_hc a.cke_dialog_ui_button{border:3px solid #bcbcbc}a.cke_dialog_ui_button_ok:hover{background:#53aa78;border-color:#53aa78}a.cke_dialog_ui_button_ok:focus{box-shadow:inset 0 0 0 2px #FFF}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#139ff7}.cke_hc a.cke_dialog_ui_button_ok:hover,.cke_hc a.cke_dialog_ui_button_ok:focus,.cke_hc a.cke_dialog_ui_button_ok:active{border-color:#484848}a.cke_dialog_ui_button_ok.cke_disabled{background:#d1d1d1;border-color:#d1d1d1;cursor:default}a.cke_dialog_ui_button_ok.cke_disabled span{cursor:default}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:28px;line-height:28px;background-color:#fff;border:1px solid #bcbcbc;padding:3px 3px 3px 6px;outline:0;border-radius:2px;margin:0 1px;box-sizing:border-box;width:calc(100% - 2px)!important}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog_ui_labeled_label{margin-left:1px}.cke_dialog .cke_dark_background{background-color:transparent}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked,.cke_dialog a.cke_btn_reset{margin:2px}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_dialog a.cke_btn_over,.cke_dialog a.cke_btn_locked:hover,.cke_dialog a.cke_btn_locked:focus,.cke_dialog a.cke_btn_locked:active,.cke_dialog a.cke_btn_unlocked:hover,.cke_dialog a.cke_btn_unlocked:focus,.cke_dialog a.cke_btn_unlocked:active,.cke_dialog a.cke_btn_reset:hover,.cke_dialog a.cke_btn_reset:focus,.cke_dialog a.cke_btn_reset:active{cursor:pointer;outline:0;margin:0;border:2px solid #139ff7}.cke_dialog fieldset{border:1px solid #bcbcbc}.cke_dialog fieldset legend{padding:0 6px}.cke_dialog_ui_checkbox,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{display:inline-block}.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{padding-top:5px}.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label{vertical-align:middle}.cke_dialog .ImagePreviewBox{border:1px ridge #bcbcbc;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:1px solid #bcbcbc;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;cursor:default;letter-spacing:.3px}.cke_dialog_body label+.cke_dialog_ui_labeled_content{margin-top:2px}.cke_dialog_contents_body .cke_dialog_ui_text,.cke_dialog_contents_body .cke_dialog_ui_select,.cke_dialog_contents_body .cke_dialog_ui_hbox_last>a.cke_dialog_ui_button{margin-top:4px}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:2px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_contents_body .cke_accessibility_legend{margin:2px 7px 2px 2px}.cke_dialog_contents_body .cke_accessibility_legend:focus,.cke_dialog_contents_body .cke_accessibility_legend:active{outline:0;border:2px solid #139ff7;margin:0 5px 0 0}.cke_dialog_contents_body input[type=file]:focus,.cke_dialog_contents_body input[type=file]:active{border:2px solid #139ff7}.cke_dialog_find_fieldset{margin-top:10px!important}.cke_dialog_image_ratiolock{margin-top:52px!important}.cke_dialog_forms_select_order label.cke_dialog_ui_labeled_label{margin-left:0}.cke_dialog_forms_select_order div.cke_dialog_ui_input_select{width:100%}.cke_dialog_forms_select_order_txtsize .cke_dialog_ui_hbox_last{padding-top:4px}.cke_dialog_image_url .cke_dialog_ui_hbox_last,.cke_dialog_flash_url .cke_dialog_ui_hbox_last{vertical-align:bottom}a.cke_dialog_ui_button.cke_dialog_image_browse{margin-top:10px}.cke_dialog_contents_body .cke_tpl_list{border:#bcbcbc 1px solid;margin:1px}.cke_dialog_contents_body .cke_tpl_list:focus,.cke_dialog_contents_body .cke_tpl_list:active{outline:0;margin:0;border:2px solid #139ff7}.cke_dialog_contents_body .cke_tpl_list a:focus,.cke_dialog_contents_body .cke_tpl_list a:active{outline:0}.cke_dialog_contents_body .cke_tpl_list a:focus .cke_tpl_item,.cke_dialog_contents_body .cke_tpl_list a:active .cke_tpl_item{border:2px solid #139ff7;padding:6px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_ie8.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_ie8.css new file mode 100755 index 00000000..4356336c --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_ie8.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#fff}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:12px;cursor:move;position:relative;color:#484848;border-bottom:1px solid #d1d1d1;padding:12px 19px 12px 12px;background:#f8f8f8;letter-spacing:.3px}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border:2px solid rgba(102,102,102,0.2);border-left-color:rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:43px;border-top:1px solid #d1d1d1}.cke_dialog_contents_body{overflow:auto;padding:9px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:33px;display:inline-block;margin:9px 0 0;position:absolute;z-index:2;left:11px}.cke_rtl .cke_dialog_tabs{left:auto;right:11px}a.cke_dialog_tab{height:25px;padding:4px 8px;display:inline-block;cursor:pointer;line-height:26px;outline:0;color:#484848;border:1px solid #d1d1d1;border-radius:3px 3px 0 0;background:#f8f8f8;min-width:90px;text-align:center;margin-left:-1px;letter-spacing:.3px}a.cke_dialog_tab:hover{background-color:#fff}a.cke_dialog_tab:focus{border:2px solid #139ff7;border-bottom-color:#d1d1d1;padding:3px 7px;position:relative;z-index:1}a.cke_dialog_tab_selected{background:#fff;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus{border-bottom-color:#fff}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:16px;width:16px;top:11px;z-index:5;opacity:.7;filter:alpha(opacity = 70)}.cke_rtl .cke_dialog_close_button{left:12px}.cke_ltr .cke_dialog_close_button{right:12px}.cke_hc a.cke_dialog_close_button{background-image:none}.cke_hidpi a.cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}a.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}a.cke_dialog_close_button span{display:none}.cke_hc a.cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%;margin-top:12px}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #bcbcbc;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:2px;min-height:28px;margin-left:1px}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:2px solid #139ff7}input.cke_dialog_ui_input_text:focus{padding-left:5px}textarea.cke_dialog_ui_input_textarea:focus{padding:3px 5px}select.cke_dialog_ui_input_select:focus{margin:0;width:100%!important}input.cke_dialog_ui_checkbox_input,input.cke_dialog_ui_radio_input{margin-left:1px;margin-right:2px}input.cke_dialog_ui_checkbox_input:focus,input.cke_dialog_ui_checkbox_input:active,input.cke_dialog_ui_radio_input:focus,input.cke_dialog_ui_radio_input:active{border:0;outline:2px solid #139ff7}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 1px;margin:0;text-align:center;color:#484848;vertical-align:middle;cursor:pointer;border:1px solid #bcbcbc;border-radius:2px;background:#f8f8f8;letter-spacing:.3px;line-height:18px;box-sizing:border-box}.cke_hc a.cke_dialog_ui_button{border-width:3px}span.cke_dialog_ui_button{padding:0 10px;cursor:pointer}a.cke_dialog_ui_button:hover{background:#fff}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border:2px solid #139ff7;outline:0;padding:3px 0}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;background:#09863e;border:1px solid #09863e}.cke_hc a.cke_dialog_ui_button{border:3px solid #bcbcbc}a.cke_dialog_ui_button_ok:hover{background:#53aa78;border-color:#53aa78}a.cke_dialog_ui_button_ok:focus{box-shadow:inset 0 0 0 2px #FFF}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#139ff7}.cke_hc a.cke_dialog_ui_button_ok:hover,.cke_hc a.cke_dialog_ui_button_ok:focus,.cke_hc a.cke_dialog_ui_button_ok:active{border-color:#484848}a.cke_dialog_ui_button_ok.cke_disabled{background:#d1d1d1;border-color:#d1d1d1;cursor:default}a.cke_dialog_ui_button_ok.cke_disabled span{cursor:default}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:28px;line-height:28px;background-color:#fff;border:1px solid #bcbcbc;padding:3px 3px 3px 6px;outline:0;border-radius:2px;margin:0 1px;box-sizing:border-box;width:calc(100% - 2px)!important}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog_ui_labeled_label{margin-left:1px}.cke_dialog .cke_dark_background{background-color:transparent}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked,.cke_dialog a.cke_btn_reset{margin:2px}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_dialog a.cke_btn_over,.cke_dialog a.cke_btn_locked:hover,.cke_dialog a.cke_btn_locked:focus,.cke_dialog a.cke_btn_locked:active,.cke_dialog a.cke_btn_unlocked:hover,.cke_dialog a.cke_btn_unlocked:focus,.cke_dialog a.cke_btn_unlocked:active,.cke_dialog a.cke_btn_reset:hover,.cke_dialog a.cke_btn_reset:focus,.cke_dialog a.cke_btn_reset:active{cursor:pointer;outline:0;margin:0;border:2px solid #139ff7}.cke_dialog fieldset{border:1px solid #bcbcbc}.cke_dialog fieldset legend{padding:0 6px}.cke_dialog_ui_checkbox,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{display:inline-block}.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{padding-top:5px}.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label{vertical-align:middle}.cke_dialog .ImagePreviewBox{border:1px ridge #bcbcbc;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:1px solid #bcbcbc;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;cursor:default;letter-spacing:.3px}.cke_dialog_body label+.cke_dialog_ui_labeled_content{margin-top:2px}.cke_dialog_contents_body .cke_dialog_ui_text,.cke_dialog_contents_body .cke_dialog_ui_select,.cke_dialog_contents_body .cke_dialog_ui_hbox_last>a.cke_dialog_ui_button{margin-top:4px}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:2px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_contents_body .cke_accessibility_legend{margin:2px 7px 2px 2px}.cke_dialog_contents_body .cke_accessibility_legend:focus,.cke_dialog_contents_body .cke_accessibility_legend:active{outline:0;border:2px solid #139ff7;margin:0 5px 0 0}.cke_dialog_contents_body input[type=file]:focus,.cke_dialog_contents_body input[type=file]:active{border:2px solid #139ff7}.cke_dialog_find_fieldset{margin-top:10px!important}.cke_dialog_image_ratiolock{margin-top:52px!important}.cke_dialog_forms_select_order label.cke_dialog_ui_labeled_label{margin-left:0}.cke_dialog_forms_select_order div.cke_dialog_ui_input_select{width:100%}.cke_dialog_forms_select_order_txtsize .cke_dialog_ui_hbox_last{padding-top:4px}.cke_dialog_image_url .cke_dialog_ui_hbox_last,.cke_dialog_flash_url .cke_dialog_ui_hbox_last{vertical-align:bottom}a.cke_dialog_ui_button.cke_dialog_image_browse{margin-top:10px}.cke_dialog_contents_body .cke_tpl_list{border:#bcbcbc 1px solid;margin:1px}.cke_dialog_contents_body .cke_tpl_list:focus,.cke_dialog_contents_body .cke_tpl_list:active{outline:0;margin:0;border:2px solid #139ff7}.cke_dialog_contents_body .cke_tpl_list a:focus,.cke_dialog_contents_body .cke_tpl_list a:active{outline:0}.cke_dialog_contents_body .cke_tpl_list a:focus .cke_tpl_item,.cke_dialog_contents_body .cke_tpl_list a:active .cke_tpl_item{border:2px solid #139ff7;padding:6px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}a.cke_dialog_ui_button{min-height:18px}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{min-height:18px}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus{padding-top:4px;padding-bottom:2px}select.cke_dialog_ui_input_select{width:100%!important}select.cke_dialog_ui_input_select:focus{margin-left:1px;width:100%!important;padding-top:2px;padding-bottom:2px} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_iequirks.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_iequirks.css new file mode 100755 index 00000000..fcbeb515 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_iequirks.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#fff}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:12px;cursor:move;position:relative;color:#484848;border-bottom:1px solid #d1d1d1;padding:12px 19px 12px 12px;background:#f8f8f8;letter-spacing:.3px}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border:2px solid rgba(102,102,102,0.2);border-left-color:rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:43px;border-top:1px solid #d1d1d1}.cke_dialog_contents_body{overflow:auto;padding:9px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:33px;display:inline-block;margin:9px 0 0;position:absolute;z-index:2;left:11px}.cke_rtl .cke_dialog_tabs{left:auto;right:11px}a.cke_dialog_tab{height:25px;padding:4px 8px;display:inline-block;cursor:pointer;line-height:26px;outline:0;color:#484848;border:1px solid #d1d1d1;border-radius:3px 3px 0 0;background:#f8f8f8;min-width:90px;text-align:center;margin-left:-1px;letter-spacing:.3px}a.cke_dialog_tab:hover{background-color:#fff}a.cke_dialog_tab:focus{border:2px solid #139ff7;border-bottom-color:#d1d1d1;padding:3px 7px;position:relative;z-index:1}a.cke_dialog_tab_selected{background:#fff;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus{border-bottom-color:#fff}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:16px;width:16px;top:11px;z-index:5;opacity:.7;filter:alpha(opacity = 70)}.cke_rtl .cke_dialog_close_button{left:12px}.cke_ltr .cke_dialog_close_button{right:12px}.cke_hc a.cke_dialog_close_button{background-image:none}.cke_hidpi a.cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}a.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}a.cke_dialog_close_button span{display:none}.cke_hc a.cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%;margin-top:12px}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #bcbcbc;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:2px;min-height:28px;margin-left:1px}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:2px solid #139ff7}input.cke_dialog_ui_input_text:focus{padding-left:5px}textarea.cke_dialog_ui_input_textarea:focus{padding:3px 5px}select.cke_dialog_ui_input_select:focus{margin:0;width:100%!important}input.cke_dialog_ui_checkbox_input,input.cke_dialog_ui_radio_input{margin-left:1px;margin-right:2px}input.cke_dialog_ui_checkbox_input:focus,input.cke_dialog_ui_checkbox_input:active,input.cke_dialog_ui_radio_input:focus,input.cke_dialog_ui_radio_input:active{border:0;outline:2px solid #139ff7}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 1px;margin:0;text-align:center;color:#484848;vertical-align:middle;cursor:pointer;border:1px solid #bcbcbc;border-radius:2px;background:#f8f8f8;letter-spacing:.3px;line-height:18px;box-sizing:border-box}.cke_hc a.cke_dialog_ui_button{border-width:3px}span.cke_dialog_ui_button{padding:0 10px;cursor:pointer}a.cke_dialog_ui_button:hover{background:#fff}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border:2px solid #139ff7;outline:0;padding:3px 0}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;background:#09863e;border:1px solid #09863e}.cke_hc a.cke_dialog_ui_button{border:3px solid #bcbcbc}a.cke_dialog_ui_button_ok:hover{background:#53aa78;border-color:#53aa78}a.cke_dialog_ui_button_ok:focus{box-shadow:inset 0 0 0 2px #FFF}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#139ff7}.cke_hc a.cke_dialog_ui_button_ok:hover,.cke_hc a.cke_dialog_ui_button_ok:focus,.cke_hc a.cke_dialog_ui_button_ok:active{border-color:#484848}a.cke_dialog_ui_button_ok.cke_disabled{background:#d1d1d1;border-color:#d1d1d1;cursor:default}a.cke_dialog_ui_button_ok.cke_disabled span{cursor:default}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:28px;line-height:28px;background-color:#fff;border:1px solid #bcbcbc;padding:3px 3px 3px 6px;outline:0;border-radius:2px;margin:0 1px;box-sizing:border-box;width:calc(100% - 2px)!important}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog_ui_labeled_label{margin-left:1px}.cke_dialog .cke_dark_background{background-color:transparent}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked,.cke_dialog a.cke_btn_reset{margin:2px}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_dialog a.cke_btn_over,.cke_dialog a.cke_btn_locked:hover,.cke_dialog a.cke_btn_locked:focus,.cke_dialog a.cke_btn_locked:active,.cke_dialog a.cke_btn_unlocked:hover,.cke_dialog a.cke_btn_unlocked:focus,.cke_dialog a.cke_btn_unlocked:active,.cke_dialog a.cke_btn_reset:hover,.cke_dialog a.cke_btn_reset:focus,.cke_dialog a.cke_btn_reset:active{cursor:pointer;outline:0;margin:0;border:2px solid #139ff7}.cke_dialog fieldset{border:1px solid #bcbcbc}.cke_dialog fieldset legend{padding:0 6px}.cke_dialog_ui_checkbox,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{display:inline-block}.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{padding-top:5px}.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label{vertical-align:middle}.cke_dialog .ImagePreviewBox{border:1px ridge #bcbcbc;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:1px solid #bcbcbc;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;cursor:default;letter-spacing:.3px}.cke_dialog_body label+.cke_dialog_ui_labeled_content{margin-top:2px}.cke_dialog_contents_body .cke_dialog_ui_text,.cke_dialog_contents_body .cke_dialog_ui_select,.cke_dialog_contents_body .cke_dialog_ui_hbox_last>a.cke_dialog_ui_button{margin-top:4px}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:2px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_contents_body .cke_accessibility_legend{margin:2px 7px 2px 2px}.cke_dialog_contents_body .cke_accessibility_legend:focus,.cke_dialog_contents_body .cke_accessibility_legend:active{outline:0;border:2px solid #139ff7;margin:0 5px 0 0}.cke_dialog_contents_body input[type=file]:focus,.cke_dialog_contents_body input[type=file]:active{border:2px solid #139ff7}.cke_dialog_find_fieldset{margin-top:10px!important}.cke_dialog_image_ratiolock{margin-top:52px!important}.cke_dialog_forms_select_order label.cke_dialog_ui_labeled_label{margin-left:0}.cke_dialog_forms_select_order div.cke_dialog_ui_input_select{width:100%}.cke_dialog_forms_select_order_txtsize .cke_dialog_ui_hbox_last{padding-top:4px}.cke_dialog_image_url .cke_dialog_ui_hbox_last,.cke_dialog_flash_url .cke_dialog_ui_hbox_last{vertical-align:bottom}a.cke_dialog_ui_button.cke_dialog_image_browse{margin-top:10px}.cke_dialog_contents_body .cke_tpl_list{border:#bcbcbc 1px solid;margin:1px}.cke_dialog_contents_body .cke_tpl_list:focus,.cke_dialog_contents_body .cke_tpl_list:active{outline:0;margin:0;border:2px solid #139ff7}.cke_dialog_contents_body .cke_tpl_list a:focus,.cke_dialog_contents_body .cke_tpl_list a:active{outline:0}.cke_dialog_contents_body .cke_tpl_list a:focus .cke_tpl_item,.cke_dialog_contents_body .cke_tpl_list a:active .cke_tpl_item{border:2px solid #139ff7;padding:6px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_footer{filter:""} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor.css new file mode 100755 index 00000000..13148ffa --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon {background: url(icons.png?t=20af917) no-repeat 0 -0px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=20af917) no-repeat 0 -24px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=20af917) no-repeat 0 -48px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=20af917) no-repeat 0 -72px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=20af917) no-repeat 0 -96px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=20af917) no-repeat 0 -120px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=20af917) no-repeat 0 -144px !important;}.cke_button__base64image_icon {background: url(icons.png?t=20af917) no-repeat 0 -168px !important;}.cke_button__bold_icon {background: url(icons.png?t=20af917) no-repeat 0 -192px !important;}.cke_button__italic_icon {background: url(icons.png?t=20af917) no-repeat 0 -216px !important;}.cke_button__strike_icon {background: url(icons.png?t=20af917) no-repeat 0 -240px !important;}.cke_button__subscript_icon {background: url(icons.png?t=20af917) no-repeat 0 -264px !important;}.cke_button__superscript_icon {background: url(icons.png?t=20af917) no-repeat 0 -288px !important;}.cke_button__underline_icon {background: url(icons.png?t=20af917) no-repeat 0 -312px !important;}.cke_button__bidiltr_icon {background: url(icons.png?t=20af917) no-repeat 0 -336px !important;}.cke_button__bidirtl_icon {background: url(icons.png?t=20af917) no-repeat 0 -360px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=20af917) no-repeat 0 -384px !important;}.cke_button__bgcolor_icon {background: url(icons.png?t=20af917) no-repeat 0 -408px !important;}.cke_button__textcolor_icon {background: url(icons.png?t=20af917) no-repeat 0 -432px !important;}.cke_button__image_icon {background: url(icons.png?t=20af917) no-repeat 0 -456px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=20af917) no-repeat 0 -480px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=20af917) no-repeat 0 -504px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=20af917) no-repeat 0 -528px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=20af917) no-repeat 0 -552px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=20af917) no-repeat 0 -576px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=20af917) no-repeat 0 -600px !important;}.cke_button__link_icon {background: url(icons.png?t=20af917) no-repeat 0 -624px !important;}.cke_button__unlink_icon {background: url(icons.png?t=20af917) no-repeat 0 -648px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -672px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -696px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -720px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -744px !important;}.cke_button__maximize_icon {background: url(icons.png?t=20af917) no-repeat 0 -768px !important;}.cke_button__table_icon {background: url(icons.png?t=20af917) no-repeat 0 -792px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=20af917) no-repeat 0 -816px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=20af917) no-repeat 0 -840px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=20af917) no-repeat 0 -864px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=20af917) no-repeat 0 -888px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=20af917) no-repeat 0 -912px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=20af917) no-repeat 0 -936px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=20af917) no-repeat 0 -960px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__base64image_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -960px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_gecko.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_gecko.css new file mode 100755 index 00000000..3f9f5e57 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_gecko.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon {background: url(icons.png?t=20af917) no-repeat 0 -0px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=20af917) no-repeat 0 -24px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=20af917) no-repeat 0 -48px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=20af917) no-repeat 0 -72px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=20af917) no-repeat 0 -96px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=20af917) no-repeat 0 -120px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=20af917) no-repeat 0 -144px !important;}.cke_button__base64image_icon {background: url(icons.png?t=20af917) no-repeat 0 -168px !important;}.cke_button__bold_icon {background: url(icons.png?t=20af917) no-repeat 0 -192px !important;}.cke_button__italic_icon {background: url(icons.png?t=20af917) no-repeat 0 -216px !important;}.cke_button__strike_icon {background: url(icons.png?t=20af917) no-repeat 0 -240px !important;}.cke_button__subscript_icon {background: url(icons.png?t=20af917) no-repeat 0 -264px !important;}.cke_button__superscript_icon {background: url(icons.png?t=20af917) no-repeat 0 -288px !important;}.cke_button__underline_icon {background: url(icons.png?t=20af917) no-repeat 0 -312px !important;}.cke_button__bidiltr_icon {background: url(icons.png?t=20af917) no-repeat 0 -336px !important;}.cke_button__bidirtl_icon {background: url(icons.png?t=20af917) no-repeat 0 -360px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=20af917) no-repeat 0 -384px !important;}.cke_button__bgcolor_icon {background: url(icons.png?t=20af917) no-repeat 0 -408px !important;}.cke_button__textcolor_icon {background: url(icons.png?t=20af917) no-repeat 0 -432px !important;}.cke_button__image_icon {background: url(icons.png?t=20af917) no-repeat 0 -456px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=20af917) no-repeat 0 -480px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=20af917) no-repeat 0 -504px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=20af917) no-repeat 0 -528px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=20af917) no-repeat 0 -552px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=20af917) no-repeat 0 -576px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=20af917) no-repeat 0 -600px !important;}.cke_button__link_icon {background: url(icons.png?t=20af917) no-repeat 0 -624px !important;}.cke_button__unlink_icon {background: url(icons.png?t=20af917) no-repeat 0 -648px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -672px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -696px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -720px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -744px !important;}.cke_button__maximize_icon {background: url(icons.png?t=20af917) no-repeat 0 -768px !important;}.cke_button__table_icon {background: url(icons.png?t=20af917) no-repeat 0 -792px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=20af917) no-repeat 0 -816px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=20af917) no-repeat 0 -840px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=20af917) no-repeat 0 -864px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=20af917) no-repeat 0 -888px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=20af917) no-repeat 0 -912px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=20af917) no-repeat 0 -936px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=20af917) no-repeat 0 -960px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__base64image_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -960px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_ie.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_ie.css new file mode 100755 index 00000000..9b41fe6a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_ie.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_button__about_icon {background: url(icons.png?t=20af917) no-repeat 0 -0px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=20af917) no-repeat 0 -24px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=20af917) no-repeat 0 -48px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=20af917) no-repeat 0 -72px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=20af917) no-repeat 0 -96px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=20af917) no-repeat 0 -120px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=20af917) no-repeat 0 -144px !important;}.cke_button__base64image_icon {background: url(icons.png?t=20af917) no-repeat 0 -168px !important;}.cke_button__bold_icon {background: url(icons.png?t=20af917) no-repeat 0 -192px !important;}.cke_button__italic_icon {background: url(icons.png?t=20af917) no-repeat 0 -216px !important;}.cke_button__strike_icon {background: url(icons.png?t=20af917) no-repeat 0 -240px !important;}.cke_button__subscript_icon {background: url(icons.png?t=20af917) no-repeat 0 -264px !important;}.cke_button__superscript_icon {background: url(icons.png?t=20af917) no-repeat 0 -288px !important;}.cke_button__underline_icon {background: url(icons.png?t=20af917) no-repeat 0 -312px !important;}.cke_button__bidiltr_icon {background: url(icons.png?t=20af917) no-repeat 0 -336px !important;}.cke_button__bidirtl_icon {background: url(icons.png?t=20af917) no-repeat 0 -360px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=20af917) no-repeat 0 -384px !important;}.cke_button__bgcolor_icon {background: url(icons.png?t=20af917) no-repeat 0 -408px !important;}.cke_button__textcolor_icon {background: url(icons.png?t=20af917) no-repeat 0 -432px !important;}.cke_button__image_icon {background: url(icons.png?t=20af917) no-repeat 0 -456px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=20af917) no-repeat 0 -480px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=20af917) no-repeat 0 -504px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=20af917) no-repeat 0 -528px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=20af917) no-repeat 0 -552px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=20af917) no-repeat 0 -576px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=20af917) no-repeat 0 -600px !important;}.cke_button__link_icon {background: url(icons.png?t=20af917) no-repeat 0 -624px !important;}.cke_button__unlink_icon {background: url(icons.png?t=20af917) no-repeat 0 -648px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -672px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -696px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -720px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -744px !important;}.cke_button__maximize_icon {background: url(icons.png?t=20af917) no-repeat 0 -768px !important;}.cke_button__table_icon {background: url(icons.png?t=20af917) no-repeat 0 -792px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=20af917) no-repeat 0 -816px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=20af917) no-repeat 0 -840px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=20af917) no-repeat 0 -864px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=20af917) no-repeat 0 -888px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=20af917) no-repeat 0 -912px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=20af917) no-repeat 0 -936px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=20af917) no-repeat 0 -960px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__base64image_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -960px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_ie8.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_ie8.css new file mode 100755 index 00000000..08e6b05a --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_ie8.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_toolbar{position:relative}.cke_rtl .cke_toolbar_end{right:auto;left:0}.cke_toolbar_end:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:1px;right:2px}.cke_rtl .cke_toolbar_end:after{right:auto;left:2px}.cke_hc .cke_toolbar_end:after{top:2px;right:5px;border-color:#000}.cke_hc.cke_rtl .cke_toolbar_end:after{right:auto;left:5px}.cke_combo+.cke_toolbar_end:after,.cke_toolbar.cke_toolbar_last .cke_toolbar_end:after{content:none;border:0}.cke_combo+.cke_toolgroup+.cke_toolbar_end:after{right:0}.cke_rtl .cke_combo+.cke_toolgroup+.cke_toolbar_end:after{right:auto;left:0}.cke_button__about_icon {background: url(icons.png?t=20af917) no-repeat 0 -0px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=20af917) no-repeat 0 -24px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=20af917) no-repeat 0 -48px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=20af917) no-repeat 0 -72px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=20af917) no-repeat 0 -96px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=20af917) no-repeat 0 -120px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=20af917) no-repeat 0 -144px !important;}.cke_button__base64image_icon {background: url(icons.png?t=20af917) no-repeat 0 -168px !important;}.cke_button__bold_icon {background: url(icons.png?t=20af917) no-repeat 0 -192px !important;}.cke_button__italic_icon {background: url(icons.png?t=20af917) no-repeat 0 -216px !important;}.cke_button__strike_icon {background: url(icons.png?t=20af917) no-repeat 0 -240px !important;}.cke_button__subscript_icon {background: url(icons.png?t=20af917) no-repeat 0 -264px !important;}.cke_button__superscript_icon {background: url(icons.png?t=20af917) no-repeat 0 -288px !important;}.cke_button__underline_icon {background: url(icons.png?t=20af917) no-repeat 0 -312px !important;}.cke_button__bidiltr_icon {background: url(icons.png?t=20af917) no-repeat 0 -336px !important;}.cke_button__bidirtl_icon {background: url(icons.png?t=20af917) no-repeat 0 -360px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=20af917) no-repeat 0 -384px !important;}.cke_button__bgcolor_icon {background: url(icons.png?t=20af917) no-repeat 0 -408px !important;}.cke_button__textcolor_icon {background: url(icons.png?t=20af917) no-repeat 0 -432px !important;}.cke_button__image_icon {background: url(icons.png?t=20af917) no-repeat 0 -456px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=20af917) no-repeat 0 -480px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=20af917) no-repeat 0 -504px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=20af917) no-repeat 0 -528px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=20af917) no-repeat 0 -552px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=20af917) no-repeat 0 -576px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=20af917) no-repeat 0 -600px !important;}.cke_button__link_icon {background: url(icons.png?t=20af917) no-repeat 0 -624px !important;}.cke_button__unlink_icon {background: url(icons.png?t=20af917) no-repeat 0 -648px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -672px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -696px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -720px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -744px !important;}.cke_button__maximize_icon {background: url(icons.png?t=20af917) no-repeat 0 -768px !important;}.cke_button__table_icon {background: url(icons.png?t=20af917) no-repeat 0 -792px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=20af917) no-repeat 0 -816px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=20af917) no-repeat 0 -840px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=20af917) no-repeat 0 -864px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=20af917) no-repeat 0 -888px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=20af917) no-repeat 0 -912px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=20af917) no-repeat 0 -936px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=20af917) no-repeat 0 -960px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__base64image_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -960px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_iequirks.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_iequirks.css new file mode 100755 index 00000000..3153af00 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_iequirks.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_top,.cke_contents,.cke_bottom{width:100%}.cke_button_arrow{font-size:0}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon{display:inline-block;vertical-align:top}.cke_rtl .cke_button_icon{float:none}.cke_resizer{width:10px}.cke_source{white-space:normal}.cke_bottom{position:static}.cke_colorbox{font-size:0}.cke_button__about_icon {background: url(icons.png?t=20af917) no-repeat 0 -0px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=20af917) no-repeat 0 -24px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=20af917) no-repeat 0 -48px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=20af917) no-repeat 0 -72px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=20af917) no-repeat 0 -96px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=20af917) no-repeat 0 -120px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=20af917) no-repeat 0 -144px !important;}.cke_button__base64image_icon {background: url(icons.png?t=20af917) no-repeat 0 -168px !important;}.cke_button__bold_icon {background: url(icons.png?t=20af917) no-repeat 0 -192px !important;}.cke_button__italic_icon {background: url(icons.png?t=20af917) no-repeat 0 -216px !important;}.cke_button__strike_icon {background: url(icons.png?t=20af917) no-repeat 0 -240px !important;}.cke_button__subscript_icon {background: url(icons.png?t=20af917) no-repeat 0 -264px !important;}.cke_button__superscript_icon {background: url(icons.png?t=20af917) no-repeat 0 -288px !important;}.cke_button__underline_icon {background: url(icons.png?t=20af917) no-repeat 0 -312px !important;}.cke_button__bidiltr_icon {background: url(icons.png?t=20af917) no-repeat 0 -336px !important;}.cke_button__bidirtl_icon {background: url(icons.png?t=20af917) no-repeat 0 -360px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=20af917) no-repeat 0 -384px !important;}.cke_button__bgcolor_icon {background: url(icons.png?t=20af917) no-repeat 0 -408px !important;}.cke_button__textcolor_icon {background: url(icons.png?t=20af917) no-repeat 0 -432px !important;}.cke_button__image_icon {background: url(icons.png?t=20af917) no-repeat 0 -456px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=20af917) no-repeat 0 -480px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=20af917) no-repeat 0 -504px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=20af917) no-repeat 0 -528px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=20af917) no-repeat 0 -552px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=20af917) no-repeat 0 -576px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=20af917) no-repeat 0 -600px !important;}.cke_button__link_icon {background: url(icons.png?t=20af917) no-repeat 0 -624px !important;}.cke_button__unlink_icon {background: url(icons.png?t=20af917) no-repeat 0 -648px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -672px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -696px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -720px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -744px !important;}.cke_button__maximize_icon {background: url(icons.png?t=20af917) no-repeat 0 -768px !important;}.cke_button__table_icon {background: url(icons.png?t=20af917) no-repeat 0 -792px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=20af917) no-repeat 0 -816px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=20af917) no-repeat 0 -840px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=20af917) no-repeat 0 -864px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=20af917) no-repeat 0 -888px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=20af917) no-repeat 0 -912px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=20af917) no-repeat 0 -936px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=20af917) no-repeat 0 -960px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__base64image_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -960px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/icons.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/icons.png new file mode 100755 index 0000000000000000000000000000000000000000..06ef8f78aecbf8d8a06e3455c6320f9efacf8e3a GIT binary patch literal 5775 zcmXAtc{o(<8^@1^F_y{TmB~I5ja_){+hiR=Lw1>>WZy&fjHpm*Buhh$u^VMy%9DPb6w9l=Q;PepZojy-uJ96P2lVT>;M43%}fn(;1K};kS{PO zc=ov<@+<(HvNJO@u#L$3;~GWe>&`yD95%?w*=2*!kY+y9#bz>AKwXr1|4!Ayep)Nh zum*95`%e+fSRml+mr0G^R_KKu8h= z33&ah;#JvE=|3V;*U{we~m zWEa^{hOQCMp_+}36Dg3l9btC zs6m#j{2zI7;%8oWbYP?UkWsPYwO-p+x&MBQ-5j+SrFWZs=)A+iFU;J$A61zL!1(ow%B{4Apy+O5-U#csrval3qWyi-br2D6^$>dKS zHh-8Hd8TOoChGpL0vLt|^=_JCjP1vWjAU=BV6eZjgX_AP=tq}I27F9I7Vno>^EXpl zu30mq?jgk2__)E41}i3cK{ls~xK;9!+#l*YXT+Z=e-4GhyLOU*9t9QX9RC#4i8+2w zOI!8ynzt=2`*#W%sjowj?vUA-$rgQ>2Bod-*imBJU%P5cY4mLxuD?}`(wv1}Dqt6! zcRDdqU&WQuj@-Y9TvoRvo~LXKWb|kXkJ@MB_V|DR4%9M7HH;Q1QC!C=2adzTLskkA zf%$fta;rr7XQ(Q5OuW*$f!fy8w0rnB5cRH`#CS`+dwuhak>kB`Qkj8RwDl!H9JVsM z+}$J9l@(t~TvGu^EBi@edFE(gfN!9>)lNFI^-3|5`;r{Mb>a&amf$xreKJ2yK(!3v z(u%9JJ3d<>rOJ%!SDNcdt5Ik0LmJ7r($!T*H@E3I!lTO8l|fD&M|*oZ>ta8iPIaAC z8fX5#ahA|{%!^kD;P&m?S1QmDdYA$Nqb+DR8d0j1Uc=Jv@n7x~;Yv3u8&5!? zy|7fb6mh{eV2=NeIT+9MGZN#FupesgPXYY{Bcr49cUPjKzo;v|;!*eTXl`!)w(97? z%L;{J0o}(J79VnQavoSc-%3-d_o=vb<;7hGL4#|@2K_r)@m*~e;t9m_bs>@?>KS4p zmy)n~W{*aVLQ}nF)M+fOE62Xp0xGJiVJA5`wHMVbFA`+o!Ee)?I*4i`?FCnnZTJIB z8T4<8bgG+TY)AWyuz^Dss}|Mx9PlAegBRC-WPEhv!!staRgS3bWtRA1!XsxkQ~(dg zpG8sgPgPab$}5p4QdTExR(l8JTP#lOxIbOym9o_SmKd};V*s?jG2@LbGw!qK+k`~_3N3V1IGIPVfuDzDpgePD6pfUuI~CF`%13j)lTO> zfBx{a&$rL|F6J$Y1LaJqT+7LIwY3K&WU~8*CI;z&*%L`QRz>%BDcmVACnqP&?CB?x z7n@f)ITYRm@2t)$KpLyT+-XfuPv^2LzbvF42r%;FVx4__7Mow?Cjsq5w9SvFa?Zx7 z0;&rP(WBL5&oA|9SjwF&x7gEC&qH}EHRk`ZmF6==8=$*MI#I9Odr$gKz1e*f0<3Jv0V zstQ<85^EM@)(d!i;F3PQ>Ww}2tAG(qlOi|ZWFwtPP3fhlDfp&MLV&W-gmc*XoW@rMJxO7wqwL8d8hB{?ENCE){uDwg%-{kH@O^zN$CI1^?vigYEp*UcFV*4Gw(Xpb=v0XL1n-kdu>B^lpxFBLT5ygXt6Pe3g)pAeTP(jnZTO@dV=_pv#9I z)+R-8;G8iBUK->WJNXSWtI@*-KS-oF-$2j1&(<*_tM1a9WmS^-y`2qCyE~N`kHIr9 z+6hjwcPOAK=Gue%Mvup!(3R^qCtBATgL;wM%adB)XNjKzB1z#k7oVl$2T3|=B?01r zzdri<`?o5KsMT!>*UwOhp9kivZy8+@H}LdicwqWYiM{1QeUy%qx7C4rG1HlnZ}gtL z545WTU>v!MxNmMQE-h(4K~$gaTfQ*ttq*I`+{u^BwTQ=Skcj6)tm`G&dcFh{5|yuw z7jBJ>?69EcIn&1520nGRw~KWYgocN^jZaUvo$TnuU$12Fwywn4ra60ZA>GwBwzrR& z`^&z!*FyA7v|DKfvK$J&6Qu9^y02vyL$SXfyEwx16q}tYo5Xhi_JzT!-w)-yk6V zA}sq?`=egs%KPOUzQ+T%Nv@0J=oY49My$#Xx@4X{#ey0#sWBzEuudt^yGY0dgp+e((R%Y?# z8H>`NmcG_l)yw)M(`0_TxQ@#X=bNJkIsB(32nX>YM@fY{iN?`{GxiTjUNT7J$eHyd ze5%el${TqRk=VLofzigmF6V>=Tsp52Gj;Ll=f1}XZW!tYKYLO@85bMsI3pMMuRic| zBz10gM$vXR36EBON)9E2#JVrP4hMDbGPw0WijVSGW8++;GySm-@~|_JS3Jp`;79lJ zd>3^r)zwe#6Z!F%sgyY~T3_1WjCD-PILqVT5FlRZ)6D5IEE+s|vlc3C7*xP44*?0qD!T~6artmYs zO!Kk^uAlMQSOMuCmw_{`@yN-|)vJ#^+=KrE5DA;mek#$*3pwIyZffCXVnnl1HZBl9C3nHP?!wEzHmUx4-I$5H zEe5;ImlDYUQ=!aF0s`;(gD-0he`la>(-K)=4?5&xr|R= z2KA#mxapwK3HnScd^sDC7bARo8$92y7RC%-e-pgP&!-4~HnFub-Ik5JEyp+*(7f97 zWgXa?b0jmZGfdKjG^%Z-4~s1$Xn7jSg~ae68gDT-5-G$G0|E!+8dTa=J2|2zujH2{ z<}m$jVq%dYE=H(;S51tM=V)qb=5$64REy9gkh;-3Qs58X`a0PXUNr^oWAEOeQ_MN8 zybs-M)?uiC3db5rp%YD3k)ay#nFe{&X6V5Z6wIWF4W)PP)B`CF6gAb#H_SDhiLz0Q zNfE`Ok1v%cAikSpQWUyJIZ2h)W^Aa;5>89K!wv3P!k8@KFHLuUi90(3&Y3RivHauo zn^K?X=_=<%&O(Rzfap2Fg)yk8)%~mp%PhYM86b~us-dCbc;)BET(`7d^L2~$gf0&E zB!o<8MlEyqwVM%JY<@Eh&9R`~Cf zu#dpxm6yj9n6?pYmxU5~p@7?k{>N^P9%F5a_JjbG4R;d557s5zyUQ0}LqL=>8H!G- z3V@VvRZ=D`L`aG%|Cj$k_vcVY=J-n>h|CpKMA{8cP3bOI)X+2?w|$4eUwnMHP5+?B zvf(Dz?AeU5u<%2OUIPV?2d20KXS^hlIuM5CgCqK&u>Mw0A2~fJF@k`hT44aLfAAOC z6M?{pz>bRLFHtX$&Y$~-UEY0ZKPdZK%pxY`F>&oPb#bhMW$by;?dNmqZT4LtbN5FV zPL~WWSmYqScj%k4ql%oKZt|fB%?`|9st@rf_LO0>``s3=o{L;LyH1}V>2Zqi7zJpPPWf5 zCwnPy21OZ|{i+jy2iNoCVtO;Y3e3+|a*k}Kfj4yzSFsko#p54ABAY)X*S|%KH#NRB z|0MBQ{>OU^bqhlkjtniG9}}y+R~DaxrJh$8hcA3NpAzgme>X0PjN`J1>X=c-{73K) zy00ZKXYZk!@fVx30c8*bpd<60;2q;_R7|(yScE5P|*iH?1(Y!uPV@BLih_y zqt!&1sAZ^Mg55ctp~Z$8KTNPC-T`p7wtDUHVn&CF?ug^lX>`|KsX+c z&ze&o=3L*&p?*u*Pa_{|ijtWV%#OomxNvNto}aY4G};{CA+F&W#I+Y+6s%h&yYY-7 zVRF(Al?SYwoZRAxjAs9bh?gb0wX%yRffBp&h7ypxt_-d>7qGMXMEK08r(67T{<_%g z&xJr}Mp1qpt$}F}tdW2vcpv4ruG&~QrD?dE`ij*X&XPl)P@CXdgT*H_WlZ5_0 z^u;D*P~YVV7=V`zrD1^yuc4 zNnUWu-MAin@2Q%>j06MD@e9=NtPnaI&uFdax>6hNC_ls-5l^U|fdfzY@JxB#{^=?kiGf5#Xn>p|DVBD$D!P?8&O7%)2 zNCM?@2qcjV3oa~L_+_=HyXH6-N#Bu75jZ{KAjAcmE4{rvp4RV)BJXJARb$L7MQmY{f`Q1ONLalyIgj1tcs z_Xn{Bx;DHCTeRE!F`AZy=@{cSZd1mX4;aQ z4gOEn`ViinLZSlGjtu&&IwQa^D7fgz6FtB4^XE@Tu%iKX1r&Y8DrUpK1@$JpA$e(| zJbvzNF1m5%>Q=p3>ql!`hjUhEIAprgT~P#wM;qE5NkaBt)((`j|_jP{_sd`RPe-hiKvoki~6(|D!&)9sM} zyTMT1sQ0FLSosJdOh>ieuLeu$WJB@MB17$*Z>mvkiq&t99=@hf%&PzM((xP zJs*=+!LuL+)<0@`fds6v_P0sfrM5*XCwiWRx`sC`J5mEAXc`$f`H_qt{zozrs=ZXz z+a5ai_6H2_4Dl0MQEX0kFfUeXiEA%sw(hi>{5XS8JuGvoyh7-ju>A+f#!Zy_v%zl%-;pmyG*;R-hVK?9{dA33E^$DI0F5Re@pSNlzff`AYsjuopa zLrG`$&!xV;36CJjM&SC*3yEZL6h;vo*Fap|_f}briL1Eo*if!~M|)5vkY=*qYW1Hp z=f(VMh8`Xn86khfl-fFJ2LI@L61uRxvElnY&x%VxBJ0LawMy|OYLurW=-WG96J)0! zF@R*H^trys^`G;4u8zsAt*x%0pFhP#zoiLIJbBWOu4ohzf8am8-RsSEzx$dA1sADp zp4iFENQbJ*57%ElJ1wAS`I$K*cc>2*0XZ(g9iFXN1rQ=Ru{?s&4-zq*4acflnF zG0pLBD8?EWyG^s2^|Z)$G=U^E1Gs5L%QkWf}HnnHGz$0z|6?fkcz?I`5(ii B>wo|N literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/icons_hidpi.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/icons_hidpi.png new file mode 100755 index 0000000000000000000000000000000000000000..2497f4f196396815071050ab04db13d488452118 GIT binary patch literal 17424 zcmaL9by!qg+djO9l2kfGx*McRLL`;$EBz` z-<9NKwBNvY(tTPVJV`kX(2+!}%3>;EzBVwApQVpPc^^L4J$Uqd{lV9kIa7RMVtjov z_dgfR+`gSmEzLL;)fyTy@sZs)`2C{%^ZYE0k@U-WD;1I0ob18UD4)#xQ&K9tZxyHV z3JNZS_*wpFE{-64huu6)GAc?ccD*x73InA)6{X_YlfH`t24HsWzmTnG{vsOo+#u8M zd@Wh()uP{Nn*aj}r%ChCXPcUHqG3@?I{aHf3H{QE1rcqS#E6e@pxWzU{&y@PS-Pe9 z1(`~LRaJbI^GhRHkg*QXO=tS6>YyB+dtu?p~y8RF!HYFRli6@-2f#f9>GF z+QCp%RRdqIG~2tgd%tNHPid06nkz1qpgjzzDVbzUnEt$UmVudgq2vMuy51DMG0eGjy(G*st*rd@vM`+# zLqT zaD&Y=8_(X!JoJ1JCUyK%E8XhZ`X_PET{EWqQBRWT`ZmszMb#+|&xt5LV(fRqbAG4u zX|{3@R3rB|q2+}Jb|fj+jP2{!2idi97{$TrkHQ!3(S}?ZwVB>tmPO#wcamncEKo+v z@5;}6l5962GH%&vz^lH;N$Zx5waC{@nQ{=)(^L*1Mf>tzW^Bd+R~sc}#W#%40~g}$ zU8wQcnNeGN#&GQ zd?yR-=<1ola9QJd=c}NjkcTq(M>-*or$`V?u2`6Ojdx8@>p79lc6Ikl8Aw;Xao4Cd zb_6Go7UZV8BC1=tDNSf{%LZFBF7W42#S)ySRGa-193Hj9){+q{Q2nSR{<{-8RBKrN zT!|^ZlwjR!5ZpFZOap=*qxI$r-Eay&?7x3tGl4--RnIGsC#+RASA0i)0iyYCUX0yq z5h#o#e`qE1_bxe>mpwC3{%|HM=c}^HVs0Ia5p-OV(6affVHIUsG%sG`lXYmJTyI>2 zeYqPzW=(2dQ1Uyr5G^o;?VVHw;q(&9pd88S4K*uiWR;a7f&A%=>P~nyt!Lru^{u8x z+{^1D;lIQ5#r$l%cN!0P@blC1yn*qS_4#hrjH-%P*7qkNJodrzJ%R* z@VRd#R_YO-8%$Mvr?ySVdEv@jd(ea{^UyKoGbWt^mGAzS+ry3ASmt&aSG_O2(Ubw> zNu9c3ih5+&?*_2n$xdngaB9#?fBl`!hbcc<<(VFPl2FmODAfA>^jZPxtlw#YT^TyT z(}bOG@CfhwY-yR#dXNMbzWn1Ua6h`nYS}m1)!$pqCgiiI>w4=!hR^PK61Xww@m-W^ z$10dmZfce__drwF!#|>(1dOSp+yE$sTBQjGojBkbgS&M z^$H#fUWi!7h1PSy@$qpggeSP|<2rmUW+=R|eD!1XJLf*TO^Ct_|BFp45ro$AA4h@v zw|Da-Lca>(clBs#X=O&X=(8u)@{|@?kGv4LZ+1tMx~sUDO_r@qi-OW2MJnLNjQROp zH{9$x)|j)|X$K)sk`&7SEKN{IQ}|9${bbM%@*Ys#!D=R= zYY6`8KF?0qjat7Ml2^I<4SZEeY#y&*_7F+sQC&lzEb1OGlNzC9Ag({T-rUcgcQZNV zgD!2A6XO)@>t8CnlF%sFBf7s*e zQ_a*EqQ)=J+i#O+a46!FQX){gH*Z3NxOaA%FHH4NW_2JFEZiXmt@|#@_KsMC*5c~l zOu#1g0O$8?i6Qld?gVOEiLZ;3o7+*N&tBUptQ?})y_vOJet(mNXz=D913L=zGQ3;6 zMMl?Qc6SWE{fdR$FDcNtu-?(uuF8d}fP}V~iZSJdnfnmd{uuc$BF?R%sD$^a{#%}TufF}a?*6Cv{{KAu zt>yoj1Tr_B_ZnOmNNMqgdWXeuS_V_!4W$V!ttFd5rbdm z(mi|k3JUpL`lvPt%@0+0ECvooa+faoOPV>FxUF($TQS_wUWCyZ8r2V4FF=8d&cA{Q z?9=w5hv!41VDC`+h2$~moLNF7h_Blu#f0%&)u&UF4N)FITyD{mBa-`-H(R|7rq^~* zXBTpE{%m6;;4Wl#KM(Ci_K%5}`ldmw$060#77MK^Y7$Fm+tmZy)6bJlUM)wk1P`Wp zZqlZp8gV&r&Yg6+JJzz-ycnf-n5o5L&?v5*apW|t#iTUd`eUDjBbe#vNQ+A#AHxCt z9#i4Dp3qX0d`D*X2FBCAkCNfN#b)fincwj>FvKEUojqvUq(kar>E51R_0BhU=n|Qyul;*{V_^GA^XP(^(?Zbi$&K5V zoLi23S0&Djj#;Nt)AR3oyVomW)E8KR+&t7(-e2RYDk_rj$9g9fc2y`IlKhBI_qcek z$GIyhCiWgNRoQVf6)Sb41>Fk=Rq)!Xp9%E{@;%C1i8a&AA}+Tf>T6rV%RMCHxxol* zdjjbkPEHVo^6}6@&ZwWUJC{QSIl|i41!+th&0+Npzk=6~1ZK)f-?L<#y^n8l?SPpJ zLF%&27eUj7(#t>EP8S2#{y2M&Z%)ERZ}GDF2JQx4d(7Hb8r@vPJ^tZTC$@eCF#KoE z*7I(nSd>?&&|tctN@baD=16#x>-vb<@dZOHyamBw8ssu!)OzZFS+1#Ub+VoAdDB~^ zK+~2rVV6Dc|%ZoNv z%%he7u+1qi3h_px4KZKX{6{MvfY>d5tLLL{CkJ1~?lbWSC}UhZPkSb%goh=+URt)Mo7|`3HSXc|5R#T3AHJ z*b=;>odU5_1`G5{Mo$UPfB`xOe zt`T(X6UaBYGUe~>-8|0meJOY0&x*^-LTuWOn4nb_>2!PQKb=2+{tR1Q&Z`fysS&+@ zs#M?~{0)(#*_bu@f>G6aL=(lQ+m9r2@#FI#{Az#z(DILDlsCV7w`H8&7y4&g08d|} zal#p#RZL7Ntx32(JHBWz{}LRpQ>uH+N_jz@5gQ$yKYa}g)-}#lz(1Bh}%Pjk7%udISW{t zrU~wLisig+@+~UMi9V7Qb{2*Kc7`q+M3+c3VRt-WuyW5BJ#oxa?)LJ%)Mo$_D&{-5 z1};V<{@f`ER?Z)*`NnLu-MhmqT{_V$ElGwZvwlIN56Sk6C$7xB#AOULyoDbcA4|nS zfcJ%!oX9D^thk_2{7XGEE>8WV^setQLV-cZ09x433zm@8iraQ{{bsk#FLu`rvpdL! zGzcIw6)ZZF$)h^^sgpV%`}Ow&Tb`Kxh-?-utT!2+uOVdmGR5hJQwes1{cN9-O86`#qx%_a|9-UN$06k zI`Q+{(-ic5iM?z1VZf%G_GCH|mkiQOnoJ3`$v~7Z!!y}3weFM}Y-5ON-YLx2++>aS zn(V>zA{{FH2mtPWPog8A_(S&fWY&C|{KQ9J$$hHkojMBCSz9aSooFl!CJ78|mTd{4 zPI|AJ#1}csQ%HcOl^eOKG@6VbMY#GecA{*&=f~}$CP`PWGrVSgC~(l;>M@ckh@5Wy zb3rOSh?k_219Th75hEd7m}X?Z3;Y@U(CZ*i7uw?Q7_Kf8OdP9xs;YW3rH&pR@_TDo zQaXn$<~AoWW98C+dn`sD_I>T4p5MFh;?@$V1i!fs)6SP~LhmR}QY~n|h<-M(`|7nQ zEXbIoI<6W^FPf(?{qniMqeuRVV07Q}c@(e*zHgLglN>v}4s*A_sE6yalQ?^OUuY_C zYEHaf_!bhE39hIkl>lb#Fxw7y_2>FL6vZ<0^+)|Z#T?U0GX+d9C2ROve&U+r8x>Vi zQ*Cs`F&bO8AXk-qLQj)ZewAeI^mO7^4h{}5gs-#tEVIhXy!NO(ouuTeo70YtJZ<(M z&1TY0G^=erjrhF*a`DOuJ1WYj3W@F-G z{o(JO{^El3iI^HQIIB_;he$^NRQ-F1tGGmgb`mt1lErKhLQ0JzOd(4KE$==6xqcBR z-9Zj3cm&ptDKS-H=S)6ICC2EiIrjED&Bg(A5a$=!m$J$!WXmx_U_GAPtm3J)DjQyw z*^|2I`W?J$%pY1P^^UhFok5Z?EH4qvV1``Y+b&Tlxf5ZcKbe5YJ=6HaTT#du;!p<8 z0i_bshCIM@OIx9^k|It)m2NW)Afa2;7?n}liy_L-d*N1rxYy}RpxA<_gNxFwUPjC3 z_N8gInM(E7@AN_2l`R8}ZJ#Hoa(tA{hvA|vDo?!a+f1jLU%!7S3U%HeRS`-X5_Pdy zAukzKF3@Jbj&WUJvvYqR#%nqBY0rE3{7NJNkIp*xOfnHY7E3m-qJDa5;nKDhEo6`V z*u5PnW)#k-lxz3yHxZn)h>ZO^%xB})y}hApuSGq|#ptZ9>I~=6KYa;O8e8@7`q4Ze zA*8pVSl<=K%C8GFuxoA=jgcaMX+)E#9p#^kAfR^TrVg#2LV@@n?D$+vPKDuzZJ2bQ zz|4T1&bf}PybgUCY3!{Gpq0DF;%_*M;Zu5@IaB&BE~EO@`cKxQBs{Mk*lOXUiF2eh zVA5%)J63iBF=575V~~G`Er=JFvLy1}@VUfny*Me+Y<(dX9Xj7a@=*X)WJC##`mLBO zGVf4gkIaIcx@b5D6rf@9T2+c1HwO|K=r+gItz zjLHOvj^CCq!tE;_UEtF^mIZ%OqWQbj7UaWaJz&{ALshK%1Vn;%F6Js7b@n7fNPex4 z*`}?N18f1Vk4b1#f0+Jg9eMl0rtSN(X7SJDo;-y>&EliTPxm6irYcO37&7W;`{4zy z2HNaNH&*7bEa9oE&!aEgIGMqu(FuuD5Oh)d2_Iky+=`H@{&eJU2XOkk^dS-zRrU9n zJHNie@odPU3IOP$T+B6^u^Sc=Czz9vD(>mz6dCb9Sc;cia|gXy5}Uj6cW^xau*l;U zsz8Jnr3fN&RrK-4=jlSCqQ%F*GrdX;mga(8V;Tn;G7`~aZZe{A;9lnecgdul4ZRT6 z{XJN^R|C`uTe~;1iVmyoCA3)XwtcnxDZ=`Rw=8syCDT|^l9KZs(De(+16~GZ$~uC( zTkovoQ>v&kYaR)v&~%kK%A6A88l%7O;YgrWE~q-kZNsLIRMsQW|2Pq#z{pbIZTH^d z-m@z%KO9;$SrVdOi$?{*J%(~XwJkN$B9b+IAQyOSNBN20cKDByi*$?v3gj+2WMyS_*<9g+7ufRCKM=o~ zneF;1KkH9Hn3u@aewVF@&raP?BQhl;7|19)iEbtcTo(3-fe#NyI6J$$yVtE^L~V58 zj?(_h-Fxxz1P!Avy2WG(S2Mabxszk<>I}(H_eBss5UX6c?f=u$j3Q%ZCMTAeXMiSv#Qxu1I3~O7bCEVXBGlr{OSXSopv}Bo zm(tfd&-zBd%Hf{ZQG)Gla8R#uy`vOW=n|NN^tg|qSzq{NyIS?O*PJI7kSEh;of=M| zdNx+;wM5#N2ba<)wX-`TNR0euSjjfK>GL>~N45jU+@&uCEUd;iu}rv=uOG-l8|h)G zVbrjho%$7#;W~_NFi zi+NJZi7XF^OLkKp6nIxRN%l;4^RK9-D~DrDuP1AQYt3KHiKOvcRGSxhl0_t@N2!it zwsUzSWj)kN<8~7sg0ClhKbqrGNkEM<{P2_8JZ(y8tOcPMEEp&c?fwsw-~G5AW|Yny zeHE7EMH=cPIdb6re<0*r8D^J#(_-ym^!;;QTwBy{M4zf(^tyM)#7K_#h~ai+P*gwk zvYAH^b{@7C<`#RK^m}eKS9qLGwH~pu0-bGm;(0}M*=W@IlZJ65Vg&^W&t}|N_=KJw z^TGpuBNa>NjSqW>ygi(3LpBo`piL99bka7{j2u4d6|Ky}mS$^Xt-wAgT6zvp_j|q* znfW?u7=6#7v%7q_zj7A1-#wxo^r}`Rj;JM6S!Mt&6inEe#1k{?8gXw!kSQVJATiK! zR`~UB@}{yHvxWxSEbJo1EaQ37q;$b-o@UV$k_^&^F;))tb4p8H`?Z;xIT=h&C|Nwj z`B8ay`t+IuW-R%NWL2=IACxT)fLI$VkPA*)>2GPz@aghwSLThkE@US5kGE)JObKy@d1OPg+KdIF0DxI$SrKN>3sSRg=onW=EN zaRzJW6EYKl3#8etw_*AR9^!FOYoMaU^}G@0|{9G&l)~^DCLyN?0~d_W%9Y zE33V)k-_mGbm>~p%+EbXl@9l@<2pUw@OkB$YkK$hwF9yQLQ*V={Z7=5*cManmJ}Q!D;8;RJb!O&?Y#xwukD17~T1#m|`4tgr~0bi&Wzw}@dyy3$|9 zQxmCftGq5uSu>x+MEQD6KQQzWP*l{u-!6MpYAyB`H^b5)uLn!`vNt*iLb+#Zq_qrS zQk`+qty*NYU~4OgDE(am_kghLJJw9}vLVa~2GN3@pTY_Oo88j7W(bjp)5dP!+f&B$ zGW+o5EuV*vLRMZkm_n*{LTRVp5ZLd&rj<@?2`4On1CWTcciQowX>@c{PZemjusl}w zw4rqe_fgr5L0F(>v!V;pop`Sj2wGsVRb{(=^Y^cOC$J_w@J6}My>lu)xtbDoCyk+F*uO=FUB|3EZSm0}Y{;nKhl@&kaRGOOe|wlTW(a|QtOmXT zDnz#m#BB!8E{-H+qMQp%x>Znn=V{)^p_upn$5{h2uX{8% zOXPetq0gv%@;L6Kig?##8E#qNwHftQ!p>l_=XAlxd1~F)gwJ@Y?Ovx+YJbXnpv`a9 z#Zxup9Q=$=NXVmv+ciGujHd8Z$#|LP8H^Yu;%w?#Y$Ex{0E2+K{U0 z!7GOS~N*v4Ir+m=D?ajrG%l9sm zOHj_*%_3c|v+7|f{>%c82t0#aZ<;uOm z+V(5SOPgQcn0_!`-Iwh@oUT_HVa<1w0bXYz+Vz7#&+j~ib0&ZK`xTQX=3L-4A_ys) zsOwa|6St$&0U#1t^|>_HXOTwpeLI?B3f!#%jwmvT_m=+j^tF#gl%K5Yy$DGwJq5=5 z5l7rokBMxZe|4Ao@_0*9sC(D%R_zi9 zPJFVEZ0cJGCgshk^U1ofMEvS_K9A-Cxt}8^LV-TeV649sjyW5`H^{dJKy?J$8-h-h z%{SCm+rBPwYwlF<*dP%>p?%$q4NM-TQ?^$CyoJheqw{oTLG0zr$~@bXOnrvQjo4!EkXyZafY{h!h645Ef*n+%#`F<0k4dtOxffYE z*z&$?S}6SqWd`M9Z-Wt^jg1}_w~Fv(MTv@y&18Q#x%rVTpC&~E27o(PXMHmdF}B|K znIv9ZK*%)s>7{}7J|vpSfx{~*>Lo~L9c^jSlt<$LJ_Fi;c* zJi!vp|7%*k?X35}52bUMy_r`3t0!D>?~u}gsY->U$gj=Sh$PlcSue2J6{G4~vMj|{ z$~F?8y+iR|6&*TcTUv*EcoVPx`Sn2Ca*UR<5J zxjT>qig^Wb?K4cTk9-~h#PZ}#JPNg{G75GKi8_rrPVZ866sq)FQ}7RjTpmc)JDaw6 z>}rcDt>IA}8au785)^J|=q z&uZlx9iQnRous9v8fFsHVP6K8)N_$WN;)kChR8QsfBSF^YmLP};H1mLGv~J2UaAFk z9{)f%B<}XDBX`d_Ue27*AZt3}Je1ODn$AaZdmk@68v54=d2DO^+so9}I4g~X5$Qix zQTXLth~~_s200;JrP;??@L{=olwWMulP0(f7=%n~cPYsFnRLQiARvnRXW+lKaNEIY z-!l_%uxPf?{vO@$K0o3*%#*l|Vz$xjv^|MppmCVJ^&|oZi*AbkZT4&jQ4AG~%-*z;ZpX2O0 zu+b`Ufc+~zJp40B2Y&dg-Z9|Wqe2qtFbAG+vHVNN*>*Fmaph9k;qy%(#Z_vIusjNl zS$VpVI0!#n0n_l~^XuoO6Bhw?Vq2CN7LqT8(xga*#~1=He8pn;sY5MBdRc;baS1|~ zc%ERq_VxN&hhpsCg@;4Y#c*-RVbVAoOkc%ChZfr9bW{IwERhR-F%f}+H8G! z(ogq!+p*=5@XW0N?iPn5U^=7>YYI}q9`r?&yOJosEW|5{&0Z0iy4tptGGdN#&wq@$ zxlOu|+$KHoX>+-^TwJ~Dt^*6HCu<9?_lVB||HXLbjhmrlrIo&OSH+5&|3ShK>xwp+ zMO8HKa0M@WcG-1*!Y*8(^Re=zzMM;tpp$imGDD5)+zyDfwJ7u=PtY zzACBq6%Bv|?(@#B!?9FURP%mAse;8@jUu5r4EICY!w_)S`&gY&rwd#M8crONtbQdc zEFl0xYxd*#Ns*+KpV&h(cnxAw?2EuJ;`xSP%jZ1ke+&a)^A_j#?Rs0#Pa$cxdHb$V zyfhG>U^)Q2Cd?9BrH%}fMG<6;_(2|u9y3@JlE#d1L^Z%qoer8LD{{Hmyd%bhUr5QF zq#O&IUaT%t@mt(G%UXsYSan|NJ=$- z(DbIa+E#~voGZl-5QT{o$Y);qmFv#3sq_Met}UucE!=7zvq+s4&Iholy9=j4iDb*Q za>O90cOdAq3^W?UnZHRzHfJ9C-CDY+-sHtnQ37+5 zZRAiI(+lpXbHhm+!s#TGHWQ`!h9xitGGWTY;Toa9>3S8w=lOI^ow05%oC4PP&O9zGZfp%3)UQ=tMUAH-B$N zEvLN{M8@A6GucK)IQutI@^}Qh4~NSlv};y&drrF#Jh+(za1yv_!xb<0;%@zDlq6j z4$>{wUZ4qG>IsRvX3Lj)9(9eVXxa5%b8MKe_kV#>bm0sAO`^8VI|XokdyJERw8z52 za?7PsQ2mVF-EF&h7Y~?@=}>LzLtvR_0`y1(Km055nfxVxu?yzFA5m(V&-gI%Tw|i0 z|1r4%Z{aV88<5m{H9Up-hVOMjb3n`dZc~uHPtcY4uF<1!rug|)WU3%sMIw3$S~xRyNlF0Lc0R+KNoyO*!=e%{~Tj|Ga#xvsHtHBSzsv-p3`;|tDX#v;d}nXf6@ z09ZImw=>=Y7U>0%kI&oc49gd=6~%HqTKrtKYgwSq>FH?#F#ZZ+CP8H^r0m|a^>vR} z|LY+v{q+#UAQq@m3b!i_Hizwoyu(U|CWG(GLAaq%UFkKU3b_q(9h5$yxW)Bi!z zSVPX|bYF2Md|N7?KJf*Mbib2devYHB4u^!tjhx%+Y$f%R={QuOFK|)Ui*J2pz;Q`0fJEp1X$G0 zm(Z@95^w;5TX@SyLUoNo2)hjZqAzr|=0 zX!_#ed$EG)h>^sx5yAV>k!y!BE42`DUXNM>>YGT$Bgyu?%rSR{m!7F)eJ(<tZfP(~J zDoQ%bYKC{)!pof=%c>`sY~e_NKtT*Xy)#ZZOPzI&nUE#q>Gu@WztM~Ejo#e7x72sa zP-_6kYyd+|B&%_8<{v zG2hR+rEMBy6)I}v!uItFTaLLVJI9J9u2G5Wd@i#D_e^AfG~g+M=-a3uko8u!WS-2h z=Z|ff98L7jAZyXGH>Ugzx78eH8D)bR9CJS;>EDqZHbx|+yWV6es;L^aPrAFlRip{~ zLE-V7*h(jb;1;!gk4U!vZH^ok-96?MH{4JuXR+AOGILd<$72z2bCW8^7NnzopuFljfuM^p3w&&e?N0xTHi4WvkPLCkkU5U`MhU`{5W{!}!r=|8E>QhrA zJY_~G)n0$7_ge^U9*g2Ar|_Z_x{vpj9NCITVRi3r*U+c`Aql)!FA2qsznARsBo9zg z)s$$(3?%~ZNe87n3h!{^@=0(r#Uz_4#Sv4S-l7z1Ghu)J9u0B%d-?fwnJjUZSqc!Y zv9KQ#9r9NnOuf@AS&2Nlu1=?W`LXTFsGjM?lc8Mj-*>dkkFGJgP8d%{2`_FGM<`48 z$dF2}pR@m>006mc?_L+L1~@qgWFjwh2C(u4>KQMdoIVtjp9+Yy?;14bkk<6us#vSy z@0Z`p6Z&!3JMe~!WS&yMfUPR&# z36U5%Up9IT%j;F$$5pQP3P1 zUaDoG*FTG)J*#Pl)jd%R_nJILZyt47Wa8y)ku4D7O=wQ1TEO&tg9QT1JLo0;YPRU5=JKQOj<^wei-+MI*S;e@Iq7d*!g$+NF6#dbmL#vv-!~PXm6{)2- zrB;@fU(wZ()?+(Q^En&};zx6yL=F$6HknVEc=*)BOJRNA{?qFmk$u10 zA<&%lv)fw6?Q5~cx5;$LMb3O9w0(7ix0*6Gc!5X@@(dnZxq2s+xm;mwpLW^o{d~K+ zi<7(~t;-$3D^_uvegcOs^EU2LZW5@=S}f9sQcKyD>$xScaI1N40yL^o@q;tsx80m zF09rv&YDt%HvEVqmZ=0DCHcQNMsZp37Tu=(*cR&N(nYpmG{KqjoHRJKc>1@i68E{rt18d z(}@#3!UauCclpaU9*378Zr@&0|9Cb#6))^xNKi0DNy@(+Mzwn{m*8$qN4Y>DhFp9kAghqtc0BMwsRGy>PiM-t8t*PtMkw z@Y|Ou_UIyqgZyO9bB%wV$o3~d^^iFv^m>@=)o|yJO>gYdS z%7+TptCge7){ji3vxLmGgTA>}DQ9$2=uuV3Fgj_{OzldY7#IX%RasmL=n+hSHZ1TZ z`-?{nYN7vzn_)QkZCiIS78zQepvQqg4?)pU#p9dwj9kSGHOl1Wuiof z(tQay$VMN=j6f(dA_W~ttEPkb&ReRW`Er04*BLay(Ttm%O2n$EsojPlylia<0m`L2 zHr7U$JeC5%VngT>1+v3g_zFe+~On!c-XA%Z*=U31V+U#_DeR?Yxs73!};Y}y(&i3)yN^IpOreM@yAL#u- zt)FOe5Cm;F!UVG1q*I~@vbzi;)W%ck$*WJ1L(cw(??5K=9mTh~|4z51*wps+_h433 zI@TE`pYo5W9~)&TXkkNuQ>TJ@+>|O37m#7$1X7U)f}m+{)Px%(3OTBKqYncz&ufgW zsi`XZ6TAph&{&fPra~+laUs@x4!gRUgI0nbf}J+KGOrJ(+Cq}71pz4D5- z#9e9qw{#sCIKeR>t}P1be-u<-SL(*5ecs+`SPpK=S_ull8~v0%z8@RYhpjPE@vocU z8~15Xwc>=tCl6aMMG#a0^ifq-5+kLEXFPS-ZixeHnMHQ3FSgBIKS126A`o1yKmqz5 zPS-xKjv8azD^q0iuJg|~ex7p5>k_zKJ+)7LGXz{o#B5iP@~ zuV8uV5b`1ZLTfYtk_NoPRJN7!xvNwlfA?OyiaBT%m4t>9CKE{9sIQ+WDYe_j-~|6h zE{D2VJE0zXUxO`fs+8jWA^`9z93ZFxYu_tuj#aApC~6HL*e*@X-)XtQ>W6JdSygk ztIJG2eC_3{Jw|Wev*&vG@UagCUcyh8pcf7<47BskURm`0^BDDg&8Yv9LfDUKoQq>M zZC2unv`?SjWTu+lZ%&`DZKgSI_ePUhR!Ul z`a|sa3u0V)v>(NHcbq!niHUQ$|U zGETV{l3VpDQak|Nm3}Tu<6{Fl=rJo-fv)XxI*PA`)!35M&#A z91)@HFg}8z=P23*>zSHbfExB4<;}tzfeRkk;%SE}o22R-%<8E)s(3XOaZVKMx5VP< zB7+la#7`l>Z&4G+P^}T3)m5^SsR}*U7eFsqt92tnSI@7Qu#4TRpLN1J9mnRy(3jeT4+2KoAtr1R0m7#$@e9 zp?n)p|9a0;X+t(jk8BNe`wl0wx(m!_Pf(OMab9{hO_}=a94trjknXl$?mjhbe24{d zCM1wpg~YPQ*2XVhSLFF|;+UGXNmyPDm8YNpmF0=soEELl&|?|=R=U6AVT|&d|5|{v zPEPI;|D}fV$R9s5r1VQxUH)GNADc}S-EM?{!&n+QtA!4nLdZO*TE`)lP`Pa-uTQg^ zih@G41&B^`W=OUmP{ZRiz3a;0x_gR(vqiDF+ifbkx|_xWJ&!_xO^5?pT(oE&51*SE zeO%-1y-CG?&5O7)hkUxhX9@h=I`$UTfn-Dn7w9Ov6g-TLiOJv< zm~brC-a;lg02E@_q4O`%|GVOkda{IoNwT@_lhHRKihw^6mxGoR1FkQQDM95YnKgk7 z0s!dMsX(qD^oo6kO4`F++rbFB&ep5^O%4S9Ap6GN+Hd6AX3X8^jo9qo6JF^!PwOzK z1$`MOVB1OSE~GWIuLg6 zFMbKd32A6F$m4W139)IZqBg z30>}J-t@jN=JUk>YX2bgQn0j5T4)dCvMlk@Omwo+CND|Of5nXBl%AlR>mT$oh^sdn z4n0uc4y||8)B0J|!4z@@cfD~{-V6w{AO~?Tqr_lop;>%cUVw*RSz5|ol9z<4s4>#I zbH<|RFMzvUqLQVpyuE+_*n3_T`v*amHal1RPB8qC1(agb6k-F~UF|B48T+Y<9fP}s z98ms|^0%eyS)kapC$hMXPP67q;&CMag_J1hs5~bj1bXF;kEU1fE|v(Yu^AG}UL5oU z{kJB2K$2?T?t?C-mQL;Y|CgqN4;pwu?h{l+_Me9h&?eF|I;W*1sY}l1(o2S zfJE{Dxn7$1KMH97`GG);;{9ze4T1R;fn(1ZgXS`2fE-nn6#c&&z|y^#+k11@J36bg TbS&VLJ|Lwhs&W;w=E46DYv#A2 literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/arrow.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/arrow.png new file mode 100755 index 0000000000000000000000000000000000000000..d72b5f3b8808bd89996ef62f845164d459957a1b GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol>!VDz;rWf@BDXjpX5LX~=X=(ZY|9>EfAH1#& z-3wIBTN30K45T@Ev~-ix<}bSOt=nC)A1Gk%>Eal|aXtBhiAd6gyIe=gyBczF}qKQ%F0(mNbo(!7G$6ystm-3eX4!Pgg&ebxsLQ E09R-@$^ZZW literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/close.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/close.png new file mode 100755 index 0000000000000000000000000000000000000000..40caa6ddfd01c2a26947761de218e4ce8f5e361e GIT binary patch literal 615 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CDO3=9p;3=BX21L>Cx45bDP46hOx7_4S6Fo@?*ia+WGRLhp+?e4A1op@M5>3aOmOBJL-|3|^OV7Yn$}BPM-7dk4;tau8cTbEB zVOVq2VrTe-pr)C+XL-*25p&w{RY|c$I<(f*c*aemrB}2+@TEpJ&78kybw|w+iRXsL zc6QXHdC8sL^yZ3dsB5%j+BccxKY6pB9X)fwF9YU; literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/hidpi/close.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/hidpi/close.png new file mode 100755 index 0000000000000000000000000000000000000000..fa00f4fce646958807479472de68a95c5ac44eb2 GIT binary patch literal 1238 zcmZ{jYg7_;7{>o7;-$1aS*Vpuj%MUhKwKnwBQeE>iCHQM;;kr2MKsN9ajfHLX|~d( z0j_!7rnbWj70DqHaGE-Ec*#mE*7Aa+f@PN3=;J=@yzl!w=RD8(eS9y+L`T@$x!M5$ z>`9TtShMf=d^Rw%a*B$U%mzI{AQJ!(RjgZ0vHD!5MaGf=DB1}C_Ywf_%@KDRfP6Fn zvkU<6)d0YA1l^QCa{)^|7(oP|KF{r*<{Re3I*&vSw|>6P!rmQRbokQ-0Lv#NA|Wn8 zVTd1y-b&iI_DfMn`pHG`3_1z=jcT zi%WSg1p=WE0#s-iqK?LkfYeSPPgL#*CapJyenttXZ*J|Ceva)*hv&=Giu4Kt|_o#+; z>}-5zb*1N97r@o)GeM!9;t@cLsckcvyOSAjih68&?@b4ntN#|X>if2GF)*oA3JX>2 z4hjhwy!?~cHw`de9d!!lc$p5!CUKJ1nt02cawS`!FH}Dc!pg#IPiJR;LL!!f-KqxU+hT6XNXeN)Uq#mFQcT1%o#$K1C{(32;>vwCG%E5GaBNVOT)^G;= zh0*iUiL6p$=hO3@A`v@#dzX<2bzFJ5a~9^@Rc4Vld3Q9qGWNoUw~GdYK~WgE^SEkl zZSCTrQrhw#Q>+_KPnt5a1{Y}EP9-wpP!ju^wC{bl~-q4{NdM|ZL&DJ?MqVN68k zADI&g1hj2#Zuh<3rB0)8ynGKtOwy88)w=0B>unMH#ng#J-v2NY|HidutyTQ1zr9`uzC# z3%ZgBr8tpkQ(E>Mz7ywii1wrSwG{!4G}i69#cVs5G1mT1uEY%jpFJg>ooGiGDabF8 zvk9?LWa7(u)Pgw-3W!&U8h6;NNSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!ItFh?!xdN1Q+aGJ{c&& zUgGKN%Km_xiC2-KneQA20|T?Mr;B4q#NoAJ-g%GR1ZuD5*6rDJjcrd)-h>3B=A1V= zIR}n!c(^9bSo{Jf6U$}^=5L`*AC=-%+%IT8Y1IunyKa_ih|B7mIi1a#4FXqn%Jx>R zUp1?xM^}tnXS(;Eeft)@w(8(;VPQ~EQdsoQF7;Z}mD1juIc=La8|#R5FZAa-@babR zt!=H}<<9I8mT}-$NOfUJ=2^4V;Mf7n_SdhoZES7d{*Zmju;%(}yB$$8-bOroSe)i| zdmBT;*)-!1hC6xZ6o0t){Yv(Mr$wA;|GGO`I#?P6CK`O+TfB~6PwB(G!!38#rZoQaX0)A3B6jY5zqA@jv>(?TbH3G zYHgT{OTBdRx!voOm6WpIT2IwYc>eC`)6^*!_cEAN{P1>}aW;+N!|sk6-7cov2mYJ+ zI=j2OC!`4oy0ECLtH zlGAJ&$Z$-;;4|N&4|n&*3haNe*PrRe^ZnsXJC+|8kpEQQ#hazTR_JhEU03G*WQhx_ zSFQTa@XK)Z_m!qfLO{_&A>$Pt=8XZ@DdvY$j zVYWN^`JKn#T3oJ|_TNtD-`Ox(<;2YI{|r-hRvU zGP}FGn~^hk%bWyj=I6V+4bl@|A5FH}mcx5Qy6NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!ItFh?!xdN1Q+aGJ{c&& zUgGKN%Km_xiC2-KneQA20|T>`r;B4q#NoB!jzNzN1l~-1d}PiEc8g8<4BNhKiaBGy z;E?er?jTpWL(J2d<8Ng9?X;YJr0e4sxsI4F9c#X=!B4w%d)?R0dpS}0#m1jCeOI$u z&!#bF>xPJ`%=UI+U{G27Ufr`v=d{6Gzrxbe)}J-^J{i__ufP8K+979O7X>8+&TQRl zuS-P^tk6D?wY6#MHpU0XlZ!N1cUy=wFS~L2io!A3F<8pFUmxzSqHtlMT=N6&;h1NY1V>DTQ!F%CmoqVDL>2KIDPJ4PyfL9KFZs+#<`Xl64<|4P-o0PTTfbK1&74GOyB{A7 zYD2{D-HBCa2(`8Px@PP9jfd6Us^2(tiLNw!X8Yx}j+6g;bzK|XyPM~?t(#)P@T+Lm zDnGxoeRm>E*0&ed?>oJnQQ-Dk=BI%-dUhLrU-v)v!2#Yt_k8t|UKO2H6E<#e`{O5( ztjwhl(zrY6XUW@g8#()xt5&R9lKE?jis#`rX2ELvSxv=nHtb%$YSlE)Nem2j_V&}; zcV6Gedfv-%{?*dGUv7Rler{tN+pew?7vKDDng6<0OY%qq_ml03^?JUSkALu1_r2`S zuID-F+@fA10jnRoc}nX~ykBj|_WN%gC&T2EPd2W5eSL#utIpONCFbA1f7cZ{ck-!Z z*_DEQu`RXFy!CS~FZ_DVL1M$|@E>*u3bnt@zVu*y5`#ql@%>Wgn#|tL`}@EC;K$oR ztez>6-;86_tHdU_gof6~>~s23%X&Lii77ib+j!aOpY>5Z8+QL=G~s3s>1C{H2WBMI z64!{5l*E!$tK_0oAjM#0U}&amXsByo6k=#>Wo&F^V4!Va2qdpFu6c{1AvZrIGp!Q0 UhGj7#fj|ump00i_>zopr0FH;n#Q*>R literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/hidpi/refresh.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/hidpi/refresh.png new file mode 100755 index 0000000000000000000000000000000000000000..117a2d4a4715551e735a14ac0a79d40c9affab8a GIT binary patch literal 1623 zcmV-d2B`UoP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x00(qQO+^Rb3jz%x0D}(B2mk;DTS-JgR9M5ES51fIa!A}CT=lR4Pn&pDncWR+4(bwe$DFdqE52*HDR$iagkUKPw~3G6`3 z!Bc_#{B#| z78Vwe=XuHcJkMWd=C9H;y~50;y?R}q=SY$SOG``G-Q7Jv@M&QdLO=+CJkKGeEDi?% zW`15u`A`V)a5x+u^*ry1MiCKqc6O>2ID7W&6pVV4woXHJwOs}unqZKI>SYKZ+38~toltPju zh@uDpjsrODI1Ud6g8~`D_n!(O?pF!c7c-Atu(`R3EXyhd>bnpk%(CoTA;dWoA#*Je z70NSnG3R;SOG%RaVZuK*H-|=}F-AZyG$1Ule!mZ9{xQq4J`tVM1hg+LTnjPh;yC_Y z2=SeiviLqXH-{hy!0YSlQ@+)QuCA`mg<+_qly8`b%p%v5=A@MMZnp~n1p>8N4UXwM zQ^=`Pr})N=8zVgBu>5b&trF4CM~)mR{I8?Hsj@7NW8A!XQ`!QIBy%0W6=uGd=lKZ$ z7XZ9gfk4{rcHP5=4^MH0nc+AN92qS)H@Z(d^8%3UaZ&aQ$^?E#fz+&KN)QR=S?oy`J^~wZEej? ztCyve?^$}?&$8^e>$;_Es7DY4&-MHLN6d`dw{O$QlP57txIIVhcH0I)nF>t`2{CgK z!^~XdjR~BuNGX2;aMWbJ?MAzF16DaU!%5opQ z^Ovdd*O*ETL)a&)BDw<{41u11)O1UMad@IlM(|7LN8JN}!AwU}& z8-?!&g8_WsFX2T*|0<=9RS~FGt6?-6ARrb=?CFD5Vet z!BkFHO0`_qZQ5j#Qli)EAxV;{5*~)(qV0F3)PKJ3m&jPJ*TH7jGdbi7{jTq6nm(3N zR+7rDig6sH-|z3j8qEB;*|erdxoFEA$GL7pZE*!sO1Q53iyg`U z(Cv1=w3AX8hGQ3)9~zAYnE4wWhB~~Yl&=dRl)W%;G;0umj*9B3i&W_fIu8ljkIkV_);j?24{ly*kbV_HbPn z4<04M^QvVh>rn8X2Yqi%Jck@5aI)je|A0z!>~}+L^02E1VL~hPe164Xeyy&wu+=m zDJ(B9hqrFs8iZj8^LNblw-&C?xOVN@v;qLoZnujPYyO^@!tH3#cXOTDcnTqk?`fKr zgag3;LVDC3zOf0O0000bbVXQnWMOn=I%9HWVRU5xGB7bVEio}IFfvpzGdeRfIxsLR zFflqXFxLUB?EnA(C3HntbYx+4WjbwdWNBu305UK!HZ3tREif`vF*7!lvI6-E$sR$z z3=CDO3=9p;3=BX21L>Cx45bDP46hOx7_4S6Fo@?*ia+WGRLhp+?e4 zXsMjst^Hgcb?*)HYR(;>?|kX8+=2JA85!;{ysK~L@z>RI1^QgI#5JNMC9x#cD!C{X zNHG{07@FxCnClu^h8P-K85>xc7-<_ASs55eOen8F(U6;;l9^VCTSMmA^GARh7(8A5 KT-G@yGywqDd$lqE literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/lock.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/lock.png new file mode 100755 index 0000000000000000000000000000000000000000..bde67727d775326b472106b5e0a82f7744de2fc9 GIT binary patch literal 506 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CDO3=9p;3=BX21L>Cx45bDP46hOx7_4S6Fo@?*ia+WGRLhp+?e4 z>z#`>8*e`A zcVWh~ihTX*C38NTGiXPgmlmG6j8o-*;1Q*w@T-a~4xzFxPvT~aWN2pzE}t@O-}{L{ zQ6Z%rhW{8Ux-Pt7VA%7$d*;Fe)%&+p_;bFR=DE+7x#7z82{mh$F4Wt=#2|6f{o)Dl zCT>5Uvy+XR7F(JKOtf6;A~@6Dh(qyCh^S)AZFjbFJ1viKJin92WNUQ7GJf~E-OuKn zFLn6z-KWsh|MmIAwD@$MYv#-hKbReosxL9#m<|ee)e_f;l9a@fRIB8oR3OD*WMF8f zYhbQxXc=N?Y-MabP0l+XkK D;C!rU literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/refresh.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/refresh.png new file mode 100755 index 0000000000000000000000000000000000000000..e363764e3d0886333a3b03b04f5502d4cd79d133 GIT binary patch literal 757 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CDO3=9p;3=BX21L>Cx45bDP46hOx7_4S6Fo@?*ia+WGRLhp+?e4=#-F2>at)pi3YpXk7?elJnowJM)Rcbn##3;CP{noPIf9*u1IU=&zl`?0=2~WI! z=1*ky-*w6t4jybgQdo26y~Qix)vKIlEtCIbQ_sh6?UuK!sc*5HOFv@`Q^N{=iC#DR zwOiZwHqPxn;mdHndV{-C(JS^-cB`jUF+C7qnDJAWfvI47?rmwgJ$LguJN(%7emLLW zCcpb}`SUy8`A^d}GYbAKJa;k2j61B#dS*w!wA6r}$3I&4hj=C0&2R3=Gc;bu^=?(X z%8dHU@q{ literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/spinner.gif b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/spinner.gif new file mode 100755 index 0000000000000000000000000000000000000000..d898d41fa7e0d56b5c0da930750e108e50c14d72 GIT binary patch literal 2984 zcmeH|X*8R88^)iIq}DU`>OwP=T3e-=BBi$4DkQN?thHqk38A4vt5G2&WJ5X+EFD9YT0*sI89FsZ>!72Q&ifkPB@Bi+&U~74=F2=EpXZ$4bKTc<{qMhnlf9`~ zkQ^Wfd;|ajfe;xP85bAFX0snWcpwxChlhv9#>S$eqLP!78yXs3ym*1f!KBV7>b5C(sIPDd$9=)eU}Lyb1T(C|L~Y+d zitR+2qa5i~Maw@~h|4LnKu1*BpT|0%7X#@Us zYG0c%Rw%8s#h!qURb_nB6CDm#w0$Lm!+p6v)M1kPS6XTpYCGb>$ zrTSFsgjs@7;L=ZNHr`*n_AE1e5P&%x;-F-v(5M@!yeHIV8(Mr6q{Znl>TQf94KE)T z7jK=}M@8CeE4Ft!n|nH5@PMzW$tdgUYdov%J=p^p227dAuVV6QXd{etFA&=)=JQj9v_;&SKsh|xZYiyHz`t} zO$T;SEw-s42kOby%|^F=j7GM_Km1qqEqlBw5OJV|i6ea(-8^72y3DWglIPp>Okf(v zPU7=mxfODI5iS2nYy$E81{Tzpng{R3ssh~8E%-KLGq=WZNxhi=qK3lRWk{V+skb`$ z_YH4Mpe6Q-$#UD#5Xp6su8QKBCf}FKvW&5|sa??W>3ww)t)A@tg{= z4o0RHDJ(?yK(NOaa@X8eyH!FJTiQ<)&aDb3%WU`M7CbZUJQ`@^2f5v$)*qu`nO=86 z2yqIGQJez9lZfJlU&Za6{O@(z&?&~7-h`Hp$_ftsz|BZ{J#11GYBDqi zshW{Rt5*`7xQm|tt~XBey@J|SM|X}7wQpgd;&cwOY|_D9hgHO%mMy{7bV~b)UQMM? zFwCH?Vl7QzTg?nUV?0JZk%dU~l8LTFi*Nk-qMK?`Ro(H69NCLUL|R=5JoD(s6R+s~??G-dIB&9( zjE0(rADgtz-YFY$_P5l6Z;HHtk~qz+Iq+yIJJXieBm+B*sPKAR)c1I;p}-|a>KH;T z{k*1vuNaxPZ$$8M&a8M!TYqb(>|{cnMOHZKWvi6%jd*BtRy(j%nE}1-R27v5q^S(n zeB&fb0Md+~9W)Bg^wzQgvGku#O{?6C*#Gp3owR!rT3qT1ITjV{8WUx+rycepJN{jH zom;~1e}pn;IWXEkc-VtF^?uPS!tlMr+@))CvZoeQy6pAyRh-8R)z99iekfQRJaQHm zZ-e&p^dozb($k!`&^wna)Yd8qr7Dr9$7(}iD-CY9mB0YT@zQH0&#TlhoZgC>A{I zAwv8OyXVfJbKzcCm`9QKJe{sg8!wMYFoleOl258#R=>&($9e~ZCnu33m~K(1C?=O} z6CH26C4J{2-zW+3YdiK${&l?^le*q1!^Y>G_MO_=kph+BFBYR%aRo5ay9QagY!jpt6z#}jj1 zdmRs6#V7hQ{S#SNsYjiu2`N<9y{v{6cZG?6u3KQ|`A9m=&`l*3wQ}*CCo*^$qZLqZ5gL)PX88H^eiH-Hy@B{Ysn8b_ literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/readme.md b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/readme.md new file mode 100755 index 00000000..d4c68119 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/readme.md @@ -0,0 +1,46 @@ +"Moono-lisa" Skin +================= + +This skin has been made a **default skin** starting from CKEditor 4.6.0 and is maintained by the core developers. + +For more information about skins, please check the [CKEditor Skin SDK](http://docs.cksource.com/CKEditor_4.x/Skin_SDK) +documentation. + +Features +------------------- +"Moono-lisa" is a monochromatic skin, which offers a modern, flat and minimalistic look which blends very well in modern design. +It comes with the following features: + +- Chameleon feature with brightness. +- High-contrast compatibility. +- Graphics source provided in SVG. + +Directory Structure +------------------- + +CSS parts: +- **editor.css**: the main CSS file. It's simply loading several other files, for easier maintenance, +- **mainui.css**: the file contains styles of entire editor outline structures, +- **toolbar.css**: the file contains styles of the editor toolbar space (top), +- **richcombo.css**: the file contains styles of the rich combo ui elements on toolbar, +- **panel.css**: the file contains styles of the rich combo drop-down, it's not loaded +until the first panel open up, +- **elementspath.css**: the file contains styles of the editor elements path bar (bottom), +- **menu.css**: the file contains styles of all editor menus including context menu and button drop-down, +it's not loaded until the first menu open up, +- **dialog.css**: the CSS files for the dialog UI, it's not loaded until the first dialog open, +- **reset.css**: the file defines the basis of style resets among all editor UI spaces, +- **preset.css**: the file defines the default styles of some UI elements reflecting the skin preference, +- **editor_XYZ.css** and **dialog_XYZ.css**: browser specific CSS hacks. + +Other parts: +- **skin.js**: the only JavaScript part of the skin that registers the skin, its browser specific files and its icons and defines the Chameleon feature, +- **images/**: contains a fill general used images, +- **dev/**: contains SVG and PNG source of the skin icons. + +License +------- + +Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + +For licensing, see LICENSE.md or [http://ckeditor.com/license](http://ckeditor.com/license) diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/styles.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/styles.js new file mode 100755 index 00000000..cc4cc081 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/styles.js @@ -0,0 +1,137 @@ +/** + * Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +// This file contains style definitions that can be used by CKEditor plugins. +// +// The most common use for it is the "stylescombo" plugin which shows the Styles drop-down +// list containing all styles in the editor toolbar. Other plugins, like +// the "div" plugin, use a subset of the styles for their features. +// +// If you do not have plugins that depend on this file in your editor build, you can simply +// ignore it. Otherwise it is strongly recommended to customize this file to match your +// website requirements and design properly. +// +// For more information refer to: http://docs.ckeditor.com/#!/guide/dev_styles-section-style-rules + +CKEDITOR.stylesSet.add( 'default', [ + /* Block styles */ + + // These styles are already available in the "Format" drop-down list ("format" plugin), + // so they are not needed here by default. You may enable them to avoid + // placing the "Format" combo in the toolbar, maintaining the same features. + /* + { name: 'Paragraph', element: 'p' }, + { name: 'Heading 1', element: 'h1' }, + { name: 'Heading 2', element: 'h2' }, + { name: 'Heading 3', element: 'h3' }, + { name: 'Heading 4', element: 'h4' }, + { name: 'Heading 5', element: 'h5' }, + { name: 'Heading 6', element: 'h6' }, + { name: 'Preformatted Text',element: 'pre' }, + { name: 'Address', element: 'address' }, + */ + + { name: 'Italic Title', element: 'h2', styles: { 'font-style': 'italic' } }, + { name: 'Subtitle', element: 'h3', styles: { 'color': '#aaa', 'font-style': 'italic' } }, + { + name: 'Special Container', + element: 'div', + styles: { + padding: '5px 10px', + background: '#eee', + border: '1px solid #ccc' + } + }, + + /* Inline styles */ + + // These are core styles available as toolbar buttons. You may opt enabling + // some of them in the Styles drop-down list, removing them from the toolbar. + // (This requires the "stylescombo" plugin.) + /* + { name: 'Strong', element: 'strong', overrides: 'b' }, + { name: 'Emphasis', element: 'em' , overrides: 'i' }, + { name: 'Underline', element: 'u' }, + { name: 'Strikethrough', element: 'strike' }, + { name: 'Subscript', element: 'sub' }, + { name: 'Superscript', element: 'sup' }, + */ + + { name: 'Marker', element: 'span', attributes: { 'class': 'marker' } }, + + { name: 'Big', element: 'big' }, + { name: 'Small', element: 'small' }, + { name: 'Typewriter', element: 'tt' }, + + { name: 'Computer Code', element: 'code' }, + { name: 'Keyboard Phrase', element: 'kbd' }, + { name: 'Sample Text', element: 'samp' }, + { name: 'Variable', element: 'var' }, + + { name: 'Deleted Text', element: 'del' }, + { name: 'Inserted Text', element: 'ins' }, + + { name: 'Cited Work', element: 'cite' }, + { name: 'Inline Quotation', element: 'q' }, + + { name: 'Language: RTL', element: 'span', attributes: { 'dir': 'rtl' } }, + { name: 'Language: LTR', element: 'span', attributes: { 'dir': 'ltr' } }, + + /* Object styles */ + + { + name: 'Styled Image (left)', + element: 'img', + attributes: { 'class': 'left' } + }, + + { + name: 'Styled Image (right)', + element: 'img', + attributes: { 'class': 'right' } + }, + + { + name: 'Compact Table', + element: 'table', + attributes: { + cellpadding: '5', + cellspacing: '0', + border: '1', + bordercolor: '#ccc' + }, + styles: { + 'border-collapse': 'collapse' + } + }, + + { name: 'Borderless Table', element: 'table', styles: { 'border-style': 'hidden', 'background-color': '#E6E6FA' } }, + { name: 'Square Bulleted List', element: 'ul', styles: { 'list-style-type': 'square' } }, + + /* Widget styles */ + + { name: 'Clean Image', type: 'widget', widget: 'image', attributes: { 'class': 'image-clean' } }, + { name: 'Grayscale Image', type: 'widget', widget: 'image', attributes: { 'class': 'image-grayscale' } }, + + { name: 'Featured Snippet', type: 'widget', widget: 'codeSnippet', attributes: { 'class': 'code-featured' } }, + + { name: 'Featured Formula', type: 'widget', widget: 'mathjax', attributes: { 'class': 'math-featured' } }, + + { name: '240p', type: 'widget', widget: 'embedSemantic', attributes: { 'class': 'embed-240p' }, group: 'size' }, + { name: '360p', type: 'widget', widget: 'embedSemantic', attributes: { 'class': 'embed-360p' }, group: 'size' }, + { name: '480p', type: 'widget', widget: 'embedSemantic', attributes: { 'class': 'embed-480p' }, group: 'size' }, + { name: '720p', type: 'widget', widget: 'embedSemantic', attributes: { 'class': 'embed-720p' }, group: 'size' }, + { name: '1080p', type: 'widget', widget: 'embedSemantic', attributes: { 'class': 'embed-1080p' }, group: 'size' }, + + // Adding space after the style name is an intended workaround. For now, there + // is no option to create two styles with the same name for different widget types. See #16664. + { name: '240p ', type: 'widget', widget: 'embed', attributes: { 'class': 'embed-240p' }, group: 'size' }, + { name: '360p ', type: 'widget', widget: 'embed', attributes: { 'class': 'embed-360p' }, group: 'size' }, + { name: '480p ', type: 'widget', widget: 'embed', attributes: { 'class': 'embed-480p' }, group: 'size' }, + { name: '720p ', type: 'widget', widget: 'embed', attributes: { 'class': 'embed-720p' }, group: 'size' }, + { name: '1080p ', type: 'widget', widget: 'embed', attributes: { 'class': 'embed-1080p' }, group: 'size' } + +] ); + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/app.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/app.css new file mode 100755 index 00000000..0eb96cfe --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/app.css @@ -0,0 +1,11581 @@ +/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ + +body { + margin: 0; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + -webkit-box-sizing: content-box; + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ + +img { + border-style: none; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + -webkit-box-sizing: border-box; + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + +[type="checkbox"], +[type="radio"] { + -webkit-box-sizing: border-box; + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ + +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ + +[hidden] { + display: none; +} + +/*! jQuery UI - v1.10.3 - 2013-11-25 +* http://jqueryui.com +* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.autocomplete.css, jquery.ui.menu.css, jquery.ui.theme.css +* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { + display: none; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.ui-helper-reset { + margin: 0; + padding: 0; + border: 0; + outline: 0; + line-height: 1.3; + text-decoration: none; + font-size: 100%; + list-style: none; +} +.ui-helper-clearfix:before, +.ui-helper-clearfix:after { + content: ""; + display: table; + border-collapse: collapse; +} +.ui-helper-clearfix:after { + clear: both; +} +.ui-helper-clearfix { + min-height: 0; /* support: IE7 */ +} +.ui-helper-zfix { + width: 100%; + height: 100%; + top: 0; + left: 0; + position: absolute; + opacity: 0; + filter:Alpha(Opacity=0); +} + +.ui-front { + z-index: 100; +} + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { + cursor: default !important; +} + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + display: block; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; +} + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.ui-resizable { + position: relative; +} +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + display: block; +} +.ui-resizable-disabled .ui-resizable-handle, +.ui-resizable-autohide .ui-resizable-handle { + display: none; +} +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0; +} +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + left: 0; +} +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0; + height: 100%; +} +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0; + height: 100%; +} +.ui-resizable-se { + cursor: se-resize; + width: 12px; + height: 12px; + right: 1px; + bottom: 1px; +} +.ui-resizable-sw { + cursor: sw-resize; + width: 9px; + height: 9px; + left: -5px; + bottom: -5px; +} +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: -5px; + top: -5px; +} +.ui-resizable-ne { + cursor: ne-resize; + width: 9px; + height: 9px; + right: -5px; + top: -5px; +} +.ui-selectable-helper { + position: absolute; + z-index: 100; + border: 1px dotted black; +} +.ui-autocomplete { + position: absolute; + top: 0; + left: 0; + cursor: default; +} +.ui-menu { + list-style: none; + padding: 2px; + margin: 0; + display: block; + outline: none; +} +.ui-menu .ui-menu { + margin-top: -3px; + position: absolute; +} +.ui-menu .ui-menu-item { + margin: 0; + padding: 0; + width: 100%; + /* support: IE10, see #8844 */ + list-style-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); +} +.ui-menu .ui-menu-divider { + margin: 5px -2px 5px -2px; + height: 0; + font-size: 0; + line-height: 0; + border-width: 1px 0 0 0; +} +.ui-menu .ui-menu-item a { + text-decoration: none; + display: block; + padding: 2px .4em; + line-height: 1.5; + min-height: 0; /* support: IE7 */ + font-weight: normal; +} +.ui-menu .ui-menu-item a.ui-state-focus, +.ui-menu .ui-menu-item a.ui-state-active { + font-weight: normal; + margin: -1px; +} + +.ui-menu .ui-state-disabled { + font-weight: normal; + margin: .4em 0 .2em; + line-height: 1.5; +} +.ui-menu .ui-state-disabled a { + cursor: default; +} + +/* icon support */ +.ui-menu-icons { + position: relative; +} +.ui-menu-icons .ui-menu-item a { + position: relative; + padding-left: 2em; +} + +/* left-aligned */ +.ui-menu .ui-icon { + position: absolute; + top: .2em; + left: .2em; +} + +/* right-aligned */ +.ui-menu .ui-menu-icon { + position: static; + float: right; +} + +/* Component containers +----------------------------------*/ +.ui-widget { + font-family: Verdana,Arial,sans-serif; + font-size: 1.1em; +} +.ui-widget .ui-widget { + font-size: 1em; +} +.ui-widget input, +.ui-widget select, +.ui-widget textarea, +.ui-widget button { + font-family: Verdana,Arial,sans-serif; + font-size: 1em; +} +.ui-widget-content { + border: 1px solid #aaaaaa; + /*background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;*/ + background: #ffffff; + color: #222222; +} +.ui-widget-content a { + color: #222222; +} +.ui-widget-header { + border: 1px solid #aaaaaa; + /*background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;*/ + background: #cccccc; + color: #222222; + font-weight: bold; +} +.ui-widget-header a { + color: #222222; +} + +/* Interaction states +----------------------------------*/ +.ui-state-default, +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default { + border: 1px solid #ccc; + /*background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;*/ + background: #eee; + font-weight: normal; + color: #555555; +} +.ui-state-default a, +.ui-state-default a:link, +.ui-state-default a:visited { + color: #555555; + text-decoration: none; +} +.ui-state-hover, +.ui-widget-content .ui-state-hover, +.ui-widget-header .ui-state-hover, +.ui-state-focus, +.ui-widget-content .ui-state-focus, +.ui-widget-header .ui-state-focus { + border: 1px solid #ccc; +/* background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;*/ + background: #eee; + font-weight: normal; + color: #212121; +} +.ui-state-hover a, +.ui-state-hover a:hover, +.ui-state-hover a:link, +.ui-state-hover a:visited { + color: #212121; + text-decoration: none; +} +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active { + border: 1px solid #aaaaaa; + /*background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;*/ + background: #fff; + font-weight: normal; + color: #212121; +} +.ui-state-active a, +.ui-state-active a:link, +.ui-state-active a:visited { + color: #212121; + text-decoration: none; +} + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, +.ui-widget-content .ui-state-highlight, +.ui-widget-header .ui-state-highlight { + border: 1px solid #fcefa1; + /*background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;*/ + background: #fbf9ee; + color: #363636; +} +.ui-state-highlight a, +.ui-widget-content .ui-state-highlight a, +.ui-widget-header .ui-state-highlight a { + color: #363636; +} +.ui-state-error, +.ui-widget-content .ui-state-error, +.ui-widget-header .ui-state-error { + border: 1px solid #cd0a0a; + /*background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;*/ + background: #fef1ec; + color: #cd0a0a; +} +.ui-state-error a, +.ui-widget-content .ui-state-error a, +.ui-widget-header .ui-state-error a { + color: #cd0a0a; +} +.ui-state-error-text, +.ui-widget-content .ui-state-error-text, +.ui-widget-header .ui-state-error-text { + color: #cd0a0a; +} +.ui-priority-primary, +.ui-widget-content .ui-priority-primary, +.ui-widget-header .ui-priority-primary { + font-weight: bold; +} +.ui-priority-secondary, +.ui-widget-content .ui-priority-secondary, +.ui-widget-header .ui-priority-secondary { + opacity: .7; + filter:Alpha(Opacity=70); + font-weight: normal; +} +.ui-state-disabled, +.ui-widget-content .ui-state-disabled, +.ui-widget-header .ui-state-disabled { + opacity: .35; + filter:Alpha(Opacity=35); + background-image: none; +} +.ui-state-disabled .ui-icon { + filter:Alpha(Opacity=35); /* For IE8 - See #6059 */ +} + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + width: 16px; + height: 16px; +} +/* +.ui-icon, +.ui-widget-content .ui-icon { + background-image: url(images/ui-icons_222222_256x240.png); +} +.ui-widget-header .ui-icon { + background-image: url(images/ui-icons_222222_256x240.png); +} +.ui-state-default .ui-icon { + background-image: url(images/ui-icons_888888_256x240.png); +} +.ui-state-hover .ui-icon, +.ui-state-focus .ui-icon { + background-image: url(images/ui-icons_454545_256x240.png); +} +.ui-state-active .ui-icon { + background-image: url(images/ui-icons_454545_256x240.png); +} +.ui-state-highlight .ui-icon { + background-image: url(images/ui-icons_2e83ff_256x240.png); +} +.ui-state-error .ui-icon, +.ui-state-error-text .ui-icon { + background-image: url(images/ui-icons_cd0a0a_256x240.png); +}*/ + +/* positioning */ +/*.ui-icon-blank { background-position: 16px 16px; } +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-on { background-position: -96px -144px; } +.ui-icon-radio-off { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } + ui-icon-seek-first is deprecated, use ui-icon-seek-start instead +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } +*/ + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, +.ui-corner-top, +.ui-corner-left, +.ui-corner-tl { + border-top-left-radius: 2px; +} +.ui-corner-all, +.ui-corner-top, +.ui-corner-right, +.ui-corner-tr { + border-top-right-radius: 2px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-left, +.ui-corner-bl { + border-bottom-left-radius: 2px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-br { + border-bottom-right-radius: 2px; +} + +/* Overlays */ +.ui-widget-overlay { + /*background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;*/ + background: #aaa; + opacity: .3; + filter: Alpha(Opacity=30); +} +.ui-widget-shadow { + margin: -8px 0 0 -8px; + padding: 8px; + /*background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;*/ + background: #aaa; + opacity: .3; + filter: Alpha(Opacity=30); + border-radius: 8px; +} + + +@charset "UTF-8"; + +@font-face { + font-family: "rainloop"; + src:url("fonts/rainloop.eot"); + src:url("fonts/rainloop.eot?#iefix") format("embedded-opentype"), + url("fonts/rainloop.woff") format("woff"), + url("fonts/rainloop.ttf") format("truetype"), + url("fonts/rainloop.svg#rainloop") format("svg"); + font-weight: normal; + font-style: normal; + +} + +[data-icon]:before { + font-family: "rainloop" !important; + content: attr(data-icon); + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +[class^="icon-"]:before, +[class*=" icon-"]:before { + font-family: "rainloop" !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-arrows-in:before { + content: "\e000"; +} +.icon-arrows-out:before { + content: "\e001"; +} +.icon-list:before { + content: "\e002"; +} +.icon-search:before { + content: "\e003"; +} +.icon-user:before { + content: "\e004"; +} +.icon-user-add:before { + content: "\e005"; +} +.icon-tags:before { + content: "\e006"; +} +.icon-paper-plane:before { + content: "\e007"; +} +.icon-reply:before { + content: "\e008"; +} +.icon-reply-all:before { + content: "\e009"; +} +.icon-forward:before { + content: "\e00a"; +} +.icon-info:before { + content: "\e00b"; +} +.icon-right-dir:before { + content: "\e00c"; +} +.icon-down-dir:before { + content: "\e00d"; +} +.icon-image:before { + content: "\e00e"; +} +.icon-print:before { + content: "\e00f"; +} +.icon-calendar:before { + content: "\e010"; +} +.icon-cog:before { + content: "\e011"; +} +.icon-wrench:before { + content: "\e012"; +} +.icon-rocket:before { + content: "\e013"; +} +.icon-fire:before { + content: "\e014"; +} +.icon-purchase:before { + content: "\e015"; +} +.icon-apple:before { + content: "\e016"; +} +.icon-dropbox:before { + content: "\e017"; +} +.icon-skype:before { + content: "\e018"; +} +.icon-creative-commons:before { + content: "\e019"; +} +.icon-ellipsis:before { + content: "\e01a"; +} +.icon-left:before { + content: "\e01b"; +} +.icon-right:before { + content: "\e01c"; +} +.icon-down:before { + content: "\e01d"; +} +.icon-right-mini:before { + content: "\e01e"; +} +.icon-down-mini:before { + content: "\e01f"; +} +.icon-up:before { + content: "\e020"; +} +.icon-star-empty:before { + content: "\e021"; +} +.icon-star:before { + content: "\e022"; +} +.icon-at:before { + content: "\e023"; +} +.icon-list-add:before { + content: "\e024"; +} +.icon-google:before { + content: "\e025"; +} +.icon-google-plus:before { + content: "\e026"; +} +.icon-twitter:before { + content: "\e027"; +} +.icon-youtube:before { + content: "\e028"; +} +.icon-warning:before { + content: "\e029"; +} +.icon-warning-alt:before { + content: "\e02a"; +} +.icon-power:before { + content: "\e02b"; +} +.icon-plus:before { + content: "\e02c"; +} +.icon-ok:before { + content: "\e02d"; +} +.icon-remove:before { + content: "\e02e"; +} +.icon-file:before { + content: "\e02f"; +} +.icon-file-code:before { + content: "\e030"; +} +.icon-file-chart-graph:before { + content: "\e031"; +} +.icon-file-zip:before { + content: "\e032"; +} +.icon-file-music:before { + content: "\e033"; +} +.icon-file-text:before { + content: "\e034"; +} +.icon-file-bookmark:before { + content: "\e035"; +} +.icon-file-image:before { + content: "\e036"; +} +.icon-file-analytics:before { + content: "\e037"; +} +.icon-file-certificate:before { + content: "\e038"; +} +.icon-attachment:before { + content: "\e039"; +} +.icon-file-excel:before { + content: "\e03a"; +} +.icon-file-movie:before { + content: "\e03b"; +} +.icon-folder-add:before { + content: "\e03c"; +} +.icon-folder:before { + content: "\e03d"; +} +.icon-floppy:before { + content: "\e03e"; +} +.icon-eye:before { + content: "\e03f"; +} +.icon-facebook-alt:before { + content: "\e040"; +} +.icon-facebook:before { + content: "\e041"; +} +.icon-bolt:before { + content: "\e042"; +} +.icon-download:before { + content: "\e043"; +} +.icon-upload:before { + content: "\e044"; +} +.icon-popup:before { + content: "\e045"; +} +.icon-github:before { + content: "\e046"; +} +.icon-telephone:before { + content: "\e047"; +} +.icon-mobile:before { + content: "\e048"; +} +.icon-pencil:before { + content: "\e049"; +} +.icon-trash:before { + content: "\e04a"; +} +.icon-left-middle:before { + content: "\e04b"; +} +.icon-right-middle:before { + content: "\e04c"; +} +.icon-repeat:before { + content: "\e04d"; +} +.icon-key:before { + content: "\e04e"; +} +.icon-lock:before { + content: "\e04f"; +} +.icon-home:before { + content: "\e050"; +} +.icon-address-book:before { + content: "\e051"; +} +.icon-share:before { + content: "\e052"; +} +.icon-suitcase:before { + content: "\e053"; +} +.icon-new-sign:before { + content: "\e054"; +} +.icon-users:before { + content: "\e055"; +} +.icon-earth:before { + content: "\e056"; +} +.icon-mail:before { + content: "\e057"; +} +.icon-checkbox-checked:before { + content: "\e058"; +} +.icon-checkbox-unchecked:before { + content: "\e059"; +} +.icon-checkbox-partial:before { + content: "\e05a"; +} +.icon-radio-checked:before { + content: "\e05b"; +} +.icon-radio-unchecked:before { + content: "\e05c"; +} +.icon-google-drive:before { + content: "\e05d"; +} +.icon-spinner:before { + content: "\e05e"; +} +.icon-archive:before { + content: "\e05f"; +} +.icon-buy-sign:before { + content: "\e060"; +} +.icon-filter:before { + content: "\e061"; +} +.icon-sync:before { + content: "\e062"; +} +.icon-ellipsis-alt:before { + content: "\e063"; +} +.icon-cloud-up:before { + content: "\e064"; +} +.icon-cloud-down:before { + content: "\e065"; +} +.icon-import:before { + content: "\e066"; +} +.icon-export:before { + content: "\e067"; +} +.icon-copy:before { + content: "\e068"; +} +.icon-angry-smiley:before { + content: "\e069"; +} +.icon-happy-smiley:before { + content: "\e06a"; +} +.icon-help:before { + content: "\e06b"; +} +.icon-resize-in:before { + content: "\e06c"; +} +.icon-resize-out:before { + content: "\e06d"; +} +.icon-world:before { + content: "\e06f"; +} +.icon-braille:before { + content: "\e06e"; +} +.icon-play:before { + content: "\e070"; +} +.icon-pause:before { + content: "\e071"; +} +.icon-stop:before { + content: "\e072"; +} +.icon-check-mark-circle-two:before { + content: "\e073"; +} +.icon-laptop:before { + content: "\e075"; +} + +/** initial setup **/ +.nano { +/* + position : relative; + width : 100%; + height : 100%;*/ + overflow : hidden !important; +} + +.nano .content { + position : absolute; + overflow : scroll; + /*overflow-x : hidden;*/ + top : 0; + right : 0; + bottom : 0; + left : 0; + -webkit-overflow-scrolling: touch; +} + +.nano .content .content-wrapper { + height: 100%; +} + +.nano .content::-webkit-scrollbar { + visibility: hidden; +} +.has-scrollbar .content::-webkit-scrollbar { + /*visibility: visible;*/ + visibility: hidden; +} +.nano-visibility-hidden::-webkit-scrollbar { + visibility: hidden; +} + +.nano > .pane { + background : none; + position : absolute; + width : 5px; + right : 0; + top : 1px; + bottom : 1px; + opacity : .01; + filter: alpha(opacity=1); + -webkit-transition : .4s; + -o-transition : .4s; + transition : .4s; + border-radius : 5px; + z-index: 102; + margin : 2px; +} + +.nano > .pane2 { + background : none; + position : absolute; + height : 5px; + right : 1px; + left : 1px; + bottom : 0; + opacity : .01; + filter: alpha(opacity=1); + -webkit-transition : .4s; + -o-transition : .4s; + transition : .4s; + border-radius : 5px; + z-index: 10000; + margin : 2px; +} + +.nano > .pane > .slider { + background-color: #999; + background-color: rgba(0, 0, 0, 0.3); + position : relative; + margin : 0; + border-radius : 3px; + width : 5px; +} + +.nano > .pane2 > .slider2 { + background-color: #999; + background-color: rgba(0, 0, 0, 0.3); + position : relative; + margin : 0; + border-radius : 3px; + height : 5px; +} + +.nano:hover > .pane, .nano:hover > .pane2, .pane.activescroll, .pane2.activescroll, .pane.active, .pane2.active, .pane.flashed, .pane2.flashed { + visibility : visible\9; /* Target only IE7 and IE8 with this hack */ + opacity : 0.99; + filter: alpha(opacity=99); +} + +.nano > .pane:hover, .nano > .pane.active { + background-color: rgba(0, 0, 0, 0.15); +} +.nano > .pane2:hover, .nano > .pane2.active { + background-color: rgba(0, 0, 0, 0.15); +} + +.nano > .pane:hover > .slider, .nano > .pane.active > .slider { + background-color: rgba(0, 0, 0, 0.4); +} +.nano > .pane2:hover > .slider2, .nano > .pane2.active > .slider2 { + background-color: rgba(0, 0, 0, 0.4); +} + +.letterfx{display:inline-block;margin:0;padding:0;-o-transition:all 1s;transition:all 1s;-ms-transition:all 1s;-webkit-transition:all 1s}.letterfx-spin-before{transform:rotate(3600deg);-ms-transform:rotate(3600deg);-webkit-transform:rotate(3600deg)}.letterfx-spin-after{-webkit-transform:none;-ms-transform:none;transform:none}.letterfx-fade-before{opacity:0}.letterfx-grow-before{transform:scale(0,0);-ms-transform:scale(0,0);-webkit-transform:scale(0,0)}.letterfx-grow-after{-webkit-transform:none;-ms-transform:none;transform:none}.letterfx-smear-before{color:transparent;text-shadow:-1px -1px 25px transparent}.letterfx-smear-after{color:inherit;text-shadow:0 0 #333}.letterfx-fall-before{visibility:hidden;transform:scale(3,3);-ms-transform:scale(3,3);-webkit-transform:scale(3,3)}.letterfx-fall-after{transform:scale(1,1);-ms-transform:scale(1,1);-webkit-transform:scale(1,1);text-shadow:0}.letterfx-swirl-before{visibility:hidden;transform:scale(3,3) rotate(3600deg);-ms-transform:scale(3,3) rotate(3600deg);-webkit-transform:scale(3,3) rotate(3600deg)}.letterfx-swirl-after{-webkit-transform:none;-ms-transform:none;transform:none; text-shadow:0}.letterfx-wave-container .letterfx{position:relative}.letterfx-wave-before{bottom:0}.letterfx-wave-after{bottom:15px}.letterfx-fly-left-container .letterfx,.letterfx-fly-right-container .letterfx,.letterfx-fly-top-container .letterfx,.letterfx-fly-bottom-container .letterfx{position:relative}.letterfx-fly-left-before{left:-50em}.letterfx-fly-left-after{left:0}.letterfx-fly-right-before{right:-50em}.letterfx-fly-right-after{right:0}.letterfx-fly-top-before{top:-20em}.letterfx-fly-top-after{top:0}.letterfx-fly-bottom-before{bottom:-20em}.letterfx-fly-bottom-after{bottom:0} +.inputosaurus-container { + background-color:#fff; + border:1px solid #bcbec0; + margin:0 5px 0 0; + padding:0 3px; + display : inline-block; + cursor:text; + font-size : 14px; + font-family : "Helvetica Neue", Helvetica, Arial, sans-serif; +} +.inputosaurus-container li { + display : block; + float : left; + overflow: hidden; + margin : 2px 2px 0; + padding : 2px 3px; + white-space : nowrap; + overflow : hidden; + text-overflow:ellipsis; + -o-text-overflow:ellipsis; + -ms-text-overflow:ellipsis; + background-color:#e5eff7; + border:#a9cae4 solid 1px; + border-radius:2px; + color:#5b9bcd; + -webkit-box-shadow: 0 1px 0 rgba(255,255,255,0.75) inset; + box-shadow: 0 1px 0 rgba(255,255,255,0.75) inset; + line-height : 20px; + cursor: default; +} +.inputosaurus-container li.inputosaurus-selected { background-color:#bdd6eb; } +.inputosaurus-container li a { + font-size:16px; + color:#5b9bcd; + padding : 1px; + text-decoration : none; + outline : none; +} +.inputosaurus-container .inputosaurus-input { + border:none; + -webkit-box-shadow: none; + box-shadow: none; + background-color:#fff; + margin-top : 3px; +} +.inputosaurus-container .inputosaurus-input input { + border:none; + height : 23px; + font-size : 14px; + line-height : 20px; + color : #555; + margin : 0; + outline : none; + padding : 0 0 1px 1px; + width : 25px; + -webkit-box-shadow:none; + box-shadow:none; +} +.inputosaurus-container .inputosaurus-input input:hover { + -webkit-box-shadow:none; + box-shadow:none; +} +.inputosaurus-input-hidden { display:none; } + +.flag-wrapper { + width: 24px; + height: 16px; + display: inline-block; +} + +.flag { + width: 16px; + height: 11px; + display: inline-block; + background: url(flags.png) no-repeat; +} + +.flag.flag-en {background-position: -144px -154px} +.flag.flag-en_us {background-position: -144px -154px} +.flag.flag-en_gb {background-position: -176px -44px} +.flag.flag-en_uk {background-position: -176px -44px} +.flag.flag-en_ca {background-position: -48px -22px} +.flag.flag-el_gr {background-position: -112px -55px} +.flag.flag-uk_ua {background-position: -96px -154px} +.flag.flag-ru_ru {background-position: -224px -121px} +.flag.flag-pt_br {background-position: -192px -11px} +.flag.flag-pl_pl {background-position: -32px -121px} +.flag.flag-nl_nl {background-position: -80px -110px} +.flag.flag-nb_no {background-position: -96px -110px} +.flag.flag-it_it {background-position: -208px -66px} +.flag.flag-de_de {background-position: -80px -33px} +.flag.flag-ro_ro {background-position: -192px -121px} +.flag.flag-fi_fi {background-position: -64px -44px} +.flag.flag-fr_fr {background-position: -144px -44px} +.flag.flag-fr_ca {background-position: -144px -44px} +.flag.flag-pt_pt {background-position: -112px -121px} +.flag.flag-pt_br {background-position: -192px -11px} +.flag.flag-ar_sa {background-position: 0 -132px} +.flag.flag-bg_bg {background-position: -80px -11px} +.flag.flag-es_es {background-position: -16px -44px} +.flag.flag-es_la {background-position: -16px -44px} +.flag.flag-et_ee {background-position: -192px -33px} +.flag.flag-fa_ir {background-position: -176px -66px} +.flag.flag-lt_lt {background-position: -80px -88px} +.flag.flag-lv_lv {background-position: -112px -88px} +.flag.flag-is_is {background-position: -192px -66px} +.flag.flag-hu_hu {background-position: -32px -66px} +.flag.flag-ko_kr {background-position: -144px -77px} +.flag.flag-ja_jp {background-position: -16px -77px} +.flag.flag-sl_si {background-position: -128px -132px} +.flag.flag-sk_sk {background-position: -144px -132px} +.flag.flag-tr_tr {background-position: -16px -154px} +.flag.flag-sv_se {background-position: -80px -132px} +.flag.flag-cs_cz {background-position: -64px -33px} +.flag.flag-zh_cn {background-position: -208px -22px} +.flag.flag-zh_tw {background-position: -64px -154px} +.flag.flag-zh_hk {background-position: -208px -22px} +.flag.flag-da_dk {background-position: -112px -33px} +.flag.flag-id_id {background-position: -64px -66px} + +.opentip-container, +.opentip-container * { + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.opentip-container { + position: absolute; + max-width: 300px; + z-index: 100; + -webkit-transition: -webkit-transform 1s ease-in-out; + -o-transition: -o-transform 1s ease-in-out; + transition: -webkit-transform 1s ease-in-out; + -o-transition: transform 1s ease-in-out; + transition: transform 1s ease-in-out; + transition: transform 1s ease-in-out, -webkit-transform 1s ease-in-out; + pointer-events: none; + -webkit-transform: translateX(0) translateY(0); + -ms-transform: translateX(0) translateY(0); + transform: translateX(0) translateY(0); +} +.opentip-container.ot-fixed.ot-hidden.stem-top.stem-center, +.opentip-container.ot-fixed.ot-going-to-show.stem-top.stem-center, +.opentip-container.ot-fixed.ot-hiding.stem-top.stem-center { + -webkit-transform: translateY(-5px); + -ms-transform: translateY(-5px); + transform: translateY(-5px); +} +.opentip-container.ot-fixed.ot-hidden.stem-top.stem-right, +.opentip-container.ot-fixed.ot-going-to-show.stem-top.stem-right, +.opentip-container.ot-fixed.ot-hiding.stem-top.stem-right { + -webkit-transform: translateY(-5px) translateX(5px); + -ms-transform: translateY(-5px) translateX(5px); + transform: translateY(-5px) translateX(5px); +} +.opentip-container.ot-fixed.ot-hidden.stem-middle.stem-right, +.opentip-container.ot-fixed.ot-going-to-show.stem-middle.stem-right, +.opentip-container.ot-fixed.ot-hiding.stem-middle.stem-right { + -webkit-transform: translateX(5px); + -ms-transform: translateX(5px); + transform: translateX(5px); +} +.opentip-container.ot-fixed.ot-hidden.stem-bottom.stem-right, +.opentip-container.ot-fixed.ot-going-to-show.stem-bottom.stem-right, +.opentip-container.ot-fixed.ot-hiding.stem-bottom.stem-right { + -webkit-transform: translateY(5px) translateX(5px); + -ms-transform: translateY(5px) translateX(5px); + transform: translateY(5px) translateX(5px); +} +.opentip-container.ot-fixed.ot-hidden.stem-bottom.stem-center, +.opentip-container.ot-fixed.ot-going-to-show.stem-bottom.stem-center, +.opentip-container.ot-fixed.ot-hiding.stem-bottom.stem-center { + -webkit-transform: translateY(5px); + -ms-transform: translateY(5px); + transform: translateY(5px); +} +.opentip-container.ot-fixed.ot-hidden.stem-bottom.stem-left, +.opentip-container.ot-fixed.ot-going-to-show.stem-bottom.stem-left, +.opentip-container.ot-fixed.ot-hiding.stem-bottom.stem-left { + -webkit-transform: translateY(5px) translateX(-5px); + -ms-transform: translateY(5px) translateX(-5px); + transform: translateY(5px) translateX(-5px); +} +.opentip-container.ot-fixed.ot-hidden.stem-middle.stem-left, +.opentip-container.ot-fixed.ot-going-to-show.stem-middle.stem-left, +.opentip-container.ot-fixed.ot-hiding.stem-middle.stem-left { + -webkit-transform: translateX(-5px); + -ms-transform: translateX(-5px); + transform: translateX(-5px); +} +.opentip-container.ot-fixed.ot-hidden.stem-top.stem-left, +.opentip-container.ot-fixed.ot-going-to-show.stem-top.stem-left, +.opentip-container.ot-fixed.ot-hiding.stem-top.stem-left { + -webkit-transform: translateY(-5px) translateX(-5px); + -ms-transform: translateY(-5px) translateX(-5px); + transform: translateY(-5px) translateX(-5px); +} +.opentip-container.ot-fixed .opentip { + pointer-events: auto; +} +.opentip-container.ot-hidden { + display: none; +} +.opentip-container .opentip { + position: relative; + font-size: 13px; + line-height: 120%; + padding: 9px 14px; + color: #4f4b47; + text-shadow: -1px -1px 0px rgba(255,255,255,0.2); +} +.opentip-container .opentip .header { + margin: 0; + padding: 0; +} +.opentip-container .opentip .ot-close { + pointer-events: auto; + display: block; + position: absolute; + top: -12px; + left: 60px; + color: rgba(0,0,0,0.5); + background: rgba(0,0,0,0); + text-decoration: none; +} +.opentip-container .opentip .ot-close span { + display: none; +} +.opentip-container .opentip .ot-loading-indicator { + display: none; +} +.opentip-container.ot-loading .ot-loading-indicator { + width: 30px; + height: 30px; + font-size: 30px; + line-height: 30px; + font-weight: bold; + display: block; +} +.opentip-container.ot-loading .ot-loading-indicator span { + display: block; + -webkit-animation: otloading 2s linear infinite; + animation: otloading 2s linear infinite; + text-align: center; +} +.opentip-container.style-dark .opentip, +.opentip-container.style-alert .opentip { + color: #f8f8f8; + text-shadow: 1px 1px 0px rgba(0,0,0,0.2); +} +.opentip-container.style-glass .opentip { + padding: 15px 25px; + color: #317cc5; + text-shadow: 1px 1px 8px rgba(0,94,153,0.3); +} +.opentip-container.ot-hide-effect-fade { + -webkit-transition: -webkit-transform 0.5s ease-in-out, opacity 1s ease-in-out; + -o-transition: -o-transform 0.5s ease-in-out, opacity 1s ease-in-out; + -webkit-transition: opacity 1s ease-in-out, -webkit-transform 0.5s ease-in-out; + transition: opacity 1s ease-in-out, -webkit-transform 0.5s ease-in-out; + -o-transition: transform 0.5s ease-in-out, opacity 1s ease-in-out; + transition: transform 0.5s ease-in-out, opacity 1s ease-in-out; + transition: transform 0.5s ease-in-out, opacity 1s ease-in-out, -webkit-transform 0.5s ease-in-out; + opacity: 1; + -ms-filter: none; + -webkit-filter: none; + filter: none; +} +.opentip-container.ot-hide-effect-fade.ot-hiding { + opacity: 0; + filter: alpha(opacity=0); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; +} +.opentip-container.ot-show-effect-appear.ot-going-to-show, +.opentip-container.ot-show-effect-appear.ot-showing { + -webkit-transition: -webkit-transform 0.5s ease-in-out, opacity 1s ease-in-out; + -o-transition: -o-transform 0.5s ease-in-out, opacity 1s ease-in-out; + -webkit-transition: opacity 1s ease-in-out, -webkit-transform 0.5s ease-in-out; + transition: opacity 1s ease-in-out, -webkit-transform 0.5s ease-in-out; + -o-transition: transform 0.5s ease-in-out, opacity 1s ease-in-out; + transition: transform 0.5s ease-in-out, opacity 1s ease-in-out; + transition: transform 0.5s ease-in-out, opacity 1s ease-in-out, -webkit-transform 0.5s ease-in-out; +} +.opentip-container.ot-show-effect-appear.ot-going-to-show { + opacity: 0; + filter: alpha(opacity=0); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; +} +.opentip-container.ot-show-effect-appear.ot-showing { + opacity: 1; + -ms-filter: none; + -webkit-filter: none; + filter: none; +} +.opentip-container.ot-show-effect-appear.ot-visible { + opacity: 1; + -ms-filter: none; + -webkit-filter: none; + filter: none; +} +@-webkit-keyframes otloading { + 0% { + -webkit-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@keyframes otloading { + 0% { + -webkit-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@charset "UTF-8"; + +/*! + * Pikaday + * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ + */ + +.pika-single { + z-index: 9999; + display: block; + position: relative; + color: #333; + background: #fff; + border: 1px solid #ccc; + border-bottom-color: #bbb; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +/* +clear child float (pika-lendar), using the famous micro clearfix hack +http://nicolasgallagher.com/micro-clearfix-hack/ +*/ +.pika-single:before, +.pika-single:after { + content: " "; + display: table; +} +.pika-single:after { clear: both } +.pika-single { *zoom: 1 } + +.pika-single.is-hidden { + display: none; +} + +.pika-single.is-bound { + position: absolute; + -webkit-box-shadow: 0 5px 15px -5px rgba(0,0,0,.5); + box-shadow: 0 5px 15px -5px rgba(0,0,0,.5); +} + +.pika-lendar { + float: left; + width: 240px; + margin: 8px; +} + +.pika-title { + position: relative; + text-align: center; +} + +.pika-label { + display: inline-block; + *display: inline; + position: relative; + z-index: 9999; + overflow: hidden; + margin: 0; + padding: 5px 3px; + font-size: 14px; + line-height: 20px; + font-weight: bold; + background-color: #fff; +} +.pika-title select { + cursor: pointer; + position: absolute; + z-index: 9998; + margin: 0; + left: 0; + top: 5px; + filter: alpha(opacity=0); + opacity: 0; +} + +.pika-prev, +.pika-next { + display: block; + cursor: pointer; + position: relative; + outline: none; + border: 0; + padding: 0; + width: 20px; + height: 30px; + /* hide text using text-indent trick, using width value (it's enough) */ + text-indent: 20px; + white-space: nowrap; + overflow: hidden; + background-color: transparent; + background-position: center center; + background-repeat: no-repeat; + background-size: 75% 75%; + opacity: .5; + *position: absolute; + *top: 0; +} + +.pika-prev:hover, +.pika-next:hover { + opacity: 1; +} + +.pika-prev, +.is-rtl .pika-next { + float: left; + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg=='); + *left: 0; +} + +.pika-next, +.is-rtl .pika-prev { + float: right; + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII='); + *right: 0; +} + +.pika-prev.is-disabled, +.pika-next.is-disabled { + cursor: default; + opacity: .2; +} + +.pika-select { + display: inline-block; + *display: inline; +} + +.pika-table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; + border: 0; +} + +.pika-table th, +.pika-table td { + width: 14.285714285714286%; + padding: 0; +} + +.pika-table th { + color: #999; + font-size: 12px; + line-height: 25px; + font-weight: bold; + text-align: center; +} + +.pika-button { + cursor: pointer; + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -moz-box-sizing: border-box; + outline: none; + border: 0; + margin: 0; + width: 100%; + padding: 5px; + color: #666; + font-size: 12px; + line-height: 15px; + text-align: right; + background: #f5f5f5; +} + +.pika-week { + font-size: 11px; + color: #999; +} + +.is-today .pika-button { + color: #33aaff; + font-weight: bold; +} + +.is-selected .pika-button, +.has-event .pika-button { + color: #fff; + font-weight: bold; + background: #33aaff; + -webkit-box-shadow: inset 0 1px 3px #178fe5; + box-shadow: inset 0 1px 3px #178fe5; + border-radius: 3px; +} + +.has-event .pika-button { + background: #005da9; + -webkit-box-shadow: inset 0 1px 3px #0076c9; + box-shadow: inset 0 1px 3px #0076c9; +} + +.is-disabled .pika-button, +.is-inrange .pika-button { + background: #D5E9F7; +} + +.is-startrange .pika-button { + color: #fff; + background: #6CB31D; + -webkit-box-shadow: none; + box-shadow: none; + border-radius: 3px; +} + +.is-endrange .pika-button { + color: #fff; + background: #33aaff; + -webkit-box-shadow: none; + box-shadow: none; + border-radius: 3px; +} + +.is-disabled .pika-button { + pointer-events: none; + cursor: default; + color: #999; + opacity: .3; +} + +.is-outside-current-month .pika-button { + color: #999; + opacity: .3; +} + +.is-selection-disabled { + pointer-events: none; + cursor: default; +} + +.pika-button:hover, +.pika-row.pick-whole-week:hover .pika-button { + color: #fff; + background: #ff8000; + -webkit-box-shadow: none; + box-shadow: none; + border-radius: 3px; +} + +/* styling for abbr */ +.pika-table abbr { + border-bottom: none; + cursor: help; +} + + +.lg-sub-html,.lg-toolbar{background-color:rgba(0,0,0,.45)}#lg-counter,.lg-outer .lg-video-cont{vertical-align:middle;display:inline-block}@font-face{font-family:lg;src:url(fonts/lg.eot?n1z373);src:url(fonts/lg.eot?#iefixn1z373) format("embedded-opentype"),url(fonts/lg.woff?n1z373) format("woff"),url(fonts/lg.ttf?n1z373) format("truetype"),url(fonts/lg.svg?n1z373#lg) format("svg");font-weight:400;font-style:normal}.lg-icon{font-family:lg;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.lg-actions .lg-next,.lg-actions .lg-prev{background-color:rgba(0,0,0,.45);border-radius:2px;color:#999;cursor:pointer;display:block;font-size:22px;margin-top:-10px;padding:8px 10px 9px;position:absolute;top:50%;z-index:1080}.lg-actions .lg-next.disabled,.lg-actions .lg-prev.disabled{pointer-events:none;opacity:.5}.lg-actions .lg-next:hover,.lg-actions .lg-prev:hover{color:#FFF}.lg-actions .lg-next{right:20px}.lg-actions .lg-next:before{content:"\e095"}.lg-actions .lg-prev{left:20px}.lg-actions .lg-prev:after{content:"\e094"}@-webkit-keyframes lg-right-end{0%,100%{left:0}50%{left:-30px}}@keyframes lg-right-end{0%,100%{left:0}50%{left:-30px}}@-webkit-keyframes lg-left-end{0%,100%{left:0}50%{left:30px}}@keyframes lg-left-end{0%,100%{left:0}50%{left:30px}}.lg-outer.lg-right-end .lg-object{-webkit-animation:lg-right-end .3s;animation:lg-right-end .3s;position:relative}.lg-outer.lg-left-end .lg-object{-webkit-animation:lg-left-end .3s;animation:lg-left-end .3s;position:relative}.lg-toolbar{z-index:1082;left:0;position:absolute;top:0;width:100%}.lg-toolbar .lg-icon{color:#999;cursor:pointer;float:right;font-size:24px;height:47px;line-height:27px;padding:10px 0;text-align:center;width:50px;text-decoration:none!important;outline:0;-webkit-transition:color .2s linear;-o-transition:color .2s linear;transition:color .2s linear}.lg-toolbar .lg-icon:hover{color:#FFF}.lg-toolbar .lg-close:after{content:"\e070"}.lg-toolbar .lg-download:after{content:"\e0f2"}.lg-sub-html{bottom:0;color:#EEE;font-size:16px;left:0;padding:10px 40px;position:fixed;right:0;text-align:center;z-index:1080}.lg-sub-html h4{margin:0;font-size:13px;font-weight:700}.lg-sub-html p{font-size:12px;margin:5px 0 0}#lg-counter{color:#999;font-size:16px;padding-left:20px;padding-top:12px}.lg-next,.lg-prev,.lg-toolbar{opacity:1;-webkit-transition:-webkit-transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;-o-transition:-o-transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;-webkit-transition:opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear,-webkit-transform .35s cubic-bezier(0,0,.25,1) 0s;transition:opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear,-webkit-transform .35s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;transition:transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;transition:transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear,-webkit-transform .35s cubic-bezier(0,0,.25,1) 0s}.lg-hide-items .lg-prev{opacity:0;-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}.lg-hide-items .lg-next{opacity:0;-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}.lg-hide-items .lg-toolbar{opacity:0;-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-object{-webkit-transform:scale3d(.5,.5,.5);transform:scale3d(.5,.5,.5);opacity:0;-webkit-transition:-webkit-transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;-o-transition:-o-transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;-webkit-transition:opacity 250ms cubic-bezier(0,0,.25,1),-webkit-transform 250ms cubic-bezier(0,0,.25,1) 0s!important;transition:opacity 250ms cubic-bezier(0,0,.25,1),-webkit-transform 250ms cubic-bezier(0,0,.25,1) 0s!important;-o-transition:transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;transition:transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;transition:transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1),-webkit-transform 250ms cubic-bezier(0,0,.25,1) 0s!important;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-item.lg-complete .lg-object{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-outer .lg-thumb-outer{background-color:#0D0A0A;bottom:0;position:absolute;width:100%;z-index:1080;max-height:350px;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,.25,1) 0s;-o-transition:-o-transform .25s cubic-bezier(0,0,.25,1) 0s;transition:-webkit-transform .25s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform .25s cubic-bezier(0,0,.25,1) 0s;transition:transform .25s cubic-bezier(0,0,.25,1) 0s;transition:transform .25s cubic-bezier(0,0,.25,1) 0s, -webkit-transform .25s cubic-bezier(0,0,.25,1) 0s}.lg-outer .lg-thumb-outer.lg-grab .lg-thumb-item{cursor:-webkit-grab;cursor:-o-grab;cursor:-ms-grab;cursor:grab}.lg-outer .lg-thumb-outer.lg-grabbing .lg-thumb-item{cursor:move;cursor:-webkit-grabbing;cursor:-o-grabbing;cursor:-ms-grabbing;cursor:grabbing}.lg-outer .lg-thumb-outer.lg-dragging .lg-thumb{-webkit-transition-duration:0s!important;-o-transition-duration:0s!important;transition-duration:0s!important}.lg-outer.lg-thumb-open .lg-thumb-outer{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.lg-outer .lg-thumb{padding:10px 0;height:100%;margin-bottom:-5px}.lg-outer .lg-thumb-item{cursor:pointer;float:left;overflow:hidden;height:100%;border:2px solid #FFF;border-radius:4px;margin-bottom:5px}@media (min-width:1025px){.lg-outer .lg-thumb-item{-webkit-transition:border-color .25s ease;-o-transition:border-color .25s ease;transition:border-color .25s ease}}.lg-outer .lg-thumb-item.active,.lg-outer .lg-thumb-item:hover{border-color:#a90707}.lg-outer .lg-thumb-item img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.lg-outer.lg-has-thumb .lg-item{padding-bottom:120px}.lg-outer.lg-can-toggle .lg-item{padding-bottom:0}.lg-outer.lg-pull-caption-up .lg-sub-html{-webkit-transition:bottom .25s ease;-o-transition:bottom .25s ease;transition:bottom .25s ease}.lg-outer.lg-pull-caption-up.lg-thumb-open .lg-sub-html{bottom:100px}.lg-outer .lg-toogle-thumb{background-color:#0D0A0A;border-radius:2px 2px 0 0;color:#999;cursor:pointer;font-size:24px;height:39px;line-height:27px;padding:5px 0;position:absolute;right:20px;text-align:center;top:-39px;width:50px}.lg-outer .lg-toogle-thumb:after{content:"\e1ff"}.lg-outer .lg-toogle-thumb:hover{color:#FFF}.lg-outer .lg-video-cont{max-width:1140px;max-height:100%;width:100%;padding:0 5px}.lg-outer .lg-video{width:100%;height:0;padding-bottom:56.25%;overflow:hidden;position:relative}.lg-outer .lg-video .lg-object{display:inline-block;position:absolute;top:0;left:0;width:100%!important;height:100%!important}.lg-outer .lg-video .lg-video-play{width:84px;height:59px;position:absolute;left:50%;top:50%;margin-left:-42px;margin-top:-30px;z-index:1080;cursor:pointer}.lg-outer .lg-has-vimeo .lg-video-play{background:url(img/vimeo-play.png) no-repeat}.lg-outer .lg-has-vimeo:hover .lg-video-play{background:url(img/vimeo-play.png) 0 -58px no-repeat}.lg-outer .lg-has-html5 .lg-video-play{background:url(img/video-play.png) no-repeat;height:64px;margin-left:-32px;margin-top:-32px;width:64px;opacity:.8}.lg-outer .lg-has-html5:hover .lg-video-play{opacity:1}.lg-outer .lg-has-youtube .lg-video-play{background:url(img/youtube-play.png) no-repeat}.lg-outer .lg-has-youtube:hover .lg-video-play{background:url(img/youtube-play.png) 0 -60px no-repeat}.lg-outer .lg-video-object{width:100%!important;height:100%!important;position:absolute;top:0;left:0}.lg-outer .lg-has-video .lg-video-object{visibility:hidden}.lg-outer .lg-has-video.lg-video-playing .lg-object,.lg-outer .lg-has-video.lg-video-playing .lg-video-play{display:none}.lg-outer .lg-has-video.lg-video-playing .lg-video-object{visibility:visible}.lg-progress-bar{background-color:#333;height:5px;left:0;position:absolute;top:0;width:100%;z-index:1083;opacity:0;-webkit-transition:opacity 80ms ease 0s;-o-transition:opacity 80ms ease 0s;transition:opacity 80ms ease 0s}.lg-progress-bar .lg-progress{background-color:#a90707;height:5px;width:0}.lg-progress-bar.lg-start .lg-progress{width:100%}.lg-show-autoplay .lg-progress-bar{opacity:1}.lg-autoplay-button:after{content:"\e01d"}.lg-show-autoplay .lg-autoplay-button:after{content:"\e01a"}.lg-outer.lg-css3.lg-zoom-dragging .lg-item.lg-complete.lg-zoomable .lg-image,.lg-outer.lg-css3.lg-zoom-dragging .lg-item.lg-complete.lg-zoomable .lg-img-wrap{-webkit-transition-duration:0s;-o-transition-duration:0s;transition-duration:0s}.lg-outer .lg-item.lg-complete.lg-zoomable .lg-img-wrap{-webkit-transition:left .3s cubic-bezier(0,0,.25,1) 0s,top .3s cubic-bezier(0,0,.25,1) 0s;-o-transition:left .3s cubic-bezier(0,0,.25,1) 0s,top .3s cubic-bezier(0,0,.25,1) 0s;transition:left .3s cubic-bezier(0,0,.25,1) 0s,top .3s cubic-bezier(0,0,.25,1) 0s;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.lg-outer .lg-item.lg-complete.lg-zoomable .lg-image{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);-webkit-transition:-webkit-transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;-o-transition:-o-transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;-webkit-transition:opacity .15s,-webkit-transform .3s cubic-bezier(0,0,.25,1) 0s!important;transition:opacity .15s,-webkit-transform .3s cubic-bezier(0,0,.25,1) 0s!important;-o-transition:transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;transition:transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;transition:transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s,-webkit-transform .3s cubic-bezier(0,0,.25,1) 0s!important;-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-backface-visibility:hidden;backface-visibility:hidden}#lg-zoom-in:after{content:"\e311"}#lg-actual-size{font-size:20px}#lg-actual-size:after{content:"\e033"}#lg-zoom-out{opacity:.5;pointer-events:none}#lg-zoom-out:after{content:"\e312"}.lg-zoomed #lg-zoom-out{opacity:1;pointer-events:auto}.lg-outer .lg-pager-outer{bottom:60px;left:0;position:absolute;right:0;text-align:center;z-index:1080;height:10px}.lg-outer .lg-pager-outer.lg-pager-hover .lg-pager-cont{overflow:visible}.lg-outer .lg-pager-cont{cursor:pointer;display:inline-block;overflow:hidden;position:relative;vertical-align:top;margin:0 5px}.lg-outer .lg-pager-cont:hover .lg-pager-thumb-cont{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.lg-outer .lg-pager-cont.lg-pager-active .lg-pager{-webkit-box-shadow:0 0 0 2px #fff inset;box-shadow:0 0 0 2px #fff inset}.lg-outer .lg-pager-thumb-cont{background-color:#fff;color:#FFF;bottom:100%;height:83px;left:0;margin-bottom:20px;margin-left:-60px;opacity:0;padding:5px;position:absolute;width:120px;border-radius:3px;-webkit-transition:opacity .15s ease 0s,-webkit-transform .15s ease 0s;-o-transition:opacity .15s ease 0s,-o-transform .15s ease 0s;transition:opacity .15s ease 0s,-webkit-transform .15s ease 0s;-o-transition:opacity .15s ease 0s,transform .15s ease 0s;transition:opacity .15s ease 0s,transform .15s ease 0s;transition:opacity .15s ease 0s,transform .15s ease 0s,-webkit-transform .15s ease 0s;-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}.lg-outer .lg-pager-thumb-cont img{width:100%;height:100%}.lg-outer .lg-pager{background-color:rgba(255,255,255,.5);border-radius:50%;-webkit-box-shadow:0 0 0 8px rgba(255,255,255,.7) inset;box-shadow:0 0 0 8px rgba(255,255,255,.7) inset;display:block;height:12px;-webkit-transition:box-shadow .3s ease 0s;-o-transition:box-shadow .3s ease 0s;-webkit-transition:-webkit-box-shadow .3s ease 0s;transition:-webkit-box-shadow .3s ease 0s;transition:box-shadow .3s ease 0s;transition:box-shadow .3s ease 0s, -webkit-box-shadow .3s ease 0s;width:12px}.lg-outer .lg-pager:focus,.lg-outer .lg-pager:hover{-webkit-box-shadow:0 0 0 8px #fff inset;box-shadow:0 0 0 8px #fff inset}.lg-outer .lg-caret{border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px dashed;bottom:-10px;display:inline-block;height:0;left:50%;margin-left:-5px;position:absolute;vertical-align:middle;width:0}.lg-outer,.lg-outer .lg,.lg-outer .lg-inner{width:100%;height:100%}.lg-fullscreen:after{content:"\e20c"}.lg-fullscreen-on .lg-fullscreen:after{content:"\e20d"}.group:after,.group:before{display:table;content:"";line-height:0}.group:after{clear:both}.lg-outer{position:fixed;top:0;left:0;z-index:1050;opacity:0;-webkit-transition:opacity .15s ease 0s;-o-transition:opacity .15s ease 0s;transition:opacity .15s ease 0s}.lg-outer *{-webkit-box-sizing:border-box;box-sizing:border-box}.lg-outer.lg-visible{opacity:1}.lg-outer.lg-css3 .lg-item.lg-current,.lg-outer.lg-css3 .lg-item.lg-next-slide,.lg-outer.lg-css3 .lg-item.lg-prev-slide{-webkit-transition-duration:inherit!important;-o-transition-duration:inherit!important;transition-duration:inherit!important;-webkit-transition-timing-function:inherit!important;-o-transition-timing-function:inherit!important;transition-timing-function:inherit!important}.lg-outer.lg-css3.lg-dragging .lg-item.lg-current,.lg-outer.lg-css3.lg-dragging .lg-item.lg-next-slide,.lg-outer.lg-css3.lg-dragging .lg-item.lg-prev-slide{-webkit-transition-duration:0s!important;-o-transition-duration:0s!important;transition-duration:0s!important;opacity:1}.lg-outer.lg-grab img.lg-object{cursor:-webkit-grab;cursor:-o-grab;cursor:-ms-grab;cursor:grab}.lg-outer.lg-grabbing img.lg-object{cursor:move;cursor:-webkit-grabbing;cursor:-o-grabbing;cursor:-ms-grabbing;cursor:grabbing}.lg-outer .lg{position:relative;overflow:hidden;margin-left:auto;margin-right:auto;max-width:100%;max-height:100%}.lg-outer .lg-inner{position:absolute;left:0;top:0;white-space:nowrap}.lg-outer .lg-item{background:url(img/loading.gif) center center no-repeat;display:none!important}.lg-outer.lg-css .lg-current,.lg-outer.lg-css3 .lg-current,.lg-outer.lg-css3 .lg-next-slide,.lg-outer.lg-css3 .lg-prev-slide{display:inline-block!important}.lg-outer .lg-img-wrap,.lg-outer .lg-item{display:inline-block;text-align:center;position:absolute;width:100%;height:100%}.lg-outer .lg-img-wrap:before,.lg-outer .lg-item:before{content:"";display:inline-block;height:50%;width:1px;margin-right:-1px}.lg-outer .lg-img-wrap{position:absolute;padding:0 5px;left:0;right:0;top:0;bottom:0}.lg-outer .lg-item.lg-complete{background-image:none}.lg-outer .lg-item.lg-current{z-index:1060}.lg-outer .lg-image{display:inline-block;vertical-align:middle;max-width:100%;max-height:100%;width:auto!important;height:auto!important}.lg-outer.lg-show-after-load .lg-item .lg-object,.lg-outer.lg-show-after-load .lg-item .lg-video-play{opacity:0;-webkit-transition:opacity .15s ease 0s;-o-transition:opacity .15s ease 0s;transition:opacity .15s ease 0s}.lg-outer.lg-show-after-load .lg-item.lg-complete .lg-object,.lg-outer.lg-show-after-load .lg-item.lg-complete .lg-video-play{opacity:1}.lg-outer .lg-empty-html,.lg-outer.lg-hide-download #lg-download{display:none}.lg-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;z-index:1040;background-color:#000;opacity:0;-webkit-transition:opacity .15s ease 0s;-o-transition:opacity .15s ease 0s;transition:opacity .15s ease 0s}.lg-backdrop.in{opacity:1}.lg-css3.lg-no-trans .lg-current,.lg-css3.lg-no-trans .lg-next-slide,.lg-css3.lg-no-trans .lg-prev-slide{-webkit-transition:none 0s ease 0s!important;-o-transition:none 0s ease 0s!important;transition:none 0s ease 0s!important}.lg-css3.lg-use-css3 .lg-item,.lg-css3.lg-use-left .lg-item{-webkit-backface-visibility:hidden;backface-visibility:hidden}.lg-css3.lg-fade .lg-item{opacity:0}.lg-css3.lg-fade .lg-item.lg-current{opacity:1}.lg-css3.lg-fade .lg-item.lg-current,.lg-css3.lg-fade .lg-item.lg-next-slide,.lg-css3.lg-fade .lg-item.lg-prev-slide{-webkit-transition:opacity .1s ease 0s;-o-transition:opacity .1s ease 0s;transition:opacity .1s ease 0s}.lg-css3.lg-slide.lg-use-css3 .lg-item{opacity:0}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current,.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide,.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide.lg-use-left .lg-item{opacity:0;position:absolute;left:0}.lg-css3.lg-slide.lg-use-left .lg-item.lg-prev-slide{left:-100%}.lg-css3.lg-slide.lg-use-left .lg-item.lg-next-slide{left:100%}.lg-css3.lg-slide.lg-use-left .lg-item.lg-current{left:0;opacity:1}.lg-css3.lg-slide.lg-use-left .lg-item.lg-current,.lg-css3.lg-slide.lg-use-left .lg-item.lg-next-slide,.lg-css3.lg-slide.lg-use-left .lg-item.lg-prev-slide{-webkit-transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s} +.lg-css3.lg-zoom-in .lg-item{opacity:0}.lg-css3.lg-zoom-in .lg-item.lg-next-slide,.lg-css3.lg-zoom-in .lg-item.lg-prev-slide{-webkit-transform:scale3d(1.3,1.3,1.3);transform:scale3d(1.3,1.3,1.3)}.lg-css3.lg-zoom-in .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-in .lg-item.lg-current,.lg-css3.lg-zoom-in .lg-item.lg-next-slide,.lg-css3.lg-zoom-in .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-zoom-in-big .lg-item{opacity:0}.lg-css3.lg-zoom-in-big .lg-item.lg-next-slide,.lg-css3.lg-zoom-in-big .lg-item.lg-prev-slide{-webkit-transform:scale3d(2,2,2);transform:scale3d(2,2,2)}.lg-css3.lg-zoom-in-big .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-in-big .lg-item.lg-current,.lg-css3.lg-zoom-in-big .lg-item.lg-next-slide,.lg-css3.lg-zoom-in-big .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-zoom-out .lg-item{opacity:0}.lg-css3.lg-zoom-out .lg-item.lg-next-slide,.lg-css3.lg-zoom-out .lg-item.lg-prev-slide{-webkit-transform:scale3d(.7,.7,.7);transform:scale3d(.7,.7,.7)}.lg-css3.lg-zoom-out .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-out .lg-item.lg-current,.lg-css3.lg-zoom-out .lg-item.lg-next-slide,.lg-css3.lg-zoom-out .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-zoom-out-big .lg-item{opacity:0}.lg-css3.lg-zoom-out-big .lg-item.lg-next-slide,.lg-css3.lg-zoom-out-big .lg-item.lg-prev-slide{-webkit-transform:scale3d(0,0,0);transform:scale3d(0,0,0)}.lg-css3.lg-zoom-out-big .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-out-big .lg-item.lg-current,.lg-css3.lg-zoom-out-big .lg-item.lg-next-slide,.lg-css3.lg-zoom-out-big .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-zoom-out-in .lg-item{opacity:0}.lg-css3.lg-zoom-out-in .lg-item.lg-prev-slide{-webkit-transform:scale3d(0,0,0);transform:scale3d(0,0,0)}.lg-css3.lg-zoom-out-in .lg-item.lg-next-slide{-webkit-transform:scale3d(2,2,2);transform:scale3d(2,2,2)}.lg-css3.lg-zoom-out-in .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-out-in .lg-item.lg-current,.lg-css3.lg-zoom-out-in .lg-item.lg-next-slide,.lg-css3.lg-zoom-out-in .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-zoom-in-out .lg-item{opacity:0}.lg-css3.lg-zoom-in-out .lg-item.lg-prev-slide{-webkit-transform:scale3d(2,2,2);transform:scale3d(2,2,2)}.lg-css3.lg-zoom-in-out .lg-item.lg-next-slide{-webkit-transform:scale3d(0,0,0);transform:scale3d(0,0,0)}.lg-css3.lg-zoom-in-out .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-in-out .lg-item.lg-current,.lg-css3.lg-zoom-in-out .lg-item.lg-next-slide,.lg-css3.lg-zoom-in-out .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-soft-zoom .lg-item{opacity:0}.lg-css3.lg-soft-zoom .lg-item.lg-prev-slide{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}.lg-css3.lg-soft-zoom .lg-item.lg-next-slide{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}.lg-css3.lg-soft-zoom .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-soft-zoom .lg-item.lg-current,.lg-css3.lg-soft-zoom .lg-item.lg-next-slide,.lg-css3.lg-soft-zoom .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-scale-up .lg-item{opacity:0}.lg-css3.lg-scale-up .lg-item.lg-next-slide,.lg-css3.lg-scale-up .lg-item.lg-prev-slide{-ms-transform:scale3d(.8,.8,.8) translate3d(0,10%,0);-webkit-transform:scale3d(.8,.8,.8) translate3d(0,10%,0);transform:scale3d(.8,.8,.8) translate3d(0,10%,0)}.lg-css3.lg-scale-up .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-scale-up .lg-item.lg-current,.lg-css3.lg-scale-up .lg-item.lg-next-slide,.lg-css3.lg-scale-up .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular .lg-item{opacity:0}.lg-css3.lg-slide-circular .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(-100%,0,0);-webkit-transform:scale3d(0,0,0) translate3d(-100%,0,0);transform:scale3d(0,0,0) translate3d(-100%,0,0)}.lg-css3.lg-slide-circular .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(100%,0,0);-webkit-transform:scale3d(0,0,0) translate3d(100%,0,0);transform:scale3d(0,0,0) translate3d(100%,0,0)}.lg-css3.lg-slide-circular .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular .lg-item.lg-current,.lg-css3.lg-slide-circular .lg-item.lg-next-slide,.lg-css3.lg-slide-circular .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular-up .lg-item{opacity:0}.lg-css3.lg-slide-circular-up .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(-100%,-100%,0);-webkit-transform:scale3d(0,0,0) translate3d(-100%,-100%,0);transform:scale3d(0,0,0) translate3d(-100%,-100%,0)}.lg-css3.lg-slide-circular-up .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(100%,-100%,0);-webkit-transform:scale3d(0,0,0) translate3d(100%,-100%,0);transform:scale3d(0,0,0) translate3d(100%,-100%,0)}.lg-css3.lg-slide-circular-up .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular-up .lg-item.lg-current,.lg-css3.lg-slide-circular-up .lg-item.lg-next-slide,.lg-css3.lg-slide-circular-up .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular-down .lg-item{opacity:0}.lg-css3.lg-slide-circular-down .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(-100%,100%,0);-webkit-transform:scale3d(0,0,0) translate3d(-100%,100%,0);transform:scale3d(0,0,0) translate3d(-100%,100%,0)}.lg-css3.lg-slide-circular-down .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(100%,100%,0);-webkit-transform:scale3d(0,0,0) translate3d(100%,100%,0);transform:scale3d(0,0,0) translate3d(100%,100%,0)}.lg-css3.lg-slide-circular-down .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular-down .lg-item.lg-current,.lg-css3.lg-slide-circular-down .lg-item.lg-next-slide,.lg-css3.lg-slide-circular-down .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular-vertical .lg-item{opacity:0}.lg-css3.lg-slide-circular-vertical .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(0,-100%,0);-webkit-transform:scale3d(0,0,0) translate3d(0,-100%,0);transform:scale3d(0,0,0) translate3d(0,-100%,0)}.lg-css3.lg-slide-circular-vertical .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(0,100%,0);-webkit-transform:scale3d(0,0,0) translate3d(0,100%,0);transform:scale3d(0,0,0) translate3d(0,100%,0)}.lg-css3.lg-slide-circular-vertical .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular-vertical .lg-item.lg-current,.lg-css3.lg-slide-circular-vertical .lg-item.lg-next-slide,.lg-css3.lg-slide-circular-vertical .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular-vertical-left .lg-item{opacity:0}.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(-100%,-100%,0);-webkit-transform:scale3d(0,0,0) translate3d(-100%,-100%,0);transform:scale3d(0,0,0) translate3d(-100%,-100%,0)}.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(-100%,100%,0);-webkit-transform:scale3d(0,0,0) translate3d(-100%,100%,0);transform:scale3d(0,0,0) translate3d(-100%,100%,0)}.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-current,.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-next-slide,.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular-vertical-down .lg-item{opacity:0}.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(100%,-100%,0);-webkit-transform:scale3d(0,0,0) translate3d(100%,-100%,0);transform:scale3d(0,0,0) translate3d(100%,-100%,0)}.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(100%,100%,0);-webkit-transform:scale3d(0,0,0) translate3d(100%,100%,0);transform:scale3d(0,0,0) translate3d(100%,100%,0)}.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-current,.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-next-slide,.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-vertical .lg-item{opacity:0}.lg-css3.lg-slide-vertical .lg-item.lg-prev-slide{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.lg-css3.lg-slide-vertical .lg-item.lg-next-slide{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.lg-css3.lg-slide-vertical .lg-item.lg-current{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-vertical .lg-item.lg-current,.lg-css3.lg-slide-vertical .lg-item.lg-next-slide,.lg-css3.lg-slide-vertical .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-vertical-growth .lg-item{opacity:0}.lg-css3.lg-slide-vertical-growth .lg-item.lg-prev-slide{-ms-transform:scale3d(.5,.5,.5) translate3d(0,-150%,0);-webkit-transform:scale3d(.5,.5,.5) translate3d(0,-150%,0);transform:scale3d(.5,.5,.5) translate3d(0,-150%,0)}.lg-css3.lg-slide-vertical-growth .lg-item.lg-next-slide{-ms-transform:scale3d(.5,.5,.5) translate3d(0,150%,0);-webkit-transform:scale3d(.5,.5,.5) translate3d(0,150%,0);transform:scale3d(.5,.5,.5) translate3d(0,150%,0)}.lg-css3.lg-slide-vertical-growth .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-vertical-growth .lg-item.lg-current,.lg-css3.lg-slide-vertical-growth .lg-item.lg-next-slide,.lg-css3.lg-slide-vertical-growth .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-only .lg-item{opacity:0}.lg-css3.lg-slide-skew-only .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only .lg-item.lg-prev-slide{-ms-transform:skew(10deg,0deg);-webkit-transform:skew(10deg,0deg);transform:skew(10deg,0deg)}.lg-css3.lg-slide-skew-only .lg-item.lg-current{-ms-transform:skew(0deg,0deg);-webkit-transform:skew(0deg,0deg);transform:skew(0deg,0deg);opacity:1}.lg-css3.lg-slide-skew-only .lg-item.lg-current,.lg-css3.lg-slide-skew-only .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-only-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-only-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-rev .lg-item.lg-prev-slide{-ms-transform:skew(-10deg,0deg);-webkit-transform:skew(-10deg,0deg);transform:skew(-10deg,0deg)}.lg-css3.lg-slide-skew-only-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg);-webkit-transform:skew(0deg,0deg);transform:skew(0deg,0deg);opacity:1}.lg-css3.lg-slide-skew-only-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-only-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-only-y .lg-item{opacity:0}.lg-css3.lg-slide-skew-only-y .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-y .lg-item.lg-prev-slide{-ms-transform:skew(0deg,10deg);-webkit-transform:skew(0deg,10deg);transform:skew(0deg,10deg)}.lg-css3.lg-slide-skew-only-y .lg-item.lg-current{-ms-transform:skew(0deg,0deg);-webkit-transform:skew(0deg,0deg);transform:skew(0deg,0deg);opacity:1}.lg-css3.lg-slide-skew-only-y .lg-item.lg-current,.lg-css3.lg-slide-skew-only-y .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-y .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-only-y-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-prev-slide{-ms-transform:skew(0deg,-10deg);-webkit-transform:skew(0deg,-10deg);transform:skew(0deg,-10deg)}.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg);-webkit-transform:skew(0deg,0deg);transform:skew(0deg,0deg);opacity:1}.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew .lg-item{opacity:0}.lg-css3.lg-slide-skew .lg-item.lg-prev-slide{-ms-transform:skew(20deg,0deg) translate3d(-100%,0,0);-webkit-transform:skew(20deg,0deg) translate3d(-100%,0,0);transform:skew(20deg,0deg) translate3d(-100%,0,0)}.lg-css3.lg-slide-skew .lg-item.lg-next-slide{-ms-transform:skew(20deg,0deg) translate3d(100%,0,0);-webkit-transform:skew(20deg,0deg) translate3d(100%,0,0);transform:skew(20deg,0deg) translate3d(100%,0,0)}.lg-css3.lg-slide-skew .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew .lg-item.lg-current,.lg-css3.lg-slide-skew .lg-item.lg-next-slide,.lg-css3.lg-slide-skew .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-rev .lg-item.lg-prev-slide{-ms-transform:skew(-20deg,0deg) translate3d(-100%,0,0);-webkit-transform:skew(-20deg,0deg) translate3d(-100%,0,0);transform:skew(-20deg,0deg) translate3d(-100%,0,0)}.lg-css3.lg-slide-skew-rev .lg-item.lg-next-slide{-ms-transform:skew(-20deg,0deg) translate3d(100%,0,0);-webkit-transform:skew(-20deg,0deg) translate3d(100%,0,0);transform:skew(-20deg,0deg) translate3d(100%,0,0)}.lg-css3.lg-slide-skew-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-cross .lg-item{opacity:0}.lg-css3.lg-slide-skew-cross .lg-item.lg-prev-slide{-ms-transform:skew(0deg,60deg) translate3d(-100%,0,0);-webkit-transform:skew(0deg,60deg) translate3d(-100%,0,0);transform:skew(0deg,60deg) translate3d(-100%,0,0)}.lg-css3.lg-slide-skew-cross .lg-item.lg-next-slide{-ms-transform:skew(0deg,60deg) translate3d(100%,0,0);-webkit-transform:skew(0deg,60deg) translate3d(100%,0,0);transform:skew(0deg,60deg) translate3d(100%,0,0)}.lg-css3.lg-slide-skew-cross .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-cross .lg-item.lg-current,.lg-css3.lg-slide-skew-cross .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-cross .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-cross-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-prev-slide{-ms-transform:skew(0deg,-60deg) translate3d(-100%,0,0);-webkit-transform:skew(0deg,-60deg) translate3d(-100%,0,0);transform:skew(0deg,-60deg) translate3d(-100%,0,0)}.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-next-slide{-ms-transform:skew(0deg,-60deg) translate3d(100%,0,0);-webkit-transform:skew(0deg,-60deg) translate3d(100%,0,0);transform:skew(0deg,-60deg) translate3d(100%,0,0)}.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-ver .lg-item{opacity:0}.lg-css3.lg-slide-skew-ver .lg-item.lg-prev-slide{-ms-transform:skew(60deg,0deg) translate3d(0,-100%,0);-webkit-transform:skew(60deg,0deg) translate3d(0,-100%,0);transform:skew(60deg,0deg) translate3d(0,-100%,0)}.lg-css3.lg-slide-skew-ver .lg-item.lg-next-slide{-ms-transform:skew(60deg,0deg) translate3d(0,100%,0);-webkit-transform:skew(60deg,0deg) translate3d(0,100%,0);transform:skew(60deg,0deg) translate3d(0,100%,0)}.lg-css3.lg-slide-skew-ver .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-ver .lg-item.lg-current,.lg-css3.lg-slide-skew-ver .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-ver .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-ver-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-prev-slide{-ms-transform:skew(-60deg,0deg) translate3d(0,-100%,0);-webkit-transform:skew(-60deg,0deg) translate3d(0,-100%,0);transform:skew(-60deg,0deg) translate3d(0,-100%,0)}.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-next-slide{-ms-transform:skew(-60deg,0deg) translate3d(0,100%,0);-webkit-transform:skew(-60deg,0deg) translate3d(0,100%,0);transform:skew(-60deg,0deg) translate3d(0,100%,0)}.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-ver-cross .lg-item{opacity:0}.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-prev-slide{-ms-transform:skew(0deg,20deg) translate3d(0,-100%,0);-webkit-transform:skew(0deg,20deg) translate3d(0,-100%,0);transform:skew(0deg,20deg) translate3d(0,-100%,0)}.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-next-slide{-ms-transform:skew(0deg,20deg) translate3d(0,100%,0);-webkit-transform:skew(0deg,20deg) translate3d(0,100%,0);transform:skew(0deg,20deg) translate3d(0,100%,0)}.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-current,.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-ver-cross-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-prev-slide{-ms-transform:skew(0deg,-20deg) translate3d(0,-100%,0);-webkit-transform:skew(0deg,-20deg) translate3d(0,-100%,0);transform:skew(0deg,-20deg) translate3d(0,-100%,0)}.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-next-slide{-ms-transform:skew(0deg,-20deg) translate3d(0,100%,0);-webkit-transform:skew(0deg,-20deg) translate3d(0,100%,0);transform:skew(0deg,-20deg) translate3d(0,100%,0)}.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-lollipop .lg-item{opacity:0}.lg-css3.lg-lollipop .lg-item.lg-prev-slide{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.lg-css3.lg-lollipop .lg-item.lg-next-slide{-ms-transform:translate3d(0,0,0) scale(.5);-webkit-transform:translate3d(0,0,0) scale(.5);transform:translate3d(0,0,0) scale(.5)}.lg-css3.lg-lollipop .lg-item.lg-current{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.lg-css3.lg-lollipop .lg-item.lg-current,.lg-css3.lg-lollipop .lg-item.lg-next-slide,.lg-css3.lg-lollipop .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-lollipop-rev .lg-item{opacity:0}.lg-css3.lg-lollipop-rev .lg-item.lg-prev-slide{-ms-transform:translate3d(0,0,0) scale(.5);-webkit-transform:translate3d(0,0,0) scale(.5);transform:translate3d(0,0,0) scale(.5)}.lg-css3.lg-lollipop-rev .lg-item.lg-next-slide{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.lg-css3.lg-lollipop-rev .lg-item.lg-current{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.lg-css3.lg-lollipop-rev .lg-item.lg-current,.lg-css3.lg-lollipop-rev .lg-item.lg-next-slide,.lg-css3.lg-lollipop-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-rotate .lg-item{opacity:0}.lg-css3.lg-rotate .lg-item.lg-prev-slide{-ms-transform:rotate(-360deg);-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}.lg-css3.lg-rotate .lg-item.lg-next-slide{-ms-transform:rotate(360deg);-webkit-transform:rotate(360deg);transform:rotate(360deg)}.lg-css3.lg-rotate .lg-item.lg-current{-ms-transform:rotate(0);-webkit-transform:rotate(0);transform:rotate(0);opacity:1}.lg-css3.lg-rotate .lg-item.lg-current,.lg-css3.lg-rotate .lg-item.lg-next-slide,.lg-css3.lg-rotate .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-rotate-rev .lg-item{opacity:0}.lg-css3.lg-rotate-rev .lg-item.lg-prev-slide{-ms-transform:rotate(360deg);-webkit-transform:rotate(360deg);transform:rotate(360deg)}.lg-css3.lg-rotate-rev .lg-item.lg-next-slide{-ms-transform:rotate(-360deg);-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}.lg-css3.lg-rotate-rev .lg-item.lg-current{-ms-transform:rotate(0);-webkit-transform:rotate(0);transform:rotate(0);opacity:1}.lg-css3.lg-rotate-rev .lg-item.lg-current,.lg-css3.lg-rotate-rev .lg-item.lg-next-slide,.lg-css3.lg-rotate-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-tube .lg-item{opacity:0}.lg-css3.lg-tube .lg-item.lg-prev-slide{-ms-transform:scale3d(1,0,1) translate3d(-100%,0,0);-webkit-transform:scale3d(1,0,1) translate3d(-100%,0,0);transform:scale3d(1,0,1) translate3d(-100%,0,0)}.lg-css3.lg-tube .lg-item.lg-next-slide{-ms-transform:scale3d(1,0,1) translate3d(100%,0,0);-webkit-transform:scale3d(1,0,1) translate3d(100%,0,0);transform:scale3d(1,0,1) translate3d(100%,0,0)}.lg-css3.lg-tube .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-tube .lg-item.lg-current,.lg-css3.lg-tube .lg-item.lg-next-slide,.lg-css3.lg-tube .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s} +.progressjs-inner{width:0}.progressjs-progress{z-index:9999999}.progressjs-theme-blue .progressjs-inner{height:2px;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db}.progressjs-theme-blue.progressjs-end{-webkit-transition:opacity .2s ease-out;-o-transition:opacity .2s ease-out;transition:opacity .2s ease-out;opacity:0}.progressjs-theme-blue .progressjs-percent{display:none}.progressjs-theme-blueOverlay{background-color:white;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.progressjs-theme-blueOverlay .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db}.progressjs-theme-blueOverlay.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlay .progressjs-percent{display:none}.progressjs-theme-blueOverlay{background-color:white;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.progressjs-theme-blueOverlay .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db}.progressjs-theme-blueOverlay.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlay .progressjs-percent{display:none}.progressjs-theme-blueOverlayRadius{background-color:white;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out;border-radius:5px}.progressjs-theme-blueOverlayRadius .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db;border-radius:5px}.progressjs-theme-blueOverlayRadius.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlayRadius .progressjs-percent{display:none}.progressjs-theme-blueOverlayRadiusHalfOpacity{background-color:white;opacity:.5;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out;border-radius:5px}.progressjs-theme-blueOverlayRadiusHalfOpacity .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db;border-radius:5px}.progressjs-theme-blueOverlayRadiusHalfOpacity.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlayRadiusHalfOpacity .progressjs-percent{display:none}.progressjs-theme-blueOverlayRadiusWithPercentBar{background-color:white;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out;border-radius:5px}.progressjs-theme-blueOverlayRadiusWithPercentBar .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db;border-radius:5px}.progressjs-theme-blueOverlayRadiusWithPercentBar.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlayRadiusWithPercentBar .progressjs-percent{width:70px;text-align:center;height:40px;position:absolute;right:50%;margin-right:-35px;top:50%;margin-top:-20px;font-size:30px;opacity:.5}.progressjs-theme-blackRadiusInputs{height:10px;border-radius:10px;overflow:hidden}.progressjs-theme-blackRadiusInputs .progressjs-inner{height:2px;-webkit-transition:all 1s ease-out;-o-transition:all 1s ease-out;transition:all 1s ease-out;background-color:#34495e}.progressjs-theme-blackRadiusInputs.progressjs-end{-webkit-transition:opacity .2s ease-out;-o-transition:opacity .2s ease-out;transition:opacity .2s ease-out;opacity:0}.progressjs-theme-blackRadiusInputs .progressjs-percent{display:none} + +.progressjs-theme-rainloop { + z-index: 2000; +} + +.progressjs-theme-rainloop .progressjs-inner { + + background-color: #939595; + position: relative; + z-index: 2000; + height: 3px; + overflow: hidden; + + -webkit-transition: width .5s; + -o-transition: width .5s; + transition: width .5s; +} + +.progressjs-theme-rainloop .progressjs-percent { + position: absolute; + top: 0; + left: 0; + right: -32px; + bottom: 0; + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.3) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.3) 50%, rgba(255, 255, 255, 0.3) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.3) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.3) 50%, rgba(255, 255, 255, 0.3) 75%, transparent 75%, transparent); + background-size: 32px 32px; + + -webkit-animation: simple-pace-stripe-animation 500ms linear infinite; + animation: simple-pace-stripe-animation 500ms linear infinite; +} + +@-webkit-keyframes simple-pace-stripe-animation { + 0% { -webkit-transform: none; transform: none; } + 100% { -webkit-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@keyframes simple-pace-stripe-animation { + 0% { -webkit-transform: none; transform: none; transform: none; } + 100% { -webkit-transform: translate(-32px, 0); transform: translate(-32px, 0); transform: translate(-32px, 0); } +} + +.clearfix { + *zoom: 1; +} +.clearfix:before, +.clearfix:after { + display: table; + content: ""; + line-height: 0; +} +.clearfix:after { + clear: both; +} +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 20px; + color: #333; + background-color: #fff; +} +a { + color: #08c; + text-decoration: none; +} +a:hover { + color: #005580; + text-decoration: underline; +} +.img-rounded { + border-radius: 6px; +} +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +.img-circle { + border-radius: 500px; +} +.row { + margin-left: -20px; + *zoom: 1; +} +.row:before, +.row:after { + display: table; + content: ""; + line-height: 0; +} +.row:after { + clear: both; +} +[class*="span"] { + float: left; + margin-left: 20px; +} +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} +.span12 { + width: 940px; +} +.span11 { + width: 860px; +} +.span10 { + width: 780px; +} +.span9 { + width: 700px; +} +.span8 { + width: 620px; +} +.span7 { + width: 540px; +} +.span6 { + width: 460px; +} +.span5 { + width: 380px; +} +.span4 { + width: 300px; +} +.span3 { + width: 220px; +} +.span2 { + width: 140px; +} +.span1 { + width: 60px; +} +.offset12 { + margin-left: 980px; +} +.offset11 { + margin-left: 900px; +} +.offset10 { + margin-left: 820px; +} +.offset9 { + margin-left: 740px; +} +.offset8 { + margin-left: 660px; +} +.offset7 { + margin-left: 580px; +} +.offset6 { + margin-left: 500px; +} +.offset5 { + margin-left: 420px; +} +.offset4 { + margin-left: 340px; +} +.offset3 { + margin-left: 260px; +} +.offset2 { + margin-left: 180px; +} +.offset1 { + margin-left: 100px; +} +.row-fluid { + width: 100%; + *zoom: 1; +} +.row-fluid:before, +.row-fluid:after { + display: table; + content: ""; + line-height: 0; +} +.row-fluid:after { + clear: both; +} +.row-fluid [class*="span"] { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + float: left; + margin-left: 2.12765957%; + *margin-left: 2.07446809%; +} +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} +.row-fluid .span12 { + width: 100%; + *width: 99.94680851%; +} +.row-fluid .span11 { + width: 91.4893617%; + *width: 91.43617021%; +} +.row-fluid .span10 { + width: 82.9787234%; + *width: 82.92553191%; +} +.row-fluid .span9 { + width: 74.46808511%; + *width: 74.41489362%; +} +.row-fluid .span8 { + width: 65.95744681%; + *width: 65.90425532%; +} +.row-fluid .span7 { + width: 57.44680851%; + *width: 57.39361702%; +} +.row-fluid .span6 { + width: 48.93617021%; + *width: 48.88297872%; +} +.row-fluid .span5 { + width: 40.42553191%; + *width: 40.37234043%; +} +.row-fluid .span4 { + width: 31.91489362%; + *width: 31.86170213%; +} +.row-fluid .span3 { + width: 23.40425532%; + *width: 23.35106383%; +} +.row-fluid .span2 { + width: 14.89361702%; + *width: 14.84042553%; +} +.row-fluid .span1 { + width: 6.38297872%; + *width: 6.32978723%; +} +.row-fluid .offset12 { + margin-left: 104.25531915%; + *margin-left: 104.14893617%; +} +.row-fluid .offset12:first-child { + margin-left: 102.12765957%; + *margin-left: 102.0212766%; +} +.row-fluid .offset11 { + margin-left: 95.74468085%; + *margin-left: 95.63829787%; +} +.row-fluid .offset11:first-child { + margin-left: 93.61702128%; + *margin-left: 93.5106383%; +} +.row-fluid .offset10 { + margin-left: 87.23404255%; + *margin-left: 87.12765957%; +} +.row-fluid .offset10:first-child { + margin-left: 85.10638298%; + *margin-left: 85%; +} +.row-fluid .offset9 { + margin-left: 78.72340426%; + *margin-left: 78.61702128%; +} +.row-fluid .offset9:first-child { + margin-left: 76.59574468%; + *margin-left: 76.4893617%; +} +.row-fluid .offset8 { + margin-left: 70.21276596%; + *margin-left: 70.10638298%; +} +.row-fluid .offset8:first-child { + margin-left: 68.08510638%; + *margin-left: 67.9787234%; +} +.row-fluid .offset7 { + margin-left: 61.70212766%; + *margin-left: 61.59574468%; +} +.row-fluid .offset7:first-child { + margin-left: 59.57446809%; + *margin-left: 59.46808511%; +} +.row-fluid .offset6 { + margin-left: 53.19148936%; + *margin-left: 53.08510638%; +} +.row-fluid .offset6:first-child { + margin-left: 51.06382979%; + *margin-left: 50.95744681%; +} +.row-fluid .offset5 { + margin-left: 44.68085106%; + *margin-left: 44.57446809%; +} +.row-fluid .offset5:first-child { + margin-left: 42.55319149%; + *margin-left: 42.44680851%; +} +.row-fluid .offset4 { + margin-left: 36.17021277%; + *margin-left: 36.06382979%; +} +.row-fluid .offset4:first-child { + margin-left: 34.04255319%; + *margin-left: 33.93617021%; +} +.row-fluid .offset3 { + margin-left: 27.65957447%; + *margin-left: 27.55319149%; +} +.row-fluid .offset3:first-child { + margin-left: 25.53191489%; + *margin-left: 25.42553191%; +} +.row-fluid .offset2 { + margin-left: 19.14893617%; + *margin-left: 19.04255319%; +} +.row-fluid .offset2:first-child { + margin-left: 17.0212766%; + *margin-left: 16.91489362%; +} +.row-fluid .offset1 { + margin-left: 10.63829787%; + *margin-left: 10.53191489%; +} +.row-fluid .offset1:first-child { + margin-left: 8.5106383%; + *margin-left: 8.40425532%; +} +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} +.container:before, +.container:after { + display: table; + content: ""; + line-height: 0; +} +.container:after { + clear: both; +} +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} +.container-fluid:before, +.container-fluid:after { + display: table; + content: ""; + line-height: 0; +} +.container-fluid:after { + clear: both; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 20px; + font-weight: 200; + line-height: 30px; +} +small { + font-size: 85%; +} +strong { + font-weight: bold; +} +em { + font-style: italic; +} +cite { + font-style: normal; +} +.muted { + color: #999; +} +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: inherit; + font-weight: bold; + line-height: 1; + color: inherit; + text-rendering: optimizelegibility; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + line-height: 1; + color: #999; +} +h1 { + font-size: 36px; + line-height: 40px; +} +h2 { + font-size: 30px; + line-height: 40px; +} +h3 { + font-size: 24px; + line-height: 40px; +} +h4 { + font-size: 18px; + line-height: 20px; +} +h5 { + font-size: 14px; + line-height: 20px; +} +h6 { + font-size: 12px; + line-height: 20px; +} +h1 small { + font-size: 24px; +} +h2 small { + font-size: 18px; +} +h3 small { + font-size: 14px; +} +h4 small { + font-size: 14px; +} +.page-header { + padding-bottom: 9px; + margin: 20px 0 30px; + border-bottom: 1px solid #eee; +} +ul, +ol { + padding: 0; + margin: 0 0 10px 25px; +} +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} +li { + line-height: 20px; +} +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} +dl { + margin-bottom: 20px; +} +dt, +dd { + line-height: 20px; +} +dt { + font-weight: bold; +} +dd { + margin-left: 10px; +} +.dl-horizontal dt { + float: left; + width: 120px; + clear: left; + text-align: right; + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; +} +.dl-horizontal dd { + margin-left: 130px; +} +hr { + margin: 20px 0; + border: 0; + border-top: 1px solid #eee; + border-bottom: 1px solid #fff; +} +abbr[title] { + cursor: help; + border-bottom: 1px dotted #999; +} +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 0 0 0 15px; + margin: 0 0 20px; + border-left: 5px solid #eee; +} +blockquote p { + margin-bottom: 0; + font-size: 16px; + font-weight: 300; + line-height: 25px; +} +blockquote small { + display: block; + line-height: 20px; + color: #999; +} +blockquote small:before { + content: '\2014 \00A0'; +} +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eee; + border-left: 0; +} +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} +blockquote.pull-right small:before { + content: ''; +} +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 20px; +} +code, +pre { + padding: 0 3px 2px; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333; + border-radius: 3px; +} +code { + padding: 2px 4px; + color: #d14; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; +} +pre.prettyprint { + margin-bottom: 20px; +} +pre code { + padding: 0; + color: inherit; + background-color: transparent; + border: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +form { + margin: 0 0 20px; +} +fieldset { + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +legend small { + font-size: 15px; + color: #999; +} +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px; +} +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} +label { + display: block; + margin-bottom: 5px; +} +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 9px; + font-size: 14px; + line-height: 20px; + color: #555; + border-radius: 3px; +} +input, +textarea { + width: 210px; +} +textarea { + height: auto; +} +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #fff; + border: 1px solid #ccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear .2s, box-shadow linear .2s; + -o-transition: border linear .2s, box-shadow linear .2s; + -webkit-transition: border linear .2s, -webkit-box-shadow linear .2s; + transition: border linear .2s, -webkit-box-shadow linear .2s; + transition: border linear .2s, box-shadow linear .2s; + transition: border linear .2s, box-shadow linear .2s, -webkit-box-shadow linear .2s; +} +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + *margin-top: 0; + /* IE7 */ + margin-top: 1px \9; + /* IE8-9 */ + line-height: normal; + cursor: pointer; +} +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} +select, +input[type="file"] { + height: 30px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + line-height: 30px; +} +select { + width: 220px; + border: 1px solid #bbb; + background-color: #fff; +} +select[multiple], +select[size] { + height: auto; +} +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.uneditable-input, +.uneditable-textarea { + color: #999; + background-color: #fcfcfc; + border-color: #ccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + cursor: not-allowed; +} +.uneditable-input { + overflow: hidden; + white-space: nowrap; +} +.uneditable-textarea { + width: auto; + height: auto; +} +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999; +} +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999; +} +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999; +} +.radio, +.checkbox { + min-height: 18px; + padding-left: 18px; +} +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -18px; +} +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} +.input-mini { + width: 60px; +} +.input-small { + width: 90px; +} +.input-medium { + width: 150px; +} +.input-large { + width: 210px; +} +.input-xlarge { + width: 270px; +} +.input-xxlarge { + width: 530px; +} +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} +input, +textarea, +.uneditable-input { + margin-left: 0; +} +.controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; +} +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 926px; +} +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 846px; +} +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 766px; +} +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 686px; +} +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 606px; +} +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 526px; +} +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 446px; +} +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 366px; +} +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 286px; +} +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 206px; +} +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 126px; +} +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 46px; +} +.controls-row { + *zoom: 1; +} +.controls-row:before, +.controls-row:after { + display: table; + content: ""; + line-height: 0; +} +.controls-row:after { + clear: both; +} +.controls-row [class*="span"] { + float: left; +} +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eee; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} +.control-group.warning > label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.control-group.warning .checkbox:focus, +.control-group.warning .radio:focus, +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +} +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} +.control-group.error > label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.control-group.error .checkbox:focus, +.control-group.error .radio:focus, +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +} +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} +.control-group.success > label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.control-group.success .checkbox:focus, +.control-group.success .radio:focus, +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +} +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} +input:focus:required:invalid, +textarea:focus:required:invalid, +select:focus:required:invalid { + color: #b94a48; + border-color: #ee5f5b; +} +input:focus:required:invalid:focus, +textarea:focus:required:invalid:focus, +select:focus:required:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} +.form-actions:before, +.form-actions:after { + display: table; + content: ""; + line-height: 0; +} +.form-actions:after { + clear: both; +} +.help-block, +.help-inline { + color: #595959; +} +.help-block { + display: block; + margin-bottom: 10px; +} +.help-inline { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + *zoom: 1; + vertical-align: middle; + padding-left: 5px; +} +.input-append, +.input-prepend { + margin-bottom: 5px; + font-size: 0; + white-space: nowrap; +} +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + font-size: 14px; + vertical-align: top; + border-radius: 0 3px 3px 0; +} +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2; +} +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #fff; + background-color: #eee; + border: 1px solid #ccc; +} +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn { + margin-left: -1px; + vertical-align: top; + border-radius: 0; +} +.input-append .active, +.input-prepend .active { + background-color: #a9dba9; + border-color: #46a546; +} +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + border-radius: 3px 0 0 3px; +} +.input-append input, +.input-append select, +.input-append .uneditable-input { + border-radius: 3px 0 0 3px; +} +.input-append .add-on:last-child, +.input-append .btn:last-child { + border-radius: 0 3px 3px 0; +} +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + border-radius: 0; +} +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + border-radius: 3px 0 0 3px; +} +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + border-radius: 0 3px 3px 0; +} +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + margin-bottom: 0; + border-radius: 15px; +} +/* Allow for input prepend/append in search forms */ +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + border-radius: 0; +} +.form-search .input-append .search-query { + border-radius: 14px 0 0 14px; +} +.form-search .input-append .btn { + border-radius: 0 14px 14px 0; +} +.form-search .input-prepend .search-query { + border-radius: 0 14px 14px 0; +} +.form-search .input-prepend .btn { + border-radius: 14px 0 0 14px; +} +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + *zoom: 1; + margin-bottom: 0; + vertical-align: middle; +} +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} +.control-group { + margin-bottom: 10px; +} +legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1; +} +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + content: ""; + line-height: 0; +} +.form-horizontal .control-group:after { + clear: both; +} +.form-horizontal .control-label { + float: left; + width: 140px; + padding-top: 5px; + text-align: right; +} +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 160px; + *margin-left: 0; +} +.form-horizontal .controls:first-child { + *padding-left: 160px; +} +.form-horizontal .help-block { + margin-top: 10px; + margin-bottom: 0; +} +.form-horizontal .form-actions { + padding-left: 160px; +} +.table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} +.table { + width: 100%; + margin-bottom: 20px; +} +.table th, +.table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table th { + font-weight: bold; +} +.table thead th { + vertical-align: bottom; +} +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} +.table tbody + tbody { + border-top: 2px solid #ddd; +} +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} +.table-bordered { + border: 1px solid #ddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + border-radius: 4px; +} +.table-bordered th, +.table-bordered td { + border-left: 1px solid #ddd; +} +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} +.table-bordered thead:first-child tr:first-child th:first-child, +.table-bordered tbody:first-child tr:first-child td:first-child { + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} +.table-bordered thead:first-child tr:first-child th:last-child, +.table-bordered tbody:first-child tr:first-child td:last-child { + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} +.table-bordered thead:last-child tr:last-child th:first-child, +.table-bordered tbody:last-child tr:last-child td:first-child, +.table-bordered tfoot:last-child tr:last-child td:first-child { + border-radius: 0 0 0 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} +.table-bordered thead:last-child tr:last-child th:last-child, +.table-bordered tbody:last-child tr:last-child td:last-child, +.table-bordered tfoot:last-child tr:last-child td:last-child { + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} +.table-bordered caption + thead tr:first-child th:first-child, +.table-bordered caption + tbody tr:first-child td:first-child, +.table-bordered colgroup + thead tr:first-child th:first-child, +.table-bordered colgroup + tbody tr:first-child td:first-child { + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} +.table-bordered caption + thead tr:first-child th:last-child, +.table-bordered caption + tbody tr:first-child td:last-child, +.table-bordered colgroup + thead tr:first-child th:last-child, +.table-bordered colgroup + tbody tr:first-child td:last-child { + border-top-right-radius: 4px; + -moz-border-right-topleft: 4px; +} +.table-striped tbody tr:nth-child(odd) td, +.table-striped tbody tr:nth-child(odd) th { + background-color: #f9f9f9; +} +.table-hover tbody tr:hover td, +.table-hover tbody tr:hover th { + background-color: #f5f5f5; +} +table [class*=span], +.row-fluid table [class*=span] { + display: table-cell; + float: none; + margin-left: 0; +} +table .span1 { + float: none; + width: 44px; + margin-left: 0; +} +table .span2 { + float: none; + width: 124px; + margin-left: 0; +} +table .span3 { + float: none; + width: 204px; + margin-left: 0; +} +table .span4 { + float: none; + width: 284px; + margin-left: 0; +} +table .span5 { + float: none; + width: 364px; + margin-left: 0; +} +table .span6 { + float: none; + width: 444px; + margin-left: 0; +} +table .span7 { + float: none; + width: 524px; + margin-left: 0; +} +table .span8 { + float: none; + width: 604px; + margin-left: 0; +} +table .span9 { + float: none; + width: 684px; + margin-left: 0; +} +table .span10 { + float: none; + width: 764px; + margin-left: 0; +} +table .span11 { + float: none; + width: 844px; + margin-left: 0; +} +table .span12 { + float: none; + width: 924px; + margin-left: 0; +} +table .span13 { + float: none; + width: 1004px; + margin-left: 0; +} +table .span14 { + float: none; + width: 1084px; + margin-left: 0; +} +table .span15 { + float: none; + width: 1164px; + margin-left: 0; +} +table .span16 { + float: none; + width: 1244px; + margin-left: 0; +} +table .span17 { + float: none; + width: 1324px; + margin-left: 0; +} +table .span18 { + float: none; + width: 1404px; + margin-left: 0; +} +table .span19 { + float: none; + width: 1484px; + margin-left: 0; +} +table .span20 { + float: none; + width: 1564px; + margin-left: 0; +} +table .span21 { + float: none; + width: 1644px; + margin-left: 0; +} +table .span22 { + float: none; + width: 1724px; + margin-left: 0; +} +table .span23 { + float: none; + width: 1804px; + margin-left: 0; +} +table .span24 { + float: none; + width: 1884px; + margin-left: 0; +} +.table tbody tr.success td { + background-color: #dff0d8; +} +.table tbody tr.error td { + background-color: #f2dede; +} +.table tbody tr.info td { + background-color: #d9edf7; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle { + *margin-bottom: -3px; +} +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #fff; +} +.dropdown-menu a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333; + white-space: nowrap; +} +.dropdown-menu li > a:hover, +.dropdown-menu li > a:focus, +.dropdown-submenu:hover > a { + text-decoration: none; + color: #fff; + background-color: #08c; + background-color: #0081c2; + background-image: -o-linear-gradient(top, #08c, #0077b3); + background-image: -webkit-gradient(linear, left top, left bottom, from(#08c), to(#0077b3)); + background-image: linear-gradient(to bottom, #08c, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} +.dropdown-menu .active > a, +.dropdown-menu .active > a:hover { + color: #fff; + text-decoration: none; + outline: 0; + background-color: #08c; + background-color: #0081c2; + background-image: -o-linear-gradient(top, #08c, #0077b3); + background-image: -webkit-gradient(linear, left top, left bottom, from(#08c), to(#0077b3)); + background-image: linear-gradient(to bottom, #08c, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} +.dropdown-menu .disabled > a, +.dropdown-menu .disabled > a:hover { + color: #999; +} +.dropdown-menu .disabled > a:hover { + text-decoration: none; + background-color: transparent; + cursor: default; +} +.open { + *z-index: 1000; +} +.open > .dropdown-menu { + display: block; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000; + content: "\2191"; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} +.dropdown-submenu { + position: relative; +} +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + border-radius: 0 6px 6px 6px; +} +.dropdown-submenu:hover .dropdown-menu { + display: block; +} +.dropdown-submenu > a:after { + display: block; + content: " "; + float: right; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 5px 0 5px 5px; + border-left-color: #cccccc; + margin-top: 5px; + margin-right: -10px; +} +.dropdown-submenu:hover > a:after { + border-left-color: #fff; +} +.dropdown .dropdown-menu .nav-header { + padding-left: 20px; + padding-right: 20px; +} +.typeahead { + margin-top: 2px; + border-radius: 4px; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.well-large { + padding: 24px; + border-radius: 6px; +} +.well-small { + padding: 9px; + border-radius: 3px; +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + position: relative; + height: 0; + overflow: hidden; + overflow: visible \9; + -webkit-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} +.collapse.in { + height: auto; +} +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover { + color: #000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.btn { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + *zoom: 1; + padding: 4px 14px; + margin-bottom: 0; + font-size: 14px; + line-height: 20px; + *line-height: 20px; + text-align: center; + vertical-align: middle; + cursor: pointer; + color: #333; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + background-color: #f5f5f5; + background-image: -o-linear-gradient(top, #fff, #e6e6e6); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e6e6e6)); + background-image: linear-gradient(to bottom, #fff, #e6e6e6); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #e6e6e6; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + border: 1px solid #bbb; + *border: 0; + border-bottom-color: #a2a2a2; + border-radius: 4px; + *margin-left: .3em; + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); +} +.btn:hover, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333; + background-color: #e6e6e6; + *background-color: #d9d9d9; +} +.btn:active, +.btn.active { + background-color: #cccccc \9; +} +.btn:first-child { + *margin-left: 0; +} +.btn:hover { + color: #333; + text-decoration: none; + background-color: #e6e6e6; + *background-color: #d9d9d9; + /* Buttons in IE7 don't get borders, so darken on hover */ + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn.active, +.btn:active { + background-color: #e6e6e6; + background-color: #d9d9d9 \9; + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); +} +.btn.disabled, +.btn[disabled] { + cursor: default; + background-color: #e6e6e6; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-large { + padding: 9px 14px; + font-size: 16px; + line-height: normal; + border-radius: 5px; +} +.btn-large [class^="icon-"] { + margin-top: 2px; +} +.btn-small { + padding: 3px 9px; + font-size: 12px; + line-height: 18px; +} +.btn-small [class^="icon-"] { + margin-top: 0; +} +.btn-mini { + padding: 2px 6px; + font-size: 11px; + line-height: 16px; +} +.btn-block { + display: block; + width: 100%; + padding-left: 0; + padding-right: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.btn-block + .btn-block { + margin-top: 5px; +} +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} +.btn { + border-color: #c5c5c5; + border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25); +} +.btn-primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #006dcc; + background-image: -o-linear-gradient(top, #08c, #0044cc); + background-image: -webkit-gradient(linear, left top, left bottom, from(#08c), to(#0044cc)); + background-image: linear-gradient(to bottom, #08c, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #0044cc; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-primary:hover, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #fff; + background-color: #0044cc; + *background-color: #003bb3; +} +.btn-primary:active, +.btn-primary.active { + background-color: #003399 \9; +} +.btn-warning { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #faa732; + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fbb450), to(#f89406)); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #f89406; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-warning:hover, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #fff; + background-color: #f89406; + *background-color: #df8505; +} +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} +.btn-danger { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #da4f49; + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ee5f5b), to(#bd362f)); + background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #bd362f; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-danger:hover, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #fff; + background-color: #bd362f; + *background-color: #a9302a; +} +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} +.btn-success { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #5bb75b; + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, left top, left bottom, from(#62c462), to(#51a351)); + background-image: linear-gradient(to bottom, #62c462, #51a351); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #51a351; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #fff; + background-color: #51a351; + *background-color: #499249; +} +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} +.btn-info { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #49afcd; + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2f96b4)); + background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #2f96b4; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-info:hover, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #fff; + background-color: #2f96b4; + *background-color: #2a85a0; +} +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} +.btn-inverse { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #363636; + background-image: -o-linear-gradient(top, #444, #222); + background-image: -webkit-gradient(linear, left top, left bottom, from(#444), to(#222)); + background-image: linear-gradient(to bottom, #444, #222); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); + border-color: #222 #222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #222; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-inverse:hover, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #fff; + background-color: #222; + *background-color: #151515; +} +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px; +} +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} +.btn-link, +.btn-link:active { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link { + border-color: transparent; + cursor: pointer; + color: #08c; + border-radius: 0; +} +.btn-link:hover { + color: #005580; + text-decoration: underline; + background-color: transparent; +} +.btn-group { + position: relative; + font-size: 0; + white-space: nowrap; + *margin-left: .3em; +} +.btn-group:first-child { + *margin-left: 0; +} +.btn-group + .btn-group { + margin-left: 5px; +} +.btn-toolbar { + font-size: 0; + margin-top: 10px; + margin-bottom: 10px; +} +.btn-toolbar .btn-group { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + *zoom: 1; +} +.btn-toolbar .btn + .btn, +.btn-toolbar .btn-group + .btn, +.btn-toolbar .btn + .btn-group { + margin-left: 5px; +} +.btn-group > .btn { + position: relative; + border-radius: 0; +} +.btn-group > .btn + .btn { + margin-left: -1px; +} +.btn-group > .btn, +.btn-group > .dropdown-menu { + font-size: 14px; +} +.btn-group > .btn-mini { + font-size: 11px; +} +.btn-group > .btn-small { + font-size: 12px; +} +.btn-group > .btn-large { + font-size: 16px; +} +.btn-group > .btn:first-child { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.btn-group > .btn.large:first-child { + margin-left: 0; + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + *padding-top: 5px; + *padding-bottom: 5px; +} +.btn-group > .btn-mini + .dropdown-toggle { + padding-left: 5px; + padding-right: 5px; + *padding-top: 2px; + *padding-bottom: 2px; +} +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} +.btn-group > .btn-large + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; + *padding-top: 7px; + *padding-bottom: 7px; +} +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); +} +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0044cc; +} +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222; +} +.btn .caret { + margin-top: 8px; + margin-left: 0; +} +.btn-mini .caret, +.btn-small .caret, +.btn-large .caret { + margin-top: 6px; +} +.btn-large .caret { + border-left-width: 5px; + border-right-width: 5px; + border-top-width: 5px; +} +.dropup .btn-large .caret { + border-bottom: 5px solid #000; + border-top: 0; +} +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} +.btn-group-vertical { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + *zoom: 1; +} +.btn-group-vertical .btn { + display: block; + float: none; + width: 100%; + border-radius: 0; +} +.btn-group-vertical .btn + .btn { + margin-left: 0; + margin-top: -1px; +} +.btn-group-vertical .btn:first-child { + border-radius: 4px 4px 0 0; +} +.btn-group-vertical .btn:last-child { + border-radius: 0 0 4px 4px; +} +.btn-group-vertical .btn-large:first-child { + border-radius: 6px 6px 0 0; +} +.btn-group-vertical .btn-large:last-child { + border-radius: 0 0 6px 6px; +} +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + border-radius: 4px; + color: #c09853; +} +.alert h4 { + margin: 0; +} +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px; +} +.alert-success { + background-color: #dff0d8; + border-color: #d6e9c6; + color: #468847; +} +.alert-danger, +.alert-error { + background-color: #f2dede; + border-color: #eed3d7; + color: #b94a48; +} +.alert-info { + background-color: #d9edf7; + border-color: #bce8f1; + color: #3a87ad; +} +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} +.alert-block p + p { + margin-top: 5px; +} +.nav { + margin-left: 0; + margin-bottom: 20px; + list-style: none; +} +.nav > li > a { + display: block; +} +.nav > li > a:hover { + text-decoration: none; + background-color: #eee; +} +.nav > .pull-right { + float: right; +} +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} +.nav li + .nav-header { + margin-top: 9px; +} +.nav-list { + padding-left: 15px; + padding-right: 15px; + margin-bottom: 0; +} +.nav-list > li > a, +.nav-list .nav-header { + margin-left: -15px; + margin-right: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} +.nav-list > li > a { + padding: 3px 15px; +} +.nav-list > .active > a, +.nav-list > .active > a:hover { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #08c; +} +.nav-list [class^="icon-"] { + margin-right: 2px; +} +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #fff; +} +.nav-tabs, +.nav-pills { + *zoom: 1; +} +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + content: ""; + line-height: 0; +} +.nav-tabs:after, +.nav-pills:after { + clear: both; +} +.nav-tabs > li, +.nav-pills > li { + float: left; +} +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + margin-bottom: -1px; +} +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 20px; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover { + color: #555; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; + cursor: default; +} +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + border-radius: 5px; +} +.nav-pills > .active > a, +.nav-pills > .active > a:hover { + color: #fff; + background-color: #08c; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li > a { + margin-right: 0; +} +.nav-tabs.nav-stacked { + border-bottom: 0; +} +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + border-radius: 0; +} +.nav-tabs.nav-stacked > li:first-child > a { + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} +.nav-tabs.nav-stacked > li:last-child > a { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.nav-tabs.nav-stacked > li > a:hover { + border-color: #ddd; + z-index: 2; +} +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} +.nav-tabs .dropdown-menu { + border-radius: 0 0 6px 6px; +} +.nav-pills .dropdown-menu { + border-radius: 6px; +} +.nav .dropdown-toggle .caret { + border-top-color: #08c; + border-bottom-color: #08c; + margin-top: 6px; +} +.nav .dropdown-toggle:hover .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} +/* move down carets for tabs */ +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: #555; + border-bottom-color: #555; +} +.nav > .dropdown.active > a:hover { + cursor: pointer; +} +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover { + color: #fff; + background-color: #999; + border-color: #999; +} +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret { + border-top-color: #fff; + border-bottom-color: #fff; + opacity: 1; + filter: alpha(opacity=100); +} +.tabs-stacked .open > a:hover { + border-color: #999; +} +.tabbable { + *zoom: 1; +} +.tabbable:before, +.tabbable:after { + display: table; + content: ""; + line-height: 0; +} +.tabbable:after { + clear: both; +} +.tab-content { + overflow: auto; +} +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} +.tab-content > .active, +.pill-content > .active { + display: block; +} +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} +.tabs-below > .nav-tabs > li > a { + border-radius: 0 0 4px 4px; +} +.tabs-below > .nav-tabs > li > a:hover { + border-bottom-color: transparent; + border-top-color: #ddd; +} +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover { + border-color: transparent #ddd #ddd #ddd; +} +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + border-radius: 4px 0 0 4px; +} +.tabs-left > .nav-tabs > li > a:hover { + border-color: #eee #ddd #eee #eee; +} +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #fff; +} +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + border-radius: 0 4px 4px 0; +} +.tabs-right > .nav-tabs > li > a:hover { + border-color: #eee #eee #eee #ddd; +} +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #fff; +} +.nav > .disabled > a { + color: #999; +} +.nav > .disabled > a:hover { + text-decoration: none; + background-color: transparent; + cursor: default; +} +.navbar { + overflow: visible; + margin-bottom: 20px; + color: #555; + *position: relative; + *z-index: 2; +} +.navbar-inner { + min-height: 40px; + padding-left: 20px; + padding-right: 20px; + background-color: #fafafa; + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#f2f2f2)); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + border: 1px solid #d4d4d4; + border-radius: 4px; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} +.navbar .container { + width: auto; +} +.nav-collapse.collapse { + height: auto; +} +.navbar .brand { + float: left; + display: block; + padding: 10px 20px 10px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + color: #555; + text-shadow: 0 1px 0 #ffffff; +} +.navbar .brand:hover { + text-decoration: none; +} +.navbar-text { + margin-bottom: 0; + line-height: 40px; +} +.navbar-link { + color: #555; +} +.navbar-link:hover { + color: #333; +} +.navbar .divider-vertical { + height: 40px; + margin: 0 9px; + border-left: 1px solid #f2f2f2; + border-right: 1px solid #ffffff; +} +.navbar .btn, +.navbar .btn-group { + margin-top: 6px; +} +.navbar .btn-group .btn { + margin: 0; +} +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} +.navbar-form:before, +.navbar-form:after { + display: table; + content: ""; + line-height: 0; +} +.navbar-form:after { + clear: both; +} +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} +.navbar-form input, +.navbar-form select, +.navbar-form .btn { + display: inline-block; + margin-bottom: 0; +} +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 6px; + white-space: nowrap; +} +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} +.navbar-search { + position: relative; + float: left; + margin-top: 5px; + margin-bottom: 0; +} +.navbar-search .search-query { + margin-bottom: 0; + padding: 4px 14px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + border-radius: 15px; +} +.navbar-static-top { + position: static; + width: 100%; + margin-bottom: 0; +} +.navbar-static-top .navbar-inner { + border-radius: 0; +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner, +.navbar-static-top .navbar-inner { + border: 0; +} +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-left: 0; + padding-right: 0; + border-radius: 0; +} +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} +.navbar-fixed-top { + top: 0; +} +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1); + box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1); +} +.navbar-fixed-bottom { + bottom: 0; +} +.navbar-fixed-bottom .navbar-inner { + -webkit-box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1); + box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1); +} +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} +.navbar .nav.pull-right { + float: right; +} +.navbar .nav > li { + float: left; +} +.navbar .nav > li > a { + float: none; + padding: 10px 15px 10px; + color: #555; + text-decoration: none; + text-shadow: 0 1px 0 #ffffff; +} +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} +.navbar .nav > li > a:focus, +.navbar .nav > li > a:hover { + background-color: transparent; + color: #333; + text-decoration: none; +} +.navbar .nav > .active > a, +.navbar .nav > .active > a:hover, +.navbar .nav > .active > a:focus { + color: #555; + text-decoration: none; + background-color: #e5e5e5; + -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); +} +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-left: 5px; + margin-right: 5px; + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #ededed; + background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2f2f2), to(#e5e5e5)); + background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); + border-color: #e5e5e5 #e5e5e5 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #e5e5e5; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); + box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); +} +.navbar .btn-navbar:hover, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + color: #fff; + background-color: #e5e5e5; + *background-color: #d9d9d9; +} +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #cccccc \9; +} +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} +.navbar .nav > li > .dropdown-menu:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; + top: -7px; + left: 9px; +} +.navbar .nav > li > .dropdown-menu:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + position: absolute; + top: -6px; + left: 10px; +} +.navbar-fixed-bottom .nav > li > .dropdown-menu:before { + border-top: 7px solid #ccc; + border-top-color: rgba(0, 0, 0, 0.2); + border-bottom: 0; + bottom: -7px; + top: auto; +} +.navbar-fixed-bottom .nav > li > .dropdown-menu:after { + border-top: 6px solid #fff; + border-bottom: 0; + bottom: -6px; + top: auto; +} +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + background-color: #e5e5e5; + color: #555; +} +.navbar .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #555; + border-bottom-color: #555; +} +.navbar .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #555; + border-bottom-color: #555; +} +.navbar .pull-right > li > .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right { + left: auto; + right: 0; +} +.navbar .pull-right > li > .dropdown-menu:before, +.navbar .nav > li > .dropdown-menu.pull-right:before { + left: auto; + right: 12px; +} +.navbar .pull-right > li > .dropdown-menu:after, +.navbar .nav > li > .dropdown-menu.pull-right:after { + left: auto; + right: 13px; +} +.navbar .pull-right > li > .dropdown-menu .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { + left: auto; + right: 100%; + margin-left: 0; + margin-right: -1px; + border-radius: 6px 0 6px 6px; +} +.navbar-inverse { + color: #999; +} +.navbar-inverse .navbar-inner { + background-color: #1b1b1b; + background-image: -o-linear-gradient(top, #222222, #111111); + background-image: -webkit-gradient(linear, left top, left bottom, from(#222222), to(#111111)); + background-image: linear-gradient(to bottom, #222222, #111111); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); + border-color: #252525; +} +.navbar-inverse .brand, +.navbar-inverse .nav > li > a { + color: #999; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.navbar-inverse .brand:hover, +.navbar-inverse .nav > li > a:hover { + color: #fff; +} +.navbar-inverse .nav > li > a:focus, +.navbar-inverse .nav > li > a:hover { + background-color: transparent; + color: #fff; +} +.navbar-inverse .nav .active > a, +.navbar-inverse .nav .active > a:hover, +.navbar-inverse .nav .active > a:focus { + color: #fff; + background-color: #111111; +} +.navbar-inverse .navbar-link { + color: #999; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .divider-vertical { + border-left-color: #111111; + border-right-color: #222222; +} +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + background-color: #111111; + color: #fff; +} +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #999; + border-bottom-color: #999; +} +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} +.navbar-inverse .navbar-search .search-query { + color: #fff; + background-color: #515151; + border-color: #111111; + -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); + box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); + -webkit-transition: none; + -o-transition: none; + transition: none; +} +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #ccc; +} +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { + color: #ccc; +} +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { + color: #ccc; +} +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused { + padding: 5px 15px; + color: #333; + text-shadow: 0 1px 0 #fff; + background-color: #fff; + border: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + outline: 0; +} +.navbar-inverse .btn-navbar { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e0e0e; + background-image: -o-linear-gradient(top, #151515, #040404); + background-image: -webkit-gradient(linear, left top, left bottom, from(#151515), to(#040404)); + background-image: linear-gradient(to bottom, #151515, #040404); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); + border-color: #040404 #040404 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #040404; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active, +.navbar-inverse .btn-navbar.disabled, +.navbar-inverse .btn-navbar[disabled] { + color: #fff; + background-color: #040404; + *background-color: #000000; +} +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active { + background-color: #000000 \9; +} +.breadcrumb { + padding: 8px 15px; + margin: 0 0 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb li { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + *zoom: 1; + text-shadow: 0 1px 0 #fff; +} +.breadcrumb .divider { + padding: 0 5px; + color: #ccc; +} +.breadcrumb .active { + color: #999; +} +.modal-open .dropdown-menu { + z-index: 2050; +} +.modal-open .dropdown.open { + *z-index: 2050; +} +.modal-open .popover { + z-index: 2060; +} +.modal-open .tooltip { + z-index: 2080; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} +.modal { + position: fixed; + top: 50%; + left: 50%; + z-index: 1050; + overflow: auto; + width: 560px; + margin: -250px 0 0 -280px; + background-color: #fff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + /* IE6-7 */ + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + background-clip: padding-box; +} +.modal.fade { + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out; + top: -25%; +} +.modal.fade.in { + top: 50%; +} +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} +.modal-header .close { + margin-top: 2px; +} +.modal-header h3 { + margin: 0; + line-height: 30px; +} +.modal-body { + overflow-y: auto; + max-height: 400px; + padding: 15px; +} +.modal-form { + margin-bottom: 0; +} +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-radius: 0 0 6px 6px; + -webkit-box-shadow: inset 0 1px 0 #fff; + box-shadow: inset 0 1px 0 #fff; + *zoom: 1; +} +.modal-footer:before, +.modal-footer:after { + display: table; + content: ""; + line-height: 0; +} +.modal-footer:after { + clear: both; +} +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.tooltip { + position: absolute; + z-index: 1030; + display: block; + visibility: visible; + padding: 5px; + font-size: 11px; + opacity: 0; + filter: alpha(opacity=0); +} +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} +.tooltip.top { + margin-top: -3px; +} +.tooltip.right { + margin-left: 3px; +} +.tooltip.bottom { + margin-top: 3px; +} +.tooltip.left { + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #eee; + text-align: center; + text-decoration: none; + background-color: #333; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #333; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #333; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #333; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #333; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + width: 236px; + padding: 1px; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); +} +.popover.top { + margin-bottom: 10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-right: 10px; +} +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover-content p, +.popover-content ul, +.popover-content ol { + margin-bottom: 0; +} +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: inline-block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover .arrow:after { + content: ""; + z-index: -1; +} +.popover.top .arrow { + bottom: -10px; + left: 50%; + margin-left: -10px; + border-width: 10px 10px 0; + border-top-color: #fff; +} +.popover.top .arrow:after { + border-width: 11px 11px 0; + border-top-color: rgba(0, 0, 0, 0.25); + bottom: -1px; + left: -11px; +} +.popover.right .arrow { + top: 50%; + left: -10px; + margin-top: -10px; + border-width: 10px 10px 10px 0; + border-right-color: #fff; +} +.popover.right .arrow:after { + border-width: 11px 11px 11px 0; + border-right-color: rgba(0, 0, 0, 0.25); + bottom: -11px; + left: -1px; +} +.popover.bottom .arrow { + top: -10px; + left: 50%; + margin-left: -10px; + border-width: 0 10px 10px; + border-bottom-color: #fff; +} +.popover.bottom .arrow:after { + border-width: 0 11px 11px; + border-bottom-color: rgba(0, 0, 0, 0.25); + top: -1px; + left: -11px; +} +.popover.left .arrow { + top: 50%; + right: -10px; + margin-top: -10px; + border-width: 10px 0 10px 10px; + border-left-color: #fff; +} +.popover.left .arrow:after { + border-width: 11px 0 11px 11px; + border-left-color: rgba(0, 0, 0, 0.25); + bottom: -11px; + right: -1px; +} +.label, +.badge { + font-size: 11.844px; + font-weight: bold; + line-height: 14px; + color: #fff; + vertical-align: baseline; + white-space: nowrap; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #999; +} +.label { + padding: 1px 4px 2px; + border-radius: 3px; +} +.badge { + padding: 1px 9px 2px; + border-radius: 9px; +} +a.label:hover, +a.badge:hover { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label-important, +.badge-important { + background-color: #b94a48; +} +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} +.label-warning, +.badge-warning { + background-color: #f89406; +} +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} +.label-success, +.badge-success { + background-color: #468847; +} +.label-success[href], +.badge-success[href] { + background-color: #356635; +} +.label-info, +.badge-info { + background-color: #3a87ad; +} +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} +.label-inverse, +.badge-inverse { + background-color: #333; +} +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} +.btn .label, +.btn .badge { + position: relative; + top: -1px; +} +.btn-mini .label, +.btn-mini .badge { + top: 0; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + overflow: hidden; + height: 20px; + margin-bottom: 20px; + background-color: #f7f7f7; + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#f9f9f9)); + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + border-radius: 4px; +} +.progress .bar { + width: 0%; + height: 100%; + color: #fff; + float: left; + font-size: 12px; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, left top, left bottom, from(#149bdf), to(#0480be)); + background-image: linear-gradient(to bottom, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress .bar + .bar { + -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); + box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); +} +.progress-striped .bar { + background-color: #149bdf; + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 40px 40px; +} +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-danger .bar, +.progress .bar-danger { + background-color: #dd514c; + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35)); + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); +} +.progress-danger.progress-striped .bar, +.progress-striped .bar-danger { + background-color: #ee5f5b; + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-success .bar, +.progress .bar-success { + background-color: #5eb95e; + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, left top, left bottom, from(#62c462), to(#57a957)); + background-image: linear-gradient(to bottom, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); +} +.progress-success.progress-striped .bar, +.progress-striped .bar-success { + background-color: #62c462; + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-info .bar, +.progress .bar-info { + background-color: #4bb1cf; + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9)); + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); +} +.progress-info.progress-striped .bar, +.progress-striped .bar-info { + background-color: #5bc0de; + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-warning .bar, +.progress .bar-warning { + background-color: #faa732; + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fbb450), to(#f89406)); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); +} +.progress-warning.progress-striped .bar, +.progress-striped .bar-warning { + background-color: #fbb450; + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.hide { + display: none; +} +.show { + display: block; +} +.invisible { + visibility: hidden; +} +.affix { + position: fixed; +} +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 16px; + height: 16px; + line-height: 17px; + font-size: 16px; + vertical-align: text-top; +} +.disabled [class^="icon-"], +.disabled [class*=" icon-"], +.btn[disabled] [class^="icon-"], +.btn[disabled] [class*=" icon-"] { + color: grey; +} +.disabled [class^="icon-"].icon-white, +.disabled [class*=" icon-"].icon-white, +.btn[disabled] [class^="icon-"].icon-white, +.btn[disabled] [class*=" icon-"].icon-white { + color: #fff; +} +.icon-folder, +.icon-folder-add, +.icon-list { + line-height: 18px; + font-size: 18px; + margin-top: -1px; + margin-left: -1px; + width: 17px; +} +.iconsize50 { + line-height: 50px; + font-size: 50px; + width: 50px; + height: 50px; +} +.iconsize24 { + line-height: 24px; + font-size: 24px; +} +.iconsize20 { + line-height: 20px; + font-size: 20px; +} +/* White icons with optional class, or on hover/active states of certain elements */ +.icon-white, +.nav > .active > a > [class^="icon-"], +.nav > .active > a > [class*=" icon-"] { + color: #fff; +} +.g-ui-menu .e-item:hover [class^="icon-"], +.g-ui-menu .e-item:hover [class*=" icon-"] { + color: #fff; +} +.icon-none { + background-image: none !important; +} +.icon-checkbox-checked, +.icon-checkbox-unchecked, +.icon-checkbox-partial, +.icon-radio-checked, +.icon-radio-unchecked { + cursor: pointer; + color: #555; + font-size: 1em; +} +.icon-checkbox-checked:hover, +.icon-checkbox-unchecked:hover, +.icon-checkbox-partial:hover, +.icon-radio-checked:hover, +.icon-radio-unchecked:hover, +.icon-checkbox-checked:active, +.icon-checkbox-unchecked:active, +.icon-checkbox-partial:active, +.icon-radio-checked:active, +.icon-radio-unchecked:active { + color: #000; +} +.icon-white.icon-checkbox-checked, +.icon-white.icon-checkbox-unchecked, +.icon-white.icon-checkbox-partial, +.icon-white.icon-radio-checked, +.icon-white.icon-radio-unchecked { + color: #eee; +} +.icon-white.icon-checkbox-checked:hover, +.icon-white.icon-checkbox-unchecked:hover, +.icon-white.icon-checkbox-partial:hover, +.icon-white.icon-radio-checked:hover, +.icon-white.icon-radio-unchecked:hover, +.icon-white.icon-checkbox-checked:active, +.icon-white.icon-checkbox-unchecked:active, +.icon-white.icon-checkbox-partial:active, +.icon-white.icon-radio-checked:active, +.icon-white.icon-radio-unchecked:active { + color: #fff; +} +.iconcolor-display-none { + display: none; +} +.iconcolor-green { + color: green; +} +.iconcolor-red { + color: red; +} +.iconcolor-white { + color: white; +} +.iconcolor-grey { + color: #aaa; +} +.denied-by-browser { + cursor: default; +} +.denied-by-browser .icon-checkbox-checked, +.denied-by-browser icon-checkbox-unchecked { + cursor: default; +} +.right-mini, +.down-mini { + width: 16px; + line-height: 20px; +} +/* +@keyframes rotation { + to {transform: rotate(1turn);} +} + +.icon-spinner { + width: 16px; + height: 16px; + + &:before { + transform-origin: 8px 8px; + margin-top: 1px; + display: inline-block; + font-size: 16px; + line-height: 100%; + } +} +*/ +@-webkit-keyframes rotation { + to { + -webkit-transform: rotate(1turn); + transform: rotate(1turn); + } +} +@keyframes rotation { + to { + -webkit-transform: rotate(1turn); + transform: rotate(1turn); + } +} +.icon-spinner { + font-family: Arial; + height: 11px; + width: 11px; + margin-right: -1px; + background: none; + border: 3px solid #aaa; + border-top-color: #333; + border-radius: 100%; + -webkit-animation: none; + animation: none; +} +.icon-spinner:before { + content: ""; +} +.icon-spinner.animated { + border-color: transparent; + border-top-color: #999; + -webkit-animation: rotation 0.8s infinite ease-in-out; + animation: rotation 0.8s infinite ease-in-out; +} +.icon-spinner.big { + height: 13px; + width: 13px; + margin-top: -2px; + margin-left: -2px; +} +.icon-spinner.white, +.icon-spinner.icon-white { + border-color: #fff; + border-top-color: #999; +} +.icon-spinner.white.animated, +.icon-spinner.icon-white.animated { + border-color: transparent; + border-top-color: #fff; +} +html.no-cssanimations .icon-spinner { + background: none; + background-image: url('images/sync.png'); + background-repeat: no-repeat; + border: none; + -webkit-box-shadow: none; + box-shadow: none; + height: 16px; + width: 16px; + font-family: Arial; +} +html.no-cssanimations .icon-spinner:before { + content: ""; +} +html.no-cssanimations .icon-spinner.animated { + background: none; + background-image: url('images/sync.gif'); +} +body { + background-color: transparent; +} +label { + cursor: pointer; +} +label.inline, +span.inline { + display: inline-block; +} +.close-custom { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close-custom:hover { + color: #000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} +button.close-custom { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.minimize-custom { + border: 0px solid #333; + border-bottom-width: 3px; + display: inline-block; + float: right; + height: 20px; + width: 16px; + font-size: 20px; + font-weight: bold; + line-height: 20px; + margin-right: 15px; + cursor: pointer; +} +.legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +.legend small { + font-size: 15px; + color: #999; +} +.legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} +.input-append input, +.input-append select, +.input-append .uneditable-input { + border-radius: 3px; +} +select { + width: 223px; +} +.btn .svg-icon { + vertical-align: middle; +} +.btn-small.btn-small-small { + padding: 3px 9px; + font-size: 11px; + line-height: 11px; +} +.btn.btn-thin { + padding: 4px 9px; +} +.btn.btn-thin-2 { + padding: 4px 7px; +} +.btn.btn-nowrap { + white-space: nowrap; +} +.btn.btn-ellipsis { + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} +.btn.btn-transparent { + background: none !important; + border-color: transparent !important; + text-shadow: none !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + opacity: .6; +} +.btn.btn-transparent [class^="icon-"] { + width: 19px; + height: 19px; + line-height: 20px; + font-size: 19px; +} +.btn.btn-transparent:hover { + opacity: 1; +} +.btn-group.open .btn.btn-transparent.dropdown-toggle { + color: #BD362F; +} +.btn-group.open .btn.btn-transparent.dropdown-toggle .caret { + border-top-color: #BD362F; +} +.btn-group.open .btn.btn-transparent.dropdown-toggle [class^="icon-"]:before { + color: #BD362F; +} +.btn.btn-narrow { + padding-left: 12px; + padding-right: 12px; +} +.btn-group.btn-group-custom-margin > .btn + .btn { + margin-left: 0px; +} +.btn.btn-large { + font-size: 17px; +} +.dropdown-menu { + border-radius: 3px; +} +.btn-group + .btn-group { + margin-left: 3px; +} +.btn { + border-radius: 3px; + background-image: none; + padding-left: 13px; + padding-right: 13px; + border-color: rgba(0, 0, 0, 0.25) rgba(0, 0, 0, 0.25) rgba(0, 0, 0, 0.25); +} +.btn.disabled, +.btn[disabled] { + opacity: 0.8; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} +html.textshadow .btn { + text-shadow: 0 1px 0 #fff; +} +html.textshadow .btn.btn-danger, +html.textshadow .btn.btn-success, +html.textshadow .btn.btn-primary, +html.textshadow .btn.btn-warning { + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.3); +} +.btn.btn-dark-disabled-border.disabled, +.btn.btn-dark-disabled-border[disabled] { + border-color: #aaa; +} +.btn.btn-success { + background-color: #84AB04; +} +.btn-toolbar { + margin-top: 0; + margin-bottom: 0; +} +.dropdown-menu { + border-radius: 0; + -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2); + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2); +} +.tooltip { + font-size: 14px; + z-index: 2000 !important; + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; +} +.tooltip.in { + opacity: 1; +} +.tooltip .tooltip-inner { + max-width: 380px; + text-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2); + padding: 5px 10px; + border-radius: 2px; + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; +} +.tooltip .tooltip-big { + font-size: 18px; + padding: 0 10px; + white-space: nowrap; +} +.popover { + width: auto; + min-width: 250px; + max-width: 550px; +} +.popover .popover-content pre { + border: none; + background: rgba(0, 0, 0, 0); + padding: 0; + word-break: normal; +} +.btn-group > .btn { + border-radius: 0 !important; +} +.btn-group > .btn.single { + border-radius: 3px !important; +} +.btn-group > .btn.first { + border-top-left-radius: 3px !important; + border-bottom-left-radius: 3px !important; +} +.btn-group > .btn.last { + border-top-right-radius: 3px !important; + border-bottom-right-radius: 3px !important; +} +.btn-group + .btn-group { + margin-left: 0; +} +.btn-group { + margin-right: 3px; +} +.btn-group.btn-group-last { + margin-right: 0; +} +.dropdown.colored-toggle.open .btn.dropdown-toggle { + color: #BD362F; +} +.dropdown.colored-toggle.open .btn.dropdown-toggle .caret { + border-top-color: #BD362F; +} +.dropdown.colored-toggle.open .btn.dropdown-toggle [class^="icon-"]:before { + color: #BD362F; +} +textarea, +input[type="text"], +input[type="password"], +input[type="email"], +input[type="search"] { + border: 1px solid #ccc; +} +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="email"]:focus, +input[type="search"]:focus { + background-color: #fff; + border: 1px solid #999999; + -webkit-box-shadow: none; + box-shadow: none; +} +input[type="text"], +input[type="password"], +input[type="email"], +input[type="search"] { + height: 20px; + line-height: 20px; +} +select { + border: 1px solid #ccc; +} +.alert a { + text-decoration: underline; +} +.alert.alert-null-left-margin { + margin-left: 0; +} +.alert a { + color: #c09853; +} +.alert.alert-info a { + color: #3a87ad; +} +.alert.alert-error a { + color: #b94a48; +} +.nav-tabs > li > a { + color: #555; +} +.popover { + z-index: 2000; +} +html.no-rgba .modal { + border-width: 0px !important; +} +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.2; + filter: alpha(opacity=20); + -webkit-transform: none; + -ms-transform: none; + transform: none; +} +.popups { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 1100; + overflow: auto; +} +.popups .modal { + position: static; + z-index: 1101; + margin: 5% auto; + background-color: transparent; + overflow: hidden; + -webkit-box-shadow: 0 5px 80px rgba(0, 0, 0, 0.3); + box-shadow: 0 5px 80px rgba(0, 0, 0, 0.3); +} +.popups .modal .modal-body { + background-color: #fff; + max-height: none; +} +.modal.fade { + -webkit-transition: none; + -o-transition: none; + transition: none; + top: 0; +} +.modal.fade.in { + top: 0; +} +.modal.loginContent .modal-body, +.modal.loginAdminContent .modal-body { + background-color: transparent !important; +} +.picker.modal-dialog-bg, +.picker.picker-dialog-bg { + z-index: 2000 !important; +} +.picker.modal-dialog, +.picker.picker-dialog { + z-index: 2001 !important; +} +.form-horizontal.long-label .control-group .control-label { + width: 160px; +} +.form-horizontal.long-label .control-group .controls { + margin-left: 180px; +} +.control-label.remove-padding-top { + padding-top: 0; +} +html.rl-mobile .popups .modal { + width: 100% !important; + width: calc(100% - 20px) !important; +} +html.rl-mobile .b-settings-content { + padding: 10px; + padding-left: 20px; +} +html.rl-mobile .list-table { + width: 100%; + max-width: 100%; +} +html.rl-mobile .form-horizontal .control-group .control-label { + text-align: left; + float: none; +} +html.rl-mobile .form-horizontal .control-group .controls { + margin-left: 0; +} +.close-input-wrp { + display: inline-block; + position: relative; +} +.close-input-wrp input { + padding-right: 15px; +} +.close-input-wrp .close { + position: absolute; + right: 0; + top: 5px; + margin: 0 7px; + z-index: 100; + vertical-align: middle; + opacity: .4; +} +.close-input-wrp .close:hover { + opacity: .6; +} +.inputosaurus-container { + width: 99%; + line-height: 20px; + padding: 2px; + border: 1px solid #cccccc; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear .2s, box-shadow linear .2s; + -o-transition: border linear .2s, box-shadow linear .2s; + -webkit-transition: border linear .2s, -webkit-box-shadow linear .2s; + transition: border linear .2s, -webkit-box-shadow linear .2s; + transition: border linear .2s, box-shadow linear .2s; + transition: border linear .2s, box-shadow linear .2s, -webkit-box-shadow linear .2s; +} +.inputosaurus-container.inputosaurus-focused { + background-color: #fff; + border: 1px solid #999999; + -webkit-box-shadow: none; + box-shadow: none; +} +.inputosaurus-container li { + max-width: 500px; + background-color: #eee; + border: 1px solid #aaa; + line-height: 18px; + padding: 2px 15px 2px 5px; + margin: 2px 2px 2px; + color: #555; + z-index: 100; + position: relative; +} +.inputosaurus-container li.ui-draggable.ui-draggable-dragging { + z-index: 101; +} +.inputosaurus-container li a { + color: #999; + font-size: 12px; + position: absolute; + top: 1px; + right: 2px; +} +.inputosaurus-container li a:hover { + color: #666; +} +.inputosaurus-container li span { + padding-right: 3px; +} +.inputosaurus-container li.inputosaurus-required { + padding-right: 5px; +} +.inputosaurus-container li.inputosaurus-selected { + background-color: #ddd; +} +.inputosaurus-container li.pgp { + background-color: #E5F3E2; +} +.inputosaurus-container .inputosaurus-input { + margin: 1px 10px 1px 0px; + height: 22px; +} +.inputosaurus-container .inputosaurus-input input { + border: 0px; + height: 21px; + padding-left: 0; +} +.ui-autocomplete { + z-index: 2000; +} +.inputosaurus-fake-span { + position: absolute; + top: 0; + left: -5000px; +} +/*.cke_button__sourcedialog_label { + display: none !important; +}*/ +.cke_chrome { + border: 1px solid #ccc !important; +} +.cke_toolgroup { + padding-right: 0 !important; + background: #FBFBFB !important; +} +.cke_toolgroup, +.cke_combo_button { + border: 1px solid #A6A6A6 !important; +} +.cke_top { + padding: 6px 4px 1px 6px !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + border-bottom: 1px solid #b6b6b6 !important; + background: #F0F0F0 !important; +} +.cke_combo_on a.cke_combo_button, +.cke_combo_off a.cke_combo_button:hover, +.cke_combo_off a.cke_combo_button:focus, +.cke_combo_off a.cke_combo_button:active { + padding: 1px !important; + margin-left: 0 !important; +} +.cke_toolgroup a.cke_button:last-child:after, +.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after { + border: none !important; + height: 0 !important; + width: 0 !important; + margin: 0 !important; + padding: 0 !important; +} +.cke_button_on { + background: #ddd !important; +} +.cke_combo { + margin-top: 1px !important; +} +.cke_combo__fontsize { + margin-left: 3px !important; +} +.cke_combo__fontsize .cke_combo_text { + width: 40px !important; +} +.cke_combo_text { + line-height: 24px !important; + padding-left: 8px !important; +} +.cke_combo_button { + background: #FBFBFB !important; +} +.cke_source { + font-family: Monaco, Menlo, Consolas, 'Courier New', monospace !important; + padding: 10px !important; + padding-right: 0 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; +} +.cke_plain { + background-color: #fff; + outline: none; + overflow: auto; + z-index: 1; + margin: 0; + border: 0; + padding: 10px; + padding-right: 0; + white-space: pre-wrap; + font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; + font-size: 13px; + line-height: 16px; + color: #333; + resize: none; + border-radius: 0; + -webkit-box-shadow: none; + box-shadow: none; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.cke_plain:focus, +.cke_source:focus { + border: 0; +} +.b-compose .cke_chrome { + border-right: 0; + border-left: 0; + border-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; +} +.cke_wysiwyg_div { + padding: 10px !important; + font-family: arial, sans-serif; + font-size: 13px; + line-height: 16px; + color: #333; +} +.cke_wysiwyg_div ul { + padding-left: 40px; +} +.cke_wysiwyg_div ul li { + list-style-type: disc !important; +} +.cke_wysiwyg_div ol { + padding-left: 40px; +} +.cke_wysiwyg_div ol li { + list-style-type: decimal !important; +} +.cke_wysiwyg_div pre, +.cke_wysiwyg_div code { + margin: 0px; + padding: 0px; + background: #fff; + border: none; + border-radius: 0; + font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; + display: block; + word-break: normal; + word-wrap: break-word; + background-color: #f9f9f9; +} +.cke_wysiwyg_div code { + display: inline; + padding: 2px 5px; +} +.cke_wysiwyg_div pre { + padding: 5px 10px; + border-radius: 5px; + background-color: #f9f9f9; +} +.cke_wysiwyg_div pre > code { + padding: 0px; +} +.cke_wysiwyg_div blockquote { + border: 0; + border-left: solid 2px #444; + margin: 5px 0 5px 5px; + padding-left: 5px; +} +.cke_wysiwyg_div blockquote p { + margin: 0 0 10px; + font-size: 14px; + line-height: 20px; +} +.cke_wysiwyg_div img { + vertical-align: bottom; +} +.cke_wysiwyg_div a { + color: blue; + text-decoration: underline; +} +.cke_wysiwyg_div a:visited { + color: #609; +} +.cke_wysiwyg_div a:active { + color: red; +} +.cke_dialog a:hover { + text-decoration: none; +} +.cke_dialog .cke_dialog_ui_labeled_content { + margin-top: 5px; + margin-bottom: 5px; +} +.cke_dialog .cke_dialog_ui_input_select, +.cke_dialog .cke_dialog_ui_input_text, +.cke_dialog .cke_dialog_ui_input_textarea { + -webkit-box-shadow: none; + box-shadow: none; + border-radius: 2px; +} +.cke_dialog .cke_dialog_ui_input_select:focus, +.cke_dialog .cke_dialog_ui_input_text:focus, +.cke_dialog .cke_dialog_ui_input_textarea:focus { + outline: 0; + border: 1px solid #999; +} +.cke_dialog .cke_dialog_ui_input_select, +.cke_dialog .cke_dialog_ui_input_text { + height: 25px; + line-height: 25px; +} +.g-ui-user-select-allow { + webkit-touch-callout: inherit; + -webkit-user-select: inherit; + -moz-user-select: inherit; + -ms-user-select: inherit; + user-select: inherit; + standard-user-select: inherit; + touch-callout: inherit; +} +.g-ui-clearfix { + *zoom: 1; +} +.g-ui-clearfix:before, +.g-ui-clearfix:after { + display: table; + content: ""; + line-height: 0; +} +.g-ui-clearfix:after { + clear: both; +} +.g-ui-link { + color: #336699; + text-decoration: underline; + cursor: pointer; + padding: 2px; +} +.g-ui-link:focus { + outline: 1px; + outline-style: dotted; +} +.g-ui-min-height-300 { + min-height: 300px; +} +.g-ui-100-proc-height { + height: 100%; +} +.g-ui-absolute-reset { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 0; + margin: 0; + border: 0; + z-index: 0; +} +.g-ui-menu { + max-height: 400px; + max-width: 300px; + overflow-y: auto; + overflow-x: hidden; +} +.g-ui-menu .e-link { + text-decoration: none; + cursor: pointer; +} +.g-ui-menu .e-item.selected > .e-link { + background-color: #eee !important; +} +.g-ui-menu .e-item > .e-link:focus, +.g-ui-menu .e-item > .e-link:hover { + background-color: #555; + background-image: none; + color: #fff; +} +.g-ui-menu .e-item.disabled > .e-link { + cursor: not-allowed; + background-color: #fff; + background-image: none; + color: grey; +} +.g-ui-menu .e-item.disabled [class^="icon-"] { + color: grey; +} +.g-ui-table { + display: table; + width: 100%; +} +.g-ui-table .e-row { + display: table-row; +} +.g-ui-table .e-cell { + display: table-cell; + vertical-align: top; + text-align: left; +} +.g-ui-height-100proc { + height: 100%; +} +.g-ui-resizable-delimiter-highlight { + border: none; + border-right: 6px solid #aaa; +} +.e-pagenator .e-page { + display: inline-block; + color: #999; + text-decoration: none; + font-size: 22px; + padding: 3px; + cursor: pointer; +} +.e-pagenator .e-page:hover .e-page-number { + color: #555; +} +.e-pagenator .e-page.current .e-page-number { + font-size: 25px; + color: #333; + border-bottom: 2px solid #000; +} +html.rgba .g-ui-resizable-delimiter-highlight { + border-right-color: rgba(0, 0, 0, 0.2); +} +.settings-saved-trigger { + display: inline-block; + line-height: 17px; + font-size: 16px; +} +.settings-saved-trigger .animated { + color: green; +} +.settings-saved-trigger .success { + color: green; + -webkit-transition: opacity 0.5s linear; + -o-transition: opacity 0.5s linear; + transition: opacity 0.5s linear; + opacity: 0; +} +.settings-saved-trigger .error { + color: red; + -webkit-transition: opacity 0.5s linear; + -o-transition: opacity 0.5s linear; + transition: opacity 0.5s linear; + opacity: 0; +} +.settings-saved-trigger .visible { + opacity: 1; +} +.settings-saved-trigger-input.success { + border-color: green !important; + -webkit-transition: border-color 0.5s linear; + -o-transition: border-color 0.5s linear; + transition: border-color 0.5s linear; +} +.settings-saved-trigger-input.error { + border-color: red !important; + -webkit-transition: border-color 0.5s linear; + -o-transition: border-color 0.5s linear; + transition: border-color 0.5s linear; +} +.display-none { + display: none; +} +.e-spinner { + display: none; +} +.e-powered, +.e-mobile-switcher { + margin-top: 8px; + color: #333; +} +.e-powered a, +.e-mobile-switcher a { + color: #333; + text-decoration: underline; +} +.e-powered a:hover, +.e-mobile-switcher a:hover { + color: #333; +} +.e-languages { + margin-top: 8px; + color: #333; +} +.e-languages .flag-name { + color: #333; + border-bottom: 1px dashed #333; + cursor: pointer; + padding: 2px 0px; +} +.e-languages .flag-name:focus { + outline: 1px; + outline-style: dotted; +} +html.cssanimations .e-spinner { + display: block; + margin: 5px auto 0; + width: 100px; + text-align: center; +} +html.cssanimations .e-spinner .e-bounce { + width: 15px; + height: 15px; + background-color: #ddd; + margin: 0 5px; + -webkit-box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.3); + box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.3); + border-radius: 100%; + display: inline-block; + -webkit-animation: bouncedelay 1.4s infinite ease-in-out; + animation: bouncedelay 1.4s infinite ease-in-out; + /* Prevent first frame from flickering when animation starts */ + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} +html.cssanimations .e-spinner .bounce1 { + -webkit-animation-delay: -0.32s; + animation-delay: -0.32s; +} +html.cssanimations .e-spinner .bounce2 { + -webkit-animation-delay: -0.16s; + animation-delay: -0.16s; +} +@-webkit-keyframes bouncedelay { + 0%, + 80%, + 100% { + -webkit-transform: scale(0); + transform: scale(0); + } + 40% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@keyframes bouncedelay { + 0%, + 80%, + 100% { + -webkit-transform: scale(0); + transform: scale(0); + } + 40% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +.command.command-disabled.hide-on-disabled-command { + display: none; +} +html { + margin: 0; + padding: 0; + overflow: hidden; + font-family: Arial, Verdana, Geneva, sans-serif; + height: 100%; +} +body { + margin: 0; + padding: 0; + overflow: hidden; + background-color: #e3e3e3; + font-family: Arial, Verdana, Geneva, sans-serif; + -webkit-touch-callout: none; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + height: 100%; +} +textarea { + resize: none; +} +option:disabled { + color: #aaa; + cursor: not-allowed; +} +body:before { + content: ""; + position: fixed; + top: -10px; + left: 0; + width: 100%; + height: 8px; + z-index: 100; + -webkit-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.6); + box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.6); +} +* { + outline: none; +} +select:focus { + outline: none; +} +html.mobile *, +html.rl-mobile * { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +input[type="search"] { + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +input::-ms-clear, +input::-ms-reveal { + display: none; +} +#rl-bg { + z-index: -1; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; +} +#rl-content { + height: 100%; + width: 100%; +} +#rl-center { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 0; + margin: 0; + border: 0; + z-index: 0; + min-width: 600px; + min-height: 400px; +} +html.rl-mobile #rl-center { + min-width: 250px; + min-height: 250px; +} +html.rl-mobile.rl-left-panel-enabled #rl-right { + right: -150px; +} +html.rl-mobile.rl-left-panel-disabled #rl-right { + left: 5px !important; +} +#rl-top { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 0; + margin: 0; + border: 0; + z-index: 0; + bottom: auto; + z-index: 2; +} +#rl-bottom { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 0; + margin: 0; + border: 0; + z-index: 0; + top: auto; + z-index: 1; +} +#rl-left { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 0; + margin: 0; + border: 0; + z-index: 0; + width: 200px; + min-width: 60px; +} +#rl-right { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 0; + margin: 0; + border: 0; + z-index: 0; + z-index: 1; + left: 200px; +} +#rl-sub-left { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 500px; +} +#rl-sub-right { + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: 500px; +} +#rl-sub-right .b-message-view-backdrop { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.4); + z-index: 10; +} +#rl-sub-right .b-message-view-backdrop .backdrop-message-wrp { + position: absolute; + top: calc(50% - 50px); + left: 0; + right: 0; + text-align: center; +} +#rl-sub-right .b-message-view-backdrop .backdrop-message-wrp .backdrop-message { + display: inline-block; + color: white; + font-size: 20px; + line-height: 30px; + background: rgba(0, 0, 0, 0.6); + padding: 15px; + border-radius: 5px; + text-shadow: 0px 1px 1px #000; +} +html.ssm-state-desktop-large #rl-left { + width: 220px; +} +html.ssm-state-desktop-large #rl-right { + left: 220px; +} +html.ssm-state-desktop-large #rl-sub-left { + width: 500px; +} +html.ssm-state-desktop-large #rl-sub-right { + left: 500px; +} +html.ssm-state-desktop-large .b-compose.modal { + width: 1000px; +} +html.ssm-state-desktop-large .b-contacts-content.modal { + width: 900px; +} +html.ssm-state-desktop #rl-left { + width: 200px; +} +html.ssm-state-desktop #rl-right { + left: 200px; +} +html.ssm-state-desktop #rl-sub-left { + width: 400px; +} +html.ssm-state-desktop #rl-sub-right { + left: 400px; +} +html.ssm-state-desktop .b-compose.modal { + width: 1000px; +} +html.ssm-state-desktop .b-contacts-content.modal { + width: 900px; +} +html.ssm-state-tablet #rl-left, +html.ssm-state-mobile #rl-left { + width: 155px; +} +html.ssm-state-tablet #rl-right, +html.ssm-state-mobile #rl-right { + left: 155px; +} +html.ssm-state-tablet #rl-sub-left, +html.ssm-state-mobile #rl-sub-left { + width: 310px; +} +html.ssm-state-tablet #rl-sub-left .messageList .inputSearch, +html.ssm-state-mobile #rl-sub-left .messageList .inputSearch { + width: 200px; +} +html.ssm-state-tablet #rl-sub-right, +html.ssm-state-mobile #rl-sub-right { + left: 310px; +} +html.ssm-state-tablet .b-compose.modal, +html.ssm-state-mobile .b-compose.modal { + width: 720px; +} +html.ssm-state-tablet .b-contacts-content.modal, +html.ssm-state-mobile .b-contacts-content.modal { + width: 700px; +} +html.ssm-state-tablet .b-contacts-content.modal .contactValueInput, +html.ssm-state-mobile .b-contacts-content.modal .contactValueInput { + width: 200px; +} +html.ssm-state-tablet .b-compose.modal { + width: 720px; +} +html.ssm-state-tablet .b-contacts-content.modal { + width: 800px; +} +html.ssm-state-tablet .b-contacts-content.modal .contactValueInput { + width: 250px; +} +.show-on-panel-disabled { + display: none; +} +html.rl-left-panel-disabled #rl-left { + width: 60px !important; +} +html.rl-left-panel-disabled #rl-left .show-on-panel-disabled { + display: block; +} +html.rl-left-panel-disabled #rl-left .opacity-on-panel-disabled { + opacity: 0.3; +} +html.rl-left-panel-disabled #rl-left .visibility-hidden-on-panel-disabled { + visibility: hidden; +} +html.rl-left-panel-disabled #rl-left .hide-on-panel-disabled { + display: none; +} +html.rl-left-panel-disabled #rl-left.ui-state-disabled { + opacity: 1; +} +html.rl-left-panel-disabled #rl-right { + left: 60px !important; +} +html.rl-left-panel-short #rl-left { + width: 60px !important; +} +html.rl-left-panel-short #rl-right { + left: 60px !important; +} +html.rl-left-panel-none #rl-left { + width: 10px !important; +} +html.rl-left-panel-none #rl-right { + left: 10px !important; +} +.ui-resizable-helper-w { + border-right: 5px solid #777; + border-right-color: rgba(255, 255, 255, 0.7); +} +.ui-resizable-helper-h { + border-bottom: 5px solid #ccc; + border-bottom-color: rgba(0, 0, 0, 0.3); +} +.ui-resizable-handle:hover { + background: #aaa; + background: rgba(255, 255, 255, 0.5); +} +html.rl-no-preview-pane #rl-sub-left { + right: 5px !important; + width: inherit; +} +html.rl-no-preview-pane #rl-sub-left .messageList .inputSearch { + width: 300px !important; +} +html.rl-no-preview-pane #rl-sub-right { + left: 0 !important; +} +html.rl-no-preview-pane #rl-right .ui-resizable-handle { + display: none !important; +} +html.rl-side-preview-pane #rl-right .ui-resizable-handle { + display: none !important; +} +html.rl-bottom-preview-pane #rl-sub-left { + right: 5px !important; + width: inherit; +} +html.rl-bottom-preview-pane #rl-sub-left .b-message-list-wrapper { + bottom: inherit; + height: 300px; + -webkit-box-shadow: none; + box-shadow: none; +} +html.rl-bottom-preview-pane #rl-sub-left .messageList .inputSearch { + width: 300px !important; +} +html.rl-bottom-preview-pane #rl-sub-right { + left: 0 !important; +} +html.rl-bottom-preview-pane #rl-sub-right .messageView .top-toolbar { + display: none; +} +html.rl-bottom-preview-pane #rl-sub-right .b-message-view-wrapper { + top: 356px; + left: 0; + right: 5px; + -webkit-box-shadow: none; + box-shadow: none; +} +.visible-on-ctrl, +.visible-on-ctrl-btn { + display: none; +} +.hidden-on-ctrl-btn { + display: inline-block; +} +html.rl-ctrl-key-pressed .visible-on-ctrl { + display: inline-block; +} +html.rl-ctrl-key-pressed .btn-group.open .visible-on-ctrl-btn { + display: inline-block; +} +html.rl-ctrl-key-pressed .hidden-on-ctrl { + display: none; +} +html.rl-ctrl-key-pressed .btn-group.open .hidden-on-ctrl-btn { + display: none; +} +#rl-loading, +#rl-loading-error { + position: absolute; + font-size: 30px; + line-height: 130%; + top: 50%; + width: 100%; + height: 65px; + margin: 0; + margin-top: -60px; + background-color: transparent; + text-align: center; + color: #000; +} +#rl-loading-error { + background-image: none; + display: none; +} +#rl-loading-error-additional { + margin-top: 20px; + font-size: 20px; +} +#rl-app { + display: none; +} +#rl-check { + display: none; +} +.rl-content-show { + display: block !important; +} +html.rl-mobile .hide-on-mobile { + display: none !important; +} +.show-on-mobile { + display: none !important; +} +html.rl-mobile .show-on-mobile { + display: initial !important; +} +html.rl-mobile .width100-on-mobile { + width: 100% !important; +} +.nano.scroller-shadow-top:before, +.nano.scroller-shadow-bottom:after { + content: ""; + position: absolute; + left: 0; + width: 100%; + height: 10px; + z-index: 102; + -webkit-box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.4); + box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.4); +} +.nano.scroller-shadow-top:before { + top: -10px; +} +.nano.scroller-shadow-bottom:after { + bottom: -10px; +} +.nano.fixIndex.scroller-shadow-top:before, +.nano.fixIndex.scroller-shadow-bottom:after { + z-index: 98; +} +/* +.nano { + .pane .slider { + .transition(top 0.1s ease-out); + } + + .pane2 .slider2 { + .transition(left 0.1s ease-out); + } + + .pane.active .slider, .pane2.active .slider2 { + .transition(none); + } +} +*/ +.e-component.e-select select:focus { + outline: 1px; + outline-style: dotted; +} +.e-component.e-checkbox { + margin-bottom: 6px; + margin-left: -2px; + padding: 2px; + cursor: pointer; +} +.e-component.e-checkbox:focus { + outline: 1px; + outline-style: dotted; +} +.e-component.e-checkbox .e-checkbox-icon { + padding: 1px 0 0 1px; +} +.e-component.e-checkbox.disabled { + cursor: default; + color: #999; + outline: 0; + outline-style: none; +} +.e-component.e-radio { + cursor: pointer; +} +.e-component.e-radio.disabled { + cursor: default; + color: #999; +} +.e-component.material-design.e-checkbox { + margin-top: 2px; + padding: 2px 2px 1px 2px; +} +.e-component.material-design.e-checkbox .sub-checkbox-container { + display: inline-block; + position: relative; + -webkit-transform: translateZ(0); + transform: translateZ(0); + width: 18px; + height: 18px; + vertical-align: bottom; + margin-bottom: 3px; +} +.e-component.material-design.e-checkbox .sub-label { + padding-left: 12px; +} +.e-component.material-design.e-checkbox .sub-checkbox { + position: absolute; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin-top: 1px; + top: 0px; + left: 0px; + width: 18px; + height: 18px; + border: solid 2px #999; + -webkit-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); +} +.e-component.material-design.e-checkbox .sub-checkbox.checked { + border-top: none; + border-left: none; + border-color: #0F9D58; + /* top: -4px; + left: 6px; + width: 10px; + height: 21px;*/ + top: -1px; + left: 5px; + width: 10px; + height: 18px; + border-right-width: 2px; + border-bottom-width: 2px; + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); +} +.e-component.material-design.e-checkbox .sub-checkbox.checked.box { + border: solid 2px; + -webkit-animation: box-shrink 140ms ease-out forwards; + animation: box-shrink 140ms ease-out forwards; +} +.e-component.material-design.e-checkbox .sub-checkbox.checked.checkmark { + border-left: none; + border-top: none; + -webkit-animation: checkmark-expand 140ms ease-out forwards; + animation: checkmark-expand 140ms ease-out forwards; +} +.e-component.material-design.e-checkbox .sub-checkbox.unchecked.box { + -webkit-animation: box-expand 140ms ease-out forwards; + animation: box-expand 140ms ease-out forwards; +} +.e-component.material-design.e-checkbox .sub-checkbox.unchecked.checkmark { + border-left: none; + border-top: none; + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + -webkit-animation: checkmark-shrink 140ms ease-out forwards; + animation: checkmark-shrink 140ms ease-out forwards; +} +.e-component.material-design.e-checkbox.disabled .sub-checkbox { + border-color: #aaa; + cursor: not-allowed; + color: #aaa; +} +.e-component.material-design.e-checkbox.disabled .sub-label { + cursor: not-allowed; + color: #aaa; +} +@-webkit-keyframes box-shrink { + 0% { + top: 0px; + left: 0px; + width: 18px; + height: 18px; + border: solid 2px #999; + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + top: 13px; + left: 5px; + width: 4px; + height: 4px; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + } +} +@keyframes box-shrink { + 0% { + top: 0px; + left: 0px; + width: 18px; + height: 18px; + border: solid 2px #999; + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + top: 13px; + left: 5px; + width: 4px; + height: 4px; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + } +} +@-webkit-keyframes checkmark-expand { + 0% { + top: 13px; + left: 5px; + width: 4px; + height: 4px; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + } + 100% { + /* top: -4px; + left: 6px; + width: 10px; + height: 21px;*/ + top: -1px; + left: 5px; + width: 10px; + height: 18px; + border-right-width: 2px; + border-bottom-width: 2px; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + } +} +@keyframes checkmark-expand { + 0% { + top: 13px; + left: 5px; + width: 4px; + height: 4px; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + } + 100% { + /* top: -4px; + left: 6px; + width: 10px; + height: 21px;*/ + top: -1px; + left: 5px; + width: 10px; + height: 18px; + border-right-width: 2px; + border-bottom-width: 2px; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + } +} +@-webkit-keyframes checkmark-shrink { + 0% { + /* top: -4px; + left: 6px; + width: 10px; + height: 21px;*/ + top: -1px; + left: 5px; + width: 10px; + height: 18px; + border-right-width: 2px; + border-bottom-width: 2px; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + } + 100% { + top: 13px; + left: 5px; + width: 4px; + height: 4px; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + } +} +@keyframes checkmark-shrink { + 0% { + /* top: -4px; + left: 6px; + width: 10px; + height: 21px;*/ + top: -1px; + left: 5px; + width: 10px; + height: 18px; + border-right-width: 2px; + border-bottom-width: 2px; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + } + 100% { + top: 13px; + left: 5px; + width: 4px; + height: 4px; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + } +} +@-webkit-keyframes box-expand { + 0% { + top: 13px; + left: 5px; + width: 4px; + height: 4px; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + } + 100% { + top: 0px; + left: 0px; + width: 18px; + height: 18px; + border: solid 2px #999; + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } +} +@keyframes box-expand { + 0% { + top: 13px; + left: 5px; + width: 4px; + height: 4px; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + } + 100% { + top: 0px; + left: 0px; + width: 18px; + height: 18px; + border: solid 2px #999; + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } +} +.b-system-drop-down .b-toolbar { + position: absolute; + top: 0; + right: 0; + height: 30px; + padding: 10px 8px; + z-index: 103; +} +.b-system-drop-down .e-facebook-name { + display: inline-block; + padding-top: 4px; +} +.b-system-drop-down .btn.system-dropdown { + padding-left: 10px; + padding-right: 10px; +} +.b-system-drop-down .button-fb-logout { + margin: 5px; +} +.b-system-drop-down .email-title { + display: inline-block; + max-width: 200px; + text-align: left; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + overflow: hidden; + margin-right: 28px; + vertical-align: middle; +} +.b-system-drop-down .logoPlace { + margin: -5px 10px 0 0; + font-size: 25px; + line-height: 30px; + height: 40px; +} +.b-system-drop-down .audioPlace { + font-size: 25px; + line-height: 30px; + margin-right: 10px; + width: 25px; +} +.b-system-drop-down .audioPlace .playIcon, +.b-system-drop-down .audioPlace .stopIcon { + cursor: pointer; + color: orange; + text-shadow: 0 1px 0 #555; + float: right; +} +.b-system-drop-down .audioPlace .playIcon { + margin-top: 5px; +} +.b-system-drop-down .audioPlace .stopIcon { + font-size: 30px; + line-height: 30px; + margin-right: 10px; +} +.b-system-drop-down .audioPlace .stopIcon { + display: none; +} +.b-system-drop-down .audioPlace:hover .playIcon { + display: none; +} +.b-system-drop-down .audioPlace:hover .stopIcon { + display: inline-block; +} +.b-system-drop-down .accountPlace { + background-color: #000; + background-color: rgba(0, 0, 0, 0.5); + color: #fff; + text-shadow: 0 1px 0 #000; + display: inline-block; + height: 29px; + max-width: 250px; + font-size: 16px; + line-height: 30px; + padding: 1px 8px; + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + border-radius: 4px; + font-weight: bold; + margin-right: 5px; + white-space: nowrap; +} +.b-system-drop-down .account-item .icon-ok { + display: none; +} +.b-system-drop-down .account-item.current .icon-ok { + display: inline-block; +} +.b-system-drop-down .account-item.current .icon-user { + display: none; +} +.b-system-drop-down .counter { + display: inline-block; +} +.b-system-drop-down .g-ui-menu .e-link.account-item { + padding-right: 5px; +} +html.ssm-state-mobile .accountPlace { + max-width: 150px !important; +} +@-webkit-keyframes firstBar { + 0% { + height: 30%; + } + 50% { + height: 100%; + } + 100% { + height: 30%; + } +} +@keyframes firstBar { + 0% { + height: 30%; + } + 50% { + height: 100%; + } + 100% { + height: 30%; + } +} +@-webkit-keyframes secondBar { + 0% { + height: 90%; + } + 50% { + height: 30%; + } + 100% { + height: 100%; + } +} +@keyframes secondBar { + 0% { + height: 90%; + } + 50% { + height: 30%; + } + 100% { + height: 100%; + } +} +@-webkit-keyframes thirdBar { + 0% { + height: 20%; + } + 40% { + height: 40%; + } + 60% { + height: 80%; + } + 100% { + height: 40%; + } +} +@keyframes thirdBar { + 0% { + height: 20%; + } + 40% { + height: 40%; + } + 60% { + height: 80%; + } + 100% { + height: 40%; + } +} +.equaliser { + width: 20px; + height: 20px; + position: relative; +} +.equaliser .bar { + float: left; + width: 5px; + height: 5px; + background: orange; + position: absolute; + bottom: 0; +} +.equaliser .first { + left: 0px; + -webkit-animation: none; + animation: none; +} +.equaliser .second { + left: 7px; + -webkit-animation: none; + animation: none; +} +.equaliser .third { + left: 14px; + -webkit-animation: none; + animation: none; +} +.equaliser.animated .first { + -webkit-animation: firstBar 1s infinite; + animation: firstBar 1s infinite; +} +.equaliser.animated .second { + -webkit-animation: secondBar 1s infinite; + animation: secondBar 1s infinite; +} +.equaliser.animated .third { + -webkit-animation: thirdBar 1s infinite; + animation: thirdBar 1s infinite; +} +.b-login-content { + height: 100%; + text-align: center; +} +.b-login-content .loginFormWrapper { + display: inline-block; + vertical-align: middle; + text-align: center; + -webkit-perspective: 500px; + perspective: 500px; + /* .control-label { + font-size: 16px; + line-height: 30px; + }*/ +} +.b-login-content .loginFormWrapper .descWrapper { + margin-bottom: 10px; +} +.b-login-content .loginFormWrapper .descWrapper .desc { + font-size: 18px; + padding: 2px; +} +.b-login-content .loginFormWrapper .alertError { + max-width: 450px; +} +.b-login-content .loginFormWrapper .loginForm { + background-color: #efefef; + text-align: left; + color: #333; + margin: 0; + float: none; + width: 303px; +} +.b-login-content .loginFormWrapper .loginWelcomeForm { + display: none; +} +.b-login-content .loginFormWrapper .welcome-on { + display: block; +} +.b-login-content .loginFormWrapper .welcome-off { + display: none; +} +.b-login-content .loginFormWrapper .controls, +.b-login-content .loginFormWrapper .control-group { + margin-bottom: 25px; +} +.b-login-content .loginFormWrapper .wrapper { + padding: 40px 40px 20px 40px; +} +.b-login-content .loginFormWrapper #recaptcha_image img { + border: 1px solid #ccc; + border-radius: 3px; +} +.b-login-content .loginFormWrapper .controls .inputLoginForm, +.b-login-content .loginFormWrapper .controls .inputEmail, +.b-login-content .loginFormWrapper .controls .inputLogin, +.b-login-content .loginFormWrapper .controls .inputPassword, +.b-login-content .loginFormWrapper .controls .inputAdditionalCode { + font-size: 18px; + height: 40px; + line-height: 20px; + padding-left: 12px; + padding-right: 12px; +} +.b-login-content .loginFormWrapper .languageLabel { + margin-top: 5px; +} +.b-login-content .loginFormWrapper .signMeLabel .e-checkbox { + margin-top: 5px; +} +.b-login-content .loginFormWrapper .languageLabel { + margin-right: 5px; +} +.b-login-content .loginFormWrapper .input-append .add-on { + position: relative; + height: 30px; + background: none; + margin-left: -35px; + z-index: 1000; + border: 0px; +} +.b-login-content .loginFormWrapper .input-append .add-on i { + font-size: 17px; + line-height: 29px; + color: #999; +} +.b-login-content .loginFormWrapper .input-append .add-on i.login-submit-icon { + font-size: 24px; + padding-top: 2px; + cursor: pointer; +} +.b-login-content .loginFormWrapper .controls.error .add-on i, +.b-login-content .loginFormWrapper .control-group.error .add-on i { + color: #b94a48; +} +.b-login-content .buttonLogin { + margin: 0; +} +.b-login-content .alert { + margin: 0 0 20px 0; + text-align: left; +} +.b-login-content .loginAfter { + display: inline-block; + height: 90%; + vertical-align: middle; + width: 0px; +} +.b-login-content .flag-selector { + margin-bottom: 0; +} +.b-login-content .social-buttons { + margin-top: 5px; +} +.b-login-content .social-button, +.b-login-content .language-button { + padding: 5px; + outline: none; +} +@-webkit-keyframes loginRotation { + to { + -webkit-transform: rotate(1turn); + transform: rotate(1turn); + } +} +@keyframes loginRotation { + to { + -webkit-transform: rotate(1turn); + transform: rotate(1turn); + } +} +.submitting-pane { + position: relative; +} +.submitting-pane.submitting:before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: transparent; + background: rgba(0, 0, 0, 0.3); + z-index: 1051; + border-radius: 8px; +} +html.cssanimations .submitting-pane.submitting:after { + content: ''; + position: absolute; + width: 60px; + height: 60px; + top: 50%; + left: 50%; + margin-top: -30px; + margin-left: -30px; + border: 8px solid transparent; + border-color: transparent; + border-top-color: #fff; + -webkit-animation: loginRotation 1s infinite ease-in-out; + animation: loginRotation 1s infinite ease-in-out; + border-radius: 50%; + z-index: 1052; +} +.btn-submit-icon-wrp { + border: none; + background: none; + display: inline-block; + margin: 0; + padding: 0; + outline: none; + cursor: pointer; +} +.popups .b-welcom-page-content .modal-header { + background-color: #fff; +} +.popups .b-ask-content .modal-header { + background-color: #fff; +} +.popups .b-ask-content .modal-body { + text-align: center; +} +.popups .b-ask-content .desc-place { + font-size: 18px; +} +.popups .b-shortcuts-content.modal { + width: 700px; +} +.popups .b-shortcuts-content .modal-header { + background-color: #fff; +} +.b-folders { + /**/ + /**/ +} +.b-folders .move-action-content-wrapper { + z-index: -1; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + opacity: 0.05; + background-color: #fff; + background-size: 60px 60px; + background-image: -o-linear-gradient(315deg, #000 25%, transparent 25%, transparent 50%, #000 50%, #000 75%, transparent 75%, transparent); + background-image: linear-gradient(135deg, #000 25%, transparent 25%, transparent 50%, #000 50%, #000 75%, transparent 75%, transparent); +} +.b-folders .b-folders-user .e-link.print-count.system .badge { + display: none !important; +} +.b-folders .b-toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 30px; + padding: 10px 0 0 8px; + color: #fff; + z-index: 101; +} +.b-folders .b-footer { + position: absolute; + bottom: 10px; + right: 0; + left: 0; + height: 30px; + padding: 0 10px 0 5px; + z-index: 101; + overflow: hidden; + white-space: nowrap; +} +.b-folders .b-content { + position: absolute; + top: 58px; + bottom: 45px; + left: 0; + right: 0; + overflow: hidden; + overflow-y: auto; + min-width: 100px; +} +.b-folders .b-content .content { + -webkit-overflow-scrolling: touch; +} +.b-folders .b-list-delimiter { + margin: 10px; + border-top: 0px solid #000; + border-bottom: 1px solid #999; +} +.b-folders .b-content .e-item { + overflow: hidden; + white-space: nowrap; +} +.b-folders .b-content .e-item .e-link { + display: block; + position: relative; + z-index: 1; + height: 34px; + line-height: 34px; + background-color: transparent; + vertical-align: middle; + color: grey; + cursor: not-allowed; + font-size: 14px; + padding: 0; + padding-left: 10px; + padding-right: 10px; + outline: 0; + text-decoration: none; +} +.b-folders .b-content .e-item .e-link .focused-poiner { + float: left; + display: inline-block; + background-color: transparent; + height: 100%; + width: 3px; + position: absolute; + top: 0; + left: 0; +} +.b-folders .b-content .e-item .e-link .inbox-star-icon { + display: none; + margin-left: 7px; +} +.b-folders .b-content .e-item .e-link .inbox-star-icon .icon-star { + display: none; +} +.b-folders .b-content .e-item .e-link .inbox-star-icon .icon-star-empty { + opacity: .5; +} +.b-folders .b-content .e-item .e-link .inbox-star-icon .icon-star-empty:hover { + opacity: 1; +} +.b-folders .b-content .e-item .e-link.is-inbox .inbox-star-icon { + display: inline; +} +.b-folders .b-content .e-item .e-link.selectable { + color: #000; + cursor: pointer; +} +.b-folders .b-content .e-item .e-link.selectable:hover, +.b-folders .b-content .e-item .e-link.selectable.selected, +.b-folders .b-content .e-item .e-link.selectable.focused, +.b-folders .b-content .e-item .e-link.selectable.droppableHover { + background-color: #555; + color: #fff; +} +.b-folders .b-content .e-item .e-link.selectable.focused { + color: #fff; +} +.b-folders .b-content .e-item .e-link.focused { + background-color: #888; +} +.b-folders .b-content .e-item .e-link.focused .focused-poiner { + background-color: #fff; +} +.b-folders .b-content .e-item .e-link.system { + cursor: default; + color: grey; +} +.b-folders .b-content .e-item .e-link .count { + position: relative; + display: none; + margin-top: 5px; + line-height: 19px; +} +.b-folders .b-content .e-item .e-link.print-count { + font-weight: bold; +} +.b-folders .b-content .e-item .e-link.print-count .count { + display: inline; +} +.b-folders .b-content .e-item .e-link.unread-sub { + font-weight: bold; +} +.b-folders .b-content .e-item .e-link .e-collapsed-sign { + cursor: pointer; + width: 22px; + height: 30px; + line-height: 30px; + text-align: center; + vertical-align: inherit; +} +.b-folders .b-content .e-item .hidden.e-link { + display: none; +} +.b-folders .b-content .e-item .b-sub-folders.collapsed { + max-height: 0; + height: 0; + display: none; +} +.b-folders.inbox-is-starred .icon-star { + color: orange; + display: inline-block !important; +} +.b-folders.inbox-is-starred .icon-star-empty { + display: none; +} +.b-folders .b-folder-system-item { + font-weight: bold; +} +.b-folders .b-sub-folders .e-item .e-link { + padding-left: 25px; +} +.b-folders .b-sub-folders .b-sub-folders .e-item .e-link { + padding-left: 40px; +} +.b-folders .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link { + padding-left: 55px; +} +.b-folders .b-sub-folders .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link { + padding-left: 70px; +} +.b-folders.single-root-inbox .i-am-inbox.e-link { + display: none !important; +} +.b-folders.single-root-inbox .i-am-inbox-wrapper > .b-sub-folders { + max-height: none !important; + height: inherit !important; + display: block !important; +} +.b-folders.single-root-inbox .i-am-inbox-wrapper .b-sub-folders .e-item .e-link { + padding-left: 10px; +} +.b-folders.single-root-inbox .i-am-inbox-wrapper .b-sub-folders .b-sub-folders .e-item .e-link { + padding-left: 25px; +} +.b-folders.single-root-inbox .i-am-inbox-wrapper .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link { + padding-left: 40px; +} +.b-folders.single-root-inbox .i-am-inbox-wrapper .b-sub-folders .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link { + padding-left: 55px; +} +.btn .btn-text-wrp { + padding-left: 7px; + white-space: normal; +} +.btn.buttonCompose { + width: calc(100% - 85px); + max-width: -webkit-fit-content; + max-width: -moz-fit-content; + max-width: fit-content; + white-space: nowrap; + overflow: hidden; + height: 19px; + display: inline-block; + margin-top: 1px; +} +html.rl-left-panel-disabled .buttonComposeText, +html.rl-left-panel-short .buttonComposeText { + display: none; +} +html.rl-left-panel-disabled .btn.buttonCompose, +html.rl-left-panel-short .btn.buttonCompose { + width: auto; +} +html.rl-left-panel-disabled .btn.buttonContacts, +html.rl-left-panel-short .btn.buttonContacts { + margin-top: 10px !important; + margin-left: 0 !important; +} +html.rl-left-panel-disabled.rl-mobile #rl-left, +html.rl-left-panel-short.rl-mobile #rl-left { + visibility: hidden; +} +html.rl-mobile .btn.buttonCompose { + width: 100%; +} +html.rl-mobile .btn.buttonContacts { + display: none; +} +.popups .b-folder-clear-content .modal-header { + background-color: #fff; +} +.popups .b-folder-create-content .modal-header { + background-color: #fff; +} +.popups .b-folder-system-content .modal-header { + background-color: #fff; +} +.popups .b-filter-content { + width: 750px; +} +.popups .b-filter-content .modal-header { + background-color: #fff; +} +.popups .b-filter-content .button-delete { + cursor: pointer; +} +.popups .b-filter-content .setRecipientsBtn { + margin-top: -2px; + margin-left: 5px; +} +.popups .b-languages-content.modal { + width: 700px; +} +.popups .b-languages-content.exp { + width: 701px; +} +.popups .b-languages-content .modal-header { + background-color: #fff; +} +.popups .b-languages-content .lang-item { + display: inline-block; + padding: 5px 15px; + margin: 2px 5px; + width: 180px; + background-color: #fff; + text-align: left; + border: 1px solid transparent; + border-radius: 2px; +} +.popups .b-languages-content .lang-item.user { + background-color: #fffddd; + border-color: #fff555; +} +.popups .b-languages-content .lang-item.selected { + background-color: #f5f5f5; + border-color: #ccc; +} +.popups .b-languages-content .lang-item:hover { + background-color: #eee; + border-color: #ccc; +} +html.rl-mobile .b-languages-content .lang-item { + width: calc(100% - 40px); +} +.popups .b-account-add-content .modal-header { + background-color: #fff; +} +.popups .b-template-add-content.modal { + width: 750px; +} +.popups .b-template-add-content .modal-header { + background-color: #fff; +} +.popups .b-template-add-content .e-template-place { + height: 300px; +} +.popups .b-open-pgp-key-view-content .modal-header, +.popups .b-open-pgp-key-generate-content .modal-header, +.popups .b-open-pgp-key-add-content .modal-header, +.popups .b-compose-open-pgp-content .modal-header, +.popups .b-message-open-pgp-content .modal-header { + background-color: #fff; +} +.popups .b-open-pgp-key-view-content.modal, +.popups .b-open-pgp-key-generate-content.modal, +.popups .b-open-pgp-key-add-content.modal, +.popups .b-compose-open-pgp-content.modal, +.popups .b-message-open-pgp-content.modal { + width: 570px; +} +.popups .b-open-pgp-key-view-content .inputKey, +.popups .b-open-pgp-key-generate-content .inputKey, +.popups .b-open-pgp-key-add-content .inputKey, +.popups .b-compose-open-pgp-content .inputKey, +.popups .b-message-open-pgp-content .inputKey { + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; +} +.popups .b-open-pgp-key-view-content .key-viewer, +.popups .b-open-pgp-key-generate-content .key-viewer, +.popups .b-open-pgp-key-add-content .key-viewer, +.popups .b-compose-open-pgp-content .key-viewer, +.popups .b-message-open-pgp-content .key-viewer { + max-height: 500px; + overflow: auto; +} +.popups .b-compose-open-pgp-content.modal { + width: 800px; +} +.popups .b-compose-open-pgp-content .key-list { + background-color: #f9f9f9; + border-radius: 5px; + padding: 10px 15px; + margin-top: 10px; + min-height: 40px; +} +.popups .b-compose-open-pgp-content .key-list-wrp:hover { + overflow: auto; +} +.popups .b-compose-open-pgp-content .key-list-wrp:hover .key-list__item-name { + overflow: visible; +} +.popups .b-compose-open-pgp-content .key-list-wrp.empty { + text-align: center; + padding-top: 10px; + color: #aaa; + font-size: 16px; +} +.popups .b-compose-open-pgp-content .key-list__item { + color: #333; + white-space: nowrap; + padding-bottom: 4px; +} +.popups .b-compose-open-pgp-content .key-list__item:last-child { + padding-bottom: 0; +} +.popups .b-compose-open-pgp-content .key-list__item-delete { + cursor: pointer; +} +.popups .b-compose-open-pgp-content .key-list__item-delete.disabled { + cursor: not-allowed; +} +.popups .b-compose-open-pgp-content .key-list__item-names { + color: #333; +} +.popups .b-compose-open-pgp-content .key-list__item-names.empty { + color: red; +} +.popups .b-compose-open-pgp-content .key-list__item-name { + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; +} +.popups .b-compose-open-pgp-content .key-list__item-error { + color: red; +} +.popups .b-compose-open-pgp-content .key-list__item-hash { + color: #aaa; +} +.popups .b-compose-open-pgp-content .key-actions { + margin-top: 10px; + min-height: 40px; +} +.popups .b-compose-open-pgp-content .key-actions select option.even { + background-color: #f5f5f5; +} +.popups .b-message-open-pgp-content.modal { + width: 700px; +} +.popups .b-message-open-pgp-content .key-list { + margin-top: 5px; + overflow: hidden; +} +.popups .b-message-open-pgp-content .key-list__item { + color: #555; + cursor: pointer; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; +} +.popups .b-message-open-pgp-content .key-list__item__radio { + padding: 3px 5px 0 0; + vertical-align: top; +} +.popups .b-message-open-pgp-content .key-list__item__name { + border-bottom: 1px solid transparent; +} +.popups .b-message-open-pgp-content .key-list__item__names { + display: inline-block; +} +.popups .b-message-open-pgp-content .key-list__item__names:hover .key-list__item__name { + border-bottom: 1px dashed #555; +} +.popups .b-open-pgp-key-add-content.modal { + width: 645px; +} +.popups .b-open-pgp-key-add-content.modal .inputKey { + width: 600px; +} +.popups .b-two-factor-content { + width: 750px; +} +.popups .b-two-factor-content .modal-body { + min-height: 100px; +} +.popups .b-two-factor-content .modal-header { + background-color: #fff; +} +.popups .b-two-factor-test-content .modal-header { + background-color: #fff; +} +.popups .b-identity-content.modal { + width: 750px; +} +.popups .b-identity-content .modal-header { + background-color: #fff; +} +.popups .b-identity-content .modal-body { + overflow: hidden; +} +.popups .b-identity-content .control-label { + width: 100px; +} +.popups .b-identity-content .controls { + margin-left: 120px; +} +.popups .b-identity-content .e-signature-place { + height: 200px; +} +.popups .b-identity-content .textEmail { + margin-top: 5px; + font-weight: bold; +} +.popups .b-advanced-search-content.modal { + width: 750px; +} +.popups .b-advanced-search-content.modal .control-label { + width: 100px; +} +.popups .b-advanced-search-content.modal .controls { + margin-left: 110px; +} +.popups .b-advanced-search-content .modal-header { + background-color: #fff; +} +.attachmentItem { + position: relative; + display: inline-block; + margin: 5px; + max-width: 200px; + min-width: 60px; + overflow: hidden; + list-style: none; + line-height: 24px; + border: 0; + background-color: #fff; + -webkit-box-shadow: 0 1px 4px #ccc; + box-shadow: 0 1px 4px #ccc; + -webkit-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2); + box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.04), 0 1px 5px rgba(0, 0, 0, 0.1); + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.04), 0 1px 5px rgba(0, 0, 0, 0.1); + border-radius: 3px; + /* + .attachmentIconParent.hasPreview.isImage { + .iconMain { + display: none; + } + } +*/ +} +.attachmentItem.waiting { + opacity: 0.6; +} +.attachmentItem.checked { + -webkit-box-shadow: 0 1px 4px #00a; + box-shadow: 0 1px 4px #00a; + -webkit-box-shadow: 0 1px 5px rgba(0, 0, 255, 0.3); + box-shadow: 0 1px 5px rgba(0, 0, 255, 0.3); + -webkit-box-shadow: 0 0 0 1px rgba(0, 0, 255, 0.1), 0 1px 5px rgba(0, 0, 255, 0.2); + box-shadow: 0 0 0 1px rgba(0, 0, 255, 0.1), 0 1px 5px rgba(0, 0, 255, 0.2); +} +.attachmentItem .checkedParent { + position: absolute; + top: 0; + right: 0; + padding: 1px 4px 0px 5px; + background: #FAFAFA; + border: 0px solid #CCC; +} +.attachmentItem .attachmentSize { + font-size: 12px; + color: #999; +} +.attachmentItem.error .attachmentIcon, +.attachmentItem.error .attachmentSize, +.attachmentItem.error .attachmentName { + color: red; +} +.attachmentItem .attachmentIconParent { + position: relative; + height: 56px; + width: 60px; + background: none; +} +.attachmentItem .attachmentIconParent .iconPreview, +.attachmentItem .attachmentIconParent .iconBG, +.attachmentItem .attachmentIconParent .iconMain, +.attachmentItem .attachmentIconParent .iconProgress { + position: absolute; + top: 0; + left: 0; + display: inline-block; + width: 100%; + height: 100%; +} +.attachmentItem .attachmentIconParent .iconProgress { + background: #eee; + width: 0%; +} +.attachmentItem .attachmentIconParent .iconBG { + font-size: 18px; + text-align: center; + color: #999; + font-weight: bold; + line-height: 55px; + text-shadow: 0 1px 0 #fff; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.8); +} +.attachmentItem .attachmentIconParent .iconPreview { + display: none; + background: #555; + background-image: none; + background: rgba(0, 0, 0, 0.5) !important; +} +.attachmentItem .attachmentIconParent .iconPreview .attachmentIcon { + color: #fff; + text-shadow: 0 1px 0 #000; +} +.attachmentItem .attachmentNameParent { + position: relative; + margin-left: 60px; + padding: 4px 4px 3px 6px; + min-width: 90px; + cursor: pointer; + color: #333; + background: #fafafa; + border-left: 1px solid #ddd; +} +.attachmentItem .attachmentIcon { + margin: 6px 0 0 13px; + font-size: 36px; + width: 36px; + height: 36px; + color: #aaa; +} +.attachmentItem .attachmentIcon.icon-none { + display: none; +} +.attachmentItem .attachmentIcon.icon-file-certificate { + margin-left: 15px; +} +.attachmentItem .attachmentIconText { + display: inline-block; + font-size: 28px; + width: 60px; + height: 56px; + color: #aaa; + line-height: 56px; + text-align: center; + font-style: normal; +} +.attachmentItem .attachmentIconParent.hasPreview:hover .iconPreview { + display: inline-block; +} +.attachmentItem .attachmentIconParent.hasPreview:hover .iconMain { + display: none; +} +.attachmentItem .attachmentIconParent.hasPreplay:hover .iconPreview { + display: inline-block; +} +.attachmentItem .attachmentIconParent.hasPreplay:hover .iconMain { + display: none; +} +.attachmentItem .showPreview, +.attachmentItem .showPreplay { + display: none; + cursor: pointer; +} +.attachmentItem .attachmentIconParent.hasPreview .showPreview { + display: inline; +} +.attachmentItem .attachmentIconParent.hasPreview .hidePreview { + display: none; +} +.attachmentItem .attachmentIconParent.hasPreplay .showPreplay { + display: inline; +} +.attachmentItem .attachmentIconParent.hasPreplay .hidePreview { + display: none; +} +html.rl-no-preview-pane .messageList.message-selected { + display: none; +} +.messageList .toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 30px; + padding: 10px 1px; + z-index: 102; + white-space: nowrap; +} +.messageList .b-footer { + position: absolute; + bottom: 0; + right: 0; + left: 0; + height: 30px; + padding: 7px; + z-index: 101; + background-color: #eee; + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; +} +.messageList .b-footer .e-quota { + display: inline-block; + margin-top: 5px; + margin-left: 5px; + font-size: 18px; + cursor: help; +} +.messageList .b-footer .e-quota:hover { + border-bottom: 1px dashed #333; +} +.messageList .inputSearch { + width: 258px; +} +.messageList .btn.buttonMoreSearch { + padding-left: 8px; + padding-right: 8px; +} +.messageList .b-message-list-wrapper { + position: absolute; + top: 50px; + right: 0; + left: 0; + bottom: 5px; + border: 1px solid #aaa; + -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.2); + box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.2); + border-radius: 5px; + z-index: 101; +} +.messageList .second-toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 29px; + padding: 10px 8px 10px 11px; + z-index: 101; + white-space: nowrap; + background-color: #eee; + border-top-right-radius: 5px; + border-top-left-radius: 5px; +} +.messageList .second-toolbar .checkboxCkeckAll { + margin: 5px 0; +} +.messageList .line-loading { + position: absolute; + left: 0; + right: 0; + z-index: 102; + height: 0px; + top: 50px; +} +.messageList .mainDelimiter { + position: absolute; + left: 0; + right: 0; + height: 1px; + z-index: 101; + background-color: #bbb; +} +.messageList .toolbarDelimiter { + top: 49px; +} +.messageList .footerDelimiter { + bottom: 44px; +} +.messageList .b-content { + position: absolute; + top: 50px; + bottom: 45px; + left: 0; + right: 0; + padding: 0; + overflow-x: hidden; + overflow-y: auto; + z-index: 101; + -webkit-box-sizing: border-box; + box-sizing: border-box; + background-color: #fff; +} +.messageList .b-content .content { + -webkit-overflow-scrolling: touch; +} +.messageList .b-content .listClear { + color: #333; + text-align: center; + padding: 10px; + font-size: 14px; + line-height: 13px; +} +.messageList .b-content .listEmptyList, +.messageList .b-content .listEmptyListLoading, +.messageList .b-content .listDragOver, +.messageList .b-content .listError, +.messageList .b-content .listEmptySearchList { + color: #999; + text-align: center; + padding: 60px 10px; + font-size: 24px; + line-height: 30px; +} +.messageList .b-content .listEmptyList .e-icon, +.messageList .b-content .listEmptyListLoading .e-icon, +.messageList .b-content .listDragOver .e-icon, +.messageList .b-content .listError .e-icon, +.messageList .b-content .listEmptySearchList .e-icon { + font-size: 24px; + line-height: 30px; +} +.messageList .b-content .listDragOver { + max-height: 0; + overflow: hidden; + padding: 0 10px; +} +.messageList .b-content .listDragOver.viewAppendArea { + max-height: 120px; + padding: 30px 10px; +} +.messageList .b-content .listDragOver.dragOverEnter { + background-color: #e0fdda; + color: #333; +} +.messageList .b-content .listError { + color: #DA4F49; +} +.messageList .b-content .listSearchDesc { + font-size: 18px; + padding: 15px; + border-bottom: 1px solid #eee; +} +html.rl-mobile .messageList .b-content .listSearchDesc { + font-size: 16px; + padding: 12px; +} +.messageList .b-content .listThreadUidDesc { + font-size: 16px; + padding: 7px 20px 6px 20px; + background-color: #aaa; + border-bottom: 1px solid #888; + color: #fff; + cursor: pointer; + text-shadow: 0 1px 0 #000; + text-align: center; +} +.messageList .b-content .delimiter { + display: block; + height: 1px; + background-color: #e5e5e5; +} +.messageList .b-content .messageListItem:last-child { + border-bottom: 1px solid #e5e5e5; +} +.messageList .b-content .messageListItem:last-child.selected { + border-bottom: 1px solid #bfd5ef; +} +.messageList .b-content .fullThreadsParent { + height: 25px; + padding: 3px 5px; + background-color: #f4f4f4; + text-align: center; +} +.messageList .b-content .messageListItem { + position: relative; + height: 52px; + max-height: 60px; + font-size: 12px; + line-height: 21px; + overflow: hidden; + cursor: pointer; + margin: 0px; + border: 0px solid transparent; + z-index: 100; + background-color: #f9f9f9; + /* &:nth-child(even) { + background-color: #f3f3f3; + }*/ + /* + &.hasParentMessage { + background-color: #ecf0f1; + + .sidebarParent { + background-color: #bdc3c7; + } + + &.focused .sidebarParent { + background-color: darken(#bdc3c7, 10%) !important; + } + + &.unseen { + background-color: darken(#ecf0f1, 5%); + + .sidebarParent { + background-color: darken(#bdc3c7, 30%); + } + + &.focused .sidebarParent { + background-color: darken(#bdc3c7, 40%) !important; + } + } + } +*/ +} +.messageList .b-content .messageListItem .delimiter { + position: relative; + display: block; + height: 1px; + background-color: #999; + opacity: 0.2; + filter: alpha(opacity=20); +} +.messageList .b-content .messageListItem .wrapper { + padding: 5px 0; +} +.messageList .b-content .messageListItem .sidebarParent { + display: inline-block; + width: 6px; + background-color: #eee; + float: left; + height: 100%; +} +.messageList .b-content .messageListItem.focused { + background-color: #f5f5f5; +} +.messageList .b-content .messageListItem.focused .sidebarParent { + background-color: #ccc !important; +} +.messageList .b-content .messageListItem .importantMark { + display: none; + color: red; + margin-right: 5px; +} +.messageList .b-content .messageListItem.deleted-mark { + opacity: .7; +} +.messageList .b-content .messageListItem.deleted-mark .sender, +.messageList .b-content .messageListItem.deleted-mark .subject, +.messageList .b-content .messageListItem.deleted-mark .subject-prefix, +.messageList .b-content .messageListItem.deleted-mark .subject-suffix { + text-decoration: line-through; +} +.messageList .b-content .messageListItem.important .importantMark { + display: inline; +} +.messageList .b-content .messageListItem.e-single-line { + height: 35px; +} +.messageList .b-content .messageListItem.e-single-line .wrapper { + line-height: 25px; + padding: 5px; +} +.messageList .b-content .messageListItem.new { + max-height: 0px; +} +.messageList .b-content .messageListItem.deleted { + max-height: 0px; + border-color: transparent !important; +} +.messageList .b-content .messageListItem .checkedParent { + display: inline-block; + float: left; + margin-top: 11px; + padding: 0 8px 0 6px; + font-size: 14px; +} +.messageList .b-content .messageListItem.e-single-line .checkedParent { + margin-top: 1px; +} +.messageList .b-content .messageListItem .flagParent { + display: inline-block; + float: right; + padding: 0 10px 0 5px; +} +.messageList .b-content .messageListItem.e-single-line .flagParent { + float: left; + padding: 0 8px 0 2px; +} +.messageList .b-content .messageListItem .dateParent { + display: inline-block; + float: right; + position: relative; + margin: 0 5px; + color: #999; + font-size: 11px; +} +.messageList .b-content .messageListItem .threadsParent { + display: inline-block; + float: right; + position: relative; +} +.messageList .b-content .messageListItem .attachmentParent { + display: inline-block; + float: right; + position: relative; + margin: 2px 10px 0 5px; +} +.messageList .b-content .messageListItem.e-single-line .attachmentParent { + float: left; + margin: 0 8px 0 0; +} +.messageList .b-content .messageListItem .senderParent { + display: block; + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; +} +.messageList .b-content .messageListItem .threadsCountParent { + display: inline; + overflow: hidden; + background-color: #eee; + padding: 1px 5px; + margin-right: 5px; + border: 1px solid #ccc; + border-radius: 5px; +} +.messageList .b-content .messageListItem .threadsCountParent.lastSelected { + background-color: #999; + border-color: #999; + color: #fff; +} +.messageList .b-content .messageListItem .threadsCountParent:hover { + border-color: #666; +} +.messageList .b-content .messageListItem.e-single-line .senderParent { + display: inline-block; + -o-text-overflow: none; + text-overflow: none; + width: 200px; + float: left; + font-weight: normal; +} +.messageList .b-content .messageListItem .subjectParent { + display: block; + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + color: #000; +} +.messageList .b-content .messageListItem .senderParent, +.messageList .b-content .messageListItem .subjectParent, +.messageList .b-content .messageListItem .dateParent { + white-space: nowrap; +} +.messageList .b-content .messageListItem .subjectParent .emptySubjectText { + display: none; + font-style: italic; + color: #999; +} +.messageList .b-content .messageListItem.emptySubject .subjectParent .subject, +.messageList .b-content .messageListItem.emptySubject .subjectParent .subject-prefix, +.messageList .b-content .messageListItem.emptySubject .subjectParent .subject-suffix { + display: none; +} +.messageList .b-content .messageListItem.emptySubject .subjectParent .emptySubjectText { + display: inline; +} +.messageList .b-content .messageListItem .sender, +.messageList .b-content .messageListItem .subject, +.messageList .b-content .messageListItem .subject-suffix { + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; +} +.messageList .b-content .messageListItem .threads-len .threads-len-data { + background-color: #eee; + color: #666; + border-radius: 6px; + padding: 2px 0px 1px 6px; + margin-right: 2px; + border: 1px solid #ccc; +} +.messageList .b-content .messageListItem .threads-len .threads-len-data [class^="icon-"], +.messageList .b-content .messageListItem .threads-len .threads-len-data [class*=" icon-"] { + font-size: 14px; +} +.messageList .b-content .messageListItem .threads-len .threads-len-data:hover { + background-color: #aaa; + border-color: #666; + text-shadow: 0 1px 0 #999; + color: #fff; +} +.messageList .b-content .messageListItem .subject-prefix { + color: #888; + /*font-style: italic;*/ +} +.messageList .b-content .messageListItem .attachment { + display: none; +} +.messageList .b-content .messageListItem .flagOff, +.messageList .b-content .messageListItem .flagOn, +.messageList .b-content .messageListItem .flagOnHalf { + cursor: pointer; + display: inline-block; +} +.messageList .b-content .messageListItem .flagOff { + opacity: 0.5; +} +.messageList .b-content .messageListItem .flagOff:hover { + opacity: 1; +} +.messageList .b-content .messageListItem .flagOn, +.messageList .b-content .messageListItem .flagOnHalf { + display: none; + color: orange; +} +.messageList .b-content .messageListItem .replyFlag, +.messageList .b-content .messageListItem .forwardFlag { + display: none; +} +.messageList .b-content .messageListItem.answered .replyFlag { + display: inline-block; +} +.messageList .b-content .messageListItem.forwarded .forwardFlag { + display: inline-block; +} +.messageList .b-content .messageListItem.withAttachments .attachment { + display: inline-block; + color: #666; + text-shadow: 0px 1px 0px #eee; +} +.messageList .b-content .messageListItem.hasUnseenSubMessage { + background-color: #FFFFD9; +} +.messageList .b-content .messageListItem.hasUnseenSubMessage .sidebarParent { + background-color: #ffdb99; +} +.messageList .b-content .messageListItem.hasUnseenSubMessage.focused .sidebarParent { + background-color: #cc8400 !important; +} +.messageList .b-content .messageListItem.unseen { + background-color: #FFFFD9; +} +.messageList .b-content .messageListItem.unseen .sender, +.messageList .b-content .messageListItem.unseen .subject, +.messageList .b-content .messageListItem.unseen .subject-suffix { + font-weight: bold; +} +.messageList .b-content .messageListItem.unseen .sidebarParent { + background-color: orange; +} +.messageList .b-content .messageListItem.unseen.focused .sidebarParent { + background-color: #cc8400 !important; +} +.messageList .b-content .messageListItem.checked .sidebarParent { + background-color: #69a8f5 !important; +} +.messageList .b-content .messageListItem.checked.focused .sidebarParent { + background-color: #217ef0 !important; +} +.messageList .b-content .messageListItem.selected { + background-color: #DFEFFF; + z-index: 101; +} +.messageList .b-content .messageListItem.selected .sidebarParent { + background-color: #398CF2 !important; +} +.messageList .b-content .messageListItem.selected .delimiter { + background-color: #398CF2; + opacity: 0.2; + filter: alpha(opacity=20); +} +.messageList .b-content .messageListItem.selected + .messageListItem .delimiter { + background-color: #398CF2; + opacity: 0.3; +} +.messageList .b-content .messageListItem.hasFlaggedSubMessage .flagOff, +.messageList .b-content .messageListItem.hasFlaggedSubMessage .flagOn { + display: none; +} +.messageList .b-content .messageListItem.hasFlaggedSubMessage .flagOnHalf { + display: inline-block; +} +.messageList .b-content .messageListItem.flagged .flagOff, +.messageList .b-content .messageListItem.flagged .flagOnHalf { + display: none; +} +.messageList .b-content .messageListItem.flagged .flagOn { + display: inline-block; +} +.messageList.message-focused .b-message-list-wrapper { + background-color: #000; +} +.messageList.message-focused .b-content { + opacity: 0.97; +} +.messageList.hideMessageListCheckbox .checkedParent, +.messageList.hideMessageListCheckbox .checkboxCkeckAll { + display: none !important; +} +.messageList.hideMessageListCheckbox .sidebarParent { + margin-right: 10px !important; +} +html.ssm-state-desktop-large .messageList .b-content .messageListItem { + font-size: 13px; +} +html.ssm-state-desktop-large .messageList .b-content .messageListItem .dateParent { + font-size: 13px; +} +html.cssanimations .messageList .line-loading { + height: 5px !important; +} +.draggablePlace { + z-index: 10003; + color: #fff; + background-color: #333; + background-color: rgba(0, 0, 0, 0.5); + padding: 4px 10px; + min-width: 30px; + height: 20px; + cursor: pointer; + cursor: move; +} +html.rl-mobile #rl-sub-left .messageList .inputSearch { + width: 160px !important; +} +html.rl-no-preview-pane .messageView { + display: none; +} +html.rl-no-preview-pane .messageView.message-selected { + display: block; +} +.messageView { + z-index: 100; +} +.messageView .toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 30px; + padding: 10px 0; + color: #fff; +} +.messageView .b-content { + position: absolute; + margin: 0; + top: 58px; + bottom: 13px; + right: 8px; + left: -2px; + /*overflow: hidden;*/ + border: 1px solid #aaa; + border-radius: 3px; + background-color: #fff; +} +.messageView .b-content .b-message-view-checked-helper { + text-align: center; + font-size: 70px; + line-height: 70px; + padding-top: 100px; + color: #999; +} +.messageView .b-content .b-message-view-checked-helper .icon-mail { + font-size: 100px; + font-size: 50px; + line-height: 90px; + padding-left: 10px; +} +.messageView .b-content .logoPlace { + text-align: center; +} +.messageView .b-content .b-message-view-desc { + text-align: center; + font-size: 24px; + line-height: 30px; + color: #999; + padding: 120px 10px 0 10px; +} +.messageView .b-content .b-message-view-desc.error { + color: #DA4F49; +} +.messageView .b-content .b-message-view-iframe-backdrop { + display: none; + background: transparent; + position: absolute; + width: 100%; + height: 100%; + top: 0px; + left: 0px; + right: 0px; + bottom: 0px; + opacity: .1; +} +.messageView .b-content .content { + -webkit-overflow-scrolling: touch; +} +.messageView .b-content .message-fixed-button-toolbar { + z-index: 100; + position: absolute; + top: 33px; + right: 10px; +} +.messageView .b-content .infoParent { + cursor: pointer; + margin: 0 2px 0 5px; + opacity: 0.3; +} +.messageView .b-content .infoParent:hover { + opacity: 0.6; +} +.messageView .b-content .flagParent { + cursor: pointer; + margin: 0 20px 0 2px; +} +.messageView .b-content .flagParent .flagOn { + color: orange; +} +.messageView .b-content .flagParent .flagOff { + opacity: 0.5; +} +.messageView .b-content .flagParent .flagOff:hover { + opacity: 1; +} +.messageView .b-content .messageItemHeader { + position: absolute; + padding: 10px; + background-color: #f8f8f8; + border-top: 0px; + border-bottom: 1px solid #ddd; + border-top-right-radius: 5px; + border-top-left-radius: 5px; + z-index: 1; + top: 0; + left: 0; + right: 0; +} +.messageView .b-content .messageItemHeader .fromPic { + display: inline-block; + width: 50px; + height: 50px; + float: left; + padding: 2px; + margin: 0 5px 0 0; + background: #fff; + border: 1px solid #ccc; + border-radius: 6px; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.messageView .b-content .messageItemHeader .subjectParent { + font-size: 18px; + font-weight: bold; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + margin-bottom: 8px; + line-height: 100%; + height: 22px; + vertical-align: middle; +} +.messageView .b-content .messageItemHeader .messageButtons { + margin-top: 5px; +} +.messageView .b-content .messageItemHeader .informationShort { + margin: 4px 0; + margin-left: 5px; + margin-right: 50px; +} +.messageView .b-content .messageItemHeader .informationShort a { + color: #336699; + text-decoration: underline; + cursor: pointer; + padding: 2px; +} +.messageView .b-content .messageItemHeader .informationShort a:focus { + outline: 1px; + outline-style: dotted; +} +html.rl-mobile .messageView .b-content .messageItemHeader .informationShort { + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} +.messageView .b-content .messageItemHeader .informationShortWrp { + max-height: 100px; + overflow-y: auto; + min-height: 30px; + margin-top: 4px; +} +.messageView .b-content .messageItemHeader .informationFull { + margin-top: 10px; + border: 1px solid #ddd; + background-color: #fff; + border-radius: 5px; + padding: 8px 0; + overflow: hidden; +} +.messageView .b-content .messageItemHeader .informationFull .size { + margin-left: 4px; +} +.messageView .b-content .messageItemHeader .informationFull table { + width: 100%; +} +.messageView .b-content .messageItemHeader .informationFull table, +.messageView .b-content .messageItemHeader .informationFull tr, +.messageView .b-content .messageItemHeader .informationFull td { + border-spacing: 0; +} +.messageView .b-content .messageItemHeader .informationFull td { + padding: 0 10px; + vertical-align: top; + min-width: 43px; +} +.messageView .b-content .messageItemHeader .informationFull td:first-child { + border-right: 1px solid #ddd; + text-align: right; + width: 1%; +} +.messageView .b-content .messageItemHeader .informationFull .uiLabel { + white-space: nowrap; +} +.messageView .b-content .messageItemHeader .informationFull .uiLabelValue { + word-break: break-all; +} +.messageView .b-content .messageItemHeader .emptySubjectText { + display: none; + font-style: italic; + font-weight: normal; + color: #999; +} +.messageView .b-content .messageItemHeader.emptySubject .emptySubjectText { + display: inline; +} +.messageView .b-content .messageItem { + position: absolute; + top: 0px; + bottom: 0; + left: 0; + right: 0; + overflow: auto; + -webkit-overflow-scrolling: touch; + border-radius: 3px; +} +.messageView .b-content .messageItem .buttonUp, +.messageView .b-content .messageItem .buttonUnFull, +.messageView .b-content .messageItem .buttonFull { + display: inline-block; + position: fixed; + right: 25px; + bottom: 25px; + height: 30px; + width: 30px; + text-align: center; + vertical-align: middle; + line-height: 30px; + background-color: transparent; + background-color: #fff; + border: 1px solid #333; + color: #333; + z-index: 2; + cursor: pointer; + border-radius: 5px; + opacity: 0.5; + filter: alpha(opacity=50); +} +.messageView .b-content .messageItem .buttonUp:hover, +.messageView .b-content .messageItem .buttonUnFull:hover, +.messageView .b-content .messageItem .buttonFull:hover { + opacity: 0.8; + filter: alpha(opacity=80); + border-color: #666; + background-color: #888; + color: #fff; +} +.messageView .b-content .messageItem .buttonUp { + right: 65px; + z-index: 0; +} +.messageView .b-content .messageItem .buttonUp, +.messageView .b-content .messageItem .buttonUnFull { + display: none; +} +.messageView .b-content .messageItem .loading { + text-align: center; + font-size: 24px; + color: grey; + padding-top: 50px; +} +.messageView .b-content .messageItem .line-loading { + height: 0px; +} +.messageView .b-content .messageItem .showImages, +.messageView .b-content .messageItem .readReceipt, +.messageView .b-content .messageItem .pgpSigned, +.messageView .b-content .messageItem .pgpEncrypted { + cursor: pointer; + padding: 10px 15px; + border-bottom: 1px solid #ddd; + background-color: #eee; +} +.messageView .b-content .messageItem .pgpInfo { + padding: 5px 15px; + border-bottom: 1px solid #ddd; + background-color: #fcf8e3; +} +.messageView .b-content .messageItem .pgpInfo.success { + background-color: #e9f4ff; +} +.messageView .b-content .messageItem .readReceipt { + background-color: #ffffd9; +} +.messageView .b-content .messageItem .attachmentsPlace { + padding: 10px 10px 6px 10px; + background: #eee; + border-bottom: 1px solid #ddd; + position: relative; +} +.messageView .b-content .messageItem .attachmentsPlace .attachmentList { + margin: 0; +} +.messageView .b-content .messageItem .attachmentsPlace .checkedParent { + display: none; +} +.messageView .b-content .messageItem .attachmentsPlace.selection-mode .checkedParent { + display: inline-block; +} +.messageView .b-content .messageItem .attachmentsPlace.unselectedAttachmentsError .attachmentItem { + -webkit-box-shadow: 0 1px 4px red; + box-shadow: 0 1px 4px red; + -webkit-box-shadow: 0 1px 5px rgba(255, 0, 0, 0.4); + box-shadow: 0 1px 5px rgba(255, 0, 0, 0.4); + -webkit-box-shadow: 0 0 0 1px rgba(255, 0, 0, 0.2), 0 1px 5px rgba(255, 0, 0, 0.3); + box-shadow: 0 0 0 1px rgba(255, 0, 0, 0.2), 0 1px 5px rgba(255, 0, 0, 0.3); +} +.messageView .b-content .messageItem .attachmentsPlace .controls-handle { + position: absolute; + bottom: 5px; + right: 8px; + color: #999; + cursor: pointer; +} +.messageView .b-content .messageItem .attachmentsControls { + padding: 7px 5px 7px 14px; + background: #e8e8e8; + border-bottom: 1px solid #ddd; +} +.messageView .b-content .messageItem .rlBlockquoteSwitcher { + background-color: #eee; + border: 1px solid #999; + display: inline-block; + width: 30px; + height: 14px; + line-height: 14px; + text-align: center; + cursor: pointer; + margin: 10px 0px; + opacity: 0.5; +} +.messageView .b-content .messageItem .rlBlockquoteSwitcher:hover { + opacity: 1; +} +.messageView .b-content .messageItem .bodySubHeader { + z-index: 2; +} +.messageView .b-content .messageItem .bodyText { + color: #000; + font-family: Arial, Verdana, Geneva, sans-serif; +} +.messageView .b-content .messageItem .bodyText .b-text-part { + height: 100%; +} +.messageView .b-content .messageItem .bodyText .b-text-part div[data-x-div-type=html] { + height: 100%; +} +.messageView .b-content .messageItem .bodyText .b-text-part div[data-x-div-type=html] div[data-x-div-type=body] { + height: 100%; +} +.messageView .b-content .messageItem .bodyText .b-text-part a { + color: blue; + text-decoration: underline; +} +.messageView .b-content .messageItem .bodyText .b-text-part a:visited { + color: #609; +} +.messageView .b-content .messageItem .bodyText .b-text-part a:active { + color: red; +} +.messageView .b-content .messageItem .bodyText .b-text-part blockquote { + border-left: 2px solid #000; + padding: 0px 10px; + margin: 0; +} +.messageView .b-content .messageItem .bodyText .b-text-part .rl-bq-switcher.hidden-bq { + display: none; +} +.messageView .b-content .messageItem .bodyText .b-text-part.html div[data-x-div-type=body] { + /*padding: 15px;*/ + margin: 15px; +} +.messageView .b-content .messageItem .bodyText .b-text-part.html pre, +.messageView .b-content .messageItem .bodyText .b-text-part.html code { + margin: 0px; + padding: 0px; + background: #fff; + border: none; + border-radius: 0; + font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; + display: block; + word-break: normal; + word-wrap: break-word; + background-color: #f9f9f9; +} +.messageView .b-content .messageItem .bodyText .b-text-part.html code { + display: inline; + padding: 2px 5px; +} +.messageView .b-content .messageItem .bodyText .b-text-part.html pre { + padding: 5px 10px; + border-radius: 5px; + background-color: #f9f9f9; +} +.messageView .b-content .messageItem .bodyText .b-text-part.html pre > code { + padding: 0px; +} +.messageView .b-content .messageItem .bodyText .b-text-part.plain { + padding: 15px; + /*white-space: pre-wrap;*/ + font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; +} +.messageView .b-content .messageItem .bodyText .b-text-part.plain pre { + margin: 0px; + padding: 0px; + background: #fff; + border: none; + font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; + display: block; + word-break: normal; +} +.messageView .b-content .messageItem .bodyText .b-text-part.plain pre.b-plain-openpgp { + display: inline-block; + padding: 6px 10px; + border: 1px dashed #666; + background: #fff; + word-break: break-all; +} +.messageView .b-content .messageItem .bodyText .b-text-part.plain pre.b-plain-openpgp.success { + border-color: green; + background-color: rgba(0, 255, 0, 0.03); +} +.messageView .b-content .messageItem .bodyText .b-text-part.plain pre.b-plain-openpgp.error { + border-color: red; + background-color: rgba(255, 0, 0, 0.03); +} +.messageView .b-content .messageItem .bodyText .b-text-part.plain blockquote { + border-left: 2px solid blue; + color: blue; +} +.messageView .b-content .messageItem .bodyText .b-text-part.plain blockquote blockquote { + border-left: 2px solid green; + color: green; +} +.messageView .b-content .messageItem .bodyText .b-text-part.plain blockquote blockquote blockquote { + border-left: 2px solid red; + color: red; +} +.messageView .b-content .messageItem .bodyText .b-text-part .b-openpgp-control { + display: inline-block; + cursor: pointer; + color: #777; + /*float: left;*/ +} +.messageView .b-content .messageItem .bodyText .b-text-part .b-openpgp-control:hover { + color: #111; +} +.messageView .b-content .messageItem .bodyText .b-text-part .b-openpgp-control.success { + color: green; + cursor: help; +} +.messageView .b-content .messageItem .bodyText .b-text-part .b-openpgp-control.error { + color: red; +} +.messageView.message-focused .b-content { + z-index: 101; + -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.2); + box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.2); + border-radius: 3px; + border-color: #9d9d9d; +} +.messageView .thread-controls .dropdown-toggle { + padding-left: 10px; + padding-right: 10px; +} +.messageView .thread-controls.open .dropdown-toggle { + padding-left: 10px; + padding-right: 10px; +} +.messageView .thread-list .e-link { + padding: 4px 8px 6px 10px; +} +.messageView .thread-list.hide-more .thread-list-message.more-that { + display: none; +} +.messageView .thread-list .thread-date { + font-size: 13px; + color: #999; +} +.messageView .thread-list .more-threads { + text-align: center; + padding: 8px; + background-color: #F5F5F5; + color: #555; + text-decoration: underline; + border-top: 1px dashed #555; +} +html.rl-resizer .b-message-view-iframe-backdrop { + display: block !important; +} +html.rl-no-preview-pane .messageView .toolbar { + padding-left: 1px; +} +html.rl-no-preview-pane .messageView .b-content { + top: 50px; + left: 0; + bottom: 5px; + right: 5px; + border: 1px solid #aaa; + -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.2); + box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.2); + border-radius: 5px; +} +html.rl-bottom-preview-pane .messageView .b-content { + bottom: 5px; +} +html.cssanimations .messageItem .line-loading { + height: 5px !important; +} +html.rl-message-fullscreen #rl-left, +html.rl-message-fullscreen #rl-bottom { + display: none !important; +} +html.rl-message-fullscreen #rl-right .RL-MailMessageList, +html.rl-message-fullscreen #rl-right .RL-SettingsPane, +html.rl-message-fullscreen #rl-right .RL-SystemDropDown, +html.rl-message-fullscreen #rl-right .RL-MailMessageView .messageView .toolbar { + display: none !important; +} +html.rl-message-fullscreen .messageView .b-content { + position: fixed !important; + margin: 5px !important; + top: 0 !important; + left: 0 !important; + right: 0 !important; + bottom: 0 !important; + z-index: 10000 !important; + border: 1px solid #aaa !important; + border-radius: 3px !important; +} +html .messageItem .buttonUp, +html .messageItem .buttonUp { + display: none !important; +} +html .messageItem.scroller-shadow-top .buttonUp { + display: inline-block !important; +} +html.rl-desktop .messageItem .buttonUp, +html.rl-desktop .messageItem .buttonFull { + display: none !important; +} +html.rl-desktop .messageItem:hover.scroller-shadow-top .buttonUp, +html.rl-desktop .messageItem:hover .buttonFull { + display: inline-block !important; +} +html.rl-message-fullscreen .messageItem .buttonUnFull { + display: inline-block !important; +} +html.rl-message-fullscreen .messageItem .buttonFull { + display: none !important; +} +html.rl-message-fullscreen .messageItem .buttonUp { + display: none !important; +} +html.rl-message-fullscreen .messageItem.scroller-shadow-top .buttonUp { + display: inline-block !important; +} +.b-contacts-content .control-group .control-label.fix-width { + width: 50px; +} +.b-contacts-content .control-group .controls.fix-width { + margin-left: 70px; +} +.b-contacts-content.modal { + position: absolute; + right: 0; + top: 0; + bottom: 0; + left: 0; + width: 900px; + min-height: 300px; + max-height: 700px; + margin: auto; +} +.b-contacts-content.modal .modal-body { + overflow: auto; + height: 100%; + background-color: #f5f5f5; + padding: 0; +} +.b-contacts-content.modal .b-header-toolbar { + height: 40px; + background-color: #aaa; + color: #fff; + background-color: #333; + background-color: rgba(0, 0, 0, 0.8) !important; +} +.b-contacts-content.modal .b-header-toolbar .close, +.b-contacts-content.modal .b-header-toolbar .close-custom { + color: #fff; + opacity: 1; +} +.b-contacts-content.modal .b-header-toolbar .btn { + margin-top: 4px; +} +.b-contacts-content.modal .b-list-toolbar { + padding: 0; + height: 45px; + text-align: right; + width: 220px; + -webkit-box-shadow: inset 0 -1px 0 #ccc; + box-shadow: inset 0 -1px 0 #ccc; +} +.b-contacts-content.modal .b-list-toolbar .e-search { + margin-top: 7px; + width: 200px; +} +.b-contacts-content.modal .b-list-footer-toolbar { + position: absolute; + left: 0; + bottom: 0; + height: 105px; + width: 220px; + background-color: #eee; + -webkit-box-shadow: inset 0 1px 0 #ccc; + box-shadow: inset 0 1px 0 #ccc; +} +.b-contacts-content.modal .b-list-footer-toolbar .footer-pager { + padding: 8px 10px 0 0; +} +.b-contacts-content.modal .b-list-content { + position: absolute; + top: 45px; + bottom: 105px; + left: 0; + width: 220px; + overflow: hidden; + overflow-y: auto; +} +.b-contacts-content.modal .b-list-content .content { + -webkit-overflow-scrolling: touch; +} +.b-contacts-content.modal .b-list-content .listClear { + color: #333; + text-align: center; + padding: 10px; + font-size: 14px; + line-height: 13px; + background-color: #fff; + -webkit-box-shadow: inset 0 -1px 0 #ccc; + box-shadow: inset 0 -1px 0 #ccc; +} +.b-contacts-content.modal .b-list-content .listEmptyList, +.b-contacts-content.modal .b-list-content .listEmptyListLoading, +.b-contacts-content.modal .b-list-content .listEmptySearchList { + color: #999; + text-align: center; + padding: 60px 10px; + font-size: 24px; + line-height: 30px; +} +.b-contacts-content.modal .b-list-content.hideContactListCheckbox .checkedParent, +.b-contacts-content.modal .b-list-content.hideContactListCheckbox .checkboxCkeckAll { + display: none !important; +} +.b-contacts-content.modal .b-list-content.hideContactListCheckbox .sidebarParent { + margin-right: 10px !important; +} +.b-contacts-content.modal .b-list-content .e-contact-foreach { + border-bottom: 1px solid #ddd; +} +.b-contacts-content.modal .b-list-content .e-contact-item { + position: relative; + height: 45px; + max-height: 45px; + line-height: 45px; + overflow: hidden; + cursor: pointer; + margin: 0px; + border: 0px solid transparent; + z-index: 100; +} +.b-contacts-content.modal .b-list-content .e-contact-item .delimiter { + position: relative; + display: block; + height: 1px; + background-color: #999; + opacity: 0.2; +} +.b-contacts-content.modal .b-list-content .e-contact-item .wrapper { + padding: 0; +} +.b-contacts-content.modal .b-list-content .e-contact-item .sidebarParent { + display: inline-block; + width: 6px; + background-color: #eee; + float: left; + height: 100%; +} +.b-contacts-content.modal .b-list-content .e-contact-item.focused .sidebarParent { + background-color: #bbb; +} +.b-contacts-content.modal .b-list-content .e-contact-item.deleted { + max-height: 0px; + border-color: transparent !important; +} +.b-contacts-content.modal .b-list-content .e-contact-item .checkedParent { + display: inline-block; + float: left; + padding: 0 8px 0 6px; +} +.b-contacts-content.modal .b-list-content .e-contact-item .shareParent { + display: none; + float: right; + position: relative; + margin: 2px 8px 0 5px; +} +.b-contacts-content.modal .b-list-content .e-contact-item .nameParent { + display: block; + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + color: #333; + font-size: 16px; +} +.b-contacts-content.modal .b-list-content .e-contact-item .nameParent, +.b-contacts-content.modal .b-list-content .e-contact-item .emailParent { + white-space: nowrap; +} +.b-contacts-content.modal .b-list-content .e-contact-item .displayName, +.b-contacts-content.modal .b-list-content .e-contact-item .displayEmail { + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; +} +.b-contacts-content.modal .b-list-content .e-contact-item .displayImg { + display: inline-block; + float: right; + position: relative; + margin: 0 5px; +} +.b-contacts-content.modal .b-list-content .e-contact-item.shared .shareParent { + display: inline-block; +} +.b-contacts-content.modal .b-list-content .e-contact-item.checked { + z-index: 101; +} +.b-contacts-content.modal .b-list-content .e-contact-item.checked .sidebarParent { + background-color: #69A8F5; +} +.b-contacts-content.modal .b-list-content .e-contact-item.checked.focused .sidebarParent { + background-color: #519af3 !important; +} +.b-contacts-content.modal .b-list-content .e-contact-item.selected { + background-color: #fff; + z-index: 102; +} +.b-contacts-content.modal .b-list-content .e-contact-item.selected .sidebarParent { + background-color: #398CF2; +} +.b-contacts-content.modal .b-list-content .e-contact-item.selected.focused .sidebarParent { + background-color: #217ef0 !important; +} +.b-contacts-content.modal .b-view-content-toolbar { + background-color: #f5f5f5; + padding: 7px; + position: absolute; + top: 0; + right: 0; + left: 220px; + height: 31px; + text-align: center; + -webkit-box-shadow: inset 0 -1px 0 #ccc; + box-shadow: inset 0 -1px 0 #ccc; +} +.b-contacts-content.modal .b-view-content-toolbar .button-save-contact.no-disabled.dirty { + color: #51a351; + font-weight: bold; +} +.b-contacts-content.modal .b-view-content-toolbar.read-only .button-save-contact { + display: none; +} +.b-contacts-content.modal .b-view-content { + position: absolute; + top: 45px; + bottom: 60px; + left: 220px; + right: 0; + overflow: hidden; + overflow-y: auto; + background-color: #fff; + border-left: 1px solid #ddd; +} +.b-contacts-content.modal .b-view-content .content { + -webkit-overflow-scrolling: touch; +} +.b-contacts-content.modal .b-view-content .contactValueStatic, +.b-contacts-content.modal .b-view-content .contactValueLargeStatic, +.b-contacts-content.modal .b-view-content .contactValueTextAreaStatic { + height: 20px; + line-height: 20px; + font-size: 18px; + display: inline-block; + padding: 5px 7px; + color: #555; + display: none; +} +.b-contacts-content.modal .b-view-content.read-only .contactValueStatic, +.b-contacts-content.modal .b-view-content.read-only .contactValueLargeStatic, +.b-contacts-content.modal .b-view-content.read-only .contactValueTextAreaStatic { + display: inline-block; +} +.b-contacts-content.modal .b-view-content.read-only .contactValueInput, +.b-contacts-content.modal .b-view-content.read-only .contactValueInputLarge, +.b-contacts-content.modal .b-view-content.read-only .contactValueTextArea { + display: none; +} +.b-contacts-content.modal .b-view-content .b-contact-view-desc { + text-align: center; + font-size: 24px; + line-height: 30px; + padding-top: 120px; + color: #999; +} +.b-contacts-content.modal .b-view-content .top-part { + padding-top: 20px; +} +.b-contacts-content.modal .b-view-content .property-line { + margin-bottom: 5px; +} +.b-contacts-content.modal .b-view-content .top-row { + padding: 10px 0; + height: 30px; +} +.b-contacts-content.modal .b-view-content .add-link { + margin-left: 2px; + padding: 5px; + font-size: 12px; + color: #aaa; +} +.b-contacts-content.modal .b-view-content .contactValueStatic, +.b-contacts-content.modal .b-view-content .contactValueLargeStatic, +.b-contacts-content.modal .b-view-content .contactValueTextAreaStatic { + font-size: 18px; + display: none; +} +.b-contacts-content.modal .b-view-content .contactValueInput, +.b-contacts-content.modal .b-view-content .contactValueInputLarge, +.b-contacts-content.modal .b-view-content .contactValueTextArea { + -webkit-box-shadow: none; + box-shadow: none; + border-color: #fff; + font-size: 18px; + width: 300px; +} +.b-contacts-content.modal .b-view-content .contactValueInput:hover, +.b-contacts-content.modal .b-view-content .contactValueInputLarge:hover, +.b-contacts-content.modal .b-view-content .contactValueTextArea:hover { + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + border-color: #ccc; +} +.b-contacts-content.modal .b-view-content .contactValueInput:focus, +.b-contacts-content.modal .b-view-content .contactValueInputLarge:focus, +.b-contacts-content.modal .b-view-content .contactValueTextArea:focus { + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + border-color: #999; +} +.b-contacts-content.modal .b-view-content .contactValueInput::-webkit-input-placeholder, +.b-contacts-content.modal .b-view-content .contactValueInputLarge::-webkit-input-placeholder, +.b-contacts-content.modal .b-view-content .contactValueTextArea::-webkit-input-placeholder { + color: #ddd; +} +.b-contacts-content.modal .b-view-content .contactValueInput::-moz-placeholder, +.b-contacts-content.modal .b-view-content .contactValueInputLarge::-moz-placeholder, +.b-contacts-content.modal .b-view-content .contactValueTextArea::-moz-placeholder { + color: #ddd; +} +.b-contacts-content.modal .b-view-content .contactValueInput:-moz-placeholder, +.b-contacts-content.modal .b-view-content .contactValueInputLarge:-moz-placeholder, +.b-contacts-content.modal .b-view-content .contactValueTextArea:-moz-placeholder { + color: #ddd; +} +.b-contacts-content.modal .b-view-content .contactValueInput:-ms-input-placeholder, +.b-contacts-content.modal .b-view-content .contactValueInputLarge:-ms-input-placeholder, +.b-contacts-content.modal .b-view-content .contactValueTextArea:-ms-input-placeholder { + color: #ddd; +} +.b-contacts-content.modal .b-view-content .contactValueTextArea { + width: 300px; +} +.b-contacts-content.modal .b-view-content .contactValueInputLarge { + width: 400px; +} +.b-contacts-content.modal .b-view-content .hasError .contactValueInput { + color: #ee5f5b; + border-color: #ee5f5b; +} +.b-contacts-content.modal .b-view-content .e-save-trigger { + position: absolute; + top: 25px; + left: 10px; +} +.b-contacts-content.modal .b-view-content .e-read-only-sign { + display: none; + position: absolute; + top: 20px; + right: 40px; +} +.b-contacts-content.modal .b-view-content .e-share-sign { + position: absolute; + top: 20px; + right: 20px; + cursor: pointer; +} +.b-contacts-content.modal .b-view-content.read-only .e-read-only-sign { + display: inline-block; +} +.b-contacts-content.modal .b-view-content.read-only .e-share-sign { + display: none; +} +.b-contacts-content .e-contact-item { + position: relative; + height: 55px; + max-height: 60px; + line-height: 22px; + overflow: hidden; + cursor: pointer; + margin: 0px; + border: 0px solid transparent; + z-index: 100; +} +html.rl-mobile .b-contacts-content .b-list-content, +html.rl-mobile .b-contacts-content .b-list-toolbar, +html.rl-mobile .b-contacts-content .b-list-footer-toolbar { + width: 170px; +} +html.rl-mobile .b-contacts-content .b-list-toolbar .e-search { + width: 150px; +} +html.rl-mobile .b-contacts-content .b-view-content-toolbar, +html.rl-mobile .b-contacts-content .b-view-content { + left: 170px; +} +.b-compose.modal { + width: 850px; + margin: 10px auto; +} +.b-compose.modal .modal-body { + overflow: auto; + padding: 0px; +} +.b-compose .textAreaParent, +.b-compose .attachmentAreaParent { + overflow: hidden; + position: relative; +} +.b-compose .attachmentAreaParent { + padding: 10px 10px 6px 10px; + background: #ddd; + border-top: 1px solid #ccc; + overflow-y: auto; +} +.b-compose .attachmentAreaParent .no-attachments-desc { + padding: 50px 10px; + text-align: center; + font-size: 24px; + color: #666; + text-shadow: 0 1px 0 #fff; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} +.b-compose .attachmentAreaParent .attachmentList { + margin: 0; + padding: 10px; +} +.b-compose .b-header-toolbar { + height: 40px; + color: #fff; + background-color: #aaa; + background-color: #333; + background-color: rgba(0, 0, 0, 0.8) !important; +} +.b-compose .b-header-toolbar .close, +.b-compose .b-header-toolbar .close-custom, +.b-compose .b-header-toolbar .minimize-custom { + opacity: 1; + color: #fff; + border-color: #eee; + font-size: 24px; + line-height: 24px; +} +.b-compose .b-header-toolbar .btn.disabled.button-delete { + visibility: hidden; +} +.b-compose .b-header-toolbar .button-save, +.b-compose .b-header-toolbar .button-delete, +.b-compose .b-header-toolbar .saved-text { + margin-left: 8px; +} +.b-compose .b-header-toolbar .button-close, +.b-compose .b-header-toolbar .button-skip { + margin-left: 8px; +} +.b-compose .b-header-toolbar .disabled.button-delete { + margin-left: 0px; +} +.b-compose .b-header { + padding: 10px; + background-color: #eee; + color: #333; +} +html.rl-mobile .b-compose .b-header { + overflow: scroll; +} +.b-compose .b-header .e-identity { + color: #333; + text-decoration: none; + font-weight: bold; +} +.b-compose .b-header .e-identity:hover { + color: #333; + text-decoration: none; +} +.b-compose .b-header .e-identity.multiply { + cursor: pointer; + border-bottom: 1px dashed #555; +} +.b-compose .b-header .e-row { + line-height: 30px; +} +.b-compose .b-header .e-label { + text-align: right; + width: 1%; + min-width: 70px; + padding: 6px 10px; +} +html.rl-mobile .b-compose .b-header .e-label { + min-width: 50px; + padding: 6px 10px 6px 0px; +} +.b-compose .b-header .e-value { + padding: 2px 0px; +} +.b-compose .b-header .e-value textarea, +.b-compose .b-header .e-value input[type="text"] { + width: 98%; +} +.b-compose .b-header .e-value textarea { + height: 40px; +} +.b-compose .b-header .error-desc { + color: red; +} +.b-compose .b-header .error-to { + color: red; + font-weight: bold; +} +.b-compose .b-header .b-appachments .b-attacment { + line-height: 20px; + padding-bottom: 10px; +} +.b-compose .b-header .b-appachments .b-attacment-in-process { + line-height: 20px; + padding-bottom: 10px; +} +.b-compose .b-header .b-appachments .b-attacment-in-process .uploading { + display: none; + padding-right: 5px; +} +.b-compose .b-header .b-appachments .b-attacment-in-process.uploading .uploading { + display: inline; +} +.b-compose .b-header .b-appachments .b-attacment-in-process .upload-progress { + font-weight: bold; +} +.b-compose .b-header .b-appachments .b-attacment-in-process.error .namedStr { + color: #888; +} +.b-compose .b-header .b-appachments .b-attacment-in-process .error { + color: red; +} +.b-compose .b-header .b-appachments .b-attacment-in-process .close, +.b-compose .b-header .b-appachments .b-attacment-in-process .close-custom { + float: left; + padding-right: 13px; +} +.b-compose .cke_chrome { + border-left-width: 0 !important; + border-right-width: 0 !important; + border-bottom-width: 0 !important; +} +.b-compose .b-attachment-button { + display: inline-block; +} +.b-compose .b-attachment-place { + position: absolute; + left: 5px; + right: 5px; + top: 5px; + bottom: 5px; + border: 2px #777 dashed; + z-index: 300; + line-height: 119px; + text-align: center; + background-color: #efefef; + font-size: 24px; + border-radius: 10px; +} +.b-compose .b-attachment-place.dragAndDropOver { + background-color: #fff; +} +.b-admin-left .b-toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 34px; + padding: 8px 0 0 8px; +} +.b-admin-left .b-content { + position: absolute; + top: 68px; + bottom: 8px; + left: 0; + right: 0; + overflow: hidden; +} +.b-admin-left .b-content .content { + -webkit-overflow-scrolling: touch; +} +.b-admin-menu .e-item { + overflow: hidden; + text-decoration: none; + outline: 0; +} +.b-admin-menu .e-link { + position: relative; + display: block; + height: 30px; + line-height: 29px; + cursor: pointer; + font-size: 18px; + z-index: 1; + cursor: default; + background-color: transparent; + color: #888; + padding: 4px 10px; + outline: 0; + text-decoration: none; +} +.b-admin-menu .e-item.selectable .e-link { + cursor: pointer; +} +.b-admin-menu .e-item.selectable:hover .e-link, +.b-admin-menu .e-item.selectable.selected .e-link { + background-color: #555; + color: #fff; +} +.b-admin-right .b-toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 34px; + padding: 8px 8px; + color: #fff; + text-shadow: 0px 1px 1px #000; +} +.b-admin-right .b-content { + position: absolute; + top: 58px; + bottom: 8px; + left: 0; + right: 8px; + overflow-y: auto; + z-index: 2; + background-color: #fff; + border: 1px solid #aaa; + -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.2); + box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.2); + border-radius: 5px; +} +.b-admin-right .b-content .content { + -webkit-overflow-scrolling: touch; +} +.b-admin-right .b-settings-content { + padding: 20px; + padding-left: 30px; +} +.b-admin-right .b-settings-content .legend { + width: 670px; +} +.b-admin-right .b-settings-content .nav-tabs { + width: 670px; +} +html.rl-mobile .b-settings-content .legend { + width: auto; +} +.b-admin-general .flag-selector { + padding-top: 5px; +} +.b-admin-general .flag-name { + border-bottom: 1px dashed #555; + cursor: pointer; + padding: 2px 0px; +} +.b-admin-general .flag-name:focus { + outline: 1px; + outline-style: dotted; +} +.b-admin-branding .disabled-form { + opacity: 0.8; +} +.b-admin-branding .custom-css-wrapper textarea { + font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; +} +.b-admin-domains .process-place { + width: 600px; + padding: 14px 0; + text-align: center; + visibility: hidden; +} +.b-admin-domains-list-table { + width: 600px; +} +.b-admin-domains-list-table .e-item .e-action { + cursor: pointer; +} +.b-admin-domains-list-table .e-item .domain-name { + display: inline-block; + word-break: break-all; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.b-admin-domains-list-table .e-item .domain-alias { + display: inline-block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + color: #bbb; + padding-left: 5px; +} +.b-admin-domains-list-table .e-item.disabled .domain-name, +.b-admin-domains-list-table .e-item.disabled .domain-alias { + color: #bbb; +} +.b-admin-domains-list-table .e-item .button-delete { + margin-right: 15px; + visibility: hidden; + opacity: 0; +} +.b-admin-domains-list-table .e-item .delete-access.button-delete { + visibility: visible; + margin-right: 0; + opacity: 1; +} +.b-admin-domains-list-table .e-item .delete-domain, +.b-admin-domains-list-table .e-item .disabled-domain { + cursor: pointer; + opacity: 0.5; +} +.b-admin-domains-list-table .e-item.disabled .disabled-domain { + opacity: 0.5; +} +.b-admin-domains-list-table .e-item .delete-domain:hover, +.b-admin-domains-list-table .e-item .disabled-domain:hover { + opacity: 1; +} +.b-domain-alias-content.modal { + width: 330px; +} +.b-domain-alias-content .modal-header { + background-color: #fff; +} +.b-domain-alias-content .error-desc { + color: red; +} +.b-domain-content.modal { + width: 810px; +} +.b-domain-content .modal-header { + background-color: #fff; +} +.b-domain-content .modal-body { + position: relative; + overflow: hidden; + width: 1600px; + height: 400px; + left: 0; +} +.b-domain-content.domain-edit .modal-body { + height: 340px; +} +.b-domain-content.domain-second-page .modal-body { + left: -800px; +} +.b-domain-content .domain-desc { + color: #666; + line-height: 20px; + background-color: #f9f9f9; + padding: 8px; + border: 1px solid #eee; + border-radius: 3px; + margin: -5px 0; +} +.b-domain-content .domain-desc i { + font-style: normal; + color: red; +} +.b-domain-content .error-desc { + color: red; +} +.b-domain-content .testing-done.imap-header, +.b-domain-content .testing-done.sieve-header, +.b-domain-content .testing-done.smtp-header { + color: green; + font-weight: bold; +} +.b-domain-content .testing-error.imap-header, +.b-domain-content .testing-error.sieve-header, +.b-domain-content .testing-error.smtp-header { + color: red; +} +.b-admin-packages .alert { + width: 650px; +} +.b-admin-packages .process-place { + visibility: hidden; +} +.b-admin-packages-list-table { + width: 700px; +} +.b-admin-packages-list-table .e-item .package-img { + font-size: 12px; + margin-right: 2px; +} +.b-admin-packages-list-table .e-item .package-name.core { + font-weight: bold; +} +.b-admin-packages-list-table .e-item .package-desc { + color: #999; + font-size: 12px; +} +.b-admin-packages-list-table .e-item .e-action { + cursor: pointer; +} +.b-admin-packages-list-table .e-item .package-release-parent, +.b-admin-packages-list-table .e-item .package-actions-parent { + text-align: center; +} +.b-admin-packages-list-table .e-item .package-actions-parent { + vertical-align: middle; +} +.b-admin-plugins .process-place { + visibility: hidden; +} +.b-admin-plugins-list-table.disabled { + opacity: 0.5; + background-color: #eee; +} +.b-admin-plugins-list-table .e-item .e-action { + cursor: pointer; +} +.b-admin-plugins-list-table .e-item .plugin-img { + font-size: 12px; + margin-right: 2px; +} +.b-admin-plugins-list-table .e-item.disabled .plugin-img, +.b-admin-plugins-list-table .e-item.disabled .plugin-name { + color: #bbb; +} +.b-admin-plugins-list-table .e-item.disabled .disabled-plugin { + opacity: 0.5; +} +.b-admin-plugin-property .help-block { + margin-bottom: 5px; +} +.b-plugin-content.modal { + width: 660px; +} +.b-plugin-content.modal .modal-body { + overflow: auto; +} +.b-plugin-content .modal-header { + background-color: #fff; +} +.b-plugin-content .information { + display: inline-block; + background-color: #ddd; + border-radius: 10px; + cursor: pointer; + height: 25px; + width: 30px; + text-align: center; + padding-top: 5px; +} +.b-plugin-content textarea { + width: 400px; + height: 70px; +} +.b-admin-about .rl-logo { + display: inline-block; + width: 250px; + height: 250px; + margin-top: -10px; + margin-bottom: -10px; + background-image: url("images/rainloop-logo.png"); +} +.b-admin-about .rl-desc { + margin-top: 20px; + margin-left: -20px; +} +.popups .b-activate-content { + width: 700px; +} +.popups .b-activate-content .modal-header { + background-color: #fff; +} +.popups .b-activate-content .help-inline { + padding-left: 0px; +} +.b-settins-left .b-toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 34px; + padding: 8px 0 0 8px; +} +.b-settins-left .b-footer { + position: absolute; + bottom: 20px; + right: 0; + left: 0; + height: 20px; + padding: 0 10px 0 5px; + z-index: 101; +} +.b-settins-left .b-content { + position: absolute; + top: 68px; + bottom: 8px; + left: 0; + right: 0; + overflow: hidden; +} +.b-settins-left .b-content .content { + -webkit-overflow-scrolling: touch; +} +.b-settings-menu .e-item { + overflow: hidden; + text-decoration: none; + outline: 0; +} +.b-settings-menu .e-link { + position: relative; + display: block; + height: 30px; + line-height: 29px; + font-size: 18px; + z-index: 1; + cursor: default; + background-color: transparent; + color: #888; + padding: 4px 10px; + outline: 0; + text-decoration: none; +} +.b-settings-menu .e-item.selectable .e-link { + cursor: pointer; +} +.b-settings-menu .e-item.selectable:hover .e-link, +.b-settings-menu .e-item.selectable.selected .e-link { + background-color: #555; + color: #fff; +} +.b-settins-right .b-toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 34px; + padding: 8px 5px; + color: #fff; +} +.b-settins-right .b-content { + position: absolute; + top: 50px; + bottom: 8px; + left: 0; + right: 8px; + overflow-y: auto; + z-index: 2; + background-color: #fff; + border: 1px solid #aaa; + -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.2); + box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.2); + border-radius: 5px; +} +.b-settins-right .b-content .content { + -webkit-overflow-scrolling: touch; +} +.b-settins-right .b-settings-content { + padding: 20px; + padding-left: 30px; +} +.b-settins-right .b-settings-content .legend { + width: 600px; +} +html.rl-mobile .b-settings-content .legend { + width: auto; +} +html.rl-mobile .b-settings-general { + margin-right: 15px; +} +.b-settings-general .notification-desc-denied { + color: #999; + display: none; +} +.b-settings-general .denied-by-browser .notification-desc-denied { + display: inline; +} +.b-settings-general .denied-by-browser .notification-desc { + color: #999; +} +.b-settings-general .flag-selector { + padding-top: 5px; +} +.b-settings-general .flag-name { + border-bottom: 1px dashed #555; + cursor: pointer; + padding: 2px 0px; +} +.b-settings-general .flag-name:focus { + outline: 1px; + outline-style: dotted; +} +html.rl-mobile .b-settings-accounts { + margin-right: 15px; +} +.b-settings-accounts .process-place { + text-align: center; + width: 600px; + padding: 14px 0; +} +.b-settings-accounts .list-table { + width: 600px; +} +.b-settings-accounts .list-table td { + padding: 4px 8px; + line-height: 30px; +} +.b-settings-accounts .list-table .drag-handle { + color: #eee; +} +.b-settings-accounts .list-table tr:hover .drag-handle { + color: #aaa; +} +.b-settings-accounts .list-table .account-img, +.b-settings-accounts .list-table .identity-img { + font-size: 12px; + margin-right: 5px; +} +.b-settings-accounts .list-table .account-name { + display: inline-block; + word-break: break-all; + -webkit-box-sizing: border-box; + box-sizing: border-box; + line-height: 22px; +} +.b-settings-accounts .list-table .identity-default { + cursor: pointer; + color: #ccc; +} +.b-settings-accounts .list-table .identity-name { + display: inline-block; + word-break: break-all; + -webkit-box-sizing: border-box; + box-sizing: border-box; + line-height: 22px; + cursor: pointer; +} +.b-settings-accounts .accounts-list-top-padding, +.b-settings-accounts .identities-list-top-padding { + display: inline-block; + height: 5px; + width: 5px; +} +.b-settings-accounts .account-item { + white-space: nowrap; +} +.b-settings-accounts .account-item .e-action { + cursor: pointer; +} +.b-settings-accounts .account-item .drag-handle { + cursor: pointer; + cursor: all-scroll; +} +.b-settings-accounts .account-item .button-delete { + margin-right: 15px; + margin-top: 5px; + visibility: hidden; + opacity: 0; +} +.b-settings-accounts .account-item .delete-access.button-delete { + visibility: visible; + margin-right: 0; + opacity: 1; +} +.b-settings-accounts .account-item .delete-account { + cursor: pointer; + opacity: 0.5; +} +.b-settings-accounts .account-item.ui-sortable-helper { + background: #F5F5F5; + border: 1px solid #DDD; +} +.b-settings-accounts .account-item.ui-sortable-helper .button-delete, +.b-settings-accounts .account-item.ui-sortable-helper .delete-account { + display: none; +} +.b-settings-accounts .account-item.ui-sortable-helper td { + border-width: 0px; +} +.b-settings-accounts .identity-item { + white-space: nowrap; +} +.b-settings-accounts .identity-item .e-action { + cursor: pointer; +} +.b-settings-accounts .identity-item .button-delete { + margin-right: 15px; + margin-top: 5px; + visibility: hidden; + opacity: 0; +} +.b-settings-accounts .identity-item .delete-access.button-delete { + visibility: visible; + margin-right: 0; + opacity: 1; +} +.b-settings-accounts .identity-item .delete-identity { + cursor: pointer; + opacity: 0.5; +} +.b-settings-accounts .identity-item.ui-sortable-helper { + background: #F5F5F5; + border: 1px solid #DDD; +} +.b-settings-accounts .identity-item.ui-sortable-helper .button-delete, +.b-settings-accounts .identity-item.ui-sortable-helper .delete-identity { + display: none; +} +.b-settings-accounts .identity-item.ui-sortable-helper td { + border-width: 0px; +} +html.rl-mobile .b-settings-templates { + margin-right: 15px; +} +.b-settings-templates .process-place { + text-align: center; + width: 600px; + padding: 14px 0; +} +.b-settings-templates .list-table { + width: 600px; +} +.b-settings-templates .list-table td { + padding: 4px 8px; + line-height: 30px; +} +.b-settings-templates .list-table .drag-handle { + color: #eee; +} +.b-settings-templates .list-table tr:hover .drag-handle { + color: #aaa; +} +.b-settings-templates .list-table .template-img { + font-size: 12px; + margin-right: 5px; +} +.b-settings-templates .list-table .template-name { + display: inline-block; + word-break: break-all; + -webkit-box-sizing: border-box; + box-sizing: border-box; + line-height: 22px; +} +.b-settings-templates .templates-list-top-padding { + display: inline-block; + height: 5px; + width: 5px; +} +.b-settings-templates .template-item .e-action { + cursor: pointer; +} +.b-settings-templates .template-item .drag-handle { + cursor: pointer; + cursor: all-scroll; +} +.b-settings-templates .template-item .button-delete { + margin-right: 15px; + margin-top: 5px; + visibility: hidden; + opacity: 0; +} +.b-settings-templates .template-item .delete-access.button-delete { + visibility: visible; + margin-right: 0; + opacity: 1; +} +.b-settings-templates .template-item .delete-template { + cursor: pointer; + opacity: 0.5; +} +.b-settings-templates .template-item.ui-sortable-helper { + background: #F5F5F5; + border: 1px solid #DDD; +} +.b-settings-templates .template-item.ui-sortable-helper .button-delete, +.b-settings-templates .template-item.ui-sortable-helper .delete-template { + display: none; +} +.b-settings-templates .template-item.ui-sortable-helper td { + border-width: 0px; +} +html.rl-mobile .b-settings-open-pgp { + margin-right: 15px; +} +.b-settings-open-pgp .process-place { + text-align: center; + width: 600px; + padding: 14px 0; +} +.b-settings-open-pgp .list-table { + width: 750px; +} +.b-settings-open-pgp .list-table td { + padding: 4px 8px; + line-height: 30px; +} +.b-settings-open-pgp .list-table .open-pgp-key-img { + margin-right: 10px; + vertical-align: top; +} +.b-settings-open-pgp .list-table .open-pgp-key-img .svg-icon { + width: 12px; + height: 12px; +} +.b-settings-open-pgp .list-table .open-pgp-key-id, +.b-settings-open-pgp .list-table .open-pgp-key-user { + display: inline-block; + word-break: break-all; + -webkit-box-sizing: border-box; + box-sizing: border-box; + line-height: 22px; + cursor: default; +} +.b-settings-open-pgp .list-table .open-pgp-key-user-address:first-child { + line-height: 30px; + margin-bottom: -4px; +} +.b-settings-open-pgp .open-pgp-key-item .button-delete { + margin-right: 15px; + margin-top: 5px; + visibility: hidden; + opacity: 0; +} +.b-settings-open-pgp .open-pgp-key-item .delete-access.button-delete { + visibility: visible; + margin-right: 0; + opacity: 1; +} +.b-settings-open-pgp .open-pgp-key-item .delete-open-pgp-key, +.b-settings-open-pgp .open-pgp-key-item .view-open-pgp-key { + cursor: pointer; + opacity: 0.7; +} +.b-settings-open-pgp .open-pgp-key-item .delete-open-pgp-key:hover, +.b-settings-open-pgp .open-pgp-key-item .view-open-pgp-key:hover { + opacity: 0.9; +} +html.rl-mobile .b-settings-folders { + margin-right: 35px; +} +.b-settings-folders.ignore-folder-subscribe .subscribe-folder, +.b-settings-folders.ignore-folder-subscribe .unsubscribe-folder { + display: none; +} +.b-settings-folders .process-place { + text-align: center; + width: 600px; + padding: 14px 0; +} +.b-settings-folders .folders-list-error { + width: 550px; + margin: 10px 0px; +} +.b-settings-folders .list-table { + width: 600px; +} +.b-settings-folders .list-table .e-action { + cursor: pointer; +} +.b-settings-folders .list-table td { + padding: 4px 8px; + line-height: 30px; +} +.b-settings-folders .list-table .folder-padding { + display: inline-block; + width: 0; +} +.b-settings-folders .list-table .folder-name { + display: inline-block; + word-break: break-all; + white-space: pre-wrap; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin-left: 7px; + line-height: 22px; + cursor: default; +} +.b-settings-folders .list-table .folder-system-name { + display: inline-block; + line-height: 22px; + color: #999; + cursor: default; +} +.b-settings-folders .list-table .folder-name.can-be-edited:hover { + border-bottom: 1px dashed #333; + cursor: pointer; +} +.b-settings-folders .list-table .folder-name-input { + border-width: 1px; + margin-bottom: 0; + margin-left: -4px; +} +.b-settings-folders .folder-item.system .folder-name { + font-weight: bold; +} +.b-settings-folders .folder-item .button-delete { + margin-right: 15px; + margin-top: 5px; + visibility: hidden; + opacity: 0; +} +.b-settings-folders .folder-item .delete-access.button-delete { + visibility: visible; + margin-right: 0; + opacity: 1; +} +.b-settings-folders .folder-item .delete-folder, +.b-settings-folders .folder-item .subscribe-folder, +.b-settings-folders .folder-item .unsubscribe-folder, +.b-settings-folders .folder-item .check-folder, +.b-settings-folders .folder-item .uncheck-folder { + cursor: pointer; + opacity: 0.6; +} +.b-settings-folders .folder-item .unsubscribe-folder { + opacity: 0.2; +} +.b-settings-folders .folder-item .uncheck-folder { + opacity: 0.2; +} +.b-settings-folders .folder-padding.deep-1 { + width: 25px; +} +.b-settings-folders .folder-padding.deep-2 { + width: 40px; +} +.b-settings-folders .folder-padding.deep-3 { + width: 55px; +} +.b-settings-folders .folder-padding.deep-4 { + width: 70px; +} +.b-settings-folders .folder-padding.deep-5 { + width: 85px; +} +.b-settings-content .b-settings-themes .legend { + width: 100%; +} +html.rl-mobile .b-settings-content .b-settings-theme .legend { + width: auto; +} +html.rl-mobile .b-themes-list { + margin-right: 15px; +} +.b-themes-list .e-item { + display: inline-block; + border: 2px solid transparent; + cursor: pointer; + color: #000; + background-color: #fff; + padding: 16px; + margin: 5px; +} +.b-themes-list .e-item:hover { + border: 2px solid grey; +} +.b-themes-list .e-item.selected { + background-color: #eee; + border: 2px solid #000; +} +.b-themes-list .e-item .e-image { + width: 100px; + height: 100px; + border: 1px solid #ddd; +} +html.rl-mobile .b-settings-filters { + margin-right: 15px; +} +.b-settings-filters .process-place { + text-align: center; + width: 600px; + padding: 14px 0; +} +.b-settings-filters .list-table { + width: 600px; +} +.b-settings-filters .list-table td { + padding: 4px 8px; + line-height: 30px; +} +.b-settings-filters .list-table td.drag-wrapper { + padding: 4px 0; +} +.b-settings-filters .list-table .drag-handle { + color: #eee; +} +.b-settings-filters .list-table tr:hover .drag-handle { + color: #aaa; +} +.b-settings-filters .list-table .filter-img { + font-size: 12px; + margin-right: 5px; +} +.b-settings-filters .list-table .filter-name, +.b-settings-filters .list-table .filter-sub-name { + display: inline-block; + word-break: break-all; + -webkit-box-sizing: border-box; + box-sizing: border-box; + line-height: 22px; + cursor: pointer; +} +.b-settings-filters .list-table .filter-sub-name { + color: #aaa; +} +.b-settings-filters .filters-list-top-padding { + display: inline-block; + height: 5px; + width: 5px; +} +.b-settings-filters .filter-item { + white-space: nowrap; +} +.b-settings-filters .filter-item .e-action { + cursor: pointer; +} +.b-settings-filters .filter-item .drag-handle { + cursor: pointer; + cursor: all-scroll; +} +.b-settings-filters .filter-item .button-delete { + margin-right: 15px; + margin-top: 5px; + visibility: hidden; + opacity: 0; +} +.b-settings-filters .filter-item .delete-access.button-delete { + visibility: visible; + margin-right: 0; + opacity: 1; +} +.b-settings-filters .filter-item .delete-filter { + cursor: pointer; + opacity: 0.5; +} +.b-settings-filters .filter-item.ui-sortable-helper { + background: #F5F5F5; + border: 1px solid #DDD; +} +.b-settings-filters .filter-item.ui-sortable-helper .button-delete, +.b-settings-filters .filter-item.ui-sortable-helper .delete-filter { + display: none; +} +.b-settings-filters .filter-item.ui-sortable-helper td { + border-width: 0px; +} +.rl-cmd { + position: absolute; + bottom: 0; + left: 0; + right: 0; + top: auto; + height: 0; + z-index: 10000; + background: rgba(0, 0, 0, 0.85); + border-top: 1px solid #000; + overflow: hidden; + font-family: monospace; + -webkit-transition: height 0.1s ease-out; + -o-transition: height 0.1s ease-out; + transition: height 0.1s ease-out; +} +.rl-cmd.opened { + height: 250px; +} +.rl-cmd .rl-cmd-clr-error { + color: #CD3131; +} +.rl-cmd .rl-cmd-clr-info { + color: #BFBF00; +} +.rl-cmd .rl-cmd-clr-success { + color: #31FF40; +} +.rl-cmd .rl-cmd-wrp { + position: relative; + height: 100%; +} +.rl-cmd .rl-cmd-input-helper { + color: #666; +} +.rl-cmd .rl-cmd-input-prefix { + color: #31FF40; + display: inline-block; +} +.rl-cmd .rl-cmd-input-wrp { + position: absolute; + bottom: 0; + left: 10px; + right: 10px; +} +.rl-cmd .rl-cmd-input { + background: none; + border: none; + color: white; + display: inline-block; + width: calc(100% - 30px); + font-family: monospace; +} +.rl-cmd .rl-cmd-input:focus { + background: none; + border: none; +} +.rl-cmd .rl-cmd-history { + color: white; + font-family: monospace; + position: absolute; + top: 10px; + bottom: 60px; + left: 10px; + right: -30px; + overflow: hidden; + overflow-x: hidden; + overflow-y: auto; +} +@-webkit-keyframes highlight-folder-row { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + 50% { + -webkit-transform: scale(1.1); + transform: scale(1.1); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@keyframes highlight-folder-row { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + 50% { + -webkit-transform: scale(1.1); + transform: scale(1.1); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@-webkit-keyframes bounce-me { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + 50% { + -webkit-transform: scale(1.2); + transform: scale(1.2); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@keyframes bounce-me { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + 50% { + -webkit-transform: scale(1.2); + transform: scale(1.2); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@-webkit-keyframes textLoadingAnimationKeyFrame { + 0% { + opacity: 1; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes textLoadingAnimationKeyFrame { + 0% { + opacity: 1; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@-webkit-keyframes animate-stripes { + 0% { + background-position: 0 0; + } + 100% { + background-position: 60px 0; + } +} +@keyframes animate-stripes { + 0% { + background-position: 0 0; + } + 100% { + background-position: 60px 0; + } +} +@-webkit-keyframes login-form-shake { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + 12.5% { + -webkit-transform: translateX(-6px) rotateY(-5deg); + transform: translateX(-6px) rotateY(-5deg); + } + 37.5% { + -webkit-transform: translateX(5px) rotateY(4deg); + transform: translateX(5px) rotateY(4deg); + } + 62.5% { + -webkit-transform: translateX(-3px) rotateY(-2deg); + transform: translateX(-3px) rotateY(-2deg); + } + 87.5% { + -webkit-transform: translateX(2px) rotateY(1deg); + transform: translateX(2px) rotateY(1deg); + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +@keyframes login-form-shake { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + 12.5% { + -webkit-transform: translateX(-6px) rotateY(-5deg); + transform: translateX(-6px) rotateY(-5deg); + } + 37.5% { + -webkit-transform: translateX(5px) rotateY(4deg); + transform: translateX(5px) rotateY(4deg); + } + 62.5% { + -webkit-transform: translateX(-3px) rotateY(-2deg); + transform: translateX(-3px) rotateY(-2deg); + } + 87.5% { + -webkit-transform: translateX(2px) rotateY(1deg); + transform: translateX(2px) rotateY(1deg); + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +html.csstransitions.rl-started-trigger.no-mobile .b-login-content .loginFormWrapper { + /*transform: scale(1.1);*/ + -webkit-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + opacity: 0.5; +} +/*html.rl-started-trigger.no-mobile #rl-content { + opacity: 0.7; +}*/ +#rl-loading { + -webkit-transition: opacity 0.5s linear; + -o-transition: opacity 0.5s linear; + transition: opacity 0.5s linear; +} +html.csstransitions.rl-started-delay #rl-left { + -webkit-transition: width 0.3s ease-out; + -o-transition: width 0.3s ease-out; + transition: width 0.3s ease-out; +} +html.csstransitions.rl-started-delay #rl-right { + -webkit-transition: left 0.3s ease-out, right 0.3s ease-out; + -o-transition: left 0.3s ease-out, right 0.3s ease-out; + transition: left 0.3s ease-out, right 0.3s ease-out; +} +html.csstransitions.rl-started-delay #rl-sub-left, +html.csstransitions.rl-started-delay #rl-sub-left .messageList .inputSearch { + -webkit-transition: width 0.3s ease-out; + -o-transition: width 0.3s ease-out; + transition: width 0.3s ease-out; +} +html.csstransitions.rl-started-delay #rl-sub-right { + -webkit-transition: left 0.3s ease-out; + -o-transition: left 0.3s ease-out; + transition: left 0.3s ease-out; +} +html.rgba.cssanimations.backgroundsize .e-strip-animation { + background-size: 60px 60px; + background-image: -o-linear-gradient(315deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 50%, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0.1) 75%, transparent 75%, transparent); + background-image: linear-gradient(135deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 50%, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0.1) 75%, transparent 75%, transparent); + -webkit-animation: animate-stripes 2s linear infinite; + animation: animate-stripes 2s linear infinite; +} +html.rl-anim .rl-animated-inited { + opacity: 1; + -webkit-transition: opacity 0.5s linear; + -o-transition: opacity 0.5s linear; + transition: opacity 0.5s linear; +} +html.rl-anim .rl-animated-inited.rl-animated-hidden { + opacity: 0; +} +html.rl-anim.cssanimations.csstransitions.no-mobile .b-login-content .errorAnimated { + -webkit-animation: login-form-shake 400ms ease-in-out; + animation: login-form-shake 400ms ease-in-out; +} +html.rl-anim.no-mobile .b-login-content .errorAnimated .buttonLogin { + color: #b94a48; + font-weight: bold; +} +html.rl-anim.cssanimations.csstransitions.no-mobile .b-login-content .afterLoginHide { + opacity: 0; +} +html.rl-anim.csstransitions.no-mobile .btn-group.dropdown.colored-toggle.open .animate-this-icon-on-open { + -webkit-animation: bounce-me 0.5s linear; + animation: bounce-me 0.5s linear; +} +html.rl-anim.csstransitions.no-mobile .b-login-content .loginFormWrapper { + -webkit-transition: all 0.3s ease-out; + -o-transition: all 0.3s ease-out; + transition: all 0.3s ease-out; +} +html.rl-anim.csstransitions .button-delete-transitions { + -webkit-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; +} +html.rl-anim.cssanimations .b-folders .e-item .anim-action-class { + -webkit-animation: highlight-folder-row 0.5s linear; + animation: highlight-folder-row 0.5s linear; +} +html.rl-anim.csstransitions .b-folders .btn.buttonContacts { + -webkit-transition: margin 0.3s linear; + -o-transition: margin 0.3s linear; + transition: margin 0.3s linear; +} +html.rl-anim.csstransitions .b-folders .b-content.opacity-on-panel-disabled { + -webkit-transition: opacity 0.3s linear; + -o-transition: opacity 0.3s linear; + transition: opacity 0.3s linear; +} +html.rl-anim.csstransitions .messageList .messageListItem { + -webkit-transition: max-height 400ms ease; + -o-transition: max-height 400ms ease; + transition: max-height 400ms ease; +} +html.rl-anim.csstransitions .messageList .listDragOver { + -webkit-transition: all 400ms ease; + -o-transition: all 400ms ease; + transition: all 400ms ease; +} +html.rl-anim.csstransitions .b-list-content .e-contact-item { + -webkit-transition: max-height 400ms ease; + -o-transition: max-height 400ms ease; + transition: max-height 400ms ease; +} +html.rl-anim.csstransitions .modal.b-domain-content .modal-body { + -webkit-transition: left 500ms ease; + -o-transition: left 500ms ease; + transition: left 500ms ease; +} +html.rl-anim.csstransitions.rl-modal.rl-modal-animation .popups { + overflow: hidden; +} +html.rl-anim.csstransitions .modal.fade { + -webkit-transition: all 200ms ease-out; + -o-transition: all 200ms ease-out; + transition: all 200ms ease-out; + /*transform: scale(0.95);*/ + -webkit-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); +} +html.rl-anim.csstransitions .modal.fade.in { + -webkit-transform: none; + -ms-transform: none; + transform: none; +} +html.rl-anim.cssanimations .b-compose.loading .b-header-toolbar { + background-size: 60px 60px; + background-image: -o-linear-gradient(315deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: linear-gradient(135deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + -webkit-animation: animate-stripes 2s linear infinite; + animation: animate-stripes 2s linear infinite; +} +.textLoadingAnimationD1, +.textLoadingAnimationD2, +.textLoadingAnimationD3 { + -webkit-animation: textLoadingAnimationKeyFrame 1s linear infinite 0s; + animation: textLoadingAnimationKeyFrame 1s linear infinite 0s; +} +.textLoadingAnimationD2 { + -webkit-animation-delay: 0.3s; + animation-delay: 0.3s; +} +.textLoadingAnimationD3 { + -webkit-animation-delay: 0.6s; + animation-delay: 0.6s; +} +.rl-view-model.RL-Login, +.rl-view-model.RL-LoginNew, +.rl-view-model.RL-AdminLogin, +.rl-view-model.RL-About { + position: relative; + height: 100%; + z-index: 5; +} +.mfp-container .mfp-figure { + min-height: 300px; + min-width: 300px; +} +.ui-resizable-e { + right: -1px; + width: 5px; +} +.pswp__error-msg { + color: #ccc; +} +.pswp__error-msg a, +.pswp__error-msg a:hover { + color: #fff; +} +.pswp__img--placeholder { + opacity: 0; +} +.opentip-container { + z-index: 2001 !important; +} +.opentip-container .ot-content { + font-size: 13px; +} +.opentip-container.style-rainloopErrorTip .ot-content { + color: red; +} +.opentip-container.ot-show-effect-none, +.opentip-container.ot-hide-effect-none { + -webkit-transition: none !important; + -o-transition: none !important; + transition: none !important; +} +.opentip-container.ot-show-effect-fade { + -webkit-transition: none; + -o-transition: none; + transition: none; +} +.opentip-container.ot-show-effect-fade.ot-hidden { + opacity: 0; +} +.opentip-container.ot-show-effect-fade.ot-going-to-show { + opacity: 0; + -webkit-transition: opacity 0.2s ease-in-out; + -o-transition: opacity 0.2s ease-in-out; + transition: opacity 0.2s ease-in-out; +} +.opentip-container.ot-show-effect-fade.ot-showing { + opacity: 1; + -webkit-transition: opacity 0.2s ease-in-out; + -o-transition: opacity 0.2s ease-in-out; + transition: opacity 0.2s ease-in-out; +} +.opentip-container.ot-show-effect-fade.ot-visible { + opacity: 1; + -webkit-transition: none; + -o-transition: none; + transition: none; +} +svg-icon { + display: none; +} +.svg-icon { + border: 0; + outline: 0; + height: 16px; + width: 16px; + display: inline-block; + fill: #333; +} +.svg-icon.svg-icon-archive { + height: 14px; + width: 14px; +} +.lg-backdrop.in { + opacity: 0.8; +} +.btn .btn-text { + padding-left: 8px; +} +.active-scale-transition { + -webkit-transition: -webkit-transform .2s; + transition: -webkit-transform .2s; + -o-transition: transform .2s; + transition: transform .2s; + transition: transform .2s, -webkit-transform .2s; +} +.active-scale-transition:active { + -webkit-transform: scale(0.95); + -ms-transform: scale(0.95); + transform: scale(0.95); +} +html.glass input:-webkit-autofill, +html.glass input:-webkit-autofill:hover, +html.glass input:-webkit-autofill:focus, +html.glass input:-webkit-autofill:active { + -webkit-transition-delay: 9999s; + -webkit-transition: color 9999s ease-out, background-color 9999s ease-out; +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/app.min.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/app.min.css new file mode 100755 index 00000000..add48211 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/app.min.css @@ -0,0 +1,7 @@ +@charset "UTF-8";/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}/*! jQuery UI - v1.10.3 - 2013-11-25 +* http://jqueryui.com +* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.autocomplete.css, jquery.ui.menu.css, jquery.ui.theme.css +* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:0}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:400}.ui-menu .ui-menu-item a.ui-state-active,.ui-menu .ui-menu-item a.ui-state-focus{font-weight:400;margin:-1px}.ui-menu .ui-state-disabled{font-weight:400;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget button,.ui-widget input,.ui-widget select,.ui-widget textarea{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc;color:#222;font-weight:700}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #ccc;background:#eee;font-weight:400;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none}.ui-state-focus,.ui-state-hover,.ui-widget-content .ui-state-focus,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-focus,.ui-widget-header .ui-state-hover{border:1px solid #ccc;background:#eee;font-weight:400;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff;font-weight:400;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:700}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:400}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-corner-all,.ui-corner-left,.ui-corner-tl,.ui-corner-top{border-top-left-radius:2px}.ui-corner-all,.ui-corner-right,.ui-corner-top,.ui-corner-tr{border-top-right-radius:2px}.ui-corner-all,.ui-corner-bl,.ui-corner-bottom,.ui-corner-left{border-bottom-left-radius:2px}.ui-corner-all,.ui-corner-bottom,.ui-corner-br,.ui-corner-right{border-bottom-right-radius:2px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}@font-face{font-family:rainloop;src:url(fonts/rainloop.eot);src:url(fonts/rainloop.eot?#iefix) format("embedded-opentype"),url(fonts/rainloop.woff) format("woff"),url(fonts/rainloop.ttf) format("truetype"),url(fonts/rainloop.svg#rainloop) format("svg");font-weight:400;font-style:normal}[data-icon]:before{font-family:rainloop!important;content:attr(data-icon);font-style:normal!important;font-weight:400!important;font-variant:normal!important;text-transform:none!important;speak:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}[class*=" icon-"]:before,[class^=icon-]:before{font-family:rainloop!important;font-style:normal!important;font-weight:400!important;font-variant:normal!important;text-transform:none!important;speak:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-arrows-in:before{content:"\e000"}.icon-arrows-out:before{content:"\e001"}.icon-list:before{content:"\e002"}.icon-search:before{content:"\e003"}.icon-user:before{content:"\e004"}.icon-user-add:before{content:"\e005"}.icon-tags:before{content:"\e006"}.icon-paper-plane:before{content:"\e007"}.icon-reply:before{content:"\e008"}.icon-reply-all:before{content:"\e009"}.icon-forward:before{content:"\e00a"}.icon-info:before{content:"\e00b"}.icon-right-dir:before{content:"\e00c"}.icon-down-dir:before{content:"\e00d"}.icon-image:before{content:"\e00e"}.icon-print:before{content:"\e00f"}.icon-calendar:before{content:"\e010"}.icon-cog:before{content:"\e011"}.icon-wrench:before{content:"\e012"}.icon-rocket:before{content:"\e013"}.icon-fire:before{content:"\e014"}.icon-purchase:before{content:"\e015"}.icon-apple:before{content:"\e016"}.icon-dropbox:before{content:"\e017"}.icon-skype:before{content:"\e018"}.icon-creative-commons:before{content:"\e019"}.icon-ellipsis:before{content:"\e01a"}.icon-left:before{content:"\e01b"}.icon-right:before{content:"\e01c"}.icon-down:before{content:"\e01d"}.icon-right-mini:before{content:"\e01e"}.icon-down-mini:before{content:"\e01f"}.icon-up:before{content:"\e020"}.icon-star-empty:before{content:"\e021"}.icon-star:before{content:"\e022"}.icon-at:before{content:"\e023"}.icon-list-add:before{content:"\e024"}.icon-google:before{content:"\e025"}.icon-google-plus:before{content:"\e026"}.icon-twitter:before{content:"\e027"}.icon-youtube:before{content:"\e028"}.icon-warning:before{content:"\e029"}.icon-warning-alt:before{content:"\e02a"}.icon-power:before{content:"\e02b"}.icon-plus:before{content:"\e02c"}.icon-ok:before{content:"\e02d"}.icon-remove:before{content:"\e02e"}.icon-file:before{content:"\e02f"}.icon-file-code:before{content:"\e030"}.icon-file-chart-graph:before{content:"\e031"}.icon-file-zip:before{content:"\e032"}.icon-file-music:before{content:"\e033"}.icon-file-text:before{content:"\e034"}.icon-file-bookmark:before{content:"\e035"}.icon-file-image:before{content:"\e036"}.icon-file-analytics:before{content:"\e037"}.icon-file-certificate:before{content:"\e038"}.icon-attachment:before{content:"\e039"}.icon-file-excel:before{content:"\e03a"}.icon-file-movie:before{content:"\e03b"}.icon-folder-add:before{content:"\e03c"}.icon-folder:before{content:"\e03d"}.icon-floppy:before{content:"\e03e"}.icon-eye:before{content:"\e03f"}.icon-facebook-alt:before{content:"\e040"}.icon-facebook:before{content:"\e041"}.icon-bolt:before{content:"\e042"}.icon-download:before{content:"\e043"}.icon-upload:before{content:"\e044"}.icon-popup:before{content:"\e045"}.icon-github:before{content:"\e046"}.icon-telephone:before{content:"\e047"}.icon-mobile:before{content:"\e048"}.icon-pencil:before{content:"\e049"}.icon-trash:before{content:"\e04a"}.icon-left-middle:before{content:"\e04b"}.icon-right-middle:before{content:"\e04c"}.icon-repeat:before{content:"\e04d"}.icon-key:before{content:"\e04e"}.icon-lock:before{content:"\e04f"}.icon-home:before{content:"\e050"}.icon-address-book:before{content:"\e051"}.icon-share:before{content:"\e052"}.icon-suitcase:before{content:"\e053"}.icon-new-sign:before{content:"\e054"}.icon-users:before{content:"\e055"}.icon-earth:before{content:"\e056"}.icon-mail:before{content:"\e057"}.icon-checkbox-checked:before{content:"\e058"}.icon-checkbox-unchecked:before{content:"\e059"}.icon-checkbox-partial:before{content:"\e05a"}.icon-radio-checked:before{content:"\e05b"}.icon-radio-unchecked:before{content:"\e05c"}.icon-google-drive:before{content:"\e05d"}.icon-spinner:before{content:"\e05e"}.icon-archive:before{content:"\e05f"}.icon-buy-sign:before{content:"\e060"}.icon-filter:before{content:"\e061"}.icon-sync:before{content:"\e062"}.icon-ellipsis-alt:before{content:"\e063"}.icon-cloud-up:before{content:"\e064"}.icon-cloud-down:before{content:"\e065"}.icon-import:before{content:"\e066"}.icon-export:before{content:"\e067"}.icon-copy:before{content:"\e068"}.icon-angry-smiley:before{content:"\e069"}.icon-happy-smiley:before{content:"\e06a"}.icon-help:before{content:"\e06b"}.icon-resize-in:before{content:"\e06c"}.icon-resize-out:before{content:"\e06d"}.icon-world:before{content:"\e06f"}.icon-braille:before{content:"\e06e"}.icon-play:before{content:"\e070"}.icon-pause:before{content:"\e071"}.icon-stop:before{content:"\e072"}.icon-check-mark-circle-two:before{content:"\e073"}.icon-laptop:before{content:"\e075"}.nano{overflow:hidden!important}.nano .content{position:absolute;overflow:scroll;top:0;right:0;bottom:0;left:0;-webkit-overflow-scrolling:touch}.nano .content .content-wrapper{height:100%}.nano .content::-webkit-scrollbar{visibility:hidden}.has-scrollbar .content::-webkit-scrollbar{visibility:hidden}.nano-visibility-hidden::-webkit-scrollbar{visibility:hidden}.nano>.pane{background:0 0;position:absolute;width:5px;right:0;top:1px;bottom:1px;opacity:.01;-webkit-transition:.4s;-o-transition:.4s;transition:.4s;border-radius:5px;z-index:102;margin:2px}.nano>.pane2{background:0 0;position:absolute;height:5px;right:1px;left:1px;bottom:0;opacity:.01;-webkit-transition:.4s;-o-transition:.4s;transition:.4s;border-radius:5px;z-index:10000;margin:2px}.nano>.pane>.slider{background-color:#999;background-color:rgba(0,0,0,.3);position:relative;margin:0;border-radius:3px;width:5px}.nano>.pane2>.slider2{background-color:#999;background-color:rgba(0,0,0,.3);position:relative;margin:0;border-radius:3px;height:5px}.nano:hover>.pane,.nano:hover>.pane2,.pane.active,.pane.activescroll,.pane.flashed,.pane2.active,.pane2.activescroll,.pane2.flashed{opacity:.99}.nano>.pane.active,.nano>.pane:hover{background-color:rgba(0,0,0,.15)}.nano>.pane2.active,.nano>.pane2:hover{background-color:rgba(0,0,0,.15)}.nano>.pane.active>.slider,.nano>.pane:hover>.slider{background-color:rgba(0,0,0,.4)}.nano>.pane2.active>.slider2,.nano>.pane2:hover>.slider2{background-color:rgba(0,0,0,.4)}.letterfx{display:inline-block;margin:0;padding:0;-o-transition:all 1s;transition:all 1s;-ms-transition:all 1s;-webkit-transition:all 1s}.letterfx-spin-before{transform:rotate(3600deg);-ms-transform:rotate(3600deg);-webkit-transform:rotate(3600deg)}.letterfx-spin-after{-webkit-transform:none;-ms-transform:none;transform:none}.letterfx-fade-before{opacity:0}.letterfx-grow-before{transform:scale(0,0);-ms-transform:scale(0,0);-webkit-transform:scale(0,0)}.letterfx-grow-after{-webkit-transform:none;-ms-transform:none;transform:none}.letterfx-smear-before{color:transparent;text-shadow:-1px -1px 25px transparent}.letterfx-smear-after{color:inherit;text-shadow:0 0 #333}.letterfx-fall-before{visibility:hidden;transform:scale(3,3);-ms-transform:scale(3,3);-webkit-transform:scale(3,3)}.letterfx-fall-after{transform:scale(1,1);-ms-transform:scale(1,1);-webkit-transform:scale(1,1);text-shadow:0}.letterfx-swirl-before{visibility:hidden;transform:scale(3,3) rotate(3600deg);-ms-transform:scale(3,3) rotate(3600deg);-webkit-transform:scale(3,3) rotate(3600deg)}.letterfx-swirl-after{-webkit-transform:none;-ms-transform:none;transform:none;text-shadow:0}.letterfx-wave-container .letterfx{position:relative}.letterfx-wave-before{bottom:0}.letterfx-wave-after{bottom:15px}.letterfx-fly-bottom-container .letterfx,.letterfx-fly-left-container .letterfx,.letterfx-fly-right-container .letterfx,.letterfx-fly-top-container .letterfx{position:relative}.letterfx-fly-left-before{left:-50em}.letterfx-fly-left-after{left:0}.letterfx-fly-right-before{right:-50em}.letterfx-fly-right-after{right:0}.letterfx-fly-top-before{top:-20em}.letterfx-fly-top-after{top:0}.letterfx-fly-bottom-before{bottom:-20em}.letterfx-fly-bottom-after{bottom:0}.inputosaurus-container{background-color:#fff;border:1px solid #bcbec0;margin:0 5px 0 0;padding:0 3px;display:inline-block;cursor:text;font-size:14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.inputosaurus-container li{display:block;float:left;overflow:hidden;margin:2px 2px 0;padding:2px 3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;-ms-text-overflow:ellipsis;background-color:#e5eff7;border:#a9cae4 solid 1px;border-radius:2px;color:#5b9bcd;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.75) inset;box-shadow:0 1px 0 rgba(255,255,255,.75) inset;line-height:20px;cursor:default}.inputosaurus-container li.inputosaurus-selected{background-color:#bdd6eb}.inputosaurus-container li a{font-size:16px;color:#5b9bcd;padding:1px;text-decoration:none;outline:0}.inputosaurus-container .inputosaurus-input{border:none;-webkit-box-shadow:none;box-shadow:none;background-color:#fff;margin-top:3px}.inputosaurus-container .inputosaurus-input input{border:none;height:23px;font-size:14px;line-height:20px;color:#555;margin:0;outline:0;padding:0 0 1px 1px;width:25px;-webkit-box-shadow:none;box-shadow:none}.inputosaurus-container .inputosaurus-input input:hover{-webkit-box-shadow:none;box-shadow:none}.inputosaurus-input-hidden{display:none}.flag-wrapper{width:24px;height:16px;display:inline-block}.flag{width:16px;height:11px;display:inline-block;background:url(flags.png) no-repeat}.flag.flag-en{background-position:-144px -154px}.flag.flag-en_us{background-position:-144px -154px}.flag.flag-en_gb{background-position:-176px -44px}.flag.flag-en_uk{background-position:-176px -44px}.flag.flag-en_ca{background-position:-48px -22px}.flag.flag-el_gr{background-position:-112px -55px}.flag.flag-uk_ua{background-position:-96px -154px}.flag.flag-ru_ru{background-position:-224px -121px}.flag.flag-pt_br{background-position:-192px -11px}.flag.flag-pl_pl{background-position:-32px -121px}.flag.flag-nl_nl{background-position:-80px -110px}.flag.flag-nb_no{background-position:-96px -110px}.flag.flag-it_it{background-position:-208px -66px}.flag.flag-de_de{background-position:-80px -33px}.flag.flag-ro_ro{background-position:-192px -121px}.flag.flag-fi_fi{background-position:-64px -44px}.flag.flag-fr_fr{background-position:-144px -44px}.flag.flag-fr_ca{background-position:-144px -44px}.flag.flag-pt_pt{background-position:-112px -121px}.flag.flag-pt_br{background-position:-192px -11px}.flag.flag-ar_sa{background-position:0 -132px}.flag.flag-bg_bg{background-position:-80px -11px}.flag.flag-es_es{background-position:-16px -44px}.flag.flag-es_la{background-position:-16px -44px}.flag.flag-et_ee{background-position:-192px -33px}.flag.flag-fa_ir{background-position:-176px -66px}.flag.flag-lt_lt{background-position:-80px -88px}.flag.flag-lv_lv{background-position:-112px -88px}.flag.flag-is_is{background-position:-192px -66px}.flag.flag-hu_hu{background-position:-32px -66px}.flag.flag-ko_kr{background-position:-144px -77px}.flag.flag-ja_jp{background-position:-16px -77px}.flag.flag-sl_si{background-position:-128px -132px}.flag.flag-sk_sk{background-position:-144px -132px}.flag.flag-tr_tr{background-position:-16px -154px}.flag.flag-sv_se{background-position:-80px -132px}.flag.flag-cs_cz{background-position:-64px -33px}.flag.flag-zh_cn{background-position:-208px -22px}.flag.flag-zh_tw{background-position:-64px -154px}.flag.flag-zh_hk{background-position:-208px -22px}.flag.flag-da_dk{background-position:-112px -33px}.flag.flag-id_id{background-position:-64px -66px}.opentip-container,.opentip-container *{-webkit-box-sizing:border-box;box-sizing:border-box}.opentip-container{position:absolute;max-width:300px;z-index:100;-webkit-transition:-webkit-transform 1s ease-in-out;-o-transition:-o-transform 1s ease-in-out;transition:-webkit-transform 1s ease-in-out;-o-transition:transform 1s ease-in-out;transition:transform 1s ease-in-out;transition:transform 1s ease-in-out,-webkit-transform 1s ease-in-out;pointer-events:none;-webkit-transform:translateX(0) translateY(0);-ms-transform:translateX(0) translateY(0);transform:translateX(0) translateY(0)}.opentip-container.ot-fixed.ot-going-to-show.stem-top.stem-center,.opentip-container.ot-fixed.ot-hidden.stem-top.stem-center,.opentip-container.ot-fixed.ot-hiding.stem-top.stem-center{-webkit-transform:translateY(-5px);-ms-transform:translateY(-5px);transform:translateY(-5px)}.opentip-container.ot-fixed.ot-going-to-show.stem-top.stem-right,.opentip-container.ot-fixed.ot-hidden.stem-top.stem-right,.opentip-container.ot-fixed.ot-hiding.stem-top.stem-right{-webkit-transform:translateY(-5px) translateX(5px);-ms-transform:translateY(-5px) translateX(5px);transform:translateY(-5px) translateX(5px)}.opentip-container.ot-fixed.ot-going-to-show.stem-middle.stem-right,.opentip-container.ot-fixed.ot-hidden.stem-middle.stem-right,.opentip-container.ot-fixed.ot-hiding.stem-middle.stem-right{-webkit-transform:translateX(5px);-ms-transform:translateX(5px);transform:translateX(5px)}.opentip-container.ot-fixed.ot-going-to-show.stem-bottom.stem-right,.opentip-container.ot-fixed.ot-hidden.stem-bottom.stem-right,.opentip-container.ot-fixed.ot-hiding.stem-bottom.stem-right{-webkit-transform:translateY(5px) translateX(5px);-ms-transform:translateY(5px) translateX(5px);transform:translateY(5px) translateX(5px)}.opentip-container.ot-fixed.ot-going-to-show.stem-bottom.stem-center,.opentip-container.ot-fixed.ot-hidden.stem-bottom.stem-center,.opentip-container.ot-fixed.ot-hiding.stem-bottom.stem-center{-webkit-transform:translateY(5px);-ms-transform:translateY(5px);transform:translateY(5px)}.opentip-container.ot-fixed.ot-going-to-show.stem-bottom.stem-left,.opentip-container.ot-fixed.ot-hidden.stem-bottom.stem-left,.opentip-container.ot-fixed.ot-hiding.stem-bottom.stem-left{-webkit-transform:translateY(5px) translateX(-5px);-ms-transform:translateY(5px) translateX(-5px);transform:translateY(5px) translateX(-5px)}.opentip-container.ot-fixed.ot-going-to-show.stem-middle.stem-left,.opentip-container.ot-fixed.ot-hidden.stem-middle.stem-left,.opentip-container.ot-fixed.ot-hiding.stem-middle.stem-left{-webkit-transform:translateX(-5px);-ms-transform:translateX(-5px);transform:translateX(-5px)}.opentip-container.ot-fixed.ot-going-to-show.stem-top.stem-left,.opentip-container.ot-fixed.ot-hidden.stem-top.stem-left,.opentip-container.ot-fixed.ot-hiding.stem-top.stem-left{-webkit-transform:translateY(-5px) translateX(-5px);-ms-transform:translateY(-5px) translateX(-5px);transform:translateY(-5px) translateX(-5px)}.opentip-container.ot-fixed .opentip{pointer-events:auto}.opentip-container.ot-hidden{display:none}.opentip-container .opentip{position:relative;font-size:13px;line-height:120%;padding:9px 14px;color:#4f4b47;text-shadow:-1px -1px 0 rgba(255,255,255,.2)}.opentip-container .opentip .header{margin:0;padding:0}.opentip-container .opentip .ot-close{pointer-events:auto;display:block;position:absolute;top:-12px;left:60px;color:rgba(0,0,0,.5);background:rgba(0,0,0,0);text-decoration:none}.opentip-container .opentip .ot-close span{display:none}.opentip-container .opentip .ot-loading-indicator{display:none}.opentip-container.ot-loading .ot-loading-indicator{width:30px;height:30px;font-size:30px;line-height:30px;font-weight:700;display:block}.opentip-container.ot-loading .ot-loading-indicator span{display:block;-webkit-animation:otloading 2s linear infinite;animation:otloading 2s linear infinite;text-align:center}.opentip-container.style-alert .opentip,.opentip-container.style-dark .opentip{color:#f8f8f8;text-shadow:1px 1px 0 rgba(0,0,0,.2)}.opentip-container.style-glass .opentip{padding:15px 25px;color:#317cc5;text-shadow:1px 1px 8px rgba(0,94,153,.3)}.opentip-container.ot-hide-effect-fade{-webkit-transition:-webkit-transform .5s ease-in-out,opacity 1s ease-in-out;-o-transition:-o-transform .5s ease-in-out,opacity 1s ease-in-out;-webkit-transition:opacity 1s ease-in-out,-webkit-transform .5s ease-in-out;transition:opacity 1s ease-in-out,-webkit-transform .5s ease-in-out;-o-transition:transform .5s ease-in-out,opacity 1s ease-in-out;transition:transform .5s ease-in-out,opacity 1s ease-in-out;transition:transform .5s ease-in-out,opacity 1s ease-in-out,-webkit-transform .5s ease-in-out;opacity:1;-ms-filter:none;-webkit-filter:none;filter:none}.opentip-container.ot-hide-effect-fade.ot-hiding{opacity:0}.opentip-container.ot-show-effect-appear.ot-going-to-show,.opentip-container.ot-show-effect-appear.ot-showing{-webkit-transition:-webkit-transform .5s ease-in-out,opacity 1s ease-in-out;-o-transition:-o-transform .5s ease-in-out,opacity 1s ease-in-out;-webkit-transition:opacity 1s ease-in-out,-webkit-transform .5s ease-in-out;transition:opacity 1s ease-in-out,-webkit-transform .5s ease-in-out;-o-transition:transform .5s ease-in-out,opacity 1s ease-in-out;transition:transform .5s ease-in-out,opacity 1s ease-in-out;transition:transform .5s ease-in-out,opacity 1s ease-in-out,-webkit-transform .5s ease-in-out}.opentip-container.ot-show-effect-appear.ot-going-to-show{opacity:0}.opentip-container.ot-show-effect-appear.ot-showing{opacity:1;-ms-filter:none;-webkit-filter:none;filter:none}.opentip-container.ot-show-effect-appear.ot-visible{opacity:1;-ms-filter:none;-webkit-filter:none;filter:none}@-webkit-keyframes otloading{0%{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes otloading{0%{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}/*! + * Pikaday + * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ + */.pika-single{z-index:9999;display:block;position:relative;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.pika-single:after,.pika-single:before{content:" ";display:table}.pika-single:after{clear:both}.pika-single.is-hidden{display:none}.pika-single.is-bound{position:absolute;-webkit-box-shadow:0 5px 15px -5px rgba(0,0,0,.5);box-shadow:0 5px 15px -5px rgba(0,0,0,.5)}.pika-lendar{float:left;width:240px;margin:8px}.pika-title{position:relative;text-align:center}.pika-label{display:inline-block;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:700;background-color:#fff}.pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;opacity:0}.pika-next,.pika-prev{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5}.pika-next:hover,.pika-prev:hover{opacity:1}.is-rtl .pika-next,.pika-prev{float:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==)}.is-rtl .pika-prev,.pika-next{float:right;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=)}.pika-next.is-disabled,.pika-prev.is-disabled{cursor:default;opacity:.2}.pika-select{display:inline-block}.pika-table{width:100%;border-collapse:collapse;border-spacing:0;border:0}.pika-table td,.pika-table th{width:14.285714285714286%;padding:0}.pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:700;text-align:center}.pika-button{cursor:pointer;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-box-sizing:border-box;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.pika-week{font-size:11px;color:#999}.is-today .pika-button{color:#3af;font-weight:700}.has-event .pika-button,.is-selected .pika-button{color:#fff;font-weight:700;background:#3af;-webkit-box-shadow:inset 0 1px 3px #178fe5;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.has-event .pika-button{background:#005da9;-webkit-box-shadow:inset 0 1px 3px #0076c9;box-shadow:inset 0 1px 3px #0076c9}.is-disabled .pika-button,.is-inrange .pika-button{background:#d5e9f7}.is-startrange .pika-button{color:#fff;background:#6cb31d;-webkit-box-shadow:none;box-shadow:none;border-radius:3px}.is-endrange .pika-button{color:#fff;background:#3af;-webkit-box-shadow:none;box-shadow:none;border-radius:3px}.is-disabled .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.is-outside-current-month .pika-button{color:#999;opacity:.3}.is-selection-disabled{pointer-events:none;cursor:default}.pika-button:hover,.pika-row.pick-whole-week:hover .pika-button{color:#fff;background:#ff8000;-webkit-box-shadow:none;box-shadow:none;border-radius:3px}.pika-table abbr{border-bottom:none;cursor:help}.lg-sub-html,.lg-toolbar{background-color:rgba(0,0,0,.45)}#lg-counter,.lg-outer .lg-video-cont{vertical-align:middle;display:inline-block}@font-face{font-family:lg;src:url(fonts/lg.eot?n1z373);src:url(fonts/lg.eot?#iefixn1z373) format("embedded-opentype"),url(fonts/lg.woff?n1z373) format("woff"),url(fonts/lg.ttf?n1z373) format("truetype"),url(fonts/lg.svg?n1z373#lg) format("svg");font-weight:400;font-style:normal}.lg-icon{font-family:lg;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.lg-actions .lg-next,.lg-actions .lg-prev{background-color:rgba(0,0,0,.45);border-radius:2px;color:#999;cursor:pointer;display:block;font-size:22px;margin-top:-10px;padding:8px 10px 9px;position:absolute;top:50%;z-index:1080}.lg-actions .lg-next.disabled,.lg-actions .lg-prev.disabled{pointer-events:none;opacity:.5}.lg-actions .lg-next:hover,.lg-actions .lg-prev:hover{color:#fff}.lg-actions .lg-next{right:20px}.lg-actions .lg-next:before{content:"\e095"}.lg-actions .lg-prev{left:20px}.lg-actions .lg-prev:after{content:"\e094"}@-webkit-keyframes lg-right-end{0%,100%{left:0}50%{left:-30px}}@keyframes lg-right-end{0%,100%{left:0}50%{left:-30px}}@-webkit-keyframes lg-left-end{0%,100%{left:0}50%{left:30px}}@keyframes lg-left-end{0%,100%{left:0}50%{left:30px}}.lg-outer.lg-right-end .lg-object{-webkit-animation:lg-right-end .3s;animation:lg-right-end .3s;position:relative}.lg-outer.lg-left-end .lg-object{-webkit-animation:lg-left-end .3s;animation:lg-left-end .3s;position:relative}.lg-toolbar{z-index:1082;left:0;position:absolute;top:0;width:100%}.lg-toolbar .lg-icon{color:#999;cursor:pointer;float:right;font-size:24px;height:47px;line-height:27px;padding:10px 0;text-align:center;width:50px;text-decoration:none!important;outline:0;-webkit-transition:color .2s linear;-o-transition:color .2s linear;transition:color .2s linear}.lg-toolbar .lg-icon:hover{color:#fff}.lg-toolbar .lg-close:after{content:"\e070"}.lg-toolbar .lg-download:after{content:"\e0f2"}.lg-sub-html{bottom:0;color:#eee;font-size:16px;left:0;padding:10px 40px;position:fixed;right:0;text-align:center;z-index:1080}.lg-sub-html h4{margin:0;font-size:13px;font-weight:700}.lg-sub-html p{font-size:12px;margin:5px 0 0}#lg-counter{color:#999;font-size:16px;padding-left:20px;padding-top:12px}.lg-next,.lg-prev,.lg-toolbar{opacity:1;-webkit-transition:-webkit-transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;-o-transition:-o-transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;-webkit-transition:opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear,-webkit-transform .35s cubic-bezier(0,0,.25,1) 0s;transition:opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear,-webkit-transform .35s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;transition:transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;transition:transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear,-webkit-transform .35s cubic-bezier(0,0,.25,1) 0s}.lg-hide-items .lg-prev{opacity:0;-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}.lg-hide-items .lg-next{opacity:0;-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}.lg-hide-items .lg-toolbar{opacity:0;-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-object{-webkit-transform:scale3d(.5,.5,.5);transform:scale3d(.5,.5,.5);opacity:0;-webkit-transition:-webkit-transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;-o-transition:-o-transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;-webkit-transition:opacity 250ms cubic-bezier(0,0,.25,1),-webkit-transform 250ms cubic-bezier(0,0,.25,1) 0s!important;transition:opacity 250ms cubic-bezier(0,0,.25,1),-webkit-transform 250ms cubic-bezier(0,0,.25,1) 0s!important;-o-transition:transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;transition:transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;transition:transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1),-webkit-transform 250ms cubic-bezier(0,0,.25,1) 0s!important;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-item.lg-complete .lg-object{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-outer .lg-thumb-outer{background-color:#0d0a0a;bottom:0;position:absolute;width:100%;z-index:1080;max-height:350px;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,.25,1) 0s;-o-transition:-o-transform .25s cubic-bezier(0,0,.25,1) 0s;transition:-webkit-transform .25s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform .25s cubic-bezier(0,0,.25,1) 0s;transition:transform .25s cubic-bezier(0,0,.25,1) 0s;transition:transform .25s cubic-bezier(0,0,.25,1) 0s,-webkit-transform .25s cubic-bezier(0,0,.25,1) 0s}.lg-outer .lg-thumb-outer.lg-grab .lg-thumb-item{cursor:-webkit-grab;cursor:-o-grab;cursor:-ms-grab;cursor:grab}.lg-outer .lg-thumb-outer.lg-grabbing .lg-thumb-item{cursor:move;cursor:-webkit-grabbing;cursor:-o-grabbing;cursor:-ms-grabbing;cursor:grabbing}.lg-outer .lg-thumb-outer.lg-dragging .lg-thumb{-webkit-transition-duration:0s!important;-o-transition-duration:0s!important;transition-duration:0s!important}.lg-outer.lg-thumb-open .lg-thumb-outer{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.lg-outer .lg-thumb{padding:10px 0;height:100%;margin-bottom:-5px}.lg-outer .lg-thumb-item{cursor:pointer;float:left;overflow:hidden;height:100%;border:2px solid #fff;border-radius:4px;margin-bottom:5px}@media (min-width:1025px){.lg-outer .lg-thumb-item{-webkit-transition:border-color .25s ease;-o-transition:border-color .25s ease;transition:border-color .25s ease}}.lg-outer .lg-thumb-item.active,.lg-outer .lg-thumb-item:hover{border-color:#a90707}.lg-outer .lg-thumb-item img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.lg-outer.lg-has-thumb .lg-item{padding-bottom:120px}.lg-outer.lg-can-toggle .lg-item{padding-bottom:0}.lg-outer.lg-pull-caption-up .lg-sub-html{-webkit-transition:bottom .25s ease;-o-transition:bottom .25s ease;transition:bottom .25s ease}.lg-outer.lg-pull-caption-up.lg-thumb-open .lg-sub-html{bottom:100px}.lg-outer .lg-toogle-thumb{background-color:#0d0a0a;border-radius:2px 2px 0 0;color:#999;cursor:pointer;font-size:24px;height:39px;line-height:27px;padding:5px 0;position:absolute;right:20px;text-align:center;top:-39px;width:50px}.lg-outer .lg-toogle-thumb:after{content:"\e1ff"}.lg-outer .lg-toogle-thumb:hover{color:#fff}.lg-outer .lg-video-cont{max-width:1140px;max-height:100%;width:100%;padding:0 5px}.lg-outer .lg-video{width:100%;height:0;padding-bottom:56.25%;overflow:hidden;position:relative}.lg-outer .lg-video .lg-object{display:inline-block;position:absolute;top:0;left:0;width:100%!important;height:100%!important}.lg-outer .lg-video .lg-video-play{width:84px;height:59px;position:absolute;left:50%;top:50%;margin-left:-42px;margin-top:-30px;z-index:1080;cursor:pointer}.lg-outer .lg-has-vimeo .lg-video-play{background:url(img/vimeo-play.png) no-repeat}.lg-outer .lg-has-vimeo:hover .lg-video-play{background:url(img/vimeo-play.png) 0 -58px no-repeat}.lg-outer .lg-has-html5 .lg-video-play{background:url(img/video-play.png) no-repeat;height:64px;margin-left:-32px;margin-top:-32px;width:64px;opacity:.8}.lg-outer .lg-has-html5:hover .lg-video-play{opacity:1}.lg-outer .lg-has-youtube .lg-video-play{background:url(img/youtube-play.png) no-repeat}.lg-outer .lg-has-youtube:hover .lg-video-play{background:url(img/youtube-play.png) 0 -60px no-repeat}.lg-outer .lg-video-object{width:100%!important;height:100%!important;position:absolute;top:0;left:0}.lg-outer .lg-has-video .lg-video-object{visibility:hidden}.lg-outer .lg-has-video.lg-video-playing .lg-object,.lg-outer .lg-has-video.lg-video-playing .lg-video-play{display:none}.lg-outer .lg-has-video.lg-video-playing .lg-video-object{visibility:visible}.lg-progress-bar{background-color:#333;height:5px;left:0;position:absolute;top:0;width:100%;z-index:1083;opacity:0;-webkit-transition:opacity 80ms ease 0s;-o-transition:opacity 80ms ease 0s;transition:opacity 80ms ease 0s}.lg-progress-bar .lg-progress{background-color:#a90707;height:5px;width:0}.lg-progress-bar.lg-start .lg-progress{width:100%}.lg-show-autoplay .lg-progress-bar{opacity:1}.lg-autoplay-button:after{content:"\e01d"}.lg-show-autoplay .lg-autoplay-button:after{content:"\e01a"}.lg-outer.lg-css3.lg-zoom-dragging .lg-item.lg-complete.lg-zoomable .lg-image,.lg-outer.lg-css3.lg-zoom-dragging .lg-item.lg-complete.lg-zoomable .lg-img-wrap{-webkit-transition-duration:0s;-o-transition-duration:0s;transition-duration:0s}.lg-outer .lg-item.lg-complete.lg-zoomable .lg-img-wrap{-webkit-transition:left .3s cubic-bezier(0,0,.25,1) 0s,top .3s cubic-bezier(0,0,.25,1) 0s;-o-transition:left .3s cubic-bezier(0,0,.25,1) 0s,top .3s cubic-bezier(0,0,.25,1) 0s;transition:left .3s cubic-bezier(0,0,.25,1) 0s,top .3s cubic-bezier(0,0,.25,1) 0s;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.lg-outer .lg-item.lg-complete.lg-zoomable .lg-image{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);-webkit-transition:-webkit-transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;-o-transition:-o-transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;-webkit-transition:opacity .15s,-webkit-transform .3s cubic-bezier(0,0,.25,1) 0s!important;transition:opacity .15s,-webkit-transform .3s cubic-bezier(0,0,.25,1) 0s!important;-o-transition:transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;transition:transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;transition:transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s,-webkit-transform .3s cubic-bezier(0,0,.25,1) 0s!important;-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-backface-visibility:hidden;backface-visibility:hidden}#lg-zoom-in:after{content:"\e311"}#lg-actual-size{font-size:20px}#lg-actual-size:after{content:"\e033"}#lg-zoom-out{opacity:.5;pointer-events:none}#lg-zoom-out:after{content:"\e312"}.lg-zoomed #lg-zoom-out{opacity:1;pointer-events:auto}.lg-outer .lg-pager-outer{bottom:60px;left:0;position:absolute;right:0;text-align:center;z-index:1080;height:10px}.lg-outer .lg-pager-outer.lg-pager-hover .lg-pager-cont{overflow:visible}.lg-outer .lg-pager-cont{cursor:pointer;display:inline-block;overflow:hidden;position:relative;vertical-align:top;margin:0 5px}.lg-outer .lg-pager-cont:hover .lg-pager-thumb-cont{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.lg-outer .lg-pager-cont.lg-pager-active .lg-pager{-webkit-box-shadow:0 0 0 2px #fff inset;box-shadow:0 0 0 2px #fff inset}.lg-outer .lg-pager-thumb-cont{background-color:#fff;color:#fff;bottom:100%;height:83px;left:0;margin-bottom:20px;margin-left:-60px;opacity:0;padding:5px;position:absolute;width:120px;border-radius:3px;-webkit-transition:opacity .15s ease 0s,-webkit-transform .15s ease 0s;-o-transition:opacity .15s ease 0s,-o-transform .15s ease 0s;transition:opacity .15s ease 0s,-webkit-transform .15s ease 0s;-o-transition:opacity .15s ease 0s,transform .15s ease 0s;transition:opacity .15s ease 0s,transform .15s ease 0s;transition:opacity .15s ease 0s,transform .15s ease 0s,-webkit-transform .15s ease 0s;-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}.lg-outer .lg-pager-thumb-cont img{width:100%;height:100%}.lg-outer .lg-pager{background-color:rgba(255,255,255,.5);border-radius:50%;-webkit-box-shadow:0 0 0 8px rgba(255,255,255,.7) inset;box-shadow:0 0 0 8px rgba(255,255,255,.7) inset;display:block;height:12px;-webkit-transition:box-shadow .3s ease 0s;-o-transition:box-shadow .3s ease 0s;-webkit-transition:-webkit-box-shadow .3s ease 0s;transition:-webkit-box-shadow .3s ease 0s;transition:box-shadow .3s ease 0s;transition:box-shadow .3s ease 0s,-webkit-box-shadow .3s ease 0s;width:12px}.lg-outer .lg-pager:focus,.lg-outer .lg-pager:hover{-webkit-box-shadow:0 0 0 8px #fff inset;box-shadow:0 0 0 8px #fff inset}.lg-outer .lg-caret{border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px dashed;bottom:-10px;display:inline-block;height:0;left:50%;margin-left:-5px;position:absolute;vertical-align:middle;width:0}.lg-outer,.lg-outer .lg,.lg-outer .lg-inner{width:100%;height:100%}.lg-fullscreen:after{content:"\e20c"}.lg-fullscreen-on .lg-fullscreen:after{content:"\e20d"}.group:after,.group:before{display:table;content:"";line-height:0}.group:after{clear:both}.lg-outer{position:fixed;top:0;left:0;z-index:1050;opacity:0;-webkit-transition:opacity .15s ease 0s;-o-transition:opacity .15s ease 0s;transition:opacity .15s ease 0s}.lg-outer *{-webkit-box-sizing:border-box;box-sizing:border-box}.lg-outer.lg-visible{opacity:1}.lg-outer.lg-css3 .lg-item.lg-current,.lg-outer.lg-css3 .lg-item.lg-next-slide,.lg-outer.lg-css3 .lg-item.lg-prev-slide{-webkit-transition-duration:inherit!important;-o-transition-duration:inherit!important;transition-duration:inherit!important;-webkit-transition-timing-function:inherit!important;-o-transition-timing-function:inherit!important;transition-timing-function:inherit!important}.lg-outer.lg-css3.lg-dragging .lg-item.lg-current,.lg-outer.lg-css3.lg-dragging .lg-item.lg-next-slide,.lg-outer.lg-css3.lg-dragging .lg-item.lg-prev-slide{-webkit-transition-duration:0s!important;-o-transition-duration:0s!important;transition-duration:0s!important;opacity:1}.lg-outer.lg-grab img.lg-object{cursor:-webkit-grab;cursor:-o-grab;cursor:-ms-grab;cursor:grab}.lg-outer.lg-grabbing img.lg-object{cursor:move;cursor:-webkit-grabbing;cursor:-o-grabbing;cursor:-ms-grabbing;cursor:grabbing}.lg-outer .lg{position:relative;overflow:hidden;margin-left:auto;margin-right:auto;max-width:100%;max-height:100%}.lg-outer .lg-inner{position:absolute;left:0;top:0;white-space:nowrap}.lg-outer .lg-item{background:url(img/loading.gif) center center no-repeat;display:none!important}.lg-outer.lg-css .lg-current,.lg-outer.lg-css3 .lg-current,.lg-outer.lg-css3 .lg-next-slide,.lg-outer.lg-css3 .lg-prev-slide{display:inline-block!important}.lg-outer .lg-img-wrap,.lg-outer .lg-item{display:inline-block;text-align:center;position:absolute;width:100%;height:100%}.lg-outer .lg-img-wrap:before,.lg-outer .lg-item:before{content:"";display:inline-block;height:50%;width:1px;margin-right:-1px}.lg-outer .lg-img-wrap{position:absolute;padding:0 5px;left:0;right:0;top:0;bottom:0}.lg-outer .lg-item.lg-complete{background-image:none}.lg-outer .lg-item.lg-current{z-index:1060}.lg-outer .lg-image{display:inline-block;vertical-align:middle;max-width:100%;max-height:100%;width:auto!important;height:auto!important}.lg-outer.lg-show-after-load .lg-item .lg-object,.lg-outer.lg-show-after-load .lg-item .lg-video-play{opacity:0;-webkit-transition:opacity .15s ease 0s;-o-transition:opacity .15s ease 0s;transition:opacity .15s ease 0s}.lg-outer.lg-show-after-load .lg-item.lg-complete .lg-object,.lg-outer.lg-show-after-load .lg-item.lg-complete .lg-video-play{opacity:1}.lg-outer .lg-empty-html,.lg-outer.lg-hide-download #lg-download{display:none}.lg-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;z-index:1040;background-color:#000;opacity:0;-webkit-transition:opacity .15s ease 0s;-o-transition:opacity .15s ease 0s;transition:opacity .15s ease 0s}.lg-backdrop.in{opacity:1}.lg-css3.lg-no-trans .lg-current,.lg-css3.lg-no-trans .lg-next-slide,.lg-css3.lg-no-trans .lg-prev-slide{-webkit-transition:none 0s ease 0s!important;-o-transition:none 0s ease 0s!important;transition:none 0s ease 0s!important}.lg-css3.lg-use-css3 .lg-item,.lg-css3.lg-use-left .lg-item{-webkit-backface-visibility:hidden;backface-visibility:hidden}.lg-css3.lg-fade .lg-item{opacity:0}.lg-css3.lg-fade .lg-item.lg-current{opacity:1}.lg-css3.lg-fade .lg-item.lg-current,.lg-css3.lg-fade .lg-item.lg-next-slide,.lg-css3.lg-fade .lg-item.lg-prev-slide{-webkit-transition:opacity .1s ease 0s;-o-transition:opacity .1s ease 0s;transition:opacity .1s ease 0s}.lg-css3.lg-slide.lg-use-css3 .lg-item{opacity:0}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current,.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide,.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide.lg-use-left .lg-item{opacity:0;position:absolute;left:0}.lg-css3.lg-slide.lg-use-left .lg-item.lg-prev-slide{left:-100%}.lg-css3.lg-slide.lg-use-left .lg-item.lg-next-slide{left:100%}.lg-css3.lg-slide.lg-use-left .lg-item.lg-current{left:0;opacity:1}.lg-css3.lg-slide.lg-use-left .lg-item.lg-current,.lg-css3.lg-slide.lg-use-left .lg-item.lg-next-slide,.lg-css3.lg-slide.lg-use-left .lg-item.lg-prev-slide{-webkit-transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s}.lg-css3.lg-zoom-in .lg-item{opacity:0}.lg-css3.lg-zoom-in .lg-item.lg-next-slide,.lg-css3.lg-zoom-in .lg-item.lg-prev-slide{-webkit-transform:scale3d(1.3,1.3,1.3);transform:scale3d(1.3,1.3,1.3)}.lg-css3.lg-zoom-in .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-in .lg-item.lg-current,.lg-css3.lg-zoom-in .lg-item.lg-next-slide,.lg-css3.lg-zoom-in .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-zoom-in-big .lg-item{opacity:0}.lg-css3.lg-zoom-in-big .lg-item.lg-next-slide,.lg-css3.lg-zoom-in-big .lg-item.lg-prev-slide{-webkit-transform:scale3d(2,2,2);transform:scale3d(2,2,2)}.lg-css3.lg-zoom-in-big .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-in-big .lg-item.lg-current,.lg-css3.lg-zoom-in-big .lg-item.lg-next-slide,.lg-css3.lg-zoom-in-big .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-zoom-out .lg-item{opacity:0}.lg-css3.lg-zoom-out .lg-item.lg-next-slide,.lg-css3.lg-zoom-out .lg-item.lg-prev-slide{-webkit-transform:scale3d(.7,.7,.7);transform:scale3d(.7,.7,.7)}.lg-css3.lg-zoom-out .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-out .lg-item.lg-current,.lg-css3.lg-zoom-out .lg-item.lg-next-slide,.lg-css3.lg-zoom-out .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-zoom-out-big .lg-item{opacity:0}.lg-css3.lg-zoom-out-big .lg-item.lg-next-slide,.lg-css3.lg-zoom-out-big .lg-item.lg-prev-slide{-webkit-transform:scale3d(0,0,0);transform:scale3d(0,0,0)}.lg-css3.lg-zoom-out-big .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-out-big .lg-item.lg-current,.lg-css3.lg-zoom-out-big .lg-item.lg-next-slide,.lg-css3.lg-zoom-out-big .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-zoom-out-in .lg-item{opacity:0}.lg-css3.lg-zoom-out-in .lg-item.lg-prev-slide{-webkit-transform:scale3d(0,0,0);transform:scale3d(0,0,0)}.lg-css3.lg-zoom-out-in .lg-item.lg-next-slide{-webkit-transform:scale3d(2,2,2);transform:scale3d(2,2,2)}.lg-css3.lg-zoom-out-in .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-out-in .lg-item.lg-current,.lg-css3.lg-zoom-out-in .lg-item.lg-next-slide,.lg-css3.lg-zoom-out-in .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-zoom-in-out .lg-item{opacity:0}.lg-css3.lg-zoom-in-out .lg-item.lg-prev-slide{-webkit-transform:scale3d(2,2,2);transform:scale3d(2,2,2)}.lg-css3.lg-zoom-in-out .lg-item.lg-next-slide{-webkit-transform:scale3d(0,0,0);transform:scale3d(0,0,0)}.lg-css3.lg-zoom-in-out .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-in-out .lg-item.lg-current,.lg-css3.lg-zoom-in-out .lg-item.lg-next-slide,.lg-css3.lg-zoom-in-out .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-soft-zoom .lg-item{opacity:0}.lg-css3.lg-soft-zoom .lg-item.lg-prev-slide{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}.lg-css3.lg-soft-zoom .lg-item.lg-next-slide{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}.lg-css3.lg-soft-zoom .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-soft-zoom .lg-item.lg-current,.lg-css3.lg-soft-zoom .lg-item.lg-next-slide,.lg-css3.lg-soft-zoom .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-scale-up .lg-item{opacity:0}.lg-css3.lg-scale-up .lg-item.lg-next-slide,.lg-css3.lg-scale-up .lg-item.lg-prev-slide{-ms-transform:scale3d(.8,.8,.8) translate3d(0,10%,0);-webkit-transform:scale3d(.8,.8,.8) translate3d(0,10%,0);transform:scale3d(.8,.8,.8) translate3d(0,10%,0)}.lg-css3.lg-scale-up .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-scale-up .lg-item.lg-current,.lg-css3.lg-scale-up .lg-item.lg-next-slide,.lg-css3.lg-scale-up .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular .lg-item{opacity:0}.lg-css3.lg-slide-circular .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(-100%,0,0);-webkit-transform:scale3d(0,0,0) translate3d(-100%,0,0);transform:scale3d(0,0,0) translate3d(-100%,0,0)}.lg-css3.lg-slide-circular .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(100%,0,0);-webkit-transform:scale3d(0,0,0) translate3d(100%,0,0);transform:scale3d(0,0,0) translate3d(100%,0,0)}.lg-css3.lg-slide-circular .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular .lg-item.lg-current,.lg-css3.lg-slide-circular .lg-item.lg-next-slide,.lg-css3.lg-slide-circular .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular-up .lg-item{opacity:0}.lg-css3.lg-slide-circular-up .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(-100%,-100%,0);-webkit-transform:scale3d(0,0,0) translate3d(-100%,-100%,0);transform:scale3d(0,0,0) translate3d(-100%,-100%,0)}.lg-css3.lg-slide-circular-up .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(100%,-100%,0);-webkit-transform:scale3d(0,0,0) translate3d(100%,-100%,0);transform:scale3d(0,0,0) translate3d(100%,-100%,0)}.lg-css3.lg-slide-circular-up .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular-up .lg-item.lg-current,.lg-css3.lg-slide-circular-up .lg-item.lg-next-slide,.lg-css3.lg-slide-circular-up .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular-down .lg-item{opacity:0}.lg-css3.lg-slide-circular-down .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(-100%,100%,0);-webkit-transform:scale3d(0,0,0) translate3d(-100%,100%,0);transform:scale3d(0,0,0) translate3d(-100%,100%,0)}.lg-css3.lg-slide-circular-down .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(100%,100%,0);-webkit-transform:scale3d(0,0,0) translate3d(100%,100%,0);transform:scale3d(0,0,0) translate3d(100%,100%,0)}.lg-css3.lg-slide-circular-down .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular-down .lg-item.lg-current,.lg-css3.lg-slide-circular-down .lg-item.lg-next-slide,.lg-css3.lg-slide-circular-down .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular-vertical .lg-item{opacity:0}.lg-css3.lg-slide-circular-vertical .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(0,-100%,0);-webkit-transform:scale3d(0,0,0) translate3d(0,-100%,0);transform:scale3d(0,0,0) translate3d(0,-100%,0)}.lg-css3.lg-slide-circular-vertical .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(0,100%,0);-webkit-transform:scale3d(0,0,0) translate3d(0,100%,0);transform:scale3d(0,0,0) translate3d(0,100%,0)}.lg-css3.lg-slide-circular-vertical .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular-vertical .lg-item.lg-current,.lg-css3.lg-slide-circular-vertical .lg-item.lg-next-slide,.lg-css3.lg-slide-circular-vertical .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular-vertical-left .lg-item{opacity:0}.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(-100%,-100%,0);-webkit-transform:scale3d(0,0,0) translate3d(-100%,-100%,0);transform:scale3d(0,0,0) translate3d(-100%,-100%,0)}.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(-100%,100%,0);-webkit-transform:scale3d(0,0,0) translate3d(-100%,100%,0);transform:scale3d(0,0,0) translate3d(-100%,100%,0)}.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-current,.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-next-slide,.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular-vertical-down .lg-item{opacity:0}.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(100%,-100%,0);-webkit-transform:scale3d(0,0,0) translate3d(100%,-100%,0);transform:scale3d(0,0,0) translate3d(100%,-100%,0)}.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(100%,100%,0);-webkit-transform:scale3d(0,0,0) translate3d(100%,100%,0);transform:scale3d(0,0,0) translate3d(100%,100%,0)}.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-current,.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-next-slide,.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-vertical .lg-item{opacity:0}.lg-css3.lg-slide-vertical .lg-item.lg-prev-slide{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.lg-css3.lg-slide-vertical .lg-item.lg-next-slide{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.lg-css3.lg-slide-vertical .lg-item.lg-current{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-vertical .lg-item.lg-current,.lg-css3.lg-slide-vertical .lg-item.lg-next-slide,.lg-css3.lg-slide-vertical .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-vertical-growth .lg-item{opacity:0}.lg-css3.lg-slide-vertical-growth .lg-item.lg-prev-slide{-ms-transform:scale3d(.5,.5,.5) translate3d(0,-150%,0);-webkit-transform:scale3d(.5,.5,.5) translate3d(0,-150%,0);transform:scale3d(.5,.5,.5) translate3d(0,-150%,0)}.lg-css3.lg-slide-vertical-growth .lg-item.lg-next-slide{-ms-transform:scale3d(.5,.5,.5) translate3d(0,150%,0);-webkit-transform:scale3d(.5,.5,.5) translate3d(0,150%,0);transform:scale3d(.5,.5,.5) translate3d(0,150%,0)}.lg-css3.lg-slide-vertical-growth .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-vertical-growth .lg-item.lg-current,.lg-css3.lg-slide-vertical-growth .lg-item.lg-next-slide,.lg-css3.lg-slide-vertical-growth .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-only .lg-item{opacity:0}.lg-css3.lg-slide-skew-only .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only .lg-item.lg-prev-slide{-ms-transform:skew(10deg,0deg);-webkit-transform:skew(10deg,0deg);transform:skew(10deg,0deg)}.lg-css3.lg-slide-skew-only .lg-item.lg-current{-ms-transform:skew(0deg,0deg);-webkit-transform:skew(0deg,0deg);transform:skew(0deg,0deg);opacity:1}.lg-css3.lg-slide-skew-only .lg-item.lg-current,.lg-css3.lg-slide-skew-only .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-only-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-only-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-rev .lg-item.lg-prev-slide{-ms-transform:skew(-10deg,0deg);-webkit-transform:skew(-10deg,0deg);transform:skew(-10deg,0deg)}.lg-css3.lg-slide-skew-only-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg);-webkit-transform:skew(0deg,0deg);transform:skew(0deg,0deg);opacity:1}.lg-css3.lg-slide-skew-only-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-only-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-only-y .lg-item{opacity:0}.lg-css3.lg-slide-skew-only-y .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-y .lg-item.lg-prev-slide{-ms-transform:skew(0deg,10deg);-webkit-transform:skew(0deg,10deg);transform:skew(0deg,10deg)}.lg-css3.lg-slide-skew-only-y .lg-item.lg-current{-ms-transform:skew(0deg,0deg);-webkit-transform:skew(0deg,0deg);transform:skew(0deg,0deg);opacity:1}.lg-css3.lg-slide-skew-only-y .lg-item.lg-current,.lg-css3.lg-slide-skew-only-y .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-y .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-only-y-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-prev-slide{-ms-transform:skew(0deg,-10deg);-webkit-transform:skew(0deg,-10deg);transform:skew(0deg,-10deg)}.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg);-webkit-transform:skew(0deg,0deg);transform:skew(0deg,0deg);opacity:1}.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew .lg-item{opacity:0}.lg-css3.lg-slide-skew .lg-item.lg-prev-slide{-ms-transform:skew(20deg,0deg) translate3d(-100%,0,0);-webkit-transform:skew(20deg,0deg) translate3d(-100%,0,0);transform:skew(20deg,0deg) translate3d(-100%,0,0)}.lg-css3.lg-slide-skew .lg-item.lg-next-slide{-ms-transform:skew(20deg,0deg) translate3d(100%,0,0);-webkit-transform:skew(20deg,0deg) translate3d(100%,0,0);transform:skew(20deg,0deg) translate3d(100%,0,0)}.lg-css3.lg-slide-skew .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew .lg-item.lg-current,.lg-css3.lg-slide-skew .lg-item.lg-next-slide,.lg-css3.lg-slide-skew .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-rev .lg-item.lg-prev-slide{-ms-transform:skew(-20deg,0deg) translate3d(-100%,0,0);-webkit-transform:skew(-20deg,0deg) translate3d(-100%,0,0);transform:skew(-20deg,0deg) translate3d(-100%,0,0)}.lg-css3.lg-slide-skew-rev .lg-item.lg-next-slide{-ms-transform:skew(-20deg,0deg) translate3d(100%,0,0);-webkit-transform:skew(-20deg,0deg) translate3d(100%,0,0);transform:skew(-20deg,0deg) translate3d(100%,0,0)}.lg-css3.lg-slide-skew-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-cross .lg-item{opacity:0}.lg-css3.lg-slide-skew-cross .lg-item.lg-prev-slide{-ms-transform:skew(0deg,60deg) translate3d(-100%,0,0);-webkit-transform:skew(0deg,60deg) translate3d(-100%,0,0);transform:skew(0deg,60deg) translate3d(-100%,0,0)}.lg-css3.lg-slide-skew-cross .lg-item.lg-next-slide{-ms-transform:skew(0deg,60deg) translate3d(100%,0,0);-webkit-transform:skew(0deg,60deg) translate3d(100%,0,0);transform:skew(0deg,60deg) translate3d(100%,0,0)}.lg-css3.lg-slide-skew-cross .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-cross .lg-item.lg-current,.lg-css3.lg-slide-skew-cross .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-cross .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-cross-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-prev-slide{-ms-transform:skew(0deg,-60deg) translate3d(-100%,0,0);-webkit-transform:skew(0deg,-60deg) translate3d(-100%,0,0);transform:skew(0deg,-60deg) translate3d(-100%,0,0)}.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-next-slide{-ms-transform:skew(0deg,-60deg) translate3d(100%,0,0);-webkit-transform:skew(0deg,-60deg) translate3d(100%,0,0);transform:skew(0deg,-60deg) translate3d(100%,0,0)}.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-ver .lg-item{opacity:0}.lg-css3.lg-slide-skew-ver .lg-item.lg-prev-slide{-ms-transform:skew(60deg,0deg) translate3d(0,-100%,0);-webkit-transform:skew(60deg,0deg) translate3d(0,-100%,0);transform:skew(60deg,0deg) translate3d(0,-100%,0)}.lg-css3.lg-slide-skew-ver .lg-item.lg-next-slide{-ms-transform:skew(60deg,0deg) translate3d(0,100%,0);-webkit-transform:skew(60deg,0deg) translate3d(0,100%,0);transform:skew(60deg,0deg) translate3d(0,100%,0)}.lg-css3.lg-slide-skew-ver .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-ver .lg-item.lg-current,.lg-css3.lg-slide-skew-ver .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-ver .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-ver-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-prev-slide{-ms-transform:skew(-60deg,0deg) translate3d(0,-100%,0);-webkit-transform:skew(-60deg,0deg) translate3d(0,-100%,0);transform:skew(-60deg,0deg) translate3d(0,-100%,0)}.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-next-slide{-ms-transform:skew(-60deg,0deg) translate3d(0,100%,0);-webkit-transform:skew(-60deg,0deg) translate3d(0,100%,0);transform:skew(-60deg,0deg) translate3d(0,100%,0)}.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-ver-cross .lg-item{opacity:0}.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-prev-slide{-ms-transform:skew(0deg,20deg) translate3d(0,-100%,0);-webkit-transform:skew(0deg,20deg) translate3d(0,-100%,0);transform:skew(0deg,20deg) translate3d(0,-100%,0)}.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-next-slide{-ms-transform:skew(0deg,20deg) translate3d(0,100%,0);-webkit-transform:skew(0deg,20deg) translate3d(0,100%,0);transform:skew(0deg,20deg) translate3d(0,100%,0)}.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-current,.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-ver-cross-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-prev-slide{-ms-transform:skew(0deg,-20deg) translate3d(0,-100%,0);-webkit-transform:skew(0deg,-20deg) translate3d(0,-100%,0);transform:skew(0deg,-20deg) translate3d(0,-100%,0)}.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-next-slide{-ms-transform:skew(0deg,-20deg) translate3d(0,100%,0);-webkit-transform:skew(0deg,-20deg) translate3d(0,100%,0);transform:skew(0deg,-20deg) translate3d(0,100%,0)}.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-lollipop .lg-item{opacity:0}.lg-css3.lg-lollipop .lg-item.lg-prev-slide{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.lg-css3.lg-lollipop .lg-item.lg-next-slide{-ms-transform:translate3d(0,0,0) scale(.5);-webkit-transform:translate3d(0,0,0) scale(.5);transform:translate3d(0,0,0) scale(.5)}.lg-css3.lg-lollipop .lg-item.lg-current{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.lg-css3.lg-lollipop .lg-item.lg-current,.lg-css3.lg-lollipop .lg-item.lg-next-slide,.lg-css3.lg-lollipop .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-lollipop-rev .lg-item{opacity:0}.lg-css3.lg-lollipop-rev .lg-item.lg-prev-slide{-ms-transform:translate3d(0,0,0) scale(.5);-webkit-transform:translate3d(0,0,0) scale(.5);transform:translate3d(0,0,0) scale(.5)}.lg-css3.lg-lollipop-rev .lg-item.lg-next-slide{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.lg-css3.lg-lollipop-rev .lg-item.lg-current{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.lg-css3.lg-lollipop-rev .lg-item.lg-current,.lg-css3.lg-lollipop-rev .lg-item.lg-next-slide,.lg-css3.lg-lollipop-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-rotate .lg-item{opacity:0}.lg-css3.lg-rotate .lg-item.lg-prev-slide{-ms-transform:rotate(-360deg);-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}.lg-css3.lg-rotate .lg-item.lg-next-slide{-ms-transform:rotate(360deg);-webkit-transform:rotate(360deg);transform:rotate(360deg)}.lg-css3.lg-rotate .lg-item.lg-current{-ms-transform:rotate(0);-webkit-transform:rotate(0);transform:rotate(0);opacity:1}.lg-css3.lg-rotate .lg-item.lg-current,.lg-css3.lg-rotate .lg-item.lg-next-slide,.lg-css3.lg-rotate .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-rotate-rev .lg-item{opacity:0}.lg-css3.lg-rotate-rev .lg-item.lg-prev-slide{-ms-transform:rotate(360deg);-webkit-transform:rotate(360deg);transform:rotate(360deg)}.lg-css3.lg-rotate-rev .lg-item.lg-next-slide{-ms-transform:rotate(-360deg);-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}.lg-css3.lg-rotate-rev .lg-item.lg-current{-ms-transform:rotate(0);-webkit-transform:rotate(0);transform:rotate(0);opacity:1}.lg-css3.lg-rotate-rev .lg-item.lg-current,.lg-css3.lg-rotate-rev .lg-item.lg-next-slide,.lg-css3.lg-rotate-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-tube .lg-item{opacity:0}.lg-css3.lg-tube .lg-item.lg-prev-slide{-ms-transform:scale3d(1,0,1) translate3d(-100%,0,0);-webkit-transform:scale3d(1,0,1) translate3d(-100%,0,0);transform:scale3d(1,0,1) translate3d(-100%,0,0)}.lg-css3.lg-tube .lg-item.lg-next-slide{-ms-transform:scale3d(1,0,1) translate3d(100%,0,0);-webkit-transform:scale3d(1,0,1) translate3d(100%,0,0);transform:scale3d(1,0,1) translate3d(100%,0,0)}.lg-css3.lg-tube .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-tube .lg-item.lg-current,.lg-css3.lg-tube .lg-item.lg-next-slide,.lg-css3.lg-tube .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.progressjs-inner{width:0}.progressjs-progress{z-index:9999999}.progressjs-theme-blue .progressjs-inner{height:2px;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db}.progressjs-theme-blue.progressjs-end{-webkit-transition:opacity .2s ease-out;-o-transition:opacity .2s ease-out;transition:opacity .2s ease-out;opacity:0}.progressjs-theme-blue .progressjs-percent{display:none}.progressjs-theme-blueOverlay{background-color:#fff;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.progressjs-theme-blueOverlay .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db}.progressjs-theme-blueOverlay.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlay .progressjs-percent{display:none}.progressjs-theme-blueOverlay{background-color:#fff;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.progressjs-theme-blueOverlay .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db}.progressjs-theme-blueOverlay.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlay .progressjs-percent{display:none}.progressjs-theme-blueOverlayRadius{background-color:#fff;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out;border-radius:5px}.progressjs-theme-blueOverlayRadius .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db;border-radius:5px}.progressjs-theme-blueOverlayRadius.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlayRadius .progressjs-percent{display:none}.progressjs-theme-blueOverlayRadiusHalfOpacity{background-color:#fff;opacity:.5;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out;border-radius:5px}.progressjs-theme-blueOverlayRadiusHalfOpacity .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db;border-radius:5px}.progressjs-theme-blueOverlayRadiusHalfOpacity.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlayRadiusHalfOpacity .progressjs-percent{display:none}.progressjs-theme-blueOverlayRadiusWithPercentBar{background-color:#fff;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out;border-radius:5px}.progressjs-theme-blueOverlayRadiusWithPercentBar .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db;border-radius:5px}.progressjs-theme-blueOverlayRadiusWithPercentBar.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlayRadiusWithPercentBar .progressjs-percent{width:70px;text-align:center;height:40px;position:absolute;right:50%;margin-right:-35px;top:50%;margin-top:-20px;font-size:30px;opacity:.5}.progressjs-theme-blackRadiusInputs{height:10px;border-radius:10px;overflow:hidden}.progressjs-theme-blackRadiusInputs .progressjs-inner{height:2px;-webkit-transition:all 1s ease-out;-o-transition:all 1s ease-out;transition:all 1s ease-out;background-color:#34495e}.progressjs-theme-blackRadiusInputs.progressjs-end{-webkit-transition:opacity .2s ease-out;-o-transition:opacity .2s ease-out;transition:opacity .2s ease-out;opacity:0}.progressjs-theme-blackRadiusInputs .progressjs-percent{display:none}.progressjs-theme-rainloop{z-index:2000}.progressjs-theme-rainloop .progressjs-inner{background-color:#939595;position:relative;z-index:2000;height:3px;overflow:hidden;-webkit-transition:width .5s;-o-transition:width .5s;transition:width .5s}.progressjs-theme-rainloop .progressjs-percent{position:absolute;top:0;left:0;right:-32px;bottom:0;background-image:-o-linear-gradient(45deg,rgba(255,255,255,.3) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.3) 50%,rgba(255,255,255,.3) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.3) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.3) 50%,rgba(255,255,255,.3) 75%,transparent 75%,transparent);background-size:32px 32px;-webkit-animation:simple-pace-stripe-animation .5s linear infinite;animation:simple-pace-stripe-animation .5s linear infinite}@-webkit-keyframes simple-pace-stripe-animation{0%{-webkit-transform:none;transform:none}100%{-webkit-transform:translate(-32px,0);transform:translate(-32px,0)}}@keyframes simple-pace-stripe-animation{0%{-webkit-transform:none;transform:none;transform:none}100%{-webkit-transform:translate(-32px,0);transform:translate(-32px,0);transform:translate(-32px,0)}}.clearfix:after,.clearfix:before{display:table;content:"";line-height:0}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover{color:#005580;text-decoration:underline}.img-rounded{border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,.1);box-shadow:0 1px 3px rgba(0,0,0,.1)}.img-circle{border-radius:500px}.row{margin-left:-20px}.row:after,.row:before{display:table;content:"";line-height:0}.row:after{clear:both}[class*=span]{float:left;margin-left:20px}.container,.navbar-fixed-bottom .container,.navbar-fixed-top .container,.navbar-static-top .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%}.row-fluid:after,.row-fluid:before{display:table;content:"";line-height:0}.row-fluid:after{clear:both}.row-fluid [class*=span]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.12765957%}.row-fluid [class*=span]:first-child{margin-left:0}.row-fluid .span12{width:100%}.row-fluid .span11{width:91.4893617%}.row-fluid .span10{width:82.9787234%}.row-fluid .span9{width:74.46808511%}.row-fluid .span8{width:65.95744681%}.row-fluid .span7{width:57.44680851%}.row-fluid .span6{width:48.93617021%}.row-fluid .span5{width:40.42553191%}.row-fluid .span4{width:31.91489362%}.row-fluid .span3{width:23.40425532%}.row-fluid .span2{width:14.89361702%}.row-fluid .span1{width:6.38297872%}.row-fluid .offset12{margin-left:104.25531915%}.row-fluid .offset12:first-child{margin-left:102.12765957%}.row-fluid .offset11{margin-left:95.74468085%}.row-fluid .offset11:first-child{margin-left:93.61702128%}.row-fluid .offset10{margin-left:87.23404255%}.row-fluid .offset10:first-child{margin-left:85.10638298%}.row-fluid .offset9{margin-left:78.72340426%}.row-fluid .offset9:first-child{margin-left:76.59574468%}.row-fluid .offset8{margin-left:70.21276596%}.row-fluid .offset8:first-child{margin-left:68.08510638%}.row-fluid .offset7{margin-left:61.70212766%}.row-fluid .offset7:first-child{margin-left:59.57446809%}.row-fluid .offset6{margin-left:53.19148936%}.row-fluid .offset6:first-child{margin-left:51.06382979%}.row-fluid .offset5{margin-left:44.68085106%}.row-fluid .offset5:first-child{margin-left:42.55319149%}.row-fluid .offset4{margin-left:36.17021277%}.row-fluid .offset4:first-child{margin-left:34.04255319%}.row-fluid .offset3{margin-left:27.65957447%}.row-fluid .offset3:first-child{margin-left:25.53191489%}.row-fluid .offset2{margin-left:19.14893617%}.row-fluid .offset2:first-child{margin-left:17.0212766%}.row-fluid .offset1{margin-left:10.63829787%}.row-fluid .offset1:first-child{margin-left:8.5106383%}.row-fluid [class*=span].hide,[class*=span].hide{display:none}.row-fluid [class*=span].pull-right,[class*=span].pull-right{float:right}.container{margin-right:auto;margin-left:auto}.container:after,.container:before{display:table;content:"";line-height:0}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px}.container-fluid:after,.container-fluid:before{display:table;content:"";line-height:0}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:20px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:700}em{font-style:italic}cite{font-style:normal}.muted{color:#999}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:700;line-height:1;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:400;line-height:1;color:#999}h1{font-size:36px;line-height:40px}h2{font-size:30px;line-height:40px}h3{font-size:24px;line-height:40px}h4{font-size:18px;line-height:20px}h5{font-size:14px;line-height:20px}h6{font-size:12px;line-height:20px}h1 small{font-size:24px}h2 small{font-size:18px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ol,ul{padding:0;margin:0 0 10px 25px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}li{line-height:20px}ol.unstyled,ul.unstyled{margin-left:0;list-style:none}dl{margin-bottom:20px}dd,dt{line-height:20px}dt{font-weight:700}dd{margin-left:10px}.dl-horizontal dt{float:left;width:120px;clear:left;text-align:right;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:130px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}blockquote:after,blockquote:before,q:after,q:before{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}button,input,label,select,textarea{font-size:14px;font-weight:400;line-height:20px}button,input,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}.uneditable-input,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{display:inline-block;height:20px;padding:4px 6px;margin-bottom:9px;font-size:14px;line-height:20px;color:#555;border-radius:3px}input,textarea{width:210px}textarea{height:auto}.uneditable-input,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],textarea{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;-webkit-transition:border linear .2s,-webkit-box-shadow linear .2s;transition:border linear .2s,-webkit-box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s,-webkit-box-shadow linear .2s}.uneditable-input:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,textarea:focus{border-color:rgba(82,168,236,.8);outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6)}input[type=checkbox],input[type=radio]{margin:4px 0 0;line-height:normal;cursor:pointer}input[type=button],input[type=checkbox],input[type=file],input[type=image],input[type=radio],input[type=reset],input[type=submit]{width:auto}input[type=file],select{height:30px;line-height:30px}select{width:220px;border:1px solid #bbb;background-color:#fff}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus,select:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.025);box-shadow:inset 0 1px 2px rgba(0,0,0,.025);cursor:not-allowed}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.checkbox,.radio{min-height:18px;padding-left:18px}.checkbox input[type=checkbox],.radio input[type=radio]{float:left;margin-left:-18px}.controls>.checkbox:first-child,.controls>.radio:first-child{padding-top:5px}.checkbox.inline,.radio.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.checkbox.inline+.checkbox.inline,.radio.inline+.radio.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}.row-fluid .uneditable-input[class*=span],.row-fluid input[class*=span],.row-fluid select[class*=span],.row-fluid textarea[class*=span],.uneditable-input[class*=span],input[class*=span],select[class*=span],textarea[class*=span]{float:none;margin-left:0}.input-append .uneditable-input[class*=span],.input-append input[class*=span],.input-prepend .uneditable-input[class*=span],.input-prepend input[class*=span],.row-fluid .input-append [class*=span],.row-fluid .input-prepend [class*=span],.row-fluid .uneditable-input[class*=span],.row-fluid input[class*=span],.row-fluid select[class*=span],.row-fluid textarea[class*=span]{display:inline-block}.uneditable-input,input,textarea{margin-left:0}.controls-row [class*=span]+[class*=span]{margin-left:20px}.uneditable-input.span12,input.span12,textarea.span12{width:926px}.uneditable-input.span11,input.span11,textarea.span11{width:846px}.uneditable-input.span10,input.span10,textarea.span10{width:766px}.uneditable-input.span9,input.span9,textarea.span9{width:686px}.uneditable-input.span8,input.span8,textarea.span8{width:606px}.uneditable-input.span7,input.span7,textarea.span7{width:526px}.uneditable-input.span6,input.span6,textarea.span6{width:446px}.uneditable-input.span5,input.span5,textarea.span5{width:366px}.uneditable-input.span4,input.span4,textarea.span4{width:286px}.uneditable-input.span3,input.span3,textarea.span3{width:206px}.uneditable-input.span2,input.span2,textarea.span2{width:126px}.uneditable-input.span1,input.span1,textarea.span1{width:46px}.controls-row:after,.controls-row:before{display:table;content:"";line-height:0}.controls-row:after{clear:both}.controls-row [class*=span]{float:left}input[disabled],input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type=checkbox][disabled],input[type=checkbox][readonly],input[type=radio][disabled],input[type=radio][readonly]{background-color:transparent}.control-group.warning .help-block,.control-group.warning .help-inline,.control-group.warning>label{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.warning .checkbox:focus,.control-group.warning .radio:focus,.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e}.control-group.warning .input-append .add-on,.control-group.warning .input-prepend .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .help-block,.control-group.error .help-inline,.control-group.error>label{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.error .checkbox:focus,.control-group.error .radio:focus,.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392}.control-group.error .input-append .add-on,.control-group.error .input-prepend .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .help-block,.control-group.success .help-inline,.control-group.success>label{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.success .checkbox:focus,.control-group.success .radio:focus,.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b}.control-group.success .input-append .add-on,.control-group.success .input-prepend .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}input:focus:required:invalid,select:focus:required:invalid,textarea:focus:required:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:required:invalid:focus,select:focus:required:invalid:focus,textarea:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5}.form-actions:after,.form-actions:before{display:table;content:"";line-height:0}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;vertical-align:middle;padding-left:5px}.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap}.input-append .uneditable-input,.input-append input,.input-append select,.input-prepend .uneditable-input,.input-prepend input,.input-prepend select{position:relative;margin-bottom:0;font-size:14px;vertical-align:top;border-radius:0 3px 3px 0}.input-append .uneditable-input:focus,.input-append input:focus,.input-append select:focus,.input-prepend .uneditable-input:focus,.input-prepend input:focus,.input-prepend select:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:400;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-append .btn,.input-prepend .add-on,.input-prepend .btn{margin-left:-1px;vertical-align:top;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{border-radius:3px 0 0 3px}.input-append .uneditable-input,.input-append input,.input-append select{border-radius:3px 0 0 3px}.input-append .add-on:last-child,.input-append .btn:last-child{border-radius:0 3px 3px 0}.input-prepend.input-append .uneditable-input,.input-prepend.input-append input,.input-prepend.input-append select{border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;border-radius:0 3px 3px 0}input.search-query{padding-right:14px;padding-left:14px;margin-bottom:0;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{border-radius:0}.form-search .input-append .search-query{border-radius:14px 0 0 14px}.form-search .input-append .btn{border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{border-radius:0 14px 14px 0}.form-search .input-prepend .btn{border-radius:14px 0 0 14px}.form-horizontal .help-inline,.form-horizontal .input-append,.form-horizontal .input-prepend,.form-horizontal .uneditable-input,.form-horizontal input,.form-horizontal select,.form-horizontal textarea,.form-inline .help-inline,.form-inline .input-append,.form-inline .input-prepend,.form-inline .uneditable-input,.form-inline input,.form-inline select,.form-inline textarea,.form-search .help-inline,.form-search .input-append,.form-search .input-prepend,.form-search .uneditable-input,.form-search input,.form-search select,.form-search textarea{display:inline-block;margin-bottom:0;vertical-align:middle}.form-horizontal .hide,.form-inline .hide,.form-search .hide{display:none}.form-inline .btn-group,.form-inline label,.form-search .btn-group,.form-search label{display:inline-block}.form-inline .input-append,.form-inline .input-prepend,.form-search .input-append,.form-search .input-prepend{margin-bottom:0}.form-inline .checkbox,.form-inline .radio,.form-search .checkbox,.form-search .radio{padding-left:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio],.form-search .checkbox input[type=checkbox],.form-search .radio input[type=radio]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px}.form-horizontal .control-group:after,.form-horizontal .control-group:before{display:table;content:"";line-height:0}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right}.form-horizontal .controls{margin-left:160px}.form-horizontal .help-block{margin-top:10px;margin-bottom:0}.form-horizontal .form-actions{padding-left:160px}.table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table td,.table th{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:700}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child td,.table caption+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table thead:first-child tr:first-child td,.table thead:first-child tr:first-child th{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table-condensed td,.table-condensed th{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;border-left:0;border-radius:4px}.table-bordered td,.table-bordered th{border-left:1px solid #ddd}.table-bordered caption+tbody tr:first-child td,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+thead tr:first-child th,.table-bordered tbody:first-child tr:first-child td,.table-bordered tbody:first-child tr:first-child th,.table-bordered thead:first-child tr:first-child th{border-top:0}.table-bordered tbody:first-child tr:first-child td:first-child,.table-bordered thead:first-child tr:first-child th:first-child{border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered tbody:first-child tr:first-child td:last-child,.table-bordered thead:first-child tr:first-child th:last-child{border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child,.table-bordered thead:last-child tr:last-child th:first-child{border-radius:0 0 0 4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child,.table-bordered thead:last-child tr:last-child th:last-child{border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered caption+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child{border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered caption+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child{border-top-right-radius:4px;-moz-border-right-topleft:4px}.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9}.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5}.row-fluid table [class*=span],table [class*=span]{display:table-cell;float:none;margin-left:0}table .span1{float:none;width:44px;margin-left:0}table .span2{float:none;width:124px;margin-left:0}table .span3{float:none;width:204px;margin-left:0}table .span4{float:none;width:284px;margin-left:0}table .span5{float:none;width:364px;margin-left:0}table .span6{float:none;width:444px;margin-left:0}table .span7{float:none;width:524px;margin-left:0}table .span8{float:none;width:604px;margin-left:0}table .span9{float:none;width:684px;margin-left:0}table .span10{float:none;width:764px;margin-left:0}table .span11{float:none;width:844px;margin-left:0}table .span12{float:none;width:924px;margin-left:0}table .span13{float:none;width:1004px;margin-left:0}table .span14{float:none;width:1084px;margin-left:0}table .span15{float:none;width:1164px;margin-left:0}table .span16{float:none;width:1244px;margin-left:0}table .span17{float:none;width:1324px;margin-left:0}table .span18{float:none;width:1404px;margin-left:0}table .span19{float:none;width:1484px;margin-left:0}table .span20{float:none;width:1564px;margin-left:0}table .span21{float:none;width:1644px;margin-left:0}table .span22{float:none;width:1724px;margin-left:0}table .span23{float:none;width:1804px;margin-left:0}table .span24{float:none;width:1884px;margin-left:0}.table tbody tr.success td{background-color:#dff0d8}.table tbody tr.error td{background-color:#f2dede}.table tbody tr.info td{background-color:#d9edf7}.dropdown,.dropup{position:relative}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu li>a:focus,.dropdown-menu li>a:hover,.dropdown-submenu:hover>a{text-decoration:none;color:#fff;background-color:#08c;background-color:#0081c2;background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,left top,left bottom,from(#08c),to(#0077b3));background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#08c;background-color:#0081c2;background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,left top,left bottom,from(#08c),to(#0077b3));background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x}.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999}.dropdown-menu .disabled>a:hover{text-decoration:none;background-color:transparent;cursor:default}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:"\2191"}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover .dropdown-menu{display:block}.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#ccc;margin-top:5px;margin-right:-10px}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown .dropdown-menu .nav-header{padding-left:20px;padding-right:20px}.typeahead{margin-top:2px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-large{padding:24px;border-radius:6px}.well-small{padding:9px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:700;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.btn{display:inline-block;padding:4px 14px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333;text-shadow:0 1px 1px rgba(255,255,255,.75);background-color:#f5f5f5;background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e6e6e6));background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);border:1px solid #bbb;border-bottom-color:#a2a2a2;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.btn.active,.btn.disabled,.btn:active,.btn:hover,.btn[disabled]{color:#333;background-color:#e6e6e6}.btn:hover{color:#333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-color:#e6e6e6;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:.65;-webkit-box-shadow:none;box-shadow:none}.btn-large{padding:9px 14px;font-size:16px;line-height:normal;border-radius:5px}.btn-large [class^=icon-]{margin-top:2px}.btn-small{padding:3px 9px;font-size:12px;line-height:18px}.btn-small [class^=icon-]{margin-top:0}.btn-mini{padding:2px 6px;font-size:11px;line-height:16px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}.btn-danger.active,.btn-info.active,.btn-inverse.active,.btn-primary.active,.btn-success.active,.btn-warning.active{color:rgba(255,255,255,.75)}.btn{border-color:#c5c5c5;border-color:rgba(0,0,0,.15) rgba(0,0,0,.15) rgba(0,0,0,.25)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#006dcc;background-image:-o-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,left top,left bottom,from(#08c),to(#04c));background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25)}.btn-primary.active,.btn-primary.disabled,.btn-primary:active,.btn-primary:hover,.btn-primary[disabled]{color:#fff;background-color:#04c}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#faa732;background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,left top,left bottom,from(#fbb450),to(#f89406));background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25)}.btn-warning.active,.btn-warning.disabled,.btn-warning:active,.btn-warning:hover,.btn-warning[disabled]{color:#fff;background-color:#f89406}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#da4f49;background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,left top,left bottom,from(#ee5f5b),to(#bd362f));background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25)}.btn-danger.active,.btn-danger.disabled,.btn-danger:active,.btn-danger:hover,.btn-danger[disabled]{color:#fff;background-color:#bd362f}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#5bb75b;background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,left top,left bottom,from(#62c462),to(#51a351));background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25)}.btn-success.active,.btn-success.disabled,.btn-success:active,.btn-success:hover,.btn-success[disabled]{color:#fff;background-color:#51a351}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#49afcd;background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2f96b4));background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25)}.btn-info.active,.btn-info.disabled,.btn-info:active,.btn-info:hover,.btn-info[disabled]{color:#fff;background-color:#2f96b4}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#363636;background-image:-o-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,left top,left bottom,from(#444),to(#222));background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25)}.btn-inverse.active,.btn-inverse.disabled,.btn-inverse:active,.btn-inverse:hover,.btn-inverse[disabled]{color:#fff;background-color:#222}button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0;border:0}.btn-link,.btn-link:active{background-color:transparent;background-image:none;-webkit-box-shadow:none;box-shadow:none}.btn-link{border-color:transparent;cursor:pointer;color:#08c;border-radius:0}.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent}.btn-group{position:relative;font-size:0;white-space:nowrap}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px}.btn-toolbar .btn-group{display:inline-block}.btn-toolbar .btn+.btn,.btn-toolbar .btn+.btn-group,.btn-toolbar .btn-group+.btn{margin-left:5px}.btn-group>.btn{position:relative;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px}.btn-group>.btn-mini{font-size:11px}.btn-group>.btn-small{font-size:12px}.btn-group>.btn-large{font-size:16px}.btn-group>.btn:first-child{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{border-top-right-radius:4px;border-bottom-right-radius:4px}.btn-group>.btn.large:first-child{margin-left:0;border-top-left-radius:6px;border-bottom-left-radius:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{border-top-right-radius:6px;border-bottom-right-radius:6px}.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125),inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125),inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px}.btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret,.btn-mini .caret,.btn-small .caret{margin-top:6px}.btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px}.dropup .btn-large .caret{border-bottom:5px solid #000;border-top:0}.btn-danger .caret,.btn-info .caret,.btn-inverse .caret,.btn-primary .caret,.btn-success .caret,.btn-warning .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block}.btn-group-vertical .btn{display:block;float:none;width:100%;border-radius:0}.btn-group-vertical .btn+.btn{margin-left:0;margin-top:-1px}.btn-group-vertical .btn:first-child{border-radius:4px 4px 0 0}.btn-group-vertical .btn:last-child{border-radius:0 0 4px 4px}.btn-group-vertical .btn-large:first-child{border-radius:6px 6px 0 0}.btn-group-vertical .btn-large:last-child{border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,.5);background-color:#fcf8e3;border:1px solid #fbeed5;border-radius:4px;color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847}.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-left:0;margin-bottom:20px;list-style:none}.nav>li>a{display:block}.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:700;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0}.nav-list .nav-header,.nav-list>li>a{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255,255,255,.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.2);background-color:#08c}.nav-list [class^=icon-]{margin-right:2px}.nav-list .divider{height:1px;margin:9px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-pills:after,.nav-pills:before,.nav-tabs:after,.nav-tabs:before{display:table;content:"";line-height:0}.nav-pills:after,.nav-tabs:after{clear:both}.nav-pills>li,.nav-tabs>li{float:left}.nav-pills>li>a,.nav-tabs>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{border-top-right-radius:4px;border-top-left-radius:4px}.nav-tabs.nav-stacked>li:last-child>a{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{border-radius:6px}.nav .dropdown-toggle .caret{border-top-color:#08c;border-bottom-color:#08c;margin-top:6px}.nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover{cursor:pointer}.nav-pills .open .dropdown-toggle,.nav-tabs .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open.active .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1}.tabs-stacked .open>a:hover{border-color:#999}.tabbable:after,.tabbable:before{display:table;content:"";line-height:0}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-left>.nav-tabs,.tabs-right>.nav-tabs{border-bottom:0}.pill-content>.pill-pane,.tab-content>.tab-pane{display:none}.pill-content>.active,.tab-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover{text-decoration:none;background-color:transparent;cursor:default}.navbar{overflow:visible;margin-bottom:20px;color:#555}.navbar-inner{min-height:40px;padding-left:20px;padding-right:20px;background-color:#fafafa;background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f2f2f2));background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;border-radius:4px;-webkit-box-shadow:0 1px 4px rgba(0,0,0,.065);box-shadow:0 1px 4px rgba(0,0,0,.065)}.navbar .container{width:auto}.nav-collapse.collapse{height:auto}.navbar .brand{float:left;display:block;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#555;text-shadow:0 1px 0 #fff}.navbar .brand:hover{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px}.navbar-link{color:#555}.navbar-link:hover{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-left:1px solid #f2f2f2;border-right:1px solid #fff}.navbar .btn,.navbar .btn-group{margin-top:6px}.navbar .btn-group .btn{margin:0}.navbar-form{margin-bottom:0}.navbar-form:after,.navbar-form:before{display:table;content:"";line-height:0}.navbar-form:after{clear:both}.navbar-form .checkbox,.navbar-form .radio,.navbar-form input,.navbar-form select{margin-top:5px}.navbar-form .btn,.navbar-form input,.navbar-form select{display:inline-block;margin-bottom:0}.navbar-form input[type=checkbox],.navbar-form input[type=image],.navbar-form input[type=radio]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:400;line-height:1;border-radius:15px}.navbar-static-top{position:static;width:100%;margin-bottom:0}.navbar-static-top .navbar-inner{border-radius:0}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-bottom .navbar-inner,.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border:0}.navbar-fixed-bottom .navbar-inner,.navbar-fixed-top .navbar-inner{padding-left:0;padding-right:0;border-radius:0}.navbar-fixed-bottom .container,.navbar-fixed-top .container,.navbar-static-top .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.1),0 1px 10px rgba(0,0,0,.1);box-shadow:inset 0 -1px 0 rgba(0,0,0,.1),0 1px 10px rgba(0,0,0,.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:inset 0 1px 0 rgba(0,0,0,.1),0 -1px 10px rgba(0,0,0,.1);box-shadow:inset 0 1px 0 rgba(0,0,0,.1),0 -1px 10px rgba(0,0,0,.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#555;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#333;text-decoration:none}.navbar .nav>.active>a,.navbar .nav>.active>a:focus,.navbar .nav>.active>a:hover{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,.125);box-shadow:inset 0 3px 8px rgba(0,0,0,.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#ededed;background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#e5e5e5));background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075)}.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar:active,.navbar .btn-navbar:hover,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.25);box-shadow:0 1px 0 rgba(0,0,0,.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,.2);position:absolute;top:-7px;left:9px}.navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px;left:10px}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0,0,0,.2);border-bottom:0;bottom:-7px;top:auto}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #fff;border-bottom:0;bottom:-6px;top:auto}.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle,.navbar .nav li.dropdown.open>.dropdown-toggle{background-color:#e5e5e5;color:#555}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .nav>li>.dropdown-menu.pull-right,.navbar .pull-right>li>.dropdown-menu{left:auto;right:0}.navbar .nav>li>.dropdown-menu.pull-right:before,.navbar .pull-right>li>.dropdown-menu:before{left:auto;right:12px}.navbar .nav>li>.dropdown-menu.pull-right:after,.navbar .pull-right>li>.dropdown-menu:after{left:auto;right:13px}.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu,.navbar .pull-right>li>.dropdown-menu .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;border-radius:6px 0 6px 6px}.navbar-inverse{color:#999}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-o-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,left top,left bottom,from(#222),to(#111));background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:transparent;color:#fff}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:focus,.navbar-inverse .nav .active>a:hover{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .divider-vertical{border-left-color:#111;border-right-color:#222}.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open>.dropdown-toggle{background-color:#111;color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query.focused,.navbar-inverse .navbar-search .search-query:focus{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15);outline:0}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#0e0e0e;background-image:-o-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,left top,left bottom,from(#151515),to(#040404));background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25)}.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb li{display:inline-block;text-shadow:0 1px 0 #fff}.breadcrumb .divider{padding:0 5px;color:#ccc}.breadcrumb .active{color:#999}.modal-open .dropdown-menu{z-index:2050}.modal-open .popover{z-index:2060}.modal-open .tooltip{z-index:2080}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8}.modal{position:fixed;top:50%;left:50%;z-index:1050;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.3);border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,.3);box-shadow:0 3px 7px rgba(0,0,0,.3);background-clip:padding-box}.modal.fade{-webkit-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out;top:-25%}.modal.fade.in{top:50%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{overflow-y:auto;max-height:400px;padding:15px}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:after,.modal-footer:before{display:table;content:"";line-height:0}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0}.tooltip.in{opacity:.8}.tooltip.top{margin-top:-3px}.tooltip.right{margin-left:3px}.tooltip.bottom{margin-top:3px}.tooltip.left{margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#eee;text-align:center;text-decoration:none;background-color:#333;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#333}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#333}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#333}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#333}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-bottom:10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-right:10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover-content ol,.popover-content p,.popover-content ul{margin-bottom:0}.popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow:after{content:"";z-index:-1}.popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#fff}.popover.top .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0,0,0,.25);bottom:-1px;left:-11px}.popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-width:10px 10px 10px 0;border-right-color:#fff}.popover.right .arrow:after{border-width:11px 11px 11px 0;border-right-color:rgba(0,0,0,.25);bottom:-11px;left:-1px}.popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-width:0 10px 10px;border-bottom-color:#fff}.popover.bottom .arrow:after{border-width:0 11px 11px;border-bottom-color:rgba(0,0,0,.25);top:-1px;left:-11px}.popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-width:10px 0 10px 10px;border-left-color:#fff}.popover.left .arrow:after{border-width:11px 0 11px 11px;border-left-color:rgba(0,0,0,.25);bottom:-11px;right:-1px}.badge,.label{font-size:11.844px;font-weight:700;line-height:14px;color:#fff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#999}.label{padding:1px 4px 2px;border-radius:3px}.badge{padding:1px 9px 2px;border-radius:9px}a.badge:hover,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.badge-important,.label-important{background-color:#b94a48}.badge-important[href],.label-important[href]{background-color:#953b39}.badge-warning,.label-warning{background-color:#f89406}.badge-warning[href],.label-warning[href]{background-color:#c67605}.badge-success,.label-success{background-color:#468847}.badge-success[href],.label-success[href]{background-color:#356635}.badge-info,.label-info{background-color:#3a87ad}.badge-info[href],.label-info[href]{background-color:#2d6987}.badge-inverse,.label-inverse{background-color:#333}.badge-inverse[href],.label-inverse[href]{background-color:#1a1a1a}.btn .badge,.btn .label{position:relative;top:-1px}.btn-mini .badge,.btn-mini .label{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f7f7f7;background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#f9f9f9));background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);border-radius:4px}.progress .bar{width:0%;height:100%;color:#fff;float:left;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#0e90d2;background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,left top,left bottom,from(#149bdf),to(#0480be));background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.15),inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 1px 0 0 rgba(0,0,0,.15),inset 0 -1px 0 rgba(0,0,0,.15)}.progress-striped .bar{background-color:#149bdf;background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress .bar-danger,.progress-danger .bar{background-color:#dd514c;background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,left top,left bottom,from(#ee5f5b),to(#c43c35));background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress .bar-success,.progress-success .bar{background-color:#5eb95e;background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,left top,left bottom,from(#62c462),to(#57a957));background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x}.progress-striped .bar-success,.progress-success.progress-striped .bar{background-color:#62c462;background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress .bar-info,.progress-info .bar{background-color:#4bb1cf;background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#339bb9));background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress .bar-warning,.progress-warning .bar{background-color:#faa732;background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,left top,left bottom,from(#fbb450),to(#f89406));background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x}.progress-striped .bar-warning,.progress-warning.progress-striped .bar{background-color:#fbb450;background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}[class*=" icon-"],[class^=icon-]{display:inline-block;width:16px;height:16px;line-height:17px;font-size:16px;vertical-align:text-top}.btn[disabled] [class*=" icon-"],.btn[disabled] [class^=icon-],.disabled [class*=" icon-"],.disabled [class^=icon-]{color:grey}.btn[disabled] [class*=" icon-"].icon-white,.btn[disabled] [class^=icon-].icon-white,.disabled [class*=" icon-"].icon-white,.disabled [class^=icon-].icon-white{color:#fff}.icon-folder,.icon-folder-add,.icon-list{line-height:18px;font-size:18px;margin-top:-1px;margin-left:-1px;width:17px}.iconsize50{line-height:50px;font-size:50px;width:50px;height:50px}.iconsize24{line-height:24px;font-size:24px}.iconsize20{line-height:20px;font-size:20px}.icon-white,.nav>.active>a>[class*=" icon-"],.nav>.active>a>[class^=icon-]{color:#fff}.g-ui-menu .e-item:hover [class*=" icon-"],.g-ui-menu .e-item:hover [class^=icon-]{color:#fff}.icon-none{background-image:none!important}.icon-checkbox-checked,.icon-checkbox-partial,.icon-checkbox-unchecked,.icon-radio-checked,.icon-radio-unchecked{cursor:pointer;color:#555;font-size:1em}.icon-checkbox-checked:active,.icon-checkbox-checked:hover,.icon-checkbox-partial:active,.icon-checkbox-partial:hover,.icon-checkbox-unchecked:active,.icon-checkbox-unchecked:hover,.icon-radio-checked:active,.icon-radio-checked:hover,.icon-radio-unchecked:active,.icon-radio-unchecked:hover{color:#000}.icon-white.icon-checkbox-checked,.icon-white.icon-checkbox-partial,.icon-white.icon-checkbox-unchecked,.icon-white.icon-radio-checked,.icon-white.icon-radio-unchecked{color:#eee}.icon-white.icon-checkbox-checked:active,.icon-white.icon-checkbox-checked:hover,.icon-white.icon-checkbox-partial:active,.icon-white.icon-checkbox-partial:hover,.icon-white.icon-checkbox-unchecked:active,.icon-white.icon-checkbox-unchecked:hover,.icon-white.icon-radio-checked:active,.icon-white.icon-radio-checked:hover,.icon-white.icon-radio-unchecked:active,.icon-white.icon-radio-unchecked:hover{color:#fff}.iconcolor-display-none{display:none}.iconcolor-green{color:green}.iconcolor-red{color:red}.iconcolor-white{color:#fff}.iconcolor-grey{color:#aaa}.denied-by-browser{cursor:default}.denied-by-browser .icon-checkbox-checked,.denied-by-browser icon-checkbox-unchecked{cursor:default}.down-mini,.right-mini{width:16px;line-height:20px}@-webkit-keyframes rotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes rotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.icon-spinner{font-family:Arial;height:11px;width:11px;margin-right:-1px;background:0 0;border:3px solid #aaa;border-top-color:#333;border-radius:100%;-webkit-animation:none;animation:none}.icon-spinner:before{content:""}.icon-spinner.animated{border-color:transparent;border-top-color:#999;-webkit-animation:rotation .8s infinite ease-in-out;animation:rotation .8s infinite ease-in-out}.icon-spinner.big{height:13px;width:13px;margin-top:-2px;margin-left:-2px}.icon-spinner.icon-white,.icon-spinner.white{border-color:#fff;border-top-color:#999}.icon-spinner.icon-white.animated,.icon-spinner.white.animated{border-color:transparent;border-top-color:#fff}html.no-cssanimations .icon-spinner{background:0 0;background-image:url(images/sync.png);background-repeat:no-repeat;border:none;-webkit-box-shadow:none;box-shadow:none;height:16px;width:16px;font-family:Arial}html.no-cssanimations .icon-spinner:before{content:""}html.no-cssanimations .icon-spinner.animated{background:0 0;background-image:url(images/sync.gif)}body{background-color:transparent}label{cursor:pointer}label.inline,span.inline{display:inline-block}.close-custom{float:right;font-size:20px;font-weight:700;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}.close-custom:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4}button.close-custom{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.minimize-custom{border:0 solid #333;border-bottom-width:3px;display:inline-block;float:right;height:20px;width:16px;font-size:20px;font-weight:700;line-height:20px;margin-right:15px;cursor:pointer}.legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}.legend small{font-size:15px;color:#999}.legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.input-append .uneditable-input,.input-append input,.input-append select{border-radius:3px}select{width:223px}.btn .svg-icon{vertical-align:middle}.btn-small.btn-small-small{padding:3px 9px;font-size:11px;line-height:11px}.btn.btn-thin{padding:4px 9px}.btn.btn-thin-2{padding:4px 7px}.btn.btn-nowrap{white-space:nowrap}.btn.btn-ellipsis{-o-text-overflow:ellipsis;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.btn.btn-transparent{background:0 0!important;border-color:transparent!important;text-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important;opacity:.6}.btn.btn-transparent [class^=icon-]{width:19px;height:19px;line-height:20px;font-size:19px}.btn.btn-transparent:hover{opacity:1}.btn-group.open .btn.btn-transparent.dropdown-toggle{color:#bd362f}.btn-group.open .btn.btn-transparent.dropdown-toggle .caret{border-top-color:#bd362f}.btn-group.open .btn.btn-transparent.dropdown-toggle [class^=icon-]:before{color:#bd362f}.btn.btn-narrow{padding-left:12px;padding-right:12px}.btn-group.btn-group-custom-margin>.btn+.btn{margin-left:0}.btn.btn-large{font-size:17px}.dropdown-menu{border-radius:3px}.btn-group+.btn-group{margin-left:3px}.btn{border-radius:3px;background-image:none;padding-left:13px;padding-right:13px;border-color:rgba(0,0,0,.25) rgba(0,0,0,.25) rgba(0,0,0,.25)}.btn.disabled,.btn[disabled]{opacity:.8;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}html.textshadow .btn{text-shadow:0 1px 0 #fff}html.textshadow .btn.btn-danger,html.textshadow .btn.btn-primary,html.textshadow .btn.btn-success,html.textshadow .btn.btn-warning{text-shadow:0 1px 0 rgba(0,0,0,.3)}.btn.btn-dark-disabled-border.disabled,.btn.btn-dark-disabled-border[disabled]{border-color:#aaa}.btn.btn-success{background-color:#84ab04}.btn-toolbar{margin-top:0;margin-bottom:0}.dropdown-menu{border-radius:0;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.2);box-shadow:0 1px 2px rgba(0,0,0,.2)}.tooltip{font-size:14px;z-index:2000!important;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.tooltip.in{opacity:1}.tooltip .tooltip-inner{max-width:380px;text-shadow:0 0 5px rgba(0,0,0,.2);padding:5px 10px;border-radius:2px;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.tooltip .tooltip-big{font-size:18px;padding:0 10px;white-space:nowrap}.popover{width:auto;min-width:250px;max-width:550px}.popover .popover-content pre{border:none;background:rgba(0,0,0,0);padding:0;word-break:normal}.btn-group>.btn{border-radius:0!important}.btn-group>.btn.single{border-radius:3px!important}.btn-group>.btn.first{border-top-left-radius:3px!important;border-bottom-left-radius:3px!important}.btn-group>.btn.last{border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}.btn-group+.btn-group{margin-left:0}.btn-group{margin-right:3px}.btn-group.btn-group-last{margin-right:0}.dropdown.colored-toggle.open .btn.dropdown-toggle{color:#bd362f}.dropdown.colored-toggle.open .btn.dropdown-toggle .caret{border-top-color:#bd362f}.dropdown.colored-toggle.open .btn.dropdown-toggle [class^=icon-]:before{color:#bd362f}input[type=email],input[type=password],input[type=search],input[type=text],textarea{border:1px solid #ccc}input[type=email]:focus,input[type=password]:focus,input[type=search]:focus,input[type=text]:focus,textarea:focus{background-color:#fff;border:1px solid #999;-webkit-box-shadow:none;box-shadow:none}input[type=email],input[type=password],input[type=search],input[type=text]{height:20px;line-height:20px}select{border:1px solid #ccc}.alert a{text-decoration:underline}.alert.alert-null-left-margin{margin-left:0}.alert a{color:#c09853}.alert.alert-info a{color:#3a87ad}.alert.alert-error a{color:#b94a48}.nav-tabs>li>a{color:#555}.popover{z-index:2000}html.no-rgba .modal{border-width:0!important}.modal-backdrop,.modal-backdrop.fade.in{opacity:.2;-webkit-transform:none;-ms-transform:none;transform:none}.popups{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1100;overflow:auto}.popups .modal{position:static;z-index:1101;margin:5% auto;background-color:transparent;overflow:hidden;-webkit-box-shadow:0 5px 80px rgba(0,0,0,.3);box-shadow:0 5px 80px rgba(0,0,0,.3)}.popups .modal .modal-body{background-color:#fff;max-height:none}.modal.fade{-webkit-transition:none;-o-transition:none;transition:none;top:0}.modal.fade.in{top:0}.modal.loginAdminContent .modal-body,.modal.loginContent .modal-body{background-color:transparent!important}.picker.modal-dialog-bg,.picker.picker-dialog-bg{z-index:2000!important}.picker.modal-dialog,.picker.picker-dialog{z-index:2001!important}.form-horizontal.long-label .control-group .control-label{width:160px}.form-horizontal.long-label .control-group .controls{margin-left:180px}.control-label.remove-padding-top{padding-top:0}html.rl-mobile .popups .modal{width:100%!important;width:calc(100% - 20px)!important}html.rl-mobile .b-settings-content{padding:10px;padding-left:20px}html.rl-mobile .list-table{width:100%;max-width:100%}html.rl-mobile .form-horizontal .control-group .control-label{text-align:left;float:none}html.rl-mobile .form-horizontal .control-group .controls{margin-left:0}.close-input-wrp{display:inline-block;position:relative}.close-input-wrp input{padding-right:15px}.close-input-wrp .close{position:absolute;right:0;top:5px;margin:0 7px;z-index:100;vertical-align:middle;opacity:.4}.close-input-wrp .close:hover{opacity:.6}.inputosaurus-container{width:99%;line-height:20px;padding:2px;border:1px solid #ccc;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;-webkit-transition:border linear .2s,-webkit-box-shadow linear .2s;transition:border linear .2s,-webkit-box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s,-webkit-box-shadow linear .2s}.inputosaurus-container.inputosaurus-focused{background-color:#fff;border:1px solid #999;-webkit-box-shadow:none;box-shadow:none}.inputosaurus-container li{max-width:500px;background-color:#eee;border:1px solid #aaa;line-height:18px;padding:2px 15px 2px 5px;margin:2px 2px 2px;color:#555;z-index:100;position:relative}.inputosaurus-container li.ui-draggable.ui-draggable-dragging{z-index:101}.inputosaurus-container li a{color:#999;font-size:12px;position:absolute;top:1px;right:2px}.inputosaurus-container li a:hover{color:#666}.inputosaurus-container li span{padding-right:3px}.inputosaurus-container li.inputosaurus-required{padding-right:5px}.inputosaurus-container li.inputosaurus-selected{background-color:#ddd}.inputosaurus-container li.pgp{background-color:#e5f3e2}.inputosaurus-container .inputosaurus-input{margin:1px 10px 1px 0;height:22px}.inputosaurus-container .inputosaurus-input input{border:0;height:21px;padding-left:0}.ui-autocomplete{z-index:2000}.inputosaurus-fake-span{position:absolute;top:0;left:-5000px}.cke_chrome{border:1px solid #ccc!important}.cke_toolgroup{padding-right:0!important;background:#fbfbfb!important}.cke_combo_button,.cke_toolgroup{border:1px solid #a6a6a6!important}.cke_top{padding:6px 4px 1px 6px!important;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:1px solid #b6b6b6!important;background:#f0f0f0!important}.cke_combo_off a.cke_combo_button:active,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button{padding:1px!important;margin-left:0!important}.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after,.cke_toolgroup a.cke_button:last-child:after{border:none!important;height:0!important;width:0!important;margin:0!important;padding:0!important}.cke_button_on{background:#ddd!important}.cke_combo{margin-top:1px!important}.cke_combo__fontsize{margin-left:3px!important}.cke_combo__fontsize .cke_combo_text{width:40px!important}.cke_combo_text{line-height:24px!important;padding-left:8px!important}.cke_combo_button{background:#fbfbfb!important}.cke_source{font-family:Monaco,Menlo,Consolas,'Courier New',monospace!important;padding:10px!important;padding-right:0!important;-webkit-box-shadow:none!important;box-shadow:none!important}.cke_plain{background-color:#fff;outline:0;overflow:auto;z-index:1;margin:0;border:0;padding:10px;padding-right:0;white-space:pre-wrap;font-family:Monaco,Menlo,Consolas,'Courier New',monospace;font-size:13px;line-height:16px;color:#333;resize:none;border-radius:0;-webkit-box-shadow:none;box-shadow:none;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_plain:focus,.cke_source:focus{border:0}.b-compose .cke_chrome{border-right:0;border-left:0;border-bottom:0;-webkit-box-shadow:none;box-shadow:none}.cke_wysiwyg_div{padding:10px!important;font-family:arial,sans-serif;font-size:13px;line-height:16px;color:#333}.cke_wysiwyg_div ul{padding-left:40px}.cke_wysiwyg_div ul li{list-style-type:disc!important}.cke_wysiwyg_div ol{padding-left:40px}.cke_wysiwyg_div ol li{list-style-type:decimal!important}.cke_wysiwyg_div code,.cke_wysiwyg_div pre{margin:0;padding:0;background:#fff;border:none;border-radius:0;font-family:Monaco,Menlo,Consolas,'Courier New',monospace;display:block;word-break:normal;word-wrap:break-word;background-color:#f9f9f9}.cke_wysiwyg_div code{display:inline;padding:2px 5px}.cke_wysiwyg_div pre{padding:5px 10px;border-radius:5px;background-color:#f9f9f9}.cke_wysiwyg_div pre>code{padding:0}.cke_wysiwyg_div blockquote{border:0;border-left:solid 2px #444;margin:5px 0 5px 5px;padding-left:5px}.cke_wysiwyg_div blockquote p{margin:0 0 10px;font-size:14px;line-height:20px}.cke_wysiwyg_div img{vertical-align:bottom}.cke_wysiwyg_div a{color:#00f;text-decoration:underline}.cke_wysiwyg_div a:visited{color:#609}.cke_wysiwyg_div a:active{color:red}.cke_dialog a:hover{text-decoration:none}.cke_dialog .cke_dialog_ui_labeled_content{margin-top:5px;margin-bottom:5px}.cke_dialog .cke_dialog_ui_input_select,.cke_dialog .cke_dialog_ui_input_text,.cke_dialog .cke_dialog_ui_input_textarea{-webkit-box-shadow:none;box-shadow:none;border-radius:2px}.cke_dialog .cke_dialog_ui_input_select:focus,.cke_dialog .cke_dialog_ui_input_text:focus,.cke_dialog .cke_dialog_ui_input_textarea:focus{outline:0;border:1px solid #999}.cke_dialog .cke_dialog_ui_input_select,.cke_dialog .cke_dialog_ui_input_text{height:25px;line-height:25px}.g-ui-user-select-allow{webkit-touch-callout:inherit;-webkit-user-select:inherit;-moz-user-select:inherit;-ms-user-select:inherit;user-select:inherit;standard-user-select:inherit;touch-callout:inherit}.g-ui-clearfix:after,.g-ui-clearfix:before{display:table;content:"";line-height:0}.g-ui-clearfix:after{clear:both}.g-ui-link{color:#369;text-decoration:underline;cursor:pointer;padding:2px}.g-ui-link:focus{outline:1px;outline-style:dotted}.g-ui-min-height-300{min-height:300px}.g-ui-100-proc-height{height:100%}.g-ui-absolute-reset{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0}.g-ui-menu{max-height:400px;max-width:300px;overflow-y:auto;overflow-x:hidden}.g-ui-menu .e-link{text-decoration:none;cursor:pointer}.g-ui-menu .e-item.selected>.e-link{background-color:#eee!important}.g-ui-menu .e-item>.e-link:focus,.g-ui-menu .e-item>.e-link:hover{background-color:#555;background-image:none;color:#fff}.g-ui-menu .e-item.disabled>.e-link{cursor:not-allowed;background-color:#fff;background-image:none;color:grey}.g-ui-menu .e-item.disabled [class^=icon-]{color:grey}.g-ui-table{display:table;width:100%}.g-ui-table .e-row{display:table-row}.g-ui-table .e-cell{display:table-cell;vertical-align:top;text-align:left}.g-ui-height-100proc{height:100%}.g-ui-resizable-delimiter-highlight{border:none;border-right:6px solid #aaa}.e-pagenator .e-page{display:inline-block;color:#999;text-decoration:none;font-size:22px;padding:3px;cursor:pointer}.e-pagenator .e-page:hover .e-page-number{color:#555}.e-pagenator .e-page.current .e-page-number{font-size:25px;color:#333;border-bottom:2px solid #000}html.rgba .g-ui-resizable-delimiter-highlight{border-right-color:rgba(0,0,0,.2)}.settings-saved-trigger{display:inline-block;line-height:17px;font-size:16px}.settings-saved-trigger .animated{color:green}.settings-saved-trigger .success{color:green;-webkit-transition:opacity .5s linear;-o-transition:opacity .5s linear;transition:opacity .5s linear;opacity:0}.settings-saved-trigger .error{color:red;-webkit-transition:opacity .5s linear;-o-transition:opacity .5s linear;transition:opacity .5s linear;opacity:0}.settings-saved-trigger .visible{opacity:1}.settings-saved-trigger-input.success{border-color:green!important;-webkit-transition:border-color .5s linear;-o-transition:border-color .5s linear;transition:border-color .5s linear}.settings-saved-trigger-input.error{border-color:red!important;-webkit-transition:border-color .5s linear;-o-transition:border-color .5s linear;transition:border-color .5s linear}.display-none{display:none}.e-spinner{display:none}.e-mobile-switcher,.e-powered{margin-top:8px;color:#333}.e-mobile-switcher a,.e-powered a{color:#333;text-decoration:underline}.e-mobile-switcher a:hover,.e-powered a:hover{color:#333}.e-languages{margin-top:8px;color:#333}.e-languages .flag-name{color:#333;border-bottom:1px dashed #333;cursor:pointer;padding:2px 0}.e-languages .flag-name:focus{outline:1px;outline-style:dotted}html.cssanimations .e-spinner{display:block;margin:5px auto 0;width:100px;text-align:center}html.cssanimations .e-spinner .e-bounce{width:15px;height:15px;background-color:#ddd;margin:0 5px;-webkit-box-shadow:0 0 3px rgba(0,0,0,.3);box-shadow:0 0 3px rgba(0,0,0,.3);border-radius:100%;display:inline-block;-webkit-animation:bouncedelay 1.4s infinite ease-in-out;animation:bouncedelay 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}html.cssanimations .e-spinner .bounce1{-webkit-animation-delay:-.32s;animation-delay:-.32s}html.cssanimations .e-spinner .bounce2{-webkit-animation-delay:-.16s;animation-delay:-.16s}@-webkit-keyframes bouncedelay{0%,100%,80%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes bouncedelay{0%,100%,80%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.command.command-disabled.hide-on-disabled-command{display:none}html{margin:0;padding:0;overflow:hidden;font-family:Arial,Verdana,Geneva,sans-serif;height:100%}body{margin:0;padding:0;overflow:hidden;background-color:#e3e3e3;font-family:Arial,Verdana,Geneva,sans-serif;-webkit-touch-callout:none;position:absolute;top:0;left:0;bottom:0;right:0;height:100%}textarea{resize:none}option:disabled{color:#aaa;cursor:not-allowed}body:before{content:"";position:fixed;top:-10px;left:0;width:100%;height:8px;z-index:100;-webkit-box-shadow:0 0 10px rgba(0,0,0,.6);box-shadow:0 0 10px rgba(0,0,0,.6)}*{outline:0}select:focus{outline:0}html.mobile *,html.rl-mobile *{-webkit-tap-highlight-color:transparent}input[type=search]{-webkit-box-sizing:content-box;box-sizing:content-box}input::-ms-clear,input::-ms-reveal{display:none}#rl-bg{z-index:-1;position:absolute;left:0;right:0;top:0;bottom:0}#rl-content{height:100%;width:100%}#rl-center{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0;min-width:600px;min-height:400px}html.rl-mobile #rl-center{min-width:250px;min-height:250px}html.rl-mobile.rl-left-panel-enabled #rl-right{right:-150px}html.rl-mobile.rl-left-panel-disabled #rl-right{left:5px!important}#rl-top{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0;bottom:auto;z-index:2}#rl-bottom{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0;top:auto;z-index:1}#rl-left{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0;width:200px;min-width:60px}#rl-right{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0;z-index:1;left:200px}#rl-sub-left{position:absolute;top:0;bottom:0;left:0;width:500px}#rl-sub-right{position:absolute;top:0;bottom:0;right:0;left:500px}#rl-sub-right .b-message-view-backdrop{position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.4);z-index:10}#rl-sub-right .b-message-view-backdrop .backdrop-message-wrp{position:absolute;top:calc(50% - 50px);left:0;right:0;text-align:center}#rl-sub-right .b-message-view-backdrop .backdrop-message-wrp .backdrop-message{display:inline-block;color:#fff;font-size:20px;line-height:30px;background:rgba(0,0,0,.6);padding:15px;border-radius:5px;text-shadow:0 1px 1px #000}html.ssm-state-desktop-large #rl-left{width:220px}html.ssm-state-desktop-large #rl-right{left:220px}html.ssm-state-desktop-large #rl-sub-left{width:500px}html.ssm-state-desktop-large #rl-sub-right{left:500px}html.ssm-state-desktop-large .b-compose.modal{width:1000px}html.ssm-state-desktop-large .b-contacts-content.modal{width:900px}html.ssm-state-desktop #rl-left{width:200px}html.ssm-state-desktop #rl-right{left:200px}html.ssm-state-desktop #rl-sub-left{width:400px}html.ssm-state-desktop #rl-sub-right{left:400px}html.ssm-state-desktop .b-compose.modal{width:1000px}html.ssm-state-desktop .b-contacts-content.modal{width:900px}html.ssm-state-mobile #rl-left,html.ssm-state-tablet #rl-left{width:155px}html.ssm-state-mobile #rl-right,html.ssm-state-tablet #rl-right{left:155px}html.ssm-state-mobile #rl-sub-left,html.ssm-state-tablet #rl-sub-left{width:310px}html.ssm-state-mobile #rl-sub-left .messageList .inputSearch,html.ssm-state-tablet #rl-sub-left .messageList .inputSearch{width:200px}html.ssm-state-mobile #rl-sub-right,html.ssm-state-tablet #rl-sub-right{left:310px}html.ssm-state-mobile .b-compose.modal,html.ssm-state-tablet .b-compose.modal{width:720px}html.ssm-state-mobile .b-contacts-content.modal,html.ssm-state-tablet .b-contacts-content.modal{width:700px}html.ssm-state-mobile .b-contacts-content.modal .contactValueInput,html.ssm-state-tablet .b-contacts-content.modal .contactValueInput{width:200px}html.ssm-state-tablet .b-compose.modal{width:720px}html.ssm-state-tablet .b-contacts-content.modal{width:800px}html.ssm-state-tablet .b-contacts-content.modal .contactValueInput{width:250px}.show-on-panel-disabled{display:none}html.rl-left-panel-disabled #rl-left{width:60px!important}html.rl-left-panel-disabled #rl-left .show-on-panel-disabled{display:block}html.rl-left-panel-disabled #rl-left .opacity-on-panel-disabled{opacity:.3}html.rl-left-panel-disabled #rl-left .visibility-hidden-on-panel-disabled{visibility:hidden}html.rl-left-panel-disabled #rl-left .hide-on-panel-disabled{display:none}html.rl-left-panel-disabled #rl-left.ui-state-disabled{opacity:1}html.rl-left-panel-disabled #rl-right{left:60px!important}html.rl-left-panel-short #rl-left{width:60px!important}html.rl-left-panel-short #rl-right{left:60px!important}html.rl-left-panel-none #rl-left{width:10px!important}html.rl-left-panel-none #rl-right{left:10px!important}.ui-resizable-helper-w{border-right:5px solid #777;border-right-color:rgba(255,255,255,.7)}.ui-resizable-helper-h{border-bottom:5px solid #ccc;border-bottom-color:rgba(0,0,0,.3)}.ui-resizable-handle:hover{background:#aaa;background:rgba(255,255,255,.5)}html.rl-no-preview-pane #rl-sub-left{right:5px!important;width:inherit}html.rl-no-preview-pane #rl-sub-left .messageList .inputSearch{width:300px!important}html.rl-no-preview-pane #rl-sub-right{left:0!important}html.rl-no-preview-pane #rl-right .ui-resizable-handle{display:none!important}html.rl-side-preview-pane #rl-right .ui-resizable-handle{display:none!important}html.rl-bottom-preview-pane #rl-sub-left{right:5px!important;width:inherit}html.rl-bottom-preview-pane #rl-sub-left .b-message-list-wrapper{bottom:inherit;height:300px;-webkit-box-shadow:none;box-shadow:none}html.rl-bottom-preview-pane #rl-sub-left .messageList .inputSearch{width:300px!important}html.rl-bottom-preview-pane #rl-sub-right{left:0!important}html.rl-bottom-preview-pane #rl-sub-right .messageView .top-toolbar{display:none}html.rl-bottom-preview-pane #rl-sub-right .b-message-view-wrapper{top:356px;left:0;right:5px;-webkit-box-shadow:none;box-shadow:none}.visible-on-ctrl,.visible-on-ctrl-btn{display:none}.hidden-on-ctrl-btn{display:inline-block}html.rl-ctrl-key-pressed .visible-on-ctrl{display:inline-block}html.rl-ctrl-key-pressed .btn-group.open .visible-on-ctrl-btn{display:inline-block}html.rl-ctrl-key-pressed .hidden-on-ctrl{display:none}html.rl-ctrl-key-pressed .btn-group.open .hidden-on-ctrl-btn{display:none}#rl-loading,#rl-loading-error{position:absolute;font-size:30px;line-height:130%;top:50%;width:100%;height:65px;margin:0;margin-top:-60px;background-color:transparent;text-align:center;color:#000}#rl-loading-error{background-image:none;display:none}#rl-loading-error-additional{margin-top:20px;font-size:20px}#rl-app{display:none}#rl-check{display:none}.rl-content-show{display:block!important}html.rl-mobile .hide-on-mobile{display:none!important}.show-on-mobile{display:none!important}html.rl-mobile .show-on-mobile{display:initial!important}html.rl-mobile .width100-on-mobile{width:100%!important}.nano.scroller-shadow-bottom:after,.nano.scroller-shadow-top:before{content:"";position:absolute;left:0;width:100%;height:10px;z-index:102;-webkit-box-shadow:0 0 20px rgba(0,0,0,.4);box-shadow:0 0 20px rgba(0,0,0,.4)}.nano.scroller-shadow-top:before{top:-10px}.nano.scroller-shadow-bottom:after{bottom:-10px}.nano.fixIndex.scroller-shadow-bottom:after,.nano.fixIndex.scroller-shadow-top:before{z-index:98}.e-component.e-select select:focus{outline:1px;outline-style:dotted}.e-component.e-checkbox{margin-bottom:6px;margin-left:-2px;padding:2px;cursor:pointer}.e-component.e-checkbox:focus{outline:1px;outline-style:dotted}.e-component.e-checkbox .e-checkbox-icon{padding:1px 0 0 1px}.e-component.e-checkbox.disabled{cursor:default;color:#999;outline:0;outline-style:none}.e-component.e-radio{cursor:pointer}.e-component.e-radio.disabled{cursor:default;color:#999}.e-component.material-design.e-checkbox{margin-top:2px;padding:2px 2px 1px 2px}.e-component.material-design.e-checkbox .sub-checkbox-container{display:inline-block;position:relative;-webkit-transform:translateZ(0);transform:translateZ(0);width:18px;height:18px;vertical-align:bottom;margin-bottom:3px}.e-component.material-design.e-checkbox .sub-label{padding-left:12px}.e-component.material-design.e-checkbox .sub-checkbox{position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;margin-top:1px;top:0;left:0;width:18px;height:18px;border:solid 2px #999;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}.e-component.material-design.e-checkbox .sub-checkbox.checked{border-top:none;border-left:none;border-color:#0f9d58;top:-1px;left:5px;width:10px;height:18px;border-right-width:2px;border-bottom-width:2px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.e-component.material-design.e-checkbox .sub-checkbox.checked.box{border:solid 2px;-webkit-animation:box-shrink 140ms ease-out forwards;animation:box-shrink 140ms ease-out forwards}.e-component.material-design.e-checkbox .sub-checkbox.checked.checkmark{border-left:none;border-top:none;-webkit-animation:checkmark-expand 140ms ease-out forwards;animation:checkmark-expand 140ms ease-out forwards}.e-component.material-design.e-checkbox .sub-checkbox.unchecked.box{-webkit-animation:box-expand 140ms ease-out forwards;animation:box-expand 140ms ease-out forwards}.e-component.material-design.e-checkbox .sub-checkbox.unchecked.checkmark{border-left:none;border-top:none;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);-webkit-animation:checkmark-shrink 140ms ease-out forwards;animation:checkmark-shrink 140ms ease-out forwards}.e-component.material-design.e-checkbox.disabled .sub-checkbox{border-color:#aaa;cursor:not-allowed;color:#aaa}.e-component.material-design.e-checkbox.disabled .sub-label{cursor:not-allowed;color:#aaa}@-webkit-keyframes box-shrink{0%{top:0;left:0;width:18px;height:18px;border:solid 2px #999;-webkit-transform:rotate(0);transform:rotate(0)}100%{top:13px;left:5px;width:4px;height:4px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}}@keyframes box-shrink{0%{top:0;left:0;width:18px;height:18px;border:solid 2px #999;-webkit-transform:rotate(0);transform:rotate(0)}100%{top:13px;left:5px;width:4px;height:4px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}}@-webkit-keyframes checkmark-expand{0%{top:13px;left:5px;width:4px;height:4px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}100%{top:-1px;left:5px;width:10px;height:18px;border-right-width:2px;border-bottom-width:2px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}}@keyframes checkmark-expand{0%{top:13px;left:5px;width:4px;height:4px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}100%{top:-1px;left:5px;width:10px;height:18px;border-right-width:2px;border-bottom-width:2px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}}@-webkit-keyframes checkmark-shrink{0%{top:-1px;left:5px;width:10px;height:18px;border-right-width:2px;border-bottom-width:2px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}100%{top:13px;left:5px;width:4px;height:4px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}}@keyframes checkmark-shrink{0%{top:-1px;left:5px;width:10px;height:18px;border-right-width:2px;border-bottom-width:2px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}100%{top:13px;left:5px;width:4px;height:4px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}}@-webkit-keyframes box-expand{0%{top:13px;left:5px;width:4px;height:4px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}100%{top:0;left:0;width:18px;height:18px;border:solid 2px #999;-webkit-transform:rotate(0);transform:rotate(0)}}@keyframes box-expand{0%{top:13px;left:5px;width:4px;height:4px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}100%{top:0;left:0;width:18px;height:18px;border:solid 2px #999;-webkit-transform:rotate(0);transform:rotate(0)}}.b-system-drop-down .b-toolbar{position:absolute;top:0;right:0;height:30px;padding:10px 8px;z-index:103}.b-system-drop-down .e-facebook-name{display:inline-block;padding-top:4px}.b-system-drop-down .btn.system-dropdown{padding-left:10px;padding-right:10px}.b-system-drop-down .button-fb-logout{margin:5px}.b-system-drop-down .email-title{display:inline-block;max-width:200px;text-align:left;-o-text-overflow:ellipsis;text-overflow:ellipsis;overflow:hidden;margin-right:28px;vertical-align:middle}.b-system-drop-down .logoPlace{margin:-5px 10px 0 0;font-size:25px;line-height:30px;height:40px}.b-system-drop-down .audioPlace{font-size:25px;line-height:30px;margin-right:10px;width:25px}.b-system-drop-down .audioPlace .playIcon,.b-system-drop-down .audioPlace .stopIcon{cursor:pointer;color:orange;text-shadow:0 1px 0 #555;float:right}.b-system-drop-down .audioPlace .playIcon{margin-top:5px}.b-system-drop-down .audioPlace .stopIcon{font-size:30px;line-height:30px;margin-right:10px}.b-system-drop-down .audioPlace .stopIcon{display:none}.b-system-drop-down .audioPlace:hover .playIcon{display:none}.b-system-drop-down .audioPlace:hover .stopIcon{display:inline-block}.b-system-drop-down .accountPlace{background-color:#000;background-color:rgba(0,0,0,.5);color:#fff;text-shadow:0 1px 0 #000;display:inline-block;height:29px;max-width:250px;font-size:16px;line-height:30px;padding:1px 8px;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;border-radius:4px;font-weight:700;margin-right:5px;white-space:nowrap}.b-system-drop-down .account-item .icon-ok{display:none}.b-system-drop-down .account-item.current .icon-ok{display:inline-block}.b-system-drop-down .account-item.current .icon-user{display:none}.b-system-drop-down .counter{display:inline-block}.b-system-drop-down .g-ui-menu .e-link.account-item{padding-right:5px}html.ssm-state-mobile .accountPlace{max-width:150px!important}@-webkit-keyframes firstBar{0%{height:30%}50%{height:100%}100%{height:30%}}@keyframes firstBar{0%{height:30%}50%{height:100%}100%{height:30%}}@-webkit-keyframes secondBar{0%{height:90%}50%{height:30%}100%{height:100%}}@keyframes secondBar{0%{height:90%}50%{height:30%}100%{height:100%}}@-webkit-keyframes thirdBar{0%{height:20%}40%{height:40%}60%{height:80%}100%{height:40%}}@keyframes thirdBar{0%{height:20%}40%{height:40%}60%{height:80%}100%{height:40%}}.equaliser{width:20px;height:20px;position:relative}.equaliser .bar{float:left;width:5px;height:5px;background:orange;position:absolute;bottom:0}.equaliser .first{left:0;-webkit-animation:none;animation:none}.equaliser .second{left:7px;-webkit-animation:none;animation:none}.equaliser .third{left:14px;-webkit-animation:none;animation:none}.equaliser.animated .first{-webkit-animation:firstBar 1s infinite;animation:firstBar 1s infinite}.equaliser.animated .second{-webkit-animation:secondBar 1s infinite;animation:secondBar 1s infinite}.equaliser.animated .third{-webkit-animation:thirdBar 1s infinite;animation:thirdBar 1s infinite}.b-login-content{height:100%;text-align:center}.b-login-content .loginFormWrapper{display:inline-block;vertical-align:middle;text-align:center;-webkit-perspective:500px;perspective:500px}.b-login-content .loginFormWrapper .descWrapper{margin-bottom:10px}.b-login-content .loginFormWrapper .descWrapper .desc{font-size:18px;padding:2px}.b-login-content .loginFormWrapper .alertError{max-width:450px}.b-login-content .loginFormWrapper .loginForm{background-color:#efefef;text-align:left;color:#333;margin:0;float:none;width:303px}.b-login-content .loginFormWrapper .loginWelcomeForm{display:none}.b-login-content .loginFormWrapper .welcome-on{display:block}.b-login-content .loginFormWrapper .welcome-off{display:none}.b-login-content .loginFormWrapper .control-group,.b-login-content .loginFormWrapper .controls{margin-bottom:25px}.b-login-content .loginFormWrapper .wrapper{padding:40px 40px 20px 40px}.b-login-content .loginFormWrapper #recaptcha_image img{border:1px solid #ccc;border-radius:3px}.b-login-content .loginFormWrapper .controls .inputAdditionalCode,.b-login-content .loginFormWrapper .controls .inputEmail,.b-login-content .loginFormWrapper .controls .inputLogin,.b-login-content .loginFormWrapper .controls .inputLoginForm,.b-login-content .loginFormWrapper .controls .inputPassword{font-size:18px;height:40px;line-height:20px;padding-left:12px;padding-right:12px}.b-login-content .loginFormWrapper .languageLabel{margin-top:5px}.b-login-content .loginFormWrapper .signMeLabel .e-checkbox{margin-top:5px}.b-login-content .loginFormWrapper .languageLabel{margin-right:5px}.b-login-content .loginFormWrapper .input-append .add-on{position:relative;height:30px;background:0 0;margin-left:-35px;z-index:1000;border:0}.b-login-content .loginFormWrapper .input-append .add-on i{font-size:17px;line-height:29px;color:#999}.b-login-content .loginFormWrapper .input-append .add-on i.login-submit-icon{font-size:24px;padding-top:2px;cursor:pointer}.b-login-content .loginFormWrapper .control-group.error .add-on i,.b-login-content .loginFormWrapper .controls.error .add-on i{color:#b94a48}.b-login-content .buttonLogin{margin:0}.b-login-content .alert{margin:0 0 20px 0;text-align:left}.b-login-content .loginAfter{display:inline-block;height:90%;vertical-align:middle;width:0}.b-login-content .flag-selector{margin-bottom:0}.b-login-content .social-buttons{margin-top:5px}.b-login-content .language-button,.b-login-content .social-button{padding:5px;outline:0}@-webkit-keyframes loginRotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes loginRotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.submitting-pane{position:relative}.submitting-pane.submitting:before{content:'';position:absolute;top:0;left:0;right:0;bottom:0;background:0 0;background:rgba(0,0,0,.3);z-index:1051;border-radius:8px}html.cssanimations .submitting-pane.submitting:after{content:'';position:absolute;width:60px;height:60px;top:50%;left:50%;margin-top:-30px;margin-left:-30px;border:8px solid transparent;border-color:transparent;border-top-color:#fff;-webkit-animation:loginRotation 1s infinite ease-in-out;animation:loginRotation 1s infinite ease-in-out;border-radius:50%;z-index:1052}.btn-submit-icon-wrp{border:none;background:0 0;display:inline-block;margin:0;padding:0;outline:0;cursor:pointer}.popups .b-welcom-page-content .modal-header{background-color:#fff}.popups .b-ask-content .modal-header{background-color:#fff}.popups .b-ask-content .modal-body{text-align:center}.popups .b-ask-content .desc-place{font-size:18px}.popups .b-shortcuts-content.modal{width:700px}.popups .b-shortcuts-content .modal-header{background-color:#fff}.b-folders .move-action-content-wrapper{z-index:-1;position:fixed;top:0;bottom:0;left:0;right:0;opacity:.05;background-color:#fff;background-size:60px 60px;background-image:-o-linear-gradient(315deg,#000 25%,transparent 25%,transparent 50%,#000 50%,#000 75%,transparent 75%,transparent);background-image:linear-gradient(135deg,#000 25%,transparent 25%,transparent 50%,#000 50%,#000 75%,transparent 75%,transparent)}.b-folders .b-folders-user .e-link.print-count.system .badge{display:none!important}.b-folders .b-toolbar{position:absolute;top:0;right:0;left:0;height:30px;padding:10px 0 0 8px;color:#fff;z-index:101}.b-folders .b-footer{position:absolute;bottom:10px;right:0;left:0;height:30px;padding:0 10px 0 5px;z-index:101;overflow:hidden;white-space:nowrap}.b-folders .b-content{position:absolute;top:58px;bottom:45px;left:0;right:0;overflow:hidden;overflow-y:auto;min-width:100px}.b-folders .b-content .content{-webkit-overflow-scrolling:touch}.b-folders .b-list-delimiter{margin:10px;border-top:0 solid #000;border-bottom:1px solid #999}.b-folders .b-content .e-item{overflow:hidden;white-space:nowrap}.b-folders .b-content .e-item .e-link{display:block;position:relative;z-index:1;height:34px;line-height:34px;background-color:transparent;vertical-align:middle;color:grey;cursor:not-allowed;font-size:14px;padding:0;padding-left:10px;padding-right:10px;outline:0;text-decoration:none}.b-folders .b-content .e-item .e-link .focused-poiner{float:left;display:inline-block;background-color:transparent;height:100%;width:3px;position:absolute;top:0;left:0}.b-folders .b-content .e-item .e-link .inbox-star-icon{display:none;margin-left:7px}.b-folders .b-content .e-item .e-link .inbox-star-icon .icon-star{display:none}.b-folders .b-content .e-item .e-link .inbox-star-icon .icon-star-empty{opacity:.5}.b-folders .b-content .e-item .e-link .inbox-star-icon .icon-star-empty:hover{opacity:1}.b-folders .b-content .e-item .e-link.is-inbox .inbox-star-icon{display:inline}.b-folders .b-content .e-item .e-link.selectable{color:#000;cursor:pointer}.b-folders .b-content .e-item .e-link.selectable.droppableHover,.b-folders .b-content .e-item .e-link.selectable.focused,.b-folders .b-content .e-item .e-link.selectable.selected,.b-folders .b-content .e-item .e-link.selectable:hover{background-color:#555;color:#fff}.b-folders .b-content .e-item .e-link.selectable.focused{color:#fff}.b-folders .b-content .e-item .e-link.focused{background-color:#888}.b-folders .b-content .e-item .e-link.focused .focused-poiner{background-color:#fff}.b-folders .b-content .e-item .e-link.system{cursor:default;color:grey}.b-folders .b-content .e-item .e-link .count{position:relative;display:none;margin-top:5px;line-height:19px}.b-folders .b-content .e-item .e-link.print-count{font-weight:700}.b-folders .b-content .e-item .e-link.print-count .count{display:inline}.b-folders .b-content .e-item .e-link.unread-sub{font-weight:700}.b-folders .b-content .e-item .e-link .e-collapsed-sign{cursor:pointer;width:22px;height:30px;line-height:30px;text-align:center;vertical-align:inherit}.b-folders .b-content .e-item .hidden.e-link{display:none}.b-folders .b-content .e-item .b-sub-folders.collapsed{max-height:0;height:0;display:none}.b-folders.inbox-is-starred .icon-star{color:orange;display:inline-block!important}.b-folders.inbox-is-starred .icon-star-empty{display:none}.b-folders .b-folder-system-item{font-weight:700}.b-folders .b-sub-folders .e-item .e-link{padding-left:25px}.b-folders .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:40px}.b-folders .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:55px}.b-folders .b-sub-folders .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:70px}.b-folders.single-root-inbox .i-am-inbox.e-link{display:none!important}.b-folders.single-root-inbox .i-am-inbox-wrapper>.b-sub-folders{max-height:none!important;height:inherit!important;display:block!important}.b-folders.single-root-inbox .i-am-inbox-wrapper .b-sub-folders .e-item .e-link{padding-left:10px}.b-folders.single-root-inbox .i-am-inbox-wrapper .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:25px}.b-folders.single-root-inbox .i-am-inbox-wrapper .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:40px}.b-folders.single-root-inbox .i-am-inbox-wrapper .b-sub-folders .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:55px}.btn .btn-text-wrp{padding-left:7px;white-space:normal}.btn.buttonCompose{width:calc(100% - 85px);max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;white-space:nowrap;overflow:hidden;height:19px;display:inline-block;margin-top:1px}html.rl-left-panel-disabled .buttonComposeText,html.rl-left-panel-short .buttonComposeText{display:none}html.rl-left-panel-disabled .btn.buttonCompose,html.rl-left-panel-short .btn.buttonCompose{width:auto}html.rl-left-panel-disabled .btn.buttonContacts,html.rl-left-panel-short .btn.buttonContacts{margin-top:10px!important;margin-left:0!important}html.rl-left-panel-disabled.rl-mobile #rl-left,html.rl-left-panel-short.rl-mobile #rl-left{visibility:hidden}html.rl-mobile .btn.buttonCompose{width:100%}html.rl-mobile .btn.buttonContacts{display:none}.popups .b-folder-clear-content .modal-header{background-color:#fff}.popups .b-folder-create-content .modal-header{background-color:#fff}.popups .b-folder-system-content .modal-header{background-color:#fff}.popups .b-filter-content{width:750px}.popups .b-filter-content .modal-header{background-color:#fff}.popups .b-filter-content .button-delete{cursor:pointer}.popups .b-filter-content .setRecipientsBtn{margin-top:-2px;margin-left:5px}.popups .b-languages-content.modal{width:700px}.popups .b-languages-content.exp{width:701px}.popups .b-languages-content .modal-header{background-color:#fff}.popups .b-languages-content .lang-item{display:inline-block;padding:5px 15px;margin:2px 5px;width:180px;background-color:#fff;text-align:left;border:1px solid transparent;border-radius:2px}.popups .b-languages-content .lang-item.user{background-color:#fffddd;border-color:#fff555}.popups .b-languages-content .lang-item.selected{background-color:#f5f5f5;border-color:#ccc}.popups .b-languages-content .lang-item:hover{background-color:#eee;border-color:#ccc}html.rl-mobile .b-languages-content .lang-item{width:calc(100% - 40px)}.popups .b-account-add-content .modal-header{background-color:#fff}.popups .b-template-add-content.modal{width:750px}.popups .b-template-add-content .modal-header{background-color:#fff}.popups .b-template-add-content .e-template-place{height:300px}.popups .b-compose-open-pgp-content .modal-header,.popups .b-message-open-pgp-content .modal-header,.popups .b-open-pgp-key-add-content .modal-header,.popups .b-open-pgp-key-generate-content .modal-header,.popups .b-open-pgp-key-view-content .modal-header{background-color:#fff}.popups .b-compose-open-pgp-content.modal,.popups .b-message-open-pgp-content.modal,.popups .b-open-pgp-key-add-content.modal,.popups .b-open-pgp-key-generate-content.modal,.popups .b-open-pgp-key-view-content.modal{width:570px}.popups .b-compose-open-pgp-content .inputKey,.popups .b-message-open-pgp-content .inputKey,.popups .b-open-pgp-key-add-content .inputKey,.popups .b-open-pgp-key-generate-content .inputKey,.popups .b-open-pgp-key-view-content .inputKey{font-family:Monaco,Menlo,Consolas,"Courier New",monospace}.popups .b-compose-open-pgp-content .key-viewer,.popups .b-message-open-pgp-content .key-viewer,.popups .b-open-pgp-key-add-content .key-viewer,.popups .b-open-pgp-key-generate-content .key-viewer,.popups .b-open-pgp-key-view-content .key-viewer{max-height:500px;overflow:auto}.popups .b-compose-open-pgp-content.modal{width:800px}.popups .b-compose-open-pgp-content .key-list{background-color:#f9f9f9;border-radius:5px;padding:10px 15px;margin-top:10px;min-height:40px}.popups .b-compose-open-pgp-content .key-list-wrp:hover{overflow:auto}.popups .b-compose-open-pgp-content .key-list-wrp:hover .key-list__item-name{overflow:visible}.popups .b-compose-open-pgp-content .key-list-wrp.empty{text-align:center;padding-top:10px;color:#aaa;font-size:16px}.popups .b-compose-open-pgp-content .key-list__item{color:#333;white-space:nowrap;padding-bottom:4px}.popups .b-compose-open-pgp-content .key-list__item:last-child{padding-bottom:0}.popups .b-compose-open-pgp-content .key-list__item-delete{cursor:pointer}.popups .b-compose-open-pgp-content .key-list__item-delete.disabled{cursor:not-allowed}.popups .b-compose-open-pgp-content .key-list__item-names{color:#333}.popups .b-compose-open-pgp-content .key-list__item-names.empty{color:red}.popups .b-compose-open-pgp-content .key-list__item-name{overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.popups .b-compose-open-pgp-content .key-list__item-error{color:red}.popups .b-compose-open-pgp-content .key-list__item-hash{color:#aaa}.popups .b-compose-open-pgp-content .key-actions{margin-top:10px;min-height:40px}.popups .b-compose-open-pgp-content .key-actions select option.even{background-color:#f5f5f5}.popups .b-message-open-pgp-content.modal{width:700px}.popups .b-message-open-pgp-content .key-list{margin-top:5px;overflow:hidden}.popups .b-message-open-pgp-content .key-list__item{color:#555;cursor:pointer;-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap}.popups .b-message-open-pgp-content .key-list__item__radio{padding:3px 5px 0 0;vertical-align:top}.popups .b-message-open-pgp-content .key-list__item__name{border-bottom:1px solid transparent}.popups .b-message-open-pgp-content .key-list__item__names{display:inline-block}.popups .b-message-open-pgp-content .key-list__item__names:hover .key-list__item__name{border-bottom:1px dashed #555}.popups .b-open-pgp-key-add-content.modal{width:645px}.popups .b-open-pgp-key-add-content.modal .inputKey{width:600px}.popups .b-two-factor-content{width:750px}.popups .b-two-factor-content .modal-body{min-height:100px}.popups .b-two-factor-content .modal-header{background-color:#fff}.popups .b-two-factor-test-content .modal-header{background-color:#fff}.popups .b-identity-content.modal{width:750px}.popups .b-identity-content .modal-header{background-color:#fff}.popups .b-identity-content .modal-body{overflow:hidden}.popups .b-identity-content .control-label{width:100px}.popups .b-identity-content .controls{margin-left:120px}.popups .b-identity-content .e-signature-place{height:200px}.popups .b-identity-content .textEmail{margin-top:5px;font-weight:700}.popups .b-advanced-search-content.modal{width:750px}.popups .b-advanced-search-content.modal .control-label{width:100px}.popups .b-advanced-search-content.modal .controls{margin-left:110px}.popups .b-advanced-search-content .modal-header{background-color:#fff}.attachmentItem{position:relative;display:inline-block;margin:5px;max-width:200px;min-width:60px;overflow:hidden;list-style:none;line-height:24px;border:0;background-color:#fff;-webkit-box-shadow:0 1px 4px #ccc;box-shadow:0 1px 4px #ccc;-webkit-box-shadow:0 1px 5px rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.2);-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.04),0 1px 5px rgba(0,0,0,.1);box-shadow:0 0 0 1px rgba(0,0,0,.04),0 1px 5px rgba(0,0,0,.1);border-radius:3px}.attachmentItem.waiting{opacity:.6}.attachmentItem.checked{-webkit-box-shadow:0 1px 4px #00a;box-shadow:0 1px 4px #00a;-webkit-box-shadow:0 1px 5px rgba(0,0,255,.3);box-shadow:0 1px 5px rgba(0,0,255,.3);-webkit-box-shadow:0 0 0 1px rgba(0,0,255,.1),0 1px 5px rgba(0,0,255,.2);box-shadow:0 0 0 1px rgba(0,0,255,.1),0 1px 5px rgba(0,0,255,.2)}.attachmentItem .checkedParent{position:absolute;top:0;right:0;padding:1px 4px 0 5px;background:#fafafa;border:0 solid #ccc}.attachmentItem .attachmentSize{font-size:12px;color:#999}.attachmentItem.error .attachmentIcon,.attachmentItem.error .attachmentName,.attachmentItem.error .attachmentSize{color:red}.attachmentItem .attachmentIconParent{position:relative;height:56px;width:60px;background:0 0}.attachmentItem .attachmentIconParent .iconBG,.attachmentItem .attachmentIconParent .iconMain,.attachmentItem .attachmentIconParent .iconPreview,.attachmentItem .attachmentIconParent .iconProgress{position:absolute;top:0;left:0;display:inline-block;width:100%;height:100%}.attachmentItem .attachmentIconParent .iconProgress{background:#eee;width:0%}.attachmentItem .attachmentIconParent .iconBG{font-size:18px;text-align:center;color:#999;font-weight:700;line-height:55px;text-shadow:0 1px 0 #fff;text-shadow:0 1px 0 rgba(255,255,255,.8)}.attachmentItem .attachmentIconParent .iconPreview{display:none;background:#555;background-image:none;background:rgba(0,0,0,.5)!important}.attachmentItem .attachmentIconParent .iconPreview .attachmentIcon{color:#fff;text-shadow:0 1px 0 #000}.attachmentItem .attachmentNameParent{position:relative;margin-left:60px;padding:4px 4px 3px 6px;min-width:90px;cursor:pointer;color:#333;background:#fafafa;border-left:1px solid #ddd}.attachmentItem .attachmentIcon{margin:6px 0 0 13px;font-size:36px;width:36px;height:36px;color:#aaa}.attachmentItem .attachmentIcon.icon-none{display:none}.attachmentItem .attachmentIcon.icon-file-certificate{margin-left:15px}.attachmentItem .attachmentIconText{display:inline-block;font-size:28px;width:60px;height:56px;color:#aaa;line-height:56px;text-align:center;font-style:normal}.attachmentItem .attachmentIconParent.hasPreview:hover .iconPreview{display:inline-block}.attachmentItem .attachmentIconParent.hasPreview:hover .iconMain{display:none}.attachmentItem .attachmentIconParent.hasPreplay:hover .iconPreview{display:inline-block}.attachmentItem .attachmentIconParent.hasPreplay:hover .iconMain{display:none}.attachmentItem .showPreplay,.attachmentItem .showPreview{display:none;cursor:pointer}.attachmentItem .attachmentIconParent.hasPreview .showPreview{display:inline}.attachmentItem .attachmentIconParent.hasPreview .hidePreview{display:none}.attachmentItem .attachmentIconParent.hasPreplay .showPreplay{display:inline}.attachmentItem .attachmentIconParent.hasPreplay .hidePreview{display:none}html.rl-no-preview-pane .messageList.message-selected{display:none}.messageList .toolbar{position:absolute;top:0;right:0;left:0;height:30px;padding:10px 1px;z-index:102;white-space:nowrap}.messageList .b-footer{position:absolute;bottom:0;right:0;left:0;height:30px;padding:7px;z-index:101;background-color:#eee;border-bottom-right-radius:5px;border-bottom-left-radius:5px}.messageList .b-footer .e-quota{display:inline-block;margin-top:5px;margin-left:5px;font-size:18px;cursor:help}.messageList .b-footer .e-quota:hover{border-bottom:1px dashed #333}.messageList .inputSearch{width:258px}.messageList .btn.buttonMoreSearch{padding-left:8px;padding-right:8px}.messageList .b-message-list-wrapper{position:absolute;top:50px;right:0;left:0;bottom:5px;border:1px solid #aaa;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.2);box-shadow:0 2px 8px rgba(0,0,0,.2);border-radius:5px;z-index:101}.messageList .second-toolbar{position:absolute;top:0;right:0;left:0;height:29px;padding:10px 8px 10px 11px;z-index:101;white-space:nowrap;background-color:#eee;border-top-right-radius:5px;border-top-left-radius:5px}.messageList .second-toolbar .checkboxCkeckAll{margin:5px 0}.messageList .line-loading{position:absolute;left:0;right:0;z-index:102;height:0;top:50px}.messageList .mainDelimiter{position:absolute;left:0;right:0;height:1px;z-index:101;background-color:#bbb}.messageList .toolbarDelimiter{top:49px}.messageList .footerDelimiter{bottom:44px}.messageList .b-content{position:absolute;top:50px;bottom:45px;left:0;right:0;padding:0;overflow-x:hidden;overflow-y:auto;z-index:101;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff}.messageList .b-content .content{-webkit-overflow-scrolling:touch}.messageList .b-content .listClear{color:#333;text-align:center;padding:10px;font-size:14px;line-height:13px}.messageList .b-content .listDragOver,.messageList .b-content .listEmptyList,.messageList .b-content .listEmptyListLoading,.messageList .b-content .listEmptySearchList,.messageList .b-content .listError{color:#999;text-align:center;padding:60px 10px;font-size:24px;line-height:30px}.messageList .b-content .listDragOver .e-icon,.messageList .b-content .listEmptyList .e-icon,.messageList .b-content .listEmptyListLoading .e-icon,.messageList .b-content .listEmptySearchList .e-icon,.messageList .b-content .listError .e-icon{font-size:24px;line-height:30px}.messageList .b-content .listDragOver{max-height:0;overflow:hidden;padding:0 10px}.messageList .b-content .listDragOver.viewAppendArea{max-height:120px;padding:30px 10px}.messageList .b-content .listDragOver.dragOverEnter{background-color:#e0fdda;color:#333}.messageList .b-content .listError{color:#da4f49}.messageList .b-content .listSearchDesc{font-size:18px;padding:15px;border-bottom:1px solid #eee}html.rl-mobile .messageList .b-content .listSearchDesc{font-size:16px;padding:12px}.messageList .b-content .listThreadUidDesc{font-size:16px;padding:7px 20px 6px 20px;background-color:#aaa;border-bottom:1px solid #888;color:#fff;cursor:pointer;text-shadow:0 1px 0 #000;text-align:center}.messageList .b-content .delimiter{display:block;height:1px;background-color:#e5e5e5}.messageList .b-content .messageListItem:last-child{border-bottom:1px solid #e5e5e5}.messageList .b-content .messageListItem:last-child.selected{border-bottom:1px solid #bfd5ef}.messageList .b-content .fullThreadsParent{height:25px;padding:3px 5px;background-color:#f4f4f4;text-align:center}.messageList .b-content .messageListItem{position:relative;height:52px;max-height:60px;font-size:12px;line-height:21px;overflow:hidden;cursor:pointer;margin:0;border:0 solid transparent;z-index:100;background-color:#f9f9f9}.messageList .b-content .messageListItem .delimiter{position:relative;display:block;height:1px;background-color:#999;opacity:.2}.messageList .b-content .messageListItem .wrapper{padding:5px 0}.messageList .b-content .messageListItem .sidebarParent{display:inline-block;width:6px;background-color:#eee;float:left;height:100%}.messageList .b-content .messageListItem.focused{background-color:#f5f5f5}.messageList .b-content .messageListItem.focused .sidebarParent{background-color:#ccc!important}.messageList .b-content .messageListItem .importantMark{display:none;color:red;margin-right:5px}.messageList .b-content .messageListItem.deleted-mark{opacity:.7}.messageList .b-content .messageListItem.deleted-mark .sender,.messageList .b-content .messageListItem.deleted-mark .subject,.messageList .b-content .messageListItem.deleted-mark .subject-prefix,.messageList .b-content .messageListItem.deleted-mark .subject-suffix{text-decoration:line-through}.messageList .b-content .messageListItem.important .importantMark{display:inline}.messageList .b-content .messageListItem.e-single-line{height:35px}.messageList .b-content .messageListItem.e-single-line .wrapper{line-height:25px;padding:5px}.messageList .b-content .messageListItem.new{max-height:0}.messageList .b-content .messageListItem.deleted{max-height:0;border-color:transparent!important}.messageList .b-content .messageListItem .checkedParent{display:inline-block;float:left;margin-top:11px;padding:0 8px 0 6px;font-size:14px}.messageList .b-content .messageListItem.e-single-line .checkedParent{margin-top:1px}.messageList .b-content .messageListItem .flagParent{display:inline-block;float:right;padding:0 10px 0 5px}.messageList .b-content .messageListItem.e-single-line .flagParent{float:left;padding:0 8px 0 2px}.messageList .b-content .messageListItem .dateParent{display:inline-block;float:right;position:relative;margin:0 5px;color:#999;font-size:11px}.messageList .b-content .messageListItem .threadsParent{display:inline-block;float:right;position:relative}.messageList .b-content .messageListItem .attachmentParent{display:inline-block;float:right;position:relative;margin:2px 10px 0 5px}.messageList .b-content .messageListItem.e-single-line .attachmentParent{float:left;margin:0 8px 0 0}.messageList .b-content .messageListItem .senderParent{display:block;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.messageList .b-content .messageListItem .threadsCountParent{display:inline;overflow:hidden;background-color:#eee;padding:1px 5px;margin-right:5px;border:1px solid #ccc;border-radius:5px}.messageList .b-content .messageListItem .threadsCountParent.lastSelected{background-color:#999;border-color:#999;color:#fff}.messageList .b-content .messageListItem .threadsCountParent:hover{border-color:#666}.messageList .b-content .messageListItem.e-single-line .senderParent{display:inline-block;-o-text-overflow:none;text-overflow:none;width:200px;float:left;font-weight:400}.messageList .b-content .messageListItem .subjectParent{display:block;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;color:#000}.messageList .b-content .messageListItem .dateParent,.messageList .b-content .messageListItem .senderParent,.messageList .b-content .messageListItem .subjectParent{white-space:nowrap}.messageList .b-content .messageListItem .subjectParent .emptySubjectText{display:none;font-style:italic;color:#999}.messageList .b-content .messageListItem.emptySubject .subjectParent .subject,.messageList .b-content .messageListItem.emptySubject .subjectParent .subject-prefix,.messageList .b-content .messageListItem.emptySubject .subjectParent .subject-suffix{display:none}.messageList .b-content .messageListItem.emptySubject .subjectParent .emptySubjectText{display:inline}.messageList .b-content .messageListItem .sender,.messageList .b-content .messageListItem .subject,.messageList .b-content .messageListItem .subject-suffix{overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.messageList .b-content .messageListItem .threads-len .threads-len-data{background-color:#eee;color:#666;border-radius:6px;padding:2px 0 1px 6px;margin-right:2px;border:1px solid #ccc}.messageList .b-content .messageListItem .threads-len .threads-len-data [class*=" icon-"],.messageList .b-content .messageListItem .threads-len .threads-len-data [class^=icon-]{font-size:14px}.messageList .b-content .messageListItem .threads-len .threads-len-data:hover{background-color:#aaa;border-color:#666;text-shadow:0 1px 0 #999;color:#fff}.messageList .b-content .messageListItem .subject-prefix{color:#888}.messageList .b-content .messageListItem .attachment{display:none}.messageList .b-content .messageListItem .flagOff,.messageList .b-content .messageListItem .flagOn,.messageList .b-content .messageListItem .flagOnHalf{cursor:pointer;display:inline-block}.messageList .b-content .messageListItem .flagOff{opacity:.5}.messageList .b-content .messageListItem .flagOff:hover{opacity:1}.messageList .b-content .messageListItem .flagOn,.messageList .b-content .messageListItem .flagOnHalf{display:none;color:orange}.messageList .b-content .messageListItem .forwardFlag,.messageList .b-content .messageListItem .replyFlag{display:none}.messageList .b-content .messageListItem.answered .replyFlag{display:inline-block}.messageList .b-content .messageListItem.forwarded .forwardFlag{display:inline-block}.messageList .b-content .messageListItem.withAttachments .attachment{display:inline-block;color:#666;text-shadow:0 1px 0 #eee}.messageList .b-content .messageListItem.hasUnseenSubMessage{background-color:#ffffd9}.messageList .b-content .messageListItem.hasUnseenSubMessage .sidebarParent{background-color:#ffdb99}.messageList .b-content .messageListItem.hasUnseenSubMessage.focused .sidebarParent{background-color:#cc8400!important}.messageList .b-content .messageListItem.unseen{background-color:#ffffd9}.messageList .b-content .messageListItem.unseen .sender,.messageList .b-content .messageListItem.unseen .subject,.messageList .b-content .messageListItem.unseen .subject-suffix{font-weight:700}.messageList .b-content .messageListItem.unseen .sidebarParent{background-color:orange}.messageList .b-content .messageListItem.unseen.focused .sidebarParent{background-color:#cc8400!important}.messageList .b-content .messageListItem.checked .sidebarParent{background-color:#69a8f5!important}.messageList .b-content .messageListItem.checked.focused .sidebarParent{background-color:#217ef0!important}.messageList .b-content .messageListItem.selected{background-color:#dfefff;z-index:101}.messageList .b-content .messageListItem.selected .sidebarParent{background-color:#398cf2!important}.messageList .b-content .messageListItem.selected .delimiter{background-color:#398cf2;opacity:.2}.messageList .b-content .messageListItem.selected+.messageListItem .delimiter{background-color:#398cf2;opacity:.3}.messageList .b-content .messageListItem.hasFlaggedSubMessage .flagOff,.messageList .b-content .messageListItem.hasFlaggedSubMessage .flagOn{display:none}.messageList .b-content .messageListItem.hasFlaggedSubMessage .flagOnHalf{display:inline-block}.messageList .b-content .messageListItem.flagged .flagOff,.messageList .b-content .messageListItem.flagged .flagOnHalf{display:none}.messageList .b-content .messageListItem.flagged .flagOn{display:inline-block}.messageList.message-focused .b-message-list-wrapper{background-color:#000}.messageList.message-focused .b-content{opacity:.97}.messageList.hideMessageListCheckbox .checkboxCkeckAll,.messageList.hideMessageListCheckbox .checkedParent{display:none!important}.messageList.hideMessageListCheckbox .sidebarParent{margin-right:10px!important}html.ssm-state-desktop-large .messageList .b-content .messageListItem{font-size:13px}html.ssm-state-desktop-large .messageList .b-content .messageListItem .dateParent{font-size:13px}html.cssanimations .messageList .line-loading{height:5px!important}.draggablePlace{z-index:10003;color:#fff;background-color:#333;background-color:rgba(0,0,0,.5);padding:4px 10px;min-width:30px;height:20px;cursor:pointer;cursor:move}html.rl-mobile #rl-sub-left .messageList .inputSearch{width:160px!important}html.rl-no-preview-pane .messageView{display:none}html.rl-no-preview-pane .messageView.message-selected{display:block}.messageView{z-index:100}.messageView .toolbar{position:absolute;top:0;right:0;left:0;height:30px;padding:10px 0;color:#fff}.messageView .b-content{position:absolute;margin:0;top:58px;bottom:13px;right:8px;left:-2px;border:1px solid #aaa;border-radius:3px;background-color:#fff}.messageView .b-content .b-message-view-checked-helper{text-align:center;font-size:70px;line-height:70px;padding-top:100px;color:#999}.messageView .b-content .b-message-view-checked-helper .icon-mail{font-size:100px;font-size:50px;line-height:90px;padding-left:10px}.messageView .b-content .logoPlace{text-align:center}.messageView .b-content .b-message-view-desc{text-align:center;font-size:24px;line-height:30px;color:#999;padding:120px 10px 0 10px}.messageView .b-content .b-message-view-desc.error{color:#da4f49}.messageView .b-content .b-message-view-iframe-backdrop{display:none;background:0 0;position:absolute;width:100%;height:100%;top:0;left:0;right:0;bottom:0;opacity:.1}.messageView .b-content .content{-webkit-overflow-scrolling:touch}.messageView .b-content .message-fixed-button-toolbar{z-index:100;position:absolute;top:33px;right:10px}.messageView .b-content .infoParent{cursor:pointer;margin:0 2px 0 5px;opacity:.3}.messageView .b-content .infoParent:hover{opacity:.6}.messageView .b-content .flagParent{cursor:pointer;margin:0 20px 0 2px}.messageView .b-content .flagParent .flagOn{color:orange}.messageView .b-content .flagParent .flagOff{opacity:.5}.messageView .b-content .flagParent .flagOff:hover{opacity:1}.messageView .b-content .messageItemHeader{position:absolute;padding:10px;background-color:#f8f8f8;border-top:0;border-bottom:1px solid #ddd;border-top-right-radius:5px;border-top-left-radius:5px;z-index:1;top:0;left:0;right:0}.messageView .b-content .messageItemHeader .fromPic{display:inline-block;width:50px;height:50px;float:left;padding:2px;margin:0 5px 0 0;background:#fff;border:1px solid #ccc;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box}.messageView .b-content .messageItemHeader .subjectParent{font-size:18px;font-weight:700;-o-text-overflow:ellipsis;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;margin-bottom:8px;line-height:100%;height:22px;vertical-align:middle}.messageView .b-content .messageItemHeader .messageButtons{margin-top:5px}.messageView .b-content .messageItemHeader .informationShort{margin:4px 0;margin-left:5px;margin-right:50px}.messageView .b-content .messageItemHeader .informationShort a{color:#369;text-decoration:underline;cursor:pointer;padding:2px}.messageView .b-content .messageItemHeader .informationShort a:focus{outline:1px;outline-style:dotted}html.rl-mobile .messageView .b-content .messageItemHeader .informationShort{-o-text-overflow:ellipsis;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.messageView .b-content .messageItemHeader .informationShortWrp{max-height:100px;overflow-y:auto;min-height:30px;margin-top:4px}.messageView .b-content .messageItemHeader .informationFull{margin-top:10px;border:1px solid #ddd;background-color:#fff;border-radius:5px;padding:8px 0;overflow:hidden}.messageView .b-content .messageItemHeader .informationFull .size{margin-left:4px}.messageView .b-content .messageItemHeader .informationFull table{width:100%}.messageView .b-content .messageItemHeader .informationFull table,.messageView .b-content .messageItemHeader .informationFull td,.messageView .b-content .messageItemHeader .informationFull tr{border-spacing:0}.messageView .b-content .messageItemHeader .informationFull td{padding:0 10px;vertical-align:top;min-width:43px}.messageView .b-content .messageItemHeader .informationFull td:first-child{border-right:1px solid #ddd;text-align:right;width:1%}.messageView .b-content .messageItemHeader .informationFull .uiLabel{white-space:nowrap}.messageView .b-content .messageItemHeader .informationFull .uiLabelValue{word-break:break-all}.messageView .b-content .messageItemHeader .emptySubjectText{display:none;font-style:italic;font-weight:400;color:#999}.messageView .b-content .messageItemHeader.emptySubject .emptySubjectText{display:inline}.messageView .b-content .messageItem{position:absolute;top:0;bottom:0;left:0;right:0;overflow:auto;-webkit-overflow-scrolling:touch;border-radius:3px}.messageView .b-content .messageItem .buttonFull,.messageView .b-content .messageItem .buttonUnFull,.messageView .b-content .messageItem .buttonUp{display:inline-block;position:fixed;right:25px;bottom:25px;height:30px;width:30px;text-align:center;vertical-align:middle;line-height:30px;background-color:transparent;background-color:#fff;border:1px solid #333;color:#333;z-index:2;cursor:pointer;border-radius:5px;opacity:.5}.messageView .b-content .messageItem .buttonFull:hover,.messageView .b-content .messageItem .buttonUnFull:hover,.messageView .b-content .messageItem .buttonUp:hover{opacity:.8;border-color:#666;background-color:#888;color:#fff}.messageView .b-content .messageItem .buttonUp{right:65px;z-index:0}.messageView .b-content .messageItem .buttonUnFull,.messageView .b-content .messageItem .buttonUp{display:none}.messageView .b-content .messageItem .loading{text-align:center;font-size:24px;color:grey;padding-top:50px}.messageView .b-content .messageItem .line-loading{height:0}.messageView .b-content .messageItem .pgpEncrypted,.messageView .b-content .messageItem .pgpSigned,.messageView .b-content .messageItem .readReceipt,.messageView .b-content .messageItem .showImages{cursor:pointer;padding:10px 15px;border-bottom:1px solid #ddd;background-color:#eee}.messageView .b-content .messageItem .pgpInfo{padding:5px 15px;border-bottom:1px solid #ddd;background-color:#fcf8e3}.messageView .b-content .messageItem .pgpInfo.success{background-color:#e9f4ff}.messageView .b-content .messageItem .readReceipt{background-color:#ffffd9}.messageView .b-content .messageItem .attachmentsPlace{padding:10px 10px 6px 10px;background:#eee;border-bottom:1px solid #ddd;position:relative}.messageView .b-content .messageItem .attachmentsPlace .attachmentList{margin:0}.messageView .b-content .messageItem .attachmentsPlace .checkedParent{display:none}.messageView .b-content .messageItem .attachmentsPlace.selection-mode .checkedParent{display:inline-block}.messageView .b-content .messageItem .attachmentsPlace.unselectedAttachmentsError .attachmentItem{-webkit-box-shadow:0 1px 4px red;box-shadow:0 1px 4px red;-webkit-box-shadow:0 1px 5px rgba(255,0,0,.4);box-shadow:0 1px 5px rgba(255,0,0,.4);-webkit-box-shadow:0 0 0 1px rgba(255,0,0,.2),0 1px 5px rgba(255,0,0,.3);box-shadow:0 0 0 1px rgba(255,0,0,.2),0 1px 5px rgba(255,0,0,.3)}.messageView .b-content .messageItem .attachmentsPlace .controls-handle{position:absolute;bottom:5px;right:8px;color:#999;cursor:pointer}.messageView .b-content .messageItem .attachmentsControls{padding:7px 5px 7px 14px;background:#e8e8e8;border-bottom:1px solid #ddd}.messageView .b-content .messageItem .rlBlockquoteSwitcher{background-color:#eee;border:1px solid #999;display:inline-block;width:30px;height:14px;line-height:14px;text-align:center;cursor:pointer;margin:10px 0;opacity:.5}.messageView .b-content .messageItem .rlBlockquoteSwitcher:hover{opacity:1}.messageView .b-content .messageItem .bodySubHeader{z-index:2}.messageView .b-content .messageItem .bodyText{color:#000;font-family:Arial,Verdana,Geneva,sans-serif}.messageView .b-content .messageItem .bodyText .b-text-part{height:100%}.messageView .b-content .messageItem .bodyText .b-text-part div[data-x-div-type=html]{height:100%}.messageView .b-content .messageItem .bodyText .b-text-part div[data-x-div-type=html] div[data-x-div-type=body]{height:100%}.messageView .b-content .messageItem .bodyText .b-text-part a{color:#00f;text-decoration:underline}.messageView .b-content .messageItem .bodyText .b-text-part a:visited{color:#609}.messageView .b-content .messageItem .bodyText .b-text-part a:active{color:red}.messageView .b-content .messageItem .bodyText .b-text-part blockquote{border-left:2px solid #000;padding:0 10px;margin:0}.messageView .b-content .messageItem .bodyText .b-text-part .rl-bq-switcher.hidden-bq{display:none}.messageView .b-content .messageItem .bodyText .b-text-part.html div[data-x-div-type=body]{margin:15px}.messageView .b-content .messageItem .bodyText .b-text-part.html code,.messageView .b-content .messageItem .bodyText .b-text-part.html pre{margin:0;padding:0;background:#fff;border:none;border-radius:0;font-family:Monaco,Menlo,Consolas,'Courier New',monospace;display:block;word-break:normal;word-wrap:break-word;background-color:#f9f9f9}.messageView .b-content .messageItem .bodyText .b-text-part.html code{display:inline;padding:2px 5px}.messageView .b-content .messageItem .bodyText .b-text-part.html pre{padding:5px 10px;border-radius:5px;background-color:#f9f9f9}.messageView .b-content .messageItem .bodyText .b-text-part.html pre>code{padding:0}.messageView .b-content .messageItem .bodyText .b-text-part.plain{padding:15px;font-family:Monaco,Menlo,Consolas,'Courier New',monospace}.messageView .b-content .messageItem .bodyText .b-text-part.plain pre{margin:0;padding:0;background:#fff;border:none;font-family:Monaco,Menlo,Consolas,'Courier New',monospace;display:block;word-break:normal}.messageView .b-content .messageItem .bodyText .b-text-part.plain pre.b-plain-openpgp{display:inline-block;padding:6px 10px;border:1px dashed #666;background:#fff;word-break:break-all}.messageView .b-content .messageItem .bodyText .b-text-part.plain pre.b-plain-openpgp.success{border-color:green;background-color:rgba(0,255,0,.03)}.messageView .b-content .messageItem .bodyText .b-text-part.plain pre.b-plain-openpgp.error{border-color:red;background-color:rgba(255,0,0,.03)}.messageView .b-content .messageItem .bodyText .b-text-part.plain blockquote{border-left:2px solid #00f;color:#00f}.messageView .b-content .messageItem .bodyText .b-text-part.plain blockquote blockquote{border-left:2px solid green;color:green}.messageView .b-content .messageItem .bodyText .b-text-part.plain blockquote blockquote blockquote{border-left:2px solid red;color:red}.messageView .b-content .messageItem .bodyText .b-text-part .b-openpgp-control{display:inline-block;cursor:pointer;color:#777}.messageView .b-content .messageItem .bodyText .b-text-part .b-openpgp-control:hover{color:#111}.messageView .b-content .messageItem .bodyText .b-text-part .b-openpgp-control.success{color:green;cursor:help}.messageView .b-content .messageItem .bodyText .b-text-part .b-openpgp-control.error{color:red}.messageView.message-focused .b-content{z-index:101;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.2);box-shadow:0 2px 8px rgba(0,0,0,.2);border-radius:3px;border-color:#9d9d9d}.messageView .thread-controls .dropdown-toggle{padding-left:10px;padding-right:10px}.messageView .thread-controls.open .dropdown-toggle{padding-left:10px;padding-right:10px}.messageView .thread-list .e-link{padding:4px 8px 6px 10px}.messageView .thread-list.hide-more .thread-list-message.more-that{display:none}.messageView .thread-list .thread-date{font-size:13px;color:#999}.messageView .thread-list .more-threads{text-align:center;padding:8px;background-color:#f5f5f5;color:#555;text-decoration:underline;border-top:1px dashed #555}html.rl-resizer .b-message-view-iframe-backdrop{display:block!important}html.rl-no-preview-pane .messageView .toolbar{padding-left:1px}html.rl-no-preview-pane .messageView .b-content{top:50px;left:0;bottom:5px;right:5px;border:1px solid #aaa;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.2);box-shadow:0 2px 8px rgba(0,0,0,.2);border-radius:5px}html.rl-bottom-preview-pane .messageView .b-content{bottom:5px}html.cssanimations .messageItem .line-loading{height:5px!important}html.rl-message-fullscreen #rl-bottom,html.rl-message-fullscreen #rl-left{display:none!important}html.rl-message-fullscreen #rl-right .RL-MailMessageList,html.rl-message-fullscreen #rl-right .RL-MailMessageView .messageView .toolbar,html.rl-message-fullscreen #rl-right .RL-SettingsPane,html.rl-message-fullscreen #rl-right .RL-SystemDropDown{display:none!important}html.rl-message-fullscreen .messageView .b-content{position:fixed!important;margin:5px!important;top:0!important;left:0!important;right:0!important;bottom:0!important;z-index:10000!important;border:1px solid #aaa!important;border-radius:3px!important}html .messageItem .buttonUp{display:none!important}html .messageItem.scroller-shadow-top .buttonUp{display:inline-block!important}html.rl-desktop .messageItem .buttonFull,html.rl-desktop .messageItem .buttonUp{display:none!important}html.rl-desktop .messageItem:hover .buttonFull,html.rl-desktop .messageItem:hover.scroller-shadow-top .buttonUp{display:inline-block!important}html.rl-message-fullscreen .messageItem .buttonUnFull{display:inline-block!important}html.rl-message-fullscreen .messageItem .buttonFull{display:none!important}html.rl-message-fullscreen .messageItem .buttonUp{display:none!important}html.rl-message-fullscreen .messageItem.scroller-shadow-top .buttonUp{display:inline-block!important}.b-contacts-content .control-group .control-label.fix-width{width:50px}.b-contacts-content .control-group .controls.fix-width{margin-left:70px}.b-contacts-content.modal{position:absolute;right:0;top:0;bottom:0;left:0;width:900px;min-height:300px;max-height:700px;margin:auto}.b-contacts-content.modal .modal-body{overflow:auto;height:100%;background-color:#f5f5f5;padding:0}.b-contacts-content.modal .b-header-toolbar{height:40px;background-color:#aaa;color:#fff;background-color:#333;background-color:rgba(0,0,0,.8)!important}.b-contacts-content.modal .b-header-toolbar .close,.b-contacts-content.modal .b-header-toolbar .close-custom{color:#fff;opacity:1}.b-contacts-content.modal .b-header-toolbar .btn{margin-top:4px}.b-contacts-content.modal .b-list-toolbar{padding:0;height:45px;text-align:right;width:220px;-webkit-box-shadow:inset 0 -1px 0 #ccc;box-shadow:inset 0 -1px 0 #ccc}.b-contacts-content.modal .b-list-toolbar .e-search{margin-top:7px;width:200px}.b-contacts-content.modal .b-list-footer-toolbar{position:absolute;left:0;bottom:0;height:105px;width:220px;background-color:#eee;-webkit-box-shadow:inset 0 1px 0 #ccc;box-shadow:inset 0 1px 0 #ccc}.b-contacts-content.modal .b-list-footer-toolbar .footer-pager{padding:8px 10px 0 0}.b-contacts-content.modal .b-list-content{position:absolute;top:45px;bottom:105px;left:0;width:220px;overflow:hidden;overflow-y:auto}.b-contacts-content.modal .b-list-content .content{-webkit-overflow-scrolling:touch}.b-contacts-content.modal .b-list-content .listClear{color:#333;text-align:center;padding:10px;font-size:14px;line-height:13px;background-color:#fff;-webkit-box-shadow:inset 0 -1px 0 #ccc;box-shadow:inset 0 -1px 0 #ccc}.b-contacts-content.modal .b-list-content .listEmptyList,.b-contacts-content.modal .b-list-content .listEmptyListLoading,.b-contacts-content.modal .b-list-content .listEmptySearchList{color:#999;text-align:center;padding:60px 10px;font-size:24px;line-height:30px}.b-contacts-content.modal .b-list-content.hideContactListCheckbox .checkboxCkeckAll,.b-contacts-content.modal .b-list-content.hideContactListCheckbox .checkedParent{display:none!important}.b-contacts-content.modal .b-list-content.hideContactListCheckbox .sidebarParent{margin-right:10px!important}.b-contacts-content.modal .b-list-content .e-contact-foreach{border-bottom:1px solid #ddd}.b-contacts-content.modal .b-list-content .e-contact-item{position:relative;height:45px;max-height:45px;line-height:45px;overflow:hidden;cursor:pointer;margin:0;border:0 solid transparent;z-index:100}.b-contacts-content.modal .b-list-content .e-contact-item .delimiter{position:relative;display:block;height:1px;background-color:#999;opacity:.2}.b-contacts-content.modal .b-list-content .e-contact-item .wrapper{padding:0}.b-contacts-content.modal .b-list-content .e-contact-item .sidebarParent{display:inline-block;width:6px;background-color:#eee;float:left;height:100%}.b-contacts-content.modal .b-list-content .e-contact-item.focused .sidebarParent{background-color:#bbb}.b-contacts-content.modal .b-list-content .e-contact-item.deleted{max-height:0;border-color:transparent!important}.b-contacts-content.modal .b-list-content .e-contact-item .checkedParent{display:inline-block;float:left;padding:0 8px 0 6px}.b-contacts-content.modal .b-list-content .e-contact-item .shareParent{display:none;float:right;position:relative;margin:2px 8px 0 5px}.b-contacts-content.modal .b-list-content .e-contact-item .nameParent{display:block;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;color:#333;font-size:16px}.b-contacts-content.modal .b-list-content .e-contact-item .emailParent,.b-contacts-content.modal .b-list-content .e-contact-item .nameParent{white-space:nowrap}.b-contacts-content.modal .b-list-content .e-contact-item .displayEmail,.b-contacts-content.modal .b-list-content .e-contact-item .displayName{overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.b-contacts-content.modal .b-list-content .e-contact-item .displayImg{display:inline-block;float:right;position:relative;margin:0 5px}.b-contacts-content.modal .b-list-content .e-contact-item.shared .shareParent{display:inline-block}.b-contacts-content.modal .b-list-content .e-contact-item.checked{z-index:101}.b-contacts-content.modal .b-list-content .e-contact-item.checked .sidebarParent{background-color:#69a8f5}.b-contacts-content.modal .b-list-content .e-contact-item.checked.focused .sidebarParent{background-color:#519af3!important}.b-contacts-content.modal .b-list-content .e-contact-item.selected{background-color:#fff;z-index:102}.b-contacts-content.modal .b-list-content .e-contact-item.selected .sidebarParent{background-color:#398cf2}.b-contacts-content.modal .b-list-content .e-contact-item.selected.focused .sidebarParent{background-color:#217ef0!important}.b-contacts-content.modal .b-view-content-toolbar{background-color:#f5f5f5;padding:7px;position:absolute;top:0;right:0;left:220px;height:31px;text-align:center;-webkit-box-shadow:inset 0 -1px 0 #ccc;box-shadow:inset 0 -1px 0 #ccc}.b-contacts-content.modal .b-view-content-toolbar .button-save-contact.no-disabled.dirty{color:#51a351;font-weight:700}.b-contacts-content.modal .b-view-content-toolbar.read-only .button-save-contact{display:none}.b-contacts-content.modal .b-view-content{position:absolute;top:45px;bottom:60px;left:220px;right:0;overflow:hidden;overflow-y:auto;background-color:#fff;border-left:1px solid #ddd}.b-contacts-content.modal .b-view-content .content{-webkit-overflow-scrolling:touch}.b-contacts-content.modal .b-view-content .contactValueLargeStatic,.b-contacts-content.modal .b-view-content .contactValueStatic,.b-contacts-content.modal .b-view-content .contactValueTextAreaStatic{height:20px;line-height:20px;font-size:18px;display:inline-block;padding:5px 7px;color:#555;display:none}.b-contacts-content.modal .b-view-content.read-only .contactValueLargeStatic,.b-contacts-content.modal .b-view-content.read-only .contactValueStatic,.b-contacts-content.modal .b-view-content.read-only .contactValueTextAreaStatic{display:inline-block}.b-contacts-content.modal .b-view-content.read-only .contactValueInput,.b-contacts-content.modal .b-view-content.read-only .contactValueInputLarge,.b-contacts-content.modal .b-view-content.read-only .contactValueTextArea{display:none}.b-contacts-content.modal .b-view-content .b-contact-view-desc{text-align:center;font-size:24px;line-height:30px;padding-top:120px;color:#999}.b-contacts-content.modal .b-view-content .top-part{padding-top:20px}.b-contacts-content.modal .b-view-content .property-line{margin-bottom:5px}.b-contacts-content.modal .b-view-content .top-row{padding:10px 0;height:30px}.b-contacts-content.modal .b-view-content .add-link{margin-left:2px;padding:5px;font-size:12px;color:#aaa}.b-contacts-content.modal .b-view-content .contactValueLargeStatic,.b-contacts-content.modal .b-view-content .contactValueStatic,.b-contacts-content.modal .b-view-content .contactValueTextAreaStatic{font-size:18px;display:none}.b-contacts-content.modal .b-view-content .contactValueInput,.b-contacts-content.modal .b-view-content .contactValueInputLarge,.b-contacts-content.modal .b-view-content .contactValueTextArea{-webkit-box-shadow:none;box-shadow:none;border-color:#fff;font-size:18px;width:300px}.b-contacts-content.modal .b-view-content .contactValueInput:hover,.b-contacts-content.modal .b-view-content .contactValueInputLarge:hover,.b-contacts-content.modal .b-view-content .contactValueTextArea:hover{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);border-color:#ccc}.b-contacts-content.modal .b-view-content .contactValueInput:focus,.b-contacts-content.modal .b-view-content .contactValueInputLarge:focus,.b-contacts-content.modal .b-view-content .contactValueTextArea:focus{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);border-color:#999}.b-contacts-content.modal .b-view-content .contactValueInput::-webkit-input-placeholder,.b-contacts-content.modal .b-view-content .contactValueInputLarge::-webkit-input-placeholder,.b-contacts-content.modal .b-view-content .contactValueTextArea::-webkit-input-placeholder{color:#ddd}.b-contacts-content.modal .b-view-content .contactValueInput::-moz-placeholder,.b-contacts-content.modal .b-view-content .contactValueInputLarge::-moz-placeholder,.b-contacts-content.modal .b-view-content .contactValueTextArea::-moz-placeholder{color:#ddd}.b-contacts-content.modal .b-view-content .contactValueInput:-moz-placeholder,.b-contacts-content.modal .b-view-content .contactValueInputLarge:-moz-placeholder,.b-contacts-content.modal .b-view-content .contactValueTextArea:-moz-placeholder{color:#ddd}.b-contacts-content.modal .b-view-content .contactValueInput:-ms-input-placeholder,.b-contacts-content.modal .b-view-content .contactValueInputLarge:-ms-input-placeholder,.b-contacts-content.modal .b-view-content .contactValueTextArea:-ms-input-placeholder{color:#ddd}.b-contacts-content.modal .b-view-content .contactValueTextArea{width:300px}.b-contacts-content.modal .b-view-content .contactValueInputLarge{width:400px}.b-contacts-content.modal .b-view-content .hasError .contactValueInput{color:#ee5f5b;border-color:#ee5f5b}.b-contacts-content.modal .b-view-content .e-save-trigger{position:absolute;top:25px;left:10px}.b-contacts-content.modal .b-view-content .e-read-only-sign{display:none;position:absolute;top:20px;right:40px}.b-contacts-content.modal .b-view-content .e-share-sign{position:absolute;top:20px;right:20px;cursor:pointer}.b-contacts-content.modal .b-view-content.read-only .e-read-only-sign{display:inline-block}.b-contacts-content.modal .b-view-content.read-only .e-share-sign{display:none}.b-contacts-content .e-contact-item{position:relative;height:55px;max-height:60px;line-height:22px;overflow:hidden;cursor:pointer;margin:0;border:0 solid transparent;z-index:100}html.rl-mobile .b-contacts-content .b-list-content,html.rl-mobile .b-contacts-content .b-list-footer-toolbar,html.rl-mobile .b-contacts-content .b-list-toolbar{width:170px}html.rl-mobile .b-contacts-content .b-list-toolbar .e-search{width:150px}html.rl-mobile .b-contacts-content .b-view-content,html.rl-mobile .b-contacts-content .b-view-content-toolbar{left:170px}.b-compose.modal{width:850px;margin:10px auto}.b-compose.modal .modal-body{overflow:auto;padding:0}.b-compose .attachmentAreaParent,.b-compose .textAreaParent{overflow:hidden;position:relative}.b-compose .attachmentAreaParent{padding:10px 10px 6px 10px;background:#ddd;border-top:1px solid #ccc;overflow-y:auto}.b-compose .attachmentAreaParent .no-attachments-desc{padding:50px 10px;text-align:center;font-size:24px;color:#666;text-shadow:0 1px 0 #fff;text-shadow:0 1px 0 rgba(255,255,255,.5)}.b-compose .attachmentAreaParent .attachmentList{margin:0;padding:10px}.b-compose .b-header-toolbar{height:40px;color:#fff;background-color:#aaa;background-color:#333;background-color:rgba(0,0,0,.8)!important}.b-compose .b-header-toolbar .close,.b-compose .b-header-toolbar .close-custom,.b-compose .b-header-toolbar .minimize-custom{opacity:1;color:#fff;border-color:#eee;font-size:24px;line-height:24px}.b-compose .b-header-toolbar .btn.disabled.button-delete{visibility:hidden}.b-compose .b-header-toolbar .button-delete,.b-compose .b-header-toolbar .button-save,.b-compose .b-header-toolbar .saved-text{margin-left:8px}.b-compose .b-header-toolbar .button-close,.b-compose .b-header-toolbar .button-skip{margin-left:8px}.b-compose .b-header-toolbar .disabled.button-delete{margin-left:0}.b-compose .b-header{padding:10px;background-color:#eee;color:#333}html.rl-mobile .b-compose .b-header{overflow:scroll}.b-compose .b-header .e-identity{color:#333;text-decoration:none;font-weight:700}.b-compose .b-header .e-identity:hover{color:#333;text-decoration:none}.b-compose .b-header .e-identity.multiply{cursor:pointer;border-bottom:1px dashed #555}.b-compose .b-header .e-row{line-height:30px}.b-compose .b-header .e-label{text-align:right;width:1%;min-width:70px;padding:6px 10px}html.rl-mobile .b-compose .b-header .e-label{min-width:50px;padding:6px 10px 6px 0}.b-compose .b-header .e-value{padding:2px 0}.b-compose .b-header .e-value input[type=text],.b-compose .b-header .e-value textarea{width:98%}.b-compose .b-header .e-value textarea{height:40px}.b-compose .b-header .error-desc{color:red}.b-compose .b-header .error-to{color:red;font-weight:700}.b-compose .b-header .b-appachments .b-attacment{line-height:20px;padding-bottom:10px}.b-compose .b-header .b-appachments .b-attacment-in-process{line-height:20px;padding-bottom:10px}.b-compose .b-header .b-appachments .b-attacment-in-process .uploading{display:none;padding-right:5px}.b-compose .b-header .b-appachments .b-attacment-in-process.uploading .uploading{display:inline}.b-compose .b-header .b-appachments .b-attacment-in-process .upload-progress{font-weight:700}.b-compose .b-header .b-appachments .b-attacment-in-process.error .namedStr{color:#888}.b-compose .b-header .b-appachments .b-attacment-in-process .error{color:red}.b-compose .b-header .b-appachments .b-attacment-in-process .close,.b-compose .b-header .b-appachments .b-attacment-in-process .close-custom{float:left;padding-right:13px}.b-compose .cke_chrome{border-left-width:0!important;border-right-width:0!important;border-bottom-width:0!important}.b-compose .b-attachment-button{display:inline-block}.b-compose .b-attachment-place{position:absolute;left:5px;right:5px;top:5px;bottom:5px;border:2px #777 dashed;z-index:300;line-height:119px;text-align:center;background-color:#efefef;font-size:24px;border-radius:10px}.b-compose .b-attachment-place.dragAndDropOver{background-color:#fff}.b-admin-left .b-toolbar{position:absolute;top:0;right:0;left:0;height:34px;padding:8px 0 0 8px}.b-admin-left .b-content{position:absolute;top:68px;bottom:8px;left:0;right:0;overflow:hidden}.b-admin-left .b-content .content{-webkit-overflow-scrolling:touch}.b-admin-menu .e-item{overflow:hidden;text-decoration:none;outline:0}.b-admin-menu .e-link{position:relative;display:block;height:30px;line-height:29px;cursor:pointer;font-size:18px;z-index:1;cursor:default;background-color:transparent;color:#888;padding:4px 10px;outline:0;text-decoration:none}.b-admin-menu .e-item.selectable .e-link{cursor:pointer}.b-admin-menu .e-item.selectable.selected .e-link,.b-admin-menu .e-item.selectable:hover .e-link{background-color:#555;color:#fff}.b-admin-right .b-toolbar{position:absolute;top:0;right:0;left:0;height:34px;padding:8px 8px;color:#fff;text-shadow:0 1px 1px #000}.b-admin-right .b-content{position:absolute;top:58px;bottom:8px;left:0;right:8px;overflow-y:auto;z-index:2;background-color:#fff;border:1px solid #aaa;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.2);box-shadow:0 2px 8px rgba(0,0,0,.2);border-radius:5px}.b-admin-right .b-content .content{-webkit-overflow-scrolling:touch}.b-admin-right .b-settings-content{padding:20px;padding-left:30px}.b-admin-right .b-settings-content .legend{width:670px}.b-admin-right .b-settings-content .nav-tabs{width:670px}html.rl-mobile .b-settings-content .legend{width:auto}.b-admin-general .flag-selector{padding-top:5px}.b-admin-general .flag-name{border-bottom:1px dashed #555;cursor:pointer;padding:2px 0}.b-admin-general .flag-name:focus{outline:1px;outline-style:dotted}.b-admin-branding .disabled-form{opacity:.8}.b-admin-branding .custom-css-wrapper textarea{font-family:Monaco,Menlo,Consolas,'Courier New',monospace}.b-admin-domains .process-place{width:600px;padding:14px 0;text-align:center;visibility:hidden}.b-admin-domains-list-table{width:600px}.b-admin-domains-list-table .e-item .e-action{cursor:pointer}.b-admin-domains-list-table .e-item .domain-name{display:inline-block;word-break:break-all;-webkit-box-sizing:border-box;box-sizing:border-box}.b-admin-domains-list-table .e-item .domain-alias{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;color:#bbb;padding-left:5px}.b-admin-domains-list-table .e-item.disabled .domain-alias,.b-admin-domains-list-table .e-item.disabled .domain-name{color:#bbb}.b-admin-domains-list-table .e-item .button-delete{margin-right:15px;visibility:hidden;opacity:0}.b-admin-domains-list-table .e-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1}.b-admin-domains-list-table .e-item .delete-domain,.b-admin-domains-list-table .e-item .disabled-domain{cursor:pointer;opacity:.5}.b-admin-domains-list-table .e-item.disabled .disabled-domain{opacity:.5}.b-admin-domains-list-table .e-item .delete-domain:hover,.b-admin-domains-list-table .e-item .disabled-domain:hover{opacity:1}.b-domain-alias-content.modal{width:330px}.b-domain-alias-content .modal-header{background-color:#fff}.b-domain-alias-content .error-desc{color:red}.b-domain-content.modal{width:810px}.b-domain-content .modal-header{background-color:#fff}.b-domain-content .modal-body{position:relative;overflow:hidden;width:1600px;height:400px;left:0}.b-domain-content.domain-edit .modal-body{height:340px}.b-domain-content.domain-second-page .modal-body{left:-800px}.b-domain-content .domain-desc{color:#666;line-height:20px;background-color:#f9f9f9;padding:8px;border:1px solid #eee;border-radius:3px;margin:-5px 0}.b-domain-content .domain-desc i{font-style:normal;color:red}.b-domain-content .error-desc{color:red}.b-domain-content .testing-done.imap-header,.b-domain-content .testing-done.sieve-header,.b-domain-content .testing-done.smtp-header{color:green;font-weight:700}.b-domain-content .testing-error.imap-header,.b-domain-content .testing-error.sieve-header,.b-domain-content .testing-error.smtp-header{color:red}.b-admin-packages .alert{width:650px}.b-admin-packages .process-place{visibility:hidden}.b-admin-packages-list-table{width:700px}.b-admin-packages-list-table .e-item .package-img{font-size:12px;margin-right:2px}.b-admin-packages-list-table .e-item .package-name.core{font-weight:700}.b-admin-packages-list-table .e-item .package-desc{color:#999;font-size:12px}.b-admin-packages-list-table .e-item .e-action{cursor:pointer}.b-admin-packages-list-table .e-item .package-actions-parent,.b-admin-packages-list-table .e-item .package-release-parent{text-align:center}.b-admin-packages-list-table .e-item .package-actions-parent{vertical-align:middle}.b-admin-plugins .process-place{visibility:hidden}.b-admin-plugins-list-table.disabled{opacity:.5;background-color:#eee}.b-admin-plugins-list-table .e-item .e-action{cursor:pointer}.b-admin-plugins-list-table .e-item .plugin-img{font-size:12px;margin-right:2px}.b-admin-plugins-list-table .e-item.disabled .plugin-img,.b-admin-plugins-list-table .e-item.disabled .plugin-name{color:#bbb}.b-admin-plugins-list-table .e-item.disabled .disabled-plugin{opacity:.5}.b-admin-plugin-property .help-block{margin-bottom:5px}.b-plugin-content.modal{width:660px}.b-plugin-content.modal .modal-body{overflow:auto}.b-plugin-content .modal-header{background-color:#fff}.b-plugin-content .information{display:inline-block;background-color:#ddd;border-radius:10px;cursor:pointer;height:25px;width:30px;text-align:center;padding-top:5px}.b-plugin-content textarea{width:400px;height:70px}.b-admin-about .rl-logo{display:inline-block;width:250px;height:250px;margin-top:-10px;margin-bottom:-10px;background-image:url(images/rainloop-logo.png)}.b-admin-about .rl-desc{margin-top:20px;margin-left:-20px}.popups .b-activate-content{width:700px}.popups .b-activate-content .modal-header{background-color:#fff}.popups .b-activate-content .help-inline{padding-left:0}.b-settins-left .b-toolbar{position:absolute;top:0;right:0;left:0;height:34px;padding:8px 0 0 8px}.b-settins-left .b-footer{position:absolute;bottom:20px;right:0;left:0;height:20px;padding:0 10px 0 5px;z-index:101}.b-settins-left .b-content{position:absolute;top:68px;bottom:8px;left:0;right:0;overflow:hidden}.b-settins-left .b-content .content{-webkit-overflow-scrolling:touch}.b-settings-menu .e-item{overflow:hidden;text-decoration:none;outline:0}.b-settings-menu .e-link{position:relative;display:block;height:30px;line-height:29px;font-size:18px;z-index:1;cursor:default;background-color:transparent;color:#888;padding:4px 10px;outline:0;text-decoration:none}.b-settings-menu .e-item.selectable .e-link{cursor:pointer}.b-settings-menu .e-item.selectable.selected .e-link,.b-settings-menu .e-item.selectable:hover .e-link{background-color:#555;color:#fff}.b-settins-right .b-toolbar{position:absolute;top:0;right:0;left:0;height:34px;padding:8px 5px;color:#fff}.b-settins-right .b-content{position:absolute;top:50px;bottom:8px;left:0;right:8px;overflow-y:auto;z-index:2;background-color:#fff;border:1px solid #aaa;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.2);box-shadow:0 2px 8px rgba(0,0,0,.2);border-radius:5px}.b-settins-right .b-content .content{-webkit-overflow-scrolling:touch}.b-settins-right .b-settings-content{padding:20px;padding-left:30px}.b-settins-right .b-settings-content .legend{width:600px}html.rl-mobile .b-settings-content .legend{width:auto}html.rl-mobile .b-settings-general{margin-right:15px}.b-settings-general .notification-desc-denied{color:#999;display:none}.b-settings-general .denied-by-browser .notification-desc-denied{display:inline}.b-settings-general .denied-by-browser .notification-desc{color:#999}.b-settings-general .flag-selector{padding-top:5px}.b-settings-general .flag-name{border-bottom:1px dashed #555;cursor:pointer;padding:2px 0}.b-settings-general .flag-name:focus{outline:1px;outline-style:dotted}html.rl-mobile .b-settings-accounts{margin-right:15px}.b-settings-accounts .process-place{text-align:center;width:600px;padding:14px 0}.b-settings-accounts .list-table{width:600px}.b-settings-accounts .list-table td{padding:4px 8px;line-height:30px}.b-settings-accounts .list-table .drag-handle{color:#eee}.b-settings-accounts .list-table tr:hover .drag-handle{color:#aaa}.b-settings-accounts .list-table .account-img,.b-settings-accounts .list-table .identity-img{font-size:12px;margin-right:5px}.b-settings-accounts .list-table .account-name{display:inline-block;word-break:break-all;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:22px}.b-settings-accounts .list-table .identity-default{cursor:pointer;color:#ccc}.b-settings-accounts .list-table .identity-name{display:inline-block;word-break:break-all;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:22px;cursor:pointer}.b-settings-accounts .accounts-list-top-padding,.b-settings-accounts .identities-list-top-padding{display:inline-block;height:5px;width:5px}.b-settings-accounts .account-item{white-space:nowrap}.b-settings-accounts .account-item .e-action{cursor:pointer}.b-settings-accounts .account-item .drag-handle{cursor:pointer;cursor:all-scroll}.b-settings-accounts .account-item .button-delete{margin-right:15px;margin-top:5px;visibility:hidden;opacity:0}.b-settings-accounts .account-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1}.b-settings-accounts .account-item .delete-account{cursor:pointer;opacity:.5}.b-settings-accounts .account-item.ui-sortable-helper{background:#f5f5f5;border:1px solid #ddd}.b-settings-accounts .account-item.ui-sortable-helper .button-delete,.b-settings-accounts .account-item.ui-sortable-helper .delete-account{display:none}.b-settings-accounts .account-item.ui-sortable-helper td{border-width:0}.b-settings-accounts .identity-item{white-space:nowrap}.b-settings-accounts .identity-item .e-action{cursor:pointer}.b-settings-accounts .identity-item .button-delete{margin-right:15px;margin-top:5px;visibility:hidden;opacity:0}.b-settings-accounts .identity-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1}.b-settings-accounts .identity-item .delete-identity{cursor:pointer;opacity:.5}.b-settings-accounts .identity-item.ui-sortable-helper{background:#f5f5f5;border:1px solid #ddd}.b-settings-accounts .identity-item.ui-sortable-helper .button-delete,.b-settings-accounts .identity-item.ui-sortable-helper .delete-identity{display:none}.b-settings-accounts .identity-item.ui-sortable-helper td{border-width:0}html.rl-mobile .b-settings-templates{margin-right:15px}.b-settings-templates .process-place{text-align:center;width:600px;padding:14px 0}.b-settings-templates .list-table{width:600px}.b-settings-templates .list-table td{padding:4px 8px;line-height:30px}.b-settings-templates .list-table .drag-handle{color:#eee}.b-settings-templates .list-table tr:hover .drag-handle{color:#aaa}.b-settings-templates .list-table .template-img{font-size:12px;margin-right:5px}.b-settings-templates .list-table .template-name{display:inline-block;word-break:break-all;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:22px}.b-settings-templates .templates-list-top-padding{display:inline-block;height:5px;width:5px}.b-settings-templates .template-item .e-action{cursor:pointer}.b-settings-templates .template-item .drag-handle{cursor:pointer;cursor:all-scroll}.b-settings-templates .template-item .button-delete{margin-right:15px;margin-top:5px;visibility:hidden;opacity:0}.b-settings-templates .template-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1}.b-settings-templates .template-item .delete-template{cursor:pointer;opacity:.5}.b-settings-templates .template-item.ui-sortable-helper{background:#f5f5f5;border:1px solid #ddd}.b-settings-templates .template-item.ui-sortable-helper .button-delete,.b-settings-templates .template-item.ui-sortable-helper .delete-template{display:none}.b-settings-templates .template-item.ui-sortable-helper td{border-width:0}html.rl-mobile .b-settings-open-pgp{margin-right:15px}.b-settings-open-pgp .process-place{text-align:center;width:600px;padding:14px 0}.b-settings-open-pgp .list-table{width:750px}.b-settings-open-pgp .list-table td{padding:4px 8px;line-height:30px}.b-settings-open-pgp .list-table .open-pgp-key-img{margin-right:10px;vertical-align:top}.b-settings-open-pgp .list-table .open-pgp-key-img .svg-icon{width:12px;height:12px}.b-settings-open-pgp .list-table .open-pgp-key-id,.b-settings-open-pgp .list-table .open-pgp-key-user{display:inline-block;word-break:break-all;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:22px;cursor:default}.b-settings-open-pgp .list-table .open-pgp-key-user-address:first-child{line-height:30px;margin-bottom:-4px}.b-settings-open-pgp .open-pgp-key-item .button-delete{margin-right:15px;margin-top:5px;visibility:hidden;opacity:0}.b-settings-open-pgp .open-pgp-key-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1}.b-settings-open-pgp .open-pgp-key-item .delete-open-pgp-key,.b-settings-open-pgp .open-pgp-key-item .view-open-pgp-key{cursor:pointer;opacity:.7}.b-settings-open-pgp .open-pgp-key-item .delete-open-pgp-key:hover,.b-settings-open-pgp .open-pgp-key-item .view-open-pgp-key:hover{opacity:.9}html.rl-mobile .b-settings-folders{margin-right:35px}.b-settings-folders.ignore-folder-subscribe .subscribe-folder,.b-settings-folders.ignore-folder-subscribe .unsubscribe-folder{display:none}.b-settings-folders .process-place{text-align:center;width:600px;padding:14px 0}.b-settings-folders .folders-list-error{width:550px;margin:10px 0}.b-settings-folders .list-table{width:600px}.b-settings-folders .list-table .e-action{cursor:pointer}.b-settings-folders .list-table td{padding:4px 8px;line-height:30px}.b-settings-folders .list-table .folder-padding{display:inline-block;width:0}.b-settings-folders .list-table .folder-name{display:inline-block;word-break:break-all;white-space:pre-wrap;-webkit-box-sizing:border-box;box-sizing:border-box;margin-left:7px;line-height:22px;cursor:default}.b-settings-folders .list-table .folder-system-name{display:inline-block;line-height:22px;color:#999;cursor:default}.b-settings-folders .list-table .folder-name.can-be-edited:hover{border-bottom:1px dashed #333;cursor:pointer}.b-settings-folders .list-table .folder-name-input{border-width:1px;margin-bottom:0;margin-left:-4px}.b-settings-folders .folder-item.system .folder-name{font-weight:700}.b-settings-folders .folder-item .button-delete{margin-right:15px;margin-top:5px;visibility:hidden;opacity:0}.b-settings-folders .folder-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1}.b-settings-folders .folder-item .check-folder,.b-settings-folders .folder-item .delete-folder,.b-settings-folders .folder-item .subscribe-folder,.b-settings-folders .folder-item .uncheck-folder,.b-settings-folders .folder-item .unsubscribe-folder{cursor:pointer;opacity:.6}.b-settings-folders .folder-item .unsubscribe-folder{opacity:.2}.b-settings-folders .folder-item .uncheck-folder{opacity:.2}.b-settings-folders .folder-padding.deep-1{width:25px}.b-settings-folders .folder-padding.deep-2{width:40px}.b-settings-folders .folder-padding.deep-3{width:55px}.b-settings-folders .folder-padding.deep-4{width:70px}.b-settings-folders .folder-padding.deep-5{width:85px}.b-settings-content .b-settings-themes .legend{width:100%}html.rl-mobile .b-settings-content .b-settings-theme .legend{width:auto}html.rl-mobile .b-themes-list{margin-right:15px}.b-themes-list .e-item{display:inline-block;border:2px solid transparent;cursor:pointer;color:#000;background-color:#fff;padding:16px;margin:5px}.b-themes-list .e-item:hover{border:2px solid grey}.b-themes-list .e-item.selected{background-color:#eee;border:2px solid #000}.b-themes-list .e-item .e-image{width:100px;height:100px;border:1px solid #ddd}html.rl-mobile .b-settings-filters{margin-right:15px}.b-settings-filters .process-place{text-align:center;width:600px;padding:14px 0}.b-settings-filters .list-table{width:600px}.b-settings-filters .list-table td{padding:4px 8px;line-height:30px}.b-settings-filters .list-table td.drag-wrapper{padding:4px 0}.b-settings-filters .list-table .drag-handle{color:#eee}.b-settings-filters .list-table tr:hover .drag-handle{color:#aaa}.b-settings-filters .list-table .filter-img{font-size:12px;margin-right:5px}.b-settings-filters .list-table .filter-name,.b-settings-filters .list-table .filter-sub-name{display:inline-block;word-break:break-all;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:22px;cursor:pointer}.b-settings-filters .list-table .filter-sub-name{color:#aaa}.b-settings-filters .filters-list-top-padding{display:inline-block;height:5px;width:5px}.b-settings-filters .filter-item{white-space:nowrap}.b-settings-filters .filter-item .e-action{cursor:pointer}.b-settings-filters .filter-item .drag-handle{cursor:pointer;cursor:all-scroll}.b-settings-filters .filter-item .button-delete{margin-right:15px;margin-top:5px;visibility:hidden;opacity:0}.b-settings-filters .filter-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1}.b-settings-filters .filter-item .delete-filter{cursor:pointer;opacity:.5}.b-settings-filters .filter-item.ui-sortable-helper{background:#f5f5f5;border:1px solid #ddd}.b-settings-filters .filter-item.ui-sortable-helper .button-delete,.b-settings-filters .filter-item.ui-sortable-helper .delete-filter{display:none}.b-settings-filters .filter-item.ui-sortable-helper td{border-width:0}.rl-cmd{position:absolute;bottom:0;left:0;right:0;top:auto;height:0;z-index:10000;background:rgba(0,0,0,.85);border-top:1px solid #000;overflow:hidden;font-family:monospace;-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;transition:height .1s ease-out}.rl-cmd.opened{height:250px}.rl-cmd .rl-cmd-clr-error{color:#cd3131}.rl-cmd .rl-cmd-clr-info{color:#bfbf00}.rl-cmd .rl-cmd-clr-success{color:#31ff40}.rl-cmd .rl-cmd-wrp{position:relative;height:100%}.rl-cmd .rl-cmd-input-helper{color:#666}.rl-cmd .rl-cmd-input-prefix{color:#31ff40;display:inline-block}.rl-cmd .rl-cmd-input-wrp{position:absolute;bottom:0;left:10px;right:10px}.rl-cmd .rl-cmd-input{background:0 0;border:none;color:#fff;display:inline-block;width:calc(100% - 30px);font-family:monospace}.rl-cmd .rl-cmd-input:focus{background:0 0;border:none}.rl-cmd .rl-cmd-history{color:#fff;font-family:monospace;position:absolute;top:10px;bottom:60px;left:10px;right:-30px;overflow:hidden;overflow-x:hidden;overflow-y:auto}@-webkit-keyframes highlight-folder-row{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.1);transform:scale(1.1)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes highlight-folder-row{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.1);transform:scale(1.1)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes bounce-me{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.2);transform:scale(1.2)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes bounce-me{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.2);transform:scale(1.2)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes textLoadingAnimationKeyFrame{0%{opacity:1}33%{opacity:0}100%{opacity:1}}@keyframes textLoadingAnimationKeyFrame{0%{opacity:1}33%{opacity:0}100%{opacity:1}}@-webkit-keyframes animate-stripes{0%{background-position:0 0}100%{background-position:60px 0}}@keyframes animate-stripes{0%{background-position:0 0}100%{background-position:60px 0}}@-webkit-keyframes login-form-shake{0%{-webkit-transform:translateX(0);transform:translateX(0)}12.5%{-webkit-transform:translateX(-6px) rotateY(-5deg);transform:translateX(-6px) rotateY(-5deg)}37.5%{-webkit-transform:translateX(5px) rotateY(4deg);transform:translateX(5px) rotateY(4deg)}62.5%{-webkit-transform:translateX(-3px) rotateY(-2deg);transform:translateX(-3px) rotateY(-2deg)}87.5%{-webkit-transform:translateX(2px) rotateY(1deg);transform:translateX(2px) rotateY(1deg)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes login-form-shake{0%{-webkit-transform:translateX(0);transform:translateX(0)}12.5%{-webkit-transform:translateX(-6px) rotateY(-5deg);transform:translateX(-6px) rotateY(-5deg)}37.5%{-webkit-transform:translateX(5px) rotateY(4deg);transform:translateX(5px) rotateY(4deg)}62.5%{-webkit-transform:translateX(-3px) rotateY(-2deg);transform:translateX(-3px) rotateY(-2deg)}87.5%{-webkit-transform:translateX(2px) rotateY(1deg);transform:translateX(2px) rotateY(1deg)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}html.csstransitions.rl-started-trigger.no-mobile .b-login-content .loginFormWrapper{-webkit-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px);opacity:.5}#rl-loading{-webkit-transition:opacity .5s linear;-o-transition:opacity .5s linear;transition:opacity .5s linear}html.csstransitions.rl-started-delay #rl-left{-webkit-transition:width .3s ease-out;-o-transition:width .3s ease-out;transition:width .3s ease-out}html.csstransitions.rl-started-delay #rl-right{-webkit-transition:left .3s ease-out,right .3s ease-out;-o-transition:left .3s ease-out,right .3s ease-out;transition:left .3s ease-out,right .3s ease-out}html.csstransitions.rl-started-delay #rl-sub-left,html.csstransitions.rl-started-delay #rl-sub-left .messageList .inputSearch{-webkit-transition:width .3s ease-out;-o-transition:width .3s ease-out;transition:width .3s ease-out}html.csstransitions.rl-started-delay #rl-sub-right{-webkit-transition:left .3s ease-out;-o-transition:left .3s ease-out;transition:left .3s ease-out}html.rgba.cssanimations.backgroundsize .e-strip-animation{background-size:60px 60px;background-image:-o-linear-gradient(315deg,rgba(0,0,0,.1) 25%,transparent 25%,transparent 50%,rgba(0,0,0,.1) 50%,rgba(0,0,0,.1) 75%,transparent 75%,transparent);background-image:linear-gradient(135deg,rgba(0,0,0,.1) 25%,transparent 25%,transparent 50%,rgba(0,0,0,.1) 50%,rgba(0,0,0,.1) 75%,transparent 75%,transparent);-webkit-animation:animate-stripes 2s linear infinite;animation:animate-stripes 2s linear infinite}html.rl-anim .rl-animated-inited{opacity:1;-webkit-transition:opacity .5s linear;-o-transition:opacity .5s linear;transition:opacity .5s linear}html.rl-anim .rl-animated-inited.rl-animated-hidden{opacity:0}html.rl-anim.cssanimations.csstransitions.no-mobile .b-login-content .errorAnimated{-webkit-animation:login-form-shake .4s ease-in-out;animation:login-form-shake .4s ease-in-out}html.rl-anim.no-mobile .b-login-content .errorAnimated .buttonLogin{color:#b94a48;font-weight:700}html.rl-anim.cssanimations.csstransitions.no-mobile .b-login-content .afterLoginHide{opacity:0}html.rl-anim.csstransitions.no-mobile .btn-group.dropdown.colored-toggle.open .animate-this-icon-on-open{-webkit-animation:bounce-me .5s linear;animation:bounce-me .5s linear}html.rl-anim.csstransitions.no-mobile .b-login-content .loginFormWrapper{-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}html.rl-anim.csstransitions .button-delete-transitions{-webkit-transition:all .2s linear;-o-transition:all .2s linear;transition:all .2s linear}html.rl-anim.cssanimations .b-folders .e-item .anim-action-class{-webkit-animation:highlight-folder-row .5s linear;animation:highlight-folder-row .5s linear}html.rl-anim.csstransitions .b-folders .btn.buttonContacts{-webkit-transition:margin .3s linear;-o-transition:margin .3s linear;transition:margin .3s linear}html.rl-anim.csstransitions .b-folders .b-content.opacity-on-panel-disabled{-webkit-transition:opacity .3s linear;-o-transition:opacity .3s linear;transition:opacity .3s linear}html.rl-anim.csstransitions .messageList .messageListItem{-webkit-transition:max-height .4s ease;-o-transition:max-height .4s ease;transition:max-height .4s ease}html.rl-anim.csstransitions .messageList .listDragOver{-webkit-transition:all .4s ease;-o-transition:all .4s ease;transition:all .4s ease}html.rl-anim.csstransitions .b-list-content .e-contact-item{-webkit-transition:max-height .4s ease;-o-transition:max-height .4s ease;transition:max-height .4s ease}html.rl-anim.csstransitions .modal.b-domain-content .modal-body{-webkit-transition:left .5s ease;-o-transition:left .5s ease;transition:left .5s ease}html.rl-anim.csstransitions.rl-modal.rl-modal-animation .popups{overflow:hidden}html.rl-anim.csstransitions .modal.fade{-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out;-webkit-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px)}html.rl-anim.csstransitions .modal.fade.in{-webkit-transform:none;-ms-transform:none;transform:none}html.rl-anim.cssanimations .b-compose.loading .b-header-toolbar{background-size:60px 60px;background-image:-o-linear-gradient(315deg,rgba(255,255,255,.2) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.2) 75%,transparent 75%,transparent);background-image:linear-gradient(135deg,rgba(255,255,255,.2) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.2) 75%,transparent 75%,transparent);-webkit-animation:animate-stripes 2s linear infinite;animation:animate-stripes 2s linear infinite}.textLoadingAnimationD1,.textLoadingAnimationD2,.textLoadingAnimationD3{-webkit-animation:textLoadingAnimationKeyFrame 1s linear infinite 0s;animation:textLoadingAnimationKeyFrame 1s linear infinite 0s}.textLoadingAnimationD2{-webkit-animation-delay:.3s;animation-delay:.3s}.textLoadingAnimationD3{-webkit-animation-delay:.6s;animation-delay:.6s}.rl-view-model.RL-About,.rl-view-model.RL-AdminLogin,.rl-view-model.RL-Login,.rl-view-model.RL-LoginNew{position:relative;height:100%;z-index:5}.mfp-container .mfp-figure{min-height:300px;min-width:300px}.ui-resizable-e{right:-1px;width:5px}.pswp__error-msg{color:#ccc}.pswp__error-msg a,.pswp__error-msg a:hover{color:#fff}.pswp__img--placeholder{opacity:0}.opentip-container{z-index:2001!important}.opentip-container .ot-content{font-size:13px}.opentip-container.style-rainloopErrorTip .ot-content{color:red}.opentip-container.ot-hide-effect-none,.opentip-container.ot-show-effect-none{-webkit-transition:none!important;-o-transition:none!important;transition:none!important}.opentip-container.ot-show-effect-fade{-webkit-transition:none;-o-transition:none;transition:none}.opentip-container.ot-show-effect-fade.ot-hidden{opacity:0}.opentip-container.ot-show-effect-fade.ot-going-to-show{opacity:0;-webkit-transition:opacity .2s ease-in-out;-o-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.opentip-container.ot-show-effect-fade.ot-showing{opacity:1;-webkit-transition:opacity .2s ease-in-out;-o-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.opentip-container.ot-show-effect-fade.ot-visible{opacity:1;-webkit-transition:none;-o-transition:none;transition:none}svg-icon{display:none}.svg-icon{border:0;outline:0;height:16px;width:16px;display:inline-block;fill:#333}.svg-icon.svg-icon-archive{height:14px;width:14px}.lg-backdrop.in{opacity:.8}.btn .btn-text{padding-left:8px}.active-scale-transition{-webkit-transition:-webkit-transform .2s;transition:-webkit-transform .2s;-o-transition:transform .2s;transition:transform .2s;transition:transform .2s,-webkit-transform .2s}.active-scale-transition:active{-webkit-transform:scale(.95);-ms-transform:scale(.95);transform:scale(.95)}html.glass input:-webkit-autofill,html.glass input:-webkit-autofill:active,html.glass input:-webkit-autofill:focus,html.glass input:-webkit-autofill:hover{-webkit-transition-delay:9999s;-webkit-transition:color 9999s ease-out,background-color 9999s ease-out} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/default-skin.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/default-skin.png new file mode 100755 index 0000000000000000000000000000000000000000..d7495968903e4c4a5e5afef2206641c3adf0fb47 GIT binary patch literal 1088 zcmeAS@N?(olHy`uVBq!ia0y~yVB`R@BRJTABqx979v~%I;u=vBoS#-wo>-L1;Fyx1 zl&avFo0y&&l$w}QS$HzlhJk_kk*AAeNX4x;cWt{x!)4eXSig3=D-y;SzJ{req1x4H zf`*q}!`6r&K@lpk2abeDv9zuU+m@H8+~UCEC=kqI?U^jhp%N*)O?+a-XZbR-HPd(A z+dk9!`5Qa_KOb`S<-X1PJiGWAU(Ut%->Vr)xmX!BI2;@qxR?S28k!hHSQaQSK!u>< z85a*tS^xU_lHTiE5-)vR_8=q0^ppFO(yy9~nZ)tUS9*Zvd z@lVGs&sERmU*8{*O3BE+IX!Rs@ASp=?eR>odukSUtim~6Yli0jYdh0y%9YZU@4K#Z ziOc=Ded!7FiTX;rm7n)azfvY}IWG2jZRxqfC`?PCnk-De)kvAosHfAQBe#oc%Z^Kau%frlQyRkZ*ae#)Pb?~2a4 zy0dxD5>jk0e!S+HxMxenkp;C+CHMZxD9Ai=eQNqI;fdeuH(==&b~Wr zRqpTY&f8wjUKbX>{nE!6DYJWVi-3-?JDTy$)c5zk?H?~(+?tihYZv~ZH2<;kVZFRX zdF>w;DJ=W9Ke%Gjr{)u9@9p+iTNj%C_pG|`Zk-Kxj(eYGop@W+a(mN_5WA3)joUw7 zOsM=`zt`&U^xI#SGvAMX?CSVtL(_~ewwgWD^|+f##A6fpV2Mveq@u<%s`wd=_W9Zm z)8jQbtfDIZ@9#g>(WJ1Pb%l%wi`b%~009lorwbH3svi1(*(asHQsjtA`O3Q&!vwgJ z*hP=1+&&qzZJy<{8Om&)?-ks9JLahQ+HXGjR!wznWX__LZ9W~lR_E(YPAz{@kY?Q( zvVZ&HXDl-#G76lo_}-E^^)TQ`UW)A}Z|C%^@RtvZn`Fz5NTfS1wP-vodwA=KrG{le zn)WMS1ZHp2?ASHQqp+w(;-}%KlT*T70t9YvQ8<-+wfV&JQ;cr<)3)_Xtek6qUYmW! zf4)WUmPKZnUz(<@uk?GB{r+B?zCQw$azE8StuAWd?be-k_}Tm5UproZnpPCiTO<1O z>^a6;w;i8+T5#pwiKvwDCpl04RUca=v!GG-$PRA%*11Pkp4dO}ywdqQ#SItJ_IgJ8 zY*^9NC;s5%iI;*;8BA)9oH+XNgmS(mmcZBGfaNGq;5$hD6HZ{@Rlab@h*zK(SR^ob My85}Sb4q9e0GgQI^8f$< literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/default-skin.svg b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/default-skin.svg new file mode 100755 index 00000000..61f52f10 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/default-skin.svg @@ -0,0 +1,38 @@ + + + + default-skin 2 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/flags.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/flags.png new file mode 100755 index 0000000000000000000000000000000000000000..7b3a380895c1f5d236075fc64f506a5352fb2350 GIT binary patch literal 78832 zcmV)TK(W7xP)9u?PyxYE6oc>rA|L_^0)iMy z1ZfcnRUkl$q>zLpq;9s~nN#0C&Y8LQ?ruO|-}!vzGjr$OGp9YzbDr`$&kd}#{3pk` zKU!d;$N*prL?Yymw{L|pWf&s?P|E#QRf7SPKMgRv&-)CJ`Ej2g34bs8-*2^OD>^$n z)AB+HRq5123k z+S`i;&|rkXC{zDz<{ zDhROFrft`N@^tsd-z}g!nIOPm5C)9$)2s~27$Rj5#+{Ke2xZ8HQ1QctlI{y(h$7Is zxTl4;!y`=L9KMMr2kg_g?*n}Ps`Ilc*YjG%c&_?u8@IMUMb;QDHV1RX@Z}t^^JX0O zoAuDsPBMFkefOKpynhDJ1_;Ld>X&p2LpGNsiWJ5elrjjTkP62<$`r1`-wOrV5Vqe8 zB30U8RWyKKQ$E{o_W#YJyH_#!=oSF9wI~$=(+L7iCL^#`lFLbq5o9hFSSc_Z%4oDvD63FLp^QXoe>DoJB{S}rL0elJKmF-XUHwL5v;ipz zlqMquR!VYGVuawBF&4Q+4?+uK9rN(L5AzdX{?%8rfdX*{Xlg1ohfPvgqj>ri#hNxr zKCe(xB9)>}N=DC^!Q)ZD>g%@Vxu}*yR+SUxBOYzpo)hI#9th9ins07I7>hIptsHS{ zYthzn@8rA40xh>qcm3BIV+>iXxo=|+$5)1gT66#UZqBRDpp_y}0wX0xN zs#O?Z%QMaZYn|jU#+5M!w8nZNgi`6f6#}H>Z|}cPr-HM`B(!U>Ho#cVV8)_tfHoO4 zA=+5~%$*m_?xuD<+;^W7Hr80Q4$vC3cC;vENKSR}4c=!=xR4M*)v!NMHenQxzx*Ox zeoa66Lu;(kpcR2qWRxP5(v4%$wR^@4ZkSia16PgZ)Km8*`fxLBl;>Nc#?sK#z)OoG zu4rC`R))NgoP6XqWU~RM9J2#6XD#C4UreVhQrtGFg~Q%_lE3VGA`uykHE#HfaeXz$ z@vt`j-XgW-wtHqnx8mx9+yEL2#*dBi<(0K4UtVe_OrDd zTGCq63IeiO*M&7}*P^6EC6gosHWpYBW8)YT$80ROENt#1mJ!WWEg)c9U>KIWR;(n_ z8f!Gyeor!Qk*1|qVzgw(F_Ik)m7F|PkdK^DxvsSp0X*9MJh>0@{MXvG(A9+%k`w>= zDX|IpulNr)4TG!77+h6GP8n8pMU;gBkWWWIt@)CS(LCJN%eN~-w&{uZNm~y} z2u`dF5bF)MuIuCn)gejA> zEp_FRvxxDnwFE(cN>n>*F{@TN0px{?H8DYJC)x8Cqkh|reme(#UXYTor3H;!yrhAR z(s}~+0@65QR>q&!qD|p*V|f6=kj*;TGk30ai<|@@Ey$Q1d5t~8w`gDuxxr0T?Y$fE zh(NBQ1{MjYVjuK}l_Bt@`~ovBLst*6xK@i$_Va!RA7xnNX5}YFi}dD0=MS&;EK`P@{J*1pg*36t%B^x z5p;G5X17DHwg?H+j@q2cxC?@i?rbIBe|#PgVGQZ&Y?WfCjOD7;okVerm4YgzxV3x7K2@SYt81ZeuNF z0W^JMJ(n^RYaH`S31iG0cF(;|OT`j06_r$Nzb$14TnOd$%=_#8eDR0hviRfWYC&*u1+2u|VKdy`We%mFjDmznB1p5GbV( zQX+*wCaeFMXChwy8@9cJ%;863XT6GyEwPM=R79)=^m;qEp_(J|bu8WYGGd!ymqEW{ z`tp-dpC^NDIrN)%v1F_75yUZPJ$WJ7rUne~U`HLl8_~!E@AtBQwuYQl%ox2dr+oPV zkFS!5N)X17>v$64`IL>gnyS_Jqs;DrBotl%NQu>o_q+3qFpBw7B4WWtArP@(s8zh) z8L>lk=*=ie2n?zE4L?;ovs(3H{2VA{P)Z}E>31)sK}yYVSKuXG{EFeB@ z0@miqU8=A>J#LQU*v(HAVSp`a4UM@X;p3U#=3hp4KZCJ~u=+4;#ld|R0NAw=lrU78 zE{@2)$e8kZlm(KC(W59o@Ir#2o29@1?Bz%J@{>2o4jx5S<}=FaVr_elwa-3FQ&Us_ z`UjvnAw+sDtFA_V_q((|Iu{xnd3sHjEoyoQmFDHayRz?~FX&j%#(|rUqIFm;mz=pf zSO4;5PCR@fW!Zp(_8h|Q&$&gQuH*h`6|Mte0~8S7}z^On#BEx1g5eAwd<~s zj|eJq*eF6phP=uX$(Yz{00uD1N&dqhzmaKSE6dz3zfV?lamiyp zAgFN?RRKq}z|F6J&WuIf)LTtPYwmpPZC)MKz@(;LW(keZPGDt+O+hTV6jQqw+8QA5 z2u{0636*9%nzd4Ld3C@woiRcPrq*V7vR$x+)ffR<2(sS6DTH$zY2_GPD}(IE^x6@P zXa3|_;$~FJBBf0Qz%Opyg9|TulWVVe&j}0-Kf8WMF248;gfQuQK{+EPvH6qLQwYq0 z3UW6tMO@zi^#vb*6(arJ%08M$s(o0Cjb6f-&#^{gduL*E2lbnOV+<$uyujX_OEBfD zDBEHJl?VS9K~;6hZ+lkU$k=@^Vd%~~pz@8Zn?HvjETgG$(5CDEy3_w|{Y$U#r<#MA zy;8Eylw*|U@6XI(&hQ#0W;9Pe{|ToazXQ*`_8C%YUVeKiVJ6^(*BATw18ppMp`F_A zO&qD6$>UaiTQC8Vd+*RQT07H88?17xfBBekl#L$47t^NEeD>Ld)iqRZ(?QpqkG)o) zF~&J%{~rW^a`uKYNa+N?vU&Bah%0HCzK)K|%lY!1O2Q8ZF*e?aj@$|m#&P0^cWSy) zPIdej1wh~@t0#((QX+&Pj$`6D#t4D_d@0#i%rRY__5GwZ$N0LqzAN+G01NyB;Py~4MSn!tevv|zO1 z`M<8<``>>JDJ??iREvO!b4@_&8*dOr5ylv-wOnyUo{v8a*|XfR&CToi$t@XPk0PhO zhatACjEapL*&ron6f+!t1-2HO+XtfcfWTH9INzPAPe;A_<*pbb4{x(bB`?!?hi|hZo1<2Qb=il0x za#%=4Ehn(hCWMTS9}xtFIJ+(!`(6BVPPDE$5s=+Y^7Hdau3cdHY?0*f})=>3(nizXU*{ zS_)~1MZk#7m$BrN&3R+e1mrscB?V)*U4rh3u(7~+TQCWw1c_aktP=l%`fvRNU@cNg zq9{s*fQcgPUtc5|+Ju#g+^6#)j!~ju0!Sl4_^^*sSgDapvZr3oUcIkSf8u|a)Y4cw_ zf=VU$$(jy+Sd(Gqx|k@AIkhpz_gA)a@8B}$pb`S36}>?B?PrtS>lSR!O00EJ3#(=6 z)i`ISH5!b27FLhsN6{Y`^6L%M*Vp%7{U%MqKInV}TMEG?AAM9Z{y`A1Xwg<2fBf;O z07<@Iupr>bBPB|~{l5*k;9SLPuZ5|AaG@@Rl#+QJhKaQnp)J;Xv7McN5Vq=@80*YR z(^HrWV<4Bcyt!VZs6r2_=Fx>m5yywnD(Cafl`k^x)B6e4bSk#rj*7#NBD>i^^lY3- zu<9lzP7su5Uqi}j1|NJd_L57m>(-U}PL#qbU09s7ChMPPwZ;w`2Ggbir-9eHj@@qp z6Gji_x;tKTHoDPB=^{H;TjE&pi~D912A08f<$yw-x<5hVRIFMKR${GmT2Jw{o&H-qoB9JnT3ulVF(^g6*O`3%8_I!HvHoj64r8MKm zk7v%DIe?4(3n7T2h&Yb1QG}g0pUMwEa*oF+LdP*OhDhfT+JzAl0pKQEV5Dn@e)cJ% zttOJ&W*e-vMDynI<zi3VV_#Q5+iLNKi^Lq6za@ zGs^weD2z3bEjaS}34o-o> zxgrB=@=55bpa#2eR?+A53eA;p^BaQzjSyMl*b>KO%#F9K`_bzR041BCmKK~6|}TCA)quP zl|)K+CM$(f3Z?D3pw|Oy zlqMWHENz!nigowj&+uu}uwlr$JMW@t`>n9bV6_6HG0N8;3xqNZtIeevK;ppB)~jvC zxKOyCRMSw6N+B^|r6MzAD53Y#BAqb$K|`bS;A-b{2$ceAH4VfV%V3QzF z5EPg_2sMHA(E+0|D2NrNope<$W=a5BTM490oqBk?8v+UtA9omI$mMeBy9N>pGoG=O zm-iPUp)mx6G?f>^f7;@%CO}({Yw<7xhYPU21;)=mY&9_;jv(@99M`a39L8^>L$PrW zhiBek`ww5I{^RN7MvO%5cOb^(2c$og50w`8KXGstMOus(0LB;w*H`kw8;jX)^Co7! zvy|56I^tNPt@E+uBf+I-?8d}#Ly3jvPcOJAQ2yK_$TnZ<1hkc43&Na4qeFR3z&H&6 z=X1H~w$~W<8c3;V$qn&18OP+(C}f%YER9BKjk2D9tVYKg+8`*I^#8-L{o$|KwQD1~ zBSCMsLU+QlkB&=yLdB=qp@0NT9Dv)?A6?b>AGHXUQHnTB&O?DUTi|?O3aEm)3kxW_ z;W3$L`kBez9rA`&nMrCi)IK1 z{z|V3RM9=jGhc!6{cpJa%YNuSV+?BCxO9#bVE*wBOc;W3p6TQ`;e->?`@Vvtn6~;d zesT=E=byBR0=h3!hDbROONw0c03(Nn@l>LK957`#1fa2h|sp-@j6 zpacUv8|XIx<2cgSk-$rfPu1_)g#E8%;j2F_yyfDTpfhs)^mcrDFN#on>AgRVfvPMV zdI59}P*q>#tfD`m*FXU8*$Ia<@W)?{<1AP9fv!bV`U;T-in=n)HeF>8p!=U>5lCrfkXJSq|i6SrESCaSOxpP5O zv0(S{m{^k?HY|<*BAmZPSz7`h2H5(!w=mgG8W$W=Dq)g}06n$9djp=pq90ztOW|m) zzIz_mG<{4qgdeXN$px+5oV3qy+W&A5VV}0ELKPhKPuzTlMNKH;vV`_1u2&U!VC0FJ z(y>>%L~^F6!cClw-|ahj&`$~v%*$@v#vcJwr$R30RF9<5DgM1ELXrwH&*))De)xCD zsy=k*e};l=&hd_kyl@9h4onuzuc7HhuJEX`yF6li@Hx-7s6ht;vJ zP4Pd!d5l+P&*Y#T-oPRV0!82*1|c$4O^&;0B2rmq-2D##uD<;+-*1aiA;HKVtkf__ z5m-egqX@H-$y1N^kX~mS&A9CjSN@`_eR+ei25pLe06AP_3G6C)YjG(${l|k!M-ct zw-0!9U!e^_KHsnYtv~)2pPsmcEh9zmJMYl_(o1BTnm}t*SC=ESiVCdO$mPqaKIBlU z5Bet7S}LbiLIqrXkRLzm#y=AzOw~mY`1uR{{M*8{yL$%bKikW*4{ggS7amTuU_Q3H zo9_%AMqP6gf19&`J?k=r%9%C^7$s@{>=`qt+T4wg?)p8bbr`b|jK*5y%$OkYcX*S= zN{m;N+vYyznt9Xhe*P?h(O`^2L~2c7Txd2_vdF2Yv0BnS?KS|eJNY^v)^qfutwtNo zUK4xCqImYh5M`93OI4u1$AA1dJog+|A9oz=zdxq35+kMaUC;-L3l7j@4ANSpwal13 zo2-KD=AQmAV2$g)+cAO7jl~K@R?Ni)3XLQX3OiHM{iLJ6K|j7arLkX}KAa#3XuR|i zXRf9WO^KE6n)tdFKRv_y0IcQF=R26YDCUGi59W_AwsFF)&yWdX2%O`?O}xMw!9PEb zXl=<+kmHsWYkSe!qD6oeOTp?wxjmB*> z+NoHrX*%yhY!I+^`Y%u&9Som-7q&LXr}=;KtB-yG^MGCb`1Pzz3BN2T!=SOYqjU_d z@TVjQS}_LhGf%<%iB!Jz3Yqo}Y(7tRPy=}tFsZkjc*$bN^g^N&N2iqJ`ix&#bF#Yv zMz6(m{EE1HEuyoN%0X`b1A)X?i8X?tY^2i+T=TK(*Sh&j_9CQ=t_vtgkASpF5)5rF zAR)1=>iiO&Fu74Ycw7(GR${H>z~&7c@o)yAB+5h5N7j!lXike4v10LJ^zp}|o0^f4 z^pIQ}vm21sAdF4-g|wEJfvLe{eG9}&u-XehPrsF0Vg{c}6j?;nL%88`x>g99{`gNa z<61G!kL*Opij@GY+2|azYUxtvuuRZ@QWo~%2ua3|e-@0xUn_X;lU{^0oOHx@_`~yp zllJ&CnLuI#fz`r?Ap}CYuwSA`I3%h^F6jWQX8L`CqxW$d!=rx{OgUd5r1MZpVq`cHZFMP=V==bi6f@R%IICM_%fc+5^?pVZO{KQ+ zHrrsY`zc(1J$CWpQaEmrcRHzma9sm+xd!f>Go2lV?!@V1PNVteo3YlizHK=|Duzv; zp0?w*1=E@F`3!a+wg)s&I{sFpjD!F`hW!~oxq^#+JYBOh=S-MLZv7YJ7cVDhDyMSH zNH#24!)JOhn~P7eQZV|l#~_n&?TBNRoplxpxaFpsxMIqb5w-)rWkz6zOlRX=$1t=(V9O;YVF7KO z#)|iy09FaN;wQ8tg%`x`8u}<)7DzqRN?YEU(~A&>Q;s^B2WG^azW3vVfk+!}wLnOZ zL_#^6KVg1lP%6M$fs&G^UY2MrQBwGF8liQm08pT zpwbOY5~;oBVkAPj>!{jM%({IR?avhLWd-afpTN(5fo*sRb z>T|hq_vzHxa?HAo1WI5VH>2AMPI>j)1SZ4ihB4T{rYo4nd5D$wA`{{msf6kK3jlys z2b_SYsNr|Z>e(U~N+>LIdpGBRErzh+ouz0Y38dSU^`lkgC}Wv6EXH~QoO0DwY}mMw zb?eq~=DFuGZ0JzNwzi`4d1{`#2PFg>^%K;!ShCh))iUI|tFRbE1l?ys?T831d$3kH z&C{C-)+FXaaxYUR49jY1zX5m!r{0G>+~tDH ziZW6bB@J(W&_fh!&OG*X?s+Qa%zYlAtgIl(gwQCJO*H@)qtw1USR>hCyx^U=P5|sM z!EdAy8ewz_RZTPir8QE!(A<`5RSBaN-*5M&a15kmVJ8}R9D?j407R((Fs1Qbd>HZr zptVvXY7*Pj+o?ASY8xG)fB8E>*=c?gPMH%VWmSrgllraOxu~q$zATM&yB3W^T8Xd% zVI|TCgmurAE%p4QX2aH7!>?|`PQ42I*}~E>7@+;VCPG_{v6`xiYBsd5XJN;Db_^!c zIDTt4;hlLFvzU&27o!G`LMqSbUWO}E7=LAaY+ottw?xqjQltq<38NL}MYw##rL1VW zieUaa>g#*3N)o+3hb3d0IJCN*4KjB41+97Wg2Orc&tR8Tv3m7*e-SJFFhzg_UO@zlxe-FpW_d zk`-8Dj3P8Db+iqykND{U-nW5b`U?lLqQ|n+*fMt6+;aWdmN(zsE)|6De6NS=-x$OT zJ^kr#O|Rm{-%5UUxuA8VpF1P^X#!}KIyXtRE$8#Fkz_^nA3@~Flv%PF%Qi=z1BBGx ze=4?8f^_qrJK5yv)jP&pC^^lJ>=bmsDcRwC;!8acu2%RJoD$xMk2x^Zr7eyMtetQUB z|4`DK7aY2`V?rSd0wC2O1gZKZl;G1E#g1LcidQ5Egy8+bg%z|^15h5yDh3b$Mc1PD z1zv^T<;QUGA&RA43Soqgp-SX@!Tr0qa>u=r=7gXGp=?! zmj3Q;YWLX(ausZN>Iuf2cNsb>Sl7OenyMPK(NL2paen-L|4r!P&35AefS9EI23P;m zmFw8DYZ=XIDSEZTFB~l;=2O82zjM(_$z5OG%|SQq#A5vk(^oF!7_R|z&4-|&j71Bx zTy;|~N-8dVX&!g(JB}%5okf+9+5YRgxy{?=N;Fytpk@8bl3^srUsReK=~LRwyZyN4*! zTzJxX-1XI?N`t@VANKUvJI~NN(mpa@Tf&Ck;>gmEl|GwBZny7oka*$UEh-aTWg)Sd=t!HTz?1-J?XO$B{rrJg~TOB2o9Y5B+vcs z2$WGAa@^zCv12_53o3G&EjBm&`Qa>am*valhK}_Mx!>*rQ8!mSGoODv_MH?Jy3-Cj z@ZGb|W|v)d;b{eXYe|oaF`n6tk?7>!`g{M(8ilrsnoPt!9uK0FqOCLJ*gs@Bb5bwo zPri{kQzr4Ds6=YZtUq^i%haFn^isjpzmy?0j2&DC9ewDpwwALGUBkY+NN0naViTaC zi6-j4id?wQ8i~ya@>R#OO6`PMA5dA*iQKq?hKDbqcDGYlJLyDv4!((+4-bWMh1G8S zmt-;wx#)bin< zn|LI#*}W>C*z(Fqly_JnAf5@CR)twofHMCpP|{$$<|h;|1E~Ob_g(C*w_;bV8khl# z+7Cb*tmv!BZNR!|KSOM6W7Hr2%(U%qWY(zJO#ko} zSPKm4-+yDRgAW(?V-xi|CNA1*o-qFag5ZebA9E&x(wLa}Yf6nrLJEPGfgI^E)6icByoOXg4+1o}}ZM-%?ME{pfCnym~v0fxr&& z3H+RTVx5Ldl0o^vkjl_9q}pv0je)X}Zo`6ha7MBcvWl@IYh9>GCmMip8h}!? z)VDa>UTZ$yR`QQ;_|;dd6uLXs6hVQD1b~!^mX;Q8hiQVq+3xPD0B18XR`rK+3Xn$8 zQr+TLckQtTvV@?NR;5r%qg`m4{|ri648;YoJM9EF-U!!T3te3$?+B7)cg5|mf}ia; z4QnmEZ@taNM}AM)$dRBmZNI(;BPH49W->#D@Wp8-GWfJJ+3(PU+3&!=Q1?`w(}4Q) zKO1H+N)xo!d~N%cC%`h_f1|XIH5Zakq*uSGrot!O5ENA4Ak&Pok@G#EsHm5OIk$Of z!k&_UzF$Y&X;`sJvEoa`)SD6m+$|u@*=Fy5QD~zOh}5T{{Hial3-f8K(dZQ1BbB1L zrX`(srJ6YT3CYQmy2)e>cm8P$Mh)^ILhT|YMi(47amZXU~xQ$7P$`R;$}| zYr``SVtR2{a{;EtA(vWD*#qY~Z721BwJiIW(0%{Tv2ZbnENO1U!4+WIVD)w>&5#2Y z0VjWtuSRbcBNB^;!T=%kEbNaigZ|G3`VBzMnl)5aRTU6}cin}#>Z$?Xp#~_w;`3RI zY#+)8J8VU#?^jklPWKrgJB`StBzFu>4!RsE^s&$r{O z_ejyEDRkM-TbOkSSkvoX5LSVzaQ8;Rl8@oYiG5!F?=%456-w!EQ^-?Ag5EAYMvQ>l zZgZ)*Iy(!3GC}+aK|cf_xN9y)*U%|&E|?fhlj9c@n4W))eiBr>0Y-1!$e?ZCX2VCj zGOw|*A9A#B*8zeF?^xSj^h6n#xH5rZ+rBvL;?IEnRu0ZT->q0<#*{)DzoG-lSu?n);k+}i`2PLyZN&I>z${xIlaZx1VF#1Q`W%GEsEK7?O=yqcT4 z-zSUVGBuI!WZO7u*CCwzi67dhMXX_X(Q0;UHN1x6<-`rX&5l<4pIi;sHt???0Nyy#^O^sTdWOSLPl^Hauc9z25rN1d#3bTHGlbbH&hRD+p&K3 zGwfAY{o7F5@==Sq>6*d5?-rvWF0Y`xr@qDhb*;TyhR?nmq9HPuRG8 z8kJKn0U*=WMpac+>iiNN9Rvn44Ru&!D9e`7bpH8d%WE)N^ZD(!I!yjHdlg3CdKjiv zSgXBI2|{>p(|&x>0RW#-Dm+vua-$m1~Qq%Rc0#V4#X!_9q zycshv1_p1}2MV0fV1f-W%F&_E?U2;J_H}Y0Vd_1%G?`8+3Hkr)kGVHif|EP*dTCZv6&y+uC$; zm9cc+bvGu`R8PH}jL%Ik7B0k8HV_VPMgVQUT+Pr?8wv!i9ZnpN7k4nyq#wc~tRz%c zlX<6y@UuJzayhV(gR_$n&C~hA=cjtqnZur6GVVV1thpBU)bzd+qOsIY7)cH=8vgp> znfzDf_59B>=VJnkkzlmNe*QUDN>*->#B+T{7-bnYC~(Z@NoR#DKzXH=Xde&1xLLA& zMG_bH&e6vt!DE|%LO=9SfoYFE+V!=irJrVy9to7SXQk_m*N_sXFFqIM7p6Ff*78;` zaNmkw6Mo!8eftLDwvCuLrhHI6k+kfb7d+9~Ot!ohC7q-B$zPw%p{L%#h~@^8oNj0B zJ_M;Pr|vwM>z-Y~pqfl7e7+Wn?c1M1p#zQjLPA#``mHL8;}=1p4N!ZkB{Os-wWn$} zOx2iPNp5FN*%p%Szm(E{5*E$2wiYRF7AyNefvxVJ7$gA{8A(vyict`+x|9qgn@`fj zs(n+qr;(x7fCP3o`j8q>R|EwU<%fpT!+N-Ho0olL`Un!gU)zT((;WVu?SUPizF4rOQD? z^t|^zS*3ppW^HC-F?N6YR zU(wDf{C@FdpO`~)$++LJN6j^`yC!-kL=#Yr-&22FIqU>US7l-gx5m_>6&QMkGKe@0~}%Ux)6+$>X;o+p&i3g`X1yA-T=RvT?yLy?RQK*bS!z$w^gOT8ktC?qSS8SFRO)?CLUD-zFdhftXLvc<3S6X(w#H*Uf`<8Jg2m`>QpDY{$kBR8=FMc#Ld)eLYuRc_qu2FHezlvM3>k z5E3axzYIO2MvY?DtXb%F>j?hx7x?+lvFDy!fYNSa^^a z0q-n&oqTtmiOt*4Ji3Ohw_U=^uWjz3!~x*`1t--u;@GKnzrKfTO%*|PJ+`a@{ouoN zeX*3GPdIsaJoYML%M-Dm*cGrk^LNpT@U-?-7A zcpU+Eb#+0Nhf){)iHbIobB0O|t}PZ`0{e`_{#0P&K2T^Vto+6GKl6-xcIKIz6acQg zH<^-*Lz`eaQG|q))(L>6+aExjtK{(&_3V-zOsF+8x<|7Ah#FRISdS2Gm{4=X8F%_n zvqDPENf-YX&`{AphbrT`S2m(7sPYO_f@Sy`0gxOi6xt|M;MMd%Vz2e9?-b#n-~&LR z0ZhAQ-K7ewqH-5ScDyA2h9v*GEX3c7=syXUDo_6;JO2V_t6O~i$s!c^`9oqUs^7rs z(@vw|$}7>!m-~oIf&Y;G>rbwkQKMKiYnD@h`a)@?DlmG&^hrvt(ZChXug?>9k5mKHo{#g}pZ=RPoUcfJB9!E=M2Gr-A^ZGel zJn3TEzpRZA+>#gP=A%! zYXvsyGyVYHJld4@moWN(haz41UACluO#mqE9CvN6%;wRFBU!w@lkQ$H%JRvIPg&4d z!}vHtNX0V`p2NYX-r;CdY6oSOhSy(zoxOjwh_JJgOh<&#me3ePT_rZ3@2>_IgRa65 zvwl4#P-v@A_*MT00z1?*;#7gXp;VJ1P^k%EVx8Lf`F9jlO1hpd(0_u3pco(FfmDsB zzr__djb_;zk-~Np4L7+L(jjL>@>yxdG?(-D+uz}H&LGLEZ9J5{FaMP=f3g`!6(t4j z3#E08@6v4d%gt9L7ywwe4*S$o*xT>Go^hH_aG9+7vfs+z7s`ro>9UgSr>j>q(6wzl z)zM%&%bVEHRl)ks4aD_5w5_Z~3Y$6s!Jwijm3St0nP+RxJd+K}mXrNr4c16{2M=ZN zlqpzikx@i0E6~E30G+q5XHafvKe`T8-oLkKBanBas2R^>{WRp?2*B~ z9U=+I5jxxK>$s0FN1O0g&Vy zv_`nycmIk8;7x!>m$fl2FeoXRA7qg}-TU$t8(1V2+44FLo_sq}YlKuNsZq+sd{{_DH) z7n>jk$ZpuMiL9_+qdo;ez-OO*hB^Eg>? z9k-Khe7A-hwty9pOI*;`+n-#Oaal~;Iwa?$mT3fc+y4Difl$ z3s zx$^t9YZSq!y}b9|up_Gr9MOmIzwWsFOgL$rqDL0t*b$hb%}dkw_jqMB3 zLYSpMX~nk(OTOLE$L62ynZK)uko!P+4SljQ7c;F_8NbR2XcT1po_i8V?^g%_<)OIB zCPG&@##aU<-G37l+xm$x*yGq+P*U^u(^smmd}5Ky(lj$}~=V?&1KlCU3XCRSOLl{L-Q>a(&Y z_PZI@1l^s4Kf0Wjqgn=r(k5F?i=nhuI{?PowFJG5v{w56cT*OT$@1|d6R5B6Mr&BJ zK1YMK)Yo;py0t}hTVRP>#bQY?xPegT3A{ZEP(FBw+cgG+VMq`Jl#LlnreUb_8vvE( z)ziDP%ga}Y@s?q2u3$qOiA7-&53O~XbvL|F4wLhQ6NVG)*Pb%|qi>!Bz=#^ZuihA} z3Ej$XL#!>d@t6wOW{|?#mXx@XdTDj5)d4L@yBszlA;6(~!_F(=;5x-o^({rjDdAH| zaF>K(3I=}#6q!Cy=F?7hA*DDXXl-??vQ)Z zkV-RbNUc-ty^1fjPdD#11DB4=aNN1~GJ50?4<#R<{r_%O-(o1Vktj6ba0xYi%GW5D zqKv}$8{=IdQjziXhXX*Nli0uU^(QN{!mWWB6%n=!@lgj+zzrnM?L@#S<^BOkE3A&F z0V>O<^0VKbg!UWkl6^K>JE5wLcB$x%&q(bvR$FWN!;M!GFtf)JnNqZ$qJa8KV1XqF zK$BuQdnVV=+cJ!$U%baIQ+L^PR#GUyD~qUU-6#FwiVEDHUikY8e^T_j z6dI;t7aEfW7q8JyiegGS@b`U=A`GFj63WY=y3YO77|`Q^{(Vqvea_@)-o$qUl^Hnz60rBmz?x2vOpDyve#>H%QYjKJx!>-u+Z8HEsDH{1 z44iEr7w|&d>?ZY7yW7&(DZXhhX==0W)U?JEE`#%b~8r=VR6MGhKW$_Kb<4t zGNGPydFhO#Vlk<|NQel3M#(+UaQ7nKo7+t7V8srtu%UmJ-Ax=>V0FjrOUL*9!cEXu zXXH)JG1s>7^J9i^{=q|v%9obg)H{?hTyWm$p!2TMOxEwDbn)A-@SUf}4Zr?~U%v#a z+n^%n+AS0XD7oLDm88uUNeXRY$Yo){1A|IxF+hXXn6+zZ_W+)O&V=YD+}wBYNas(V z1epo$e;3MsSUw<{H1qMpCB=17D(?;RPNz<_vt&@?CJFn*tB#~SN)b&6rHF(;N8My{ zRV@C=pU7p(fC5ZA`DY(wytfizCdc;Ld90Jv$gt5{o$^=5-M4&0+nfHE1B z2}}O}Olix5Q@i241>-mBhq>;qSGnz?TVdiZkj<2&#r}$8d^Vf?kFxR(GTr2ATlwc| z&Gutz{_XNo=DF;$DSqI6R#~n5jz^V7SX_wJ?<({-i>ID?g1xqc?MK7hFW`#}79W-O zD~)GK&0*evi9C_QdHUd|GTPta$qvU3_}tS5k)XZ#JI*qS6#Dt{o$y{u`MFJBIN1F@PLU9TxH2Hz+Ph;hp` zV?t=Rba(}gF_PAwZUZ<^hmX`LAe_fErmKR@)mXeCP zI>^oKA-|1{jl?^EVl6rD-TNp#^-qXh_OODl4aS7v6n7EnPVhXBYmca9;ADHl#x`5k z#jX;ic*uaies@lheMd_Vj?6K9ai-=@i5Aem8-&qBB+yp^j%X+7RR8+Jyl}g$2WyvJJ zpRiB#yv6yj(@;ZcA$+v}+LOjMfeGQ!>2hPC@|PET8Mdfng$=#F#$c2}Em>y0!_J8m z0!TzTV_@xuWHdlY z#}lcHA+8l-(V`wu*oc+Zk7F=2wQaD9uUr``5wOL^09iL5-LD@yCns8Z8DpZH4{Hb- zkn1v(U8j8}J@E7bqa|KWUz>U7wv~=jOGRb5($#o{Oq1pWuE=UbrLFB}Ti>8E+8-g( zCEue+K>Gc0?JuLd8&<7q%;vUqn4CaZl9@2{u7iL_6AAkD?@xx^(?kA^)+CoMbu|GU zTXHw~l~NMdfY62l^6}|T001BWNklThXU{8#BmLo2GnOE+d z3S+jirq<>+zvs(qNc@P2mt)pEkLhiIf151c1QYnNhRVI>2f|RXWD7uoQf)uqE5q~DEiKo)LR<62lVB^4!mN^o-@Hce^6HNEGuqP}K3TzrF`)WlZhoVUvuF9-F-oU_Jb|_JjAMmXuBvTVE?$R&ZV;qB+~EM^!mw!jJnI3PB*b)z4?N5Q&SJ5wKCs1M?MrM<`NISnjED$B(K2#pg)$&Bl4pVp zKD|JNKpZ;=g!TGBlDp%M_*;#H>YDWI@0^SxC5Y{rz<)o-#^|Lj?`EXLtF9(@`gE2o zSwclcMFgztP1dyY@EalMIOGr-!dU($lt117Zs75}tmr_d{MuBA(o$j*CzA88f6?~9 z!_0X06Q=Kc41spUAllWLSLtJ2c|Olv^g5h0*=7uC*scFe{Vm6jSFYq|)rY_2vhG@cLs#itUwR`|k1P zR0@+yp_3^KPztLSccsulk{lt4yH4=HCRFXQ2bD#I95Ti*d#T}@`G!Pb@U_8Lc8@88 zQ3fvnI^23vrK{RT<<)&3)7}n&rG$!N;BE#A1xOtaUU?qKJdBBhk;tz*dF-HoiQB+? z`RDM%tb6#!{>O6lTLA~}QiL%9UM!!sze2yW>=H3jewiKs;-10yF{|_$vG7bRe9}?D z1#W2+pxA%udJ2OS*KAe8jpGiZ#j7UQdv;?rKg|HfKyIEwYJ)*f%6pWR4N+m z*FE^4U1Eh12q}qIRPgQj=UWRPzW@HP%{Ih@BxlML_GJ?)?WT&hBZ72^&6zVX z)2CzF+Tag=!1D}a1{o3s3z_z9r<<9SJK8-}SO8^jQlV57`pg{t$;+eQ%{Mo_gzl=?U)Js)uT+y|&0b0QCYaVR-Lu)ei`!w*?S5CjYyn8RCd zgHk8h$0BhfV8*iIy(`yTV z0GN%SHvTH*4+ns#VKFH3_}D*;(Ul2Gi?-#5_I3Q&zMctX-2~92>(tvSQlXzhbJ({p z(SOz}q@2mBGH0$ZopZ<#T2m>j#36rPsPsXANhU2YDg3Of3lpSJN!N)=L~af7IG6hG~JNAA#m_lz~rp=kD$EW6|uVlnl#Z#B!KRE zdFz=xwbNSu_1>|>_ci?K=zxZH#no?>@#&-QV~k~$ZE0y?X)H$Ng%{dNG!BXya?zE) z^%lyHbK+&6IIxe3KtKKa7V+#|PrxZjgp#DBAdrHgYMzRUtOm_Zy+`neChfrIrYp zgVBA+%W2tU`*)XL449E4ZEnrW|G{|HVr_WmJz93zi9X$++=b)DQ8acexdR8HwdMNL z&H~u@`s-*RDA{knv<2WMvz)3b%4W=POMu2kMIZKMMEmU-Fq;W@3!eH5} z4Q2HWh#G|NTVgnm(T%gV=+q3IR~|5NdzP* zeEV(8#*K6wb~w7dt;gVHq$ECM2rFmJqG1wTa>yktYhUI7TY}R~l0&8^d2HW+Kiwgy zKTvV@f09fsTFmt?ZHrWr!KH)w=;n`DKpF~bq|C~CGpQs&Zc(IkY0gRIfIJeC2|M!( zK}uQ}`M>+-GqD+N{p4rFiYKV}<0;mvat_zfSGUUA15#4(;Hya^eZ0IQ@vl7$dpm**-{lg>|w@3x@04 zw=Xx{bQ6nO76BHGXiP>mscnX!w;p6Igsx_EuEBiyE-j;Wr7Q!=Jap>RUZMOtnWW{F zSI|K~&83%SMFGO+AA86lZV4bItx{5W)|rTd55q|3yfNvc)-D=A+KZk@N^&M>E;}Q} z(hY{a27bxJF)wn}+h;SkX%NFI7IWJHw{X{|$MT;a_evKaQ82g?-v0~icEX?kw}pQ8 zreD7=Z9)O~_#D5*A6VVFns-)wz?oa0LS=qsj}8R8h9{6wRiwRUy~?=RuSRRuOekoC z<(45?h(&UlZNc={m~v&;eGc!hl?^v(ZR6E;{bk%|U@ATI{&oNeXSDa)-s8Tt_tBJW zvJmR5nO`7G1}m{ihe;xfD}=*_?-``Ptr^4he7K1MXV3IG^&Ow} zP5E3iy^N_vOSyimiHJj$Nt2>R;k``As{>$ZV=NnV2=`UWnd<2QKuD|nDG`v80pAwD zSzDK}!@2~M_CFNU(16a*&+5Z)={I}9Db&rmm|*GBtY_$sy^o&FL2+}23}Gf8qV?ah zp!a0ZJvE{>R) z1MOI;GpOhTWBcD+FPM3mqB4YXYu)?vLze{ka`?6`h5)YYS< z^-_}&v-aGm8_Vzm*z0Zn06Amv3GlQfbMSQNbygY9r;G|VfyD2$9oVW{d8zefKHm5d z1%4s@3;L&_)UMJ{lm% zZ3I$KRa{1(gtG($L0*dGeRI*f?}jlR;es%;sH)bQK|p?IE0h64WCpqqV9Ys7IqCCL`5P@g zo~}ELlWyle&~(>m@)hU+Obk+8PAN*kPl8qu#6Si1Jjc~~CkAZ+1m~U1B|ltZiIV+{ zCJ%4)3$(hcF7F9Hty#YwxqLazW5)DA-a+>B?|MF)WJ7Mc82XNfRjXD}e^h<1V(|Ts zJ<)yParpOhXf3Q^%fXZB`IPQy4w(UKTdd3^NFO`w`^|XwV=4+PV^yZlBJ9K3op;_O zT=v)WU;iab(y(O>nl#EV6LA7bT6upzAQo|&Yu;dws%e)os)u!%N?5VtSWrns?aJY$sm+>WBgnd?(u z{(HvL`qc0Dg&nwxeZGHgI|}o|^oMK+u-2N^whrRYJj1&|9oIbc1J_i3OJT0h<*WO1 zX1_KjOxS^g+9pGt8wA6_P-{qNkg%lx9Xy{uiYuRK=4t;G0(?$exeM0~U(BJq)v^7f z9i+kP;fsfzkjwb%uF7t2jb(Or>+L{Gf*^zuOOkL3{&Lrs7~#{INYXH@fPKDwgC&O^ z!;Poyo_+gUu?17^1TMGYsP6=Q66gxh_jHrtb?dsdf4aSL`}YF{i4`k)3@G7u9+{Cn z@BOdsSNvO{z@xh0kpuq5y)kG+GQW>zevP8BkIgv`tM;ZLpuz$+v|!r9y|BuO|r9%jq85E2WqP<1lSnE-~T$oLQ)ls7*e*`wc!s715SUXgV&!L!^8^@ zA^H70Od`P%wRQBVDdUarySTQ>Bc2~4z>m_ZLrC(n> zLn!gRp8!x?oPPhyZ>grL=~DhuQB7%S>1N-*vC-CsIAX6l*Z@PVqTDoo1;)VH(oM{kE$UV$+X+;R&>3i`OB9j2uP z`Tl!&JMIMi>R7mN;r}n~_nV-=Ngx-E-_*#ETFDl36?^4K7PJax4wSq%B49&~%juV{ zIh24?@1kJ2f$5@@X{D6X=AjqnXz z<25#?EDl`hUWGmi<9Hr{)I28t5AXZo6nyp`v6dEeR~NbE<#b8dRT@6oemf{hLwZ9b zWNncLf###7Q!w+&DgE#*XlsW=7pANfsbd_GNb=vdF|?*UYWCO>;&D1sid0vM_z!c) zTs5_Hx{_YnI@ppzanvsL7-P6|+I;ZH@Z)I8i}SLOmf`y^Z<5GWOIeoMbY6e>{?Ss( zKzl+sD6popvop(C=XoAVDM}kxqJtDBNI_+lLjnROgOyiXxN&$4%auhX+Z?$}LvaHn zVaCEPYWLrdegFMDL;Ke-^!NL4^8-KFDDs>|Ad+|;@ixaW1#s z_66qyYYPq6x2)pmV#QXu3KMgj4_a9GaLlEJtAIJlfP1%VBQ)|!U%e+H2x*c=oXz^m5e zOpvyI-bO`Hkzl(f$<|X8hkYoS*H7|ggW!t>!Sd3;R=;(mjwo!cd6y%dXw`JJ8cJ#c zVtFBtdYVfu;?(nmP2&37I;zT22tQ$Y@3bT(ptR;zN>pAk=Z?!kYPj{y4n)e? z#BN1l6Nl0vO%HhCvlVD<tpDa+WX4GY&R zZfa7DFBTluM^PCMFrJfN5zw3rc&1tKd~-l2g0W=d0CM)+o3fH(;-j}uD`7|~>)I?n zZXYW0a*6M>n^SHHI`_A=UoXlZ9Yqp?uFXS%HIQ?lBzQ~Ul}r3BC5byF`IiO+wTk?O zg55U=cAYI*mm`@~r}$*BVD)waT=uZ%SWP=R73OXq*2U?(d>?YFUL!ZBmjQq@tEzes zJa09yoG@GK-fwQCIg!I&4gbf|)!OIKO(!YZc4astCr5 z2oTC}z-8+kFP&X-2%#N8rD0%goDc6^$c6vtA6XUF%CX5vzVEw`XNJI~?Chljffob> zfVvbs&#~f$*?L)Y?7hg3v2`EYc7V3TD25HLNaM!FUz?s5Q#K3=z?Ay|7~L0Uym2hX z!0|^7Lyx==trU|7NG30mytZEQ@kYUfa=}5*`5-)AJvQKprhw&LE-ahlI1Pcq>n9^8 z`~kDE4SWx=aFLA?b#+;;MIi_t`X?qg&qj`7KEdqo@XJamzGgD=;_h?Ar~m}{%8{?)Ov~O5Kt?SKU$tTR6w83BnPhzIPh!1@}G-%@x!pCEsIU; z+mlH)J%xAPb>u8sNXqlb>D#^YvRPF#uQx9G&>7^iSHp`eZ5@o%ihTw?%iD{O?Dcx3 zE$GIE*Q^Eb=R<$w+<)wVG1@u}>xUzv(GUY9C4tnWM5z2aD!?ISIvdQE zPY<)fY*Gj$sT#Q*udONJQ-3(ge)V`-F=KIzWy40Y?T!-BVv~2c;cjwD4Qu{*1l9k3 z8OHi>bSt@Uzrj;gNAmF!!G^pzB9OfG-FM8~q7S?0XjCeJNO|PNeRdl%kahFEAm;Z+ z1kw!v={3DjnmtEY%tJDz_;%?Al+x_ERW&;gEyozcCqJx>l5Yqk^EVEoy6F<+%B40` zCL~%4o>+QpMqEAQw+o{4oM13>`II+;nb!JHHfKahLo60^Fjt8CptWb045?I<5$DMa zR^o2`zsd6Mz4ZUw8}DZL*dmy-(1Nr=uvTDe@|jc$x%b{#6kRAqd_+BOebd1hK%=Nf zaQkeZ^R^bOP6_H?1$A6IMhog*fMq+_IDEJSk=j0g^4^E=E2>Z{S2*96P4zWeVG0Xv z8SnqTib-~5pdGAi+21*Y|`1 z8zG60aljWX$o->)>J+L`;-!-0x`u0s74li_&djddm6lO^!5h~AI}^sXBKavsx?Dw2QlIrJTZR9)9N_XZnPzCqqPIt?ha%WE>821j4dP+O40pqgAr&U(F5v z0o>jIm1TwnE)BY>!LUXdRtiI`(2!Dw=BuxwV9oca_6}B0IEa>Q_k!STZk`Pn9_}Mk zT}f=#(Jm%g>#4 zX#ExjgE6q*{ASp?7NI2%E|x6Z%H|^!d4eAf3K;b-9|Dh`PHCrfO~C5Fp)oy+nAAZ0 zgro6y*a?OXv-tj0%2@yjUOg=h z1#Z~)aS%zCym3-w0hAun4GJuQ)O1bG9szQt#IFnR`v>SJ0%G3@+R5kVsGQqm9pFGdw^8*j( zz_&HZcu{4ei1#3a1HoYEbIpxZ_c5$K;vj0KzCp6hgO8d4X_psLN9C^qp$Uw!-fp3| z;AjX^AMjpc3uNvfwr!h1?%2M3^_C6kDU){a&0f+%Agw>7Zy#I6efhc$KK@}H)_tKP zs{yHLX|AQDB<*$H|B|(sARrZJKAuw5m}qq@&u-{D-GDf(75lu{QSpDIqv#Z?6H3}Fa7sj1R$kg1_2VuKE(mYlnd%} z0?fs>0?+Y5z#jR6hnfQZz0QGpjD_NM+;%rbef#1YL-K=n$s4zC)K21y&oNSwckyM> zXB|&GNYObL;CUXcV|O6=uKZ2yw>c;!xrGH1)3 z__}&GR^`{xNiJS81wlZLOrlF|NpPJ5u`?uQv0yjxKm-LHAKbHfR@R{k=2#y>Y`MKY zOjC^q0e`#Ucz&$i8YLAY7Jh{<64}>xg@6!+65;yMDz(v?Gj18hcEdMv_7RJ@_r-c9 z-q3(C+E%YI24WW4?8h}R&*dI@r19i3L|FB<Pcs@ zpbbeOIeD*P7-P8Vx$p2i>+G~)Kx;7&qya6VUoLCF|05pW@nT+j)he+-Qr|~#O0i(4d||8asK7-5 zEG2mVT*39l0sGbnZfI5n&1obaKyup4w0!X?rOoTeKjIkMR-xRxc5A=?Zq|SCF=}lS zrI-B;t@Uqizs*5`5eWzqn}-7D0&$TdSuudcE%nSV-J0(X*@2dLAB6UZOGSUB(JF~7 z#?n(M-+9jMI^?&ovTo{nUkJ7qYi;axU|mG5)cty66v@sGiu;t>KsXl7Wt8FPHGR0~ zfjYF(6!o!W4N5Dt)C9?P>ju=>P|CjLInEUOWhkiad5yrQyu^`8C~S!;g{4DN7W*R& z%v=LsUhpou$w8sD1`-Hq=vPzhvgMRp2DnsKVQ0km78GGrU~%;(?htVS$v`5tp|mI` z%adHJV!ZNoBgPnN%JMN9hi|YBL#^%dr#qCit|~?>*`J2$*sps3L||#X3kzZ>2~zrz z_d2@5vuoH`-+pK*@f?k~1_&&DT1{CDDg7ufBc0M~qJ*t*fK$ri1t7_ZCk^9-Lq?Fi zLE%>V!(07*naR2naR&`3qGb$ohT)#GWafDKz#aN;R1aq6G<-j5dd-5etBbeqEB-( zc{}Zve(%1u5Tv4ZEdKq`#Jjr4Ip}aJr&^N;5Gf?1H!92rw zUgAVd$u5x0w+;l7WMdC|+o6*Kd-?R25rEDQgjHH18F3W}+LV)~u-a1V4}L|hpTnjx`e__xFgG|=?bd0DeeL&H+u zXHUlS9`on-?=cIZv!SFHKio_rDM=;+5=lu%GT`5r_e(P&DMb(jB$G+Doj9=vEP3~a z|3D&0L(v1>3lzOOG?1u|u6k@db`Fo;anK|mb>mhirASS0nKC&O6gx{7bs&(3nrO_iV93l&L*#KY-~gVgELrhqcTX+rR2ISxG=LX zvslAt(>4KRE>zY^K;n6lSWHrqFF5g-o>0`FIK~~ZJ8^G|<#z^N;aOG&ALYhr&K&pMRen${0CvB*qx_+wn&*hL>&~K^W<@C&qcdos-DG z(&dfhjr;-gRXG=2^&HDyn*psYtlN4^Dn<|Gs^?a6?zvkK1S)b++M_MuHEr7Ys1CUK zMB9u?8-(=eTUAcX&+h+HVL0o8kTlf#N1nRU(t$tlcnC~M6U*A8aeypraSP{M4bQK> zqM+CQD;lLR`5D-PD72V;T=T{>9{zj<8;-q<;{DEJ(BUIlpA@{Z_$?YcSE6Jx>MLn_ zY5xbNAxX0Wcb7k-WHutUoBphrHjNv9DCF@ghj8-A<4DdPfJt_7=)fVARhRMZq9m8q zHln1aD-fJ;*fzxD9w$v0!}Jdq^7I}5fDHlH-L_|V`v}IaTu9Nw0b1QPvu1eQG6X~idX=)@F$9D1H+-|I_S?{m1EA$v+OLHw~?FK~+U~%I&6b{<1 z+u&!S0inmgjORb=r*Z5;oT6AM-?px_(F|=X{VHXTAq+Nx!n*wMhLQ$I!1qr#(9qBj z-SgEuw!#?0r?Xqoh6o;Pk!R_@3-WzFe!CS@e*>%j>rwLT)08EWsE&Y~&kJZw8vdTw z!cj~2q%CC-L4Z&o0!b>Bq@lr;Q*#oudZYD!B&EGatlOY1wPDd(dvBo(_2sTMqT8C* zJ4IJS{DMbpc$OUB@Ob<<0_COoB&DIY()*wKuRD&w^BT|+MgeN=8a};!CLfQFGydp0 zF5Y$mYZG~_>`ZX)+{akez6>F{2)rQTX9)Y>clXy${xVsCi+9@{Q&dRXOE0C#S)Km) z4GjQX|L$bu_?w6~uO+Xo4V_AnQ(Q#5_SmK?;Ent}X_X#9GT^EI%;A9D2lJ1|K4(xv zIbbcjKxkGrr5u=u3`I9tPHmeMrVxRqpTQFN~)#G}tH6vE9 zrn0&^TGNL!p8a0txsJ$8v{S&;yzgPxU3r$7|e~=Lu(_n zNn7Jxiio5$f`iH+UBwuQS6fg1eXk&IJ_e6G_Njb~V@HLN4ExM};zNwlsDg21QksVY z$oievJ1YF1gU`1Mx*}ftG*fQ~1vXTa#kuCbc`WW6$E}AQNlDv6I%dqoA5lrk9-~+@ zeI`?NCCLTt1VO;T2ao2|Q+J`LD4!pHY~;1q<}iIa)?|-(^lcO*^Eos3K&ER>NQGSn zfMq#$%5N#qVUNU(EFNFR_O%Bw@vb|$ulAC3*=$ED6Um=8mZvf7Kht~vWrw0g=mx>p zhCQWX(VGFU&ij!OC(L8)s2r;E2lC*a6ItEq@!W#xeA+aJm2Hax*(RVWkS;a>}vQHuX3`QbD z-!hMTt{8*@Jf$24K{{65o->Em-39<{2LPE1{tzE;hkVrIZLnUtH6%}vFNe9%_AAaDb7t>4*#4xmp}$wuA^3wJakys!PYa_W5kX;`rdGAsy!yZp3iX=4diqsxOe?7Tz7ma-#qy}T|yEB z0Vkil3$eK2vdf?4%FBPx!3S^4_16PZN70Tj3es!%P}_PCCJK)d5t^tlYU1e5r84Z) z+{SylkYz2i7@fPq!LUgW05ZL{PAbJ!QgXhO3=%f5_e)S>5Ycah{XaxX`u!}KagAWo z;7%^SY8_>LKBs?C0hf(FhYRF5R&;ngHvf56b~IZ*1GqvU*1_s|9tD#pV_I4;OO|5t z3y4jbLec8gbe?k#fvaX6vNE?Gbt+U=@=8;jEsHzxrQ*GcofucXf{j0IVBg^bY3N(R zMW^nxs6ZhDEx53;?l0QwTqi^4IHfN$s^UP~2IsFg)3G+ZOhJQT0jMI*+ zqbT2xCXmwehJ*%OPblWAQv;^GDo7;-o(VYZ)ZU?(nQ_QaF$$P%77}mL zC75Slu~gOJ_uLYo_|i+^sG}_X@exPZb(9JVAg0-O%)<|-&!vR&a>}l}lBVsNY1shH z8$#d>(QFsdkY}9Bu(o>2gLQ5IlIbFh=>ec86gATX4|(zF0B@H#ro`YKo{N4U0iHEbqcd$u}R}!BK;^=gN^eh-4BWV)W^g&-0&t!p5PW z^4jYjNBzO^2uQ2I%B|0Z+;kF=kZB))kY3~|Rm!dLwN-4XG%-)ISHHtB+TiQAU5wn% zpq2L`3*bSiXcmIoq~xDM^3oDPBHxm^DlJgjQmJVjpd77Qd7k9T4c5Jx+5h=Ma*z~! z^liYy4+$>1L=f{jFlI72e!$?8zFfckqjbt5Ui|n)cn@0z$c4JKP?-7iG5hR;nf6~y zL4kz@zw-_{k%$U|g#F+A?hIZkK7h|w3D)U6v{Zcb-#N^wD`sR&@$wsUIr*qDy#B$@ zwoLjLOYvhKZ+*Oo%q?u=yj(b9U(0d$^1Ex0!f^C~HJo^GEd{w=5Baf6fL@@O$NnMU z^G^lIWWXsW{1TKmJ=0(yarB9FOum?(Is=9w$+`LORAeZ>F=$(#QUft~SyTo#X0oD`U<(_@wu4(gm<(f6* z$BPJ5ie;-BY3NtmYx}MG?^aY*l@THt-@R`n;qoUt9O`C&moe%4K8qLUv)y)Uxp40S zq-oLj6kxnnzwyG_zb|XqH*`kkR=5^5YL5QVymH<#V zd`tX?pJl}RCsVfPW2n5m3{%j3PiyOy2g@b5Y#Ds=DQ36bvV}(o%u`QgDSv3LOW=pw zmQ&xio;1dL6T7yItKk~k_kE7q<|p(xcmKdak%R7v@0I{2`~8)+@pQivcsGez*#bt` zS} z%~kBOO^ifJM<%{ibfOtQ{W;NjVSbEH-tGXbM?VN0=}2J9QCY>;2q6gq!9x#z#ChkA zr+!cobLTelpO?RO1As;v&skX3MBkhRV2p{({SZhN!ltbiZGWe;GezCN4>)YshxqLC zT?tC96EL(Alrm8`EmsKc&*(p?1*wdsS{9{xX8*-W%U=+%SW2c81pI!IV6R<#j2VH@ z6KU*>@zne`cz@L_7PS6|3_94NVo16$ON4T@tjM`#WteTZ#k93!KK%r9s zA6Xiq?1K&238^`9?_mrZRKa!ket=XOv_*qzZGmm6l;n;_KEwA66{WT`*<({za`3)I zbS5Mr*~^ZjO8MaH^%3$@E5kO!3i)Ve3t`?!QDK~$r~FJDiDlVQY4U~0)YT&6C=e=x zl~!9)%Cc<-z%{pE)~t#Y)9dOYzq5nXfeL@}>BMv~CLWJWU$lbSdTQ=}0u98Z#H3Pi z&plSix8EKUi&?JxDN`_?eby67>@ePgZyRh`RofQ#>Mc(nv!8!x*-+;EeGaMc{vr)U z?rqH&E&;l~f9w2DDc@q}^uV^M0Vs3!2Jk#K9Q`bOqw!M#zq{`YR<^gHq>8HOgutC8 zsZ>V2d4X1%yupL{?4ytP@ULGmq<;ym9YLC~HLT6&&ckf8Fb!B~Lq$mrw@#Z6SR|i? zB1@<6iXaHjB|^ZHPkqYMPk)UNl0>4Dp+o!G0U*#w8FNc5>^i@<_r_WPm@sD|ZNAzi zczOU)(r|PCySZfPImG_YnMAV4CJF@;1q;16#0Pe+_mO-*=LTtRZ# zGJ^JYN3JVZ}9tEMD1Z2W+Wq3A4aK$-^{mX%NCOU`xZ$0Y%Jt{%m&Vyr>Un*!^ody$SLV@pp0BWis zHy3aDa%gRZfdkVhwr)^hq+?b6|ML7nFZY)UeCs6gJe#-#f|xHE(x>P9SJ&>&jq(bF zktl?V`-idP^sbCTBP||4Yc!G9d@-U{*_J?sEU}JLvvMcI_j#`a2@WkZd95W%|SZ(`Q0g)m7nBDEUB$Lly zsS-;l0+7%M?Nd_TNaS=hV z5shSEX>C+AwY&UCuzs$7{TxJ1eYZod@@yv3RHo*5Z`_Xhpy4gg<)| z_OVE@ptBGA4VcSGqh7X(Vgk_ZXya3PdK0vz?NOa!T4u_@raE}nd$4_%@xZH2UxiO* z1!9esNvif4W(SnO?fD>QHT8J@O~I%`+(f2gl^=MZEdok*zM{%_#?14~&nPKjhi4nJ z?@jg>BM5DHF3Ez`u3da5ZzczD(S40PIp`B|ea&&-Z_5okxAJal9UsmQ^BFpT0JeGx zems#-C=HMIynna9H@8=2wtq$+^cYFI>x6?+GwY$O`>9!{vp5!Gh*HD`O-bifB;8SU z`;mM8*|YyoUDYdWy>8gB9?xIiFcbz3hF4z1R5<2drO+mU)ZZhu#?!;mGS?+~DfEUm z)M;m6mMx>z<}mutH31ZrT;w$Q(@Hz+WG?^|b)k{G4&MbJAG_=OkH zz?7>8TftKy+RP%7w9YU+WV&vANU?R#-@XK(A>;lbrBMjw#W_qe?;ApTXE`YEm@#9r zI`QSDG1hgolUro@@8p_D5T8LG7T|x*L?*L3)J}OncDE&#hPP z?yk4-@v5t?1Ux2Rw^v4Z(#f(`QHt^tS3J{e|M%;xh zJc&N}IE*m_U7GdJ9f2PN6dgMc;xVLB=oel_U3f04ehBJ`M>*!a@jUg+B)-@ZzHHIF z-KuGm)<=;AB^QDMUvgLmo`Q0EgpuEOGdD#qVpEIde-%MSE8O?FNhoU5cbg zfoZo2F1y&+0UfClh*>3&YgRiLX~ue6y0l9X4m@dIgIJyATz7#~%WA7_#g`7*K}k+Y zwiB$Y9n-YHIu(V$tF+I*{3)oZ=^f3tSx2JhaqJEnfA11hdpjD40UcY9M2`C%xy7x> z?_a=sy%UW`vQH`T_I5jqxPibcDFNDT|BF>%Y_^;+4o#eOFVFf8=$X!;>i{BJE4MmTG zhsVm!RcNEK6kZxdpafEN4+jP`lnh9ltr%9XPr7ntAeS!(3@e&CGm45TS8UW0lhjof zSo!Ux|2Nrx3l{Wz{-J{~3+AFPxdMIqDd>N{fSLLtCZ0>{|E(k50R<=K+loskoPwJ1 z7HZ-dsL7XOjN!#kVb7_C{l>0hr!5r&e8uBy1mCnfD7m&Q+S?Wi&aDdQUlK6$3&At* zHn2Vt-)>M?p%k}0buQ-bf5$v}G3NH$5F$maHz=^iK@M@m6d5SIUK|qP03fA_27nOC znW_AlP-HCvr~D#aXI_YiQmXqVlqT8bvr|=y9MACS&vAkv0BuY4bfqAff>Z#x3XH>{ zMy0@|gb=tR9Z#MJ94EW|+;d?_G%krnMGnYKDz0=y6UJfz!ll!ul>e@0tP}5|<9h)D zfeU@6XMGKr){Uh4*090PA%5{~40!!qRu12qjb~1z;)WaWTU)c1H@ap=yn>MsuW@(* z1xB%OT?OAP9Dve_v4a*ctZJ2=`L#qFi5IU%*G=cO4OJXEY%3^?qZcklEL~2)=+VfO zM@!>+_T9T54fQ2VUpfh45`ZL59)0pEdGhHKV9H|5RwJRhuMN@403slmNrS1BvX+ETuEJF9n0F6(Z8sHCGAV-Us%u5&gC=|)U&v4F$0PQ zuwdf?MwXAHygMRm2{CGSqfSw0!ZK&OrI%HR-r!iak!(FSj=!p!5c%e*AUAPb&<4atyV;;evY%!}}Y~o{&8N zNEb^Em0tq6t5y-e<_dCv_BD+xy?g=5q7o`!`46a8Jws%Qcz!i=SClZOq=k)Lif^Vb zbzFo;(r?cf*<(%@A8s2k`|WLc^xkVZQGJ2uc?dM`tayjt)gOSwVm7{B`xUnskasfpxgXz5TeFsyVKrYptpua;xz5hx`X zQ5Z1q`+&Qi7JNO=7AviA_m5`^UzX|em%m`{xC3*}IhZL^x`mU{P{N{)HRQ=^3Pdtu zZwW&WN^0UllM`A1Lc1`Nrce|DOWEZ8e_^LvHeu%0W%Agv@;efK9qlHEF%@&s#JjmW z?N)aFpUK~29BSi6JIlDTVaBaPjkZUf0ZrCQ5i2XFX7)^w>yfTfQCL`Wvlf5}u?#ZH zd7AnD6LvS;__X1?6AVFM`27E|cHUuDRoCDDoO|!|UKp664+w&wh=2u6Y$zHvw%8M} z8)E@WEJW-z#uAMsF^Vm=s1Y@YBA_S=C>Bt9XNESw^tt!!_WrT=xoz%PetFOHTyEi< zIs5Fr*V=2Z^)Q zQNYmF7GrSFeBPh4ikx!GC~N|X>RuMCLe}&rzp$Ng zM^w|dR}t^5yOt5fmt$hLGk_~-KIAQ)9FZt%_Ws8ASl+mT)>t!D`8}!1E$8#CpAiX# z$?2HGjuJ9Su*KXg|t?{}1Zb3t%AFoy%IFutP z0_UK-#uzL7zyCevkw-A+orn4K(^L&;EXt^P$4Ri^O3bG9)_n5=N130LNj4v~K>z?C z07*naRG5In2H!({YPo@hz#W+_FB+d5mc#MidOcE)S8w&uUv0(b!>RvMHO1Fy`npqKyr$FOX-g~|T& zzlJM*lluID1&}P*1~3I4yM~pMb>w|?+r6H)NW$@#91%zy&P@P#K!?BRC7yrp0cFfx zSdYxk=YWAhiL~^W=2y3F=iZVn)NN^rTYYlDvN$M3eADPA=xLmh`)B%Jt5|;RU-@gV z%eZ;kR4$nKKE@c1=`|i-`5aVzAWA8UvI`kiH4U$ISh9$C2$|627Dr}zJjMMI{8 zuad{_oO3V_J%m}m-Y#Zc%%55(NXgeX9RDlI-+KE;$A84`-9LT&(-eRwM2Z4X&I(XU zp{|>P`sZ`#E3ZL$pdNV~)!K-<`9^zAQj`e5mb{br!l!qY`5KO^{hg&(h63=j#QHJ`gD)Kb?Nb9ij);cVGd$G?0ZbKZFzckIn%KfTd9L!4*7 zcUcZEUpkjl&22@IsWds`=s@WJ;Ksz+oa$r9?ng7NOfaiHX&-!rZNk^|G z0+gU@zcxDawZg|BKuOCNPl8h}`R`tEg8hE)Q-=I3!xLAV#QrqtJnQxD9O_e>4CPnP zX7}xrX}sz>vixW#;n&zLK=_Yg?m6)u>YD1T39AydA7#1qmVdQg^1vFm!nswhS4l5k zy7eV4zVZW(Keiuh*Ef-y8>V0HViqmlN@ce^dUeld{-Q1P>r=#rjV+YyHH>wC{G5Rg z=kmMyJvnIqKQVITNG4C7Ov8=_JmaxSthD_oEaFi}!3_CdlvD^Q@U+KdF`4e&yK~oF zcOmY)6K~=~%(7(`477POrn(xlX%lALQJ8gWF)LSMR8)sW3mb{JC)`IQZy?~j2c?_m>9{(Ry0BKNmlO)jU ztEH%uPebjhM?dy=)bZo3LKrv@b=e=#Z_hwI^*DOS9_S>C&93M^$BmWz_E?{sBEjo* zK96k?_*!sbrO%lo1<%*|Jn)?0iPvr2On?Z!L~1Ma$qFD`wFhTi@GpeYWVzpj)JWqz z{7K0iiSSI4w^k%p{9ykaC<4ot;*d~LyO$M8AY>AhS9SsARRXCj!%oT?W(*x29cZob z{TR?njw4o#(TtRWju@z@Ef(WjM>AS$!r}1GRsiusl7LdXSLW-qRe;#Ka{=I>OIBB7 zxc0oH70c^<|3Cqx$NT~0{F#`lTufFN>30_XVCxXHU#bLRE_e>Xax#;yX&gfB~?0F_hhF=e!eiV~jQR zjd4ytmE^ouaRp$Z%<^Z9zsU$?j|=}TccLD=4|U+7=xHCJ@^j+*eRb5~=r0$eF1-wW z+R5mN7oe~F10m+m?oz?%p^AUb zP=NxlRLhlxSuRem5iXn;kV%LDOYVeUo78MBBP3q;YCLJ7kXl+3Cy1GQQec#g=ZAv5 zb+CsCpvZ;Qb^=P}Vzv&-D<#4t_E$S6?`8$VjyG-TI)CiYr1g%7%Q&U8lq`XYN-f$q0ZNbB2ZOpMO0Y@pn?8JYVNqz z5o$<>lb699Nw5lA7_9wGX`9&d@}D$IX~}2>7_BLO^);NYx)V-71FEIP!dbPXvY;~F z$MJXf3c_2Npy0o~a1r> zbx>Q+_mN6dRhEZz2?~)KTdlXIGT$kOfQ?u=W@1pr^=5|g?{fas)^>ujt96^~s=sOp z>b?ii=bRDW>&G2_TBC9!=%*e-|NB4aTW`Y5o{MK|)#peGORJgRAb4rJVw)25 zE=q;MuNIQ4>m=t^Dvlnf7`cz)o%g|G+)R@|>&aB|$T*>->pWk(9PY#}aubs?BIHQ> zF4KMwjT?q=*6ISEVAh&@Qy|1N`hs`>z2{46vlW0h%)kGp?CIO@2)ry{ENCHms-D zuTJl@|JJKk**-}^_jUC-QyY3sn1E<`i__&fR}vX;}qBckG~Bx2rNdOWJI{ z_QOu&|K*KeCdS>p1N8glFFW18yx$;Xw<^>#|3Fui#y$Kg!tdU7;P=?oh`#E2LOZv! z$1`iFZ-$YJp=C9xW0XE_0VuN{%s2oB6@&K=Fc9?QE46HSM9XHzl^=L}J zchdV0O@=@T4Jevp6d{-t-B-5M+uWV>~ zBfC?36Ju`w(P#%JP9A?N7{y}`s|SiZKlM*Knk&|?uHjxR96p`RK2txW3B|kpZf1FL zEmuFil0u&MsEtF*IVx2PB%NlzRt`Cv886 z+`FTXRuj@#k?A~llYdM9-kjmu^uN&+lwAUm3xE@+OkpPQT~av0W`4=I=_Q3gB)tnE znC_ss`T6-kI-mtQK_Sy#TeofnV9JyvC}mO`;-;SqzeQuQjQ7t;f|8O3C5&V&UGLzx+94WsfMm3J`%)&5jY4Q%d-xMVK;^xEia)ebw)&6?8M4pF z#~|r=W;fwBKfVnzB8CxyRny+$t-0{a{!=)r7KTFj)D2hTY+qfbM5#q zU%s5(yLYqq-g}dmm!C5J?d|P+zHkx6CB=*wVM$c$8@7X$u*^rYX3cyQ0!-0UU?k{# zjTS$HRrznzx$5Iq-g|Hezd7qLqN`VbjX@a0L-Q>wvX?f0J*5b{ z`5R7~zsd8s)y@AN_oQB*%$yY`D+ySrf|PtISo*Ak0#{-rbDP8EIwvu9)GePW$~W5!^PJvKEAlM=@_Y~Ea#FnhvbuAMxY84o{bc)cxmq5ejoTb)BPiIvr^!mZ>QpZe`FySGjz(3G|s zuoOukCSjRXdv?#o5lR6Dxup(_cIlwD(>wkeLLv#(w<1(hrQKMRaE*h4=EBZa!xLXL zv2S$~rw#2*exwBGAkNg3^0ErR^SW6jn+!#Ddvl@P_$k5A9)eSI1drdSnR@3m&OP@M zB4#uFYkTwAKyTd+N}_!Ukr1ZUPEI3aylQY94($shIN}DJKRoVhrvW5jM?*3p88m@a^q-vR^}6!UiI|mIdKZ1092(y61S{YbJ$%%_-f+(7bIo#ucH}%9ezaLZRaH;@bKJq(lly zNsn@FW;(L~A`#SKl^}d-5n0;9f7l1# zML~Rl7BM_&DWPx~Tz~q-O|-^ZxpnU2oW1uk4DUAl2l`(F9;)&x(A5bjs<94KB^04- zpDPAR-hWi^=XE|K4?Ky2f!)zkvB&b? zx8G*V)~)pHWvdS5U3yt(vDRU{Y>AiqwN(He$7B2~2&vBJKK7`6{uYJ&ui~^Te?xJ% zVp{@ETWdhOGV#jj`0oW-1!P~6&Gbjhxx98D1yCnRR(e=#8kruczS zSUM2L7y~39{CX)RmHY3Hx#?!q=K8p{LQ3wAwsEBwAxkNy zesnQ+#xyz_vjV6Tk-mK>{qQ||pf>O z6^s}`bmdBVOt}$*$EH90o}590X__;q6O=OogglTjAMNsFP0Yu;r~uQ`mMsteJ`Z_M zvz>&|4vY|l43?E!(ncjcPm%zKbc$R-o|l*j_0JkPNm4p$~c_4Kr2P$-2NfP5ZSyk+;2gD-@v37OA(>`}L6mB^@MRQV`ss%w5gc_tRHQH7(p zW&S&aa`SlYdl(ohCM*;)TDx(0pIm&g2`v@AZ!lNgOzXREqh*wW8}CNEvd;CrriWR} zo%%X32G0mQEyy!X3^ku%h*8XD_A~D>M;}U)F1Fc)L3qY(F@5dX;Dl6!LLS#m=tWV! z4Nu>2ZXYiF^J;dtDvb6J(j%rl`v*dyI0K8F79Iw}%r&$4cIy(FV=Yv#p2=_bonUJ< zB%LRx=1ifL-GdzxnvT$wS~5SK1%+SyV2eAG12R-FQNY*$@+5D=RAjnAuRwelm;*<#F4-S5hC#Vale(?30s2LC?ha%d`a~q0x50 z;>Td?X8XPUG1%`I2v=o1JsAqC=>mk6Vg72ZX!IO;j@$un}AZ9t)D%Hj2>cduE7|^Z_FdSX#PN@-iFkMfo3sZ>(Lyn-(a^c z<$FDh;rdhNnDLIb-W5jiwPiPw$}%g*6x}Pb;=*r?p{zJe_tG%ic0}<)I2?kj&YdoQ zz_(kM@cy#**wwKMtu${hna=3yQ4Fmb+Ufc27T~+@ENt?lk3jes6TzHt66Vs2yVjsd zRzUoB40P*e>A%woi5Q3re{j9lnrt8xvh}&O2gdX8j7OssV8VoyqEKl(myw6C`yo#y zCQmY}s}T~lK@i#7$CL<*Ol%eC%}#l^_GppBdXvQJ8qO;wR9sB)xFZRbmSKFK;$w~> zR9Z?XJInIAC0PJ3@2X+)rN86xIZ=*3a8IhHJiucg3wHaOOHaHXGRm11m*L6%%h?c6gA#|Tel(S&LMK* ziO3l+@Kp z`?Eur)2NF%!o0xy`sf5JvWo^Nr7d@kD>1)yr=Yn_QkZ8Md>fhs8@9&WV&(i(!o(Fo zviunXkACt9$|#J+7O=tN?%DV7%<0b(N_u`NrP~4sftfW6q+~;(PwzvH`$6FkG)^Y% zV=5{zzy3AmpZ`p?0M0xU)2C0$^#F~_=1|^m6iTUh#HoQd(fgVu81pPiTa|D1rLUN6ZnJSU}G$ zGg@hWe`*a&R=0A+^9@Wsr#D(@?tf<|{YKXEWfX4uXbQLd;x=yo&(r-GpgqNH8Xg#Qxv7{tGz`V2okKiWR*2>Z|NE zbO_^rbrN5%8OX=qv_MCcBZlQL?(iPWp7l1bzws95pMO3F9B=?yYp$MgS7(7X5%Rru z`o>0LfQ>ENXgBu}_GG7XfjDB&Ad#PbiY_m=dHG5w61%i@uAwdIOsKGs*2fWK7Gon_R7pBQo!uRh8y?%h1t(ag_sDDYY-^N+ zJR6o(QpbTv$qK*;77w5BFm)|kxahSDP)2d#sELg3GX|vv9^n-Ei)a$8svqnjcxZe! zLcNLq&MT={{CFtE5^oMDspZoTZ$5(Oq=u)P=wHYBam;R;(tqqU9yb-B1*PPRv@7J|50{gG9DD_PmcVJMu_(-`BNJQ_5F^YYl(b3Ok&^i1YW zlPvjGAoM&AIrKQ@fBbLmyvk?53W2#WZ7Y@rMU{XqEJSbINc-LQ*hqjenASGP&&OnC zr4&@vF2bS9%Hol6u%TdM3?F?wk0C>caMNjn_;yqdQW=K#%VF)>6}s$optRH` z7fG#o_|s=P3A6#ca6SdO6#%qH-$bi+GT}0Vc@#l#eY>FVV~^3ElynofTtw>lhX)R% z@tbdeu}<&$&i7cmHOJjuQ=?aLoxTMe+36ZR zkY#!Rg?c;3m}!*i%{-}YWS%+HIsrA76jj6VyYFMnmftgQ^A42r`b#14R|!6zCy_$2 zr_c;F_WzWUD5B=xrdT;(}fsgVVBBCw9*g_R&dM8YT?I8P~>%PwJH;M zMM+R(l>|kmm}ZefQDs&Ez_C3vh4qlzLgM&sCbJ|hWJo8o^9cz}u2oQb&#nID|xd*elCq$KT zuxsMvD#~%^2UU2qhPNN7f=A%@7fT9Ds>#h3JpS+$o}F4l)+Ykq6VSH{D6E5`F8s2C zp*emoTw6$~CcIFKC%R`ksf0(63HtjI@lyLEL+;R;rxJ;|e$)$|a8s8ocKOUuaw zomepbLBuHJCZG_C>Z&4_t}cnwq-$3VSxCNG0pG0mEtf^JhYGv-BQ@FxF3Ea|*UkCX zsyDV2gw$1hW-dZ&&2CddKW$LPLb)xgx8`L&B5UISh!>Hutiou4PNH8kN#m!Lg4K#+ za3IeEIHLz~}tQ!-z(GUVQuuKyu22k-Rat9RW~6~(Y+ zX=x{PUx4z|4*e$MXh01~OiG|R=fi9MCnVsCt3Iq*1yljMNF8tJJTFN4KY;xiPAc|1 z`8`9}G5vVGjk{$rH-vVjApBDLEkFYXNI+a4hoI%=|BV$nns$CBSx6Jvl;`&*+!r&= ztsY^QH=~U$ya3SL?%^v#Zk9$0h)I_aqzy4)Q&qos_rGyjfRK|DnaClC=MSVyv3 zEKloEONxNf80;PnW5EsDxFVa%7TQ!wQaN_dwCgor@lw2#eh3Dsfn)kT^FK{M@$R`b zDLsna+UcMHI`Li0r0)`R2r8!zhvvq_wOYH}izxWE(v0?nWf2ygC&df=-$`*pz-^Q_ z@;@AX*j1YH>}mi1V~VIe!}&kw`ii^{QZJC8R*tjr*+wgOI^Vv3J-BoK9J%4B&JU$= z7Ar1?9B?%k117E@EnW?LEA>*XDXpmZ8SS5vc5j)+pq**t>=TUTEj}^8CBTyz`froF zPwx!(-WT+2h%~l%oOZ19=sPc>R)(e~7`k@|jA8MYn*0J2H-(k9kl7dBX#okh-nk!r z%C|G1qMi}GSM$Y&{(QfsKkFOHktwXIsl^Ijxx;qe9~YP50T1{ZJdHS{nC1;_tejO! z%Qk}+5+w!7vGL}X#i$wHNI~vu0N#H0dX7ANFta{f!M985*yp+zU99|vp~$Tp*Ta#Y zbqz)R@uLt4p_<#>Jro#C7)99FK}$PL$mCEk*mBLe+ zuyST?9O7v|x88Oyt-!c6R%Od=m|!vvSd^7}*HWT{;K}LJ=|fIwR}V*g*WE=XR&e|; ztiJyruD|0!yQK*D9=wVvcHD~uo>7EN3n7z5-${u*uojYKPrU?%G1PCODNh-!`<(^W z1iAnX>jDRu0ix5$Y^2}z%^y;o6NT*Ng? zerxyBN%_`6j(E>1$Epg%grP%36U3w@!uRjylT*}+Z1aeuV#Hb{`IYUgUzkJR zA$AvcStR{C76L`3wL6AOJ~3K~#u5 z(ghS1aB*!K8Z!Pj&>9I*hzCa2;~5nfdRwF33OXiuSw29c1zuK9`xl}XWoLG5$FWm7 zVwI%*TAYeJNU;`p-Fu)3INc0wj#XK!pt6vCS1x3ye1UQ}2qgpsj+J&U9T^`ighwka zgn)dC&|N5jL*4!V&#b=xKdv`Ww?nv;U4xOEAghIU-Y7sT!LN>M#~49ued6y$YI<5A zllvq3<0bJdN=+h*GV$*GFYbHxFNR~wbGarYIk!z+9c{uS=zzfz= z_f0Nky_!(IqGh{g)8c&Ec1IBXtOA)eYXt`%T+3V2zePwzk2~)F@i?&OG3J6l@OoWI z#)%E^%{SkGfqh0C-{m>qwq8z+FA=`5+Y_e%;tm`q@Y?wHH&>=QE63-n?QrS|r($aN zfXXT>{KhGPAdIC{qExz8aYqg%CFs80iEgmK6Ok_bzHe82C-_SERtY!-kSzqwz+wEz z4xmRFY~9`Ee;X1|@)Y6q{kZbAL>;NPkT|RK4_qIIl8Ya>UI#o02|`+oVtbvUU+;F7 zFNe+bZPfH2j$g3vGJd^{sCO2A|A`@x8$q7)6($@`Nv{qAQW_#;fWk}p)7y_GC)@77 zJrA<8!|@egDMP#P@CA&?TFSX4?=hgL2{Z5r%pn(`fAbVPUya#r;0Xl-6y{I?B?|Mt zkNHYs5Ey*Scpo!VVD9xX3k3AB_m2dgU7K%UKeu*h2IYph^W7P=`GQ-ozJY~NkD`!v zI2@CdF&jc?k69~*^TGFnkV+F%S*}o|vITO5-PQ`_*>?#s1rP$`GXJ#8TvFESsYDi9 zYjO(P8Foqo9orRiAFN@>v0EtX?bEzHVhe{L`DW>6X3SiQlo}-!^;iGF(R({i|6t`; zb|uxqC#$*_i~jx`XP6%_ZyVo6Yt6|=pU~wg-W~AAaUE=IZH*IYBqyQxTDXeKsSHPb zi%a-u8tj~Y7iDE-iOFO5Nvz0t9u52e}y9bXx5r zcMV29zJYLg4$)>G1{M;&s+QR0-^I_#!ukP1Ne=D!`1$gux8Iknu50GC_m)#yl+EW$ zx5f*6Mn#wkvz@aGK4g6PYRupRF=Kv*soIm6@wnrmS^RZ0czqN^C1#C;l@ha;z>E}_ z(RRTxJAKS9A9J6;wELJE0ecFV1rZ^g_H=2Uu_)yB@!0*npvh(4H7<#f(>F|X6DZH1 zgh2|s1sKx&9(%MGQ`**KeFRe3{kjXM$fP2ZDyjHnRel-o^LMm4+F}gc-VAA1O(pD# zn%|?174H_(XVgv(y>cZv-P>tzC_#x5t2lN(O1P{d4WxADk6Qqt5C>g+W!J(F-1C>` z@O__C&%C1RlcFS8VRa&e8f2XX6_x`^vt(XFS`&XJ9c1-Wp{$joM#VV|f6nz@C`7N4 zuC1S$Z@tB1k3YtSwd*j(aL4VpbJNtRnNLoFVg~}erjJisu0Tn_^4>nfmxzq4xMXEn zj=o65)n`acf6b5zYlMKB8uUjWfeXzBAzCT5T|ksa;n8->CAWnz+PABIJUr+WfJt=> zD!|j={cRWn-n<&)!HS3PN33g4aVRVM*hDgb;dbN*S_}PnA(=qwXlDs1Daa|2%m+}K z_Nd^^d28deV;wOMsWeAKKIL~63+cAkP|QJ(W6FoHaYu}|U;UPES2ys&UDxne1)wnP z0@EsCgTyR$tNvJFLx@X!Oq;+=^)an-E02(+Ky<-3-GaHy8EXv1hn0i~tI z_^X5hkR66~v-8;F(5-+qX+^VS={qIPA*lGaq8q&)xC>EVPf8(=c;_d0{Vt6 zD7E>C0_;}yhQ*61=+z75`*F}vu*%0RfTZt%H4w?kVdH|X*?3Mp@f2>p^;SNZHJkFH zQW{&+saFz5G87v({)1NdG#U$G9`aoRg_#aT-c?^ud3pKIfBsO2`U@|F(c4j4$B}eW zXpHue(&Lml_acPm>>-mdCSm>ub3g+~YXKw_fI)AG5*k@d`TmROpWlEq;4f`SBUZI? zkZJs`I8{*J;^P~EANErg1PiJY)D{UA#(zOlWd!J0j<(d5H<*5w*eTN%#)`CG7$bG z24Eept`j7X1Wdt_u#z+Ydl;9u9SFblG1^D@SxDbdzch#Dt)-OoY@zO(9BRjIN5+)Z z=1MVi$2PK@1&}frKeT#c`PvS;>>A!)|9Qqq{c+<$j=pXJp>T*dTNkr)eNo2qUcVED z8$rhg-)%SSUR%dge^XZg?Y1F#eI?Vsfonc5=CnNxjU6t!VoZWKLYtKDL9IZop)AjE z{md|z+&r3NFTIqeb?dBm-yz?Ey}nBR?EX(nNl9%jcV{T98XW8EHgfI-=Tb~()|uo( zLjo=w?0tnGBz*S&BC!Idn7>I-ChXv++oP!j4s@_ABWV6MoV* zFm?MUwM2!bO9huGrD+!-B7Peu7Jbb*`zmrqp3U0O-n_qH2k*~&kMGwt5bF?_utzvM zOvtm>>d(O2S76rp&|6}D<73te%v-L{jlj(IF~sm20x{V#HLU^9!+iuNXP)R%o{x z1twp>f)ck7q#~zJALhUG7U$nHEc49n){UI~?cV(D-7~rWl@~Iewh1U{kf?15iz6^~ z)01ZcD6Wx;NShi!NDZV6?zQc5&7z*5PVAfzi2fe~^uq1QvisVbgPyeF23tN7DAe4zk8| zBkR45+294OCh5lYl zf3Jag3um!=cN@Zmv_p|lyiTEZ*cuIlizVhF0mB65X@U8`_5TQg$?`ET3(PcuIn4S2 zSg7D_M}XSaVJBT#F?0w+zaluQ@A;Va-j-Dr2?c_q%gw?Ig33&175ZSe zBh}SzbyIOg7Kh*pTT2kC0VPT5%>Ok5cxVE~MjE=k5l3?xu`LjR194^SQoIWK=YJSTDJTjmoI(sJ^PpTWxO z#y=yJ+#Ns0%4`qoYwA&vMNoB`a1H2ggo|xzxiL);&LO)`;@N}y=*9N) z{cF(}+MY=We&7eNKG)9e@1ED))-*5)XuDLhGpn)>;B#F6-3`u9vW>8uO@tIt9I4{|^!nlF(0B&-*F~w<@?= z!LJp%H+V-~(`I(Ifi~8R(pq4-R;`EL_EHci@m!{c2JJyu^VYOII-%=G`us!iTz~@? zA4V#=PsGb}>44(MApms%guyv3fQ`T2kr4)&4&v1rJ_B6*w1B;cw)d|2~i@XPc* z30@&!{GDx>R-Fp9l_a2~0rWQb9zaSpkPFw&7!W6={XZb7+4;l~{}U2$$t53_W*XP7 z#yt5Pfb311Y~M(k!hjt7mcovVeQqfwp->2|HDkwaCUwLmJ3qS^9m3Xv)rr@~<2tut z!qNlScDYXZ-9VzsQULx*dagkIL@sKh;NY35ZPc2IUV5Ah=@$*O(?(gR`&T^74`X4|*{GAHBLaMJYif%E zD5gu*wAg&#(xf{-MasbJaWF(Bw_blZgZh>8(6ldDFl!}fjoNh^T5Gbh{s^>k=9R}X za_=gxJ^uyl22jJ_-n7wxfL|;5;nLfj{5=Zf!o2L8m>U|zO|Ld{b7(rn5y{o{hjMYh zl^lCe4}Sf8vU<>@Ppqba1OgCouOOEpeF9bT z@ZXN(s6jq8`8{O{ z90X>e#*1oh(uK4L&jLH7hm>Iuxn#+6I^Vx5R$Qs@Lbd~1V-jgZBBeQCg?-XOF(10| z7yyj1^wpKcg1$9^{d)Q2A=%KH!;FQRjXOL?7-~)U$8Pv5v`g;0?I`kcB8(Z{gQxE~ zhSz7-#wU;Gd0cn@3HVZx9SQNPUkqTs&#vLQ>EAK!?nj`p>-MXdW3-J(BpFz3AD_-; zE3^5}qy0GNqMpQ-^@r9Lj_uKtf^H}A!3xQBwGAktX%*H(POJl|4IL`XD^LA}NF+j5 zB*KanE7)tVq2L8YQh-PVbJbOZTUxq=vStIdQ>NJAb*n`j!5FY0Cta7ETKtuR!WKIy zaQgKmL79VXM6jJf2sXOwlUb#W)(lgM(NZzjUH^%cd?y5-N@*($$z)dP5VxLvFW{lI z!dHUwvI0Uv4Bjdj)U4yDzKO zmNV?OHgdu$zLiSej<(jBC`bsYd%hgVp%S=|DSEZ#shFf(~+XqHJp@ zq$3uxm>B0T7&)c~zy4J(^6J--{qSEgr<@WWzeozJtg8T{w1BX(9>n0~3(Ts{P)098 zW+<%yN)Na2rp6B~a-#F$t~HqII%rU^OR-5RnxsL9#LM^^Emn1gQl_)wDup(Jf`~#H z!G!J}k8Eh8RSKG8KE6p}g^e#ehHbmrP|8qU>NBji1zGn!EiKh}l+k;@296lm#q4wrn)lUg^(m< zr?p=wgb^sIIC&4-_tU5JgML>UC?`USE$Cf_?VgH!Kz;LelvZ>I2dMJWd`H^guU(HV^DYS2 zRHK1EUNIdwk@*Ws7`^v=3iI1RD~>&E3zI%PjfV5iCzlv0<>q~#aIc=Me)$y+2KqG^ zCcIL|GY2Xb_P6wA%3(`VL1hUXN$-N*ZtiE3oh6uf?5pJFba2m8N3wB46+#N~^1_@w zaR_4u=TiK@Etom;;uVg)o2Ih(h6zN_5NDOu3aJFzC>t+~(@@*cTqY>vtky(fgDfvX zvuI{ZM~vncIPa(_c!YWSs}CtGg6g~+O0tR(CNXqJvKw=}fl>u$D9ppck|g>z`AGOS zM2XOy>Z@xYrTxY#t@CO^JYCm8MQ&d{YOBQ8bHT)z)Z62ZwTYsm0T|rqM81EY8qJ7m zpJz7=V#bDUjM}S&+0PYl^^sq2gkqCS4 zIfRzhwp8H{umkZv&piG&a631Y9LA>hHmhKiMPvF7)RG`oaYP%wCEw^%QN%1ZqxlG< z4HC^`cMKw$Wpg2-CQAQEKZa!wmx4^^=o`jb9TI1i)j@r8k@m{0001U542e&eX3@;(%3pD4ze8Eoyb4`- zC}A(eSN;CPz`}vNvh^bt)-9wst2plA-NbynISTfWm}L?|5*bab{JtMp048MxibE-r z+pi=cB+qXV?2buJA25z_J;!nK%tc7u%wIRzRW#750V}KZzFSAmm>xS>vZ;la-yO(- z!?TIdgHM*OprCgxS9RZr@M{oC#d8_{@#u++8Qzn+ZOt?`M==IY8MjA@0=V?d5ooPh zwzh%nNC>Gkzde2^Qe44{^6W(W+a$*hkUYIyAR>aJX9#>L5D}~SFB%}YXP%G9Pqe>b z{5gb5OL=Rpp*ByEg<@9T7{(6UNaMGSwD<<;OQbYJMK;BGuOQ_GWNGUI&~E=fddwIr z{OM5S3}L<0{?A2u5u_JEhHRZlK?s3H;NcTOpzuuyVM6YE2;pS``BsP>E3?wJBCxMw z^o-PSbly1Hbq8azNAXeHT+4H(L>ylcct^AyZbzk%0f8OSVi>_qQK1bPSH^zmRZ3ym;`;X&_t0ku%Kc9OZ zIhKj1%>g5MeA-xiU$S%JMDmEmqcO&};qGv+UM&01e<%i)=PUXjC+T=mQa$z0d@CaS zLkQ}HbTv7Aw{@}gIfM}O?$ev;?@tHrrnxnX+nyLtes&w{wv==7>4Q1umt_>c_yp$7 z=?S?x?F_b_b39LPdxLokX2E8NAd{f1Dp>*esS3bkhH`d`BrxLno}?|dl3!L{z|BJ@ z#D9Nb%#(XCw9H^kJ{7O`jjBNFX!Co)ut&}Sq*453$NglH<^E5C3h)F8TJ>}& zvL^-EnOLbawcq#c>aV12vr-si$S$p-HB?M~pS>vUIoMi5(lSv6ehmqvQ zbOsYoo6VIso{5kK-`5CXD1BiXd0{_cQ5oYX&%zA7_FDY0W2rvMW9lna+%=&Q^T1Aq zwFyr4eQp*>)sh26;4GN@w*27X5mK{xTM?C&J-GMJ!zdHG$^GNSn6-8GxeLl^yYFgN z4JhRL#h0^c+j9Ds_6O+{fO0E;0A)>80Pa1_0tld-4dn^{Z6s8}_x^Scn|ClTj(Cx? zYR>}T<+U$!<~L_jP%)6ovT_=9s^8dn5;IU@A{I(&`S`5h2a13+3n0#Fo7VnEHz@vm z;4$o3vL|h#jZLka_(hLjQr}+BANIP0n-JmmWff5i+RB=%bY4;KO_JyHk5o_}|y@ zo`2RtuYG|zd>lJ2Ig@wV7x3WhdujDs5hUhM1c`MpDTiZMK01>Hpff``AABU$yXX1E z?27f}z;}*BE?I^#ngjMef+w%+PkDARCfg&~Bd7sSTbM9dD5>uoVzDkPfVBIkv|roy zUo-z2@*;V}WQ-2kLBxx&E4qsv9XsMYhe|sOAnK!)aVg4*x4+D#XJ{Qyod)xE@5`F{ zEnIcf7WS>_;DMPqN18$^s{k%M=U?1--*N12j&kv7dlQWc?t6LxMjH;=_e6{_-1fwL zgsa>DOQr7JC+ z4?`yL7`heLrCs~MXCe8^D+hAcv7Lf;CXhAfXpE9 zorT|?Cy~+xh@4PJB~U0rQnMLlC!N$hK{8iGT z?u2wCwkoiu{J1y0PnqQHZvqQa#w`F}_!ta_k3NF;=FdPW#gPY%#~6e11sD@YlS*LZ zmb(8(+IfdrQQdv~Gq-GS?9z7WRY6q59z~6!!4jiU6V0o}5{)%#utc%mo zFJ$H7cR2j`0xtXg?o>t-6y9+SX5mtsSJ6T`ubW2Qo};++n?Evd-N*R&-O9h60w@^{ zH-!o^Dt83XGs=0=d(o^0faVrB_(*u^YqtFMLNJEmk3P(~om1h>+0dsd>+3!cRT5J# zAm6r}nLU3v0tgy_oba>a@2sT>k>sQiCs9*e!>)aH z8FumNHm-}7a`zD$wbd@A?9p!%^H&e#t$Ci?g~opFN)G_-ohd$DxRHH#tEO*7A&t$Q zVL?#J>f&u~?Bt8D>pA9-QQZ5?0{47Q{Efgb_jzfN&kOT1P|_;vU=*k#ORd~0hL4ga ztMZ2xU#9P4O7q9(4-9?HlWq#LeH2%B@BMSq|J>Pd@=lWGlohd*TA;LVPh;=37O3EJ zV=dg31&S+X!%{3s8cq02J7=M_{QJ&t!v7p2B)15O5h=HXD2R3WX;If2*it0*=?oNCDJWMk+7>`1gAsthR}!NQl@%V68 zH=C$lw+Qb~w_rM4K26w@hTs31FX9`xqyGDHRb<00Pf*C@=!z5=P2yC}-mUlf4Akw;Zo)HR}9}AU_Y!^Vo91#Y9I8#f&M3 zXciDqQrZlWMDXCd#~rzl)E6V#YO)&iD3gv z@Refck(ET&rcu^G{Y%kGbH&+vGq9?d&ZJMobIX7oJ;YxLYv_{>CG`YS^nj9f*cMO- z#lZf>&h6U0gRoWrftAQ~^7p7HsGvBnxK|X};|fg3lDe(Wzq}iUmtH-F zJMW)O0!AX3RLUk=zSU08`a7E|Z!2E$Sxq;(k0rpsoKHJg&raRKA9V%v%EIPCQ9ZG+ z3(o9L_jMCs%!O)$9|1U)w7*=Q`(6vs!ImvE(OOeoeH3=dugHBz1GV;gbz@r2wx{57 zNzfqZBvw&#?kPRI{Enlfjg70aklRe8RW~$HcEABWl6YbI|GJlC+Yuf)0;@M>Gi$vO zb3L6A;PCC`|M#)bMeYpBindwz_1j;Q7s<;?7r&!}`pJ_+vKJTrp`Xo7t6;lED)T?B(K4czQ%^STJ-gL8;K86}Y(XSTM z@!SN~MWa0;vAGrF{Bd8fHNO-txPOIfUZQ7gs zDfS4rmt2Z0DB}9hPv!TcA0z1}dEmQ?m|XWe-kbRx`Gt8_s?42Mn?SMr@x6GrtuMFz zZ810WTS{Ie!t^ZzIcJ#Ws6)nb{L}T=#xux}WJVlf{D+Ubz0<_zRzPRve{W}HWv(u9 z&_}uFtE##o$eDkS%zYMM)26Va%L;GAh;I4c09nZoJ(rWL@}*+@_9c zx7?R*cGY+KAJgxzowl9SP8C);RaocPBt&@anDrC@eXeuqXAF0rQG@4sRQ>+4v_g^$ zWU?}3&V*p~YqRiBe7$Hq3D1iR-R<-C+Qs|yEL_mrA>sNvPqpu_wDpHq$}NpKK*p_< z1cp+ftbO5?JFcdwsD|&(`7_sceM@~|f4ocf<+m%V*r|O9b7F6Dz`r!n{?8N5j}Xz; zi_r-lBkEIJ@O%UBy!aE&x$G#C%a=i-ixa8`QP!`LH@|A)fQmjg*&{5_o-X&&{~Lz8-+GGCP3X)@9>YRZ950f9a*@ z&dw|ZI=D9WrfNK3K={083{kM#-ksVVWtYIf3=}$0bq-MIa3`jm@U;*uoi&R$faj-A z=V)N8?nPC(ND}#xz`QLn9ogZ>TCo*n&%rMM9mxB_4; z<-#eIR`iw*-9(EZT&V><_S??iA8za0=aWs zMF*j?{qlu0_|8{_Eu`h@^6j$kXBv7?s11p=GONQ+7Zeqi-sf9nN5io|0jcrbFM1?CI zX*K8cX}8Q$4DMeJ_}o)_C1tIbU{VXY@j7k!6O^{ zGGtH%K|iQkTPZp4KvJt$|;JohabCa@hnalGJ>ix^C>J$^8E9H#fufU-`>KnCO^ea zO>0>5#TdIGp;X~n)>+Dj+(*~LUr<;*0+etst?lxKvA*}AHQA{2vWU?TjnlTvM{xJq zStznL8V?VtBpX{cT5?YbB3=Y-G=7HCifuLNhBEh->Ap&XGyzJx_g*ljuc1#Nw)fNN zeGimQptMBjB0KsC#5uH~UlF{1h=#ZKzziM+`6U^W-hrHV(0i*4rrn8O4(OL|0F<#U zHlPBlytK@ArmAefk!vA{xOH%?+o))1L2cbiw4i`B@9$nPXv`C8y96Jsi@N-(B5`1Ng)m>Me<<6*M+th9_WaGe#sa?H$BKo86SsH7>?j-*)W*TJu`b zM9v;Pj-r;$bgo)Mq$*CqnBg?7-prB)LrNNap_tj#k5o~L=eG9ev_7@`N0k!H-J<>b z)AIJ)lplFyxNGtDDt}NxGgm;WOJUa<=ty~CXwn#;O8Iujv%;6k{(r^GuYGS1wsTt>@_<=%&7Mu+ zJ2;9Y(TF69ziC<+nTaT1mO4gO0;1 zDdYKtt&I2j5D}V1EkihBTpwCm>PY&EYx*qbFYRM_wy{4am8@foX{I2*j(1%Hu<3>y zNY&P|^||LTLbB@EW7Cz?Pmi238_@h=!Mfx10vRwZGxv#Og3K(BAqKoe!-bzGorw*jh@;ren;2a5W+GuuIdD-<)|SYuByg z>Q`RjI3f6@6y&cHn1_7KBp)+DVCMT)J?Ir1ehgxmiETt;f@hzVNFiCc(Bg+@o+nIK#6`>;r2L8R|-y}qW zl%HZ_%f@simKN{`hi{VZD043r(3gHV1qe~#An|kKuYBHFJC+d(K4sj=u^uaMrg%lS z=Xan1kW!NOi^be~_8>Ml3#$Vt4bz_9Xr~=2J@t}G+v$i?y{YLFXU0WeveU2zntuLU zG;rLMH)-AVVY*tjV04PgLDS5(jep*5Be3?7kEq=FU_`3HrioT~SaBA63MMkfQ5n5 zwiV0hTOE2!3(^Y;Y+U&ne@~2?kCZgDJ3E(~{z+{>O0GHdP$I&|b4!rHW}{yJ{=`1~ z(3Qa)RpcFM0365^s4!%fpG4vfUMu(R)Dz7m*Ie9R#}=I(U(G4SEbJoF)w|2x%32&>9- z=9v~cP>bStelUlX;nj1_5WS+LmBTQ*PR587X296)J(#P|_!%g#^if*z{HM>;o@@^# zwwpVfdF+G77&~}u+LC6*dcn_4x6yMW`VKJvJyo{B^I-Z~ydM zX8ZrxEgc68mp@g{U8h%n@AHvJgzJBH5C`x7nU#CE^G;^_3)tz=cDB|1>HB+rcZ@i0 zFQ(mF&4$ed>_1@$bC;~Atuy5SB5C(_5O&xvr3?Y1;njWkgHxDbno#xpch!xMSj&Vt}0$B#1%TkLnmrGVQ3YOF>d|~+Qy7AWb zASAv}%t#DkWTBmcNYW^hHV>Y>u5tr!FLVcv1`q)R%cDy-e0No z2p|__HrilvjDXtMDL|mp7NC%m9@AX5pGRY-$uIyKq&^!@w4jV8q07VVxuvn9r~^t2 zw?8dm-cww4-NDp0c7{E*pJhPH-WJVnIj$H!po9%f4KI9C#9y*Ih^H$tQy`EcoIg$_JcoTDLs2V~v3Gy_mfF zNX|QMUyeCoSI)cZ6%t8l4WB}%vEtAspz*`elL>owOt1k-+Sq4@`x$e8tsLSCLfE0C z5YFZhl8hQ(xUfUA(Z=D_lC{ie8jNzj7#1XQQ92{`p0i1j6xvXhjlSVN!=Gwkv zvVG-HR!57Ct{BbNH-8Ozggw2G0&O(MPCAx7NA1ZyZ{CA8nhT~}K)=#{tlYd3A$>=i z^?(A0D0A;40BMAE{d6eg*Zt%bYdfp!8b~HnZc8`i;w+uBl+AbL z*6_iOzA$+i6+5W>>Gggog(Kj!6BsqtaAquxD5XL;oq(X1_l5l|K$(3hxo^PN^wFK9 zN>hBO_8=I-1+KP%)jTYJS(4ltQ{ES9G86DbVj4`NhzCnEO0cOi)B2%Ui z-DMZ2Q%HAJewQ@XiPeDn07g9(P#Sy;R zq8L^wt^d2W1wm;Qo&ZEZc#`U}ABbXV1qGy0&hl!66y(M8DJdvnT;VuI4;YP5f<1=q zflz`C%^MiiZ**v!0=lEXQuT;(Mk7&1mXEYyXQIGTBZx4t99O|{J%ZiJ%q|C7BeyUh zm4`OQxd2!oNGMHpRbkk}+xfb763)R@Ij+F2tp^)R+BvKwQf-I*{mQI9U3BmeB1(jF zS}p7@v!SA`%Rs4;tb6c5R6_$s2-d#x3T41kE$>lSc7RE=&HbK6z&2dQg9l!kOLKdI zfmNjh8&jq$e&97}M{p`&@d2%sTh@~hjo^8pl_BbZl7>h;hSmzVK;*354hWzNAq~|7 zO2QqaWX8&a6lwloM*JX-&adM`J;0@(3Q^*?Qzh0?F}Nu07ZR2~ol*X@LZL#?OKC&@ zl5}3%5uk@uURZ{r*GI#ONj)T1p5?KwkZ zs3VYpLL23lyWP(UA*rseX5G4VeDlpW3?4k#>IeuCHV%R4>I|h=suUM1MI7)L0A!ent+z^aroEp=4Sfr_BmS@?Zfh_s&3R-CJh!Gzv^=&CfIq{=&)j?E1DtI z^+m6Zfam?l^o$NCbN=pG)UkQ_iA3|fP_bDVl~#3j(}G~=Z&wh)Rsf7)#3946G+AzV zz2VK7&~Oni)0y>&1kOAuVU?t3Z&A;kxr*;~f$z;OxSz5McD%?T%Tk%m$;gUYO} zxrN)_x2Dn?W_0)+40?Ew{iz-Ki5QrNv$vemng6&s*7i`&{cat>{Gk`)OU?Mj&(Qe# zjikZu4wp<#1O+C|E!&8ledh0YXuk!Vx8eu}C)e?NIg?|PmotS$Ov(F>lb0XD#?M~E zmZY9u;&z^8A`?htxgO+ZT4v=9&WMZQIX@uNx*eyG%@ezlpAVLl)9K;0ly3dq4c(-$YPP{ORJCn`>E~pl(8^OVA_E0=OIJOq`qBZ@4|4_1 zI278gkSgO;nY}1dN77buXDOdGBS4{ZP}p1)b$j6h1w}<+{sX+wn&R2%SD}wVoao4`QN;`17E{EKS@8YjAwseJDAOQC>=%U2u4dz>iYnm@p*pJMcn?NCYDUj zqO!6-r=4ba`|Ubjdg)ubx_rxOXINqbgN&6rQVbbVOr{r2kkA`CH_(=9Lum_@3@RSX z`sURnR03c4*(h#?6Hbs}nfKdWM)SOIcx5p7sT8WcjoR8`gx1`A$xMvsWPR=Kv~Jr- z>$X}p)|WA5?=@_xA4^g3a6s~S@=uf&PeZS3V5cREVDn~n8a|X{Q6+~qck=Z|%Xu@h z2l-wn!fRu{F>z*n9%WEos2Nn5bC?iKcvJX?b&IvQP@lrH3Mbs zDg5vkGV*`s&DYadyUta3i4=BkLn#DO_(&nB95gti@IZT)aQh}|Iy=)^4BAn1N-4_f z>(G7*+$@;oR;poo@TGs*zvUD+}=us70+Ln{9C2P>Y79FGi(KRS-X#B91 z(#~c(5(whs-Z^jVkZcI(zbXG2Q;`Oje_97VEI6%8+h`|+;hgH5De+el(OsO>*XMSA zM-0j^ri(~q6UQ7=%<$pkdGg8CtXkC;T4()WImUOYu5MW-r~p|@6IzDE-le-=N>ieV z#hbq-7LRes#7lVMnfZH~=L*D#}{G z2&Vk#EBaM7aq7=LuaxL z*5DVQq=zcS2q73g^=Ql)r+se$SigQfcgL~dCB>Zf|41PKCHazMv^k#tao4X-aFt$$6<-OfizkKM@6kR$sOlUTS0j-~IP4F05Yk$s z{Ukc&V`K`?_tWq15b$6RMyrPHvm>h53ed(1%W5E6Qbg$$BLTyfIbVgJhm}9)?-Ngi z^UgCgH@jY21$%D>Bk}H6DGimCaM@*=_$}`JwRK=q0m$Skzshi4dtvi=Tv$Dg4%v@6 zoyUW(iP=_U126+)irHoSMci=1UfglVm&}{DHSF<&ir-TMkZy=g2=x4@`bUhd7|V03 z{!U7#7+yS_ah2mZb*EFg=F@9J7GFcgu>S|3w6?S`^V~&jt*jzH?(wU!d-K)H3z443 z9eYpGeO3+@Y$k)+ju?su2+!J@kG&Y60-5C*ny?8TB-8 ztUm-l6$?iILH4)kJj$a{h(@#WPuJFxdh-?guE+cwh7Qe+zvt29=TVVae%yOKd(D-$ z^80>P10ciC1WLHZR|cyp+L3(L87C5nIG5v$^h(*@Upqj^x2?CUG}>yOC_}cKS%yMZ z531N>hhD=z!wzDe-wZ~v^(XM{QBR_bVZ=38Qu$=PYo!9ir)_p74lZR;%}{tpv+J%N zwYAvFEwD?^IjY#X*I*$+_!?90c$BPp2#h?%;cp9cVWSc%}8G%g+%zuN=yq$f7y=@`LY`dE0i6wmc~mdj22Sg zu@PVSeATdkJLca(ZF?=g@sUQ__M^NU?zsn3UvE*$jQMgnXAE|A4Th6a!k|Iur=O;1 z!v<19;6-DgBPgBXh=UgL`NEOxyK6l~1qs^P?VjZDN4nZdKNXkl@2b5FNcW)XtE=F}l!Uk}kyz?@L#T+vDTt&Hai6>#6gFE`*{+4>MN^c-zRikK#M?^Wf(^vIc6?cZ zZ-TXQFEk`&=6`tK(Z&nAY-9N+$8mdmGngSg#J^{h`u}ddliQC!DqZn?Yx7X95eP;B z0KP9>Z>bSlqog4kjfRj;EMn&m;~T^P03ZNKL_t*cp6A&Hz;XRv@cw>)TbqmqK(M2# z*cgpb8nj*Uhz%IXn73zvl!)ca!34@2CZiFs-DPlC)hmzewOd^GOb|gQa`6S2p zqN*AZBl(@}K(aDcD1mQ$8oIWS7tQ1Jv8Qv#=Xc;6pO5Q4#zagS(|>IXnu&Q zYg-!{*xb@Vby*n(FEqeR+-W7dk6uD?VLSIf^&_hLHn4D64TGJm^*4T#82?|OZ5K>Z5Qi70*xEHJnz= zSB3FXx}1ita+;HcX&Zn$@wGFsIRjM&3Qb`F$9-%#F7+Z5oZfT%b@03ipEug@NkYT{-T@@Cco#4Xp_V2EHkBL=#aLkBfXic@!?zc0% zbU3el_Zsily&s~unjTQf%rL(v{NcNfqwvlfFzah++#02;>p1Rv>L=X&hZ)2pNq%w^!S@ER zX4!{Gr8whfU+~%tyWY~);&I0xZ4XjVXn5p7!;qmT5#hvMhwq-}vES*Zqxap{y?+X% zWPORxkjckvxAF%)rqq(V=(=P5x?|$Fq$r7 zFiBSlwY7rBqCiB3^Wn_*I^(W;xnb%dVTHF1fDEr%h!6!&`Z5$P5e_HT84XLI523Yo zmETUsaGHJ=Xw(6 zN6YVj%z{Bt#)-R0`1KBDcAJj)!fikz()YpkYEn@w2k{2ap!NT#%B*!K&=+HNg4f=_ zJoX5trMdTtn1eEEvWIZK!+(9_bHf+cQ`cU{AvK3kl2^k03-4#ewiQ;SQ>oAf&<&;R zL5IHg@L|iKO~m~Tn7V-orKzhgW5(b2<)?>yN@v0gMJ^Jp5sC|aii_GIl3v%BZdo%R z(E{!~Erj7QXWnS)R`lWO^Ize%`+mjOH2|Lhnxu>(gkf}PJvZH5LiwQLbYYjyIYetW z@=F`>=<3RP|9_7W+&483p6-;xloWsshgzW&tC}gOMTw{ zn~%&FM7C`|{m>ezqT#&$@nsjXx^*;14t^Dk&+F@^^5S>L0^aM=$GdD~hIxvry?we0*^VG2X1jnNnpO;bbMS3J41Nm_2d;uVtlwmm1 z`CRnMjigecUccv1YEnV|+xQ9P@k3Ox!@P9Imr-s=!Jhv|?nrV$K~9(|QtS+Y9jb zMVK!>gNh0$DYjUmYwZZGPV6EJWz2X%&-17*uBJFz9PVE?YxOK%UHd9ZD^emwG#+Ji z#b}gK;Rv7`O6invb|icWC=sEsXfW}CeHdC1LrafU^#^h93;U8tc|<%P--lERqLCCy z-y;$gSSZM<0uSh0ltx~Kb{xFJUxi`b(w|UKoZ_LUCQx1$;oqM`2yl+LNN`5=JM7KB z>AJC#<}TNAyNVqS{hc_7cCumbE?UIpKy#ktrC(OFU{suH=h7Ui>N=J}8Hvz2D77Qq zGEr)&6w(M7B8UlrDcyehk<3uE=#*Ajntv97dXrz(gU`aAFZvSifrvbJmC55qSVpnQvwkY$cRKl z9f}`Kt1>rrDcB5N=ZqtbKIfe*I*E+?-p=4CYTgvKut}L@%;jU!;9V{_7t%@Yz6d&( z^!(d996pvrjsSCj-|`c(`LPIT`cJ!W=V6EcMZhsRk?aXU)pUP}AQrE23%jt73#E(f z*UTgXbBVw_7ptp|$142(5R^Ljp(3oRa3(GnfyVY7OTST9bwZoYCdD#Q=zt`Xxqo9( z?s+X_qi31d+zikB%pT2Kr-a79K*oKqA;Z|hjvWX8_C30il4R1SD=Fzn`n+&ewdEy} zNqnX7eV=49$!=$!*)8`D;H{j5jj`#26NtqK6?nD8D)#=ed-_#u-I}Efk!jP|k)vYJ zp#Q1-k2;&~6m>3ro?DF5uZqXfIaZ0>(wq4M$(;KnMCDi9dTR|=U%i6q)5mh>otsgr zEhCz_g`x0j%pl^{?Ee@59wf*v%ZLqqHA=gb}&KWgyCKCMQt_jpXo&EZ`$+5k&>ad%#zOSyo zA^gwil~=fmU2?b1f>Us{|avW(@-Q313MrY@J~W#8_p<}C1N_Z$vy&3ay< zHB_w|)Ghq17u;T(BBAvcCMWo8l$J33?s3<^sK>HVW;BR1AQB1U?@kGNT=#s~>wZI9 zGX1#Jb~(}4c1y4CL#Zj5)Pm>PUcalAlYe{$%j;M1&6YLnH)0~Cc_l2aTTWp?A*FdG zELbxSqA`f&TchI0wG||@VQVa%9F)}7T{rLq z6iV=q^Z&^cPY>l6zo;Z0hu{6KKfCQ#!2J207M;yPi9Ljjanu2ya?qqjn8LHU_0hip z9Za8oxXZ986DNMh-g{qeEvq<`^hHVJl%7%28Q*x^e8gbh{0(%SF^Zet+JM@cME1!; z1?ev(a#I3PF@^_zF@mC~)qFeR;RS4(2=|}yCoY=ZN<{v5DC_i#k96@jc%!UQ(V)2a z@?*1zQUu}G&6>rz z`1PH)A$_%`5vn&&7)yEDWL)!gq+b+X?BPfBhQ(MMXsz z1IeTU&rnnl$O+~w?d6;u9To+S+B~kHkwzqFNFu=otmx)&aL4 zo(?}3#g)cGYl~7#Wzs7y%5dMK9Z*?NffoTSpskH(Prr{C9%ns!IX50NjRB=q%=mOB z`wX4PKErpzJG&3~?a*(O9eMe1?Ud_W{FPl2#k%ZkEfGQbDe3G0fp?_fwHdDknz~Tm zT94hVAOaY=QeF7cCmzc~NS}nC#9-)5bV3BA;vTS4kf)uU_R&_ zCB5a!Pw7`QnTrk>NMSU>9mfvi$uApt^SxR`MZR^*-Q3ABQ-^ZF{{6$b*=4iV^YOG< za2GUIv~ca-32uFYBT(Wjs|&uzl0o#`d%@h_WjRzH%saRT`y^?y?Kw zv(J$4zfWxHRFY3UMP%quyg`Ez|CyZ?e!#Iuoht2{ubqh5>rVDqG!I(Z$=8aBtCwRs z6HFB`UiFS9DUB8J)Yjh7nSh~#ipcCb?|o17onFnk4$DgcQm zpM|y#jL}ZuR8w%-#oK*8QQ87OmI=f<>c#R%|}HU8y`v=Oie6xhL>J)*eEWEf5Zg3{d&2vF*I-`FojPCWbrC~D%JwQ$E5wG8by)IF~q z0vTb_q}2==;wr!NF%L@2`>x{khO$oV&!*Z=PG7i`t4|uq&ixBHW3PVvbbJM;-M0iG z4bNS@2bBeuR9jHj!I}3jVQAk%C>?AKk-nj>qLIswFXyg9ZXsekvNm}%CjECnmPMoJ zwQJ#;chjwXDjrsTqkUptk}essmENi8`cfgZRSXJIYNdz{8%A=|CiJ`SQZQ{AMoPM_ zzdl0VjXRoZ!aFuV5~NM2hjI+nyl^NIB9M@uZhy3RPMc12e*!fn5No{EC4C?#oZ zE#mI?F93YX1~1^gJ4cf84Hy1q6pugKz_e@EVORMAC$J2QzSHO*I3S-#@BfH{PdSu} zPw&T1man3?c_U`}b@0OTsAb>q&=VU;>ZnzecKU{aUP4txjH@nM&gA8j8J$0xKG8n5 z0^&xWMy7jz*W(9sx}ms2L0igj^k^H_%%z6BsC85d1V^MpsSi8tEZac&DN<25der{Bv+N@d z95IRcjmv0@COK}`DYPcrSy=luKl{J)X-l*ci5CKf%KUQ7pYFDsktmhDm&8#mR+j&t z1tCZm@vUEjS5rgZ=bp6vL6GG&HPIASmFS5t(bNQxCa`D@nNy!XNK6hAg zhZIL0wa|hLT3{X&n76z4yvFx2yY32SoB?;;1$S>lmB*0@!3~eEVE6s|bM+xL^eKq) z##Os#W%^}rtmlKb*CPfLAgb~pY5ic8v4mq?=@u^j@EZOwi57=%Gi084npa6B_ zO?V>{;MZb|Ovhgf{&CoY85=zMSsOfh`NL?tcP{!e5FdU>?0^G^A9*DHJMWUX{dQD) zd$tl#jw-Du1U_)jsSojFEWy7HKAVI7^As(9l&|*u6$gFw3ZM1cgT(v}{FJiN-1tP0 zR2Cq>M0e_wN`nViU$l%wGiN&7Ad5r7-*Nk2&E4%>F-ucnsar z0S|)ZanD`L7iYY|%I{jKXvrg)Qhe~qCbo{7%DCCD@QTYo0{q|v& z_CJMAVHmgUbq19j$tf?Td*GTfkEd?aa7=doOD(|&mTvQTr&iD|1U02ThY#o(1@@(V z7nQ+Cd{%2XalE0X#Euy2P&4djA`26c%El6pY`C>b}k6FVp z2Y$ww5nr*kE5)DZcCoCf1K;?e_-B@?FB+|VrXI7%qKuD8%#S0vFvw1czo~<9M-1W4BZqV=FkfCbi8EeY%_r~GBC3lKed4wP$ZS>NYE{j( zM_#+#%AXa!#x`2oQdsER1|a9^KKHahOQ>vZB~nt7HHX`g3J{4zsF^;U{db+kWgl;( zZeuI6{k^Ot+S(=-FW*c`?t*75LD!ioBl7K2+}E|3LcI%01_g ze&frC)kaj{D=&T3AhZ?FfIN)RY&iKs-h8v3jeku*YARQpGMO!N3K7aW+X(F;Oay5( zQhTIK6v*opCH~$KfJu{(N~b;Eq=LmO9%5*}7{$pscnL*QXPmh$GZ2+O$$*)Rvk>>B zDlOQjpU=Jn1zo<+K?8e7fn`qkN<)`0EZk%mQDNh{px)5jWr#&gcKH7G8-Q1h$#J*q z`RJxfECl8VA2Zj*`v`%V*)s|rv(6-LZ*-C3tOL%XC}xccnX3V1`DF+txNznLq*Thb zl&%5`0luHdnLm4vU4}0~S1jPeEv4M{*=Dyld!Q=pcUSc##!lnv*lBbv%#fIWxQLdO zVGf&uIr?bKu(T(cP=bve8(G)6j-USHry$=#Y)j&A?PB^FJG0M_B8)M#`-;PE`3fO5 zv#*~-NzCJklSc6V?vJB2Q2rY@0a7{OhS9fPL8l|nR zjp*gmxZuj;SliT!RGPPb@@E2eeBYNZM@VUH0Lh3I26g&?qxzTe)ol-ux&XW%+WWch zN!I`yr4Z7h%$~9&qcH|g2fO%a-mO2Je!Jcdx{y_Kry`XAd~V}Z4(q&uwzkb^DNznZ z4X;9=d}$#Z-@;5vD9ZX&^B{la#`V(~x%N-Qw-xcrv66+F^2cS9IpQA%QVg^ z1X`$YZ^QiIgV~?IbKrryF>P8kjg2yU)kqqYOxq2D9g70D*Z~9bxc&C|Fl{i(c;T>G zDnn<%MSS3wGezHkl1ZK~o=$sL#0s3`qRc`5E8hWFJ_akXcHuZXgjPXg-UAA(r0y2J z)`p?wh9?&oQpzx*Pf&Kdhu?Vg(LGjb;rkpnc``(!)X$kiJTI@u@AUz^(lShWg^QQ4 z(*1uFVWVJ#z*MDIFOULL)z67?1r31Pi~hmc585RJr85+LeJ(xpQa)bwaeAnfQGuuI zw~RgqEn&>C&uB#Q^wK*3MvU4Z+ofwg~BjS4WR71eSvQ zxup#q$}E+kLycv8mEpFR4<_Xsjyhok>sC82IvrF%!ZqU%<| zrS2BK)`sVoxM`C%%-?8j0lvx!Uqa*CZ}-}>H@^QqV5KK}JG{)+ir+v72>R^nqo@!@2{~dBeJ3}T^Aw0VV zFRF`p?_c%2wX}tIemjml5B~Y)$9~DtuS&b}HNSRjR$yHSi;~x|N z-!83Hmlq?Xg1kX?8A%Iea}GEyT;K zu(H_SA9q=|k+#*V*?Gx=tj}}JGT&E_&%5_ax{_%kB~WYior|jUwVMiPl2YRP?%tOa z#3IbBSj4*pWBKE|ZA@#MMMX?7XUd&0(96{SLc^mJZ*A9YG}{ zeEawX^si{JD=pebM+~wal80wDJ@z`T@TxHGrt8jdWJfd_ekabEJ%pbG@-V#9Yx+g+ zAl;DnlK0x z?D&3Y{Hyl2-~0ErYFbuqq60W{5Bu}Q`|L{RoF&;9eohCSThxDO__3mzeg%CmSVP0Z zqus*j4?1E$0=BhH=g(8Y3pR~Fx$U|wydeWMV3Sq{7FzJiUuS_2_fGF`BOA83+AS3Y zI&at^ph_Evq%u5m{Wrvi45rUdrn2Rt-_iQT7v%NnZ}BXhn-m#`fz;~Nte1kF;eS%K z)v-3tn>r@^-9Y`-7&qLPZm4YR*5BbfY0b1}KH>Dw^O$qXaLzq#5UCX-puL^rYX(tP zbqsH=Q=Gp`Qz(qiY>d(6Ck2JOT-1GbKHvJ3;;n8>4b>!!Dk!Orumh=p|#HaA0 zdbE;m9xJJT@<{;xeDBXfYAjrOy7aQ}{V(Z%ELuvJ?$Qm-70>;}b(KN-MWcAB6vSc} zZMfvnc0?-JwK+Yd4Ah}td(^2y-*Ssfe}(6aV@4a00#7NM{-HXQ2=VBSnKJfT)0gRYFuipC1jVTHM03ZNKL_t)2NrvKGsYu%z5HS?Bv?AiG%6KSIh6&XA0-PG-DQq}` zEGl;Ckb*$Fb}^FHVks%Fi)D|s7B&~hp1n9yiS}J~Nna?oU7KuTU1w@4wsmV5I1t{L ziuI|qhjXh5X`h9Ns_GblF_J(^ArpoIGn(5!4#Xhpc^>AOXP}?}u!wEjvC+A?^yS!P zf(~N>P-Ubf*+;2ks>r1R&no_MX9u2pV;hHM*D&|Tjwor-M$y0Hx2T3+nDY6V?AVn} zVcQg<{q3SvhMhgP^M`8;N$+axN^x)~xrIH&+i6h{q-3PWm}w!J}GFQ-zK3zHz~ij+~PDCb8=jMefJ&q`|q*ee%l;n4tQX;)>CG3 z;FRzAa@0;vZKnu_S|9^S1nj zz~HQ^MoWSL$;^D{66!?P!eoSKtSDom%WuYQ>@dFOyK^pTNl6ZHO!r>EI@rC9%4ILo zV%#v2diP@I$XgKGs!49!d9RH?qA=5*>T0sGvJR^7MM0E`&6|0xcW(yYznz+`Td`Ub zvXbJ6<}(XY3Eq6;HEMra!w=6*rh3zMv=oFRlH3j*cx5&mHEqfkm ztw`zGiLx!_tW8U!p%jErJbc;=@^Z6js9MYFo$Z*o=nsH!D5{NvC{p9{A7|{bMq@qg zxOgdjUj>ptR1pV*(V&%X{QN?=ob_A80bipbh7(I?2gz%h#+Z9Q zrLL}yw6wHl?@w%agh1xuSc2&4MFcxNi1pGMH6SV5w?nTocTa6m4VwEVZs6&APhj-K ze6Bd%f zu7jEy?29jA*RRJG7Gf{B0NcJD_UNOq-_37y|4@~Lo_U%n7cS)S<^7mk(Tx)-OUYUL z9t2X{v5(+w-sV6|tx4Oauo((oRoGiyi(gkO`DV6c==rVzsI8HF`MKc2OI!iykPWBy zO7(}Gja6l>wN$Ksm^za}+iv&mwFfw?MJ6j&z`O+unD+512F}mmhR5zF?YRClTz5Iy zn>RvgDskQ6cmuH8S|U2F@!zeb!9@6^_!EBD=>k%$OOvpgx7NSK#hor9GmsuDWKrQs zsWo_t?t?O@){5soufhaEL?VK<>o?G&XK%VbG@iPzA0cDVI9|T^N(M+t6;OQY1q9O5 zd8eoq-IHrbv5HlxM>43}7RrCAqCpsvf~lmmzKG<4zSL~J5v#*~1r)BL7+-0}C+-}K z6di$R*YFyJjR=fUv9)*uAbe*czEjdz{wMTYLOLN>rwFb5X_&je0XOX5xDlJ44nM8M zR#jn>levGrK!zpC2$ZizjX8GIw-T1@k zOArz+JYzP!JFMgLWyf$t=bw3J_6f)+%L^QS_~Bf4-F1u`_b656l3VXoKY=XdJblqwPrq(uXzZmHSaI^oK3s7A!Kwp-L2O7(ed0I*^z+8 zVCT)l_U?@xH46LEORo37@=EN=Rn6`ns%fy?c6146^gb0~mU7O6{m35Jilwi^fQ`4J z*tdN!)&?o!IgM-k2ho`j$Wl$>mo&O|rz7m)QF*|G9z1 z8_Q8fGN7TBfrqCz>w%3iAj{ZNpHJ>}e`EVEyD45cgH9)2K*eW^c=(9RF-hqJ(waA7 z4O&na5myWj)t)y&7vR?`@dQS6gOLT35p8zN2FIS3V5lq3Li= z8yb>R`16!CoPW^;SYvqmo$1uo)iL_MarExflM9a>$@&=&aQ3bJsh(TzOiIfZ@owiF z7Vj{Wm~=cPSvdPwR<_BYp9e}r*b@#?Q9Om6y9FvKg``jzC9Ere%I_UjR8`h#HU7fj=>3FjeXCQ=%{TyhlM+pfh! z(BZJn2@JvU7Lg~=#c#S+!RH}VO7EpA|q(hj{95vpqf%*kp=R!#$* zO9WCXAPma&;Ep%22$g^)`!)!RZ-0=&Non~z#+3gAQAS|+y))v*#%?2gcioy~r8)k% zLPlPHEXG>u>jkgBw~EiAQ-G?f*z^La9KJ0jZLJ_PJ*q?JpS6R*+NMhu90m|}drOpb z6-(+yy?@i5-<=Io3ZS+zrHPGIe!clAY<&^dC``j&7^<-V;DPj96fppE*YkvTw?dNcBY>EyuyP}Sh8jUpswBHwA{D-^OtF0Pj}AoBuGbeT&g#TUb0P|C47PoH?8hHr z|MVy9XP>zdK(}stM}b=g6bp*e=z2DpX)HGLV6{9~*$Y?ncZfpW{hM zI8UH*73LO!iTDIns^q*&B-LRbuS^qMbhV@^tOx}a#TD?)l3KcVNFglZP8_21{k-%G zFa~}q67GM-y)3HJ%R<@ zfM=^+h9!(Xl57$;^|-NFgL7A(JDZJCoPL6vKj(e)0?I;)h;WXSd?f@`Qj(+%-r678 z@$?f^Y}-M>n~$RcLA-WRB^HsyY zP#Rwp)AfuoqnmZcNaHDtb%wBL!(gI45W+XM>KIYj$TheBdBL)+fX8Vkbl{0+=ApC& z3}yj%9c!?WDt{xCPtYmB)TjZl$xcX&!b?#+a1Qic)Pru_TauZT;-^3A4%{^ciGrU| zNJwi#n>HCNS#oTn4kYo~E4&xqsMKgbd~@i^Z#bo4&Bj9db^nR#`XtUDIGcf87PGZ1 zm#1b9p<+iXvfHfVy&cIY8FlaOa&XC#rM&abG>$$_G5SxEjPDfoC4t@Agr?l9Dl;gh zNlwzF3Q20ZMJN#)>I)yFi#7mKImjmp(ixhlYAc03`DE}bW42@OE>tTh|T)3{~Y?=V^u zQI^z9e+nQ}lYGNX0gUuLkmfBDZE74tD4H3G&2P^F5^zlC&8Ii>%%)-5v_KI~|I z-B`}6lP=(eDa)AmvEY|o(7He&8zja!0@B#Hwclu0>5bn2xU(kN)2yt5ie1;o9C;*G z;NL=_JeXZ>%}Duisb0VL7cL(s=RZH%?nQ4=b#YF!zZT{nddi#I^G z!|;*<5UJfy!T}woKJ17JDHUznwDFPOgF}Ib)W6T2;s{KVMFoAmxnO*>B80>Q9Uq{5 zmrceRtgws=cLTQhs3Y0 zGF2cbu^7B$L8wD?RFK#JxQ6$zJYN-AS^vJqIp_4#Bc$P@&wt^fb9?dplqD=!wgpfe zF$accDWqxROHJv7cki$H+ve|ITg|Eupy9C;0;5N}!W%_}rJJV2P~ybHU*|?^%-3H- zAxQ13BKws)in2!$^cae+3I**CLe*C|V`R<7b%YMyT8}wyz3h3@>Yk8sl}6-uGcpPjCMVUj`Qk9TWsQ# zz*sf?o9(HW+=C;&4p!AR6Iijp$*(o~M^lWjDFGPgy+)6#;h$61W2>v6FxSn^n=tiz z3)X1TQegKF|NPDG?k^mD&zJ1l6OPe+VWHfTrix<7J{KIrLjC+z1~Nmid{L8(+uPBU z1Wd?-HZMY1eS$J?fVuCFq-{(8Rti)AR565aZJc`n;54o{fcq!DxWvynaL;xQ1x2k} z-keT@=6~DUcL2H;@LwV9@$i0=JdTbUYXRS{A2~Q|wMpI+U@#N-ph=n!D*Y{7+MkI) zdtd`FmIDuU`}pkxy}wsoUEQp<7{7PT&dvSJA8Oe&?p{9c@5m`Hr~Q#fvUBH70165U z*s)>-j2;csru}C8hxT&6#Aah(W%8D5Vd9&xy5}d2e;|?D4l6cSUa?o+J$mFNiW(;- zATc5JKqmZQ2wbn=j58CyKcPwXM>+9WeAApIk2WR%)0?Q;9%LBySYz<3nR>2LJU9C` zbX^^K-8!r>L?tsdF!|>B&C_q9Iqjw?|LQm!TVKbn@{&eXNC5?trZtKh2*k_Z{uGI$ zN9WFe=ED!i(5qKIPd`1MH{SRdP<;92!>s+WjBY*hIsg1oG=BSWdF%3(RbVRc^>Hz7 zd!T!afJb__A_(N{_1?-DIu>s8f4c$zz47;r3W!O_5@R4^B8>{Ao(i){fB>A+GWzTZ z@e>c?zhnHy{fB>zsPF&d!Dn z8?f)a=lm6S@9sL$JMK6jl#z!YcFPa{1&SCr@kF+7*ua$O(^VnU-7r`v4Vop7~dU~jj9+cjZu;=CqQloSnz5Mt-4vlZ%zl`@o{|t=%1HD zFc4t=_F8`jmnLV`p9reDec!(p9vs|QRn}?QX*X9>iZ1zz3lEdzhZIxZkX&+!n^w%2 zF#`-dc((t}t;JX;FBRQ0uB?ahRb``M64KX}oAHvH<~;di^!cqDUTe3hNGa`G*xfq5 zieCGQOjD-355Sub_Gb3-O3pkchuKTrdDgND&g!4Ttfjlje`J2l=$Tk4pM3I3sDzjQ zc>-_Evs`tW;hk>-Tz!h=jd>o|o~(F%P6&O*IamuhHgV^p;j_=)XE2bQtk8M}o@Yo- zx)9~%@b;43gd-Y*ueYb2q*zo@M;pTve{qe^;K7~v^2?31ZJWi|vBMZSav%*2njSs! z*}c1g;lpqC`2rm~OR1SL;{h;x$nE-f_X4c;jfT#`Z%M{$(F#c2t1Y6Wqy$hr_+V#J zQ`@19MYJ79N=gGURcosVq6k!xHf=cD$FxVt@(U)$o{!dDv~+;xy8bAz%#li!ZQy_Uu3Y`t^A8=X3pK zm+|!T&$D{#=MXCFEq32{x;2b{zL~7%^UVC1*a|nAivIV z=4AyWC3zITT+4U68r=N1s2C&n>^uFwu5zNPtTYlWH3TKs_L2+?N`6@(x%F>?-MgJp z@%(cNIq6jxTjJ8Z%~zGx2BfblD{Wj!R%*AOJnEjiFw=vuq0T}Q5^J|RF-v@TGBiY2 z1Bk8)_(Z0acwQmno`Q$}1+$k|vZqe*@44kzYx!VKDb^Z3m{Wo_hK4)tfIT&sx;kt_ zJtiC`kk^vSKKYavZvGu_&9h9KXLxIl+wbtoZ1*fL&+-T>#Z9vwgo-NIQw_B>&K>&I z=hA!GeAF2i5D3g55ST+SsFA7x8yvxv$K*EC1~duRfk1%4h5b3>xNj&gujjPWI()B*^3vG2u>vWaVN(dlG87j2WAA8CrM|SAcB>gyV7*iVT4BBD zN|Ep1(0U1~$S!Q(Au!sY^;WE{jlYM4LutXUmCg`em{|w{0tP0FKd|i%!Nqq!15~+{ zlD))l`u>c9kFzI{x;}%XxK&>A~z7z`Zf;&$zdeey{^&VJ(0nFEzo+b~P!OL>Fj$wj5?scAqNUwJ1c$82JU(1!Pq z8P2q_JGuMz-4N*IcmkmTx9ZT)pnT;Xb6_ZEqN=QRmA^y2V0b4*R=wn3FAKiHskZK6O) zbSVxiAxV<_Js6x3_QI3%_;6l17oD8PhjUB0@Z@|xm|IGfv4kc~ifu{z!Jg9$oe50XrZth()G~7;Y|C8MIXVX9+ z5bgDT#IuSo*VZ>OoN8ZMOc}RaoRu2n-l;_l=XEx}ayZpnOK7DvE5CMXQ=5cy1z#jI zS4-)fY6|CPP)kV**_LIL14(|*pHTTp;3vEQ4GoIgJ!{#t>0=@yiC#Shk)7Q(VKn3` z18M6&gQhYpNDnDMvL_M2$+2i*v>EGw7zvh8{SMHJCEefZ7JQbo3-I|>IDd4>3-o%Y9lFlMq_LRRr9WmHvjh@(J!2_c2nuqrHh=#?UrG3=<05Ov^Te&hKeK~+{NOh9o-AIX{Nl9H{G zTgOXw?Q+YCeS1o78J$i>yH+eJAHaweHr5I!RU~Vau z#!zM~kt?pihQscNIPbc_R;|eU<{KD34}h~D^DxFT`0)@*;wnE8RNYe2uX_&a>!G$5 z8xCWHAnk^yQ9rF9dD1jO!3&9q?O3BoO}-UjllXj1H8o-7kA6%{RapA6YK6JU?0jhh z6RRU+WhKQ&eg~l{+-=2JjOpuh0@0pd#~V&Bh_xZg%4=D^YAT)cT98T+Yk&F={rWwG zQoVtwK#7Biu#!b(g3mTf`sYiMJjoYZ1i$Yj7?9UQ6H|cKbuMGZbY;tyh+8P|W!PVP zt&p@drK^Ro;>NPV`*P3S6lDYmN8JC<8tg^^3m3ZY zEnSLz?>)CG>4Og(lKA!4&ErQ=#t%LKDH%U%6!%S-z~aS=`TqOwxntbJJoD%yt`T_Y zrDpMGmYhOGT_wZXTaIs^O{bg`ZuxYb^S7XhSAOLx^@t8{@ZPR0J{AIebtA1bJ1hJ( zb?w|rD`iNLwfld5pX8DeN!wh-&D|7PwUVi?3ub;U35VS-v>UFGoPAY35t4Xx$=#Gh zPK4Sj$X`N!S|@~##CkYs@Xsbz0ivUt=;!w7$-7Y`hWUbl`> zqek)9r=H?XDbYf>LrPjG#Ta0aQk;2AE+5P(b)$f}Wn6f29xu%)<;Iiq824Ez!MERz z&;PA;cAj96r7yn>MfF^LishBrmQTlq8T?o(Gso_s^%H{PQHH|XBkXzowOIV9EupI5 zFe*QLAE68x8LjaG4`Zz*DLF*Y7$#oY&L5p5OaV-MDi8_;xbcXSoACpQ*ZXA&JcmqU z{4LW~5mR^eKU*YLH_*Oa7H!)+%Hn^IqI`P`&c5YKLP=?qS8fL4I)+kOJS+LJLb9k- za8pm$Q$M^!&^}W#Fwf^>e5bGYICCS_BWZc<^+IOPuHl6j%8}AAVniOFeA1aggVx6y z0HvH6RV-P^yWP)W@vj~`GcyTj!NNtqva&Fpel0+S>k%TAu#|Le-4E*}5s}JAnWIyH zy{U>e8S?HEWlW5}Z7U2MfIa+h?2^UU9z7j_v~VHz(n}qPu)p|Hz_e)~1b?~jKK?X* zJPQ{tWWj>@j2JV97yt5vYXqKuJ|4g9Nro1-z{(PA-5h?X8Nd_YZN^#<+QfR!+dIC> z>ACY5vhZbwE_{Iwxv8LLqDwD>AMU~y7yoz9A9kv;LwhLB%@$PdRE&C5Qc~*nJalO< z7&$sf*It>-+h1D0H0PXL>+F~co)M(hZ?{gr~g(pKxDEto?tteK? zsW?k#U_5N$Law>y8cv)(ojLR7@z+SC5!lp4O3HB!&8(%)!Q}^YOR>iC;+#?{tl@!A zN~x>1h@nGWzDwt+H>?!2ZcW?y^C`OVbEeGkPzug?JO!gHtsk#PM}DDjgoZ7K?DNjU zhQrQ1b0mTdhiNtP3Vzx63!}Ck&L2(>P+hNLS_#o@;o4ZVb=nC|AHq!oj4|Y-g}Cj- zB6hskCtk4+QdL+fHv)BzKvcZqN2x_Gi1kvatC~S|=`6ZrpG-Ti4NDi!r)Aqhl7mV9 z2*8&xQwC)veOd^v?;&_%g%cFLsh6Z{wm=veYXG8C0Ec4ZZ{@a3iB03kw1Un>0THScp?|EsW8 z#8Bptp$SU3FM??wC}X4eZ@%f&d`FFPLw{?rS6zjzt;J5A`rGlN_n$fy8;LM!+&FG~ z@Ik)&?mNEw?mPZC>K=a0b)FQ;5qGG@45TG{|Ow?TM}*%{(M?E?AMHC#Saqmm?Xp8 z$;(sxZP~saL0Y=vi1q#fWAGXpz!*LpHHsI;_n=K1 z%dnFYNEq%X4*N~Q-?TqEvvkZ$ zAu@d}Bc@-$4Yxf)<)*E^s9L9NS7TAYbrtk)%pU{(ih5 zh-8ltF*r_ZHv%}5M>tL1MPIQStu!B8?o^jA5$^2LZ76?Q@!I2x8~p9q`6{0!JOJDi z+c%+<_MNzBf74WS{{-B7Mgd=LC}G{Ye=~kad+z$mEd_=QO;ExnL*3s(8Jop_`e~=( zi>*zR000w9Nkl_aNeX zo~C_k2wi#;k=t)auUduOy&F?ggKcQQG&Hzg-|zW_Qbd$OYE49IlH0YT|Ki28JGL|4 zIhPWc`3<(T6soGAw$>ftFt)zl*&PzErNoTBo)+6S@$;0MX;+XR+m4)Q={MF9l@=4f z_IvnH$YaqFL%8IHN69;T2SpW|W8|DrO;B_t5vBZ zme_zLV?ZywfJYz{BGpTB+lg`0M&TpY z{#m(}UMoq5K7vk1N_K3}tog>Rm0P8`W7bL<4)OW>b%)_MDNVcRwtxi`{~yT zw4Z*h!1$s8R%70VP4oWFfB^#tTzI7Vbkg+V`nv zteXnV95oBh_EF%h1Qa-`LY1g&9Yuk)jynOxWs9{6f~~;1b$0>^bOgLqJTCygOj=sY zmN+v*BD|%L($czhGD=wjfi^%EAi1Ke#8`#rzrSEW(Y1w+;k>BdDE|jg{y_Mu%IPr` zWu>A!CVjM9YX14ki8yuW09p$-0>R+bfo)2+(d6^qj%YYkRoDZHpOl1|J)6SQP9rg_ z|LQAlA3S)k;A)ih8q*n$8U!!C3Lp4YDDm|jDoWWk;rh`>Vd!=6)z_xh!l(ZtBZY(Ueow*(L}U9@6gguz;n(mi8n1a;kp(_`ql!KIH<9TxCZR#n}#~C zxc=`(LE7kb7^v~TUyp0b!U^9S{P3$WnR#OjM!CvvQ2sSO)a35q^21Ht0>Bv$9k=h7 zA3Z06iA}=BZ^48U@>j(XY6D~*^&N)%W)xsF9DVc-|HmB>xO>6fu3|TRfBv~+6iW1e zqHg=4mcQX7l8w!2zorCWA}1TzKMH&xC}yY5og2q(`dhzooZb%JoeTpmgNeW`2N_@Z z2yxT&8ySf!+a~mE5iJQ3h^4=G?{5IG_BH@M_B;&G<=k^A{`~VsS=RIj03$hRFDXt0 z;KM}NxX<)Al`3dj0QQv!(O1~Mt}Y?6D{-;+Cj=%C03qD-hC-M?{MnT;bewt=pg8Zu zTbR`HQrcdA4e7uBdcgVL_dh4@s4qy*?w7Af{rhruzfeQT{m--gl-poeQL}f`B6RP%I2(-rwwZdqLtoxdsrM{@t_OJ9;42T6R49G^yQtla$*M+O;RWO*^bH z6m8n%C;wEJerq{$>{yi6q*gr3Js)9@bk|ahXR`T^T$?5l#7Qi=Vg_oWiWAE8-;J%R!k%&pHr=T!m6Vk5=&8FANzZ{%e3??r#ox~*`Rnwb-S$~+B-;9Ce~04Tb7ve% z-T9vgAqXIiptka_U|W)sau|VNJ}ERH%})e_Ycb|(Y|80~swWZQQtHHRbf`5uD)Q(7 zG*cy&zN&6d-?kO>H^purc!*4l7c>S=1_dcAIZDuA5y`_J#Q8OHbZ7HF3k-%o#jKAd%y8|ivrJrAo5HW+YcA+X8GuA%l(*8ac1u~*bE zZdomxHShKHZoqm6hSFYEa4=Qne=~%XGNfl;g^g^XF0u}5){~YTVA7vYB{}PNG&Gz@Rp~B< z-})xGc?;NDDQK0}f|T@o$j?s){?S;KG+OzEz@DwJSrWT&|0uB0mZd*vgb<7z<1y*a znrbOHN2&utk+pV9V(qTHmZWYyDf`P)v_Jh!DnI`ZkzHX@T4$18R6@&l-l1y2e9G7S zKtX;hOl7sZe?m>N(n(62sJyh01hO*eGJZU1efkjIyqRBy--MCUpU1i(_qX5vN_BOZ zi!SQN!i7Z$;gRP*hYYrhcTj>p>X)kmOlk5k+a?FYQEyB_$oTi}D}lymvDC$PJso^|WWkkZ4G z3Muq{QR4brZi&fS9}LQh=TX(I8`*vy7H!%@RYe6JmToM(05%oX zv#s<9dL8Mk?De}xF@91{wmtYLxz}Ao`7?hfIZ090a36~n9?KbLO3kz@8_ud-jeJhr^mD-<8~ZlVZVgMK~;Z{RxGZp1)4(VN3vHJgf;~v?eJ% z$eMq{_hp}ROvb6?CAFd~QbzfT#k5RMX7|{85kivIGTrI3uUtXx*t;m`)`uy<4;dOc zlb_1IXZ4x?ru8w0vHisbSfy!k#_3pXP<3@NY&N}bU)qiw$;L5bXnpg|6MM=ocnTiF#l>a{E{}Un9p;Icmc1dz`ldxDWc;Papo}Wrewm}oY zC=ZiSM=&LwEgLVOqGAI{Nx4{?Aj#YmCEg{m_Y3R4L*9!W!SF-D36fA+$8lM#aO=FM!K zIFZ)Fhf^|T3K>To1^yI3vl8_8SXGQ&fAA=AQ&ro8L0J>m>y=WhUHcP9_3uwG5a9mE zbI9ACz$(d8!5~368bxM$zHh=i#Go8Xow!yXt@McvfqNgqy?-QD`?A)32B3eKgSCqKc`XQ>cpmRv z|9k$?D(sH{MC^S!e+X_0kXj&_{eL0(|F4J8l~*1{ixw?n!_TSb)iCWx&Be*@P<6o$ zwyYdQs~b8|ZToR-$0O+4Wih$Ashm4Bm5m!K-4tMNDD4D+y+vXxBzBs>zPk^U7Wn3S z$)+N~fWC_BFM?~HttE1)Aaa&Zb{T<;Zl$ymWfhSW1@l1c0%M*2+{(cr+OHR!xXR<( zzG0U2RE&MqW84k(thq`ua0!fkDad{IHBg;g3C3S3lCGi~rQA9C*&nL^a>EU@8$Fub z!Gp=@-=AM@zM15#tbL=*dn35y-k*Q+2#+U!&ESWc z5JJ@PkCVrf5y)WI#tiCfHCo5jnzb=xW`t4NYH&Z~?tj-M7rBCUw~9rT>2s22D= zhTwxE_i*WUk0*vTP~IjPr8SER!d&u^;^#j`Sa`Ii*Q$CN0-6+)>UQ!$%vcmVgorf& zS_tH}ZTvEFBqjmH40Y=kYXA-fB_2QiQFiaHWYeZijZ}$c;;2VDRbnOM;-p==bYb!0 z#RyJUtV?*4rIGbH{ z3X&xE47i@JrX}&ohn19+?{Ijj@0cSh&E2hA8mm{&qU)N()sTY^<*)qei(WRa^wEkR zJxBfeNhOgun^Qb^NYTJ&U*5=#&s4hdXGL5KA#oJ|r>_frMCdNuH$ zbAueUwVoT_^qAYXfljGlF;MFxJ5rJCr{DPUVX?-*uiQo{cO6}-(=lcKLqs{9Dsk)9 zt>fy$(pR!o35vv0x?OR81CR)5IW|5-$IhLouBs*{H;1GlgVFx~JRledP+ne6uim{# zPKkR;GDG2^)fuD*f*jwm6_>aDJzu<*#VMrdm_IZ;*sNKH+proNV!KOaTwel2-tQ+904-x!Iu zegmQtxd12r@xTXQCm%xU{|AD%bLURGSHZ)CLKeM_s=}y*b+bML2Obj2*bP|tJe)8R zI0YC%oZyNQTTSUM{BtsK;nsbr5jRz)P5f=(?bQxZZ3;;yeol;*Na3XdkL=^w4)pmG zQR4q5l$Vz`d2deUTlw^#@{Ntc_fixHg&L!*|2i5J6dZpN59dr~t2ktWPdN9 z!_5EefY@Th!G=9s{=Kkmvv;)@G2{iyod9ibKjKRNrlFmi>Daa-T!-V8_Yr@uBy1+w eAOHU*0sjv|!v+5&0000A355T1Q6v76*MiJf0U+SqX&QwQQSu45<#LWNo)CBn4N7OD{7xW;zn*p}@` z%>l{17g31xkMYLrK8hbczz-Rv^cy0A!G& zKnhf(H03BuPC86eG!0F24p?^HMP-s{`i;~6nH~oX0Qmv!z4&r0|K<1dr(rY-`EoK= z%wz0@d=2BiWM=jK>y6^)kiR2pe>;_ko$WYK{f)@l5B+QkfOT2^8S(<;gQ?}x`B}1D zfXsg8GP!uH4?H7xX?-EJZ^SNRPd4f8xvYur5 z7jcQ&p<9!F0`ieDioYlzI@qp-1k&D1b3{81`9|Xg&BjFY>Gpy+ieQeas+nus9`TE7_ZlUg^6c)7>>mHA(!hM%$1WI?i3tCS8zy(guF1B&h-g@dILD36-le9P*=+8g{X*XnyA#H)B*bl?D=$#5tE-x-X$@jV1B)So0Aw^>0~~sggr2Y3=H9g)E@5cHOU3 z!Aun%G__h)rHERsX>cQ|fEg?Exsq}3zbc%!0h+z{9tJ3&$?#-MtI~ z#^o?1QPda3_gwgSP+0FpxH?x=7E+}*L8VeSd|Z(P8$~ypCTs|!apib8Tr%uZ3)t3{ zocM0?8Pytk=ze%aF2c9DnR!AUlRoW&OSBq}>Zk}iz_1gsh zgE)%@VUGTPf{kL5*V)S+>NPY5#?v52%@)D9iN+(hirEzv#-qf@St6@=(Zpqvgx}=b zz=us9CwkY91$fZJJ84AVhSy_t(Q{-mc^h{33zP50y>u0_XyYsu`q<BW%*6$j7HNT0&JYRa z@`-FQw^E2FrgDWO(uzY)6#a|ys_u@{GLp)HOCWR+VL50V(iHdt0vic1!ukZ7A5rE> zjV21kbS~>WJT?9QuScU?Mt>@iT*<@=dmo;L>O?MEawZemL?Kp6oOLd(I_KlL#au2s pMJJF$7Ugmx501|Zk3mk*Szt@Fihf=%;vy{Bb_yqiUtf=*{{ZoLH + + + + + +{ + "fontFamily": "lg", + "majorVersion": 1, + "minorVersion": 0, + "fontURL": "https://github.com/sachinchoolur/lightGallery", + "copyright": "sachin", + "license": "MLT", + "licenseURL": "http://opensource.org/licenses/MIT", + "version": "Version 1.0", + "fontId": "lg", + "psName": "lg", + "subFamily": "Regular", + "fullName": "lg", + "description": "Font generated by IcoMoon." +} + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/lg.ttf b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/lg.ttf new file mode 100755 index 0000000000000000000000000000000000000000..d33b8e5e8612e0059a83354aa4b80782acf7af14 GIT binary patch literal 2760 zcmai0O>7%Q6n?Xt*iEudV&|8TCU#uM)PXpS>ljL*p+YT@5@Fi)9x4Pl?qa8Myq4`q z%>l{17lA~9MjR?QpvqaHs$7uZ&?7=zP@PB|fRJ1eNIjs!p~yDh%&t?nQrmH6=Kan4 zzIi)48)8J%MP-s{=Jm7T*&YuK!15jXJE_%V{_}4a&JwXv=vUIoVjgoZ^c$EDq_gYq z-fR>Rs`gC+LgN4`o(M7w5=v2|CX+pEXj+j=KlG zg3j|ztR^q!X@usXSD|}z$yNQ{*VmSy-zAc6=8a+rJkdI@b3e)Q&+J2Lhi^mr5ta|E znf*l(*1_Xi8UyVI+dR>pN50j#Me{N`oV*sz<`n`*<9!r9YnDaSD7Dc=*hf$enL1(f z?u_gl+==YucRt?v`}fAKYtPfDH5wwzecu(~Q}*1##~OR%e~$k#etZ1W@zVJ4m@-DA zHRNmMAriCLWh|v2}OE?VOFxMUMt2{S!{d zK>yHS-|W!fK)=)Bp9oGykH+Tu5F>@O@?{|Mj{tIaw#6R>2@h_%L&BQH7lM~FyE~Gf{?)QFcPuN!#>{ygx56>5BIPNe4IO@ZMr0f zq%FLu#GFIUpfeZ?#)e{Y=+2$v%|B_QDZzv_2})qUc(1TVJjotw%VNj-PnPjV%jO~$ z$6aZ|qFhVwa>gE4ecRJ_UFZRcK1qYtEOt24dQ|c5mN#HWOdL7YXaVU75n;6d>w zZ}Kb;v|h_&+4wT(n%xtax6%2`d&TbD#(SA}v9c3)*ciPbd^=vJ!wM9 zO8A-z)LwcSXP&nvJE7RaAnV@e=Aid&nTc47vqVnzqHUK+VqsfugB-VIoap^L4%nl% zy^}^5Zg_#!MbDALmR)$d*KD~P_tJIftc|l&=p$QZD2Zgt5_Pkawk%T{J7UXikk8n1 zI}Ng@Y}o;O%$7UpD9hV&7oDSsExW+x3tR4{SLugrnzEG6luG&Hv2ZxOQp&6?Pp6F4 za50(6tmIM|!^o}`!r2wXoK9x5dSRV1RKhP$MLI@d{L-`nJwt1>Ow*JigH~ZJQWA0o zzMPm1*t3W!z?X$JE%Ka3R2DxS_H_%hb>-5cN=vjzDrX3SMqbYqjkQ8bpEe3<&`Lqq zi{YgOb)S|+$^bzf&_%#<&=j<3$OQmf1h|F!b@VV$7D(0fLUF~&d5=ub;3LgB6~WX% zn3s-V`HWRAYdoW;*Rsh1ok3t47+GwkV7X2ixso@n=k!9dq@VXLuX`6##*$&=rs-IluxJgur1R%#syKtB}8)QX`B%L-`8W>|FhvLHvj+t literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/lg.woff b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/lg.woff new file mode 100755 index 0000000000000000000000000000000000000000..bd370be88d40b733dbacc2e04819ed6b02e3c292 GIT binary patch literal 2836 zcmai0O>7%Q6n?Yo*iEudV&|8TCU)G!)PcCI>jX-HP@$AaiE7%l4;6wsuCY@&-pF=D zb3k(MMIce25eEbZgq&4Xl_MN_tPmGeClUuBBo_oy52$b`*yek)n~+wt9p}xw`QF?2 zy?HY`o3~F*Pm>_D)-G!0vE`OEXZ`+m>P+|uk=O_H980^Gx>JkEC16?1udsaf^~{+} zvdGv!n6ocSM<%!O7Lnp0YI>dJMx*#iHk~|Arh}FM@ZU4|7ZUX)2#wOaq$&_YIbNUwt~aWE4wS z=iOaD6`HF4Al|1Y_^c}5Vg8;qir*r+JAUiD_!!JDgo{c$W_GHX>;Tps{&pJTvoP{l<|c(6LVH$F{1J>FiSkXZ zlS*-PYgls^Jw-2I#eQC%hu7!l1$wZ;h|7a@NBqvc;E12=VHr4250^-k#aeV^baW(I zk4HyGMnr=j{$Gw`{t$D?o$F0Gv#^F~_SpK4d@kZ@OxQz7m zA&^)*==WcMdp+T0cdw|x#<>gHpi62ctlD|ld z9Vfq+p2YbJ;QU1+-6}*tCL`Se9{n~Jv2mqhnr2-$b<=DRD<)J7aS)It(gGZIGzC53 zp4i#DCa`+INdgSfKquk`qRbTN-Y+2~QPs<3y;?6<%jK%FUM<)4a#a^k12%y_G**Oj z56J8TQICwPRPdyZ2&P`G>PlR%)=Y#ERltmu`CO?~rkB+Vs9`HA!QY7hXBOopM;^Ql z{5W>e;O=D*u`Y*Rg%Y6z{w~CxMT^N^#Hv$OZ8lqa4Xsp)#ZG97V5h{!jte`&X;?cE zi@2o*PfmO{g{*4zK5#!gBo`6d*vLI5kFk*X*c|vCh5Y>Y!pfWN$N!{O2Um-3 zhi*;p9p!Dp-%8xJvf&x|J;6qCQ`b1keXYZ?SQtNsdBT=B#tjIMEEQWAV=1%9CtGlb z4bmHQmHrYP;#J&5S4CCaQ-+nCat$8L+CeYk%yZkxPEPEuN3`wc=A?IRT}WRmXN6qi zc^g+r5n)?*K#$ovPV{aZC-A6^w@|;p4KKM`=^1j`x*NOusjau+-v1JF;ovMa`oPu& zN}|}hLT%!Nt*hh^hi%;f{j{w&QIB}S)}6p7ZM}t#iX~fbrLz>VbvLs4+}7LZ75X-p zp&VthrP5OISU8+nC}o%D$5X~)xR^|37xJmBVdRzz;oJgzP9}4?bYX?ERKjnGigb*^ z_+@AT^DHgXJdIO|3|a(Qq$Kn#Y!+89VRW7SPoz5)hk_9>q#|$`fSW3Y%O&j@= zFO$xv3&~RYyl;NRH1L?l?+Lp=^p<#&vVO zxO1)g$fk$7xH(SXc5U8#%l4V?O`u=f`;i;Je&eRi+~+wN*FjvTcHZ36*K=;$*HLL7 zuJ?=_8=ijs(eM2dqx%AWD~}8xpML8tw8U*UabG<$apv&j|MtTlah&u+j;nrQtTsHV zd{uuR?!AUzc?=n1FM9*+QTwf9$7WA^p3^>z>!)%3yNRih;jjPU7e38#;?HpX>tn;G zr@0rIi2KWNothjzR{JXZ)6*Qcc@B9GPfs16{rMdaxHxVL+7o}{j1A+P{boLLhiCO~ zIHR!^-@D;w^Qh0!`K{N{bH9_XHkS%b(R$(2&2w+P{?_Zf-)V_*7C)ksbDA;E<782B z=HykIMHtVqhd7B-**10S!#cg9;m#xS&2@&4sROester03AXUo0`HYC3r3aZGF%p8$#HqiYa8abgX_d>bYYwIV52SL`Y_^tuEdow^UJX| zE4fwNYHkg;mRpCJUC#}08@P>Ffz90Y+!k&tcLQd68|H2Yx0Bn&-GnWDGj|KO8yk5q zw~yP8S-6cmz}?OrhVDry{C7c9F zV!SkL`hXy>kdKo?nTv`4FV6QfFWb!SVz2OR{QdlQ_}>W`VWV(Xcvv_u{7&2={#x24 zeL{}Q2jvB&PdTir>X`aD^;z}X>OZKz)52PZHmNm~bN!>MpJyeB*p{#5wu;lGcVkv)-f zk@@I#(UZ~d#=2wY;&S|O{OS0ciGjpW;{C~gZ5e18YI%RlCtBW2-GbE=u@`t&XLZnW zJ7^Di>sUFTRWfo5Q}DCaG25z?1Bz@FD}Ci2R>3dtVTHUR2MT#PWCxuhs73b*`J8Q) zONIV|Q^v!bW^C)ZFq6eU6h$$UXH6ML7T>2S~_?+SHTc5O`)ap zR2J;M3XMLybo7=`$S5>X#icWq4~KbCd`RXoR7vWmp^7SdWy)M|C?*%ox4WfwaV3>yT(JV`DEgOw{o|#C)g9e^*AhE(3#at6Svr`!AgcvHa=iFX95D4^c7r*{b%;KnEN!CPDTy| zZAA`R#lA|Yf@8VVpBFOuQh&MFXN7_?%WfR9ce-PNpgEXn+c-2l(7AebXUFQ*>~DuQ z_T+cE^HDb&^bKv?FkJulRdl1Ha}{wj4;N*>Vwb>qxtx_?ovhSfDP!TVq>Eq5DOPY< zDfiiyhv9jO?0nrU6trx1|M;(dHNMR2H+7j8c!`%poOp=|VS6TQ3$i964_RWkwdbR) z(Q-N3>i7GTrpp~xc%EmfZt8-}M+5O>0-r7cEvXE5lt|P}wnE4eCyqiOU4pz=)97is zRIaQ=Z}YUl3QM}^^sv!C=ZKlJD#cJXlr3dT#ZocE*4$n{?1}ZZhDF0<&92(v*saRf@nF#pr z>fg2ve+|jIg1yNuLQ>`+$GAX$K1qA?D7c<713sh=Yxn9NU6Qr;>-x7$PrzJdggoZA zG#ajH9Tl5H;APjB~+tW{d{*c>c zN9{;lO)Hk$?aLGmubnT+J4x6vfKH!#`DJ$UCf^>?H6x?lGlMbZ)T2FTYIk zljDk*&x=5Ze(=YY#39k|CXW8=cvaFheDtDSzsv43C~fRy$?Ola>{de(c-fSc z?b{W}R3%MHXu7fA)bzPIT{HI^y7tp2p5VZlK|}0y(18HlZQwcpI*kESXThyk0UK|C zOonb)DVDM}euX9HK=XR>Tp)(t$uRdAh;4z{RLV>1RIYKq;=}T#v3|aOa3_)isD_Cs zLh3l&3dugJGB`MT;K1nO@w*2OOddG!+Tb9LqYwsu$O3%)*v{W|GA9QIF+ZXo0znW& zKMs?Yr#|ViEKjT374Qe6lhL3*;BvQmtlZ$>p#Q*u1OCDKYlCxi@E>@5P=s(1#6fD9 ze*^ah2P;?QS@lP#HFnHn#R6_uG#HBoqb_$KW?^r&bM5R0><7?3Nc;t{bMlHz$BdFM z5JSTeb5X8XU~f3~RV-VE0KriqsarrnuyCu$zT7UE*=$VDOW}QCDX+)k9h%yKUp^Jn zqdsK%qIxWwHKq117s|2Nj##W*U|ef7U~8#lo0sqC;JxjMxPeXEo{z*lS}M_w!f3WF znbPb)^d9sl5sM|zCG0I8t6pI*vKOI6^`P$_UM}Rp4FIv0L9jRo!OenJUwIvCAcR6G zo9BXZCf{G~V_y#jB0;Z*Uk8C}TixsB*+hHC%62yE@prG+fh-sNVV^I|?hgjSyvG}? zqMW|I+wYlW?JGOl6SMOAZpeE6EslygGP!`ce3ktIn%N$b$@UdkptyO(>0Ntv z!0w{ND#*CYT#>d`$ZE(Gg@8>1dNk!ETgeNO#F)=8dD~EZ9>J^1QgEQ`QB;}9vVfzm z05>YUZbZ$9tcC)ybgHvE4|0<|J}a0EL=>0DYnZ0t^|%bR zclm~(tSCOg<5q252zo>&NK9e8YK8;xi0$<%pyc+h-b5@D3_V~Nrq7GE+#WA1C*X|wIvX4caKU541k2iaCZ^0cSoyecYY zA+N2drV1;hpe2fuDBCVmXw7Xe2KUEunf+%3J)2vR@OAjKt{sC1bL$={goYz61x?Fl z0?A%*2tSu&ud}Z?*z`7-ikc#W@S!a(y$Cqy4UY-YH>eP^rTY&1#U3Y6RVfgYYwmcv z&yld9Btv;B{i30Jyt-j|+y*nQqzQ=NmAtct2kpJn85m0YN9NQ+E!j> zBFgX#pS`Li?@#HvZX_*3UreyX!>G+?n8;(Ni?T~nOs6?f(Nsa=**~KlMFP|WSd)2% z21N;KI}bXHvcCXEREV21Y+fS1fSZR5!v4t0-K@|}l-Nhx1E|5xhk{8`THK6MA zpxA|wT~aDaAyg4?#Xk1H-UmK(cGum>yLX-KKD+l9U3pa1d(VNJ&U%y3 zYkU{CB7ms#ZRiDy_nQ<&w-zz&VnsTKg6zKt@89S3rCLkd0{r{-`Mt?}Y1`edSS;Ha z3z{xfF*QY@4QQDDh}Wy?E|;ASgj}Q)*x6_hWn^qk(~x9IHMEH3c8OSaO|oM?zt^oQ zKl1qZyc7 z27!=d&8w)I1~Du{v*aaI(+rm@ghdgtR#B|gCE8oCQ4L_7ob5!@7<5n<2uta!6fl4N zn3xLkX=;@`wo!9eWeN`3zrxiRpHFo9ld8X^C8))NZ7um~TQH#pTUz{T(%+fL=QnTI zxc-F=1M9Cpc*nsNmF+v1mn+M6>@2NdTsoij1_py}V9r)|a4_ISMkaULhQHjnVZ*=+ z>o;E7wxY7Uykl2sc?H5v0Dk{A`z2cro)Cu2;QS3F+1%MnFVI=y3eKH!vDBOLdV9S- z--X_k&)e$nmDaYnXP!YeY_bnQ_jnI%k+9Z~iV779pcttOH{IlNxr`Ch9KnjZp4__+#N`@w znWLs@f^jogb1$&>ur*Ydv>Q}|GD9s?*gh0>)pU0aC)eJ6YzBIJtK2q&>!f zzApDK=ctzzn>~5xqlcb+^536%=7kqfh6n8|17H3vtfrlqjY<#mFl=?Z0xi!D1+!29 z8{3a`C}O$m_;OzhZ?V1m&Xmh%_Jt-U?op3~4N;w&Q$-nAHawy?$V5_u6efPlicuCGeqxF4M|xGYmL6NFSPm zJ~Rj9o&^8c1P#L(I@AbKilFE?=qKo0(`BwN*a?eDW(@;FA;jI6V1?#vq0XX2e#QV~ z(Lbq!a~YpBm1bHo*$+IPz5Ta%Jh$}!0!38C_@sd&3b817obH9tR@5Vkt|A#!l_ULo zsRA7iy3 z@{w|CCmHd^reGnV@JH|4*jA`?3#KUhceeIySa-v2pT}3!1Sv2(} z-}Sk;FR(Qq$2dgLJ#;AcDiHJa+{d{;0WJ0yU^BwEhtB{I0F>nmgb$h+R0hAMuS0Br zsRCJ-x|_pyZY81hKsP8VSx3+*GWbTrs)O4}zEOQqWv2%<)(x~vU#N~{Z1r+~1v9gF zM_Ou~ase9w_A*t4zRSx3zy{L=XbGy%a4D*8cmtlGFW_={T$-AN1l5v(sK+A;iezX} zPr@*B?%t zZ?UagbNIVmRC$>PkmIolNb^=i05?g1Bz3tnKCf!P(kG~j+s)K~&vyI6!9d*O^0`cp z>GpX)Z+SuyI|O+fkPX$8q3Mb`58MW!?)G@PT62Jg5X2sDz-Rf~E>(raFYH%<4;_pc zPjs}kq%>)3>sI;$4-0YwkZ0e*UV@)Sad0e6BCQoobMw3g`UR0(<49y!u8^#wRWJbbcR%IvT~G5xsuH;wZ-e- zh_|)H*~WNV{g-Fit%^T$mh&N!5aD!@Lk;(zTIHmhJLk}U9DMj^;KK@fmT-KK8JLm# z%Kf~f7FxlAn~~Mg0vj%MLl`y8lMTR@6#Wt)jm@DlF#Bz(Sp6j#Ygkd zf?OUQ_&>>hh9dWUqyAfzseR;oe9U*!7MRC8srsxRVW|xOeCP@^Q9M`WHnDlg^fq|= zI7a&}tAv(0PlXw~!7IQ=mX!)wXH$a9ptDL5hW2IsV1l7#U?cZ~Z3`?UNNqRI-rO#V zAts25P?|nJ{Yu<0;s*POAOxJeww0>}2Ujicgj5t+K#+l_-t(SMf84la;13-DZ`;hi z&b|(-3V2+Jo{+$1r|EYvD$zr zKHY;nXf?taXb$3=P9Ow>*Yig974{YQQwdisI-i=Y(#lcWXxX-$=D#vDq$nE|WoSs1 zVF4Q&5`>MkW06pWjmr5ex7Edb80r^G0(8-OrO^L*AP5E2$pwmbsA&7rf-mhW3_atz z*;QYtvh$Cyc}o5Zo3C^1*dwSXI`tM%PXzMuI`-Ae6$QIgs6fZDl@Kt`(D#nj=c{b~ zk&8pc;#N@ZR(pueAG_RI{l`OH#lG$vGR0ySZjq0k`n1@#3;ySj)3au`1i(!)_tWo6 z+tuoj^LJIt=c@|~b93k}yxNOxlC8~y7GsbY{p4$R+9G)B@aQ6Jm_9fXgdzk_HULD5 zZ2D0N=U1S)p-#-t%?+jKgGZ+phEmlz=gK+EW4y1d4(E;HE+(WfQruKYAAFwjb6iWqY{j1ftILt|-fw}s^&=6}3|LwFCfG)G7Pck8pe8c#aE-06~ z^yh7HjICN_9DYlv>3=5z!FW6vxP540o_qVe`j)mVD4~iCGQHg7v7wL(!>$515Se;=D0ay?Rq=96|P2K-Fm zboRg4j}iO8RT|zUvPY3s2jGMZGjhJtkDRrDJ>5VBFx0`P<7N&2NfI~6LIT58UU4g6 zEwC_BRoJhbZ+0pf6S{bz&%V>0TpjD{Ntfc$jwie+@9x7e^~MuYObrHI?qsXpGVBR@ zpl5@vxvhX;_?3_P;TSTbdKjj{fX5I7Z_4**pe~qDPG|>{)(l-IMY@ z8uG|`pkl@E_l2-)IOUo&p15k=)1|cCr1C=Ze3=F=I(u}8J|NkvD62lSfW2HjkKfzr zs=+xI`BUWz%X{#PU%ZN*?j0H;o_if+$M+#SqKJZlRO;p()4d0B=`y5%I3jUE>Vn*f z`=m0Ipg1^c1B4ct=0ohcZ-|D%1mi|YjU-L4*JRT;W`Op(c$R_%4kw{YNC{mc`vb|P zF&q13_VFMn~@O5~xi^7N@ z;&NDlTso8v;OB5wVnW1Si4n2+RH{A)MsXhd9K4g~F#Xl@3k&DZ52en}Gn~Of=c}oq zI&mXB2VN^~E04%G_)^*s<3WBz=p_x@AuFJBg7$#?i#jK<7gA-)4dXTt`yytCUS?bD z)z0<4ZDZSf>pOERm*2m9A&DVuQ%7kYZ`STFNiTx$RI@piw?*n{hKT)LENFUhW5*a2j&Mmvjk zEwTkPkSZKp z&wm^ME%)EIwnuxu3WOpyQZVA9Ef57Aa0=1xdfZ>1 z^T+*uH=B1OY$zHSnww)Ozk42+e)mH2@Yh7NW ztd*c%(qrMU0ELsj1U-p#r6QREX-_EV9l0_nDMO2=deC6u@?(EF{i*32R*8xzvb2jF zG)}mOsCl4ON`}i2J;iQIRAcE#BpOJ?RMF}#hF0C6w5%zWSFaswX`UIkV|seW+R;EC zV@X3LB@|{G*!(?yNff=h)X~*ynXZ7#mLwY|Ba-RrkX+FXfzhXzwuAOCzYGz9+u1Yh z8M1ZeNUtZ<4RZwP?>&r^?q;4$VN9zSG@dfbt2c-lRu$KoxlSKN$C!@sxbZsG~YH|>Ql{IhlY8zk4z>&x({<(*(7{023EHn5j?Op zG@uD_m1}ue3yww;1ivOo7NV0nP{d z*%chS;aY^FzT96hjGa3+Z2V*ErLLFkm#l^R7OVreYEg~vysuNx^c_141D5B-yC3|C zweMDqX#(!@C`HfHFU#9BW~2ytwguj@eTdE+Lj)!Vf~0_>JVs7?H$zIjRRk|`v}PZ8 zPYwbN!YoVc=(wWO6~qzr<9-Md4%^02*n$Mo?f=U);8`rt8xNij#(M)X-j9$du)@6C zU!V7$_s+va>VAuJ`&kt-#mk1g_3r>X(;q~~+Y{`OK-5b>(i;tA(ZatH#%5l>d&ukc z*5_!`GZ@TKul}_6J6`-PILE6KM6*wF6Kn^23>*PAXxf&r3q$WG=th#K!g8|P)PljG zpnmt$FWLgn4Ztw!1Q?Nvn9Sm6`c+h( zRidijf5#nuzlM73!8599sAp8wZ;y=HevKB5Va-x(0W<=njfeqoq(ZsR!UBK?C}jOA zLufGWV0B>rrk=A04-RzRU{#W1t8c&e-rL#20OcM$d$2Q?>R)~KxwDSUZSZd!Ht-^z z&}a;%a2^tdRHur=TN)@n1fhnnyiIVY!$JVK>)SH_*|P_Q3-i^g z;PMU}bhv$-&7%}Aqe!$`&3`-X7TQi99Pqj>%%O@P96Z|(nGlCTka*<|ZVhzl3z#eH z0@C~&;)67Q5En@lC$!F9M#T5IuIop)w874`#eFFe3MSYnOLq2c+0xhP{!ecFb%qj& zAcKLQWNRPnKz~PcPxhNmmLTgOs2t;T*g74txr%*=R$4%ClFH^R0vIN9?97d$oSU_Rbw0J36;-%SQ{oWt%oF^A)1h{~|EPMPLl9 zQx4R4*)3ElIi_640ahtFwAs9k0V(h%2NBj;E<$~^Y}=|LQs57)NK1EjOFZxgplD>+ zRw@>_kFopw@n@`1rp2}_yG0V@UB2$M-QHb5Ka>?pr)a_IvR(A90D;a%?4JST zLwp316FsA#p-$$LuuE1kA5CkCg^HwGmf(FW5rl)S>>^?w5X}&+Z}<59(P+TuVSAU? z|8aTGE^h>ezG-&O>j~9=0cSRw>koNo^Li|HPYJkku4HdZyIkpJABKP%$(A31H*gvH zu*ARza>+~C0!_J%zsnjjrQy{DR;?hPE!3+HXPC#a{#|Gb_!~;$1JFt*`mnhx2xZ~u z(ep=-I@#yXqs$OY7{tR3ZXf#%`vUgoGDN<^7DPHQhD)nu!3IR&pA1$xn43wsgRw#l zbwYm#<@Hw(v4^3l>CUK+!fQ4Ljp8BUV6nCt9;{(;W%erYkGC27{(L2&IX}+KSkU*AQEwaDUFd zjGU(R6453W!50K46fK*^Kwl6cMgcPzLgD~7ZN)L&V`pda4TccMvx-MF52#g!GK>~1 za9CiR5*gLMlCdqiwRIj>~lK>#DPDt#4%3YAD@E}#v1 z8u=0kV<~0QCY+~0bwKb0q7Bd;=gV$;_U^l%y}SN8B2&CB-PDAD6mW}SN!C>!PI2h8 zydk%krX;v{4fb%|h`=%j(JF={7mV+ zYQo|!D>@G_<<;D1!U?Hh$dM3U0lX!9;A2o!$zVP}A13)#MYC@a6>lH*KXFkQiIA~{VW)=7oR2JdCeO2^Q07CsW*fde6G|ZD<|~G#r?GC4QNHE z7({)B-TD2;9{c`dPoJNLQN6xE;&&I%A?LC0*Z&?_)92eL3-(bw!8zbWZN8($t6I9c ziAH}iSd$;4XB6WIJer1&Jd0JZE0^}L*zWKnUwrtfhj%~n?4yr%)a&1`KU!}*Zt$)vvmuX9=(Z-^jkr{v$Yl56MMv&_an!GU;VdFl2=NgR7F82f=QH+ejXj8n~4J zU7?b;*|()O-eC2gD^dqc1B@Nk%zLZwu2r#f#iYDkPJ+t+M~t~+Kya$WHtEV1Nn^j& zOjEn-R-V5VagsO5@=b#9P)|?et*jwO9?`r}RA`oB0%4DKWKZrLvWX-S#1N1bq>~c} zPiY90YL(4hC6?wIX6rde?4%f-=9h>hm?BXCf~Z=>+%U{d4s-K0vcXf}1>pq>D}es$ zpw4t3hORwm2%;u#l^+DCG1#QR{>-I3_sfE$y{HAPjDTs={*C| zmK`KOj<05jFuA@ewxfFyM2EC=jx?VDdxXM(IGnjXh%xgA!KeAvIP@cyYPBGIX>~{a zN6WI=fIr3BIx6j1ge`?*R?x^=7L!yek4crBBUL>pT;I7mo9oRc5*|sebhO!#9JIk$ z(5ECE9!|W5XyhVLdlfSYOC2eYj(wEyO~Y*0bc4ZW*YKadYsatZaHA*ULH?G^M$ zc9`L17aE4R;@x`A12b*~X8#&?>P;9!Q#D(I4mX3z9bAUcA698l2d2BwPZUC(Cj$YY zGH0BHEY8?oOYd6jl>E5tmZiByL0XaFmmY>Dx`*t33&>$@1& zGTO5hM2N~E0I@}CZqjZ7TXr#@K&FKO*+mdpsI{?sX+UqA3fkN+(i27gwsbTcj;3!z z#CJ0z7>x!o6kr#oNuNSYrYJ9t+zAf-R1Kb0P!{9E;mk{!FoKz2YD5kO6Aio+h&n_0 zw5c>lugH^_xIv0heH_cfNpx^*j#<3PKrt`_;BQ3l&6xNl-33!}h6&hRE_zrI00Mra zth0<@vRFO|zCvee=)qDLJBi=LPmh-DZ?A|<#zA>+V0)UZ=3X*Cm%+{ zX!IC%?T1h_XKz~`Pj3oZWn9jnp_ap0>P zghcx3xF0sv^KLr&-HRgq*?Vt4aQ5th+tt<`F4`ZfsK%YQVTSLT%Zl*GK!OZHcy z5t@A>HM5XS@_j(x`FHQshJo7-RK-Mk6?G0)-*@X3bty(&yWA%vfCLw9ri5ME-qs@r z3l%WgU@Xo%PKa>ICaJH{@w;ZE4?-3EpsZe8d*n zL_Cc@r0Gls^mX_7)8WJie4cdLLnODT+slL?5%mb;OGUDQhU^l1eBb&P*6*tiuisbQ zx1PP~T>Y_g@d9S@?R6WKq(&1gx_*Ckf3^P8{nfu(zn{H|^#1jK^&|YM`%za|G7o>j zkg>Qfq+KIUoRlQe7!k>iuxiK&+k#gxltBcwOgAcJ(s`gqK_(!=J>y2u+1 zMy2EJHbg7~3&@&;w+$#XK7d9M8-qA1Cd#@DJ&xg3M*t1rKvH#J@sU*z-fIY;9XHgZ zyyj97q!f{P-S3J(c~VdmT=B;7UklKqa0Pz}8iuSF{F2Kwz@gm&Ub$>)dFZ|h1<-G( zh7U?39)i!7CQTk(*@Lb_rS#ED2$CeyC=g`|VJ<-f6BN-DdBx)bB1MD^lMUGy#+!K( zgKG)l_o5EZG2tVXUi%akT?a=Nc_?MXwq;57Vumn*=n@>Yx+b{bE1>swpu&lWt5jtb z%`*j0LZ@6%1vO~1fnZX1p$TRLWf7x7_aM#Gjd^vSFu`Zg+MPs?#yi@FMq+-aak6tsI@bnxv#^%^3Nt2>|gslc7 zKySstTzE!NUNz}eGV@jD5;ax4A9&is6b~f$1K9tk;s3ZF{tx1>u(Co{WlFw6^W0x# z*Bv-;U-yA-_Ds6|qfCZn(~D<3_b_*uonz;m2n`tAgOK0=93sg02UC!Oo?B zmC5`nAUpmJ;WDqX@P6o8;#N%@4v9!Wh7K5l1-Rn8H3fGDZEo^~lpzkCc=H0q$~)2W zHamV=fd%0fSx!h^sbdG;`bfxl-=;M;m}?CM7ZbN6l6}4Zp|=mO3O5rhd`3bwH|j|p zJ0&RzJh17iI#l^1SJk1)m?IJYCu1w`2Yv}a>*%LZR2C5#=?`Ewq=o>ogF~ekK^W8$ zygpQPbRB3Yz%Ejs6FL?O7HfFp4DXt;a^qZ|$7W(>xMi?y>M!BIKGX#`RWB2sLg*U2 zIS&Juz1VWhnJ7 zJ^VfY0ccNc=J@#3WNKMAkjlGMZ|JVhf;fl9+FZHjurq0`z!iyW!a61s!v^cu5m9O~ z7jwfa?qxpaXLyN-g&6#Q+;>@+MOc)3ip5wQZiFP_G*c|iGF%oeiB^_lc~(GlYCG%T z-0-7a$GYH8>tVfY8S8`hxSy5a->k6ZYz14%R=w40?SVC7AKTAvWw)^d>~?mL-NA;~FgwIX-~*|# z!|VtfW8>^jb`+5b$Kd^(V$*o1Vn!RDnVC9uylZ??Z>FYB%!(7^$7ki^wc(kOG4aIl z+KftvuHn&9ad!B~abtRT8kf@(!;>{>rZzosMsto`!xIzA;i;KZ!!x7e_~hX!ZD#z) z*lgG6_>4L_b!w6l()h9ABQTGzJ2pLgMx>-l!=zEkN2aEZOw^3V2?INET$w#JK08~R zQO;mKP8_N!7}VtWi>8Vq-8Gh=hJX1S1b+U#|Pt-Izpl72sZzDA}JTu#M zWM+7JOm#Bu8lTpk#IX~{$445)XKSZtT~6kqsi~vKhG&j8ia3+yc5Vz$4o{q!9UnQ~ zY_>KtJAQb4WO%lw56{jHkBl9wP0luI)lQGpCYsNfIyqj`4^K^uHr7vWB;~^sQ`6ID zgxZ;!d3boFMo*;?sf!olp($L^4fo4pO}`9jL(jpIHb+iCTi1TQ1)kcnjEV`UT zZPb4`;{+%P_iCe8%1oo)`0#{lW_WabYO#i=ado-4*`$Ec8IYH9e0qFx5+p#|0N3iF z6K9;B$XF1NhIstU8cvK7QPpzLANk6QfFl%Sbv08kDzd5LL)QW#fSBXE W1K`5P;fXJ=`Rw1(#nS&L_J06}glhT# literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.svg b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.svg new file mode 100755 index 00000000..a9a08b08 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.svg @@ -0,0 +1,127 @@ + + + +Generated by Fontastic.me + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.ttf b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.ttf new file mode 100755 index 0000000000000000000000000000000000000000..63ed50b68958359dacd646b45fc0df3b44d82179 GIT binary patch literal 19792 zcmd^nd3an`mFK%}-)gUVuXfd+lT8tBgclPUw`y_zvMXn3;3-(GJJgct+&t;x81~j^~l7T z!;k;#4}ZjQ(hoVV`h~ID@Tl@t{e8Ii8h+(5WQe`&4YWt?w~if~J?(i;`!KGb#`W(e zrbdRp{s&+9G{=cQ!}YI^4WFLoUSuNfFUNIia`;&7tL#rsbKK@Ry&HZuzj%J@b@bft}_S+c3W!TqkCu zi|gikxL$4<*M|}Jb0w~fnO}~zS;?*9R(wcI+)?0Rm1+rVwa3T)=C=eBTLxf?Lk z+c0-KxSiZC?j~-KyP3O%+s*C4>g?n8V-{}X4sf?~2e~`AA#RvE#Eo#HTn+Pbgd4-U z-N_y0Cb(nVBsaxPb2Hp~xZ~U`cY-?!lEipv*z^HGULhYRhcXuv|6iQ%XI{3M-Njzv z+xYwW@9@79GQvjTtnjdKUih83Mf|n2OZtQymk-JdN}qCARn;-|bLz9|x7EK_f2W1D z4sB9Z@2b0ZxaZt|>VDb%rYGq+!K&4-;H(0&c)^U;rP?>HxmPip~U-> z|I#whGSu?^mQS?2nYsn5DPk}1tj_A7<#x~>^476(KC5Kp7N+25tz))TDF+nUDpvZ+ zJ*x!kMNo_G74kXTDwhiV1*eRMInCJCb73Zne;|rte48wnBzaq0 z5~YW(m3hw}h;l@ya#Be~If3!@G0H=QrJ3b-mSdlIXI}juul11TlX)gA?T<4bIABUR z?CehL!o3_qWF-^ zW2lnUPeT<|_R2Lf=N=M8J|am%;zmX4SJfNi0{_?7$UAq9yla)KKX;9XT=U7q18?PS zWlyjt!22TLWn3UwO!uu}{n>OT!6Y2`W`?pPeXGIBhEadXVC!*Myr46ynI>+rS%Z}f zqilS@bj}0>FzG9}68kUgZ!q_1FrADX3fhVsw2FO|PzA?wsXs4d@}>TAvCj$xWtQDI zWbbsx0zq>y)3$MFc%XCj>dubUtJ&WSZS2YKbmyaPHs~ALxM8^dZ>#7=N9QWyW*#oe ze#I_<^Kv;W!8%!~zf#7+VM!OilvAwWvQqA|Ef2%<6xsQ@Stw}P?Edjz{c3!f*Kg`F zFYppCi8%2R6TL>{ulaBI&;TchQ2wAJtTCry_-tnfU~RNd4CnU4nI$pk)K z0$NfT?kJI{nQVoSBTgKJK)M8Zv8K_}bg5ifi{9pGgB6x^(dl8Mf6fszXH|-!Y$#jG zmWrifh^@K3e%KT1Z4HZt$(miY!?V4-sxwg#WrnW0%z*!i?c0m^`)E2*J|Zjr)}$GY zNU9uBWa@0JC9#tF>e3V*J5#Z|E;AAE-_^fu8~z%ScLjTsU4*2}L5^{O{(P3GpY~8+ zSqg$9WWYcQdC*X$yozCR!DMX8&t@GJ-Q@o@7MKjnVx{T$_RPPZ)xn5C#ah))D3>vgEA=U^LVG+I@SJ`?xs9Z z(B7w`d1}$g#heGZ&Fr7pHzB<{Kq_V1Qi5)9Li+abL?z&S5_(wbU&q#hM33kSvEI)9Zgy|H0s9L1W+KX|_{0civS{1VPxOy1%3I zSddq&f*=ZlsmM2GSSzRoXf?_WvP;tWUCD62I+1hYCXvM;A7i+zt&uURs$&TvozMj5VTc}kt z?VPu(t2@GT@lYffbi2ZKTb;Y@o`mL7><%k(^Zn_TP?r_P7=VS@VRn+RV*s5#_wvi^ z*py^f`6 z3;1Xcq)9;duzPJE4KNLw$0bIU#v(kGv_i>b$VxI_{r){258Pkh1BN0niG9&I=Ut}1 zzQ=F6aAse`neA?rPyXKN{@tAqYzIBnzkvfjY$Fa@{Tt2F8=W&oAaMouzu4acv-Sdg za)Hd^TCHMW6U|MBo)J+b82Z@B>~w|prn6&C!XNI znL$JBbI3w z*;L9)>r}3Bzv9F4rLlg#esCv}0;qt^df>q5;_)Y zj-wC;e#ioR{MgRlbuuRh2QfdQ9|A!TL_ZFbmZv`Hu`Exk+ZFH!qm$8~Kj3n=daT^w z;GqA&fdl@*`fG!8bnqW|d{BgN5yU}in12KJ1_vuwD5OFBi(O*p67NTwq*lG+=9~ zWSf`o=-|EWiMWAH+n$faJX$Kzj>2fREt%5nK=dB;ClQM!&?W3G9;;qqFR~Y*MfITX z9$qfw!3_YhmO-#M2*J&QR$qA?YaoO|DVyhlawgwj?qgpM1|mVPhhGPQYg^sx<=I4g z$I5m#>+yH5*MTe-{9&Ij%*3|6or6I19~*&BwNV~ zlEj$LFnQZheICK9%2IHk>`_#i$+Cc>t^hYGylzCzh^&SJv2?1lI}dV`Jw7X#3`7){ z$7`6T;q|x-jpsXl9!Q)nKT?l$aCP++SylRF6@rdp9 zDxl={uHHl}6AV3I7^csQw%i^sEGOWJ+qhQtJbR6}b)}mDm4I5xm858|Wrd^w8IUhn zbnIcW;%3&<16_vL#s}F}LGrYx;=C#S z1U;Kuk??i+w5}b42XpHlDTIb2Ed@=>W&+7xa0ow_W3RKXIoR|zn2MSrgYcm(F1-ji z=nanv(Ko0Nv!(kE`^6q7P*o`qlWXpHyU&rZp(I0jD*d9Nd%U_~dE5pwuB3Yg;4DVnYm;uAy$-8%* z?LNEr7hQYLKD6gUds)vdTXtXCv0(@PjL1#rwuHl5&fUb=mfhEbBrz9ZF3f(;eg=6l zgS`pHg(*;)Y{KDRU~G;WL3_`Eo6dTZ&})1bw<3V3^KIw_i}#xpMYk3)?P5hbhl1?C z3h&?N^`%-%+XDRi_W8ZZd}-U=u2?MF84H>&RWUV1p$%x5{)pGB>Moa^4uo8!6xi8l z5M^X+P1BHMNj0>H<#vf!c1^NlKEKzkDnIi0_q|^T+*oc+8P@*yQ7V`Ay9|%v_XRW+ z1Y+n0xP_tn3|$3@sH*1m+P2TH>aq%nYX*UkWX-Fnng%f}L$l;1RMQNXD}+T6u~t#6 z)g{_nuu%!U|c$% z_67!nZeY$}|mkctWw z3ZNLN3pd^5a=DBV(;UHyx}My-55(mfb(y24X@YSxSaUD1_pmiom$VyHgEB)cRM-chC3vaQ#`_7chXZD3AChk#> zgbh)hn^Q#@ST;PScps|DUb*^^_b0pk$By}TpI))z$Ff@cnB);RY!IP(3H--uhG6ia zdrb455D+B0+>b0S8qcQZ{(Db<9nTa5F!XCZm0j;VOu_ws=W!T!8y9Ck1pnCyJ1m!5 zWHOE^p-F8`5z`O2l2w-Q5kP>715y_`&?1AOYaob1cSApRY#$(8_E{xvb@km?T-jGX z(A&Pwwrx|Ec#&m`nq+w6z3H@NRc)6B&eD_5t*YE|WaGNxnyH?y_72E-QN6b{;nlRZ zxLZ>{Acgecb<6hbD6O$tcUDqqSTqHl_sH+h1q@$zSLwP~#BzmX(eL*3EL(p|vG@9c zq1|h@`8*jWxs||&4!TS$yUj4*kb4sRV-qwCXXsEPNGXD%3oO zX)FSXj3OaT2n_FrpiakshwoR8=HcKgu)-bZ)01b(k+;x?BChi zvtiv0yL}$NMGVE)nREAa^seepWHl)tU*?Hs+g#pgrjuPtr+f1&m|OEkWGmLw+PASg znD%;ohR5`|eA!S}uKp*9*7kHqP-oH9mweaf;=aJvd>rEtLHE$1*sDOy*K;4|{us2_ zUx3XB-yS{#KmbsdFAzRxVo(|Un!XOP0j3IMUFvQQ-?^29)&t$3sAL^Mr^w(N4XX}r zC;3M8MU|Z%)L1vrE`6aoma)~#{T0m2;vH$Jb;<>71lY?|75XkO3jiBT7oa7mKEtJ` zy5S9Yg1&&u<#B0h77|oT2BIF1C@7MlMLh|_%)PIW59x-issR$Rf+m?jp*&Vsl-fGC zgHH#7h6@_0=J$t_Zcp5gCo<+0J6c-e@w~;hZq4EEc2VVJ9zc%ACLqmQ5dqvJ0g}|^ z&iK5l0ZX5tDsDGZ13ugB4+jHrkIUyWJ*L~|{k-J~MeGpdZ9q0uQ--E1>O628gu2_~ z>1xdZ8bT0zyaAu(bGuX(7Qe7x0X}pvVm#5&){@est*u+>4?HZ$4M3iK3wsHE8pXk} zG>NoUG|kQP8t4~9a*ZRAVYxzf81~ChJejJlzj<(j6xi6`5{YQC;Wjf?C}efIcAXaD z@%D~*I&QQiV(j5W$Q)R^wxgqywXuLd$qPy>mSF}<79;kspqcHlctY`H0+J3g1HX%M z2Y?km)7095w$d3=waLm+F6Bx#yVMr1egYdJpav4gRT*+ZIE zf1p_0f9{+^|8el)pMei6=vl(?L1th^?ko56j#_913vNbMM+;|s@A6Zr^WSvb3E`!c0 zMHt$b^@9n9mVu4j54J6^kRY|)JbQDyD2A9IDne=c{PZhv!-yN~BZ3fc^4eCe8XR1; zyc1GUWC1}2o_f!FKK*gyl7T;T0K9E8`#SqNtSaDfC3->vo1Io}6&bf-=P0kihR30w zJ^fyNkN#d=7T+t2dqnxYuw9nkt0Sjz(a3k`fx-H?3WHaO@0;328G1)K$ z_JIYk3j;C+@^rVR4G6*+Szv?`am@TU^4 zT68`&Tcwqww$ZX}In94%Xh=~uD$3B1D#HRcG$aTcX~!a=3LBO4S8l6|`7qQkmIUac z^-7`t^FR;^sFMp6?NHJ7r3GKwR~UN6b+fC!P-W*IVe^#yXEtBw*s(`YPju=npq>ci z<8|z-mn#Z(sZfEAV=EzGo}up@tIt>2{392Kip8y<+^zNyn?H8Bwfc{Tx{7_>H)M*% zF5Ds?J@sj^Z5RB{A*W}}ZV7;!WbUWmmA0$ZA?NR^md{rg7Ut&AU3j$@+az0?2Q9`R zG5X2Z?zBbl)Zx)Z*f4!?BnU+ao@@Y!6xsBn63(wcb3>h&pPL&>(Fc!CEexfqbIz4> zn8$dJRjcRc&ZnxB@yJm9pXV6&7B|P{=-T-VIkQ=xL)R#V;L4bjOULVBA&^(YH3TXJ ztOxVCJn-#+^3i-g3hdrlT9;lr{2}=#O1v$uxZ=-jO77kP-E`?Q8uJP@2y5P)Sp|av z25*cP=gSZI(mcjGkI&NP7g9s`rczBBqV>`oq)qMliauavnkkkF(E3-aZ*iEDMgw#8 zg`pwV82;O7DF9t&NuOjwAo+&zD_u}7cj?dC;uu@C$~gR%P}BcO1cLE+FmU_O!aVo( zdG#%ASx`b18)SO9$zwx9Rdj1fWA!(Ox{%j3gt^1Vp-B@`Durl=wkEFyJ4HJs^s-@x zgRLd&E5h_zNc++boh*_N`@*i}scJQ~xj&!p&;R3N&kSvUr2YmAtUh(#`LOEpw)W&F ztJP0JFpi-}zW+WpH{^Px4$UX+Pz?B)!0GINvmYb&fvYsUOJt8Cs}8^k8D`{sr5`zK z0eiZE3Sg*%Pshy~{*xqbkc9+>tGwb?z*=Boq^huAIp6G5GA4BKLZ5x7JGna6*OM;A zqa9CpQ{LT&Vd{-1q?j5Ey4=ZDy=B-F^gz!BTXS0h!SE{|^}{h_M)fdEg#nKt2;P+M z(Lh_$^z%OZBmPh_rN@NMTz9uM;ZCfM8R3?`k!UY9&UTN7)JQQd#U&XESxc*)Jme0h z<1T95#r%TqQ$B1denpQOVc4_$)Ve3-eKh2e^+3gn-|q`y*Ko=;X*_Y&x~EHNyGiAR z=J_%WTy*y65Pd+hS5a1dXaRe5GrL_GI8$d2zr zc0>^c1F6)_JEnUN)CLGGGR=qBbKejRg$c%uk{U^x zUa!ffam)bib@40(3mi^Dmyi;=ME3iVOJlm6@)^G~e9qxT9`^~1b}_z1>=IB4QwSQn z(!Y1<-M{njYdi;SHiZp%M8ntN#V!gXhKS2y1#;<7I)I~ru=p2PH4&o3;TKR=W@KhJOm3!Sf~hU&zP@EmxpxUD=Q-{4DWLyQOc5uukfaEGjb z&I#HB@-OO~#9m01DL0JUKZNSPEnMj7xnsS|Z*i&p z*T>uaI%5y6+i~equDv9?c3}sQxf<;(+O^0Q&_Jqi$N}m&0*o39Ih2MOh7+t@Vwbv; z^_P>~-N|#ymlv~Z*Gk&9ZG*{fc8>Ds&X>0(3#+!7TFbUCchfe*Gfr_y_5k|_%rm%? z-NS%)$ih-+fdND={K*hs;MkG4P*bigS@ zyO*O)kan29M$&BI?2 zng3No{{KHc12%I93>K8)+nxd6N!*Wz487wiJLqAMj_9|5D7PZJ2>&QiH{nfkrZu#G zi~v+d2){t$0AvQx$Yt#9cxDeeT*dym6TAJZD8~F_$5*F>QYBnt7W({EYcke!?Wl&AVhi+C(wNL(pDs=)6AS9(b*s8+#AJBZ;bg54@ zZyg%u)jl$r0O>x=ZDo`2!5CQGc0};N*3f_^#8s~4VJ$csO%VK=e65aI$nmveilI)s z5%41`tKjQ=xZ(1oQ$_3+@prT3d6=A>I8178w}$>Ia^)p>Oazf{oPGnFw^o16afQN{ zilB)G|Kr$C*#c0s4^}BebgjeO*abKr=x0}O?1pO*j{0(c!7z62*s$@Bte3i8vR|?m z?pv@9+^R)2zVp6LLDP5aFbr6p7w>-XC)U1OHKqx;%cB%MProd0)0mMW#fhxre`piqh9@K?{~cTTX2q7Cx~XBKVm!DF=XH z(AHPb)?Ty)o*RH+)Cn*m7crT|(e$gRJgY=izyFRq{C*Af*n?+O(@@W-s^1~m)wncLvsHf-QUJfYDTOyN8v45>~Phqp9Pd9BP= zVsjPy5UsR;;3T6HrZr`JY{VmoodzODE~+q?y!>yl?tI#inedsW}QgTeWjsvVxa%i)88v|0{O%5Wg zvs{GwYT33`MWn#*TalLT?v{Aq_d(Ifu&q=qa35p$`Qy)6p-hWyS$2yg$h&;qYrDO> zfPN?|lup@}cNbG(S!BEDT>%1}jo3c}$cOj{Bqw@CK|`I)Ct;VYVm_MI5(^bcw=BW? zRw4)oTiHd#JRq7OTHo&R`=il-&%^dEum8jHo?YGu41Lq=oYxbo{{qfzHrF5W(B}16 z?4A;E&9(A(MpGTP?m@tTk8{9tj8}=4S(!HHhD_ zb^Y?@bZgY_)`GHDimZSj`I0Jz5U3Vy&D^4CQYFe#TUtVfCMs>wNE@6aMlf-s?ql#e z{P(tCXR^ZxMe+$%jJV>PHD$oKP8M5oVO#G=UKcEg#(<)2P8xQ`V@9li?oPC3m{O1EP^ixPAFP7je))(LW}}tFoeVb zZrX}ty2sAW;u{Phj%O8*XdY0j3}qNCSm3b0I3+rkkSO=?{qW5-S}P!4+V9Kkx(S#FH!H^>%yaISj_Q1!W zsFJ~afIdv}tBPjdA}ZcK^g$Bf6rccI))KbeXpp^zZr}avCV0saIV0*WgmS;H2tq4o| z1Xy{X_24Nym#SCU{1A5W`30VgP!*zEW=pFZf)kM^;Ygk&F9j(Hqc;P%()547>CDk3IJN$DTev4WoK}fyD1Fo?52vZl|sQ5Ni@c!G1liQ0Tei&wRDbrX&LWUwYbM$ah55qLBWA9)t5U{@~fVX@ue zN51&*QxETcoKjy$4y zqo~j<#RS40?Z}?oJ7g0{B8VX%D@Z3N5T4QyDAg*PyGkt0HO$s?j@U^tI?XQ;NiapC z00dFBin(E!n;homYh;6`zzf0)6jlKJ)j^%;?N zc914?28@GB5VG;5WnjC(7GPus*W+1H(Z$`eqQQ-Wke}iwMWKU#igHwGNe(LD6~$%+ zNjeDTiOTq$*WKb_Sw1YIvUFJJXGazBh%6tGb;Y@)$Tcb{oR<{P&x_CtD-K>uQ)F5W zVv2MpH-qsLxvMp{LUOF>=ym6c+E1|@NiI7996ZER$OJch1JIC@x>zE4_0(t zRdu~$c#$>`$e$I6Rzq4bjL&p!OZB@3gNTEZAK&*~i~G^5eY%vd{olIN1{8d$DKz7}s|(u4S}mD~J%4LjYon)ZC=q1h(vAK7mXN1G0-C zvQTSd_tJpgHWjqFU!*6B{B7xII2=vihKTQGMlc!;Vkp2aOp`u^m`qV#9Jv!5`l%W` ztDr2#hr^kdGGPQW!PJNx3?>?QDG+sr@@Z3Pj$V-`F>!+wqxv|Ohm+{w*c`KXlYwGj z2EgBl-kUM;OS%iDi=wbKZO)# z>V%8{(Nl&u=*#Wi{k7e@m)|z&HBUZ_h|%aV?A}xCVeH%b=dg*5n~|C~++NgCWUq11 zShM@W?$O&$o;1B*+lpYA*Vxum*z?a`)qe$co&=~5(qW0Lhb51MWgezMr3h`Q*v*qx z4{&Wa&j@gDK!DFZcNSXw^E+0h6XL*EHwcOJ({Vp+s^{Hw^t%^D`m^`me&Foc1Gle< zrCY1j*7R)h>}rNJKrt z_)?KT)cppe0$wSC8^N_i>}{a-CwQ$bbs|P z*Y9VqBE5h8U;YTc>VDJ}mdwMSGh{5%3TfAf6DK8!G)6?SBdi*7!nWWQ3}p~OEz^xk znRFiLQIH9Ua1S}}i9s96)aZ?%6#S{>sql(cpilnw#m41Mz zBo980tHz^I(T&(D+=fA=0ImrY3rd^_?T@0aLYCdl?8bWrg?!^&%E(j{#ykh{J#?%$&MqCy`1ucO$ zeNefqa0<|k=VgZAbQc1hL|x>K2BXsPb{is=fdynu!rKNE8XrKTh>bxU6%%D$h91Z8 zsw02~a3HBVu=vQT2k$im(2g5wQeJbZ2vUm3yzX~Jpgbuk3a)tL_^$=%QMiJ?1Pw#h z3x3IE8sN}w0k2#(wLElRg#zd|RKo|Q5f8y!@U@knPD6g9IDw+8zbBUTN-VZ$OVTuP5`~mF$ z)9`=X5B~@8S6Epgt1=~Dp?U5vvg-~UxUc&_H+v>s|4}BxvgyS$o_m-(%+9fMPJ{*w z?mN*8_czaf{Te; z63M>a-|OwetHR9$3!jlt&5e3e$4*H~0uOAust#5D$W?WyGUiCc|H;_O`+;8q&^r2Q z6qQ9pM*0Jo4XGhO?BG!8MGywH1g{Sj9bE?+3b2dR=Y)=hg2fu%IK#VUtlT))=dqbs z8EzSDoBB&Qun%@ajxC|5byV86KaUn3|gA@b5Wl z_{SS3aBG-eMj5OfIWaMe#AXzn#6RAk^9)MVxD-M=yCH;A2%k&6qsc~Y5%;^WR9z_B z3)qP;!p&2Yvzw=8j?_|p-My)msl`VlS?ulV@9OJahEng+!##NR4E_noxYMH)TBTla zdulVs$EPM!%ery#F4Y^ltFs`^p|Lhst~u;XS}Slx;+n9I$;7b1`gKH)8O?z&5f?_}?DaLl$ghH?SM= z-*&dc6Sb4=VmGltb~C$$?Phymjo8Qbvs>A1>;Su+9b|W~AvVkou@U${YV0sO!p7J* zyOSM7WWq6cKd0C<-l>?;hG%A`P95(WpVXVFsS~r}#Q5=9`FL%3W@Jn}alAI8(xGd3 zbX1%jK62cc9-hYK^u+LFO`54qPn^-5W7qJ+gmQRl=G5@as5m}(cuJcYKQcDkH99_{ zj!vDLq=YnnZ1_k`nw}Y-oK;7LCu)!GCDIgeQ4^mbo}U<>6&+BrZzk~ezMjzGIi|O)Z}q-qIP&za-Jp9bM(ezkBv`` zYtC~i#h;kgkIxRzbk&Yc&z=z}snRfMRPvFjsUs6LqjAE(P8?TePmRyc)@GD5n2!^O zY6=E5IX-#BXr3|FS!sIeRBeWzIx5f9j!m7cq0N=t?9$Fv%@1}$7++ajas$SBejXVR8Rh8qCy=AMc`m zNXIc_HTC$3@!1iqy*gPt)pdOQ$fQIxcw7Qe&W?%4hQ}woBV)CZqaceeCs7;qU(PrI zO2WO`=#?_ls5d@5;hGs99iLjP;b~l5E^am{U~~rLr5v9gpPU2<&^Exedg#O%rzbKN z1f(GzKQlRE)+Q##r;m>xccyP-V(P?b7bvZfp!t)>k4;a_%*wUXbP`9Vrq7telSgLI z)G^H38FOqHE780V$7&PP*i6UA@2b(3Y^Feh(y6JLiBaVcSmwk;O~l?iBTWxuN{G;TKd8^eE#fiE#LfCwPw`0fC>@NszJ P%WFRSw{)@e|B3xyvshT; literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.woff b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.woff new file mode 100755 index 0000000000000000000000000000000000000000..a3cc736813d7fa25a1773296ac8736dea5cda4af GIT binary patch literal 14128 zcmZX5b8x3ku=Ou?vT-)HZF6JWwrzW3+jcg#ZQHi(e0jfn|GQIlYU-TsdTQpGsj2F& zZdX|m5m_ZASpa~I9smRQ84?%(p#SFoJA_0;@BsiINC1Fw1^^K9%7Qtq77xb_F z0KlAAxO0wX#`;D801N+*M*9O+hz4kHvmfzC`|$tgicl+^SrT^jJ{~s=L02_U4;~$Ovhadf{J-z{`z|GFq(dlQu_&?gOAK(K(06=b; zjqUDwSc{E(SN4o^*1*LxQn(Fzalk;B*w9cYCq#J^-gy{il2X8lLF`S)Sak8m?u)dO z#jSIZBA7H=&nsbJ^|47L7r_QDeRF7Qz=yYY3dv0m+TCogpIzOKqB3g_@1Kv)%d&Mv zTujf|?OBJ8Q#=OYN7Hl$7)O>@V{OIYCG*MyDCi8re5ukX)8+Rj(>Zv25xu69{ic(2 z+Hy|4ZTDa3LnSb#t6WK|m-WA&`d zNJMmLKV;<}3bUbAQEF&9sm^W+^U;-4meW{JThN@5L!;aZJIL3OD=w%qYc({V@Xr^BdlZ~h%;x$n?fDa{idBte zz0ZE~@?+@6BpcaPR@b76rM9bbNA>NfDjH{Hl~Kj{-CAhP%&E5_3D-_%{i+b*jmqCmJpl_14NJYW%?r$n z4JnNa)|UAbLh7T6>uT!Da>|;DU_xi)_0TMfCI2)tzHXyo))tgmTc|3|GfT?RX=RqP z*2gW_>_j6fs-fKC@2It`%`Y1~LWKiyY)-8Lz^qCg8y6a98p|x~np9F6+n~3doX;?| zW!S9HKPw&DIH@w4TKxrys3lBk><&&Hqyu4&)Rw{4SC~}+Pv)*|Smn)rNEUv=R;3qC z%6$!*+%hRFGmLGI#>&oDlw-)3Qy~)Q+?+*qG8NVNgdzq;q(kJeCVNr=^1q|R895US z=5h%brIJS(+>0|#^*z#fi}9R>@R^hrMq!zVCdiqFBAM3HpiJt_py~rxN2M4LnA%g# zP1x#7PN+@j%u+;CKPP~W@E!khOknHd8sma^--9|Py2rbRyJIp>*H1W3+)vP@qVq$1 z#=Ap3%#2S^O;k)+PMl9*O=L`HPB0u~JiXJf?IUd0rNzNGgntb(n4St|9W9pkktd$1PnAlL-P=2|} zN$O5*_dc!DHZ872uY9dnue@K(lixI6Q^%rjwcos`=VW>-LQ$Gix$mB<=6Ei(woiFq zZ9GqZo^=!*Z+d1QW9hz!w3s2J=zh%Kt7d*5f!))!oCkbvZ#+!udY$Lno^Eq~RLRnD z9}6A_d(wWq919Imw#Ko?DiT;kt6#*vIHnYk!#;{O&wxBYCEQqIvyT&(T)! zJ)KN>(theO-cRvvavGc)rV~wJ)9HE+r&0a*8av!>-6?lgz3e_)QSR;zPt=xcYPiU* z^B!NOo2KLQdAz-j)~UZqPqu7V`AbEm`c&!l-nO`G-7fRKmBN*RT zNg0OG_wXG?u1lg_2PdE~8NcdTchOXmL8&dx`V)c$EKW9EGZQLdk%I>1^R5*fPBALx zc;x&rVnO>xw0!0!XR|UhOo5Nw$J;9l4YU(qoN>Q{5>f zhs)IF3yJ)#Umcc)XQMLL12C+5xhmA9hXRNT;IJxbVwIf6+ofy37_%_q4a?8$knu&9 zht`1FL@<)P1iv!+Wp~*t$Pzp#+((PagnR7~nqczr6AkW3H0GQk+~47^Y-0xIW8&LD z_PfdSd_c~iz8kWuQ<7ta>Jc1rIz9s}yWRs?mf5vds+vt^quBcH&4|gtYq6T)_82mk z9Z#A2UY5H}ybWi?JCMB{E-roPqB1%+>P6xCo-c-o&abvw>^C<>S$U4h(>i0lGAu_L zj{EI23sbqiCMI+g(9U2j)iS5EpjhPepKlED}@MGM-dq8NV zVQK|x>+6O#XI+aq4S+!9tOXk|{DJ^W#S9V(a%Jx&`=czSwhq0ASl{$VFrDqURPa0^ zO?W|z_6>Moo}Oh5?@K}Q8tX>z6+u82r0lw#?&VC3h&+@#h=?{Ho5h!H!PE&ydg5O;oyU?t?xnZ_jj88>VW1X(vvXFGgd4VKO--{h3<|nv5ice1e~7TYRrm zA-$XuhWQL;nd+US0HQW$`-eFft`$ayBSsw9fx*?Lr|Q48o2|2g>#pYmN>3{>;VOs|6nL6qTn)T=R7EjN?1S&U}Yrja#Rc0BS&=VBm2Q&`GO~$jc}+= z5P4Ez%?Vh5H+ZJOjfi!2+&RLD?5snB;mL$X@s*H&shd_CDtc+K=EgLnOAy@A9q6tk zRu|iYf0{FpP){Hp<$*QK_gP>R!V$2DiXQ8qAz~-z2l)LwqK@j?ViFos z2?^ownYV0j9{xU~m7Y(gxwSU-X{uI!-I`i;guQzPGo)duXhJ#4e9IEWqiC$SF@eca zJ#$n&jF!u(#~CTPvE5`6UAMN>4}Oh7A}q>`)rUE_ulFaqce1;G1QnTozlcXiFc{(T zgt1Rlgl8`_)b0ws&qP7okXVgcEkk5(Ob)?PkUcbKDsyj;m%yV*b9PN8kng>`F)A1GZ- z3Pf+WPJ(Rv*wi7S4E8JM$lyhW^9^@rd(`Y2yh~fB7nk*{K$Hcu2{hTQrpR1l7msib zM7&5e!zzfJvl_D|FLA1Hs&tyWN4HVTQ-mDI(d1u7$x85eXCmMqxHEhrntUCXcGhZA z5WoX~dPBX#Rbem@iQ>^cZvj`*&d2w!N(fg%Et(U(-bASveJAT=aMkEB#ja0R7pn}6 z9AO{h)$JOzL`qeAV8;4t&{}f?$@7m^1}d685pL5FK}=*pa2) zYVaTi={xvCdxaSxoBKIxu?lcAB~5mcCU$N94AJdRxEp1=$GOWN_MTS{W0_3%U0}G! zVXA^nz+u?Ja^Ga*VEkQUv)H5OY#jqXVyu>%lGp(yyuo%-5BO4a=G8>swUZh9Gbc|} z304IzFt!~Bi8_-j{0p@2Z!ytt3J5rrRR<*{IHD?JJNTpvq8!J1OKUyGvZ^IRae+bh z_?xqbOUbwR-Jl@(anGYSW!#LQeujT1$eqC6q6Vq?$rxgw|HSd1>Rp-b$$U-r8R%dF zddB7Wm)Go-z)14$DL8^>kyi|9(?3a{VueK+GWy!eOZb-**rUGmhULJFl+l%NO%$w} z9On;6=ln`0GbX%KY1~Z^o_itK*51*5Z%(6J>i1x-<`JqxDrEUOF{{ODA7iN*n;n+! zr3>ZAH(vFsh4W~SsOj~qn5i90;Lx_$Kzo3p9{h18O!_=_K}9}UTf~Dit`Gs0RYwpi z)4{xajo_dM%drt((H4;kN#EP0<%t%1u;qh?*i&NQIeUtTa1YB(m#mrS^@*24PNrPe zK-lqwH}Qh(ep)8CE?iTRj;O#5f_BvbX38rj5O6fNH}U+3c?q!ODm1_c?m}ZdCNz!4 zHF-rlV3ZlR>U*|2Z|4jZAz9o`?Z z`{wukt^pF}#?DKOQrU>Kb1ZB`)~Sj!i9K3vH=#S&y9JG=B9FF)Zt9owT8X%ByY6bI zuT&JMo*$REW+-RkXhU`$MKpx-2_PGrs(;4V&flvX9h4SN$L>1kb zdpL=9P=O)_5n%_>pu!V1EC2ziqOask8Ni1h>_>D z>#NJZt9NU+Yj?xVgt1;IE0(mTm>Bv4nEF(Lv#8ikaRkTgzVUsneQkYh9fX&c^3NZg z3gGvorI7|2CGo zqLcddI(Bt5MlC{?3J@?rPBXJXiISG;%B&v?i1yOFlI!cmCmc$IgaT(T;OD*F6K(~QSE&l z52iw&F}jgMw^!+n>oU4UIY$ldRqDFzA&u7t+U&5tO_4i8>@VJ>o2|;_nqWS^>|eh^ z%lrABzug{=b2ec9u;K30>hMPnqSLJinXqR@n#YrZ2qFWiX4c5xDliWMAFl-LIkr^Q z456urT3P|(4eE$T8N%{Af*?@}ji|$B?_Z#pMu346jdhTW2uO$i%%B0lk>jCp%o~t6 z3?voStIKbIM8JmdEpJvZh5pf)0}hnzKOQiUf{_SCU2AIwpinjDLg+I>P1)?as{JIL zqlSk(Js>edf0aR*PIn?NWzIC8ME8H@MqNxl*g58*yO43WcH&f~@k>AIvV99{Qh zF0iczN;OuO)^s!<3vjl#T%U6t3w=Zl7_%>PhUVGlYmu)b5oBPc{G7A|vk!Sa<~vTF zseDI#%p^9-RiU0Mwl{{-XMZ)HvEF~^ejX{Suyv2(*u0+5Skbag`{s}&7-G9*9B&7W z-o^Ng=m5R-b)0xoZ4(!DLnx{XrMG%{j)BO1h4Qt(tGrlg*741QO^S{vvaF&<{dEw|a@O$|Hv?K9?LDeCvQ z0ny~XGXF!9BZBI=GtdGU(U!(j_McHX;mv7`&A|CB@Zh(tV&L~Ql!_+kM=k#;B_Tnr z;ZTz$?v0Xn&g?70*ij?)2MV8&iN{||XPXV?X%Tw5(-x#hf)Wl;0KETtGWT~P$C(o5 zPlNK_i(Mf)HWHc|p@2G&k^=+Ou@j33dZj)~YP0iuL$H(stw>3 zM0X)9V4h`8=t2t2FT-(4`hA$0=b zke>FuX_LnFquf^lEvgftJL34KV86B6UzCVuEfQf5Dn)o&hAk4``PhIvTttZ06q{EZ z+sHa+#9lNDkmlYIpMSSTX&G!iiMF?Hb)@z1<@UW?Om4VNG#-%{T_(BI`EOYD@j(tw z7RI#4SF&_lS9i{VyDlS}0X^L>D#C-U1vN7Si&WT&ot)9Gb1U^&_oyvt(xDF}W?6W!0{In<>l z&BcqfD#jO*Q?j9Fq%_s)3;*(WEu%%5(M@hjO{sx?j6|UxBmuD2No?Yd-wGJbRv67% zFCYeZnpctn+3y&^v>r_B*5Ui*3hMVD-er9AwJ*{;R|2sM-TGdCc-+CsD7Gt7*p6Yr z>Thfuoms%L1Y-tye1Ld8uOt^ZzqjKKPZMx6Jv{geh2nX;JivWW^X_dbcK@@nL)Hn! zgI#D?XvfOj@`&`qONfKjvypRy^jK2w#e)+m(9tE^4$-t%#r$aQI)U5@E2&37xW?FO z?KFih0J?Fi>t#NnVEG%#BWhpej*A5|oF5KpYq!gw?37P>=78ze&bH39!Ihal(2nR+ zZf$#L=ICnpM)0feeZASbZ2idlSJ35^zw|q9x()Y^FLr^p8zoEHwe+L$``rk43cZ$1 z32(@|xt##$k8y9(Tyo2{N^(fx%nb>=dU)Rc4{DI$epxOlwDCZoVdcA{PR^d{2ZQef*(>qC zljA_dng@LX$Pg?Qm|Z{2IUx^rR2H|u>AxHdWX6YD)L7#b>Ru>(@fp}c>!SDTxA1it{A>*0r1n8m;TA2@I6L%w z&6cCp%k6aArkAu)@2}!$a-K}L9$vcOaG6kH#7fs5bH2kd2<1+^zLJG&4qbb3DKnfg zWUqzsB*ekN$wEYMA;6BhhuSS3h;gmT33DUa!PHv5Ot*R-@*d5NM&WuYTx;j@;>`>6KJe1?;-8Elcyd+VB@*+1xMN5--IB8mywc2xWwDY z;rNS?m+4(o(oDCF5I-->dpyB)$r1&}Qgr0mls=T@iF5FitHR-WPL6-J@^ochV4o0o zWD%YE9^w8bs!5m|&s=5jq@X${WdD};Xv4>^-zVMx3Y!5{mKx(^ufh`0ODIoY&@&{# zNqaQhXe*drdz#V}P3E(tZBF`S*c7N)w{t*p-`$B1Ze~Etu#$As!wEV8R=M{W+F|cY zm>G2_A4{!w7}u2-2Wr8jt;Ne1eh(z)k4PnmktZPY5)kos=-f*pUxtx=0-un+AI6mK zsMs>pCz>snWLdk}Xw(_+s}Thc$LnEN8!Czun7Ld?)_8A)cLAsvN{9OKvDY)!AXpLB zwZ0i`IX6SMZC|z9Dkk?|jW%wgneNa+^{u*9t)tWEN##zGHVs91*x7}8er7;xqMv)1d)Q?t>s)4#%B)gc z7?g5ly5&AE%i>7E0iI*nB#E~{Juy#b^aA{DTT5X;Uj9$9MR_IcJZL_>TagkFC-YR; zME&UM5+Yhws59VUj7l$Ho}D6}2q9K;w2EHZF8suBhN5QXTSUbHGnGeN&~mvhIBp6@ zfrhKr>bIoqnM9=RTMV^r9PFRcdRj!o}loj;qU=yx=%p+l=X2k&U6Rv648t-7Afgk1_P zyTHcA$W3kY?U3g+mj~U}z*KAnyVuJAV~pt}rq|2KtZ!vkJXKCwt!!`eX&M3U`vT*X z7PAoAs-zfLXY1ddbsfGz>BZ&s5*fS4oAmVbI_bE^ObY4QHe{E347HnthE)`X3&n`@ z60<77$+9;JuFo1E?-RsQ+PyQ=;tSKrKsOUr2kED>G!4gDrO%2(c*iOnS8y*J`I}AS z8*+<`kl|sn(2`!Nk+F~D5pEKYY@8hzG zbp1xY978o-!+=N`z=qKZa1|4ju7rb@B;5Dx(+11GG~=kF(vq2ZRgw=4BRShVdcO;bCfGEzYMu1Gj%R zr`t`Lg5%-G>FDU`Y4PaVT5<8(+Gw$PXsg9}{>&b?CHBTwe`U8-C`XzsATDER zACd_t<5xZuiIEOiwxCePz`!ykS6AO{P1}ygqn?o&mruKUvvYoFhw;F}=FJ;#VS%{P zy#j%28>_} zi_QCiglTRTj#k6tDIC#gqx7eRuRF4_WIMBQkfY~`YyT(^gnm9ztOYc60TpaFD~p)# zN0xuvuMy>5!ooz}EP0++t-juiOUBDxuJ8P03dT*{j`)m_kSDOoJiUkr3{nVI^kq9^ zvJ)#QH1%B*;mBxADRlK+QyYm%2fFOAn)T2J7EjTuFfHR~u^AIl8!}vrAw?PR>t+w_ z4O=2H(%2cStL6_2vwEsENOa13>^dH932^gN!6BP_7}BdJ@)00kyHW6XO`5^%rE6{* z_T@40>KG`0{XY*Rc0B6?yo4z)j(k?=97z~PB;H4bBTT7oq&Rrh?UC4_Fc$i0GC1_v zc*rQ8J@lw}m>e}Z&WRDHw6(Y8<`wo=k=BCPc4=1AM(V{X#Td4u*Gi z7_MHjMeCxIPGbAx3tW>NJDhW=+c?G=vB@CPhONDtP#fXnOuh$SyMCPGUf6T7$y&LH zEuQ5khu~2{lfwEir`zROa_N5-g@qk;uEJ+o&5$CLwHd=c67eMJa_v)?*kR^r^xQ-V z@z4-jAH7E5F+i!7Ni}NiiP!1<5&yYwsY66l>0ByXOB_8q(lOUj_2#dd{#{q}ig6PU z@#Js{TyJm-CB*`-oJz)@w=w?Ybo~C_4$?I@?;L52U8ZJ2mMp`9P6P6;*6Z^2nU(c* z-Zt%X zuQtf=q3PxHa;tsg;q^l9w>hlox_DWR)rGemp)fFH?QS@khjoLdgrcGC5(hUkSXAka~T^G)u2 zNhaCFxYe(rwH#@L#B&Q;QKmsC&d^Z^ZT4-U5=Bm+!=HsiZ3dIpS03~}GDL(mYye=| zqcj6BbN`9rbaTXKVtxhNZ)U3(S5MjlzIj5SII7gkAf9Z^5d`Mu#T?CY1cix0d=L)| zVos#a)x|!de%@tv(%=kDOl(zbm0l{->WH-lWOOd5^!VQPmFW!n!1IS|wat=JJ;1V8 zb4IT$v=DOnRAjlIfFw?{H!vXNxSI)m-OiA{Q_;SkFWY!JUry%v!qpmGl3}m@VTEfB z@V8>=7ViS%TnACjn2;vIeLJ`z)i4=7H~KpcVed)**GR2nG9&Mf4FNX@OnFtyMs5^r zmTXy$A)_<1qES(wf@Sz(fi*cjq^il>VNGD@Ldg$%ekB_N3mbd*q*iDBW#;Bdp>B?q z7xrlFJ=Gf)p^7~UYWBaz7Phyj0d_41mIB%}&2vd9p+ z@~Ny%7xipunzk-uI&IoMg%0pIk+!H{#s?Ja6MB&$TypPgUb-mm6niOsfSnH3@0ymE6 z;O7*X+v_@=SAyf}8y8P=&p3P2GDgucbrwnh(-tqbqA#4%fUZvvn-Q ztJ{D)_OPQaqDD{m!izQHk?^2nx^SG~xsiNzar^l4Rv^@Z@O-wZ{)hI37ftOPo6_Zt zf$!mY6K+?34TtgpLZTT-%K3g&cpnVQM2)o)B2L@4UY~QNCLsxn9r^0DbaPyUx}Al$ zy>u0=M}R;{%>IVRVUOx6Z>u;FtKA;?I~Ki47edcx`y$`@DP-{IBh(sX$ZshI;?{2g zT>xRV3|@Ue8%XX~P(o#8_lnM!?xS9Ss*L`JE)#nF0=c8&;n7%H*;~N6AZ1UWU;6mP zBh%yI%YfEpSz4LHj2OY(2#G!uLyV6V#9~j%)@KOZbFinkd4mt^hmioPfa5WQLV+8~ z^C*vCbKIB(M+c1T!an5%bVCC~Tp0R4OOsBo78ut&JmnR4USoEh+Wo|0GUOB2_m!ti zUliFLQPN@;ATr~^NcG21v-oIF3PA1a_FSLM=1lj`9UNW;I9L>q?Fap6;aHhzjOP31w9 zs3J(Qz1~c*haC<5(>!M>sK1EPSNZ<*!eNRW$S4G)qYvC%w8L?OaZs53$Sjmb_E02N z`26wI^X!-_+^i(TNNF!>jLWNdQZU}!@Ko9>vM~yM@fd({YJEf~M9jcU6fz{_As532 zSG&@7w&fH|DFm~gsu3)MB6d6o(2V$14ktQAHEO5@&iM@%Vamb*!d~2n@PIxl`Se!Q zC_muh5LEg|tG_jDbwD)~f%GTpBtb;<9rg9ABW5rG+5Z;!Q zr5+y173%6Ce#Coik1~BnxiyGVp%0MJrEzY|v?DeDMX!VU*b+evv1qgTn2hR<4Cwa; zx*Hic7CM`z4Tqc_ot;}>J95N8RK;-O-d`Pap>3D;oZu_O7>tu5pt-YF4VIUIOSMi& zpk0nGV5TksWwvA)3+!&37tyS=w1Z{+dYCS-?>HcfZ2|0R_b|XBFCOeKd#5gMpQG+{Xk4sC|t2N>cGgTj&vLKe!C@}BiQ(yC5Gh}S3N{xk`zX4OvRad zb-D+)VqrJ&#kX@fvaqJaqo@a~I|`9J6L7a}NNLMf>%mx$A{nq<9wDh}W{fYgHe`8u zzoHj!>es!TU5^~CQriE*N)yG-eFJpSFagDp-BRXx9c4ibR`qAo1r@hghq!#I}Oi`U@(s>_B5e z)hBGS%YdY!MDpI*;>Yd`0_70>l-J$2uuK0U&lQQp+-@%0c}uFU_opN0vax6wuAC4Y zlu#06TJ{@}yAfyd?EM1Vuyo7zVY?%=%*jL! z<{C{3KN`vNbb|Um|MBK1-7r=>RNNV!=B4+95oHoBVE#RhHi)0x@sssH;iF+l(VOp` zQ-YKh9A2vFaSyi<55bh3MY&+^D@1eAgQ_6gr{I7qJ$$jBl5h_%7$aM4=QY88f)&DuE27`&Ha#OfW?p&1tlno&9!6pmsy>1? zlao@g3%jblbFD1!wGg_hbvQgR$EZXXkzEH!p~3f?`CzZI=a7zk=3w2I2Cz0oV@_E~ zZKetCH%KM;IaydkM;Yepk>LC>H{3c~4HyU>3SRh|h>FZE^TvTmr6P0K^jSFJvPKfn zD1c?1_*ebl$N`_hW4Gn9;au49F*|d-JmbD&Os6I%p3=&Awd#xF($s~( zxv$EJz(_~B+QdJs3}2&?bew@Qfh|4aVhK(?9>rpM!hkE+TAVBEwf;l|YZ5(wmH1(3 zBLrDuniE7UpRVfw5DpiBbbTr2N&i+oSy#8jIp;1vB`D7YXKDyG>OwUER!}sAY0k_H zPVxYunavsYQx5<;n<#U`8ffsB^ewok=Nm%aQqjPX`~A8JkvsM(Sk>bf!u$sX2Hu01 zp?QO;nrSRJ@p>h&$nspGP!uVKgnDNE#ztl`%TChbU1BDQ?##zR@le&Jyi(!1eQzb{ z3Ax^1+zrIbJCDv;mko=_T$atP^UHhqKcZh01aq?0`_SUbBOkPtmE6sWjvSh%SBWHH zj$Dt=92$;X&Xn~LS16^Xf~Tl+P1FgkiA?Bg0qo>pZcZCtZ0h?0Sk$2IVMBxpf5Ige zC|=WFSyWJVfo%rOI6GgT3ID_-cY6j}Uxk<%cf~`^e3T4w1dpVYv;o2jwY{Ecuinlt zRpa3vBB)z4K}L^^JzOMD{{cy=%Al=GD?!1C)wcG?*s#UOw|j7@Lk7SA`)Zt_BOTc$ zFERPP0xK|ldvhz_pG@neG+$I;w8Lx%Q*9_Oiq-MFeJpG}Gf?L2R_pMi(R6wArosIK z!m3)seNp$Glzt)A>VEb=_7}n{^C&(P{vh-*ar!12vEnT_JvD4O9z|f^Nr%N9=E54L zvL~^56eU@3#LJL;KJDCDDKt7$7B$lObE&^1TA=E)@T#>I-CH>GC%Q{%i2v}2+opw# zjs0M}vFRVW#y`+PEXw9k;nQa-9I&X-uv5O zKgi-d+}7caVU@4D#^vPck6naH_b7Kb=FX?Jl<`T=+*2N==K2y5n=Nw}yO+D|jhA59 zWSX+VBxY8F(^P^IW1+Euy}TAGc^b%hF-(car=$0__XhnzIc5@JSzi*6<3vP?9Kmv& zeiL~fM6@EKm6bFJi&ZUTa5>sh!byt6!c;%#P%FmIEQA}Yi5)`;ViF*31Q>B~^mz$N zi~=D2H{_yJU}+RwIdd)G6X{FiItX^ow7g7oSr9epF>|6~c>px0xU#c0#GU=>m>=k5 z*qokqLXS8U)gU3|{DsIwAm}I}eIej_9v_80YaxF0$_rtessx1`#1N=PCUBWOe#*6Q ztwAOIbT8tSxNxP+9z2x0Z8MhBP~VrH@CI0R{ws-upItcP+= zDxd}fwVwq&~p zZw8XUD$d}Pchn&&uL`s!Yx*x{_{pr17>bb{e$Q$c01$Jp!7S_x#7_VLOAK`bM4twn z0Te+s6x70>75i6eUR>bW?+lFXaApoe5gie`x)fs< z%s)m#BUJ-p#UPB6m3vSY$!xPYrRACy|9PT2#7C>$&x*J8B@&CI-ZVjf$|*i##VkH_ z7aB?Jg`Uy#lD+b-M%RHddkN7#9%i+WGsPtxMLGBL^+Kb%7u~`+HS{7odu9r!b2U!E zVTAW$@+azRrm=aL;yH)ATv=s$o=CAKr%4lL&b|gq!b=82R3i|yj?%N8gcz0#TV_q3 zhU5CHhX-%8DYq_zd&JBVM_t$)k|DjMk9OfL~{7#UKwaOl2Z z^QYe8CJs+l+OL3js$cP&UzBY@n#GVTT|E*n?84l)#as2>ZF5H`P&111=Brr**W#b0 ztxZTwD50i3YM=6uikk-8RtL=4RTy^wUax0lD1<9qbWHzn{}Ap6B;{*7_2G!5UTD3z z#a9FD6i8wI>+^4_Z(b;u6|b;#$=R_Pgn1%RH{6-N1shXyauTUp>0NZdtzha)kzlG? z+B+1$`sTS?0uW&O;iuQskjWLM&H7eBCB!^XDdjs;JDS|Dz9@z%9+e(+>7wXp&pd|> zv5`jpC;jvvChBjeqFP8tZ&R9Kp-P8!pyZLhL2CC;L`mIpzHtsGjW zX{PD+%9~d*2iy&R+2OwZ>rU5?m-6SaF_kJxDo@)*`(Z&3G%4BoQ~4XgyN6RDmm3ZA zrz2qA(BIAP0YJ8=qpz&C^xOOR_MWn|+nQ}4G19fk(^0crtR7OazmzzTM?h!$zHEF; z`X5jPm&vHCR7%s`E|_h^bCS|g>m$U1oweKO1^f95*K7(EL{1YY#cmNp)usC-z7)iI+6i@-ic3bEHnM|Wxrns}jxhn>P5M2UP{VfY^$PaN$zgh$!VKA& z7?R)pb$EDyJ=`brJ@a&XrLUH&lDoNds@BqOp5N3o+FIo@$HBwH!JyrCb3HwBn#R#- zxLCHSQd-~cwEGRxdX`n}mT9P`r)LBRU}}n(3OpItk%jLu1ITkhd;tLe*^Kn`c0dfE zz<=o(=z;br;F|#5V*sG!0i{0;G5^_34D>R4dd7NsPx@1bdU|%?i@F)b7#ry6=^1Jq z7<>Ey0i(ZSkJ9^gZv1uyDE0%t5ilN7@%tj}z@Yg@AOYWMFfc#gIh+nwK-K#NwsY-p znk+*BR3u4U)Gn-W3NLWx?T-A?8Y#PbWtF+==wgcah-*wp5a9%d61MvyCSN+*yT3&` zjW8`sM^`)5U9AwAK~4(SQR)T-L6CVh)8QH(+gF?O@mApQjoIG&`geUN z@X|lxpN^*g{g;5fAeCUv+YeUV-z{kv{5y5a2_W=u-(29}qy#nW5Fn|*0KOuapKhrC z^)~QnXbzlRKPY*1@Kk!egu z6^Z6^DTGClAP5%j zD(HM_V@>AfIZF__#1gYQa`O-VdUo^Td7$F`+zvSaz~#SndPnof^z;7;<|C5<`2Wfm z6RHQpscUQ^3dhFJmxo(u>-5+cU;4avbt!-+v$D}qID}V z^ujpRD$Ttc89JbN!KMK64Js@6($ zYLpi8g9YGV-MXPG9EvGRl@r?*`i2q4^6L`S$mlkWTy=`>9V2FEZeW_|uHHArl$T{s Yc%fZ9MgMbNCj8)$ux3A7j|PDKKX7+nQvd(} literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/editor.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/editor.png new file mode 100755 index 0000000000000000000000000000000000000000..54c66a1099ce06021873af44870955aea38e61e3 GIT binary patch literal 8395 zcmY*N;ngv!1=z^X$FOiB?mA5#mwf0RRBPw+gZvkL|=`;Q?bm)~2iH{~jBl zn+EI+plXbE_i=z}E&Wa!0H{sCzcs^p9OF7G=(zy^M7{qhz<#H)508^n?sB^Bnod^k zUS_VA05vmPNB37Ma#{?Ye6RQf%eVis000bPZ)K&myp0cyaCNn3{*|70OgD_wjnr9N zUi{(zHvN@XE0>j={I%wX_ay34%*yhl>X@_)0^OvfB&wlh3?Z6C!G$Be;v*T-Srk>u z`(21#bk4kb#Ry+acr)=-_YgZ zjNkoa)~75%A&iXXUrRHtaTXb^zpc1D;)ee$(C2(Ra%XkJFWIppv7aLe>RJX>W{ogHktw`+>}^|bRe%-UqP z&T03+M;&G4hRl-%46y%juo_NO{Fpr#I)vTSToU3D$7zvauXMGE6fnDkrbGm*%R^ys z5itm6dlM5UmD67;ZrsA9cd)3=hQryn6RGK3le8Z5BqWn~o7 zK5<}rXDwnDiW#1Mu^Ns1N?QZf9Jxef@M zqC2vX1ID9)J&`QpR(1sqHM3_la~(SLb@hR*Rx4P+uJvz(8p!3HB65523tRq*X|Wi% z$Uf9ZZM|{Ke6|r@uCXP-S3Xu+PAvtFIs0(&F*3ySVtP7tpSkS8uIvGr z>huZqL;W6@3Yn){^3(T>l-Y8fvXHA>NRRFOyg0YYV%(y$F~dg4&=7(;SaK z|KxycGmNm2TNNo#BRtRe;2xDRq`6UERUSb>v|KYd3kih!f&#^!U`o<|4(94-GTn~` z*IXuGmIe=-njQl!XD)aGjMUQF|BbkV>j+xcj@9QGp?;F{G=bF<1FXD;J#D{O z1S`H*MZ}FenXlt#&l!ji9&E3{XSD5i!(yVRxtVMgTBg@nNv|Pi$V|(GYux zz`(!!NPddCOVx2=?M%dMY?AY#ps0U_D6%VGccEyUlM>aWBoLpQ) za2YghWMyZo$Wn(s;O_{v%3GG%8{9$v&I;%kC~sa(Ge%4GSGfmK&rX5Q3006UQNp?4 zD86|Ccum4uWg+%horkkvDShB5MR!X(HkiW(G+Ve*_%#_4yd_dl8~65Uk016j6ZVf2 zD$i97ji&LwukGC&9gzwcWv!hN9VXMimO1Rr*HJX{`=P7{Yj&2abX?)$NfESJ^eva( zc~0g_?8nW@BXLdUj=$dFl}7 zJ!UtudNfC#JcFg>X3$uU(D>-^FutOqq7(xOJdHyK-rXJ2*x1;Sos`5_v{Gf#MWhuu z^d#ZyebrStK>_rN;8l?JGZ4wUc`)tvXZ=-wGq+M%%NUM*9uU^hq2|S*b>4B^CePvo zY@F%b@t|?~Z^>HZvWe1988Rl4F}(TIzfa?jCK(@#=>m$%NK@gv2md$bz@eYQ=U``SXD z=!yTuj85Rvu57G+{%1;V><#gr3}PUOgT4JCV=xKa6&QY9G06`TTM`Yv4wA0xx;YYU z9CN16h9!?YX>r>YoMfo89;dIVtz9coIj1qg2ZINS>wYnnSK|lrvDXLQ z`L=k_#=nXRo3kBmpCk2mxUf!R0;qScyYtdgbz8(rQTbpd@K9^Zs9AAgGGSRxODR~f z2p14wnDsFk1OB*+{$yh7qV|k>F>RS45gDBmpVc&@XF;Q~CJX@P=r4}Ez|WbNjg|F# zy=Ur(nMniOk`Hbn{jY9A1|T)amW(CC~ z?M*aVxj50aSfje+?%{D^bL}bd1)H5-AOr#`ZEqr_kIr6G58#_d2z4J;!oWr51LQ>k zW8_jF&FECN>rAIkX{m|=Iywr9&gLgm@k^CNg#RqOE07SEe)o>>g>ojttPheJ2kmA( zo=>`PnjpG#2`D@bpjuoo1Nj4MPxQV>{inHeNy(2D!bn zXg8iyr_*wb78UIguWT?-&%Zh+-pDx?*2%7DQ8FEy9s9EhmZE69Fx|Str|o15FL2rj zyS$)vj%&q=CyiKTF2T@AhW}fAOOozI7lQ5ImTX`-^$)xf-9ixFx81uJkO8HYr4(Hm z>`9FoeTgMlagfku3x1K^WcFWn(1QGrMQntZY#9NYMm50=>-s^#+ci*TT3v$fn@TC> zCyyAt6a8LQ6$wkA7cli*vv*S*csEPWWD^+wavfgJ(U5uL2+;+|QGge(@Q!YdCZ3o1 z{UOk&->n(b0XV(-WV@mxJhY%5$}VnnjT+{@oA6m%Pmol(n(ew5NK|EIe9*;&_@9jm zY5NZ;4KV~4U04T^lOgXv74XNq&K!=wmvy4G%a|mt`GfhUM#@kn~Wx}88 z=rmy@Qpz*@;x{$^MfyJuYiM2IoK)6~%@jf<)htWM2F_>39PbElV?@}|=Po#m0m~X1 zQkjMvShNfc2{t!336(Nld6djF77NpT-Oc7}>L{tg)mcF`AKMY(GEiPTaFyd7)is)W zK`9k0sHH}CB`Oy)fYm{6Ujj_l6l__?yguY!EP1V9xsy`~I~URwd>#*|u~AtYqe_~-&MNcf+XtZ)f6WO}Nl-l{Dz-OC0%l_J zK>F(0ER%RQR-(4T$EzU1|Kp3dM&|dmbSKqcd7-}hf1qU+mF{$?g$o^HR)9EM_A4tu z!}vz&WGJP4RAxIzm7aIj{>xa_8)5P^Le_PT?wvO*x2pw2y;d}PKOOo*xqc?oBLr(% zX1vcDzK3xAaQra*ky?*CSFlJCOb_@!X*0)v3HcbDyzo?a4+XlI)-Dxxn6xwxVr7Agm@lHR7BACocpndm zl55jo{AAM9)0C&b3@|+cO@tVm%GK;X6We1qHsXV35<+k4O+tk?zZynN#RD&P zTIqD9qe34hNn)cd5+AFqBTpWXvoHuw45Yfdzd4361&fmaEYQtf2%MG~(q7 z$;D6kJInM&^z=o8Wl45vu3kq}0I#p@V(HKVZhpbX-|Q7gYx2OlopduDk0;)pf^92@ z+RaY0D?%olqg&6b(NjB>J-{-eKZ@B&`WtF|pt4T7;Az@%N^Z#{ecry;8;Xl#Ct-3o)oxx7l6tMSDSKP^JUbPA$0w7dZpHE=aZoHZOCu&umun`FCC)RMo+C*( zSyuq{?NKE*?B_E#Kyo}Z`9VfTriG36m8;0q=)|Elem5gHqZ|X(Jkv-B)6?}5rimr~ z5R$L@LdfW5nS+p$_>b_a&B1lp0`QY+FS%uFQ*g|r_=>i%{kpZ%-xq3wEU&V(!MQq; z>RlJnb)M}jFnq@*mAeIm>}rxM!^pfcj~7PFt+2Mhoz6msuMT1eBb6^LjJZm)}?P>XmAqi{r)Z-9TEu3pA?GKcaya;U0(Yq&qQ)#WzY za64ObeK=3YExE6~`^`lh-!0pJO8-wwl(A<;Mx6kbLtQL%Uk!gUydAQm6i5!!pQ?nbCswj@n_?NPjyV$r=dY8IT6V0)v7QOiY5=t0x;$vJFR&qzTup)@VChbf4FR+7j z^OTO-gg<;tgbg4;{jpS zPc*q44YM3C+DP1ro{mI+Jmr3J*P$ocyN6&B7^Y#N_VoHL`kgrA)Z`bEvG+&6cQRLl~x;u28$sPUNafulCxMZ z^!KA)WOE#q-)e$;Kua~j`A)zv_%n%qmZ@cWr-dfVr3PEg{Yl(KaiRtYsn7;UC2Hp- zo|k{9Ao&!ctX#A7e)slIn}Usygu}~{ciqj5&uk<&A5+klJSvO+_=p6F>zyp_3$Nbk zn4*W_r@8?=-0CYrl9xd(apUa{&EL9#Y?)vfHJ1h;g^O!(_-U+=K-g(X3C3L{$A@}n zy~ZU+fW&QcL(D<3f086shNbmeA=LOrf2;7_Yuo7_LCnuc_%63&FVFOs3(>pZnw=PX z5KhG7!ZZUUJj&!b1g&iY!$J|KGy&t`ubYQOvAv4>R|jaqZmuHNUwxvYy|Abue2vNt zC4TVA(LBsJG9zQnUWOo>BxWaEj}DSI!kB`nhg5qVv~8RDm7C{6s6 z5J?haBSCvRuOth~!Y(n^8fT3$+9C7Wn7q!!*K8?NqC8V$pn54hvZe~5&crd2yQSo zKWRvpqciS?K3B)day2IzwCm#c4po29`D%GOQSf1Eb?x)@@QH>vnBD_ZmEy<~fSJI0 z7r9#7FG$;6KKv+590?Emaf5rB4w?!6wz2Yg8l68KB=s0inWC74p?ShSDTGLa%Ok0 z@PG%f*99A*z`g1l2Jdj;kHf-GsW~$N3`sG0PLoMze=f$ZB(GL67@<{9p~N^;8#>)w z0&m(G%bqV$`=GvE5l;9Z>Ecti;mr8^Cw+p8@^p_37Ud7hmqrdS+G42Qd%Ave2u^~f zc_wO(g{;2bCiA&MjW4B>TDS`npA&8MXmCrX@fVOSSDZ$(N6~qED^F>Xhz1^ZAmZv! zVvhGj-KCL%=vsR3tC9UbGIO7hNgJo`?j7}pFj|jnp1s9YJtqS|c?|Gk76k5Q`Zc*F z=$VZrPmhn8fEBte2o2&0p77zE@DYub^1m7c3_xO6-}bld@)p;K1-dVrZCo|8M8T~m z5t-&VopBB|i646%1_4rktY5W)jQsq7aNHP3S+Q0%8wz42RdHXB)>W+Nq}ZbGWlen_W|{?7GroPVHLLo{Blh6 zPv7cWN(|i>#DCd>$U}5E3x*q+3&yToFe=rcu1pU+ue+pS@xe(^DuA%7m!GV?^7d`f zIuQ0`tcdU573AdP!u{~&EPlt5u64?iI_^;r(g-StZ&!RMaehLV@o-xJb(Z0E3ZyLI z|9+80^0$=iZRbs2YVVg7`e31>%zt>?>qKo1z1p&e;-O_K_DqBfNBk&0^rLsBo+;ql z<(w(xmNG?boHAX3#d4<#&os}I21B6h5UBghxW(ecf_1rV8bq6y6R1|1d~YNKS84}d zJuywXuSSZ&^TZ<&_?j5a@9nHk=EDXW95{}J2-PLu^Cr=tk-OZrZ10fH(?SoAkwy!P zL98i%4Et$E!ql?|K9{0W@;9a}-qj^(J*T)bUrx211)H9PI==5Ir`f!!1o_v%&M}0k zE&%=~8#a_}2&BqdzD9*(9pnGpx?a7GEAOoEO#hQ;m(gL~X$nR(T}FvR_kb#|Bh#R4 z;@Fk#kZjWNW`@br=UsRr_n)~t6^LG@$P8lC$eOXyeOQ2NcFJ0R42!*eT)7Z+ose8A zDMxe~8Y03LImMz1#r#wpK!Hj~^Mb(WyTrT-HLJ-loNI&g1Eg^nft2{oDb--}LPN}A zwx4+NH2O%yELk8(%{u9~L>bs#l`^F9sx0cm_^KNg!+}4}X{a<0%k2kR%!G7i6R9wf z!gbp(XMZ#W27PQW9pf0pu58D+fyAf7VtFYzT{tMwPn#+B&rZIqi+s`{u$>H>f)tmg zdjkq{OFdd6JtiJ_r-brR;=fSQKe?{Zb57}*1q-iwRj*^1U<7-|(W}ostI&k4MoTYQ zoDjSxkYB3Rs;a*c_D635ce`$VgQg4Kue>})W4*oTY8S`5cu>Z7_kfg^x;}C)UFfeq z(9uTi1{GF*DJZtcJ+p3jrZFFNsTG9P)dMopms$>>jX;w>RnslR|Iapki0$$@TzIX`~E*BD{gFd!9Mb9k}Yz8KA2g^_A=-@ za!R}OPPz8P%9OU*+A^EvD zySUu8e>Cr#eq%R zT5(7$!O|yvB&4-CR`QBB=WqPtytm+CZNqIGD@s4MVQTlIKn}vn4vzom=NP5a*AV4+{HNy?&EY?&kmY65WvdrlPb7&>POPubV)N z6nlrG0u#w8fwPf@ALTGw89ZrAqaL779m}lG*|xXpHTyAmU6XP+^9}fnDc5vyji>$v z=W|OLDaZQVLE$eKr*>%Om4&>)5SpB<5*oiun3WUed#?A_iPaJ@u6X!jeE9y2Ys)yk zQFFIx%kv`Zv&=Tn=bc3Ih}lanRZ!|hqPGFz+m&(jw_~&*U_HGfPunW>y0JTp>*(nS z)S@f4A7)XtG9P&R5jtpcOs)>-zo7brvXoU>P`(d0uDIGMetBkM4m_291!qM}*^%#l z)0L`z@#QCIb=@_DKI3!30+z3%0g`W5e2wMoJk`Yf@2MS`-@8Ute8c?=&4+Jh?Q7eT zi$|Azd%`-tTeS-bY?qQ*ZjBe;bm=^lywE0WpD$hf4L_~2ncFjD%p+6J_J^3B$(6w7 zxAMLWMpGnA$sGP$8e>Lt92{%Swq@ssE#+j%Q{u~?NJB~=p3JJ1p}lJ1;f=T)vBcZc zT+3NLPK)2?uq+y!;&W}tgEnC9ri2;i*$Gy%#5+Szmo|eo&Gg{;k*u+SZWtDyKTxy9 znyhC`ef3KGAwg>7&+%HFs?p5PUt)09^Q~ zo6D8FH2#Duw58|FX^ptsFP^Q4OWyUTo{x6IOqZ6mO`H7~ZA2>&Bg7W4*_#EMaL^E7WW4E;2qzW~@=edRtK4JVl&QI#YS_O<~y6QsUPB^ms*) zTHM_Ce4oS6ivK=)1GlT>s9OgCI%u^A&}YPfr7pBo=pXbNXW92i#A>W1f-md{NO>@kmGVoccx}JLW9K~4(OczMZ)247{?N4JZ57h0sgHhnv3~?niKD*i z_R4_8X9pe5i6LD`@^A5R=m)nK@9r=e97PQ2A2!P$g43@^p4}_9F-lE|u=Gc&7r&eO ztR~@%qMIsEMoTau9eY#G+D5+@rE{qc6|}8&+Dsy}GP_u?8gv%@Nva^!beF1!7A}f> z%hwh5MP-){-5_!C@eu2`%B@hPP*&dEMp{?5!m+WUPiRZy{qBC{6y=rjm1ke@kxcHw zB=%ijnaDymWzI-GVIxCPRHI>`HtOE!n@3(J(@qOd_8Z&?tgl?b zrY>^dzu4wnIsIJjb~Cb@vx*fK`K#R=`u;>Ayj^D+R_^sD=Ds84u2K7p%DMw@t4xl| z%~6Jetg}54H^;dE*Y8xQ3;d1m>~E^ScgJ&$$uKb)ZP^ncP8ubTS^(jwODW#<%A%Q?3 zB#3}*F244xJzm4k!JZl0WF*U;nKNhBzO8++*RY2PIqLPgNhA`6%RJAM)i{@HUcxjl znM$Q*s@1C8=Q=z;G?bESxSve+$$ELze*3#!9@taAgTGyfUKDUX&~8IWT`ZoOH*emU zi;D{ZUa3?>sJ^~F`9SdD;bAj6I%?ACK>=N_TNosi`S5Fp#wO?3#oRTw5s)_>O>U%@m78b9i`Y3Rc?y zhY!pOaQMbrx*5;uMgTuPK5m5=4qV06dXyDn0p}+C2B7`@eRFVdU=n@()^C#n7Mdnl zXpP#&J$$eZ*UIIxxpCu$$>;NCxat3{*7ZKEED#Gg06~*HN~Mz7+uJjzr>8c${Ohe^ zoPmXB0Tycp1_pwChK7dB2eZ>65ckkQjo4^+!~*V0k3ihr-SuB)5`kv%BD#eZgx9Ef z1TPK<0pQTSUgHYUwZ>gnIX*r%TU%RAI`n;7Yu%+VK9B2+1^%9y&Y6*s5wU1oDwIHu zqC#%G>|mA1x||gv<0YS) ze2Wg_S}s!Kt|qYY^XJda%aO#73^@H+in3-ahhU$bwc4J@zEv5zm1w(tV*__< za@5ptnXT=eP~h}&f~WQ7=H?{TqvyoYs>|xRkpM{erRy><_sXA-Vi5ra;HYDHdD(XS zDU)bc#qR{TF8=ikAP|6~EdwyP5WXQKuCZ|z+O%$hZ`@C%Qs&N`J2F=Ra5ufjNk);b z5~a?6{{7Fqdi5%JIl(aq-GLIWqo}%d>y{PJc2DXBQT2(&5(%8z4x+g^dLUaIpA^m7 z+M2KgdPr*5?LDy`0g0@+xVUKBwfAJpsjr%& z0O-sJAs8C~eRg&xb;-iQf>0ou_*Nr0mqJ@vJr-~+xu!*E`O#m0i?-dDaX3Ul5Dyr` zp+Zl=Xm9@@D8L{ft)c^(9X#t6tQi{{Gq-Qw zHmO0s)@c=>VVaKx+%*+IZ*OnQhyt0DRL2*!nyp|D&JuAStTR79Zx%mZ5O>l7b3PMB z43WUKo50*i_W+FKBU)7{->o<30#b}MYZUCksTeGow+xfB6(Z}EC>IGxqHb4~ZQ924 z6bJk+Vab&w9+g-kd371dS>&o6QPMa(>R| z+yv#7E44;4d382Yt@;yKl&>gbQJX+hUdCy%gdh%Cf@gI zR^|9x1AXMm%8CS^NYu=bnjy#@6bc&XRpYc8>64&Iojgyc)8_8oyP|#Z|7xw#K;w(- zhsBI~`Vv7x7;a8WXol!U+uV~@eAZ6nKJSQ(o4e*68820C`S2NuGwAP6_%KwbkRNB06+KdXIQ zyDEMoL7`0q9w-adrT5E&UmGZX2vkd~|KGeWfZgmv9AqB&yZ7TyKU+Gi2o1G!jc#6c zUC+224voVC-gn>sU|Ged8P^p$9sPC(_UgO+eXb@&9e3WBUwzx454+{%b^CE^!J>f^ zho(yJ{ukc}a54%5L!Wo2$+%C21J^;TaeANM|5}O-R&bg@;#O*LA$Ftjb|v!vQy9V& T6R?S>00000NkvXXu0mjf(mH~* literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/grey.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/grey.png new file mode 100755 index 0000000000000000000000000000000000000000..0d0a76471f2862c795474941aec0e83f2cb59ecf GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}bl$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G{GKk3Ar-fh5)u+J7&r_V7+M(`Utjf^36x^+boFyt=akR{ E04xj~NB{r; literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/icom-message-notification.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/icom-message-notification.png new file mode 100755 index 0000000000000000000000000000000000000000..ce1dd1a886c906ec36cee1dec72b9df605886f02 GIT binary patch literal 832 zcmV-G1Hb%k7RCwC#n$brDK^(`2<+!Jah`6UC zB6^C5h=@4)4|jR5=a_ zzRF^}svNfv^ZdeBqWN>ez`6O3CP!Ob6K4KgljDGB{)*sTz z^!1_w(9GG-TyfDP!Xo{00A?<4KW=CfaL&!$~?mW93ud- z3_)ie1;GE|1Obpm2w~>A#vwlZ0OULT3;~cO2o&>Dvk;$t01|?#%xy-f#%wh&H3#uH z%$L{-A&Pnb^MGX;LLBpvWebE<%-aGXRr6^>@B+0UGRf&e7>ied9i0f84^6TZJ!A+9whO+(;!!F#YF;zg_o!^}%< zGkk06A@JD`#0GHz6bHf##J%YUURb+q4dR=rH)D8#QX6s=7zaZ2Kh67ZKWsPpMwF>h zmcl094*z1_Z=xoi4f_x)S#E};)g`u~9hP>B+z5nnM$H?8a7BP%`{qb22=eStDWm3x zg)jxNiZw*A)>t0*2B$?WvJ%!1$@}hbPqxO2d_LeA15oG_B85LARQOY3?wp_|o{0^U zHL<40a`3hPI3dTTW*ofXI!ef~!-ywEDQATr105Wd)|viX?ieA*mL>=98jTQg>=7rG z!(@x>@8onp!CAW{&f2af2c=}kUg0{JbIi%f$;rvd$*HLN6<`1!uF_d9==`$)0000< KMNUMnLSTX$7j)+U literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/loading.gif b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..7cdc671dbbef29314df2c8e0947fff9eb7b69068 GIT binary patch literal 869 zcmZ?wbhEHb6k!ly*v!Gu-rjC+Zyz2WuCA_r{`~pv+qci3KR-V||NsC04A_9;e{Mh5 zkYH!W09PYD17=2`8pWS1tn3UN3_2k7AY&O=f(1@`uHM@raAxbX;6RUiZ9IonyOwk= zx@HxYFLhpw=iQXV4~++oJZENY7JAfQETT5uO}(F;A%UgIdu!IgB;9E3M+FlqHYXU) z%yDbJ_Vi_o?sRt~dl(rQ8H9k4fyGbYq^9>mi|E-a4X>&RvV5z3=rQdwXOi~qeUdlt z$}&8-Y@lEzd;U51yMiP0C$xVsoY{U@SKxrlVo9y3MN^enm^!ze`r33b>C;=8ITTCn4E}aMf1V60dOlgSctTu737Odj;m_2 z?5I}UHFzM*fMx~Dp|c5aE4WyRw89x2P!daHQYDH||gUJeLR}Xvo@mM|+31TDlU0H2`ZlNCf}@ literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/rainloop-logo.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/rainloop-logo.png new file mode 100755 index 0000000000000000000000000000000000000000..1cb320c2ee599723c1ffff22f980a90928b50800 GIT binary patch literal 4750 zcmbuD`n1|E{0O&R}Rh3L$ z{rokl4OVTLRaoGdm;@K2;P=C44f?z3UDfKhMSXj7! zxF4ROuynSp7zcu@@}5N6Ts6Vm8u44GnyGVLNVf9+ui){Oz8%84tJ*QUbG?U|HdG^* zs^1&=g@s&^#!d&#u`zM{J>r|fwIj-xuy_fVQIBC=5J|z{IWKase+RGF5TmoWubz$I zUy2?X&XH=-U|rN|M7v`euVOcuP+5gnq>EL%n^+owk#F3fRemK!`jV&iyrS7~B9Nm} zLOknK5K!}0?9-=3WLB;h{hH4>y#3otrBNP)HEl}6v}kJ^5J8Yrs~>>*dW5WZQ{^UpqAr7q}z?D_rV zc+VBNRklCvX~3jSyGvdRqUj@b*vzRU?((bI5Y1t#F72I7nn6-sn9MYvX#d?^5DS04 z==BV?YOM0kMbn!pgbdf2APP7*a59CI3k>MD)GxEz*pF#Wd<(uPg9ju(-EBktE`APU z9qF$HD#g73;nOwE@kqe=hXMMzULD?yxQgm2FeV>LNRIa z#Ir=~r{yHla2dOxu3fT;(ZD)Ltwx-4y2}{Lpe}PSbvihJl4GxkiaV0uhB4PJLDR&M zN_9Pwgkh>mQ1tzQ-<@(kxNfh*oA-cQhb)yr_Jc6I zx)~ZMIFj6@;)Hn&jEu`i5HZWMJ=_JC!l1ljXZb<}SZ?Uc_32xy4k%-jVHBOyp!Jgf z7eGWfEq4?42v@a*IU&vIXGbhW^;*|vk1^G-na6kOYj^*P&HvFphntbM904d*(L2T1Pd!rGP5Lz@L7(5pC&3aT)<3OJnvc+Cc1B0G9vGes> zv{#T>i_7D3|CQ(ALx7DJ0{4B5|N)x+8-VM3#Sae zeX2h44R_rh3ol*Y$iR4Bu`7pui)c=yQ?b_==-K2Z$Quv?rmeg^2gT0Z=_^m;|$|+J7?EM?~c~xd{Ft2myXB>ul zj+Hc1uRuR-dH?KC)wxwSp$9b0=mU5jZ*F<=^$bnovZsCiL`jPp$%3*rdY3_Wm-}w+ zBDv{-%QCU~^y?PUWFdj^&j!P;tOjY$hflv_0zzNl*@AWehb8hv9(m18zYpyE)U!kE zW*ge;@nRQxgk;Z=Z~MtyFCrF#srZ7X|MH%pQhqGCLl3(xjaB$LcYD3(1n7EN%ukUx zJgVBIV;VX+3U+6OP`QE(JeT)Yytt4k{DBD^$*cQn`~qy5z$ z?q1-XGl@jA8PN1{)zB4%xnd)AsK@EJiypmwxfkmP-0Ygh%ZU%DSsivsVEQFk3I_ag#Sj{uG%kQTJXtsOyN2U=t3*z|XcRCs+ z_NaM0^|6VPPRN^EGa!Q6SFXHO_(L9No6(NyU$WjAiMnv3&HQ<2Xc&HaMy=5nIB-K2 zkahkW2eb;1@+bb(jC_PPH^B)h4BJgYd>>Wjk$$1DuV{GPwQugOEBQ=rALydF*IaB= zp;ZIzd?)XAFw$fM-&Ky7%8&L^S+ zQ8=1MA^-sXUhc?mDF8=n07eAFHph`1bQF$Z8W9SyZ0g?VB z2IgI>EqBGT{}|xlh^)R5DQ?2Pw4q@J$!XCLItw8<&x5yEN1U-U^gVGZA}RXsHJ)9< z1`4Z8+}N^DzEc0#$TZbr3N-?Y1J;<6!XXwP;IuNCHK;@U`UdFBlYPB6j=@>>$=-ze zf&)@UutW9~G%a)JRo@A!@R!Q;Osr&J)>_abd~U?jQV`jEIdi?GthUAkT3Y#YL-4xP z_}l0(mhh;zkUL^uiQQng)Wjr`dyYAJ>9NX*GQ1zn?@63iZxrvU-EmJ+DU{Ms4dV${ z>+2ZrQ)386d*UbYY;=|F9ywcf%=#ZCZo@|Zd;%?!G0eu^!|EA`gopl(wARcL{A z`E?YnxM(bLaMHF?ot)+e9jhj=aP!YE>AegVzljses!kRM9{he^;XM6N&e{s%vnD3@ zmVRBEOVsaHf{29v1D{5)Y)%YRz0I=I5~BJiZXmz4ao%S-W!i^o^$#CwVO$2J#p_TN z`DNsH6LTo_Hu`$eEzQU-;(~19O6D?LErSwUKiC~dmEXaez5z<*ZcSM=SB(~`PnRqg z)pvlt@ci|i{I0gSJnlZ?ex%fEFXn682-_UOJeVqf;JK6}1wUtDhu)4RanTEL4A{++ z5Ley_Qtd5k-5qsW2!`e@BaMmPB|#n$$$p)G?ZlO5!VO`xr;m@jYCU%U9L-waEUMo= zd)r7f#^_qAO_erfwoB%+%(}QMce$L79zMJl$=cddt3PO(uBO>VU9neHUB2-;x3f^4 z-SiPnjy*#USU3R}f15$1<+Zi$*1LOXtyKJ8^!*A0(01s5$k6-F%@FCz*c5toMTqk& z?b87e8&A^{Fv@w~iYt6LE9FaRpfga`sNZDxN_r(i(zRjjTxbz>-REw7;e?&6+j$^; zkf}U@Ulie7M}h`T!Q%H6US$zCF(bGD&C&=a{v(L)xexAl%K(wQrtHa2d*kp&hUXBq z&33nMJE$ic4!HNUd>TWvhlLykq@xUSpRZ>SUR@%3?9$-FfUVao@um zukhxn@iQ|>`Sd;oh-+c)$9s8KmLFeh<%sikkb6WqV0`iMKt{kp4F^ap$twcQG{UL*8 z&OMo-h+OSSEPKklOn`I$e6(5LgSRUj_b3g*q3l!@OHiwfnBFlQ5Rcn9JHUl-4#t!D z+yvlm+n69WbY}CNH(8&PxwT0!hnGl;n$S6Q-RN68{QCj{Iv0T6gSivm1NMr>e;-`~u)< z0hb3fW*(SJ$0xpl3Ns6liBdYn!?+mu0O1wTDf52ovEkz+@!Tc~$@sTT5+etvInlm_u5$pdw4mtJm1nqxjjyh z<4g$@HjK5q2>@rBDM+*6TSh}x6C4sHcm7zwjekPnU)R`&ZVKQ}ofDjZhSyHG77iFI z%!?-~iNNDar!(cw*4r!0r8n8m8(ZG1-E1DHrz;v_6J?4!`M z0Qup`vh-U)txZX=qlVo>ZKMtL{jQu6hM(EDf;>Z8j`20oI|q2nv5thoPdSDP6g9RH z@2KGWHW+6gs%kPRrR9NQV(I1Z$WHaxf9_B{^c$ig^H*Lii_WFv_ zW1QA4x9R`^Hhmhg3w+5`NM;?7la`XOmjt$<_hCc)FN#I;m($1RQ42}7dvDr{gf`Tq zTa}x#DP>K741TXgsv7Ex0W4DSE0RRFX58vdR1XiiPhwC%0pw*tf#p#zRDee5vfy&@ z7h+GlyGQ)Q?jAef@b-i|+h3X;|AqCh{f7YSc1cl#F&SUXs*hn}+m%Z`RT5pdwIIlcpuT~o^3`HY~RDXS#t3$yeVud~ulsBQDScKwBEM3tyL`@rXu z{v2a1uqA0s@ZR=c<1XShHK9hjwKq{J^vOBNM`*^Sqo`C%U)oYnVgQ02(#IA{hSrtE zU0ANtJ$}BN-S{SA-IA`9 zKavSv6n|@eaVC-lDm0ZVXq9dW`H7vNl(%@aFtpe3Dv;ef`{kB772USvWseHx!HbLs z1=AA3%8PoDQvPQ2HlT#8`T)AR8s^PGB(4+(~8*OhEe5rd0x}=$5A{sYqrpX91nD ze#Yy>ou}aNzVUi7sL-I|PUR-S`q;C?!y*DuvWMmBGBTL0`vIwXZFKG@lK9Uj7TxYJyX%tnd>R=^jv&WV5NYpuMC?(79^OUeJ}J4Rto+H7r^ip6$jZrGzGCIv zdGp`CeY4)QEFmIYKlU6 zW=V!ZVpd{BPJUvFUS?ieK7-;<7EUgpDjkq5AV)H=1}G@>rDV=qY9NxMsMV6NYV8b> zV-uxJ8$Phz>}ZJYWwBw(Yz>$w(8}1^x~OlBrcQ%r)Q?3fNgsB3OqyWPvcgnNwxZKC zTfs(He!g3T(^(3HS!+Aoy$El!_eutIFzqJ{mA*#hU49T~W7 z0?ZBAZ8%vP4EQ41EVOtz+m#iuS)Ks&q4MVm8n;9|w78B0h;ZsIX*Yat+{k6+eA>`^ zi$_b-LpBe+87en7Rx)r1?7Mh|^+p!AUSqh6!yUdzhD8P*oMNpy27OLfxcagMyq>+~ z3AHyZXJ)BU$>xpGp!i@LKb8+W!Wu)`0v5 zjJ*{OJg$ZUhfYf5#!4LDDdEv`q3wnSyFeF<36sKe4IPPPZi3=zRII2vok~9CmrFteyrc9TL5A-sYQlJ#^R)cIuWiYc(~yN{I+8Ijnmz rVMRy60j8eTz-^EsPmaOfMdq_M_mcK4_$GFXF>Cl~+#Mn?;$ literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/sync.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/sync.png new file mode 100755 index 0000000000000000000000000000000000000000..0caeb92a36a0c1db6c86c050e07a998394d9f1fa GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF3h)VW{r~^}hK-xzlalM3ntuKI zwP)YH<0np(l$Aeu@-!-K-f$Wov##*!evUY zh7ML)4MN=o$k1!W~91hcIQ+@-;w;=ses<`yY%SfjDg+0&RUgDc>;nyT&s zzON!;{%2X(*!q-IP0czkx^+e5vN243%wH|NFR~hFpK6I~L`h0wNvc(HQ7VvPFfuSS z(ls>HH8cn@GPW`>wK6u=HZZg@Ft`)*Uk^n?ZhlH;S|x4`YZ=`q0W~mqy85}Sb4q9e E0Q4eotN;K2 literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/white.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/white.png new file mode 100755 index 0000000000000000000000000000000000000000..7d7452b9f3e56b54ced5243103c5c3ad4d76afbb GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}bl$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G0-i38Ar-fhe*FJm&+O2^$iP{{T=&AL#Rw?J;OXk;vd$@? F2>^JA9qj-B literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/img/loading.gif b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/img/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..7cdc671dbbef29314df2c8e0947fff9eb7b69068 GIT binary patch literal 869 zcmZ?wbhEHb6k!ly*v!Gu-rjC+Zyz2WuCA_r{`~pv+qci3KR-V||NsC04A_9;e{Mh5 zkYH!W09PYD17=2`8pWS1tn3UN3_2k7AY&O=f(1@`uHM@raAxbX;6RUiZ9IonyOwk= zx@HxYFLhpw=iQXV4~++oJZENY7JAfQETT5uO}(F;A%UgIdu!IgB;9E3M+FlqHYXU) z%yDbJ_Vi_o?sRt~dl(rQ8H9k4fyGbYq^9>mi|E-a4X>&RvV5z3=rQdwXOi~qeUdlt z$}&8-Y@lEzd;U51yMiP0C$xVsoY{U@SKxrlVo9y3MN^enm^!ze`r33b>C;=8ITTCn4E}aMf1V60dOlgSctTu737Odj;m_2 z?5I}UHFzM*fMx~Dp|c5aE4WyRw89x2P!daHQYDH||gUJeLR}Xvo@mM|+31TDlU0H2`ZlNCf}@ literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/loading.gif b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..7cdc671dbbef29314df2c8e0947fff9eb7b69068 GIT binary patch literal 869 zcmZ?wbhEHb6k!ly*v!Gu-rjC+Zyz2WuCA_r{`~pv+qci3KR-V||NsC04A_9;e{Mh5 zkYH!W09PYD17=2`8pWS1tn3UN3_2k7AY&O=f(1@`uHM@raAxbX;6RUiZ9IonyOwk= zx@HxYFLhpw=iQXV4~++oJZENY7JAfQETT5uO}(F;A%UgIdu!IgB;9E3M+FlqHYXU) z%yDbJ_Vi_o?sRt~dl(rQ8H9k4fyGbYq^9>mi|E-a4X>&RvV5z3=rQdwXOi~qeUdlt z$}&8-Y@lEzd;U51yMiP0C$xVsoY{U@SKxrlVo9y3MN^enm^!ze`r33b>C;=8ITTCn4E}aMf1V60dOlgSctTu737Odj;m_2 z?5I}UHFzM*fMx~Dp|c5aE4WyRw89x2P!daHQYDH||gUJeLR}Xvo@mM|+31TDlU0H2`ZlNCf}@ literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/preloader.gif b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/preloader.gif new file mode 100755 index 0000000000000000000000000000000000000000..7cdc671dbbef29314df2c8e0947fff9eb7b69068 GIT binary patch literal 869 zcmZ?wbhEHb6k!ly*v!Gu-rjC+Zyz2WuCA_r{`~pv+qci3KR-V||NsC04A_9;e{Mh5 zkYH!W09PYD17=2`8pWS1tn3UN3_2k7AY&O=f(1@`uHM@raAxbX;6RUiZ9IonyOwk= zx@HxYFLhpw=iQXV4~++oJZENY7JAfQETT5uO}(F;A%UgIdu!IgB;9E3M+FlqHYXU) z%yDbJ_Vi_o?sRt~dl(rQ8H9k4fyGbYq^9>mi|E-a4X>&RvV5z3=rQdwXOi~qeUdlt z$}&8-Y@lEzd;U51yMiP0C$xVsoY{U@SKxrlVo9y3MN^enm^!ze`r33b>C;=8ITTCn4E}aMf1V60dOlgSctTu737Odj;m_2 z?5I}UHFzM*fMx~Dp|c5aE4WyRw89x2P!daHQYDH||gUJeLR}Xvo@mM|+31TDlU0H2`ZlNCf}@ literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/social.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/social.css new file mode 100755 index 00000000..5c2859ab --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/social.css @@ -0,0 +1,448 @@ +@charset "UTF-8"; + +@font-face { + font-family: "rainloop"; + src:url("fonts/rainloop.eot"); + src:url("fonts/rainloop.eot?#iefix") format("embedded-opentype"), + url("fonts/rainloop.woff") format("woff"), + url("fonts/rainloop.ttf") format("truetype"), + url("fonts/rainloop.svg#rainloop") format("svg"); + font-weight: normal; + font-style: normal; + +} + +[data-icon]:before { + font-family: "rainloop" !important; + content: attr(data-icon); + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +[class^="icon-"]:before, +[class*=" icon-"]:before { + font-family: "rainloop" !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-arrows-in:before { + content: "\e000"; +} +.icon-arrows-out:before { + content: "\e001"; +} +.icon-list:before { + content: "\e002"; +} +.icon-search:before { + content: "\e003"; +} +.icon-user:before { + content: "\e004"; +} +.icon-user-add:before { + content: "\e005"; +} +.icon-tags:before { + content: "\e006"; +} +.icon-paper-plane:before { + content: "\e007"; +} +.icon-reply:before { + content: "\e008"; +} +.icon-reply-all:before { + content: "\e009"; +} +.icon-forward:before { + content: "\e00a"; +} +.icon-info:before { + content: "\e00b"; +} +.icon-right-dir:before { + content: "\e00c"; +} +.icon-down-dir:before { + content: "\e00d"; +} +.icon-image:before { + content: "\e00e"; +} +.icon-print:before { + content: "\e00f"; +} +.icon-calendar:before { + content: "\e010"; +} +.icon-cog:before { + content: "\e011"; +} +.icon-wrench:before { + content: "\e012"; +} +.icon-rocket:before { + content: "\e013"; +} +.icon-fire:before { + content: "\e014"; +} +.icon-purchase:before { + content: "\e015"; +} +.icon-apple:before { + content: "\e016"; +} +.icon-dropbox:before { + content: "\e017"; +} +.icon-skype:before { + content: "\e018"; +} +.icon-creative-commons:before { + content: "\e019"; +} +.icon-ellipsis:before { + content: "\e01a"; +} +.icon-left:before { + content: "\e01b"; +} +.icon-right:before { + content: "\e01c"; +} +.icon-down:before { + content: "\e01d"; +} +.icon-right-mini:before { + content: "\e01e"; +} +.icon-down-mini:before { + content: "\e01f"; +} +.icon-up:before { + content: "\e020"; +} +.icon-star-empty:before { + content: "\e021"; +} +.icon-star:before { + content: "\e022"; +} +.icon-at:before { + content: "\e023"; +} +.icon-list-add:before { + content: "\e024"; +} +.icon-google:before { + content: "\e025"; +} +.icon-google-plus:before { + content: "\e026"; +} +.icon-twitter:before { + content: "\e027"; +} +.icon-youtube:before { + content: "\e028"; +} +.icon-warning:before { + content: "\e029"; +} +.icon-warning-alt:before { + content: "\e02a"; +} +.icon-power:before { + content: "\e02b"; +} +.icon-plus:before { + content: "\e02c"; +} +.icon-ok:before { + content: "\e02d"; +} +.icon-remove:before { + content: "\e02e"; +} +.icon-file:before { + content: "\e02f"; +} +.icon-file-code:before { + content: "\e030"; +} +.icon-file-chart-graph:before { + content: "\e031"; +} +.icon-file-zip:before { + content: "\e032"; +} +.icon-file-music:before { + content: "\e033"; +} +.icon-file-text:before { + content: "\e034"; +} +.icon-file-bookmark:before { + content: "\e035"; +} +.icon-file-image:before { + content: "\e036"; +} +.icon-file-analytics:before { + content: "\e037"; +} +.icon-file-certificate:before { + content: "\e038"; +} +.icon-attachment:before { + content: "\e039"; +} +.icon-file-excel:before { + content: "\e03a"; +} +.icon-file-movie:before { + content: "\e03b"; +} +.icon-folder-add:before { + content: "\e03c"; +} +.icon-folder:before { + content: "\e03d"; +} +.icon-floppy:before { + content: "\e03e"; +} +.icon-eye:before { + content: "\e03f"; +} +.icon-facebook-alt:before { + content: "\e040"; +} +.icon-facebook:before { + content: "\e041"; +} +.icon-bolt:before { + content: "\e042"; +} +.icon-download:before { + content: "\e043"; +} +.icon-upload:before { + content: "\e044"; +} +.icon-popup:before { + content: "\e045"; +} +.icon-github:before { + content: "\e046"; +} +.icon-telephone:before { + content: "\e047"; +} +.icon-mobile:before { + content: "\e048"; +} +.icon-pencil:before { + content: "\e049"; +} +.icon-trash:before { + content: "\e04a"; +} +.icon-left-middle:before { + content: "\e04b"; +} +.icon-right-middle:before { + content: "\e04c"; +} +.icon-repeat:before { + content: "\e04d"; +} +.icon-key:before { + content: "\e04e"; +} +.icon-lock:before { + content: "\e04f"; +} +.icon-home:before { + content: "\e050"; +} +.icon-address-book:before { + content: "\e051"; +} +.icon-share:before { + content: "\e052"; +} +.icon-suitcase:before { + content: "\e053"; +} +.icon-new-sign:before { + content: "\e054"; +} +.icon-users:before { + content: "\e055"; +} +.icon-earth:before { + content: "\e056"; +} +.icon-mail:before { + content: "\e057"; +} +.icon-checkbox-checked:before { + content: "\e058"; +} +.icon-checkbox-unchecked:before { + content: "\e059"; +} +.icon-checkbox-partial:before { + content: "\e05a"; +} +.icon-radio-checked:before { + content: "\e05b"; +} +.icon-radio-unchecked:before { + content: "\e05c"; +} +.icon-google-drive:before { + content: "\e05d"; +} +.icon-spinner:before { + content: "\e05e"; +} +.icon-archive:before { + content: "\e05f"; +} +.icon-buy-sign:before { + content: "\e060"; +} +.icon-filter:before { + content: "\e061"; +} +.icon-sync:before { + content: "\e062"; +} +.icon-ellipsis-alt:before { + content: "\e063"; +} +.icon-cloud-up:before { + content: "\e064"; +} +.icon-cloud-down:before { + content: "\e065"; +} +.icon-import:before { + content: "\e066"; +} +.icon-export:before { + content: "\e067"; +} +.icon-copy:before { + content: "\e068"; +} +.icon-angry-smiley:before { + content: "\e069"; +} +.icon-happy-smiley:before { + content: "\e06a"; +} +.icon-help:before { + content: "\e06b"; +} +.icon-resize-in:before { + content: "\e06c"; +} +.icon-resize-out:before { + content: "\e06d"; +} +.icon-world:before { + content: "\e06f"; +} +.icon-braille:before { + content: "\e06e"; +} +.icon-play:before { + content: "\e070"; +} +.icon-pause:before { + content: "\e071"; +} +.icon-stop:before { + content: "\e072"; +} +.icon-check-mark-circle-two:before { + content: "\e073"; +} +.icon-laptop:before { + content: "\e075"; +} + +@-webkit-keyframes redirectingRotation { + to { + -webkit-transform: rotate(1turn); + transform: rotate(1turn); + } +} + +@keyframes redirectingRotation { + to { + -webkit-transform: rotate(1turn); + transform: rotate(1turn); + } +} + +html, body { + padding: 0; + margin: 0; + overflow: hidden; +} + +.social-icon-wrp { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; +} + +.social-icon { + position: absolute; + top: 50%; + left: 50%; + font-size: 140px; + margin: -60px 0 0 -60px; + color: #999; +} + +.redirecting:after{ + content: ''; + position: absolute; + width: 240px; + height: 240px; + top: 50%; + left: 50%; + margin-top: -120px; + margin-left: -120px; + + border: 8px solid transparent; + border-color: transparent; + border-top-color: #999; + -webkit-animation: redirectingRotation 1s infinite ease-in-out; + animation: redirectingRotation 1s infinite ease-in-out; + + border-radius: 50%; + z-index: 1; +} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/social.min.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/social.min.css new file mode 100755 index 00000000..5bbb4f4e --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/social.min.css @@ -0,0 +1 @@ +@charset "UTF-8";@font-face{font-family:rainloop;src:url(fonts/rainloop.eot);src:url(fonts/rainloop.eot?#iefix) format("embedded-opentype"),url(fonts/rainloop.woff) format("woff"),url(fonts/rainloop.ttf) format("truetype"),url(fonts/rainloop.svg#rainloop) format("svg");font-weight:400;font-style:normal}[data-icon]:before{font-family:rainloop!important;content:attr(data-icon);font-style:normal!important;font-weight:400!important;font-variant:normal!important;text-transform:none!important;speak:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}[class*=" icon-"]:before,[class^=icon-]:before{font-family:rainloop!important;font-style:normal!important;font-weight:400!important;font-variant:normal!important;text-transform:none!important;speak:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-arrows-in:before{content:"\e000"}.icon-arrows-out:before{content:"\e001"}.icon-list:before{content:"\e002"}.icon-search:before{content:"\e003"}.icon-user:before{content:"\e004"}.icon-user-add:before{content:"\e005"}.icon-tags:before{content:"\e006"}.icon-paper-plane:before{content:"\e007"}.icon-reply:before{content:"\e008"}.icon-reply-all:before{content:"\e009"}.icon-forward:before{content:"\e00a"}.icon-info:before{content:"\e00b"}.icon-right-dir:before{content:"\e00c"}.icon-down-dir:before{content:"\e00d"}.icon-image:before{content:"\e00e"}.icon-print:before{content:"\e00f"}.icon-calendar:before{content:"\e010"}.icon-cog:before{content:"\e011"}.icon-wrench:before{content:"\e012"}.icon-rocket:before{content:"\e013"}.icon-fire:before{content:"\e014"}.icon-purchase:before{content:"\e015"}.icon-apple:before{content:"\e016"}.icon-dropbox:before{content:"\e017"}.icon-skype:before{content:"\e018"}.icon-creative-commons:before{content:"\e019"}.icon-ellipsis:before{content:"\e01a"}.icon-left:before{content:"\e01b"}.icon-right:before{content:"\e01c"}.icon-down:before{content:"\e01d"}.icon-right-mini:before{content:"\e01e"}.icon-down-mini:before{content:"\e01f"}.icon-up:before{content:"\e020"}.icon-star-empty:before{content:"\e021"}.icon-star:before{content:"\e022"}.icon-at:before{content:"\e023"}.icon-list-add:before{content:"\e024"}.icon-google:before{content:"\e025"}.icon-google-plus:before{content:"\e026"}.icon-twitter:before{content:"\e027"}.icon-youtube:before{content:"\e028"}.icon-warning:before{content:"\e029"}.icon-warning-alt:before{content:"\e02a"}.icon-power:before{content:"\e02b"}.icon-plus:before{content:"\e02c"}.icon-ok:before{content:"\e02d"}.icon-remove:before{content:"\e02e"}.icon-file:before{content:"\e02f"}.icon-file-code:before{content:"\e030"}.icon-file-chart-graph:before{content:"\e031"}.icon-file-zip:before{content:"\e032"}.icon-file-music:before{content:"\e033"}.icon-file-text:before{content:"\e034"}.icon-file-bookmark:before{content:"\e035"}.icon-file-image:before{content:"\e036"}.icon-file-analytics:before{content:"\e037"}.icon-file-certificate:before{content:"\e038"}.icon-attachment:before{content:"\e039"}.icon-file-excel:before{content:"\e03a"}.icon-file-movie:before{content:"\e03b"}.icon-folder-add:before{content:"\e03c"}.icon-folder:before{content:"\e03d"}.icon-floppy:before{content:"\e03e"}.icon-eye:before{content:"\e03f"}.icon-facebook-alt:before{content:"\e040"}.icon-facebook:before{content:"\e041"}.icon-bolt:before{content:"\e042"}.icon-download:before{content:"\e043"}.icon-upload:before{content:"\e044"}.icon-popup:before{content:"\e045"}.icon-github:before{content:"\e046"}.icon-telephone:before{content:"\e047"}.icon-mobile:before{content:"\e048"}.icon-pencil:before{content:"\e049"}.icon-trash:before{content:"\e04a"}.icon-left-middle:before{content:"\e04b"}.icon-right-middle:before{content:"\e04c"}.icon-repeat:before{content:"\e04d"}.icon-key:before{content:"\e04e"}.icon-lock:before{content:"\e04f"}.icon-home:before{content:"\e050"}.icon-address-book:before{content:"\e051"}.icon-share:before{content:"\e052"}.icon-suitcase:before{content:"\e053"}.icon-new-sign:before{content:"\e054"}.icon-users:before{content:"\e055"}.icon-earth:before{content:"\e056"}.icon-mail:before{content:"\e057"}.icon-checkbox-checked:before{content:"\e058"}.icon-checkbox-unchecked:before{content:"\e059"}.icon-checkbox-partial:before{content:"\e05a"}.icon-radio-checked:before{content:"\e05b"}.icon-radio-unchecked:before{content:"\e05c"}.icon-google-drive:before{content:"\e05d"}.icon-spinner:before{content:"\e05e"}.icon-archive:before{content:"\e05f"}.icon-buy-sign:before{content:"\e060"}.icon-filter:before{content:"\e061"}.icon-sync:before{content:"\e062"}.icon-ellipsis-alt:before{content:"\e063"}.icon-cloud-up:before{content:"\e064"}.icon-cloud-down:before{content:"\e065"}.icon-import:before{content:"\e066"}.icon-export:before{content:"\e067"}.icon-copy:before{content:"\e068"}.icon-angry-smiley:before{content:"\e069"}.icon-happy-smiley:before{content:"\e06a"}.icon-help:before{content:"\e06b"}.icon-resize-in:before{content:"\e06c"}.icon-resize-out:before{content:"\e06d"}.icon-world:before{content:"\e06f"}.icon-braille:before{content:"\e06e"}.icon-play:before{content:"\e070"}.icon-pause:before{content:"\e071"}.icon-stop:before{content:"\e072"}.icon-check-mark-circle-two:before{content:"\e073"}.icon-laptop:before{content:"\e075"}@-webkit-keyframes redirectingRotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes redirectingRotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}body,html{padding:0;margin:0;overflow:hidden}.social-icon-wrp{position:absolute;top:0;left:0;bottom:0;right:0}.social-icon{position:absolute;top:50%;left:50%;font-size:140px;margin:-60px 0 0 -60px;color:#999}.redirecting:after{content:'';position:absolute;width:240px;height:240px;top:50%;left:50%;margin-top:-120px;margin-left:-120px;border:8px solid transparent;border-color:transparent;border-top-color:#999;-webkit-animation:redirectingRotation 1s infinite ease-in-out;animation:redirectingRotation 1s infinite ease-in-out;border-radius:50%;z-index:1} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/favicon-light.ico b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/favicon-light.ico new file mode 100755 index 0000000000000000000000000000000000000000..7d168f35d7591dfae55a3ac88bc7aa5428f1245f GIT binary patch literal 1150 zcmd6iJqp4=5QSgR1EdntS$YNucoa*$fr6a}uoinOPhqc(m6erXnIhmH!urO|z`AT= zY{Xf1XXefOb`v1tievC>W7q^*06N^1s92rpFT)sfSjW_ zg5L`x^_Of)Wa%<>?x08BOd^{QIYuYHetf1TyeWhZl>_W=4=Aj^UC V02t4J$pIK;)GnOetw+4dJprTJ22cP1 literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/favicon-light.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/favicon-light.png new file mode 100755 index 0000000000000000000000000000000000000000..4034c1cf421fd56ef4850ee5aa135814ff857f3c GIT binary patch literal 866 zcmV-o1D*VdP)P-~6H|C@3f>C@5%Y z1v~}D$n*_pXT*zv14oP_pp_A$rOvbIqrg{N&DW+g;86tp6q+9jCLRNaju;0(EHFQG z#P}dIe=P7cj)dk9g%dCPuJr{mR)ABXuPYmXWWoOCwkPw-^#mjfZax*j(IP>xm>;+R ztOLm+K(LtK13FFs>f%O2u$foC%>Wpf0GbTJW!?rL20ohrng}7wygFwM_;U+D`-Xop z0W=AM#JqOy7I1wFK!eb>T#)2ljn&n>c1;(!$TLVSAtX2?;m@hJDEg)24 zzAg|dHD5IZWq#nzd{&NMCkWontDwUsKq$q$3OvmMu`&HaJ2uZ>E_&E;*+vh3{@ znCB|+%LFhbzwXn#_Ip2Nm+8Lt`v!1gGg$(J4)EJ7h{W@(2(!#<=k29!O#$b|u^Zr} zFaat8;UVzd_X{t{IR82D&#@UZ0d{j{fkhx}+?jdf@k`r{J_R=COoa=79qz=uVPaRk z8{PpsO)iF1QYEfSIjqtWxfcjo9UpZy?+t?Lq-ZzMycY;s?@z0V=JP@T9stkM3L-P5 zu?5{5?5MTKj{{Nazs?U1Fh6P^wEw!9=CJHY}i smgFrdUojWVZWI(06ciK`6tt}R4`FHD=q|ew!T&y~z-$f7&p?q^95s3}@oMf3cEC-( literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/favicon.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/favicon.png new file mode 100755 index 0000000000000000000000000000000000000000..ce1dd1a886c906ec36cee1dec72b9df605886f02 GIT binary patch literal 832 zcmV-G1Hb%k7RCwC#n$brDK^(`2<+!Jah`6UC zB6^C5h=@4)4|jR5=a_ zzRF^}svNfv^ZdeBqWN>ez`6O3CP!Ob6K4KgljDGB{)*sTz z^!1_w(9GG-TyfDP!Xo{00A?<4KW=CfaL&!$~?mW93ud- z3_)ie1;GE|1Obpm2w~>A#vwlZ0OULT3;~cO2o&>Dvk;$t01|?#%xy-f#%wh&H3#uH z%$L{-A&Pnb^MGX;LLBpvWebE<%-aGXRr6^>@B+0UGRf&e7>ied9i0f84^6TZJ!A+9whO+(;!!F#YF;zg_o!^}%< zGkk06A@JD`#0GHz6bHf##J%YUURb+q4dR=rH)D8#QX6s=7zaZ2Kh67ZKWsPpMwF>h zmcl094*z1_Z=xoi4f_x)S#E};)g`u~9hP>B+z5nnM$H?8a7BP%`{qb22=eStDWm3x zg)jxNiZw*A)>t0*2B$?WvJ%!1$@}hbPqxO2d_LeA15oG_B85LARQOY3?wp_|o{0^U zHL<40a`3hPI3dTTW*ofXI!ef~!-ywEDQATr105Wd)|viX?ieA*mL>=98jTQg>=7rG z!(@x>@8onp!CAW{&f2af2c=}kUg0{JbIi%f$;rvd$*HLN6<`1!uF_d9==`$)0000< KMNUMnLSTX$7j)+U literal 0 HcmV?d00001 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/admin.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/admin.js new file mode 100755 index 00000000..02b2febe --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/admin.js @@ -0,0 +1,1105 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL v3 */ +!function(e){var t={};function n(i){if(t[i])return t[i].exports;var o=t[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:i})},n.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="rainloop/v/0.0.0/static/js/",n(n.s=191)}([ +/*!*****************************!*\ + !*** ./dev/Common/Enums.js ***! + \*****************************/ +/*! exports provided: FileType, StorageResultType, Focused, State, StateType, Capa, KeyState, FolderType, ServerFolderType, LoginSignMeTypeAsString, LoginSignMeType, ComposeType, UploadErrorCode, SetSystemFoldersNotification, ClientSideKeyName, EventKeyCode, MessageSetAction, MessageSelectAction, DesktopNotification, MessagePriority, EditorDefaultType, ServerSecure, SearchDateType, SaveSettingsStep, Layout, FilterConditionField, FilterConditionType, FiltersAction, FilterRulesType, SignedVerifyStatus, ContactPropertyType, Magics, Ports, Notification */ +/*! all exports used */function(e,t,n){"use strict";n.r(t),n.d(t,"FileType",function(){return i}),n.d(t,"StorageResultType",function(){return o}),n.d(t,"Focused",function(){return a}),n.d(t,"State",function(){return r}),n.d(t,"StateType",function(){return s}),n.d(t,"Capa",function(){return c}),n.d(t,"KeyState",function(){return l}),n.d(t,"FolderType",function(){return u}),n.d(t,"ServerFolderType",function(){return d}),n.d(t,"LoginSignMeTypeAsString",function(){return p}),n.d(t,"LoginSignMeType",function(){return f}),n.d(t,"ComposeType",function(){return m}),n.d(t,"UploadErrorCode",function(){return h}),n.d(t,"SetSystemFoldersNotification",function(){return g}),n.d(t,"ClientSideKeyName",function(){return b}),n.d(t,"EventKeyCode",function(){return v}),n.d(t,"MessageSetAction",function(){return S}),n.d(t,"MessageSelectAction",function(){return y}),n.d(t,"DesktopNotification",function(){return w}),n.d(t,"MessagePriority",function(){return A}),n.d(t,"EditorDefaultType",function(){return O}),n.d(t,"ServerSecure",function(){return T}),n.d(t,"SearchDateType",function(){return C}),n.d(t,"SaveSettingsStep",function(){return _}),n.d(t,"Layout",function(){return E}),n.d(t,"FilterConditionField",function(){return D}),n.d(t,"FilterConditionType",function(){return N}),n.d(t,"FiltersAction",function(){return j}),n.d(t,"FilterRulesType",function(){return R}),n.d(t,"SignedVerifyStatus",function(){return I}),n.d(t,"ContactPropertyType",function(){return x}),n.d(t,"Magics",function(){return P}),n.d(t,"Ports",function(){return k}),n.d(t,"Notification",function(){return L});var i={Unknown:"unknown",Text:"text",Html:"html",Code:"code",Eml:"eml",WordText:"word-text",Pdf:"pdf",Image:"image",Audio:"audio",Video:"video",Sheet:"sheet",Presentation:"presentation",Certificate:"certificate",CertificateBin:"certificate-bin",Archive:"archive"},o={Success:"success",Abort:"abort",Error:"error",Unload:"unload"},a={None:"none",MessageList:"message-list",MessageView:"message-view",FolderList:"folder-list"},r={Empty:10,Login:20,Auth:30},s={Webmail:0,Admin:1},c={TwoFactor:"TWO_FACTOR",TwoFactorForce:"TWO_FACTOR_FORCE",OpenPGP:"OPEN_PGP",Prefetch:"PREFETCH",Gravatar:"GRAVATAR",Folders:"FOLDERS",Composer:"COMPOSER",Contacts:"CONTACTS",Reload:"RELOAD",Search:"SEARCH",SearchAdv:"SEARCH_ADV",MessageActions:"MESSAGE_ACTIONS",MessageListActions:"MESSAGELIST_ACTIONS",AttachmentsActions:"ATTACHMENTS_ACTIONS",DangerousActions:"DANGEROUS_ACTIONS",Settings:"SETTINGS",Help:"HELP",Themes:"THEMES",UserBackground:"USER_BACKGROUND",Sieve:"SIEVE",Filters:"FILTERS",AttachmentThumbnails:"ATTACHMENT_THUMBNAILS",Templates:"TEMPLATES",AutoLogout:"AUTOLOGOUT",AdditionalAccounts:"ADDITIONAL_ACCOUNTS",Identities:"IDENTITIES"},l={All:"all",None:"none",ContactList:"contact-list",MessageList:"message-list",FolderList:"folder-list",MessageView:"message-view",Compose:"compose",Settings:"settings",Menu:"menu",PopupComposeOpenPGP:"compose-open-pgp",PopupMessageOpenPGP:"message-open-pgp",PopupViewOpenPGP:"view-open-pgp",PopupKeyboardShortcutsHelp:"popup-keyboard-shortcuts-help",PopupAsk:"popup-ask"},u={Inbox:10,SentItems:11,Draft:12,Trash:13,Spam:14,Archive:15,NotSpam:80,User:99},d={USER:0,INBOX:1,SENT:2,DRAFTS:3,JUNK:4,TRASH:5,IMPORTANT:10,FLAGGED:11,ALL:12},p={DefaultOff:"defaultoff",DefaultOn:"defaulton",Unused:"unused"},f={DefaultOff:0,DefaultOn:1,Unused:2},m={Empty:"empty",Reply:"reply",ReplyAll:"replyall",Forward:"forward",ForwardAsAttachment:"forward-as-attachment",Draft:"draft",EditAsNew:"editasnew"},h={Normal:0,FileIsTooBig:1,FilePartiallyUploaded:2,FileNoUploaded:3,MissingTempFolder:4,FileOnSaveingError:5,FileType:98,Unknown:99},g={None:0,Sent:1,Draft:2,Spam:3,Trash:4,Archive:5},b={FoldersLashHash:0,MessagesInboxLastHash:1,MailBoxListSize:2,ExpandedFolders:3,FolderListSize:4,MessageListSize:5,LastReplyAction:6,LastSignMe:7,ComposeLastIdentityID:8,MessageHeaderFullInfo:9,MessageAttachmnetControls:10},v={Backspace:8,Tab:9,Enter:13,Esc:27,PageUp:33,PageDown:34,Left:37,Right:39,Up:38,Down:40,End:35,Home:36,Space:32,Insert:45,Delete:46,A:65,S:83},S={SetSeen:0,UnsetSeen:1,SetFlag:2,UnsetFlag:3},y={All:0,None:1,Invert:2,Unseen:3,Seen:4,Flagged:5,Unflagged:6},w={Allowed:0,NotAllowed:1,Denied:2,NotSupported:9},A={Low:5,Normal:3,High:1},O={Html:"Html",Plain:"Plain",HtmlForced:"HtmlForced",PlainForced:"PlainForced"},T={None:0,SSL:1,TLS:2},C={All:-1,Days3:3,Days7:7,Month:30},_={Animate:-2,Idle:-1,TrueResult:1,FalseResult:0},E={NoPreview:0,SidePreview:1,BottomPreview:2},D={From:"From",Recipient:"Recipient",Subject:"Subject",Header:"Header",Size:"Size"},N={Contains:"Contains",NotContains:"NotContains",EqualTo:"EqualTo",NotEqualTo:"NotEqualTo",Regex:"Regex",Over:"Over",Under:"Under"},j={None:"None",MoveTo:"MoveTo",Discard:"Discard",Vacation:"Vacation",Reject:"Reject",Forward:"Forward"},R={All:"All",Any:"Any"},I={UnknownPublicKeys:-4,UnknownPrivateKey:-3,Unverified:-2,Error:-1,None:0,Success:1},x={Unknown:0,FullName:10,FirstName:15,LastName:16,MiddleName:16,Nick:18,NamePrefix:20,NameSuffix:21,Email:30,Phone:31,Web:32,Birthday:40,Facebook:90,Skype:91,GitHub:92,Note:110,Custom:250},P={EventWhichMouseMiddle:3,ifvisibleIdle10s:10,BitLength2048:2048,BitLength1024:1024,Size350px:350,Size50px:50,Size20px:20,Size1px:1,Time30mInMin:30,Time60m:36e5,Time30m:18e5,Time20m:12e5,Time15m:9e5,Time10m:6e5,Time5m:3e5,Time3m:18e4,Time2m:12e4,Time1m:6e4,Time30s:3e4,Time10s:1e4,Time7s:7e3,Time5s:5e3,Time3s:3e3,Time1s:1e3,Time500ms:500,Time350ms:350,Time250ms:250,Time200ms:200,Time100ms:100,Time50ms:50,Time20ms:20,Time10ms:10,Time1ms:1},k={Imap:143,ImapSsl:993,Smtp:25,SmtpSsl:465,SmtpStartTls:587},L={InvalidToken:101,AuthError:102,AccessError:103,ConnectionError:104,CaptchaError:105,SocialFacebookLoginAccessDisable:106,SocialTwitterLoginAccessDisable:107,SocialGoogleLoginAccessDisable:108,DomainNotAllowed:109,AccountNotAllowed:110,AccountTwoFactorAuthRequired:120,AccountTwoFactorAuthError:121,CouldNotSaveNewPassword:130,CurrentPasswordIncorrect:131,NewPasswordShort:132,NewPasswordWeak:133,NewPasswordForbidden:134,ContactsSyncError:140,CantGetMessageList:201,CantGetMessage:202,CantDeleteMessage:203,CantMoveMessage:204,CantCopyMessage:205,CantSaveMessage:301,CantSendMessage:302,InvalidRecipients:303,CantSaveFilters:351,CantGetFilters:352,FiltersAreNotCorrect:355,CantCreateFolder:400,CantRenameFolder:401,CantDeleteFolder:402,CantSubscribeFolder:403,CantUnsubscribeFolder:404,CantDeleteNonEmptyFolder:405,CantSaveSettings:501,CantSavePluginSettings:502,DomainAlreadyExists:601,CantInstallPackage:701,CantDeletePackage:702,InvalidPluginPackage:703,UnsupportedPluginPackage:704,LicensingServerIsUnavailable:710,LicensingExpired:711,LicensingBanned:712,DemoSendMessageError:750,DemoAccountError:751,AccountAlreadyExists:801,AccountDoesNotExist:802,MailServerError:901,ClientViewError:902,InvalidInputArgument:903,AjaxFalse:950,AjaxAbort:951,AjaxParse:952,AjaxTimeout:953,UnknownNotification:999,UnknownError:999}}, +/*!****************************************!*\ + !*** ./dev/External/ko.js + 1 modules ***! + \****************************************/ +/*! exports provided: default */ +/*! exports used: default */ +/*! ModuleConcatenation bailout: Cannot concat with ./dev/Common/Enums.js because of ./dev/app.js */ +/*! ModuleConcatenation bailout: Cannot concat with ./node_modules/pikaday/pikaday.js (<- Module is not an ECMAScript module) */ +/*! ModuleConcatenation bailout: Cannot concat with external "window" (<- Module is not an ECMAScript module) */ +/*! ModuleConcatenation bailout: Cannot concat with external "window._" (<- Module is not an ECMAScript module) */ +/*! ModuleConcatenation bailout: Cannot concat with external "window.jQuery" (<- Module is not an ECMAScript module) */function(e,t,n){"use strict";var i=n(3),o=n.n(i),a=n(4),r=n.n(a),s=n(7),c=n.n(s),l=o.a.Opentip||{};l.styles=l.styles||{},l.styles.rainloop={extends:"standard",fixed:!0,target:!0,delay:.2,hideDelay:0,hideEffect:"fade",hideEffectDuration:.2,showEffect:"fade",showEffectDuration:.2,showOn:"mouseover click",removeElementsOnHide:!0,background:"#fff",shadow:!1,borderColor:"#999",borderRadius:2,borderWidth:1},l.styles.rainloopTip={extends:"rainloop",delay:.4,group:"rainloopTips"},l.styles.rainloopErrorTip={extends:"rainloop",className:"rainloopErrorTip"};var u=n(97),d=n.n(u),p=n(0),f=o.a.ko,m=c()(o.a);f.bindingHandlers.updateWidth={init:function(e,t){var n=c()(e),i=t(),a=function(){i(n.width()),o.a.setTimeout(function(){i(n.width())},p.Magics.Time500ms)};m.on("resize",a),a(),f.utils.domNodeDisposal.addDisposeCallback(e,function(){m.off("resize",a)})}},f.bindingHandlers.editor={init:function(e,t){var i=null,o=t(),a=n(/*! Common/HtmlEditor */95).default,r=function(){o&&o.__editor&&o.__editor.setHtmlOrPlain(o())},s=function(){o&&o.__editor&&o(o.__editor.getDataWithHtmlMark())};f.isObservable(o)&&a&&(i=new a(e,s,function(){o.__editor=i,r()},s),o.__fetchEditorValue=s,o.subscribe(r))}},f.bindingHandlers.json={init:function(e,t){c()(e).text(o.a.JSON.stringify(f.unwrap(t())))},update:function(e,t){c()(e).text(o.a.JSON.stringify(f.unwrap(t())))}},f.bindingHandlers.scrollerShadows={init:function(e){var t=c()(e),n=t.find("[data-scroller-shadows-content]")[0]||null,i=r.a.throttle(function(){t.toggleClass("scroller-shadow-top",8=n.left&&e.pageX<=n.left+t.width()){if(e.pageY>=i-100&&e.pageY<=i){var a=function(){t.scrollTop(t.scrollTop()+3),r.windowResize()};t.data("timerScroll",o.a.setInterval(a,10)),a()}if(e.pageY>=n.top&&e.pageY<=n.top+100){var s=function(){t.scrollTop(t.scrollTop()-3),r.windowResize()};t.data("timerScroll",o.a.setInterval(s,10)),s()}}})},u.stop=function(){c()(l).each(function(){var e=c()(this);o.a.clearInterval(e.data("timerScroll")),e.data("timerScroll",!1)})}),u.helper=function(e){return t()(e&&e.target?f.dataFor(e.target):null)},c()(e).draggable(u).on("mousedown.koDraggable",function(){r.removeInFocus()}),f.utils.domNodeDisposal.addDisposeCallback(e,function(){c()(e).off("mousedown.koDraggable").draggable("destroy")})}}},f.bindingHandlers.droppable={init:function(e,t,i){if(!n(/*! Common/Globals */6).bMobileDevice){var o=t(),a=i(),r=a&&a.droppableOver?a.droppableOver:null,s=a&&a.droppableOut?a.droppableOut:null,l={tolerance:"pointer",hoverClass:"droppableHover",drop:null,over:null,out:null};o&&(l.drop=function(e,t){o(e,t)},r&&(l.over=function(e,t){r(e,t)}),s&&(l.out=function(e,t){s(e,t)}),c()(e).droppable(l),f.utils.domNodeDisposal.addDisposeCallback(e,function(){c()(e).droppable("destroy")}))}}},f.bindingHandlers.nano={init:function(e){var t=n(/*! Common/Globals */6),i=n(/*! Storage/Settings */5);t.bDisableNanoScroll||i.appSettingsGet("useNativeScrollbars")||c()(e).addClass("nano").nanoScroller({iOSNativeScrolling:!1,preventPageScrolling:!0})}},f.bindingHandlers.saveTrigger={init:function(e){var t=c()(e);t.data("save-trigger-type",t.is("input[type=text],input[type=email],input[type=password],select,textarea")?"input":"custom"),"custom"===t.data("save-trigger-type")?t.append('  ').addClass("settings-saved-trigger"):t.addClass("settings-saved-trigger-input")},update:function(e,t){var n=f.unwrap(t()),i=c()(e);if("custom"===i.data("save-trigger-type"))switch(n.toString()){case"1":i.find(".animated,.error").hide().removeClass("visible").end().find(".success").show().addClass("visible");break;case"0":i.find(".animated,.success").hide().removeClass("visible").end().find(".error").show().addClass("visible");break;case"-2":i.find(".error,.success").hide().removeClass("visible").end().find(".animated").show().addClass("visible");break;default:i.find(".animated").hide().end().find(".error,.success").removeClass("visible")}else switch(n.toString()){case"1":i.addClass("success").removeClass("error");break;case"0":i.addClass("error").removeClass("success");break;case"-2":break;default:i.removeClass("error success")}}},f.bindingHandlers.emailsTags={init:function(e,t,i){var o=n(/*! Common/Utils */2),a=n(/*! Model/Email */44).default,s=c()(e),l=t(),u=i().autoCompleteSource||null,d=[",",";","\n"];s.inputosaurus({parseOnBlur:!0,allowDragAndDrop:!0,focusCallback:function(e){l&&l.focused&&l.focused(!!e)},inputDelimiters:d,autoCompleteSource:u,splitHook:function(e){var t=o.trim(e);return t&&-1=o&&(o=t),o===e()&&""+o!=""+n&&e(o+1),e(o)}});return o(e()),o},f.extenders.limitedList=function(e,t){var i=n(/*! Common/Utils */2),o=f.computed({read:e,write:function(n){var o=f.unwrap(e),a=f.unwrap(t);i.isNonEmptyArray(a)?-11&&void 0!==arguments[1])||arguments[1];return!!N(e)&&(t?/^[0-9]*$/.test(e.toString()):/^[1-9]+[0-9]*$/.test(e.toString()))}function R(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=N(e)&&""!==e?o.a.parseInt(e,10):t;return o.a.isNaN(n)?t:n}function I(e){return N(e)?""+e:""}function x(e){return!!e}function P(e){return e?"1":"0"}function k(e){return v(e)&&00&&void 0!==arguments[0]?arguments[0]:32,t="0123456789abcdefghijklmnopqrstuvwxyz",n=t.length;e=R(e);for(var i="";i.length1&&void 0!==arguments[1]?arguments[1]:100,n="",i="",o=e,a=0,r=0;o.length>t;)a=(i=o.substring(0,t)).lastIndexOf(" "),-1!==(r=i.lastIndexOf("\n"))&&(a=r),-1===a&&(a=t),n+=i.substring(0,a)+"\n",o=o.substring(a+1);return n+o}var q,z=(q={},function(e,t,n){q[e]=w(q[e])?0:q[e],o.a.clearTimeout(q[e]),q[e]=o.a.setTimeout(t,n)}),K=function(){var e={};return function(t,n,i){e[t]||(e[t]=o.a.setTimeout(function(){n(),e[t]=0},i))}}();function W(){try{if(o.a.document.activeElement)return w(o.a.document.activeElement.__inFocusCache)&&(o.a.document.activeElement.__inFocusCache=r()(o.a.document.activeElement).is("input,textarea,iframe,.cke_editable")),!!o.a.document.activeElement.__inFocusCache}catch(e){}return!1}function Y(e){if(o.a.document&&o.a.document.activeElement&&o.a.document.activeElement.blur)try{var t=r()(o.a.document.activeElement);t&&t.is("input,textarea")?o.a.document.activeElement.blur():e&&o.a.document.activeElement.blur()}catch(e){}}function $(){try{if(o.a&&o.a.getSelection){var e=o.a.getSelection();e&&e.removeAllRanges&&e.removeAllRanges()}else o.a.document&&o.a.document.selection&&o.a.document.selection.empty&&o.a.document.selection.empty()}catch(e){}}function J(e,t){e=g(e.toUpperCase()),t=g(t.replace(/[\s]+/g," "));var n=!1,i="RE"===e,o="FWD"===e,a=[],r=!o;return""!==t&&c.a.each(t.split(":"),function(e){var t=g(e);n||!/^(RE|FWD)$/i.test(t)&&!/^(RE|FWD)[\[\(][\d]+[\]\)]$/i.test(t)?(a.push(e),n=!0):(i||(i=!!/^RE/i.test(t)),o||(o=!!/^FWD/i.test(t)))}),r?i=!1:o=!1,g((r?"Re: ":"Fwd: ")+(i?"Re: ":"")+(o?"Fwd: ":"")+g(a.join(":")))}function X(e,t){return o.a.Math.round(e*o.a.Math.pow(10,t))/o.a.Math.pow(10,t)}function Q(e){switch(e=R(e),!0){case 1073741824<=e:return X(e/1073741824,1)+"GB";case 1048576<=e:return X(e/1048576,1)+"MB";case 1024<=e:return X(e/1024,0)+"KB"}return e+"B"}function Z(e){o.a.console&&o.a.console.log&&o.a.console.log(e)}function ee(e,t,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;e&&e[t]&&(i=R(i),n=v(n)?n:[],0>=i?e[t].apply(e,n):c.a.delay(function(){e[t].apply(e,n)},i))}function te(e){if((e=e||o.a.event)&&e.ctrlKey&&!e.shiftKey&&!e.altKey){var t=e.keyCode||e.which;if(t===f.EventKeyCode.S)return void e.preventDefault();if(t===f.EventKeyCode.A){var n=e.target||e.srcElement;if(n&&("true"==""+n.contentEditable||n.tagName&&n.tagName.match(/INPUT|TEXTAREA/i)))return;o.a.getSelection?o.a.getSelection().removeAllRanges():o.a.document.selection&&o.a.document.selection.clear&&o.a.document.selection.clear(),e.preventDefault()}}}function ne(e,t){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=null;return(i=t?function(){for(var n=arguments.length,o=Array(n),a=0;a1&&void 0!==arguments[1]&&arguments[1];return n(/*! Common/Translator */10).i18n("LANGS_NAMES"+(!0===t?"_EN":"")+"/LANG_"+e.toUpperCase().replace(/[^a-zA-Z0-9]+/g,"_"),null,e)}function ce(){return r()('
 
').appendTo("#rl-hidden")}function le(e,t){t&&!w(t.disabled)&&e&&r()(e).toggleClass("disabled",t.disabled).prop("disabled",t.disabled)}function ue(e){e.find("blockquote.rl-bq-switcher").removeClass("rl-bq-switcher hidden-bq"),e.find(".rlBlockquoteSwitcher").off(".rlBlockquoteSwitcher").remove(),e.find("[data-html-editor-font-wrapper]").removeAttr("data-html-editor-font-wrapper")}function de(e,t,i,a){var r=e.title,s=e.subject,c=e.date,l=e.fromCreds,u=e.toCreds,d=e.toLabel,p=e.ccClass,f=e.ccCreds,m=e.ccLabel,h=o.a.open(""),g=h.document,b=t.clone(),v=i?"html":"plain";ue(b);var S=b?b.html():"";g.write(n(/*! Html/PreviewMessage.html */170).replace("{{title}}",B(r)).replace("{{subject}}",B(s)).replace("{{date}}",B(c)).replace("{{fromCreds}}",B(l)).replace("{{toCreds}}",B(u)).replace("{{toLabel}}",B(d)).replace("{{ccClass}}",B(p)).replace("{{ccCreds}}",B(f)).replace("{{ccLabel}}",B(m)).replace("{{bodyClass}}",v).replace("{{html}}",S)),g.close(),a&&o.a.setTimeout(function(){return h.print()},100)}function pe(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1e3;return i=R(i),function(o,a,r,s,l){t.call(n,a&&a.Result?f.SaveSettingsStep.TrueResult:f.SaveSettingsStep.FalseResult),e&&e.call(n,o,a,r,s,l),c.a.delay(function(){t.call(n,f.SaveSettingsStep.Idle)},i)}}function fe(e,t){return pe(null,e,t,1e3)}function me(e,t,n,i){return function(o){if(e){switch(n){case"bool":case"boolean":o=o?"1":"0";break;case"int":case"integer":case"number":o=R(o);break;case"trim":o=g(o);break;default:o=I(o)}var a={};a[t]=o,e.saveAdminConfig?e.saveAdminConfig(i||null,a):e.saveSettings&&e.saveSettings(i||null,a)}}}function he(e){return d.a?d.a.link(e,{newWindow:!0,stripPrefix:!1,urls:!0,email:!0,mention:!1,phone:!1,hashtag:!1,replaceFn:function(e){return!(e&&"url"===e.getType()&&e.matchedText&&0!==e.matchedText.indexOf("http"))}}):e}function ge(e){var t,n=0,i=0,o=0,a=0,r=0,s="";for(s=e.replace(/]*><\/p>/gi,"").replace(/]*>([\s\S\r\n\t]*)<\/pre>/gim,function(){for(var e=arguments.length,t=Array(e),n=0;n").replace(/[\r]/gm,""):""}).replace(/[\s]+/gm," ").replace(/((?:href|data)\s?=\s?)("[^"]+?"|'[^']+?')/gim,function(){for(var e=arguments.length,t=Array(e),n=0;n]*>/gim,"\n").replace(/<\/h[\d]>/gi,"\n").replace(/<\/p>/gi,"\n\n").replace(/]*>/gim,"\n").replace(/<\/ul>/gi,"\n").replace(/]*>/gim," * ").replace(/<\/li>/gi,"\n").replace(/<\/td>/gi,"\n").replace(/<\/tr>/gi,"\n").replace(/]*>/gim,"\n_______________________________\n\n").replace(/]*>([\s\S\r\n]*)<\/div>/gim,function e(){for(var t=arguments.length,n=Array(t),i=0;i]*>([\s\S\r\n]*)<\/div>/gim,e),o="\n"+g(o)+"\n"),o}return""}).replace(/]*>/gim,"\n__bq__start__\n").replace(/<\/blockquote>/gim,"\n__bq__end__\n").replace(/]*>([\s\S\r\n]*?)<\/a>/gim,function(){for(var e=arguments.length,t=Array(e),n=0;n/gi,"\n").replace(/ /gi," ").replace(/"/gi,'"').replace(/<[^>]*>/gm,""),s=V(s=(s=p.$div.html(s).text()).replace(/\n[ \t]+/gm,"\n").replace(/[\n]{3,}/gm,"\n\n").replace(/>/gi,">").replace(/</gi,"<").replace(/&/gi,"&")),n=0,i=800;0 "+g(t).replace(/\n/gm,"\n> ")).replace(/(^|\n)([> ]+)/gm,function(){for(var e=arguments.length,t=Array(e),n=0;n1&&void 0!==arguments[1]&&arguments[1],n=!1,i=!0,o=!0,a=[],r="",s=0,c=(e=(e=e.toString().replace(/\r/g,"")).replace(/^>[> ]>+/gm,function(e){var t=e[0];return t?t.replace(/[ ]+/g,""):t})).split("\n");do{for(i=!1,a=[],s=0;s"===(r=c[s]).substr(0,1))&&!n?(i=!0,n=!0,a.push("~~~blockquote~~~"),a.push(r.substr(1))):!o&&n?""!==r?(n=!1,a.push("~~~/blockquote~~~"),a.push(r)):a.push(r):o&&n?a.push(r.substr(1)):a.push(r);n&&(n=!1,a.push("~~~/blockquote~~~")),c=a}while(i);return e=(e=c.join("\n")).replace(/&/g,"&").replace(/>/g,">").replace(/").replace(/[\s]*~~~\/blockquote~~~/g,"
").replace(/\n/g,"
"),t?he(e):e}function ve(e,t,n,i,a,r,s,c,l,u){var d=null,p=!1,m=0,h=0,g=[];for(u=!w(u)&&!!u,l=N(l)?l:00&&void 0!==arguments[0]&&arguments[0]?c.a.delay(e,100):e()}var Ae={};function Oe(e){Ae[e]||(Ae[e]=r()('script[type="application/json"][data-configuration="'+e+'"]'));try{return JSON.parse(Ae[e].text())}catch(e){}return{}}function Te(e,t){var n=t||e;n&&"function"==typeof n.dispose&&n.dispose()}function Ce(e){e&&(v(e.disposables)&&c.a.each(e.disposables,Te),l.a.utils.objectForEach(e,Te))}function _e(e){e&&(v(e)?c.a.each(e,function(e){_e(e)}):e&&e.onDestroy&&e.onDestroy())}function Ee(e,t){return!(!e||!e[0])&&(e[0].styleSheet&&!w(e[0].styleSheet.cssText)?e[0].styleSheet.cssText=t:e.text(t),!0)}var De=0,Ne=null;function je(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:C,n=r()("#app-theme-link"),i=function(){De=o.a.setTimeout(function(){return t(f.SaveSettingsStep.Idle)},1e3),Ne=null},a=r()("#app-theme-style"),s=n.attr("href");s||(s=a.attr("data-href")),s&&("Json/"!==(s=(s=(s=s.toString().replace(/\/-\/[^\/]+\/\-\//,"/-/"+e+"/-/")).replace(/\/Css\/[^\/]+\/User\//,"/Css/0/User/")).replace(/\/Hash\/[^\/]+\//,"/Hash/-/")).substring(s.length-5,s.length)&&(s+="Json/"),o.a.clearTimeout(De),t(f.SaveSettingsStep.Animate),Ne&&Ne.abort&&Ne.abort(),Ne=r.a.ajax({url:s,dataType:"json"}).then(function(e){e&&v(e)&&2===e.length&&(!n||!n[0]||a&&a[0]||(a=r()(''),n.after(a),n.remove()),a&&a[0]&&Ee(a,e[1])&&a.attr("data-href",s).attr("data-theme",e[0]),t(f.SaveSettingsStep.TrueResult))}).then(i,i))}function Re(e,t){return function(){var n=e(),i=t(),o=[],a=function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",a={current:e===n,name:""===i?e.toString():i.toString(),custom:""!==i,title:""===i?"":e.toString(),value:e.toString()};t?o.push(a):o.unshift(a)},r=0,s=0,c=2;if(1=n||i-2<=n)&&(c+=2),a(n),r=n,s=n);0=s)a(s,!0),c-=1;else if(0>=r)break;3===r?a(2,!1):3s&&a(Math.round((i+s)/2),!0,"..."),1s&&a(i,!0)}return o}}function Ie(e){var t=(e=g(e).toLowerCase()).split(".").pop();return t===e?"":t}function xe(e){var t,n="application/octet-stream";return"winmail.dat"===(e=g(e).toLowerCase())?"application/ms-tnef":((t=Ie(e))&&0this.height?[this.width-this.height,0]:[0,this.height-this.width],a.fillStyle="#fff",a.fillRect(0,0,t,t),a.drawImage(this,e[0]/2,e[1]/2,this.width-e[0],this.height-e[1],0,0,t,t),n(i.toDataURL("image/jpeg"))},i.src=e}function Me(e,t){if(e&&"mailto:"===e.toString().substr(0,7).toLowerCase()){if(!t)return!0;var i,o=[],a=null,r=null,s=(e=e.toString().substr(7)).replace(/\?.+$/,""),l=e.replace(/^[^\?]*\?/,""),u=n(/*! Model/Email */44).default;return i=H(l),w(i.to)?o=u.parseEmailLine(s):(o=u.parseEmailLine(M(s+","+i.to)),o=c.a.values(o.reduce(function(e,t){return t&&(e[t.email]&&e[t.email].name||(e[t.email]=t)),e},{}))),w(i.cc)||(a=u.parseEmailLine(M(i.cc))),w(i.bcc)||(r=u.parseEmailLine(M(i.bcc))),n(/*! Knoin/Knoin */9).showScreenPopup(t,[f.ComposeType.Empty,null,o,a,r,w(i.subject)?null:I(M(i.subject)),w(i.body)?null:be(I(M(i.body)))]),!0}return!1}function Fe(e){r()(function(){return e()})}var Ue=c.a.debounce(function(e){w(e)||A(e)?p.$win.resize():o.a.setTimeout(function(){p.$win.resize()},e)},50);function He(){Ue()}var Ge=o.a.String.substr;"b"!=="ab".substr(-1)&&(Ge=function(e,t,n){return t=0>t?e.length+t:t,e.substr(t,n)},o.a.String.substr=Ge)}, +/*!*************************!*\ + !*** external "window" ***! + \*************************/ +/*! no static exports found */ +/*! exports used: default */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports=window}, +/*!***************************!*\ + !*** external "window._" ***! + \***************************/ +/*! no static exports found */ +/*! exports used: default */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports=window._}, +/*!*********************************!*\ + !*** ./dev/Storage/Settings.js ***! + \*********************************/ +/*! exports provided: settingsGet, settingsSet, appSettingsGet, capa */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./dev/External/ko.js (referenced with cjs require) */function(e,t,n){"use strict";n.r(t),n.d(t,"settingsGet",function(){return c}),n.d(t,"settingsSet",function(){return l}),n.d(t,"appSettingsGet",function(){return u}),n.d(t,"capa",function(){return d});var i=n(/*! window */3),o=n.n(i),a=n(/*! Common/Utils */2),r=o.a.__rlah_data()||null,s=(r=Object(a.isNormal)(r)?r:{}).System||null;function c(e){return Object(a.isUnd)(r[e])?null:r[e]}function l(e,t){r[e]=t}function u(e){return Object(a.isUnd)(s[e])?null:s[e]}function d(e){var t=c("Capa");return Object(a.isArray)(t)&&Object(a.isNormal)(e)&&-1"),v=c()("
");v.attr("area","hidden").css({position:"absolute",left:-5e3}).appendTo(g);var S=(new o.a.Date).getTime(),y=!0,w=d.a.observable(!1).extend({rateLimit:0}),A=d.a.observable(!0),O="navigator"in o.a&&"userAgent"in o.a.navigator&&o.a.navigator.userAgent.toLowerCase()||"",T=-11&&void 0!==arguments[1])||arguments[1];return Object(h.createCommandLegacy)(null,e,t)}function A(e,t,n,i){var o=arguments.length>4&&void 0!==arguments[4]&&arguments[4];e.__rlSettingsData={Label:n,Template:t,Route:i,IsDefault:!!o},m.VIEW_MODELS.settings.push(e)}function O(e){m.VIEW_MODELS["settings-removed"].push(e)}function T(e){m.VIEW_MODELS["settings-disabled"].push(e)}function C(){l.a.changed.active=!1}function _(){l.a.changed.active=!0}function E(e){return""===e||Object(h.isUnd)(v[e])?null:v[e]}function D(e){var t=null;return e&&(t=e,e.default&&(t=e.default)),t}function N(e){var t=D(e);t&&t.__vm&&t.__dom&&t.__vm.modalVisibility(!1)}function j(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;o.a.each(t.__names,function(i){Object(f.f)(e,[i,t.__vm,n])})}function R(e,t){if(e&&!e.__builded){var n=null,i=new e(t),a=e.__type||"",c=a?r()("#rl-content #rl-"+a.toLowerCase()):null;e.__builded=!0,e.__vm=i,i.onShowTrigger=s.a.observable(!1),i.onHideTrigger=s.a.observable(!1),i.viewModelName=e.__name,i.viewModelNames=e.__names,i.viewModelTemplateID=e.__templateID,i.viewModelPosition=e.__type,c&&1===c.length?((n=r()("
").addClass("rl-view-model").addClass("RL-"+i.viewModelTemplateID).hide()).appendTo(c),i.viewModelDom=n,e.__dom=n,S.Popup===a&&(i.cancelCommand=i.closeCommand=w(function(){N(e)}),i.modalVisibility.subscribe(function(t){t?(i.viewModelDom.show(),i.storeAndSetKeyScope(),m.popupVisibilityNames.push(i.viewModelName),i.viewModelDom.css("z-index",3e3+Object(m.popupVisibilityNames)().length+10),i.onShowTrigger&&i.onShowTrigger(!i.onShowTrigger()),Object(h.delegateRun)(i,"onShowWithDelay",[],500)):(Object(h.delegateRun)(i,"onHide"),Object(h.delegateRun)(i,"onHideWithDelay",[],500),i.onHideTrigger&&i.onHideTrigger(!i.onHideTrigger()),i.restoreKeyScope(),j("view-model-on-hide",e),m.popupVisibilityNames.remove(i.viewModelName),i.viewModelDom.css("z-index",2e3),o.a.delay(function(){return i.viewModelDom.hide()},300))})),j("view-model-pre-build",e,n),s.a.applyBindingAccessorsToNode(n[0],{translatorInit:!0,template:function(){return{name:i.viewModelTemplateID}}},i),Object(h.delegateRun)(i,"onBuild",[n]),i&&S.Popup===a&&i.registerPopupKeyDown(),j("view-model-post-build",e,n)):Object(h.log)("Cannot find view model position: "+a)}return e?e.__vm:null}function I(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=D(e);n&&(R(n),n.__vm&&n.__dom&&(Object(h.delegateRun)(n.__vm,"onBeforeShow",t||[]),n.__vm.modalVisibility(!0),Object(h.delegateRun)(n.__vm,"onShow",t||[]),j("view-model-on-show",n,t||[])))}function x(e){var t=D(e);t&&(R(t),t.__vm&&t.__dom&&Object(h.delegateRun)(t.__vm,"onWarmUp"))}function P(e){var t=D(e);return!(!t||!t.__vm)&&t.__vm.modalVisibility()}function k(e,t){var n=null,i=!1,a=null;""===Object(h.pString)(e)&&(e=b),""!==e&&((n=E(e))||(n=E(b))&&(t=e+"/"+t,e=b),n&&n.__started&&(i=g&&n===g,n.__builded||(n.__builded=!0,Object(h.isNonEmptyArray)(n.viewModels())&&o.a.each(n.viewModels(),function(e){R(e,n)}),Object(h.delegateRun)(n,"onBuild")),o.a.defer(function(){g&&!i&&(Object(h.delegateRun)(g,"onHide"),Object(h.delegateRun)(g,"onHideWithDelay",[],500),g.onHideTrigger&&g.onHideTrigger(!g.onHideTrigger()),Object(h.isNonEmptyArray)(g.viewModels())&&o.a.each(g.viewModels(),function(e){e.__vm&&e.__dom&&S.Popup!==e.__vm.viewModelPosition&&(e.__dom.hide(),e.__vm.viewModelVisibility(!1),Object(h.delegateRun)(e.__vm,"onHide"),Object(h.delegateRun)(e.__vm,"onHideWithDelay",[],500),e.__vm.onHideTrigger&&e.__vm.onHideTrigger(!e.__vm.onHideTrigger()))})),(g=n)&&!i&&(Object(h.delegateRun)(g,"onShow"),g.onShowTrigger&&g.onShowTrigger(!g.onShowTrigger()),Object(f.f)("screen-on-show",[g.screenName(),g]),Object(h.isNonEmptyArray)(g.viewModels())&&o.a.each(g.viewModels(),function(e){e.__vm&&e.__dom&&S.Popup!==e.__vm.viewModelPosition&&(Object(h.delegateRun)(e.__vm,"onBeforeShow"),e.__dom.show(),e.__vm.viewModelVisibility(!0),Object(h.delegateRun)(e.__vm,"onShow"),e.__vm.onShowTrigger&&e.__vm.onShowTrigger(!e.__vm.onShowTrigger()),Object(h.delegateRun)(e.__vm,"onShowWithDelay",[],200),j("view-model-on-show",e))})),(a=n&&n.__cross?n.__cross():null)&&a.parse(t)})))}function L(e){o.a.each(e,function(e){if(e){var t=new e,n=t?t.screenName():"";t&&""!==n&&(""===b&&(b=n),v[n]=t)}}),o.a.each(v,function(e){e&&!e.__started&&e.__start&&(e.__started=!0,e.__start(),Object(f.f)("screen-pre-start",[e.screenName(),e]),Object(h.delegateRun)(e,"onStart"),Object(f.f)("screen-post-start",[e.screenName(),e]))});var t=d.a.create();t.addRoute(/^([a-zA-Z0-9\-]*)\/?(.*)$/,k),l.a.initialized.add(t.parse,t),l.a.changed.add(t.parse,t),l.a.init(),o.a.delay(function(){return m.$html.removeClass("rl-started-trigger").addClass("rl-started")},100),o.a.delay(function(){return m.$html.addClass("rl-started-delay")},200)}function M(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];e="/"===(e="#"===e.substr(0,1)?e.substr(1):e).substr(0,1)?e.substr(1):e;var i=n?"replaceHash":"setHash";t?(l.a.changed.active=!1,l.a[i](e),l.a.changed.active=!0):(l.a.changed.active=!0,l.a[i](e),l.a.setHash(e))}function F(e){var t=e.name,n=e.type,i=e.templateID;return function(e){e&&(t&&(Object(h.isArray)(t)?e.__names=t:e.__names=[t],e.__name=e.__names[0]),n&&(e.__type=n),i&&(e.__templateID=i))}}function U(e){var t=e.name,n=e.templateID;return F({name:t,type:S.Popup,templateID:n})}function H(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return function(t,n,i){if(!n||!n.match(/Command$/))throw new Error('name "'+n+'" should end with Command suffix');var o=i.value||i.initializer(),a=Object(h.isFunc)(e)?e:function(){return!!e};return i.value=function(){if(a.call(this,this)){for(var e=arguments.length,t=Array(e),n=0;n1&&void 0!==arguments[1]&&arguments[1];r.a.defer(function(){c()("[data-i18n]",e).each(function(e,t){y(t)}),t&&p.bAnimationSupported&&c()(".i18n-animation[data-i18n]",e).letterfx({fx:"fall fade",backwards:!1,timing:50,fx_duration:"50ms",letter_end:"restore",element_end:"restore"})})}var A=function(){o.a.rainloopI18N&&(h=o.a.rainloopI18N||{},w(o.a.document,!0),Object(f.reload)(),v(!v())),o.a.rainloopI18N=null};function O(){b.forEach(function(e){g[e[0]]=S(e[1])})}function T(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;e&&e(),t?v.subscribe(function(){e&&e(),t&&t()}):e&&v.subscribe(e)}function C(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return e=o.a.parseInt(e,10)||0,u.Notification.ClientViewError===e&&t?t:(n=n&&o.a.parseInt(n,10)||0,Object(d.isUnd)(g[e])?n&&Object(d.isUnd)(g[n])?g[n]:"":g[e])}function _(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:u.Notification.UnknownNotification;return e&&e.ErrorCode?C(Object(d.pInt)(e.ErrorCode),e.ErrorMessage||""):C(t)}function E(e){var t="";switch(o.a.parseInt(e,10)||0){case u.UploadErrorCode.FileIsTooBig:t=S("UPLOAD/ERROR_FILE_IS_TOO_BIG");break;case u.UploadErrorCode.FilePartiallyUploaded:t=S("UPLOAD/ERROR_FILE_PARTIALLY_UPLOADED");break;case u.UploadErrorCode.FileNoUploaded:t=S("UPLOAD/ERROR_NO_FILE_UPLOADED");break;case u.UploadErrorCode.MissingTempFolder:t=S("UPLOAD/ERROR_MISSING_TEMP_FOLDER");break;case u.UploadErrorCode.FileOnSaveingError:t=S("UPLOAD/ERROR_ON_SAVING_FILE");break;case u.UploadErrorCode.FileType:t=S("UPLOAD/ERROR_FILE_TYPE");break;default:t=S("UPLOAD/ERROR_UNKNOWN")}return t}function D(e,t){var n=Object(d.microtime)();return p.$html.addClass("rl-changing-language"),new o.a.Promise(function(i,a){c.a.ajax({url:Object(m.n)(t,e),dataType:"script",cache:!0}).then(function(){r.a.delay(function(){A();var e=-10&&void 0!==arguments[0]?arguments[0]:"";return c+Object(a.pString)(e)}function w(){return h?s:l+g}function A(){return s}function O(e,t,n){return n=Object(a.isUnd)(n)?b:n,l+"/Raw/"+u+"/"+n+"/"+e+"/"+u+"/"+t}function T(e,t){return O("Download",e,t)}function C(e,t){return O("View",e,t)}function _(e,t){return O("ViewThumbnail",e,t)}function E(e,t){return O("ViewAsPlain",e,t)}function D(e,t){return O("FramedView",e,t)}function N(e){return l+"/"+e+"/"+u+"/"+b+"/"}function j(){return N("Upload")}function R(){return N("UploadContacts")}function I(){return N("UploadBackground")}function x(){return N("Append")}function P(e){return N("Change")+Object(a.encodeURIComponent)(e)+"/"}function k(e){return N("Ajax")+e}function L(e){return l+"/Raw/"+u+"/"+b+"/ViewAsPlain/"+u+"/"+e}function M(e){return l+"/Raw/"+u+"/"+b+"/Download/"+u+"/"+e}function F(e){return l+"/Raw/0/Avatar/"+Object(a.encodeURIComponent)(e)+"/"}function U(e){return l+"/Raw/"+u+"/"+b+"/UserBackground/"+u+"/"+e}function H(){return l+"/Info"}function G(e,t){return l+"/Lang/0/"+(t?"Admin":"App")+"/"+o.a.encodeURI(e)+"/"+d+"/"}function B(){return l+"/Raw/"+u+"/"+b+"/ContactsVcf/"}function V(){return l+"/Raw/"+u+"/"+b+"/ContactsCsv/"}function q(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return l+"SocialGoogle"+(""!==b?"/"+u+"/"+b+"/":"")+(e?"&xauth=1":"")}function z(){return l+"SocialTwitter"+(""!==b?"/"+u+"/"+b+"/":"")}function K(){return l+"SocialFacebook"+(""!==b?"/"+u+"/"+b+"/":"")}function W(e){return m+e}function Y(){return W("css/images/empty-contact.png")}function $(e){return W("sounds/"+e)}function J(){return W("css/images/icom-message-notification.png")}function X(){return W("js/min/openpgp.min.js")}function Q(){return W("js/min/openpgp.worker.min.js")}function Z(e){var t=f;return"@custom"===e.substr(-7)&&(e=Object(a.trim)(e.substring(0,e.length-7)),t=p),t+"themes/"+o.a.encodeURI(e)+"/images/preview.png"}function ee(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"INBOX";return c+"mailbox/"+e}function te(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return c+"settings"+(e?"/"+e:"")}function ne(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";t=Object(a.isNormal)(t)?Object(a.pInt)(t):1,n=Object(a.pString)(n);var r=c+"mailbox/";if(""!==e){var s=Object(a.pInt)(i);r+=o.a.encodeURI(e)+(01&&void 0!==arguments[1])||arguments[1];this.defaultRequest(e,"AdminDomainList",{IncludeAliases:t?"1":"0"})},t.prototype.pluginList=function(e){this.defaultRequest(e,"AdminPluginList")},t.prototype.packagesList=function(e){this.defaultRequest(e,"AdminPackagesList")},t.prototype.coreData=function(e){this.defaultRequest(e,"AdminCoreData")},t.prototype.updateCoreData=function(e){this.defaultRequest(e,"AdminUpdateCoreData",{},9e4)},t.prototype.packageInstall=function(e,t){this.defaultRequest(e,"AdminPackageInstall",{Id:t.id,Type:t.type,File:t.file},6e4)},t.prototype.packageDelete=function(e,t){this.defaultRequest(e,"AdminPackageDelete",{Id:t.id})},t.prototype.domain=function(e,t){this.defaultRequest(e,"AdminDomainLoad",{Name:t})},t.prototype.plugin=function(e,t){this.defaultRequest(e,"AdminPluginLoad",{Name:t})},t.prototype.domainDelete=function(e,t){this.defaultRequest(e,"AdminDomainDelete",{Name:t})},t.prototype.domainDisable=function(e,t,n){return this.defaultRequest(e,"AdminDomainDisable",{Name:t,Disabled:n?"1":"0"})},t.prototype.pluginSettingsUpdate=function(e,t){return this.defaultRequest(e,"AdminPluginSettingsUpdate",t)},t.prototype.licensing=function(e,t){return this.defaultRequest(e,"AdminLicensing",{Force:t?"1":"0"})},t.prototype.licensingActivate=function(e,t,n){return this.defaultRequest(e,"AdminLicensingActivate",{Domain:t,Key:n})},t.prototype.pluginDisable=function(e,t,n){return this.defaultRequest(e,"AdminPluginDisable",{Name:t,Disabled:n?"1":"0"})},t.prototype.createDomainAlias=function(e,t,n){this.defaultRequest(e,"AdminDomainAliasSave",{Name:t,Alias:n})},t.prototype.createOrUpdateDomain=function(e,t,n,i,o,a,r,s,c,l,u,d,p,f,m,h,g,b,v){this.defaultRequest(e,"AdminDomainSave",{Create:t?"1":"0",Name:n,IncHost:i,IncPort:o,IncSecure:a,IncShortLogin:r?"1":"0",UseSieve:s?"1":"0",SieveAllowRaw:c?"1":"0",SieveHost:l,SievePort:u,SieveSecure:d,OutHost:p,OutPort:f,OutSecure:m,OutShortLogin:h?"1":"0",OutAuth:g?"1":"0",OutUsePhpMail:b?"1":"0",WhiteList:v})},t.prototype.testConnectionForDomain=function(e,t,n,i,o,a,r,s,c,l,u,d,p,f){this.defaultRequest(e,"AdminDomainTest",{Name:t,IncHost:n,IncPort:i,IncSecure:o,UseSieve:a?"1":"0",SieveHost:r,SievePort:s,SieveSecure:c,OutHost:l,OutPort:u,OutSecure:d,OutAuth:p?"1":"0",OutUsePhpMail:f?"1":"0"})},t.prototype.testContacts=function(e,t){this.defaultRequest(e,"AdminContactsTest",t)},t.prototype.saveNewAdminPassword=function(e,t){this.defaultRequest(e,"AdminPasswordUpdate",t)},t.prototype.adminPing=function(e){this.defaultRequest(e,"AdminPing")},t}(n(/*! Remote/AbstractAjax */115).a);t.a=new l}, +/*!******************************!*\ + !*** ./dev/Common/Events.js ***! + \******************************/ +/*! exports provided: sub, pub */ +/*! exports used: pub, sub */function(e,t,n){"use strict";n.d(t,"b",function(){return c}),n.d(t,"a",function(){return l});var i=n(/*! _ */4),o=n.n(i),a=n(/*! Common/Utils */2),r=n(/*! Common/Plugins */29),s={};function c(e,t,n){Object(a.isObject)(e)?(n=t||null,t=null,o.a.each(e,function(e,t){c(t,e,n)})):(Object(a.isUnd)(s[e])&&(s[e]=[]),s[e].push([t,n]))}function l(e,t){r.f("rl-pub",[e,t]),Object(a.isUnd)(s[e])||o.a.each(s[e],function(e){e[0]&&e[0].apply(e[1]||null,t||[])})}}, +/*!******************************!*\ + !*** ./dev/Common/Consts.js ***! + \******************************/ +/*! exports provided: MESSAGES_PER_PAGE, MESSAGES_PER_PAGE_VALUES, CONTACTS_PER_PAGE, DEFAULT_AJAX_TIMEOUT, SEARCH_AJAX_TIMEOUT, SEND_MESSAGE_AJAX_TIMEOUT, SAVE_MESSAGE_AJAX_TIMEOUT, CONTACTS_SYNC_AJAX_TIMEOUT, UNUSED_OPTION_VALUE, CLIENT_SIDE_STORAGE_INDEX_NAME, IMAP_DEFAULT_PORT, IMAP_DEFAULT_SECURE_PORT, SMTP_DEFAULT_PORT, SMTP_DEFAULT_SECURE_PORT, SIEVE_DEFAULT_PORT, MESSAGE_BODY_CACHE_LIMIT, AJAX_ERROR_LIMIT, TOKEN_ERROR_LIMIT, RAINLOOP_TRIAL_KEY, DATA_IMAGE_USER_DOT_PIC, DATA_IMAGE_TRANSP_PIC, DATA_IMAGE_LAZY_PLACEHOLDER_PIC */ +/*! exports used: AJAX_ERROR_LIMIT, CLIENT_SIDE_STORAGE_INDEX_NAME, CONTACTS_PER_PAGE, CONTACTS_SYNC_AJAX_TIMEOUT, DATA_IMAGE_LAZY_PLACEHOLDER_PIC, DATA_IMAGE_USER_DOT_PIC, DEFAULT_AJAX_TIMEOUT, IMAP_DEFAULT_PORT, MESSAGES_PER_PAGE, MESSAGES_PER_PAGE_VALUES, MESSAGE_BODY_CACHE_LIMIT, SAVE_MESSAGE_AJAX_TIMEOUT, SEARCH_AJAX_TIMEOUT, SEND_MESSAGE_AJAX_TIMEOUT, SIEVE_DEFAULT_PORT, SMTP_DEFAULT_PORT, TOKEN_ERROR_LIMIT, UNUSED_OPTION_VALUE */function(e,t,n){"use strict";n.d(t,"i",function(){return i}),n.d(t,"j",function(){return o}),n.d(t,"c",function(){return a}),n.d(t,"g",function(){return r}),n.d(t,"m",function(){return s}),n.d(t,"n",function(){return c}),n.d(t,"l",function(){return l}),n.d(t,"d",function(){return u}),n.d(t,"r",function(){return d}),n.d(t,"b",function(){return p}),n.d(t,"h",function(){return f}),n.d(t,"p",function(){return m}),n.d(t,"o",function(){return h}),n.d(t,"k",function(){return g}),n.d(t,"a",function(){return b}),n.d(t,"q",function(){return v}),n.d(t,"f",function(){return S}),n.d(t,"e",function(){return y});var i=20,o=[10,20,30,50,100],a=50,r=3e4,s=3e5,c=3e5,l=2e5,u=2e5,d="__UNUSE__",p="rlcsc",f=143,m=25,h=4190,g=15,b=7,v=10,S="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAuCAYAAABXuSs3AAAHHklEQVRoQ7VZW08bVxCeXRuwIbTGXIwNtBBaqjwgVUiR8lDlbza9qe1DpVZ9aNQ/0KpPeaJK07SpcuEeCEmUAObm21bfrL9lONjexSYrWfbunj37zXdmvpkz9oIgCKTD0Wg0xPd94TDP83Q0zvWa50vzklSrdanVanqf4/D84GBGr+F+Op3S8fqoJxLOdnZgTvsO/nYhenHA+UC7CWF1uXwkb9++ldPTUwVerVbVqFQqpR8YPjQ0JCMjI5LNDijoRgP3PQVu5+5Eor2XGLg7IV4GkIdHJ/LmzRs5ODiIwNbrdR0O0GCcq4Xz4eFhmZyclP7+tDQaIik/BG5XKQn4SwG3zJTLZXn9+rUclI8UHD5YVoDDN8bSzXhONwL48fFxGR4eilzFZT1uFRIB5yT8BqCdnR3Z3d0VP9Un6XRawYJpggVrZBv38ME4XKtUKnLt2jUplUoy1PR/l3U7T6sVSAQcgMAkj8PDQ9ne3pajoyMRL7zeKsYZWHgWYDGmv78/mmdwcFA+mJlSgziHDWrERrsjEXDXegTi1tZW+DLxI2bxIrqFNYTXyDyCFweMAHCwb8e4RnTNuOsqe3t7sra21pTD0Kct666E8XlcZyzw9/RUUXK5nK5oUinUQI6TQ3cynO/v78vq6qrKXCNwlTiJJpyNGc3nZHp6uqV2dwrQWOCtZBDAV1ZWwsQk7f0wiQn5kffbAu/0/KWBYzIC1+XukfGx0RGZmppKlC2tIV0Bh4aDcZW7HhkfH8urLLZL7T2pihvlkMNnz56FiadHxicL41IsFpN41bkxsYxbRdFo9jwB8KdPn14J8KnSpBQKhQs63nPmbCVRcBUAR2Lq1VVmpksyMTFxAXjcEsQybiegESionjx5osCZOeNe1O4+EhCAX7bQSgQcxRHTMgAgcz5+/Dis/hL4uHU3/B4YGNASGHIKxuEql0k+l05AeIAF1vPnz5VxFFmdDlaJrMtZITJeSsXCOTlMunKxjLtMYOKNjQ158eJFuAuKkUOb5sEwgff19SkJUBVkThZUbnXZrtCKBQ6gbnWIkjZpyne3ejAWoGnA7Icz6irvBLgbOMicCM6TkxPx/LAkbXfgWcsazuE2kFRsKD5Z+CiqDumKncpZvieWcS6dDVD8xiYCNflpJdwcdwJOf9airLmVQ7DPzMxIYWLsXGXoVqLt5k0M3K3JUVPDZdbWNzsCp48TPFdvdnZWUz32nDha7bJ63kgAJPzSdRks9/Kf9xMJAQ1gq2NpaUmy2Yz4zar4nQC3xb99AQwCcGzLAAwuhG8YiWvcOKts+r4GOe5nMhm5efOm9lUA3E3vSZJRrKvE0fnPv//Jy5cvo5cTHIPQbSjhOoqq69evS19f6lxDKK4+sVhigZPtKJqbrQeqxd5+WR4+fKgqgT0k2XX3nhiPgETWXFhYkFzuPZ2yVq1GTSOXpE47/VjgNnD4m4GG7/LhsTx69EiwD4Vr2MwIIxgbAH18fKx1yfz8vEogNvGtWnCuhLZa9UTAreVWFsHy/b/+Vrbdl7E5REMQD2jDoUbByty+/ZnU64GkU2HzyJLhktU1cLv8nARgkYS2d3ajAgwG8qU2oLmDZ92CMaOjo7K4uCiZgbDWaRWgnZhPxLhrMUCvr69riwKZk1LHF7XqrWAO9hJxH6ozNzcnCx/PqztZg9mf6SQMscCtm2C5ke4BGMlHWTUp36036AJajDVrFMzBrhhWslQsSrFYiOqVpMriNYIgqFRq2j3FAb/zffT6zuxFXxsNzs3NTXn16lW4gYiW96w1FyedF+83xG/2FNGCRpU4NjamMsn+OZ9xE5RXqdaDdPpib6RWCzuwKF9RxqI2AVNQBwQYJoK0wdBejnqtEikP3pfP51XjUTESl12FqJEKxsEorARYDD44ONTeID7YpsEnrRvQfWAI2e8WfDaTUSIwJ0iBCmFOtOUAHvVMPp/TPwvYFVYFIuP8l+DBgwdaa2Miqwa0GgYwfeMltovbDfh6c1vIgMYcliSsKv4IWFr6VDHxvldvBAH+1sA+cnl5WYOPmmr9ir+1l9I0Cgz0yjhXjfJJ0JROnmezWbl165ayr/5fqwcBNr7IfhjMqKcvESSM4eRcCasQ3bDNObmKPLdGUGpZsN24cUNLBm9zazu4d++e6qpNBFaTuUS26U5dpuR1CxyA7J9ddrMRqlz4pwLLYawymPd++/2PADt2ugcGwq9gCCdhQ96C6xWwa6j1ceuq+I0EhW0i8MAIVJfeL3d/DVD8EKi12P6/2S2jV/EccVB54O/ejz/9HGCpoBBMta5rXMXLu53D1XAwjhXwvvv+h4BAXVe4bOu3O3ChxF08LiZFG3fel199G9CH3fLyqv24NcB44MRhpdK788U3CpyKwsCw590xmfSpzsBt0Fqc3ud3vtZigxWcVZCklVpSiN0w3q5E/h9TGMIUuA3+EQAAAABJRU5ErkJggg==",y="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC"}, +/*!***************************************!*\ + !*** ./dev/Knoin/AbstractViewNext.js ***! + \***************************************/ +/*! exports provided: AbstractViewNext */ +/*! exports used: AbstractViewNext */function(e,t,n){"use strict";n.d(t,"a",function(){return l});var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! ko */1),r=n(/*! Common/Utils */2),s=n(/*! Common/Enums */0),c=n(/*! Common/Globals */6),l=function(){function e(){o()(this,e),this.bDisabeCloseOnEsc=!1,this.sDefaultKeyScope=s.KeyState.None,this.sCurrentKeyScope=s.KeyState.None,this.viewModelVisibility=a.a.observable(!1),this.modalVisibility=a.a.observable(!1).extend({rateLimit:0}),this.viewModelName="",this.viewModelNames=[],this.viewModelDom=null}return e.prototype.storeAndSetKeyScope=function(){this.sCurrentKeyScope=Object(c.keyScope)(),Object(c.keyScope)(this.sDefaultKeyScope)},e.prototype.restoreKeyScope=function(){Object(c.keyScope)(this.sCurrentKeyScope)},e.prototype.registerPopupKeyDown=function(){var e=this;c.$win.on("keydown",function(t){if(t&&e.modalVisibility&&e.modalVisibility()){if(!e.bDisabeCloseOnEsc&&s.EventKeyCode.Esc===t.keyCode)return Object(r.delegateRun)(e,"cancelCommand"),!1;if(s.EventKeyCode.Backspace===t.keyCode&&!Object(r.inFocus)())return!1}return!0})},e.prototype.cancelCommand=function(){},e.prototype.closeCommand=function(){},e}()}, +/*!******************************!*\ + !*** ./dev/Stores/Social.js ***! + \******************************/ +/*! exports provided: default */ +/*! exports used: default */function(e,t,n){"use strict";var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! window */3),r=n.n(a),s=n(/*! ko */1),c=n(/*! $ */7),l=n.n(c),u=n(/*! Storage/Settings */5),d=function(){function e(){var t=this;o()(this,e),this.google={},this.twitter={},this.facebook={},this.dropbox={},this.google.enabled=s.a.observable(!1),this.google.clientID=s.a.observable(""),this.google.clientSecret=s.a.observable(""),this.google.apiKey=s.a.observable(""),this.google.loading=s.a.observable(!1),this.google.userName=s.a.observable(""),this.google.loggined=s.a.computed(function(){return""!==t.google.userName()}),this.google.capa={},this.google.capa.auth=s.a.observable(!1),this.google.capa.authFast=s.a.observable(!1),this.google.capa.drive=s.a.observable(!1),this.google.capa.preview=s.a.observable(!1),this.google.require={},this.google.require.clientSettings=s.a.computed(function(){return t.google.enabled()&&(t.google.capa.auth()||t.google.capa.drive())}),this.google.require.apiKeySettings=s.a.computed(function(){return t.google.enabled()&&t.google.capa.drive()}),this.facebook.enabled=s.a.observable(!1),this.facebook.appID=s.a.observable(""),this.facebook.appSecret=s.a.observable(""),this.facebook.loading=s.a.observable(!1),this.facebook.userName=s.a.observable(""),this.facebook.supported=s.a.observable(!1),this.facebook.loggined=s.a.computed(function(){return""!==t.facebook.userName()}),this.twitter.enabled=s.a.observable(!1),this.twitter.consumerKey=s.a.observable(""),this.twitter.consumerSecret=s.a.observable(""),this.twitter.loading=s.a.observable(!1),this.twitter.userName=s.a.observable(""),this.twitter.loggined=s.a.computed(function(){return""!==t.twitter.userName()}),this.dropbox.enabled=s.a.observable(!1),this.dropbox.apiKey=s.a.observable("")}return e.prototype.populate=function(){this.google.enabled(!!u.settingsGet("AllowGoogleSocial")),this.google.clientID(u.settingsGet("GoogleClientID")),this.google.clientSecret(u.settingsGet("GoogleClientSecret")),this.google.apiKey(u.settingsGet("GoogleApiKey")),this.google.capa.auth(!!u.settingsGet("AllowGoogleSocialAuth")),this.google.capa.authFast(!!u.settingsGet("AllowGoogleSocialAuthFast")),this.google.capa.drive(!!u.settingsGet("AllowGoogleSocialDrive")),this.google.capa.preview(!!u.settingsGet("AllowGoogleSocialPreview")),this.facebook.enabled(!!u.settingsGet("AllowFacebookSocial")),this.facebook.appID(u.settingsGet("FacebookAppID")),this.facebook.appSecret(u.settingsGet("FacebookAppSecret")),this.facebook.supported(!!u.settingsGet("SupportedFacebookSocial")),this.twitter.enabled=s.a.observable(!!u.settingsGet("AllowTwitterSocial")),this.twitter.consumerKey=s.a.observable(u.settingsGet("TwitterConsumerKey")),this.twitter.consumerSecret=s.a.observable(u.settingsGet("TwitterConsumerSecret")),this.dropbox.enabled(!!u.settingsGet("AllowDropboxSocial")),this.dropbox.apiKey(u.settingsGet("DropboxApiKey"))},e.prototype.appendDropbox=function(){if(!r.a.Dropbox&&this.dropbox.enabled()&&this.dropbox.apiKey()&&!r.a.document.getElementById("dropboxjs")){var e=r.a.document.createElement("script");e.type="text/javascript",e.src="https://www.dropbox.com/static/api/2/dropins.js",l()(e).attr("id","dropboxjs").attr("data-app-key",this.dropbox.apiKey()),r.a.document.body.appendChild(e)}},e}();t.a=new d}, +/*!***********************************!*\ + !*** ./dev/Component/Abstract.js ***! + \***********************************/ +/*! exports provided: AbstractComponent, componentExportHelper */ +/*! exports used: AbstractComponent, componentExportHelper */, +/*!***********************************!*\ + !*** ./dev/Component/Abstract.js ***! + \***********************************/ +/*! exports provided: AbstractComponent, componentExportHelper */ +/*! exports used: AbstractComponent, componentExportHelper */function(e,t,n){"use strict";n.d(t,"a",function(){return u}),n.d(t,"b",function(){return d});var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! $ */7),r=n.n(a),s=n(/*! ko */1),c=n(/*! Common/Utils */2),l=n(/*! Common/Translator */10),u=function(){function e(){o()(this,e),this.disposable=[]}return e.prototype.dispose=function(){this.disposable.forEach(function(e){e&&e.dispose&&e.dispose()})},e}(),d=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return{template:t?{element:t}:"",viewModel:{createViewModel:function(t,n){return(t=t||{}).element=null,n&&n.element&&(t.component=n,t.element=r()(n.element),Object(l.i18nToNodes)(t.element),!Object(c.isUnd)(t.inline)&&s.a.unwrap(t.inline)&&t.element.css("display","inline-block")),new e(t)}}}}}, +/*!*******************************!*\ + !*** ./dev/Common/Plugins.js ***! + \*******************************/ +/*! exports provided: addHook, runHook, mainSettingsGet, remoteRequest, addSettingsViewModel, addSettingsViewModelForAdmin, runSettingsViewModelHooks, settingsGet */ +/*! exports used: addHook, addSettingsViewModel, addSettingsViewModelForAdmin, mainSettingsGet, remoteRequest, runHook, runSettingsViewModelHooks, settingsGet */, +/*!*******************************!*\ + !*** ./dev/Common/Plugins.js ***! + \*******************************/ +/*! exports provided: addHook, runHook, mainSettingsGet, remoteRequest, addSettingsViewModel, addSettingsViewModelForAdmin, runSettingsViewModelHooks, settingsGet */ +/*! exports used: addHook, addSettingsViewModel, addSettingsViewModelForAdmin, mainSettingsGet, remoteRequest, runHook, runSettingsViewModelHooks, settingsGet */function(e,t,n){"use strict";n.d(t,"a",function(){return d}),n.d(t,"f",function(){return p}),n.d(t,"d",function(){return f}),n.d(t,"e",function(){return m}),n.d(t,"b",function(){return h}),n.d(t,"c",function(){return g}),n.d(t,"g",function(){return b}),n.d(t,"h",function(){return v});var i=n(/*! _ */4),o=n.n(i),a=n(/*! Common/Utils */2),r=n(/*! Common/Globals */6),s=n(/*! Storage/Settings */5),c={},l=[],u=[];function d(e,t){Object(a.isFunc)(t)&&(Object(a.isArray)(c[e])||(c[e]=[]),c[e].push(t))}function p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];Object(a.isArray)(c[e])&&o.a.each(c[e],function(e){e.apply(void 0,t)})}function f(e){return s.settingsGet(e)}function m(e,t,n,i){r.data.__APP__&&r.data.__APP__.remote().defaultRequest(e,"Plugin"+t,n,i)}function h(e,t,n,i){l.push([e,t,n,i])}function g(e,t,n,i){u.push([e,t,n,i])}function b(e){var t=n(/*! Knoin/Knoin */9);o.a.each(e?u:l,function(e){t.addSettingsViewModel(e[0],e[1],e[2],e[3])})}function v(e,t){var n=s.settingsGet("Plugins");return(n=n&&!Object(a.isUnd)(n[e])?n[e]:null)?Object(a.isUnd)(n[t])?null:n[t]:null}},, +/*!********************************!*\ + !*** ./dev/Stores/Language.js ***! + \********************************/ +/*! exports provided: default */ +/*! exports used: default */, +/*!********************************!*\ + !*** ./dev/Stores/Language.js ***! + \********************************/ +/*! exports provided: default */ +/*! exports used: default */function(e,t,n){"use strict";var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! ko */1),r=n(/*! Common/Utils */2),s=n(/*! Storage/Settings */5),c=function(){function e(){o()(this,e),this.languages=a.a.observableArray([]),this.languagesAdmin=a.a.observableArray([]),this.language=a.a.observable("").extend({limitedList:this.languages}).extend({reversible:!0}),this.languageAdmin=a.a.observable("").extend({limitedList:this.languagesAdmin}).extend({reversible:!0}),this.userLanguage=a.a.observable(""),this.userLanguageAdmin=a.a.observable("")}return e.prototype.populate=function(){var e=s.appSettingsGet("languages"),t=s.appSettingsGet("languagesAdmin");this.languages(Object(r.isArray)(e)?e:[]),this.languagesAdmin(Object(r.isArray)(t)?t:[]),this.language(s.settingsGet("Language")),this.languageAdmin(s.settingsGet("LanguageAdmin")),this.userLanguage(s.settingsGet("UserLanguage")),this.userLanguageAdmin(s.settingsGet("UserLanguageAdmin"))},e}();t.a=new c}, +/*!********************************!*\ + !*** ./dev/Common/Momentor.js ***! + \********************************/ +/*! exports provided: momentNow, momentNowUnix, searchSubtractFormatDateHelper, format, momentToNode, reload */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./dev/External/ko.js (referenced with cjs require) */, +/*!********************************!*\ + !*** ./dev/Common/Momentor.js ***! + \********************************/ +/*! exports provided: momentNow, momentNowUnix, searchSubtractFormatDateHelper, format, momentToNode, reload */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./dev/External/ko.js (referenced with cjs require) */function(e,t,n){"use strict";n.r(t),n.d(t,"momentNow",function(){return g}),n.d(t,"momentNowUnix",function(){return b}),n.d(t,"searchSubtractFormatDateHelper",function(){return v}),n.d(t,"format",function(){return S}),n.d(t,"momentToNode",function(){return y}),n.d(t,"reload",function(){return w});var i=n(/*! window */3),o=n.n(i),a=n(/*! _ */4),r=n.n(a),s=n(/*! $ */7),c=n.n(s),l=n(/*! moment */54),u=n.n(l),d=n(/*! Common/Translator */10),p=null,f=0,m=r.a.debounce(function(){p=u()()},500,!0),h=r.a.debounce(function(){f=u()().unix()},500,!0);function g(){return m(),p||u()()}function b(){return h(),f||0}function v(e){return g().clone().subtract(e,"days").format("YYYY.MM.DD")}function S(e,t){var n=null,i="",o=b();if((n=0<(e=o<(e=0=t.diff(e,"hours"):return e.fromNow();case t.format("L")===e.format("L"):return Object(d.i18n)("MESSAGE_LIST/TODAY_AT",{TIME:e.format("LT")});case t.clone().subtract(1,"days").format("L")===e.format("L"):return Object(d.i18n)("MESSAGE_LIST/YESTERDAY_AT",{TIME:e.format("LT")});case t.year()===e.year():return e.format("D MMM.")}return e?e.format("LL"):""}(n);break;case"FULL":i=n.format("LLL");break;default:i=n.format(t)}return i}function y(e){var t,n="",i=c()(e);(t=i.data("moment-time"))&&((n=i.data("moment-format"))&&i.text(S(t,n)),(n=i.data("moment-format-title"))&&i.attr("title",S(t,n)))}function w(){r.a.defer(function(){c()(".moment",o.a.document).each(function(e,t){y(t)})})}}, +/*!********************************!*\ + !*** external "window.hasher" ***! + \********************************/ +/*! no static exports found */ +/*! exports used: default */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports=window.hasher}, +/*!**********************************!*\ + !*** ./dev/Helper/Apps/Admin.js ***! + \**********************************/ +/*! exports provided: getApp */ +/*! exports used: getApp */, +/*!**********************************!*\ + !*** ./dev/Helper/Apps/Admin.js ***! + \**********************************/ +/*! exports provided: getApp */ +/*! exports used: getApp */function(e,t,n){"use strict";function i(){return n(/*! App/Admin */172).default}n.d(t,"a",function(){return i})}, +/*!*********************************!*\ + !*** ./dev/Stores/Admin/App.js ***! + \*********************************/ +/*! exports provided: default */ +/*! exports used: default */function(e,t,n){"use strict";var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! babel-runtime/helpers/possibleConstructorReturn */12),r=n.n(a),s=n(/*! babel-runtime/helpers/inherits */11),c=n.n(s),l=n(/*! window */3),u=n.n(l),d=n(/*! $ */7),p=n.n(d),f=n(/*! ko */1),m=n(/*! Storage/Settings */5),h=function(e){function t(){o()(this,t);var n=r()(this,e.call(this));return n.determineUserLanguage=f.a.observable(!1),n.determineUserDomain=f.a.observable(!1),n.weakPassword=f.a.observable(!1),n.useLocalProxyForExternalImages=f.a.observable(!1),n.dataFolderAccess=f.a.observable(!1),n}return c()(t,e),t.prototype.populate=function(){var t=this;e.prototype.populate.call(this),this.determineUserLanguage(!!Object(m.settingsGet)("DetermineUserLanguage")),this.determineUserDomain(!!Object(m.settingsGet)("DetermineUserDomain")),this.weakPassword(!!Object(m.settingsGet)("WeakPassword")),this.useLocalProxyForExternalImages(!!Object(m.settingsGet)("UseLocalProxyForExternalImages")),Object(m.settingsGet)("Auth")&&p.a.get("./data/VERSION?"+u.a.Math.random()).then(function(){return t.dataFolderAccess(!0)})},t}(n(/*! Stores/AbstractApp */116).a);t.a=new h}, +/*!*****************************!*\ + !*** ./dev/Stores/Theme.js ***! + \*****************************/ +/*! exports provided: default */ +/*! exports used: default */function(e,t,n){"use strict";var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! ko */1),r=n(/*! Common/Utils */2),s=n(/*! Storage/Settings */5),c=function(){function e(){o()(this,e),this.themes=a.a.observableArray([]),this.themeBackgroundName=a.a.observable(""),this.themeBackgroundHash=a.a.observable(""),this.theme=a.a.observable("").extend({limitedList:this.themes})}return e.prototype.populate=function(){var e=s.appSettingsGet("themes");this.themes(Object(r.isArray)(e)?e:[]),this.theme(s.settingsGet("Theme")),this.themeBackgroundName(s.settingsGet("UserBackgroundName")),this.themeBackgroundHash(s.settingsGet("UserBackgroundHash"))},e}();t.a=new c}, +/*!*******************************************************!*\ + !*** ./node_modules/core-js/library/modules/_core.js ***! + \*******************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){var n=e.exports={version:"2.5.1"};"number"==typeof __e&&(__e=n)}, +/*!*********************************************************!*\ + !*** ./node_modules/core-js/library/modules/_global.js ***! + \*********************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)}, +/*!**************************************************************!*\ + !*** ./node_modules/core-js/library/modules/_descriptors.js ***! + \**************************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){e.exports=!n(/*! ./_fails */51)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})}, +/*!*************************************************************!*\ + !*** ./node_modules/core-js/library/modules/_to-iobject.js ***! + \*************************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_iobject */109),o=n(/*! ./_defined */73);e.exports=function(e){return i(o(e))}}, +/*!****************************!*\ + !*** ./dev/Model/Email.js ***! + \****************************/ +/*! exports provided: EmailModel, default */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./dev/Common/Utils.js (referenced with cjs require), ./dev/External/ko.js (referenced with cjs require) */function(e,t,n){"use strict";n.r(t),n.d(t,"EmailModel",function(){return u}),n.d(t,"default",function(){return u});var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! _ */4),r=n.n(a),s=n(/*! emailjs-addressparser */76),c=n.n(s),l=n(/*! Common/Utils */2),u=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";o()(this,e),this.email="",this.name="",this.dkimStatus="",this.dkimValue="",this.email=t,this.name=n,this.dkimStatus=i,this.dkimValue=a,this.clearDuplicateName()}return e.newInstanceFromJson=function(t){var n=new e;return n.initByJson(t)?n:null},e.prototype.clear=function(){this.email="",this.name="",this.dkimStatus="none",this.dkimValue=""},e.prototype.validate=function(){return""!==this.name||""!==this.email},e.prototype.hash=function(){return"#"+(arguments.length>0&&void 0!==arguments[0]&&arguments[0]?"":this.name)+"#"+this.email+"#"},e.prototype.clearDuplicateName=function(){this.name===this.email&&(this.name="")},e.prototype.search=function(e){return-1<(this.name+" "+this.email).toLowerCase().indexOf(e.toLowerCase())},e.prototype.initByJson=function(e){var t=!1;return e&&"Object/Email"===e["@Object"]&&(this.name=Object(l.trim)(e.Name),this.email=Object(l.trim)(e.Email),this.dkimStatus=Object(l.trim)(e.DkimStatus||""),this.dkimValue=Object(l.trim)(e.DkimValue||""),t=""!==this.email,this.clearDuplicateName()),t},e.prototype.toLine=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i="";return""!==this.email&&(e&&""!==this.name?i=t?'
")+'" target="_blank" tabindex="-1">'+Object(l.encodeHtml)(this.name)+"":n?Object(l.encodeHtml)(this.name):this.name:(i=this.email,""!==this.name?t?i=Object(l.encodeHtml)('"'+this.name+'" <')+'")+'" target="_blank" tabindex="-1">'+Object(l.encodeHtml)(i)+""+Object(l.encodeHtml)(">"):(i='"'+this.name+'" <'+i+">",n&&(i=Object(l.encodeHtml)(i))):t&&(i=''+Object(l.encodeHtml)(this.email)+""))),i},e.splitEmailLine=function(t){var n=c()(t);if(Object(l.isNonEmptyArray)(n)){var i=[],o=!1;return n.forEach(function(t){var n=t.address?new e(t.address.replace(/^[<]+(.*)[>]+$/g,"$1"),t.name||""):null;n&&n.email&&(o=!0),i.push(n?n.toLine(!1):t.name)}),o?i:null}return null},e.parseEmailLine=function(t){var n=c()(t);return Object(l.isNonEmptyArray)(n)?r.a.compact(n.map(function(t){return t.address?new e(t.address.replace(/^[<]+(.*)[>]+$/g,"$1"),t.name||""):null})):[]},e.prototype.parse=function(e){if(""===(e=Object(l.trim)(e)))return!1;var t=c()(e);return!(!Object(l.isNonEmptyArray)(t)||!t[0])&&(this.name=t[0].name||"",this.email=t[0].address||"",this.clearDuplicateName(),!0)},e}()}, +/*!******************************************************!*\ + !*** ./node_modules/core-js/library/modules/_has.js ***! + \******************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */, +/*!******************************************************!*\ + !*** ./node_modules/core-js/library/modules/_has.js ***! + \******************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}}, +/*!****************************************!*\ + !*** ./dev/Component/AbstractInput.js ***! + \****************************************/ +/*! exports provided: AbstractInput, default */ +/*! exports used: AbstractInput */function(e,t,n){"use strict";n.d(t,"a",function(){return p});var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! babel-runtime/helpers/possibleConstructorReturn */12),r=n.n(a),s=n(/*! babel-runtime/helpers/inherits */11),c=n.n(s),l=n(/*! ko */1),u=n(/*! Common/Utils */2),d=n(/*! Common/Enums */0),p=function(e){function t(n){o()(this,t);var i=r()(this,e.call(this));return i.value=n.value||"",i.size=n.size||0,i.label=n.label||"",i.preLabel=n.preLabel||"",i.enable=!!Object(u.isUnd)(n.enable)||n.enable,i.trigger=n.trigger&&n.trigger.subscribe?n.trigger:null,i.placeholder=n.placeholder||"",i.labeled=!Object(u.isUnd)(n.label),i.preLabeled=!Object(u.isUnd)(n.preLabel),i.triggered=!Object(u.isUnd)(n.trigger)&&!!i.trigger,i.classForTrigger=l.a.observable(""),i.className=l.a.computed(function(){var e=l.a.unwrap(i.size),t=i.trigger?" "+Object(u.trim)("settings-saved-trigger-input "+i.classForTrigger()):"";return(01&&void 0!==arguments[1]&&arguments[1];if(!o.a.Promise||!o.a.Promise.all)throw new Error("Promises are not available your environment.");if(!e)throw new Error("src should not be empty.");return new o.a.Promise(function(n,i){var a=o.a.document.createElement("script");a.onload=function(){n(e)},a.onerror=function(){i(new Error(e))},a.async=!0===t,a.src=e,o.a.document.body.appendChild(a)})}}, +/*!******************************************************!*\ + !*** ./node_modules/core-js/library/modules/_wks.js ***! + \******************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_shared */85)("wks"),o=n(/*! ./_uid */70),a=n(/*! ./_global */41).Symbol,r="function"==typeof a;(e.exports=function(e){return i[e]||(i[e]=r&&a[e]||(r?a:o)("Symbol."+e))}).store=i}, +/*!************************************************************!*\ + !*** ./node_modules/core-js/library/modules/_an-object.js ***! + \************************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_is-object */52);e.exports=function(e){if(!i(e))throw TypeError(e+" is not an object!");return e}},, +/*!****************************************************************!*\ + !*** ./node_modules/core-js/library/modules/_property-desc.js ***! + \****************************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */, +/*!****************************************************************!*\ + !*** ./node_modules/core-js/library/modules/_property-desc.js ***! + \****************************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}}, +/*!*************************************!*\ + !*** ./dev/Knoin/AbstractScreen.js ***! + \*************************************/ +/*! exports provided: AbstractScreen */ +/*! exports used: AbstractScreen */function(e,t,n){"use strict";n.d(t,"a",function(){return u});var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! _ */4),r=n.n(a),s=n(/*! crossroads */75),c=n.n(s),l=n(/*! Common/Utils */2),u=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];o()(this,e),this.oCross=null,this.sScreenName=t,this.aViewModels=Object(l.isArray)(n)?n:[]}return e.prototype.viewModels=function(){return this.aViewModels},e.prototype.screenName=function(){return this.sScreenName},e.prototype.routes=function(){return null},e.prototype.__cross=function(){return this.oCross},e.prototype.__start=function(){var e=null,t=null,n=this.routes();Object(l.isNonEmptyArray)(n)&&(t=r.a.bind(this.onRoute||l.noop,this),e=c.a.create(),n.forEach(function(n){n&&e&&(e.addRoute(n[0],t).rules=n[1])}),this.oCross=e)},e}()}, +/*!*****************************!*\ + !*** external "window.ssm" ***! + \*****************************/ +/*! no static exports found */ +/*! exports used: default */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports=window.ssm}, +/*!***************************************************************!*\ + !*** ./node_modules/core-js/library/modules/_to-primitive.js ***! + \***************************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_is-object */52);e.exports=function(e,t){if(!i(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!i(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!i(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!i(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")}}, +/*!************************************!*\ + !*** ./dev/Stores/Admin/Domain.js ***! + \************************************/ +/*! exports provided: default */ +/*! exports used: default */function(e,t,n){"use strict";var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! ko */1);t.a=new function e(){o()(this,e),this.domains=a.a.observableArray([]),this.domains.loading=a.a.observable(!1).extend({throttle:100}),this.domainsWithoutAliases=this.domains.filter(function(e){return e&&!e.alias})}}, +/*!******************************************************!*\ + !*** ./node_modules/core-js/library/modules/_uid.js ***! + \******************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */, +/*!******************************************************!*\ + !*** ./node_modules/core-js/library/modules/_uid.js ***! + \******************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){var n=0,i=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+i).toString(36))}}, +/*!*************************************************************!*\ + !*** ./node_modules/core-js/library/modules/_object-pie.js ***! + \*************************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){t.f={}.propertyIsEnumerable}, +/*!**************************************************************!*\ + !*** ./node_modules/core-js/library/modules/_object-gopd.js ***! + \**************************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_object-pie */71),o=n(/*! ./_property-desc */64),a=n(/*! ./_to-iobject */43),r=n(/*! ./_to-primitive */67),s=n(/*! ./_has */46),c=n(/*! ./_ie8-dom-define */77),l=Object.getOwnPropertyDescriptor;t.f=n(/*! ./_descriptors */42)?l:function(e,t){if(e=a(e),t=r(t,!0),c)try{return l(e,t)}catch(e){}if(s(e,t))return o(!i.f.call(e,t),e[t])}}, +/*!**********************************************************!*\ + !*** ./node_modules/core-js/library/modules/_defined.js ***! + \**********************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}}, +/*!******************************************!*\ + !*** ./dev/Component/AbstracCheckbox.js ***! + \******************************************/ +/*! exports provided: AbstracCheckbox, default */ +/*! exports used: AbstracCheckbox */function(e,t,n){"use strict";n.d(t,"a",function(){return d});var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! babel-runtime/helpers/possibleConstructorReturn */12),r=n.n(a),s=n(/*! babel-runtime/helpers/inherits */11),c=n.n(s),l=n(/*! ko */1),u=n(/*! Common/Utils */2),d=function(e){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};o()(this,t);var i=r()(this,e.call(this));return i.value=n.value,!Object(u.isUnd)(i.value)&&i.value.subscribe||(i.value=l.a.observable(!Object(u.isUnd)(i.value)&&!!i.value)),i.enable=n.enable,!Object(u.isUnd)(i.enable)&&i.enable.subscribe||(i.enable=l.a.observable(!!Object(u.isUnd)(i.enable)||!!i.enable)),i.disable=n.disable,!Object(u.isUnd)(i.disable)&&i.disable.subscribe||(i.disable=l.a.observable(!Object(u.isUnd)(i.disable)&&!!i.disable)),i.label=n.label||"",i.inline=!Object(u.isUnd)(n.inline)&&n.inline,i.readOnly=!Object(u.isUnd)(n.readOnly)&&!!n.readOnly,i.inverted=!Object(u.isUnd)(n.inverted)&&!!n.inverted,i.labeled=!Object(u.isUnd)(n.label),i.labelAnimated=!!n.labelAnimated,i}return c()(t,e),t.prototype.click=function(){this.readOnly||!this.enable()||this.disable()||this.value(!this.value())},t}(n(/*! Component/Abstract */27).a)}, +/*!************************************!*\ + !*** external "window.crossroads" ***! + \************************************/ +/*! no static exports found */ +/*! exports used: default */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports=window.crossroads}, +/*!******************************************************************!*\ + !*** ./node_modules/emailjs-addressparser/dist/addressparser.js ***! + \******************************************************************/ +/*! no static exports found */ +/*! exports used: default */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n=0;u--)if(r.text[u].match(/^[^@\s]+@[^@\s]+$/)){r.address=r.text.splice(u,1);break}var d=function(e){return r.address.length?e:(r.address=[e.trim()]," ")};if(!r.address.length)for(var p=r.text.length-1;p>=0&&(r.text[p]=r.text[p].replace(/\s*\b[^@\s]+@[^@\s]+\b\s*/,d).trim(),!r.address.length);p--);}if(!r.text.length&&r.comment.length&&(r.text=r.comment,r.comment=[]),r.address.length>1&&(r.text=r.text.concat(r.address.splice(1))),r.text=r.text.join(" "),r.address=r.address.join(" "),!r.address&&t)return[];(i={address:r.address||r.text||"",name:r.text||r.address||""}).address===i.name&&((i.address||"").match(/@/)?i.name="":i.address=""),a.push(i)}return a}(e)).length&&(i=i.concat(e))}),i}t.default=o;var a={'"':'"',"(":")","<":">",",":"",":":";",";":""},r=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.str=(t||"").toString(),this.operatorCurrent="",this.operatorExpecting="",this.node=null,this.escaped=!1,this.list=[]}return i(e,[{key:"tokenize",value:function(){for(var e=void 0,t=[],n=0,i=this.str.length;ndocument.F=Object<\/script>"),e.close(),c=e.F;i--;)delete c.prototype[a[i]];return c()};e.exports=Object.create||function(e,t){var n;return null!==e?(s.prototype=i(e),n=new s,s.prototype=null,n[r]=e):n=c(),void 0===t?n:o(n,t)}}, +/*!************************************************************!*\ + !*** ./node_modules/core-js/library/modules/_iterators.js ***! + \************************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports={}}, +/*!**********************************************************!*\ + !*** ./node_modules/core-js/library/modules/_library.js ***! + \**********************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports=!0}, +/*!*************************************************************!*\ + !*** ./node_modules/core-js/library/modules/_to-integer.js ***! + \*************************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){var n=Math.ceil,i=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?i:n)(e)}}, +/*!******************************************************!*\ + !*** ./node_modules/core-js/library/modules/_cof.js ***! + \******************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}}, +/*!*************************************************************!*\ + !*** ./node_modules/core-js/library/modules/_dom-create.js ***! + \*************************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_is-object */52),o=n(/*! ./_global */41).document,a=i(o)&&i(o.createElement);e.exports=function(e){return a?o.createElement(e):{}}}, +/*!******************************************************!*\ + !*** ./node_modules/core-js/library/modules/_ctx.js ***! + \******************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_a-function */112);e.exports=function(e,t,n){if(i(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,o){return e.call(t,n,i,o)}}return function(){return e.apply(t,arguments)}}}, +/*!**********************************!*\ + !*** ./dev/Common/HtmlEditor.js ***! + \**********************************/ +/*! exports provided: HtmlEditor, default */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./dev/External/ko.js (referenced with cjs require) */function(e,t,n){"use strict";n.r(t),n.d(t,"HtmlEditor",function(){return m}),n.d(t,"default",function(){return m});var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! window */3),r=n.n(a),s=n(/*! _ */4),c=n.n(s),l=n(/*! $ */7),u=n.n(l),d=n(/*! Common/Globals */6),p=n(/*! Common/Enums */0),f=n(/*! Storage/Settings */5),m=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;o()(this,e),this.blurTimer=0,this.__resizable=!1,this.__inited=!1,this.onBlur=null,this.onReady=null,this.onModeChange=null,this.onBlur=n,this.onReady=i,this.onModeChange=a,this.element=t,this.$element=u()(t),this.resize=c.a.throttle(c.a.bind(this.resizeEditor,this),100),this.init()}return e.prototype.runOnBlur=function(){this.onBlur&&this.onBlur()},e.prototype.blurTrigger=function(){var e=this;this.onBlur&&(r.a.clearTimeout(this.blurTimer),this.blurTimer=r.a.setTimeout(function(){e.runOnBlur()},p.Magics.Time200ms))},e.prototype.focusTrigger=function(){this.onBlur&&r.a.clearTimeout(this.blurTimer)},e.prototype.isHtml=function(){return!!this.editor&&"wysiwyg"===this.editor.mode},e.prototype.clearCachedSignature=function(){this.editor&&this.editor.execCommand("insertSignature",{clearCache:!0})},e.prototype.setSignature=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];this.editor&&this.editor.execCommand("insertSignature",{isHtml:t,insertBefore:n,signature:e})},e.prototype.checkDirty=function(){return!!this.editor&&this.editor.checkDirty()},e.prototype.resetDirty=function(){this.editor&&this.editor.resetDirty()},e.prototype.getData=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t="";if(this.editor)try{t="plain"===this.editor.mode&&this.editor.plugins.plain&&this.editor.__plain?this.editor.__plain.getRawData():e?'
'+this.editor.getData()+"
":this.editor.getData()}catch(e){}return t},e.prototype.getDataWithHtmlMark=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return(this.isHtml()?":HTML:":"")+this.getData(e)},e.prototype.modeToggle=function(e,t){if(this.editor){try{e?"plain"===this.editor.mode&&this.editor.setMode("wysiwyg"):"wysiwyg"===this.editor.mode&&this.editor.setMode("plain")}catch(e){}t&&this.resize()}},e.prototype.setHtmlOrPlain=function(e,t){":HTML:"===e.substr(0,6)?this.setHtml(e.substr(6),t):this.setPlain(e,t)},e.prototype.setHtml=function(e,t){if(this.editor&&this.__inited){this.clearCachedSignature(),this.modeToggle(!0),e=e.replace(/]*><\/p>/gi,"");try{this.editor.setData(e)}catch(e){}t&&this.focus()}},e.prototype.replaceHtml=function(e,t){if(this.editor&&this.__inited&&"wysiwyg"===this.editor.mode)try{this.editor.setData(this.editor.getData().replace(e,t))}catch(e){}},e.prototype.setPlain=function(e,t){if(this.editor&&this.__inited){if(this.clearCachedSignature(),this.modeToggle(!1),"plain"===this.editor.mode&&this.editor.plugins.plain&&this.editor.__plain)this.editor.__plain.setRawData(e);else try{this.editor.setData(e)}catch(e){}t&&this.focus()}},e.prototype.init=function(){var e=this;if(this.element&&!this.editor){var t=function(){var t=d.htmlEditorDefaultConfig,n=f.settingsGet("Language"),i=!!f.appSettingsGet("allowHtmlEditorSourceButton"),o=!!f.appSettingsGet("allowHtmlEditorBitiButtons");!i&&o||t.toolbarGroups.__cfgInited||(t.toolbarGroups.__cfgInited=!0,i&&(t.removeButtons=t.removeButtons.replace(",Source","")),o||(t.removePlugins+=(t.removePlugins?",":"")+"bidi")),t.enterMode=r.a.CKEDITOR.ENTER_BR,t.shiftEnterMode=r.a.CKEDITOR.ENTER_P,t.language=d.htmlEditorLangsMap[(n||"en").toLowerCase()]||"en",r.a.CKEDITOR.env&&(r.a.CKEDITOR.env.isCompatible=!0),e.editor=r.a.CKEDITOR.appendTo(e.element,t),e.editor.on("key",function(e){return!e||!e.data||p.EventKeyCode.Tab!==e.data.keyCode}),e.editor.on("blur",function(){e.blurTrigger()}),e.editor.on("mode",function(){e.blurTrigger(),e.onModeChange&&e.onModeChange("plain"!==e.editor.mode)}),e.editor.on("focus",function(){e.focusTrigger()}),r.a.FileReader&&e.editor.on("drop",function(t){if(0')},o.readAsDataURL(n),t.data.dataTransfer.setData("text/html",i)}}}),e.editor.on("instanceReady",function(){e.editor.removeMenuItem&&(e.editor.removeMenuItem("cut"),e.editor.removeMenuItem("copy"),e.editor.removeMenuItem("paste")),e.__resizable=!0,e.__inited=!0,e.resize(),e.onReady&&e.onReady()})};r.a.CKEDITOR?t():r.a.__initEditor=t}},e.prototype.focus=function(){if(this.editor)try{this.editor.focus()}catch(e){}},e.prototype.hasFocus=function(){if(this.editor)try{return!!this.editor.focusManager.hasFocus}catch(e){}return!1},e.prototype.blur=function(){if(this.editor)try{this.editor.focusManager.blur(!0)}catch(e){}},e.prototype.resizeEditor=function(){if(this.editor&&this.__resizable)try{this.editor.resize(this.$element.width(),this.$element.innerHeight())}catch(e){}},e.prototype.setReadOnly=function(e){if(this.editor)try{this.editor.setReadOnly(!!e)}catch(e){}},e.prototype.clear=function(e){this.setHtml("",e)},e}()}, +/*!************************************!*\ + !*** external "window.Autolinker" ***! + \************************************/ +/*! no static exports found */ +/*! exports used: default */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports=window.Autolinker}, +/*!*****************************************!*\ + !*** ./node_modules/pikaday/pikaday.js ***! + \*****************************************/ +/*! no static exports found */ +/*! exports used: default */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){ +/*! + * Pikaday + * + * Copyright © 2014 David Bushell | BSD & MIT license | https://github.com/dbushell/Pikaday + */ +!function(t,i){"use strict";var o;try{o=n(/*! moment */54)}catch(e){}e.exports=function(e){var t="function"==typeof e,n=!!window.addEventListener,i=window.document,o=window.setTimeout,a=function(e,t,i,o){n?e.addEventListener(t,i,!!o):e.attachEvent("on"+t,i)},r=function(e,t,i,o){n?e.removeEventListener(t,i,!!o):e.detachEvent("on"+t,i)},s=function(e,t){return-1!==(" "+e.className+" ").indexOf(" "+t+" ")},c=function(e){return/Array/.test(Object.prototype.toString.call(e))},l=function(e){return/Date/.test(Object.prototype.toString.call(e))&&!isNaN(e.getTime())},u=function(e){var t=e.getDay();return 0===t||6===t},d=function(e,t){return[31,function(e){return e%4==0&&e%100!=0||e%400==0}(e)?29:28,31,30,31,30,31,31,30,31,30,31][t]},p=function(e){l(e)&&e.setHours(0,0,0,0)},f=function(e,t){return e.getTime()===t.getTime()},m=function(e,t,n){var i,o;for(i in t)(o=void 0!==e[i])&&"object"==typeof t[i]&&null!==t[i]&&void 0===t[i].nodeName?l(t[i])?n&&(e[i]=new Date(t[i].getTime())):c(t[i])?n&&(e[i]=t[i].slice(0)):e[i]=m({},t[i],n):!n&&o||(e[i]=t[i]);return e},h=function(e,t,n){var o;i.createEvent?((o=i.createEvent("HTMLEvents")).initEvent(t,!0,!1),o=m(o,n),e.dispatchEvent(o)):i.createEventObject&&(o=i.createEventObject(),o=m(o,n),e.fireEvent("on"+t,o))},g=function(e){return e.month<0&&(e.year-=Math.ceil(Math.abs(e.month)/12),e.month+=12),e.month>11&&(e.year+=Math.floor(Math.abs(e.month)/12),e.month-=12),e},b={field:null,bound:void 0,position:"bottom left",reposition:!0,format:"YYYY-MM-DD",toString:null,parse:null,defaultDate:null,setDefaultDate:!1,firstDay:0,formatStrict:!1,minDate:null,maxDate:null,yearRange:10,showWeekNumber:!1,pickWholeWeek:!1,minYear:0,maxYear:9999,minMonth:void 0,maxMonth:void 0,startRange:null,endRange:null,isRTL:!1,yearSuffix:"",showMonthAfterYear:!1,showDaysInNextAndPreviousMonths:!1,enableSelectionDaysInNextAndPreviousMonths:!1,numberOfMonths:1,mainCalendar:"left",container:void 0,blurFieldOnSelect:!0,i18n:{previousMonth:"Previous Month",nextMonth:"Next Month",months:["January","February","March","April","May","June","July","August","September","October","November","December"],weekdays:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],weekdaysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},theme:null,events:[],onSelect:null,onOpen:null,onClose:null,onDraw:null,keyboardInput:!0},v=function(e,t,n){for(t+=e.firstDay;t>=7;)t-=7;return n?e.i18n.weekdaysShort[t]:e.i18n.weekdays[t]},S=function(e){var t=[],n="false";if(e.isEmpty){if(!e.showDaysInNextAndPreviousMonths)return'';t.push("is-outside-current-month"),e.enableSelectionDaysInNextAndPreviousMonths||t.push("is-selection-disabled")}return e.isDisabled&&t.push("is-disabled"),e.isToday&&t.push("is-today"),e.isSelected&&(t.push("is-selected"),n="true"),e.hasEvent&&t.push("has-event"),e.isInRange&&t.push("is-inrange"),e.isStartRange&&t.push("is-startrange"),e.isEndRange&&t.push("is-endrange"),'"},y=function(e,t,n,i){return''+(t?e.reverse():e).join("")+""},w=function(e,t,n,i,o,a){var r,s,l,u,d,p=e._o,f=n===p.minYear,m=n===p.maxYear,h='
',g=!0,b=!0;for(l=[],r=0;r<12;r++)l.push('");for(u='
'+p.i18n.months[i]+'
",c(p.yearRange)?(r=p.yearRange[0],s=p.yearRange[1]+1):(r=n-p.yearRange,s=1+n+p.yearRange),l=[];r=p.minYear&&l.push('");return d='
'+n+p.yearSuffix+'
",p.showMonthAfterYear?h+=d+u:h+=u+d,f&&(0===i||p.minMonth>=i)&&(g=!1),m&&(11===i||p.maxMonth<=i)&&(b=!1),0===t&&(h+='"),t===e._o.numberOfMonths-1&&(h+='"),h+="
"},A=function(r){var c=this,u=c.config(r);c._onMouseDown=function(e){if(c._v){var t=(e=e||window.event).target||e.srcElement;if(t)if(s(t,"is-disabled")||(!s(t,"pika-button")||s(t,"is-empty")||s(t.parentNode,"is-disabled")?s(t,"pika-prev")?c.prevMonth():s(t,"pika-next")&&c.nextMonth():(c.setDate(new Date(t.getAttribute("data-pika-year"),t.getAttribute("data-pika-month"),t.getAttribute("data-pika-day"))),u.bound&&o(function(){c.hide(),u.blurFieldOnSelect&&u.field&&u.field.blur()},100))),s(t,"pika-select"))c._c=!0;else{if(!e.preventDefault)return e.returnValue=!1,!1;e.preventDefault()}}},c._onChange=function(e){var t=(e=e||window.event).target||e.srcElement;t&&(s(t,"pika-select-month")?c.gotoMonth(t.value):s(t,"pika-select-year")&&c.gotoYear(t.value))},c._onKeyChange=function(e){if(e=e||window.event,c.isVisible())switch(e.keyCode){case 13:case 27:u.field&&u.field.blur();break;case 37:e.preventDefault(),c.adjustDate("subtract",1);break;case 38:c.adjustDate("subtract",7);break;case 39:c.adjustDate("add",1);break;case 40:c.adjustDate("add",7)}},c._onInputChange=function(n){var i;n.firedBy!==c&&(i=u.parse?u.parse(u.field.value,u.format):t?(i=e(u.field.value,u.format,u.formatStrict))&&i.isValid()?i.toDate():null:new Date(Date.parse(u.field.value)),l(i)&&c.setDate(i),c._v||c.show())},c._onInputFocus=function(){c.show()},c._onInputClick=function(){c.show()},c._onInputBlur=function(){var e=i.activeElement;do{if(s(e,"pika-single"))return}while(e=e.parentNode);c._c||(c._b=o(function(){c.hide()},50)),c._c=!1},c._onClick=function(e){var t=(e=e||window.event).target||e.srcElement,i=t;if(t){!n&&s(t,"pika-select")&&(t.onchange||(t.setAttribute("onchange","return;"),a(t,"change",c._onChange)));do{if(s(i,"pika-single")||i===u.trigger)return}while(i=i.parentNode);c._v&&t!==u.trigger&&i!==u.trigger&&c.hide()}},c.el=i.createElement("div"),c.el.className="pika-single"+(u.isRTL?" is-rtl":"")+(u.theme?" "+u.theme:""),a(c.el,"mousedown",c._onMouseDown,!0),a(c.el,"touchend",c._onMouseDown,!0),a(c.el,"change",c._onChange),u.keyboardInput&&a(i,"keydown",c._onKeyChange),u.field&&(u.container?u.container.appendChild(c.el):u.bound?i.body.appendChild(c.el):u.field.parentNode.insertBefore(c.el,u.field.nextSibling),a(u.field,"change",c._onInputChange),u.defaultDate||(t&&u.field.value?u.defaultDate=e(u.field.value,u.format).toDate():u.defaultDate=new Date(Date.parse(u.field.value)),u.setDefaultDate=!0));var d=u.defaultDate;l(d)?u.setDefaultDate?c.setDate(d,!0):c.gotoDate(d):c.gotoDate(new Date),u.bound?(this.hide(),c.el.className+=" is-bound",a(u.trigger,"click",c._onInputClick),a(u.trigger,"focus",c._onInputFocus),a(u.trigger,"blur",c._onInputBlur)):this.show()};return A.prototype={config:function(e){this._o||(this._o=m({},b,!0));var t=m(this._o,e,!0);t.isRTL=!!t.isRTL,t.field=t.field&&t.field.nodeName?t.field:null,t.theme="string"==typeof t.theme&&t.theme?t.theme:null,t.bound=!!(void 0!==t.bound?t.field&&t.bound:t.field),t.trigger=t.trigger&&t.trigger.nodeName?t.trigger:t.field,t.disableWeekends=!!t.disableWeekends,t.disableDayFn="function"==typeof t.disableDayFn?t.disableDayFn:null;var n=parseInt(t.numberOfMonths,10)||1;if(t.numberOfMonths=n>4?4:n,l(t.minDate)||(t.minDate=!1),l(t.maxDate)||(t.maxDate=!1),t.minDate&&t.maxDate&&t.maxDate100&&(t.yearRange=100);return t},toString:function(n){return n=n||this._o.format,l(this._d)?this._o.toString?this._o.toString(this._d,n):t?e(this._d).format(n):this._d.toDateString():""},getMoment:function(){return t?e(this._d):null},setMoment:function(n,i){t&&e.isMoment(n)&&this.setDate(n.toDate(),i)},getDate:function(){return l(this._d)?new Date(this._d.getTime()):null},setDate:function(e,t){if(!e)return this._d=null,this._o.field&&(this._o.field.value="",h(this._o.field,"change",{firedBy:this})),this.draw();if("string"==typeof e&&(e=new Date(Date.parse(e))),l(e)){var n=this._o.minDate,i=this._o.maxDate;l(n)&&ei&&(e=i),this._d=new Date(e.getTime()),p(this._d),this.gotoDate(this._d),this._o.field&&(this._o.field.value=this.toString(),h(this._o.field,"change",{firedBy:this})),t||"function"!=typeof this._o.onSelect||this._o.onSelect.call(this,this.getDate())}},gotoDate:function(e){var t=!0;if(l(e)){if(this.calendars){var n=new Date(this.calendars[0].year,this.calendars[0].month,1),i=new Date(this.calendars[this.calendars.length-1].year,this.calendars[this.calendars.length-1].month,1),o=e.getTime();i.setMonth(i.getMonth()+1),i.setDate(i.getDate()-1),t=o=a&&(this._y=a,!isNaN(s)&&this._m>s&&(this._m=s)),t="pika-title-"+Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,2);for(var l=0;l'+w(this,l,this.calendars[l].year,this.calendars[l].month,this.calendars[0].year,t)+this.render(this.calendars[l].year,this.calendars[l].month,t)+"";this.el.innerHTML=c,n.bound&&"hidden"!==n.field.type&&o(function(){n.trigger.focus()},1),"function"==typeof this._o.onDraw&&this._o.onDraw(this),n.bound&&n.field.setAttribute("aria-label","Use the arrow keys to pick a date")}},adjustPosition:function(){var e,t,n,o,a,r,s,c,l,u;if(!this._o.container){if(this.el.style.position="absolute",t=e=this._o.trigger,n=this.el.offsetWidth,o=this.el.offsetHeight,a=window.innerWidth||i.documentElement.clientWidth,r=window.innerHeight||i.documentElement.clientHeight,s=window.pageYOffset||i.body.scrollTop||i.documentElement.scrollTop,"function"==typeof e.getBoundingClientRect)c=(u=e.getBoundingClientRect()).left+window.pageXOffset,l=u.bottom+window.pageYOffset;else for(c=t.offsetLeft,l=t.offsetTop+t.offsetHeight;t=t.offsetParent;)c+=t.offsetLeft,l+=t.offsetTop;(this._o.reposition&&c+n>a||this._o.position.indexOf("right")>-1&&c-n+e.offsetWidth>0)&&(c=c-n+e.offsetWidth),(this._o.reposition&&l+o>r+s||this._o.position.indexOf("top")>-1&&l-o-e.offsetHeight>0)&&(l=l-o-e.offsetHeight),this.el.style.left=c+"px",this.el.style.top=l+"px"}},render:function(e,t,n){var i=this._o,o=new Date,a=d(e,t),r=new Date(e,t,1).getDay(),s=[],c=[];p(o),i.firstDay>0&&(r-=i.firstDay)<0&&(r+=7);for(var m=0===t?11:t-1,h=11===t?0:t+1,g=0===t?e-1:e,b=11===t?e+1:e,w=d(g,m),A=a+r,O=A;O>7;)O-=7;A+=7-O;for(var T,C,_,E,D=!1,N=0,j=0;N=a+r,L=N-r+1,M=t,F=e,U=i.startRange&&f(i.startRange,R),H=i.endRange&&f(i.endRange,R),G=i.startRange&&i.endRange&&i.startRangei.maxDate||i.disableWeekends&&u(R)||i.disableDayFn&&i.disableDayFn(R);k&&(N'+Math.ceil(((new Date(_,C,T)-E)/864e5+E.getDay()+1)/7)+"")),s.push(y(c,i.isRTL,i.pickWholeWeek,D)),c=[],j=0,D=!1)}return function(e,t,n){return''+function(e){var t,n=[];for(e.showWeekNumber&&n.push(""),t=0;t<7;t++)n.push('");return""+(e.isRTL?n.reverse():n).join("")+""}(e)+(""+t.join("")+"")+"
'+v(e,t,!0)+"
"}(i,s,n)},isVisible:function(){return this._v},show:function(){var e,t,n;this.isVisible()||(this._v=!0,this.draw(),e=this.el,t="is-hidden",e.className=(n=(" "+e.className+" ").replace(" "+t+" "," ")).trim?n.trim():n.replace(/^\s+|\s+$/g,""),this._o.bound&&(a(i,"click",this._onClick),this.adjustPosition()),"function"==typeof this._o.onOpen&&this._o.onOpen.call(this))},hide:function(){var e,t,n=this._v;!1!==n&&(this._o.bound&&r(i,"click",this._onClick),this.el.style.position="static",this.el.style.left="auto",this.el.style.top="auto",e=this.el,s(e,t="is-hidden")||(e.className=""===e.className?t:e.className+" "+t),this._v=!1,void 0!==n&&"function"==typeof this._o.onClose&&this._o.onClose.call(this))},destroy:function(){var e=this._o;this.hide(),r(this.el,"mousedown",this._onMouseDown,!0),r(this.el,"touchend",this._onMouseDown,!0),r(this.el,"change",this._onChange),e.keyboardInput&&r(i,"keydown",this._onKeyChange),e.field&&(r(e.field,"change",this._onInputChange),e.bound&&(r(e.trigger,"click",this._onInputClick),r(e.trigger,"focus",this._onInputFocus),r(e.trigger,"blur",this._onInputBlur))),this.el.parentNode&&this.el.parentNode.removeChild(this.el)}},A}(o)}()}, +/*!*******************************!*\ + !*** ./dev/View/Popup/Ask.js ***! + \*******************************/ +/*! exports provided: AskPopupView, default */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./dev/App/User.js (referenced with cjs require), ./dev/View/Popup/Compose.js (referenced with cjs require), ./dev/View/Popup/Plugin.js (referenced with cjs require) */, +/*!*******************************!*\ + !*** ./dev/View/Popup/Ask.js ***! + \*******************************/ +/*! exports provided: AskPopupView, default */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./dev/App/User.js (referenced with cjs require), ./dev/View/Popup/Compose.js (referenced with cjs require), ./dev/View/Popup/Plugin.js (referenced with cjs require) */function(e,t,n){"use strict";n.r(t),n.d(t,"AskPopupView",function(){return v}),n.d(t,"default",function(){return v});var i,o=n(/*! babel-runtime/helpers/classCallCheck */8),a=n.n(o),r=n(/*! babel-runtime/helpers/possibleConstructorReturn */12),s=n.n(r),c=n(/*! babel-runtime/helpers/inherits */11),l=n.n(c),u=n(/*! ko */1),d=n(/*! key */19),p=n.n(d),f=n(/*! Common/Enums */0),m=n(/*! Common/Utils */2),h=n(/*! Common/Translator */10),g=n(/*! Knoin/Knoin */9),b=n(/*! Knoin/AbstractViewNext */24),v=Object(g.popup)({name:"View/Popup/Ask",templateID:"PopupsAsk"})(i=function(e){function t(){a()(this,t);var n=s()(this,e.call(this));return n.askDesc=u.a.observable(""),n.yesButton=u.a.observable(""),n.noButton=u.a.observable(""),n.yesFocus=u.a.observable(!1),n.noFocus=u.a.observable(!1),n.fYesAction=null,n.fNoAction=null,n.bFocusYesOnShow=!0,n.bDisabeCloseOnEsc=!0,n.sDefaultKeyScope=f.KeyState.PopupAsk,n}return l()(t,e),t.prototype.clearPopup=function(){this.askDesc(""),this.yesButton(Object(h.i18n)("POPUPS_ASK/BUTTON_YES")),this.noButton(Object(h.i18n)("POPUPS_ASK/BUTTON_NO")),this.yesFocus(!1),this.noFocus(!1),this.fYesAction=null,this.fNoAction=null},t.prototype.yesClick=function(){this.cancelCommand(),Object(m.isFunc)(this.fYesAction)&&this.fYesAction.call(null)},t.prototype.noClick=function(){this.cancelCommand(),Object(m.isFunc)(this.fNoAction)&&this.fNoAction.call(null)},t.prototype.onShow=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",a=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];this.clearPopup(),this.fYesAction=t||null,this.fNoAction=n||null,this.askDesc(e||""),i&&this.yesButton(i),o&&this.noButton(o),this.bFocusYesOnShow=!!a},t.prototype.onShowWithDelay=function(){this.bFocusYesOnShow&&this.yesFocus(!0)},t.prototype.onBuild=function(){var e=this;p()("tab, shift+tab, right, left",f.KeyState.PopupAsk,function(){return e.yesFocus()?e.noFocus(!0):e.yesFocus(!0),!1}),p()("esc",f.KeyState.PopupAsk,function(){return e.noClick(),!1})},t}(b.a))||i}, +/*!*************************************!*\ + !*** ./dev/View/Popup/Languages.js ***! + \*************************************/ +/*! exports provided: LanguagesPopupView, default */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./dev/Settings/Admin/General.js (referenced with cjs require), ./dev/Settings/User/General.js (referenced with cjs require), ./dev/View/User/Login.js (referenced with cjs require) */, +/*!*************************************!*\ + !*** ./dev/View/Popup/Languages.js ***! + \*************************************/ +/*! exports provided: LanguagesPopupView, default */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./dev/Settings/Admin/General.js (referenced with cjs require), ./dev/Settings/User/General.js (referenced with cjs require), ./dev/View/User/Login.js (referenced with cjs require) */function(e,t,n){"use strict";n.r(t),n.d(t,"LanguagesPopupView",function(){return g}),n.d(t,"default",function(){return g});var i,o=n(/*! babel-runtime/helpers/classCallCheck */8),a=n.n(o),r=n(/*! babel-runtime/helpers/possibleConstructorReturn */12),s=n.n(r),c=n(/*! babel-runtime/helpers/inherits */11),l=n.n(c),u=n(/*! _ */4),d=n.n(u),p=n(/*! ko */1),f=n(/*! Common/Utils */2),m=n(/*! Knoin/Knoin */9),h=n(/*! Knoin/AbstractViewNext */24),g=Object(m.popup)({name:"View/Popup/Languages",templateID:"PopupsLanguages"})(i=function(e){function t(){a()(this,t);var n=s()(this,e.call(this));return n.fLang=null,n.userLanguage=p.a.observable(""),n.langs=p.a.observableArray([]),n.languages=p.a.computed(function(){var e=n.userLanguage();return d.a.map(n.langs(),function(t){return{key:t,user:t===e,selected:p.a.observable(!1),fullName:Object(f.convertLangName)(t)}})}),n.langs.subscribe(function(){n.setLanguageSelection()}),n}return l()(t,e),t.prototype.languageTooltipName=function(e){var t=Object(f.convertLangName)(e,!0);return Object(f.convertLangName)(e,!1)===t?"":t},t.prototype.setLanguageSelection=function(){var e=this.fLang?p.a.unwrap(this.fLang):"";d.a.each(this.languages(),function(t){t.selected(t.key===e)})},t.prototype.onBeforeShow=function(){this.fLang=null,this.userLanguage(""),this.langs([])},t.prototype.onShow=function(e,t,n){this.fLang=e,this.userLanguage(n||""),this.langs(t)},t.prototype.changeLanguage=function(e){this.fLang&&this.fLang(e),this.cancelCommand()},t}(h.a))||i}, +/*!**************************************************************!*\ + !*** ./node_modules/core-js/library/modules/_object-gopn.js ***! + \**************************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_object-keys-internal */104),o=n(/*! ./_enum-bug-keys */84).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return i(e,o)}}, +/*!**************************************************************!*\ + !*** ./node_modules/core-js/library/modules/_object-gops.js ***! + \**************************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){t.f=Object.getOwnPropertySymbols}, +/*!***********************************************************************!*\ + !*** ./node_modules/core-js/library/modules/_object-keys-internal.js ***! + \***********************************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_has */46),o=n(/*! ./_to-iobject */43),a=n(/*! ./_array-includes */163)(!1),r=n(/*! ./_shared-key */86)("IE_PROTO");e.exports=function(e,t){var n,s=o(e),c=0,l=[];for(n in s)n!=r&&i(s,n)&&l.push(n);for(;t.length>c;)i(s,n=t[c++])&&(~a(l,n)||l.push(n));return l}}, +/*!***********************************************************!*\ + !*** ./node_modules/core-js/library/modules/_redefine.js ***! + \***********************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){e.exports=n(/*! ./_hide */53)}, +/*!**************************************************************!*\ + !*** ./node_modules/core-js/library/modules/_iter-define.js ***! + \**************************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){"use strict";var i=n(/*! ./_library */90),o=n(/*! ./_export */58),a=n(/*! ./_redefine */105),r=n(/*! ./_hide */53),s=n(/*! ./_has */46),c=n(/*! ./_iterators */89),l=n(/*! ./_iter-create */165),u=n(/*! ./_set-to-string-tag */83),d=n(/*! ./_object-gpo */159),p=n(/*! ./_wks */60)("iterator"),f=!([].keys&&"next"in[].keys()),m=function(){return this};e.exports=function(e,t,n,h,g,b,v){l(n,t,h);var S,y,w,A=function(e){if(!f&&e in _)return _[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},O=t+" Iterator",T="values"==g,C=!1,_=e.prototype,E=_[p]||_["@@iterator"]||g&&_[g],D=E||A(g),N=g?T?A("entries"):D:void 0,j="Array"==t&&_.entries||E;if(j&&(w=d(j.call(new e)))!==Object.prototype&&w.next&&(u(w,O,!0),i||s(w,p)||r(w,p,m)),T&&E&&"values"!==E.name&&(C=!0,D=function(){return E.call(this)}),i&&!v||!f&&!C&&_[p]||r(_,p,D),c[t]=D,c[O]=m,g)if(S={values:T?D:A("values"),keys:b?D:A("keys"),entries:N},v)for(y in S)y in _||a(_,y,S[y]);else o(o.P+o.F*(f||C),t,S);return S}}, +/*!******************************************************!*\ + !*** ./node_modules/babel-runtime/helpers/typeof.js ***! + \******************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){"use strict";t.__esModule=!0;var i=r(n(/*! ../core-js/symbol/iterator */169)),o=r(n(/*! ../core-js/symbol */153)),a="function"==typeof o.default&&"symbol"==typeof i.default?function(e){return typeof e}:function(e){return e&&"function"==typeof o.default&&e.constructor===o.default&&e!==o.default.prototype?"symbol":typeof e};function r(e){return e&&e.__esModule?e:{default:e}}t.default="function"==typeof o.default&&"symbol"===a(i.default)?function(e){return void 0===e?"undefined":a(e)}:function(e){return e&&"function"==typeof o.default&&e.constructor===o.default&&e!==o.default.prototype?"symbol":void 0===e?"undefined":a(e)}}, +/*!*************************************************************!*\ + !*** ./node_modules/core-js/library/modules/_object-sap.js ***! + \*************************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_export */58),o=n(/*! ./_core */40),a=n(/*! ./_fails */51);e.exports=function(e,t){var n=(o.Object||{})[e]||Object[e],r={};r[e]=t(n),i(i.S+i.F*a(function(){n(1)}),"Object",r)}}, +/*!**********************************************************!*\ + !*** ./node_modules/core-js/library/modules/_iobject.js ***! + \**********************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_cof */92);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==i(e)?e.split(""):Object(e)}}, +/*!****************************************************************************************!*\ + !*** ./node_modules/core-js/library/modules/es6.object.get-own-property-descriptor.js ***! + \****************************************************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_to-iobject */43),o=n(/*! ./_object-gopd */72).f;n(/*! ./_object-sap */108)("getOwnPropertyDescriptor",function(){return function(e,t){return o(i(e),t)}})}, +/*!*******************************************************************************!*\ + !*** ./node_modules/core-js/library/fn/object/get-own-property-descriptor.js ***! + \*******************************************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){n(/*! ../../modules/es6.object.get-own-property-descriptor */110);var i=n(/*! ../../modules/_core */40).Object;e.exports=function(e,t){return i.getOwnPropertyDescriptor(e,t)}}, +/*!*************************************************************!*\ + !*** ./node_modules/core-js/library/modules/_a-function.js ***! + \*************************************************************/ +/*! no static exports found */ +/*! all exports used */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}}, +/*!*****************************************!*\ + !*** ./dev/App/Abstract.js + 2 modules ***! + \*****************************************/ +/*! exports provided: AbstractApp, default */ +/*! exports used: AbstractApp */ +/*! ModuleConcatenation bailout: Cannot concat with ./dev/Common/Enums.js because of ./dev/app.js */ +/*! ModuleConcatenation bailout: Cannot concat with ./dev/Common/Events.js because of ./dev/App/User.js */ +/*! ModuleConcatenation bailout: Cannot concat with ./dev/Common/Globals.js (<- Module is referenced from these modules with unsupported syntax: ./dev/External/ko.js (referenced with cjs require)) */ +/*! ModuleConcatenation bailout: Cannot concat with ./dev/Common/Links.js because of ./dev/App/Admin.js */ +/*! ModuleConcatenation bailout: Cannot concat with ./dev/Common/Translator.js (<- Module is referenced from these modules with unsupported syntax: ./dev/Common/Utils.js (referenced with cjs require), ./dev/External/ko.js (referenced with cjs require)) */ +/*! ModuleConcatenation bailout: Cannot concat with ./dev/Common/Utils.js (<- Module is referenced from these modules with unsupported syntax: ./dev/External/ko.js (referenced with cjs require)) */ +/*! ModuleConcatenation bailout: Cannot concat with ./dev/External/ko.js because of ./dev/App/Admin.js */ +/*! ModuleConcatenation bailout: Cannot concat with ./dev/Knoin/Knoin.js (<- Module is referenced from these modules with unsupported syntax: ./dev/Common/Plugins.js (referenced with cjs require), ./dev/Common/Utils.js (referenced with cjs require)) */ +/*! ModuleConcatenation bailout: Cannot concat with ./dev/Storage/Settings.js (<- Module is referenced from these modules with unsupported syntax: ./dev/External/ko.js (referenced with cjs require)) */ +/*! ModuleConcatenation bailout: Cannot concat with ./dev/Stores/Language.js because of ./dev/Settings/Admin/General.js */ +/*! ModuleConcatenation bailout: Cannot concat with ./dev/Stores/Social.js because of ./dev/App/User.js */ +/*! ModuleConcatenation bailout: Cannot concat with ./dev/Stores/Theme.js because of ./dev/Settings/Admin/General.js */ +/*! ModuleConcatenation bailout: Cannot concat with ./node_modules/babel-runtime/helpers/classCallCheck.js (<- Module is not an ECMAScript module) */ +/*! ModuleConcatenation bailout: Cannot concat with ./node_modules/babel-runtime/helpers/inherits.js (<- Module is not an ECMAScript module) */ +/*! ModuleConcatenation bailout: Cannot concat with ./node_modules/babel-runtime/helpers/possibleConstructorReturn.js (<- Module is not an ECMAScript module) */ +/*! ModuleConcatenation bailout: Cannot concat with external "window" (<- Module is not an ECMAScript module) */ +/*! ModuleConcatenation bailout: Cannot concat with external "window._" (<- Module is not an ECMAScript module) */ +/*! ModuleConcatenation bailout: Cannot concat with external "window.jQuery" (<- Module is not an ECMAScript module) */ +/*! ModuleConcatenation bailout: Cannot concat with external "window.key" (<- Module is not an ECMAScript module) */ +/*! ModuleConcatenation bailout: Cannot concat with external "window.ssm" (<- Module is not an ECMAScript module) */function(e,t,n){"use strict";var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(3),u=n.n(l),d=n(7),p=n.n(d),f=n(4),m=n.n(f),h=n(1),g=n(19),b=n.n(g),v=n(66),S=n.n(v),y=n(6),w=n(2),A=n(0),O=n(16),T=n(10),C=n(5),_=n(39),E=n(32),D=null,N=null;var j=function(){function e(t){o()(this,e),this.dom=null,this.opened=h.a.observable(!1),this.cmd=h.a.observable(""),this.focused=h.a.observable(!1),this.themes=_.a.themes,this.cmdHistory=[],this.cmdHistoryShift=0,this.cmdHelper=h.a.observable(""),this.cmds=["help","version","clear","theme","lang"],this.cmdsWithParameters=["theme","lang"],this.isAdmin=!1,this.dom=t,this.isAdmin=!!C.appSettingsGet("admin")}return e.prototype.runCmd=function(e,t,i){var o,a,r,s="",c=null;if(this.cmdHelper(""),i){switch(e){case"lang":c=(this.isAdmin?E.a.languagesAdmin():E.a.languages()).filter(function(e){return 0===e.lastIndexOf(t,0)});break;case"theme":c=_.a.themes().filter(function(e){return 0===e.lastIndexOf(t,0)})}if(e&&c)if(1===c.length&&c[0])this.cmd(e+" "+c[0]);else if(1").html(n(/*! Html/Cmds/Main.html */129).replace("{{ cmd }}",i))),c&&l.append(p()("
").html(c)),m.a.delay(function(){t.dom.find(".rl-cmd-history").scrollTop(l.height())},50))}return!0},e.prototype.onEsc=function(){return this.opened(!1),!1},e.prototype.onTab=function(){return this.onCmd(!0),!1},e.prototype.onEnter=function(){return this.onCmd(!1),this.cmd(""),!1},e.prototype.onKeyDown=function(e){if(e&&e.keyCode&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&0")).appendTo(y.$body),e=D,N||(N=new j(e),h.a.applyBindingAccessorsToNode(e[0],{translatorInit:!0,template:function(){return{name:"Cmd"}}},N)))}var I=n(22),x=n(25),P=n(9),k=function(){function e(){o()(this,e)}return e.prototype.bootstart=function(){},e}();n.d(t,"a",function(){return L});var L=function(e){function t(n){o()(this,t);var i=r()(this,e.call(this));return i.googlePreviewSupportedCache=null,i.isLocalAutocomplete=!0,i.iframe=null,i.lastErrorTime=0,i.iframe=p()('');else if(m){var s="";s=r&&r.youtube?"lg-has-youtube":r&&r.vimeo?"lg-has-vimeo":"lg-has-html5",l.$slide.eq(c).prepend('
')}else r?(l.$slide.eq(c).prepend('
'),l.$el.trigger("hasVideo.lg",[c,g,k])):l.$slide.eq(c).prepend('
');if(l.$el.trigger("onAferAppendSlide.lg",[c]),f=l.$slide.eq(c).find(".lg-object"),j&&f.attr("sizes",j),i){f.attr("srcset",i);try{picturefill({elements:[f[0]]})}catch(t){console.error("Make sure you have included Picturefill version 2")}}".lg-sub-html"!==this.s.appendSubHtmlTo&&l.addHtml(c),l.$slide.eq(c).addClass("lg-loaded")}l.$slide.eq(c).find(".lg-object").on("load.lg error.lg",function(){var b=0;e&&!a("body").hasClass("lg-from-hash")&&(b=e),setTimeout(function(){l.$slide.eq(c).addClass("lg-complete"),l.$el.trigger("onSlideItemLoad.lg",[c,e||0])},b)}),r&&r.html5&&!m&&l.$slide.eq(c).addClass("lg-complete"),d===!0&&(l.$slide.eq(c).hasClass("lg-complete")?l.preload(c):l.$slide.eq(c).find(".lg-object").on("load.lg error.lg",function(){l.preload(c)}))},e.prototype.slide=function(b,c,d){var e=this.$outer.find(".lg-current").index(),f=this;if(!f.lGalleryOn||e!==b){var g=this.$slide.length,h=f.lGalleryOn?this.s.speed:0,i=!1,j=!1;if(!f.lgBusy){if(this.s.download){var k;k=f.s.dynamic?f.s.dynamicEl[b].downloadUrl!==!1&&(f.s.dynamicEl[b].downloadUrl||f.s.dynamicEl[b].src):"false"!==f.$items.eq(b).attr("data-download-url")&&(f.$items.eq(b).attr("data-download-url")||f.$items.eq(b).attr("href")||f.$items.eq(b).attr("data-src")),k?(a("#lg-download").attr("href",k),f.$outer.removeClass("lg-hide-download")):f.$outer.addClass("lg-hide-download")}if(this.$el.trigger("onBeforeSlide.lg",[e,b,c,d]),f.lgBusy=!0,clearTimeout(f.hideBartimeout),".lg-sub-html"===this.s.appendSubHtmlTo&&setTimeout(function(){f.addHtml(b)},h),this.arrowDisable(b),c){var l=b-1,m=b+1;0===b&&e===g-1?(m=0,l=g-1):b===g-1&&0===e&&(m=0,l=g-1),this.$slide.removeClass("lg-prev-slide lg-current lg-next-slide"),f.$slide.eq(l).addClass("lg-prev-slide"),f.$slide.eq(m).addClass("lg-next-slide"),f.$slide.eq(b).addClass("lg-current")}else f.$outer.addClass("lg-no-trans"),this.$slide.removeClass("lg-prev-slide lg-next-slide"),e>b?(j=!0,0!==b||e!==g-1||d||(j=!1,i=!0)):b>e&&(i=!0,b!==g-1||0!==e||d||(j=!0,i=!1)),j?(this.$slide.eq(b).addClass("lg-prev-slide"),this.$slide.eq(e).addClass("lg-next-slide")):i&&(this.$slide.eq(b).addClass("lg-next-slide"),this.$slide.eq(e).addClass("lg-prev-slide")),setTimeout(function(){f.$slide.removeClass("lg-current"),f.$slide.eq(b).addClass("lg-current"),f.$outer.removeClass("lg-no-trans")},50);f.lGalleryOn?(setTimeout(function(){f.loadContent(b,!0,0)},this.s.speed+50),setTimeout(function(){f.lgBusy=!1,f.$el.trigger("onAfterSlide.lg",[e,b,c,d])},this.s.speed)):(f.loadContent(b,!0,f.s.backdropDuration),f.lgBusy=!1,f.$el.trigger("onAfterSlide.lg",[e,b,c,d])),f.lGalleryOn=!0,this.s.counter&&a("#lg-counter-current").text(b+1)}}},e.prototype.goToNextSlide=function(a){var b=this;b.lgBusy||(b.index+10?(b.index--,b.$el.trigger("onBeforePrevSlide.lg",[b.index,a]),b.slide(b.index,a,!1)):b.s.loop?(b.index=b.$items.length-1,b.$el.trigger("onBeforePrevSlide.lg",[b.index,a]),b.slide(b.index,a,!1)):b.s.slideEndAnimatoin&&(b.$outer.addClass("lg-left-end"),setTimeout(function(){b.$outer.removeClass("lg-left-end")},400)))},e.prototype.keyPress=function(){var c=this;this.$items.length>1&&a(b).on("keyup.lg",function(a){c.$items.length>1&&(37===a.keyCode&&(a.preventDefault(),c.goToPrevSlide()),39===a.keyCode&&(a.preventDefault(),c.goToNextSlide()))}),a(b).on("keydown.lg",function(a){c.s.escKey===!0&&27===a.keyCode&&(a.preventDefault(),c.$outer.hasClass("lg-thumb-open")?c.$outer.removeClass("lg-thumb-open"):c.destroy())})},e.prototype.arrow=function(){var a=this;this.$outer.find(".lg-prev").on("click.lg",function(){a.goToPrevSlide()}),this.$outer.find(".lg-next").on("click.lg",function(){a.goToNextSlide()})},e.prototype.arrowDisable=function(a){!this.s.loop&&this.s.hideControlOnEnd&&(a+10?this.$outer.find(".lg-prev").removeAttr("disabled").removeClass("disabled"):this.$outer.find(".lg-prev").attr("disabled","disabled").addClass("disabled"))},e.prototype.setTranslate=function(a,b,c){this.s.useLeft?a.css("left",b):a.css({transform:"translate3d("+b+"px, "+c+"px, 0px)"})},e.prototype.touchMove=function(b,c){var d=c-b;Math.abs(d)>15&&(this.$outer.addClass("lg-dragging"),this.setTranslate(this.$slide.eq(this.index),d,0),this.setTranslate(a(".lg-prev-slide"),-this.$slide.eq(this.index).width()+d,0),this.setTranslate(a(".lg-next-slide"),this.$slide.eq(this.index).width()+d,0))},e.prototype.touchEnd=function(a){var b=this;"lg-slide"!==b.s.mode&&b.$outer.addClass("lg-slide"),this.$slide.not(".lg-current, .lg-prev-slide, .lg-next-slide").css("opacity","0"),setTimeout(function(){b.$outer.removeClass("lg-dragging"),0>a&&Math.abs(a)>b.s.swipeThreshold?b.goToNextSlide(!0):a>0&&Math.abs(a)>b.s.swipeThreshold?b.goToPrevSlide(!0):Math.abs(a)<5&&b.$el.trigger("onSlideClick.lg"),b.$slide.removeAttr("style")}),setTimeout(function(){b.$outer.hasClass("lg-dragging")||"lg-slide"===b.s.mode||b.$outer.removeClass("lg-slide")},b.s.speed+100)},e.prototype.enableSwipe=function(){var a=this,b=0,c=0,d=!1;a.s.enableSwipe&&a.isTouch&&a.doCss()&&(a.$slide.on("touchstart.lg",function(c){a.$outer.hasClass("lg-zoomed")||a.lgBusy||(c.preventDefault(),a.manageSwipeClass(),b=c.originalEvent.targetTouches[0].pageX)}),a.$slide.on("touchmove.lg",function(e){a.$outer.hasClass("lg-zoomed")||(e.preventDefault(),c=e.originalEvent.targetTouches[0].pageX,a.touchMove(b,c),d=!0)}),a.$slide.on("touchend.lg",function(){a.$outer.hasClass("lg-zoomed")||(d?(d=!1,a.touchEnd(c-b)):a.$el.trigger("onSlideClick.lg"))}))},e.prototype.enableDrag=function(){var c=this,d=0,e=0,f=!1,g=!1;c.s.enableDrag&&!c.isTouch&&c.doCss()&&(c.$slide.on("mousedown.lg",function(b){c.$outer.hasClass("lg-zoomed")||(a(b.target).hasClass("lg-object")||a(b.target).hasClass("lg-video-play"))&&(b.preventDefault(),c.lgBusy||(c.manageSwipeClass(),d=b.pageX,f=!0,c.$outer.scrollLeft+=1,c.$outer.scrollLeft-=1,c.$outer.removeClass("lg-grab").addClass("lg-grabbing"),c.$el.trigger("onDragstart.lg")))}),a(b).on("mousemove.lg",function(a){f&&(g=!0,e=a.pageX,c.touchMove(d,e),c.$el.trigger("onDragmove.lg"))}),a(b).on("mouseup.lg",function(b){g?(g=!1,c.touchEnd(e-d),c.$el.trigger("onDragend.lg")):(a(b.target).hasClass("lg-object")||a(b.target).hasClass("lg-video-play"))&&c.$el.trigger("onSlideClick.lg"),f&&(f=!1,c.$outer.removeClass("lg-grabbing").addClass("lg-grab"))}))},e.prototype.manageSwipeClass=function(){var a=this.index+1,b=this.index-1,c=this.$slide.length;this.s.loop&&(0===this.index?b=c-1:this.index===c-1&&(a=0)),this.$slide.removeClass("lg-next-slide lg-prev-slide"),b>-1&&this.$slide.eq(b).addClass("lg-prev-slide"),this.$slide.eq(a).addClass("lg-next-slide")},e.prototype.mousewheel=function(){var a=this;a.$outer.on("mousewheel.lg",function(b){b.deltaY&&(b.deltaY>0?a.goToPrevSlide():a.goToNextSlide(),b.preventDefault())})},e.prototype.closeGallery=function(){var b=this,c=!1;this.$outer.find(".lg-close").on("click.lg",function(){b.destroy()}),b.s.closable&&(b.$outer.on("mousedown.lg",function(b){c=!!(a(b.target).is(".lg-outer")||a(b.target).is(".lg-item ")||a(b.target).is(".lg-img-wrap"))}),b.$outer.on("mouseup.lg",function(d){(a(d.target).is(".lg-outer")||a(d.target).is(".lg-item ")||a(d.target).is(".lg-img-wrap")&&c)&&(b.$outer.hasClass("lg-dragging")||b.destroy())}))},e.prototype.destroy=function(c){var d=this;c||d.$el.trigger("onBeforeClose.lg"),a(b).scrollTop(d.prevScrollTop),c&&(d.s.dynamic||this.$items.off("click.lg click.lgcustom"),a.removeData(d.el,"lightGallery")),this.$el.off(".lg.tm"),a.each(a.fn.lightGallery.modules,function(a){d.modules[a]&&d.modules[a].destroy()}),this.lGalleryOn=!1,clearTimeout(d.hideBartimeout),this.hideBartimeout=!1,a(b).off(".lg"),a("body").removeClass("lg-on lg-from-hash"),d.$outer&&d.$outer.removeClass("lg-visible"),a(".lg-backdrop").removeClass("in"),setTimeout(function(){d.$outer&&d.$outer.remove(),a(".lg-backdrop").remove(),c||d.$el.trigger("onCloseAfter.lg")},d.s.backdropDuration+50)},a.fn.lightGallery=function(b){return this.each(function(){if(a.data(this,"lightGallery"))try{a(this).data("lightGallery").init()}catch(c){console.error("lightGallery has not initiated properly")}else a.data(this,"lightGallery",new e(this,b))})},a.fn.lightGallery.modules={}}(jQuery,window,document); +/*! lightgallery - v1.2.21 - 2016-06-28 +* http://sachinchoolur.github.io/lightGallery/ +* Copyright (c) 2016 Sachin N; Licensed Apache 2.0 */ +!function(a,b,c,d){"use strict";var e={fullScreen:!0},f=function(b){return this.core=a(b).data("lightGallery"),this.$el=a(b),this.core.s=a.extend({},e,this.core.s),this.init(),this};f.prototype.init=function(){var a="";if(this.core.s.fullScreen){if(!(c.fullscreenEnabled||c.webkitFullscreenEnabled||c.mozFullScreenEnabled||c.msFullscreenEnabled))return;a='',this.core.$outer.find(".lg-toolbar").append(a),this.fullScreen()}},f.prototype.requestFullscreen=function(){var a=c.documentElement;a.requestFullscreen?a.requestFullscreen():a.msRequestFullscreen?a.msRequestFullscreen():a.mozRequestFullScreen?a.mozRequestFullScreen():a.webkitRequestFullscreen&&a.webkitRequestFullscreen()},f.prototype.exitFullscreen=function(){c.exitFullscreen?c.exitFullscreen():c.msExitFullscreen?c.msExitFullscreen():c.mozCancelFullScreen?c.mozCancelFullScreen():c.webkitExitFullscreen&&c.webkitExitFullscreen()},f.prototype.fullScreen=function(){var b=this;a(c).on("fullscreenchange.lg webkitfullscreenchange.lg mozfullscreenchange.lg MSFullscreenChange.lg",function(){b.core.$outer.toggleClass("lg-fullscreen-on")}),this.core.$outer.find(".lg-fullscreen").on("click.lg",function(){c.fullscreenElement||c.mozFullScreenElement||c.webkitFullscreenElement||c.msFullscreenElement?b.exitFullscreen():b.requestFullscreen()})},f.prototype.destroy=function(){this.exitFullscreen(),a(c).off("fullscreenchange.lg webkitfullscreenchange.lg mozfullscreenchange.lg MSFullscreenChange.lg")},a.fn.lightGallery.modules.fullscreen=f}(jQuery,window,document); +/*! lightgallery - v1.2.21 - 2016-06-28 +* http://sachinchoolur.github.io/lightGallery/ +* Copyright (c) 2016 Sachin N; Licensed Apache 2.0 */ +!function(a,b,c,d){"use strict";var e={thumbnail:!0,animateThumb:!0,currentPagerPosition:"middle",thumbWidth:100,thumbContHeight:100,thumbMargin:5,exThumbImage:!1,showThumbByDefault:!0,toogleThumb:!0,pullCaptionUp:!0,enableThumbDrag:!0,enableThumbSwipe:!0,swipeThreshold:50,loadYoutubeThumbnail:!0,youtubeThumbSize:1,loadVimeoThumbnail:!0,vimeoThumbSize:"thumbnail_small",loadDailymotionThumbnail:!0},f=function(b){return this.core=a(b).data("lightGallery"),this.core.s=a.extend({},e,this.core.s),this.$el=a(b),this.$thumbOuter=null,this.thumbOuterWidth=0,this.thumbTotalWidth=this.core.$items.length*(this.core.s.thumbWidth+this.core.s.thumbMargin),this.thumbIndex=this.core.index,this.left=0,this.init(),this};f.prototype.init=function(){var a=this;this.core.s.thumbnail&&this.core.$items.length>1&&(this.core.s.showThumbByDefault&&setTimeout(function(){a.core.$outer.addClass("lg-thumb-open")},700),this.core.s.pullCaptionUp&&this.core.$outer.addClass("lg-pull-caption-up"),this.build(),this.core.s.animateThumb?(this.core.s.enableThumbDrag&&!this.core.isTouch&&this.core.doCss()&&this.enableThumbDrag(),this.core.s.enableThumbSwipe&&this.core.isTouch&&this.core.doCss()&&this.enableThumbSwipe(),this.thumbClickable=!1):this.thumbClickable=!0,this.toogle(),this.thumbkeyPress())},f.prototype.build=function(){function c(a,b,c){var d,h=e.core.isVideo(a,c)||{},i="";h.youtube||h.vimeo||h.dailymotion?h.youtube?d=e.core.s.loadYoutubeThumbnail?"//img.youtube.com/vi/"+h.youtube[1]+"/"+e.core.s.youtubeThumbSize+".jpg":b:h.vimeo?e.core.s.loadVimeoThumbnail?(d="//i.vimeocdn.com/video/error_"+g+".jpg",i=h.vimeo[1]):d=b:h.dailymotion&&(d=e.core.s.loadDailymotionThumbnail?"//www.dailymotion.com/thumbnail/video/"+h.dailymotion[1]:b):d=b,f+='
',i=""}var d,e=this,f="",g="",h='
';switch(this.core.s.vimeoThumbSize){case"thumbnail_large":g="640";break;case"thumbnail_medium":g="200x150";break;case"thumbnail_small":g="100x75"}if(e.core.$outer.addClass("lg-has-thumb"),e.core.$outer.find(".lg").append(h),e.$thumbOuter=e.core.$outer.find(".lg-thumb-outer"),e.thumbOuterWidth=e.$thumbOuter.width(),e.core.s.animateThumb&&e.core.$outer.find(".lg-thumb").css({width:e.thumbTotalWidth+"px",position:"relative"}),this.core.s.animateThumb&&e.$thumbOuter.css("height",e.core.s.thumbContHeight+"px"),e.core.s.dynamic)for(var i=0;ithis.thumbTotalWidth-this.thumbOuterWidth&&(this.left=this.thumbTotalWidth-this.thumbOuterWidth),this.left<0&&(this.left=0),this.core.lGalleryOn?(b.hasClass("on")||this.core.$outer.find(".lg-thumb").css("transition-duration",this.core.s.speed+"ms"),this.core.doCss()||b.animate({left:-this.left+"px"},this.core.s.speed)):this.core.doCss()||b.css("left",-this.left+"px"),this.setTranslate(this.left)}},f.prototype.enableThumbDrag=function(){var c=this,d=0,e=0,f=!1,g=!1,h=0;c.$thumbOuter.addClass("lg-grab"),c.core.$outer.find(".lg-thumb").on("mousedown.lg.thumb",function(a){c.thumbTotalWidth>c.thumbOuterWidth&&(a.preventDefault(),d=a.pageX,f=!0,c.core.$outer.scrollLeft+=1,c.core.$outer.scrollLeft-=1,c.thumbClickable=!1,c.$thumbOuter.removeClass("lg-grab").addClass("lg-grabbing"))}),a(b).on("mousemove.lg.thumb",function(a){f&&(h=c.left,g=!0,e=a.pageX,c.$thumbOuter.addClass("lg-dragging"),h-=e-d,h>c.thumbTotalWidth-c.thumbOuterWidth&&(h=c.thumbTotalWidth-c.thumbOuterWidth),0>h&&(h=0),c.setTranslate(h))}),a(b).on("mouseup.lg.thumb",function(){g?(g=!1,c.$thumbOuter.removeClass("lg-dragging"),c.left=h,Math.abs(e-d)a.thumbOuterWidth&&(c.preventDefault(),b=c.originalEvent.targetTouches[0].pageX,a.thumbClickable=!1)}),a.core.$outer.find(".lg-thumb").on("touchmove.lg",function(f){a.thumbTotalWidth>a.thumbOuterWidth&&(f.preventDefault(),c=f.originalEvent.targetTouches[0].pageX,d=!0,a.$thumbOuter.addClass("lg-dragging"),e=a.left,e-=c-b,e>a.thumbTotalWidth-a.thumbOuterWidth&&(e=a.thumbTotalWidth-a.thumbOuterWidth),0>e&&(e=0),a.setTranslate(e))}),a.core.$outer.find(".lg-thumb").on("touchend.lg",function(){a.thumbTotalWidth>a.thumbOuterWidth&&d?(d=!1,a.$thumbOuter.removeClass("lg-dragging"),Math.abs(c-b)'),a.core.$outer.find(".lg-toogle-thumb").on("click.lg",function(){a.core.$outer.toggleClass("lg-thumb-open")}))},f.prototype.thumbkeyPress=function(){var c=this;a(b).on("keydown.lg.thumb",function(a){38===a.keyCode?(a.preventDefault(),c.core.$outer.addClass("lg-thumb-open")):40===a.keyCode&&(a.preventDefault(),c.core.$outer.removeClass("lg-thumb-open"))})},f.prototype.destroy=function(){this.core.s.thumbnail&&this.core.$items.length>1&&(a(b).off("resize.lg.thumb orientationchange.lg.thumb keydown.lg.thumb"),this.$thumbOuter.remove(),this.core.$outer.removeClass("lg-has-thumb"))},a.fn.lightGallery.modules.Thumbnail=f}(jQuery,window,document); +/*! lightgallery - v1.2.21 - 2016-06-28 +* http://sachinchoolur.github.io/lightGallery/ +* Copyright (c) 2016 Sachin N; Licensed Apache 2.0 */ +!function(a,b,c,d){"use strict";var e={scale:1,zoom:!0,actualSize:!0,enableZoomAfter:300},f=function(c){return this.core=a(c).data("lightGallery"),this.core.s=a.extend({},e,this.core.s),this.core.s.zoom&&this.core.doCss()&&(this.init(),this.zoomabletimeout=!1,this.pageX=a(b).width()/2,this.pageY=a(b).height()/2+a(b).scrollTop()),this};f.prototype.init=function(){var c=this,d='';c.core.s.actualSize&&(d+=''),this.core.$outer.find(".lg-toolbar").append(d),c.core.$el.on("onSlideItemLoad.lg.tm.zoom",function(b,d,e){var f=c.core.s.enableZoomAfter+e;a("body").hasClass("lg-from-hash")&&e?f=0:a("body").removeClass("lg-from-hash"),c.zoomabletimeout=setTimeout(function(){c.core.$slide.eq(d).addClass("lg-zoomable")},f+30)});var e=1,f=function(d){var e,f,g=c.core.$outer.find(".lg-current .lg-image"),h=(a(b).width()-g.width())/2,i=(a(b).height()-g.height())/2+a(b).scrollTop();e=c.pageX-h,f=c.pageY-i;var j=(d-1)*e,k=(d-1)*f;g.css("transform","scale3d("+d+", "+d+", 1)").attr("data-scale",d),g.parent().css({left:-j+"px",top:-k+"px"}).attr("data-x",j).attr("data-y",k)},g=function(){e>1?c.core.$outer.addClass("lg-zoomed"):c.resetZoom(),1>e&&(e=1),f(e)},h=function(d,f,h,i){var j,k=f.width();j=c.core.s.dynamic?c.core.s.dynamicEl[h].width||f[0].naturalWidth||k:c.core.$items.eq(h).attr("data-width")||f[0].naturalWidth||k;var l;c.core.$outer.hasClass("lg-zoomed")?e=1:j>k&&(l=j/k,e=l||2),i?(c.pageX=a(b).width()/2,c.pageY=a(b).height()/2+a(b).scrollTop()):(c.pageX=d.pageX||d.originalEvent.targetTouches[0].pageX,c.pageY=d.pageY||d.originalEvent.targetTouches[0].pageY),g(),setTimeout(function(){c.core.$outer.removeClass("lg-grabbing").addClass("lg-grab")},10)},i=!1;c.core.$el.on("onAferAppendSlide.lg.tm.zoom",function(a,b){var d=c.core.$slide.eq(b).find(".lg-image");d.on("dblclick",function(a){h(a,d,b)}),d.on("touchstart",function(a){i?(clearTimeout(i),i=null,h(a,d,b)):i=setTimeout(function(){i=null},300),a.preventDefault()})}),a(b).on("resize.lg.zoom scroll.lg.zoom orientationchange.lg.zoom",function(){c.pageX=a(b).width()/2,c.pageY=a(b).height()/2+a(b).scrollTop(),f(e)}),a("#lg-zoom-out").on("click.lg",function(){c.core.$outer.find(".lg-current .lg-image").length&&(e-=c.core.s.scale,g())}),a("#lg-zoom-in").on("click.lg",function(){c.core.$outer.find(".lg-current .lg-image").length&&(e+=c.core.s.scale,g())}),a("#lg-actual-size").on("click.lg",function(a){h(a,c.core.$slide.eq(c.core.index).find(".lg-image"),c.core.index,!0)}),c.core.$el.on("onBeforeSlide.lg.tm",function(){e=1,c.resetZoom()}),c.core.isTouch||c.zoomDrag(),c.core.isTouch&&c.zoomSwipe()},f.prototype.resetZoom=function(){this.core.$outer.removeClass("lg-zoomed"),this.core.$slide.find(".lg-img-wrap").removeAttr("style data-x data-y"),this.core.$slide.find(".lg-image").removeAttr("style data-scale"),this.pageX=a(b).width()/2,this.pageY=a(b).height()/2+a(b).scrollTop()},f.prototype.zoomSwipe=function(){var a=this,b={},c={},d=!1,e=!1,f=!1;a.core.$slide.on("touchstart.lg",function(c){if(a.core.$outer.hasClass("lg-zoomed")){var d=a.core.$slide.eq(a.core.index).find(".lg-object");f=d.outerHeight()*d.attr("data-scale")>a.core.$outer.find(".lg").height(),e=d.outerWidth()*d.attr("data-scale")>a.core.$outer.find(".lg").width(),(e||f)&&(c.preventDefault(),b={x:c.originalEvent.targetTouches[0].pageX,y:c.originalEvent.targetTouches[0].pageY})}}),a.core.$slide.on("touchmove.lg",function(g){if(a.core.$outer.hasClass("lg-zoomed")){var h,i,j=a.core.$slide.eq(a.core.index).find(".lg-img-wrap");g.preventDefault(),d=!0,c={x:g.originalEvent.targetTouches[0].pageX,y:g.originalEvent.targetTouches[0].pageY},a.core.$outer.addClass("lg-zoom-dragging"),i=f?-Math.abs(j.attr("data-y"))+(c.y-b.y):-Math.abs(j.attr("data-y")),h=e?-Math.abs(j.attr("data-x"))+(c.x-b.x):-Math.abs(j.attr("data-x")),(Math.abs(c.x-b.x)>15||Math.abs(c.y-b.y)>15)&&j.css({left:h+"px",top:i+"px"})}}),a.core.$slide.on("touchend.lg",function(){a.core.$outer.hasClass("lg-zoomed")&&d&&(d=!1,a.core.$outer.removeClass("lg-zoom-dragging"),a.touchendZoom(b,c,e,f))})},f.prototype.zoomDrag=function(){var c=this,d={},e={},f=!1,g=!1,h=!1,i=!1;c.core.$slide.on("mousedown.lg.zoom",function(b){var e=c.core.$slide.eq(c.core.index).find(".lg-object");i=e.outerHeight()*e.attr("data-scale")>c.core.$outer.find(".lg").height(),h=e.outerWidth()*e.attr("data-scale")>c.core.$outer.find(".lg").width(),c.core.$outer.hasClass("lg-zoomed")&&a(b.target).hasClass("lg-object")&&(h||i)&&(b.preventDefault(),d={x:b.pageX,y:b.pageY},f=!0,c.core.$outer.scrollLeft+=1,c.core.$outer.scrollLeft-=1,c.core.$outer.removeClass("lg-grab").addClass("lg-grabbing"))}),a(b).on("mousemove.lg.zoom",function(a){if(f){var b,j,k=c.core.$slide.eq(c.core.index).find(".lg-img-wrap");g=!0,e={x:a.pageX,y:a.pageY},c.core.$outer.addClass("lg-zoom-dragging"),j=i?-Math.abs(k.attr("data-y"))+(e.y-d.y):-Math.abs(k.attr("data-y")),b=h?-Math.abs(k.attr("data-x"))+(e.x-d.x):-Math.abs(k.attr("data-x")),k.css({left:b+"px",top:j+"px"})}}),a(b).on("mouseup.lg.zoom",function(a){f&&(f=!1,c.core.$outer.removeClass("lg-zoom-dragging"),!g||d.x===e.x&&d.y===e.y||(e={x:a.pageX,y:a.pageY},c.touchendZoom(d,e,h,i)),g=!1),c.core.$outer.removeClass("lg-grabbing").addClass("lg-grab")})},f.prototype.touchendZoom=function(a,b,c,d){var e=this,f=e.core.$slide.eq(e.core.index).find(".lg-img-wrap"),g=e.core.$slide.eq(e.core.index).find(".lg-object"),h=-Math.abs(f.attr("data-x"))+(b.x-a.x),i=-Math.abs(f.attr("data-y"))+(b.y-a.y),j=(e.core.$outer.find(".lg").height()-g.outerHeight())/2,k=Math.abs(g.outerHeight()*Math.abs(g.attr("data-scale"))-e.core.$outer.find(".lg").height()+j),l=(e.core.$outer.find(".lg").width()-g.outerWidth())/2,m=Math.abs(g.outerWidth()*Math.abs(g.attr("data-scale"))-e.core.$outer.find(".lg").width()+l);(Math.abs(b.x-a.x)>15||Math.abs(b.y-a.y)>15)&&(d&&(-k>=i?i=-k:i>=-j&&(i=-j)),c&&(-m>=h?h=-m:h>=-l&&(h=-l)),d?f.attr("data-y",Math.abs(i)):i=-Math.abs(f.attr("data-y")),c?f.attr("data-x",Math.abs(h)):h=-Math.abs(f.attr("data-x")),f.css({left:h+"px",top:i+"px"}))},f.prototype.destroy=function(){var c=this;c.core.$el.off(".lg.zoom"),a(b).off(".lg.zoom"),c.core.$slide.off(".lg.zoom"),c.core.$el.off(".lg.tm.zoom"),c.resetZoom(),clearTimeout(c.zoomabletimeout),c.zoomabletimeout=!1},a.fn.lightGallery.modules.zoom=f}(jQuery,window,document); +/*! lightgallery - v1.2.21 - 2016-06-28 +* http://sachinchoolur.github.io/lightGallery/ +* Copyright (c) 2016 Sachin N; Licensed Apache 2.0 */ +!function(a,b,c,d){"use strict";var e={autoplay:!1,pause:5e3,progressBar:!0,fourceAutoplay:!1,autoplayControls:!0,appendAutoplayControlsTo:".lg-toolbar"},f=function(b){return this.core=a(b).data("lightGallery"),this.$el=a(b),this.core.$items.length<2?!1:(this.core.s=a.extend({},e,this.core.s),this.interval=!1,this.fromAuto=!0,this.canceledOnTouch=!1,this.fourceAutoplayTemp=this.core.s.fourceAutoplay,this.core.doCss()||(this.core.s.progressBar=!1),this.init(),this)};f.prototype.init=function(){var a=this;a.core.s.autoplayControls&&a.controls(),a.core.s.progressBar&&a.core.$outer.find(".lg").append('
'),a.progress(),a.core.s.autoplay&&a.startlAuto(),a.$el.on("onDragstart.lg.tm touchstart.lg.tm",function(){a.interval&&(a.cancelAuto(),a.canceledOnTouch=!0)}),a.$el.on("onDragend.lg.tm touchend.lg.tm onSlideClick.lg.tm",function(){!a.interval&&a.canceledOnTouch&&(a.startlAuto(),a.canceledOnTouch=!1)})},f.prototype.progress=function(){var a,b,c=this;c.$el.on("onBeforeSlide.lg.tm",function(){c.core.s.progressBar&&c.fromAuto&&(a=c.core.$outer.find(".lg-progress-bar"),b=c.core.$outer.find(".lg-progress"),c.interval&&(b.removeAttr("style"),a.removeClass("lg-start"),setTimeout(function(){b.css("transition","width "+(c.core.s.speed+c.core.s.pause)+"ms ease 0s"),a.addClass("lg-start")},20))),c.fromAuto||c.core.s.fourceAutoplay||c.cancelAuto(),c.fromAuto=!1})},f.prototype.controls=function(){var b=this,c='';a(this.core.s.appendAutoplayControlsTo).append(c),b.core.$outer.find(".lg-autoplay-button").on("click.lg",function(){a(b.core.$outer).hasClass("lg-show-autoplay")?(b.cancelAuto(),b.core.s.fourceAutoplay=!1):b.interval||(b.startlAuto(),b.core.s.fourceAutoplay=b.fourceAutoplayTemp)})},f.prototype.startlAuto=function(){var a=this;a.core.$outer.find(".lg-progress").css("transition","width "+(a.core.s.speed+a.core.s.pause)+"ms ease 0s"),a.core.$outer.addClass("lg-show-autoplay"),a.core.$outer.find(".lg-progress-bar").addClass("lg-start"),a.interval=setInterval(function(){a.core.index+1g;g++)e=i[g],j.push(e(d||{}));return j}},g=function(a,b,d){var e,g,h,i,j;if(d){if(a[c]&&f[a[c]]&&f[a[c]][b])for(j=f[a[c]][b],g=h=0,i=j.length;i>h;g=++h)if(e=j[g],e===d)return f[a[c]][b].splice(g,1),e}else if(a[c]&&f[a[c]]&&f[a[c]][b])return delete f[a[c]][b]},{add:b,remove:g,fire:d}}(),a=function(){var a;return a=!1,function(b,c,d){return a||(a=b.addEventListener?function(a,b,c){return a.addEventListener(b,c,!1)}:b.attachEvent?function(a,b,c){return a.attachEvent("on"+b,c,!1)}:function(a,b,c){return a["on"+b]=c}),a(b,c,d)}}(),d=function(a,b){var d;return c.createEventObject?a.fireEvent("on"+b,d):(d=c.createEvent("HTMLEvents"),d.initEvent(b,!0,!0),!a.dispatchEvent(d))},h=function(){var a,b,d,e,f;for(e=void 0,f=3,d=c.createElement("div"),a=d.getElementsByTagName("i"),b=function(){return d.innerHTML="",a[0]};b(););return f>4?f:e}(),e=!1,n=void 0,"undefined"!=typeof c.hidden?(e="hidden",n="visibilitychange"):"undefined"!=typeof c.mozHidden?(e="mozHidden",n="mozvisibilitychange"):"undefined"!=typeof c.msHidden?(e="msHidden",n="msvisibilitychange"):"undefined"!=typeof c.webkitHidden&&(e="webkitHidden",n="webkitvisibilitychange"),m=function(){var b,d;return b=!1,d=function(){return clearTimeout(b),"active"!==l&&i.wakeup(),f=+new Date,b=setTimeout(function(){return"active"===l?i.idle():void 0},g)},d(),a(c,"mousemove",d),a(c,"keyup",d),a(c,"touchstart",d),a(window,"scroll",d),i.focus(d),i.wakeup(d)},j=function(){var b;return k?!0:(e===!1?(b="blur",9>h&&(b="focusout"),a(window,b,function(){return i.blur()}),a(window,"focus",function(){return i.focus()})):a(c,n,function(){return c[e]?i.blur():i.focus()},!1),k=!0,m())},i={setIdleDuration:function(a){return g=1e3*a},getIdleDuration:function(){return g},getIdleInfo:function(){var a,b;return a=+new Date,b={},"idle"===l?(b.isIdle=!0,b.idleFor=a-f,b.timeLeft=0,b.timeLeftPer=100):(b.isIdle=!1,b.idleFor=a-f,b.timeLeft=f+g-a,b.timeLeftPer=(100-100*b.timeLeft/g).toFixed(2)),b},focus:function(a){return"function"==typeof a?this.on("focus",a):(l="active",b.fire(this,"focus"),b.fire(this,"wakeup"),b.fire(this,"statusChanged",{status:l})),this},blur:function(a){return"function"==typeof a?this.on("blur",a):(l="hidden",b.fire(this,"blur"),b.fire(this,"idle"),b.fire(this,"statusChanged",{status:l})),this},idle:function(a){return"function"==typeof a?this.on("idle",a):(l="idle",b.fire(this,"idle"),b.fire(this,"statusChanged",{status:l})),this},wakeup:function(a){return"function"==typeof a?this.on("wakeup",a):(l="active",b.fire(this,"wakeup"),b.fire(this,"statusChanged",{status:l})),this},on:function(a,c){return j(),b.add(this,a,c),this},off:function(a,c){return j(),b.remove(this,a,c),this},onEvery:function(a,b){var c,d;return j(),c=!1,b&&(d=setInterval(function(){return"active"===l&&c===!1?b():void 0},1e3*a)),{stop:function(){return clearInterval(d)},pause:function(){return c=!0},resume:function(){return c=!1},code:d,callback:b}},now:function(a){return j(),l===(a||"active")}}})}).call(this); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/admin.min.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/admin.min.js new file mode 100755 index 00000000..28731497 --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/admin.min.js @@ -0,0 +1 @@ +!function(e){function t(i){if(n[i])return n[i].exports;var o=n[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,i){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:i})},t.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="rainloop/v/0.0.0/static/js/min/",t(t.s=191)}([function(e,t,n){"use strict";n.r(t),n.d(t,"FileType",function(){return i}),n.d(t,"StorageResultType",function(){return o}),n.d(t,"Focused",function(){return a}),n.d(t,"State",function(){return r}),n.d(t,"StateType",function(){return s}),n.d(t,"Capa",function(){return c}),n.d(t,"KeyState",function(){return l}),n.d(t,"FolderType",function(){return u}),n.d(t,"ServerFolderType",function(){return d}),n.d(t,"LoginSignMeTypeAsString",function(){return p}),n.d(t,"LoginSignMeType",function(){return f}),n.d(t,"ComposeType",function(){return m}),n.d(t,"UploadErrorCode",function(){return h}),n.d(t,"SetSystemFoldersNotification",function(){return g}),n.d(t,"ClientSideKeyName",function(){return b}),n.d(t,"EventKeyCode",function(){return v}),n.d(t,"MessageSetAction",function(){return S}),n.d(t,"MessageSelectAction",function(){return y}),n.d(t,"DesktopNotification",function(){return w}),n.d(t,"MessagePriority",function(){return A}),n.d(t,"EditorDefaultType",function(){return O}),n.d(t,"ServerSecure",function(){return T}),n.d(t,"SearchDateType",function(){return C}),n.d(t,"SaveSettingsStep",function(){return _}),n.d(t,"Layout",function(){return E}),n.d(t,"FilterConditionField",function(){return D}),n.d(t,"FilterConditionType",function(){return N}),n.d(t,"FiltersAction",function(){return j}),n.d(t,"FilterRulesType",function(){return R}),n.d(t,"SignedVerifyStatus",function(){return I}),n.d(t,"ContactPropertyType",function(){return x}),n.d(t,"Magics",function(){return P}),n.d(t,"Ports",function(){return k}),n.d(t,"Notification",function(){return L});var i={Unknown:"unknown",Text:"text",Html:"html",Code:"code",Eml:"eml",WordText:"word-text",Pdf:"pdf",Image:"image",Audio:"audio",Video:"video",Sheet:"sheet",Presentation:"presentation",Certificate:"certificate",CertificateBin:"certificate-bin",Archive:"archive"},o={Success:"success",Abort:"abort",Error:"error",Unload:"unload"},a={None:"none",MessageList:"message-list",MessageView:"message-view",FolderList:"folder-list"},r={Empty:10,Login:20,Auth:30},s={Webmail:0,Admin:1},c={TwoFactor:"TWO_FACTOR",TwoFactorForce:"TWO_FACTOR_FORCE",OpenPGP:"OPEN_PGP",Prefetch:"PREFETCH",Gravatar:"GRAVATAR",Folders:"FOLDERS",Composer:"COMPOSER",Contacts:"CONTACTS",Reload:"RELOAD",Search:"SEARCH",SearchAdv:"SEARCH_ADV",MessageActions:"MESSAGE_ACTIONS",MessageListActions:"MESSAGELIST_ACTIONS",AttachmentsActions:"ATTACHMENTS_ACTIONS",DangerousActions:"DANGEROUS_ACTIONS",Settings:"SETTINGS",Help:"HELP",Themes:"THEMES",UserBackground:"USER_BACKGROUND",Sieve:"SIEVE",Filters:"FILTERS",AttachmentThumbnails:"ATTACHMENT_THUMBNAILS",Templates:"TEMPLATES",AutoLogout:"AUTOLOGOUT",AdditionalAccounts:"ADDITIONAL_ACCOUNTS",Identities:"IDENTITIES"},l={All:"all",None:"none",ContactList:"contact-list",MessageList:"message-list",FolderList:"folder-list",MessageView:"message-view",Compose:"compose",Settings:"settings",Menu:"menu",PopupComposeOpenPGP:"compose-open-pgp",PopupMessageOpenPGP:"message-open-pgp",PopupViewOpenPGP:"view-open-pgp",PopupKeyboardShortcutsHelp:"popup-keyboard-shortcuts-help",PopupAsk:"popup-ask"},u={Inbox:10,SentItems:11,Draft:12,Trash:13,Spam:14,Archive:15,NotSpam:80,User:99},d={USER:0,INBOX:1,SENT:2,DRAFTS:3,JUNK:4,TRASH:5,IMPORTANT:10,FLAGGED:11,ALL:12},p={DefaultOff:"defaultoff",DefaultOn:"defaulton",Unused:"unused"},f={DefaultOff:0,DefaultOn:1,Unused:2},m={Empty:"empty",Reply:"reply",ReplyAll:"replyall",Forward:"forward",ForwardAsAttachment:"forward-as-attachment",Draft:"draft",EditAsNew:"editasnew"},h={Normal:0,FileIsTooBig:1,FilePartiallyUploaded:2,FileNoUploaded:3,MissingTempFolder:4,FileOnSaveingError:5,FileType:98,Unknown:99},g={None:0,Sent:1,Draft:2,Spam:3,Trash:4,Archive:5},b={FoldersLashHash:0,MessagesInboxLastHash:1,MailBoxListSize:2,ExpandedFolders:3,FolderListSize:4,MessageListSize:5,LastReplyAction:6,LastSignMe:7,ComposeLastIdentityID:8,MessageHeaderFullInfo:9,MessageAttachmnetControls:10},v={Backspace:8,Tab:9,Enter:13,Esc:27,PageUp:33,PageDown:34,Left:37,Right:39,Up:38,Down:40,End:35,Home:36,Space:32,Insert:45,Delete:46,A:65,S:83},S={SetSeen:0,UnsetSeen:1,SetFlag:2,UnsetFlag:3},y={All:0,None:1,Invert:2,Unseen:3,Seen:4,Flagged:5,Unflagged:6},w={Allowed:0,NotAllowed:1,Denied:2,NotSupported:9},A={Low:5,Normal:3,High:1},O={Html:"Html",Plain:"Plain",HtmlForced:"HtmlForced",PlainForced:"PlainForced"},T={None:0,SSL:1,TLS:2},C={All:-1,Days3:3,Days7:7,Month:30},_={Animate:-2,Idle:-1,TrueResult:1,FalseResult:0},E={NoPreview:0,SidePreview:1,BottomPreview:2},D={From:"From",Recipient:"Recipient",Subject:"Subject",Header:"Header",Size:"Size"},N={Contains:"Contains",NotContains:"NotContains",EqualTo:"EqualTo",NotEqualTo:"NotEqualTo",Regex:"Regex",Over:"Over",Under:"Under"},j={None:"None",MoveTo:"MoveTo",Discard:"Discard",Vacation:"Vacation",Reject:"Reject",Forward:"Forward"},R={All:"All",Any:"Any"},I={UnknownPublicKeys:-4,UnknownPrivateKey:-3,Unverified:-2,Error:-1,None:0,Success:1},x={Unknown:0,FullName:10,FirstName:15,LastName:16,MiddleName:16,Nick:18,NamePrefix:20,NameSuffix:21,Email:30,Phone:31,Web:32,Birthday:40,Facebook:90,Skype:91,GitHub:92,Note:110,Custom:250},P={EventWhichMouseMiddle:3,ifvisibleIdle10s:10,BitLength2048:2048,BitLength1024:1024,Size350px:350,Size50px:50,Size20px:20,Size1px:1,Time30mInMin:30,Time60m:36e5,Time30m:18e5,Time20m:12e5,Time15m:9e5,Time10m:6e5,Time5m:3e5,Time3m:18e4,Time2m:12e4,Time1m:6e4,Time30s:3e4,Time10s:1e4,Time7s:7e3,Time5s:5e3,Time3s:3e3,Time1s:1e3,Time500ms:500,Time350ms:350,Time250ms:250,Time200ms:200,Time100ms:100,Time50ms:50,Time20ms:20,Time10ms:10,Time1ms:1},k={Imap:143,ImapSsl:993,Smtp:25,SmtpSsl:465,SmtpStartTls:587},L={InvalidToken:101,AuthError:102,AccessError:103,ConnectionError:104,CaptchaError:105,SocialFacebookLoginAccessDisable:106,SocialTwitterLoginAccessDisable:107,SocialGoogleLoginAccessDisable:108,DomainNotAllowed:109,AccountNotAllowed:110,AccountTwoFactorAuthRequired:120,AccountTwoFactorAuthError:121,CouldNotSaveNewPassword:130,CurrentPasswordIncorrect:131,NewPasswordShort:132,NewPasswordWeak:133,NewPasswordForbidden:134,ContactsSyncError:140,CantGetMessageList:201,CantGetMessage:202,CantDeleteMessage:203,CantMoveMessage:204,CantCopyMessage:205,CantSaveMessage:301,CantSendMessage:302,InvalidRecipients:303,CantSaveFilters:351,CantGetFilters:352,FiltersAreNotCorrect:355,CantCreateFolder:400,CantRenameFolder:401,CantDeleteFolder:402,CantSubscribeFolder:403,CantUnsubscribeFolder:404,CantDeleteNonEmptyFolder:405,CantSaveSettings:501,CantSavePluginSettings:502,DomainAlreadyExists:601,CantInstallPackage:701,CantDeletePackage:702,InvalidPluginPackage:703,UnsupportedPluginPackage:704,LicensingServerIsUnavailable:710,LicensingExpired:711,LicensingBanned:712,DemoSendMessageError:750,DemoAccountError:751,AccountAlreadyExists:801,AccountDoesNotExist:802,MailServerError:901,ClientViewError:902,InvalidInputArgument:903,AjaxFalse:950,AjaxAbort:951,AjaxParse:952,AjaxTimeout:953,UnknownNotification:999,UnknownError:999}},function(e,t,n){"use strict";var i=n(3),o=n.n(i),a=n(4),r=n.n(a),s=n(7),c=n.n(s),l=o.a.Opentip||{};l.styles=l.styles||{},l.styles.rainloop={extends:"standard",fixed:!0,target:!0,delay:.2,hideDelay:0,hideEffect:"fade",hideEffectDuration:.2,showEffect:"fade",showEffectDuration:.2,showOn:"mouseover click",removeElementsOnHide:!0,background:"#fff",shadow:!1,borderColor:"#999",borderRadius:2,borderWidth:1},l.styles.rainloopTip={extends:"rainloop",delay:.4,group:"rainloopTips"},l.styles.rainloopErrorTip={extends:"rainloop",className:"rainloopErrorTip"};var u=n(97),d=n.n(u),p=n(0),f=o.a.ko,m=c()(o.a);f.bindingHandlers.updateWidth={init:function(e,t){var n=c()(e),i=t(),a=function(){i(n.width()),o.a.setTimeout(function(){i(n.width())},p.Magics.Time500ms)};m.on("resize",a),a(),f.utils.domNodeDisposal.addDisposeCallback(e,function(){m.off("resize",a)})}},f.bindingHandlers.editor={init:function(e,t){var i=null,o=t(),a=n(95).default,r=function(){o&&o.__editor&&o.__editor.setHtmlOrPlain(o())},s=function(){o&&o.__editor&&o(o.__editor.getDataWithHtmlMark())};f.isObservable(o)&&a&&(i=new a(e,s,function(){o.__editor=i,r()},s),o.__fetchEditorValue=s,o.subscribe(r))}},f.bindingHandlers.json={init:function(e,t){c()(e).text(o.a.JSON.stringify(f.unwrap(t())))},update:function(e,t){c()(e).text(o.a.JSON.stringify(f.unwrap(t())))}},f.bindingHandlers.scrollerShadows={init:function(e){var t=c()(e),n=t.find("[data-scroller-shadows-content]")[0]||null,i=r.a.throttle(function(){t.toggleClass("scroller-shadow-top",8=n.left&&e.pageX<=n.left+t.width()){if(e.pageY>=i-100&&e.pageY<=i){var a=function(){t.scrollTop(t.scrollTop()+3),r.windowResize()};t.data("timerScroll",o.a.setInterval(a,10)),a()}if(e.pageY>=n.top&&e.pageY<=n.top+100){var s=function(){t.scrollTop(t.scrollTop()-3),r.windowResize()};t.data("timerScroll",o.a.setInterval(s,10)),s()}}})},u.stop=function(){c()(l).each(function(){var e=c()(this);o.a.clearInterval(e.data("timerScroll")),e.data("timerScroll",!1)})}),u.helper=function(e){return t()(e&&e.target?f.dataFor(e.target):null)},c()(e).draggable(u).on("mousedown.koDraggable",function(){r.removeInFocus()}),f.utils.domNodeDisposal.addDisposeCallback(e,function(){c()(e).off("mousedown.koDraggable").draggable("destroy")})}}},f.bindingHandlers.droppable={init:function(e,t,i){if(!n(6).bMobileDevice){var o=t(),a=i(),r=a&&a.droppableOver?a.droppableOver:null,s=a&&a.droppableOut?a.droppableOut:null,l={tolerance:"pointer",hoverClass:"droppableHover",drop:null,over:null,out:null};o&&(l.drop=function(e,t){o(e,t)},r&&(l.over=function(e,t){r(e,t)}),s&&(l.out=function(e,t){s(e,t)}),c()(e).droppable(l),f.utils.domNodeDisposal.addDisposeCallback(e,function(){c()(e).droppable("destroy")}))}}},f.bindingHandlers.nano={init:function(e){var t=n(6),i=n(5);t.bDisableNanoScroll||i.appSettingsGet("useNativeScrollbars")||c()(e).addClass("nano").nanoScroller({iOSNativeScrolling:!1,preventPageScrolling:!0})}},f.bindingHandlers.saveTrigger={init:function(e){var t=c()(e);t.data("save-trigger-type",t.is("input[type=text],input[type=email],input[type=password],select,textarea")?"input":"custom"),"custom"===t.data("save-trigger-type")?t.append('  ').addClass("settings-saved-trigger"):t.addClass("settings-saved-trigger-input")},update:function(e,t){var n=f.unwrap(t()),i=c()(e);if("custom"===i.data("save-trigger-type"))switch(n.toString()){case"1":i.find(".animated,.error").hide().removeClass("visible").end().find(".success").show().addClass("visible");break;case"0":i.find(".animated,.success").hide().removeClass("visible").end().find(".error").show().addClass("visible");break;case"-2":i.find(".error,.success").hide().removeClass("visible").end().find(".animated").show().addClass("visible");break;default:i.find(".animated").hide().end().find(".error,.success").removeClass("visible")}else switch(n.toString()){case"1":i.addClass("success").removeClass("error");break;case"0":i.addClass("error").removeClass("success");break;case"-2":break;default:i.removeClass("error success")}}},f.bindingHandlers.emailsTags={init:function(e,t,i){var o=n(2),a=n(44).default,s=c()(e),l=t(),u=i().autoCompleteSource||null,d=[",",";","\n"];s.inputosaurus({parseOnBlur:!0,allowDragAndDrop:!0,focusCallback:function(e){l&&l.focused&&l.focused(!!e)},inputDelimiters:d,autoCompleteSource:u,splitHook:function(e){var t=o.trim(e);return t&&-1=o&&(o=t),o===e()&&""+o!=""+n&&e(o+1),e(o)}});return o(e()),o},f.extenders.limitedList=function(e,t){var i=n(2),o=f.computed({read:e,write:function(n){var o=f.unwrap(e),a=f.unwrap(t);i.isNonEmptyArray(a)?-11&&void 0!==arguments[1])||arguments[1];return!!o(e)&&(t?/^[0-9]*$/.test(e.toString()):/^[1-9]+[0-9]*$/.test(e.toString()))}function r(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=o(e)&&""!==e?ce.a.parseInt(e,10):t;return ce.a.isNaN(n)?t:n}function s(e){return o(e)?""+e:""}function c(e){return!!e}function l(e){return e?"1":"0"}function u(e){return Oe(e)&&00&&void 0!==arguments[0]?arguments[0]:32,t="0123456789abcdefghijklmnopqrstuvwxyz",n=t.length;e=r(e);for(var i="";i.length1&&void 0!==arguments[1]?arguments[1]:100,n="",i="",o=e,a=0,r=0;o.length>t;)a=(i=o.substring(0,t)).lastIndexOf(" "),-1!==(r=i.lastIndexOf("\n"))&&(a=r),-1===a&&(a=t),n+=i.substring(0,a)+"\n",o=o.substring(a+1);return n+o}function S(){try{if(ce.a.document.activeElement)return _e(ce.a.document.activeElement.__inFocusCache)&&(ce.a.document.activeElement.__inFocusCache=ue()(ce.a.document.activeElement).is("input,textarea,iframe,.cke_editable")),!!ce.a.document.activeElement.__inFocusCache}catch(e){}return!1}function y(e){if(ce.a.document&&ce.a.document.activeElement&&ce.a.document.activeElement.blur)try{var t=ue()(ce.a.document.activeElement);t&&t.is("input,textarea")?ce.a.document.activeElement.blur():e&&ce.a.document.activeElement.blur()}catch(e){}}function w(){try{if(ce.a&&ce.a.getSelection){var e=ce.a.getSelection();e&&e.removeAllRanges&&e.removeAllRanges()}else ce.a.document&&ce.a.document.selection&&ce.a.document.selection.empty&&ce.a.document.selection.empty()}catch(e){}}function A(e,t){e=we(e.toUpperCase()),t=we(t.replace(/[\s]+/g," "));var n=!1,i="RE"===e,o="FWD"===e,a=[],r=!o;return""!==t&&pe.a.each(t.split(":"),function(e){var t=we(e);n||!/^(RE|FWD)$/i.test(t)&&!/^(RE|FWD)[\[\(][\d]+[\]\)]$/i.test(t)?(a.push(e),n=!0):(i||(i=!!/^RE/i.test(t)),o||(o=!!/^FWD/i.test(t)))}),r?i=!1:o=!1,we((r?"Re: ":"Fwd: ")+(i?"Re: ":"")+(o?"Fwd: ":"")+we(a.join(":")))}function O(e,t){return ce.a.Math.round(e*ce.a.Math.pow(10,t))/ce.a.Math.pow(10,t)}function T(e){switch(e=r(e),!0){case 1073741824<=e:return O(e/1073741824,1)+"GB";case 1048576<=e:return O(e/1048576,1)+"MB";case 1024<=e:return O(e/1024,0)+"KB"}return e+"B"}function C(e){ce.a.console&&ce.a.console.log&&ce.a.console.log(e)}function _(e,t,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;e&&e[t]&&(i=r(i),n=Oe(n)?n:[],0>=i?e[t].apply(e,n):pe.a.delay(function(){e[t].apply(e,n)},i))}function E(e){if((e=e||ce.a.event)&&e.ctrlKey&&!e.shiftKey&&!e.altKey){var t=e.keyCode||e.which;if(t===be.EventKeyCode.S)return void e.preventDefault();if(t===be.EventKeyCode.A){var n=e.target||e.srcElement;if(n&&("true"==""+n.contentEditable||n.tagName&&n.tagName.match(/INPUT|TEXTAREA/i)))return;ce.a.getSelection?ce.a.getSelection().removeAllRanges():ce.a.document.selection&&ce.a.document.selection.clear&&ce.a.document.selection.clear(),e.preventDefault()}}}function D(e,t){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=null;return(i=t?function(){for(var n=arguments.length,o=Array(n),a=0;a1&&void 0!==arguments[1]&&arguments[1];return n(10).i18n("LANGS_NAMES"+(!0===t?"_EN":"")+"/LANG_"+e.toUpperCase().replace(/[^a-zA-Z0-9]+/g,"_"),null,e)}function x(){return ue()('
 
').appendTo("#rl-hidden")}function P(e,t){t&&!_e(t.disabled)&&e&&ue()(e).toggleClass("disabled",t.disabled).prop("disabled",t.disabled)}function k(e){e.find("blockquote.rl-bq-switcher").removeClass("rl-bq-switcher hidden-bq"),e.find(".rlBlockquoteSwitcher").off(".rlBlockquoteSwitcher").remove(),e.find("[data-html-editor-font-wrapper]").removeAttr("data-html-editor-font-wrapper")}function L(e,t,i,o){var a=e.title,r=e.subject,s=e.date,c=e.fromCreds,l=e.toCreds,u=e.toLabel,d=e.ccClass,p=e.ccCreds,f=e.ccLabel,m=ce.a.open(""),h=m.document,g=t.clone(),v=i?"html":"plain";k(g);var S=g?g.html():"";h.write(n(170).replace("{{title}}",b(a)).replace("{{subject}}",b(r)).replace("{{date}}",b(s)).replace("{{fromCreds}}",b(c)).replace("{{toCreds}}",b(l)).replace("{{toLabel}}",b(u)).replace("{{ccClass}}",b(d)).replace("{{ccCreds}}",b(p)).replace("{{ccLabel}}",b(f)).replace("{{bodyClass}}",v).replace("{{html}}",S)),h.close(),o&&ce.a.setTimeout(function(){return m.print()},100)}function M(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1e3;return i=r(i),function(o,a,r,s,c){t.call(n,a&&a.Result?be.SaveSettingsStep.TrueResult:be.SaveSettingsStep.FalseResult),e&&e.call(n,o,a,r,s,c),pe.a.delay(function(){t.call(n,be.SaveSettingsStep.Idle)},i)}}function F(e,t){return M(null,e,t,1e3)}function U(e,t,n,i){return function(o){if(e){switch(n){case"bool":case"boolean":o=o?"1":"0";break;case"int":case"integer":case"number":o=r(o);break;case"trim":o=we(o);break;default:o=s(o)}var a={};a[t]=o,e.saveAdminConfig?e.saveAdminConfig(i||null,a):e.saveSettings&&e.saveSettings(i||null,a)}}}function H(e){return he.a?he.a.link(e,{newWindow:!0,stripPrefix:!1,urls:!0,email:!0,mention:!1,phone:!1,hashtag:!1,replaceFn:function(e){return!(e&&"url"===e.getType()&&e.matchedText&&0!==e.matchedText.indexOf("http"))}}):e}function G(e){var t,n=0,i=0,o=0,a=0,r=0,s="";for(s=e.replace(/]*><\/p>/gi,"").replace(/]*>([\s\S\r\n\t]*)<\/pre>/gim,function(){for(var e=arguments.length,t=Array(e),n=0;n").replace(/[\r]/gm,""):""}).replace(/[\s]+/gm," ").replace(/((?:href|data)\s?=\s?)("[^"]+?"|'[^']+?')/gim,function(){for(var e=arguments.length,t=Array(e),n=0;n]*>/gim,"\n").replace(/<\/h[\d]>/gi,"\n").replace(/<\/p>/gi,"\n\n").replace(/]*>/gim,"\n").replace(/<\/ul>/gi,"\n").replace(/]*>/gim," * ").replace(/<\/li>/gi,"\n").replace(/<\/td>/gi,"\n").replace(/<\/tr>/gi,"\n").replace(/]*>/gim,"\n_______________________________\n\n").replace(/]*>([\s\S\r\n]*)<\/div>/gim,function e(){for(var t=arguments.length,n=Array(t),i=0;i]*>([\s\S\r\n]*)<\/div>/gim,e),o="\n"+we(o)+"\n"),o}return""}).replace(/]*>/gim,"\n__bq__start__\n").replace(/<\/blockquote>/gim,"\n__bq__end__\n").replace(/]*>([\s\S\r\n]*?)<\/a>/gim,function(){for(var e=arguments.length,t=Array(e),n=0;n/gi,"\n").replace(/ /gi," ").replace(/"/gi,'"').replace(/<[^>]*>/gm,""),s=v(s=(s=ge.$div.html(s).text()).replace(/\n[ \t]+/gm,"\n").replace(/[\n]{3,}/gm,"\n\n").replace(/>/gi,">").replace(/</gi,"<").replace(/&/gi,"&")),n=0,i=800;0 "+we(t).replace(/\n/gm,"\n> ")).replace(/(^|\n)([> ]+)/gm,function(){for(var e=arguments.length,t=Array(e),n=0;n1&&void 0!==arguments[1]&&arguments[1],n=!1,i=!0,o=!0,a=[],r="",s=0,c=(e=(e=e.toString().replace(/\r/g,"")).replace(/^>[> ]>+/gm,function(e){var t=e[0];return t?t.replace(/[ ]+/g,""):t})).split("\n");do{for(i=!1,a=[],s=0;s"===(r=c[s]).substr(0,1))&&!n?(i=!0,n=!0,a.push("~~~blockquote~~~"),a.push(r.substr(1))):!o&&n?""!==r?(n=!1,a.push("~~~/blockquote~~~"),a.push(r)):a.push(r):o&&n?a.push(r.substr(1)):a.push(r);n&&(n=!1,a.push("~~~/blockquote~~~")),c=a}while(i);return e=(e=c.join("\n")).replace(/&/g,"&").replace(/>/g,">").replace(/").replace(/[\s]*~~~\/blockquote~~~/g,"
").replace(/\n/g,"
"),t?H(e):e}function V(e,t,n,i,a,r,s,c,l,u){var d=null,p=!1,f=0,m=0,h=[];for(u=!_e(u)&&!!u,l=o(l)?l:00&&void 0!==arguments[0]&&arguments[0]?pe.a.delay(e,100):e()}function K(e){Me[e]||(Me[e]=ue()('script[type="application/json"][data-configuration="'+e+'"]'));try{return JSON.parse(Me[e].text())}catch(e){}return{}}function W(e,t){var n=t||e;n&&"function"==typeof n.dispose&&n.dispose()}function Y(e){e&&(Oe(e.disposables)&&pe.a.each(e.disposables,W),fe.a.utils.objectForEach(e,W))}function $(e){e&&(Oe(e)?pe.a.each(e,function(e){$(e)}):e&&e.onDestroy&&e.onDestroy())}function J(e,t){return!(!e||!e[0]||(e[0].styleSheet&&!_e(e[0].styleSheet.cssText)?e[0].styleSheet.cssText=t:e.text(t),0))}function X(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:je,n=ue()("#app-theme-link"),i=function(){Fe=ce.a.setTimeout(function(){return t(be.SaveSettingsStep.Idle)},1e3),Ue=null},o=ue()("#app-theme-style"),a=n.attr("href");a||(a=o.attr("data-href")),a&&("Json/"!==(a=(a=(a=a.toString().replace(/\/-\/[^\/]+\/\-\//,"/-/"+e+"/-/")).replace(/\/Css\/[^\/]+\/User\//,"/Css/0/User/")).replace(/\/Hash\/[^\/]+\//,"/Hash/-/")).substring(a.length-5,a.length)&&(a+="Json/"),ce.a.clearTimeout(Fe),t(be.SaveSettingsStep.Animate),Ue&&Ue.abort&&Ue.abort(),Ue=ue.a.ajax({url:a,dataType:"json"}).then(function(e){e&&Oe(e)&&2===e.length&&(!n||!n[0]||o&&o[0]||(o=ue()(''),n.after(o),n.remove()),o&&o[0]&&J(o,e[1])&&o.attr("data-href",a).attr("data-theme",e[0]),t(be.SaveSettingsStep.TrueResult))}).then(i,i))}function Q(e,t){return function(){var n=e(),i=t(),o=[],a=function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",a={current:e===n,name:""===i?e.toString():i.toString(),custom:""!==i,title:""===i?"":e.toString(),value:e.toString()};t?o.push(a):o.unshift(a)},r=0,s=0,c=2;if(1=n||i-2<=n)&&(c+=2),a(n),r=n,s=n);0=s)a(s,!0),c-=1;else if(0>=r)break;3===r?a(2,!1):3s&&a(Math.round((i+s)/2),!0,"..."),1s&&a(i,!0)}return o}}function Z(e){var t=(e=we(e).toLowerCase()).split(".").pop();return t===e?"":t}function ee(e){var t,n="application/octet-stream";return"winmail.dat"===(e=we(e).toLowerCase())?"application/ms-tnef":((t=Z(e))&&0this.height?[this.width-this.height,0]:[0,this.height-this.width],o.fillStyle="#fff",o.fillRect(0,0,t,t),o.drawImage(this,e[0]/2,e[1]/2,this.width-e[0],this.height-e[1],0,0,t,t),n(i.toDataURL("image/jpeg"))},i.src=e}function oe(e,t){if(e&&"mailto:"===e.toString().substr(0,7).toLowerCase()){if(!t)return!0;var i,o=[],a=null,r=null,c=(e=e.toString().substr(7)).replace(/\?.+$/,""),l=e.replace(/^[^\?]*\?/,""),u=n(44).default;return i=h(l),_e(i.to)?o=u.parseEmailLine(c):(o=u.parseEmailLine(p(c+","+i.to)),o=pe.a.values(o.reduce(function(e,t){return t&&(e[t.email]&&e[t.email].name||(e[t.email]=t)),e},{}))),_e(i.cc)||(a=u.parseEmailLine(p(i.cc))),_e(i.bcc)||(r=u.parseEmailLine(p(i.bcc))),n(9).showScreenPopup(t,[be.ComposeType.Empty,null,o,a,r,_e(i.subject)?null:s(p(i.subject)),_e(i.body)?null:B(s(p(i.body)))]),!0}return!1}function ae(e){ue()(function(){return e()})}function re(){He()}n.r(t);var se=n(3),ce=n.n(se),le=n(7),ue=n.n(le),de=n(4),pe=n.n(de),fe=n(1),me=n(96),he=n.n(me),ge=n(6),be=n(0),ve={eml:"message/rfc822",mime:"message/rfc822",txt:"text/plain",text:"text/plain",def:"text/plain",list:"text/plain",in:"text/plain",ini:"text/plain",log:"text/plain",sql:"text/plain",cfg:"text/plain",conf:"text/plain",asc:"text/plain",rtx:"text/richtext",vcard:"text/vcard",vcf:"text/vcard",htm:"text/html",html:"text/html",csv:"text/csv",ics:"text/calendar",ifb:"text/calendar",xml:"text/xml",json:"application/json",swf:"application/x-shockwave-flash",hlp:"application/winhlp",wgt:"application/widget",chm:"application/vnd.ms-htmlhelp",p10:"application/pkcs10",p7c:"application/pkcs7-mime",p7m:"application/pkcs7-mime",p7s:"application/pkcs7-signature",torrent:"application/x-bittorrent",js:"application/javascript",pl:"text/perl",css:"text/css",asp:"text/asp",php:"application/x-httpd-php",php3:"application/x-httpd-php",php4:"application/x-httpd-php",php5:"application/x-httpd-php",phtml:"application/x-httpd-php",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",jpe:"image/jpeg",jfif:"image/jpeg",gif:"image/gif",bmp:"image/bmp",cgm:"image/cgm",ief:"image/ief",ico:"image/x-icon",tif:"image/tiff",tiff:"image/tiff",svg:"image/svg+xml",svgz:"image/svg+xml",djv:"image/vnd.djvu",djvu:"image/vnd.djvu",webp:"image/webp",zip:"application/zip","7z":"application/x-7z-compressed",rar:"application/x-rar-compressed",exe:"application/x-msdownload",dll:"application/x-msdownload",scr:"application/x-msdownload",com:"application/x-msdownload",bat:"application/x-msdownload",msi:"application/x-msdownload",cab:"application/vnd.ms-cab-compressed",gz:"application/x-gzip",tgz:"application/x-gzip",bz:"application/x-bzip",bz2:"application/x-bzip2",deb:"application/x-debian-package",psf:"application/x-font-linux-psf",otf:"application/x-font-otf",pcf:"application/x-font-pcf",snf:"application/x-font-snf",ttf:"application/x-font-ttf",ttc:"application/x-font-ttf",mp3:"audio/mpeg",amr:"audio/amr",aac:"audio/x-aac",aif:"audio/x-aiff",aifc:"audio/x-aiff",aiff:"audio/x-aiff",wav:"audio/x-wav",wma:"audio/x-ms-wma",wax:"audio/x-ms-wax",midi:"audio/midi",mp4a:"audio/mp4",ogg:"audio/ogg",weba:"audio/webm",ra:"audio/x-pn-realaudio",ram:"audio/x-pn-realaudio",rmp:"audio/x-pn-realaudio-plugin",m3u:"audio/x-mpegurl",flv:"video/x-flv",qt:"video/quicktime",mov:"video/quicktime",wmv:"video/windows-media",avi:"video/x-msvideo",mpg:"video/mpeg",mpeg:"video/mpeg",mpe:"video/mpeg",m1v:"video/mpeg",m2v:"video/mpeg","3gp":"video/3gpp","3g2":"video/3gpp2",h261:"video/h261",h263:"video/h263",h264:"video/h264",jpgv:"video/jpgv",mp4:"video/mp4",mp4v:"video/mp4",mpg4:"video/mp4",ogv:"video/ogg",webm:"video/webm",m4v:"video/x-m4v",asf:"video/x-ms-asf",asx:"video/x-ms-asf",wm:"video/x-ms-wm",wmx:"video/x-ms-wmx",wvx:"video/x-ms-wvx",movie:"video/x-sgi-movie",pdf:"application/pdf",psd:"image/vnd.adobe.photoshop",ai:"application/postscript",eps:"application/postscript",ps:"application/postscript",doc:"application/msword",dot:"application/msword",rtf:"application/rtf",xls:"application/vnd.ms-excel",ppt:"application/vnd.ms-powerpoint",docx:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",dotx:"application/vnd.openxmlformats-officedocument.wordprocessingml.template",pptx:"application/vnd.openxmlformats-officedocument.presentationml.presentation",odt:"application/vnd.oasis.opendocument.text",ods:"application/vnd.oasis.opendocument.spreadsheet"},Se=n(59);n.d(t,"trim",function(){return we}),n.d(t,"inArray",function(){return Ae}),n.d(t,"isArray",function(){return Oe}),n.d(t,"isObject",function(){return Te}),n.d(t,"isFunc",function(){return Ce}),n.d(t,"isUnd",function(){return _e}),n.d(t,"isNull",function(){return Ee}),n.d(t,"has",function(){return De}),n.d(t,"bind",function(){return Ne}),n.d(t,"noop",function(){return je}),n.d(t,"noopTrue",function(){return Re}),n.d(t,"noopFalse",function(){return Ie}),n.d(t,"silentTryCatch",function(){return i}),n.d(t,"isNormal",function(){return o}),n.d(t,"isPosNumeric",function(){return a}),n.d(t,"pInt",function(){return r}),n.d(t,"pString",function(){return s}),n.d(t,"pBool",function(){return c}),n.d(t,"boolToAjax",function(){return l}),n.d(t,"isNonEmptyArray",function(){return u}),n.d(t,"encodeURIComponent",function(){return d}),n.d(t,"decodeURIComponent",function(){return p}),n.d(t,"decodeURI",function(){return f}),n.d(t,"encodeURI",function(){return m}),n.d(t,"simpleQueryParser",function(){return h}),n.d(t,"fakeMd5",function(){return g}),n.d(t,"encodeHtml",function(){return b}),n.d(t,"splitPlainText",function(){return v}),n.d(t,"timeOutAction",function(){return xe}),n.d(t,"timeOutActionSecond",function(){return Pe}),n.d(t,"inFocus",function(){return S}),n.d(t,"removeInFocus",function(){return y}),n.d(t,"removeSelection",function(){return w}),n.d(t,"replySubjectAdd",function(){return A}),n.d(t,"roundNumber",function(){return O}),n.d(t,"friendlySize",function(){return T}),n.d(t,"log",function(){return C}),n.d(t,"delegateRun",function(){return _}),n.d(t,"killCtrlACtrlS",function(){return E}),n.d(t,"createCommandLegacy",function(){return D}),n.d(t,"convertThemeName",function(){return ke}),n.d(t,"quoteName",function(){return N}),n.d(t,"microtime",function(){return j}),n.d(t,"timestamp",function(){return R}),n.d(t,"convertLangName",function(){return I}),n.d(t,"draggablePlace",function(){return x}),n.d(t,"defautOptionsAfterRender",function(){return P}),n.d(t,"clearBqSwitcher",function(){return k}),n.d(t,"previewMessage",function(){return L}),n.d(t,"settingsSaveHelperFunction",function(){return M}),n.d(t,"settingsSaveHelperSimpleFunction",function(){return F}),n.d(t,"settingsSaveHelperSubscribeFunction",function(){return U}),n.d(t,"findEmailAndLinks",function(){return H}),n.d(t,"htmlToPlain",function(){return G}),n.d(t,"plainToHtml",function(){return B}),n.d(t,"folderListOptionsBuilder",function(){return V}),n.d(t,"selectElement",function(){return q}),n.d(t,"detectDropdownVisibility",function(){return Le}),n.d(t,"triggerAutocompleteInputChange",function(){return z}),n.d(t,"getConfigurationFromScriptTag",function(){return K}),n.d(t,"disposeOne",function(){return W}),n.d(t,"disposeObject",function(){return Y}),n.d(t,"delegateRunOnDestroy",function(){return $}),n.d(t,"appendStyles",function(){return J}),n.d(t,"changeTheme",function(){return X}),n.d(t,"computedPagenatorHelper",function(){return Q}),n.d(t,"getFileExtension",function(){return Z}),n.d(t,"mimeContentType",function(){return ee}),n.d(t,"isTransparent",function(){return te}),n.d(t,"getRealHeight",function(){return ne}),n.d(t,"resizeAndCrop",function(){return ie}),n.d(t,"mailToHelper",function(){return oe}),n.d(t,"domReady",function(){return ae}),n.d(t,"windowResize",function(){return He}),n.d(t,"windowResizeCallback",function(){return re}),n.d(t,"jassl",function(){return Se.a});var ye,we=ue.a.trim,Ae=ue.a.inArray,Oe=pe.a.isArray,Te=pe.a.isObject,Ce=pe.a.isFunction,_e=pe.a.isUndefined,Ee=pe.a.isNull,De=pe.a.has,Ne=pe.a.bind,je=function(){},Re=function(){return!0},Ie=function(){return!1},xe=(ye={},function(e,t,n){ye[e]=_e(ye[e])?0:ye[e],ce.a.clearTimeout(ye[e]),ye[e]=ce.a.setTimeout(t,n)}),Pe=function(){var e={};return function(t,n,i){e[t]||(e[t]=ce.a.setTimeout(function(){n(),e[t]=0},i))}}(),ke=pe.a.memoize(function(e){return"@custom"===e.substr(-7)&&(e=we(e.substring(0,e.length-7))),we(e.replace(/[^a-zA-Z0-9]+/g," ").replace(/([A-Z])/g," $1").replace(/[\s]+/g," "))});ce.a.rainloop_Utils_htmlToPlain=G,ce.a.rainloop_Utils_plainToHtml=B;var Le=pe.a.debounce(function(){Object(ge.dropdownVisibility)(!!pe.a.find(ge.data.aBootstrapDropdowns,function(e){return e.hasClass("open")}))},50),Me={},Fe=0,Ue=null,He=pe.a.debounce(function(e){_e(e)||Ee(e)?ge.$win.resize():ce.a.setTimeout(function(){ge.$win.resize()},e)},50),Ge=ce.a.String.substr;"b"!=="ab".substr(-1)&&(Ge=function(e,t,n){return t=0>t?e.length+t:t,e.substr(t,n)},ce.a.String.substr=Ge)},function(e,t){e.exports=window},function(e,t){e.exports=window._},function(e,t,n){"use strict";function i(e){return Object(l.isUnd)(u[e])?null:u[e]}function o(e,t){u[e]=t}function a(e){return Object(l.isUnd)(d[e])?null:d[e]}function r(e){var t=i("Capa");return Object(l.isArray)(t)&&Object(l.isNormal)(e)&&-1"),v=c()("
");v.attr("area","hidden").css({position:"absolute",left:-5e3}).appendTo(g);var S=(new o.a.Date).getTime(),y=!0,w=d.a.observable(!1).extend({rateLimit:0}),A=d.a.observable(!0),O="navigator"in o.a&&"userAgent"in o.a.navigator&&o.a.navigator.userAgent.toLowerCase()||"",T=-11&&void 0!==arguments[1])||arguments[1];return Object(M.createCommandLegacy)(null,e,t)}function a(e,t,n,i){var o=arguments.length>4&&void 0!==arguments[4]&&arguments[4];e.__rlSettingsData={Label:n,Template:t,Route:i,IsDefault:!!o},L.VIEW_MODELS.settings.push(e)}function r(e){L.VIEW_MODELS["settings-removed"].push(e)}function s(e){L.VIEW_MODELS["settings-disabled"].push(e)}function c(){R.a.changed.active=!1}function l(){R.a.changed.active=!0}function u(e){return""===e||Object(M.isUnd)(H[e])?null:H[e]}function d(e){var t=null;return e&&(t=e,e.default&&(t=e.default)),t}function p(e){var t=d(e);t&&t.__vm&&t.__dom&&t.__vm.modalVisibility(!1)}function f(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;_.a.each(t.__names,function(i){Object(k.f)(e,[i,t.__vm,n])})}function m(e,t){if(e&&!e.__builded){var n=null,i=new e(t),a=e.__type||"",r=a?D()("#rl-content #rl-"+a.toLowerCase()):null;e.__builded=!0,e.__vm=i,i.onShowTrigger=N.a.observable(!1),i.onHideTrigger=N.a.observable(!1),i.viewModelName=e.__name,i.viewModelNames=e.__names,i.viewModelTemplateID=e.__templateID,i.viewModelPosition=e.__type,r&&1===r.length?((n=D()("
").addClass("rl-view-model").addClass("RL-"+i.viewModelTemplateID).hide()).appendTo(r),i.viewModelDom=n,e.__dom=n,G.Popup===a&&(i.cancelCommand=i.closeCommand=o(function(){p(e)}),i.modalVisibility.subscribe(function(t){t?(i.viewModelDom.show(),i.storeAndSetKeyScope(),L.popupVisibilityNames.push(i.viewModelName),i.viewModelDom.css("z-index",3e3+Object(L.popupVisibilityNames)().length+10),i.onShowTrigger&&i.onShowTrigger(!i.onShowTrigger()),Object(M.delegateRun)(i,"onShowWithDelay",[],500)):(Object(M.delegateRun)(i,"onHide"),Object(M.delegateRun)(i,"onHideWithDelay",[],500),i.onHideTrigger&&i.onHideTrigger(!i.onHideTrigger()),i.restoreKeyScope(),f("view-model-on-hide",e),L.popupVisibilityNames.remove(i.viewModelName),i.viewModelDom.css("z-index",2e3),_.a.delay(function(){return i.viewModelDom.hide()},300))})),f("view-model-pre-build",e,n),N.a.applyBindingAccessorsToNode(n[0],{translatorInit:!0,template:function(){return{name:i.viewModelTemplateID}}},i),Object(M.delegateRun)(i,"onBuild",[n]),i&&G.Popup===a&&i.registerPopupKeyDown(),f("view-model-post-build",e,n)):Object(M.log)("Cannot find view model position: "+a)}return e?e.__vm:null}function h(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=d(e);n&&(m(n),n.__vm&&n.__dom&&(Object(M.delegateRun)(n.__vm,"onBeforeShow",t||[]),n.__vm.modalVisibility(!0),Object(M.delegateRun)(n.__vm,"onShow",t||[]),f("view-model-on-show",n,t||[])))}function g(e){var t=d(e);t&&(m(t),t.__vm&&t.__dom&&Object(M.delegateRun)(t.__vm,"onWarmUp"))}function b(e){var t=d(e);return!(!t||!t.__vm)&&t.__vm.modalVisibility()}function v(e,t){var n=null,i=!1,o=null;""===Object(M.pString)(e)&&(e=U),""!==e&&((n=u(e))||(n=u(U))&&(t=e+"/"+t,e=U),n&&n.__started&&(i=F&&n===F,n.__builded||(n.__builded=!0,Object(M.isNonEmptyArray)(n.viewModels())&&_.a.each(n.viewModels(),function(e){m(e,n)}),Object(M.delegateRun)(n,"onBuild")),_.a.defer(function(){F&&!i&&(Object(M.delegateRun)(F,"onHide"),Object(M.delegateRun)(F,"onHideWithDelay",[],500),F.onHideTrigger&&F.onHideTrigger(!F.onHideTrigger()),Object(M.isNonEmptyArray)(F.viewModels())&&_.a.each(F.viewModels(),function(e){e.__vm&&e.__dom&&G.Popup!==e.__vm.viewModelPosition&&(e.__dom.hide(),e.__vm.viewModelVisibility(!1),Object(M.delegateRun)(e.__vm,"onHide"),Object(M.delegateRun)(e.__vm,"onHideWithDelay",[],500),e.__vm.onHideTrigger&&e.__vm.onHideTrigger(!e.__vm.onHideTrigger()))})),(F=n)&&!i&&(Object(M.delegateRun)(F,"onShow"),F.onShowTrigger&&F.onShowTrigger(!F.onShowTrigger()),Object(k.f)("screen-on-show",[F.screenName(),F]),Object(M.isNonEmptyArray)(F.viewModels())&&_.a.each(F.viewModels(),function(e){e.__vm&&e.__dom&&G.Popup!==e.__vm.viewModelPosition&&(Object(M.delegateRun)(e.__vm,"onBeforeShow"),e.__dom.show(),e.__vm.viewModelVisibility(!0),Object(M.delegateRun)(e.__vm,"onShow"),e.__vm.onShowTrigger&&e.__vm.onShowTrigger(!e.__vm.onShowTrigger()),Object(M.delegateRun)(e.__vm,"onShowWithDelay",[],200),f("view-model-on-show",e))})),(o=n&&n.__cross?n.__cross():null)&&o.parse(t)})))}function S(e){_.a.each(e,function(e){if(e){var t=new e,n=t?t.screenName():"";t&&""!==n&&(""===U&&(U=n),H[n]=t)}}),_.a.each(H,function(e){e&&!e.__started&&e.__start&&(e.__started=!0,e.__start(),Object(k.f)("screen-pre-start",[e.screenName(),e]),Object(M.delegateRun)(e,"onStart"),Object(k.f)("screen-post-start",[e.screenName(),e]))});var t=x.a.create();t.addRoute(/^([a-zA-Z0-9\-]*)\/?(.*)$/,v),R.a.initialized.add(t.parse,t),R.a.changed.add(t.parse,t),R.a.init(),_.a.delay(function(){return L.$html.removeClass("rl-started-trigger").addClass("rl-started")},100),_.a.delay(function(){return L.$html.addClass("rl-started-delay")},200)}function y(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];e="/"===(e="#"===e.substr(0,1)?e.substr(1):e).substr(0,1)?e.substr(1):e;var i=n?"replaceHash":"setHash";t?(R.a.changed.active=!1,R.a[i](e),R.a.changed.active=!0):(R.a.changed.active=!0,R.a[i](e),R.a.setHash(e))}function w(e){var t=e.name,n=e.type,i=e.templateID;return function(e){e&&(t&&(Object(M.isArray)(t)?e.__names=t:e.__names=[t],e.__name=e.__names[0]),n&&(e.__type=n),i&&(e.__templateID=i))}}function A(e){var t=e.name,n=e.templateID;return w({name:t,type:G.Popup,templateID:n})}function O(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return function(t,n,i){if(!n||!n.match(/Command$/))throw new Error('name "'+n+'" should end with Command suffix');var o=i.value||i.initializer(),a=Object(M.isFunc)(e)?e:function(){return!!e};return i.value=function(){if(a.call(this,this)){for(var e=arguments.length,t=Array(e),n=0;n1&&void 0!==arguments[1]&&arguments[1];m.a.defer(function(){g()("[data-i18n]",e).each(function(e,t){E(t)}),t&&y.bAnimationSupported&&g()(".i18n-animation[data-i18n]",e).letterfx({fx:"fall fade",backwards:!1,timing:50,fx_duration:"50ms",letter_end:"restore",element_end:"restore"})})}function a(){C.forEach(function(e){T[e[0]]=i(e[1])})}function r(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;e&&e(),t?_.subscribe(function(){e&&e(),t&&t()}):e&&_.subscribe(e)}function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return e=p.a.parseInt(e,10)||0,v.Notification.ClientViewError===e&&t?t:(n=n&&p.a.parseInt(n,10)||0,Object(S.isUnd)(T[e])?n&&Object(S.isUnd)(T[n])?T[n]:"":T[e])}function c(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:v.Notification.UnknownNotification;return e&&e.ErrorCode?s(Object(S.pInt)(e.ErrorCode),e.ErrorMessage||""):s(t)}function l(e){var t="";switch(p.a.parseInt(e,10)||0){case v.UploadErrorCode.FileIsTooBig:t=i("UPLOAD/ERROR_FILE_IS_TOO_BIG");break;case v.UploadErrorCode.FilePartiallyUploaded:t=i("UPLOAD/ERROR_FILE_PARTIALLY_UPLOADED");break;case v.UploadErrorCode.FileNoUploaded:t=i("UPLOAD/ERROR_NO_FILE_UPLOADED");break;case v.UploadErrorCode.MissingTempFolder:t=i("UPLOAD/ERROR_MISSING_TEMP_FOLDER");break;case v.UploadErrorCode.FileOnSaveingError:t=i("UPLOAD/ERROR_ON_SAVING_FILE");break;case v.UploadErrorCode.FileType:t=i("UPLOAD/ERROR_FILE_TYPE");break;default:t=i("UPLOAD/ERROR_UNKNOWN")}return t}function u(e,t){var n=Object(S.microtime)();return y.$html.addClass("rl-changing-language"),new p.a.Promise(function(i,o){g.a.ajax({url:Object(A.n)(t,e),dataType:"script",cache:!0}).then(function(){m.a.delay(function(){D();var e=-10&&void 0!==arguments[0]?arguments[0]:"";return W+Object(q.pString)(e)}function r(){return ee?K:Y+te}function s(){return K}function c(e,t,n){return n=Object(q.isUnd)(n)?ne:n,Y+"/Raw/"+$+"/"+n+"/"+e+"/"+$+"/"+t}function l(e,t){return c("Download",e,t)}function u(e,t){return c("View",e,t)}function d(e,t){return c("ViewThumbnail",e,t)}function p(e,t){return c("ViewAsPlain",e,t)}function f(e,t){return c("FramedView",e,t)}function m(e){return Y+"/"+e+"/"+$+"/"+ne+"/"}function h(){return m("Upload")}function g(){return m("UploadContacts")}function b(){return m("UploadBackground")}function v(){return m("Append")}function S(e){return m("Change")+Object(q.encodeURIComponent)(e)+"/"}function y(e){return m("Ajax")+e}function w(e){return Y+"/Raw/"+$+"/"+ne+"/ViewAsPlain/"+$+"/"+e}function A(e){return Y+"/Raw/"+$+"/"+ne+"/Download/"+$+"/"+e}function O(e){return Y+"/Raw/0/Avatar/"+Object(q.encodeURIComponent)(e)+"/"}function T(e){return Y+"/Raw/"+$+"/"+ne+"/UserBackground/"+$+"/"+e}function C(){return Y+"/Info"}function _(e,t){return Y+"/Lang/0/"+(t?"Admin":"App")+"/"+V.a.encodeURI(e)+"/"+J+"/"}function E(){return Y+"/Raw/"+$+"/"+ne+"/ContactsVcf/"}function D(){return Y+"/Raw/"+$+"/"+ne+"/ContactsCsv/"}function N(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Y+"SocialGoogle"+(""!==ne?"/"+$+"/"+ne+"/":"")+(e?"&xauth=1":"")}function j(){return Y+"SocialTwitter"+(""!==ne?"/"+$+"/"+ne+"/":"")}function R(){return Y+"SocialFacebook"+(""!==ne?"/"+$+"/"+ne+"/":"")}function I(e){return Z+e}function x(){return I("css/images/empty-contact.png")}function P(e){return I("sounds/"+e)}function k(){return I("css/images/icom-message-notification.png")}function L(){return I("js/min/openpgp.min.js")}function M(){return I("js/min/openpgp.worker.min.js")}function F(e){var t=Q;return"@custom"===e.substr(-7)&&(e=Object(q.trim)(e.substring(0,e.length-7)),t=X),t+"themes/"+V.a.encodeURI(e)+"/images/preview.png"}function U(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"INBOX";return W+"mailbox/"+e}function H(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return W+"settings"+(e?"/"+e:"")}function G(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";t=Object(q.isNormal)(t)?Object(q.pInt)(t):1,n=Object(q.pString)(n);var o=W+"mailbox/";if(""!==e){var a=Object(q.pInt)(i);o+=V.a.encodeURI(e)+(01&&void 0!==arguments[1])||arguments[1];this.defaultRequest(e,"AdminDomainList",{IncludeAliases:t?"1":"0"})},t.prototype.pluginList=function(e){this.defaultRequest(e,"AdminPluginList")},t.prototype.packagesList=function(e){this.defaultRequest(e,"AdminPackagesList")},t.prototype.coreData=function(e){this.defaultRequest(e,"AdminCoreData")},t.prototype.updateCoreData=function(e){this.defaultRequest(e,"AdminUpdateCoreData",{},9e4)},t.prototype.packageInstall=function(e,t){this.defaultRequest(e,"AdminPackageInstall",{Id:t.id,Type:t.type,File:t.file},6e4)},t.prototype.packageDelete=function(e,t){this.defaultRequest(e,"AdminPackageDelete",{Id:t.id})},t.prototype.domain=function(e,t){this.defaultRequest(e,"AdminDomainLoad",{Name:t})},t.prototype.plugin=function(e,t){this.defaultRequest(e,"AdminPluginLoad",{Name:t})},t.prototype.domainDelete=function(e,t){this.defaultRequest(e,"AdminDomainDelete",{Name:t})},t.prototype.domainDisable=function(e,t,n){return this.defaultRequest(e,"AdminDomainDisable",{Name:t,Disabled:n?"1":"0"})},t.prototype.pluginSettingsUpdate=function(e,t){return this.defaultRequest(e,"AdminPluginSettingsUpdate",t)},t.prototype.licensing=function(e,t){return this.defaultRequest(e,"AdminLicensing",{Force:t?"1":"0"})},t.prototype.licensingActivate=function(e,t,n){return this.defaultRequest(e,"AdminLicensingActivate",{Domain:t,Key:n})},t.prototype.pluginDisable=function(e,t,n){return this.defaultRequest(e,"AdminPluginDisable",{Name:t,Disabled:n?"1":"0"})},t.prototype.createDomainAlias=function(e,t,n){this.defaultRequest(e,"AdminDomainAliasSave",{Name:t,Alias:n})},t.prototype.createOrUpdateDomain=function(e,t,n,i,o,a,r,s,c,l,u,d,p,f,m,h,g,b,v){this.defaultRequest(e,"AdminDomainSave",{Create:t?"1":"0",Name:n,IncHost:i,IncPort:o,IncSecure:a,IncShortLogin:r?"1":"0",UseSieve:s?"1":"0",SieveAllowRaw:c?"1":"0",SieveHost:l,SievePort:u,SieveSecure:d,OutHost:p,OutPort:f,OutSecure:m,OutShortLogin:h?"1":"0",OutAuth:g?"1":"0",OutUsePhpMail:b?"1":"0",WhiteList:v})},t.prototype.testConnectionForDomain=function(e,t,n,i,o,a,r,s,c,l,u,d,p,f){this.defaultRequest(e,"AdminDomainTest",{Name:t,IncHost:n,IncPort:i,IncSecure:o,UseSieve:a?"1":"0",SieveHost:r,SievePort:s,SieveSecure:c,OutHost:l,OutPort:u,OutSecure:d,OutAuth:p?"1":"0",OutUsePhpMail:f?"1":"0"})},t.prototype.testContacts=function(e,t){this.defaultRequest(e,"AdminContactsTest",t)},t.prototype.saveNewAdminPassword=function(e,t){this.defaultRequest(e,"AdminPasswordUpdate",t)},t.prototype.adminPing=function(e){this.defaultRequest(e,"AdminPing")},t}(n(115).a);t.a=new l},function(e,t,n){"use strict";function i(e,t,n){Object(s.isObject)(e)?(n=t||null,t=null,r.a.each(e,function(e,t){i(t,e,n)})):(Object(s.isUnd)(l[e])&&(l[e]=[]),l[e].push([t,n]))}function o(e,t){c.f("rl-pub",[e,t]),Object(s.isUnd)(l[e])||r.a.each(l[e],function(e){e[0]&&e[0].apply(e[1]||null,t||[])})}n.d(t,"b",function(){return i}),n.d(t,"a",function(){return o});var a=n(4),r=n.n(a),s=n(2),c=n(29),l={}},function(e,t,n){"use strict";n.d(t,"i",function(){return i}),n.d(t,"j",function(){return o}),n.d(t,"c",function(){return a}),n.d(t,"g",function(){return r}),n.d(t,"m",function(){return s}),n.d(t,"n",function(){return c}),n.d(t,"l",function(){return l}),n.d(t,"d",function(){return u}),n.d(t,"r",function(){return d}),n.d(t,"b",function(){return p}),n.d(t,"h",function(){return f}),n.d(t,"p",function(){return m}),n.d(t,"o",function(){return h}),n.d(t,"k",function(){return g}),n.d(t,"a",function(){return b}),n.d(t,"q",function(){return v}),n.d(t,"f",function(){return S}),n.d(t,"e",function(){return y});var i=20,o=[10,20,30,50,100],a=50,r=3e4,s=3e5,c=3e5,l=2e5,u=2e5,d="__UNUSE__",p="rlcsc",f=143,m=25,h=4190,g=15,b=7,v=10,S="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAuCAYAAABXuSs3AAAHHklEQVRoQ7VZW08bVxCeXRuwIbTGXIwNtBBaqjwgVUiR8lDlbza9qe1DpVZ9aNQ/0KpPeaJK07SpcuEeCEmUAObm21bfrL9lONjexSYrWfbunj37zXdmvpkz9oIgCKTD0Wg0xPd94TDP83Q0zvWa50vzklSrdanVanqf4/D84GBGr+F+Op3S8fqoJxLOdnZgTvsO/nYhenHA+UC7CWF1uXwkb9++ldPTUwVerVbVqFQqpR8YPjQ0JCMjI5LNDijoRgP3PQVu5+5Eor2XGLg7IV4GkIdHJ/LmzRs5ODiIwNbrdR0O0GCcq4Xz4eFhmZyclP7+tDQaIik/BG5XKQn4SwG3zJTLZXn9+rUclI8UHD5YVoDDN8bSzXhONwL48fFxGR4eilzFZT1uFRIB5yT8BqCdnR3Z3d0VP9Un6XRawYJpggVrZBv38ME4XKtUKnLt2jUplUoy1PR/l3U7T6sVSAQcgMAkj8PDQ9ne3pajoyMRL7zeKsYZWHgWYDGmv78/mmdwcFA+mJlSgziHDWrERrsjEXDXegTi1tZW+DLxI2bxIrqFNYTXyDyCFweMAHCwb8e4RnTNuOsqe3t7sra21pTD0Kct666E8XlcZyzw9/RUUXK5nK5oUinUQI6TQ3cynO/v78vq6qrKXCNwlTiJJpyNGc3nZHp6uqV2dwrQWOCtZBDAV1ZWwsQk7f0wiQn5kffbAu/0/KWBYzIC1+XukfGx0RGZmppKlC2tIV0Bh4aDcZW7HhkfH8urLLZL7T2pihvlkMNnz56FiadHxicL41IsFpN41bkxsYxbRdFo9jwB8KdPn14J8KnSpBQKhQs63nPmbCVRcBUAR2Lq1VVmpksyMTFxAXjcEsQybiegESionjx5osCZOeNe1O4+EhCAX7bQSgQcxRHTMgAgcz5+/Dis/hL4uHU3/B4YGNASGHIKxuEql0k+l05AeIAF1vPnz5VxFFmdDlaJrMtZITJeSsXCOTlMunKxjLtMYOKNjQ158eJFuAuKkUOb5sEwgff19SkJUBVkThZUbnXZrtCKBQ6gbnWIkjZpyne3ejAWoGnA7Icz6irvBLgbOMicCM6TkxPx/LAkbXfgWcsazuE2kFRsKD5Z+CiqDumKncpZvieWcS6dDVD8xiYCNflpJdwcdwJOf9airLmVQ7DPzMxIYWLsXGXoVqLt5k0M3K3JUVPDZdbWNzsCp48TPFdvdnZWUz32nDha7bJ63kgAJPzSdRks9/Kf9xMJAQ1gq2NpaUmy2Yz4zar4nQC3xb99AQwCcGzLAAwuhG8YiWvcOKts+r4GOe5nMhm5efOm9lUA3E3vSZJRrKvE0fnPv//Jy5cvo5cTHIPQbSjhOoqq69evS19f6lxDKK4+sVhigZPtKJqbrQeqxd5+WR4+fKgqgT0k2XX3nhiPgETWXFhYkFzuPZ2yVq1GTSOXpE47/VjgNnD4m4GG7/LhsTx69EiwD4Vr2MwIIxgbAH18fKx1yfz8vEogNvGtWnCuhLZa9UTAreVWFsHy/b/+Vrbdl7E5REMQD2jDoUbByty+/ZnU64GkU2HzyJLhktU1cLv8nARgkYS2d3ajAgwG8qU2oLmDZ92CMaOjo7K4uCiZgbDWaRWgnZhPxLhrMUCvr69riwKZk1LHF7XqrWAO9hJxH6ozNzcnCx/PqztZg9mf6SQMscCtm2C5ke4BGMlHWTUp36036AJajDVrFMzBrhhWslQsSrFYiOqVpMriNYIgqFRq2j3FAb/zffT6zuxFXxsNzs3NTXn16lW4gYiW96w1FyedF+83xG/2FNGCRpU4NjamMsn+OZ9xE5RXqdaDdPpib6RWCzuwKF9RxqI2AVNQBwQYJoK0wdBejnqtEikP3pfP51XjUTESl12FqJEKxsEorARYDD44ONTeID7YpsEnrRvQfWAI2e8WfDaTUSIwJ0iBCmFOtOUAHvVMPp/TPwvYFVYFIuP8l+DBgwdaa2Miqwa0GgYwfeMltovbDfh6c1vIgMYcliSsKv4IWFr6VDHxvldvBAH+1sA+cnl5WYOPmmr9ir+1l9I0Cgz0yjhXjfJJ0JROnmezWbl165ayr/5fqwcBNr7IfhjMqKcvESSM4eRcCasQ3bDNObmKPLdGUGpZsN24cUNLBm9zazu4d++e6qpNBFaTuUS26U5dpuR1CxyA7J9ddrMRqlz4pwLLYawymPd++/2PADt2ugcGwq9gCCdhQ96C6xWwa6j1ceuq+I0EhW0i8MAIVJfeL3d/DVD8EKi12P6/2S2jV/EccVB54O/ejz/9HGCpoBBMta5rXMXLu53D1XAwjhXwvvv+h4BAXVe4bOu3O3ChxF08LiZFG3fel199G9CH3fLyqv24NcB44MRhpdK788U3CpyKwsCw590xmfSpzsBt0Fqc3ud3vtZigxWcVZCklVpSiN0w3q5E/h9TGMIUuA3+EQAAAABJRU5ErkJggg==",y="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC"},function(e,t,n){"use strict";n.d(t,"a",function(){return l});var i=n(8),o=n.n(i),a=n(1),r=n(2),s=n(0),c=n(6),l=function(){function e(){o()(this,e),this.bDisabeCloseOnEsc=!1,this.sDefaultKeyScope=s.KeyState.None,this.sCurrentKeyScope=s.KeyState.None,this.viewModelVisibility=a.a.observable(!1),this.modalVisibility=a.a.observable(!1).extend({rateLimit:0}),this.viewModelName="",this.viewModelNames=[],this.viewModelDom=null}return e.prototype.storeAndSetKeyScope=function(){this.sCurrentKeyScope=Object(c.keyScope)(),Object(c.keyScope)(this.sDefaultKeyScope)},e.prototype.restoreKeyScope=function(){Object(c.keyScope)(this.sCurrentKeyScope)},e.prototype.registerPopupKeyDown=function(){var e=this;c.$win.on("keydown",function(t){if(t&&e.modalVisibility&&e.modalVisibility()){if(!e.bDisabeCloseOnEsc&&s.EventKeyCode.Esc===t.keyCode)return Object(r.delegateRun)(e,"cancelCommand"),!1;if(s.EventKeyCode.Backspace===t.keyCode&&!Object(r.inFocus)())return!1}return!0})},e.prototype.cancelCommand=function(){},e.prototype.closeCommand=function(){},e}()},function(e,t,n){"use strict";var i=n(8),o=n.n(i),a=n(3),r=n.n(a),s=n(1),c=n(7),l=n.n(c),u=n(5),d=function(){function e(){var t=this;o()(this,e),this.google={},this.twitter={},this.facebook={},this.dropbox={},this.google.enabled=s.a.observable(!1),this.google.clientID=s.a.observable(""),this.google.clientSecret=s.a.observable(""),this.google.apiKey=s.a.observable(""),this.google.loading=s.a.observable(!1),this.google.userName=s.a.observable(""),this.google.loggined=s.a.computed(function(){return""!==t.google.userName()}),this.google.capa={},this.google.capa.auth=s.a.observable(!1),this.google.capa.authFast=s.a.observable(!1),this.google.capa.drive=s.a.observable(!1),this.google.capa.preview=s.a.observable(!1),this.google.require={},this.google.require.clientSettings=s.a.computed(function(){return t.google.enabled()&&(t.google.capa.auth()||t.google.capa.drive())}),this.google.require.apiKeySettings=s.a.computed(function(){return t.google.enabled()&&t.google.capa.drive()}),this.facebook.enabled=s.a.observable(!1),this.facebook.appID=s.a.observable(""),this.facebook.appSecret=s.a.observable(""),this.facebook.loading=s.a.observable(!1),this.facebook.userName=s.a.observable(""),this.facebook.supported=s.a.observable(!1),this.facebook.loggined=s.a.computed(function(){return""!==t.facebook.userName()}),this.twitter.enabled=s.a.observable(!1),this.twitter.consumerKey=s.a.observable(""),this.twitter.consumerSecret=s.a.observable(""),this.twitter.loading=s.a.observable(!1),this.twitter.userName=s.a.observable(""),this.twitter.loggined=s.a.computed(function(){return""!==t.twitter.userName()}),this.dropbox.enabled=s.a.observable(!1),this.dropbox.apiKey=s.a.observable("")}return e.prototype.populate=function(){this.google.enabled(!!u.settingsGet("AllowGoogleSocial")),this.google.clientID(u.settingsGet("GoogleClientID")),this.google.clientSecret(u.settingsGet("GoogleClientSecret")),this.google.apiKey(u.settingsGet("GoogleApiKey")),this.google.capa.auth(!!u.settingsGet("AllowGoogleSocialAuth")),this.google.capa.authFast(!!u.settingsGet("AllowGoogleSocialAuthFast")),this.google.capa.drive(!!u.settingsGet("AllowGoogleSocialDrive")),this.google.capa.preview(!!u.settingsGet("AllowGoogleSocialPreview")),this.facebook.enabled(!!u.settingsGet("AllowFacebookSocial")),this.facebook.appID(u.settingsGet("FacebookAppID")),this.facebook.appSecret(u.settingsGet("FacebookAppSecret")),this.facebook.supported(!!u.settingsGet("SupportedFacebookSocial")),this.twitter.enabled=s.a.observable(!!u.settingsGet("AllowTwitterSocial")),this.twitter.consumerKey=s.a.observable(u.settingsGet("TwitterConsumerKey")),this.twitter.consumerSecret=s.a.observable(u.settingsGet("TwitterConsumerSecret")),this.dropbox.enabled(!!u.settingsGet("AllowDropboxSocial")),this.dropbox.apiKey(u.settingsGet("DropboxApiKey"))},e.prototype.appendDropbox=function(){if(!r.a.Dropbox&&this.dropbox.enabled()&&this.dropbox.apiKey()&&!r.a.document.getElementById("dropboxjs")){var e=r.a.document.createElement("script");e.type="text/javascript",e.src="https://www.dropbox.com/static/api/2/dropins.js",l()(e).attr("id","dropboxjs").attr("data-app-key",this.dropbox.apiKey()),r.a.document.body.appendChild(e)}},e}();t.a=new d},,function(e,t,n){"use strict";n.d(t,"a",function(){return u}),n.d(t,"b",function(){return d});var i=n(8),o=n.n(i),a=n(7),r=n.n(a),s=n(1),c=n(2),l=n(10),u=function(){function e(){o()(this,e),this.disposable=[]}return e.prototype.dispose=function(){this.disposable.forEach(function(e){e&&e.dispose&&e.dispose()})},e}(),d=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return{template:t?{element:t}:"",viewModel:{createViewModel:function(t,n){return(t=t||{}).element=null,n&&n.element&&(t.component=n,t.element=r()(n.element),Object(l.i18nToNodes)(t.element),!Object(c.isUnd)(t.inline)&&s.a.unwrap(t.inline)&&t.element.css("display","inline-block")),new e(t)}}}}},,function(e,t,n){"use strict";function i(e,t){Object(f.isFunc)(t)&&(Object(f.isArray)(g[e])||(g[e]=[]),g[e].push(t))}function o(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];Object(f.isArray)(g[e])&&p.a.each(g[e],function(e){e.apply(void 0,t)})}function a(e){return h.settingsGet(e)}function r(e,t,n,i){m.data.__APP__&&m.data.__APP__.remote().defaultRequest(e,"Plugin"+t,n,i)}function s(e,t,n,i){b.push([e,t,n,i])}function c(e,t,n,i){v.push([e,t,n,i])}function l(e){var t=n(9);p.a.each(e?v:b,function(e){t.addSettingsViewModel(e[0],e[1],e[2],e[3])})}function u(e,t){var n=h.settingsGet("Plugins");return(n=n&&!Object(f.isUnd)(n[e])?n[e]:null)?Object(f.isUnd)(n[t])?null:n[t]:null}n.d(t,"a",function(){return i}),n.d(t,"f",function(){return o}),n.d(t,"d",function(){return a}),n.d(t,"e",function(){return r}),n.d(t,"b",function(){return s}),n.d(t,"c",function(){return c}),n.d(t,"g",function(){return l}),n.d(t,"h",function(){return u});var d=n(4),p=n.n(d),f=n(2),m=n(6),h=n(5),g={},b=[],v=[]},,,function(e,t,n){"use strict";var i=n(8),o=n.n(i),a=n(1),r=n(2),s=n(5),c=function(){function e(){o()(this,e),this.languages=a.a.observableArray([]),this.languagesAdmin=a.a.observableArray([]),this.language=a.a.observable("").extend({limitedList:this.languages}).extend({reversible:!0}),this.languageAdmin=a.a.observable("").extend({limitedList:this.languagesAdmin}).extend({reversible:!0}),this.userLanguage=a.a.observable(""),this.userLanguageAdmin=a.a.observable("")}return e.prototype.populate=function(){var e=s.appSettingsGet("languages"),t=s.appSettingsGet("languagesAdmin");this.languages(Object(r.isArray)(e)?e:[]),this.languagesAdmin(Object(r.isArray)(t)?t:[]),this.language(s.settingsGet("Language")),this.languageAdmin(s.settingsGet("LanguageAdmin")),this.userLanguage(s.settingsGet("UserLanguage")),this.userLanguageAdmin(s.settingsGet("UserLanguageAdmin"))},e}();t.a=new c},,function(e,t,n){"use strict";function i(){return y(),v||g()()}function o(){return w(),S||0}function a(e){return i().clone().subtract(e,"days").format("YYYY.MM.DD")}function r(e,t){var n=null,a="",r=o();if((n=0<(e=r<(e=0=t.diff(e,"hours"):return e.fromNow();case t.format("L")===e.format("L"):return Object(b.i18n)("MESSAGE_LIST/TODAY_AT",{TIME:e.format("LT")});case t.clone().subtract(1,"days").format("L")===e.format("L"):return Object(b.i18n)("MESSAGE_LIST/YESTERDAY_AT",{TIME:e.format("LT")});case t.year()===e.year():return e.format("D MMM.")}return e?e.format("LL"):""}(n);break;case"FULL":a=n.format("LLL");break;default:a=n.format(t)}return a}function s(e){var t,n="",i=m()(e);(t=i.data("moment-time"))&&((n=i.data("moment-format"))&&i.text(r(t,n)),(n=i.data("moment-format-title"))&&i.attr("title",r(t,n)))}function c(){p.a.defer(function(){m()(".moment",u.a.document).each(function(e,t){s(t)})})}n.r(t),n.d(t,"momentNow",function(){return i}),n.d(t,"momentNowUnix",function(){return o}),n.d(t,"searchSubtractFormatDateHelper",function(){return a}),n.d(t,"format",function(){return r}),n.d(t,"momentToNode",function(){return s}),n.d(t,"reload",function(){return c});var l=n(3),u=n.n(l),d=n(4),p=n.n(d),f=n(7),m=n.n(f),h=n(54),g=n.n(h),b=n(10),v=null,S=0,y=p.a.debounce(function(){v=g()()},500,!0),w=p.a.debounce(function(){S=g()().unix()},500,!0)},function(e,t){e.exports=window.hasher},,function(e,t,n){"use strict";function i(){return n(172).default}n.d(t,"a",function(){return i})},function(e,t,n){"use strict";var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(3),u=n.n(l),d=n(7),p=n.n(d),f=n(1),m=n(5),h=function(e){function t(){o()(this,t);var n=r()(this,e.call(this));return n.determineUserLanguage=f.a.observable(!1),n.determineUserDomain=f.a.observable(!1),n.weakPassword=f.a.observable(!1),n.useLocalProxyForExternalImages=f.a.observable(!1),n.dataFolderAccess=f.a.observable(!1),n}return c()(t,e),t.prototype.populate=function(){var t=this;e.prototype.populate.call(this),this.determineUserLanguage(!!Object(m.settingsGet)("DetermineUserLanguage")),this.determineUserDomain(!!Object(m.settingsGet)("DetermineUserDomain")),this.weakPassword(!!Object(m.settingsGet)("WeakPassword")),this.useLocalProxyForExternalImages(!!Object(m.settingsGet)("UseLocalProxyForExternalImages")),Object(m.settingsGet)("Auth")&&p.a.get("./data/VERSION?"+u.a.Math.random()).then(function(){return t.dataFolderAccess(!0)})},t}(n(116).a);t.a=new h},function(e,t,n){"use strict";var i=n(8),o=n.n(i),a=n(1),r=n(2),s=n(5),c=function(){function e(){o()(this,e),this.themes=a.a.observableArray([]),this.themeBackgroundName=a.a.observable(""),this.themeBackgroundHash=a.a.observable(""),this.theme=a.a.observable("").extend({limitedList:this.themes})}return e.prototype.populate=function(){var e=s.appSettingsGet("themes");this.themes(Object(r.isArray)(e)?e:[]),this.theme(s.settingsGet("Theme")),this.themeBackgroundName(s.settingsGet("UserBackgroundName")),this.themeBackgroundHash(s.settingsGet("UserBackgroundHash"))},e}();t.a=new c},function(e,t){var n=e.exports={version:"2.5.1"};"number"==typeof __e&&(__e=n)},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t,n){e.exports=!n(51)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t,n){var i=n(109),o=n(73);e.exports=function(e){return i(o(e))}},function(e,t,n){"use strict";n.r(t),n.d(t,"EmailModel",function(){return u}),n.d(t,"default",function(){return u});var i=n(8),o=n.n(i),a=n(4),r=n.n(a),s=n(76),c=n.n(s),l=n(2),u=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";o()(this,e),this.email="",this.name="",this.dkimStatus="",this.dkimValue="",this.email=t,this.name=n,this.dkimStatus=i,this.dkimValue=a,this.clearDuplicateName()}return e.newInstanceFromJson=function(t){var n=new e;return n.initByJson(t)?n:null},e.prototype.clear=function(){this.email="",this.name="",this.dkimStatus="none",this.dkimValue=""},e.prototype.validate=function(){return""!==this.name||""!==this.email},e.prototype.hash=function(){return"#"+(arguments.length>0&&void 0!==arguments[0]&&arguments[0]?"":this.name)+"#"+this.email+"#"},e.prototype.clearDuplicateName=function(){this.name===this.email&&(this.name="")},e.prototype.search=function(e){return-1<(this.name+" "+this.email).toLowerCase().indexOf(e.toLowerCase())},e.prototype.initByJson=function(e){var t=!1;return e&&"Object/Email"===e["@Object"]&&(this.name=Object(l.trim)(e.Name),this.email=Object(l.trim)(e.Email),this.dkimStatus=Object(l.trim)(e.DkimStatus||""),this.dkimValue=Object(l.trim)(e.DkimValue||""),t=""!==this.email,this.clearDuplicateName()),t},e.prototype.toLine=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i="";return""!==this.email&&(e&&""!==this.name?i=t?'
")+'" target="_blank" tabindex="-1">'+Object(l.encodeHtml)(this.name)+"":n?Object(l.encodeHtml)(this.name):this.name:(i=this.email,""!==this.name?t?i=Object(l.encodeHtml)('"'+this.name+'" <')+'")+'" target="_blank" tabindex="-1">'+Object(l.encodeHtml)(i)+""+Object(l.encodeHtml)(">"):(i='"'+this.name+'" <'+i+">",n&&(i=Object(l.encodeHtml)(i))):t&&(i=''+Object(l.encodeHtml)(this.email)+""))),i},e.splitEmailLine=function(t){var n=c()(t);if(Object(l.isNonEmptyArray)(n)){var i=[],o=!1;return n.forEach(function(t){var n=t.address?new e(t.address.replace(/^[<]+(.*)[>]+$/g,"$1"),t.name||""):null;n&&n.email&&(o=!0),i.push(n?n.toLine(!1):t.name)}),o?i:null}return null},e.parseEmailLine=function(t){var n=c()(t);return Object(l.isNonEmptyArray)(n)?r.a.compact(n.map(function(t){return t.address?new e(t.address.replace(/^[<]+(.*)[>]+$/g,"$1"),t.name||""):null})):[]},e.prototype.parse=function(e){if(""===(e=Object(l.trim)(e)))return!1;var t=c()(e);return!(!Object(l.isNonEmptyArray)(t)||!t[0]||(this.name=t[0].name||"",this.email=t[0].address||"",this.clearDuplicateName(),0))},e}()},,function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t,n){"use strict";n.d(t,"a",function(){return p});var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(1),u=n(2),d=n(0),p=function(e){function t(n){o()(this,t);var i=r()(this,e.call(this));return i.value=n.value||"",i.size=n.size||0,i.label=n.label||"",i.preLabel=n.preLabel||"",i.enable=!!Object(u.isUnd)(n.enable)||n.enable,i.trigger=n.trigger&&n.trigger.subscribe?n.trigger:null,i.placeholder=n.placeholder||"",i.labeled=!Object(u.isUnd)(n.label),i.preLabeled=!Object(u.isUnd)(n.preLabel),i.triggered=!Object(u.isUnd)(n.trigger)&&!!i.trigger,i.classForTrigger=l.a.observable(""),i.className=l.a.computed(function(){var e=l.a.unwrap(i.size),t=i.trigger?" "+Object(u.trim)("settings-saved-trigger-input "+i.classForTrigger()):"";return(01&&void 0!==arguments[1]&&arguments[1];if(!a.a.Promise||!a.a.Promise.all)throw new Error("Promises are not available your environment.");if(!e)throw new Error("src should not be empty.");return new a.a.Promise(function(n,i){var o=a.a.document.createElement("script");o.onload=function(){n(e)},o.onerror=function(){i(new Error(e))},o.async=!0===t,o.src=e,a.a.document.body.appendChild(o)})}n.d(t,"a",function(){return i});var o=n(3),a=n.n(o)},function(e,t,n){var i=n(85)("wks"),o=n(70),a=n(41).Symbol,r="function"==typeof a;(e.exports=function(e){return i[e]||(i[e]=r&&a[e]||(r?a:o)("Symbol."+e))}).store=i},function(e,t,n){var i=n(52);e.exports=function(e){if(!i(e))throw TypeError(e+" is not an object!");return e}},,,function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){"use strict";n.d(t,"a",function(){return u});var i=n(8),o=n.n(i),a=n(4),r=n.n(a),s=n(75),c=n.n(s),l=n(2),u=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];o()(this,e),this.oCross=null,this.sScreenName=t,this.aViewModels=Object(l.isArray)(n)?n:[]}return e.prototype.viewModels=function(){return this.aViewModels},e.prototype.screenName=function(){return this.sScreenName},e.prototype.routes=function(){return null},e.prototype.__cross=function(){return this.oCross},e.prototype.__start=function(){var e=null,t=null,n=this.routes();Object(l.isNonEmptyArray)(n)&&(t=r.a.bind(this.onRoute||l.noop,this),e=c.a.create(),n.forEach(function(n){n&&e&&(e.addRoute(n[0],t).rules=n[1])}),this.oCross=e)},e}()},function(e,t){e.exports=window.ssm},function(e,t,n){var i=n(52);e.exports=function(e,t){if(!i(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!i(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!i(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!i(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},function(e,t,n){"use strict";var i=n(8),o=n.n(i),a=n(1);t.a=new function e(){o()(this,e),this.domains=a.a.observableArray([]),this.domains.loading=a.a.observable(!1).extend({throttle:100}),this.domainsWithoutAliases=this.domains.filter(function(e){return e&&!e.alias})}},,function(e,t){var n=0,i=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+i).toString(36))}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,n){var i=n(71),o=n(64),a=n(43),r=n(67),s=n(46),c=n(77),l=Object.getOwnPropertyDescriptor;t.f=n(42)?l:function(e,t){if(e=a(e),t=r(t,!0),c)try{return l(e,t)}catch(e){}if(s(e,t))return o(!i.f.call(e,t),e[t])}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){"use strict";n.d(t,"a",function(){return d});var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(1),u=n(2),d=function(e){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};o()(this,t);var i=r()(this,e.call(this));return i.value=n.value,!Object(u.isUnd)(i.value)&&i.value.subscribe||(i.value=l.a.observable(!Object(u.isUnd)(i.value)&&!!i.value)),i.enable=n.enable,!Object(u.isUnd)(i.enable)&&i.enable.subscribe||(i.enable=l.a.observable(!!Object(u.isUnd)(i.enable)||!!i.enable)),i.disable=n.disable,!Object(u.isUnd)(i.disable)&&i.disable.subscribe||(i.disable=l.a.observable(!Object(u.isUnd)(i.disable)&&!!i.disable)),i.label=n.label||"",i.inline=!Object(u.isUnd)(n.inline)&&n.inline,i.readOnly=!Object(u.isUnd)(n.readOnly)&&!!n.readOnly,i.inverted=!Object(u.isUnd)(n.inverted)&&!!n.inverted,i.labeled=!Object(u.isUnd)(n.label),i.labelAnimated=!!n.labelAnimated,i}return c()(t,e),t.prototype.click=function(){this.readOnly||!this.enable()||this.disable()||this.value(!this.value())},t}(n(27).a)},function(e,t){e.exports=window.crossroads},function(e,t,n){"use strict";function i(e){var t=[],n=[],o=[];return new r(e).tokenize().forEach(function(e){"operator"!==e.type||","!==e.value&&";"!==e.value?n.push(e):(n.length&&t.push(n),n=[])}),n.length&&t.push(n),t.forEach(function(e){(e=function(e){for(var t=!1,n="text",o=void 0,a=[],r={address:[],comment:[],group:[],text:[]},s=0,c=e.length;s=0;u--)if(r.text[u].match(/^[^@\s]+@[^@\s]+$/)){r.address=r.text.splice(u,1);break}if(!r.address.length)for(var d=r.text.length-1;d>=0&&(r.text[d]=r.text[d].replace(/\s*\b[^@\s]+@[^@\s]+\b\s*/,function(e){return r.address.length?e:(r.address=[e.trim()]," ")}).trim(),!r.address.length);d--);}if(!r.text.length&&r.comment.length&&(r.text=r.comment,r.comment=[]),r.address.length>1&&(r.text=r.text.concat(r.address.splice(1))),r.text=r.text.join(" "),r.address=r.address.join(" "),!r.address&&t)return[];(o={address:r.address||r.text||"",name:r.text||r.address||""}).address===o.name&&((o.address||"").match(/@/)?o.name="":o.address=""),a.push(o)}return a}(e)).length&&(o=o.concat(e))}),o}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n",",":"",":":";",";":""},r=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.str=(t||"").toString(),this.operatorCurrent="",this.operatorExpecting="",this.node=null,this.escaped=!1,this.list=[]}return o(e,[{key:"tokenize",value:function(){for(var e=void 0,t=[],n=0,i=this.str.length;ndocument.F=Object<\/script>"),e.close(),c=e.F;i--;)delete c.prototype[a[i]];return c()};e.exports=Object.create||function(e,t){var n;return null!==e?(s.prototype=i(e),n=new s,s.prototype=null,n[r]=e):n=c(),void 0===t?n:o(n,t)}},function(e,t){e.exports={}},function(e,t){e.exports=!0},function(e,t){var n=Math.ceil,i=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?i:n)(e)}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){var i=n(52),o=n(41).document,a=i(o)&&i(o.createElement);e.exports=function(e){return a?o.createElement(e):{}}},function(e,t,n){var i=n(112);e.exports=function(e,t,n){if(i(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,o){return e.call(t,n,i,o)}}return function(){return e.apply(t,arguments)}}},function(e,t,n){"use strict";n.r(t),n.d(t,"HtmlEditor",function(){return m}),n.d(t,"default",function(){return m});var i=n(8),o=n.n(i),a=n(3),r=n.n(a),s=n(4),c=n.n(s),l=n(7),u=n.n(l),d=n(6),p=n(0),f=n(5),m=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;o()(this,e),this.blurTimer=0,this.__resizable=!1,this.__inited=!1,this.onBlur=null,this.onReady=null,this.onModeChange=null,this.onBlur=n,this.onReady=i,this.onModeChange=a,this.element=t,this.$element=u()(t),this.resize=c.a.throttle(c.a.bind(this.resizeEditor,this),100),this.init()}return e.prototype.runOnBlur=function(){this.onBlur&&this.onBlur()},e.prototype.blurTrigger=function(){var e=this;this.onBlur&&(r.a.clearTimeout(this.blurTimer),this.blurTimer=r.a.setTimeout(function(){e.runOnBlur()},p.Magics.Time200ms))},e.prototype.focusTrigger=function(){this.onBlur&&r.a.clearTimeout(this.blurTimer)},e.prototype.isHtml=function(){return!!this.editor&&"wysiwyg"===this.editor.mode},e.prototype.clearCachedSignature=function(){this.editor&&this.editor.execCommand("insertSignature",{clearCache:!0})},e.prototype.setSignature=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];this.editor&&this.editor.execCommand("insertSignature",{isHtml:t,insertBefore:n,signature:e})},e.prototype.checkDirty=function(){return!!this.editor&&this.editor.checkDirty()},e.prototype.resetDirty=function(){this.editor&&this.editor.resetDirty()},e.prototype.getData=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t="";if(this.editor)try{t="plain"===this.editor.mode&&this.editor.plugins.plain&&this.editor.__plain?this.editor.__plain.getRawData():e?'
'+this.editor.getData()+"
":this.editor.getData()}catch(e){}return t},e.prototype.getDataWithHtmlMark=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return(this.isHtml()?":HTML:":"")+this.getData(e)},e.prototype.modeToggle=function(e,t){if(this.editor){try{e?"plain"===this.editor.mode&&this.editor.setMode("wysiwyg"):"wysiwyg"===this.editor.mode&&this.editor.setMode("plain")}catch(e){}t&&this.resize()}},e.prototype.setHtmlOrPlain=function(e,t){":HTML:"===e.substr(0,6)?this.setHtml(e.substr(6),t):this.setPlain(e,t)},e.prototype.setHtml=function(e,t){if(this.editor&&this.__inited){this.clearCachedSignature(),this.modeToggle(!0),e=e.replace(/]*><\/p>/gi,"");try{this.editor.setData(e)}catch(e){}t&&this.focus()}},e.prototype.replaceHtml=function(e,t){if(this.editor&&this.__inited&&"wysiwyg"===this.editor.mode)try{this.editor.setData(this.editor.getData().replace(e,t))}catch(e){}},e.prototype.setPlain=function(e,t){if(this.editor&&this.__inited){if(this.clearCachedSignature(),this.modeToggle(!1),"plain"===this.editor.mode&&this.editor.plugins.plain&&this.editor.__plain)this.editor.__plain.setRawData(e);else try{this.editor.setData(e)}catch(e){}t&&this.focus()}},e.prototype.init=function(){var e=this;if(this.element&&!this.editor){var t=function(){var t=d.htmlEditorDefaultConfig,n=f.settingsGet("Language"),i=!!f.appSettingsGet("allowHtmlEditorSourceButton"),o=!!f.appSettingsGet("allowHtmlEditorBitiButtons");!i&&o||t.toolbarGroups.__cfgInited||(t.toolbarGroups.__cfgInited=!0,i&&(t.removeButtons=t.removeButtons.replace(",Source","")),o||(t.removePlugins+=(t.removePlugins?",":"")+"bidi")),t.enterMode=r.a.CKEDITOR.ENTER_BR,t.shiftEnterMode=r.a.CKEDITOR.ENTER_P,t.language=d.htmlEditorLangsMap[(n||"en").toLowerCase()]||"en",r.a.CKEDITOR.env&&(r.a.CKEDITOR.env.isCompatible=!0),e.editor=r.a.CKEDITOR.appendTo(e.element,t),e.editor.on("key",function(e){return!e||!e.data||p.EventKeyCode.Tab!==e.data.keyCode}),e.editor.on("blur",function(){e.blurTrigger()}),e.editor.on("mode",function(){e.blurTrigger(),e.onModeChange&&e.onModeChange("plain"!==e.editor.mode)}),e.editor.on("focus",function(){e.focusTrigger()}),r.a.FileReader&&e.editor.on("drop",function(t){if(0')},o.readAsDataURL(n),t.data.dataTransfer.setData("text/html",i)}}}),e.editor.on("instanceReady",function(){e.editor.removeMenuItem&&(e.editor.removeMenuItem("cut"),e.editor.removeMenuItem("copy"),e.editor.removeMenuItem("paste")),e.__resizable=!0,e.__inited=!0,e.resize(),e.onReady&&e.onReady()})};r.a.CKEDITOR?t():r.a.__initEditor=t}},e.prototype.focus=function(){if(this.editor)try{this.editor.focus()}catch(e){}},e.prototype.hasFocus=function(){if(this.editor)try{return!!this.editor.focusManager.hasFocus}catch(e){}return!1},e.prototype.blur=function(){if(this.editor)try{this.editor.focusManager.blur(!0)}catch(e){}},e.prototype.resizeEditor=function(){if(this.editor&&this.__resizable)try{this.editor.resize(this.$element.width(),this.$element.innerHeight())}catch(e){}},e.prototype.setReadOnly=function(e){if(this.editor)try{this.editor.setReadOnly(!!e)}catch(e){}},e.prototype.clear=function(e){this.setHtml("",e)},e}()},function(e,t){e.exports=window.Autolinker},function(e,t,n){!function(t,i){"use strict";var o;try{o=n(54)}catch(e){}e.exports=function(e){var t="function"==typeof e,n=!!window.addEventListener,i=window.document,o=window.setTimeout,a=function(e,t,i,o){n?e.addEventListener(t,i,!!o):e.attachEvent("on"+t,i)},r=function(e,t,i,o){n?e.removeEventListener(t,i,!!o):e.detachEvent("on"+t,i)},s=function(e,t){return-1!==(" "+e.className+" ").indexOf(" "+t+" ")},c=function(e){return/Array/.test(Object.prototype.toString.call(e))},l=function(e){return/Date/.test(Object.prototype.toString.call(e))&&!isNaN(e.getTime())},u=function(e){var t=e.getDay();return 0===t||6===t},d=function(e,t){return[31,function(e){return e%4==0&&e%100!=0||e%400==0}(e)?29:28,31,30,31,30,31,31,30,31,30,31][t]},p=function(e){l(e)&&e.setHours(0,0,0,0)},f=function(e,t){return e.getTime()===t.getTime()},m=function(e,t,n){var i,o;for(i in t)(o=void 0!==e[i])&&"object"==typeof t[i]&&null!==t[i]&&void 0===t[i].nodeName?l(t[i])?n&&(e[i]=new Date(t[i].getTime())):c(t[i])?n&&(e[i]=t[i].slice(0)):e[i]=m({},t[i],n):!n&&o||(e[i]=t[i]);return e},h=function(e,t,n){var o;i.createEvent?((o=i.createEvent("HTMLEvents")).initEvent(t,!0,!1),o=m(o,n),e.dispatchEvent(o)):i.createEventObject&&(o=i.createEventObject(),o=m(o,n),e.fireEvent("on"+t,o))},g=function(e){return e.month<0&&(e.year-=Math.ceil(Math.abs(e.month)/12),e.month+=12),e.month>11&&(e.year+=Math.floor(Math.abs(e.month)/12),e.month-=12),e},b={field:null,bound:void 0,position:"bottom left",reposition:!0,format:"YYYY-MM-DD",toString:null,parse:null,defaultDate:null,setDefaultDate:!1,firstDay:0,formatStrict:!1,minDate:null,maxDate:null,yearRange:10,showWeekNumber:!1,pickWholeWeek:!1,minYear:0,maxYear:9999,minMonth:void 0,maxMonth:void 0,startRange:null,endRange:null,isRTL:!1,yearSuffix:"",showMonthAfterYear:!1,showDaysInNextAndPreviousMonths:!1,enableSelectionDaysInNextAndPreviousMonths:!1,numberOfMonths:1,mainCalendar:"left",container:void 0,blurFieldOnSelect:!0,i18n:{previousMonth:"Previous Month",nextMonth:"Next Month",months:["January","February","March","April","May","June","July","August","September","October","November","December"],weekdays:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],weekdaysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},theme:null,events:[],onSelect:null,onOpen:null,onClose:null,onDraw:null,keyboardInput:!0},v=function(e,t,n){for(t+=e.firstDay;t>=7;)t-=7;return n?e.i18n.weekdaysShort[t]:e.i18n.weekdays[t]},S=function(e){var t=[],n="false";if(e.isEmpty){if(!e.showDaysInNextAndPreviousMonths)return'';t.push("is-outside-current-month"),e.enableSelectionDaysInNextAndPreviousMonths||t.push("is-selection-disabled")}return e.isDisabled&&t.push("is-disabled"),e.isToday&&t.push("is-today"),e.isSelected&&(t.push("is-selected"),n="true"),e.hasEvent&&t.push("has-event"),e.isInRange&&t.push("is-inrange"),e.isStartRange&&t.push("is-startrange"),e.isEndRange&&t.push("is-endrange"),'"},y=function(e,t,n,i){return''+(t?e.reverse():e).join("")+""},w=function(e,t,n,i,o,a){var r,s,l,u,d,p=e._o,f=n===p.minYear,m=n===p.maxYear,h='
',g=!0,b=!0;for(l=[],r=0;r<12;r++)l.push('");for(u='
'+p.i18n.months[i]+'
",c(p.yearRange)?(r=p.yearRange[0],s=p.yearRange[1]+1):(r=n-p.yearRange,s=1+n+p.yearRange),l=[];r=p.minYear&&l.push('");return d='
'+n+p.yearSuffix+'
",p.showMonthAfterYear?h+=d+u:h+=u+d,f&&(0===i||p.minMonth>=i)&&(g=!1),m&&(11===i||p.maxMonth<=i)&&(b=!1),0===t&&(h+='"),t===e._o.numberOfMonths-1&&(h+='"),h+="
"},A=function(r){var c=this,u=c.config(r);c._onMouseDown=function(e){if(c._v){var t=(e=e||window.event).target||e.srcElement;if(t)if(s(t,"is-disabled")||(!s(t,"pika-button")||s(t,"is-empty")||s(t.parentNode,"is-disabled")?s(t,"pika-prev")?c.prevMonth():s(t,"pika-next")&&c.nextMonth():(c.setDate(new Date(t.getAttribute("data-pika-year"),t.getAttribute("data-pika-month"),t.getAttribute("data-pika-day"))),u.bound&&o(function(){c.hide(),u.blurFieldOnSelect&&u.field&&u.field.blur()},100))),s(t,"pika-select"))c._c=!0;else{if(!e.preventDefault)return e.returnValue=!1,!1;e.preventDefault()}}},c._onChange=function(e){var t=(e=e||window.event).target||e.srcElement;t&&(s(t,"pika-select-month")?c.gotoMonth(t.value):s(t,"pika-select-year")&&c.gotoYear(t.value))},c._onKeyChange=function(e){if(e=e||window.event,c.isVisible())switch(e.keyCode){case 13:case 27:u.field&&u.field.blur();break;case 37:e.preventDefault(),c.adjustDate("subtract",1);break;case 38:c.adjustDate("subtract",7);break;case 39:c.adjustDate("add",1);break;case 40:c.adjustDate("add",7)}},c._onInputChange=function(n){var i;n.firedBy!==c&&(i=u.parse?u.parse(u.field.value,u.format):t?(i=e(u.field.value,u.format,u.formatStrict))&&i.isValid()?i.toDate():null:new Date(Date.parse(u.field.value)),l(i)&&c.setDate(i),c._v||c.show())},c._onInputFocus=function(){c.show()},c._onInputClick=function(){c.show()},c._onInputBlur=function(){var e=i.activeElement;do{if(s(e,"pika-single"))return}while(e=e.parentNode);c._c||(c._b=o(function(){c.hide()},50)),c._c=!1},c._onClick=function(e){var t=(e=e||window.event).target||e.srcElement,i=t;if(t){!n&&s(t,"pika-select")&&(t.onchange||(t.setAttribute("onchange","return;"),a(t,"change",c._onChange)));do{if(s(i,"pika-single")||i===u.trigger)return}while(i=i.parentNode);c._v&&t!==u.trigger&&i!==u.trigger&&c.hide()}},c.el=i.createElement("div"),c.el.className="pika-single"+(u.isRTL?" is-rtl":"")+(u.theme?" "+u.theme:""),a(c.el,"mousedown",c._onMouseDown,!0),a(c.el,"touchend",c._onMouseDown,!0),a(c.el,"change",c._onChange),u.keyboardInput&&a(i,"keydown",c._onKeyChange),u.field&&(u.container?u.container.appendChild(c.el):u.bound?i.body.appendChild(c.el):u.field.parentNode.insertBefore(c.el,u.field.nextSibling),a(u.field,"change",c._onInputChange),u.defaultDate||(t&&u.field.value?u.defaultDate=e(u.field.value,u.format).toDate():u.defaultDate=new Date(Date.parse(u.field.value)),u.setDefaultDate=!0));var d=u.defaultDate;l(d)?u.setDefaultDate?c.setDate(d,!0):c.gotoDate(d):c.gotoDate(new Date),u.bound?(this.hide(),c.el.className+=" is-bound",a(u.trigger,"click",c._onInputClick),a(u.trigger,"focus",c._onInputFocus),a(u.trigger,"blur",c._onInputBlur)):this.show()};return A.prototype={config:function(e){this._o||(this._o=m({},b,!0));var t=m(this._o,e,!0);t.isRTL=!!t.isRTL,t.field=t.field&&t.field.nodeName?t.field:null,t.theme="string"==typeof t.theme&&t.theme?t.theme:null,t.bound=!!(void 0!==t.bound?t.field&&t.bound:t.field),t.trigger=t.trigger&&t.trigger.nodeName?t.trigger:t.field,t.disableWeekends=!!t.disableWeekends,t.disableDayFn="function"==typeof t.disableDayFn?t.disableDayFn:null;var n=parseInt(t.numberOfMonths,10)||1;if(t.numberOfMonths=n>4?4:n,l(t.minDate)||(t.minDate=!1),l(t.maxDate)||(t.maxDate=!1),t.minDate&&t.maxDate&&t.maxDate100&&(t.yearRange=100);return t},toString:function(n){return n=n||this._o.format,l(this._d)?this._o.toString?this._o.toString(this._d,n):t?e(this._d).format(n):this._d.toDateString():""},getMoment:function(){return t?e(this._d):null},setMoment:function(n,i){t&&e.isMoment(n)&&this.setDate(n.toDate(),i)},getDate:function(){return l(this._d)?new Date(this._d.getTime()):null},setDate:function(e,t){if(!e)return this._d=null,this._o.field&&(this._o.field.value="",h(this._o.field,"change",{firedBy:this})),this.draw();if("string"==typeof e&&(e=new Date(Date.parse(e))),l(e)){var n=this._o.minDate,i=this._o.maxDate;l(n)&&ei&&(e=i),this._d=new Date(e.getTime()),p(this._d),this.gotoDate(this._d),this._o.field&&(this._o.field.value=this.toString(),h(this._o.field,"change",{firedBy:this})),t||"function"!=typeof this._o.onSelect||this._o.onSelect.call(this,this.getDate())}},gotoDate:function(e){var t=!0;if(l(e)){if(this.calendars){var n=new Date(this.calendars[0].year,this.calendars[0].month,1),i=new Date(this.calendars[this.calendars.length-1].year,this.calendars[this.calendars.length-1].month,1),o=e.getTime();i.setMonth(i.getMonth()+1),i.setDate(i.getDate()-1),t=o=a&&(this._y=a,!isNaN(s)&&this._m>s&&(this._m=s)),t="pika-title-"+Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,2);for(var l=0;l'+w(this,l,this.calendars[l].year,this.calendars[l].month,this.calendars[0].year,t)+this.render(this.calendars[l].year,this.calendars[l].month,t)+"";this.el.innerHTML=c,n.bound&&"hidden"!==n.field.type&&o(function(){n.trigger.focus()},1),"function"==typeof this._o.onDraw&&this._o.onDraw(this),n.bound&&n.field.setAttribute("aria-label","Use the arrow keys to pick a date")}},adjustPosition:function(){var e,t,n,o,a,r,s,c,l,u;if(!this._o.container){if(this.el.style.position="absolute",t=e=this._o.trigger,n=this.el.offsetWidth,o=this.el.offsetHeight,a=window.innerWidth||i.documentElement.clientWidth,r=window.innerHeight||i.documentElement.clientHeight,s=window.pageYOffset||i.body.scrollTop||i.documentElement.scrollTop,"function"==typeof e.getBoundingClientRect)c=(u=e.getBoundingClientRect()).left+window.pageXOffset,l=u.bottom+window.pageYOffset;else for(c=t.offsetLeft,l=t.offsetTop+t.offsetHeight;t=t.offsetParent;)c+=t.offsetLeft,l+=t.offsetTop;(this._o.reposition&&c+n>a||this._o.position.indexOf("right")>-1&&c-n+e.offsetWidth>0)&&(c=c-n+e.offsetWidth),(this._o.reposition&&l+o>r+s||this._o.position.indexOf("top")>-1&&l-o-e.offsetHeight>0)&&(l=l-o-e.offsetHeight),this.el.style.left=c+"px",this.el.style.top=l+"px"}},render:function(e,t,n){var i=this._o,o=new Date,a=d(e,t),r=new Date(e,t,1).getDay(),s=[],c=[];p(o),i.firstDay>0&&(r-=i.firstDay)<0&&(r+=7);for(var m=0===t?11:t-1,h=11===t?0:t+1,g=0===t?e-1:e,b=11===t?e+1:e,w=d(g,m),A=a+r,O=A;O>7;)O-=7;A+=7-O;for(var T,C,_,E,D=!1,N=0,j=0;N=a+r,L=N-r+1,M=t,F=e,U=i.startRange&&f(i.startRange,R),H=i.endRange&&f(i.endRange,R),G=i.startRange&&i.endRange&&i.startRangei.maxDate||i.disableWeekends&&u(R)||i.disableDayFn&&i.disableDayFn(R);k&&(N'+Math.ceil(((new Date(_,C,T)-E)/864e5+E.getDay()+1)/7)+"")),s.push(y(c,i.isRTL,i.pickWholeWeek,D)),c=[],j=0,D=!1)}return function(e,t,n){return''+function(e){var t,n=[];for(e.showWeekNumber&&n.push(""),t=0;t<7;t++)n.push('");return""+(e.isRTL?n.reverse():n).join("")+""}(i)+""+t.join("")+"
'+v(e,t,!0)+"
"}(0,s,n)},isVisible:function(){return this._v},show:function(){var e,t,n;this.isVisible()||(this._v=!0,this.draw(),e=this.el,t="is-hidden",e.className=(n=(" "+e.className+" ").replace(" "+t+" "," ")).trim?n.trim():n.replace(/^\s+|\s+$/g,""),this._o.bound&&(a(i,"click",this._onClick),this.adjustPosition()),"function"==typeof this._o.onOpen&&this._o.onOpen.call(this))},hide:function(){var e,t,n=this._v;!1!==n&&(this._o.bound&&r(i,"click",this._onClick),this.el.style.position="static",this.el.style.left="auto",this.el.style.top="auto",e=this.el,s(e,t="is-hidden")||(e.className=""===e.className?t:e.className+" "+t),this._v=!1,void 0!==n&&"function"==typeof this._o.onClose&&this._o.onClose.call(this))},destroy:function(){var e=this._o;this.hide(),r(this.el,"mousedown",this._onMouseDown,!0),r(this.el,"touchend",this._onMouseDown,!0),r(this.el,"change",this._onChange),e.keyboardInput&&r(i,"keydown",this._onKeyChange),e.field&&(r(e.field,"change",this._onInputChange),e.bound&&(r(e.trigger,"click",this._onInputClick),r(e.trigger,"focus",this._onInputFocus),r(e.trigger,"blur",this._onInputBlur))),this.el.parentNode&&this.el.parentNode.removeChild(this.el)}},A}(o)}()},,function(e,t,n){"use strict";n.r(t),n.d(t,"AskPopupView",function(){return v}),n.d(t,"default",function(){return v});var i,o=n(8),a=n.n(o),r=n(12),s=n.n(r),c=n(11),l=n.n(c),u=n(1),d=n(19),p=n.n(d),f=n(0),m=n(2),h=n(10),g=n(9),b=n(24),v=Object(g.popup)({name:"View/Popup/Ask",templateID:"PopupsAsk"})(i=function(e){function t(){a()(this,t);var n=s()(this,e.call(this));return n.askDesc=u.a.observable(""),n.yesButton=u.a.observable(""),n.noButton=u.a.observable(""),n.yesFocus=u.a.observable(!1),n.noFocus=u.a.observable(!1),n.fYesAction=null,n.fNoAction=null,n.bFocusYesOnShow=!0,n.bDisabeCloseOnEsc=!0,n.sDefaultKeyScope=f.KeyState.PopupAsk,n}return l()(t,e),t.prototype.clearPopup=function(){this.askDesc(""),this.yesButton(Object(h.i18n)("POPUPS_ASK/BUTTON_YES")),this.noButton(Object(h.i18n)("POPUPS_ASK/BUTTON_NO")),this.yesFocus(!1),this.noFocus(!1),this.fYesAction=null,this.fNoAction=null},t.prototype.yesClick=function(){this.cancelCommand(),Object(m.isFunc)(this.fYesAction)&&this.fYesAction.call(null)},t.prototype.noClick=function(){this.cancelCommand(),Object(m.isFunc)(this.fNoAction)&&this.fNoAction.call(null)},t.prototype.onShow=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",a=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];this.clearPopup(),this.fYesAction=t||null,this.fNoAction=n||null,this.askDesc(e||""),i&&this.yesButton(i),o&&this.noButton(o),this.bFocusYesOnShow=!!a},t.prototype.onShowWithDelay=function(){this.bFocusYesOnShow&&this.yesFocus(!0)},t.prototype.onBuild=function(){var e=this;p()("tab, shift+tab, right, left",f.KeyState.PopupAsk,function(){return e.yesFocus()?e.noFocus(!0):e.yesFocus(!0),!1}),p()("esc",f.KeyState.PopupAsk,function(){return e.noClick(),!1})},t}(b.a))||i},,function(e,t,n){"use strict";n.r(t),n.d(t,"LanguagesPopupView",function(){return g}),n.d(t,"default",function(){return g});var i,o=n(8),a=n.n(o),r=n(12),s=n.n(r),c=n(11),l=n.n(c),u=n(4),d=n.n(u),p=n(1),f=n(2),m=n(9),h=n(24),g=Object(m.popup)({name:"View/Popup/Languages",templateID:"PopupsLanguages"})(i=function(e){function t(){a()(this,t);var n=s()(this,e.call(this));return n.fLang=null,n.userLanguage=p.a.observable(""),n.langs=p.a.observableArray([]),n.languages=p.a.computed(function(){var e=n.userLanguage();return d.a.map(n.langs(),function(t){return{key:t,user:t===e,selected:p.a.observable(!1),fullName:Object(f.convertLangName)(t)}})}),n.langs.subscribe(function(){n.setLanguageSelection()}),n}return l()(t,e),t.prototype.languageTooltipName=function(e){var t=Object(f.convertLangName)(e,!0);return Object(f.convertLangName)(e,!1)===t?"":t},t.prototype.setLanguageSelection=function(){var e=this.fLang?p.a.unwrap(this.fLang):"";d.a.each(this.languages(),function(t){t.selected(t.key===e)})},t.prototype.onBeforeShow=function(){this.fLang=null,this.userLanguage(""),this.langs([])},t.prototype.onShow=function(e,t,n){this.fLang=e,this.userLanguage(n||""),this.langs(t)},t.prototype.changeLanguage=function(e){this.fLang&&this.fLang(e),this.cancelCommand()},t}(h.a))||i},function(e,t,n){var i=n(104),o=n(84).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return i(e,o)}},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t,n){var i=n(46),o=n(43),a=n(163)(!1),r=n(86)("IE_PROTO");e.exports=function(e,t){var n,s=o(e),c=0,l=[];for(n in s)n!=r&&i(s,n)&&l.push(n);for(;t.length>c;)i(s,n=t[c++])&&(~a(l,n)||l.push(n));return l}},function(e,t,n){e.exports=n(53)},function(e,t,n){"use strict";var i=n(90),o=n(58),a=n(105),r=n(53),s=n(46),c=n(89),l=n(165),u=n(83),d=n(159),p=n(60)("iterator"),f=!([].keys&&"next"in[].keys()),m=function(){return this};e.exports=function(e,t,n,h,g,b,v){l(n,t,h);var S,y,w,A=function(e){if(!f&&e in _)return _[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},O=t+" Iterator",T="values"==g,C=!1,_=e.prototype,E=_[p]||_["@@iterator"]||g&&_[g],D=E||A(g),N=g?T?A("entries"):D:void 0,j="Array"==t&&_.entries||E;if(j&&(w=d(j.call(new e)))!==Object.prototype&&w.next&&(u(w,O,!0),i||s(w,p)||r(w,p,m)),T&&E&&"values"!==E.name&&(C=!0,D=function(){return E.call(this)}),i&&!v||!f&&!C&&_[p]||r(_,p,D),c[t]=D,c[O]=m,g)if(S={values:T?D:A("values"),keys:b?D:A("keys"),entries:N},v)for(y in S)y in _||a(_,y,S[y]);else o(o.P+o.F*(f||C),t,S);return S}},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var o=i(n(169)),a=i(n(153)),r="function"==typeof a.default&&"symbol"==typeof o.default?function(e){return typeof e}:function(e){return e&&"function"==typeof a.default&&e.constructor===a.default&&e!==a.default.prototype?"symbol":typeof e};t.default="function"==typeof a.default&&"symbol"===r(o.default)?function(e){return void 0===e?"undefined":r(e)}:function(e){return e&&"function"==typeof a.default&&e.constructor===a.default&&e!==a.default.prototype?"symbol":void 0===e?"undefined":r(e)}},function(e,t,n){var i=n(58),o=n(40),a=n(51);e.exports=function(e,t){var n=(o.Object||{})[e]||Object[e],r={};r[e]=t(n),i(i.S+i.F*a(function(){n(1)}),"Object",r)}},function(e,t,n){var i=n(92);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==i(e)?e.split(""):Object(e)}},function(e,t,n){var i=n(43),o=n(72).f;n(108)("getOwnPropertyDescriptor",function(){return function(e,t){return o(i(e),t)}})},function(e,t,n){n(110);var i=n(40).Object;e.exports=function(e,t){return i.getOwnPropertyDescriptor(e,t)}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t,n){"use strict";function i(){var e;null===N&&((N=f()("
")).appendTo(w.$body),e=N,j||(j=new R(e),g.a.applyBindingAccessorsToNode(e[0],{translatorInit:!0,template:function(){return{name:"Cmd"}}},j)))}var o=n(8),a=n.n(o),r=n(12),s=n.n(r),c=n(11),l=n.n(c),u=n(3),d=n.n(u),p=n(7),f=n.n(p),m=n(4),h=n.n(m),g=n(1),b=n(19),v=n.n(b),S=n(66),y=n.n(S),w=n(6),A=n(2),O=n(0),T=n(16),C=n(10),_=n(5),E=n(39),D=n(32),N=null,j=null,R=function(){function e(t){a()(this,e),this.dom=null,this.opened=g.a.observable(!1),this.cmd=g.a.observable(""),this.focused=g.a.observable(!1),this.themes=E.a.themes,this.cmdHistory=[],this.cmdHistoryShift=0,this.cmdHelper=g.a.observable(""),this.cmds=["help","version","clear","theme","lang"],this.cmdsWithParameters=["theme","lang"],this.isAdmin=!1,this.dom=t,this.isAdmin=!!_.appSettingsGet("admin")}return e.prototype.runCmd=function(e,t,i){var o,a,r,s="",c=null;if(this.cmdHelper(""),i){switch(e){case"lang":c=(this.isAdmin?D.a.languagesAdmin():D.a.languages()).filter(function(e){return 0===e.lastIndexOf(t,0)});break;case"theme":c=E.a.themes().filter(function(e){return 0===e.lastIndexOf(t,0)})}if(e&&c)if(1===c.length&&c[0])this.cmd(e+" "+c[0]);else if(1").html(n(129).replace("{{ cmd }}",i))),c&&l.append(f()("
").html(c)),h.a.delay(function(){t.dom.find(".rl-cmd-history").scrollTop(l.height())},50))}return!0},e.prototype.onEsc=function(){return this.opened(!1),!1},e.prototype.onTab=function(){return this.onCmd(!0),!1},e.prototype.onEnter=function(){return this.onCmd(!1),this.cmd(""),!1},e.prototype.onKeyDown=function(e){if(e&&e.keyCode&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&0').appendTo("body"),w.$win.on("error",function(e){if(e&&e.originalEvent&&e.originalEvent.message&&-1===Object(A.inArray)(e.originalEvent.message,["Script error.","Uncaught Error: Error calling method on NPObject."])){var t=Object(A.timestamp)();if(o.lastErrorTime>=t)return;o.lastErrorTime=t,n.jsError(A.noop,e.originalEvent.message,e.originalEvent.filename,e.originalEvent.lineno,d.a.location&&d.a.location.toString?d.a.location.toString():"",w.$html.attr("class"),Object(A.microtime)()-w.startMicrotime)}}),w.$win.on("resize",function(){I.a("window.resize")}),I.b("window.resize",h.a.throttle(function(){var e=w.$win.height(),t=w.$win.height();w.$win.__sizes[0]===e&&w.$win.__sizes[1]===t||(w.$win.__sizes[0]=e,w.$win.__sizes[1]=t,I.a("window.resize.real"))},O.Magics.Time50ms)),w.$doc.on("keydown",function(e){e&&e.ctrlKey&&w.$html.addClass("rl-ctrl-key-pressed")}).on("keyup",function(e){e&&!e.ctrlKey&&w.$html.removeClass("rl-ctrl-key-pressed")}),w.$doc.on("mousemove keypress click",h.a.debounce(function(){I.a("rl.auto-logout-refresh")},O.Magics.Time5s)),v()("esc, enter",O.KeyState.All,function(){Object(A.detectDropdownVisibility)()}),_.appSettingsGet("allowCmdInterface")&&v()("ctrl+shift+`",O.KeyState.All,function(){_.appSettingsGet("allowCmdInterface")&&(i(),h.a.delay(function(){j&&(j.opened(!j.opened()),j.opened()&&h.a.delay(function(){j&&j.focused&&j.focused(!0)},O.Magics.Time50ms))},O.Magics.Time50ms))}),o}return l()(t,e),t.prototype.remote=function(){return null},t.prototype.data=function(){return null},t.prototype.getApplicationConfiguration=function(e,t){return this.applicationConfiguration[e]||t},t.prototype.download=function(e){if(w.sUserAgent&&(-10&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=!!_.appSettingsGet("inIframe"),o=Object(A.pString)(_.appSettingsGet("customLogoutLink"));t&&this.clearClientSideToken(),t&&n&&d.a.close&&d.a.close(),o=o||(e?Object(T.x)():Object(T.y)()),t&&d.a.location.href!==o?h.a.delay(function(){i&&d.a.parent?d.a.parent.location.href=o:d.a.location.href=o,w.$win.trigger("rl.tooltips.diactivate")},O.Magics.Time100ms):(Object(P.routeOff)(),Object(P.setHash)(Object(T.w)(),!0),Object(P.routeOff)(),h.a.delay(function(){i&&d.a.parent?d.a.parent.location.reload():d.a.location.reload(),w.$win.trigger("rl.tooltips.diactivate")},O.Magics.Time100ms))},t.prototype.historyBack=function(){d.a.history.back()},t.prototype.bootstart=function(){I.a("rl.bootstart");var e=_.appSettingsGet("mobile");g.a.components.register("SaveTrigger",n(128).default),g.a.components.register("Input",n(127).default),g.a.components.register("Select",n(126).default),g.a.components.register("Radio",n(121).default),g.a.components.register("TextArea",n(125).default),g.a.components.register("Date",n(124).default),g.a.components.register("x-script",n(123).default),_.appSettingsGet("materialDesign")&&w.bAnimationSupported?(g.a.components.register("Checkbox",n(122).default),g.a.components.register("CheckboxSimple",n(80).default)):(g.a.components.register("Checkbox",n(80).default),g.a.components.register("CheckboxSimple",n(80).default)),Object(C.initOnStartOrLangChange)(C.initNotificationLanguage),h.a.delay(A.windowResizeCallback,O.Magics.Time1s),I.b("ssm.mobile-enter",function(){Object(w.leftPanelDisabled)(!0)}),I.b("ssm.mobile-leave",function(){Object(w.leftPanelDisabled)(!1)}),e?(w.$html.addClass("ssm-state-mobile").addClass("rl-mobile"),I.a("ssm.mobile-enter")):(w.$html.addClass("rl-desktop"),y.a.addState({id:"mobile",query:"(max-width: 767px)",onEnter:function(){w.$html.addClass("ssm-state-mobile"),I.a("ssm.mobile-enter")},onLeave:function(){w.$html.removeClass("ssm-state-mobile"),I.a("ssm.mobile-leave")}}),y.a.addState({id:"tablet",query:"(min-width: 768px) and (max-width: 999px)",onEnter:function(){w.$html.addClass("ssm-state-tablet")},onLeave:function(){w.$html.removeClass("ssm-state-tablet")}}),y.a.addState({id:"desktop",query:"(min-width: 1000px) and (max-width: 1400px)",onEnter:function(){w.$html.addClass("ssm-state-desktop")},onLeave:function(){w.$html.removeClass("ssm-state-desktop")}}),y.a.addState({id:"desktop-large",query:"(min-width: 1401px)",onEnter:function(){w.$html.addClass("ssm-state-desktop-large")},onLeave:function(){w.$html.removeClass("ssm-state-desktop-large")}})),w.leftPanelDisabled.subscribe(function(e){w.$html.toggleClass("rl-left-panel-disabled",e),w.$html.toggleClass("rl-left-panel-enabled",!e)}),w.leftPanelType.subscribe(function(e){w.$html.toggleClass("rl-left-panel-none","none"===e),w.$html.toggleClass("rl-left-panel-short","short"===e)}),w.leftPanelDisabled.valueHasMutated(),D.a.populate(),E.a.populate(),x.a.populate()},t}(k)},function(e,t,n){"use strict";n.d(t,"a",function(){return v});var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(4),u=n.n(l),d=n(7),p=n.n(d),f=n(1),m=n(6),h=n(2),g=n(16),b=n(9),v=function(e){function t(n){o()(this,t);var i=r()(this,e.call(this,"settings",n));return i.menu=f.a.observableArray([]),i.oCurrentSubScreen=null,i.oViewModelPlace=null,i.setupSettings(),i}return c()(t,e),t.prototype.setupSettings=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;e&&e()},t.prototype.onRoute=function(e){var t=this,n=null,i=null,o=null,a=null;if((i=u.a.find(m.VIEW_MODELS.settings,function(t){return t&&t.__rlSettingsData&&e===t.__rlSettingsData.Route}))&&(u.a.find(m.VIEW_MODELS["settings-removed"],function(e){return e&&e===i})&&(i=null),i&&u.a.find(m.VIEW_MODELS["settings-disabled"],function(e){return e&&e===i})&&(i=null)),i){if(i.__builded&&i.__vm)n=i.__vm;else if((o=this.oViewModelPlace)&&1===o.length){n=new i,(a=p()("
").addClass("rl-settings-view-model").hide()).appendTo(o),n.viewModelDom=a,n.__rlSettingsData=i.__rlSettingsData,i.__dom=a,i.__builded=!0,i.__vm=n;var r={name:i.__rlSettingsData.Template};f.a.applyBindingAccessorsToNode(a[0],{translatorInit:!0,template:function(){return r}},n),Object(h.delegateRun)(n,"onBuild",[a])}else Object(h.log)("Cannot find sub settings view model position: SettingsSubScreen");n&&u.a.defer(function(){t.oCurrentSubScreen&&(Object(h.delegateRun)(t.oCurrentSubScreen,"onHide"),t.oCurrentSubScreen.viewModelDom.hide()),t.oCurrentSubScreen=n,t.oCurrentSubScreen&&(Object(h.delegateRun)(t.oCurrentSubScreen,"onBeforeShow"),t.oCurrentSubScreen.viewModelDom.show(),Object(h.delegateRun)(t.oCurrentSubScreen,"onShow"),Object(h.delegateRun)(t.oCurrentSubScreen,"onShowWithDelay",[],200),u.a.each(t.menu(),function(e){e.selected(n&&n.__rlSettingsData&&e.route===n.__rlSettingsData.Route)}),p()("#rl-content .b-settings .b-content .content").scrollTop(0)),Object(h.windowResize)()})}else Object(b.setHash)(Object(g.z)(),!1,!0)},t.prototype.onHide=function(){this.oCurrentSubScreen&&this.oCurrentSubScreen.viewModelDom&&(Object(h.delegateRun)(this.oCurrentSubScreen,"onHide"),this.oCurrentSubScreen.viewModelDom.hide())},t.prototype.onBuild=function(){var e=this;u.a.each(m.VIEW_MODELS.settings,function(t){t&&t.__rlSettingsData&&!u.a.find(m.VIEW_MODELS["settings-removed"],function(e){return e&&e===t})&&e.menu.push({route:t.__rlSettingsData.Route,label:t.__rlSettingsData.Label,selected:f.a.observable(!1),disabled:!!u.a.find(m.VIEW_MODELS["settings-disabled"],function(e){return e&&e===t})})}),this.oViewModelPlace=p()("#rl-content #rl-settings-subscreen")},t.prototype.routes=function(){var e=u.a.find(m.VIEW_MODELS.settings,function(e){return e&&e.__rlSettingsData&&e.__rlSettingsData.IsDefault}),t=e&&e.__rlSettingsData?e.__rlSettingsData.Route:"general",n={subname:/^(.*)$/,normalize_:function(e,n){return n.subname=Object(h.isUnd)(n.subname)?t:Object(h.pString)(n.subname),[n.subname]}};return[["{subname}/",n],["{subname}",n],["",n]]},t}(n(65).a)},function(e,t,n){"use strict";n.d(t,"a",function(){return v});var i=n(8),o=n.n(i),a=n(3),r=n.n(a),s=n(4),c=n.n(s),l=n(7),u=n.n(l),d=n(23),p=n(0),f=n(2),m=n(6),h=n(16),g=n(29),b=n(5),v=function(){function e(){o()(this,e),this.oRequests={}}return e.prototype.defaultResponse=function(e,t,n,i,o,a){var r=function(){p.StorageResultType.Success!==n&&m.data.bUnload&&(n=p.StorageResultType.Unload),p.StorageResultType.Success===n&&i&&!i.Result?(i&&-12&&void 0!==arguments[2]?arguments[2]:2e4,o=this,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:[],l=""===a,d=(new r.a.Date).getTime();(n=(t=t||{}).Action||"")&&0(new r.a.Date).getTime()-d),n&&o.oRequests[n]&&(o.oRequests[n].__aborted&&(a="abort"),o.oRequests[n]=null),o.defaultResponse(e,n,a,i,s,t)}),n&&03&&void 0!==arguments[3]&&arguments[3];this.defaultRequest(e,"JsInfo",{Type:t,Data:n,IsError:i?"1":"0"})},e.prototype.getPublicKey=function(e){this.defaultRequest(e,"GetPublicKey")},e.prototype.jsVersion=function(e,t){this.defaultRequest(e,"Version",{Version:t})},e}()},function(e,t,n){"use strict";n.d(t,"a",function(){return c});var i=n(8),o=n.n(i),a=n(1),r=n(6),s=n(5),c=function(){function e(){o()(this,e),this.allowLanguagesOnSettings=a.a.observable(!0),this.allowLanguagesOnLogin=a.a.observable(!0),this.newMoveToFolder=a.a.observable(!0),this.interfaceAnimation=a.a.observable(!0),this.interfaceAnimation.subscribe(function(e){var t=r.bMobileDevice||!e;r.$html.toggleClass("rl-anim",!t).toggleClass("no-rl-anim",t)}),this.interfaceAnimation.valueHasMutated(),this.prem=a.a.observable(!1),this.community=a.a.observable(!0)}return e.prototype.populate=function(){this.allowLanguagesOnLogin(!!s.settingsGet("AllowLanguagesOnLogin")),this.allowLanguagesOnSettings(!!s.settingsGet("AllowLanguagesOnSettings")),this.newMoveToFolder(!!s.settingsGet("NewMoveToFolder")),this.interfaceAnimation(!!s.settingsGet("InterfaceAnimation")),this.prem(!!s.settingsGet("PremType")),this.community(!!s.settingsGet("Community"))},e}()},function(e,t,n){"use strict";var i=n(3),o=n.n(i),a=n(2),r=n(6),s=n(0),c=n(29),l=n(10),u=n(44);t.a=function(e){r.data.__APP__=e,r.$win.on("keydown",a.killCtrlACtrlS).on("unload",function(){r.data.bUnload=!0}),r.$html.addClass(r.bMobileDevice?"mobile":"no-mobile").on("click.dropdown.data-api",a.detectDropdownVisibility);var t=o.a.rl||{};t.i18n=l.i18n,t.createCommand=a.createCommandLegacy,t.addSettingsViewModel=c.b,t.addSettingsViewModelForAdmin=c.c,t.addHook=c.a,t.settingsGet=c.d,t.pluginSettingsGet=c.h,t.pluginRemoteRequest=c.e,t.EmailModel=u.EmailModel,t.Enums=s,o.a.rl=t,o.a.__APP_BOOT=function(t){Object(a.domReady)(function(){o.a.setTimeout(function(){o.a.rainloopTEMPLATES&&o.a.rainloopTEMPLATES[0]?(o.a.document.getElementById("rl-templates").innerHTML=o.a.rainloopTEMPLATES[0],o.a.setTimeout(function(){r.$html.removeClass("no-js rl-booted-trigger").addClass("rl-booted"),e.bootstart()},s.Magics.Time10ms)):t(),o.a.__APP_BOOT=null},s.Magics.Time10ms)})}}},,,,function(e,t,n){"use strict";n.r(t);var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(27),u=n(4),d=n.n(u),p=n(1),f=n(2),m=function(e){function t(){return o()(this,t),r()(this,e.apply(this,arguments))}return c()(t,e),t}(function(e){function t(n){o()(this,t);var i=r()(this,e.call(this));return i.values=p.a.observableArray([]),i.value=n.value,!Object(f.isUnd)(i.value)&&i.value.subscribe||(i.value=p.a.observable("")),i.inline=!Object(f.isUnd)(n.inline)&&n.inline,i.readOnly=!Object(f.isUnd)(n.readOnly)&&!!n.readOnly,n.values&&i.values(d.a.map(n.values,function(e,t){return{label:e,value:t}})),i.click=d.a.bind(i.click,i),i}return c()(t,e),t.prototype.click=function(e){!this.readOnly&&e&&this.value(e.value)},t}(l.a));t.default=Object(l.b)(m,"RadioComponent")},function(e,t,n){"use strict";n.r(t);var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(4),u=n.n(l),d=n(1),p=n(27),f=function(e){function t(n){o()(this,t);var i=r()(this,e.call(this,n));return i.animationBox=d.a.observable(!1).extend({falseTimeout:200}),i.animationCheckmark=d.a.observable(!1).extend({falseTimeout:200}),i.animationBoxSetTrue=u.a.bind(i.animationBoxSetTrue,i),i.animationCheckmarkSetTrue=u.a.bind(i.animationCheckmarkSetTrue,i),i.disposable.push(i.value.subscribe(function(e){i.triggerAnimation(e)},i)),i}return c()(t,e),t.prototype.animationBoxSetTrue=function(){this.animationBox(!0)},t.prototype.animationCheckmarkSetTrue=function(){this.animationCheckmark(!0)},t.prototype.triggerAnimation=function(e){e?(this.animationBoxSetTrue(),u.a.delay(this.animationCheckmarkSetTrue,200)):(this.animationCheckmarkSetTrue(),u.a.delay(this.animationBoxSetTrue,200))},t}(n(74).a);t.default=Object(p.b)(f,"CheckboxMaterialDesignComponent")},function(e,t,n){"use strict";n.r(t);var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(7),u=n.n(l),d=n(27),p=function(e){function t(n){o()(this,t);var i=r()(this,e.call(this));if(n.component&&n.component.templateNodes&&n.element&&n.element[0]&&n.element[0].outerHTML){var a=n.element[0].outerHTML;(a=a?a.replace(/<\/b><\/x-script>/i,"<\/script>"):"")?(n.element.text(""),n.element.replaceWith(u()(a).text(n.component.templateNodes[0]&&n.component.templateNodes[0].nodeValue?n.component.templateNodes[0].nodeValue:""))):n.element.remove()}return i}return c()(t,e),t}(d.a);t.default=Object(d.b)(p,"ScriptComponent")},function(e,t,n){"use strict";n.r(t);var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(27),u=function(e){function t(){return o()(this,t),r()(this,e.apply(this,arguments))}return c()(t,e),t}(n(47).a);t.default=Object(l.b)(u,"DateComponent")},function(e,t,n){"use strict";n.r(t);var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(2),u=n(27),d=5,p=function(e){function t(n){o()(this,t);var i=r()(this,e.call(this,n));return i.rows=n.rows||d,i.spellcheck=!Object(l.isUnd)(n.spellcheck)&&!!n.spellcheck,i}return c()(t,e),t}(n(47).a);t.default=Object(u.b)(p,"TextAreaComponent")},function(e,t,n){"use strict";n.r(t);var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(10),u=n(2),d=n(27),p=function(e){function t(n){o()(this,t);var i=r()(this,e.call(this,n));return i.options=n.options||"",i.optionsText=n.optionsText||null,i.optionsValue=n.optionsValue||null,i.optionsCaption=n.optionsCaption||null,i.optionsCaption&&(i.optionsCaption=Object(l.i18n)(i.optionsCaption)),i.defautOptionsAfterRender=u.defautOptionsAfterRender,i}return c()(t,e),t}(n(47).a);t.default=Object(d.b)(p,"SelectComponent")},function(e,t,n){"use strict";n.r(t);var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(27),u=function(e){function t(){return o()(this,t),r()(this,e.apply(this,arguments))}return c()(t,e),t}(n(47).a);t.default=Object(l.b)(u,"InputComponent")},function(e,t,n){"use strict";n.r(t);var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(2),u=n(0),d=n(27),p=function(e){function t(n){o()(this,t);var i=r()(this,e.call(this));return i.element=n.element||null,i.value=n.value&&n.value.subscribe?n.value:null,i.element&&(i.value?(i.element.css("display","inline-block"),n.verticalAlign&&i.element.css("vertical-align",n.verticalAlign),i.setState(i.value()),i.disposable.push(i.value.subscribe(i.setState,i))):i.element.hide()),i}return c()(t,e),t.prototype.setState=function(e){switch(Object(l.pInt)(e)){case u.SaveSettingsStep.TrueResult:this.element.find(".animated,.error").hide().removeClass("visible").end().find(".success").show().addClass("visible");break;case u.SaveSettingsStep.FalseResult:this.element.find(".animated,.success").hide().removeClass("visible").end().find(".error").show().addClass("visible");break;case u.SaveSettingsStep.Animate:this.element.find(".error,.success").hide().removeClass("visible").end().find(".animated").show().addClass("visible");break;case u.SaveSettingsStep.Idle:default:this.element.find(".animated").hide().end().find(".error,.success").removeClass("visible")}},t}(d.a);t.default=Object(d.b)(p,"SaveTriggerComponent")},function(e,t){e.exports='> {{ cmd }}'},function(e,t){e.exports=' version: {{ version }}'},function(e,t){e.exports='lang [{{ langs }}]'},function(e,t){e.exports='theme [{{ themes }}]'},function(e,t){e.exports=' commands: {{ commands }}'},function(e,t){e.exports='Command not found: {{ cmd }}'},,,function(e,t,n){var i=n(58);i(i.S,"Object",{create:n(88)})},function(e,t,n){n(137);var i=n(40).Object;e.exports=function(e,t){return i.create(e,t)}},function(e,t,n){e.exports={default:n(138),__esModule:!0}},function(e,t,n){var i=n(52),o=n(61),a=function(e,t){if(o(e),!i(t)&&null!==t)throw TypeError(t+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,i){try{(i=n(94)(Function.call,n(72).f(Object.prototype,"__proto__").set,2))(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,n){return a(e,n),t?e.__proto__=n:i(e,n),e}}({},!1):void 0),check:a}},function(e,t,n){var i=n(58);i(i.S,"Object",{setPrototypeOf:n(140).set})},function(e,t,n){n(141),e.exports=n(40).Object.setPrototypeOf},function(e,t,n){e.exports={default:n(142),__esModule:!0}},function(e,t,n){n(81)("observable")},function(e,t,n){n(81)("asyncIterator")},function(e,t){},function(e,t,n){var i=n(43),o=n(102).f,a={}.toString,r="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return r&&"[object Window]"==a.call(e)?function(e){try{return o(e)}catch(e){return r.slice()}}(e):o(i(e))}},function(e,t,n){var i=n(92);e.exports=Array.isArray||function(e){return"Array"==i(e)}},function(e,t,n){var i=n(87),o=n(103),a=n(71);e.exports=function(e){var t=i(e),n=o.f;if(n)for(var r,s=n(e),c=a.f,l=0;s.length>l;)c.call(e,r=s[l++])&&t.push(r);return t}},function(e,t,n){var i=n(70)("meta"),o=n(52),a=n(46),r=n(49).f,s=0,c=Object.isExtensible||function(){return!0},l=!n(51)(function(){return c(Object.preventExtensions({}))}),u=function(e){r(e,i,{value:{i:"O"+ ++s,w:{}}})},d=e.exports={KEY:i,NEED:!1,fastKey:function(e,t){if(!o(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!a(e,i)){if(!c(e))return"F";if(!t)return"E";u(e)}return e[i].i},getWeak:function(e,t){if(!a(e,i)){if(!c(e))return!0;if(!t)return!1;u(e)}return e[i].w},onFreeze:function(e){return l&&d.NEED&&c(e)&&!a(e,i)&&u(e),e}}},function(e,t,n){"use strict";var i=n(41),o=n(46),a=n(42),r=n(58),s=n(105),c=n(150).KEY,l=n(51),u=n(85),d=n(83),p=n(70),f=n(60),m=n(82),h=n(81),g=n(149),b=n(148),v=n(61),S=n(43),y=n(67),w=n(64),A=n(88),O=n(147),T=n(72),C=n(49),_=n(87),E=T.f,D=C.f,N=O.f,j=i.Symbol,R=i.JSON,I=R&&R.stringify,x=f("_hidden"),P=f("toPrimitive"),k={}.propertyIsEnumerable,L=u("symbol-registry"),M=u("symbols"),F=u("op-symbols"),U=Object.prototype,H="function"==typeof j,G=i.QObject,B=!G||!G.prototype||!G.prototype.findChild,V=a&&l(function(){return 7!=A(D({},"a",{get:function(){return D(this,"a",{value:7}).a}})).a})?function(e,t,n){var i=E(U,t);i&&delete U[t],D(e,t,n),i&&e!==U&&D(U,t,i)}:D,q=function(e){var t=M[e]=A(j.prototype);return t._k=e,t},z=H&&"symbol"==typeof j.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof j},K=function(e,t,n){return e===U&&K(F,t,n),v(e),t=y(t,!0),v(n),o(M,t)?(n.enumerable?(o(e,x)&&e[x][t]&&(e[x][t]=!1),n=A(n,{enumerable:w(0,!1)})):(o(e,x)||D(e,x,w(1,{})),e[x][t]=!0),V(e,t,n)):D(e,t,n)},W=function(e,t){v(e);for(var n,i=g(t=S(t)),o=0,a=i.length;a>o;)K(e,n=i[o++],t[n]);return e},Y=function(e){var t=k.call(this,e=y(e,!0));return!(this===U&&o(M,e)&&!o(F,e))&&(!(t||!o(this,e)||!o(M,e)||o(this,x)&&this[x][e])||t)},$=function(e,t){if(e=S(e),t=y(t,!0),e!==U||!o(M,t)||o(F,t)){var n=E(e,t);return!n||!o(M,t)||o(e,x)&&e[x][t]||(n.enumerable=!0),n}},J=function(e){for(var t,n=N(S(e)),i=[],a=0;n.length>a;)o(M,t=n[a++])||t==x||t==c||i.push(t);return i},X=function(e){for(var t,n=e===U,i=N(n?F:S(e)),a=[],r=0;i.length>r;)!o(M,t=i[r++])||n&&!o(U,t)||a.push(M[t]);return a};H||(s((j=function(){if(this instanceof j)throw TypeError("Symbol is not a constructor!");var e=p(arguments.length>0?arguments[0]:void 0),t=function(n){this===U&&t.call(F,n),o(this,x)&&o(this[x],e)&&(this[x][e]=!1),V(this,e,w(1,n))};return a&&B&&V(U,e,{configurable:!0,set:t}),q(e)}).prototype,"toString",function(){return this._k}),T.f=$,C.f=K,n(102).f=O.f=J,n(71).f=Y,n(103).f=X,a&&!n(90)&&s(U,"propertyIsEnumerable",Y,!0),m.f=function(e){return q(f(e))}),r(r.G+r.W+r.F*!H,{Symbol:j});for(var Q="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),Z=0;Q.length>Z;)f(Q[Z++]);for(var ee=_(f.store),te=0;ee.length>te;)h(ee[te++]);r(r.S+r.F*!H,"Symbol",{for:function(e){return o(L,e+="")?L[e]:L[e]=j(e)},keyFor:function(e){if(!z(e))throw TypeError(e+" is not a symbol!");for(var t in L)if(L[t]===e)return t},useSetter:function(){B=!0},useSimple:function(){B=!1}}),r(r.S+r.F*!H,"Object",{create:function(e,t){return void 0===t?A(e):W(A(e),t)},defineProperty:K,defineProperties:W,getOwnPropertyDescriptor:$,getOwnPropertyNames:J,getOwnPropertySymbols:X}),R&&r(r.S+r.F*(!H||l(function(){var e=j();return"[null]"!=I([e])||"{}"!=I({a:e})||"{}"!=I(Object(e))})),"JSON",{stringify:function(e){if(void 0!==e&&!z(e)){for(var t,n,i=[e],o=1;arguments.length>o;)i.push(arguments[o++]);return"function"==typeof(t=i[1])&&(n=t),!n&&b(t)||(t=function(e,t){if(n&&(t=n.call(this,e,t)),!z(t))return t}),i[1]=t,I.apply(R,i)}}}),j.prototype[P]||n(53)(j.prototype,P,j.prototype.valueOf),d(j,"Symbol"),d(Math,"Math",!0),d(i.JSON,"JSON",!0)},function(e,t,n){n(151),n(146),n(145),n(144),e.exports=n(40).Symbol},function(e,t,n){e.exports={default:n(152),__esModule:!0}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t){e.exports=function(){}},function(e,t,n){"use strict";var i=n(155),o=n(154),a=n(89),r=n(43);e.exports=n(106)(Array,"Array",function(e,t){this._t=r(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,o(1)):o(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values"),a.Arguments=a.Array,i("keys"),i("values"),i("entries")},function(e,t,n){n(156);for(var i=n(41),o=n(53),a=n(89),r=n(60)("toStringTag"),s="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),c=0;c0?o(i(e),9007199254740991):0}},function(e,t,n){var i=n(43),o=n(162),a=n(161);e.exports=function(e){return function(t,n,r){var s,c=i(t),l=o(c.length),u=a(r,l);if(e&&n!=n){for(;l>u;)if((s=c[u++])!=s)return!0}else for(;l>u;u++)if((e||u in c)&&c[u]===n)return e||u||0;return!e&&-1}}},function(e,t,n){var i=n(49),o=n(61),a=n(87);e.exports=n(42)?Object.defineProperties:function(e,t){o(e);for(var n,r=a(t),s=r.length,c=0;s>c;)i.f(e,n=r[c++],t[n]);return e}},function(e,t,n){"use strict";var i=n(88),o=n(64),a=n(83),r={};n(53)(r,n(60)("iterator"),function(){return this}),e.exports=function(e,t,n){e.prototype=i(r,{next:o(1,n)}),a(e,t+" Iterator")}},function(e,t,n){var i=n(91),o=n(73);e.exports=function(e){return function(t,n){var a,r,s=String(o(t)),c=i(n),l=s.length;return c<0||c>=l?e?"":void 0:(a=s.charCodeAt(c))<55296||a>56319||c+1===l||(r=s.charCodeAt(c+1))<56320||r>57343?e?s.charAt(c):a:e?s.slice(c,c+2):r-56320+(a-55296<<10)+65536}}},function(e,t,n){"use strict";var i=n(166)(!0);n(106)(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=i(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t,n){n(167),n(157),e.exports=n(82).f("iterator")},function(e,t,n){e.exports={default:n(168),__esModule:!0}},function(e,t){e.exports='\n\n\t\n\t\n\t\n\t\n\t{{title}}\n\t\n\n\n\t
\n\t\t
{{subject}}
\n\t
\n\t
\n\t\t
{{date}}
\n\t\t
{{fromCreds}}
\n\t\t
{{toLabel}}: {{toCreds}}
\n\t\t
{{ccLabel}}: {{ccCreds}}
\n\t
\n\t
{{html}}
\n\n'},,function(e,t,n){"use strict";n.r(t);var i,o,a,r,s,c,l,u,d,p,f,m,h,g,b,v,S=n(8),y=n.n(S),w=n(12),A=n.n(w),O=n(11),T=n.n(O),C=n(3),_=n.n(C),E=n(4),D=n.n(E),N=n(1),j=n(55),R=n.n(j),I=n(16),x=n(10),P=n(0),k=n(2),L=n(5),M=n(38),F=n(48),U=n(68),H=new function e(){y()(this,e),this.plugins=N.a.observableArray([]),this.plugins.loading=N.a.observable(!1).extend({throttle:100}),this.plugins.error=N.a.observable("")},G=new function e(){y()(this,e),this.licensing=N.a.observable(!1),this.licensingProcess=N.a.observable(!1),this.licenseValid=N.a.observable(!1),this.licenseExpired=N.a.observable(0),this.licenseError=N.a.observable(""),this.licenseTrigger=N.a.observable(!1)},B=new function e(){y()(this,e),this.packages=N.a.observableArray([]),this.packages.loading=N.a.observable(!1).extend({throttle:100}),this.packagesReal=N.a.observable(!0),this.packagesMainUpdatable=N.a.observable(!0)},V=new function e(){y()(this,e),this.coreReal=N.a.observable(!0),this.coreChannel=N.a.observable("stable"),this.coreType=N.a.observable("stable"),this.coreUpdatable=N.a.observable(!0),this.coreAccess=N.a.observable(!0),this.coreWarning=N.a.observable(!1),this.coreChecking=N.a.observable(!1).extend({throttle:100}),this.coreUpdating=N.a.observable(!1).extend({throttle:100}),this.coreVersion=N.a.observable(""),this.coreRemoteVersion=N.a.observable(""),this.coreRemoteRelease=N.a.observable(""),this.coreVersionCompare=N.a.observable(-2)},q=n(21),z=n(9),K=n(29),W=n(114),Y=n(39),$=n(32),J=function(){function e(){var t=this;y()(this,e),this.language=$.a.language,this.languages=$.a.languages,this.languageAdmin=$.a.languageAdmin,this.languagesAdmin=$.a.languagesAdmin,this.theme=Y.a.theme,this.themes=Y.a.themes,this.capaThemes=F.a.themes,this.capaUserBackground=F.a.userBackground,this.capaGravatar=F.a.gravatar,this.capaAdditionalAccounts=F.a.additionalAccounts,this.capaIdentities=F.a.identities,this.capaAttachmentThumbnails=F.a.attachmentThumbnails,this.capaTemplates=F.a.templates,this.allowLanguagesOnSettings=M.a.allowLanguagesOnSettings,this.weakPassword=M.a.weakPassword,this.newMoveToFolder=M.a.newMoveToFolder,this.dataFolderAccess=M.a.dataFolderAccess,this.mainAttachmentLimit=N.a.observable(Object(k.pInt)(Object(L.settingsGet)("AttachmentLimit"))/(P.Magics.BitLength1024*P.Magics.BitLength1024)).extend({posInterer:25}),this.uploadData=Object(L.settingsGet)("PhpUploadSizes"),this.uploadDataDesc=this.uploadData&&(this.uploadData.upload_max_filesize||this.uploadData.post_max_size)?[this.uploadData.upload_max_filesize?"upload_max_filesize = "+this.uploadData.upload_max_filesize+"; ":"",this.uploadData.post_max_size?"post_max_size = "+this.uploadData.post_max_size:""].join(""):"",this.themesOptions=N.a.computed(function(){return D.a.map(t.themes(),function(e){return{optValue:e,optText:Object(k.convertThemeName)(e)}})}),this.languageFullName=N.a.computed(function(){return Object(k.convertLangName)(t.language())}),this.languageAdminFullName=N.a.computed(function(){return Object(k.convertLangName)(t.languageAdmin())}),this.attachmentLimitTrigger=N.a.observable(P.SaveSettingsStep.Idle),this.languageTrigger=N.a.observable(P.SaveSettingsStep.Idle),this.languageAdminTrigger=N.a.observable(P.SaveSettingsStep.Idle).extend({throttle:P.Magics.Time100ms}),this.themeTrigger=N.a.observable(P.SaveSettingsStep.Idle)}return e.prototype.onBuild=function(){var e=this;D.a.delay(function(){var t=Object(k.settingsSaveHelperSimpleFunction)(e.attachmentLimitTrigger,e),n=Object(k.settingsSaveHelperSimpleFunction)(e.languageTrigger,e),i=Object(k.settingsSaveHelperSimpleFunction)(e.themeTrigger,e),o=function(t){return function(){e.languageAdminTrigger(t),D.a.delay(function(){return e.languageAdminTrigger(P.SaveSettingsStep.Idle)},P.Magics.Time1s)}};e.mainAttachmentLimit.subscribe(function(e){q.a.saveAdminConfig(t,{AttachmentLimit:Object(k.pInt)(e)})}),e.language.subscribe(function(e){q.a.saveAdminConfig(n,{Language:Object(k.trim)(e)})}),e.languageAdmin.subscribe(function(t){e.languageAdminTrigger(P.SaveSettingsStep.Animate),Object(x.reload)(!0,t).then(o(P.SaveSettingsStep.TrueResult),o(P.SaveSettingsStep.FalseResult)).then(function(){q.a.saveAdminConfig(null,{LanguageAdmin:Object(k.trim)(t)})})}),e.theme.subscribe(function(t){Object(k.changeTheme)(t,e.themeTrigger),q.a.saveAdminConfig(i,{Theme:Object(k.trim)(t)})}),e.capaAdditionalAccounts.subscribe(function(e){q.a.saveAdminConfig(null,{CapaAdditionalAccounts:Object(k.boolToAjax)(e)})}),e.capaIdentities.subscribe(function(e){q.a.saveAdminConfig(null,{CapaIdentities:Object(k.boolToAjax)(e)})}),e.capaTemplates.subscribe(function(e){q.a.saveAdminConfig(null,{CapaTemplates:Object(k.boolToAjax)(e)})}),e.capaGravatar.subscribe(function(e){q.a.saveAdminConfig(null,{CapaGravatar:Object(k.boolToAjax)(e)})}),e.capaAttachmentThumbnails.subscribe(function(e){q.a.saveAdminConfig(null,{CapaAttachmentThumbnails:Object(k.boolToAjax)(e)})}),e.capaThemes.subscribe(function(e){q.a.saveAdminConfig(null,{CapaThemes:Object(k.boolToAjax)(e)})}),e.capaUserBackground.subscribe(function(e){q.a.saveAdminConfig(null,{CapaUserBackground:Object(k.boolToAjax)(e)})}),e.allowLanguagesOnSettings.subscribe(function(e){q.a.saveAdminConfig(null,{AllowLanguagesOnSettings:Object(k.boolToAjax)(e)})}),e.newMoveToFolder.subscribe(function(e){q.a.saveAdminConfig(null,{NewMoveToFolder:Object(k.boolToAjax)(e)})})},P.Magics.Time50ms)},e.prototype.selectLanguage=function(){Object(z.showScreenPopup)(n(101),[this.language,this.languages(),$.a.userLanguage()])},e.prototype.selectLanguageAdmin=function(){Object(z.showScreenPopup)(n(101),[this.languageAdmin,this.languagesAdmin(),$.a.userLanguageAdmin()])},e.prototype.phpInfoLink=function(){return Object(I.u)()},e}(),X=n(37),Q=function(){function e(){var t=this;y()(this,e),this.domains=U.a.domains,this.visibility=N.a.computed(function(){return t.domains.loading()?"visible":"hidden"}),this.domainForDeletion=N.a.observable(null).deleteAccessHelper(),this.onDomainListChangeRequest=D.a.bind(this.onDomainListChangeRequest,this),this.onDomainLoadRequest=D.a.bind(this.onDomainLoadRequest,this)}return e.prototype.createDomain=function(){Object(z.showScreenPopup)(n(176))},e.prototype.createDomainAlias=function(){Object(z.showScreenPopup)(n(190))},e.prototype.deleteDomain=function(e){this.domains.remove(e),q.a.domainDelete(this.onDomainListChangeRequest,e.name)},e.prototype.disableDomain=function(e){e.disabled(!e.disabled()),q.a.domainDisable(this.onDomainListChangeRequest,e.name,e.disabled())},e.prototype.onBuild=function(e){var t=this;e.on("click",".b-admin-domains-list-table .e-item .e-action",function(){var e=N.a.dataFor(this);e&&q.a.domain(t.onDomainLoadRequest,e.name)}),Object(X.a)().reloadDomainList()},e.prototype.onDomainLoadRequest=function(e,t){P.StorageResultType.Success===e&&t&&t.Result&&Object(z.showScreenPopup)(n(176),[t.Result])},e.prototype.onDomainListChangeRequest=function(){Object(X.a)().reloadDomainList()},e}(),Z=function(){function e(){y()(this,e),this.determineUserLanguage=M.a.determineUserLanguage,this.determineUserDomain=M.a.determineUserDomain,this.defaultDomain=N.a.observable(Object(L.settingsGet)("LoginDefaultDomain")).idleTrigger(),this.allowLanguagesOnLogin=M.a.allowLanguagesOnLogin,this.dummy=N.a.observable(!1)}return e.prototype.onBuild=function(){var e=this;D.a.delay(function(){var t=Object(k.settingsSaveHelperSimpleFunction)(e.defaultDomain.trigger,e);e.determineUserLanguage.subscribe(function(e){q.a.saveAdminConfig(null,{DetermineUserLanguage:Object(k.boolToAjax)(e)})}),e.determineUserDomain.subscribe(function(e){q.a.saveAdminConfig(null,{DetermineUserDomain:Object(k.boolToAjax)(e)})}),e.allowLanguagesOnLogin.subscribe(function(e){q.a.saveAdminConfig(null,{AllowLanguagesOnLogin:Object(k.boolToAjax)(e)})}),e.defaultDomain.subscribe(function(e){q.a.saveAdminConfig(t,{LoginDefaultDomain:Object(k.trim)(e)})})},50)},e}(),ee=n(18),te=n.n(ee),ne=(i=Object(z.command)(function(e){return""!==e.pdoDsn()&&""!==e.pdoUser()}),o=function(){function e(){var t=this;y()(this,e),this.defautOptionsAfterRender=k.defautOptionsAfterRender,this.enableContacts=N.a.observable(!!Object(L.settingsGet)("ContactsEnable")),this.contactsSync=N.a.observable(!!Object(L.settingsGet)("ContactsSync"));var n=[];Object(L.settingsGet)("SQLiteIsSupported")&&n.push("sqlite"),Object(L.settingsGet)("MySqlIsSupported")&&n.push("mysql"),Object(L.settingsGet)("PostgreSqlIsSupported")&&n.push("pgsql"),this.contactsSupported=00&&void 0!==arguments[0]?arguments[0]:null,t=null;t=n(188).default,Object(z.addSettingsViewModel)(J,"AdminSettingsGeneral","TABS_LABELS/LABEL_GENERAL_NAME","general",!0),Object(z.addSettingsViewModel)(Q,"AdminSettingsDomains","TABS_LABELS/LABEL_DOMAINS_NAME","domains"),Object(z.addSettingsViewModel)(Z,"AdminSettingsLogin","TABS_LABELS/LABEL_LOGIN_NAME","login"),t&&Object(z.addSettingsViewModel)(t,"AdminSettingsBranding","TABS_LABELS/LABEL_BRANDING_NAME","branding"),Object(z.addSettingsViewModel)(ne,"AdminSettingsContacts","TABS_LABELS/LABEL_CONTACTS_NAME","contacts"),Object(z.addSettingsViewModel)(ie,"AdminSettingsSecurity","TABS_LABELS/LABEL_SECURITY_NAME","security"),Object(z.addSettingsViewModel)(ae,"AdminSettingsSocial","TABS_LABELS/LABEL_INTEGRATION_NAME","integrations"),Object(z.addSettingsViewModel)(re,"AdminSettingsPlugins","TABS_LABELS/LABEL_PLUGINS_NAME","plugins"),Object(z.addSettingsViewModel)(se,"AdminSettingsPackages","TABS_LABELS/LABEL_PACKAGES_NAME","packages"),Object(z.addSettingsViewModel)(ce,"AdminSettingsAbout","TABS_LABELS/LABEL_ABOUT_NAME","about"),Object(K.g)(!0),e&&e()},t.prototype.onShow=function(){Object(X.a)().setWindowTitle("")},t}(W.a),ve=n(65),Se=(h=Object(z.view)({name:"View/Admin/Login",type:z.ViewType.Center,templateID:"AdminLogin"}),g=Object(z.command)(function(e){return!e.submitRequest()}),h((function(e,t,n,i,o){var a={};Object.keys(i).forEach(function(e){a[e]=i[e]}),a.enumerable=!!a.enumerable,a.configurable=!!a.configurable,("value"in a||a.initializer)&&(a.writable=!0),a=n.slice().reverse().reduce(function(n,i){return i(e,t,n)||n},a),o&&void 0!==a.initializer&&(a.value=a.initializer?a.initializer.call(o):void 0,a.initializer=void 0),void 0===a.initializer&&(Object.defineProperty(e,t,a),a=null)}((v=function(e){function t(){y()(this,t);var n=A()(this,e.call(this));return n.loginPowered=!!L.settingsGet("LoginPowered"),n.mobile=!!L.appSettingsGet("mobile"),n.mobileDevice=!!L.appSettingsGet("mobileDevice"),n.hideSubmitButton=!!L.appSettingsGet("hideSubmitButton"),n.login=N.a.observable(""),n.password=N.a.observable(""),n.loginError=N.a.observable(!1),n.passwordError=N.a.observable(!1),n.loginErrorAnimation=N.a.observable(!1).extend({falseTimeout:500}),n.passwordErrorAnimation=N.a.observable(!1).extend({falseTimeout:500}),n.loginFocus=N.a.observable(!1),n.formHidden=N.a.observable(!1),n.formError=N.a.computed(function(){return n.loginErrorAnimation()||n.passwordErrorAnimation()}),n.login.subscribe(function(){return n.loginError(!1)}),n.password.subscribe(function(){return n.passwordError(!1)}),n.loginError.subscribe(function(e){return n.loginErrorAnimation(!!e)}),n.passwordError.subscribe(function(e){n.passwordErrorAnimation(!!e)}),n.submitRequest=N.a.observable(!1),n.submitError=N.a.observable(""),n}return T()(t,e),t.prototype.submitCommand=function(){var e=this;return Object(k.triggerAutocompleteInputChange)(),this.loginError(!1),this.passwordError(!1),this.loginError(""===Object(k.trim)(this.login())),this.passwordError(""===Object(k.trim)(this.password())),!this.loginError()&&!this.passwordError()&&(this.submitRequest(!0),fe.$win.trigger("rl.tooltips.diactivate"),q.a.adminLogin(function(t,n){fe.$win.trigger("rl.tooltips.diactivate"),fe.$win.trigger("rl.tooltips.activate"),P.StorageResultType.Success===t&&n&&"AdminLogin"===n.Action?n.Result?Object(X.a)().loginAndLogoutReload(!0):n.ErrorCode&&(e.submitRequest(!1),e.submitError(Object(x.getNotification)(n.ErrorCode))):(e.submitRequest(!1),e.submitError(Object(x.getNotification)(P.Notification.UnknownError)))},this.login(),this.password()),!0)},t.prototype.onShow=function(){var e=this;Object(z.routeOff)(),D.a.delay(function(){e.loginFocus(!0)},P.Magics.Time100ms)},t.prototype.onHide=function(){this.loginFocus(!1)},t.prototype.onBuild=function(){Object(k.triggerAutocompleteInputChange)(!0)},t.prototype.submitForm=function(){this.submitCommand()},t}(me.a)).prototype,"submitCommand",[g],te()(v.prototype,"submitCommand"),v.prototype),b=v))||b),ye=function(e){function t(){return y()(this,t),A()(this,e.call(this,"login",[Se]))}return T()(t,e),t.prototype.onShow=function(){Object(X.a)().setWindowTitle("")},t}(ve.a),we=function(e){function t(){return y()(this,t),A()(this,e.call(this,q.a))}return T()(t,e),t.prototype.remote=function(){return q.a},t.prototype.reloadDomainList=function(){U.a.domains.loading(!0),q.a.domainList(function(e,t){U.a.domains.loading(!1),P.StorageResultType.Success===e&&t&&t.Result&&U.a.domains(D.a.map(t.Result,function(e,t){var n=e[0],i=e[1];return{name:t,disabled:N.a.observable(!n),alias:i,deleteAccess:N.a.observable(!1)}}))})},t.prototype.reloadPluginList=function(){H.plugins.loading(!0),q.a.pluginList(function(e,t){H.plugins.loading(!1),P.StorageResultType.Success===e&&t&&t.Result&&H.plugins(D.a.map(t.Result,function(e){return{name:e.Name,disabled:N.a.observable(!e.Enabled),configured:N.a.observable(!!e.Configured)}}))})},t.prototype.reloadPackagesList=function(){B.packages.loading(!0),B.packagesReal(!0),q.a.packagesList(function(e,t){if(B.packages.loading(!1),P.StorageResultType.Success===e&&t&&t.Result){B.packagesReal(!!t.Result.Real),B.packagesMainUpdatable(!!t.Result.MainUpdatable);var n=[],i={};D.a.each(B.packages(),function(e){e&&e.loading()&&(i[e.file]=e)}),Object(k.isArray)(t.Result.List)&&(n=D.a.compact(D.a.map(t.Result.List,function(e){return e?(e.loading=N.a.observable(!Object(k.isUnd)(i[e.file])),"core"!==e.type||e.canBeInstalled?e:null):null}))),B.packages(n)}else B.packagesReal(!1)})},t.prototype.updateCoreData=function(){V.coreUpdating(!0),q.a.updateCoreData(function(e,t){V.coreUpdating(!1),V.coreVersion(""),V.coreRemoteVersion(""),V.coreRemoteRelease(""),V.coreVersionCompare(-2),P.StorageResultType.Success===e&&t&&t.Result?(V.coreReal(!0),_.a.location.reload()):V.coreReal(!1)})},t.prototype.reloadCoreData=function(){V.coreChecking(!0),V.coreReal(!0),q.a.coreData(function(e,t){V.coreChecking(!1),P.StorageResultType.Success===e&&t&&t.Result?(V.coreReal(!!t.Result.Real),V.coreChannel(t.Result.Channel||"stable"),V.coreType(t.Result.Type||"stable"),V.coreUpdatable(!!t.Result.Updatable),V.coreAccess(!!t.Result.Access),V.coreWarning(!!t.Result.Warning),V.coreVersion(t.Result.Version||""),V.coreRemoteVersion(t.Result.RemoteVersion||""),V.coreRemoteRelease(t.Result.RemoteRelease||""),V.coreVersionCompare(Object(k.pInt)(t.Result.VersionCompare))):(V.coreReal(!1),V.coreChannel("stable"),V.coreType("stable"),V.coreWarning(!1),V.coreVersion(""),V.coreRemoteVersion(""),V.coreRemoteRelease(""),V.coreVersionCompare(-2))})},t.prototype.reloadLicensing=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];G.licensingProcess(!0),G.licenseError(""),q.a.licensing(function(e,t){G.licensingProcess(!1),P.StorageResultType.Success===e&&t&&t.Result&&Object(k.isNormal)(t.Result.Expired)?(G.licenseValid(!0),G.licenseExpired(Object(k.pInt)(t.Result.Expired)),G.licenseError(""),G.licensing(!0),M.a.prem(!0)):t&&t.ErrorCode&&-10&&void 0!==arguments[0]?arguments[0]:null;R.a&&R.a.end(),e&&e()},t.prototype.bootstart=function(){e.prototype.bootstart.call(this),M.a.populate(),F.a.populate(),Object(z.hideLoading)(),L.appSettingsGet("allowAdminPanel")?L.settingsGet("Auth")?Object(z.startScreens)([be]):Object(z.startScreens)([ye]):(Object(z.routeOff)(),Object(z.setHash)(Object(I.w)(),!0),Object(z.routeOff)(),D.a.defer(function(){_.a.location.href="/"})),this.bootend()},t}(n(113).a);t.default=new we},,,,function(e,t,n){"use strict";function i(e,t,n,i,o){var a={};return Object.keys(i).forEach(function(e){a[e]=i[e]}),a.enumerable=!!a.enumerable,a.configurable=!!a.configurable,("value"in a||a.initializer)&&(a.writable=!0),a=n.slice().reverse().reduce(function(n,i){return i(e,t,n)||n},a),o&&void 0!==a.initializer&&(a.value=a.initializer?a.initializer.call(o):void 0,a.initializer=void 0),void 0===a.initializer&&(Object.defineProperty(e,t,a),a=null),a}n.r(t),n.d(t,"DomainPopupView",function(){return x}),n.d(t,"default",function(){return x});var o,a,r,s,c,l,u,d,p=n(18),f=n.n(p),m=n(8),h=n.n(m),g=n(12),b=n.n(g),v=n(11),S=n.n(v),y=n(4),w=n.n(y),A=n(1),O=n(0),T=n(23),C=n(6),_=n(2),E=n(10),D=n(48),N=n(21),j=n(37),R=n(9),I=n(24),x=(o=Object(R.popup)({name:"View/Popup/Domain",templateID:"PopupsDomain"}),a=Object(R.command)(function(e){return e.canBeSaved()}),r=Object(R.command)(function(e){return e.canBeTested()}),s=Object(R.command)(),c=Object(R.command)(),l=Object(R.command)(),o((i((d=function(e){function t(){h()(this,t);var n=b()(this,e.call(this));return n.edit=A.a.observable(!1),n.saving=A.a.observable(!1),n.savingError=A.a.observable(""),n.page=A.a.observable("main"),n.sieveSettings=A.a.observable(!1),n.testing=A.a.observable(!1),n.testingDone=A.a.observable(!1),n.testingImapError=A.a.observable(!1),n.testingSieveError=A.a.observable(!1),n.testingSmtpError=A.a.observable(!1),n.testingImapErrorDesc=A.a.observable(""),n.testingSieveErrorDesc=A.a.observable(""),n.testingSmtpErrorDesc=A.a.observable(""),n.testingImapError.subscribe(function(e){e||n.testingImapErrorDesc("")}),n.testingSieveError.subscribe(function(e){e||n.testingSieveErrorDesc("")}),n.testingSmtpError.subscribe(function(e){e||n.testingSmtpErrorDesc("")}),n.imapServerFocus=A.a.observable(!1),n.sieveServerFocus=A.a.observable(!1),n.smtpServerFocus=A.a.observable(!1),n.name=A.a.observable(""),n.name.focused=A.a.observable(!1),n.imapServer=A.a.observable(""),n.imapPort=A.a.observable(""+T.h),n.imapSecure=A.a.observable(O.ServerSecure.None),n.imapShortLogin=A.a.observable(!1),n.useSieve=A.a.observable(!1),n.sieveAllowRaw=A.a.observable(!1),n.sieveServer=A.a.observable(""),n.sievePort=A.a.observable(""+T.o),n.sieveSecure=A.a.observable(O.ServerSecure.None),n.smtpServer=A.a.observable(""),n.smtpPort=A.a.observable(""+T.p),n.smtpSecure=A.a.observable(O.ServerSecure.None),n.smtpShortLogin=A.a.observable(!1),n.smtpAuth=A.a.observable(!0),n.smtpPhpMail=A.a.observable(!1),n.whiteList=A.a.observable(""),n.aliasName=A.a.observable(""),n.enableSmartPorts=A.a.observable(!1),n.allowSieve=A.a.computed(function(){return D.a.filters()&&D.a.sieve()}),n.headerText=A.a.computed(function(){var e=n.name(),t=n.aliasName(),i="";return n.edit()?(i=Object(E.i18n)("POPUPS_DOMAIN/TITLE_EDIT_DOMAIN",{NAME:e}),t&&(i+=" ← "+t)):i=""===e?Object(E.i18n)("POPUPS_DOMAIN/TITLE_ADD_DOMAIN"):Object(E.i18n)("POPUPS_DOMAIN/TITLE_ADD_DOMAIN_WITH_NAME",{NAME:e}),i}),n.domainDesc=A.a.computed(function(){var e=n.name();return!n.edit()&&e?Object(E.i18n)("POPUPS_DOMAIN/NEW_DOMAIN_DESC",{NAME:"*@"+e}):""}),n.domainIsComputed=A.a.computed(function(){var e=n.smtpPhpMail(),t=n.allowSieve(),i=n.useSieve();return""!==n.name()&&""!==n.imapServer()&&""!==n.imapPort()&&(!t||!i||""!==n.sieveServer()&&""!==n.sievePort())&&(""!==n.smtpServer()&&""!==n.smtpPort()||e)}),n.canBeTested=A.a.computed(function(){return!n.testing()&&n.domainIsComputed()}),n.canBeSaved=A.a.computed(function(){return!n.saving()&&n.domainIsComputed()}),n.page.subscribe(function(){n.sieveSettings(!1)}),n.imapServerFocus.subscribe(function(e){e&&""!==n.name()&&""===n.imapServer()&&n.imapServer(n.name().replace(/[.]?[*][.]?/g,""))}),n.sieveServerFocus.subscribe(function(e){e&&""!==n.imapServer()&&""===n.sieveServer()&&n.sieveServer(n.imapServer())}),n.smtpServerFocus.subscribe(function(e){e&&""!==n.imapServer()&&""===n.smtpServer()&&n.smtpServer(n.imapServer().replace(/imap/gi,"smtp"))}),n.imapSecure.subscribe(function(e){if(n.enableSmartPorts()){var t=Object(_.pInt)(n.imapPort());switch(Object(_.pString)(e)){case"0":case"2":O.Ports.ImapSsl===t&&n.imapPort(Object(_.pString)(O.Ports.Imap));break;case"1":O.Ports.Imap===t&&n.imapPort(Object(_.pString)(O.Ports.ImapSsl))}}}),n.smtpSecure.subscribe(function(e){if(n.enableSmartPorts()){var t=Object(_.pInt)(n.smtpPort());switch(Object(_.pString)(e)){case"0":O.Ports.SmtpSsl!==t&&O.Ports.SmtpStartTls!==t||n.smtpPort(Object(_.pString)(O.Ports.Smtp));break;case"1":O.Ports.Smtp!==t&&O.Ports.SmtpStartTls!==t||n.smtpPort(Object(_.pString)(O.Ports.SmtpSsl));break;case"2":O.Ports.Smtp!==t&&O.Ports.SmtpSsl!==t||n.smtpPort(Object(_.pString)(O.Ports.SmtpStartTls))}}}),n}return S()(t,e),t.prototype.createOrAddCommand=function(){this.saving(!0),N.a.createOrUpdateDomain(w.a.bind(this.onDomainCreateOrSaveResponse,this),!this.edit(),this.name(),this.imapServer(),Object(_.pInt)(this.imapPort()),this.imapSecure(),this.imapShortLogin(),this.useSieve(),this.sieveAllowRaw(),this.sieveServer(),Object(_.pInt)(this.sievePort()),this.sieveSecure(),this.smtpServer(),Object(_.pInt)(this.smtpPort()),this.smtpSecure(),this.smtpShortLogin(),this.smtpAuth(),this.smtpPhpMail(),this.whiteList())},t.prototype.testConnectionCommand=function(){this.page("main"),this.testingDone(!1),this.testingImapError(!1),this.testingSieveError(!1),this.testingSmtpError(!1),this.testing(!0),N.a.testConnectionForDomain(w.a.bind(this.onTestConnectionResponse,this),this.name(),this.imapServer(),Object(_.pInt)(this.imapPort()),this.imapSecure(),this.useSieve(),this.sieveServer(),Object(_.pInt)(this.sievePort()),this.sieveSecure(),this.smtpServer(),Object(_.pInt)(this.smtpPort()),this.smtpSecure(),this.smtpAuth(),this.smtpPhpMail())},t.prototype.whiteListCommand=function(){this.page("white-list")},t.prototype.backCommand=function(){this.page("main")},t.prototype.sieveCommand=function(){this.sieveSettings(!this.sieveSettings()),this.clearTesting()},t.prototype.onTestConnectionResponse=function(e,t){if(this.testing(!1),O.StorageResultType.Success===e&&t.Result){var n=!1,i=!1;this.testingDone(!0),this.testingImapError(!0!==t.Result.Imap),this.testingSieveError(!0!==t.Result.Sieve),this.testingSmtpError(!0!==t.Result.Smtp),this.testingImapError()&&t.Result.Imap&&(n=!0,this.testingImapErrorDesc(""),this.testingImapErrorDesc(t.Result.Imap)),this.testingSieveError()&&t.Result.Sieve&&(i=!0,this.testingSieveErrorDesc(""),this.testingSieveErrorDesc(t.Result.Sieve)),this.testingSmtpError()&&t.Result.Smtp&&(this.testingSmtpErrorDesc(""),this.testingSmtpErrorDesc(t.Result.Smtp)),this.sieveSettings()?!i&&n&&this.sieveSettings(!1):i&&!n&&this.sieveSettings(!0)}else this.testingImapError(!0),this.testingSieveError(!0),this.testingSmtpError(!0),this.sieveSettings(!1)},t.prototype.onDomainCreateOrSaveResponse=function(e,t){this.saving(!1),O.StorageResultType.Success===e&&t?t.Result?(Object(j.a)().reloadDomainList(),this.closeCommand()):O.Notification.DomainAlreadyExists===t.ErrorCode&&this.savingError(Object(E.i18n)("ERRORS/DOMAIN_ALREADY_EXISTS")):this.savingError(Object(E.i18n)("ERRORS/UNKNOWN_ERROR"))},t.prototype.clearTesting=function(){this.testing(!1),this.testingDone(!1),this.testingImapError(!1),this.testingSieveError(!1),this.testingSmtpError(!1)},t.prototype.onHide=function(){this.page("main"),this.sieveSettings(!1)},t.prototype.onShow=function(e){this.saving(!1),this.page("main"),this.sieveSettings(!1),this.clearTesting(),this.clearForm(),e&&(this.enableSmartPorts(!1),this.edit(!0),this.name(Object(_.trim)(e.Name)),this.imapServer(Object(_.trim)(e.IncHost)),this.imapPort(""+Object(_.pInt)(e.IncPort)),this.imapSecure(Object(_.trim)(e.IncSecure)),this.imapShortLogin(!!e.IncShortLogin),this.useSieve(!!e.UseSieve),this.sieveAllowRaw(!!e.SieveAllowRaw),this.sieveServer(Object(_.trim)(e.SieveHost)),this.sievePort(""+Object(_.pInt)(e.SievePort)),this.sieveSecure(Object(_.trim)(e.SieveSecure)),this.smtpServer(Object(_.trim)(e.OutHost)),this.smtpPort(""+Object(_.pInt)(e.OutPort)),this.smtpSecure(Object(_.trim)(e.OutSecure)),this.smtpShortLogin(!!e.OutShortLogin),this.smtpAuth(!!e.OutAuth),this.smtpPhpMail(!!e.OutUsePhpMail),this.whiteList(Object(_.trim)(e.WhiteList)),this.aliasName(Object(_.trim)(e.AliasName)),this.enableSmartPorts(!0))},t.prototype.onShowWithDelay=function(){""!==this.name()||C.bMobileDevice||this.name.focused(!0)},t.prototype.clearForm=function(){this.edit(!1),this.page("main"),this.sieveSettings(!1),this.enableSmartPorts(!1),this.savingError(""),this.name(""),this.name.focused(!1),this.imapServer(""),this.imapPort(""+T.h),this.imapSecure(O.ServerSecure.None),this.imapShortLogin(!1),this.useSieve(!1),this.sieveAllowRaw(!1),this.sieveServer(""),this.sievePort(""+T.o),this.sieveSecure(O.ServerSecure.None),this.smtpServer(""),this.smtpPort(""+T.p),this.smtpSecure(O.ServerSecure.None),this.smtpShortLogin(!1),this.smtpAuth(!0),this.smtpPhpMail(!1),this.whiteList(""),this.aliasName(""),this.enableSmartPorts(!0)},t}(I.a)).prototype,"createOrAddCommand",[a],f()(d.prototype,"createOrAddCommand"),d.prototype),i(d.prototype,"testConnectionCommand",[r],f()(d.prototype,"testConnectionCommand"),d.prototype),i(d.prototype,"whiteListCommand",[s],f()(d.prototype,"whiteListCommand"),d.prototype),i(d.prototype,"backCommand",[c],f()(d.prototype,"backCommand"),d.prototype),i(d.prototype,"sieveCommand",[l],f()(d.prototype,"sieveCommand"),d.prototype),u=d))||u)},,,,,,,,,,,,function(e,t,n){"use strict";n.r(t),n.d(t,"BrandingAdminSettings",function(){return m}),n.d(t,"default",function(){return m});var i=n(8),o=n.n(i),a=n(4),r=n.n(a),s=n(1),c=n(0),l=n(2),u=n(10),d=n(21),p=n(38),f=n(5),m=function(){function e(){o()(this,e),this.capa=p.a.prem,this.title=s.a.observable(Object(f.settingsGet)("Title")).idleTrigger(),this.loadingDesc=s.a.observable(Object(f.settingsGet)("LoadingDescription")).idleTrigger(),this.faviconUrl=s.a.observable(Object(f.settingsGet)("FaviconUrl")).idleTrigger(),this.loginLogo=s.a.observable(Object(f.settingsGet)("LoginLogo")||"").idleTrigger(),this.loginBackground=s.a.observable(Object(f.settingsGet)("LoginBackground")||"").idleTrigger(),this.userLogo=s.a.observable(Object(f.settingsGet)("UserLogo")||"").idleTrigger(),this.userLogoMessage=s.a.observable(Object(f.settingsGet)("UserLogoMessage")||"").idleTrigger(),this.userIframeMessage=s.a.observable(Object(f.settingsGet)("UserIframeMessage")||"").idleTrigger(),this.userLogoTitle=s.a.observable(Object(f.settingsGet)("UserLogoTitle")||"").idleTrigger(),this.loginDescription=s.a.observable(Object(f.settingsGet)("LoginDescription")).idleTrigger(),this.loginCss=s.a.observable(Object(f.settingsGet)("LoginCss")).idleTrigger(),this.userCss=s.a.observable(Object(f.settingsGet)("UserCss")).idleTrigger(),this.welcomePageUrl=s.a.observable(Object(f.settingsGet)("WelcomePageUrl")).idleTrigger(),this.welcomePageDisplay=s.a.observable(Object(f.settingsGet)("WelcomePageDisplay")).idleTrigger(),this.welcomePageDisplay.options=s.a.computed(function(){return Object(u.trigger)(),[{optValue:"none",optText:Object(u.i18n)("TAB_BRANDING/OPTION_WELCOME_PAGE_DISPLAY_NONE")},{optValue:"once",optText:Object(u.i18n)("TAB_BRANDING/OPTION_WELCOME_PAGE_DISPLAY_ONCE")},{optValue:"always",optText:Object(u.i18n)("TAB_BRANDING/OPTION_WELCOME_PAGE_DISPLAY_ALWAYS")}]}),this.loginPowered=s.a.observable(!!Object(f.settingsGet)("LoginPowered")),this.community=!0}return e.prototype.onBuild=function(){var e=this;r.a.delay(function(){var t=Object(l.settingsSaveHelperSimpleFunction)(e.title.trigger,e),n=Object(l.settingsSaveHelperSimpleFunction)(e.loadingDesc.trigger,e),i=Object(l.settingsSaveHelperSimpleFunction)(e.faviconUrl.trigger,e);e.title.subscribe(function(e){d.a.saveAdminConfig(t,{Title:Object(l.trim)(e)})}),e.loadingDesc.subscribe(function(e){d.a.saveAdminConfig(n,{LoadingDescription:Object(l.trim)(e)})}),e.faviconUrl.subscribe(function(e){d.a.saveAdminConfig(i,{FaviconUrl:Object(l.trim)(e)})})},c.Magics.Time50ms)},e}()},function(e,t,n){"use strict";n.r(t),n.d(t,"PluginPopupView",function(){return I}),n.d(t,"default",function(){return I});var i,o,a,r,s,c,l,u,d,p,f=n(18),m=n.n(f),h=n(8),g=n.n(h),b=n(12),v=n.n(b),S=n(11),y=n.n(S),w=n(4),A=n.n(w),O=n(1),T=n(19),C=n.n(T),_=n(0),E=n(2),D=n(10),N=n(21),j=n(9),R=n(24),I=(i=Object(j.popup)({name:"View/Popup/Plugin",templateID:"PopupsPlugin"}),o=Object(j.command)(function(e){return e.hasConfiguration()}),i((r=function(e){function t(){g()(this,t);var n=v()(this,e.call(this));return n.onPluginSettingsUpdateResponse=A.a.bind(n.onPluginSettingsUpdateResponse,n),n.saveError=O.a.observable(""),n.name=O.a.observable(""),n.readme=O.a.observable(""),n.configures=O.a.observableArray([]),n.hasReadme=O.a.computed(function(){return""!==n.readme()}),n.hasConfiguration=O.a.computed(function(){return 0"+n.readme()+""}},n.bDisabeCloseOnEsc=!0,n.sDefaultKeyScope=_.KeyState.All,n.tryToClosePopup=A.a.debounce(A.a.bind(n.tryToClosePopup,n),_.Magics.Time200ms),n}return y()(t,e),t.prototype.saveCommand=function(){var e={};e.Name=this.name(),A.a.each(this.configures(),function(t){var n=t.value();!1!==n&&!0!==n||(n=n?"1":"0"),e["_"+t.Name]=n}),this.saveError(""),N.a.pluginSettingsUpdate(this.onPluginSettingsUpdateResponse,e)},t.prototype.onPluginSettingsUpdateResponse=function(e,t){_.StorageResultType.Success===e&&t&&t.Result?this.cancelCommand():(this.saveError(""),t&&t.ErrorCode?this.saveError(Object(D.getNotification)(t.ErrorCode)):this.saveError(Object(D.getNotification)(_.Notification.CantSavePluginSettings)))},t.prototype.onShow=function(e){if(this.name(),this.readme(),this.configures([]),e){this.name(e.Name),this.readme(e.Readme);var t=e.Config;Object(E.isNonEmptyArray)(t)&&this.configures(A.a.map(t,function(e){return{value:O.a.observable(e[0]),placeholder:O.a.observable(e[6]),Name:e[1],Type:e[2],Label:e[3],Default:e[4],Desc:e[5]}}))}},t.prototype.tryToClosePopup=function(){var e=this,t=n(99);Object(j.isPopupVisible)(t)||Object(j.showScreenPopup)(t,[Object(D.i18n)("POPUPS_ASK/DESC_WANT_CLOSE_THIS_WINDOW"),function(){e.modalVisibility()&&Object(E.delegateRun)(e,"cancelCommand")}])},t.prototype.onBuild=function(){var e=this;C()("esc",_.KeyState.All,function(){return e.modalVisibility()&&e.tryToClosePopup(),!1})},t}(R.a),s=r.prototype,c="saveCommand",l=[o],u=m()(r.prototype,"saveCommand"),d=r.prototype,p={},Object.keys(u).forEach(function(e){p[e]=u[e]}),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=l.slice().reverse().reduce(function(e,t){return t(s,c,e)||e},p),d&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(d):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(s,c,p),p=null),a=r))||a)},function(e,t,n){"use strict";n.r(t),n.d(t,"DomainAliasPopupView",function(){return I}),n.d(t,"default",function(){return I});var i,o,a,r,s,c,l,u,d,p,f=n(18),m=n.n(f),h=n(8),g=n.n(h),b=n(12),v=n.n(b),S=n(11),y=n.n(S),w=n(4),A=n.n(w),O=n(1),T=n(0),C=n(6),_=n(10),E=n(68),D=n(21),N=n(37),j=n(9),R=n(24),I=(i=Object(j.popup)({name:"View/Popup/DomainAlias",templateID:"PopupsDomainAlias"}),o=Object(j.command)(function(e){return e.canBeSaved()}),i((r=function(e){function t(){g()(this,t);var n=v()(this,e.call(this));return n.saving=O.a.observable(!1),n.savingError=O.a.observable(""),n.name=O.a.observable(""),n.name.focused=O.a.observable(!1),n.alias=O.a.observable(""),n.domains=E.a.domainsWithoutAliases,n.domainsOptions=O.a.computed(function(){return A.a.map(n.domains(),function(e){return{optValue:e.name,optText:e.name}})}),n.canBeSaved=O.a.computed(function(){return!n.saving()&&""!==n.name()&&""!==n.alias()}),n.onDomainAliasCreateOrSaveResponse=A.a.bind(n.onDomainAliasCreateOrSaveResponse,n),n}return y()(t,e),t.prototype.createCommand=function(){this.saving(!0),D.a.createDomainAlias(this.onDomainAliasCreateOrSaveResponse,this.name(),this.alias())},t.prototype.onDomainAliasCreateOrSaveResponse=function(e,t){this.saving(!1),T.StorageResultType.Success===e&&t?t.Result?(Object(N.a)().reloadDomainList(),this.closeCommand()):T.Notification.DomainAlreadyExists===t.ErrorCode&&this.savingError(Object(_.i18n)("ERRORS/DOMAIN_ALREADY_EXISTS")):this.savingError(Object(_.i18n)("ERRORS/UNKNOWN_ERROR"))},t.prototype.onShow=function(){this.clearForm()},t.prototype.onShowWithDelay=function(){""!==this.name()||C.bMobileDevice||this.name.focused(!0)},t.prototype.clearForm=function(){this.saving(!1),this.savingError(""),this.name(""),this.name.focused(!1),this.alias("")},t}(R.a),s=r.prototype,c="createCommand",l=[o],u=m()(r.prototype,"createCommand"),d=r.prototype,p={},Object.keys(u).forEach(function(e){p[e]=u[e]}),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=l.slice().reverse().reduce(function(e,t){return t(s,c,e)||e},p),d&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(d):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(s,c,p),p=null),a=r))||a)},function(e,t,n){"use strict";n.r(t);var i=n(117),o=n(172);Object(i.a)(o.default)}]); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/app.min.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/app.min.js new file mode 100755 index 00000000..80b03f4d --- /dev/null +++ b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/app.min.js @@ -0,0 +1 @@ +!function(e){function t(o){if(n[o])return n[o].exports;var i=n[o]={i:o,l:!1,exports:{}};return e[o].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="rainloop/v/0.0.0/static/js/min/",t(t.s=201)}([function(e,t,n){"use strict";n.r(t),n.d(t,"FileType",function(){return o}),n.d(t,"StorageResultType",function(){return i}),n.d(t,"Focused",function(){return a}),n.d(t,"State",function(){return r}),n.d(t,"StateType",function(){return s}),n.d(t,"Capa",function(){return c}),n.d(t,"KeyState",function(){return l}),n.d(t,"FolderType",function(){return u}),n.d(t,"ServerFolderType",function(){return d}),n.d(t,"LoginSignMeTypeAsString",function(){return p}),n.d(t,"LoginSignMeType",function(){return h}),n.d(t,"ComposeType",function(){return f}),n.d(t,"UploadErrorCode",function(){return m}),n.d(t,"SetSystemFoldersNotification",function(){return b}),n.d(t,"ClientSideKeyName",function(){return g}),n.d(t,"EventKeyCode",function(){return y}),n.d(t,"MessageSetAction",function(){return v}),n.d(t,"MessageSelectAction",function(){return S}),n.d(t,"DesktopNotification",function(){return O}),n.d(t,"MessagePriority",function(){return w}),n.d(t,"EditorDefaultType",function(){return T}),n.d(t,"ServerSecure",function(){return C}),n.d(t,"SearchDateType",function(){return A}),n.d(t,"SaveSettingsStep",function(){return E}),n.d(t,"Layout",function(){return F}),n.d(t,"FilterConditionField",function(){return j}),n.d(t,"FilterConditionType",function(){return N}),n.d(t,"FiltersAction",function(){return R}),n.d(t,"FilterRulesType",function(){return I}),n.d(t,"SignedVerifyStatus",function(){return L}),n.d(t,"ContactPropertyType",function(){return _}),n.d(t,"Magics",function(){return P}),n.d(t,"Ports",function(){return D}),n.d(t,"Notification",function(){return M});var o={Unknown:"unknown",Text:"text",Html:"html",Code:"code",Eml:"eml",WordText:"word-text",Pdf:"pdf",Image:"image",Audio:"audio",Video:"video",Sheet:"sheet",Presentation:"presentation",Certificate:"certificate",CertificateBin:"certificate-bin",Archive:"archive"},i={Success:"success",Abort:"abort",Error:"error",Unload:"unload"},a={None:"none",MessageList:"message-list",MessageView:"message-view",FolderList:"folder-list"},r={Empty:10,Login:20,Auth:30},s={Webmail:0,Admin:1},c={TwoFactor:"TWO_FACTOR",TwoFactorForce:"TWO_FACTOR_FORCE",OpenPGP:"OPEN_PGP",Prefetch:"PREFETCH",Gravatar:"GRAVATAR",Folders:"FOLDERS",Composer:"COMPOSER",Contacts:"CONTACTS",Reload:"RELOAD",Search:"SEARCH",SearchAdv:"SEARCH_ADV",MessageActions:"MESSAGE_ACTIONS",MessageListActions:"MESSAGELIST_ACTIONS",AttachmentsActions:"ATTACHMENTS_ACTIONS",DangerousActions:"DANGEROUS_ACTIONS",Settings:"SETTINGS",Help:"HELP",Themes:"THEMES",UserBackground:"USER_BACKGROUND",Sieve:"SIEVE",Filters:"FILTERS",AttachmentThumbnails:"ATTACHMENT_THUMBNAILS",Templates:"TEMPLATES",AutoLogout:"AUTOLOGOUT",AdditionalAccounts:"ADDITIONAL_ACCOUNTS",Identities:"IDENTITIES"},l={All:"all",None:"none",ContactList:"contact-list",MessageList:"message-list",FolderList:"folder-list",MessageView:"message-view",Compose:"compose",Settings:"settings",Menu:"menu",PopupComposeOpenPGP:"compose-open-pgp",PopupMessageOpenPGP:"message-open-pgp",PopupViewOpenPGP:"view-open-pgp",PopupKeyboardShortcutsHelp:"popup-keyboard-shortcuts-help",PopupAsk:"popup-ask"},u={Inbox:10,SentItems:11,Draft:12,Trash:13,Spam:14,Archive:15,NotSpam:80,User:99},d={USER:0,INBOX:1,SENT:2,DRAFTS:3,JUNK:4,TRASH:5,IMPORTANT:10,FLAGGED:11,ALL:12},p={DefaultOff:"defaultoff",DefaultOn:"defaulton",Unused:"unused"},h={DefaultOff:0,DefaultOn:1,Unused:2},f={Empty:"empty",Reply:"reply",ReplyAll:"replyall",Forward:"forward",ForwardAsAttachment:"forward-as-attachment",Draft:"draft",EditAsNew:"editasnew"},m={Normal:0,FileIsTooBig:1,FilePartiallyUploaded:2,FileNoUploaded:3,MissingTempFolder:4,FileOnSaveingError:5,FileType:98,Unknown:99},b={None:0,Sent:1,Draft:2,Spam:3,Trash:4,Archive:5},g={FoldersLashHash:0,MessagesInboxLastHash:1,MailBoxListSize:2,ExpandedFolders:3,FolderListSize:4,MessageListSize:5,LastReplyAction:6,LastSignMe:7,ComposeLastIdentityID:8,MessageHeaderFullInfo:9,MessageAttachmnetControls:10},y={Backspace:8,Tab:9,Enter:13,Esc:27,PageUp:33,PageDown:34,Left:37,Right:39,Up:38,Down:40,End:35,Home:36,Space:32,Insert:45,Delete:46,A:65,S:83},v={SetSeen:0,UnsetSeen:1,SetFlag:2,UnsetFlag:3},S={All:0,None:1,Invert:2,Unseen:3,Seen:4,Flagged:5,Unflagged:6},O={Allowed:0,NotAllowed:1,Denied:2,NotSupported:9},w={Low:5,Normal:3,High:1},T={Html:"Html",Plain:"Plain",HtmlForced:"HtmlForced",PlainForced:"PlainForced"},C={None:0,SSL:1,TLS:2},A={All:-1,Days3:3,Days7:7,Month:30},E={Animate:-2,Idle:-1,TrueResult:1,FalseResult:0},F={NoPreview:0,SidePreview:1,BottomPreview:2},j={From:"From",Recipient:"Recipient",Subject:"Subject",Header:"Header",Size:"Size"},N={Contains:"Contains",NotContains:"NotContains",EqualTo:"EqualTo",NotEqualTo:"NotEqualTo",Regex:"Regex",Over:"Over",Under:"Under"},R={None:"None",MoveTo:"MoveTo",Discard:"Discard",Vacation:"Vacation",Reject:"Reject",Forward:"Forward"},I={All:"All",Any:"Any"},L={UnknownPublicKeys:-4,UnknownPrivateKey:-3,Unverified:-2,Error:-1,None:0,Success:1},_={Unknown:0,FullName:10,FirstName:15,LastName:16,MiddleName:16,Nick:18,NamePrefix:20,NameSuffix:21,Email:30,Phone:31,Web:32,Birthday:40,Facebook:90,Skype:91,GitHub:92,Note:110,Custom:250},P={EventWhichMouseMiddle:3,ifvisibleIdle10s:10,BitLength2048:2048,BitLength1024:1024,Size350px:350,Size50px:50,Size20px:20,Size1px:1,Time30mInMin:30,Time60m:36e5,Time30m:18e5,Time20m:12e5,Time15m:9e5,Time10m:6e5,Time5m:3e5,Time3m:18e4,Time2m:12e4,Time1m:6e4,Time30s:3e4,Time10s:1e4,Time7s:7e3,Time5s:5e3,Time3s:3e3,Time1s:1e3,Time500ms:500,Time350ms:350,Time250ms:250,Time200ms:200,Time100ms:100,Time50ms:50,Time20ms:20,Time10ms:10,Time1ms:1},D={Imap:143,ImapSsl:993,Smtp:25,SmtpSsl:465,SmtpStartTls:587},M={InvalidToken:101,AuthError:102,AccessError:103,ConnectionError:104,CaptchaError:105,SocialFacebookLoginAccessDisable:106,SocialTwitterLoginAccessDisable:107,SocialGoogleLoginAccessDisable:108,DomainNotAllowed:109,AccountNotAllowed:110,AccountTwoFactorAuthRequired:120,AccountTwoFactorAuthError:121,CouldNotSaveNewPassword:130,CurrentPasswordIncorrect:131,NewPasswordShort:132,NewPasswordWeak:133,NewPasswordForbidden:134,ContactsSyncError:140,CantGetMessageList:201,CantGetMessage:202,CantDeleteMessage:203,CantMoveMessage:204,CantCopyMessage:205,CantSaveMessage:301,CantSendMessage:302,InvalidRecipients:303,CantSaveFilters:351,CantGetFilters:352,FiltersAreNotCorrect:355,CantCreateFolder:400,CantRenameFolder:401,CantDeleteFolder:402,CantSubscribeFolder:403,CantUnsubscribeFolder:404,CantDeleteNonEmptyFolder:405,CantSaveSettings:501,CantSavePluginSettings:502,DomainAlreadyExists:601,CantInstallPackage:701,CantDeletePackage:702,InvalidPluginPackage:703,UnsupportedPluginPackage:704,LicensingServerIsUnavailable:710,LicensingExpired:711,LicensingBanned:712,DemoSendMessageError:750,DemoAccountError:751,AccountAlreadyExists:801,AccountDoesNotExist:802,MailServerError:901,ClientViewError:902,InvalidInputArgument:903,AjaxFalse:950,AjaxAbort:951,AjaxParse:952,AjaxTimeout:953,UnknownNotification:999,UnknownError:999}},function(e,t,n){"use strict";var o=n(3),i=n.n(o),a=n(4),r=n.n(a),s=n(7),c=n.n(s),l=i.a.Opentip||{};l.styles=l.styles||{},l.styles.rainloop={extends:"standard",fixed:!0,target:!0,delay:.2,hideDelay:0,hideEffect:"fade",hideEffectDuration:.2,showEffect:"fade",showEffectDuration:.2,showOn:"mouseover click",removeElementsOnHide:!0,background:"#fff",shadow:!1,borderColor:"#999",borderRadius:2,borderWidth:1},l.styles.rainloopTip={extends:"rainloop",delay:.4,group:"rainloopTips"},l.styles.rainloopErrorTip={extends:"rainloop",className:"rainloopErrorTip"};var u=n(97),d=n.n(u),p=n(0),h=i.a.ko,f=c()(i.a);h.bindingHandlers.updateWidth={init:function(e,t){var n=c()(e),o=t(),a=function(){o(n.width()),i.a.setTimeout(function(){o(n.width())},p.Magics.Time500ms)};f.on("resize",a),a(),h.utils.domNodeDisposal.addDisposeCallback(e,function(){f.off("resize",a)})}},h.bindingHandlers.editor={init:function(e,t){var o=null,i=t(),a=n(95).default,r=function(){i&&i.__editor&&i.__editor.setHtmlOrPlain(i())},s=function(){i&&i.__editor&&i(i.__editor.getDataWithHtmlMark())};h.isObservable(i)&&a&&(o=new a(e,s,function(){i.__editor=o,r()},s),i.__fetchEditorValue=s,i.subscribe(r))}},h.bindingHandlers.json={init:function(e,t){c()(e).text(i.a.JSON.stringify(h.unwrap(t())))},update:function(e,t){c()(e).text(i.a.JSON.stringify(h.unwrap(t())))}},h.bindingHandlers.scrollerShadows={init:function(e){var t=c()(e),n=t.find("[data-scroller-shadows-content]")[0]||null,o=r.a.throttle(function(){t.toggleClass("scroller-shadow-top",8=n.left&&e.pageX<=n.left+t.width()){if(e.pageY>=o-100&&e.pageY<=o){var a=function(){t.scrollTop(t.scrollTop()+3),r.windowResize()};t.data("timerScroll",i.a.setInterval(a,10)),a()}if(e.pageY>=n.top&&e.pageY<=n.top+100){var s=function(){t.scrollTop(t.scrollTop()-3),r.windowResize()};t.data("timerScroll",i.a.setInterval(s,10)),s()}}})},u.stop=function(){c()(l).each(function(){var e=c()(this);i.a.clearInterval(e.data("timerScroll")),e.data("timerScroll",!1)})}),u.helper=function(e){return t()(e&&e.target?h.dataFor(e.target):null)},c()(e).draggable(u).on("mousedown.koDraggable",function(){r.removeInFocus()}),h.utils.domNodeDisposal.addDisposeCallback(e,function(){c()(e).off("mousedown.koDraggable").draggable("destroy")})}}},h.bindingHandlers.droppable={init:function(e,t,o){if(!n(6).bMobileDevice){var i=t(),a=o(),r=a&&a.droppableOver?a.droppableOver:null,s=a&&a.droppableOut?a.droppableOut:null,l={tolerance:"pointer",hoverClass:"droppableHover",drop:null,over:null,out:null};i&&(l.drop=function(e,t){i(e,t)},r&&(l.over=function(e,t){r(e,t)}),s&&(l.out=function(e,t){s(e,t)}),c()(e).droppable(l),h.utils.domNodeDisposal.addDisposeCallback(e,function(){c()(e).droppable("destroy")}))}}},h.bindingHandlers.nano={init:function(e){var t=n(6),o=n(5);t.bDisableNanoScroll||o.appSettingsGet("useNativeScrollbars")||c()(e).addClass("nano").nanoScroller({iOSNativeScrolling:!1,preventPageScrolling:!0})}},h.bindingHandlers.saveTrigger={init:function(e){var t=c()(e);t.data("save-trigger-type",t.is("input[type=text],input[type=email],input[type=password],select,textarea")?"input":"custom"),"custom"===t.data("save-trigger-type")?t.append('  ').addClass("settings-saved-trigger"):t.addClass("settings-saved-trigger-input")},update:function(e,t){var n=h.unwrap(t()),o=c()(e);if("custom"===o.data("save-trigger-type"))switch(n.toString()){case"1":o.find(".animated,.error").hide().removeClass("visible").end().find(".success").show().addClass("visible");break;case"0":o.find(".animated,.success").hide().removeClass("visible").end().find(".error").show().addClass("visible");break;case"-2":o.find(".error,.success").hide().removeClass("visible").end().find(".animated").show().addClass("visible");break;default:o.find(".animated").hide().end().find(".error,.success").removeClass("visible")}else switch(n.toString()){case"1":o.addClass("success").removeClass("error");break;case"0":o.addClass("error").removeClass("success");break;case"-2":break;default:o.removeClass("error success")}}},h.bindingHandlers.emailsTags={init:function(e,t,o){var i=n(2),a=n(44).default,s=c()(e),l=t(),u=o().autoCompleteSource||null,d=[",",";","\n"];s.inputosaurus({parseOnBlur:!0,allowDragAndDrop:!0,focusCallback:function(e){l&&l.focused&&l.focused(!!e)},inputDelimiters:d,autoCompleteSource:u,splitHook:function(e){var t=i.trim(e);return t&&-1=i&&(i=t),i===e()&&""+i!=""+n&&e(i+1),e(i)}});return i(e()),i},h.extenders.limitedList=function(e,t){var o=n(2),i=h.computed({read:e,write:function(n){var i=h.unwrap(e),a=h.unwrap(t);o.isNonEmptyArray(a)?-11&&void 0!==arguments[1])||arguments[1];return!!i(e)&&(t?/^[0-9]*$/.test(e.toString()):/^[1-9]+[0-9]*$/.test(e.toString()))}function r(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=i(e)&&""!==e?ce.a.parseInt(e,10):t;return ce.a.isNaN(n)?t:n}function s(e){return i(e)?""+e:""}function c(e){return!!e}function l(e){return e?"1":"0"}function u(e){return Te(e)&&00&&void 0!==arguments[0]?arguments[0]:32,t="0123456789abcdefghijklmnopqrstuvwxyz",n=t.length;e=r(e);for(var o="";o.length1&&void 0!==arguments[1]?arguments[1]:100,n="",o="",i=e,a=0,r=0;i.length>t;)a=(o=i.substring(0,t)).lastIndexOf(" "),-1!==(r=o.lastIndexOf("\n"))&&(a=r),-1===a&&(a=t),n+=o.substring(0,a)+"\n",i=i.substring(a+1);return n+i}function v(){try{if(ce.a.document.activeElement)return Ee(ce.a.document.activeElement.__inFocusCache)&&(ce.a.document.activeElement.__inFocusCache=ue()(ce.a.document.activeElement).is("input,textarea,iframe,.cke_editable")),!!ce.a.document.activeElement.__inFocusCache}catch(e){}return!1}function S(e){if(ce.a.document&&ce.a.document.activeElement&&ce.a.document.activeElement.blur)try{var t=ue()(ce.a.document.activeElement);t&&t.is("input,textarea")?ce.a.document.activeElement.blur():e&&ce.a.document.activeElement.blur()}catch(e){}}function O(){try{if(ce.a&&ce.a.getSelection){var e=ce.a.getSelection();e&&e.removeAllRanges&&e.removeAllRanges()}else ce.a.document&&ce.a.document.selection&&ce.a.document.selection.empty&&ce.a.document.selection.empty()}catch(e){}}function w(e,t){e=Oe(e.toUpperCase()),t=Oe(t.replace(/[\s]+/g," "));var n=!1,o="RE"===e,i="FWD"===e,a=[],r=!i;return""!==t&&pe.a.each(t.split(":"),function(e){var t=Oe(e);n||!/^(RE|FWD)$/i.test(t)&&!/^(RE|FWD)[\[\(][\d]+[\]\)]$/i.test(t)?(a.push(e),n=!0):(o||(o=!!/^RE/i.test(t)),i||(i=!!/^FWD/i.test(t)))}),r?o=!1:i=!1,Oe((r?"Re: ":"Fwd: ")+(o?"Re: ":"")+(i?"Fwd: ":"")+Oe(a.join(":")))}function T(e,t){return ce.a.Math.round(e*ce.a.Math.pow(10,t))/ce.a.Math.pow(10,t)}function C(e){switch(e=r(e),!0){case 1073741824<=e:return T(e/1073741824,1)+"GB";case 1048576<=e:return T(e/1048576,1)+"MB";case 1024<=e:return T(e/1024,0)+"KB"}return e+"B"}function A(e){ce.a.console&&ce.a.console.log&&ce.a.console.log(e)}function E(e,t,n){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;e&&e[t]&&(o=r(o),n=Te(n)?n:[],0>=o?e[t].apply(e,n):pe.a.delay(function(){e[t].apply(e,n)},o))}function F(e){if((e=e||ce.a.event)&&e.ctrlKey&&!e.shiftKey&&!e.altKey){var t=e.keyCode||e.which;if(t===ge.EventKeyCode.S)return void e.preventDefault();if(t===ge.EventKeyCode.A){var n=e.target||e.srcElement;if(n&&("true"==""+n.contentEditable||n.tagName&&n.tagName.match(/INPUT|TEXTAREA/i)))return;ce.a.getSelection?ce.a.getSelection().removeAllRanges():ce.a.document.selection&&ce.a.document.selection.clear&&ce.a.document.selection.clear(),e.preventDefault()}}}function j(e,t){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],o=null;return(o=t?function(){for(var n=arguments.length,i=Array(n),a=0;a1&&void 0!==arguments[1]&&arguments[1];return n(10).i18n("LANGS_NAMES"+(!0===t?"_EN":"")+"/LANG_"+e.toUpperCase().replace(/[^a-zA-Z0-9]+/g,"_"),null,e)}function _(){return ue()('
 
').appendTo("#rl-hidden")}function P(e,t){t&&!Ee(t.disabled)&&e&&ue()(e).toggleClass("disabled",t.disabled).prop("disabled",t.disabled)}function D(e){e.find("blockquote.rl-bq-switcher").removeClass("rl-bq-switcher hidden-bq"),e.find(".rlBlockquoteSwitcher").off(".rlBlockquoteSwitcher").remove(),e.find("[data-html-editor-font-wrapper]").removeAttr("data-html-editor-font-wrapper")}function M(e,t,o,i){var a=e.title,r=e.subject,s=e.date,c=e.fromCreds,l=e.toCreds,u=e.toLabel,d=e.ccClass,p=e.ccCreds,h=e.ccLabel,f=ce.a.open(""),m=f.document,b=t.clone(),y=o?"html":"plain";D(b);var v=b?b.html():"";m.write(n(170).replace("{{title}}",g(a)).replace("{{subject}}",g(r)).replace("{{date}}",g(s)).replace("{{fromCreds}}",g(c)).replace("{{toCreds}}",g(l)).replace("{{toLabel}}",g(u)).replace("{{ccClass}}",g(d)).replace("{{ccCreds}}",g(p)).replace("{{ccLabel}}",g(h)).replace("{{bodyClass}}",y).replace("{{html}}",v)),m.close(),i&&ce.a.setTimeout(function(){return f.print()},100)}function k(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1e3;return o=r(o),function(i,a,r,s,c){t.call(n,a&&a.Result?ge.SaveSettingsStep.TrueResult:ge.SaveSettingsStep.FalseResult),e&&e.call(n,i,a,r,s,c),pe.a.delay(function(){t.call(n,ge.SaveSettingsStep.Idle)},o)}}function x(e,t){return k(null,e,t,1e3)}function U(e,t,n,o){return function(i){if(e){switch(n){case"bool":case"boolean":i=i?"1":"0";break;case"int":case"integer":case"number":i=r(i);break;case"trim":i=Oe(i);break;default:i=s(i)}var a={};a[t]=i,e.saveAdminConfig?e.saveAdminConfig(o||null,a):e.saveSettings&&e.saveSettings(o||null,a)}}}function H(e){return me.a?me.a.link(e,{newWindow:!0,stripPrefix:!1,urls:!0,email:!0,mention:!1,phone:!1,hashtag:!1,replaceFn:function(e){return!(e&&"url"===e.getType()&&e.matchedText&&0!==e.matchedText.indexOf("http"))}}):e}function B(e){var t,n=0,o=0,i=0,a=0,r=0,s="";for(s=e.replace(/]*><\/p>/gi,"").replace(/]*>([\s\S\r\n\t]*)<\/pre>/gim,function(){for(var e=arguments.length,t=Array(e),n=0;n").replace(/[\r]/gm,""):""}).replace(/[\s]+/gm," ").replace(/((?:href|data)\s?=\s?)("[^"]+?"|'[^']+?')/gim,function(){for(var e=arguments.length,t=Array(e),n=0;n]*>/gim,"\n").replace(/<\/h[\d]>/gi,"\n").replace(/<\/p>/gi,"\n\n").replace(/]*>/gim,"\n").replace(/<\/ul>/gi,"\n").replace(/]*>/gim," * ").replace(/<\/li>/gi,"\n").replace(/<\/td>/gi,"\n").replace(/<\/tr>/gi,"\n").replace(/]*>/gim,"\n_______________________________\n\n").replace(/]*>([\s\S\r\n]*)<\/div>/gim,function e(){for(var t=arguments.length,n=Array(t),o=0;o]*>([\s\S\r\n]*)<\/div>/gim,e),i="\n"+Oe(i)+"\n"),i}return""}).replace(/]*>/gim,"\n__bq__start__\n").replace(/<\/blockquote>/gim,"\n__bq__end__\n").replace(/]*>([\s\S\r\n]*?)<\/a>/gim,function(){for(var e=arguments.length,t=Array(e),n=0;n/gi,"\n").replace(/ /gi," ").replace(/"/gi,'"').replace(/<[^>]*>/gm,""),s=y(s=(s=be.$div.html(s).text()).replace(/\n[ \t]+/gm,"\n").replace(/[\n]{3,}/gm,"\n\n").replace(/>/gi,">").replace(/</gi,"<").replace(/&/gi,"&")),n=0,o=800;0 "+Oe(t).replace(/\n/gm,"\n> ")).replace(/(^|\n)([> ]+)/gm,function(){for(var e=arguments.length,t=Array(e),n=0;n1&&void 0!==arguments[1]&&arguments[1],n=!1,o=!0,i=!0,a=[],r="",s=0,c=(e=(e=e.toString().replace(/\r/g,"")).replace(/^>[> ]>+/gm,function(e){var t=e[0];return t?t.replace(/[ ]+/g,""):t})).split("\n");do{for(o=!1,a=[],s=0;s"===(r=c[s]).substr(0,1))&&!n?(o=!0,n=!0,a.push("~~~blockquote~~~"),a.push(r.substr(1))):!i&&n?""!==r?(n=!1,a.push("~~~/blockquote~~~"),a.push(r)):a.push(r):i&&n?a.push(r.substr(1)):a.push(r);n&&(n=!1,a.push("~~~/blockquote~~~")),c=a}while(o);return e=(e=c.join("\n")).replace(/&/g,"&").replace(/>/g,">").replace(/").replace(/[\s]*~~~\/blockquote~~~/g,"").replace(/\n/g,"
"),t?H(e):e}function K(e,t,n,o,a,r,s,c,l,u){var d=null,p=!1,h=0,f=0,m=[];for(u=!Ee(u)&&!!u,l=i(l)?l:00&&void 0!==arguments[0]&&arguments[0]?pe.a.delay(e,100):e()}function q(e){ke[e]||(ke[e]=ue()('script[type="application/json"][data-configuration="'+e+'"]'));try{return JSON.parse(ke[e].text())}catch(e){}return{}}function W(e,t){var n=t||e;n&&"function"==typeof n.dispose&&n.dispose()}function Y(e){e&&(Te(e.disposables)&&pe.a.each(e.disposables,W),he.a.utils.objectForEach(e,W))}function $(e){e&&(Te(e)?pe.a.each(e,function(e){$(e)}):e&&e.onDestroy&&e.onDestroy())}function J(e,t){return!(!e||!e[0]||(e[0].styleSheet&&!Ee(e[0].styleSheet.cssText)?e[0].styleSheet.cssText=t:e.text(t),0))}function X(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Re,n=ue()("#app-theme-link"),o=function(){xe=ce.a.setTimeout(function(){return t(ge.SaveSettingsStep.Idle)},1e3),Ue=null},i=ue()("#app-theme-style"),a=n.attr("href");a||(a=i.attr("data-href")),a&&("Json/"!==(a=(a=(a=a.toString().replace(/\/-\/[^\/]+\/\-\//,"/-/"+e+"/-/")).replace(/\/Css\/[^\/]+\/User\//,"/Css/0/User/")).replace(/\/Hash\/[^\/]+\//,"/Hash/-/")).substring(a.length-5,a.length)&&(a+="Json/"),ce.a.clearTimeout(xe),t(ge.SaveSettingsStep.Animate),Ue&&Ue.abort&&Ue.abort(),Ue=ue.a.ajax({url:a,dataType:"json"}).then(function(e){e&&Te(e)&&2===e.length&&(!n||!n[0]||i&&i[0]||(i=ue()(''),n.after(i),n.remove()),i&&i[0]&&J(i,e[1])&&i.attr("data-href",a).attr("data-theme",e[0]),t(ge.SaveSettingsStep.TrueResult))}).then(o,o))}function Z(e,t){return function(){var n=e(),o=t(),i=[],a=function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",a={current:e===n,name:""===o?e.toString():o.toString(),custom:""!==o,title:""===o?"":e.toString(),value:e.toString()};t?i.push(a):i.unshift(a)},r=0,s=0,c=2;if(1=n||o-2<=n)&&(c+=2),a(n),r=n,s=n);0=s)a(s,!0),c-=1;else if(0>=r)break;3===r?a(2,!1):3s&&a(Math.round((o+s)/2),!0,"..."),1s&&a(o,!0)}return i}}function Q(e){var t=(e=Oe(e).toLowerCase()).split(".").pop();return t===e?"":t}function ee(e){var t,n="application/octet-stream";return"winmail.dat"===(e=Oe(e).toLowerCase())?"application/ms-tnef":((t=Q(e))&&0this.height?[this.width-this.height,0]:[0,this.height-this.width],i.fillStyle="#fff",i.fillRect(0,0,t,t),i.drawImage(this,e[0]/2,e[1]/2,this.width-e[0],this.height-e[1],0,0,t,t),n(o.toDataURL("image/jpeg"))},o.src=e}function ie(e,t){if(e&&"mailto:"===e.toString().substr(0,7).toLowerCase()){if(!t)return!0;var o,i=[],a=null,r=null,c=(e=e.toString().substr(7)).replace(/\?.+$/,""),l=e.replace(/^[^\?]*\?/,""),u=n(44).default;return o=m(l),Ee(o.to)?i=u.parseEmailLine(c):(i=u.parseEmailLine(p(c+","+o.to)),i=pe.a.values(i.reduce(function(e,t){return t&&(e[t.email]&&e[t.email].name||(e[t.email]=t)),e},{}))),Ee(o.cc)||(a=u.parseEmailLine(p(o.cc))),Ee(o.bcc)||(r=u.parseEmailLine(p(o.bcc))),n(9).showScreenPopup(t,[ge.ComposeType.Empty,null,i,a,r,Ee(o.subject)?null:s(p(o.subject)),Ee(o.body)?null:G(s(p(o.body)))]),!0}return!1}function ae(e){ue()(function(){return e()})}function re(){He()}n.r(t);var se=n(3),ce=n.n(se),le=n(7),ue=n.n(le),de=n(4),pe=n.n(de),he=n(1),fe=n(96),me=n.n(fe),be=n(6),ge=n(0),ye={eml:"message/rfc822",mime:"message/rfc822",txt:"text/plain",text:"text/plain",def:"text/plain",list:"text/plain",in:"text/plain",ini:"text/plain",log:"text/plain",sql:"text/plain",cfg:"text/plain",conf:"text/plain",asc:"text/plain",rtx:"text/richtext",vcard:"text/vcard",vcf:"text/vcard",htm:"text/html",html:"text/html",csv:"text/csv",ics:"text/calendar",ifb:"text/calendar",xml:"text/xml",json:"application/json",swf:"application/x-shockwave-flash",hlp:"application/winhlp",wgt:"application/widget",chm:"application/vnd.ms-htmlhelp",p10:"application/pkcs10",p7c:"application/pkcs7-mime",p7m:"application/pkcs7-mime",p7s:"application/pkcs7-signature",torrent:"application/x-bittorrent",js:"application/javascript",pl:"text/perl",css:"text/css",asp:"text/asp",php:"application/x-httpd-php",php3:"application/x-httpd-php",php4:"application/x-httpd-php",php5:"application/x-httpd-php",phtml:"application/x-httpd-php",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",jpe:"image/jpeg",jfif:"image/jpeg",gif:"image/gif",bmp:"image/bmp",cgm:"image/cgm",ief:"image/ief",ico:"image/x-icon",tif:"image/tiff",tiff:"image/tiff",svg:"image/svg+xml",svgz:"image/svg+xml",djv:"image/vnd.djvu",djvu:"image/vnd.djvu",webp:"image/webp",zip:"application/zip","7z":"application/x-7z-compressed",rar:"application/x-rar-compressed",exe:"application/x-msdownload",dll:"application/x-msdownload",scr:"application/x-msdownload",com:"application/x-msdownload",bat:"application/x-msdownload",msi:"application/x-msdownload",cab:"application/vnd.ms-cab-compressed",gz:"application/x-gzip",tgz:"application/x-gzip",bz:"application/x-bzip",bz2:"application/x-bzip2",deb:"application/x-debian-package",psf:"application/x-font-linux-psf",otf:"application/x-font-otf",pcf:"application/x-font-pcf",snf:"application/x-font-snf",ttf:"application/x-font-ttf",ttc:"application/x-font-ttf",mp3:"audio/mpeg",amr:"audio/amr",aac:"audio/x-aac",aif:"audio/x-aiff",aifc:"audio/x-aiff",aiff:"audio/x-aiff",wav:"audio/x-wav",wma:"audio/x-ms-wma",wax:"audio/x-ms-wax",midi:"audio/midi",mp4a:"audio/mp4",ogg:"audio/ogg",weba:"audio/webm",ra:"audio/x-pn-realaudio",ram:"audio/x-pn-realaudio",rmp:"audio/x-pn-realaudio-plugin",m3u:"audio/x-mpegurl",flv:"video/x-flv",qt:"video/quicktime",mov:"video/quicktime",wmv:"video/windows-media",avi:"video/x-msvideo",mpg:"video/mpeg",mpeg:"video/mpeg",mpe:"video/mpeg",m1v:"video/mpeg",m2v:"video/mpeg","3gp":"video/3gpp","3g2":"video/3gpp2",h261:"video/h261",h263:"video/h263",h264:"video/h264",jpgv:"video/jpgv",mp4:"video/mp4",mp4v:"video/mp4",mpg4:"video/mp4",ogv:"video/ogg",webm:"video/webm",m4v:"video/x-m4v",asf:"video/x-ms-asf",asx:"video/x-ms-asf",wm:"video/x-ms-wm",wmx:"video/x-ms-wmx",wvx:"video/x-ms-wvx",movie:"video/x-sgi-movie",pdf:"application/pdf",psd:"image/vnd.adobe.photoshop",ai:"application/postscript",eps:"application/postscript",ps:"application/postscript",doc:"application/msword",dot:"application/msword",rtf:"application/rtf",xls:"application/vnd.ms-excel",ppt:"application/vnd.ms-powerpoint",docx:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",dotx:"application/vnd.openxmlformats-officedocument.wordprocessingml.template",pptx:"application/vnd.openxmlformats-officedocument.presentationml.presentation",odt:"application/vnd.oasis.opendocument.text",ods:"application/vnd.oasis.opendocument.spreadsheet"},ve=n(59);n.d(t,"trim",function(){return Oe}),n.d(t,"inArray",function(){return we}),n.d(t,"isArray",function(){return Te}),n.d(t,"isObject",function(){return Ce}),n.d(t,"isFunc",function(){return Ae}),n.d(t,"isUnd",function(){return Ee}),n.d(t,"isNull",function(){return Fe}),n.d(t,"has",function(){return je}),n.d(t,"bind",function(){return Ne}),n.d(t,"noop",function(){return Re}),n.d(t,"noopTrue",function(){return Ie}),n.d(t,"noopFalse",function(){return Le}),n.d(t,"silentTryCatch",function(){return o}),n.d(t,"isNormal",function(){return i}),n.d(t,"isPosNumeric",function(){return a}),n.d(t,"pInt",function(){return r}),n.d(t,"pString",function(){return s}),n.d(t,"pBool",function(){return c}),n.d(t,"boolToAjax",function(){return l}),n.d(t,"isNonEmptyArray",function(){return u}),n.d(t,"encodeURIComponent",function(){return d}),n.d(t,"decodeURIComponent",function(){return p}),n.d(t,"decodeURI",function(){return h}),n.d(t,"encodeURI",function(){return f}),n.d(t,"simpleQueryParser",function(){return m}),n.d(t,"fakeMd5",function(){return b}),n.d(t,"encodeHtml",function(){return g}),n.d(t,"splitPlainText",function(){return y}),n.d(t,"timeOutAction",function(){return _e}),n.d(t,"timeOutActionSecond",function(){return Pe}),n.d(t,"inFocus",function(){return v}),n.d(t,"removeInFocus",function(){return S}),n.d(t,"removeSelection",function(){return O}),n.d(t,"replySubjectAdd",function(){return w}),n.d(t,"roundNumber",function(){return T}),n.d(t,"friendlySize",function(){return C}),n.d(t,"log",function(){return A}),n.d(t,"delegateRun",function(){return E}),n.d(t,"killCtrlACtrlS",function(){return F}),n.d(t,"createCommandLegacy",function(){return j}),n.d(t,"convertThemeName",function(){return De}),n.d(t,"quoteName",function(){return N}),n.d(t,"microtime",function(){return R}),n.d(t,"timestamp",function(){return I}),n.d(t,"convertLangName",function(){return L}),n.d(t,"draggablePlace",function(){return _}),n.d(t,"defautOptionsAfterRender",function(){return P}),n.d(t,"clearBqSwitcher",function(){return D}),n.d(t,"previewMessage",function(){return M}),n.d(t,"settingsSaveHelperFunction",function(){return k}),n.d(t,"settingsSaveHelperSimpleFunction",function(){return x}),n.d(t,"settingsSaveHelperSubscribeFunction",function(){return U}),n.d(t,"findEmailAndLinks",function(){return H}),n.d(t,"htmlToPlain",function(){return B}),n.d(t,"plainToHtml",function(){return G}),n.d(t,"folderListOptionsBuilder",function(){return K}),n.d(t,"selectElement",function(){return V}),n.d(t,"detectDropdownVisibility",function(){return Me}),n.d(t,"triggerAutocompleteInputChange",function(){return z}),n.d(t,"getConfigurationFromScriptTag",function(){return q}),n.d(t,"disposeOne",function(){return W}),n.d(t,"disposeObject",function(){return Y}),n.d(t,"delegateRunOnDestroy",function(){return $}),n.d(t,"appendStyles",function(){return J}),n.d(t,"changeTheme",function(){return X}),n.d(t,"computedPagenatorHelper",function(){return Z}),n.d(t,"getFileExtension",function(){return Q}),n.d(t,"mimeContentType",function(){return ee}),n.d(t,"isTransparent",function(){return te}),n.d(t,"getRealHeight",function(){return ne}),n.d(t,"resizeAndCrop",function(){return oe}),n.d(t,"mailToHelper",function(){return ie}),n.d(t,"domReady",function(){return ae}),n.d(t,"windowResize",function(){return He}),n.d(t,"windowResizeCallback",function(){return re}),n.d(t,"jassl",function(){return ve.a});var Se,Oe=ue.a.trim,we=ue.a.inArray,Te=pe.a.isArray,Ce=pe.a.isObject,Ae=pe.a.isFunction,Ee=pe.a.isUndefined,Fe=pe.a.isNull,je=pe.a.has,Ne=pe.a.bind,Re=function(){},Ie=function(){return!0},Le=function(){return!1},_e=(Se={},function(e,t,n){Se[e]=Ee(Se[e])?0:Se[e],ce.a.clearTimeout(Se[e]),Se[e]=ce.a.setTimeout(t,n)}),Pe=function(){var e={};return function(t,n,o){e[t]||(e[t]=ce.a.setTimeout(function(){n(),e[t]=0},o))}}(),De=pe.a.memoize(function(e){return"@custom"===e.substr(-7)&&(e=Oe(e.substring(0,e.length-7))),Oe(e.replace(/[^a-zA-Z0-9]+/g," ").replace(/([A-Z])/g," $1").replace(/[\s]+/g," "))});ce.a.rainloop_Utils_htmlToPlain=B,ce.a.rainloop_Utils_plainToHtml=G;var Me=pe.a.debounce(function(){Object(be.dropdownVisibility)(!!pe.a.find(be.data.aBootstrapDropdowns,function(e){return e.hasClass("open")}))},50),ke={},xe=0,Ue=null,He=pe.a.debounce(function(e){Ee(e)||Fe(e)?be.$win.resize():ce.a.setTimeout(function(){be.$win.resize()},e)},50),Be=ce.a.String.substr;"b"!=="ab".substr(-1)&&(Be=function(e,t,n){return t=0>t?e.length+t:t,e.substr(t,n)},ce.a.String.substr=Be)},function(e,t){e.exports=window},function(e,t){e.exports=window._},function(e,t,n){"use strict";function o(e){return Object(l.isUnd)(u[e])?null:u[e]}function i(e,t){u[e]=t}function a(e){return Object(l.isUnd)(d[e])?null:d[e]}function r(e){var t=o("Capa");return Object(l.isArray)(t)&&Object(l.isNormal)(e)&&-1"),y=c()("
");y.attr("area","hidden").css({position:"absolute",left:-5e3}).appendTo(b);var v=(new i.a.Date).getTime(),S=!0,O=d.a.observable(!1).extend({rateLimit:0}),w=d.a.observable(!0),T="navigator"in i.a&&"userAgent"in i.a.navigator&&i.a.navigator.userAgent.toLowerCase()||"",C=-11&&void 0!==arguments[1])||arguments[1];return Object(k.createCommandLegacy)(null,e,t)}function a(e,t,n,o){var i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];e.__rlSettingsData={Label:n,Template:t,Route:o,IsDefault:!!i},M.VIEW_MODELS.settings.push(e)}function r(e){M.VIEW_MODELS["settings-removed"].push(e)}function s(e){M.VIEW_MODELS["settings-disabled"].push(e)}function c(){I.a.changed.active=!1}function l(){I.a.changed.active=!0}function u(e){return""===e||Object(k.isUnd)(H[e])?null:H[e]}function d(e){var t=null;return e&&(t=e,e.default&&(t=e.default)),t}function p(e){var t=d(e);t&&t.__vm&&t.__dom&&t.__vm.modalVisibility(!1)}function h(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;E.a.each(t.__names,function(o){Object(D.f)(e,[o,t.__vm,n])})}function f(e,t){if(e&&!e.__builded){var n=null,o=new e(t),a=e.__type||"",r=a?j()("#rl-content #rl-"+a.toLowerCase()):null;e.__builded=!0,e.__vm=o,o.onShowTrigger=N.a.observable(!1),o.onHideTrigger=N.a.observable(!1),o.viewModelName=e.__name,o.viewModelNames=e.__names,o.viewModelTemplateID=e.__templateID,o.viewModelPosition=e.__type,r&&1===r.length?((n=j()("
").addClass("rl-view-model").addClass("RL-"+o.viewModelTemplateID).hide()).appendTo(r),o.viewModelDom=n,e.__dom=n,B.Popup===a&&(o.cancelCommand=o.closeCommand=i(function(){p(e)}),o.modalVisibility.subscribe(function(t){t?(o.viewModelDom.show(),o.storeAndSetKeyScope(),M.popupVisibilityNames.push(o.viewModelName),o.viewModelDom.css("z-index",3e3+Object(M.popupVisibilityNames)().length+10),o.onShowTrigger&&o.onShowTrigger(!o.onShowTrigger()),Object(k.delegateRun)(o,"onShowWithDelay",[],500)):(Object(k.delegateRun)(o,"onHide"),Object(k.delegateRun)(o,"onHideWithDelay",[],500),o.onHideTrigger&&o.onHideTrigger(!o.onHideTrigger()),o.restoreKeyScope(),h("view-model-on-hide",e),M.popupVisibilityNames.remove(o.viewModelName),o.viewModelDom.css("z-index",2e3),E.a.delay(function(){return o.viewModelDom.hide()},300))})),h("view-model-pre-build",e,n),N.a.applyBindingAccessorsToNode(n[0],{translatorInit:!0,template:function(){return{name:o.viewModelTemplateID}}},o),Object(k.delegateRun)(o,"onBuild",[n]),o&&B.Popup===a&&o.registerPopupKeyDown(),h("view-model-post-build",e,n)):Object(k.log)("Cannot find view model position: "+a)}return e?e.__vm:null}function m(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=d(e);n&&(f(n),n.__vm&&n.__dom&&(Object(k.delegateRun)(n.__vm,"onBeforeShow",t||[]),n.__vm.modalVisibility(!0),Object(k.delegateRun)(n.__vm,"onShow",t||[]),h("view-model-on-show",n,t||[])))}function b(e){var t=d(e);t&&(f(t),t.__vm&&t.__dom&&Object(k.delegateRun)(t.__vm,"onWarmUp"))}function g(e){var t=d(e);return!(!t||!t.__vm)&&t.__vm.modalVisibility()}function y(e,t){var n=null,o=!1,i=null;""===Object(k.pString)(e)&&(e=U),""!==e&&((n=u(e))||(n=u(U))&&(t=e+"/"+t,e=U),n&&n.__started&&(o=x&&n===x,n.__builded||(n.__builded=!0,Object(k.isNonEmptyArray)(n.viewModels())&&E.a.each(n.viewModels(),function(e){f(e,n)}),Object(k.delegateRun)(n,"onBuild")),E.a.defer(function(){x&&!o&&(Object(k.delegateRun)(x,"onHide"),Object(k.delegateRun)(x,"onHideWithDelay",[],500),x.onHideTrigger&&x.onHideTrigger(!x.onHideTrigger()),Object(k.isNonEmptyArray)(x.viewModels())&&E.a.each(x.viewModels(),function(e){e.__vm&&e.__dom&&B.Popup!==e.__vm.viewModelPosition&&(e.__dom.hide(),e.__vm.viewModelVisibility(!1),Object(k.delegateRun)(e.__vm,"onHide"),Object(k.delegateRun)(e.__vm,"onHideWithDelay",[],500),e.__vm.onHideTrigger&&e.__vm.onHideTrigger(!e.__vm.onHideTrigger()))})),(x=n)&&!o&&(Object(k.delegateRun)(x,"onShow"),x.onShowTrigger&&x.onShowTrigger(!x.onShowTrigger()),Object(D.f)("screen-on-show",[x.screenName(),x]),Object(k.isNonEmptyArray)(x.viewModels())&&E.a.each(x.viewModels(),function(e){e.__vm&&e.__dom&&B.Popup!==e.__vm.viewModelPosition&&(Object(k.delegateRun)(e.__vm,"onBeforeShow"),e.__dom.show(),e.__vm.viewModelVisibility(!0),Object(k.delegateRun)(e.__vm,"onShow"),e.__vm.onShowTrigger&&e.__vm.onShowTrigger(!e.__vm.onShowTrigger()),Object(k.delegateRun)(e.__vm,"onShowWithDelay",[],200),h("view-model-on-show",e))})),(i=n&&n.__cross?n.__cross():null)&&i.parse(t)})))}function v(e){E.a.each(e,function(e){if(e){var t=new e,n=t?t.screenName():"";t&&""!==n&&(""===U&&(U=n),H[n]=t)}}),E.a.each(H,function(e){e&&!e.__started&&e.__start&&(e.__started=!0,e.__start(),Object(D.f)("screen-pre-start",[e.screenName(),e]),Object(k.delegateRun)(e,"onStart"),Object(D.f)("screen-post-start",[e.screenName(),e]))});var t=_.a.create();t.addRoute(/^([a-zA-Z0-9\-]*)\/?(.*)$/,y),I.a.initialized.add(t.parse,t),I.a.changed.add(t.parse,t),I.a.init(),E.a.delay(function(){return M.$html.removeClass("rl-started-trigger").addClass("rl-started")},100),E.a.delay(function(){return M.$html.addClass("rl-started-delay")},200)}function S(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];e="/"===(e="#"===e.substr(0,1)?e.substr(1):e).substr(0,1)?e.substr(1):e;var o=n?"replaceHash":"setHash";t?(I.a.changed.active=!1,I.a[o](e),I.a.changed.active=!0):(I.a.changed.active=!0,I.a[o](e),I.a.setHash(e))}function O(e){var t=e.name,n=e.type,o=e.templateID;return function(e){e&&(t&&(Object(k.isArray)(t)?e.__names=t:e.__names=[t],e.__name=e.__names[0]),n&&(e.__type=n),o&&(e.__templateID=o))}}function w(e){var t=e.name,n=e.templateID;return O({name:t,type:B.Popup,templateID:n})}function T(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return function(t,n,o){if(!n||!n.match(/Command$/))throw new Error('name "'+n+'" should end with Command suffix');var i=o.value||o.initializer(),a=Object(k.isFunc)(e)?e:function(){return!!e};return o.value=function(){if(a.call(this,this)){for(var e=arguments.length,t=Array(e),n=0;n1&&void 0!==arguments[1]&&arguments[1];f.a.defer(function(){b()("[data-i18n]",e).each(function(e,t){F(t)}),t&&S.bAnimationSupported&&b()(".i18n-animation[data-i18n]",e).letterfx({fx:"fall fade",backwards:!1,timing:50,fx_duration:"50ms",letter_end:"restore",element_end:"restore"})})}function a(){A.forEach(function(e){C[e[0]]=o(e[1])})}function r(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;e&&e(),t?E.subscribe(function(){e&&e(),t&&t()}):e&&E.subscribe(e)}function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return e=p.a.parseInt(e,10)||0,y.Notification.ClientViewError===e&&t?t:(n=n&&p.a.parseInt(n,10)||0,Object(v.isUnd)(C[e])?n&&Object(v.isUnd)(C[n])?C[n]:"":C[e])}function c(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:y.Notification.UnknownNotification;return e&&e.ErrorCode?s(Object(v.pInt)(e.ErrorCode),e.ErrorMessage||""):s(t)}function l(e){var t="";switch(p.a.parseInt(e,10)||0){case y.UploadErrorCode.FileIsTooBig:t=o("UPLOAD/ERROR_FILE_IS_TOO_BIG");break;case y.UploadErrorCode.FilePartiallyUploaded:t=o("UPLOAD/ERROR_FILE_PARTIALLY_UPLOADED");break;case y.UploadErrorCode.FileNoUploaded:t=o("UPLOAD/ERROR_NO_FILE_UPLOADED");break;case y.UploadErrorCode.MissingTempFolder:t=o("UPLOAD/ERROR_MISSING_TEMP_FOLDER");break;case y.UploadErrorCode.FileOnSaveingError:t=o("UPLOAD/ERROR_ON_SAVING_FILE");break;case y.UploadErrorCode.FileType:t=o("UPLOAD/ERROR_FILE_TYPE");break;default:t=o("UPLOAD/ERROR_UNKNOWN")}return t}function u(e,t){var n=Object(v.microtime)();return S.$html.addClass("rl-changing-language"),new p.a.Promise(function(o,i){b.a.ajax({url:Object(w.n)(t,e),dataType:"script",cache:!0}).then(function(){f.a.delay(function(){j();var e=-1t.interval&&(t.isSystemFolder()||t.subScribed()&&t.checkable())&&o.push([t.interval,t.fullNameRaw]),t&&0t[0]?1:0}),s.a.find(o,function(n){var o=Object(p.e)(n[1]);return o&&(o.interval=t,e.push(n[1])),5<=e.length}),s.a.uniq(e)},e}();t.a=new f},function(e,t,n){"use strict";function o(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=0,i=0,a=[];if(Object(g.isNonEmptyArray)(e))for(i=e.length;o1&&void 0!==arguments[1]&&arguments[1];return o(this.from,e,t)},t.prototype.fromDkimData=function(){var e=["none",""];return Object(g.isNonEmptyArray)(this.from)&&1===this.from.length&&this.from[0]&&this.from[0].dkimStatus&&(e=[this.from[0].dkimStatus,this.from[0].dkimValue||""]),e},t.prototype.toToLine=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return o(this.to,e,t)},t.prototype.ccToLine=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return o(this.cc,e,t)},t.prototype.bccToLine=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return o(this.bcc,e,t)},t.prototype.replyToToLine=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return o(this.replyTo,e,t)},t.prototype.lineAsCss=function(){return L()({deleted:this.deleted(),"deleted-mark":this.deletedMark(),selected:this.selected(),checked:this.checked(),flagged:this.flagged(),unseen:this.unseen(),answered:this.answered(),forwarded:this.forwarded(),focused:this.focused(),important:this.isImportant(),withAttachments:this.hasAttachments(),new:this.newForAnimation(),emptySubject:""===this.subject(),hasUnseenSubMessage:this.hasUnseenSubMessage(),hasFlaggedSubMessage:this.hasFlaggedSubMessage()})},t.prototype.hasVisibleAttachments=function(){return!!p.a.find(this.attachments(),function(e){return!e.isLinked})},t.prototype.findAttachmentByCid=function(e){var t=null,n=this.attachments();return Object(g.isNonEmptyArray)(n)&&(e=e.replace(/^<+/,"").replace(/>+$/,""),t=p.a.find(n,function(t){return e===t.cidWithOutTags})),t||null},t.prototype.findAttachmentByContentLocation=function(e){var t=null,n=this.attachments();return Object(g.isNonEmptyArray)(n)&&(t=p.a.find(n,function(t){return e===t.contentLocation})),t||null},t.prototype.messageId=function(){return this.sMessageId},t.prototype.inReplyTo=function(){return this.sInReplyTo},t.prototype.references=function(){return this.sReferences},t.prototype.fromAsSingleEmail=function(){return Object(g.isArray)(this.from)&&this.from[0]?this.from[0].email:""},t.prototype.viewLink=function(){return Object(O.q)(this.requestHash)},t.prototype.downloadLink=function(){return Object(O.p)(this.requestHash)},t.prototype.replyEmails=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=[],o=Object(g.isUnd)(e)?{}:e;return r(this.replyTo,o,n),0===n.length&&r(this.from,o,n),0!==n.length||t?n:this.replyEmails({},!0)},t.prototype.replyAllEmails=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=[],o=[],i=Object(g.isUnd)(e)?{}:e;return r(this.replyTo,i,n),0===n.length&&r(this.from,i,n),r(this.to,i,n),r(this.cc,i,o),0!==n.length||t?[n,o]:[this.replyAllEmails({},!0)[0],o]},t.prototype.textBodyToString=function(){return this.body?this.body.html():""},t.prototype.attachmentsToStringLine=function(){var e=p.a.map(this.attachments(),function(e){return e.fileName+" ("+e.friendlySize+")"});return e&&00&&void 0!==arguments[0]&&arguments[0];this.showLazyExternalImagesInBody();var t=this.dateTimeStampInUTC()||0,n=this.ccToLine(!1),o=00&&void 0!==arguments[0]&&arguments[0];if(this.body&&this.body.data("rl-has-images")){this.hasImages(!1),this.body.data("rl-has-images",!1);var t=this.proxy?"data-x-additional-src":"data-x-src";m()("["+t+"]",this.body).each(function(){var n=m()(this);e&&n.is("img")?n.addClass("lazy").attr("data-original",n.attr(t)).removeAttr("data-loaded"):n.attr("src",n.attr(t)).removeAttr("data-loaded")}),t=this.proxy?"data-x-additional-style-url":"data-x-style-url",m()("["+t+"]",this.body).each(function(){var e=m()(this),n=Object(g.trim)(e.attr("style"));n=""===n?"":";"===n.substr(-1)?n+" ":n+"; ",e.attr("style",n+e.attr(t))}),e&&(this.lozad(),S.$win.resize()),Object(g.windowResize)(500)}},t.prototype.showInternalImages=function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(this.body&&!this.body.data("rl-init-internal-images")){this.body.data("rl-init-internal-images",!0);var n=this;m()("[data-x-src-cid]",this.body).each(function(){var e=m()(this),o=n.findAttachmentByCid(e.attr("data-x-src-cid"));o&&o.download&&(t&&e.is("img")?e.addClass("lazy").attr("data-original",o.linkPreview()):e.attr("src",o.linkPreview()))}),m()("[data-x-src-location]",this.body).each(function(){var e=m()(this),o=n.findAttachmentByContentLocation(e.attr("data-x-src-location"));o||(o=n.findAttachmentByCid(e.attr("data-x-src-location"))),o&&o.download&&(t&&e.is("img")?e.addClass("lazy").attr("data-original",o.linkPreview()):e.attr("src",o.linkPreview()))}),m()("[data-x-style-cid]",this.body).each(function(){var e="",t="",o=m()(this),i=n.findAttachmentByCid(o.attr("data-x-style-cid"));i&&i.linkPreview&&""!==(t=o.attr("data-x-style-cid-name"))&&(e=""===(e=Object(g.trim)(o.attr("style")))?"":";"===e.substr(-1)?e+" ":e+"; ",o.attr("style",e+t+": url('"+i.linkPreview()+"')"))}),t&&p.a.delay(function(){return e.lozad()},300),Object(g.windowResize)(500)}},t.prototype.storeDataInDom=function(){this.body&&(this.body.data("rl-is-html",!!this.isHtml()),this.body.data("rl-has-images",!!this.hasImages()))},t.prototype.fetchDataFromDom=function(){this.body&&(this.isHtml(!!this.body.data("rl-is-html")),this.hasImages(!!this.body.data("rl-has-images")))},t.prototype.replacePlaneTextBody=function(e){this.body&&this.body.html(e).addClass("b-text-part plain")},t.prototype.flagHash=function(){return[this.deleted(),this.deletedMark(),this.unseen(),this.flagged(),this.answered(),this.forwarded(),this.isReadReceipt()].join(",")},t}(n(36).a),U=n(9),H=n(26),B=n(31),G=n(28),K=n(62),V=n(20),z=n(17),q=function(){function e(){c()(this,e),this.staticMessage=new x,this.messageList=h.a.observableArray([]).extend({rateLimit:0}),this.messageListCount=h.a.observable(0),this.messageListSearch=h.a.observable(""),this.messageListThreadUid=h.a.observable(""),this.messageListPage=h.a.observable(1),this.messageListPageBeforeThread=h.a.observable(1),this.messageListError=h.a.observable(""),this.messageListEndFolder=h.a.observable(""),this.messageListEndSearch=h.a.observable(""),this.messageListEndThreadUid=h.a.observable(""),this.messageListEndPage=h.a.observable(1),this.messageListLoading=h.a.observable(!1),this.messageListIsNotCompleted=h.a.observable(!1),this.messageListCompleteLoadingThrottle=h.a.observable(!1).extend({throttle:200}),this.messageListCompleteLoadingThrottleForAnimation=h.a.observable(!1).extend({specialThrottle:700}),this.messageListDisableAutoSelect=h.a.observable(!1).extend({falseTimeout:500}),this.selectorMessageSelected=h.a.observable(null),this.selectorMessageFocused=h.a.observable(null),this.message=h.a.observable(null),this.message.viewTrigger=h.a.observable(!1),this.messageError=h.a.observable(""),this.messageCurrentLoading=h.a.observable(!1),this.messageLoadingThrottle=h.a.observable(!1).extend({throttle:b.Magics.Time50ms}),this.messageFullScreenMode=h.a.observable(!1),this.messagesBodiesDom=h.a.observable(null),this.messageActiveDom=h.a.observable(null),this.computers(),this.subscribers(),this.onMessageResponse=p.a.bind(this.onMessageResponse,this),this.purgeMessageBodyCacheThrottle=p.a.throttle(this.purgeMessageBodyCache,b.Magics.Time30s)}return e.prototype.computers=function(){var e=this;this.messageLoading=h.a.computed(function(){return e.messageCurrentLoading()}),this.messageListEndHash=h.a.computed(function(){return e.messageListEndFolder()+"|"+e.messageListEndSearch()+"|"+e.messageListEndThreadUid()+"|"+e.messageListEndPage()}),this.messageListPageCount=h.a.computed(function(){var t=u.a.Math.ceil(e.messageListCount()/G.a.messagesPerPage());return 0>=t?1:t}),this.mainMessageListSearch=h.a.computed({read:this.messageListSearch,write:function(t){Object(U.setHash)(Object(O.o)(D.a.currentFolderFullNameHash(),1,Object(g.trim)(t.toString()),e.messageListThreadUid()))}}),this.messageListCompleteLoading=h.a.computed(function(){var t=e.messageListLoading(),n=e.messageListIsNotCompleted();return t||n}),this.isMessageSelected=h.a.computed(function(){return null!==e.message()}),this.messageListChecked=h.a.computed(function(){return p.a.filter(e.messageList(),function(e){return e.checked()})}).extend({rateLimit:0}),this.hasCheckedMessages=h.a.computed(function(){return 0n.data("rl-cache-count")&&(n.addClass("rl-cache-purge"),e+=1)}),02&&void 0!==arguments[2]?arguments[2]:"",i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];t=p.a.map(t,function(e){return Object(g.pInt)(e)});var a=0,r=this.messageList(),s=this.message(),c=D.a.trashFolder(),l=D.a.spamFolder(),u=Object(y.e)(e),d=""===o?null:Object(y.e)(o||""),h=D.a.currentFolderFullNameRaw()===e?p.a.filter(r,function(e){return e&&-1').insertBefore(e).on("click.rlBlockquoteSwitcher",function(){e.toggleClass("hidden-bq"),Object(g.windowResize)()}).after("
").before("
"))})}},e.prototype.initOpenPgpControls=function(e,t){e&&e.find&&e.find(".b-plain-openpgp:not(.inited)").each(function(){M.a.initMessageBodyControls(m()(this),t)})},e.prototype.setMessage=function(e,t){var n=!1,o=null,i="",a="",r="",s=!1,c=this.messagesBodiesDom(),l=this.selectorMessageSelected(),u=this.message();if(e&&u&&e.Result&&"Object/Message"===e.Result["@Object"]&&u.folderFullNameRaw===e.Result.Folder){var d=u.threads();if(u.uid!==e.Result.Uid&&1').text(a)).html():v&&u.isPgpEncrypted()?S.$div.append(m()('
').text(a)).html():"
"+r+"
",S.$div.empty(),u.isPgpSigned(s),u.isPgpEncrypted(v)}else r="
"+r+"
";else f=!1,r="
"+r+"
";S.data.iMessageBodyCacheCount+=1,(o=m()('
').hide().addClass("rl-cache-class")).data("rl-cache-count",S.data.iMessageBodyCacheCount),o.html(Object(g.findEmailAndLinks)(r)).addClass("b-text-part "+(f?"html":"plain")),u.isHtml(!!f),u.hasImages(!!e.Result.HasExternals),u.body=o,u.body&&c.append(u.body),u.storeDataInDom(),e.Result.HasInternals&&u.showInternalImages(!0),u.hasImages()&&G.a.showImages()&&u.showExternalImages(!0),this.purgeMessageBodyCacheThrottle()}this.messageActiveDom(u.body),this.hideMessageBodies(),o&&(this.initOpenPgpControls(o,u),this.initBlockquoteSwitcher(o)),u.body.show()}Object(y.n)(u),(u.unseen()||u.hasUnseenSubMessage())&&Object(V.a)().messageListAction(u.folderFullNameRaw,b.MessageSetAction.SetSeen,[u]),n&&(u=this.message(),l&&u&&(u.folderFullNameRaw!==l.folderFullNameRaw||u.uid!==l.uid)?(this.selectorMessageSelected(null),1===this.messageList().length&&this.selectorMessageFocused(null)):!l&&u&&(l=p.a.find(this.messageList(),function(e){return e&&e.folderFullNameRaw===u.folderFullNameRaw&&e.uid===u.uid}))&&(this.selectorMessageSelected(l),this.selectorMessageFocused(l))),Object(g.windowResize)()}}},e.prototype.selectMessage=function(e){e?(this.message(this.staticMessage.populateByMessageListItem(e)),this.populateMessageBody(this.message())):this.message(null)},e.prototype.selectMessageByFolderAndUid=function(e,t){e&&t?(this.message(this.staticMessage.populateByMessageListItem(null)),this.message().folderFullNameRaw=e,this.message().uid=t,this.populateMessageBody(this.message())):this.message(null)},e.prototype.populateMessageBody=function(e){e&&z.a.message(this.onMessageResponse,e.folderFullNameRaw,e.uid)&&this.messageCurrentLoading(!0)},e.prototype.onMessageResponse=function(e,t,n){this.hideMessageBodies(),this.messageCurrentLoading(!1),b.StorageResultType.Success===e&&t&&t.Result?this.setMessage(t,n):b.StorageResultType.Unload===e?(this.message(null),this.messageError("")):b.StorageResultType.Abort!==e&&(this.message(null),this.messageError(t&&t.ErrorCode?Object(w.getNotification)(t.ErrorCode):Object(w.getNotification)(b.Notification.UnknownError)))},e.prototype.calculateMessageListHash=function(e){return p.a.map(e,function(e){return e.hash+"_"+e.threadsLen()+"_"+e.flagHash()}).join("|")},e.prototype.setMessageList=function(e,t){if(e&&e.Result&&"Collection/MessageCollection"===e.Result["@Object"]&&e.Result["@Collection"]&&Object(g.isArray)(e.Result["@Collection"])){var n=0,o=!1,i=[],a=Object(T.momentNowUnix)(),r=Object(g.pInt)(e.Result.MessageResultCount),s=Object(g.pInt)(e.Result.Offset),c=Object(y.e)(Object(g.isNormal)(e.Result.Folder)?e.Result.Folder:"");c&&!t&&(c.interval=a,Object(y.q)(e.Result.Folder,e.Result.FolderHash),Object(g.isNormal)(e.Result.MessageCount)&&c.messageCountAll(e.Result.MessageCount),Object(g.isNormal)(e.Result.MessageUnseenCount)&&(Object(g.pInt)(c.messageCountUnread())!==Object(g.pInt)(e.Result.MessageUnseenCount)&&(o=!0),c.messageCountUnread(e.Result.MessageUnseenCount)),this.initUidNextAndNewMessages(c.fullNameRaw,e.Result.UidNext,e.Result.NewMessages)),o&&c&&Object(y.c)(c.fullNameRaw),p.a.each(e.Result["@Collection"],function(e){if(e&&"Object/Message"===e["@Object"]){var o=x.newInstanceFromJson(e);o&&(Object(y.l)(o.folderFullNameRaw,o.uid)&&5>=n&&(n+=1,o.newForAnimation(!0)),o.deleted(!1),t?Object(y.n)(o):Object(y.u)(o),i.push(o))}}),this.messageListCount(r),this.messageListSearch(Object(g.isNormal)(e.Result.Search)?e.Result.Search:""),this.messageListPage(u.a.Math.ceil(s/G.a.messagesPerPage()+1)),this.messageListThreadUid(Object(g.isNormal)(e.Result.ThreadUid)?Object(g.pString)(e.Result.ThreadUid):""),this.messageListEndFolder(Object(g.isNormal)(e.Result.Folder)?e.Result.Folder:""),this.messageListEndSearch(this.messageListSearch()),this.messageListEndThreadUid(this.messageListThreadUid()),this.messageListEndPage(this.messageListPage()),this.messageListDisableAutoSelect(!0),this.messageList(i),this.messageListIsNotCompleted(!1),Object(y.d)(),c&&(t||o||G.a.useThreads())&&Object(V.a)().folderInformation(c.fullNameRaw,i)}else this.messageListCount(0),this.messageList([]),this.messageListError(Object(w.getNotification)(e&&e.ErrorCode?e.ErrorCode:b.Notification.CantGetMessageList))},e}();t.a=new q},function(e,t,n){"use strict";function o(e,t){e=Object(R.trim)(e),t(H&&""!==e?I.h(e):"",e)}function i(e,t){return e+"#"+t}function a(e,t){U[i(e,t)]=!0}function r(e,t){return!0===U[i(e,t)]}function s(e,t){k[i(e,t)]=!0}function c(e,t){return!!k[i(e,t)]&&(k[i(e,t)]=null,!0)}function l(){k={}}function u(){return""===x?"INBOX":x}function d(e){return""!==e&&_[e]?_[e]:""}function p(e,t){_[e]=t,"INBOX"!==t&&""!==x||(x=t)}function h(e){return""!==e&&P[e]?P[e]:""}function f(e,t){""!==e&&(P[e]=t)}function m(e){return""!==e&&D[e]?D[e]:""}function b(e,t){D[e]=t}function g(e){return""!==e&&L[e]?L[e]:null}function y(e,t){L[e]=t}function v(e){y(e,null)}function S(e,t){return M[e]&&M[e][t]?M[e][t]:null}function O(e,t,n){M[e]||(M[e]={}),M[e][t]=n}function w(e){M[e]={}}function T(e){if(e){var t=e.uid,n=S(e.folderFullNameRaw,t);if(n&&00&&void 0!==arguments[0]?arguments[0]:"";return W+Object(V.pString)(e)}function r(){return ee?q:Y+te}function s(){return q}function c(e,t,n){return n=Object(V.isUnd)(n)?ne:n,Y+"/Raw/"+$+"/"+n+"/"+e+"/"+$+"/"+t}function l(e,t){return c("Download",e,t)}function u(e,t){return c("View",e,t)}function d(e,t){return c("ViewThumbnail",e,t)}function p(e,t){return c("ViewAsPlain",e,t)}function h(e,t){return c("FramedView",e,t)}function f(e){return Y+"/"+e+"/"+$+"/"+ne+"/"}function m(){return f("Upload")}function b(){return f("UploadContacts")}function g(){return f("UploadBackground")}function y(){return f("Append")}function v(e){return f("Change")+Object(V.encodeURIComponent)(e)+"/"}function S(e){return f("Ajax")+e}function O(e){return Y+"/Raw/"+$+"/"+ne+"/ViewAsPlain/"+$+"/"+e}function w(e){return Y+"/Raw/"+$+"/"+ne+"/Download/"+$+"/"+e}function T(e){return Y+"/Raw/0/Avatar/"+Object(V.encodeURIComponent)(e)+"/"}function C(e){return Y+"/Raw/"+$+"/"+ne+"/UserBackground/"+$+"/"+e}function A(){return Y+"/Info"}function E(e,t){return Y+"/Lang/0/"+(t?"Admin":"App")+"/"+K.a.encodeURI(e)+"/"+J+"/"}function F(){return Y+"/Raw/"+$+"/"+ne+"/ContactsVcf/"}function j(){return Y+"/Raw/"+$+"/"+ne+"/ContactsCsv/"}function N(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Y+"SocialGoogle"+(""!==ne?"/"+$+"/"+ne+"/":"")+(e?"&xauth=1":"")}function R(){return Y+"SocialTwitter"+(""!==ne?"/"+$+"/"+ne+"/":"")}function I(){return Y+"SocialFacebook"+(""!==ne?"/"+$+"/"+ne+"/":"")}function L(e){return Q+e}function _(){return L("css/images/empty-contact.png")}function P(e){return L("sounds/"+e)}function D(){return L("css/images/icom-message-notification.png")}function M(){return L("js/min/openpgp.min.js")}function k(){return L("js/min/openpgp.worker.min.js")}function x(e){var t=Z;return"@custom"===e.substr(-7)&&(e=Object(V.trim)(e.substring(0,e.length-7)),t=X),t+"themes/"+K.a.encodeURI(e)+"/images/preview.png"}function U(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"INBOX";return W+"mailbox/"+e}function H(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return W+"settings"+(e?"/"+e:"")}function B(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";t=Object(V.isNormal)(t)?Object(V.pInt)(t):1,n=Object(V.pString)(n);var i=W+"mailbox/";if(""!==e){var a=Object(V.pInt)(o);i+=K.a.encodeURI(e)+(0>2,r=(3&n)<<4|(o=e.charCodeAt(l++))>>4,s=(15&o)<<2|(i=e.charCodeAt(l++))>>6,c=63&i,isNaN(o)?s=c=64:isNaN(i)&&(c=64),t=t+m.charAt(a)+m.charAt(r)+m.charAt(s)+m.charAt(c);return t},decode:function(e){var t="",n=void 0,o=void 0,i=void 0,a=void 0,r=void 0,s=void 0,c=0;for(e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");c>4,o=(15&a)<<4|(r=m.indexOf(e.charAt(c++)))>>2,i=(3&r)<<6|(s=m.indexOf(e.charAt(c++))),t+=String.fromCharCode(n),64!==r&&(t+=String.fromCharCode(o)),64!==s&&(t+=String.fromCharCode(i));return b._utf8_decode(t)},_utf8_encode:function(e){for(var t="",n=0,o=(e=e.replace(/\r\n/g,"\n")).length,i=0;n127&&i<2048?(t+=String.fromCharCode(i>>6|192),t+=String.fromCharCode(63&i|128)):(t+=String.fromCharCode(i>>12|224),t+=String.fromCharCode(i>>6&63|128),t+=String.fromCharCode(63&i|128));return t},_utf8_decode:function(e){for(var t="",n=0,o=0,i=0,a=0;n191&&o<224?(i=e.charCodeAt(n+1),t+=String.fromCharCode((31&o)<<6|63&i),n+=2):(i=e.charCodeAt(n+1),a=e.charCodeAt(n+2),t+=String.fromCharCode((15&o)<<12|(63&i)<<6|63&a),n+=3);return t}},g=(b.decode,b.encode,b.urlsafe_encode),y=n(5),v=n(26),S=n(28),O=n(20),w=function(e){function t(){i()(this,t);var n=r()(this,e.call(this));return n.oRequests={},n}return c()(t,e),t.prototype.folders=function(e){this.defaultRequest(e,"Folders",{SentFolder:y.settingsGet("SentFolder"),DraftFolder:y.settingsGet("DraftFolder"),SpamFolder:y.settingsGet("SpamFolder"),TrashFolder:y.settingsGet("TrashFolder"),ArchiveFolder:y.settingsGet("ArchiveFolder")},null,"",["Folders"])},t.prototype.login=function(e,t,n,o,i,a,r,s){this.defaultRequest(e,"Login",{Email:t,Login:n,Password:o,Language:a||"",AdditionalCode:r||"",AdditionalCodeSignMe:s?"1":"0",SignMe:i?"1":"0"})},t.prototype.getTwoFactor=function(e){this.defaultRequest(e,"GetTwoFactorInfo")},t.prototype.createTwoFactor=function(e){this.defaultRequest(e,"CreateTwoFactorSecret")},t.prototype.clearTwoFactor=function(e){this.defaultRequest(e,"ClearTwoFactorInfo")},t.prototype.showTwoFactorSecret=function(e){this.defaultRequest(e,"ShowTwoFactorSecret")},t.prototype.testTwoFactor=function(e,t){this.defaultRequest(e,"TestTwoFactorInfo",{Code:t})},t.prototype.enableTwoFactor=function(e,t){this.defaultRequest(e,"EnableTwoFactor",{Enable:t?"1":"0"})},t.prototype.clearTwoFactorInfo=function(e){this.defaultRequest(e,"ClearTwoFactorInfo")},t.prototype.contactsSync=function(e){this.defaultRequest(e,"ContactsSync",null,p.d)},t.prototype.saveContactsSyncData=function(e,t,n,o,i){this.defaultRequest(e,"SaveContactsSyncData",{Enable:t?"1":"0",Url:n,User:o,Password:i})},t.prototype.accountSetup=function(e,t,n){var o=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];this.defaultRequest(e,"AccountSetup",{Email:t,Password:n,New:o?"1":"0"})},t.prototype.accountDelete=function(e,t){this.defaultRequest(e,"AccountDelete",{EmailToDelete:t})},t.prototype.accountsAndIdentitiesSortOrder=function(e,t,n){this.defaultRequest(e,"AccountsAndIdentitiesSortOrder",{Accounts:t,Identities:n})},t.prototype.identityUpdate=function(e,t,n,o,i,a,r,s){this.defaultRequest(e,"IdentityUpdate",{Id:t,Email:n,Name:o,ReplyTo:i,Bcc:a,Signature:r,SignatureInsertBefore:s?"1":"0"})},t.prototype.identityDelete=function(e,t){this.defaultRequest(e,"IdentityDelete",{IdToDelete:t})},t.prototype.accountsAndIdentities=function(e){this.defaultRequest(e,"AccountsAndIdentities")},t.prototype.accountsCounts=function(e){this.defaultRequest(e,"AccountsCounts")},t.prototype.filtersSave=function(e,t,n,o){this.defaultRequest(e,"FiltersSave",{Raw:n,RawIsActive:Object(d.boolToAjax)(o),Filters:u.a.map(t,function(e){return e.toJson()})})},t.prototype.filtersGet=function(e){this.defaultRequest(e,"Filters",{})},t.prototype.templates=function(e){this.defaultRequest(e,"Templates",{})},t.prototype.templateGetById=function(e,t){this.defaultRequest(e,"TemplateGetByID",{ID:t})},t.prototype.templateDelete=function(e,t){this.defaultRequest(e,"TemplateDelete",{IdToDelete:t})},t.prototype.templateSetup=function(e,t,n,o){this.defaultRequest(e,"TemplateSetup",{ID:t,Name:n,Body:o})},t.prototype.messageList=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:20,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"",r=arguments.length>6&&void 0!==arguments[6]&&arguments[6];t=Object(d.pString)(t);var s=Object(h.g)(t),c=v.a.threadsAllowed()&&S.a.useThreads(),l=Object(h.h)()===t?Object(h.i)(t):"";return""===s||""!==i&&-1!==i.indexOf("is:")?this.defaultRequest(e,"MessageList",{Folder:t,Offset:n,Limit:o,Search:i,UidNext:l,UseThreads:c?"1":"0",ThreadUid:c?a:""},""===i?p.g:p.m,"",r?[]:["MessageList"]):this.defaultRequest(e,"MessageList",{},""===i?p.g:p.m,"MessageList/"+Object(f.E)()+"/"+g([t,n,o,i,v.a.projectHash(),s,l,c?"1":"0",c?a:""].join(String.fromCharCode(0))),r?[]:["MessageList"])},t.prototype.messageUploadAttachments=function(e,t){this.defaultRequest(e,"MessageUploadAttachments",{Attachments:t},999e3)},t.prototype.message=function(e,t,n){return t=Object(d.pString)(t),n=Object(d.pInt)(n),!!(Object(h.e)(t)&&02&&void 0!==arguments[2]?arguments[2]:[],o=!0,i=[];Object(d.isArray)(n)&&03&&void 0!==arguments[3]?arguments[3]:null;this.defaultRequest(e,"MessageSetSeenToAll",{Folder:t,SetAction:n?"1":"0",ThreadUids:o?o.join(","):""})},t.prototype.saveMessage=function(e,t,n,o,i,a,r,s,c,l,u,d,h,f,m,b,g){this.defaultRequest(e,"SaveMessage",{IdentityID:t,MessageFolder:n,MessageUid:o,DraftFolder:i,To:a,Cc:r,Bcc:s,ReplyTo:c,Subject:l,TextIsHtml:u?"1":"0",Text:d,DraftInfo:f,InReplyTo:m,References:b,MarkAsImportant:g?"1":"0",Attachments:h},p.l)},t.prototype.sendReadReceiptMessage=function(e,t,n,o,i,a){this.defaultRequest(e,"SendReadReceiptMessage",{MessageFolder:t,MessageUid:n,ReadReceipt:o,Subject:i,Text:a})},t.prototype.sendMessage=function(e,t,n,o,i,a,r,s,c,l,u,d,h,f,m,b,g,y,v){this.defaultRequest(e,"SendMessage",{IdentityID:t,MessageFolder:n,MessageUid:o,SentFolder:i,To:a,Cc:r,Bcc:s,ReplyTo:c,Subject:l,TextIsHtml:u?"1":"0",Text:d,DraftInfo:f,InReplyTo:m,References:b,Dsn:g?"1":"0",ReadReceiptRequest:y?"1":"0",MarkAsImportant:v?"1":"0",Attachments:h},p.n)},t.prototype.saveSystemFolders=function(e,t){this.defaultRequest(e,"SystemFoldersUpdate",t)},t.prototype.saveSettings=function(e,t){this.defaultRequest(e,"SettingsUpdate",t)},t.prototype.saveSettingsHelper=function(e,t,n){var o=this;return function(i){var a;o.saveSettings(n||null,((a={})[e]=t?t(i):i,a))}},t.prototype.changePassword=function(e,t,n){this.defaultRequest(e,"ChangePassword",{PrevPassword:t,NewPassword:n})},t.prototype.folderClear=function(e,t){this.defaultRequest(e,"FolderClear",{Folder:t})},t.prototype.folderSetSubscribe=function(e,t,n){this.defaultRequest(e,"FolderSubscribe",{Folder:t,Subscribe:n?"1":"0"})},t.prototype.folderSetCheckable=function(e,t,n){this.defaultRequest(e,"FolderCheckable",{Folder:t,Checkable:n?"1":"0"})},t.prototype.messagesMove=function(e,t,n,o,i,a){this.defaultRequest(e,"MessageMove",{FromFolder:t,ToFolder:n,Uids:o.join(","),MarkAsRead:a?"1":"0",Learning:i||""},null,"",["MessageList"])},t.prototype.messagesCopy=function(e,t,n,o){this.defaultRequest(e,"MessageCopy",{FromFolder:t,ToFolder:n,Uids:o.join(",")})},t.prototype.messagesDelete=function(e,t,n){this.defaultRequest(e,"MessageDelete",{Folder:t,Uids:n.join(",")},null,"",["MessageList"])},t.prototype.appDelayStart=function(e){this.defaultRequest(e,"AppDelayStart")},t.prototype.quota=function(e){this.defaultRequest(e,"Quota")},t.prototype.contacts=function(e,t,n,o){this.defaultRequest(e,"Contacts",{Offset:t,Limit:n,Search:o},null,"",["Contacts"])},t.prototype.contactSave=function(e,t,n,o){this.defaultRequest(e,"ContactSave",{RequestUid:t,Uid:Object(d.trim)(n),Properties:o})},t.prototype.contactsDelete=function(e,t){this.defaultRequest(e,"ContactsDelete",{Uids:t.join(",")})},t.prototype.suggestions=function(e,t,n){this.defaultRequest(e,"Suggestions",{Query:t,Page:n},null,"",["Suggestions"])},t.prototype.clearUserBackground=function(e){this.defaultRequest(e,"ClearUserBackground")},t.prototype.facebookUser=function(e){this.defaultRequest(e,"SocialFacebookUserInformation")},t.prototype.facebookDisconnect=function(e){this.defaultRequest(e,"SocialFacebookDisconnect")},t.prototype.twitterUser=function(e){this.defaultRequest(e,"SocialTwitterUserInformation")},t.prototype.twitterDisconnect=function(e){this.defaultRequest(e,"SocialTwitterDisconnect")},t.prototype.googleUser=function(e){this.defaultRequest(e,"SocialGoogleUserInformation")},t.prototype.googleDisconnect=function(e){this.defaultRequest(e,"SocialGoogleDisconnect")},t.prototype.socialUsers=function(e){this.defaultRequest(e,"SocialUsers")},t}(n(115).a);t.a=new w},function(e,t,n){e.exports={default:n(111),__esModule:!0}},function(e,t){e.exports=window.key},function(e,t,n){"use strict";function o(){return n(173).default}n.d(t,"a",function(){return o})},,function(e,t,n){"use strict";function o(e,t,n){Object(s.isObject)(e)?(n=t||null,t=null,r.a.each(e,function(e,t){o(t,e,n)})):(Object(s.isUnd)(l[e])&&(l[e]=[]),l[e].push([t,n]))}function i(e,t){c.f("rl-pub",[e,t]),Object(s.isUnd)(l[e])||r.a.each(l[e],function(e){e[0]&&e[0].apply(e[1]||null,t||[])})}n.d(t,"b",function(){return o}),n.d(t,"a",function(){return i});var a=n(4),r=n.n(a),s=n(2),c=n(29),l={}},function(e,t,n){"use strict";n.d(t,"i",function(){return o}),n.d(t,"j",function(){return i}),n.d(t,"c",function(){return a}),n.d(t,"g",function(){return r}),n.d(t,"m",function(){return s}),n.d(t,"n",function(){return c}),n.d(t,"l",function(){return l}),n.d(t,"d",function(){return u}),n.d(t,"r",function(){return d}),n.d(t,"b",function(){return p}),n.d(t,"h",function(){return h}),n.d(t,"p",function(){return f}),n.d(t,"o",function(){return m}),n.d(t,"k",function(){return b}),n.d(t,"a",function(){return g}),n.d(t,"q",function(){return y}),n.d(t,"f",function(){return v}),n.d(t,"e",function(){return S});var o=20,i=[10,20,30,50,100],a=50,r=3e4,s=3e5,c=3e5,l=2e5,u=2e5,d="__UNUSE__",p="rlcsc",h=143,f=25,m=4190,b=15,g=7,y=10,v="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAuCAYAAABXuSs3AAAHHklEQVRoQ7VZW08bVxCeXRuwIbTGXIwNtBBaqjwgVUiR8lDlbza9qe1DpVZ9aNQ/0KpPeaJK07SpcuEeCEmUAObm21bfrL9lONjexSYrWfbunj37zXdmvpkz9oIgCKTD0Wg0xPd94TDP83Q0zvWa50vzklSrdanVanqf4/D84GBGr+F+Op3S8fqoJxLOdnZgTvsO/nYhenHA+UC7CWF1uXwkb9++ldPTUwVerVbVqFQqpR8YPjQ0JCMjI5LNDijoRgP3PQVu5+5Eor2XGLg7IV4GkIdHJ/LmzRs5ODiIwNbrdR0O0GCcq4Xz4eFhmZyclP7+tDQaIik/BG5XKQn4SwG3zJTLZXn9+rUclI8UHD5YVoDDN8bSzXhONwL48fFxGR4eilzFZT1uFRIB5yT8BqCdnR3Z3d0VP9Un6XRawYJpggVrZBv38ME4XKtUKnLt2jUplUoy1PR/l3U7T6sVSAQcgMAkj8PDQ9ne3pajoyMRL7zeKsYZWHgWYDGmv78/mmdwcFA+mJlSgziHDWrERrsjEXDXegTi1tZW+DLxI2bxIrqFNYTXyDyCFweMAHCwb8e4RnTNuOsqe3t7sra21pTD0Kct666E8XlcZyzw9/RUUXK5nK5oUinUQI6TQ3cynO/v78vq6qrKXCNwlTiJJpyNGc3nZHp6uqV2dwrQWOCtZBDAV1ZWwsQk7f0wiQn5kffbAu/0/KWBYzIC1+XukfGx0RGZmppKlC2tIV0Bh4aDcZW7HhkfH8urLLZL7T2pihvlkMNnz56FiadHxicL41IsFpN41bkxsYxbRdFo9jwB8KdPn14J8KnSpBQKhQs63nPmbCVRcBUAR2Lq1VVmpksyMTFxAXjcEsQybiegESionjx5osCZOeNe1O4+EhCAX7bQSgQcxRHTMgAgcz5+/Dis/hL4uHU3/B4YGNASGHIKxuEql0k+l05AeIAF1vPnz5VxFFmdDlaJrMtZITJeSsXCOTlMunKxjLtMYOKNjQ158eJFuAuKkUOb5sEwgff19SkJUBVkThZUbnXZrtCKBQ6gbnWIkjZpyne3ejAWoGnA7Icz6irvBLgbOMicCM6TkxPx/LAkbXfgWcsazuE2kFRsKD5Z+CiqDumKncpZvieWcS6dDVD8xiYCNflpJdwcdwJOf9airLmVQ7DPzMxIYWLsXGXoVqLt5k0M3K3JUVPDZdbWNzsCp48TPFdvdnZWUz32nDha7bJ63kgAJPzSdRks9/Kf9xMJAQ1gq2NpaUmy2Yz4zar4nQC3xb99AQwCcGzLAAwuhG8YiWvcOKts+r4GOe5nMhm5efOm9lUA3E3vSZJRrKvE0fnPv//Jy5cvo5cTHIPQbSjhOoqq69evS19f6lxDKK4+sVhigZPtKJqbrQeqxd5+WR4+fKgqgT0k2XX3nhiPgETWXFhYkFzuPZ2yVq1GTSOXpE47/VjgNnD4m4GG7/LhsTx69EiwD4Vr2MwIIxgbAH18fKx1yfz8vEogNvGtWnCuhLZa9UTAreVWFsHy/b/+Vrbdl7E5REMQD2jDoUbByty+/ZnU64GkU2HzyJLhktU1cLv8nARgkYS2d3ajAgwG8qU2oLmDZ92CMaOjo7K4uCiZgbDWaRWgnZhPxLhrMUCvr69riwKZk1LHF7XqrWAO9hJxH6ozNzcnCx/PqztZg9mf6SQMscCtm2C5ke4BGMlHWTUp36036AJajDVrFMzBrhhWslQsSrFYiOqVpMriNYIgqFRq2j3FAb/zffT6zuxFXxsNzs3NTXn16lW4gYiW96w1FyedF+83xG/2FNGCRpU4NjamMsn+OZ9xE5RXqdaDdPpib6RWCzuwKF9RxqI2AVNQBwQYJoK0wdBejnqtEikP3pfP51XjUTESl12FqJEKxsEorARYDD44ONTeID7YpsEnrRvQfWAI2e8WfDaTUSIwJ0iBCmFOtOUAHvVMPp/TPwvYFVYFIuP8l+DBgwdaa2Miqwa0GgYwfeMltovbDfh6c1vIgMYcliSsKv4IWFr6VDHxvldvBAH+1sA+cnl5WYOPmmr9ir+1l9I0Cgz0yjhXjfJJ0JROnmezWbl165ayr/5fqwcBNr7IfhjMqKcvESSM4eRcCasQ3bDNObmKPLdGUGpZsN24cUNLBm9zazu4d++e6qpNBFaTuUS26U5dpuR1CxyA7J9ddrMRqlz4pwLLYawymPd++/2PADt2ugcGwq9gCCdhQ96C6xWwa6j1ceuq+I0EhW0i8MAIVJfeL3d/DVD8EKi12P6/2S2jV/EccVB54O/ejz/9HGCpoBBMta5rXMXLu53D1XAwjhXwvvv+h4BAXVe4bOu3O3ChxF08LiZFG3fel199G9CH3fLyqv24NcB44MRhpdK788U3CpyKwsCw590xmfSpzsBt0Fqc3ud3vtZigxWcVZCklVpSiN0w3q5E/h9TGMIUuA3+EQAAAABJRU5ErkJggg==",S="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC"},function(e,t,n){"use strict";n.d(t,"a",function(){return l});var o=n(8),i=n.n(o),a=n(1),r=n(2),s=n(0),c=n(6),l=function(){function e(){i()(this,e),this.bDisabeCloseOnEsc=!1,this.sDefaultKeyScope=s.KeyState.None,this.sCurrentKeyScope=s.KeyState.None,this.viewModelVisibility=a.a.observable(!1),this.modalVisibility=a.a.observable(!1).extend({rateLimit:0}),this.viewModelName="",this.viewModelNames=[],this.viewModelDom=null}return e.prototype.storeAndSetKeyScope=function(){this.sCurrentKeyScope=Object(c.keyScope)(),Object(c.keyScope)(this.sDefaultKeyScope)},e.prototype.restoreKeyScope=function(){Object(c.keyScope)(this.sCurrentKeyScope)},e.prototype.registerPopupKeyDown=function(){var e=this;c.$win.on("keydown",function(t){if(t&&e.modalVisibility&&e.modalVisibility()){if(!e.bDisabeCloseOnEsc&&s.EventKeyCode.Esc===t.keyCode)return Object(r.delegateRun)(e,"cancelCommand"),!1;if(s.EventKeyCode.Backspace===t.keyCode&&!Object(r.inFocus)())return!1}return!0})},e.prototype.cancelCommand=function(){},e.prototype.closeCommand=function(){},e}()},function(e,t,n){"use strict";var o=n(8),i=n.n(o),a=n(3),r=n.n(a),s=n(1),c=n(7),l=n.n(c),u=n(5),d=function(){function e(){var t=this;i()(this,e),this.google={},this.twitter={},this.facebook={},this.dropbox={},this.google.enabled=s.a.observable(!1),this.google.clientID=s.a.observable(""),this.google.clientSecret=s.a.observable(""),this.google.apiKey=s.a.observable(""),this.google.loading=s.a.observable(!1),this.google.userName=s.a.observable(""),this.google.loggined=s.a.computed(function(){return""!==t.google.userName()}),this.google.capa={},this.google.capa.auth=s.a.observable(!1),this.google.capa.authFast=s.a.observable(!1),this.google.capa.drive=s.a.observable(!1),this.google.capa.preview=s.a.observable(!1),this.google.require={},this.google.require.clientSettings=s.a.computed(function(){return t.google.enabled()&&(t.google.capa.auth()||t.google.capa.drive())}),this.google.require.apiKeySettings=s.a.computed(function(){return t.google.enabled()&&t.google.capa.drive()}),this.facebook.enabled=s.a.observable(!1),this.facebook.appID=s.a.observable(""),this.facebook.appSecret=s.a.observable(""),this.facebook.loading=s.a.observable(!1),this.facebook.userName=s.a.observable(""),this.facebook.supported=s.a.observable(!1),this.facebook.loggined=s.a.computed(function(){return""!==t.facebook.userName()}),this.twitter.enabled=s.a.observable(!1),this.twitter.consumerKey=s.a.observable(""),this.twitter.consumerSecret=s.a.observable(""),this.twitter.loading=s.a.observable(!1),this.twitter.userName=s.a.observable(""),this.twitter.loggined=s.a.computed(function(){return""!==t.twitter.userName()}),this.dropbox.enabled=s.a.observable(!1),this.dropbox.apiKey=s.a.observable("")}return e.prototype.populate=function(){this.google.enabled(!!u.settingsGet("AllowGoogleSocial")),this.google.clientID(u.settingsGet("GoogleClientID")),this.google.clientSecret(u.settingsGet("GoogleClientSecret")),this.google.apiKey(u.settingsGet("GoogleApiKey")),this.google.capa.auth(!!u.settingsGet("AllowGoogleSocialAuth")),this.google.capa.authFast(!!u.settingsGet("AllowGoogleSocialAuthFast")),this.google.capa.drive(!!u.settingsGet("AllowGoogleSocialDrive")),this.google.capa.preview(!!u.settingsGet("AllowGoogleSocialPreview")),this.facebook.enabled(!!u.settingsGet("AllowFacebookSocial")),this.facebook.appID(u.settingsGet("FacebookAppID")),this.facebook.appSecret(u.settingsGet("FacebookAppSecret")),this.facebook.supported(!!u.settingsGet("SupportedFacebookSocial")),this.twitter.enabled=s.a.observable(!!u.settingsGet("AllowTwitterSocial")),this.twitter.consumerKey=s.a.observable(u.settingsGet("TwitterConsumerKey")),this.twitter.consumerSecret=s.a.observable(u.settingsGet("TwitterConsumerSecret")),this.dropbox.enabled(!!u.settingsGet("AllowDropboxSocial")),this.dropbox.apiKey(u.settingsGet("DropboxApiKey"))},e.prototype.appendDropbox=function(){if(!r.a.Dropbox&&this.dropbox.enabled()&&this.dropbox.apiKey()&&!r.a.document.getElementById("dropboxjs")){var e=r.a.document.createElement("script");e.type="text/javascript",e.src="https://www.dropbox.com/static/api/2/dropins.js",l()(e).attr("id","dropboxjs").attr("data-app-key",this.dropbox.apiKey()),r.a.document.body.appendChild(e)}},e}();t.a=new d},function(e,t,n){"use strict";var o=n(8),i=n.n(o),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(1),u=n(0),d=n(6),p=n(2),h=n(5),f=function(e){function t(){i()(this,t);var n=r()(this,e.call(this));n.currentAudio=l.a.observable(""),n.focusedState=l.a.observable(u.Focused.None);var o=h.appSettingsGet("mobile");return n.focusedState.subscribe(function(e){switch(e){case u.Focused.MessageList:Object(d.keyScope)(u.KeyState.MessageList),o&&Object(d.leftPanelDisabled)(!0);break;case u.Focused.MessageView:Object(d.keyScope)(u.KeyState.MessageView),o&&Object(d.leftPanelDisabled)(!0);break;case u.Focused.FolderList:Object(d.keyScope)(u.KeyState.FolderList),o&&Object(d.leftPanelDisabled)(!1)}}),n.projectHash=l.a.observable(""),n.threadsAllowed=l.a.observable(!1),n.composeInEdit=l.a.observable(!1),n.contactsAutosave=l.a.observable(!1),n.useLocalProxyForExternalImages=l.a.observable(!1),n.contactsIsAllowed=l.a.observable(!1),n.attachmentsActions=l.a.observableArray([]),n.devEmail="",n.devPassword="",n}return c()(t,e),t.prototype.populate=function(){e.prototype.populate.call(this),this.projectHash(h.settingsGet("ProjectHash")),this.contactsAutosave(!!h.settingsGet("ContactsAutosave")),this.useLocalProxyForExternalImages(!!h.settingsGet("UseLocalProxyForExternalImages")),this.contactsIsAllowed(!!h.settingsGet("ContactsIsAllowed"));var t=h.appSettingsGet("attachmentsActions");this.attachmentsActions(Object(p.isNonEmptyArray)(t)?t:[]),this.devEmail=h.settingsGet("DevEmail"),this.devPassword=h.settingsGet("DevPassword")},t}(n(116).a);t.a=new f},function(e,t,n){"use strict";n.d(t,"a",function(){return u}),n.d(t,"b",function(){return d});var o=n(8),i=n.n(o),a=n(7),r=n.n(a),s=n(1),c=n(2),l=n(10),u=function(){function e(){i()(this,e),this.disposable=[]}return e.prototype.dispose=function(){this.disposable.forEach(function(e){e&&e.dispose&&e.dispose()})},e}(),d=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return{template:t?{element:t}:"",viewModel:{createViewModel:function(t,n){return(t=t||{}).element=null,n&&n.element&&(t.component=n,t.element=r()(n.element),Object(l.i18nToNodes)(t.element),!Object(c.isUnd)(t.inline)&&s.a.unwrap(t.inline)&&t.element.css("display","inline-block")),new e(t)}}}}},function(e,t,n){"use strict";var o=n(8),i=n.n(o),a=n(3),r=n.n(a),s=n(1),c=n(23),l=n(0),u=n(6),d=n(2),p=n(22),h=n(5),f=function(){function e(){i()(this,e),this.iAutoLogoutTimer=0,this.layout=s.a.observable(l.Layout.SidePreview).extend({limitedList:[l.Layout.SidePreview,l.Layout.BottomPreview,l.Layout.NoPreview]}),this.editorDefaultType=s.a.observable(l.EditorDefaultType.Html).extend({limitedList:[l.EditorDefaultType.Html,l.EditorDefaultType.Plain,l.EditorDefaultType.HtmlForced,l.EditorDefaultType.PlainForced]}),this.messagesPerPage=s.a.observable(c.i).extend({limitedList:c.j}),this.showImages=s.a.observable(!1),this.useCheckboxesInList=s.a.observable(!0),this.allowDraftAutosave=s.a.observable(!0),this.useThreads=s.a.observable(!1),this.replySameFolder=s.a.observable(!1),this.autoLogout=s.a.observable(l.Magics.Time30mInMin),this.computers(),this.subscribers()}return e.prototype.computers=function(){var e=this;this.usePreviewPane=s.a.computed(function(){return l.Layout.NoPreview!==e.layout()})},e.prototype.subscribers=function(){this.layout.subscribe(function(e){u.$html.toggleClass("rl-no-preview-pane",l.Layout.NoPreview===e),u.$html.toggleClass("rl-side-preview-pane",l.Layout.SidePreview===e),u.$html.toggleClass("rl-bottom-preview-pane",l.Layout.BottomPreview===e),p.a("layout",[e])})},e.prototype.populate=function(){var e=this;this.layout(Object(d.pInt)(h.settingsGet("Layout"))),this.editorDefaultType(h.settingsGet("EditorDefaultType")),this.autoLogout(Object(d.pInt)(h.settingsGet("AutoLogout"))),this.messagesPerPage(h.settingsGet("MPP")),this.showImages(!!h.settingsGet("ShowImages")),this.useCheckboxesInList(!!h.settingsGet("UseCheckboxesInList")),this.allowDraftAutosave(!!h.settingsGet("AllowDraftAutosave")),this.useThreads(!!h.settingsGet("UseThreads")),this.replySameFolder(!!h.settingsGet("ReplySameFolder")),p.b("rl.auto-logout-refresh",function(){r.a.clearTimeout(e.iAutoLogoutTimer),01&&void 0!==arguments[1]?arguments[1]:[];Object(h.isArray)(b[e])&&p.a.each(b[e],function(e){e.apply(void 0,t)})}function a(e){return m.settingsGet(e)}function r(e,t,n,o){f.data.__APP__&&f.data.__APP__.remote().defaultRequest(e,"Plugin"+t,n,o)}function s(e,t,n,o){g.push([e,t,n,o])}function c(e,t,n,o){y.push([e,t,n,o])}function l(e){var t=n(9);p.a.each(e?y:g,function(e){t.addSettingsViewModel(e[0],e[1],e[2],e[3])})}function u(e,t){var n=m.settingsGet("Plugins");return(n=n&&!Object(h.isUnd)(n[e])?n[e]:null)?Object(h.isUnd)(n[t])?null:n[t]:null}n.d(t,"a",function(){return o}),n.d(t,"f",function(){return i}),n.d(t,"d",function(){return a}),n.d(t,"e",function(){return r}),n.d(t,"b",function(){return s}),n.d(t,"c",function(){return c}),n.d(t,"g",function(){return l}),n.d(t,"h",function(){return u});var d=n(4),p=n.n(d),h=n(2),f=n(6),m=n(5),b={},g=[],y=[]},function(e,t,n){"use strict";var o=n(8),i=n.n(o),a=n(1),r=n(4),s=n.n(r),c=n(7),l=n.n(c),u=n(10),d=n(2),p=n(31),h=n(9),f=function(){function e(){i()(this,e),this.capaOpenPGP=a.a.observable(!1),this.openpgp=null,this.openpgpkeys=a.a.observableArray([]),this.openpgpKeyring=null,this.openpgpkeysPublic=this.openpgpkeys.filter(function(e){return!(!e||e.isPrivate)}),this.openpgpkeysPrivate=this.openpgpkeys.filter(function(e){return!(!e||!e.isPrivate)})}return e.prototype.isSupported=function(){return!!this.openpgp},e.prototype.findKeyByHex=function(e,t){return s.a.find(e,function(e){return t&&e&&(t===e.id||-1').attr("title",Object(u.i18n)("MESSAGE/PGP_ENCRYPTED_MESSAGE_DESC")).on("click",e.domControlEncryptedClickHelper(this,t,s,a)):i&&(r=l()('
').attr("title",Object(u.i18n)("MESSAGE/PGP_SIGNED_MESSAGE_DESC")).on("click",e.domControlSignedClickHelper(this,t,s))),r&&t.before(r).before("
")}}},e}();t.a=new f},function(e,t,n){"use strict";var o=n(8),i=n.n(o),a=n(1),r=n(4),s=n.n(r),c=n(0),l=n(5),u=function(){function e(){i()(this,e),this.email=a.a.observable(""),this.parentEmail=a.a.observable(""),this.signature=a.a.observable(""),this.accounts=a.a.observableArray([]),this.accounts.loading=a.a.observable(!1).extend({throttle:c.Magics.Time100ms}),this.computers()}return e.prototype.computers=function(){var e=this;this.accountsEmails=a.a.computed(function(){return s.a.compact(s.a.map(e.accounts(),function(e){return e?e.email:null}))}),this.accountsUnreadCount=a.a.computed(function(){return 0})},e.prototype.populate=function(){this.email(l.settingsGet("Email")),this.parentEmail(l.settingsGet("ParentEmail"))},e.prototype.isRootAccount=function(){return""===this.parentEmail()},e}();t.a=new u},function(e,t,n){"use strict";var o=n(8),i=n.n(o),a=n(1),r=n(2),s=n(5),c=function(){function e(){i()(this,e),this.languages=a.a.observableArray([]),this.languagesAdmin=a.a.observableArray([]),this.language=a.a.observable("").extend({limitedList:this.languages}).extend({reversible:!0}),this.languageAdmin=a.a.observable("").extend({limitedList:this.languagesAdmin}).extend({reversible:!0}),this.userLanguage=a.a.observable(""),this.userLanguageAdmin=a.a.observable("")}return e.prototype.populate=function(){var e=s.appSettingsGet("languages"),t=s.appSettingsGet("languagesAdmin");this.languages(Object(r.isArray)(e)?e:[]),this.languagesAdmin(Object(r.isArray)(t)?t:[]),this.language(s.settingsGet("Language")),this.languageAdmin(s.settingsGet("LanguageAdmin")),this.userLanguage(s.settingsGet("UserLanguage")),this.userLanguageAdmin(s.settingsGet("UserLanguageAdmin"))},e}();t.a=new c},function(e,t,n){"use strict";function o(e,t){return!!v&&v.set("p"+e,t)}function i(e){return v?v.get("p"+e):null}var a=n(4),r=n.n(a),s=n(8),c=n.n(s),l=n(3),u=n.n(l),d=n(120),p=n.n(d),h=n(2),f=n(23),m=function(){function e(){c()(this,e)}return e.prototype.set=function(e,t){var n=!1,o=null;try{o=p.a.getJSON(f.b)}catch(e){}(o||(o={}))[e]=t;try{p.a.set(f.b,o,{expires:30}),n=!0}catch(e){}return n},e.prototype.get=function(e){var t=null;try{var n=p.a.getJSON(f.b);t=n&&!Object(h.isUnd)(n[e])?n[e]:null}catch(e){}return t},e.supported=function(){return!(!u.a.navigator||!u.a.navigator.cookieEnabled)},e}(),b=n(69),g=function(){function e(){c()(this,e),this.s=null,this.s=u.a.localStorage||null}return e.prototype.set=function(e,t){if(!this.s)return!1;var n=null;try{var o=this.s.getItem(f.b)||null;n=null===o?null:u.a.JSON.parse(o)}catch(e){}(n||(n={}))[e]=t;try{return this.s.setItem(f.b,u.a.JSON.stringify(n)),!0}catch(e){}return!1},e.prototype.get=function(e){if(!this.s)return null;try{var t=this.s.getItem(f.b)||null,n=null===t?null:u.a.JSON.parse(t);return n&&!Object(h.isUnd)(n[e])?n[e]:null}catch(e){}return null},e.supported=function(){return Object(b.d)("localStorage")},e}();n.d(t,"b",function(){return o}),n.d(t,"a",function(){return i});var y=r.a.find([g,m],function(e){return e&&e.supported()}),v=y?new y:null},function(e,t,n){"use strict";function o(){return S(),y||b()()}function i(){return O(),v||0}function a(e){return o().clone().subtract(e,"days").format("YYYY.MM.DD")}function r(e,t){var n=null,a="",r=i();if((n=0<(e=r<(e=0=t.diff(e,"hours"):return e.fromNow();case t.format("L")===e.format("L"):return Object(g.i18n)("MESSAGE_LIST/TODAY_AT",{TIME:e.format("LT")});case t.clone().subtract(1,"days").format("L")===e.format("L"):return Object(g.i18n)("MESSAGE_LIST/YESTERDAY_AT",{TIME:e.format("LT")});case t.year()===e.year():return e.format("D MMM.")}return e?e.format("LL"):""}(n);break;case"FULL":a=n.format("LLL");break;default:a=n.format(t)}return a}function s(e){var t,n="",o=f()(e);(t=o.data("moment-time"))&&((n=o.data("moment-format"))&&o.text(r(t,n)),(n=o.data("moment-format-title"))&&o.attr("title",r(t,n)))}function c(){p.a.defer(function(){f()(".moment",u.a.document).each(function(e,t){s(t)})})}n.r(t),n.d(t,"momentNow",function(){return o}),n.d(t,"momentNowUnix",function(){return i}),n.d(t,"searchSubtractFormatDateHelper",function(){return a}),n.d(t,"format",function(){return r}),n.d(t,"momentToNode",function(){return s}),n.d(t,"reload",function(){return c});var l=n(3),u=n.n(l),d=n(4),p=n.n(d),h=n(7),f=n.n(h),m=n(54),b=n.n(m),g=n(10),y=null,v=0,S=p.a.debounce(function(){y=b()()},500,!0),O=p.a.debounce(function(){v=b()().unix()},500,!0)},function(e,t){e.exports=window.hasher},function(e,t,n){"use strict";n.d(t,"a",function(){return r});var o=n(8),i=n.n(o),a=n(2),r=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";i()(this,e),this.sModelName="",this.disposables=[],this.sModelName=t||""}return e.prototype.regDisposables=function(e){var t=this;Object(a.isArray)(e)?e.forEach(function(e){t.disposables.push(e)}):e&&this.disposables.push(e)},e.prototype.onDestroy=function(){Object(a.disposeObject)(this)},e}()},,,function(e,t,n){"use strict";var o=n(8),i=n.n(o),a=n(1),r=n(2),s=n(5),c=function(){function e(){i()(this,e),this.themes=a.a.observableArray([]),this.themeBackgroundName=a.a.observable(""),this.themeBackgroundHash=a.a.observable(""),this.theme=a.a.observable("").extend({limitedList:this.themes})}return e.prototype.populate=function(){var e=s.appSettingsGet("themes");this.themes(Object(r.isArray)(e)?e:[]),this.theme(s.settingsGet("Theme")),this.themeBackgroundName(s.settingsGet("UserBackgroundName")),this.themeBackgroundHash(s.settingsGet("UserBackgroundHash"))},e}();t.a=new c},function(e,t){var n=e.exports={version:"2.5.1"};"number"==typeof __e&&(__e=n)},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t,n){e.exports=!n(51)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t,n){var o=n(109),i=n(73);e.exports=function(e){return o(i(e))}},function(e,t,n){"use strict";n.r(t),n.d(t,"EmailModel",function(){return u}),n.d(t,"default",function(){return u});var o=n(8),i=n.n(o),a=n(4),r=n.n(a),s=n(76),c=n.n(s),l=n(2),u=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";i()(this,e),this.email="",this.name="",this.dkimStatus="",this.dkimValue="",this.email=t,this.name=n,this.dkimStatus=o,this.dkimValue=a,this.clearDuplicateName()}return e.newInstanceFromJson=function(t){var n=new e;return n.initByJson(t)?n:null},e.prototype.clear=function(){this.email="",this.name="",this.dkimStatus="none",this.dkimValue=""},e.prototype.validate=function(){return""!==this.name||""!==this.email},e.prototype.hash=function(){return"#"+(arguments.length>0&&void 0!==arguments[0]&&arguments[0]?"":this.name)+"#"+this.email+"#"},e.prototype.clearDuplicateName=function(){this.name===this.email&&(this.name="")},e.prototype.search=function(e){return-1<(this.name+" "+this.email).toLowerCase().indexOf(e.toLowerCase())},e.prototype.initByJson=function(e){var t=!1;return e&&"Object/Email"===e["@Object"]&&(this.name=Object(l.trim)(e.Name),this.email=Object(l.trim)(e.Email),this.dkimStatus=Object(l.trim)(e.DkimStatus||""),this.dkimValue=Object(l.trim)(e.DkimValue||""),t=""!==this.email,this.clearDuplicateName()),t},e.prototype.toLine=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o="";return""!==this.email&&(e&&""!==this.name?o=t?'
")+'" target="_blank" tabindex="-1">'+Object(l.encodeHtml)(this.name)+"":n?Object(l.encodeHtml)(this.name):this.name:(o=this.email,""!==this.name?t?o=Object(l.encodeHtml)('"'+this.name+'" <')+'")+'" target="_blank" tabindex="-1">'+Object(l.encodeHtml)(o)+""+Object(l.encodeHtml)(">"):(o='"'+this.name+'" <'+o+">",n&&(o=Object(l.encodeHtml)(o))):t&&(o=''+Object(l.encodeHtml)(this.email)+""))),o},e.splitEmailLine=function(t){var n=c()(t);if(Object(l.isNonEmptyArray)(n)){var o=[],i=!1;return n.forEach(function(t){var n=t.address?new e(t.address.replace(/^[<]+(.*)[>]+$/g,"$1"),t.name||""):null;n&&n.email&&(i=!0),o.push(n?n.toLine(!1):t.name)}),i?o:null}return null},e.parseEmailLine=function(t){var n=c()(t);return Object(l.isNonEmptyArray)(n)?r.a.compact(n.map(function(t){return t.address?new e(t.address.replace(/^[<]+(.*)[>]+$/g,"$1"),t.name||""):null})):[]},e.prototype.parse=function(e){if(""===(e=Object(l.trim)(e)))return!1;var t=c()(e);return!(!Object(l.isNonEmptyArray)(t)||!t[0]||(this.name=t[0].name||"",this.email=t[0].address||"",this.clearDuplicateName(),0))},e}()},function(e,t,n){"use strict";var o=n(8),i=n.n(o),a=n(3),r=n.n(a),s=n(6),c=n(16),l=n(22),u=n(2),d=function(){function e(){var t=this;if(i()(this,e),this.notificator=null,this.player=null,this.supported=!1,this.supportedMp3=!1,this.supportedOgg=!1,this.supportedWav=!1,this.supportedNotification=!1,this.player=this.createNewObject(),this.supported=!(s.bMobileDevice||s.bSafari||!this.player||!this.player.play),this.supported&&this.player&&this.player.canPlayType&&(this.supportedMp3=""!==this.player.canPlayType("audio/mpeg;").replace(/no/,""),this.supportedWav=""!==this.player.canPlayType('audio/wav; codecs="1"').replace(/no/,""),this.supportedOgg=""!==this.player.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/,""),this.supportedNotification=this.supported&&this.supportedMp3),this.player&&(this.supportedMp3||this.supportedOgg||this.supportedWav)||(this.supported=!1,this.supportedMp3=!1,this.supportedOgg=!1,this.supportedWav=!1,this.supportedNotification=!1),this.supported&&this.player){var n=function(){return t.stop()};this.player.addEventListener("ended",n),this.player.addEventListener("error",n),l.b("audio.api.stop",n)}}return e.prototype.createNewObject=function(){var e=r.a.Audio?new r.a.Audio:null;return e&&e.canPlayType&&e.pause&&e.play&&(e.preload="none",e.loop=!1,e.autoplay=!1,e.muted=!1),e},e.prototype.paused=function(){return!this.supported||!!this.player.paused},e.prototype.stop=function(){this.supported&&this.player.pause&&this.player.pause(),l.a("audio.stop")},e.prototype.pause=function(){this.stop()},e.prototype.clearName=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return e=Object(u.trim)(e),t&&"."+t===e.toLowerCase().substr(-1*(t.length+1))&&(e=Object(u.trim)(e.substr(0,e.length-4))),""===e?"audio":e},e.prototype.playMp3=function(e,t){this.supported&&this.supportedMp3&&(this.player.src=e,this.player.play(),l.a("audio.start",[this.clearName(t,"mp3"),"mp3"]))},e.prototype.playOgg=function(e,t){this.supported&&this.supportedOgg&&(this.player.src=e,this.player.play(),t=this.clearName(t,"oga"),t=this.clearName(t,"ogg"),l.a("audio.start",[t,"ogg"]))},e.prototype.playWav=function(e,t){this.supported&&this.supportedWav&&(this.player.src=e,this.player.play(),l.a("audio.start",[this.clearName(t,"wav"),"wav"]))},e.prototype.playNotification=function(){this.supported&&this.supportedMp3&&(this.notificator||(this.notificator=this.createNewObject(),this.notificator.src=c.D("new-mail.mp3")),this.notificator&&this.notificator.play&&this.notificator.play())},e}();t.a=new d},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t,n){"use strict";n.d(t,"a",function(){return p});var o=n(8),i=n.n(o),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(1),u=n(2),d=n(0),p=function(e){function t(n){i()(this,t);var o=r()(this,e.call(this));return o.value=n.value||"",o.size=n.size||0,o.label=n.label||"",o.preLabel=n.preLabel||"",o.enable=!!Object(u.isUnd)(n.enable)||n.enable,o.trigger=n.trigger&&n.trigger.subscribe?n.trigger:null,o.placeholder=n.placeholder||"",o.labeled=!Object(u.isUnd)(n.label),o.preLabeled=!Object(u.isUnd)(n.preLabel),o.triggered=!Object(u.isUnd)(n.trigger)&&!!o.trigger,o.classForTrigger=l.a.observable(""),o.className=l.a.computed(function(){var e=l.a.unwrap(o.size),t=o.trigger?" "+Object(u.trim)("settings-saved-trigger-input "+o.classForTrigger()):"";return(0o?10:o,S.a.displaySpecSetting(0>=n||oObject(f.microtime)()-l);var d="";switch(!0){case"success"===n&&t&&t.Result&&e===t.Action:d=m.StorageResultType.Success;break;case!("abort"!==n||t&&t.__aborted__):d=m.StorageResultType.Abort;break;default:d=m.StorageResultType.Error}L.f("ajax-default-response",[e,m.StorageResultType.Success===d?t:null,d,i,o]),"success"===n?t&&t.Result&&e===t.Action?(t.__cached__=i,s(t)):t&&t.Action?(u=t,c(t.ErrorCode?t.ErrorCode:m.Notification.AjaxFalse)):(u=t,c(m.Notification.AjaxParse)):"timeout"===n?(u=t,c(m.Notification.AjaxTimeout)):"abort"===n?t&&t.__aborted__||c(m.Notification.AjaxAbort):(u=t,c(m.Notification.AjaxParse)),r.oRequests[e]&&(r.oRequests[e]=null,delete r.oRequests[e]),r.setTrigger(a,!1),u&&(-11&&void 0!==arguments[1]&&arguments[1];if(!a.a.Promise||!a.a.Promise.all)throw new Error("Promises are not available your environment.");if(!e)throw new Error("src should not be empty.");return new a.a.Promise(function(n,o){var i=a.a.document.createElement("script");i.onload=function(){n(e)},i.onerror=function(){o(new Error(e))},i.async=!0===t,i.src=e,a.a.document.body.appendChild(i)})}n.d(t,"a",function(){return o});var i=n(3),a=n.n(i)},function(e,t,n){var o=n(85)("wks"),i=n(70),a=n(41).Symbol,r="function"==typeof a;(e.exports=function(e){return o[e]||(o[e]=r&&a[e]||(r?a:i)("Symbol."+e))}).store=o},function(e,t,n){var o=n(52);e.exports=function(e){if(!o(e))throw TypeError(e+" is not an object!");return e}},function(e,t,n){"use strict";var o=n(8),i=n.n(o),a=n(3),r=n.n(a),s=n(1),c=n(0),l=n(22),u=n(45),d=n(5),p=function(){function e(){var t=this;i()(this,e),this.enableSoundNotification=s.a.observable(!1),this.soundNotificationIsSupported=s.a.observable(!1),this.allowDesktopNotification=s.a.observable(!1),this.desktopNotificationPermissions=s.a.computed(function(){t.allowDesktopNotification();var e=c.DesktopNotification.NotSupported,n=t.notificationClass();if(n&&n.permission)switch(n.permission.toLowerCase()){case"granted":e=c.DesktopNotification.Allowed;break;case"denied":e=c.DesktopNotification.Denied;break;case"default":e=c.DesktopNotification.NotAllowed}else r.a.webkitNotifications&&r.a.webkitNotifications.checkPermission&&(e=r.a.webkitNotifications.checkPermission());return e}).extend({notify:"always"}),this.enableDesktopNotification=s.a.computed({read:function(){return t.allowDesktopNotification()&&c.DesktopNotification.Allowed===t.desktopNotificationPermissions()},write:function(e){if(e){var n=t.notificationClass(),o=t.desktopNotificationPermissions();n&&c.DesktopNotification.Allowed===o?t.allowDesktopNotification(!0):n&&c.DesktopNotification.NotAllowed===o?n.requestPermission(function(){t.allowDesktopNotification.valueHasMutated(),c.DesktopNotification.Allowed===t.desktopNotificationPermissions()?t.allowDesktopNotification()?t.allowDesktopNotification.valueHasMutated():t.allowDesktopNotification(!0):t.allowDesktopNotification()?t.allowDesktopNotification(!1):t.allowDesktopNotification.valueHasMutated()}):t.allowDesktopNotification(!1)}else t.allowDesktopNotification(!1)}}).extend({notify:"always"}),this.enableDesktopNotification.valueHasMutated||(this.enableDesktopNotification.valueHasMutated=function(){t.allowDesktopNotification.valueHasMutated()}),this.computers(),this.initNotificationPlayer()}return e.prototype.computers=function(){var e=this;this.isDesktopNotificationSupported=s.a.computed(function(){return c.DesktopNotification.NotSupported!==e.desktopNotificationPermissions()}),this.isDesktopNotificationDenied=s.a.computed(function(){return c.DesktopNotification.NotSupported===e.desktopNotificationPermissions()||c.DesktopNotification.Denied===e.desktopNotificationPermissions()})},e.prototype.initNotificationPlayer=function(){u.a&&u.a.supportedNotification?this.soundNotificationIsSupported(!0):(this.enableSoundNotification(!1),this.soundNotificationIsSupported(!1))},e.prototype.playSoundNotification=function(e){u.a&&u.a.supportedNotification&&(e||this.enableSoundNotification())&&u.a.playNotification()},e.prototype.displayDesktopNotification=function(e,t,n,o){if(this.enableDesktopNotification()){var i=this.notificationClass(),a=i?new i(t,{body:n,icon:e}):null;a&&(a.show&&a.show(),o&&(a.onclick=function(){r.a.focus(),o.Folder&&o.Uid&&l.a("mailbox.message.show",[o.Folder,o.Uid])}),r.a.setTimeout((s=a,function(){s.cancel?s.cancel():s.close&&s.close()}),c.Magics.Time7s))}var s},e.prototype.populate=function(){this.enableSoundNotification(!!d.settingsGet("SoundNotification")),this.enableDesktopNotification(!!d.settingsGet("DesktopNotifications"))},e.prototype.notificationClass=function(){return r.a.Notification&&r.a.Notification.requestPermission?r.a.Notification:null},e}();t.a=new p},function(e,t,n){"use strict";function o(e,t,n,o,i){var a={};return Object.keys(o).forEach(function(e){a[e]=o[e]}),a.enumerable=!!a.enumerable,a.configurable=!!a.configurable,("value"in a||a.initializer)&&(a.writable=!0),a=n.slice().reverse().reduce(function(n,o){return o(e,t,n)||n},a),i&&void 0!==a.initializer&&(a.value=a.initializer?a.initializer.call(i):void 0,a.initializer=void 0),void 0===a.initializer&&(Object.defineProperty(e,t,a),a=null),a}n.r(t);var i,a,r,s,c,l,u,d,p,h,f=n(18),m=n.n(f),b=n(8),g=n.n(b),y=n(12),v=n.n(y),S=n(11),O=n.n(S),w=n(3),T=n.n(w),C=n(4),A=n.n(C),E=n(7),F=n.n(E),j=n(1),N=n(19),R=n.n(N),I=n(78),L=n.n(I),_=n(0),P=n(2),D=n(23),M=n(6),k=n(16),x=n(10),U=n(34),H=n(15),B=n(95),G=n(26),K=n(28),V=n(56),z=n(31),q=n(13),W=n(30),Y=n(14),$=n(25),J=n(17),X=n(5),Z=n(22),Q=n(79),ee=function(e){function t(n,o){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,a=arguments.length>3&&void 0!==arguments[3]&&arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4],s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"",c=arguments.length>6&&void 0!==arguments[6]?arguments[6]:"";g()(this,t);var l=v()(this,e.call(this,"ComposeAttachmentModel"));return l.id=n,l.isInline=!!a,l.isLinked=!!r,l.CID=s,l.contentLocation=c,l.fromMessage=!1,l.fileName=j.a.observable(o),l.size=j.a.observable(i),l.tempName=j.a.observable(""),l.progress=j.a.observable(0),l.error=j.a.observable(""),l.waiting=j.a.observable(!0),l.uploading=j.a.observable(!1),l.enabled=j.a.observable(!0),l.complete=j.a.observable(!1),l.progressText=j.a.computed(function(){var e=l.progress();return 0===e?"":(98a[e.email][1])&&(o=a[e.email][0],n=a[e.email][1])};if(A.a.each(i,function(e,t){a[e.email()]=[e,t]}),t)switch(e){case _.ComposeType.Empty:break;case _.ComposeType.Reply:case _.ComposeType.ReplyAll:case _.ComposeType.Forward:case _.ComposeType.ForwardAsAttachment:A.a.each(A.a.union(t.to,t.cc,t.bcc),r),o||A.a.each(t.deliveredTo,r);break;case _.ComposeType.Draft:A.a.each(A.a.union(t.from,t.replyTo),r)}return o||i[0]||null},t.prototype.selectIdentity=function(e){e&&e.item&&(this.currentIdentity(e.item),this.setSignatureFromIdentity(e.item))},t.prototype.sendMessageResponse=function(e,t){var n=!1,o="";this.sending(!1),_.StorageResultType.Success===e&&t&&t.Result&&(n=!0,this.modalVisibility()&&Object(P.delegateRun)(this,"closeCommand")),this.modalVisibility()&&!n&&(t&&_.Notification.CantSaveMessage===t.ErrorCode?(this.sendSuccessButSaveError(!0),this.savedErrorDesc(Object(P.trim)(Object(x.i18n)("COMPOSE/SAVED_ERROR_ON_SEND")))):(o=Object(x.getNotification)(t&&t.ErrorCode?t.ErrorCode:_.Notification.CantSendMessage,t&&t.ErrorMessage?t.ErrorMessage:""),this.sendError(!0),this.sendErrorDesc(o||Object(x.getNotification)(_.Notification.CantSendMessage)))),this.reloadDraftFolder()},t.prototype.saveMessageResponse=function(e,t){var n=!1;if(this.saving(!1),_.StorageResultType.Success===e&&t&&t.Result&&t.Result.NewFolder&&t.Result.NewUid){if(n=!0,this.bFromDraft){var o=Y.a.message();o&&this.draftFolder()===o.folderFullNameRaw&&this.draftUid()===o.uid&&Y.a.message(null)}this.draftFolder(t.Result.NewFolder),this.draftUid(t.Result.NewUid),this.savedTime(T.a.Math.round((new T.a.Date).getTime()/1e3)),this.bFromDraft&&Object(H.q)(this.draftFolder(),"")}n||(this.savedError(!0),this.savedErrorDesc(Object(x.getNotification)(_.Notification.CantSaveMessage))),this.reloadDraftFolder()},t.prototype.onHide=function(){this.autosaveStop(),this.bSkipNextHide||(G.a.composeInEdit(!1),this.reset()),this.bSkipNextHide=!1,this.to.focused(!1),Object(ne.routeOn)()},t.prototype.editor=function(e){var t=this;e&&(!this.oEditor&&this.composeEditorArea()?this.oEditor=new B.HtmlEditor(this.composeEditorArea(),null,function(){e(t.oEditor),t.resizerTrigger()},function(e){t.isHtml(!!e)}):this.oEditor&&(e(this.oEditor),this.resizerTrigger()))},t.prototype.converSignature=function(e){var t=10,n="",o=[],i=/{{MOMENT:([^}]+)}}/g;if(e=e.replace(/[\r]/g,""),""!==(n=this.oLastMessage?this.emailArrayToStringLineHelper(this.oLastMessage.from,!0):"")&&(e=e.replace(/{{FROM-FULL}}/g,n),-1===n.indexOf(" ")&&0
"+f+":

"+Object(P.trim)(h)+"
";break;case _.ComposeType.Forward:c=g.fromToLine(!1,!0),l=g.toToLine(!1,!0),u=g.ccToLine(!1,!0),h="

"+Object(x.i18n)("COMPOSE/FORWARD_MESSAGE_TOP_TITLE")+"
"+Object(x.i18n)("COMPOSE/FORWARD_MESSAGE_TOP_FROM")+": "+c+"
"+Object(x.i18n)("COMPOSE/FORWARD_MESSAGE_TOP_TO")+": "+l+(0"+Object(x.i18n)("COMPOSE/FORWARD_MESSAGE_TOP_CC")+": "+u:"")+"
"+Object(x.i18n)("COMPOSE/FORWARD_MESSAGE_TOP_SENT")+": "+Object(P.encodeHtml)(d)+"
"+Object(x.i18n)("COMPOSE/FORWARD_MESSAGE_TOP_SUBJECT")+": "+Object(P.encodeHtml)(p)+"

"+Object(P.trim)(h)+"

";break;case _.ComposeType.ForwardAsAttachment:h=""}this.editor(function(e){e.setHtml(h,!1),(_.EditorDefaultType.PlainForced===s.editorDefaultType()||!g.isHtml()&&_.EditorDefaultType.HtmlForced!==s.editorDefaultType())&&e.modeToggle(!1),m&&_.ComposeType.Draft!==S&&_.ComposeType.EditAsNew!==S&&s.setSignatureFromIdentity(m),s.setFocusInPopup()})}else _.ComposeType.Empty===S?(this.subject(Object(P.isNormal)(a)?""+a:""),h=Object(P.isNormal)(r)?""+r:"",this.editor(function(e){e.setHtml(h,!1),_.EditorDefaultType.Html!==s.editorDefaultType()&&_.EditorDefaultType.HtmlForced!==s.editorDefaultType()&&e.modeToggle(!1),m&&s.setSignatureFromIdentity(m),s.setFocusInPopup()})):Object(P.isNonEmptyArray)(t)?(A.a.each(t,function(e){s.addMessageAsAttachment(e)}),this.editor(function(e){e.setHtml("",!1),_.EditorDefaultType.Html!==s.editorDefaultType()&&_.EditorDefaultType.HtmlForced!==s.editorDefaultType()&&e.modeToggle(!1),m&&_.ComposeType.Draft!==S&&_.ComposeType.EditAsNew!==S&&s.setSignatureFromIdentity(m),s.setFocusInPopup()})):this.setFocusInPopup();var T=this.getAttachmentsDownloadsForUpload();Object(P.isNonEmptyArray)(T)&&J.a.messageUploadAttachments(this.onMessageUploadAttachments,T),m&&this.currentIdentity(m),this.resizerTrigger()},t.prototype.onMessageUploadAttachments=function(e,t){var n=this;_.StorageResultType.Success===e&&t&&t.Result?this.viewModelVisibility()||A.a.each(t.Result,function(e,t){var o=n.getAttachmentById(e);o&&(o.tempName(t),o.waiting(!1).uploading(!1).complete(!0))}):this.setMessageAttachmentFailedDownloadText()},t.prototype.setFocusInPopup=function(){var e=this;M.bMobileDevice||A.a.delay(function(){""===e.to()?e.to.focused(!0):e.oEditor&&(e.to.focused()||e.oEditor.focus())},_.Magics.Time100ms)},t.prototype.onShowWithDelay=function(){this.resizerTrigger()},t.prototype.tryToClosePopup=function(){var e=this,t=n(99);!Object(ne.isPopupVisible)(t)&&this.modalVisibility()&&(this.bSkipNextHide||this.isEmptyForm()&&!this.draftUid()?Object(P.delegateRun)(this,"closeCommand"):Object(ne.showScreenPopup)(t,[Object(x.i18n)("POPUPS_ASK/DESC_WANT_CLOSE_THIS_WINDOW"),function(){e.modalVisibility()&&Object(P.delegateRun)(e,"closeCommand")}]))},t.prototype.onBuild=function(){var e=this;this.initUploader(),R()("ctrl+q, command+q, ctrl+w, command+w",_.KeyState.Compose,P.noopFalse),R()("`",_.KeyState.Compose,function(){return!(e.oEditor&&!e.oEditor.hasFocus()&&!Object(P.inFocus)()&&(e.identitiesDropdownTrigger(!0),1))}),R()("ctrl+`",_.KeyState.Compose,function(){return e.identitiesDropdownTrigger(!0),!1}),R()("esc, ctrl+down, command+down",_.KeyState.Compose,function(){return e.skipCommand(),!1}),this.allowFolders&&R()("ctrl+s, command+s",_.KeyState.Compose,function(){return e.saveCommand(),!1}),X.appSettingsGet("allowCtrlEnterOnCompose")&&R()("ctrl+enter, command+enter",_.KeyState.Compose,function(){return e.sendCommand(),!1}),R()("shift+esc",_.KeyState.Compose,function(){return e.modalVisibility()&&e.tryToClosePopup(),!1}),Z.b("window.resize.real",this.resizerTrigger),Z.b("window.resize.real",A.a.debounce(this.resizerTrigger,_.Magics.Time50ms)),$.a.appendDropbox(),this.driveEnabled()&&F.a.getScript("https://apis.google.com/js/api.js",function(){T.a.gapi&&e.driveVisible(!0)}),T.a.setInterval(function(){e.modalVisibility()&&e.oEditor&&e.oEditor.resize()},_.Magics.Time5s)},t.prototype.driveCallback=function(e,t){var n=this;if(t&&T.a.XMLHttpRequest&&T.a.google&&t[T.a.google.picker.Response.ACTION]===T.a.google.picker.Action.PICKED&&t[T.a.google.picker.Response.DOCUMENTS]&&t[T.a.google.picker.Response.DOCUMENTS][0]&&t[T.a.google.picker.Response.DOCUMENTS][0].id){var o=new T.a.XMLHttpRequest;o.open("GET","https://www.googleapis.com/drive/v2/files/"+t[T.a.google.picker.Response.DOCUMENTS][0].id),o.setRequestHeader("Authorization","Bearer "+e),o.addEventListener("load",function(){if(o&&o.responseText){var t=T.a.JSON.parse(o.responseText),i=function(e,n,o){e&&e.exportLinks&&(e.exportLinks[n]?(t.downloadUrl=e.exportLinks[n],t.title=e.title+"."+o,t.mimeType=n):e.exportLinks["application/pdf"]&&(t.downloadUrl=e.exportLinks["application/pdf"],t.title=e.title+".pdf",t.mimeType="application/pdf"))};if(t&&!t.downloadUrl&&t.mimeType&&t.exportLinks)switch(t.mimeType.toString().toLowerCase()){case"application/vnd.google-apps.document":i(t,"application/vnd.openxmlformats-officedocument.wordprocessingml.document","docx");break;case"application/vnd.google-apps.spreadsheet":i(t,"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","xlsx");break;case"application/vnd.google-apps.drawing":i(t,"image/png","png");break;case"application/vnd.google-apps.presentation":i(t,"application/vnd.openxmlformats-officedocument.presentationml.presentation","pptx");break;default:i(t,"application/pdf","pdf")}t&&t.downloadUrl&&n.addDriveAttachment(t,e)}}),o.send()}},t.prototype.driveCreatePiker=function(e){var t=this;T.a.gapi&&e&&e.access_token&&T.a.gapi.load("picker",{callback:function(){T.a.google&&T.a.google.picker&&(new T.a.google.picker.PickerBuilder).addView(T.a.google.picker.ViewId.DOCS).setAppId(X.settingsGet("GoogleClientID")).setOAuthToken(e.access_token).setCallback(A.a.bind(t.driveCallback,t,e.access_token)).enableFeature(T.a.google.picker.Feature.NAV_HIDDEN).build().setVisible(!0)}})},t.prototype.driveOpenPopup=function(){var e=this;T.a.gapi&&T.a.gapi.load("auth",{callback:function(){var t=T.a.gapi.auth.getToken(),n=function(t){if(t&&!t.error){var n=T.a.gapi.auth.getToken();return n&&e.driveCreatePiker(n),!0}return!1};t?e.driveCreatePiker(t):T.a.gapi.auth.authorize({client_id:X.settingsGet("GoogleClientID"),scope:"https://www.googleapis.com/auth/drive.readonly",immediate:!0},function(e){n(e)||T.a.gapi.auth.authorize({client_id:X.settingsGet("GoogleClientID"),scope:"https://www.googleapis.com/auth/drive.readonly",immediate:!1},n)})}})},t.prototype.getAttachmentById=function(e){return A.a.find(this.attachments(),function(t){return t&&e===t.id})},t.prototype.cancelAttachmentHelper=function(e,t){var n=this;return function(){var o=A.a.find(n.attachments(),function(t){return t&&t.id===e});o&&(n.attachments.remove(o),Object(P.delegateRunOnDestroy)(o),t&&t.cancel(e))}},t.prototype.initUploader=function(){var e=this;if(this.composeUploaderButton()){var t={},n=Object(P.pInt)(X.settingsGet("AttachmentLimit")),o=new L.a({action:Object(k.G)(),name:"uploader",queueSize:2,multipleSizeLimit:50,clickElement:this.composeUploaderButton(),dragAndDropElement:this.composeUploaderDropPlace()});o?(o.on("onDragEnter",function(){e.dragAndDropOver(!0)}).on("onDragLeave",function(){e.dragAndDropOver(!1)}).on("onBodyDragEnter",function(){e.attachmentsPlace(!0),e.dragAndDropVisible(!0)}).on("onBodyDragLeave",function(){e.dragAndDropVisible(!1)}).on("onProgress",function(n,o,i){var a=t[n];a||(a=e.getAttachmentById(n))&&(t[n]=a),a&&a.progress(T.a.Math.floor(o/i*100))}).on("onSelect",function(t,i){e.dragAndDropOver(!1);var a=Object(P.isUnd)(i.FileName)?"":i.FileName.toString(),r=Object(P.isNormal)(i.Size)?Object(P.pInt)(i.Size):null,s=new ee(t,a,r);return s.cancel=e.cancelAttachmentHelper(t,o),e.attachments.push(s),e.attachmentsPlace(!0),!(00&&void 0!==arguments[0]&&!arguments[0]?0===this.attachmentsInReady().length:0===this.attachments().length;return 0===this.to().length&&0===this.cc().length&&0===this.bcc().length&&0===this.replyTo().length&&0===this.subject().length&&e&&(!this.oEditor||""===this.oEditor.getData())},t.prototype.reset=function(){this.to(""),this.cc(""),this.bcc(""),this.replyTo(""),this.subject(""),this.requestDsn(!1),this.requestReadReceipt(!1),this.markAsImportant(!1),this.attachmentsPlace(!1),this.aDraftInfo=null,this.sInReplyTo="",this.bFromDraft=!1,this.sReferences="",this.sendError(!1),this.sendSuccessButSaveError(!1),this.savedError(!1),this.savedTime(0),this.emptyToError(!1),this.attachmentsInProcessError(!1),this.showCc(!1),this.showBcc(!1),this.showReplyTo(!1),Object(P.delegateRunOnDestroy)(this.attachments()),this.attachments([]),this.dragAndDropOver(!1),this.dragAndDropVisible(!1),this.draftFolder(""),this.draftUid(""),this.sending(!1),this.saving(!1),this.oEditor&&this.oEditor.clear(!1)},t.prototype.getAttachmentsDownloadsForUpload=function(){return A.a.map(A.a.filter(this.attachments(),function(e){return e&&""===e.tempName()}),function(e){return e.id})},t.prototype.resizerTrigger=function(){this.resizer(!this.resizer())},t}(oe.a)).prototype,"sendCommand",[a],m()(h.prototype,"sendCommand"),h.prototype),o(h.prototype,"saveCommand",[r],m()(h.prototype,"saveCommand"),h.prototype),o(h.prototype,"deleteCommand",[s],m()(h.prototype,"deleteCommand"),h.prototype),o(h.prototype,"skipCommand",[c],m()(h.prototype,"skipCommand"),h.prototype),o(h.prototype,"contactsCommand",[l],m()(h.prototype,"contactsCommand"),h.prototype),o(h.prototype,"dropboxCommand",[u],m()(h.prototype,"dropboxCommand"),h.prototype),o(h.prototype,"driveCommand",[d],m()(h.prototype,"driveCommand"),h.prototype),p=h))||p)},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){"use strict";n.d(t,"a",function(){return u});var o=n(8),i=n.n(o),a=n(4),r=n.n(a),s=n(75),c=n.n(s),l=n(2),u=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];i()(this,e),this.oCross=null,this.sScreenName=t,this.aViewModels=Object(l.isArray)(n)?n:[]}return e.prototype.viewModels=function(){return this.aViewModels},e.prototype.screenName=function(){return this.sScreenName},e.prototype.routes=function(){return null},e.prototype.__cross=function(){return this.oCross},e.prototype.__start=function(){var e=null,t=null,n=this.routes();Object(l.isNonEmptyArray)(n)&&(t=r.a.bind(this.onRoute||l.noop,this),e=c.a.create(),n.forEach(function(n){n&&e&&(e.addRoute(n[0],t).rules=n[1])}),this.oCross=e)},e}()},function(e,t){e.exports=window.ssm},function(e,t,n){var o=n(52);e.exports=function(e,t){if(!o(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!o(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!o(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!o(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},,function(e,t,n){"use strict";function o(e){if(e in l.a&&l.a[e]&&l.a[e].setItem){var t=l.a[e],n="testLocalStorage_"+l.a.Math.random();try{if(t.setItem(n,n),n===t.getItem(n))return t.removeItem(n),!0}catch(e){}}return!1}function i(){return h(u)}function a(){var e="AuthAccountHash",t=l.a.__rlah_data();f(u,t&&t[e]?t[e]:""),b()}function r(){f(u,""),b()}function s(){return m()>g()+36e5&&(r(),!0)}n.d(t,"d",function(){return o}),n.d(t,"c",function(){return i}),n.d(t,"e",function(){return a}),n.d(t,"b",function(){return r}),n.d(t,"a",function(){return s});var c=n(3),l=n.n(c),u="__rlA",d=o("sessionStorage")&&l.a.sessionStorage||null,p=l.a.top||l.a||null,h=function(e){var t=null;if(d)t=d.getItem(e)||null;else if(p&&l.a.JSON){var n=p.name&&"{"===p.name.toString().substr(0,1)?l.a.JSON.parse(p.name.toString()):null;t=n&&n[e]||null}return t},f=function(e,t){if(d)d.setItem(e,t);else if(p&&l.a.JSON){var n=p.name&&"{"===p.name.toString().substr(0,1)?l.a.JSON.parse(p.name.toString()):null;(n=n||{})[e]=t,p.name=l.a.JSON.stringify(n)}},m=function(){return l.a.Math.round((new l.a.Date).getTime()/1e3)},b=function(){return f("__rlT",m())},g=function(){var e=h("__rlT",0);return e&&l.a.parseInt(e,10)||0};l.a.setInterval(b,6e4)},function(e,t){var n=0,o=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+o).toString(36))}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,n){var o=n(71),i=n(64),a=n(43),r=n(67),s=n(46),c=n(77),l=Object.getOwnPropertyDescriptor;t.f=n(42)?l:function(e,t){if(e=a(e),t=r(t,!0),c)try{return l(e,t)}catch(e){}if(s(e,t))return i(!o.f.call(e,t),e[t])}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){"use strict";n.d(t,"a",function(){return d});var o=n(8),i=n.n(o),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(1),u=n(2),d=function(e){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};i()(this,t);var o=r()(this,e.call(this));return o.value=n.value,!Object(u.isUnd)(o.value)&&o.value.subscribe||(o.value=l.a.observable(!Object(u.isUnd)(o.value)&&!!o.value)),o.enable=n.enable,!Object(u.isUnd)(o.enable)&&o.enable.subscribe||(o.enable=l.a.observable(!!Object(u.isUnd)(o.enable)||!!o.enable)),o.disable=n.disable,!Object(u.isUnd)(o.disable)&&o.disable.subscribe||(o.disable=l.a.observable(!Object(u.isUnd)(o.disable)&&!!o.disable)),o.label=n.label||"",o.inline=!Object(u.isUnd)(n.inline)&&n.inline,o.readOnly=!Object(u.isUnd)(n.readOnly)&&!!n.readOnly,o.inverted=!Object(u.isUnd)(n.inverted)&&!!n.inverted,o.labeled=!Object(u.isUnd)(n.label),o.labelAnimated=!!n.labelAnimated,o}return c()(t,e),t.prototype.click=function(){this.readOnly||!this.enable()||this.disable()||this.value(!this.value())},t}(n(27).a)},function(e,t){e.exports=window.crossroads},function(e,t,n){"use strict";function o(e){var t=[],n=[],i=[];return new r(e).tokenize().forEach(function(e){"operator"!==e.type||","!==e.value&&";"!==e.value?n.push(e):(n.length&&t.push(n),n=[])}),n.length&&t.push(n),t.forEach(function(e){(e=function(e){for(var t=!1,n="text",i=void 0,a=[],r={address:[],comment:[],group:[],text:[]},s=0,c=e.length;s=0;u--)if(r.text[u].match(/^[^@\s]+@[^@\s]+$/)){r.address=r.text.splice(u,1);break}if(!r.address.length)for(var d=r.text.length-1;d>=0&&(r.text[d]=r.text[d].replace(/\s*\b[^@\s]+@[^@\s]+\b\s*/,function(e){return r.address.length?e:(r.address=[e.trim()]," ")}).trim(),!r.address.length);d--);}if(!r.text.length&&r.comment.length&&(r.text=r.comment,r.comment=[]),r.address.length>1&&(r.text=r.text.concat(r.address.splice(1))),r.text=r.text.join(" "),r.address=r.address.join(" "),!r.address&&t)return[];(i={address:r.address||r.text||"",name:r.text||r.address||""}).address===i.name&&((i.address||"").match(/@/)?i.name="":i.address=""),a.push(i)}return a}(e)).length&&(i=i.concat(e))}),i}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n",",":"",":":";",";":""},r=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.str=(t||"").toString(),this.operatorCurrent="",this.operatorExpecting="",this.node=null,this.escaped=!1,this.list=[]}return i(e,[{key:"tokenize",value:function(){for(var e=void 0,t=[],n=0,o=this.str.length;n+$/,""),this.fileNameExt=Object(b.getFileExtension)(this.fileName),this.fileType=S(this.fileNameExt,this.mimeType),t=!0),t},t.prototype.isImage=function(){return f.FileType.Image===this.fileType},t.prototype.isMp3=function(){return f.FileType.Audio===this.fileType&&"mp3"===this.fileNameExt},t.prototype.isOgg=function(){return f.FileType.Audio===this.fileType&&("oga"===this.fileNameExt||"ogg"===this.fileNameExt)},t.prototype.isWav=function(){return f.FileType.Audio===this.fileType&&"wav"===this.fileNameExt},t.prototype.hasThumbnail=function(){return this.isThumbnail},t.prototype.isText=function(){return f.FileType.Text===this.fileType||f.FileType.Eml===this.fileType||f.FileType.Certificate===this.fileType||f.FileType.Html===this.fileType||f.FileType.Code===this.fileType},t.prototype.isPdf=function(){return f.FileType.Pdf===this.fileType},t.prototype.isFramed=function(){return this.framed&&m.data.__APP__&&m.data.__APP__.googlePreviewSupported()&&!(this.isPdf()&&m.bAllowPdfPreview)&&!this.isText()&&!this.isImage()},t.prototype.hasPreview=function(){return this.isImage()||this.isPdf()&&m.bAllowPdfPreview||this.isText()||this.isFramed()},t.prototype.hasPreplay=function(){return v.a.supportedMp3&&this.isMp3()||v.a.supportedOgg&&this.isOgg()||v.a.supportedWav&&this.isWav()},t.prototype.linkDownload=function(){return Object(g.c)(this.download)},t.prototype.linkPreview=function(){return Object(g.e)(this.download)},t.prototype.linkThumbnail=function(){return this.hasThumbnail()?Object(g.g)(this.download):""},t.prototype.linkThumbnailPreviewStyle=function(){var e=this.linkThumbnail();return""===e?"":"background:url("+e+")"},t.prototype.linkFramed=function(){return Object(g.d)(this.download)},t.prototype.linkPreviewAsPlain=function(){return Object(g.f)(this.download)},t.prototype.linkPreviewMain=function(){var e="";switch(!0){case this.isImage():case this.isPdf()&&m.bAllowPdfPreview:e=this.linkPreview();break;case this.isText():e=this.linkPreviewAsPlain();break;case this.isFramed():e=this.linkFramed()}return e},t.prototype.generateTransferDownloadUrl=function(){var e=this.linkDownload();return"http"!==e.substr(0,4)&&(e=u.a.location.protocol+"//"+u.a.location.host+u.a.location.pathname+e),this.mimeType+":"+this.fileName+":"+e},t.prototype.eventDragStart=function(e,t){var n=t.originalEvent||t;return e&&n&&n.dataTransfer&&n.dataTransfer.setData&&n.dataTransfer.setData("DownloadURL",this.generateTransferDownloadUrl()),!0},t.prototype.iconClass=function(){return O(this.fileType)[0]},t.prototype.iconText=function(){return O(this.fileType)[1]},t}(y.a)},function(e,t,n){"use strict";n.r(t);var o=n(8),i=n.n(o),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(27),u=function(e){function t(){return i()(this,t),r()(this,e.apply(this,arguments))}return c()(t,e),t}(n(74).a);t.default=Object(l.b)(u,"CheckboxComponent")},function(e,t,n){var o=n(41),i=n(40),a=n(90),r=n(82),s=n(49).f;e.exports=function(e){var t=i.Symbol||(i.Symbol=a?{}:o.Symbol||{});"_"==e.charAt(0)||e in t||s(t,e,{value:r.f(e)})}},function(e,t,n){t.f=n(60)},function(e,t,n){var o=n(49).f,i=n(46),a=n(60)("toStringTag");e.exports=function(e,t,n){e&&!i(e=n?e:e.prototype,a)&&o(e,a,{configurable:!0,value:t})}},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,n){var o=n(41),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});e.exports=function(e){return i[e]||(i[e]={})}},function(e,t,n){var o=n(85)("keys"),i=n(70);e.exports=function(e){return o[e]||(o[e]=i(e))}},function(e,t,n){var o=n(104),i=n(84);e.exports=Object.keys||function(e){return o(e,i)}},function(e,t,n){var o=n(61),i=n(164),a=n(84),r=n(86)("IE_PROTO"),s=function(){},c=function(){var e,t=n(93)("iframe"),o=a.length;for(t.style.display="none",n(160).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write(" \ No newline at end of file diff --git a/copper-server/kubernetes/copperclient/app/data/_data_/_default_/configs/application.ini b/copper-server/kubernetes/copperclient/app/data/_data_/_default_/configs/application.ini index 96a3185d..5a977b34 100644 --- a/copper-server/kubernetes/copperclient/app/data/_data_/_default_/configs/application.ini +++ b/copper-server/kubernetes/copperclient/app/data/_data_/_default_/configs/application.ini @@ -3,10 +3,10 @@ [webmail] ; Text displayed as page title -title = "RainLoop Webmail" +title = "Copper Webmail" ; Text displayed on startup -loading_description = "RainLoop" +loading_description = "COPPER" favicon_url = "" ; Theme used by default @@ -28,7 +28,7 @@ allow_additional_accounts = On allow_additional_identities = On ; Number of messages displayed on page by default -messages_per_page = 20 +messages_per_page = 30 ; File size limit (MB) for file upload on compose screen ; 0 for unlimited. @@ -57,12 +57,12 @@ welcome_page_display = "none" ; Enable contacts enable = On allow_sync = On -sync_interval = 20 +sync_interval = 30 type = "mysql" pdo_dsn = "mysql:host=172.19.0.19;port=3306;dbname=rainloop" pdo_user = "rainloop" pdo_password = "rainloop" -suggestions_limit = 30 +suggestions_limit = 05 [security] ; Enable CSRF protection (http://en.wikipedia.org/wiki/Cross-site_request_forgery) @@ -77,7 +77,7 @@ admin_password = "12345" ; Access settings allow_admin_panel = On -allow_two_factor_auth = On +allow_two_factor_auth = Off force_two_factor_auth = Off hide_x_mailer_header = Off admin_panel_host = "" @@ -122,7 +122,7 @@ default_domain = "copper.opensource.lk" allow_languages_on_login = On determine_user_language = On determine_user_domain = Off -welcome_page = Off +welcome_page = On hide_submit_button = On forgot_password_link_url = "" registration_link_url = "" @@ -154,7 +154,7 @@ view_use_checkboxes = On autologout = 30 show_images = Off contacts_autosave = On -mail_use_threads = On +mail_use_threads = Off allow_draft_autosave = On mail_reply_same_folder = Off @@ -174,7 +174,8 @@ write_on_timeout_only = 0 ; Required for development purposes only. ; Disabling this option is not recommended. hide_passwords = On -time_offset = "0" +#time_offset = "0" +time_offset = "1" session_filter = "" ; Log filename. @@ -352,4 +353,4 @@ dev_password = "" [version] current = "1.12.0" -saved = "Thu, 01 Nov 2018 04:47:57 +0000" \ No newline at end of file +saved = "Fri, 26 Oct 2018 10:29:57 +0000" \ No newline at end of file diff --git a/copper-server/kubernetes/copperclient/app/data/_data_/_default_/storage/data/__nobody__/ef/efaeb36a60ef9682802c6a704c2d784d b/copper-server/kubernetes/copperclient/app/data/_data_/_default_/storage/data/__nobody__/ef/efaeb36a60ef9682802c6a704c2d784d index 2b172169..d71cd81b 100644 --- a/copper-server/kubernetes/copperclient/app/data/_data_/_default_/storage/data/__nobody__/ef/efaeb36a60ef9682802c6a704c2d784d +++ b/copper-server/kubernetes/copperclient/app/data/_data_/_default_/storage/data/__nobody__/ef/efaeb36a60ef9682802c6a704c2d784d @@ -1 +1 @@ -1542350901,1542267115,1542267115 \ No newline at end of file +1541995875,1541995875,1541995875 \ No newline at end of file diff --git a/copper-server/kubernetes/copperclient/app/rainloop/v/1.12.0/app/libraries/RainLoop/Actions.php b/copper-server/kubernetes/copperclient/app/rainloop/v/1.12.0/app/libraries/RainLoop/Actions.php index 57bc5e98..2ae8e10d 100755 --- a/copper-server/kubernetes/copperclient/app/rainloop/v/1.12.0/app/libraries/RainLoop/Actions.php +++ b/copper-server/kubernetes/copperclient/app/rainloop/v/1.12.0/app/libraries/RainLoop/Actions.php @@ -4662,8 +4662,7 @@ public function downloadRemotePackageByUrl($sUrl) $iCode = 0; $sContentType = ''; - // @\set_time_limit(120); - @\set_time_limit(10); + @\set_time_limit(120); $oHttp = \MailSo\Base\Http::SingletonInstance(); $bResult = $oHttp->SaveUrlToFile($sUrl, $pDest, $sTmp, $sContentType, $iCode, $this->Logger(), 60, diff --git a/copper-server/kubernetes/copperclient/config/copper.https.conf b/copper-server/kubernetes/copperclient/config/copper.https.conf new file mode 100755 index 00000000..d82e9164 --- /dev/null +++ b/copper-server/kubernetes/copperclient/config/copper.https.conf @@ -0,0 +1,35 @@ + + + ServerName copper.opensource.lk + ServerAdmin admin@copper.opensource.lk + DocumentRoot /var/www/html/site + + + Options Indexes FollowSymLinks MultiViews + AllowOverride All + Order deny,allow + Allow from all + + + SSLEngine on + SSLCertificateFile /etc/ssl/certs/copper.opensource.lk.crt + SSLCertificateKeyFile /etc/ssl/private/copper.opensource.lk.key + #SSLCertificateFile /etc/ssl/certs/cert.pem + #SSLCertificateKeyFile /etc/ssl/private/privkey.pem + + + #SSLEngine on + + # A self-signed (snakeoil) certificate can be created by installing + # the ssl-cert package. See + # /usr/share/doc/apache2/README.Debian.gz for more info. + # If both key and certificate are stored in the same file, only the + # SSLCertificateFile directive is needed. + #SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem + #SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key + + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined + + + \ No newline at end of file diff --git a/copper-server/kubernetes/copperclient/config/copper.opensource.lk.conf b/copper-server/kubernetes/copperclient/config/copper.opensource.lk.conf new file mode 100755 index 00000000..91a38311 --- /dev/null +++ b/copper-server/kubernetes/copperclient/config/copper.opensource.lk.conf @@ -0,0 +1,33 @@ + + + ServerName copper.opensource.lk + ServerAdmin admin@copper.opensource.lk + DocumentRoot /var/www/html/site + + + Options Indexes FollowSymLinks MultiViews + AllowOverride All + Order deny,allow + Allow from all + + + SSLEngine on + SSLCertificateFile /etc/ssl/certs/cert.pem + SSLCertificateKeyFile /etc/ssl/private/privkey.pem + #SSLCertificateChainFile /etc/ssl/fullchain.pem + + #SSLEngine on + + # A self-signed (snakeoil) certificate can be created by installing + # the ssl-cert package. See + # /usr/share/doc/apache2/README.Debian.gz for more info. + # If both key and certificate are stored in the same file, only the + # SSLCertificateFile directive is needed. + #SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem + #SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key + + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined + + + \ No newline at end of file diff --git a/copper-server/kubernetes/copperclient/config/hosts b/copper-server/kubernetes/copperclient/config/hosts new file mode 100644 index 00000000..231f44f8 --- /dev/null +++ b/copper-server/kubernetes/copperclient/config/hosts @@ -0,0 +1,8 @@ +127.0.0.1 copper.opensource.lk +127.0.0.1 localhost +::1 localhost ip6-localhost ip6-loopback +fe00::0 ip6-localnet +ff00::0 ip6-mcastprefix +ff02::1 ip6-allnodes +ff02::2 ip6-allrouters +172.17.0.2 e0148923d019 diff --git a/copper-server/kubernetes/copperclient/config/mods-available/proxy_html.conf b/copper-server/kubernetes/copperclient/config/mods-available/proxy_html.conf new file mode 100755 index 00000000..3c215e35 --- /dev/null +++ b/copper-server/kubernetes/copperclient/config/mods-available/proxy_html.conf @@ -0,0 +1,62 @@ +# Configuration example. +# +# First, to load the module with its prerequisites +# +# For Unix-family systems: +# LoadFile /usr/lib/libxml2.so +# LoadModule proxy_html_module modules/mod_proxy_html.so +# +# For Windows (I don't know if there's a standard path for the libraries) +# LoadFile C:/path/zlib.dll +# LoadFile C:/path/iconv.dll +# LoadFile C:/path/libxml2.dll +# LoadModule proxy_html_module modules/mod_proxy_html.so +# +# All knowledge of HTML links has been removed from the mod_proxy_html +# code itself, and is instead read from httpd.conf (or included file) +# at server startup. So you MUST declare it. This will normally be +# at top level, but can also be used in a . +# +# Here's the declaration for W3C HTML 4.01 and XHTML 1.0 + +ProxyHTMLLinks a href +ProxyHTMLLinks area href +ProxyHTMLLinks link href +ProxyHTMLLinks img src longdesc usemap +ProxyHTMLLinks object classid codebase data usemap +ProxyHTMLLinks q cite +ProxyHTMLLinks blockquote cite +ProxyHTMLLinks ins cite +ProxyHTMLLinks del cite +ProxyHTMLLinks form action +ProxyHTMLLinks input src usemap +ProxyHTMLLinks head profile +ProxyHTMLLinks base href +ProxyHTMLLinks script src for + +# To support scripting events (with ProxyHTMLExtended On), +# you'll need to declare them too. + +ProxyHTMLEvents onclick ondblclick onmousedown onmouseup \ + onmouseover onmousemove onmouseout onkeypress \ + onkeydown onkeyup onfocus onblur onload \ + onunload onsubmit onreset onselect onchange + +# If you need to support legacy (pre-1998, aka "transitional") HTML or XHTML, +# you'll need to uncomment the following deprecated link attributes. +# Note that these are enabled in earlier mod_proxy_html versions +# +# ProxyHTMLLinks frame src longdesc +# ProxyHTMLLinks iframe src longdesc +# ProxyHTMLLinks body background +# ProxyHTMLLinks applet codebase +# +# If you're dealing with proprietary HTML variants, +# declare your own URL attributes here as required. +# +# ProxyHTMLLinks myelement myattr otherattr +# +# Also at top level in httpd.conf, you can declare charset aliases. +# This is the most efficient way to support encodings that libxml2 +# doesn't natively support. See the documentation at +# http://apache.webthing.com/mod_proxy_html/ \ No newline at end of file diff --git a/copper-server/kubernetes/copperclient/config/ports.conf b/copper-server/kubernetes/copperclient/config/ports.conf new file mode 100644 index 00000000..9025f138 --- /dev/null +++ b/copper-server/kubernetes/copperclient/config/ports.conf @@ -0,0 +1,17 @@ +# If you just change the port or add more ports here, you will likely also +# have to change the VirtualHost statement in +# /etc/apache2/sites-enabled/000-default.conf + +Listen 89 +Listen 80 +Listen 433 + + + Listen 443 + + + + Listen 443 + + +# vim: syntax=apache ts=4 sw=4 sts=4 sr noet diff --git a/copper-server/kubernetes/copperclient/config/scripts/index.html b/copper-server/kubernetes/copperclient/config/scripts/index.html new file mode 100644 index 00000000..102e4ae5 --- /dev/null +++ b/copper-server/kubernetes/copperclient/config/scripts/index.html @@ -0,0 +1,6 @@ + + + +

Hellow World

+ + \ No newline at end of file diff --git a/copper-server/kubernetes/copperclient/config/scripts/init_letsencrypt.sh b/copper-server/kubernetes/copperclient/config/scripts/init_letsencrypt.sh new file mode 100755 index 00000000..210094e4 --- /dev/null +++ b/copper-server/kubernetes/copperclient/config/scripts/init_letsencrypt.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +# init only if lets-encrypt is running for the first time and if DOMAINS was set +if ([ ! -d $LETSENCRYPT_HOME ] || [ ! "$(ls -A $LETSENCRYPT_HOME)" ]) && [ ! -z "$DOMAINS" ]; then + /run_letsencrypt.sh --domains $DOMAINS +fi diff --git a/copper-server/kubernetes/copperclient/config/scripts/run_apache.sh b/copper-server/kubernetes/copperclient/config/scripts/run_apache.sh new file mode 100755 index 00000000..7f00f671 --- /dev/null +++ b/copper-server/kubernetes/copperclient/config/scripts/run_apache.sh @@ -0,0 +1,22 @@ +#!/bin/bash +source /etc/apache2/envvars + +if [ -f /var/run/apache2/apache2.pid ]; then + apachePid=$(cat /var/run/apache2/apache2.pid) + echo "Found file 'apache2.pid' with pid $apachePid. Let's check if there is a process belonging to it!" + processName=$(ps -p $apachePid -o comm) + + if [ "$processName" != "apache2" ] && [ "$processName" != "/usr/sbin/apache2 -D FOREGROUND" ]; then + echo "The found apache.pid is not belonging to an apache-process. I'm going to remove the pid-file." + rm -f /var/run/apache2/apache2.pid + echo "Removing of pid-file was successfull." + + echo "For cleaning-reasons I'm also killing all apache-processes." + killall -9 apache2 + echo "Now this is a safe place again. Enjoy." + else + echo "The pid-file is belonging to an apache-process, so it will stay alive." + fi +fi + +exec /usr/sbin/apache2 -D FOREGROUND diff --git a/copper-server/kubernetes/copperclient/config/scripts/run_letsencrypt.sh b/copper-server/kubernetes/copperclient/config/scripts/run_letsencrypt.sh new file mode 100755 index 00000000..082e832f --- /dev/null +++ b/copper-server/kubernetes/copperclient/config/scripts/run_letsencrypt.sh @@ -0,0 +1,8 @@ +#!/bin/bash +if (! [ -z "$STAGING" ]) then + echo "Using Let's Encrypt Staging environment..." + certbot -n --staging --expand --apache --agree-tos --email $WEBMASTER_MAIL "$@" +else + echo "Using Let's Encrypt Production environment..." + certbot -n --expand --apache --agree-tos --email $WEBMASTER_MAIL "$@" +fi diff --git a/copper-server/kubernetes/copperclient/fqdn b/copper-server/kubernetes/copperclient/fqdn deleted file mode 100644 index 8c55489d..00000000 --- a/copper-server/kubernetes/copperclient/fqdn +++ /dev/null @@ -1 +0,0 @@ -ServerName localhost \ No newline at end of file diff --git a/copper-server/kubernetes/copperclient/hosts b/copper-server/kubernetes/copperclient/hosts deleted file mode 100644 index 8349ae74..00000000 --- a/copper-server/kubernetes/copperclient/hosts +++ /dev/null @@ -1,2 +0,0 @@ -127.0.0.1 localhost -127.0.1.1 myhostname \ No newline at end of file diff --git a/copper-server/kubernetes/copperclient/servername.conf b/copper-server/kubernetes/copperclient/servername.conf deleted file mode 100644 index 8c55489d..00000000 --- a/copper-server/kubernetes/copperclient/servername.conf +++ /dev/null @@ -1 +0,0 @@ -ServerName localhost \ No newline at end of file diff --git a/copper-server/kubernetes/copperclient/tls/cert.pem b/copper-server/kubernetes/copperclient/tls/cert.pem new file mode 100644 index 00000000..9350617e --- /dev/null +++ b/copper-server/kubernetes/copperclient/tls/cert.pem @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC/DCCAoGgAwIBAgIUMrbRDCxW+OcheKXnBSASL9ZC5ZswCgYIKoZIzj0EAwMw +gZYxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxBMUEgQ2FyIFdhc2gxJDAiBgNVBAsT +G0luZm9ybWF0aW9uIFRlY2hub2xvZ3kgRGVwLjEUMBIGA1UEBxMLQWxidXF1ZXJx +dWUxEzARBgNVBAgTCk5ldyBNZXhpY28xHzAdBgNVBAMTFmRvY2tlci1saWdodC1i +YXNlaW1hZ2UwHhcNMTkwMTI4MTAwODAwWhcNMjAwMTI4MTAwODAwWjCBizELMAkG +A1UEBhMCVVMxEzARBgNVBAgTCk5ldyBNZXhpY28xFDASBgNVBAcTC0FsYnVxdWVy +cXVlMRUwEwYDVQQKEwxBMUEgQ2FyIFdhc2gxJDAiBgNVBAsTG0luZm9ybWF0aW9u +IFRlY2hub2xvZ3kgRGVwLjEUMBIGA1UEAxMLY29wcGVyLWxkYXAwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAATE9+9lV1vBM8mCRlDfB9kLk6cxRMzqPWEBuwSj/eJygqia +xizuCGNZD1/Y3+jleRwnLEJPedJ3g6MojkkRnup6EWA9TwUlWKpFhDuHV/1BWbph +XEljElFyUTTXG/Pmka6jgZgwgZUwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQG +CCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRnxpNY +XMTzkRuVBfXGQRY6XKKqnDAfBgNVHSMEGDAWgBRPpel6JVwwGJxi05eFulCyh65u ++DAWBgNVHREEDzANggtjb3BwZXItbGRhcDAKBggqhkjOPQQDAwNpADBmAjEA7zCS +4Kc4RANhxxUv/F/Ub1CGcLJffCDOQyZWwkwmMgYeZXDcDZ8vBuWRgKPdP1cPAjEA +0AyrmbnoAoxOhFCmUHXcFH3m7sT7zHKLYuw/mW593Bc8zl3SbTr7NyQJOoH9bCgt +-----END CERTIFICATE----- diff --git a/copper-server/kubernetes/copperclient/tls/copper.opensource.lk.crt b/copper-server/kubernetes/copperclient/tls/copper.opensource.lk.crt new file mode 100644 index 00000000..b8902a4a --- /dev/null +++ b/copper-server/kubernetes/copperclient/tls/copper.opensource.lk.crt @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDrDCCApQCCQDfEepge8KFKDANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UEBhMC +TEsxCzAJBgNVBAgMAldQMRAwDgYDVQQHDAdDb2xvbWJvMQwwCgYDVQQKDANMU0Yx +DzANBgNVBAsMBmNvcHBlcjEdMBsGA1UEAwwUY29wcGVyLm9wZW5zb3VyY2UubGsx +KzApBgkqhkiG9w0BCQEWHHN1cHBvcnRAY29wcGVyLm9wZW5zb3VyY2UubGswHhcN +MTkwMjA0MTA0MDA2WhcNMjAwMjA0MTA0MDA2WjCBlzELMAkGA1UEBhMCTEsxCzAJ +BgNVBAgMAldQMRAwDgYDVQQHDAdDb2xvbWJvMQwwCgYDVQQKDANMU0YxDzANBgNV +BAsMBmNvcHBlcjEdMBsGA1UEAwwUY29wcGVyLm9wZW5zb3VyY2UubGsxKzApBgkq +hkiG9w0BCQEWHHN1cHBvcnRAY29wcGVyLm9wZW5zb3VyY2UubGswggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpZW8rW8C5t3nVYijHZS6Y88iBVuibQFDj +dDVzCQm3HjvA3M3lJnA8hos0Rb0XBOYaz5QxMkhrK7aSslm3yfUuXWDAzjCXtdoc +4d2+tQPKOWA2oCsx2s+XkzM9Dx1oYirobUrZnu/jMoYyu3JCFP+uEkq+FqAKC0E4 +GMgBGJMWsxHH1PBFBdNZmlhA7uuV784PUeZVFIub11AYbLPQ194cCbMG8R2J8Pvn +soFVkR9ErKvzsEKQ0NVwX+ryf1wIDJkGQLOC/p7+PRYfQ7LCBlertxV5MFWA4NXf +t1BI2AzRzzq+1cnNGSnheeKGXeHpiO2BHctCd7UpjB85EQhLeU+DAgMBAAEwDQYJ +KoZIhvcNAQEFBQADggEBAEg9Xh/ojqtPzjBPsh3WROglaRtNX2MDUBcaG+EcW2gX +Nz4ah2iD8BxjpkY8c7NI2xGofFuRnl02UZ0sH++qXCz+fyKU55c9i7S2vNai4L67 +rVaINYFPcnhlXALXm+PWa/+wwK43vjNUgHc7Y0EW76AacUyC+/IXtcPIy0csDz8z +9p/kPcDEmOD65WJGDmuRY0jfwwzymsT9gEtnZcVsRZcYVuwoScf8usJczyffLC1O +ZuI4Lfm50Giinqo/K779Y8wr7PC9uxY4lJzA/DjLJ1W43kkAOjmTIM8WArBL4Rqz +hNUl8tjT7R7OTSWGk3uisvATo4I0R78k+HfxW3P2d/I= +-----END CERTIFICATE----- diff --git a/copper-server/kubernetes/copperclient/tls/copper.opensource.lk.csr b/copper-server/kubernetes/copperclient/tls/copper.opensource.lk.csr new file mode 100644 index 00000000..5825dfa8 --- /dev/null +++ b/copper-server/kubernetes/copperclient/tls/copper.opensource.lk.csr @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIC9DCCAdwCAQAwgZcxCzAJBgNVBAYTAkxLMQswCQYDVQQIDAJXUDEQMA4GA1UE +BwwHQ29sb21ibzEMMAoGA1UECgwDTFNGMQ8wDQYDVQQLDAZjb3BwZXIxHTAbBgNV +BAMMFGNvcHBlci5vcGVuc291cmNlLmxrMSswKQYJKoZIhvcNAQkBFhxzdXBwb3J0 +QGNvcHBlci5vcGVuc291cmNlLmxrMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAqWVvK1vAubd51WIox2UumPPIgVbom0BQ43Q1cwkJtx47wNzN5SZwPIaL +NEW9FwTmGs+UMTJIayu2krJZt8n1Ll1gwM4wl7XaHOHdvrUDyjlgNqArMdrPl5Mz +PQ8daGIq6G1K2Z7v4zKGMrtyQhT/rhJKvhagCgtBOBjIARiTFrMRx9TwRQXTWZpY +QO7rle/OD1HmVRSLm9dQGGyz0NfeHAmzBvEdifD757KBVZEfRKyr87BCkNDVcF/q +8n9cCAyZBkCzgv6e/j0WH0OywgZXq7cVeTBVgODV37dQSNgM0c86vtXJzRkp4Xni +hl3h6YjtgR3LQne1KYwfOREIS3lPgwIDAQABoBcwFQYJKoZIhvcNAQkHMQgMBmNv +cHBlcjANBgkqhkiG9w0BAQsFAAOCAQEAdhb2M0A7T6lkXWp+tqLsAqRTQyNrUmb2 +PuGVws7N3TKsz5Jg3byqo9CgX8RirLOb558NpYNALbmL7/GGWkHrv5nRuk1mHcE8 +KvLFNFef5Cl6TIj7VRLjbwJc3ZfaFh3LPBLHxgFT4+sVTXuGNn+eQymIkEQ6Lhrf +uiN3ceGiDBTxEYQPqsD2hWofkHBqf//NySnnU3vHm3uQhltoZKg+fMsKSpqHSBfK +tIIySHJQ0odMrMRB312dG2NP/DZPPm1L4g9wRvE3hqX9FuYXRlg0SChIG0yPUHPt +JRD7N+WvNi1Y2iNBhhLjOrStsHZXStMi2padrqY2dLBmRRHq11bqZw== +-----END CERTIFICATE REQUEST----- diff --git a/copper-server/kubernetes/copperclient/tls/copper.opensource.lk.key b/copper-server/kubernetes/copperclient/tls/copper.opensource.lk.key new file mode 100644 index 00000000..1ba6fb47 --- /dev/null +++ b/copper-server/kubernetes/copperclient/tls/copper.opensource.lk.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCpZW8rW8C5t3nV +YijHZS6Y88iBVuibQFDjdDVzCQm3HjvA3M3lJnA8hos0Rb0XBOYaz5QxMkhrK7aS +slm3yfUuXWDAzjCXtdoc4d2+tQPKOWA2oCsx2s+XkzM9Dx1oYirobUrZnu/jMoYy +u3JCFP+uEkq+FqAKC0E4GMgBGJMWsxHH1PBFBdNZmlhA7uuV784PUeZVFIub11AY +bLPQ194cCbMG8R2J8PvnsoFVkR9ErKvzsEKQ0NVwX+ryf1wIDJkGQLOC/p7+PRYf +Q7LCBlertxV5MFWA4NXft1BI2AzRzzq+1cnNGSnheeKGXeHpiO2BHctCd7UpjB85 +EQhLeU+DAgMBAAECggEAKWJhnXsmA3lCp5H6mnQqxS1Rv9+Gpl85I8iBQmBj4jvd +p0mKd8BDTVYlbhjXkGce/E/YSYiaTqx4RzCRYKhTYQdpGtGE55uC9Oltbij1CxOn +YNESnHRzoPlSXEl0Csto5i3FSpNc0enHBV/sEx7kNBe98ODAKpQDU/wh6LqjPLkP +D5e18L+AdUQyjsBHXoXLhhWNZJz8YjHkZHsT2KVFXltJXBxnkdsn9xIqRqk6/s/k +EAZusTUyz9kmQKNAZdNIJdP3rs5W8YQTvmTI0cNDXQH4bCOWpojFLMdcI+0dAnyR +CpIagrTJyB7epgvU1OaSaj6Ueil5KLrdPshOSYxUoQKBgQDQnr6m3Hq78LFnksF+ +p8EQlz7LhRqWteK9ZHElAXdmZMf5QQxl535b/W4rqlPvUMw4CaQsIXkvw0pu5tVy +6x3IyirK+4z5lcQvLr3HpIYBKGzE/HDr7cz10Ih8l4zubJrKn5bSHVLwR86s1PN7 +1qZFGnJydmVeS+JGQEa1Q6B2cQKBgQDP3jK9GPV+t+7f+QI0jmv6LmVkfLMX6Urr +mJHpyrz2vQze3HUqyIGHfwrlhlgiYJZ9WV7qS4dbqYj0n0AL+9tSwFAVirB4j61P +VxmjMBx39SBurDwhSUgZmE/ku3VYwvidWk6afV9HrAu1A8yfA9E5iUUFi+iWPjiA +enPOhB6nMwKBgHVHuPB/ZHRBhMowQ50bW7si+8dYZbEyQWytibn/EAu9PnqOqhSj +xnKaj5P2pkcUiio6qVOx4boLNM4R8Q8wxEa7+MCyF/e7zVWlFkWk5TzDaBp5vFW2 +ExJiEEjSvgTPg1nDy/sFRzoTdEnPUa5d5o1Up+BXVPdk+6j4u4dtpEjRAoGAWuzL +7vFK+VoFkE0AzPJ7gtzmlxUA1fXDQtjjAowfKiK5zYZLbiJ0nktQ/eNNDASJ71y3 +au8Mz2iSMsayIkvRvRnILhQTazkVyz3DRiGWYlaEEEUgrEK82g1I7Tmec+wdCd9l +wKgUlGpKWKzHxcrKq0tDONDhNU8UMgbePziFnAcCgYBQQoSnlcP5LyDsmbOyMfWr +dEXTEPsMdpGi5GvITwt+nzHUzkJywYdC6OUzMLQnwGzISYdgf6EIyfDO3Etvdhwy +imL2zIKucE/vyA2YrPCqfwuThKugH9cw7RwmSp/VjCdJ5zLZGdLFxRAeUOLWxGb3 +4XRO3uV2NGcyBiiDdR6lLg== +-----END PRIVATE KEY----- diff --git a/copper-server/kubernetes/copperclient/tls/dhparam.pem b/copper-server/kubernetes/copperclient/tls/dhparam.pem new file mode 100644 index 00000000..e42dfcbc --- /dev/null +++ b/copper-server/kubernetes/copperclient/tls/dhparam.pem @@ -0,0 +1,8 @@ +-----BEGIN DH PARAMETERS----- +MIIBCAKCAQEA+Dr8kl3/j/hE6Ha+lUTANnMpBcGNd+6Jv+Et59EyKUntcf1ZOk5L +znO5FLTCSTvgDrodZo3nlHcuUtCnhPqC3S72/0RI5hFoTM1ke7rSidsSVah3fxzN +uDI97/ex3My5Bqnhtp+X4zBGtIywRm9qPSBavMG+ljuCVHcPyZ1yqrmudvVlPvBm +KpF35HZZfA7LQDp30RJQg+PGUZdUDZ/I6/FksZ4ADJqex7IYpo27Vs7EpvZj0Nkj +OGZylrq8hrnGptvzRXwB80lotYulCnUVJKZNEyS+gmudEE26tdRrcP3BtJEqsvcD +kdFwN4xqCzpkTkBeIh2KfUrVzCaO7bgs2wIBAg== +-----END DH PARAMETERS----- diff --git a/copper-server/kubernetes/copperclient/tls/fullchain.pem b/copper-server/kubernetes/copperclient/tls/fullchain.pem new file mode 120000 index 00000000..cf7a60f4 --- /dev/null +++ b/copper-server/kubernetes/copperclient/tls/fullchain.pem @@ -0,0 +1 @@ +/container/service/:ssl-tools/assets/default-ca/default-ca.pem \ No newline at end of file diff --git a/copper-server/kubernetes/copperclient/tls/privkey.pem b/copper-server/kubernetes/copperclient/tls/privkey.pem new file mode 100644 index 00000000..25c9b934 --- /dev/null +++ b/copper-server/kubernetes/copperclient/tls/privkey.pem @@ -0,0 +1,6 @@ +-----BEGIN EC PRIVATE KEY----- +MIGkAgEBBDDiIBWzmLHbe2oIrhkIfsDKnuuxH4QOXuwoTqf/XnSvRzpSNX6z03ac +HWggYiO4OGugBwYFK4EEACKhZANiAATE9+9lV1vBM8mCRlDfB9kLk6cxRMzqPWEB +uwSj/eJygqiaxizuCGNZD1/Y3+jleRwnLEJPedJ3g6MojkkRnup6EWA9TwUlWKpF +hDuHV/1BWbphXEljElFyUTTXG/Pmka4= +-----END EC PRIVATE KEY----- diff --git a/copper-server/kubernetes/copperclient/webmail.yaml b/copper-server/kubernetes/copperclient/webmail.yaml index 36f442c5..e65841fb 100644 --- a/copper-server/kubernetes/copperclient/webmail.yaml +++ b/copper-server/kubernetes/copperclient/webmail.yaml @@ -8,12 +8,25 @@ spec: selector: app: webmail ports: - - protocol: "TCP" + #- protocol: "TCP" + # port: 443 + - protocol: TCP port: 80 - #targetPort: 80 - targetPort: http + targetPort: 80 + name: http + - protocol: TCP + port: 443 + targetPort: 443 + name: https + - protocol: TCP + port: 433 + targetPort: 433 + name: httpse + # port: 433 + # targetPort: 433 + #targetPort: http #clusterIP: None - name: webmail + #name: webmail #nodePort: 30080 #type: NodePort --- @@ -38,6 +51,10 @@ spec: ports: - name: http containerPort: 80 + - name: https + containerPort: 443 + - name: httpse + containerPort: 433 - name: health containerPort: 81 resources: diff --git a/copper-server/kubernetes/deployment/README.md b/copper-server/kubernetes/deployment/README.md index d7a9a67d..d9250aa0 100644 --- a/copper-server/kubernetes/deployment/README.md +++ b/copper-server/kubernetes/deployment/README.md @@ -65,7 +65,9 @@ Then login to the web client and test your email service - URL :http://localhost + URL :https://localhost/ + + If you are accessing the email solution host machine from a remote machine you has to replace host machine ip for localhost. -Username : test -Password : coppermail@lsf diff --git a/copper-server/kubernetes/deployment/undeploy.sh b/copper-server/kubernetes/deployment/undeploy.sh index 20a570db..e95ff72b 100644 --- a/copper-server/kubernetes/deployment/undeploy.sh +++ b/copper-server/kubernetes/deployment/undeploy.sh @@ -110,6 +110,10 @@ echoRedBold 'phpldapadmin service deleted...' kubectl delete service email --namespace=monitoring 2> /dev/null || true kubectl delete deployment email --namespace=monitoring 2> /dev/null || true echoRedBold 'Email service deleted...' +# If you want to delete webmail service use following commands. +kubectl delete service webmail --namespace=monitoring 2> /dev/null || true +kubectl delete deployment webmail --namespace=monitoring 2> /dev/null || true +echoRedBold 'Email service deleted...' #deleting services From e1a769da4e8d620c7013c19eeae4ccb23f39be04 Mon Sep 17 00:00:00 2001 From: tharangar Date: Tue, 12 Feb 2019 12:29:28 +0530 Subject: [PATCH 2/7] Persistant volume activation and database integration --- .../kubernetes/copperclient/webmail.yaml | 6 + .../kubernetes/deployment/DB-undiploy.sh | 127 + copper-server/kubernetes/deployment/deploy.sh | 8 + .../kubernetes/deployment/undeploy.sh | 3 +- .../kubernetes/emailserver/email.yaml | 2 + .../kubernetes/groupwhare/horde/.env | 29 + .../kubernetes/groupwhare/horde/Dockerfile | 101 + .../groupwhare/horde/apache-horde.conf | 40 + .../horde/config/backends.local.php | 476 ++++ .../groupwhare/horde/config/conf.php | 133 + .../groupwhare/horde/config/gollem/conf.php | 6 + .../groupwhare/horde/config/imp/conf.php | 19 + .../groupwhare/horde/config/ingo/conf.php | 10 + .../horde/config/kronolith/conf.php | 21 + .../groupwhare/horde/config/mnemo/conf.php | 9 + .../groupwhare/horde/config/nag/conf.php | 9 + .../groupwhare/horde/config/trean/conf.php | 9 + .../groupwhare/horde/config/turba/conf.php | 11 + .../horde/horde-base-settings.backup.inc | 11 + .../groupwhare/horde/horde-base-settings.inc | 9 + .../kubernetes/groupwhare/horde/horde-init.sh | 103 + .../groupwhare/horde/proxy_client_ip.php | 12 + .../kubernetes/groupwhare/horde/run.sh | 5 + copper-server/kubernetes/is/.env | 81 - copper-server/kubernetes/is/README.md | 94 - .../kubernetes/is/docker-compose.yml | 47 - copper-server/kubernetes/is/is/Dockerfile | 50 - .../kubernetes/is/is/config/carbon.xml | 720 ------ .../kubernetes/is/is/config/claim-config.xml | 2291 ----------------- .../kubernetes/is/is/config/embedded-ldap.xml | 162 -- .../kubernetes/is/is/config/tenant-mgt.xml | 33 - .../kubernetes/is/is/config/user-mgt.xml | 261 -- copper-server/kubernetes/is/is/files/.gitkeep | 0 .../is/is/files/client-truststore.jks | Bin 1170 -> 0 bytes .../kubernetes/is/is/files/publickey.pem | Bin 881 -> 0 bytes .../kubernetes/is/is/files/wso2carbon.jks | Bin 2591 -> 0 bytes .../kubernetes/is/is/files/wso2server.sh | 319 --- .../kubernetes/is/openldap/Dockerfile | 9 - .../is/openldap/files/97-wso2Person.ldif | 70 - .../is/openldap/files/98-scimPerson.ldif | 140 - .../is/openldap/files/99-identityPerson.ldif | 85 - .../kubernetes/is/openldap/files/changes.ldif | 6 - .../is/openldap/files/copper-users.ldif | 117 - copper-server/kubernetes/is/reset.sh | 12 - copper-server/kubernetes/is/start.sh | 23 - .../kubernetes/openldap/openldap.yaml | 2 +- .../persistent/mysql-deployment.yaml | 17 + .../kubernetes/persistent/mysql-pv.yaml | 6 +- 48 files changed, 1180 insertions(+), 4524 deletions(-) create mode 100644 copper-server/kubernetes/deployment/DB-undiploy.sh create mode 100644 copper-server/kubernetes/groupwhare/horde/.env create mode 100755 copper-server/kubernetes/groupwhare/horde/Dockerfile create mode 100755 copper-server/kubernetes/groupwhare/horde/apache-horde.conf create mode 100644 copper-server/kubernetes/groupwhare/horde/config/backends.local.php create mode 100644 copper-server/kubernetes/groupwhare/horde/config/conf.php create mode 100644 copper-server/kubernetes/groupwhare/horde/config/gollem/conf.php create mode 100644 copper-server/kubernetes/groupwhare/horde/config/imp/conf.php create mode 100644 copper-server/kubernetes/groupwhare/horde/config/ingo/conf.php create mode 100644 copper-server/kubernetes/groupwhare/horde/config/kronolith/conf.php create mode 100644 copper-server/kubernetes/groupwhare/horde/config/mnemo/conf.php create mode 100644 copper-server/kubernetes/groupwhare/horde/config/nag/conf.php create mode 100644 copper-server/kubernetes/groupwhare/horde/config/trean/conf.php create mode 100644 copper-server/kubernetes/groupwhare/horde/config/turba/conf.php create mode 100755 copper-server/kubernetes/groupwhare/horde/horde-base-settings.backup.inc create mode 100755 copper-server/kubernetes/groupwhare/horde/horde-base-settings.inc create mode 100755 copper-server/kubernetes/groupwhare/horde/horde-init.sh create mode 100755 copper-server/kubernetes/groupwhare/horde/proxy_client_ip.php create mode 100755 copper-server/kubernetes/groupwhare/horde/run.sh delete mode 100755 copper-server/kubernetes/is/.env delete mode 100755 copper-server/kubernetes/is/README.md delete mode 100755 copper-server/kubernetes/is/docker-compose.yml delete mode 100755 copper-server/kubernetes/is/is/Dockerfile delete mode 100755 copper-server/kubernetes/is/is/config/carbon.xml delete mode 100755 copper-server/kubernetes/is/is/config/claim-config.xml delete mode 100755 copper-server/kubernetes/is/is/config/embedded-ldap.xml delete mode 100755 copper-server/kubernetes/is/is/config/tenant-mgt.xml delete mode 100755 copper-server/kubernetes/is/is/config/user-mgt.xml delete mode 100755 copper-server/kubernetes/is/is/files/.gitkeep delete mode 100644 copper-server/kubernetes/is/is/files/client-truststore.jks delete mode 100644 copper-server/kubernetes/is/is/files/publickey.pem delete mode 100644 copper-server/kubernetes/is/is/files/wso2carbon.jks delete mode 100755 copper-server/kubernetes/is/is/files/wso2server.sh delete mode 100755 copper-server/kubernetes/is/openldap/Dockerfile delete mode 100755 copper-server/kubernetes/is/openldap/files/97-wso2Person.ldif delete mode 100755 copper-server/kubernetes/is/openldap/files/98-scimPerson.ldif delete mode 100755 copper-server/kubernetes/is/openldap/files/99-identityPerson.ldif delete mode 100755 copper-server/kubernetes/is/openldap/files/changes.ldif delete mode 100755 copper-server/kubernetes/is/openldap/files/copper-users.ldif delete mode 100755 copper-server/kubernetes/is/reset.sh delete mode 100755 copper-server/kubernetes/is/start.sh diff --git a/copper-server/kubernetes/copperclient/webmail.yaml b/copper-server/kubernetes/copperclient/webmail.yaml index e65841fb..1322704e 100644 --- a/copper-server/kubernetes/copperclient/webmail.yaml +++ b/copper-server/kubernetes/copperclient/webmail.yaml @@ -22,6 +22,10 @@ spec: port: 433 targetPort: 433 name: httpse + #- protocol: TCP + # port: 587 + # targetPort: 587 + # name: submission # port: 433 # targetPort: 433 #targetPort: http @@ -55,6 +59,8 @@ spec: containerPort: 443 - name: httpse containerPort: 433 + - name: submission + containerPort: 587 - name: health containerPort: 81 resources: diff --git a/copper-server/kubernetes/deployment/DB-undiploy.sh b/copper-server/kubernetes/deployment/DB-undiploy.sh new file mode 100644 index 00000000..bfe5fa68 --- /dev/null +++ b/copper-server/kubernetes/deployment/DB-undiploy.sh @@ -0,0 +1,127 @@ +#!/bin/bash + +# ------------------------------------------------------------------------ +# (http://opensource.lk) +# +# + +# ------------------------------------------------------------------------ + +# methods + +set -e + +ECHO=`which echo` +KUBECTL=`which kubectl` + +# method to print bold +function echoBold () { + ${ECHO} $'\e[1m'"${1}"$'\e[0m' +} + +# method to print red bold fonts +function echoRedBold () { + # .---------- constant part! + # vvvv vvvv-- the code from above + RED='\033[0;31m' + NC='\033[0m' # No Color + BD='\e[1m' # bold + NM='\e[0m' # normal size + RDBD='\033[0;31m\e[1m' # red and bold + RDNM='\e[0m\033[0m' # normal color and normal size + #printf "* ${BD}${RED}-${1} ${NC}${NM}\n" + #${ECHO} ${RED}${1} + printf "* ${RDBD}-${1} ${RDNM}\n" + +} + +# method to print red bold fonts +function echoGreenBold () { + # .---------- constant part! + # vvvv vvvv-- the code from above + RED='\033[0;32m' # green + NC='\033[0m' # No Color + BD='\e[1m' # bold + NM='\e[0m' # normal size + RDBD='\033[0;32m\e[1m' # green and bold + RDNM='\e[0m\033[0m' # normal color and normal size + #printf "* ${BD}${RED}-${1} ${NC}${NM}\n" + #${ECHO} ${RED}${1} + printf "* ${RDBD}-${1} ${RDNM}\n" + +} + +# Creating The Banner +#Colours +red="\033[00;31m" +RED="\033[01;31m" + +green="\033[00;32m" +GREEN="\033[01;32m" + +brown="\033[00;33m" +YELLOW="\033[01;33m" + +blue="\033[00;34m" +BLUE="\033[01;34m" + +purple="\033[00;35m" +PURPLE="\033[01;35m" + +cyan="\033[00;36m" +CYAN="\033[01;36m" + +white="\033[00;37m" +WHITE="\033[01;37m" + +WHITECHAR="\033[01;39m" + +NC="\033[00m" +BOLD="\e[1m" +NRM="\e[0m" + +echo "${RED}******************************************************************************" +echo "${WHITE}** **" +echo "${WHITECHAR}** COPPER EMAIL SOLUTION **" +echo "${WHITE}** Please share your experinace with us **" +echo "${WHITE}** Email : support@copper.opensource.lk **" +echo "${RED}******************************************************************************" +echo + +echoRedBold ' !!!!!!!! -Undeploying Copper Database server - You will lost your data permanantly - !!!!!!!! ' + + + +read -r -p "Are you sure? [y/N] " response +case "$response" in + [yY][eE][sS]|[yY]) + +# 2> /dev/null || true // statement is used to ignore and go ahead when a error received +# 2> true + +## delete the mysql deployment +kubectl delete deployment,svc mysql --namespace=monitoring 2> /dev/null || true + +echoRedBold 'mysql deployment deleted...' +# Persistent Volume Claim deletion +kubectl delete PersistentVolumeClaim mysql-pv-claim --namespace=monitoring 2> /dev/null || true + +echoRedBold 'Persistent Volume Claim deleted...' +# Persistent Volume delete +kubectl delete service email --namespace=monitoring 2> /dev/null || true + +echoRedBold 'Email service deleted...' +# If you want to delete webmail service use following commands. +kubectl delete service webmail --namespace=monitoring 2> /dev/null || true + +echoRedBold 'Persistent Volume deleted...' + + + +echoGreenBold 'Whole data removed Cant be recovered. \n Finished' + + ;; + *) + echoRedBold "Undeploying cancelled" + ;; +esac \ No newline at end of file diff --git a/copper-server/kubernetes/deployment/deploy.sh b/copper-server/kubernetes/deployment/deploy.sh index fb26879f..38402e98 100644 --- a/copper-server/kubernetes/deployment/deploy.sh +++ b/copper-server/kubernetes/deployment/deploy.sh @@ -181,6 +181,14 @@ cd .. kubectl create -f emailserver/email.yaml 2> /dev/null || true echoGreenBold 'email service created...' #Building docker image + +# Create the persistent volume and persistent volume claim for database +kubectl create -f persistent/mysql-pv.yaml 2> /dev/null || true +echoGreenBold 'Persistent Volume created...' +# Create mysql deployment +kubectl create -f persistent/mysql-deployment.yaml 2> /dev/null || true +echoGreenBold 'mysql deployment completed...' + cd copperclient #Build the docker image diff --git a/copper-server/kubernetes/deployment/undeploy.sh b/copper-server/kubernetes/deployment/undeploy.sh index e95ff72b..aecfc244 100644 --- a/copper-server/kubernetes/deployment/undeploy.sh +++ b/copper-server/kubernetes/deployment/undeploy.sh @@ -84,6 +84,7 @@ echo "${RED}******************************************************************* echo "${WHITE}** **" echo "${WHITECHAR}** COPPER EMAIL SOLUTION **" echo "${WHITE}** Please share your experinace with us **" +echo "${WHITE}** Email : support@copper.opensource.lk **" echo "${RED}******************************************************************************" echo @@ -113,7 +114,7 @@ echoRedBold 'Email service deleted...' # If you want to delete webmail service use following commands. kubectl delete service webmail --namespace=monitoring 2> /dev/null || true kubectl delete deployment webmail --namespace=monitoring 2> /dev/null || true -echoRedBold 'Email service deleted...' +echoRedBold 'Webmail service deleted...' #deleting services diff --git a/copper-server/kubernetes/emailserver/email.yaml b/copper-server/kubernetes/emailserver/email.yaml index 60dde310..46ca9b35 100755 --- a/copper-server/kubernetes/emailserver/email.yaml +++ b/copper-server/kubernetes/emailserver/email.yaml @@ -57,6 +57,8 @@ spec: ports: - name: tcp containerPort: 25 + - name: submission + containerPort: 587 - name: health containerPort: 25 resources: diff --git a/copper-server/kubernetes/groupwhare/horde/.env b/copper-server/kubernetes/groupwhare/horde/.env new file mode 100644 index 00000000..5ae8f895 --- /dev/null +++ b/copper-server/kubernetes/groupwhare/horde/.env @@ -0,0 +1,29 @@ +# Copper Base main configuration file +# +# Most configuration variables can be modified through the Web interface, +# these few settings must however be configured before starting the mail +# server and require a restart upon change. +######################################################################### +# Copper Group wher configuration +########################################################################## +# admin email account +EMAIL=admin@copper.opensource.lk + + +# mail server name with FQDN +FQDN=mail.copper.opensource.lk + +# Domain name +DOMAIN=copper.opensource.lk + +# Debug option +DEBUG=true + + +DB_USER=horde +DB_PASSWORD=horde +DB_HOST=172.19.0.19 + + + + diff --git a/copper-server/kubernetes/groupwhare/horde/Dockerfile b/copper-server/kubernetes/groupwhare/horde/Dockerfile new file mode 100755 index 00000000..46743670 --- /dev/null +++ b/copper-server/kubernetes/groupwhare/horde/Dockerfile @@ -0,0 +1,101 @@ +FROM ubuntu +ARG DEBIAN_FRONTEND=noninteractive +LABEL KEY=LSF-COPPER-HORDE + +#ENV HOME /root + +# root account +ENV MYSQL_ENV_MYSQL_ROOT_USERNAME horde +ENV MYSQL_ENV_MYSQL_ROOT_PASSWORD horde + +ENV DB_NAME horde +ENV DB_USER horde +ENV DB_PASS horde +#ENV DB_PROTOCOL unix +#ENV DB_PROTOCOL tcp +ENV DB_PROTOCOL TCP +ENV DB_HOST 172.19.0.19 +ENV MYSQL_PORT_3306_TCP_ADDR 172.19.0.19 +ENV MYSQL_PORT_3306_TCP_PORT 3306 +ENV DB_PORT 3306 +ENV DB_DRIVER mysqli +ENV HORDE_TEST_DISABLE true + +RUN apt-get update +RUN apt-get -y install telnet +RUN apt-get -y install nano +RUN apt-get -y install apache2 libapache2-mod-php mysql-client gnupg2 openssl php-pear + +# https://www.ctrl.blog/entry/how-to-debian-horde-webmail +# https://community.nethserver.org/t/installing-horde-groupware/7292 +#RUN apt-get install -y php-horde-webmail mysql-client + +#RUN apt-get -y install php-horde +RUN apt-get -y install php-horde-webmail + +RUN mkdir /var/lib/horde/ +RUN chown www-data:www-data /var/lib/horde/ +RUN cp /etc/horde/horde/conf.php.dist /etc/horde/horde/conf.php +RUN chown www-data:www-data /etc/horde/horde/conf.php +RUN touch /etc/horde/imp/conf.php /etc/horde/turba/conf.php +RUN chown www-data:www-data /etc/horde/imp/conf.php /etc/horde/turba/conf.php +#RUN cp /etc/horde/imp/backends.php /etc/horde/imp/backends.local.php + +# Add other configurations also +#ADD ./webmail/horde-webmail/config/conf.php /usr/share/horde/config/conf.php +ADD ./config/conf.php /usr/share/horde/config/conf.php +RUN chown www-data:www-data /usr/share/horde/config/conf.php +# coppying ingo mail Filter application +ADD ./config/ingo/conf.php /usr/share/horde/ingo/config/conf.php +RUN chown www-data:www-data /usr/share/horde/ingo/config/conf.php +# configuration file hosting solution +ADD ./config/gollem/conf.php /usr/share/horde/gollem/config/conf.php +RUN chown www-data:www-data /usr/share/horde/gollem/config/conf.php +# Configuring turba contact mangement +ADD ./config/turba/conf.php /usr/share/horde/turba/config/conf.php +RUN chown www-data:www-data /usr/share/horde/turba/config/conf.php +# Configuring Todo/Reminder plugin +ADD ./config/nag/conf.php /usr/share/horde/nag/config/conf.php +RUN chown www-data:www-data /usr/share/horde/nag/config/conf.php +# Configure Kronolith calender +ADD ./config/kronolith/conf.php /usr/share/horde/kronolith/config/conf.php +RUN chown www-data:www-data /usr/share/horde/kronolith/config/conf.php +# Configure mnemo Notebook +ADD ./config/mnemo/conf.php /usr/share/horde/mnemo/config/conf.php +RUN chown www-data:www-data /usr/share/horde/mnemo/config/conf.php +# Configure imp webmail +ADD ./config/imp/conf.php /usr/share/horde/imp/config/conf.php +RUN chown www-data:www-data /usr/share/horde/imp/config/conf.php +# Configure trean web book mark +ADD ./config/trean/conf.php /usr/share/horde/trean/config/conf.php +RUN chown www-data:www-data /usr/share/horde/trean/config/conf.php + + + +RUN chown www-data:www-data /etc/horde/imp/conf.php /etc/horde/turba/conf.php +RUN chown www-data:www-data /etc/horde/imp/conf.php /etc/horde/turba/conf.php +RUN chown www-data:www-data /etc/horde/imp/conf.php /etc/horde/turba/conf.php + +# coppying conf.php for horde active directory + +ADD ./config/conf.php /etc/horde/horde/conf.php +ADD ./config/backends.local.php /etc/horde/imp/backends.local.php + +#ADD ./webmail/horde-webmail/config/conf.php /usr/share/horde/config/conf.php +#RUN chown www-data:www-data /usr/share/horde/config/conf.php + +ADD ./horde-init.sh /etc/my_init.d/horde-init.sh +RUN chmod +x /etc/my_init.d/horde-init.sh + +RUN mkdir -p /etc/service/apache2 +ADD ./run.sh /etc/service/apache2/run + + +# + + +RUN chmod +x /etc/service/apache2/run + +#CMD service apache2 start +CMD ["/etc/service/apache2/run"] +#CMD ["/sbin/my_init"] diff --git a/copper-server/kubernetes/groupwhare/horde/apache-horde.conf b/copper-server/kubernetes/groupwhare/horde/apache-horde.conf new file mode 100755 index 00000000..ac80a242 --- /dev/null +++ b/copper-server/kubernetes/groupwhare/horde/apache-horde.conf @@ -0,0 +1,40 @@ + + # The ServerName directive sets the request scheme, hostname and port that + # the server uses to identify itself. This is used when creating + # redirection URLs. In the context of virtual hosts, the ServerName + # specifies what hostname must appear in the request's Host: header to + # match this virtual host. For the default virtual host (this file) this + # value is not decisive as it is used as a last resort host regardless. + # However, you must set it for any further virtual host explicitly. + #ServerName www.example.com + + ServerAdmin webmaster@localhost + DocumentRoot /usr/share/horde + #DocumentRoot /var/www/html + + # Available loglevels: trace8, ..., trace1, debug, info, notice, warn, + # error, crit, alert, emerg. + # It is also possible to configure the loglevel for particular + # modules, e.g. + #LogLevel info ssl:warn + + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined + + # For most configuration files from conf-available/, which are + # enabled or disabled at a global level, it is possible to + # include a line for only one particular virtual host. For example the + # following line enables the CGI configuration for this host only + # after it has been globally disabled with "a2disconf". + #Include conf-available/serve-cgi-bin.conf + + #Alias /Microsoft-Server-ActiveSync /usr/share/horde/rpc.php + #Alias /autodiscover/autodiscover.xml /usr/share/horde/rpc.php + #Alias /Autodiscover/Autodiscover.xml /usr/share/horde/rpc.php + #Alias /AutoDiscover/AutoDiscover.xml /usr/share/horde/rpc.php + + + #php_value auto_prepend_file "/etc/apache2/scripts/proxy_client_ip.php" + #AllowOverride Limit FileInfo AuthConfig + + diff --git a/copper-server/kubernetes/groupwhare/horde/config/backends.local.php b/copper-server/kubernetes/groupwhare/horde/config/backends.local.php new file mode 100644 index 00000000..9c25ac02 --- /dev/null +++ b/copper-server/kubernetes/groupwhare/horde/config/backends.local.php @@ -0,0 +1,476 @@ + false, + 'name' => 'mail.coppermail.dyndns.org', + 'hostspec' => '172.19.0.17', + 'hordeauth' => false, + 'protocol' => 'imap', + 'port' => 143, + // Plaintext logins are disabled by default on IMAP servers (see RFC 3501 + // [6.2.3]), so TLS is the only guaranteed authentication available by + // default. + 'secure' => 'tls', +); + + +// POP3 server +$servers['pop'] = array( + // Disabled by default + 'disabled' => true, + 'name' => 'POP3 Server', + 'hostspec' => 'localhost', + 'hordeauth' => false, + 'protocol' => 'pop', + 'port' => 110, + // Default to secure TLS authentication by default (see RFC 2595 [4]). + 'secure' => 'tls', +); + + +// Advanced example - mainly here to demonstrate the syntax of all available +// options. +$servers['advanced'] = array( + // Disabled by default + 'disabled' => true, + 'name' => 'Advanced IMAP Server', + 'hostspec' => 'localhost', + 'hordeauth' => false, + 'protocol' => 'imap', + 'port' => 143, + 'secure' => 'tls', + 'maildomain' => '', + 'smtp' => array( + // 'auth' => true, + // 'debug' => false, + // 'horde_auth' => false, + // 'host' => 'smtp.example.com', + // 'lmtp' => false, + // 'localhost' => 'localhost', + // 'password' => null, + // /* Mail from a MUA SHOULD be sent via the mail submission port (587) + // * rather than the MTA port (25). (See RFC 6409/STD 72). + // * Note that mail submission REQUIRES some method of authentication + // * (whether explicit user/password credentials or configuring the + // * mail submission agent to automatically authenticate this host + // * based on the network location). */ + // 'port' => 587, + // 'username' => null + ), + 'spam' => array( + // 'innocent' => array( + // 'display' => true, + // + // // Email reporting driver + // 'email' => null, + // 'email_format' => 'digest', + // + // // Null reporting driver + // 'null' => true, + // + // // Program reporting driver + // 'program' => null + // ), + // 'spam' => array( + // 'display' => false, + // + // // Email reporting driver + // 'email' => null, + // 'email_format' => 'digest', + // + // // Null reporting driver + // 'null' => true, + // + // // Program reporting driver + // 'program' => null + // ), + // // It is possible to directly define additional spam drivers. + // // The 'drivers' array should contain a list of driver objects + // // (these classes must implement the IMP_Spam_Base class). + // 'drivers' => array( + // new IMP_Example_Spam_Driver() + // ) + ), + 'admin' => array( + // 'user' => 'cyrus', + // 'password' => 'cyrus_pass', + // 'userhierarchy' => 'user.' + ), + 'acl' => true, + 'cache' => false, + // 'debug' => '/tmp/imp_imap.log', + // 'debug_raw' => false, + 'quota' => array( + 'driver' => 'imap', + 'params' => array( + 'hide_when_unlimited' => true, + 'unit' => 'MB' + ) + ), + 'special_mboxes' => array( + // IMP_Mailbox::MBOX_DRAFTS => 'Drafts', + // IMP_Mailbox::MBOX_SENT => 'Sent', + // IMP_Mailbox::MBOX_SPAM => 'Spam', + // IMP_Mailbox::MBOX_TEMPLATES => 'Templates', + // IMP_Mailbox::MBOX_TRASH => 'Trash', + // IMP_Mailbox::MBOX_USERSPECIAL => array( + // 'Example' => _("Example Special Mailbox") + // ) + ), + 'autocreate_special' => false, +); diff --git a/copper-server/kubernetes/groupwhare/horde/config/conf.php b/copper-server/kubernetes/groupwhare/horde/config/conf.php new file mode 100644 index 00000000..f607d477 --- /dev/null +++ b/copper-server/kubernetes/groupwhare/horde/config/conf.php @@ -0,0 +1,133 @@ +> /etc/horde/horde/conf.php +# chown -R www-data:www-data /etc/horde +#fi + +#if [ $MYSQL_PORT_3306_TCP_ADDR ]; then +# sed -i "s/^\(.*sql.*hostspec.*=\)\(.*\);/\1 '$MYSQL_PORT_3306_TCP_ADDR';/g" /etc/horde/horde/conf.php +# sed -i "s/^\(.*sql.*port.*=\)\(.*\);/\1 '$MYSQL_PORT_3306_TCP_PORT';/g" /etc/horde/horde/conf.php +#else +# sed -i "s/^\(.*sql.*hostspec.*=\)\(.*\);/\1 '$DB_HOST';/g" /etc/horde/horde/conf.php +# sed -i "s/^\(.*sql.*port.*=\)\(.*\);/\1 '$DB_PORT';/g" /etc/horde/horde/conf.php +# sed -i "s/^\(.*sql.*protocol.*=\)\(.*\);/\1 '$DB_PROTOCOL';/g" /etc/horde/horde/conf.php +#fi + +#if [ $MYSQL_ENV_MYSQL_ROOT_PASSWORD ]; then +# #sed -i "s/^\(.*sql.*username.*=\)\(.*\);/\1 'root';/g" /etc/horde/horde/conf.php +# sed -i "s/^\(.*sql.*username.*=\)\(.*\);/\1 '$MYSQL_ENV_MYSQL_ROOT_USERNAME';/g" /etc/horde/horde/conf.php +# sed -i "s/^\(.*sql.*password.*=\)\(.*\);/\1 '$MYSQL_ENV_MYSQL_ROOT_PASSWORD';/g" /etc/horde/horde/conf.php +# sed -i "s/^\(.*sql.*database.*=\)\(.*\);/\1 '$DB_NAME';/g" /etc/horde/horde/conf.php +# sed -i "s/^\(.*sql.*phptype.*=\)\(.*\);/\1 '$DB_DRIVER';/g" /etc/horde/horde/conf.php +#else +# sed -i "s/^\(.*sql.*username.*=\)\(.*\);/\1 '$DB_USER';/g" /etc/horde/horde/conf.php +# sed -i "s/^\(.*sql.*password.*=\)\(.*\);/\1 '$DB_PASS';/g" /etc/horde/horde/conf.php +# sed -i "s/^\(.*sql.*database.*=\)\(.*\);/\1 '$DB_NAME';/g" /etc/horde/horde/conf.php +# sed -i "s/^\(.*sql.*phptype.*=\)\(.*\);/\1 '$DB_DRIVER';/g" /etc/horde/horde/conf.php +#fi + + +sed -i "s/^\(.*sql.*username.*=\)\(.*\);/\1 '$DB_USER';/g" /etc/horde/horde/conf.php +sed -i "s/^\(.*sql.*password.*=\)\(.*\);/\1 '$DB_PASS';/g" /etc/horde/horde/conf.php +sed -i "s/^\(.*sql.*database.*=\)\(.*\);/\1 '$DB_NAME';/g" /etc/horde/horde/conf.php +sed -i "s/^\(.*sql.*phptype.*=\)\(.*\);/\1 '$DB_DRIVER';/g" /etc/horde/horde/conf.php + + +# this is where horde_db_migrate fiel is placed +cd /usr/sbin + + +if [ $MYSQL_PORT_3306_TCP_ADDR ]; then + + RESULT=`mysql -u $MYSQL_ENV_MYSQL_ROOT_USERNAME --password=$MYSQL_ENV_MYSQL_ROOT_PASSWORD --port=$MYSQL_PORT_3306_TCP_PORT --host=$MYSQL_PORT_3306_TCP_ADDR --protocol=$DB_PROTOCOL --skip-column-names -e "SHOW DATABASES LIKE '$DB_NAME'"` + if [ "$RESULT" == "$DB_NAME" ]; then + echo "Database exist" + else + echo "Database does not exist" + mysql -u $MYSQL_ENV_MYSQL_ROOT_USERNAME --password=$MYSQL_ENV_MYSQL_ROOT_PASSWORD --port=$MYSQL_PORT_3306_TCP_PORT --host=$MYSQL_PORT_3306_TCP_ADDR --protocol=$DB_PROTOCOL -e "CREATE DATABASE $DB_NAME" + horde-db-migrate + echo "Database created" + fi +else + + RESULT=`mysql -u $MYSQL_ENV_MYSQL_ROOT_USERNAME --password=$DB_PASS --port=$DB_PORT --host=$DB_HOST --protocol=$DB_PROTOCOL --skip-column-names -e "SHOW DATABASES LIKE '$DB_NAME'"` + if [ "$RESULT" == "$DB_NAME" ]; then + echo "Database exist" + else + echo "Database does not exist" + mysql -u $MYSQL_ENV_MYSQL_ROOT_USERNAME --password=$DB_PASS --port=$DB_PORT --host=$DB_HOST --protocol=$DB_PROTOCOL --skip-column-names -e "CREATE DATABASE $DB_NAME" + horde-db-migrate + echo "Database created" + fi +fi + +#sed -i "$ s|\-n||g" /usr/bin/pecl +#pecl install lzf +#pear upgrade-all + +#sed -i "s/^\(.*use_ssl.*=\)\(.*\);/\1 0;/g" /etc/horde/horde/conf.php +#sed -i "s/^\(.*testdisable.*=\)\(.*\);/\1 $HORDE_TEST_DISABLE;/g" /etc/horde/horde/conf.php + +cd /usr/sbin +horde-db-migrate + +service apache2 start \ No newline at end of file diff --git a/copper-server/kubernetes/groupwhare/horde/proxy_client_ip.php b/copper-server/kubernetes/groupwhare/horde/proxy_client_ip.php new file mode 100755 index 00000000..1b8cf149 --- /dev/null +++ b/copper-server/kubernetes/groupwhare/horde/proxy_client_ip.php @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/copper-server/kubernetes/groupwhare/horde/run.sh b/copper-server/kubernetes/groupwhare/horde/run.sh new file mode 100755 index 00000000..91e667d2 --- /dev/null +++ b/copper-server/kubernetes/groupwhare/horde/run.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +set -e + +exec /usr/sbin/apache2ctl -D FOREGROUND \ No newline at end of file diff --git a/copper-server/kubernetes/is/.env b/copper-server/kubernetes/is/.env deleted file mode 100755 index eb9f96af..00000000 --- a/copper-server/kubernetes/is/.env +++ /dev/null @@ -1,81 +0,0 @@ -# main configuration file - -# Domain name -DOMAIN=copper.opensource.lk - -# Debug option -DEBUG=true - -#################################### openldap ########################### - -#loglevel Logging description - -#-1 enable all debugging -#0 no debugging -#1 trace function calls -#2 debug packet handling -#4 heavy trace debugging -#8 connection management -#16 print out packets sent and received -#32 search filter processing -#64 configuration file processing -#128 access control list processing -#256 stats log connections/operations/results -#512 stats log entries sent -#1024 print communication with shell backends -#2048 print entry parsing debugging - -#The loglevel directive uses a decimal bit value so to set more that one logging level you need to add the decimal numbers as in the following examples: - -#loglevel 255 or loglevel -1 -# sets 1, 2, 4, 8, 16, 32, 64 and 128 -#loglevel 2176 -# 2048 + 128 - -#loglevel 296 -# 256 + 32 + 8 - -LDAP_LOG_LEVEL=-1 -LDAP_ORGANISATION=LSF -LDAP_DOMAIN=copper.opensource.lk -LDAP_BASE_DN=dc=copper,dc=opensource,dc=lk -LDAP_ADMIN_PASSWORD=admin -LDAP_CONFIG_PASSWORD=config -#LDAP_READONLY_USER=true -#LDAP_READONLY_USER_USERNAME=readonly -#LDAP_READONLY_USER_PASSWORD=readonly -LDAP_RFC2307BIS_SCHEMA=false -LDAP_BACKEND=mdb -LDAP_TLS=false -#LDAP_TLS_CRT_FILENAME=ldap.crt -#LDAP_TLS_KEY_FILENAME=ldap.key -#LDAP_TLS_CA_CRT_FILENAME=ca.crt -#LDAP_TLS_ENFORCE=false -#LDAP_TLS_CIPHER_SUITE=SECURE256:-VERS-SSL3.0 -#LDAP_TLS_PROTOCOL_MIN=3.1 - -#OpenLDAP user parameters -CN=admin -DC1=copper -DC2=opensource -DC3=lk -DNPASS=admin -OU=Users -OU=Groups - -#LDAP_TLS_VERIFY_CLIENT is set to demand by default so the clients must provide a certificate signed by the ldap trusted ca authorities. -#Possible values are : never | allow | try | demand -#Note try will disable client authentication - if you ident do use that you might want to check all client certs are signed properly -#and CA certs are imported to your ldap server trust store. -LDAP_TLS_VERIFY_CLIENT=try -LDAP_REPLICATION=false - -#LDAP_REPLICATION_CONFIG_SYNCPROV=binddn=cn=admin,cn=config bindmethod=simple credentials=$LDAP_CONFIG_PASSWORD searchbase=cn=config type=refreshAndPersist retry=60 + timeout=1 starttls=critical -#LDAP_REPLICATION_DB_SYNCPROV=binddn=cn=admin,$LDAP_BASE_DN bindmethod=simple credentials=$LDAP_ADMIN_PASSWORD searchbase=$LDAP_BASE_DN type=refreshAndPersist interval=00:00:00:10 retry=60 + timeout=1 starttls=critical -#LDAP_REPLICATION_HOSTS=#PYTHON2BASH:['ldap://172.19.0.22','ldap://openldap'] -KEEP_EXISTING_CONFIG=true -LDAP_REMOVE_CONFIG_AFTER_SETUP=true -LDAP_SSL_HELPER_PREFIX=ldap - - -##################################### END ################################# \ No newline at end of file diff --git a/copper-server/kubernetes/is/README.md b/copper-server/kubernetes/is/README.md deleted file mode 100755 index 70aa9056..00000000 --- a/copper-server/kubernetes/is/README.md +++ /dev/null @@ -1,94 +0,0 @@ -# Identity -Identity management system for copper-mail. - -## Prerequisite - -### Minimum System requirement - -Official documentation for WSO2 Identity Server 5.7 [link](https://docs.wso2.com/display/IS570/Installation+Prerequisites) - -1. Minimum memory - 4 GB -2. Swap partition - exact size of the RAM (Production server) -3. Processor - 2 Core/vCPU 1.1GHz or higher -4. Java SE Development Kit 1.8 -5. Docker - 18v or higher -6. Docker compose - 1.22v or higher -7. The Management Console requires full Javascript enablement of the Web browser. - - -## Installation - -### Update configs - -#### on dev - -add 'localhost.com' mapping to '127.0.0.1' at host file - -following is for Unix environments: - -edit host file with root permission -``` -sudo nano /etc/hosts -``` -add the following -``` -127.0.0.1 localhost.com -``` - -#### on production - -replace 'localhost.com' with your ipaddress or domain name in 'is/config/' - -carbon.xml >>> -``` -localhost.com -localhost.com -``` - -### Create keystores - -``` -cd /is/files -keytool -genkey -alias wso2carbon -keyalg RSA -keystore wso2carbon.jks -keysize 2048 -``` -first and last name? -> ipaddress or domain name -organizational unit -> Users -password -> wso2carbon - - -``` -keytool -export -alias wso2carbon -keystore wso2carbon.jks -file publickey.pem -keytool -import -alias wso2 -file publickey.pem -keystore client-truststore.jks -storepass wso2carbon -``` - - -## Running - -To build and up the server -``` -# sh start.sh -``` - -To stop and remove all containers and along with built images -``` -# sh reset.sh -``` - -Give it a minute or 2, for WSO2 Identity Server to start up. - -Run `docker logs copper-is` to find server url in the end of the logs to be recognized as the server started successfully. - -NB: At times when Identity Server have not started properly on production server, do the following: -``` -cd -docker-compose stop -docker-compose up -d -``` - - -## Testing - -On production environment replace 'localhost.com' with server ip or domain name. You may always use the server started URL on IS docker logs using `docker logs copper-is` which is found right after the server has started. - -1) Visit https://localhost.com:9443/carbon and create a user and add all permission. -2) Goto https://localhost.com:9443/dashboard and try login in successfully. \ No newline at end of file diff --git a/copper-server/kubernetes/is/docker-compose.yml b/copper-server/kubernetes/is/docker-compose.yml deleted file mode 100755 index d60973e0..00000000 --- a/copper-server/kubernetes/is/docker-compose.yml +++ /dev/null @@ -1,47 +0,0 @@ -version: '3' - -services: - openldap: - build: - context: ./openldap - image: copper-openldap - container_name: copper-openldap - environment: - LDAP_DOMAIN: "copper.opensource.lk" - tty: true - stdin_open: true - ports: - - "389:389" - - "636:636" - - # cn=admin,dc=copper,dc=opensource,dc=lk - - phpldapadmin: - image: osixia/phpldapadmin:latest - container_name: phpldapadmin - environment: - PHPLDAPADMIN_LDAP_HOSTS: "openldap" - PHPLDAPADMIN_HTTPS: "false" - ports: - - "8080:80" - depends_on: - - openldap # service name - - is: - build: - context: ./is - image: copper-is - container_name: copper-is - ports: - - "9445:9445" - depends_on: - - openldap - - # mysql: - # image: mysql/mysql-server:5.7 - # container_name: mysql - # environment: - # MYSQL_ROOT_PASSWORD: "toor" - # MYSQL_DATABASE: "wso2is" - # ports: - # - "3306:3306" diff --git a/copper-server/kubernetes/is/is/Dockerfile b/copper-server/kubernetes/is/is/Dockerfile deleted file mode 100755 index 88f0b35c..00000000 --- a/copper-server/kubernetes/is/is/Dockerfile +++ /dev/null @@ -1,50 +0,0 @@ -# ------------------------------------------------------------------------ -# -# Copyright 2018 WSO2, Inc. (http://wso2.com) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License -# -# ------------------------------------------------------------------------ - -# set to latest Alpine -FROM wso2/wso2is:5.7.0 -# MAINTAINER Clement Fernando "info@mrclemrkz.com” - -# set user configurations -ARG USER=wso2carbon -ARG USER_HOME=/home/${USER} - -# set wso2 product configurations -ARG WSO2_SERVER=wso2is -ARG WSO2_SERVER_VERSION=5.7.0 -ARG WSO2_SERVER_PACK=${WSO2_SERVER}-${WSO2_SERVER_VERSION} -ARG WSO2_SERVER_HOME=${USER_HOME}/${WSO2_SERVER_PACK} -ARG WSO2_SERVER_CONF=${WSO2_SERVER_HOME}/repository/conf -ARG WSO2_SERVER_SECURITY=${WSO2_SERVER_HOME}/repository/resources/security - - -#set JVM memory heap to 2GB for production. Default is to 1GB. -COPY --chown=wso2carbon:wso2 ./files/wso2server.sh ${WSO2_SERVER_HOME}/bin - -# update keystores -COPY --chown=wso2carbon:wso2 ./files/wso2carbon.jks ${WSO2_SERVER_SECURITY}/ -COPY --chown=wso2carbon:wso2 ./files/client-truststore.jks ${WSO2_SERVER_SECURITY}/ - -# conecting external ldap -COPY --chown=wso2carbon:wso2 ./config/embedded-ldap.xml ${WSO2_SERVER_CONF}/identity/ -COPY --chown=wso2carbon:wso2 ./config/carbon.xml ${WSO2_SERVER_CONF}/ -COPY --chown=wso2carbon:wso2 ./config/tenant-mgt.xml ${WSO2_SERVER_CONF}/ -COPY --chown=wso2carbon:wso2 ./config/user-mgt.xml ${WSO2_SERVER_CONF}/ - -# for claim mapping mismatch on "urn:ietf:params:scim:schemas:core:2.0:meta.resourceType" -COPY --chown=wso2carbon:wso2 ./config/claim-config.xml ${WSO2_SERVER_CONF}/ diff --git a/copper-server/kubernetes/is/is/config/carbon.xml b/copper-server/kubernetes/is/is/config/carbon.xml deleted file mode 100755 index f0fe7051..00000000 --- a/copper-server/kubernetes/is/is/config/carbon.xml +++ /dev/null @@ -1,720 +0,0 @@ - - - - - - - - WSO2 Identity Server - - - IS - - - 5.7.0 - - - localhost.com - - - localhost.com - - - local:/${carbon.context}/services/ - - - - - - - IdentityServer - - - - - - - org.wso2.carbon - - - / - - - - - - - - - 15 - - - - - - - - - 2 - - - - - 9999 - - 11111 - - - - - - 10389 - - 8000 - - - - - - 10500 - - - - - - - - - org.wso2.carbon.tomcat.jndi.CarbonJavaURLContextFactory - - - - - - - - - java - - - - - - - - - - false - - - false - - - 600 - - - - false - - - - - - - - 30 - - - - - - - - - 15 - - false - - - - - - ${carbon.home}/repository/deployment/server/ - - - 15 - - - ${carbon.home}/repository/conf/axis2/axis2.xml - - - 30000 - - - ${carbon.home}/repository/deployment/client/ - - ${carbon.home}/repository/conf/axis2/axis2_client.xml - - true - - - - - - - - - - admin - Default Administrator Role - - - user - Default User Role - - - - - - - true - - - org.wso2.carbon.crypto.provider.KeyStoreBasedInternalCryptoProvider - - - org.wso2.carbon.core.encryption.KeyStoreBasedExternalCryptoProvider - - - - - - - - - - - - - - - - - ${carbon.home}/repository/resources/security/wso2carbon.jks - - JKS - - wso2carbon - - wso2carbon - - wso2carbon - - - - - - ${carbon.home}/repository/resources/security/wso2carbon.jks - - JKS - - wso2carbon - - wso2carbon - - wso2carbon - - - - - - ${carbon.home}/repository/resources/security/client-truststore.jks - - JKS - - wso2carbon - - - - - - - - - - - - - - - - - - - UserManager - - - false - - org.wso2.carbon.identity.provider.AttributeCallbackHandler - - - org.wso2.carbon.identity.sts.store.DBTokenStore - - - true - allow - - - - - - -claim_mgt_menu -identity_mgt_emailtemplate_menu -identity_security_questions_menu - - - - ${carbon.home}/tmp/work - - - - - - true - - - 10 - - - 30 - - - - - - 100 - - - - keystore - certificate - * - - org.wso2.carbon.ui.transports.fileupload.AnyFileUploadExecutor - - - - - jarZip - - org.wso2.carbon.ui.transports.fileupload.JarZipUploadExecutor - - - - dbs - - org.wso2.carbon.ui.transports.fileupload.DBSFileUploadExecutor - - - - tools - - org.wso2.carbon.ui.transports.fileupload.ToolsFileUploadExecutor - - - - toolsAny - - org.wso2.carbon.ui.transports.fileupload.ToolsAnyFileUploadExecutor - - - - - - - - - - info - org.wso2.carbon.core.transports.util.InfoProcessor - - - wsdl - org.wso2.carbon.core.transports.util.Wsdl11Processor - - - wsdl2 - org.wso2.carbon.core.transports.util.Wsdl20Processor - - - xsd - org.wso2.carbon.core.transports.util.XsdProcessor - - - - - - false - false - true - svn - http://svnrepo.example.com/repos/ - username - password - true - - - - - - - - - - - - ${require.carbon.servlet} - - - - - true - - - - - - - default repository - http://product-dist.wso2.com/p2/carbon/releases/wilkes/ - - - - - - - - true - - - - - - true - - diff --git a/copper-server/kubernetes/is/is/config/claim-config.xml b/copper-server/kubernetes/is/is/config/claim-config.xml deleted file mode 100755 index b55cb16f..00000000 --- a/copper-server/kubernetes/is/is/config/claim-config.xml +++ /dev/null @@ -1,2291 +0,0 @@ - - - - - - http://wso2.org/claims/givenname - First Name - givenName - First Name - - 1 - - - - http://wso2.org/claims/lastname - Last Name - sn - Last Name - - 2 - - - - http://wso2.org/claims/organization - Organization - organizationName - Organization - 3 - - - - http://wso2.org/claims/streetaddress - Address - streetAddress - Address - 4 - - - - http://wso2.org/claims/country - Country - country - Country - 5 - - - - http://wso2.org/claims/emailaddress - Email - mail - Email Address - - 6 - - ^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$ - - - http://wso2.org/claims/telephone - Telephone - telephoneNumber - Telephone - 7 - - - - http://wso2.org/claims/mobile - Mobile - mobile - Mobile - 8 - - - - http://wso2.org/claims/im - IM - im - IM - 9 - - - - http://wso2.org/claims/url - URL - url - URL - 10 - - - - http://wso2.org/claims/gender - Gender - gender - Gender - - - http://wso2.org/claims/title - Title - title - Title - - - http://wso2.org/claims/role - Role - role - Role - - - - - http://wso2.org/claims/department - Department - departmentNumber - Department - - - - - http://wso2.org/claims/postalcode - Postal Code - postalcode - Postal Code - - - http://wso2.org/claims/locality - Locality - local - Locality - - - http://wso2.org/claims/region - Region - region - Region - - - http://wso2.org/claims/dob - Birth Date - dateOfBirth - Birth Date - - - http://wso2.org/claims/nickname - Nick Name - nickName - Nick Name - - - http://wso2.org/claims/stateorprovince - State - stateOrProvinceName - State - - - http://wso2.org/claims/otherphone - Other Phone - otherPhone - Other Phone - - - http://wso2.org/claims/fullname - Full Name - cn - Full Name - - - http://wso2.org/claims/username - Username - uid - Username - - - http://wso2.org/claims/userprincipal - User Principal - uid - User Principal - - - http://wso2.org/claims/userid - User ID - scimId - Unique ID of the user - - - - http://wso2.org/claims/externalid - External User ID - externalId - Unique ID of the user used in external systems - - - - http://wso2.org/claims/created - Created Time - createdDate - Created timestamp of the user - - - - http://wso2.org/claims/modified - Last Modified Time - lastModifiedDate - Last Modified timestamp of the user - - - - http://wso2.org/claims/location - Location - location - Location - - - - http://wso2.org/claims/formattedName - Name - Formatted Name - formattedName - Formatted Name - - - http://wso2.org/claims/middleName - Middle Name - middleName - Middle Name - - - http://wso2.org/claims/honorificPrefix - Name - Honoric Prefix - honoricPrefix - Honoric Prefix - - - http://wso2.org/claims/honorificSuffix - Name - Honoric Suffix - honoricSuffix - Honoric Suffix - - - http://wso2.org/claims/resourceType - Resource Type - ref - Resource Type - - - http://wso2.org/claims/userType - User Type - userType - User Type - - - http://wso2.org/claims/preferredLanguage - Preferred Language - preferredLanguage - Preferred Language - - - http://wso2.org/claims/local - Local - local - Local - - - http://wso2.org/claims/timeZone - Time Zone - timeZone - Time Zone - - - - http://wso2.org/claims/emails.work - Emails - Work Email - workEmail - Work Email - - - http://wso2.org/claims/emails.home - Emails - Home Email - homeEmail - Home Email - - - http://wso2.org/claims/emails.other - Emails - Other Email - otherEmail - Other Email - - - http://wso2.org/claims/phoneNumbers - Phone Numbers - phoneNumbers - Phone Numbers - ^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$ - - - http://wso2.org/claims/phoneNumbers.home - Phone Numbers - Home Phone Number - homePhone - Home Phone - - - http://wso2.org/claims/phoneNumbers.work - Phone Numbers - Work Phone Number - workPhone - Work Phone - - - http://wso2.org/claims/phoneNumbers.fax - Phone Numbers - Fax Number - fax - Fax Number - - - http://wso2.org/claims/phoneNumbers.pager - Phone Numbers - Pager Number - pager - Pager Number - - - http://wso2.org/claims/phoneNumbers.other - Phone Numbers - Other - otherPhoneNumber - Other Phone Number - - - http://wso2.org/claims/gtalk - IM - Gtalk - imGtalk - IM - Gtalk - - - http://wso2.org/claims/skype - IM - Skype - imSkype - IM - Skype - - - http://wso2.org/claims/photos - Photo - photos - Photo - - - http://wso2.org/claims/photourl - Photo URIL - photoUrl - Photo URL - - - http://wso2.org/claims/thumbnail - Photo - Thumbnail - thumbnail - Photo - Thumbnail - - - http://wso2.org/claims/addresses - Address - addresses - Address - - - http://wso2.org/claims/addresses.formatted - Address - Formatted - formattedAddress - Address - Formatted - - - http://wso2.org/claims/streetaddress - Address - Street - streetAddress - Address - Street - 5 - - - http://wso2.org/claims/addresses.locality - Address - Locality - localityAddress - Address - Locality - - - http://wso2.org/claims/groups - Groups - groups - Groups - - - http://wso2.org/claims/identity/verifyEmail - Verify Email - verifyEmail - Temporary claim to invoke email verified feature - - - http://wso2.org/claims/identity/askPassword - Ask Password - askPassword - Temporary claim to invoke email ask Password feature - - - http://wso2.org/claims/identity/adminForcedPasswordReset - Force Password Reset - forcePasswordReset - Temporary claim to invoke email force password feature - - - http://wso2.org/claims/entitlements - Entitlements - entitlements - Entitlements - - - http://wso2.org/claims/identity/lockedReason - Locked Reason - lockedReason - Locked Reason - - - http://wso2.org/claims/x509Certificates - X509Certificates - x509Certificates - X509Certificates - - - http://wso2.org/claims/identity/failedPasswordRecoveryAttempts - Failed Password Recovery Attempts - failedRecoveryAttempts - Number of consecutive failed attempts done for password recovery - - - - - http://wso2.org/claims/primaryChallengeQuestion - Primary Challenge Question - - primaryChallengeQuestion - Primary Challenge Question - - - http://wso2.org/claims/challengeQuestionUris - Challenge Question - - challengeQuestionUris - Challenge Question - - - - http://wso2.org/claims/oneTimePassword - One Time Password - - oneTimePassword - One Time Password - - - http://wso2.org/claims/extendedRef - Extended Ref - - extendedRef - Extended Ref - - - http://wso2.org/claims/extendedDisplayName - Extended Display Name - - extendedDisplayName - Extended Display Name - - - http://wso2.org/claims/costCenter - Cost Center - - costCenter - Cost Center - - - http://wso2.org/claims/extendedExternalId - Extended External ID - - extendedExternalId - Extended External ID - - - http://wso2.org/claims/identity/accountLocked - Account Locked - - accountLock - Account Locked - - - http://wso2.org/claims/identity/emailVerified - Email Verified - - emailVerified - Email Verified - - - http://wso2.org/claims/identity/phoneVerified - Phone Verified - - phoneVerified - Phone Verified - - - http://wso2.org/claims/identity/accountDisabled - Account Disabled - - accountDisabled - Account Disabled - - - http://wso2.org/claims/identity/failedLoginAttempts - Failed Login Attempts - - failedLoginAttempts - Failed Login Attempts - - - http://wso2.org/claims/identity/failedLoginLockoutCount - Failed Lockout Count - - failedLockoutCount - Failed Lockout Count - - - http://wso2.org/claims/identity/unlockTime - Unlock Time - - unlockTime - Unlock Time - - - http://wso2.org/claims/lastLoginTime - Last Login - - lastLoginTime - Last Login Time - - - http://wso2.org/claims/identity/lastLogonTime - Last Logon - - lastLogonTime - Last Logon Time - - - http://wso2.org/claims/identity/lastPasswordUpdateTime - Last Password Update - - lastPasswordUpdate - Last Password Update Time - - - http://wso2.org/claims/challengeQuestion1 - Challenge Question1 - - firstChallenge - Challenge Question1 - - - - http://wso2.org/claims/challengeQuestion2 - Challenge Question2 - - secondChallenge - Challenge Question2 - - - http://wso2.org/claims/displayName - Display Name - displayName - Display Name - - - http://wso2.org/claims/active - Active - active - Status of the account - - - - - - - http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname - First Name - givenName - First Name - - - http://wso2.org/claims/givenname - - - http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nickname - Nick Name - nickName - Nick Name - http://wso2.org/claims/nickname - - - http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname - Last Name - sn - Last Name - - - http://wso2.org/claims/lastname - - - http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress - Email - mail - Email Address - - - ^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$ - http://wso2.org/claims/emailaddress - - - http://schemas.xmlsoap.org/ws/2005/05/identity/claims/dateofbirth - DOB - dateOfBirth - Date of Birth - http://wso2.org/claims/dob - - - http://schemas.xmlsoap.org/ws/2005/05/identity/claims/gender - Gender - gender - Gender - http://wso2.org/claims/gender - - - http://schemas.xmlsoap.org/ws/2005/05/identity/claims/country - Country - country - Country - - http://wso2.org/claims/country - - - http://schemas.xmlsoap.org/ws/2005/05/identity/claims/streetaddress - Street Address - streetAddress - Street Address - http://wso2.org/claims/streetaddress - - - http://schemas.xmlsoap.org/ws/2005/05/identity/claims/homephone - Home Phone - homePhone - Home Phone - - http://wso2.org/claims/phoneNumbers.home - - - http://schemas.xmlsoap.org/ws/2005/05/identity/claims/otherphone - Other Phone - otherPhone - Other Phone - http://wso2.org/claims/otherphone - - - http://schemas.xmlsoap.org/ws/2005/05/identity/claims/mobile - Mobile - mobile - Mobile - http://wso2.org/claims/mobile - - - http://schemas.xmlsoap.org/ws/2005/05/identity/claims/locality - Locality - localityName - Locality - http://wso2.org/claims/locality - - - http://schemas.xmlsoap.org/ws/2005/05/identity/claims/stateorprovince - State - stateOrProvinceName - State - http://wso2.org/claims/stateorprovince - - - http://schemas.xmlsoap.org/ws/2005/05/identity/claims/postalcode - Postalcode - postalCode - Postalcode - - http://wso2.org/claims/postalcode - - - http://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier - privatePersonalIdentifier - PPID - - - http://wso2.org/claims/im - - - - - - nickname - Nick Name - nickName - Nick Name - - 1 - - http://wso2.org/claims/nickname - - - fullname - Full Name - cn - Full Name - 2 - - - http://wso2.org/claims/fullname - - - email - Email - mail - Email Address - 3 - - - ^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$ - http://wso2.org/claims/emailaddress - - - country - Country - country - Country - 5 - - http://wso2.org/claims/country - - - timezone - Time Zone - timeZone - Time Zone - 9 - - http://wso2.org/claims/timeZone - - - dob - DOB - dateOfBirth - Date of Birth - 6 - - http://wso2.org/claims/dob - - - postcode - Postalcode - postalCode - Postalcode - 4 - - http://wso2.org/claims/postalcode - - - gender - Gender - gender - Gender - 8 - - http://wso2.org/claims/gender - - - language - Language - prefferedLanguage - Language - 7 - - http://wso2.org/claims/preferredLanguage - - - - - - http://axschema.org/namePerson/first - First Name - givenName - First Name - - - http://wso2.org/claims/givenname - - - http://axschema.org/namePerson/last - Last Name - sn - Last Name - - - http://wso2.org/claims/lastname - - - http://axschema.org/contact/email - Email - mail - Email Address - - - ^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$ - http://wso2.org/claims/emailaddress - - - http://axschema.org/contact/country/home - Country - country - Country - - http://wso2.org/claims/country - - - http://axschema.org/pref/timezone - Time Zone - timeZone - Time Zone - http://wso2.org/claims/timeZone - - - http://axschema.org/birthDate - DOB - dateOfBirth - Date of Birth - - http://wso2.org/claims/dob - - - http://axschema.org/contact/postalCode/home - Postalcode - postalCode - Postalcode - - http://wso2.org/claims/postalcode - - - http://axschema.org/person/gender - Gender - gender - Gender - - http://wso2.org/claims/gender - - - http://axschema.org/pref/language - Language - prefferedLanguage - Language - - http://wso2.org/claims/preferredLanguage - - - - - urn:scim:schemas:core:1.0:id - Id - scimId - Id - - 1 - - http://wso2.org/claims/userid - - - urn:scim:schemas:core:1.0:externalId - External Id - externalId - External Id - - 1 - - http://wso2.org/claims/externalid - - - urn:scim:schemas:core:1.0:meta.created - Meta - Created - createdDate - Meta - Created - - 1 - - http://wso2.org/claims/created - - - urn:scim:schemas:core:1.0:meta.lastModified - Meta - Last Modified - lastModifiedDate - Meta - Last Modified - - 1 - - http://wso2.org/claims/modified - - - urn:scim:schemas:core:1.0:meta.location - Meta - Location - location - Meta - Location - - 1 - - http://wso2.org/claims/location - - - urn:scim:schemas:core:1.0:userName - User Name - uid - User Name - 2 - - - http://wso2.org/claims/username - - - urn:scim:schemas:core:1.0:name.givenName - Name - Given Name - givenName - Given Name - - 1 - - http://wso2.org/claims/givenname - - - urn:scim:schemas:core:1.0:name.familyName - Name - Family Name - sn - Family Name - 2 - - - http://wso2.org/claims/lastname - - - urn:scim:schemas:core:1.0:name.formatted - Name - Formatted Name - formattedName - Formatted Name - 2 - - - http://wso2.org/claims/formattedName - - - urn:scim:schemas:core:1.0:name.middleName - Name - Middle Name - middleName - Middle Name - 2 - - - http://wso2.org/claims/middleName - - - urn:scim:schemas:core:1.0:name.honorificPrefix - Name - Honoric Prefix - honoricPrefix - Honoric Prefix - 2 - - - http://wso2.org/claims/honorificPrefix - - - urn:scim:schemas:core:1.0:name.honorificSuffix - Name - Honoric Suffix - honoricSuffix - Honoric Suffix - 2 - - - http://wso2.org/claims/honorificSuffix - - - urn:scim:schemas:core:1.0:displayName - Display Name - displayName - Display Name - 2 - - - http://wso2.org/claims/displayName - - - urn:scim:schemas:core:1.0:nickName - Nick Name - nickName - Nick Name - 2 - - - http://wso2.org/claims/nickname - - - urn:scim:schemas:core:1.0:profileUrl - Profile URL - url - Profile URL - 2 - - - http://wso2.org/claims/url - - - urn:scim:schemas:core:1.0:title - Title - title - Title - 2 - - - http://wso2.org/claims/title - - - urn:scim:schemas:core:1.0:userType - User Type - userType - User Type - 2 - - - http://wso2.org/claims/userType - - - urn:scim:schemas:core:1.0:preferredLanguage - Preferred Language - preferredLanguage - Preferred Language - 2 - - - http://wso2.org/claims/preferredLanguage - - - urn:scim:schemas:core:1.0:locale - Locality - localityName - Locality - 2 - - - http://wso2.org/claims/local - - - urn:scim:schemas:core:1.0:timeZone - Time Zone - timeZone - Time Zone - 2 - - - http://wso2.org/claims/timeZone - - - urn:scim:schemas:core:1.0:active - Active - active - Active - 2 - - - http://wso2.org/claims/active - - - urn:scim:schemas:core:1.0:emails - Emails - mail - Email Addresses - 3 - - - ^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$ - http://wso2.org/claims/emailaddress - - - urn:scim:schemas:core:1.0:emails.work - Emails - Work Email - workEmail - Work Email - 5 - - http://wso2.org/claims/emails.work - - - urn:scim:schemas:core:1.0:emails.home - Emails - Home Email - homeEmail - Home Email - 5 - - http://wso2.org/claims/emails.home - - - urn:scim:schemas:core:1.0:emails.other - Emails - Other Email - otherEmail - Other Email - 5 - - http://wso2.org/claims/emails.other - - - urn:scim:schemas:core:1.0:phoneNumbers - Phone Numbers - phoneNumbers - Phone Numbers - 3 - - - ^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$ - http://wso2.org/claims/phoneNumbers - - - urn:scim:schemas:core:1.0:phoneNumbers.mobile - Phone Numbers - Mobile Number - mobile - Mobile Number - 5 - - http://wso2.org/claims/mobile - - - urn:scim:schemas:core:1.0:phoneNumbers.home - Phone Numbers - Home Phone Number - homePhone - Home Phone - 5 - - http://wso2.org/claims/phoneNumbers.home - - - urn:scim:schemas:core:1.0:phoneNumbers.work - Phone Numbers - Work Phone Number - workPhone - Work Phone - 5 - - http://wso2.org/claims/phoneNumbers.work - - - urn:scim:schemas:core:1.0:phoneNumbers.fax - Phone Numbers - Fax Number - fax - Fax Number - 5 - - http://wso2.org/claims/phoneNumbers.fax - - - urn:scim:schemas:core:1.0:phoneNumbers.pager - Phone Numbers - Pager Number - pager - Pager Number - 5 - - http://wso2.org/claims/phoneNumbers.pager - - - urn:scim:schemas:core:1.0:phoneNumbers.other - Phone Numbers - Other - otherPhoneNumber - Other Phone Number - 5 - - http://wso2.org/claims/phoneNumbers.other - - - urn:scim:schemas:core:1.0:ims - IMS - im - IM - 5 - - http://wso2.org/claims/im - - - urn:scim:schemas:core:1.0:ims.gtalk - IM - Gtalk - imGtalk - IM - Gtalk - 5 - - http://wso2.org/claims/gtalk - - - urn:scim:schemas:core:1.0:ims.skype - IM - Skype - imSkype - IM - Skype - 5 - - http://wso2.org/claims/skype - - - urn:scim:schemas:core:1.0:photos - Photo - photos - Photo - 5 - - http://wso2.org/claims/photos - - - urn:scim:schemas:core:1.0:photos.photo - Photo - photoUrl - Photo - 5 - - http://wso2.org/claims/photourl - - - urn:scim:schemas:core:1.0:photos.thumbnail - Photo - Thumbnail - thumbnail - Photo - Thumbnail - 5 - - http://wso2.org/claims/thumbnail - - - urn:scim:schemas:core:1.0:addresses - Address - addresses - Address - 5 - - http://wso2.org/claims/addresses - - - urn:scim:schemas:core:1.0:addresses.formatted - Address - Formatted - formattedAddress - Address - Formatted - 5 - - http://wso2.org/claims/addresses.formatted - - - urn:scim:schemas:core:1.0:addresses.streetAddress - Address - Street - streetAddress - Address - Street - 5 - - http://wso2.org/claims/streetaddress - - - urn:scim:schemas:core:1.0:addresses.locality - Address - Locality - localityAddress - Address - Locality - 5 - - http://wso2.org/claims/addresses.locality - - - urn:scim:schemas:core:1.0:addresses.region - Address - Region - region - Address - Region - 5 - - http://wso2.org/claims/region - - - urn:scim:schemas:core:1.0:addresses.postalCode - Address - Postal Code - postalCode - Address - Postal Code - 5 - - http://wso2.org/claims/postalcode - - - urn:scim:schemas:core:1.0:addresses.country - Address - Country - country - Address - Country - 5 - - http://wso2.org/claims/country - - - urn:scim:schemas:core:1.0:groups - Groups - groups - Groups - 5 - - http://wso2.org/claims/groups - - - urn:scim:schemas:core:1.0:entitlements - Entitlements - entitlements - Entitlements - 5 - - http://wso2.org/claims/entitlements - - - urn:scim:schemas:core:1.0:roles - Roles - roles - Roles - 5 - - http://wso2.org/claims/role - - - urn:scim:schemas:core:1.0:x509Certificates - X509Certificates - x509Certificates - X509Certificates - 5 - - http://wso2.org/claims/x509Certificates - - - - - sub - Subject - uid - Identifier for the End-User at the Issuer - - 1 - - http://wso2.org/claims/username - - - name - Full Name - cn - End-User's full name in displayable form including all name parts, possibly including titles and suffixes, ordered according to the End-User's locale and preferences - - 2 - - http://wso2.org/claims/fullname - - - given_name - Given Name - givenName - Given name(s) or first name(s) of the End-User. Note that in some cultures, people can have multiple given names; all can be present, with the names being separated by space characters. - 3 - - http://wso2.org/claims/givenname - - - family_name - Surname - sn - Surname(s) or last name(s) of the End-User. Note that in some cultures, people can have multiple family names or no family name; all can be present, with the names being separated by space characters. - 4 - - http://wso2.org/claims/lastname - - - middle_name - Middle Name - middleName - Middle name(s) of the End-User. Note that in some cultures, people can have multiple middle names; all can be present, with the names being separated by space characters. Also note that in some cultures, middle names are not used. - 5 - - http://wso2.org/claims/middleName - - - nickname - Nickname - nickName - Casual name of the End-User that may or may not be the same as the given_name. For instance, a nickname value of Mike might be returned alongside a given_name value of Michael. - - 6 - - http://wso2.org/claims/nickname - - - preferred_username - Preferred Username - cn - Shorthand name by which the End-User wishes to be referred to at the RP, such as janedoe or j.doe. - 7 - - http://wso2.org/claims/displayName - - - profile - Profile - url - URL of the End-User's profile page. The contents of this Web page SHOULD be about the End-User. - 8 - - http://wso2.org/claims/url - - - picture - Picture - image - URL of the End-User's profile picture. This URL MUST refer to an image file (for example, a PNG, JPEG, or GIF image file) - 9 - - http://wso2.org/claims/photourl - - - website - URL - url - URL of the End-User's Web page or blog. This Web page SHOULD contain information published by the End-User or an organization that the End-User is affiliated with. - 10 - - http://wso2.org/claims/url - - - upn - User Principal - uid - The user principal name - 11 - - http://wso2.org/claims/userprincipal - - - groups - User Groups - role - List of group names that have been assigned to the principal. This typically will require a mapping at the application container level to application deployment roles. - 12 - - http://wso2.org/claims/role - - - email - Email - mail - End-User's preferred e-mail address. - http://wso2.org/claims/emailaddress - - - email_verified - Email Verified - emailVerified - True if the End-User's e-mail address has been verified; otherwise false. - http://wso2.org/claims/identity/emailVerified - - - gender - Gender - gender - End-User's gender. Values defined by this specification are female and male. Other values MAY be used when neither of the defined values are applicable. - - - http://wso2.org/claims/gender - - - birthdate - Birth Date - birthDate - End-User's birthday, represented as an ISO 8601:2004 [ISO8601-2004] YYYY-MM-DD format. The year MAY be 0000, indicating that it is omitted. To represent only the year, YYYY format is allowed. - http://wso2.org/claims/dob - - - zoneinfo - Zone Info - zone - String from zoneinfo time zone database representing the End-User's time zone. For example, Europe/Paris or America/Los_Angeles. - http://wso2.org/claims/timeZone - - - locale - Locale - locale - End-User's locale, For example, en-US or fr-CA, en_US - http://wso2.org/claims/local - - - phone_number - Phone Number - telephoneNumber - End-User's preferred telephone number. For example, +1 (425) 555-1212 or +56 (2) 687 2400., +1 (604) 555-1234;ext=5678. - http://wso2.org/claims/telephone - - - phone_number_verified - Phone Number Verified - phoneVerififed - True if the End-User's phone number has been verified; otherwise false. - http://wso2.org/claims/identity/phoneVerified - - - address - Address - address - True if the End-User's phone number has been verified; otherwise false. - http://wso2.org/claims/addresses - - - updated_at - Updated At - updated - Time the End-User's information was last updated. Its value is a JSON number representing the number of seconds from 1970-01-01T0:0:0Z as measured in UTC until the date/time. - http://wso2.org/claims/modified - - - formatted - Address Formatted - formatted - Full mailing address, formatted for display or use on a mailing label. This field MAY contain multiple lines, separated by newlines. - http://wso2.org/claims/addresses.formatted - - - street_address - Street Address - street - Full street address component, which MAY include house number, street name, Post Office Box, and multi-line extended street address information. - http://wso2.org/claims/streetaddress - - - locality - Locality - localityName - City or locality component. - http://wso2.org/claims/locality - - - region - One Time Password - region - State, province, prefecture, or region component. - http://wso2.org/claims/region - - - postal_code - Postal Code - postalcode - Zip code or postal code component. - http://wso2.org/claims/postalcode - - - country - Country - country - Country name component - http://wso2.org/claims/country - - - - - urn:ietf:params:scim:schemas:core:2.0:id - Id - scimId - Id - - 1 - - http://wso2.org/claims/userid - - - urn:ietf:params:scim:schemas:core:2.0:externalId - External Id - externalId - External Id - - 1 - - http://wso2.org/claims/externalid - - - urn:ietf:params:scim:schemas:core:2.0:meta.created - Meta - Created - createdDate - Meta - Created - - 1 - - http://wso2.org/claims/created - - - urn:ietf:params:scim:schemas:core:2.0:meta.lastModified - Meta - Last Modified - lastModifiedDate - Meta - Last Modified - - 1 - - http://wso2.org/claims/modified - - - urn:ietf:params:scim:schemas:core:2.0:meta.location - Meta - Location - location - Meta - Location - - 1 - - http://wso2.org/claims/location - - - urn:ietf:params:scim:schemas:core:2.0:meta.resourceType - Meta - Location - ref - Meta - Location - - 1 - - http://wso2.org/claims/userType - - - urn:ietf:params:scim:schemas:core:2.0:meta.version - Meta - Version - im - Meta - Version - - 1 - - http://wso2.org/claims/im - - - - - urn:ietf:params:scim:schemas:core:2.0:User:userName - User Name - uid - User Name - 2 - - - http://wso2.org/claims/username - - - urn:ietf:params:scim:schemas:core:2.0:User:name.givenName - Name - Given Name - givenName - Given Name - - 1 - - http://wso2.org/claims/givenname - - - urn:ietf:params:scim:schemas:core:2.0:User:name.familyName - Name - Family Name - sn - Family Name - 2 - - - http://wso2.org/claims/lastname - - - urn:ietf:params:scim:schemas:core:2.0:User:name.formatted - Name - Formatted Name - formattedName - Formatted Name - 2 - - - http://wso2.org/claims/formattedName - - - urn:ietf:params:scim:schemas:core:2.0:User:name.middleName - Name - Middle Name - middleName - Middle Name - 2 - - - http://wso2.org/claims/middleName - - - urn:ietf:params:scim:schemas:core:2.0:User:name.honorificPrefix - Name - Honoric Prefix - honoricPrefix - Honoric Prefix - 2 - - - http://wso2.org/claims/honorificPrefix - - - urn:ietf:params:scim:schemas:core:2.0:User:name.honorificSuffix - Name - Honoric Suffix - honoricSuffix - Honoric Suffix - 2 - - - http://wso2.org/claims/honorificSuffix - - - urn:ietf:params:scim:schemas:core:2.0:User:displayName - Display Name - displayName - Display Name - 2 - - - http://wso2.org/claims/displayName - - - urn:ietf:params:scim:schemas:core:2.0:User:nickName - Nick Name - nickName - Nick Name - 2 - - - http://wso2.org/claims/nickname - - - urn:ietf:params:scim:schemas:core:2.0:User:profileUrl - Profile URL - url - Profile URL - 2 - - - http://wso2.org/claims/url - - - urn:ietf:params:scim:schemas:core:2.0:User:title - Title - title - Title - 2 - - - http://wso2.org/claims/title - - - urn:ietf:params:scim:schemas:core:2.0:User:userType - User Type - userType - User Type - 2 - - - http://wso2.org/claims/userType - - - urn:ietf:params:scim:schemas:core:2.0:User:preferredLanguage - Preferred Language - preferredLanguage - Preferred Language - 2 - - - http://wso2.org/claims/preferredLanguage - - - urn:ietf:params:scim:schemas:core:2.0:User:locale - Locality - localityName - Locality - 2 - - - http://wso2.org/claims/local - - - urn:ietf:params:scim:schemas:core:2.0:User:timezone - Time Zone - timeZone - Time Zone - 2 - - - http://wso2.org/claims/timeZone - - - urn:ietf:params:scim:schemas:core:2.0:User:active - Active - active - Active - 2 - - - http://wso2.org/claims/active - - - urn:ietf:params:scim:schemas:core:2.0:User:emails - Emails - mail - Email Addresses - 5 - - ^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$ - http://wso2.org/claims/emailaddress - - - urn:ietf:params:scim:schemas:core:2.0:User:emails.work - Emails - Work Email - workEmail - Work Email - 5 - - ^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$ - http://wso2.org/claims/emails.work - - - urn:ietf:params:scim:schemas:core:2.0:User:emails.home - Emails - Home Email - homeEmail - Home Email - 5 - - ^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$ - http://wso2.org/claims/emails.home - - - urn:ietf:params:scim:schemas:core:2.0:User:emails.other - Emails - Other Email - otherEmail - Other Email - 5 - - ^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$ - http://wso2.org/claims/emails.other - - - urn:ietf:params:scim:schemas:core:2.0:User:phoneNumbers - Phone Numbers - phoneNumbers - Phone Numbers - 5 - - ^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$ - http://wso2.org/claims/phoneNumbers - - - urn:ietf:params:scim:schemas:core:2.0:User:phoneNumbers.mobile - Phone Numbers - Mobile Number - mobile - Mobile Number - 5 - - ^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$ - http://wso2.org/claims/mobile - - - urn:ietf:params:scim:schemas:core:2.0:User:phoneNumbers.home - Phone Numbers - Home Phone Number - homePhone - Home Phone - 5 - - ^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$ - http://wso2.org/claims/phoneNumbers.home - - - urn:ietf:params:scim:schemas:core:2.0:User:phoneNumbers.work - Phone Numbers - Work Phone Number - workPhone - Work Phone - 5 - - ^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$ - http://wso2.org/claims/phoneNumbers.work - - - urn:ietf:params:scim:schemas:core:2.0:User:phoneNumbers.other - Phone Numbers - Other - otherPhoneNumber - Other Phone Number - 5 - - ^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$ - http://wso2.org/claims/phoneNumbers.other - - - urn:ietf:params:scim:schemas:core:2.0:User:ims.gtalk - IM - Gtalk - imGtalk - IM - Gtalk - 5 - - http://wso2.org/claims/gtalk - - - urn:ietf:params:scim:schemas:core:2.0:User:ims.skype - IM - Skype - imSkype - IM - Skype - 5 - - http://wso2.org/claims/skype - - - urn:ietf:params:scim:schemas:core:2.0:User:photos - Photo - photos - Photo - 5 - - http://wso2.org/claims/photos - - - urn:ietf:params:scim:schemas:core:2.0:User:photos.photo - Photo - photoUrl - Photo - 5 - - http://wso2.org/claims/photourl - - - urn:ietf:params:scim:schemas:core:2.0:User:photos.thumbnail - Photo - Thumbnail - thumbnail - Photo - Thumbnail - 5 - - http://wso2.org/claims/thumbnail - - - urn:ietf:params:scim:schemas:core:2.0:User:addresses - Address - addresses - Address - 5 - - http://wso2.org/claims/addresses - - - urn:ietf:params:scim:schemas:core:2.0:User:addresses.home - Address - Home - localityAddress - Address - Home - 5 - - http://wso2.org/claims/addresses.locality - - - urn:ietf:params:scim:schemas:core:2.0:User:addresses.work - Address - Work - region - Address - Work - 5 - - http://wso2.org/claims/region - - - urn:ietf:params:scim:schemas:core:2.0:User:groups - Groups - groups - Groups - 5 - - http://wso2.org/claims/groups - - - urn:ietf:params:scim:schemas:core:2.0:User:entitlements.default - Entitlements - entitlements - Entitlements - 5 - - http://wso2.org/claims/entitlements - - - urn:ietf:params:scim:schemas:core:2.0:User:roles.default - Roles - roles - Roles - 5 - - http://wso2.org/claims/role - - - urn:ietf:params:scim:schemas:core:2.0:User:x509Certificates.default - X509Certificates - x509Certificates - X509Certificates - 5 - - http://wso2.org/claims/x509Certificates - - - - - urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:employeeNumber - Employee Number - extendedExternalId - Employee Number - - 1 - - http://wso2.org/claims/extendedExternalId - - - urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:costCenter - Cost Center - costCenter - Cost Center - - 1 - - http://wso2.org/claims/costCenter - - - urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:organization - Organization -division - organizationName - Organization -division - - 1 - - http://wso2.org/claims/organization - - - urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:department - Organization -department - departmentNumber - Organization -department - - 1 - - http://wso2.org/claims/department - - - urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:division - Manager - home - stateorprovince - Manager - home - - 1 - - http://wso2.org/claims/stateorprovince - - - urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:manager.value - Manager - home - gender - Manager - home - - 1 - - http://wso2.org/claims/gender - - - urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:manager.$ref - Manager - home - extendedRef - Manager - home - - 1 - - http://wso2.org/claims/extendedRef - - - urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:manager.displayName - Manager - Display Name - extendedDisplayName - Manager - Display Name - - 1 - - http://wso2.org/claims/extendedDisplayName - - - urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:askPassword - Ask Password - askPassword - Temporary claim to invoke email ask Password feature - - 1 - - http://wso2.org/claims/identity/askPassword - - - urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:verifyEmail - Verify Email - verifyEmail - Temporary claim to invoke email verified feature - - 1 - - http://wso2.org/claims/identity/verifyEmail - - - - - http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier - Person Identifier - scimId - Person Identifier - - 1 - - http://wso2.org/claims/userid - - - http://eidas.europa.eu/attributes/naturalperson/CurrentFamilyName - Current Family Name - sn - Current Family Name - - 1 - - http://wso2.org/claims/lastname - - - http://eidas.europa.eu/attributes/naturalperson/CurrentGivenName - Current Given Name - givenName - Current Given Name - - 1 - - http://wso2.org/claims/givenname - - - http://eidas.europa.eu/attributes/naturalperson/DateOfBirth - Date of birth - dateOfBirth - Date of birth - - 1 - - http://wso2.org/claims/dob - - - http://eidas.europa.eu/attributes/naturalperson/BirthName - Birth Name - uid - Birth Name - - 1 - - http://wso2.org/claims/username - - - http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth - Place of Birth - country - Place of Birth - - 1 - - http://wso2.org/claims/country - - - http://eidas.europa.eu/attributes/naturalperson/CurrentAddress - Current Address - localityAddress - Current Address - - 1 - - http://wso2.org/claims/addresses - - - http://eidas.europa.eu/attributes/naturalperson/Gender - Gender - gender - Gender - - 1 - - http://wso2.org/claims/gender - - - - - http://eidas.europa.eu/attributes/legalperson/LegalPersonIdentifier - Legal Person Identifier - extendedExternalId - Legal Person Identifier - - 1 - - http://wso2.org/claims/extendedExternalId - - - http://eidas.europa.eu/attributes/legalperson/LegalName - Legal Person Name - extendedDisplayName - Legal Person Name - - 1 - - http://wso2.org/claims/extendedDisplayName - - - http://eidas.europa.eu/attributes/legalperson/LegalPersonAddress - Legal Person Address - localityAddress - Legal Person Address - - 1 - - http://wso2.org/claims/addresses - - - http://eidas.europa.eu/attributes/legalperson/VATRegistrationNumber - VAT Registration Number - im - VAT Registration Number - - 1 - - http://wso2.org/claims/im - - - http://eidas.europa.eu/attributes/legalperson/TaxReference - Tax Reference - postalcode - Tax Reference - - 1 - - http://wso2.org/claims/postalcode - - - http://eidas.europa.eu/attributes/legalperson/D-2012-17-EUIdentifier - EU Identifier - externalId - EU Identifier - - 1 - - http://wso2.org/claims/externalid - - - http://eidas.europa.eu/attributes/legalperson/LEI - LEI - extendedRef - LEI - - 1 - - http://wso2.org/claims/extendedRef - - - http://eidas.europa.eu/attributes/legalperson/EORI - Economic Operator Registration and Identification - departmentNumber - Economic Operator Registration and Identification - - 1 - - http://wso2.org/claims/department - - - http://eidas.europa.eu/attributes/legalperson/SEED - System for Exchange of Excise Data Identifier - nickName - System for Exchange of Excise Data Identifier - - 1 - - http://wso2.org/claims/nickname - - - http://eidas.europa.eu/attributes/legalperson/SIC - Standard Industrial Classification - nickName - Standard Industrial Classification - - 1 - - http://wso2.org/claims/nickname - - - - diff --git a/copper-server/kubernetes/is/is/config/embedded-ldap.xml b/copper-server/kubernetes/is/is/config/embedded-ldap.xml deleted file mode 100755 index 420933fa..00000000 --- a/copper-server/kubernetes/is/is/config/embedded-ldap.xml +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - false - ${Ports.EmbeddedLDAP.LDAPServerPort} - default - admin - . - identityPerson - false - true - false - 2000000 - localhost - ldap/localhost@EXAMPLE.COM - - - - - root - WSO2.ORG - secret - randall - - - - - admin - admin - admin - admin@wso2.com - admin - SHA - - - - - admin - cn - member - - - - - defaultKDC - false - UDP - localhost - ${Ports.EmbeddedLDAP.KDCServerPort} - 8640000 - 604800000 - true - - - diff --git a/copper-server/kubernetes/is/is/config/tenant-mgt.xml b/copper-server/kubernetes/is/is/config/tenant-mgt.xml deleted file mode 100755 index 9d16b72e..00000000 --- a/copper-server/kubernetes/is/is/config/tenant-mgt.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - org.wso2.carbon.user.core.config.multitenancy.SimpleRealmConfigBuilder - - - - - org.wso2.carbon.user.core.config.multitenancy.CommonLDAPRealmConfigBuilder - dc=copper,dc=opensource,dc=lk - organizationalUnit - ou - organizationalUnit - ou - - - diff --git a/copper-server/kubernetes/is/is/config/user-mgt.xml b/copper-server/kubernetes/is/is/config/user-mgt.xml deleted file mode 100755 index 6f62d694..00000000 --- a/copper-server/kubernetes/is/is/config/user-mgt.xml +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - true - admin - - admin - admin - - everyone - true - true - jdbc/WSO2CarbonDB - - - - - - - - - - - - - - org.wso2.carbon.user.core.tenant.CommonHybridLDAPTenantManager - ldap://openldap:389 - cn=admin,dc=copper,dc=opensource,dc=lk - admin - false - ou=Users,dc=copper,dc=opensource,dc=lk - identityPerson - uid - (&(objectClass=person)(uid=?)) - (objectClass=person) - - true - true - ou=Groups,dc=copper,dc=opensource,dc=lk - groupOfNames - cn - (&(objectClass=groupOfNames)(cn=?)) - (objectClass=groupOfNames) - member - false - [a-zA-Z0-9._\-|//]{3,30}$ - ^[\S]{3,30}$ - Username pattern policy violated - ^[\S]{5,30}$ - ^[\S]{5,30}$ - Password length should be within 5 to 30 characters - [a-zA-Z0-9._\-|//]{3,30}$ - ^[\S]{3,30}$ - true - false - true - PLAIN_TEXT - , - 100 - 100 - false - WSO2.ORG - true - false - 5000 - - - - - - /permission - true - false - - - - - diff --git a/copper-server/kubernetes/is/is/files/.gitkeep b/copper-server/kubernetes/is/is/files/.gitkeep deleted file mode 100755 index e69de29b..00000000 diff --git a/copper-server/kubernetes/is/is/files/client-truststore.jks b/copper-server/kubernetes/is/is/files/client-truststore.jks deleted file mode 100644 index cf46c27e65e97197273dd5d6cb62cf78550bb2c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1170 zcmV;D1a12;f&`8N0Ru3C1V;u5Duzgg_YDCD0ic2eI0S+OG%$h$Fff7yECvZGhDe6@ z4FLxRpn?P)FoFab0s#Opf&>x<2`Yw2hW8Bt2LUiC1_~;MNQUqXwtq<$um^^2V2b?N#j8*3;) zUp+Jkzrv0w{(&J+O_WhWK85e(@R{KfuUq(k^DEVjtysYN*dOEiZHp5`XNQk(^VqIg z52N}#@jBbCmOGW}F4%ztaR9>OYo!cFF9BE5Eg^r^^SN?wTa%acFSX<0_$DDS_*j%) z2He{%t!#VznDBxaCdLu=T0)KLWVOzHWy0)144_PXPTV{3|7`>d`XR7Y^Ol#I;o&&9 zav&&OdzQUuHJ4F?EfSf_7PXbX>)UBR%#DDU)8=VI3_@Y>5Q?lg_mP=bLS%k*Po^4- z+IRemU#~Nm?!1u(3`-go5*`(GX`im2DO1^Jx&u_{|HSu&PzDxmBHXCH(aeA@oK1#p z4)2)mVbfxy*s8l%HTf{gnY_bp@BVX~ltsVfwQFn}gSopV;blxb=)WJg6snouc%Bg8 z1JJS}gxF0e+unYKVLHuoY9D>_r5S%{?BBpOyF5Uy@|oTOW&nuGD>NI2o^PbC(+q&5H_U%c#n)9FGt#u)J86BSzRwARQVKnj(I#?J?(|tE1 zL@qf;NV35|ECiOl$xl78W^!6`WcN)XvdAAgpf9|7I{VXePGM0 z4FHg`E<-Gg0>Kc~NvlsqXCl8jm>odmd1GaDX~NJA&VNH)Fo@*Xe2fEj-{h~U)6=WU zic)sc)c9|c3#maST0YAS=}f&a$R-?yD@@FlKYAE%TmWA!o$^~1k622N$Lmi$nHht` zdd(C0Vur6FyVhNQ1h(g_nagqMV<4Qv=C?ADDk2W z?f0!7WTgr(+Teq;=;Fg?RcybR2y?+&PpN?{tkzBF0^)R#lki{un@CJm#n13)&BGZc z`q*%_$74xfh}&N-J0`hq@k3m(6fiz8AutIB1uG5%0vZJX1QbpK@m32NUR@5qwPB{BO^B}gF(6>w*e;`b0`a&Fq4nB zp@0D&h{GYw9-dlUl3J7p6JZx-ch1kr&rQlVZLC7k&AA|`|ISX9}c?wV@LT)zqo(?p8J%3 zR_%Ng$+j#r`+8hByTqqXts}gGp|xxFK1`V0_EssZ&`ik2reI_5otHjO8r)32nwkcj z;Wl>XyO23KeUk0kl-^^{e3d&M-9O&9X!WX}hZ1CN+0H#!@HSzcw`P`BSB9VJ%E_j7 zv(6UWzOqh;ae-Y?+BC_+GOaknD}5b*96#|-`H{hNDBkkb^RIIrz0rBk*1AXN3XkRD z+ja}R<%?V7!rE2#xxFzJQ?}we?;d~mvGvKj{|&BGDswWb);(9W%aVe>1X3VWt}*5BVyN)caqy( zj~cyj`s+2x$FlU3`dfK>g@^?|o=vrwY;_~d(RYvgIfkOHy=Kc++OKvGJgmU7-t~T& zm!i(P>da?Pgmdg?**>#B{cXv;b*ib&9&!P<4*W>coSG@bF1^Y2@7(Ygmrk%go<2w5 zq`=B)m%gmdPGywrW-d4~^@Ncy_PP);RL`~Hfat_{1aXXoZW_)}xn625zyUH3--JWEgn diff --git a/copper-server/kubernetes/is/is/files/wso2carbon.jks b/copper-server/kubernetes/is/is/files/wso2carbon.jks deleted file mode 100644 index 3d1e7792c4e44a412bc2dd2eb64e510a3277ca04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2591 zcmY+EcQ_l27RHl^sL>j=ckGc8mo!ExF>03@wO0hO)vD3*rKzn}QB?#fLWdHRwv<@y zhZ;2-rL?I{32L?1z0bYh_k4ex=bYz#-*cYl{PTn3ScE`81~`uSBZOHY$vA2MERYFE zz%loLam<~k@*6mgG3*}}qZb&*=yobQot8a>^?zGzEI<$e2R?%1!257{2+RNF)8j&5 z?g}drV>!pInY6jFwi)KcNIShOHV^}VVg<&5`z6jVi;g|6d*tY%Rl-%ls%R}8? z(FRc~wY(Jj&l7XqON}*k9uR+3_-RKv&Iy4TIT71b+LIe#38Fqoyc5t?qsQMo;68 zX}u6@Yloat;ir+=pIgTS4iH*RYyL#_B8E3?4^|H0gGNrQ$)D+QoinQjvYwDSUH$Sp zQ^eJWRDdv}nhsu^;!R8yPtERgcerProw?`3g?3aKW>GKL3?{czeAm6M%f|r=Wb#F$4-i81sce;cxi&~VHWq71{ z{SLhCZ&-{OQNsg_tduw`2aKS#;!fpyk#@@7Z(hSx`KvP*NSEbqA1b|SGkz@6vUwk5 zAB7>JWQ*OX7hbafqm>I;5%j$NDS8rXhohxt)7RDn&9Im=X!7hp_i)3mg&4h8s*9IX z5^(h>R_Y@AODBzri$fr_9nodITXxy!HX8*bQjl0*hOQR46_*_6D5v3h8rafe>nK!gvOJN<2% zw5P(t)N+A+{dJW3K1Q8aE7&YXX^*v{r0Uw4gnZit2JE9b{~71JQd;Upv8w={-uKkZ zSx(mb$`Z^Qp%y;>1wO8E{4g5o=++v!By;C%`tm5rrpU~j?dQt?(=+-iiG19QMc6is z`g%TLEi-!3iQk3hx~i4P58o5Kqp%!*jI_$G<8W<8i+Q+f*q`U$)zN31jWTA#w8l>?uU6hx5U5yV z_GoIOki`eL32#4KAf8KeNQ4Ges`a6D+}8w-+nh4PHu4U&t}TvhkB(_46SPcy0xtFU zsTjj0|3W1*w+gQ)Hy|1i4hRAK3xEcA0&W1jPUm1a^zRUl3OAU`78`^SS3#($AvEA> zst6=P?G&O0e}$MJr(8vxN-7{A;It|H?EwElTF8G$yY%WuC>VpI&i5sclEJR3pseDd z|B^Nl$FQ}~_M>K>zF1T1QUvB6bm;Cdk)s|5xoQU-sZSX;nulhC-IHe^Cb?(vO(vpA z@JZPRUYozF?X3B88l{YV46pL8bAd!eBJ#M?zf-?yl3tY?UL&9%i8N4*K2?Un-toF-8GkPQEIw!2Uh4K#`(Psdp5xt}nF*(u^v5XEVA46rV$iR!vhjRFT3n{nV?i`Li8YasRu6(Pcc zCHWm!uTM0V1qr2*=)yRIj~Nclh){~zO^AVC;&`WDN!fK$S#}tCs@l3Se;tEZD{k+U zn|5;ZK|PTT3fY{^lr9#|Rcz*<&iPhN3-rN7QMp}A<~sUJE1xwaM8{Tn~FVembBD0e)atS^ALJS)yO4+O;HBq_|@}+?mRaRZD2S*1 zblEhDhuWq;aSusrso6_CB0gErc|bJb>6!*2o@E;49_A!}NX<`Nc$O?sa*`wm0sETF z%g#@v4(+!@Eru#P_QuJTgioSNC#sV642Of66en)l2%78XiK%bvzd-T-G^|^7I6tOb z!g9`cdbQ<~;oeL-+GX-}vX!6ivTWt}r;@6Rh2LF{eMg)Mt2rgZb^OE!*7&_akG~|< zTJ3hMX+r-9w@K&uC^*os-Ac1DUHu8yfkWZU5Jtsw3?M;90GPX>l{4tR5H^0@vb`$I lGncPd)ie&wJv7Enq=D!wfwz3&Ozo;=Tn{=yAO>I(;oroNwkZGr diff --git a/copper-server/kubernetes/is/is/files/wso2server.sh b/copper-server/kubernetes/is/is/files/wso2server.sh deleted file mode 100755 index 04cf72e1..00000000 --- a/copper-server/kubernetes/is/is/files/wso2server.sh +++ /dev/null @@ -1,319 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Copyright 2005-2012 WSO2, Inc. http://www.wso2.org -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# ---------------------------------------------------------------------------- -# Main Script for the WSO2 Carbon Server -# -# Environment Variable Prequisites -# -# CARBON_HOME Home of WSO2 Carbon installation. If not set I will try -# to figure it out. -# -# JAVA_HOME Must point at your Java Development Kit installation. -# -# JAVA_OPTS (Optional) Java runtime options used when the commands -# is executed. -# -# NOTE: Borrowed generously from Apache Tomcat startup scripts. -# ----------------------------------------------------------------------------- - -# OS specific support. $var _must_ be set to either true or false. -#ulimit -n 100000 - -cygwin=false; -darwin=false; -os400=false; -mingw=false; -case "`uname`" in -CYGWIN*) cygwin=true;; -MINGW*) mingw=true;; -OS400*) os400=true;; -Darwin*) darwin=true - if [ -z "$JAVA_VERSION" ] ; then - JAVA_VERSION="CurrentJDK" - else - echo "Using Java version: $JAVA_VERSION" - fi - if [ -z "$JAVA_HOME" ] ; then - JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/${JAVA_VERSION}/Home - fi - ;; -esac - -# resolve links - $0 may be a softlink -PRG="$0" - -while [ -h "$PRG" ]; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '.*/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`/"$link" - fi -done - -# Get standard environment variables -PRGDIR=`dirname "$PRG"` - -# Only set CARBON_HOME if not already set -[ -z "$CARBON_HOME" ] && CARBON_HOME=`cd "$PRGDIR/.." ; pwd` - -# Set AXIS2_HOME. Needed for One Click JAR Download -AXIS2_HOME="$CARBON_HOME" - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CARBON_HOME" ] && CARBON_HOME=`cygpath --unix "$CARBON_HOME"` - [ -n "$AXIS2_HOME" ] && CARBON_HOME=`cygpath --unix "$CARBON_HOME"` -fi - -# For OS400 -if $os400; then - # Set job priority to standard for interactive (interactive - 6) by using - # the interactive priority - 6, the helper threads that respond to requests - # will be running at the same priority as interactive jobs. - COMMAND='chgjob job('$JOBNAME') runpty(6)' - system $COMMAND - - # Enable multi threading - QIBM_MULTI_THREADED=Y - export QIBM_MULTI_THREADED -fi - -# For Migwn, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$CARBON_HOME" ] && - CARBON_HOME="`(cd "$CARBON_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" - [ -n "$AXIS2_HOME" ] && - CARBON_HOME="`(cd "$CARBON_HOME"; pwd)`" - # TODO classpath? -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD=java - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." - echo " CARBON cannot execute $JAVACMD" - exit 1 -fi - -# if JAVA_HOME is not set we're not happy -if [ -z "$JAVA_HOME" ]; then - echo "You must set the JAVA_HOME variable before running CARBON." - exit 1 -fi - -if [ -e "$CARBON_HOME/wso2carbon.pid" ]; then - PID=`cat "$CARBON_HOME"/wso2carbon.pid` -fi - -# ----- Process the input command ---------------------------------------------- -args="" -for c in $* -do - if [ "$c" = "--debug" ] || [ "$c" = "-debug" ] || [ "$c" = "debug" ]; then - CMD="--debug" - continue - elif [ "$CMD" = "--debug" ]; then - if [ -z "$PORT" ]; then - PORT=$c - fi - elif [ "$c" = "--stop" ] || [ "$c" = "-stop" ] || [ "$c" = "stop" ]; then - CMD="stop" - elif [ "$c" = "--start" ] || [ "$c" = "-start" ] || [ "$c" = "start" ]; then - CMD="start" - elif [ "$c" = "--version" ] || [ "$c" = "-version" ] || [ "$c" = "version" ]; then - CMD="version" - elif [ "$c" = "--restart" ] || [ "$c" = "-restart" ] || [ "$c" = "restart" ]; then - CMD="restart" - elif [ "$c" = "--test" ] || [ "$c" = "-test" ] || [ "$c" = "test" ]; then - CMD="test" - else - args="$args $c" - fi -done - -if [ "$CMD" = "--debug" ]; then - if [ "$PORT" = "" ]; then - echo " Please specify the debug port after the --debug option" - exit 1 - fi - if [ -n "$JAVA_OPTS" ]; then - echo "Warning !!!. User specified JAVA_OPTS will be ignored, once you give the --debug option." - fi - CMD="RUN" - JAVA_OPTS="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=$PORT" - echo "Please start the remote debugging client to continue..." -elif [ "$CMD" = "start" ]; then - if [ -e "$CARBON_HOME/wso2carbon.pid" ]; then - if ps -p $PID > /dev/null ; then - echo "Process is already running" - exit 0 - fi - fi - export CARBON_HOME="$CARBON_HOME" -# using nohup sh to avoid erros in solaris OS.TODO - nohup sh "$CARBON_HOME"/bin/wso2server.sh $args > /dev/null 2>&1 & - exit 0 -elif [ "$CMD" = "stop" ]; then - export CARBON_HOME="$CARBON_HOME" - kill -term `cat "$CARBON_HOME"/wso2carbon.pid` - exit 0 -elif [ "$CMD" = "restart" ]; then - export CARBON_HOME="$CARBON_HOME" - kill -term `cat "$CARBON_HOME"/wso2carbon.pid` - process_status=0 - pid=`cat "$CARBON_HOME"/wso2carbon.pid` - while [ "$process_status" -eq "0" ] - do - sleep 1; - ps -p$pid 2>&1 > /dev/null - process_status=$? - done - -# using nohup sh to avoid erros in solaris OS.TODO - nohup sh "$CARBON_HOME"/bin/wso2server.sh $args > /dev/null 2>&1 & - exit 0 -elif [ "$CMD" = "test" ]; then - JAVACMD="exec "$JAVACMD"" -elif [ "$CMD" = "version" ]; then - cat "$CARBON_HOME"/bin/version.txt - cat "$CARBON_HOME"/bin/wso2carbon-version.txt - exit 0 -fi - -# ---------- Handle the SSL Issue with proper JDK version -------------------- -jdk_17=`$JAVA_HOME/bin/java -version 2>&1 | grep "1.[7|8]"` -if [ "$jdk_17" = "" ]; then - echo " Starting WSO2 Carbon (in unsupported JDK)" - echo " [ERROR] CARBON is supported only on JDK 1.7 and 1.8" -fi - -CARBON_XBOOTCLASSPATH="" -for f in "$CARBON_HOME"/lib/xboot/*.jar -do - if [ "$f" != "$CARBON_HOME/lib/xboot/*.jar" ];then - CARBON_XBOOTCLASSPATH="$CARBON_XBOOTCLASSPATH":$f - fi -done - -JAVA_ENDORSED_DIRS="$CARBON_HOME/lib/endorsed":"$JAVA_HOME/jre/lib/endorsed":"$JAVA_HOME/lib/endorsed" - -CARBON_CLASSPATH="" -if [ -e "$JAVA_HOME/lib/tools.jar" ]; then - CARBON_CLASSPATH="$JAVA_HOME/lib/tools.jar" -fi -for f in "$CARBON_HOME"/bin/*.jar -do - if [ "$f" != "$CARBON_HOME/bin/*.jar" ];then - CARBON_CLASSPATH="$CARBON_CLASSPATH":$f - fi -done -for t in "$CARBON_HOME"/lib/commons-lang*.jar -do - CARBON_CLASSPATH="$CARBON_CLASSPATH":$t -done -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - JAVA_HOME=`cygpath --absolute --windows "$JAVA_HOME"` - CARBON_HOME=`cygpath --absolute --windows "$CARBON_HOME"` - AXIS2_HOME=`cygpath --absolute --windows "$CARBON_HOME"` - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - JAVA_ENDORSED_DIRS=`cygpath --path --windows "$JAVA_ENDORSED_DIRS"` - CARBON_CLASSPATH=`cygpath --path --windows "$CARBON_CLASSPATH"` - CARBON_XBOOTCLASSPATH=`cygpath --path --windows "$CARBON_XBOOTCLASSPATH"` -fi - -# ----- Execute The Requested Command ----------------------------------------- - -echo JAVA_HOME environment variable is set to $JAVA_HOME -echo CARBON_HOME environment variable is set to "$CARBON_HOME" - -cd "$CARBON_HOME" - -TMP_DIR="$CARBON_HOME"/tmp -if [ -d "$TMP_DIR" ]; then -rm -rf "$TMP_DIR"/* -fi - -START_EXIT_STATUS=121 -status=$START_EXIT_STATUS - -if [ -z "$JVM_MEM_OPTS" ]; then - java_version=$("$JAVACMD" -version 2>&1 | awk -F '"' '/version/ {print $2}') - JVM_MEM_OPTS="-Xms2048m -Xmx2048m" - if [ "$java_version" \< "1.8" ]; then - JVM_MEM_OPTS="$JVM_MEM_OPTS -XX:MaxPermSize=256m" - fi -fi -echo "Using Java memory options: $JVM_MEM_OPTS" - -#To monitor a Carbon server in remote JMX mode on linux host machines, set the below system property. -# -Djava.rmi.server.hostname="your.IP.goes.here" - -while [ "$status" = "$START_EXIT_STATUS" ] -do - $JAVACMD \ - -Xbootclasspath/a:"$CARBON_XBOOTCLASSPATH" \ - $JVM_MEM_OPTS \ - -XX:+HeapDumpOnOutOfMemoryError \ - -XX:HeapDumpPath="$CARBON_HOME/repository/logs/heap-dump.hprof" \ - $JAVA_OPTS \ - -Dcom.sun.management.jmxremote \ - -classpath "$CARBON_CLASSPATH" \ - -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" \ - -Djava.io.tmpdir="$CARBON_HOME/tmp" \ - -Dcatalina.base="$CARBON_HOME/lib/tomcat" \ - -Dwso2.server.standalone=true \ - -Dcarbon.registry.root=/ \ - -Djava.command="$JAVACMD" \ - -Dcarbon.home="$CARBON_HOME" \ - -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \ - -Dcarbon.config.dir.path="$CARBON_HOME/repository/conf" \ - -Djava.util.logging.config.file="$CARBON_HOME/repository/conf/etc/logging-bridge.properties" \ - -Dcomponents.repo="$CARBON_HOME/repository/components/plugins" \ - -Dconf.location="$CARBON_HOME/repository/conf"\ - -Dcom.atomikos.icatch.file="$CARBON_HOME/lib/transactions.properties" \ - -Dcom.atomikos.icatch.hide_init_file_path=true \ - -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false \ - -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true \ - -Dcom.sun.jndi.ldap.connect.pool.authentication=simple \ - -Dcom.sun.jndi.ldap.connect.pool.timeout=3000 \ - -Dorg.terracotta.quartz.skipUpdateCheck=true \ - -Djava.security.egd=file:/dev/./urandom \ - -Dfile.encoding=UTF8 \ - -Djava.net.preferIPv4Stack=true \ - -Dcom.ibm.cacheLocalHost=true \ - -DworkerNode=false \ - -Dhttpclient.hostnameVerifier="DefaultAndLocalhost" \ - org.wso2.carbon.bootstrap.Bootstrap $* - status=$? -done diff --git a/copper-server/kubernetes/is/openldap/Dockerfile b/copper-server/kubernetes/is/openldap/Dockerfile deleted file mode 100755 index b4d9b522..00000000 --- a/copper-server/kubernetes/is/openldap/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -# OpenLDAP -# -# VERSION 1.0 - -# use openldap image -FROM osixia/openldap:1.2.2 - -COPY files/* /home/ - diff --git a/copper-server/kubernetes/is/openldap/files/97-wso2Person.ldif b/copper-server/kubernetes/is/openldap/files/97-wso2Person.ldif deleted file mode 100755 index c5f940f6..00000000 --- a/copper-server/kubernetes/is/openldap/files/97-wso2Person.ldif +++ /dev/null @@ -1,70 +0,0 @@ -dn: cn=wso2person,cn=schema,cn=config -objectClass: olcSchemaConfig -cn: wso2person -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.2 - NAME 'gender' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.3 - NAME 'country' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.4 - NAME 'nickName' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.5 - NAME 'timeZone' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.6 - NAME 'dateOfBirth' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.7 - NAME 'role' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.8 - NAME 'im' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.9 - NAME 'url' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.10 - NAME 'otherPhone' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.11 - NAME 'privatePersonalIdentifier' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.12 - NAME 'profileconfiguration' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.13 - NAME 'prefferedLanguage' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcObjectClasses: ( 1.3.6.1.4.1.37505.1.1 - NAME 'wso2Person' - DESC 'wso2Person' - SUP inetOrgPerson - STRUCTURAL - MAY ( gender $ country $ nickName $ timeZone $ dateOfBirth $ role $ im $ url $ otherPhone $ privatePersonalIdentifier $ profileconfiguration $ prefferedLanguage) - ) diff --git a/copper-server/kubernetes/is/openldap/files/98-scimPerson.ldif b/copper-server/kubernetes/is/openldap/files/98-scimPerson.ldif deleted file mode 100755 index e866eae3..00000000 --- a/copper-server/kubernetes/is/openldap/files/98-scimPerson.ldif +++ /dev/null @@ -1,140 +0,0 @@ -dn: cn=scimperson,cn=schema,cn=config -objectClass: olcSchemaConfig -cn: scimperson -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.20 - NAME 'scimId' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.21 - NAME 'externalId' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.22 - NAME 'createdDate' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.23 - NAME 'lastModifiedDate' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.24 - NAME 'location' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.25 - NAME 'formattedName' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.26 - NAME 'middleName' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.27 - NAME 'honoricPrefix' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.28 - NAME 'honoricSuffix' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.29 - NAME 'userType' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.30 - NAME 'local' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.31 - NAME 'active' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.32 - NAME 'workEmail' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.33 - NAME 'homeEmail' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.34 - NAME 'otherEmail' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.35 - NAME 'phoneNumbers' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.36 - NAME 'workPhone' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.37 - NAME 'imGtalk' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.38 - NAME 'imSkype' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.39 - NAME 'photos' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.40 - NAME 'photoUrl' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.41 - NAME 'thumbnail' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.42 - NAME 'addresses' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.43 - NAME 'formattedAddress' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.44 - NAME 'localityAddress' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.45 - NAME 'region' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcObjectClasses: ( 1.3.6.1.4.1.37505.1.100 - NAME 'scimPerson' - DESC 'scimPerson' - SUP wso2Person - STRUCTURAL - MAY ( scimId $ externalId $ createdDate $ lastModifiedDate $ location $ formattedName $ honoricPrefix $ honoricSuffix $ userType $ local $ active $ workEmail $ homeEmail $ otherEmail $ phoneNumbers $ workPhone $ imGtalk $ imSkype $ photos $ photoUrl $ thumbnail $ addresses $ formattedAddress $ localityAddress $ region ) - ) diff --git a/copper-server/kubernetes/is/openldap/files/99-identityPerson.ldif b/copper-server/kubernetes/is/openldap/files/99-identityPerson.ldif deleted file mode 100755 index c3623b98..00000000 --- a/copper-server/kubernetes/is/openldap/files/99-identityPerson.ldif +++ /dev/null @@ -1,85 +0,0 @@ -dn: cn=identityperson,cn=schema,cn=config -objectClass: olcSchemaConfig -cn: identityperson -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.46 - NAME 'primaryChallenges' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.47 - NAME 'challenges' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.48 - NAME 'firstChallenge' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.49 - NAME 'secondChallenge' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.50 - NAME 'oneTimePassword' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.51 - NAME 'accountLock' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.52 - NAME 'temporaryEmail' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.53 - NAME 'recoveryEmail' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.54 - NAME 'passwordChangeRequired' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.55 - NAME 'passwordTimestamp' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.56 - NAME 'temporaryLock' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.57 - NAME 'lastFailedAttemptTime' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.58 - NAME 'failedLoginAttempts' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.59 - NAME 'lastLogonTime' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcAttributeTypes: ( 1.3.6.1.4.1.37505.1.60 - NAME 'unlockTime' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) -olcObjectClasses: ( 1.3.6.1.4.1.37505.1.101 - NAME 'identityPerson' - DESC 'identityPerson' - SUP scimPerson - STRUCTURAL - MAY ( primaryChallenges $ challenges $ firstChallenge $ secondChallenge $ oneTimePassword $ accountLock $ temporaryEmail $ recoveryEmail $ passwordChangeRequired $ passwordTimestamp $ temporaryLock $ lastFailedAttemptTime $ failedLoginAttempts $ lastLogonTime $ unlockTime ) - ) diff --git a/copper-server/kubernetes/is/openldap/files/changes.ldif b/copper-server/kubernetes/is/openldap/files/changes.ldif deleted file mode 100755 index e598c48d..00000000 --- a/copper-server/kubernetes/is/openldap/files/changes.ldif +++ /dev/null @@ -1,6 +0,0 @@ -dn: olcDatabase={1}mdb, cn=config -changetype: modify -replace: olcAccess -olcAccess: {0}to attrs=userPassword by self write by anonymous auth by * none -olcAccess: {1}to attrs=shadowLastChange by self write by * read -olcAccess: {2}to * by self read \ No newline at end of file diff --git a/copper-server/kubernetes/is/openldap/files/copper-users.ldif b/copper-server/kubernetes/is/openldap/files/copper-users.ldif deleted file mode 100755 index 9a2bda2f..00000000 --- a/copper-server/kubernetes/is/openldap/files/copper-users.ldif +++ /dev/null @@ -1,117 +0,0 @@ -# LDIF Export for dc=copper,dc=opensource,dc=lk -# Server: openldap (openldap) -# Search Scope: sub -# Search Filter: (objectClass=*) -# Total Entries: 15 -# -# Generated by phpLDAPadmin (http://phpldapadmin.sourceforge.net) on July 12, 2018 9:02 am -# Version: 1.2.3 - -version: 1 - -# Entry 1: ou=domains,dc=copper,dc=opensource,dc=lk -dn: ou=Domains,dc=copper,dc=opensource,dc=lk -objectclass: organizationalUnit -objectclass: top -ou: Domains - -# Entry 2: dc=copper.opensource.lk,ou=domains,dc=copper,dc=opensource,dc... -dn: dc=copper.opensource.lk,ou=domains,dc=copper,dc=opensource,dc=lk -associateddomain: copper.opensource.lk -dc: copper.opensource.lk -objectclass: dNSDomain -objectclass: domainRelatedObject -objectclass: top - -# Entry 3: ou=groups,dc=copper,dc=opensource,dc=lk -dn: ou=Groups,dc=copper,dc=opensource,dc=lk -objectclass: organizationalUnit -objectclass: top -ou: Groups - -# Entry 4: cn=admin,ou=groups,dc=copper,dc=opensource,dc=lk -dn: cn=admins,ou=Groups,dc=copper,dc=opensource,dc=lk -cn: admins -gidnumber: 500 -objectclass: posixGroup -objectclass: top - -# Entry 5: ou=users,dc=copper,dc=opensource,dc=lk -dn: ou=Users,dc=copper,dc=opensource,dc=lk -objectclass: organizationalUnit -objectclass: top -ou: Users - -# Entry 6: cn=lsf,ou=users,dc=copper,dc=opensource,dc=lk -dn: cn=lsf,ou=Users,dc=copper,dc=opensource,dc=lk -cn: lsf -gidnumber: 501 -givenname: lsf -homedirectory: /home/users/lsf -loginshell: /bin/sh -mail: lsf@copper.opensource.lk -objectclass: inetOrgPerson -objectclass: posixAccount -objectclass: top -sn: lsf -uid: lsf -uidnumber: 1001 -userpassword: {SSHA}79+ggcj1RrXEitcvjVBDgqF6NdJf09Y3 -#userpassword in plain: copper@lsf - -# Entry 7: cn=test,ou=users,dc=copper,dc=opensource,dc=lk -dn: cn=test,ou=Users,dc=copper,dc=opensource,dc=lk -cn: test -gidnumber: 501 -givenname: test -homedirectory: /home/users/test -loginshell: /bin/sh -mail: test@copper.opensource.lk -objectclass: inetOrgPerson -objectclass: posixAccount -objectclass: top -sn: test -uid: test -uidnumber: 1002 -userpassword: {SSHA}79+ggcj1RrXEitcvjVBDgqF6NdJf09Y3 -#userpassword in plain: copper@lsf - -dn: cn=admin_horde,ou=Users,dc=copper,dc=opensource,dc=lk -cn: admin_horde -gidnumber: 500 -givenname: admin_horde -homedirectory: /home/users/admin_horde -loginshell: /bin/sh -mail: admin_horde@copper.opensource.lk -objectclass: inetOrgPerson -objectclass: posixAccount -objectclass: top -sn: admin_horde -uid: admin_horde -uidnumber: 1003 -userpassword: {MD5}ISMvKXpXpadDiUoOSoAfww== -#userpassword in plain: admin - -# Entry 8: cn=s_admin,ou=users,dc=copper,dc=opensource,dc=lk -dn: cn=s_admin,ou=Users,dc=copper,dc=opensource,dc=lk -cn: s_admin -gidnumber: 500 -givenname: s_admin -homedirectory: /home/users/s_admin -loginshell: /bin/sh -mail: s_admin@copper.opensource.lk -objectclass: inetOrgPerson -objectclass: posixAccount -objectclass: top -sn: s_admin -uid: s_admin -uidnumber: 900 -userpassword: {SSHA}79+ggcj1RrXEitcvjVBDgqF6NdJf09Y3 -#userpassword in plain: coppermail@lsf - -# Entry 4.1: cn=users,ou=groups,dc=copper,dc=opensource,dc=lk -dn: cn=users,ou=Groups,dc=copper,dc=opensource,dc=lk -cn: users -gidnumber: 501 -objectclass: posixGroup -objectclass: top \ No newline at end of file diff --git a/copper-server/kubernetes/is/reset.sh b/copper-server/kubernetes/is/reset.sh deleted file mode 100755 index 575a9f1c..00000000 --- a/copper-server/kubernetes/is/reset.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -# remove containers - -docker stop $(docker ps -a -q) -docker rm $(docker ps -a -q) - - -# remove images - -docker rmi copper-is -docker rmi copper-openldap \ No newline at end of file diff --git a/copper-server/kubernetes/is/start.sh b/copper-server/kubernetes/is/start.sh deleted file mode 100755 index cbda9d5c..00000000 --- a/copper-server/kubernetes/is/start.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -docker-compose up --build -d - -# STATUS="0" - -# until [[ ${STATUS} == *"ok"* ]]; do -# echo " wating until slpd is started" -# STATUS=`docker exec -ti copper-openldap sh -c "service slapd status"` -# sleep 5 -# done - -# echo " slapd has started!" - -sleep 20 - -docker exec -it copper-openldap /usr/bin/ldapadd -Y EXTERNAL -H ldapi:// -f /home/97-wso2Person.ldif -docker exec -it copper-openldap /usr/bin/ldapadd -Y EXTERNAL -H ldapi:// -f /home/98-scimPerson.ldif -docker exec -it copper-openldap /usr/bin/ldapadd -Y EXTERNAL -H ldapi:// -f /home/99-identityPerson.ldif - -# docker exec -it copper-openldap /usr/bin/ldapmodify -Y EXTERNAL -H ldapi:// -f /changes.ldif - -docker exec -it copper-openldap /usr/bin/ldapadd -x -D 'cn=admin,dc=copper,dc=opensource,dc=lk' -w admin -H ldapi:// -f /home/copper-users.ldif \ No newline at end of file diff --git a/copper-server/kubernetes/openldap/openldap.yaml b/copper-server/kubernetes/openldap/openldap.yaml index 6c87a78d..aa65e449 100644 --- a/copper-server/kubernetes/openldap/openldap.yaml +++ b/copper-server/kubernetes/openldap/openldap.yaml @@ -10,7 +10,7 @@ items: name: ldap-service spec: type: LoadBalancer - loadBalancerIP: 10.10.10.10 + #loadBalancerIP: 10.10.10.10 #loadBalancerIP: "YOUR.IP.ADDRESS.HERE" #type: ExternalName #externalName: copper.ldap.org diff --git a/copper-server/kubernetes/persistent/mysql-deployment.yaml b/copper-server/kubernetes/persistent/mysql-deployment.yaml index 51845777..d4f9c5e5 100644 --- a/copper-server/kubernetes/persistent/mysql-deployment.yaml +++ b/copper-server/kubernetes/persistent/mysql-deployment.yaml @@ -1,7 +1,15 @@ apiVersion: v1 kind: Service metadata: + namespace: monitoring name: mysql +#spec: +# type: LoadBalancer +# ports: +# - protocol: TCP +# port: 3306 +# targetPort: 3306 +# name: mysql spec: ports: - port: 3306 @@ -12,6 +20,7 @@ spec: apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 kind: Deployment metadata: + namespace: monitoring name: mysql spec: selector: @@ -33,10 +42,18 @@ spec: value: password ports: - containerPort: 3306 + #- containerPort: 36 name: mysql volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql + resources: + limits: + cpu: "1" + #memory: 3Gi + requests: + cpu: 200m + #memory: 2Gi volumes: - name: mysql-persistent-storage persistentVolumeClaim: diff --git a/copper-server/kubernetes/persistent/mysql-pv.yaml b/copper-server/kubernetes/persistent/mysql-pv.yaml index f6cb45ad..d22e834f 100644 --- a/copper-server/kubernetes/persistent/mysql-pv.yaml +++ b/copper-server/kubernetes/persistent/mysql-pv.yaml @@ -1,13 +1,14 @@ kind: PersistentVolume apiVersion: v1 metadata: + namespace: monitoring name: mysql-pv-volume labels: type: local spec: storageClassName: manual capacity: - storage: 20Gi + storage: 2Gi accessModes: - ReadWriteOnce hostPath: @@ -17,10 +18,11 @@ apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pv-claim + namespace: monitoring spec: storageClassName: manual accessModes: - ReadWriteOnce resources: requests: - storage: 5Gi \ No newline at end of file + storage: 1Gi \ No newline at end of file From 7fd1ba4489b06efa475b019c9ce0637c3ee13a5a Mon Sep 17 00:00:00 2001 From: tharangar Date: Tue, 12 Feb 2019 16:00:59 +0530 Subject: [PATCH 3/7] #93 bug fixing --- copper-server/kubernetes/copperclient/webmail.yaml | 5 ++++- copper-server/kubernetes/persistent/mysql-pv.yaml | 6 ++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/copper-server/kubernetes/copperclient/webmail.yaml b/copper-server/kubernetes/copperclient/webmail.yaml index 1322704e..fcb0a01a 100644 --- a/copper-server/kubernetes/copperclient/webmail.yaml +++ b/copper-server/kubernetes/copperclient/webmail.yaml @@ -66,10 +66,13 @@ spec: resources: limits: cpu: "1" - memory: 2Gi + #memory: 2Gi + memory: 1Gi + #memory: 512Mi requests: cpu: 200m memory: 1Gi + #memory: 256Mi #dnsPolicy: ClusterFirst # errors with this version #restartPolicy: Never # errors with this version #resources: diff --git a/copper-server/kubernetes/persistent/mysql-pv.yaml b/copper-server/kubernetes/persistent/mysql-pv.yaml index d22e834f..561e78c3 100644 --- a/copper-server/kubernetes/persistent/mysql-pv.yaml +++ b/copper-server/kubernetes/persistent/mysql-pv.yaml @@ -8,7 +8,8 @@ metadata: spec: storageClassName: manual capacity: - storage: 2Gi + #storage: 2Gi + storage: 1Gi accessModes: - ReadWriteOnce hostPath: @@ -20,7 +21,8 @@ metadata: name: mysql-pv-claim namespace: monitoring spec: - storageClassName: manual + #93 : bellow line was commented due to error : pod has unbound PersistentVolumeClaims + #storageClassName: manual accessModes: - ReadWriteOnce resources: From 731aad15ed43af4674053247a6a68eb412e3a9fe Mon Sep 17 00:00:00 2001 From: tharangar Date: Thu, 14 Feb 2019 13:33:41 +0530 Subject: [PATCH 4/7] #92 --- .../kubernetes/copperclient/Dockerfile | 6 +- ...er.opensource.lk.conf => copper.http.conf} | 18 ++-- .../copperclient/config/copper.https.conf | 13 ++- .../kubernetes/copperclient/config/ports.conf | 1 - .../kubernetes/copperclient/webmail.yaml | 18 ++-- copper-server/kubernetes/deployment/deploy.sh | 9 ++ .../kubernetes/deployment/undeploy.sh | 11 +++ .../{groupwhare => groupware}/horde/.env | 8 +- .../horde/Dockerfile | 48 +++++----- .../horde/apache-horde.conf | 0 .../horde/config/backends.local.php | 4 +- .../horde/config/conf.php | 14 +-- .../horde/config/gollem/conf.php | 0 .../horde/config/imp/conf.php | 0 .../horde/config/ingo/conf.php | 0 .../horde/config/kronolith/conf.php | 0 .../horde/config/mnemo/conf.php | 0 .../horde/config/nag/conf.php | 0 .../horde/config/trean/conf.php | 0 .../horde/config/turba/conf.php | 0 .../horde/horde-base-settings.backup.inc | 0 .../horde/horde-base-settings.inc | 0 .../horde/horde-init.sh | 0 .../kubernetes/groupware/horde/horde.yaml | 88 +++++++++++++++++++ .../horde/proxy_client_ip.php | 0 .../{groupwhare => groupware}/horde/run.sh | 0 26 files changed, 175 insertions(+), 63 deletions(-) rename copper-server/kubernetes/copperclient/config/{copper.opensource.lk.conf => copper.http.conf} (75%) rename copper-server/kubernetes/{groupwhare => groupware}/horde/.env (87%) rename copper-server/kubernetes/{groupwhare => groupware}/horde/Dockerfile (55%) rename copper-server/kubernetes/{groupwhare => groupware}/horde/apache-horde.conf (100%) rename copper-server/kubernetes/{groupwhare => groupware}/horde/config/backends.local.php (99%) rename copper-server/kubernetes/{groupwhare => groupware}/horde/config/conf.php (93%) rename copper-server/kubernetes/{groupwhare => groupware}/horde/config/gollem/conf.php (100%) rename copper-server/kubernetes/{groupwhare => groupware}/horde/config/imp/conf.php (100%) rename copper-server/kubernetes/{groupwhare => groupware}/horde/config/ingo/conf.php (100%) rename copper-server/kubernetes/{groupwhare => groupware}/horde/config/kronolith/conf.php (100%) rename copper-server/kubernetes/{groupwhare => groupware}/horde/config/mnemo/conf.php (100%) rename copper-server/kubernetes/{groupwhare => groupware}/horde/config/nag/conf.php (100%) rename copper-server/kubernetes/{groupwhare => groupware}/horde/config/trean/conf.php (100%) rename copper-server/kubernetes/{groupwhare => groupware}/horde/config/turba/conf.php (100%) rename copper-server/kubernetes/{groupwhare => groupware}/horde/horde-base-settings.backup.inc (100%) rename copper-server/kubernetes/{groupwhare => groupware}/horde/horde-base-settings.inc (100%) rename copper-server/kubernetes/{groupwhare => groupware}/horde/horde-init.sh (100%) create mode 100644 copper-server/kubernetes/groupware/horde/horde.yaml rename copper-server/kubernetes/{groupwhare => groupware}/horde/proxy_client_ip.php (100%) rename copper-server/kubernetes/{groupwhare => groupware}/horde/run.sh (100%) diff --git a/copper-server/kubernetes/copperclient/Dockerfile b/copper-server/kubernetes/copperclient/Dockerfile index 257cdf0f..7f410402 100755 --- a/copper-server/kubernetes/copperclient/Dockerfile +++ b/copper-server/kubernetes/copperclient/Dockerfile @@ -60,7 +60,7 @@ ENV APACHE_RUN_GROUP www-data # Expose to letsencript key generation ACME test -EXPOSE 80 +#EXPOSE 80 # Expose for non secured access (without https) for testing perposes EXPOSE 89 # primary https port @@ -149,8 +149,10 @@ RUN certbot-auto \ #RUN cp ./tls/privkey.pem /etc/ssl/private/copper.opensource.lk.privkey.pem # this for copper live server -ADD ./config/copper.opensource.lk.conf /etc/apache2/sites-enabled/copper.opensource.lk.conf +ADD ./config/copper.http.conf /etc/apache2/sites-enabled/copper.http.conf ADD ./config/copper.https.conf /etc/apache2/sites-enabled/copper.https.conf +# coppies port configuration +ADD ./config/ports.conf /etc/apache2/ports.conf # adding ports.conf file to the image ADD ./config/ports.conf /etc/apache2/ diff --git a/copper-server/kubernetes/copperclient/config/copper.opensource.lk.conf b/copper-server/kubernetes/copperclient/config/copper.http.conf similarity index 75% rename from copper-server/kubernetes/copperclient/config/copper.opensource.lk.conf rename to copper-server/kubernetes/copperclient/config/copper.http.conf index 91a38311..5de42a9a 100755 --- a/copper-server/kubernetes/copperclient/config/copper.opensource.lk.conf +++ b/copper-server/kubernetes/copperclient/config/copper.http.conf @@ -1,5 +1,5 @@ - - + + ServerName copper.opensource.lk ServerAdmin admin@copper.opensource.lk DocumentRoot /var/www/html/site @@ -11,11 +11,13 @@ Allow from all - SSLEngine on - SSLCertificateFile /etc/ssl/certs/cert.pem - SSLCertificateKeyFile /etc/ssl/private/privkey.pem - #SSLCertificateChainFile /etc/ssl/fullchain.pem - + #SSLEngine on + #SSLCertificateFile /etc/ssl/certs/copper.opensource.lk.crt + #SSLCertificateKeyFile /etc/ssl/private/copper.opensource.lk.key + #SSLCertificateFile /etc/ssl/certs/cert.pem + #SSLCertificateKeyFile /etc/ssl/private/privkey.pem + + #SSLEngine on # A self-signed (snakeoil) certificate can be created by installing @@ -30,4 +32,4 @@ CustomLog ${APACHE_LOG_DIR}/access.log combined - \ No newline at end of file + diff --git a/copper-server/kubernetes/copperclient/config/copper.https.conf b/copper-server/kubernetes/copperclient/config/copper.https.conf index d82e9164..cdf7474e 100755 --- a/copper-server/kubernetes/copperclient/config/copper.https.conf +++ b/copper-server/kubernetes/copperclient/config/copper.https.conf @@ -1,5 +1,6 @@ + - + ServerName copper.opensource.lk ServerAdmin admin@copper.opensource.lk DocumentRoot /var/www/html/site @@ -12,12 +13,10 @@ SSLEngine on - SSLCertificateFile /etc/ssl/certs/copper.opensource.lk.crt - SSLCertificateKeyFile /etc/ssl/private/copper.opensource.lk.key - #SSLCertificateFile /etc/ssl/certs/cert.pem - #SSLCertificateKeyFile /etc/ssl/private/privkey.pem - - + SSLCertificateFile /etc/ssl/certs/cert.pem + SSLCertificateKeyFile /etc/ssl/private/privkey.pem + #SSLCertificateChainFile /etc/ssl/fullchain.pem + #SSLEngine on # A self-signed (snakeoil) certificate can be created by installing diff --git a/copper-server/kubernetes/copperclient/config/ports.conf b/copper-server/kubernetes/copperclient/config/ports.conf index 9025f138..0a9fd928 100644 --- a/copper-server/kubernetes/copperclient/config/ports.conf +++ b/copper-server/kubernetes/copperclient/config/ports.conf @@ -3,7 +3,6 @@ # /etc/apache2/sites-enabled/000-default.conf Listen 89 -Listen 80 Listen 433 diff --git a/copper-server/kubernetes/copperclient/webmail.yaml b/copper-server/kubernetes/copperclient/webmail.yaml index fcb0a01a..07f635e9 100644 --- a/copper-server/kubernetes/copperclient/webmail.yaml +++ b/copper-server/kubernetes/copperclient/webmail.yaml @@ -10,10 +10,10 @@ spec: ports: #- protocol: "TCP" # port: 443 - - protocol: TCP - port: 80 - targetPort: 80 - name: http + #- protocol: TCP + # port: 80 + # targetPort: 80 + # name: http - protocol: TCP port: 443 targetPort: 443 @@ -21,7 +21,7 @@ spec: - protocol: TCP port: 433 targetPort: 433 - name: httpse + name: http #- protocol: TCP # port: 587 # targetPort: 587 @@ -53,14 +53,14 @@ spec: image: webmail imagePullPolicy: Never ports: - - name: http - containerPort: 80 + #- name: http + #containerPort: 80 - name: https containerPort: 443 - name: httpse containerPort: 433 - - name: submission - containerPort: 587 + #- name: submission + # containerPort: 587 - name: health containerPort: 81 resources: diff --git a/copper-server/kubernetes/deployment/deploy.sh b/copper-server/kubernetes/deployment/deploy.sh index 38402e98..146000dc 100644 --- a/copper-server/kubernetes/deployment/deploy.sh +++ b/copper-server/kubernetes/deployment/deploy.sh @@ -201,13 +201,16 @@ cd .. #Buld the kubernetes pod Kubectl create -f copperclient/webmail.yaml 2> /dev/null || true echoGreenBold 'Docker webclient service created...' + #Prometheus implementation # Creating a roll has the access for clusters and bind the cluster roll. kubectl create -f prometheus-alert/clusterRole.yaml 2> /dev/null || true echoGreenBold 'Role creation and Role binding...' + # Create the config map to keep configuration data of prometheus kubectl create -f prometheus-alert/config-map.yaml -n monitoring 2> /dev/null || true echoGreenBold 'Prometheus configuration created...' + # Deploy prometheus pods kubectl create -f prometheus-alert/prometheus-deployment.yaml --namespace=monitoring 2> /dev/null || true @@ -226,6 +229,12 @@ kubectl create -f prometheus-alert/Deployment.yaml 2> /dev/null || true kubectl create -f prometheus-alert/Service.yaml 2> /dev/null || true echoGreenBold 'Alert Manager created...' +# horde deployment +cd ./groupware/horde +docker build -t horde . 2> /dev/null || true +cd .. +cd .. +kubectl create -f groupware/horde/horde.yaml 2> /dev/null || true # wait 1 seconds sleep 1s diff --git a/copper-server/kubernetes/deployment/undeploy.sh b/copper-server/kubernetes/deployment/undeploy.sh index aecfc244..74fae066 100644 --- a/copper-server/kubernetes/deployment/undeploy.sh +++ b/copper-server/kubernetes/deployment/undeploy.sh @@ -103,17 +103,21 @@ case "$response" in kubectl delete service ldap-service --namespace=monitoring 2> /dev/null || true kubectl delete deployment ldap --namespace=monitoring 2> /dev/null || true echoRedBold 'Ldap service deleted...' + # Then if you want to delete services created by above command kubectl delete service phpldapadmin-service --namespace=monitoring 2> /dev/null || true kubectl delete replicationcontrollers phpldapadmin-controller --namespace=monitoring 2> /dev/null || true echoRedBold 'phpldapadmin service deleted...' + # If you want to delete emai service use following commands. kubectl delete service email --namespace=monitoring 2> /dev/null || true kubectl delete deployment email --namespace=monitoring 2> /dev/null || true echoRedBold 'Email service deleted...' + # If you want to delete webmail service use following commands. kubectl delete service webmail --namespace=monitoring 2> /dev/null || true kubectl delete deployment webmail --namespace=monitoring 2> /dev/null || true +docker rmi webmail 2> /dev/null || true echoRedBold 'Webmail service deleted...' @@ -121,20 +125,27 @@ echoRedBold 'Webmail service deleted...' kubectl delete services alertmanager --namespace=monitoring 2> /dev/null || true kubectl delete services prometheus-service --namespace=monitoring 2> /dev/null || true echoRedBold 'Alert service deleted...' + #deleting configmaps kubectl delete configmap alertmanager-config --namespace=monitoring 2> /dev/null || true kubectl delete configmap alertmanager-templates --namespace=monitoring 2> /dev/null || true kubectl delete configmap prometheus-server-conf --namespace=monitoring 2> /dev/null || true echoRedBold 'Alert configuration deleted...' + #deleting cluster roll kubectl delete clusterroles prometheus 2> /dev/null || true kubectl delete clusterrolebindings prometheus 2> /dev/null || true echoRedBold 'Prometheus Role deleted...' + #deleting deployments kubectl delete deployment alertmanager --namespace=monitoring 2> /dev/null || true kubectl delete deployment prometheus-deployment --namespace=monitoring 2> /dev/null || true echoRedBold 'Prometheus deployment deleted...' +# deleting horde +kubectl delete service horde -n monitoring 2> /dev/null || true +kubectl delete deployment horde -n monitoring 2> /dev/null || true +docker rmi horde 2> /dev/null || true ## deleting namespace kubectl delete namespace monitoring 2> /dev/null || true diff --git a/copper-server/kubernetes/groupwhare/horde/.env b/copper-server/kubernetes/groupware/horde/.env similarity index 87% rename from copper-server/kubernetes/groupwhare/horde/.env rename to copper-server/kubernetes/groupware/horde/.env index 5ae8f895..a5126404 100644 --- a/copper-server/kubernetes/groupwhare/horde/.env +++ b/copper-server/kubernetes/groupware/horde/.env @@ -7,7 +7,7 @@ # Copper Group wher configuration ########################################################################## # admin email account -EMAIL=admin@copper.opensource.lk +EMAIL=support@copper.opensource.lk # mail server name with FQDN @@ -20,9 +20,9 @@ DOMAIN=copper.opensource.lk DEBUG=true -DB_USER=horde -DB_PASSWORD=horde -DB_HOST=172.19.0.19 +DB_USER=root +DB_PASSWORD=password +DB_HOST=mysql diff --git a/copper-server/kubernetes/groupwhare/horde/Dockerfile b/copper-server/kubernetes/groupware/horde/Dockerfile similarity index 55% rename from copper-server/kubernetes/groupwhare/horde/Dockerfile rename to copper-server/kubernetes/groupware/horde/Dockerfile index 46743670..bd30a109 100755 --- a/copper-server/kubernetes/groupwhare/horde/Dockerfile +++ b/copper-server/kubernetes/groupware/horde/Dockerfile @@ -43,47 +43,49 @@ RUN chown www-data:www-data /etc/horde/imp/conf.php /etc/horde/turba/conf.php # Add other configurations also #ADD ./webmail/horde-webmail/config/conf.php /usr/share/horde/config/conf.php -ADD ./config/conf.php /usr/share/horde/config/conf.php -RUN chown www-data:www-data /usr/share/horde/config/conf.php + #ADD ./config/conf.php /usr/share/horde/config/conf.php + #RUN chown www-data:www-data /usr/share/horde/config/conf.php # coppying ingo mail Filter application -ADD ./config/ingo/conf.php /usr/share/horde/ingo/config/conf.php -RUN chown www-data:www-data /usr/share/horde/ingo/config/conf.php + #ADD ./config/ingo/conf.php /usr/share/horde/ingo/config/conf.php + #RUN chown www-data:www-data /usr/share/horde/ingo/config/conf.php # configuration file hosting solution -ADD ./config/gollem/conf.php /usr/share/horde/gollem/config/conf.php -RUN chown www-data:www-data /usr/share/horde/gollem/config/conf.php + #ADD ./config/gollem/conf.php /usr/share/horde/gollem/config/conf.php + #RUN chown www-data:www-data /usr/share/horde/gollem/config/conf.php # Configuring turba contact mangement -ADD ./config/turba/conf.php /usr/share/horde/turba/config/conf.php -RUN chown www-data:www-data /usr/share/horde/turba/config/conf.php + #ADD ./config/turba/conf.php /usr/share/horde/turba/config/conf.php + #RUN chown www-data:www-data /usr/share/horde/turba/config/conf.php # Configuring Todo/Reminder plugin -ADD ./config/nag/conf.php /usr/share/horde/nag/config/conf.php -RUN chown www-data:www-data /usr/share/horde/nag/config/conf.php + #ADD ./config/nag/conf.php /usr/share/horde/nag/config/conf.php + #RUN chown www-data:www-data /usr/share/horde/nag/config/conf.php # Configure Kronolith calender -ADD ./config/kronolith/conf.php /usr/share/horde/kronolith/config/conf.php -RUN chown www-data:www-data /usr/share/horde/kronolith/config/conf.php + #ADD ./config/kronolith/conf.php /usr/share/horde/kronolith/config/conf.php + #RUN chown www-data:www-data /usr/share/horde/kronolith/config/conf.php # Configure mnemo Notebook -ADD ./config/mnemo/conf.php /usr/share/horde/mnemo/config/conf.php -RUN chown www-data:www-data /usr/share/horde/mnemo/config/conf.php + #ADD ./config/mnemo/conf.php /usr/share/horde/mnemo/config/conf.php + #RUN chown www-data:www-data /usr/share/horde/mnemo/config/conf.php # Configure imp webmail -ADD ./config/imp/conf.php /usr/share/horde/imp/config/conf.php -RUN chown www-data:www-data /usr/share/horde/imp/config/conf.php + #ADD ./config/imp/conf.php /usr/share/horde/imp/config/conf.php + #RUN chown www-data:www-data /usr/share/horde/imp/config/conf.php # Configure trean web book mark -ADD ./config/trean/conf.php /usr/share/horde/trean/config/conf.php -RUN chown www-data:www-data /usr/share/horde/trean/config/conf.php + #ADD ./config/trean/conf.php /usr/share/horde/trean/config/conf.php + #RUN chown www-data:www-data /usr/share/horde/trean/config/conf.php -RUN chown www-data:www-data /etc/horde/imp/conf.php /etc/horde/turba/conf.php -RUN chown www-data:www-data /etc/horde/imp/conf.php /etc/horde/turba/conf.php -RUN chown www-data:www-data /etc/horde/imp/conf.php /etc/horde/turba/conf.php + #RUN chown www-data:www-data /etc/horde/imp/conf.php /etc/horde/turba/conf.php + #RUN chown www-data:www-data /etc/horde/imp/conf.php /etc/horde/turba/conf.php + #RUN chown www-data:www-data /etc/horde/imp/conf.php /etc/horde/turba/conf.php # coppying conf.php for horde active directory -ADD ./config/conf.php /etc/horde/horde/conf.php -ADD ./config/backends.local.php /etc/horde/imp/backends.local.php + #ADD ./config/conf.php /etc/horde/horde/conf.php + #ADD ./config/backends.local.php /etc/horde/imp/backends.local.php #ADD ./webmail/horde-webmail/config/conf.php /usr/share/horde/config/conf.php #RUN chown www-data:www-data /usr/share/horde/config/conf.php +ADD ./apache-horde.conf /etc/apache2/sites-enabled/apache-horde.conf + ADD ./horde-init.sh /etc/my_init.d/horde-init.sh RUN chmod +x /etc/my_init.d/horde-init.sh diff --git a/copper-server/kubernetes/groupwhare/horde/apache-horde.conf b/copper-server/kubernetes/groupware/horde/apache-horde.conf similarity index 100% rename from copper-server/kubernetes/groupwhare/horde/apache-horde.conf rename to copper-server/kubernetes/groupware/horde/apache-horde.conf diff --git a/copper-server/kubernetes/groupwhare/horde/config/backends.local.php b/copper-server/kubernetes/groupware/horde/config/backends.local.php similarity index 99% rename from copper-server/kubernetes/groupwhare/horde/config/backends.local.php rename to copper-server/kubernetes/groupware/horde/config/backends.local.php index 9c25ac02..487b18ed 100644 --- a/copper-server/kubernetes/groupwhare/horde/config/backends.local.php +++ b/copper-server/kubernetes/groupware/horde/config/backends.local.php @@ -357,8 +357,8 @@ $servers['imap'] = array( // ENABLED by default; will connect to IMAP port on local server 'disabled' => false, - 'name' => 'mail.coppermail.dyndns.org', - 'hostspec' => '172.19.0.17', + 'name' => 'copper.opensource.lk', + 'hostspec' => 'email', 'hordeauth' => false, 'protocol' => 'imap', 'port' => 143, diff --git a/copper-server/kubernetes/groupwhare/horde/config/conf.php b/copper-server/kubernetes/groupware/horde/config/conf.php similarity index 93% rename from copper-server/kubernetes/groupwhare/horde/config/conf.php rename to copper-server/kubernetes/groupware/horde/config/conf.php index f607d477..57706b8b 100644 --- a/copper-server/kubernetes/groupwhare/horde/config/conf.php +++ b/copper-server/kubernetes/groupware/horde/config/conf.php @@ -4,7 +4,7 @@ $conf['vhosts'] = false; $conf['debug_level'] = E_ALL & ~E_NOTICE; $conf['max_exec_time'] = 0; -$conf['compress_pages'] = true; +$conf['compress_pages'] = false; $conf['secret_key'] = 'JznDZwbebxhwvRCiRD9pBuP'; $conf['umask'] = 077; $conf['testdisable'] = false; @@ -19,11 +19,11 @@ $conf['session']['timeout'] = 0; $conf['session']['cache_limiter'] = 'nocache'; $conf['session']['max_time'] = 72000; -$conf['cookie']['domain'] = coppermail.opensource.lk; +$conf['cookie']['domain'] = ''; $conf['cookie']['path'] = '/'; -$conf['sql']['username'] = 'horde'; -$conf['sql']['password'] = 'horde'; -$conf['sql']['hostspec'] = '172.19.0.19'; +$conf['sql']['username'] = 'root'; +$conf['sql']['password'] = 'password'; +$conf['sql']['hostspec'] = 'mysql'; $conf['sql']['port'] = 3306; $conf['sql']['protocol'] = 'tcp'; $conf['sql']['database'] = 'horde'; @@ -34,7 +34,7 @@ $conf['sql']['phptype'] = 'mysqli'; $conf['nosql']['phptype'] = false; $conf['ldap']['useldap'] = false; -$conf['auth']['admins'] = array('admin_horde@coppermail.dyndns.org'); +$conf['auth']['admins'] = array('support@copper.opensource.lk'); $conf['auth']['checkip'] = true; $conf['auth']['checkbrowser'] = true; $conf['auth']['resetpassword'] = true; @@ -108,7 +108,7 @@ $conf['image']['driver'] = false; $conf['exif']['driver'] = 'Bundled'; $conf['timezone']['location'] = 'ftp://ftp.iana.org/tz/tzdata-latest.tar.gz'; -$conf['problems']['email'] = 'webmaster@example.com'; +$conf['problems']['email'] = 'support@copper.opensource.lk'; $conf['problems']['maildomain'] = 'example.com'; $conf['problems']['tickets'] = false; $conf['problems']['attachments'] = true; diff --git a/copper-server/kubernetes/groupwhare/horde/config/gollem/conf.php b/copper-server/kubernetes/groupware/horde/config/gollem/conf.php similarity index 100% rename from copper-server/kubernetes/groupwhare/horde/config/gollem/conf.php rename to copper-server/kubernetes/groupware/horde/config/gollem/conf.php diff --git a/copper-server/kubernetes/groupwhare/horde/config/imp/conf.php b/copper-server/kubernetes/groupware/horde/config/imp/conf.php similarity index 100% rename from copper-server/kubernetes/groupwhare/horde/config/imp/conf.php rename to copper-server/kubernetes/groupware/horde/config/imp/conf.php diff --git a/copper-server/kubernetes/groupwhare/horde/config/ingo/conf.php b/copper-server/kubernetes/groupware/horde/config/ingo/conf.php similarity index 100% rename from copper-server/kubernetes/groupwhare/horde/config/ingo/conf.php rename to copper-server/kubernetes/groupware/horde/config/ingo/conf.php diff --git a/copper-server/kubernetes/groupwhare/horde/config/kronolith/conf.php b/copper-server/kubernetes/groupware/horde/config/kronolith/conf.php similarity index 100% rename from copper-server/kubernetes/groupwhare/horde/config/kronolith/conf.php rename to copper-server/kubernetes/groupware/horde/config/kronolith/conf.php diff --git a/copper-server/kubernetes/groupwhare/horde/config/mnemo/conf.php b/copper-server/kubernetes/groupware/horde/config/mnemo/conf.php similarity index 100% rename from copper-server/kubernetes/groupwhare/horde/config/mnemo/conf.php rename to copper-server/kubernetes/groupware/horde/config/mnemo/conf.php diff --git a/copper-server/kubernetes/groupwhare/horde/config/nag/conf.php b/copper-server/kubernetes/groupware/horde/config/nag/conf.php similarity index 100% rename from copper-server/kubernetes/groupwhare/horde/config/nag/conf.php rename to copper-server/kubernetes/groupware/horde/config/nag/conf.php diff --git a/copper-server/kubernetes/groupwhare/horde/config/trean/conf.php b/copper-server/kubernetes/groupware/horde/config/trean/conf.php similarity index 100% rename from copper-server/kubernetes/groupwhare/horde/config/trean/conf.php rename to copper-server/kubernetes/groupware/horde/config/trean/conf.php diff --git a/copper-server/kubernetes/groupwhare/horde/config/turba/conf.php b/copper-server/kubernetes/groupware/horde/config/turba/conf.php similarity index 100% rename from copper-server/kubernetes/groupwhare/horde/config/turba/conf.php rename to copper-server/kubernetes/groupware/horde/config/turba/conf.php diff --git a/copper-server/kubernetes/groupwhare/horde/horde-base-settings.backup.inc b/copper-server/kubernetes/groupware/horde/horde-base-settings.backup.inc similarity index 100% rename from copper-server/kubernetes/groupwhare/horde/horde-base-settings.backup.inc rename to copper-server/kubernetes/groupware/horde/horde-base-settings.backup.inc diff --git a/copper-server/kubernetes/groupwhare/horde/horde-base-settings.inc b/copper-server/kubernetes/groupware/horde/horde-base-settings.inc similarity index 100% rename from copper-server/kubernetes/groupwhare/horde/horde-base-settings.inc rename to copper-server/kubernetes/groupware/horde/horde-base-settings.inc diff --git a/copper-server/kubernetes/groupwhare/horde/horde-init.sh b/copper-server/kubernetes/groupware/horde/horde-init.sh similarity index 100% rename from copper-server/kubernetes/groupwhare/horde/horde-init.sh rename to copper-server/kubernetes/groupware/horde/horde-init.sh diff --git a/copper-server/kubernetes/groupware/horde/horde.yaml b/copper-server/kubernetes/groupware/horde/horde.yaml new file mode 100644 index 00000000..94e69f0e --- /dev/null +++ b/copper-server/kubernetes/groupware/horde/horde.yaml @@ -0,0 +1,88 @@ +kind: Service +apiVersion: v1 +metadata: + name: horde + namespace: monitoring +spec: + type: LoadBalancer + selector: + app: horde + ports: + #- protocol: "TCP" + # port: 443 + - protocol: TCP + port: 80 + targetPort: 80 + name: http + #- protocol: TCP + # port: 433 + # targetPort: 433 + # name: http + #- protocol: TCP + # port: 587 + # targetPort: 587 + # name: submission + # port: 433 + # targetPort: 433 + #targetPort: http + #clusterIP: None + #name: webmail + #nodePort: 30080 + #type: NodePort +--- +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: horde + namespace: monitoring +spec: + replicas: 1 + template: + metadata: + labels: + app: horde + track: stable + spec: + containers: + - name: horde + #image: "udacity/example-auth:1.0.0" + image: horde + imagePullPolicy: Never + ports: + - name: http + containerPort: 80 + #- name: submission + # containerPort: 587 + - name: health + containerPort: 81 + resources: + limits: + cpu: "1" + #memory: 2Gi + #memory: 1Gi # once we remove memory limits it can grown untill host permits. + #memory: 512Mi + requests: + cpu: 200m + #memory: 1Gi # 1Gi is not enough for horde + #memory: 256Mi + #dnsPolicy: ClusterFirst # errors with this version + #restartPolicy: Never # errors with this version + #resources: + # limits: + # cpu: 0.9 + # memory: "5500Mi" + #livenessProbe: + # httpGet: + # path: /healthz + # port: 81 + # scheme: HTTP + # initialDelaySeconds: 5 + # periodSeconds: 15 + # timeoutSeconds: 5 + #readinessProbe: + # httpGet: + # path: /readiness + # port: 81 + # scheme: HTTP + # initialDelaySeconds: 5 + # timeoutSeconds: 1 \ No newline at end of file diff --git a/copper-server/kubernetes/groupwhare/horde/proxy_client_ip.php b/copper-server/kubernetes/groupware/horde/proxy_client_ip.php similarity index 100% rename from copper-server/kubernetes/groupwhare/horde/proxy_client_ip.php rename to copper-server/kubernetes/groupware/horde/proxy_client_ip.php diff --git a/copper-server/kubernetes/groupwhare/horde/run.sh b/copper-server/kubernetes/groupware/horde/run.sh similarity index 100% rename from copper-server/kubernetes/groupwhare/horde/run.sh rename to copper-server/kubernetes/groupware/horde/run.sh From 893631408cc54d84a00183d77dd60e57ec84b463 Mon Sep 17 00:00:00 2001 From: tharangar Date: Mon, 18 Feb 2019 17:16:44 +0530 Subject: [PATCH 5/7] Horde compoeted --- .../kubernetes/emailserver/email.yaml | 14 +- copper-server/kubernetes/groupware/horde/.env | 17 +- .../kubernetes/groupware/horde/Dockerfile | 82 +++++---- .../groupware/horde/Dockerfile-anushka | 55 ++++++ .../groupware/horde/config/conf.php | 173 ++++++++++++++++-- .../groupware/horde/config/ingo/conf.php | 4 +- .../groupware/horde/config/trean/conf.php | 1 + .../horde/horde-base-settings.backup.inc | 2 +- .../groupware/horde/horde-base-settings.inc | 6 +- .../kubernetes/groupware/horde/horde-init.sh | 25 ++- .../kubernetes/groupware/horde/horde.yaml | 4 +- 11 files changed, 307 insertions(+), 76 deletions(-) create mode 100755 copper-server/kubernetes/groupware/horde/Dockerfile-anushka diff --git a/copper-server/kubernetes/emailserver/email.yaml b/copper-server/kubernetes/emailserver/email.yaml index 46ca9b35..d8f29ebc 100755 --- a/copper-server/kubernetes/emailserver/email.yaml +++ b/copper-server/kubernetes/emailserver/email.yaml @@ -54,13 +54,13 @@ spec: #image: "udacity/example-auth:1.0.0" image: "emailserver" imagePullPolicy: Never - ports: - - name: tcp - containerPort: 25 - - name: submission - containerPort: 587 - - name: health - containerPort: 25 + #ports: + # - name: tcp + # containerPort: 25 + # - name: submission + # containerPort: 587 + # - name: health + # containerPort: 25 resources: limits: cpu: 0.5 diff --git a/copper-server/kubernetes/groupware/horde/.env b/copper-server/kubernetes/groupware/horde/.env index a5126404..fa1b2158 100644 --- a/copper-server/kubernetes/groupware/horde/.env +++ b/copper-server/kubernetes/groupware/horde/.env @@ -16,14 +16,23 @@ FQDN=mail.copper.opensource.lk # Domain name DOMAIN=copper.opensource.lk -# Debug option -DEBUG=true +# root account +MYSQL_ENV_MYSQL_ROOT_USERNAME=horde +MYSQL_ENV_MYSQL_ROOT_PASSWORD=horde +DB_NAME=horde DB_USER=root -DB_PASSWORD=password +DB_PASS=password +#ENV DB_PROTOCOL unix +#ENV DB_PROTOCOL tcp +DB_PROTOCOL=TCP DB_HOST=mysql - +MYSQL_PORT_3306_TCP_ADDR=mysql +MYSQL_PORT_3306_TCP_PORT=3306 +DB_PORT=3306 +DB_DRIVER=mysqli +HORDE_TEST_DISABLE=false diff --git a/copper-server/kubernetes/groupware/horde/Dockerfile b/copper-server/kubernetes/groupware/horde/Dockerfile index bd30a109..fa1021a0 100755 --- a/copper-server/kubernetes/groupware/horde/Dockerfile +++ b/copper-server/kubernetes/groupware/horde/Dockerfile @@ -4,34 +4,35 @@ LABEL KEY=LSF-COPPER-HORDE #ENV HOME /root -# root account -ENV MYSQL_ENV_MYSQL_ROOT_USERNAME horde -ENV MYSQL_ENV_MYSQL_ROOT_PASSWORD horde - -ENV DB_NAME horde -ENV DB_USER horde -ENV DB_PASS horde -#ENV DB_PROTOCOL unix -#ENV DB_PROTOCOL tcp -ENV DB_PROTOCOL TCP -ENV DB_HOST 172.19.0.19 -ENV MYSQL_PORT_3306_TCP_ADDR 172.19.0.19 -ENV MYSQL_PORT_3306_TCP_PORT 3306 -ENV DB_PORT 3306 -ENV DB_DRIVER mysqli -ENV HORDE_TEST_DISABLE true - -RUN apt-get update + + +RUN apt-get -y update +RUN apt-get -y upgrade RUN apt-get -y install telnet RUN apt-get -y install nano +# installing php7 in ubuntu 18.04 + +# installing php +RUN apt-get -y install php + + RUN apt-get -y install apache2 libapache2-mod-php mysql-client gnupg2 openssl php-pear +# install php 7.2 modules +RUN apt-get -y install php-pear php-fpm php-dev php-zip php-curl php-xmlrpc php-gd php-mysql php-mbstring php-xml libapache2-mod-php + # https://www.ctrl.blog/entry/how-to-debian-horde-webmail +# https://www.ctrl.blog/entry/how-to-debian-horde-webmail +# how to connect with ldap srver samba active directory # https://community.nethserver.org/t/installing-horde-groupware/7292 +# php installation +# https://thishosting.rocks/install-php-on-ubuntu/ #RUN apt-get install -y php-horde-webmail mysql-client #RUN apt-get -y install php-horde RUN apt-get -y install php-horde-webmail +#RUN apt-get install php-pecl-imagick aspell-en +#RUN apt-get install php-horde-horde php-pecl-imagick aspell-en RUN mkdir /var/lib/horde/ RUN chown www-data:www-data /var/lib/horde/ @@ -39,36 +40,37 @@ RUN cp /etc/horde/horde/conf.php.dist /etc/horde/horde/conf.php RUN chown www-data:www-data /etc/horde/horde/conf.php RUN touch /etc/horde/imp/conf.php /etc/horde/turba/conf.php RUN chown www-data:www-data /etc/horde/imp/conf.php /etc/horde/turba/conf.php -#RUN cp /etc/horde/imp/backends.php /etc/horde/imp/backends.local.php +RUN cp /etc/horde/imp/backends.php /etc/horde/imp/backends.local.php # Add other configurations also #ADD ./webmail/horde-webmail/config/conf.php /usr/share/horde/config/conf.php - #ADD ./config/conf.php /usr/share/horde/config/conf.php - #RUN chown www-data:www-data /usr/share/horde/config/conf.php + ADD ./config/conf.php /usr/share/horde/config/conf.php + RUN chown www-data:www-data /usr/share/horde/config/conf.php + # coppying ingo mail Filter application - #ADD ./config/ingo/conf.php /usr/share/horde/ingo/config/conf.php - #RUN chown www-data:www-data /usr/share/horde/ingo/config/conf.php + ADD ./config/ingo/conf.php /usr/share/horde/ingo/config/conf.php + RUN chown www-data:www-data /usr/share/horde/ingo/config/conf.php # configuration file hosting solution - #ADD ./config/gollem/conf.php /usr/share/horde/gollem/config/conf.php - #RUN chown www-data:www-data /usr/share/horde/gollem/config/conf.php + ADD ./config/gollem/conf.php /usr/share/horde/gollem/config/conf.php + RUN chown www-data:www-data /usr/share/horde/gollem/config/conf.php # Configuring turba contact mangement - #ADD ./config/turba/conf.php /usr/share/horde/turba/config/conf.php - #RUN chown www-data:www-data /usr/share/horde/turba/config/conf.php + ADD ./config/turba/conf.php /usr/share/horde/turba/config/conf.php + RUN chown www-data:www-data /usr/share/horde/turba/config/conf.php # Configuring Todo/Reminder plugin - #ADD ./config/nag/conf.php /usr/share/horde/nag/config/conf.php - #RUN chown www-data:www-data /usr/share/horde/nag/config/conf.php + ADD ./config/nag/conf.php /usr/share/horde/nag/config/conf.php + RUN chown www-data:www-data /usr/share/horde/nag/config/conf.php # Configure Kronolith calender - #ADD ./config/kronolith/conf.php /usr/share/horde/kronolith/config/conf.php - #RUN chown www-data:www-data /usr/share/horde/kronolith/config/conf.php + ADD ./config/kronolith/conf.php /usr/share/horde/kronolith/config/conf.php + RUN chown www-data:www-data /usr/share/horde/kronolith/config/conf.php # Configure mnemo Notebook - #ADD ./config/mnemo/conf.php /usr/share/horde/mnemo/config/conf.php - #RUN chown www-data:www-data /usr/share/horde/mnemo/config/conf.php + ADD ./config/mnemo/conf.php /usr/share/horde/mnemo/config/conf.php + RUN chown www-data:www-data /usr/share/horde/mnemo/config/conf.php # Configure imp webmail - #ADD ./config/imp/conf.php /usr/share/horde/imp/config/conf.php - #RUN chown www-data:www-data /usr/share/horde/imp/config/conf.php + ADD ./config/imp/conf.php /usr/share/horde/imp/config/conf.php + RUN chown www-data:www-data /usr/share/horde/imp/config/conf.php # Configure trean web book mark - #ADD ./config/trean/conf.php /usr/share/horde/trean/config/conf.php - #RUN chown www-data:www-data /usr/share/horde/trean/config/conf.php + ADD ./config/trean/conf.php /usr/share/horde/trean/config/conf.php + RUN chown www-data:www-data /usr/share/horde/trean/config/conf.php @@ -79,13 +81,14 @@ RUN chown www-data:www-data /etc/horde/imp/conf.php /etc/horde/turba/conf.php # coppying conf.php for horde active directory #ADD ./config/conf.php /etc/horde/horde/conf.php - #ADD ./config/backends.local.php /etc/horde/imp/backends.local.php + ADD ./config/backends.local.php /etc/horde/imp/backends.local.php #ADD ./webmail/horde-webmail/config/conf.php /usr/share/horde/config/conf.php #RUN chown www-data:www-data /usr/share/horde/config/conf.php ADD ./apache-horde.conf /etc/apache2/sites-enabled/apache-horde.conf +# horde database migration through a sh file ADD ./horde-init.sh /etc/my_init.d/horde-init.sh RUN chmod +x /etc/my_init.d/horde-init.sh @@ -93,7 +96,8 @@ RUN mkdir -p /etc/service/apache2 ADD ./run.sh /etc/service/apache2/run -# +# Horde database migration +#RUN /usr/bin/horde-db-migrate RUN chmod +x /etc/service/apache2/run diff --git a/copper-server/kubernetes/groupware/horde/Dockerfile-anushka b/copper-server/kubernetes/groupware/horde/Dockerfile-anushka new file mode 100755 index 00000000..d30481df --- /dev/null +++ b/copper-server/kubernetes/groupware/horde/Dockerfile-anushka @@ -0,0 +1,55 @@ +FROM ubuntu:18.04 +MAINTAINER Lanka Software Foundation +ARG DEBIAN_FRONTEND=noninteractive +LABEL KEY=LSF-COPPER-HORDE + +#ENV HOME /root + +# root account +# ENV MYSQL_ENV_MYSQL_ROOT_USERNAME horde +# ENV MYSQL_ENV_MYSQL_ROOT_PASSWORD horde + +# ENV DB_NAME horde +# ENV DB_USER horde +# ENV DB_PASS horde +# #ENV DB_PROTOCOL unix +# #ENV DB_PROTOCOL tcp +# ENV DB_PROTOCOL TCP +# ENV DB_HOST 172.19.0.19 +# ENV MYSQL_PORT_3306_TCP_ADDR 172.19.0.19 +# ENV MYSQL_PORT_3306_TCP_PORT 3306 +# ENV DB_PORT 3306 +# ENV DB_DRIVER mysqli +# ENV HORDE_TEST_DISABLE true + +EXPOSE 80 + +RUN apt-get update +RUN apt-get -y upgrade +RUN apt-get -y install nano +# RUN apt-get -y install apache2 libapache2-mod-php mysql-client gnupg2 openssl php-pear +# RUN apt-get -y install apache2 +RUN apt-get -y install apache2 libapache2-mod-php mysql-client gnupg2 openssl php-pear +RUN apt-get -y install php-intl php-ldap php-ssh2 php-curl php-http php-xmlrpc php-geoip php-memcache php-memcached php-tidy +RUN apt-get -y install php-common libapache2-mod-php php-cli +RUN apt-get -y install php-mysql +RUN apt-get -y install mysql-server +RUN pear upgrade PEAR +RUN pear channel-update pear.php.net +RUN pear channel-discover pear.horde.org +RUN pear install horde/horde_role + +################################################################################################################## + +#### Run below commands inside the horde container ###### + +################################################################################################################## +# RUN service mysql stop +# RUN usermod -d /var/lib/mysql/ mysql +# RUN service mysql start + +# RUN pear run-scripts horde/horde_role +# ### this is a user input -----> /var/www/html/horde +# RUN pear install -a -B horde/horde +# RUN cp /var/www/html/horde/config/conf.php.dist /var/www/html/horde/config/conf.php +# RUN service apache2 restart \ No newline at end of file diff --git a/copper-server/kubernetes/groupware/horde/config/conf.php b/copper-server/kubernetes/groupware/horde/config/conf.php index 57706b8b..d8b82443 100644 --- a/copper-server/kubernetes/groupware/horde/config/conf.php +++ b/copper-server/kubernetes/groupware/horde/config/conf.php @@ -1,11 +1,144 @@ + Date: Thu, 21 Feb 2019 12:01:01 +0530 Subject: [PATCH 6/7] Horde implementation --- copper-server/kubernetes/copperclient/Dockerfile | 16 +++++++++++++++- copper-server/kubernetes/deployment/deploy.sh | 11 ++++++----- copper-server/kubernetes/deployment/undeploy.sh | 8 ++++---- .../kubernetes/groupware/horde/horde.yaml | 3 ++- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/copper-server/kubernetes/copperclient/Dockerfile b/copper-server/kubernetes/copperclient/Dockerfile index 7f410402..fd4809b4 100755 --- a/copper-server/kubernetes/copperclient/Dockerfile +++ b/copper-server/kubernetes/copperclient/Dockerfile @@ -11,7 +11,21 @@ ENV DOMAIN=${DOMAIN} # Install basics -RUN apt-get update +#RUN apt-get update +RUN apt-get update --fix-missing && apt-get -y purge exim4* +RUN apt-get -y upgrade +RUN apt-get -y install apt-utils +# installing netstat command +RUN apt-get -y install net-tools +# installing ping command +RUN apt-get install -y iputils-ping +# install mail until for testing functions +RUN apt-get -y install mailutils +# installing lsof command +RUN apt-get -y install lsof +RUN apt-get -y install telnet +RUN apt-get -y install nano +RUN apt-get -y install letsencrypt openssl RUN apt-get install -y software-properties-common && \ diff --git a/copper-server/kubernetes/deployment/deploy.sh b/copper-server/kubernetes/deployment/deploy.sh index 146000dc..608ef00c 100644 --- a/copper-server/kubernetes/deployment/deploy.sh +++ b/copper-server/kubernetes/deployment/deploy.sh @@ -189,14 +189,15 @@ echoGreenBold 'Persistent Volume created...' kubectl create -f persistent/mysql-deployment.yaml 2> /dev/null || true echoGreenBold 'mysql deployment completed...' -cd copperclient + #Build the docker image -docker build -t webmail . 2> /dev/null || true -echoGreenBold 'Docker webmail image created...' +#cd copperclient +#docker build -t webmail . 2> /dev/null || true +#echoGreenBold 'Docker webmail image created...' # wait 1 seconds -sleep 1s -cd .. +#sleep 1s +#cd .. #Buld the kubernetes pod Kubectl create -f copperclient/webmail.yaml 2> /dev/null || true diff --git a/copper-server/kubernetes/deployment/undeploy.sh b/copper-server/kubernetes/deployment/undeploy.sh index 74fae066..efd103a9 100644 --- a/copper-server/kubernetes/deployment/undeploy.sh +++ b/copper-server/kubernetes/deployment/undeploy.sh @@ -115,10 +115,10 @@ kubectl delete deployment email --namespace=monitoring 2> /dev/null || true echoRedBold 'Email service deleted...' # If you want to delete webmail service use following commands. -kubectl delete service webmail --namespace=monitoring 2> /dev/null || true -kubectl delete deployment webmail --namespace=monitoring 2> /dev/null || true -docker rmi webmail 2> /dev/null || true -echoRedBold 'Webmail service deleted...' +#kubectl delete service webmail --namespace=monitoring 2> /dev/null || true +#kubectl delete deployment webmail --namespace=monitoring 2> /dev/null || true +#docker rmi webmail 2> /dev/null || true +#echoRedBold 'Webmail service deleted...' #deleting services diff --git a/copper-server/kubernetes/groupware/horde/horde.yaml b/copper-server/kubernetes/groupware/horde/horde.yaml index f099ef51..0add3682 100644 --- a/copper-server/kubernetes/groupware/horde/horde.yaml +++ b/copper-server/kubernetes/groupware/horde/horde.yaml @@ -57,7 +57,8 @@ spec: containerPort: 81 resources: limits: - cpu: "2" + cpu: 800m + #cpu: "2" #memory: 2Gi #memory: 1Gi # once we remove memory limits it can grown untill host permits. #memory: 512Mi From a800c9ee72613f47e5d6bae31c9cc43172f5c2cf Mon Sep 17 00:00:00 2001 From: tharangar Date: Thu, 21 Feb 2019 14:50:20 +0530 Subject: [PATCH 7/7] Database Integration --- copper-server/core/README.md | 66 - copper-server/core/homail.yaml | 77 - copper-server/core/ingress.yaml | 42 - copper-server/core/rainloop/Dockerfile | 152 - copper-server/core/rainloop/README.md | 57 - .../core/rainloop/app/data/INSTALLED | 1 - copper-server/core/rainloop/app/data/SALT.php | 1 - copper-server/core/rainloop/app/data/VERSION | 1 - .../23e3d58cd184245411d2a84bf33e57162799021f | 1 - .../3e18609e097b6278b6c17fa9dd6de9db3a729b67 | 1 - .../5b1c51ed23b96bde49c865e074352dc9b29808f0 | 1 - .../9c2bfd930fad89419786b5bc0199a4eafd8fe4c8 | 1 - .../b82792fad72d7b38639e5fc82c113102969af8b7 | 1 - .../_data_/_default_/configs/application.ini | 356 - .../plugin-directadmin-change-password.ini | 6 - .../configs/plugin-ldap-change-password.ini | 9 - .../domains/copper.opensource.lk.ini | 16 - .../domains/coppermail.dyndns.org.ini | 16 - .../data/_data_/_default_/domains/disabled | 1 - .../_data_/_default_/domains/gmail.com.ini | 7 - .../_data_/_default_/domains/outlook.com.ini | 7 - .../data/_data_/_default_/domains/qq.com.ini | 7 - .../_data_/_default_/domains/yahoo.com.ini | 7 - .../ChangePasswordLdapDriver.php | 230 - .../plugins/ldap-change-password/LICENSE | 20 - .../plugins/ldap-change-password/README | 1 - .../plugins/ldap-change-password/VERSION | 1 - .../plugins/ldap-change-password/index.php | 79 - .../settings_local | 1 - .../settings_local | 1 - .../settings_local | 1 - .../settings_local | 1 - .../settings_local | 1 - .../lsf@copper.opensource.lk/settings_local | 1 - .../cfg/ls/lsf@coppermail.dyndns.org/settings | 1 - .../lsf@coppermail.dyndns.org/settings_local | 1 - .../settings_local | 1 - .../supun@copper.opensource.lk/settings_local | 1 - .../test@copper.opensource.lk/settings_local | 1 - .../test@coppermail.dyndns.org/settings_local | 1 - .../settings_local | 1 - .../ef/efaeb36a60ef9682802c6a704c2d784d | 1 - .../38871f9f7a2ad0d70b1e51991143db90bfbbb3c2 | 1 - .../aa6bc308dedb13d95e120aafb590f4645301f8cd | 1 - .../core/rainloop/app/data/index.html | 1 - .../core/rainloop/app/data/index.php | 1 - copper-server/core/rainloop/app/index.php | 19 - .../v/1.12.0/app/domains/default.ini.dist | 7 - .../rainloop/v/1.12.0/app/domains/disabled | 1 - .../v/1.12.0/app/domains/gmail.com.ini | 7 - .../v/1.12.0/app/domains/outlook.com.ini | 7 - .../rainloop/v/1.12.0/app/domains/qq.com.ini | 7 - .../v/1.12.0/app/domains/yahoo.com.ini | 7 - .../app/rainloop/v/1.12.0/app/handle.php | 103 - .../Facebook/Authentication/AccessToken.php | 160 - .../Authentication/AccessTokenMetadata.php | 390 - .../Facebook/Authentication/OAuth2Client.php | 292 - .../FacebookAuthenticationException.php | 33 - .../FacebookAuthorizationException.php | 33 - .../Exceptions/FacebookClientException.php | 33 - .../Exceptions/FacebookOtherException.php | 33 - .../Exceptions/FacebookResponseException.php | 208 - .../Exceptions/FacebookSDKException.php | 33 - .../Exceptions/FacebookServerException.php | 33 - .../Exceptions/FacebookThrottleException.php | 33 - .../app/libraries/Facebook/Facebook.php | 589 - .../app/libraries/Facebook/FacebookApp.php | 101 - .../Facebook/FacebookBatchRequest.php | 303 - .../Facebook/FacebookBatchResponse.php | 154 - .../app/libraries/Facebook/FacebookClient.php | 250 - .../libraries/Facebook/FacebookRequest.php | 536 - .../libraries/Facebook/FacebookResponse.php | 410 - .../Facebook/FileUpload/FacebookFile.php | 135 - .../Facebook/FileUpload/FacebookVideo.php | 33 - .../Facebook/FileUpload/Mimetypes.php | 987 -- .../Facebook/GraphNodes/Collection.php | 242 - .../Facebook/GraphNodes/GraphAchievement.php | 113 - .../Facebook/GraphNodes/GraphAlbum.php | 183 - .../Facebook/GraphNodes/GraphApplication.php | 43 - .../Facebook/GraphNodes/GraphCoverPhoto.php | 72 - .../Facebook/GraphNodes/GraphEdge.php | 260 - .../Facebook/GraphNodes/GraphEvent.php | 242 - .../Facebook/GraphNodes/GraphGroup.php | 171 - .../Facebook/GraphNodes/GraphList.php | 36 - .../Facebook/GraphNodes/GraphLocation.php | 102 - .../Facebook/GraphNodes/GraphNode.php | 185 - .../Facebook/GraphNodes/GraphNodeFactory.php | 392 - .../Facebook/GraphNodes/GraphObject.php | 36 - .../GraphNodes/GraphObjectFactory.php | 86 - .../Facebook/GraphNodes/GraphPage.php | 125 - .../Facebook/GraphNodes/GraphPicture.php | 72 - .../Facebook/GraphNodes/GraphSessionInfo.php | 102 - .../Facebook/GraphNodes/GraphUser.php | 162 - .../Facebook/Helpers/FacebookCanvasHelper.php | 52 - .../Helpers/FacebookJavaScriptHelper.php | 42 - .../Helpers/FacebookPageTabHelper.php | 95 - .../Helpers/FacebookRedirectLoginHelper.php | 360 - .../FacebookSignedRequestFromInputHelper.php | 166 - .../Facebook/Http/GraphRawResponse.php | 137 - .../Facebook/Http/RequestBodyInterface.php | 39 - .../Facebook/Http/RequestBodyMultipart.php | 170 - .../Facebook/Http/RequestBodyUrlEncoded.php | 55 - .../Facebook/HttpClients/FacebookCurl.php | 129 - .../HttpClients/FacebookCurlHttpClient.php | 210 - .../HttpClients/FacebookGuzzleHttpClient.php | 97 - .../FacebookHttpClientInterface.php | 47 - .../Facebook/HttpClients/FacebookStream.php | 80 - .../HttpClients/FacebookStreamHttpClient.php | 94 - .../certs/DigiCertHighAssuranceEVRootCA.pem | 23 - .../FacebookMemoryPersistentDataHandler.php | 53 - .../FacebookSessionPersistentDataHandler.php | 76 - .../PersistentDataInterface.php | 49 - .../McryptPseudoRandomStringGenerator.php | 68 - .../OpenSslPseudoRandomStringGenerator.php | 67 - .../PseudoRandomStringGeneratorInterface.php | 45 - .../PseudoRandomStringGeneratorTrait.php | 58 - .../UrandomPseudoRandomStringGenerator.php | 89 - .../app/libraries/Facebook/SignedRequest.php | 332 - .../Url/FacebookUrlDetectionHandler.php | 163 - .../Facebook/Url/FacebookUrlManipulator.php | 167 - .../Facebook/Url/UrlDetectionInterface.php | 39 - .../app/libraries/Facebook/autoload.php | 79 - .../GuzzleHttp/Adapter/AdapterInterface.php | 23 - .../GuzzleHttp/Adapter/Curl/BatchContext.php | 158 - .../GuzzleHttp/Adapter/Curl/CurlAdapter.php | 142 - .../GuzzleHttp/Adapter/Curl/CurlFactory.php | 331 - .../GuzzleHttp/Adapter/Curl/MultiAdapter.php | 284 - .../Adapter/Curl/RequestMediator.php | 130 - .../Adapter/FakeParallelAdapter.php | 34 - .../GuzzleHttp/Adapter/MockAdapter.php | 60 - .../Adapter/ParallelAdapterInterface.php | 23 - .../GuzzleHttp/Adapter/StreamAdapter.php | 347 - .../Adapter/StreamingProxyAdapter.php | 36 - .../GuzzleHttp/Adapter/Transaction.php | 49 - .../Adapter/TransactionInterface.php | 35 - .../Adapter/TransactionIterator.php | 73 - .../app/libraries/GuzzleHttp/Client.php | 364 - .../libraries/GuzzleHttp/ClientInterface.php | 179 - .../app/libraries/GuzzleHttp/Collection.php | 265 - .../libraries/GuzzleHttp/Cookie/CookieJar.php | 249 - .../GuzzleHttp/Cookie/CookieJarInterface.php | 76 - .../GuzzleHttp/Cookie/FileCookieJar.php | 85 - .../GuzzleHttp/Cookie/SessionCookieJar.php | 65 - .../libraries/GuzzleHttp/Cookie/SetCookie.php | 410 - .../GuzzleHttp/Event/AbstractEvent.php | 21 - .../GuzzleHttp/Event/AbstractRequestEvent.php | 49 - .../Event/AbstractTransferEvent.php | 83 - .../GuzzleHttp/Event/BeforeEvent.php | 26 - .../GuzzleHttp/Event/CompleteEvent.php | 35 - .../libraries/GuzzleHttp/Event/Emitter.php | 147 - .../GuzzleHttp/Event/EmitterInterface.php | 88 - .../libraries/GuzzleHttp/Event/ErrorEvent.php | 65 - .../GuzzleHttp/Event/EventInterface.php | 24 - .../GuzzleHttp/Event/HasEmitterInterface.php | 16 - .../GuzzleHttp/Event/HasEmitterTrait.php | 21 - .../GuzzleHttp/Event/HeadersEvent.php | 39 - .../Event/ListenerAttacherTrait.php | 89 - .../GuzzleHttp/Event/RequestEvents.php | 162 - .../GuzzleHttp/Event/SubscriberInterface.php | 31 - .../GuzzleHttp/Exception/AdapterException.php | 5 - .../Exception/BadResponseException.php | 8 - .../GuzzleHttp/Exception/ClientException.php | 8 - .../CouldNotRewindStreamException.php | 5 - .../GuzzleHttp/Exception/ParseException.php | 32 - .../GuzzleHttp/Exception/RequestException.php | 124 - .../GuzzleHttp/Exception/ServerException.php | 8 - .../Exception/TooManyRedirectsException.php | 5 - .../Exception/TransferException.php | 5 - .../app/libraries/GuzzleHttp/HasDataTrait.php | 76 - .../GuzzleHttp/Message/AbstractMessage.php | 237 - .../GuzzleHttp/Message/MessageFactory.php | 345 - .../Message/MessageFactoryInterface.php | 71 - .../GuzzleHttp/Message/MessageInterface.php | 148 - .../GuzzleHttp/Message/MessageParser.php | 172 - .../libraries/GuzzleHttp/Message/Request.php | 216 - .../GuzzleHttp/Message/RequestInterface.php | 150 - .../libraries/GuzzleHttp/Message/Response.php | 202 - .../GuzzleHttp/Message/ResponseInterface.php | 86 - .../app/libraries/GuzzleHttp/Mimetypes.php | 964 -- .../GuzzleHttp/Post/MultipartBody.php | 292 - .../libraries/GuzzleHttp/Post/PostBody.php | 282 - .../GuzzleHttp/Post/PostBodyInterface.php | 129 - .../libraries/GuzzleHttp/Post/PostFile.php | 138 - .../GuzzleHttp/Post/PostFileInterface.php | 42 - .../1.12.0/app/libraries/GuzzleHttp/Query.php | 226 - .../GuzzleHttp/Subscriber/Cookie.php | 59 - .../GuzzleHttp/Subscriber/History.php | 138 - .../GuzzleHttp/Subscriber/HttpError.php | 34 - .../libraries/GuzzleHttp/Subscriber/Mock.php | 143 - .../GuzzleHttp/Subscriber/Prepare.php | 136 - .../GuzzleHttp/Subscriber/Redirect.php | 172 - .../libraries/GuzzleHttp/ToArrayInterface.php | 16 - .../app/libraries/GuzzleHttp/UriTemplate.php | 242 - .../v/1.12.0/app/libraries/GuzzleHttp/Url.php | 585 - .../app/libraries/GuzzleHttp/cacert.pem | 3866 ------ .../app/libraries/GuzzleHttp/functions.php | 325 - .../Imagine/Draw/DrawerInterface.php | 149 - .../Imagine/Effects/EffectsInterface.php | 80 - .../libraries/Imagine/Exception/Exception.php | 19 - .../Exception/InvalidArgumentException.php | 19 - .../Exception/NotSupportedException.php | 19 - .../Exception/OutOfBoundsException.php | 19 - .../Imagine/Exception/RuntimeException.php | 19 - .../Imagine/Filter/Advanced/Border.php | 98 - .../Imagine/Filter/Advanced/Canvas.php | 74 - .../Imagine/Filter/Advanced/Grayscale.php | 30 - .../Imagine/Filter/Advanced/OnPixelBased.php | 57 - .../Filter/Advanced/RelativeResize.php | 50 - .../Imagine/Filter/Basic/ApplyMask.php | 42 - .../Imagine/Filter/Basic/Autorotate.php | 87 - .../libraries/Imagine/Filter/Basic/Copy.php | 29 - .../libraries/Imagine/Filter/Basic/Crop.php | 54 - .../libraries/Imagine/Filter/Basic/Fill.php | 43 - .../Imagine/Filter/Basic/FlipHorizontally.php | 29 - .../Imagine/Filter/Basic/FlipVertically.php | 29 - .../libraries/Imagine/Filter/Basic/Paste.php | 53 - .../libraries/Imagine/Filter/Basic/Resize.php | 48 - .../libraries/Imagine/Filter/Basic/Rotate.php | 52 - .../libraries/Imagine/Filter/Basic/Save.php | 51 - .../libraries/Imagine/Filter/Basic/Show.php | 51 - .../libraries/Imagine/Filter/Basic/Strip.php | 29 - .../Imagine/Filter/Basic/Thumbnail.php | 59 - .../Imagine/Filter/Basic/WebOptimization.php | 57 - .../Imagine/Filter/FilterInterface.php | 30 - .../libraries/Imagine/Filter/ImagineAware.php | 54 - .../Imagine/Filter/Transformation.php | 240 - .../app/libraries/Imagine/Gd/Drawer.php | 333 - .../app/libraries/Imagine/Gd/Effects.php | 109 - .../1.12.0/app/libraries/Imagine/Gd/Font.php | 41 - .../1.12.0/app/libraries/Imagine/Gd/Image.php | 735 - .../app/libraries/Imagine/Gd/Imagine.php | 195 - .../app/libraries/Imagine/Gd/Layers.php | 144 - .../app/libraries/Imagine/Gmagick/Drawer.php | 356 - .../app/libraries/Imagine/Gmagick/Effects.php | 106 - .../app/libraries/Imagine/Gmagick/Font.php | 63 - .../app/libraries/Imagine/Gmagick/Image.php | 786 -- .../app/libraries/Imagine/Gmagick/Imagine.php | 167 - .../app/libraries/Imagine/Gmagick/Layers.php | 272 - .../libraries/Imagine/Image/AbstractFont.php | 75 - .../libraries/Imagine/Image/AbstractImage.php | 120 - .../Imagine/Image/AbstractImagine.php | 79 - .../Imagine/Image/AbstractLayers.php | 61 - .../app/libraries/Imagine/Image/Box.php | 122 - .../libraries/Imagine/Image/BoxInterface.php | 94 - .../Imagine/Image/Fill/FillInterface.php | 30 - .../Image/Fill/Gradient/Horizontal.php | 28 - .../Imagine/Image/Fill/Gradient/Linear.php | 95 - .../Imagine/Image/Fill/Gradient/Vertical.php | 28 - .../libraries/Imagine/Image/FontInterface.php | 51 - .../Imagine/Image/Histogram/Bucket.php | 56 - .../Imagine/Image/Histogram/Range.php | 56 - .../Imagine/Image/ImageInterface.php | 173 - .../Imagine/Image/ImagineInterface.php | 83 - .../Imagine/Image/LayersInterface.php | 107 - .../Imagine/Image/ManipulatorInterface.php | 181 - .../Image/Metadata/AbstractMetadataReader.php | 101 - .../Image/Metadata/DefaultMetadataReader.php | 42 - .../Image/Metadata/ExifMetadataReader.php | 114 - .../Imagine/Image/Metadata/MetadataBag.php | 97 - .../Metadata/MetadataReaderInterface.php | 48 - .../libraries/Imagine/Image/Palette/CMYK.php | 118 - .../Imagine/Image/Palette/Color/CMYK.php | 219 - .../Image/Palette/Color/ColorInterface.php | 95 - .../Imagine/Image/Palette/Color/Gray.php | 164 - .../Imagine/Image/Palette/Color/RGB.php | 214 - .../Imagine/Image/Palette/ColorParser.php | 153 - .../Imagine/Image/Palette/Grayscale.php | 123 - .../Image/Palette/PaletteInterface.php | 87 - .../libraries/Imagine/Image/Palette/RGB.php | 129 - .../app/libraries/Imagine/Image/Point.php | 88 - .../libraries/Imagine/Image/Point/Center.php | 77 - .../Imagine/Image/PointInterface.php | 56 - .../app/libraries/Imagine/Image/Profile.php | 60 - .../Imagine/Image/ProfileInterface.php | 29 - .../app/libraries/Imagine/Imagick/Drawer.php | 404 - .../app/libraries/Imagine/Imagick/Effects.php | 113 - .../app/libraries/Imagine/Imagick/Font.php | 68 - .../app/libraries/Imagine/Imagick/Image.php | 880 -- .../app/libraries/Imagine/Imagick/Imagine.php | 176 - .../app/libraries/Imagine/Imagick/Layers.php | 271 - .../app/libraries/MailSo/Base/Collection.php | 192 - .../app/libraries/MailSo/Base/Crypt.php | 189 - .../libraries/MailSo/Base/DateTimeHelper.php | 154 - .../MailSo/Base/Enumerations/Charset.php | 38 - .../MailSo/Base/Enumerations/Encoding.php | 33 - .../MailSo/Base/Exceptions/Exception.php | 33 - .../Exceptions/InvalidArgumentException.php | 19 - .../app/libraries/MailSo/Base/HtmlUtils.php | 1610 --- .../1.12.0/app/libraries/MailSo/Base/Http.php | 800 -- .../app/libraries/MailSo/Base/LinkFinder.php | 298 - .../app/libraries/MailSo/Base/Loader.php | 137 - .../MailSo/Base/ResourceRegistry.php | 125 - .../MailSo/Base/StreamWrappers/Binary.php | 411 - .../MailSo/Base/StreamWrappers/Literal.php | 194 - .../MailSo/Base/StreamWrappers/SubStreams.php | 250 - .../MailSo/Base/StreamWrappers/TempFile.php | 164 - .../MailSo/Base/StreamWrappers/Test.php | 138 - .../app/libraries/MailSo/Base/Utils.php | 2536 ---- .../app/libraries/MailSo/Base/Validator.php | 100 - .../libraries/MailSo/Cache/CacheClient.php | 215 - .../MailSo/Cache/DriverInterface.php | 48 - .../libraries/MailSo/Cache/Drivers/APC.php | 107 - .../libraries/MailSo/Cache/Drivers/File.php | 153 - .../MailSo/Cache/Drivers/Memcache.php | 144 - .../libraries/MailSo/Cache/Drivers/Redis.php | 160 - .../v/1.12.0/app/libraries/MailSo/Config.php | 113 - .../v/1.12.0/app/libraries/MailSo/Hooks.php | 55 - .../libraries/MailSo/Imap/BodyStructure.php | 963 -- .../MailSo/Imap/Enumerations/FetchType.php | 127 - .../Enumerations/FolderResponseStatus.php | 27 - .../MailSo/Imap/Enumerations/FolderStatus.php | 27 - .../MailSo/Imap/Enumerations/FolderType.php | 30 - .../MailSo/Imap/Enumerations/MessageFlag.php | 27 - .../Imap/Enumerations/ResponseStatus.php | 26 - .../MailSo/Imap/Enumerations/ResponseType.php | 25 - .../MailSo/Imap/Enumerations/StoreAction.php | 34 - .../MailSo/Imap/Exceptions/Exception.php | 19 - .../Exceptions/InvalidResponseException.php | 19 - .../LoginBadCredentialsException.php | 19 - .../Exceptions/LoginBadMethodException.php | 19 - .../MailSo/Imap/Exceptions/LoginException.php | 19 - .../Exceptions/NegativeResponseException.php | 37 - .../Imap/Exceptions/ResponseException.php | 57 - .../Exceptions/ResponseNotFoundException.php | 19 - .../Imap/Exceptions/RuntimeException.php | 19 - .../libraries/MailSo/Imap/FetchResponse.php | 273 - .../app/libraries/MailSo/Imap/Folder.php | 193 - .../MailSo/Imap/FolderInformation.php | 112 - .../app/libraries/MailSo/Imap/ImapClient.php | 2667 ---- .../libraries/MailSo/Imap/NamespaceResult.php | 132 - .../app/libraries/MailSo/Imap/Response.php | 104 - .../v/1.12.0/app/libraries/MailSo/LICENSE | 21 - .../app/libraries/MailSo/Log/Driver.php | 408 - .../libraries/MailSo/Log/Drivers/Callback.php | 83 - .../app/libraries/MailSo/Log/Drivers/File.php | 91 - .../libraries/MailSo/Log/Drivers/Inline.php | 89 - .../libraries/MailSo/Log/Drivers/Syslog.php | 81 - .../MailSo/Log/Enumerations/Type.php | 34 - .../app/libraries/MailSo/Log/Logger.php | 431 - .../app/libraries/MailSo/Mail/Attachment.php | 239 - .../MailSo/Mail/AttachmentCollection.php | 74 - .../MailSo/Mail/Exceptions/Exception.php | 19 - .../MailSo/Mail/Exceptions/NonEmptyFolder.php | 19 - .../Mail/Exceptions/RuntimeException.php | 19 - .../app/libraries/MailSo/Mail/Folder.php | 317 - .../MailSo/Mail/FolderCollection.php | 279 - .../app/libraries/MailSo/Mail/MailClient.php | 2677 ---- .../app/libraries/MailSo/Mail/Message.php | 890 -- .../MailSo/Mail/MessageCollection.php | 123 - .../v/1.12.0/app/libraries/MailSo/MailSo.php | 40 - .../app/libraries/MailSo/Mime/Attachment.php | 197 - .../MailSo/Mime/AttachmentCollection.php | 71 - .../app/libraries/MailSo/Mime/Email.php | 315 - .../libraries/MailSo/Mime/EmailCollection.php | 243 - .../app/libraries/MailSo/Mime/EmailDep.php | 339 - .../MailSo/Mime/Enumerations/Constants.php | 25 - .../MailSo/Mime/Enumerations/DkimStatus.php | 57 - .../MailSo/Mime/Enumerations/Header.php | 71 - .../Mime/Enumerations/MessagePriority.php | 24 - .../MailSo/Mime/Enumerations/MimeType.php | 36 - .../MailSo/Mime/Enumerations/Parameter.php | 27 - .../MailSo/Mime/Enumerations/Sensitivity.php | 25 - .../app/libraries/MailSo/Mime/Header.php | 319 - .../MailSo/Mime/HeaderCollection.php | 480 - .../app/libraries/MailSo/Mime/Message.php | 937 -- .../app/libraries/MailSo/Mime/Parameter.php | 141 - .../MailSo/Mime/ParameterCollection.php | 213 - .../MailSo/Mime/Parser/ParserEmpty.php | 81 - .../MailSo/Mime/Parser/ParserInterface.php | 66 - .../MailSo/Mime/Parser/ParserMemory.php | 53 - .../1.12.0/app/libraries/MailSo/Mime/Part.php | 665 - .../libraries/MailSo/Mime/PartCollection.php | 65 - .../Enumerations/ConnectionSecurityType.php | 70 - .../Net/Exceptions/ConnectionException.php | 19 - .../MailSo/Net/Exceptions/Exception.php | 19 - .../Exceptions/InvalidArgumentException.php | 19 - .../SocketAlreadyConnectedException.php | 19 - .../SocketCanNotConnectToHostException.php | 61 - ...ketConnectionDoesNotAvailableException.php | 19 - .../Net/Exceptions/SocketReadException.php | 19 - .../Exceptions/SocketReadTimeoutException.php | 19 - .../SocketUnreadBufferException.php | 19 - ...etUnsuppoterdSecureConnectionException.php | 19 - .../Net/Exceptions/SocketWriteException.php | 19 - .../app/libraries/MailSo/Net/NetClient.php | 629 - .../MailSo/Pop3/Exceptions/Exception.php | 19 - .../LoginBadCredentialsException.php | 19 - .../Exceptions/NegativeResponseException.php | 19 - .../Pop3/Exceptions/ResponseException.php | 57 - .../Pop3/Exceptions/RuntimeException.php | 19 - .../app/libraries/MailSo/Pop3/Pop3Client.php | 373 - .../MailSo/Poppassd/Exceptions/Exception.php | 19 - .../LoginBadCredentialsException.php | 19 - .../Exceptions/NegativeResponseException.php | 19 - .../Poppassd/Exceptions/ResponseException.php | 57 - .../Poppassd/Exceptions/RuntimeException.php | 19 - .../MailSo/Poppassd/PoppassdClient.php | 296 - .../MailSo/Sieve/Exceptions/Exception.php | 19 - .../LoginBadCredentialsException.php | 19 - .../Exceptions/LoginBadMethodException.php | 19 - .../Sieve/Exceptions/LoginException.php | 19 - .../Exceptions/NegativeResponseException.php | 19 - .../Sieve/Exceptions/ResponseException.php | 57 - .../Sieve/Exceptions/RuntimeException.php | 19 - .../MailSo/Sieve/ManageSieveClient.php | 653 - .../MailSo/Smtp/Exceptions/Exception.php | 19 - .../LoginBadCredentialsException.php | 19 - .../Exceptions/LoginBadMethodException.php | 19 - .../MailSo/Smtp/Exceptions/LoginException.php | 19 - .../Exceptions/NegativeResponseException.php | 19 - .../Smtp/Exceptions/ResponseException.php | 57 - .../Smtp/Exceptions/RuntimeException.php | 19 - .../app/libraries/MailSo/Smtp/SmtpClient.php | 838 -- .../libraries/MailSo/Vendors/Net/IDNA2.php | 3404 ----- .../Vendors/Net/IDNA2CustomExceptions.php | 18 - .../v/1.12.0/app/libraries/MailSo/Version.php | 59 - .../app/libraries/Mobile_Detect/LICENSE.txt | 48 - .../Mobile_Detect/Mobile_Detect.json | 1 - .../libraries/Mobile_Detect/Mobile_Detect.php | 1460 -- .../app/libraries/Mobile_Detect/README.md | 283 - .../app/libraries/Mobile_Detect/composer.json | 28 - .../namespaced/Detection/MobileDetect.php | 22 - .../app/libraries/Mobile_Detect/ruleset.xml | 187 - .../app/libraries/PHP-OAuth2/Client.php | 513 - .../GrantType/AuthorizationCode.php | 41 - .../GrantType/ClientCredentials.php | 25 - .../PHP-OAuth2/GrantType/IGrantType.php | 15 - .../PHP-OAuth2/GrantType/Password.php | 41 - .../PHP-OAuth2/GrantType/RefreshToken.php | 34 - .../v/1.12.0/app/libraries/PHP-OAuth2/README | 117 - .../PHPGangsta/GoogleAuthenticator.php | 201 - .../v/1.12.0/app/libraries/PHPThumb/GD.php | 1417 -- .../app/libraries/PHPThumb/PHPThumb.php | 143 - .../libraries/PHPThumb/PluginInterface.php | 12 - .../libraries/PHPThumb/Plugins/Reflection.php | 261 - .../app/libraries/Predis/Autoloader.php | 62 - .../v/1.12.0/app/libraries/Predis/Client.php | 523 - .../Predis/ClientContextInterface.php | 189 - .../app/libraries/Predis/ClientException.php | 21 - .../app/libraries/Predis/ClientInterface.php | 230 - .../Predis/Cluster/ClusterStrategy.php | 398 - .../Distributor/DistributorInterface.php | 82 - .../Distributor/EmptyRingException.php | 21 - .../Predis/Cluster/Distributor/HashRing.php | 270 - .../Predis/Cluster/Distributor/KetamaRing.php | 71 - .../libraries/Predis/Cluster/Hash/CRC16.php | 72 - .../Cluster/Hash/HashGeneratorInterface.php | 30 - .../Predis/Cluster/PredisStrategy.php | 79 - .../Predis/Cluster/RedisStrategy.php | 58 - .../Predis/Cluster/StrategyInterface.php | 53 - .../Iterator/CursorBasedIterator.php | 191 - .../Predis/Collection/Iterator/HashKey.php | 56 - .../Predis/Collection/Iterator/Keyspace.php | 43 - .../Predis/Collection/Iterator/ListKey.php | 176 - .../Predis/Collection/Iterator/SetKey.php | 47 - .../Collection/Iterator/SortedSetKey.php | 60 - .../app/libraries/Predis/Command/Command.php | 129 - .../Predis/Command/CommandInterface.php | 81 - .../Predis/Command/ConnectionAuth.php | 28 - .../Predis/Command/ConnectionEcho.php | 28 - .../Predis/Command/ConnectionPing.php | 28 - .../Predis/Command/ConnectionQuit.php | 28 - .../Predis/Command/ConnectionSelect.php | 28 - .../libraries/Predis/Command/HashDelete.php | 36 - .../libraries/Predis/Command/HashExists.php | 36 - .../app/libraries/Predis/Command/HashGet.php | 28 - .../libraries/Predis/Command/HashGetAll.php | 42 - .../Predis/Command/HashGetMultiple.php | 36 - .../Predis/Command/HashIncrementBy.php | 28 - .../Predis/Command/HashIncrementByFloat.php | 28 - .../app/libraries/Predis/Command/HashKeys.php | 28 - .../libraries/Predis/Command/HashLength.php | 28 - .../app/libraries/Predis/Command/HashScan.php | 85 - .../app/libraries/Predis/Command/HashSet.php | 36 - .../Predis/Command/HashSetMultiple.php | 48 - .../Predis/Command/HashSetPreserve.php | 36 - .../Predis/Command/HashStringLength.php | 28 - .../libraries/Predis/Command/HashValues.php | 28 - .../Predis/Command/HyperLogLogAdd.php | 44 - .../Predis/Command/HyperLogLogCount.php | 36 - .../Predis/Command/HyperLogLogMerge.php | 36 - .../libraries/Predis/Command/KeyDelete.php | 36 - .../app/libraries/Predis/Command/KeyDump.php | 28 - .../libraries/Predis/Command/KeyExists.php | 36 - .../libraries/Predis/Command/KeyExpire.php | 36 - .../libraries/Predis/Command/KeyExpireAt.php | 36 - .../app/libraries/Predis/Command/KeyKeys.php | 28 - .../libraries/Predis/Command/KeyMigrate.php | 50 - .../app/libraries/Predis/Command/KeyMove.php | 36 - .../libraries/Predis/Command/KeyPersist.php | 36 - .../Predis/Command/KeyPreciseExpire.php | 28 - .../Predis/Command/KeyPreciseExpireAt.php | 28 - .../Predis/Command/KeyPreciseTimeToLive.php | 28 - .../libraries/Predis/Command/KeyRandom.php | 36 - .../libraries/Predis/Command/KeyRename.php | 28 - .../Predis/Command/KeyRenamePreserve.php | 36 - .../libraries/Predis/Command/KeyRestore.php | 28 - .../app/libraries/Predis/Command/KeyScan.php | 66 - .../app/libraries/Predis/Command/KeySort.php | 83 - .../Predis/Command/KeyTimeToLive.php | 28 - .../app/libraries/Predis/Command/KeyType.php | 28 - .../libraries/Predis/Command/ListIndex.php | 28 - .../libraries/Predis/Command/ListInsert.php | 28 - .../libraries/Predis/Command/ListLength.php | 28 - .../libraries/Predis/Command/ListPopFirst.php | 28 - .../Predis/Command/ListPopFirstBlocking.php | 41 - .../libraries/Predis/Command/ListPopLast.php | 28 - .../Predis/Command/ListPopLastBlocking.php | 28 - .../Predis/Command/ListPopLastPushHead.php | 28 - .../Command/ListPopLastPushHeadBlocking.php | 28 - .../libraries/Predis/Command/ListPushHead.php | 28 - .../Predis/Command/ListPushHeadX.php | 28 - .../libraries/Predis/Command/ListPushTail.php | 36 - .../Predis/Command/ListPushTailX.php | 28 - .../libraries/Predis/Command/ListRange.php | 28 - .../libraries/Predis/Command/ListRemove.php | 28 - .../app/libraries/Predis/Command/ListSet.php | 28 - .../app/libraries/Predis/Command/ListTrim.php | 28 - .../Command/PrefixableCommandInterface.php | 27 - .../Command/Processor/KeyPrefixProcessor.php | 415 - .../Command/Processor/ProcessorChain.php | 130 - .../Command/Processor/ProcessorInterface.php | 29 - .../Predis/Command/PubSubPublish.php | 28 - .../libraries/Predis/Command/PubSubPubsub.php | 61 - .../Predis/Command/PubSubSubscribe.php | 36 - .../Command/PubSubSubscribeByPattern.php | 28 - .../Predis/Command/PubSubUnsubscribe.php | 36 - .../Command/PubSubUnsubscribeByPattern.php | 28 - .../libraries/Predis/Command/RawCommand.php | 131 - .../Predis/Command/ScriptCommand.php | 77 - .../Command/ServerBackgroundRewriteAOF.php | 36 - .../Predis/Command/ServerBackgroundSave.php | 36 - .../libraries/Predis/Command/ServerClient.php | 74 - .../Predis/Command/ServerCommand.php | 28 - .../libraries/Predis/Command/ServerConfig.php | 49 - .../Predis/Command/ServerDatabaseSize.php | 28 - .../libraries/Predis/Command/ServerEval.php | 38 - .../Predis/Command/ServerEvalSHA.php | 38 - .../Predis/Command/ServerFlushAll.php | 28 - .../Predis/Command/ServerFlushDatabase.php | 28 - .../libraries/Predis/Command/ServerInfo.php | 111 - .../Predis/Command/ServerInfoV26x.php | 56 - .../Predis/Command/ServerLastSave.php | 28 - .../Predis/Command/ServerMonitor.php | 28 - .../libraries/Predis/Command/ServerObject.php | 28 - .../libraries/Predis/Command/ServerSave.php | 28 - .../libraries/Predis/Command/ServerScript.php | 28 - .../Predis/Command/ServerSentinel.php | 66 - .../Predis/Command/ServerShutdown.php | 28 - .../Predis/Command/ServerSlaveOf.php | 40 - .../Predis/Command/ServerSlowlog.php | 51 - .../libraries/Predis/Command/ServerTime.php | 28 - .../app/libraries/Predis/Command/SetAdd.php | 36 - .../Predis/Command/SetCardinality.php | 28 - .../Predis/Command/SetDifference.php | 28 - .../Predis/Command/SetDifferenceStore.php | 28 - .../Predis/Command/SetIntersection.php | 36 - .../Predis/Command/SetIntersectionStore.php | 40 - .../libraries/Predis/Command/SetIsMember.php | 36 - .../libraries/Predis/Command/SetMembers.php | 28 - .../app/libraries/Predis/Command/SetMove.php | 36 - .../app/libraries/Predis/Command/SetPop.php | 28 - .../Predis/Command/SetRandomMember.php | 28 - .../libraries/Predis/Command/SetRemove.php | 36 - .../app/libraries/Predis/Command/SetScan.php | 66 - .../app/libraries/Predis/Command/SetUnion.php | 28 - .../Predis/Command/SetUnionStore.php | 28 - .../libraries/Predis/Command/StringAppend.php | 28 - .../Predis/Command/StringBitCount.php | 28 - .../libraries/Predis/Command/StringBitOp.php | 42 - .../libraries/Predis/Command/StringBitPos.php | 28 - .../Predis/Command/StringDecrement.php | 28 - .../Predis/Command/StringDecrementBy.php | 28 - .../libraries/Predis/Command/StringGet.php | 28 - .../libraries/Predis/Command/StringGetBit.php | 28 - .../Predis/Command/StringGetMultiple.php | 36 - .../Predis/Command/StringGetRange.php | 28 - .../libraries/Predis/Command/StringGetSet.php | 28 - .../Predis/Command/StringIncrement.php | 28 - .../Predis/Command/StringIncrementBy.php | 28 - .../Predis/Command/StringIncrementByFloat.php | 28 - .../Predis/Command/StringPreciseSetExpire.php | 28 - .../libraries/Predis/Command/StringSet.php | 28 - .../libraries/Predis/Command/StringSetBit.php | 28 - .../Predis/Command/StringSetExpire.php | 28 - .../Predis/Command/StringSetMultiple.php | 48 - .../Command/StringSetMultiplePreserve.php | 36 - .../Predis/Command/StringSetPreserve.php | 36 - .../Predis/Command/StringSetRange.php | 28 - .../libraries/Predis/Command/StringStrlen.php | 28 - .../libraries/Predis/Command/StringSubstr.php | 28 - .../Predis/Command/TransactionDiscard.php | 28 - .../Predis/Command/TransactionExec.php | 28 - .../Predis/Command/TransactionMulti.php | 28 - .../Predis/Command/TransactionUnwatch.php | 28 - .../Predis/Command/TransactionWatch.php | 40 - .../app/libraries/Predis/Command/ZSetAdd.php | 43 - .../Predis/Command/ZSetCardinality.php | 28 - .../libraries/Predis/Command/ZSetCount.php | 28 - .../Predis/Command/ZSetIncrementBy.php | 28 - .../Predis/Command/ZSetIntersectionStore.php | 28 - .../libraries/Predis/Command/ZSetLexCount.php | 28 - .../libraries/Predis/Command/ZSetRange.php | 105 - .../Predis/Command/ZSetRangeByLex.php | 55 - .../Predis/Command/ZSetRangeByScore.php | 68 - .../app/libraries/Predis/Command/ZSetRank.php | 28 - .../libraries/Predis/Command/ZSetRemove.php | 36 - .../Predis/Command/ZSetRemoveRangeByLex.php | 28 - .../Predis/Command/ZSetRemoveRangeByRank.php | 28 - .../Predis/Command/ZSetRemoveRangeByScore.php | 28 - .../Predis/Command/ZSetReverseRange.php | 28 - .../Predis/Command/ZSetReverseRangeByLex.php | 23 - .../Command/ZSetReverseRangeByScore.php | 28 - .../Predis/Command/ZSetReverseRank.php | 28 - .../app/libraries/Predis/Command/ZSetScan.php | 85 - .../libraries/Predis/Command/ZSetScore.php | 28 - .../Predis/Command/ZSetUnionStore.php | 78 - .../Predis/CommunicationException.php | 80 - .../Predis/Configuration/ClusterOption.php | 76 - .../Configuration/ConnectionFactoryOption.php | 54 - .../Predis/Configuration/ExceptionsOption.php | 37 - .../Predis/Configuration/OptionInterface.php | 40 - .../Predis/Configuration/Options.php | 122 - .../Predis/Configuration/OptionsInterface.php | 64 - .../Predis/Configuration/PrefixOption.php | 44 - .../Predis/Configuration/ProfileOption.php | 69 - .../Configuration/ReplicationOption.php | 61 - .../Predis/Connection/AbstractConnection.php | 239 - .../Connection/Aggregate/ClusterInterface.php | 24 - .../Aggregate/MasterSlaveReplication.php | 264 - .../Connection/Aggregate/PredisCluster.php | 235 - .../Connection/Aggregate/RedisCluster.php | 553 - .../Aggregate/ReplicationInterface.php | 52 - .../AggregateConnectionInterface.php | 57 - .../CompositeConnectionInterface.php | 49 - .../Connection/CompositeStreamConnection.php | 125 - .../Predis/Connection/ConnectionException.php | 23 - .../Predis/Connection/ConnectionInterface.php | 66 - .../libraries/Predis/Connection/Factory.php | 151 - .../Predis/Connection/FactoryInterface.php | 52 - .../Connection/NodeConnectionInterface.php | 58 - .../Predis/Connection/Parameters.php | 176 - .../Predis/Connection/ParametersInterface.php | 62 - .../Connection/PhpiredisSocketConnection.php | 393 - .../Connection/PhpiredisStreamConnection.php | 228 - .../Predis/Connection/StreamConnection.php | 292 - .../Predis/Connection/WebdisConnection.php | 353 - .../app/libraries/Predis/Monitor/Consumer.php | 173 - .../Predis/NotSupportedException.php | 22 - .../app/libraries/Predis/Pipeline/Atomic.php | 119 - .../Predis/Pipeline/ConnectionErrorProof.php | 130 - .../Predis/Pipeline/FireAndForget.php | 36 - .../libraries/Predis/Pipeline/Pipeline.php | 247 - .../app/libraries/Predis/PredisException.php | 21 - .../app/libraries/Predis/Profile/Factory.php | 100 - .../Predis/Profile/ProfileInterface.php | 59 - .../libraries/Predis/Profile/RedisProfile.php | 146 - .../Predis/Profile/RedisUnstable.php | 41 - .../Predis/Profile/RedisVersion200.php | 173 - .../Predis/Profile/RedisVersion220.php | 202 - .../Predis/Profile/RedisVersion240.php | 207 - .../Predis/Profile/RedisVersion260.php | 235 - .../Predis/Profile/RedisVersion280.php | 267 - .../Predis/Profile/RedisVersion300.php | 270 - .../Predis/Protocol/ProtocolException.php | 24 - .../Protocol/ProtocolProcessorInterface.php | 41 - .../Protocol/RequestSerializerInterface.php | 31 - .../Protocol/ResponseReaderInterface.php | 32 - .../Text/CompositeProtocolProcessor.php | 107 - .../Protocol/Text/Handler/BulkResponse.php | 55 - .../Protocol/Text/Handler/ErrorResponse.php | 34 - .../Protocol/Text/Handler/IntegerResponse.php | 45 - .../Text/Handler/MultiBulkResponse.php | 68 - .../Text/Handler/ResponseHandlerInterface.php | 33 - .../Protocol/Text/Handler/StatusResponse.php | 35 - .../Handler/StreamableMultiBulkResponse.php | 47 - .../Protocol/Text/ProtocolProcessor.php | 122 - .../Protocol/Text/RequestSerializer.php | 47 - .../Predis/Protocol/Text/ResponseReader.php | 116 - .../Predis/PubSub/AbstractConsumer.php | 219 - .../app/libraries/Predis/PubSub/Consumer.php | 158 - .../Predis/PubSub/DispatcherLoop.php | 170 - .../Replication/ReplicationStrategy.php | 237 - .../app/libraries/Predis/Response/Error.php | 59 - .../Predis/Response/ErrorInterface.php | 35 - .../Predis/Response/Iterator/MultiBulk.php | 77 - .../Response/Iterator/MultiBulkIterator.php | 104 - .../Response/Iterator/MultiBulkTuple.php | 90 - .../Predis/Response/ResponseInterface.php | 21 - .../Predis/Response/ServerException.php | 44 - .../app/libraries/Predis/Response/Status.php | 79 - .../app/libraries/Predis/Session/Handler.php | 142 - .../Transaction/AbortedMultiExecException.php | 45 - .../Predis/Transaction/MultiExec.php | 461 - .../Predis/Transaction/MultiExecState.php | 166 - .../1.12.0/app/libraries/RainLoop/Actions.php | 10269 -------------- .../v/1.12.0/app/libraries/RainLoop/Api.php | 275 - .../Common/BackwardCapability/Account.php | 5 - .../FacebookRainLoopPersistentDataHandler.php | 81 - .../libraries/RainLoop/Common/MbStringFix.php | 464 - .../libraries/RainLoop/Common/PdoAbstract.php | 603 - .../RainLoopFacebookRedirectLoginHelper.php | 127 - .../RainLoop/Config/AbstractConfig.php | 343 - .../libraries/RainLoop/Config/Application.php | 471 - .../app/libraries/RainLoop/Config/Plugin.php | 59 - .../libraries/RainLoop/Enumerations/Capa.php | 35 - .../RainLoop/Enumerations/Layout.php | 10 - .../Enumerations/PluginPropertyType.php | 13 - .../RainLoop/Enumerations/SignMeType.php | 10 - .../RainLoop/Enumerations/TimeFormat.php | 9 - .../Enumerations/UploadClientError.php | 16 - .../RainLoop/Enumerations/UploadError.php | 13 - .../RainLoop/Exceptions/ClientException.php | 67 - .../RainLoop/Exceptions/Exception.php | 5 - .../Exceptions/InvalidArgumentException.php | 9 - .../RainLoop/Exceptions/RuntimeException.php | 9 - .../app/libraries/RainLoop/KeyPathHelper.php | 144 - .../app/libraries/RainLoop/Model/Account.php | 585 - .../app/libraries/RainLoop/Model/Domain.php | 590 - .../app/libraries/RainLoop/Model/Identity.php | 205 - .../app/libraries/RainLoop/Model/Template.php | 154 - .../app/libraries/RainLoop/Notifications.php | 153 - .../RainLoop/Plugins/AbstractPlugin.php | 436 - .../app/libraries/RainLoop/Plugins/Helper.php | 73 - .../libraries/RainLoop/Plugins/Manager.php | 770 - .../libraries/RainLoop/Plugins/Property.php | 205 - .../RainLoop/Providers/AbstractProvider.php | 51 - .../RainLoop/Providers/AddressBook.php | 377 - .../AddressBook/AddressBookInterface.php | 11 - .../Providers/AddressBook/Classes/Contact.php | 662 - .../AddressBook/Classes/Property.php | 169 - .../Providers/AddressBook/Classes/Tag.php | 33 - .../AddressBook/Enumerations/PropertyType.php | 35 - .../Providers/AddressBook/PdoAddressBook.php | 2012 --- .../RainLoop/Providers/ChangePassword.php | 102 - .../ChangePasswordInterface.php | 22 - .../libraries/RainLoop/Providers/Domain.php | 297 - .../Providers/Domain/DefaultDomain.php | 410 - .../Providers/Domain/DomainAdminInterface.php | 56 - .../Providers/Domain/DomainInterface.php | 7 - .../libraries/RainLoop/Providers/Files.php | 137 - .../RainLoop/Providers/Files/FileStorage.php | 247 - .../RainLoop/Providers/Files/IFiles.php | 80 - .../libraries/RainLoop/Providers/Filters.php | 84 - .../Providers/Filters/Classes/Filter.php | 300 - .../Filters/Classes/FilterCondition.php | 134 - .../Filters/Enumerations/ActionType.php | 13 - .../Filters/Enumerations/ConditionField.php | 12 - .../Filters/Enumerations/ConditionType.php | 14 - .../Filters/Enumerations/ConditionsType.php | 9 - .../Providers/Filters/FiltersInterface.php | 22 - .../Providers/Filters/SieveStorage.php | 564 - .../libraries/RainLoop/Providers/Settings.php | 52 - .../Providers/Settings/DefaultSettings.php | 79 - .../RainLoop/Providers/Settings/ISettings.php | 28 - .../libraries/RainLoop/Providers/Storage.php | 116 - .../Storage/Enumerations/StorageType.php | 10 - .../Providers/Storage/FileStorage.php | 203 - .../RainLoop/Providers/Storage/IStorage.php | 40 - .../Providers/Storage/TemproryApcStorage.php | 78 - .../RainLoop/Providers/Suggestions.php | 73 - .../Providers/Suggestions/ISuggestions.php | 15 - .../Suggestions/OwnCloudSuggestions.php | 116 - .../Providers/Suggestions/TestSuggestions.php | 21 - .../RainLoop/Providers/TwoFactorAuth.php | 73 - .../TwoFactorAuth/AbstractTwoFactorAuth.php | 24 - .../TwoFactorAuth/GoogleTwoFactorAuth.php | 33 - .../TwoFactorAuth/TwoFactorAuthInterface.php | 14 - .../1.12.0/app/libraries/RainLoop/Service.php | 328 - .../app/libraries/RainLoop/ServiceActions.php | 1389 -- .../app/libraries/RainLoop/Settings.php | 78 - .../1.12.0/app/libraries/RainLoop/Social.php | 792 -- .../v/1.12.0/app/libraries/RainLoop/Utils.php | 735 - .../CalDAV/Backend/AbstractBackend.php | 155 - .../CalDAV/Backend/BackendInterface.php | 233 - .../CalDAV/Backend/NotificationSupport.php | 47 - .../SabreForRainLoop/CalDAV/Backend/PDO.php | 691 - .../CalDAV/Backend/SharingSupport.php | 243 - .../SabreForRainLoop/CalDAV/Calendar.php | 376 - .../CalDAV/CalendarObject.php | 279 - .../CalDAV/CalendarQueryParser.php | 298 - .../CalDAV/CalendarQueryValidator.php | 392 - .../CalDAV/CalendarRootNode.php | 77 - .../CalDAV/Exception/InvalidComponentType.php | 35 - .../CalDAV/ICSExportPlugin.php | 142 - .../SabreForRainLoop/CalDAV/ICalendar.php | 36 - .../CalDAV/ICalendarObject.php | 21 - .../CalDAV/IShareableCalendar.php | 48 - .../CalDAV/ISharedCalendar.php | 36 - .../CalDAV/Notifications/Collection.php | 173 - .../CalDAV/Notifications/ICollection.php | 24 - .../CalDAV/Notifications/INode.php | 38 - .../Notifications/INotificationType.php | 44 - .../CalDAV/Notifications/Node.php | 192 - .../Notifications/Notification/Invite.php | 324 - .../Notification/InviteReply.php | 218 - .../Notification/SystemStatus.php | 182 - .../SabreForRainLoop/CalDAV/Plugin.php | 1338 -- .../CalDAV/Principal/Collection.php | 32 - .../CalDAV/Principal/IProxyRead.php | 19 - .../CalDAV/Principal/IProxyWrite.php | 19 - .../CalDAV/Principal/ProxyRead.php | 180 - .../CalDAV/Principal/ProxyWrite.php | 180 - .../CalDAV/Principal/User.php | 134 - .../CalDAV/Property/AllowedSharingModes.php | 74 - .../CalDAV/Property/Invite.php | 227 - .../Property/ScheduleCalendarTransp.php | 102 - .../SupportedCalendarComponentSet.php | 88 - .../CalDAV/Property/SupportedCalendarData.php | 40 - .../CalDAV/Property/SupportedCollationSet.php | 45 - .../SabreForRainLoop/CalDAV/Schedule/IMip.php | 111 - .../CalDAV/Schedule/IOutbox.php | 16 - .../CalDAV/Schedule/Outbox.php | 163 - .../CalDAV/ShareableCalendar.php | 72 - .../CalDAV/SharedCalendar.php | 116 - .../SabreForRainLoop/CalDAV/SharingPlugin.php | 526 - .../SabreForRainLoop/CalDAV/UserCalendars.php | 342 - .../SabreForRainLoop/CalDAV/Version.php | 24 - .../SabreForRainLoop/CardDAV/AddressBook.php | 315 - .../CardDAV/AddressBookQueryParser.php | 221 - .../CardDAV/AddressBookRoot.php | 80 - .../CardDAV/Backend/AbstractBackend.php | 18 - .../CardDAV/Backend/BackendInterface.php | 166 - .../SabreForRainLoop/CardDAV/Backend/PDO.php | 333 - .../SabreForRainLoop/CardDAV/Card.php | 260 - .../SabreForRainLoop/CardDAV/IAddressBook.php | 20 - .../SabreForRainLoop/CardDAV/ICard.php | 20 - .../SabreForRainLoop/CardDAV/IDirectory.php | 21 - .../SabreForRainLoop/CardDAV/Plugin.php | 706 - .../CardDAV/Property/SupportedAddressData.php | 72 - .../CardDAV/UserAddressBooks.php | 260 - .../CardDAV/VCFExportPlugin.php | 108 - .../SabreForRainLoop/CardDAV/Version.php | 26 - .../DAV/Auth/Backend/AbstractBasic.php | 87 - .../DAV/Auth/Backend/AbstractDigest.php | 101 - .../DAV/Auth/Backend/Apache.php | 63 - .../DAV/Auth/Backend/BackendInterface.php | 36 - .../DAV/Auth/Backend/File.php | 77 - .../SabreForRainLoop/DAV/Auth/Backend/PDO.php | 65 - .../SabreForRainLoop/DAV/Auth/Plugin.php | 112 - .../DAV/Browser/GuessContentType.php | 99 - .../DAV/Browser/MapGetToPropFind.php | 57 - .../SabreForRainLoop/DAV/Browser/Plugin.php | 491 - .../DAV/Browser/assets/favicon.ico | Bin 4286 -> 0 bytes .../DAV/Browser/assets/icons/addressbook.png | Bin 7232 -> 0 bytes .../DAV/Browser/assets/icons/calendar.png | Bin 4388 -> 0 bytes .../DAV/Browser/assets/icons/card.png | Bin 5695 -> 0 bytes .../DAV/Browser/assets/icons/collection.png | Bin 3474 -> 0 bytes .../DAV/Browser/assets/icons/file.png | Bin 2837 -> 0 bytes .../DAV/Browser/assets/icons/parent.png | Bin 3474 -> 0 bytes .../DAV/Browser/assets/icons/principal.png | Bin 5480 -> 0 bytes .../libraries/SabreForRainLoop/DAV/Client.php | 641 - .../SabreForRainLoop/DAV/Collection.php | 110 - .../SabreForRainLoop/DAV/Exception.php | 64 - .../DAV/Exception/BadRequest.php | 28 - .../DAV/Exception/Conflict.php | 28 - .../DAV/Exception/ConflictingLock.php | 37 - .../DAV/Exception/FileNotFound.php | 19 - .../DAV/Exception/Forbidden.php | 27 - .../DAV/Exception/InsufficientStorage.php | 27 - .../DAV/Exception/InvalidResourceType.php | 33 - .../Exception/LockTokenMatchesRequestUri.php | 41 - .../SabreForRainLoop/DAV/Exception/Locked.php | 73 - .../DAV/Exception/MethodNotAllowed.php | 45 - .../DAV/Exception/NotAuthenticated.php | 30 - .../DAV/Exception/NotFound.php | 28 - .../DAV/Exception/NotImplemented.php | 27 - .../DAV/Exception/PaymentRequired.php | 30 - .../DAV/Exception/PreconditionFailed.php | 71 - .../DAV/Exception/ReportNotSupported.php | 32 - .../RequestedRangeNotSatisfiable.php | 31 - .../DAV/Exception/ServiceUnavailable.php | 30 - .../DAV/Exception/UnsupportedMediaType.php | 28 - .../SabreForRainLoop/DAV/FS/Directory.php | 140 - .../SabreForRainLoop/DAV/FS/File.php | 91 - .../SabreForRainLoop/DAV/FS/Node.php | 82 - .../SabreForRainLoop/DAV/FSExt/Directory.php | 159 - .../SabreForRainLoop/DAV/FSExt/File.php | 118 - .../SabreForRainLoop/DAV/FSExt/Node.php | 214 - .../libraries/SabreForRainLoop/DAV/File.php | 85 - .../SabreForRainLoop/DAV/ICollection.php | 77 - .../DAV/IExtendedCollection.php | 28 - .../libraries/SabreForRainLoop/DAV/IFile.php | 77 - .../libraries/SabreForRainLoop/DAV/INode.php | 46 - .../SabreForRainLoop/DAV/IProperties.php | 71 - .../libraries/SabreForRainLoop/DAV/IQuota.php | 27 - .../DAV/Locks/Backend/AbstractBackend.php | 21 - .../DAV/Locks/Backend/BackendInterface.php | 51 - .../SabreForRainLoop/DAV/Locks/Backend/FS.php | 193 - .../DAV/Locks/Backend/File.php | 183 - .../DAV/Locks/Backend/PDO.php | 167 - .../SabreForRainLoop/DAV/Locks/LockInfo.php | 81 - .../SabreForRainLoop/DAV/Locks/Plugin.php | 642 - .../SabreForRainLoop/DAV/Mount/Plugin.php | 83 - .../libraries/SabreForRainLoop/DAV/Node.php | 55 - .../SabreForRainLoop/DAV/ObjectTree.php | 159 - .../DAV/PartialUpdate/IFile.php | 40 - .../DAV/PartialUpdate/Plugin.php | 212 - .../SabreForRainLoop/DAV/Property.php | 31 - .../DAV/Property/GetLastModified.php | 78 - .../SabreForRainLoop/DAV/Property/Href.php | 99 - .../DAV/Property/HrefList.php | 105 - .../SabreForRainLoop/DAV/Property/IHref.php | 25 - .../DAV/Property/LockDiscovery.php | 104 - .../DAV/Property/ResourceType.php | 127 - .../DAV/Property/Response.php | 157 - .../DAV/Property/ResponseList.php | 59 - .../DAV/Property/SupportedLock.php | 78 - .../DAV/Property/SupportedReportSet.php | 111 - .../DAV/PropertyInterface.php | 21 - .../libraries/SabreForRainLoop/DAV/Server.php | 2175 --- .../SabreForRainLoop/DAV/ServerPlugin.php | 90 - .../SabreForRainLoop/DAV/SimpleCollection.php | 108 - .../SabreForRainLoop/DAV/SimpleFile.php | 121 - .../SabreForRainLoop/DAV/StringUtil.php | 91 - .../DAV/TemporaryFileFilterPlugin.php | 289 - .../libraries/SabreForRainLoop/DAV/Tree.php | 193 - .../SabreForRainLoop/DAV/Tree/Filesystem.php | 133 - .../SabreForRainLoop/DAV/URLUtil.php | 121 - .../SabreForRainLoop/DAV/UUIDUtil.php | 64 - .../SabreForRainLoop/DAV/Version.php | 24 - .../SabreForRainLoop/DAV/XMLUtil.php | 187 - .../DAVACL/AbstractPrincipalCollection.php | 155 - .../DAVACL/Exception/AceConflict.php | 35 - .../DAVACL/Exception/NeedPrivileges.php | 83 - .../DAVACL/Exception/NoAbstract.php | 35 - .../Exception/NotRecognizedPrincipal.php | 35 - .../Exception/NotSupportedPrivilege.php | 35 - .../SabreForRainLoop/DAVACL/IACL.php | 74 - .../SabreForRainLoop/DAVACL/IPrincipal.php | 77 - .../DAVACL/IPrincipalCollection.php | 42 - .../SabreForRainLoop/DAVACL/Plugin.php | 1402 -- .../SabreForRainLoop/DAVACL/Principal.php | 281 - .../PrincipalBackend/AbstractBackend.php | 18 - .../PrincipalBackend/BackendInterface.php | 153 - .../DAVACL/PrincipalBackend/PDO.php | 428 - .../DAVACL/PrincipalCollection.php | 33 - .../SabreForRainLoop/DAVACL/Property/Acl.php | 211 - .../DAVACL/Property/AclRestrictions.php | 34 - .../Property/CurrentUserPrivilegeSet.php | 124 - .../DAVACL/Property/Principal.php | 161 - .../DAVACL/Property/SupportedPrivilegeSet.php | 94 - .../SabreForRainLoop/DAVACL/Version.php | 24 - .../SabreForRainLoop/HTTP/AWSAuth.php | 227 - .../SabreForRainLoop/HTTP/AbstractAuth.php | 111 - .../SabreForRainLoop/HTTP/BasicAuth.php | 67 - .../SabreForRainLoop/HTTP/DigestAuth.php | 240 - .../SabreForRainLoop/HTTP/Request.php | 284 - .../SabreForRainLoop/HTTP/Response.php | 175 - .../libraries/SabreForRainLoop/HTTP/Util.php | 82 - .../SabreForRainLoop/HTTP/Version.php | 24 - .../SabreForRainLoop/VObject/Cli.php | 735 - .../SabreForRainLoop/VObject/Component.php | 473 - .../VObject/Component/VAlarm.php | 108 - .../VObject/Component/VCalendar.php | 369 - .../VObject/Component/VCard.php | 353 - .../VObject/Component/VEvent.php | 70 - .../VObject/Component/VFreeBusy.php | 68 - .../VObject/Component/VJournal.php | 46 - .../VObject/Component/VTodo.php | 68 - .../VObject/DateTimeParser.php | 415 - .../SabreForRainLoop/VObject/Document.php | 261 - .../SabreForRainLoop/VObject/ElementList.php | 172 - .../SabreForRainLoop/VObject/EofException.php | 13 - .../VObject/FreeBusyGenerator.php | 322 - .../SabreForRainLoop/VObject/Node.php | 201 - .../SabreForRainLoop/VObject/Parameter.php | 343 - .../VObject/ParseException.php | 12 - .../SabreForRainLoop/VObject/Parser/Json.php | 188 - .../VObject/Parser/MimeDir.php | 602 - .../VObject/Parser/Parser.php | 77 - .../SabreForRainLoop/VObject/Property.php | 502 - .../VObject/Property/Binary.php | 127 - .../VObject/Property/Boolean.php | 63 - .../VObject/Property/FlatText.php | 49 - .../VObject/Property/Float.php | 101 - .../VObject/Property/ICalendar/CalAddress.php | 41 - .../VObject/Property/ICalendar/Date.php | 24 - .../VObject/Property/ICalendar/DateTime.php | 308 - .../VObject/Property/ICalendar/Duration.php | 86 - .../VObject/Property/ICalendar/Period.php | 126 - .../VObject/Property/ICalendar/Recur.php | 189 - .../VObject/Property/Integer.php | 72 - .../VObject/Property/Text.php | 330 - .../VObject/Property/Time.php | 94 - .../VObject/Property/Unknown.php | 50 - .../SabreForRainLoop/VObject/Property/Uri.php | 70 - .../VObject/Property/UtcOffset.php | 37 - .../VObject/Property/VCard/Date.php | 33 - .../VObject/Property/VCard/DateAndOrTime.php | 144 - .../VObject/Property/VCard/DateTime.php | 33 - .../VObject/Property/VCard/LanguageTag.php | 59 - .../VObject/Property/VCard/TimeStamp.php | 69 - .../SabreForRainLoop/VObject/Reader.php | 73 - .../VObject/RecurrenceIterator.php | 1153 -- .../VObject/Splitter/ICalendar.php | 114 - .../VObject/Splitter/SplitterInterface.php | 39 - .../VObject/Splitter/VCard.php | 74 - .../SabreForRainLoop/VObject/StringUtil.php | 61 - .../SabreForRainLoop/VObject/TimeZoneUtil.php | 482 - .../VObject/VCardConverter.php | 382 - .../SabreForRainLoop/VObject/Version.php | 19 - .../SabreForRainLoop/VObject/includes.php | 66 - .../v/1.12.0/app/libraries/lessphp/LICENSE | 660 - .../v/1.12.0/app/libraries/lessphp/README.md | 96 - .../v/1.12.0/app/libraries/lessphp/ctype.php | 40 - .../app/libraries/lessphp/lessc.inc.php | 3479 ----- .../app/libraries/pclzip/_pclzip.lib.php | 5693 -------- .../1.12.0/app/libraries/pclzip/gnu-lgpl.txt | 504 - .../app/libraries/pclzip/pclzip.lib.php | 5719 -------- .../v/1.12.0/app/libraries/pclzip/readme.txt | 421 - .../app/libraries/phpseclib/Crypt/AES.php | 207 - .../app/libraries/phpseclib/Crypt/Base.php | 2011 --- .../libraries/phpseclib/Crypt/Blowfish.php | 644 - .../app/libraries/phpseclib/Crypt/DES.php | 1506 -- .../app/libraries/phpseclib/Crypt/Hash.php | 841 -- .../app/libraries/phpseclib/Crypt/RC2.php | 652 - .../app/libraries/phpseclib/Crypt/RC4.php | 329 - .../app/libraries/phpseclib/Crypt/RSA.php | 2997 ---- .../app/libraries/phpseclib/Crypt/Random.php | 300 - .../libraries/phpseclib/Crypt/Rijndael.php | 1348 -- .../libraries/phpseclib/Crypt/TripleDES.php | 428 - .../app/libraries/phpseclib/Crypt/Twofish.php | 895 -- .../app/libraries/phpseclib/File/ANSI.php | 559 - .../app/libraries/phpseclib/File/ASN1.php | 1358 -- .../app/libraries/phpseclib/File/X509.php | 4583 ------ .../libraries/phpseclib/Math/BigInteger.php | 3758 ----- .../app/libraries/phpseclib/Net/SCP.php | 360 - .../app/libraries/phpseclib/Net/SFTP.php | 2778 ---- .../libraries/phpseclib/Net/SFTP/Stream.php | 801 -- .../app/libraries/phpseclib/Net/SSH1.php | 1651 --- .../app/libraries/phpseclib/Net/SSH2.php | 3878 ------ .../libraries/phpseclib/System/SSH/Agent.php | 313 - .../libraries/phpseclib/System/SSH_Agent.php | 39 - .../app/libraries/phpseclib/openssl.cnf | 6 - .../v/1.12.0/app/libraries/spyc/COPYING | 21 - .../v/1.12.0/app/libraries/spyc/README.md | 30 - .../v/1.12.0/app/libraries/spyc/Spyc.php | 1155 -- .../v/1.12.0/app/libraries/spyc/composer.json | 30 - .../v/1.12.0/app/libraries/tmhOAuth/LICENSE | 202 - .../v/1.12.0/app/libraries/tmhOAuth/README.md | 211 - .../1.12.0/app/libraries/tmhOAuth/cacert.pem | 3376 ----- .../app/libraries/tmhOAuth/tmhOAuth.php | 724 - .../app/libraries/tmhOAuth/tmhUtilities.php | 280 - .../rainloop/v/1.12.0/app/localization/README | 1 - .../v/1.12.0/app/localization/admin/README | 1 - .../app/localization/admin/_source.en.yml | 324 - .../v/1.12.0/app/localization/admin/cs_CZ.yml | 316 - .../v/1.12.0/app/localization/admin/da_DK.yml | 323 - .../v/1.12.0/app/localization/admin/de_DE.yml | 325 - .../v/1.12.0/app/localization/admin/en_US.yml | 322 - .../v/1.12.0/app/localization/admin/es_ES.yml | 321 - .../v/1.12.0/app/localization/admin/fa_IR.yml | 325 - .../v/1.12.0/app/localization/admin/fi_FI.yml | 322 - .../v/1.12.0/app/localization/admin/fr_FR.yml | 326 - .../v/1.12.0/app/localization/admin/hu_HU.yml | 322 - .../v/1.12.0/app/localization/admin/it_IT.yml | 326 - .../v/1.12.0/app/localization/admin/ja_JP.yml | 321 - .../v/1.12.0/app/localization/admin/lt_LT.yml | 323 - .../v/1.12.0/app/localization/admin/nb_NO.yml | 323 - .../v/1.12.0/app/localization/admin/nl_NL.yml | 321 - .../v/1.12.0/app/localization/admin/pl_PL.yml | 326 - .../v/1.12.0/app/localization/admin/pt_BR.yml | 323 - .../v/1.12.0/app/localization/admin/ru_RU.yml | 323 - .../v/1.12.0/app/localization/admin/sk_SK.yml | 204 - .../v/1.12.0/app/localization/admin/sl_SI.yml | 323 - .../v/1.12.0/app/localization/admin/sv_SE.yml | 324 - .../v/1.12.0/app/localization/admin/zh_CN.yml | 317 - .../v/1.12.0/app/localization/langs.yml | 91 - .../v/1.12.0/app/localization/moment/af.js | 72 - .../v/1.12.0/app/localization/moment/ar-dz.js | 58 - .../v/1.12.0/app/localization/moment/ar-kw.js | 58 - .../v/1.12.0/app/localization/moment/ar-ly.js | 121 - .../v/1.12.0/app/localization/moment/ar-ma.js | 58 - .../v/1.12.0/app/localization/moment/ar-sa.js | 103 - .../v/1.12.0/app/localization/moment/ar-tn.js | 58 - .../v/1.12.0/app/localization/moment/ar.js | 134 - .../v/1.12.0/app/localization/moment/az.js | 104 - .../v/1.12.0/app/localization/moment/be.js | 131 - .../v/1.12.0/app/localization/moment/bg.js | 89 - .../v/1.12.0/app/localization/moment/bm.js | 57 - .../v/1.12.0/app/localization/moment/bn.js | 118 - .../v/1.12.0/app/localization/moment/bo.js | 118 - .../v/1.12.0/app/localization/moment/br.js | 107 - .../v/1.12.0/app/localization/moment/bs.js | 150 - .../v/1.12.0/app/localization/moment/ca.js | 87 - .../v/1.12.0/app/localization/moment/cs.js | 178 - .../v/1.12.0/app/localization/moment/cv.js | 62 - .../v/1.12.0/app/localization/moment/cy.js | 79 - .../v/1.12.0/app/localization/moment/da.js | 59 - .../v/1.12.0/app/localization/moment/de-at.js | 75 - .../v/1.12.0/app/localization/moment/de-ch.js | 75 - .../v/1.12.0/app/localization/moment/de.js | 75 - .../v/1.12.0/app/localization/moment/dv.js | 98 - .../v/1.12.0/app/localization/moment/el.js | 99 - .../v/1.12.0/app/localization/moment/en-au.js | 66 - .../v/1.12.0/app/localization/moment/en-ca.js | 62 - .../v/1.12.0/app/localization/moment/en-gb.js | 66 - .../v/1.12.0/app/localization/moment/en-ie.js | 66 - .../v/1.12.0/app/localization/moment/en-il.js | 61 - .../v/1.12.0/app/localization/moment/en-nz.js | 66 - .../v/1.12.0/app/localization/moment/eo.js | 70 - .../v/1.12.0/app/localization/moment/es-do.js | 91 - .../v/1.12.0/app/localization/moment/es-us.js | 82 - .../v/1.12.0/app/localization/moment/es.js | 91 - .../v/1.12.0/app/localization/moment/et.js | 79 - .../v/1.12.0/app/localization/moment/eu.js | 65 - .../v/1.12.0/app/localization/moment/fa.js | 105 - .../v/1.12.0/app/localization/moment/fi.js | 108 - .../v/1.12.0/app/localization/moment/fo.js | 59 - .../v/1.12.0/app/localization/moment/fr-ca.js | 73 - .../v/1.12.0/app/localization/moment/fr-ch.js | 77 - .../v/1.12.0/app/localization/moment/fr.js | 82 - .../v/1.12.0/app/localization/moment/fy.js | 74 - .../v/1.12.0/app/localization/moment/gd.js | 75 - .../v/1.12.0/app/localization/moment/gl.js | 76 - .../app/localization/moment/gom-latn.js | 122 - .../v/1.12.0/app/localization/moment/gu.js | 123 - .../v/1.12.0/app/localization/moment/he.js | 96 - .../v/1.12.0/app/localization/moment/hi.js | 123 - .../v/1.12.0/app/localization/moment/hr.js | 153 - .../v/1.12.0/app/localization/moment/hu.js | 109 - .../v/1.12.0/app/localization/moment/hy-am.js | 94 - .../v/1.12.0/app/localization/moment/id.js | 81 - .../v/1.12.0/app/localization/moment/is.js | 131 - .../v/1.12.0/app/localization/moment/it.js | 68 - .../v/1.12.0/app/localization/moment/ja.js | 91 - .../v/1.12.0/app/localization/moment/jv.js | 81 - .../v/1.12.0/app/localization/moment/ka.js | 88 - .../v/1.12.0/app/localization/moment/kk.js | 86 - .../v/1.12.0/app/localization/moment/km.js | 109 - .../v/1.12.0/app/localization/moment/kn.js | 125 - .../v/1.12.0/app/localization/moment/ko.js | 80 - .../v/1.12.0/app/localization/moment/ky.js | 86 - .../v/1.12.0/app/localization/moment/lb.js | 135 - .../v/1.12.0/app/localization/moment/lo.js | 69 - .../v/1.12.0/app/localization/moment/lt.js | 117 - .../v/1.12.0/app/localization/moment/lv.js | 96 - .../v/1.12.0/app/localization/moment/me.js | 111 - .../v/1.12.0/app/localization/moment/mi.js | 63 - .../v/1.12.0/app/localization/moment/mk.js | 89 - .../v/1.12.0/app/localization/moment/ml.js | 80 - .../v/1.12.0/app/localization/moment/mn.js | 103 - .../v/1.12.0/app/localization/moment/mr.js | 159 - .../v/1.12.0/app/localization/moment/ms-my.js | 81 - .../v/1.12.0/app/localization/moment/ms.js | 81 - .../v/1.12.0/app/localization/moment/mt.js | 59 - .../v/1.12.0/app/localization/moment/my.js | 92 - .../v/1.12.0/app/localization/moment/nb.js | 61 - .../v/1.12.0/app/localization/moment/ne.js | 122 - .../v/1.12.0/app/localization/moment/nl-be.js | 86 - .../v/1.12.0/app/localization/moment/nl.js | 86 - .../v/1.12.0/app/localization/moment/nn.js | 59 - .../v/1.12.0/app/localization/moment/pa-in.js | 123 - .../v/1.12.0/app/localization/moment/pl.js | 125 - .../v/1.12.0/app/localization/moment/pt-br.js | 60 - .../v/1.12.0/app/localization/moment/pt.js | 64 - .../v/1.12.0/app/localization/moment/ro.js | 74 - .../v/1.12.0/app/localization/moment/ru.js | 181 - .../v/1.12.0/app/localization/moment/sd.js | 97 - .../v/1.12.0/app/localization/moment/se.js | 59 - .../v/1.12.0/app/localization/moment/si.js | 70 - .../v/1.12.0/app/localization/moment/sk.js | 155 - .../v/1.12.0/app/localization/moment/sl.js | 172 - .../v/1.12.0/app/localization/moment/sq.js | 67 - .../1.12.0/app/localization/moment/sr-cyrl.js | 110 - .../v/1.12.0/app/localization/moment/sr.js | 110 - .../v/1.12.0/app/localization/moment/ss.js | 87 - .../v/1.12.0/app/localization/moment/sv.js | 68 - .../v/1.12.0/app/localization/moment/sw.js | 58 - .../v/1.12.0/app/localization/moment/ta.js | 128 - .../v/1.12.0/app/localization/moment/te.js | 88 - .../v/1.12.0/app/localization/moment/tet.js | 66 - .../v/1.12.0/app/localization/moment/tg.js | 115 - .../v/1.12.0/app/localization/moment/th.js | 66 - .../v/1.12.0/app/localization/moment/tl-ph.js | 61 - .../v/1.12.0/app/localization/moment/tlh.js | 121 - .../v/1.12.0/app/localization/moment/tr.js | 93 - .../v/1.12.0/app/localization/moment/tzl.js | 90 - .../app/localization/moment/tzm-latn.js | 57 - .../v/1.12.0/app/localization/moment/tzm.js | 57 - .../v/1.12.0/app/localization/moment/ug-cn.js | 118 - .../v/1.12.0/app/localization/moment/uk.js | 150 - .../v/1.12.0/app/localization/moment/ur.js | 97 - .../1.12.0/app/localization/moment/uz-latn.js | 57 - .../v/1.12.0/app/localization/moment/uz.js | 57 - .../v/1.12.0/app/localization/moment/vi.js | 78 - .../app/localization/moment/x-pseudo.js | 67 - .../v/1.12.0/app/localization/moment/yo.js | 59 - .../v/1.12.0/app/localization/moment/zh-cn.js | 109 - .../v/1.12.0/app/localization/moment/zh-hk.js | 102 - .../v/1.12.0/app/localization/moment/zh-tw.js | 102 - .../v/1.12.0/app/localization/webmail/README | 1 - .../app/localization/webmail/_source.en.yml | 713 - .../1.12.0/app/localization/webmail/ar_SA.yml | 695 - .../1.12.0/app/localization/webmail/bg_BG.yml | 713 - .../1.12.0/app/localization/webmail/cs_CZ.yml | 704 - .../1.12.0/app/localization/webmail/da_DK.yml | 710 - .../1.12.0/app/localization/webmail/de_DE.yml | 715 - .../1.12.0/app/localization/webmail/el_GR.yml | 547 - .../1.12.0/app/localization/webmail/en_GB.yml | 713 - .../1.12.0/app/localization/webmail/en_US.yml | 713 - .../1.12.0/app/localization/webmail/es_ES.yml | 716 - .../1.12.0/app/localization/webmail/et_EE.yml | 710 - .../1.12.0/app/localization/webmail/fa_IR.yml | 713 - .../1.12.0/app/localization/webmail/fi_FI.yml | 708 - .../1.12.0/app/localization/webmail/fr_FR.yml | 717 - .../1.12.0/app/localization/webmail/hu_HU.yml | 717 - .../1.12.0/app/localization/webmail/id_ID.yml | 713 - .../1.12.0/app/localization/webmail/is_IS.yml | 706 - .../1.12.0/app/localization/webmail/it_IT.yml | 713 - .../1.12.0/app/localization/webmail/ja_JP.yml | 709 - .../1.12.0/app/localization/webmail/ko_KR.yml | 685 - .../1.12.0/app/localization/webmail/lt_LT.yml | 711 - .../1.12.0/app/localization/webmail/lv_LV.yml | 709 - .../1.12.0/app/localization/webmail/nb_NO.yml | 712 - .../1.12.0/app/localization/webmail/nl_NL.yml | 714 - .../1.12.0/app/localization/webmail/pl_PL.yml | 712 - .../1.12.0/app/localization/webmail/pt_BR.yml | 714 - .../1.12.0/app/localization/webmail/pt_PT.yml | 704 - .../1.12.0/app/localization/webmail/ro_RO.yml | 711 - .../1.12.0/app/localization/webmail/ru_RU.yml | 713 - .../1.12.0/app/localization/webmail/sk_SK.yml | 710 - .../1.12.0/app/localization/webmail/sl_SI.yml | 710 - .../1.12.0/app/localization/webmail/sv_SE.yml | 713 - .../1.12.0/app/localization/webmail/tr_TR.yml | 710 - .../1.12.0/app/localization/webmail/uk_UA.yml | 704 - .../1.12.0/app/localization/webmail/zh_CN.yml | 708 - .../1.12.0/app/localization/webmail/zh_TW.yml | 697 - .../v/1.12.0/app/resources/RainLoop.asc | 18 - .../app/resources/images/empty-contact.png | Bin 1881 -> 0 bytes .../resources/images/services/amazon.com.png | Bin 18032 -> 0 bytes .../resources/images/services/apple.com.png | Bin 2461 -> 0 bytes .../resources/images/services/asana.com.png | Bin 995 -> 0 bytes .../resources/images/services/battle.net.png | Bin 3194 -> 0 bytes .../images/services/blizzard.com.png | Bin 3194 -> 0 bytes .../images/services/cnet.online.com.png | Bin 6623 -> 0 bytes .../images/services/connect.asana.com.png | Bin 995 -> 0 bytes .../images/services/e.paypal.com.png | Bin 4545 -> 0 bytes .../app/resources/images/services/ea.com.png | Bin 6157 -> 0 bytes .../resources/images/services/ebay.com.png | Bin 4621 -> 0 bytes .../resources/images/services/em.ea.com.png | Bin 6157 -> 0 bytes .../images/services/email.blizzard.com.png | Bin 3194 -> 0 bytes .../images/services/email.microsoft.com.png | Bin 8348 -> 0 bytes .../images/services/email.skype.com.png | Bin 3435 -> 0 bytes .../images/services/facebook.com.png | Bin 10088 -> 0 bytes .../images/services/facebookmail.com.png | Bin 10088 -> 0 bytes .../resources/images/services/github.com.png | Bin 1884 -> 0 bytes .../resources/images/services/google.com.png | Bin 5949 -> 0 bytes .../images/services/id.apple.com.png | Bin 2461 -> 0 bytes .../images/services/intl.paypal.com.png | Bin 4545 -> 0 bytes .../images/services/microsoft.com.png | Bin 8348 -> 0 bytes .../images/services/microsoftonline.com.png | Bin 8348 -> 0 bytes .../resources/images/services/myspace.com.png | Bin 7553 -> 0 bytes .../images/services/news.myspace.com.png | Bin 7553 -> 0 bytes .../images/services/news.onlive.com.png | Bin 5000 -> 0 bytes .../resources/images/services/onlive.com.png | Bin 5000 -> 0 bytes .../resources/images/services/paypal.com.png | Bin 4545 -> 0 bytes .../images/services/plus.google.com.png | Bin 2952 -> 0 bytes .../services/postmaster.twitter.com.png | Bin 1104 -> 0 bytes .../images/services/reply.ebay.com.png | Bin 4621 -> 0 bytes .../images/services/reply1.ebay.com.png | Bin 4621 -> 0 bytes .../images/services/reply2.ebay.com.png | Bin 4621 -> 0 bytes .../images/services/reply3.ebay.com.png | Bin 4621 -> 0 bytes .../resources/images/services/skype.com.png | Bin 3435 -> 0 bytes .../images/services/steampowered.com.png | Bin 2697 -> 0 bytes .../app/resources/images/services/ted.com.png | Bin 1248 -> 0 bytes .../resources/images/services/twitter.com.png | Bin 1104 -> 0 bytes .../resources/images/services/youtube.com.png | Bin 2336 -> 0 bytes .../v/1.12.0/app/templates/BadBrowser.html | 70 - .../v/1.12.0/app/templates/Error.html | 56 - .../v/1.12.0/app/templates/Index.html | 30 - .../v/1.12.0/app/templates/Social.html | 20 - .../1.12.0/app/templates/Themes/template.less | 357 - .../v/1.12.0/app/templates/Themes/values.less | 69 - .../app/templates/Views/Admin/AdminLogin.html | 50 - .../app/templates/Views/Admin/AdminMenu.html | 24 - .../app/templates/Views/Admin/AdminPane.html | 28 - .../Views/Admin/AdminSettingsAbout.html | 87 - .../Views/Admin/AdminSettingsBranding.html | 250 - .../Views/Admin/AdminSettingsContacts.html | 111 - .../Admin/AdminSettingsDomainListItem.html | 21 - .../Views/Admin/AdminSettingsDomains.html | 30 - .../Views/Admin/AdminSettingsGeneral.html | 181 - .../Views/Admin/AdminSettingsLicensing.html | 87 - .../Views/Admin/AdminSettingsLogin.html | 35 - .../Views/Admin/AdminSettingsPackages.html | 32 - .../Admin/AdminSettingsPackagesListItem.html | 20 - .../Admin/AdminSettingsPackagesTable.html | 9 - .../Admin/AdminSettingsPluginListItem.html | 11 - .../Admin/AdminSettingsPluginProperty.html | 32 - .../Views/Admin/AdminSettingsPlugins.html | 41 - .../Views/Admin/AdminSettingsSecurity.html | 143 - .../Views/Admin/AdminSettingsSocial.html | 194 - .../templates/Views/Admin/PopupsActivate.html | 50 - .../templates/Views/Admin/PopupsDomain.html | 271 - .../Views/Admin/PopupsDomainAlias.html | 53 - .../templates/Views/Admin/PopupsPlugin.html | 41 - .../app/templates/Views/Common/Cmd.html | 10 - .../app/templates/Views/Common/Pagenator.html | 5 - .../app/templates/Views/Common/PopupsAsk.html | 26 - .../Common/PopupsKeyboardShortcutsHelp.html | 90 - .../Views/Common/PopupsLanguages.html | 22 - .../Views/Common/PopupsWelcomePage.html | 22 - .../templates/Views/Components/Checkbox.html | 10 - .../Views/Components/CheckboxClassic.html | 7 - .../Components/CheckboxMaterialDesign.html | 10 - .../app/templates/Views/Components/Date.html | 14 - .../app/templates/Views/Components/Input.html | 14 - .../app/templates/Views/Components/Radio.html | 7 - .../Views/Components/SaveTrigger.html | 3 - .../templates/Views/Components/Select.html | 20 - .../templates/Views/Components/TextArea.html | 9 - .../app/templates/Views/User/About.html | 6 - .../Views/User/ComposeAttachment.html | 19 - .../app/templates/Views/User/Login.html | 149 - .../templates/Views/User/LoginWelcome.html | 5 - .../templates/Views/User/MailFolderList.html | 39 - .../Views/User/MailFolderListItem.html | 12 - .../Views/User/MailFolderListSystemItem.html | 12 - .../templates/Views/User/MailMessageList.html | 218 - .../Views/User/MailMessageListItem.html | 49 - .../MailMessageListItemNoPreviewPane.html | 50 - .../templates/Views/User/MailMessageView.html | 447 - .../app/templates/Views/User/PhotoSwipe.html | 33 - .../templates/Views/User/PopupsAccount.html | 50 - .../Views/User/PopupsAddOpenPgpKey.html | 27 - .../Views/User/PopupsAdvancedSearch.html | 107 - .../templates/Views/User/PopupsCompose.html | 218 - .../Views/User/PopupsComposeOpenPgp.html | 119 - .../templates/Views/User/PopupsContacts.html | 275 - .../templates/Views/User/PopupsFilter.html | 64 - .../Views/User/PopupsFolderClear.html | 34 - .../Views/User/PopupsFolderCreate.html | 42 - .../Views/User/PopupsFolderSystem.html | 63 - .../templates/Views/User/PopupsIdentity.html | 99 - .../Views/User/PopupsMessageOpenPgp.html | 54 - .../Views/User/PopupsNewOpenPgpKey.html | 58 - .../templates/Views/User/PopupsTemplate.html | 44 - .../User/PopupsTwoFactorConfiguration.html | 106 - .../Views/User/PopupsTwoFactorTest.html | 34 - .../Views/User/PopupsViewOpenPgpKey.html | 31 - .../Views/User/PopupsWindowSimpleMessage.html | 121 - .../Views/User/SettingsAccounts.html | 101 - .../Views/User/SettingsChangePassword.html | 48 - .../Views/User/SettingsContacts.html | 64 - .../templates/Views/User/SettingsCustom.html | 3 - .../templates/Views/User/SettingsFilters.html | 106 - .../User/SettingsFiltersActionDiscard.html | 0 .../User/SettingsFiltersActionForward.html | 24 - .../SettingsFiltersActionMoveToFolder.html | 17 - .../Views/User/SettingsFiltersActionNone.html | 0 .../User/SettingsFiltersActionReject.html | 6 - .../User/SettingsFiltersActionVacation.html | 45 - .../User/SettingsFiltersConditionDefault.html | 12 - .../User/SettingsFiltersConditionMore.html | 14 - .../User/SettingsFiltersConditionSize.html | 12 - .../Views/User/SettingsFolderItem.html | 37 - .../templates/Views/User/SettingsFolders.html | 45 - .../templates/Views/User/SettingsGeneral.html | 158 - .../templates/Views/User/SettingsMenu.html | 28 - .../templates/Views/User/SettingsOpenPGP.html | 99 - .../templates/Views/User/SettingsPane.html | 28 - .../Views/User/SettingsSecurity.html | 34 - .../templates/Views/User/SettingsSocial.html | 101 - .../Views/User/SettingsTemplates.html | 48 - .../templates/Views/User/SettingsThemes.html | 44 - .../templates/Views/User/SystemDropDown.html | 101 - .../rainloop/app/rainloop/v/1.12.0/check.php | 42 - .../app/rainloop/v/1.12.0/include.php | 234 - .../rainloop/app/rainloop/v/1.12.0/index.php | 0 .../app/rainloop/v/1.12.0/index.php.root | 19 - .../rainloop/v/1.12.0/static/android-icon.png | Bin 5522 -> 0 bytes .../v/1.12.0/static/apple-touch-icon.png | Bin 832 -> 0 bytes .../v/1.12.0/static/browsers/chrome.gif | Bin 3803 -> 0 bytes .../v/1.12.0/static/browsers/firefox.gif | Bin 4202 -> 0 bytes .../v/1.12.0/static/browsers/opera.gif | Bin 3508 -> 0 bytes .../v/1.12.0/static/browsers/safari.gif | Bin 4876 -> 0 bytes .../v/1.12.0/static/ckeditor/FIXES.txt | 12 - .../v/1.12.0/static/ckeditor/build-config.js | 152 - .../v/1.12.0/static/ckeditor/ckeditor.js | 1010 -- .../v/1.12.0/static/ckeditor/ckeditor.orig.js | 1010 -- .../v/1.12.0/static/ckeditor/config.js | 34 - .../v/1.12.0/static/ckeditor/contents.css | 208 - .../v/1.12.0/static/ckeditor/lang/af.js | 5 - .../v/1.12.0/static/ckeditor/lang/ar.js | 5 - .../v/1.12.0/static/ckeditor/lang/az.js | 5 - .../v/1.12.0/static/ckeditor/lang/bg.js | 5 - .../v/1.12.0/static/ckeditor/lang/bn.js | 5 - .../v/1.12.0/static/ckeditor/lang/bs.js | 5 - .../v/1.12.0/static/ckeditor/lang/ca.js | 5 - .../v/1.12.0/static/ckeditor/lang/cs.js | 5 - .../v/1.12.0/static/ckeditor/lang/cy.js | 5 - .../v/1.12.0/static/ckeditor/lang/da.js | 5 - .../v/1.12.0/static/ckeditor/lang/de-ch.js | 5 - .../v/1.12.0/static/ckeditor/lang/de.js | 5 - .../v/1.12.0/static/ckeditor/lang/el.js | 5 - .../v/1.12.0/static/ckeditor/lang/en-au.js | 5 - .../v/1.12.0/static/ckeditor/lang/en-ca.js | 5 - .../v/1.12.0/static/ckeditor/lang/en-gb.js | 5 - .../v/1.12.0/static/ckeditor/lang/en.js | 5 - .../v/1.12.0/static/ckeditor/lang/eo.js | 5 - .../v/1.12.0/static/ckeditor/lang/es.js | 5 - .../v/1.12.0/static/ckeditor/lang/et.js | 5 - .../v/1.12.0/static/ckeditor/lang/eu.js | 5 - .../v/1.12.0/static/ckeditor/lang/fa.js | 5 - .../v/1.12.0/static/ckeditor/lang/fi.js | 5 - .../v/1.12.0/static/ckeditor/lang/fo.js | 5 - .../v/1.12.0/static/ckeditor/lang/fr-ca.js | 5 - .../v/1.12.0/static/ckeditor/lang/fr.js | 5 - .../v/1.12.0/static/ckeditor/lang/gl.js | 5 - .../v/1.12.0/static/ckeditor/lang/gu.js | 5 - .../v/1.12.0/static/ckeditor/lang/he.js | 5 - .../v/1.12.0/static/ckeditor/lang/hi.js | 5 - .../v/1.12.0/static/ckeditor/lang/hr.js | 5 - .../v/1.12.0/static/ckeditor/lang/hu.js | 5 - .../v/1.12.0/static/ckeditor/lang/id.js | 5 - .../v/1.12.0/static/ckeditor/lang/is.js | 5 - .../v/1.12.0/static/ckeditor/lang/it.js | 5 - .../v/1.12.0/static/ckeditor/lang/ja.js | 5 - .../v/1.12.0/static/ckeditor/lang/ka.js | 5 - .../v/1.12.0/static/ckeditor/lang/km.js | 5 - .../v/1.12.0/static/ckeditor/lang/ko.js | 5 - .../v/1.12.0/static/ckeditor/lang/ku.js | 5 - .../v/1.12.0/static/ckeditor/lang/lt.js | 5 - .../v/1.12.0/static/ckeditor/lang/lv.js | 5 - .../v/1.12.0/static/ckeditor/lang/mk.js | 5 - .../v/1.12.0/static/ckeditor/lang/mn.js | 5 - .../v/1.12.0/static/ckeditor/lang/ms.js | 5 - .../v/1.12.0/static/ckeditor/lang/nb.js | 5 - .../v/1.12.0/static/ckeditor/lang/nl.js | 5 - .../v/1.12.0/static/ckeditor/lang/no.js | 5 - .../v/1.12.0/static/ckeditor/lang/oc.js | 5 - .../v/1.12.0/static/ckeditor/lang/pl.js | 5 - .../v/1.12.0/static/ckeditor/lang/pt-br.js | 5 - .../v/1.12.0/static/ckeditor/lang/pt.js | 5 - .../v/1.12.0/static/ckeditor/lang/ro.js | 5 - .../v/1.12.0/static/ckeditor/lang/ru.js | 5 - .../v/1.12.0/static/ckeditor/lang/si.js | 5 - .../v/1.12.0/static/ckeditor/lang/sk.js | 5 - .../v/1.12.0/static/ckeditor/lang/sl.js | 5 - .../v/1.12.0/static/ckeditor/lang/sq.js | 5 - .../v/1.12.0/static/ckeditor/lang/sr-latn.js | 5 - .../v/1.12.0/static/ckeditor/lang/sr.js | 5 - .../v/1.12.0/static/ckeditor/lang/sv.js | 5 - .../v/1.12.0/static/ckeditor/lang/th.js | 5 - .../v/1.12.0/static/ckeditor/lang/tr.js | 5 - .../v/1.12.0/static/ckeditor/lang/tt.js | 5 - .../v/1.12.0/static/ckeditor/lang/ug.js | 5 - .../v/1.12.0/static/ckeditor/lang/uk.js | 5 - .../v/1.12.0/static/ckeditor/lang/vi.js | 5 - .../v/1.12.0/static/ckeditor/lang/zh-cn.js | 5 - .../v/1.12.0/static/ckeditor/lang/zh.js | 5 - .../ckeditor/plugins/about/dialogs/about.js | 8 - .../about/dialogs/hidpi/logo_ckeditor.png | Bin 13339 -> 0 bytes .../plugins/about/dialogs/logo_ckeditor.png | Bin 6757 -> 0 bytes .../ckeditor/plugins/base64image/LICENSE.md | 1243 -- .../ckeditor/plugins/base64image/README.md | 21 - .../base64image/dialogs/base64image.js | 16 - .../plugins/clipboard/dialogs/paste.js | 12 - .../colordialog/dialogs/colordialog.css | 20 - .../colordialog/dialogs/colordialog.js | 14 - .../plugins/dialog/dialogDefinition.js | 4 - .../1.12.0/static/ckeditor/plugins/icons.png | Bin 5775 -> 0 bytes .../static/ckeditor/plugins/icons_hidpi.png | Bin 17424 -> 0 bytes .../ckeditor/plugins/image/dialogs/image.js | 44 - .../ckeditor/plugins/image/images/noimage.png | Bin 1610 -> 0 bytes .../ckeditor/plugins/image2/dialogs/image2.js | 15 - .../ckeditor/plugins/link/dialogs/anchor.js | 7 - .../ckeditor/plugins/link/dialogs/link.js | 28 - .../ckeditor/plugins/link/images/anchor.png | Bin 752 -> 0 bytes .../plugins/link/images/hidpi/anchor.png | Bin 1109 -> 0 bytes .../plugins/plain/icons/hidpi/plain-rtl.png | Bin 1968 -> 0 bytes .../plugins/plain/icons/hidpi/plain.png | Bin 1999 -> 0 bytes .../plugins/plain/icons/plain-rtl.png | Bin 762 -> 0 bytes .../ckeditor/plugins/plain/icons/plain.png | Bin 764 -> 0 bytes .../static/ckeditor/plugins/plain/plugin.js | 216 - .../ckeditor/plugins/quicktable/CHANGELOG.md | 38 - .../ckeditor/plugins/quicktable/Gruntfile.js | 5 - .../ckeditor/plugins/quicktable/LICENSE | 339 - .../ckeditor/plugins/quicktable/README.md | 52 - .../ckeditor/plugins/quicktable/package.json | 31 - .../ckeditor/plugins/quicktable/template.jst | 469 - .../ckeditor/plugins/signature/plugin.js | 141 - .../ckeditor/plugins/table/dialogs/table.js | 21 - .../ckeditor/plugins/widget/images/handle.png | Bin 220 -> 0 bytes .../ckeditor/skins/moono-lisa/dialog.css | 5 - .../ckeditor/skins/moono-lisa/dialog_ie.css | 5 - .../ckeditor/skins/moono-lisa/dialog_ie8.css | 5 - .../skins/moono-lisa/dialog_iequirks.css | 5 - .../ckeditor/skins/moono-lisa/editor.css | 5 - .../skins/moono-lisa/editor_gecko.css | 5 - .../ckeditor/skins/moono-lisa/editor_ie.css | 5 - .../ckeditor/skins/moono-lisa/editor_ie8.css | 5 - .../skins/moono-lisa/editor_iequirks.css | 5 - .../ckeditor/skins/moono-lisa/icons.png | Bin 5775 -> 0 bytes .../ckeditor/skins/moono-lisa/icons_hidpi.png | Bin 17424 -> 0 bytes .../skins/moono-lisa/images/arrow.png | Bin 191 -> 0 bytes .../skins/moono-lisa/images/close.png | Bin 615 -> 0 bytes .../skins/moono-lisa/images/hidpi/close.png | Bin 1238 -> 0 bytes .../moono-lisa/images/hidpi/lock-open.png | Bin 1071 -> 0 bytes .../skins/moono-lisa/images/hidpi/lock.png | Bin 1062 -> 0 bytes .../skins/moono-lisa/images/hidpi/refresh.png | Bin 1623 -> 0 bytes .../skins/moono-lisa/images/lock-open.png | Bin 511 -> 0 bytes .../ckeditor/skins/moono-lisa/images/lock.png | Bin 506 -> 0 bytes .../skins/moono-lisa/images/refresh.png | Bin 757 -> 0 bytes .../skins/moono-lisa/images/spinner.gif | Bin 2984 -> 0 bytes .../ckeditor/skins/moono-lisa/readme.md | 46 - .../v/1.12.0/static/ckeditor/styles.js | 137 - .../app/rainloop/v/1.12.0/static/css/app.css | 11581 ---------------- .../rainloop/v/1.12.0/static/css/app.min.css | 7 - .../v/1.12.0/static/css/default-skin.png | Bin 1088 -> 0 bytes .../v/1.12.0/static/css/default-skin.svg | 38 - .../rainloop/v/1.12.0/static/css/flags.png | Bin 78832 -> 0 bytes .../rainloop/v/1.12.0/static/css/fonts/lg.eot | Bin 2904 -> 0 bytes .../rainloop/v/1.12.0/static/css/fonts/lg.svg | 42 - .../rainloop/v/1.12.0/static/css/fonts/lg.ttf | Bin 2760 -> 0 bytes .../v/1.12.0/static/css/fonts/lg.woff | Bin 2836 -> 0 bytes .../v/1.12.0/static/css/fonts/rainloop.eot | Bin 19960 -> 0 bytes .../v/1.12.0/static/css/fonts/rainloop.svg | 127 - .../v/1.12.0/static/css/fonts/rainloop.ttf | Bin 19792 -> 0 bytes .../v/1.12.0/static/css/fonts/rainloop.woff | Bin 14128 -> 0 bytes .../v/1.12.0/static/css/images/editor.png | Bin 8395 -> 0 bytes .../static/css/images/empty-contact.png | Bin 1881 -> 0 bytes .../v/1.12.0/static/css/images/grey.png | Bin 109 -> 0 bytes .../css/images/icom-message-notification.png | Bin 832 -> 0 bytes .../v/1.12.0/static/css/images/loading.gif | Bin 869 -> 0 bytes .../static/css/images/rainloop-logo.png | Bin 4750 -> 0 bytes .../v/1.12.0/static/css/images/sync.gif | Bin 847 -> 0 bytes .../v/1.12.0/static/css/images/sync.png | Bin 356 -> 0 bytes .../v/1.12.0/static/css/images/white.png | Bin 110 -> 0 bytes .../v/1.12.0/static/css/img/loading.gif | Bin 869 -> 0 bytes .../rainloop/v/1.12.0/static/css/loading.gif | Bin 869 -> 0 bytes .../v/1.12.0/static/css/preloader.gif | Bin 869 -> 0 bytes .../rainloop/v/1.12.0/static/css/social.css | 448 - .../v/1.12.0/static/css/social.min.css | 1 - .../v/1.12.0/static/favicon-light.ico | Bin 1150 -> 0 bytes .../v/1.12.0/static/favicon-light.png | Bin 866 -> 0 bytes .../app/rainloop/v/1.12.0/static/favicon.ico | Bin 1150 -> 0 bytes .../app/rainloop/v/1.12.0/static/favicon.png | Bin 832 -> 0 bytes .../app/rainloop/v/1.12.0/static/js/admin.js | 1105 -- .../app/rainloop/v/1.12.0/static/js/app.js | 1412 -- .../app/rainloop/v/1.12.0/static/js/boot.js | 494 - .../app/rainloop/v/1.12.0/static/js/libs.js | 4521 ------ .../v/1.12.0/static/js/min/admin.min.js | 1 - .../v/1.12.0/static/js/min/app.min.js | 1 - .../v/1.12.0/static/js/min/boot.min.js | 1 - .../v/1.12.0/static/js/min/libs.min.js | 1 - .../v/1.12.0/static/js/min/openpgp.min.js | 2 - .../static/js/min/openpgp.worker.min.js | 2 - .../rainloop/v/1.12.0/static/manifest.json | 16 - .../v/1.12.0/static/sounds/new-mail.mp3 | Bin 15288 -> 0 bytes .../v/1.12.0/static/sounds/new-mail.ogg | Bin 15090 -> 0 bytes .../v/1.12.0/themes/A/images/background.jpg | Bin 75508 -> 0 bytes .../v/1.12.0/themes/A/images/preview.png | Bin 5569 -> 0 bytes .../rainloop/v/1.12.0/themes/A/styles.less | 55 - .../themes/Blurred/images/background.jpg | Bin 47451 -> 0 bytes .../1.12.0/themes/Blurred/images/preview.png | Bin 6399 -> 0 bytes .../v/1.12.0/themes/Blurred/styles.less | 58 - .../v/1.12.0/themes/Clear/images/preview.png | Bin 961 -> 0 bytes .../v/1.12.0/themes/Clear/styles.less | 3 - .../themes/DarkShine/images/background.jpg | Bin 73258 -> 0 bytes .../themes/DarkShine/images/preview.png | Bin 5322 -> 0 bytes .../v/1.12.0/themes/DarkShine/styles.less | 58 - .../themes/Default/images/background.jpg | Bin 4988 -> 0 bytes .../themes/Default/images/background.png | Bin 37162 -> 0 bytes .../1.12.0/themes/Default/images/preview.png | Bin 5804 -> 0 bytes .../v/1.12.0/themes/Default/styles.less | 57 - .../1.12.0/themes/Linen/images/background.jpg | Bin 7258 -> 0 bytes .../1.12.0/themes/Linen/images/background.png | Bin 15597 -> 0 bytes .../v/1.12.0/themes/Linen/images/preview.png | Bin 3142 -> 0 bytes .../v/1.12.0/themes/Linen/styles.less | 54 - .../1.12.0/themes/Love/images/background.jpg | Bin 84413 -> 0 bytes .../v/1.12.0/themes/Love/images/preview.png | Bin 6458 -> 0 bytes .../rainloop/v/1.12.0/themes/Love/styles.less | 57 - .../rainloop/v/1.12.0/themes/Mobile/ext.less | 18 - .../v/1.12.0/themes/Mobile/images/preview.png | Bin 961 -> 0 bytes .../v/1.12.0/themes/Mobile/styles.less | 3 - .../1.12.0/themes/Snow/images/background.jpg | Bin 115505 -> 0 bytes .../v/1.12.0/themes/Snow/images/preview.png | Bin 5660 -> 0 bytes .../rainloop/v/1.12.0/themes/Snow/styles.less | 57 - .../themes/Squares/images/background.jpg | Bin 33347 -> 0 bytes .../themes/Squares/images/background.png | Bin 58585 -> 0 bytes .../1.12.0/themes/Squares/images/preview.png | Bin 6293 -> 0 bytes .../v/1.12.0/themes/Squares/styles.less | 56 - .../themes/SquaresDark/images/background.jpg | Bin 19418 -> 0 bytes .../themes/SquaresDark/images/background.png | Bin 33147 -> 0 bytes .../themes/SquaresDark/images/preview.png | Bin 4767 -> 0 bytes .../v/1.12.0/themes/SquaresDark/styles.less | 57 - .../themes/Stripes/images/background.jpg | Bin 58007 -> 0 bytes .../1.12.0/themes/Stripes/images/preview.png | Bin 3586 -> 0 bytes .../v/1.12.0/themes/Stripes/styles.less | 56 - .../1.12.0/themes/Wood/images/background.jpg | Bin 39327 -> 0 bytes .../1.12.0/themes/Wood/images/background.png | Bin 150200 -> 0 bytes .../v/1.12.0/themes/Wood/images/preview.png | Bin 11171 -> 0 bytes .../rainloop/v/1.12.0/themes/Wood/styles.less | 57 - .../v/1.12.0/themes/Xv/images/background.jpg | Bin 8556 -> 0 bytes .../v/1.12.0/themes/Xv/images/background.png | Bin 37310 -> 0 bytes .../v/1.12.0/themes/Xv/images/preview.png | Bin 6221 -> 0 bytes .../rainloop/v/1.12.0/themes/Xv/styles.less | 54 - .../core/rainloop/config/apache-config.conf | 32 - .../config/conf-available/security.conf | 74 - .../rainloop/config/copper.opensource.lk.conf | 31 - copper-server/core/rainloop/config/hosts | 8 - .../config/mods-available/proxy_html.conf | 62 - copper-server/core/rainloop/config/ports.conf | 16 - .../core/rainloop/config/scripts/index.html | 6 - .../config/scripts/init_letsencrypt.sh | 6 - .../rainloop/config/scripts/run_apache.sh | 22 - .../config/scripts/run_letsencrypt.sh | 8 - copper-server/core/rainloop/hosts | 8 - copper-server/core/rainloop/tls/cert.pem | 18 - copper-server/core/rainloop/tls/dhparam.pem | 8 - copper-server/core/rainloop/tls/fullchain.pem | 1 - copper-server/core/rainloop/tls/privkey.pem | 6 - copper-server/core/svc-ingress-nginx-lb.yaml | 25 - copper-server/core/tls/cert.pem | 18 - copper-server/core/tls/dhparam.pem | 8 - copper-server/core/tls/fullchain.pem | 1 - copper-server/core/tls/privkey.pem | 6 - copper-server/kubernetes/deployment/deploy.sh | 4 +- .../groupware/horde/config/conf.php | 2 +- copper-server/kubernetes/nginx/frontend.conf | 27 - copper-server/kubernetes/nginx/proxy.conf | 11 - copper-server/kubernetes/services/auth.yaml | 11 - .../kubernetes/services/frontend.yaml | 12 - copper-server/kubernetes/services/hello.yaml | 11 - .../kubernetes/services/monolith.yaml | 14 - .../kubernetes/services/rainloop-servie.yaml | 12 - .../kubernetes/services/rainloop.yaml | 13 - 1630 files changed, 3 insertions(+), 284918 deletions(-) delete mode 100644 copper-server/core/README.md delete mode 100644 copper-server/core/homail.yaml delete mode 100644 copper-server/core/ingress.yaml delete mode 100755 copper-server/core/rainloop/Dockerfile delete mode 100755 copper-server/core/rainloop/README.md delete mode 100644 copper-server/core/rainloop/app/data/INSTALLED delete mode 100644 copper-server/core/rainloop/app/data/SALT.php delete mode 100644 copper-server/core/rainloop/app/data/VERSION delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/cache/23/e3/23e3d58cd184245411d2a84bf33e57162799021f delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/cache/3e/18/3e18609e097b6278b6c17fa9dd6de9db3a729b67 delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/cache/5b/1c/5b1c51ed23b96bde49c865e074352dc9b29808f0 delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/cache/__/th/ar/tharanga_copper_opensource_lk/9c/2b/9c2bfd930fad89419786b5bc0199a4eafd8fe4c8 delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/cache/b8/27/b82792fad72d7b38639e5fc82c113102969af8b7 delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/configs/application.ini delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/configs/plugin-directadmin-change-password.ini delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/configs/plugin-ldap-change-password.ini delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/domains/copper.opensource.lk.ini delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/domains/coppermail.dyndns.org.ini delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/domains/disabled delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/domains/gmail.com.ini delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/domains/outlook.com.ini delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/domains/qq.com.ini delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/domains/yahoo.com.ini delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/ChangePasswordLdapDriver.php delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/LICENSE delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/README delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/VERSION delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/index.php delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin@coppermail.dyndns.org/settings_local delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin_horde@copper.opensource.lk/settings_local delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin_horde@coppermail.dyndns.org/settings_local delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/an/anushka@copper.opensource.lk/settings_local delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ba/bandara@copper.opensource.lk/settings_local delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@copper.opensource.lk/settings_local delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@coppermail.dyndns.org/settings delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@coppermail.dyndns.org/settings_local delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/s_/s_admin@coppermail.dyndns.org/settings_local delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/su/supun@copper.opensource.lk/settings_local delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/te/test@copper.opensource.lk/settings_local delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/te/test@coppermail.dyndns.org/settings_local delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/th/tharanga@copper.opensource.lk/settings_local delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/data/__nobody__/ef/efaeb36a60ef9682802c6a704c2d784d delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/files/ls/lsf@coppermail.dyndns.org/38/87/38871f9f7a2ad0d70b1e51991143db90bfbbb3c2 delete mode 100644 copper-server/core/rainloop/app/data/_data_/_default_/storage/files/ls/lsf@coppermail.dyndns.org/aa/6b/aa6bc308dedb13d95e120aafb590f4645301f8cd delete mode 100644 copper-server/core/rainloop/app/data/index.html delete mode 100644 copper-server/core/rainloop/app/data/index.php delete mode 100755 copper-server/core/rainloop/app/index.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/domains/default.ini.dist delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/domains/disabled delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/domains/gmail.com.ini delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/domains/outlook.com.ini delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/domains/qq.com.ini delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/domains/yahoo.com.ini delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/handle.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Authentication/AccessToken.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Authentication/AccessTokenMetadata.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Authentication/OAuth2Client.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookAuthenticationException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookAuthorizationException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookClientException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookOtherException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookResponseException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookSDKException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookServerException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookThrottleException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Facebook.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookApp.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookBatchRequest.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookBatchResponse.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookClient.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookRequest.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookResponse.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FileUpload/FacebookFile.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FileUpload/FacebookVideo.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FileUpload/Mimetypes.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/Collection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphAchievement.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphAlbum.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphApplication.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphCoverPhoto.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphEdge.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphEvent.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphGroup.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphList.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphLocation.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphNode.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphNodeFactory.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphObject.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphObjectFactory.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphPage.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphPicture.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphSessionInfo.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphUser.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookCanvasHelper.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookJavaScriptHelper.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookPageTabHelper.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookRedirectLoginHelper.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookSignedRequestFromInputHelper.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/GraphRawResponse.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/RequestBodyInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/RequestBodyMultipart.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/RequestBodyUrlEncoded.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookCurl.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookCurlHttpClient.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookGuzzleHttpClient.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookHttpClientInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookStream.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookStreamHttpClient.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/certs/DigiCertHighAssuranceEVRootCA.pem delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/FacebookMemoryPersistentDataHandler.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/FacebookSessionPersistentDataHandler.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/PersistentDataInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/McryptPseudoRandomStringGenerator.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/OpenSslPseudoRandomStringGenerator.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/PseudoRandomStringGeneratorInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/PseudoRandomStringGeneratorTrait.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/UrandomPseudoRandomStringGenerator.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/SignedRequest.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/FacebookUrlDetectionHandler.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/FacebookUrlManipulator.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/UrlDetectionInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/autoload.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/AdapterInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/BatchContext.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlAdapter.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlFactory.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/MultiAdapter.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/RequestMediator.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/FakeParallelAdapter.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/MockAdapter.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/ParallelAdapterInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/StreamAdapter.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/StreamingProxyAdapter.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Transaction.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/TransactionInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/TransactionIterator.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Client.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/ClientInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Collection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/CookieJar.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/CookieJarInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/FileCookieJar.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/SessionCookieJar.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/SetCookie.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractEvent.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractRequestEvent.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractTransferEvent.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/BeforeEvent.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/CompleteEvent.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/Emitter.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/EmitterInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/ErrorEvent.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/EventInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/HasEmitterInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/HasEmitterTrait.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/HeadersEvent.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/ListenerAttacherTrait.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/RequestEvents.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/SubscriberInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/AdapterException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/BadResponseException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/ClientException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/CouldNotRewindStreamException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/ParseException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/RequestException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/ServerException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/TooManyRedirectsException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/TransferException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/HasDataTrait.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/AbstractMessage.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageFactory.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageFactoryInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageParser.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/Request.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/RequestInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/Response.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/ResponseInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Mimetypes.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/MultipartBody.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostBody.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostBodyInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostFile.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostFileInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Query.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Cookie.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/History.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/HttpError.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Mock.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Prepare.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Redirect.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/ToArrayInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/UriTemplate.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Url.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/cacert.pem delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/functions.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Draw/DrawerInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Effects/EffectsInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/Exception.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/InvalidArgumentException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/NotSupportedException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/OutOfBoundsException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/RuntimeException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Border.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Canvas.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Grayscale.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/OnPixelBased.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/RelativeResize.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/ApplyMask.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Autorotate.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Copy.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Crop.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Fill.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/FlipHorizontally.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/FlipVertically.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Paste.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Resize.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Rotate.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Save.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Show.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Strip.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Thumbnail.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/WebOptimization.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/FilterInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/ImagineAware.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Transformation.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Drawer.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Effects.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Font.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Image.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Imagine.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Layers.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Drawer.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Effects.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Font.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Image.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Imagine.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Layers.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractFont.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractImage.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractImagine.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractLayers.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Box.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/BoxInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/FillInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Horizontal.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Linear.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Vertical.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/FontInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Histogram/Bucket.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Histogram/Range.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ImageInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ImagineInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/LayersInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ManipulatorInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/AbstractMetadataReader.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/DefaultMetadataReader.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/ExifMetadataReader.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/MetadataBag.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/MetadataReaderInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/CMYK.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/CMYK.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/ColorInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/Gray.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/RGB.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/ColorParser.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Grayscale.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/PaletteInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/RGB.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Point.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Point/Center.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/PointInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Profile.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ProfileInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Drawer.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Effects.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Font.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Image.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Imagine.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Layers.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Collection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Crypt.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/DateTimeHelper.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Enumerations/Charset.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Enumerations/Encoding.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Exceptions/Exception.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Exceptions/InvalidArgumentException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/HtmlUtils.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Http.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/LinkFinder.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Loader.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/ResourceRegistry.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/Binary.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/Literal.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/SubStreams.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/TempFile.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/Test.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Utils.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Validator.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/CacheClient.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/DriverInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/APC.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/File.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/Memcache.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/Redis.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Config.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Hooks.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/BodyStructure.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/FetchType.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/FolderResponseStatus.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/FolderStatus.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/FolderType.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/MessageFlag.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/ResponseStatus.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/ResponseType.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/StoreAction.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/Exception.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/InvalidResponseException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/LoginBadCredentialsException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/LoginBadMethodException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/LoginException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/NegativeResponseException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/ResponseException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/ResponseNotFoundException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/RuntimeException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/FetchResponse.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Folder.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/FolderInformation.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/ImapClient.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/NamespaceResult.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Response.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/LICENSE delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Driver.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Callback.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/File.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Inline.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Syslog.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Enumerations/Type.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Logger.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Attachment.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/AttachmentCollection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Exceptions/Exception.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Exceptions/NonEmptyFolder.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Exceptions/RuntimeException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Folder.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/FolderCollection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/MailClient.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Message.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/MessageCollection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/MailSo.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Attachment.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/AttachmentCollection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Email.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/EmailCollection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/EmailDep.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Enumerations/Constants.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Enumerations/DkimStatus.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Enumerations/Header.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Enumerations/MessagePriority.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Enumerations/MimeType.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Enumerations/Parameter.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Enumerations/Sensitivity.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Header.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/HeaderCollection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Message.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Parameter.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/ParameterCollection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Parser/ParserEmpty.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Parser/ParserInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Parser/ParserMemory.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Part.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/PartCollection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Enumerations/ConnectionSecurityType.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/ConnectionException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/Exception.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/InvalidArgumentException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketAlreadyConnectedException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketCanNotConnectToHostException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketConnectionDoesNotAvailableException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketReadException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketReadTimeoutException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketUnreadBufferException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketUnsuppoterdSecureConnectionException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketWriteException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/NetClient.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/Exception.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/LoginBadCredentialsException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/NegativeResponseException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/ResponseException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/RuntimeException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Pop3Client.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/Exception.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/LoginBadCredentialsException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/NegativeResponseException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/ResponseException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/RuntimeException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/PoppassdClient.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/Exception.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/LoginBadCredentialsException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/LoginBadMethodException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/LoginException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/NegativeResponseException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/ResponseException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/RuntimeException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/ManageSieveClient.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/Exception.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/LoginBadCredentialsException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/LoginBadMethodException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/LoginException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/NegativeResponseException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/ResponseException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/RuntimeException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/SmtpClient.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Vendors/Net/IDNA2.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Vendors/Net/IDNA2CustomExceptions.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Version.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/LICENSE.txt delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/Mobile_Detect.json delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/Mobile_Detect.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/README.md delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/composer.json delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/namespaced/Detection/MobileDetect.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/ruleset.xml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/Client.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/GrantType/AuthorizationCode.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/GrantType/ClientCredentials.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/GrantType/IGrantType.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/GrantType/Password.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/GrantType/RefreshToken.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/README delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPGangsta/GoogleAuthenticator.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/GD.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/PHPThumb.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/PluginInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/Plugins/Reflection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Autoloader.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Client.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientContextInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/ClusterStrategy.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/DistributorInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/EmptyRingException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/HashRing.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/KetamaRing.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Hash/CRC16.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Hash/HashGeneratorInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/PredisStrategy.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/RedisStrategy.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/StrategyInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/CursorBasedIterator.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/HashKey.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/Keyspace.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/ListKey.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/SetKey.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/SortedSetKey.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Command.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/CommandInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionAuth.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionEcho.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionPing.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionQuit.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionSelect.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashDelete.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashExists.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGet.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGetAll.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGetMultiple.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashIncrementBy.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashIncrementByFloat.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashKeys.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashLength.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashScan.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSet.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSetMultiple.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSetPreserve.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashStringLength.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashValues.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogAdd.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogCount.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogMerge.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyDelete.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyDump.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExists.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExpire.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExpireAt.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyKeys.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyMigrate.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyMove.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPersist.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseExpire.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseExpireAt.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseTimeToLive.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRandom.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRename.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRenamePreserve.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRestore.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyScan.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeySort.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyTimeToLive.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyType.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListIndex.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListInsert.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListLength.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopFirst.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopFirstBlocking.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLast.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastBlocking.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastPushHead.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastPushHeadBlocking.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushHead.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushHeadX.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushTail.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushTailX.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListRange.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListRemove.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListSet.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListTrim.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PrefixableCommandInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/KeyPrefixProcessor.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/ProcessorChain.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/ProcessorInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubPublish.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubPubsub.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubSubscribe.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubSubscribeByPattern.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubUnsubscribe.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubUnsubscribeByPattern.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/RawCommand.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ScriptCommand.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerBackgroundRewriteAOF.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerBackgroundSave.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerClient.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerCommand.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerConfig.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerDatabaseSize.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerEval.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerEvalSHA.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerFlushAll.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerFlushDatabase.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerInfo.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerInfoV26x.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerLastSave.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerMonitor.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerObject.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSave.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerScript.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSentinel.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerShutdown.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSlaveOf.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSlowlog.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerTime.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetAdd.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetCardinality.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetDifference.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetDifferenceStore.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIntersection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIntersectionStore.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIsMember.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetMembers.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetMove.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetPop.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetRandomMember.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetRemove.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetScan.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetUnion.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetUnionStore.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringAppend.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitCount.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitOp.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitPos.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringDecrement.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringDecrementBy.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGet.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetBit.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetMultiple.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetRange.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetSet.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrement.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrementBy.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrementByFloat.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringPreciseSetExpire.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSet.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetBit.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetExpire.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetMultiple.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetMultiplePreserve.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetPreserve.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetRange.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringStrlen.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSubstr.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionDiscard.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionExec.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionMulti.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionUnwatch.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionWatch.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetAdd.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetCardinality.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetCount.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetIncrementBy.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetIntersectionStore.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetLexCount.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRange.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRangeByLex.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRangeByScore.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRank.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemove.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByLex.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByRank.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByScore.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRange.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRangeByLex.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRangeByScore.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRank.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetScan.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetScore.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetUnionStore.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/CommunicationException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ClusterOption.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ConnectionFactoryOption.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ExceptionsOption.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/OptionInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/Options.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/OptionsInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/PrefixOption.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ProfileOption.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ReplicationOption.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/AbstractConnection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/ClusterInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/MasterSlaveReplication.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/PredisCluster.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/RedisCluster.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/ReplicationInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/AggregateConnectionInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/CompositeConnectionInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/CompositeStreamConnection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ConnectionException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ConnectionInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Factory.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/FactoryInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/NodeConnectionInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Parameters.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ParametersInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/PhpiredisSocketConnection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/PhpiredisStreamConnection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/StreamConnection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/WebdisConnection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Monitor/Consumer.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/NotSupportedException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/Atomic.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/ConnectionErrorProof.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/FireAndForget.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/Pipeline.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PredisException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/Factory.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/ProfileInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisProfile.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisUnstable.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion200.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion220.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion240.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion260.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion280.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion300.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ProtocolException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ProtocolProcessorInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/RequestSerializerInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ResponseReaderInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/CompositeProtocolProcessor.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/BulkResponse.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/ErrorResponse.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/IntegerResponse.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/MultiBulkResponse.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/ResponseHandlerInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/StatusResponse.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/StreamableMultiBulkResponse.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/ProtocolProcessor.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/RequestSerializer.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/ResponseReader.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/AbstractConsumer.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/Consumer.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/DispatcherLoop.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Replication/ReplicationStrategy.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Error.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ErrorInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulk.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulkIterator.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulkTuple.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ResponseInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ServerException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Status.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Session/Handler.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/AbortedMultiExecException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/MultiExec.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/MultiExecState.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Actions.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Api.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Common/BackwardCapability/Account.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Common/FacebookRainLoopPersistentDataHandler.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Common/MbStringFix.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Common/PdoAbstract.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Common/RainLoopFacebookRedirectLoginHelper.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Config/AbstractConfig.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Config/Application.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Config/Plugin.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Enumerations/Capa.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Enumerations/Layout.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Enumerations/PluginPropertyType.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Enumerations/SignMeType.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Enumerations/TimeFormat.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Enumerations/UploadClientError.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Enumerations/UploadError.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Exceptions/ClientException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Exceptions/Exception.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Exceptions/InvalidArgumentException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Exceptions/RuntimeException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/KeyPathHelper.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Model/Account.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Model/Domain.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Model/Identity.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Model/Template.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Notifications.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Plugins/AbstractPlugin.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Plugins/Helper.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Plugins/Manager.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Plugins/Property.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/AbstractProvider.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/AddressBook.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/AddressBook/AddressBookInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/AddressBook/Classes/Contact.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/AddressBook/Classes/Property.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/AddressBook/Classes/Tag.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/AddressBook/Enumerations/PropertyType.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/AddressBook/PdoAddressBook.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/ChangePassword.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/ChangePassword/ChangePasswordInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Domain.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Domain/DefaultDomain.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Domain/DomainAdminInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Domain/DomainInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Files.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Files/FileStorage.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Files/IFiles.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Filters.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Filters/Classes/Filter.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Filters/Classes/FilterCondition.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ActionType.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ConditionField.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ConditionType.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ConditionsType.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Filters/FiltersInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Filters/SieveStorage.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Settings.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Settings/DefaultSettings.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Settings/ISettings.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Storage.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Storage/Enumerations/StorageType.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Storage/FileStorage.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Storage/IStorage.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Storage/TemproryApcStorage.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Suggestions.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Suggestions/ISuggestions.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Suggestions/OwnCloudSuggestions.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/Suggestions/TestSuggestions.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/TwoFactorAuth.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/TwoFactorAuth/AbstractTwoFactorAuth.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/TwoFactorAuth/GoogleTwoFactorAuth.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Providers/TwoFactorAuth/TwoFactorAuthInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Service.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/ServiceActions.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Settings.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Social.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Utils.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/AbstractBackend.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/BackendInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/NotificationSupport.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/PDO.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/SharingSupport.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Calendar.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarObject.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarQueryParser.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarQueryValidator.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarRootNode.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Exception/InvalidComponentType.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ICSExportPlugin.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ICalendar.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ICalendarObject.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/IShareableCalendar.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ISharedCalendar.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Collection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/ICollection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/INode.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/INotificationType.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Node.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/Invite.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/InviteReply.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/SystemStatus.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Plugin.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/Collection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/IProxyRead.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/IProxyWrite.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/ProxyRead.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/ProxyWrite.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/User.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/AllowedSharingModes.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/Invite.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/ScheduleCalendarTransp.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCalendarComponentSet.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCalendarData.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCollationSet.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Schedule/IMip.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Schedule/IOutbox.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Schedule/Outbox.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ShareableCalendar.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/SharedCalendar.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/SharingPlugin.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/UserCalendars.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Version.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/AddressBook.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/AddressBookQueryParser.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/AddressBookRoot.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Backend/AbstractBackend.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Backend/BackendInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Backend/PDO.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Card.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/IAddressBook.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/ICard.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/IDirectory.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Plugin.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Property/SupportedAddressData.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/UserAddressBooks.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/VCFExportPlugin.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Version.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/AbstractBasic.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/AbstractDigest.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/Apache.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/BackendInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/File.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/PDO.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Plugin.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/GuessContentType.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/MapGetToPropFind.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/Plugin.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/favicon.ico delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/addressbook.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/calendar.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/card.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/collection.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/file.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/parent.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/principal.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Client.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Collection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/BadRequest.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/Conflict.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/ConflictingLock.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/FileNotFound.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/Forbidden.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/InsufficientStorage.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/InvalidResourceType.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/LockTokenMatchesRequestUri.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/Locked.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/MethodNotAllowed.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/NotAuthenticated.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/NotFound.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/NotImplemented.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/PaymentRequired.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/PreconditionFailed.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/ReportNotSupported.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/RequestedRangeNotSatisfiable.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/ServiceUnavailable.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/UnsupportedMediaType.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FS/Directory.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FS/File.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FS/Node.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/Directory.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/File.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/Node.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/File.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/ICollection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/IExtendedCollection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/IFile.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/INode.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/IProperties.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/IQuota.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/AbstractBackend.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/BackendInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/FS.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/File.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/PDO.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/LockInfo.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Plugin.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Mount/Plugin.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Node.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/ObjectTree.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/PartialUpdate/IFile.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/PartialUpdate/Plugin.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/GetLastModified.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/Href.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/HrefList.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/IHref.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/LockDiscovery.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/ResourceType.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/Response.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/ResponseList.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/SupportedLock.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/SupportedReportSet.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/PropertyInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Server.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/ServerPlugin.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/SimpleCollection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/SimpleFile.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/StringUtil.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/TemporaryFileFilterPlugin.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Tree.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Tree/Filesystem.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/URLUtil.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/UUIDUtil.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Version.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/XMLUtil.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/AbstractPrincipalCollection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/AceConflict.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NeedPrivileges.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NoAbstract.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NotRecognizedPrincipal.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NotSupportedPrivilege.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/IACL.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/IPrincipal.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/IPrincipalCollection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Plugin.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Principal.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalBackend/AbstractBackend.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalBackend/BackendInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalBackend/PDO.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalCollection.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/Acl.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/AclRestrictions.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/CurrentUserPrivilegeSet.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/Principal.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/SupportedPrivilegeSet.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Version.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/AWSAuth.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/AbstractAuth.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/BasicAuth.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/DigestAuth.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Request.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Response.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Util.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Version.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Cli.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VAlarm.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VCalendar.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VCard.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VEvent.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VFreeBusy.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VJournal.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VTodo.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/DateTimeParser.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Document.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/ElementList.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/EofException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/FreeBusyGenerator.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Node.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parameter.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/ParseException.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parser/Json.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parser/MimeDir.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parser/Parser.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Binary.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Boolean.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/FlatText.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Float.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/CalAddress.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Date.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/DateTime.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Duration.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Period.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Recur.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Integer.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Text.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Time.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Unknown.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Uri.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/UtcOffset.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/Date.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/DateAndOrTime.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/DateTime.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/LanguageTag.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/TimeStamp.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Reader.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/RecurrenceIterator.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Splitter/ICalendar.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Splitter/SplitterInterface.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Splitter/VCard.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/StringUtil.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/TimeZoneUtil.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/VCardConverter.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Version.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/includes.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/lessphp/LICENSE delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/lessphp/README.md delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/lessphp/ctype.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/lessphp/lessc.inc.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/_pclzip.lib.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/gnu-lgpl.txt delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/pclzip.lib.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/readme.txt delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/AES.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Base.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Blowfish.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/DES.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Hash.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RC2.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RC4.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RSA.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Random.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Rijndael.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/TripleDES.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Twofish.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/ANSI.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/ASN1.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/X509.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Math/BigInteger.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SCP.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SFTP.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SFTP/Stream.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SSH1.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SSH2.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/System/SSH/Agent.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/System/SSH_Agent.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/openssl.cnf delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/COPYING delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/README.md delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/Spyc.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/composer.json delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/LICENSE delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/README.md delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/cacert.pem delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/tmhOAuth.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/tmhUtilities.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/README delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/README delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/_source.en.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/cs_CZ.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/da_DK.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/de_DE.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/en_US.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/es_ES.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fa_IR.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fi_FI.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fr_FR.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/hu_HU.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/it_IT.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/ja_JP.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/lt_LT.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/nb_NO.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/nl_NL.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/pl_PL.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/pt_BR.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/ru_RU.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sk_SK.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sl_SI.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sv_SE.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/zh_CN.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/langs.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/af.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-dz.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-kw.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-ly.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-ma.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-sa.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-tn.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/az.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/be.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bg.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bm.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bn.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bo.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/br.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bs.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ca.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cs.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cv.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cy.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/da.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de-at.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de-ch.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/dv.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/el.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-au.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-ca.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-gb.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-ie.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-il.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-nz.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/eo.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es-do.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es-us.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/et.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/eu.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fa.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fi.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fo.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr-ca.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr-ch.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fy.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gd.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gl.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gom-latn.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gu.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/he.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hi.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hr.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hu.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hy-am.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/id.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/is.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/it.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ja.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/jv.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ka.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/kk.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/km.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/kn.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ko.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ky.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lb.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lo.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lt.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lv.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/me.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mi.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mk.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ml.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mn.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mr.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ms-my.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ms.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mt.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/my.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nb.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ne.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nl-be.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nl.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nn.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pa-in.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pl.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pt-br.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pt.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ro.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ru.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sd.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/se.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/si.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sk.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sl.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sq.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sr-cyrl.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sr.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ss.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sv.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sw.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ta.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/te.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tet.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tg.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/th.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tl-ph.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tlh.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tr.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzl.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzm-latn.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzm.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ug-cn.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uk.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ur.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uz-latn.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uz.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/vi.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/x-pseudo.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/yo.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-cn.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-hk.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-tw.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/README delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/_source.en.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ar_SA.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/bg_BG.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/cs_CZ.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/da_DK.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/de_DE.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/el_GR.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/en_GB.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/en_US.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/es_ES.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/et_EE.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fa_IR.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fi_FI.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fr_FR.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/hu_HU.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/id_ID.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/is_IS.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/it_IT.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ja_JP.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ko_KR.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/lt_LT.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/lv_LV.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/nb_NO.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/nl_NL.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pl_PL.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pt_BR.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pt_PT.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ro_RO.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ru_RU.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sk_SK.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sl_SI.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sv_SE.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/tr_TR.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/uk_UA.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/zh_CN.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/zh_TW.yml delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/RainLoop.asc delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/empty-contact.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/amazon.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/apple.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/asana.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/battle.net.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/blizzard.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/cnet.online.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/connect.asana.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/e.paypal.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/ea.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/ebay.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/em.ea.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/email.blizzard.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/email.microsoft.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/email.skype.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/facebook.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/facebookmail.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/github.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/google.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/id.apple.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/intl.paypal.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/microsoft.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/microsoftonline.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/myspace.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/news.myspace.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/news.onlive.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/onlive.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/paypal.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/plus.google.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/postmaster.twitter.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/reply.ebay.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/reply1.ebay.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/reply2.ebay.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/reply3.ebay.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/skype.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/steampowered.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/ted.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/twitter.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/youtube.com.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/BadBrowser.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Error.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Index.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Social.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Themes/template.less delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Themes/values.less delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminLogin.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminMenu.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminPane.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsAbout.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsBranding.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsContacts.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsDomainListItem.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsDomains.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsGeneral.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsLicensing.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsLogin.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsPackages.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsPackagesListItem.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsPackagesTable.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsPluginListItem.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsPluginProperty.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsPlugins.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsSecurity.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminSettingsSocial.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/PopupsActivate.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/PopupsDomain.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/PopupsDomainAlias.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/PopupsPlugin.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Common/Cmd.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Common/Pagenator.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Common/PopupsAsk.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Common/PopupsKeyboardShortcutsHelp.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Common/PopupsLanguages.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Common/PopupsWelcomePage.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Components/Checkbox.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Components/CheckboxClassic.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Components/CheckboxMaterialDesign.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Components/Date.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Components/Input.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Components/Radio.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Components/SaveTrigger.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Components/Select.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Components/TextArea.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/About.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/ComposeAttachment.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/Login.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/LoginWelcome.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/MailFolderList.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/MailFolderListItem.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/MailFolderListSystemItem.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/MailMessageList.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/MailMessageListItem.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/MailMessageListItemNoPreviewPane.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/MailMessageView.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PhotoSwipe.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsAccount.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsAddOpenPgpKey.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsAdvancedSearch.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsCompose.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsComposeOpenPgp.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsContacts.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsFilter.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsFolderClear.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsFolderCreate.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsFolderSystem.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsIdentity.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsMessageOpenPgp.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsNewOpenPgpKey.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsTemplate.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsTwoFactorConfiguration.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsTwoFactorTest.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsViewOpenPgpKey.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/PopupsWindowSimpleMessage.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsAccounts.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsChangePassword.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsContacts.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsCustom.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFilters.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFiltersActionDiscard.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFiltersActionForward.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFiltersActionMoveToFolder.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFiltersActionNone.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFiltersActionReject.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFiltersActionVacation.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFiltersConditionDefault.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFiltersConditionMore.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFiltersConditionSize.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFolderItem.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsFolders.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsGeneral.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsMenu.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsOpenPGP.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsPane.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsSecurity.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsSocial.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsTemplates.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsThemes.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SystemDropDown.html delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/check.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/include.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/index.php delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/index.php.root delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/android-icon.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/apple-touch-icon.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/browsers/chrome.gif delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/browsers/firefox.gif delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/browsers/opera.gif delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/browsers/safari.gif delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/FIXES.txt delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/build-config.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/ckeditor.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/ckeditor.orig.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/config.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/contents.css delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/af.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/ar.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/az.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/bg.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/bn.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/bs.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/ca.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/cs.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/cy.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/da.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/de-ch.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/de.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/el.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/en-au.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/en-ca.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/en-gb.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/en.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/eo.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/es.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/et.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/eu.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/fa.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/fi.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/fo.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/fr-ca.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/fr.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/gl.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/gu.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/he.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/hi.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/hr.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/hu.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/id.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/is.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/it.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/ja.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/ka.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/km.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/ko.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/ku.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/lt.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/lv.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/mk.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/mn.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/ms.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/nb.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/nl.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/no.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/oc.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/pl.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/pt-br.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/pt.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/ro.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/ru.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/si.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/sk.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/sl.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/sq.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/sr-latn.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/sr.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/sv.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/th.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/tr.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/tt.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/ug.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/uk.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/vi.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/zh-cn.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/lang/zh.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/about/dialogs/about.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/about/dialogs/hidpi/logo_ckeditor.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/about/dialogs/logo_ckeditor.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/base64image/LICENSE.md delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/base64image/README.md delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/base64image/dialogs/base64image.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/clipboard/dialogs/paste.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/colordialog/dialogs/colordialog.css delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/colordialog/dialogs/colordialog.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/dialog/dialogDefinition.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/icons.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/icons_hidpi.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/image/dialogs/image.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/image/images/noimage.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/image2/dialogs/image2.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/link/dialogs/anchor.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/link/dialogs/link.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/link/images/anchor.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/link/images/hidpi/anchor.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/plain/icons/hidpi/plain-rtl.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/plain/icons/hidpi/plain.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/plain/icons/plain-rtl.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/plain/icons/plain.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/plain/plugin.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/quicktable/CHANGELOG.md delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/quicktable/Gruntfile.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/quicktable/LICENSE delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/quicktable/README.md delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/quicktable/package.json delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/quicktable/template.jst delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/signature/plugin.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/table/dialogs/table.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/widget/images/handle.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog.css delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_ie.css delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_ie8.css delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_iequirks.css delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor.css delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_gecko.css delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_ie.css delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_ie8.css delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_iequirks.css delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/icons.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/icons_hidpi.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/arrow.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/close.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/hidpi/close.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/hidpi/lock-open.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/hidpi/lock.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/hidpi/refresh.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/lock-open.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/lock.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/refresh.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/spinner.gif delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/readme.md delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/styles.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/app.css delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/app.min.css delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/default-skin.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/default-skin.svg delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/flags.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/lg.eot delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/lg.svg delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/lg.ttf delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/lg.woff delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.eot delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.svg delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.ttf delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.woff delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/editor.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/empty-contact.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/grey.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/icom-message-notification.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/loading.gif delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/rainloop-logo.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/sync.gif delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/sync.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/white.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/img/loading.gif delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/loading.gif delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/preloader.gif delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/social.css delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/social.min.css delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/favicon-light.ico delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/favicon-light.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/favicon.ico delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/favicon.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/admin.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/app.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/boot.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/libs.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/admin.min.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/app.min.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/boot.min.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/libs.min.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/openpgp.min.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/openpgp.worker.min.js delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/manifest.json delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/sounds/new-mail.mp3 delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/static/sounds/new-mail.ogg delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/A/images/background.jpg delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/A/images/preview.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/A/styles.less delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Blurred/images/background.jpg delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Blurred/images/preview.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Blurred/styles.less delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Clear/images/preview.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Clear/styles.less delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/DarkShine/images/background.jpg delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/DarkShine/images/preview.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/DarkShine/styles.less delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Default/images/background.jpg delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Default/images/background.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Default/images/preview.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Default/styles.less delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Linen/images/background.jpg delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Linen/images/background.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Linen/images/preview.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Linen/styles.less delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Love/images/background.jpg delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Love/images/preview.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Love/styles.less delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Mobile/ext.less delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Mobile/images/preview.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Mobile/styles.less delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Snow/images/background.jpg delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Snow/images/preview.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Snow/styles.less delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Squares/images/background.jpg delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Squares/images/background.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Squares/images/preview.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Squares/styles.less delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/SquaresDark/images/background.jpg delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/SquaresDark/images/background.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/SquaresDark/images/preview.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/SquaresDark/styles.less delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Stripes/images/background.jpg delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Stripes/images/preview.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Stripes/styles.less delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Wood/images/background.jpg delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Wood/images/background.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Wood/images/preview.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Wood/styles.less delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Xv/images/background.jpg delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Xv/images/background.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Xv/images/preview.png delete mode 100755 copper-server/core/rainloop/app/rainloop/v/1.12.0/themes/Xv/styles.less delete mode 100755 copper-server/core/rainloop/config/apache-config.conf delete mode 100755 copper-server/core/rainloop/config/conf-available/security.conf delete mode 100755 copper-server/core/rainloop/config/copper.opensource.lk.conf delete mode 100644 copper-server/core/rainloop/config/hosts delete mode 100755 copper-server/core/rainloop/config/mods-available/proxy_html.conf delete mode 100644 copper-server/core/rainloop/config/ports.conf delete mode 100644 copper-server/core/rainloop/config/scripts/index.html delete mode 100755 copper-server/core/rainloop/config/scripts/init_letsencrypt.sh delete mode 100755 copper-server/core/rainloop/config/scripts/run_apache.sh delete mode 100755 copper-server/core/rainloop/config/scripts/run_letsencrypt.sh delete mode 100644 copper-server/core/rainloop/hosts delete mode 100644 copper-server/core/rainloop/tls/cert.pem delete mode 100644 copper-server/core/rainloop/tls/dhparam.pem delete mode 120000 copper-server/core/rainloop/tls/fullchain.pem delete mode 100644 copper-server/core/rainloop/tls/privkey.pem delete mode 100644 copper-server/core/svc-ingress-nginx-lb.yaml delete mode 100644 copper-server/core/tls/cert.pem delete mode 100644 copper-server/core/tls/dhparam.pem delete mode 120000 copper-server/core/tls/fullchain.pem delete mode 100644 copper-server/core/tls/privkey.pem delete mode 100755 copper-server/kubernetes/nginx/frontend.conf delete mode 100755 copper-server/kubernetes/nginx/proxy.conf delete mode 100755 copper-server/kubernetes/services/auth.yaml delete mode 100755 copper-server/kubernetes/services/frontend.yaml delete mode 100755 copper-server/kubernetes/services/hello.yaml delete mode 100755 copper-server/kubernetes/services/monolith.yaml delete mode 100755 copper-server/kubernetes/services/rainloop-servie.yaml delete mode 100755 copper-server/kubernetes/services/rainloop.yaml diff --git a/copper-server/core/README.md b/copper-server/core/README.md deleted file mode 100644 index eaf12ad9..00000000 --- a/copper-server/core/README.md +++ /dev/null @@ -1,66 +0,0 @@ - -## Creating frontend https server with ingress - - '''kubectl create -f frontend.yaml''' - -### TLS secreet creation ###### -'''kubectl create secret generic tls-certs --from-file=tls/'''' - - -// kubernetes with postfix -https://www.tauceti.blog/post/run-postfix-in-kubernetes/ - -# Apache web server with https with docker and kubernetes -https://manual.seafile.com/deploy/https_with_apache.html - - -// building new docker for -docker build -t homail . - -// run the homail image as homail container -docker run --name homail -d homail - -//login to server for further modifications. -docker exec -it homail /bin/bash - -## Port congiguration -// if you want to change to port use -nano /etc/apache2/ports.conf -By default, Apache web server is instructed to listen for incoming connection and bind on port 80. If you opt for the TLS configuration, the server will listen for secure connections on port 443. - -In order to instruct Apache web server to bind and listen for web traffic on other ports than the standard web ports, you need to add a new statement containing the newly port for future bindings. - -''' - nano /etc/apache2/ports.conf [On Debian/Ubuntu] - nano /etc/httpd/conf/httpd.conf [On RHEL/CentOS] -''' - - add 89 for listning port - - After you’ve added the above line, you need to create or alter an Apache virtual host in Debian/Ubuntu based distribution in order to start the binding process, specific to your own vhost requirements. - -In CentOS/RHEL distributions, the change is applied directly into default virtual host. In the below sample, we’ll modify the default virtual host of the web server and instruct Apache to listen for web traffic from 80 port to 8081 port. - -'''nano /etc/apache2/sites-enabled/000-default.conf ''' - -*** After correct configuration in ports.conf and vertual hosts you may access these sites from curl command - -// get ports.conf -docker cp homail:/etc/apache2/ports.conf ~/Documents/copper/copper/copper-server/core/rainloop/config - - - -// coppy files from docer container to machine. (like host file) -docker cp homail:/etc/hosts ~/Documents/copper/copper/copper-server/core/rainloop - - - -// docker file you should have expose the port - - -// And when you run the container use bellow command you have to bind docker EXPOSED port to host port ( EXPOSE 89). - -Ex : - -'''docker run -p 89:89 --name homail -d homail''' - diff --git a/copper-server/core/homail.yaml b/copper-server/core/homail.yaml deleted file mode 100644 index 0728079c..00000000 --- a/copper-server/core/homail.yaml +++ /dev/null @@ -1,77 +0,0 @@ -kind: Service -apiVersion: v1 -metadata: - name: homail - namespace: monitoring -spec: - type: LoadBalancer - selector: - app: homail - ports: - - protocol: "TCP" - port: 88 - #targetPort: 80 - targetPort: http - #clusterIP: None - name: webmail - #nodePort: 30080 - #type: NodePort ---- -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: homail - namespace: monitoring -spec: - replicas: 1 - template: - metadata: - labels: - app: webmail - track: stable - spec: - containers: - - name: homail - #image: "udacity/example-auth:1.0.0" - image: webmail - imagePullPolicy: Never - ports: - - name: http - containerPort: 80 - - name: health - containerPort: 81 - volumeMounts: - - name: "tls-certs" - mountPath: "/etc/tls" - resources: - limits: - cpu: "1" - memory: 2Gi - requests: - cpu: 200m - memory: 1Gi - volumes: - - name: "tls-certs" - secret: - secretName: "tls-certs" - #dnsPolicy: ClusterFirst # errors with this version - #restartPolicy: Never # errors with this version - #resources: - # limits: - # cpu: 0.9 - # memory: "5500Mi" - #livenessProbe: - # httpGet: - # path: /healthz - # port: 81 - # scheme: HTTP - # initialDelaySeconds: 5 - # periodSeconds: 15 - # timeoutSeconds: 5 - #readinessProbe: - # httpGet: - # path: /readiness - # port: 81 - # scheme: HTTP - # initialDelaySeconds: 5 - # timeoutSeconds: 1 \ No newline at end of file diff --git a/copper-server/core/ingress.yaml b/copper-server/core/ingress.yaml deleted file mode 100644 index 5fa23e16..00000000 --- a/copper-server/core/ingress.yaml +++ /dev/null @@ -1,42 +0,0 @@ -apiVersion: v1 -data: - tls.crt: base64 encoded cert - tls.key: base64 encoded key -kind: Secret -metadata: - name: testsecret-tls - namespace: default -type: Opaque ---- -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: tls-example-ingress -spec: - tls: - - hosts: - #- sslexample.foo.com - - localhost.com - secretName: testsecret-tls - rules: - - host: sslexample.foo.com - http: - paths: - - path: / - backend: - serviceName: service1 - servicePort: 80 - - host: sslexample.foo.com - http: - paths: - - path: / - backend: - serviceName: service1 - servicePort: 80 - - host: sslexample.foo.com - http: - paths: - - path: / - backend: - serviceName: service1 - servicePort: 80 diff --git a/copper-server/core/rainloop/Dockerfile b/copper-server/core/rainloop/Dockerfile deleted file mode 100755 index 3bdd4216..00000000 --- a/copper-server/core/rainloop/Dockerfile +++ /dev/null @@ -1,152 +0,0 @@ -#https://medium.com/@meeramarygeorge/create-php-mysql-apache-development-environment-using-docker-in-windows-9beeba6985 -#https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-18-04 -FROM ubuntu:latest -#FROM ubuntu:14.04 - -MAINTAINER Name - -ENV DEBIAN_FRONTEND noninteractive -ENV DOMAIN=${DOMAIN} - -# Install basics - -RUN apt-get update - -RUN apt-get install -y software-properties-common && \ - -add-apt-repository ppa:ondrej/php && apt-get update - -#RUN apt-get install -y — force-yes curl -RUN apt-get install -y curl - -# installing ping command -RUN apt-get install -y iputils-ping - -RUN apt-get update - -# Install PHP 5.6 - -#RUN apt-get install -y — allow-unauthenticated php5.6 php5.6-mysql php5.6-mcrypt php5.6-cli php5.6-gd php5.6-curl -RUN apt-get install -y php5.6 php5.6-mysql php5.6-mcrypt php5.6-cli php5.6-gd php5.6-curl - -# Enable apache mods. - -RUN a2enmod php5.6 - -RUN a2enmod rewrite - -# Update the PHP.ini file, enable tags and quieten logging. - -RUN sed -i "s/short_open_tag = Off/short_open_tag = On/" /etc/php/5.6/apache2/php.ini - -RUN sed -i "s/error_reporting = .*$/error_reporting = E_ERROR | E_WARNING | E_PARSE/" /etc/php/5.6/apache2/php.ini - - - -# Manually set up the apache environment variables - -ENV APACHE_LOG_DIR /var/log/apache2 - -ENV APACHE_LOCK_DIR /var/lock/apache2 - -ENV APACHE_PID_FILE /var/run/apache2.pid - -# Manually set up the apache environment variables -ENV APACHE_RUN_USER www-data - -ENV APACHE_RUN_GROUP www-data - - - -# Expose apache. - -EXPOSE 89 -EXPOSE 443 -#EXPOSE 8080 - -EXPOSE 4343 - - - -#EXPOSE 3306 - -# Update the default apache site with the config we created. - -#ADD ./config/apache-config.conf /etc/apache2/sites-enabled/000-default.conf -ADD ./config/hosts /etc/hosts - -# Copy site into place. - -ADD ./app/ /var/www/html/site/ -#RUN copy cert files -ADD ./tls/cert.pem /etc/ssl/certs/copper.opensource.lk.cert.pem -ADD ./tls/privkey.pem /etc/ssl/private/copper.opensource.lk.privkey.pem - -#RUN chmod -R 777 /var/www/html/site/app - - RUN chown -R www-data:www-data /var/www/html/site/ - - # Update the default apache site with the config we created. -#ADD ./config/apache-config.conf /etc/apache2/sites-enabled/example.com.conf - -RUN apt-get -y install nano - -# Lets encript - -# First, add the repository: -RUN add-apt-repository -y ppa:certbot/certbot - -#Install Certbot's Apache package with apt: -RUN apt install -y python-certbot-apache - -# reload the configuration -#RUN systemctl reload apache2 - -# manual lets encript key generation tool -#certbot --apache -d example.com -d www.example.com -#CMD certbot --apache -d copper.opensource.lk -d copper.opensource.lk - - -# with certbot-auto -#https://www.exratione.com/2016/06/a-simple-setup-and-installation-script-for-lets-encrypt-ssl-certificates/ -RUN apt-get install -y wget -RUN wget https://dl.eff.org/certbot-auto -RUN chmod a+x certbot-auto -RUN mv certbot-auto /usr/local/bin -RUN certbot-auto --noninteractive --os-packages-only -# Use this command if a webserver is already running with the webroot -# at /var/www/html. -RUN certbot-auto certonly \ -RUN certbot-auto \ - --non-interactive \ - --agree-tos \ - --text \ - --rsa-key-size 4096 \ - --email admin@copper.opensource.lk \ - --webroot-path /var/www/html/site/ \ - --apache \ - --help plugins \ - --domains "copper.opensource.lk" - - - - -#RUN cp /etc/letsencrypt/live/copper.opensource.lk/fullchain.pem /etc/ssl/certs/copper.opensource.lk.fullchain.pem -#RUN cp /etc/letsencrypt/live/copper.opensource.lk/privkey.pem /etc/ssl/private/copper.opensource.lk.privkey.pem -#RUN cp ./tls/cert.pem /etc/ssl/certs/copper.opensource.lk.cert.pem -#RUN cp ./tls/privkey.pem /etc/ssl/private/copper.opensource.lk.privkey.pem - -# this for copper live server -ADD ./config/copper.opensource.lk.conf /etc/apache2/sites-enabled/copper.opensource.lk.conf - -# adding ports.conf file to the image -ADD ./config/ports.conf /etc/apache2/ - -# adding host file -ADD ./config/hosts /etc/hosts - -RUN certbot renew --dry-run -# By default start up apache in the foreground, override with /bin/bash for interative. -#CMD chmod -R 777 /var/www/html/data/ -CMD /usr/sbin/apache2ctl -D FOREGROUND - diff --git a/copper-server/core/rainloop/README.md b/copper-server/core/rainloop/README.md deleted file mode 100755 index b2ba3221..00000000 --- a/copper-server/core/rainloop/README.md +++ /dev/null @@ -1,57 +0,0 @@ -# Docker - Apache with Let's Encrypt - -This is a debian-based image which runs an apache and get's it SSL-certificates automatically from Let's Encrypt. - -## Instructions - -### Prepare your apache-config - -There are some things you have to care about in your apache-config if you want to use it with certbot: - -- for every domain given in `DOMAINS` there must be a apache-vhost which uses this domain as `ServerName` or `ServerAlias`. Else certbot won't get a certificate for this domain. -- this image contains a simple apache webserver. Therefore you can configure your vhosts like you ever did. - -### Run it - -For an easy test-startup you just have to: - -``` -$ docker run -d --name apache-ssl birgerk/apache-letsencrypt -``` - -Now you have locally an apache running, which gets it SSL-certificates from Let's Encrypt. - -The image will get letsencrypt-certificates on first boot. A cron-job renews the existing certificates automatically, so you don't have to care about it. - -If you want to expand your certificate and you can remove the existing docker-container and start new one with the updated `DOMAINS`-list. If you don't want to recreate the container you can execute the following commands: - -``` -$ UPDATED_DOMAINS="example.org,more.example.org" -$ docker exec -it apache-ssl /run_letsencrypt.sh --domains $UPDATED_DOMAINS -``` - -### Configuring docker-container - -It's possible to configure the docker-container by setting the following environment-variables at container-startup: - -- `DOMAINS`, configures which for which domains a SSL-certificate shall be requested from Let's Encrypt, default is `""`. Must be given as comma-seperated list, f.e.: `"example.com,my-internet.org,more.example.com"`. -- `WEBMASTER_MAIL`, Let's Encrypt needs a mail-address from the webmaster of the requested domain. You have to set it, otherwise Let's Encrypt won't give the certificates. Default is `""`. Must be given as simple mail-address, f.e.: `"webmaster@example.com"`. -- `STAGING`, if set with a not-null string use Let's Encrypt Staging environment to avoid rate limits during development. - -### Location of letsencrypt-certs - -After letsencrypt did authenticate your domains and you got your certificates, you'll find your certificates under `/etc/letsencrypt/live//`. - -So your https-virtualhost should like: - -``` - - ServerName example.com - ServerAdmin webmaster@somewhere.org - DocumentRoot /var/www/html - - SSLCertificateFile /etc/letsencrypt/live/${VIRTUAL_HOST}/fullchain.pem - SSLCertificateKeyFile /etc/letsencrypt/live/${VIRTUAL_HOST}/privkey.pem - Include /etc/letsencrypt/options-ssl-apache.conf - -``` diff --git a/copper-server/core/rainloop/app/data/INSTALLED b/copper-server/core/rainloop/app/data/INSTALLED deleted file mode 100644 index 32bd932f..00000000 --- a/copper-server/core/rainloop/app/data/INSTALLED +++ /dev/null @@ -1 +0,0 @@ -1.12.0 \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/SALT.php b/copper-server/core/rainloop/app/data/SALT.php deleted file mode 100644 index d6623d10..00000000 --- a/copper-server/core/rainloop/app/data/SALT.php +++ /dev/null @@ -1 +0,0 @@ - .e-link{color:#333 !important;background-color:#fff !important;}.g-ui-menu .e-item > .e-link > i{color:#333 !important;}.g-ui-menu .e-item.selected > .e-link{background-color:#eee !important;}.g-ui-menu .e-item > .e-link:hover,.g-ui-menu .e-item > .e-link:focus{color:#eee !important;background-color:#48525c !important;}.g-ui-menu .e-item > .e-link:hover > i,.g-ui-menu .e-item > .e-link:focus > i{color:#eee !important;}.g-ui-menu .e-item.disabled > .e-link,.g-ui-menu .e-item.disabled > .e-link:hover{color:#999 !important;background-color:#fff !important;}.g-ui-menu .e-item.disabled > .e-link > i,.g-ui-menu .e-item.disabled > .e-link:hover > i{color:#999 !important;}.thm-message-list-top-toolbar,.thm-message-list-bottom-toolbar{background-color:#eee !important;background-color:#ececec !important;background-image:-moz-linear-gradient(top,#f4f4f4,#dfdfdf) !important;background-image:-webkit-gradient(linear,0 0,0 100%,from(#f4f4f4),to(#dfdfdf)) !important;background-image:-webkit-linear-gradient(top,#f4f4f4,#dfdfdf) !important;background-image:-o-linear-gradient(top,#f4f4f4,#dfdfdf !important);background-image:linear-gradient(to bottom,#f4f4f4,#dfdfdf) !important;background-repeat:repeat-x !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff4f4f4', endColorstr='#ffdfdfdf', GradientType=0) !important;}.thm-folders .e-link{color:#aaa !important;}.thm-folders .e-link.selectable{color:#fff !important;}.thm-folders .e-link.selectable:hover{color:#fff !important;background-color:#2b333d !important;background-color:rgba(0,0,0,0.5) !important;}.thm-folders .e-link.selectable.selected{color:#fff !important;background-color:#2b333d !important;background-color:rgba(0,0,0,0.5) !important;}.thm-folders .e-link.focused{color:#fff !important;background-color:#2b333d !important;background-color:rgba(0,0,0,0.7) !important;}.thm-folders .e-link.selectable.droppableHover{color:#fff !important;background-color:#2b333d !important;background-color:rgba(0,0,0,0.5) !important;}.thm-settings-menu .e-item .e-link{color:#aaa !important;}.thm-settings-menu .e-item.selectable .e-link{color:#fff !important;}.thm-settings-menu .e-item.selectable:hover .e-link{background-color:#2b333d !important;background-color:rgba(0,0,0,0.5) !important;color:#fff !important;}.thm-settings-menu .e-item.selectable.selected .e-link{background-color:#2b333d !important;background-color:rgba(0,0,0,0.5) !important;color:#fff !important;}.thm-message-view-background-color{background-color:#fff !important;}#rl-app{display:block;}html.no-css{margin:0;padding:0;font-family:Arial, Verdana, Geneva, sans-serif;}html.no-css body{margin:0;padding:0;}html.no-css #rl-loading,html.no-css #rl-loading-error{position:absolute;font-size:30px;line-height:130%;top:50%;width:100%;height:65px;margin:0;margin-top:-60px;background-color:transparent;text-align:center;color:#333;}html.no-css .progressjs-container{display:none;}html.no-css .thm-body{color:#333;background-color:#aaa;background-image:none;}html.no-css .thm-loading{color:#333 !important;text-shadow:none !important;}html.no-css .thm-loading .e-spinner .e-bounce{display:none !important;}html.no-css .thm-login-desc .desc{color:#333 !important;text-shadow:none !important;}html.glass .thm-login{background:none !important;background:rgba(0,0,0,0.5) !important;box-shadow:none !important;border:none !important;border:1px solid rgba(255,255,255,0.2) !important;}html.glass .thm-login .controls .input-append .add-on i{color:rgba(255,255,255,0.8) !important;text-shadow:none !important;outline:none !important;box-shadow:none !important;}html.glass .thm-login .controls input{border:1px solid none !important;background:none !important;outline:none !important;text-shadow:none !important;box-shadow:none !important;color:#fff !important;border-color:rgba(255,255,255,0.8) !important;}html.glass .thm-login .controls input::-webkit-input-placeholder{color:#fff !important;text-shadow:none !important;}html.glass .thm-login .controls input::-moz-placeholder{color:#fff !important;text-shadow:none !important;}html.glass .thm-login .controls input:-moz-placeholder{color:#fff !important;text-shadow:none !important;}html.glass .thm-login .controls input:-ms-input-placeholder{color:#fff !important;text-shadow:none !important;}html.glass .thm-login .controls input:input-placeholder{color:#fff !important;text-shadow:none !important;}html.glass .thm-login .controls input:placeholder{color:#fff !important;text-shadow:none !important;}html.glass .thm-login .controls input:focus,html.glass .thm-login .controls input:hover{border-color:#fff !important;}html.glass .thm-login .controls .btn{border:1px solid none !important;background:none !important;outline:none !important;text-shadow:none !important;box-shadow:none !important;color:#fff !important;border-color:rgba(255,255,255,0.8) !important;text-transform:uppercase;font-size:13px;}html.glass .thm-login .controls .btn:hover,html.glass .thm-login .controls .btn:active{border-color:#fff !important;}html.glass .thm-login .controls.error .input-append .add-on i{color:#f76260 !important;}html.glass .thm-login .controls.error input{color:#f76260 !important;border-color:#f76260 !important;}html.glass .thm-login-text{color:rgba(255,255,255,0.8) !important;text-shadow:none !important;}html.glass .thm-login-text .legend,html.glass .thm-login-text .e-checkbox-icon,html.glass .thm-login-text .g-ui-link,html.glass .thm-login-text .social-button,html.glass .thm-login-text .language-button{color:rgba(255,255,255,0.8) !important;text-shadow:none !important;} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/cache/3e/18/3e18609e097b6278b6c17fa9dd6de9db3a729b67 b/copper-server/core/rainloop/app/data/_data_/_default_/cache/3e/18/3e18609e097b6278b6c17fa9dd6de9db3a729b67 deleted file mode 100644 index f9a90256..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/cache/3e/18/3e18609e097b6278b6c17fa9dd6de9db3a729b67 +++ /dev/null @@ -1 +0,0 @@ -window.rainloopI18N={"LANGS_NAMES/LANG_EN":"English","LANGS_NAMES/LANG_EN_US":"English","LANGS_NAMES/LANG_EN_GB":"English (UK)","LANGS_NAMES/LANG_EN_UK":"English (UK)","LANGS_NAMES/LANG_EN_CA":"English (Canadian)","LANGS_NAMES/LANG_TH_TH":"ภาษาไทย","LANGS_NAMES/LANG_EL_GR":"Ελληνικά","LANGS_NAMES/LANG_NL_NL":"Nederlands","LANGS_NAMES/LANG_NB_NO":"Norsk (bokmål)","LANGS_NAMES/LANG_PL_PL":"Polski","LANGS_NAMES/LANG_RU_RU":"Русский","LANGS_NAMES/LANG_RO_RO":"Română","LANGS_NAMES/LANG_UK_UA":"Українська","LANGS_NAMES/LANG_DE_DE":"Deutsch","LANGS_NAMES/LANG_FI_FI":"Suomi","LANGS_NAMES/LANG_FR_FR":"Français (France)","LANGS_NAMES/LANG_FR_CA":"Français (Canada)","LANGS_NAMES/LANG_PT_PT":"Português (Portugal)","LANGS_NAMES/LANG_PT_BR":"Português (Brasil)","LANGS_NAMES/LANG_ES_ES":"Español (España)","LANGS_NAMES/LANG_ES_LA":"Español","LANGS_NAMES/LANG_ET_EE":"Eesti","LANGS_NAMES/LANG_FA_IR":"‏فارسی‏","LANGS_NAMES/LANG_IT_IT":"Italiano","LANGS_NAMES/LANG_LT_LT":"Lietuvių","LANGS_NAMES/LANG_LV_LV":"Latviešu","LANGS_NAMES/LANG_IS_IS":"Íslenska","LANGS_NAMES/LANG_HU_HU":"Magyar","LANGS_NAMES/LANG_TR_TR":"Türkçe","LANGS_NAMES/LANG_SK_SK":"Slovenčina","LANGS_NAMES/LANG_SV_SE":"Svenska","LANGS_NAMES/LANG_SL_SI":"Slovenščina","LANGS_NAMES/LANG_JA_JP":"日本語","LANGS_NAMES/LANG_ZH_TW":"中文(台灣)","LANGS_NAMES/LANG_ZH_CN":"中文(简体)","LANGS_NAMES/LANG_ZH_HK":"中文(香港)","LANGS_NAMES/LANG_KO_KR":"한국어","LANGS_NAMES/LANG_BG_BG":"Български","LANGS_NAMES/LANG_CS_CZ":"Čeština","LANGS_NAMES/LANG_AR_SA":"‏العربية‏","LANGS_NAMES/LANG_DA_DK":"Dansk","LANGS_NAMES/LANG_ID_ID":"Bahasa Indonesia","LANGS_NAMES_EN/LANG_EN":"English","LANGS_NAMES_EN/LANG_EN_US":"English (US)","LANGS_NAMES_EN/LANG_EN_GB":"English (UK)","LANGS_NAMES_EN/LANG_EN_UK":"English (UK)","LANGS_NAMES_EN/LANG_EN_CA":"English (Canadian)","LANGS_NAMES_EN/LANG_TH_TH":"Thai","LANGS_NAMES_EN/LANG_EL_GR":"Greek","LANGS_NAMES_EN/LANG_NL_NL":"Dutch","LANGS_NAMES_EN/LANG_NB_NO":"Norwegian (bokmal)","LANGS_NAMES_EN/LANG_PL_PL":"Polish","LANGS_NAMES_EN/LANG_RU_RU":"Russian","LANGS_NAMES_EN/LANG_RO_RO":"Romanian","LANGS_NAMES_EN/LANG_UK_UA":"Ukrainian","LANGS_NAMES_EN/LANG_DE_DE":"German","LANGS_NAMES_EN/LANG_FI_FI":"Finnish","LANGS_NAMES_EN/LANG_FR_FR":"French (France)","LANGS_NAMES_EN/LANG_FR_CA":"France (Canada)","LANGS_NAMES_EN/LANG_PT_PT":"Portuguese (Portugal)","LANGS_NAMES_EN/LANG_PT_BR":"Portuguese (Brazil)","LANGS_NAMES_EN/LANG_ES_ES":"Spanish","LANGS_NAMES_EN/LANG_ES_LA":"Spanish","LANGS_NAMES_EN/LANG_ET_EE":"Estonian","LANGS_NAMES_EN/LANG_FA_IR":"Persian","LANGS_NAMES_EN/LANG_IT_IT":"Italian","LANGS_NAMES_EN/LANG_LT_LT":"Lithuanian","LANGS_NAMES_EN/LANG_LV_LV":"Latvian","LANGS_NAMES_EN/LANG_IS_IS":"Icelandic","LANGS_NAMES_EN/LANG_HU_HU":"Hungarian","LANGS_NAMES_EN/LANG_TR_TR":"Turkish","LANGS_NAMES_EN/LANG_SK_SK":"Slovak","LANGS_NAMES_EN/LANG_SL_SI":"Slovenian","LANGS_NAMES_EN/LANG_SV_SE":"Swedish","LANGS_NAMES_EN/LANG_JA_JP":"Japanese","LANGS_NAMES_EN/LANG_ZH_TW":"Traditional Chinese (Taiwan)","LANGS_NAMES_EN/LANG_ZH_CN":"Simplified Chinese (China)","LANGS_NAMES_EN/LANG_ZH_HK":"Traditional Chinese (Hong Kong)","LANGS_NAMES_EN/LANG_KO_KR":"Korean","LANGS_NAMES_EN/LANG_BG_BG":"Bulgarian","LANGS_NAMES_EN/LANG_CS_CZ":"Czech","LANGS_NAMES_EN/LANG_AR_SA":"Arabic","LANGS_NAMES_EN/LANG_DA_DK":"Danish","LANGS_NAMES_EN/LANG_ID_ID":"Indonesian","LOGIN/LABEL_EMAIL":"Email","LOGIN/LABEL_LOGIN":"Login","LOGIN/LABEL_PASSWORD":"Password","LOGIN/LABEL_SIGN_ME":"Remember Me","LOGIN/LABEL_VERIFICATION_CODE":"Verification Code","LOGIN/LABEL_DONT_ASK_VERIFICATION_CODE":"Don't ask for the code for 2 weeks","LOGIN/BUTTON_SIGN_IN":"Sign In","LOGIN/TITLE_SIGN_IN_GOOGLE":"Sign In using Google","LOGIN/TITLE_SIGN_IN_FACEBOOK":"Sign In using Facebook","LOGIN/TITLE_SIGN_IN_TWITTER":"Sign In using Twitter","LOGIN/LABEL_FORGOT_PASSWORD":"Forgot password","LOGIN/LABEL_REGISTRATION":"Registration","TOP_TOOLBAR/BUTTON_ADD_ACCOUNT":"Add Account","TOP_TOOLBAR/BUTTON_SETTINGS":"Settings","TOP_TOOLBAR/BUTTON_HELP":"Help","TOP_TOOLBAR/BUTTON_LOGOUT":"Logout","MOBILE/BUTTON_MOBILE_VERSION":"Mobile version","MOBILE/BUTTON_DESKTOP_VERSION":"Desktop version","SEARCH/MAIN_INPUT_PLACEHOLDER":"Search","SEARCH/TITLE_ADV":"Advanced Search","SEARCH/LABEL_ADV_FROM":"From","SEARCH/LABEL_ADV_TO":"To","SEARCH/LABEL_ADV_SUBJECT":"Subject","SEARCH/LABEL_ADV_TEXT":"Text","SEARCH/LABEL_ADV_HAS_ATTACHMENT":"Has attachment","SEARCH/LABEL_ADV_HAS_ATTACHMENTS":"Has attachments","SEARCH/LABEL_ADV_FLAGGED":"Flagged","SEARCH/LABEL_ADV_UNSEEN":"Unseen","SEARCH/LABEL_ADV_DATE":"Date","SEARCH/LABEL_ADV_DATE_ALL":"All","SEARCH/LABEL_ADV_DATE_3_DAYS":"Up to 3 days old","SEARCH/LABEL_ADV_DATE_7_DAYS":"Up to 1 week old","SEARCH/LABEL_ADV_DATE_MONTH":"Up to 1 month old","SEARCH/LABEL_ADV_DATE_3_MONTHS":"Up to 3 months old","SEARCH/LABEL_ADV_DATE_6_MONTHS":"Up to 6 months old","SEARCH/LABEL_ADV_DATE_YEAR":"Up to 1 year old","SEARCH/BUTTON_ADV_SEARCH":"Search","PREVIEW_POPUP/FULLSCREEN":"Toggle fullscreen","PREVIEW_POPUP/ZOOM":"Zoom in/out","PREVIEW_POPUP/CLOSE":"Close (Esc)","PREVIEW_POPUP/LOADING":"Loading...","PREVIEW_POPUP/GALLERY_PREV":"Previous (arrow left)","PREVIEW_POPUP/GALLERY_NEXT":"Next (arrow right)","PREVIEW_POPUP/GALLERY_COUNTER":"%curr% of %total%","PREVIEW_POPUP/IMAGE_ERROR":"The image could not be loaded.","PREVIEW_POPUP/AJAX_ERROR":"The content could not be loaded.","FOLDER_LIST/BUTTON_COMPOSE":"Compose","FOLDER_LIST/BUTTON_CONTACTS":"Contacts","FOLDER_LIST/BUTTON_NEW_MESSAGE":"New message","FOLDER_LIST/INBOX_NAME":"Inbox","FOLDER_LIST/SENT_NAME":"Sent","FOLDER_LIST/DRAFTS_NAME":"Drafts","FOLDER_LIST/SPAM_NAME":"Spam","FOLDER_LIST/TRASH_NAME":"Trash","FOLDER_LIST/ARCHIVE_NAME":"Archive","QUOTA/TITLE":"Quota usage","MESSAGE_LIST/BUTTON_RELOAD":"Reload Message List","MESSAGE_LIST/BUTTON_MOVE_TO":"Move To","MESSAGE_LIST/BUTTON_DELETE":"Delete","MESSAGE_LIST/BUTTON_ARCHIVE":"Archive","MESSAGE_LIST/BUTTON_SPAM":"Spam","MESSAGE_LIST/BUTTON_NOT_SPAM":"Not Spam","MESSAGE_LIST/BUTTON_EMPTY_FOLDER":"Clear Folder","MESSAGE_LIST/BUTTON_MULTY_FORWARD":"Forward as attachment(s)","MESSAGE_LIST/BUTTON_DELETE_WITHOUT_MOVE":"Delete permanently","MESSAGE_LIST/BUTTON_MORE":"More","MESSAGE_LIST/MENU_SET_SEEN":"Mark as read","MESSAGE_LIST/MENU_SET_ALL_SEEN":"Mark all as read","MESSAGE_LIST/MENU_UNSET_SEEN":"Mark as unread","MESSAGE_LIST/MENU_SET_FLAG":"Flag","MESSAGE_LIST/MENU_UNSET_FLAG":"Unflag","MESSAGE_LIST/MENU_SELECT_ALL":"All","MESSAGE_LIST/MENU_SELECT_NONE":"None","MESSAGE_LIST/MENU_SELECT_INVERT":"Invert","MESSAGE_LIST/MENU_SELECT_UNSEEN":"Unread","MESSAGE_LIST/MENU_SELECT_SEEN":"Read","MESSAGE_LIST/MENU_SELECT_FLAGGED":"Flagged","MESSAGE_LIST/MENU_SELECT_UNFLAGGED":"Unflagged","MESSAGE_LIST/EMPTY_LIST":"Empty list.","MESSAGE_LIST/EMPTY_SEARCH_LIST":"No messages matched your search.","MESSAGE_LIST/SEARCH_RESULT_FOR":"Search results for \"%SEARCH%\"","MESSAGE_LIST/BACK_TO_MESSAGE_LIST":"back to message list","MESSAGE_LIST/LIST_LOADING":"Loading","MESSAGE_LIST/EMPTY_SUBJECT_TEXT":"(No subject)","MESSAGE_LIST/PUT_MESSAGE_HERE":"Drop message here to view it in the list","MESSAGE_LIST/TODAY_AT":"today at %TIME%","MESSAGE_LIST/YESTERDAY_AT":"yesterday at %TIME%","MESSAGE_LIST/SEARCH_PLACEHOLDER":"Search","MESSAGE_LIST/NEW_MESSAGE_NOTIFICATION":"You have %COUNT% new messages!","MESSAGE_LIST/QUOTA_SIZE":"Using %SIZE% (%PROC%%) of your %LIMIT%","MESSAGE/BUTTON_EDIT":"Edit","MESSAGE/BUTTON_BACK":"Back","MESSAGE/BUTTON_CLOSE":"Close","MESSAGE/BUTTON_DELETE":"Delete","MESSAGE/BUTTON_UNSUBSCRIBE":"Unsubscribe from this list","MESSAGE/BUTTON_ARCHIVE":"Archive","MESSAGE/BUTTON_SPAM":"Spam","MESSAGE/BUTTON_NOT_SPAM":"Not Spam","MESSAGE/BUTTON_MOVE_TO":"Move To","MESSAGE/BUTTON_MORE":"More","MESSAGE/BUTTON_REPLY":"Reply","MESSAGE/BUTTON_REPLY_ALL":"Reply All","MESSAGE/BUTTON_FORWARD":"Forward","MESSAGE/BUTTON_FORWARD_AS_ATTACHMENT":"Forward as attachment","MESSAGE/BUTTON_EDIT_AS_NEW":"Edit as New","MESSAGE/BUTTON_SHOW_IMAGES":"Display external images","MESSAGE/BUTTON_NOTIFY_READ_RECEIPT":"The sender has asked to be notified when you read this message.","MESSAGE/BUTTON_IN_NEW_WINDOW":"View in separate window","MESSAGE/BUTTON_THREAD_LIST":"Thread list","MESSAGE/BUTTON_THREAD_PREV":"Previous","MESSAGE/BUTTON_THREAD_NEXT":"Next","MESSAGE/BUTTON_THREAD_MORE":"More messages","MESSAGE/MENU_HEADERS":"Show message headers","MESSAGE/MENU_VIEW_ORIGINAL":"Show Source","MESSAGE/MENU_DOWNLOAD_ORIGINAL":"Download as .eml file","MESSAGE/MENU_FILTER_SIMILAR":"Filter messages like this","MESSAGE/MENU_PRINT":"Print","MESSAGE/EMPTY_SUBJECT_TEXT":"(No subject)","MESSAGE/LABEL_SUBJECT":"Subject","MESSAGE/LABEL_DATE":"Date","MESSAGE/LABEL_FROM":"From","MESSAGE/LABEL_FROM_SHORT":"from","MESSAGE/LABEL_TO":"To","MESSAGE/LABEL_TO_SHORT":"to","MESSAGE/LABEL_CC":"CC","MESSAGE/LABEL_BCC":"BCC","MESSAGE/LABEL_REPLY_TO":"Reply-To","MESSAGE/PRINT_LABEL_FROM":"From","MESSAGE/PRINT_LABEL_TO":"To","MESSAGE/PRINT_LABEL_CC":"CC","MESSAGE/PRINT_LABEL_BCC":"BCC","MESSAGE/PRINT_LABEL_REPLY_TO":"Reply-To","MESSAGE/PRINT_LABEL_DATE":"Date","MESSAGE/PRINT_LABEL_SUBJECT":"Subject","MESSAGE/PRINT_LABEL_ATTACHMENTS":"Attachments","MESSAGE/MESSAGE_LOADING":"Loading","MESSAGE/MESSAGE_VIEW_DESC":"Select any message in the list to view it here.","MESSAGE/MESSAGE_VIEW_MOVE_DESC":"Click folder name in the left panel to select the destination.","MESSAGE/PGP_PASSWORD_INPUT_PLACEHOLDER":"Password","MESSAGE/PGP_SIGNED_MESSAGE_DESC":"OpenPGP signed message (click to verify)","MESSAGE/PGP_ENCRYPTED_MESSAGE_DESC":"OpenPGP encrypted message (click to decrypt)","MESSAGE/LINK_DOWNLOAD_AS_ZIP":"Download as zip","MESSAGE/LINK_SAVE_TO_OWNCLOUD":"Save to ownCloud","MESSAGE/LINK_SAVE_TO_CLOUD":"Save to Cloud","MESSAGE/LINK_SAVE_TO_DROPBOX":"Save to Dropbox","READ_RECEIPT/SUBJECT":"Return Receipt (displayed) - %SUBJECT%","READ_RECEIPT/BODY":"This is a Return Receipt for the mail that you sent to %READ-RECEIPT%.\n\nNote: \"This Return Receipt only acknowledges that the message was displayed on the recipient's computer.\"\nThere is no guarantee that the recipient has read or understood the message contents.","SUGGESTIONS/SEARCHING_DESC":"Searching...","CONTACTS/LEGEND_CONTACTS":"Contacts","CONTACTS/SEARCH_INPUT_PLACEHOLDER":"Search","CONTACTS/BUTTON_ADD_CONTACT":"Add Contact","CONTACTS/BUTTON_CREATE_CONTACT":"Create","CONTACTS/BUTTON_UPDATE_CONTACT":"Update","CONTACTS/BUTTON_IMPORT":"Import (csv, vcf, vCard)","CONTACTS/BUTTON_EXPORT_VCARD":"Export (vcf, vCard)","CONTACTS/BUTTON_EXPORT_CSV":"Export (csv)","CONTACTS/ERROR_IMPORT_FILE":"Import error (invalid file format)","CONTACTS/LIST_LOADING":"Loading","CONTACTS/EMPTY_LIST":"No contacts here","CONTACTS/EMPTY_SEARCH":"No contacts found","CONTACTS/CLEAR_SEARCH":"Clear search","CONTACTS/CONTACT_VIEW_DESC":"Select contact in the list to view it here.","CONTACTS/LABEL_DISPLAY_NAME":"Display name","CONTACTS/LABEL_EMAIL":"Email","CONTACTS/LABEL_PHONE":"Phone","CONTACTS/LABEL_WEB":"Web","CONTACTS/LABEL_BIRTHDAY":"Birthday","CONTACTS/LINK_ADD_EMAIL":"Add an email address","CONTACTS/LINK_ADD_PHONE":"Add a phone","CONTACTS/LINK_BIRTHDAY":"Birthday","CONTACTS/PLACEHOLDER_ENTER_DISPLAY_NAME":"Enter display name","CONTACTS/PLACEHOLDER_ENTER_LAST_NAME":"Enter last name","CONTACTS/PLACEHOLDER_ENTER_FIRST_NAME":"Enter first name","CONTACTS/PLACEHOLDER_ENTER_NICK_NAME":"Enter nickname","CONTACTS/LABEL_READ_ONLY":"Read only","CONTACTS/LABEL_SHARE":"Share","CONTACTS/ADD_MENU_LABEL":"Add","CONTACTS/ADD_MENU_NICKNAME":"Nickname","CONTACTS/ADD_MENU_NOTES":"Notes","CONTACTS/ADD_MENU_EMAIL":"Email","CONTACTS/ADD_MENU_PHONE":"Phone","CONTACTS/ADD_MENU_URL":"URL","CONTACTS/ADD_MENU_ADDRESS":"Address","CONTACTS/ADD_MENU_BIRTHDAY":"Birthday","CONTACTS/ADD_MENU_TAGS":"Tags","CONTACTS/BUTTON_SHARE_NONE":"None","CONTACTS/BUTTON_SHARE_ALL":"Everyone","CONTACTS/BUTTON_SYNC":"Synchronization (CardDAV)","COMPOSE/TITLE_FROM":"From","COMPOSE/TITLE_TO":"To","COMPOSE/TITLE_CC":"CC","COMPOSE/TITLE_BCC":"BCC","COMPOSE/TITLE_REPLY_TO":"Reply-To","COMPOSE/TITLE_SUBJECT":"Subject","COMPOSE/LINK_SHOW_INPUTS":"show all fields","COMPOSE/BUTTON_SEND":"Send","COMPOSE/BUTTON_SAVE":"Save","COMPOSE/BUTTON_DELETE":"Delete","COMPOSE/BUTTON_CANCEL":"Cancel","COMPOSE/BUTTON_MINIMIZE":"Minimize","COMPOSE/SAVED_TIME":"Saved at %TIME%","COMPOSE/SAVED_ERROR_ON_SEND":"Message was sent but not saved to sent items folder","COMPOSE/DISCARD_UNSAVED_DATA":"Discard unsaved data?","COMPOSE/ATTACH_FILES":"Attach files","COMPOSE/ATTACH_DROP_FILES_DESC":"Drop files here","COMPOSE/ATTACH_ITEM_CANCEL":"Cancel","COMPOSE/DROPBOX":"Dropbox","COMPOSE/GOOGLE_DRIVE":"Google Drive","COMPOSE/REPLY_MESSAGE_TITLE":"%DATETIME%, %EMAIL% wrote","COMPOSE/FORWARD_MESSAGE_TOP_TITLE":"-------- Forwarded message -------","COMPOSE/FORWARD_MESSAGE_TOP_FROM":"From","COMPOSE/FORWARD_MESSAGE_TOP_TO":"To","COMPOSE/FORWARD_MESSAGE_TOP_CC":"CC","COMPOSE/FORWARD_MESSAGE_TOP_SENT":"Sent","COMPOSE/FORWARD_MESSAGE_TOP_SUBJECT":"Subject","COMPOSE/EMPTY_TO_ERROR_DESC":"Please specify at least one recipient","COMPOSE/NO_ATTACHMENTS_HERE_DESC":"No attachments here.","COMPOSE/ATTACHMENTS_ERROR_DESC":"Warning! Not all attachments have been uploaded.","COMPOSE/ATTACHMENTS_UPLOAD_ERROR_DESC":"Not all attachments have been uploaded yet.","COMPOSE/BUTTON_REQUEST_READ_RECEIPT":"Request a read receipt","COMPOSE/BUTTON_MARK_AS_IMPORTANT":"Mark as important","COMPOSE/BUTTON_OPEN_PGP":"OpenPGP (Plain Text Only)","COMPOSE/BUTTON_REQUEST_DSN":"Request a delivery receipt","POPUPS_WELCOME_PAGE/BUTTON_CLOSE":"Close","POPUPS_ASK/BUTTON_YES":"Yes","POPUPS_ASK/BUTTON_NO":"No","POPUPS_ASK/DESC_WANT_CLOSE_THIS_WINDOW":"Are you sure you want to close this window?","POPUPS_ASK/DESC_WANT_DELETE_MESSAGES":"Are you sure you want to delete the message(s)?","POPUPS_LANGUAGES/TITLE_LANGUAGES":"Choose your language","POPUPS_ADD_ACCOUNT/TITLE_ADD_ACCOUNT":"Add Account?","POPUPS_ADD_ACCOUNT/BUTTON_ADD_ACCOUNT":"Add","POPUPS_ADD_ACCOUNT/TITLE_UPDATE_ACCOUNT":"Update Account?","POPUPS_ADD_ACCOUNT/BUTTON_UPDATE_ACCOUNT":"Update","POPUPS_IDENTITY/TITLE_ADD_IDENTITY":"Add Identity?","POPUPS_IDENTITY/TITLE_UPDATE_IDENTITY":"Update Identity?","POPUPS_IDENTITY/BUTTON_ADD_IDENTITY":"Add","POPUPS_IDENTITY/BUTTON_UPDATE_IDENTITY":"Update","POPUPS_IDENTITY/LABEL_EMAIL":"Email","POPUPS_IDENTITY/LABEL_NAME":"Name","POPUPS_IDENTITY/LABEL_REPLY_TO":"Reply-To","POPUPS_IDENTITY/LABEL_SIGNATURE":"Signature","POPUPS_IDENTITY/LABEL_CC":"Cc","POPUPS_IDENTITY/LABEL_BCC":"Bcc","POPUPS_IDENTITY/LABEL_SIGNATURE_INSERT_BEFORE":"Insert this signature before quoted text in replies","POPUPS_CREATE_FOLDER/TITLE_CREATE_FOLDER":"Create a folder?","POPUPS_CREATE_FOLDER/LABEL_NAME":"Folder name","POPUPS_CREATE_FOLDER/LABEL_PARENT":"Parent folder","POPUPS_CREATE_FOLDER/BUTTON_CREATE":"Create","POPUPS_CREATE_FOLDER/BUTTON_CANCEL":"Cancel","POPUPS_CREATE_FOLDER/BUTTON_CLOSE":"Close","POPUPS_CREATE_FOLDER/TITLE_CREATING_PROCESS":"Creating a folder","POPUPS_CLEAR_FOLDER/TITLE_CLEAR_FOLDER":"Purge all messages from the folder?","POPUPS_CLEAR_FOLDER/BUTTON_CLEAR":"Clear","POPUPS_CLEAR_FOLDER/BUTTON_CANCEL":"Cancel","POPUPS_CLEAR_FOLDER/BUTTON_CLOSE":"Close","POPUPS_CLEAR_FOLDER/DANGER_DESC_WARNING":"Warning!","POPUPS_CLEAR_FOLDER/DANGER_DESC_HTML_1":"This action will result in removing all mails from %FOLDER% folder completely.","POPUPS_CLEAR_FOLDER/DANGER_DESC_HTML_2":"Once started, the process cannot be aborted or cancelled.","POPUPS_CLEAR_FOLDER/TITLE_CLEARING_PROCESS":"Purging the folder...","POPUPS_IMPORT_OPEN_PGP_KEY/TITLE_IMPORT_OPEN_PGP_KEY":"Import OpenPGP key","POPUPS_IMPORT_OPEN_PGP_KEY/BUTTON_IMPORT_OPEN_PGP_KEY":"Import","POPUPS_VIEW_OPEN_PGP_KEY/TITLE_VIEW_OPEN_PGP_KEY":"View OpenPGP key","POPUPS_VIEW_OPEN_PGP_KEY/BUTTON_SELECT":"Select","POPUPS_VIEW_OPEN_PGP_KEY/BUTTON_CLOSE":"Close","POPUPS_GENERATE_OPEN_PGP_KEYS/TITLE_GENERATE_OPEN_PGP_KEYS":"Generate OpenPGP keys","POPUPS_GENERATE_OPEN_PGP_KEYS/LABEL_EMAIL":"Email","POPUPS_GENERATE_OPEN_PGP_KEYS/LABEL_NAME":"Name","POPUPS_GENERATE_OPEN_PGP_KEYS/LABEL_PASSWORD":"Password","POPUPS_GENERATE_OPEN_PGP_KEYS/LABEL_KEY_BIT_LENGTH":"Key length","POPUPS_GENERATE_OPEN_PGP_KEYS/BUTTON_GENERATE_OPEN_PGP_KEYS":"Generate","POPUPS_COMPOSE_OPEN_PGP/TITLE_COMPOSE_OPEN_PGP":"OpenPGP Sign/Encrypt","POPUPS_COMPOSE_OPEN_PGP/LABEL_SIGN":"Sign","POPUPS_COMPOSE_OPEN_PGP/LABEL_ENCRYPT":"Encrypt","POPUPS_COMPOSE_OPEN_PGP/LABEL_PASSWORD":"Password","POPUPS_COMPOSE_OPEN_PGP/BUTTON_SIGN":"Sign","POPUPS_COMPOSE_OPEN_PGP/BUTTON_ENCRYPT":"Encrypt","POPUPS_COMPOSE_OPEN_PGP/BUTTON_SIGN_AND_ENCRYPT":"Sign and encrypt","POPUPS_MESSAGE_OPEN_PGP/TITLE_MESSAGE_OPEN_PGP":"OpenPGP Decrypt","POPUPS_MESSAGE_OPEN_PGP/LABEL_KEY":"Private Key","POPUPS_MESSAGE_OPEN_PGP/LABEL_PASSWORD":"Password","POPUPS_MESSAGE_OPEN_PGP/BUTTON_DECRYPT":"Decrypt","POPUPS_TWO_FACTOR_TEST/TITLE_TEST_CODE":"2-Step verification test","POPUPS_TWO_FACTOR_TEST/LABEL_CODE":"Code","POPUPS_TWO_FACTOR_TEST/BUTTON_TEST":"Test","POPUPS_FILTER/TITLE_CREATE_FILTER":"Create a filter?","POPUPS_FILTER/TITLE_EDIT_FILTER":"Update filter?","POPUPS_FILTER/FILTER_NAME":"Name","POPUPS_FILTER/LEGEND_CONDITIONS":"Conditions","POPUPS_FILTER/LEGEND_ACTIONS":"Actions","POPUPS_FILTER/BUTTON_DONE":"Done","POPUPS_FILTER/BUTTON_ADD_CONDITION":"Add a Condition","POPUPS_FILTER/SELECT_ACTION_NONE":"None","POPUPS_FILTER/SELECT_ACTION_MOVE_TO":"Move to","POPUPS_FILTER/SELECT_ACTION_FORWARD_TO":"Forward to","POPUPS_FILTER/SELECT_ACTION_REJECT":"Reject","POPUPS_FILTER/SELECT_ACTION_VACATION_MESSAGE":"Vacation message","POPUPS_FILTER/SELECT_ACTION_DISCARD":"Discard","POPUPS_FILTER/SELECT_FIELD_FROM":"From","POPUPS_FILTER/SELECT_FIELD_RECIPIENTS":"Recipients (To or CC)","POPUPS_FILTER/SELECT_FIELD_SUBJECT":"Subject","POPUPS_FILTER/SELECT_FIELD_HEADER":"Header","POPUPS_FILTER/SELECT_FIELD_SIZE":"Size","POPUPS_FILTER/SELECT_TYPE_CONTAINS":"Contains","POPUPS_FILTER/SELECT_TYPE_NOT_CONTAINS":"Not Contains","POPUPS_FILTER/SELECT_TYPE_MATCHES":"Matches (* and ? supported)","POPUPS_FILTER/SELECT_TYPE_NOT_MATCHES":"Not Matches (* and ? supported)","POPUPS_FILTER/SELECT_TYPE_REGEXP":"Regexp","POPUPS_FILTER/SELECT_TYPE_NOT_REGEXP":"Not Regexp","POPUPS_FILTER/SELECT_TYPE_EQUAL_TO":"Equal To","POPUPS_FILTER/SELECT_TYPE_NOT_EQUAL_TO":"Not Equal To","POPUPS_FILTER/SELECT_TYPE_OVER":"Over","POPUPS_FILTER/SELECT_TYPE_UNDER":"Under","POPUPS_FILTER/SELECT_MATCH_ANY":"Matching ANY of the following rules","POPUPS_FILTER/SELECT_MATCH_ALL":"Matching ALL of the following rules","POPUPS_FILTER/MARK_AS_READ_LABEL":"Mark as read","POPUPS_FILTER/REPLY_INTERVAL_LABEL":"Reply interval (days)","POPUPS_FILTER/KEEP_LABEL":"Keep","POPUPS_FILTER/STOP_LABEL":"Don't stop processing rules","POPUPS_FILTER/EMAIL_LABEL":"Email","POPUPS_FILTER/VACATION_SUBJECT_LABEL":"Subject (optional)","POPUPS_FILTER/VACATION_MESSAGE_LABEL":"Message","POPUPS_FILTER/VACATION_RECIPIENTS_LABEL":"Recipients (comma separated)","POPUPS_FILTER/REJECT_MESSAGE_LABEL":"Reject message","POPUPS_FILTER/ALL_INCOMING_MESSAGES_DESC":"All incoming messages","POPUPS_SYSTEM_FOLDERS/TITLE_SYSTEM_FOLDERS":"Select system folders","POPUPS_SYSTEM_FOLDERS/SELECT_CHOOSE_ONE":"Choose one","POPUPS_SYSTEM_FOLDERS/SELECT_UNUSE_NAME":"Do not use","POPUPS_SYSTEM_FOLDERS/LABEL_SENT":"Sent","POPUPS_SYSTEM_FOLDERS/LABEL_DRAFTS":"Drafts","POPUPS_SYSTEM_FOLDERS/LABEL_SPAM":"Spam","POPUPS_SYSTEM_FOLDERS/LABEL_TRASH":"Trash","POPUPS_SYSTEM_FOLDERS/LABEL_ARCHIVE":"Archive","POPUPS_SYSTEM_FOLDERS/BUTTON_CANCEL":"Cancel","POPUPS_SYSTEM_FOLDERS/BUTTON_CLOSE":"Close","POPUPS_SYSTEM_FOLDERS/NOTIFICATION_SENT":"You haven't selected \"Sent\" system folder messages are put to after sending.\nIf you don't want to save sent message, please select \"Do not use\" option.","POPUPS_SYSTEM_FOLDERS/NOTIFICATION_DRAFTS":"You haven't selected \"Drafts\" system folder messages are saved to while composing.","POPUPS_SYSTEM_FOLDERS/NOTIFICATION_SPAM":"You haven't selected \"Spam\" system folder spamed messages are placed to.\nIf you wish to remove messages permanently, please select \"Do not use\" option.","POPUPS_SYSTEM_FOLDERS/NOTIFICATION_TRASH":"You haven't selected \"Trash\" system folder deleted messages are placed to.\nIf you wish to remove messages permanently, please select \"Do not use\" option.","POPUPS_SYSTEM_FOLDERS/NOTIFICATION_ARCHIVE":"You haven't selected \"Archive\" system folder achived messages are placed to.","POPUPS_TWO_FACTOR_CFG/LEGEND_TWO_FACTOR_AUTH":"2-Step Verification (TOTP)","POPUPS_TWO_FACTOR_CFG/LABEL_ENABLE_TWO_FACTOR":"Enable 2-Step verification","POPUPS_TWO_FACTOR_CFG/LABEL_TWO_FACTOR_USER":"User","POPUPS_TWO_FACTOR_CFG/LABEL_TWO_FACTOR_STATUS":"Status","POPUPS_TWO_FACTOR_CFG/LABEL_TWO_FACTOR_SECRET":"Secret","POPUPS_TWO_FACTOR_CFG/LABEL_TWO_FACTOR_BACKUP_CODES":"Backup codes","POPUPS_TWO_FACTOR_CFG/BUTTON_CREATE":"Create a secret","POPUPS_TWO_FACTOR_CFG/BUTTON_ACTIVATE":"Activate","POPUPS_TWO_FACTOR_CFG/BUTTON_CLEAR":"Clear","POPUPS_TWO_FACTOR_CFG/BUTTON_LOGOUT":"Logout","POPUPS_TWO_FACTOR_CFG/BUTTON_DONE":"Done","POPUPS_TWO_FACTOR_CFG/BUTTON_TEST":"Test","POPUPS_TWO_FACTOR_CFG/LINK_TEST":"test","POPUPS_TWO_FACTOR_CFG/BUTTON_SHOW_SECRET":"Show Secret","POPUPS_TWO_FACTOR_CFG/BUTTON_HIDE_SECRET":"Hide Secret","POPUPS_TWO_FACTOR_CFG/TWO_FACTOR_REQUIRE_DESC":"Your account requires 2-Step verification configuration.","POPUPS_TWO_FACTOR_CFG/TWO_FACTOR_SECRET_CONFIGURED_DESC":"Configured","POPUPS_TWO_FACTOR_CFG/TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC":"Not configured","POPUPS_TWO_FACTOR_CFG/TWO_FACTOR_SECRET_DESC":"Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually.","POPUPS_TWO_FACTOR_CFG/TWO_FACTOR_BACKUP_CODES_DESC":"If you can't receive codes via Google Authenticator (or other TOTP client), you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive.","POPUPS_TWO_FACTOR_CFG/TWO_FACTOR_SECRET_TEST_BEFORE_DESC":"You can't change this setting before test.","TITLES/LOADING":"Loading","TITLES/LOGIN":"Login","TITLES/MAILBOX":"MailBox","TITLES/SETTINGS":"Settings","TITLES/COMPOSE":"Compose","UPLOAD/ERROR_FILE_IS_TOO_BIG":"File is too big","UPLOAD/ERROR_FILE_PARTIALLY_UPLOADED":"File was partially uploaded due to unknown error","UPLOAD/ERROR_NO_FILE_UPLOADED":"No file uploaded","UPLOAD/ERROR_MISSING_TEMP_FOLDER":"The temporary file is missing","UPLOAD/ERROR_ON_SAVING_FILE":"An unknown file upload error occurred","UPLOAD/ERROR_FILE_TYPE":"Invalid file type","UPLOAD/ERROR_UNKNOWN":"An unknown file upload error occurred","EDITOR/TEXT_SWITCHER_PLAINT_TEXT":"HTML <-> TEXT","EDITOR/TEXT_SWITCHER_RICH_FORMATTING":"Rich formatting","EDITOR/TEXT_SWITCHER_CONFIRM":"Text formatting and images will be lost. Are you sure you want to continue?","SETTINGS_LABELS/LABEL_PERSONAL_NAME":"Personal","SETTINGS_LABELS/LABEL_GENERAL_NAME":"General","SETTINGS_LABELS/LABEL_CONTACTS_NAME":"Contacts","SETTINGS_LABELS/LABEL_FOLDERS_NAME":"Folders","SETTINGS_LABELS/LABEL_ACCOUNTS_NAME":"Accounts","SETTINGS_LABELS/LABEL_IDENTITY_NAME":"Identity","SETTINGS_LABELS/LABEL_IDENTITIES_NAME":"Identities","SETTINGS_LABELS/LABEL_FILTERS_NAME":"Filters","SETTINGS_LABELS/LABEL_TEMPLATES_NAME":"Templates","SETTINGS_LABELS/LABEL_SECURITY_NAME":"Security","SETTINGS_LABELS/LABEL_SOCIAL_NAME":"Social","SETTINGS_LABELS/LABEL_THEMES_NAME":"Themes","SETTINGS_LABELS/LABEL_CHANGE_PASSWORD_NAME":"Password","SETTINGS_LABELS/LABEL_OPEN_PGP_NAME":"OpenPGP","SETTINGS_LABELS/BUTTON_BACK":"Back","SETTINGS_FILTERS/LEGEND_FILTERS":"Filters","SETTINGS_FILTERS/BUTTON_SAVE":"Save","SETTINGS_FILTERS/BUTTON_ADD_FILTER":"Add a Filter","SETTINGS_FILTERS/BUTTON_DELETE":"Delete","SETTINGS_FILTERS/BUTTON_RAW_SCRIPT":"Use Custom User Script","SETTINGS_FILTERS/SUBNAME_NONE":"None","SETTINGS_FILTERS/SUBNAME_MOVE_TO":"Move to \"%FOLDER%\"","SETTINGS_FILTERS/SUBNAME_FORWARD_TO":"Forward to \"%EMAIL%\"","SETTINGS_FILTERS/SUBNAME_REJECT":"Reject","SETTINGS_FILTERS/SUBNAME_VACATION_MESSAGE":"Vacation message","SETTINGS_FILTERS/SUBNAME_DISCARD":"Discard","SETTINGS_FILTERS/CAPABILITY_LABEL":"Capability","SETTINGS_FILTERS/LOADING_PROCESS":"Updating filter list","SETTINGS_FILTERS/DELETING_ASK":"Are you sure?","SETTINGS_FILTERS/CHACHES_NEED_TO_BE_SAVED_DESC":"These changes need to be saved to the server.","SETTINGS_IDENTITY/LEGEND_IDENTITY":"Identity","SETTINGS_IDENTITY/LABEL_DISPLAY_NAME":"Name","SETTINGS_IDENTITY/LABEL_REPLY_TO":"Reply-To","SETTINGS_IDENTITY/LABEL_SIGNATURE":"Signature","SETTINGS_IDENTITY/LABEL_ADD_SIGNATURE_TO_ALL":"Add your signature to all the outgoing messages","SETTINGS_SECURITY/LEGEND_SECURITY":"Security","SETTINGS_SECURITY/LABEL_CONFIGURE_TWO_FACTOR":"Configure 2-Step verification","SETTINGS_SECURITY/LABEL_AUTOLOGOUT":"Auto Logout","SETTINGS_SECURITY/AUTOLOGIN_NEVER_OPTION_NAME":"Never","SETTINGS_SECURITY/AUTOLOGIN_MINUTES_OPTION_NAME":"%MINUTES% minute(s)","SETTINGS_SECURITY/AUTOLOGIN_HOURS_OPTION_NAME":"%HOURS% hour(s)","SETTINGS_GENERAL/LEGEND_GENERAL":"General","SETTINGS_GENERAL/LABEL_LANGUAGE":"Language","SETTINGS_GENERAL/LABEL_IDENTITY":"Identity","SETTINGS_GENERAL/LABEL_LAYOUT":"Layout","SETTINGS_GENERAL/LABEL_LAYOUT_NO_SPLIT":"No Split","SETTINGS_GENERAL/LABEL_LAYOUT_VERTICAL_SPLIT":"Vertical Split","SETTINGS_GENERAL/LABEL_LAYOUT_HORIZONTAL_SPLIT":"Horizontal Split","SETTINGS_GENERAL/LABEL_EDITOR":"Default text editor","SETTINGS_GENERAL/LABEL_EDITOR_HTML":"Html","SETTINGS_GENERAL/LABEL_EDITOR_PLAIN":"Plain","SETTINGS_GENERAL/LABEL_EDITOR_HTML_FORCED":"Html (forced)","SETTINGS_GENERAL/LABEL_EDITOR_PLAIN_FORCED":"Plain (forced)","SETTINGS_GENERAL/LABEL_ANIMATION":"Interface animation","SETTINGS_GENERAL/LABEL_ANIMATION_FULL":"Full","SETTINGS_GENERAL/LABEL_ANIMATION_NORMAL":"Normal","SETTINGS_GENERAL/LABEL_ANIMATION_NONE":"None","SETTINGS_GENERAL/LABEL_VIEW_OPTIONS":"View options","SETTINGS_GENERAL/LABEL_USE_PREVIEW_PANE":"Use preview pane","SETTINGS_GENERAL/LABEL_USE_CHECKBOXES_IN_LIST":"Display checkboxes in list","SETTINGS_GENERAL/LABEL_USE_THREADS":"Use threads","SETTINGS_GENERAL/LABEL_REPLY_SAME_FOLDER":"Place replies in the folder of the message being replied to","SETTINGS_GENERAL/LABEL_SHOW_IMAGES":"Always display external images in message body","SETTINGS_GENERAL/LABEL_SHOW_ANIMATION":"Show animation","SETTINGS_GENERAL/LABEL_MESSAGE_PER_PAGE":"Messages on page","SETTINGS_GENERAL/LABEL_NOTIFICATIONS":"Notifications","SETTINGS_GENERAL/LABEL_SOUND_NOTIFICATION":"Sound notification","SETTINGS_GENERAL/LABEL_CHROME_NOTIFICATION_DESC":"Show new messages notification popups","SETTINGS_GENERAL/LABEL_CHROME_NOTIFICATION_DESC_DENIED":"(Blocked by the browser)","SETTINGS_CONTACTS/LEGEND_CONTACTS":"Contacts","SETTINGS_CONTACTS/LABEL_CONTACTS_AUTOSAVE":"Automatically add recipients to your address book","SETTINGS_CONTACTS/LEGEND_CONTACTS_SYNC":"Remote Synchronization (CardDAV)","SETTINGS_CONTACTS/LABEL_CONTACTS_SYNC_ENABLE":"Enable remote synchronization","SETTINGS_CONTACTS/LABEL_CONTACTS_SYNC_SERVER":"Server","SETTINGS_CONTACTS/LABEL_CONTACTS_SYNC_AB_URL":"Addressbook URL","SETTINGS_CONTACTS/LABEL_CONTACTS_SYNC_USER":"User","SETTINGS_CONTACTS/LABEL_CONTACTS_SYNC_PASSWORD":"Password","SETTINGS_THEMES/LEGEND_THEMES":"Themes","SETTINGS_THEMES/LEGEND_THEMES_CUSTOM":"Custom Theme Configuration","SETTINGS_THEMES/LABEL_CUSTOM_TYPE":"Type","SETTINGS_THEMES/LABEL_CUSTOM_TYPE_LIGHT":"Light","SETTINGS_THEMES/LABEL_CUSTOM_TYPE_DARK":"Dark","SETTINGS_THEMES/LABEL_CUSTOM_BACKGROUND_IMAGE":"Background","SETTINGS_THEMES/BUTTON_UPLOAD_BACKGROUND_IMAGE":"Upload background image (JPG, PNG)","SETTINGS_THEMES/ERROR_FILE_IS_TOO_BIG":"File is too big","SETTINGS_THEMES/ERROR_FILE_TYPE_ERROR":"Invalid file type (JPG and PNG only)","SETTINGS_THEMES/ERROR_UNKNOWN":"An unknown file upload error occurred","SETTINGS_SOCIAL/LEGEND_GOOGLE":"Google","SETTINGS_SOCIAL/BUTTON_GOOGLE_CONNECT":"Connect Google","SETTINGS_SOCIAL/BUTTON_GOOGLE_DISCONNECT":"Disconnect Google","SETTINGS_SOCIAL/MAIN_GOOGLE_DESC":"After enabling login via Google, you can log into this account using Google button on the login screen.","SETTINGS_SOCIAL/LEGEND_FACEBOOK":"Facebook","SETTINGS_SOCIAL/BUTTON_FACEBOOK_CONNECT":"Connect Facebook","SETTINGS_SOCIAL/BUTTON_FACEBOOK_DISCONNECT":"Disconnect Facebook","SETTINGS_SOCIAL/MAIN_FACEBOOK_DESC":"After enabling login via Facebook, you can log into this account using Facebook button on the login screen.","SETTINGS_SOCIAL/LEGEND_TWITTER":"Twitter","SETTINGS_SOCIAL/BUTTON_TWITTER_CONNECT":"Connect Twitter","SETTINGS_SOCIAL/BUTTON_TWITTER_DISCONNECT":"Disconnect Twitter","SETTINGS_SOCIAL/MAIN_TWITTER_DESC":"After enabling login via Twitter, you can log into this account using Twitter button on the login screen.","SETTINGS_FOLDERS/LEGEND_FOLDERS":"Folder List","SETTINGS_FOLDERS/BUTTON_CREATE":"Create Folder","SETTINGS_FOLDERS/BUTTON_SYSTEM":"System Folders","SETTINGS_FOLDERS/BUTTON_DELETE":"Delete","SETTINGS_FOLDERS/BUTTON_SUBSCRIBE":"Subscribe","SETTINGS_FOLDERS/BUTTON_UNSUBSCRIBE":"Unsubscribe","SETTINGS_FOLDERS/LOADING_PROCESS":"Updating folder list","SETTINGS_FOLDERS/CREATING_PROCESS":"Creating a folder","SETTINGS_FOLDERS/DELETING_PROCESS":"Deleting a folder","SETTINGS_FOLDERS/RENAMING_PROCESS":"Renaming a folder","SETTINGS_FOLDERS/DELETING_ASK":"Are you sure?","SETTINGS_FOLDERS/TO_MANY_FOLDERS_DESC_1":"You have too many folders!","SETTINGS_FOLDERS/TO_MANY_FOLDERS_DESC_2":"We have shown only a part of them, to avoid performance problems.","SETTINGS_FOLDERS/HELP_DELETE_FOLDER":"Delete folder","SETTINGS_FOLDERS/HELP_SHOW_HIDE_FOLDER":"Show/hide folder","SETTINGS_FOLDERS/HELP_CHECK_FOR_NEW_MESSAGES":"Check/don't check for new messages","SETTINGS_ACCOUNTS/LEGEND_ACCOUNTS":"Accounts","SETTINGS_ACCOUNTS/LEGEND_IDENTITIES":"Identities","SETTINGS_ACCOUNTS/LEGEND_ACCOUNTS_AND_IDENTITIES":"Accounts and Identities","SETTINGS_ACCOUNTS/BUTTON_ADD_ACCOUNT":"Add an Account","SETTINGS_ACCOUNTS/BUTTON_ADD_IDENTITY":"Add an Identity","SETTINGS_ACCOUNTS/BUTTON_DELETE":"Delete","SETTINGS_ACCOUNTS/LOADING_PROCESS":"Updating...","SETTINGS_ACCOUNTS/DELETING_ASK":"Are you sure?","SETTINGS_ACCOUNTS/DEFAULT_IDENTITY_LABEL":"default","SETTINGS_IDENTITIES/LEGEND_IDENTITY":"Identity","SETTINGS_IDENTITIES/LEGEND_IDENTITIES":"Additional Identities","SETTINGS_IDENTITIES/LABEL_DEFAULT":"Default","SETTINGS_IDENTITIES/LABEL_DISPLAY_NAME":"Name","SETTINGS_IDENTITIES/LABEL_REPLY_TO":"Reply-To","SETTINGS_IDENTITIES/LABEL_SIGNATURE":"Signature","SETTINGS_IDENTITIES/LABEL_ADD_SIGNATURE_TO_ALL":"Add your signature to all the outgoing messages","SETTINGS_IDENTITIES/BUTTON_ADD_IDENTITY":"Add Identity","SETTINGS_IDENTITIES/BUTTON_DELETE":"Delete","SETTINGS_IDENTITIES/LOADING_PROCESS":"Updating identity list","SETTINGS_IDENTITIES/DELETING_ASK":"Are you sure?","SETTINGS_CHANGE_PASSWORD/LEGEND_CHANGE_PASSWORD":"Change Password","SETTINGS_CHANGE_PASSWORD/LABEL_CURRENT_PASSWORD":"Current password","SETTINGS_CHANGE_PASSWORD/LABEL_NEW_PASSWORD":"New password","SETTINGS_CHANGE_PASSWORD/LABEL_REPEAT_PASSWORD":"Confirm New Password","SETTINGS_CHANGE_PASSWORD/BUTTON_UPDATE_PASSWORD":"Set New Password","SETTINGS_CHANGE_PASSWORD/ERROR_PASSWORD_MISMATCH":"Passwords do not match, please try again","SETTINGS_OPEN_PGP/LEGEND_OPEN_PGP":"OpenPGP","SETTINGS_OPEN_PGP/BUTTON_ADD_OPEN_PGP_KEY":"Import OpenPGP Key","SETTINGS_OPEN_PGP/BUTTON_GENERATE_OPEN_PGP_KEYS":"Generate OpenPGP Keys","SETTINGS_OPEN_PGP/TITLE_PRIVATE":"Private","SETTINGS_OPEN_PGP/TITLE_PUBLIC":"Public","SETTINGS_OPEN_PGP/DELETING_ASK":"Are you sure?","SETTINGS_OPEN_PGP/GENERATE_ONLY_HTTPS":"HTTPS only","SETTINGS_OPEN_PGP/LABEL_ALLOW_DRAFT_AUTOSAVE":"Automatically save draft","SHORTCUTS_HELP/LEGEND_SHORTCUTS_HELP":"Keyboard shortcuts help","SHORTCUTS_HELP/TAB_MAILBOX":"Mailbox","SHORTCUTS_HELP/TAB_MESSAGE_LIST":"Message list","SHORTCUTS_HELP/TAB_MESSAGE_VIEW":"Message view","SHORTCUTS_HELP/TAB_COMPOSE":"Compose","SHORTCUTS_HELP/LABEL_OPEN_USER_DROPDOWN":"Open user dropdown","SHORTCUTS_HELP/LABEL_REPLY":"Reply","SHORTCUTS_HELP/LABEL_REPLY_ALL":"Reply All","SHORTCUTS_HELP/LABEL_FORWARD":"Forward","SHORTCUTS_HELP/LABEL_FORWARD_MULTIPLY":"Forward as attachment(s)","SHORTCUTS_HELP/LABEL_HELP":"Help","SHORTCUTS_HELP/LABEL_CHECK_ALL":"Select all messages","SHORTCUTS_HELP/LABEL_ARCHIVE":"Archive","SHORTCUTS_HELP/LABEL_DELETE":"Delete","SHORTCUTS_HELP/LABEL_OPEN_THREAD":"Open selected thread","SHORTCUTS_HELP/LABEL_MOVE":"Move","SHORTCUTS_HELP/LABEL_READ":"Read selected messages","SHORTCUTS_HELP/LABEL_UNREAD":"Unread selected messages","SHORTCUTS_HELP/LABEL_IMPORTANT":"Important, flag selected messages","SHORTCUTS_HELP/LABEL_SEARCH":"Search","SHORTCUTS_HELP/LABEL_CANCEL_SEARCH":"Cancel search","SHORTCUTS_HELP/LABEL_FULLSCREEN_ENTER":"Fullscreen (Preview pane layout)","SHORTCUTS_HELP/LABEL_VIEW_MESSAGE_ENTER":"View message (No preview pane layout)","SHORTCUTS_HELP/LABEL_SWITCH_TO_MESSAGE":"Switch focus to selected message","SHORTCUTS_HELP/LABEL_SWITCH_TO_FOLDER_LIST":"Switch focus to folder list","SHORTCUTS_HELP/LABEL_FULLSCREEN_TOGGLE":"Toggle fullscreen mode","SHORTCUTS_HELP/LABEL_BLOCKQUOTES_TOGGLE":"Toggle message blockquotes","SHORTCUTS_HELP/LABEL_THREAD_NEXT":"Next message in thread","SHORTCUTS_HELP/LABEL_THREAD_PREV":"Previous message in thread","SHORTCUTS_HELP/LABEL_PRINT":"Print","SHORTCUTS_HELP/LABEL_EXIT_FULLSCREEN":"Exit fullscreen mode","SHORTCUTS_HELP/LABEL_CLOSE_MESSAGE":"Close message (No preview pane layout)","SHORTCUTS_HELP/LABEL_SWITCH_TO_LIST":"Switch focus back to message list","SHORTCUTS_HELP/LABEL_OPEN_COMPOSE_POPUP":"Open compose popup","SHORTCUTS_HELP/LABEL_MINIMIZE_COMPOSE_POPUP":"Minimize compose popup","SHORTCUTS_HELP/LABEL_OPEN_IDENTITIES_DROPDOWN":"Open identities dropdown","SHORTCUTS_HELP/LABEL_SAVE_MESSAGE":"Save message","SHORTCUTS_HELP/LABEL_SEND_MESSAGE":"Send message","SHORTCUTS_HELP/LABEL_CLOSE_COMPOSE":"Close compose","PGP_NOTIFICATIONS/NO_PUBLIC_KEYS_FOUND":"No public keys found","PGP_NOTIFICATIONS/NO_PUBLIC_KEYS_FOUND_FOR":"No public keys found for \"%EMAIL%\" email","PGP_NOTIFICATIONS/NO_PRIVATE_KEY_FOUND":"No private key found","PGP_NOTIFICATIONS/NO_PRIVATE_KEY_FOUND_FOR":"No private key found for \"%EMAIL%\" email","PGP_NOTIFICATIONS/ADD_A_PUBLICK_KEY":"Add a public key","PGP_NOTIFICATIONS/SELECT_A_PRIVATE_KEY":"Select a private key","PGP_NOTIFICATIONS/UNVERIFIRED_SIGNATURE":"Unverified signature","PGP_NOTIFICATIONS/DECRYPTION_ERROR":"OpenPGP decryption error","PGP_NOTIFICATIONS/GOOD_SIGNATURE":"Good signature from %USER%","PGP_NOTIFICATIONS/PGP_ERROR":"OpenPGP error: %ERROR%","PGP_NOTIFICATIONS/SPECIFY_FROM_EMAIL":"Please specify FROM email address","PGP_NOTIFICATIONS/SPECIFY_AT_LEAST_ONE_RECIPIENT":"Please specify at least one recipient","NOTIFICATIONS/INVALID_TOKEN":"Invalid token","NOTIFICATIONS/AUTH_ERROR":"Authentication failed","NOTIFICATIONS/ACCESS_ERROR":"Access error","NOTIFICATIONS/CONNECTION_ERROR":"Can't connect to server","NOTIFICATIONS/CAPTCHA_ERROR":"Incorrect CAPTCHA.","NOTIFICATIONS/SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE":"This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings.","NOTIFICATIONS/SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE":"This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings.","NOTIFICATIONS/SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE":"This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings.","NOTIFICATIONS/DOMAIN_NOT_ALLOWED":"Domain is not allowed","NOTIFICATIONS/ACCOUNT_NOT_ALLOWED":"Account is not allowed","NOTIFICATIONS/ACCOUNT_TWO_FACTOR_AUTH_REQUIRED":"Two factor verification required","NOTIFICATIONS/ACCOUNT_TWO_FACTOR_AUTH_ERROR":"Two factor verification error","NOTIFICATIONS/COULD_NOT_SAVE_NEW_PASSWORD":"Could not save new password","NOTIFICATIONS/CURRENT_PASSWORD_INCORRECT":"Current password incorrect","NOTIFICATIONS/NEW_PASSWORD_SHORT":"Password is too short","NOTIFICATIONS/NEW_PASSWORD_WEAK":"Password is too easy","NOTIFICATIONS/NEW_PASSWORD_FORBIDDENT":"Password contains forbidden characters","NOTIFICATIONS/CONTACTS_SYNC_ERROR":"Contacts synchronization error","NOTIFICATIONS/CANT_GET_MESSAGE_LIST":"Can't get message list","NOTIFICATIONS/CANT_GET_MESSAGE":"Can't get message","NOTIFICATIONS/CANT_DELETE_MESSAGE":"Can't delete message","NOTIFICATIONS/CANT_MOVE_MESSAGE":"Can't move message","NOTIFICATIONS/CANT_SAVE_MESSAGE":"Can't save message","NOTIFICATIONS/CANT_SEND_MESSAGE":"Can't send message","NOTIFICATIONS/INVALID_RECIPIENTS":"Invalid recipients","NOTIFICATIONS/CANT_SAVE_FILTERS":"Can't save filters","NOTIFICATIONS/CANT_GET_FILTERS":"Can't get filters","NOTIFICATIONS/FILTERS_ARE_NOT_CORRECT":"Filters are not correct","NOTIFICATIONS/CANT_CREATE_FOLDER":"Can't create folder","NOTIFICATIONS/CANT_RENAME_FOLDER":"Can't rename folder","NOTIFICATIONS/CANT_DELETE_FOLDER":"Can't delete folder","NOTIFICATIONS/CANT_DELETE_NON_EMPTY_FOLDER":"Can't delete non-empty directory","NOTIFICATIONS/CANT_SUBSCRIBE_FOLDER":"Can't subscribe folder","NOTIFICATIONS/CANT_UNSUBSCRIBE_FOLDER":"Can't unsubscribe folder","NOTIFICATIONS/CANT_SAVE_SETTINGS":"Can't save settings","NOTIFICATIONS/CANT_SAVE_PLUGIN_SETTINGS":"Can't save settings","NOTIFICATIONS/DOMAIN_ALREADY_EXISTS":"Domain already exists","NOTIFICATIONS/CANT_INSTALL_PACKAGE":"Failed to install package","NOTIFICATIONS/CANT_DELETE_PACKAGE":"Failed to remove package","NOTIFICATIONS/INVALID_PLUGIN_PACKAGE":"Invalid plugin package","NOTIFICATIONS/UNSUPPORTED_PLUGIN_PACKAGE":"Unsupported plugin package","NOTIFICATIONS/LICENSING_SERVER_IS_UNAVAILABLE":"Subscription server is unvailable","NOTIFICATIONS/LICENSING_DOMAIN_EXPIRED":"Subscription for this domain has expired.","NOTIFICATIONS/LICENSING_DOMAIN_BANNED":"Subscription for this domain is banned.","NOTIFICATIONS/DEMO_SEND_MESSAGE_ERROR":"For security purposes, this account is not allowed to send messages to external e-mail addresses!","NOTIFICATIONS/DEMO_ACCOUNT_ERROR":"For security purposes, this account is not allowed for this action!","NOTIFICATIONS/ACCOUNT_ALREADY_EXISTS":"Account already exists","NOTIFICATIONS/ACCOUNT_DOES_NOT_EXIST":"Account doesn't exist","NOTIFICATIONS/MAIL_SERVER_ERROR":"An error has occured while accessing mail server","NOTIFICATIONS/INVALID_INPUT_ARGUMENT":"Invalid input argument","NOTIFICATIONS/UNKNOWN_ERROR":"Unknown error","STATIC/BACK_LINK":"Reload","STATIC/DOMAIN_LIST_DESC":"List of domains webmail is allowed to access.","STATIC/PHP_EXSTENSIONS_ERROR_DESC":"Required PHP extension are not available in your PHP configuration!","STATIC/PHP_VERSION_ERROR_DESC":"Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!","STATIC/NO_SCRIPT_TITLE":"JavaScript is required for this application.","STATIC/NO_SCRIPT_DESC":"JavaScript support is not available in your browser.\nPlease enable JavaScript support in your browser settings and retry.","STATIC/NO_COOKIE_TITLE":"Cookies support is required for this application.","STATIC/NO_COOKIE_DESC":"Cookies support is not available in your browser.\nPlease enable Cookie support in your browser settings and retry.","STATIC/BAD_BROWSER_TITLE":"Your browser is outdated.","STATIC/BAD_BROWSER_DESC":"To use all the features of the application,\ndownload and install one of these browsers:"};window.moment && window.moment.locale && window.moment.locale('en'); \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/cache/5b/1c/5b1c51ed23b96bde49c865e074352dc9b29808f0 b/copper-server/core/rainloop/app/data/_data_/_default_/cache/5b/1c/5b1c51ed23b96bde49c865e074352dc9b29808f0 deleted file mode 100644 index 2efb8672..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/cache/5b/1c/5b1c51ed23b96bde49c865e074352dc9b29808f0 +++ /dev/null @@ -1 +0,0 @@ -window.rainloopTEMPLATES=[" \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/configs/application.ini b/copper-server/core/rainloop/app/data/_data_/_default_/configs/application.ini deleted file mode 100644 index 5a977b34..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/configs/application.ini +++ /dev/null @@ -1,356 +0,0 @@ -; RainLoop Webmail configuration file -; Please don't add custom parameters here, those will be overwritten - -[webmail] -; Text displayed as page title -title = "Copper Webmail" - -; Text displayed on startup -loading_description = "COPPER" -favicon_url = "" - -; Theme used by default -theme = "Default" - -; Allow theme selection on settings screen -allow_themes = On -allow_user_background = Off - -; Language used by default -language = "en" - -; Admin Panel interface language -language_admin = "en" - -; Allow language selection on settings screen -allow_languages_on_settings = On -allow_additional_accounts = On -allow_additional_identities = On - -; Number of messages displayed on page by default -messages_per_page = 30 - -; File size limit (MB) for file upload on compose screen -; 0 for unlimited. -attachment_size_limit = 25 - -[interface] -show_attachment_thumbnail = On -use_native_scrollbars = Off -new_move_to_folder_button = On - -[branding] -login_logo = "" -login_background = "" -login_desc = "" -login_css = "" -login_powered = On -user_css = "" -user_logo = "" -user_logo_title = "" -user_logo_message = "" -user_iframe_message = "" -welcome_page_url = "" -welcome_page_display = "none" - -[contacts] -; Enable contacts -enable = On -allow_sync = On -sync_interval = 30 -type = "mysql" -pdo_dsn = "mysql:host=172.19.0.19;port=3306;dbname=rainloop" -pdo_user = "rainloop" -pdo_password = "rainloop" -suggestions_limit = 05 - -[security] -; Enable CSRF protection (http://en.wikipedia.org/wiki/Cross-site_request_forgery) -csrf_protection = On -custom_server_signature = "RainLoop" -x_frame_options_header = "" -openpgp = Off - -; Login and password for web admin panel -admin_login = "admin" -admin_password = "12345" - -; Access settings -allow_admin_panel = On -allow_two_factor_auth = Off -force_two_factor_auth = Off -hide_x_mailer_header = Off -admin_panel_host = "" -admin_panel_key = "admin" -content_security_policy = "" -core_install_access_domain = "" - -[ssl] -; Require verification of SSL certificate used. -verify_certificate = Off - -; Allow self-signed certificates. Requires verify_certificate. -allow_self_signed = On - -; Location of Certificate Authority file on local filesystem (/etc/ssl/certs/ca-certificates.crt) -cafile = "" - -; capath must be a correctly hashed certificate directory. (/etc/ssl/certs/) -capath = "" - -[capa] -folders = On -composer = On -contacts = On -settings = On -quota = On -help = On -reload = On -search = On -search_adv = On -filters = On -x-templates = Off -dangerous_actions = On -message_actions = On -messagelist_actions = On -attachments_actions = On - -[login] -default_domain = "copper.opensource.lk" - -; Allow language selection on webmail login screen -allow_languages_on_login = On -determine_user_language = On -determine_user_domain = Off -welcome_page = On -hide_submit_button = On -forgot_password_link_url = "" -registration_link_url = "" -login_lowercase = On - -; This option allows webmail to remember the logged in user -; once they closed the browser window. -; -; Values: -; "DefaultOff" - can be used, disabled by default; -; "DefaultOn" - can be used, enabled by default; -; "Unused" - cannot be used -sign_me_auto = "DefaultOff" - -[plugins] -; Enable plugin support -enable = On - -; List of enabled plugins -enabled_list = "ldap-change-password" - -[defaults] -; Editor mode used by default (Plain, Html, HtmlForced or PlainForced) -view_editor_type = "Html" - -; layout: 0 - no preview, 1 - side preview, 2 - bottom preview -view_layout = 1 -view_use_checkboxes = On -autologout = 30 -show_images = Off -contacts_autosave = On -mail_use_threads = Off -allow_draft_autosave = On -mail_reply_same_folder = Off - -[logs] -; Enable logging -enable = Off - -; Logs entire request only if error occured (php requred) -write_on_error_only = Off - -; Logs entire request only if php error occured -write_on_php_error_only = Off - -; Logs entire request only if request timeout (in seconds) occured. -write_on_timeout_only = 0 - -; Required for development purposes only. -; Disabling this option is not recommended. -hide_passwords = On -#time_offset = "0" -time_offset = "1" -session_filter = "" - -; Log filename. -; For security reasons, some characters are removed from filename. -; Allows for pattern-based folder creation (see examples below). -; -; Patterns: -; {date:Y-m-d} - Replaced by pattern-based date -; Detailed info: http://www.php.net/manual/en/function.date.php -; {user:email} - Replaced by user's email address -; If user is not logged in, value is set to "unknown" -; {user:login} - Replaced by user's login (the user part of an email) -; If user is not logged in, value is set to "unknown" -; {user:domain} - Replaced by user's domain name (the domain part of an email) -; If user is not logged in, value is set to "unknown" -; {user:uid} - Replaced by user's UID regardless of account currently used -; -; {user:ip} -; {request:ip} - Replaced by user's IP address -; -; Others: -; {imap:login} {imap:host} {imap:port} -; {smtp:login} {smtp:host} {smtp:port} -; -; Examples: -; filename = "log-{date:Y-m-d}.txt" -; filename = "{date:Y-m-d}/{user:domain}/{user:email}_{user:uid}.log" -; filename = "{user:email}-{date:Y-m-d}.txt" -filename = "log-{date:Y-m-d}.txt" - -; Enable auth logging in a separate file (for fail2ban) -auth_logging = Off -auth_logging_filename = "fail2ban/auth-{date:Y-m-d}.txt" -auth_logging_format = "[{date:Y-m-d H:i:s}] Auth failed: ip={request:ip} user={imap:login} host={imap:host} port={imap:port}" - -[debug] -; Special option required for development purposes -enable = Off - -[social] -; Google -google_enable = On -google_enable_auth = Off -google_enable_auth_fast = Off -google_enable_drive = Off -google_enable_preview = Off -google_client_id = "" -google_client_secret = "" -google_api_key = "" - -; Facebook -fb_enable = Off -fb_app_id = "" -fb_app_secret = "" - -; Twitter -twitter_enable = Off -twitter_consumer_key = "" -twitter_consumer_secret = "" - -; Dropbox -dropbox_enable = Off -dropbox_api_key = "" - -[cache] -; The section controls caching of the entire application. -; -; Enables caching in the system -enable = On - -; Additional caching key. If changed, cache is purged -index = "v1" - -; Can be: files, APC, memcache, redis (beta) -fast_cache_driver = "files" - -; Additional caching key. If changed, fast cache is purged -fast_cache_index = "v1" - -; Browser-level cache. If enabled, caching is maintainted without using files -http = On - -; Browser-level cache time (seconds, Expires header) -http_expires = 3600 - -; Caching message UIDs when searching and sorting (threading) -server_uids = On - -[labs] -; Experimental settings. Handle with care. -; -allow_mobile_version = On -ignore_folders_subscription = Off -check_new_password_strength = On -update_channel = "stable" -allow_gravatar = On -allow_prefetch = On -allow_smart_html_links = On -cache_system_data = On -date_from_headers = On -autocreate_system_folders = On -allow_message_append = Off -disable_iconv_if_mbstring_supported = Off -login_fault_delay = 1 -log_ajax_response_write_limit = 300 -allow_html_editor_source_button = Off -allow_html_editor_biti_buttons = Off -allow_ctrl_enter_on_compose = On -try_to_detect_hidden_images = Off -hide_dangerous_actions = Off -use_app_debug_js = Off -use_mobile_version_for_tablets = Off -use_app_debug_css = Off -use_imap_sort = On -use_imap_force_selection = Off -use_imap_list_subscribe = On -use_imap_thread = On -use_imap_move = Off -use_imap_expunge_all_on_delete = Off -imap_forwarded_flag = "$Forwarded" -imap_read_receipt_flag = "$ReadReceipt" -imap_body_text_limit = 555000 -imap_message_list_fast_simple_search = On -imap_message_list_count_limit_trigger = 0 -imap_message_list_date_filter = 0 -imap_message_list_permanent_filter = "" -imap_message_all_headers = Off -imap_large_thread_limit = 50 -imap_folder_list_limit = 200 -imap_show_login_alert = On -imap_use_auth_plain = On -imap_use_auth_cram_md5 = Off -smtp_show_server_errors = Off -smtp_use_auth_plain = On -smtp_use_auth_cram_md5 = Off -sieve_allow_raw_script = Off -sieve_utf8_folder_name = On -sieve_auth_plain_initial = On -sieve_allow_fileinto_inbox = Off -imap_timeout = 300 -smtp_timeout = 60 -sieve_timeout = 10 -domain_list_limit = 99 -mail_func_clear_headers = On -mail_func_additional_parameters = Off -favicon_status = On -folders_spec_limit = 50 -owncloud_save_folder = "Attachments" -owncloud_suggestions = On -curl_proxy = "" -curl_proxy_auth = "" -in_iframe = Off -force_https = Off -custom_login_link = "" -custom_logout_link = "" -allow_external_login = Off -allow_external_sso = Off -external_sso_key = "" -http_client_ip_check_proxy = Off -fast_cache_memcache_host = "127.0.0.1" -fast_cache_memcache_port = 11211 -fast_cache_redis_host = "127.0.0.1" -fast_cache_redis_port = 6379 -use_local_proxy_for_external_images = Off -detect_image_exif_orientation = On -cookie_default_path = "" -cookie_default_secure = Off -check_new_messages = On -replace_env_in_configuration = "" -startup_url = "" -strict_html_parser = Off -allow_cmd = Off -dev_email = "" -dev_password = "" - -[version] -current = "1.12.0" -saved = "Fri, 26 Oct 2018 10:29:57 +0000" \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/configs/plugin-directadmin-change-password.ini b/copper-server/core/rainloop/app/data/_data_/_default_/configs/plugin-directadmin-change-password.ini deleted file mode 100644 index df508a97..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/configs/plugin-directadmin-change-password.ini +++ /dev/null @@ -1,6 +0,0 @@ -; RainLoop Webmail plugin (directadmin-change-password) - -[plugin] -direct_admin_host = "" -direct_admin_port = 2222 -allowed_emails = "*" \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/configs/plugin-ldap-change-password.ini b/copper-server/core/rainloop/app/data/_data_/_default_/configs/plugin-ldap-change-password.ini deleted file mode 100644 index c6da5458..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/configs/plugin-ldap-change-password.ini +++ /dev/null @@ -1,9 +0,0 @@ -; RainLoop Webmail plugin (ldap-change-password) - -[plugin] -hostname = "172.19.0.22" -port = 389 -user_dn_format = "mail={email},ou=users,domainName=coppermail.dyndns.org, dc=coppermail,dc=dyndns,dc=org" -password_field = "userPassword" -password_enc_type = "SSHA" -allowed_emails = "*" \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/domains/copper.opensource.lk.ini b/copper-server/core/rainloop/app/data/_data_/_default_/domains/copper.opensource.lk.ini deleted file mode 100644 index 37d8d4e1..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/domains/copper.opensource.lk.ini +++ /dev/null @@ -1,16 +0,0 @@ -imap_host = "172.19.0.17" -imap_port = 143 -imap_secure = "TLS" -imap_short_login = On -sieve_use = Off -sieve_allow_raw = Off -sieve_host = "" -sieve_port = 4190 -sieve_secure = "None" -smtp_host = "172.19.0.17" -smtp_port = 587 -smtp_secure = "TLS" -smtp_short_login = On -smtp_auth = On -smtp_php_mail = Off -white_list = "" \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/domains/coppermail.dyndns.org.ini b/copper-server/core/rainloop/app/data/_data_/_default_/domains/coppermail.dyndns.org.ini deleted file mode 100644 index 37d8d4e1..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/domains/coppermail.dyndns.org.ini +++ /dev/null @@ -1,16 +0,0 @@ -imap_host = "172.19.0.17" -imap_port = 143 -imap_secure = "TLS" -imap_short_login = On -sieve_use = Off -sieve_allow_raw = Off -sieve_host = "" -sieve_port = 4190 -sieve_secure = "None" -smtp_host = "172.19.0.17" -smtp_port = 587 -smtp_secure = "TLS" -smtp_short_login = On -smtp_auth = On -smtp_php_mail = Off -white_list = "" \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/domains/disabled b/copper-server/core/rainloop/app/data/_data_/_default_/domains/disabled deleted file mode 100644 index b641ea75..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/domains/disabled +++ /dev/null @@ -1 +0,0 @@ -outlook.com,qq.com,yahoo.com diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/domains/gmail.com.ini b/copper-server/core/rainloop/app/data/_data_/_default_/domains/gmail.com.ini deleted file mode 100644 index 950f7059..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/domains/gmail.com.ini +++ /dev/null @@ -1,7 +0,0 @@ -imap_host = "imap.gmail.com" -imap_port = 993 -imap_secure = "SSL" -smtp_host = "smtp.gmail.com" -smtp_port = 587 -smtp_secure = "TLS" -smtp_auth = On diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/domains/outlook.com.ini b/copper-server/core/rainloop/app/data/_data_/_default_/domains/outlook.com.ini deleted file mode 100644 index ece6da4b..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/domains/outlook.com.ini +++ /dev/null @@ -1,7 +0,0 @@ -imap_host = "imap-mail.outlook.com" -imap_port = 993 -imap_secure = "SSL" -smtp_host = "smtp-mail.outlook.com" -smtp_port = 587 -smtp_secure = "TLS" -smtp_auth = On \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/domains/qq.com.ini b/copper-server/core/rainloop/app/data/_data_/_default_/domains/qq.com.ini deleted file mode 100644 index c9be4e79..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/domains/qq.com.ini +++ /dev/null @@ -1,7 +0,0 @@ -imap_host = "imap.qq.com" -imap_port = 993 -imap_secure = "SSL" -smtp_host = "smtp.qq.com" -smtp_port = 465 -smtp_secure = "SSL" -smtp_auth = On diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/domains/yahoo.com.ini b/copper-server/core/rainloop/app/data/_data_/_default_/domains/yahoo.com.ini deleted file mode 100644 index 682664ca..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/domains/yahoo.com.ini +++ /dev/null @@ -1,7 +0,0 @@ -imap_host = "imap.mail.yahoo.com" -imap_port = 993 -imap_secure = "SSL" -smtp_host = "smtp.mail.yahoo.com" -smtp_port = 587 -smtp_secure = "TLS" -smtp_auth = On diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/ChangePasswordLdapDriver.php b/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/ChangePasswordLdapDriver.php deleted file mode 100644 index 69b6b665..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/ChangePasswordLdapDriver.php +++ /dev/null @@ -1,230 +0,0 @@ -sHostName = $sHostName; - $this->iHostPort = $iHostPort; - $this->sUserDnFormat = $sUserDnFormat; - $this->sPasswordField = $sPasswordField; - $this->sPasswordEncType = $sPasswordEncType; - - return $this; - } - - /** - * @param string $sAllowedEmails - * - * @return \ChangePasswordLdapDriver - */ - public function SetAllowedEmails($sAllowedEmails) - { - $this->sAllowedEmails = $sAllowedEmails; - - return $this; - } - - /** - * @param \MailSo\Log\Logger $oLogger - * - * @return \ChangePasswordLdapDriver - */ - public function SetLogger($oLogger) - { - if ($oLogger instanceof \MailSo\Log\Logger) - { - $this->oLogger = $oLogger; - } - - return $this; - } - - /** - * @param \RainLoop\Account $oAccount - * - * @return bool - */ - public function PasswordChangePossibility($oAccount) - { - return $oAccount && $oAccount->Email() && - \RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails); - } - - /** - * @param \RainLoop\Model\Account $oAccount - * @param string $sPrevPassword - * @param string $sNewPassword - * - * @return bool - */ - public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) - { - $bResult = false; - - try - { - $sDomain = \MailSo\Base\Utils::GetDomainFromEmail($oAccount->Email()); - $sUserDn = \strtr($this->sUserDnFormat, array( - '{domain}' => $sDomain, - '{domain:dc}' => 'dc='.\strtr($sDomain, array('.' => ',dc=')), - '{email}' => $oAccount->Email(), - '{email:user}' => \MailSo\Base\Utils::GetAccountNameFromEmail($oAccount->Email()), - '{email:domain}' => $sDomain, - '{login}' => $oAccount->Login(), - '{imap:login}' => $oAccount->Login(), - '{imap:host}' => $oAccount->DomainIncHost(), - '{imap:port}' => $oAccount->DomainIncPort() - )); - - $oCon = @\ldap_connect($this->sHostName, $this->iHostPort); - if ($oCon) - { - @\ldap_set_option($oCon, LDAP_OPT_PROTOCOL_VERSION, 3); - - if (!@\ldap_bind($oCon, $sUserDn, $sPrevPassword)) - { - if ($this->oLogger) - { - $sError = $oCon ? @\ldap_error($oCon) : ''; - $iErrno = $oCon ? @\ldap_errno($oCon) : 0; - - $this->oLogger->Write('ldap_bind error: '.$sError.' ('.$iErrno.')', - \MailSo\Log\Enumerations\Type::WARNING, 'LDAP'); - } - - return false; - } - } - else - { - return false; - } - - $sSshaSalt = ''; - $sShaPrefix = '{SHA}'; - $sEncodedNewPassword = $sNewPassword; - switch (\strtolower($this->sPasswordEncType)) - { - case 'ssha': - $sSshaSalt = $this->getSalt(4); - $sShaPrefix = '{SSHA}'; - case 'sha': - switch (true) - { - default: - case \function_exists('sha1'): - $sEncodedNewPassword = $sShaPrefix.\base64_encode(\sha1($sNewPassword.$sSshaSalt, true).$sSshaSalt); - break; - case \function_exists('hash'): - $sEncodedNewPassword = $sShaPrefix.\base64_encode(\hash('sha1', $sNewPassword, true).$sSshaSalt); - break; - case \function_exists('mhash') && defined('MHASH_SHA1'): - $sEncodedNewPassword = $sShaPrefix.\base64_encode(\mhash(MHASH_SHA1, $sNewPassword).$sSshaSalt); - break; - } - break; - case 'md5': - $sEncodedNewPassword = '{MD5}'.\base64_encode(\pack('H*', \md5($sNewPassword))); - break; - case 'crypt': - $sEncodedNewPassword = '{CRYPT}'.\crypt($sNewPassword, $this->getSalt(2)); - break; - } - - $aEntry = array(); - $aEntry[$this->sPasswordField] = (string) $sEncodedNewPassword; - - if (!!@\ldap_modify($oCon, $sUserDn, $aEntry)) - { - $bResult = true; - } - else - { - if ($this->oLogger) - { - $sError = $oCon ? @\ldap_error($oCon) : ''; - $iErrno = $oCon ? @\ldap_errno($oCon) : 0; - - $this->oLogger->Write('ldap_modify error: '.$sError.' ('.$iErrno.')', - \MailSo\Log\Enumerations\Type::WARNING, 'LDAP'); - } - } - } - catch (\Exception $oException) - { - if ($this->oLogger) - { - $this->oLogger->WriteException($oException, - \MailSo\Log\Enumerations\Type::WARNING, 'LDAP'); - } - - $bResult = false; - } - - return $bResult; - } - - /** - * @param int $iLength - * - * @return string - */ - private function getSalt($iLength) - { - $sChars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; - $iCharsLength = \strlen($sChars); - - $sResult = ''; - while (\strlen($sResult) < $iLength) - { - $sResult .= \substr($sChars, \rand() % $iCharsLength, 1); - } - - return $sResult; - } -} diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/LICENSE b/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/LICENSE deleted file mode 100644 index 3c3305e3..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 RainLoop Team - -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. diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/README b/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/README deleted file mode 100644 index 53c1abf7..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/README +++ /dev/null @@ -1 +0,0 @@ -Plugin that adds functionality to change the email account password (LDAP Password). diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/VERSION b/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/VERSION deleted file mode 100644 index b123147e..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/VERSION +++ /dev/null @@ -1 +0,0 @@ -1.1 \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/index.php b/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/index.php deleted file mode 100644 index cb92f865..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/plugins/ldap-change-password/index.php +++ /dev/null @@ -1,79 +0,0 @@ -addHook('main.fabrica', 'MainFabrica'); - } - - /** - * @return string - */ - public function Supported() - { - if (!\function_exists('ldap_connect')) - { - return 'The LDAP PHP exention must be installed to use this plugin'; - } - - return ''; - } - - /** - * @param string $sName - * @param mixed $oProvider - */ - public function MainFabrica($sName, &$oProvider) - { - switch ($sName) - { - case 'change-password': - - $sHostName = \trim($this->Config()->Get('plugin', 'hostname', '')); - $iHostPort = (int) $this->Config()->Get('plugin', 'port', 389); - $sUserDnFormat = \trim($this->Config()->Get('plugin', 'user_dn_format', '')); - $sPasswordField = \trim($this->Config()->Get('plugin', 'password_field', '')); - $sPasswordEncType = \trim($this->Config()->Get('plugin', 'password_enc_type', '')); - - if (!empty($sHostName) && 0 < $iHostPort && !empty($sUserDnFormat) && !empty($sPasswordField) && !empty($sPasswordEncType)) - { - include_once __DIR__.'/ChangePasswordLdapDriver.php'; - - $oProvider = new \ChangePasswordLdapDriver(); - - $oProvider - ->SetConfig($sHostName, $iHostPort, $sUserDnFormat, $sPasswordField, $sPasswordEncType) - ->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', '')))) - ->SetLogger($this->Manager()->Actions()->Logger()) - ; - } - break; - } - } - - /** - * @return array - */ - public function configMapping() - { - return array( - \RainLoop\Plugins\Property::NewInstance('hostname')->SetLabel('LDAP hostname') - ->SetDefaultValue('127.0.0.1'), - \RainLoop\Plugins\Property::NewInstance('port')->SetLabel('LDAP port') - ->SetType(\RainLoop\Enumerations\PluginPropertyType::INT) - ->SetDefaultValue(389), - \RainLoop\Plugins\Property::NewInstance('user_dn_format')->SetLabel('User DN format') - ->SetDescription('LDAP user dn format. Supported tokens: {email}, {login}, {domain}, {domain:dc}, {imap:login}, {imap:host}, {imap:port}') - ->SetDefaultValue('uid={imap:login},ou=Users,{domain:dc}'), - \RainLoop\Plugins\Property::NewInstance('password_field')->SetLabel('Password field') - ->SetDefaultValue('userPassword'), - \RainLoop\Plugins\Property::NewInstance('password_enc_type')->SetLabel('Encryption type') - ->SetType(\RainLoop\Enumerations\PluginPropertyType::SELECTION) - ->SetDefaultValue(array('SHA', 'SSHA', 'MD5', 'Crypt', 'Clear')), - \RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') - ->SetDescription('Allowed emails, space as delimiter, wildcard supported. Example: user1@domain1.net user2@domain1.net *@domain2.net') - ->SetDefaultValue('*') - ); - } -} diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin@coppermail.dyndns.org/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin@coppermail.dyndns.org/settings_local deleted file mode 100644 index 0bf23f3d..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin@coppermail.dyndns.org/settings_local +++ /dev/null @@ -1 +0,0 @@ -{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin_horde@copper.opensource.lk/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin_horde@copper.opensource.lk/settings_local deleted file mode 100644 index 0bf23f3d..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin_horde@copper.opensource.lk/settings_local +++ /dev/null @@ -1 +0,0 @@ -{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin_horde@coppermail.dyndns.org/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin_horde@coppermail.dyndns.org/settings_local deleted file mode 100644 index 0bf23f3d..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ad/admin_horde@coppermail.dyndns.org/settings_local +++ /dev/null @@ -1 +0,0 @@ -{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/an/anushka@copper.opensource.lk/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/an/anushka@copper.opensource.lk/settings_local deleted file mode 100644 index 0bf23f3d..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/an/anushka@copper.opensource.lk/settings_local +++ /dev/null @@ -1 +0,0 @@ -{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ba/bandara@copper.opensource.lk/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ba/bandara@copper.opensource.lk/settings_local deleted file mode 100644 index 0bf23f3d..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ba/bandara@copper.opensource.lk/settings_local +++ /dev/null @@ -1 +0,0 @@ -{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@copper.opensource.lk/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@copper.opensource.lk/settings_local deleted file mode 100644 index 0bf23f3d..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@copper.opensource.lk/settings_local +++ /dev/null @@ -1 +0,0 @@ -{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@coppermail.dyndns.org/settings b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@coppermail.dyndns.org/settings deleted file mode 100644 index 59367b3c..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@coppermail.dyndns.org/settings +++ /dev/null @@ -1 +0,0 @@ -{"DesktopNotifications":false} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@coppermail.dyndns.org/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@coppermail.dyndns.org/settings_local deleted file mode 100644 index 4f255d84..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/ls/lsf@coppermail.dyndns.org/settings_local +++ /dev/null @@ -1 +0,0 @@ -{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Spam","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/s_/s_admin@coppermail.dyndns.org/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/s_/s_admin@coppermail.dyndns.org/settings_local deleted file mode 100644 index 0bf23f3d..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/s_/s_admin@coppermail.dyndns.org/settings_local +++ /dev/null @@ -1 +0,0 @@ -{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/su/supun@copper.opensource.lk/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/su/supun@copper.opensource.lk/settings_local deleted file mode 100644 index 0bf23f3d..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/su/supun@copper.opensource.lk/settings_local +++ /dev/null @@ -1 +0,0 @@ -{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/te/test@copper.opensource.lk/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/te/test@copper.opensource.lk/settings_local deleted file mode 100644 index 0bf23f3d..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/te/test@copper.opensource.lk/settings_local +++ /dev/null @@ -1 +0,0 @@ -{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/te/test@coppermail.dyndns.org/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/te/test@coppermail.dyndns.org/settings_local deleted file mode 100644 index 0bf23f3d..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/te/test@coppermail.dyndns.org/settings_local +++ /dev/null @@ -1 +0,0 @@ -{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/th/tharanga@copper.opensource.lk/settings_local b/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/th/tharanga@copper.opensource.lk/settings_local deleted file mode 100644 index 0bf23f3d..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/storage/cfg/th/tharanga@copper.opensource.lk/settings_local +++ /dev/null @@ -1 +0,0 @@ -{"SentFolder":"Sent","DraftFolder":"Drafts","SpamFolder":"Junk","TrashFolder":"Trash","ArchiveFolder":"Archive","NullFolder":"NullFolder"} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/data/__nobody__/ef/efaeb36a60ef9682802c6a704c2d784d b/copper-server/core/rainloop/app/data/_data_/_default_/storage/data/__nobody__/ef/efaeb36a60ef9682802c6a704c2d784d deleted file mode 100644 index d71cd81b..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/storage/data/__nobody__/ef/efaeb36a60ef9682802c6a704c2d784d +++ /dev/null @@ -1 +0,0 @@ -1541995875,1541995875,1541995875 \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/files/ls/lsf@coppermail.dyndns.org/38/87/38871f9f7a2ad0d70b1e51991143db90bfbbb3c2 b/copper-server/core/rainloop/app/data/_data_/_default_/storage/files/ls/lsf@coppermail.dyndns.org/38/87/38871f9f7a2ad0d70b1e51991143db90bfbbb3c2 deleted file mode 100644 index a2463df6..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/storage/files/ls/lsf@coppermail.dyndns.org/38/87/38871f9f7a2ad0d70b1e51991143db90bfbbb3c2 +++ /dev/null @@ -1 +0,0 @@ -X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/_data_/_default_/storage/files/ls/lsf@coppermail.dyndns.org/aa/6b/aa6bc308dedb13d95e120aafb590f4645301f8cd b/copper-server/core/rainloop/app/data/_data_/_default_/storage/files/ls/lsf@coppermail.dyndns.org/aa/6b/aa6bc308dedb13d95e120aafb590f4645301f8cd deleted file mode 100644 index a2463df6..00000000 --- a/copper-server/core/rainloop/app/data/_data_/_default_/storage/files/ls/lsf@coppermail.dyndns.org/aa/6b/aa6bc308dedb13d95e120aafb590f4645301f8cd +++ /dev/null @@ -1 +0,0 @@ -X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/index.html b/copper-server/core/rainloop/app/data/index.html deleted file mode 100644 index c466910c..00000000 --- a/copper-server/core/rainloop/app/data/index.html +++ /dev/null @@ -1 +0,0 @@ -Forbidden \ No newline at end of file diff --git a/copper-server/core/rainloop/app/data/index.php b/copper-server/core/rainloop/app/data/index.php deleted file mode 100644 index c466910c..00000000 --- a/copper-server/core/rainloop/app/data/index.php +++ /dev/null @@ -1 +0,0 @@ -Forbidden \ No newline at end of file diff --git a/copper-server/core/rainloop/app/index.php b/copper-server/core/rainloop/app/index.php deleted file mode 100755 index 91bc1257..00000000 --- a/copper-server/core/rainloop/app/index.php +++ /dev/null @@ -1,19 +0,0 @@ -value = $accessToken; - if ($expiresAt) { - $this->setExpiresAtFromTimeStamp($expiresAt); - } - } - - /** - * Generate an app secret proof to sign a request to Graph. - * - * @param string $appSecret The app secret. - * - * @return string - */ - public function getAppSecretProof($appSecret) - { - return hash_hmac('sha256', $this->value, $appSecret); - } - - /** - * Getter for expiresAt. - * - * @return \DateTime|null - */ - public function getExpiresAt() - { - return $this->expiresAt; - } - - /** - * Determines whether or not this is an app access token. - * - * @return bool - */ - public function isAppAccessToken() - { - return strpos($this->value, '|') !== false; - } - - /** - * Determines whether or not this is a long-lived token. - * - * @return bool - */ - public function isLongLived() - { - if ($this->expiresAt) { - return $this->expiresAt->getTimestamp() > time() + (60 * 60 * 2); - } - - if ($this->isAppAccessToken()) { - return true; - } - - return false; - } - - /** - * Checks the expiration of the access token. - * - * @return boolean|null - */ - public function isExpired() - { - if ($this->getExpiresAt() instanceof \DateTime) { - return $this->getExpiresAt()->getTimestamp() < time(); - } - - if ($this->isAppAccessToken()) { - return false; - } - - return null; - } - - /** - * Returns the access token as a string. - * - * @return string - */ - public function getValue() - { - return $this->value; - } - - /** - * Returns the access token as a string. - * - * @return string - */ - public function __toString() - { - return $this->getValue(); - } - - /** - * Setter for expires_at. - * - * @param int $timeStamp - */ - protected function setExpiresAtFromTimeStamp($timeStamp) - { - $dt = new \DateTime(); - $dt->setTimestamp($timeStamp); - $this->expiresAt = $dt; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Authentication/AccessTokenMetadata.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Authentication/AccessTokenMetadata.php deleted file mode 100755 index f302a6d2..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Authentication/AccessTokenMetadata.php +++ /dev/null @@ -1,390 +0,0 @@ -metadata = $metadata['data']; - - $this->castTimestampsToDateTime(); - } - - /** - * Returns a value from the metadata. - * - * @param string $field The property to retrieve. - * @param mixed $default The default to return if the property doesn't exist. - * - * @return mixed - */ - public function getField($field, $default = null) - { - if (isset($this->metadata[$field])) { - return $this->metadata[$field]; - } - - return $default; - } - - /** - * Returns a value from the metadata. - * - * @param string $field The property to retrieve. - * @param mixed $default The default to return if the property doesn't exist. - * - * @return mixed - * - * @deprecated 5.0.0 getProperty() has been renamed to getField() - * @todo v6: Remove this method - */ - public function getProperty($field, $default = null) - { - return $this->getField($field, $default); - } - - /** - * Returns a value from a child property in the metadata. - * - * @param string $parentField The parent property. - * @param string $field The property to retrieve. - * @param mixed $default The default to return if the property doesn't exist. - * - * @return mixed - */ - public function getChildProperty($parentField, $field, $default = null) - { - if (!isset($this->metadata[$parentField])) { - return $default; - } - - if (!isset($this->metadata[$parentField][$field])) { - return $default; - } - - return $this->metadata[$parentField][$field]; - } - - /** - * Returns a value from the error metadata. - * - * @param string $field The property to retrieve. - * @param mixed $default The default to return if the property doesn't exist. - * - * @return mixed - */ - public function getErrorProperty($field, $default = null) - { - return $this->getChildProperty('error', $field, $default); - } - - /** - * Returns a value from the "metadata" metadata. *Brain explodes* - * - * @param string $field The property to retrieve. - * @param mixed $default The default to return if the property doesn't exist. - * - * @return mixed - */ - public function getMetadataProperty($field, $default = null) - { - return $this->getChildProperty('metadata', $field, $default); - } - - /** - * The ID of the application this access token is for. - * - * @return string|null - */ - public function getAppId() - { - return $this->getField('app_id'); - } - - /** - * Name of the application this access token is for. - * - * @return string|null - */ - public function getApplication() - { - return $this->getField('application'); - } - - /** - * Any error that a request to the graph api - * would return due to the access token. - * - * @return bool|null - */ - public function isError() - { - return $this->getField('error') !== null; - } - - /** - * The error code for the error. - * - * @return int|null - */ - public function getErrorCode() - { - return $this->getErrorProperty('code'); - } - - /** - * The error message for the error. - * - * @return string|null - */ - public function getErrorMessage() - { - return $this->getErrorProperty('message'); - } - - /** - * The error subcode for the error. - * - * @return int|null - */ - public function getErrorSubcode() - { - return $this->getErrorProperty('subcode'); - } - - /** - * DateTime when this access token expires. - * - * @return \DateTime|null - */ - public function getExpiresAt() - { - return $this->getField('expires_at'); - } - - /** - * Whether the access token is still valid or not. - * - * @return boolean|null - */ - public function getIsValid() - { - return $this->getField('is_valid'); - } - - /** - * DateTime when this access token was issued. - * - * Note that the issued_at field is not returned - * for short-lived access tokens. - * - * @see https://developers.facebook.com/docs/facebook-login/access-tokens#debug - * - * @return \DateTime|null - */ - public function getIssuedAt() - { - return $this->getField('issued_at'); - } - - /** - * General metadata associated with the access token. - * Can contain data like 'sso', 'auth_type', 'auth_nonce'. - * - * @return array|null - */ - public function getMetadata() - { - return $this->getField('metadata'); - } - - /** - * The 'sso' child property from the 'metadata' parent property. - * - * @return string|null - */ - public function getSso() - { - return $this->getMetadataProperty('sso'); - } - - /** - * The 'auth_type' child property from the 'metadata' parent property. - * - * @return string|null - */ - public function getAuthType() - { - return $this->getMetadataProperty('auth_type'); - } - - /** - * The 'auth_nonce' child property from the 'metadata' parent property. - * - * @return string|null - */ - public function getAuthNonce() - { - return $this->getMetadataProperty('auth_nonce'); - } - - /** - * For impersonated access tokens, the ID of - * the page this token contains. - * - * @return string|null - */ - public function getProfileId() - { - return $this->getField('profile_id'); - } - - /** - * List of permissions that the user has granted for - * the app in this access token. - * - * @return array - */ - public function getScopes() - { - return $this->getField('scopes'); - } - - /** - * The ID of the user this access token is for. - * - * @return string|null - */ - public function getUserId() - { - return $this->getField('user_id'); - } - - /** - * Ensures the app ID from the access token - * metadata is what we expect. - * - * @param string $appId - * - * @throws FacebookSDKException - */ - public function validateAppId($appId) - { - if ($this->getAppId() !== $appId) { - throw new FacebookSDKException('Access token metadata contains unexpected app ID.', 401); - } - } - - /** - * Ensures the user ID from the access token - * metadata is what we expect. - * - * @param string $userId - * - * @throws FacebookSDKException - */ - public function validateUserId($userId) - { - if ($this->getUserId() !== $userId) { - throw new FacebookSDKException('Access token metadata contains unexpected user ID.', 401); - } - } - - /** - * Ensures the access token has not expired yet. - * - * @throws FacebookSDKException - */ - public function validateExpiration() - { - if (!$this->getExpiresAt() instanceof \DateTime) { - return; - } - - if ($this->getExpiresAt()->getTimestamp() < time()) { - throw new FacebookSDKException('Inspection of access token metadata shows that the access token has expired.', 401); - } - } - - /** - * Converts a unix timestamp into a DateTime entity. - * - * @param int $timestamp - * - * @return \DateTime - */ - private function convertTimestampToDateTime($timestamp) - { - $dt = new \DateTime(); - $dt->setTimestamp($timestamp); - - return $dt; - } - - /** - * Casts the unix timestamps as DateTime entities. - */ - private function castTimestampsToDateTime() - { - foreach (static::$dateProperties as $key) { - if (isset($this->metadata[$key])) { - $this->metadata[$key] = $this->convertTimestampToDateTime($this->metadata[$key]); - } - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Authentication/OAuth2Client.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Authentication/OAuth2Client.php deleted file mode 100755 index 8e364ec8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Authentication/OAuth2Client.php +++ /dev/null @@ -1,292 +0,0 @@ -app = $app; - $this->client = $client; - $this->graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION; - } - - /** - * Returns the last FacebookRequest that was sent. - * Useful for debugging and testing. - * - * @return FacebookRequest|null - */ - public function getLastRequest() - { - return $this->lastRequest; - } - - /** - * Get the metadata associated with the access token. - * - * @param AccessToken|string $accessToken The access token to debug. - * - * @return AccessTokenMetadata - */ - public function debugToken($accessToken) - { - $accessToken = $accessToken instanceof AccessToken ? $accessToken->getValue() : $accessToken; - $params = ['input_token' => $accessToken]; - - $this->lastRequest = new FacebookRequest( - $this->app, - $this->app->getAccessToken(), - 'GET', - '/debug_token', - $params, - null, - $this->graphVersion - ); - $response = $this->client->sendRequest($this->lastRequest); - $metadata = $response->getDecodedBody(); - - return new AccessTokenMetadata($metadata); - } - - /** - * Generates an authorization URL to begin the process of authenticating a user. - * - * @param string $redirectUrl The callback URL to redirect to. - * @param array $scope An array of permissions to request. - * @param string $state The CSPRNG-generated CSRF value. - * @param array $params An array of parameters to generate URL. - * @param string $separator The separator to use in http_build_query(). - * - * @return string - */ - public function getAuthorizationUrl($redirectUrl, $state, array $scope = [], array $params = [], $separator = '&') - { - $params += [ - 'client_id' => $this->app->getId(), - 'state' => $state, - 'response_type' => 'code', - 'sdk' => 'php-sdk-' . Facebook::VERSION, - 'redirect_uri' => $redirectUrl, - 'scope' => implode(',', $scope) - ]; - - return static::BASE_AUTHORIZATION_URL . '/' . $this->graphVersion . '/dialog/oauth?' . http_build_query($params, null, $separator); - } - - /** - * Get a valid access token from a code. - * - * @param string $code - * @param string $redirectUri - * - * @return AccessToken - * - * @throws FacebookSDKException - */ - public function getAccessTokenFromCode($code, $redirectUri = '') - { - $params = [ - 'code' => $code, - 'redirect_uri' => $redirectUri, - ]; - - return $this->requestAnAccessToken($params); - } - - /** - * Exchanges a short-lived access token with a long-lived access token. - * - * @param AccessToken|string $accessToken - * - * @return AccessToken - * - * @throws FacebookSDKException - */ - public function getLongLivedAccessToken($accessToken) - { - $accessToken = $accessToken instanceof AccessToken ? $accessToken->getValue() : $accessToken; - $params = [ - 'grant_type' => 'fb_exchange_token', - 'fb_exchange_token' => $accessToken, - ]; - - return $this->requestAnAccessToken($params); - } - - /** - * Get a valid code from an access token. - * - * @param AccessToken|string $accessToken - * @param string $redirectUri - * - * @return AccessToken - * - * @throws FacebookSDKException - */ - public function getCodeFromLongLivedAccessToken($accessToken, $redirectUri = '') - { - $params = [ - 'redirect_uri' => $redirectUri, - ]; - - $response = $this->sendRequestWithClientParams('/oauth/client_code', $params, $accessToken); - $data = $response->getDecodedBody(); - - if (!isset($data['code'])) { - throw new FacebookSDKException('Code was not returned from Graph.', 401); - } - - return $data['code']; - } - - /** - * Send a request to the OAuth endpoint. - * - * @param array $params - * - * @return AccessToken - * - * @throws FacebookSDKException - */ - protected function requestAnAccessToken(array $params) - { - $response = $this->sendRequestWithClientParams('/oauth/access_token', $params); - $data = $response->getDecodedBody(); - - if (!isset($data['access_token'])) { - throw new FacebookSDKException('Access token was not returned from Graph.', 401); - } - - // Graph returns two different key names for expiration time - // on the same endpoint. Doh! :/ - $expiresAt = 0; - if (isset($data['expires'])) { - // For exchanging a short lived token with a long lived token. - // The expiration time in seconds will be returned as "expires". - $expiresAt = time() + $data['expires']; - } elseif (isset($data['expires_in'])) { - // For exchanging a code for a short lived access token. - // The expiration time in seconds will be returned as "expires_in". - // See: https://developers.facebook.com/docs/facebook-login/access-tokens#long-via-code - $expiresAt = time() + $data['expires_in']; - } - - return new AccessToken($data['access_token'], $expiresAt); - } - - /** - * Send a request to Graph with an app access token. - * - * @param string $endpoint - * @param array $params - * @param string|null $accessToken - * - * @return FacebookResponse - * - * @throws FacebookResponseException - */ - protected function sendRequestWithClientParams($endpoint, array $params, $accessToken = null) - { - $params += $this->getClientParams(); - - $accessToken = $accessToken ?: $this->app->getAccessToken(); - - $this->lastRequest = new FacebookRequest( - $this->app, - $accessToken, - 'GET', - $endpoint, - $params, - null, - $this->graphVersion - ); - - return $this->client->sendRequest($this->lastRequest); - } - - /** - * Returns the client_* params for OAuth requests. - * - * @return array - */ - protected function getClientParams() - { - return [ - 'client_id' => $this->app->getId(), - 'client_secret' => $this->app->getSecret(), - ]; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookAuthenticationException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookAuthenticationException.php deleted file mode 100755 index 449cf93e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookAuthenticationException.php +++ /dev/null @@ -1,33 +0,0 @@ -response = $response; - $this->responseData = $response->getDecodedBody(); - - $errorMessage = $this->get('message', 'Unknown error from Graph.'); - $errorCode = $this->get('code', -1); - - parent::__construct($errorMessage, $errorCode, $previousException); - } - - /** - * A factory for creating the appropriate exception based on the response from Graph. - * - * @param FacebookResponse $response The response that threw the exception. - * - * @return FacebookResponseException - */ - public static function create(FacebookResponse $response) - { - $data = $response->getDecodedBody(); - - if (!isset($data['error']['code']) && isset($data['code'])) { - $data = ['error' => $data]; - } - - $code = isset($data['error']['code']) ? $data['error']['code'] : null; - $message = isset($data['error']['message']) ? $data['error']['message'] : 'Unknown error from Graph.'; - - $previousException = null; - - if (isset($data['error']['error_subcode'])) { - switch ($data['error']['error_subcode']) { - // Other authentication issues - case 458: - case 459: - case 460: - case 463: - case 464: - case 467: - return new static($response, new FacebookAuthenticationException($message, $code)); - } - } - - switch ($code) { - // Login status or token expired, revoked, or invalid - case 100: - case 102: - case 190: - return new static($response, new FacebookAuthenticationException($message, $code)); - - // Server issue, possible downtime - case 1: - case 2: - return new static($response, new FacebookServerException($message, $code)); - - // API Throttling - case 4: - case 17: - case 341: - return new static($response, new FacebookThrottleException($message, $code)); - - // Duplicate Post - case 506: - return new static($response, new FacebookClientException($message, $code)); - } - - // Missing Permissions - if ($code == 10 || ($code >= 200 && $code <= 299)) { - return new static($response, new FacebookAuthorizationException($message, $code)); - } - - // OAuth authentication error - if (isset($data['error']['type']) && $data['error']['type'] === 'OAuthException') { - return new static($response, new FacebookAuthenticationException($message, $code)); - } - - // All others - return new static($response, new FacebookOtherException($message, $code)); - } - - /** - * Checks isset and returns that or a default value. - * - * @param string $key - * @param mixed $default - * - * @return mixed - */ - private function get($key, $default = null) - { - if (isset($this->responseData['error'][$key])) { - return $this->responseData['error'][$key]; - } - - return $default; - } - - /** - * Returns the HTTP status code - * - * @return int - */ - public function getHttpStatusCode() - { - return $this->response->getHttpStatusCode(); - } - - /** - * Returns the sub-error code - * - * @return int - */ - public function getSubErrorCode() - { - return $this->get('error_subcode', -1); - } - - /** - * Returns the error type - * - * @return string - */ - public function getErrorType() - { - return $this->get('type', ''); - } - - /** - * Returns the raw response used to create the exception. - * - * @return string - */ - public function getRawResponse() - { - return $this->response->getBody(); - } - - /** - * Returns the decoded response used to create the exception. - * - * @return array - */ - public function getResponseData() - { - return $this->responseData; - } - - /** - * Returns the response entity used to create the exception. - * - * @return FacebookResponse - */ - public function getResponse() - { - return $this->response; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookSDKException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookSDKException.php deleted file mode 100755 index 03219b0e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Exceptions/FacebookSDKException.php +++ /dev/null @@ -1,33 +0,0 @@ -app = new FacebookApp($appId, $appSecret); - - $httpClientHandler = null; - if (isset($config['http_client_handler'])) { - if ($config['http_client_handler'] instanceof FacebookHttpClientInterface) { - $httpClientHandler = $config['http_client_handler']; - } elseif ($config['http_client_handler'] === 'curl') { - $httpClientHandler = new FacebookCurlHttpClient(); - } elseif ($config['http_client_handler'] === 'stream') { - $httpClientHandler = new FacebookStreamHttpClient(); - } elseif ($config['http_client_handler'] === 'guzzle') { - $httpClientHandler = new FacebookGuzzleHttpClient(); - } else { - throw new \InvalidArgumentException('The http_client_handler must be set to "curl", "stream", "guzzle", or be an instance of Facebook\HttpClients\FacebookHttpClientInterface'); - } - } - - $enableBeta = isset($config['enable_beta_mode']) && $config['enable_beta_mode'] === true; - $this->client = new FacebookClient($httpClientHandler, $enableBeta); - - if (isset($config['url_detection_handler'])) { - if ($config['url_detection_handler'] instanceof UrlDetectionInterface) { - $this->urlDetectionHandler = $config['url_detection_handler']; - } else { - throw new \InvalidArgumentException('The url_detection_handler must be an instance of Facebook\Url\UrlDetectionInterface'); - } - } - - if (isset($config['pseudo_random_string_generator'])) { - if ($config['pseudo_random_string_generator'] instanceof PseudoRandomStringGeneratorInterface) { - $this->pseudoRandomStringGenerator = $config['pseudo_random_string_generator']; - } elseif ($config['pseudo_random_string_generator'] === 'mcrypt') { - $this->pseudoRandomStringGenerator = new McryptPseudoRandomStringGenerator(); - } elseif ($config['pseudo_random_string_generator'] === 'openssl') { - $this->pseudoRandomStringGenerator = new OpenSslPseudoRandomStringGenerator(); - } elseif ($config['pseudo_random_string_generator'] === 'urandom') { - $this->pseudoRandomStringGenerator = new UrandomPseudoRandomStringGenerator(); - } else { - throw new \InvalidArgumentException('The pseudo_random_string_generator must be set to "mcrypt", "openssl", or "urandom", or be an instance of Facebook\PseudoRandomString\PseudoRandomStringGeneratorInterface'); - } - } - - if (isset($config['persistent_data_handler'])) { - if ($config['persistent_data_handler'] instanceof PersistentDataInterface) { - $this->persistentDataHandler = $config['persistent_data_handler']; - } elseif ($config['persistent_data_handler'] === 'session') { - $this->persistentDataHandler = new FacebookSessionPersistentDataHandler(); - } elseif ($config['persistent_data_handler'] === 'memory') { - $this->persistentDataHandler = new FacebookMemoryPersistentDataHandler(); - } else { - throw new \InvalidArgumentException('The persistent_data_handler must be set to "session", "memory", or be an instance of Facebook\PersistentData\PersistentDataInterface'); - } - } - - if (isset($config['default_access_token'])) { - $this->setDefaultAccessToken($config['default_access_token']); - } - - if (isset($config['default_graph_version'])) { - $this->defaultGraphVersion = $config['default_graph_version']; - } else { - // @todo v6: Throw an InvalidArgumentException if "default_graph_version" is not set - $this->defaultGraphVersion = static::DEFAULT_GRAPH_VERSION; - } - } - - /** - * Returns the FacebookApp entity. - * - * @return FacebookApp - */ - public function getApp() - { - return $this->app; - } - - /** - * Returns the FacebookClient service. - * - * @return FacebookClient - */ - public function getClient() - { - return $this->client; - } - - /** - * Returns the OAuth 2.0 client service. - * - * @return OAuth2Client - */ - public function getOAuth2Client() - { - if (!$this->oAuth2Client instanceof OAuth2Client) { - $app = $this->getApp(); - $client = $this->getClient(); - $this->oAuth2Client = new OAuth2Client($app, $client, $this->defaultGraphVersion); - } - - return $this->oAuth2Client; - } - - /** - * Returns the last response returned from Graph. - * - * @return FacebookResponse|FacebookBatchResponse|null - */ - public function getLastResponse() - { - return $this->lastResponse; - } - - /** - * Returns the URL detection handler. - * - * @return UrlDetectionInterface - */ - public function getUrlDetectionHandler() - { - if (!$this->urlDetectionHandler instanceof UrlDetectionInterface) { - $this->urlDetectionHandler = new FacebookUrlDetectionHandler(); - } - - return $this->urlDetectionHandler; - } - - /** - * Returns the default AccessToken entity. - * - * @return AccessToken|null - */ - public function getDefaultAccessToken() - { - return $this->defaultAccessToken; - } - - /** - * Sets the default access token to use with requests. - * - * @param AccessToken|string $accessToken The access token to save. - * - * @throws \InvalidArgumentException - */ - public function setDefaultAccessToken($accessToken) - { - if (is_string($accessToken)) { - $this->defaultAccessToken = new AccessToken($accessToken); - - return; - } - - if ($accessToken instanceof AccessToken) { - $this->defaultAccessToken = $accessToken; - - return; - } - - throw new \InvalidArgumentException('The default access token must be of type "string" or Facebook\AccessToken'); - } - - /** - * Returns the default Graph version. - * - * @return string - */ - public function getDefaultGraphVersion() - { - return $this->defaultGraphVersion; - } - - /** - * Returns the redirect login helper. - * - * @return FacebookRedirectLoginHelper - */ - public function getRedirectLoginHelper() - { - return new FacebookRedirectLoginHelper( - $this->getOAuth2Client(), - $this->persistentDataHandler, - $this->urlDetectionHandler, - $this->pseudoRandomStringGenerator - ); - } - - /** - * Returns the JavaScript helper. - * - * @return FacebookJavaScriptHelper - */ - public function getJavaScriptHelper() - { - return new FacebookJavaScriptHelper($this->app, $this->client, $this->defaultGraphVersion); - } - - /** - * Returns the canvas helper. - * - * @return FacebookCanvasHelper - */ - public function getCanvasHelper() - { - return new FacebookCanvasHelper($this->app, $this->client, $this->defaultGraphVersion); - } - - /** - * Returns the page tab helper. - * - * @return FacebookPageTabHelper - */ - public function getPageTabHelper() - { - return new FacebookPageTabHelper($this->app, $this->client, $this->defaultGraphVersion); - } - - /** - * Sends a GET request to Graph and returns the result. - * - * @param string $endpoint - * @param AccessToken|string|null $accessToken - * @param string|null $eTag - * @param string|null $graphVersion - * - * @return FacebookResponse - * - * @throws FacebookSDKException - */ - public function get($endpoint, $accessToken = null, $eTag = null, $graphVersion = null) - { - return $this->sendRequest( - 'GET', - $endpoint, - $params = [], - $accessToken, - $eTag, - $graphVersion - ); - } - - /** - * Sends a POST request to Graph and returns the result. - * - * @param string $endpoint - * @param array $params - * @param AccessToken|string|null $accessToken - * @param string|null $eTag - * @param string|null $graphVersion - * - * @return FacebookResponse - * - * @throws FacebookSDKException - */ - public function post($endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) - { - return $this->sendRequest( - 'POST', - $endpoint, - $params, - $accessToken, - $eTag, - $graphVersion - ); - } - - /** - * Sends a DELETE request to Graph and returns the result. - * - * @param string $endpoint - * @param array $params - * @param AccessToken|string|null $accessToken - * @param string|null $eTag - * @param string|null $graphVersion - * - * @return FacebookResponse - * - * @throws FacebookSDKException - */ - public function delete($endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) - { - return $this->sendRequest( - 'DELETE', - $endpoint, - $params, - $accessToken, - $eTag, - $graphVersion - ); - } - - /** - * Sends a request to Graph for the next page of results. - * - * @param GraphEdge $graphEdge The GraphEdge to paginate over. - * - * @return GraphEdge|null - * - * @throws FacebookSDKException - */ - public function next(GraphEdge $graphEdge) - { - return $this->getPaginationResults($graphEdge, 'next'); - } - - /** - * Sends a request to Graph for the previous page of results. - * - * @param GraphEdge $graphEdge The GraphEdge to paginate over. - * - * @return GraphEdge|null - * - * @throws FacebookSDKException - */ - public function previous(GraphEdge $graphEdge) - { - return $this->getPaginationResults($graphEdge, 'previous'); - } - - /** - * Sends a request to Graph for the next page of results. - * - * @param GraphEdge $graphEdge The GraphEdge to paginate over. - * @param string $direction The direction of the pagination: next|previous. - * - * @return GraphEdge|null - * - * @throws FacebookSDKException - */ - public function getPaginationResults(GraphEdge $graphEdge, $direction) - { - $paginationRequest = $graphEdge->getPaginationRequest($direction); - if (!$paginationRequest) { - return null; - } - - $this->lastResponse = $this->client->sendRequest($paginationRequest); - - // Keep the same GraphNode subclass - $subClassName = $graphEdge->getSubClassName(); - $graphEdge = $this->lastResponse->getGraphEdge($subClassName, false); - - return count($graphEdge) > 0 ? $graphEdge : null; - } - - /** - * Sends a request to Graph and returns the result. - * - * @param string $method - * @param string $endpoint - * @param array $params - * @param AccessToken|string|null $accessToken - * @param string|null $eTag - * @param string|null $graphVersion - * - * @return FacebookResponse - * - * @throws FacebookSDKException - */ - public function sendRequest($method, $endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) - { - $accessToken = $accessToken ?: $this->defaultAccessToken; - $graphVersion = $graphVersion ?: $this->defaultGraphVersion; - $request = $this->request($method, $endpoint, $params, $accessToken, $eTag, $graphVersion); - - return $this->lastResponse = $this->client->sendRequest($request); - } - - /** - * Sends a batched request to Graph and returns the result. - * - * @param array $requests - * @param AccessToken|string|null $accessToken - * @param string|null $graphVersion - * - * @return FacebookBatchResponse - * - * @throws FacebookSDKException - */ - public function sendBatchRequest(array $requests, $accessToken = null, $graphVersion = null) - { - $accessToken = $accessToken ?: $this->defaultAccessToken; - $graphVersion = $graphVersion ?: $this->defaultGraphVersion; - $batchRequest = new FacebookBatchRequest( - $this->app, - $requests, - $accessToken, - $graphVersion - ); - - return $this->lastResponse = $this->client->sendBatchRequest($batchRequest); - } - - /** - * Instantiates a new FacebookRequest entity. - * - * @param string $method - * @param string $endpoint - * @param array $params - * @param AccessToken|string|null $accessToken - * @param string|null $eTag - * @param string|null $graphVersion - * - * @return FacebookRequest - * - * @throws FacebookSDKException - */ - public function request($method, $endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) - { - $accessToken = $accessToken ?: $this->defaultAccessToken; - $graphVersion = $graphVersion ?: $this->defaultGraphVersion; - - return new FacebookRequest( - $this->app, - $accessToken, - $method, - $endpoint, - $params, - $eTag, - $graphVersion - ); - } - - /** - * Factory to create FacebookFile's. - * - * @param string $pathToFile - * - * @return FacebookFile - * - * @throws FacebookSDKException - */ - public function fileToUpload($pathToFile) - { - return new FacebookFile($pathToFile); - } - - /** - * Factory to create FacebookVideo's. - * - * @param string $pathToFile - * - * @return FacebookVideo - * - * @throws FacebookSDKException - */ - public function videoToUpload($pathToFile) - { - return new FacebookVideo($pathToFile); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookApp.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookApp.php deleted file mode 100755 index 84956ce9..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookApp.php +++ /dev/null @@ -1,101 +0,0 @@ -id = $id; - $this->secret = $secret; - } - - /** - * Returns the app ID. - * - * @return string - */ - public function getId() - { - return $this->id; - } - - /** - * Returns the app secret. - * - * @return string - */ - public function getSecret() - { - return $this->secret; - } - - /** - * Returns an app access token. - * - * @return AccessToken - */ - public function getAccessToken() - { - return new AccessToken($this->id . '|' . $this->secret); - } - - /** - * Serializes the FacebookApp entity as a string. - * - * @return string - */ - public function serialize() - { - return serialize([$this->id, $this->secret]); - } - - /** - * Unserializes a string as a FacebookApp entity. - * - * @param string $serialized - */ - public function unserialize($serialized) - { - list($id, $secret) = unserialize($serialized); - - $this->__construct($id, $secret); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookBatchRequest.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookBatchRequest.php deleted file mode 100755 index 33c489cf..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookBatchRequest.php +++ /dev/null @@ -1,303 +0,0 @@ -add($requests); - } - - /** - * A a new request to the array. - * - * @param FacebookRequest|array $request - * @param string|null $name - * - * @return FacebookBatchRequest - * - * @throws \InvalidArgumentException - */ - public function add($request, $name = null) - { - if (is_array($request)) { - foreach ($request as $key => $req) { - $this->add($req, $key); - } - - return $this; - } - - if (!$request instanceof FacebookRequest) { - throw new \InvalidArgumentException('Argument for add() must be of type array or FacebookRequest.'); - } - - $this->addFallbackDefaults($request); - $requestToAdd = [ - 'name' => $name, - 'request' => $request, - ]; - - // File uploads - $attachedFiles = $this->extractFileAttachments($request); - if ($attachedFiles) { - $requestToAdd['attached_files'] = $attachedFiles; - } - $this->requests[] = $requestToAdd; - - return $this; - } - - /** - * Ensures that the FacebookApp and access token fall back when missing. - * - * @param FacebookRequest $request - * - * @throws FacebookSDKException - */ - public function addFallbackDefaults(FacebookRequest $request) - { - if (!$request->getApp()) { - $app = $this->getApp(); - if (!$app) { - throw new FacebookSDKException('Missing FacebookApp on FacebookRequest and no fallback detected on FacebookBatchRequest.'); - } - $request->setApp($app); - } - - if (!$request->getAccessToken()) { - $accessToken = $this->getAccessToken(); - if (!$accessToken) { - throw new FacebookSDKException('Missing access token on FacebookRequest and no fallback detected on FacebookBatchRequest.'); - } - $request->setAccessToken($accessToken); - } - } - - /** - * Extracts the files from a request. - * - * @param FacebookRequest $request - * - * @return string|null - * - * @throws FacebookSDKException - */ - public function extractFileAttachments(FacebookRequest $request) - { - if (!$request->containsFileUploads()) { - return null; - } - - $files = $request->getFiles(); - $fileNames = []; - foreach ($files as $file) { - $fileName = uniqid(); - $this->addFile($fileName, $file); - $fileNames[] = $fileName; - } - - $request->resetFiles(); - - // @TODO Does Graph support multiple uploads on one endpoint? - return implode(',', $fileNames); - } - - /** - * Return the FacebookRequest entities. - * - * @return array - */ - public function getRequests() - { - return $this->requests; - } - - /** - * Prepares the requests to be sent as a batch request. - * - * @return string - */ - public function prepareRequestsForBatch() - { - $this->validateBatchRequestCount(); - - $params = [ - 'batch' => $this->convertRequestsToJson(), - 'include_headers' => true, - ]; - $this->setParams($params); - } - - /** - * Converts the requests into a JSON(P) string. - * - * @return string - */ - public function convertRequestsToJson() - { - $requests = []; - foreach ($this->requests as $request) { - $attachedFiles = isset($request['attached_files']) ? $request['attached_files'] : null; - $requests[] = $this->requestEntityToBatchArray($request['request'], $request['name'], $attachedFiles); - } - - return json_encode($requests); - } - - /** - * Validate the request count before sending them as a batch. - * - * @throws FacebookSDKException - */ - public function validateBatchRequestCount() - { - $batchCount = count($this->requests); - if ($batchCount === 0) { - throw new FacebookSDKException('There are no batch requests to send.'); - } elseif ($batchCount > 50) { - // Per: https://developers.facebook.com/docs/graph-api/making-multiple-requests#limits - throw new FacebookSDKException('You cannot send more than 50 batch requests at a time.'); - } - } - - /** - * Converts a Request entity into an array that is batch-friendly. - * - * @param FacebookRequest $request The request entity to convert. - * @param string|null $requestName The name of the request. - * @param string|null $attachedFiles Names of files associated with the request. - * - * @return array - */ - public function requestEntityToBatchArray(FacebookRequest $request, $requestName = null, $attachedFiles = null) - { - $compiledHeaders = []; - $headers = $request->getHeaders(); - foreach ($headers as $name => $value) { - $compiledHeaders[] = $name . ': ' . $value; - } - - $batch = [ - 'headers' => $compiledHeaders, - 'method' => $request->getMethod(), - 'relative_url' => $request->getUrl(), - ]; - - // Since file uploads are moved to the root request of a batch request, - // the child requests will always be URL-encoded. - $body = $request->getUrlEncodedBody()->getBody(); - if ($body) { - $batch['body'] = $body; - } - - if (isset($requestName)) { - $batch['name'] = $requestName; - } - - if (isset($attachedFiles)) { - $batch['attached_files'] = $attachedFiles; - } - - // @TODO Add support for "omit_response_on_success" - // @TODO Add support for "depends_on" - // @TODO Add support for JSONP with "callback" - - return $batch; - } - - /** - * Get an iterator for the items. - * - * @return ArrayIterator - */ - public function getIterator() - { - return new ArrayIterator($this->requests); - } - - /** - * @inheritdoc - */ - public function offsetSet($offset, $value) - { - $this->add($value, $offset); - } - - /** - * @inheritdoc - */ - public function offsetExists($offset) - { - return isset($this->requests[$offset]); - } - - /** - * @inheritdoc - */ - public function offsetUnset($offset) - { - unset($this->requests[$offset]); - } - - /** - * @inheritdoc - */ - public function offsetGet($offset) - { - return isset($this->requests[$offset]) ? $this->requests[$offset] : null; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookBatchResponse.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookBatchResponse.php deleted file mode 100755 index 5ea765e3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookBatchResponse.php +++ /dev/null @@ -1,154 +0,0 @@ -batchRequest = $batchRequest; - - $request = $response->getRequest(); - $body = $response->getBody(); - $httpStatusCode = $response->getHttpStatusCode(); - $headers = $response->getHeaders(); - parent::__construct($request, $body, $httpStatusCode, $headers); - - $responses = $response->getDecodedBody(); - $this->setResponses($responses); - } - - /** - * Returns an array of FacebookResponse entities. - * - * @return array - */ - public function getResponses() - { - return $this->responses; - } - - /** - * The main batch response will be an array of requests so - * we need to iterate over all the responses. - * - * @param array $responses - */ - public function setResponses(array $responses) - { - $this->responses = []; - - foreach ($responses as $key => $graphResponse) { - $this->addResponse($key, $graphResponse); - } - } - - /** - * Add a response to the list. - * - * @param int $key - * @param array|null $response - */ - public function addResponse($key, $response) - { - $originalRequestName = isset($this->batchRequest[$key]['name']) ? $this->batchRequest[$key]['name'] : $key; - $originalRequest = isset($this->batchRequest[$key]['request']) ? $this->batchRequest[$key]['request'] : null; - - $httpResponseBody = isset($response['body']) ? $response['body'] : null; - $httpResponseCode = isset($response['code']) ? $response['code'] : null; - $httpResponseHeaders = isset($response['headers']) ? $response['headers'] : []; - - $this->responses[$originalRequestName] = new FacebookResponse( - $originalRequest, - $httpResponseBody, - $httpResponseCode, - $httpResponseHeaders - ); - } - - /** - * @inheritdoc - */ - public function getIterator() - { - return new ArrayIterator($this->responses); - } - - /** - * @inheritdoc - */ - public function offsetSet($offset, $value) - { - $this->addResponse($offset, $value); - } - - /** - * @inheritdoc - */ - public function offsetExists($offset) - { - return isset($this->responses[$offset]); - } - - /** - * @inheritdoc - */ - public function offsetUnset($offset) - { - unset($this->responses[$offset]); - } - - /** - * @inheritdoc - */ - public function offsetGet($offset) - { - return isset($this->responses[$offset]) ? $this->responses[$offset] : null; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookClient.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookClient.php deleted file mode 100755 index b10762f1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookClient.php +++ /dev/null @@ -1,250 +0,0 @@ -httpClientHandler = $httpClientHandler ?: $this->detectHttpClientHandler(); - $this->enableBetaMode = $enableBeta; - } - - /** - * Sets the HTTP client handler. - * - * @param FacebookHttpClientInterface $httpClientHandler - */ - public function setHttpClientHandler(FacebookHttpClientInterface $httpClientHandler) - { - $this->httpClientHandler = $httpClientHandler; - } - - /** - * Returns the HTTP client handler. - * - * @return FacebookHttpClientInterface - */ - public function getHttpClientHandler() - { - return $this->httpClientHandler; - } - - /** - * Detects which HTTP client handler to use. - * - * @return FacebookHttpClientInterface - */ - public function detectHttpClientHandler() - { - return function_exists('curl_init') ? new FacebookCurlHttpClient() : new FacebookStreamHttpClient(); - } - - /** - * Toggle beta mode. - * - * @param boolean $betaMode - */ - public function enableBetaMode($betaMode = true) - { - $this->enableBetaMode = $betaMode; - } - - /** - * Returns the base Graph URL. - * - * @param boolean $postToVideoUrl Post to the video API if videos are being uploaded. - * - * @return string - */ - public function getBaseGraphUrl($postToVideoUrl = false) - { - if ($postToVideoUrl) { - return $this->enableBetaMode ? static::BASE_GRAPH_VIDEO_URL_BETA : static::BASE_GRAPH_VIDEO_URL; - } - - return $this->enableBetaMode ? static::BASE_GRAPH_URL_BETA : static::BASE_GRAPH_URL; - } - - /** - * Prepares the request for sending to the client handler. - * - * @param FacebookRequest $request - * - * @return array - */ - public function prepareRequestMessage(FacebookRequest $request) - { - $postToVideoUrl = $request->containsVideoUploads(); - $url = $this->getBaseGraphUrl($postToVideoUrl) . $request->getUrl(); - - // If we're sending files they should be sent as multipart/form-data - if ($request->containsFileUploads()) { - $requestBody = $request->getMultipartBody(); - $request->setHeaders([ - 'Content-Type' => 'multipart/form-data; boundary=' . $requestBody->getBoundary(), - ]); - } else { - $requestBody = $request->getUrlEncodedBody(); - $request->setHeaders([ - 'Content-Type' => 'application/x-www-form-urlencoded', - ]); - } - - return [ - $url, - $request->getMethod(), - $request->getHeaders(), - $requestBody->getBody(), - ]; - } - - /** - * Makes the request to Graph and returns the result. - * - * @param FacebookRequest $request - * - * @return FacebookResponse - * - * @throws FacebookSDKException - */ - public function sendRequest(FacebookRequest $request) - { - if (get_class($request) === 'FacebookRequest') { - $request->validateAccessToken(); - } - - list($url, $method, $headers, $body) = $this->prepareRequestMessage($request); - - // Since file uploads can take a while, we need to give more time for uploads - $timeOut = static::DEFAULT_REQUEST_TIMEOUT; - if ($request->containsFileUploads()) { - $timeOut = static::DEFAULT_FILE_UPLOAD_REQUEST_TIMEOUT; - } elseif ($request->containsVideoUploads()) { - $timeOut = static::DEFAULT_VIDEO_UPLOAD_REQUEST_TIMEOUT; - } - - // Should throw `FacebookSDKException` exception on HTTP client error. - // Don't catch to allow it to bubble up. - $rawResponse = $this->httpClientHandler->send($url, $method, $body, $headers, $timeOut); - - static::$requestCount++; - - $returnResponse = new FacebookResponse( - $request, - $rawResponse->getBody(), - $rawResponse->getHttpResponseCode(), - $rawResponse->getHeaders() - ); - - if ($returnResponse->isError()) { - throw $returnResponse->getThrownException(); - } - - return $returnResponse; - } - - /** - * Makes a batched request to Graph and returns the result. - * - * @param FacebookBatchRequest $request - * - * @return FacebookBatchResponse - * - * @throws FacebookSDKException - */ - public function sendBatchRequest(FacebookBatchRequest $request) - { - $request->prepareRequestsForBatch(); - $facebookResponse = $this->sendRequest($request); - - return new FacebookBatchResponse($request, $facebookResponse); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookRequest.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookRequest.php deleted file mode 100755 index 5e4083f8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookRequest.php +++ /dev/null @@ -1,536 +0,0 @@ -setApp($app); - $this->setAccessToken($accessToken); - $this->setMethod($method); - $this->setEndpoint($endpoint); - $this->setParams($params); - $this->setETag($eTag); - $this->graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION; - } - - /** - * Set the access token for this request. - * - * @param AccessToken|string - * - * @return FacebookRequest - */ - public function setAccessToken($accessToken) - { - $this->accessToken = $accessToken; - if ($accessToken instanceof AccessToken) { - $this->accessToken = $accessToken->getValue(); - } - - return $this; - } - - /** - * Sets the access token with one harvested from a URL or POST params. - * - * @param string $accessToken The access token. - * - * @return FacebookRequest - * - * @throws FacebookSDKException - */ - public function setAccessTokenFromParams($accessToken) - { - $existingAccessToken = $this->getAccessToken(); - if (!$existingAccessToken) { - $this->setAccessToken($accessToken); - } elseif ($accessToken !== $existingAccessToken) { - throw new FacebookSDKException('Access token mismatch. The access token provided in the FacebookRequest and the one provided in the URL or POST params do not match.'); - } - - return $this; - } - - /** - * Return the access token for this request. - * - * @return string|null - */ - public function getAccessToken() - { - return $this->accessToken; - } - - /** - * Return the access token for this request an an AccessToken entity. - * - * @return AccessToken|null - */ - public function getAccessTokenEntity() - { - return $this->accessToken ? new AccessToken($this->accessToken) : null; - } - - /** - * Set the FacebookApp entity used for this request. - * - * @param FacebookApp|null $app - */ - public function setApp(FacebookApp $app = null) - { - $this->app = $app; - } - - /** - * Return the FacebookApp entity used for this request. - * - * @return FacebookApp - */ - public function getApp() - { - return $this->app; - } - - /** - * Generate an app secret proof to sign this request. - * - * @return string|null - */ - public function getAppSecretProof() - { - if (!$accessTokenEntity = $this->getAccessTokenEntity()) { - return null; - } - - return $accessTokenEntity->getAppSecretProof($this->app->getSecret()); - } - - /** - * Validate that an access token exists for this request. - * - * @throws FacebookSDKException - */ - public function validateAccessToken() - { - $accessToken = $this->getAccessToken(); - if (!$accessToken) { - throw new FacebookSDKException('You must provide an access token.'); - } - } - - /** - * Set the HTTP method for this request. - * - * @param string - * - * @return FacebookRequest - */ - public function setMethod($method) - { - $this->method = strtoupper($method); - } - - /** - * Return the HTTP method for this request. - * - * @return string - */ - public function getMethod() - { - return $this->method; - } - - /** - * Validate that the HTTP method is set. - * - * @throws FacebookSDKException - */ - public function validateMethod() - { - if (!$this->method) { - throw new FacebookSDKException('HTTP method not specified.'); - } - - if (!in_array($this->method, ['GET', 'POST', 'DELETE'])) { - throw new FacebookSDKException('Invalid HTTP method specified.'); - } - } - - /** - * Set the endpoint for this request. - * - * @param string - * - * @return FacebookRequest - * - * @throws FacebookSDKException - */ - public function setEndpoint($endpoint) - { - // Harvest the access token from the endpoint to keep things in sync - $params = FacebookUrlManipulator::getParamsAsArray($endpoint); - if (isset($params['access_token'])) { - $this->setAccessTokenFromParams($params['access_token']); - } - - // Clean the token & app secret proof from the endpoint. - $filterParams = ['access_token', 'appsecret_proof']; - $this->endpoint = FacebookUrlManipulator::removeParamsFromUrl($endpoint, $filterParams); - - return $this; - } - - /** - * Return the HTTP method for this request. - * - * @return string - */ - public function getEndpoint() - { - // For batch requests, this will be empty - return $this->endpoint; - } - - /** - * Generate and return the headers for this request. - * - * @return array - */ - public function getHeaders() - { - $headers = static::getDefaultHeaders(); - - if ($this->eTag) { - $headers['If-None-Match'] = $this->eTag; - } - - return array_merge($this->headers, $headers); - } - - /** - * Set the headers for this request. - * - * @param array $headers - */ - public function setHeaders(array $headers) - { - $this->headers = array_merge($this->headers, $headers); - } - - /** - * Sets the eTag value. - * - * @param string $eTag - */ - public function setETag($eTag) - { - $this->eTag = $eTag; - } - - /** - * Set the params for this request. - * - * @param array $params - * - * @return FacebookRequest - * - * @throws FacebookSDKException - */ - public function setParams(array $params = []) - { - if (isset($params['access_token'])) { - $this->setAccessTokenFromParams($params['access_token']); - } - - // Don't let these buggers slip in. - unset($params['access_token'], $params['appsecret_proof']); - - // @TODO Refactor code above with this - //$params = $this->sanitizeAuthenticationParams($params); - $params = $this->sanitizeFileParams($params); - $this->dangerouslySetParams($params); - - return $this; - } - - /** - * Set the params for this request without filtering them first. - * - * @param array $params - * - * @return FacebookRequest - */ - public function dangerouslySetParams(array $params = []) - { - $this->params = array_merge($this->params, $params); - - return $this; - } - - /** - * Iterate over the params and pull out the file uploads. - * - * @param array $params - * - * @return array - */ - public function sanitizeFileParams(array $params) - { - foreach ($params as $key => $value) { - if ($value instanceof FacebookFile) { - $this->addFile($key, $value); - unset($params[$key]); - } - } - - return $params; - } - - /** - * Add a file to be uploaded. - * - * @param string $key - * @param FacebookFile $file - */ - public function addFile($key, FacebookFile $file) - { - $this->files[$key] = $file; - } - - /** - * Removes all the files from the upload queue. - */ - public function resetFiles() - { - $this->files = []; - } - - /** - * Get the list of files to be uploaded. - * - * @return array - */ - public function getFiles() - { - return $this->files; - } - - /** - * Let's us know if there is a file upload with this request. - * - * @return boolean - */ - public function containsFileUploads() - { - return !empty($this->files); - } - - /** - * Let's us know if there is a video upload with this request. - * - * @return boolean - */ - public function containsVideoUploads() - { - foreach ($this->files as $file) { - if ($file instanceof FacebookVideo) { - return true; - } - } - - return false; - } - - /** - * Returns the body of the request as multipart/form-data. - * - * @return RequestBodyMultipart - */ - public function getMultipartBody() - { - $params = $this->getPostParams(); - - return new RequestBodyMultipart($params, $this->files); - } - - /** - * Returns the body of the request as URL-encoded. - * - * @return RequestBodyUrlEncoded - */ - public function getUrlEncodedBody() - { - $params = $this->getPostParams(); - - return new RequestBodyUrlEncoded($params); - } - - /** - * Generate and return the params for this request. - * - * @return array - */ - public function getParams() - { - $params = $this->params; - - $accessToken = $this->getAccessToken(); - if ($accessToken) { - $params['access_token'] = $accessToken; - $params['appsecret_proof'] = $this->getAppSecretProof(); - } - - return $params; - } - - /** - * Only return params on POST requests. - * - * @return array - */ - public function getPostParams() - { - if ($this->getMethod() === 'POST') { - return $this->getParams(); - } - - return []; - } - - /** - * The graph version used for this request. - * - * @return string - */ - public function getGraphVersion() - { - return $this->graphVersion; - } - - /** - * Generate and return the URL for this request. - * - * @return string - */ - public function getUrl() - { - $this->validateMethod(); - - $graphVersion = FacebookUrlManipulator::forceSlashPrefix($this->graphVersion); - $endpoint = FacebookUrlManipulator::forceSlashPrefix($this->getEndpoint()); - - $url = $graphVersion . $endpoint; - - if ($this->getMethod() !== 'POST') { - $params = $this->getParams(); - $url = FacebookUrlManipulator::appendParamsToUrl($url, $params); - } - - return $url; - } - - /** - * Return the default headers that every request should use. - * - * @return array - */ - public static function getDefaultHeaders() - { - return [ - 'User-Agent' => 'fb-php-' . Facebook::VERSION, - 'Accept-Encoding' => '*', - ]; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookResponse.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookResponse.php deleted file mode 100755 index ce55b143..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FacebookResponse.php +++ /dev/null @@ -1,410 +0,0 @@ -request = $request; - $this->body = $body; - $this->httpStatusCode = $httpStatusCode; - $this->headers = $headers; - - $this->decodeBody(); - } - - /** - * Return the original request that returned this response. - * - * @return FacebookRequest - */ - public function getRequest() - { - return $this->request; - } - - /** - * Return the FacebookApp entity used for this response. - * - * @return FacebookApp - */ - public function getApp() - { - return $this->request->getApp(); - } - - /** - * Return the access token that was used for this response. - * - * @return string|null - */ - public function getAccessToken() - { - return $this->request->getAccessToken(); - } - - /** - * Return the HTTP status code for this response. - * - * @return int - */ - public function getHttpStatusCode() - { - return $this->httpStatusCode; - } - - /** - * Return the HTTP headers for this response. - * - * @return array - */ - public function getHeaders() - { - return $this->headers; - } - - /** - * Return the raw body response. - * - * @return string - */ - public function getBody() - { - return $this->body; - } - - /** - * Return the decoded body response. - * - * @return array - */ - public function getDecodedBody() - { - return $this->decodedBody; - } - - /** - * Get the app secret proof that was used for this response. - * - * @return string|null - */ - public function getAppSecretProof() - { - return $this->request->getAppSecretProof(); - } - - /** - * Get the ETag associated with the response. - * - * @return string|null - */ - public function getETag() - { - return isset($this->headers['ETag']) ? $this->headers['ETag'] : null; - } - - /** - * Get the version of Graph that returned this response. - * - * @return string|null - */ - public function getGraphVersion() - { - return isset($this->headers['Facebook-API-Version']) ? $this->headers['Facebook-API-Version'] : null; - } - - /** - * Returns true if Graph returned an error message. - * - * @return boolean - */ - public function isError() - { - return isset($this->decodedBody['error']); - } - - /** - * Throws the exception. - * - * @throws FacebookSDKException - */ - public function throwException() - { - throw $this->thrownException; - } - - /** - * Instantiates an exception to be thrown later. - */ - public function makeException() - { - $this->thrownException = FacebookResponseException::create($this); - } - - /** - * Returns the exception that was thrown for this request. - * - * @return FacebookSDKException|null - */ - public function getThrownException() - { - return $this->thrownException; - } - - /** - * Convert the raw response into an array if possible. - * - * Graph will return 2 types of responses: - * - JSON(P) - * Most responses from Grpah are JSON(P) - * - application/x-www-form-urlencoded key/value pairs - * Happens on the `/oauth/access_token` endpoint when exchanging - * a short-lived access token for a long-lived access token - * - And sometimes nothing :/ but that'd be a bug. - */ - public function decodeBody() - { - $this->decodedBody = json_decode($this->body, true); - - if ($this->decodedBody === null) { - $this->decodedBody = []; - parse_str($this->body, $this->decodedBody); - } elseif (is_bool($this->decodedBody)) { - // Backwards compatibility for Graph < 2.1. - // Mimics 2.1 responses. - // @TODO Remove this after Graph 2.0 is no longer supported - $this->decodedBody = ['success' => $this->decodedBody]; - } elseif (is_numeric($this->decodedBody)) { - $this->decodedBody = ['id' => $this->decodedBody]; - } - - if (!is_array($this->decodedBody)) { - $this->decodedBody = []; - } - - if ($this->isError()) { - $this->makeException(); - } - } - - /** - * Instantiate a new GraphObject from response. - * - * @param string|null $subclassName The GraphNode sub class to cast to. - * - * @return \Facebook\GraphNodes\GraphObject - * - * @throws FacebookSDKException - * - * @deprecated 5.0.0 getGraphObject() has been renamed to getGraphNode() - * @todo v6: Remove this method - */ - public function getGraphObject($subclassName = null) - { - return $this->getGraphNode($subclassName); - } - - /** - * Instantiate a new GraphNode from response. - * - * @param string|null $subclassName The GraphNode sub class to cast to. - * - * @return \Facebook\GraphNodes\GraphNode - * - * @throws FacebookSDKException - */ - public function getGraphNode($subclassName = null) - { - $factory = new GraphNodeFactory($this); - - return $factory->makeGraphNode($subclassName); - } - - /** - * Convenience method for creating a GraphAlbum collection. - * - * @return \Facebook\GraphNodes\GraphAlbum - * - * @throws FacebookSDKException - */ - public function getGraphAlbum() - { - $factory = new GraphNodeFactory($this); - - return $factory->makeGraphAlbum(); - } - - /** - * Convenience method for creating a GraphPage collection. - * - * @return \Facebook\GraphNodes\GraphPage - * - * @throws FacebookSDKException - */ - public function getGraphPage() - { - $factory = new GraphNodeFactory($this); - - return $factory->makeGraphPage(); - } - - /** - * Convenience method for creating a GraphSessionInfo collection. - * - * @return \Facebook\GraphNodes\GraphSessionInfo - * - * @throws FacebookSDKException - */ - public function getGraphSessionInfo() - { - $factory = new GraphNodeFactory($this); - - return $factory->makeGraphSessionInfo(); - } - - /** - * Convenience method for creating a GraphUser collection. - * - * @return \Facebook\GraphNodes\GraphUser - * - * @throws FacebookSDKException - */ - public function getGraphUser() - { - $factory = new GraphNodeFactory($this); - - return $factory->makeGraphUser(); - } - - /** - * Convenience method for creating a GraphEvent collection. - * - * @return \Facebook\GraphNodes\GraphEvent - * - * @throws FacebookSDKException - */ - public function getGraphEvent() - { - $factory = new GraphNodeFactory($this); - - return $factory->makeGraphEvent(); - } - - /** - * Convenience method for creating a GraphGroup collection. - * - * @return \Facebook\GraphNodes\GraphGroup - * - * @throws FacebookSDKException - */ - public function getGraphGroup() - { - $factory = new GraphNodeFactory($this); - - return $factory->makeGraphGroup(); - } - - /** - * Instantiate a new GraphList from response. - * - * @param string|null $subclassName The GraphNode sub class to cast list items to. - * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. - * - * @return \Facebook\GraphNodes\GraphList - * - * @throws FacebookSDKException - * - * @deprecated 5.0.0 getGraphList() has been renamed to getGraphEdge() - * @todo v6: Remove this method - */ - public function getGraphList($subclassName = null, $auto_prefix = true) - { - return $this->getGraphEdge($subclassName, $auto_prefix); - } - - /** - * Instantiate a new GraphEdge from response. - * - * @param string|null $subclassName The GraphNode sub class to cast list items to. - * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. - * - * @return \Facebook\GraphNodes\GraphEdge - * - * @throws FacebookSDKException - */ - public function getGraphEdge($subclassName = null, $auto_prefix = true) - { - $factory = new GraphNodeFactory($this); - - return $factory->makeGraphEdge($subclassName, $auto_prefix); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FileUpload/FacebookFile.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FileUpload/FacebookFile.php deleted file mode 100755 index f8b99054..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FileUpload/FacebookFile.php +++ /dev/null @@ -1,135 +0,0 @@ -path = $filePath; - $this->open(); - } - - /** - * Closes the stream when destructed. - */ - public function __destruct() - { - $this->close(); - } - - /** - * Opens a stream for the file. - * - * @throws FacebookSDKException - */ - public function open() - { - if (!$this->isRemoteFile($this->path) && !is_readable($this->path)) { - throw new FacebookSDKException('Failed to create FacebookFile entity. Unable to read resource: ' . $this->path . '.'); - } - - $this->stream = fopen($this->path, 'r'); - - if (!$this->stream) { - throw new FacebookSDKException('Failed to create FacebookFile entity. Unable to open resource: ' . $this->path . '.'); - } - } - - /** - * Stops the file stream. - */ - public function close() - { - if (is_resource($this->stream)) { - fclose($this->stream); - } - } - - /** - * Return the contents of the file. - * - * @return string - */ - public function getContents() - { - return stream_get_contents($this->stream); - } - - /** - * Return the name of the file. - * - * @return string - */ - public function getFileName() - { - return basename($this->path); - } - - /** - * Return the mimetype of the file. - * - * @return string - */ - public function getMimetype() - { - return Mimetypes::getInstance()->fromFilename($this->path) ?: 'text/plain'; - } - - /** - * Returns true if the path to the file is remote. - * - * @param string $pathToFile - * - * @return boolean - */ - protected function isRemoteFile($pathToFile) - { - return preg_match('/^(https?|ftp):\/\/.*/', $pathToFile) === 1; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FileUpload/FacebookVideo.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FileUpload/FacebookVideo.php deleted file mode 100755 index 1e8c55aa..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/FileUpload/FacebookVideo.php +++ /dev/null @@ -1,33 +0,0 @@ - 'text/vnd.in3d.3dml', - '3g2' => 'video/3gpp2', - '3gp' => 'video/3gpp', - '7z' => 'application/x-7z-compressed', - 'aab' => 'application/x-authorware-bin', - 'aac' => 'audio/x-aac', - 'aam' => 'application/x-authorware-map', - 'aas' => 'application/x-authorware-seg', - 'abw' => 'application/x-abiword', - 'ac' => 'application/pkix-attr-cert', - 'acc' => 'application/vnd.americandynamics.acc', - 'ace' => 'application/x-ace-compressed', - 'acu' => 'application/vnd.acucobol', - 'acutc' => 'application/vnd.acucorp', - 'adp' => 'audio/adpcm', - 'aep' => 'application/vnd.audiograph', - 'afm' => 'application/x-font-type1', - 'afp' => 'application/vnd.ibm.modcap', - 'ahead' => 'application/vnd.ahead.space', - 'ai' => 'application/postscript', - 'aif' => 'audio/x-aiff', - 'aifc' => 'audio/x-aiff', - 'aiff' => 'audio/x-aiff', - 'air' => 'application/vnd.adobe.air-application-installer-package+zip', - 'ait' => 'application/vnd.dvb.ait', - 'ami' => 'application/vnd.amiga.ami', - 'apk' => 'application/vnd.android.package-archive', - 'application' => 'application/x-ms-application', - 'apr' => 'application/vnd.lotus-approach', - 'asa' => 'text/plain', - 'asax' => 'application/octet-stream', - 'asc' => 'application/pgp-signature', - 'ascx' => 'text/plain', - 'asf' => 'video/x-ms-asf', - 'ashx' => 'text/plain', - 'asm' => 'text/x-asm', - 'asmx' => 'text/plain', - 'aso' => 'application/vnd.accpac.simply.aso', - 'asp' => 'text/plain', - 'aspx' => 'text/plain', - 'asx' => 'video/x-ms-asf', - 'atc' => 'application/vnd.acucorp', - 'atom' => 'application/atom+xml', - 'atomcat' => 'application/atomcat+xml', - 'atomsvc' => 'application/atomsvc+xml', - 'atx' => 'application/vnd.antix.game-component', - 'au' => 'audio/basic', - 'avi' => 'video/x-msvideo', - 'aw' => 'application/applixware', - 'axd' => 'text/plain', - 'azf' => 'application/vnd.airzip.filesecure.azf', - 'azs' => 'application/vnd.airzip.filesecure.azs', - 'azw' => 'application/vnd.amazon.ebook', - 'bat' => 'application/x-msdownload', - 'bcpio' => 'application/x-bcpio', - 'bdf' => 'application/x-font-bdf', - 'bdm' => 'application/vnd.syncml.dm+wbxml', - 'bed' => 'application/vnd.realvnc.bed', - 'bh2' => 'application/vnd.fujitsu.oasysprs', - 'bin' => 'application/octet-stream', - 'bmi' => 'application/vnd.bmi', - 'bmp' => 'image/bmp', - 'book' => 'application/vnd.framemaker', - 'box' => 'application/vnd.previewsystems.box', - 'boz' => 'application/x-bzip2', - 'bpk' => 'application/octet-stream', - 'btif' => 'image/prs.btif', - 'bz' => 'application/x-bzip', - 'bz2' => 'application/x-bzip2', - 'c' => 'text/x-c', - 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', - 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', - 'c4d' => 'application/vnd.clonk.c4group', - 'c4f' => 'application/vnd.clonk.c4group', - 'c4g' => 'application/vnd.clonk.c4group', - 'c4p' => 'application/vnd.clonk.c4group', - 'c4u' => 'application/vnd.clonk.c4group', - 'cab' => 'application/vnd.ms-cab-compressed', - 'car' => 'application/vnd.curl.car', - 'cat' => 'application/vnd.ms-pki.seccat', - 'cc' => 'text/x-c', - 'cct' => 'application/x-director', - 'ccxml' => 'application/ccxml+xml', - 'cdbcmsg' => 'application/vnd.contact.cmsg', - 'cdf' => 'application/x-netcdf', - 'cdkey' => 'application/vnd.mediastation.cdkey', - 'cdmia' => 'application/cdmi-capability', - 'cdmic' => 'application/cdmi-container', - 'cdmid' => 'application/cdmi-domain', - 'cdmio' => 'application/cdmi-object', - 'cdmiq' => 'application/cdmi-queue', - 'cdx' => 'chemical/x-cdx', - 'cdxml' => 'application/vnd.chemdraw+xml', - 'cdy' => 'application/vnd.cinderella', - 'cer' => 'application/pkix-cert', - 'cfc' => 'application/x-coldfusion', - 'cfm' => 'application/x-coldfusion', - 'cgm' => 'image/cgm', - 'chat' => 'application/x-chat', - 'chm' => 'application/vnd.ms-htmlhelp', - 'chrt' => 'application/vnd.kde.kchart', - 'cif' => 'chemical/x-cif', - 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', - 'cil' => 'application/vnd.ms-artgalry', - 'cla' => 'application/vnd.claymore', - 'class' => 'application/java-vm', - 'clkk' => 'application/vnd.crick.clicker.keyboard', - 'clkp' => 'application/vnd.crick.clicker.palette', - 'clkt' => 'application/vnd.crick.clicker.template', - 'clkw' => 'application/vnd.crick.clicker.wordbank', - 'clkx' => 'application/vnd.crick.clicker', - 'clp' => 'application/x-msclip', - 'cmc' => 'application/vnd.cosmocaller', - 'cmdf' => 'chemical/x-cmdf', - 'cml' => 'chemical/x-cml', - 'cmp' => 'application/vnd.yellowriver-custom-menu', - 'cmx' => 'image/x-cmx', - 'cod' => 'application/vnd.rim.cod', - 'com' => 'application/x-msdownload', - 'conf' => 'text/plain', - 'cpio' => 'application/x-cpio', - 'cpp' => 'text/x-c', - 'cpt' => 'application/mac-compactpro', - 'crd' => 'application/x-mscardfile', - 'crl' => 'application/pkix-crl', - 'crt' => 'application/x-x509-ca-cert', - 'cryptonote' => 'application/vnd.rig.cryptonote', - 'cs' => 'text/plain', - 'csh' => 'application/x-csh', - 'csml' => 'chemical/x-csml', - 'csp' => 'application/vnd.commonspace', - 'css' => 'text/css', - 'cst' => 'application/x-director', - 'csv' => 'text/csv', - 'cu' => 'application/cu-seeme', - 'curl' => 'text/vnd.curl', - 'cww' => 'application/prs.cww', - 'cxt' => 'application/x-director', - 'cxx' => 'text/x-c', - 'dae' => 'model/vnd.collada+xml', - 'daf' => 'application/vnd.mobius.daf', - 'dataless' => 'application/vnd.fdsn.seed', - 'davmount' => 'application/davmount+xml', - 'dcr' => 'application/x-director', - 'dcurl' => 'text/vnd.curl.dcurl', - 'dd2' => 'application/vnd.oma.dd2+xml', - 'ddd' => 'application/vnd.fujixerox.ddd', - 'deb' => 'application/x-debian-package', - 'def' => 'text/plain', - 'deploy' => 'application/octet-stream', - 'der' => 'application/x-x509-ca-cert', - 'dfac' => 'application/vnd.dreamfactory', - 'dic' => 'text/x-c', - 'dir' => 'application/x-director', - 'dis' => 'application/vnd.mobius.dis', - 'dist' => 'application/octet-stream', - 'distz' => 'application/octet-stream', - 'djv' => 'image/vnd.djvu', - 'djvu' => 'image/vnd.djvu', - 'dll' => 'application/x-msdownload', - 'dmg' => 'application/octet-stream', - 'dms' => 'application/octet-stream', - 'dna' => 'application/vnd.dna', - 'doc' => 'application/msword', - 'docm' => 'application/vnd.ms-word.document.macroenabled.12', - 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 'dot' => 'application/msword', - 'dotm' => 'application/vnd.ms-word.template.macroenabled.12', - 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', - 'dp' => 'application/vnd.osgi.dp', - 'dpg' => 'application/vnd.dpgraph', - 'dra' => 'audio/vnd.dra', - 'dsc' => 'text/prs.lines.tag', - 'dssc' => 'application/dssc+der', - 'dtb' => 'application/x-dtbook+xml', - 'dtd' => 'application/xml-dtd', - 'dts' => 'audio/vnd.dts', - 'dtshd' => 'audio/vnd.dts.hd', - 'dump' => 'application/octet-stream', - 'dvi' => 'application/x-dvi', - 'dwf' => 'model/vnd.dwf', - 'dwg' => 'image/vnd.dwg', - 'dxf' => 'image/vnd.dxf', - 'dxp' => 'application/vnd.spotfire.dxp', - 'dxr' => 'application/x-director', - 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', - 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', - 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', - 'ecma' => 'application/ecmascript', - 'edm' => 'application/vnd.novadigm.edm', - 'edx' => 'application/vnd.novadigm.edx', - 'efif' => 'application/vnd.picsel', - 'ei6' => 'application/vnd.pg.osasli', - 'elc' => 'application/octet-stream', - 'eml' => 'message/rfc822', - 'emma' => 'application/emma+xml', - 'eol' => 'audio/vnd.digital-winds', - 'eot' => 'application/vnd.ms-fontobject', - 'eps' => 'application/postscript', - 'epub' => 'application/epub+zip', - 'es3' => 'application/vnd.eszigno3+xml', - 'esf' => 'application/vnd.epson.esf', - 'et3' => 'application/vnd.eszigno3+xml', - 'etx' => 'text/x-setext', - 'exe' => 'application/x-msdownload', - 'exi' => 'application/exi', - 'ext' => 'application/vnd.novadigm.ext', - 'ez' => 'application/andrew-inset', - 'ez2' => 'application/vnd.ezpix-album', - 'ez3' => 'application/vnd.ezpix-package', - 'f' => 'text/x-fortran', - 'f4v' => 'video/x-f4v', - 'f77' => 'text/x-fortran', - 'f90' => 'text/x-fortran', - 'fbs' => 'image/vnd.fastbidsheet', - 'fcs' => 'application/vnd.isac.fcs', - 'fdf' => 'application/vnd.fdf', - 'fe_launch' => 'application/vnd.denovo.fcselayout-link', - 'fg5' => 'application/vnd.fujitsu.oasysgp', - 'fgd' => 'application/x-director', - 'fh' => 'image/x-freehand', - 'fh4' => 'image/x-freehand', - 'fh5' => 'image/x-freehand', - 'fh7' => 'image/x-freehand', - 'fhc' => 'image/x-freehand', - 'fig' => 'application/x-xfig', - 'fli' => 'video/x-fli', - 'flo' => 'application/vnd.micrografx.flo', - 'flv' => 'video/x-flv', - 'flw' => 'application/vnd.kde.kivio', - 'flx' => 'text/vnd.fmi.flexstor', - 'fly' => 'text/vnd.fly', - 'fm' => 'application/vnd.framemaker', - 'fnc' => 'application/vnd.frogans.fnc', - 'for' => 'text/x-fortran', - 'fpx' => 'image/vnd.fpx', - 'frame' => 'application/vnd.framemaker', - 'fsc' => 'application/vnd.fsc.weblaunch', - 'fst' => 'image/vnd.fst', - 'ftc' => 'application/vnd.fluxtime.clip', - 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', - 'fvt' => 'video/vnd.fvt', - 'fxp' => 'application/vnd.adobe.fxp', - 'fxpl' => 'application/vnd.adobe.fxp', - 'fzs' => 'application/vnd.fuzzysheet', - 'g2w' => 'application/vnd.geoplan', - 'g3' => 'image/g3fax', - 'g3w' => 'application/vnd.geospace', - 'gac' => 'application/vnd.groove-account', - 'gdl' => 'model/vnd.gdl', - 'geo' => 'application/vnd.dynageo', - 'gex' => 'application/vnd.geometry-explorer', - 'ggb' => 'application/vnd.geogebra.file', - 'ggt' => 'application/vnd.geogebra.tool', - 'ghf' => 'application/vnd.groove-help', - 'gif' => 'image/gif', - 'gim' => 'application/vnd.groove-identity-message', - 'gmx' => 'application/vnd.gmx', - 'gnumeric' => 'application/x-gnumeric', - 'gph' => 'application/vnd.flographit', - 'gqf' => 'application/vnd.grafeq', - 'gqs' => 'application/vnd.grafeq', - 'gram' => 'application/srgs', - 'gre' => 'application/vnd.geometry-explorer', - 'grv' => 'application/vnd.groove-injector', - 'grxml' => 'application/srgs+xml', - 'gsf' => 'application/x-font-ghostscript', - 'gtar' => 'application/x-gtar', - 'gtm' => 'application/vnd.groove-tool-message', - 'gtw' => 'model/vnd.gtw', - 'gv' => 'text/vnd.graphviz', - 'gxt' => 'application/vnd.geonext', - 'h' => 'text/x-c', - 'h261' => 'video/h261', - 'h263' => 'video/h263', - 'h264' => 'video/h264', - 'hal' => 'application/vnd.hal+xml', - 'hbci' => 'application/vnd.hbci', - 'hdf' => 'application/x-hdf', - 'hh' => 'text/x-c', - 'hlp' => 'application/winhlp', - 'hpgl' => 'application/vnd.hp-hpgl', - 'hpid' => 'application/vnd.hp-hpid', - 'hps' => 'application/vnd.hp-hps', - 'hqx' => 'application/mac-binhex40', - 'hta' => 'application/octet-stream', - 'htc' => 'text/html', - 'htke' => 'application/vnd.kenameaapp', - 'htm' => 'text/html', - 'html' => 'text/html', - 'hvd' => 'application/vnd.yamaha.hv-dic', - 'hvp' => 'application/vnd.yamaha.hv-voice', - 'hvs' => 'application/vnd.yamaha.hv-script', - 'i2g' => 'application/vnd.intergeo', - 'icc' => 'application/vnd.iccprofile', - 'ice' => 'x-conference/x-cooltalk', - 'icm' => 'application/vnd.iccprofile', - 'ico' => 'image/x-icon', - 'ics' => 'text/calendar', - 'ief' => 'image/ief', - 'ifb' => 'text/calendar', - 'ifm' => 'application/vnd.shana.informed.formdata', - 'iges' => 'model/iges', - 'igl' => 'application/vnd.igloader', - 'igm' => 'application/vnd.insors.igm', - 'igs' => 'model/iges', - 'igx' => 'application/vnd.micrografx.igx', - 'iif' => 'application/vnd.shana.informed.interchange', - 'imp' => 'application/vnd.accpac.simply.imp', - 'ims' => 'application/vnd.ms-ims', - 'in' => 'text/plain', - 'ini' => 'text/plain', - 'ipfix' => 'application/ipfix', - 'ipk' => 'application/vnd.shana.informed.package', - 'irm' => 'application/vnd.ibm.rights-management', - 'irp' => 'application/vnd.irepository.package+xml', - 'iso' => 'application/octet-stream', - 'itp' => 'application/vnd.shana.informed.formtemplate', - 'ivp' => 'application/vnd.immervision-ivp', - 'ivu' => 'application/vnd.immervision-ivu', - 'jad' => 'text/vnd.sun.j2me.app-descriptor', - 'jam' => 'application/vnd.jam', - 'jar' => 'application/java-archive', - 'java' => 'text/x-java-source', - 'jisp' => 'application/vnd.jisp', - 'jlt' => 'application/vnd.hp-jlyt', - 'jnlp' => 'application/x-java-jnlp-file', - 'joda' => 'application/vnd.joost.joda-archive', - 'jpe' => 'image/jpeg', - 'jpeg' => 'image/jpeg', - 'jpg' => 'image/jpeg', - 'jpgm' => 'video/jpm', - 'jpgv' => 'video/jpeg', - 'jpm' => 'video/jpm', - 'js' => 'text/javascript', - 'json' => 'application/json', - 'kar' => 'audio/midi', - 'karbon' => 'application/vnd.kde.karbon', - 'kfo' => 'application/vnd.kde.kformula', - 'kia' => 'application/vnd.kidspiration', - 'kml' => 'application/vnd.google-earth.kml+xml', - 'kmz' => 'application/vnd.google-earth.kmz', - 'kne' => 'application/vnd.kinar', - 'knp' => 'application/vnd.kinar', - 'kon' => 'application/vnd.kde.kontour', - 'kpr' => 'application/vnd.kde.kpresenter', - 'kpt' => 'application/vnd.kde.kpresenter', - 'ksp' => 'application/vnd.kde.kspread', - 'ktr' => 'application/vnd.kahootz', - 'ktx' => 'image/ktx', - 'ktz' => 'application/vnd.kahootz', - 'kwd' => 'application/vnd.kde.kword', - 'kwt' => 'application/vnd.kde.kword', - 'lasxml' => 'application/vnd.las.las+xml', - 'latex' => 'application/x-latex', - 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', - 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', - 'les' => 'application/vnd.hhe.lesson-player', - 'lha' => 'application/octet-stream', - 'link66' => 'application/vnd.route66.link66+xml', - 'list' => 'text/plain', - 'list3820' => 'application/vnd.ibm.modcap', - 'listafp' => 'application/vnd.ibm.modcap', - 'log' => 'text/plain', - 'lostxml' => 'application/lost+xml', - 'lrf' => 'application/octet-stream', - 'lrm' => 'application/vnd.ms-lrm', - 'ltf' => 'application/vnd.frogans.ltf', - 'lvp' => 'audio/vnd.lucent.voice', - 'lwp' => 'application/vnd.lotus-wordpro', - 'lzh' => 'application/octet-stream', - 'm13' => 'application/x-msmediaview', - 'm14' => 'application/x-msmediaview', - 'm1v' => 'video/mpeg', - 'm21' => 'application/mp21', - 'm2a' => 'audio/mpeg', - 'm2v' => 'video/mpeg', - 'm3a' => 'audio/mpeg', - 'm3u' => 'audio/x-mpegurl', - 'm3u8' => 'application/vnd.apple.mpegurl', - 'm4a' => 'audio/mp4', - 'm4u' => 'video/vnd.mpegurl', - 'm4v' => 'video/mp4', - 'ma' => 'application/mathematica', - 'mads' => 'application/mads+xml', - 'mag' => 'application/vnd.ecowin.chart', - 'maker' => 'application/vnd.framemaker', - 'man' => 'text/troff', - 'mathml' => 'application/mathml+xml', - 'mb' => 'application/mathematica', - 'mbk' => 'application/vnd.mobius.mbk', - 'mbox' => 'application/mbox', - 'mc1' => 'application/vnd.medcalcdata', - 'mcd' => 'application/vnd.mcd', - 'mcurl' => 'text/vnd.curl.mcurl', - 'mdb' => 'application/x-msaccess', - 'mdi' => 'image/vnd.ms-modi', - 'me' => 'text/troff', - 'mesh' => 'model/mesh', - 'meta4' => 'application/metalink4+xml', - 'mets' => 'application/mets+xml', - 'mfm' => 'application/vnd.mfmp', - 'mgp' => 'application/vnd.osgeo.mapguide.package', - 'mgz' => 'application/vnd.proteus.magazine', - 'mid' => 'audio/midi', - 'midi' => 'audio/midi', - 'mif' => 'application/vnd.mif', - 'mime' => 'message/rfc822', - 'mj2' => 'video/mj2', - 'mjp2' => 'video/mj2', - 'mlp' => 'application/vnd.dolby.mlp', - 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', - 'mmf' => 'application/vnd.smaf', - 'mmr' => 'image/vnd.fujixerox.edmics-mmr', - 'mny' => 'application/x-msmoney', - 'mobi' => 'application/x-mobipocket-ebook', - 'mods' => 'application/mods+xml', - 'mov' => 'video/quicktime', - 'movie' => 'video/x-sgi-movie', - 'mp2' => 'audio/mpeg', - 'mp21' => 'application/mp21', - 'mp2a' => 'audio/mpeg', - 'mp3' => 'audio/mpeg', - 'mp4' => 'video/mp4', - 'mp4a' => 'audio/mp4', - 'mp4s' => 'application/mp4', - 'mp4v' => 'video/mp4', - 'mpc' => 'application/vnd.mophun.certificate', - 'mpe' => 'video/mpeg', - 'mpeg' => 'video/mpeg', - 'mpg' => 'video/mpeg', - 'mpg4' => 'video/mp4', - 'mpga' => 'audio/mpeg', - 'mpkg' => 'application/vnd.apple.installer+xml', - 'mpm' => 'application/vnd.blueice.multipass', - 'mpn' => 'application/vnd.mophun.application', - 'mpp' => 'application/vnd.ms-project', - 'mpt' => 'application/vnd.ms-project', - 'mpy' => 'application/vnd.ibm.minipay', - 'mqy' => 'application/vnd.mobius.mqy', - 'mrc' => 'application/marc', - 'mrcx' => 'application/marcxml+xml', - 'ms' => 'text/troff', - 'mscml' => 'application/mediaservercontrol+xml', - 'mseed' => 'application/vnd.fdsn.mseed', - 'mseq' => 'application/vnd.mseq', - 'msf' => 'application/vnd.epson.msf', - 'msh' => 'model/mesh', - 'msi' => 'application/x-msdownload', - 'msl' => 'application/vnd.mobius.msl', - 'msty' => 'application/vnd.muvee.style', - 'mts' => 'model/vnd.mts', - 'mus' => 'application/vnd.musician', - 'musicxml' => 'application/vnd.recordare.musicxml+xml', - 'mvb' => 'application/x-msmediaview', - 'mwf' => 'application/vnd.mfer', - 'mxf' => 'application/mxf', - 'mxl' => 'application/vnd.recordare.musicxml', - 'mxml' => 'application/xv+xml', - 'mxs' => 'application/vnd.triscape.mxs', - 'mxu' => 'video/vnd.mpegurl', - 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', - 'n3' => 'text/n3', - 'nb' => 'application/mathematica', - 'nbp' => 'application/vnd.wolfram.player', - 'nc' => 'application/x-netcdf', - 'ncx' => 'application/x-dtbncx+xml', - 'ngdat' => 'application/vnd.nokia.n-gage.data', - 'nlu' => 'application/vnd.neurolanguage.nlu', - 'nml' => 'application/vnd.enliven', - 'nnd' => 'application/vnd.noblenet-directory', - 'nns' => 'application/vnd.noblenet-sealer', - 'nnw' => 'application/vnd.noblenet-web', - 'npx' => 'image/vnd.net-fpx', - 'nsf' => 'application/vnd.lotus-notes', - 'oa2' => 'application/vnd.fujitsu.oasys2', - 'oa3' => 'application/vnd.fujitsu.oasys3', - 'oas' => 'application/vnd.fujitsu.oasys', - 'obd' => 'application/x-msbinder', - 'oda' => 'application/oda', - 'odb' => 'application/vnd.oasis.opendocument.database', - 'odc' => 'application/vnd.oasis.opendocument.chart', - 'odf' => 'application/vnd.oasis.opendocument.formula', - 'odft' => 'application/vnd.oasis.opendocument.formula-template', - 'odg' => 'application/vnd.oasis.opendocument.graphics', - 'odi' => 'application/vnd.oasis.opendocument.image', - 'odm' => 'application/vnd.oasis.opendocument.text-master', - 'odp' => 'application/vnd.oasis.opendocument.presentation', - 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', - 'odt' => 'application/vnd.oasis.opendocument.text', - 'oga' => 'audio/ogg', - 'ogg' => 'audio/ogg', - 'ogv' => 'video/ogg', - 'ogx' => 'application/ogg', - 'onepkg' => 'application/onenote', - 'onetmp' => 'application/onenote', - 'onetoc' => 'application/onenote', - 'onetoc2' => 'application/onenote', - 'opf' => 'application/oebps-package+xml', - 'oprc' => 'application/vnd.palm', - 'org' => 'application/vnd.lotus-organizer', - 'osf' => 'application/vnd.yamaha.openscoreformat', - 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', - 'otc' => 'application/vnd.oasis.opendocument.chart-template', - 'otf' => 'application/x-font-otf', - 'otg' => 'application/vnd.oasis.opendocument.graphics-template', - 'oth' => 'application/vnd.oasis.opendocument.text-web', - 'oti' => 'application/vnd.oasis.opendocument.image-template', - 'otp' => 'application/vnd.oasis.opendocument.presentation-template', - 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', - 'ott' => 'application/vnd.oasis.opendocument.text-template', - 'oxt' => 'application/vnd.openofficeorg.extension', - 'p' => 'text/x-pascal', - 'p10' => 'application/pkcs10', - 'p12' => 'application/x-pkcs12', - 'p7b' => 'application/x-pkcs7-certificates', - 'p7c' => 'application/pkcs7-mime', - 'p7m' => 'application/pkcs7-mime', - 'p7r' => 'application/x-pkcs7-certreqresp', - 'p7s' => 'application/pkcs7-signature', - 'p8' => 'application/pkcs8', - 'pas' => 'text/x-pascal', - 'paw' => 'application/vnd.pawaafile', - 'pbd' => 'application/vnd.powerbuilder6', - 'pbm' => 'image/x-portable-bitmap', - 'pcf' => 'application/x-font-pcf', - 'pcl' => 'application/vnd.hp-pcl', - 'pclxl' => 'application/vnd.hp-pclxl', - 'pct' => 'image/x-pict', - 'pcurl' => 'application/vnd.curl.pcurl', - 'pcx' => 'image/x-pcx', - 'pdb' => 'application/vnd.palm', - 'pdf' => 'application/pdf', - 'pfa' => 'application/x-font-type1', - 'pfb' => 'application/x-font-type1', - 'pfm' => 'application/x-font-type1', - 'pfr' => 'application/font-tdpfr', - 'pfx' => 'application/x-pkcs12', - 'pgm' => 'image/x-portable-graymap', - 'pgn' => 'application/x-chess-pgn', - 'pgp' => 'application/pgp-encrypted', - 'php' => 'text/x-php', - 'phps' => 'application/x-httpd-phps', - 'pic' => 'image/x-pict', - 'pkg' => 'application/octet-stream', - 'pki' => 'application/pkixcmp', - 'pkipath' => 'application/pkix-pkipath', - 'plb' => 'application/vnd.3gpp.pic-bw-large', - 'plc' => 'application/vnd.mobius.plc', - 'plf' => 'application/vnd.pocketlearn', - 'pls' => 'application/pls+xml', - 'pml' => 'application/vnd.ctc-posml', - 'png' => 'image/png', - 'pnm' => 'image/x-portable-anymap', - 'portpkg' => 'application/vnd.macports.portpkg', - 'pot' => 'application/vnd.ms-powerpoint', - 'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12', - 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', - 'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12', - 'ppd' => 'application/vnd.cups-ppd', - 'ppm' => 'image/x-portable-pixmap', - 'pps' => 'application/vnd.ms-powerpoint', - 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12', - 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', - 'ppt' => 'application/vnd.ms-powerpoint', - 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12', - 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - 'pqa' => 'application/vnd.palm', - 'prc' => 'application/x-mobipocket-ebook', - 'pre' => 'application/vnd.lotus-freelance', - 'prf' => 'application/pics-rules', - 'ps' => 'application/postscript', - 'psb' => 'application/vnd.3gpp.pic-bw-small', - 'psd' => 'image/vnd.adobe.photoshop', - 'psf' => 'application/x-font-linux-psf', - 'pskcxml' => 'application/pskc+xml', - 'ptid' => 'application/vnd.pvi.ptid1', - 'pub' => 'application/x-mspublisher', - 'pvb' => 'application/vnd.3gpp.pic-bw-var', - 'pwn' => 'application/vnd.3m.post-it-notes', - 'pya' => 'audio/vnd.ms-playready.media.pya', - 'pyv' => 'video/vnd.ms-playready.media.pyv', - 'qam' => 'application/vnd.epson.quickanime', - 'qbo' => 'application/vnd.intu.qbo', - 'qfx' => 'application/vnd.intu.qfx', - 'qps' => 'application/vnd.publishare-delta-tree', - 'qt' => 'video/quicktime', - 'qwd' => 'application/vnd.quark.quarkxpress', - 'qwt' => 'application/vnd.quark.quarkxpress', - 'qxb' => 'application/vnd.quark.quarkxpress', - 'qxd' => 'application/vnd.quark.quarkxpress', - 'qxl' => 'application/vnd.quark.quarkxpress', - 'qxt' => 'application/vnd.quark.quarkxpress', - 'ra' => 'audio/x-pn-realaudio', - 'ram' => 'audio/x-pn-realaudio', - 'rar' => 'application/x-rar-compressed', - 'ras' => 'image/x-cmu-raster', - 'rb' => 'text/plain', - 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', - 'rdf' => 'application/rdf+xml', - 'rdz' => 'application/vnd.data-vision.rdz', - 'rep' => 'application/vnd.businessobjects', - 'res' => 'application/x-dtbresource+xml', - 'resx' => 'text/xml', - 'rgb' => 'image/x-rgb', - 'rif' => 'application/reginfo+xml', - 'rip' => 'audio/vnd.rip', - 'rl' => 'application/resource-lists+xml', - 'rlc' => 'image/vnd.fujixerox.edmics-rlc', - 'rld' => 'application/resource-lists-diff+xml', - 'rm' => 'application/vnd.rn-realmedia', - 'rmi' => 'audio/midi', - 'rmp' => 'audio/x-pn-realaudio-plugin', - 'rms' => 'application/vnd.jcp.javame.midlet-rms', - 'rnc' => 'application/relax-ng-compact-syntax', - 'roff' => 'text/troff', - 'rp9' => 'application/vnd.cloanto.rp9', - 'rpss' => 'application/vnd.nokia.radio-presets', - 'rpst' => 'application/vnd.nokia.radio-preset', - 'rq' => 'application/sparql-query', - 'rs' => 'application/rls-services+xml', - 'rsd' => 'application/rsd+xml', - 'rss' => 'application/rss+xml', - 'rtf' => 'application/rtf', - 'rtx' => 'text/richtext', - 's' => 'text/x-asm', - 'saf' => 'application/vnd.yamaha.smaf-audio', - 'sbml' => 'application/sbml+xml', - 'sc' => 'application/vnd.ibm.secure-container', - 'scd' => 'application/x-msschedule', - 'scm' => 'application/vnd.lotus-screencam', - 'scq' => 'application/scvp-cv-request', - 'scs' => 'application/scvp-cv-response', - 'scurl' => 'text/vnd.curl.scurl', - 'sda' => 'application/vnd.stardivision.draw', - 'sdc' => 'application/vnd.stardivision.calc', - 'sdd' => 'application/vnd.stardivision.impress', - 'sdkd' => 'application/vnd.solent.sdkm+xml', - 'sdkm' => 'application/vnd.solent.sdkm+xml', - 'sdp' => 'application/sdp', - 'sdw' => 'application/vnd.stardivision.writer', - 'see' => 'application/vnd.seemail', - 'seed' => 'application/vnd.fdsn.seed', - 'sema' => 'application/vnd.sema', - 'semd' => 'application/vnd.semd', - 'semf' => 'application/vnd.semf', - 'ser' => 'application/java-serialized-object', - 'setpay' => 'application/set-payment-initiation', - 'setreg' => 'application/set-registration-initiation', - 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', - 'sfs' => 'application/vnd.spotfire.sfs', - 'sgl' => 'application/vnd.stardivision.writer-global', - 'sgm' => 'text/sgml', - 'sgml' => 'text/sgml', - 'sh' => 'application/x-sh', - 'shar' => 'application/x-shar', - 'shf' => 'application/shf+xml', - 'sig' => 'application/pgp-signature', - 'silo' => 'model/mesh', - 'sis' => 'application/vnd.symbian.install', - 'sisx' => 'application/vnd.symbian.install', - 'sit' => 'application/x-stuffit', - 'sitx' => 'application/x-stuffitx', - 'skd' => 'application/vnd.koan', - 'skm' => 'application/vnd.koan', - 'skp' => 'application/vnd.koan', - 'skt' => 'application/vnd.koan', - 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', - 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', - 'slt' => 'application/vnd.epson.salt', - 'sm' => 'application/vnd.stepmania.stepchart', - 'smf' => 'application/vnd.stardivision.math', - 'smi' => 'application/smil+xml', - 'smil' => 'application/smil+xml', - 'snd' => 'audio/basic', - 'snf' => 'application/x-font-snf', - 'so' => 'application/octet-stream', - 'spc' => 'application/x-pkcs7-certificates', - 'spf' => 'application/vnd.yamaha.smaf-phrase', - 'spl' => 'application/x-futuresplash', - 'spot' => 'text/vnd.in3d.spot', - 'spp' => 'application/scvp-vp-response', - 'spq' => 'application/scvp-vp-request', - 'spx' => 'audio/ogg', - 'src' => 'application/x-wais-source', - 'sru' => 'application/sru+xml', - 'srx' => 'application/sparql-results+xml', - 'sse' => 'application/vnd.kodak-descriptor', - 'ssf' => 'application/vnd.epson.ssf', - 'ssml' => 'application/ssml+xml', - 'st' => 'application/vnd.sailingtracker.track', - 'stc' => 'application/vnd.sun.xml.calc.template', - 'std' => 'application/vnd.sun.xml.draw.template', - 'stf' => 'application/vnd.wt.stf', - 'sti' => 'application/vnd.sun.xml.impress.template', - 'stk' => 'application/hyperstudio', - 'stl' => 'application/vnd.ms-pki.stl', - 'str' => 'application/vnd.pg.format', - 'stw' => 'application/vnd.sun.xml.writer.template', - 'sub' => 'image/vnd.dvb.subtitle', - 'sus' => 'application/vnd.sus-calendar', - 'susp' => 'application/vnd.sus-calendar', - 'sv4cpio' => 'application/x-sv4cpio', - 'sv4crc' => 'application/x-sv4crc', - 'svc' => 'application/vnd.dvb.service', - 'svd' => 'application/vnd.svd', - 'svg' => 'image/svg+xml', - 'svgz' => 'image/svg+xml', - 'swa' => 'application/x-director', - 'swf' => 'application/x-shockwave-flash', - 'swi' => 'application/vnd.aristanetworks.swi', - 'sxc' => 'application/vnd.sun.xml.calc', - 'sxd' => 'application/vnd.sun.xml.draw', - 'sxg' => 'application/vnd.sun.xml.writer.global', - 'sxi' => 'application/vnd.sun.xml.impress', - 'sxm' => 'application/vnd.sun.xml.math', - 'sxw' => 'application/vnd.sun.xml.writer', - 't' => 'text/troff', - 'tao' => 'application/vnd.tao.intent-module-archive', - 'tar' => 'application/x-tar', - 'tcap' => 'application/vnd.3gpp2.tcap', - 'tcl' => 'application/x-tcl', - 'teacher' => 'application/vnd.smart.teacher', - 'tei' => 'application/tei+xml', - 'teicorpus' => 'application/tei+xml', - 'tex' => 'application/x-tex', - 'texi' => 'application/x-texinfo', - 'texinfo' => 'application/x-texinfo', - 'text' => 'text/plain', - 'tfi' => 'application/thraud+xml', - 'tfm' => 'application/x-tex-tfm', - 'thmx' => 'application/vnd.ms-officetheme', - 'tif' => 'image/tiff', - 'tiff' => 'image/tiff', - 'tmo' => 'application/vnd.tmobile-livetv', - 'torrent' => 'application/x-bittorrent', - 'tpl' => 'application/vnd.groove-tool-template', - 'tpt' => 'application/vnd.trid.tpt', - 'tr' => 'text/troff', - 'tra' => 'application/vnd.trueapp', - 'trm' => 'application/x-msterminal', - 'tsd' => 'application/timestamped-data', - 'tsv' => 'text/tab-separated-values', - 'ttc' => 'application/x-font-ttf', - 'ttf' => 'application/x-font-ttf', - 'ttl' => 'text/turtle', - 'twd' => 'application/vnd.simtech-mindmapper', - 'twds' => 'application/vnd.simtech-mindmapper', - 'txd' => 'application/vnd.genomatix.tuxedo', - 'txf' => 'application/vnd.mobius.txf', - 'txt' => 'text/plain', - 'u32' => 'application/x-authorware-bin', - 'udeb' => 'application/x-debian-package', - 'ufd' => 'application/vnd.ufdl', - 'ufdl' => 'application/vnd.ufdl', - 'umj' => 'application/vnd.umajin', - 'unityweb' => 'application/vnd.unity', - 'uoml' => 'application/vnd.uoml+xml', - 'uri' => 'text/uri-list', - 'uris' => 'text/uri-list', - 'urls' => 'text/uri-list', - 'ustar' => 'application/x-ustar', - 'utz' => 'application/vnd.uiq.theme', - 'uu' => 'text/x-uuencode', - 'uva' => 'audio/vnd.dece.audio', - 'uvd' => 'application/vnd.dece.data', - 'uvf' => 'application/vnd.dece.data', - 'uvg' => 'image/vnd.dece.graphic', - 'uvh' => 'video/vnd.dece.hd', - 'uvi' => 'image/vnd.dece.graphic', - 'uvm' => 'video/vnd.dece.mobile', - 'uvp' => 'video/vnd.dece.pd', - 'uvs' => 'video/vnd.dece.sd', - 'uvt' => 'application/vnd.dece.ttml+xml', - 'uvu' => 'video/vnd.uvvu.mp4', - 'uvv' => 'video/vnd.dece.video', - 'uvva' => 'audio/vnd.dece.audio', - 'uvvd' => 'application/vnd.dece.data', - 'uvvf' => 'application/vnd.dece.data', - 'uvvg' => 'image/vnd.dece.graphic', - 'uvvh' => 'video/vnd.dece.hd', - 'uvvi' => 'image/vnd.dece.graphic', - 'uvvm' => 'video/vnd.dece.mobile', - 'uvvp' => 'video/vnd.dece.pd', - 'uvvs' => 'video/vnd.dece.sd', - 'uvvt' => 'application/vnd.dece.ttml+xml', - 'uvvu' => 'video/vnd.uvvu.mp4', - 'uvvv' => 'video/vnd.dece.video', - 'uvvx' => 'application/vnd.dece.unspecified', - 'uvx' => 'application/vnd.dece.unspecified', - 'vcd' => 'application/x-cdlink', - 'vcf' => 'text/x-vcard', - 'vcg' => 'application/vnd.groove-vcard', - 'vcs' => 'text/x-vcalendar', - 'vcx' => 'application/vnd.vcx', - 'vis' => 'application/vnd.visionary', - 'viv' => 'video/vnd.vivo', - 'vor' => 'application/vnd.stardivision.writer', - 'vox' => 'application/x-authorware-bin', - 'vrml' => 'model/vrml', - 'vsd' => 'application/vnd.visio', - 'vsf' => 'application/vnd.vsf', - 'vss' => 'application/vnd.visio', - 'vst' => 'application/vnd.visio', - 'vsw' => 'application/vnd.visio', - 'vtu' => 'model/vnd.vtu', - 'vxml' => 'application/voicexml+xml', - 'w3d' => 'application/x-director', - 'wad' => 'application/x-doom', - 'wav' => 'audio/x-wav', - 'wax' => 'audio/x-ms-wax', - 'wbmp' => 'image/vnd.wap.wbmp', - 'wbs' => 'application/vnd.criticaltools.wbs+xml', - 'wbxml' => 'application/vnd.wap.wbxml', - 'wcm' => 'application/vnd.ms-works', - 'wdb' => 'application/vnd.ms-works', - 'weba' => 'audio/webm', - 'webm' => 'video/webm', - 'webp' => 'image/webp', - 'wg' => 'application/vnd.pmi.widget', - 'wgt' => 'application/widget', - 'wks' => 'application/vnd.ms-works', - 'wm' => 'video/x-ms-wm', - 'wma' => 'audio/x-ms-wma', - 'wmd' => 'application/x-ms-wmd', - 'wmf' => 'application/x-msmetafile', - 'wml' => 'text/vnd.wap.wml', - 'wmlc' => 'application/vnd.wap.wmlc', - 'wmls' => 'text/vnd.wap.wmlscript', - 'wmlsc' => 'application/vnd.wap.wmlscriptc', - 'wmv' => 'video/x-ms-wmv', - 'wmx' => 'video/x-ms-wmx', - 'wmz' => 'application/x-ms-wmz', - 'woff' => 'application/x-font-woff', - 'wpd' => 'application/vnd.wordperfect', - 'wpl' => 'application/vnd.ms-wpl', - 'wps' => 'application/vnd.ms-works', - 'wqd' => 'application/vnd.wqd', - 'wri' => 'application/x-mswrite', - 'wrl' => 'model/vrml', - 'wsdl' => 'application/wsdl+xml', - 'wspolicy' => 'application/wspolicy+xml', - 'wtb' => 'application/vnd.webturbo', - 'wvx' => 'video/x-ms-wvx', - 'x32' => 'application/x-authorware-bin', - 'x3d' => 'application/vnd.hzn-3d-crossword', - 'xap' => 'application/x-silverlight-app', - 'xar' => 'application/vnd.xara', - 'xbap' => 'application/x-ms-xbap', - 'xbd' => 'application/vnd.fujixerox.docuworks.binder', - 'xbm' => 'image/x-xbitmap', - 'xdf' => 'application/xcap-diff+xml', - 'xdm' => 'application/vnd.syncml.dm+xml', - 'xdp' => 'application/vnd.adobe.xdp+xml', - 'xdssc' => 'application/dssc+xml', - 'xdw' => 'application/vnd.fujixerox.docuworks', - 'xenc' => 'application/xenc+xml', - 'xer' => 'application/patch-ops-error+xml', - 'xfdf' => 'application/vnd.adobe.xfdf', - 'xfdl' => 'application/vnd.xfdl', - 'xht' => 'application/xhtml+xml', - 'xhtml' => 'application/xhtml+xml', - 'xhvml' => 'application/xv+xml', - 'xif' => 'image/vnd.xiff', - 'xla' => 'application/vnd.ms-excel', - 'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12', - 'xlc' => 'application/vnd.ms-excel', - 'xlm' => 'application/vnd.ms-excel', - 'xls' => 'application/vnd.ms-excel', - 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12', - 'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12', - 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'xlt' => 'application/vnd.ms-excel', - 'xltm' => 'application/vnd.ms-excel.template.macroenabled.12', - 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', - 'xlw' => 'application/vnd.ms-excel', - 'xml' => 'application/xml', - 'xo' => 'application/vnd.olpc-sugar', - 'xop' => 'application/xop+xml', - 'xpi' => 'application/x-xpinstall', - 'xpm' => 'image/x-xpixmap', - 'xpr' => 'application/vnd.is-xpr', - 'xps' => 'application/vnd.ms-xpsdocument', - 'xpw' => 'application/vnd.intercon.formnet', - 'xpx' => 'application/vnd.intercon.formnet', - 'xsl' => 'application/xml', - 'xslt' => 'application/xslt+xml', - 'xsm' => 'application/vnd.syncml+xml', - 'xspf' => 'application/xspf+xml', - 'xul' => 'application/vnd.mozilla.xul+xml', - 'xvm' => 'application/xv+xml', - 'xvml' => 'application/xv+xml', - 'xwd' => 'image/x-xwindowdump', - 'xyz' => 'chemical/x-xyz', - 'yaml' => 'text/yaml', - 'yang' => 'application/yang', - 'yin' => 'application/yin+xml', - 'yml' => 'text/yaml', - 'zaz' => 'application/vnd.zzazz.deck+xml', - 'zip' => 'application/zip', - 'zir' => 'application/vnd.zul', - 'zirz' => 'application/vnd.zul', - 'zmm' => 'application/vnd.handheld-entertainment+xml' - ]; - - /** - * Get a singleton instance of the class - * - * @return self - * @codeCoverageIgnore - */ - public static function getInstance() - { - if (!self::$instance) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Get a mimetype value from a file extension - * - * @param string $extension File extension - * - * @return string|null - */ - public function fromExtension($extension) - { - $extension = strtolower($extension); - - return isset($this->mimetypes[$extension]) ? $this->mimetypes[$extension] : null; - } - - /** - * Get a mimetype from a filename - * - * @param string $filename Filename to generate a mimetype from - * - * @return string|null - */ - public function fromFilename($filename) - { - return $this->fromExtension(pathinfo($filename, PATHINFO_EXTENSION)); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/Collection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/Collection.php deleted file mode 100755 index cac010ba..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/Collection.php +++ /dev/null @@ -1,242 +0,0 @@ -items = $items; - } - - /** - * Gets the value of a field from the Graph node. - * - * @param string $name The field to retrieve. - * @param mixed $default The default to return if the field doesn't exist. - * - * @return mixed - */ - public function getField($name, $default = null) - { - if (isset($this->items[$name])) { - return $this->items[$name]; - } - - return $default ?: null; - } - - /** - * Gets the value of the named property for this graph object. - * - * @param string $name The property to retrieve. - * @param mixed $default The default to return if the property doesn't exist. - * - * @return mixed - * - * @deprecated 5.0.0 getProperty() has been renamed to getField() - * @todo v6: Remove this method - */ - public function getProperty($name, $default = null) - { - return $this->getField($name, $default); - } - - /** - * Returns a list of all fields set on the object. - * - * @return array - */ - public function getFieldNames() - { - return array_keys($this->items); - } - - /** - * Returns a list of all properties set on the object. - * - * @return array - * - * @deprecated 5.0.0 getPropertyNames() has been renamed to getFieldNames() - * @todo v6: Remove this method - */ - public function getPropertyNames() - { - return $this->getFieldNames(); - } - - /** - * Get all of the items in the collection. - * - * @return array - */ - public function all() - { - return $this->items; - } - - /** - * Get the collection of items as a plain array. - * - * @return array - */ - public function asArray() - { - return array_map(function ($value) { - return $value instanceof Collection ? $value->asArray() : $value; - }, $this->items); - } - - /** - * Run a map over each of the items. - * - * @param \Closure $callback - * - * @return static - */ - public function map(\Closure $callback) - { - return new static(array_map($callback, $this->items, array_keys($this->items))); - } - - /** - * Get the collection of items as JSON. - * - * @param int $options - * - * @return string - */ - public function asJson($options = 0) - { - return json_encode($this->asArray(), $options); - } - - /** - * Count the number of items in the collection. - * - * @return int - */ - public function count() - { - return count($this->items); - } - - /** - * Get an iterator for the items. - * - * @return ArrayIterator - */ - public function getIterator() - { - return new ArrayIterator($this->items); - } - - /** - * Determine if an item exists at an offset. - * - * @param mixed $key - * - * @return bool - */ - public function offsetExists($key) - { - return array_key_exists($key, $this->items); - } - - /** - * Get an item at a given offset. - * - * @param mixed $key - * - * @return mixed - */ - public function offsetGet($key) - { - return $this->items[$key]; - } - - /** - * Set the item at a given offset. - * - * @param mixed $key - * @param mixed $value - * - * @return void - */ - public function offsetSet($key, $value) - { - if (is_null($key)) { - $this->items[] = $value; - } else { - $this->items[$key] = $value; - } - } - - /** - * Unset the item at a given offset. - * - * @param string $key - * - * @return void - */ - public function offsetUnset($key) - { - unset($this->items[$key]); - } - - /** - * Convert the collection to its string representation. - * - * @return string - */ - public function __toString() - { - return $this->asJson(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphAchievement.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphAchievement.php deleted file mode 100755 index 3fba815c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphAchievement.php +++ /dev/null @@ -1,113 +0,0 @@ - '\Facebook\GraphNodes\GraphUser', - 'application' => '\Facebook\GraphNodes\GraphApplication', - ]; - - /** - * Returns the ID for the achievement. - * - * @return string|null - */ - public function getId() - { - return $this->getField('id'); - } - - /** - * Returns the user who achieved this. - * - * @return GraphUser|null - */ - public function getFrom() - { - return $this->getField('from'); - } - - /** - * Returns the time at which this was achieved. - * - * @return \DateTime|null - */ - public function getPublishTime() - { - return $this->getField('publish_time'); - } - - /** - * Returns the app in which the user achieved this. - * - * @return GraphApplication|null - */ - public function getApplication() - { - return $this->getField('application'); - } - - /** - * Returns information about the achievement type this instance is connected with. - * - * @return array|null - */ - public function getData() - { - return $this->getField('data'); - } - - /** - * Returns the type of achievement. - * - * @see https://developers.facebook.com/docs/graph-api/reference/v2.2/achievement - * - * @return string - */ - public function getType() - { - return 'game.achievement'; - } - - /** - * Indicates whether gaining the achievement published a feed story for the user. - * - * @return boolean|null - */ - public function isNoFeedStory() - { - return $this->getField('no_feed_story'); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphAlbum.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphAlbum.php deleted file mode 100755 index 50d1f2c3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphAlbum.php +++ /dev/null @@ -1,183 +0,0 @@ - '\Facebook\GraphNodes\GraphUser', - 'place' => '\Facebook\GraphNodes\GraphPage', - ]; - - /** - * Returns the ID for the album. - * - * @return string|null - */ - public function getId() - { - return $this->getField('id'); - } - - /** - * Returns whether the viewer can upload photos to this album. - * - * @return boolean|null - */ - public function getCanUpload() - { - return $this->getField('can_upload'); - } - - /** - * Returns the number of photos in this album. - * - * @return int|null - */ - public function getCount() - { - return $this->getField('count'); - } - - /** - * Returns the ID of the album's cover photo. - * - * @return string|null - */ - public function getCoverPhoto() - { - return $this->getField('cover_photo'); - } - - /** - * Returns the time the album was initially created. - * - * @return \DateTime|null - */ - public function getCreatedTime() - { - return $this->getField('created_time'); - } - - /** - * Returns the time the album was updated. - * - * @return \DateTime|null - */ - public function getUpdatedTime() - { - return $this->getField('updated_time'); - } - - /** - * Returns the description of the album. - * - * @return string|null - */ - public function getDescription() - { - return $this->getField('description'); - } - - /** - * Returns profile that created the album. - * - * @return GraphUser|null - */ - public function getFrom() - { - return $this->getField('from'); - } - - /** - * Returns profile that created the album. - * - * @return GraphPage|null - */ - public function getPlace() - { - return $this->getField('place'); - } - - /** - * Returns a link to this album on Facebook. - * - * @return string|null - */ - public function getLink() - { - return $this->getField('link'); - } - - /** - * Returns the textual location of the album. - * - * @return string|null - */ - public function getLocation() - { - return $this->getField('location'); - } - - /** - * Returns the title of the album. - * - * @return string|null - */ - public function getName() - { - return $this->getField('name'); - } - - /** - * Returns the privacy settings for the album. - * - * @return string|null - */ - public function getPrivacy() - { - return $this->getField('privacy'); - } - - /** - * Returns the type of the album. - * - * enum{ profile, mobile, wall, normal, album } - * - * @return string|null - */ - public function getType() - { - return $this->getField('type'); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphApplication.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphApplication.php deleted file mode 100755 index 69b09bb5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphApplication.php +++ /dev/null @@ -1,43 +0,0 @@ -getField('id'); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphCoverPhoto.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphCoverPhoto.php deleted file mode 100755 index ee607507..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphCoverPhoto.php +++ /dev/null @@ -1,72 +0,0 @@ -getField('id'); - } - - /** - * Returns the source of cover if it exists - * - * @return string|null - */ - public function getSource() - { - return $this->getField('source'); - } - - /** - * Returns the offset_x of cover if it exists - * - * @return int|null - */ - public function getOffsetX() - { - return $this->getField('offset_x'); - } - - /** - * Returns the offset_y of cover if it exists - * - * @return int|null - */ - public function getOffsetY() - { - return $this->getField('offset_y'); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphEdge.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphEdge.php deleted file mode 100755 index 95f32849..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphEdge.php +++ /dev/null @@ -1,260 +0,0 @@ -request = $request; - $this->metaData = $metaData; - $this->parentEdgeEndpoint = $parentEdgeEndpoint; - $this->subclassName = $subclassName; - - parent::__construct($data); - } - - /** - * Gets the parent Graph edge endpoint that generated the list. - * - * @return string|null - */ - public function getParentGraphEdge() - { - return $this->parentEdgeEndpoint; - } - - /** - * Gets the subclass name that the child GraphNode's are cast as. - * - * @return string|null - */ - public function getSubClassName() - { - return $this->subclassName; - } - - /** - * Returns the raw meta data associated with this GraphEdge. - * - * @return array - */ - public function getMetaData() - { - return $this->metaData; - } - - /** - * Returns the next cursor if it exists. - * - * @return string|null - */ - public function getNextCursor() - { - return $this->getCursor('after'); - } - - /** - * Returns the previous cursor if it exists. - * - * @return string|null - */ - public function getPreviousCursor() - { - return $this->getCursor('before'); - } - - /** - * Returns the cursor for a specific direction if it exists. - * - * @param string $direction The direction of the page: after|before - * - * @return string|null - */ - public function getCursor($direction) - { - if (isset($this->metaData['paging']['cursors'][$direction])) { - return $this->metaData['paging']['cursors'][$direction]; - } - - return null; - } - - /** - * Generates a pagination URL based on a cursor. - * - * @param string $direction The direction of the page: next|previous - * - * @return string|null - * - * @throws FacebookSDKException - */ - public function getPaginationUrl($direction) - { - $this->validateForPagination(); - - // Do we have a paging URL? - if (isset($this->metaData['paging'][$direction])) { - // Graph returns the full URL with all the original params. - // We just want the endpoint though. - $pageUrl = $this->metaData['paging'][$direction]; - - return FacebookUrlManipulator::baseGraphUrlEndpoint($pageUrl); - } - - // Do we have a cursor to work with? - $cursorDirection = $direction === 'next' ? 'after' : 'before'; - $cursor = $this->getCursor($cursorDirection); - if (!$cursor) { - return null; - } - - // If we don't know the ID of the parent node, this ain't gonna work. - if (!$this->parentEdgeEndpoint) { - return null; - } - - // We have the parent node ID, paging cursor & original request. - // These were the ingredients chosen to create the perfect little URL. - $pageUrl = $this->parentEdgeEndpoint . '?' . $cursorDirection . '=' . urlencode($cursor); - - // Pull in the original params - $originalUrl = $this->request->getUrl(); - $pageUrl = FacebookUrlManipulator::mergeUrlParams($originalUrl, $pageUrl); - - return FacebookUrlManipulator::forceSlashPrefix($pageUrl); - } - - /** - * Validates whether or not we can paginate on this request. - * - * @throws FacebookSDKException - */ - public function validateForPagination() - { - if ($this->request->getMethod() !== 'GET') { - throw new FacebookSDKException('You can only paginate on a GET request.', 720); - } - } - - /** - * Gets the request object needed to make a next|previous page request. - * - * @param string $direction The direction of the page: next|previous - * - * @return FacebookRequest|null - * - * @throws FacebookSDKException - */ - public function getPaginationRequest($direction) - { - $pageUrl = $this->getPaginationUrl($direction); - if (!$pageUrl) { - return null; - } - - $newRequest = clone $this->request; - $newRequest->setEndpoint($pageUrl); - - return $newRequest; - } - - /** - * Gets the request object needed to make a "next" page request. - * - * @return FacebookRequest|null - * - * @throws FacebookSDKException - */ - public function getNextPageRequest() - { - return $this->getPaginationRequest('next'); - } - - /** - * Gets the request object needed to make a "previous" page request. - * - * @return FacebookRequest|null - * - * @throws FacebookSDKException - */ - public function getPreviousPageRequest() - { - return $this->getPaginationRequest('previous'); - } - - /** - * The total number of results according to Graph if it exists. - * - * This will be returned if the summary=true modifier is present in the request. - * - * @return int|null - */ - public function getTotalCount() - { - if (isset($this->metaData['summary']['total_count'])) { - return $this->metaData['summary']['total_count']; - } - - return null; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphEvent.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphEvent.php deleted file mode 100755 index 19ff2fb4..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphEvent.php +++ /dev/null @@ -1,242 +0,0 @@ - '\Facebook\GraphNodes\GraphCoverPhoto', - 'place' => '\Facebook\GraphNodes\GraphPage', - 'picture' => '\Facebook\GraphNodes\GraphPicture', - 'parent_group' => '\Facebook\GraphNodes\GraphGroup', - ]; - - /** - * Returns the `id` (The event ID) as string if present. - * - * @return string|null - */ - public function getId() - { - return $this->getField('id'); - } - - /** - * Returns the `cover` (Cover picture) as GraphCoverPhoto if present. - * - * @return GraphCoverPhoto|null - */ - public function getCover() - { - return $this->getField('cover'); - } - - /** - * Returns the `description` (Long-form description) as string if present. - * - * @return string|null - */ - public function getDescription() - { - return $this->getField('description'); - } - - /** - * Returns the `end_time` (End time, if one has been set) as DateTime if present. - * - * @return \DateTime|null - */ - public function getEndTime() - { - return $this->getField('end_time'); - } - - /** - * Returns the `is_date_only` (Whether the event only has a date specified, but no time) as bool if present. - * - * @return bool|null - */ - public function getIsDateOnly() - { - return $this->getField('is_date_only'); - } - - /** - * Returns the `name` (Event name) as string if present. - * - * @return string|null - */ - public function getName() - { - return $this->getField('name'); - } - - /** - * Returns the `owner` (The profile that created the event) as GraphNode if present. - * - * @return GraphNode|null - */ - public function getOwner() - { - return $this->getField('owner'); - } - - /** - * Returns the `parent_group` (The group the event belongs to) as GraphGroup if present. - * - * @return GraphGroup|null - */ - public function getParentGroup() - { - return $this->getField('parent_group'); - } - - /** - * Returns the `place` (Event Place information) as GraphPage if present. - * - * @return GraphPage|null - */ - public function getPlace() - { - return $this->getField('place'); - } - - /** - * Returns the `privacy` (Who can see the event) as string if present. - * - * @return string|null - */ - public function getPrivacy() - { - return $this->getField('privacy'); - } - - /** - * Returns the `start_time` (Start time) as DateTime if present. - * - * @return \DateTime|null - */ - public function getStartTime() - { - return $this->getField('start_time'); - } - - /** - * Returns the `ticket_uri` (The link users can visit to buy a ticket to this event) as string if present. - * - * @return string|null - */ - public function getTicketUri() - { - return $this->getField('ticket_uri'); - } - - /** - * Returns the `timezone` (Timezone) as string if present. - * - * @return string|null - */ - public function getTimezone() - { - return $this->getField('timezone'); - } - - /** - * Returns the `updated_time` (Last update time) as DateTime if present. - * - * @return \DateTime|null - */ - public function getUpdatedTime() - { - return $this->getField('updated_time'); - } - - /** - * Returns the `picture` (Event picture) as GraphPicture if present. - * - * @return GraphPicture|null - */ - public function getPicture() - { - return $this->getField('picture'); - } - - /** - * Returns the `attending_count` (Number of people attending the event) as int if present. - * - * @return int|null - */ - public function getAttendingCount() - { - return $this->getField('attending_count'); - } - - /** - * Returns the `declined_count` (Number of people who declined the event) as int if present. - * - * @return int|null - */ - public function getDeclinedCount() - { - return $this->getField('declined_count'); - } - - /** - * Returns the `maybe_count` (Number of people who maybe going to the event) as int if present. - * - * @return int|null - */ - public function getMaybeCount() - { - return $this->getField('maybe_count'); - } - - /** - * Returns the `noreply_count` (Number of people who did not reply to the event) as int if present. - * - * @return int|null - */ - public function getNoreplyCount() - { - return $this->getField('noreply_count'); - } - - /** - * Returns the `invited_count` (Number of people invited to the event) as int if present. - * - * @return int|null - */ - public function getInvitedCount() - { - return $this->getField('invited_count'); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphGroup.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphGroup.php deleted file mode 100755 index 07a4dbd7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphGroup.php +++ /dev/null @@ -1,171 +0,0 @@ - '\Facebook\GraphNodes\GraphCoverPhoto', - 'venue' => '\Facebook\GraphNodes\GraphLocation', - ]; - - /** - * Returns the `id` (The Group ID) as string if present. - * - * @return string|null - */ - public function getId() - { - return $this->getField('id'); - } - - /** - * Returns the `cover` (The cover photo of the Group) as GraphCoverPhoto if present. - * - * @return GraphCoverPhoto|null - */ - public function getCover() - { - return $this->getField('cover'); - } - - /** - * Returns the `description` (A brief description of the Group) as string if present. - * - * @return string|null - */ - public function getDescription() - { - return $this->getField('description'); - } - - /** - * Returns the `email` (The email address to upload content to the Group. Only current members of the Group can use this) as string if present. - * - * @return string|null - */ - public function getEmail() - { - return $this->getField('email'); - } - - /** - * Returns the `icon` (The URL for the Group's icon) as string if present. - * - * @return string|null - */ - public function getIcon() - { - return $this->getField('icon'); - } - - /** - * Returns the `link` (The Group's website) as string if present. - * - * @return string|null - */ - public function getLink() - { - return $this->getField('link'); - } - - /** - * Returns the `name` (The name of the Group) as string if present. - * - * @return string|null - */ - public function getName() - { - return $this->getField('name'); - } - - /** - * Returns the `member_request_count` (Number of people asking to join the group.) as int if present. - * - * @return int|null - */ - public function getMemberRequestCount() - { - return $this->getField('member_request_count'); - } - - /** - * Returns the `owner` (The profile that created this Group) as GraphNode if present. - * - * @return GraphNode|null - */ - public function getOwner() - { - return $this->getField('owner'); - } - - /** - * Returns the `parent` (The parent Group of this Group, if it exists) as GraphNode if present. - * - * @return GraphNode|null - */ - public function getParent() - { - return $this->getField('parent'); - } - - /** - * Returns the `privacy` (The privacy setting of the Group) as string if present. - * - * @return string|null - */ - public function getPrivacy() - { - return $this->getField('privacy'); - } - - /** - * Returns the `updated_time` (The last time the Group was updated (this includes changes in the Group's properties and changes in posts and comments if user can see them)) as \DateTime if present. - * - * @return \DateTime|null - */ - public function getUpdatedTime() - { - return $this->getField('updated_time'); - } - - /** - * Returns the `venue` (The location for the Group) as GraphLocation if present. - * - * @return GraphLocation|null - */ - public function getVenue() - { - return $this->getField('venue'); - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphList.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphList.php deleted file mode 100755 index a60a07a7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphList.php +++ /dev/null @@ -1,36 +0,0 @@ -getField('street'); - } - - /** - * Returns the city component of the location - * - * @return string|null - */ - public function getCity() - { - return $this->getField('city'); - } - - /** - * Returns the state component of the location - * - * @return string|null - */ - public function getState() - { - return $this->getField('state'); - } - - /** - * Returns the country component of the location - * - * @return string|null - */ - public function getCountry() - { - return $this->getField('country'); - } - - /** - * Returns the zipcode component of the location - * - * @return string|null - */ - public function getZip() - { - return $this->getField('zip'); - } - - /** - * Returns the latitude component of the location - * - * @return float|null - */ - public function getLatitude() - { - return $this->getField('latitude'); - } - - /** - * Returns the street component of the location - * - * @return float|null - */ - public function getLongitude() - { - return $this->getField('longitude'); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphNode.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphNode.php deleted file mode 100755 index 0d2f504c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphNode.php +++ /dev/null @@ -1,185 +0,0 @@ -castItems($data)); - } - - /** - * Iterates over an array and detects the types each node - * should be cast to and returns all the items as an array. - * - * @TODO Add auto-casting to AccessToken entities. - * - * @param array $data The array to iterate over. - * - * @return array - */ - public function castItems(array $data) - { - $items = []; - - foreach ($data as $k => $v) { - if ($this->shouldCastAsDateTime($k) - && (is_numeric($v) - || $k === 'birthday' - || $this->isIso8601DateString($v)) - ) { - $items[$k] = $this->castToDateTime($v); - } else { - $items[$k] = $v; - } - } - - return $items; - } - - /** - * Uncasts any auto-casted datatypes. - * Basically the reverse of castItems(). - * - * @return array - */ - public function uncastItems() - { - $items = $this->asArray(); - - return array_map(function ($v) { - if ($v instanceof \DateTime) { - return $v->format(\DateTime::ISO8601); - } - - return $v; - }, $items); - } - - /** - * Get the collection of items as JSON. - * - * @param int $options - * - * @return string - */ - public function asJson($options = 0) - { - return json_encode($this->uncastItems(), $options); - } - - /** - * Detects an ISO 8601 formatted string. - * - * @param string $string - * - * @return boolean - * - * @see https://developers.facebook.com/docs/graph-api/using-graph-api/#readmodifiers - * @see http://www.cl.cam.ac.uk/~mgk25/iso-time.html - * @see http://en.wikipedia.org/wiki/ISO_8601 - */ - public function isIso8601DateString($string) - { - // This insane regex was yoinked from here: - // http://www.pelagodesign.com/blog/2009/05/20/iso-8601-date-validation-that-doesnt-suck/ - // ...and I'm all like: - // http://thecodinglove.com/post/95378251969/when-code-works-and-i-dont-know-why - $crazyInsaneRegexThatSomehowDetectsIso8601 = '/^([\+-]?\d{4}(?!\d{2}\b))' - . '((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?' - . '|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d' - . '|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])' - . '((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d' - . '([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/'; - - return preg_match($crazyInsaneRegexThatSomehowDetectsIso8601, $string) === 1; - } - - /** - * Determines if a value from Graph should be cast to DateTime. - * - * @param string $key - * - * @return boolean - */ - public function shouldCastAsDateTime($key) - { - return in_array($key, [ - 'created_time', - 'updated_time', - 'start_time', - 'end_time', - 'backdated_time', - 'issued_at', - 'expires_at', - 'birthday', - 'publish_time' - ], true); - } - - /** - * Casts a date value from Graph to DateTime. - * - * @param int|string $value - * - * @return \DateTime - */ - public function castToDateTime($value) - { - if (is_int($value)) { - $dt = new \DateTime(); - $dt->setTimestamp($value); - } else { - $dt = new \DateTime($value); - } - - return $dt; - } - - /** - * Getter for $graphObjectMap. - * - * @return array - */ - public static function getObjectMap() - { - return static::$graphObjectMap; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphNodeFactory.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphNodeFactory.php deleted file mode 100755 index e1bedd91..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphNodeFactory.php +++ /dev/null @@ -1,392 +0,0 @@ -response = $response; - $this->decodedBody = $response->getDecodedBody(); - } - - /** - * Tries to convert a FacebookResponse entity into a GraphNode. - * - * @param string|null $subclassName The GraphNode sub class to cast to. - * - * @return GraphNode - * - * @throws FacebookSDKException - */ - public function makeGraphNode($subclassName = null) - { - $this->validateResponseAsArray(); - $this->validateResponseCastableAsGraphNode(); - - return $this->castAsGraphNodeOrGraphEdge($this->decodedBody, $subclassName); - } - - /** - * Convenience method for creating a GraphAchievement collection. - * - * @return GraphAchievement - * - * @throws FacebookSDKException - */ - public function makeGraphAchievement() - { - return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphAchievement'); - } - - /** - * Convenience method for creating a GraphAlbum collection. - * - * @return GraphAlbum - * - * @throws FacebookSDKException - */ - public function makeGraphAlbum() - { - return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphAlbum'); - } - - /** - * Convenience method for creating a GraphPage collection. - * - * @return GraphPage - * - * @throws FacebookSDKException - */ - public function makeGraphPage() - { - return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphPage'); - } - - /** - * Convenience method for creating a GraphSessionInfo collection. - * - * @return GraphSessionInfo - * - * @throws FacebookSDKException - */ - public function makeGraphSessionInfo() - { - return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphSessionInfo'); - } - - /** - * Convenience method for creating a GraphUser collection. - * - * @return GraphUser - * - * @throws FacebookSDKException - */ - public function makeGraphUser() - { - return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphUser'); - } - - /** - * Convenience method for creating a GraphEvent collection. - * - * @return GraphEvent - * - * @throws FacebookSDKException - */ - public function makeGraphEvent() - { - return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphEvent'); - } - - /** - * Convenience method for creating a GraphGroup collection. - * - * @return GraphGroup - * - * @throws FacebookSDKException - */ - public function makeGraphGroup() - { - return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphGroup'); - } - - /** - * Tries to convert a FacebookResponse entity into a GraphEdge. - * - * @param string|null $subclassName The GraphNode sub class to cast the list items to. - * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. - * - * @return GraphEdge - * - * @throws FacebookSDKException - */ - public function makeGraphEdge($subclassName = null, $auto_prefix = true) - { - $this->validateResponseAsArray(); - $this->validateResponseCastableAsGraphEdge(); - - if ($subclassName && $auto_prefix) { - $subclassName = static::BASE_GRAPH_OBJECT_PREFIX . $subclassName; - } - - return $this->castAsGraphNodeOrGraphEdge($this->decodedBody, $subclassName); - } - - /** - * Validates the decoded body. - * - * @throws FacebookSDKException - */ - public function validateResponseAsArray() - { - if (!is_array($this->decodedBody)) { - throw new FacebookSDKException('Unable to get response from Graph as array.', 620); - } - } - - /** - * Validates that the return data can be cast as a GraphNode. - * - * @throws FacebookSDKException - */ - public function validateResponseCastableAsGraphNode() - { - if (isset($this->decodedBody['data']) && static::isCastableAsGraphEdge($this->decodedBody['data'])) { - throw new FacebookSDKException( - 'Unable to convert response from Graph to a GraphNode because the response looks like a GraphEdge. Try using GraphNodeFactory::makeGraphEdge() instead.', - 620 - ); - } - } - - /** - * Validates that the return data can be cast as a GraphEdge. - * - * @throws FacebookSDKException - */ - public function validateResponseCastableAsGraphEdge() - { - if (!(isset($this->decodedBody['data']) && static::isCastableAsGraphEdge($this->decodedBody['data']))) { - throw new FacebookSDKException( - 'Unable to convert response from Graph to a GraphEdge because the response does not look like a GraphEdge. Try using GraphNodeFactory::makeGraphNode() instead.', - 620 - ); - } - } - - /** - * Safely instantiates a GraphNode of $subclassName. - * - * @param array $data The array of data to iterate over. - * @param string|null $subclassName The subclass to cast this collection to. - * - * @return GraphNode - * - * @throws FacebookSDKException - */ - public function safelyMakeGraphNode(array $data, $subclassName = null) - { - $subclassName = $subclassName ?: static::BASE_GRAPH_NODE_CLASS; - static::validateSubclass($subclassName); - - // Remember the parent node ID - $parentNodeId = isset($data['id']) ? $data['id'] : null; - - $items = []; - - foreach ($data as $k => $v) { - // Array means could be recurable - if (is_array($v)) { - // Detect any smart-casting from the $graphObjectMap array. - // This is always empty on the GraphNode collection, but subclasses can define - // their own array of smart-casting types. - $graphObjectMap = $subclassName::getObjectMap(); - $objectSubClass = isset($graphObjectMap[$k]) - ? $graphObjectMap[$k] - : null; - - // Could be a GraphEdge or GraphNode - $items[$k] = $this->castAsGraphNodeOrGraphEdge($v, $objectSubClass, $k, $parentNodeId); - } else { - $items[$k] = $v; - } - } - - return new $subclassName($items); - } - - /** - * Takes an array of values and determines how to cast each node. - * - * @param array $data The array of data to iterate over. - * @param string|null $subclassName The subclass to cast this collection to. - * @param string|null $parentKey The key of this data (Graph edge). - * @param string|null $parentNodeId The parent Graph node ID. - * - * @return GraphNode|GraphEdge - * - * @throws FacebookSDKException - */ - public function castAsGraphNodeOrGraphEdge(array $data, $subclassName = null, $parentKey = null, $parentNodeId = null) - { - if (isset($data['data'])) { - // Create GraphEdge - if (static::isCastableAsGraphEdge($data['data'])) { - return $this->safelyMakeGraphEdge($data, $subclassName, $parentKey, $parentNodeId); - } - // Sometimes Graph is a weirdo and returns a GraphNode under the "data" key - $data = $data['data']; - } - - // Create GraphNode - return $this->safelyMakeGraphNode($data, $subclassName); - } - - /** - * Return an array of GraphNode's. - * - * @param array $data The array of data to iterate over. - * @param string|null $subclassName The GraphNode subclass to cast each item in the list to. - * @param string|null $parentKey The key of this data (Graph edge). - * @param string|null $parentNodeId The parent Graph node ID. - * - * @return GraphEdge - * - * @throws FacebookSDKException - */ - public function safelyMakeGraphEdge(array $data, $subclassName = null, $parentKey = null, $parentNodeId = null) - { - if (!isset($data['data'])) { - throw new FacebookSDKException('Cannot cast data to GraphEdge. Expected a "data" key.', 620); - } - - $dataList = []; - foreach ($data['data'] as $graphNode) { - $dataList[] = $this->safelyMakeGraphNode($graphNode, $subclassName, $parentKey, $parentNodeId); - } - - $metaData = $this->getMetaData($data); - - // We'll need to make an edge endpoint for this in case it's a GraphEdge (for cursor pagination) - $parentGraphEdgeEndpoint = $parentNodeId && $parentKey ? '/' . $parentNodeId . '/' . $parentKey : null; - $className = static::BASE_GRAPH_EDGE_CLASS; - - return new $className($this->response->getRequest(), $dataList, $metaData, $parentGraphEdgeEndpoint, $subclassName); - } - - /** - * Get the meta data from a list in a Graph response. - * - * @param array $data The Graph response. - * - * @return array - */ - public function getMetaData(array $data) - { - unset($data['data']); - - return $data; - } - - /** - * Determines whether or not the data should be cast as a GraphEdge. - * - * @param array $data - * - * @return boolean - */ - public static function isCastableAsGraphEdge(array $data) - { - if ($data === []) { - return true; - } - - // Checks for a sequential numeric array which would be a GraphEdge - return array_keys($data) === range(0, count($data) - 1); - } - - /** - * Ensures that the subclass in question is valid. - * - * @param string $subclassName The GraphNode subclass to validate. - * - * @throws FacebookSDKException - */ - public static function validateSubclass($subclassName) - { - if ($subclassName == static::BASE_GRAPH_NODE_CLASS || is_subclass_of($subclassName, static::BASE_GRAPH_NODE_CLASS)) { - return; - } - - throw new FacebookSDKException('The given subclass "' . $subclassName . '" is not valid. Cannot cast to an object that is not a GraphNode subclass.', 620); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphObject.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphObject.php deleted file mode 100755 index bb8f8e40..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphObject.php +++ /dev/null @@ -1,36 +0,0 @@ -makeGraphNode($subclassName); - } - - /** - * Convenience method for creating a GraphEvent collection. - * - * @return GraphEvent - * - * @throws FacebookSDKException - */ - public function makeGraphEvent() - { - return $this->makeGraphObject(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphEvent'); - } - - /** - * Tries to convert a FacebookResponse entity into a GraphEdge. - * - * @param string|null $subclassName The GraphNode sub class to cast the list items to. - * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. - * - * @return GraphEdge - * - * @deprecated 5.0.0 GraphObjectFactory has been renamed to GraphNodeFactory - */ - public function makeGraphList($subclassName = null, $auto_prefix = true) - { - return $this->makeGraphEdge($subclassName, $auto_prefix); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphPage.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphPage.php deleted file mode 100755 index ab8e31a6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphPage.php +++ /dev/null @@ -1,125 +0,0 @@ - '\Facebook\GraphNodes\GraphPage', - 'global_brand_parent_page' => '\Facebook\GraphNodes\GraphPage', - 'location' => '\Facebook\GraphNodes\GraphLocation', - ]; - - /** - * Returns the ID for the user's page as a string if present. - * - * @return string|null - */ - public function getId() - { - return $this->getField('id'); - } - - /** - * Returns the Category for the user's page as a string if present. - * - * @return string|null - */ - public function getCategory() - { - return $this->getField('category'); - } - - /** - * Returns the Name of the user's page as a string if present. - * - * @return string|null - */ - public function getName() - { - return $this->getField('name'); - } - - /** - * Returns the best available Page on Facebook. - * - * @return GraphPage|null - */ - public function getBestPage() - { - return $this->getField('best_page'); - } - - /** - * Returns the brand's global (parent) Page. - * - * @return GraphPage|null - */ - public function getGlobalBrandParentPage() - { - return $this->getField('global_brand_parent_page'); - } - - /** - * Returns the location of this place. - * - * @return GraphLocation|null - */ - public function getLocation() - { - return $this->getField('location'); - } - - /** - * Returns the page access token for the admin user. - * - * Only available in the `/me/accounts` context. - * - * @return string|null - */ - public function getAccessToken() - { - return $this->getField('access_token'); - } - - /** - * Returns the roles of the page admin user. - * - * Only available in the `/me/accounts` context. - * - * @return array|null - */ - public function getPerms() - { - return $this->getField('perms'); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphPicture.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphPicture.php deleted file mode 100755 index bfd37fab..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphPicture.php +++ /dev/null @@ -1,72 +0,0 @@ -getField('is_silhouette'); - } - - /** - * Returns the url of user picture if it exists - * - * @return string|null - */ - public function getUrl() - { - return $this->getField('url'); - } - - /** - * Returns the width of user picture if it exists - * - * @return int|null - */ - public function getWidth() - { - return $this->getField('width'); - } - - /** - * Returns the height of user picture if it exists - * - * @return int|null - */ - public function getHeight() - { - return $this->getField('height'); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphSessionInfo.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphSessionInfo.php deleted file mode 100755 index 3c9e2ff4..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphSessionInfo.php +++ /dev/null @@ -1,102 +0,0 @@ -getField('app_id'); - } - - /** - * Returns the application name the token was issued for. - * - * @return string|null - */ - public function getApplication() - { - return $this->getField('application'); - } - - /** - * Returns the date & time that the token expires. - * - * @return \DateTime|null - */ - public function getExpiresAt() - { - return $this->getField('expires_at'); - } - - /** - * Returns whether the token is valid. - * - * @return boolean - */ - public function getIsValid() - { - return $this->getField('is_valid'); - } - - /** - * Returns the date & time the token was issued at. - * - * @return \DateTime|null - */ - public function getIssuedAt() - { - return $this->getField('issued_at'); - } - - /** - * Returns the scope permissions associated with the token. - * - * @return array - */ - public function getScopes() - { - return $this->getField('scopes'); - } - - /** - * Returns the login id of the user associated with the token. - * - * @return string|null - */ - public function getUserId() - { - return $this->getField('user_id'); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphUser.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphUser.php deleted file mode 100755 index cb9ddbb5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/GraphNodes/GraphUser.php +++ /dev/null @@ -1,162 +0,0 @@ - '\Facebook\GraphNodes\GraphPage', - 'location' => '\Facebook\GraphNodes\GraphPage', - 'significant_other' => '\Facebook\GraphNodes\GraphUser', - 'picture' => '\Facebook\GraphNodes\GraphPicture', - ]; - - /** - * Returns the ID for the user as a string if present. - * - * @return string|null - */ - public function getId() - { - return $this->getField('id'); - } - - /** - * Returns the name for the user as a string if present. - * - * @return string|null - */ - public function getName() - { - return $this->getField('name'); - } - - /** - * Returns the first name for the user as a string if present. - * - * @return string|null - */ - public function getFirstName() - { - return $this->getField('first_name'); - } - - /** - * Returns the middle name for the user as a string if present. - * - * @return string|null - */ - public function getMiddleName() - { - return $this->getField('middle_name'); - } - - /** - * Returns the last name for the user as a string if present. - * - * @return string|null - */ - public function getLastName() - { - return $this->getField('last_name'); - } - - /** - * Returns the gender for the user as a string if present. - * - * @return string|null - */ - public function getGender() - { - return $this->getField('gender'); - } - - /** - * Returns the Facebook URL for the user as a string if available. - * - * @return string|null - */ - public function getLink() - { - return $this->getField('link'); - } - - /** - * Returns the users birthday, if available. - * - * @return \DateTime|null - */ - public function getBirthday() - { - return $this->getField('birthday'); - } - - /** - * Returns the current location of the user as a GraphPage. - * - * @return GraphPage|null - */ - public function getLocation() - { - return $this->getField('location'); - } - - /** - * Returns the current location of the user as a GraphPage. - * - * @return GraphPage|null - */ - public function getHometown() - { - return $this->getField('hometown'); - } - - /** - * Returns the current location of the user as a GraphUser. - * - * @return GraphUser|null - */ - public function getSignificantOther() - { - return $this->getField('significant_other'); - } - - /** - * Returns the picture of the user as a GraphPicture - * - * @return GraphPicture|null - */ - public function getPicture() - { - return $this->getField('picture'); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookCanvasHelper.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookCanvasHelper.php deleted file mode 100755 index 8068526a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookCanvasHelper.php +++ /dev/null @@ -1,52 +0,0 @@ -signedRequest ? $this->signedRequest->get('app_data') : null; - } - - /** - * Get raw signed request from POST. - * - * @return string|null - */ - public function getRawSignedRequest() - { - return $this->getRawSignedRequestFromPost() ?: null; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookJavaScriptHelper.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookJavaScriptHelper.php deleted file mode 100755 index 5d406b53..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookJavaScriptHelper.php +++ /dev/null @@ -1,42 +0,0 @@ -getRawSignedRequestFromCookie(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookPageTabHelper.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookPageTabHelper.php deleted file mode 100755 index ee43f5e8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookPageTabHelper.php +++ /dev/null @@ -1,95 +0,0 @@ -signedRequest) { - return; - } - - $this->pageData = $this->signedRequest->get('page'); - } - - /** - * Returns a value from the page data. - * - * @param string $key - * @param mixed|null $default - * - * @return mixed|null - */ - public function getPageData($key, $default = null) - { - if (isset($this->pageData[$key])) { - return $this->pageData[$key]; - } - - return $default; - } - - /** - * Returns true if the user is an admin. - * - * @return boolean - */ - public function isAdmin() - { - return $this->getPageData('admin') === true; - } - - /** - * Returns the page id if available. - * - * @return string|null - */ - public function getPageId() - { - return $this->getPageData('id'); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookRedirectLoginHelper.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookRedirectLoginHelper.php deleted file mode 100755 index 144a5b45..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookRedirectLoginHelper.php +++ /dev/null @@ -1,360 +0,0 @@ -oAuth2Client = $oAuth2Client; - $this->persistentDataHandler = $persistentDataHandler ?: new FacebookSessionPersistentDataHandler(); - $this->urlDetectionHandler = $urlHandler ?: new FacebookUrlDetectionHandler(); - $this->pseudoRandomStringGenerator = $prsg ?: $this->detectPseudoRandomStringGenerator(); - } - - /** - * Returns the persistent data handler. - * - * @return PersistentDataInterface - */ - public function getPersistentDataHandler() - { - return $this->persistentDataHandler; - } - - /** - * Returns the URL detection handler. - * - * @return UrlDetectionInterface - */ - public function getUrlDetectionHandler() - { - return $this->urlDetectionHandler; - } - - /** - * Returns the cryptographically secure pseudo-random string generator. - * - * @return PseudoRandomStringGeneratorInterface - */ - public function getPseudoRandomStringGenerator() - { - return $this->pseudoRandomStringGenerator; - } - - /** - * Detects which pseudo-random string generator to use. - * - * @return PseudoRandomStringGeneratorInterface - * - * @throws FacebookSDKException - */ - public function detectPseudoRandomStringGenerator() - { - // Since openssl_random_pseudo_bytes() can sometimes return non-cryptographically - // secure pseudo-random strings (in rare cases), we check for mcrypt_create_iv() first. - if (function_exists('mcrypt_create_iv')) { - return new McryptPseudoRandomStringGenerator(); - } - - if (function_exists('openssl_random_pseudo_bytes')) { - return new OpenSslPseudoRandomStringGenerator(); - } - - if (!ini_get('open_basedir') && is_readable('/dev/urandom')) { - return new UrandomPseudoRandomStringGenerator(); - } - - throw new FacebookSDKException('Unable to detect a cryptographically secure pseudo-random string generator.'); - } - - /** - * Stores CSRF state and returns a URL to which the user should be sent to in order to continue the login process with Facebook. - * - * @param string $redirectUrl The URL Facebook should redirect users to after login. - * @param array $scope List of permissions to request during login. - * @param array $params An array of parameters to generate URL. - * @param string $separator The separator to use in http_build_query(). - * - * @return string - */ - private function makeUrl($redirectUrl, array $scope, array $params = [], $separator = '&') - { - $state = $this->pseudoRandomStringGenerator->getPseudoRandomString(static::CSRF_LENGTH); - $this->persistentDataHandler->set('state', $state); - - return $this->oAuth2Client->getAuthorizationUrl($redirectUrl, $state, $scope, $params, $separator); - } - - /** - * Returns the URL to send the user in order to login to Facebook. - * - * @param string $redirectUrl The URL Facebook should redirect users to after login. - * @param array $scope List of permissions to request during login. - * @param string $separator The separator to use in http_build_query(). - * - * @return string - */ - public function getLoginUrl($redirectUrl, array $scope = [], $separator = '&') - { - return $this->makeUrl($redirectUrl, $scope, [], $separator); - } - - /** - * Returns the URL to send the user in order to log out of Facebook. - * - * @param AccessToken|string $accessToken The access token that will be logged out. - * @param string $next The url Facebook should redirect the user to after a successful logout. - * @param string $separator The separator to use in http_build_query(). - * - * @return string - * - * @throws FacebookSDKException - */ - public function getLogoutUrl($accessToken, $next, $separator = '&') - { - if (!$accessToken instanceof AccessToken) { - $accessToken = new AccessToken($accessToken); - } - - if ($accessToken->isAppAccessToken()) { - throw new FacebookSDKException('Cannot generate a logout URL with an app access token.', 722); - } - - $params = [ - 'next' => $next, - 'access_token' => $accessToken->getValue(), - ]; - - return 'https://www.facebook.com/logout.php?' . http_build_query($params, null, $separator); - } - - /** - * Returns the URL to send the user in order to login to Facebook with permission(s) to be re-asked. - * - * @param string $redirectUrl The URL Facebook should redirect users to after login. - * @param array $scope List of permissions to request during login. - * @param string $separator The separator to use in http_build_query(). - * - * @return string - */ - public function getReRequestUrl($redirectUrl, array $scope = [], $separator = '&') - { - $params = ['auth_type' => 'rerequest']; - - return $this->makeUrl($redirectUrl, $scope, $params, $separator); - } - - /** - * Returns the URL to send the user in order to login to Facebook with user to be re-authenticated. - * - * @param string $redirectUrl The URL Facebook should redirect users to after login. - * @param array $scope List of permissions to request during login. - * @param string $separator The separator to use in http_build_query(). - * - * @return string - */ - public function getReAuthenticationUrl($redirectUrl, array $scope = [], $separator = '&') - { - $params = ['auth_type' => 'reauthenticate']; - - return $this->makeUrl($redirectUrl, $scope, $params, $separator); - } - - /** - * Takes a valid code from a login redirect, and returns an AccessToken entity. - * - * @param string|null $redirectUrl The redirect URL. - * - * @return AccessToken|null - * - * @throws FacebookSDKException - */ - public function getAccessToken($redirectUrl = null) - { - if (!$code = $this->getCode()) { - return null; - } - - $this->validateCsrf(); - - $redirectUrl = $redirectUrl ?: $this->urlDetectionHandler->getCurrentUrl(); - // At minimum we need to remove the state param - $redirectUrl = FacebookUrlManipulator::removeParamsFromUrl($redirectUrl, ['state']); - - return $this->oAuth2Client->getAccessTokenFromCode($code, $redirectUrl); - } - - /** - * Validate the request against a cross-site request forgery. - * - * @throws FacebookSDKException - */ - protected function validateCsrf() - { - $state = $this->getState(); - $savedState = $this->persistentDataHandler->get('state'); - - if (!$state || !$savedState) { - throw new FacebookSDKException('Cross-site request forgery validation failed. Required param "state" missing.'); - } - - $savedLen = strlen($savedState); - $givenLen = strlen($state); - - if ($savedLen !== $givenLen) { - throw new FacebookSDKException('Cross-site request forgery validation failed. The "state" param from the URL and session do not match.'); - } - - $result = 0; - for ($i = 0; $i < $savedLen; $i++) { - $result |= ord($state[$i]) ^ ord($savedState[$i]); - } - - if ($result !== 0) { - throw new FacebookSDKException('Cross-site request forgery validation failed. The "state" param from the URL and session do not match.'); - } - } - - /** - * Return the code. - * - * @return string|null - */ - protected function getCode() - { - return $this->getInput('code'); - } - - /** - * Return the state. - * - * @return string|null - */ - protected function getState() - { - return $this->getInput('state'); - } - - /** - * Return the error code. - * - * @return string|null - */ - public function getErrorCode() - { - return $this->getInput('error_code'); - } - - /** - * Returns the error. - * - * @return string|null - */ - public function getError() - { - return $this->getInput('error'); - } - - /** - * Returns the error reason. - * - * @return string|null - */ - public function getErrorReason() - { - return $this->getInput('error_reason'); - } - - /** - * Returns the error description. - * - * @return string|null - */ - public function getErrorDescription() - { - return $this->getInput('error_description'); - } - - /** - * Returns a value from a GET param. - * - * @param string $key - * - * @return string|null - */ - private function getInput($key) - { - return isset($_GET[$key]) ? $_GET[$key] : null; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookSignedRequestFromInputHelper.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookSignedRequestFromInputHelper.php deleted file mode 100755 index aafa2464..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Helpers/FacebookSignedRequestFromInputHelper.php +++ /dev/null @@ -1,166 +0,0 @@ -app = $app; - $graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION; - $this->oAuth2Client = new OAuth2Client($this->app, $client, $graphVersion); - - $this->instantiateSignedRequest(); - } - - /** - * Instantiates a new SignedRequest entity. - * - * @param string|null - */ - public function instantiateSignedRequest($rawSignedRequest = null) - { - $rawSignedRequest = $rawSignedRequest ?: $this->getRawSignedRequest(); - - if (!$rawSignedRequest) { - return; - } - - $this->signedRequest = new SignedRequest($this->app, $rawSignedRequest); - } - - /** - * Returns an AccessToken entity from the signed request. - * - * @return AccessToken|null - * - * @throws \Facebook\Exceptions\FacebookSDKException - */ - public function getAccessToken() - { - if ($this->signedRequest && $this->signedRequest->hasOAuthData()) { - $code = $this->signedRequest->get('code'); - $accessToken = $this->signedRequest->get('oauth_token'); - - if ($code && !$accessToken) { - return $this->oAuth2Client->getAccessTokenFromCode($code); - } - - $expiresAt = $this->signedRequest->get('expires', 0); - - return new AccessToken($accessToken, $expiresAt); - } - - return null; - } - - /** - * Returns the SignedRequest entity. - * - * @return SignedRequest|null - */ - public function getSignedRequest() - { - return $this->signedRequest; - } - - /** - * Returns the user_id if available. - * - * @return string|null - */ - public function getUserId() - { - return $this->signedRequest ? $this->signedRequest->getUserId() : null; - } - - /** - * Get raw signed request from input. - * - * @return string|null - */ - abstract public function getRawSignedRequest(); - - /** - * Get raw signed request from POST input. - * - * @return string|null - */ - public function getRawSignedRequestFromPost() - { - if (isset($_POST['signed_request'])) { - return $_POST['signed_request']; - } - - return null; - } - - /** - * Get raw signed request from cookie set from the Javascript SDK. - * - * @return string|null - */ - public function getRawSignedRequestFromCookie() - { - if (isset($_COOKIE['fbsr_' . $this->app->getId()])) { - return $_COOKIE['fbsr_' . $this->app->getId()]; - } - - return null; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/GraphRawResponse.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/GraphRawResponse.php deleted file mode 100755 index 583d3033..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/GraphRawResponse.php +++ /dev/null @@ -1,137 +0,0 @@ -httpResponseCode = (int)$httpStatusCode; - } - - if (is_array($headers)) { - $this->headers = $headers; - } else { - $this->setHeadersFromString($headers); - } - - $this->body = $body; - } - - /** - * Return the response headers. - * - * @return array - */ - public function getHeaders() - { - return $this->headers; - } - - /** - * Return the body of the response. - * - * @return string - */ - public function getBody() - { - return $this->body; - } - - /** - * Return the HTTP response code. - * - * @return int - */ - public function getHttpResponseCode() - { - return $this->httpResponseCode; - } - - /** - * Sets the HTTP response code from a raw header. - * - * @param string $rawResponseHeader - */ - public function setHttpResponseCodeFromHeader($rawResponseHeader) - { - preg_match('|HTTP/\d\.\d\s+(\d+)\s+.*|', $rawResponseHeader, $match); - $this->httpResponseCode = (int)$match[1]; - } - - /** - * Parse the raw headers and set as an array. - * - * @param string $rawHeaders The raw headers from the response. - */ - protected function setHeadersFromString($rawHeaders) - { - // Normalize line breaks - $rawHeaders = str_replace("\r\n", "\n", $rawHeaders); - - // There will be multiple headers if a 301 was followed - // or a proxy was followed, etc - $headerCollection = explode("\n\n", trim($rawHeaders)); - // We just want the last response (at the end) - $rawHeader = array_pop($headerCollection); - - $headerComponents = explode("\n", $rawHeader); - foreach ($headerComponents as $line) { - if (strpos($line, ': ') === false) { - $this->setHttpResponseCodeFromHeader($line); - } else { - list($key, $value) = explode(': ', $line); - $this->headers[$key] = $value; - } - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/RequestBodyInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/RequestBodyInterface.php deleted file mode 100755 index 97e0a2e8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/RequestBodyInterface.php +++ /dev/null @@ -1,39 +0,0 @@ -params = $params; - $this->files = $files; - $this->boundary = $boundary ?: uniqid(); - } - - /** - * @inheritdoc - */ - public function getBody() - { - $body = ''; - - // Compile normal params - $params = $this->getNestedParams($this->params); - foreach ($params as $k => $v) { - $body .= $this->getParamString($k, $v); - } - - // Compile files - foreach ($this->files as $k => $v) { - $body .= $this->getFileString($k, $v); - } - - // Peace out - $body .= "--{$this->boundary}--\r\n"; - - return $body; - } - - /** - * Get the boundary - * - * @return string - */ - public function getBoundary() - { - return $this->boundary; - } - - /** - * Get the string needed to transfer a file. - * - * @param string $name - * @param FacebookFile $file - * - * @return string - */ - private function getFileString($name, FacebookFile $file) - { - return sprintf( - "--%s\r\nContent-Disposition: form-data; name=\"%s\"; filename=\"%s\"%s\r\n\r\n%s\r\n", - $this->boundary, - $name, - $file->getFileName(), - $this->getFileHeaders($file), - $file->getContents() - ); - } - - /** - * Get the string needed to transfer a POST field. - * - * @param string $name - * @param string $value - * - * @return string - */ - private function getParamString($name, $value) - { - return sprintf( - "--%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n", - $this->boundary, - $name, - $value - ); - } - - /** - * Returns the params as an array of nested params. - * - * @param array $params - * - * @return array - */ - private function getNestedParams(array $params) - { - $query = http_build_query($params, null, '&'); - $params = explode('&', $query); - $result = []; - - foreach ($params as $param) { - list($key, $value) = explode('=', $param, 2); - $result[urldecode($key)] = urldecode($value); - } - - return $result; - } - - /** - * Get the headers needed before transferring the content of a POST file. - * - * @param FacebookFile $file - * - * @return string - */ - protected function getFileHeaders(FacebookFile $file) - { - return "\r\nContent-Type: {$file->getMimetype()}"; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/RequestBodyUrlEncoded.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/RequestBodyUrlEncoded.php deleted file mode 100755 index 77c2b649..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Http/RequestBodyUrlEncoded.php +++ /dev/null @@ -1,55 +0,0 @@ -params = $params; - } - - /** - * @inheritdoc - */ - public function getBody() - { - return http_build_query($this->params, null, '&'); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookCurl.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookCurl.php deleted file mode 100755 index e5d124ac..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookCurl.php +++ /dev/null @@ -1,129 +0,0 @@ -curl = curl_init(); - } - - /** - * Set a curl option - * - * @param $key - * @param $value - */ - public function setopt($key, $value) - { - curl_setopt($this->curl, $key, $value); - } - - /** - * Set an array of options to a curl resource - * - * @param array $options - */ - public function setoptArray(array $options) - { - curl_setopt_array($this->curl, $options); - } - - /** - * Send a curl request - * - * @return mixed - */ - public function exec() - { - return curl_exec($this->curl); - } - - /** - * Return the curl error number - * - * @return int - */ - public function errno() - { - return curl_errno($this->curl); - } - - /** - * Return the curl error message - * - * @return string - */ - public function error() - { - return curl_error($this->curl); - } - - /** - * Get info from a curl reference - * - * @param $type - * - * @return mixed - */ - public function getinfo($type) - { - return curl_getinfo($this->curl, $type); - } - - /** - * Get the currently installed curl version - * - * @return array - */ - public function version() - { - return curl_version(); - } - - /** - * Close the resource connection to curl - */ - public function close() - { - curl_close($this->curl); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookCurlHttpClient.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookCurlHttpClient.php deleted file mode 100755 index 955ac062..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookCurlHttpClient.php +++ /dev/null @@ -1,210 +0,0 @@ -facebookCurl = $facebookCurl ?: new FacebookCurl(); - } - - /** - * @inheritdoc - */ - public function send($url, $method, $body, array $headers, $timeOut) - { - $this->openConnection($url, $method, $body, $headers, $timeOut); - $this->sendRequest(); - - if ($curlErrorCode = $this->facebookCurl->errno()) { - throw new FacebookSDKException($this->facebookCurl->error(), $curlErrorCode); - } - - // Separate the raw headers from the raw body - list($rawHeaders, $rawBody) = $this->extractResponseHeadersAndBody(); - - $this->closeConnection(); - - return new GraphRawResponse($rawHeaders, $rawBody); - } - - /** - * Opens a new curl connection. - * - * @param string $url The endpoint to send the request to. - * @param string $method The request method. - * @param string $body The body of the request. - * @param array $headers The request headers. - * @param int $timeOut The timeout in seconds for the request. - */ - public function openConnection($url, $method, $body, array $headers, $timeOut) - { - $options = [ - CURLOPT_CUSTOMREQUEST => $method, - CURLOPT_HTTPHEADER => $this->compileRequestHeaders($headers), - CURLOPT_URL => $url, - CURLOPT_CONNECTTIMEOUT => 10, - CURLOPT_TIMEOUT => $timeOut, - CURLOPT_RETURNTRANSFER => true, // Follow 301 redirects - CURLOPT_HEADER => true, // Enable header processing - CURLOPT_SSL_VERIFYHOST => 2, - CURLOPT_SSL_VERIFYPEER => true, - CURLOPT_CAINFO => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem', - ]; - - if ($method !== "GET") { - $options[CURLOPT_POSTFIELDS] = $body; - } - - $this->facebookCurl->init(); - $this->facebookCurl->setoptArray($options); - } - - /** - * Closes an existing curl connection - */ - public function closeConnection() - { - $this->facebookCurl->close(); - } - - /** - * Send the request and get the raw response from curl - */ - public function sendRequest() - { - $this->rawResponse = $this->facebookCurl->exec(); - } - - /** - * Compiles the request headers into a curl-friendly format. - * - * @param array $headers The request headers. - * - * @return array - */ - public function compileRequestHeaders(array $headers) - { - $return = []; - - foreach ($headers as $key => $value) { - $return[] = $key . ': ' . $value; - } - - return $return; - } - - /** - * Extracts the headers and the body into a two-part array - * - * @return array - */ - public function extractResponseHeadersAndBody() - { - $headerSize = $this->getHeaderSize(); - - $rawHeaders = mb_substr($this->rawResponse, 0, $headerSize); - $rawBody = mb_substr($this->rawResponse, $headerSize); - - return [trim($rawHeaders), trim($rawBody)]; - } - - /** - * Return proper header size - * - * @return integer - */ - private function getHeaderSize() - { - $headerSize = $this->facebookCurl->getinfo(CURLINFO_HEADER_SIZE); - // This corrects a Curl bug where header size does not account - // for additional Proxy headers. - if ($this->needsCurlProxyFix()) { - // Additional way to calculate the request body size. - if (preg_match('/Content-Length: (\d+)/', $this->rawResponse, $m)) { - $headerSize = mb_strlen($this->rawResponse) - $m[1]; - } elseif (stripos($this->rawResponse, self::CONNECTION_ESTABLISHED) !== false) { - $headerSize += mb_strlen(self::CONNECTION_ESTABLISHED); - } - } - - return $headerSize; - } - - /** - * Detect versions of Curl which report incorrect header lengths when - * using Proxies. - * - * @return boolean - */ - private function needsCurlProxyFix() - { - $ver = $this->facebookCurl->version(); - $version = $ver['version_number']; - - return $version < self::CURL_PROXY_QUIRK_VER; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookGuzzleHttpClient.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookGuzzleHttpClient.php deleted file mode 100755 index 6f2a1c6f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookGuzzleHttpClient.php +++ /dev/null @@ -1,97 +0,0 @@ -guzzleClient = $guzzleClient ?: new Client(); - } - - /** - * @inheritdoc - */ - public function send($url, $method, $body, array $headers, $timeOut) - { - $options = [ - 'headers' => $headers, - 'body' => $body, - 'timeout' => $timeOut, - 'connect_timeout' => 10, - 'verify' => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem', - ]; - $request = $this->guzzleClient->createRequest($method, $url, $options); - - try { - $rawResponse = $this->guzzleClient->send($request); - } catch (RequestException $e) { - $rawResponse = $e->getResponse(); - - if ($e->getPrevious() instanceof RingException || !$rawResponse instanceof ResponseInterface) { - throw new FacebookSDKException($e->getMessage(), $e->getCode()); - } - } - - $rawHeaders = $this->getHeadersAsString($rawResponse); - $rawBody = $rawResponse->getBody(); - $httpStatusCode = $rawResponse->getStatusCode(); - - return new GraphRawResponse($rawHeaders, $rawBody, $httpStatusCode); - } - - /** - * Returns the Guzzle array of headers as a string. - * - * @param ResponseInterface $response The Guzzle response. - * - * @return string - */ - public function getHeadersAsString(ResponseInterface $response) - { - $headers = $response->getHeaders(); - $rawHeaders = []; - foreach ($headers as $name => $values) { - $rawHeaders[] = $name . ": " . implode(", ", $values); - } - - return implode("\r\n", $rawHeaders); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookHttpClientInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookHttpClientInterface.php deleted file mode 100755 index 0029bc02..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookHttpClientInterface.php +++ /dev/null @@ -1,47 +0,0 @@ -stream = stream_context_create($options); - } - - /** - * The response headers from the stream wrapper - * - * @return array|null - */ - public function getResponseHeaders() - { - return $this->responseHeaders; - } - - /** - * Send a stream wrapped request - * - * @param string $url - * - * @return mixed - */ - public function fileGetContents($url) - { - $rawResponse = file_get_contents($url, false, $this->stream); - $this->responseHeaders = $http_response_header; - - return $rawResponse; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookStreamHttpClient.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookStreamHttpClient.php deleted file mode 100755 index b1575143..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/FacebookStreamHttpClient.php +++ /dev/null @@ -1,94 +0,0 @@ -facebookStream = $facebookStream ?: new FacebookStream(); - } - - /** - * @inheritdoc - */ - public function send($url, $method, $body, array $headers, $timeOut) - { - $options = [ - 'http' => [ - 'method' => $method, - 'header' => $this->compileHeader($headers), - 'content' => $body, - 'timeout' => $timeOut, - 'ignore_errors' => true - ], - 'ssl' => [ - 'verify_peer' => true, - 'verify_peer_name' => true, - 'allow_self_signed' => true, // All root certificates are self-signed - 'cafile' => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem', - ], - ]; - - $this->facebookStream->streamContextCreate($options); - $rawBody = $this->facebookStream->fileGetContents($url); - $rawHeaders = $this->facebookStream->getResponseHeaders(); - - if ($rawBody === false || !$rawHeaders) { - throw new FacebookSDKException('Stream returned an empty response', 660); - } - - $rawHeaders = implode("\r\n", $rawHeaders); - - return new GraphRawResponse($rawHeaders, $rawBody); - } - - /** - * Formats the headers for use in the stream wrapper. - * - * @param array $headers The request headers. - * - * @return string - */ - public function compileHeader(array $headers) - { - $header = []; - foreach ($headers as $k => $v) { - $header[] = $k . ': ' . $v; - } - - return implode("\r\n", $header); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/certs/DigiCertHighAssuranceEVRootCA.pem b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/certs/DigiCertHighAssuranceEVRootCA.pem deleted file mode 100755 index 9e6810ab..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/HttpClients/certs/DigiCertHighAssuranceEVRootCA.pem +++ /dev/null @@ -1,23 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/FacebookMemoryPersistentDataHandler.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/FacebookMemoryPersistentDataHandler.php deleted file mode 100755 index 93a66861..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/FacebookMemoryPersistentDataHandler.php +++ /dev/null @@ -1,53 +0,0 @@ -sessionData[$key]) ? $this->sessionData[$key] : null; - } - - /** - * @inheritdoc - */ - public function set($key, $value) - { - $this->sessionData[$key] = $value; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/FacebookSessionPersistentDataHandler.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/FacebookSessionPersistentDataHandler.php deleted file mode 100755 index 698bfd04..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/FacebookSessionPersistentDataHandler.php +++ /dev/null @@ -1,76 +0,0 @@ -sessionPrefix . $key])) { - return $_SESSION[$this->sessionPrefix . $key]; - } - - return null; - } - - /** - * @inheritdoc - */ - public function set($key, $value) - { - $_SESSION[$this->sessionPrefix . $key] = $value; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/PersistentDataInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/PersistentDataInterface.php deleted file mode 100755 index bd7e072a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PersistentData/PersistentDataInterface.php +++ /dev/null @@ -1,49 +0,0 @@ -validateLength($length); - - $binaryString = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); - - if ($binaryString === false) { - throw new FacebookSDKException( - static::ERROR_MESSAGE . - 'mcrypt_create_iv() returned an error.' - ); - } - - return $this->binToHex($binaryString, $length); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/OpenSslPseudoRandomStringGenerator.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/OpenSslPseudoRandomStringGenerator.php deleted file mode 100755 index f4ea6b87..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/OpenSslPseudoRandomStringGenerator.php +++ /dev/null @@ -1,67 +0,0 @@ -validateLength($length); - - $wasCryptographicallyStrong = false; - $binaryString = openssl_random_pseudo_bytes($length, $wasCryptographicallyStrong); - - if ($binaryString === false) { - throw new FacebookSDKException(static::ERROR_MESSAGE . 'openssl_random_pseudo_bytes() returned an unknown error.'); - } - - if ($wasCryptographicallyStrong !== true) { - throw new FacebookSDKException(static::ERROR_MESSAGE . 'openssl_random_pseudo_bytes() returned a pseudo-random string but it was not cryptographically secure and cannot be used.'); - } - - return $this->binToHex($binaryString, $length); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/PseudoRandomStringGeneratorInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/PseudoRandomStringGeneratorInterface.php deleted file mode 100755 index 970330c8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/PseudoRandomString/PseudoRandomStringGeneratorInterface.php +++ /dev/null @@ -1,45 +0,0 @@ -validateLength($length); - - $stream = fopen('/dev/urandom', 'rb'); - if (!is_resource($stream)) { - throw new FacebookSDKException( - static::ERROR_MESSAGE . - 'Unable to open stream to /dev/urandom.' - ); - } - - if (!defined('HHVM_VERSION')) { - stream_set_read_buffer($stream, 0); - } - - $binaryString = fread($stream, $length); - fclose($stream); - - if (!$binaryString) { - throw new FacebookSDKException( - static::ERROR_MESSAGE . - 'Stream to /dev/urandom returned no data.' - ); - } - - return $this->binToHex($binaryString, $length); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/SignedRequest.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/SignedRequest.php deleted file mode 100755 index 77099a34..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/SignedRequest.php +++ /dev/null @@ -1,332 +0,0 @@ -app = $facebookApp; - - if (!$rawSignedRequest) { - return; - } - - $this->rawSignedRequest = $rawSignedRequest; - - $this->parse(); - } - - /** - * Returns the raw signed request data. - * - * @return string|null - */ - public function getRawSignedRequest() - { - return $this->rawSignedRequest; - } - - /** - * Returns the parsed signed request data. - * - * @return array|null - */ - public function getPayload() - { - return $this->payload; - } - - /** - * Returns a property from the signed request data if available. - * - * @param string $key - * @param mixed|null $default - * - * @return mixed|null - */ - public function get($key, $default = null) - { - if (isset($this->payload[$key])) { - return $this->payload[$key]; - } - - return $default; - } - - /** - * Returns user_id from signed request data if available. - * - * @return string|null - */ - public function getUserId() - { - return $this->get('user_id'); - } - - /** - * Checks for OAuth data in the payload. - * - * @return boolean - */ - public function hasOAuthData() - { - return $this->get('oauth_token') || $this->get('code'); - } - - /** - * Creates a signed request from an array of data. - * - * @param array $payload - * - * @return string - */ - public function make(array $payload) - { - $payload['algorithm'] = isset($payload['algorithm']) ? $payload['algorithm'] : 'HMAC-SHA256'; - $payload['issued_at'] = isset($payload['issued_at']) ? $payload['issued_at'] : time(); - $encodedPayload = $this->base64UrlEncode(json_encode($payload)); - - $hashedSig = $this->hashSignature($encodedPayload); - $encodedSig = $this->base64UrlEncode($hashedSig); - - return $encodedSig . '.' . $encodedPayload; - } - - /** - * Validates and decodes a signed request and saves - * the payload to an array. - */ - protected function parse() - { - list($encodedSig, $encodedPayload) = $this->split(); - - // Signature validation - $sig = $this->decodeSignature($encodedSig); - $hashedSig = $this->hashSignature($encodedPayload); - $this->validateSignature($hashedSig, $sig); - - $this->payload = $this->decodePayload($encodedPayload); - - // Payload validation - $this->validateAlgorithm(); - } - - /** - * Splits a raw signed request into signature and payload. - * - * @returns array - * - * @throws FacebookSDKException - */ - protected function split() - { - if (strpos($this->rawSignedRequest, '.') === false) { - throw new FacebookSDKException('Malformed signed request.', 606); - } - - return explode('.', $this->rawSignedRequest, 2); - } - - /** - * Decodes the raw signature from a signed request. - * - * @param string $encodedSig - * - * @returns string - * - * @throws FacebookSDKException - */ - protected function decodeSignature($encodedSig) - { - $sig = $this->base64UrlDecode($encodedSig); - - if (!$sig) { - throw new FacebookSDKException('Signed request has malformed encoded signature data.', 607); - } - - return $sig; - } - - /** - * Decodes the raw payload from a signed request. - * - * @param string $encodedPayload - * - * @returns array - * - * @throws FacebookSDKException - */ - protected function decodePayload($encodedPayload) - { - $payload = $this->base64UrlDecode($encodedPayload); - - if ($payload) { - $payload = json_decode($payload, true); - } - - if (!is_array($payload)) { - throw new FacebookSDKException('Signed request has malformed encoded payload data.', 607); - } - - return $payload; - } - - /** - * Validates the algorithm used in a signed request. - * - * @throws FacebookSDKException - */ - protected function validateAlgorithm() - { - if ($this->get('algorithm') !== 'HMAC-SHA256') { - throw new FacebookSDKException('Signed request is using the wrong algorithm.', 605); - } - } - - /** - * Hashes the signature used in a signed request. - * - * @param string $encodedData - * - * @return string - * - * @throws FacebookSDKException - */ - protected function hashSignature($encodedData) - { - $hashedSig = hash_hmac( - 'sha256', - $encodedData, - $this->app->getSecret(), - $raw_output = true - ); - - if (!$hashedSig) { - throw new FacebookSDKException('Unable to hash signature from encoded payload data.', 602); - } - - return $hashedSig; - } - - /** - * Validates the signature used in a signed request. - * - * @param string $hashedSig - * @param string $sig - * - * @throws FacebookSDKException - */ - protected function validateSignature($hashedSig, $sig) - { - if (mb_strlen($hashedSig) === mb_strlen($sig)) { - $validate = 0; - for ($i = 0; $i < mb_strlen($sig); $i++) { - $validate |= ord($hashedSig[$i]) ^ ord($sig[$i]); - } - if ($validate === 0) { - return; - } - } - - throw new FacebookSDKException('Signed request has an invalid signature.', 602); - } - - /** - * Base64 decoding which replaces characters: - * + instead of - - * / instead of _ - * - * @link http://en.wikipedia.org/wiki/Base64#URL_applications - * - * @param string $input base64 url encoded input - * - * @return string decoded string - */ - public function base64UrlDecode($input) - { - $urlDecodedBase64 = strtr($input, '-_', '+/'); - $this->validateBase64($urlDecodedBase64); - - return base64_decode($urlDecodedBase64); - } - - /** - * Base64 encoding which replaces characters: - * + instead of - - * / instead of _ - * - * @link http://en.wikipedia.org/wiki/Base64#URL_applications - * - * @param string $input string to encode - * - * @return string base64 url encoded input - */ - public function base64UrlEncode($input) - { - return strtr(base64_encode($input), '+/', '-_'); - } - - /** - * Validates a base64 string. - * - * @param string $input base64 value to validate - * - * @throws FacebookSDKException - */ - protected function validateBase64($input) - { - if (!preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $input)) { - throw new FacebookSDKException('Signed request contains malformed base64 encoding.', 608); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/FacebookUrlDetectionHandler.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/FacebookUrlDetectionHandler.php deleted file mode 100755 index 5fbb9ce4..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/FacebookUrlDetectionHandler.php +++ /dev/null @@ -1,163 +0,0 @@ -getHttpScheme() . '://' . $this->getHostName() . $this->getServerVar('REQUEST_URI'); - } - - /** - * Get the currently active URL scheme. - * - * @return string - */ - protected function getHttpScheme() - { - return $this->isBehindSsl() ? 'https' : 'http'; - } - - /** - * Tries to detect if the server is running behind an SSL. - * - * @return boolean - */ - protected function isBehindSsl() - { - // Check for proxy first - $protocol = $this->getHeader('X_FORWARDED_PROTO'); - if ($protocol) { - return $this->protocolWithActiveSsl($protocol); - } - - $protocol = $this->getServerVar('HTTPS'); - if ($protocol) { - return $this->protocolWithActiveSsl($protocol); - } - - return (string)$this->getServerVar('SERVER_PORT') === '443'; - } - - /** - * Detects an active SSL protocol value. - * - * @param string $protocol - * - * @return boolean - */ - protected function protocolWithActiveSsl($protocol) - { - $protocol = strtolower((string)$protocol); - - return in_array($protocol, ['on', '1', 'https', 'ssl'], true); - } - - /** - * Tries to detect the host name of the server. - * - * Some elements adapted from - * - * @see https://github.com/symfony/HttpFoundation/blob/master/Request.php - * - * @return string - */ - protected function getHostName() - { - // Check for proxy first - if ($host = $this->getHeader('X_FORWARDED_HOST')) { - $elements = explode(',', $host); - $host = $elements[count($elements) - 1]; - } elseif (!$host = $this->getHeader('HOST')) { - if (!$host = $this->getServerVar('SERVER_NAME')) { - $host = $this->getServerVar('SERVER_ADDR'); - } - } - - // trim and remove port number from host - // host is lowercase as per RFC 952/2181 - $host = strtolower(preg_replace('/:\d+$/', '', trim($host))); - - // Port number - $scheme = $this->getHttpScheme(); - $port = $this->getCurrentPort(); - $appendPort = ':' . $port; - - // Don't append port number if a normal port. - if (($scheme == 'http' && $port == '80') || ($scheme == 'https' && $port == '443')) { - $appendPort = ''; - } - - return $host . $appendPort; - } - - protected function getCurrentPort() - { - // Check for proxy first - $port = $this->getHeader('X_FORWARDED_PORT'); - if ($port) { - return (string)$port; - } - - $protocol = (string)$this->getHeader('X_FORWARDED_PROTO'); - if ($protocol === 'https') { - return '443'; - } - - return (string)$this->getServerVar('SERVER_PORT'); - } - - /** - * Returns the a value from the $_SERVER super global. - * - * @param string $key - * - * @return string - */ - protected function getServerVar($key) - { - return isset($_SERVER[$key]) ? $_SERVER[$key] : ''; - } - - /** - * Gets a value from the HTTP request headers. - * - * @param string $key - * - * @return string - */ - protected function getHeader($key) - { - return $this->getServerVar('HTTP_' . $key); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/FacebookUrlManipulator.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/FacebookUrlManipulator.php deleted file mode 100755 index 20a0299e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/FacebookUrlManipulator.php +++ /dev/null @@ -1,167 +0,0 @@ - 0) { - $query = '?' . http_build_query($params, null, '&'); - } - } - - $scheme = isset($parts['scheme']) ? $parts['scheme'] . '://' : ''; - $host = isset($parts['host']) ? $parts['host'] : ''; - $port = isset($parts['port']) ? ':' . $parts['port'] : ''; - $path = isset($parts['path']) ? $parts['path'] : ''; - $fragment = isset($parts['fragment']) ? '#' . $parts['fragment'] : ''; - - return $scheme . $host . $port . $path . $query . $fragment; - } - - /** - * Gracefully appends params to the URL. - * - * @param string $url The URL that will receive the params. - * @param array $newParams The params to append to the URL. - * - * @return string - */ - public static function appendParamsToUrl($url, array $newParams = []) - { - if (!$newParams) { - return $url; - } - - if (strpos($url, '?') === false) { - return $url . '?' . http_build_query($newParams, null, '&'); - } - - list($path, $query) = explode('?', $url, 2); - $existingParams = []; - parse_str($query, $existingParams); - - // Favor params from the original URL over $newParams - $newParams = array_merge($newParams, $existingParams); - - // Sort for a predicable order - ksort($newParams); - - return $path . '?' . http_build_query($newParams, null, '&'); - } - - /** - * Returns the params from a URL in the form of an array. - * - * @param string $url The URL to parse the params from. - * - * @return array - */ - public static function getParamsAsArray($url) - { - $query = parse_url($url, PHP_URL_QUERY); - if (!$query) { - return []; - } - $params = []; - parse_str($query, $params); - - return $params; - } - - /** - * Adds the params of the first URL to the second URL. - * - * Any params that already exist in the second URL will go untouched. - * - * @param string $urlToStealFrom The URL harvest the params from. - * @param string $urlToAddTo The URL that will receive the new params. - * - * @return string The $urlToAddTo with any new params from $urlToStealFrom. - */ - public static function mergeUrlParams($urlToStealFrom, $urlToAddTo) - { - $newParams = static::getParamsAsArray($urlToStealFrom); - // Nothing new to add, return as-is - if (!$newParams) { - return $urlToAddTo; - } - - return static::appendParamsToUrl($urlToAddTo, $newParams); - } - - /** - * Check for a "/" prefix and prepend it if not exists. - * - * @param string|null $string - * - * @return string|null - */ - public static function forceSlashPrefix($string) - { - if (!$string) { - return $string; - } - - return strpos($string, '/') === 0 ? $string : '/' . $string; - } - - /** - * Trims off the hostname and Graph version from a URL. - * - * @param string $urlToTrim The URL the needs the surgery. - * - * @return string The $urlToTrim with the hostname and Graph version removed. - */ - public static function baseGraphUrlEndpoint($urlToTrim) - { - return '/' . preg_replace('/^https:\/\/.+\.facebook\.com(\/v.+?)?\//', '', $urlToTrim); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/UrlDetectionInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/UrlDetectionInterface.php deleted file mode 100755 index 764a606e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Facebook/Url/UrlDetectionInterface.php +++ /dev/null @@ -1,39 +0,0 @@ -multi = $multiHandle; - $this->handles = new \SplObjectStorage(); - $this->throwsExceptions = $throwsExceptions; - $this->pending = $pending; - } - - /** - * Find a transaction for a given curl handle - * - * @param resource $handle Curl handle - * - * @return TransactionInterface - * @throws AdapterException if a transaction is not found - */ - public function findTransaction($handle) - { - foreach ($this->handles as $transaction) { - if ($this->handles[$transaction] === $handle) { - return $transaction; - } - } - - throw new AdapterException('No curl handle was found'); - } - - /** - * Returns true if there are any remaining pending transactions - * - * @return bool - */ - public function hasPending() - { - return $this->pending && $this->pending->valid(); - } - - /** - * Pop the next transaction from the transaction queue - * - * @return TransactionInterface|null - */ - public function nextPending() - { - if (!$this->hasPending()) { - return null; - } - - $current = $this->pending->current(); - $this->pending->next(); - - return $current; - } - - /** - * Checks if the batch is to throw exceptions on error - * - * @return bool - */ - public function throwsExceptions() - { - return $this->throwsExceptions; - } - - /** - * Get the curl_multi handle - * - * @return resource - */ - public function getMultiHandle() - { - return $this->multi; - } - - /** - * Add a transaction to the multi handle - * - * @param TransactionInterface $transaction Transaction to add - * @param resource $handle Resource to use with the handle - * - * @throws AdapterException If the handle is already registered - */ - public function addTransaction(TransactionInterface $transaction, $handle) - { - if (isset($this->handles[$transaction])) { - throw new AdapterException('Transaction already registered'); - } - - $code = curl_multi_add_handle($this->multi, $handle); - if ($code != CURLM_OK) { - MultiAdapter::throwMultiError($code); - } - - $this->handles[$transaction] = $handle; - } - - /** - * Remove a transaction and associated handle from the context - * - * @param TransactionInterface $transaction Transaction to remove - * - * @return array Returns the curl_getinfo array - * @throws AdapterException if the transaction is not found - */ - public function removeTransaction(TransactionInterface $transaction) - { - if (!isset($this->handles[$transaction])) { - throw new AdapterException('Transaction not registered'); - } - - $handle = $this->handles[$transaction]; - - $code = curl_multi_remove_handle($this->multi, $handle); - if ($code != CURLM_OK) { - MultiAdapter::throwMultiError($code); - } - - $info = curl_getinfo($handle); - curl_close($handle); - unset($this->handles[$transaction]); - - return $info; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlAdapter.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlAdapter.php deleted file mode 100755 index 0f120353..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlAdapter.php +++ /dev/null @@ -1,142 +0,0 @@ -handles = $this->ownedHandles = []; - $this->messageFactory = $messageFactory; - $this->curlFactory = isset($options['handle_factory']) - ? $options['handle_factory'] - : new CurlFactory(); - $this->maxHandles = isset($options['max_handles']) - ? $options['max_handles'] - : 5; - } - - public function __destruct() - { - foreach ($this->handles as $handle) { - if (is_resource($handle)) { - curl_close($handle); - } - } - } - - public function send(TransactionInterface $transaction) - { - RequestEvents::emitBefore($transaction); - if ($response = $transaction->getResponse()) { - return $response; - } - - $factory = $this->curlFactory; - $handle = $factory( - $transaction, - $this->messageFactory, - $this->checkoutEasyHandle() - ); - - curl_exec($handle); - $info = curl_getinfo($handle); - $info['curl_result'] = curl_errno($handle); - - if ($info['curl_result']) { - $this->handleError($transaction, $info, $handle); - } else { - $this->releaseEasyHandle($handle); - RequestEvents::emitComplete($transaction, $info); - } - - return $transaction->getResponse(); - } - - private function handleError( - TransactionInterface $transaction, - $info, - $handle - ) { - $error = curl_error($handle); - $this->releaseEasyHandle($handle); - RequestEvents::emitError( - $transaction, - new AdapterException("cURL error {$info['curl_result']}: {$error}"), - $info - ); - } - - private function checkoutEasyHandle() - { - // Find an unused handle in the cache - if (false !== ($key = array_search(false, $this->ownedHandles, true))) { - $this->ownedHandles[$key] = true; - return $this->handles[$key]; - } - - // Add a new handle - $handle = curl_init(); - $id = (int) $handle; - $this->handles[$id] = $handle; - $this->ownedHandles[$id] = true; - - return $handle; - } - - private function releaseEasyHandle($handle) - { - $id = (int) $handle; - if (count($this->ownedHandles) > $this->maxHandles) { - curl_close($this->handles[$id]); - unset($this->handles[$id], $this->ownedHandles[$id]); - } else { - curl_reset($handle); - $this->ownedHandles[$id] = false; - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlFactory.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlFactory.php deleted file mode 100755 index f1cb393a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlFactory.php +++ /dev/null @@ -1,331 +0,0 @@ -getRequest(); - $mediator = new RequestMediator($transaction, $messageFactory); - $options = $this->getDefaultOptions($request, $mediator); - $this->applyMethod($request, $options); - $this->applyTransferOptions($request, $mediator, $options); - $this->applyHeaders($request, $options); - unset($options['_headers']); - - // Add adapter options from the request's configuration options - if ($config = $request->getConfig()['curl']) { - $options = $this->applyCustomCurlOptions($config, $options); - } - - if (!$handle) { - $handle = curl_init(); - } - - curl_setopt_array($handle, $options); - - return $handle; - } - - protected function getDefaultOptions( - RequestInterface $request, - RequestMediator $mediator - ) { - $url = $request->getUrl(); - - // Strip fragment from URL. See: - // https://github.com/guzzle/guzzle/issues/453 - if (($pos = strpos($url, '#')) !== false) { - $url = substr($url, 0, $pos); - } - - $config = $request->getConfig(); - $options = array( - CURLOPT_URL => $url, - CURLOPT_CONNECTTIMEOUT => $config['connect_timeout'] ?: 150, - CURLOPT_RETURNTRANSFER => false, - CURLOPT_HEADER => false, - CURLOPT_WRITEFUNCTION => array($mediator, 'writeResponseBody'), - CURLOPT_HEADERFUNCTION => array($mediator, 'receiveResponseHeader'), - CURLOPT_READFUNCTION => array($mediator, 'readRequestBody'), - CURLOPT_HTTP_VERSION => $request->getProtocolVersion() === '1.0' - ? CURL_HTTP_VERSION_1_0 : CURL_HTTP_VERSION_1_1, - CURLOPT_SSL_VERIFYPEER => 1, - CURLOPT_SSL_VERIFYHOST => 2, - '_headers' => $request->getHeaders() - ); - - if (defined('CURLOPT_PROTOCOLS')) { - // Allow only HTTP and HTTPS protocols - $options[CURLOPT_PROTOCOLS] = CURLPROTO_HTTP | CURLPROTO_HTTPS; - } - - // Add CURLOPT_ENCODING if Accept-Encoding header is provided - if ($request->hasHeader('Accept-Encoding')) { - $options[CURLOPT_ENCODING] = $request->getHeader('Accept-Encoding'); - // Let cURL set the Accept-Encoding header. Without this change - // curl could add a duplicate value. - $this->removeHeader('Accept-Encoding', $options); - } - - return $options; - } - - private function applyMethod(RequestInterface $request, array &$options) - { - $method = $request->getMethod(); - if ($method == 'HEAD') { - $options[CURLOPT_NOBODY] = true; - unset($options[CURLOPT_WRITEFUNCTION], $options[CURLOPT_READFUNCTION]); - } else { - $options[CURLOPT_CUSTOMREQUEST] = $method; - if (!$request->getBody()) { - unset($options[CURLOPT_READFUNCTION]); - } else { - $this->applyBody($request, $options); - } - } - } - - private function applyBody(RequestInterface $request, array &$options) - { - if ($request->hasHeader('Content-Length')) { - $size = (int) $request->getHeader('Content-Length'); - } else { - $size = null; - } - - $request->getBody()->seek(0); - - // You can send the body as a string using curl's CURLOPT_POSTFIELDS - if (($size !== null && $size < 32768) || - isset($request->getConfig()['curl']['body_as_string']) - ) { - $options[CURLOPT_POSTFIELDS] = $request->getBody()->getContents(); - // Don't duplicate the Content-Length header - $this->removeHeader('Content-Length', $options); - $this->removeHeader('Transfer-Encoding', $options); - } else { - $options[CURLOPT_UPLOAD] = true; - // Let cURL handle setting the Content-Length header - if ($size !== null) { - $options[CURLOPT_INFILESIZE] = $size; - $this->removeHeader('Content-Length', $options); - } - } - - // If the Expect header is not present, prevent curl from adding it - if (!$request->hasHeader('Expect')) { - $options[CURLOPT_HTTPHEADER][] = 'Expect:'; - } - } - - private function applyHeaders(RequestInterface $request, array &$options) - { - foreach ($options['_headers'] as $name => $values) { - $options[CURLOPT_HTTPHEADER][] = $name . ': ' . implode(', ', $values); - } - - // Remove the Expect header if one was not set - if (!$request->hasHeader('Accept')) { - $options[CURLOPT_HTTPHEADER][] = 'Accept:'; - } - } - - private function applyTransferOptions( - RequestInterface $request, - RequestMediator $mediator, - array &$options - ) { - static $methods; - if (!$methods) { - $methods = array_flip(get_class_methods(__CLASS__)); - } - - foreach ($request->getConfig()->toArray() as $key => $value) { - $method = "add_{$key}"; - if (isset($methods[$method])) { - $this->{$method}($request, $mediator, $options, $value); - } - } - } - - private function add_debug( - RequestInterface $request, - RequestMediator $mediator, - &$options, - $value - ) { - if ($value) { - $options[CURLOPT_STDERR] = is_resource($value) ? $value : STDOUT; - $options[CURLOPT_VERBOSE] = true; - } - } - - private function add_proxy( - RequestInterface $request, - RequestMediator $mediator, - &$options, - $value - ) { - if (!is_array($value)) { - $options[CURLOPT_PROXY] = $value; - } else { - $scheme = $request->getScheme(); - if (isset($value[$scheme])) { - $options[CURLOPT_PROXY] = $value[$scheme]; - } - } - } - - private function add_timeout( - RequestInterface $request, - RequestMediator $mediator, - &$options, - $value - ) { - $options[CURLOPT_TIMEOUT_MS] = $value * 1000; - } - - private function add_connect_timeout( - RequestInterface $request, - RequestMediator $mediator, - &$options, - $value - ) { - $options[CURLOPT_CONNECTTIMEOUT_MS] = $value * 1000; - } - - private function add_verify( - RequestInterface $request, - RequestMediator $mediator, - &$options, - $value - ) { - if ($value === false) { - unset($options[CURLOPT_CAINFO]); - $options[CURLOPT_SSL_VERIFYHOST] = 0; - $options[CURLOPT_SSL_VERIFYPEER] = false; - } elseif ($value === true || is_string($value)) { - $options[CURLOPT_SSL_VERIFYHOST] = 2; - $options[CURLOPT_SSL_VERIFYPEER] = true; - if ($value !== true) { - if (!file_exists($value)) { - throw new AdapterException('SSL certificate authority file' - . " not found: {$value}"); - } - $options[CURLOPT_CAINFO] = $value; - } - } - } - - private function add_cert( - RequestInterface $request, - RequestMediator $mediator, - &$options, - $value - ) { - if (!file_exists($value)) { - throw new AdapterException("SSL certificate not found: {$value}"); - } - - $options[CURLOPT_SSLCERT] = $value; - } - - private function add_ssl_key( - RequestInterface $request, - RequestMediator $mediator, - &$options, - $value - ) { - if (is_array($value)) { - $options[CURLOPT_SSLKEYPASSWD] = $value[1]; - $value = $value[0]; - } - - if (!file_exists($value)) { - throw new AdapterException("SSL private key not found: {$value}"); - } - - $options[CURLOPT_SSLKEY] = $value; - } - - private function add_save_to( - RequestInterface $request, - RequestMediator $mediator, - &$options, - $value - ) { - $mediator->setResponseBody(is_string($value) - ? Stream\create(fopen($value, 'w')) - : Stream\create($value)); - } - - /** - * Takes an array of curl options specified in the 'curl' option of a - * request's configuration array and maps them to CURLOPT_* options. - * - * This method is only called when a request has a 'curl' config setting. - * Array key strings that start with CURL that have a matching constant - * value will be automatically converted to the matching constant. - * - * @param array $config Configuration array of custom curl option - * @param array $options Array of existing curl options - * - * @return array Returns a new array of curl options - */ - private function applyCustomCurlOptions(array $config, array $options) - { - unset($config['body_as_string']); - $curlOptions = []; - - // Map curl constant strings to defined values - foreach ($config as $key => $value) { - if (defined($key) && substr($key, 0, 4) === 'CURL') { - $key = constant($key); - } - $curlOptions[$key] = $value; - } - - return $curlOptions + $options; - } - - /** - * Remove a header from the options array - * - * @param string $name Case-insensitive header to remove - * @param array $options Array of options to modify - */ - private function removeHeader($name, array &$options) - { - foreach (array_keys($options['_headers']) as $key) { - if (!strcasecmp($key, $name)) { - unset($options['_headers'][$key]); - return; - } - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/MultiAdapter.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/MultiAdapter.php deleted file mode 100755 index 30645956..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/MultiAdapter.php +++ /dev/null @@ -1,284 +0,0 @@ -messageFactory = $messageFactory; - $this->curlFactory = isset($options['handle_factory']) - ? $options['handle_factory'] - : new CurlFactory(); - - if (isset($options['select_timeout'])) { - $this->selectTimeout = $options['select_timeout']; - } elseif (isset($_SERVER[self::ENV_SELECT_TIMEOUT])) { - $this->selectTimeout = $_SERVER[self::ENV_SELECT_TIMEOUT]; - } else { - $this->selectTimeout = 1; - } - } - - public function __destruct() - { - foreach ($this->multiHandles as $handle) { - if (is_resource($handle)) { - curl_multi_close($handle); - } - } - } - - /** - * Throw an exception for a cURL multi response - * - * @param int $code Curl response code - * @throws AdapterException - */ - public static function throwMultiError($code) - { - $buffer = function_exists('curl_multi_strerror') - ? curl_multi_strerror($code) - : self::ERROR_STR; - - throw new AdapterException(sprintf('cURL error %s: %s', $code, $buffer)); - } - - public function send(TransactionInterface $transaction) - { - $context = new BatchContext($this->checkoutMultiHandle(), true); - $this->addHandle($transaction, $context); - $this->perform($context); - - return $transaction->getResponse(); - } - - public function sendAll(\Iterator $transactions, $parallel) - { - $context = new BatchContext( - $this->checkoutMultiHandle(), - false, - $transactions - ); - - foreach (new \LimitIterator($transactions, 0, $parallel) as $trans) { - $this->addHandle($trans, $context); - } - - $this->perform($context); - } - - private function perform(BatchContext $context) - { - // The first curl_multi_select often times out no matter what, but is - // usually required for fast transfers. - $active = false; - $multi = $context->getMultiHandle(); - - do { - while (($mrc = curl_multi_exec($multi, $active)) == CURLM_CALL_MULTI_PERFORM); - if ($mrc != CURLM_OK && $mrc != CURLM_CALL_MULTI_PERFORM) { - self::throwMultiError($mrc); - } - // Need to check if there are pending transactions before processing - // them so that we don't bail from the loop too early. - $pending = $context->hasPending(); - $this->processMessages($context); - if ($active && curl_multi_select($multi, $this->selectTimeout) === -1) { - // Perform a usleep if a select returns -1. - // See: https://bugs.php.net/bug.php?id=61141 - usleep(250); - } - } while ($active || $pending); - - $this->releaseMultiHandle($multi); - } - - private function processMessages(BatchContext $context) - { - $multi = $context->getMultiHandle(); - - while ($done = curl_multi_info_read($multi)) { - $transaction = $context->findTransaction($done['handle']); - $this->processResponse($transaction, $done, $context); - // Add the next transaction if there are more in the queue - if ($next = $context->nextPending()) { - $this->addHandle($next, $context); - } - } - } - - private function processResponse( - TransactionInterface $transaction, - array $curl, - BatchContext $context - ) { - $info = $context->removeTransaction($transaction); - - try { - if (!$this->isCurlException($transaction, $curl, $context, $info)) { - RequestEvents::emitComplete($transaction, $info); - } - } catch (RequestException $e) { - $this->throwException($e, $context); - } - } - - private function addHandle( - TransactionInterface $transaction, - BatchContext $context - ) { - try { - RequestEvents::emitBefore($transaction); - // Only transfer if the request was not intercepted - if (!$transaction->getResponse()) { - $factory = $this->curlFactory; - $context->addTransaction( - $transaction, - $factory($transaction, $this->messageFactory) - ); - } - } catch (RequestException $e) { - $this->throwException($e, $context); - } - } - - private function isCurlException( - TransactionInterface $transaction, - array $curl, - BatchContext $context, - array $info - ) { - if (CURLM_OK == $curl['result'] || - CURLM_CALL_MULTI_PERFORM == $curl['result'] - ) { - return false; - } - - $request = $transaction->getRequest(); - try { - // Send curl stats along if they are available - $stats = ['curl_result' => $curl['result']] + $info; - RequestEvents::emitError( - $transaction, - new RequestException( - sprintf( - '[curl] (#%s) %s [url] %s', - $curl['result'], - function_exists('curl_strerror') - ? curl_strerror($curl['result']) - : self::ERROR_STR, - $request->getUrl() - ), - $request - ), - $stats - ); - } catch (RequestException $e) { - $this->throwException($e, $context); - } - - return true; - } - - private function throwException(RequestException $e, BatchContext $context) - { - if ($context->throwsExceptions()) { - $this->releaseMultiHandle($context->getMultiHandle()); - throw $e; - } - } - - /** - * Returns a curl_multi handle from the cache or creates a new one - * - * @return resource - */ - private function checkoutMultiHandle() - { - // Find an unused handle in the cache - $key = array_search(false, $this->multiOwned, true); - if (false !== $key) { - $this->multiOwned[$key] = true; - return $this->multiHandles[$key]; - } - - // Add a new handle - $handle = curl_multi_init(); - $id = (int) $handle; - $this->multiHandles[$id] = $handle; - $this->multiOwned[$id] = true; - - return $handle; - } - - /** - * Releases a curl_multi handle back into the cache and removes excess cache - * - * @param resource $handle Curl multi handle to remove - */ - private function releaseMultiHandle($handle) - { - $id = (int) $handle; - - if (count($this->multiHandles) <= 3) { - $this->multiOwned[$id] = false; - } else { - // Prune excessive handles - curl_multi_close($this->multiHandles[$id]); - unset($this->multiHandles[$id], $this->multiOwned[$id]); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/RequestMediator.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/RequestMediator.php deleted file mode 100755 index 19cbcfd0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Curl/RequestMediator.php +++ /dev/null @@ -1,130 +0,0 @@ -transaction = $transaction; - $this->messageFactory = $messageFactory; - } - - /** - * Set the body that will hold the response body - * - * @param StreamInterface $body Response body - */ - public function setResponseBody(StreamInterface $body = null) - { - $this->body = $body; - } - - /** - * Receive a response header from curl - * - * @param resource $curl Curl handle - * @param string $header Received header - * - * @return int - */ - public function receiveResponseHeader($curl, $header) - { - static $normalize = ["\r", "\n"]; - $length = strlen($header); - $header = str_replace($normalize, '', $header); - - if (strpos($header, 'HTTP/') === 0) { - $startLine = explode(' ', $header, 3); - // Only download the body to a target body when a successful - // response is received. - if ($startLine[1][0] != '2') { - $this->body = null; - } - $this->statusCode = $startLine[1]; - $this->reasonPhrase = isset($startLine[2]) ? $startLine[2] : null; - $this->protocolVersion = substr($startLine[0], -3); - $this->headers = []; - } elseif ($pos = strpos($header, ':')) { - $this->headers[substr($header, 0, $pos)][] = substr($header, $pos + 1); - } elseif ($header == '' && $this->statusCode >= 200) { - $response = $this->messageFactory->createResponse( - $this->statusCode, - $this->headers, - $this->body, - [ - 'protocol_version' => $this->protocolVersion, - 'reason_phrase' => $this->reasonPhrase - ] - ); - $this->headers = $this->body = null; - $this->transaction->setResponse($response); - // Allows events to react before downloading any of the body - RequestEvents::emitHeaders($this->transaction); - } - - return $length; - } - - /** - * Write data to the response body of a request - * - * @param resource $curl - * @param string $write - * - * @return int - */ - public function writeResponseBody($curl, $write) - { - if (!($response = $this->transaction->getResponse())) { - return 0; - } - - // Add a default body on the response if one was not found - if (!($body = $response->getBody())) { - $body = new Stream(fopen('php://temp', 'r+')); - $response->setBody($body); - } - - return $body->write($write); - } - - /** - * Read data from the request body and send it to curl - * - * @param resource $ch Curl handle - * @param resource $fd File descriptor - * @param int $length Amount of data to read - * - * @return string - */ - public function readRequestBody($ch, $fd, $length) - { - return (string) $this->transaction->getRequest()->getBody()->read($length); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/FakeParallelAdapter.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/FakeParallelAdapter.php deleted file mode 100755 index 30265683..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/FakeParallelAdapter.php +++ /dev/null @@ -1,34 +0,0 @@ -adapter = $adapter; - } - - public function sendAll(\Iterator $transactions, $parallel) - { - foreach ($transactions as $transaction) { - try { - $this->adapter->send($transaction); - } catch (RequestException $e) { - // no op for batch transaction - } - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/MockAdapter.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/MockAdapter.php deleted file mode 100755 index 3e8020e6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/MockAdapter.php +++ /dev/null @@ -1,60 +0,0 @@ -setResponse($response); - } - - /** - * Set the response that will be served by the adapter - * - * @param ResponseInterface|callable $response Response to serve or - * function to invoke that handles a transaction - */ - public function setResponse($response) - { - $this->response = $response; - } - - public function send(TransactionInterface $transaction) - { - RequestEvents::emitBefore($transaction); - if (!$transaction->getResponse()) { - - // Read the request body if it is present - if ($transaction->getRequest()->getBody()) { - $transaction->getRequest()->getBody()->__toString(); - } - - $response = is_callable($this->response) - ? call_user_func($this->response, $transaction) - : $this->response; - if (!$response instanceof ResponseInterface) { - throw new \RuntimeException('Invalid mocked response'); - } - - $transaction->setResponse($response); - RequestEvents::emitHeaders($transaction); - RequestEvents::emitComplete($transaction); - } - - return $transaction->getResponse(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/ParallelAdapterInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/ParallelAdapterInterface.php deleted file mode 100755 index 79a25b7e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/ParallelAdapterInterface.php +++ /dev/null @@ -1,23 +0,0 @@ -messageFactory = $messageFactory; - } - - public function send(TransactionInterface $transaction) - { - // HTTP/1.1 streams using the PHP stream wrapper require a - // Connection: close header. Setting here so that it is added before - // emitting the request.before_send event. - $request = $transaction->getRequest(); - if ($request->getProtocolVersion() == '1.1' && - !$request->hasHeader('Connection') - ) { - $transaction->getRequest()->setHeader('Connection', 'close'); - } - - RequestEvents::emitBefore($transaction); - if (!$transaction->getResponse()) { - $this->createResponse($transaction); - RequestEvents::emitComplete($transaction); - } - - return $transaction->getResponse(); - } - - private function createResponse(TransactionInterface $transaction) - { - $request = $transaction->getRequest(); - $stream = $this->createStream($request, $http_response_header); - - if (!$request->getConfig()['stream']) { - $stream = $this->getSaveToBody($request, $stream); - } - - // Track the response headers of the request - $this->createResponseObject($http_response_header, $transaction, $stream); - } - - /** - * Drain the steam into the destination stream - */ - private function getSaveToBody(RequestInterface $request, $stream) - { - if ($saveTo = $request->getConfig()['save_to']) { - // Stream the response into the destination stream - $saveTo = is_string($saveTo) - ? Stream\create(fopen($saveTo, 'r+')) - : Stream\create($saveTo); - } else { - // Stream into the default temp stream - $saveTo = Stream\create(); - } - - while (!feof($stream)) { - $saveTo->write(fread($stream, 8096)); - } - - fclose($stream); - $saveTo->seek(0); - - return $saveTo; - } - - private function createResponseObject( - array $headers, - TransactionInterface $transaction, - $stream - ) { - $parts = explode(' ', array_shift($headers), 3); - $options = ['protocol_version' => substr($parts[0], -3)]; - if (isset($parts[2])) { - $options['reason_phrase'] = $parts[2]; - } - - // Set the size on the stream if it was returned in the response - $responseHeaders = []; - foreach ($headers as $header) { - $headerParts = explode(':', $header, 2); - $responseHeaders[$headerParts[0]] = isset($headerParts[1]) - ? $headerParts[1] - : ''; - } - - $response = $this->messageFactory->createResponse( - $parts[1], - $responseHeaders, - $stream, - $options - ); - - $transaction->setResponse($response); - RequestEvents::emitHeaders($transaction); - - return $response; - } - - /** - * Create a resource and check to ensure it was created successfully - * - * @param callable $callback Callable that returns stream resource - * @param RequestInterface $request Request used when throwing exceptions - * @param array $options Options used when throwing exceptions - * - * @return resource - * @throws RequestException on error - */ - private function createResource(callable $callback, RequestInterface $request, $options) - { - // Turn off error reporting while we try to initiate the request - $level = error_reporting(0); - $resource = call_user_func($callback); - error_reporting($level); - - // If the resource could not be created, then grab the last error and - // throw an exception. - if (!is_resource($resource)) { - $message = 'Error creating resource. [url] ' . $request->getUrl() . ' '; - if (isset($options['http']['proxy'])) { - $message .= "[proxy] {$options['http']['proxy']} "; - } - foreach (error_get_last() as $key => $value) { - $message .= "[{$key}] {$value} "; - } - throw new RequestException(trim($message), $request); - } - - return $resource; - } - - /** - * Create the stream for the request with the context options. - * - * @param RequestInterface $request Request being sent - * @param mixed $http_response_header Populated by stream wrapper - * - * @return resource - */ - private function createStream( - RequestInterface $request, - &$http_response_header - ) { - static $methods; - if (!$methods) { - $methods = array_flip(get_class_methods(__CLASS__)); - } - - $params = []; - $options = $this->getDefaultOptions($request); - foreach ($request->getConfig()->toArray() as $key => $value) { - $method = "add_{$key}"; - if (isset($methods[$method])) { - $this->{$method}($request, $options, $value, $params); - } - } - - $this->applyCustomOptions($request, $options); - $context = $this->createStreamContext($request, $options, $params); - - return $this->createStreamResource( - $request, - $options, - $context, - $http_response_header - ); - } - - private function getDefaultOptions(RequestInterface $request) - { - $headers = ''; - foreach ($request->getHeaders() as $name => $values) { - $headers .= $name . ': ' . implode(', ', $values) . "\r\n"; - } - - return [ - 'http' => [ - 'method' => $request->getMethod(), - 'header' => trim($headers), - 'protocol_version' => $request->getProtocolVersion(), - 'ignore_errors' => true, - 'follow_location' => 0, - 'content' => (string) $request->getBody() - ] - ]; - } - - private function add_proxy(RequestInterface $request, &$options, $value, &$params) - { - if (!is_array($value)) { - $options['http']['proxy'] = $value; - $options['http']['request_fulluri'] = true; - } else { - $scheme = $request->getScheme(); - if (isset($value[$scheme])) { - $options['http']['proxy'] = $value[$scheme]; - $options['http']['request_fulluri'] = true; - } - } - } - - private function add_timeout(RequestInterface $request, &$options, $value, &$params) - { - $options['http']['timeout'] = $value; - } - - private function add_verify(RequestInterface $request, &$options, $value, &$params) - { - if ($value === true || is_string($value)) { - $options['http']['verify_peer'] = true; - if ($value !== true) { - if (!file_exists($value)) { - throw new \RuntimeException("SSL certificate authority file not found: {$value}"); - } - $options['http']['allow_self_signed'] = true; - $options['http']['cafile'] = $value; - } - } elseif ($value === false) { - $options['http']['verify_peer'] = false; - } - } - - private function add_cert(RequestInterface $request, &$options, $value, &$params) - { - if (is_array($value)) { - $options['http']['passphrase'] = $value[1]; - $value = $value[0]; - } - - if (!file_exists($value)) { - throw new \RuntimeException("SSL certificate not found: {$value}"); - } - - $options['http']['local_cert'] = $value; - } - - private function add_debug(RequestInterface $request, &$options, $value, &$params) - { - static $map = [ - STREAM_NOTIFY_CONNECT => 'CONNECT', - STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED', - STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT', - STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS', - STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS', - STREAM_NOTIFY_REDIRECTED => 'REDIRECTED', - STREAM_NOTIFY_PROGRESS => 'PROGRESS', - STREAM_NOTIFY_FAILURE => 'FAILURE', - STREAM_NOTIFY_COMPLETED => 'COMPLETED', - STREAM_NOTIFY_RESOLVE => 'RESOLVE' - ]; - - static $args = ['severity', 'message', 'message_code', - 'bytes_transferred', 'bytes_max']; - - if (!is_resource($value)) { - $value = fopen('php://output', 'w'); - } - - $params['notification'] = function () use ($request, $value, $map, $args) { - $passed = func_get_args(); - $code = array_shift($passed); - fprintf($value, '<%s> [%s] ', $request->getUrl(), $map[$code]); - foreach (array_filter($passed) as $i => $v) { - fwrite($value, $args[$i] . ': "' . $v . '" '); - } - fwrite($value, "\n"); - }; - } - - private function applyCustomOptions( - RequestInterface $request, - array &$options - ) { - // Overwrite any generated options with custom options - if ($custom = $request->getConfig()['stream_context']) { - if (!is_array($custom)) { - throw new AdapterException('stream_context must be an array'); - } - $options = array_replace_recursive($options, $custom); - } - } - - private function createStreamContext( - RequestInterface $request, - array $options, - array $params - ) { - return $this->createResource(function () use ( - $request, - $options, - $params - ) { - return stream_context_create($options, $params); - }, $request, $options); - } - - private function createStreamResource( - RequestInterface $request, - array $options, - $context, - &$http_response_header - ) { - $url = $request->getUrl(); - // Add automatic gzip decompression - if (strpos($request->getHeader('Accept-Encoding'), 'gzip') !== false) { - $url = 'compress.zlib://' . $url; - } - - return $this->createResource(function () use ( - $url, - &$http_response_header, - $context - ) { - if (false === strpos($url, 'http')) { - trigger_error("URL is invalid: {$url}", E_USER_WARNING); - return null; - } - return fopen($url, 'r', null, $context); - }, $request, $options); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/StreamingProxyAdapter.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/StreamingProxyAdapter.php deleted file mode 100755 index 128eb1d1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/StreamingProxyAdapter.php +++ /dev/null @@ -1,36 +0,0 @@ -defaultAdapter = $defaultAdapter; - $this->streamingAdapter = $streamingAdapter; - } - - public function send(TransactionInterface $transaction) - { - return $transaction->getRequest()->getConfig()['stream'] - ? $this->streamingAdapter->send($transaction) - : $this->defaultAdapter->send($transaction); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Transaction.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Transaction.php deleted file mode 100755 index 74bb6b44..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/Transaction.php +++ /dev/null @@ -1,49 +0,0 @@ -client = $client; - $this->request = $request; - } - - public function getRequest() - { - return $this->request; - } - - public function getResponse() - { - return $this->response; - } - - public function setResponse(ResponseInterface $response) - { - $this->response = $response; - } - - public function getClient() - { - return $this->client; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/TransactionInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/TransactionInterface.php deleted file mode 100755 index b9bf50cb..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Adapter/TransactionInterface.php +++ /dev/null @@ -1,35 +0,0 @@ -client = $client; - $this->eventListeners = $this->prepareListeners( - $options, - ['before', 'complete', 'error'] - ); - if ($source instanceof \Iterator) { - $this->source = $source; - } elseif (is_array($source)) { - $this->source = new \ArrayIterator($source); - } else { - throw new \InvalidArgumentException('Expected an Iterator or array'); - } - } - - public function current() - { - $request = $this->source->current(); - if (!$request instanceof RequestInterface) { - throw new \RuntimeException('All must implement RequestInterface'); - } - - $this->attachListeners($request, $this->eventListeners); - - return new Transaction($this->client, $request); - } - - public function next() - { - $this->source->next(); - } - - public function key() - { - return $this->source->key(); - } - - public function valid() - { - return $this->source->valid(); - } - - public function rewind() {} -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Client.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Client.php deleted file mode 100755 index 898157e1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Client.php +++ /dev/null @@ -1,364 +0,0 @@ - [ - * 'http://www.foo.com/{version}/', - * ['version' => '123'] - * ], - * 'defaults' => [ - * 'timeout' => 10, - * 'allow_redirects' => false, - * 'proxy' => '192.168.16.1:10' - * ] - * ]); - * - * @param array $config Client configuration settings - * - base_url: Base URL of the client that is merged into relative URLs. - * Can be a string or an array that contains a URI template followed - * by an associative array of expansion variables to inject into the - * URI template. - * - adapter: Adapter used to transfer requests - * - parallel_adapter: Adapter used to transfer requests in parallel - * - message_factory: Factory used to create request and response object - * - defaults: Default request options to apply to each request - * - emitter: Event emitter used for request events - */ - public function __construct(array $config = []) - { - $this->configureBaseUrl($config); - $this->configureDefaults($config); - $this->configureAdapter($config); - if (isset($config['emitter'])) { - $this->emitter = $config['emitter']; - } - } - - /** - * Get the default User-Agent string to use with Guzzle - * - * @return string - */ - public static function getDefaultUserAgent() - { - static $defaultAgent = ''; - if (!$defaultAgent) { - $defaultAgent = 'Guzzle/' . self::VERSION; - if (extension_loaded('curl')) { - $defaultAgent .= ' curl/' . curl_version()['version']; - } - $defaultAgent .= ' PHP/' . PHP_VERSION; - } - - return $defaultAgent; - } - - public function __call($name, $arguments) - { - return \GuzzleHttp\deprecation_proxy( - $this, - $name, - $arguments, - ['getEventDispatcher' => 'getEmitter'] - ); - } - - public function getDefaultOption($keyOrPath = null) - { - return $keyOrPath === null - ? $this->defaults - : \GuzzleHttp\get_path($this->defaults, $keyOrPath); - } - - public function setDefaultOption($keyOrPath, $value) - { - \GuzzleHttp\set_path($this->defaults, $keyOrPath, $value); - } - - public function getBaseUrl() - { - return (string) $this->baseUrl; - } - - public function createRequest($method, $url = null, array $options = []) - { - // Merge in default options - $options = array_replace_recursive($this->defaults, $options); - - // Use a clone of the client's emitter - $options['config']['emitter'] = clone $this->getEmitter(); - - $request = $this->messageFactory->createRequest( - $method, - $url ? (string) $this->buildUrl($url) : (string) $this->baseUrl, - $options - ); - - return $request; - } - - public function get($url = null, $options = []) - { - return $this->send($this->createRequest('GET', $url, $options)); - } - - public function head($url = null, array $options = []) - { - return $this->send($this->createRequest('HEAD', $url, $options)); - } - - public function delete($url = null, array $options = []) - { - return $this->send($this->createRequest('DELETE', $url, $options)); - } - - public function put($url = null, array $options = []) - { - return $this->send($this->createRequest('PUT', $url, $options)); - } - - public function patch($url = null, array $options = []) - { - return $this->send($this->createRequest('PATCH', $url, $options)); - } - - public function post($url = null, array $options = []) - { - return $this->send($this->createRequest('POST', $url, $options)); - } - - public function options($url = null, array $options = []) - { - return $this->send($this->createRequest('OPTIONS', $url, $options)); - } - - public function send(RequestInterface $request) - { - $transaction = new Transaction($this, $request); - try { - if ($response = $this->adapter->send($transaction)) { - return $response; - } - throw new \LogicException('No response was associated with the transaction'); - } catch (RequestException $e) { - throw $e; - } catch (\Exception $e) { - // Wrap exceptions in a RequestException to adhere to the interface - throw new RequestException($e->getMessage(), $request, null, $e); - } - } - - public function sendAll($requests, array $options = []) - { - if (!($requests instanceof TransactionIterator)) { - $requests = new TransactionIterator($requests, $this, $options); - } - - $this->parallelAdapter->sendAll( - $requests, - isset($options['parallel']) - ? $options['parallel'] - : self::DEFAULT_CONCURRENCY - ); - } - - /** - * Get an array of default options to apply to the client - * - * @return array - */ - protected function getDefaultOptions() - { - $settings = [ - 'allow_redirects' => true, - 'exceptions' => true, - 'verify' => __DIR__ . '/cacert.pem' - ]; - - // Use the bundled cacert if it is a regular file, or set to true if - // using a phar file (because curL and the stream wrapper can't read - // cacerts from the phar stream wrapper). Favor the ini setting over - // the system's cacert. - if (substr(__FILE__, 0, 7) == 'phar://') { - $settings['verify'] = ini_get('openssl.cafile') ?: true; - } - - // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set - if (isset($_SERVER['HTTP_PROXY'])) { - $settings['proxy']['http'] = $_SERVER['HTTP_PROXY']; - } - - if (isset($_SERVER['HTTPS_PROXY'])) { - $settings['proxy']['https'] = $_SERVER['HTTPS_PROXY']; - } - - return $settings; - } - - /** - * Expand a URI template and inherit from the base URL if it's relative - * - * @param string|array $url URL or URI template to expand - * - * @return string - */ - private function buildUrl($url) - { - if (!is_array($url)) { - if (strpos($url, '://')) { - return (string) $url; - } - return (string) $this->baseUrl->combine($url); - } elseif (strpos($url[0], '://')) { - return \GuzzleHttp\uri_template($url[0], $url[1]); - } - - return (string) $this->baseUrl->combine( - \GuzzleHttp\uri_template($url[0], $url[1]) - ); - } - - /** - * Get a default parallel adapter to use based on the environment - * - * @return ParallelAdapterInterface - */ - private function getDefaultParallelAdapter() - { - return extension_loaded('curl') - ? new MultiAdapter($this->messageFactory) - : new FakeParallelAdapter($this->adapter); - } - - /** - * Create a default adapter to use based on the environment - * @throws \RuntimeException - */ - private function getDefaultAdapter() - { - if (extension_loaded('curl')) { - $this->parallelAdapter = new MultiAdapter($this->messageFactory); - $this->adapter = function_exists('curl_reset') - ? new CurlAdapter($this->messageFactory) - : $this->parallelAdapter; - if (ini_get('allow_url_fopen')) { - $this->adapter = new StreamingProxyAdapter( - $this->adapter, - new StreamAdapter($this->messageFactory) - ); - } - } elseif (ini_get('allow_url_fopen')) { - $this->adapter = new StreamAdapter($this->messageFactory); - } else { - throw new \RuntimeException('Guzzle requires cURL, the ' - . 'allow_url_fopen ini setting, or a custom HTTP adapter.'); - } - } - - private function configureBaseUrl(&$config) - { - if (!isset($config['base_url'])) { - $this->baseUrl = new Url('', ''); - } elseif (is_array($config['base_url'])) { - $this->baseUrl = Url::fromString( - \GuzzleHttp\uri_template( - $config['base_url'][0], - $config['base_url'][1] - ) - ); - $config['base_url'] = (string) $this->baseUrl; - } else { - $this->baseUrl = Url::fromString($config['base_url']); - } - } - - private function configureDefaults($config) - { - if (!isset($config['defaults'])) { - $this->defaults = $this->getDefaultOptions(); - } else { - $this->defaults = array_replace( - $this->getDefaultOptions(), - $config['defaults'] - ); - } - - // Add the default user-agent header - if (!isset($this->defaults['headers'])) { - $this->defaults['headers'] = [ - 'User-Agent' => static::getDefaultUserAgent() - ]; - } elseif (!isset(array_change_key_case($this->defaults['headers'])['user-agent'])) { - // Add the User-Agent header if one was not already set - $this->defaults['headers']['User-Agent'] = static::getDefaultUserAgent(); - } - } - - private function configureAdapter(&$config) - { - if (isset($config['message_factory'])) { - $this->messageFactory = $config['message_factory']; - } else { - $this->messageFactory = new MessageFactory(); - } - if (isset($config['adapter'])) { - $this->adapter = $config['adapter']; - } else { - $this->getDefaultAdapter(); - } - // If no parallel adapter was explicitly provided and one was not - // defaulted when creating the default adapter, then create one now. - if (isset($config['parallel_adapter'])) { - $this->parallelAdapter = $config['parallel_adapter']; - } elseif (!$this->parallelAdapter) { - $this->parallelAdapter = $this->getDefaultParallelAdapter(); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/ClientInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/ClientInterface.php deleted file mode 100755 index b0e4cba7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/ClientInterface.php +++ /dev/null @@ -1,179 +0,0 @@ -data = $data; - } - - /** - * Create a new collection from an array, validate the keys, and add default - * values where missing - * - * @param array $config Configuration values to apply. - * @param array $defaults Default parameters - * @param array $required Required parameter names - * - * @return self - * @throws \InvalidArgumentException if a parameter is missing - */ - public static function fromConfig( - array $config = [], - array $defaults = [], - array $required = [] - ) { - $data = $config + $defaults; - - if ($missing = array_diff($required, array_keys($data))) { - throw new \InvalidArgumentException( - 'Config is missing the following keys: ' . - implode(', ', $missing)); - } - - return new self($data); - } - - /** - * Removes all key value pairs - * - * @return Collection - */ - public function clear() - { - $this->data = []; - - return $this; - } - - /** - * Get a specific key value. - * - * @param string $key Key to retrieve. - * - * @return mixed|null Value of the key or NULL - */ - public function get($key) - { - return isset($this->data[$key]) ? $this->data[$key] : null; - } - - /** - * Set a key value pair - * - * @param string $key Key to set - * @param mixed $value Value to set - * - * @return Collection Returns a reference to the object - */ - public function set($key, $value) - { - $this->data[$key] = $value; - - return $this; - } - - /** - * Add a value to a key. If a key of the same name has already been added, - * the key value will be converted into an array and the new value will be - * pushed to the end of the array. - * - * @param string $key Key to add - * @param mixed $value Value to add to the key - * - * @return Collection Returns a reference to the object. - */ - public function add($key, $value) - { - if (!array_key_exists($key, $this->data)) { - $this->data[$key] = $value; - } elseif (is_array($this->data[$key])) { - $this->data[$key][] = $value; - } else { - $this->data[$key] = array($this->data[$key], $value); - } - - return $this; - } - - /** - * Remove a specific key value pair - * - * @param string $key A key to remove - * - * @return Collection - */ - public function remove($key) - { - unset($this->data[$key]); - - return $this; - } - - /** - * Get all keys in the collection - * - * @return array - */ - public function getKeys() - { - return array_keys($this->data); - } - - /** - * Returns whether or not the specified key is present. - * - * @param string $key The key for which to check the existence. - * - * @return bool - */ - public function hasKey($key) - { - return array_key_exists($key, $this->data); - } - - /** - * Checks if any keys contains a certain value - * - * @param string $value Value to search for - * - * @return mixed Returns the key if the value was found FALSE if the value - * was not found. - */ - public function hasValue($value) - { - return array_search($value, $this->data, true); - } - - /** - * Replace the data of the object with the value of an array - * - * @param array $data Associative array of data - * - * @return Collection Returns a reference to the object - */ - public function replace(array $data) - { - $this->data = $data; - - return $this; - } - - /** - * Add and merge in a Collection or array of key value pair data. - * - * @param Collection|array $data Associative array of key value pair data - * - * @return Collection Returns a reference to the object. - */ - public function merge($data) - { - foreach ($data as $key => $value) { - $this->add($key, $value); - } - - return $this; - } - - /** - * Over write key value pairs in this collection with all of the data from - * an array or collection. - * - * @param array|\Traversable $data Values to override over this config - * - * @return self - */ - public function overwriteWith($data) - { - if (is_array($data)) { - $this->data = $data + $this->data; - } elseif ($data instanceof Collection) { - $this->data = $data->toArray() + $this->data; - } else { - foreach ($data as $key => $value) { - $this->data[$key] = $value; - } - } - - return $this; - } - - /** - * Returns a Collection containing all the elements of the collection after - * applying the callback function to each one. - * - * The callable should accept three arguments: - * - (string) $key - * - (string) $value - * - (array) $context - * - * The callable must return a the altered or unaltered value. - * - * @param callable $closure Map function to apply - * @param array $context Context to pass to the callable - * - * @return Collection - */ - public function map(callable $closure, array $context = []) - { - $collection = new static(); - foreach ($this as $key => $value) { - $collection[$key] = $closure($key, $value, $context); - } - - return $collection; - } - - /** - * Iterates over each key value pair in the collection passing them to the - * callable. If the callable returns true, the current value from input is - * returned into the result Collection. - * - * The callable must accept two arguments: - * - (string) $key - * - (string) $value - * - * @param callable $closure Evaluation function - * - * @return Collection - */ - public function filter(callable $closure) - { - $collection = new static(); - foreach ($this->data as $key => $value) { - if ($closure($key, $value)) { - $collection[$key] = $value; - } - } - - return $collection; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/CookieJar.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/CookieJar.php deleted file mode 100755 index 41348578..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/CookieJar.php +++ /dev/null @@ -1,249 +0,0 @@ -strictMode = $strictMode; - - foreach ($cookieArray as $cookie) { - if (!($cookieArray instanceof SetCookie)) { - $cookie = new SetCookie($cookie); - } - $this->setCookie($cookie); - } - } - - /** - * Create a new Cookie jar from an associative array and domain. - * - * @param array $cookies Cookies to create the jar from - * @param string $domain Domain to set the cookies to - * - * @return self - */ - public static function fromArray(array $cookies, $domain) - { - $cookieJar = new self(); - foreach ($cookies as $name => $value) { - $cookieJar->setCookie(new SetCookie([ - 'Domain' => $domain, - 'Name' => $name, - 'Value' => $value, - 'Discard' => true - ])); - } - - return $cookieJar; - } - - /** - * Quote the cookie value if it is not already quoted and it contains - * problematic characters. - * - * @param string $value Value that may or may not need to be quoted - * - * @return string - */ - public static function getCookieValue($value) - { - if (substr($value, 0, 1) !== '"' && - substr($value, -1, 1) !== '"' && - strpbrk($value, ';,') - ) { - $value = '"' . $value . '"'; - } - - return $value; - } - - public function toArray() - { - return array_map(function (SetCookie $cookie) { - return $cookie->toArray(); - }, $this->getIterator()->getArrayCopy()); - } - - public function clear($domain = null, $path = null, $name = null) - { - if (!$domain) { - $this->cookies = []; - return; - } elseif (!$path) { - $this->cookies = array_filter( - $this->cookies, - function (SetCookie $cookie) use ($path, $domain) { - return !$cookie->matchesDomain($domain); - } - ); - } elseif (!$name) { - $this->cookies = array_filter( - $this->cookies, - function (SetCookie $cookie) use ($path, $domain) { - return !($cookie->matchesPath($path) && - $cookie->matchesDomain($domain)); - } - ); - } else { - $this->cookies = array_filter( - $this->cookies, - function (SetCookie $cookie) use ($path, $domain, $name) { - return !($cookie->getName() == $name && - $cookie->matchesPath($path) && - $cookie->matchesDomain($domain)); - } - ); - } - } - - public function clearSessionCookies() - { - $this->cookies = array_filter( - $this->cookies, - function (SetCookie $cookie) { - return !$cookie->getDiscard() && $cookie->getExpires(); - } - ); - } - - public function setCookie(SetCookie $cookie) - { - // Only allow cookies with set and valid domain, name, value - $result = $cookie->validate(); - if ($result !== true) { - if ($this->strictMode) { - throw new \RuntimeException('Invalid cookie: ' . $result); - } else { - $this->removeCookieIfEmpty($cookie); - return false; - } - } - - // Resolve conflicts with previously set cookies - foreach ($this->cookies as $i => $c) { - - // Two cookies are identical, when their path, and domain are - // identical. - if ($c->getPath() != $cookie->getPath() || - $c->getDomain() != $cookie->getDomain() || - $c->getName() != $cookie->getName() - ) { - continue; - } - - // The previously set cookie is a discard cookie and this one is - // not so allow the new cookie to be set - if (!$cookie->getDiscard() && $c->getDiscard()) { - unset($this->cookies[$i]); - continue; - } - - // If the new cookie's expiration is further into the future, then - // replace the old cookie - if ($cookie->getExpires() > $c->getExpires()) { - unset($this->cookies[$i]); - continue; - } - - // If the value has changed, we better change it - if ($cookie->getValue() !== $c->getValue()) { - unset($this->cookies[$i]); - continue; - } - - // The cookie exists, so no need to continue - return false; - } - - $this->cookies[] = $cookie; - - return true; - } - - public function count() - { - return count($this->cookies); - } - - public function getIterator() - { - return new \ArrayIterator(array_values($this->cookies)); - } - - public function extractCookies( - RequestInterface $request, - ResponseInterface $response - ) { - if ($cookieHeader = $response->getHeader('Set-Cookie', true)) { - foreach ($cookieHeader as $cookie) { - $sc = SetCookie::fromString($cookie); - if (!$sc->getDomain()) { - $sc->setDomain($request->getHost()); - } - $this->setCookie($sc); - } - } - } - - public function addCookieHeader(RequestInterface $request) - { - $values = []; - $scheme = $request->getScheme(); - $host = $request->getHost(); - $path = $request->getPath(); - - foreach ($this->cookies as $cookie) { - if ($cookie->matchesPath($path) && - $cookie->matchesDomain($host) && - !$cookie->isExpired() && - (!$cookie->getSecure() || $scheme == 'https') - ) { - $values[] = $cookie->getName() . '=' - . self::getCookieValue($cookie->getValue()); - } - } - - if ($values) { - $request->setHeader('Cookie', implode(';', $values)); - } - } - - /** - * If a cookie already exists and the server asks to set it again with a - * null value, the cookie must be deleted. - * - * @param SetCookie $cookie - */ - private function removeCookieIfEmpty(SetCookie $cookie) - { - $cookieValue = $cookie->getValue(); - if ($cookieValue === null || $cookieValue === '') { - $this->clear( - $cookie->getDomain(), - $cookie->getPath(), - $cookie->getName() - ); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/CookieJarInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/CookieJarInterface.php deleted file mode 100755 index 6cafce8c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/CookieJarInterface.php +++ /dev/null @@ -1,76 +0,0 @@ -filename = $cookieFile; - - if (file_exists($cookieFile)) { - $this->load($cookieFile); - } - } - - /** - * Saves the file when shutting down - */ - public function __destruct() - { - $this->save($this->filename); - } - - /** - * Saves the cookies to a file. - * - * @param string $filename File to save - * @throws \RuntimeException if the file cannot be found or created - */ - public function save($filename) - { - $json = []; - foreach ($this as $cookie) { - if ($cookie->getExpires() && !$cookie->getDiscard()) { - $json[] = $cookie->toArray(); - } - } - - if (false === file_put_contents($filename, json_encode($json))) { - // @codeCoverageIgnoreStart - throw new \RuntimeException("Unable to save file {$filename}"); - // @codeCoverageIgnoreEnd - } - } - - /** - * Load cookies from a JSON formatted file. - * - * Old cookies are kept unless overwritten by newly loaded ones. - * - * @param string $filename Cookie file to load. - * @throws \RuntimeException if the file cannot be loaded. - */ - public function load($filename) - { - $json = file_get_contents($filename); - if (false === $json) { - // @codeCoverageIgnoreStart - throw new \RuntimeException("Unable to load file {$filename}"); - // @codeCoverageIgnoreEnd - } - - $data = \GuzzleHttp\json_decode($json, true); - if (is_array($data)) { - foreach (\GuzzleHttp\json_decode($json, true) as $cookie) { - $this->setCookie(new SetCookie($cookie)); - } - } elseif (strlen($data)) { - throw new \RuntimeException("Invalid cookie file: {$filename}"); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/SessionCookieJar.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/SessionCookieJar.php deleted file mode 100755 index 2f708d74..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/SessionCookieJar.php +++ /dev/null @@ -1,65 +0,0 @@ -sessionKey = $sessionKey; - $this->load(); - } - - /** - * Saves cookies to session when shutting down - */ - public function __destruct() - { - $this->save(); - } - - /** - * Save cookies to the client session - */ - public function save() - { - $json = []; - foreach ($this as $cookie) { - if ($cookie->getExpires() && !$cookie->getDiscard()) { - $json[] = $cookie->toArray(); - } - } - - $_SESSION[$this->sessionKey] = json_encode($json); - } - - /** - * Load the contents of the client session into the data array - */ - protected function load() - { - $cookieJar = isset($_SESSION[$this->sessionKey]) - ? $_SESSION[$this->sessionKey] - : null; - - $data = \GuzzleHttp\json_decode($cookieJar, true); - if (is_array($data)) { - foreach ($data as $cookie) { - $this->setCookie(new SetCookie($cookie)); - } - } elseif (strlen($data)) { - throw new \RuntimeException("Invalid cookie data"); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/SetCookie.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/SetCookie.php deleted file mode 100755 index 76f6f8d1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Cookie/SetCookie.php +++ /dev/null @@ -1,410 +0,0 @@ - null, - 'Value' => null, - 'Domain' => null, - 'Path' => '/', - 'Max-Age' => null, - 'Expires' => null, - 'Secure' => false, - 'Discard' => false, - 'HttpOnly' => false - ]; - - /** @var array Cookie data */ - private $data; - - /** - * Create a new SetCookie object from a string - * - * @param string $cookie Set-Cookie header string - * - * @return self - */ - public static function fromString($cookie) - { - // Create the default return array - $data = self::$defaults; - // Explode the cookie string using a series of semicolons - $pieces = array_filter(array_map('trim', explode(';', $cookie))); - // The name of the cookie (first kvp) must include an equal sign. - if (empty($pieces) || !strpos($pieces[0], '=')) { - return new self($data); - } - - // Add the cookie pieces into the parsed data array - foreach ($pieces as $part) { - - $cookieParts = explode('=', $part, 2); - $key = trim($cookieParts[0]); - $value = isset($cookieParts[1]) - ? trim($cookieParts[1], " \n\r\t\0\x0B\"") - : true; - - // Only check for non-cookies when cookies have been found - if (empty($data['Name'])) { - $data['Name'] = $key; - $data['Value'] = $value; - } else { - foreach (array_keys(self::$defaults) as $search) { - if (!strcasecmp($search, $key)) { - $data[$search] = $value; - continue 2; - } - } - $data[$key] = $value; - } - } - - return new self($data); - } - - /** - * @param array $data Array of cookie data provided by a Cookie parser - */ - public function __construct(array $data = []) - { - $this->data = array_replace(self::$defaults, $data); - // Extract the Expires value and turn it into a UNIX timestamp if needed - if (!$this->getExpires() && $this->getMaxAge()) { - // Calculate the Expires date - $this->setExpires(time() + $this->getMaxAge()); - } elseif ($this->getExpires() && !is_numeric($this->getExpires())) { - $this->setExpires($this->getExpires()); - } - } - - public function __toString() - { - $str = $this->data['Name'] . '=' . $this->data['Value'] . '; '; - foreach ($this->data as $k => $v) { - if ($k != 'Name' && $k != 'Value'&& $v !== null && $v !== false) { - if ($k == 'Expires') { - $str .= 'Expires=' . gmdate('D, d M Y H:i:s \G\M\T', $v) . '; '; - } else { - $str .= ($v === true ? $k : "{$k}={$v}") . '; '; - } - } - } - - return rtrim($str, '; '); - } - - public function toArray() - { - return $this->data; - } - - /** - * Get the cookie name - * - * @return string - */ - public function getName() - { - return $this->data['Name']; - } - - /** - * Set the cookie name - * - * @param string $name Cookie name - * - * @return self - */ - public function setName($name) - { - $this->data['Name'] = $name; - - return $this; - } - - /** - * Get the cookie value - * - * @return string - */ - public function getValue() - { - return $this->data['Value']; - } - - /** - * Set the cookie value - * - * @param string $value Cookie value - * - * @return self - */ - public function setValue($value) - { - $this->data['Value'] = $value; - - return $this; - } - - /** - * Get the domain - * - * @return string|null - */ - public function getDomain() - { - return $this->data['Domain']; - } - - /** - * Set the domain of the cookie - * - * @param string $domain - * - * @return self - */ - public function setDomain($domain) - { - $this->data['Domain'] = $domain; - - return $this; - } - - /** - * Get the path - * - * @return string - */ - public function getPath() - { - return $this->data['Path']; - } - - /** - * Set the path of the cookie - * - * @param string $path Path of the cookie - * - * @return self - */ - public function setPath($path) - { - $this->data['Path'] = $path; - - return $this; - } - - /** - * Maximum lifetime of the cookie in seconds - * - * @return int|null - */ - public function getMaxAge() - { - return $this->data['Max-Age']; - } - - /** - * Set the max-age of the cookie - * - * @param int $maxAge Max age of the cookie in seconds - * - * @return self - */ - public function setMaxAge($maxAge) - { - $this->data['Max-Age'] = $maxAge; - - return $this; - } - - /** - * The UNIX timestamp when the cookie Expires - * - * @return mixed - */ - public function getExpires() - { - return $this->data['Expires']; - } - - /** - * Set the unix timestamp for which the cookie will expire - * - * @param int $timestamp Unix timestamp - * - * @return self - */ - public function setExpires($timestamp) - { - $this->data['Expires'] = is_numeric($timestamp) - ? (int) $timestamp - : strtotime($timestamp); - - return $this; - } - - /** - * Get whether or not this is a secure cookie - * - * @return null|bool - */ - public function getSecure() - { - return $this->data['Secure']; - } - - /** - * Set whether or not the cookie is secure - * - * @param bool $secure Set to true or false if secure - * - * @return self - */ - public function setSecure($secure) - { - $this->data['Secure'] = $secure; - - return $this; - } - - /** - * Get whether or not this is a session cookie - * - * @return null|bool - */ - public function getDiscard() - { - return $this->data['Discard']; - } - - /** - * Set whether or not this is a session cookie - * - * @param bool $discard Set to true or false if this is a session cookie - * - * @return self - */ - public function setDiscard($discard) - { - $this->data['Discard'] = $discard; - - return $this; - } - - /** - * Get whether or not this is an HTTP only cookie - * - * @return bool - */ - public function getHttpOnly() - { - return $this->data['HttpOnly']; - } - - /** - * Set whether or not this is an HTTP only cookie - * - * @param bool $httpOnly Set to true or false if this is HTTP only - * - * @return self - */ - public function setHttpOnly($httpOnly) - { - $this->data['HttpOnly'] = $httpOnly; - - return $this; - } - - /** - * Check if the cookie matches a path value - * - * @param string $path Path to check against - * - * @return bool - */ - public function matchesPath($path) - { - return !$this->getPath() || 0 === stripos($path, $this->getPath()); - } - - /** - * Check if the cookie matches a domain value - * - * @param string $domain Domain to check against - * - * @return bool - */ - public function matchesDomain($domain) - { - // Remove the leading '.' as per spec in RFC 6265. - // http://tools.ietf.org/html/rfc6265#section-5.2.3 - $cookieDomain = ltrim($this->getDomain(), '.'); - - // Domain not set or exact match. - if (!$cookieDomain || !strcasecmp($domain, $cookieDomain)) { - return true; - } - - // Matching the subdomain according to RFC 6265. - // http://tools.ietf.org/html/rfc6265#section-5.1.3 - if (filter_var($domain, FILTER_VALIDATE_IP)) { - return false; - } - - return (bool) preg_match('/\.' . preg_quote($cookieDomain) . '$/i', $domain); - } - - /** - * Check if the cookie is expired - * - * @return bool - */ - public function isExpired() - { - return $this->getExpires() && time() > $this->getExpires(); - } - - /** - * Check if the cookie is valid according to RFC 6265 - * - * @return bool|string Returns true if valid or an error message if invalid - */ - public function validate() - { - // Names must not be empty, but can be 0 - $name = $this->getName(); - if (empty($name) && !is_numeric($name)) { - return 'The cookie name must not be empty'; - } - - // Check if any of the invalid characters are present in the cookie name - if (preg_match("/[=,; \t\r\n\013\014]/", $name)) { - return "Cookie name must not cannot invalid characters: =,; \\t\\r\\n\\013\\014"; - } - - // Value must not be empty, but can be 0 - $value = $this->getValue(); - if (empty($value) && !is_numeric($value)) { - return 'The cookie value must not be empty'; - } - - // Domains must not be empty, but can be 0 - // A "0" is not a valid internet domain, but may be used as server name - // in a private network. - $domain = $this->getDomain(); - if (empty($domain) && !is_numeric($domain)) { - return 'The cookie domain must not be empty'; - } - - return true; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractEvent.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractEvent.php deleted file mode 100755 index fa1453c8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractEvent.php +++ /dev/null @@ -1,21 +0,0 @@ -propagationStopped; - } - - public function stopPropagation() - { - $this->propagationStopped = true; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractRequestEvent.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractRequestEvent.php deleted file mode 100755 index d188248a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractRequestEvent.php +++ /dev/null @@ -1,49 +0,0 @@ -transaction = $transaction; - } - - /** - * Get the client associated with the event - * - * @return ClientInterface - */ - public function getClient() - { - return $this->transaction->getClient(); - } - - /** - * Get the request object - * - * @return RequestInterface - */ - public function getRequest() - { - return $this->transaction->getRequest(); - } - - /** - * @return TransactionInterface - */ - protected function getTransaction() - { - return $this->transaction; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractTransferEvent.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractTransferEvent.php deleted file mode 100755 index dba1f98e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/AbstractTransferEvent.php +++ /dev/null @@ -1,83 +0,0 @@ -transferInfo = $transferInfo; - } - - /** - * Get all transfer information as an associative array if no $name - * argument is supplied, or gets a specific transfer statistic if - * a $name attribute is supplied (e.g., 'total_time'). - * - * @param string $name Name of the transfer stat to retrieve - * - * @return mixed|null|array - */ - public function getTransferInfo($name = null) - { - if (!$name) { - return $this->transferInfo; - } - - return isset($this->transferInfo[$name]) - ? $this->transferInfo[$name] - : null; - } - - /** - * Get the response - * - * @return ResponseInterface|null - */ - abstract public function getResponse(); - - /** - * Intercept the request and associate a response - * - * @param ResponseInterface $response Response to set - */ - abstract public function intercept(ResponseInterface $response); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/BeforeEvent.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/BeforeEvent.php deleted file mode 100755 index 34a7811d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/BeforeEvent.php +++ /dev/null @@ -1,26 +0,0 @@ -getTransaction()->setResponse($response); - $this->stopPropagation(); - RequestEvents::emitComplete($this->getTransaction()); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/CompleteEvent.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/CompleteEvent.php deleted file mode 100755 index 34457600..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/CompleteEvent.php +++ /dev/null @@ -1,35 +0,0 @@ -stopPropagation(); - $this->getTransaction()->setResponse($response); - } - - /** - * Get the response of the request - * - * @return ResponseInterface - */ - public function getResponse() - { - return $this->getTransaction()->getResponse(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/Emitter.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/Emitter.php deleted file mode 100755 index 49172bcb..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/Emitter.php +++ /dev/null @@ -1,147 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link https://github.com/symfony/symfony/tree/master/src/Symfony/Component/EventDispatcher - */ -class Emitter implements EmitterInterface -{ - /** @var array */ - private $listeners = []; - - /** @var array */ - private $sorted = []; - - public function on($eventName, callable $listener, $priority = 0) - { - if ($priority === 'first') { - $priority = isset($this->listeners[$eventName]) - ? max(array_keys($this->listeners[$eventName])) + 1 - : 1; - } elseif ($priority === 'last') { - $priority = isset($this->listeners[$eventName]) - ? min(array_keys($this->listeners[$eventName])) - 1 - : -1; - } - - $this->listeners[$eventName][$priority][] = $listener; - unset($this->sorted[$eventName]); - } - - public function once($eventName, callable $listener, $priority = 0) - { - $onceListener = function ( - EventInterface $event, - $eventName - ) use (&$onceListener, $eventName, $listener, $priority) { - $this->removeListener($eventName, $onceListener); - $listener($event, $eventName, $this); - }; - - $this->on($eventName, $onceListener, $priority); - } - - public function removeListener($eventName, callable $listener) - { - if (!isset($this->listeners[$eventName])) { - return; - } - - foreach ($this->listeners[$eventName] as $priority => $listeners) { - if (false !== ($key = array_search($listener, $listeners, true))) { - unset( - $this->listeners[$eventName][$priority][$key], - $this->sorted[$eventName] - ); - } - } - } - - public function listeners($eventName = null) - { - // Return all events in a sorted priority order - if ($eventName === null) { - foreach (array_keys($this->listeners) as $eventName) { - if (!isset($this->sorted[$eventName])) { - $this->listeners($eventName); - } - } - return $this->sorted; - } - - // Return the listeners for a specific event, sorted in priority order - if (!isset($this->sorted[$eventName])) { - if (!isset($this->listeners[$eventName])) { - return []; - } else { - krsort($this->listeners[$eventName]); - $this->sorted[$eventName] = call_user_func_array( - 'array_merge', - $this->listeners[$eventName] - ); - } - } - - return $this->sorted[$eventName]; - } - - public function emit($eventName, EventInterface $event) - { - if (isset($this->listeners[$eventName])) { - foreach ($this->listeners($eventName) as $listener) { - $listener($event, $eventName); - if ($event->isPropagationStopped()) { - break; - } - } - } - - return $event; - } - - public function attach(SubscriberInterface $subscriber) - { - foreach ($subscriber->getEvents() as $eventName => $listener) { - $this->on( - $eventName, - array($subscriber, $listener[0]), - isset($listener[1]) ? $listener[1] : 0 - ); - } - } - - public function detach(SubscriberInterface $subscriber) - { - foreach ($subscriber->getEvents() as $eventName => $listener) { - $this->removeListener($eventName, array($subscriber, $listener[0])); - } - } - - public function __call($name, $arguments) - { - return \GuzzleHttp\deprecation_proxy( - $this, - $name, - $arguments, - [ - 'addSubscriber' => 'attach', - 'removeSubscriber' => 'detach', - 'addListener' => 'on', - 'dispatch' => 'emit' - ] - ); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/EmitterInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/EmitterInterface.php deleted file mode 100755 index 0181e7fe..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/EmitterInterface.php +++ /dev/null @@ -1,88 +0,0 @@ -exception = $e; - } - - /** - * Intercept the exception and inject a response - * - * @param ResponseInterface $response Response to set - */ - public function intercept(ResponseInterface $response) - { - $this->stopPropagation(); - $this->getTransaction()->setResponse($response); - RequestEvents::emitComplete($this->getTransaction()); - } - - /** - * Get the exception that was encountered - * - * @return RequestException - */ - public function getException() - { - return $this->exception; - } - - /** - * Get the response the was received (if any) - * - * @return ResponseInterface|null - */ - public function getResponse() - { - return $this->getException()->getResponse(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/EventInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/EventInterface.php deleted file mode 100755 index bf58f8b5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/EventInterface.php +++ /dev/null @@ -1,24 +0,0 @@ -emitter) { - $this->emitter = new Emitter(); - } - - return $this->emitter; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/HeadersEvent.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/HeadersEvent.php deleted file mode 100755 index 81274ff8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/HeadersEvent.php +++ /dev/null @@ -1,39 +0,0 @@ -getResponse()) { - throw new \RuntimeException('A response must be present'); - } - } - - /** - * Get the response the was received - * - * @return ResponseInterface - */ - public function getResponse() - { - return $this->getTransaction()->getResponse(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/ListenerAttacherTrait.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/ListenerAttacherTrait.php deleted file mode 100755 index 637cdaea..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/ListenerAttacherTrait.php +++ /dev/null @@ -1,89 +0,0 @@ -getEmitter(); - foreach ($listeners as $el) { - if ($el['once']) { - $emitter->once($el['name'], $el['fn'], $el['priority']); - } else { - $emitter->on($el['name'], $el['fn'], $el['priority']); - } - } - } - - /** - * Extracts the allowed events from the provided array, and ignores anything - * else in the array. The event listener must be specified as a callable or - * as an array of event listener data ("name", "fn", "priority", "once"). - * - * @param array $source Array containing callables or hashes of data to be - * prepared as event listeners. - * @param array $events Names of events to look for in the provided $source - * array. Other keys are ignored. - * @return array - */ - private function prepareListeners(array $source, array $events) - { - $listeners = []; - foreach ($events as $name) { - if (isset($source[$name])) { - $this->buildListener($name, $source[$name], $listeners); - } - } - - return $listeners; - } - - /** - * Creates a complete event listener definition from the provided array of - * listener data. Also works recursively if more than one listeners are - * contained in the provided array. - * - * @param string $name Name of the event the listener is for. - * @param array|callable $data Event listener data to prepare. - * @param array $listeners Array of listeners, passed by reference. - * - * @throws \InvalidArgumentException if the event data is malformed. - */ - private function buildListener($name, $data, &$listeners) - { - static $defaults = ['priority' => 0, 'once' => false]; - - // If a callable is provided, normalize it to the array format. - if (is_callable($data)) { - $data = ['fn' => $data]; - } - - // Prepare the listener and add it to the array, recursively. - if (isset($data['fn'])) { - $data['name'] = $name; - $listeners[] = $data + $defaults; - } elseif (is_array($data)) { - foreach ($data as $listenerData) { - $this->buildListener($name, $listenerData, $listeners); - } - } else { - throw new \InvalidArgumentException('Each event listener must be a ' - . 'callable or an associative array containing a "fn" key.'); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/RequestEvents.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/RequestEvents.php deleted file mode 100755 index 654e8ad0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/RequestEvents.php +++ /dev/null @@ -1,162 +0,0 @@ -getRequest(); - try { - $request->getEmitter()->emit( - 'before', - new BeforeEvent($transaction) - ); - } catch (RequestException $e) { - // When a RequestException has been emitted through emitError, the - // exception is marked as "emitted". This means that the exception - // had a chance to be rescued but was not. In this case, this method - // must not emit the error again, but rather throw the exception. - // This prevents RequestExceptions encountered during the before - // event from being emitted to listeners twice. - if ($e->emittedError()) { - throw $e; - } - self::emitError($transaction, $e); - } catch (\Exception $e) { - self::emitError($transaction, $e); - } - } - - /** - * Emits the complete event for a request and emits an error - * event if an error is encountered during the after send. - * - * @param TransactionInterface $transaction Transaction to emit for - * @param array $stats Transfer stats - * - * @throws RequestException - */ - public static function emitComplete( - TransactionInterface $transaction, - array $stats = [] - ) { - $request = $transaction->getRequest(); - $transaction->getResponse()->setEffectiveUrl($request->getUrl()); - try { - $request->getEmitter()->emit( - 'complete', - new CompleteEvent($transaction, $stats) - ); - } catch (RequestException $e) { - self::emitError($transaction, $e, $stats); - } - } - - /** - * Emits the headers event for a request. - * - * @param TransactionInterface $transaction Transaction to emit for - */ - public static function emitHeaders(TransactionInterface $transaction) - { - $transaction->getRequest()->getEmitter()->emit( - 'headers', - new HeadersEvent($transaction) - ); - } - - /** - * Emits an error event for a request and accounts for the propagation - * of an error event being stopped to prevent the exception from being - * thrown. - * - * @param TransactionInterface $transaction - * @param \Exception $e - * @param array $stats - * - * @throws \GuzzleHttp\Exception\RequestException - */ - public static function emitError( - TransactionInterface $transaction, - \Exception $e, - array $stats = [] - ) { - $request = $transaction->getRequest(); - - // Convert non-request exception to a wrapped exception - if (!($e instanceof RequestException)) { - $e = new RequestException($e->getMessage(), $request, null, $e); - } - - // Mark the exception as having been emitted for an error event. This - // works in tandem with the emitBefore method to prevent the error - // event from being triggered twice for the same exception. - $e->emittedError(true); - - // Dispatch an event and allow interception - if (!$request->getEmitter()->emit( - 'error', - new ErrorEvent($transaction, $e, $stats) - )->isPropagationStopped()) { - throw $e; - } - } - - /** - * Converts an array of event options into a formatted array of valid event - * configuration. - * - * @param array $options Event array to convert - * @param array $events Event names to convert in the options array. - * @param mixed $handler Event handler to utilize - * - * @return array - * @throws \InvalidArgumentException if the event config is invalid - * @internal - */ - public static function convertEventArray( - array $options, - array $events, - $handler - ) { - foreach ($events as $name) { - if (!isset($options[$name])) { - $options[$name] = $handler; - } elseif (is_callable($options[$name])) { - $options[$name] = [['fn' => $options[$name]], $handler]; - } elseif (is_array($options[$name])) { - $options[$name][] = $handler; - } else { - throw new \InvalidArgumentException('Invalid event format'); - } - } - - return $options; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/SubscriberInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/SubscriberInterface.php deleted file mode 100755 index 22c73119..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Event/SubscriberInterface.php +++ /dev/null @@ -1,31 +0,0 @@ - ['methodName']] - * - ['eventName' => ['methodName', $priority]] - * - * @return array - */ - public function getEvents(); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/AdapterException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/AdapterException.php deleted file mode 100755 index 55334c46..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/AdapterException.php +++ /dev/null @@ -1,5 +0,0 @@ -response = $response; - } - /** - * Get the associated response - * - * @return ResponseInterface|null - */ - public function getResponse() - { - return $this->response; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/RequestException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/RequestException.php deleted file mode 100755 index ee953a9c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/RequestException.php +++ /dev/null @@ -1,124 +0,0 @@ -getStatusCode() : 0; - parent::__construct($message, $code, $previous); - $this->request = $request; - $this->response = $response; - } - - /** - * Factory method to create a new exception with a normalized error message - * - * @param RequestInterface $request Request - * @param ResponseInterface $response Response received - * @param \Exception $previous Previous exception - * - * @return self - */ - public static function create( - RequestInterface $request, - ResponseInterface $response = null, - \Exception $previous = null - ) { - if (!$response) { - return new self('Error completing request', $request, null, $previous); - } - - $level = $response->getStatusCode()[0]; - if ($level == '4') { - $label = 'Client error response'; - $className = __NAMESPACE__ . '\\ClientException'; - } elseif ($level == '5') { - $label = 'Server error response'; - $className = __NAMESPACE__ . '\\ServerException'; - } else { - $label = 'Unsuccessful response'; - $className = __CLASS__; - } - - $message = $label . ' [url] ' . $request->getUrl() - . ' [status code] ' . $response->getStatusCode() - . ' [reason phrase] ' . $response->getReasonPhrase(); - - return new $className($message, $request, $response, $previous); - } - - /** - * Get the request that caused the exception - * - * @return RequestInterface - */ - public function getRequest() - { - return $this->request; - } - - /** - * Get the associated response - * - * @return ResponseInterface|null - */ - public function getResponse() - { - return $this->response; - } - - /** - * Check if a response was received - * - * @return bool - */ - public function hasResponse() - { - return $this->response !== null; - } - - /** - * Check or set if the exception was emitted in an error event. - * - * This value is used in the RequestEvents::emitBefore() method to check - * to see if an exception has already been emitted in an error event. - * - * @param bool|null Set to true to set the exception as having emitted an - * error. Leave null to retrieve the current setting. - * - * @return null|bool - * @throws \InvalidArgumentException if you attempt to set the value to false - */ - public function emittedError($value = null) - { - if ($value === null) { - return $this->emittedErrorEvent; - } elseif ($value === true) { - return $this->emittedErrorEvent = true; - } else { - throw new \InvalidArgumentException('You cannot set the emitted ' - . 'error value to false.'); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/ServerException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/ServerException.php deleted file mode 100755 index d67ed27e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Exception/ServerException.php +++ /dev/null @@ -1,8 +0,0 @@ -data); - } - - public function offsetGet($offset) - { - return isset($this->data[$offset]) ? $this->data[$offset] : null; - } - - public function offsetSet($offset, $value) - { - $this->data[$offset] = $value; - } - - public function offsetExists($offset) - { - return isset($this->data[$offset]); - } - - public function offsetUnset($offset) - { - unset($this->data[$offset]); - } - - public function toArray() - { - return $this->data; - } - - public function count() - { - return count($this->data); - } - - /** - * Get a value from the collection using a path syntax to retrieve nested - * data. - * - * @param string $path Path to traverse and retrieve a value from - * - * @return mixed|null - */ - public function getPath($path) - { - return \GuzzleHttp\get_path($this->data, $path); - } - - /** - * Set a value into a nested array key. Keys will be created as needed to - * set the value. - * - * @param string $path Path to set - * @param mixed $value Value to set at the key - * - * @throws \RuntimeException when trying to setPath using a nested path - * that travels through a scalar value - */ - public function setPath($path, $value) - { - \GuzzleHttp\set_path($this->data, $path, $value); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/AbstractMessage.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/AbstractMessage.php deleted file mode 100755 index 6037a70e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/AbstractMessage.php +++ /dev/null @@ -1,237 +0,0 @@ -getStartLine(); - foreach ($this->getHeaders() as $name => $values) { - $result .= "\r\n{$name}: " . implode(', ', $values); - } - - return $result . "\r\n\r\n" . $this->body; - } - - public function getProtocolVersion() - { - return $this->protocolVersion; - } - - public function getBody() - { - return $this->body; - } - - public function setBody(StreamInterface $body = null) - { - if ($body === null) { - // Setting a null body will remove the body of the request - $this->removeHeader('Content-Length') - ->removeHeader('Transfer-Encoding'); - } - - $this->body = $body; - - return $this; - } - - public function addHeader($header, $value) - { - static $valid = ['string' => true, 'integer' => true, - 'double' => true, 'array' => true]; - - $type = gettype($value); - if (!isset($valid[$type])) { - throw new \InvalidArgumentException('Invalid header value'); - } - - if ($type == 'array') { - $current = array_merge($this->getHeader($header, true), $value); - } else { - $current = $this->getHeader($header, true); - $current[] = $value; - } - - return $this->setHeader($header, $current); - } - - public function addHeaders(array $headers) - { - foreach ($headers as $name => $header) { - $this->addHeader($name, $header); - } - } - - public function getHeader($header, $asArray = false) - { - $name = strtolower($header); - - if (!isset($this->headers[$name])) { - return $asArray ? [] : ''; - } - - return $asArray - ? $this->headers[$name] - : implode(', ', $this->headers[$name]); - } - - public function getHeaders() - { - $headers = []; - foreach ($this->headers as $name => $values) { - $headers[$this->headerNames[$name]] = $values; - } - - return $headers; - } - - public function setHeader($header, $value) - { - $header = trim($header); - $name = strtolower($header); - $this->headerNames[$name] = $header; - - switch (gettype($value)) { - case 'string': - $this->headers[$name] = [trim($value)]; - break; - case 'integer': - case 'double': - $this->headers[$name] = [(string) $value]; - break; - case 'array': - foreach ($value as &$v) { - $v = trim($v); - } - $this->headers[$name] = $value; - break; - default: - throw new \InvalidArgumentException('Invalid header value ' - . 'provided: ' . var_export($value, true)); - } - - return $this; - } - - public function setHeaders(array $headers) - { - $this->headers = $this->headerNames = []; - foreach ($headers as $key => $value) { - $this->setHeader($key, $value); - } - - return $this; - } - - public function hasHeader($header) - { - return isset($this->headers[strtolower($header)]); - } - - public function removeHeader($header) - { - $name = strtolower($header); - unset($this->headers[$name], $this->headerNames[$name]); - - return $this; - } - - /** - * Parse an array of header values containing ";" separated data into an - * array of associative arrays representing the header key value pair - * data of the header. When a parameter does not contain a value, but just - * contains a key, this function will inject a key with a '' string value. - * - * @param MessageInterface $message That contains the header - * @param string $header Header to retrieve from the message - * - * @return array Returns the parsed header values. - */ - public static function parseHeader(MessageInterface $message, $header) - { - static $trimmed = "\"' \n\t\r"; - $params = $matches = []; - - foreach (self::normalizeHeader($message, $header) as $val) { - $part = []; - foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) { - if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) { - $m = $matches[0]; - if (isset($m[1])) { - $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed); - } else { - $part[] = trim($m[0], $trimmed); - } - } - } - if ($part) { - $params[] = $part; - } - } - - return $params; - } - - /** - * Converts an array of header values that may contain comma separated - * headers into an array of headers with no comma separated values. - * - * @param MessageInterface $message That contains the header - * @param string $header Header to retrieve from the message - * - * @return array Returns the normalized header field values. - */ - public static function normalizeHeader(MessageInterface $message, $header) - { - $h = $message->getHeader($header, true); - for ($i = 0, $total = count($h); $i < $total; $i++) { - if (strpos($h[$i], ',') === false) { - continue; - } - foreach (preg_split('/,(?=([^"]*"[^"]*")*[^"]*$)/', $h[$i]) as $v) { - $h[] = trim($v); - } - unset($h[$i]); - } - - return $h; - } - - /** - * Returns the start line of a message. - * - * @return string - */ - abstract protected function getStartLine(); - - /** - * Accepts and modifies the options provided to the message in the - * constructor. - * - * Can be overridden in subclasses as necessary. - * - * @param array $options Options array passed by reference. - */ - protected function handleOptions(array &$options) - { - if (isset($options['protocol_version'])) { - $this->protocolVersion = $options['protocol_version']; - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageFactory.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageFactory.php deleted file mode 100755 index da67c385..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageFactory.php +++ /dev/null @@ -1,345 +0,0 @@ -errorPlugin = new HttpError(); - $this->redirectPlugin = new Redirect(); - } - - public function createResponse( - $statusCode, - array $headers = [], - $body = null, - array $options = [] - ) { - if (null !== $body) { - $body = Stream\create($body); - } - - return new Response($statusCode, $headers, $body, $options); - } - - public function createRequest($method, $url, array $options = []) - { - // Handle the request protocol version option that needs to be - // specified in the request constructor. - if (isset($options['version'])) { - $options['config']['protocol_version'] = $options['version']; - unset($options['version']); - } - - $request = new Request($method, $url, [], null, - isset($options['config']) ? $options['config'] : []); - - unset($options['config']); - - // Use a POST body by default - if ($method == 'POST' && - !isset($options['body']) && - !isset($options['json']) - ) { - $options['body'] = []; - } - - if ($options) { - $this->applyOptions($request, $options); - } - - return $request; - } - - /** - * Create a request or response object from an HTTP message string - * - * @param string $message Message to parse - * - * @return RequestInterface|ResponseInterface - * @throws \InvalidArgumentException if unable to parse a message - */ - public function fromMessage($message) - { - static $parser; - if (!$parser) { - $parser = new MessageParser(); - } - - // Parse a response - if (strtoupper(substr($message, 0, 4)) == 'HTTP') { - $data = $parser->parseResponse($message); - return $this->createResponse( - $data['code'], - $data['headers'], - $data['body'] === '' ? null : $data['body'], - $data - ); - } - - // Parse a request - if (!($data = ($parser->parseRequest($message)))) { - throw new \InvalidArgumentException('Unable to parse request'); - } - - return $this->createRequest( - $data['method'], - Url::buildUrl($data['request_url']), - [ - 'headers' => $data['headers'], - 'body' => $data['body'] === '' ? null : $data['body'], - 'config' => [ - 'protocol_version' => $data['protocol_version'] - ] - ] - ); - } - - /** - * Apply POST fields and files to a request to attempt to give an accurate - * representation. - * - * @param RequestInterface $request Request to update - * @param array $body Body to apply - */ - protected function addPostData(RequestInterface $request, array $body) - { - static $fields = ['string' => true, 'array' => true, 'NULL' => true, - 'boolean' => true, 'double' => true, 'integer' => true]; - - $post = new PostBody(); - foreach ($body as $key => $value) { - if (isset($fields[gettype($value)])) { - $post->setField($key, $value); - } elseif ($value instanceof PostFileInterface) { - $post->addFile($value); - } else { - $post->addFile(new PostFile($key, $value)); - } - } - - $request->setBody($post); - $post->applyRequestHeaders($request); - } - - protected function applyOptions( - RequestInterface $request, - array $options = [] - ) { - // Values specified in the config map are passed to request options - static $configMap = ['connect_timeout' => 1, 'timeout' => 1, - 'verify' => 1, 'ssl_key' => 1, 'cert' => 1, 'proxy' => 1, - 'debug' => 1, 'save_to' => 1, 'stream' => 1, 'expect' => 1]; - - // Take the class of the instance, not the parent - $selfClass = get_class($this); - - // Check if we already took it's class methods and had them saved - if (!isset(self::$classMethods[$selfClass])) { - self::$classMethods[$selfClass] = array_flip(get_class_methods($this)); - } - - // Take class methods of this particular instance - $methods = self::$classMethods[$selfClass]; - - // Iterate over each key value pair and attempt to apply a config using - // double dispatch. - $config = $request->getConfig(); - foreach ($options as $key => $value) { - $method = "add_{$key}"; - if (isset($methods[$method])) { - $this->{$method}($request, $value); - } elseif (isset($configMap[$key])) { - $config[$key] = $value; - } else { - throw new \InvalidArgumentException("No method is configured " - . "to handle the {$key} config key"); - } - } - } - - private function add_body(RequestInterface $request, $value) - { - if ($value !== null) { - if (is_array($value)) { - $this->addPostData($request, $value); - } else { - $request->setBody(Stream\create($value)); - } - } - } - - private function add_allow_redirects(RequestInterface $request, $value) - { - static $defaultRedirect = [ - 'max' => 5, - 'strict' => false, - 'referer' => false - ]; - - if ($value === false) { - return; - } - - if ($value === true) { - $value = $defaultRedirect; - } elseif (!isset($value['max'])) { - throw new \InvalidArgumentException('allow_redirects must be ' - . 'true, false, or an array that contains the \'max\' key'); - } else { - // Merge the default settings with the provided settings - $value += $defaultRedirect; - } - - $request->getConfig()['redirect'] = $value; - $request->getEmitter()->attach($this->redirectPlugin); - } - - private function add_exceptions(RequestInterface $request, $value) - { - if ($value === true) { - $request->getEmitter()->attach($this->errorPlugin); - } - } - - private function add_auth(RequestInterface $request, $value) - { - if (!$value) { - return; - } elseif (is_array($value)) { - $authType = isset($value[2]) ? strtolower($value[2]) : 'basic'; - } else { - $authType = strtolower($value); - } - - $request->getConfig()->set('auth', $value); - - if ($authType == 'basic') { - $request->setHeader( - 'Authorization', - 'Basic ' . base64_encode("$value[0]:$value[1]") - ); - } elseif ($authType == 'digest') { - // Currently only implemented by the cURL adapter. - // @todo: Need an event listener solution that does not rely on cURL - $config = $request->getConfig(); - $config->setPath('curl/' . CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); - $config->setPath('curl/' . CURLOPT_USERPWD, "$value[0]:$value[1]"); - } - } - - private function add_query(RequestInterface $request, $value) - { - if ($value instanceof Query) { - $original = $request->getQuery(); - // Do not overwrite existing query string variables by overwriting - // the object with the query string data passed in the URL - $request->setQuery($value->overwriteWith($original->toArray())); - } elseif (is_array($value)) { - // Do not overwrite existing query string variables - $query = $request->getQuery(); - foreach ($value as $k => $v) { - if (!isset($query[$k])) { - $query[$k] = $v; - } - } - } else { - throw new \InvalidArgumentException('query value must be an array ' - . 'or Query object'); - } - } - - private function add_headers(RequestInterface $request, $value) - { - if (!is_array($value)) { - throw new \InvalidArgumentException('header value must be an array'); - } - - // Do not overwrite existing headers - foreach ($value as $k => $v) { - if (!$request->hasHeader($k)) { - $request->setHeader($k, $v); - } - } - } - - private function add_cookies(RequestInterface $request, $value) - { - if ($value === true) { - static $cookie = null; - if (!$cookie) { - $cookie = new Cookie(); - } - $request->getEmitter()->attach($cookie); - } elseif (is_array($value)) { - $request->getEmitter()->attach( - new Cookie(CookieJar::fromArray($value, $request->getHost())) - ); - } elseif ($value instanceof CookieJarInterface) { - $request->getEmitter()->attach(new Cookie($value)); - } elseif ($value !== false) { - throw new \InvalidArgumentException('cookies must be an array, ' - . 'true, or a CookieJarInterface object'); - } - } - - private function add_events(RequestInterface $request, $value) - { - if (!is_array($value)) { - throw new \InvalidArgumentException('events value must be an array'); - } - - $this->attachListeners($request, $this->prepareListeners($value, - ['before', 'complete', 'error', 'headers'] - )); - } - - private function add_subscribers(RequestInterface $request, $value) - { - if (!is_array($value)) { - throw new \InvalidArgumentException('subscribers must be an array'); - } - - $emitter = $request->getEmitter(); - foreach ($value as $subscribers) { - $emitter->attach($subscribers); - } - } - - private function add_json(RequestInterface $request, $value) - { - if (!$request->hasHeader('Content-Type')) { - $request->setHeader('Content-Type', 'application/json'); - } - - $request->setBody(Stream\create(json_encode($value))); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageFactoryInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageFactoryInterface.php deleted file mode 100755 index daab0427..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageFactoryInterface.php +++ /dev/null @@ -1,71 +0,0 @@ -getHeaders() as $name => $values) { - * echo $name . ": " . implode(", ", $values); - * } - * - * @return array Returns an associative array of the message's headers. - */ - public function getHeaders(); - - /** - * Retrieve a header by the given case-insensitive name. - * - * By default, this method returns all of the header values of the given - * case-insensitive header name as a string concatenated together using - * a comma. Because some header should not be concatenated together using a - * comma, this method provides a Boolean argument that can be used to - * retrieve the associated header values as an array of strings. - * - * @param string $header Case-insensitive header name. - * @param bool $asArray Set to true to retrieve the header value as an - * array of strings. - * - * @return array|string - */ - public function getHeader($header, $asArray = false); - - /** - * Checks if a header exists by the given case-insensitive name. - * - * @param string $header Case-insensitive header name. - * - * @return bool Returns true if any header names match the given header - * name using a case-insensitive string comparison. Returns false if - * no matching header name is found in the message. - */ - public function hasHeader($header); - - /** - * Remove a specific header by case-insensitive name. - * - * @param string $header Case-insensitive header name. - * - * @return self - */ - public function removeHeader($header); - - /** - * Appends a header value to any existing values associated with the - * given header name. - * - * @param string $header Header name to add - * @param string $value Value of the header - * - * @return self - */ - public function addHeader($header, $value); - - /** - * Merges in an associative array of headers. - * - * Each array key MUST be a string representing the case-insensitive name - * of a header. Each value MUST be either a string or an array of strings. - * For each value, the value is appended to any existing header of the same - * name, or, if a header does not already exist by the given name, then the - * header is added. - * - * @param array $headers Associative array of headers to add to the message - * - * @return self - */ - public function addHeaders(array $headers); - - /** - * Sets a header, replacing any existing values of any headers with the - * same case-insensitive name. - * - * The header values MUST be a string or an array of strings. - * - * @param string $header Header name - * @param string|array $value Header value(s) - * - * @return self Returns the message. - */ - public function setHeader($header, $value); - - /** - * Sets headers, replacing any headers that have already been set on the - * message. - * - * The array keys MUST be a string. The array values must be either a - * string or an array of strings. - * - * @param array $headers Headers to set. - * - * @return self Returns the message. - */ - public function setHeaders(array $headers); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageParser.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageParser.php deleted file mode 100755 index 777ce26e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/MessageParser.php +++ /dev/null @@ -1,172 +0,0 @@ -parseMessage($message))) { - return false; - } - - // Parse the protocol and protocol version - if (isset($parts['start_line'][2])) { - $startParts = explode('/', $parts['start_line'][2]); - $protocol = strtoupper($startParts[0]); - $version = isset($startParts[1]) ? $startParts[1] : '1.1'; - } else { - $protocol = 'HTTP'; - $version = '1.1'; - } - - $parsed = [ - 'method' => strtoupper($parts['start_line'][0]), - 'protocol' => $protocol, - 'protocol_version' => $version, - 'headers' => $parts['headers'], - 'body' => $parts['body'] - ]; - - $parsed['request_url'] = $this->getUrlPartsFromMessage( - (isset($parts['start_line'][1]) ? $parts['start_line'][1] : ''), $parsed); - - return $parsed; - } - - /** - * Parse an HTTP response message into an associative array of parts. - * - * @param string $message HTTP response to parse - * - * @return array|bool Returns false if the message is invalid - */ - public function parseResponse($message) - { - if (!($parts = $this->parseMessage($message))) { - return false; - } - - list($protocol, $version) = explode('/', trim($parts['start_line'][0])); - - return [ - 'protocol' => $protocol, - 'protocol_version' => $version, - 'code' => $parts['start_line'][1], - 'reason_phrase' => isset($parts['start_line'][2]) ? $parts['start_line'][2] : '', - 'headers' => $parts['headers'], - 'body' => $parts['body'] - ]; - } - - /** - * Parse a message into parts - * - * @param string $message Message to parse - * - * @return array|bool - */ - private function parseMessage($message) - { - if (!$message) { - return false; - } - - $startLine = null; - $headers = []; - $body = ''; - - // Iterate over each line in the message, accounting for line endings - $lines = preg_split('/(\\r?\\n)/', $message, -1, PREG_SPLIT_DELIM_CAPTURE); - for ($i = 0, $totalLines = count($lines); $i < $totalLines; $i += 2) { - - $line = $lines[$i]; - - // If two line breaks were encountered, then this is the end of body - if (empty($line)) { - if ($i < $totalLines - 1) { - $body = implode('', array_slice($lines, $i + 2)); - } - break; - } - - // Parse message headers - if (!$startLine) { - $startLine = explode(' ', $line, 3); - } elseif (strpos($line, ':')) { - $parts = explode(':', $line, 2); - $key = trim($parts[0]); - $value = isset($parts[1]) ? trim($parts[1]) : ''; - if (!isset($headers[$key])) { - $headers[$key] = $value; - } elseif (!is_array($headers[$key])) { - $headers[$key] = [$headers[$key], $value]; - } else { - $headers[$key][] = $value; - } - } - } - - return [ - 'start_line' => $startLine, - 'headers' => $headers, - 'body' => $body - ]; - } - - /** - * Create URL parts from HTTP message parts - * - * @param string $requestUrl Associated URL - * @param array $parts HTTP message parts - * - * @return array - */ - private function getUrlPartsFromMessage($requestUrl, array $parts) - { - // Parse the URL information from the message - $urlParts = ['path' => $requestUrl, 'scheme' => 'http']; - - // Check for the Host header - if (isset($parts['headers']['Host'])) { - $urlParts['host'] = $parts['headers']['Host']; - } elseif (isset($parts['headers']['host'])) { - $urlParts['host'] = $parts['headers']['host']; - } else { - $urlParts['host'] = null; - } - - if (false === strpos($urlParts['host'], ':')) { - $urlParts['port'] = ''; - } else { - $hostParts = explode(':', $urlParts['host']); - $urlParts['host'] = trim($hostParts[0]); - $urlParts['port'] = (int) trim($hostParts[1]); - if ($urlParts['port'] == 443) { - $urlParts['scheme'] = 'https'; - } - } - - // Check if a query is present - $path = $urlParts['path']; - $qpos = strpos($path, '?'); - if ($qpos) { - $urlParts['query'] = substr($path, $qpos + 1); - $urlParts['path'] = substr($path, 0, $qpos); - } else { - $urlParts['query'] = ''; - } - - return $urlParts; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/Request.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/Request.php deleted file mode 100755 index 5c0e0aef..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/Request.php +++ /dev/null @@ -1,216 +0,0 @@ -setUrl($url); - $this->method = strtoupper($method); - $this->handleOptions($options); - $this->transferOptions = new Collection($options); - $this->addPrepareEvent(); - - if ($body !== null) { - $this->setBody($body); - } - - if ($headers) { - foreach ($headers as $key => $value) { - $this->setHeader($key, $value); - } - } - } - - public function __clone() - { - if ($this->emitter) { - $this->emitter = clone $this->emitter; - } - $this->transferOptions = clone $this->transferOptions; - $this->url = clone $this->url; - } - - public function setUrl($url) - { - $this->url = $url instanceof Url ? $url : Url::fromString($url); - $this->updateHostHeaderFromUrl(); - - return $this; - } - - public function getUrl() - { - return (string) $this->url; - } - - public function setQuery($query) - { - $this->url->setQuery($query); - - return $this; - } - - public function getQuery() - { - return $this->url->getQuery(); - } - - public function setMethod($method) - { - $this->method = strtoupper($method); - - return $this; - } - - public function getMethod() - { - return $this->method; - } - - public function getScheme() - { - return $this->url->getScheme(); - } - - public function setScheme($scheme) - { - $this->url->setScheme($scheme); - - return $this; - } - - public function getPort() - { - return $this->url->getPort(); - } - - public function setPort($port) - { - $this->url->setPort($port); - $this->updateHostHeaderFromUrl(); - - return $this; - } - - public function getHost() - { - return $this->url->getHost(); - } - - public function setHost($host) - { - $this->url->setHost($host); - $this->updateHostHeaderFromUrl(); - - return $this; - } - - public function getPath() - { - return '/' . ltrim($this->url->getPath(), '/'); - } - - public function setPath($path) - { - $this->url->setPath($path); - - return $this; - } - - public function getResource() - { - $resource = $this->getPath(); - if ($query = (string) $this->url->getQuery()) { - $resource .= '?' . $query; - } - - return $resource; - } - - public function getConfig() - { - return $this->transferOptions; - } - - protected function handleOptions(array &$options) - { - parent::handleOptions($options); - // Use a custom emitter if one is specified, and remove it from - // options that are exposed through getConfig() - if (isset($options['emitter'])) { - $this->emitter = $options['emitter']; - unset($options['emitter']); - } - } - - protected function getStartLine() - { - return trim($this->method . ' ' . $this->getResource()) - . ' HTTP/' . $this->getProtocolVersion(); - } - - /** - * Adds a subscriber that ensures a request's body is prepared before - * sending. - */ - private function addPrepareEvent() - { - static $subscriber; - if (!$subscriber) { - $subscriber = new Prepare(); - } - - $this->getEmitter()->attach($subscriber); - } - - private function updateHostHeaderFromUrl() - { - $port = $this->url->getPort(); - $scheme = $this->url->getScheme(); - if ($host = $this->url->getHost()) { - if (($port == 80 && $scheme == 'http') || - ($port == 443 && $scheme == 'https') - ) { - $this->setHeader('Host', $host); - } else { - $this->setHeader('Host', "{$host}:{$port}"); - } - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/RequestInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/RequestInterface.php deleted file mode 100755 index 8cd5de7b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/RequestInterface.php +++ /dev/null @@ -1,150 +0,0 @@ - 'Continue', - 101 => 'Switching Protocols', - 102 => 'Processing', - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authoritative Information', - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', - 207 => 'Multi-Status', - 208 => 'Already Reported', - 226 => 'IM Used', - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', - 303 => 'See Other', - 304 => 'Not Modified', - 305 => 'Use Proxy', - 307 => 'Temporary Redirect', - 308 => 'Permanent Redirect', - 400 => 'Bad Request', - 401 => 'Unauthorized', - 402 => 'Payment Required', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 406 => 'Not Acceptable', - 407 => 'Proxy Authentication Required', - 408 => 'Request Timeout', - 409 => 'Conflict', - 410 => 'Gone', - 411 => 'Length Required', - 412 => 'Precondition Failed', - 413 => 'Request Entity Too Large', - 414 => 'Request-URI Too Long', - 415 => 'Unsupported Media Type', - 416 => 'Requested Range Not Satisfiable', - 417 => 'Expectation Failed', - 422 => 'Unprocessable Entity', - 423 => 'Locked', - 424 => 'Failed Dependency', - 425 => 'Reserved for WebDAV advanced collections expired proposal', - 426 => 'Upgrade required', - 428 => 'Precondition Required', - 429 => 'Too Many Requests', - 431 => 'Request Header Fields Too Large', - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout', - 505 => 'HTTP Version Not Supported', - 506 => 'Variant Also Negotiates (Experimental)', - 507 => 'Insufficient Storage', - 508 => 'Loop Detected', - 510 => 'Not Extended', - 511 => 'Network Authentication Required', - ); - - /** @var string The reason phrase of the response (human readable code) */ - private $reasonPhrase; - - /** @var string The status code of the response */ - private $statusCode; - - /** @var string The effective URL that returned this response */ - private $effectiveUrl; - - /** - * @param string $statusCode The response status code (e.g. 200) - * @param array $headers The response headers - * @param StreamInterface $body The body of the response - * @param array $options Response message options - * - reason_phrase: Set a custom reason phrase - * - protocol_version: Set a custom protocol version - */ - public function __construct( - $statusCode, - array $headers = [], - StreamInterface $body = null, - array $options = [] - ) { - $this->statusCode = (string) $statusCode; - $this->handleOptions($options); - - // Assume a reason phrase if one was not applied as an option - if (!$this->reasonPhrase && - isset(self::$statusTexts[$this->statusCode]) - ) { - $this->reasonPhrase = self::$statusTexts[$this->statusCode]; - } - - if ($headers) { - $this->setHeaders($headers); - } - - if ($body) { - $this->setBody($body); - } - } - - public function getStatusCode() - { - return $this->statusCode; - } - - public function getReasonPhrase() - { - return $this->reasonPhrase; - } - - public function json(array $config = []) - { - try { - return \GuzzleHttp\json_decode( - (string) $this->getBody(), - isset($config['object']) ? !$config['object'] : true, - 512, - isset($config['big_int_strings']) ? JSON_BIGINT_AS_STRING : 0 - ); - } catch (\InvalidArgumentException $e) { - throw new ParseException( - $e->getMessage(), - $this - ); - } - } - - public function xml(array $config = []) - { - $disableEntities = libxml_disable_entity_loader(true); - $internalErrors = libxml_use_internal_errors(true); - - try { - // Allow XML to be retrieved even if there is no response body - $xml = new \SimpleXMLElement( - (string) $this->getBody() ?: '', - LIBXML_NONET, - isset($config['ns']) ? $config['ns'] : '', - isset($config['ns_is_prefix']) ? $config['ns_is_prefix'] : false - ); - libxml_disable_entity_loader($disableEntities); - libxml_use_internal_errors($internalErrors); - } catch (\Exception $e) { - libxml_disable_entity_loader($disableEntities); - libxml_use_internal_errors($internalErrors); - throw new ParseException( - 'Unable to parse response body into XML: ' . $e->getMessage(), - $this - ); - } - - return $xml; - } - - public function getEffectiveUrl() - { - return $this->effectiveUrl; - } - - public function setEffectiveUrl($url) - { - $this->effectiveUrl = $url; - - return $this; - } - - /** - * Accepts and modifies the options provided to the response in the - * constructor. - * - * @param array $options Options array passed by reference. - */ - protected function handleOptions(array &$options = []) - { - parent::handleOptions($options); - if (isset($options['reason_phrase'])) { - $this->reasonPhrase = $options['reason_phrase']; - } - } - - protected function getStartLine() - { - return 'HTTP/' . $this->getProtocolVersion() - . " {$this->statusCode} {$this->reasonPhrase}"; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/ResponseInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/ResponseInterface.php deleted file mode 100755 index db8252c6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Message/ResponseInterface.php +++ /dev/null @@ -1,86 +0,0 @@ - 'text/vnd.in3d.3dml', - '3g2' => 'video/3gpp2', - '3gp' => 'video/3gpp', - '7z' => 'application/x-7z-compressed', - 'aab' => 'application/x-authorware-bin', - 'aac' => 'audio/x-aac', - 'aam' => 'application/x-authorware-map', - 'aas' => 'application/x-authorware-seg', - 'abw' => 'application/x-abiword', - 'ac' => 'application/pkix-attr-cert', - 'acc' => 'application/vnd.americandynamics.acc', - 'ace' => 'application/x-ace-compressed', - 'acu' => 'application/vnd.acucobol', - 'acutc' => 'application/vnd.acucorp', - 'adp' => 'audio/adpcm', - 'aep' => 'application/vnd.audiograph', - 'afm' => 'application/x-font-type1', - 'afp' => 'application/vnd.ibm.modcap', - 'ahead' => 'application/vnd.ahead.space', - 'ai' => 'application/postscript', - 'aif' => 'audio/x-aiff', - 'aifc' => 'audio/x-aiff', - 'aiff' => 'audio/x-aiff', - 'air' => 'application/vnd.adobe.air-application-installer-package+zip', - 'ait' => 'application/vnd.dvb.ait', - 'ami' => 'application/vnd.amiga.ami', - 'apk' => 'application/vnd.android.package-archive', - 'application' => 'application/x-ms-application', - 'apr' => 'application/vnd.lotus-approach', - 'asa' => 'text/plain', - 'asax' => 'application/octet-stream', - 'asc' => 'application/pgp-signature', - 'ascx' => 'text/plain', - 'asf' => 'video/x-ms-asf', - 'ashx' => 'text/plain', - 'asm' => 'text/x-asm', - 'asmx' => 'text/plain', - 'aso' => 'application/vnd.accpac.simply.aso', - 'asp' => 'text/plain', - 'aspx' => 'text/plain', - 'asx' => 'video/x-ms-asf', - 'atc' => 'application/vnd.acucorp', - 'atom' => 'application/atom+xml', - 'atomcat' => 'application/atomcat+xml', - 'atomsvc' => 'application/atomsvc+xml', - 'atx' => 'application/vnd.antix.game-component', - 'au' => 'audio/basic', - 'avi' => 'video/x-msvideo', - 'aw' => 'application/applixware', - 'axd' => 'text/plain', - 'azf' => 'application/vnd.airzip.filesecure.azf', - 'azs' => 'application/vnd.airzip.filesecure.azs', - 'azw' => 'application/vnd.amazon.ebook', - 'bat' => 'application/x-msdownload', - 'bcpio' => 'application/x-bcpio', - 'bdf' => 'application/x-font-bdf', - 'bdm' => 'application/vnd.syncml.dm+wbxml', - 'bed' => 'application/vnd.realvnc.bed', - 'bh2' => 'application/vnd.fujitsu.oasysprs', - 'bin' => 'application/octet-stream', - 'bmi' => 'application/vnd.bmi', - 'bmp' => 'image/bmp', - 'book' => 'application/vnd.framemaker', - 'box' => 'application/vnd.previewsystems.box', - 'boz' => 'application/x-bzip2', - 'bpk' => 'application/octet-stream', - 'btif' => 'image/prs.btif', - 'bz' => 'application/x-bzip', - 'bz2' => 'application/x-bzip2', - 'c' => 'text/x-c', - 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', - 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', - 'c4d' => 'application/vnd.clonk.c4group', - 'c4f' => 'application/vnd.clonk.c4group', - 'c4g' => 'application/vnd.clonk.c4group', - 'c4p' => 'application/vnd.clonk.c4group', - 'c4u' => 'application/vnd.clonk.c4group', - 'cab' => 'application/vnd.ms-cab-compressed', - 'car' => 'application/vnd.curl.car', - 'cat' => 'application/vnd.ms-pki.seccat', - 'cc' => 'text/x-c', - 'cct' => 'application/x-director', - 'ccxml' => 'application/ccxml+xml', - 'cdbcmsg' => 'application/vnd.contact.cmsg', - 'cdf' => 'application/x-netcdf', - 'cdkey' => 'application/vnd.mediastation.cdkey', - 'cdmia' => 'application/cdmi-capability', - 'cdmic' => 'application/cdmi-container', - 'cdmid' => 'application/cdmi-domain', - 'cdmio' => 'application/cdmi-object', - 'cdmiq' => 'application/cdmi-queue', - 'cdx' => 'chemical/x-cdx', - 'cdxml' => 'application/vnd.chemdraw+xml', - 'cdy' => 'application/vnd.cinderella', - 'cer' => 'application/pkix-cert', - 'cfc' => 'application/x-coldfusion', - 'cfm' => 'application/x-coldfusion', - 'cgm' => 'image/cgm', - 'chat' => 'application/x-chat', - 'chm' => 'application/vnd.ms-htmlhelp', - 'chrt' => 'application/vnd.kde.kchart', - 'cif' => 'chemical/x-cif', - 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', - 'cil' => 'application/vnd.ms-artgalry', - 'cla' => 'application/vnd.claymore', - 'class' => 'application/java-vm', - 'clkk' => 'application/vnd.crick.clicker.keyboard', - 'clkp' => 'application/vnd.crick.clicker.palette', - 'clkt' => 'application/vnd.crick.clicker.template', - 'clkw' => 'application/vnd.crick.clicker.wordbank', - 'clkx' => 'application/vnd.crick.clicker', - 'clp' => 'application/x-msclip', - 'cmc' => 'application/vnd.cosmocaller', - 'cmdf' => 'chemical/x-cmdf', - 'cml' => 'chemical/x-cml', - 'cmp' => 'application/vnd.yellowriver-custom-menu', - 'cmx' => 'image/x-cmx', - 'cod' => 'application/vnd.rim.cod', - 'com' => 'application/x-msdownload', - 'conf' => 'text/plain', - 'cpio' => 'application/x-cpio', - 'cpp' => 'text/x-c', - 'cpt' => 'application/mac-compactpro', - 'crd' => 'application/x-mscardfile', - 'crl' => 'application/pkix-crl', - 'crt' => 'application/x-x509-ca-cert', - 'cryptonote' => 'application/vnd.rig.cryptonote', - 'cs' => 'text/plain', - 'csh' => 'application/x-csh', - 'csml' => 'chemical/x-csml', - 'csp' => 'application/vnd.commonspace', - 'css' => 'text/css', - 'cst' => 'application/x-director', - 'csv' => 'text/csv', - 'cu' => 'application/cu-seeme', - 'curl' => 'text/vnd.curl', - 'cww' => 'application/prs.cww', - 'cxt' => 'application/x-director', - 'cxx' => 'text/x-c', - 'dae' => 'model/vnd.collada+xml', - 'daf' => 'application/vnd.mobius.daf', - 'dataless' => 'application/vnd.fdsn.seed', - 'davmount' => 'application/davmount+xml', - 'dcr' => 'application/x-director', - 'dcurl' => 'text/vnd.curl.dcurl', - 'dd2' => 'application/vnd.oma.dd2+xml', - 'ddd' => 'application/vnd.fujixerox.ddd', - 'deb' => 'application/x-debian-package', - 'def' => 'text/plain', - 'deploy' => 'application/octet-stream', - 'der' => 'application/x-x509-ca-cert', - 'dfac' => 'application/vnd.dreamfactory', - 'dic' => 'text/x-c', - 'dir' => 'application/x-director', - 'dis' => 'application/vnd.mobius.dis', - 'dist' => 'application/octet-stream', - 'distz' => 'application/octet-stream', - 'djv' => 'image/vnd.djvu', - 'djvu' => 'image/vnd.djvu', - 'dll' => 'application/x-msdownload', - 'dmg' => 'application/octet-stream', - 'dms' => 'application/octet-stream', - 'dna' => 'application/vnd.dna', - 'doc' => 'application/msword', - 'docm' => 'application/vnd.ms-word.document.macroenabled.12', - 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 'dot' => 'application/msword', - 'dotm' => 'application/vnd.ms-word.template.macroenabled.12', - 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', - 'dp' => 'application/vnd.osgi.dp', - 'dpg' => 'application/vnd.dpgraph', - 'dra' => 'audio/vnd.dra', - 'dsc' => 'text/prs.lines.tag', - 'dssc' => 'application/dssc+der', - 'dtb' => 'application/x-dtbook+xml', - 'dtd' => 'application/xml-dtd', - 'dts' => 'audio/vnd.dts', - 'dtshd' => 'audio/vnd.dts.hd', - 'dump' => 'application/octet-stream', - 'dvi' => 'application/x-dvi', - 'dwf' => 'model/vnd.dwf', - 'dwg' => 'image/vnd.dwg', - 'dxf' => 'image/vnd.dxf', - 'dxp' => 'application/vnd.spotfire.dxp', - 'dxr' => 'application/x-director', - 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', - 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', - 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', - 'ecma' => 'application/ecmascript', - 'edm' => 'application/vnd.novadigm.edm', - 'edx' => 'application/vnd.novadigm.edx', - 'efif' => 'application/vnd.picsel', - 'ei6' => 'application/vnd.pg.osasli', - 'elc' => 'application/octet-stream', - 'eml' => 'message/rfc822', - 'emma' => 'application/emma+xml', - 'eol' => 'audio/vnd.digital-winds', - 'eot' => 'application/vnd.ms-fontobject', - 'eps' => 'application/postscript', - 'epub' => 'application/epub+zip', - 'es3' => 'application/vnd.eszigno3+xml', - 'esf' => 'application/vnd.epson.esf', - 'et3' => 'application/vnd.eszigno3+xml', - 'etx' => 'text/x-setext', - 'exe' => 'application/x-msdownload', - 'exi' => 'application/exi', - 'ext' => 'application/vnd.novadigm.ext', - 'ez' => 'application/andrew-inset', - 'ez2' => 'application/vnd.ezpix-album', - 'ez3' => 'application/vnd.ezpix-package', - 'f' => 'text/x-fortran', - 'f4v' => 'video/x-f4v', - 'f77' => 'text/x-fortran', - 'f90' => 'text/x-fortran', - 'fbs' => 'image/vnd.fastbidsheet', - 'fcs' => 'application/vnd.isac.fcs', - 'fdf' => 'application/vnd.fdf', - 'fe_launch' => 'application/vnd.denovo.fcselayout-link', - 'fg5' => 'application/vnd.fujitsu.oasysgp', - 'fgd' => 'application/x-director', - 'fh' => 'image/x-freehand', - 'fh4' => 'image/x-freehand', - 'fh5' => 'image/x-freehand', - 'fh7' => 'image/x-freehand', - 'fhc' => 'image/x-freehand', - 'fig' => 'application/x-xfig', - 'fli' => 'video/x-fli', - 'flo' => 'application/vnd.micrografx.flo', - 'flv' => 'video/x-flv', - 'flw' => 'application/vnd.kde.kivio', - 'flx' => 'text/vnd.fmi.flexstor', - 'fly' => 'text/vnd.fly', - 'fm' => 'application/vnd.framemaker', - 'fnc' => 'application/vnd.frogans.fnc', - 'for' => 'text/x-fortran', - 'fpx' => 'image/vnd.fpx', - 'frame' => 'application/vnd.framemaker', - 'fsc' => 'application/vnd.fsc.weblaunch', - 'fst' => 'image/vnd.fst', - 'ftc' => 'application/vnd.fluxtime.clip', - 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', - 'fvt' => 'video/vnd.fvt', - 'fxp' => 'application/vnd.adobe.fxp', - 'fxpl' => 'application/vnd.adobe.fxp', - 'fzs' => 'application/vnd.fuzzysheet', - 'g2w' => 'application/vnd.geoplan', - 'g3' => 'image/g3fax', - 'g3w' => 'application/vnd.geospace', - 'gac' => 'application/vnd.groove-account', - 'gdl' => 'model/vnd.gdl', - 'geo' => 'application/vnd.dynageo', - 'gex' => 'application/vnd.geometry-explorer', - 'ggb' => 'application/vnd.geogebra.file', - 'ggt' => 'application/vnd.geogebra.tool', - 'ghf' => 'application/vnd.groove-help', - 'gif' => 'image/gif', - 'gim' => 'application/vnd.groove-identity-message', - 'gmx' => 'application/vnd.gmx', - 'gnumeric' => 'application/x-gnumeric', - 'gph' => 'application/vnd.flographit', - 'gqf' => 'application/vnd.grafeq', - 'gqs' => 'application/vnd.grafeq', - 'gram' => 'application/srgs', - 'gre' => 'application/vnd.geometry-explorer', - 'grv' => 'application/vnd.groove-injector', - 'grxml' => 'application/srgs+xml', - 'gsf' => 'application/x-font-ghostscript', - 'gtar' => 'application/x-gtar', - 'gtm' => 'application/vnd.groove-tool-message', - 'gtw' => 'model/vnd.gtw', - 'gv' => 'text/vnd.graphviz', - 'gxt' => 'application/vnd.geonext', - 'h' => 'text/x-c', - 'h261' => 'video/h261', - 'h263' => 'video/h263', - 'h264' => 'video/h264', - 'hal' => 'application/vnd.hal+xml', - 'hbci' => 'application/vnd.hbci', - 'hdf' => 'application/x-hdf', - 'hh' => 'text/x-c', - 'hlp' => 'application/winhlp', - 'hpgl' => 'application/vnd.hp-hpgl', - 'hpid' => 'application/vnd.hp-hpid', - 'hps' => 'application/vnd.hp-hps', - 'hqx' => 'application/mac-binhex40', - 'hta' => 'application/octet-stream', - 'htc' => 'text/html', - 'htke' => 'application/vnd.kenameaapp', - 'htm' => 'text/html', - 'html' => 'text/html', - 'hvd' => 'application/vnd.yamaha.hv-dic', - 'hvp' => 'application/vnd.yamaha.hv-voice', - 'hvs' => 'application/vnd.yamaha.hv-script', - 'i2g' => 'application/vnd.intergeo', - 'icc' => 'application/vnd.iccprofile', - 'ice' => 'x-conference/x-cooltalk', - 'icm' => 'application/vnd.iccprofile', - 'ico' => 'image/x-icon', - 'ics' => 'text/calendar', - 'ief' => 'image/ief', - 'ifb' => 'text/calendar', - 'ifm' => 'application/vnd.shana.informed.formdata', - 'iges' => 'model/iges', - 'igl' => 'application/vnd.igloader', - 'igm' => 'application/vnd.insors.igm', - 'igs' => 'model/iges', - 'igx' => 'application/vnd.micrografx.igx', - 'iif' => 'application/vnd.shana.informed.interchange', - 'imp' => 'application/vnd.accpac.simply.imp', - 'ims' => 'application/vnd.ms-ims', - 'in' => 'text/plain', - 'ini' => 'text/plain', - 'ipfix' => 'application/ipfix', - 'ipk' => 'application/vnd.shana.informed.package', - 'irm' => 'application/vnd.ibm.rights-management', - 'irp' => 'application/vnd.irepository.package+xml', - 'iso' => 'application/octet-stream', - 'itp' => 'application/vnd.shana.informed.formtemplate', - 'ivp' => 'application/vnd.immervision-ivp', - 'ivu' => 'application/vnd.immervision-ivu', - 'jad' => 'text/vnd.sun.j2me.app-descriptor', - 'jam' => 'application/vnd.jam', - 'jar' => 'application/java-archive', - 'java' => 'text/x-java-source', - 'jisp' => 'application/vnd.jisp', - 'jlt' => 'application/vnd.hp-jlyt', - 'jnlp' => 'application/x-java-jnlp-file', - 'joda' => 'application/vnd.joost.joda-archive', - 'jpe' => 'image/jpeg', - 'jpeg' => 'image/jpeg', - 'jpg' => 'image/jpeg', - 'jpgm' => 'video/jpm', - 'jpgv' => 'video/jpeg', - 'jpm' => 'video/jpm', - 'js' => 'text/javascript', - 'json' => 'application/json', - 'kar' => 'audio/midi', - 'karbon' => 'application/vnd.kde.karbon', - 'kfo' => 'application/vnd.kde.kformula', - 'kia' => 'application/vnd.kidspiration', - 'kml' => 'application/vnd.google-earth.kml+xml', - 'kmz' => 'application/vnd.google-earth.kmz', - 'kne' => 'application/vnd.kinar', - 'knp' => 'application/vnd.kinar', - 'kon' => 'application/vnd.kde.kontour', - 'kpr' => 'application/vnd.kde.kpresenter', - 'kpt' => 'application/vnd.kde.kpresenter', - 'ksp' => 'application/vnd.kde.kspread', - 'ktr' => 'application/vnd.kahootz', - 'ktx' => 'image/ktx', - 'ktz' => 'application/vnd.kahootz', - 'kwd' => 'application/vnd.kde.kword', - 'kwt' => 'application/vnd.kde.kword', - 'lasxml' => 'application/vnd.las.las+xml', - 'latex' => 'application/x-latex', - 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', - 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', - 'les' => 'application/vnd.hhe.lesson-player', - 'lha' => 'application/octet-stream', - 'link66' => 'application/vnd.route66.link66+xml', - 'list' => 'text/plain', - 'list3820' => 'application/vnd.ibm.modcap', - 'listafp' => 'application/vnd.ibm.modcap', - 'log' => 'text/plain', - 'lostxml' => 'application/lost+xml', - 'lrf' => 'application/octet-stream', - 'lrm' => 'application/vnd.ms-lrm', - 'ltf' => 'application/vnd.frogans.ltf', - 'lvp' => 'audio/vnd.lucent.voice', - 'lwp' => 'application/vnd.lotus-wordpro', - 'lzh' => 'application/octet-stream', - 'm13' => 'application/x-msmediaview', - 'm14' => 'application/x-msmediaview', - 'm1v' => 'video/mpeg', - 'm21' => 'application/mp21', - 'm2a' => 'audio/mpeg', - 'm2v' => 'video/mpeg', - 'm3a' => 'audio/mpeg', - 'm3u' => 'audio/x-mpegurl', - 'm3u8' => 'application/vnd.apple.mpegurl', - 'm4a' => 'audio/mp4', - 'm4u' => 'video/vnd.mpegurl', - 'm4v' => 'video/mp4', - 'ma' => 'application/mathematica', - 'mads' => 'application/mads+xml', - 'mag' => 'application/vnd.ecowin.chart', - 'maker' => 'application/vnd.framemaker', - 'man' => 'text/troff', - 'mathml' => 'application/mathml+xml', - 'mb' => 'application/mathematica', - 'mbk' => 'application/vnd.mobius.mbk', - 'mbox' => 'application/mbox', - 'mc1' => 'application/vnd.medcalcdata', - 'mcd' => 'application/vnd.mcd', - 'mcurl' => 'text/vnd.curl.mcurl', - 'mdb' => 'application/x-msaccess', - 'mdi' => 'image/vnd.ms-modi', - 'me' => 'text/troff', - 'mesh' => 'model/mesh', - 'meta4' => 'application/metalink4+xml', - 'mets' => 'application/mets+xml', - 'mfm' => 'application/vnd.mfmp', - 'mgp' => 'application/vnd.osgeo.mapguide.package', - 'mgz' => 'application/vnd.proteus.magazine', - 'mid' => 'audio/midi', - 'midi' => 'audio/midi', - 'mif' => 'application/vnd.mif', - 'mime' => 'message/rfc822', - 'mj2' => 'video/mj2', - 'mjp2' => 'video/mj2', - 'mlp' => 'application/vnd.dolby.mlp', - 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', - 'mmf' => 'application/vnd.smaf', - 'mmr' => 'image/vnd.fujixerox.edmics-mmr', - 'mny' => 'application/x-msmoney', - 'mobi' => 'application/x-mobipocket-ebook', - 'mods' => 'application/mods+xml', - 'mov' => 'video/quicktime', - 'movie' => 'video/x-sgi-movie', - 'mp2' => 'audio/mpeg', - 'mp21' => 'application/mp21', - 'mp2a' => 'audio/mpeg', - 'mp3' => 'audio/mpeg', - 'mp4' => 'video/mp4', - 'mp4a' => 'audio/mp4', - 'mp4s' => 'application/mp4', - 'mp4v' => 'video/mp4', - 'mpc' => 'application/vnd.mophun.certificate', - 'mpe' => 'video/mpeg', - 'mpeg' => 'video/mpeg', - 'mpg' => 'video/mpeg', - 'mpg4' => 'video/mp4', - 'mpga' => 'audio/mpeg', - 'mpkg' => 'application/vnd.apple.installer+xml', - 'mpm' => 'application/vnd.blueice.multipass', - 'mpn' => 'application/vnd.mophun.application', - 'mpp' => 'application/vnd.ms-project', - 'mpt' => 'application/vnd.ms-project', - 'mpy' => 'application/vnd.ibm.minipay', - 'mqy' => 'application/vnd.mobius.mqy', - 'mrc' => 'application/marc', - 'mrcx' => 'application/marcxml+xml', - 'ms' => 'text/troff', - 'mscml' => 'application/mediaservercontrol+xml', - 'mseed' => 'application/vnd.fdsn.mseed', - 'mseq' => 'application/vnd.mseq', - 'msf' => 'application/vnd.epson.msf', - 'msh' => 'model/mesh', - 'msi' => 'application/x-msdownload', - 'msl' => 'application/vnd.mobius.msl', - 'msty' => 'application/vnd.muvee.style', - 'mts' => 'model/vnd.mts', - 'mus' => 'application/vnd.musician', - 'musicxml' => 'application/vnd.recordare.musicxml+xml', - 'mvb' => 'application/x-msmediaview', - 'mwf' => 'application/vnd.mfer', - 'mxf' => 'application/mxf', - 'mxl' => 'application/vnd.recordare.musicxml', - 'mxml' => 'application/xv+xml', - 'mxs' => 'application/vnd.triscape.mxs', - 'mxu' => 'video/vnd.mpegurl', - 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', - 'n3' => 'text/n3', - 'nb' => 'application/mathematica', - 'nbp' => 'application/vnd.wolfram.player', - 'nc' => 'application/x-netcdf', - 'ncx' => 'application/x-dtbncx+xml', - 'ngdat' => 'application/vnd.nokia.n-gage.data', - 'nlu' => 'application/vnd.neurolanguage.nlu', - 'nml' => 'application/vnd.enliven', - 'nnd' => 'application/vnd.noblenet-directory', - 'nns' => 'application/vnd.noblenet-sealer', - 'nnw' => 'application/vnd.noblenet-web', - 'npx' => 'image/vnd.net-fpx', - 'nsf' => 'application/vnd.lotus-notes', - 'oa2' => 'application/vnd.fujitsu.oasys2', - 'oa3' => 'application/vnd.fujitsu.oasys3', - 'oas' => 'application/vnd.fujitsu.oasys', - 'obd' => 'application/x-msbinder', - 'oda' => 'application/oda', - 'odb' => 'application/vnd.oasis.opendocument.database', - 'odc' => 'application/vnd.oasis.opendocument.chart', - 'odf' => 'application/vnd.oasis.opendocument.formula', - 'odft' => 'application/vnd.oasis.opendocument.formula-template', - 'odg' => 'application/vnd.oasis.opendocument.graphics', - 'odi' => 'application/vnd.oasis.opendocument.image', - 'odm' => 'application/vnd.oasis.opendocument.text-master', - 'odp' => 'application/vnd.oasis.opendocument.presentation', - 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', - 'odt' => 'application/vnd.oasis.opendocument.text', - 'oga' => 'audio/ogg', - 'ogg' => 'audio/ogg', - 'ogv' => 'video/ogg', - 'ogx' => 'application/ogg', - 'onepkg' => 'application/onenote', - 'onetmp' => 'application/onenote', - 'onetoc' => 'application/onenote', - 'onetoc2' => 'application/onenote', - 'opf' => 'application/oebps-package+xml', - 'oprc' => 'application/vnd.palm', - 'org' => 'application/vnd.lotus-organizer', - 'osf' => 'application/vnd.yamaha.openscoreformat', - 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', - 'otc' => 'application/vnd.oasis.opendocument.chart-template', - 'otf' => 'application/x-font-otf', - 'otg' => 'application/vnd.oasis.opendocument.graphics-template', - 'oth' => 'application/vnd.oasis.opendocument.text-web', - 'oti' => 'application/vnd.oasis.opendocument.image-template', - 'otp' => 'application/vnd.oasis.opendocument.presentation-template', - 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', - 'ott' => 'application/vnd.oasis.opendocument.text-template', - 'oxt' => 'application/vnd.openofficeorg.extension', - 'p' => 'text/x-pascal', - 'p10' => 'application/pkcs10', - 'p12' => 'application/x-pkcs12', - 'p7b' => 'application/x-pkcs7-certificates', - 'p7c' => 'application/pkcs7-mime', - 'p7m' => 'application/pkcs7-mime', - 'p7r' => 'application/x-pkcs7-certreqresp', - 'p7s' => 'application/pkcs7-signature', - 'p8' => 'application/pkcs8', - 'pas' => 'text/x-pascal', - 'paw' => 'application/vnd.pawaafile', - 'pbd' => 'application/vnd.powerbuilder6', - 'pbm' => 'image/x-portable-bitmap', - 'pcf' => 'application/x-font-pcf', - 'pcl' => 'application/vnd.hp-pcl', - 'pclxl' => 'application/vnd.hp-pclxl', - 'pct' => 'image/x-pict', - 'pcurl' => 'application/vnd.curl.pcurl', - 'pcx' => 'image/x-pcx', - 'pdb' => 'application/vnd.palm', - 'pdf' => 'application/pdf', - 'pfa' => 'application/x-font-type1', - 'pfb' => 'application/x-font-type1', - 'pfm' => 'application/x-font-type1', - 'pfr' => 'application/font-tdpfr', - 'pfx' => 'application/x-pkcs12', - 'pgm' => 'image/x-portable-graymap', - 'pgn' => 'application/x-chess-pgn', - 'pgp' => 'application/pgp-encrypted', - 'php' => 'text/x-php', - 'phps' => 'application/x-httpd-phps', - 'pic' => 'image/x-pict', - 'pkg' => 'application/octet-stream', - 'pki' => 'application/pkixcmp', - 'pkipath' => 'application/pkix-pkipath', - 'plb' => 'application/vnd.3gpp.pic-bw-large', - 'plc' => 'application/vnd.mobius.plc', - 'plf' => 'application/vnd.pocketlearn', - 'pls' => 'application/pls+xml', - 'pml' => 'application/vnd.ctc-posml', - 'png' => 'image/png', - 'pnm' => 'image/x-portable-anymap', - 'portpkg' => 'application/vnd.macports.portpkg', - 'pot' => 'application/vnd.ms-powerpoint', - 'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12', - 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', - 'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12', - 'ppd' => 'application/vnd.cups-ppd', - 'ppm' => 'image/x-portable-pixmap', - 'pps' => 'application/vnd.ms-powerpoint', - 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12', - 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', - 'ppt' => 'application/vnd.ms-powerpoint', - 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12', - 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - 'pqa' => 'application/vnd.palm', - 'prc' => 'application/x-mobipocket-ebook', - 'pre' => 'application/vnd.lotus-freelance', - 'prf' => 'application/pics-rules', - 'ps' => 'application/postscript', - 'psb' => 'application/vnd.3gpp.pic-bw-small', - 'psd' => 'image/vnd.adobe.photoshop', - 'psf' => 'application/x-font-linux-psf', - 'pskcxml' => 'application/pskc+xml', - 'ptid' => 'application/vnd.pvi.ptid1', - 'pub' => 'application/x-mspublisher', - 'pvb' => 'application/vnd.3gpp.pic-bw-var', - 'pwn' => 'application/vnd.3m.post-it-notes', - 'pya' => 'audio/vnd.ms-playready.media.pya', - 'pyv' => 'video/vnd.ms-playready.media.pyv', - 'qam' => 'application/vnd.epson.quickanime', - 'qbo' => 'application/vnd.intu.qbo', - 'qfx' => 'application/vnd.intu.qfx', - 'qps' => 'application/vnd.publishare-delta-tree', - 'qt' => 'video/quicktime', - 'qwd' => 'application/vnd.quark.quarkxpress', - 'qwt' => 'application/vnd.quark.quarkxpress', - 'qxb' => 'application/vnd.quark.quarkxpress', - 'qxd' => 'application/vnd.quark.quarkxpress', - 'qxl' => 'application/vnd.quark.quarkxpress', - 'qxt' => 'application/vnd.quark.quarkxpress', - 'ra' => 'audio/x-pn-realaudio', - 'ram' => 'audio/x-pn-realaudio', - 'rar' => 'application/x-rar-compressed', - 'ras' => 'image/x-cmu-raster', - 'rb' => 'text/plain', - 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', - 'rdf' => 'application/rdf+xml', - 'rdz' => 'application/vnd.data-vision.rdz', - 'rep' => 'application/vnd.businessobjects', - 'res' => 'application/x-dtbresource+xml', - 'resx' => 'text/xml', - 'rgb' => 'image/x-rgb', - 'rif' => 'application/reginfo+xml', - 'rip' => 'audio/vnd.rip', - 'rl' => 'application/resource-lists+xml', - 'rlc' => 'image/vnd.fujixerox.edmics-rlc', - 'rld' => 'application/resource-lists-diff+xml', - 'rm' => 'application/vnd.rn-realmedia', - 'rmi' => 'audio/midi', - 'rmp' => 'audio/x-pn-realaudio-plugin', - 'rms' => 'application/vnd.jcp.javame.midlet-rms', - 'rnc' => 'application/relax-ng-compact-syntax', - 'roff' => 'text/troff', - 'rp9' => 'application/vnd.cloanto.rp9', - 'rpss' => 'application/vnd.nokia.radio-presets', - 'rpst' => 'application/vnd.nokia.radio-preset', - 'rq' => 'application/sparql-query', - 'rs' => 'application/rls-services+xml', - 'rsd' => 'application/rsd+xml', - 'rss' => 'application/rss+xml', - 'rtf' => 'application/rtf', - 'rtx' => 'text/richtext', - 's' => 'text/x-asm', - 'saf' => 'application/vnd.yamaha.smaf-audio', - 'sbml' => 'application/sbml+xml', - 'sc' => 'application/vnd.ibm.secure-container', - 'scd' => 'application/x-msschedule', - 'scm' => 'application/vnd.lotus-screencam', - 'scq' => 'application/scvp-cv-request', - 'scs' => 'application/scvp-cv-response', - 'scurl' => 'text/vnd.curl.scurl', - 'sda' => 'application/vnd.stardivision.draw', - 'sdc' => 'application/vnd.stardivision.calc', - 'sdd' => 'application/vnd.stardivision.impress', - 'sdkd' => 'application/vnd.solent.sdkm+xml', - 'sdkm' => 'application/vnd.solent.sdkm+xml', - 'sdp' => 'application/sdp', - 'sdw' => 'application/vnd.stardivision.writer', - 'see' => 'application/vnd.seemail', - 'seed' => 'application/vnd.fdsn.seed', - 'sema' => 'application/vnd.sema', - 'semd' => 'application/vnd.semd', - 'semf' => 'application/vnd.semf', - 'ser' => 'application/java-serialized-object', - 'setpay' => 'application/set-payment-initiation', - 'setreg' => 'application/set-registration-initiation', - 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', - 'sfs' => 'application/vnd.spotfire.sfs', - 'sgl' => 'application/vnd.stardivision.writer-global', - 'sgm' => 'text/sgml', - 'sgml' => 'text/sgml', - 'sh' => 'application/x-sh', - 'shar' => 'application/x-shar', - 'shf' => 'application/shf+xml', - 'sig' => 'application/pgp-signature', - 'silo' => 'model/mesh', - 'sis' => 'application/vnd.symbian.install', - 'sisx' => 'application/vnd.symbian.install', - 'sit' => 'application/x-stuffit', - 'sitx' => 'application/x-stuffitx', - 'skd' => 'application/vnd.koan', - 'skm' => 'application/vnd.koan', - 'skp' => 'application/vnd.koan', - 'skt' => 'application/vnd.koan', - 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', - 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', - 'slt' => 'application/vnd.epson.salt', - 'sm' => 'application/vnd.stepmania.stepchart', - 'smf' => 'application/vnd.stardivision.math', - 'smi' => 'application/smil+xml', - 'smil' => 'application/smil+xml', - 'snd' => 'audio/basic', - 'snf' => 'application/x-font-snf', - 'so' => 'application/octet-stream', - 'spc' => 'application/x-pkcs7-certificates', - 'spf' => 'application/vnd.yamaha.smaf-phrase', - 'spl' => 'application/x-futuresplash', - 'spot' => 'text/vnd.in3d.spot', - 'spp' => 'application/scvp-vp-response', - 'spq' => 'application/scvp-vp-request', - 'spx' => 'audio/ogg', - 'src' => 'application/x-wais-source', - 'sru' => 'application/sru+xml', - 'srx' => 'application/sparql-results+xml', - 'sse' => 'application/vnd.kodak-descriptor', - 'ssf' => 'application/vnd.epson.ssf', - 'ssml' => 'application/ssml+xml', - 'st' => 'application/vnd.sailingtracker.track', - 'stc' => 'application/vnd.sun.xml.calc.template', - 'std' => 'application/vnd.sun.xml.draw.template', - 'stf' => 'application/vnd.wt.stf', - 'sti' => 'application/vnd.sun.xml.impress.template', - 'stk' => 'application/hyperstudio', - 'stl' => 'application/vnd.ms-pki.stl', - 'str' => 'application/vnd.pg.format', - 'stw' => 'application/vnd.sun.xml.writer.template', - 'sub' => 'image/vnd.dvb.subtitle', - 'sus' => 'application/vnd.sus-calendar', - 'susp' => 'application/vnd.sus-calendar', - 'sv4cpio' => 'application/x-sv4cpio', - 'sv4crc' => 'application/x-sv4crc', - 'svc' => 'application/vnd.dvb.service', - 'svd' => 'application/vnd.svd', - 'svg' => 'image/svg+xml', - 'svgz' => 'image/svg+xml', - 'swa' => 'application/x-director', - 'swf' => 'application/x-shockwave-flash', - 'swi' => 'application/vnd.aristanetworks.swi', - 'sxc' => 'application/vnd.sun.xml.calc', - 'sxd' => 'application/vnd.sun.xml.draw', - 'sxg' => 'application/vnd.sun.xml.writer.global', - 'sxi' => 'application/vnd.sun.xml.impress', - 'sxm' => 'application/vnd.sun.xml.math', - 'sxw' => 'application/vnd.sun.xml.writer', - 't' => 'text/troff', - 'tao' => 'application/vnd.tao.intent-module-archive', - 'tar' => 'application/x-tar', - 'tcap' => 'application/vnd.3gpp2.tcap', - 'tcl' => 'application/x-tcl', - 'teacher' => 'application/vnd.smart.teacher', - 'tei' => 'application/tei+xml', - 'teicorpus' => 'application/tei+xml', - 'tex' => 'application/x-tex', - 'texi' => 'application/x-texinfo', - 'texinfo' => 'application/x-texinfo', - 'text' => 'text/plain', - 'tfi' => 'application/thraud+xml', - 'tfm' => 'application/x-tex-tfm', - 'thmx' => 'application/vnd.ms-officetheme', - 'tif' => 'image/tiff', - 'tiff' => 'image/tiff', - 'tmo' => 'application/vnd.tmobile-livetv', - 'torrent' => 'application/x-bittorrent', - 'tpl' => 'application/vnd.groove-tool-template', - 'tpt' => 'application/vnd.trid.tpt', - 'tr' => 'text/troff', - 'tra' => 'application/vnd.trueapp', - 'trm' => 'application/x-msterminal', - 'tsd' => 'application/timestamped-data', - 'tsv' => 'text/tab-separated-values', - 'ttc' => 'application/x-font-ttf', - 'ttf' => 'application/x-font-ttf', - 'ttl' => 'text/turtle', - 'twd' => 'application/vnd.simtech-mindmapper', - 'twds' => 'application/vnd.simtech-mindmapper', - 'txd' => 'application/vnd.genomatix.tuxedo', - 'txf' => 'application/vnd.mobius.txf', - 'txt' => 'text/plain', - 'u32' => 'application/x-authorware-bin', - 'udeb' => 'application/x-debian-package', - 'ufd' => 'application/vnd.ufdl', - 'ufdl' => 'application/vnd.ufdl', - 'umj' => 'application/vnd.umajin', - 'unityweb' => 'application/vnd.unity', - 'uoml' => 'application/vnd.uoml+xml', - 'uri' => 'text/uri-list', - 'uris' => 'text/uri-list', - 'urls' => 'text/uri-list', - 'ustar' => 'application/x-ustar', - 'utz' => 'application/vnd.uiq.theme', - 'uu' => 'text/x-uuencode', - 'uva' => 'audio/vnd.dece.audio', - 'uvd' => 'application/vnd.dece.data', - 'uvf' => 'application/vnd.dece.data', - 'uvg' => 'image/vnd.dece.graphic', - 'uvh' => 'video/vnd.dece.hd', - 'uvi' => 'image/vnd.dece.graphic', - 'uvm' => 'video/vnd.dece.mobile', - 'uvp' => 'video/vnd.dece.pd', - 'uvs' => 'video/vnd.dece.sd', - 'uvt' => 'application/vnd.dece.ttml+xml', - 'uvu' => 'video/vnd.uvvu.mp4', - 'uvv' => 'video/vnd.dece.video', - 'uvva' => 'audio/vnd.dece.audio', - 'uvvd' => 'application/vnd.dece.data', - 'uvvf' => 'application/vnd.dece.data', - 'uvvg' => 'image/vnd.dece.graphic', - 'uvvh' => 'video/vnd.dece.hd', - 'uvvi' => 'image/vnd.dece.graphic', - 'uvvm' => 'video/vnd.dece.mobile', - 'uvvp' => 'video/vnd.dece.pd', - 'uvvs' => 'video/vnd.dece.sd', - 'uvvt' => 'application/vnd.dece.ttml+xml', - 'uvvu' => 'video/vnd.uvvu.mp4', - 'uvvv' => 'video/vnd.dece.video', - 'uvvx' => 'application/vnd.dece.unspecified', - 'uvx' => 'application/vnd.dece.unspecified', - 'vcd' => 'application/x-cdlink', - 'vcf' => 'text/x-vcard', - 'vcg' => 'application/vnd.groove-vcard', - 'vcs' => 'text/x-vcalendar', - 'vcx' => 'application/vnd.vcx', - 'vis' => 'application/vnd.visionary', - 'viv' => 'video/vnd.vivo', - 'vor' => 'application/vnd.stardivision.writer', - 'vox' => 'application/x-authorware-bin', - 'vrml' => 'model/vrml', - 'vsd' => 'application/vnd.visio', - 'vsf' => 'application/vnd.vsf', - 'vss' => 'application/vnd.visio', - 'vst' => 'application/vnd.visio', - 'vsw' => 'application/vnd.visio', - 'vtu' => 'model/vnd.vtu', - 'vxml' => 'application/voicexml+xml', - 'w3d' => 'application/x-director', - 'wad' => 'application/x-doom', - 'wav' => 'audio/x-wav', - 'wax' => 'audio/x-ms-wax', - 'wbmp' => 'image/vnd.wap.wbmp', - 'wbs' => 'application/vnd.criticaltools.wbs+xml', - 'wbxml' => 'application/vnd.wap.wbxml', - 'wcm' => 'application/vnd.ms-works', - 'wdb' => 'application/vnd.ms-works', - 'weba' => 'audio/webm', - 'webm' => 'video/webm', - 'webp' => 'image/webp', - 'wg' => 'application/vnd.pmi.widget', - 'wgt' => 'application/widget', - 'wks' => 'application/vnd.ms-works', - 'wm' => 'video/x-ms-wm', - 'wma' => 'audio/x-ms-wma', - 'wmd' => 'application/x-ms-wmd', - 'wmf' => 'application/x-msmetafile', - 'wml' => 'text/vnd.wap.wml', - 'wmlc' => 'application/vnd.wap.wmlc', - 'wmls' => 'text/vnd.wap.wmlscript', - 'wmlsc' => 'application/vnd.wap.wmlscriptc', - 'wmv' => 'video/x-ms-wmv', - 'wmx' => 'video/x-ms-wmx', - 'wmz' => 'application/x-ms-wmz', - 'woff' => 'application/x-font-woff', - 'wpd' => 'application/vnd.wordperfect', - 'wpl' => 'application/vnd.ms-wpl', - 'wps' => 'application/vnd.ms-works', - 'wqd' => 'application/vnd.wqd', - 'wri' => 'application/x-mswrite', - 'wrl' => 'model/vrml', - 'wsdl' => 'application/wsdl+xml', - 'wspolicy' => 'application/wspolicy+xml', - 'wtb' => 'application/vnd.webturbo', - 'wvx' => 'video/x-ms-wvx', - 'x32' => 'application/x-authorware-bin', - 'x3d' => 'application/vnd.hzn-3d-crossword', - 'xap' => 'application/x-silverlight-app', - 'xar' => 'application/vnd.xara', - 'xbap' => 'application/x-ms-xbap', - 'xbd' => 'application/vnd.fujixerox.docuworks.binder', - 'xbm' => 'image/x-xbitmap', - 'xdf' => 'application/xcap-diff+xml', - 'xdm' => 'application/vnd.syncml.dm+xml', - 'xdp' => 'application/vnd.adobe.xdp+xml', - 'xdssc' => 'application/dssc+xml', - 'xdw' => 'application/vnd.fujixerox.docuworks', - 'xenc' => 'application/xenc+xml', - 'xer' => 'application/patch-ops-error+xml', - 'xfdf' => 'application/vnd.adobe.xfdf', - 'xfdl' => 'application/vnd.xfdl', - 'xht' => 'application/xhtml+xml', - 'xhtml' => 'application/xhtml+xml', - 'xhvml' => 'application/xv+xml', - 'xif' => 'image/vnd.xiff', - 'xla' => 'application/vnd.ms-excel', - 'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12', - 'xlc' => 'application/vnd.ms-excel', - 'xlm' => 'application/vnd.ms-excel', - 'xls' => 'application/vnd.ms-excel', - 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12', - 'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12', - 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'xlt' => 'application/vnd.ms-excel', - 'xltm' => 'application/vnd.ms-excel.template.macroenabled.12', - 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', - 'xlw' => 'application/vnd.ms-excel', - 'xml' => 'application/xml', - 'xo' => 'application/vnd.olpc-sugar', - 'xop' => 'application/xop+xml', - 'xpi' => 'application/x-xpinstall', - 'xpm' => 'image/x-xpixmap', - 'xpr' => 'application/vnd.is-xpr', - 'xps' => 'application/vnd.ms-xpsdocument', - 'xpw' => 'application/vnd.intercon.formnet', - 'xpx' => 'application/vnd.intercon.formnet', - 'xsl' => 'application/xml', - 'xslt' => 'application/xslt+xml', - 'xsm' => 'application/vnd.syncml+xml', - 'xspf' => 'application/xspf+xml', - 'xul' => 'application/vnd.mozilla.xul+xml', - 'xvm' => 'application/xv+xml', - 'xvml' => 'application/xv+xml', - 'xwd' => 'image/x-xwindowdump', - 'xyz' => 'chemical/x-xyz', - 'yaml' => 'text/yaml', - 'yang' => 'application/yang', - 'yin' => 'application/yin+xml', - 'yml' => 'text/yaml', - 'zaz' => 'application/vnd.zzazz.deck+xml', - 'zip' => 'application/zip', - 'zir' => 'application/vnd.zul', - 'zirz' => 'application/vnd.zul', - 'zmm' => 'application/vnd.handheld-entertainment+xml' - ); - - /** - * Get a singleton instance of the class - * - * @return self - * @codeCoverageIgnore - */ - public static function getInstance() - { - if (!self::$instance) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Get a mimetype value from a file extension - * - * @param string $extension File extension - * - * @return string|null - * - */ - public function fromExtension($extension) - { - $extension = strtolower($extension); - - return isset($this->mimetypes[$extension]) - ? $this->mimetypes[$extension] - : null; - } - - /** - * Get a mimetype from a filename - * - * @param string $filename Filename to generate a mimetype from - * - * @return string|null - */ - public function fromFilename($filename) - { - return $this->fromExtension(pathinfo($filename, PATHINFO_EXTENSION)); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/MultipartBody.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/MultipartBody.php deleted file mode 100755 index 72ce6e12..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/MultipartBody.php +++ /dev/null @@ -1,292 +0,0 @@ -boundary = $boundary ?: uniqid(); - $this->fields = $fields; - $this->files = $files; - - // Ensure each file is a PostFileInterface - foreach ($this->files as $file) { - if (!$file instanceof PostFileInterface) { - throw new \InvalidArgumentException('All POST fields must ' - . 'implement PostFieldInterface'); - } - } - } - - public function __toString() - { - $this->seek(0); - - return $this->getContents(); - } - - public function getContents($maxLength = -1) - { - $buffer = ''; - - while (!$this->eof()) { - if ($maxLength === -1) { - $read = 1048576; - } else { - $len = strlen($buffer); - if ($len == $maxLength) { - break; - } - $read = min(1048576, $maxLength - $len); - } - $buffer .= $this->read($read); - } - - return $buffer; - } - - /** - * Get the boundary - * - * @return string - */ - public function getBoundary() - { - return $this->boundary; - } - - public function close() - { - $this->detach(); - } - - public function detach() - { - $this->fields = $this->files = []; - } - - /** - * The stream has reached an EOF when all of the fields and files have been - * read. - * {@inheritdoc} - */ - public function eof() - { - return $this->currentField == count($this->fields) && - $this->currentFile == count($this->files); - } - - public function tell() - { - return $this->pos; - } - - public function isReadable() - { - return true; - } - - public function isWritable() - { - return false; - } - - /** - * The steam is seekable by default, but all attached files must be - * seekable too. - * {@inheritdoc} - */ - public function isSeekable() - { - foreach ($this->files as $file) { - if (!$file->getContent()->isSeekable()) { - return false; - } - } - - return true; - } - - public function getSize() - { - if ($this->size === null) { - foreach ($this->files as $file) { - // We must be able to ascertain the size of each attached file - if (null === ($size = $file->getContent()->getSize())) { - return null; - } - $this->size += strlen($this->getFileHeaders($file)) + $size; - } - foreach (array_keys($this->fields) as $key) { - $this->size += strlen($this->getFieldString($key)); - } - $this->size += strlen("\r\n--{$this->boundary}--"); - } - - return $this->size; - } - - public function read($length) - { - $content = ''; - if ($this->buffer && !$this->buffer->eof()) { - $content .= $this->buffer->read($length); - } - if ($delta = $length - strlen($content)) { - $content .= $this->readData($delta); - } - - if ($content === '' && !$this->sentLast) { - $this->sentLast = true; - $content = "\r\n--{$this->boundary}--"; - } - - return $content; - } - - public function seek($offset, $whence = SEEK_SET) - { - if ($offset != 0 || $whence != SEEK_SET || !$this->isSeekable()) { - return false; - } - - foreach ($this->files as $file) { - if (!$file->getContent()->seek(0)) { - throw new \RuntimeException('Rewind on multipart file failed ' - . 'even though it shouldn\'t have'); - } - } - - $this->buffer = $this->sentLast = null; - $this->pos = $this->currentField = $this->currentFile = 0; - $this->bufferedHeaders = []; - - return true; - } - - public function write($string) - { - return false; - } - - /** - * No data is in the read buffer, so more needs to be pulled in from fields - * and files. - * - * @param int $length Amount of data to read - * - * @return string - */ - private function readData($length) - { - $result = ''; - - if ($this->currentField < count($this->fields)) { - $result = $this->readField($length); - } - - if ($result === '' && $this->currentFile < count($this->files)) { - $result = $this->readFile($length); - } - - return $result; - } - - /** - * Create a new stream buffer and inject form-data - * - * @param int $length Amount of data to read from the stream buffer - * - * @return string - */ - private function readField($length) - { - $name = array_keys($this->fields)[++$this->currentField - 1]; - $this->buffer = Stream\create($this->getFieldString($name)); - - return $this->buffer->read($length); - } - - /** - * Read data from a POST file, fill the read buffer with any overflow - * - * @param int $length Amount of data to read from the file - * - * @return string - */ - private function readFile($length) - { - $current = $this->files[$this->currentFile]; - - // Got to the next file and recursively return the read value, or bail - // if no more data can be read. - if ($current->getContent()->eof()) { - return ++$this->currentFile == count($this->files) - ? '' - : $this->readFile($length); - } - - // If this is the start of a file, then send the headers to the read - // buffer. - if (!isset($this->bufferedHeaders[$this->currentFile])) { - $this->buffer = Stream\create($this->getFileHeaders($current)); - $this->bufferedHeaders[$this->currentFile] = true; - } - - // More data needs to be read to meet the limit, so pull from the file - $content = $this->buffer ? $this->buffer->read($length) : ''; - if (($remaining = $length - strlen($content)) > 0) { - $content .= $current->getContent()->read($remaining); - } - - return $content; - } - - private function getFieldString($key) - { - return sprintf( - "--%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n", - $this->boundary, - $key, - $this->fields[$key] - ); - } - - private function getFileHeaders(PostFileInterface $file) - { - $headers = ''; - foreach ($file->getHeaders() as $key => $value) { - $headers .= "{$key}: {$value}\r\n"; - } - - return "--{$this->boundary}\r\n" . trim($headers) . "\r\n\r\n"; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostBody.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostBody.php deleted file mode 100755 index 6ba253be..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostBody.php +++ /dev/null @@ -1,282 +0,0 @@ -files || $this->forceMultipart) { - $request->setHeader( - 'Content-Type', - 'multipart/form-data; boundary=' . $this->getBody()->getBoundary() - ); - } elseif ($this->fields) { - $request->setHeader('Content-Type', 'application/x-www-form-urlencoded'); - } - - if ($size = $this->getSize()) { - $request->setHeader('Content-Length', $size); - } - } - - public function forceMultipartUpload($force) - { - $this->forceMultipart = $force; - - return $this; - } - - public function setAggregator(callable $aggregator) - { - $this->aggregator = $aggregator; - } - - public function setField($name, $value) - { - $this->fields[$name] = $value; - $this->mutate(); - - return $this; - } - - public function replaceFields(array $fields) - { - $this->fields = $fields; - $this->mutate(); - - return $this; - } - - public function getField($name) - { - return isset($this->fields[$name]) ? $this->fields[$name] : null; - } - - public function removeField($name) - { - unset($this->fields[$name]); - $this->mutate(); - - return $this; - } - - public function getFields($asString = false) - { - if (!$asString) { - return $this->fields; - } - - return (string) (new Query($this->fields)) - ->setEncodingType(Query::RFC1738) - ->setAggregator($this->getAggregator()); - } - - public function hasField($name) - { - return isset($this->fields[$name]); - } - - public function getFile($name) - { - foreach ($this->files as $file) { - if ($file->getName() == $name) { - return $file; - } - } - - return null; - } - - public function getFiles() - { - return $this->files; - } - - public function addFile(PostFileInterface $file) - { - $this->files[] = $file; - $this->mutate(); - - return $this; - } - - public function clearFiles() - { - $this->files = []; - $this->mutate(); - - return $this; - } - - /** - * Returns the numbers of fields + files - * - * @return int - */ - public function count() - { - return count($this->files) + count($this->fields); - } - - public function __toString() - { - return (string) $this->getBody(); - } - - public function getContents($maxLength = -1) - { - return $this->getBody()->getContents(); - } - - public function close() - { - return $this->body ? $this->body->close() : true; - } - - public function detach() - { - $this->body = null; - $this->fields = $this->files = []; - - return $this; - } - - public function eof() - { - return $this->getBody()->eof(); - } - - public function tell() - { - return $this->body ? $this->body->tell() : 0; - } - - public function isSeekable() - { - return true; - } - - public function isReadable() - { - return true; - } - - public function isWritable() - { - return false; - } - - public function getSize() - { - return $this->getBody()->getSize(); - } - - public function seek($offset, $whence = SEEK_SET) - { - return $this->getBody()->seek($offset, $whence); - } - - public function read($length) - { - return $this->getBody()->read($length); - } - - public function write($string) - { - return false; - } - - /** - * Return a stream object that is built from the POST fields and files. - * - * If one has already been created, the previously created stream will be - * returned. - */ - private function getBody() - { - if ($this->body) { - return $this->body; - } elseif ($this->files || $this->forceMultipart) { - return $this->body = $this->createMultipart(); - } elseif ($this->fields) { - return $this->body = $this->createUrlEncoded(); - } else { - return $this->body = Stream\create(); - } - } - - /** - * Get the aggregator used to join multi-valued field parameters - * - * @return callable - */ - final protected function getAggregator() - { - if (!$this->aggregator) { - $this->aggregator = Query::phpAggregator(); - } - - return $this->aggregator; - } - - /** - * Creates a multipart/form-data body stream - * - * @return MultipartBody - */ - private function createMultipart() - { - // Flatten the nested query string values using the correct aggregator - $query = (string) (new Query($this->fields)) - ->setEncodingType(false) - ->setAggregator($this->getAggregator()); - // Convert the flattened query string back into an array - $fields = Query::fromString($query)->toArray(); - - return new MultipartBody($fields, $this->files); - } - - /** - * Creates an application/x-www-form-urlencoded stream body - * - * @return Stream\StreamInterface - */ - private function createUrlEncoded() - { - return Stream\create($this->getFields(true)); - } - - /** - * Get rid of any cached data - */ - private function mutate() - { - $this->body = null; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostBodyInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostBodyInterface.php deleted file mode 100755 index 4405ce21..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostBodyInterface.php +++ /dev/null @@ -1,129 +0,0 @@ -headers = $headers; - $this->name = $name; - $this->prepareContent($content); - $this->prepareFilename($filename); - $this->prepareDefaultHeaders(); - } - - public function getName() - { - return $this->name; - } - - public function getFilename() - { - return $this->filename; - } - - public function getContent() - { - return $this->content; - } - - public function getHeaders() - { - return $this->headers; - } - - /** - * Prepares the contents of a POST file. - * - * @param mixed $content Content of the POST file - */ - private function prepareContent($content) - { - $this->content = $content; - - if (!($this->content instanceof StreamInterface)) { - $this->content = \GuzzleHttp\Stream\create($this->content); - } elseif ($this->content instanceof MultipartBody) { - if (!$this->hasHeader('Content-Disposition')) { - $disposition = 'form-data; name="' . $this->name .'"'; - $this->headers['Content-Disposition'] = $disposition; - } - - if (!$this->hasHeader('Content-Type')) { - $this->headers['Content-Type'] = sprintf( - "multipart/form-data; boundary=%s", - $this->content->getBoundary() - ); - } - } - } - - /** - * Applies a file name to the POST file based on various checks. - * - * @param string|null $filename Filename to apply (or null to guess) - */ - private function prepareFilename($filename) - { - $this->filename = $filename; - - if (!$this->filename && - $this->content instanceof MetadataStreamInterface - ) { - $this->filename = $this->content->getMetadata('uri'); - } - - if (!$this->filename || substr($this->filename, 0, 6) === 'php://') { - $this->filename = $this->name; - } - } - - /** - * Applies default Content-Disposition and Content-Type headers if needed. - */ - private function prepareDefaultHeaders() - { - // Set a default content-disposition header if one was no provided - if (!$this->hasHeader('Content-Disposition')) { - $this->headers['Content-Disposition'] = sprintf( - 'form-data; filename="%s"; name="%s"', - basename($this->filename), - $this->name - ); - } - - // Set a default Content-Type if one was not supplied - if (!$this->hasHeader('Content-Type')) { - $this->headers['Content-Type'] = Mimetypes::getInstance() - ->fromFilename($this->filename) ?: 'text/plain'; - } - } - - /** - * Check if a specific header exists on the POST file by name. - * - * @param string $name Case-insensitive header to check - * - * @return bool - */ - private function hasHeader($name) - { - return isset(array_change_key_case($this->headers)[strtolower($name)]); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostFileInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostFileInterface.php deleted file mode 100755 index 205dd967..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Post/PostFileInterface.php +++ /dev/null @@ -1,42 +0,0 @@ -add($key, $value); - $foundDuplicates = true; - } elseif ($paramIsPhpStyleArray) { - $q[$key] = array($value); - } else { - $q[$key] = $value; - } - } else { - $q->add($key, null); - } - } - - // Use the duplicate aggregator if duplicates were found and not using - // PHP style arrays. - if ($foundDuplicates && !$foundPhpStyle) { - $q->setAggregator(self::duplicateAggregator()); - } - - return $q; - } - - /** - * Convert the query string parameters to a query string string - * - * @return string - */ - public function __toString() - { - if (!$this->data) { - return ''; - } - - // The default aggregator is statically cached - static $defaultAggregator; - - if (!$this->aggregator) { - if (!$defaultAggregator) { - $defaultAggregator = self::phpAggregator(); - } - $this->aggregator = $defaultAggregator; - } - - $result = ''; - $aggregator = $this->aggregator; - - foreach ($aggregator($this->data) as $key => $values) { - foreach ($values as $value) { - if ($result) { - $result .= '&'; - } - if ($this->encoding == self::RFC1738) { - $result .= urlencode($key); - if ($value !== null) { - $result .= '=' . urlencode($value); - } - } elseif ($this->encoding == self::RFC3986) { - $result .= rawurlencode($key); - if ($value !== null) { - $result .= '=' . rawurlencode($value); - } - } else { - $result .= $key; - if ($value !== null) { - $result .= '=' . $value; - } - } - } - } - - return $result; - } - - /** - * Controls how multi-valued query string parameters are aggregated into a - * string. - * - * $query->setAggregator($query::duplicateAggregator()); - * - * @param callable $aggregator Callable used to convert a deeply nested - * array of query string variables into a flattened array of key value - * pairs. The callable accepts an array of query data and returns a - * flattened array of key value pairs where each value is an array of - * strings. - * - * @return self - */ - public function setAggregator(callable $aggregator) - { - $this->aggregator = $aggregator; - - return $this; - } - - /** - * Specify how values are URL encoded - * - * @param string|bool $type One of 'RFC1738', 'RFC3986', or false to disable encoding - * - * @return self - * @throws \InvalidArgumentException - */ - public function setEncodingType($type) - { - if ($type === false || $type === self::RFC1738 || $type === self::RFC3986) { - $this->encoding = $type; - } else { - throw new \InvalidArgumentException('Invalid URL encoding type'); - } - - return $this; - } - - /** - * Query string aggregator that does not aggregate nested query string - * values and allows duplicates in the resulting array. - * - * Example: http://test.com?q=1&q=2 - * - * @return callable - */ - public static function duplicateAggregator() - { - return function (array $data) { - return self::walkQuery($data, '', function ($key, $prefix) { - return is_int($key) ? $prefix : "{$prefix}[{$key}]"; - }); - }; - } - - /** - * Aggregates nested query string variables using the same technique as - * ``http_build_query()``. - * - * @param bool $numericIndices Pass false to not include numeric indices - * when multi-values query string parameters are present. - * - * @return callable - */ - public static function phpAggregator($numericIndices = true) - { - return function (array $data) use ($numericIndices) { - return self::walkQuery( - $data, - '', - function ($key, $prefix) use ($numericIndices) { - return !$numericIndices && is_int($key) - ? "{$prefix}[]" - : "{$prefix}[{$key}]"; - } - ); - }; - } - - /** - * Easily create query aggregation functions by providing a key prefix - * function to this query string array walker. - * - * @param array $query Query string to walk - * @param string $keyPrefix Key prefix (start with '') - * @param callable $prefixer Function used to create a key prefix - * - * @return array - */ - public static function walkQuery(array $query, $keyPrefix, callable $prefixer) - { - $result = []; - foreach ($query as $key => $value) { - if ($keyPrefix) { - $key = $prefixer($key, $keyPrefix); - } - if (is_array($value)) { - $result += self::walkQuery($value, $key, $prefixer); - } elseif (isset($result[$key])) { - $result[$key][] = $value; - } else { - $result[$key] = array($value); - } - } - - return $result; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Cookie.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Cookie.php deleted file mode 100755 index 4b8a2c08..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Cookie.php +++ /dev/null @@ -1,59 +0,0 @@ -cookieJar = $cookieJar ?: new CookieJar(); - } - - public function getEvents() - { - // Fire the cookie plugin complete event before redirecting - return [ - 'before' => ['onBefore'], - 'complete' => ['onComplete', RequestEvents::REDIRECT_RESPONSE + 10] - ]; - } - - /** - * Get the cookie cookieJar - * - * @return CookieJarInterface - */ - public function getCookieJar() - { - return $this->cookieJar; - } - - public function onBefore(BeforeEvent $event) - { - $this->cookieJar->addCookieHeader($event->getRequest()); - } - - public function onComplete(CompleteEvent $event) - { - $this->cookieJar->extractCookies( - $event->getRequest(), - $event->getResponse() - ); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/History.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/History.php deleted file mode 100755 index b2a49e04..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/History.php +++ /dev/null @@ -1,138 +0,0 @@ -limit = $limit; - } - - public function getEvents() - { - return [ - 'complete' => ['onComplete', RequestEvents::EARLY], - 'error' => ['onError', RequestEvents::EARLY], - ]; - } - - /** - * Convert to a string that contains all request and response headers - * - * @return string - */ - public function __toString() - { - $lines = array(); - foreach ($this->transactions as $entry) { - $response = isset($entry['response']) ? $entry['response'] : ''; - $lines[] = '> ' . trim($entry['request']) . "\n\n< " . trim($response) . "\n"; - } - - return implode("\n", $lines); - } - - public function onComplete(CompleteEvent $event) - { - $this->add($event->getRequest(), $event->getResponse()); - } - - public function onError(ErrorEvent $event) - { - $this->add($event->getRequest(), $event->getResponse()); - } - - /** - * Returns an Iterator that yields associative array values where each - * associative array contains a 'request' and 'response' key. - * - * @return \Iterator - */ - public function getIterator() - { - return new \ArrayIterator($this->transactions); - } - - /** - * Get all of the requests sent through the plugin - * - * @return RequestInterface[] - */ - public function getRequests() - { - return array_map(function ($t) { - return $t['request']; - }, $this->transactions); - } - - /** - * Get the number of requests in the history - * - * @return int - */ - public function count() - { - return count($this->transactions); - } - - /** - * Get the last request sent - * - * @return RequestInterface - */ - public function getLastRequest() - { - return end($this->transactions)['request']; - } - - /** - * Get the last response in the history - * - * @return ResponseInterface|null - */ - public function getLastResponse() - { - return end($this->transactions)['response']; - } - - /** - * Clears the history - */ - public function clear() - { - $this->transactions = array(); - } - - /** - * Add a request to the history - * - * @param RequestInterface $request Request to add - * @param ResponseInterface $response Response of the request - */ - private function add( - RequestInterface $request, - ResponseInterface $response = null - ) { - $this->transactions[] = ['request' => $request, 'response' => $response]; - if (count($this->transactions) > $this->limit) { - array_shift($this->transactions); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/HttpError.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/HttpError.php deleted file mode 100755 index f2f72f15..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/HttpError.php +++ /dev/null @@ -1,34 +0,0 @@ - ['onComplete', RequestEvents::VERIFY_RESPONSE]]; - } - - /** - * Throw a RequestException on an HTTP protocol error - * - * @param CompleteEvent $event Emitted event - * @throws RequestException - */ - public function onComplete(CompleteEvent $event) - { - $code = (string) $event->getResponse()->getStatusCode(); - // Throw an exception for an unsuccessful response - if ($code[0] === '4' || $code[0] === '5') { - throw RequestException::create($event->getRequest(), $event->getResponse()); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Mock.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Mock.php deleted file mode 100755 index 99a3d18d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Mock.php +++ /dev/null @@ -1,143 +0,0 @@ -factory = new MessageFactory(); - $this->readBodies = $readBodies; - $this->addMultiple($items); - } - - public function getEvents() - { - // Fire the event last, after signing - return ['before' => ['onBefore', RequestEvents::SIGN_REQUEST - 10]]; - } - - /** - * @throws \OutOfBoundsException|\Exception - */ - public function onBefore(BeforeEvent $event) - { - if (!$item = array_shift($this->queue)) { - throw new \OutOfBoundsException('Mock queue is empty'); - } elseif ($item instanceof RequestException) { - throw $item; - } - - // Emulate the receiving of the response headers - $request = $event->getRequest(); - $transaction = new Transaction($event->getClient(), $request); - $transaction->setResponse($item); - $request->getEmitter()->emit( - 'headers', - new HeadersEvent($transaction) - ); - - // Emulate reading a response body - if ($this->readBodies && $request->getBody()) { - while (!$request->getBody()->eof()) { - $request->getBody()->read(8096); - } - } - - $event->intercept($item); - } - - public function count() - { - return count($this->queue); - } - - /** - * Add a response to the end of the queue - * - * @param string|ResponseInterface $response Response or path to response file - * - * @return self - * @throws \InvalidArgumentException if a string or Response is not passed - */ - public function addResponse($response) - { - if (is_string($response)) { - $response = file_exists($response) - ? $this->factory->fromMessage(file_get_contents($response)) - : $this->factory->fromMessage($response); - } elseif (!($response instanceof ResponseInterface)) { - throw new \InvalidArgumentException('Response must a message ' - . 'string, response object, or path to a file'); - } - - $this->queue[] = $response; - - return $this; - } - - /** - * Add an exception to the end of the queue - * - * @param RequestException $e Exception to throw when the request is executed - * - * @return self - */ - public function addException(RequestException $e) - { - $this->queue[] = $e; - - return $this; - } - - /** - * Add multiple items to the queue - * - * @param array $items Items to add - */ - public function addMultiple(array $items) - { - foreach ($items as $item) { - if ($item instanceof RequestException) { - $this->addException($item); - } else { - $this->addResponse($item); - } - } - } - - /** - * Clear the queue - */ - public function clearQueue() - { - $this->queue = []; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Prepare.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Prepare.php deleted file mode 100755 index 2d82acd6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Prepare.php +++ /dev/null @@ -1,136 +0,0 @@ - ['onBefore', RequestEvents::PREPARE_REQUEST]]; - } - - public function onBefore(BeforeEvent $event) - { - $request = $event->getRequest(); - - // Set the appropriate Content-Type for a request if one is not set and - // there are form fields - if (!($body = $request->getBody())) { - return; - } - - $this->addContentLength($request, $body); - - if ($body instanceof PostBodyInterface) { - // Synchronize the POST body with the request's headers - $body->applyRequestHeaders($request); - } elseif (!$request->hasHeader('Content-Type')) { - $this->addContentType($request, $body); - } - - $this->addExpectHeader($request, $body); - } - - private function addContentType( - RequestInterface $request, - StreamInterface $body - ) { - if (!($body instanceof MetadataStreamInterface)) { - return; - } - - if (!($uri = $body->getMetadata('uri'))) { - return; - } - - // Guess the content-type based on the stream's "uri" metadata value. - // The file extension is used to determine the appropriate mime-type. - if ($contentType = Mimetypes::getInstance()->fromFilename($uri)) { - $request->setHeader('Content-Type', $contentType); - } - } - - private function addContentLength( - RequestInterface $request, - StreamInterface $body - ) { - // Set the Content-Length header if it can be determined, and never - // send a Transfer-Encoding: chunked and Content-Length header in - // the same request. - if ($request->hasHeader('Content-Length')) { - // Remove transfer-encoding if content-length is set. - $request->removeHeader('Transfer-Encoding'); - return; - } - - if ($request->hasHeader('Transfer-Encoding')) { - return; - } - - if (null !== ($size = $body->getSize())) { - $request->setHeader('Content-Length', $size) - ->removeHeader('Transfer-Encoding'); - } elseif ('1.1' == $request->getProtocolVersion()) { - // Use chunked Transfer-Encoding if there is no determinable - // content-length header and we're using HTTP/1.1. - $request->setHeader('Transfer-Encoding', 'chunked') - ->removeHeader('Content-Length'); - } - } - - private function addExpectHeader( - RequestInterface $request, - StreamInterface $body - ) { - // Determine if the Expect header should be used - if ($request->hasHeader('Expect')) { - return; - } - - $expect = $request->getConfig()['expect']; - - // Return if disabled or if you're not using HTTP/1.1 - if ($expect === false || $request->getProtocolVersion() !== '1.1') { - return; - } - - // The expect header is unconditionally enabled - if ($expect === true) { - $request->setHeader('Expect', '100-Continue'); - return; - } - - // By default, send the expect header when the payload is > 1mb - if ($expect === null) { - $expect = 1048576; - } - - // Always add if the body cannot be rewound, the size cannot be - // determined, or the size is greater than the cutoff threshold - $size = $body->getSize(); - if ($size === null || $size >= (int) $expect || !$body->isSeekable()) { - $request->setHeader('Expect', '100-Continue'); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Redirect.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Redirect.php deleted file mode 100755 index bd8988d8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Subscriber/Redirect.php +++ /dev/null @@ -1,172 +0,0 @@ - ['onComplete', RequestEvents::REDIRECT_RESPONSE]]; - } - - /** - * Rewind the entity body of the request if needed - * - * @param RequestInterface $redirectRequest - * @throws CouldNotRewindStreamException - */ - public static function rewindEntityBody(RequestInterface $redirectRequest) - { - // Rewind the entity body of the request if needed - if ($redirectRequest->getBody()) { - $body = $redirectRequest->getBody(); - // Only rewind the body if some of it has been read already, and - // throw an exception if the rewind fails - if ($body->tell() && !$body->seek(0)) { - throw new CouldNotRewindStreamException( - 'Unable to rewind the non-seekable request body after redirecting', - $redirectRequest - ); - } - } - } - - /** - * Called when a request receives a redirect response - * - * @param CompleteEvent $event Event emitted - * @throws TooManyRedirectsException - */ - public function onComplete(CompleteEvent $event) - { - $response = $event->getResponse(); - - if (substr($response->getStatusCode(), 0, 1) != '3' || - !$response->hasHeader('Location') - ) { - return; - } - - $redirectCount = 0; - $request = $event->getRequest(); - $redirectResponse = $response; - $max = $request->getConfig()->getPath('redirect/max') ?: 5; - - do { - if (++$redirectCount > $max) { - throw new TooManyRedirectsException( - "Will not follow more than {$redirectCount} redirects", - $request - ); - } - $redirectRequest = $this->createRedirectRequest($request, $redirectResponse); - $redirectResponse = $event->getClient()->send($redirectRequest); - } while (substr($redirectResponse->getStatusCode(), 0, 1) == '3' && - $redirectResponse->hasHeader('Location') - ); - - if ($redirectResponse !== $response) { - $event->intercept($redirectResponse); - } - } - - /** - * Create a redirect request for a specific request object - * - * Takes into account strict RFC compliant redirection (e.g. redirect POST - * with POST) vs doing what most clients do (e.g. redirect POST with GET). - * - * @param RequestInterface $request - * @param ResponseInterface $response - * - * @return RequestInterface Returns a new redirect request - * @throws CouldNotRewindStreamException If the body cannot be rewound. - */ - private function createRedirectRequest( - RequestInterface $request, - ResponseInterface $response - ) { - $config = $request->getConfig(); - - // Use a GET request if this is an entity enclosing request and we are - // not forcing RFC compliance, but rather emulating what all browsers - // would do. Be sure to disable redirects on the clone. - $redirectRequest = clone $request; - $redirectRequest->getEmitter()->detach($this); - $statusCode = $response->getStatusCode(); - - if ($statusCode == 303 || - ($statusCode <= 302 && $request->getBody() && - !$config->getPath('redirect/strict')) - ) { - $redirectRequest->setMethod('GET'); - $redirectRequest->setBody(null); - } - - $this->setRedirectUrl($redirectRequest, $response); - $this->rewindEntityBody($redirectRequest); - - // Add the Referer header if it is told to do so and only - // add the header if we are not redirecting from https to http. - if ($config->getPath('redirect/referer') && ( - $redirectRequest->getScheme() == 'https' || - $redirectRequest->getScheme() == $request->getScheme() - )) { - $url = Url::fromString($request->getUrl()); - $url->setUsername(null)->setPassword(null); - $redirectRequest->setHeader('Referer', (string) $url); - } - - return $redirectRequest; - } - - /** - * Set the appropriate URL on the request based on the location header - * - * @param RequestInterface $redirectRequest - * @param ResponseInterface $response - */ - private function setRedirectUrl( - RequestInterface $redirectRequest, - ResponseInterface $response - ) { - $location = $response->getHeader('Location'); - $location = Url::fromString($location); - - // Combine location with the original URL if it is not absolute. - if (!$location->isAbsolute()) { - $originalUrl = Url::fromString($redirectRequest->getUrl()); - // Remove query string parameters and just take what is present on - // the redirect Location header - $originalUrl->getQuery()->clear(); - $location = $originalUrl->combine($location); - } - - $redirectRequest->setUrl($location); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/ToArrayInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/ToArrayInterface.php deleted file mode 100755 index 7c4120fb..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/ToArrayInterface.php +++ /dev/null @@ -1,16 +0,0 @@ - array('prefix' => '', 'joiner' => ',', 'query' => false), - '+' => array('prefix' => '', 'joiner' => ',', 'query' => false), - '#' => array('prefix' => '#', 'joiner' => ',', 'query' => false), - '.' => array('prefix' => '.', 'joiner' => '.', 'query' => false), - '/' => array('prefix' => '/', 'joiner' => '/', 'query' => false), - ';' => array('prefix' => ';', 'joiner' => ';', 'query' => true), - '?' => array('prefix' => '?', 'joiner' => '&', 'query' => true), - '&' => array('prefix' => '&', 'joiner' => '&', 'query' => true) - ); - - /** @var array Delimiters */ - private static $delims = array(':', '/', '?', '#', '[', ']', '@', '!', '$', - '&', '\'', '(', ')', '*', '+', ',', ';', '='); - - /** @var array Percent encoded delimiters */ - private static $delimsPct = array('%3A', '%2F', '%3F', '%23', '%5B', '%5D', - '%40', '%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C', - '%3B', '%3D'); - - public function expand($template, array $variables) - { - if (false === strpos($template, '{')) { - return $template; - } - - $this->template = $template; - $this->variables = $variables; - - return preg_replace_callback( - '/\{([^\}]+)\}/', - [$this, 'expandMatch'], - $this->template - ); - } - - /** - * Parse an expression into parts - * - * @param string $expression Expression to parse - * - * @return array Returns an associative array of parts - */ - private function parseExpression($expression) - { - $result = array(); - - if (isset(self::$operatorHash[$expression[0]])) { - $result['operator'] = $expression[0]; - $expression = substr($expression, 1); - } else { - $result['operator'] = ''; - } - - foreach (explode(',', $expression) as $value) { - $value = trim($value); - $varspec = array(); - if ($colonPos = strpos($value, ':')) { - $varspec['value'] = substr($value, 0, $colonPos); - $varspec['modifier'] = ':'; - $varspec['position'] = (int) substr($value, $colonPos + 1); - } elseif (substr($value, -1) == '*') { - $varspec['modifier'] = '*'; - $varspec['value'] = substr($value, 0, -1); - } else { - $varspec['value'] = (string) $value; - $varspec['modifier'] = ''; - } - $result['values'][] = $varspec; - } - - return $result; - } - - /** - * Process an expansion - * - * @param array $matches Matches met in the preg_replace_callback - * - * @return string Returns the replacement string - */ - private function expandMatch(array $matches) - { - static $rfc1738to3986 = array('+' => '%20', '%7e' => '~'); - - $replacements = array(); - $parsed = self::parseExpression($matches[1]); - $prefix = self::$operatorHash[$parsed['operator']]['prefix']; - $joiner = self::$operatorHash[$parsed['operator']]['joiner']; - $useQuery = self::$operatorHash[$parsed['operator']]['query']; - - foreach ($parsed['values'] as $value) { - - if (!isset($this->variables[$value['value']])) { - continue; - } - - $variable = $this->variables[$value['value']]; - $actuallyUseQuery = $useQuery; - $expanded = ''; - - if (is_array($variable)) { - - $isAssoc = $this->isAssoc($variable); - $kvp = array(); - foreach ($variable as $key => $var) { - - if ($isAssoc) { - $key = rawurlencode($key); - $isNestedArray = is_array($var); - } else { - $isNestedArray = false; - } - - if (!$isNestedArray) { - $var = rawurlencode($var); - if ($parsed['operator'] == '+' || - $parsed['operator'] == '#' - ) { - $var = $this->decodeReserved($var); - } - } - - if ($value['modifier'] == '*') { - if ($isAssoc) { - if ($isNestedArray) { - // Nested arrays must allow for deeply nested - // structures. - $var = strtr( - http_build_query([$key => $var]), - $rfc1738to3986 - ); - } else { - $var = $key . '=' . $var; - } - } elseif ($key > 0 && $actuallyUseQuery) { - $var = $value['value'] . '=' . $var; - } - } - - $kvp[$key] = $var; - } - - if (empty($variable)) { - $actuallyUseQuery = false; - } elseif ($value['modifier'] == '*') { - $expanded = implode($joiner, $kvp); - if ($isAssoc) { - // Don't prepend the value name when using the explode - // modifier with an associative array. - $actuallyUseQuery = false; - } - } else { - if ($isAssoc) { - // When an associative array is encountered and the - // explode modifier is not set, then the result must be - // a comma separated list of keys followed by their - // respective values. - foreach ($kvp as $k => &$v) { - $v = $k . ',' . $v; - } - } - $expanded = implode(',', $kvp); - } - - } else { - if ($value['modifier'] == ':') { - $variable = substr($variable, 0, $value['position']); - } - $expanded = rawurlencode($variable); - if ($parsed['operator'] == '+' || $parsed['operator'] == '#') { - $expanded = $this->decodeReserved($expanded); - } - } - - if ($actuallyUseQuery) { - if (!$expanded && $joiner != '&') { - $expanded = $value['value']; - } else { - $expanded = $value['value'] . '=' . $expanded; - } - } - - $replacements[] = $expanded; - } - - $ret = implode($joiner, $replacements); - if ($ret && $prefix) { - return $prefix . $ret; - } - - return $ret; - } - - /** - * Determines if an array is associative. - * - * This makes the assumption that input arrays are sequences or hashes. - * This assumption is a tradeoff for accuracy in favor of speed, but it - * should work in almost every case where input is supplied for a URI - * template. - * - * @param array $array Array to check - * - * @return bool - */ - private function isAssoc(array $array) - { - return $array && array_keys($array)[0] !== 0; - } - - /** - * Removes percent encoding on reserved characters (used with + and # - * modifiers). - * - * @param string $string String to fix - * - * @return string - */ - private function decodeReserved($string) - { - return str_replace(self::$delimsPct, self::$delims, $string); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Url.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Url.php deleted file mode 100755 index a305a768..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/Url.php +++ /dev/null @@ -1,585 +0,0 @@ - 80, 'https' => 443, 'ftp' => 21]; - - /** @var Query Query part of the URL */ - private $query; - - /** - * Factory method to create a new URL from a URL string - * - * @param string $url Full URL used to create a Url object - * - * @return Url - * @throws \InvalidArgumentException - */ - public static function fromString($url) - { - static $defaults = array('scheme' => null, 'host' => null, - 'path' => null, 'port' => null, 'query' => null, - 'user' => null, 'pass' => null, 'fragment' => null); - - if (false === ($parts = parse_url($url))) { - throw new \InvalidArgumentException('Unable to parse malformed ' - . 'url: ' . $url); - } - - $parts += $defaults; - - // Convert the query string into a Query object - if ($parts['query'] || 0 !== strlen($parts['query'])) { - $parts['query'] = Query::fromString($parts['query']); - } - - return new static($parts['scheme'], $parts['host'], $parts['user'], - $parts['pass'], $parts['port'], $parts['path'], $parts['query'], - $parts['fragment']); - } - - /** - * Build a URL from parse_url parts. The generated URL will be a relative - * URL if a scheme or host are not provided. - * - * @param array $parts Array of parse_url parts - * - * @return string - */ - public static function buildUrl(array $parts) - { - $url = $scheme = ''; - - if (!empty($parts['scheme'])) { - $scheme = $parts['scheme']; - $url .= $scheme . ':'; - } - - if (!empty($parts['host'])) { - $url .= '//'; - if (isset($parts['user'])) { - $url .= $parts['user']; - if (isset($parts['pass'])) { - $url .= ':' . $parts['pass']; - } - $url .= '@'; - } - - $url .= $parts['host']; - - // Only include the port if it is not the default port of the scheme - if (isset($parts['port']) && - (!isset(self::$defaultPorts[$scheme]) || - $parts['port'] != self::$defaultPorts[$scheme]) - ) { - $url .= ':' . $parts['port']; - } - } - - // Add the path component if present - if (isset($parts['path']) && strlen($parts['path'])) { - // Always ensure that the path begins with '/' if set and something - // is before the path - if (isset($parts['host']) && $parts['path'][0] != '/') { - $url .= '/'; - } - $url .= $parts['path']; - } - - // Add the query string if present - if (isset($parts['query'])) { - $queryStr = (string) $parts['query']; - if ($queryStr || $queryStr === '0') { - $url .= '?' . $queryStr; - } - } - - // Ensure that # is only added to the url if fragment contains anything. - if (isset($parts['fragment'])) { - $url .= '#' . $parts['fragment']; - } - - return $url; - } - - /** - * Create a new URL from URL parts - * - * @param string $scheme Scheme of the URL - * @param string $host Host of the URL - * @param string $username Username of the URL - * @param string $password Password of the URL - * @param int $port Port of the URL - * @param string $path Path of the URL - * @param Query|array|string $query Query string of the URL - * @param string $fragment Fragment of the URL - */ - public function __construct( - $scheme, - $host, - $username = null, - $password = null, - $port = null, - $path = null, - Query $query = null, - $fragment = null - ) { - $this->scheme = $scheme; - $this->host = $host; - $this->port = $port; - $this->username = $username; - $this->password = $password; - $this->fragment = $fragment; - if (!$query) { - $this->query = new Query(); - } else { - $this->setQuery($query); - } - $this->setPath($path); - } - - /** - * Clone the URL - */ - public function __clone() - { - $this->query = clone $this->query; - } - - /** - * Returns the URL as a URL string - * - * @return string - */ - public function __toString() - { - return static::buildUrl($this->getParts()); - } - - /** - * Get the parts of the URL as an array - * - * @return array - */ - public function getParts() - { - return array( - 'scheme' => $this->scheme, - 'user' => $this->username, - 'pass' => $this->password, - 'host' => $this->host, - 'port' => $this->port, - 'path' => $this->path, - 'query' => $this->query, - 'fragment' => $this->fragment, - ); - } - - /** - * Set the host of the request. - * - * @param string $host Host to set (e.g. www.yahoo.com, yahoo.com) - * - * @return Url - */ - public function setHost($host) - { - if (strpos($host, ':') === false) { - $this->host = $host; - } else { - list($host, $port) = explode(':', $host); - $this->host = $host; - $this->setPort($port); - } - - return $this; - } - - /** - * Get the host part of the URL - * - * @return string - */ - public function getHost() - { - return $this->host; - } - - /** - * Set the scheme part of the URL (http, https, ftp, etc.) - * - * @param string $scheme Scheme to set - * - * @return Url - */ - public function setScheme($scheme) - { - // Remove the default port if one is specified - if ($this->port && isset(self::$defaultPorts[$this->scheme]) && - self::$defaultPorts[$this->scheme] == $this->port - ) { - $this->port = null; - } - - $this->scheme = $scheme; - - return $this; - } - - /** - * Get the scheme part of the URL - * - * @return string - */ - public function getScheme() - { - return $this->scheme; - } - - /** - * Set the port part of the URL - * - * @param int $port Port to set - * - * @return Url - */ - public function setPort($port) - { - $this->port = $port; - - return $this; - } - - /** - * Get the port part of the URl. - * - * If no port was set, this method will return the default port for the - * scheme of the URI. - * - * @return int|null - */ - public function getPort() - { - if ($this->port) { - return $this->port; - } elseif (isset(self::$defaultPorts[$this->scheme])) { - return self::$defaultPorts[$this->scheme]; - } - - return null; - } - - /** - * Set the path part of the URL - * - * @param string $path Path string to set - * - * @return Url - */ - public function setPath($path) - { - static $search = [' ', '?']; - static $replace = ['%20', '%3F']; - $this->path = str_replace($search, $replace, $path); - - return $this; - } - - /** - * Removes dot segments from a URL - * - * @return Url - * @link http://tools.ietf.org/html/rfc3986#section-5.2.4 - */ - public function removeDotSegments() - { - static $noopPaths = ['' => true, '/' => true, '*' => true]; - static $ignoreSegments = ['' => true, '.' => true, '..' => true]; - - if (isset($noopPaths[$this->path])) { - return $this; - } - - $results = []; - $segments = $this->getPathSegments(); - foreach ($segments as $segment) { - if ($segment == '..') { - array_pop($results); - } elseif (!isset($ignoreSegments[$segment])) { - $results[] = $segment; - } - } - - // Combine the normalized parts and add the leading slash if needed - if ($this->path[0] == '/') { - $this->path = '/' . implode('/', $results); - } else { - $this->path = implode('/', $results); - } - - // Add the trailing slash if necessary - if ($this->path != '/' && isset($ignoreSegments[end($segments)])) { - $this->path .= '/'; - } - - return $this; - } - - /** - * Add a relative path to the currently set path. - * - * @param string $relativePath Relative path to add - * - * @return Url - */ - public function addPath($relativePath) - { - if ($relativePath != '/' && - is_string($relativePath) && - strlen($relativePath) > 0 - ) { - // Add a leading slash if needed - if ($relativePath[0] != '/') { - $relativePath = '/' . $relativePath; - } - $this->setPath(str_replace('//', '/', $this->path . $relativePath)); - } - - return $this; - } - - /** - * Get the path part of the URL - * - * @return string - */ - public function getPath() - { - return $this->path; - } - - /** - * Get the path segments of the URL as an array - * - * @return array - */ - public function getPathSegments() - { - return explode('/', $this->path); - } - - /** - * Set the password part of the URL - * - * @param string $password Password to set - * - * @return Url - */ - public function setPassword($password) - { - $this->password = $password; - - return $this; - } - - /** - * Get the password part of the URL - * - * @return null|string - */ - public function getPassword() - { - return $this->password; - } - - /** - * Set the username part of the URL - * - * @param string $username Username to set - * - * @return Url - */ - public function setUsername($username) - { - $this->username = $username; - - return $this; - } - - /** - * Get the username part of the URl - * - * @return null|string - */ - public function getUsername() - { - return $this->username; - } - - /** - * Get the query part of the URL as a Query object - * - * @return Query - */ - public function getQuery() - { - return $this->query; - } - - /** - * Set the query part of the URL - * - * @param Query|string|array $query Query string value to set. Can - * be a string that will be parsed into a Query object, an array - * of key value pairs, or a Query object. - * - * @return Url - * @throws \InvalidArgumentException - */ - public function setQuery($query) - { - if ($query instanceof Query) { - $this->query = $query; - } elseif (is_string($query)) { - $this->query = Query::fromString($query); - } elseif (is_array($query)) { - $this->query = new Query($query); - } else { - throw new \InvalidArgumentException('Query must be a ' - . 'QueryInterface, array, or string'); - } - - return $this; - } - - /** - * Get the fragment part of the URL - * - * @return null|string - */ - public function getFragment() - { - return $this->fragment; - } - - /** - * Set the fragment part of the URL - * - * @param string $fragment Fragment to set - * - * @return Url - */ - public function setFragment($fragment) - { - $this->fragment = $fragment; - - return $this; - } - - /** - * Check if this is an absolute URL - * - * @return bool - */ - public function isAbsolute() - { - return $this->scheme && $this->host; - } - - /** - * Combine the URL with another URL and return a new URL instance. - * - * Follows the rules specific in RFC 3986 section 5.4. - * - * @param string $url Relative URL to combine with - * - * @return Url - * @throws \InvalidArgumentException - * @link http://tools.ietf.org/html/rfc3986#section-5.4 - */ - public function combine($url) - { - $url = static::fromString($url); - - // Use the more absolute URL as the base URL - if (!$this->isAbsolute() && $url->isAbsolute()) { - $url = $url->combine($this); - } - - $parts = $url->getParts(); - - // Passing a URL with a scheme overrides everything - if ($parts['scheme']) { - return new static( - $parts['scheme'], - $parts['host'], - $parts['user'], - $parts['pass'], - $parts['port'], - $parts['path'], - clone $parts['query'], - $parts['fragment'] - ); - } - - // Setting a host overrides the entire rest of the URL - if ($parts['host']) { - return new static( - $this->scheme, - $parts['host'], - $parts['user'], - $parts['pass'], - $parts['port'], - $parts['path'], - clone $parts['query'], - $parts['fragment'] - ); - } - - if (!$parts['path']) { - // The relative URL has no path, so check if it is just a query - $path = $this->path ?: ''; - $query = count($parts['query']) ? $parts['query'] : $this->query; - } else { - $query = $parts['query']; - if ($parts['path'][0] == '/' || !$this->path) { - // Overwrite the existing path if the rel path starts with "/" - $path = $parts['path']; - } else { - // If the relative URL does not have a path or the base URL - // path does not end in a "/" then overwrite the existing path - // up to the last "/" - $path = substr($this->path, 0, strrpos($this->path, '/') + 1) . $parts['path']; - } - } - - $result = new self( - $this->scheme, - $this->host, - $this->username, - $this->password, - $this->port, - $path, - clone $query, - $parts['fragment'] - ); - - if ($path) { - $result->removeDotSegments(); - } - - return $result; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/cacert.pem b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/cacert.pem deleted file mode 100755 index 9794dfb7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/cacert.pem +++ /dev/null @@ -1,3866 +0,0 @@ -## -## ca-bundle.crt -- Bundle of CA Root Certificates -## -## Certificate data from Mozilla as of: Tue Apr 22 08:29:31 2014 -## -## This is a bundle of X.509 certificates of public Certificate Authorities -## (CA). These were automatically extracted from Mozilla's root certificates -## file (certdata.txt). This file can be found in the mozilla source tree: -## http://mxr.mozilla.org/mozilla-release/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 -## -## It contains the certificates in PEM format and therefore -## can be directly used with curl / libcurl / php_curl, or with -## an Apache+mod_ssl webserver for SSL client authentication. -## Just configure this file as the SSLCACertificateFile. -## - - -GTE CyberTrust Global Root -========================== ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg -Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG -A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz -MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL -Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 -IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u -sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql -HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID -AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW -M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF -NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -Thawte Server CA -================ ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE -AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j -b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV -BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u -c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG -A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 -ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl -/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 -1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR -MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J -GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ -GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -Thawte Premium Server CA -======================== ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE -AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl -ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT -AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU -VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 -aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ -cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 -aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh -Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ -qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm -SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf -8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t -UCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - -Equifax Secure CA -================= ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE -ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT -B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR -fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW -8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG -A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE -CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG -A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS -spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB -Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 -zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB -BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 -70+sB3c4 ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA -TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah -WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf -Tqj/ZA1k ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO -FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 -lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB -MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT -1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD -Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 ------END CERTIFICATE----- - -GlobalSign Root CA -================== ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx -GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds -b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV -BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD -VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa -DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc -THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb -Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP -c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX -gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF -AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj -Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG -j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH -hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC -X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -GlobalSign Root CA - R2 -======================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 -ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp -s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN -S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL -TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C -ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i -YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN -BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp -9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu -01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 -9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -ValiCert Class 1 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy -MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi -GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm -DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG -lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX -icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP -Orf1LXLI ------END CERTIFICATE----- - -ValiCert Class 2 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC -CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf -ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ -SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV -UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 -W9ViH0Pd ------END CERTIFICATE----- - -RSA Root Certificate 1 -====================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td -3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H -BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs -3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF -V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r -on+jjBXu ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 -EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc -cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw -EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj -055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f -j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 -xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa -t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -Verisign Class 4 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS -tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM -8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW -Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX -Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt -mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm -fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd -RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG -UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- - -Entrust.net Secure Server CA -============================ ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV -BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg -cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl -ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG -A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi -eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p -dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ -aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 -gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw -ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw -CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l -dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw -NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow -HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA -BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN -Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 -n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - -Entrust.net Premium 2048 Secure Server CA -========================================= ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u -ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp -bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV -BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx -NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 -d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u -ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL -Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr -hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW -nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi -VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ -KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy -T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT -J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e -nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= ------END CERTIFICATE----- - -Baltimore CyberTrust Root -========================= ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE -ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li -ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC -SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs -dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME -uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB -UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C -G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 -XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr -l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI -VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB -BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh -cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 -hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa -Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H -RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -Equifax Secure Global eBusiness CA -================================== ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp -bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx -HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds -b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV -PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN -qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn -hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j -BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs -MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN -I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY -NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -Equifax Secure eBusiness CA 1 -============================= ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB -LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE -ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz -IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ -1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a -IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk -MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW -Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF -AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 -lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ -KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -AddTrust Low-Value Services Root -================================ ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU -cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw -CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO -ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 -54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr -oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 -Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui -GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w -HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw -HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt -ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph -iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr -mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj -ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- - -AddTrust External Root -====================== ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD -VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw -NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU -cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg -Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 -+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw -Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo -aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy -2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 -7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL -VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk -VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl -j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 -e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u -G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -AddTrust Public Services Root -============================= ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU -cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ -BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l -dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu -nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i -d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG -Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw -HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G -A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G -A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 -JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL -+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao -GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 -Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H -EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- - -AddTrust Qualified Certificates Root -==================================== ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU -cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx -CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ -IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx -64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 -KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o -L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR -wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU -MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE -BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y -azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG -GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X -dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze -RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB -iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= ------END CERTIFICATE----- - -Entrust Root Certification Authority -==================================== ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV -BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw -b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG -A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 -MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu -MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu -Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v -dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz -A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww -Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 -j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN -rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 -MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH -hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM -Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa -v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS -W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 -tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -RSA Security 2048 v3 -==================== ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK -ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy -MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb -BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 -Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb -WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH -KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP -+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E -FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY -v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj -0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj -VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 -nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA -pKnXwiJPZ9d37CAFYd4= ------END CERTIFICATE----- - -GeoTrust Global CA -================== ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw -MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo -BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet -8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc -T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU -vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk -DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q -zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 -d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 -mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p -XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm -Mw== ------END CERTIFICATE----- - -GeoTrust Global CA 2 -==================== ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw -MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ -NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k -LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA -Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b -HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH -K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 -srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh -ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL -OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC -x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF -H4z1Ir+rzoPz4iIprn2DQKi6bA== ------END CERTIFICATE----- - -GeoTrust Universal CA -===================== ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 -MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu -Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t -JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e -RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs -7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d -8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V -qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga -Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB -Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu -KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 -ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 -XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB -hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 -qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL -oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK -xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF -KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 -DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK -xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU -p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI -P/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -GeoTrust Universal CA 2 -======================= ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 -MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg -SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 -DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 -j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q -JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a -QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 -WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP -20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn -ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC -SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG -8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 -+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E -BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ -4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ -mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq -A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg -Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP -pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d -FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp -gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm -X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -America Online Root Certification Authority 1 -============================================= ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG -v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z -DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh -sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP -8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z -o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf -GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF -VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft -3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g -Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- - -America Online Root Certification Authority 2 -============================================= ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en -fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 -f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO -qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN -RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 -gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn -6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid -FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 -Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj -B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op -aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY -T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p -+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg -JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy -zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO -ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh -1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf -GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff -Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP -cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= ------END CERTIFICATE----- - -Visa eCommerce Root -=================== ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG -EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug -QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 -WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm -VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL -F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b -RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 -TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI -/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs -GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG -MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc -CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW -YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz -zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu -YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -Certum Root CA -============== ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK -ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla -Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u -by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x -wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL -kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ -89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K -Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P -NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ -GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg -GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ -0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS -qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- - -Comodo AAA Services root -======================== ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw -MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl -c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV -BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG -C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs -i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW -Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH -Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK -Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f -BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl -cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz -LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm -7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z -8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C -12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -Comodo Secure Services root -=========================== ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw -MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu -Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi -BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP -9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc -rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC -oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V -p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E -FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w -gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj -YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm -aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm -4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL -DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw -pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H -RR3B7Hzs/Sk= ------END CERTIFICATE----- - -Comodo Trusted Services root -============================ ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw -MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h -bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw -IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 -3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y -/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 -juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS -ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud -DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp -ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl -cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw -uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA -BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l -R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O -9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- - -QuoVadis Root CA -================ ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE -ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz -MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp -cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD -EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk -J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL -F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL -YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen -AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w -PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y -ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 -MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj -YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs -ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW -Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu -BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw -FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 -tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo -fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul -LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x -gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi -5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi -5nrQNiOKSnQ2+Q== ------END CERTIFICATE----- - -QuoVadis Root CA 2 -================== ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT -EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx -ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 -XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk -lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB -lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy -lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt -66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn -wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh -D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy -BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie -J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud -DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU -a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv -Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 -UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm -VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK -+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW -IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 -WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X -f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II -4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 -VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -QuoVadis Root CA 3 -================== ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT -EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx -OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg -DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij -KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K -DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv -BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp -p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 -nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX -MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM -Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz -uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT -BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj -YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB -BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD -VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 -ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE -AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV -qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s -hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z -POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 -Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp -8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC -bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu -g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p -vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr -qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -Security Communication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw -8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM -DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX -5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd -DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 -JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g -0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a -mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ -s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ -6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi -FL39vmwLAw== ------END CERTIFICATE----- - -Sonera Class 2 Root CA -====================== ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG -U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw -NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh -IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 -/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT -dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG -f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P -tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH -nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT -XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt -0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI -cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph -Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx -EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH -llpwrN9M ------END CERTIFICATE----- - -Staat der Nederlanden Root CA -============================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE -ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g -Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w -HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh -bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt -vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P -jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca -C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth -vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 -22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV -HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v -dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN -BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR -EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw -MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y -nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR -iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== ------END CERTIFICATE----- - -TDC Internet Root CA -==================== ------BEGIN CERTIFICATE----- -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE -ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx -NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu -ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j -xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL -znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc -5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 -otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI -AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM -VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM -MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC -AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe -UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G -CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m -gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ -2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb -O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU -Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l ------END CERTIFICATE----- - -UTN DATACorp SGC Root CA -======================== ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ -BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa -MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w -HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy -dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys -raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo -wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA -9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv -33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud -DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 -BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD -LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 -DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 -I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx -EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP -DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- - -UTN USERFirst Hardware Root CA -============================== ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd -BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx -OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 -eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz -ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI -wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd -tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 -i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf -Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw -gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF -lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF -UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF -BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW -XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 -lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn -iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 -nfhmqA== ------END CERTIFICATE----- - -Camerfirma Chambers of Commerce Root -==================================== ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx -NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp -cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn -MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC -AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU -xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH -NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW -DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV -d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud -EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v -cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P -AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh -bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD -VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi -fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD -L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN -UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n -ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 -erfutGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- - -Camerfirma Global Chambersign Root -================================== ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx -NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt -YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg -MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw -ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J -1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O -by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl -6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c -8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ -BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j -aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B -Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj -aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y -ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA -PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y -gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ -PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 -IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes -t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- - -NetLock Notary (Class A) Root -============================= ------BEGIN CERTIFICATE----- -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI -EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j -ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX -DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH -EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD -VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz -cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM -D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ -z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC -/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 -tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 -4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG -A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC -Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv -bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu -IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn -LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 -ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz -IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh -IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu -b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh -bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg -Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp -bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 -ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP -ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB -CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr -KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM -8CgHrTwXZoi1/baI ------END CERTIFICATE----- - -NetLock Business (Class B) Root -=============================== ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg -VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD -VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv -bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg -VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB -iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S -o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr -1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV -HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ -RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh -dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 -ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv -c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg -YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz -Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA -bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl -IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 -YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj -cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM -43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR -stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -NetLock Express (Class C) Root -============================== ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD -KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ -BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j -ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB -jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z -W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 -euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw -DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN -RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn -YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB -IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i -aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 -ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y -emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k -IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ -UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg -YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 -xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW -gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - -XRamp Global CA Root -==================== ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE -BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj -dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx -HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg -U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu -IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx -foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE -zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs -AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry -xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap -oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC -AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc -/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n -nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz -8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -Go Daddy Class 2 CA -=================== ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY -VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG -A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g -RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD -ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv -2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 -qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j -YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY -vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O -BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o -atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu -MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG -A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim -PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt -I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI -Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b -vZ8= ------END CERTIFICATE----- - -Starfield Class 2 CA -==================== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc -U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo -MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG -A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG -SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY -bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ -JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm -epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN -F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF -MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f -hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo -bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs -afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM -PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD -KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 -QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -StartCom Certification Authority -================================ ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu -ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 -NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk -LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg -U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y -o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ -Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d -eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt -2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z -6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ -osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ -untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc -UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT -37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj -YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH -AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw -Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg -U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 -LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh -cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT -dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC -AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh -3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm -vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk -fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 -fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ -EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl -1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ -lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro -g14= ------END CERTIFICATE----- - -Taiwan GRCA -=========== ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG -EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X -DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv -dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN -w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 -BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O -1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO -htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov -J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 -Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t -B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB -O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 -lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV -HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 -09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj -Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 -Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU -D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz -DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk -Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk -7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ -CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy -+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS ------END CERTIFICATE----- - -Swisscom Root CA 1 -================== ------BEGIN CERTIFICATE----- -MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG -EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy -dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4 -MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln -aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC -IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM -MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF -NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe -AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC -b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn -7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN -cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp -WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5 -haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY -MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw -HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j -BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9 -MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn -jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ -MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H -VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl -vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl -OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3 -1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq -nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy -x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW -NY6E0F/6MBr1mmz0DlP5OlvRHA== ------END CERTIFICATE----- - -DigiCert Assured ID Root CA -=========================== ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw -IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx -MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL -ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO -9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy -UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW -/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy -oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf -GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF -66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq -hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc -EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn -SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i -8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -DigiCert Global Root CA -======================= ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw -HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw -MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 -dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn -TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 -BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H -4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y -7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB -o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm -8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF -BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr -EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt -tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 -UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -DigiCert High Assurance EV Root CA -================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw -KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw -MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ -MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu -Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t -Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS -OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 -MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ -NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe -h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB -Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY -JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ -V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp -myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK -mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K ------END CERTIFICATE----- - -Certplus Class 2 Primary CA -=========================== ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE -BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN -OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy -dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR -5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ -Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO -YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e -e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME -CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ -YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t -L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD -P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R -TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ -7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW -//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -DST Root CA X3 -============== ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK -ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X -DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 -cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT -rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 -UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy -xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d -utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ -MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug -dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE -GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw -RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS -fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -DST ACES CA X6 -============== ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT -MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha -MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE -CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI -DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa -pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow -GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy -MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu -Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy -dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU -CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 -5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t -Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs -vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 -oKfN5XozNmr6mis= ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 1 -============================================== ------BEGIN CERTIFICATE----- -MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP -MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 -acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx -MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg -U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB -TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC -aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX -yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i -Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ -8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 -W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME -BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 -sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE -q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy -B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY -nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 2 -============================================== ------BEGIN CERTIFICATE----- -MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP -MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg -QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN -MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr -dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G -A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls -acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe -LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI -x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g -QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr -5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB -AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt -Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 -Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ -hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P -9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 -UrbnBEI= ------END CERTIFICATE----- - -SwissSign Gold CA - G2 -====================== ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw -EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN -MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp -c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq -t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C -jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg -vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF -ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR -AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend -jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO -peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR -7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi -GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 -OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov -L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm -5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr -44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf -Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m -Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp -mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk -vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf -KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br -NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj -viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ ------END CERTIFICATE----- - -SwissSign Silver CA - G2 -======================== ------BEGIN CERTIFICATE----- -MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT -BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X -DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 -aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG -9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 -N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm -+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH -6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu -MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h -qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 -FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs -ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc -celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X -CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB -tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 -cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P -4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F -kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L -3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx -/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa -DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP -e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu -WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ -DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub -DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority -======================================== ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx -CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ -cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN -b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 -nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge -RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt -tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI -hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K -Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN -NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa -Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG -1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -thawte Primary Root CA -====================== ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 -MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg -SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv -KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT -FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs -oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ -1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc -q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K -aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p -afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF -AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE -uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 -jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH -z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G5 -============================================================ ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh -dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz -j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD -Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ -Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r -fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ -BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv -Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG -SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ -X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE -KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC -Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE -ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -SecureTrust CA -============== ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy -dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe -BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX -OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t -DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH -GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b -01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH -ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj -aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu -SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf -mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ -nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -Secure Global CA -================ ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH -bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg -MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg -Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx -YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ -bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g -8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV -HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi -0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn -oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA -MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ -OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn -CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 -3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -COMODO Certification Authority -============================== ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE -BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG -A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb -MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD -T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH -+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww -xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV -4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA -1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI -rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k -b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC -AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP -OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc -IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN -+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== ------END CERTIFICATE----- - -Network Solutions Certificate Authority -======================================= ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG -EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr -IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx -MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx -jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT -aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT -crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc -/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB -AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv -bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA -A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q -4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ -GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD -ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -WellsSecure Public Root Certificate Authority -============================================= ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM -F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw -NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN -MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl -bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD -VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 -iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 -i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 -bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB -K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB -AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu -cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm -lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB -i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww -GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI -K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 -bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj -qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es -E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ -tylv2G0xffX8oRAHh84vWdw+WNs= ------END CERTIFICATE----- - -COMODO ECC Certification Authority -================================== ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC -R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE -ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix -GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X -4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni -wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG -FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA -U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -IGC/A -===== ------BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD -VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE -Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy -MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI -EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT -STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 -TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW -So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy -HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd -frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ -tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB -egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC -iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK -q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q -MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI -lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF -0mBWWg== ------END CERTIFICATE----- - -Security Communication EV RootCA1 -================================= ------BEGIN CERTIFICATE----- -MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE -BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl -Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO -/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX -WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z -ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 -bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK -9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG -SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm -iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG -Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW -mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW -T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 ------END CERTIFICATE----- - -OISTE WISeKey Global Root GA CA -=============================== ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE -BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG -A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH -bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD -VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw -IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 -IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 -Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg -Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD -d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ -/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R -LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm -MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 -+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY -okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= ------END CERTIFICATE----- - -Microsec e-Szigno Root CA -========================= ------BEGIN CERTIFICATE----- -MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE -BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL -EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 -MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz -dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT -GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG -d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N -oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc -QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ -PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb -MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG -IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD -VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 -LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A -dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn -AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA -4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg -AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA -egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 -Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO -PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv -c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h -cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw -IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT -WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV -MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER -MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp -Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal -HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT -nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE -aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a -86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK -yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB -S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= ------END CERTIFICATE----- - -Certigna -======== ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw -EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 -MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI -Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q -XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH -GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p -ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg -DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf -Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ -tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ -BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J -SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA -hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ -ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu -PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY -1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. -====================================== ------BEGIN CERTIFICATE----- -MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT -AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg -LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w -HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ -U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh -IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN -yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU -2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 -4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP -2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm -8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf -HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa -Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK -5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b -czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g -ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF -BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug -cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf -AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX -EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v -/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 -MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 -3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk -eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f -/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h -RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU -Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== ------END CERTIFICATE----- - -TC TrustCenter Class 2 CA II -============================ ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy -IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw -MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 -c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE -AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw -IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 -xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ -Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u -SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB -7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 -Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU -cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i -SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G -dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ -KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj -TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP -JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk -vQ== ------END CERTIFICATE----- - -TC TrustCenter Class 3 CA II -============================ ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy -IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw -MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 -c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE -AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W -yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo -6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ -uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk -2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB -7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 -Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU -cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i -SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE -O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 -yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 -IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal -092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc -5A== ------END CERTIFICATE----- - -TC TrustCenter Universal CA I -============================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy -IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN -MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg -VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw -JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC -qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv -xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw -ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O -gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j -BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG -1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy -vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 -ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT -ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a -7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY ------END CERTIFICATE----- - -Deutsche Telekom Root CA 2 -========================== ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT -RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG -A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 -MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G -A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS -b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 -bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI -KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY -AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK -Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV -jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV -HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr -E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy -zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 -rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G -dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -ComSign Secured CA -================== ------BEGIN CERTIFICATE----- -MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE -AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w -NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD -QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs -49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH -7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB -kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 -9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw -AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t -U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA -j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC -AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a -BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp -FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP -51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz -OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== ------END CERTIFICATE----- - -Cybertrust Global Root -====================== ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li -ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 -MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD -ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW -0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL -AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin -89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT -8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 -MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G -A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO -lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi -5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 -hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T -X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -ePKI Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG -EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx -MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq -MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs -IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi -lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv -qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX -12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O -WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ -ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao -lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ -vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi -Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi -MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 -1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq -KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV -xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP -NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r -GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE -xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx -gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy -sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD -BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 -============================================================================================================================= ------BEGIN CERTIFICATE----- -MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH -DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q -aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry -b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV -BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg -S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 -MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl -IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF -n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl -IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft -dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl -cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO -Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 -xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR -6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL -hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd -BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 -N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT -y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh -LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M -dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= ------END CERTIFICATE----- - -Buypass Class 2 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 -MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M -cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 -0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 -0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R -uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV -1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt -7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 -fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w -wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho ------END CERTIFICATE----- - -Buypass Class 3 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 -MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx -ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 -n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia -AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c -1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 -pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA -EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 -htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj -el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 ------END CERTIFICATE----- - -EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 -========================================================================== ------BEGIN CERTIFICATE----- -MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg -QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe -Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p -ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt -IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by -X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b -gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr -eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ -TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy -Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn -uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI -qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm -ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0 -Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB -/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW -Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t -FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm -zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k -XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT -bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU -RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK -1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt -2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ -Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9 -AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT ------END CERTIFICATE----- - -certSIGN ROOT CA -================ ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD -VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa -Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE -CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I -JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH -rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 -ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD -0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 -AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB -AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 -SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 -x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt -vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz -TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -CNNIC ROOT -========== ------BEGIN CERTIFICATE----- -MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE -ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw -OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD -o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz -VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT -VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or -czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK -y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC -wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S -lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 -Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM -O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 -BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 -G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m -mxE= ------END CERTIFICATE----- - -ApplicationCA - Japanese Government -=================================== ------BEGIN CERTIFICATE----- -MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT -SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw -MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl -cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 -fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN -wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE -jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu -nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU -WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV -BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD -vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs -o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g -/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD -io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW -dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL -rosot4LKGAfmt1t06SAZf7IbiVQ= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G3 -============================================= ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 -IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz -NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo -YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT -LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j -K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE -c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C -IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu -dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr -2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 -cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE -Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s -t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -thawte Primary Root CA - G2 -=========================== ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC -VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu -IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg -Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV -MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG -b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt -IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS -LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 -8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU -mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN -G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K -rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -thawte Primary Root CA - G3 -=========================== ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w -ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD -VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG -A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At -P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC -+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY -7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW -vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ -KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK -A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC -8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm -er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G2 -============================================= ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 -OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl -b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG -BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc -KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ -EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m -ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 -npaqBA+K ------END CERTIFICATE----- - -VeriSign Universal Root Certification Authority -=============================================== ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj -1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP -MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 -9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I -AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR -tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G -CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O -a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 -Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx -Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx -P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P -wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 -mJO37M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G4 -============================================================ ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC -VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 -b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz -ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo -b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 -Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz -rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw -HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u -Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD -A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx -AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -NetLock Arany (Class Gold) Főtanúsítvány -============================================ ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G -A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 -dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB -cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx -MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO -ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 -c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu -0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw -/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk -H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw -fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 -neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW -qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta -YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna -NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu -dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -Staat der Nederlanden Root CA - G2 -================================== ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE -CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g -Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC -TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l -ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ -5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn -vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj -CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil -e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR -OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI -CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 -48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi -trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 -qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB -AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC -ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA -A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz -+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj -f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN -kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk -CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF -URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb -CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h -oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV -IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm -66+KAQ== ------END CERTIFICATE----- - -CA Disig -======== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK -QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw -MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz -bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm -GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD -Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo -hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt -ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w -gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P -AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz -aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff -ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa -BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t -WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 -mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ -CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K -ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA -4Z7CRneC9VkGjCFMhwnN5ag= ------END CERTIFICATE----- - -Juur-SK -======= ------BEGIN CERTIFICATE----- -MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA -c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw -DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG -SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy -aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf -TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC -+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw -UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa -Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF -MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD -HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh -AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA -cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr -AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw -cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE -FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G -A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo -ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL -abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 -IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh -Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 -yyqcjg== ------END CERTIFICATE----- - -Hongkong Post Root CA 1 -======================= ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT -DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx -NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n -IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 -ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr -auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh -qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY -V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV -HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i -h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio -l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei -IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps -T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT -c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== ------END CERTIFICATE----- - -SecureSign RootCA11 -=================== ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi -SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS -b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw -KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 -cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL -TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO -wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq -g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP -O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA -bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX -t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh -OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r -bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ -Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 -y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 -lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -ACEDICOM Root -============= ------BEGIN CERTIFICATE----- -MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD -T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4 -MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG -A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk -WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD -YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew -MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb -m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk -HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT -xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2 -3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9 -2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq -TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz -4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU -9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv -bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg -aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP -eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk -zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1 -ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI -KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq -nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE -I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp -MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o -tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA== ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky -CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX -bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ -D/xwzoiQ ------END CERTIFICATE----- - -Microsec e-Szigno Root CA 2009 -============================== ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER -MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv -c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE -BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt -U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA -fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG -0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA -pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm -1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC -AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf -QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE -FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o -lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX -I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 -yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi -LXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi -=================================================== ------BEGIN CERTIFICATE----- -MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG -EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz -ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 -MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 -cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u -aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY -8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y -jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI -JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk -9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG -SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d -F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq -D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 -Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq -fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX ------END CERTIFICATE----- - -GlobalSign Root CA - R3 -======================= ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt -iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ -0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 -rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl -OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 -xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 -lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 -EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E -bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 -YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r -kpeDMdmztcpHWD9f ------END CERTIFICATE----- - -Autoridad de Certificacion Firmaprofesional CIF A62634068 -========================================================= ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA -BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw -QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB -NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD -Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P -B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY -7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH -ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI -plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX -MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX -LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK -bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU -vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud -EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH -DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA -bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx -ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx -51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk -R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP -T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f -Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl -osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR -crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR -saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD -KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi -6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -Izenpe.com -========== ------BEGIN CERTIFICATE----- -MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG -EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz -MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu -QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ -03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK -ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU -+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC -PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT -OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK -F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK -0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ -0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB -leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID -AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ -SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG -NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx -MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O -BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l -Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga -kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q -hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs -g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 -aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 -nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC -ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo -Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z -WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== ------END CERTIFICATE----- - -Chambers of Commerce Root - 2008 -================================ ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy -Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl -ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF -EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl -cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA -XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj -h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ -ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk -NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g -D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 -lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ -0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 -EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI -G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ -BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh -bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh -bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC -CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH -AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 -wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH -3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU -RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 -M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 -YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF -9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK -zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG -nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ ------END CERTIFICATE----- - -Global Chambersign Root - 2008 -============================== ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx -NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg -Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ -QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf -VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf -XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 -ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB -/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA -TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M -H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe -Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF -HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB -AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT -BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE -BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm -aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm -aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp -1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 -dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG -/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 -ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s -dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg -9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH -foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du -qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr -P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq -c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -Go Daddy Root Certificate Authority - G2 -======================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu -MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G -A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq -9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD -+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd -fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl -NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 -BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac -vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r -5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV -N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 ------END CERTIFICATE----- - -Starfield Root Certificate Authority - G2 -========================================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 -eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw -DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg -VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB -dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv -W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs -bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk -N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf -ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU -JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol -TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx -4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw -F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ -c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -Starfield Services Root Certificate Authority - G2 -================================================== ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl -IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT -dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 -h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa -hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP -LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB -rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG -SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP -E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy -xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza -YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 ------END CERTIFICATE----- - -AffirmTrust Commercial -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw -MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb -DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV -C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 -BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww -MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV -HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG -hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi -qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv -0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh -sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -AffirmTrust Networking -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw -MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE -Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI -dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 -/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb -h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV -HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu -UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 -12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 -WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 -/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -AffirmTrust Premium -=================== ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy -OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy -dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn -BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV -5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs -+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd -GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R -p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI -S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 -6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 -/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo -+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv -MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC -6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S -L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK -+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV -BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg -IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 -g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb -zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== ------END CERTIFICATE----- - -AffirmTrust Premium ECC -======================= ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV -BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx -MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U -cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ -N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW -BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK -BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X -57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM -eQ== ------END CERTIFICATE----- - -Certum Trusted Network CA -========================= ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK -ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy -MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU -ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC -l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J -J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 -fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 -cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB -Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw -DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj -jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 -mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj -Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -Certinomis - Autorité Racine -============================= ------BEGIN CERTIFICATE----- -MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK -Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg -LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG -A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw -JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa -wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly -Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw -2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N -jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q -c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC -lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb -xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g -530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna -4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ -KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x -WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva -R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 -nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B -CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv -JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE -qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b -WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE -wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ -vgt2Fl43N+bYdJeimUV5 ------END CERTIFICATE----- - -Root CA Generalitat Valenciana -============================== ------BEGIN CERTIFICATE----- -MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE -ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 -IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 -WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE -CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 -F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B -ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ -D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte -JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB -AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n -dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB -ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl -AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA -YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy -AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA -aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt -AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA -YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu -AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA -OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 -dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV -BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G -A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S -b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh -TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz -Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 -NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH -iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt -+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= ------END CERTIFICATE----- - -A-Trust-nQual-03 -================ ------BEGIN CERTIFICATE----- -MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE -Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy -a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R -dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw -RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 -ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 -c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA -zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n -yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE -SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 -iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V -cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV -eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 -ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr -sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd -JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS -mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 -ahq97BvIxYSazQ== ------END CERTIFICATE----- - -TWCA Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ -VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG -EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB -IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx -QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC -oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP -4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r -y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG -9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC -mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW -QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY -T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny -Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -Security Communication RootCA2 -============================== ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC -SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy -aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ -+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R -3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV -spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K -EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 -QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj -u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk -3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q -tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 -mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -EC-ACC -====== ------BEGIN CERTIFICATE----- -MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE -BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w -ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD -VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE -CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT -BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 -MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt -SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl -Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh -cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK -w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT -ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 -HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a -E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw -0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD -VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 -Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l -dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ -lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa -Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe -l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 -E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D -5EI= ------END CERTIFICATE----- - -Hellenic Academic and Research Institutions RootCA 2011 -======================================================= ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT -O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y -aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT -AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo -IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI -1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa -71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u -8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH -3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ -MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 -MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu -b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt -XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD -/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N -7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -Actalis Authentication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM -BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE -AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky -MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz -IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ -wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa -by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 -zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f -YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 -oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l -EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 -hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 -EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 -jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY -iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI -WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 -JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx -K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ -Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC -4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo -2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz -lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem -OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 -vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -Trustis FPS Root CA -=================== ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG -EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 -IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV -BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ -RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk -H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa -cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt -o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA -AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd -BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c -GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC -yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P -8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV -l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl -iB6XzCGcKQENZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -StartCom Certification Authority -================================ ------BEGIN CERTIFICATE----- -MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu -ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 -NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk -LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg -U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y -o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ -Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d -eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt -2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z -6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ -osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ -untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc -UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT -37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ -Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 -dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu -c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv -bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 -aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t -L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG -cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 -fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm -N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN -Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T -tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX -e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA -2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs -HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE -JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib -D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= ------END CERTIFICATE----- - -StartCom Certification Authority G2 -=================================== ------BEGIN CERTIFICATE----- -MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE -ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O -o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG -4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi -Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul -Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs -O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H -vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L -nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS -FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa -z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ -KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K -2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk -J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ -JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG -/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc -nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld -blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc -l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm -7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm -obp573PYtlNXLfbQ4ddI ------END CERTIFICATE----- - -Buypass Class 2 Root CA -======================= ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X -DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 -eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 -g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn -9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b -/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU -CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff -awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI -zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn -Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX -Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs -M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF -AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI -osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S -aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd -DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD -LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 -oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC -wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS -CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN -rJgWVqA= ------END CERTIFICATE----- - -Buypass Class 3 Root CA -======================= ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X -DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 -eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH -sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR -5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh -7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ -ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH -2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV -/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ -RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA -Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq -j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF -AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G -uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG -Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 -ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 -KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz -6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug -UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe -eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi -Cp/HuZc= ------END CERTIFICATE----- - -T-TeleSec GlobalRoot Class 3 -============================ ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM -IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU -cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx -MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz -dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD -ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK -9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU -NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF -iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W -0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr -AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb -fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT -ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h -P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== ------END CERTIFICATE----- - -EE Certification Centre Root CA -=============================== ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG -EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy -dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw -MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB -UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy -ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM -TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 -rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw -93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN -P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ -MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF -BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj -xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM -lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU -3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM -dcGWxZ0= ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 2007 -================================================= ------BEGIN CERTIFICATE----- -MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP -MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg -QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X -DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl -a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN -BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp -bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N -YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv -KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya -KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT -rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC -AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s -Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I -aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO -Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb -BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK -poRq0Tl9 ------END CERTIFICATE----- - -D-TRUST Root Class 3 CA 2 2009 -============================== ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK -DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe -Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE -LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD -ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA -BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv -KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z -p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC -AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ -4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y -eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw -MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G -PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw -OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm -2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV -dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph -X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -D-TRUST Root Class 3 CA 2 EV 2009 -================================= ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK -DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw -OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK -DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw -OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS -egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh -zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T -7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 -sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 -11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv -cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v -ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El -MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp -b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh -c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ -PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX -ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA -NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv -w9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -PSCProcert -========== ------BEGIN CERTIFICATE----- -MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk -ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ -MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz -dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl -cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw -IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw -MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w -DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD -ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp -Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC -wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA -3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh -RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO -EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2 -0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH -0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU -td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw -Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp -r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/ -AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz -Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId -xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp -ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH -EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h -Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k -ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG -9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG -MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG -LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52 -ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy -YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v -Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o -dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq -T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN -g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q -uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1 -n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn -FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo -5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq -3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5 -poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y -eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km ------END CERTIFICATE----- - -China Internet Network Information Center EV Certificates Root -============================================================== ------BEGIN CERTIFICATE----- -MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV -BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D -aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg -Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG -A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM -PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl -cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y -jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV -98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H -klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23 -KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC -7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD -glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5 -0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM -7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws -ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0 -5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8= ------END CERTIFICATE----- - -Swisscom Root CA 2 -================== ------BEGIN CERTIFICATE----- -MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG -EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy -dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2 -MjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln -aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC -IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM -LgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo -ysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ -wDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH -Wrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a -SgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS -NLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab -mbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY -Ypqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3 -qPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw -HQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O -BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu -MA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO -v2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ -82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz -o9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs -a0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx -OQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW -mA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o -+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC -rvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX -5OfNeOI5wSsSnqaeG8XmDtkx2Q== ------END CERTIFICATE----- - -Swisscom Root EV CA 2 -===================== ------BEGIN CERTIFICATE----- -MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAwZzELMAkGA1UE -BhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdpdGFsIENlcnRpZmljYXRlIFNl -cnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcN -MzEwNjI1MDg0NTA4WjBnMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT -HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYg -Q0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7BxUglgRCgz -o3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD1ycfMQ4jFrclyxy0uYAy -Xhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPHoCE2G3pXKSinLr9xJZDzRINpUKTk4Rti -GZQJo/PDvO/0vezbE53PnUgJUmfANykRHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8Li -qG12W0OfvrSdsyaGOx9/5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaH -Za0zKcQvidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHLOdAG -alNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaCNYGu+HuB5ur+rPQa -m3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f46Fq9mDU5zXNysRojddxyNMkM3Ox -bPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCBUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDi -xzgHcgplwLa7JSnaFp6LNYth7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/ -BAQDAgGGMB0GA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED -MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWBbj2ITY1x0kbB -bkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6xXCX5145v9Ydkn+0UjrgEjihL -j6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98TPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbU -wp4wLh/vx3rEUMfqe9pQy3omywC0Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7 -XwgiG/W9mR4U9s70WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH -59yLGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm7JFe3VE/ -23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4Snr8PyQUQ3nqjsTzyP6Wq -J3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VNvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyA -HmBR3NdUIR7KYndP+tiPsys6DXhyyWhBWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/gi -uMod89a2GQ+fYWVq6nTIfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuW -l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc= ------END CERTIFICATE----- - -CA Disig Root R1 -================ ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw -EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp -ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx -EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp -c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy -3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8 -u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2 -m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk -CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa -YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6 -vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL -LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX -ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is -XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ -04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR -xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B -LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM -CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb -VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85 -YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS -ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix -lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N -UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ -a7+h89n07eLw4+1knj0vllJPgFOL ------END CERTIFICATE----- - -CA Disig Root R2 -================ ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw -EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp -ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx -EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp -c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC -w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia -xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 -A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S -GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV -g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa -5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE -koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A -Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i -Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u -Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV -sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je -dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 -1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx -mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 -utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 -sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg -UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV -7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -ACCVRAIZ1 -========= ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB -SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 -MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH -UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM -jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 -RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD -aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ -0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG -WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 -8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR -5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J -9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK -Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw -Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu -Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM -Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA -QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh -AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA -YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj -AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA -IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk -aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 -dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 -MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI -hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E -R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN -YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 -nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ -TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 -sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg -Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd -3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p -EfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -TWCA Global Root CA -=================== ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT -CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD -QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK -EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg -Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C -nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV -r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR -Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV -tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W -KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 -sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p -yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn -kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI -zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC -AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g -cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M -8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg -/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg -lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP -A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m -i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 -EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 -zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= ------END CERTIFICATE----- - -TeliaSonera Root CA v1 -====================== ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE -CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 -MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW -VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ -6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA -3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k -B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn -Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH -oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 -F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ -oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 -gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc -TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB -AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW -DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm -zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW -pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV -G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc -c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT -JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 -qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 -Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems -WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -E-Tugra Certification Authority -=============================== ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w -DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls -ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw -NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx -QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl -cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD -DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd -hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K -CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g -ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ -BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 -E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz -rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq -jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 -dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB -/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG -MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK -kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO -XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 -VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo -a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc -dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV -KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT -Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 -8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G -C7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - -T-TeleSec GlobalRoot Class 2 -============================ ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM -IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU -cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx -MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz -dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD -ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ -SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F -vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 -2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV -WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy -YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 -r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf -vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR -3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== ------END CERTIFICATE----- - -Atos TrustedRoot 2011 -===================== ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU -cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 -MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG -A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV -hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr -54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ -DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 -HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR -z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R -l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ -bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB -CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h -k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh -TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 -61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G -3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/functions.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/functions.php deleted file mode 100755 index 9dcce36e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/GuzzleHttp/functions.php +++ /dev/null @@ -1,325 +0,0 @@ -send($client->createRequest($method, $url, $options)); -} - -/** - * Send a GET request - * - * @param string $url URL of the request - * @param array $options Array of request options - * - * @return ResponseInterface - */ -function get($url, array $options = []) -{ - return request('GET', $url, $options); -} - -/** - * Send a HEAD request - * - * @param string $url URL of the request - * @param array $options Array of request options - * - * @return ResponseInterface - */ -function head($url, array $options = []) -{ - return request('HEAD', $url, $options); -} - -/** - * Send a DELETE request - * - * @param string $url URL of the request - * @param array $options Array of request options - * - * @return ResponseInterface - */ -function delete($url, array $options = []) -{ - return request('DELETE', $url, $options); -} - -/** - * Send a POST request - * - * @param string $url URL of the request - * @param array $options Array of request options - * - * @return ResponseInterface - */ -function post($url, array $options = []) -{ - return request('POST', $url, $options); -} - -/** - * Send a PUT request - * - * @param string $url URL of the request - * @param array $options Array of request options - * - * @return ResponseInterface - */ -function put($url, array $options = []) -{ - return request('PUT', $url, $options); -} - -/** - * Send a PATCH request - * - * @param string $url URL of the request - * @param array $options Array of request options - * - * @return ResponseInterface - */ -function patch($url, array $options = []) -{ - return request('PATCH', $url, $options); -} - -/** - * Send an OPTIONS request - * - * @param string $url URL of the request - * @param array $options Array of request options - * - * @return ResponseInterface - */ -function options($url, array $options = []) -{ - return request('OPTIONS', $url, $options); -} - -/** - * Convenience method for sending multiple requests in parallel and retrieving - * a hash map of requests to response objects or RequestException objects. - * - * Note: This method keeps every request and response in memory, and as such is - * NOT recommended when sending a large number or an indeterminable number of - * requests in parallel. - * - * @param ClientInterface $client Client used to send the requests - * @param array|\Iterator $requests Requests to send in parallel - * @param array $options Passes through the options available in - * {@see GuzzleHttp\ClientInterface::sendAll()} - * @return \SplObjectStorage Requests are the key and each value is a - * {@see GuzzleHttp\Message\ResponseInterface} if the request succeeded or - * a {@see GuzzleHttp\Exception\RequestException} if it failed. - * @throws \InvalidArgumentException if the event format is incorrect. - */ -function batch(ClientInterface $client, $requests, array $options = []) -{ - $hash = new \SplObjectStorage(); - foreach ($requests as $request) { - $hash->attach($request); - } - - // Merge the necessary complete and error events to the event listeners so - // that as each request succeeds or fails, it is added to the result hash. - $options = RequestEvents::convertEventArray( - $options, - ['complete', 'error'], - [ - 'priority' => RequestEvents::EARLY, - 'once' => true, - 'fn' => function ($e) use ($hash) { $hash[$e->getRequest()] = $e; } - ] - ); - - // Send the requests in parallel and aggregate the results. - $client->sendAll($requests, $options); - - // Update the received value for any of the intercepted requests. - foreach ($hash as $request) { - if ($hash[$request] instanceof CompleteEvent) { - $hash[$request] = $hash[$request]->getResponse(); - } elseif ($hash[$request] instanceof ErrorEvent) { - $hash[$request] = $hash[$request]->getException(); - } - } - - return $hash; -} - -/** - * Gets a value from an array using a path syntax to retrieve nested data. - * - * This method does not allow for keys that contain "/". You must traverse - * the array manually or using something more advanced like JMESPath to - * work with keys that contain "/". - * - * // Get the bar key of a set of nested arrays. - * // This is equivalent to $collection['foo']['baz']['bar'] but won't - * // throw warnings for missing keys. - * GuzzleHttp\get_path($data, 'foo/baz/bar'); - * - * @param array $data Data to retrieve values from - * @param string $path Path to traverse and retrieve a value from - * - * @return mixed|null - */ -function get_path($data, $path) -{ - $path = explode('/', $path); - - while (null !== ($part = array_shift($path))) { - if (!is_array($data) || !isset($data[$part])) { - return null; - } - $data = $data[$part]; - } - - return $data; -} - -/** - * Set a value in a nested array key. Keys will be created as needed to set the - * value. - * - * This function does not support keys that contain "/" or "[]" characters - * because these are special tokens used when traversing the data structure. - * A value may be prepended to an existing array by using "[]" as the final - * key of a path. - * - * GuzzleHttp\get_path($data, 'foo/baz'); // null - * GuzzleHttp\set_path($data, 'foo/baz/[]', 'a'); - * GuzzleHttp\set_path($data, 'foo/baz/[]', 'b'); - * GuzzleHttp\get_path($data, 'foo/baz'); - * // Returns ['a', 'b'] - * - * @param array $data Data to modify by reference - * @param string $path Path to set - * @param mixed $value Value to set at the key - * @throws \RuntimeException when trying to setPath using a nested path that - * travels through a scalar value. - */ -function set_path(&$data, $path, $value) -{ - $current =& $data; - $queue = explode('/', $path); - while (null !== ($key = array_shift($queue))) { - if (!is_array($current)) { - throw new \RuntimeException("Trying to setPath {$path}, but " - . "{$key} is set and is not an array"); - } elseif (!$queue) { - if ($key == '[]') { - $current[] = $value; - } else { - $current[$key] = $value; - } - } elseif (isset($current[$key])) { - $current =& $current[$key]; - } else { - $current[$key] = []; - $current =& $current[$key]; - } - } -} - -/** - * Expands a URI template - * - * @param string $template URI template - * @param array $variables Template variables - * - * @return string - */ -function uri_template($template, array $variables) -{ - if (function_exists('\\uri_template')) { - return \uri_template($template, $variables); - } - - static $uriTemplate; - if (!$uriTemplate) { - $uriTemplate = new UriTemplate(); - } - - return $uriTemplate->expand($template, $variables); -} - -/** - * Wrapper for JSON decode that implements error detection with helpful error - * messages. - * - * @param string $json JSON data to parse - * @param bool $assoc When true, returned objects will be converted into - * associative arrays. - * @param int $depth User specified recursion depth. - * @param int $options Bitmask of JSON decode options. - * - * @return mixed - * @throws \InvalidArgumentException if the JSON cannot be parsed. - * @link http://www.php.net/manual/en/function.json-decode.php - */ -function json_decode($json, $assoc = false, $depth = 512, $options = 0) -{ - static $jsonErrors = [ - JSON_ERROR_DEPTH => 'JSON_ERROR_DEPTH - Maximum stack depth exceeded', - JSON_ERROR_STATE_MISMATCH => 'JSON_ERROR_STATE_MISMATCH - Underflow or the modes mismatch', - JSON_ERROR_CTRL_CHAR => 'JSON_ERROR_CTRL_CHAR - Unexpected control character found', - JSON_ERROR_SYNTAX => 'JSON_ERROR_SYNTAX - Syntax error, malformed JSON', - JSON_ERROR_UTF8 => 'JSON_ERROR_UTF8 - Malformed UTF-8 characters, possibly incorrectly encoded' - ]; - - $data = \json_decode($json, $assoc, $depth, $options); - - if (JSON_ERROR_NONE !== json_last_error()) { - $last = json_last_error(); - throw new \InvalidArgumentException( - 'Unable to parse JSON data: ' - . (isset($jsonErrors[$last]) ? $jsonErrors[$last] : 'Unknown error') - ); - } - - return $data; -} - -/** - * @internal - */ -function deprecation_proxy($object, $name, $arguments, $map) -{ - if (!isset($map[$name])) { - throw new \BadMethodCallException('Unknown method, ' . $name); - } - - $message = sprintf('%s is deprecated and will be removed in a future ' - . 'version. Update your code to use the equivalent %s method ' - . 'instead to avoid breaking changes when this shim is removed.', - get_class($object) . '::' . $name . '()', - get_class($object) . '::' . $map[$name] . '()' - ); - - trigger_error($message, E_USER_DEPRECATED); - - return call_user_func_array([$object, $map[$name]], $arguments); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Draw/DrawerInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Draw/DrawerInterface.php deleted file mode 100755 index c48dff87..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Draw/DrawerInterface.php +++ /dev/null @@ -1,149 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Draw; - -use Imagine\Image\AbstractFont; -use Imagine\Image\BoxInterface; -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Image\PointInterface; -use Imagine\Exception\RuntimeException; - -/** - * Interface for the drawer - */ -interface DrawerInterface -{ - /** - * Draws an arc on a starting at a given x, y coordinates under a given - * start and end angles - * - * @param PointInterface $center - * @param BoxInterface $size - * @param integer $start - * @param integer $end - * @param ColorInterface $color - * @param integer $thickness - * - * @throws RuntimeException - * - * @return DrawerInterface - */ - public function arc(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $thickness = 1); - - /** - * Same as arc, but also connects end points with a straight line - * - * @param PointInterface $center - * @param BoxInterface $size - * @param integer $start - * @param integer $end - * @param ColorInterface $color - * @param Boolean $fill - * @param integer $thickness - * - * @throws RuntimeException - * - * @return DrawerInterface - */ - public function chord(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1); - - /** - * Draws and ellipse with center at the given x, y coordinates, and given - * width and height - * - * @param PointInterface $center - * @param BoxInterface $size - * @param ColorInterface $color - * @param Boolean $fill - * @param integer $thickness - * - * @throws RuntimeException - * - * @return DrawerInterface - */ - public function ellipse(PointInterface $center, BoxInterface $size, ColorInterface $color, $fill = false, $thickness = 1); - - /** - * Draws a line from start(x, y) to end(x, y) coordinates - * - * @param PointInterface $start - * @param PointInterface $end - * @param ColorInterface $outline - * @param integer $thickness - * - * @return DrawerInterface - */ - public function line(PointInterface $start, PointInterface $end, ColorInterface $outline, $thickness = 1); - - /** - * Same as arc, but connects end points and the center - * - * @param PointInterface $center - * @param BoxInterface $size - * @param integer $start - * @param integer $end - * @param ColorInterface $color - * @param Boolean $fill - * @param integer $thickness - * - * @throws RuntimeException - * - * @return DrawerInterface - */ - public function pieSlice(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1); - - /** - * Places a one pixel point at specific coordinates and fills it with - * specified color - * - * @param PointInterface $position - * @param ColorInterface $color - * - * @throws RuntimeException - * - * @return DrawerInterface - */ - public function dot(PointInterface $position, ColorInterface $color); - - /** - * Draws a polygon using array of x, y coordinates. Must contain at least - * three coordinates - * - * @param array $coordinates - * @param ColorInterface $color - * @param Boolean $fill - * @param integer $thickness - * - * @throws RuntimeException - * - * @return DrawerInterface - */ - public function polygon(array $coordinates, ColorInterface $color, $fill = false, $thickness = 1); - - /** - * Annotates image with specified text at a given position starting on the - * top left of the final text box - * - * The rotation is done CW - * - * @param string $string - * @param AbstractFont $font - * @param PointInterface $position - * @param integer $angle - * @param integer $width - * - * @throws RuntimeException - * - * @return DrawerInterface - */ - public function text($string, AbstractFont $font, PointInterface $position, $angle = 0, $width = null); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Effects/EffectsInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Effects/EffectsInterface.php deleted file mode 100755 index 3593d75d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Effects/EffectsInterface.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Effects; - -use Imagine\Exception\RuntimeException; -use Imagine\Image\Palette\Color\ColorInterface; - -/** - * Interface for the effects - */ -interface EffectsInterface -{ - /** - * Apply gamma correction - * - * @param float $correction - * @return EffectsInterface - * - * @throws RuntimeException - */ - public function gamma($correction); - - /** - * Invert the colors of the image - * - * @return EffectsInterface - * - * @throws RuntimeException - */ - public function negative(); - - /** - * Grayscale the image - * - * @return EffectsInterface - * - * @throws RuntimeException - */ - public function grayscale(); - - /** - * Colorize the image - * - * @param ColorInterface $color - * - * @return EffectsInterface - * - * @throws RuntimeException - */ - public function colorize(ColorInterface $color); - - /** - * Sharpens the image - * - * @return EffectsInterface - * - * @throws RuntimeException - */ - public function sharpen(); - - /** - * Blur the image - * - * @param float|int $sigma - * - * @return EffectsInterface - * - * @throws RuntimeException - */ - public function blur($sigma); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/Exception.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/Exception.php deleted file mode 100755 index 39a67afe..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/Exception.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Exception; - -/** - * Imagine-specific exception - */ -interface Exception -{ -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/InvalidArgumentException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/InvalidArgumentException.php deleted file mode 100755 index 5ac13967..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Exception; - -/** - * Imagine-specific invalid argument exception - */ -class InvalidArgumentException extends \InvalidArgumentException implements Exception -{ -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/NotSupportedException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/NotSupportedException.php deleted file mode 100755 index fd68ce7c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/NotSupportedException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Exception; - -/** - * Should be used when a driver does not support an operation. - */ -class NotSupportedException extends RuntimeException implements Exception -{ -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/OutOfBoundsException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/OutOfBoundsException.php deleted file mode 100755 index f51cc9b4..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/OutOfBoundsException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Exception; - -/** - * Imagine-specific out of bounds exception - */ -class OutOfBoundsException extends \OutOfBoundsException implements Exception -{ -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/RuntimeException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/RuntimeException.php deleted file mode 100755 index 205ad85e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Exception/RuntimeException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Exception; - -/** - * Imagine-specific runtime exception - */ -class RuntimeException extends \RuntimeException implements Exception -{ -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Border.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Border.php deleted file mode 100755 index 47a3ceb1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Border.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter\Advanced; - -use Imagine\Filter\FilterInterface; -use Imagine\Image\ImageInterface; -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Image\Point; - -/** - * A border filter - */ -class Border implements FilterInterface -{ - /** - * @var ColorInterface - */ - private $color; - - /** - * @var integer - */ - private $width; - - /** - * @var integer - */ - private $height; - - /** - * Constructs Border filter with given color, width and height - * - * @param ColorInterface $color - * @param integer $width Width of the border on the left and right sides of the image - * @param integer $height Height of the border on the top and bottom sides of the image - */ - public function __construct(ColorInterface $color, $width = 1, $height = 1) - { - $this->color = $color; - $this->width = $width; - $this->height = $height; - } - - /** - * {@inheritdoc} - */ - public function apply(ImageInterface $image) - { - $size = $image->getSize(); - $width = $size->getWidth(); - $height = $size->getHeight(); - - $draw = $image->draw(); - - // Draw top and bottom lines - $draw - ->line( - new Point(0, 0), - new Point($width - 1, 0), - $this->color, - $this->height - ) - ->line( - new Point($width - 1, $height - 1), - new Point(0, $height - 1), - $this->color, - $this->height - ) - ; - - // Draw sides - $draw - ->line( - new Point(0, 0), - new Point(0, $height - 1), - $this->color, - $this->width - ) - ->line( - new Point($width - 1, 0), - new Point($width - 1, $height - 1), - $this->color, - $this->width - ) - ; - - return $image; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Canvas.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Canvas.php deleted file mode 100755 index 685b8ae7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Canvas.php +++ /dev/null @@ -1,74 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter\Advanced; - -use Imagine\Filter\FilterInterface; -use Imagine\Image\ImageInterface; -use Imagine\Image\BoxInterface; -use Imagine\Image\Point; -use Imagine\Image\PointInterface; -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Image\ImagineInterface; - -/** - * A canvas filter - */ -class Canvas implements FilterInterface -{ - /** - * @var BoxInterface - */ - private $size; - - /** - * @var PointInterface - */ - private $placement; - - /** - * @var ColorInterface - */ - private $background; - - /** - * @var ImagineInterface - */ - private $imagine; - - /** - * Constructs Canvas filter with given width and height and the placement of the current image - * inside the new canvas - * - * @param ImagineInterface $imagine - * @param BoxInterface $size - * @param PointInterface $placement - * @param ColorInterface $background - */ - public function __construct(ImagineInterface $imagine, BoxInterface $size, PointInterface $placement = null, ColorInterface $background = null) - { - $this->imagine = $imagine; - $this->size = $size; - $this->placement = $placement ?: new Point(0, 0); - $this->background = $background; - } - - /** - * {@inheritdoc} - */ - public function apply(ImageInterface $image) - { - $canvas = $this->imagine->create($this->size, $this->background); - $canvas->paste($image, $this->placement); - - return $canvas; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Grayscale.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Grayscale.php deleted file mode 100755 index b3a08b40..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/Grayscale.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter\Advanced; - -use Imagine\Filter\FilterInterface; -use Imagine\Image\ImageInterface; -use Imagine\Image\Point; - -/** - * The Grayscale filter calculates the gray-value based on RGB. - */ -class Grayscale extends OnPixelBased implements FilterInterface -{ - public function __construct() - { - parent::__construct(function (ImageInterface $image, Point $point) { - $color = $image->getColorAt($point); - $image->draw()->dot($point, $color->grayscale()); - }); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/OnPixelBased.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/OnPixelBased.php deleted file mode 100755 index ef297eaf..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/OnPixelBased.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter\Advanced; - -use Imagine\Exception\InvalidArgumentException; -use Imagine\Filter\FilterInterface; -use Imagine\Image\ImageInterface; -use Imagine\Image\Point; - -/** - * The OnPixelBased takes a callable, and for each pixel, this callable is called with the - * image (\Imagine\Image\ImageInterface) and the current point (\Imagine\Image\Point) - */ -class OnPixelBased implements FilterInterface -{ - protected $callback; - - public function __construct($callback) - { - if (!is_callable($callback)) { - throw new InvalidArgumentException('$callback has to be callable'); - } - - $this->callback = $callback; - } - - /** - * Applies scheduled transformation to ImageInterface instance - * Returns processed ImageInterface instance - * - * @param ImageInterface $image - * - * @return ImageInterface - */ - public function apply(ImageInterface $image) - { - $w = $image->getSize()->getWidth(); - $h = $image->getSize()->getHeight(); - - for ($x = 0; $x < $w; $x++) { - for ($y = 0; $y < $h; $y++) { - call_user_func($this->callback, $image, new Point($x, $y)); - } - } - - return $image; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/RelativeResize.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/RelativeResize.php deleted file mode 100755 index 954587ad..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Advanced/RelativeResize.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter\Advanced; - -use Imagine\Exception\InvalidArgumentException; -use Imagine\Filter\FilterInterface; -use Imagine\Image\ImageInterface; - -/** - * The RelativeResize filter allows images to be resized relative to their - * existing dimensions. - */ -class RelativeResize implements FilterInterface -{ - private $method; - private $parameter; - - /** - * Constructs a RelativeResize filter with the given method and argument. - * - * @param string $method BoxInterface method - * @param mixed $parameter Parameter for BoxInterface method - */ - public function __construct($method, $parameter) - { - if (!in_array($method, array('heighten', 'increase', 'scale', 'widen'))) { - throw new InvalidArgumentException(sprintf('Unsupported method: ', $method)); - } - - $this->method = $method; - $this->parameter = $parameter; - } - - /** - * {@inheritdoc} - */ - public function apply(ImageInterface $image) - { - return $image->resize(call_user_func(array($image->getSize(), $this->method), $this->parameter)); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/ApplyMask.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/ApplyMask.php deleted file mode 100755 index 2be2786f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/ApplyMask.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter\Basic; - -use Imagine\Filter\FilterInterface; -use Imagine\Image\ImageInterface; - -/** - * An apply mask filter - */ -class ApplyMask implements FilterInterface -{ - /** - * @var ImageInterface - */ - private $mask; - - /** - * @param ImageInterface $mask - */ - public function __construct(ImageInterface $mask) - { - $this->mask = $mask; - } - - /** - * {@inheritdoc} - */ - public function apply(ImageInterface $image) - { - return $image->applyMask($this->mask); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Autorotate.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Autorotate.php deleted file mode 100755 index 3ef7cbec..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Autorotate.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter\Basic; - -use Imagine\Filter\FilterInterface; -use Imagine\Image\ImageInterface; -use Imagine\Image\Palette\Color\ColorInterface; - -/** - * Rotates an image automatically based on exif information. - * - * Your attention please: This filter requires the use of the - * ExifMetadataReader to work. - * - * @see https://imagine.readthedocs.org/en/latest/usage/metadata.html - */ -class Autorotate implements FilterInterface -{ - private $color; - - /** - * @param string|array|ColorInterface $color A color - */ - public function __construct($color = '000000') - { - $this->color = $color; - } - - /** - * {@inheritdoc} - */ - public function apply(ImageInterface $image) - { - $metadata = $image->metadata(); - - switch (isset($metadata['ifd0.Orientation']) ? $metadata['ifd0.Orientation'] : null) { - case 1: // top-left - break; - case 2: // top-right - $image->flipHorizontally(); - break; - case 3: // bottom-right - $image->rotate(180, $this->getColor($image)); - break; - case 4: // bottom-left - $image->flipHorizontally(); - $image->rotate(180, $this->getColor($image)); - break; - case 5: // left-top - $image->flipHorizontally(); - $image->rotate(-90, $this->getColor($image)); - break; - case 6: // right-top - $image->rotate(90, $this->getColor($image)); - break; - case 7: // right-bottom - $image->flipHorizontally(); - $image->rotate(90, $this->getColor($image)); - break; - case 8: // left-bottom - $image->rotate(-90, $this->getColor($image)); - break; - default: // Invalid orientation - break; - } - - return $image; - } - - private function getColor(ImageInterface $image) - { - if ($this->color instanceof ColorInterface) { - return $this->color; - } - - return $image->palette()->color($this->color); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Copy.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Copy.php deleted file mode 100755 index 781b23a7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Copy.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter\Basic; - -use Imagine\Filter\FilterInterface; -use Imagine\Image\ImageInterface; - -/** - * A copy filter - */ -class Copy implements FilterInterface -{ - /** - * {@inheritdoc} - */ - public function apply(ImageInterface $image) - { - return $image->copy(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Crop.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Crop.php deleted file mode 100755 index 6559e229..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Crop.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter\Basic; - -use Imagine\Image\ImageInterface; -use Imagine\Image\BoxInterface; -use Imagine\Image\PointInterface; -use Imagine\Filter\FilterInterface; - -/** - * A crop filter - */ -class Crop implements FilterInterface -{ - /** - * @var PointInterface - */ - private $start; - - /** - * @var BoxInterface - */ - private $size; - - /** - * Constructs a Crop filter with given x, y, coordinates and crop width and - * height values - * - * @param PointInterface $start - * @param BoxInterface $size - */ - public function __construct(PointInterface $start, BoxInterface $size) - { - $this->start = $start; - $this->size = $size; - } - - /** - * {@inheritdoc} - */ - public function apply(ImageInterface $image) - { - return $image->crop($this->start, $this->size); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Fill.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Fill.php deleted file mode 100755 index 4be0d0f2..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Fill.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter\Basic; - -use Imagine\Filter\FilterInterface; -use Imagine\Image\Fill\FillInterface; -use Imagine\Image\ImageInterface; - -/** - * A fill filter - */ -class Fill implements FilterInterface -{ - /** - * @var FillInterface - */ - private $fill; - - /** - * @param FillInterface $fill - */ - public function __construct(FillInterface $fill) - { - $this->fill = $fill; - } - - /** - * {@inheritdoc} - */ - public function apply(ImageInterface $image) - { - return $image->fill($this->fill); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/FlipHorizontally.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/FlipHorizontally.php deleted file mode 100755 index 50203748..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/FlipHorizontally.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter\Basic; - -use Imagine\Image\ImageInterface; -use Imagine\Filter\FilterInterface; - -/** - * A "flip horizontally" filter - */ -class FlipHorizontally implements FilterInterface -{ - /** - * {@inheritdoc} - */ - public function apply(ImageInterface $image) - { - return $image->flipHorizontally(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/FlipVertically.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/FlipVertically.php deleted file mode 100755 index 684c31b3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/FlipVertically.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter\Basic; - -use Imagine\Image\ImageInterface; -use Imagine\Filter\FilterInterface; - -/** - * A "flip vertically" filter - */ -class FlipVertically implements FilterInterface -{ - /** - * {@inheritdoc} - */ - public function apply(ImageInterface $image) - { - return $image->flipVertically(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Paste.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Paste.php deleted file mode 100755 index bd274a17..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Paste.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter\Basic; - -use Imagine\Image\ImageInterface; -use Imagine\Image\PointInterface; -use Imagine\Filter\FilterInterface; - -/** - * A paste filter - */ -class Paste implements FilterInterface -{ - /** - * @var ImageInterface - */ - private $image; - - /** - * @var PointInterface - */ - private $start; - - /** - * Constructs a Paste filter with given ImageInterface to paste and x, y - * coordinates of target position - * - * @param ImageInterface $image - * @param PointInterface $start - */ - public function __construct(ImageInterface $image, PointInterface $start) - { - $this->image = $image; - $this->start = $start; - } - - /** - * {@inheritdoc} - */ - public function apply(ImageInterface $image) - { - return $image->paste($this->image, $this->start); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Resize.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Resize.php deleted file mode 100755 index 934cfe2f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Resize.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter\Basic; - -use Imagine\Filter\FilterInterface; -use Imagine\Image\ImageInterface; -use Imagine\Image\BoxInterface; - -/** - * A resize filter - */ -class Resize implements FilterInterface -{ - /** - * @var BoxInterface - */ - private $size; - private $filter; - - /** - * Constructs Resize filter with given width and height - * - * @param BoxInterface $size - * @param string $filter - */ - public function __construct(BoxInterface $size, $filter = ImageInterface::FILTER_UNDEFINED) - { - $this->size = $size; - $this->filter = $filter; - } - - /** - * {@inheritdoc} - */ - public function apply(ImageInterface $image) - { - return $image->resize($this->size, $this->filter); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Rotate.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Rotate.php deleted file mode 100755 index 7b5553ff..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Rotate.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter\Basic; - -use Imagine\Image\ImageInterface; -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Filter\FilterInterface; - -/** - * A rotate filter - */ -class Rotate implements FilterInterface -{ - /** - * @var integer - */ - private $angle; - - /** - * @var ColorInterface - */ - private $background; - - /** - * Constructs Rotate filter with given angle and background color - * - * @param integer $angle - * @param ColorInterface $background - */ - public function __construct($angle, ColorInterface $background = null) - { - $this->angle = $angle; - $this->background = $background; - } - - /** - * {@inheritdoc} - */ - public function apply(ImageInterface $image) - { - return $image->rotate($this->angle, $this->background); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Save.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Save.php deleted file mode 100755 index 0f76625a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Save.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter\Basic; - -use Imagine\Image\ImageInterface; -use Imagine\Filter\FilterInterface; - -/** - * A save filter - */ -class Save implements FilterInterface -{ - /** - * @var string - */ - private $path; - - /** - * @var array - */ - private $options; - - /** - * Constructs Save filter with given path and options - * - * @param string $path - * @param array $options - */ - public function __construct($path = null, array $options = array()) - { - $this->path = $path; - $this->options = $options; - } - - /** - * {@inheritdoc} - */ - public function apply(ImageInterface $image) - { - return $image->save($this->path, $this->options); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Show.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Show.php deleted file mode 100755 index a7d4cbc4..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Show.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter\Basic; - -use Imagine\Image\ImageInterface; -use Imagine\Filter\FilterInterface; - -/** - * A show filter - */ -class Show implements FilterInterface -{ - /** - * @var string - */ - private $format; - - /** - * @var array - */ - private $options; - - /** - * Constructs the Show filter with given format and options - * - * @param string $format - * @param array $options - */ - public function __construct($format, array $options = array()) - { - $this->format = $format; - $this->options = $options; - } - - /** - * {@inheritdoc} - */ - public function apply(ImageInterface $image) - { - return $image->show($this->format, $this->options); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Strip.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Strip.php deleted file mode 100755 index c096a51b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Strip.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter\Basic; - -use Imagine\Image\ImageInterface; -use Imagine\Filter\FilterInterface; - -/** - * A strip filter - */ -class Strip implements FilterInterface -{ - /** - * {@inheritdoc} - */ - public function apply(ImageInterface $image) - { - return $image->strip(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Thumbnail.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Thumbnail.php deleted file mode 100755 index 3176f1c3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/Thumbnail.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter\Basic; - -use Imagine\Image\ImageInterface; -use Imagine\Image\BoxInterface; -use Imagine\Filter\FilterInterface; - -/** - * A thumbnail filter - */ -class Thumbnail implements FilterInterface -{ - /** - * @var BoxInterface - */ - private $size; - - /** - * @var string - */ - private $mode; - - /** - * @var string - */ - private $filter; - - /** - * Constructs the Thumbnail filter with given width, height and mode - * - * @param BoxInterface $size - * @param string $mode - * @param string $filter - */ - public function __construct(BoxInterface $size, $mode = ImageInterface::THUMBNAIL_INSET, $filter = ImageInterface::FILTER_UNDEFINED) - { - $this->size = $size; - $this->mode = $mode; - $this->filter = $filter; - } - - /** - * {@inheritdoc} - */ - public function apply(ImageInterface $image) - { - return $image->thumbnail($this->size, $this->mode, $this->filter); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/WebOptimization.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/WebOptimization.php deleted file mode 100755 index 37f5f3f1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Basic/WebOptimization.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter\Basic; - -use Imagine\Image\ImageInterface; -use Imagine\Image\Palette\RGB; -use Imagine\Filter\FilterInterface; - -/** - * A filter to render web-optimized images - */ -class WebOptimization implements FilterInterface -{ - private $palette; - private $path; - private $options; - - public function __construct($path = null, array $options = array()) - { - $this->path = $path; - $this->options = array_replace(array( - 'resolution-units' => ImageInterface::RESOLUTION_PIXELSPERINCH, - 'resolution-y' => 72, - 'resolution-x' => 72, - ), $options); - $this->palette = new RGB(); - } - - /** - * {@inheritdoc} - */ - public function apply(ImageInterface $image) - { - $image - ->usePalette($this->palette) - ->strip(); - - if (is_callable($this->path)) { - $path = call_user_func($this->path, $image); - } elseif (null !== $this->path) { - $path = $this->path; - } else { - return $image; - } - - return $image->save($path, $this->options); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/FilterInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/FilterInterface.php deleted file mode 100755 index e23ab70e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/FilterInterface.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter; - -use Imagine\Image\ImageInterface; - -/** - * Interface for imagine filters - */ -interface FilterInterface -{ - /** - * Applies scheduled transformation to ImageInterface instance - * Returns processed ImageInterface instance - * - * @param ImageInterface $image - * - * @return ImageInterface - */ - public function apply(ImageInterface $image); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/ImagineAware.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/ImagineAware.php deleted file mode 100755 index 606c5254..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/ImagineAware.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter; - -use Imagine\Exception\InvalidArgumentException; -use Imagine\Image\ImagineInterface; - -/** - * ImagineAware base class - */ -abstract class ImagineAware implements FilterInterface -{ - /** - * An ImagineInterface instance. - * - * @var ImagineInterface - */ - private $imagine; - - /** - * Set ImagineInterface instance. - * - * @param ImagineInterface $imagine An ImagineInterface instance - */ - public function setImagine(ImagineInterface $imagine) - { - $this->imagine = $imagine; - } - - /** - * Get ImagineInterface instance. - * - * @return ImagineInterface - * - * @throws InvalidArgumentException - */ - public function getImagine() - { - if (!$this->imagine instanceof ImagineInterface) { - throw new InvalidArgumentException(sprintf('In order to use %s pass an Imagine\Image\ImagineInterface instance to filter constructor', get_class($this))); - } - - return $this->imagine; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Transformation.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Transformation.php deleted file mode 100755 index 26c023a0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Filter/Transformation.php +++ /dev/null @@ -1,240 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Filter; - -use Imagine\Exception\InvalidArgumentException; -use Imagine\Filter\Basic\ApplyMask; -use Imagine\Filter\Basic\Copy; -use Imagine\Filter\Basic\Crop; -use Imagine\Filter\Basic\Fill; -use Imagine\Filter\Basic\FlipVertically; -use Imagine\Filter\Basic\FlipHorizontally; -use Imagine\Filter\Basic\Paste; -use Imagine\Filter\Basic\Resize; -use Imagine\Filter\Basic\Rotate; -use Imagine\Filter\Basic\Save; -use Imagine\Filter\Basic\Show; -use Imagine\Filter\Basic\Strip; -use Imagine\Filter\Basic\Thumbnail; -use Imagine\Image\ImageInterface; -use Imagine\Image\ImagineInterface; -use Imagine\Image\BoxInterface; -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Image\Fill\FillInterface; -use Imagine\Image\ManipulatorInterface; -use Imagine\Image\PointInterface; - -/** - * A transformation filter - */ -final class Transformation implements FilterInterface, ManipulatorInterface -{ - /** - * @var array - */ - private $filters = array(); - - /** - * @var array - */ - private $sorted; - - /** - * An ImagineInterface instance. - * - * @var ImagineInterface - */ - private $imagine; - - /** - * Class constructor. - * - * @param ImagineInterface $imagine An ImagineInterface instance - */ - public function __construct(ImagineInterface $imagine = null) - { - $this->imagine = $imagine; - } - - /** - * Applies a given FilterInterface onto given ImageInterface and returns - * modified ImageInterface - * - * @param ImageInterface $image - * @param FilterInterface $filter - * - * @return ImageInterface - * @throws InvalidArgumentException - */ - public function applyFilter(ImageInterface $image, FilterInterface $filter) - { - if ($filter instanceof ImagineAware) { - if ($this->imagine === null) { - throw new InvalidArgumentException(sprintf('In order to use %s pass an Imagine\Image\ImagineInterface instance to Transformation constructor', get_class($filter))); - } - $filter->setImagine($this->imagine); - } - - return $filter->apply($image); - } - - /** - * Returns a list of filters sorted by their priority. Filters with same priority will be returned in the order they were added. - * - * @return array - */ - public function getFilters() - { - if (null === $this->sorted) { - if (!empty($this->filters)) { - ksort($this->filters); - $this->sorted = call_user_func_array('array_merge', $this->filters); - } else { - $this->sorted = array(); - } - } - - return $this->sorted; - } - - /** - * {@inheritdoc} - */ - public function apply(ImageInterface $image) - { - return array_reduce( - $this->getFilters(), - array($this, 'applyFilter'), - $image - ); - } - - /** - * {@inheritdoc} - */ - public function copy() - { - return $this->add(new Copy()); - } - - /** - * {@inheritdoc} - */ - public function crop(PointInterface $start, BoxInterface $size) - { - return $this->add(new Crop($start, $size)); - } - - /** - * {@inheritdoc} - */ - public function flipHorizontally() - { - return $this->add(new FlipHorizontally()); - } - - /** - * {@inheritdoc} - */ - public function flipVertically() - { - return $this->add(new FlipVertically()); - } - - /** - * {@inheritdoc} - */ - public function strip() - { - return $this->add(new Strip()); - } - - /** - * {@inheritdoc} - */ - public function paste(ImageInterface $image, PointInterface $start) - { - return $this->add(new Paste($image, $start)); - } - - /** - * {@inheritdoc} - */ - public function applyMask(ImageInterface $mask) - { - return $this->add(new ApplyMask($mask)); - } - - /** - * {@inheritdoc} - */ - public function fill(FillInterface $fill) - { - return $this->add(new Fill($fill)); - } - - /** - * {@inheritdoc} - */ - public function resize(BoxInterface $size, $filter = ImageInterface::FILTER_UNDEFINED) - { - return $this->add(new Resize($size, $filter)); - } - - /** - * {@inheritdoc} - */ - public function rotate($angle, ColorInterface $background = null) - { - return $this->add(new Rotate($angle, $background)); - } - - /** - * {@inheritdoc} - */ - public function save($path = null, array $options = array()) - { - return $this->add(new Save($path, $options)); - } - - /** - * {@inheritdoc} - */ - public function show($format, array $options = array()) - { - return $this->add(new Show($format, $options)); - } - - /** - * {@inheritdoc} - */ - public function thumbnail(BoxInterface $size, $mode = ImageInterface::THUMBNAIL_INSET, $filter = ImageInterface::FILTER_UNDEFINED) - { - return $this->add(new Thumbnail($size, $mode, $filter)); - } - - /** - * Registers a given FilterInterface in an internal array of filters for - * later application to an instance of ImageInterface - * - * @param FilterInterface $filter - * @param int $priority - * @return Transformation - */ - public function add(FilterInterface $filter, $priority = 0) - { - $this->filters[$priority][] = $filter; - $this->sorted = null; - - return $this; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Drawer.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Drawer.php deleted file mode 100755 index e5d74e0d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Drawer.php +++ /dev/null @@ -1,333 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Gd; - -use Imagine\Draw\DrawerInterface; -use Imagine\Exception\InvalidArgumentException; -use Imagine\Exception\RuntimeException; -use Imagine\Image\AbstractFont; -use Imagine\Image\BoxInterface; -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Image\Palette\Color\RGB as RGBColor; -use Imagine\Image\PointInterface; - -/** - * Drawer implementation using the GD library - */ -final class Drawer implements DrawerInterface -{ - /** - * @var resource - */ - private $resource; - - /** - * @var array - */ - private $info; - - /** - * Constructs Drawer with a given gd image resource - * - * @param resource $resource - */ - public function __construct($resource) - { - $this->loadGdInfo(); - $this->resource = $resource; - } - - /** - * {@inheritdoc} - */ - public function arc(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $thickness = 1) - { - imagesetthickness($this->resource, max(1, (int) $thickness)); - - if (false === imagealphablending($this->resource, true)) { - throw new RuntimeException('Draw arc operation failed'); - } - - if (false === imagearc($this->resource, $center->getX(), $center->getY(), $size->getWidth(), $size->getHeight(), $start, $end, $this->getColor($color))) { - imagealphablending($this->resource, false); - throw new RuntimeException('Draw arc operation failed'); - } - - if (false === imagealphablending($this->resource, false)) { - throw new RuntimeException('Draw arc operation failed'); - } - - return $this; - } - - /** - * This function does not work properly because of a bug in GD - * - * {@inheritdoc} - */ - public function chord(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1) - { - imagesetthickness($this->resource, max(1, (int) $thickness)); - - if ($fill) { - $style = IMG_ARC_CHORD; - } else { - $style = IMG_ARC_CHORD | IMG_ARC_NOFILL; - } - - if (false === imagealphablending($this->resource, true)) { - throw new RuntimeException('Draw chord operation failed'); - } - - if (false === imagefilledarc($this->resource, $center->getX(), $center->getY(), $size->getWidth(), $size->getHeight(), $start, $end, $this->getColor($color), $style)) { - imagealphablending($this->resource, false); - throw new RuntimeException('Draw chord operation failed'); - } - - if (false === imagealphablending($this->resource, false)) { - throw new RuntimeException('Draw chord operation failed'); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function ellipse(PointInterface $center, BoxInterface $size, ColorInterface $color, $fill = false, $thickness = 1) - { - imagesetthickness($this->resource, max(1, (int) $thickness)); - - if ($fill) { - $callback = 'imagefilledellipse'; - } else { - $callback = 'imageellipse'; - } - - if (false === imagealphablending($this->resource, true)) { - throw new RuntimeException('Draw ellipse operation failed'); - } - - if (false === $callback($this->resource, $center->getX(), $center->getY(), $size->getWidth(), $size->getHeight(), $this->getColor($color))) { - imagealphablending($this->resource, false); - throw new RuntimeException('Draw ellipse operation failed'); - } - - if (false === imagealphablending($this->resource, false)) { - throw new RuntimeException('Draw ellipse operation failed'); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function line(PointInterface $start, PointInterface $end, ColorInterface $color, $thickness = 1) - { - imagesetthickness($this->resource, max(1, (int) $thickness)); - - if (false === imagealphablending($this->resource, true)) { - throw new RuntimeException('Draw line operation failed'); - } - - if (false === imageline($this->resource, $start->getX(), $start->getY(), $end->getX(), $end->getY(), $this->getColor($color))) { - imagealphablending($this->resource, false); - throw new RuntimeException('Draw line operation failed'); - } - - if (false === imagealphablending($this->resource, false)) { - throw new RuntimeException('Draw line operation failed'); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function pieSlice(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1) - { - imagesetthickness($this->resource, max(1, (int) $thickness)); - - if ($fill) { - $style = IMG_ARC_EDGED; - } else { - $style = IMG_ARC_EDGED | IMG_ARC_NOFILL; - } - - if (false === imagealphablending($this->resource, true)) { - throw new RuntimeException('Draw chord operation failed'); - } - - if (false === imagefilledarc($this->resource, $center->getX(), $center->getY(), $size->getWidth(), $size->getHeight(), $start, $end, $this->getColor($color), $style)) { - imagealphablending($this->resource, false); - throw new RuntimeException('Draw chord operation failed'); - } - - if (false === imagealphablending($this->resource, false)) { - throw new RuntimeException('Draw chord operation failed'); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function dot(PointInterface $position, ColorInterface $color) - { - if (false === imagealphablending($this->resource, true)) { - throw new RuntimeException('Draw point operation failed'); - } - - if (false === imagesetpixel($this->resource, $position->getX(), $position->getY(), $this->getColor($color))) { - imagealphablending($this->resource, false); - throw new RuntimeException('Draw point operation failed'); - } - - if (false === imagealphablending($this->resource, false)) { - throw new RuntimeException('Draw point operation failed'); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function polygon(array $coordinates, ColorInterface $color, $fill = false, $thickness = 1) - { - imagesetthickness($this->resource, max(1, (int) $thickness)); - - if (count($coordinates) < 3) { - throw new InvalidArgumentException(sprintf('A polygon must consist of at least 3 points, %d given', count($coordinates))); - } - - $points = call_user_func_array('array_merge', array_map(function (PointInterface $p) { - return array($p->getX(), $p->getY()); - }, $coordinates)); - - if ($fill) { - $callback = 'imagefilledpolygon'; - } else { - $callback = 'imagepolygon'; - } - - if (false === imagealphablending($this->resource, true)) { - throw new RuntimeException('Draw polygon operation failed'); - } - - if (false === $callback($this->resource, $points, count($coordinates), $this->getColor($color))) { - imagealphablending($this->resource, false); - throw new RuntimeException('Draw polygon operation failed'); - } - - if (false === imagealphablending($this->resource, false)) { - throw new RuntimeException('Draw polygon operation failed'); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function text($string, AbstractFont $font, PointInterface $position, $angle = 0, $width = null) - { - if (!$this->info['FreeType Support']) { - throw new RuntimeException('GD is not compiled with FreeType support'); - } - - $angle = -1 * $angle; - $fontsize = $font->getSize(); - $fontfile = $font->getFile(); - $x = $position->getX(); - $y = $position->getY() + $fontsize; - - if ($width !== null) { - $string = $this->wrapText($string, $font, $angle, $width); - } - - if (false === imagealphablending($this->resource, true)) { - throw new RuntimeException('Font mask operation failed'); - } - - if (false === imagefttext($this->resource, $fontsize, $angle, $x, $y, $this->getColor($font->getColor()), $fontfile, $string)) { - imagealphablending($this->resource, false); - throw new RuntimeException('Font mask operation failed'); - } - - if (false === imagealphablending($this->resource, false)) { - throw new RuntimeException('Font mask operation failed'); - } - - return $this; - } - - /** - * Internal - * - * Generates a GD color from Color instance - * - * @param ColorInterface $color - * - * @return resource - * - * @throws RuntimeException - * @throws InvalidArgumentException - */ - private function getColor(ColorInterface $color) - { - if (!$color instanceof RGBColor) { - throw new InvalidArgumentException('GD driver only supports RGB colors'); - } - - $gdColor = imagecolorallocatealpha($this->resource, $color->getRed(), $color->getGreen(), $color->getBlue(), (100 - $color->getAlpha()) * 127 / 100); - if (false === $gdColor) { - throw new RuntimeException(sprintf('Unable to allocate color "RGB(%s, %s, %s)" with transparency of %d percent', $color->getRed(), $color->getGreen(), $color->getBlue(), $color->getAlpha())); - } - - return $gdColor; - } - - private function loadGdInfo() - { - if (!function_exists('gd_info')) { - throw new RuntimeException('Gd not installed'); - } - - $this->info = gd_info(); - } - - /** - * Internal - * - * Fits a string into box with given width - */ - private function wrapText($string, AbstractFont $font, $angle, $width) - { - $result = ''; - $words = explode(' ', $string); - foreach ($words as $word) { - $teststring = $result . ' ' . $word; - $testbox = imagettfbbox($font->getSize(), $angle, $font->getFile(), $teststring); - if ($testbox[2] > $width) { - $result .= ($result == '' ? '' : "\n") . $word; - } else { - $result .= ($result == '' ? '' : ' ') . $word; - } - } - - return $result; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Effects.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Effects.php deleted file mode 100755 index d86c4f8a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Effects.php +++ /dev/null @@ -1,109 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Gd; - -use Imagine\Effects\EffectsInterface; -use Imagine\Exception\RuntimeException; -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Image\Palette\Color\RGB as RGBColor; - -/** - * Effects implementation using the GD library - */ -class Effects implements EffectsInterface -{ - private $resource; - - public function __construct($resource) - { - $this->resource = $resource; - } - - /** - * {@inheritdoc} - */ - public function gamma($correction) - { - if (false === imagegammacorrect($this->resource, 1.0, $correction)) { - throw new RuntimeException('Failed to apply gamma correction to the image'); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function negative() - { - if (false === imagefilter($this->resource, IMG_FILTER_NEGATE)) { - throw new RuntimeException('Failed to negate the image'); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function grayscale() - { - if (false === imagefilter($this->resource, IMG_FILTER_GRAYSCALE)) { - throw new RuntimeException('Failed to grayscale the image'); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function colorize(ColorInterface $color) - { - if (!$color instanceof RGBColor) { - throw new RuntimeException('Colorize effects only accepts RGB color in GD context'); - } - - if (false === imagefilter($this->resource, IMG_FILTER_COLORIZE, $color->getRed(), $color->getGreen(), $color->getBlue())) { - throw new RuntimeException('Failed to colorize the image'); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function sharpen() - { - $sharpenMatrix = array(array(-1,-1,-1), array(-1,16,-1), array(-1,-1,-1)); - $divisor = array_sum(array_map('array_sum', $sharpenMatrix)); - - if (false === imageconvolution($this->resource, $sharpenMatrix, $divisor, 0)) { - throw new RuntimeException('Failed to sharpen the image'); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function blur($sigma = 1) - { - if (false === imagefilter($this->resource, IMG_FILTER_GAUSSIAN_BLUR)) { - throw new RuntimeException('Failed to blur the image'); - } - - return $this; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Font.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Font.php deleted file mode 100755 index 8bc2b04d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Font.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Gd; - -use Imagine\Exception\RuntimeException; -use Imagine\Image\AbstractFont; -use Imagine\Image\Box; - -/** - * Font implementation using the GD library - */ -final class Font extends AbstractFont -{ - /** - * {@inheritdoc} - */ - public function box($string, $angle = 0) - { - if (!function_exists('imageftbbox')) { - throw new RuntimeException('GD must have been compiled with `--with-freetype-dir` option to use the Font feature.'); - } - - $angle = -1 * $angle; - $info = imageftbbox($this->size, $angle, $this->file, $string); - $xs = array($info[0], $info[2], $info[4], $info[6]); - $ys = array($info[1], $info[3], $info[5], $info[7]); - $width = abs(max($xs) - min($xs)); - $height = abs(max($ys) - min($ys)); - - return new Box($width, $height); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Image.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Image.php deleted file mode 100755 index 73d7b950..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Image.php +++ /dev/null @@ -1,735 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Gd; - -use Imagine\Image\AbstractImage; -use Imagine\Image\ImageInterface; -use Imagine\Image\Box; -use Imagine\Image\BoxInterface; -use Imagine\Image\Metadata\MetadataBag; -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Image\Fill\FillInterface; -use Imagine\Image\Point; -use Imagine\Image\PointInterface; -use Imagine\Image\Palette\PaletteInterface; -use Imagine\Image\Palette\Color\RGB as RGBColor; -use Imagine\Image\ProfileInterface; -use Imagine\Image\Palette\RGB; -use Imagine\Exception\InvalidArgumentException; -use Imagine\Exception\OutOfBoundsException; -use Imagine\Exception\RuntimeException; - -/** - * Image implementation using the GD library - */ -final class Image extends AbstractImage -{ - /** - * @var resource - */ - private $resource; - - /** - * @var Layers|null - */ - private $layers; - - /** - * @var PaletteInterface - */ - private $palette; - - /** - * Constructs a new Image instance - * - * @param resource $resource - * @param PaletteInterface $palette - * @param MetadataBag $metadata - */ - public function __construct($resource, PaletteInterface $palette, MetadataBag $metadata) - { - $this->metadata = $metadata; - $this->palette = $palette; - $this->resource = $resource; - } - - /** - * Makes sure the current image resource is destroyed - */ - public function __destruct() - { - if (is_resource($this->resource) && 'gd' === get_resource_type($this->resource)) { - imagedestroy($this->resource); - } - } - - /** - * Returns Gd resource - * - * @return resource - */ - public function getGdResource() - { - return $this->resource; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - final public function copy() - { - $size = $this->getSize(); - $copy = $this->createImage($size, 'copy'); - - if (false === imagecopy($copy, $this->resource, 0, 0, 0, 0, $size->getWidth(), $size->getHeight())) { - throw new RuntimeException('Image copy operation failed'); - } - - return new Image($copy, $this->palette, $this->metadata); - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - final public function crop(PointInterface $start, BoxInterface $size) - { - if (!$start->in($this->getSize())) { - throw new OutOfBoundsException('Crop coordinates must start at minimum 0, 0 position from top left corner, crop height and width must be positive integers and must not exceed the current image borders'); - } - - $width = $size->getWidth(); - $height = $size->getHeight(); - - $dest = $this->createImage($size, 'crop'); - - if (false === imagecopy($dest, $this->resource, 0, 0, $start->getX(), $start->getY(), $width, $height)) { - throw new RuntimeException('Image crop operation failed'); - } - - imagedestroy($this->resource); - - $this->resource = $dest; - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - final public function paste(ImageInterface $image, PointInterface $start) - { - if (!$image instanceof self) { - throw new InvalidArgumentException(sprintf('Gd\Image can only paste() Gd\Image instances, %s given', get_class($image))); - } - - $size = $image->getSize(); - if (!$this->getSize()->contains($size, $start)) { - throw new OutOfBoundsException('Cannot paste image of the given size at the specified position, as it moves outside of the current image\'s box'); - } - - imagealphablending($this->resource, true); - imagealphablending($image->resource, true); - - if (false === imagecopy($this->resource, $image->resource, $start->getX(), $start->getY(), 0, 0, $size->getWidth(), $size->getHeight())) { - throw new RuntimeException('Image paste operation failed'); - } - - imagealphablending($this->resource, false); - imagealphablending($image->resource, false); - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - final public function resize(BoxInterface $size, $filter = ImageInterface::FILTER_UNDEFINED) - { - if (ImageInterface::FILTER_UNDEFINED !== $filter) { - throw new InvalidArgumentException('Unsupported filter type, GD only supports ImageInterface::FILTER_UNDEFINED filter'); - } - - $width = $size->getWidth(); - $height = $size->getHeight(); - - $dest = $this->createImage($size, 'resize'); - - imagealphablending($this->resource, true); - imagealphablending($dest, true); - - if (false === imagecopyresampled($dest, $this->resource, 0, 0, 0, 0, $width, $height, imagesx($this->resource), imagesy($this->resource))) { - throw new RuntimeException('Image resize operation failed'); - } - - imagealphablending($this->resource, false); - imagealphablending($dest, false); - - imagedestroy($this->resource); - - $this->resource = $dest; - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - final public function rotate($angle, ColorInterface $background = null) - { - $color = $background ? $background : $this->palette->color('fff'); - $resource = imagerotate($this->resource, -1 * $angle, $this->getColor($color)); - - if (false === $resource) { - throw new RuntimeException('Image rotate operation failed'); - } - - imagedestroy($this->resource); - $this->resource = $resource; - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - final public function save($path = null, array $options = array()) - { - $path = null === $path ? (isset($this->metadata['filepath']) ? $this->metadata['filepath'] : $path) : $path; - - if (null === $path) { - throw new RuntimeException('You can omit save path only if image has been open from a file'); - } - - if (isset($options['format'])) { - $format = $options['format']; - } elseif ('' !== $extension = pathinfo($path, \PATHINFO_EXTENSION)) { - $format = $extension; - } else { - $originalPath = isset($this->metadata['filepath']) ? $this->metadata['filepath'] : null; - $format = pathinfo($originalPath, \PATHINFO_EXTENSION); - } - - $this->saveOrOutput($format, $options, $path); - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function show($format, array $options = array()) - { - header('Content-type: '.$this->getMimeType($format)); - - $this->saveOrOutput($format, $options); - - return $this; - } - - /** - * {@inheritdoc} - */ - public function get($format, array $options = array()) - { - ob_start(); - $this->saveOrOutput($format, $options); - - return ob_get_clean(); - } - - /** - * {@inheritdoc} - */ - public function __toString() - { - return $this->get('png'); - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - final public function flipHorizontally() - { - $size = $this->getSize(); - $width = $size->getWidth(); - $height = $size->getHeight(); - $dest = $this->createImage($size, 'flip'); - - for ($i = 0; $i < $width; $i++) { - if (false === imagecopy($dest, $this->resource, $i, 0, ($width - 1) - $i, 0, 1, $height)) { - throw new RuntimeException('Horizontal flip operation failed'); - } - } - - imagedestroy($this->resource); - - $this->resource = $dest; - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - final public function flipVertically() - { - $size = $this->getSize(); - $width = $size->getWidth(); - $height = $size->getHeight(); - $dest = $this->createImage($size, 'flip'); - - for ($i = 0; $i < $height; $i++) { - if (false === imagecopy($dest, $this->resource, 0, $i, 0, ($height - 1) - $i, $width, 1)) { - throw new RuntimeException('Vertical flip operation failed'); - } - } - - imagedestroy($this->resource); - - $this->resource = $dest; - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - final public function strip() - { - // GD strips profiles and comment, so there's nothing to do here - return $this; - } - - /** - * {@inheritdoc} - */ - public function draw() - { - return new Drawer($this->resource); - } - - /** - * {@inheritdoc} - */ - public function effects() - { - return new Effects($this->resource); - } - - /** - * {@inheritdoc} - */ - public function getSize() - { - return new Box(imagesx($this->resource), imagesy($this->resource)); - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function applyMask(ImageInterface $mask) - { - if (!$mask instanceof self) { - throw new InvalidArgumentException('Cannot mask non-gd images'); - } - - $size = $this->getSize(); - $maskSize = $mask->getSize(); - - if ($size != $maskSize) { - throw new InvalidArgumentException(sprintf('The given mask doesn\'t match current image\'s size, Current mask\'s dimensions are %s, while image\'s dimensions are %s', $maskSize, $size)); - } - - for ($x = 0, $width = $size->getWidth(); $x < $width; $x++) { - for ($y = 0, $height = $size->getHeight(); $y < $height; $y++) { - $position = new Point($x, $y); - $color = $this->getColorAt($position); - $maskColor = $mask->getColorAt($position); - $round = (int) round(max($color->getAlpha(), (100 - $color->getAlpha()) * $maskColor->getRed() / 255)); - - if (false === imagesetpixel($this->resource, $x, $y, $this->getColor($color->dissolve($round - $color->getAlpha())))) { - throw new RuntimeException('Apply mask operation failed'); - } - } - } - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function fill(FillInterface $fill) - { - $size = $this->getSize(); - - for ($x = 0, $width = $size->getWidth(); $x < $width; $x++) { - for ($y = 0, $height = $size->getHeight(); $y < $height; $y++) { - if (false === imagesetpixel($this->resource, $x, $y, $this->getColor($fill->getColor(new Point($x, $y))))) { - throw new RuntimeException('Fill operation failed'); - } - } - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function mask() - { - $mask = $this->copy(); - - if (false === imagefilter($mask->resource, IMG_FILTER_GRAYSCALE)) { - throw new RuntimeException('Mask operation failed'); - } - - return $mask; - } - - /** - * {@inheritdoc} - */ - public function histogram() - { - $size = $this->getSize(); - $colors = array(); - - for ($x = 0, $width = $size->getWidth(); $x < $width; $x++) { - for ($y = 0, $height = $size->getHeight(); $y < $height; $y++) { - $colors[] = $this->getColorAt(new Point($x, $y)); - } - } - - return array_unique($colors); - } - - /** - * {@inheritdoc} - */ - public function getColorAt(PointInterface $point) - { - if (!$point->in($this->getSize())) { - throw new RuntimeException(sprintf('Error getting color at point [%s,%s]. The point must be inside the image of size [%s,%s]', $point->getX(), $point->getY(), $this->getSize()->getWidth(), $this->getSize()->getHeight())); - } - - $index = imagecolorat($this->resource, $point->getX(), $point->getY()); - $info = imagecolorsforindex($this->resource, $index); - - return $this->palette->color(array($info['red'], $info['green'], $info['blue']), max(min(100 - (int) round($info['alpha'] / 127 * 100), 100), 0)); - } - - /** - * {@inheritdoc} - */ - public function layers() - { - if (null === $this->layers) { - $this->layers = new Layers($this, $this->palette, $this->resource); - } - - return $this->layers; - } - - /** - * {@inheritdoc} - **/ - public function interlace($scheme) - { - static $supportedInterlaceSchemes = array( - ImageInterface::INTERLACE_NONE => 0, - ImageInterface::INTERLACE_LINE => 1, - ImageInterface::INTERLACE_PLANE => 1, - ImageInterface::INTERLACE_PARTITION => 1, - ); - - if (!array_key_exists($scheme, $supportedInterlaceSchemes)) { - throw new InvalidArgumentException('Unsupported interlace type'); - } - - imageinterlace($this->resource, $supportedInterlaceSchemes[$scheme]); - - return $this; - } - - /** - * {@inheritdoc} - */ - public function palette() - { - return $this->palette; - } - - /** - * {@inheritdoc} - */ - public function profile(ProfileInterface $profile) - { - throw new RuntimeException('GD driver does not support color profiles'); - } - - /** - * {@inheritdoc} - */ - public function usePalette(PaletteInterface $palette) - { - if (!$palette instanceof RGB) { - throw new RuntimeException('GD driver only supports RGB palette'); - } - - $this->palette = $palette; - - return $this; - } - - /** - * Internal - * - * Performs save or show operation using one of GD's image... functions - * - * @param string $format - * @param array $options - * @param string $filename - * - * @throws InvalidArgumentException - * @throws RuntimeException - */ - private function saveOrOutput($format, array $options, $filename = null) - { - $format = $this->normalizeFormat($format); - - if (!$this->supported($format)) { - throw new InvalidArgumentException(sprintf('Saving image in "%s" format is not supported, please use one of the following extensions: "%s"', $format, implode('", "', $this->supported()))); - } - - $save = 'image'.$format; - $args = array(&$this->resource, $filename); - - // Preserve BC until version 1.0 - if (isset($options['quality']) && !isset($options['png_compression_level'])) { - $options['png_compression_level'] = round((100 - $options['quality']) * 9 / 100); - } - if (isset($options['filters']) && !isset($options['png_compression_filter'])) { - $options['png_compression_filter'] = $options['filters']; - } - - $options = $this->updateSaveOptions($options); - - if ($format === 'jpeg' && isset($options['jpeg_quality'])) { - $args[] = $options['jpeg_quality']; - } - - if ($format === 'png') { - if (isset($options['png_compression_level'])) { - if ($options['png_compression_level'] < 0 || $options['png_compression_level'] > 9) { - throw new InvalidArgumentException('png_compression_level option should be an integer from 0 to 9'); - } - $args[] = $options['png_compression_level']; - } else { - $args[] = -1; // use default level - } - - if (isset($options['png_compression_filter'])) { - if (~PNG_ALL_FILTERS & $options['png_compression_filter']) { - throw new InvalidArgumentException('png_compression_filter option should be a combination of the PNG_FILTER_XXX constants'); - } - $args[] = $options['png_compression_filter']; - } - } - - if (($format === 'wbmp' || $format === 'xbm') && isset($options['foreground'])) { - $args[] = $options['foreground']; - } - - $this->setExceptionHandler(); - - if (false === call_user_func_array($save, $args)) { - throw new RuntimeException('Save operation failed'); - } - - $this->resetExceptionHandler(); - } - - /** - * Internal - * - * Generates a GD image - * - * @param BoxInterface $size - * @param string the operation initiating the creation - * - * @return resource - * - * @throws RuntimeException - * - */ - private function createImage(BoxInterface $size, $operation) - { - $resource = imagecreatetruecolor($size->getWidth(), $size->getHeight()); - - if (false === $resource) { - throw new RuntimeException('Image '.$operation.' failed'); - } - - if (false === imagealphablending($resource, false) || false === imagesavealpha($resource, true)) { - throw new RuntimeException('Image '.$operation.' failed'); - } - - if (function_exists('imageantialias')) { - imageantialias($resource, true); - } - - $transparent = imagecolorallocatealpha($resource, 255, 255, 255, 127); - imagefill($resource, 0, 0, $transparent); - imagecolortransparent($resource, $transparent); - - return $resource; - } - - /** - * Internal - * - * Generates a GD color from Color instance - * - * @param ColorInterface $color - * - * @return integer A color identifier - * - * @throws RuntimeException - * @throws InvalidArgumentException - */ - private function getColor(ColorInterface $color) - { - if (!$color instanceof RGBColor) { - throw new InvalidArgumentException('GD driver only supports RGB colors'); - } - - $index = imagecolorallocatealpha($this->resource, $color->getRed(), $color->getGreen(), $color->getBlue(), round(127 * (100 - $color->getAlpha()) / 100)); - - if (false === $index) { - throw new RuntimeException(sprintf('Unable to allocate color "RGB(%s, %s, %s)" with transparency of %d percent', $color->getRed(), $color->getGreen(), $color->getBlue(), $color->getAlpha())); - } - - return $index; - } - - /** - * Internal - * - * Normalizes a given format name - * - * @param string $format - * - * @return string - */ - private function normalizeFormat($format) - { - $format = strtolower($format); - - if ('jpg' === $format || 'pjpeg' === $format) { - $format = 'jpeg'; - } - - return $format; - } - - /** - * Internal - * - * Checks whether a given format is supported by GD library - * - * @param string $format - * - * @return Boolean - */ - private function supported($format = null) - { - $formats = array('gif', 'jpeg', 'png', 'wbmp', 'xbm'); - - if (null === $format) { - return $formats; - } - - return in_array($format, $formats); - } - - private function setExceptionHandler() - { - set_error_handler(function ($errno, $errstr, $errfile, $errline) { - if (0 === error_reporting()) { - return; - } - - throw new RuntimeException($errstr, $errno, new \ErrorException($errstr, 0, $errno, $errfile, $errline)); - }, E_WARNING | E_NOTICE); - } - - private function resetExceptionHandler() - { - restore_error_handler(); - } - - /** - * Internal - * - * Get the mime type based on format. - * - * @param string $format - * - * @return string mime-type - * - * @throws RuntimeException - */ - private function getMimeType($format) - { - $format = $this->normalizeFormat($format); - - if (!$this->supported($format)) { - throw new RuntimeException('Invalid format'); - } - - static $mimeTypes = array( - 'jpeg' => 'image/jpeg', - 'gif' => 'image/gif', - 'png' => 'image/png', - 'wbmp' => 'image/vnd.wap.wbmp', - 'xbm' => 'image/xbm', - ); - - return $mimeTypes[$format]; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Imagine.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Imagine.php deleted file mode 100755 index f9e95087..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Imagine.php +++ /dev/null @@ -1,195 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Gd; - -use Imagine\Image\AbstractImagine; -use Imagine\Image\Metadata\MetadataBag; -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Image\Palette\RGB; -use Imagine\Image\Palette\PaletteInterface; -use Imagine\Image\BoxInterface; -use Imagine\Image\Palette\Color\RGB as RGBColor; -use Imagine\Exception\InvalidArgumentException; -use Imagine\Exception\RuntimeException; - -/** - * Imagine implementation using the GD library - */ -final class Imagine extends AbstractImagine -{ - /** - * @var array - */ - private $info; - - /** - * @throws RuntimeException - */ - public function __construct() - { - $this->loadGdInfo(); - $this->requireGdVersion('2.0.1'); - } - - /** - * {@inheritdoc} - */ - public function create(BoxInterface $size, ColorInterface $color = null) - { - $width = $size->getWidth(); - $height = $size->getHeight(); - - $resource = imagecreatetruecolor($width, $height); - - if (false === $resource) { - throw new RuntimeException('Create operation failed'); - } - - $palette = null !== $color ? $color->getPalette() : new RGB(); - $color = $color ? $color : $palette->color('fff'); - - if (!$color instanceof RGBColor) { - throw new InvalidArgumentException('GD driver only supports RGB colors'); - } - - $index = imagecolorallocatealpha($resource, $color->getRed(), $color->getGreen(), $color->getBlue(), round(127 * (100 - $color->getAlpha()) / 100)); - - if (false === $index) { - throw new RuntimeException('Unable to allocate color'); - } - - if (false === imagefill($resource, 0, 0, $index)) { - throw new RuntimeException('Could not set background color fill'); - } - - if ($color->getAlpha() >= 95) { - imagecolortransparent($resource, $index); - } - - return $this->wrap($resource, $palette, new MetadataBag()); - } - - /** - * {@inheritdoc} - */ - public function open($path) - { - $path = $this->checkPath($path); - $data = @file_get_contents($path); - - if (false === $data) { - throw new RuntimeException(sprintf('Failed to open file %s', $path)); - } - - $resource = @imagecreatefromstring($data); - - if (!is_resource($resource)) { - throw new RuntimeException(sprintf('Unable to open image %s', $path)); - } - - return $this->wrap($resource, new RGB(), $this->getMetadataReader()->readFile($path)); - } - - /** - * {@inheritdoc} - */ - public function load($string) - { - return $this->doLoad($string, $this->getMetadataReader()->readData($string)); - } - - /** - * {@inheritdoc} - */ - public function read($resource) - { - if (!is_resource($resource)) { - throw new InvalidArgumentException('Variable does not contain a stream resource'); - } - - $content = stream_get_contents($resource); - - if (false === $content) { - throw new InvalidArgumentException('Cannot read resource content'); - } - - return $this->doLoad($content, $this->getMetadataReader()->readStream($resource)); - } - - /** - * {@inheritdoc} - */ - public function font($file, $size, ColorInterface $color) - { - if (!$this->info['FreeType Support']) { - throw new RuntimeException('GD is not compiled with FreeType support'); - } - - return new Font($file, $size, $color); - } - - private function wrap($resource, PaletteInterface $palette, MetadataBag $metadata) - { - if (!imageistruecolor($resource)) { - list($width, $height) = array(imagesx($resource), imagesy($resource)); - - // create transparent truecolor canvas - $truecolor = imagecreatetruecolor($width, $height); - $transparent = imagecolorallocatealpha($truecolor, 255, 255, 255, 127); - - imagefill($truecolor, 0, 0, $transparent); - imagecolortransparent($truecolor, $transparent); - - imagecopymerge($truecolor, $resource, 0, 0, 0, 0, $width, $height, 100); - - imagedestroy($resource); - $resource = $truecolor; - } - - if (false === imagealphablending($resource, false) || false === imagesavealpha($resource, true)) { - throw new RuntimeException('Could not set alphablending, savealpha and antialias values'); - } - - if (function_exists('imageantialias')) { - imageantialias($resource, true); - } - - return new Image($resource, $palette, $metadata); - } - - private function loadGdInfo() - { - if (!function_exists('gd_info')) { - throw new RuntimeException('Gd not installed'); - } - - $this->info = gd_info(); - } - - private function requireGdVersion($version) - { - if (version_compare(GD_VERSION, $version, '<')) { - throw new RuntimeException(sprintf('GD2 version %s or higher is required', $version)); - } - } - - private function doLoad($string, MetadataBag $metadata) - { - $resource = @imagecreatefromstring($string); - - if (!is_resource($resource)) { - throw new RuntimeException('An image could not be created from the given input'); - } - - return $this->wrap($resource, new RGB(), $metadata); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Layers.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Layers.php deleted file mode 100755 index 93c7a269..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gd/Layers.php +++ /dev/null @@ -1,144 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Gd; - -use Imagine\Image\AbstractLayers; -use Imagine\Exception\RuntimeException; -use Imagine\Image\Metadata\MetadataBag; -use Imagine\Image\Palette\PaletteInterface; -use Imagine\Exception\NotSupportedException; - -class Layers extends AbstractLayers -{ - private $image; - private $offset; - private $resource; - private $palette; - - public function __construct(Image $image, PaletteInterface $palette, $resource) - { - if (!is_resource($resource)) { - throw new RuntimeException('Invalid Gd resource provided'); - } - - $this->image = $image; - $this->resource = $resource; - $this->offset = 0; - $this->palette = $palette; - } - - /** - * {@inheritdoc} - */ - public function merge() - { - } - - /** - * {@inheritdoc} - */ - public function coalesce() - { - } - - /** - * {@inheritdoc} - */ - public function animate($format, $delay, $loops) - { - return $this; - } - - /** - * {@inheritdoc} - */ - public function current() - { - return new Image($this->resource, $this->palette, new MetadataBag()); - } - - /** - * {@inheritdoc} - */ - public function key() - { - return $this->offset; - } - - /** - * {@inheritdoc} - */ - public function next() - { - ++$this->offset; - } - - /** - * {@inheritdoc} - */ - public function rewind() - { - $this->offset = 0; - } - - /** - * {@inheritdoc} - */ - public function valid() - { - return $this->offset < 1; - } - - /** - * {@inheritdoc} - */ - public function count() - { - return 1; - } - - /** - * {@inheritdoc} - */ - public function offsetExists($offset) - { - return 0 === $offset; - } - - /** - * {@inheritdoc} - */ - public function offsetGet($offset) - { - if (0 === $offset) { - return new Image($this->resource, $this->palette, new MetadataBag()); - } - - throw new RuntimeException('GD only supports one layer at offset 0'); - } - - /** - * {@inheritdoc} - */ - public function offsetSet($offset, $value) - { - throw new NotSupportedException('GD does not support layer set'); - } - - /** - * {@inheritdoc} - */ - public function offsetUnset($offset) - { - throw new NotSupportedException('GD does not support layer unset'); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Drawer.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Drawer.php deleted file mode 100755 index de6cc904..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Drawer.php +++ /dev/null @@ -1,356 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Gmagick; - -use Imagine\Draw\DrawerInterface; -use Imagine\Exception\InvalidArgumentException; -use Imagine\Exception\NotSupportedException; -use Imagine\Exception\RuntimeException; -use Imagine\Image\AbstractFont; -use Imagine\Image\BoxInterface; -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Image\Point; -use Imagine\Image\PointInterface; - -/** - * Drawer implementation using the Gmagick PHP extension - */ -final class Drawer implements DrawerInterface -{ - /** - * @var \Gmagick - */ - private $gmagick; - - /** - * @param \Gmagick $gmagick - */ - public function __construct(\Gmagick $gmagick) - { - $this->gmagick = $gmagick; - } - - /** - * {@inheritdoc} - */ - public function arc(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $thickness = 1) - { - $x = $center->getX(); - $y = $center->getY(); - $width = $size->getWidth(); - $height = $size->getHeight(); - - try { - $pixel = $this->getColor($color); - $arc = new \GmagickDraw(); - - $arc->setstrokecolor($pixel); - $arc->setstrokewidth(max(1, (int) $thickness)); - $arc->setfillcolor('transparent'); - $arc->arc( - $x - $width / 2, - $y - $height / 2, - $x + $width / 2, - $y + $height / 2, - $start, - $end - ); - - $this->gmagick->drawImage($arc); - - $pixel = null; - - $arc = null; - } catch (\GmagickException $e) { - throw new RuntimeException('Draw arc operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function chord(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1) - { - $x = $center->getX(); - $y = $center->getY(); - $width = $size->getWidth(); - $height = $size->getHeight(); - - try { - $pixel = $this->getColor($color); - $chord = new \GmagickDraw(); - - $chord->setstrokecolor($pixel); - $chord->setstrokewidth(max(1, (int) $thickness)); - - if ($fill) { - $chord->setfillcolor($pixel); - } else { - $x1 = round($x + $width / 2 * cos(deg2rad($start))); - $y1 = round($y + $height / 2 * sin(deg2rad($start))); - $x2 = round($x + $width / 2 * cos(deg2rad($end))); - $y2 = round($y + $height / 2 * sin(deg2rad($end))); - - $this->line(new Point($x1, $y1), new Point($x2, $y2), $color); - - $chord->setfillcolor('transparent'); - } - - $chord->arc($x - $width / 2, $y - $height / 2, $x + $width / 2, $y + $height / 2, $start, $end); - - $this->gmagick->drawImage($chord); - - $pixel = null; - - $chord = null; - } catch (\GmagickException $e) { - throw new RuntimeException('Draw chord operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function ellipse(PointInterface $center, BoxInterface $size, ColorInterface $color, $fill = false, $thickness = 1) - { - $width = $size->getWidth(); - $height = $size->getHeight(); - - try { - $pixel = $this->getColor($color); - $ellipse = new \GmagickDraw(); - - $ellipse->setstrokecolor($pixel); - $ellipse->setstrokewidth(max(1, (int) $thickness)); - - if ($fill) { - $ellipse->setfillcolor($pixel); - } else { - $ellipse->setfillcolor('transparent'); - } - - $ellipse->ellipse( - $center->getX(), - $center->getY(), - $width / 2, - $height / 2, - 0, 360 - ); - - $this->gmagick->drawImage($ellipse); - - $pixel = null; - - $ellipse = null; - } catch (\GmagickException $e) { - throw new RuntimeException('Draw ellipse operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function line(PointInterface $start, PointInterface $end, ColorInterface $color, $thickness = 1) - { - try { - $pixel = $this->getColor($color); - $line = new \GmagickDraw(); - - $line->setstrokecolor($pixel); - $line->setstrokewidth(max(1, (int) $thickness)); - $line->setfillcolor($pixel); - $line->line( - $start->getX(), - $start->getY(), - $end->getX(), - $end->getY() - ); - - $this->gmagick->drawImage($line); - - $pixel = null; - - $line = null; - } catch (\GmagickException $e) { - throw new RuntimeException('Draw line operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function pieSlice(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1) - { - $width = $size->getWidth(); - $height = $size->getHeight(); - - $x1 = round($center->getX() + $width / 2 * cos(deg2rad($start))); - $y1 = round($center->getY() + $height / 2 * sin(deg2rad($start))); - $x2 = round($center->getX() + $width / 2 * cos(deg2rad($end))); - $y2 = round($center->getY() + $height / 2 * sin(deg2rad($end))); - - if ($fill) { - $this->chord($center, $size, $start, $end, $color, true, $thickness); - $this->polygon( - array( - $center, - new Point($x1, $y1), - new Point($x2, $y2), - ), - $color, - true, - $thickness - ); - } else { - $this->arc($center, $size, $start, $end, $color, $thickness); - $this->line($center, new Point($x1, $y1), $color, $thickness); - $this->line($center, new Point($x2, $y2), $color, $thickness); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function dot(PointInterface $position, ColorInterface $color) - { - $x = $position->getX(); - $y = $position->getY(); - - try { - $pixel = $this->getColor($color); - $point = new \GmagickDraw(); - - $point->setfillcolor($pixel); - $point->point($x, $y); - - $this->gmagick->drawimage($point); - - $pixel = null; - $point = null; - } catch (\GmagickException $e) { - throw new RuntimeException('Draw point operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function polygon(array $coordinates, ColorInterface $color, $fill = false, $thickness = 1) - { - if (count($coordinates) < 3) { - throw new InvalidArgumentException(sprintf('Polygon must consist of at least 3 coordinates, %d given', count($coordinates))); - } - - $points = array_map(function (PointInterface $p) { - return array('x' => $p->getX(), 'y' => $p->getY()); - }, $coordinates); - - try { - $pixel = $this->getColor($color); - $polygon = new \GmagickDraw(); - - $polygon->setstrokecolor($pixel); - $polygon->setstrokewidth(max(1, (int) $thickness)); - - if ($fill) { - $polygon->setfillcolor($pixel); - } else { - $polygon->setfillcolor('transparent'); - } - - $polygon->polygon($points); - - $this->gmagick->drawImage($polygon); - - unset($pixel, $polygon); - } catch (\GmagickException $e) { - throw new RuntimeException('Draw polygon operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function text($string, AbstractFont $font, PointInterface $position, $angle = 0, $width = null) - { - try { - $pixel = $this->getColor($font->getColor()); - $text = new \GmagickDraw(); - - $text->setfont($font->getFile()); - /** - * @see http://www.php.net/manual/en/imagick.queryfontmetrics.php#101027 - * - * ensure font resolution is the same as GD's hard-coded 96 - */ - $text->setfontsize((int) ($font->getSize() * (96 / 72))); - $text->setfillcolor($pixel); - - $info = $this->gmagick->queryfontmetrics($text, $string); - $rad = deg2rad($angle); - $cos = cos($rad); - $sin = sin($rad); - - $x1 = round(0 * $cos - 0 * $sin); - $x2 = round($info['textWidth'] * $cos - $info['textHeight'] * $sin); - $y1 = round(0 * $sin + 0 * $cos); - $y2 = round($info['textWidth'] * $sin + $info['textHeight'] * $cos); - - $xdiff = 0 - min($x1, $x2); - $ydiff = 0 - min($y1, $y2); - - if ($width !== null) { - throw new NotSupportedException('Gmagick doesn\'t support queryfontmetrics function for multiline text', 1); - } - - $this->gmagick->annotateimage($text, $position->getX() + $x1 + $xdiff, $position->getY() + $y2 + $ydiff, $angle, $string); - - unset($pixel, $text); - } catch (\GmagickException $e) { - throw new RuntimeException('Draw text operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * Gets specifically formatted color string from Color instance - * - * @param ColorInterface $color - * - * @return \GmagickPixel - * - * @throws InvalidArgumentException In case a non-opaque color is passed - */ - private function getColor(ColorInterface $color) - { - if (!$color->isOpaque()) { - throw new InvalidArgumentException('Gmagick doesn\'t support transparency'); - } - - return new \GmagickPixel((string) $color); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Effects.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Effects.php deleted file mode 100755 index 3f9c5cd0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Effects.php +++ /dev/null @@ -1,106 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Gmagick; - -use Imagine\Effects\EffectsInterface; -use Imagine\Exception\RuntimeException; -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Exception\NotSupportedException; - -/** - * Effects implementation using the Gmagick PHP extension - */ -class Effects implements EffectsInterface -{ - private $gmagick; - - public function __construct(\Gmagick $gmagick) - { - $this->gmagick = $gmagick; - } - - /** - * {@inheritdoc} - */ - public function gamma($correction) - { - try { - $this->gmagick->gammaimage($correction); - } catch (\GmagickException $e) { - throw new RuntimeException('Failed to apply gamma correction to the image'); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function negative() - { - if (!method_exists($this->gmagick, 'negateimage')) { - throw new NotSupportedException('Gmagick version 1.1.0 RC3 is required for negative effect'); - } - - try { - $this->gmagick->negateimage(false, \Gmagick::CHANNEL_ALL); - } catch (\GmagickException $e) { - throw new RuntimeException('Failed to negate the image'); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function grayscale() - { - try { - $this->gmagick->setImageType(2); - } catch (\GmagickException $e) { - throw new RuntimeException('Failed to grayscale the image'); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function colorize(ColorInterface $color) - { - throw new NotSupportedException('Gmagick does not support colorize'); - } - - /** - * {@inheritdoc} - */ - public function sharpen() - { - throw new NotSupportedException('Gmagick does not support sharpen yet'); - } - - /** - * {@inheritdoc} - */ - public function blur($sigma = 1) - { - try { - $this->gmagick->blurImage(0, $sigma); - } catch (\GmagickException $e) { - throw new RuntimeException('Failed to blur the image', $e->getCode(), $e); - } - - return $this; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Font.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Font.php deleted file mode 100755 index ad67c564..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Font.php +++ /dev/null @@ -1,63 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Gmagick; - -use Imagine\Image\AbstractFont; -use Imagine\Image\Box; -use Imagine\Image\Palette\Color\ColorInterface; - -/** - * Font implementation using the Gmagick PHP extension - */ -final class Font extends AbstractFont -{ - /** - * @var \Gmagick - */ - private $gmagick; - - /** - * @param \Gmagick $gmagick - * @param string $file - * @param integer $size - * @param ColorInterface $color - */ - public function __construct(\Gmagick $gmagick, $file, $size, ColorInterface $color) - { - $this->gmagick = $gmagick; - - parent::__construct($file, $size, $color); - } - - /** - * {@inheritdoc} - */ - public function box($string, $angle = 0) - { - $text = new \GmagickDraw(); - - $text->setfont($this->file); - /** - * @see http://www.php.net/manual/en/imagick.queryfontmetrics.php#101027 - * - * ensure font resolution is the same as GD's hard-coded 96 - */ - $text->setfontsize((int) ($this->size * (96 / 72))); - $text->setfontstyle(\Gmagick::STYLE_OBLIQUE); - - $info = $this->gmagick->queryfontmetrics($text, $string); - - $box = new Box($info['textWidth'], $info['textHeight']); - - return $box; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Image.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Image.php deleted file mode 100755 index 61ef858c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Image.php +++ /dev/null @@ -1,786 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Gmagick; - -use Imagine\Exception\OutOfBoundsException; -use Imagine\Exception\InvalidArgumentException; -use Imagine\Exception\RuntimeException; -use Imagine\Image\AbstractImage; -use Imagine\Image\Metadata\MetadataBag; -use Imagine\Image\Palette\PaletteInterface; -use Imagine\Image\ImageInterface; -use Imagine\Image\Box; -use Imagine\Image\BoxInterface; -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Image\Fill\FillInterface; -use Imagine\Image\Point; -use Imagine\Image\PointInterface; -use Imagine\Image\ProfileInterface; - -/** - * Image implementation using the Gmagick PHP extension - */ -final class Image extends AbstractImage -{ - /** - * @var \Gmagick - */ - private $gmagick; - /** - * @var Layers - */ - private $layers; - - /** - * @var PaletteInterface - */ - private $palette; - - private static $colorspaceMapping = array( - PaletteInterface::PALETTE_CMYK => \Gmagick::COLORSPACE_CMYK, - PaletteInterface::PALETTE_RGB => \Gmagick::COLORSPACE_RGB, - ); - - /** - * Constructs a new Image instance - * - * @param \Gmagick $gmagick - * @param PaletteInterface $palette - * @param MetadataBag $metadata - */ - public function __construct(\Gmagick $gmagick, PaletteInterface $palette, MetadataBag $metadata) - { - $this->metadata = $metadata; - $this->gmagick = $gmagick; - $this->setColorspace($palette); - $this->layers = new Layers($this, $this->palette, $this->gmagick); - } - - /** - * Destroys allocated gmagick resources - */ - public function __destruct() - { - if ($this->gmagick instanceof \Gmagick) { - $this->gmagick->clear(); - $this->gmagick->destroy(); - } - } - - /** - * Returns gmagick instance - * - * @return Gmagick - */ - public function getGmagick() - { - return $this->gmagick; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function copy() - { - return new self(clone $this->gmagick, $this->palette, clone $this->metadata); - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function crop(PointInterface $start, BoxInterface $size) - { - if (!$start->in($this->getSize())) { - throw new OutOfBoundsException('Crop coordinates must start at minimum 0, 0 position from top left corner, crop height and width must be positive integers and must not exceed the current image borders'); - } - - try { - $this->gmagick->cropimage($size->getWidth(), $size->getHeight(), $start->getX(), $start->getY()); - } catch (\GmagickException $e) { - throw new RuntimeException('Crop operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function flipHorizontally() - { - try { - $this->gmagick->flopimage(); - } catch (\GmagickException $e) { - throw new RuntimeException('Horizontal flip operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function flipVertically() - { - try { - $this->gmagick->flipimage(); - } catch (\GmagickException $e) { - throw new RuntimeException('Vertical flip operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function strip() - { - try { - try { - $this->profile($this->palette->profile()); - } catch (\Exception $e) { - // here we discard setting the profile as the previous incorporated profile - // is corrupted, let's now strip the image - } - $this->gmagick->stripimage(); - } catch (\GmagickException $e) { - throw new RuntimeException('Strip operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function paste(ImageInterface $image, PointInterface $start) - { - if (!$image instanceof self) { - throw new InvalidArgumentException(sprintf('Gmagick\Image can only paste() Gmagick\Image instances, %s given', get_class($image))); - } - - if (!$this->getSize()->contains($image->getSize(), $start)) { - throw new OutOfBoundsException('Cannot paste image of the given size at the specified position, as it moves outside of the current image\'s box'); - } - - try { - $this->gmagick->compositeimage($image->gmagick, \Gmagick::COMPOSITE_DEFAULT, $start->getX(), $start->getY()); - } catch (\GmagickException $e) { - throw new RuntimeException('Paste operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function resize(BoxInterface $size, $filter = ImageInterface::FILTER_UNDEFINED) - { - static $supportedFilters = array( - ImageInterface::FILTER_UNDEFINED => \Gmagick::FILTER_UNDEFINED, - ImageInterface::FILTER_BESSEL => \Gmagick::FILTER_BESSEL, - ImageInterface::FILTER_BLACKMAN => \Gmagick::FILTER_BLACKMAN, - ImageInterface::FILTER_BOX => \Gmagick::FILTER_BOX, - ImageInterface::FILTER_CATROM => \Gmagick::FILTER_CATROM, - ImageInterface::FILTER_CUBIC => \Gmagick::FILTER_CUBIC, - ImageInterface::FILTER_GAUSSIAN => \Gmagick::FILTER_GAUSSIAN, - ImageInterface::FILTER_HANNING => \Gmagick::FILTER_HANNING, - ImageInterface::FILTER_HAMMING => \Gmagick::FILTER_HAMMING, - ImageInterface::FILTER_HERMITE => \Gmagick::FILTER_HERMITE, - ImageInterface::FILTER_LANCZOS => \Gmagick::FILTER_LANCZOS, - ImageInterface::FILTER_MITCHELL => \Gmagick::FILTER_MITCHELL, - ImageInterface::FILTER_POINT => \Gmagick::FILTER_POINT, - ImageInterface::FILTER_QUADRATIC => \Gmagick::FILTER_QUADRATIC, - ImageInterface::FILTER_SINC => \Gmagick::FILTER_SINC, - ImageInterface::FILTER_TRIANGLE => \Gmagick::FILTER_TRIANGLE - ); - - if (!array_key_exists($filter, $supportedFilters)) { - throw new InvalidArgumentException('Unsupported filter type'); - } - - try { - $this->gmagick->resizeimage($size->getWidth(), $size->getHeight(), $supportedFilters[$filter], 1); - } catch (\GmagickException $e) { - throw new RuntimeException('Resize operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function rotate($angle, ColorInterface $background = null) - { - try { - $background = $background ?: $this->palette->color('fff'); - $pixel = $this->getColor($background); - - $this->gmagick->rotateimage($pixel, $angle); - - unset($pixel); - } catch (\GmagickException $e) { - throw new RuntimeException('Rotate operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * Internal - * - * Applies options before save or output - * - * @param \Gmagick $image - * @param array $options - * @param string $path - * - * @throws InvalidArgumentException - */ - private function applyImageOptions(\Gmagick $image, array $options, $path) - { - if (isset($options['format'])) { - $format = $options['format']; - } elseif ('' !== $extension = pathinfo($path, \PATHINFO_EXTENSION)) { - $format = $extension; - } else { - $format = pathinfo($image->getImageFilename(), \PATHINFO_EXTENSION); - } - - $format = strtolower($format); - - $options = $this->updateSaveOptions($options); - - if (isset($options['jpeg_quality']) && in_array($format, array('jpeg', 'jpg', 'pjpeg'))) { - $image->setCompressionQuality($options['jpeg_quality']); - } - - if ((isset($options['png_compression_level']) || isset($options['png_compression_filter'])) && $format === 'png') { - // first digit: compression level (default: 7) - if (isset($options['png_compression_level'])) { - if ($options['png_compression_level'] < 0 || $options['png_compression_level'] > 9) { - throw new InvalidArgumentException('png_compression_level option should be an integer from 0 to 9'); - } - $compression = $options['png_compression_level'] * 10; - } else { - $compression = 70; - } - - // second digit: compression filter (default: 5) - if (isset($options['png_compression_filter'])) { - if ($options['png_compression_filter'] < 0 || $options['png_compression_filter'] > 9) { - throw new InvalidArgumentException('png_compression_filter option should be an integer from 0 to 9'); - } - $compression += $options['png_compression_filter']; - } else { - $compression += 5; - } - - $image->setCompressionQuality($compression); - } - - if (isset($options['resolution-units']) && isset($options['resolution-x']) && isset($options['resolution-y'])) { - if ($options['resolution-units'] == ImageInterface::RESOLUTION_PIXELSPERCENTIMETER) { - $image->setimageunits(\Gmagick::RESOLUTION_PIXELSPERCENTIMETER); - } elseif ($options['resolution-units'] == ImageInterface::RESOLUTION_PIXELSPERINCH) { - $image->setimageunits(\Gmagick::RESOLUTION_PIXELSPERINCH); - } else { - throw new InvalidArgumentException('Unsupported image unit format'); - } - - $image->setimageresolution($options['resolution-x'], $options['resolution-y']); - } - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function save($path = null, array $options = array()) - { - $path = null === $path ? $this->gmagick->getImageFilename() : $path; - - if ('' === trim($path)) { - throw new RuntimeException('You can omit save path only if image has been open from a file'); - } - - try { - $this->prepareOutput($options, $path); - $allFrames = !isset($options['animated']) || false === $options['animated']; - $this->gmagick->writeimage($path, $allFrames); - } catch (\GmagickException $e) { - throw new RuntimeException('Save operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function show($format, array $options = array()) - { - header('Content-type: '.$this->getMimeType($format)); - echo $this->get($format, $options); - - return $this; - } - - /** - * {@inheritdoc} - */ - public function get($format, array $options = array()) - { - try { - $options['format'] = $format; - $this->prepareOutput($options); - } catch (\GmagickException $e) { - throw new RuntimeException('Get operation failed', $e->getCode(), $e); - } - - return $this->gmagick->getimagesblob(); - } - - /** - * @param array $options - * @param string $path - */ - private function prepareOutput(array $options, $path = null) - { - if (isset($options['format'])) { - $this->gmagick->setimageformat($options['format']); - } - - if (isset($options['animated']) && true === $options['animated']) { - $format = isset($options['format']) ? $options['format'] : 'gif'; - $delay = isset($options['animated.delay']) ? $options['animated.delay'] : null; - $loops = isset($options['animated.loops']) ? $options['animated.loops'] : 0; - - $options['flatten'] = false; - - $this->layers->animate($format, $delay, $loops); - } else { - $this->layers->merge(); - } - $this->applyImageOptions($this->gmagick, $options, $path); - - // flatten only if image has multiple layers - if ((!isset($options['flatten']) || $options['flatten'] === true) && count($this->layers) > 1) { - $this->flatten(); - } - } - - /** - * {@inheritdoc} - */ - public function __toString() - { - return $this->get('png'); - } - - /** - * {@inheritdoc} - */ - public function draw() - { - return new Drawer($this->gmagick); - } - - /** - * {@inheritdoc} - */ - public function effects() - { - return new Effects($this->gmagick); - } - - /** - * {@inheritdoc} - */ - public function getSize() - { - try { - $i = $this->gmagick->getimageindex(); - $this->gmagick->setimageindex(0); //rewind - $width = $this->gmagick->getimagewidth(); - $height = $this->gmagick->getimageheight(); - $this->gmagick->setimageindex($i); - } catch (\GmagickException $e) { - throw new RuntimeException('Get size operation failed', $e->getCode(), $e); - } - - return new Box($width, $height); - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function applyMask(ImageInterface $mask) - { - if (!$mask instanceof self) { - throw new InvalidArgumentException('Can only apply instances of Imagine\Gmagick\Image as masks'); - } - - $size = $this->getSize(); - $maskSize = $mask->getSize(); - - if ($size != $maskSize) { - throw new InvalidArgumentException(sprintf('The given mask doesn\'t match current image\'s size, current mask\'s dimensions are %s, while image\'s dimensions are %s', $maskSize, $size)); - } - - try { - $mask = $mask->copy(); - $this->gmagick->compositeimage($mask->gmagick, \Gmagick::COMPOSITE_DEFAULT, 0, 0); - } catch (\GmagickException $e) { - throw new RuntimeException('Apply mask operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function mask() - { - $mask = $this->copy(); - - try { - $mask->gmagick->modulateimage(100, 0, 100); - } catch (\GmagickException $e) { - throw new RuntimeException('Mask operation failed', $e->getCode(), $e); - } - - return $mask; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function fill(FillInterface $fill) - { - try { - $draw = new \GmagickDraw(); - $size = $this->getSize(); - - $w = $size->getWidth(); - $h = $size->getHeight(); - - for ($x = 0; $x <= $w; $x++) { - for ($y = 0; $y <= $h; $y++) { - $pixel = $this->getColor($fill->getColor(new Point($x, $y))); - - $draw->setfillcolor($pixel); - $draw->point($x, $y); - - $pixel = null; - } - } - - $this->gmagick->drawimage($draw); - - $draw = null; - } catch (\GmagickException $e) { - throw new RuntimeException('Fill operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function histogram() - { - try { - $pixels = $this->gmagick->getimagehistogram(); - } catch (\GmagickException $e) { - throw new RuntimeException('Error while fetching histogram', $e->getCode(), $e); - } - - $image = $this; - - return array_map(function (\GmagickPixel $pixel) use ($image) { - return $image->pixelToColor($pixel); - }, $pixels); - } - - /** - * {@inheritdoc} - */ - public function getColorAt(PointInterface $point) - { - if (!$point->in($this->getSize())) { - throw new InvalidArgumentException(sprintf('Error getting color at point [%s,%s]. The point must be inside the image of size [%s,%s]', $point->getX(), $point->getY(), $this->getSize()->getWidth(), $this->getSize()->getHeight())); - } - - try { - $cropped = clone $this->gmagick; - $histogram = $cropped - ->cropImage(1, 1, $point->getX(), $point->getY()) - ->getImageHistogram(); - } catch (\GmagickException $e) { - throw new RuntimeException('Unable to get the pixel'); - } - - $pixel = array_shift($histogram); - - unset($histogram, $cropped); - - return $this->pixelToColor($pixel); - } - - /** - * Returns a color given a pixel, depending the Palette context - * - * Note : this method is public for PHP 5.3 compatibility - * - * @param \GmagickPixel $pixel - * - * @return ColorInterface - * - * @throws InvalidArgumentException In case a unknown color is requested - */ - public function pixelToColor(\GmagickPixel $pixel) - { - static $colorMapping = array( - ColorInterface::COLOR_RED => \Gmagick::COLOR_RED, - ColorInterface::COLOR_GREEN => \Gmagick::COLOR_GREEN, - ColorInterface::COLOR_BLUE => \Gmagick::COLOR_BLUE, - ColorInterface::COLOR_CYAN => \Gmagick::COLOR_CYAN, - ColorInterface::COLOR_MAGENTA => \Gmagick::COLOR_MAGENTA, - ColorInterface::COLOR_YELLOW => \Gmagick::COLOR_YELLOW, - ColorInterface::COLOR_KEYLINE => \Gmagick::COLOR_BLACK, - // There is no gray component in \Gmagick, let's use one of the RGB comp - ColorInterface::COLOR_GRAY => \Gmagick::COLOR_RED, - ); - - if ($this->palette->supportsAlpha()) { - try { - $alpha = (int) round($pixel->getcolorvalue(\Gmagick::COLOR_ALPHA) * 100); - } catch (\GmagickPixelException $e) { - $alpha = null; - } - } else { - $alpha = null; - } - - $palette = $this->palette(); - - return $this->palette->color(array_map(function ($color) use ($palette, $pixel, $colorMapping) { - if (!isset($colorMapping[$color])) { - throw new InvalidArgumentException(sprintf('Color %s is not mapped in Gmagick', $color)); - } - $multiplier = 255; - if ($palette->name() === PaletteInterface::PALETTE_CMYK) { - $multiplier = 100; - } - - return $pixel->getcolorvalue($colorMapping[$color]) * $multiplier; - }, $this->palette->pixelDefinition()), $alpha); - } - - /** - * {@inheritdoc} - */ - public function layers() - { - return $this->layers; - } - - /** - * {@inheritdoc} - */ - public function interlace($scheme) - { - static $supportedInterlaceSchemes = array( - ImageInterface::INTERLACE_NONE => \Gmagick::INTERLACE_NO, - ImageInterface::INTERLACE_LINE => \Gmagick::INTERLACE_LINE, - ImageInterface::INTERLACE_PLANE => \Gmagick::INTERLACE_PLANE, - ImageInterface::INTERLACE_PARTITION => \Gmagick::INTERLACE_PARTITION, - ); - - if (!array_key_exists($scheme, $supportedInterlaceSchemes)) { - throw new InvalidArgumentException('Unsupported interlace type'); - } - - $this->gmagick->setInterlaceScheme($supportedInterlaceSchemes[$scheme]); - - return $this; - } - - /** - * {@inheritdoc} - */ - public function usePalette(PaletteInterface $palette) - { - if (!isset(static::$colorspaceMapping[$palette->name()])) { - throw new InvalidArgumentException(sprintf('The palette %s is not supported by Gmagick driver',$palette->name())); - } - - if ($this->palette->name() === $palette->name()) { - return $this; - } - - try { - try { - $hasICCProfile = (Boolean) $this->gmagick->getimageprofile('ICM'); - } catch (\GmagickException $e) { - $hasICCProfile = false; - } - - if (!$hasICCProfile) { - $this->profile($this->palette->profile()); - } - - $this->profile($palette->profile()); - - $this->setColorspace($palette); - $this->palette = $palette; - } catch (\GmagickException $e) { - throw new RuntimeException('Failed to set colorspace', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function palette() - { - return $this->palette; - } - - /** - * {@inheritdoc} - */ - public function profile(ProfileInterface $profile) - { - try { - $this->gmagick->profileimage('ICM', $profile->data()); - } catch (\GmagickException $e) { - throw new RuntimeException(sprintf('Unable to add profile %s to image', $profile->name()), $e->getCode(), $e); - } - - return $this; - } - - /** - * Internal - * - * Flatten the image. - */ - private function flatten() - { - /** - * @see http://pecl.php.net/bugs/bug.php?id=22435 - */ - if (method_exists($this->gmagick, 'flattenImages')) { - try { - $this->gmagick = $this->gmagick->flattenImages(); - } catch (\GmagickException $e) { - throw new RuntimeException('Flatten operation failed', $e->getCode(), $e); - } - } - } - - /** - * Gets specifically formatted color string from Color instance - * - * @param ColorInterface $color - * - * @return \GmagickPixel - * - * @throws InvalidArgumentException - */ - private function getColor(ColorInterface $color) - { - if (!$color->isOpaque()) { - throw new InvalidArgumentException('Gmagick doesn\'t support transparency'); - } - - return new \GmagickPixel((string) $color); - } - - /** - * Internal - * - * Get the mime type based on format. - * - * @param string $format - * - * @return string mime-type - * - * @throws InvalidArgumentException - */ - private function getMimeType($format) - { - static $mimeTypes = array( - 'jpeg' => 'image/jpeg', - 'jpg' => 'image/jpeg', - 'gif' => 'image/gif', - 'png' => 'image/png', - 'wbmp' => 'image/vnd.wap.wbmp', - 'xbm' => 'image/xbm', - ); - - if (!isset($mimeTypes[$format])) { - throw new InvalidArgumentException(sprintf('Unsupported format given. Only %s are supported, %s given', implode(", ", array_keys($mimeTypes)), $format)); - } - - return $mimeTypes[$format]; - } - - /** - * Sets colorspace and image type, assigns the palette. - * - * @param PaletteInterface $palette - * - * @throws InvalidArgumentException - */ - private function setColorspace(PaletteInterface $palette) - { - if (!isset(static::$colorspaceMapping[$palette->name()])) { - throw new InvalidArgumentException(sprintf('The palette %s is not supported by Gmagick driver', $palette->name())); - } - - $this->gmagick->setimagecolorspace(static::$colorspaceMapping[$palette->name()]); - $this->palette = $palette; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Imagine.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Imagine.php deleted file mode 100755 index ce4d4ed6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Imagine.php +++ /dev/null @@ -1,167 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Gmagick; - -use Imagine\Image\AbstractImagine; -use Imagine\Exception\NotSupportedException; -use Imagine\Image\BoxInterface; -use Imagine\Image\Metadata\MetadataBag; -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Image\Palette\Grayscale; -use Imagine\Image\Palette\CMYK; -use Imagine\Image\Palette\RGB; -use Imagine\Image\Palette\Color\CMYK as CMYKColor; -use Imagine\Exception\InvalidArgumentException; -use Imagine\Exception\RuntimeException; - -/** - * Imagine implementation using the Gmagick PHP extension - */ -class Imagine extends AbstractImagine -{ - /** - * @throws RuntimeException - */ - public function __construct() - { - if (!class_exists('Gmagick')) { - throw new RuntimeException('Gmagick not installed'); - } - } - - /** - * {@inheritdoc} - */ - public function open($path) - { - $path = $this->checkPath($path); - - try { - $gmagick = new \Gmagick($path); - $image = new Image($gmagick, $this->createPalette($gmagick), $this->getMetadataReader()->readFile($path)); - } catch (\GmagickException $e) { - throw new RuntimeException(sprintf('Unable to open image %s', $path), $e->getCode(), $e); - } - - return $image; - } - - /** - * {@inheritdoc} - */ - public function create(BoxInterface $size, ColorInterface $color = null) - { - $width = $size->getWidth(); - $height = $size->getHeight(); - - $palette = null !== $color ? $color->getPalette() : new RGB(); - $color = null !== $color ? $color : $palette->color('fff'); - - try { - $gmagick = new \Gmagick(); - // Gmagick does not support creation of CMYK GmagickPixel - // see https://bugs.php.net/bug.php?id=64466 - if ($color instanceof CMYKColor) { - $switchPalette = $palette; - $palette = new RGB(); - $pixel = new \GmagickPixel($palette->color((string) $color)); - } else { - $switchPalette = null; - $pixel = new \GmagickPixel((string) $color); - } - - if ($color->getPalette()->supportsAlpha() && $color->getAlpha() < 100) { - throw new NotSupportedException('alpha transparency is not supported'); - } - - $gmagick->newimage($width, $height, $pixel->getcolor(false)); - $gmagick->setimagecolorspace(\Gmagick::COLORSPACE_TRANSPARENT); - $gmagick->setimagebackgroundcolor($pixel); - - $image = new Image($gmagick, $palette, new MetadataBag()); - - if ($switchPalette) { - $image->usePalette($switchPalette); - } - - return $image; - } catch (\GmagickException $e) { - throw new RuntimeException('Could not create empty image', $e->getCode(), $e); - } - } - - /** - * {@inheritdoc} - */ - public function load($string) - { - return $this->doLoad($string, $this->getMetadataReader()->readData($string)); - } - - /** - * {@inheritdoc} - */ - public function read($resource) - { - if (!is_resource($resource)) { - throw new InvalidArgumentException('Variable does not contain a stream resource'); - } - - $content = stream_get_contents($resource); - - if (false === $content) { - throw new InvalidArgumentException('Couldn\'t read given resource'); - } - - return $this->doLoad($content, $this->getMetadataReader()->readStream($resource)); - } - - /** - * {@inheritdoc} - */ - public function font($file, $size, ColorInterface $color) - { - $gmagick = new \Gmagick(); - $gmagick->newimage(1, 1, 'transparent'); - - return new Font($gmagick, $file, $size, $color); - } - - private function createPalette(\Gmagick $gmagick) - { - switch ($gmagick->getimagecolorspace()) { - case \Gmagick::COLORSPACE_SRGB: - case \Gmagick::COLORSPACE_RGB: - return new RGB(); - case \Gmagick::COLORSPACE_CMYK: - return new CMYK(); - case \Gmagick::COLORSPACE_GRAY: - return new Grayscale(); - default: - throw new NotSupportedException('Only RGB and CMYK colorspace are currently supported'); - } - } - - private function doLoad($content, MetadataBag $metadata) - { - try { - $gmagick = new \Gmagick(); - $gmagick->readimageblob($content); - } catch (\GmagickException $e) { - throw new RuntimeException( - 'Could not load image from string', $e->getCode(), $e - ); - } - - return new Image($gmagick, $this->createPalette($gmagick), $metadata); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Layers.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Layers.php deleted file mode 100755 index d708812a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Gmagick/Layers.php +++ /dev/null @@ -1,272 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Gmagick; - -use Imagine\Image\AbstractLayers; -use Imagine\Exception\RuntimeException; -use Imagine\Exception\NotSupportedException; -use Imagine\Exception\OutOfBoundsException; -use Imagine\Exception\InvalidArgumentException; -use Imagine\Image\Metadata\MetadataBag; -use Imagine\Image\Palette\PaletteInterface; - -class Layers extends AbstractLayers -{ - /** - * @var Image - */ - private $image; - - /** - * @var \Gmagick - */ - private $resource; - - /** - * @var integer - */ - private $offset = 0; - - /** - * @var array - */ - private $layers = array(); - - /** - * @var PaletteInterface - */ - private $palette; - - public function __construct(Image $image, PaletteInterface $palette, \Gmagick $resource) - { - $this->image = $image; - $this->resource = $resource; - $this->palette = $palette; - } - - /** - * {@inheritdoc} - */ - public function merge() - { - foreach ($this->layers as $offset => $image) { - try { - $this->resource->setimageindex($offset); - $this->resource->setimage($image->getGmagick()); - } catch (\GmagickException $e) { - throw new RuntimeException('Failed to substitute layer', $e->getCode(), $e); - } - } - } - - /** - * {@inheritdoc} - */ - public function coalesce() - { - throw new NotSupportedException('Gmagick does not support coalescing'); - } - - /** - * {@inheritdoc} - */ - public function animate($format, $delay, $loops) - { - if ('gif' !== strtolower($format)) { - throw new NotSupportedException('Animated picture is currently only supported on gif'); - } - - if (!is_int($loops) || $loops < 0) { - throw new InvalidArgumentException('Loops must be a positive integer.'); - } - - if (null !== $delay && (!is_int($delay) || $delay < 0)) { - throw new InvalidArgumentException('Delay must be either null or a positive integer.'); - } - - try { - foreach ($this as $offset => $layer) { - $this->resource->setimageindex($offset); - $this->resource->setimageformat($format); - - if (null !== $delay) { - $this->resource->setimagedelay($delay / 10); - } - - $this->resource->setimageiterations($loops); - } - } catch (\GmagickException $e) { - throw new RuntimeException('Failed to animate layers', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function current() - { - return $this->extractAt($this->offset); - } - - /** - * Tries to extract layer at given offset - * - * @param integer $offset - * @return Image - * @throws RuntimeException - */ - private function extractAt($offset) - { - if (!isset($this->layers[$offset])) { - try { - $this->resource->setimageindex($offset); - $this->layers[$offset] = new Image($this->resource->getimage(), $this->palette, new MetadataBag()); - } catch (\GmagickException $e) { - throw new RuntimeException(sprintf('Failed to extract layer %d', $offset), $e->getCode(), $e); - } - } - - return $this->layers[$offset]; - } - - /** - * {@inheritdoc} - */ - public function key() - { - return $this->offset; - } - - /** - * {@inheritdoc} - */ - public function next() - { - ++$this->offset; - } - - /** - * {@inheritdoc} - */ - public function rewind() - { - $this->offset = 0; - } - - /** - * {@inheritdoc} - */ - public function valid() - { - return $this->offset < count($this); - } - - /** - * {@inheritdoc} - */ - public function count() - { - try { - return $this->resource->getnumberimages(); - } catch (\GmagickException $e) { - throw new RuntimeException('Failed to count the number of layers', $e->getCode(), $e); - } - } - - /** - * {@inheritdoc} - */ - public function offsetExists($offset) - { - return is_int($offset) && $offset >= 0 && $offset < count($this); - } - - /** - * {@inheritdoc} - */ - public function offsetGet($offset) - { - return $this->extractAt($offset); - } - - /** - * {@inheritdoc} - */ - public function offsetSet($offset, $image) - { - if (!$image instanceof Image) { - throw new InvalidArgumentException('Only a Gmagick Image can be used as layer'); - } - - if (null === $offset) { - $offset = count($this) - 1; - } else { - if (!is_int($offset)) { - throw new InvalidArgumentException('Invalid offset for layer, it must be an integer'); - } - - if (count($this) < $offset || 0 > $offset) { - throw new OutOfBoundsException(sprintf('Invalid offset for layer, it must be a value between 0 and %d, %d given', count($this), $offset)); - } - - if (isset($this[$offset])) { - unset($this[$offset]); - $offset = $offset - 1; - } - } - - $frame = $image->getGmagick(); - - try { - if (count($this) > 0) { - $this->resource->setimageindex($offset); - $this->resource->nextimage(); - } - $this->resource->addimage($frame); - - /** - * ugly hack to bypass issue https://bugs.php.net/bug.php?id=64623 - */ - if (count($this) == 2) { - $this->resource->setimageindex($offset+1); - $this->resource->nextimage(); - $this->resource->addimage($frame); - unset($this[0]); - } - } catch (\GmagickException $e) { - throw new RuntimeException('Unable to set the layer', $e->getCode(), $e); - } - - $this->layers = array(); - } - - /** - * {@inheritdoc} - */ - public function offsetUnset($offset) - { - try { - $this->extractAt($offset); - } catch (RuntimeException $e) { - return; - } - - try { - $this->resource->setimageindex($offset); - $this->resource->removeimage(); - } catch (\GmagickException $e) { - throw new RuntimeException('Unable to remove layer', $e->getCode(), $e); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractFont.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractFont.php deleted file mode 100755 index 59e9a45b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractFont.php +++ /dev/null @@ -1,75 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image; - -use Imagine\Image\Palette\Color\ColorInterface; - -/** - * Abstract font base class - */ -abstract class AbstractFont implements FontInterface -{ - /** - * @var string - */ - protected $file; - - /** - * @var integer - */ - protected $size; - - /** - * @var ColorInterface - */ - protected $color; - - /** - * Constructs a font with specified $file, $size and $color - * - * The font size is to be specified in points (e.g. 10pt means 10) - * - * @param string $file - * @param integer $size - * @param ColorInterface $color - */ - public function __construct($file, $size, ColorInterface $color) - { - $this->file = $file; - $this->size = $size; - $this->color = $color; - } - - /** - * {@inheritdoc} - */ - final public function getFile() - { - return $this->file; - } - - /** - * {@inheritdoc} - */ - final public function getSize() - { - return $this->size; - } - - /** - * {@inheritdoc} - */ - final public function getColor() - { - return $this->color; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractImage.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractImage.php deleted file mode 100755 index 5c85769f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractImage.php +++ /dev/null @@ -1,120 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image; - -use Imagine\Exception\InvalidArgumentException; -use Imagine\Image\Metadata\MetadataBag; - -abstract class AbstractImage implements ImageInterface -{ - /** - * @var MetadataBag - */ - protected $metadata; - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function thumbnail(BoxInterface $size, $mode = ImageInterface::THUMBNAIL_INSET, $filter = ImageInterface::FILTER_UNDEFINED) - { - if ($mode !== ImageInterface::THUMBNAIL_INSET && - $mode !== ImageInterface::THUMBNAIL_OUTBOUND) { - throw new InvalidArgumentException('Invalid mode specified'); - } - - $imageSize = $this->getSize(); - $ratios = array( - $size->getWidth() / $imageSize->getWidth(), - $size->getHeight() / $imageSize->getHeight() - ); - - $thumbnail = $this->copy(); - - $thumbnail->usePalette($this->palette()); - $thumbnail->strip(); - // if target width is larger than image width - // AND target height is longer than image height - if ($size->contains($imageSize)) { - return $thumbnail; - } - - if ($mode === ImageInterface::THUMBNAIL_INSET) { - $ratio = min($ratios); - } else { - $ratio = max($ratios); - } - - if ($mode === ImageInterface::THUMBNAIL_OUTBOUND) { - if (!$imageSize->contains($size)) { - $size = new Box( - min($imageSize->getWidth(), $size->getWidth()), - min($imageSize->getHeight(), $size->getHeight()) - ); - } else { - $imageSize = $thumbnail->getSize()->scale($ratio); - $thumbnail->resize($imageSize, $filter); - } - $thumbnail->crop(new Point( - max(0, round(($imageSize->getWidth() - $size->getWidth()) / 2)), - max(0, round(($imageSize->getHeight() - $size->getHeight()) / 2)) - ), $size); - } else { - if (!$imageSize->contains($size)) { - $imageSize = $imageSize->scale($ratio); - $thumbnail->resize($imageSize, $filter); - } else { - $imageSize = $thumbnail->getSize()->scale($ratio); - $thumbnail->resize($imageSize, $filter); - } - } - - return $thumbnail; - } - - /** - * Updates a given array of save options for backward compatibility with legacy names - * - * @param array $options - * - * @return array - */ - protected function updateSaveOptions(array $options) - { - // Preserve BC until version 1.0 - if (isset($options['quality']) && !isset($options['jpeg_quality'])) { - $options['jpeg_quality'] = $options['quality']; - } - - return $options; - } - - /** - * {@inheritdoc} - */ - public function metadata() - { - return $this->metadata; - } - - /** - * Assures the metadata instance will be cloned, too - */ - public function __clone() - { - if ($this->metadata !== null) { - $this->metadata = clone $this->metadata; - } - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractImagine.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractImagine.php deleted file mode 100755 index fcb1a3d6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractImagine.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image; - -use Imagine\Image\Metadata\DefaultMetadataReader; -use Imagine\Image\Metadata\ExifMetadataReader; -use Imagine\Image\Metadata\MetadataReaderInterface; -use Imagine\Exception\InvalidArgumentException; - -abstract class AbstractImagine implements ImagineInterface -{ - /** @var MetadataReaderInterface */ - private $metadataReader; - - /** - * @param MetadataReaderInterface $metadataReader - * - * @return ImagineInterface - */ - public function setMetadataReader(MetadataReaderInterface $metadataReader) - { - $this->metadataReader = $metadataReader; - - return $this; - } - - /** - * @return MetadataReaderInterface - */ - public function getMetadataReader() - { - if (null === $this->metadataReader) { - if (ExifMetadataReader::isSupported()) { - $this->metadataReader = new ExifMetadataReader(); - } else { - $this->metadataReader = new DefaultMetadataReader(); - } - } - - return $this->metadataReader; - } - - /** - * Checks a path that could be used with ImagineInterface::open and returns - * a proper string. - * - * @param string|object $path - * - * @return string - * - * @throws InvalidArgumentException In case the given path is invalid. - */ - protected function checkPath($path) - { - // provide compatibility with objects such as \SplFileInfo - if (is_object($path) && method_exists($path, '__toString')) { - $path = (string) $path; - } - - $handle = @fopen($path, 'r'); - - if (false === $handle) { - throw new InvalidArgumentException(sprintf('File %s does not exist.', $path)); - } - - fclose($handle); - - return $path; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractLayers.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractLayers.php deleted file mode 100755 index 486a7222..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/AbstractLayers.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image; - -abstract class AbstractLayers implements LayersInterface -{ - /** - * {@inheritdoc} - */ - public function add(ImageInterface $image) - { - $this[] = $image; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function set($offset, ImageInterface $image) - { - $this[$offset] = $image; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function remove($offset) - { - unset($this[$offset]); - - return $this; - } - - /** - * {@inheritdoc} - */ - public function get($offset) - { - return $this[$offset]; - } - - /** - * {@inheritdoc} - */ - public function has($offset) - { - return isset($this[$offset]); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Box.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Box.php deleted file mode 100755 index 37b85135..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Box.php +++ /dev/null @@ -1,122 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image; - -use Imagine\Exception\InvalidArgumentException; - -/** - * A box implementation - */ -final class Box implements BoxInterface -{ - /** - * @var integer - */ - private $width; - - /** - * @var integer - */ - private $height; - - /** - * Constructs the Size with given width and height - * - * @param integer $width - * @param integer $height - * - * @throws InvalidArgumentException - */ - public function __construct($width, $height) - { - if ($height < 1 || $width < 1) { - throw new InvalidArgumentException(sprintf('Length of either side cannot be 0 or negative, current size is %sx%s', $width, $height)); - } - - $this->width = (int) $width; - $this->height = (int) $height; - } - - /** - * {@inheritdoc} - */ - public function getWidth() - { - return $this->width; - } - - /** - * {@inheritdoc} - */ - public function getHeight() - { - return $this->height; - } - - /** - * {@inheritdoc} - */ - public function scale($ratio) - { - return new Box(round($ratio * $this->width), round($ratio * $this->height)); - } - - /** - * {@inheritdoc} - */ - public function increase($size) - { - return new Box((int) $size + $this->width, (int) $size + $this->height); - } - - /** - * {@inheritdoc} - */ - public function contains(BoxInterface $box, PointInterface $start = null) - { - $start = $start ? $start : new Point(0, 0); - - return $start->in($this) && $this->width >= $box->getWidth() + $start->getX() && $this->height >= $box->getHeight() + $start->getY(); - } - - /** - * {@inheritdoc} - */ - public function square() - { - return $this->width * $this->height; - } - - /** - * {@inheritdoc} - */ - public function __toString() - { - return sprintf('%dx%d px', $this->width, $this->height); - } - - /** - * {@inheritdoc} - */ - public function widen($width) - { - return $this->scale($width / $this->width); - } - - /** - * {@inheritdoc} - */ - public function heighten($height) - { - return $this->scale($height / $this->height); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/BoxInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/BoxInterface.php deleted file mode 100755 index 4a086c39..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/BoxInterface.php +++ /dev/null @@ -1,94 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image; - -/** - * Interface for a box - */ -interface BoxInterface -{ - /** - * Gets current image height - * - * @return integer - */ - public function getHeight(); - - /** - * Gets current image width - * - * @return integer - */ - public function getWidth(); - - /** - * Creates new BoxInterface instance with ratios applied to both sides - * - * @param float $ratio - * - * @return BoxInterface - */ - public function scale($ratio); - - /** - * Creates new BoxInterface, adding given size to both sides - * - * @param integer $size - * - * @return BoxInterface - */ - public function increase($size); - - /** - * Checks whether current box can fit given box at a given start position, - * start position defaults to top left corner xy(0,0) - * - * @param BoxInterface $box - * @param PointInterface $start - * - * @return Boolean - */ - public function contains(BoxInterface $box, PointInterface $start = null); - - /** - * Gets current box square, useful for getting total number of pixels in a - * given box - * - * @return integer - */ - public function square(); - - /** - * Returns a string representation of the current box - * - * @return string - */ - public function __toString(); - - /** - * Resizes box to given width, constraining proportions and returns the new box - * - * @param integer $width - * - * @return BoxInterface - */ - public function widen($width); - - /** - * Resizes box to given height, constraining proportions and returns the new box - * - * @param integer $height - * - * @return BoxInterface - */ - public function heighten($height); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/FillInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/FillInterface.php deleted file mode 100755 index c8d69e5d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/FillInterface.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image\Fill; - -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Image\PointInterface; - -/** - * Interface for the fill - */ -interface FillInterface -{ - /** - * Gets color of the fill for the given position - * - * @param PointInterface $position - * - * @return ColorInterface - */ - public function getColor(PointInterface $position); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Horizontal.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Horizontal.php deleted file mode 100755 index 4a423067..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Horizontal.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image\Fill\Gradient; - -use Imagine\Image\PointInterface; - -/** - * Horizontal gradient fill - */ -final class Horizontal extends Linear -{ - /** - * {@inheritdoc} - */ - public function getDistance(PointInterface $position) - { - return $position->getX(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Linear.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Linear.php deleted file mode 100755 index 9bf2cf6c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Linear.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image\Fill\Gradient; - -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Image\Fill\FillInterface; -use Imagine\Image\PointInterface; - -/** - * Linear gradient fill - */ -abstract class Linear implements FillInterface -{ - /** - * @var integer - */ - private $length; - - /** - * @var ColorInterface - */ - private $start; - - /** - * @var ColorInterface - */ - private $end; - - /** - * Constructs a linear gradient with overall gradient length, and start and - * end shades, which default to 0 and 255 accordingly - * - * @param integer $length - * @param ColorInterface $start - * @param ColorInterface $end - */ - final public function __construct($length, ColorInterface $start, ColorInterface $end) - { - $this->length = $length; - $this->start = $start; - $this->end = $end; - } - - /** - * {@inheritdoc} - */ - final public function getColor(PointInterface $position) - { - $l = $this->getDistance($position); - - if ($l >= $this->length) { - return $this->end; - } - - if ($l < 0) { - return $this->start; - } - - return $this->start->getPalette()->blend($this->start, $this->end, $l / $this->length); - } - - /** - * @return ColorInterface - */ - final public function getStart() - { - return $this->start; - } - - /** - * @return ColorInterface - */ - final public function getEnd() - { - return $this->end; - } - - /** - * Get the distance of the position relative to the beginning of the gradient - * - * @param PointInterface $position - * - * @return integer - */ - abstract protected function getDistance(PointInterface $position); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Vertical.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Vertical.php deleted file mode 100755 index 9a26b778..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Fill/Gradient/Vertical.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image\Fill\Gradient; - -use Imagine\Image\PointInterface; - -/** - * Vertical gradient fill - */ -final class Vertical extends Linear -{ - /** - * {@inheritdoc} - */ - public function getDistance(PointInterface $position) - { - return $position->getY(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/FontInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/FontInterface.php deleted file mode 100755 index 59d4a265..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/FontInterface.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image; - -use Imagine\Image\Palette\Color\ColorInterface; - -/** - * The font interface - */ -interface FontInterface -{ - /** - * Gets the fontfile for current font - * - * @return string - */ - public function getFile(); - - /** - * Gets font's integer point size - * - * @return integer - */ - public function getSize(); - - /** - * Gets font's color - * - * @return ColorInterface - */ - public function getColor(); - - /** - * Gets BoxInterface of font size on the image based on string and angle - * - * @param string $string - * @param integer $angle - * - * @return BoxInterface - */ - public function box($string, $angle = 0); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Histogram/Bucket.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Histogram/Bucket.php deleted file mode 100755 index 34dad5ee..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Histogram/Bucket.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image\Histogram; - -/** - * Bucket histogram - */ -final class Bucket implements \Countable -{ - /** - * @var Range - */ - private $range; - - /** - * @var integer - */ - private $count; - - /** - * @param Range $range - * @param integer $count - */ - public function __construct(Range $range, $count = 0) - { - $this->range = $range; - $this->count = $count; - } - - /** - * @param integer $value - */ - public function add($value) - { - if ($this->range->contains($value)) { - $this->count++; - } - } - - /** - * @return integer The number of elements in the bucket. - */ - public function count() - { - return $this->count; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Histogram/Range.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Histogram/Range.php deleted file mode 100755 index 9dc9f992..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Histogram/Range.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image\Histogram; - -use Imagine\Exception\OutOfBoundsException; - -/** - * Range histogram - */ -final class Range -{ - /** - * @var integer - */ - private $start; - - /** - * @var integer - */ - private $end; - - /** - * @param integer $start - * @param integer $end - * - * @throws OutOfBoundsException - */ - public function __construct($start, $end) - { - if ($end <= $start) { - throw new OutOfBoundsException(sprintf('Range end cannot be bigger than start, %d %d given accordingly', $this->start, $this->end)); - } - - $this->start = $start; - $this->end = $end; - } - - /** - * @param integer $value - * - * @return Boolean - */ - public function contains($value) - { - return $value >= $this->start && $value < $this->end; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ImageInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ImageInterface.php deleted file mode 100755 index 6cf1dd87..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ImageInterface.php +++ /dev/null @@ -1,173 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image; - -use Imagine\Draw\DrawerInterface; -use Imagine\Effects\EffectsInterface; -use Imagine\Image\Palette\PaletteInterface; -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Exception\RuntimeException; -use Imagine\Exception\OutOfBoundsException; - -/** - * The image interface - */ -interface ImageInterface extends ManipulatorInterface -{ - const RESOLUTION_PIXELSPERINCH = 'ppi'; - const RESOLUTION_PIXELSPERCENTIMETER = 'ppc'; - - const INTERLACE_NONE = 'none'; - const INTERLACE_LINE = 'line'; - const INTERLACE_PLANE = 'plane'; - const INTERLACE_PARTITION = 'partition'; - - const FILTER_UNDEFINED = 'undefined'; - const FILTER_POINT = 'point'; - const FILTER_BOX = 'box'; - const FILTER_TRIANGLE = 'triangle'; - const FILTER_HERMITE = 'hermite'; - const FILTER_HANNING = 'hanning'; - const FILTER_HAMMING = 'hamming'; - const FILTER_BLACKMAN = 'blackman'; - const FILTER_GAUSSIAN = 'gaussian'; - const FILTER_QUADRATIC = 'quadratic'; - const FILTER_CUBIC = 'cubic'; - const FILTER_CATROM = 'catrom'; - const FILTER_MITCHELL = 'mitchell'; - const FILTER_LANCZOS = 'lanczos'; - const FILTER_BESSEL = 'bessel'; - const FILTER_SINC = 'sinc'; - - /** - * Returns the image content as a binary string - * - * @param string $format - * @param array $options - * - * @throws RuntimeException - * - * @return string binary - */ - public function get($format, array $options = array()); - - /** - * Returns the image content as a PNG binary string - * - * @throws RuntimeException - * - * @return string binary - */ - public function __toString(); - - /** - * Instantiates and returns a DrawerInterface instance for image drawing - * - * @return DrawerInterface - */ - public function draw(); - - /** - * @return EffectsInterface - */ - public function effects(); - - /** - * Returns current image size - * - * @return BoxInterface - */ - public function getSize(); - - /** - * Transforms creates a grayscale mask from current image, returns a new - * image, while keeping the existing image unmodified - * - * @return ImageInterface - */ - public function mask(); - - /** - * Returns array of image colors as Imagine\Image\Palette\Color\ColorInterface instances - * - * @return array - */ - public function histogram(); - - /** - * Returns color at specified positions of current image - * - * @param PointInterface $point - * - * @throws RuntimeException - * - * @return ColorInterface - */ - public function getColorAt(PointInterface $point); - - /** - * Returns the image layers when applicable. - * - * @throws RuntimeException In case the layer can not be returned - * @throws OutOfBoundsException In case the index is not a valid value - * - * @return LayersInterface - */ - public function layers(); - - /** - * Enables or disables interlacing - * - * @param string $scheme - * - * @throws InvalidArgumentException When an unsupported Interface type is supplied - * - * @return ImageInterface - */ - public function interlace($scheme); - - /** - * Return the current color palette - * - * @return PaletteInterface - */ - public function palette(); - - /** - * Set a palette for the image. Useful to change colorspace. - * - * @param PaletteInterface $palette - * - * @return ImageInterface - * - * @throws RuntimeException - */ - public function usePalette(PaletteInterface $palette); - - /** - * Applies a color profile on the Image - * - * @param ProfileInterface $profile - * - * @return ImageInterface - * - * @throws RuntimeException - */ - public function profile(ProfileInterface $profile); - - /** - * Returns the Image's meta data - * - * @return Metadata\MetadataInterface - */ - public function metadata(); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ImagineInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ImagineInterface.php deleted file mode 100755 index b5c942c7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ImagineInterface.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image; - -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Exception\InvalidArgumentException; -use Imagine\Exception\RuntimeException; - -/** - * The imagine interface - */ -interface ImagineInterface -{ - const VERSION = '0.7-dev'; - - /** - * Creates a new empty image with an optional background color - * - * @param BoxInterface $size - * @param ColorInterface $color - * - * @throws InvalidArgumentException - * @throws RuntimeException - * - * @return ImageInterface - */ - public function create(BoxInterface $size, ColorInterface $color = null); - - /** - * Opens an existing image from $path - * - * @param string $path - * - * @throws RuntimeException - * - * @return ImageInterface - */ - public function open($path); - - /** - * Loads an image from a binary $string - * - * @param string $string - * - * @throws RuntimeException - * - * @return ImageInterface - */ - public function load($string); - - /** - * Loads an image from a resource $resource - * - * @param resource $resource - * - * @throws RuntimeException - * - * @return ImageInterface - */ - public function read($resource); - - /** - * Constructs a font with specified $file, $size and $color - * - * The font size is to be specified in points (e.g. 10pt means 10) - * - * @param string $file - * @param integer $size - * @param ColorInterface $color - * - * @return FontInterface - */ - public function font($file, $size, ColorInterface $color); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/LayersInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/LayersInterface.php deleted file mode 100755 index 44df4236..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/LayersInterface.php +++ /dev/null @@ -1,107 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image; - -use Imagine\Exception\RuntimeException; -use Imagine\Exception\InvalidArgumentException; -use Imagine\Exception\OutOfBoundsException; - -/** - * The layers interface - */ -interface LayersInterface extends \Iterator, \Countable, \ArrayAccess -{ - /** - * Merge layers into the original objects - * - * @throws RuntimeException - */ - public function merge(); - - /** - * Animates layers - * - * @param string $format The output output format - * @param integer $delay The delay in milliseconds between two frames - * @param integer $loops The number of loops, 0 means infinite - * - * @return LayersInterface - * - * @throws InvalidArgumentException In case an invalid argument is provided - * @throws RuntimeException In case the driver fails to animate - */ - public function animate($format, $delay, $loops); - - /** - * Coalesce layers. Each layer in the sequence is the same size as the first and composited with the next layer in - * the sequence. - */ - public function coalesce(); - - /** - * Adds an image at the end of the layers stack - * - * @param ImageInterface $image - * - * @return LayersInterface - * - * @throws RuntimeException - */ - public function add(ImageInterface $image); - - /** - * Set an image at offset - * - * @param integer $offset - * @param ImageInterface $image - * - * @return LayersInterface - * - * @throws RuntimeException - * @throws InvalidArgumentException - * @throws OutOfBoundsException - */ - public function set($offset, ImageInterface $image); - - /** - * Removes the image at offset - * - * @param integer $offset - * - * @return LayersInterface - * - * @throws RuntimeException - * @throws InvalidArgumentException - */ - public function remove($offset); - - /** - * Returns the image at offset - * - * @param integer $offset - * - * @return ImageInterface - * - * @throws RuntimeException - * @throws InvalidArgumentException - */ - public function get($offset); - - /** - * Returns true if a layer at offset is preset - * - * @param integer $offset - * - * @return Boolean - */ - public function has($offset); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ManipulatorInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ManipulatorInterface.php deleted file mode 100755 index 392b9082..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ManipulatorInterface.php +++ /dev/null @@ -1,181 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image; - -use Imagine\Exception\InvalidArgumentException; -use Imagine\Exception\OutOfBoundsException; -use Imagine\Exception\RuntimeException; -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Image\Fill\FillInterface; - -/** - * The manipulator interface - */ -interface ManipulatorInterface -{ - const THUMBNAIL_INSET = 'inset'; - const THUMBNAIL_OUTBOUND = 'outbound'; - - /** - * Copies current source image into a new ImageInterface instance - * - * @throws RuntimeException - * - * @return static - */ - public function copy(); - - /** - * Crops a specified box out of the source image (modifies the source image) - * Returns cropped self - * - * @param PointInterface $start - * @param BoxInterface $size - * - * @throws OutOfBoundsException - * @throws RuntimeException - * - * @return static - */ - public function crop(PointInterface $start, BoxInterface $size); - - /** - * Resizes current image and returns self - * - * @param BoxInterface $size - * @param string $filter - * - * @throws RuntimeException - * - * @return static - */ - public function resize(BoxInterface $size, $filter = ImageInterface::FILTER_UNDEFINED); - - /** - * Rotates an image at the given angle. - * Optional $background can be used to specify the fill color of the empty - * area of rotated image. - * - * @param integer $angle - * @param ColorInterface $background - * - * @throws RuntimeException - * - * @return static - */ - public function rotate($angle, ColorInterface $background = null); - - /** - * Pastes an image into a parent image - * Throws exceptions if image exceeds parent image borders or if paste - * operation fails - * - * Returns source image - * - * @param ImageInterface $image - * @param PointInterface $start - * - * @throws InvalidArgumentException - * @throws OutOfBoundsException - * @throws RuntimeException - * - * @return static - */ - public function paste(ImageInterface $image, PointInterface $start); - - /** - * Saves the image at a specified path, the target file extension is used - * to determine file format, only jpg, jpeg, gif, png, wbmp and xbm are - * supported - * - * @param string $path - * @param array $options - * - * @throws RuntimeException - * - * @return static - */ - public function save($path = null, array $options = array()); - - /** - * Outputs the image content - * - * @param string $format - * @param array $options - * - * @throws RuntimeException - * - * @return static - */ - public function show($format, array $options = array()); - - /** - * Flips current image using horizontal axis - * - * @throws RuntimeException - * - * @return static - */ - public function flipHorizontally(); - - /** - * Flips current image using vertical axis - * - * @throws RuntimeException - * - * @return static - */ - public function flipVertically(); - - /** - * Remove all profiles and comments - * - * @throws RuntimeException - * - * @return static - */ - public function strip(); - - /** - * Generates a thumbnail from a current image - * Returns it as a new image, doesn't modify the current image - * - * @param BoxInterface $size - * @param string $mode - * @param string $filter The filter to use for resizing, one of ImageInterface::FILTER_* - * - * @throws RuntimeException - * - * @return static - */ - public function thumbnail(BoxInterface $size, $mode = self::THUMBNAIL_INSET, $filter = ImageInterface::FILTER_UNDEFINED); - - /** - * Applies a given mask to current image's alpha channel - * - * @param ImageInterface $mask - * - * @return static - */ - public function applyMask(ImageInterface $mask); - - /** - * Fills image with provided filling, by replacing each pixel's color in - * the current image with corresponding color from FillInterface, and - * returns modified image - * - * @param FillInterface $fill - * - * @return static - */ - public function fill(FillInterface $fill); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/AbstractMetadataReader.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/AbstractMetadataReader.php deleted file mode 100755 index a709655b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/AbstractMetadataReader.php +++ /dev/null @@ -1,101 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image\Metadata; - -use Imagine\Exception\InvalidArgumentException; - -abstract class AbstractMetadataReader implements MetadataReaderInterface -{ - /** - * {@inheritdoc} - */ - public function readFile($file) - { - if (stream_is_local($file)) { - if (!is_file($file)) { - throw new InvalidArgumentException(sprintf('File %s does not exist.', $file)); - } - - return new MetadataBag(array_merge(array('filepath' => realpath($file), 'uri' => $file), $this->extractFromFile($file))); - } - - return new MetadataBag(array_merge(array('uri' => $file), $this->extractFromFile($file))); - } - - /** - * {@inheritdoc} - */ - public function readData($data) - { - return new MetadataBag($this->extractFromData($data)); - } - - /** - * {@inheritdoc} - */ - public function readStream($resource) - { - if (!is_resource($resource)) { - throw new InvalidArgumentException('Invalid resource provided.'); - } - - return new MetadataBag(array_merge($this->getStreamMetadata($resource), $this->extractFromStream($resource))); - } - - /** - * Gets the URI from a stream resource - * - * @param resource $resource - * - * @return string|null The URI f ava - */ - private function getStreamMetadata($resource) - { - $metadata = array(); - - if (false !== $data = @stream_get_meta_data($resource)) { - $metadata['uri'] = $data['uri']; - if (stream_is_local($resource)) { - $metadata['filepath'] = realpath($data['uri']); - } - } - - return $metadata; - } - - /** - * Extracts metadata from a file - * - * @param $file - * - * @return array An associative array of metadata - */ - abstract protected function extractFromFile($file); - - /** - * Extracts metadata from raw data - * - * @param $data - * - * @return array An associative array of metadata - */ - abstract protected function extractFromData($data); - - /** - * Extracts metadata from a stream - * - * @param $resource - * - * @return array An associative array of metadata - */ - abstract protected function extractFromStream($resource); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/DefaultMetadataReader.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/DefaultMetadataReader.php deleted file mode 100755 index 349366e0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/DefaultMetadataReader.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image\Metadata; - -/** - * Default metadata reader - */ -class DefaultMetadataReader extends AbstractMetadataReader -{ - /** - * {@inheritdoc} - */ - protected function extractFromFile($file) - { - return array(); - } - - /** - * {@inheritdoc} - */ - protected function extractFromData($data) - { - return array(); - } - - /** - * {@inheritdoc} - */ - protected function extractFromStream($resource) - { - return array(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/ExifMetadataReader.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/ExifMetadataReader.php deleted file mode 100755 index dd8e7d09..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/ExifMetadataReader.php +++ /dev/null @@ -1,114 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image\Metadata; - -use Imagine\Exception\InvalidArgumentException; -use Imagine\Exception\NotSupportedException; - -/** - * Metadata driven by Exif information - */ -class ExifMetadataReader extends AbstractMetadataReader -{ - public function __construct() - { - if (!self::isSupported()) { - throw new NotSupportedException('PHP exif extension is required to use the ExifMetadataReader'); - } - } - - public static function isSupported() - { - return function_exists('exif_read_data'); - } - - /** - * {@inheritdoc} - */ - protected function extractFromFile($file) - { - if (false === $data = @file_get_contents($file)) { - throw new InvalidArgumentException(sprintf('File %s is not readable.', $file)); - } - - return $this->doReadData($data); - } - - /** - * {@inheritdoc} - */ - protected function extractFromData($data) - { - return $this->doReadData($data); - } - - /** - * {@inheritdoc} - */ - protected function extractFromStream($resource) - { - if (0 < ftell($resource)) { - $metadata = stream_get_meta_data($resource); - if ($metadata['seekable']) { - rewind($resource); - } - } - - return $this->doReadData(stream_get_contents($resource)); - } - - /** - * Extracts metadata from raw data, merges with existing metadata - * - * @param string $data - * - * @return MetadataBag - */ - private function doReadData($data) - { - if (substr($data, 0, 2) === 'II') { - $mime = 'image/tiff'; - } else { - $mime = 'image/jpeg'; - } - - return $this->extract('data://' . $mime . ';base64,' . base64_encode($data)); - } - - /** - * Performs the exif data extraction given a path or data-URI representation. - * - * @param string $path The path to the file or the data-URI representation. - * - * @return MetadataBag - */ - private function extract($path) - { - if (false === $exifData = @exif_read_data($path, null, true, false)) { - return array(); - } - - $metadata = array(); - $sources = array('EXIF' => 'exif', 'IFD0' => 'ifd0'); - - foreach ($sources as $name => $prefix) { - if (!isset($exifData[$name])) { - continue; - } - foreach ($exifData[$name] as $prop => $value) { - $metadata[$prefix.'.'.$prop] = $value; - } - } - - return $metadata; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/MetadataBag.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/MetadataBag.php deleted file mode 100755 index b7e917a3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/MetadataBag.php +++ /dev/null @@ -1,97 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image\Metadata; - -/** - * An interface for Image Metadata - */ -class MetadataBag implements \ArrayAccess, \IteratorAggregate, \Countable -{ - /** @var array */ - private $data; - - public function __construct(array $data = array()) - { - $this->data = $data; - } - - /** - * Returns the metadata key, default value if it does not exist - * - * @param string $key - * @param mixed|null $default - * - * @return mixed - */ - public function get($key, $default = null) - { - return array_key_exists($key, $this->data) ? $this->data[$key] : $default; - } - - /** - * {@inheritdoc} - */ - public function count() - { - return count($this->data); - } - - /** - * {@inheritdoc} - */ - public function getIterator() - { - return new \ArrayIterator($this->data); - } - - /** - * {@inheritdoc} - */ - public function offsetExists($offset) - { - return array_key_exists($offset, $this->data); - } - - /** - * {@inheritdoc} - */ - public function offsetSet($offset, $value) - { - $this->data[$offset] = $value; - } - - /** - * {@inheritdoc} - */ - public function offsetUnset($offset) - { - unset($this->data[$offset]); - } - - /** - * {@inheritdoc} - */ - public function offsetGet($offset) - { - return $this->get($offset); - } - - /** - * Returns metadata as an array - * - * @return array An associative array - */ - public function toArray() - { - return $this->data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/MetadataReaderInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/MetadataReaderInterface.php deleted file mode 100755 index 62fcc881..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Metadata/MetadataReaderInterface.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image\Metadata; - -use Imagine\Exception\InvalidArgumentException; - -interface MetadataReaderInterface -{ - /** - * Reads metadata from a file. - * - * @param $file The path to the file where to read metadata. - * - * @throws InvalidArgumentException In case the file does not exist. - * - * @return MetadataBag - */ - public function readFile($file); - - /** - * Reads metadata from a binary string. - * - * @param $data The binary string to read. - * - * @return MetadataBag - */ - public function readData($data); - - /** - * Reads metadata from a stream. - * - * @param $resource The stream to read. - * - * @throws InvalidArgumentException In case the resource is not valid. - * - * @return MetadataBag - */ - public function readStream($resource); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/CMYK.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/CMYK.php deleted file mode 100755 index 2beecf28..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/CMYK.php +++ /dev/null @@ -1,118 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image\Palette; - -use Imagine\Image\Palette\Color\CMYK as CMYKColor; -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Exception\RuntimeException; -use Imagine\Exception\InvalidArgumentException; -use Imagine\Image\Profile; -use Imagine\Image\ProfileInterface; - -class CMYK implements PaletteInterface -{ - private $parser; - private $profile; - private static $colors = array(); - - public function __construct() - { - $this->parser = new ColorParser(); - } - - /** - * {@inheritdoc} - */ - public function name() - { - return PaletteInterface::PALETTE_CMYK; - } - - /** - * {@inheritdoc} - */ - public function pixelDefinition() - { - return array( - ColorInterface::COLOR_CYAN, - ColorInterface::COLOR_MAGENTA, - ColorInterface::COLOR_YELLOW, - ColorInterface::COLOR_KEYLINE, - ); - } - - /** - * {@inheritdoc} - */ - public function supportsAlpha() - { - return false; - } - - /** - * {@inheritdoc} - */ - public function color($color, $alpha = null) - { - if (null !== $alpha) { - throw new InvalidArgumentException('CMYK palette does not support alpha'); - } - - $color = $this->parser->parseToCMYK($color); - $index = sprintf('cmyk(%d, %d, %d, %d)', $color[0], $color[1], $color[2], $color[3]); - - if (false === array_key_exists($index, self::$colors)) { - self::$colors[$index] = new CMYKColor($this, $color); - } - - return self::$colors[$index]; - } - - /** - * {@inheritdoc} - */ - public function blend(ColorInterface $color1, ColorInterface $color2, $amount) - { - if (!$color1 instanceof CMYKColor || ! $color2 instanceof CMYKColor) { - throw new RuntimeException('CMYK palette can only blend CMYK colors'); - } - - return $this->color(array( - min(100, $color1->getCyan() + $color2->getCyan() * $amount), - min(100, $color1->getMagenta() + $color2->getMagenta() * $amount), - min(100, $color1->getYellow() + $color2->getYellow() * $amount), - min(100, $color1->getKeyline() + $color2->getKeyline() * $amount), - )); - } - - /** - * {@inheritdoc} - */ - public function useProfile(ProfileInterface $profile) - { - $this->profile = $profile; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function profile() - { - if (!$this->profile) { - $this->profile = Profile::fromPath(__DIR__ . '/../../resources/Adobe/CMYK/USWebUncoated.icc'); - } - - return $this->profile; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/CMYK.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/CMYK.php deleted file mode 100755 index 31654335..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/CMYK.php +++ /dev/null @@ -1,219 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image\Palette\Color; - -use Imagine\Image\Palette\CMYK as CMYKPalette; -use Imagine\Exception\RuntimeException; -use Imagine\Exception\InvalidArgumentException; - -final class CMYK implements ColorInterface -{ - /** - * @var integer - */ - private $c; - - /** - * @var integer - */ - private $m; - - /** - * @var integer - */ - private $y; - - /** - * @var integer - */ - private $k; - - /** - * - * @var CMYK - */ - private $palette; - - public function __construct(CMYKPalette $palette, array $color) - { - $this->palette = $palette; - $this->setColor($color); - } - - /** - * {@inheritdoc} - */ - public function getValue($component) - { - switch ($component) { - case ColorInterface::COLOR_CYAN: - return $this->getCyan(); - case ColorInterface::COLOR_MAGENTA: - return $this->getMagenta(); - case ColorInterface::COLOR_YELLOW: - return $this->getYellow(); - case ColorInterface::COLOR_KEYLINE: - return $this->getKeyline(); - default: - throw new InvalidArgumentException(sprintf('Color component %s is not valid', $component)); - } - } - - /** - * Returns Cyan value of the color - * - * @return integer - */ - public function getCyan() - { - return $this->c; - } - - /** - * Returns Magenta value of the color - * - * @return integer - */ - public function getMagenta() - { - return $this->m; - } - - /** - * Returns Yellow value of the color - * - * @return integer - */ - public function getYellow() - { - return $this->y; - } - - /** - * Returns Key value of the color - * - * @return integer - */ - public function getKeyline() - { - return $this->k; - } - - /** - * {@inheritdoc} - */ - public function getPalette() - { - return $this->palette; - } - - /** - * {@inheritdoc} - */ - public function getAlpha() - { - return null; - } - - /** - * {@inheritdoc} - */ - public function dissolve($alpha) - { - throw new RuntimeException('CMYK does not support dissolution'); - } - - /** - * {@inheritdoc} - */ - public function lighten($shade) - { - return $this->palette->color( - array( - $this->c, - $this->m, - $this->y, - max(0, $this->k - $shade), - ) - ); - } - - /** - * {@inheritdoc} - */ - public function darken($shade) - { - return $this->palette->color( - array( - $this->c, - $this->m, - $this->y, - min(100, $this->k + $shade), - ) - ); - } - - /** - * {@inheritdoc} - */ - public function grayscale() - { - $color = array( - $this->c * (1 - $this->k / 100) + $this->k, - $this->m * (1 - $this->k / 100) + $this->k, - $this->y * (1 - $this->k / 100) + $this->k, - ); - - $gray = min(100, round(0.299 * $color[0] + 0.587 * $color[1] + 0.114 * $color[2])); - - return $this->palette->color(array($gray, $gray, $gray, $this->k)); - } - - /** - * {@inheritdoc} - */ - public function isOpaque() - { - return true; - } - - /** - * Returns hex representation of the color - * - * @return string - */ - public function __toString() - { - return sprintf('cmyk(%d%%, %d%%, %d%%, %d%%)', $this->c, $this->m, $this->y, $this->k); - } - - /** - * Internal, Performs checks for color validity (an of array(C, M, Y, K)) - * - * @param array $color - * - * @throws InvalidArgumentException - */ - private function setColor(array $color) - { - if (count($color) !== 4) { - throw new InvalidArgumentException('Color argument must look like array(C, M, Y, K), where C, M, Y, K are the integer values between 0 and 255 for cyan, magenta, yellow and black color indexes accordingly'); - } - - $colors = array_values($color); - array_walk($colors, function ($color) { - return max(0, min(100, $color)); - }); - - list($this->c, $this->m, $this->y, $this->k) = $colors; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/ColorInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/ColorInterface.php deleted file mode 100755 index 8784c4ed..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/ColorInterface.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image\Palette\Color; - -use Imagine\Image\Palette\PaletteInterface; - -interface ColorInterface -{ - const COLOR_RED = 'red'; - const COLOR_GREEN = 'green'; - const COLOR_BLUE = 'blue'; - - const COLOR_CYAN = 'cyan'; - const COLOR_MAGENTA = 'magenta'; - const COLOR_YELLOW = 'yellow'; - const COLOR_KEYLINE = 'keyline'; - - const COLOR_GRAY = 'gray'; - - /** - * Return the value of one of the component. - * - * @param string $component One of the ColorInterface::COLOR_* component - * - * @return Integer - */ - public function getValue($component); - - /** - * Returns percentage of transparency of the color - * - * @return integer - */ - public function getAlpha(); - - /** - * Returns the palette attached to the current color - * - * @return PaletteInterface - */ - public function getPalette(); - - /** - * Returns a copy of current color, incrementing the alpha channel by the - * given amount - * - * @param integer $alpha - * - * @return ColorInterface - */ - public function dissolve($alpha); - - /** - * Returns a copy of the current color, lightened by the specified number - * of shades - * - * @param integer $shade - * - * @return ColorInterface - */ - public function lighten($shade); - - /** - * Returns a copy of the current color, darkened by the specified number of - * shades - * - * @param integer $shade - * - * @return ColorInterface - */ - public function darken($shade); - - /** - * Returns a gray related to the current color - * - * @return ColorInterface - */ - public function grayscale(); - - /** - * Checks if the current color is opaque - * - * @return Boolean - */ - public function isOpaque(); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/Gray.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/Gray.php deleted file mode 100755 index c8096450..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/Gray.php +++ /dev/null @@ -1,164 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image\Palette\Color; - -use Imagine\Image\Palette\Grayscale; -use Imagine\Exception\InvalidArgumentException; - -final class Gray implements ColorInterface -{ - /** - * @var integer - */ - private $gray; - - /** - * @var integer - */ - private $alpha; - - /** - * - * @var Grayscale - */ - private $palette; - - public function __construct(Grayscale $palette, array $color, $alpha) - { - $this->palette = $palette; - $this->setColor($color); - $this->setAlpha($alpha); - } - - /** - * {@inheritdoc} - */ - public function getValue($component) - { - switch ($component) { - case ColorInterface::COLOR_GRAY: - return $this->getGray(); - default: - throw new InvalidArgumentException(sprintf('Color component %s is not valid', $component)); - } - } - - /** - * Returns Gray value of the color - * - * @return integer - */ - public function getGray() - { - return $this->gray; - } - - /** - * {@inheritdoc} - */ - public function getPalette() - { - return $this->palette; - } - - /** - * {@inheritdoc} - */ - public function getAlpha() - { - return $this->alpha; - } - - /** - * {@inheritdoc} - */ - public function dissolve($alpha) - { - return $this->palette->color( - array($this->gray), $this->alpha + $alpha - ); - } - - /** - * {@inheritdoc} - */ - public function lighten($shade) - { - return $this->palette->color(array(min(255, $this->gray + $shade)), $this->alpha); - } - - /** - * {@inheritdoc} - */ - public function darken($shade) - { - return $this->palette->color(array(max(0, $this->gray - $shade)), $this->alpha); - } - - /** - * {@inheritdoc} - */ - public function grayscale() - { - return $this; - } - - /** - * {@inheritdoc} - */ - public function isOpaque() - { - return 100 === $this->alpha; - } - - /** - * Returns hex representation of the color - * - * @return string - */ - public function __toString() - { - return sprintf('#%02x%02x%02x', $this->gray, $this->gray, $this->gray); - } - - /** - * Performs checks for validity of given alpha value and sets it - * - * @param integer $alpha - * - * @throws InvalidArgumentException - */ - private function setAlpha($alpha) - { - if (!is_int($alpha) || $alpha < 0 || $alpha > 100) { - throw new InvalidArgumentException(sprintf('Alpha must be an integer between 0 and 100, %s given', $alpha)); - } - - $this->alpha = $alpha; - } - - /** - * Performs checks for color validity (array of array(gray)) - * - * @param array $color - * - * @throws InvalidArgumentException - */ - private function setColor(array $color) - { - if (count($color) !== 1) { - throw new InvalidArgumentException('Color argument must look like array(gray), where gray is the integer value between 0 and 255 for the grayscale'); - } - - list($this->gray) = array_values($color); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/RGB.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/RGB.php deleted file mode 100755 index a0b4f0d0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Color/RGB.php +++ /dev/null @@ -1,214 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image\Palette\Color; - -use Imagine\Image\Palette\RGB as RGBPalette; -use Imagine\Exception\InvalidArgumentException; - -final class RGB implements ColorInterface -{ - /** - * @var integer - */ - private $r; - - /** - * @var integer - */ - private $g; - - /** - * @var integer - */ - private $b; - - /** - * @var integer - */ - private $alpha; - - /** - * - * @var RGBPalette - */ - private $palette; - - public function __construct(RGBPalette $palette, array $color, $alpha) - { - $this->palette = $palette; - $this->setColor($color); - $this->setAlpha($alpha); - } - - /** - * {@inheritdoc} - */ - public function getValue($component) - { - switch ($component) { - case ColorInterface::COLOR_RED: - return $this->getRed(); - case ColorInterface::COLOR_GREEN: - return $this->getGreen(); - case ColorInterface::COLOR_BLUE: - return $this->getBlue(); - default: - throw new InvalidArgumentException(sprintf('Color component %s is not valid', $component)); - } - } - - /** - * Returns RED value of the color - * - * @return integer - */ - public function getRed() - { - return $this->r; - } - - /** - * Returns GREEN value of the color - * - * @return integer - */ - public function getGreen() - { - return $this->g; - } - - /** - * Returns BLUE value of the color - * - * @return integer - */ - public function getBlue() - { - return $this->b; - } - - /** - * {@inheritdoc} - */ - public function getPalette() - { - return $this->palette; - } - - /** - * {@inheritdoc} - */ - public function getAlpha() - { - return $this->alpha; - } - - /** - * {@inheritdoc} - */ - public function dissolve($alpha) - { - return $this->palette->color(array($this->r, $this->g, $this->b), $this->alpha + $alpha); - } - - /** - * {@inheritdoc} - */ - public function lighten($shade) - { - return $this->palette->color( - array( - min(255, $this->r + $shade), - min(255, $this->g + $shade), - min(255, $this->b + $shade), - ), $this->alpha - ); - } - - /** - * {@inheritdoc} - */ - public function darken($shade) - { - return $this->palette->color( - array( - max(0, $this->r - $shade), - max(0, $this->g - $shade), - max(0, $this->b - $shade), - ), $this->alpha - ); - } - - /** - * {@inheritdoc} - */ - public function grayscale() - { - $gray = min(255, round(0.299 * $this->getRed() + 0.114 * $this->getBlue() + 0.587 * $this->getGreen())); - - return $this->palette->color(array($gray, $gray, $gray), $this->alpha); - } - - /** - * {@inheritdoc} - */ - public function isOpaque() - { - return 100 === $this->alpha; - } - - /** - * Returns hex representation of the color - * - * @return string - */ - public function __toString() - { - return sprintf('#%02x%02x%02x', $this->r, $this->g, $this->b); - } - - /** - * Internal - * - * Performs checks for validity of given alpha value and sets it - * - * @param integer $alpha - * - * @throws InvalidArgumentException - */ - private function setAlpha($alpha) - { - if (!is_int($alpha) || $alpha < 0 || $alpha > 100) { - throw new InvalidArgumentException(sprintf('Alpha must be an integer between 0 and 100, %s given', $alpha)); - } - - $this->alpha = $alpha; - } - - /** - * Internal - * - * Performs checks for color validity (array of array(R, G, B)) - * - * @param array $color - * - * @throws InvalidArgumentException - */ - private function setColor(array $color) - { - if (count($color) !== 3) { - throw new InvalidArgumentException('Color argument must look like array(R, G, B), where R, G, B are the integer values between 0 and 255 for red, green and blue color indexes accordingly'); - } - - list($this->r, $this->g, $this->b) = array_values($color); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/ColorParser.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/ColorParser.php deleted file mode 100755 index 35cf4e95..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/ColorParser.php +++ /dev/null @@ -1,153 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image\Palette; - -use Imagine\Exception\InvalidArgumentException; - -class ColorParser -{ - /** - * Parses a color to a RGB tuple - * - * @param string|array|integer $color - * - * @return array - * - * @throws InvalidArgumentException - */ - public function parseToRGB($color) - { - $color = $this->parse($color); - - if (4 === count($color)) { - $color = array( - 255 * (1 - $color[0] / 100) * (1 - $color[3] / 100), - 255 * (1 - $color[1] / 100) * (1 - $color[3] / 100), - 255 * (1 - $color[2] / 100) * (1 - $color[3] / 100), - ); - } - - return $color; - } - - /** - * Parses a color to a CMYK tuple - * - * @param string|array|integer $color - * - * @return array - * - * @throws InvalidArgumentException - */ - public function parseToCMYK($color) - { - $color = $this->parse($color); - - if (3 === count($color)) { - $r = $color[0] / 255; - $g = $color[1] / 255; - $b = $color[2] / 255; - - $k = 1 - max($r, $g, $b); - - $color = array( - 1 === $k ? 0 : round((1 - $r - $k) / (1- $k) * 100), - 1 === $k ? 0 : round((1 - $g - $k) / (1- $k) * 100), - 1 === $k ? 0 : round((1 - $b - $k) / (1- $k) * 100), - round($k * 100) - ); - } - - return $color; - } - - /** - * Parses a color to a grayscale value - * - * @param string|array|integer $color - * - * @return array - * - * @throws InvalidArgumentException - */ - public function parseToGrayscale($color) - { - if (is_array($color) && 1 === count($color)) { - return array_values($color); - } - - $color = array_unique($this->parse($color)); - - if (1 !== count($color)) { - throw new InvalidArgumentException('The provided color has different values of red, green and blue components. Grayscale colors must have the same values for these.'); - } - - return $color; - } - - /** - * Parses a color - * - * @param string|array|integer $color - * - * @return array - * - * @throws InvalidArgumentException - */ - private function parse($color) - { - if (!is_string($color) && !is_array($color) && !is_int($color)) { - throw new InvalidArgumentException(sprintf('Color must be specified as a hexadecimal string, array or integer, %s given', gettype($color))); - } - - if (is_array($color)) { - if (3 === count($color) || 4 === count($color)) { - return array_values($color); - } - throw new InvalidArgumentException('Color argument if array, must look like array(R, G, B), or array(C, M, Y, K) where R, G, B are the integer values between 0 and 255 for red, green and blue or cyan, magenta, yellow and black color indexes accordingly'); - } - - if (is_string($color)) { - if (0 === strpos($color, 'cmyk(')) { - $substrColor = substr($color, 5, strlen($color) - 6); - - $components = array_map(function ($component) { - return round(trim($component, ' %')); - }, explode(',', $substrColor)); - - if (count($components) !== 4) { - throw new InvalidArgumentException(sprintf('Unable to parse color %s', $color)); - } - - return $components; - } else { - $color = ltrim($color, '#'); - - if (strlen($color) !== 3 && strlen($color) !== 6) { - throw new InvalidArgumentException(sprintf('Color must be a hex value in regular (6 characters) or short (3 characters) notation, "%s" given', $color)); - } - - if (strlen($color) === 3) { - $color = $color[0] . $color[0] . $color[1] . $color[1] . $color[2] . $color[2]; - } - - $color = array_map('hexdec', str_split($color, 2)); - } - } - - if (is_int($color)) { - $color = array(255 & ($color >> 16), 255 & ($color >> 8), 255 & $color); - } - - return $color; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Grayscale.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Grayscale.php deleted file mode 100755 index 088b7909..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/Grayscale.php +++ /dev/null @@ -1,123 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image\Palette; - -use Imagine\Image\Palette\Color\Gray as GrayColor; -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Image\ProfileInterface; -use Imagine\Image\Profile; -use Imagine\Exception\RuntimeException; - -class Grayscale implements PaletteInterface -{ - /** - * @var ColorParser - */ - private $parser; - - /** - * @var ProfileInterface - */ - private $profile; - - /** - * @var array - */ - protected static $colors = array(); - - public function __construct() - { - $this->parser = new ColorParser(); - } - - /** - * {@inheritdoc} - */ - public function name() - { - return PaletteInterface::PALETTE_GRAYSCALE; - } - - /** - * {@inheritdoc} - */ - public function pixelDefinition() - { - return array(ColorInterface::COLOR_GRAY); - } - - /** - * {@inheritdoc} - */ - public function supportsAlpha() - { - return true; - } - - /** - * {@inheritdoc} - */ - public function useProfile(ProfileInterface $profile) - { - $this->profile = $profile; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function profile() - { - if (!$this->profile) { - $this->profile = Profile::fromPath(__DIR__ . '/../../resources/colormanagement.org/ISOcoated_v2_grey1c_bas.ICC'); - } - - return $this->profile; - } - - /** - * {@inheritdoc} - */ - public function color($color, $alpha = null) - { - if (null === $alpha) { - $alpha = 0; - } - - $color = $this->parser->parseToGrayscale($color); - $index = sprintf('#%02x%02x%02x-%d', $color[0], $color[0], $color[0], $alpha); - - if (false === array_key_exists($index, static::$colors)) { - static::$colors[$index] = new GrayColor($this, $color, $alpha); - } - - return static::$colors[$index]; - } - - /** - * {@inheritdoc} - */ - public function blend(ColorInterface $color1, ColorInterface $color2, $amount) - { - if (!$color1 instanceof GrayColor || ! $color2 instanceof GrayColor) { - throw new RuntimeException('Grayscale palette can only blend Grayscale colors'); - } - - return $this->color( - array( - (int) min(255, min($color1->getGray(), $color2->getGray()) + round(abs($color2->getGray() - $color1->getGray()) * $amount)), - ), - (int) min(100, min($color1->getAlpha(), $color2->getAlpha()) + round(abs($color2->getAlpha() - $color1->getAlpha()) * $amount)) - ); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/PaletteInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/PaletteInterface.php deleted file mode 100755 index 855c244c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/PaletteInterface.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image\Palette; - -use Imagine\Image\ProfileInterface; -use Imagine\Image\Palette\Color\ColorInterface; - -interface PaletteInterface -{ - const PALETTE_GRAYSCALE = 'gray'; - const PALETTE_RGB = 'rgb'; - const PALETTE_CMYK = 'cmyk'; - - /** - * Returns a color given some values - * - * @param string|array|integer $color A color - * @param integer|null $alpha Set alpha to null to disable it - * - * @return ColorInterface - * - * @throws InvalidArgumentException In case you pass an alpha value to a - * Palette that does not support alpha - */ - public function color($color, $alpha = null); - - /** - * Blend two colors given an amount - * - * @param ColorInterface $color1 - * @param ColorInterface $color2 - * @param float $amount The amount of color2 in color1 - * - * @return ColorInterface - */ - public function blend(ColorInterface $color1, ColorInterface $color2, $amount); - - /** - * Attachs an ICC profile to this Palette. - * - * (A default profile is provided by default) - * - * @param ProfileInterface $profile - * - * @return PaletteInterface - */ - public function useProfile(ProfileInterface $profile); - - /** - * Returns the ICC profile attached to this Palette. - * - * @return ProfileInterface - */ - public function profile(); - - /** - * Returns the name of this Palette, one of PaletteInterface::PALETTE_* - * constants - * - * @return String - */ - public function name(); - - /** - * Returns an array containing ColorInterface::COLOR_* constants that - * define the structure of colors for a pixel. - * - * @return array - */ - public function pixelDefinition(); - - /** - * Tells if alpha channel is supported in this palette - * - * @return Boolean - */ - public function supportsAlpha(); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/RGB.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/RGB.php deleted file mode 100755 index 0462ca4d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Palette/RGB.php +++ /dev/null @@ -1,129 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image\Palette; - -use Imagine\Image\Palette\Color\RGB as RGBColor; -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Image\ProfileInterface; -use Imagine\Image\Profile; -use Imagine\Exception\RuntimeException; - -class RGB implements PaletteInterface -{ - /** - * @var ColorParser - */ - private $parser; - - /** - * @var ProfileInterface - */ - private $profile; - - /** - * @var array - */ - protected static $colors = array(); - - public function __construct() - { - $this->parser = new ColorParser(); - } - - /** - * {@inheritdoc} - */ - public function name() - { - return PaletteInterface::PALETTE_RGB; - } - - /** - * {@inheritdoc} - */ - public function pixelDefinition() - { - return array( - ColorInterface::COLOR_RED, - ColorInterface::COLOR_GREEN, - ColorInterface::COLOR_BLUE, - ); - } - - /** - * {@inheritdoc} - */ - public function supportsAlpha() - { - return true; - } - - /** - * {@inheritdoc} - */ - public function useProfile(ProfileInterface $profile) - { - $this->profile = $profile; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function profile() - { - if (!$this->profile) { - $this->profile = Profile::fromPath(__DIR__ . '/../../resources/color.org/sRGB_IEC61966-2-1_black_scaled.icc'); - } - - return $this->profile; - } - - /** - * {@inheritdoc} - */ - public function color($color, $alpha = null) - { - if (null === $alpha) { - $alpha = 100; - } - - $color = $this->parser->parseToRGB($color); - $index = sprintf('#%02x%02x%02x-%d', $color[0], $color[1], $color[2], $alpha); - - if (false === array_key_exists($index, static::$colors)) { - static::$colors[$index] = new RGBColor($this, $color, $alpha); - } - - return static::$colors[$index]; - } - - /** - * {@inheritdoc} - */ - public function blend(ColorInterface $color1, ColorInterface $color2, $amount) - { - if (!$color1 instanceof RGBColor || ! $color2 instanceof RGBColor) { - throw new RuntimeException('RGB palette can only blend RGB colors'); - } - - return $this->color( - array( - (int) min(255, min($color1->getRed(), $color2->getRed()) + round(abs($color2->getRed() - $color1->getRed()) * $amount)), - (int) min(255, min($color1->getGreen(), $color2->getGreen()) + round(abs($color2->getGreen() - $color1->getGreen()) * $amount)), - (int) min(255, min($color1->getBlue(), $color2->getBlue()) + round(abs($color2->getBlue() - $color1->getBlue()) * $amount)), - ), - (int) min(100, min($color1->getAlpha(), $color2->getAlpha()) + round(abs($color2->getAlpha() - $color1->getAlpha()) * $amount)) - ); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Point.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Point.php deleted file mode 100755 index abfc7c3a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Point.php +++ /dev/null @@ -1,88 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image; - -use Imagine\Exception\InvalidArgumentException; - -/** - * The point class - */ -final class Point implements PointInterface -{ - /** - * @var integer - */ - private $x; - - /** - * @var integer - */ - private $y; - - /** - * Constructs a point of coordinates - * - * @param integer $x - * @param integer $y - * - * @throws InvalidArgumentException - */ - public function __construct($x, $y) - { - if ($x < 0 || $y < 0) { - throw new InvalidArgumentException(sprintf('A coordinate cannot be positioned outside of a bounding box (x: %s, y: %s given)', $x, $y)); - } - - $this->x = $x; - $this->y = $y; - } - - /** - * {@inheritdoc} - */ - public function getX() - { - return $this->x; - } - - /** - * {@inheritdoc} - */ - public function getY() - { - return $this->y; - } - - /** - * {@inheritdoc} - */ - public function in(BoxInterface $box) - { - return $this->x < $box->getWidth() && $this->y < $box->getHeight(); - } - - /** - * {@inheritdoc} - */ - public function move($amount) - { - return new Point($this->x + $amount, $this->y + $amount); - } - - /** - * {@inheritdoc} - */ - public function __toString() - { - return sprintf('(%d, %d)', $this->x, $this->y); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Point/Center.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Point/Center.php deleted file mode 100755 index 0e60349e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Point/Center.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image\Point; - -use Imagine\Image\BoxInterface; -use Imagine\Image\Point as OriginalPoint; -use Imagine\Image\PointInterface; - -/** - * Point center - */ -final class Center implements PointInterface -{ - /** - * @var BoxInterface - */ - private $box; - - /** - * Constructs coordinate with size instance, it needs to be relative to - * - * @param BoxInterface $box - */ - public function __construct(BoxInterface $box) - { - $this->box = $box; - } - - /** - * {@inheritdoc} - */ - public function getX() - { - return ceil($this->box->getWidth() / 2); - } - - /** - * {@inheritdoc} - */ - public function getY() - { - return ceil($this->box->getHeight() / 2); - } - - /** - * {@inheritdoc} - */ - public function in(BoxInterface $box) - { - return $this->getX() < $box->getWidth() && $this->getY() < $box->getHeight(); - } - - /** - * {@inheritdoc} - */ - public function move($amount) - { - return new OriginalPoint($this->getX() + $amount, $this->getY() + $amount); - } - - /** - * {@inheritdoc} - */ - public function __toString() - { - return sprintf('(%d, %d)', $this->getX(), $this->getY()); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/PointInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/PointInterface.php deleted file mode 100755 index f35fa80d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/PointInterface.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image; - -/** - * The point interface - */ -interface PointInterface -{ - /** - * Gets points x coordinate - * - * @return integer - */ - public function getX(); - - /** - * Gets points y coordinate - * - * @return integer - */ - public function getY(); - - /** - * Checks if current coordinate is inside a given bo - * - * @param BoxInterface $box - * - * @return Boolean - */ - public function in(BoxInterface $box); - - /** - * Returns another point, moved by a given amount from current coordinates - * - * @param integer $amount - * @return ImageInterface - */ - public function move($amount); - - /** - * Gets a string representation for the current point - * - * @return string - */ - public function __toString(); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Profile.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Profile.php deleted file mode 100755 index fda5415a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/Profile.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image; - -use Imagine\Exception\InvalidArgumentException; - -class Profile implements ProfileInterface -{ - private $data; - private $name; - - public function __construct($name, $data) - { - $this->name = $name; - $this->data = $data; - } - - /** - * {@inheritdoc} - */ - public function name() - { - return $this->name; - } - - /** - * {@inheritdoc} - */ - public function data() - { - return $this->data; - } - - /** - * Creates a profile from a path to a file - * - * @param String $path - * - * @return Profile - * - * @throws InvalidArgumentException In case the provided path is not valid - */ - public static function fromPath($path) - { - if (!file_exists($path) || !is_file($path) || !is_readable($path)) { - throw new InvalidArgumentException(sprintf('Path %s is an invalid profile file or is not readable', $path)); - } - - return new static(basename($path), file_get_contents($path)); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ProfileInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ProfileInterface.php deleted file mode 100755 index b2caa9c9..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Image/ProfileInterface.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Image; - -interface ProfileInterface -{ - /** - * Returns the name of the profile - * - * @return String - */ - public function name(); - - /** - * Returns the profile data - * - * @return String - */ - public function data(); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Drawer.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Drawer.php deleted file mode 100755 index 2f863649..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Drawer.php +++ /dev/null @@ -1,404 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Imagick; - -use Imagine\Draw\DrawerInterface; -use Imagine\Exception\InvalidArgumentException; -use Imagine\Exception\RuntimeException; -use Imagine\Image\AbstractFont; -use Imagine\Image\BoxInterface; -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Image\Point; -use Imagine\Image\PointInterface; - -/** - * Drawer implementation using the Imagick PHP extension - */ -final class Drawer implements DrawerInterface -{ - /** - * @var Imagick - */ - private $imagick; - - /** - * @param \Imagick $imagick - */ - public function __construct(\Imagick $imagick) - { - $this->imagick = $imagick; - } - - /** - * {@inheritdoc} - */ - public function arc(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $thickness = 1) - { - $x = $center->getX(); - $y = $center->getY(); - $width = $size->getWidth(); - $height = $size->getHeight(); - - try { - $pixel = $this->getColor($color); - $arc = new \ImagickDraw(); - - $arc->setStrokeColor($pixel); - $arc->setStrokeWidth(max(1, (int) $thickness)); - $arc->setFillColor('transparent'); - $arc->arc($x - $width / 2, $y - $height / 2, $x + $width / 2, $y + $height / 2, $start, $end); - - $this->imagick->drawImage($arc); - - $pixel->clear(); - $pixel->destroy(); - - $arc->clear(); - $arc->destroy(); - } catch (\ImagickException $e) { - throw new RuntimeException('Draw arc operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function chord(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1) - { - $x = $center->getX(); - $y = $center->getY(); - $width = $size->getWidth(); - $height = $size->getHeight(); - - try { - $pixel = $this->getColor($color); - $chord = new \ImagickDraw(); - - $chord->setStrokeColor($pixel); - $chord->setStrokeWidth(max(1, (int) $thickness)); - - if ($fill) { - $chord->setFillColor($pixel); - } else { - $this->line( - new Point(round($x + $width / 2 * cos(deg2rad($start))), round($y + $height / 2 * sin(deg2rad($start)))), - new Point(round($x + $width / 2 * cos(deg2rad($end))), round($y + $height / 2 * sin(deg2rad($end)))), - $color - ); - - $chord->setFillColor('transparent'); - } - - $chord->arc( - $x - $width / 2, - $y - $height / 2, - $x + $width / 2, - $y + $height / 2, - $start, - $end - ); - - $this->imagick->drawImage($chord); - - $pixel->clear(); - $pixel->destroy(); - - $chord->clear(); - $chord->destroy(); - } catch (\ImagickException $e) { - throw new RuntimeException('Draw chord operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function ellipse(PointInterface $center, BoxInterface $size, ColorInterface $color, $fill = false, $thickness = 1) - { - $width = $size->getWidth(); - $height = $size->getHeight(); - - try { - $pixel = $this->getColor($color); - $ellipse = new \ImagickDraw(); - - $ellipse->setStrokeColor($pixel); - $ellipse->setStrokeWidth(max(1, (int) $thickness)); - - if ($fill) { - $ellipse->setFillColor($pixel); - } else { - $ellipse->setFillColor('transparent'); - } - - $ellipse->ellipse( - $center->getX(), - $center->getY(), - $width / 2, - $height / 2, - 0, 360 - ); - - if (false === $this->imagick->drawImage($ellipse)) { - throw new RuntimeException('Ellipse operation failed'); - } - - $pixel->clear(); - $pixel->destroy(); - - $ellipse->clear(); - $ellipse->destroy(); - } catch (\ImagickException $e) { - throw new RuntimeException('Draw ellipse operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function line(PointInterface $start, PointInterface $end, ColorInterface $color, $thickness = 1) - { - try { - $pixel = $this->getColor($color); - $line = new \ImagickDraw(); - - $line->setStrokeColor($pixel); - $line->setStrokeWidth(max(1, (int) $thickness)); - $line->setFillColor($pixel); - $line->line( - $start->getX(), - $start->getY(), - $end->getX(), - $end->getY() - ); - - $this->imagick->drawImage($line); - - $pixel->clear(); - $pixel->destroy(); - - $line->clear(); - $line->destroy(); - } catch (\ImagickException $e) { - throw new RuntimeException('Draw line operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function pieSlice(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1) - { - $width = $size->getWidth(); - $height = $size->getHeight(); - - $x1 = round($center->getX() + $width / 2 * cos(deg2rad($start))); - $y1 = round($center->getY() + $height / 2 * sin(deg2rad($start))); - $x2 = round($center->getX() + $width / 2 * cos(deg2rad($end))); - $y2 = round($center->getY() + $height / 2 * sin(deg2rad($end))); - - if ($fill) { - $this->chord($center, $size, $start, $end, $color, true, $thickness); - $this->polygon( - array( - $center, - new Point($x1, $y1), - new Point($x2, $y2), - ), - $color, - true, - $thickness - ); - } else { - $this->arc($center, $size, $start, $end, $color, $thickness); - $this->line($center, new Point($x1, $y1), $color, $thickness); - $this->line($center, new Point($x2, $y2), $color, $thickness); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function dot(PointInterface $position, ColorInterface $color) - { - $x = $position->getX(); - $y = $position->getY(); - - try { - $pixel = $this->getColor($color); - $point = new \ImagickDraw(); - - $point->setFillColor($pixel); - $point->point($x, $y); - - $this->imagick->drawimage($point); - - $pixel->clear(); - $pixel->destroy(); - - $point->clear(); - $point->destroy(); - } catch (\ImagickException $e) { - throw new RuntimeException('Draw point operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function polygon(array $coordinates, ColorInterface $color, $fill = false, $thickness = 1) - { - if (count($coordinates) < 3) { - throw new InvalidArgumentException(sprintf('Polygon must consist of at least 3 coordinates, %d given', count($coordinates))); - } - - $points = array_map(function (PointInterface $p) { - return array('x' => $p->getX(), 'y' => $p->getY()); - }, $coordinates); - - try { - $pixel = $this->getColor($color); - $polygon = new \ImagickDraw(); - - $polygon->setStrokeColor($pixel); - $polygon->setStrokeWidth(max(1, (int) $thickness)); - - if ($fill) { - $polygon->setFillColor($pixel); - } else { - $polygon->setFillColor('transparent'); - } - - $polygon->polygon($points); - $this->imagick->drawImage($polygon); - - $pixel->clear(); - $pixel->destroy(); - - $polygon->clear(); - $polygon->destroy(); - } catch (\ImagickException $e) { - throw new RuntimeException('Draw polygon operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function text($string, AbstractFont $font, PointInterface $position, $angle = 0, $width = null) - { - try { - $pixel = $this->getColor($font->getColor()); - $text = new \ImagickDraw(); - - $text->setFont($font->getFile()); - /** - * @see http://www.php.net/manual/en/imagick.queryfontmetrics.php#101027 - * - * ensure font resolution is the same as GD's hard-coded 96 - */ - if (version_compare(phpversion("imagick"), "3.0.2", ">=")) { - $text->setResolution(96, 96); - $text->setFontSize($font->getSize()); - } else { - $text->setFontSize((int) ($font->getSize() * (96 / 72))); - } - $text->setFillColor($pixel); - $text->setTextAntialias(true); - - $info = $this->imagick->queryFontMetrics($text, $string); - $rad = deg2rad($angle); - $cos = cos($rad); - $sin = sin($rad); - - // round(0 * $cos - 0 * $sin) - $x1 = 0; - $x2 = round($info['characterWidth'] * $cos - $info['characterHeight'] * $sin); - // round(0 * $sin + 0 * $cos) - $y1 = 0; - $y2 = round($info['characterWidth'] * $sin + $info['characterHeight'] * $cos); - - $xdiff = 0 - min($x1, $x2); - $ydiff = 0 - min($y1, $y2); - - if ($width !== null) { - $string = $this->wrapText($string, $text, $angle, $width); - } - - $this->imagick->annotateImage( - $text, $position->getX() + $x1 + $xdiff, - $position->getY() + $y2 + $ydiff, $angle, $string - ); - - $pixel->clear(); - $pixel->destroy(); - - $text->clear(); - $text->destroy(); - } catch (\ImagickException $e) { - throw new RuntimeException('Draw text operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * Gets specifically formatted color string from ColorInterface instance - * - * @param ColorInterface $color - * - * @return string - */ - private function getColor(ColorInterface $color) - { - $pixel = new \ImagickPixel((string) $color); - $pixel->setColorValue(\Imagick::COLOR_ALPHA, $color->getAlpha() / 100); - - return $pixel; - } - - /** - * Internal - * - * Fits a string into box with given width - */ - private function wrapText($string, $text, $angle, $width) - { - $result = ''; - $words = explode(' ', $string); - foreach ($words as $word) { - $teststring = $result . ' ' . $word; - $testbox = $this->imagick->queryFontMetrics($text, $teststring, true); - if ($testbox['textWidth'] > $width) { - $result .= ($result == '' ? '' : "\n") . $word; - } else { - $result .= ($result == '' ? '' : ' ') . $word; - } - } - - return $result; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Effects.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Effects.php deleted file mode 100755 index debe32a6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Effects.php +++ /dev/null @@ -1,113 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Imagick; - -use Imagine\Effects\EffectsInterface; -use Imagine\Exception\RuntimeException; -use Imagine\Image\Palette\Color\ColorInterface; - -/** - * Effects implementation using the Imagick PHP extension - */ -class Effects implements EffectsInterface -{ - private $imagick; - - public function __construct(\Imagick $imagick) - { - $this->imagick = $imagick; - } - - /** - * {@inheritdoc} - */ - public function gamma($correction) - { - try { - $this->imagick->gammaImage($correction, \Imagick::CHANNEL_ALL); - } catch (\ImagickException $e) { - throw new RuntimeException('Failed to apply gamma correction to the image'); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function negative() - { - try { - $this->imagick->negateImage(false, \Imagick::CHANNEL_ALL); - } catch (\ImagickException $e) { - throw new RuntimeException('Failed to negate the image'); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function grayscale() - { - try { - $this->imagick->setImageType(\Imagick::IMGTYPE_GRAYSCALE); - } catch (\ImagickException $e) { - throw new RuntimeException('Failed to grayscale the image'); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function colorize(ColorInterface $color) - { - try { - $this->imagick->colorizeImage((string) $color, 1); - } catch (\ImagickException $e) { - throw new RuntimeException('Failed to colorize the image'); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function sharpen() - { - try { - $this->imagick->sharpenImage(2, 1); - } catch (\ImagickException $e) { - throw new RuntimeException('Failed to sharpen the image'); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function blur($sigma = 1) - { - try { - $this->imagick->gaussianBlurImage(0, $sigma); - } catch (\ImagickException $e) { - throw new RuntimeException('Failed to blur the image', $e->getCode(), $e); - } - - return $this; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Font.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Font.php deleted file mode 100755 index 3fc41dd2..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Font.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Imagick; - -use Imagine\Image\AbstractFont; -use Imagine\Image\Box; -use Imagine\Image\Palette\Color\ColorInterface; - -/** - * Font implementation using the Imagick PHP extension - */ -final class Font extends AbstractFont -{ - /** - * @var \Imagick - */ - private $imagick; - - /** - * @param \Imagick $imagick - * @param string $file - * @param integer $size - * @param ColorInterface $color - */ - public function __construct(\Imagick $imagick, $file, $size, ColorInterface $color) - { - $this->imagick = $imagick; - - parent::__construct($file, $size, $color); - } - - /** - * {@inheritdoc} - */ - public function box($string, $angle = 0) - { - $text = new \ImagickDraw(); - - $text->setFont($this->file); - - /** - * @see http://www.php.net/manual/en/imagick.queryfontmetrics.php#101027 - * - * ensure font resolution is the same as GD's hard-coded 96 - */ - if (version_compare(phpversion("imagick"), "3.0.2", ">=")) { - $text->setResolution(96, 96); - $text->setFontSize($this->size); - } else { - $text->setFontSize((int) ($this->size * (96 / 72))); - } - - $info = $this->imagick->queryFontMetrics($text, $string); - - $box = new Box($info['textWidth'], $info['textHeight']); - - return $box; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Image.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Image.php deleted file mode 100755 index c94f605d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Image.php +++ /dev/null @@ -1,880 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Imagick; - -use Imagine\Exception\OutOfBoundsException; -use Imagine\Exception\InvalidArgumentException; -use Imagine\Exception\RuntimeException; -use Imagine\Image\AbstractImage; -use Imagine\Image\Box; -use Imagine\Image\BoxInterface; -use Imagine\Image\Metadata\MetadataBag; -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Image\Fill\FillInterface; -use Imagine\Image\Fill\Gradient\Horizontal; -use Imagine\Image\Fill\Gradient\Linear; -use Imagine\Image\Point; -use Imagine\Image\PointInterface; -use Imagine\Image\ProfileInterface; -use Imagine\Image\ImageInterface; -use Imagine\Image\Palette\PaletteInterface; - -/** - * Image implementation using the Imagick PHP extension - */ -final class Image extends AbstractImage -{ - /** - * @var \Imagick - */ - private $imagick; - /** - * @var Layers - */ - private $layers; - /** - * @var PaletteInterface - */ - private $palette; - - /** - * @var Boolean - */ - private static $supportsColorspaceConversion; - - private static $colorspaceMapping = array( - PaletteInterface::PALETTE_CMYK => \Imagick::COLORSPACE_CMYK, - PaletteInterface::PALETTE_RGB => \Imagick::COLORSPACE_RGB, - PaletteInterface::PALETTE_GRAYSCALE => \Imagick::COLORSPACE_GRAY, - ); - - /** - * Constructs a new Image instance - * - * @param \Imagick $imagick - * @param PaletteInterface $palette - * @param MetadataBag $metadata - */ - public function __construct(\Imagick $imagick, PaletteInterface $palette, MetadataBag $metadata) - { - $this->metadata = $metadata; - $this->detectColorspaceConversionSupport(); - $this->imagick = $imagick; - if (static::$supportsColorspaceConversion) { - $this->setColorspace($palette); - } - $this->palette = $palette; - $this->layers = new Layers($this, $this->palette, $this->imagick); - } - - /** - * Destroys allocated imagick resources - */ - public function __destruct() - { - if ($this->imagick instanceof \Imagick) { - $this->imagick->clear(); - $this->imagick->destroy(); - } - } - - /** - * Returns the underlying \Imagick instance - * - * @return \Imagick - */ - public function getImagick() - { - return $this->imagick; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function copy() - { - try { - if (version_compare(phpversion("imagick"), "3.1.0b1", ">=") || defined("HHVM_VERSION")) { - $clone = clone $this->imagick; - } else { - $clone = $this->imagick->clone(); - } - } catch (\ImagickException $e) { - throw new RuntimeException('Copy operation failed', $e->getCode(), $e); - } - - return new self($clone, $this->palette, clone $this->metadata); - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function crop(PointInterface $start, BoxInterface $size) - { - if (!$start->in($this->getSize())) { - throw new OutOfBoundsException('Crop coordinates must start at minimum 0, 0 position from top left corner, crop height and width must be positive integers and must not exceed the current image borders'); - } - - try { - $this->imagick->cropImage($size->getWidth(), $size->getHeight(), $start->getX(), $start->getY()); - // Reset canvas for gif format - $this->imagick->setImagePage(0, 0, 0, 0); - } catch (\ImagickException $e) { - throw new RuntimeException('Crop operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function flipHorizontally() - { - try { - $this->imagick->flopImage(); - } catch (\ImagickException $e) { - throw new RuntimeException('Horizontal Flip operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function flipVertically() - { - try { - $this->imagick->flipImage(); - } catch (\ImagickException $e) { - throw new RuntimeException('Vertical flip operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function strip() - { - try { - try { - $this->profile($this->palette->profile()); - } catch (\Exception $e) { - // here we discard setting the profile as the previous incorporated profile - // is corrupted, let's now strip the image - } - $this->imagick->stripImage(); - } catch (\ImagickException $e) { - throw new RuntimeException('Strip operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function paste(ImageInterface $image, PointInterface $start) - { - if (!$image instanceof self) { - throw new InvalidArgumentException(sprintf('Imagick\Image can only paste() Imagick\Image instances, %s given', get_class($image))); - } - - if (!$this->getSize()->contains($image->getSize(), $start)) { - throw new OutOfBoundsException('Cannot paste image of the given size at the specified position, as it moves outside of the current image\'s box'); - } - - try { - $this->imagick->compositeImage($image->imagick, \Imagick::COMPOSITE_DEFAULT, $start->getX(), $start->getY()); - } catch (\ImagickException $e) { - throw new RuntimeException('Paste operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function resize(BoxInterface $size, $filter = ImageInterface::FILTER_UNDEFINED) - { - try { - $this->imagick->resizeImage($size->getWidth(), $size->getHeight(), $this->getFilter($filter), 1); - } catch (\ImagickException $e) { - throw new RuntimeException('Resize operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function rotate($angle, ColorInterface $background = null) - { - $color = $background ? $background : $this->palette->color('fff'); - - try { - $pixel = $this->getColor($color); - - $this->imagick->rotateimage($pixel, $angle); - - $pixel->clear(); - $pixel->destroy(); - } catch (\ImagickException $e) { - throw new RuntimeException('Rotate operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function save($path = null, array $options = array()) - { - $path = null === $path ? $this->imagick->getImageFilename() : $path; - if (null === $path) { - throw new RuntimeException('You can omit save path only if image has been open from a file'); - } - - try { - $this->prepareOutput($options, $path); - $this->imagick->writeImages($path, true); - } catch (\ImagickException $e) { - throw new RuntimeException('Save operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function show($format, array $options = array()) - { - header('Content-type: '.$this->getMimeType($format)); - echo $this->get($format, $options); - - return $this; - } - - /** - * {@inheritdoc} - */ - public function get($format, array $options = array()) - { - try { - $options['format'] = $format; - $this->prepareOutput($options); - } catch (\ImagickException $e) { - throw new RuntimeException('Get operation failed', $e->getCode(), $e); - } - - return $this->imagick->getImagesBlob(); - } - - /** - * {@inheritdoc} - */ - public function interlace($scheme) - { - static $supportedInterlaceSchemes = array( - ImageInterface::INTERLACE_NONE => \Imagick::INTERLACE_NO, - ImageInterface::INTERLACE_LINE => \Imagick::INTERLACE_LINE, - ImageInterface::INTERLACE_PLANE => \Imagick::INTERLACE_PLANE, - ImageInterface::INTERLACE_PARTITION => \Imagick::INTERLACE_PARTITION, - ); - - if (!array_key_exists($scheme, $supportedInterlaceSchemes)) { - throw new InvalidArgumentException('Unsupported interlace type'); - } - - $this->imagick->setInterlaceScheme($supportedInterlaceSchemes[$scheme]); - - return $this; - } - - /** - * @param array $options - * @param string $path - */ - private function prepareOutput(array $options, $path = null) - { - if (isset($options['format'])) { - $this->imagick->setImageFormat($options['format']); - } - - if (isset($options['animated']) && true === $options['animated']) { - $format = isset($options['format']) ? $options['format'] : 'gif'; - $delay = isset($options['animated.delay']) ? $options['animated.delay'] : null; - $loops = isset($options['animated.loops']) ? $options['animated.loops'] : 0; - - $options['flatten'] = false; - - $this->layers->animate($format, $delay, $loops); - } else { - $this->layers->merge(); - } - $this->applyImageOptions($this->imagick, $options, $path); - - // flatten only if image has multiple layers - if ((!isset($options['flatten']) || $options['flatten'] === true) && count($this->layers) > 1) { - $this->flatten(); - } - } - - /** - * {@inheritdoc} - */ - public function __toString() - { - return $this->get('png'); - } - - /** - * {@inheritdoc} - */ - public function draw() - { - return new Drawer($this->imagick); - } - - /** - * {@inheritdoc} - */ - public function effects() - { - return new Effects($this->imagick); - } - - /** - * {@inheritdoc} - */ - public function getSize() - { - try { - $i = $this->imagick->getIteratorIndex(); - $this->imagick->rewind(); - $width = $this->imagick->getImageWidth(); - $height = $this->imagick->getImageHeight(); - $this->imagick->setIteratorIndex($i); - } catch (\ImagickException $e) { - throw new RuntimeException('Could not get size', $e->getCode(), $e); - } - - return new Box($width, $height); - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function applyMask(ImageInterface $mask) - { - if (!$mask instanceof self) { - throw new InvalidArgumentException('Can only apply instances of Imagine\Imagick\Image as masks'); - } - - $size = $this->getSize(); - $maskSize = $mask->getSize(); - - if ($size != $maskSize) { - throw new InvalidArgumentException(sprintf('The given mask doesn\'t match current image\'s size, Current mask\'s dimensions are %s, while image\'s dimensions are %s', $maskSize, $size)); - } - - $mask = $mask->mask(); - $mask->imagick->negateImage(true); - - try { - // remove transparent areas of the original from the mask - $mask->imagick->compositeImage($this->imagick, \Imagick::COMPOSITE_DSTIN, 0, 0); - $this->imagick->compositeImage($mask->imagick, \Imagick::COMPOSITE_COPYOPACITY, 0, 0); - - $mask->imagick->clear(); - $mask->imagick->destroy(); - } catch (\ImagickException $e) { - throw new RuntimeException('Apply mask operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function mask() - { - $mask = $this->copy(); - - try { - $mask->imagick->modulateImage(100, 0, 100); - $mask->imagick->setImageMatte(false); - } catch (\ImagickException $e) { - throw new RuntimeException('Mask operation failed', $e->getCode(), $e); - } - - return $mask; - } - - /** - * {@inheritdoc} - * - * @return ImageInterface - */ - public function fill(FillInterface $fill) - { - try { - if ($this->isLinearOpaque($fill)) { - $this->applyFastLinear($fill); - } else { - $iterator = $this->imagick->getPixelIterator(); - - foreach ($iterator as $y => $pixels) { - foreach ($pixels as $x => $pixel) { - $color = $fill->getColor(new Point($x, $y)); - - $pixel->setColor((string) $color); - $pixel->setColorValue(\Imagick::COLOR_ALPHA, $color->getAlpha() / 100); - } - - $iterator->syncIterator(); - } - } - } catch (\ImagickException $e) { - throw new RuntimeException('Fill operation failed', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function histogram() - { - try { - $pixels = $this->imagick->getImageHistogram(); - } catch (\ImagickException $e) { - throw new RuntimeException('Error while fetching histogram', $e->getCode(), $e); - } - - $image = $this; - - return array_map(function (\ImagickPixel $pixel) use ($image) { - return $image->pixelToColor($pixel); - },$pixels); - } - - /** - * {@inheritdoc} - */ - public function getColorAt(PointInterface $point) - { - if (!$point->in($this->getSize())) { - throw new RuntimeException(sprintf('Error getting color at point [%s,%s]. The point must be inside the image of size [%s,%s]', $point->getX(), $point->getY(), $this->getSize()->getWidth(), $this->getSize()->getHeight())); - } - - try { - $pixel = $this->imagick->getImagePixelColor($point->getX(), $point->getY()); - } catch (\ImagickException $e) { - throw new RuntimeException('Error while getting image pixel color', $e->getCode(), $e); - } - - return $this->pixelToColor($pixel); - } - - /** - * Returns a color given a pixel, depending the Palette context - * - * Note : this method is public for PHP 5.3 compatibility - * - * @param \ImagickPixel $pixel - * - * @return ColorInterface - * - * @throws InvalidArgumentException In case a unknown color is requested - */ - public function pixelToColor(\ImagickPixel $pixel) - { - static $colorMapping = array( - ColorInterface::COLOR_RED => \Imagick::COLOR_RED, - ColorInterface::COLOR_GREEN => \Imagick::COLOR_GREEN, - ColorInterface::COLOR_BLUE => \Imagick::COLOR_BLUE, - ColorInterface::COLOR_CYAN => \Imagick::COLOR_CYAN, - ColorInterface::COLOR_MAGENTA => \Imagick::COLOR_MAGENTA, - ColorInterface::COLOR_YELLOW => \Imagick::COLOR_YELLOW, - ColorInterface::COLOR_KEYLINE => \Imagick::COLOR_BLACK, - // There is no gray component in \Imagick, let's use one of the RGB comp - ColorInterface::COLOR_GRAY => \Imagick::COLOR_RED, - ); - - $alpha = $this->palette->supportsAlpha() ? (int) round($pixel->getColorValue(\Imagick::COLOR_ALPHA) * 100) : null; - $palette = $this->palette(); - - return $this->palette->color(array_map(function ($color) use ($palette, $pixel, $colorMapping) { - if (!isset($colorMapping[$color])) { - throw new InvalidArgumentException(sprintf('Color %s is not mapped in Imagick', $color)); - } - $multiplier = 255; - if ($palette->name() === PaletteInterface::PALETTE_CMYK) { - $multiplier = 100; - } - - return $pixel->getColorValue($colorMapping[$color]) * $multiplier; - }, $this->palette->pixelDefinition()), $alpha); - } - - /** - * {@inheritdoc} - */ - public function layers() - { - return $this->layers; - } - - /** - * {@inheritdoc} - */ - public function usePalette(PaletteInterface $palette) - { - if (!isset(static::$colorspaceMapping[$palette->name()])) { - throw new InvalidArgumentException(sprintf('The palette %s is not supported by Imagick driver', $palette->name())); - } - - if ($this->palette->name() === $palette->name()) { - return $this; - } - - if (!static::$supportsColorspaceConversion) { - throw new RuntimeException('Your version of Imagick does not support colorspace conversions.'); - } - - try { - try { - $hasICCProfile = (Boolean) $this->imagick->getImageProfile('icc'); - } catch (\ImagickException $e) { - $hasICCProfile = false; - } - - if (!$hasICCProfile) { - $this->profile($this->palette->profile()); - } - - $this->profile($palette->profile()); - $this->setColorspace($palette); - } catch (\ImagickException $e) { - throw new RuntimeException('Failed to set colorspace', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function palette() - { - return $this->palette; - } - - /** - * {@inheritdoc} - */ - public function profile(ProfileInterface $profile) - { - try { - $this->imagick->profileImage('icc', $profile->data()); - } catch (\ImagickException $e) { - throw new RuntimeException(sprintf('Unable to add profile %s to image', $profile->name()), $e->getCode(), $e); - } - - return $this; - } - - /** - * Internal - * - * Flatten the image. - */ - private function flatten() - { - /** - * @see https://github.com/mkoppanen/imagick/issues/45 - */ - try { - if (method_exists($this->imagick, 'mergeImageLayers') && defined('Imagick::LAYERMETHOD_UNDEFINED')) { - $this->imagick = $this->imagick->mergeImageLayers(\Imagick::LAYERMETHOD_UNDEFINED); - } elseif (method_exists($this->imagick, 'flattenImages')) { - $this->imagick = $this->imagick->flattenImages(); - } - } catch (\ImagickException $e) { - throw new RuntimeException('Flatten operation failed', $e->getCode(), $e); - } - } - - /** - * Internal - * - * Applies options before save or output - * - * @param \Imagick $image - * @param array $options - * @param string $path - * - * @throws InvalidArgumentException - * @throws RuntimeException - */ - private function applyImageOptions(\Imagick $image, array $options, $path) - { - if (isset($options['format'])) { - $format = $options['format']; - } elseif ('' !== $extension = pathinfo($path, \PATHINFO_EXTENSION)) { - $format = $extension; - } else { - $format = pathinfo($image->getImageFilename(), \PATHINFO_EXTENSION); - } - - $format = strtolower($format); - - $options = $this->updateSaveOptions($options); - - if (isset($options['jpeg_quality']) && in_array($format, array('jpeg', 'jpg', 'pjpeg'))) { - $image->setImageCompressionQuality($options['jpeg_quality']); - } - - if ((isset($options['png_compression_level']) || isset($options['png_compression_filter'])) && $format === 'png') { - // first digit: compression level (default: 7) - if (isset($options['png_compression_level'])) { - if ($options['png_compression_level'] < 0 || $options['png_compression_level'] > 9) { - throw new InvalidArgumentException('png_compression_level option should be an integer from 0 to 9'); - } - $compression = $options['png_compression_level'] * 10; - } else { - $compression = 70; - } - - // second digit: compression filter (default: 5) - if (isset($options['png_compression_filter'])) { - if ($options['png_compression_filter'] < 0 || $options['png_compression_filter'] > 9) { - throw new InvalidArgumentException('png_compression_filter option should be an integer from 0 to 9'); - } - $compression += $options['png_compression_filter']; - } else { - $compression += 5; - } - - $image->setImageCompressionQuality($compression); - } - - if (isset($options['resolution-units']) && isset($options['resolution-x']) && isset($options['resolution-y'])) { - if ($options['resolution-units'] == ImageInterface::RESOLUTION_PIXELSPERCENTIMETER) { - $image->setImageUnits(\Imagick::RESOLUTION_PIXELSPERCENTIMETER); - } elseif ($options['resolution-units'] == ImageInterface::RESOLUTION_PIXELSPERINCH) { - $image->setImageUnits(\Imagick::RESOLUTION_PIXELSPERINCH); - } else { - throw new RuntimeException('Unsupported image unit format'); - } - - $filter = ImageInterface::FILTER_UNDEFINED; - if (!empty($options['resampling-filter'])) { - $filter = $options['resampling-filter']; - } - - $image->setImageResolution($options['resolution-x'], $options['resolution-y']); - $image->resampleImage($options['resolution-x'], $options['resolution-y'], $this->getFilter($filter), 0); - } - } - - /** - * Gets specifically formatted color string from Color instance - * - * @param ColorInterface $color - * - * @return \ImagickPixel - */ - private function getColor(ColorInterface $color) - { - $pixel = new \ImagickPixel((string) $color); - $pixel->setColorValue(\Imagick::COLOR_ALPHA, $color->getAlpha() / 100); - - return $pixel; - } - - /** - * Checks whether given $fill is linear and opaque - * - * @param FillInterface $fill - * - * @return Boolean - */ - private function isLinearOpaque(FillInterface $fill) - { - return $fill instanceof Linear && $fill->getStart()->isOpaque() && $fill->getEnd()->isOpaque(); - } - - /** - * Performs optimized gradient fill for non-opaque linear gradients - * - * @param Linear $fill - */ - private function applyFastLinear(Linear $fill) - { - $gradient = new \Imagick(); - $size = $this->getSize(); - $color = sprintf('gradient:%s-%s', (string) $fill->getStart(), (string) $fill->getEnd()); - - if ($fill instanceof Horizontal) { - $gradient->newPseudoImage($size->getHeight(), $size->getWidth(), $color); - $gradient->rotateImage(new \ImagickPixel(), 90); - } else { - $gradient->newPseudoImage($size->getWidth(), $size->getHeight(), $color); - } - - $this->imagick->compositeImage($gradient, \Imagick::COMPOSITE_OVER, 0, 0); - $gradient->clear(); - $gradient->destroy(); - } - - /** - * Internal - * - * Get the mime type based on format. - * - * @param string $format - * - * @return string mime-type - * - * @throws RuntimeException - */ - private function getMimeType($format) - { - static $mimeTypes = array( - 'jpeg' => 'image/jpeg', - 'jpg' => 'image/jpeg', - 'gif' => 'image/gif', - 'png' => 'image/png', - 'wbmp' => 'image/vnd.wap.wbmp', - 'xbm' => 'image/xbm', - ); - - if (!isset($mimeTypes[$format])) { - throw new RuntimeException(sprintf('Unsupported format given. Only %s are supported, %s given', implode(", ", array_keys($mimeTypes)), $format)); - } - - return $mimeTypes[$format]; - } - - /** - * Sets colorspace and image type, assigns the palette. - * - * @param PaletteInterface $palette - * - * @throws InvalidArgumentException - */ - private function setColorspace(PaletteInterface $palette) - { - static $typeMapping = array( - // We use Matte variants to preserve alpha - PaletteInterface::PALETTE_CMYK => \Imagick::IMGTYPE_TRUECOLORMATTE, - PaletteInterface::PALETTE_RGB => \Imagick::IMGTYPE_TRUECOLORMATTE, - PaletteInterface::PALETTE_GRAYSCALE => \Imagick::IMGTYPE_GRAYSCALEMATTE, - ); - - if (!isset(static::$colorspaceMapping[$palette->name()])) { - throw new InvalidArgumentException(sprintf('The palette %s is not supported by Imagick driver', $palette->name())); - } - - $this->imagick->setType($typeMapping[$palette->name()]); - $this->imagick->setColorspace(static::$colorspaceMapping[$palette->name()]); - $this->palette = $palette; - } - - /** - * Older imagemagick versions does not support colorspace conversions. - * Let's detect if it is supported. - * - * @return Boolean - */ - private function detectColorspaceConversionSupport() - { - if (null !== static::$supportsColorspaceConversion) { - return static::$supportsColorspaceConversion; - } - - return static::$supportsColorspaceConversion = method_exists('Imagick', 'setColorspace'); - } - - /** - * Returns the filter if it's supported. - * - * @param string $filter - * - * @return string - * - * @throws InvalidArgumentException If the filter is unsupported. - */ - private function getFilter($filter = ImageInterface::FILTER_UNDEFINED) - { - static $supportedFilters = array( - ImageInterface::FILTER_UNDEFINED => \Imagick::FILTER_UNDEFINED, - ImageInterface::FILTER_BESSEL => \Imagick::FILTER_BESSEL, - ImageInterface::FILTER_BLACKMAN => \Imagick::FILTER_BLACKMAN, - ImageInterface::FILTER_BOX => \Imagick::FILTER_BOX, - ImageInterface::FILTER_CATROM => \Imagick::FILTER_CATROM, - ImageInterface::FILTER_CUBIC => \Imagick::FILTER_CUBIC, - ImageInterface::FILTER_GAUSSIAN => \Imagick::FILTER_GAUSSIAN, - ImageInterface::FILTER_HANNING => \Imagick::FILTER_HANNING, - ImageInterface::FILTER_HAMMING => \Imagick::FILTER_HAMMING, - ImageInterface::FILTER_HERMITE => \Imagick::FILTER_HERMITE, - ImageInterface::FILTER_LANCZOS => \Imagick::FILTER_LANCZOS, - ImageInterface::FILTER_MITCHELL => \Imagick::FILTER_MITCHELL, - ImageInterface::FILTER_POINT => \Imagick::FILTER_POINT, - ImageInterface::FILTER_QUADRATIC => \Imagick::FILTER_QUADRATIC, - ImageInterface::FILTER_SINC => \Imagick::FILTER_SINC, - ImageInterface::FILTER_TRIANGLE => \Imagick::FILTER_TRIANGLE - ); - - if (!array_key_exists($filter, $supportedFilters)) { - throw new InvalidArgumentException(sprintf( - 'The resampling filter "%s" is not supported by Imagick driver.', - $filter - )); - } - - return $supportedFilters[$filter]; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Imagine.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Imagine.php deleted file mode 100755 index aa6e9264..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Imagine.php +++ /dev/null @@ -1,176 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Imagick; - -use Imagine\Exception\NotSupportedException; -use Imagine\Image\AbstractImagine; -use Imagine\Image\BoxInterface; -use Imagine\Image\Metadata\MetadataBag; -use Imagine\Image\Palette\Color\ColorInterface; -use Imagine\Exception\InvalidArgumentException; -use Imagine\Exception\RuntimeException; -use Imagine\Image\Palette\CMYK; -use Imagine\Image\Palette\RGB; -use Imagine\Image\Palette\Grayscale; - -/** - * Imagine implementation using the Imagick PHP extension - */ -final class Imagine extends AbstractImagine -{ - /** - * @throws RuntimeException - */ - public function __construct() - { - if (!class_exists('Imagick')) { - throw new RuntimeException('Imagick not installed'); - } - - if (version_compare('6.2.9', $this->getVersion(new \Imagick())) > 0) { - throw new RuntimeException('ImageMagick version 6.2.9 or higher is required'); - } - } - - /** - * {@inheritdoc} - */ - public function open($path) - { - $path = $this->checkPath($path); - - try { - $imagick = new \Imagick($path); - $image = new Image($imagick, $this->createPalette($imagick), $this->getMetadataReader()->readFile($path)); - } catch (\Exception $e) { - throw new RuntimeException(sprintf('Unable to open image %s', $path), $e->getCode(), $e); - } - - return $image; - } - - /** - * {@inheritdoc} - */ - public function create(BoxInterface $size, ColorInterface $color = null) - { - $width = $size->getWidth(); - $height = $size->getHeight(); - - $palette = null !== $color ? $color->getPalette() : new RGB(); - $color = null !== $color ? $color : $palette->color('fff'); - - try { - $pixel = new \ImagickPixel((string) $color); - $pixel->setColorValue(\Imagick::COLOR_ALPHA, $color->getAlpha() / 100); - - $imagick = new \Imagick(); - $imagick->newImage($width, $height, $pixel); - $imagick->setImageMatte(true); - $imagick->setImageBackgroundColor($pixel); - - if (version_compare('6.3.1', $this->getVersion($imagick)) < 0) { - $imagick->setImageOpacity($pixel->getColorValue(\Imagick::COLOR_ALPHA)); - } - - $pixel->clear(); - $pixel->destroy(); - - return new Image($imagick, $palette, new MetadataBag()); - } catch (\ImagickException $e) { - throw new RuntimeException('Could not create empty image', $e->getCode(), $e); - } - } - - /** - * {@inheritdoc} - */ - public function load($string) - { - try { - $imagick = new \Imagick(); - - $imagick->readImageBlob($string); - $imagick->setImageMatte(true); - - return new Image($imagick, $this->createPalette($imagick), $this->getMetadataReader()->readData($string)); - } catch (\ImagickException $e) { - throw new RuntimeException('Could not load image from string', $e->getCode(), $e); - } - } - - /** - * {@inheritdoc} - */ - public function read($resource) - { - if (!is_resource($resource)) { - throw new InvalidArgumentException('Variable does not contain a stream resource'); - } - - try { - $imagick = new \Imagick(); - $imagick->readImageFile($resource); - } catch (\ImagickException $e) { - throw new RuntimeException('Could not read image from resource', $e->getCode(), $e); - } - - return new Image($imagick, $this->createPalette($imagick), $this->getMetadataReader()->readStream($resource)); - } - - /** - * {@inheritdoc} - */ - public function font($file, $size, ColorInterface $color) - { - return new Font(new \Imagick(), $file, $size, $color); - } - - /** - * Returns the palette corresponding to an \Imagick resource colorspace - * - * @param \Imagick $imagick - * - * @return CMYK|Grayscale|RGB - * - * @throws NotSupportedException - */ - private function createPalette(\Imagick $imagick) - { - switch ($imagick->getImageColorspace()) { - case \Imagick::COLORSPACE_RGB: - case \Imagick::COLORSPACE_SRGB: - return new RGB(); - case \Imagick::COLORSPACE_CMYK: - return new CMYK(); - case \Imagick::COLORSPACE_GRAY: - return new Grayscale(); - default: - throw new NotSupportedException('Only RGB and CMYK colorspace are currently supported'); - } - } - - /** - * Returns ImageMagick version - * - * @param \Imagick $imagick - * - * @return string - */ - private function getVersion(\Imagick $imagick) - { - $v = $imagick->getVersion(); - list($version) = sscanf($v['versionString'], 'ImageMagick %s %04d-%02d-%02d %s %s'); - - return $version; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Layers.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Layers.php deleted file mode 100755 index 7809447a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Imagine/Imagick/Layers.php +++ /dev/null @@ -1,271 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Imagine\Imagick; - -use Imagine\Image\AbstractLayers; -use Imagine\Image\Metadata\MetadataBag; -use Imagine\Exception\RuntimeException; -use Imagine\Exception\OutOfBoundsException; -use Imagine\Exception\InvalidArgumentException; -use Imagine\Image\Palette\PaletteInterface; - -class Layers extends AbstractLayers -{ - /** - * @var Image - */ - private $image; - /** - * @var \Imagick - */ - private $resource; - /** - * @var integer - */ - private $offset = 0; - /** - * @var array - */ - private $layers = array(); - - private $palette; - - public function __construct(Image $image, PaletteInterface $palette, \Imagick $resource) - { - $this->image = $image; - $this->resource = $resource; - $this->palette = $palette; - } - - /** - * {@inheritdoc} - */ - public function merge() - { - foreach ($this->layers as $offset => $image) { - try { - $this->resource->setIteratorIndex($offset); - $this->resource->setImage($image->getImagick()); - } catch (\ImagickException $e) { - throw new RuntimeException('Failed to substitute layer', $e->getCode(), $e); - } - } - } - - /** - * {@inheritdoc} - */ - public function animate($format, $delay, $loops) - { - if ('gif' !== strtolower($format)) { - throw new InvalidArgumentException('Animated picture is currently only supported on gif'); - } - - if (!is_int($loops) || $loops < 0) { - throw new InvalidArgumentException('Loops must be a positive integer.'); - } - - if (null !== $delay && (!is_int($delay) || $delay < 0)) { - throw new InvalidArgumentException('Delay must be either null or a positive integer.'); - } - - try { - foreach ($this as $offset => $layer) { - $this->resource->setIteratorIndex($offset); - $this->resource->setFormat($format); - - if (null !== $delay) { - $layer->getImagick()->setImageDelay($delay / 10); - $layer->getImagick()->setImageTicksPerSecond(100); - } - $layer->getImagick()->setImageIterations($loops); - - $this->resource->setImage($layer->getImagick()); - } - } catch (\ImagickException $e) { - throw new RuntimeException('Failed to animate layers', $e->getCode(), $e); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function coalesce() - { - try { - $coalescedResource = $this->resource->coalesceImages(); - } catch (\ImagickException $e) { - throw new RuntimeException('Failed to coalesce layers', $e->getCode(), $e); - } - - $count = $coalescedResource->getNumberImages(); - for ($offset = 0; $offset < $count; $offset++) { - try { - $coalescedResource->setIteratorIndex($offset); - $this->layers[$offset] = new Image($coalescedResource->getImage(), $this->palette, new MetadataBag()); - } catch (\ImagickException $e) { - throw new RuntimeException('Failed to retrieve layer', $e->getCode(), $e); - } - } - } - - /** - * {@inheritdoc} - */ - public function current() - { - return $this->extractAt($this->offset); - } - - /** - * Tries to extract layer at given offset - * - * @param integer $offset - * - * @return Image - * @throws RuntimeException - */ - private function extractAt($offset) - { - if (!isset($this->layers[$offset])) { - try { - $this->resource->setIteratorIndex($offset); - $this->layers[$offset] = new Image($this->resource->getImage(), $this->palette, new MetadataBag()); - } catch (\ImagickException $e) { - throw new RuntimeException(sprintf('Failed to extract layer %d', $offset), $e->getCode(), $e); - } - } - - return $this->layers[$offset]; - } - - /** - * {@inheritdoc} - */ - public function key() - { - return $this->offset; - } - - /** - * {@inheritdoc} - */ - public function next() - { - ++$this->offset; - } - - /** - * {@inheritdoc} - */ - public function rewind() - { - $this->offset = 0; - } - - /** - * {@inheritdoc} - */ - public function valid() - { - return $this->offset < count($this); - } - - /** - * {@inheritdoc} - */ - public function count() - { - try { - return $this->resource->getNumberImages(); - } catch (\ImagickException $e) { - throw new RuntimeException('Failed to count the number of layers', $e->getCode(), $e); - } - } - - /** - * {@inheritdoc} - */ - public function offsetExists($offset) - { - return is_int($offset) && $offset >= 0 && $offset < count($this); - } - - /** - * {@inheritdoc} - */ - public function offsetGet($offset) - { - return $this->extractAt($offset); - } - - /** - * {@inheritdoc} - */ - public function offsetSet($offset, $image) - { - if (!$image instanceof Image) { - throw new InvalidArgumentException('Only an Imagick Image can be used as layer'); - } - - if (null === $offset) { - $offset = count($this) - 1; - } else { - if (!is_int($offset)) { - throw new InvalidArgumentException('Invalid offset for layer, it must be an integer'); - } - - if (count($this) < $offset || 0 > $offset) { - throw new OutOfBoundsException(sprintf('Invalid offset for layer, it must be a value between 0 and %d, %d given', count($this), $offset)); - } - - if (isset($this[$offset])) { - unset($this[$offset]); - $offset = $offset - 1; - } - } - - $frame = $image->getImagick(); - - try { - if (count($this) > 0) { - $this->resource->setIteratorIndex($offset); - } - $this->resource->addImage($frame); - } catch (\ImagickException $e) { - throw new RuntimeException('Unable to set the layer', $e->getCode(), $e); - } - - $this->layers = array(); - } - - /** - * {@inheritdoc} - */ - public function offsetUnset($offset) - { - try { - $this->extractAt($offset); - } catch (RuntimeException $e) { - return; - } - - try { - $this->resource->setIteratorIndex($offset); - $this->resource->removeImage(); - } catch (\ImagickException $e) { - throw new RuntimeException('Unable to remove layer', $e->getCode(), $e); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Collection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Collection.php deleted file mode 100755 index 61dcbeb1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Collection.php +++ /dev/null @@ -1,192 +0,0 @@ -aItems = array(); - } - - /** - * @param mixed $mItem - * @param bool $bToTop = false - * @return self - */ - public function Add($mItem, $bToTop = false) - { - if ($bToTop) - { - \array_unshift($this->aItems, $mItem); - } - else - { - \array_push($this->aItems, $mItem); - } - - return $this; - } - - /** - * @param array $aItems - * @return self - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public function AddArray($aItems) - { - if (!\is_array($aItems)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - foreach ($aItems as $mItem) - { - $this->Add($mItem); - } - - return $this; - } - - /** - * @return self - */ - public function Clear() - { - $this->aItems = array(); - - return $this; - } - - /** - * @return array - */ - public function CloneAsArray() - { - return $this->aItems; - } - - /** - * @return int - */ - public function Count() - { - return \count($this->aItems); - } - - /** - * @return array - */ - public function &GetAsArray() - { - return $this->aItems; - } - - /** - * @param mixed $mCallback - */ - public function MapList($mCallback) - { - $aResult = array(); - if (\is_callable($mCallback)) - { - foreach ($this->aItems as $oItem) - { - $aResult[] = \call_user_func($mCallback, $oItem); - } - } - - return $aResult; - } - - /** - * @param mixed $mCallback - * @return array - */ - public function FilterList($mCallback) - { - $aResult = array(); - if (\is_callable($mCallback)) - { - foreach ($this->aItems as $oItem) - { - if (\call_user_func($mCallback, $oItem)) - { - $aResult[] = $oItem; - } - } - } - - return $aResult; - } - - /** - * @param mixed $mCallback - * @return void - */ - public function ForeachList($mCallback) - { - if (\is_callable($mCallback)) - { - foreach ($this->aItems as $oItem) - { - \call_user_func($mCallback, $oItem); - } - } - } - - /** - * @return mixed | null - * @return mixed - */ - public function &GetByIndex($iIndex) - { - $mResult = null; - if (\key_exists($iIndex, $this->aItems)) - { - $mResult = $this->aItems[$iIndex]; - } - - return $mResult; - } - - /** - * @param array $aItems - * @return self - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public function SetAsArray($aItems) - { - if (!\is_array($aItems)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $this->aItems = $aItems; - - return $this; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Crypt.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Crypt.php deleted file mode 100755 index f21bdbca..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Crypt.php +++ /dev/null @@ -1,189 +0,0 @@ -> 2 & 3; - for ($iPIndex = 0; $iPIndex < $iN; $iPIndex++) - { - $iY = $aV[$iPIndex + 1]; - $iMx = self::int32((($iZ >> 5 & 0x07ffffff) ^ $iY << 2) + - (($iY >> 3 & 0x1fffffff) ^ $iZ << 4)) ^ self::int32(($iSum ^ $iY) + ($aK[$iPIndex & 3 ^ $iE] ^ $iZ)); - $iZ = $aV[$iPIndex] = self::int32($aV[$iPIndex] + $iMx); - } - $iY = $aV[0]; - $iMx = self::int32((($iZ >> 5 & 0x07ffffff) ^ $iY << 2) + - (($iY >> 3 & 0x1fffffff) ^ $iZ << 4)) ^ self::int32(($iSum ^ $iY) + ($aK[$iPIndex & 3 ^ $iE] ^ $iZ)); - $iZ = $aV[$iN] = self::int32($aV[$iN] + $iMx); - } - - return self::long2str($aV, false); - } - - /** - * @param string $sEncriptedString - * @param string $sKey - * - * @return string - */ - public static function XxteaDecrypt($sEncriptedString, $sKey) - { - if (0 === \strlen($sEncriptedString)) - { - return ''; - } - - $aV = self::str2long($sEncriptedString, false); - $aK = self::str2long($sKey, false); - - if (\count($aK) < 4) - { - for ($iIndex = \count($aK); $iIndex < 4; $iIndex++) - { - $aK[$iIndex] = 0; - } - } - - $iN = \count($aV) - 1; - - $iZ = $aV[$iN]; - $iY = $aV[0]; - $iDelta = 0x9E3779B9; - $iQ = \floor(6 + 52 / ($iN + 1)); - $iSum = self::int32($iQ * $iDelta); - while ($iSum != 0) - { - $iE = $iSum >> 2 & 3; - for ($iPIndex = $iN; $iPIndex > 0; $iPIndex--) - { - $iZ = $aV[$iPIndex - 1]; - $iMx = self::int32((($iZ >> 5 & 0x07ffffff) ^ $iY << 2) + - (($iY >> 3 & 0x1fffffff) ^ $iZ << 4)) ^ self::int32(($iSum ^ $iY) + ($aK[$iPIndex & 3 ^ $iE] ^ $iZ)); - $iY = $aV[$iPIndex] = self::int32($aV[$iPIndex] - $iMx); - } - $iZ = $aV[$iN]; - $iMx = self::int32((($iZ >> 5 & 0x07ffffff) ^ $iY << 2) + - (($iY >> 3 & 0x1fffffff) ^ $iZ << 4)) ^ self::int32(($iSum ^ $iY) + ($aK[$iPIndex & 3 ^ $iE] ^ $iZ)); - $iY = $aV[0] = self::int32($aV[0] - $iMx); - $iSum = self::int32($iSum - $iDelta); - } - - return self::long2str($aV, true); - } - - /** - * @param array $aV - * @param array $aW - * - * @return string - */ - private static function long2str($aV, $aW) - { - $iLen = \count($aV); - $iN = ($iLen - 1) << 2; - if ($aW) - { - $iM = $aV[$iLen - 1]; - if (($iM < $iN - 3) || ($iM > $iN)) - { - return false; - } - $iN = $iM; - } - $aS = array(); - for ($iIndex = 0; $iIndex < $iLen; $iIndex++) - { - $aS[$iIndex] = \pack('V', $aV[$iIndex]); - } - if ($aW) - { - return \substr(\join('', $aS), 0, $iN); - } - else - { - return \join('', $aS); - } - } - - /** - * @param string $sS - * @param string $sW - * - * @return array - */ - private static function str2long($sS, $sW) - { - $aV = \unpack('V*', $sS . \str_repeat("\0", (4 - \strlen($sS) % 4) & 3)); - $aV = \array_values($aV); - if ($sW) - { - $aV[\count($aV)] = \strlen($sS); - } - return $aV; - } - - /** - * @param int $iN - * - * @return int - */ - private static function int32($iN) - { - while ($iN >= 2147483648) - { - $iN -= 4294967296; - } - while ($iN <= -2147483649) - { - $iN += 4294967296; - } - return (int) $iN; - } -} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/DateTimeHelper.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/DateTimeHelper.php deleted file mode 100755 index 66028b31..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/DateTimeHelper.php +++ /dev/null @@ -1,154 +0,0 @@ -getTimestamp() : 0; - } - - /** - * Parse date string formated as "10-Jan-2012 01:58:17 -0800" - * IMAP INTERNALDATE Format - * - * @param string $sDateTime - * - * @return int - */ - public static function ParseInternalDateString($sDateTime) - { - $sDateTime = \trim($sDateTime); - if (empty($sDateTime)) - { - return 0; - } - - if (\preg_match('/^[a-z]{2,4}, /i', $sDateTime)) // RFC2822 ~ "Thu, 10 Jun 2010 08:58:33 -0700 (PDT)" - { - return \MailSo\Base\DateTimeHelper::ParseRFC2822DateString($sDateTime); - } - - $oDateTime = \DateTime::createFromFormat('d-M-Y H:i:s O', $sDateTime, \MailSo\Base\DateTimeHelper::GetUtcTimeZoneObject()); - return $oDateTime ? $oDateTime->getTimestamp() : 0; - } - - /** - * Parse date string formated as "2011-06-14 23:59:59 +0400" - * - * @param string $sDateTime - * - * @return int - */ - public static function ParseDateStringType1($sDateTime) - { - $sDateTime = \trim($sDateTime); - if (empty($sDateTime)) - { - return 0; - } - - $oDateTime = \DateTime::createFromFormat('Y-m-d H:i:s O', $sDateTime, \MailSo\Base\DateTimeHelper::GetUtcTimeZoneObject()); - return $oDateTime ? $oDateTime->getTimestamp() : 0; - } - - /** - * Parse date string formated as "2015-05-08T14:32:18.483-07:00" - * - * @param string $sDateTime - * - * @return int - */ - public static function TryToParseSpecEtagFormat($sDateTime) - { - $sDateTime = \trim(\preg_replace('/ \([a-zA-Z0-9]+\)$/', '', \trim($sDateTime))); - $sDateTime = \trim(\preg_replace('/(:[\d]{2})\.[\d]{3}/', '$1', \trim($sDateTime))); - $sDateTime = \trim(\preg_replace('/(-[\d]{2})T([\d]{2}:)/', '$1 $2', \trim($sDateTime))); - $sDateTime = \trim(\preg_replace('/([\-+][\d]{2}):([\d]{2})$/', ' $1$2', \trim($sDateTime))); - - return \MailSo\Base\DateTimeHelper::ParseDateStringType1($sDateTime); - } - - /** - * @param string $sTime - * - * @return int - */ - public static function TimeToSec($sTime) - { - $iMod = 1; - $sTime = \trim($sTime); - if ('-' === \substr($sTime, 0, 1)) - { - $iMod = -1; - $sTime = \substr($sTime, 1); - } - - $aParts = \preg_split('/[:.,]/', (string) $sTime); - - $iResult = 0; - if (isset($aParts[0]) && \is_numeric($aParts[0])) - { - $iResult += 3600 * ((int) $aParts[0]); - } - - if (isset($aParts[1]) && \is_numeric($aParts[1])) - { - $iResult += 60 * ((int) $aParts[1]); - } - - return $iResult * $iMod; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Enumerations/Charset.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Enumerations/Charset.php deleted file mode 100755 index 85132e6e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Enumerations/Charset.php +++ /dev/null @@ -1,38 +0,0 @@ -getFile()).' ~ '.$this->getLine().')' : $sMessage; - - parent::__construct($sMessage, $iCode, $oPrevious); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Exceptions/InvalidArgumentException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Exceptions/InvalidArgumentException.php deleted file mode 100755 index a366b639..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Exceptions/InvalidArgumentException.php +++ /dev/null @@ -1,19 +0,0 @@ -hasAttributes() && isset($oElement->attributes) && $oElement->attributes) - { - foreach ($oElement->attributes as $oAttr) - { - if ($oAttr && !empty($oAttr->nodeName)) - { - $sAttrName = \trim(\strtolower($oAttr->nodeName)); - $aResult[$sAttrName] = $oAttr->nodeValue; - } - } - } - } - - return $aResult; - } - - /** - * @param string $sText - * - * @return \DOMDocument|bool - */ - public static function GetDomFromText($sText) - { - $bState = true; - if (\MailSo\Base\Utils::FunctionExistsAndEnabled('libxml_use_internal_errors')) - { - $bState = \libxml_use_internal_errors(true); - } - - $sHtmlAttrs = $sBodyAttrs = ''; - - $sText = \MailSo\Base\HtmlUtils::FixSchemas($sText); - $sText = \MailSo\Base\HtmlUtils::ClearFastTags($sText); - $sText = \MailSo\Base\HtmlUtils::ClearBodyAndHtmlTag($sText, $sHtmlAttrs, $sBodyAttrs); - - $oDom = self::createDOMDocument(); - @$oDom->loadHTML('<'.'?xml version="1.0" encoding="utf-8"?'.'>'. - ''. - ''. - ''.\MailSo\Base\Utils::Utf8Clear($sText).''); - - @$oDom->normalizeDocument(); - - if (\MailSo\Base\Utils::FunctionExistsAndEnabled('libxml_clear_errors')) - { - @\libxml_clear_errors(); - } - - if (\MailSo\Base\Utils::FunctionExistsAndEnabled('libxml_use_internal_errors')) - { - \libxml_use_internal_errors($bState); - } - - return $oDom; - } - - /** - * @return \DOMDocument - */ - private static function createDOMDocument() - { - $oDoc = new \DOMDocument('1.0', 'UTF-8'); - $oDoc->encoding = 'UTF-8'; - $oDoc->strictErrorChecking = false; - $oDoc->formatOutput = false; - $oDoc->preserveWhiteSpace = false; - - return $oDoc; - } - - /** - * @return boolean - */ - private static function comparedVersion() - { - return \version_compare(PHP_VERSION, '5.3.6') >= 0; - } - - /** - * @param \DOMDocument|\DOMElement $oElem - * - * @return string - */ - private static function domToString($oElem, $oDom = null) - { - $sResult = ''; - if ($oElem instanceof \DOMDocument) - { - if (isset($oElem->documentElement) && self::comparedVersion()) - { - $sResult = $oElem->saveHTML($oElem->documentElement); - } - else - { - $sResult = $oElem->saveHTML(); - } - } - else if ($oElem) - { - if ($oDom && self::comparedVersion()) - { - $sResult = $oDom->saveHTML($oElem); - } - else - { - $oTempDoc = self::createDOMDocument(); - $oTempDoc->appendChild($oTempDoc->importNode($oElem->cloneNode(true), true)); - $sResult = $oTempDoc->saveHTML(); - } - } - - return \trim($sResult); - } - - /** - * @param \DOMDocument $oDom - * @param bool $bWrapByFakeHtmlAndBodyDiv = true - * - * @return string - */ - public static function GetTextFromDom_($oDom, $bWrapByFakeHtmlAndBodyDiv = true) - { - $sResult = ''; - - $aHtmlAttrs = $aBodylAttrs = array(); - if ($bWrapByFakeHtmlAndBodyDiv) - { - $oHtml = $oDom->getElementsByTagName('html')->item(0); - $oBody = $oDom->getElementsByTagName('body')->item(0); - - $aHtmlAttrs = \MailSo\Base\HtmlUtils::GetElementAttributesAsArray($oHtml); - $aBodylAttrs = \MailSo\Base\HtmlUtils::GetElementAttributesAsArray($oBody); - } - - $oDiv = $oDom->getElementsByTagName('div')->item(0); - if ($oDiv && $oDiv->hasAttribute('data-wrp') && 'rainloop' === $oDiv->getAttribute('data-wrp')) - { - $oDiv->removeAttribute('data-wrp'); - if ($bWrapByFakeHtmlAndBodyDiv) - { - $oWrap = $oDom->createElement('div'); - - $oWrap->setAttribute('data-x-div-type', 'html'); - foreach ($aHtmlAttrs as $sKey => $sValue) - { - $oWrap->setAttribute($sKey, $sValue); - } - - $oDiv->setAttribute('data-x-div-type', 'body'); - foreach ($aBodylAttrs as $sKey => $sValue) - { - $oDiv->setAttribute($sKey, $sValue); - } - - $oWrap->appendChild($oDiv); - $sResult = self::domToString($oWrap, $oDom); - } - else - { - $sResult = self::domToString($oDiv, $oDom); - } - } - else - { - $sResult = self::domToString($oDom); - } - - $sResult = \str_replace(\MailSo\Base\HtmlUtils::$KOS, ':', $sResult); - $sResult = \MailSo\Base\Utils::StripSpaces($sResult); - - return $sResult; - } - - /** - * @param \DOMDocument $oDom - * @param bool $bWrapByFakeHtmlAndBodyDiv = true - * - * @return string - */ - public static function GetTextFromDom($oDom, $bWrapByFakeHtmlAndBodyDiv = true) - { - $sResult = ''; - - $oHtml = $oDom->getElementsByTagName('html')->item(0); - $oBody = $oDom->getElementsByTagName('body')->item(0); - - foreach ($oBody->childNodes as $oChild) - { - $sResult .= $oDom->saveHTML($oChild); - } - - if ($bWrapByFakeHtmlAndBodyDiv) - { - $aHtmlAttrs = \MailSo\Base\HtmlUtils::GetElementAttributesAsArray($oHtml); - $aBodylAttrs = \MailSo\Base\HtmlUtils::GetElementAttributesAsArray($oBody); - - $oWrapHtml = $oDom->createElement('div'); - $oWrapHtml->setAttribute('data-x-div-type', 'html'); - foreach ($aHtmlAttrs as $sKey => $sValue) - { - $oWrapHtml->setAttribute($sKey, $sValue); - } - - $oWrapDom = $oDom->createElement('div', '___xxx___'); - $oWrapDom->setAttribute('data-x-div-type', 'body'); - foreach ($aBodylAttrs as $sKey => $sValue) - { - $oWrapDom->setAttribute($sKey, $sValue); - } - - $oWrapHtml->appendChild($oWrapDom); - - $sWrp = $oDom->saveHTML($oWrapHtml); - - $sResult = \str_replace('___xxx___', $sResult, $sWrp); - } - - $sResult = \str_replace(\MailSo\Base\HtmlUtils::$KOS, ':', $sResult); - $sResult = \MailSo\Base\Utils::StripSpaces($sResult); - - return $sResult; - } - - /** - * @param string $sHtml - * @param string $sHtmlAttrs = '' - * @param string $sBodyAttrs = '' - * - * @return string - */ - public static function ClearBodyAndHtmlTag($sHtml, &$sHtmlAttrs = '', &$sBodyAttrs = '') - { - $aMatch = array(); - if (\preg_match('/]+)>/im', $sHtml, $aMatch) && !empty($aMatch[1])) - { - $sHtmlAttrs = $aMatch[1]; - } - - $aMatch = array(); - if (\preg_match('/]+)>/im', $sHtml, $aMatch) && !empty($aMatch[1])) - { - $sBodyAttrs = $aMatch[1]; - } - - $sHtml = \preg_replace('/]*)>/si', '', $sHtml); - $sHtml = \preg_replace('/]*)>/si', '', $sHtml); - $sHtml = \preg_replace('/<\/body>/i', '', $sHtml); - $sHtml = \preg_replace('/]*)>/i', '', $sHtml); - $sHtml = \preg_replace('/<\/html>/i', '', $sHtml); - - $sHtmlAttrs = \preg_replace('/xmlns:[a-z]="[^"]*"/i', '', $sHtmlAttrs); - $sHtmlAttrs = \preg_replace('/xmlns:[a-z]=\'[^\']*\'/i', '', $sHtmlAttrs); - $sHtmlAttrs = \preg_replace('/xmlns="[^"]*"/i', '', $sHtmlAttrs); - $sHtmlAttrs = \preg_replace('/xmlns=\'[^\']*\'/i', '', $sHtmlAttrs); - $sBodyAttrs = \preg_replace('/xmlns:[a-z]="[^"]*"/i', '', $sBodyAttrs); - $sBodyAttrs = \preg_replace('/xmlns:[a-z]=\'[^\']*\'/i', '', $sBodyAttrs); - - $sHtmlAttrs = trim($sHtmlAttrs); - $sBodyAttrs = trim($sBodyAttrs); - - return $sHtml; - } - - /** - * @param string $sHtml - * @param bool $bClearEmpty = true - * - * @return string - */ - public static function FixSchemas($sHtml, $bClearEmpty = true) - { - if ($bClearEmpty) - { - $sHtml = \str_replace('', '', $sHtml); - } - - $sHtml = \str_replace('', '', $sHtml); - $sHtml = \str_replace('', '', $sHtml); - - return $sHtml; - } - - /** - * @param string $sHtml - * - * @return string - */ - public static function ClearFastTags($sHtml) - { - return \preg_replace(array( - '/]*><\/p>/i', - '/]*>/i', - '/<\?xml [^>]*\?>/i' - ), '', $sHtml); - } - - /** - * @param mixed $oDom - */ - public static function ClearComments(&$oDom) - { - $aRemove = array(); - - $oXpath = new \DOMXpath($oDom); - $oComments = $oXpath->query('//comment()'); - if ($oComments) - { - foreach ($oComments as $oComment) - { - $aRemove[] = $oComment; - } - } - - unset($oXpath, $oComments); - - foreach ($aRemove as /* @var $oElement \DOMElement */ $oElement) - { - if (isset($oElement->parentNode)) - { - @$oElement->parentNode->removeChild($oElement); - } - } - } - - /** - * @param mixed $oDom - * @param bool $bClearStyleAndHead = true - */ - public static function ClearTags(&$oDom, $bClearStyleAndHead = true) - { - $aRemoveTags = array( - 'svg', 'link', 'base', 'meta', 'title', 'x-script', 'script', 'bgsound', 'keygen', 'source', - 'object', 'embed', 'applet', 'mocha', 'iframe', 'frame', 'frameset', 'video', 'audio', 'area', 'map' - ); - - if ($bClearStyleAndHead) - { - $aRemoveTags[] = 'head'; - $aRemoveTags[] = 'style'; - } - - $aHtmlAllowedTags = isset(\MailSo\Config::$HtmlStrictAllowedTags) && - \is_array(\MailSo\Config::$HtmlStrictAllowedTags) && 0 < \count(\MailSo\Config::$HtmlStrictAllowedTags) ? - \MailSo\Config::$HtmlStrictAllowedTags : null; - - $aRemove = array(); - $aNodes = $oDom->getElementsByTagName('*'); - foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement) - { - if ($oElement) - { - $sTagNameLower = \trim(\strtolower($oElement->tagName)); - if ('' !== $sTagNameLower) - { - if (\in_array($sTagNameLower, $aRemoveTags) || ($aHtmlAllowedTags && !\in_array($sTagNameLower, $aHtmlAllowedTags))) - { - $aRemove[] = @$oElement; - } - } - } - } - - foreach ($aRemove as /* @var $oElement \DOMElement */ $oElement) - { - if (isset($oElement->parentNode)) - { - @$oElement->parentNode->removeChild($oElement); - } - } - } - -/* -// public static function ClearStyleUrlValueParserHelper($oUrlValue, $oRule, $oRuleSet, -// $oElem = null, -// &$bHasExternals = false, &$aFoundCIDs = array(), -// $aContentLocationUrls = array(), &$aFoundedContentLocationUrls = array(), -// $bDoNotReplaceExternalUrl = false, $fAdditionalExternalFilter = null -// ) -// { -// if ($oUrlValue instanceof \Sabberworm\CSS\Value\URL) -// { -// $oNewRule = new \Sabberworm\CSS\Rule\Rule('x-rl-orig-'.$oRule->getRule()); -// $oNewRule->setValue((string) $oRule->getValue()); -// $oNewRule->setIsImportant($oRule->getIsImportant()); -// -// $oRuleSet->addRule($oNewRule); -// -// $oUrl = $oUrlValue->getURL(); -// $sUrl = $oUrl ? $oUrl->getString() : ''; -// -// if ('cid:' === \strtolower(\substr($sUrl, 0, 4))) -// { -// $aFoundCIDs[] = \substr($sUrl, 4); -// -// $oRule->setRule('x-rl-mod-'.$oRule->getRule()); -// -// if ($oElem) -// { -// $oElem->setAttribute('data-x-style-mod', '1'); -// } -// } -// else -// { -// if (\preg_match('/http[s]?:\/\//i', $sUrl) || '//' === \substr($sUrl, 0, 2)) -// { -// $oRule->setRule('x-rl-mod-'.$oRule->getRule()); -// -// if (\in_array($sUrl, $aContentLocationUrls)) -// { -// $aFoundedContentLocationUrls[] = $sUrl; -// } -// else -// { -// $bHasExternals = true; -// if (!$bDoNotReplaceExternalUrl) -// { -// if ($fAdditionalExternalFilter) -// { -// $sAdditionalResult = \call_user_func($fAdditionalExternalFilter, $sUrl); -// if (0 < \strlen($sAdditionalResult) && $oUrl) -// { -// $oUrl->setString($sAdditionalResult); -// } -// } -// } -// } -// -// if ($oElem) -// { -// $oElem->setAttribute('data-x-style-mod', '1'); -// } -// } -// else if ('data:image/' !== \strtolower(\substr(\trim($sUrl), 0, 11))) -// { -// $oRuleSet->removeRule($oRule); -// } -// } -// } -// else if ($oRule instanceof \Sabberworm\CSS\Rule\Rule) -// { -// if ('x-rl-' !== \substr($oRule->getRule(), 0, 5)) -// { -// $oValue = $oRule->getValue(); -// if ($oValue instanceof \Sabberworm\CSS\Value\URL) -// { -// \MailSo\Base\HtmlUtils::ClearStyleUrlValueParserHelper($oValue, $oRule, $oRuleSet, $oElem, -// $bHasExternals, $aFoundCIDs, -// $aContentLocationUrls, $aFoundedContentLocationUrls, -// $bDoNotReplaceExternalUrl, $fAdditionalExternalFilter); -// } -// else if ($oValue instanceof \Sabberworm\CSS\Value\RuleValueList) -// { -// $aComps = $oValue->getListComponents(); -// foreach ($aComps as $oValue) -// { -// if ($oValue instanceof \Sabberworm\CSS\Value\URL) -// { -// \MailSo\Base\HtmlUtils::ClearStyleUrlValueParserHelper($oValue, $oRule, $oRuleSet, $oElem, -// $bHasExternals, $aFoundCIDs, -// $aContentLocationUrls, $aFoundedContentLocationUrls, -// $bDoNotReplaceExternalUrl, $fAdditionalExternalFilter); -// } -// } -// } -// } -// } -// } -// -// public static function ClearStyleSmart($sStyle, $oElement = null, -// &$bHasExternals = false, &$aFoundCIDs = array(), -// $aContentLocationUrls = array(), &$aFoundedContentLocationUrls = array(), -// $bDoNotReplaceExternalUrl = false, $fAdditionalExternalFilter = null, -// $sSelectorPrefix = '') -// { -// $mResult = false; -// $oCss = null; -// -// if (!\class_exists('Sabberworm\CSS\Parser')) -// { -// return $mResult; -// } -// -// $sStyle = \trim($sStyle); -// if (empty($sStyle)) -// { -// return ''; -// } -// -// $sStyle = \trim(\preg_replace('/[\r\n\t\s]+/', ' ', $sStyle)); -// -// try -// { -// $oSettings = \Sabberworm\CSS\Settings::create(); -// $oSettings->beStrict(); -// $oSettings->withMultibyteSupport(false); -// -// $oCssParser = new \Sabberworm\CSS\Parser($sStyle, $oSettings); -// $oCss = $oCssParser->parse(); -// } -// catch (\Exception $oEception) -// { -// unset($oEception); -// $mResult = false; -// } -// -// if ($oCss) -// { -// foreach ($oCss->getAllDeclarationBlocks() as $oBlock) -// { -// foreach($oBlock->getSelectors() as $oSelector) -// { -// $sS = ' '.\trim($oSelector->getSelector()).' '; -// $sS = \preg_replace('/ body([\.# ])/i', ' [data-x-div-type="body"]$1', $sS); -// $sS = \preg_replace('/ html([\.# ])/i', ' [data-x-div-type="html"]$1', $sS); -// -// if (0 < \strlen($sSelectorPrefix)) -// { -// $sS = \trim($sSelectorPrefix.' '.\trim($sS)); -// } -// -// $oSelector->setSelector(\trim($sS)); -// } -// } -// -// $aRulesToRemove = array( -// 'pointer-events', 'content', 'behavior', 'cursor', -// ); -// -// foreach($oCss->getAllRuleSets() as $oRuleSet) -// { -// foreach ($aRulesToRemove as $sRuleToRemove) -// { -// $oRuleSet->removeRule($sRuleToRemove); -// } -// -// // position: fixed -> position: fixed -> absolute -// $aRules = $oRuleSet->getRules('position'); -// if (\is_array($aRules)) -// { -// foreach ($aRules as $oRule) -// { -// $mValue = $oRule->getValue(); -// if (\is_string($mValue) && 'fixed' === \trim(\strtolower($mValue))) -// { -// $oRule->setValue('absolute'); -// } -// } -// } -// } -// -// foreach($oCss->getAllDeclarationBlocks() as $oRuleSet) -// { -// if ($oRuleSet instanceof \Sabberworm\CSS\RuleSet\RuleSet) -// { -// if ($oRuleSet instanceof \Sabberworm\CSS\RuleSet\DeclarationBlock) -// { -// $oRuleSet->expandBackgroundShorthand(); -// $oRuleSet->expandListStyleShorthand(); -// } -// -// $aRules = $oRuleSet->getRules(); -// if (\is_array($aRules) && 0 < \count($aRules)) -// { -// foreach ($aRules as $oRule) -// { -// if ($oRule instanceof \Sabberworm\CSS\Rule\Rule) -// { -// \MailSo\Base\HtmlUtils::ClearStyleUrlValueParserHelper(null, $oRule, $oRuleSet, -// $oElement, -// $bHasExternals, $aFoundCIDs, -// $aContentLocationUrls, $aFoundedContentLocationUrls, -// $bDoNotReplaceExternalUrl, $fAdditionalExternalFilter -// ); -// } -// } -// } -// } -// } -// -// try -// { -// $mResult = $oCss->render(\Sabberworm\CSS\OutputFormat::createCompact()); -// } -// catch (\Exception $oEception) -// { -// unset($oEception); -// $mResult = false; -// } -// } -// -// return $mResult; -// } -*/ - - /** - * - * @param string $sStyle - * @param \DOMElement $oElement - * @param bool $bHasExternals - * @param array $aFoundCIDs - * @param array $aContentLocationUrls - * @param array $aFoundedContentLocationUrls - * @param bool $bDoNotReplaceExternalUrl = false - * @param callback|null $fAdditionalExternalFilter = null - * - * @return string - */ - public static function ClearStyle($sStyle, $oElement, &$bHasExternals, &$aFoundCIDs, - $aContentLocationUrls, &$aFoundedContentLocationUrls, $bDoNotReplaceExternalUrl = false, $fAdditionalExternalFilter = null) - { - $sStyle = \trim($sStyle); - $aOutStyles = array(); - $aStyles = \explode(';', $sStyle); - - if ($fAdditionalExternalFilter && !\is_callable($fAdditionalExternalFilter)) - { - $fAdditionalExternalFilter = null; - } - - $aMatch = array(); - foreach ($aStyles as $sStyleItem) - { - $aStyleValue = \explode(':', $sStyleItem, 2); - $sName = \trim(\strtolower($aStyleValue[0])); - $sValue = isset($aStyleValue[1]) ? \trim($aStyleValue[1]) : ''; - - if ('position' === $sName && 'fixed' === \strtolower($sValue)) - { - $sValue = 'absolute'; - } - - if (0 === \strlen($sName) || 0 === \strlen($sValue)) - { - continue; - } - - $sStyleItem = $sName.': '.$sValue; - $aStyleValue = array($sName, $sValue); - - /*if (\in_array($sName, array('position', 'left', 'right', 'top', 'bottom', 'behavior', 'cursor'))) - { - // skip - } - else */if (\in_array($sName, array('behavior', 'pointer-events')) || - ('cursor' === $sName && !\in_array(\strtolower($sValue), array('none', 'cursor'))) || - ('display' === $sName && 'none' === \strtolower($sValue)) || - \preg_match('/expression/i', $sValue) || - ('text-indent' === $sName && '-' === \substr(trim($sValue), 0, 1)) - ) - { - // skip - } - else if (\in_array($sName, array('background-image', 'background', 'list-style', 'list-style-image', 'content')) - && \preg_match('/url[\s]?\(([^)]+)\)/im', $sValue, $aMatch) && !empty($aMatch[1])) - { - $sFullUrl = \trim($aMatch[0], '"\' '); - $sUrl = \trim($aMatch[1], '"\' '); - $sStyleValue = \trim(\preg_replace('/[\s]+/', ' ', \str_replace($sFullUrl, '', $sValue))); - $sStyleItem = empty($sStyleValue) ? '' : $sName.': '.$sStyleValue; - - if ('cid:' === \strtolower(\substr($sUrl, 0, 4))) - { - if ($oElement) - { - $oElement->setAttribute('data-x-style-cid-name', - 'background' === $sName ? 'background-image' : $sName); - - $oElement->setAttribute('data-x-style-cid', \substr($sUrl, 4)); - - $aFoundCIDs[] = \substr($sUrl, 4); - } - } - else - { - if ($oElement) - { - if (\preg_match('/http[s]?:\/\//i', $sUrl) || '//' === \substr($sUrl, 0, 2)) - { - $bHasExternals = true; - if (!$bDoNotReplaceExternalUrl) - { - if (\in_array($sName, array('background-image', 'list-style-image', 'content'))) - { - $sStyleItem = ''; - } - - $sTemp = ''; - if ($oElement->hasAttribute('data-x-style-url')) - { - $sTemp = \trim($oElement->getAttribute('data-x-style-url')); - } - - $sTemp = empty($sTemp) ? '' : (';' === \substr($sTemp, -1) ? $sTemp.' ' : $sTemp.'; '); - - $oElement->setAttribute('data-x-style-url', \trim($sTemp. - ('background' === $sName ? 'background-image' : $sName).': '.$sFullUrl, ' ;')); - - if ($fAdditionalExternalFilter) - { - $sAdditionalResult = \call_user_func($fAdditionalExternalFilter, $sUrl); - if (0 < \strlen($sAdditionalResult)) - { - $oElement->setAttribute('data-x-additional-style-url', - ('background' === $sName ? 'background-image' : $sName).': url('.$sAdditionalResult.')'); - } - } - } - } - else if ('data:image/' !== \strtolower(\substr(\trim($sUrl), 0, 11))) - { - $oElement->setAttribute('data-x-broken-style-src', $sFullUrl); - } - } - } - - if (!empty($sStyleItem)) - { - $aOutStyles[] = $sStyleItem; - } - } - else if ('height' === $sName) - { -// $aOutStyles[] = 'min-'.ltrim($sStyleItem); - $aOutStyles[] = $sStyleItem; - } - else - { - $aOutStyles[] = $sStyleItem; - } - } - - return \implode(';', $aOutStyles); - } - - /** - * @param \DOMDocument $oDom - */ - public static function FindLinksInDOM(&$oDom) - { - $aNodes = $oDom->getElementsByTagName('*'); - foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement) - { - $sTagNameLower = \strtolower($oElement->tagName); - $sParentTagNameLower = isset($oElement->parentNode) && isset($oElement->parentNode->tagName) ? - \strtolower($oElement->parentNode->tagName) : ''; - - if (!\in_array($sTagNameLower, array('html', 'meta', 'head', 'style', 'script', 'img', 'button', 'input', 'textarea', 'a')) && - 'a' !== $sParentTagNameLower && $oElement->childNodes && 0 < $oElement->childNodes->length) - { - $oSubItem = null; - $aTextNodes = array(); - $iIndex = $oElement->childNodes->length - 1; - while ($iIndex > -1) - { - $oSubItem = $oElement->childNodes->item($iIndex); - if ($oSubItem && XML_TEXT_NODE === $oSubItem->nodeType) - { - $aTextNodes[] = $oSubItem; - } - - $iIndex--; - } - - unset($oSubItem); - - foreach ($aTextNodes as $oTextNode) - { - if ($oTextNode && 0 < \strlen($oTextNode->wholeText)/* && \preg_match('/http[s]?:\/\//i', $oTextNode->wholeText)*/) - { - $sText = \MailSo\Base\LinkFinder::NewInstance() - ->Text($oTextNode->wholeText) - ->UseDefaultWrappers(true) - ->CompileText() - ; - - $oSubDom = \MailSo\Base\HtmlUtils::GetDomFromText($sText); - if ($oSubDom) - { - $oBodyNodes = $oSubDom->getElementsByTagName('body'); - if ($oBodyNodes && 0 < $oBodyNodes->length) - { - $oBodyChildNodes = $oBodyNodes->item(0)->childNodes; - if ($oBodyChildNodes && $oBodyChildNodes->length) - { - for ($iIndex = 0, $iLen = $oBodyChildNodes->length; $iIndex < $iLen; $iIndex++) - { - $oSubItem = $oBodyChildNodes->item($iIndex); - if ($oSubItem) - { - if (XML_ELEMENT_NODE === $oSubItem->nodeType && - 'a' === \strtolower($oSubItem->tagName)) - { - $oLink = $oDom->createElement('a', - \str_replace(':', \MailSo\Base\HtmlUtils::$KOS, \htmlspecialchars($oSubItem->nodeValue))); - - $sHref = $oSubItem->getAttribute('href'); - if ($sHref) - { - $oLink->setAttribute('href', $sHref); - } - - $oElement->insertBefore($oLink, $oTextNode); - } - else - { - $oElement->insertBefore($oDom->importNode($oSubItem), $oTextNode); - } - } - } - - $oElement->removeChild($oTextNode); - } - } - - unset($oBodyNodes); - } - - unset($oSubDom, $sText); - } - } - } - } - - unset($aNodes); - } - - /** - * @param string $sHtml - * @param bool $bDoNotReplaceExternalUrl = false - * @param bool $bFindLinksInHtml = false - * @param bool $bWrapByFakeHtmlAndBodyDiv = true - * - * @return string - */ - public static function ClearHtmlSimple($sHtml, $bDoNotReplaceExternalUrl = false, $bFindLinksInHtml = false, $bWrapByFakeHtmlAndBodyDiv = true) - { - $bHasExternals = false; - $aFoundCIDs = array(); - $aContentLocationUrls = array(); - $aFoundedContentLocationUrls = array(); - $fAdditionalExternalFilter = null; - $fAdditionalDomReader = null; - $bTryToDetectHiddenImages = false; - - return \MailSo\Base\HtmlUtils::ClearHtml($sHtml, $bHasExternals, $aFoundCIDs, - $aContentLocationUrls, $aFoundedContentLocationUrls, $bDoNotReplaceExternalUrl, $bFindLinksInHtml, - $fAdditionalExternalFilter, $fAdditionalDomReader, $bTryToDetectHiddenImages, - $bWrapByFakeHtmlAndBodyDiv); - } - - /** - * @param string $sHtml - * @param bool $bHasExternals = false - * @param array $aFoundCIDs = array() - * @param array $aContentLocationUrls = array() - * @param array $aFoundedContentLocationUrls = array() - * @param bool $bDoNotReplaceExternalUrl = false - * @param bool $bFindLinksInHtml = false - * @param callback|null $fAdditionalExternalFilter = null - * @param callback|null $fAdditionalDomReader = null - * @param bool $bTryToDetectHiddenImages = false - * @param bool $bWrapByFakeHtmlAndBodyDiv = true - * - * @return string - */ - public static function ClearHtml($sHtml, &$bHasExternals = false, &$aFoundCIDs = array(), - $aContentLocationUrls = array(), &$aFoundedContentLocationUrls = array(), - $bDoNotReplaceExternalUrl = false, $bFindLinksInHtml = false, - $fAdditionalExternalFilter = null, $fAdditionalDomReader = false, - $bTryToDetectHiddenImages = false, $bWrapByFakeHtmlAndBodyDiv = true) - { - $sResult = ''; - - $sHtml = null === $sHtml ? '' : (string) $sHtml; - $sHtml = \trim($sHtml); - if (0 === \strlen($sHtml)) - { - return ''; - } - - if ($fAdditionalExternalFilter && !\is_callable($fAdditionalExternalFilter)) - { - $fAdditionalExternalFilter = null; - } - - if ($fAdditionalDomReader && !\is_callable($fAdditionalDomReader)) - { - $fAdditionalDomReader = null; - } - - $bHasExternals = false; - - // Dom Part - $oDom = \MailSo\Base\HtmlUtils::GetDomFromText($sHtml); - unset($sHtml); - - if (!$oDom) - { - return ''; - } - - if ($fAdditionalDomReader) - { - $oResDom = \call_user_func($fAdditionalDomReader, $oDom); - if ($oResDom) - { - $oDom = $oResDom; - } - - unset($oResDom); - } - - if ($bFindLinksInHtml) - { - \MailSo\Base\HtmlUtils::FindLinksInDOM($oDom); - } - - \MailSo\Base\HtmlUtils::ClearComments($oDom); - \MailSo\Base\HtmlUtils::ClearTags($oDom); - - $sLinkColor = ''; - $aNodes = $oDom->getElementsByTagName('*'); - foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement) - { - $aRemovedAttrs = array(); - $sTagNameLower = \strtolower($oElement->tagName); - - // convert body attributes to styles - if ('body' === $sTagNameLower) - { - $aAttrs = array( - 'link' => '', - 'text' => '', - 'topmargin' => '', - 'leftmargin' => '', - 'bottommargin' => '', - 'rightmargin' => '' - ); - - if (isset($oElement->attributes)) - { - foreach ($oElement->attributes as $sAttrName => /* @var $oAttributeNode \DOMNode */ $oAttributeNode) - { - if ($oAttributeNode && isset($oAttributeNode->nodeValue)) - { - $sAttrNameLower = \trim(\strtolower($sAttrName)); - if (isset($aAttrs[$sAttrNameLower]) && '' === $aAttrs[$sAttrNameLower]) - { - $aAttrs[$sAttrNameLower] = array($sAttrName, \trim($oAttributeNode->nodeValue)); - } - } - } - } - - $aStyles = array(); - foreach ($aAttrs as $sIndex => $aItem) - { - if (\is_array($aItem)) - { - $oElement->removeAttribute($aItem[0]); - - switch ($sIndex) - { - case 'link': - $sLinkColor = \trim($aItem[1]); - if (!\preg_match('/^#[abcdef0-9]{3,6}$/i', $sLinkColor)) - { - $sLinkColor = ''; - } - break; - case 'text': - $aStyles[] = 'color: '.$aItem[1]; - break; - case 'topmargin': - $aStyles[] = 'margin-top: '.((int) $aItem[1]).'px'; - break; - case 'leftmargin': - $aStyles[] = 'margin-left: '.((int) $aItem[1]).'px'; - break; - case 'bottommargin': - $aStyles[] = 'margin-bottom: '.((int) $aItem[1]).'px'; - break; - case 'rightmargin': - $aStyles[] = 'margin-right: '.((int) $aItem[1]).'px'; - break; - } - } - } - - if (0 < \count($aStyles)) - { - $sStyles = $oElement->hasAttribute('style') ? \trim(\trim(\trim($oElement->getAttribute('style')), ';')) : ''; - $oElement->setAttribute('style', (empty($sStyles) ? '' : $sStyles.'; ').\implode('; ', $aStyles)); - } - } - - if ('iframe' === $sTagNameLower || 'frame' === $sTagNameLower) - { - $oElement->setAttribute('src', 'javascript:false'); - } - - if ('a' === $sTagNameLower && !empty($sLinkColor)) - { - $sStyles = $oElement->hasAttribute('style') - ? \trim(\trim(\trim($oElement->getAttribute('style')), ';')) : ''; - - $oElement->setAttribute('style', - 'color: '.$sLinkColor.\trim((empty($sStyles) ? '' : '; '.$sStyles))); - } - - if ($oElement->hasAttributes() && isset($oElement->attributes) && $oElement->attributes) - { - $aHtmlAllowedAttributes = isset(\MailSo\Config::$HtmlStrictAllowedAttributes) && - \is_array(\MailSo\Config::$HtmlStrictAllowedAttributes) && 0 < \count(\MailSo\Config::$HtmlStrictAllowedAttributes) ? - \MailSo\Config::$HtmlStrictAllowedAttributes : null; - - $sAttrsForRemove = array(); - foreach ($oElement->attributes as $sAttrName => $oAttr) - { - if ($sAttrName && $oAttr) - { - $sAttrNameLower = \trim(\strtolower($sAttrName)); - if ($aHtmlAllowedAttributes && !\in_array($sAttrNameLower, $aHtmlAllowedAttributes)) - { - $sAttrsForRemove[] = $sAttrName; - } - else if ('on' === \substr($sAttrNameLower, 0, 2) || in_array($sAttrNameLower, array( - 'id', 'class', 'contenteditable', 'designmode', 'formaction', 'manifest', 'action', - 'data-bind', 'data-reactid', 'xmlns', 'srcset', 'data-x-skip-style', - 'fscommand', 'seeksegmenttime' - ))) - { - $sAttrsForRemove[] = $sAttrName; - } - } - } - - if (0 < \count($sAttrsForRemove)) - { - foreach ($sAttrsForRemove as $sName) - { - @$oElement->removeAttribute($sName); - $aRemovedAttrs[\trim(\strtolower($sName))] = true; - } - } - - unset($sAttrsForRemove); - } - - if ($oElement->hasAttribute('href')) - { - $sHref = \trim($oElement->getAttribute('href')); - if (!\preg_match('/^(http[s]?|ftp|skype|mailto):/i', $sHref) && '//' !== \substr($sHref, 0, 2)) - { - $oElement->setAttribute('data-x-broken-href', $sHref); - $oElement->setAttribute('href', 'javascript:false'); - } - - if ('a' === $sTagNameLower) - { - $oElement->setAttribute('rel', 'external nofollow noopener noreferrer'); - } - } - - if (\in_array($sTagNameLower, array('a', 'form', 'area'))) - { - $oElement->setAttribute('target', '_blank'); - } - - if (\in_array($sTagNameLower, array('a', 'form', 'area', 'input', 'button', 'textarea'))) - { - $oElement->setAttribute('tabindex', '-1'); - } - - if ($bTryToDetectHiddenImages && 'img' === $sTagNameLower) - { - $sAlt = $oElement->hasAttribute('alt') - ? \trim($oElement->getAttribute('alt')) : ''; - - if ($oElement->hasAttribute('src') && '' === $sAlt) - { - $aH = array( - 'email.microsoftemail.com/open', - 'github.com/notifications/beacon/', - 'mandrillapp.com/track/open', - 'list-manage.com/track/open' - ); - - $sH = $oElement->hasAttribute('height') - ? \trim($oElement->getAttribute('height')) : ''; - -// $sW = $oElement->hasAttribute('width') -// ? \trim($oElement->getAttribute('width')) : ''; - - $sStyles = $oElement->hasAttribute('style') - ? \preg_replace('/[\s]+/', '', \trim(\trim(\trim($oElement->getAttribute('style')), ';'))) : ''; - - $sSrc = \trim($oElement->getAttribute('src')); - - $bC = \in_array($sH, array('1', '0', '1px', '0px')) || - \preg_match('/(display:none|visibility:hidden|height:0|height:[01][a-z][a-z])/i', $sStyles); - - if (!$bC) - { - $sSrcLower = \strtolower($sSrc); - foreach ($aH as $sLine) - { - if (false !== \strpos($sSrcLower, $sLine)) - { - $bC = true; - break; - } - } - } - - if ($bC) - { - $oElement->setAttribute('style', 'display:none'); - $oElement->setAttribute('data-x-skip-style', 'true'); - $oElement->setAttribute('data-x-hidden-src', $sSrc); - - $oElement->removeAttribute('src'); - } - } - } - - if ($oElement->hasAttribute('src')) - { - $sSrc = \trim($oElement->getAttribute('src')); - $oElement->removeAttribute('src'); - - if (\in_array($sSrc, $aContentLocationUrls)) - { - $oElement->setAttribute('data-x-src-location', $sSrc); - $aFoundedContentLocationUrls[] = $sSrc; - } - else if ('cid:' === \strtolower(\substr($sSrc, 0, 4))) - { - $oElement->setAttribute('data-x-src-cid', \substr($sSrc, 4)); - $aFoundCIDs[] = \substr($sSrc, 4); - } - else - { - if (\preg_match('/^http[s]?:\/\//i', $sSrc) || '//' === \substr($sSrc, 0, 2)) - { - if ($bDoNotReplaceExternalUrl) - { - $oElement->setAttribute('src', $sSrc); - } - else - { - $oElement->setAttribute('data-x-src', $sSrc); - if ($fAdditionalExternalFilter) - { - $sCallResult = \call_user_func($fAdditionalExternalFilter, $sSrc); - if (0 < \strlen($sCallResult)) - { - $oElement->setAttribute('data-x-additional-src', $sCallResult); - } - } - } - - $bHasExternals = true; - } - else if ('data:image/' === \strtolower(\substr($sSrc, 0, 11))) - { - $oElement->setAttribute('src', $sSrc); - } - else - { - $oElement->setAttribute('data-x-broken-src', $sSrc); - } - } - } - - $sBackground = $oElement->hasAttribute('background') - ? \trim($oElement->getAttribute('background')) : ''; - $sBackgroundColor = $oElement->hasAttribute('bgcolor') - ? \trim($oElement->getAttribute('bgcolor')) : ''; - - if (!empty($sBackground) || !empty($sBackgroundColor)) - { - $aStyles = array(); - $sStyles = $oElement->hasAttribute('style') - ? \trim(\trim(\trim($oElement->getAttribute('style')), ';')) : ''; - - if (!empty($sBackground)) - { - $aStyles[] = 'background-image: url(\''.$sBackground.'\')'; - $oElement->removeAttribute('background'); - } - - if (!empty($sBackgroundColor)) - { - $aStyles[] = 'background-color: '.$sBackgroundColor; - $oElement->removeAttribute('bgcolor'); - } - - $oElement->setAttribute('style', (empty($sStyles) ? '' : $sStyles.'; ').\implode('; ', $aStyles)); - } - - if ($oElement->hasAttribute('style') && !$oElement->hasAttribute('data-x-skip-style')) - { - $oElement->setAttribute('style', - \MailSo\Base\HtmlUtils::ClearStyle($oElement->getAttribute('style'), $oElement, $bHasExternals, - $aFoundCIDs, $aContentLocationUrls, $aFoundedContentLocationUrls, $bDoNotReplaceExternalUrl, $fAdditionalExternalFilter)); - } - - $oElement->removeAttribute('data-x-skip-style'); - - if (\MailSo\Config::$HtmlStrictDebug && 0 < \count($aRemovedAttrs)) - { - unset($aRemovedAttrs['class'], $aRemovedAttrs['target'], $aRemovedAttrs['id'], $aRemovedAttrs['name'], - $aRemovedAttrs['itemprop'], $aRemovedAttrs['itemscope'], $aRemovedAttrs['itemtype']); - - $aRemovedAttrs = \array_keys($aRemovedAttrs); - if (0 < \count($aRemovedAttrs)) - { - $oElement->setAttribute('data-removed-attrs', \implode(',', $aRemovedAttrs)); - } - } - } - - $sResult = \MailSo\Base\HtmlUtils::GetTextFromDom($oDom, $bWrapByFakeHtmlAndBodyDiv); - unset($oDom); - - return $sResult; - } - - /** - * @param string $sHtml - * @param array $aFoundCids = array() - * @param array|null $mFoundDataURL = null - * @param array $aFoundedContentLocationUrls = array() - * - * @return string - */ - public static function BuildHtml($sHtml, &$aFoundCids = array(), &$mFoundDataURL = null, &$aFoundedContentLocationUrls = array()) - { - $oDom = \MailSo\Base\HtmlUtils::GetDomFromText($sHtml); - - \MailSo\Base\HtmlUtils::ClearTags($oDom); - unset($sHtml); - - $aNodes = $oDom->getElementsByTagName('*'); - foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement) - { - $sTagNameLower = \strtolower($oElement->tagName); - - if ($oElement->hasAttribute('data-x-src-cid')) - { - $sCid = $oElement->getAttribute('data-x-src-cid'); - $oElement->removeAttribute('data-x-src-cid'); - - if (!empty($sCid)) - { - $aFoundCids[] = $sCid; - - @$oElement->removeAttribute('src'); - $oElement->setAttribute('src', 'cid:'.$sCid); - } - } - - if ($oElement->hasAttribute('data-x-src-location')) - { - $sSrc = $oElement->getAttribute('data-x-src-location'); - $oElement->removeAttribute('data-x-src-location'); - - if (!empty($sSrc)) - { - $aFoundedContentLocationUrls[] = $sSrc; - - @$oElement->removeAttribute('src'); - $oElement->setAttribute('src', $sSrc); - } - } - - if ($oElement->hasAttribute('data-x-broken-src')) - { - $oElement->setAttribute('src', $oElement->getAttribute('data-x-broken-src')); - $oElement->removeAttribute('data-x-broken-src'); - } - - if ($oElement->hasAttribute('data-x-src')) - { - $oElement->setAttribute('src', $oElement->getAttribute('data-x-src')); - $oElement->removeAttribute('data-x-src'); - } - - if ($oElement->hasAttribute('data-x-href')) - { - $oElement->setAttribute('href', $oElement->getAttribute('data-x-href')); - $oElement->removeAttribute('data-x-href'); - } - - if ($oElement->hasAttribute('data-x-style-cid-name') && $oElement->hasAttribute('data-x-style-cid')) - { - $sCidName = $oElement->getAttribute('data-x-style-cid-name'); - $sCid = $oElement->getAttribute('data-x-style-cid'); - - $oElement->removeAttribute('data-x-style-cid-name'); - $oElement->removeAttribute('data-x-style-cid'); - if (!empty($sCidName) && !empty($sCid) && \in_array($sCidName, - array('background-image', 'background', 'list-style-image', 'content'))) - { - $sStyles = ''; - if ($oElement->hasAttribute('style')) - { - $sStyles = \trim(\trim($oElement->getAttribute('style')), ';'); - } - - $sBack = $sCidName.': url(cid:'.$sCid.')'; - $sStyles = \preg_replace('/'.\preg_quote($sCidName, '/').':\s?[^;]+/i', $sBack, $sStyles); - if (false === \strpos($sStyles, $sBack)) - { - $sStyles .= empty($sStyles) ? '': '; '; - $sStyles .= $sBack; - } - - $oElement->setAttribute('style', $sStyles); - $aFoundCids[] = $sCid; - } - } - - foreach (array( - 'data-x-additional-src', 'data-x-additional-style-url', 'data-removed-attrs', - 'data-original', 'data-x-div-type', 'data-wrp', 'data-bind' - ) as $sName) - { - if ($oElement->hasAttribute($sName)) - { - $oElement->removeAttribute($sName); - } - } - - if ($oElement->hasAttribute('data-x-style-url')) - { - $sAddStyles = $oElement->getAttribute('data-x-style-url'); - $oElement->removeAttribute('data-x-style-url'); - - if (!empty($sAddStyles)) - { - $sStyles = ''; - if ($oElement->hasAttribute('style')) - { - $sStyles = \trim(\trim($oElement->getAttribute('style')), ';'); - } - - $oElement->setAttribute('style', (empty($sStyles) ? '' : $sStyles.'; ').$sAddStyles); - } - } - - if ('img' === $sTagNameLower && \is_array($mFoundDataURL)) - { - $sSrc = $oElement->getAttribute('src'); - if ('data:image/' === \strtolower(\substr($sSrc, 0, 11))) - { - $sHash = \md5($sSrc); - $mFoundDataURL[$sHash] = $sSrc; - - $oElement->setAttribute('src', 'cid:'.$sHash); - } - } - } - - $sResult = \MailSo\Base\HtmlUtils::GetTextFromDom($oDom, false); - unset($oDom); - - return ''. - ''.$sResult.''; - } - - /** - * @param string $sText - * @param bool $bLinksWithTargetBlank = true - * - * @return string - */ - public static function ConvertPlainToHtml($sText, $bLinksWithTargetBlank = true) - { - $sText = \trim($sText); - if (0 === \strlen($sText)) - { - return ''; - } - - $sText = \MailSo\Base\LinkFinder::NewInstance() - ->Text($sText) - ->UseDefaultWrappers($bLinksWithTargetBlank) - ->CompileText() - ; - - $sText = \str_replace("\r", '', $sText); - - $aText = \explode("\n", $sText); - unset($sText); - - $bIn = false; - $bDo = true; - do - { - $bDo = false; - $aNextText = array(); - foreach ($aText as $sTextLine) - { - $bStart = 0 === \strpos(\ltrim($sTextLine), '>'); - if ($bStart && !$bIn) - { - $bDo = true; - $bIn = true; - $aNextText[] = '
'; - $aNextText[] = \substr(\ltrim($sTextLine), 4); - } - else if (!$bStart && $bIn) - { - $bIn = false; - $aNextText[] = '
'; - $aNextText[] = $sTextLine; - } - else if ($bStart && $bIn) - { - $aNextText[] = \substr(\ltrim($sTextLine), 4); - } - else - { - $aNextText[] = $sTextLine; - } - } - - if ($bIn) - { - $bIn = false; - $aNextText[] = ''; - } - - $aText = $aNextText; - } - while ($bDo); - - $sText = \join("\n", $aText); - unset($aText); - - $sText = \preg_replace('/[\n][ ]+/', "\n", $sText); -// $sText = \preg_replace('/[\s]+([\s])/', '\\1', $sText); - - $sText = \preg_replace('/
").replace(/\n/g,"
"),t?H(e):e}function V(e,t,n,i,a,r,s,c,l,u){var d=null,p=!1,f=0,m=0,h=[];for(u=!_e(u)&&!!u,l=o(l)?l:00&&void 0!==arguments[0]&&arguments[0]?pe.a.delay(e,100):e()}function K(e){Me[e]||(Me[e]=ue()('script[type="application/json"][data-configuration="'+e+'"]'));try{return JSON.parse(Me[e].text())}catch(e){}return{}}function W(e,t){var n=t||e;n&&"function"==typeof n.dispose&&n.dispose()}function Y(e){e&&(Oe(e.disposables)&&pe.a.each(e.disposables,W),fe.a.utils.objectForEach(e,W))}function $(e){e&&(Oe(e)?pe.a.each(e,function(e){$(e)}):e&&e.onDestroy&&e.onDestroy())}function J(e,t){return!(!e||!e[0]||(e[0].styleSheet&&!_e(e[0].styleSheet.cssText)?e[0].styleSheet.cssText=t:e.text(t),0))}function X(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:je,n=ue()("#app-theme-link"),i=function(){Fe=ce.a.setTimeout(function(){return t(be.SaveSettingsStep.Idle)},1e3),Ue=null},o=ue()("#app-theme-style"),a=n.attr("href");a||(a=o.attr("data-href")),a&&("Json/"!==(a=(a=(a=a.toString().replace(/\/-\/[^\/]+\/\-\//,"/-/"+e+"/-/")).replace(/\/Css\/[^\/]+\/User\//,"/Css/0/User/")).replace(/\/Hash\/[^\/]+\//,"/Hash/-/")).substring(a.length-5,a.length)&&(a+="Json/"),ce.a.clearTimeout(Fe),t(be.SaveSettingsStep.Animate),Ue&&Ue.abort&&Ue.abort(),Ue=ue.a.ajax({url:a,dataType:"json"}).then(function(e){e&&Oe(e)&&2===e.length&&(!n||!n[0]||o&&o[0]||(o=ue()(''),n.after(o),n.remove()),o&&o[0]&&J(o,e[1])&&o.attr("data-href",a).attr("data-theme",e[0]),t(be.SaveSettingsStep.TrueResult))}).then(i,i))}function Q(e,t){return function(){var n=e(),i=t(),o=[],a=function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",a={current:e===n,name:""===i?e.toString():i.toString(),custom:""!==i,title:""===i?"":e.toString(),value:e.toString()};t?o.push(a):o.unshift(a)},r=0,s=0,c=2;if(1=n||i-2<=n)&&(c+=2),a(n),r=n,s=n);0=s)a(s,!0),c-=1;else if(0>=r)break;3===r?a(2,!1):3s&&a(Math.round((i+s)/2),!0,"..."),1s&&a(i,!0)}return o}}function Z(e){var t=(e=we(e).toLowerCase()).split(".").pop();return t===e?"":t}function ee(e){var t,n="application/octet-stream";return"winmail.dat"===(e=we(e).toLowerCase())?"application/ms-tnef":((t=Z(e))&&0this.height?[this.width-this.height,0]:[0,this.height-this.width],o.fillStyle="#fff",o.fillRect(0,0,t,t),o.drawImage(this,e[0]/2,e[1]/2,this.width-e[0],this.height-e[1],0,0,t,t),n(i.toDataURL("image/jpeg"))},i.src=e}function oe(e,t){if(e&&"mailto:"===e.toString().substr(0,7).toLowerCase()){if(!t)return!0;var i,o=[],a=null,r=null,c=(e=e.toString().substr(7)).replace(/\?.+$/,""),l=e.replace(/^[^\?]*\?/,""),u=n(44).default;return i=h(l),_e(i.to)?o=u.parseEmailLine(c):(o=u.parseEmailLine(p(c+","+i.to)),o=pe.a.values(o.reduce(function(e,t){return t&&(e[t.email]&&e[t.email].name||(e[t.email]=t)),e},{}))),_e(i.cc)||(a=u.parseEmailLine(p(i.cc))),_e(i.bcc)||(r=u.parseEmailLine(p(i.bcc))),n(9).showScreenPopup(t,[be.ComposeType.Empty,null,o,a,r,_e(i.subject)?null:s(p(i.subject)),_e(i.body)?null:B(s(p(i.body)))]),!0}return!1}function ae(e){ue()(function(){return e()})}function re(){He()}n.r(t);var se=n(3),ce=n.n(se),le=n(7),ue=n.n(le),de=n(4),pe=n.n(de),fe=n(1),me=n(96),he=n.n(me),ge=n(6),be=n(0),ve={eml:"message/rfc822",mime:"message/rfc822",txt:"text/plain",text:"text/plain",def:"text/plain",list:"text/plain",in:"text/plain",ini:"text/plain",log:"text/plain",sql:"text/plain",cfg:"text/plain",conf:"text/plain",asc:"text/plain",rtx:"text/richtext",vcard:"text/vcard",vcf:"text/vcard",htm:"text/html",html:"text/html",csv:"text/csv",ics:"text/calendar",ifb:"text/calendar",xml:"text/xml",json:"application/json",swf:"application/x-shockwave-flash",hlp:"application/winhlp",wgt:"application/widget",chm:"application/vnd.ms-htmlhelp",p10:"application/pkcs10",p7c:"application/pkcs7-mime",p7m:"application/pkcs7-mime",p7s:"application/pkcs7-signature",torrent:"application/x-bittorrent",js:"application/javascript",pl:"text/perl",css:"text/css",asp:"text/asp",php:"application/x-httpd-php",php3:"application/x-httpd-php",php4:"application/x-httpd-php",php5:"application/x-httpd-php",phtml:"application/x-httpd-php",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",jpe:"image/jpeg",jfif:"image/jpeg",gif:"image/gif",bmp:"image/bmp",cgm:"image/cgm",ief:"image/ief",ico:"image/x-icon",tif:"image/tiff",tiff:"image/tiff",svg:"image/svg+xml",svgz:"image/svg+xml",djv:"image/vnd.djvu",djvu:"image/vnd.djvu",webp:"image/webp",zip:"application/zip","7z":"application/x-7z-compressed",rar:"application/x-rar-compressed",exe:"application/x-msdownload",dll:"application/x-msdownload",scr:"application/x-msdownload",com:"application/x-msdownload",bat:"application/x-msdownload",msi:"application/x-msdownload",cab:"application/vnd.ms-cab-compressed",gz:"application/x-gzip",tgz:"application/x-gzip",bz:"application/x-bzip",bz2:"application/x-bzip2",deb:"application/x-debian-package",psf:"application/x-font-linux-psf",otf:"application/x-font-otf",pcf:"application/x-font-pcf",snf:"application/x-font-snf",ttf:"application/x-font-ttf",ttc:"application/x-font-ttf",mp3:"audio/mpeg",amr:"audio/amr",aac:"audio/x-aac",aif:"audio/x-aiff",aifc:"audio/x-aiff",aiff:"audio/x-aiff",wav:"audio/x-wav",wma:"audio/x-ms-wma",wax:"audio/x-ms-wax",midi:"audio/midi",mp4a:"audio/mp4",ogg:"audio/ogg",weba:"audio/webm",ra:"audio/x-pn-realaudio",ram:"audio/x-pn-realaudio",rmp:"audio/x-pn-realaudio-plugin",m3u:"audio/x-mpegurl",flv:"video/x-flv",qt:"video/quicktime",mov:"video/quicktime",wmv:"video/windows-media",avi:"video/x-msvideo",mpg:"video/mpeg",mpeg:"video/mpeg",mpe:"video/mpeg",m1v:"video/mpeg",m2v:"video/mpeg","3gp":"video/3gpp","3g2":"video/3gpp2",h261:"video/h261",h263:"video/h263",h264:"video/h264",jpgv:"video/jpgv",mp4:"video/mp4",mp4v:"video/mp4",mpg4:"video/mp4",ogv:"video/ogg",webm:"video/webm",m4v:"video/x-m4v",asf:"video/x-ms-asf",asx:"video/x-ms-asf",wm:"video/x-ms-wm",wmx:"video/x-ms-wmx",wvx:"video/x-ms-wvx",movie:"video/x-sgi-movie",pdf:"application/pdf",psd:"image/vnd.adobe.photoshop",ai:"application/postscript",eps:"application/postscript",ps:"application/postscript",doc:"application/msword",dot:"application/msword",rtf:"application/rtf",xls:"application/vnd.ms-excel",ppt:"application/vnd.ms-powerpoint",docx:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",dotx:"application/vnd.openxmlformats-officedocument.wordprocessingml.template",pptx:"application/vnd.openxmlformats-officedocument.presentationml.presentation",odt:"application/vnd.oasis.opendocument.text",ods:"application/vnd.oasis.opendocument.spreadsheet"},Se=n(59);n.d(t,"trim",function(){return we}),n.d(t,"inArray",function(){return Ae}),n.d(t,"isArray",function(){return Oe}),n.d(t,"isObject",function(){return Te}),n.d(t,"isFunc",function(){return Ce}),n.d(t,"isUnd",function(){return _e}),n.d(t,"isNull",function(){return Ee}),n.d(t,"has",function(){return De}),n.d(t,"bind",function(){return Ne}),n.d(t,"noop",function(){return je}),n.d(t,"noopTrue",function(){return Re}),n.d(t,"noopFalse",function(){return Ie}),n.d(t,"silentTryCatch",function(){return i}),n.d(t,"isNormal",function(){return o}),n.d(t,"isPosNumeric",function(){return a}),n.d(t,"pInt",function(){return r}),n.d(t,"pString",function(){return s}),n.d(t,"pBool",function(){return c}),n.d(t,"boolToAjax",function(){return l}),n.d(t,"isNonEmptyArray",function(){return u}),n.d(t,"encodeURIComponent",function(){return d}),n.d(t,"decodeURIComponent",function(){return p}),n.d(t,"decodeURI",function(){return f}),n.d(t,"encodeURI",function(){return m}),n.d(t,"simpleQueryParser",function(){return h}),n.d(t,"fakeMd5",function(){return g}),n.d(t,"encodeHtml",function(){return b}),n.d(t,"splitPlainText",function(){return v}),n.d(t,"timeOutAction",function(){return xe}),n.d(t,"timeOutActionSecond",function(){return Pe}),n.d(t,"inFocus",function(){return S}),n.d(t,"removeInFocus",function(){return y}),n.d(t,"removeSelection",function(){return w}),n.d(t,"replySubjectAdd",function(){return A}),n.d(t,"roundNumber",function(){return O}),n.d(t,"friendlySize",function(){return T}),n.d(t,"log",function(){return C}),n.d(t,"delegateRun",function(){return _}),n.d(t,"killCtrlACtrlS",function(){return E}),n.d(t,"createCommandLegacy",function(){return D}),n.d(t,"convertThemeName",function(){return ke}),n.d(t,"quoteName",function(){return N}),n.d(t,"microtime",function(){return j}),n.d(t,"timestamp",function(){return R}),n.d(t,"convertLangName",function(){return I}),n.d(t,"draggablePlace",function(){return x}),n.d(t,"defautOptionsAfterRender",function(){return P}),n.d(t,"clearBqSwitcher",function(){return k}),n.d(t,"previewMessage",function(){return L}),n.d(t,"settingsSaveHelperFunction",function(){return M}),n.d(t,"settingsSaveHelperSimpleFunction",function(){return F}),n.d(t,"settingsSaveHelperSubscribeFunction",function(){return U}),n.d(t,"findEmailAndLinks",function(){return H}),n.d(t,"htmlToPlain",function(){return G}),n.d(t,"plainToHtml",function(){return B}),n.d(t,"folderListOptionsBuilder",function(){return V}),n.d(t,"selectElement",function(){return q}),n.d(t,"detectDropdownVisibility",function(){return Le}),n.d(t,"triggerAutocompleteInputChange",function(){return z}),n.d(t,"getConfigurationFromScriptTag",function(){return K}),n.d(t,"disposeOne",function(){return W}),n.d(t,"disposeObject",function(){return Y}),n.d(t,"delegateRunOnDestroy",function(){return $}),n.d(t,"appendStyles",function(){return J}),n.d(t,"changeTheme",function(){return X}),n.d(t,"computedPagenatorHelper",function(){return Q}),n.d(t,"getFileExtension",function(){return Z}),n.d(t,"mimeContentType",function(){return ee}),n.d(t,"isTransparent",function(){return te}),n.d(t,"getRealHeight",function(){return ne}),n.d(t,"resizeAndCrop",function(){return ie}),n.d(t,"mailToHelper",function(){return oe}),n.d(t,"domReady",function(){return ae}),n.d(t,"windowResize",function(){return He}),n.d(t,"windowResizeCallback",function(){return re}),n.d(t,"jassl",function(){return Se.a});var ye,we=ue.a.trim,Ae=ue.a.inArray,Oe=pe.a.isArray,Te=pe.a.isObject,Ce=pe.a.isFunction,_e=pe.a.isUndefined,Ee=pe.a.isNull,De=pe.a.has,Ne=pe.a.bind,je=function(){},Re=function(){return!0},Ie=function(){return!1},xe=(ye={},function(e,t,n){ye[e]=_e(ye[e])?0:ye[e],ce.a.clearTimeout(ye[e]),ye[e]=ce.a.setTimeout(t,n)}),Pe=function(){var e={};return function(t,n,i){e[t]||(e[t]=ce.a.setTimeout(function(){n(),e[t]=0},i))}}(),ke=pe.a.memoize(function(e){return"@custom"===e.substr(-7)&&(e=we(e.substring(0,e.length-7))),we(e.replace(/[^a-zA-Z0-9]+/g," ").replace(/([A-Z])/g," $1").replace(/[\s]+/g," "))});ce.a.rainloop_Utils_htmlToPlain=G,ce.a.rainloop_Utils_plainToHtml=B;var Le=pe.a.debounce(function(){Object(ge.dropdownVisibility)(!!pe.a.find(ge.data.aBootstrapDropdowns,function(e){return e.hasClass("open")}))},50),Me={},Fe=0,Ue=null,He=pe.a.debounce(function(e){_e(e)||Ee(e)?ge.$win.resize():ce.a.setTimeout(function(){ge.$win.resize()},e)},50),Ge=ce.a.String.substr;"b"!=="ab".substr(-1)&&(Ge=function(e,t,n){return t=0>t?e.length+t:t,e.substr(t,n)},ce.a.String.substr=Ge)},function(e,t){e.exports=window},function(e,t){e.exports=window._},function(e,t,n){"use strict";function i(e){return Object(l.isUnd)(u[e])?null:u[e]}function o(e,t){u[e]=t}function a(e){return Object(l.isUnd)(d[e])?null:d[e]}function r(e){var t=i("Capa");return Object(l.isArray)(t)&&Object(l.isNormal)(e)&&-1"),v=c()("
");v.attr("area","hidden").css({position:"absolute",left:-5e3}).appendTo(g);var S=(new o.a.Date).getTime(),y=!0,w=d.a.observable(!1).extend({rateLimit:0}),A=d.a.observable(!0),O="navigator"in o.a&&"userAgent"in o.a.navigator&&o.a.navigator.userAgent.toLowerCase()||"",T=-11&&void 0!==arguments[1])||arguments[1];return Object(M.createCommandLegacy)(null,e,t)}function a(e,t,n,i){var o=arguments.length>4&&void 0!==arguments[4]&&arguments[4];e.__rlSettingsData={Label:n,Template:t,Route:i,IsDefault:!!o},L.VIEW_MODELS.settings.push(e)}function r(e){L.VIEW_MODELS["settings-removed"].push(e)}function s(e){L.VIEW_MODELS["settings-disabled"].push(e)}function c(){R.a.changed.active=!1}function l(){R.a.changed.active=!0}function u(e){return""===e||Object(M.isUnd)(H[e])?null:H[e]}function d(e){var t=null;return e&&(t=e,e.default&&(t=e.default)),t}function p(e){var t=d(e);t&&t.__vm&&t.__dom&&t.__vm.modalVisibility(!1)}function f(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;_.a.each(t.__names,function(i){Object(k.f)(e,[i,t.__vm,n])})}function m(e,t){if(e&&!e.__builded){var n=null,i=new e(t),a=e.__type||"",r=a?D()("#rl-content #rl-"+a.toLowerCase()):null;e.__builded=!0,e.__vm=i,i.onShowTrigger=N.a.observable(!1),i.onHideTrigger=N.a.observable(!1),i.viewModelName=e.__name,i.viewModelNames=e.__names,i.viewModelTemplateID=e.__templateID,i.viewModelPosition=e.__type,r&&1===r.length?((n=D()("
").addClass("rl-view-model").addClass("RL-"+i.viewModelTemplateID).hide()).appendTo(r),i.viewModelDom=n,e.__dom=n,G.Popup===a&&(i.cancelCommand=i.closeCommand=o(function(){p(e)}),i.modalVisibility.subscribe(function(t){t?(i.viewModelDom.show(),i.storeAndSetKeyScope(),L.popupVisibilityNames.push(i.viewModelName),i.viewModelDom.css("z-index",3e3+Object(L.popupVisibilityNames)().length+10),i.onShowTrigger&&i.onShowTrigger(!i.onShowTrigger()),Object(M.delegateRun)(i,"onShowWithDelay",[],500)):(Object(M.delegateRun)(i,"onHide"),Object(M.delegateRun)(i,"onHideWithDelay",[],500),i.onHideTrigger&&i.onHideTrigger(!i.onHideTrigger()),i.restoreKeyScope(),f("view-model-on-hide",e),L.popupVisibilityNames.remove(i.viewModelName),i.viewModelDom.css("z-index",2e3),_.a.delay(function(){return i.viewModelDom.hide()},300))})),f("view-model-pre-build",e,n),N.a.applyBindingAccessorsToNode(n[0],{translatorInit:!0,template:function(){return{name:i.viewModelTemplateID}}},i),Object(M.delegateRun)(i,"onBuild",[n]),i&&G.Popup===a&&i.registerPopupKeyDown(),f("view-model-post-build",e,n)):Object(M.log)("Cannot find view model position: "+a)}return e?e.__vm:null}function h(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=d(e);n&&(m(n),n.__vm&&n.__dom&&(Object(M.delegateRun)(n.__vm,"onBeforeShow",t||[]),n.__vm.modalVisibility(!0),Object(M.delegateRun)(n.__vm,"onShow",t||[]),f("view-model-on-show",n,t||[])))}function g(e){var t=d(e);t&&(m(t),t.__vm&&t.__dom&&Object(M.delegateRun)(t.__vm,"onWarmUp"))}function b(e){var t=d(e);return!(!t||!t.__vm)&&t.__vm.modalVisibility()}function v(e,t){var n=null,i=!1,o=null;""===Object(M.pString)(e)&&(e=U),""!==e&&((n=u(e))||(n=u(U))&&(t=e+"/"+t,e=U),n&&n.__started&&(i=F&&n===F,n.__builded||(n.__builded=!0,Object(M.isNonEmptyArray)(n.viewModels())&&_.a.each(n.viewModels(),function(e){m(e,n)}),Object(M.delegateRun)(n,"onBuild")),_.a.defer(function(){F&&!i&&(Object(M.delegateRun)(F,"onHide"),Object(M.delegateRun)(F,"onHideWithDelay",[],500),F.onHideTrigger&&F.onHideTrigger(!F.onHideTrigger()),Object(M.isNonEmptyArray)(F.viewModels())&&_.a.each(F.viewModels(),function(e){e.__vm&&e.__dom&&G.Popup!==e.__vm.viewModelPosition&&(e.__dom.hide(),e.__vm.viewModelVisibility(!1),Object(M.delegateRun)(e.__vm,"onHide"),Object(M.delegateRun)(e.__vm,"onHideWithDelay",[],500),e.__vm.onHideTrigger&&e.__vm.onHideTrigger(!e.__vm.onHideTrigger()))})),(F=n)&&!i&&(Object(M.delegateRun)(F,"onShow"),F.onShowTrigger&&F.onShowTrigger(!F.onShowTrigger()),Object(k.f)("screen-on-show",[F.screenName(),F]),Object(M.isNonEmptyArray)(F.viewModels())&&_.a.each(F.viewModels(),function(e){e.__vm&&e.__dom&&G.Popup!==e.__vm.viewModelPosition&&(Object(M.delegateRun)(e.__vm,"onBeforeShow"),e.__dom.show(),e.__vm.viewModelVisibility(!0),Object(M.delegateRun)(e.__vm,"onShow"),e.__vm.onShowTrigger&&e.__vm.onShowTrigger(!e.__vm.onShowTrigger()),Object(M.delegateRun)(e.__vm,"onShowWithDelay",[],200),f("view-model-on-show",e))})),(o=n&&n.__cross?n.__cross():null)&&o.parse(t)})))}function S(e){_.a.each(e,function(e){if(e){var t=new e,n=t?t.screenName():"";t&&""!==n&&(""===U&&(U=n),H[n]=t)}}),_.a.each(H,function(e){e&&!e.__started&&e.__start&&(e.__started=!0,e.__start(),Object(k.f)("screen-pre-start",[e.screenName(),e]),Object(M.delegateRun)(e,"onStart"),Object(k.f)("screen-post-start",[e.screenName(),e]))});var t=x.a.create();t.addRoute(/^([a-zA-Z0-9\-]*)\/?(.*)$/,v),R.a.initialized.add(t.parse,t),R.a.changed.add(t.parse,t),R.a.init(),_.a.delay(function(){return L.$html.removeClass("rl-started-trigger").addClass("rl-started")},100),_.a.delay(function(){return L.$html.addClass("rl-started-delay")},200)}function y(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];e="/"===(e="#"===e.substr(0,1)?e.substr(1):e).substr(0,1)?e.substr(1):e;var i=n?"replaceHash":"setHash";t?(R.a.changed.active=!1,R.a[i](e),R.a.changed.active=!0):(R.a.changed.active=!0,R.a[i](e),R.a.setHash(e))}function w(e){var t=e.name,n=e.type,i=e.templateID;return function(e){e&&(t&&(Object(M.isArray)(t)?e.__names=t:e.__names=[t],e.__name=e.__names[0]),n&&(e.__type=n),i&&(e.__templateID=i))}}function A(e){var t=e.name,n=e.templateID;return w({name:t,type:G.Popup,templateID:n})}function O(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return function(t,n,i){if(!n||!n.match(/Command$/))throw new Error('name "'+n+'" should end with Command suffix');var o=i.value||i.initializer(),a=Object(M.isFunc)(e)?e:function(){return!!e};return i.value=function(){if(a.call(this,this)){for(var e=arguments.length,t=Array(e),n=0;n1&&void 0!==arguments[1]&&arguments[1];m.a.defer(function(){g()("[data-i18n]",e).each(function(e,t){E(t)}),t&&y.bAnimationSupported&&g()(".i18n-animation[data-i18n]",e).letterfx({fx:"fall fade",backwards:!1,timing:50,fx_duration:"50ms",letter_end:"restore",element_end:"restore"})})}function a(){C.forEach(function(e){T[e[0]]=i(e[1])})}function r(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;e&&e(),t?_.subscribe(function(){e&&e(),t&&t()}):e&&_.subscribe(e)}function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return e=p.a.parseInt(e,10)||0,v.Notification.ClientViewError===e&&t?t:(n=n&&p.a.parseInt(n,10)||0,Object(S.isUnd)(T[e])?n&&Object(S.isUnd)(T[n])?T[n]:"":T[e])}function c(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:v.Notification.UnknownNotification;return e&&e.ErrorCode?s(Object(S.pInt)(e.ErrorCode),e.ErrorMessage||""):s(t)}function l(e){var t="";switch(p.a.parseInt(e,10)||0){case v.UploadErrorCode.FileIsTooBig:t=i("UPLOAD/ERROR_FILE_IS_TOO_BIG");break;case v.UploadErrorCode.FilePartiallyUploaded:t=i("UPLOAD/ERROR_FILE_PARTIALLY_UPLOADED");break;case v.UploadErrorCode.FileNoUploaded:t=i("UPLOAD/ERROR_NO_FILE_UPLOADED");break;case v.UploadErrorCode.MissingTempFolder:t=i("UPLOAD/ERROR_MISSING_TEMP_FOLDER");break;case v.UploadErrorCode.FileOnSaveingError:t=i("UPLOAD/ERROR_ON_SAVING_FILE");break;case v.UploadErrorCode.FileType:t=i("UPLOAD/ERROR_FILE_TYPE");break;default:t=i("UPLOAD/ERROR_UNKNOWN")}return t}function u(e,t){var n=Object(S.microtime)();return y.$html.addClass("rl-changing-language"),new p.a.Promise(function(i,o){g.a.ajax({url:Object(A.n)(t,e),dataType:"script",cache:!0}).then(function(){m.a.delay(function(){D();var e=-10&&void 0!==arguments[0]?arguments[0]:"";return W+Object(q.pString)(e)}function r(){return ee?K:Y+te}function s(){return K}function c(e,t,n){return n=Object(q.isUnd)(n)?ne:n,Y+"/Raw/"+$+"/"+n+"/"+e+"/"+$+"/"+t}function l(e,t){return c("Download",e,t)}function u(e,t){return c("View",e,t)}function d(e,t){return c("ViewThumbnail",e,t)}function p(e,t){return c("ViewAsPlain",e,t)}function f(e,t){return c("FramedView",e,t)}function m(e){return Y+"/"+e+"/"+$+"/"+ne+"/"}function h(){return m("Upload")}function g(){return m("UploadContacts")}function b(){return m("UploadBackground")}function v(){return m("Append")}function S(e){return m("Change")+Object(q.encodeURIComponent)(e)+"/"}function y(e){return m("Ajax")+e}function w(e){return Y+"/Raw/"+$+"/"+ne+"/ViewAsPlain/"+$+"/"+e}function A(e){return Y+"/Raw/"+$+"/"+ne+"/Download/"+$+"/"+e}function O(e){return Y+"/Raw/0/Avatar/"+Object(q.encodeURIComponent)(e)+"/"}function T(e){return Y+"/Raw/"+$+"/"+ne+"/UserBackground/"+$+"/"+e}function C(){return Y+"/Info"}function _(e,t){return Y+"/Lang/0/"+(t?"Admin":"App")+"/"+V.a.encodeURI(e)+"/"+J+"/"}function E(){return Y+"/Raw/"+$+"/"+ne+"/ContactsVcf/"}function D(){return Y+"/Raw/"+$+"/"+ne+"/ContactsCsv/"}function N(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Y+"SocialGoogle"+(""!==ne?"/"+$+"/"+ne+"/":"")+(e?"&xauth=1":"")}function j(){return Y+"SocialTwitter"+(""!==ne?"/"+$+"/"+ne+"/":"")}function R(){return Y+"SocialFacebook"+(""!==ne?"/"+$+"/"+ne+"/":"")}function I(e){return Z+e}function x(){return I("css/images/empty-contact.png")}function P(e){return I("sounds/"+e)}function k(){return I("css/images/icom-message-notification.png")}function L(){return I("js/min/openpgp.min.js")}function M(){return I("js/min/openpgp.worker.min.js")}function F(e){var t=Q;return"@custom"===e.substr(-7)&&(e=Object(q.trim)(e.substring(0,e.length-7)),t=X),t+"themes/"+V.a.encodeURI(e)+"/images/preview.png"}function U(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"INBOX";return W+"mailbox/"+e}function H(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return W+"settings"+(e?"/"+e:"")}function G(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";t=Object(q.isNormal)(t)?Object(q.pInt)(t):1,n=Object(q.pString)(n);var o=W+"mailbox/";if(""!==e){var a=Object(q.pInt)(i);o+=V.a.encodeURI(e)+(01&&void 0!==arguments[1])||arguments[1];this.defaultRequest(e,"AdminDomainList",{IncludeAliases:t?"1":"0"})},t.prototype.pluginList=function(e){this.defaultRequest(e,"AdminPluginList")},t.prototype.packagesList=function(e){this.defaultRequest(e,"AdminPackagesList")},t.prototype.coreData=function(e){this.defaultRequest(e,"AdminCoreData")},t.prototype.updateCoreData=function(e){this.defaultRequest(e,"AdminUpdateCoreData",{},9e4)},t.prototype.packageInstall=function(e,t){this.defaultRequest(e,"AdminPackageInstall",{Id:t.id,Type:t.type,File:t.file},6e4)},t.prototype.packageDelete=function(e,t){this.defaultRequest(e,"AdminPackageDelete",{Id:t.id})},t.prototype.domain=function(e,t){this.defaultRequest(e,"AdminDomainLoad",{Name:t})},t.prototype.plugin=function(e,t){this.defaultRequest(e,"AdminPluginLoad",{Name:t})},t.prototype.domainDelete=function(e,t){this.defaultRequest(e,"AdminDomainDelete",{Name:t})},t.prototype.domainDisable=function(e,t,n){return this.defaultRequest(e,"AdminDomainDisable",{Name:t,Disabled:n?"1":"0"})},t.prototype.pluginSettingsUpdate=function(e,t){return this.defaultRequest(e,"AdminPluginSettingsUpdate",t)},t.prototype.licensing=function(e,t){return this.defaultRequest(e,"AdminLicensing",{Force:t?"1":"0"})},t.prototype.licensingActivate=function(e,t,n){return this.defaultRequest(e,"AdminLicensingActivate",{Domain:t,Key:n})},t.prototype.pluginDisable=function(e,t,n){return this.defaultRequest(e,"AdminPluginDisable",{Name:t,Disabled:n?"1":"0"})},t.prototype.createDomainAlias=function(e,t,n){this.defaultRequest(e,"AdminDomainAliasSave",{Name:t,Alias:n})},t.prototype.createOrUpdateDomain=function(e,t,n,i,o,a,r,s,c,l,u,d,p,f,m,h,g,b,v){this.defaultRequest(e,"AdminDomainSave",{Create:t?"1":"0",Name:n,IncHost:i,IncPort:o,IncSecure:a,IncShortLogin:r?"1":"0",UseSieve:s?"1":"0",SieveAllowRaw:c?"1":"0",SieveHost:l,SievePort:u,SieveSecure:d,OutHost:p,OutPort:f,OutSecure:m,OutShortLogin:h?"1":"0",OutAuth:g?"1":"0",OutUsePhpMail:b?"1":"0",WhiteList:v})},t.prototype.testConnectionForDomain=function(e,t,n,i,o,a,r,s,c,l,u,d,p,f){this.defaultRequest(e,"AdminDomainTest",{Name:t,IncHost:n,IncPort:i,IncSecure:o,UseSieve:a?"1":"0",SieveHost:r,SievePort:s,SieveSecure:c,OutHost:l,OutPort:u,OutSecure:d,OutAuth:p?"1":"0",OutUsePhpMail:f?"1":"0"})},t.prototype.testContacts=function(e,t){this.defaultRequest(e,"AdminContactsTest",t)},t.prototype.saveNewAdminPassword=function(e,t){this.defaultRequest(e,"AdminPasswordUpdate",t)},t.prototype.adminPing=function(e){this.defaultRequest(e,"AdminPing")},t}(n(115).a);t.a=new l},function(e,t,n){"use strict";function i(e,t,n){Object(s.isObject)(e)?(n=t||null,t=null,r.a.each(e,function(e,t){i(t,e,n)})):(Object(s.isUnd)(l[e])&&(l[e]=[]),l[e].push([t,n]))}function o(e,t){c.f("rl-pub",[e,t]),Object(s.isUnd)(l[e])||r.a.each(l[e],function(e){e[0]&&e[0].apply(e[1]||null,t||[])})}n.d(t,"b",function(){return i}),n.d(t,"a",function(){return o});var a=n(4),r=n.n(a),s=n(2),c=n(29),l={}},function(e,t,n){"use strict";n.d(t,"i",function(){return i}),n.d(t,"j",function(){return o}),n.d(t,"c",function(){return a}),n.d(t,"g",function(){return r}),n.d(t,"m",function(){return s}),n.d(t,"n",function(){return c}),n.d(t,"l",function(){return l}),n.d(t,"d",function(){return u}),n.d(t,"r",function(){return d}),n.d(t,"b",function(){return p}),n.d(t,"h",function(){return f}),n.d(t,"p",function(){return m}),n.d(t,"o",function(){return h}),n.d(t,"k",function(){return g}),n.d(t,"a",function(){return b}),n.d(t,"q",function(){return v}),n.d(t,"f",function(){return S}),n.d(t,"e",function(){return y});var i=20,o=[10,20,30,50,100],a=50,r=3e4,s=3e5,c=3e5,l=2e5,u=2e5,d="__UNUSE__",p="rlcsc",f=143,m=25,h=4190,g=15,b=7,v=10,S="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAuCAYAAABXuSs3AAAHHklEQVRoQ7VZW08bVxCeXRuwIbTGXIwNtBBaqjwgVUiR8lDlbza9qe1DpVZ9aNQ/0KpPeaJK07SpcuEeCEmUAObm21bfrL9lONjexSYrWfbunj37zXdmvpkz9oIgCKTD0Wg0xPd94TDP83Q0zvWa50vzklSrdanVanqf4/D84GBGr+F+Op3S8fqoJxLOdnZgTvsO/nYhenHA+UC7CWF1uXwkb9++ldPTUwVerVbVqFQqpR8YPjQ0JCMjI5LNDijoRgP3PQVu5+5Eor2XGLg7IV4GkIdHJ/LmzRs5ODiIwNbrdR0O0GCcq4Xz4eFhmZyclP7+tDQaIik/BG5XKQn4SwG3zJTLZXn9+rUclI8UHD5YVoDDN8bSzXhONwL48fFxGR4eilzFZT1uFRIB5yT8BqCdnR3Z3d0VP9Un6XRawYJpggVrZBv38ME4XKtUKnLt2jUplUoy1PR/l3U7T6sVSAQcgMAkj8PDQ9ne3pajoyMRL7zeKsYZWHgWYDGmv78/mmdwcFA+mJlSgziHDWrERrsjEXDXegTi1tZW+DLxI2bxIrqFNYTXyDyCFweMAHCwb8e4RnTNuOsqe3t7sra21pTD0Kct666E8XlcZyzw9/RUUXK5nK5oUinUQI6TQ3cynO/v78vq6qrKXCNwlTiJJpyNGc3nZHp6uqV2dwrQWOCtZBDAV1ZWwsQk7f0wiQn5kffbAu/0/KWBYzIC1+XukfGx0RGZmppKlC2tIV0Bh4aDcZW7HhkfH8urLLZL7T2pihvlkMNnz56FiadHxicL41IsFpN41bkxsYxbRdFo9jwB8KdPn14J8KnSpBQKhQs63nPmbCVRcBUAR2Lq1VVmpksyMTFxAXjcEsQybiegESionjx5osCZOeNe1O4+EhCAX7bQSgQcxRHTMgAgcz5+/Dis/hL4uHU3/B4YGNASGHIKxuEql0k+l05AeIAF1vPnz5VxFFmdDlaJrMtZITJeSsXCOTlMunKxjLtMYOKNjQ158eJFuAuKkUOb5sEwgff19SkJUBVkThZUbnXZrtCKBQ6gbnWIkjZpyne3ejAWoGnA7Icz6irvBLgbOMicCM6TkxPx/LAkbXfgWcsazuE2kFRsKD5Z+CiqDumKncpZvieWcS6dDVD8xiYCNflpJdwcdwJOf9airLmVQ7DPzMxIYWLsXGXoVqLt5k0M3K3JUVPDZdbWNzsCp48TPFdvdnZWUz32nDha7bJ63kgAJPzSdRks9/Kf9xMJAQ1gq2NpaUmy2Yz4zar4nQC3xb99AQwCcGzLAAwuhG8YiWvcOKts+r4GOe5nMhm5efOm9lUA3E3vSZJRrKvE0fnPv//Jy5cvo5cTHIPQbSjhOoqq69evS19f6lxDKK4+sVhigZPtKJqbrQeqxd5+WR4+fKgqgT0k2XX3nhiPgETWXFhYkFzuPZ2yVq1GTSOXpE47/VjgNnD4m4GG7/LhsTx69EiwD4Vr2MwIIxgbAH18fKx1yfz8vEogNvGtWnCuhLZa9UTAreVWFsHy/b/+Vrbdl7E5REMQD2jDoUbByty+/ZnU64GkU2HzyJLhktU1cLv8nARgkYS2d3ajAgwG8qU2oLmDZ92CMaOjo7K4uCiZgbDWaRWgnZhPxLhrMUCvr69riwKZk1LHF7XqrWAO9hJxH6ozNzcnCx/PqztZg9mf6SQMscCtm2C5ke4BGMlHWTUp36036AJajDVrFMzBrhhWslQsSrFYiOqVpMriNYIgqFRq2j3FAb/zffT6zuxFXxsNzs3NTXn16lW4gYiW96w1FyedF+83xG/2FNGCRpU4NjamMsn+OZ9xE5RXqdaDdPpib6RWCzuwKF9RxqI2AVNQBwQYJoK0wdBejnqtEikP3pfP51XjUTESl12FqJEKxsEorARYDD44ONTeID7YpsEnrRvQfWAI2e8WfDaTUSIwJ0iBCmFOtOUAHvVMPp/TPwvYFVYFIuP8l+DBgwdaa2Miqwa0GgYwfeMltovbDfh6c1vIgMYcliSsKv4IWFr6VDHxvldvBAH+1sA+cnl5WYOPmmr9ir+1l9I0Cgz0yjhXjfJJ0JROnmezWbl165ayr/5fqwcBNr7IfhjMqKcvESSM4eRcCasQ3bDNObmKPLdGUGpZsN24cUNLBm9zazu4d++e6qpNBFaTuUS26U5dpuR1CxyA7J9ddrMRqlz4pwLLYawymPd++/2PADt2ugcGwq9gCCdhQ96C6xWwa6j1ceuq+I0EhW0i8MAIVJfeL3d/DVD8EKi12P6/2S2jV/EccVB54O/ejz/9HGCpoBBMta5rXMXLu53D1XAwjhXwvvv+h4BAXVe4bOu3O3ChxF08LiZFG3fel199G9CH3fLyqv24NcB44MRhpdK788U3CpyKwsCw590xmfSpzsBt0Fqc3ud3vtZigxWcVZCklVpSiN0w3q5E/h9TGMIUuA3+EQAAAABJRU5ErkJggg==",y="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC"},function(e,t,n){"use strict";n.d(t,"a",function(){return l});var i=n(8),o=n.n(i),a=n(1),r=n(2),s=n(0),c=n(6),l=function(){function e(){o()(this,e),this.bDisabeCloseOnEsc=!1,this.sDefaultKeyScope=s.KeyState.None,this.sCurrentKeyScope=s.KeyState.None,this.viewModelVisibility=a.a.observable(!1),this.modalVisibility=a.a.observable(!1).extend({rateLimit:0}),this.viewModelName="",this.viewModelNames=[],this.viewModelDom=null}return e.prototype.storeAndSetKeyScope=function(){this.sCurrentKeyScope=Object(c.keyScope)(),Object(c.keyScope)(this.sDefaultKeyScope)},e.prototype.restoreKeyScope=function(){Object(c.keyScope)(this.sCurrentKeyScope)},e.prototype.registerPopupKeyDown=function(){var e=this;c.$win.on("keydown",function(t){if(t&&e.modalVisibility&&e.modalVisibility()){if(!e.bDisabeCloseOnEsc&&s.EventKeyCode.Esc===t.keyCode)return Object(r.delegateRun)(e,"cancelCommand"),!1;if(s.EventKeyCode.Backspace===t.keyCode&&!Object(r.inFocus)())return!1}return!0})},e.prototype.cancelCommand=function(){},e.prototype.closeCommand=function(){},e}()},function(e,t,n){"use strict";var i=n(8),o=n.n(i),a=n(3),r=n.n(a),s=n(1),c=n(7),l=n.n(c),u=n(5),d=function(){function e(){var t=this;o()(this,e),this.google={},this.twitter={},this.facebook={},this.dropbox={},this.google.enabled=s.a.observable(!1),this.google.clientID=s.a.observable(""),this.google.clientSecret=s.a.observable(""),this.google.apiKey=s.a.observable(""),this.google.loading=s.a.observable(!1),this.google.userName=s.a.observable(""),this.google.loggined=s.a.computed(function(){return""!==t.google.userName()}),this.google.capa={},this.google.capa.auth=s.a.observable(!1),this.google.capa.authFast=s.a.observable(!1),this.google.capa.drive=s.a.observable(!1),this.google.capa.preview=s.a.observable(!1),this.google.require={},this.google.require.clientSettings=s.a.computed(function(){return t.google.enabled()&&(t.google.capa.auth()||t.google.capa.drive())}),this.google.require.apiKeySettings=s.a.computed(function(){return t.google.enabled()&&t.google.capa.drive()}),this.facebook.enabled=s.a.observable(!1),this.facebook.appID=s.a.observable(""),this.facebook.appSecret=s.a.observable(""),this.facebook.loading=s.a.observable(!1),this.facebook.userName=s.a.observable(""),this.facebook.supported=s.a.observable(!1),this.facebook.loggined=s.a.computed(function(){return""!==t.facebook.userName()}),this.twitter.enabled=s.a.observable(!1),this.twitter.consumerKey=s.a.observable(""),this.twitter.consumerSecret=s.a.observable(""),this.twitter.loading=s.a.observable(!1),this.twitter.userName=s.a.observable(""),this.twitter.loggined=s.a.computed(function(){return""!==t.twitter.userName()}),this.dropbox.enabled=s.a.observable(!1),this.dropbox.apiKey=s.a.observable("")}return e.prototype.populate=function(){this.google.enabled(!!u.settingsGet("AllowGoogleSocial")),this.google.clientID(u.settingsGet("GoogleClientID")),this.google.clientSecret(u.settingsGet("GoogleClientSecret")),this.google.apiKey(u.settingsGet("GoogleApiKey")),this.google.capa.auth(!!u.settingsGet("AllowGoogleSocialAuth")),this.google.capa.authFast(!!u.settingsGet("AllowGoogleSocialAuthFast")),this.google.capa.drive(!!u.settingsGet("AllowGoogleSocialDrive")),this.google.capa.preview(!!u.settingsGet("AllowGoogleSocialPreview")),this.facebook.enabled(!!u.settingsGet("AllowFacebookSocial")),this.facebook.appID(u.settingsGet("FacebookAppID")),this.facebook.appSecret(u.settingsGet("FacebookAppSecret")),this.facebook.supported(!!u.settingsGet("SupportedFacebookSocial")),this.twitter.enabled=s.a.observable(!!u.settingsGet("AllowTwitterSocial")),this.twitter.consumerKey=s.a.observable(u.settingsGet("TwitterConsumerKey")),this.twitter.consumerSecret=s.a.observable(u.settingsGet("TwitterConsumerSecret")),this.dropbox.enabled(!!u.settingsGet("AllowDropboxSocial")),this.dropbox.apiKey(u.settingsGet("DropboxApiKey"))},e.prototype.appendDropbox=function(){if(!r.a.Dropbox&&this.dropbox.enabled()&&this.dropbox.apiKey()&&!r.a.document.getElementById("dropboxjs")){var e=r.a.document.createElement("script");e.type="text/javascript",e.src="https://www.dropbox.com/static/api/2/dropins.js",l()(e).attr("id","dropboxjs").attr("data-app-key",this.dropbox.apiKey()),r.a.document.body.appendChild(e)}},e}();t.a=new d},,function(e,t,n){"use strict";n.d(t,"a",function(){return u}),n.d(t,"b",function(){return d});var i=n(8),o=n.n(i),a=n(7),r=n.n(a),s=n(1),c=n(2),l=n(10),u=function(){function e(){o()(this,e),this.disposable=[]}return e.prototype.dispose=function(){this.disposable.forEach(function(e){e&&e.dispose&&e.dispose()})},e}(),d=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return{template:t?{element:t}:"",viewModel:{createViewModel:function(t,n){return(t=t||{}).element=null,n&&n.element&&(t.component=n,t.element=r()(n.element),Object(l.i18nToNodes)(t.element),!Object(c.isUnd)(t.inline)&&s.a.unwrap(t.inline)&&t.element.css("display","inline-block")),new e(t)}}}}},,function(e,t,n){"use strict";function i(e,t){Object(f.isFunc)(t)&&(Object(f.isArray)(g[e])||(g[e]=[]),g[e].push(t))}function o(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];Object(f.isArray)(g[e])&&p.a.each(g[e],function(e){e.apply(void 0,t)})}function a(e){return h.settingsGet(e)}function r(e,t,n,i){m.data.__APP__&&m.data.__APP__.remote().defaultRequest(e,"Plugin"+t,n,i)}function s(e,t,n,i){b.push([e,t,n,i])}function c(e,t,n,i){v.push([e,t,n,i])}function l(e){var t=n(9);p.a.each(e?v:b,function(e){t.addSettingsViewModel(e[0],e[1],e[2],e[3])})}function u(e,t){var n=h.settingsGet("Plugins");return(n=n&&!Object(f.isUnd)(n[e])?n[e]:null)?Object(f.isUnd)(n[t])?null:n[t]:null}n.d(t,"a",function(){return i}),n.d(t,"f",function(){return o}),n.d(t,"d",function(){return a}),n.d(t,"e",function(){return r}),n.d(t,"b",function(){return s}),n.d(t,"c",function(){return c}),n.d(t,"g",function(){return l}),n.d(t,"h",function(){return u});var d=n(4),p=n.n(d),f=n(2),m=n(6),h=n(5),g={},b=[],v=[]},,,function(e,t,n){"use strict";var i=n(8),o=n.n(i),a=n(1),r=n(2),s=n(5),c=function(){function e(){o()(this,e),this.languages=a.a.observableArray([]),this.languagesAdmin=a.a.observableArray([]),this.language=a.a.observable("").extend({limitedList:this.languages}).extend({reversible:!0}),this.languageAdmin=a.a.observable("").extend({limitedList:this.languagesAdmin}).extend({reversible:!0}),this.userLanguage=a.a.observable(""),this.userLanguageAdmin=a.a.observable("")}return e.prototype.populate=function(){var e=s.appSettingsGet("languages"),t=s.appSettingsGet("languagesAdmin");this.languages(Object(r.isArray)(e)?e:[]),this.languagesAdmin(Object(r.isArray)(t)?t:[]),this.language(s.settingsGet("Language")),this.languageAdmin(s.settingsGet("LanguageAdmin")),this.userLanguage(s.settingsGet("UserLanguage")),this.userLanguageAdmin(s.settingsGet("UserLanguageAdmin"))},e}();t.a=new c},,function(e,t,n){"use strict";function i(){return y(),v||g()()}function o(){return w(),S||0}function a(e){return i().clone().subtract(e,"days").format("YYYY.MM.DD")}function r(e,t){var n=null,a="",r=o();if((n=0<(e=r<(e=0=t.diff(e,"hours"):return e.fromNow();case t.format("L")===e.format("L"):return Object(b.i18n)("MESSAGE_LIST/TODAY_AT",{TIME:e.format("LT")});case t.clone().subtract(1,"days").format("L")===e.format("L"):return Object(b.i18n)("MESSAGE_LIST/YESTERDAY_AT",{TIME:e.format("LT")});case t.year()===e.year():return e.format("D MMM.")}return e?e.format("LL"):""}(n);break;case"FULL":a=n.format("LLL");break;default:a=n.format(t)}return a}function s(e){var t,n="",i=m()(e);(t=i.data("moment-time"))&&((n=i.data("moment-format"))&&i.text(r(t,n)),(n=i.data("moment-format-title"))&&i.attr("title",r(t,n)))}function c(){p.a.defer(function(){m()(".moment",u.a.document).each(function(e,t){s(t)})})}n.r(t),n.d(t,"momentNow",function(){return i}),n.d(t,"momentNowUnix",function(){return o}),n.d(t,"searchSubtractFormatDateHelper",function(){return a}),n.d(t,"format",function(){return r}),n.d(t,"momentToNode",function(){return s}),n.d(t,"reload",function(){return c});var l=n(3),u=n.n(l),d=n(4),p=n.n(d),f=n(7),m=n.n(f),h=n(54),g=n.n(h),b=n(10),v=null,S=0,y=p.a.debounce(function(){v=g()()},500,!0),w=p.a.debounce(function(){S=g()().unix()},500,!0)},function(e,t){e.exports=window.hasher},,function(e,t,n){"use strict";function i(){return n(172).default}n.d(t,"a",function(){return i})},function(e,t,n){"use strict";var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(3),u=n.n(l),d=n(7),p=n.n(d),f=n(1),m=n(5),h=function(e){function t(){o()(this,t);var n=r()(this,e.call(this));return n.determineUserLanguage=f.a.observable(!1),n.determineUserDomain=f.a.observable(!1),n.weakPassword=f.a.observable(!1),n.useLocalProxyForExternalImages=f.a.observable(!1),n.dataFolderAccess=f.a.observable(!1),n}return c()(t,e),t.prototype.populate=function(){var t=this;e.prototype.populate.call(this),this.determineUserLanguage(!!Object(m.settingsGet)("DetermineUserLanguage")),this.determineUserDomain(!!Object(m.settingsGet)("DetermineUserDomain")),this.weakPassword(!!Object(m.settingsGet)("WeakPassword")),this.useLocalProxyForExternalImages(!!Object(m.settingsGet)("UseLocalProxyForExternalImages")),Object(m.settingsGet)("Auth")&&p.a.get("./data/VERSION?"+u.a.Math.random()).then(function(){return t.dataFolderAccess(!0)})},t}(n(116).a);t.a=new h},function(e,t,n){"use strict";var i=n(8),o=n.n(i),a=n(1),r=n(2),s=n(5),c=function(){function e(){o()(this,e),this.themes=a.a.observableArray([]),this.themeBackgroundName=a.a.observable(""),this.themeBackgroundHash=a.a.observable(""),this.theme=a.a.observable("").extend({limitedList:this.themes})}return e.prototype.populate=function(){var e=s.appSettingsGet("themes");this.themes(Object(r.isArray)(e)?e:[]),this.theme(s.settingsGet("Theme")),this.themeBackgroundName(s.settingsGet("UserBackgroundName")),this.themeBackgroundHash(s.settingsGet("UserBackgroundHash"))},e}();t.a=new c},function(e,t){var n=e.exports={version:"2.5.1"};"number"==typeof __e&&(__e=n)},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t,n){e.exports=!n(51)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t,n){var i=n(109),o=n(73);e.exports=function(e){return i(o(e))}},function(e,t,n){"use strict";n.r(t),n.d(t,"EmailModel",function(){return u}),n.d(t,"default",function(){return u});var i=n(8),o=n.n(i),a=n(4),r=n.n(a),s=n(76),c=n.n(s),l=n(2),u=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";o()(this,e),this.email="",this.name="",this.dkimStatus="",this.dkimValue="",this.email=t,this.name=n,this.dkimStatus=i,this.dkimValue=a,this.clearDuplicateName()}return e.newInstanceFromJson=function(t){var n=new e;return n.initByJson(t)?n:null},e.prototype.clear=function(){this.email="",this.name="",this.dkimStatus="none",this.dkimValue=""},e.prototype.validate=function(){return""!==this.name||""!==this.email},e.prototype.hash=function(){return"#"+(arguments.length>0&&void 0!==arguments[0]&&arguments[0]?"":this.name)+"#"+this.email+"#"},e.prototype.clearDuplicateName=function(){this.name===this.email&&(this.name="")},e.prototype.search=function(e){return-1<(this.name+" "+this.email).toLowerCase().indexOf(e.toLowerCase())},e.prototype.initByJson=function(e){var t=!1;return e&&"Object/Email"===e["@Object"]&&(this.name=Object(l.trim)(e.Name),this.email=Object(l.trim)(e.Email),this.dkimStatus=Object(l.trim)(e.DkimStatus||""),this.dkimValue=Object(l.trim)(e.DkimValue||""),t=""!==this.email,this.clearDuplicateName()),t},e.prototype.toLine=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i="";return""!==this.email&&(e&&""!==this.name?i=t?'
")+'" target="_blank" tabindex="-1">'+Object(l.encodeHtml)(this.name)+"":n?Object(l.encodeHtml)(this.name):this.name:(i=this.email,""!==this.name?t?i=Object(l.encodeHtml)('"'+this.name+'" <')+'")+'" target="_blank" tabindex="-1">'+Object(l.encodeHtml)(i)+""+Object(l.encodeHtml)(">"):(i='"'+this.name+'" <'+i+">",n&&(i=Object(l.encodeHtml)(i))):t&&(i=''+Object(l.encodeHtml)(this.email)+""))),i},e.splitEmailLine=function(t){var n=c()(t);if(Object(l.isNonEmptyArray)(n)){var i=[],o=!1;return n.forEach(function(t){var n=t.address?new e(t.address.replace(/^[<]+(.*)[>]+$/g,"$1"),t.name||""):null;n&&n.email&&(o=!0),i.push(n?n.toLine(!1):t.name)}),o?i:null}return null},e.parseEmailLine=function(t){var n=c()(t);return Object(l.isNonEmptyArray)(n)?r.a.compact(n.map(function(t){return t.address?new e(t.address.replace(/^[<]+(.*)[>]+$/g,"$1"),t.name||""):null})):[]},e.prototype.parse=function(e){if(""===(e=Object(l.trim)(e)))return!1;var t=c()(e);return!(!Object(l.isNonEmptyArray)(t)||!t[0]||(this.name=t[0].name||"",this.email=t[0].address||"",this.clearDuplicateName(),0))},e}()},,function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t,n){"use strict";n.d(t,"a",function(){return p});var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(1),u=n(2),d=n(0),p=function(e){function t(n){o()(this,t);var i=r()(this,e.call(this));return i.value=n.value||"",i.size=n.size||0,i.label=n.label||"",i.preLabel=n.preLabel||"",i.enable=!!Object(u.isUnd)(n.enable)||n.enable,i.trigger=n.trigger&&n.trigger.subscribe?n.trigger:null,i.placeholder=n.placeholder||"",i.labeled=!Object(u.isUnd)(n.label),i.preLabeled=!Object(u.isUnd)(n.preLabel),i.triggered=!Object(u.isUnd)(n.trigger)&&!!i.trigger,i.classForTrigger=l.a.observable(""),i.className=l.a.computed(function(){var e=l.a.unwrap(i.size),t=i.trigger?" "+Object(u.trim)("settings-saved-trigger-input "+i.classForTrigger()):"";return(01&&void 0!==arguments[1]&&arguments[1];if(!a.a.Promise||!a.a.Promise.all)throw new Error("Promises are not available your environment.");if(!e)throw new Error("src should not be empty.");return new a.a.Promise(function(n,i){var o=a.a.document.createElement("script");o.onload=function(){n(e)},o.onerror=function(){i(new Error(e))},o.async=!0===t,o.src=e,a.a.document.body.appendChild(o)})}n.d(t,"a",function(){return i});var o=n(3),a=n.n(o)},function(e,t,n){var i=n(85)("wks"),o=n(70),a=n(41).Symbol,r="function"==typeof a;(e.exports=function(e){return i[e]||(i[e]=r&&a[e]||(r?a:o)("Symbol."+e))}).store=i},function(e,t,n){var i=n(52);e.exports=function(e){if(!i(e))throw TypeError(e+" is not an object!");return e}},,,function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){"use strict";n.d(t,"a",function(){return u});var i=n(8),o=n.n(i),a=n(4),r=n.n(a),s=n(75),c=n.n(s),l=n(2),u=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];o()(this,e),this.oCross=null,this.sScreenName=t,this.aViewModels=Object(l.isArray)(n)?n:[]}return e.prototype.viewModels=function(){return this.aViewModels},e.prototype.screenName=function(){return this.sScreenName},e.prototype.routes=function(){return null},e.prototype.__cross=function(){return this.oCross},e.prototype.__start=function(){var e=null,t=null,n=this.routes();Object(l.isNonEmptyArray)(n)&&(t=r.a.bind(this.onRoute||l.noop,this),e=c.a.create(),n.forEach(function(n){n&&e&&(e.addRoute(n[0],t).rules=n[1])}),this.oCross=e)},e}()},function(e,t){e.exports=window.ssm},function(e,t,n){var i=n(52);e.exports=function(e,t){if(!i(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!i(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!i(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!i(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},function(e,t,n){"use strict";var i=n(8),o=n.n(i),a=n(1);t.a=new function e(){o()(this,e),this.domains=a.a.observableArray([]),this.domains.loading=a.a.observable(!1).extend({throttle:100}),this.domainsWithoutAliases=this.domains.filter(function(e){return e&&!e.alias})}},,function(e,t){var n=0,i=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+i).toString(36))}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,n){var i=n(71),o=n(64),a=n(43),r=n(67),s=n(46),c=n(77),l=Object.getOwnPropertyDescriptor;t.f=n(42)?l:function(e,t){if(e=a(e),t=r(t,!0),c)try{return l(e,t)}catch(e){}if(s(e,t))return o(!i.f.call(e,t),e[t])}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){"use strict";n.d(t,"a",function(){return d});var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(1),u=n(2),d=function(e){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};o()(this,t);var i=r()(this,e.call(this));return i.value=n.value,!Object(u.isUnd)(i.value)&&i.value.subscribe||(i.value=l.a.observable(!Object(u.isUnd)(i.value)&&!!i.value)),i.enable=n.enable,!Object(u.isUnd)(i.enable)&&i.enable.subscribe||(i.enable=l.a.observable(!!Object(u.isUnd)(i.enable)||!!i.enable)),i.disable=n.disable,!Object(u.isUnd)(i.disable)&&i.disable.subscribe||(i.disable=l.a.observable(!Object(u.isUnd)(i.disable)&&!!i.disable)),i.label=n.label||"",i.inline=!Object(u.isUnd)(n.inline)&&n.inline,i.readOnly=!Object(u.isUnd)(n.readOnly)&&!!n.readOnly,i.inverted=!Object(u.isUnd)(n.inverted)&&!!n.inverted,i.labeled=!Object(u.isUnd)(n.label),i.labelAnimated=!!n.labelAnimated,i}return c()(t,e),t.prototype.click=function(){this.readOnly||!this.enable()||this.disable()||this.value(!this.value())},t}(n(27).a)},function(e,t){e.exports=window.crossroads},function(e,t,n){"use strict";function i(e){var t=[],n=[],o=[];return new r(e).tokenize().forEach(function(e){"operator"!==e.type||","!==e.value&&";"!==e.value?n.push(e):(n.length&&t.push(n),n=[])}),n.length&&t.push(n),t.forEach(function(e){(e=function(e){for(var t=!1,n="text",o=void 0,a=[],r={address:[],comment:[],group:[],text:[]},s=0,c=e.length;s=0;u--)if(r.text[u].match(/^[^@\s]+@[^@\s]+$/)){r.address=r.text.splice(u,1);break}if(!r.address.length)for(var d=r.text.length-1;d>=0&&(r.text[d]=r.text[d].replace(/\s*\b[^@\s]+@[^@\s]+\b\s*/,function(e){return r.address.length?e:(r.address=[e.trim()]," ")}).trim(),!r.address.length);d--);}if(!r.text.length&&r.comment.length&&(r.text=r.comment,r.comment=[]),r.address.length>1&&(r.text=r.text.concat(r.address.splice(1))),r.text=r.text.join(" "),r.address=r.address.join(" "),!r.address&&t)return[];(o={address:r.address||r.text||"",name:r.text||r.address||""}).address===o.name&&((o.address||"").match(/@/)?o.name="":o.address=""),a.push(o)}return a}(e)).length&&(o=o.concat(e))}),o}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n",",":"",":":";",";":""},r=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.str=(t||"").toString(),this.operatorCurrent="",this.operatorExpecting="",this.node=null,this.escaped=!1,this.list=[]}return o(e,[{key:"tokenize",value:function(){for(var e=void 0,t=[],n=0,i=this.str.length;ndocument.F=Object<\/script>"),e.close(),c=e.F;i--;)delete c.prototype[a[i]];return c()};e.exports=Object.create||function(e,t){var n;return null!==e?(s.prototype=i(e),n=new s,s.prototype=null,n[r]=e):n=c(),void 0===t?n:o(n,t)}},function(e,t){e.exports={}},function(e,t){e.exports=!0},function(e,t){var n=Math.ceil,i=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?i:n)(e)}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){var i=n(52),o=n(41).document,a=i(o)&&i(o.createElement);e.exports=function(e){return a?o.createElement(e):{}}},function(e,t,n){var i=n(112);e.exports=function(e,t,n){if(i(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,o){return e.call(t,n,i,o)}}return function(){return e.apply(t,arguments)}}},function(e,t,n){"use strict";n.r(t),n.d(t,"HtmlEditor",function(){return m}),n.d(t,"default",function(){return m});var i=n(8),o=n.n(i),a=n(3),r=n.n(a),s=n(4),c=n.n(s),l=n(7),u=n.n(l),d=n(6),p=n(0),f=n(5),m=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;o()(this,e),this.blurTimer=0,this.__resizable=!1,this.__inited=!1,this.onBlur=null,this.onReady=null,this.onModeChange=null,this.onBlur=n,this.onReady=i,this.onModeChange=a,this.element=t,this.$element=u()(t),this.resize=c.a.throttle(c.a.bind(this.resizeEditor,this),100),this.init()}return e.prototype.runOnBlur=function(){this.onBlur&&this.onBlur()},e.prototype.blurTrigger=function(){var e=this;this.onBlur&&(r.a.clearTimeout(this.blurTimer),this.blurTimer=r.a.setTimeout(function(){e.runOnBlur()},p.Magics.Time200ms))},e.prototype.focusTrigger=function(){this.onBlur&&r.a.clearTimeout(this.blurTimer)},e.prototype.isHtml=function(){return!!this.editor&&"wysiwyg"===this.editor.mode},e.prototype.clearCachedSignature=function(){this.editor&&this.editor.execCommand("insertSignature",{clearCache:!0})},e.prototype.setSignature=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];this.editor&&this.editor.execCommand("insertSignature",{isHtml:t,insertBefore:n,signature:e})},e.prototype.checkDirty=function(){return!!this.editor&&this.editor.checkDirty()},e.prototype.resetDirty=function(){this.editor&&this.editor.resetDirty()},e.prototype.getData=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t="";if(this.editor)try{t="plain"===this.editor.mode&&this.editor.plugins.plain&&this.editor.__plain?this.editor.__plain.getRawData():e?'
'+this.editor.getData()+"
":this.editor.getData()}catch(e){}return t},e.prototype.getDataWithHtmlMark=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return(this.isHtml()?":HTML:":"")+this.getData(e)},e.prototype.modeToggle=function(e,t){if(this.editor){try{e?"plain"===this.editor.mode&&this.editor.setMode("wysiwyg"):"wysiwyg"===this.editor.mode&&this.editor.setMode("plain")}catch(e){}t&&this.resize()}},e.prototype.setHtmlOrPlain=function(e,t){":HTML:"===e.substr(0,6)?this.setHtml(e.substr(6),t):this.setPlain(e,t)},e.prototype.setHtml=function(e,t){if(this.editor&&this.__inited){this.clearCachedSignature(),this.modeToggle(!0),e=e.replace(/]*><\/p>/gi,"");try{this.editor.setData(e)}catch(e){}t&&this.focus()}},e.prototype.replaceHtml=function(e,t){if(this.editor&&this.__inited&&"wysiwyg"===this.editor.mode)try{this.editor.setData(this.editor.getData().replace(e,t))}catch(e){}},e.prototype.setPlain=function(e,t){if(this.editor&&this.__inited){if(this.clearCachedSignature(),this.modeToggle(!1),"plain"===this.editor.mode&&this.editor.plugins.plain&&this.editor.__plain)this.editor.__plain.setRawData(e);else try{this.editor.setData(e)}catch(e){}t&&this.focus()}},e.prototype.init=function(){var e=this;if(this.element&&!this.editor){var t=function(){var t=d.htmlEditorDefaultConfig,n=f.settingsGet("Language"),i=!!f.appSettingsGet("allowHtmlEditorSourceButton"),o=!!f.appSettingsGet("allowHtmlEditorBitiButtons");!i&&o||t.toolbarGroups.__cfgInited||(t.toolbarGroups.__cfgInited=!0,i&&(t.removeButtons=t.removeButtons.replace(",Source","")),o||(t.removePlugins+=(t.removePlugins?",":"")+"bidi")),t.enterMode=r.a.CKEDITOR.ENTER_BR,t.shiftEnterMode=r.a.CKEDITOR.ENTER_P,t.language=d.htmlEditorLangsMap[(n||"en").toLowerCase()]||"en",r.a.CKEDITOR.env&&(r.a.CKEDITOR.env.isCompatible=!0),e.editor=r.a.CKEDITOR.appendTo(e.element,t),e.editor.on("key",function(e){return!e||!e.data||p.EventKeyCode.Tab!==e.data.keyCode}),e.editor.on("blur",function(){e.blurTrigger()}),e.editor.on("mode",function(){e.blurTrigger(),e.onModeChange&&e.onModeChange("plain"!==e.editor.mode)}),e.editor.on("focus",function(){e.focusTrigger()}),r.a.FileReader&&e.editor.on("drop",function(t){if(0')},o.readAsDataURL(n),t.data.dataTransfer.setData("text/html",i)}}}),e.editor.on("instanceReady",function(){e.editor.removeMenuItem&&(e.editor.removeMenuItem("cut"),e.editor.removeMenuItem("copy"),e.editor.removeMenuItem("paste")),e.__resizable=!0,e.__inited=!0,e.resize(),e.onReady&&e.onReady()})};r.a.CKEDITOR?t():r.a.__initEditor=t}},e.prototype.focus=function(){if(this.editor)try{this.editor.focus()}catch(e){}},e.prototype.hasFocus=function(){if(this.editor)try{return!!this.editor.focusManager.hasFocus}catch(e){}return!1},e.prototype.blur=function(){if(this.editor)try{this.editor.focusManager.blur(!0)}catch(e){}},e.prototype.resizeEditor=function(){if(this.editor&&this.__resizable)try{this.editor.resize(this.$element.width(),this.$element.innerHeight())}catch(e){}},e.prototype.setReadOnly=function(e){if(this.editor)try{this.editor.setReadOnly(!!e)}catch(e){}},e.prototype.clear=function(e){this.setHtml("",e)},e}()},function(e,t){e.exports=window.Autolinker},function(e,t,n){!function(t,i){"use strict";var o;try{o=n(54)}catch(e){}e.exports=function(e){var t="function"==typeof e,n=!!window.addEventListener,i=window.document,o=window.setTimeout,a=function(e,t,i,o){n?e.addEventListener(t,i,!!o):e.attachEvent("on"+t,i)},r=function(e,t,i,o){n?e.removeEventListener(t,i,!!o):e.detachEvent("on"+t,i)},s=function(e,t){return-1!==(" "+e.className+" ").indexOf(" "+t+" ")},c=function(e){return/Array/.test(Object.prototype.toString.call(e))},l=function(e){return/Date/.test(Object.prototype.toString.call(e))&&!isNaN(e.getTime())},u=function(e){var t=e.getDay();return 0===t||6===t},d=function(e,t){return[31,function(e){return e%4==0&&e%100!=0||e%400==0}(e)?29:28,31,30,31,30,31,31,30,31,30,31][t]},p=function(e){l(e)&&e.setHours(0,0,0,0)},f=function(e,t){return e.getTime()===t.getTime()},m=function(e,t,n){var i,o;for(i in t)(o=void 0!==e[i])&&"object"==typeof t[i]&&null!==t[i]&&void 0===t[i].nodeName?l(t[i])?n&&(e[i]=new Date(t[i].getTime())):c(t[i])?n&&(e[i]=t[i].slice(0)):e[i]=m({},t[i],n):!n&&o||(e[i]=t[i]);return e},h=function(e,t,n){var o;i.createEvent?((o=i.createEvent("HTMLEvents")).initEvent(t,!0,!1),o=m(o,n),e.dispatchEvent(o)):i.createEventObject&&(o=i.createEventObject(),o=m(o,n),e.fireEvent("on"+t,o))},g=function(e){return e.month<0&&(e.year-=Math.ceil(Math.abs(e.month)/12),e.month+=12),e.month>11&&(e.year+=Math.floor(Math.abs(e.month)/12),e.month-=12),e},b={field:null,bound:void 0,position:"bottom left",reposition:!0,format:"YYYY-MM-DD",toString:null,parse:null,defaultDate:null,setDefaultDate:!1,firstDay:0,formatStrict:!1,minDate:null,maxDate:null,yearRange:10,showWeekNumber:!1,pickWholeWeek:!1,minYear:0,maxYear:9999,minMonth:void 0,maxMonth:void 0,startRange:null,endRange:null,isRTL:!1,yearSuffix:"",showMonthAfterYear:!1,showDaysInNextAndPreviousMonths:!1,enableSelectionDaysInNextAndPreviousMonths:!1,numberOfMonths:1,mainCalendar:"left",container:void 0,blurFieldOnSelect:!0,i18n:{previousMonth:"Previous Month",nextMonth:"Next Month",months:["January","February","March","April","May","June","July","August","September","October","November","December"],weekdays:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],weekdaysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},theme:null,events:[],onSelect:null,onOpen:null,onClose:null,onDraw:null,keyboardInput:!0},v=function(e,t,n){for(t+=e.firstDay;t>=7;)t-=7;return n?e.i18n.weekdaysShort[t]:e.i18n.weekdays[t]},S=function(e){var t=[],n="false";if(e.isEmpty){if(!e.showDaysInNextAndPreviousMonths)return'';t.push("is-outside-current-month"),e.enableSelectionDaysInNextAndPreviousMonths||t.push("is-selection-disabled")}return e.isDisabled&&t.push("is-disabled"),e.isToday&&t.push("is-today"),e.isSelected&&(t.push("is-selected"),n="true"),e.hasEvent&&t.push("has-event"),e.isInRange&&t.push("is-inrange"),e.isStartRange&&t.push("is-startrange"),e.isEndRange&&t.push("is-endrange"),'"},y=function(e,t,n,i){return''+(t?e.reverse():e).join("")+""},w=function(e,t,n,i,o,a){var r,s,l,u,d,p=e._o,f=n===p.minYear,m=n===p.maxYear,h='
',g=!0,b=!0;for(l=[],r=0;r<12;r++)l.push('");for(u='
'+p.i18n.months[i]+'
",c(p.yearRange)?(r=p.yearRange[0],s=p.yearRange[1]+1):(r=n-p.yearRange,s=1+n+p.yearRange),l=[];r=p.minYear&&l.push('");return d='
'+n+p.yearSuffix+'
",p.showMonthAfterYear?h+=d+u:h+=u+d,f&&(0===i||p.minMonth>=i)&&(g=!1),m&&(11===i||p.maxMonth<=i)&&(b=!1),0===t&&(h+='"),t===e._o.numberOfMonths-1&&(h+='"),h+="
"},A=function(r){var c=this,u=c.config(r);c._onMouseDown=function(e){if(c._v){var t=(e=e||window.event).target||e.srcElement;if(t)if(s(t,"is-disabled")||(!s(t,"pika-button")||s(t,"is-empty")||s(t.parentNode,"is-disabled")?s(t,"pika-prev")?c.prevMonth():s(t,"pika-next")&&c.nextMonth():(c.setDate(new Date(t.getAttribute("data-pika-year"),t.getAttribute("data-pika-month"),t.getAttribute("data-pika-day"))),u.bound&&o(function(){c.hide(),u.blurFieldOnSelect&&u.field&&u.field.blur()},100))),s(t,"pika-select"))c._c=!0;else{if(!e.preventDefault)return e.returnValue=!1,!1;e.preventDefault()}}},c._onChange=function(e){var t=(e=e||window.event).target||e.srcElement;t&&(s(t,"pika-select-month")?c.gotoMonth(t.value):s(t,"pika-select-year")&&c.gotoYear(t.value))},c._onKeyChange=function(e){if(e=e||window.event,c.isVisible())switch(e.keyCode){case 13:case 27:u.field&&u.field.blur();break;case 37:e.preventDefault(),c.adjustDate("subtract",1);break;case 38:c.adjustDate("subtract",7);break;case 39:c.adjustDate("add",1);break;case 40:c.adjustDate("add",7)}},c._onInputChange=function(n){var i;n.firedBy!==c&&(i=u.parse?u.parse(u.field.value,u.format):t?(i=e(u.field.value,u.format,u.formatStrict))&&i.isValid()?i.toDate():null:new Date(Date.parse(u.field.value)),l(i)&&c.setDate(i),c._v||c.show())},c._onInputFocus=function(){c.show()},c._onInputClick=function(){c.show()},c._onInputBlur=function(){var e=i.activeElement;do{if(s(e,"pika-single"))return}while(e=e.parentNode);c._c||(c._b=o(function(){c.hide()},50)),c._c=!1},c._onClick=function(e){var t=(e=e||window.event).target||e.srcElement,i=t;if(t){!n&&s(t,"pika-select")&&(t.onchange||(t.setAttribute("onchange","return;"),a(t,"change",c._onChange)));do{if(s(i,"pika-single")||i===u.trigger)return}while(i=i.parentNode);c._v&&t!==u.trigger&&i!==u.trigger&&c.hide()}},c.el=i.createElement("div"),c.el.className="pika-single"+(u.isRTL?" is-rtl":"")+(u.theme?" "+u.theme:""),a(c.el,"mousedown",c._onMouseDown,!0),a(c.el,"touchend",c._onMouseDown,!0),a(c.el,"change",c._onChange),u.keyboardInput&&a(i,"keydown",c._onKeyChange),u.field&&(u.container?u.container.appendChild(c.el):u.bound?i.body.appendChild(c.el):u.field.parentNode.insertBefore(c.el,u.field.nextSibling),a(u.field,"change",c._onInputChange),u.defaultDate||(t&&u.field.value?u.defaultDate=e(u.field.value,u.format).toDate():u.defaultDate=new Date(Date.parse(u.field.value)),u.setDefaultDate=!0));var d=u.defaultDate;l(d)?u.setDefaultDate?c.setDate(d,!0):c.gotoDate(d):c.gotoDate(new Date),u.bound?(this.hide(),c.el.className+=" is-bound",a(u.trigger,"click",c._onInputClick),a(u.trigger,"focus",c._onInputFocus),a(u.trigger,"blur",c._onInputBlur)):this.show()};return A.prototype={config:function(e){this._o||(this._o=m({},b,!0));var t=m(this._o,e,!0);t.isRTL=!!t.isRTL,t.field=t.field&&t.field.nodeName?t.field:null,t.theme="string"==typeof t.theme&&t.theme?t.theme:null,t.bound=!!(void 0!==t.bound?t.field&&t.bound:t.field),t.trigger=t.trigger&&t.trigger.nodeName?t.trigger:t.field,t.disableWeekends=!!t.disableWeekends,t.disableDayFn="function"==typeof t.disableDayFn?t.disableDayFn:null;var n=parseInt(t.numberOfMonths,10)||1;if(t.numberOfMonths=n>4?4:n,l(t.minDate)||(t.minDate=!1),l(t.maxDate)||(t.maxDate=!1),t.minDate&&t.maxDate&&t.maxDate100&&(t.yearRange=100);return t},toString:function(n){return n=n||this._o.format,l(this._d)?this._o.toString?this._o.toString(this._d,n):t?e(this._d).format(n):this._d.toDateString():""},getMoment:function(){return t?e(this._d):null},setMoment:function(n,i){t&&e.isMoment(n)&&this.setDate(n.toDate(),i)},getDate:function(){return l(this._d)?new Date(this._d.getTime()):null},setDate:function(e,t){if(!e)return this._d=null,this._o.field&&(this._o.field.value="",h(this._o.field,"change",{firedBy:this})),this.draw();if("string"==typeof e&&(e=new Date(Date.parse(e))),l(e)){var n=this._o.minDate,i=this._o.maxDate;l(n)&&ei&&(e=i),this._d=new Date(e.getTime()),p(this._d),this.gotoDate(this._d),this._o.field&&(this._o.field.value=this.toString(),h(this._o.field,"change",{firedBy:this})),t||"function"!=typeof this._o.onSelect||this._o.onSelect.call(this,this.getDate())}},gotoDate:function(e){var t=!0;if(l(e)){if(this.calendars){var n=new Date(this.calendars[0].year,this.calendars[0].month,1),i=new Date(this.calendars[this.calendars.length-1].year,this.calendars[this.calendars.length-1].month,1),o=e.getTime();i.setMonth(i.getMonth()+1),i.setDate(i.getDate()-1),t=o=a&&(this._y=a,!isNaN(s)&&this._m>s&&(this._m=s)),t="pika-title-"+Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,2);for(var l=0;l'+w(this,l,this.calendars[l].year,this.calendars[l].month,this.calendars[0].year,t)+this.render(this.calendars[l].year,this.calendars[l].month,t)+"";this.el.innerHTML=c,n.bound&&"hidden"!==n.field.type&&o(function(){n.trigger.focus()},1),"function"==typeof this._o.onDraw&&this._o.onDraw(this),n.bound&&n.field.setAttribute("aria-label","Use the arrow keys to pick a date")}},adjustPosition:function(){var e,t,n,o,a,r,s,c,l,u;if(!this._o.container){if(this.el.style.position="absolute",t=e=this._o.trigger,n=this.el.offsetWidth,o=this.el.offsetHeight,a=window.innerWidth||i.documentElement.clientWidth,r=window.innerHeight||i.documentElement.clientHeight,s=window.pageYOffset||i.body.scrollTop||i.documentElement.scrollTop,"function"==typeof e.getBoundingClientRect)c=(u=e.getBoundingClientRect()).left+window.pageXOffset,l=u.bottom+window.pageYOffset;else for(c=t.offsetLeft,l=t.offsetTop+t.offsetHeight;t=t.offsetParent;)c+=t.offsetLeft,l+=t.offsetTop;(this._o.reposition&&c+n>a||this._o.position.indexOf("right")>-1&&c-n+e.offsetWidth>0)&&(c=c-n+e.offsetWidth),(this._o.reposition&&l+o>r+s||this._o.position.indexOf("top")>-1&&l-o-e.offsetHeight>0)&&(l=l-o-e.offsetHeight),this.el.style.left=c+"px",this.el.style.top=l+"px"}},render:function(e,t,n){var i=this._o,o=new Date,a=d(e,t),r=new Date(e,t,1).getDay(),s=[],c=[];p(o),i.firstDay>0&&(r-=i.firstDay)<0&&(r+=7);for(var m=0===t?11:t-1,h=11===t?0:t+1,g=0===t?e-1:e,b=11===t?e+1:e,w=d(g,m),A=a+r,O=A;O>7;)O-=7;A+=7-O;for(var T,C,_,E,D=!1,N=0,j=0;N=a+r,L=N-r+1,M=t,F=e,U=i.startRange&&f(i.startRange,R),H=i.endRange&&f(i.endRange,R),G=i.startRange&&i.endRange&&i.startRangei.maxDate||i.disableWeekends&&u(R)||i.disableDayFn&&i.disableDayFn(R);k&&(N'+Math.ceil(((new Date(_,C,T)-E)/864e5+E.getDay()+1)/7)+"")),s.push(y(c,i.isRTL,i.pickWholeWeek,D)),c=[],j=0,D=!1)}return function(e,t,n){return''+function(e){var t,n=[];for(e.showWeekNumber&&n.push(""),t=0;t<7;t++)n.push('");return""+(e.isRTL?n.reverse():n).join("")+""}(i)+""+t.join("")+"
'+v(e,t,!0)+"
"}(0,s,n)},isVisible:function(){return this._v},show:function(){var e,t,n;this.isVisible()||(this._v=!0,this.draw(),e=this.el,t="is-hidden",e.className=(n=(" "+e.className+" ").replace(" "+t+" "," ")).trim?n.trim():n.replace(/^\s+|\s+$/g,""),this._o.bound&&(a(i,"click",this._onClick),this.adjustPosition()),"function"==typeof this._o.onOpen&&this._o.onOpen.call(this))},hide:function(){var e,t,n=this._v;!1!==n&&(this._o.bound&&r(i,"click",this._onClick),this.el.style.position="static",this.el.style.left="auto",this.el.style.top="auto",e=this.el,s(e,t="is-hidden")||(e.className=""===e.className?t:e.className+" "+t),this._v=!1,void 0!==n&&"function"==typeof this._o.onClose&&this._o.onClose.call(this))},destroy:function(){var e=this._o;this.hide(),r(this.el,"mousedown",this._onMouseDown,!0),r(this.el,"touchend",this._onMouseDown,!0),r(this.el,"change",this._onChange),e.keyboardInput&&r(i,"keydown",this._onKeyChange),e.field&&(r(e.field,"change",this._onInputChange),e.bound&&(r(e.trigger,"click",this._onInputClick),r(e.trigger,"focus",this._onInputFocus),r(e.trigger,"blur",this._onInputBlur))),this.el.parentNode&&this.el.parentNode.removeChild(this.el)}},A}(o)}()},,function(e,t,n){"use strict";n.r(t),n.d(t,"AskPopupView",function(){return v}),n.d(t,"default",function(){return v});var i,o=n(8),a=n.n(o),r=n(12),s=n.n(r),c=n(11),l=n.n(c),u=n(1),d=n(19),p=n.n(d),f=n(0),m=n(2),h=n(10),g=n(9),b=n(24),v=Object(g.popup)({name:"View/Popup/Ask",templateID:"PopupsAsk"})(i=function(e){function t(){a()(this,t);var n=s()(this,e.call(this));return n.askDesc=u.a.observable(""),n.yesButton=u.a.observable(""),n.noButton=u.a.observable(""),n.yesFocus=u.a.observable(!1),n.noFocus=u.a.observable(!1),n.fYesAction=null,n.fNoAction=null,n.bFocusYesOnShow=!0,n.bDisabeCloseOnEsc=!0,n.sDefaultKeyScope=f.KeyState.PopupAsk,n}return l()(t,e),t.prototype.clearPopup=function(){this.askDesc(""),this.yesButton(Object(h.i18n)("POPUPS_ASK/BUTTON_YES")),this.noButton(Object(h.i18n)("POPUPS_ASK/BUTTON_NO")),this.yesFocus(!1),this.noFocus(!1),this.fYesAction=null,this.fNoAction=null},t.prototype.yesClick=function(){this.cancelCommand(),Object(m.isFunc)(this.fYesAction)&&this.fYesAction.call(null)},t.prototype.noClick=function(){this.cancelCommand(),Object(m.isFunc)(this.fNoAction)&&this.fNoAction.call(null)},t.prototype.onShow=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",a=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];this.clearPopup(),this.fYesAction=t||null,this.fNoAction=n||null,this.askDesc(e||""),i&&this.yesButton(i),o&&this.noButton(o),this.bFocusYesOnShow=!!a},t.prototype.onShowWithDelay=function(){this.bFocusYesOnShow&&this.yesFocus(!0)},t.prototype.onBuild=function(){var e=this;p()("tab, shift+tab, right, left",f.KeyState.PopupAsk,function(){return e.yesFocus()?e.noFocus(!0):e.yesFocus(!0),!1}),p()("esc",f.KeyState.PopupAsk,function(){return e.noClick(),!1})},t}(b.a))||i},,function(e,t,n){"use strict";n.r(t),n.d(t,"LanguagesPopupView",function(){return g}),n.d(t,"default",function(){return g});var i,o=n(8),a=n.n(o),r=n(12),s=n.n(r),c=n(11),l=n.n(c),u=n(4),d=n.n(u),p=n(1),f=n(2),m=n(9),h=n(24),g=Object(m.popup)({name:"View/Popup/Languages",templateID:"PopupsLanguages"})(i=function(e){function t(){a()(this,t);var n=s()(this,e.call(this));return n.fLang=null,n.userLanguage=p.a.observable(""),n.langs=p.a.observableArray([]),n.languages=p.a.computed(function(){var e=n.userLanguage();return d.a.map(n.langs(),function(t){return{key:t,user:t===e,selected:p.a.observable(!1),fullName:Object(f.convertLangName)(t)}})}),n.langs.subscribe(function(){n.setLanguageSelection()}),n}return l()(t,e),t.prototype.languageTooltipName=function(e){var t=Object(f.convertLangName)(e,!0);return Object(f.convertLangName)(e,!1)===t?"":t},t.prototype.setLanguageSelection=function(){var e=this.fLang?p.a.unwrap(this.fLang):"";d.a.each(this.languages(),function(t){t.selected(t.key===e)})},t.prototype.onBeforeShow=function(){this.fLang=null,this.userLanguage(""),this.langs([])},t.prototype.onShow=function(e,t,n){this.fLang=e,this.userLanguage(n||""),this.langs(t)},t.prototype.changeLanguage=function(e){this.fLang&&this.fLang(e),this.cancelCommand()},t}(h.a))||i},function(e,t,n){var i=n(104),o=n(84).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return i(e,o)}},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t,n){var i=n(46),o=n(43),a=n(163)(!1),r=n(86)("IE_PROTO");e.exports=function(e,t){var n,s=o(e),c=0,l=[];for(n in s)n!=r&&i(s,n)&&l.push(n);for(;t.length>c;)i(s,n=t[c++])&&(~a(l,n)||l.push(n));return l}},function(e,t,n){e.exports=n(53)},function(e,t,n){"use strict";var i=n(90),o=n(58),a=n(105),r=n(53),s=n(46),c=n(89),l=n(165),u=n(83),d=n(159),p=n(60)("iterator"),f=!([].keys&&"next"in[].keys()),m=function(){return this};e.exports=function(e,t,n,h,g,b,v){l(n,t,h);var S,y,w,A=function(e){if(!f&&e in _)return _[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},O=t+" Iterator",T="values"==g,C=!1,_=e.prototype,E=_[p]||_["@@iterator"]||g&&_[g],D=E||A(g),N=g?T?A("entries"):D:void 0,j="Array"==t&&_.entries||E;if(j&&(w=d(j.call(new e)))!==Object.prototype&&w.next&&(u(w,O,!0),i||s(w,p)||r(w,p,m)),T&&E&&"values"!==E.name&&(C=!0,D=function(){return E.call(this)}),i&&!v||!f&&!C&&_[p]||r(_,p,D),c[t]=D,c[O]=m,g)if(S={values:T?D:A("values"),keys:b?D:A("keys"),entries:N},v)for(y in S)y in _||a(_,y,S[y]);else o(o.P+o.F*(f||C),t,S);return S}},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var o=i(n(169)),a=i(n(153)),r="function"==typeof a.default&&"symbol"==typeof o.default?function(e){return typeof e}:function(e){return e&&"function"==typeof a.default&&e.constructor===a.default&&e!==a.default.prototype?"symbol":typeof e};t.default="function"==typeof a.default&&"symbol"===r(o.default)?function(e){return void 0===e?"undefined":r(e)}:function(e){return e&&"function"==typeof a.default&&e.constructor===a.default&&e!==a.default.prototype?"symbol":void 0===e?"undefined":r(e)}},function(e,t,n){var i=n(58),o=n(40),a=n(51);e.exports=function(e,t){var n=(o.Object||{})[e]||Object[e],r={};r[e]=t(n),i(i.S+i.F*a(function(){n(1)}),"Object",r)}},function(e,t,n){var i=n(92);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==i(e)?e.split(""):Object(e)}},function(e,t,n){var i=n(43),o=n(72).f;n(108)("getOwnPropertyDescriptor",function(){return function(e,t){return o(i(e),t)}})},function(e,t,n){n(110);var i=n(40).Object;e.exports=function(e,t){return i.getOwnPropertyDescriptor(e,t)}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t,n){"use strict";function i(){var e;null===N&&((N=f()("
")).appendTo(w.$body),e=N,j||(j=new R(e),g.a.applyBindingAccessorsToNode(e[0],{translatorInit:!0,template:function(){return{name:"Cmd"}}},j)))}var o=n(8),a=n.n(o),r=n(12),s=n.n(r),c=n(11),l=n.n(c),u=n(3),d=n.n(u),p=n(7),f=n.n(p),m=n(4),h=n.n(m),g=n(1),b=n(19),v=n.n(b),S=n(66),y=n.n(S),w=n(6),A=n(2),O=n(0),T=n(16),C=n(10),_=n(5),E=n(39),D=n(32),N=null,j=null,R=function(){function e(t){a()(this,e),this.dom=null,this.opened=g.a.observable(!1),this.cmd=g.a.observable(""),this.focused=g.a.observable(!1),this.themes=E.a.themes,this.cmdHistory=[],this.cmdHistoryShift=0,this.cmdHelper=g.a.observable(""),this.cmds=["help","version","clear","theme","lang"],this.cmdsWithParameters=["theme","lang"],this.isAdmin=!1,this.dom=t,this.isAdmin=!!_.appSettingsGet("admin")}return e.prototype.runCmd=function(e,t,i){var o,a,r,s="",c=null;if(this.cmdHelper(""),i){switch(e){case"lang":c=(this.isAdmin?D.a.languagesAdmin():D.a.languages()).filter(function(e){return 0===e.lastIndexOf(t,0)});break;case"theme":c=E.a.themes().filter(function(e){return 0===e.lastIndexOf(t,0)})}if(e&&c)if(1===c.length&&c[0])this.cmd(e+" "+c[0]);else if(1").html(n(129).replace("{{ cmd }}",i))),c&&l.append(f()("
").html(c)),h.a.delay(function(){t.dom.find(".rl-cmd-history").scrollTop(l.height())},50))}return!0},e.prototype.onEsc=function(){return this.opened(!1),!1},e.prototype.onTab=function(){return this.onCmd(!0),!1},e.prototype.onEnter=function(){return this.onCmd(!1),this.cmd(""),!1},e.prototype.onKeyDown=function(e){if(e&&e.keyCode&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&0').appendTo("body"),w.$win.on("error",function(e){if(e&&e.originalEvent&&e.originalEvent.message&&-1===Object(A.inArray)(e.originalEvent.message,["Script error.","Uncaught Error: Error calling method on NPObject."])){var t=Object(A.timestamp)();if(o.lastErrorTime>=t)return;o.lastErrorTime=t,n.jsError(A.noop,e.originalEvent.message,e.originalEvent.filename,e.originalEvent.lineno,d.a.location&&d.a.location.toString?d.a.location.toString():"",w.$html.attr("class"),Object(A.microtime)()-w.startMicrotime)}}),w.$win.on("resize",function(){I.a("window.resize")}),I.b("window.resize",h.a.throttle(function(){var e=w.$win.height(),t=w.$win.height();w.$win.__sizes[0]===e&&w.$win.__sizes[1]===t||(w.$win.__sizes[0]=e,w.$win.__sizes[1]=t,I.a("window.resize.real"))},O.Magics.Time50ms)),w.$doc.on("keydown",function(e){e&&e.ctrlKey&&w.$html.addClass("rl-ctrl-key-pressed")}).on("keyup",function(e){e&&!e.ctrlKey&&w.$html.removeClass("rl-ctrl-key-pressed")}),w.$doc.on("mousemove keypress click",h.a.debounce(function(){I.a("rl.auto-logout-refresh")},O.Magics.Time5s)),v()("esc, enter",O.KeyState.All,function(){Object(A.detectDropdownVisibility)()}),_.appSettingsGet("allowCmdInterface")&&v()("ctrl+shift+`",O.KeyState.All,function(){_.appSettingsGet("allowCmdInterface")&&(i(),h.a.delay(function(){j&&(j.opened(!j.opened()),j.opened()&&h.a.delay(function(){j&&j.focused&&j.focused(!0)},O.Magics.Time50ms))},O.Magics.Time50ms))}),o}return l()(t,e),t.prototype.remote=function(){return null},t.prototype.data=function(){return null},t.prototype.getApplicationConfiguration=function(e,t){return this.applicationConfiguration[e]||t},t.prototype.download=function(e){if(w.sUserAgent&&(-10&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=!!_.appSettingsGet("inIframe"),o=Object(A.pString)(_.appSettingsGet("customLogoutLink"));t&&this.clearClientSideToken(),t&&n&&d.a.close&&d.a.close(),o=o||(e?Object(T.x)():Object(T.y)()),t&&d.a.location.href!==o?h.a.delay(function(){i&&d.a.parent?d.a.parent.location.href=o:d.a.location.href=o,w.$win.trigger("rl.tooltips.diactivate")},O.Magics.Time100ms):(Object(P.routeOff)(),Object(P.setHash)(Object(T.w)(),!0),Object(P.routeOff)(),h.a.delay(function(){i&&d.a.parent?d.a.parent.location.reload():d.a.location.reload(),w.$win.trigger("rl.tooltips.diactivate")},O.Magics.Time100ms))},t.prototype.historyBack=function(){d.a.history.back()},t.prototype.bootstart=function(){I.a("rl.bootstart");var e=_.appSettingsGet("mobile");g.a.components.register("SaveTrigger",n(128).default),g.a.components.register("Input",n(127).default),g.a.components.register("Select",n(126).default),g.a.components.register("Radio",n(121).default),g.a.components.register("TextArea",n(125).default),g.a.components.register("Date",n(124).default),g.a.components.register("x-script",n(123).default),_.appSettingsGet("materialDesign")&&w.bAnimationSupported?(g.a.components.register("Checkbox",n(122).default),g.a.components.register("CheckboxSimple",n(80).default)):(g.a.components.register("Checkbox",n(80).default),g.a.components.register("CheckboxSimple",n(80).default)),Object(C.initOnStartOrLangChange)(C.initNotificationLanguage),h.a.delay(A.windowResizeCallback,O.Magics.Time1s),I.b("ssm.mobile-enter",function(){Object(w.leftPanelDisabled)(!0)}),I.b("ssm.mobile-leave",function(){Object(w.leftPanelDisabled)(!1)}),e?(w.$html.addClass("ssm-state-mobile").addClass("rl-mobile"),I.a("ssm.mobile-enter")):(w.$html.addClass("rl-desktop"),y.a.addState({id:"mobile",query:"(max-width: 767px)",onEnter:function(){w.$html.addClass("ssm-state-mobile"),I.a("ssm.mobile-enter")},onLeave:function(){w.$html.removeClass("ssm-state-mobile"),I.a("ssm.mobile-leave")}}),y.a.addState({id:"tablet",query:"(min-width: 768px) and (max-width: 999px)",onEnter:function(){w.$html.addClass("ssm-state-tablet")},onLeave:function(){w.$html.removeClass("ssm-state-tablet")}}),y.a.addState({id:"desktop",query:"(min-width: 1000px) and (max-width: 1400px)",onEnter:function(){w.$html.addClass("ssm-state-desktop")},onLeave:function(){w.$html.removeClass("ssm-state-desktop")}}),y.a.addState({id:"desktop-large",query:"(min-width: 1401px)",onEnter:function(){w.$html.addClass("ssm-state-desktop-large")},onLeave:function(){w.$html.removeClass("ssm-state-desktop-large")}})),w.leftPanelDisabled.subscribe(function(e){w.$html.toggleClass("rl-left-panel-disabled",e),w.$html.toggleClass("rl-left-panel-enabled",!e)}),w.leftPanelType.subscribe(function(e){w.$html.toggleClass("rl-left-panel-none","none"===e),w.$html.toggleClass("rl-left-panel-short","short"===e)}),w.leftPanelDisabled.valueHasMutated(),D.a.populate(),E.a.populate(),x.a.populate()},t}(k)},function(e,t,n){"use strict";n.d(t,"a",function(){return v});var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(4),u=n.n(l),d=n(7),p=n.n(d),f=n(1),m=n(6),h=n(2),g=n(16),b=n(9),v=function(e){function t(n){o()(this,t);var i=r()(this,e.call(this,"settings",n));return i.menu=f.a.observableArray([]),i.oCurrentSubScreen=null,i.oViewModelPlace=null,i.setupSettings(),i}return c()(t,e),t.prototype.setupSettings=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;e&&e()},t.prototype.onRoute=function(e){var t=this,n=null,i=null,o=null,a=null;if((i=u.a.find(m.VIEW_MODELS.settings,function(t){return t&&t.__rlSettingsData&&e===t.__rlSettingsData.Route}))&&(u.a.find(m.VIEW_MODELS["settings-removed"],function(e){return e&&e===i})&&(i=null),i&&u.a.find(m.VIEW_MODELS["settings-disabled"],function(e){return e&&e===i})&&(i=null)),i){if(i.__builded&&i.__vm)n=i.__vm;else if((o=this.oViewModelPlace)&&1===o.length){n=new i,(a=p()("
").addClass("rl-settings-view-model").hide()).appendTo(o),n.viewModelDom=a,n.__rlSettingsData=i.__rlSettingsData,i.__dom=a,i.__builded=!0,i.__vm=n;var r={name:i.__rlSettingsData.Template};f.a.applyBindingAccessorsToNode(a[0],{translatorInit:!0,template:function(){return r}},n),Object(h.delegateRun)(n,"onBuild",[a])}else Object(h.log)("Cannot find sub settings view model position: SettingsSubScreen");n&&u.a.defer(function(){t.oCurrentSubScreen&&(Object(h.delegateRun)(t.oCurrentSubScreen,"onHide"),t.oCurrentSubScreen.viewModelDom.hide()),t.oCurrentSubScreen=n,t.oCurrentSubScreen&&(Object(h.delegateRun)(t.oCurrentSubScreen,"onBeforeShow"),t.oCurrentSubScreen.viewModelDom.show(),Object(h.delegateRun)(t.oCurrentSubScreen,"onShow"),Object(h.delegateRun)(t.oCurrentSubScreen,"onShowWithDelay",[],200),u.a.each(t.menu(),function(e){e.selected(n&&n.__rlSettingsData&&e.route===n.__rlSettingsData.Route)}),p()("#rl-content .b-settings .b-content .content").scrollTop(0)),Object(h.windowResize)()})}else Object(b.setHash)(Object(g.z)(),!1,!0)},t.prototype.onHide=function(){this.oCurrentSubScreen&&this.oCurrentSubScreen.viewModelDom&&(Object(h.delegateRun)(this.oCurrentSubScreen,"onHide"),this.oCurrentSubScreen.viewModelDom.hide())},t.prototype.onBuild=function(){var e=this;u.a.each(m.VIEW_MODELS.settings,function(t){t&&t.__rlSettingsData&&!u.a.find(m.VIEW_MODELS["settings-removed"],function(e){return e&&e===t})&&e.menu.push({route:t.__rlSettingsData.Route,label:t.__rlSettingsData.Label,selected:f.a.observable(!1),disabled:!!u.a.find(m.VIEW_MODELS["settings-disabled"],function(e){return e&&e===t})})}),this.oViewModelPlace=p()("#rl-content #rl-settings-subscreen")},t.prototype.routes=function(){var e=u.a.find(m.VIEW_MODELS.settings,function(e){return e&&e.__rlSettingsData&&e.__rlSettingsData.IsDefault}),t=e&&e.__rlSettingsData?e.__rlSettingsData.Route:"general",n={subname:/^(.*)$/,normalize_:function(e,n){return n.subname=Object(h.isUnd)(n.subname)?t:Object(h.pString)(n.subname),[n.subname]}};return[["{subname}/",n],["{subname}",n],["",n]]},t}(n(65).a)},function(e,t,n){"use strict";n.d(t,"a",function(){return v});var i=n(8),o=n.n(i),a=n(3),r=n.n(a),s=n(4),c=n.n(s),l=n(7),u=n.n(l),d=n(23),p=n(0),f=n(2),m=n(6),h=n(16),g=n(29),b=n(5),v=function(){function e(){o()(this,e),this.oRequests={}}return e.prototype.defaultResponse=function(e,t,n,i,o,a){var r=function(){p.StorageResultType.Success!==n&&m.data.bUnload&&(n=p.StorageResultType.Unload),p.StorageResultType.Success===n&&i&&!i.Result?(i&&-12&&void 0!==arguments[2]?arguments[2]:2e4,o=this,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:[],l=""===a,d=(new r.a.Date).getTime();(n=(t=t||{}).Action||"")&&0(new r.a.Date).getTime()-d),n&&o.oRequests[n]&&(o.oRequests[n].__aborted&&(a="abort"),o.oRequests[n]=null),o.defaultResponse(e,n,a,i,s,t)}),n&&03&&void 0!==arguments[3]&&arguments[3];this.defaultRequest(e,"JsInfo",{Type:t,Data:n,IsError:i?"1":"0"})},e.prototype.getPublicKey=function(e){this.defaultRequest(e,"GetPublicKey")},e.prototype.jsVersion=function(e,t){this.defaultRequest(e,"Version",{Version:t})},e}()},function(e,t,n){"use strict";n.d(t,"a",function(){return c});var i=n(8),o=n.n(i),a=n(1),r=n(6),s=n(5),c=function(){function e(){o()(this,e),this.allowLanguagesOnSettings=a.a.observable(!0),this.allowLanguagesOnLogin=a.a.observable(!0),this.newMoveToFolder=a.a.observable(!0),this.interfaceAnimation=a.a.observable(!0),this.interfaceAnimation.subscribe(function(e){var t=r.bMobileDevice||!e;r.$html.toggleClass("rl-anim",!t).toggleClass("no-rl-anim",t)}),this.interfaceAnimation.valueHasMutated(),this.prem=a.a.observable(!1),this.community=a.a.observable(!0)}return e.prototype.populate=function(){this.allowLanguagesOnLogin(!!s.settingsGet("AllowLanguagesOnLogin")),this.allowLanguagesOnSettings(!!s.settingsGet("AllowLanguagesOnSettings")),this.newMoveToFolder(!!s.settingsGet("NewMoveToFolder")),this.interfaceAnimation(!!s.settingsGet("InterfaceAnimation")),this.prem(!!s.settingsGet("PremType")),this.community(!!s.settingsGet("Community"))},e}()},function(e,t,n){"use strict";var i=n(3),o=n.n(i),a=n(2),r=n(6),s=n(0),c=n(29),l=n(10),u=n(44);t.a=function(e){r.data.__APP__=e,r.$win.on("keydown",a.killCtrlACtrlS).on("unload",function(){r.data.bUnload=!0}),r.$html.addClass(r.bMobileDevice?"mobile":"no-mobile").on("click.dropdown.data-api",a.detectDropdownVisibility);var t=o.a.rl||{};t.i18n=l.i18n,t.createCommand=a.createCommandLegacy,t.addSettingsViewModel=c.b,t.addSettingsViewModelForAdmin=c.c,t.addHook=c.a,t.settingsGet=c.d,t.pluginSettingsGet=c.h,t.pluginRemoteRequest=c.e,t.EmailModel=u.EmailModel,t.Enums=s,o.a.rl=t,o.a.__APP_BOOT=function(t){Object(a.domReady)(function(){o.a.setTimeout(function(){o.a.rainloopTEMPLATES&&o.a.rainloopTEMPLATES[0]?(o.a.document.getElementById("rl-templates").innerHTML=o.a.rainloopTEMPLATES[0],o.a.setTimeout(function(){r.$html.removeClass("no-js rl-booted-trigger").addClass("rl-booted"),e.bootstart()},s.Magics.Time10ms)):t(),o.a.__APP_BOOT=null},s.Magics.Time10ms)})}}},,,,function(e,t,n){"use strict";n.r(t);var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(27),u=n(4),d=n.n(u),p=n(1),f=n(2),m=function(e){function t(){return o()(this,t),r()(this,e.apply(this,arguments))}return c()(t,e),t}(function(e){function t(n){o()(this,t);var i=r()(this,e.call(this));return i.values=p.a.observableArray([]),i.value=n.value,!Object(f.isUnd)(i.value)&&i.value.subscribe||(i.value=p.a.observable("")),i.inline=!Object(f.isUnd)(n.inline)&&n.inline,i.readOnly=!Object(f.isUnd)(n.readOnly)&&!!n.readOnly,n.values&&i.values(d.a.map(n.values,function(e,t){return{label:e,value:t}})),i.click=d.a.bind(i.click,i),i}return c()(t,e),t.prototype.click=function(e){!this.readOnly&&e&&this.value(e.value)},t}(l.a));t.default=Object(l.b)(m,"RadioComponent")},function(e,t,n){"use strict";n.r(t);var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(4),u=n.n(l),d=n(1),p=n(27),f=function(e){function t(n){o()(this,t);var i=r()(this,e.call(this,n));return i.animationBox=d.a.observable(!1).extend({falseTimeout:200}),i.animationCheckmark=d.a.observable(!1).extend({falseTimeout:200}),i.animationBoxSetTrue=u.a.bind(i.animationBoxSetTrue,i),i.animationCheckmarkSetTrue=u.a.bind(i.animationCheckmarkSetTrue,i),i.disposable.push(i.value.subscribe(function(e){i.triggerAnimation(e)},i)),i}return c()(t,e),t.prototype.animationBoxSetTrue=function(){this.animationBox(!0)},t.prototype.animationCheckmarkSetTrue=function(){this.animationCheckmark(!0)},t.prototype.triggerAnimation=function(e){e?(this.animationBoxSetTrue(),u.a.delay(this.animationCheckmarkSetTrue,200)):(this.animationCheckmarkSetTrue(),u.a.delay(this.animationBoxSetTrue,200))},t}(n(74).a);t.default=Object(p.b)(f,"CheckboxMaterialDesignComponent")},function(e,t,n){"use strict";n.r(t);var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(7),u=n.n(l),d=n(27),p=function(e){function t(n){o()(this,t);var i=r()(this,e.call(this));if(n.component&&n.component.templateNodes&&n.element&&n.element[0]&&n.element[0].outerHTML){var a=n.element[0].outerHTML;(a=a?a.replace(/<\/b><\/x-script>/i,"<\/script>"):"")?(n.element.text(""),n.element.replaceWith(u()(a).text(n.component.templateNodes[0]&&n.component.templateNodes[0].nodeValue?n.component.templateNodes[0].nodeValue:""))):n.element.remove()}return i}return c()(t,e),t}(d.a);t.default=Object(d.b)(p,"ScriptComponent")},function(e,t,n){"use strict";n.r(t);var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(27),u=function(e){function t(){return o()(this,t),r()(this,e.apply(this,arguments))}return c()(t,e),t}(n(47).a);t.default=Object(l.b)(u,"DateComponent")},function(e,t,n){"use strict";n.r(t);var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(2),u=n(27),d=5,p=function(e){function t(n){o()(this,t);var i=r()(this,e.call(this,n));return i.rows=n.rows||d,i.spellcheck=!Object(l.isUnd)(n.spellcheck)&&!!n.spellcheck,i}return c()(t,e),t}(n(47).a);t.default=Object(u.b)(p,"TextAreaComponent")},function(e,t,n){"use strict";n.r(t);var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(10),u=n(2),d=n(27),p=function(e){function t(n){o()(this,t);var i=r()(this,e.call(this,n));return i.options=n.options||"",i.optionsText=n.optionsText||null,i.optionsValue=n.optionsValue||null,i.optionsCaption=n.optionsCaption||null,i.optionsCaption&&(i.optionsCaption=Object(l.i18n)(i.optionsCaption)),i.defautOptionsAfterRender=u.defautOptionsAfterRender,i}return c()(t,e),t}(n(47).a);t.default=Object(d.b)(p,"SelectComponent")},function(e,t,n){"use strict";n.r(t);var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(27),u=function(e){function t(){return o()(this,t),r()(this,e.apply(this,arguments))}return c()(t,e),t}(n(47).a);t.default=Object(l.b)(u,"InputComponent")},function(e,t,n){"use strict";n.r(t);var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(2),u=n(0),d=n(27),p=function(e){function t(n){o()(this,t);var i=r()(this,e.call(this));return i.element=n.element||null,i.value=n.value&&n.value.subscribe?n.value:null,i.element&&(i.value?(i.element.css("display","inline-block"),n.verticalAlign&&i.element.css("vertical-align",n.verticalAlign),i.setState(i.value()),i.disposable.push(i.value.subscribe(i.setState,i))):i.element.hide()),i}return c()(t,e),t.prototype.setState=function(e){switch(Object(l.pInt)(e)){case u.SaveSettingsStep.TrueResult:this.element.find(".animated,.error").hide().removeClass("visible").end().find(".success").show().addClass("visible");break;case u.SaveSettingsStep.FalseResult:this.element.find(".animated,.success").hide().removeClass("visible").end().find(".error").show().addClass("visible");break;case u.SaveSettingsStep.Animate:this.element.find(".error,.success").hide().removeClass("visible").end().find(".animated").show().addClass("visible");break;case u.SaveSettingsStep.Idle:default:this.element.find(".animated").hide().end().find(".error,.success").removeClass("visible")}},t}(d.a);t.default=Object(d.b)(p,"SaveTriggerComponent")},function(e,t){e.exports='> {{ cmd }}'},function(e,t){e.exports=' version: {{ version }}'},function(e,t){e.exports='lang [{{ langs }}]'},function(e,t){e.exports='theme [{{ themes }}]'},function(e,t){e.exports=' commands: {{ commands }}'},function(e,t){e.exports='Command not found: {{ cmd }}'},,,function(e,t,n){var i=n(58);i(i.S,"Object",{create:n(88)})},function(e,t,n){n(137);var i=n(40).Object;e.exports=function(e,t){return i.create(e,t)}},function(e,t,n){e.exports={default:n(138),__esModule:!0}},function(e,t,n){var i=n(52),o=n(61),a=function(e,t){if(o(e),!i(t)&&null!==t)throw TypeError(t+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,i){try{(i=n(94)(Function.call,n(72).f(Object.prototype,"__proto__").set,2))(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,n){return a(e,n),t?e.__proto__=n:i(e,n),e}}({},!1):void 0),check:a}},function(e,t,n){var i=n(58);i(i.S,"Object",{setPrototypeOf:n(140).set})},function(e,t,n){n(141),e.exports=n(40).Object.setPrototypeOf},function(e,t,n){e.exports={default:n(142),__esModule:!0}},function(e,t,n){n(81)("observable")},function(e,t,n){n(81)("asyncIterator")},function(e,t){},function(e,t,n){var i=n(43),o=n(102).f,a={}.toString,r="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return r&&"[object Window]"==a.call(e)?function(e){try{return o(e)}catch(e){return r.slice()}}(e):o(i(e))}},function(e,t,n){var i=n(92);e.exports=Array.isArray||function(e){return"Array"==i(e)}},function(e,t,n){var i=n(87),o=n(103),a=n(71);e.exports=function(e){var t=i(e),n=o.f;if(n)for(var r,s=n(e),c=a.f,l=0;s.length>l;)c.call(e,r=s[l++])&&t.push(r);return t}},function(e,t,n){var i=n(70)("meta"),o=n(52),a=n(46),r=n(49).f,s=0,c=Object.isExtensible||function(){return!0},l=!n(51)(function(){return c(Object.preventExtensions({}))}),u=function(e){r(e,i,{value:{i:"O"+ ++s,w:{}}})},d=e.exports={KEY:i,NEED:!1,fastKey:function(e,t){if(!o(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!a(e,i)){if(!c(e))return"F";if(!t)return"E";u(e)}return e[i].i},getWeak:function(e,t){if(!a(e,i)){if(!c(e))return!0;if(!t)return!1;u(e)}return e[i].w},onFreeze:function(e){return l&&d.NEED&&c(e)&&!a(e,i)&&u(e),e}}},function(e,t,n){"use strict";var i=n(41),o=n(46),a=n(42),r=n(58),s=n(105),c=n(150).KEY,l=n(51),u=n(85),d=n(83),p=n(70),f=n(60),m=n(82),h=n(81),g=n(149),b=n(148),v=n(61),S=n(43),y=n(67),w=n(64),A=n(88),O=n(147),T=n(72),C=n(49),_=n(87),E=T.f,D=C.f,N=O.f,j=i.Symbol,R=i.JSON,I=R&&R.stringify,x=f("_hidden"),P=f("toPrimitive"),k={}.propertyIsEnumerable,L=u("symbol-registry"),M=u("symbols"),F=u("op-symbols"),U=Object.prototype,H="function"==typeof j,G=i.QObject,B=!G||!G.prototype||!G.prototype.findChild,V=a&&l(function(){return 7!=A(D({},"a",{get:function(){return D(this,"a",{value:7}).a}})).a})?function(e,t,n){var i=E(U,t);i&&delete U[t],D(e,t,n),i&&e!==U&&D(U,t,i)}:D,q=function(e){var t=M[e]=A(j.prototype);return t._k=e,t},z=H&&"symbol"==typeof j.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof j},K=function(e,t,n){return e===U&&K(F,t,n),v(e),t=y(t,!0),v(n),o(M,t)?(n.enumerable?(o(e,x)&&e[x][t]&&(e[x][t]=!1),n=A(n,{enumerable:w(0,!1)})):(o(e,x)||D(e,x,w(1,{})),e[x][t]=!0),V(e,t,n)):D(e,t,n)},W=function(e,t){v(e);for(var n,i=g(t=S(t)),o=0,a=i.length;a>o;)K(e,n=i[o++],t[n]);return e},Y=function(e){var t=k.call(this,e=y(e,!0));return!(this===U&&o(M,e)&&!o(F,e))&&(!(t||!o(this,e)||!o(M,e)||o(this,x)&&this[x][e])||t)},$=function(e,t){if(e=S(e),t=y(t,!0),e!==U||!o(M,t)||o(F,t)){var n=E(e,t);return!n||!o(M,t)||o(e,x)&&e[x][t]||(n.enumerable=!0),n}},J=function(e){for(var t,n=N(S(e)),i=[],a=0;n.length>a;)o(M,t=n[a++])||t==x||t==c||i.push(t);return i},X=function(e){for(var t,n=e===U,i=N(n?F:S(e)),a=[],r=0;i.length>r;)!o(M,t=i[r++])||n&&!o(U,t)||a.push(M[t]);return a};H||(s((j=function(){if(this instanceof j)throw TypeError("Symbol is not a constructor!");var e=p(arguments.length>0?arguments[0]:void 0),t=function(n){this===U&&t.call(F,n),o(this,x)&&o(this[x],e)&&(this[x][e]=!1),V(this,e,w(1,n))};return a&&B&&V(U,e,{configurable:!0,set:t}),q(e)}).prototype,"toString",function(){return this._k}),T.f=$,C.f=K,n(102).f=O.f=J,n(71).f=Y,n(103).f=X,a&&!n(90)&&s(U,"propertyIsEnumerable",Y,!0),m.f=function(e){return q(f(e))}),r(r.G+r.W+r.F*!H,{Symbol:j});for(var Q="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),Z=0;Q.length>Z;)f(Q[Z++]);for(var ee=_(f.store),te=0;ee.length>te;)h(ee[te++]);r(r.S+r.F*!H,"Symbol",{for:function(e){return o(L,e+="")?L[e]:L[e]=j(e)},keyFor:function(e){if(!z(e))throw TypeError(e+" is not a symbol!");for(var t in L)if(L[t]===e)return t},useSetter:function(){B=!0},useSimple:function(){B=!1}}),r(r.S+r.F*!H,"Object",{create:function(e,t){return void 0===t?A(e):W(A(e),t)},defineProperty:K,defineProperties:W,getOwnPropertyDescriptor:$,getOwnPropertyNames:J,getOwnPropertySymbols:X}),R&&r(r.S+r.F*(!H||l(function(){var e=j();return"[null]"!=I([e])||"{}"!=I({a:e})||"{}"!=I(Object(e))})),"JSON",{stringify:function(e){if(void 0!==e&&!z(e)){for(var t,n,i=[e],o=1;arguments.length>o;)i.push(arguments[o++]);return"function"==typeof(t=i[1])&&(n=t),!n&&b(t)||(t=function(e,t){if(n&&(t=n.call(this,e,t)),!z(t))return t}),i[1]=t,I.apply(R,i)}}}),j.prototype[P]||n(53)(j.prototype,P,j.prototype.valueOf),d(j,"Symbol"),d(Math,"Math",!0),d(i.JSON,"JSON",!0)},function(e,t,n){n(151),n(146),n(145),n(144),e.exports=n(40).Symbol},function(e,t,n){e.exports={default:n(152),__esModule:!0}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t){e.exports=function(){}},function(e,t,n){"use strict";var i=n(155),o=n(154),a=n(89),r=n(43);e.exports=n(106)(Array,"Array",function(e,t){this._t=r(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,o(1)):o(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values"),a.Arguments=a.Array,i("keys"),i("values"),i("entries")},function(e,t,n){n(156);for(var i=n(41),o=n(53),a=n(89),r=n(60)("toStringTag"),s="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),c=0;c0?o(i(e),9007199254740991):0}},function(e,t,n){var i=n(43),o=n(162),a=n(161);e.exports=function(e){return function(t,n,r){var s,c=i(t),l=o(c.length),u=a(r,l);if(e&&n!=n){for(;l>u;)if((s=c[u++])!=s)return!0}else for(;l>u;u++)if((e||u in c)&&c[u]===n)return e||u||0;return!e&&-1}}},function(e,t,n){var i=n(49),o=n(61),a=n(87);e.exports=n(42)?Object.defineProperties:function(e,t){o(e);for(var n,r=a(t),s=r.length,c=0;s>c;)i.f(e,n=r[c++],t[n]);return e}},function(e,t,n){"use strict";var i=n(88),o=n(64),a=n(83),r={};n(53)(r,n(60)("iterator"),function(){return this}),e.exports=function(e,t,n){e.prototype=i(r,{next:o(1,n)}),a(e,t+" Iterator")}},function(e,t,n){var i=n(91),o=n(73);e.exports=function(e){return function(t,n){var a,r,s=String(o(t)),c=i(n),l=s.length;return c<0||c>=l?e?"":void 0:(a=s.charCodeAt(c))<55296||a>56319||c+1===l||(r=s.charCodeAt(c+1))<56320||r>57343?e?s.charAt(c):a:e?s.slice(c,c+2):r-56320+(a-55296<<10)+65536}}},function(e,t,n){"use strict";var i=n(166)(!0);n(106)(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=i(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t,n){n(167),n(157),e.exports=n(82).f("iterator")},function(e,t,n){e.exports={default:n(168),__esModule:!0}},function(e,t){e.exports='\n\n\t\n\t\n\t\n\t\n\t{{title}}\n\t\n\n\n\t
\n\t\t
{{subject}}
\n\t
\n\t
\n\t\t
{{date}}
\n\t\t
{{fromCreds}}
\n\t\t
{{toLabel}}: {{toCreds}}
\n\t\t
{{ccLabel}}: {{ccCreds}}
\n\t
\n\t
{{html}}
\n\n'},,function(e,t,n){"use strict";n.r(t);var i,o,a,r,s,c,l,u,d,p,f,m,h,g,b,v,S=n(8),y=n.n(S),w=n(12),A=n.n(w),O=n(11),T=n.n(O),C=n(3),_=n.n(C),E=n(4),D=n.n(E),N=n(1),j=n(55),R=n.n(j),I=n(16),x=n(10),P=n(0),k=n(2),L=n(5),M=n(38),F=n(48),U=n(68),H=new function e(){y()(this,e),this.plugins=N.a.observableArray([]),this.plugins.loading=N.a.observable(!1).extend({throttle:100}),this.plugins.error=N.a.observable("")},G=new function e(){y()(this,e),this.licensing=N.a.observable(!1),this.licensingProcess=N.a.observable(!1),this.licenseValid=N.a.observable(!1),this.licenseExpired=N.a.observable(0),this.licenseError=N.a.observable(""),this.licenseTrigger=N.a.observable(!1)},B=new function e(){y()(this,e),this.packages=N.a.observableArray([]),this.packages.loading=N.a.observable(!1).extend({throttle:100}),this.packagesReal=N.a.observable(!0),this.packagesMainUpdatable=N.a.observable(!0)},V=new function e(){y()(this,e),this.coreReal=N.a.observable(!0),this.coreChannel=N.a.observable("stable"),this.coreType=N.a.observable("stable"),this.coreUpdatable=N.a.observable(!0),this.coreAccess=N.a.observable(!0),this.coreWarning=N.a.observable(!1),this.coreChecking=N.a.observable(!1).extend({throttle:100}),this.coreUpdating=N.a.observable(!1).extend({throttle:100}),this.coreVersion=N.a.observable(""),this.coreRemoteVersion=N.a.observable(""),this.coreRemoteRelease=N.a.observable(""),this.coreVersionCompare=N.a.observable(-2)},q=n(21),z=n(9),K=n(29),W=n(114),Y=n(39),$=n(32),J=function(){function e(){var t=this;y()(this,e),this.language=$.a.language,this.languages=$.a.languages,this.languageAdmin=$.a.languageAdmin,this.languagesAdmin=$.a.languagesAdmin,this.theme=Y.a.theme,this.themes=Y.a.themes,this.capaThemes=F.a.themes,this.capaUserBackground=F.a.userBackground,this.capaGravatar=F.a.gravatar,this.capaAdditionalAccounts=F.a.additionalAccounts,this.capaIdentities=F.a.identities,this.capaAttachmentThumbnails=F.a.attachmentThumbnails,this.capaTemplates=F.a.templates,this.allowLanguagesOnSettings=M.a.allowLanguagesOnSettings,this.weakPassword=M.a.weakPassword,this.newMoveToFolder=M.a.newMoveToFolder,this.dataFolderAccess=M.a.dataFolderAccess,this.mainAttachmentLimit=N.a.observable(Object(k.pInt)(Object(L.settingsGet)("AttachmentLimit"))/(P.Magics.BitLength1024*P.Magics.BitLength1024)).extend({posInterer:25}),this.uploadData=Object(L.settingsGet)("PhpUploadSizes"),this.uploadDataDesc=this.uploadData&&(this.uploadData.upload_max_filesize||this.uploadData.post_max_size)?[this.uploadData.upload_max_filesize?"upload_max_filesize = "+this.uploadData.upload_max_filesize+"; ":"",this.uploadData.post_max_size?"post_max_size = "+this.uploadData.post_max_size:""].join(""):"",this.themesOptions=N.a.computed(function(){return D.a.map(t.themes(),function(e){return{optValue:e,optText:Object(k.convertThemeName)(e)}})}),this.languageFullName=N.a.computed(function(){return Object(k.convertLangName)(t.language())}),this.languageAdminFullName=N.a.computed(function(){return Object(k.convertLangName)(t.languageAdmin())}),this.attachmentLimitTrigger=N.a.observable(P.SaveSettingsStep.Idle),this.languageTrigger=N.a.observable(P.SaveSettingsStep.Idle),this.languageAdminTrigger=N.a.observable(P.SaveSettingsStep.Idle).extend({throttle:P.Magics.Time100ms}),this.themeTrigger=N.a.observable(P.SaveSettingsStep.Idle)}return e.prototype.onBuild=function(){var e=this;D.a.delay(function(){var t=Object(k.settingsSaveHelperSimpleFunction)(e.attachmentLimitTrigger,e),n=Object(k.settingsSaveHelperSimpleFunction)(e.languageTrigger,e),i=Object(k.settingsSaveHelperSimpleFunction)(e.themeTrigger,e),o=function(t){return function(){e.languageAdminTrigger(t),D.a.delay(function(){return e.languageAdminTrigger(P.SaveSettingsStep.Idle)},P.Magics.Time1s)}};e.mainAttachmentLimit.subscribe(function(e){q.a.saveAdminConfig(t,{AttachmentLimit:Object(k.pInt)(e)})}),e.language.subscribe(function(e){q.a.saveAdminConfig(n,{Language:Object(k.trim)(e)})}),e.languageAdmin.subscribe(function(t){e.languageAdminTrigger(P.SaveSettingsStep.Animate),Object(x.reload)(!0,t).then(o(P.SaveSettingsStep.TrueResult),o(P.SaveSettingsStep.FalseResult)).then(function(){q.a.saveAdminConfig(null,{LanguageAdmin:Object(k.trim)(t)})})}),e.theme.subscribe(function(t){Object(k.changeTheme)(t,e.themeTrigger),q.a.saveAdminConfig(i,{Theme:Object(k.trim)(t)})}),e.capaAdditionalAccounts.subscribe(function(e){q.a.saveAdminConfig(null,{CapaAdditionalAccounts:Object(k.boolToAjax)(e)})}),e.capaIdentities.subscribe(function(e){q.a.saveAdminConfig(null,{CapaIdentities:Object(k.boolToAjax)(e)})}),e.capaTemplates.subscribe(function(e){q.a.saveAdminConfig(null,{CapaTemplates:Object(k.boolToAjax)(e)})}),e.capaGravatar.subscribe(function(e){q.a.saveAdminConfig(null,{CapaGravatar:Object(k.boolToAjax)(e)})}),e.capaAttachmentThumbnails.subscribe(function(e){q.a.saveAdminConfig(null,{CapaAttachmentThumbnails:Object(k.boolToAjax)(e)})}),e.capaThemes.subscribe(function(e){q.a.saveAdminConfig(null,{CapaThemes:Object(k.boolToAjax)(e)})}),e.capaUserBackground.subscribe(function(e){q.a.saveAdminConfig(null,{CapaUserBackground:Object(k.boolToAjax)(e)})}),e.allowLanguagesOnSettings.subscribe(function(e){q.a.saveAdminConfig(null,{AllowLanguagesOnSettings:Object(k.boolToAjax)(e)})}),e.newMoveToFolder.subscribe(function(e){q.a.saveAdminConfig(null,{NewMoveToFolder:Object(k.boolToAjax)(e)})})},P.Magics.Time50ms)},e.prototype.selectLanguage=function(){Object(z.showScreenPopup)(n(101),[this.language,this.languages(),$.a.userLanguage()])},e.prototype.selectLanguageAdmin=function(){Object(z.showScreenPopup)(n(101),[this.languageAdmin,this.languagesAdmin(),$.a.userLanguageAdmin()])},e.prototype.phpInfoLink=function(){return Object(I.u)()},e}(),X=n(37),Q=function(){function e(){var t=this;y()(this,e),this.domains=U.a.domains,this.visibility=N.a.computed(function(){return t.domains.loading()?"visible":"hidden"}),this.domainForDeletion=N.a.observable(null).deleteAccessHelper(),this.onDomainListChangeRequest=D.a.bind(this.onDomainListChangeRequest,this),this.onDomainLoadRequest=D.a.bind(this.onDomainLoadRequest,this)}return e.prototype.createDomain=function(){Object(z.showScreenPopup)(n(176))},e.prototype.createDomainAlias=function(){Object(z.showScreenPopup)(n(190))},e.prototype.deleteDomain=function(e){this.domains.remove(e),q.a.domainDelete(this.onDomainListChangeRequest,e.name)},e.prototype.disableDomain=function(e){e.disabled(!e.disabled()),q.a.domainDisable(this.onDomainListChangeRequest,e.name,e.disabled())},e.prototype.onBuild=function(e){var t=this;e.on("click",".b-admin-domains-list-table .e-item .e-action",function(){var e=N.a.dataFor(this);e&&q.a.domain(t.onDomainLoadRequest,e.name)}),Object(X.a)().reloadDomainList()},e.prototype.onDomainLoadRequest=function(e,t){P.StorageResultType.Success===e&&t&&t.Result&&Object(z.showScreenPopup)(n(176),[t.Result])},e.prototype.onDomainListChangeRequest=function(){Object(X.a)().reloadDomainList()},e}(),Z=function(){function e(){y()(this,e),this.determineUserLanguage=M.a.determineUserLanguage,this.determineUserDomain=M.a.determineUserDomain,this.defaultDomain=N.a.observable(Object(L.settingsGet)("LoginDefaultDomain")).idleTrigger(),this.allowLanguagesOnLogin=M.a.allowLanguagesOnLogin,this.dummy=N.a.observable(!1)}return e.prototype.onBuild=function(){var e=this;D.a.delay(function(){var t=Object(k.settingsSaveHelperSimpleFunction)(e.defaultDomain.trigger,e);e.determineUserLanguage.subscribe(function(e){q.a.saveAdminConfig(null,{DetermineUserLanguage:Object(k.boolToAjax)(e)})}),e.determineUserDomain.subscribe(function(e){q.a.saveAdminConfig(null,{DetermineUserDomain:Object(k.boolToAjax)(e)})}),e.allowLanguagesOnLogin.subscribe(function(e){q.a.saveAdminConfig(null,{AllowLanguagesOnLogin:Object(k.boolToAjax)(e)})}),e.defaultDomain.subscribe(function(e){q.a.saveAdminConfig(t,{LoginDefaultDomain:Object(k.trim)(e)})})},50)},e}(),ee=n(18),te=n.n(ee),ne=(i=Object(z.command)(function(e){return""!==e.pdoDsn()&&""!==e.pdoUser()}),o=function(){function e(){var t=this;y()(this,e),this.defautOptionsAfterRender=k.defautOptionsAfterRender,this.enableContacts=N.a.observable(!!Object(L.settingsGet)("ContactsEnable")),this.contactsSync=N.a.observable(!!Object(L.settingsGet)("ContactsSync"));var n=[];Object(L.settingsGet)("SQLiteIsSupported")&&n.push("sqlite"),Object(L.settingsGet)("MySqlIsSupported")&&n.push("mysql"),Object(L.settingsGet)("PostgreSqlIsSupported")&&n.push("pgsql"),this.contactsSupported=00&&void 0!==arguments[0]?arguments[0]:null,t=null;t=n(188).default,Object(z.addSettingsViewModel)(J,"AdminSettingsGeneral","TABS_LABELS/LABEL_GENERAL_NAME","general",!0),Object(z.addSettingsViewModel)(Q,"AdminSettingsDomains","TABS_LABELS/LABEL_DOMAINS_NAME","domains"),Object(z.addSettingsViewModel)(Z,"AdminSettingsLogin","TABS_LABELS/LABEL_LOGIN_NAME","login"),t&&Object(z.addSettingsViewModel)(t,"AdminSettingsBranding","TABS_LABELS/LABEL_BRANDING_NAME","branding"),Object(z.addSettingsViewModel)(ne,"AdminSettingsContacts","TABS_LABELS/LABEL_CONTACTS_NAME","contacts"),Object(z.addSettingsViewModel)(ie,"AdminSettingsSecurity","TABS_LABELS/LABEL_SECURITY_NAME","security"),Object(z.addSettingsViewModel)(ae,"AdminSettingsSocial","TABS_LABELS/LABEL_INTEGRATION_NAME","integrations"),Object(z.addSettingsViewModel)(re,"AdminSettingsPlugins","TABS_LABELS/LABEL_PLUGINS_NAME","plugins"),Object(z.addSettingsViewModel)(se,"AdminSettingsPackages","TABS_LABELS/LABEL_PACKAGES_NAME","packages"),Object(z.addSettingsViewModel)(ce,"AdminSettingsAbout","TABS_LABELS/LABEL_ABOUT_NAME","about"),Object(K.g)(!0),e&&e()},t.prototype.onShow=function(){Object(X.a)().setWindowTitle("")},t}(W.a),ve=n(65),Se=(h=Object(z.view)({name:"View/Admin/Login",type:z.ViewType.Center,templateID:"AdminLogin"}),g=Object(z.command)(function(e){return!e.submitRequest()}),h((function(e,t,n,i,o){var a={};Object.keys(i).forEach(function(e){a[e]=i[e]}),a.enumerable=!!a.enumerable,a.configurable=!!a.configurable,("value"in a||a.initializer)&&(a.writable=!0),a=n.slice().reverse().reduce(function(n,i){return i(e,t,n)||n},a),o&&void 0!==a.initializer&&(a.value=a.initializer?a.initializer.call(o):void 0,a.initializer=void 0),void 0===a.initializer&&(Object.defineProperty(e,t,a),a=null)}((v=function(e){function t(){y()(this,t);var n=A()(this,e.call(this));return n.loginPowered=!!L.settingsGet("LoginPowered"),n.mobile=!!L.appSettingsGet("mobile"),n.mobileDevice=!!L.appSettingsGet("mobileDevice"),n.hideSubmitButton=!!L.appSettingsGet("hideSubmitButton"),n.login=N.a.observable(""),n.password=N.a.observable(""),n.loginError=N.a.observable(!1),n.passwordError=N.a.observable(!1),n.loginErrorAnimation=N.a.observable(!1).extend({falseTimeout:500}),n.passwordErrorAnimation=N.a.observable(!1).extend({falseTimeout:500}),n.loginFocus=N.a.observable(!1),n.formHidden=N.a.observable(!1),n.formError=N.a.computed(function(){return n.loginErrorAnimation()||n.passwordErrorAnimation()}),n.login.subscribe(function(){return n.loginError(!1)}),n.password.subscribe(function(){return n.passwordError(!1)}),n.loginError.subscribe(function(e){return n.loginErrorAnimation(!!e)}),n.passwordError.subscribe(function(e){n.passwordErrorAnimation(!!e)}),n.submitRequest=N.a.observable(!1),n.submitError=N.a.observable(""),n}return T()(t,e),t.prototype.submitCommand=function(){var e=this;return Object(k.triggerAutocompleteInputChange)(),this.loginError(!1),this.passwordError(!1),this.loginError(""===Object(k.trim)(this.login())),this.passwordError(""===Object(k.trim)(this.password())),!this.loginError()&&!this.passwordError()&&(this.submitRequest(!0),fe.$win.trigger("rl.tooltips.diactivate"),q.a.adminLogin(function(t,n){fe.$win.trigger("rl.tooltips.diactivate"),fe.$win.trigger("rl.tooltips.activate"),P.StorageResultType.Success===t&&n&&"AdminLogin"===n.Action?n.Result?Object(X.a)().loginAndLogoutReload(!0):n.ErrorCode&&(e.submitRequest(!1),e.submitError(Object(x.getNotification)(n.ErrorCode))):(e.submitRequest(!1),e.submitError(Object(x.getNotification)(P.Notification.UnknownError)))},this.login(),this.password()),!0)},t.prototype.onShow=function(){var e=this;Object(z.routeOff)(),D.a.delay(function(){e.loginFocus(!0)},P.Magics.Time100ms)},t.prototype.onHide=function(){this.loginFocus(!1)},t.prototype.onBuild=function(){Object(k.triggerAutocompleteInputChange)(!0)},t.prototype.submitForm=function(){this.submitCommand()},t}(me.a)).prototype,"submitCommand",[g],te()(v.prototype,"submitCommand"),v.prototype),b=v))||b),ye=function(e){function t(){return y()(this,t),A()(this,e.call(this,"login",[Se]))}return T()(t,e),t.prototype.onShow=function(){Object(X.a)().setWindowTitle("")},t}(ve.a),we=function(e){function t(){return y()(this,t),A()(this,e.call(this,q.a))}return T()(t,e),t.prototype.remote=function(){return q.a},t.prototype.reloadDomainList=function(){U.a.domains.loading(!0),q.a.domainList(function(e,t){U.a.domains.loading(!1),P.StorageResultType.Success===e&&t&&t.Result&&U.a.domains(D.a.map(t.Result,function(e,t){var n=e[0],i=e[1];return{name:t,disabled:N.a.observable(!n),alias:i,deleteAccess:N.a.observable(!1)}}))})},t.prototype.reloadPluginList=function(){H.plugins.loading(!0),q.a.pluginList(function(e,t){H.plugins.loading(!1),P.StorageResultType.Success===e&&t&&t.Result&&H.plugins(D.a.map(t.Result,function(e){return{name:e.Name,disabled:N.a.observable(!e.Enabled),configured:N.a.observable(!!e.Configured)}}))})},t.prototype.reloadPackagesList=function(){B.packages.loading(!0),B.packagesReal(!0),q.a.packagesList(function(e,t){if(B.packages.loading(!1),P.StorageResultType.Success===e&&t&&t.Result){B.packagesReal(!!t.Result.Real),B.packagesMainUpdatable(!!t.Result.MainUpdatable);var n=[],i={};D.a.each(B.packages(),function(e){e&&e.loading()&&(i[e.file]=e)}),Object(k.isArray)(t.Result.List)&&(n=D.a.compact(D.a.map(t.Result.List,function(e){return e?(e.loading=N.a.observable(!Object(k.isUnd)(i[e.file])),"core"!==e.type||e.canBeInstalled?e:null):null}))),B.packages(n)}else B.packagesReal(!1)})},t.prototype.updateCoreData=function(){V.coreUpdating(!0),q.a.updateCoreData(function(e,t){V.coreUpdating(!1),V.coreVersion(""),V.coreRemoteVersion(""),V.coreRemoteRelease(""),V.coreVersionCompare(-2),P.StorageResultType.Success===e&&t&&t.Result?(V.coreReal(!0),_.a.location.reload()):V.coreReal(!1)})},t.prototype.reloadCoreData=function(){V.coreChecking(!0),V.coreReal(!0),q.a.coreData(function(e,t){V.coreChecking(!1),P.StorageResultType.Success===e&&t&&t.Result?(V.coreReal(!!t.Result.Real),V.coreChannel(t.Result.Channel||"stable"),V.coreType(t.Result.Type||"stable"),V.coreUpdatable(!!t.Result.Updatable),V.coreAccess(!!t.Result.Access),V.coreWarning(!!t.Result.Warning),V.coreVersion(t.Result.Version||""),V.coreRemoteVersion(t.Result.RemoteVersion||""),V.coreRemoteRelease(t.Result.RemoteRelease||""),V.coreVersionCompare(Object(k.pInt)(t.Result.VersionCompare))):(V.coreReal(!1),V.coreChannel("stable"),V.coreType("stable"),V.coreWarning(!1),V.coreVersion(""),V.coreRemoteVersion(""),V.coreRemoteRelease(""),V.coreVersionCompare(-2))})},t.prototype.reloadLicensing=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];G.licensingProcess(!0),G.licenseError(""),q.a.licensing(function(e,t){G.licensingProcess(!1),P.StorageResultType.Success===e&&t&&t.Result&&Object(k.isNormal)(t.Result.Expired)?(G.licenseValid(!0),G.licenseExpired(Object(k.pInt)(t.Result.Expired)),G.licenseError(""),G.licensing(!0),M.a.prem(!0)):t&&t.ErrorCode&&-10&&void 0!==arguments[0]?arguments[0]:null;R.a&&R.a.end(),e&&e()},t.prototype.bootstart=function(){e.prototype.bootstart.call(this),M.a.populate(),F.a.populate(),Object(z.hideLoading)(),L.appSettingsGet("allowAdminPanel")?L.settingsGet("Auth")?Object(z.startScreens)([be]):Object(z.startScreens)([ye]):(Object(z.routeOff)(),Object(z.setHash)(Object(I.w)(),!0),Object(z.routeOff)(),D.a.defer(function(){_.a.location.href="/"})),this.bootend()},t}(n(113).a);t.default=new we},,,,function(e,t,n){"use strict";function i(e,t,n,i,o){var a={};return Object.keys(i).forEach(function(e){a[e]=i[e]}),a.enumerable=!!a.enumerable,a.configurable=!!a.configurable,("value"in a||a.initializer)&&(a.writable=!0),a=n.slice().reverse().reduce(function(n,i){return i(e,t,n)||n},a),o&&void 0!==a.initializer&&(a.value=a.initializer?a.initializer.call(o):void 0,a.initializer=void 0),void 0===a.initializer&&(Object.defineProperty(e,t,a),a=null),a}n.r(t),n.d(t,"DomainPopupView",function(){return x}),n.d(t,"default",function(){return x});var o,a,r,s,c,l,u,d,p=n(18),f=n.n(p),m=n(8),h=n.n(m),g=n(12),b=n.n(g),v=n(11),S=n.n(v),y=n(4),w=n.n(y),A=n(1),O=n(0),T=n(23),C=n(6),_=n(2),E=n(10),D=n(48),N=n(21),j=n(37),R=n(9),I=n(24),x=(o=Object(R.popup)({name:"View/Popup/Domain",templateID:"PopupsDomain"}),a=Object(R.command)(function(e){return e.canBeSaved()}),r=Object(R.command)(function(e){return e.canBeTested()}),s=Object(R.command)(),c=Object(R.command)(),l=Object(R.command)(),o((i((d=function(e){function t(){h()(this,t);var n=b()(this,e.call(this));return n.edit=A.a.observable(!1),n.saving=A.a.observable(!1),n.savingError=A.a.observable(""),n.page=A.a.observable("main"),n.sieveSettings=A.a.observable(!1),n.testing=A.a.observable(!1),n.testingDone=A.a.observable(!1),n.testingImapError=A.a.observable(!1),n.testingSieveError=A.a.observable(!1),n.testingSmtpError=A.a.observable(!1),n.testingImapErrorDesc=A.a.observable(""),n.testingSieveErrorDesc=A.a.observable(""),n.testingSmtpErrorDesc=A.a.observable(""),n.testingImapError.subscribe(function(e){e||n.testingImapErrorDesc("")}),n.testingSieveError.subscribe(function(e){e||n.testingSieveErrorDesc("")}),n.testingSmtpError.subscribe(function(e){e||n.testingSmtpErrorDesc("")}),n.imapServerFocus=A.a.observable(!1),n.sieveServerFocus=A.a.observable(!1),n.smtpServerFocus=A.a.observable(!1),n.name=A.a.observable(""),n.name.focused=A.a.observable(!1),n.imapServer=A.a.observable(""),n.imapPort=A.a.observable(""+T.h),n.imapSecure=A.a.observable(O.ServerSecure.None),n.imapShortLogin=A.a.observable(!1),n.useSieve=A.a.observable(!1),n.sieveAllowRaw=A.a.observable(!1),n.sieveServer=A.a.observable(""),n.sievePort=A.a.observable(""+T.o),n.sieveSecure=A.a.observable(O.ServerSecure.None),n.smtpServer=A.a.observable(""),n.smtpPort=A.a.observable(""+T.p),n.smtpSecure=A.a.observable(O.ServerSecure.None),n.smtpShortLogin=A.a.observable(!1),n.smtpAuth=A.a.observable(!0),n.smtpPhpMail=A.a.observable(!1),n.whiteList=A.a.observable(""),n.aliasName=A.a.observable(""),n.enableSmartPorts=A.a.observable(!1),n.allowSieve=A.a.computed(function(){return D.a.filters()&&D.a.sieve()}),n.headerText=A.a.computed(function(){var e=n.name(),t=n.aliasName(),i="";return n.edit()?(i=Object(E.i18n)("POPUPS_DOMAIN/TITLE_EDIT_DOMAIN",{NAME:e}),t&&(i+=" ← "+t)):i=""===e?Object(E.i18n)("POPUPS_DOMAIN/TITLE_ADD_DOMAIN"):Object(E.i18n)("POPUPS_DOMAIN/TITLE_ADD_DOMAIN_WITH_NAME",{NAME:e}),i}),n.domainDesc=A.a.computed(function(){var e=n.name();return!n.edit()&&e?Object(E.i18n)("POPUPS_DOMAIN/NEW_DOMAIN_DESC",{NAME:"*@"+e}):""}),n.domainIsComputed=A.a.computed(function(){var e=n.smtpPhpMail(),t=n.allowSieve(),i=n.useSieve();return""!==n.name()&&""!==n.imapServer()&&""!==n.imapPort()&&(!t||!i||""!==n.sieveServer()&&""!==n.sievePort())&&(""!==n.smtpServer()&&""!==n.smtpPort()||e)}),n.canBeTested=A.a.computed(function(){return!n.testing()&&n.domainIsComputed()}),n.canBeSaved=A.a.computed(function(){return!n.saving()&&n.domainIsComputed()}),n.page.subscribe(function(){n.sieveSettings(!1)}),n.imapServerFocus.subscribe(function(e){e&&""!==n.name()&&""===n.imapServer()&&n.imapServer(n.name().replace(/[.]?[*][.]?/g,""))}),n.sieveServerFocus.subscribe(function(e){e&&""!==n.imapServer()&&""===n.sieveServer()&&n.sieveServer(n.imapServer())}),n.smtpServerFocus.subscribe(function(e){e&&""!==n.imapServer()&&""===n.smtpServer()&&n.smtpServer(n.imapServer().replace(/imap/gi,"smtp"))}),n.imapSecure.subscribe(function(e){if(n.enableSmartPorts()){var t=Object(_.pInt)(n.imapPort());switch(Object(_.pString)(e)){case"0":case"2":O.Ports.ImapSsl===t&&n.imapPort(Object(_.pString)(O.Ports.Imap));break;case"1":O.Ports.Imap===t&&n.imapPort(Object(_.pString)(O.Ports.ImapSsl))}}}),n.smtpSecure.subscribe(function(e){if(n.enableSmartPorts()){var t=Object(_.pInt)(n.smtpPort());switch(Object(_.pString)(e)){case"0":O.Ports.SmtpSsl!==t&&O.Ports.SmtpStartTls!==t||n.smtpPort(Object(_.pString)(O.Ports.Smtp));break;case"1":O.Ports.Smtp!==t&&O.Ports.SmtpStartTls!==t||n.smtpPort(Object(_.pString)(O.Ports.SmtpSsl));break;case"2":O.Ports.Smtp!==t&&O.Ports.SmtpSsl!==t||n.smtpPort(Object(_.pString)(O.Ports.SmtpStartTls))}}}),n}return S()(t,e),t.prototype.createOrAddCommand=function(){this.saving(!0),N.a.createOrUpdateDomain(w.a.bind(this.onDomainCreateOrSaveResponse,this),!this.edit(),this.name(),this.imapServer(),Object(_.pInt)(this.imapPort()),this.imapSecure(),this.imapShortLogin(),this.useSieve(),this.sieveAllowRaw(),this.sieveServer(),Object(_.pInt)(this.sievePort()),this.sieveSecure(),this.smtpServer(),Object(_.pInt)(this.smtpPort()),this.smtpSecure(),this.smtpShortLogin(),this.smtpAuth(),this.smtpPhpMail(),this.whiteList())},t.prototype.testConnectionCommand=function(){this.page("main"),this.testingDone(!1),this.testingImapError(!1),this.testingSieveError(!1),this.testingSmtpError(!1),this.testing(!0),N.a.testConnectionForDomain(w.a.bind(this.onTestConnectionResponse,this),this.name(),this.imapServer(),Object(_.pInt)(this.imapPort()),this.imapSecure(),this.useSieve(),this.sieveServer(),Object(_.pInt)(this.sievePort()),this.sieveSecure(),this.smtpServer(),Object(_.pInt)(this.smtpPort()),this.smtpSecure(),this.smtpAuth(),this.smtpPhpMail())},t.prototype.whiteListCommand=function(){this.page("white-list")},t.prototype.backCommand=function(){this.page("main")},t.prototype.sieveCommand=function(){this.sieveSettings(!this.sieveSettings()),this.clearTesting()},t.prototype.onTestConnectionResponse=function(e,t){if(this.testing(!1),O.StorageResultType.Success===e&&t.Result){var n=!1,i=!1;this.testingDone(!0),this.testingImapError(!0!==t.Result.Imap),this.testingSieveError(!0!==t.Result.Sieve),this.testingSmtpError(!0!==t.Result.Smtp),this.testingImapError()&&t.Result.Imap&&(n=!0,this.testingImapErrorDesc(""),this.testingImapErrorDesc(t.Result.Imap)),this.testingSieveError()&&t.Result.Sieve&&(i=!0,this.testingSieveErrorDesc(""),this.testingSieveErrorDesc(t.Result.Sieve)),this.testingSmtpError()&&t.Result.Smtp&&(this.testingSmtpErrorDesc(""),this.testingSmtpErrorDesc(t.Result.Smtp)),this.sieveSettings()?!i&&n&&this.sieveSettings(!1):i&&!n&&this.sieveSettings(!0)}else this.testingImapError(!0),this.testingSieveError(!0),this.testingSmtpError(!0),this.sieveSettings(!1)},t.prototype.onDomainCreateOrSaveResponse=function(e,t){this.saving(!1),O.StorageResultType.Success===e&&t?t.Result?(Object(j.a)().reloadDomainList(),this.closeCommand()):O.Notification.DomainAlreadyExists===t.ErrorCode&&this.savingError(Object(E.i18n)("ERRORS/DOMAIN_ALREADY_EXISTS")):this.savingError(Object(E.i18n)("ERRORS/UNKNOWN_ERROR"))},t.prototype.clearTesting=function(){this.testing(!1),this.testingDone(!1),this.testingImapError(!1),this.testingSieveError(!1),this.testingSmtpError(!1)},t.prototype.onHide=function(){this.page("main"),this.sieveSettings(!1)},t.prototype.onShow=function(e){this.saving(!1),this.page("main"),this.sieveSettings(!1),this.clearTesting(),this.clearForm(),e&&(this.enableSmartPorts(!1),this.edit(!0),this.name(Object(_.trim)(e.Name)),this.imapServer(Object(_.trim)(e.IncHost)),this.imapPort(""+Object(_.pInt)(e.IncPort)),this.imapSecure(Object(_.trim)(e.IncSecure)),this.imapShortLogin(!!e.IncShortLogin),this.useSieve(!!e.UseSieve),this.sieveAllowRaw(!!e.SieveAllowRaw),this.sieveServer(Object(_.trim)(e.SieveHost)),this.sievePort(""+Object(_.pInt)(e.SievePort)),this.sieveSecure(Object(_.trim)(e.SieveSecure)),this.smtpServer(Object(_.trim)(e.OutHost)),this.smtpPort(""+Object(_.pInt)(e.OutPort)),this.smtpSecure(Object(_.trim)(e.OutSecure)),this.smtpShortLogin(!!e.OutShortLogin),this.smtpAuth(!!e.OutAuth),this.smtpPhpMail(!!e.OutUsePhpMail),this.whiteList(Object(_.trim)(e.WhiteList)),this.aliasName(Object(_.trim)(e.AliasName)),this.enableSmartPorts(!0))},t.prototype.onShowWithDelay=function(){""!==this.name()||C.bMobileDevice||this.name.focused(!0)},t.prototype.clearForm=function(){this.edit(!1),this.page("main"),this.sieveSettings(!1),this.enableSmartPorts(!1),this.savingError(""),this.name(""),this.name.focused(!1),this.imapServer(""),this.imapPort(""+T.h),this.imapSecure(O.ServerSecure.None),this.imapShortLogin(!1),this.useSieve(!1),this.sieveAllowRaw(!1),this.sieveServer(""),this.sievePort(""+T.o),this.sieveSecure(O.ServerSecure.None),this.smtpServer(""),this.smtpPort(""+T.p),this.smtpSecure(O.ServerSecure.None),this.smtpShortLogin(!1),this.smtpAuth(!0),this.smtpPhpMail(!1),this.whiteList(""),this.aliasName(""),this.enableSmartPorts(!0)},t}(I.a)).prototype,"createOrAddCommand",[a],f()(d.prototype,"createOrAddCommand"),d.prototype),i(d.prototype,"testConnectionCommand",[r],f()(d.prototype,"testConnectionCommand"),d.prototype),i(d.prototype,"whiteListCommand",[s],f()(d.prototype,"whiteListCommand"),d.prototype),i(d.prototype,"backCommand",[c],f()(d.prototype,"backCommand"),d.prototype),i(d.prototype,"sieveCommand",[l],f()(d.prototype,"sieveCommand"),d.prototype),u=d))||u)},,,,,,,,,,,,function(e,t,n){"use strict";n.r(t),n.d(t,"BrandingAdminSettings",function(){return m}),n.d(t,"default",function(){return m});var i=n(8),o=n.n(i),a=n(4),r=n.n(a),s=n(1),c=n(0),l=n(2),u=n(10),d=n(21),p=n(38),f=n(5),m=function(){function e(){o()(this,e),this.capa=p.a.prem,this.title=s.a.observable(Object(f.settingsGet)("Title")).idleTrigger(),this.loadingDesc=s.a.observable(Object(f.settingsGet)("LoadingDescription")).idleTrigger(),this.faviconUrl=s.a.observable(Object(f.settingsGet)("FaviconUrl")).idleTrigger(),this.loginLogo=s.a.observable(Object(f.settingsGet)("LoginLogo")||"").idleTrigger(),this.loginBackground=s.a.observable(Object(f.settingsGet)("LoginBackground")||"").idleTrigger(),this.userLogo=s.a.observable(Object(f.settingsGet)("UserLogo")||"").idleTrigger(),this.userLogoMessage=s.a.observable(Object(f.settingsGet)("UserLogoMessage")||"").idleTrigger(),this.userIframeMessage=s.a.observable(Object(f.settingsGet)("UserIframeMessage")||"").idleTrigger(),this.userLogoTitle=s.a.observable(Object(f.settingsGet)("UserLogoTitle")||"").idleTrigger(),this.loginDescription=s.a.observable(Object(f.settingsGet)("LoginDescription")).idleTrigger(),this.loginCss=s.a.observable(Object(f.settingsGet)("LoginCss")).idleTrigger(),this.userCss=s.a.observable(Object(f.settingsGet)("UserCss")).idleTrigger(),this.welcomePageUrl=s.a.observable(Object(f.settingsGet)("WelcomePageUrl")).idleTrigger(),this.welcomePageDisplay=s.a.observable(Object(f.settingsGet)("WelcomePageDisplay")).idleTrigger(),this.welcomePageDisplay.options=s.a.computed(function(){return Object(u.trigger)(),[{optValue:"none",optText:Object(u.i18n)("TAB_BRANDING/OPTION_WELCOME_PAGE_DISPLAY_NONE")},{optValue:"once",optText:Object(u.i18n)("TAB_BRANDING/OPTION_WELCOME_PAGE_DISPLAY_ONCE")},{optValue:"always",optText:Object(u.i18n)("TAB_BRANDING/OPTION_WELCOME_PAGE_DISPLAY_ALWAYS")}]}),this.loginPowered=s.a.observable(!!Object(f.settingsGet)("LoginPowered")),this.community=!0}return e.prototype.onBuild=function(){var e=this;r.a.delay(function(){var t=Object(l.settingsSaveHelperSimpleFunction)(e.title.trigger,e),n=Object(l.settingsSaveHelperSimpleFunction)(e.loadingDesc.trigger,e),i=Object(l.settingsSaveHelperSimpleFunction)(e.faviconUrl.trigger,e);e.title.subscribe(function(e){d.a.saveAdminConfig(t,{Title:Object(l.trim)(e)})}),e.loadingDesc.subscribe(function(e){d.a.saveAdminConfig(n,{LoadingDescription:Object(l.trim)(e)})}),e.faviconUrl.subscribe(function(e){d.a.saveAdminConfig(i,{FaviconUrl:Object(l.trim)(e)})})},c.Magics.Time50ms)},e}()},function(e,t,n){"use strict";n.r(t),n.d(t,"PluginPopupView",function(){return I}),n.d(t,"default",function(){return I});var i,o,a,r,s,c,l,u,d,p,f=n(18),m=n.n(f),h=n(8),g=n.n(h),b=n(12),v=n.n(b),S=n(11),y=n.n(S),w=n(4),A=n.n(w),O=n(1),T=n(19),C=n.n(T),_=n(0),E=n(2),D=n(10),N=n(21),j=n(9),R=n(24),I=(i=Object(j.popup)({name:"View/Popup/Plugin",templateID:"PopupsPlugin"}),o=Object(j.command)(function(e){return e.hasConfiguration()}),i((r=function(e){function t(){g()(this,t);var n=v()(this,e.call(this));return n.onPluginSettingsUpdateResponse=A.a.bind(n.onPluginSettingsUpdateResponse,n),n.saveError=O.a.observable(""),n.name=O.a.observable(""),n.readme=O.a.observable(""),n.configures=O.a.observableArray([]),n.hasReadme=O.a.computed(function(){return""!==n.readme()}),n.hasConfiguration=O.a.computed(function(){return 0"+n.readme()+""}},n.bDisabeCloseOnEsc=!0,n.sDefaultKeyScope=_.KeyState.All,n.tryToClosePopup=A.a.debounce(A.a.bind(n.tryToClosePopup,n),_.Magics.Time200ms),n}return y()(t,e),t.prototype.saveCommand=function(){var e={};e.Name=this.name(),A.a.each(this.configures(),function(t){var n=t.value();!1!==n&&!0!==n||(n=n?"1":"0"),e["_"+t.Name]=n}),this.saveError(""),N.a.pluginSettingsUpdate(this.onPluginSettingsUpdateResponse,e)},t.prototype.onPluginSettingsUpdateResponse=function(e,t){_.StorageResultType.Success===e&&t&&t.Result?this.cancelCommand():(this.saveError(""),t&&t.ErrorCode?this.saveError(Object(D.getNotification)(t.ErrorCode)):this.saveError(Object(D.getNotification)(_.Notification.CantSavePluginSettings)))},t.prototype.onShow=function(e){if(this.name(),this.readme(),this.configures([]),e){this.name(e.Name),this.readme(e.Readme);var t=e.Config;Object(E.isNonEmptyArray)(t)&&this.configures(A.a.map(t,function(e){return{value:O.a.observable(e[0]),placeholder:O.a.observable(e[6]),Name:e[1],Type:e[2],Label:e[3],Default:e[4],Desc:e[5]}}))}},t.prototype.tryToClosePopup=function(){var e=this,t=n(99);Object(j.isPopupVisible)(t)||Object(j.showScreenPopup)(t,[Object(D.i18n)("POPUPS_ASK/DESC_WANT_CLOSE_THIS_WINDOW"),function(){e.modalVisibility()&&Object(E.delegateRun)(e,"cancelCommand")}])},t.prototype.onBuild=function(){var e=this;C()("esc",_.KeyState.All,function(){return e.modalVisibility()&&e.tryToClosePopup(),!1})},t}(R.a),s=r.prototype,c="saveCommand",l=[o],u=m()(r.prototype,"saveCommand"),d=r.prototype,p={},Object.keys(u).forEach(function(e){p[e]=u[e]}),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=l.slice().reverse().reduce(function(e,t){return t(s,c,e)||e},p),d&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(d):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(s,c,p),p=null),a=r))||a)},function(e,t,n){"use strict";n.r(t),n.d(t,"DomainAliasPopupView",function(){return I}),n.d(t,"default",function(){return I});var i,o,a,r,s,c,l,u,d,p,f=n(18),m=n.n(f),h=n(8),g=n.n(h),b=n(12),v=n.n(b),S=n(11),y=n.n(S),w=n(4),A=n.n(w),O=n(1),T=n(0),C=n(6),_=n(10),E=n(68),D=n(21),N=n(37),j=n(9),R=n(24),I=(i=Object(j.popup)({name:"View/Popup/DomainAlias",templateID:"PopupsDomainAlias"}),o=Object(j.command)(function(e){return e.canBeSaved()}),i((r=function(e){function t(){g()(this,t);var n=v()(this,e.call(this));return n.saving=O.a.observable(!1),n.savingError=O.a.observable(""),n.name=O.a.observable(""),n.name.focused=O.a.observable(!1),n.alias=O.a.observable(""),n.domains=E.a.domainsWithoutAliases,n.domainsOptions=O.a.computed(function(){return A.a.map(n.domains(),function(e){return{optValue:e.name,optText:e.name}})}),n.canBeSaved=O.a.computed(function(){return!n.saving()&&""!==n.name()&&""!==n.alias()}),n.onDomainAliasCreateOrSaveResponse=A.a.bind(n.onDomainAliasCreateOrSaveResponse,n),n}return y()(t,e),t.prototype.createCommand=function(){this.saving(!0),D.a.createDomainAlias(this.onDomainAliasCreateOrSaveResponse,this.name(),this.alias())},t.prototype.onDomainAliasCreateOrSaveResponse=function(e,t){this.saving(!1),T.StorageResultType.Success===e&&t?t.Result?(Object(N.a)().reloadDomainList(),this.closeCommand()):T.Notification.DomainAlreadyExists===t.ErrorCode&&this.savingError(Object(_.i18n)("ERRORS/DOMAIN_ALREADY_EXISTS")):this.savingError(Object(_.i18n)("ERRORS/UNKNOWN_ERROR"))},t.prototype.onShow=function(){this.clearForm()},t.prototype.onShowWithDelay=function(){""!==this.name()||C.bMobileDevice||this.name.focused(!0)},t.prototype.clearForm=function(){this.saving(!1),this.savingError(""),this.name(""),this.name.focused(!1),this.alias("")},t}(R.a),s=r.prototype,c="createCommand",l=[o],u=m()(r.prototype,"createCommand"),d=r.prototype,p={},Object.keys(u).forEach(function(e){p[e]=u[e]}),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=l.slice().reverse().reduce(function(e,t){return t(s,c,e)||e},p),d&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(d):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(s,c,p),p=null),a=r))||a)},function(e,t,n){"use strict";n.r(t);var i=n(117),o=n(172);Object(i.a)(o.default)}]); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/app.min.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/app.min.js deleted file mode 100755 index 80b03f4d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/app.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(e){function t(o){if(n[o])return n[o].exports;var i=n[o]={i:o,l:!1,exports:{}};return e[o].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="rainloop/v/0.0.0/static/js/min/",t(t.s=201)}([function(e,t,n){"use strict";n.r(t),n.d(t,"FileType",function(){return o}),n.d(t,"StorageResultType",function(){return i}),n.d(t,"Focused",function(){return a}),n.d(t,"State",function(){return r}),n.d(t,"StateType",function(){return s}),n.d(t,"Capa",function(){return c}),n.d(t,"KeyState",function(){return l}),n.d(t,"FolderType",function(){return u}),n.d(t,"ServerFolderType",function(){return d}),n.d(t,"LoginSignMeTypeAsString",function(){return p}),n.d(t,"LoginSignMeType",function(){return h}),n.d(t,"ComposeType",function(){return f}),n.d(t,"UploadErrorCode",function(){return m}),n.d(t,"SetSystemFoldersNotification",function(){return b}),n.d(t,"ClientSideKeyName",function(){return g}),n.d(t,"EventKeyCode",function(){return y}),n.d(t,"MessageSetAction",function(){return v}),n.d(t,"MessageSelectAction",function(){return S}),n.d(t,"DesktopNotification",function(){return O}),n.d(t,"MessagePriority",function(){return w}),n.d(t,"EditorDefaultType",function(){return T}),n.d(t,"ServerSecure",function(){return C}),n.d(t,"SearchDateType",function(){return A}),n.d(t,"SaveSettingsStep",function(){return E}),n.d(t,"Layout",function(){return F}),n.d(t,"FilterConditionField",function(){return j}),n.d(t,"FilterConditionType",function(){return N}),n.d(t,"FiltersAction",function(){return R}),n.d(t,"FilterRulesType",function(){return I}),n.d(t,"SignedVerifyStatus",function(){return L}),n.d(t,"ContactPropertyType",function(){return _}),n.d(t,"Magics",function(){return P}),n.d(t,"Ports",function(){return D}),n.d(t,"Notification",function(){return M});var o={Unknown:"unknown",Text:"text",Html:"html",Code:"code",Eml:"eml",WordText:"word-text",Pdf:"pdf",Image:"image",Audio:"audio",Video:"video",Sheet:"sheet",Presentation:"presentation",Certificate:"certificate",CertificateBin:"certificate-bin",Archive:"archive"},i={Success:"success",Abort:"abort",Error:"error",Unload:"unload"},a={None:"none",MessageList:"message-list",MessageView:"message-view",FolderList:"folder-list"},r={Empty:10,Login:20,Auth:30},s={Webmail:0,Admin:1},c={TwoFactor:"TWO_FACTOR",TwoFactorForce:"TWO_FACTOR_FORCE",OpenPGP:"OPEN_PGP",Prefetch:"PREFETCH",Gravatar:"GRAVATAR",Folders:"FOLDERS",Composer:"COMPOSER",Contacts:"CONTACTS",Reload:"RELOAD",Search:"SEARCH",SearchAdv:"SEARCH_ADV",MessageActions:"MESSAGE_ACTIONS",MessageListActions:"MESSAGELIST_ACTIONS",AttachmentsActions:"ATTACHMENTS_ACTIONS",DangerousActions:"DANGEROUS_ACTIONS",Settings:"SETTINGS",Help:"HELP",Themes:"THEMES",UserBackground:"USER_BACKGROUND",Sieve:"SIEVE",Filters:"FILTERS",AttachmentThumbnails:"ATTACHMENT_THUMBNAILS",Templates:"TEMPLATES",AutoLogout:"AUTOLOGOUT",AdditionalAccounts:"ADDITIONAL_ACCOUNTS",Identities:"IDENTITIES"},l={All:"all",None:"none",ContactList:"contact-list",MessageList:"message-list",FolderList:"folder-list",MessageView:"message-view",Compose:"compose",Settings:"settings",Menu:"menu",PopupComposeOpenPGP:"compose-open-pgp",PopupMessageOpenPGP:"message-open-pgp",PopupViewOpenPGP:"view-open-pgp",PopupKeyboardShortcutsHelp:"popup-keyboard-shortcuts-help",PopupAsk:"popup-ask"},u={Inbox:10,SentItems:11,Draft:12,Trash:13,Spam:14,Archive:15,NotSpam:80,User:99},d={USER:0,INBOX:1,SENT:2,DRAFTS:3,JUNK:4,TRASH:5,IMPORTANT:10,FLAGGED:11,ALL:12},p={DefaultOff:"defaultoff",DefaultOn:"defaulton",Unused:"unused"},h={DefaultOff:0,DefaultOn:1,Unused:2},f={Empty:"empty",Reply:"reply",ReplyAll:"replyall",Forward:"forward",ForwardAsAttachment:"forward-as-attachment",Draft:"draft",EditAsNew:"editasnew"},m={Normal:0,FileIsTooBig:1,FilePartiallyUploaded:2,FileNoUploaded:3,MissingTempFolder:4,FileOnSaveingError:5,FileType:98,Unknown:99},b={None:0,Sent:1,Draft:2,Spam:3,Trash:4,Archive:5},g={FoldersLashHash:0,MessagesInboxLastHash:1,MailBoxListSize:2,ExpandedFolders:3,FolderListSize:4,MessageListSize:5,LastReplyAction:6,LastSignMe:7,ComposeLastIdentityID:8,MessageHeaderFullInfo:9,MessageAttachmnetControls:10},y={Backspace:8,Tab:9,Enter:13,Esc:27,PageUp:33,PageDown:34,Left:37,Right:39,Up:38,Down:40,End:35,Home:36,Space:32,Insert:45,Delete:46,A:65,S:83},v={SetSeen:0,UnsetSeen:1,SetFlag:2,UnsetFlag:3},S={All:0,None:1,Invert:2,Unseen:3,Seen:4,Flagged:5,Unflagged:6},O={Allowed:0,NotAllowed:1,Denied:2,NotSupported:9},w={Low:5,Normal:3,High:1},T={Html:"Html",Plain:"Plain",HtmlForced:"HtmlForced",PlainForced:"PlainForced"},C={None:0,SSL:1,TLS:2},A={All:-1,Days3:3,Days7:7,Month:30},E={Animate:-2,Idle:-1,TrueResult:1,FalseResult:0},F={NoPreview:0,SidePreview:1,BottomPreview:2},j={From:"From",Recipient:"Recipient",Subject:"Subject",Header:"Header",Size:"Size"},N={Contains:"Contains",NotContains:"NotContains",EqualTo:"EqualTo",NotEqualTo:"NotEqualTo",Regex:"Regex",Over:"Over",Under:"Under"},R={None:"None",MoveTo:"MoveTo",Discard:"Discard",Vacation:"Vacation",Reject:"Reject",Forward:"Forward"},I={All:"All",Any:"Any"},L={UnknownPublicKeys:-4,UnknownPrivateKey:-3,Unverified:-2,Error:-1,None:0,Success:1},_={Unknown:0,FullName:10,FirstName:15,LastName:16,MiddleName:16,Nick:18,NamePrefix:20,NameSuffix:21,Email:30,Phone:31,Web:32,Birthday:40,Facebook:90,Skype:91,GitHub:92,Note:110,Custom:250},P={EventWhichMouseMiddle:3,ifvisibleIdle10s:10,BitLength2048:2048,BitLength1024:1024,Size350px:350,Size50px:50,Size20px:20,Size1px:1,Time30mInMin:30,Time60m:36e5,Time30m:18e5,Time20m:12e5,Time15m:9e5,Time10m:6e5,Time5m:3e5,Time3m:18e4,Time2m:12e4,Time1m:6e4,Time30s:3e4,Time10s:1e4,Time7s:7e3,Time5s:5e3,Time3s:3e3,Time1s:1e3,Time500ms:500,Time350ms:350,Time250ms:250,Time200ms:200,Time100ms:100,Time50ms:50,Time20ms:20,Time10ms:10,Time1ms:1},D={Imap:143,ImapSsl:993,Smtp:25,SmtpSsl:465,SmtpStartTls:587},M={InvalidToken:101,AuthError:102,AccessError:103,ConnectionError:104,CaptchaError:105,SocialFacebookLoginAccessDisable:106,SocialTwitterLoginAccessDisable:107,SocialGoogleLoginAccessDisable:108,DomainNotAllowed:109,AccountNotAllowed:110,AccountTwoFactorAuthRequired:120,AccountTwoFactorAuthError:121,CouldNotSaveNewPassword:130,CurrentPasswordIncorrect:131,NewPasswordShort:132,NewPasswordWeak:133,NewPasswordForbidden:134,ContactsSyncError:140,CantGetMessageList:201,CantGetMessage:202,CantDeleteMessage:203,CantMoveMessage:204,CantCopyMessage:205,CantSaveMessage:301,CantSendMessage:302,InvalidRecipients:303,CantSaveFilters:351,CantGetFilters:352,FiltersAreNotCorrect:355,CantCreateFolder:400,CantRenameFolder:401,CantDeleteFolder:402,CantSubscribeFolder:403,CantUnsubscribeFolder:404,CantDeleteNonEmptyFolder:405,CantSaveSettings:501,CantSavePluginSettings:502,DomainAlreadyExists:601,CantInstallPackage:701,CantDeletePackage:702,InvalidPluginPackage:703,UnsupportedPluginPackage:704,LicensingServerIsUnavailable:710,LicensingExpired:711,LicensingBanned:712,DemoSendMessageError:750,DemoAccountError:751,AccountAlreadyExists:801,AccountDoesNotExist:802,MailServerError:901,ClientViewError:902,InvalidInputArgument:903,AjaxFalse:950,AjaxAbort:951,AjaxParse:952,AjaxTimeout:953,UnknownNotification:999,UnknownError:999}},function(e,t,n){"use strict";var o=n(3),i=n.n(o),a=n(4),r=n.n(a),s=n(7),c=n.n(s),l=i.a.Opentip||{};l.styles=l.styles||{},l.styles.rainloop={extends:"standard",fixed:!0,target:!0,delay:.2,hideDelay:0,hideEffect:"fade",hideEffectDuration:.2,showEffect:"fade",showEffectDuration:.2,showOn:"mouseover click",removeElementsOnHide:!0,background:"#fff",shadow:!1,borderColor:"#999",borderRadius:2,borderWidth:1},l.styles.rainloopTip={extends:"rainloop",delay:.4,group:"rainloopTips"},l.styles.rainloopErrorTip={extends:"rainloop",className:"rainloopErrorTip"};var u=n(97),d=n.n(u),p=n(0),h=i.a.ko,f=c()(i.a);h.bindingHandlers.updateWidth={init:function(e,t){var n=c()(e),o=t(),a=function(){o(n.width()),i.a.setTimeout(function(){o(n.width())},p.Magics.Time500ms)};f.on("resize",a),a(),h.utils.domNodeDisposal.addDisposeCallback(e,function(){f.off("resize",a)})}},h.bindingHandlers.editor={init:function(e,t){var o=null,i=t(),a=n(95).default,r=function(){i&&i.__editor&&i.__editor.setHtmlOrPlain(i())},s=function(){i&&i.__editor&&i(i.__editor.getDataWithHtmlMark())};h.isObservable(i)&&a&&(o=new a(e,s,function(){i.__editor=o,r()},s),i.__fetchEditorValue=s,i.subscribe(r))}},h.bindingHandlers.json={init:function(e,t){c()(e).text(i.a.JSON.stringify(h.unwrap(t())))},update:function(e,t){c()(e).text(i.a.JSON.stringify(h.unwrap(t())))}},h.bindingHandlers.scrollerShadows={init:function(e){var t=c()(e),n=t.find("[data-scroller-shadows-content]")[0]||null,o=r.a.throttle(function(){t.toggleClass("scroller-shadow-top",8=n.left&&e.pageX<=n.left+t.width()){if(e.pageY>=o-100&&e.pageY<=o){var a=function(){t.scrollTop(t.scrollTop()+3),r.windowResize()};t.data("timerScroll",i.a.setInterval(a,10)),a()}if(e.pageY>=n.top&&e.pageY<=n.top+100){var s=function(){t.scrollTop(t.scrollTop()-3),r.windowResize()};t.data("timerScroll",i.a.setInterval(s,10)),s()}}})},u.stop=function(){c()(l).each(function(){var e=c()(this);i.a.clearInterval(e.data("timerScroll")),e.data("timerScroll",!1)})}),u.helper=function(e){return t()(e&&e.target?h.dataFor(e.target):null)},c()(e).draggable(u).on("mousedown.koDraggable",function(){r.removeInFocus()}),h.utils.domNodeDisposal.addDisposeCallback(e,function(){c()(e).off("mousedown.koDraggable").draggable("destroy")})}}},h.bindingHandlers.droppable={init:function(e,t,o){if(!n(6).bMobileDevice){var i=t(),a=o(),r=a&&a.droppableOver?a.droppableOver:null,s=a&&a.droppableOut?a.droppableOut:null,l={tolerance:"pointer",hoverClass:"droppableHover",drop:null,over:null,out:null};i&&(l.drop=function(e,t){i(e,t)},r&&(l.over=function(e,t){r(e,t)}),s&&(l.out=function(e,t){s(e,t)}),c()(e).droppable(l),h.utils.domNodeDisposal.addDisposeCallback(e,function(){c()(e).droppable("destroy")}))}}},h.bindingHandlers.nano={init:function(e){var t=n(6),o=n(5);t.bDisableNanoScroll||o.appSettingsGet("useNativeScrollbars")||c()(e).addClass("nano").nanoScroller({iOSNativeScrolling:!1,preventPageScrolling:!0})}},h.bindingHandlers.saveTrigger={init:function(e){var t=c()(e);t.data("save-trigger-type",t.is("input[type=text],input[type=email],input[type=password],select,textarea")?"input":"custom"),"custom"===t.data("save-trigger-type")?t.append('  ').addClass("settings-saved-trigger"):t.addClass("settings-saved-trigger-input")},update:function(e,t){var n=h.unwrap(t()),o=c()(e);if("custom"===o.data("save-trigger-type"))switch(n.toString()){case"1":o.find(".animated,.error").hide().removeClass("visible").end().find(".success").show().addClass("visible");break;case"0":o.find(".animated,.success").hide().removeClass("visible").end().find(".error").show().addClass("visible");break;case"-2":o.find(".error,.success").hide().removeClass("visible").end().find(".animated").show().addClass("visible");break;default:o.find(".animated").hide().end().find(".error,.success").removeClass("visible")}else switch(n.toString()){case"1":o.addClass("success").removeClass("error");break;case"0":o.addClass("error").removeClass("success");break;case"-2":break;default:o.removeClass("error success")}}},h.bindingHandlers.emailsTags={init:function(e,t,o){var i=n(2),a=n(44).default,s=c()(e),l=t(),u=o().autoCompleteSource||null,d=[",",";","\n"];s.inputosaurus({parseOnBlur:!0,allowDragAndDrop:!0,focusCallback:function(e){l&&l.focused&&l.focused(!!e)},inputDelimiters:d,autoCompleteSource:u,splitHook:function(e){var t=i.trim(e);return t&&-1=i&&(i=t),i===e()&&""+i!=""+n&&e(i+1),e(i)}});return i(e()),i},h.extenders.limitedList=function(e,t){var o=n(2),i=h.computed({read:e,write:function(n){var i=h.unwrap(e),a=h.unwrap(t);o.isNonEmptyArray(a)?-11&&void 0!==arguments[1])||arguments[1];return!!i(e)&&(t?/^[0-9]*$/.test(e.toString()):/^[1-9]+[0-9]*$/.test(e.toString()))}function r(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=i(e)&&""!==e?ce.a.parseInt(e,10):t;return ce.a.isNaN(n)?t:n}function s(e){return i(e)?""+e:""}function c(e){return!!e}function l(e){return e?"1":"0"}function u(e){return Te(e)&&00&&void 0!==arguments[0]?arguments[0]:32,t="0123456789abcdefghijklmnopqrstuvwxyz",n=t.length;e=r(e);for(var o="";o.length1&&void 0!==arguments[1]?arguments[1]:100,n="",o="",i=e,a=0,r=0;i.length>t;)a=(o=i.substring(0,t)).lastIndexOf(" "),-1!==(r=o.lastIndexOf("\n"))&&(a=r),-1===a&&(a=t),n+=o.substring(0,a)+"\n",i=i.substring(a+1);return n+i}function v(){try{if(ce.a.document.activeElement)return Ee(ce.a.document.activeElement.__inFocusCache)&&(ce.a.document.activeElement.__inFocusCache=ue()(ce.a.document.activeElement).is("input,textarea,iframe,.cke_editable")),!!ce.a.document.activeElement.__inFocusCache}catch(e){}return!1}function S(e){if(ce.a.document&&ce.a.document.activeElement&&ce.a.document.activeElement.blur)try{var t=ue()(ce.a.document.activeElement);t&&t.is("input,textarea")?ce.a.document.activeElement.blur():e&&ce.a.document.activeElement.blur()}catch(e){}}function O(){try{if(ce.a&&ce.a.getSelection){var e=ce.a.getSelection();e&&e.removeAllRanges&&e.removeAllRanges()}else ce.a.document&&ce.a.document.selection&&ce.a.document.selection.empty&&ce.a.document.selection.empty()}catch(e){}}function w(e,t){e=Oe(e.toUpperCase()),t=Oe(t.replace(/[\s]+/g," "));var n=!1,o="RE"===e,i="FWD"===e,a=[],r=!i;return""!==t&&pe.a.each(t.split(":"),function(e){var t=Oe(e);n||!/^(RE|FWD)$/i.test(t)&&!/^(RE|FWD)[\[\(][\d]+[\]\)]$/i.test(t)?(a.push(e),n=!0):(o||(o=!!/^RE/i.test(t)),i||(i=!!/^FWD/i.test(t)))}),r?o=!1:i=!1,Oe((r?"Re: ":"Fwd: ")+(o?"Re: ":"")+(i?"Fwd: ":"")+Oe(a.join(":")))}function T(e,t){return ce.a.Math.round(e*ce.a.Math.pow(10,t))/ce.a.Math.pow(10,t)}function C(e){switch(e=r(e),!0){case 1073741824<=e:return T(e/1073741824,1)+"GB";case 1048576<=e:return T(e/1048576,1)+"MB";case 1024<=e:return T(e/1024,0)+"KB"}return e+"B"}function A(e){ce.a.console&&ce.a.console.log&&ce.a.console.log(e)}function E(e,t,n){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;e&&e[t]&&(o=r(o),n=Te(n)?n:[],0>=o?e[t].apply(e,n):pe.a.delay(function(){e[t].apply(e,n)},o))}function F(e){if((e=e||ce.a.event)&&e.ctrlKey&&!e.shiftKey&&!e.altKey){var t=e.keyCode||e.which;if(t===ge.EventKeyCode.S)return void e.preventDefault();if(t===ge.EventKeyCode.A){var n=e.target||e.srcElement;if(n&&("true"==""+n.contentEditable||n.tagName&&n.tagName.match(/INPUT|TEXTAREA/i)))return;ce.a.getSelection?ce.a.getSelection().removeAllRanges():ce.a.document.selection&&ce.a.document.selection.clear&&ce.a.document.selection.clear(),e.preventDefault()}}}function j(e,t){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],o=null;return(o=t?function(){for(var n=arguments.length,i=Array(n),a=0;a1&&void 0!==arguments[1]&&arguments[1];return n(10).i18n("LANGS_NAMES"+(!0===t?"_EN":"")+"/LANG_"+e.toUpperCase().replace(/[^a-zA-Z0-9]+/g,"_"),null,e)}function _(){return ue()('
 
').appendTo("#rl-hidden")}function P(e,t){t&&!Ee(t.disabled)&&e&&ue()(e).toggleClass("disabled",t.disabled).prop("disabled",t.disabled)}function D(e){e.find("blockquote.rl-bq-switcher").removeClass("rl-bq-switcher hidden-bq"),e.find(".rlBlockquoteSwitcher").off(".rlBlockquoteSwitcher").remove(),e.find("[data-html-editor-font-wrapper]").removeAttr("data-html-editor-font-wrapper")}function M(e,t,o,i){var a=e.title,r=e.subject,s=e.date,c=e.fromCreds,l=e.toCreds,u=e.toLabel,d=e.ccClass,p=e.ccCreds,h=e.ccLabel,f=ce.a.open(""),m=f.document,b=t.clone(),y=o?"html":"plain";D(b);var v=b?b.html():"";m.write(n(170).replace("{{title}}",g(a)).replace("{{subject}}",g(r)).replace("{{date}}",g(s)).replace("{{fromCreds}}",g(c)).replace("{{toCreds}}",g(l)).replace("{{toLabel}}",g(u)).replace("{{ccClass}}",g(d)).replace("{{ccCreds}}",g(p)).replace("{{ccLabel}}",g(h)).replace("{{bodyClass}}",y).replace("{{html}}",v)),m.close(),i&&ce.a.setTimeout(function(){return f.print()},100)}function k(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1e3;return o=r(o),function(i,a,r,s,c){t.call(n,a&&a.Result?ge.SaveSettingsStep.TrueResult:ge.SaveSettingsStep.FalseResult),e&&e.call(n,i,a,r,s,c),pe.a.delay(function(){t.call(n,ge.SaveSettingsStep.Idle)},o)}}function x(e,t){return k(null,e,t,1e3)}function U(e,t,n,o){return function(i){if(e){switch(n){case"bool":case"boolean":i=i?"1":"0";break;case"int":case"integer":case"number":i=r(i);break;case"trim":i=Oe(i);break;default:i=s(i)}var a={};a[t]=i,e.saveAdminConfig?e.saveAdminConfig(o||null,a):e.saveSettings&&e.saveSettings(o||null,a)}}}function H(e){return me.a?me.a.link(e,{newWindow:!0,stripPrefix:!1,urls:!0,email:!0,mention:!1,phone:!1,hashtag:!1,replaceFn:function(e){return!(e&&"url"===e.getType()&&e.matchedText&&0!==e.matchedText.indexOf("http"))}}):e}function B(e){var t,n=0,o=0,i=0,a=0,r=0,s="";for(s=e.replace(/]*><\/p>/gi,"").replace(/]*>([\s\S\r\n\t]*)<\/pre>/gim,function(){for(var e=arguments.length,t=Array(e),n=0;n").replace(/[\r]/gm,""):""}).replace(/[\s]+/gm," ").replace(/((?:href|data)\s?=\s?)("[^"]+?"|'[^']+?')/gim,function(){for(var e=arguments.length,t=Array(e),n=0;n]*>/gim,"\n").replace(/<\/h[\d]>/gi,"\n").replace(/<\/p>/gi,"\n\n").replace(/]*>/gim,"\n").replace(/<\/ul>/gi,"\n").replace(/]*>/gim," * ").replace(/<\/li>/gi,"\n").replace(/<\/td>/gi,"\n").replace(/<\/tr>/gi,"\n").replace(/]*>/gim,"\n_______________________________\n\n").replace(/]*>([\s\S\r\n]*)<\/div>/gim,function e(){for(var t=arguments.length,n=Array(t),o=0;o]*>([\s\S\r\n]*)<\/div>/gim,e),i="\n"+Oe(i)+"\n"),i}return""}).replace(/]*>/gim,"\n__bq__start__\n").replace(/<\/blockquote>/gim,"\n__bq__end__\n").replace(/]*>([\s\S\r\n]*?)<\/a>/gim,function(){for(var e=arguments.length,t=Array(e),n=0;n/gi,"\n").replace(/ /gi," ").replace(/"/gi,'"').replace(/<[^>]*>/gm,""),s=y(s=(s=be.$div.html(s).text()).replace(/\n[ \t]+/gm,"\n").replace(/[\n]{3,}/gm,"\n\n").replace(/>/gi,">").replace(/</gi,"<").replace(/&/gi,"&")),n=0,o=800;0 "+Oe(t).replace(/\n/gm,"\n> ")).replace(/(^|\n)([> ]+)/gm,function(){for(var e=arguments.length,t=Array(e),n=0;n1&&void 0!==arguments[1]&&arguments[1],n=!1,o=!0,i=!0,a=[],r="",s=0,c=(e=(e=e.toString().replace(/\r/g,"")).replace(/^>[> ]>+/gm,function(e){var t=e[0];return t?t.replace(/[ ]+/g,""):t})).split("\n");do{for(o=!1,a=[],s=0;s"===(r=c[s]).substr(0,1))&&!n?(o=!0,n=!0,a.push("~~~blockquote~~~"),a.push(r.substr(1))):!i&&n?""!==r?(n=!1,a.push("~~~/blockquote~~~"),a.push(r)):a.push(r):i&&n?a.push(r.substr(1)):a.push(r);n&&(n=!1,a.push("~~~/blockquote~~~")),c=a}while(o);return e=(e=c.join("\n")).replace(/&/g,"&").replace(/>/g,">").replace(/").replace(/[\s]*~~~\/blockquote~~~/g,"").replace(/\n/g,"
"),t?H(e):e}function K(e,t,n,o,a,r,s,c,l,u){var d=null,p=!1,h=0,f=0,m=[];for(u=!Ee(u)&&!!u,l=i(l)?l:00&&void 0!==arguments[0]&&arguments[0]?pe.a.delay(e,100):e()}function q(e){ke[e]||(ke[e]=ue()('script[type="application/json"][data-configuration="'+e+'"]'));try{return JSON.parse(ke[e].text())}catch(e){}return{}}function W(e,t){var n=t||e;n&&"function"==typeof n.dispose&&n.dispose()}function Y(e){e&&(Te(e.disposables)&&pe.a.each(e.disposables,W),he.a.utils.objectForEach(e,W))}function $(e){e&&(Te(e)?pe.a.each(e,function(e){$(e)}):e&&e.onDestroy&&e.onDestroy())}function J(e,t){return!(!e||!e[0]||(e[0].styleSheet&&!Ee(e[0].styleSheet.cssText)?e[0].styleSheet.cssText=t:e.text(t),0))}function X(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Re,n=ue()("#app-theme-link"),o=function(){xe=ce.a.setTimeout(function(){return t(ge.SaveSettingsStep.Idle)},1e3),Ue=null},i=ue()("#app-theme-style"),a=n.attr("href");a||(a=i.attr("data-href")),a&&("Json/"!==(a=(a=(a=a.toString().replace(/\/-\/[^\/]+\/\-\//,"/-/"+e+"/-/")).replace(/\/Css\/[^\/]+\/User\//,"/Css/0/User/")).replace(/\/Hash\/[^\/]+\//,"/Hash/-/")).substring(a.length-5,a.length)&&(a+="Json/"),ce.a.clearTimeout(xe),t(ge.SaveSettingsStep.Animate),Ue&&Ue.abort&&Ue.abort(),Ue=ue.a.ajax({url:a,dataType:"json"}).then(function(e){e&&Te(e)&&2===e.length&&(!n||!n[0]||i&&i[0]||(i=ue()(''),n.after(i),n.remove()),i&&i[0]&&J(i,e[1])&&i.attr("data-href",a).attr("data-theme",e[0]),t(ge.SaveSettingsStep.TrueResult))}).then(o,o))}function Z(e,t){return function(){var n=e(),o=t(),i=[],a=function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",a={current:e===n,name:""===o?e.toString():o.toString(),custom:""!==o,title:""===o?"":e.toString(),value:e.toString()};t?i.push(a):i.unshift(a)},r=0,s=0,c=2;if(1=n||o-2<=n)&&(c+=2),a(n),r=n,s=n);0=s)a(s,!0),c-=1;else if(0>=r)break;3===r?a(2,!1):3s&&a(Math.round((o+s)/2),!0,"..."),1s&&a(o,!0)}return i}}function Q(e){var t=(e=Oe(e).toLowerCase()).split(".").pop();return t===e?"":t}function ee(e){var t,n="application/octet-stream";return"winmail.dat"===(e=Oe(e).toLowerCase())?"application/ms-tnef":((t=Q(e))&&0this.height?[this.width-this.height,0]:[0,this.height-this.width],i.fillStyle="#fff",i.fillRect(0,0,t,t),i.drawImage(this,e[0]/2,e[1]/2,this.width-e[0],this.height-e[1],0,0,t,t),n(o.toDataURL("image/jpeg"))},o.src=e}function ie(e,t){if(e&&"mailto:"===e.toString().substr(0,7).toLowerCase()){if(!t)return!0;var o,i=[],a=null,r=null,c=(e=e.toString().substr(7)).replace(/\?.+$/,""),l=e.replace(/^[^\?]*\?/,""),u=n(44).default;return o=m(l),Ee(o.to)?i=u.parseEmailLine(c):(i=u.parseEmailLine(p(c+","+o.to)),i=pe.a.values(i.reduce(function(e,t){return t&&(e[t.email]&&e[t.email].name||(e[t.email]=t)),e},{}))),Ee(o.cc)||(a=u.parseEmailLine(p(o.cc))),Ee(o.bcc)||(r=u.parseEmailLine(p(o.bcc))),n(9).showScreenPopup(t,[ge.ComposeType.Empty,null,i,a,r,Ee(o.subject)?null:s(p(o.subject)),Ee(o.body)?null:G(s(p(o.body)))]),!0}return!1}function ae(e){ue()(function(){return e()})}function re(){He()}n.r(t);var se=n(3),ce=n.n(se),le=n(7),ue=n.n(le),de=n(4),pe=n.n(de),he=n(1),fe=n(96),me=n.n(fe),be=n(6),ge=n(0),ye={eml:"message/rfc822",mime:"message/rfc822",txt:"text/plain",text:"text/plain",def:"text/plain",list:"text/plain",in:"text/plain",ini:"text/plain",log:"text/plain",sql:"text/plain",cfg:"text/plain",conf:"text/plain",asc:"text/plain",rtx:"text/richtext",vcard:"text/vcard",vcf:"text/vcard",htm:"text/html",html:"text/html",csv:"text/csv",ics:"text/calendar",ifb:"text/calendar",xml:"text/xml",json:"application/json",swf:"application/x-shockwave-flash",hlp:"application/winhlp",wgt:"application/widget",chm:"application/vnd.ms-htmlhelp",p10:"application/pkcs10",p7c:"application/pkcs7-mime",p7m:"application/pkcs7-mime",p7s:"application/pkcs7-signature",torrent:"application/x-bittorrent",js:"application/javascript",pl:"text/perl",css:"text/css",asp:"text/asp",php:"application/x-httpd-php",php3:"application/x-httpd-php",php4:"application/x-httpd-php",php5:"application/x-httpd-php",phtml:"application/x-httpd-php",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",jpe:"image/jpeg",jfif:"image/jpeg",gif:"image/gif",bmp:"image/bmp",cgm:"image/cgm",ief:"image/ief",ico:"image/x-icon",tif:"image/tiff",tiff:"image/tiff",svg:"image/svg+xml",svgz:"image/svg+xml",djv:"image/vnd.djvu",djvu:"image/vnd.djvu",webp:"image/webp",zip:"application/zip","7z":"application/x-7z-compressed",rar:"application/x-rar-compressed",exe:"application/x-msdownload",dll:"application/x-msdownload",scr:"application/x-msdownload",com:"application/x-msdownload",bat:"application/x-msdownload",msi:"application/x-msdownload",cab:"application/vnd.ms-cab-compressed",gz:"application/x-gzip",tgz:"application/x-gzip",bz:"application/x-bzip",bz2:"application/x-bzip2",deb:"application/x-debian-package",psf:"application/x-font-linux-psf",otf:"application/x-font-otf",pcf:"application/x-font-pcf",snf:"application/x-font-snf",ttf:"application/x-font-ttf",ttc:"application/x-font-ttf",mp3:"audio/mpeg",amr:"audio/amr",aac:"audio/x-aac",aif:"audio/x-aiff",aifc:"audio/x-aiff",aiff:"audio/x-aiff",wav:"audio/x-wav",wma:"audio/x-ms-wma",wax:"audio/x-ms-wax",midi:"audio/midi",mp4a:"audio/mp4",ogg:"audio/ogg",weba:"audio/webm",ra:"audio/x-pn-realaudio",ram:"audio/x-pn-realaudio",rmp:"audio/x-pn-realaudio-plugin",m3u:"audio/x-mpegurl",flv:"video/x-flv",qt:"video/quicktime",mov:"video/quicktime",wmv:"video/windows-media",avi:"video/x-msvideo",mpg:"video/mpeg",mpeg:"video/mpeg",mpe:"video/mpeg",m1v:"video/mpeg",m2v:"video/mpeg","3gp":"video/3gpp","3g2":"video/3gpp2",h261:"video/h261",h263:"video/h263",h264:"video/h264",jpgv:"video/jpgv",mp4:"video/mp4",mp4v:"video/mp4",mpg4:"video/mp4",ogv:"video/ogg",webm:"video/webm",m4v:"video/x-m4v",asf:"video/x-ms-asf",asx:"video/x-ms-asf",wm:"video/x-ms-wm",wmx:"video/x-ms-wmx",wvx:"video/x-ms-wvx",movie:"video/x-sgi-movie",pdf:"application/pdf",psd:"image/vnd.adobe.photoshop",ai:"application/postscript",eps:"application/postscript",ps:"application/postscript",doc:"application/msword",dot:"application/msword",rtf:"application/rtf",xls:"application/vnd.ms-excel",ppt:"application/vnd.ms-powerpoint",docx:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",dotx:"application/vnd.openxmlformats-officedocument.wordprocessingml.template",pptx:"application/vnd.openxmlformats-officedocument.presentationml.presentation",odt:"application/vnd.oasis.opendocument.text",ods:"application/vnd.oasis.opendocument.spreadsheet"},ve=n(59);n.d(t,"trim",function(){return Oe}),n.d(t,"inArray",function(){return we}),n.d(t,"isArray",function(){return Te}),n.d(t,"isObject",function(){return Ce}),n.d(t,"isFunc",function(){return Ae}),n.d(t,"isUnd",function(){return Ee}),n.d(t,"isNull",function(){return Fe}),n.d(t,"has",function(){return je}),n.d(t,"bind",function(){return Ne}),n.d(t,"noop",function(){return Re}),n.d(t,"noopTrue",function(){return Ie}),n.d(t,"noopFalse",function(){return Le}),n.d(t,"silentTryCatch",function(){return o}),n.d(t,"isNormal",function(){return i}),n.d(t,"isPosNumeric",function(){return a}),n.d(t,"pInt",function(){return r}),n.d(t,"pString",function(){return s}),n.d(t,"pBool",function(){return c}),n.d(t,"boolToAjax",function(){return l}),n.d(t,"isNonEmptyArray",function(){return u}),n.d(t,"encodeURIComponent",function(){return d}),n.d(t,"decodeURIComponent",function(){return p}),n.d(t,"decodeURI",function(){return h}),n.d(t,"encodeURI",function(){return f}),n.d(t,"simpleQueryParser",function(){return m}),n.d(t,"fakeMd5",function(){return b}),n.d(t,"encodeHtml",function(){return g}),n.d(t,"splitPlainText",function(){return y}),n.d(t,"timeOutAction",function(){return _e}),n.d(t,"timeOutActionSecond",function(){return Pe}),n.d(t,"inFocus",function(){return v}),n.d(t,"removeInFocus",function(){return S}),n.d(t,"removeSelection",function(){return O}),n.d(t,"replySubjectAdd",function(){return w}),n.d(t,"roundNumber",function(){return T}),n.d(t,"friendlySize",function(){return C}),n.d(t,"log",function(){return A}),n.d(t,"delegateRun",function(){return E}),n.d(t,"killCtrlACtrlS",function(){return F}),n.d(t,"createCommandLegacy",function(){return j}),n.d(t,"convertThemeName",function(){return De}),n.d(t,"quoteName",function(){return N}),n.d(t,"microtime",function(){return R}),n.d(t,"timestamp",function(){return I}),n.d(t,"convertLangName",function(){return L}),n.d(t,"draggablePlace",function(){return _}),n.d(t,"defautOptionsAfterRender",function(){return P}),n.d(t,"clearBqSwitcher",function(){return D}),n.d(t,"previewMessage",function(){return M}),n.d(t,"settingsSaveHelperFunction",function(){return k}),n.d(t,"settingsSaveHelperSimpleFunction",function(){return x}),n.d(t,"settingsSaveHelperSubscribeFunction",function(){return U}),n.d(t,"findEmailAndLinks",function(){return H}),n.d(t,"htmlToPlain",function(){return B}),n.d(t,"plainToHtml",function(){return G}),n.d(t,"folderListOptionsBuilder",function(){return K}),n.d(t,"selectElement",function(){return V}),n.d(t,"detectDropdownVisibility",function(){return Me}),n.d(t,"triggerAutocompleteInputChange",function(){return z}),n.d(t,"getConfigurationFromScriptTag",function(){return q}),n.d(t,"disposeOne",function(){return W}),n.d(t,"disposeObject",function(){return Y}),n.d(t,"delegateRunOnDestroy",function(){return $}),n.d(t,"appendStyles",function(){return J}),n.d(t,"changeTheme",function(){return X}),n.d(t,"computedPagenatorHelper",function(){return Z}),n.d(t,"getFileExtension",function(){return Q}),n.d(t,"mimeContentType",function(){return ee}),n.d(t,"isTransparent",function(){return te}),n.d(t,"getRealHeight",function(){return ne}),n.d(t,"resizeAndCrop",function(){return oe}),n.d(t,"mailToHelper",function(){return ie}),n.d(t,"domReady",function(){return ae}),n.d(t,"windowResize",function(){return He}),n.d(t,"windowResizeCallback",function(){return re}),n.d(t,"jassl",function(){return ve.a});var Se,Oe=ue.a.trim,we=ue.a.inArray,Te=pe.a.isArray,Ce=pe.a.isObject,Ae=pe.a.isFunction,Ee=pe.a.isUndefined,Fe=pe.a.isNull,je=pe.a.has,Ne=pe.a.bind,Re=function(){},Ie=function(){return!0},Le=function(){return!1},_e=(Se={},function(e,t,n){Se[e]=Ee(Se[e])?0:Se[e],ce.a.clearTimeout(Se[e]),Se[e]=ce.a.setTimeout(t,n)}),Pe=function(){var e={};return function(t,n,o){e[t]||(e[t]=ce.a.setTimeout(function(){n(),e[t]=0},o))}}(),De=pe.a.memoize(function(e){return"@custom"===e.substr(-7)&&(e=Oe(e.substring(0,e.length-7))),Oe(e.replace(/[^a-zA-Z0-9]+/g," ").replace(/([A-Z])/g," $1").replace(/[\s]+/g," "))});ce.a.rainloop_Utils_htmlToPlain=B,ce.a.rainloop_Utils_plainToHtml=G;var Me=pe.a.debounce(function(){Object(be.dropdownVisibility)(!!pe.a.find(be.data.aBootstrapDropdowns,function(e){return e.hasClass("open")}))},50),ke={},xe=0,Ue=null,He=pe.a.debounce(function(e){Ee(e)||Fe(e)?be.$win.resize():ce.a.setTimeout(function(){be.$win.resize()},e)},50),Be=ce.a.String.substr;"b"!=="ab".substr(-1)&&(Be=function(e,t,n){return t=0>t?e.length+t:t,e.substr(t,n)},ce.a.String.substr=Be)},function(e,t){e.exports=window},function(e,t){e.exports=window._},function(e,t,n){"use strict";function o(e){return Object(l.isUnd)(u[e])?null:u[e]}function i(e,t){u[e]=t}function a(e){return Object(l.isUnd)(d[e])?null:d[e]}function r(e){var t=o("Capa");return Object(l.isArray)(t)&&Object(l.isNormal)(e)&&-1"),y=c()("
");y.attr("area","hidden").css({position:"absolute",left:-5e3}).appendTo(b);var v=(new i.a.Date).getTime(),S=!0,O=d.a.observable(!1).extend({rateLimit:0}),w=d.a.observable(!0),T="navigator"in i.a&&"userAgent"in i.a.navigator&&i.a.navigator.userAgent.toLowerCase()||"",C=-11&&void 0!==arguments[1])||arguments[1];return Object(k.createCommandLegacy)(null,e,t)}function a(e,t,n,o){var i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];e.__rlSettingsData={Label:n,Template:t,Route:o,IsDefault:!!i},M.VIEW_MODELS.settings.push(e)}function r(e){M.VIEW_MODELS["settings-removed"].push(e)}function s(e){M.VIEW_MODELS["settings-disabled"].push(e)}function c(){I.a.changed.active=!1}function l(){I.a.changed.active=!0}function u(e){return""===e||Object(k.isUnd)(H[e])?null:H[e]}function d(e){var t=null;return e&&(t=e,e.default&&(t=e.default)),t}function p(e){var t=d(e);t&&t.__vm&&t.__dom&&t.__vm.modalVisibility(!1)}function h(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;E.a.each(t.__names,function(o){Object(D.f)(e,[o,t.__vm,n])})}function f(e,t){if(e&&!e.__builded){var n=null,o=new e(t),a=e.__type||"",r=a?j()("#rl-content #rl-"+a.toLowerCase()):null;e.__builded=!0,e.__vm=o,o.onShowTrigger=N.a.observable(!1),o.onHideTrigger=N.a.observable(!1),o.viewModelName=e.__name,o.viewModelNames=e.__names,o.viewModelTemplateID=e.__templateID,o.viewModelPosition=e.__type,r&&1===r.length?((n=j()("
").addClass("rl-view-model").addClass("RL-"+o.viewModelTemplateID).hide()).appendTo(r),o.viewModelDom=n,e.__dom=n,B.Popup===a&&(o.cancelCommand=o.closeCommand=i(function(){p(e)}),o.modalVisibility.subscribe(function(t){t?(o.viewModelDom.show(),o.storeAndSetKeyScope(),M.popupVisibilityNames.push(o.viewModelName),o.viewModelDom.css("z-index",3e3+Object(M.popupVisibilityNames)().length+10),o.onShowTrigger&&o.onShowTrigger(!o.onShowTrigger()),Object(k.delegateRun)(o,"onShowWithDelay",[],500)):(Object(k.delegateRun)(o,"onHide"),Object(k.delegateRun)(o,"onHideWithDelay",[],500),o.onHideTrigger&&o.onHideTrigger(!o.onHideTrigger()),o.restoreKeyScope(),h("view-model-on-hide",e),M.popupVisibilityNames.remove(o.viewModelName),o.viewModelDom.css("z-index",2e3),E.a.delay(function(){return o.viewModelDom.hide()},300))})),h("view-model-pre-build",e,n),N.a.applyBindingAccessorsToNode(n[0],{translatorInit:!0,template:function(){return{name:o.viewModelTemplateID}}},o),Object(k.delegateRun)(o,"onBuild",[n]),o&&B.Popup===a&&o.registerPopupKeyDown(),h("view-model-post-build",e,n)):Object(k.log)("Cannot find view model position: "+a)}return e?e.__vm:null}function m(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=d(e);n&&(f(n),n.__vm&&n.__dom&&(Object(k.delegateRun)(n.__vm,"onBeforeShow",t||[]),n.__vm.modalVisibility(!0),Object(k.delegateRun)(n.__vm,"onShow",t||[]),h("view-model-on-show",n,t||[])))}function b(e){var t=d(e);t&&(f(t),t.__vm&&t.__dom&&Object(k.delegateRun)(t.__vm,"onWarmUp"))}function g(e){var t=d(e);return!(!t||!t.__vm)&&t.__vm.modalVisibility()}function y(e,t){var n=null,o=!1,i=null;""===Object(k.pString)(e)&&(e=U),""!==e&&((n=u(e))||(n=u(U))&&(t=e+"/"+t,e=U),n&&n.__started&&(o=x&&n===x,n.__builded||(n.__builded=!0,Object(k.isNonEmptyArray)(n.viewModels())&&E.a.each(n.viewModels(),function(e){f(e,n)}),Object(k.delegateRun)(n,"onBuild")),E.a.defer(function(){x&&!o&&(Object(k.delegateRun)(x,"onHide"),Object(k.delegateRun)(x,"onHideWithDelay",[],500),x.onHideTrigger&&x.onHideTrigger(!x.onHideTrigger()),Object(k.isNonEmptyArray)(x.viewModels())&&E.a.each(x.viewModels(),function(e){e.__vm&&e.__dom&&B.Popup!==e.__vm.viewModelPosition&&(e.__dom.hide(),e.__vm.viewModelVisibility(!1),Object(k.delegateRun)(e.__vm,"onHide"),Object(k.delegateRun)(e.__vm,"onHideWithDelay",[],500),e.__vm.onHideTrigger&&e.__vm.onHideTrigger(!e.__vm.onHideTrigger()))})),(x=n)&&!o&&(Object(k.delegateRun)(x,"onShow"),x.onShowTrigger&&x.onShowTrigger(!x.onShowTrigger()),Object(D.f)("screen-on-show",[x.screenName(),x]),Object(k.isNonEmptyArray)(x.viewModels())&&E.a.each(x.viewModels(),function(e){e.__vm&&e.__dom&&B.Popup!==e.__vm.viewModelPosition&&(Object(k.delegateRun)(e.__vm,"onBeforeShow"),e.__dom.show(),e.__vm.viewModelVisibility(!0),Object(k.delegateRun)(e.__vm,"onShow"),e.__vm.onShowTrigger&&e.__vm.onShowTrigger(!e.__vm.onShowTrigger()),Object(k.delegateRun)(e.__vm,"onShowWithDelay",[],200),h("view-model-on-show",e))})),(i=n&&n.__cross?n.__cross():null)&&i.parse(t)})))}function v(e){E.a.each(e,function(e){if(e){var t=new e,n=t?t.screenName():"";t&&""!==n&&(""===U&&(U=n),H[n]=t)}}),E.a.each(H,function(e){e&&!e.__started&&e.__start&&(e.__started=!0,e.__start(),Object(D.f)("screen-pre-start",[e.screenName(),e]),Object(k.delegateRun)(e,"onStart"),Object(D.f)("screen-post-start",[e.screenName(),e]))});var t=_.a.create();t.addRoute(/^([a-zA-Z0-9\-]*)\/?(.*)$/,y),I.a.initialized.add(t.parse,t),I.a.changed.add(t.parse,t),I.a.init(),E.a.delay(function(){return M.$html.removeClass("rl-started-trigger").addClass("rl-started")},100),E.a.delay(function(){return M.$html.addClass("rl-started-delay")},200)}function S(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];e="/"===(e="#"===e.substr(0,1)?e.substr(1):e).substr(0,1)?e.substr(1):e;var o=n?"replaceHash":"setHash";t?(I.a.changed.active=!1,I.a[o](e),I.a.changed.active=!0):(I.a.changed.active=!0,I.a[o](e),I.a.setHash(e))}function O(e){var t=e.name,n=e.type,o=e.templateID;return function(e){e&&(t&&(Object(k.isArray)(t)?e.__names=t:e.__names=[t],e.__name=e.__names[0]),n&&(e.__type=n),o&&(e.__templateID=o))}}function w(e){var t=e.name,n=e.templateID;return O({name:t,type:B.Popup,templateID:n})}function T(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return function(t,n,o){if(!n||!n.match(/Command$/))throw new Error('name "'+n+'" should end with Command suffix');var i=o.value||o.initializer(),a=Object(k.isFunc)(e)?e:function(){return!!e};return o.value=function(){if(a.call(this,this)){for(var e=arguments.length,t=Array(e),n=0;n1&&void 0!==arguments[1]&&arguments[1];f.a.defer(function(){b()("[data-i18n]",e).each(function(e,t){F(t)}),t&&S.bAnimationSupported&&b()(".i18n-animation[data-i18n]",e).letterfx({fx:"fall fade",backwards:!1,timing:50,fx_duration:"50ms",letter_end:"restore",element_end:"restore"})})}function a(){A.forEach(function(e){C[e[0]]=o(e[1])})}function r(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;e&&e(),t?E.subscribe(function(){e&&e(),t&&t()}):e&&E.subscribe(e)}function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return e=p.a.parseInt(e,10)||0,y.Notification.ClientViewError===e&&t?t:(n=n&&p.a.parseInt(n,10)||0,Object(v.isUnd)(C[e])?n&&Object(v.isUnd)(C[n])?C[n]:"":C[e])}function c(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:y.Notification.UnknownNotification;return e&&e.ErrorCode?s(Object(v.pInt)(e.ErrorCode),e.ErrorMessage||""):s(t)}function l(e){var t="";switch(p.a.parseInt(e,10)||0){case y.UploadErrorCode.FileIsTooBig:t=o("UPLOAD/ERROR_FILE_IS_TOO_BIG");break;case y.UploadErrorCode.FilePartiallyUploaded:t=o("UPLOAD/ERROR_FILE_PARTIALLY_UPLOADED");break;case y.UploadErrorCode.FileNoUploaded:t=o("UPLOAD/ERROR_NO_FILE_UPLOADED");break;case y.UploadErrorCode.MissingTempFolder:t=o("UPLOAD/ERROR_MISSING_TEMP_FOLDER");break;case y.UploadErrorCode.FileOnSaveingError:t=o("UPLOAD/ERROR_ON_SAVING_FILE");break;case y.UploadErrorCode.FileType:t=o("UPLOAD/ERROR_FILE_TYPE");break;default:t=o("UPLOAD/ERROR_UNKNOWN")}return t}function u(e,t){var n=Object(v.microtime)();return S.$html.addClass("rl-changing-language"),new p.a.Promise(function(o,i){b.a.ajax({url:Object(w.n)(t,e),dataType:"script",cache:!0}).then(function(){f.a.delay(function(){j();var e=-1t.interval&&(t.isSystemFolder()||t.subScribed()&&t.checkable())&&o.push([t.interval,t.fullNameRaw]),t&&0t[0]?1:0}),s.a.find(o,function(n){var o=Object(p.e)(n[1]);return o&&(o.interval=t,e.push(n[1])),5<=e.length}),s.a.uniq(e)},e}();t.a=new f},function(e,t,n){"use strict";function o(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=0,i=0,a=[];if(Object(g.isNonEmptyArray)(e))for(i=e.length;o1&&void 0!==arguments[1]&&arguments[1];return o(this.from,e,t)},t.prototype.fromDkimData=function(){var e=["none",""];return Object(g.isNonEmptyArray)(this.from)&&1===this.from.length&&this.from[0]&&this.from[0].dkimStatus&&(e=[this.from[0].dkimStatus,this.from[0].dkimValue||""]),e},t.prototype.toToLine=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return o(this.to,e,t)},t.prototype.ccToLine=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return o(this.cc,e,t)},t.prototype.bccToLine=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return o(this.bcc,e,t)},t.prototype.replyToToLine=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return o(this.replyTo,e,t)},t.prototype.lineAsCss=function(){return L()({deleted:this.deleted(),"deleted-mark":this.deletedMark(),selected:this.selected(),checked:this.checked(),flagged:this.flagged(),unseen:this.unseen(),answered:this.answered(),forwarded:this.forwarded(),focused:this.focused(),important:this.isImportant(),withAttachments:this.hasAttachments(),new:this.newForAnimation(),emptySubject:""===this.subject(),hasUnseenSubMessage:this.hasUnseenSubMessage(),hasFlaggedSubMessage:this.hasFlaggedSubMessage()})},t.prototype.hasVisibleAttachments=function(){return!!p.a.find(this.attachments(),function(e){return!e.isLinked})},t.prototype.findAttachmentByCid=function(e){var t=null,n=this.attachments();return Object(g.isNonEmptyArray)(n)&&(e=e.replace(/^<+/,"").replace(/>+$/,""),t=p.a.find(n,function(t){return e===t.cidWithOutTags})),t||null},t.prototype.findAttachmentByContentLocation=function(e){var t=null,n=this.attachments();return Object(g.isNonEmptyArray)(n)&&(t=p.a.find(n,function(t){return e===t.contentLocation})),t||null},t.prototype.messageId=function(){return this.sMessageId},t.prototype.inReplyTo=function(){return this.sInReplyTo},t.prototype.references=function(){return this.sReferences},t.prototype.fromAsSingleEmail=function(){return Object(g.isArray)(this.from)&&this.from[0]?this.from[0].email:""},t.prototype.viewLink=function(){return Object(O.q)(this.requestHash)},t.prototype.downloadLink=function(){return Object(O.p)(this.requestHash)},t.prototype.replyEmails=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=[],o=Object(g.isUnd)(e)?{}:e;return r(this.replyTo,o,n),0===n.length&&r(this.from,o,n),0!==n.length||t?n:this.replyEmails({},!0)},t.prototype.replyAllEmails=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=[],o=[],i=Object(g.isUnd)(e)?{}:e;return r(this.replyTo,i,n),0===n.length&&r(this.from,i,n),r(this.to,i,n),r(this.cc,i,o),0!==n.length||t?[n,o]:[this.replyAllEmails({},!0)[0],o]},t.prototype.textBodyToString=function(){return this.body?this.body.html():""},t.prototype.attachmentsToStringLine=function(){var e=p.a.map(this.attachments(),function(e){return e.fileName+" ("+e.friendlySize+")"});return e&&00&&void 0!==arguments[0]&&arguments[0];this.showLazyExternalImagesInBody();var t=this.dateTimeStampInUTC()||0,n=this.ccToLine(!1),o=00&&void 0!==arguments[0]&&arguments[0];if(this.body&&this.body.data("rl-has-images")){this.hasImages(!1),this.body.data("rl-has-images",!1);var t=this.proxy?"data-x-additional-src":"data-x-src";m()("["+t+"]",this.body).each(function(){var n=m()(this);e&&n.is("img")?n.addClass("lazy").attr("data-original",n.attr(t)).removeAttr("data-loaded"):n.attr("src",n.attr(t)).removeAttr("data-loaded")}),t=this.proxy?"data-x-additional-style-url":"data-x-style-url",m()("["+t+"]",this.body).each(function(){var e=m()(this),n=Object(g.trim)(e.attr("style"));n=""===n?"":";"===n.substr(-1)?n+" ":n+"; ",e.attr("style",n+e.attr(t))}),e&&(this.lozad(),S.$win.resize()),Object(g.windowResize)(500)}},t.prototype.showInternalImages=function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(this.body&&!this.body.data("rl-init-internal-images")){this.body.data("rl-init-internal-images",!0);var n=this;m()("[data-x-src-cid]",this.body).each(function(){var e=m()(this),o=n.findAttachmentByCid(e.attr("data-x-src-cid"));o&&o.download&&(t&&e.is("img")?e.addClass("lazy").attr("data-original",o.linkPreview()):e.attr("src",o.linkPreview()))}),m()("[data-x-src-location]",this.body).each(function(){var e=m()(this),o=n.findAttachmentByContentLocation(e.attr("data-x-src-location"));o||(o=n.findAttachmentByCid(e.attr("data-x-src-location"))),o&&o.download&&(t&&e.is("img")?e.addClass("lazy").attr("data-original",o.linkPreview()):e.attr("src",o.linkPreview()))}),m()("[data-x-style-cid]",this.body).each(function(){var e="",t="",o=m()(this),i=n.findAttachmentByCid(o.attr("data-x-style-cid"));i&&i.linkPreview&&""!==(t=o.attr("data-x-style-cid-name"))&&(e=""===(e=Object(g.trim)(o.attr("style")))?"":";"===e.substr(-1)?e+" ":e+"; ",o.attr("style",e+t+": url('"+i.linkPreview()+"')"))}),t&&p.a.delay(function(){return e.lozad()},300),Object(g.windowResize)(500)}},t.prototype.storeDataInDom=function(){this.body&&(this.body.data("rl-is-html",!!this.isHtml()),this.body.data("rl-has-images",!!this.hasImages()))},t.prototype.fetchDataFromDom=function(){this.body&&(this.isHtml(!!this.body.data("rl-is-html")),this.hasImages(!!this.body.data("rl-has-images")))},t.prototype.replacePlaneTextBody=function(e){this.body&&this.body.html(e).addClass("b-text-part plain")},t.prototype.flagHash=function(){return[this.deleted(),this.deletedMark(),this.unseen(),this.flagged(),this.answered(),this.forwarded(),this.isReadReceipt()].join(",")},t}(n(36).a),U=n(9),H=n(26),B=n(31),G=n(28),K=n(62),V=n(20),z=n(17),q=function(){function e(){c()(this,e),this.staticMessage=new x,this.messageList=h.a.observableArray([]).extend({rateLimit:0}),this.messageListCount=h.a.observable(0),this.messageListSearch=h.a.observable(""),this.messageListThreadUid=h.a.observable(""),this.messageListPage=h.a.observable(1),this.messageListPageBeforeThread=h.a.observable(1),this.messageListError=h.a.observable(""),this.messageListEndFolder=h.a.observable(""),this.messageListEndSearch=h.a.observable(""),this.messageListEndThreadUid=h.a.observable(""),this.messageListEndPage=h.a.observable(1),this.messageListLoading=h.a.observable(!1),this.messageListIsNotCompleted=h.a.observable(!1),this.messageListCompleteLoadingThrottle=h.a.observable(!1).extend({throttle:200}),this.messageListCompleteLoadingThrottleForAnimation=h.a.observable(!1).extend({specialThrottle:700}),this.messageListDisableAutoSelect=h.a.observable(!1).extend({falseTimeout:500}),this.selectorMessageSelected=h.a.observable(null),this.selectorMessageFocused=h.a.observable(null),this.message=h.a.observable(null),this.message.viewTrigger=h.a.observable(!1),this.messageError=h.a.observable(""),this.messageCurrentLoading=h.a.observable(!1),this.messageLoadingThrottle=h.a.observable(!1).extend({throttle:b.Magics.Time50ms}),this.messageFullScreenMode=h.a.observable(!1),this.messagesBodiesDom=h.a.observable(null),this.messageActiveDom=h.a.observable(null),this.computers(),this.subscribers(),this.onMessageResponse=p.a.bind(this.onMessageResponse,this),this.purgeMessageBodyCacheThrottle=p.a.throttle(this.purgeMessageBodyCache,b.Magics.Time30s)}return e.prototype.computers=function(){var e=this;this.messageLoading=h.a.computed(function(){return e.messageCurrentLoading()}),this.messageListEndHash=h.a.computed(function(){return e.messageListEndFolder()+"|"+e.messageListEndSearch()+"|"+e.messageListEndThreadUid()+"|"+e.messageListEndPage()}),this.messageListPageCount=h.a.computed(function(){var t=u.a.Math.ceil(e.messageListCount()/G.a.messagesPerPage());return 0>=t?1:t}),this.mainMessageListSearch=h.a.computed({read:this.messageListSearch,write:function(t){Object(U.setHash)(Object(O.o)(D.a.currentFolderFullNameHash(),1,Object(g.trim)(t.toString()),e.messageListThreadUid()))}}),this.messageListCompleteLoading=h.a.computed(function(){var t=e.messageListLoading(),n=e.messageListIsNotCompleted();return t||n}),this.isMessageSelected=h.a.computed(function(){return null!==e.message()}),this.messageListChecked=h.a.computed(function(){return p.a.filter(e.messageList(),function(e){return e.checked()})}).extend({rateLimit:0}),this.hasCheckedMessages=h.a.computed(function(){return 0n.data("rl-cache-count")&&(n.addClass("rl-cache-purge"),e+=1)}),02&&void 0!==arguments[2]?arguments[2]:"",i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];t=p.a.map(t,function(e){return Object(g.pInt)(e)});var a=0,r=this.messageList(),s=this.message(),c=D.a.trashFolder(),l=D.a.spamFolder(),u=Object(y.e)(e),d=""===o?null:Object(y.e)(o||""),h=D.a.currentFolderFullNameRaw()===e?p.a.filter(r,function(e){return e&&-1').insertBefore(e).on("click.rlBlockquoteSwitcher",function(){e.toggleClass("hidden-bq"),Object(g.windowResize)()}).after("
").before("
"))})}},e.prototype.initOpenPgpControls=function(e,t){e&&e.find&&e.find(".b-plain-openpgp:not(.inited)").each(function(){M.a.initMessageBodyControls(m()(this),t)})},e.prototype.setMessage=function(e,t){var n=!1,o=null,i="",a="",r="",s=!1,c=this.messagesBodiesDom(),l=this.selectorMessageSelected(),u=this.message();if(e&&u&&e.Result&&"Object/Message"===e.Result["@Object"]&&u.folderFullNameRaw===e.Result.Folder){var d=u.threads();if(u.uid!==e.Result.Uid&&1').text(a)).html():v&&u.isPgpEncrypted()?S.$div.append(m()('
').text(a)).html():"
"+r+"
",S.$div.empty(),u.isPgpSigned(s),u.isPgpEncrypted(v)}else r="
"+r+"
";else f=!1,r="
"+r+"
";S.data.iMessageBodyCacheCount+=1,(o=m()('
').hide().addClass("rl-cache-class")).data("rl-cache-count",S.data.iMessageBodyCacheCount),o.html(Object(g.findEmailAndLinks)(r)).addClass("b-text-part "+(f?"html":"plain")),u.isHtml(!!f),u.hasImages(!!e.Result.HasExternals),u.body=o,u.body&&c.append(u.body),u.storeDataInDom(),e.Result.HasInternals&&u.showInternalImages(!0),u.hasImages()&&G.a.showImages()&&u.showExternalImages(!0),this.purgeMessageBodyCacheThrottle()}this.messageActiveDom(u.body),this.hideMessageBodies(),o&&(this.initOpenPgpControls(o,u),this.initBlockquoteSwitcher(o)),u.body.show()}Object(y.n)(u),(u.unseen()||u.hasUnseenSubMessage())&&Object(V.a)().messageListAction(u.folderFullNameRaw,b.MessageSetAction.SetSeen,[u]),n&&(u=this.message(),l&&u&&(u.folderFullNameRaw!==l.folderFullNameRaw||u.uid!==l.uid)?(this.selectorMessageSelected(null),1===this.messageList().length&&this.selectorMessageFocused(null)):!l&&u&&(l=p.a.find(this.messageList(),function(e){return e&&e.folderFullNameRaw===u.folderFullNameRaw&&e.uid===u.uid}))&&(this.selectorMessageSelected(l),this.selectorMessageFocused(l))),Object(g.windowResize)()}}},e.prototype.selectMessage=function(e){e?(this.message(this.staticMessage.populateByMessageListItem(e)),this.populateMessageBody(this.message())):this.message(null)},e.prototype.selectMessageByFolderAndUid=function(e,t){e&&t?(this.message(this.staticMessage.populateByMessageListItem(null)),this.message().folderFullNameRaw=e,this.message().uid=t,this.populateMessageBody(this.message())):this.message(null)},e.prototype.populateMessageBody=function(e){e&&z.a.message(this.onMessageResponse,e.folderFullNameRaw,e.uid)&&this.messageCurrentLoading(!0)},e.prototype.onMessageResponse=function(e,t,n){this.hideMessageBodies(),this.messageCurrentLoading(!1),b.StorageResultType.Success===e&&t&&t.Result?this.setMessage(t,n):b.StorageResultType.Unload===e?(this.message(null),this.messageError("")):b.StorageResultType.Abort!==e&&(this.message(null),this.messageError(t&&t.ErrorCode?Object(w.getNotification)(t.ErrorCode):Object(w.getNotification)(b.Notification.UnknownError)))},e.prototype.calculateMessageListHash=function(e){return p.a.map(e,function(e){return e.hash+"_"+e.threadsLen()+"_"+e.flagHash()}).join("|")},e.prototype.setMessageList=function(e,t){if(e&&e.Result&&"Collection/MessageCollection"===e.Result["@Object"]&&e.Result["@Collection"]&&Object(g.isArray)(e.Result["@Collection"])){var n=0,o=!1,i=[],a=Object(T.momentNowUnix)(),r=Object(g.pInt)(e.Result.MessageResultCount),s=Object(g.pInt)(e.Result.Offset),c=Object(y.e)(Object(g.isNormal)(e.Result.Folder)?e.Result.Folder:"");c&&!t&&(c.interval=a,Object(y.q)(e.Result.Folder,e.Result.FolderHash),Object(g.isNormal)(e.Result.MessageCount)&&c.messageCountAll(e.Result.MessageCount),Object(g.isNormal)(e.Result.MessageUnseenCount)&&(Object(g.pInt)(c.messageCountUnread())!==Object(g.pInt)(e.Result.MessageUnseenCount)&&(o=!0),c.messageCountUnread(e.Result.MessageUnseenCount)),this.initUidNextAndNewMessages(c.fullNameRaw,e.Result.UidNext,e.Result.NewMessages)),o&&c&&Object(y.c)(c.fullNameRaw),p.a.each(e.Result["@Collection"],function(e){if(e&&"Object/Message"===e["@Object"]){var o=x.newInstanceFromJson(e);o&&(Object(y.l)(o.folderFullNameRaw,o.uid)&&5>=n&&(n+=1,o.newForAnimation(!0)),o.deleted(!1),t?Object(y.n)(o):Object(y.u)(o),i.push(o))}}),this.messageListCount(r),this.messageListSearch(Object(g.isNormal)(e.Result.Search)?e.Result.Search:""),this.messageListPage(u.a.Math.ceil(s/G.a.messagesPerPage()+1)),this.messageListThreadUid(Object(g.isNormal)(e.Result.ThreadUid)?Object(g.pString)(e.Result.ThreadUid):""),this.messageListEndFolder(Object(g.isNormal)(e.Result.Folder)?e.Result.Folder:""),this.messageListEndSearch(this.messageListSearch()),this.messageListEndThreadUid(this.messageListThreadUid()),this.messageListEndPage(this.messageListPage()),this.messageListDisableAutoSelect(!0),this.messageList(i),this.messageListIsNotCompleted(!1),Object(y.d)(),c&&(t||o||G.a.useThreads())&&Object(V.a)().folderInformation(c.fullNameRaw,i)}else this.messageListCount(0),this.messageList([]),this.messageListError(Object(w.getNotification)(e&&e.ErrorCode?e.ErrorCode:b.Notification.CantGetMessageList))},e}();t.a=new q},function(e,t,n){"use strict";function o(e,t){e=Object(R.trim)(e),t(H&&""!==e?I.h(e):"",e)}function i(e,t){return e+"#"+t}function a(e,t){U[i(e,t)]=!0}function r(e,t){return!0===U[i(e,t)]}function s(e,t){k[i(e,t)]=!0}function c(e,t){return!!k[i(e,t)]&&(k[i(e,t)]=null,!0)}function l(){k={}}function u(){return""===x?"INBOX":x}function d(e){return""!==e&&_[e]?_[e]:""}function p(e,t){_[e]=t,"INBOX"!==t&&""!==x||(x=t)}function h(e){return""!==e&&P[e]?P[e]:""}function f(e,t){""!==e&&(P[e]=t)}function m(e){return""!==e&&D[e]?D[e]:""}function b(e,t){D[e]=t}function g(e){return""!==e&&L[e]?L[e]:null}function y(e,t){L[e]=t}function v(e){y(e,null)}function S(e,t){return M[e]&&M[e][t]?M[e][t]:null}function O(e,t,n){M[e]||(M[e]={}),M[e][t]=n}function w(e){M[e]={}}function T(e){if(e){var t=e.uid,n=S(e.folderFullNameRaw,t);if(n&&00&&void 0!==arguments[0]?arguments[0]:"";return W+Object(V.pString)(e)}function r(){return ee?q:Y+te}function s(){return q}function c(e,t,n){return n=Object(V.isUnd)(n)?ne:n,Y+"/Raw/"+$+"/"+n+"/"+e+"/"+$+"/"+t}function l(e,t){return c("Download",e,t)}function u(e,t){return c("View",e,t)}function d(e,t){return c("ViewThumbnail",e,t)}function p(e,t){return c("ViewAsPlain",e,t)}function h(e,t){return c("FramedView",e,t)}function f(e){return Y+"/"+e+"/"+$+"/"+ne+"/"}function m(){return f("Upload")}function b(){return f("UploadContacts")}function g(){return f("UploadBackground")}function y(){return f("Append")}function v(e){return f("Change")+Object(V.encodeURIComponent)(e)+"/"}function S(e){return f("Ajax")+e}function O(e){return Y+"/Raw/"+$+"/"+ne+"/ViewAsPlain/"+$+"/"+e}function w(e){return Y+"/Raw/"+$+"/"+ne+"/Download/"+$+"/"+e}function T(e){return Y+"/Raw/0/Avatar/"+Object(V.encodeURIComponent)(e)+"/"}function C(e){return Y+"/Raw/"+$+"/"+ne+"/UserBackground/"+$+"/"+e}function A(){return Y+"/Info"}function E(e,t){return Y+"/Lang/0/"+(t?"Admin":"App")+"/"+K.a.encodeURI(e)+"/"+J+"/"}function F(){return Y+"/Raw/"+$+"/"+ne+"/ContactsVcf/"}function j(){return Y+"/Raw/"+$+"/"+ne+"/ContactsCsv/"}function N(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Y+"SocialGoogle"+(""!==ne?"/"+$+"/"+ne+"/":"")+(e?"&xauth=1":"")}function R(){return Y+"SocialTwitter"+(""!==ne?"/"+$+"/"+ne+"/":"")}function I(){return Y+"SocialFacebook"+(""!==ne?"/"+$+"/"+ne+"/":"")}function L(e){return Q+e}function _(){return L("css/images/empty-contact.png")}function P(e){return L("sounds/"+e)}function D(){return L("css/images/icom-message-notification.png")}function M(){return L("js/min/openpgp.min.js")}function k(){return L("js/min/openpgp.worker.min.js")}function x(e){var t=Z;return"@custom"===e.substr(-7)&&(e=Object(V.trim)(e.substring(0,e.length-7)),t=X),t+"themes/"+K.a.encodeURI(e)+"/images/preview.png"}function U(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"INBOX";return W+"mailbox/"+e}function H(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return W+"settings"+(e?"/"+e:"")}function B(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";t=Object(V.isNormal)(t)?Object(V.pInt)(t):1,n=Object(V.pString)(n);var i=W+"mailbox/";if(""!==e){var a=Object(V.pInt)(o);i+=K.a.encodeURI(e)+(0>2,r=(3&n)<<4|(o=e.charCodeAt(l++))>>4,s=(15&o)<<2|(i=e.charCodeAt(l++))>>6,c=63&i,isNaN(o)?s=c=64:isNaN(i)&&(c=64),t=t+m.charAt(a)+m.charAt(r)+m.charAt(s)+m.charAt(c);return t},decode:function(e){var t="",n=void 0,o=void 0,i=void 0,a=void 0,r=void 0,s=void 0,c=0;for(e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");c>4,o=(15&a)<<4|(r=m.indexOf(e.charAt(c++)))>>2,i=(3&r)<<6|(s=m.indexOf(e.charAt(c++))),t+=String.fromCharCode(n),64!==r&&(t+=String.fromCharCode(o)),64!==s&&(t+=String.fromCharCode(i));return b._utf8_decode(t)},_utf8_encode:function(e){for(var t="",n=0,o=(e=e.replace(/\r\n/g,"\n")).length,i=0;n127&&i<2048?(t+=String.fromCharCode(i>>6|192),t+=String.fromCharCode(63&i|128)):(t+=String.fromCharCode(i>>12|224),t+=String.fromCharCode(i>>6&63|128),t+=String.fromCharCode(63&i|128));return t},_utf8_decode:function(e){for(var t="",n=0,o=0,i=0,a=0;n191&&o<224?(i=e.charCodeAt(n+1),t+=String.fromCharCode((31&o)<<6|63&i),n+=2):(i=e.charCodeAt(n+1),a=e.charCodeAt(n+2),t+=String.fromCharCode((15&o)<<12|(63&i)<<6|63&a),n+=3);return t}},g=(b.decode,b.encode,b.urlsafe_encode),y=n(5),v=n(26),S=n(28),O=n(20),w=function(e){function t(){i()(this,t);var n=r()(this,e.call(this));return n.oRequests={},n}return c()(t,e),t.prototype.folders=function(e){this.defaultRequest(e,"Folders",{SentFolder:y.settingsGet("SentFolder"),DraftFolder:y.settingsGet("DraftFolder"),SpamFolder:y.settingsGet("SpamFolder"),TrashFolder:y.settingsGet("TrashFolder"),ArchiveFolder:y.settingsGet("ArchiveFolder")},null,"",["Folders"])},t.prototype.login=function(e,t,n,o,i,a,r,s){this.defaultRequest(e,"Login",{Email:t,Login:n,Password:o,Language:a||"",AdditionalCode:r||"",AdditionalCodeSignMe:s?"1":"0",SignMe:i?"1":"0"})},t.prototype.getTwoFactor=function(e){this.defaultRequest(e,"GetTwoFactorInfo")},t.prototype.createTwoFactor=function(e){this.defaultRequest(e,"CreateTwoFactorSecret")},t.prototype.clearTwoFactor=function(e){this.defaultRequest(e,"ClearTwoFactorInfo")},t.prototype.showTwoFactorSecret=function(e){this.defaultRequest(e,"ShowTwoFactorSecret")},t.prototype.testTwoFactor=function(e,t){this.defaultRequest(e,"TestTwoFactorInfo",{Code:t})},t.prototype.enableTwoFactor=function(e,t){this.defaultRequest(e,"EnableTwoFactor",{Enable:t?"1":"0"})},t.prototype.clearTwoFactorInfo=function(e){this.defaultRequest(e,"ClearTwoFactorInfo")},t.prototype.contactsSync=function(e){this.defaultRequest(e,"ContactsSync",null,p.d)},t.prototype.saveContactsSyncData=function(e,t,n,o,i){this.defaultRequest(e,"SaveContactsSyncData",{Enable:t?"1":"0",Url:n,User:o,Password:i})},t.prototype.accountSetup=function(e,t,n){var o=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];this.defaultRequest(e,"AccountSetup",{Email:t,Password:n,New:o?"1":"0"})},t.prototype.accountDelete=function(e,t){this.defaultRequest(e,"AccountDelete",{EmailToDelete:t})},t.prototype.accountsAndIdentitiesSortOrder=function(e,t,n){this.defaultRequest(e,"AccountsAndIdentitiesSortOrder",{Accounts:t,Identities:n})},t.prototype.identityUpdate=function(e,t,n,o,i,a,r,s){this.defaultRequest(e,"IdentityUpdate",{Id:t,Email:n,Name:o,ReplyTo:i,Bcc:a,Signature:r,SignatureInsertBefore:s?"1":"0"})},t.prototype.identityDelete=function(e,t){this.defaultRequest(e,"IdentityDelete",{IdToDelete:t})},t.prototype.accountsAndIdentities=function(e){this.defaultRequest(e,"AccountsAndIdentities")},t.prototype.accountsCounts=function(e){this.defaultRequest(e,"AccountsCounts")},t.prototype.filtersSave=function(e,t,n,o){this.defaultRequest(e,"FiltersSave",{Raw:n,RawIsActive:Object(d.boolToAjax)(o),Filters:u.a.map(t,function(e){return e.toJson()})})},t.prototype.filtersGet=function(e){this.defaultRequest(e,"Filters",{})},t.prototype.templates=function(e){this.defaultRequest(e,"Templates",{})},t.prototype.templateGetById=function(e,t){this.defaultRequest(e,"TemplateGetByID",{ID:t})},t.prototype.templateDelete=function(e,t){this.defaultRequest(e,"TemplateDelete",{IdToDelete:t})},t.prototype.templateSetup=function(e,t,n,o){this.defaultRequest(e,"TemplateSetup",{ID:t,Name:n,Body:o})},t.prototype.messageList=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:20,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"",r=arguments.length>6&&void 0!==arguments[6]&&arguments[6];t=Object(d.pString)(t);var s=Object(h.g)(t),c=v.a.threadsAllowed()&&S.a.useThreads(),l=Object(h.h)()===t?Object(h.i)(t):"";return""===s||""!==i&&-1!==i.indexOf("is:")?this.defaultRequest(e,"MessageList",{Folder:t,Offset:n,Limit:o,Search:i,UidNext:l,UseThreads:c?"1":"0",ThreadUid:c?a:""},""===i?p.g:p.m,"",r?[]:["MessageList"]):this.defaultRequest(e,"MessageList",{},""===i?p.g:p.m,"MessageList/"+Object(f.E)()+"/"+g([t,n,o,i,v.a.projectHash(),s,l,c?"1":"0",c?a:""].join(String.fromCharCode(0))),r?[]:["MessageList"])},t.prototype.messageUploadAttachments=function(e,t){this.defaultRequest(e,"MessageUploadAttachments",{Attachments:t},999e3)},t.prototype.message=function(e,t,n){return t=Object(d.pString)(t),n=Object(d.pInt)(n),!!(Object(h.e)(t)&&02&&void 0!==arguments[2]?arguments[2]:[],o=!0,i=[];Object(d.isArray)(n)&&03&&void 0!==arguments[3]?arguments[3]:null;this.defaultRequest(e,"MessageSetSeenToAll",{Folder:t,SetAction:n?"1":"0",ThreadUids:o?o.join(","):""})},t.prototype.saveMessage=function(e,t,n,o,i,a,r,s,c,l,u,d,h,f,m,b,g){this.defaultRequest(e,"SaveMessage",{IdentityID:t,MessageFolder:n,MessageUid:o,DraftFolder:i,To:a,Cc:r,Bcc:s,ReplyTo:c,Subject:l,TextIsHtml:u?"1":"0",Text:d,DraftInfo:f,InReplyTo:m,References:b,MarkAsImportant:g?"1":"0",Attachments:h},p.l)},t.prototype.sendReadReceiptMessage=function(e,t,n,o,i,a){this.defaultRequest(e,"SendReadReceiptMessage",{MessageFolder:t,MessageUid:n,ReadReceipt:o,Subject:i,Text:a})},t.prototype.sendMessage=function(e,t,n,o,i,a,r,s,c,l,u,d,h,f,m,b,g,y,v){this.defaultRequest(e,"SendMessage",{IdentityID:t,MessageFolder:n,MessageUid:o,SentFolder:i,To:a,Cc:r,Bcc:s,ReplyTo:c,Subject:l,TextIsHtml:u?"1":"0",Text:d,DraftInfo:f,InReplyTo:m,References:b,Dsn:g?"1":"0",ReadReceiptRequest:y?"1":"0",MarkAsImportant:v?"1":"0",Attachments:h},p.n)},t.prototype.saveSystemFolders=function(e,t){this.defaultRequest(e,"SystemFoldersUpdate",t)},t.prototype.saveSettings=function(e,t){this.defaultRequest(e,"SettingsUpdate",t)},t.prototype.saveSettingsHelper=function(e,t,n){var o=this;return function(i){var a;o.saveSettings(n||null,((a={})[e]=t?t(i):i,a))}},t.prototype.changePassword=function(e,t,n){this.defaultRequest(e,"ChangePassword",{PrevPassword:t,NewPassword:n})},t.prototype.folderClear=function(e,t){this.defaultRequest(e,"FolderClear",{Folder:t})},t.prototype.folderSetSubscribe=function(e,t,n){this.defaultRequest(e,"FolderSubscribe",{Folder:t,Subscribe:n?"1":"0"})},t.prototype.folderSetCheckable=function(e,t,n){this.defaultRequest(e,"FolderCheckable",{Folder:t,Checkable:n?"1":"0"})},t.prototype.messagesMove=function(e,t,n,o,i,a){this.defaultRequest(e,"MessageMove",{FromFolder:t,ToFolder:n,Uids:o.join(","),MarkAsRead:a?"1":"0",Learning:i||""},null,"",["MessageList"])},t.prototype.messagesCopy=function(e,t,n,o){this.defaultRequest(e,"MessageCopy",{FromFolder:t,ToFolder:n,Uids:o.join(",")})},t.prototype.messagesDelete=function(e,t,n){this.defaultRequest(e,"MessageDelete",{Folder:t,Uids:n.join(",")},null,"",["MessageList"])},t.prototype.appDelayStart=function(e){this.defaultRequest(e,"AppDelayStart")},t.prototype.quota=function(e){this.defaultRequest(e,"Quota")},t.prototype.contacts=function(e,t,n,o){this.defaultRequest(e,"Contacts",{Offset:t,Limit:n,Search:o},null,"",["Contacts"])},t.prototype.contactSave=function(e,t,n,o){this.defaultRequest(e,"ContactSave",{RequestUid:t,Uid:Object(d.trim)(n),Properties:o})},t.prototype.contactsDelete=function(e,t){this.defaultRequest(e,"ContactsDelete",{Uids:t.join(",")})},t.prototype.suggestions=function(e,t,n){this.defaultRequest(e,"Suggestions",{Query:t,Page:n},null,"",["Suggestions"])},t.prototype.clearUserBackground=function(e){this.defaultRequest(e,"ClearUserBackground")},t.prototype.facebookUser=function(e){this.defaultRequest(e,"SocialFacebookUserInformation")},t.prototype.facebookDisconnect=function(e){this.defaultRequest(e,"SocialFacebookDisconnect")},t.prototype.twitterUser=function(e){this.defaultRequest(e,"SocialTwitterUserInformation")},t.prototype.twitterDisconnect=function(e){this.defaultRequest(e,"SocialTwitterDisconnect")},t.prototype.googleUser=function(e){this.defaultRequest(e,"SocialGoogleUserInformation")},t.prototype.googleDisconnect=function(e){this.defaultRequest(e,"SocialGoogleDisconnect")},t.prototype.socialUsers=function(e){this.defaultRequest(e,"SocialUsers")},t}(n(115).a);t.a=new w},function(e,t,n){e.exports={default:n(111),__esModule:!0}},function(e,t){e.exports=window.key},function(e,t,n){"use strict";function o(){return n(173).default}n.d(t,"a",function(){return o})},,function(e,t,n){"use strict";function o(e,t,n){Object(s.isObject)(e)?(n=t||null,t=null,r.a.each(e,function(e,t){o(t,e,n)})):(Object(s.isUnd)(l[e])&&(l[e]=[]),l[e].push([t,n]))}function i(e,t){c.f("rl-pub",[e,t]),Object(s.isUnd)(l[e])||r.a.each(l[e],function(e){e[0]&&e[0].apply(e[1]||null,t||[])})}n.d(t,"b",function(){return o}),n.d(t,"a",function(){return i});var a=n(4),r=n.n(a),s=n(2),c=n(29),l={}},function(e,t,n){"use strict";n.d(t,"i",function(){return o}),n.d(t,"j",function(){return i}),n.d(t,"c",function(){return a}),n.d(t,"g",function(){return r}),n.d(t,"m",function(){return s}),n.d(t,"n",function(){return c}),n.d(t,"l",function(){return l}),n.d(t,"d",function(){return u}),n.d(t,"r",function(){return d}),n.d(t,"b",function(){return p}),n.d(t,"h",function(){return h}),n.d(t,"p",function(){return f}),n.d(t,"o",function(){return m}),n.d(t,"k",function(){return b}),n.d(t,"a",function(){return g}),n.d(t,"q",function(){return y}),n.d(t,"f",function(){return v}),n.d(t,"e",function(){return S});var o=20,i=[10,20,30,50,100],a=50,r=3e4,s=3e5,c=3e5,l=2e5,u=2e5,d="__UNUSE__",p="rlcsc",h=143,f=25,m=4190,b=15,g=7,y=10,v="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAuCAYAAABXuSs3AAAHHklEQVRoQ7VZW08bVxCeXRuwIbTGXIwNtBBaqjwgVUiR8lDlbza9qe1DpVZ9aNQ/0KpPeaJK07SpcuEeCEmUAObm21bfrL9lONjexSYrWfbunj37zXdmvpkz9oIgCKTD0Wg0xPd94TDP83Q0zvWa50vzklSrdanVanqf4/D84GBGr+F+Op3S8fqoJxLOdnZgTvsO/nYhenHA+UC7CWF1uXwkb9++ldPTUwVerVbVqFQqpR8YPjQ0JCMjI5LNDijoRgP3PQVu5+5Eor2XGLg7IV4GkIdHJ/LmzRs5ODiIwNbrdR0O0GCcq4Xz4eFhmZyclP7+tDQaIik/BG5XKQn4SwG3zJTLZXn9+rUclI8UHD5YVoDDN8bSzXhONwL48fFxGR4eilzFZT1uFRIB5yT8BqCdnR3Z3d0VP9Un6XRawYJpggVrZBv38ME4XKtUKnLt2jUplUoy1PR/l3U7T6sVSAQcgMAkj8PDQ9ne3pajoyMRL7zeKsYZWHgWYDGmv78/mmdwcFA+mJlSgziHDWrERrsjEXDXegTi1tZW+DLxI2bxIrqFNYTXyDyCFweMAHCwb8e4RnTNuOsqe3t7sra21pTD0Kct666E8XlcZyzw9/RUUXK5nK5oUinUQI6TQ3cynO/v78vq6qrKXCNwlTiJJpyNGc3nZHp6uqV2dwrQWOCtZBDAV1ZWwsQk7f0wiQn5kffbAu/0/KWBYzIC1+XukfGx0RGZmppKlC2tIV0Bh4aDcZW7HhkfH8urLLZL7T2pihvlkMNnz56FiadHxicL41IsFpN41bkxsYxbRdFo9jwB8KdPn14J8KnSpBQKhQs63nPmbCVRcBUAR2Lq1VVmpksyMTFxAXjcEsQybiegESionjx5osCZOeNe1O4+EhCAX7bQSgQcxRHTMgAgcz5+/Dis/hL4uHU3/B4YGNASGHIKxuEql0k+l05AeIAF1vPnz5VxFFmdDlaJrMtZITJeSsXCOTlMunKxjLtMYOKNjQ158eJFuAuKkUOb5sEwgff19SkJUBVkThZUbnXZrtCKBQ6gbnWIkjZpyne3ejAWoGnA7Icz6irvBLgbOMicCM6TkxPx/LAkbXfgWcsazuE2kFRsKD5Z+CiqDumKncpZvieWcS6dDVD8xiYCNflpJdwcdwJOf9airLmVQ7DPzMxIYWLsXGXoVqLt5k0M3K3JUVPDZdbWNzsCp48TPFdvdnZWUz32nDha7bJ63kgAJPzSdRks9/Kf9xMJAQ1gq2NpaUmy2Yz4zar4nQC3xb99AQwCcGzLAAwuhG8YiWvcOKts+r4GOe5nMhm5efOm9lUA3E3vSZJRrKvE0fnPv//Jy5cvo5cTHIPQbSjhOoqq69evS19f6lxDKK4+sVhigZPtKJqbrQeqxd5+WR4+fKgqgT0k2XX3nhiPgETWXFhYkFzuPZ2yVq1GTSOXpE47/VjgNnD4m4GG7/LhsTx69EiwD4Vr2MwIIxgbAH18fKx1yfz8vEogNvGtWnCuhLZa9UTAreVWFsHy/b/+Vrbdl7E5REMQD2jDoUbByty+/ZnU64GkU2HzyJLhktU1cLv8nARgkYS2d3ajAgwG8qU2oLmDZ92CMaOjo7K4uCiZgbDWaRWgnZhPxLhrMUCvr69riwKZk1LHF7XqrWAO9hJxH6ozNzcnCx/PqztZg9mf6SQMscCtm2C5ke4BGMlHWTUp36036AJajDVrFMzBrhhWslQsSrFYiOqVpMriNYIgqFRq2j3FAb/zffT6zuxFXxsNzs3NTXn16lW4gYiW96w1FyedF+83xG/2FNGCRpU4NjamMsn+OZ9xE5RXqdaDdPpib6RWCzuwKF9RxqI2AVNQBwQYJoK0wdBejnqtEikP3pfP51XjUTESl12FqJEKxsEorARYDD44ONTeID7YpsEnrRvQfWAI2e8WfDaTUSIwJ0iBCmFOtOUAHvVMPp/TPwvYFVYFIuP8l+DBgwdaa2Miqwa0GgYwfeMltovbDfh6c1vIgMYcliSsKv4IWFr6VDHxvldvBAH+1sA+cnl5WYOPmmr9ir+1l9I0Cgz0yjhXjfJJ0JROnmezWbl165ayr/5fqwcBNr7IfhjMqKcvESSM4eRcCasQ3bDNObmKPLdGUGpZsN24cUNLBm9zazu4d++e6qpNBFaTuUS26U5dpuR1CxyA7J9ddrMRqlz4pwLLYawymPd++/2PADt2ugcGwq9gCCdhQ96C6xWwa6j1ceuq+I0EhW0i8MAIVJfeL3d/DVD8EKi12P6/2S2jV/EccVB54O/ejz/9HGCpoBBMta5rXMXLu53D1XAwjhXwvvv+h4BAXVe4bOu3O3ChxF08LiZFG3fel199G9CH3fLyqv24NcB44MRhpdK788U3CpyKwsCw590xmfSpzsBt0Fqc3ud3vtZigxWcVZCklVpSiN0w3q5E/h9TGMIUuA3+EQAAAABJRU5ErkJggg==",S="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC"},function(e,t,n){"use strict";n.d(t,"a",function(){return l});var o=n(8),i=n.n(o),a=n(1),r=n(2),s=n(0),c=n(6),l=function(){function e(){i()(this,e),this.bDisabeCloseOnEsc=!1,this.sDefaultKeyScope=s.KeyState.None,this.sCurrentKeyScope=s.KeyState.None,this.viewModelVisibility=a.a.observable(!1),this.modalVisibility=a.a.observable(!1).extend({rateLimit:0}),this.viewModelName="",this.viewModelNames=[],this.viewModelDom=null}return e.prototype.storeAndSetKeyScope=function(){this.sCurrentKeyScope=Object(c.keyScope)(),Object(c.keyScope)(this.sDefaultKeyScope)},e.prototype.restoreKeyScope=function(){Object(c.keyScope)(this.sCurrentKeyScope)},e.prototype.registerPopupKeyDown=function(){var e=this;c.$win.on("keydown",function(t){if(t&&e.modalVisibility&&e.modalVisibility()){if(!e.bDisabeCloseOnEsc&&s.EventKeyCode.Esc===t.keyCode)return Object(r.delegateRun)(e,"cancelCommand"),!1;if(s.EventKeyCode.Backspace===t.keyCode&&!Object(r.inFocus)())return!1}return!0})},e.prototype.cancelCommand=function(){},e.prototype.closeCommand=function(){},e}()},function(e,t,n){"use strict";var o=n(8),i=n.n(o),a=n(3),r=n.n(a),s=n(1),c=n(7),l=n.n(c),u=n(5),d=function(){function e(){var t=this;i()(this,e),this.google={},this.twitter={},this.facebook={},this.dropbox={},this.google.enabled=s.a.observable(!1),this.google.clientID=s.a.observable(""),this.google.clientSecret=s.a.observable(""),this.google.apiKey=s.a.observable(""),this.google.loading=s.a.observable(!1),this.google.userName=s.a.observable(""),this.google.loggined=s.a.computed(function(){return""!==t.google.userName()}),this.google.capa={},this.google.capa.auth=s.a.observable(!1),this.google.capa.authFast=s.a.observable(!1),this.google.capa.drive=s.a.observable(!1),this.google.capa.preview=s.a.observable(!1),this.google.require={},this.google.require.clientSettings=s.a.computed(function(){return t.google.enabled()&&(t.google.capa.auth()||t.google.capa.drive())}),this.google.require.apiKeySettings=s.a.computed(function(){return t.google.enabled()&&t.google.capa.drive()}),this.facebook.enabled=s.a.observable(!1),this.facebook.appID=s.a.observable(""),this.facebook.appSecret=s.a.observable(""),this.facebook.loading=s.a.observable(!1),this.facebook.userName=s.a.observable(""),this.facebook.supported=s.a.observable(!1),this.facebook.loggined=s.a.computed(function(){return""!==t.facebook.userName()}),this.twitter.enabled=s.a.observable(!1),this.twitter.consumerKey=s.a.observable(""),this.twitter.consumerSecret=s.a.observable(""),this.twitter.loading=s.a.observable(!1),this.twitter.userName=s.a.observable(""),this.twitter.loggined=s.a.computed(function(){return""!==t.twitter.userName()}),this.dropbox.enabled=s.a.observable(!1),this.dropbox.apiKey=s.a.observable("")}return e.prototype.populate=function(){this.google.enabled(!!u.settingsGet("AllowGoogleSocial")),this.google.clientID(u.settingsGet("GoogleClientID")),this.google.clientSecret(u.settingsGet("GoogleClientSecret")),this.google.apiKey(u.settingsGet("GoogleApiKey")),this.google.capa.auth(!!u.settingsGet("AllowGoogleSocialAuth")),this.google.capa.authFast(!!u.settingsGet("AllowGoogleSocialAuthFast")),this.google.capa.drive(!!u.settingsGet("AllowGoogleSocialDrive")),this.google.capa.preview(!!u.settingsGet("AllowGoogleSocialPreview")),this.facebook.enabled(!!u.settingsGet("AllowFacebookSocial")),this.facebook.appID(u.settingsGet("FacebookAppID")),this.facebook.appSecret(u.settingsGet("FacebookAppSecret")),this.facebook.supported(!!u.settingsGet("SupportedFacebookSocial")),this.twitter.enabled=s.a.observable(!!u.settingsGet("AllowTwitterSocial")),this.twitter.consumerKey=s.a.observable(u.settingsGet("TwitterConsumerKey")),this.twitter.consumerSecret=s.a.observable(u.settingsGet("TwitterConsumerSecret")),this.dropbox.enabled(!!u.settingsGet("AllowDropboxSocial")),this.dropbox.apiKey(u.settingsGet("DropboxApiKey"))},e.prototype.appendDropbox=function(){if(!r.a.Dropbox&&this.dropbox.enabled()&&this.dropbox.apiKey()&&!r.a.document.getElementById("dropboxjs")){var e=r.a.document.createElement("script");e.type="text/javascript",e.src="https://www.dropbox.com/static/api/2/dropins.js",l()(e).attr("id","dropboxjs").attr("data-app-key",this.dropbox.apiKey()),r.a.document.body.appendChild(e)}},e}();t.a=new d},function(e,t,n){"use strict";var o=n(8),i=n.n(o),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(1),u=n(0),d=n(6),p=n(2),h=n(5),f=function(e){function t(){i()(this,t);var n=r()(this,e.call(this));n.currentAudio=l.a.observable(""),n.focusedState=l.a.observable(u.Focused.None);var o=h.appSettingsGet("mobile");return n.focusedState.subscribe(function(e){switch(e){case u.Focused.MessageList:Object(d.keyScope)(u.KeyState.MessageList),o&&Object(d.leftPanelDisabled)(!0);break;case u.Focused.MessageView:Object(d.keyScope)(u.KeyState.MessageView),o&&Object(d.leftPanelDisabled)(!0);break;case u.Focused.FolderList:Object(d.keyScope)(u.KeyState.FolderList),o&&Object(d.leftPanelDisabled)(!1)}}),n.projectHash=l.a.observable(""),n.threadsAllowed=l.a.observable(!1),n.composeInEdit=l.a.observable(!1),n.contactsAutosave=l.a.observable(!1),n.useLocalProxyForExternalImages=l.a.observable(!1),n.contactsIsAllowed=l.a.observable(!1),n.attachmentsActions=l.a.observableArray([]),n.devEmail="",n.devPassword="",n}return c()(t,e),t.prototype.populate=function(){e.prototype.populate.call(this),this.projectHash(h.settingsGet("ProjectHash")),this.contactsAutosave(!!h.settingsGet("ContactsAutosave")),this.useLocalProxyForExternalImages(!!h.settingsGet("UseLocalProxyForExternalImages")),this.contactsIsAllowed(!!h.settingsGet("ContactsIsAllowed"));var t=h.appSettingsGet("attachmentsActions");this.attachmentsActions(Object(p.isNonEmptyArray)(t)?t:[]),this.devEmail=h.settingsGet("DevEmail"),this.devPassword=h.settingsGet("DevPassword")},t}(n(116).a);t.a=new f},function(e,t,n){"use strict";n.d(t,"a",function(){return u}),n.d(t,"b",function(){return d});var o=n(8),i=n.n(o),a=n(7),r=n.n(a),s=n(1),c=n(2),l=n(10),u=function(){function e(){i()(this,e),this.disposable=[]}return e.prototype.dispose=function(){this.disposable.forEach(function(e){e&&e.dispose&&e.dispose()})},e}(),d=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return{template:t?{element:t}:"",viewModel:{createViewModel:function(t,n){return(t=t||{}).element=null,n&&n.element&&(t.component=n,t.element=r()(n.element),Object(l.i18nToNodes)(t.element),!Object(c.isUnd)(t.inline)&&s.a.unwrap(t.inline)&&t.element.css("display","inline-block")),new e(t)}}}}},function(e,t,n){"use strict";var o=n(8),i=n.n(o),a=n(3),r=n.n(a),s=n(1),c=n(23),l=n(0),u=n(6),d=n(2),p=n(22),h=n(5),f=function(){function e(){i()(this,e),this.iAutoLogoutTimer=0,this.layout=s.a.observable(l.Layout.SidePreview).extend({limitedList:[l.Layout.SidePreview,l.Layout.BottomPreview,l.Layout.NoPreview]}),this.editorDefaultType=s.a.observable(l.EditorDefaultType.Html).extend({limitedList:[l.EditorDefaultType.Html,l.EditorDefaultType.Plain,l.EditorDefaultType.HtmlForced,l.EditorDefaultType.PlainForced]}),this.messagesPerPage=s.a.observable(c.i).extend({limitedList:c.j}),this.showImages=s.a.observable(!1),this.useCheckboxesInList=s.a.observable(!0),this.allowDraftAutosave=s.a.observable(!0),this.useThreads=s.a.observable(!1),this.replySameFolder=s.a.observable(!1),this.autoLogout=s.a.observable(l.Magics.Time30mInMin),this.computers(),this.subscribers()}return e.prototype.computers=function(){var e=this;this.usePreviewPane=s.a.computed(function(){return l.Layout.NoPreview!==e.layout()})},e.prototype.subscribers=function(){this.layout.subscribe(function(e){u.$html.toggleClass("rl-no-preview-pane",l.Layout.NoPreview===e),u.$html.toggleClass("rl-side-preview-pane",l.Layout.SidePreview===e),u.$html.toggleClass("rl-bottom-preview-pane",l.Layout.BottomPreview===e),p.a("layout",[e])})},e.prototype.populate=function(){var e=this;this.layout(Object(d.pInt)(h.settingsGet("Layout"))),this.editorDefaultType(h.settingsGet("EditorDefaultType")),this.autoLogout(Object(d.pInt)(h.settingsGet("AutoLogout"))),this.messagesPerPage(h.settingsGet("MPP")),this.showImages(!!h.settingsGet("ShowImages")),this.useCheckboxesInList(!!h.settingsGet("UseCheckboxesInList")),this.allowDraftAutosave(!!h.settingsGet("AllowDraftAutosave")),this.useThreads(!!h.settingsGet("UseThreads")),this.replySameFolder(!!h.settingsGet("ReplySameFolder")),p.b("rl.auto-logout-refresh",function(){r.a.clearTimeout(e.iAutoLogoutTimer),01&&void 0!==arguments[1]?arguments[1]:[];Object(h.isArray)(b[e])&&p.a.each(b[e],function(e){e.apply(void 0,t)})}function a(e){return m.settingsGet(e)}function r(e,t,n,o){f.data.__APP__&&f.data.__APP__.remote().defaultRequest(e,"Plugin"+t,n,o)}function s(e,t,n,o){g.push([e,t,n,o])}function c(e,t,n,o){y.push([e,t,n,o])}function l(e){var t=n(9);p.a.each(e?y:g,function(e){t.addSettingsViewModel(e[0],e[1],e[2],e[3])})}function u(e,t){var n=m.settingsGet("Plugins");return(n=n&&!Object(h.isUnd)(n[e])?n[e]:null)?Object(h.isUnd)(n[t])?null:n[t]:null}n.d(t,"a",function(){return o}),n.d(t,"f",function(){return i}),n.d(t,"d",function(){return a}),n.d(t,"e",function(){return r}),n.d(t,"b",function(){return s}),n.d(t,"c",function(){return c}),n.d(t,"g",function(){return l}),n.d(t,"h",function(){return u});var d=n(4),p=n.n(d),h=n(2),f=n(6),m=n(5),b={},g=[],y=[]},function(e,t,n){"use strict";var o=n(8),i=n.n(o),a=n(1),r=n(4),s=n.n(r),c=n(7),l=n.n(c),u=n(10),d=n(2),p=n(31),h=n(9),f=function(){function e(){i()(this,e),this.capaOpenPGP=a.a.observable(!1),this.openpgp=null,this.openpgpkeys=a.a.observableArray([]),this.openpgpKeyring=null,this.openpgpkeysPublic=this.openpgpkeys.filter(function(e){return!(!e||e.isPrivate)}),this.openpgpkeysPrivate=this.openpgpkeys.filter(function(e){return!(!e||!e.isPrivate)})}return e.prototype.isSupported=function(){return!!this.openpgp},e.prototype.findKeyByHex=function(e,t){return s.a.find(e,function(e){return t&&e&&(t===e.id||-1').attr("title",Object(u.i18n)("MESSAGE/PGP_ENCRYPTED_MESSAGE_DESC")).on("click",e.domControlEncryptedClickHelper(this,t,s,a)):i&&(r=l()('
').attr("title",Object(u.i18n)("MESSAGE/PGP_SIGNED_MESSAGE_DESC")).on("click",e.domControlSignedClickHelper(this,t,s))),r&&t.before(r).before("
")}}},e}();t.a=new f},function(e,t,n){"use strict";var o=n(8),i=n.n(o),a=n(1),r=n(4),s=n.n(r),c=n(0),l=n(5),u=function(){function e(){i()(this,e),this.email=a.a.observable(""),this.parentEmail=a.a.observable(""),this.signature=a.a.observable(""),this.accounts=a.a.observableArray([]),this.accounts.loading=a.a.observable(!1).extend({throttle:c.Magics.Time100ms}),this.computers()}return e.prototype.computers=function(){var e=this;this.accountsEmails=a.a.computed(function(){return s.a.compact(s.a.map(e.accounts(),function(e){return e?e.email:null}))}),this.accountsUnreadCount=a.a.computed(function(){return 0})},e.prototype.populate=function(){this.email(l.settingsGet("Email")),this.parentEmail(l.settingsGet("ParentEmail"))},e.prototype.isRootAccount=function(){return""===this.parentEmail()},e}();t.a=new u},function(e,t,n){"use strict";var o=n(8),i=n.n(o),a=n(1),r=n(2),s=n(5),c=function(){function e(){i()(this,e),this.languages=a.a.observableArray([]),this.languagesAdmin=a.a.observableArray([]),this.language=a.a.observable("").extend({limitedList:this.languages}).extend({reversible:!0}),this.languageAdmin=a.a.observable("").extend({limitedList:this.languagesAdmin}).extend({reversible:!0}),this.userLanguage=a.a.observable(""),this.userLanguageAdmin=a.a.observable("")}return e.prototype.populate=function(){var e=s.appSettingsGet("languages"),t=s.appSettingsGet("languagesAdmin");this.languages(Object(r.isArray)(e)?e:[]),this.languagesAdmin(Object(r.isArray)(t)?t:[]),this.language(s.settingsGet("Language")),this.languageAdmin(s.settingsGet("LanguageAdmin")),this.userLanguage(s.settingsGet("UserLanguage")),this.userLanguageAdmin(s.settingsGet("UserLanguageAdmin"))},e}();t.a=new c},function(e,t,n){"use strict";function o(e,t){return!!v&&v.set("p"+e,t)}function i(e){return v?v.get("p"+e):null}var a=n(4),r=n.n(a),s=n(8),c=n.n(s),l=n(3),u=n.n(l),d=n(120),p=n.n(d),h=n(2),f=n(23),m=function(){function e(){c()(this,e)}return e.prototype.set=function(e,t){var n=!1,o=null;try{o=p.a.getJSON(f.b)}catch(e){}(o||(o={}))[e]=t;try{p.a.set(f.b,o,{expires:30}),n=!0}catch(e){}return n},e.prototype.get=function(e){var t=null;try{var n=p.a.getJSON(f.b);t=n&&!Object(h.isUnd)(n[e])?n[e]:null}catch(e){}return t},e.supported=function(){return!(!u.a.navigator||!u.a.navigator.cookieEnabled)},e}(),b=n(69),g=function(){function e(){c()(this,e),this.s=null,this.s=u.a.localStorage||null}return e.prototype.set=function(e,t){if(!this.s)return!1;var n=null;try{var o=this.s.getItem(f.b)||null;n=null===o?null:u.a.JSON.parse(o)}catch(e){}(n||(n={}))[e]=t;try{return this.s.setItem(f.b,u.a.JSON.stringify(n)),!0}catch(e){}return!1},e.prototype.get=function(e){if(!this.s)return null;try{var t=this.s.getItem(f.b)||null,n=null===t?null:u.a.JSON.parse(t);return n&&!Object(h.isUnd)(n[e])?n[e]:null}catch(e){}return null},e.supported=function(){return Object(b.d)("localStorage")},e}();n.d(t,"b",function(){return o}),n.d(t,"a",function(){return i});var y=r.a.find([g,m],function(e){return e&&e.supported()}),v=y?new y:null},function(e,t,n){"use strict";function o(){return S(),y||b()()}function i(){return O(),v||0}function a(e){return o().clone().subtract(e,"days").format("YYYY.MM.DD")}function r(e,t){var n=null,a="",r=i();if((n=0<(e=r<(e=0=t.diff(e,"hours"):return e.fromNow();case t.format("L")===e.format("L"):return Object(g.i18n)("MESSAGE_LIST/TODAY_AT",{TIME:e.format("LT")});case t.clone().subtract(1,"days").format("L")===e.format("L"):return Object(g.i18n)("MESSAGE_LIST/YESTERDAY_AT",{TIME:e.format("LT")});case t.year()===e.year():return e.format("D MMM.")}return e?e.format("LL"):""}(n);break;case"FULL":a=n.format("LLL");break;default:a=n.format(t)}return a}function s(e){var t,n="",o=f()(e);(t=o.data("moment-time"))&&((n=o.data("moment-format"))&&o.text(r(t,n)),(n=o.data("moment-format-title"))&&o.attr("title",r(t,n)))}function c(){p.a.defer(function(){f()(".moment",u.a.document).each(function(e,t){s(t)})})}n.r(t),n.d(t,"momentNow",function(){return o}),n.d(t,"momentNowUnix",function(){return i}),n.d(t,"searchSubtractFormatDateHelper",function(){return a}),n.d(t,"format",function(){return r}),n.d(t,"momentToNode",function(){return s}),n.d(t,"reload",function(){return c});var l=n(3),u=n.n(l),d=n(4),p=n.n(d),h=n(7),f=n.n(h),m=n(54),b=n.n(m),g=n(10),y=null,v=0,S=p.a.debounce(function(){y=b()()},500,!0),O=p.a.debounce(function(){v=b()().unix()},500,!0)},function(e,t){e.exports=window.hasher},function(e,t,n){"use strict";n.d(t,"a",function(){return r});var o=n(8),i=n.n(o),a=n(2),r=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";i()(this,e),this.sModelName="",this.disposables=[],this.sModelName=t||""}return e.prototype.regDisposables=function(e){var t=this;Object(a.isArray)(e)?e.forEach(function(e){t.disposables.push(e)}):e&&this.disposables.push(e)},e.prototype.onDestroy=function(){Object(a.disposeObject)(this)},e}()},,,function(e,t,n){"use strict";var o=n(8),i=n.n(o),a=n(1),r=n(2),s=n(5),c=function(){function e(){i()(this,e),this.themes=a.a.observableArray([]),this.themeBackgroundName=a.a.observable(""),this.themeBackgroundHash=a.a.observable(""),this.theme=a.a.observable("").extend({limitedList:this.themes})}return e.prototype.populate=function(){var e=s.appSettingsGet("themes");this.themes(Object(r.isArray)(e)?e:[]),this.theme(s.settingsGet("Theme")),this.themeBackgroundName(s.settingsGet("UserBackgroundName")),this.themeBackgroundHash(s.settingsGet("UserBackgroundHash"))},e}();t.a=new c},function(e,t){var n=e.exports={version:"2.5.1"};"number"==typeof __e&&(__e=n)},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t,n){e.exports=!n(51)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t,n){var o=n(109),i=n(73);e.exports=function(e){return o(i(e))}},function(e,t,n){"use strict";n.r(t),n.d(t,"EmailModel",function(){return u}),n.d(t,"default",function(){return u});var o=n(8),i=n.n(o),a=n(4),r=n.n(a),s=n(76),c=n.n(s),l=n(2),u=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";i()(this,e),this.email="",this.name="",this.dkimStatus="",this.dkimValue="",this.email=t,this.name=n,this.dkimStatus=o,this.dkimValue=a,this.clearDuplicateName()}return e.newInstanceFromJson=function(t){var n=new e;return n.initByJson(t)?n:null},e.prototype.clear=function(){this.email="",this.name="",this.dkimStatus="none",this.dkimValue=""},e.prototype.validate=function(){return""!==this.name||""!==this.email},e.prototype.hash=function(){return"#"+(arguments.length>0&&void 0!==arguments[0]&&arguments[0]?"":this.name)+"#"+this.email+"#"},e.prototype.clearDuplicateName=function(){this.name===this.email&&(this.name="")},e.prototype.search=function(e){return-1<(this.name+" "+this.email).toLowerCase().indexOf(e.toLowerCase())},e.prototype.initByJson=function(e){var t=!1;return e&&"Object/Email"===e["@Object"]&&(this.name=Object(l.trim)(e.Name),this.email=Object(l.trim)(e.Email),this.dkimStatus=Object(l.trim)(e.DkimStatus||""),this.dkimValue=Object(l.trim)(e.DkimValue||""),t=""!==this.email,this.clearDuplicateName()),t},e.prototype.toLine=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o="";return""!==this.email&&(e&&""!==this.name?o=t?'
")+'" target="_blank" tabindex="-1">'+Object(l.encodeHtml)(this.name)+"":n?Object(l.encodeHtml)(this.name):this.name:(o=this.email,""!==this.name?t?o=Object(l.encodeHtml)('"'+this.name+'" <')+'")+'" target="_blank" tabindex="-1">'+Object(l.encodeHtml)(o)+""+Object(l.encodeHtml)(">"):(o='"'+this.name+'" <'+o+">",n&&(o=Object(l.encodeHtml)(o))):t&&(o=''+Object(l.encodeHtml)(this.email)+""))),o},e.splitEmailLine=function(t){var n=c()(t);if(Object(l.isNonEmptyArray)(n)){var o=[],i=!1;return n.forEach(function(t){var n=t.address?new e(t.address.replace(/^[<]+(.*)[>]+$/g,"$1"),t.name||""):null;n&&n.email&&(i=!0),o.push(n?n.toLine(!1):t.name)}),i?o:null}return null},e.parseEmailLine=function(t){var n=c()(t);return Object(l.isNonEmptyArray)(n)?r.a.compact(n.map(function(t){return t.address?new e(t.address.replace(/^[<]+(.*)[>]+$/g,"$1"),t.name||""):null})):[]},e.prototype.parse=function(e){if(""===(e=Object(l.trim)(e)))return!1;var t=c()(e);return!(!Object(l.isNonEmptyArray)(t)||!t[0]||(this.name=t[0].name||"",this.email=t[0].address||"",this.clearDuplicateName(),0))},e}()},function(e,t,n){"use strict";var o=n(8),i=n.n(o),a=n(3),r=n.n(a),s=n(6),c=n(16),l=n(22),u=n(2),d=function(){function e(){var t=this;if(i()(this,e),this.notificator=null,this.player=null,this.supported=!1,this.supportedMp3=!1,this.supportedOgg=!1,this.supportedWav=!1,this.supportedNotification=!1,this.player=this.createNewObject(),this.supported=!(s.bMobileDevice||s.bSafari||!this.player||!this.player.play),this.supported&&this.player&&this.player.canPlayType&&(this.supportedMp3=""!==this.player.canPlayType("audio/mpeg;").replace(/no/,""),this.supportedWav=""!==this.player.canPlayType('audio/wav; codecs="1"').replace(/no/,""),this.supportedOgg=""!==this.player.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/,""),this.supportedNotification=this.supported&&this.supportedMp3),this.player&&(this.supportedMp3||this.supportedOgg||this.supportedWav)||(this.supported=!1,this.supportedMp3=!1,this.supportedOgg=!1,this.supportedWav=!1,this.supportedNotification=!1),this.supported&&this.player){var n=function(){return t.stop()};this.player.addEventListener("ended",n),this.player.addEventListener("error",n),l.b("audio.api.stop",n)}}return e.prototype.createNewObject=function(){var e=r.a.Audio?new r.a.Audio:null;return e&&e.canPlayType&&e.pause&&e.play&&(e.preload="none",e.loop=!1,e.autoplay=!1,e.muted=!1),e},e.prototype.paused=function(){return!this.supported||!!this.player.paused},e.prototype.stop=function(){this.supported&&this.player.pause&&this.player.pause(),l.a("audio.stop")},e.prototype.pause=function(){this.stop()},e.prototype.clearName=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return e=Object(u.trim)(e),t&&"."+t===e.toLowerCase().substr(-1*(t.length+1))&&(e=Object(u.trim)(e.substr(0,e.length-4))),""===e?"audio":e},e.prototype.playMp3=function(e,t){this.supported&&this.supportedMp3&&(this.player.src=e,this.player.play(),l.a("audio.start",[this.clearName(t,"mp3"),"mp3"]))},e.prototype.playOgg=function(e,t){this.supported&&this.supportedOgg&&(this.player.src=e,this.player.play(),t=this.clearName(t,"oga"),t=this.clearName(t,"ogg"),l.a("audio.start",[t,"ogg"]))},e.prototype.playWav=function(e,t){this.supported&&this.supportedWav&&(this.player.src=e,this.player.play(),l.a("audio.start",[this.clearName(t,"wav"),"wav"]))},e.prototype.playNotification=function(){this.supported&&this.supportedMp3&&(this.notificator||(this.notificator=this.createNewObject(),this.notificator.src=c.D("new-mail.mp3")),this.notificator&&this.notificator.play&&this.notificator.play())},e}();t.a=new d},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t,n){"use strict";n.d(t,"a",function(){return p});var o=n(8),i=n.n(o),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(1),u=n(2),d=n(0),p=function(e){function t(n){i()(this,t);var o=r()(this,e.call(this));return o.value=n.value||"",o.size=n.size||0,o.label=n.label||"",o.preLabel=n.preLabel||"",o.enable=!!Object(u.isUnd)(n.enable)||n.enable,o.trigger=n.trigger&&n.trigger.subscribe?n.trigger:null,o.placeholder=n.placeholder||"",o.labeled=!Object(u.isUnd)(n.label),o.preLabeled=!Object(u.isUnd)(n.preLabel),o.triggered=!Object(u.isUnd)(n.trigger)&&!!o.trigger,o.classForTrigger=l.a.observable(""),o.className=l.a.computed(function(){var e=l.a.unwrap(o.size),t=o.trigger?" "+Object(u.trim)("settings-saved-trigger-input "+o.classForTrigger()):"";return(0o?10:o,S.a.displaySpecSetting(0>=n||oObject(f.microtime)()-l);var d="";switch(!0){case"success"===n&&t&&t.Result&&e===t.Action:d=m.StorageResultType.Success;break;case!("abort"!==n||t&&t.__aborted__):d=m.StorageResultType.Abort;break;default:d=m.StorageResultType.Error}L.f("ajax-default-response",[e,m.StorageResultType.Success===d?t:null,d,i,o]),"success"===n?t&&t.Result&&e===t.Action?(t.__cached__=i,s(t)):t&&t.Action?(u=t,c(t.ErrorCode?t.ErrorCode:m.Notification.AjaxFalse)):(u=t,c(m.Notification.AjaxParse)):"timeout"===n?(u=t,c(m.Notification.AjaxTimeout)):"abort"===n?t&&t.__aborted__||c(m.Notification.AjaxAbort):(u=t,c(m.Notification.AjaxParse)),r.oRequests[e]&&(r.oRequests[e]=null,delete r.oRequests[e]),r.setTrigger(a,!1),u&&(-11&&void 0!==arguments[1]&&arguments[1];if(!a.a.Promise||!a.a.Promise.all)throw new Error("Promises are not available your environment.");if(!e)throw new Error("src should not be empty.");return new a.a.Promise(function(n,o){var i=a.a.document.createElement("script");i.onload=function(){n(e)},i.onerror=function(){o(new Error(e))},i.async=!0===t,i.src=e,a.a.document.body.appendChild(i)})}n.d(t,"a",function(){return o});var i=n(3),a=n.n(i)},function(e,t,n){var o=n(85)("wks"),i=n(70),a=n(41).Symbol,r="function"==typeof a;(e.exports=function(e){return o[e]||(o[e]=r&&a[e]||(r?a:i)("Symbol."+e))}).store=o},function(e,t,n){var o=n(52);e.exports=function(e){if(!o(e))throw TypeError(e+" is not an object!");return e}},function(e,t,n){"use strict";var o=n(8),i=n.n(o),a=n(3),r=n.n(a),s=n(1),c=n(0),l=n(22),u=n(45),d=n(5),p=function(){function e(){var t=this;i()(this,e),this.enableSoundNotification=s.a.observable(!1),this.soundNotificationIsSupported=s.a.observable(!1),this.allowDesktopNotification=s.a.observable(!1),this.desktopNotificationPermissions=s.a.computed(function(){t.allowDesktopNotification();var e=c.DesktopNotification.NotSupported,n=t.notificationClass();if(n&&n.permission)switch(n.permission.toLowerCase()){case"granted":e=c.DesktopNotification.Allowed;break;case"denied":e=c.DesktopNotification.Denied;break;case"default":e=c.DesktopNotification.NotAllowed}else r.a.webkitNotifications&&r.a.webkitNotifications.checkPermission&&(e=r.a.webkitNotifications.checkPermission());return e}).extend({notify:"always"}),this.enableDesktopNotification=s.a.computed({read:function(){return t.allowDesktopNotification()&&c.DesktopNotification.Allowed===t.desktopNotificationPermissions()},write:function(e){if(e){var n=t.notificationClass(),o=t.desktopNotificationPermissions();n&&c.DesktopNotification.Allowed===o?t.allowDesktopNotification(!0):n&&c.DesktopNotification.NotAllowed===o?n.requestPermission(function(){t.allowDesktopNotification.valueHasMutated(),c.DesktopNotification.Allowed===t.desktopNotificationPermissions()?t.allowDesktopNotification()?t.allowDesktopNotification.valueHasMutated():t.allowDesktopNotification(!0):t.allowDesktopNotification()?t.allowDesktopNotification(!1):t.allowDesktopNotification.valueHasMutated()}):t.allowDesktopNotification(!1)}else t.allowDesktopNotification(!1)}}).extend({notify:"always"}),this.enableDesktopNotification.valueHasMutated||(this.enableDesktopNotification.valueHasMutated=function(){t.allowDesktopNotification.valueHasMutated()}),this.computers(),this.initNotificationPlayer()}return e.prototype.computers=function(){var e=this;this.isDesktopNotificationSupported=s.a.computed(function(){return c.DesktopNotification.NotSupported!==e.desktopNotificationPermissions()}),this.isDesktopNotificationDenied=s.a.computed(function(){return c.DesktopNotification.NotSupported===e.desktopNotificationPermissions()||c.DesktopNotification.Denied===e.desktopNotificationPermissions()})},e.prototype.initNotificationPlayer=function(){u.a&&u.a.supportedNotification?this.soundNotificationIsSupported(!0):(this.enableSoundNotification(!1),this.soundNotificationIsSupported(!1))},e.prototype.playSoundNotification=function(e){u.a&&u.a.supportedNotification&&(e||this.enableSoundNotification())&&u.a.playNotification()},e.prototype.displayDesktopNotification=function(e,t,n,o){if(this.enableDesktopNotification()){var i=this.notificationClass(),a=i?new i(t,{body:n,icon:e}):null;a&&(a.show&&a.show(),o&&(a.onclick=function(){r.a.focus(),o.Folder&&o.Uid&&l.a("mailbox.message.show",[o.Folder,o.Uid])}),r.a.setTimeout((s=a,function(){s.cancel?s.cancel():s.close&&s.close()}),c.Magics.Time7s))}var s},e.prototype.populate=function(){this.enableSoundNotification(!!d.settingsGet("SoundNotification")),this.enableDesktopNotification(!!d.settingsGet("DesktopNotifications"))},e.prototype.notificationClass=function(){return r.a.Notification&&r.a.Notification.requestPermission?r.a.Notification:null},e}();t.a=new p},function(e,t,n){"use strict";function o(e,t,n,o,i){var a={};return Object.keys(o).forEach(function(e){a[e]=o[e]}),a.enumerable=!!a.enumerable,a.configurable=!!a.configurable,("value"in a||a.initializer)&&(a.writable=!0),a=n.slice().reverse().reduce(function(n,o){return o(e,t,n)||n},a),i&&void 0!==a.initializer&&(a.value=a.initializer?a.initializer.call(i):void 0,a.initializer=void 0),void 0===a.initializer&&(Object.defineProperty(e,t,a),a=null),a}n.r(t);var i,a,r,s,c,l,u,d,p,h,f=n(18),m=n.n(f),b=n(8),g=n.n(b),y=n(12),v=n.n(y),S=n(11),O=n.n(S),w=n(3),T=n.n(w),C=n(4),A=n.n(C),E=n(7),F=n.n(E),j=n(1),N=n(19),R=n.n(N),I=n(78),L=n.n(I),_=n(0),P=n(2),D=n(23),M=n(6),k=n(16),x=n(10),U=n(34),H=n(15),B=n(95),G=n(26),K=n(28),V=n(56),z=n(31),q=n(13),W=n(30),Y=n(14),$=n(25),J=n(17),X=n(5),Z=n(22),Q=n(79),ee=function(e){function t(n,o){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,a=arguments.length>3&&void 0!==arguments[3]&&arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4],s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"",c=arguments.length>6&&void 0!==arguments[6]?arguments[6]:"";g()(this,t);var l=v()(this,e.call(this,"ComposeAttachmentModel"));return l.id=n,l.isInline=!!a,l.isLinked=!!r,l.CID=s,l.contentLocation=c,l.fromMessage=!1,l.fileName=j.a.observable(o),l.size=j.a.observable(i),l.tempName=j.a.observable(""),l.progress=j.a.observable(0),l.error=j.a.observable(""),l.waiting=j.a.observable(!0),l.uploading=j.a.observable(!1),l.enabled=j.a.observable(!0),l.complete=j.a.observable(!1),l.progressText=j.a.computed(function(){var e=l.progress();return 0===e?"":(98a[e.email][1])&&(o=a[e.email][0],n=a[e.email][1])};if(A.a.each(i,function(e,t){a[e.email()]=[e,t]}),t)switch(e){case _.ComposeType.Empty:break;case _.ComposeType.Reply:case _.ComposeType.ReplyAll:case _.ComposeType.Forward:case _.ComposeType.ForwardAsAttachment:A.a.each(A.a.union(t.to,t.cc,t.bcc),r),o||A.a.each(t.deliveredTo,r);break;case _.ComposeType.Draft:A.a.each(A.a.union(t.from,t.replyTo),r)}return o||i[0]||null},t.prototype.selectIdentity=function(e){e&&e.item&&(this.currentIdentity(e.item),this.setSignatureFromIdentity(e.item))},t.prototype.sendMessageResponse=function(e,t){var n=!1,o="";this.sending(!1),_.StorageResultType.Success===e&&t&&t.Result&&(n=!0,this.modalVisibility()&&Object(P.delegateRun)(this,"closeCommand")),this.modalVisibility()&&!n&&(t&&_.Notification.CantSaveMessage===t.ErrorCode?(this.sendSuccessButSaveError(!0),this.savedErrorDesc(Object(P.trim)(Object(x.i18n)("COMPOSE/SAVED_ERROR_ON_SEND")))):(o=Object(x.getNotification)(t&&t.ErrorCode?t.ErrorCode:_.Notification.CantSendMessage,t&&t.ErrorMessage?t.ErrorMessage:""),this.sendError(!0),this.sendErrorDesc(o||Object(x.getNotification)(_.Notification.CantSendMessage)))),this.reloadDraftFolder()},t.prototype.saveMessageResponse=function(e,t){var n=!1;if(this.saving(!1),_.StorageResultType.Success===e&&t&&t.Result&&t.Result.NewFolder&&t.Result.NewUid){if(n=!0,this.bFromDraft){var o=Y.a.message();o&&this.draftFolder()===o.folderFullNameRaw&&this.draftUid()===o.uid&&Y.a.message(null)}this.draftFolder(t.Result.NewFolder),this.draftUid(t.Result.NewUid),this.savedTime(T.a.Math.round((new T.a.Date).getTime()/1e3)),this.bFromDraft&&Object(H.q)(this.draftFolder(),"")}n||(this.savedError(!0),this.savedErrorDesc(Object(x.getNotification)(_.Notification.CantSaveMessage))),this.reloadDraftFolder()},t.prototype.onHide=function(){this.autosaveStop(),this.bSkipNextHide||(G.a.composeInEdit(!1),this.reset()),this.bSkipNextHide=!1,this.to.focused(!1),Object(ne.routeOn)()},t.prototype.editor=function(e){var t=this;e&&(!this.oEditor&&this.composeEditorArea()?this.oEditor=new B.HtmlEditor(this.composeEditorArea(),null,function(){e(t.oEditor),t.resizerTrigger()},function(e){t.isHtml(!!e)}):this.oEditor&&(e(this.oEditor),this.resizerTrigger()))},t.prototype.converSignature=function(e){var t=10,n="",o=[],i=/{{MOMENT:([^}]+)}}/g;if(e=e.replace(/[\r]/g,""),""!==(n=this.oLastMessage?this.emailArrayToStringLineHelper(this.oLastMessage.from,!0):"")&&(e=e.replace(/{{FROM-FULL}}/g,n),-1===n.indexOf(" ")&&0
"+f+":

"+Object(P.trim)(h)+"
";break;case _.ComposeType.Forward:c=g.fromToLine(!1,!0),l=g.toToLine(!1,!0),u=g.ccToLine(!1,!0),h="

"+Object(x.i18n)("COMPOSE/FORWARD_MESSAGE_TOP_TITLE")+"
"+Object(x.i18n)("COMPOSE/FORWARD_MESSAGE_TOP_FROM")+": "+c+"
"+Object(x.i18n)("COMPOSE/FORWARD_MESSAGE_TOP_TO")+": "+l+(0"+Object(x.i18n)("COMPOSE/FORWARD_MESSAGE_TOP_CC")+": "+u:"")+"
"+Object(x.i18n)("COMPOSE/FORWARD_MESSAGE_TOP_SENT")+": "+Object(P.encodeHtml)(d)+"
"+Object(x.i18n)("COMPOSE/FORWARD_MESSAGE_TOP_SUBJECT")+": "+Object(P.encodeHtml)(p)+"

"+Object(P.trim)(h)+"

";break;case _.ComposeType.ForwardAsAttachment:h=""}this.editor(function(e){e.setHtml(h,!1),(_.EditorDefaultType.PlainForced===s.editorDefaultType()||!g.isHtml()&&_.EditorDefaultType.HtmlForced!==s.editorDefaultType())&&e.modeToggle(!1),m&&_.ComposeType.Draft!==S&&_.ComposeType.EditAsNew!==S&&s.setSignatureFromIdentity(m),s.setFocusInPopup()})}else _.ComposeType.Empty===S?(this.subject(Object(P.isNormal)(a)?""+a:""),h=Object(P.isNormal)(r)?""+r:"",this.editor(function(e){e.setHtml(h,!1),_.EditorDefaultType.Html!==s.editorDefaultType()&&_.EditorDefaultType.HtmlForced!==s.editorDefaultType()&&e.modeToggle(!1),m&&s.setSignatureFromIdentity(m),s.setFocusInPopup()})):Object(P.isNonEmptyArray)(t)?(A.a.each(t,function(e){s.addMessageAsAttachment(e)}),this.editor(function(e){e.setHtml("",!1),_.EditorDefaultType.Html!==s.editorDefaultType()&&_.EditorDefaultType.HtmlForced!==s.editorDefaultType()&&e.modeToggle(!1),m&&_.ComposeType.Draft!==S&&_.ComposeType.EditAsNew!==S&&s.setSignatureFromIdentity(m),s.setFocusInPopup()})):this.setFocusInPopup();var T=this.getAttachmentsDownloadsForUpload();Object(P.isNonEmptyArray)(T)&&J.a.messageUploadAttachments(this.onMessageUploadAttachments,T),m&&this.currentIdentity(m),this.resizerTrigger()},t.prototype.onMessageUploadAttachments=function(e,t){var n=this;_.StorageResultType.Success===e&&t&&t.Result?this.viewModelVisibility()||A.a.each(t.Result,function(e,t){var o=n.getAttachmentById(e);o&&(o.tempName(t),o.waiting(!1).uploading(!1).complete(!0))}):this.setMessageAttachmentFailedDownloadText()},t.prototype.setFocusInPopup=function(){var e=this;M.bMobileDevice||A.a.delay(function(){""===e.to()?e.to.focused(!0):e.oEditor&&(e.to.focused()||e.oEditor.focus())},_.Magics.Time100ms)},t.prototype.onShowWithDelay=function(){this.resizerTrigger()},t.prototype.tryToClosePopup=function(){var e=this,t=n(99);!Object(ne.isPopupVisible)(t)&&this.modalVisibility()&&(this.bSkipNextHide||this.isEmptyForm()&&!this.draftUid()?Object(P.delegateRun)(this,"closeCommand"):Object(ne.showScreenPopup)(t,[Object(x.i18n)("POPUPS_ASK/DESC_WANT_CLOSE_THIS_WINDOW"),function(){e.modalVisibility()&&Object(P.delegateRun)(e,"closeCommand")}]))},t.prototype.onBuild=function(){var e=this;this.initUploader(),R()("ctrl+q, command+q, ctrl+w, command+w",_.KeyState.Compose,P.noopFalse),R()("`",_.KeyState.Compose,function(){return!(e.oEditor&&!e.oEditor.hasFocus()&&!Object(P.inFocus)()&&(e.identitiesDropdownTrigger(!0),1))}),R()("ctrl+`",_.KeyState.Compose,function(){return e.identitiesDropdownTrigger(!0),!1}),R()("esc, ctrl+down, command+down",_.KeyState.Compose,function(){return e.skipCommand(),!1}),this.allowFolders&&R()("ctrl+s, command+s",_.KeyState.Compose,function(){return e.saveCommand(),!1}),X.appSettingsGet("allowCtrlEnterOnCompose")&&R()("ctrl+enter, command+enter",_.KeyState.Compose,function(){return e.sendCommand(),!1}),R()("shift+esc",_.KeyState.Compose,function(){return e.modalVisibility()&&e.tryToClosePopup(),!1}),Z.b("window.resize.real",this.resizerTrigger),Z.b("window.resize.real",A.a.debounce(this.resizerTrigger,_.Magics.Time50ms)),$.a.appendDropbox(),this.driveEnabled()&&F.a.getScript("https://apis.google.com/js/api.js",function(){T.a.gapi&&e.driveVisible(!0)}),T.a.setInterval(function(){e.modalVisibility()&&e.oEditor&&e.oEditor.resize()},_.Magics.Time5s)},t.prototype.driveCallback=function(e,t){var n=this;if(t&&T.a.XMLHttpRequest&&T.a.google&&t[T.a.google.picker.Response.ACTION]===T.a.google.picker.Action.PICKED&&t[T.a.google.picker.Response.DOCUMENTS]&&t[T.a.google.picker.Response.DOCUMENTS][0]&&t[T.a.google.picker.Response.DOCUMENTS][0].id){var o=new T.a.XMLHttpRequest;o.open("GET","https://www.googleapis.com/drive/v2/files/"+t[T.a.google.picker.Response.DOCUMENTS][0].id),o.setRequestHeader("Authorization","Bearer "+e),o.addEventListener("load",function(){if(o&&o.responseText){var t=T.a.JSON.parse(o.responseText),i=function(e,n,o){e&&e.exportLinks&&(e.exportLinks[n]?(t.downloadUrl=e.exportLinks[n],t.title=e.title+"."+o,t.mimeType=n):e.exportLinks["application/pdf"]&&(t.downloadUrl=e.exportLinks["application/pdf"],t.title=e.title+".pdf",t.mimeType="application/pdf"))};if(t&&!t.downloadUrl&&t.mimeType&&t.exportLinks)switch(t.mimeType.toString().toLowerCase()){case"application/vnd.google-apps.document":i(t,"application/vnd.openxmlformats-officedocument.wordprocessingml.document","docx");break;case"application/vnd.google-apps.spreadsheet":i(t,"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","xlsx");break;case"application/vnd.google-apps.drawing":i(t,"image/png","png");break;case"application/vnd.google-apps.presentation":i(t,"application/vnd.openxmlformats-officedocument.presentationml.presentation","pptx");break;default:i(t,"application/pdf","pdf")}t&&t.downloadUrl&&n.addDriveAttachment(t,e)}}),o.send()}},t.prototype.driveCreatePiker=function(e){var t=this;T.a.gapi&&e&&e.access_token&&T.a.gapi.load("picker",{callback:function(){T.a.google&&T.a.google.picker&&(new T.a.google.picker.PickerBuilder).addView(T.a.google.picker.ViewId.DOCS).setAppId(X.settingsGet("GoogleClientID")).setOAuthToken(e.access_token).setCallback(A.a.bind(t.driveCallback,t,e.access_token)).enableFeature(T.a.google.picker.Feature.NAV_HIDDEN).build().setVisible(!0)}})},t.prototype.driveOpenPopup=function(){var e=this;T.a.gapi&&T.a.gapi.load("auth",{callback:function(){var t=T.a.gapi.auth.getToken(),n=function(t){if(t&&!t.error){var n=T.a.gapi.auth.getToken();return n&&e.driveCreatePiker(n),!0}return!1};t?e.driveCreatePiker(t):T.a.gapi.auth.authorize({client_id:X.settingsGet("GoogleClientID"),scope:"https://www.googleapis.com/auth/drive.readonly",immediate:!0},function(e){n(e)||T.a.gapi.auth.authorize({client_id:X.settingsGet("GoogleClientID"),scope:"https://www.googleapis.com/auth/drive.readonly",immediate:!1},n)})}})},t.prototype.getAttachmentById=function(e){return A.a.find(this.attachments(),function(t){return t&&e===t.id})},t.prototype.cancelAttachmentHelper=function(e,t){var n=this;return function(){var o=A.a.find(n.attachments(),function(t){return t&&t.id===e});o&&(n.attachments.remove(o),Object(P.delegateRunOnDestroy)(o),t&&t.cancel(e))}},t.prototype.initUploader=function(){var e=this;if(this.composeUploaderButton()){var t={},n=Object(P.pInt)(X.settingsGet("AttachmentLimit")),o=new L.a({action:Object(k.G)(),name:"uploader",queueSize:2,multipleSizeLimit:50,clickElement:this.composeUploaderButton(),dragAndDropElement:this.composeUploaderDropPlace()});o?(o.on("onDragEnter",function(){e.dragAndDropOver(!0)}).on("onDragLeave",function(){e.dragAndDropOver(!1)}).on("onBodyDragEnter",function(){e.attachmentsPlace(!0),e.dragAndDropVisible(!0)}).on("onBodyDragLeave",function(){e.dragAndDropVisible(!1)}).on("onProgress",function(n,o,i){var a=t[n];a||(a=e.getAttachmentById(n))&&(t[n]=a),a&&a.progress(T.a.Math.floor(o/i*100))}).on("onSelect",function(t,i){e.dragAndDropOver(!1);var a=Object(P.isUnd)(i.FileName)?"":i.FileName.toString(),r=Object(P.isNormal)(i.Size)?Object(P.pInt)(i.Size):null,s=new ee(t,a,r);return s.cancel=e.cancelAttachmentHelper(t,o),e.attachments.push(s),e.attachmentsPlace(!0),!(00&&void 0!==arguments[0]&&!arguments[0]?0===this.attachmentsInReady().length:0===this.attachments().length;return 0===this.to().length&&0===this.cc().length&&0===this.bcc().length&&0===this.replyTo().length&&0===this.subject().length&&e&&(!this.oEditor||""===this.oEditor.getData())},t.prototype.reset=function(){this.to(""),this.cc(""),this.bcc(""),this.replyTo(""),this.subject(""),this.requestDsn(!1),this.requestReadReceipt(!1),this.markAsImportant(!1),this.attachmentsPlace(!1),this.aDraftInfo=null,this.sInReplyTo="",this.bFromDraft=!1,this.sReferences="",this.sendError(!1),this.sendSuccessButSaveError(!1),this.savedError(!1),this.savedTime(0),this.emptyToError(!1),this.attachmentsInProcessError(!1),this.showCc(!1),this.showBcc(!1),this.showReplyTo(!1),Object(P.delegateRunOnDestroy)(this.attachments()),this.attachments([]),this.dragAndDropOver(!1),this.dragAndDropVisible(!1),this.draftFolder(""),this.draftUid(""),this.sending(!1),this.saving(!1),this.oEditor&&this.oEditor.clear(!1)},t.prototype.getAttachmentsDownloadsForUpload=function(){return A.a.map(A.a.filter(this.attachments(),function(e){return e&&""===e.tempName()}),function(e){return e.id})},t.prototype.resizerTrigger=function(){this.resizer(!this.resizer())},t}(oe.a)).prototype,"sendCommand",[a],m()(h.prototype,"sendCommand"),h.prototype),o(h.prototype,"saveCommand",[r],m()(h.prototype,"saveCommand"),h.prototype),o(h.prototype,"deleteCommand",[s],m()(h.prototype,"deleteCommand"),h.prototype),o(h.prototype,"skipCommand",[c],m()(h.prototype,"skipCommand"),h.prototype),o(h.prototype,"contactsCommand",[l],m()(h.prototype,"contactsCommand"),h.prototype),o(h.prototype,"dropboxCommand",[u],m()(h.prototype,"dropboxCommand"),h.prototype),o(h.prototype,"driveCommand",[d],m()(h.prototype,"driveCommand"),h.prototype),p=h))||p)},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){"use strict";n.d(t,"a",function(){return u});var o=n(8),i=n.n(o),a=n(4),r=n.n(a),s=n(75),c=n.n(s),l=n(2),u=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];i()(this,e),this.oCross=null,this.sScreenName=t,this.aViewModels=Object(l.isArray)(n)?n:[]}return e.prototype.viewModels=function(){return this.aViewModels},e.prototype.screenName=function(){return this.sScreenName},e.prototype.routes=function(){return null},e.prototype.__cross=function(){return this.oCross},e.prototype.__start=function(){var e=null,t=null,n=this.routes();Object(l.isNonEmptyArray)(n)&&(t=r.a.bind(this.onRoute||l.noop,this),e=c.a.create(),n.forEach(function(n){n&&e&&(e.addRoute(n[0],t).rules=n[1])}),this.oCross=e)},e}()},function(e,t){e.exports=window.ssm},function(e,t,n){var o=n(52);e.exports=function(e,t){if(!o(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!o(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!o(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!o(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},,function(e,t,n){"use strict";function o(e){if(e in l.a&&l.a[e]&&l.a[e].setItem){var t=l.a[e],n="testLocalStorage_"+l.a.Math.random();try{if(t.setItem(n,n),n===t.getItem(n))return t.removeItem(n),!0}catch(e){}}return!1}function i(){return h(u)}function a(){var e="AuthAccountHash",t=l.a.__rlah_data();f(u,t&&t[e]?t[e]:""),b()}function r(){f(u,""),b()}function s(){return m()>g()+36e5&&(r(),!0)}n.d(t,"d",function(){return o}),n.d(t,"c",function(){return i}),n.d(t,"e",function(){return a}),n.d(t,"b",function(){return r}),n.d(t,"a",function(){return s});var c=n(3),l=n.n(c),u="__rlA",d=o("sessionStorage")&&l.a.sessionStorage||null,p=l.a.top||l.a||null,h=function(e){var t=null;if(d)t=d.getItem(e)||null;else if(p&&l.a.JSON){var n=p.name&&"{"===p.name.toString().substr(0,1)?l.a.JSON.parse(p.name.toString()):null;t=n&&n[e]||null}return t},f=function(e,t){if(d)d.setItem(e,t);else if(p&&l.a.JSON){var n=p.name&&"{"===p.name.toString().substr(0,1)?l.a.JSON.parse(p.name.toString()):null;(n=n||{})[e]=t,p.name=l.a.JSON.stringify(n)}},m=function(){return l.a.Math.round((new l.a.Date).getTime()/1e3)},b=function(){return f("__rlT",m())},g=function(){var e=h("__rlT",0);return e&&l.a.parseInt(e,10)||0};l.a.setInterval(b,6e4)},function(e,t){var n=0,o=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+o).toString(36))}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,n){var o=n(71),i=n(64),a=n(43),r=n(67),s=n(46),c=n(77),l=Object.getOwnPropertyDescriptor;t.f=n(42)?l:function(e,t){if(e=a(e),t=r(t,!0),c)try{return l(e,t)}catch(e){}if(s(e,t))return i(!o.f.call(e,t),e[t])}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){"use strict";n.d(t,"a",function(){return d});var o=n(8),i=n.n(o),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(1),u=n(2),d=function(e){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};i()(this,t);var o=r()(this,e.call(this));return o.value=n.value,!Object(u.isUnd)(o.value)&&o.value.subscribe||(o.value=l.a.observable(!Object(u.isUnd)(o.value)&&!!o.value)),o.enable=n.enable,!Object(u.isUnd)(o.enable)&&o.enable.subscribe||(o.enable=l.a.observable(!!Object(u.isUnd)(o.enable)||!!o.enable)),o.disable=n.disable,!Object(u.isUnd)(o.disable)&&o.disable.subscribe||(o.disable=l.a.observable(!Object(u.isUnd)(o.disable)&&!!o.disable)),o.label=n.label||"",o.inline=!Object(u.isUnd)(n.inline)&&n.inline,o.readOnly=!Object(u.isUnd)(n.readOnly)&&!!n.readOnly,o.inverted=!Object(u.isUnd)(n.inverted)&&!!n.inverted,o.labeled=!Object(u.isUnd)(n.label),o.labelAnimated=!!n.labelAnimated,o}return c()(t,e),t.prototype.click=function(){this.readOnly||!this.enable()||this.disable()||this.value(!this.value())},t}(n(27).a)},function(e,t){e.exports=window.crossroads},function(e,t,n){"use strict";function o(e){var t=[],n=[],i=[];return new r(e).tokenize().forEach(function(e){"operator"!==e.type||","!==e.value&&";"!==e.value?n.push(e):(n.length&&t.push(n),n=[])}),n.length&&t.push(n),t.forEach(function(e){(e=function(e){for(var t=!1,n="text",i=void 0,a=[],r={address:[],comment:[],group:[],text:[]},s=0,c=e.length;s=0;u--)if(r.text[u].match(/^[^@\s]+@[^@\s]+$/)){r.address=r.text.splice(u,1);break}if(!r.address.length)for(var d=r.text.length-1;d>=0&&(r.text[d]=r.text[d].replace(/\s*\b[^@\s]+@[^@\s]+\b\s*/,function(e){return r.address.length?e:(r.address=[e.trim()]," ")}).trim(),!r.address.length);d--);}if(!r.text.length&&r.comment.length&&(r.text=r.comment,r.comment=[]),r.address.length>1&&(r.text=r.text.concat(r.address.splice(1))),r.text=r.text.join(" "),r.address=r.address.join(" "),!r.address&&t)return[];(i={address:r.address||r.text||"",name:r.text||r.address||""}).address===i.name&&((i.address||"").match(/@/)?i.name="":i.address=""),a.push(i)}return a}(e)).length&&(i=i.concat(e))}),i}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n",",":"",":":";",";":""},r=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.str=(t||"").toString(),this.operatorCurrent="",this.operatorExpecting="",this.node=null,this.escaped=!1,this.list=[]}return i(e,[{key:"tokenize",value:function(){for(var e=void 0,t=[],n=0,o=this.str.length;n+$/,""),this.fileNameExt=Object(b.getFileExtension)(this.fileName),this.fileType=S(this.fileNameExt,this.mimeType),t=!0),t},t.prototype.isImage=function(){return f.FileType.Image===this.fileType},t.prototype.isMp3=function(){return f.FileType.Audio===this.fileType&&"mp3"===this.fileNameExt},t.prototype.isOgg=function(){return f.FileType.Audio===this.fileType&&("oga"===this.fileNameExt||"ogg"===this.fileNameExt)},t.prototype.isWav=function(){return f.FileType.Audio===this.fileType&&"wav"===this.fileNameExt},t.prototype.hasThumbnail=function(){return this.isThumbnail},t.prototype.isText=function(){return f.FileType.Text===this.fileType||f.FileType.Eml===this.fileType||f.FileType.Certificate===this.fileType||f.FileType.Html===this.fileType||f.FileType.Code===this.fileType},t.prototype.isPdf=function(){return f.FileType.Pdf===this.fileType},t.prototype.isFramed=function(){return this.framed&&m.data.__APP__&&m.data.__APP__.googlePreviewSupported()&&!(this.isPdf()&&m.bAllowPdfPreview)&&!this.isText()&&!this.isImage()},t.prototype.hasPreview=function(){return this.isImage()||this.isPdf()&&m.bAllowPdfPreview||this.isText()||this.isFramed()},t.prototype.hasPreplay=function(){return v.a.supportedMp3&&this.isMp3()||v.a.supportedOgg&&this.isOgg()||v.a.supportedWav&&this.isWav()},t.prototype.linkDownload=function(){return Object(g.c)(this.download)},t.prototype.linkPreview=function(){return Object(g.e)(this.download)},t.prototype.linkThumbnail=function(){return this.hasThumbnail()?Object(g.g)(this.download):""},t.prototype.linkThumbnailPreviewStyle=function(){var e=this.linkThumbnail();return""===e?"":"background:url("+e+")"},t.prototype.linkFramed=function(){return Object(g.d)(this.download)},t.prototype.linkPreviewAsPlain=function(){return Object(g.f)(this.download)},t.prototype.linkPreviewMain=function(){var e="";switch(!0){case this.isImage():case this.isPdf()&&m.bAllowPdfPreview:e=this.linkPreview();break;case this.isText():e=this.linkPreviewAsPlain();break;case this.isFramed():e=this.linkFramed()}return e},t.prototype.generateTransferDownloadUrl=function(){var e=this.linkDownload();return"http"!==e.substr(0,4)&&(e=u.a.location.protocol+"//"+u.a.location.host+u.a.location.pathname+e),this.mimeType+":"+this.fileName+":"+e},t.prototype.eventDragStart=function(e,t){var n=t.originalEvent||t;return e&&n&&n.dataTransfer&&n.dataTransfer.setData&&n.dataTransfer.setData("DownloadURL",this.generateTransferDownloadUrl()),!0},t.prototype.iconClass=function(){return O(this.fileType)[0]},t.prototype.iconText=function(){return O(this.fileType)[1]},t}(y.a)},function(e,t,n){"use strict";n.r(t);var o=n(8),i=n.n(o),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(27),u=function(e){function t(){return i()(this,t),r()(this,e.apply(this,arguments))}return c()(t,e),t}(n(74).a);t.default=Object(l.b)(u,"CheckboxComponent")},function(e,t,n){var o=n(41),i=n(40),a=n(90),r=n(82),s=n(49).f;e.exports=function(e){var t=i.Symbol||(i.Symbol=a?{}:o.Symbol||{});"_"==e.charAt(0)||e in t||s(t,e,{value:r.f(e)})}},function(e,t,n){t.f=n(60)},function(e,t,n){var o=n(49).f,i=n(46),a=n(60)("toStringTag");e.exports=function(e,t,n){e&&!i(e=n?e:e.prototype,a)&&o(e,a,{configurable:!0,value:t})}},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,n){var o=n(41),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});e.exports=function(e){return i[e]||(i[e]={})}},function(e,t,n){var o=n(85)("keys"),i=n(70);e.exports=function(e){return o[e]||(o[e]=i(e))}},function(e,t,n){var o=n(104),i=n(84);e.exports=Object.keys||function(e){return o(e,i)}},function(e,t,n){var o=n(61),i=n(164),a=n(84),r=n(86)("IE_PROTO"),s=function(){},c=function(){var e,t=n(93)("iframe"),o=a.length;for(t.style.display="none",n(160).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("
[\s]+/i', '
', $sText); - $sText = \preg_replace('/[\s]+<\/blockquote>/i', '
', $sText); - - $sText = \preg_replace('/<\/blockquote>([\n]{0,2})
/i', '\\1', $sText); - $sText = \preg_replace('/[\n]{3,}/', "\n\n", $sText); - - $sText = \strtr($sText, array( - "\n" => "
", - "\t" => '   ', - ' ' => '  ' - )); - - return $sText; - } - - /** - * @param string $sText - * - * @return string - */ - public static function ConvertHtmlToPlain($sText) - { - $sText = \trim(\stripslashes($sText)); - $sText = \MailSo\Base\Utils::StripSpaces($sText); - - $sText = \preg_replace(array( - "/\r/", - "/[\n\t]+/", - '/]*>.*?<\/script>/i', - '/]*>.*?<\/style>/i', - '/]*>.*?<\/title>/i', - '/]*>(.+?)<\/h[123]>/i', - '/]*>(.+?)<\/h[456]>/i', - '/]*>/i', - '/]*>/i', - '/]*>(.+?)<\/b>/i', - '/]*>(.+?)<\/i>/i', - '/(]*>|<\/ul>)/i', - '/(]*>|<\/ol>)/i', - '/]*>/i', - '/]*href="([^"]+)"[^>]*>(.+?)<\/a>/i', - '/]*>/i', - '/(]*>|<\/table>)/i', - '/(]*>|<\/tr>)/i', - '/]*>(.+?)<\/td>/i', - '/]*>(.+?)<\/th>/i', - '/ /i', - '/"/i', - '/&/i', - '/©/i', - '/™/i', - '/“/', - '/”/', - '/–/', - '/’/', - '/&/', - '/©/', - '/™/', - '/—/', - '/“/', - '/”/', - '/•/', - '/®/i', - '/•/i', - '/&[&;]+;/i', - '/'/', - '/ /' - ), array( - '', - ' ', - '', - '', - '', - "\n\n\\1\n\n", - "\n\n\\1\n\n", - "\n\n\t", - "\n", - '\\1', - '\\1', - "\n\n", - "\n\n", - "\n\t* ", - '\\2 (\\1)', - "\n------------------------------------\n", - "\n", - "\n", - "\t\\1\n", - "\t\\1\n", - ' ', - '"', - '&', - '(c)', - '(tm)', - '"', - '"', - '-', - "'", - '&', - '(c)', - '(tm)', - '--', - '"', - '"', - '*', - '(R)', - '*', - '', - '\'', - '' - ), $sText); - - $sText = \str_ireplace('
',"\n
", $sText); - $sText = \strip_tags($sText, ''); - $sText = \preg_replace("/\n\\s+\n/", "\n", $sText); - $sText = \preg_replace("/[\n]{3,}/", "\n\n", $sText); - - $sText = \preg_replace(array( - '/>/i', - '/</i' - ), array( - '>', - '<' - ), $sText); - - return \trim($sText); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Http.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Http.php deleted file mode 100755 index a851dbf8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Http.php +++ /dev/null @@ -1,800 +0,0 @@ -bIsMagicQuotesOn = (bool) @\ini_get('magic_quotes_gpc'); - } - - /** - * @return \MailSo\Base\Http - */ - public static function NewInstance() - { - return new self(); - } - - /** - * @staticvar \MailSo\Base\Http $oInstance; - * - * @return \MailSo\Base\Http - */ - public static function SingletonInstance() - { - static $oInstance = null; - if (null === $oInstance) - { - $oInstance = self::NewInstance(); - } - - return $oInstance; - } - - /** - * @param string $sKey - * - * @return bool - */ - public function HasQuery($sKey) - { - return isset($_GET[$sKey]); - } - - /** - * @param string $sKey - * @param mixed $mDefault = null - * @param bool $bClearPercZeroZero = true - * - * @return mixed - */ - public function GetQuery($sKey, $mDefault = null, $bClearPercZeroZero = true) - { - return isset($_GET[$sKey]) ? \MailSo\Base\Utils::StripSlashesValue($_GET[$sKey], $bClearPercZeroZero) : $mDefault; - } - - /** - * @return array|null - */ - public function GetQueryAsArray() - { - return isset($_GET) && \is_array($_GET) ? \MailSo\Base\Utils::StripSlashesValue($_GET, true) : null; - } - - /** - * @param string $sKey - * - * @return bool - */ - public function HasPost($sKey) - { - return isset($_POST[$sKey]); - } - - /** - * @param string $sKey - * @param mixed $mDefault = null - * @param bool $bClearPercZeroZero = false - * - * @return mixed - */ - public function GetPost($sKey, $mDefault = null, $bClearPercZeroZero = false) - { - return isset($_POST[$sKey]) ? \MailSo\Base\Utils::StripSlashesValue($_POST[$sKey], $bClearPercZeroZero) : $mDefault; - } - - /** - * @return array|null - */ - public function GetPostAsArray() - { - return isset($_POST) && \is_array($_POST) ? \MailSo\Base\Utils::StripSlashesValue($_POST, false) : null; - } - - /** - * @param string $sKey - * - * @return bool - */ - public function HasRequest($sKey) - { - return isset($_REQUEST[$sKey]); - } - - /** - * @param string $sKey - * @param mixed $mDefault = null - * - * @return mixed - */ - public function GetRequest($sKey, $mDefault = null) - { - return isset($_REQUEST[$sKey]) ? \MailSo\Base\Utils::StripSlashesValue($_REQUEST[$sKey]) : $mDefault; - } - - /** - * @param string $sKey - * - * @return bool - */ - public function HasServer($sKey) - { - return isset($_SERVER[$sKey]); - } - - /** - * @param string $sKey - * @param mixed $mDefault = null - * - * @return mixed - */ - public function GetServer($sKey, $mDefault = null) - { - return isset($_SERVER[$sKey]) ? $_SERVER[$sKey] : $mDefault; - } - - /** - * @param string $sKey - * - * @return bool - */ - public function HasEnv($sKey) - { - return isset($_ENV[$sKey]); - } - - /** - * @param string $sKey - * @param mixed $mDefault = null - * - * @return mixed - */ - public function GetEnv($sKey, $mDefault = null) - { - return isset($_ENV[$sKey]) ? $_ENV[$sKey] : $mDefault; - } - - /** - * @return string - */ - public function ServerProtocol() - { - return $this->GetServer('SERVER_PROTOCOL', 'HTTP/1.0'); - } - - /** - * @return string - */ - public function GetMethod() - { - return $this->GetServer('REQUEST_METHOD', ''); - } - - /** - * @return bool - */ - public function IsPost() - { - return ('POST' === $this->GetMethod()); - } - - /** - * @return bool - */ - public function IsGet() - { - return ('GET' === $this->GetMethod()); - } - - /** - * @return string - */ - public function GetQueryString() - { - return $this->GetServer('QUERY_STRING', ''); - } - - /** - * @return bool - */ - public function CheckLocalhost($sServer) - { - return \in_array(\strtolower(\trim($sServer)), array( - 'localhost', '127.0.0.1', '::1', '::1/128', '0:0:0:0:0:0:0:1' - )); - } - - /** - * @param string $sValueToCheck = '' - * - * @return bool - */ - public function IsLocalhost($sValueToCheck = '') - { - if (empty($sValueToCheck)) - { - $sValueToCheck = $this->GetServer('REMOTE_ADDR', ''); - } - - return $this->CheckLocalhost($sValueToCheck); - } - - /** - * @return string - */ - public function GetRawBody() - { - static $sRawBody = null; - if (null === $sRawBody) - { - $sBody = @\file_get_contents('php://input'); - $sRawBody = (false !== $sBody) ? $sBody : ''; - } - return $sRawBody; - } - - /** - * @param string $sHeader - * - * @return string - */ - public function GetHeader($sHeader) - { - $sServerKey = 'HTTP_'.\strtoupper(\str_replace('-', '_', $sHeader)); - $sResultHeader = $this->GetServer($sServerKey, ''); - - if (0 === \strlen($sResultHeader) && - \MailSo\Base\Utils::FunctionExistsAndEnabled('apache_request_headers')) - { - $sHeaders = \apache_request_headers(); - if (isset($sHeaders[$sHeader])) - { - $sResultHeader = $sHeaders[$sHeader]; - } - } - - return $sResultHeader; - } - - /** - * @param bool $bCheckProxy = true - * - * @return string - */ - public function GetScheme($bCheckProxy = true) - { - return $this->IsSecure($bCheckProxy) ? 'https' : 'http'; - } - - /** - * @param bool $bCheckProxy = true - * - * @return bool - */ - public function IsSecure($bCheckProxy = true) - { - $sHttps = \strtolower($this->GetServer('HTTPS', '')); - if ('on' === $sHttps || ('' === $sHttps && '443' === (string) $this->GetServer('SERVER_PORT', ''))) - { - return true; - } - - if ($bCheckProxy && ( - ('https' === \strtolower($this->GetServer('HTTP_X_FORWARDED_PROTO', ''))) || - ('on' === \strtolower($this->GetServer('HTTP_X_FORWARDED_SSL', ''))) - )) - { - return true; - } - - return false; - } - - /** - * @param bool $bWithRemoteUserData = false - * @param bool $bWithoutWWW = true - * @param bool $bWithoutPort = false - * - * @return string - */ - public function GetHost($bWithRemoteUserData = false, $bWithoutWWW = true, $bWithoutPort = false) - { - $sHost = $this->GetServer('HTTP_HOST', ''); - if (0 === \strlen($sHost)) - { - $sName = $this->GetServer('SERVER_NAME'); - $iPort = (int) $this->GetServer('SERVER_PORT', 80); - - $sHost = (\in_array($iPort, array(80, 433))) ? $sName : $sName.':'.$iPort; - } - - if ($bWithoutWWW) - { - $sHost = 'www.' === \substr(\strtolower($sHost), 0, 4) ? \substr($sHost, 4) : $sHost; - } - - if ($bWithRemoteUserData) - { - $sUser = \trim($this->HasServer('REMOTE_USER') ? $this->GetServer('REMOTE_USER', '') : ''); - $sHost = (0 < \strlen($sUser) ? $sUser.'@' : '').$sHost; - } - - if ($bWithoutPort) - { - $sHost = \preg_replace('/:[\d]+$/', '', $sHost); - } - - return $sHost; - } - - /** - * @param bool $bCheckProxy = false - * - * @return string - */ - public function GetClientIp($bCheckProxy = false) - { - $sIp = ''; - if ($bCheckProxy && null !== $this->GetServer('HTTP_CLIENT_IP', null)) - { - $sIp = $this->GetServer('HTTP_CLIENT_IP', ''); - } - else if ($bCheckProxy && null !== $this->GetServer('HTTP_X_FORWARDED_FOR', null)) - { - $sIp = $this->GetServer('HTTP_X_FORWARDED_FOR', ''); - } - else - { - $sIp = $this->GetServer('REMOTE_ADDR', ''); - } - - return $sIp; - } - - /** - * @param string $sUrl - * @param array $aPost = array() - * @param string $sCustomUserAgent = 'MailSo Http User Agent (v1)' - * @param int $iCode = 0 - * @param \MailSo\Log\Logger $oLogger = null - * @param int $iTimeout = 20 - * @param string $sProxy = '' - * @param string $sProxyAuth = '' - * - * @return string|bool - */ - public function SendPostRequest($sUrl, $aPost = array(), $sCustomUserAgent = 'MailSo Http User Agent (v1)', &$iCode = 0, - $oLogger = null, $iTimeout = 20, $sProxy = '', $sProxyAuth = '') - { - $aOptions = array( - CURLOPT_URL => $sUrl, - CURLOPT_HEADER => false, - CURLOPT_FAILONERROR => true, - CURLOPT_SSL_VERIFYPEER => false, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_POST => true, - CURLOPT_POSTFIELDS => \http_build_query($aPost, '', '&'), - CURLOPT_TIMEOUT => (int) $iTimeout - ); - - if (0 < \strlen($sCustomUserAgent)) - { - $aOptions[CURLOPT_USERAGENT] = $sCustomUserAgent; - } - - if (0 < \strlen($sProxy)) - { - $aOptions[CURLOPT_PROXY] = $sProxy; - if (0 < \strlen($sProxyAuth)) - { - $aOptions[CURLOPT_PROXYUSERPWD] = $sProxyAuth; - } - } - - $oCurl = \curl_init(); - \curl_setopt_array($oCurl, $aOptions); - - if ($oLogger) - { - $oLogger->Write('cURL: Send post request: '.$sUrl); - } - - $mResult = \curl_exec($oCurl); - - $iCode = (int) \curl_getinfo($oCurl, CURLINFO_HTTP_CODE); - $sContentType = (string) \curl_getinfo($oCurl, CURLINFO_CONTENT_TYPE); - - if ($oLogger) - { - $oLogger->Write('cURL: Post request result: (Status: '.$iCode.', ContentType: '.$sContentType.')'); - if (false === $mResult || 200 !== $iCode) - { - $oLogger->Write('cURL: Error: '.\curl_error($oCurl), \MailSo\Log\Enumerations\Type::WARNING); - } - } - - if (\is_resource($oCurl)) - { - \curl_close($oCurl); - } - - return $mResult; - } - - /** - * @param string $sUrl - * @param array $aOptions - * @param \MailSo\Log\Logger $oLogger = null - * - * @return string - */ - static public function DetectAndHackFollowLocationUrl($sUrl, &$aOptions, $oLogger = null) - { - $sSafeMode = \strtolower(\trim(@\ini_get('safe_mode'))); - $bSafeMode = 'on' === $sSafeMode || '1' === $sSafeMode; - - $sNewUrl = null; - $sUrl = isset($aOptions[CURLOPT_URL]) ? $aOptions[CURLOPT_URL] : $sUrl; - - if (isset($aOptions[CURLOPT_FOLLOWLOCATION]) && $aOptions[CURLOPT_FOLLOWLOCATION] && 0 < \strlen($sUrl) && - ($bSafeMode || \ini_get('open_basedir') !== '')) - { - $aOptions[CURLOPT_FOLLOWLOCATION] = false; - - $iMaxRedirects = isset($aOptions[CURLOPT_MAXREDIRS]) ? $aOptions[CURLOPT_MAXREDIRS] : 5; - $iRedirectLimit = $iMaxRedirects; - - if ($iRedirectLimit > 0) - { - $sNewUrl = $sUrl; - - $oCurl = \curl_init($sUrl); - - $aAddOptions = array( - CURLOPT_URL => $sUrl, - CURLOPT_HEADER => true, - CURLOPT_NOBODY => true, - CURLOPT_FAILONERROR => false, - CURLOPT_SSL_VERIFYPEER => false, - CURLOPT_FOLLOWLOCATION => false, - CURLOPT_FORBID_REUSE => false, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_TIMEOUT => 5 - ); - - if (isset($aOptions[CURLOPT_HTTPHEADER]) && \is_array($aOptions[CURLOPT_HTTPHEADER]) && 0 < \count($aOptions[CURLOPT_HTTPHEADER])) - { - $aAddOptions[CURLOPT_HTTPHEADER] = $aOptions[CURLOPT_HTTPHEADER]; - } - - \curl_setopt_array($oCurl, $aAddOptions); - - do - { - \curl_setopt($oCurl, CURLOPT_URL, $sNewUrl); - - $sHeader = \curl_exec($oCurl); - if (\curl_errno($oCurl)) - { - $iCode = 0; - } - else - { - $iCode = \curl_getinfo($oCurl, CURLINFO_HTTP_CODE); - if ($iCode === 301 || $iCode === 302) - { - $aMatches = array(); - \preg_match('/Location:(.*?)\n/', $sHeader, $aMatches); - $sNewUrl = \trim(\array_pop($aMatches)); - - if ($oLogger) - { - $oLogger->Write('cUrl: Location URL: '.$sNewUrl); - } - } - else - { - $iCode = 0; - } - } - - } while ($iCode && --$iRedirectLimit); - - \curl_close($oCurl); - if ($iRedirectLimit > 0 && 0 < \strlen($sNewUrl)) - { - $aOptions[CURLOPT_URL] = $sNewUrl; - } - } - } - - return null === $sNewUrl ? $sUrl : $sNewUrl; - } - - /** - * @param string $sUrl - * @param resource $rFile - * @param string $sCustomUserAgent = 'MailSo Http User Agent (v1)' - * @param string $sContentType = '' - * @param int $iCode = 0 - * @param \MailSo\Log\Logger $oLogger = null - * @param int $iTimeout = 10 - * @param string $sProxy = '' - * @param string $sProxyAuth = '' - * @param array $aHttpHeaders = array() - * @param bool $bFollowLocation = true - * - * @return bool - */ - public function SaveUrlToFile($sUrl, $rFile, $sCustomUserAgent = 'MailSo Http User Agent (v1)', &$sContentType = '', &$iCode = 0, - $oLogger = null, $iTimeout = 10, $sProxy = '', $sProxyAuth = '', $aHttpHeaders = array(), $bFollowLocation = true) - { - if (null === $sCustomUserAgent) - { - $sCustomUserAgent = 'MailSo Http User Agent (v1)'; - } - - if (!is_resource($rFile)) - { - if ($oLogger) - { - $oLogger->Write('cURL: input resource invalid.', \MailSo\Log\Enumerations\Type::WARNING); - } - - return false; - } - - $sUrl = \trim($sUrl); - if ('//' === substr($sUrl, 0, 2)) - { - $sUrl = 'http:'.$sUrl; - } - - $aOptions = array( - CURLOPT_URL => $sUrl, - CURLOPT_HEADER => false, - CURLOPT_FAILONERROR => true, - CURLOPT_SSL_VERIFYPEER => false, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_FOLLOWLOCATION => !!$bFollowLocation, - CURLOPT_MAXREDIRS => 7, - CURLOPT_FILE => $rFile, - CURLOPT_TIMEOUT => (int) $iTimeout - ); - - if (0 < \strlen($sCustomUserAgent)) - { - $aOptions[CURLOPT_USERAGENT] = $sCustomUserAgent; - } - - if (0 < \strlen($sProxy)) - { - $aOptions[CURLOPT_PROXY] = $sProxy; - if (0 < \strlen($sProxyAuth)) - { - $aOptions[CURLOPT_PROXYUSERPWD] = $sProxyAuth; - } - } - - if (\is_array($aHttpHeaders) && 0 < \count($aHttpHeaders)) - { - $aOptions[CURLOPT_HTTPHEADER] = $aHttpHeaders; - } - - if ($oLogger) - { - $oLogger->Write('cUrl: URL: '.$sUrl); -// if (isset($aOptions[CURLOPT_HTTPHEADER]) && \is_array($aOptions[CURLOPT_HTTPHEADER]) && 0 < \count($aOptions[CURLOPT_HTTPHEADER])) -// { -// $oLogger->Write('cUrl: Headers: '.\print_r($aOptions[CURLOPT_HTTPHEADER], true)); -// } - } - - \MailSo\Base\Http::DetectAndHackFollowLocationUrl($sUrl, $aOptions, $oLogger); - - $oCurl = \curl_init(); - \curl_setopt_array($oCurl, $aOptions); - - $bResult = \curl_exec($oCurl); - - $iCode = (int) \curl_getinfo($oCurl, CURLINFO_HTTP_CODE); - $sContentType = (string) \curl_getinfo($oCurl, CURLINFO_CONTENT_TYPE); - - if ($oLogger) - { - $oLogger->Write('cUrl: Request result: '.($bResult ? 'true' : 'false').' (Status: '.$iCode.', ContentType: '.$sContentType.')'); - if (!$bResult || 200 !== $iCode) - { - $oLogger->Write('cUrl: Error: '.\curl_error($oCurl), \MailSo\Log\Enumerations\Type::WARNING); - } - } - - if (\is_resource($oCurl)) - { - \curl_close($oCurl); - } - - return $bResult; - } - - /** - * @param string $sUrl - * @param string $sCustomUserAgent = 'MailSo Http User Agent (v1)' - * @param string $sContentType = '' - * @param int $iCode = 0 - * @param \MailSo\Log\Logger $oLogger = null - * @param int $iTimeout = 10 - * @param string $sProxy = '' - * @param string $sProxyAuth = '' - * @param array $aHttpHeaders = array() - * @param bool $bFollowLocation = true - * - * @return string|bool - */ - public function GetUrlAsString($sUrl, $sCustomUserAgent = 'MailSo Http User Agent (v1)', &$sContentType = '', &$iCode = 0, - $oLogger = null, $iTimeout = 10, $sProxy = '', $sProxyAuth = '', $aHttpHeaders = array(), $bFollowLocation = true) - { - $rMemFile = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); - if ($this->SaveUrlToFile($sUrl, $rMemFile, $sCustomUserAgent, $sContentType, $iCode, $oLogger, $iTimeout, $sProxy, $sProxyAuth, $aHttpHeaders, $bFollowLocation) && \is_resource($rMemFile)) - { - \rewind($rMemFile); - return \stream_get_contents($rMemFile); - } - - return false; - } - - /** - * @param int $iExpireTime - * @param bool $bSetCacheHeader = true - * @param string $sEtag = '' - * - * @return bool - */ - public function ServerNotModifiedCache($iExpireTime, $bSetCacheHeader = true, $sEtag = '') - { - $bResult = false; - if (0 < $iExpireTime) - { - $iUtcTimeStamp = \time(); - $sIfModifiedSince = $this->GetHeader('If-Modified-Since', ''); - if (0 === \strlen($sIfModifiedSince)) - { - if ($bSetCacheHeader) - { - @\header('Cache-Control: public', true); - @\header('Pragma: public', true); - @\header('Last-Modified: '.\gmdate('D, d M Y H:i:s', $iUtcTimeStamp - $iExpireTime).' UTC', true); - @\header('Expires: '.\gmdate('D, j M Y H:i:s', $iUtcTimeStamp + $iExpireTime).' UTC', true); - - if (0 < strlen($sEtag)) - { - \header('Etag: '.$sEtag, true); - } - } - } - else - { - $this->StatusHeader(304); - $bResult = true; - } - } - - return $bResult; - } - - /** - * @staticvar boolean $bCache - */ - public function ServerNoCache() - { - static $bCache = false; - if (false === $bCache) - { - $bCache = true; - @\header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); - @\header('Last-Modified: '.\gmdate('D, d M Y H:i:s').' GMT'); - @\header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0'); - @\header('Cache-Control: post-check=0, pre-check=0', false); - @\header('Pragma: no-cache'); - } - } - - /** - * @staticvar boolean $bCache - * @param string $sEtag - * @param int $iLastModified - * @param int $iExpires - */ - public function ServerUseCache($sEtag, $iLastModified, $iExpires) - { - static $bCache = false; - if (false === $bCache) - { - $bCache = true; - @\header('Cache-Control: private', true); - @\header('ETag: '.$sEtag, true); - @\header('Last-Modified: '.\gmdate('D, d M Y H:i:s', $iLastModified).' UTC', true); - @\header('Expires: '.\gmdate('D, j M Y H:i:s', $iExpires).' UTC', true); - } - } - - /** - * @param int $iStatus - * - * @return void - */ - public function StatusHeader($iStatus, $sCustomStatusText = '') - { - $iStatus = (int) $iStatus; - if (99 < $iStatus) - { - $aStatus = array( - 200 => 'OK', - 206 => 'Partial Content', - 301 => 'Moved Permanently', - 304 => 'Not Modified', - 400 => 'Bad Request', - 401 => 'Unauthorized', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 416 => 'Requested range not satisfiable' - ); - - $sCustomStatusText = \trim($sCustomStatusText); - $sHeaderHead = \ini_get('cgi.rfc2616_headers') && false !== \strpos(\strtolower(\php_sapi_name()), 'cgi') ? 'Status:' : $this->ServerProtocol(); - $sHeaderText = (0 === \strlen($sCustomStatusText) && isset($aStatus[$iStatus]) ? $aStatus[$iStatus] : $sCustomStatusText); - - \header(\trim($sHeaderHead.' '.$iStatus.' '.$sHeaderText), true, $iStatus); - } - } - - /** - * @return string - */ - public function GetPath() - { - $sUrl = \ltrim(\substr($this->GetServer('SCRIPT_NAME', ''), 0, \strrpos($this->GetServer('SCRIPT_NAME', ''), '/')), '/'); - return '' === $sUrl ? '/' : '/'.$sUrl.'/'; - } - - /** - * @return string - */ - public function GetUrl() - { - return $this->GetServer('REQUEST_URI', ''); - } - - /** - * @return string - */ - public function GetFullUrl() - { - return $this->GetScheme().'://'.$this->GetHost(true, false).$this->GetPath(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/LinkFinder.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/LinkFinder.php deleted file mode 100755 index 73f92787..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/LinkFinder.php +++ /dev/null @@ -1,298 +0,0 @@ -iHtmlSpecialCharsFlags = (\defined('ENT_QUOTES') && \defined('ENT_SUBSTITUTE') && \defined('ENT_HTML401')) - ? ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 : ENT_QUOTES; - - if (\defined('ENT_IGNORE')) - { - $this->iHtmlSpecialCharsFlags |= ENT_IGNORE; - } - - $this->iOptimizationLimit = 300000; - - $this->Clear(); - } - - /** - * @return \MailSo\Base\LinkFinder - */ - public static function NewInstance() - { - return new self(); - } - - /** - * @return \MailSo\Base\LinkFinder - */ - public function Clear() - { - $this->aPrepearPlainStringUrls = array(); - $this->fLinkWrapper = null; - $this->fMailWrapper = null; - $this->sText = ''; - - return $this; - } - - /** - * @param string $sText - * - * @return \MailSo\Base\LinkFinder - */ - public function Text($sText) - { - $this->sText = $sText; - - return $this; - } - - /** - * @param mixed $fLinkWrapper - * - * @return \MailSo\Base\LinkFinder - */ - public function LinkWrapper($fLinkWrapper) - { - $this->fLinkWrapper = $fLinkWrapper; - - return $this; - } - - /** - * @param mixed $fMailWrapper - * - * @return \MailSo\Base\LinkFinder - */ - public function MailWrapper($fMailWrapper) - { - $this->fMailWrapper = $fMailWrapper; - - return $this; - } - - /** - * @param bool $bAddTargetBlank = false - * - * @return \MailSo\Base\LinkFinder - */ - public function UseDefaultWrappers($bAddTargetBlank = false) - { - $this->fLinkWrapper = function ($sLink) use ($bAddTargetBlank) { - - $sNameLink = $sLink; - if (!\preg_match('/^[a-z]{3,5}\:\/\//i', \ltrim($sLink))) - { - $sLink = 'http://'.\ltrim($sLink); - } - - return ''.$sNameLink.''; - }; - - $this->fMailWrapper = function ($sEmail) use ($bAddTargetBlank) { - return ''.$sEmail.''; - }; - - return $this; - } - - /** - * @param bool $bUseHtmlSpecialChars = true - * - * @return string - */ - public function CompileText($bUseHtmlSpecialChars = true) - { - $sText = \substr($this->sText, 0, $this->iOptimizationLimit); - $sSubText = \substr($this->sText, $this->iOptimizationLimit); - - $this->aPrepearPlainStringUrls = array(); - if (null !== $this->fLinkWrapper && \is_callable($this->fLinkWrapper)) - { - $sText = $this->findLinks($sText, $this->fLinkWrapper); - } - - if (null !== $this->fMailWrapper && \is_callable($this->fMailWrapper)) - { - $sText = $this->findMails($sText, $this->fMailWrapper); - } - - $sResult = ''; - if ($bUseHtmlSpecialChars) - { - $sResult = @\htmlentities($sText.$sSubText, $this->iHtmlSpecialCharsFlags, 'UTF-8'); - } - else - { - $sResult = $sText.$sSubText; - } - - unset($sText, $sSubText); - - if (0 < \count($this->aPrepearPlainStringUrls)) - { - $aPrepearPlainStringUrls = $this->aPrepearPlainStringUrls; - $sResult = \preg_replace_callback('/'.\preg_quote(\MailSo\Base\LinkFinder::OPEN_LINK, '/'). - '([\d]+)'.\preg_quote(\MailSo\Base\LinkFinder::CLOSE_LINK, '/').'/', - function ($aMatches) use ($aPrepearPlainStringUrls) { - $iIndex = (int) $aMatches[1]; - return isset($aPrepearPlainStringUrls[$iIndex]) ? $aPrepearPlainStringUrls[$iIndex] : ''; - }, $sResult); - - $this->aPrepearPlainStringUrls = array(); - } - - return $sResult; - } - - /** - * @param string $sText - * @param mixed $fWrapper - * - * @return string - */ - private function findLinks($sText, $fWrapper) - { - $sPattern = '/([\W]|^)((?:https?:\/\/)|(?:svn:\/\/)|(?:git:\/\/)|(?:s?ftps?:\/\/)|(?:www\.))'. - '((\S+?)(\\/)?)((?:>)?|[^\w\=\\/;\(\)\[\]]*?)(?=<|\s|$)/imu'; - - $aPrepearPlainStringUrls = $this->aPrepearPlainStringUrls; - $sText = \preg_replace_callback($sPattern, function ($aMatch) use ($fWrapper, &$aPrepearPlainStringUrls) { - - if (\is_array($aMatch) && 6 < \count($aMatch)) - { - while (\in_array($sChar = \substr($aMatch[3], -1), array(']', ')'))) - { - if (\substr_count($aMatch[3], ']' === $sChar ? '[': '(') - \substr_count($aMatch[3], $sChar) < 0) - { - $aMatch[3] = \substr($aMatch[3], 0, -1); - $aMatch[6] = (']' === $sChar ? ']': ')').$aMatch[6]; - } - else - { - break; - } - } - - $sLinkWithWrap = \call_user_func($fWrapper, $aMatch[2].$aMatch[3]); - if (\is_string($sLinkWithWrap) && 0 < \strlen($sLinkWithWrap)) - { - $aPrepearPlainStringUrls[] = \stripslashes($sLinkWithWrap); - return $aMatch[1]. - \MailSo\Base\LinkFinder::OPEN_LINK. - (\count($aPrepearPlainStringUrls) - 1). - \MailSo\Base\LinkFinder::CLOSE_LINK. - $aMatch[6]; - } - - return $aMatch[0]; - } - - return ''; - - }, $sText); - - if (0 < \count($aPrepearPlainStringUrls)) - { - $this->aPrepearPlainStringUrls = $aPrepearPlainStringUrls; - } - - return $sText; - } - - /** - * @param string $sText - * @param mixed $fWrapper - * - * @return string - */ - private function findMails($sText, $fWrapper) - { - $sPattern = '/([\w\.!#\$%\-+.]+@[A-Za-z0-9\-]+(\.[A-Za-z0-9\-]+)+)/'; - - $aPrepearPlainStringUrls = $this->aPrepearPlainStringUrls; - $sText = \preg_replace_callback($sPattern, function ($aMatch) use ($fWrapper, &$aPrepearPlainStringUrls) { - - if (\is_array($aMatch) && isset($aMatch[1])) - { - $sMailWithWrap = \call_user_func($fWrapper, $aMatch[1]); - if (\is_string($sMailWithWrap) && 0 < \strlen($sMailWithWrap)) - { - $aPrepearPlainStringUrls[] = \stripslashes($sMailWithWrap); - return \MailSo\Base\LinkFinder::OPEN_LINK. - (\count($aPrepearPlainStringUrls) - 1). - \MailSo\Base\LinkFinder::CLOSE_LINK; - } - - return $aMatch[1]; - } - - return ''; - - }, $sText); - - if (0 < \count($aPrepearPlainStringUrls)) - { - $this->aPrepearPlainStringUrls = $aPrepearPlainStringUrls; - } - - return $sText; - } -} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Loader.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Loader.php deleted file mode 100755 index 0a58e551..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Loader.php +++ /dev/null @@ -1,137 +0,0 @@ - array( - 'phpversion' => PHP_VERSION, - 'ssl' => (int) \function_exists('openssl_open'), - 'iconv' => (int) \function_exists('iconv') - )); - - if (\MailSo\Base\Utils::FunctionExistsAndEnabled('memory_get_usage') && - \MailSo\Base\Utils::FunctionExistsAndEnabled('memory_get_peak_usage')) - { - $aResult['php']['memory_get_usage'] = - Utils::FormatFileSize(\memory_get_usage(true), 2); - $aResult['php']['memory_get_peak_usage'] = - Utils::FormatFileSize(\memory_get_peak_usage(true), 2); - } - - $iTimeDelta = \microtime(true) - self::GetStatistic('Inited'); - self::SetStatistic('TimeDelta', $iTimeDelta); - - $aResult['statistic'] = self::$aSetStatistic; - $aResult['counts'] = self::$aIncStatistic; - $aResult['time'] = $iTimeDelta; - } - - return $aResult; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/ResourceRegistry.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/ResourceRegistry.php deleted file mode 100755 index 6e73ee79..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/ResourceRegistry.php +++ /dev/null @@ -1,125 +0,0 @@ - \MailSo\Mime\Enumerations\Constants::LINE_LENGTH, - 'line-break-chars' => \MailSo\Mime\Enumerations\Constants::CRLF - )); - - return \is_resource($rFilter) ? $rStream : false; - } - - self::$aStreams[$sHashName] = - array($rStream, $sUtilsDecodeOrEncodeFunctionName, $sFromEncoding, $sToEncoding); - - \MailSo\Base\Loader::IncStatistic('CreateStream/Binary'); - - return \fopen(self::STREAM_NAME.'://'.$sHashName, 'rb'); - } - - /** - * @param string $sPath - * - * @return bool - */ - public function stream_open($sPath) - { - $this->iPos = 0; - $this->sBuffer = ''; - $this->sReadEndBuffer = ''; - $this->rStream = false; - $this->sFromEncoding = null; - $this->sToEncoding = null; - $this->sFunctionName = null; - - $bResult = false; - $aPath = parse_url($sPath); - - if (isset($aPath['host']) && isset($aPath['scheme']) && - 0 < strlen($aPath['host']) && 0 < strlen($aPath['scheme']) && - self::STREAM_NAME === $aPath['scheme']) - { - $sHashName = $aPath['host']; - if (isset(self::$aStreams[$sHashName]) && - is_array(self::$aStreams[$sHashName]) && - 4 === count(self::$aStreams[$sHashName])) - { - $this->rStream = self::$aStreams[$sHashName][0]; - $this->sFunctionName = self::$aStreams[$sHashName][1]; - $this->sFromEncoding = self::$aStreams[$sHashName][2]; - $this->sToEncoding = self::$aStreams[$sHashName][3]; - } - - $bResult = is_resource($this->rStream); - } - - return $bResult; - } - - /** - * @param int $iCount - * - * @return string - */ - public function stream_read($iCount) - { - $sReturn = ''; - $sFunctionName = $this->sFunctionName; - - if ($iCount > 0) - { - if ($iCount < strlen($this->sBuffer)) - { - $sReturn = substr($this->sBuffer, 0, $iCount); - $this->sBuffer = substr($this->sBuffer, $iCount); - } - else - { - $sReturn = $this->sBuffer; - while ($iCount > 0) - { - if (feof($this->rStream)) - { - if (0 === strlen($this->sBuffer.$sReturn)) - { - return false; - } - - if (0 < strlen($this->sReadEndBuffer)) - { - $sReturn .= self::$sFunctionName($this->sReadEndBuffer, - $this->sReadEndBuffer, $this->sFromEncoding, $this->sToEncoding); - - $iDecodeLen = strlen($sReturn); - } - - $iCount = 0; - $this->sBuffer = ''; - } - else - { - $sReadResult = fread($this->rStream, 8192); - if (false === $sReadResult) - { - return false; - } - - $sReturn .= self::$sFunctionName($this->sReadEndBuffer.$sReadResult, - $this->sReadEndBuffer, $this->sFromEncoding, $this->sToEncoding); - - $iDecodeLen = strlen($sReturn); - if ($iCount < $iDecodeLen) - { - $this->sBuffer = substr($sReturn, $iCount); - $sReturn = substr($sReturn, 0, $iCount); - $iCount = 0; - } - else - { - $iCount -= $iDecodeLen; - } - } - } - } - - $this->iPos += strlen($sReturn); - return $sReturn; - } - - return false; - } - - /** - * @return int - */ - public function stream_write() - { - return 0; - } - - /** - * @return int - */ - public function stream_tell() - { - return $this->iPos; - } - - /** - * @return bool - */ - public function stream_eof() - { - return 0 === strlen($this->sBuffer) && feof($this->rStream); - } - - /** - * - * @return array - */ - public function stream_stat() - { - return array( - 'dev' => 2, - 'ino' => 0, - 'mode' => 33206, - 'nlink' => 1, - 'uid' => 0, - 'gid' => 0, - 'rdev' => 2, - 'size' => 0, - 'atime' => 1061067181, - 'mtime' => 1056136526, - 'ctime' => 1056136526, - 'blksize' => -1, - 'blocks' => -1 - ); - } - - /** - * @return bool - */ - public function stream_seek() - { - return false; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/Literal.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/Literal.php deleted file mode 100755 index e92077ba..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/Literal.php +++ /dev/null @@ -1,194 +0,0 @@ -iPos = 0; - $this->iSize = 0; - $this->rStream = false; - - $bResult = false; - $aPath = parse_url($sPath); - - if (isset($aPath['host']) && isset($aPath['scheme']) && - 0 < strlen($aPath['host']) && 0 < strlen($aPath['scheme']) && - self::STREAM_NAME === $aPath['scheme']) - { - $sHashName = $aPath['host']; - if (isset(self::$aStreams[$sHashName]) && - is_array(self::$aStreams[$sHashName]) && - 2 === count(self::$aStreams[$sHashName])) - { - $this->rStream = self::$aStreams[$sHashName][0]; - $this->iSize = self::$aStreams[$sHashName][1]; - } - - $bResult = is_resource($this->rStream); - } - - return $bResult; - } - - /** - * @param int $iCount - * - * @return string - */ - public function stream_read($iCount) - { - $sResult = false; - if ($this->iSize < $this->iPos + $iCount) - { - $iCount = $this->iSize - $this->iPos; - } - - if ($iCount > 0) - { - $sReadResult = ''; - $iRead = $iCount; - while (0 < $iRead) - { - $sAddRead = @fread($this->rStream, $iRead); - if (false === $sAddRead) - { - $sReadResult = false; - break; - } - - $sReadResult .= $sAddRead; - $iRead -= strlen($sAddRead); - $this->iPos += strlen($sAddRead); - } - - if (false !== $sReadResult) - { - $sResult = $sReadResult; - } - } - - return $sResult; - } - - /** - * @return int - */ - public function stream_write() - { - return 0; - } - - /** - * @return int - */ - public function stream_tell() - { - return $this->iPos; - } - - /** - * @return bool - */ - public function stream_eof() - { - return $this->iPos >= $this->iSize; - } - - /** - * @return array - */ - public function stream_stat() - { - return array( - 'dev' => 2, - 'ino' => 0, - 'mode' => 33206, - 'nlink' => 1, - 'uid' => 0, - 'gid' => 0, - 'rdev' => 2, - 'size' => $this->iSize, - 'atime' => 1061067181, - 'mtime' => 1056136526, - 'ctime' => 1056136526, - 'blksize' => -1, - 'blocks' => -1 - ); - } - - /** - * @return bool - */ - public function stream_seek() - { - return false; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/SubStreams.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/SubStreams.php deleted file mode 100755 index d82929bd..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/SubStreams.php +++ /dev/null @@ -1,250 +0,0 @@ -aSubStreams[$this->iIndex])) - { - return $this->aSubStreams[$this->iIndex]; - } - - return $nNull; - } - - /** - * @param string $sPath - * - * @return bool - */ - public function stream_open($sPath) - { - $this->aSubStreams = array(); - - $bResult = false; - $aPath = \parse_url($sPath); - - if (isset($aPath['host'], $aPath['scheme']) && - 0 < \strlen($aPath['host']) && 0 < \strlen($aPath['scheme']) && - self::STREAM_NAME === $aPath['scheme']) - { - $sHashName = $aPath['host']; - if (isset(self::$aStreams[$sHashName]) && - \is_array(self::$aStreams[$sHashName]) && - 0 < \count(self::$aStreams[$sHashName])) - { - $this->iIndex = 0; - $this->iPos = 0; - $this->bIsEnd = false; - $this->sBuffer = ''; - $this->aSubStreams = self::$aStreams[$sHashName]; - } - - $bResult = 0 < \count($this->aSubStreams); - } - - return $bResult; - } - - /** - * @param int $iCount - * - * @return string - */ - public function stream_read($iCount) - { - $sReturn = ''; - $mCurrentPart = null; - if ($iCount > 0) - { - if ($iCount < \strlen($this->sBuffer)) - { - $sReturn = \substr($this->sBuffer, 0, $iCount); - $this->sBuffer = \substr($this->sBuffer, $iCount); - } - else - { - $sReturn = $this->sBuffer; - while ($iCount > 0) - { - $mCurrentPart =& $this->getPart(); - if (null === $mCurrentPart) - { - $this->bIsEnd = true; - $this->sBuffer = ''; - $iCount = 0; - break; - } - - if (\is_resource($mCurrentPart)) - { - if (!\feof($mCurrentPart)) - { - $sReadResult = @\fread($mCurrentPart, 8192); - if (false === $sReadResult) - { - return false; - } - - $sReturn .= $sReadResult; - - $iLen = \strlen($sReturn); - if ($iCount < $iLen) - { - $this->sBuffer = \substr($sReturn, $iCount); - $sReturn = \substr($sReturn, 0, $iCount); - $iCount = 0; - } - else - { - $iCount -= $iLen; - } - } - else - { - $this->iIndex++; - } - } - } - } - - $this->iPos += \strlen($sReturn); - return $sReturn; - } - - return false; - } - - /** - * @return int - */ - public function stream_write() - { - return 0; - } - - /** - * @return int - */ - public function stream_tell() - { - return $this->iPos; - } - - /** - * @return bool - */ - public function stream_eof() - { - return $this->bIsEnd; - } - - /** - * @return array - */ - public function stream_stat() - { - return array( - 'dev' => 2, - 'ino' => 0, - 'mode' => 33206, - 'nlink' => 1, - 'uid' => 0, - 'gid' => 0, - 'rdev' => 2, - 'size' => 0, - 'atime' => 1061067181, - 'mtime' => 1056136526, - 'ctime' => 1056136526, - 'blksize' => -1, - 'blocks' => -1 - ); - } - - /** - * @return bool - */ - public function stream_seek() - { - return false; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/TempFile.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/TempFile.php deleted file mode 100755 index 196b2b5f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/TempFile.php +++ /dev/null @@ -1,164 +0,0 @@ -rSream = self::$aStreams[$sHashName]; - \fseek($this->rSream, 0); - $bResult = true; - } - else - { - $this->rSream = fopen('php://memory', 'r+b'); - self::$aStreams[$sHashName] = $this->rSream; - - $bResult = true; - - \MailSo\Base\Loader::IncStatistic('CreateStream/TempFile'); - } - } - - return $bResult; - } - - /** - * @return bool - */ - public function stream_close() - { - return true; - } - - /** - * @return bool - */ - public function stream_flush() - { - return fflush($this->rSream); - } - - /** - * @param int $iLen - * - * @return string - */ - public function stream_read($iLen) - { - return fread($this->rSream, $iLen); - } - - /** - * @param string $sInputString - * - * @return int - */ - public function stream_write($sInputString) - { - return fwrite($this->rSream, $sInputString); - } - - /** - * @return int - */ - public function stream_tell() - { - return ftell($this->rSream); - } - - /** - * @return bool - */ - public function stream_eof() - { - return feof($this->rSream); - } - - /** - * @return array - */ - public function stream_stat() - { - return fstat($this->rSream); - } - - /** - * @param int $iOffset - * @param int $iWhence = SEEK_SET - * - * @return int - */ - public function stream_seek($iOffset, $iWhence = SEEK_SET) - { - return fseek($this->rSream, $iOffset, $iWhence); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/Test.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/Test.php deleted file mode 100755 index 6e8c46e4..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/StreamWrappers/Test.php +++ /dev/null @@ -1,138 +0,0 @@ -rReadSream = self::$aStreams[$sHashName]; - $bResult = true; - } - } - - return $bResult; - } - - /** - * @param int $iCount - * - * @return string - */ - public function stream_read($iCount) - { - return fread($this->rReadSream, $iCount); - } - - /** - * @param string $sInputString - * - * @return int - */ - public function stream_write($sInputString) - { - return strlen($sInputString); - } - - /** - * @return int - */ - public function stream_tell() - { - return ftell($this->rReadSream); - } - - /** - * @return bool - */ - public function stream_eof() - { - return feof($this->rReadSream); - } - - /** - * @return array - */ - public function stream_stat() - { - return fstat($this->rReadSream); - } - - /** - * @return bool - */ - public function stream_seek() - { - return false; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Utils.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Utils.php deleted file mode 100755 index 2a8b8ef6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Utils.php +++ /dev/null @@ -1,2536 +0,0 @@ - 'utf-8', - '.20127' => 'iso-8859-1', - - '.1250' => 'windows-1250', - '.cp1250' => 'windows-1250', - '.cp-1250' => 'windows-1250', - '.1251' => 'windows-1251', - '.cp1251' => 'windows-1251', - '.cp-1251' => 'windows-1251', - '.1252' => 'windows-1252', - '.cp1252' => 'windows-1252', - '.cp-1252' => 'windows-1252', - '.1253' => 'windows-1253', - '.cp1253' => 'windows-1253', - '.cp-1253' => 'windows-1253', - '.1254' => 'windows-1254', - '.cp1254' => 'windows-1254', - '.cp-1254' => 'windows-1254', - '.1255' => 'windows-1255', - '.cp1255' => 'windows-1255', - '.cp-1255' => 'windows-1255', - '.1256' => 'windows-1256', - '.cp1256' => 'windows-1256', - '.cp-1256' => 'windows-1256', - '.1257' => 'windows-1257', - '.cp1257' => 'windows-1257', - '.cp-1257' => 'windows-1257', - '.1258' => 'windows-1258', - '.cp1258' => 'windows-1258', - '.cp-1258' => 'windows-1258', - - '.28591' => 'iso-8859-1', - '.28592' => 'iso-8859-2', - '.28593' => 'iso-8859-3', - '.28594' => 'iso-8859-4', - '.28595' => 'iso-8859-5', - '.28596' => 'iso-8859-6', - '.28597' => 'iso-8859-7', - '.28598' => 'iso-8859-8', - '.28599' => 'iso-8859-9', - '.28603' => 'iso-8859-13', - '.28605' => 'iso-8859-15', - - '.1125' => 'cp1125', - '.20866' => 'koi8-r', - '.21866' => 'koi8-u', - '.950' => 'big5', - '.936' => 'euc-cn', - '.20932' => 'euc-js', - '.949' => 'euc-kr', - ); - - /** - * @access private - */ - private function __construct() - { - } - - /** - * @return string - */ - public static function DetectSystemCharset() - { - $sResult = ''; - $sLocale = @\setlocale(LC_ALL, ''); - $sLocaleLower = \strtolower(\trim($sLocale)); - - foreach (\MailSo\Base\Utils::$aLocaleMapping as $sKey => $sValue) - { - if (false !== \strpos($sLocaleLower, $sKey) || - false !== \strpos($sLocaleLower, '.'.$sValue)) - { - $sResult = $sValue; - break; - } - } - - return $sResult; - } - - /** - * @return string - */ - public static function ConvertSystemString($sSrt) - { - $sSrt = \trim($sSrt); - if (!empty($sSrt) && !\MailSo\Base\Utils::IsUtf8($sSrt)) - { - $sCharset = \MailSo\Base\Utils::DetectSystemCharset(); - if (!empty($sCharset)) - { - $sSrt = \MailSo\Base\Utils::ConvertEncoding( - $sSrt, $sCharset, \MailSo\Base\Enumerations\Charset::UTF_8); - } - else - { - $sSrt = @\utf8_encode($sSrt); - } - } - - return $sSrt; - } - - /** - * @param string $sEncoding - * @param bool $bAsciAsUtf8 = false - * - * @return string - */ - public static function NormalizeCharset($sEncoding, $bAsciAsUtf8 = false) - { - $sEncoding = \strtolower($sEncoding); - - $sEncoding = \preg_replace('/^iso8/', 'iso-8', $sEncoding); - $sEncoding = \preg_replace('/^cp-([\d])/', 'cp$1', $sEncoding); - $sEncoding = \preg_replace('/^windows?12/', 'windows-12', $sEncoding); - - switch ($sEncoding) - { - case 'asci': - case 'ascii': - case 'us-asci': - case 'us-ascii': - $sEncoding = $bAsciAsUtf8 ? \MailSo\Base\Enumerations\Charset::UTF_8 : - \MailSo\Base\Enumerations\Charset::ISO_8859_1; - break; - case 'unicode-1-1-utf-7': - case 'unicode-1-utf-7': - case 'unicode-utf-7': - $sEncoding = \MailSo\Base\Enumerations\Charset::UTF_7; - break; - case 'utf8': - case 'utf-8': - $sEncoding = \MailSo\Base\Enumerations\Charset::UTF_8; - break; - case 'utf7imap': - case 'utf-7imap': - case 'utf7-imap': - case 'utf-7-imap': - $sEncoding = \MailSo\Base\Enumerations\Charset::UTF_7_IMAP; - break; - case 'ks-c-5601-1987': - case 'ks_c_5601-1987': - case 'ks_c_5601_1987': - $sEncoding = 'euc-kr'; - break; - case 'x-gbk': - $sEncoding = 'gb2312'; - break; - case 'iso-8859-i': - case 'iso-8859-8-i': - $sEncoding = \MailSo\Base\Enumerations\Charset::ISO_8859_8; - break; - } - - return $sEncoding; - } - - /** - * @param string $sCharset - * @param string $sValue - * - * @return string - */ - public static function NormalizeCharsetByValue($sCharset, $sValue) - { - $sCharset = \MailSo\Base\Utils::NormalizeCharset($sCharset); - - if (\MailSo\Base\Enumerations\Charset::UTF_8 !== $sCharset && - \MailSo\Base\Utils::IsUtf8($sValue) && - false === \strpos($sCharset, \MailSo\Base\Enumerations\Charset::ISO_2022_JP) - ) - { - $sCharset = \MailSo\Base\Enumerations\Charset::UTF_8; - } - - return $sCharset; - } - - /** - * @param string $sFilePath - * @param function $fFileExistsCallback = null - * - * @return string - */ - public static function SmartFileExists($sFilePath, $fFileExistsCallback = null) - { - $sFilePath = \str_replace('\\', '/', \trim($sFilePath)); - if (!$fFileExistsCallback) - { - $fFileExistsCallback = function ($sPath) { - return \file_exists($sPath); - }; - } - - if (!\call_user_func($fFileExistsCallback, $sFilePath)) - { - return $sFilePath; - } - - $aFileInfo = \pathinfo($sFilePath); - - $iIndex = 0; - - do - { - $iIndex++; - - $sFilePathNew = $aFileInfo['dirname'].'/'. - \preg_replace('/\(\d{1,2}\)$/', '', $aFileInfo['filename']). - ' ('.$iIndex.')'. - (empty($aFileInfo['extension']) ? '' : '.'.$aFileInfo['extension']) - ; - - if (!\call_user_func($fFileExistsCallback, $sFilePathNew)) - { - $sFilePath = $sFilePathNew; - break; - } - else if (10 < $iIndex) - { - break; - } - } - while (true); - - return $sFilePath; - } - - /** - * @return bool - */ - public static function IsMbStringSupported() - { - return \MailSo\Config::$MBSTRING && - \MailSo\Base\Utils::FunctionExistsAndEnabled('mb_convert_encoding'); - } - - /** - * @return bool - */ - public static function IsIconvSupported() - { - return \MailSo\Config::$ICONV && - \MailSo\Base\Utils::FunctionExistsAndEnabled('iconv'); - } - - /** - * @return bool - */ - public static function IsIconvIgnoreSupported() - { - static $bCache = null; - if (null !== $bCache) - { - return $bCache; - } - - $bCache = false; - if (\MailSo\Base\Utils::IsIconvSupported()) - { - if (false !== @\iconv('', '//IGNORE', '')) - { - $bCache = true; - } - } - - return $bCache; - } - - /** - * @return bool - */ - public static function IsIconvTranslitSupported() - { - static $bCache = null; - if (null !== $bCache) - { - return $bCache; - } - - $bCache = false; - if (\MailSo\Base\Utils::IsIconvSupported()) - { - if (false !== @\iconv('', '//TRANSLIT', '')) - { - $bCache = true; - } - } - - return $bCache; - } - - /** - * @param string $sCharset - * - * @return bool - */ - public static function ValidateCharsetName($sCharset) - { - $sCharset = \strtolower(\MailSo\Base\Utils::NormalizeCharset($sCharset)); - return 0 < \strlen($sCharset) && (\in_array($sCharset, array(\MailSo\Base\Enumerations\Charset::UTF_7_IMAP)) || - \in_array($sCharset, \MailSo\Base\Utils::$SuppostedCharsets)); - } - - /** - * @param string $sInputString - * @param string $sInputFromEncoding - * @param string $sInputToEncoding - * - * @return string|bool - */ - public static function IconvConvertEncoding($sInputString, $sInputFromEncoding, $sInputToEncoding) - { - $sIconvOptions = ''; - if (\MailSo\Base\Utils::IsIconvIgnoreSupported()) - { - $sIconvOptions .= '//IGNORE'; - } -// if (\MailSo\Base\Utils::IsIconvTranslitSupported()) -// { -// $sIconvOptions .= '//TRANSLIT'; -// } - - $mResult = @\iconv(\strtoupper($sInputFromEncoding), \strtoupper($sInputToEncoding).$sIconvOptions, $sInputString); - if (false === $mResult) - { - if (\MailSo\Log\Logger::IsSystemEnabled()) - { - \MailSo\Log\Logger::SystemLog(array( - 'inc' => \strtoupper($sInputFromEncoding), - 'out' => \strtoupper($sInputToEncoding).$sIconvOptions, - 'val' => 500 < \strlen($sInputString) ? \substr($sInputString, 0, 500) : $sInputString, - 'hex' => 500 < \strlen($sInputString) ? '-- to long --' : \bin2hex($sInputString) - ), \MailSo\Log\Enumerations\Type::NOTICE); - } - - if (\MailSo\Config::$FixIconvByMbstring && \MailSo\Base\Utils::IsMbStringSupported()) - { - $mResult = \MailSo\Base\Utils::MbConvertEncoding($sInputString, $sInputFromEncoding, $sInputToEncoding); - } - } - return $mResult; - } - - /** - * @param string $sInputString - * @param string $sInputFromEncoding - * @param string $sInputToEncoding - * - * @return string|bool - */ - public static function MbConvertEncoding($sInputString, $sInputFromEncoding, $sInputToEncoding) - { - static $sMbstringSubCh = null; - if (null === $sMbstringSubCh) - { - $sMbstringSubCh = \mb_substitute_character(); - } - - \mb_substitute_character('none'); - $sResult = @\mb_convert_encoding($sInputString, \strtoupper($sInputToEncoding), \strtoupper($sInputFromEncoding)); - \mb_substitute_character($sMbstringSubCh); - - return $sResult; - } - - /** - * @param string $sInputString - * @param string $sInputFromEncoding - * @param string $sInputToEncoding - * - * @return string - */ - public static function ConvertEncoding($sInputString, $sInputFromEncoding, $sInputToEncoding) - { - $sResult = $sInputString; - - $sFromEncoding = \MailSo\Base\Utils::NormalizeCharset($sInputFromEncoding); - $sToEncoding = \MailSo\Base\Utils::NormalizeCharset($sInputToEncoding); - - if ('' === \trim($sResult) || ($sFromEncoding === $sToEncoding && \MailSo\Base\Enumerations\Charset::UTF_8 !== $sFromEncoding)) - { - return $sResult; - } - - $bUnknown = false; - switch (true) - { - default: - $bUnknown = true; - break; - - case ($sFromEncoding === \MailSo\Base\Enumerations\Charset::ISO_8859_1 && - $sToEncoding === \MailSo\Base\Enumerations\Charset::UTF_8 && - \function_exists('utf8_encode')): - - $sResult = \utf8_encode($sResult); - break; - - case ($sFromEncoding === \MailSo\Base\Enumerations\Charset::UTF_8 && - $sToEncoding === \MailSo\Base\Enumerations\Charset::ISO_8859_1 && - \function_exists('utf8_decode')): - - $sResult = \utf8_decode($sResult); - break; - - case ($sFromEncoding === \MailSo\Base\Enumerations\Charset::UTF_7_IMAP && - $sToEncoding === \MailSo\Base\Enumerations\Charset::UTF_8): - - $sResult = \MailSo\Base\Utils::Utf7ModifiedToUtf8($sResult); - if (false === $sResult) - { - $sResult = $sInputString; - } - break; - - case ($sFromEncoding === \MailSo\Base\Enumerations\Charset::UTF_8 && - $sToEncoding === \MailSo\Base\Enumerations\Charset::UTF_7_IMAP): - - $sResult = \MailSo\Base\Utils::Utf8ToUtf7Modified($sResult); - if (false === $sResult) - { - $sResult = $sInputString; - } - break; - - case ($sFromEncoding === \MailSo\Base\Enumerations\Charset::UTF_7_IMAP): - - $sResult = \MailSo\Base\Utils::ConvertEncoding( - \MailSo\Base\Utils::ModifiedToPlainUtf7($sResult), - \MailSo\Base\Enumerations\Charset::UTF_7, - $sToEncoding - ); - break; - - case (\in_array(\strtolower($sFromEncoding), \MailSo\Base\Utils::$SuppostedCharsets)): - - if (\MailSo\Base\Utils::IsIconvSupported()) - { - $sResult = \MailSo\Base\Utils::IconvConvertEncoding($sResult, $sFromEncoding, $sToEncoding); - } - else if (\MailSo\Base\Utils::IsMbStringSupported()) - { - $sResult = \MailSo\Base\Utils::MbConvertEncoding($sResult, $sFromEncoding, $sToEncoding); - } - - $sResult = (false !== $sResult) ? $sResult : $sInputString; - break; - } - - if ($bUnknown && \MailSo\Base\Utils::IsMbStringSupported()) - { - $sResult = @\mb_convert_encoding($sResult, $sToEncoding); - } - - return $sResult; - } - - /** - * @param string $sValue - * - * @return bool - */ - public static function IsAscii($sValue) - { - if ('' === \trim($sValue)) - { - return true; - } - - return !\preg_match('/[^\x09\x10\x13\x0A\x0D\x20-\x7E]/', $sValue); - } - - /** - * @param string $sValue - * - * @return string - */ - public static function StrToLowerIfAscii($sValue) - { - return \MailSo\Base\Utils::IsAscii($sValue) ? \strtolower($sValue) : $sValue; - } - - /** - * @param string $sValue - * - * @return string - */ - public static function StrToUpperIfAscii($sValue) - { - return \MailSo\Base\Utils::IsAscii($sValue) ? \strtoupper($sValue) : $sValue; - } - - /** - * @param string $sValue - * - * @return string - */ - public static function StrMailDomainToLowerIfAscii($sValue) - { - $aParts = \explode('@', $sValue, 2); - if (!empty($aParts[1])) - { - $aParts[1] = \MailSo\Base\Utils::IsAscii($aParts[1]) ? \strtolower($aParts[1]) : $aParts[1]; - } - - return \implode('@', $aParts); - } - - /** - * @param string $sValue - * - * @return string - */ - public static function StripSpaces($sValue) - { - return \MailSo\Base\Utils::Trim( - \preg_replace('/[\s]+/u', ' ', $sValue)); - } - - /** - * @param string $sValue - * - * @return bool - */ - public static function IsUtf8($sValue) - { - return (bool) (\function_exists('mb_check_encoding') ? - \mb_check_encoding($sValue, 'UTF-8') : \preg_match('//u', $sValue)); - } - - /** - * @param int $iSize - * @param int $iRound - * - * @return string - */ - public static function FormatFileSize($iSize, $iRound = 0) - { - $aSizes = array('B', 'KB', 'MB'); - for ($iIndex = 0; $iSize > 1024 && isset($aSizes[$iIndex + 1]); $iIndex++) - { - $iSize /= 1024; - } - return \round($iSize, $iRound).$aSizes[$iIndex]; - } - - /** - * @param string $sEncodedValue - * @param string $sEncodeingType - * - * @return string - */ - public static function DecodeEncodingValue($sEncodedValue, $sEncodeingType) - { - $sResult = $sEncodedValue; - switch (\strtolower($sEncodeingType)) - { - case 'q': - case 'quoted_printable': - case 'quoted-printable': - $sResult = \quoted_printable_decode($sResult); - break; - case 'b': - case 'base64': - $sResult = \MailSo\Base\Utils::Base64Decode($sResult); - break; - } - return $sResult; - } - - /** - * @param string $sInputValue - * - * @return string - */ - public static function DecodeFlowedFormat($sInputValue) - { - return \preg_replace('/ ([\r]?[\n])/m', ' ', $sInputValue); - } - - /** - * @param string $sEncodedValue - * @param string $sIncomingCharset = '' - * @param string $sForcedIncomingCharset = '' - * - * @return string - */ - public static function DecodeHeaderValue($sEncodedValue, $sIncomingCharset = '', $sForcedIncomingCharset = '') - { - $sValue = $sEncodedValue; - if (0 < \strlen($sIncomingCharset)) - { - $sIncomingCharset = \MailSo\Base\Utils::NormalizeCharsetByValue($sIncomingCharset, $sValue); - - $sValue = \MailSo\Base\Utils::ConvertEncoding($sValue, $sIncomingCharset, - \MailSo\Base\Enumerations\Charset::UTF_8); - } - - $sValue = \preg_replace('/\?=[\n\r\t\s]{1,5}=\?/m', '?==?', $sValue); - $sValue = \preg_replace('/[\r\n\t]+/m', ' ', $sValue); - - $aEncodeArray = array(''); - $aMatch = array(); -// \preg_match_all('/=\?[^\?]+\?[q|b|Q|B]\?[^\?]*?\?=/', $sValue, $aMatch); - \preg_match_all('/=\?[^\?]+\?[q|b|Q|B]\?.*?\?=/', $sValue, $aMatch); - - if (isset($aMatch[0]) && \is_array($aMatch[0])) - { - for ($iIndex = 0, $iLen = \count($aMatch[0]); $iIndex < $iLen; $iIndex++) - { - if (isset($aMatch[0][$iIndex])) - { - $iPos = @\strpos($aMatch[0][$iIndex], '*'); - if (false !== $iPos) - { - $aMatch[0][$iIndex][0] = \substr($aMatch[0][$iIndex][0], 0, $iPos); - } - } - } - - $aEncodeArray = $aMatch[0]; - } - - $aParts = array(); - - $sMainCharset = ''; - $bOneCharset = true; - - for ($iIndex = 0, $iLen = \count($aEncodeArray); $iIndex < $iLen; $iIndex++) - { - $aTempArr = array('', $aEncodeArray[$iIndex]); - if ('=?' === \substr(\trim($aTempArr[1]), 0, 2)) - { - $iPos = \strpos($aTempArr[1], '?', 2); - $aTempArr[0] = \substr($aTempArr[1], 2, $iPos - 2); - $sEncType = \strtoupper($aTempArr[1]{$iPos + 1}); - switch ($sEncType) - { - case 'Q': - $sHeaderValuePart = \str_replace('_', ' ', $aTempArr[1]); - $aTempArr[1] = \quoted_printable_decode(\substr( - $sHeaderValuePart, $iPos + 3, \strlen($sHeaderValuePart) - $iPos - 5)); - break; - case 'B': - $sHeaderValuePart = $aTempArr[1]; - $aTempArr[1] = \MailSo\Base\Utils::Base64Decode(\substr( - $sHeaderValuePart, $iPos + 3, \strlen($sHeaderValuePart) - $iPos - 5)); - break; - } - } - - if (0 < \strlen($aTempArr[0])) - { - $sCharset = 0 === \strlen($sForcedIncomingCharset) ? $aTempArr[0] : $sForcedIncomingCharset; - $sCharset = \MailSo\Base\Utils::NormalizeCharset($sCharset, true); - - if ('' === $sMainCharset) - { - $sMainCharset = $sCharset; - } - else if ($sMainCharset !== $sCharset) - { - $bOneCharset = false; - } - } - - $aParts[] = array( - $aEncodeArray[$iIndex], - $aTempArr[1], - $sCharset - ); - - unset($aTempArr); - } - - for ($iIndex = 0, $iLen = \count($aParts); $iIndex < $iLen; $iIndex++) - { - if ($bOneCharset) - { - $sValue = \str_replace($aParts[$iIndex][0], $aParts[$iIndex][1], $sValue); - } - else - { - $aParts[$iIndex][2] = \MailSo\Base\Utils::NormalizeCharsetByValue($aParts[$iIndex][2], $aParts[$iIndex][1]); - - $sValue = \str_replace($aParts[$iIndex][0], - \MailSo\Base\Utils::ConvertEncoding($aParts[$iIndex][1], $aParts[$iIndex][2], \MailSo\Base\Enumerations\Charset::UTF_8), - $sValue); - } - } - - if ($bOneCharset && 0 < \strlen($sMainCharset)) - { - $sMainCharset = \MailSo\Base\Utils::NormalizeCharsetByValue($sMainCharset, $sValue); - $sValue = \MailSo\Base\Utils::ConvertEncoding($sValue, $sMainCharset, \MailSo\Base\Enumerations\Charset::UTF_8); - } - - return $sValue; - } - - /** - * @param string $sIncHeaders - * @param string $aHeadersToRemove = array() - * - * @return string - */ - public static function RemoveHeaderFromHeaders($sIncHeaders, $aHeadersToRemove = array()) - { - $sResultHeaders = $sIncHeaders; - - if (\is_array($aHeadersToRemove) && 0 < \count($aHeadersToRemove)) - { - $aHeadersToRemove = \array_map('strtolower', $aHeadersToRemove); - - $sIncHeaders = \preg_replace('/[\r\n]+/', "\n", $sIncHeaders); - $aHeaders = \explode("\n", $sIncHeaders); - - $bSkip = false; - $aResult = array(); - - foreach ($aHeaders as $sLine) - { - if (0 < \strlen($sLine)) - { - $sFirst = \substr($sLine,0,1); - if (' ' === $sFirst || "\t" === $sFirst) - { - if (!$bSkip) - { - $aResult[] = $sLine; - } - } - else - { - $bSkip = false; - $aParts = \explode(':', $sLine, 2); - - if (!empty($aParts) && !empty($aParts[0])) - { - if (\in_array(\strtolower(\trim($aParts[0])), $aHeadersToRemove)) - { - $bSkip = true; - } - else - { - $aResult[] = $sLine; - } - } - } - } - } - - $sResultHeaders = \implode("\r\n", $aResult); - } - - return $sResultHeaders; - } - - /** - * @param string $sEncodeType - * @param string $sValue - * - * @return string - */ - public static function EncodeUnencodedValue($sEncodeType, $sValue) - { - $sValue = \trim($sValue); - if (0 < \strlen($sValue) && !\MailSo\Base\Utils::IsAscii($sValue)) - { - switch (\strtoupper($sEncodeType)) - { - case 'B': - $sValue = '=?'.\strtolower(\MailSo\Base\Enumerations\Charset::UTF_8). - '?B?'.\base64_encode($sValue).'?='; - break; - - case 'Q': - $sValue = '=?'.\strtolower(\MailSo\Base\Enumerations\Charset::UTF_8). - '?Q?'.\str_replace(array('?', ' ', '_'), array('=3F', '_', '=5F'), - \quoted_printable_encode($sValue)).'?='; - break; - } - } - - return $sValue; - } - - /** - * @unused - * - * @param string $sEncodeType - * @param string $sEncodeCharset - * @param string $sValue - * - * @return string - */ - public static function EncodeHeaderValue($sEncodeType, $sEncodeCharset, $sValue) - { - $sValue = \trim($sValue); - if (0 < \strlen($sValue) && !\MailSo\Base\Utils::IsAscii($sValue)) - { - switch (\strtoupper($sEncodeType)) - { - case 'B': - $sValue = '=?'.\strtolower($sEncodeCharset).'?B?'.\base64_encode($sValue).'?='; - break; - - case 'Q': - $sValue = '=?'.\strtolower($sEncodeCharset).'?Q?'.\str_replace( - array('?', ' ', '_'), array('=3F', '_', '=5F'), - \quoted_printable_encode($sValue)).'?='; - break; - } - } - - return \trim($sValue); - } - - /** - * @param string $sAttrName - * @param string $sValue = 'utf-8' - * @param string $sCharset = '' - * @param string $sLang = '' - * @param int $iLen = 78 - * - * @return string|bool - */ - public static function AttributeRfc2231Encode($sAttrName, $sValue, $sCharset = 'utf-8', $sLang = '', $iLen = 1000) - { - $sValue = \strtoupper($sCharset).'\''.$sLang.'\''. - \preg_replace_callback('/[\x00-\x20*\'%()<>@,;:\\\\"\/[\]?=\x80-\xFF]/', function ($match) { - return \rawurlencode($match[0]); - }, $sValue); - - $iNlen = \strlen($sAttrName); - $iVlen = \strlen($sValue); - - if (\strlen($sAttrName) + $iVlen > $iLen - 3) - { - $sections = array(); - $section = 0; - - for ($i = 0, $j = 0; $i < $iVlen; $i += $j) - { - $j = $iLen - $iNlen - \strlen($section) - 4; - $sections[$section++] = \substr($sValue, $i, $j); - } - - for ($i = 0, $n = $section; $i < $n; $i++) - { - $sections[$i] = ' '.$sAttrName.'*'.$i.'*='.$sections[$i]; - } - - return \implode(";\r\n", $sections); - } - else - { - return $sAttrName.'*='.$sValue; - } - } - /** - * @param string $sAttrName - * @param string $sValue - * - * @return string - */ - public static function EncodeHeaderUtf8AttributeValue($sAttrName, $sValue) - { - $sAttrName = \trim($sAttrName); - $sValue = \trim($sValue); - - if (0 < \strlen($sValue) && !\MailSo\Base\Utils::IsAscii($sValue)) - { - if (!empty($_SERVER['HTTP_USER_AGENT']) && 0 < \strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE')) - { - $sValue = $sAttrName.'="'.\preg_replace('/[+\s]+/', '%20', \urlencode($sValue)).'"'; - } - else - { - $sValue = \MailSo\Base\Utils::AttributeRfc2231Encode($sAttrName, $sValue); - } - } - else - { - $sValue = $sAttrName.'="'.\str_replace('"', '\\"', $sValue).'"'; - } - - return \trim($sValue); - } - - /** - * @param string $sEmail - * - * @return string - */ - public static function GetAccountNameFromEmail($sEmail) - { - $sResult = ''; - if (0 < \strlen($sEmail)) - { - $iPos = \strrpos($sEmail, '@'); - $sResult = (false === $iPos) ? $sEmail : \substr($sEmail, 0, $iPos); - } - - return $sResult; - } - - /** - * @param string $sEmail - * - * @return string - */ - public static function GetDomainFromEmail($sEmail) - { - $sResult = ''; - if (0 < \strlen($sEmail)) - { - $iPos = \strrpos($sEmail, '@'); - if (false !== $iPos && 0 < $iPos) - { - $sResult = \substr($sEmail, $iPos + 1); - } - } - - return $sResult; - } - - /** - * @param string $sDomain - * - * @return string - */ - public static function GetClearDomainName($sDomain) - { - $sResultDomain = \preg_replace( - '/^(webmail|email|mail|www|imap4|pop3|imap|pop|demo|client|ssl|secure|test|cloud|box|m)\./i', - '', $sDomain); - - return false === \strpos($sResultDomain, '.') ? $sDomain : $sResultDomain; - } - - /** - * @param string $sFileName - * - * @return string - */ - public static function GetFileExtension($sFileName) - { - $iLast = \strrpos($sFileName, '.'); - return false === $iLast ? '' : \strtolower(\substr($sFileName, $iLast + 1)); - } - - /** - * @param string $sFileName - * - * @return string - */ - public static function MimeContentType($sFileName) - { - $sResult = 'application/octet-stream'; - $sFileName = \trim(\strtolower($sFileName)); - - if ('winmail.dat' === $sFileName) - { - return 'application/ms-tnef'; - } - - $aMimeTypes = array( - - 'eml' => 'message/rfc822', - 'mime' => 'message/rfc822', - 'txt' => 'text/plain', - 'text' => 'text/plain', - 'def' => 'text/plain', - 'list' => 'text/plain', - 'in' => 'text/plain', - 'ini' => 'text/plain', - 'log' => 'text/plain', - 'sql' => 'text/plain', - 'cfg' => 'text/plain', - 'conf' => 'text/plain', - 'asc' => 'text/plain', - 'rtx' => 'text/richtext', - 'vcard' => 'text/vcard', - 'vcf' => 'text/vcard', - 'htm' => 'text/html', - 'html' => 'text/html', - 'csv' => 'text/csv', - 'ics' => 'text/calendar', - 'ifb' => 'text/calendar', - 'xml' => 'text/xml', - 'json' => 'application/json', - 'swf' => 'application/x-shockwave-flash', - 'hlp' => 'application/winhlp', - 'wgt' => 'application/widget', - 'chm' => 'application/vnd.ms-htmlhelp', - 'p10' => 'application/pkcs10', - 'p7c' => 'application/pkcs7-mime', - 'p7m' => 'application/pkcs7-mime', - 'p7s' => 'application/pkcs7-signature', - 'torrent' => 'application/x-bittorrent', - - // scripts - 'js' => 'application/javascript', - 'pl' => 'text/perl', - 'css' => 'text/css', - 'asp' => 'text/asp', - 'php' => 'application/x-httpd-php', - 'php3' => 'application/x-httpd-php', - 'php4' => 'application/x-httpd-php', - 'php5' => 'application/x-httpd-php', - 'phtml' => 'application/x-httpd-php', - - // images - 'png' => 'image/png', - 'jpg' => 'image/jpeg', - 'jpeg' => 'image/jpeg', - 'jpe' => 'image/jpeg', - 'jfif' => 'image/jpeg', - 'gif' => 'image/gif', - 'bmp' => 'image/bmp', - 'cgm' => 'image/cgm', - 'ief' => 'image/ief', - 'ico' => 'image/x-icon', - 'tif' => 'image/tiff', - 'tiff' => 'image/tiff', - 'svg' => 'image/svg+xml', - 'svgz' => 'image/svg+xml', - 'djv' => 'image/vnd.djvu', - 'djvu' => 'image/vnd.djvu', - 'webp' => 'image/webp', - - // archives - 'zip' => 'application/zip', - '7z' => 'application/x-7z-compressed', - 'rar' => 'application/x-rar-compressed', - 'exe' => 'application/x-msdownload', - 'dll' => 'application/x-msdownload', - 'scr' => 'application/x-msdownload', - 'com' => 'application/x-msdownload', - 'bat' => 'application/x-msdownload', - 'msi' => 'application/x-msdownload', - 'cab' => 'application/vnd.ms-cab-compressed', - 'gz' => 'application/x-gzip', - 'tgz' => 'application/x-gzip', - 'bz' => 'application/x-bzip', - 'bz2' => 'application/x-bzip2', - 'deb' => 'application/x-debian-package', - - // fonts - 'psf' => 'application/x-font-linux-psf', - 'otf' => 'application/x-font-otf', - 'pcf' => 'application/x-font-pcf', - 'snf' => 'application/x-font-snf', - 'ttf' => 'application/x-font-ttf', - 'ttc' => 'application/x-font-ttf', - - // audio - 'mp3' => 'audio/mpeg', - 'amr' => 'audio/amr', - 'aac' => 'audio/x-aac', - 'aif' => 'audio/x-aiff', - 'aifc' => 'audio/x-aiff', - 'aiff' => 'audio/x-aiff', - 'wav' => 'audio/x-wav', - 'wma' => 'audio/x-ms-wma', - 'wax' => 'audio/x-ms-wax', - 'midi' => 'audio/midi', - 'mp4a' => 'audio/mp4', - 'ogg' => 'audio/ogg', - 'weba' => 'audio/webm', - 'ra' => 'audio/x-pn-realaudio', - 'ram' => 'audio/x-pn-realaudio', - 'rmp' => 'audio/x-pn-realaudio-plugin', - 'm3u' => 'audio/x-mpegurl', - - // video - 'flv' => 'video/x-flv', - 'qt' => 'video/quicktime', - 'mov' => 'video/quicktime', - 'avi' => 'video/x-msvideo', - 'mpg' => 'video/mpeg', - 'mpeg' => 'video/mpeg', - 'mpe' => 'video/mpeg', - 'm1v' => 'video/mpeg', - 'm2v' => 'video/mpeg', - '3gp' => 'video/3gpp', - '3g2' => 'video/3gpp2', - 'h261' => 'video/h261', - 'h263' => 'video/h263', - 'h264' => 'video/h264', - 'jpgv' => 'video/jpgv', - 'mp4' => 'video/mp4', - 'mp4v' => 'video/mp4', - 'mpg4' => 'video/mp4', - 'ogv' => 'video/ogg', - 'webm' => 'video/webm', - 'm4v' => 'video/x-m4v', - 'asf' => 'video/x-ms-asf', - 'asx' => 'video/x-ms-asf', - 'wm' => 'video/x-ms-wm', - 'wmv' => 'video/x-ms-wmv', - 'wmx' => 'video/x-ms-wmx', - 'wvx' => 'video/x-ms-wvx', - 'movie' => 'video/x-sgi-movie', - - // adobe - 'pdf' => 'application/pdf', - 'psd' => 'image/vnd.adobe.photoshop', - 'ai' => 'application/postscript', - 'eps' => 'application/postscript', - 'ps' => 'application/postscript', - - // ms office - 'doc' => 'application/msword', - 'dot' => 'application/msword', - 'rtf' => 'application/rtf', - 'xls' => 'application/vnd.ms-excel', - 'ppt' => 'application/vnd.ms-powerpoint', - 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', - 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - - // open office - 'odt' => 'application/vnd.oasis.opendocument.text', - 'ods' => 'application/vnd.oasis.opendocument.spreadsheet' - - ); - - $sExt = \MailSo\Base\Utils::GetFileExtension($sFileName); - if (0 < \strlen($sExt) && isset($aMimeTypes[$sExt])) - { - $sResult = $aMimeTypes[$sExt]; - } - - return $sResult; - } - - /** - * @param string $sContentType - * @param string $sFileName - * - * @return string - */ - public static function ContentTypeType($sContentType, $sFileName) - { - $sResult = ''; - $sContentType = \strtolower($sContentType); - if (0 === \strpos($sContentType, 'image/')) - { - $sResult = 'image'; - } - else - { - switch ($sContentType) - { - case 'application/zip': - case 'application/x-7z-compressed': - case 'application/x-rar-compressed': - case 'application/x-msdownload': - case 'application/vnd.ms-cab-compressed': - case 'application/x-gzip': - case 'application/x-bzip': - case 'application/x-bzip2': - case 'application/x-debian-package': - $sResult = 'archive'; - break; - case 'application/msword': - case 'application/rtf': - case 'application/vnd.ms-excel': - case 'application/vnd.ms-powerpoint': - case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': - case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': - case 'application/vnd.openxmlformats-officedocument.wordprocessingml.template': - case 'application/vnd.openxmlformats-officedocument.presentationml.presentation': - case 'application/vnd.oasis.opendocument.text': - case 'application/vnd.oasis.opendocument.spreadsheet': - $sResult = 'doc'; - break; - case 'application/pdf': - case 'application/x-pdf': - $sResult = 'pdf'; - break; - } - - if ('' === $sResult) - { - switch (\strtolower(\MailSo\Base\Utils::GetFileExtension($sFileName))) - { - case 'zip': - case '7z': - case 'rar': - $sResult = 'archive'; - break; - } - } - } - - return $sResult; - } - - /** - * @staticvar bool $bValidateAction - * - * @param int $iTimeToReset = 15 - * @param int $iTimeToAdd = 120 - * - * @return bool - */ - public static function ResetTimeLimit($iTimeToReset = 15, $iTimeToAdd = 120) - { - $iTime = \time(); - if ($iTime < \MailSo\Base\Loader::$InitTime + 5) - { - // do nothing first 5s - return true; - } - - static $bValidateAction = null; - static $iResetTimer = null; - - if (null === $bValidateAction) - { - $iResetTimer = 0; - - $sSafeMode = \strtolower(\trim(@\ini_get('safe_mode'))); - $bSafeMode = 'on' === $sSafeMode || '1' === $sSafeMode || 'true' === $sSafeMode; - - $bValidateAction = !$bSafeMode && \MailSo\Base\Utils::FunctionExistsAndEnabled('set_time_limit'); - } - - if ($bValidateAction && $iTimeToReset < $iTime - $iResetTimer) - { - $iResetTimer = $iTime; - if (!@\set_time_limit($iTimeToAdd)) - { - $bValidateAction = false; - return false; - } - - return true; - } - - return false; - } - - /** - * @param string $sText - * - * @return string - */ - public static function InlineRebuildStringToJsString($sText) - { - static $aJsonReplaces = array( - array('\\', "\n", "\t", "\r", '\b', "\f", '"'), - array('\\\\', '\\n', '\\t', '\\r', '\\b', '\\f', '\"') - ); - - return \str_replace('', '<\/script>', - \str_replace($aJsonReplaces[0], $aJsonReplaces[1], $sText)); - } - - /** - * @param array $aInput - */ - public static function ClearArrayUtf8Values(&$aInput) - { - if (\is_array($aInput)) - { - foreach ($aInput as $mKey => $mItem) - { - if (\is_string($mItem)) - { - $aInput[$mKey] = \MailSo\Base\Utils::Utf8Clear($mItem); - } - else if (\is_array($mItem)) - { - \MailSo\Base\Utils::ClearArrayUtf8Values($mItem); - $aInput[$mKey] = $mItem; - } - } - } - } - - /** - * @param mixed $mInput - * @param \MailSo\Log\Logger|null $oLogger = null - * - * @return string - */ - public static function Php2js($mInput, $oLogger = null) - { - static $iOpt = null; - if (null === $iOpt) - { - $iOpt = \defined('JSON_UNESCAPED_UNICODE') ? JSON_UNESCAPED_UNICODE : 0; - } - - $sResult = @\json_encode($mInput, $iOpt); - if (!\is_string($sResult) || '' === $sResult) - { - if (!$oLogger && \MailSo\Log\Logger::IsSystemEnabled()) - { - $oLogger = \MailSo\Config::$SystemLogger; - } - - if (!($oLogger instanceof \MailSo\Log\Logger)) - { - $oLogger = null; - } - - if ($oLogger) - { - $oLogger->Write('json_encode: '.\trim( - (\MailSo\Base\Utils::FunctionExistsAndEnabled('json_last_error') ? ' [Error Code: '.\json_last_error().']' : ''). - (\MailSo\Base\Utils::FunctionExistsAndEnabled('json_last_error_msg') ? ' [Error Message: '.\json_last_error_msg().']' : '') - ), \MailSo\Log\Enumerations\Type::WARNING, 'JSON' - ); - } - - if (\is_array($mInput)) - { - if ($oLogger) - { - $oLogger->WriteDump($mInput, \MailSo\Log\Enumerations\Type::INFO, 'JSON'); - $oLogger->Write('Trying to clear Utf8 before json_encode', \MailSo\Log\Enumerations\Type::INFO, 'JSON'); - } - - \MailSo\Base\Utils::ClearArrayUtf8Values($mInput); - $sResult = @\json_encode($mInput, $iOpt); - } - } - - return $sResult; - } - - /** - * @param string $sFileName - * - * @return string - */ - public static function ClearFileName($sFileName) - { - return \MailSo\Base\Utils::Trim(\MailSo\Base\Utils::ClearNullBite( - \MailSo\Base\Utils::StripSpaces( - \str_replace(array('"', '/', '\\', '*', '?', '<', '>', '|', ':'), ' ', $sFileName)))); - } - - /** - * @param string $sValue - * - * @return string - */ - public static function ClearXss($sValue) - { - return \MailSo\Base\Utils::Trim(\MailSo\Base\Utils::ClearNullBite( - \str_replace(array('"', '/', '\\', '*', '?', '<', '>', '|', ':'), ' ', $sValue))); - } - - /** - * @param string $sValue - * - * @return string - */ - public static function Trim($sValue) - { - return \trim(\preg_replace('/^[\x00-\x1F]+/u', '', - \preg_replace('/[\x00-\x1F]+$/u', '', \trim($sValue)))); - } - - /** - * @param string $sDir - * - * @return bool - */ - public static function RecRmDir($sDir) - { - if (@\is_dir($sDir)) - { - $aObjects = \scandir($sDir); - foreach ($aObjects as $sObject) - { - if ('.' !== $sObject && '..' !== $sObject) - { -// if ('dir' === \filetype($sDir.'/'.$sObject)) - if (\is_dir($sDir.'/'.$sObject)) - { - self::RecRmDir($sDir.'/'.$sObject); - } - else - { - @\unlink($sDir.'/'.$sObject); - } - } - } - - return @\rmdir($sDir); - } - - return false; - } - - /** - * @param string $sSource - * @param string $sDestination - */ - public static function CopyDir($sSource, $sDestination) - { - if (\is_dir($sSource)) - { - if (!\is_dir($sDestination)) - { - \mkdir($sDestination); - } - - $oDirectory = \dir($sSource); - if ($oDirectory) - { - while (false !== ($sRead = $oDirectory->read())) - { - if ('.' === $sRead || '..' === $sRead) - { - continue; - } - - $sPathDir = $sSource.'/'.$sRead; - if (\is_dir($sPathDir)) - { - \MailSo\Base\Utils::CopyDir($sPathDir, $sDestination.'/'.$sRead); - continue; - } - - \copy($sPathDir, $sDestination.'/'.$sRead); - } - - $oDirectory->close(); - } - } - } - - /** - * @param string $sTempPath - * @param int $iTime2Kill - * @param int $iNow - * - * @return bool - */ - public static function RecTimeDirRemove($sTempPath, $iTime2Kill, $iNow) - { - $iFileCount = 0; - - $sTempPath = rtrim($sTempPath, '\\/'); - if (@\is_dir($sTempPath)) - { - $rDirH = @\opendir($sTempPath); - if ($rDirH) - { - $bRemoveAllDirs = true; - while (($sFile = @\readdir($rDirH)) !== false) - { - if ('.' !== $sFile && '..' !== $sFile) - { - if (@\is_dir($sTempPath.'/'.$sFile)) - { - if (!\MailSo\Base\Utils::RecTimeDirRemove($sTempPath.'/'.$sFile, $iTime2Kill, $iNow)) - { - $bRemoveAllDirs = false; - } - } - else - { - $iFileCount++; - } - } - } - - @\closedir($rDirH); - } - - if ($iFileCount > 0) - { - if (\MailSo\Base\Utils::TimeFilesRemove($sTempPath, $iTime2Kill, $iNow)) - { - return @\rmdir($sTempPath); - } - } - else - { - return $bRemoveAllDirs ? @\rmdir($sTempPath) : false; - } - - return false; - } - - return true; - } - - /** - * @param string $sTempPath - * @param int $iTime2Kill - * @param int $iNow - */ - public static function TimeFilesRemove($sTempPath, $iTime2Kill, $iNow) - { - $bResult = true; - - $sTempPath = rtrim($sTempPath, '\\/'); - if (@\is_dir($sTempPath)) - { - $rDirH = @\opendir($sTempPath); - if ($rDirH) - { - while (($sFile = @\readdir($rDirH)) !== false) - { - if ($sFile !== '.' && $sFile !== '..') - { - if ($iNow - \filemtime($sTempPath.'/'.$sFile) > $iTime2Kill) - { - @\unlink($sTempPath.'/'.$sFile); - } - else - { - $bResult = false; - } - } - } - - @\closedir($rDirH); - } - } - - return $bResult; - } - - /** - * @param string $sUtfString - * @param int $iLength - * - * @return string - */ - public static function Utf8Truncate($sUtfString, $iLength) - { - if (\strlen($sUtfString) <= $iLength) - { - return $sUtfString; - } - - while ($iLength >= 0) - { - if ((\ord($sUtfString[$iLength]) < 0x80) || (\ord($sUtfString[$iLength]) >= 0xC0)) - { - return \substr($sUtfString, 0, $iLength); - } - - $iLength--; - } - - return ''; - } - - /** - * @param string $sUtfString - * @param string $sReplaceOn = '' - * - * @return string - */ - public static function Utf8Clear($sUtfString, $sReplaceOn = '') - { - if ('' === $sUtfString) - { - return $sUtfString; - } - - $sUtfString = \preg_replace(\MailSo\Base\Utils::$sValidUtf8Regexp, '$1', $sUtfString); - - $sUtfString = \preg_replace( - '/\xE0[\x80-\x9F][\x80-\xBF]'. - '|\xEF\xBF\xBF'. - '|\xED[\xA0-\xBF][\x80-\xBF]/S', $sReplaceOn, $sUtfString); - - $sUtfString = \preg_replace('/\xEF\xBF\xBD/', '?', $sUtfString); - - $sNewUtfString = false; - if (false === $sNewUtfString && \MailSo\Base\Utils::IsMbStringSupported()) - { - $sNewUtfString = \MailSo\Base\Utils::MbConvertEncoding($sUtfString, 'UTF-8', 'UTF-8'); - } - - if (false === $sNewUtfString && \MailSo\Base\Utils::IsIconvSupported()) - { - $sNewUtfString = \MailSo\Base\Utils::IconvConvertEncoding($sUtfString, 'UTF-8', 'UTF-8'); - } - - if (false !== $sNewUtfString) - { - $sUtfString = $sNewUtfString; - } - - return $sUtfString; - } - - /** - * @param string $sUtfString - * - * @return bool - */ - public static function IsRTL($sUtfString) - { - // \x{0591}-\x{05F4} - Hebrew - // \x{0600}-\x{068F} - Arabic - // \x{0750}-\x{077F} - Arabic - // \x{08A0}-\x{08FF} - Arabic - // \x{103A0}-\x{103DF} - Old Persian - return 0 < (int) preg_match('/[\x{0591}-\x{05F4}\x{0600}-\x{068F}\x{0750}-\x{077F}\x{08A0}-\x{08FF}\x{103A0}-\x{103DF}]/u', $sUtfString); - } - - /** - * @param string $sString - * - * @return string - */ - public static function Base64Decode($sString) - { - $sResultString = \base64_decode($sString, true); - if (false === $sResultString) - { - $sString = \str_replace(array(' ', "\r", "\n", "\t"), '', $sString); - $sString = \preg_replace('/[^a-zA-Z0-9=+\/](.*)$/', '', $sString); - - if (false !== \strpos(\trim(\trim($sString), '='), '=')) - { - $sString = \preg_replace('/=([^=])/', '= $1', $sString); - $aStrings = \explode(' ', $sString); - foreach ($aStrings as $iIndex => $sParts) - { - $aStrings[$iIndex] = \base64_decode($sParts); - } - - $sResultString = \implode('', $aStrings); - } - else - { - $sResultString = \base64_decode($sString); - } - } - - return $sResultString; - } - - /** - * @param string $sValue - * - * @return string - */ - public static function UrlSafeBase64Encode($sValue) - { - return \rtrim(\strtr(\base64_encode($sValue), '+/', '-_'), '='); - } - - /** - * @param string $sValue - * - * @return string - */ - public static function UrlSafeBase64Decode($sValue) - { - $sValue = \rtrim(\strtr($sValue, '-_.', '+/='), '='); - return \MailSo\Base\Utils::Base64Decode(\str_pad($sValue, \strlen($sValue) + (\strlen($sValue) % 4), '=', STR_PAD_RIGHT)); - } - - /** - * @param string $sSequence - * - * @return array - */ - public static function ParseFetchSequence($sSequence) - { - $aResult = array(); - $sSequence = \trim($sSequence); - if (0 < \strlen($sSequence)) - { - $aSequence = \explode(',', $sSequence); - foreach ($aSequence as $sItem) - { - if (false === \strpos($sItem, ':')) - { - $aResult[] = (int) $sItem; - } - else - { - $aItems = \explode(':', $sItem); - $iMax = \max($aItems[0], $aItems[1]); - - for ($iIndex = $aItems[0]; $iIndex <= $iMax; $iIndex++) - { - $aResult[] = (int) $iIndex; - } - } - } - } - - return $aResult; - } - /** - * @param array $aSequence - * - * @return string - */ - public static function PrepearFetchSequence($aSequence) - { - $aResult = array(); - if (\is_array($aSequence) && 0 < \count($aSequence)) - { - $iStart = null; - $iPrev = null; - - foreach ($aSequence as $sItem) - { - // simple protection - if (false !== \strpos($sItem, ':')) - { - $aResult[] = $sItem; - continue; - } - - $iItem = (int) $sItem; - if (null === $iStart || null === $iPrev) - { - $iStart = $iItem; - $iPrev = $iItem; - continue; - } - - if ($iPrev === $iItem - 1) - { - $iPrev = $iItem; - } - else - { - $aResult[] = $iStart === $iPrev ? $iStart : $iStart.':'.$iPrev; - $iStart = $iItem; - $iPrev = $iItem; - } - } - - if (null !== $iStart && null !== $iPrev) - { - $aResult[] = $iStart === $iPrev ? $iStart : $iStart.':'.$iPrev; - } - } - - return \implode(',', $aResult); - } - - /** - * - * @param resource $fResource - * @param int $iBufferLen = 8192 - * - * @return bool - */ - public static function FpassthruWithTimeLimitReset($fResource, $iBufferLen = 8192) - { - $bResult = false; - if (\is_resource($fResource)) - { - while (!\feof($fResource)) - { - $sBuffer = @\fread($fResource, $iBufferLen); - if (false !== $sBuffer) - { - echo $sBuffer; - \MailSo\Base\Utils::ResetTimeLimit(); - continue; - } - - break; - } - - $bResult = true; - } - - return $bResult; - } - - /** - * @param resource $rRead - * @param array $aWrite - * @param int $iBufferLen = 8192 - * @param bool $bResetTimeLimit = true - * @param bool $bFixCrLf = false - * @param bool $bRewindOnComplete = false - * - * @return int|bool - */ - public static function MultipleStreamWriter($rRead, $aWrite, $iBufferLen = 8192, $bResetTimeLimit = true, $bFixCrLf = false, $bRewindOnComplete = false) - { - $mResult = false; - if ($rRead && \is_array($aWrite) && 0 < \count($aWrite)) - { - $mResult = 0; - while (!\feof($rRead)) - { - $sBuffer = \fread($rRead, $iBufferLen); - if (false === $sBuffer) - { - $mResult = false; - break; - } - - if (0 === $iBufferLen || '' === $sBuffer) - { - break; - } - - if ($bFixCrLf) - { - $sBuffer = \str_replace("\n", "\r\n", \str_replace("\r", '', $sBuffer)); - } - - $mResult += \strlen($sBuffer); - - foreach ($aWrite as $rWriteStream) - { - $mWriteResult = \fwrite($rWriteStream, $sBuffer); - if (false === $mWriteResult) - { - $mResult = false; - break 2; - } - } - - if ($bResetTimeLimit) - { - \MailSo\Base\Utils::ResetTimeLimit(); - } - } - } - - if ($mResult && $bRewindOnComplete) - { - foreach ($aWrite as $rWriteStream) - { - if (\is_resource($rWriteStream)) - { - @\rewind($rWriteStream); - } - } - } - - return $mResult; - } - - /** - * @param string $sUtfModifiedString - * - * @return string - */ - public static function ModifiedToPlainUtf7($sUtfModifiedString) - { - $sUtf = ''; - $bBase = false; - - for ($iIndex = 0, $iLen = \strlen($sUtfModifiedString); $iIndex < $iLen; $iIndex++) - { - if ('&' === $sUtfModifiedString[$iIndex]) - { - if (isset($sUtfModifiedString[$iIndex+1]) && '-' === $sUtfModifiedString[$iIndex + 1]) - { - $sUtf .= '&'; - $iIndex++; - } - else - { - $sUtf .= '+'; - $bBase = true; - } - } - else if ($sUtfModifiedString[$iIndex] == '-' && $bBase) - { - $bBase = false; - } - else - { - if ($bBase && ',' === $sUtfModifiedString[$iIndex]) - { - $sUtf .= '/'; - } - else if (!$bBase && '+' === $sUtfModifiedString[$iIndex]) - { - $sUtf .= '+-'; - } - else - { - $sUtf .= $sUtfModifiedString[$iIndex]; - } - } - } - - return $sUtf; - } - - /** - * @param string $sStr - * - * @return string|bool - */ - public static function Utf7ModifiedToUtf8($sStr) - { - $aArray = array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,62, 63,-1,-1,-1,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9, - 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, - 41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1); - - $sResult = ''; - $bError = false; - $iLen = \strlen($sStr); - - for ($iIndex = 0; $iLen > 0; $iIndex++, $iLen--) - { - $sChar = $sStr{$iIndex}; - if ($sChar == '&') - { - $iIndex++; - $iLen--; - - $sChar = isset($sStr{$iIndex}) ? $sStr{$iIndex} : null; - if ($sChar === null) - { - break; - } - - if ($iLen && $sChar == '-') - { - $sResult .= '&'; - continue; - } - - $iCh = 0; - $iK = 10; - for (; $iLen > 0; $iIndex++, $iLen--) - { - $sChar = $sStr{$iIndex}; - - $iB = $aArray[\ord($sChar)]; - if ((\ord($sChar) & 0x80) || $iB == -1) - { - break; - } - - if ($iK > 0) - { - $iCh |= $iB << $iK; - $iK -= 6; - } - else - { - $iCh |= $iB >> (-$iK); - if ($iCh < 0x80) - { - if (0x20 <= $iCh && $iCh < 0x7f) - { - return $bError; - } - - $sResult .= \chr($iCh); - } - else if ($iCh < 0x800) - { - $sResult .= \chr(0xc0 | ($iCh >> 6)); - $sResult .= \chr(0x80 | ($iCh & 0x3f)); - } - else - { - $sResult .= \chr(0xe0 | ($iCh >> 12)); - $sResult .= \chr(0x80 | (($iCh >> 6) & 0x3f)); - $sResult .= \chr(0x80 | ($iCh & 0x3f)); - } - - $iCh = ($iB << (16 + $iK)) & 0xffff; - $iK += 10; - } - } - - if (($iCh || $iK < 6) || - (!$iLen || $sChar != '-') || - ($iLen > 2 && '&' === $sStr{$iIndex+1} && '-' !== $sStr{$iIndex+2})) - { - return $bError; - } - } - else if (\ord($sChar) < 0x20 || \ord($sChar) >= 0x7f) - { - return $bError; - } - else - { - $sResult .= $sChar; - } - } - - return $sResult; - } - - /** - * @param string $sStr - * - * @return string|bool - */ - public static function Utf8ToUtf7Modified($sStr) - { - $sArray = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S', - 'T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o', - 'p','q','r','s','t','u','v','w','x','y','z', '0','1','2','3','4','5','6','7','8','9','+',','); - - $sLen = \strlen($sStr); - $bIsB = false; - $iIndex = $iN = 0; - $sReturn = ''; - $bError = false; - $iCh = $iB = $iK = 0; - - while ($sLen) - { - $iC = \ord($sStr{$iIndex}); - if ($iC < 0x80) - { - $iCh = $iC; - $iN = 0; - } - else if ($iC < 0xc2) - { - return $bError; - } - else if ($iC < 0xe0) - { - $iCh = $iC & 0x1f; - $iN = 1; - } - else if ($iC < 0xf0) - { - $iCh = $iC & 0x0f; - $iN = 2; - } - else if ($iC < 0xf8) - { - $iCh = $iC & 0x07; - $iN = 3; - } - else if ($iC < 0xfc) - { - $iCh = $iC & 0x03; - $iN = 4; - } - else if ($iC < 0xfe) - { - $iCh = $iC & 0x01; - $iN = 5; - } - else - { - return $bError; - } - - $iIndex++; - $sLen--; - - if ($iN > $sLen) - { - return $bError; - } - - for ($iJ = 0; $iJ < $iN; $iJ++) - { - $iO = \ord($sStr{$iIndex+$iJ}); - if (($iO & 0xc0) != 0x80) - { - return $bError; - } - - $iCh = ($iCh << 6) | ($iO & 0x3f); - } - - if ($iN > 1 && !($iCh >> ($iN * 5 + 1))) - { - return $bError; - } - - $iIndex += $iN; - $sLen -= $iN; - - if ($iCh < 0x20 || $iCh >= 0x7f) - { - if (!$bIsB) - { - $sReturn .= '&'; - $bIsB = true; - $iB = 0; - $iK = 10; - } - - if ($iCh & ~0xffff) - { - $iCh = 0xfffe; - } - - $sReturn .= $sArray[($iB | $iCh >> $iK)]; - $iK -= 6; - for (; $iK >= 0; $iK -= 6) - { - $sReturn .= $sArray[(($iCh >> $iK) & 0x3f)]; - } - - $iB = ($iCh << (-$iK)) & 0x3f; - $iK += 16; - } - else - { - if ($bIsB) - { - if ($iK > 10) - { - $sReturn .= $sArray[$iB]; - } - $sReturn .= '-'; - $bIsB = false; - } - - $sReturn .= \chr($iCh); - if ('&' === \chr($iCh)) - { - $sReturn .= '-'; - } - } - } - - if ($bIsB) - { - if ($iK > 10) - { - $sReturn .= $sArray[$iB]; - } - - $sReturn .= '-'; - } - - return $sReturn; - } - - /** - * @param string|array $mFunctionNameOrNames - * - * @return bool - */ - public static function FunctionExistsAndEnabled($mFunctionNameOrNames) - { - static $aCache = null; - - if (\is_array($mFunctionNameOrNames)) - { - foreach ($mFunctionNameOrNames as $sFunctionName) - { - if (!\MailSo\Base\Utils::FunctionExistsAndEnabled($sFunctionName)) - { - return false; - } - } - - return true; - } - - if (empty($mFunctionNameOrNames) || !\function_exists($mFunctionNameOrNames) || !\is_callable($mFunctionNameOrNames)) - { - return false; - } - - if (null === $aCache) - { - $sDisableFunctions = @\ini_get('disable_functions'); - $sDisableFunctions = \is_string($sDisableFunctions) && 0 < \strlen($sDisableFunctions) ? $sDisableFunctions : ''; - - $aCache = \explode(',', $sDisableFunctions); - $aCache = \is_array($aCache) && 0 < \count($aCache) ? $aCache : array(); - - if (\extension_loaded('suhosin')) - { - $sSuhosin = @\ini_get('suhosin.executor.func.blacklist'); - $sSuhosin = \is_string($sSuhosin) && 0 < \strlen($sSuhosin) ? $sSuhosin : ''; - - $aSuhosinCache = \explode(',', $sSuhosin); - $aSuhosinCache = \is_array($aSuhosinCache) && 0 < \count($aSuhosinCache) ? $aSuhosinCache : array(); - - if (0 < \count($aSuhosinCache)) - { - $aCache = \array_merge($aCache, $aSuhosinCache); - $aCache = \array_unique($aCache); - } - } - } - - return !\in_array($mFunctionNameOrNames, $aCache); - } - - /** - * @param string $mValue - * - * @return string - */ - public static function ClearNullBite($mValue) - { - return \str_replace('%00', '', $mValue); - } - - /** - * @param mixed $mValue - * @param bool $bClearNullBite = false - * - * @return mixed - */ - public static function StripSlashesValue($mValue, $bClearNullBite = false) - { - static $bIsMagicQuotesOn = null; - if (null === $bIsMagicQuotesOn) - { - $bIsMagicQuotesOn = (bool) @\ini_get('magic_quotes_gpc'); - } - - if (!$bIsMagicQuotesOn) - { - return $bClearNullBite && \is_string($mValue) ? \MailSo\Base\Utils::ClearNullBite($mValue) : $mValue; - } - - $sType = \gettype($mValue); - if ('string' === $sType) - { - return \stripslashes($bClearNullBite ? \MailSo\Base\Utils::ClearNullBite($mValue) : $mValue); - } - else if ('array' === $sType) - { - $aReturnValue = array(); - $mValueKeys = \array_keys($mValue); - foreach ($mValueKeys as $sKey) - { - $aReturnValue[$sKey] = \MailSo\Base\Utils::StripSlashesValue($mValue[$sKey], $bClearNullBite); - } - - return $aReturnValue; - } - - return $mValue; - } - - /** - * @param string $sStr - * - * @return string - */ - public static function CharsetDetect($sStr) - { - $mResult = ''; - if (!\MailSo\Base\Utils::IsAscii($sStr)) - { - $mResult = \MailSo\Base\Utils::IsMbStringSupported() && - \MailSo\Base\Utils::FunctionExistsAndEnabled('mb_detect_encoding') ? - @\mb_detect_encoding($sStr, 'auto', true) : false; - - if (false === $mResult && \MailSo\Base\Utils::IsIconvSupported()) - { - $mResult = \md5(@\iconv('utf-8', 'utf-8//IGNORE', $sStr)) === \md5($sStr) ? 'utf-8' : ''; - } - } - - return \is_string($mResult) && 0 < \strlen($mResult) ? $mResult : ''; - } - - /** - * @param string $sAdditionalSalt = '' - * - * @return string - */ - public static function Md5Rand($sAdditionalSalt = '') - { - return \md5(\microtime(true).\rand(10000, 99999). - \md5($sAdditionalSalt).\rand(10000, 99999).\microtime(true)); - } - - /** - * @param string $sAdditionalSalt = '' - * - * @return string - */ - public static function Sha1Rand($sAdditionalSalt = '') - { - return \sha1(\microtime(true).\rand(10000, 99999). - \sha1($sAdditionalSalt).\rand(10000, 99999).\microtime(true)); - } - - /** - * @param string $sData - * @param string $sKey - * - * @return string - */ - public static function Hmac($sData, $sKey) - { - if (\function_exists('hash_hmac')) - { - return \hash_hmac('md5', $sData, $sKey); - } - - $iLen = 64; - if ($iLen < \strlen($sKey)) - { - $sKey = \pack('H*', \md5($sKey)); - } - - $sKey = \str_pad($sKey, $iLen, \chr(0x00)); - $sIpad = \str_pad('', $iLen, \chr(0x36)); - $sOpad = \str_pad('', $iLen, \chr(0x5c)); - - return \md5(($sKey ^ $sOpad).\pack('H*', \md5(($sKey ^ $sIpad).$sData))); - } - - /** - * @param string $sDomain - * @param bool $bSimple = false - * - * @return bool - */ - public static function ValidateDomain($sDomain, $bSimple = false) - { - $aMatch = array(); - if ($bSimple) - { - return \preg_match('/.+(\.[a-zA-Z]+)$/', $sDomain, $aMatch) && !empty($aMatch[1]); - } - - return \preg_match('/.+(\.[a-zA-Z]+)$/', $sDomain, $aMatch) && !empty($aMatch[1]) && \in_array($aMatch[1], \explode(' ', - '.academy .actor .agency .audio .bar .beer .bike .blue .boutique .cab .camera .camp .capital .cards .careers .cash .catering .center .cheap .city .cleaning .clinic .clothing .club .coffee .community .company .computer .construction .consulting .contractors .cool .credit .dance .dating .democrat .dental .diamonds .digital .direct .directory .discount .domains .education .email .energy .equipment .estate .events .expert .exposed .fail .farm .fish .fitness .florist .fund .futbol .gallery .gift .glass .graphics .guru .help .holdings .holiday .host .hosting .house .institute .international .kitchen .land .life .lighting .limo .link .management .market .marketing .media .menu .moda .partners .parts .photo .photography .photos .pics .pink .press .productions .pub .red .rentals .repair .report .rest .sexy .shoes .social .solar .solutions .space .support .systems .tattoo .tax .technology .tips .today .tools .town .toys .trade .training .university .uno .vacations .vision .vodka .voyage .watch .webcam .wiki .work .works .wtf .zone .aero .asia .biz .cat .com .coop .edu .gov .info .int .jobs .mil .mobi .museum .name .net .org .pro .tel .travel .xxx .xyz '. - '.ac .ad .ae .af .ag .ai .al .am .an .ao .aq .ar .as .at .au .aw .ax .az .ba .bb .bd .be .bf .bg .bh .bi .bj .bm .bn .bo .br .bs .bt .bv .bw .by .bz .ca .cc .cd .cf .cg .ch .ci .ck .cl .cm .cn .co .cr .cs .cu .cv .cx .cy .cz .dd .de .dj .dk .dm .do .dz .ec .ee .eg .er .es .et .eu .fi .fj .fk .fm .fo .fr .ga .gb .gd .ge .gf .gg .gh .gi .gl .gm .gn .gp .gq .gr .gs .gt .gu .gw .gy .hk .hm .hn .hr .ht .hu .id .ie .il .im .in .io .iq .ir .is .it .je .jm .jo .jp .ke .kg .kh .ki .km .kn .kp .kr .kw .ky .kz .la .lb .lc .li .lk .lr .ls .lt .lu .lv .ly .ma .mc .md .me .mg .mh .mk .ml .mm .mn .mo .mp .mq .mr .ms .mt .mu .mv .mw .mx .my .mz .na .nc .ne .nf .ng .ni .nl .no .np .nr .nu .nz .om .pa .pe .pf .pg .ph .pk .pl .pm .pn .pr .ps .pt .pw .py .qa .re .ro .rs .ru . .rw .sa .sb .sc .sd .se .sg .sh .si .sj .sk .sl .sm .sn .so .sr .st .su .sv .sy .sz .tc .td .tf .tg .th .tj .tk .tl .tm .tn .to .tp .tr .tt .tv .tw .tz .ua .ug .uk .us .uy .uz .va .vc .ve .vg .vi .vn .vu .wf .ws .ye .yt .za .zm .zw' - )); - } - - /** - * @param string $sIp - * - * @return bool - */ - public static function ValidateIP($sIp) - { - return !empty($sIp) && $sIp === @\filter_var($sIp, FILTER_VALIDATE_IP); - } - - /** - * @return \Net_IDNA2 - */ - private static function idn() - { - static $oIdn = null; - if (null === $oIdn) - { - include_once MAILSO_LIBRARY_ROOT_PATH.'Vendors/Net/IDNA2.php'; - $oIdn = new \Net_IDNA2(); - $oIdn->setParams('utf8', true); - } - - return $oIdn; - } - - /** - * @param string $sStr - * @param bool $bLowerIfAscii = false - * - * @return string - */ - public static function IdnToUtf8($sStr, $bLowerIfAscii = false) - { - if (0 < \strlen($sStr) && \preg_match('/(^|\.|@)xn--/i', $sStr)) - { - try - { - $sStr = self::idn()->decode($sStr); - } - catch (\Exception $oException) {} - } - - return $bLowerIfAscii ? \MailSo\Base\Utils::StrMailDomainToLowerIfAscii($sStr) : $sStr; - } - - /** - * @param string $sStr - * @param bool $bLowerIfAscii = false - * - * @return string - */ - public static function IdnToAscii($sStr, $bLowerIfAscii = false) - { - $sStr = $bLowerIfAscii ? \MailSo\Base\Utils::StrMailDomainToLowerIfAscii($sStr) : $sStr; - - $sUser = ''; - $sDomain = $sStr; - if (false !== \strpos($sStr, '@')) - { - $sUser = \MailSo\Base\Utils::GetAccountNameFromEmail($sStr); - $sDomain = \MailSo\Base\Utils::GetDomainFromEmail($sStr); - } - - if (0 < \strlen($sDomain) && \preg_match('/[^\x20-\x7E]/', $sDomain)) - { - try - { - $sDomain = self::idn()->encode($sDomain); - } - catch (\Exception $oException) {} - } - - return ('' === $sUser ? '' : $sUser.'@').$sDomain; - } - - /** - * @param string $sHash - * @param string $sSalt - * - * @return int - */ - public static function HashToId($sHash, $sSalt = '') - { - $sData = $sHash ? @\MailSo\Base\Crypt::XxteaDecrypt(\hex2bin($sHash), \md5($sSalt)) : null; - - $aMatch = array(); - if ($sData && preg_match('/^id:(\d+)$/', $sData, $aMatch) && isset($aMatch[1])) - { - return is_numeric($aMatch[1]) ? (int) $aMatch[1] : null; - } - - return null; - } - - /** - * @param int $iID - * @param string $sSalt - * - * @return string - */ - public static function IdToHash($iID, $sSalt = '') - { - return is_int($iID) ? - \bin2hex(\MailSo\Base\Crypt::XxteaEncrypt('id:'.$iID, \md5($sSalt))) : null - ; - } - - /** - * @param string $sPassword - * - * @return bool - */ - public static function PasswordWeaknessCheck($sPassword) - { - $sPassword = \trim($sPassword); - if (6 > \strlen($sPassword)) - { - return false; - } - - $sLine = 'password 123.456 12345678 abc123 qwerty monkey letmein dragon 111.111 baseball iloveyou trustno1 1234567 sunshine master 123.123 welcome shadow ashley football jesus michael ninja mustang password1 123456 123456789 qwerty 111111 1234567 666666 12345678 7777777 123321 654321 1234567890 123123 555555 vkontakte gfhjkm 159753 777777 temppassword qazwsx 1q2w3e 1234 112233 121212 qwertyuiop qq18ww899 987654321 12345 zxcvbn zxcvbnm 999999 samsung ghbdtn 1q2w3e4r 1111111 123654 159357 131313 qazwsxedc 123qwe 222222 asdfgh 333333 9379992 asdfghjkl 4815162342 12344321 88888888 11111111 knopka 789456 qwertyu 1q2w3e4r5t iloveyou vfhbyf marina password qweasdzxc 10203 987654 yfnfif cjkysirj nikita 888888 vfrcbv k.,jdm qwertyuiop[] qwe123 qweasd natasha 123123123 fylhtq q1w2e3 stalker 1111111111 q1w2e3r4 nastya 147258369 147258 fyfcnfcbz 1234554321 1qaz2wsx andrey 111222 147852 genius sergey 7654321 232323 123789 fktrcfylh spartak admin test 123 azerty abc123 lol123 easytocrack1 hello saravn holysh!t test123 tundra_cool2 456 dragon thomas killer root 1111 pass master aaaaaa a monkey daniel asdasd e10adc3949ba59abbe56e057f20f883e changeme computer jessica letmein mirage loulou lol superman shadow admin123 secret administrator sophie kikugalanetroot doudou liverpool hallo sunshine charlie parola 100827092 michael andrew password1 fuckyou matrix cjmasterinf internet hallo123 eminem demo gewinner pokemon abcd1234 guest ngockhoa martin sandra asdf hejsan george qweqwe lollipop lovers q1q1q1 tecktonik naruto 12 password12 password123 password1234 password12345 password123456 password1234567 password12345678 password123456789 000000 maximius 123abc baseball1 football1 soccer princess slipknot 11111 nokia super star 666999 12341234 1234321 135790 159951 212121 zzzzzz 121314 134679 142536 19921992 753951 7007 1111114 124578 19951995 258456 qwaszx zaqwsx 55555 77777 54321 qwert 22222 33333 99999 88888 66666'; - return false === \strpos($sLine, \strtolower($sPassword)); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Validator.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Validator.php deleted file mode 100755 index dbaf2ffd..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Base/Validator.php +++ /dev/null @@ -1,100 +0,0 @@ -= $iMin || null === $iMin) && - (null !== $iMax && $iNumber <= $iMax || null === $iMax); - } - - /** - * @param int $iPort - * - * @return bool - */ - public static function PortInt($iPort) - { - return \MailSo\Base\Validator::RangeInt($iPort, 0, 65535); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/CacheClient.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/CacheClient.php deleted file mode 100755 index e72f56ea..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/CacheClient.php +++ /dev/null @@ -1,215 +0,0 @@ -oDriver = null; - $this->sCacheIndex = ''; - } - - /** - * @return \MailSo\Cache\CacheClient - */ - public static function NewInstance() - { - return new self(); - } - - /** - * @param string $sKey - * @param string $sValue - * - * @return bool - */ - public function Set($sKey, $sValue) - { - return $this->oDriver ? $this->oDriver->Set($sKey.$this->sCacheIndex, $sValue) : false; - } - - /** - * @param string $sKey - * - * @return bool - */ - public function SetTimer($sKey) - { - return $this->Set($sKey.'/TIMER', time()); - } - - /** - * @param string $sKey - * - * @return bool - */ - public function SetLock($sKey) - { - return $this->Set($sKey.'/LOCK', '1'); - } - - /** - * @param string $sKey - * - * @return bool - */ - public function RemoveLock($sKey) - { - return $this->Set($sKey.'/LOCK', '0'); - } - - /** - * @param string $sKey - * - * @return bool - */ - public function GetLock($sKey) - { - return '1' === $this->Get($sKey.'/LOCK'); - } - - /** - * @param string $sKey - * @param string $bClearAfterGet = false - * - * @return string - */ - public function Get($sKey, $bClearAfterGet = false) - { - $sValue = ''; - - if ($this->oDriver) - { - $sValue = $this->oDriver->Get($sKey.$this->sCacheIndex); - } - - if ($bClearAfterGet) - { - $this->Delete($sKey); - } - - return $sValue; - } - - /** - * @param string $sKey - * - * @return int - */ - public function GetTimer($sKey) - { - $iTimer = 0; - $sValue = $this->Get($sKey.'/TIMER'); - if (0 < strlen($sValue) && is_numeric($sValue)) - { - $iTimer = (int) $sValue; - } - - return $iTimer; - } - - /** - * @param string $sKey - * - * @return \MailSo\Cache\CacheClient - */ - public function Delete($sKey) - { - if ($this->oDriver) - { - $this->oDriver->Delete($sKey.$this->sCacheIndex); - } - - return $this; - } - - /** - * @param \MailSo\Cache\DriverInterface $oDriver - * - * @return \MailSo\Cache\CacheClient - */ - public function SetDriver(\MailSo\Cache\DriverInterface $oDriver) - { - $this->oDriver = $oDriver; - - return $this; - } - - /** - * @param int $iTimeToClearInHours = 24 - * - * @return bool - */ - public function GC($iTimeToClearInHours = 24) - { - return $this->oDriver ? $this->oDriver->GC($iTimeToClearInHours) : false; - } - - /** - * @return bool - */ - public function IsInited() - { - return $this->oDriver instanceof \MailSo\Cache\DriverInterface; - } - - /** - * @param string $sCacheIndex - * - * @return \MailSo\Cache\CacheClient - */ - public function SetCacheIndex($sCacheIndex) - { - $this->sCacheIndex = 0 < \strlen($sCacheIndex) ? "\x0".$sCacheIndex : ''; - - return $this; - } - - /** - * @param bool $bCache = false - * - * @return bool - */ - public function Verify($bCache = false) - { - if ($this->oDriver) - { - $sCacheData = \gmdate('Y-m-d-H'); - if ($bCache && $sCacheData === $this->Get('__verify_key__')) - { - return true; - } - - return $this->Set('__verify_key__', $sCacheData); - } - - return false; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/DriverInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/DriverInterface.php deleted file mode 100755 index 4789cd6c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/DriverInterface.php +++ /dev/null @@ -1,48 +0,0 @@ -sKeyPrefix = $sKeyPrefix; - if (!empty($this->sKeyPrefix)) - { - $this->sKeyPrefix = - \preg_replace('/[^a-zA-Z0-9_]/', '_', rtrim(trim($this->sKeyPrefix), '\\/')).'/'; - } - } - - /** - * @param string $sKeyPrefix = '' - * - * @return \MailSo\Cache\Drivers\APC - */ - public static function NewInstance($sKeyPrefix = '') - { - return new self($sKeyPrefix); - } - - /** - * @param string $sKey - * @param string $sValue - * - * @return bool - */ - public function Set($sKey, $sValue) - { - return \apc_store($this->generateCachedKey($sKey), (string) $sValue); - } - - /** - * @param string $sKey - * - * @return string - */ - public function Get($sKey) - { - $sValue = \apc_fetch($this->generateCachedKey($sKey)); - return \is_string($sValue) ? $sValue : ''; - } - - /** - * @param string $sKey - * - * @return void - */ - public function Delete($sKey) - { - \apc_delete($this->generateCachedKey($sKey)); - } - - /** - * @param int $iTimeToClearInHours = 24 - * - * @return bool - */ - public function GC($iTimeToClearInHours = 24) - { - if (0 === $iTimeToClearInHours) - { - return \apc_clear_cache('user'); - } - - return false; - } - - /** - * @param string $sKey - * - * @return string - */ - private function generateCachedKey($sKey) - { - return $this->sKeyPrefix.\sha1($sKey); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/File.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/File.php deleted file mode 100755 index bee1c51b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/File.php +++ /dev/null @@ -1,153 +0,0 @@ -sCacheFolder = $sCacheFolder; - $this->sCacheFolder = rtrim(trim($this->sCacheFolder), '\\/').'/'; - - $this->sKeyPrefix = $sKeyPrefix; - if (!empty($this->sKeyPrefix)) - { - $this->sKeyPrefix = \str_pad(\preg_replace('/[^a-zA-Z0-9_]/', '_', - rtrim(trim($this->sKeyPrefix), '\\/')), 5, '_'); - - $this->sKeyPrefix = '__/'. - \substr($this->sKeyPrefix, 0, 2).'/'.\substr($this->sKeyPrefix, 2, 2).'/'. - $this->sKeyPrefix.'/'; - } - } - - /** - * @param string $sCacheFolder - * @param string $sKeyPrefix = '' - * - * @return \MailSo\Cache\Drivers\File - */ - public static function NewInstance($sCacheFolder, $sKeyPrefix = '') - { - return new self($sCacheFolder, $sKeyPrefix); - } - - /** - * @param string $sKey - * @param string $sValue - * - * @return bool - */ - public function Set($sKey, $sValue) - { - $sPath = $this->generateCachedFileName($sKey, true); - return '' === $sPath ? false : false !== \file_put_contents($sPath, $sValue); - } - - /** - * @param string $sKey - * - * @return string - */ - public function Get($sKey) - { - $sValue = ''; - $sPath = $this->generateCachedFileName($sKey); - if ('' !== $sPath && \file_exists($sPath)) - { - $sValue = \file_get_contents($sPath); - } - - return \is_string($sValue) ? $sValue : ''; - } - - /** - * @param string $sKey - * - * @return void - */ - public function Delete($sKey) - { - $sPath = $this->generateCachedFileName($sKey); - if ('' !== $sPath && \file_exists($sPath)) - { - \unlink($sPath); - } - } - - /** - * @param int $iTimeToClearInHours = 24 - * - * @return bool - */ - public function GC($iTimeToClearInHours = 24) - { - if (0 < $iTimeToClearInHours) - { - \MailSo\Base\Utils::RecTimeDirRemove($this->sCacheFolder, 60 * 60 * $iTimeToClearInHours, \time()); - return true; - } - - return false; - } - - /** - * @param string $sKey - * @param bool $bMkDir = false - * - * @return string - */ - private function generateCachedFileName($sKey, $bMkDir = false) - { - $sFilePath = ''; - if (3 < \strlen($sKey)) - { - $sKeyPath = \sha1($sKey); - $sKeyPath = \substr($sKeyPath, 0, 2).'/'.\substr($sKeyPath, 2, 2).'/'.$sKeyPath; - - $sFilePath = $this->sCacheFolder.$this->sKeyPrefix.$sKeyPath; - if ($bMkDir && !\is_dir(\dirname($sFilePath))) - { - if (!@\mkdir(\dirname($sFilePath), 0755, true)) - { - if (!@\mkdir(\dirname($sFilePath), 0755, true)) - { - $sFilePath = ''; - } - } - } - } - - return $sFilePath; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/Memcache.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/Memcache.php deleted file mode 100755 index 35094b48..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/Memcache.php +++ /dev/null @@ -1,144 +0,0 @@ -sHost = $sHost; - $this->iPost = $iPost; - $this->iExpire = 0 < $iExpire ? $iExpire : 43200; - - $this->oMem = new \Memcache(); - if (!$this->oMem->connect($this->sHost, $this->iPost)) - { - $this->oMem = null; - } - - $this->sKeyPrefix = $sKeyPrefix; - if (!empty($this->sKeyPrefix)) - { - $this->sKeyPrefix = - \preg_replace('/[^a-zA-Z0-9_]/', '_', rtrim(trim($this->sKeyPrefix), '\\/')).'/'; - } - } - - /** - * @param string $sHost = '127.0.0.1' - * @param int $iPost = 11211 - * @param int $iExpire = 43200 - * @param string $sKeyPrefix = '' - * - * @return \MailSo\Cache\Drivers\APC - */ - public static function NewInstance($sHost = '127.0.0.1', $iPost = 11211, $iExpire = 43200, $sKeyPrefix = '') - { - return new self($sHost, $iPost, $iExpire, $sKeyPrefix); - } - - /** - * @param string $sKey - * @param string $sValue - * - * @return bool - */ - public function Set($sKey, $sValue) - { - return $this->oMem ? $this->oMem->set($this->generateCachedKey($sKey), $sValue, 0, $this->iExpire) : false; - } - - /** - * @param string $sKey - * - * @return string - */ - public function Get($sKey) - { - $sValue = $this->oMem ? $this->oMem->get($this->generateCachedKey($sKey)) : ''; - return \is_string($sValue) ? $sValue : ''; - } - - /** - * @param string $sKey - * - * @return void - */ - public function Delete($sKey) - { - if ($this->oMem) - { - $this->oMem->delete($this->generateCachedKey($sKey)); - } - } - - /** - * @param int $iTimeToClearInHours = 24 - * - * @return bool - */ - public function GC($iTimeToClearInHours = 24) - { - if (0 === $iTimeToClearInHours && $this->oMem) - { - return $this->oMem->flush(); - } - - return false; - } - - /** - * @param string $sKey - * - * @return string - */ - private function generateCachedKey($sKey) - { - return $this->sKeyPrefix.\sha1($sKey); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/Redis.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/Redis.php deleted file mode 100755 index 638f8688..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Cache/Drivers/Redis.php +++ /dev/null @@ -1,160 +0,0 @@ -sHost = $sHost; - $this->iPost = $iPost; - $this->iExpire = 0 < $iExpire ? $iExpire : 43200; - - $this->oRedis = null; - - try - { - $this->oRedis = new \Predis\Client('unix:' === substr($sHost, 0, 5) ? $sHost : array( - 'host' => $sHost, - 'port' => $iPost - )); - - $this->oRedis->connect(); - - if (!$this->oRedis->isConnected()) - { - $this->oRedis = null; - } - } - catch (\Exception $oExc) - { - $this->oRedis = null; - unset($oExc); - } - - $this->sKeyPrefix = $sKeyPrefix; - if (!empty($this->sKeyPrefix)) - { - $this->sKeyPrefix = - \preg_replace('/[^a-zA-Z0-9_]/', '_', rtrim(trim($this->sKeyPrefix), '\\/')).'/'; - } - } - - /** - * @param string $sHost = '127.0.0.1' - * @param int $iPost = 11211 - * @param int $iExpire = 43200 - * @param string $sKeyPrefix = '' - * - * @return \MailSo\Cache\Drivers\APC - */ - public static function NewInstance($sHost = '127.0.0.1', $iPost = 6379, $iExpire = 43200, $sKeyPrefix = '') - { - return new self($sHost, $iPost, $iExpire, $sKeyPrefix); - } - - /** - * @param string $sKey - * @param string $sValue - * - * @return bool - */ - public function Set($sKey, $sValue) - { - return $this->oRedis ? $this->oRedis->setex($this->generateCachedKey($sKey), $this->iExpire, $sValue) : false; - } - - /** - * @param string $sKey - * - * @return string - */ - public function Get($sKey) - { - $sValue = $this->oRedis ? $this->oRedis->get($this->generateCachedKey($sKey)) : ''; - return \is_string($sValue) ? $sValue : ''; - } - - /** - * @param string $sKey - * - * @return void - */ - public function Delete($sKey) - { - if ($this->oRedis) - { - $this->oRedis->del($this->generateCachedKey($sKey)); - } - } - - /** - * @param int $iTimeToClearInHours = 24 - * - * @return bool - */ - public function GC($iTimeToClearInHours = 24) - { - if (0 === $iTimeToClearInHours && $this->oRedis) - { - return $this->oRedis->flushdb(); - } - - return false; - } - - /** - * @param string $sKey - * - * @return string - */ - private function generateCachedKey($sKey) - { - return $this->sKeyPrefix.\sha1($sKey); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Config.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Config.php deleted file mode 100755 index 9901feb1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Config.php +++ /dev/null @@ -1,113 +0,0 @@ -sContentType = $sContentType; - $this->sCharset = $sCharset; - $this->aBodyParams = $aBodyParams; - $this->sContentID = $sContentID; - $this->sDescription = $sDescription; - $this->sMailEncodingName = $sMailEncodingName; - $this->sDisposition = $sDisposition; - $this->aDispositionParams = $aDispositionParams; - $this->sFileName = $sFileName; - $this->sLanguage = $sLanguage; - $this->sLocation = $sLocation; - $this->iSize = $iSize; - $this->iTextLineCount = $iTextLineCount; - $this->sPartID = $sPartID; - $this->aSubParts = $aSubParts; - } - - /** - * return string - */ - public function MailEncodingName() - { - return $this->sMailEncodingName; - } - - /** - * return string - */ - public function PartID() - { - return (string) $this->sPartID; - } - - /** - * return string - */ - public function FileName() - { - return $this->sFileName; - } - - /** - * return string - */ - public function ContentType() - { - return $this->sContentType; - } - - /** - * return int - */ - public function Size() - { - return (int) $this->iSize; - } - - /** - * return int - */ - public function EstimatedSize() - { - $fCoefficient = 1; - switch (\strtolower($this->MailEncodingName())) - { - case 'base64': - $fCoefficient = 0.75; - break; - case 'quoted-printable': - $fCoefficient = 0.44; - break; - } - - return (int) ($this->Size() * $fCoefficient); - } - - /** - * return string - */ - public function Charset() - { - return $this->sCharset; - } - - - /** - * return string - */ - public function ContentID() - { - return (null === $this->sContentID) ? '' : $this->sContentID; - } - - /** - * return string - */ - public function ContentLocation() - { - return (null === $this->sLocation) ? '' : $this->sLocation; - } - - /** - * return bool - */ - public function IsInline() - { - return (null === $this->sDisposition) ? - (0 < \strlen($this->ContentID())) : ('inline' === strtolower($this->sDisposition)); - } - - /** - * return bool - */ - public function IsImage() - { - return 'image' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); - } - - /** - * return bool - */ - public function IsArchive() - { - return 'archive' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); - } - - /** - * @return bool - */ - public function IsPdf() - { - return 'pdf' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); - } - - /** - * @return bool - */ - public function IsDoc() - { - return 'doc' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); - } - - /** - * @return bool - */ - public function IsPgpSignature() - { - return \in_array(\strtolower($this->ContentType()), - array('application/pgp-signature', 'application/pkcs7-signature')); - } - - /** - * @return bool - */ - public function IsAttachBodyPart() - { - $bResult = ( - (null !== $this->sDisposition && 'attachment' === \strtolower($this->sDisposition)) - ); - - if (!$bResult && null !== $this->sContentType) - { - $sContentType = \strtolower($this->sContentType); - $bResult = false === \strpos($sContentType, 'multipart/') && - 'text/html' !== $sContentType && 'text/plain' !== $sContentType; - } - - return $bResult; - } - - /** - * @return bool - */ - public function IsFlowedFormat() - { - $bResult = !empty($this->aBodyParams['format']) && - 'flowed' === \strtolower(\trim($this->aBodyParams['format'])); - - if ($bResult && \in_array(\strtolower($this->MailEncodingName()), array('base64', 'quoted-printable'))) - { - $bResult = false; - } - - return $bResult; - } - - /** - * @return array|null - */ - public function SearchPlainParts() - { - $aReturn = array(); - $aParts = $this->SearchByContentType('text/plain'); - foreach ($aParts as $oPart) - { - if (!$oPart->IsAttachBodyPart()) - { - $aReturn[] = $oPart; - } - } - return $aReturn; - } - - /** - * @return array|null - */ - public function SearchHtmlParts() - { - $aReturn = array(); - $aParts = $this->SearchByContentType('text/html'); - - foreach ($aParts as $oPart) - { - if (!$oPart->IsAttachBodyPart()) - { - $aReturn[] = $oPart; - } - } - - return $aReturn; - } - - /** - * @return \MailSo\Imap\BodyStructure|null - */ - public function SearchInlineEncryptedPart() - { - if ('multipart/encrypted' === \strtolower($this->ContentType())) - { - $aSearchParts = $this->SearchByCallback(function ($oItem) { - return $oItem->IsInline(); - }); - - if (is_array($aSearchParts) && 1 === \count($aSearchParts) && isset($aSearchParts[0])) - { - return $aSearchParts[0]; - } - } - - return null; - } - - /** - * @return array|null - */ - public function SearchHtmlOrPlainParts() - { - $mResult = $this->SearchHtmlParts(); - if (null === $mResult || (\is_array($mResult) && 0 === count($mResult))) - { - $mResult = $this->SearchPlainParts(); - } - - if (null === $mResult || (\is_array($mResult) && 0 === count($mResult))) - { - $oPart = $this->SearchInlineEncryptedPart(); - if ($oPart instanceof \MailSo\Imap\BodyStructure) - { - $mResult = array($oPart); - } - } - - return $mResult; - } - - /** - * @return string - */ - public function SearchCharset() - { - $sResult = ''; - $mParts = array(); - - $mHtmlParts = $this->SearchHtmlParts(); - $mPlainParts = $this->SearchPlainParts(); - - if (\is_array($mHtmlParts) && 0 < \count($mHtmlParts)) - { - $mParts = \array_merge($mParts, $mHtmlParts); - } - - if (\is_array($mPlainParts) && 0 < \count($mPlainParts)) - { - $mParts = \array_merge($mParts, $mPlainParts); - } - - foreach ($mParts as $oPart) - { - $sResult = $oPart ? $oPart->Charset() : ''; - if (!empty($sResult)) - { - break; - } - } - - if (0 === strlen($sResult)) - { - $aParts = $this->SearchAttachmentsParts(); - foreach ($aParts as $oPart) - { - if (0 === \strlen($sResult)) - { - $sResult = $oPart ? $oPart->Charset() : ''; - } - else - { - break; - } - } - } - - return $sResult; - } - - /** - * @param mixed $fCallback - * - * @return array - */ - public function SearchByCallback($fCallback) - { - $aReturn = array(); - if (\call_user_func($fCallback, $this)) - { - $aReturn[] = $this; - } - - if (\is_array($this->aSubParts) && 0 < \count($this->aSubParts)) - { - foreach ($this->aSubParts as /* @var $oSubPart \MailSo\Imap\BodyStructure */ &$oSubPart) - { - $aReturn = \array_merge($aReturn, $oSubPart->SearchByCallback($fCallback)); - } - } - - return $aReturn; - } - - /** - * @return array - */ - public function SearchAttachmentsParts() - { - return $this->SearchByCallback(function ($oItem) { - return $oItem->IsAttachBodyPart(); - }); - } - - /** - * @param string $sContentType - * - * @return array - */ - public function SearchByContentType($sContentType) - { - $sContentType = \strtolower($sContentType); - return $this->SearchByCallback(function ($oItem) use ($sContentType) { - return $sContentType === $oItem->ContentType(); - }); - } - - /** - * @param string $sMimeIndex - * - * @return \MailSo\Imap\BodyStructure - */ - public function GetPartByMimeIndex($sMimeIndex) - { - $oPart = null; - if (0 < \strlen($sMimeIndex)) - { - if ($sMimeIndex === $this->sPartID) - { - $oPart = $this; - } - - if (null === $oPart && is_array($this->aSubParts) && 0 < count($this->aSubParts)) - { - foreach ($this->aSubParts as /* @var $oSubPart \MailSo\Imap\BodyStructure */ &$oSubPart) - { - $oPart = $oSubPart->GetPartByMimeIndex($sMimeIndex); - if (null !== $oPart) - { - break; - } - } - } - } - - return $oPart; - } - - /** - * @param array $aParams - * @param string $sParamName - * @param string $sCharset = \MailSo\Base\Enumerations\Charset::UTF_8 - * - * @return string - */ - private static function decodeAttrParamenter($aParams, $sParamName, $sCharset = \MailSo\Base\Enumerations\Charset::UTF_8) - { - $sResult = ''; - if (isset($aParams[$sParamName])) - { - $sResult = \MailSo\Base\Utils::DecodeHeaderValue($aParams[$sParamName], $sCharset); - } - else if (isset($aParams[$sParamName.'*'])) - { - $aValueParts = \explode("''", $aParams[$sParamName.'*'], 2); - if (\is_array($aValueParts) && 2 === \count($aValueParts)) - { - $sCharset = isset($aValueParts[0]) ? $aValueParts[0] : \MailSo\Base\Enumerations\Charset::UTF_8; - - $sResult = \MailSo\Base\Utils::ConvertEncoding( - \urldecode($aValueParts[1]), $sCharset, \MailSo\Base\Enumerations\Charset::UTF_8); - } - else - { - $sResult = \urldecode($aParams[$sParamName.'*']); - } - } - else - { - $sCharset = ''; - $sCharsetIndex = -1; - - $aFileNames = array(); - foreach ($aParams as $sName => $sValue) - { - $aMatches = array(); - if (\preg_match('/^'.\preg_quote($sParamName, '/').'\*([0-9]+)\*$/i', $sName, $aMatches)) - { - $iIndex = (int) $aMatches[1]; - if ($sCharsetIndex < $iIndex && false !== \strpos($sValue, "''")) - { - $aValueParts = \explode("''", $sValue, 2); - if (\is_array($aValueParts) && 2 === \count($aValueParts) && 0 < \strlen($aValueParts[0])) - { - $sCharsetIndex = $iIndex; - $sCharset = $aValueParts[0]; - $sValue = $aValueParts[1]; - } - } - - $aFileNames[$iIndex] = $sValue; - } - } - - if (0 < \count($aFileNames)) - { - \ksort($aFileNames, SORT_NUMERIC); - $sResult = \implode(\array_values($aFileNames)); - $sResult = \urldecode($sResult); - - if (0 < \strlen($sCharset)) - { - $sResult = \MailSo\Base\Utils::ConvertEncoding($sResult, - $sCharset, \MailSo\Base\Enumerations\Charset::UTF_8); - } - } - } - - return $sResult; - } - - /** - * @param array $aBodyStructure - * @param string $sPartID = '' - * - * @return \MailSo\Imap\BodyStructure - */ - public static function NewInstance(array $aBodyStructure, $sPartID = '') - { - if (!\is_array($aBodyStructure) || 2 > \count($aBodyStructure)) - { - return null; - } - else - { - $sBodyMainType = null; - if (\is_string($aBodyStructure[0]) && 'NIL' !== $aBodyStructure[0]) - { - $sBodyMainType = $aBodyStructure[0]; - } - - $sBodySubType = null; - $sContentType = ''; - $aSubParts = null; - $aBodyParams = array(); - $sName = null; - $sCharset = null; - $sContentID = null; - $sDescription = null; - $sMailEncodingName = null; - $iSize = 0; - $iTextLineCount = 0; // valid for rfc822/message and text parts - $iExtraItemPos = 0; // list index of items which have no well-established position (such as 0, 1, 5, etc). - - if (null === $sBodyMainType) - { - // Process multipart body structure - if (!\is_array($aBodyStructure[0])) - { - return null; - } - else - { - $sBodyMainType = 'multipart'; - $sSubPartIDPrefix = ''; - if (0 === \strlen($sPartID) || '.' === $sPartID[\strlen($sPartID) - 1]) - { - // This multi-part is root part of message. - $sSubPartIDPrefix = $sPartID; - $sPartID .= 'TEXT'; - } - else if (0 < \strlen($sPartID)) - { - // This multi-part is a part of another multi-part. - $sSubPartIDPrefix = $sPartID.'.'; - } - - $aSubParts = array(); - $iIndex = 1; - - while ($iExtraItemPos < \count($aBodyStructure) && \is_array($aBodyStructure[$iExtraItemPos])) - { - $oPart = self::NewInstance($aBodyStructure[$iExtraItemPos], $sSubPartIDPrefix.$iIndex); - if (null === $oPart) - { - return null; - } - else - { - // For multipart, we have no charset info in the part itself. Thus, - // obtain charset from nested parts. - if ($sCharset == null) - { - $sCharset = $oPart->Charset(); - } - - $aSubParts[] = $oPart; - $iExtraItemPos++; - $iIndex++; - } - } - } - - if ($iExtraItemPos < \count($aBodyStructure)) - { - if (!\is_string($aBodyStructure[$iExtraItemPos]) || 'NIL' === $aBodyStructure[$iExtraItemPos]) - { - return null; - } - - $sBodySubType = \strtolower($aBodyStructure[$iExtraItemPos]); - $iExtraItemPos++; - } - - if ($iExtraItemPos < \count($aBodyStructure)) - { - $sBodyParamList = $aBodyStructure[$iExtraItemPos]; - if (\is_array($sBodyParamList)) - { - $aBodyParams = self::getKeyValueListFromArrayList($sBodyParamList); - } - } - - $iExtraItemPos++; - } - else - { - // Process simple (singlepart) body structure - if (7 > \count($aBodyStructure)) - { - return null; - } - - $sBodyMainType = \strtolower($sBodyMainType); - if (!\is_string($aBodyStructure[1]) || 'NIL' === $aBodyStructure[1]) - { - return null; - } - - $sBodySubType = \strtolower($aBodyStructure[1]); - - $aBodyParamList = $aBodyStructure[2]; - if (\is_array($aBodyParamList)) - { - $aBodyParams = self::getKeyValueListFromArrayList($aBodyParamList); - if (isset($aBodyParams['charset'])) - { - $sCharset = $aBodyParams['charset']; - } - - if (\is_array($aBodyParams)) - { - $sName = self::decodeAttrParamenter($aBodyParams, 'name', $sContentType); - } - } - - if (null !== $aBodyStructure[3] && 'NIL' !== $aBodyStructure[3]) - { - if (!\is_string($aBodyStructure[3])) - { - return null; - } - - $sContentID = $aBodyStructure[3]; - } - - if (null !== $aBodyStructure[4] && 'NIL' !== $aBodyStructure[4]) - { - if (!\is_string($aBodyStructure[4])) - { - return null; - } - - $sDescription = $aBodyStructure[4]; - } - - if (null !== $aBodyStructure[5] && 'NIL' !== $aBodyStructure[5]) - { - if (!\is_string($aBodyStructure[5])) - { - return null; - } - $sMailEncodingName = $aBodyStructure[5]; - } - - if (\is_numeric($aBodyStructure[6])) - { - $iSize = (int) $aBodyStructure[6]; - } - else - { - $iSize = -1; - } - - if (0 === \strlen($sPartID) || '.' === $sPartID[\strlen($sPartID) - 1]) - { - // This is the only sub-part of the message (otherwise, it would be - // one of sub-parts of a multi-part, and partID would already be fully set up). - $sPartID .= '1'; - } - - $iExtraItemPos = 7; - if ('text' === $sBodyMainType) - { - if ($iExtraItemPos < \count($aBodyStructure)) - { - if (\is_numeric($aBodyStructure[$iExtraItemPos])) - { - $iTextLineCount = (int) $aBodyStructure[$iExtraItemPos]; - } - else - { - $iTextLineCount = -1; - } - } - else - { - $iTextLineCount = -1; - } - - $iExtraItemPos++; - } - else if ('message' === $sBodyMainType && 'rfc822' === $sBodySubType) - { - if ($iExtraItemPos + 2 < \count($aBodyStructure)) - { - if (\is_numeric($aBodyStructure[$iExtraItemPos + 2])) - { - $iTextLineCount = (int) $aBodyStructure[$iExtraItemPos + 2]; - } - else - { - $iTextLineCount = -1; - } - } - else - { - $iTextLineCount = -1; - } - - $iExtraItemPos += 3; - } - - $iExtraItemPos++; // skip MD5 digest of the body because most mail servers leave it NIL anyway - } - - $sContentType = $sBodyMainType.'/'.$sBodySubType; - - $sDisposition = null; - $aDispositionParams = null; - $sFileName = null; - - if ($iExtraItemPos < \count($aBodyStructure)) - { - $aDispList = $aBodyStructure[$iExtraItemPos]; - if (\is_array($aDispList) && 1 < \count($aDispList)) - { - if (null !== $aDispList[0]) - { - if (\is_string($aDispList[0]) && 'NIL' !== $aDispList[0]) - { - $sDisposition = $aDispList[0]; - } - else - { - return null; - } - } - } - - $aDispParamList = $aDispList[1]; - if (\is_array($aDispParamList)) - { - $aDispositionParams = self::getKeyValueListFromArrayList($aDispParamList); - if (\is_array($aDispositionParams)) - { - $sFileName = self::decodeAttrParamenter($aDispositionParams, 'filename', $sCharset); - } - } - } - - $iExtraItemPos++; - - $sLanguage = null; - if ($iExtraItemPos < count($aBodyStructure)) - { - if (null !== $aBodyStructure[$iExtraItemPos] && 'NIL' !== $aBodyStructure[$iExtraItemPos]) - { - if (\is_array($aBodyStructure[$iExtraItemPos])) - { - $sLanguage = \implode(',', $aBodyStructure[$iExtraItemPos]); - } - else if (\is_string($aBodyStructure[$iExtraItemPos])) - { - $sLanguage = $aBodyStructure[$iExtraItemPos]; - } - } - $iExtraItemPos++; - } - - $sLocation = null; - if ($iExtraItemPos < \count($aBodyStructure)) - { - if (null !== $aBodyStructure[$iExtraItemPos] && 'NIL' !== $aBodyStructure[$iExtraItemPos]) - { - if (\is_string($aBodyStructure[$iExtraItemPos])) - { - $sLocation = $aBodyStructure[$iExtraItemPos]; - } - } - $iExtraItemPos++; - } - - return new self( - $sContentType, - $sCharset, - $aBodyParams, - $sContentID, - $sDescription, - $sMailEncodingName, - $sDisposition, - $aDispositionParams, - \MailSo\Base\Utils::Utf8Clear((null === $sFileName || 0 === \strlen($sFileName)) ? $sName : $sFileName), - $sLanguage, - $sLocation, - $iSize, - $iTextLineCount, - $sPartID, - $aSubParts - ); - } - } - - /** - * @param array $aBodyStructure - * @param string $sSubPartID - * - * @return \MailSo\Imap\BodyStructure|null - */ - public static function NewInstanceFromRfc822SubPart(array $aBodyStructure, $sSubPartID) - { - $oBody = null; - $aBodySubStructure = self::findPartByIndexInArray($aBodyStructure, $sSubPartID); - if ($aBodySubStructure && \is_array($aBodySubStructure) && isset($aBodySubStructure[8])) - { - $oBody = self::NewInstance($aBodySubStructure[8], $sSubPartID); - } - - return $oBody; - } - - /** - * @param array $aList - * @param string $sPartID - * - * @return array|null - */ - private static function findPartByIndexInArray(array $aList, $sPartID) - { - $bFind = false; - $aPath = \explode('.', ''.$sPartID); - $aCurrentPart = $aList; - - foreach ($aPath as $iPos => $iNum) - { - $iIndex = \intval($iNum) - 1; - if (0 <= $iIndex && 0 < $iPos ? isset($aCurrentPart[8][$iIndex]) : isset($aCurrentPart[$iIndex])) - { - $aCurrentPart = 0 < $iPos ? $aCurrentPart[8][$iIndex] : $aCurrentPart[$iIndex]; - $bFind = true; - } - } - - return $bFind ? $aCurrentPart : null; - } - - /** - * Returns dict with key="charset" and value="US-ASCII" for array ("CHARSET" "US-ASCII"). - * Keys are lowercased (StringDictionary itself does this), values are not altered. - * - * @param array $aList - * - * @return array - */ - private static function getKeyValueListFromArrayList(array $aList) - { - $aDict = null; - if (0 === \count($aList) % 2) - { - $aDict = array(); - for ($iIndex = 0, $iLen = \count($aList); $iIndex < $iLen; $iIndex += 2) - { - if (\is_string($aList[$iIndex]) && isset($aList[$iIndex + 1]) && \is_string($aList[$iIndex + 1])) - { - $aDict[\strtolower($aList[$iIndex])] = $aList[$iIndex + 1]; - } - } - } - - return $aDict; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/FetchType.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/FetchType.php deleted file mode 100755 index fe6a36e1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Enumerations/FetchType.php +++ /dev/null @@ -1,127 +0,0 @@ -GetLastResponse(); - if ($oResponse && $oResponse->IsStatusResponse && !empty($oResponse->HumanReadable) && - isset($oResponse->OptionalResponse[0]) && 'ALERT' === $oResponse->OptionalResponse[0]) - { - $sResult = $oResponse->HumanReadable; - } - - return $sResult; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/ResponseException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/ResponseException.php deleted file mode 100755 index 24f0d8ca..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/ResponseException.php +++ /dev/null @@ -1,57 +0,0 @@ -aResponses = $aResponses; - } - } - - /** - * @return array - */ - public function GetResponses() - { - return $this->aResponses; - } - - /** - * @return \MailSo\Imap\Response|null - */ - public function GetLastResponse() - { - return 0 < count($this->aResponses) ? $this->aResponses[count($this->aResponses) - 1] : null; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/ResponseNotFoundException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/ResponseNotFoundException.php deleted file mode 100755 index 2d4d0296..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Exceptions/ResponseNotFoundException.php +++ /dev/null @@ -1,19 +0,0 @@ -oImapResponse = $oImapResponse; - $this->aEnvelopeCache = null; - } - - /** - * @param \MailSo\Imap\Response $oImapResponse - * @return \MailSo\Imap\FetchResponse - */ - public static function NewInstance($oImapResponse) - { - return new self($oImapResponse); - } - - /** - * @param bool $bForce = false - * - * @return array|null - */ - public function GetEnvelope($bForce = false) - { - if (null === $this->aEnvelopeCache || $bForce) - { - $this->aEnvelopeCache = $this->GetFetchValue(Enumerations\FetchType::ENVELOPE); - } - return $this->aEnvelopeCache; - } - - /** - * @param int $iIndex - * @param mixed $mNullResult = null - * - * @return mixed - */ - public function GetFetchEnvelopeValue($iIndex, $mNullResult) - { - return self::findEnvelopeIndex($this->GetEnvelope(), $iIndex, $mNullResult); - } - - /** - * @param int $iIndex - * @param string $sParentCharset = \MailSo\Base\Enumerations\Charset::ISO_8859_1 - * - * @return \MailSo\Mime\EmailCollection|null - */ - public function GetFetchEnvelopeEmailCollection($iIndex, $sParentCharset = \MailSo\Base\Enumerations\Charset::ISO_8859_1) - { - $oResult = null; - $aEmails = $this->GetFetchEnvelopeValue($iIndex, null); - if (is_array($aEmails) && 0 < count($aEmails)) - { - $oResult = \MailSo\Mime\EmailCollection::NewInstance(); - foreach ($aEmails as $aEmailItem) - { - if (is_array($aEmailItem) && 4 === count($aEmailItem)) - { - $sDisplayName = \MailSo\Base\Utils::DecodeHeaderValue( - self::findEnvelopeIndex($aEmailItem, 0, ''), $sParentCharset); - -// $sRemark = \MailSo\Base\Utils::DecodeHeaderValue( -// self::findEnvelopeIndex($aEmailItem, 1, ''), $sParentCharset); - - $sLocalPart = self::findEnvelopeIndex($aEmailItem, 2, ''); - $sDomainPart = self::findEnvelopeIndex($aEmailItem, 3, ''); - - if (0 < strlen($sLocalPart) && 0 < strlen($sDomainPart)) - { - $oResult->Add( - \MailSo\Mime\Email::NewInstance($sLocalPart.'@'.$sDomainPart, $sDisplayName) - ); - } - } - } - } - - return $oResult; - } - - /** - * @param string $sRfc822SubMimeIndex = '' - * - * @return \MailSo\Imap\BodyStructure|null - */ - public function GetFetchBodyStructure($sRfc822SubMimeIndex = '') - { - $oBodyStructure = null; - $aBodyStructureArray = $this->GetFetchValue(Enumerations\FetchType::BODYSTRUCTURE); - - if (is_array($aBodyStructureArray)) - { - if (0 < strlen($sRfc822SubMimeIndex)) - { - $oBodyStructure = BodyStructure::NewInstanceFromRfc822SubPart($aBodyStructureArray, $sRfc822SubMimeIndex); - } - else - { - $oBodyStructure = BodyStructure::NewInstance($aBodyStructureArray); - } - } - - return $oBodyStructure; - } - - /** - * @param string $sFetchItemName - * - * @return mixed - */ - public function GetFetchValue($sFetchItemName) - { - $mReturn = null; - $bNextIsValue = false; - - if (Enumerations\FetchType::INDEX === $sFetchItemName) - { - $mReturn = $this->oImapResponse->ResponseList[1]; - } - else if (isset($this->oImapResponse->ResponseList[3]) && \is_array($this->oImapResponse->ResponseList[3])) - { - foreach ($this->oImapResponse->ResponseList[3] as $mItem) - { - if ($bNextIsValue) - { - $mReturn = $mItem; - break; - } - - if ($sFetchItemName === $mItem) - { - $bNextIsValue = true; - } - } - } - - return $mReturn; - } - - /** - * @param string $sRfc822SubMimeIndex = '' - * - * @return string - */ - public function GetHeaderFieldsValue($sRfc822SubMimeIndex = '') - { - $sReturn = ''; - $bNextIsValue = false; - - $sRfc822SubMimeIndex = 0 < \strlen($sRfc822SubMimeIndex) ? ''.$sRfc822SubMimeIndex.'.' : ''; - - if (isset($this->oImapResponse->ResponseList[3]) && \is_array($this->oImapResponse->ResponseList[3])) - { - foreach ($this->oImapResponse->ResponseList[3] as $mItem) - { - if ($bNextIsValue) - { - $sReturn = (string) $mItem; - break; - } - - if (\is_string($mItem) && ( - $mItem === 'BODY['.$sRfc822SubMimeIndex.'HEADER]' || - 0 === \strpos($mItem, 'BODY['.$sRfc822SubMimeIndex.'HEADER.FIELDS') || - $mItem === 'BODY['.$sRfc822SubMimeIndex.'MIME]')) - { - $bNextIsValue = true; - } - } - } - - return $sReturn; - } - - private static function findFetchUidAndSize($aList) - { - $bUid = false; - $bSize = false; - if (is_array($aList)) - { - foreach ($aList as $mItem) - { - if (\MailSo\Imap\Enumerations\FetchType::UID === $mItem) - { - $bUid = true; - } - else if (\MailSo\Imap\Enumerations\FetchType::RFC822_SIZE === $mItem) - { - $bSize = true; - } - } - } - - return $bUid && $bSize; - } - - /** - * @param \MailSo\Imap\Response $oImapResponse - * - * @return bool - */ - public static function IsValidFetchImapResponse($oImapResponse) - { - return ( - $oImapResponse - && true !== $oImapResponse->IsStatusResponse - && \MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType - && 3 < count($oImapResponse->ResponseList) && 'FETCH' === $oImapResponse->ResponseList[2] - && is_array($oImapResponse->ResponseList[3]) - ); - } - - /** - * @param \MailSo\Imap\Response $oImapResponse - * - * @return bool - */ - public static function IsNotEmptyFetchImapResponse($oImapResponse) - { - return ( - $oImapResponse - && self::IsValidFetchImapResponse($oImapResponse) - && isset($oImapResponse->ResponseList[3]) - && self::findFetchUidAndSize($oImapResponse->ResponseList[3]) - ); - } - - /** - * @param array $aEnvelope - * @param int $iIndex - * @param mixed $mNullResult = null - * - * @return mixed - */ - private static function findEnvelopeIndex($aEnvelope, $iIndex, $mNullResult) - { - return (isset($aEnvelope[$iIndex]) && 'NIL' !== $aEnvelope[$iIndex] && '' !== $aEnvelope[$iIndex]) - ? $aEnvelope[$iIndex] : $mNullResult; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Folder.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Folder.php deleted file mode 100755 index 50fd4233..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Folder.php +++ /dev/null @@ -1,193 +0,0 @@ -sNameRaw = ''; - $this->sFullNameRaw = ''; - $this->sDelimiter = ''; - $this->aFlags = array(); - $this->aExtended = array(); - - $sDelimiter = 'NIL' === \strtoupper($sDelimiter) ? '' : $sDelimiter; - if (empty($sDelimiter)) - { - $sDelimiter = '.'; // default delimiter - } - - if (!\is_array($aFlags) || - !\is_string($sDelimiter) || 1 < \strlen($sDelimiter) || - !\is_string($sFullNameRaw) || 0 === \strlen($sFullNameRaw)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $this->sFullNameRaw = $sFullNameRaw; - $this->sDelimiter = $sDelimiter; - $this->aFlags = $aFlags; - $this->aFlagsLowerCase = \array_map('strtolower', $this->aFlags); - - $this->sFullNameRaw = 'INBOX'.$this->sDelimiter === \substr(\strtoupper($this->sFullNameRaw), 0, 5 + \strlen($this->sDelimiter)) ? - 'INBOX'.\substr($this->sFullNameRaw, 5) : $this->sFullNameRaw; - - if ($this->IsInbox()) - { - $this->sFullNameRaw = 'INBOX'; - } - - $this->sNameRaw = $this->sFullNameRaw; - if (0 < \strlen($this->sDelimiter)) - { - $aNames = \explode($this->sDelimiter, $this->sFullNameRaw); - if (false !== \array_search('', $aNames)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $this->sNameRaw = \end($aNames); - } - } - - /** - * @param string $sFullNameRaw - * @param string $sDelimiter = '.' - * @param array $aFlags = array() - * - * @return \MailSo\Imap\Folder - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public static function NewInstance($sFullNameRaw, $sDelimiter = '.', $aFlags = array()) - { - return new self($sFullNameRaw, $sDelimiter, $aFlags); - } - - /** - * @return string - */ - public function NameRaw() - { - return $this->sNameRaw; - } - - /** - * @return string - */ - public function FullNameRaw() - { - return $this->sFullNameRaw; - } - - /** - * @return string | null - */ - public function Delimiter() - { - return $this->sDelimiter; - } - - /** - * @return array - */ - public function Flags() - { - return $this->aFlags; - } - - /** - * @return array - */ - public function FlagsLowerCase() - { - return $this->aFlagsLowerCase; - } - - /** - * @return bool - */ - public function IsSelectable() - { - return !\in_array('\noselect', $this->aFlagsLowerCase); - } - - /** - * @return bool - */ - public function IsInbox() - { - return 'INBOX' === \strtoupper($this->sFullNameRaw) || \in_array('\inbox', $this->aFlagsLowerCase); - } - - /** - * @param string $sName - * @param mixed $mData - */ - public function SetExtended($sName, $mData) - { - $this->aExtended[$sName] = $mData; - } - - /** - * @param string $sName - * @return mixed - */ - public function GetExtended($sName) - { - return isset($this->aExtended[$sName]) ? $this->aExtended[$sName] : null; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/FolderInformation.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/FolderInformation.php deleted file mode 100755 index bc7118d5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/FolderInformation.php +++ /dev/null @@ -1,112 +0,0 @@ -FolderName = $sFolderName; - $this->IsWritable = $bIsWritable; - $this->Exists = null; - $this->Recent = null; - $this->Flags = array(); - $this->PermanentFlags = array(); - - $this->Unread = null; - $this->Uidnext = null; - $this->HighestModSeq = null; - } - - /** - * @param string $sFolderName - * @param bool $bIsWritable - * - * @return \MailSo\Imap\FolderInformation - */ - public static function NewInstance($sFolderName, $bIsWritable) - { - return new self($sFolderName, $bIsWritable); - } - - /** - * @param string $sFlag - * - * @return bool - */ - public function IsFlagSupported($sFlag) - { - return \in_array('\\*', $this->PermanentFlags) || - \in_array($sFlag, $this->PermanentFlags) || - \in_array($sFlag, $this->Flags); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/ImapClient.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/ImapClient.php deleted file mode 100755 index 9e01e2c1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/ImapClient.php +++ /dev/null @@ -1,2667 +0,0 @@ -iTagCount = 0; - $this->aCapabilityItems = null; - $this->oCurrentFolderInfo = null; - $this->aFetchCallbacks = null; - $this->iResponseBufParsedPos = 0; - - $this->aLastResponse = array(); - $this->bNeedNext = true; - $this->aPartialResponses = array(); - - $this->aTagTimeouts = array(); - - $this->bIsLoggined = false; - $this->bIsSelected = false; - $this->sLogginedUser = ''; - - $this->__FORCE_SELECT_ON_EXAMINE__ = false; - - @\ini_set('xdebug.max_nesting_level', 500); - } - - /** - * @return \MailSo\Imap\ImapClient - */ - public static function NewInstance() - { - return new self(); - } - - /** - * @return string - */ - public function GetLogginedUser() - { - return $this->sLogginedUser; - } - - /** - * @param string $sServerName - * @param int $iPort = 143 - * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT - * @param bool $bVerifySsl = false - * @param bool $bAllowSelfSigned = true - * - * @return \MailSo\Imap\ImapClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function Connect($sServerName, $iPort = 143, - $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT, - $bVerifySsl = false, $bAllowSelfSigned = true) - { - $this->aTagTimeouts['*'] = \microtime(true); - - parent::Connect($sServerName, $iPort, $iSecurityType, $bVerifySsl, $bAllowSelfSigned); - - $this->parseResponseWithValidation('*', true); - - if (\MailSo\Net\Enumerations\ConnectionSecurityType::UseStartTLS( - $this->IsSupported('STARTTLS'), $this->iSecurityType)) - { - $this->SendRequestWithCheck('STARTTLS'); - $this->EnableCrypto(); - - $this->aCapabilityItems = null; - } - else if (\MailSo\Net\Enumerations\ConnectionSecurityType::STARTTLS === $this->iSecurityType) - { - $this->writeLogException( - new \MailSo\Net\Exceptions\SocketUnsuppoterdSecureConnectionException('STARTTLS is not supported'), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - return $this; - } - - protected function _xor($string, $string2) - { - $result = ''; - $size = strlen($string); - for ($i=0; $i<$size; $i++) { - $result .= chr(ord($string[$i]) ^ ord($string2[$i])); - } - return $result; - } - - /** - * @param string $sLogin - * @param string $sPassword - * @param string $sProxyAuthUser = '' - * @param bool $bUseAuthPlainIfSupported = true - * @param bool $bUseAuthCramMd5IfSupported = true - * - * @return \MailSo\Imap\ImapClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function Login($sLogin, $sPassword, $sProxyAuthUser = '', - $bUseAuthPlainIfSupported = true, $bUseAuthCramMd5IfSupported = true) - { - if (!\MailSo\Base\Validator::NotEmptyString($sLogin, true) || - !\MailSo\Base\Validator::NotEmptyString($sPassword, true)) - { - $this->writeLogException( - new \MailSo\Base\Exceptions\InvalidArgumentException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - $sLogin = \MailSo\Base\Utils::IdnToAscii(\MailSo\Base\Utils::Trim($sLogin)); - - $sPassword = $sPassword; - - $this->sLogginedUser = $sLogin; - - try - { - if ($bUseAuthCramMd5IfSupported && $this->IsSupported('AUTH=CRAM-MD5')) - { - $this->SendRequest('AUTHENTICATE', array('CRAM-MD5')); - - $aResponse = $this->parseResponseWithValidation(); - if ($aResponse && \is_array($aResponse) && 0 < \count($aResponse) && - \MailSo\Imap\Enumerations\ResponseType::CONTINUATION === $aResponse[\count($aResponse) - 1]->ResponseType) - { - $oContinuationResponse = null; - foreach ($aResponse as $oResponse) - { - if ($oResponse && \MailSo\Imap\Enumerations\ResponseType::CONTINUATION === $oResponse->ResponseType) - { - $oContinuationResponse = $oResponse; - } - } - - if ($oContinuationResponse && !empty($oContinuationResponse->ResponseList[1])) - { - $sTicket = @\base64_decode($oContinuationResponse->ResponseList[1]); - $this->oLogger->Write('ticket: '.$sTicket); - - $sToken = \base64_encode($sLogin.' '.\MailSo\Base\Utils::Hmac($sTicket, $sPassword)); - - if ($this->oLogger) - { - $this->oLogger->AddSecret($sToken); - } - - $this->sendRaw($sToken, true, '*******'); - $this->parseResponseWithValidation(); - } - else - { - $this->writeLogException( - new \MailSo\Imap\Exceptions\LoginException(), - \MailSo\Log\Enumerations\Type::NOTICE, true); - } - } - else - { - $this->writeLogException( - new \MailSo\Imap\Exceptions\LoginException(), - \MailSo\Log\Enumerations\Type::NOTICE, true); - } - } - else if ($bUseAuthPlainIfSupported && $this->IsSupported('AUTH=PLAIN')) - { - $sToken = \base64_encode("\0".$sLogin."\0".$sPassword); - if ($this->oLogger) - { - $this->oLogger->AddSecret($sToken); - } - - if ($this->IsSupported('AUTH=SASL-IR') && false) - { - $this->SendRequestWithCheck('AUTHENTICATE', array('PLAIN', $sToken)); - } - else - { - $this->SendRequest('AUTHENTICATE', array('PLAIN')); - $this->parseResponseWithValidation(); - - $this->sendRaw($sToken, true, '*******'); - $this->parseResponseWithValidation(); - } - } - else - { - if ($this->oLogger) - { - $this->oLogger->AddSecret($this->EscapeString($sPassword)); - } - - $this->SendRequestWithCheck('LOGIN', - array( - $this->EscapeString($sLogin), - $this->EscapeString($sPassword) - )); - } -// else -// { -// $this->writeLogException( -// new \MailSo\Imap\Exceptions\LoginBadMethodException(), -// \MailSo\Log\Enumerations\Type::NOTICE, true); -// } - - if (0 < \strlen($sProxyAuthUser)) - { - $this->SendRequestWithCheck('PROXYAUTH', array($this->EscapeString($sProxyAuthUser))); - } - } - catch (\MailSo\Imap\Exceptions\NegativeResponseException $oException) - { - $this->writeLogException( - new \MailSo\Imap\Exceptions\LoginBadCredentialsException( - $oException->GetResponses(), '', 0, $oException), - \MailSo\Log\Enumerations\Type::NOTICE, true); - } - - $this->bIsLoggined = true; - $this->aCapabilityItems = null; - - return $this; - } - - /** - * @param string $sXOAuth2Token - * - * @return \MailSo\Imap\ImapClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function LoginWithXOauth2($sXOAuth2Token) - { - if (!\MailSo\Base\Validator::NotEmptyString($sXOAuth2Token, true)) - { - $this->writeLogException( - new \MailSo\Base\Exceptions\InvalidArgumentException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - if (!$this->IsSupported('AUTH=XOAUTH2')) - { - $this->writeLogException( - new \MailSo\Imap\Exceptions\LoginBadMethodException(), - \MailSo\Log\Enumerations\Type::NOTICE, true); - } - - try - { - $this->SendRequest('AUTHENTICATE', array('XOAUTH2', \trim($sXOAuth2Token))); - $aR = $this->parseResponseWithValidation(); - - if (\is_array($aR) && 0 < \count($aR) && isset($aR[\count($aR) - 1])) - { - $oR = $aR[\count($aR) - 1]; - if (\MailSo\Imap\Enumerations\ResponseType::CONTINUATION === $oR->ResponseType) - { - if (!empty($oR->ResponseList[1]) && preg_match('/^[a-zA-Z0-9=+\/]+$/', $oR->ResponseList[1])) - { - $this->Logger()->Write(\base64_decode($oR->ResponseList[1]), - \MailSo\Log\Enumerations\Type::WARNING); - } - - $this->sendRaw(''); - $this->parseResponseWithValidation(); - } - } - } - catch (\MailSo\Imap\Exceptions\NegativeResponseException $oException) - { - $this->writeLogException( - new \MailSo\Imap\Exceptions\LoginBadCredentialsException( - $oException->GetResponses(), '', 0, $oException), - \MailSo\Log\Enumerations\Type::NOTICE, true); - } - - $this->bIsLoggined = true; - $this->aCapabilityItems = null; - - return $this; - } - - /** - * @return \MailSo\Imap\ImapClient - * - * @throws \MailSo\Net\Exceptions\Exception - */ - public function Logout() - { - if ($this->bIsLoggined) - { - $this->bIsLoggined = false; - $this->SendRequestWithCheck('LOGOUT', array()); - } - - return $this; - } - - /** - * @return \MailSo\Imap\ImapClient - */ - public function ForceCloseConnection() - { - $this->Disconnect(); - - return $this; - } - - /** - * @return bool - */ - public function IsLoggined() - { - return $this->IsConnected() && $this->bIsLoggined; - } - - /** - * @return bool - */ - public function IsSelected() - { - return $this->IsLoggined() && $this->bIsSelected; - } - - /** - * @return array|null - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function Capability() - { - $this->SendRequestWithCheck('CAPABILITY', array(), true); - return $this->aCapabilityItems; - } - - /** - * @param string $sExtentionName - * @return bool - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function IsSupported($sExtentionName) - { - $bResult = \MailSo\Base\Validator::NotEmptyString($sExtentionName, true); - if ($bResult && null === $this->aCapabilityItems) - { - $this->aCapabilityItems = $this->Capability(); - } - - return $bResult && \is_array($this->aCapabilityItems) && - \in_array(\strtoupper($sExtentionName), $this->aCapabilityItems); - } - - /** - * @return \MailSo\Imap\NamespaceResult|null - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function GetNamespace() - { - if (!$this->IsSupported('NAMESPACE')) - { - return null; - } - - $oReturn = false; - - $this->SendRequest('NAMESPACE'); - $aResult = $this->parseResponseWithValidation(); - - $oImapResponse = null; - foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) - { - if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType && - 'NAMESPACE' === $oImapResponse->StatusOrIndex) - { - $oReturn = NamespaceResult::NewInstance(); - $oReturn->InitByImapResponse($oImapResponse); - break; - } - } - - if (false === $oReturn) - { - $this->writeLogException( - new \MailSo\Imap\Exceptions\ResponseException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - return $oReturn; - } - - /** - * @return \MailSo\Imap\ImapClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function Noop() - { - return $this->SendRequestWithCheck('NOOP'); - } - - /** - * @param string $sFolderName - * - * @return \MailSo\Imap\ImapClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function FolderCreate($sFolderName) - { - return $this->SendRequestWithCheck('CREATE', - array($this->EscapeString($sFolderName))); - } - - /** - * @param string $sFolderName - * - * @return \MailSo\Imap\ImapClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function FolderDelete($sFolderName) - { - return $this->SendRequestWithCheck('DELETE', - array($this->EscapeString($sFolderName))); - } - - /** - * @param string $sFolderName - * - * @return \MailSo\Imap\ImapClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function FolderSubscribe($sFolderName) - { - return $this->SendRequestWithCheck('SUBSCRIBE', - array($this->EscapeString($sFolderName))); - } - - /** - * @param string $sFolderName - * - * @return \MailSo\Imap\ImapClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function FolderUnSubscribe($sFolderName) - { - return $this->SendRequestWithCheck('UNSUBSCRIBE', - array($this->EscapeString($sFolderName))); - } - - /** - * @param string $sOldFolderName - * @param string $sNewFolderName - * - * @return \MailSo\Imap\ImapClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function FolderRename($sOldFolderName, $sNewFolderName) - { - return $this->SendRequestWithCheck('RENAME', array( - $this->EscapeString($sOldFolderName), - $this->EscapeString($sNewFolderName))); - } - - /** - * @param array $aResult - * - * @return array - */ - protected function getStatusFolderInformation($aResult) - { - $aReturn = array(); - - if (\is_array($aResult)) - { - $oImapResponse = null; - foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) - { - if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType && - 'STATUS' === $oImapResponse->StatusOrIndex && isset($oImapResponse->ResponseList[3]) && - \is_array($oImapResponse->ResponseList[3])) - { - $sName = null; - foreach ($oImapResponse->ResponseList[3] as $sArrayItem) - { - if (null === $sName) - { - $sName = $sArrayItem; - } - else - { - $aReturn[$sName] = $sArrayItem; - $sName = null; - } - } - } - } - } - - return $aReturn; - } - - /** - * @param string $sFolderName - * @param array $aStatusItems - * - * @return array|bool - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function FolderStatus($sFolderName, array $aStatusItems) - { - $aResult = false; - if (\count($aStatusItems) > 0) - { - $this->SendRequest('STATUS', - array($this->EscapeString($sFolderName), $aStatusItems)); - - $aResult = $this->getStatusFolderInformation( - $this->parseResponseWithValidation()); - } - - return $aResult; - } - - /** - * @param array $aResult - * @param string $sStatus - * @param bool $bUseListStatus = false - * - * @return array - */ - private function getFoldersFromResult(array $aResult, $sStatus, $bUseListStatus = false) - { - $aReturn = array(); - - $sDelimiter = ''; - $bInbox = false; - - $oImapResponse = null; - foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) - { - if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType && - $sStatus === $oImapResponse->StatusOrIndex && 5 === count($oImapResponse->ResponseList)) - { - try - { - $oFolder = Folder::NewInstance($oImapResponse->ResponseList[4], - $oImapResponse->ResponseList[3], $oImapResponse->ResponseList[2]); - - if ($oFolder->IsInbox()) - { - $bInbox = true; - } - - if (empty($sDelimiter)) - { - $sDelimiter = $oFolder->Delimiter(); - } - - $aReturn[] = $oFolder; - } - catch (\MailSo\Base\Exceptions\InvalidArgumentException $oException) - { - $this->writeLogException($oException, \MailSo\Log\Enumerations\Type::WARNING, false); - } - } - } - - if (!$bInbox && !empty($sDelimiter)) - { - $aReturn[] = Folder::NewInstance('INBOX', $sDelimiter); - } - - if ($bUseListStatus) - { - foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) - { - if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType && - 'STATUS' === $oImapResponse->StatusOrIndex && - isset($oImapResponse->ResponseList[2]) && - isset($oImapResponse->ResponseList[3]) && - \is_array($oImapResponse->ResponseList[3])) - { - $sFolderNameRaw = $oImapResponse->ResponseList[2]; - - $oCurrentFolder = null; - foreach ($aReturn as &$oFolder) - { - if ($oFolder && $sFolderNameRaw === $oFolder->FullNameRaw()) - { - $oCurrentFolder =& $oFolder; - break; - } - } - - if (null !== $oCurrentFolder) - { - $sName = null; - $aStatus = array(); - - foreach ($oImapResponse->ResponseList[3] as $sArrayItem) - { - if (null === $sName) - { - $sName = $sArrayItem; - } - else - { - $aStatus[$sName] = $sArrayItem; - $sName = null; - } - } - - if (0 < count($aStatus)) - { - $oCurrentFolder->SetExtended('STATUS', $aStatus); - } - } - - unset($oCurrentFolder); - } - } - } - - return $aReturn; - } - - /** - * @param bool $bIsSubscribeList - * @param string $sParentFolderName = '' - * @param string $sListPattern = '*' - * @param bool $bUseListStatus = false - * - * @return array - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - private function specificFolderList($bIsSubscribeList, $sParentFolderName = '', $sListPattern = '*', $bUseListStatus = false) - { - $sCmd = 'LSUB'; - if (!$bIsSubscribeList) - { - $sCmd = 'LIST'; - } - - $sListPattern = 0 === strlen(trim($sListPattern)) ? '*' : $sListPattern; - - $aParameters = array( - $this->EscapeString($sParentFolderName), - $this->EscapeString($sListPattern) - ); - - if ($bUseListStatus && !$bIsSubscribeList && $this->IsSupported('LIST-STATUS')) - { - $aL = array( - \MailSo\Imap\Enumerations\FolderStatus::MESSAGES, - \MailSo\Imap\Enumerations\FolderStatus::UNSEEN, - \MailSo\Imap\Enumerations\FolderStatus::UIDNEXT - ); - -// if ($this->IsSupported('CONDSTORE')) -// { -// $aL[] = \MailSo\Imap\Enumerations\FolderStatus::HIGHESTMODSEQ; -// } - - $aParameters[] = 'RETURN'; - $aParameters[] = array('STATUS', $aL); - } - else - { - $bUseListStatus = false; - } - - $this->SendRequest($sCmd, $aParameters); - - return $this->getFoldersFromResult( - $this->parseResponseWithValidation(), $sCmd, $bUseListStatus); - } - - /** - * @param string $sParentFolderName = '' - * @param string $sListPattern = '*' - * - * @return array - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function FolderList($sParentFolderName = '', $sListPattern = '*') - { - return $this->specificFolderList(false, $sParentFolderName, $sListPattern); - } - - /** - * @param string $sParentFolderName = '' - * @param string $sListPattern = '*' - * - * @return array - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function FolderSubscribeList($sParentFolderName = '', $sListPattern = '*') - { - return $this->specificFolderList(true, $sParentFolderName, $sListPattern); - } - - /** - * @param string $sParentFolderName = '' - * @param string $sListPattern = '*' - * - * @return array - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function FolderStatusList($sParentFolderName = '', $sListPattern = '*') - { - return $this->specificFolderList(false, $sParentFolderName, $sListPattern, true); - } - - /** - * @param array $aResult - * @param string $sFolderName - * @param bool $bIsWritable - * - * @return void - */ - protected function initCurrentFolderInformation($aResult, $sFolderName, $bIsWritable) - { - if (\is_array($aResult)) - { - $oImapResponse = null; - $oResult = FolderInformation::NewInstance($sFolderName, $bIsWritable); - - foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) - { - if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType) - { - if (\count($oImapResponse->ResponseList) > 2 && - 'FLAGS' === $oImapResponse->ResponseList[1] && \is_array($oImapResponse->ResponseList[2])) - { - $oResult->Flags = $oImapResponse->ResponseList[2]; - } - - if (is_array($oImapResponse->OptionalResponse) && \count($oImapResponse->OptionalResponse) > 1) - { - if ('PERMANENTFLAGS' === $oImapResponse->OptionalResponse[0] && - is_array($oImapResponse->OptionalResponse[1])) - { - $oResult->PermanentFlags = $oImapResponse->OptionalResponse[1]; - } - else if ('UIDVALIDITY' === $oImapResponse->OptionalResponse[0] && - isset($oImapResponse->OptionalResponse[1])) - { - $oResult->Uidvalidity = $oImapResponse->OptionalResponse[1]; - } - else if ('UNSEEN' === $oImapResponse->OptionalResponse[0] && - isset($oImapResponse->OptionalResponse[1]) && - is_numeric($oImapResponse->OptionalResponse[1])) - { - $oResult->Unread = (int) $oImapResponse->OptionalResponse[1]; - } - else if ('UIDNEXT' === $oImapResponse->OptionalResponse[0] && - isset($oImapResponse->OptionalResponse[1])) - { - $oResult->Uidnext = $oImapResponse->OptionalResponse[1]; - } - else if ('HIGHESTMODSEQ' === $oImapResponse->OptionalResponse[0] && - isset($oImapResponse->OptionalResponse[1]) && - \is_numeric($oImapResponse->OptionalResponse[1])) - { - $oResult->HighestModSeq = \trim($oImapResponse->OptionalResponse[1]); - } - } - - if (\count($oImapResponse->ResponseList) > 2 && - \is_string($oImapResponse->ResponseList[2]) && - \is_numeric($oImapResponse->ResponseList[1])) - { - switch($oImapResponse->ResponseList[2]) - { - case 'EXISTS': - $oResult->Exists = (int) $oImapResponse->ResponseList[1]; - break; - case 'RECENT': - $oResult->Recent = (int) $oImapResponse->ResponseList[1]; - break; - } - } - } - } - - $this->oCurrentFolderInfo = $oResult; - } - } - - /** - * @param string $sFolderName - * @param bool $bIsWritable - * @param bool $bReSelectSameFolders - * - * @return \MailSo\Imap\ImapClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - protected function selectOrExamineFolder($sFolderName, $bIsWritable, $bReSelectSameFolders) - { - if (!$bReSelectSameFolders) - { - if ($this->oCurrentFolderInfo && - $sFolderName === $this->oCurrentFolderInfo->FolderName && - $bIsWritable === $this->oCurrentFolderInfo->IsWritable) - { - return $this; - } - } - - if (!\MailSo\Base\Validator::NotEmptyString($sFolderName, true)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $this->SendRequest(($bIsWritable) ? 'SELECT' : 'EXAMINE', - array($this->EscapeString($sFolderName))); - - $this->initCurrentFolderInformation( - $this->parseResponseWithValidation(), $sFolderName, $bIsWritable); - - $this->bIsSelected = true; - - return $this; - } - - /** - * @param string $sFolderName - * @param bool $bReSelectSameFolders = false - * - * @return \MailSo\Imap\ImapClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function FolderSelect($sFolderName, $bReSelectSameFolders = false) - { - return $this->selectOrExamineFolder($sFolderName, true, $bReSelectSameFolders); - } - - /** - * @param string $sFolderName - * @param bool $bReSelectSameFolders = false - * - * @return \MailSo\Imap\ImapClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function FolderExamine($sFolderName, $bReSelectSameFolders = false) - { - return $this->selectOrExamineFolder($sFolderName, $this->__FORCE_SELECT_ON_EXAMINE__, $bReSelectSameFolders); - } - - /** - * @return \MailSo\Imap\ImapClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function FolderUnSelect() - { - if ($this->IsSelected() && $this->IsSupported('UNSELECT')) - { - $this->SendRequestWithCheck('UNSELECT'); - $this->bIsSelected = false; - } - - return $this; - } - - /** - * @param array $aInputFetchItems - * @param string $sIndexRange - * @param bool $bIndexIsUid - * - * @return array - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function Fetch(array $aInputFetchItems, $sIndexRange, $bIndexIsUid) - { - $sIndexRange = (string) $sIndexRange; - if (!\MailSo\Base\Validator::NotEmptyString($sIndexRange, true)) - { - $this->writeLogException( - new \MailSo\Base\Exceptions\InvalidArgumentException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - $aFetchItems = \MailSo\Imap\Enumerations\FetchType::ChangeFetchItemsBefourRequest($aInputFetchItems); - foreach ($aFetchItems as $sName => $mItem) - { - if (0 < \strlen($sName) && '' !== $mItem) - { - if (null === $this->aFetchCallbacks) - { - $this->aFetchCallbacks = array(); - } - - $this->aFetchCallbacks[$sName] = $mItem; - } - } - - $this->SendRequest((($bIndexIsUid) ? 'UID ' : '').'FETCH', array($sIndexRange, \array_keys($aFetchItems))); - $aResult = $this->validateResponse($this->parseResponse()); - $this->aFetchCallbacks = null; - - $aReturn = array(); - $oImapResponse = null; - foreach ($aResult as $oImapResponse) - { - if (FetchResponse::IsValidFetchImapResponse($oImapResponse)) - { - if (FetchResponse::IsNotEmptyFetchImapResponse($oImapResponse)) - { - $aReturn[] = FetchResponse::NewInstance($oImapResponse); - } - else - { - if ($this->oLogger) - { - $this->oLogger->Write('Skipped Imap Response! ['.$oImapResponse->ToLine().']', \MailSo\Log\Enumerations\Type::NOTICE); - } - } - } - } - - return $aReturn; - } - - - /** - * @return array|false - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function Quota() - { - $aReturn = false; - if ($this->IsSupported('QUOTA')) - { - $this->SendRequest('GETQUOTAROOT "INBOX"'); - $aResult = $this->parseResponseWithValidation(); - - $aReturn = array(0, 0); - $oImapResponse = null; - foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) - { - if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType - && 'QUOTA' === $oImapResponse->StatusOrIndex - && \is_array($oImapResponse->ResponseList) - && isset($oImapResponse->ResponseList[3]) - && \is_array($oImapResponse->ResponseList[3]) - && 2 < \count($oImapResponse->ResponseList[3]) - && 'STORAGE' === \strtoupper($oImapResponse->ResponseList[3][0]) - && \is_numeric($oImapResponse->ResponseList[3][1]) - && \is_numeric($oImapResponse->ResponseList[3][2]) - ) - { - $aReturn = array( - (int) $oImapResponse->ResponseList[3][1], - (int) $oImapResponse->ResponseList[3][2], - 0, - 0 - ); - - if (5 < \count($oImapResponse->ResponseList[3]) - && 'MESSAGE' === \strtoupper($oImapResponse->ResponseList[3][3]) - && \is_numeric($oImapResponse->ResponseList[3][4]) - && \is_numeric($oImapResponse->ResponseList[3][5]) - ) - { - $aReturn[2] = (int) $oImapResponse->ResponseList[3][4]; - $aReturn[3] = (int) $oImapResponse->ResponseList[3][5]; - } - } - } - } - - return $aReturn; - } - - /** - * @param array $aSortTypes - * @param string $sSearchCriterias - * @param bool $bReturnUid - * - * @return array - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function MessageSimpleSort($aSortTypes, $sSearchCriterias = 'ALL', $bReturnUid = true) - { - $sCommandPrefix = ($bReturnUid) ? 'UID ' : ''; - $sSearchCriterias = !\MailSo\Base\Validator::NotEmptyString($sSearchCriterias, true) || '*' === $sSearchCriterias - ? 'ALL' : $sSearchCriterias; - - if (!\is_array($aSortTypes) || 0 === \count($aSortTypes)) - { - $this->writeLogException( - new \MailSo\Base\Exceptions\InvalidArgumentException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - else if (!$this->IsSupported('SORT')) - { - $this->writeLogException( - new \MailSo\Base\Exceptions\InvalidArgumentException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - $aRequest = array(); - $aRequest[] = $aSortTypes; - $aRequest[] = \MailSo\Base\Utils::IsAscii($sSearchCriterias) ? 'US-ASCII' : 'UTF-8'; - $aRequest[] = $sSearchCriterias; - - $sCmd = 'SORT'; - - $this->SendRequest($sCommandPrefix.$sCmd, $aRequest); - $aResult = $this->parseResponseWithValidation(); - - $aReturn = array(); - $oImapResponse = null; - foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) - { - if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType - && ($sCmd === $oImapResponse->StatusOrIndex || - ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex) && !empty($oImapResponse->ResponseList[2]) && - $sCmd === $oImapResponse->ResponseList[2]) - && \is_array($oImapResponse->ResponseList) - && 2 < \count($oImapResponse->ResponseList)) - { - $iStart = 2; - if ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex && - !empty($oImapResponse->ResponseList[2]) && - $sCmd === $oImapResponse->ResponseList[2]) - { - $iStart = 3; - } - - for ($iIndex = $iStart, $iLen = \count($oImapResponse->ResponseList); $iIndex < $iLen; $iIndex++) - { - $aReturn[] = (int) $oImapResponse->ResponseList[$iIndex]; - } - } - } - - return $aReturn; - } - - /** - * @param bool $bSort = false - * @param string $sSearchCriterias = 'ALL' - * @param array $aSearchOrSortReturn = null - * @param bool $bReturnUid = true - * @param string $sLimit = '' - * @param string $sCharset = '' - * @param array $aSortTypes = null - * - * @return array - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - private function simpleESearchOrESortHelper($bSort = false, $sSearchCriterias = 'ALL', $aSearchOrSortReturn = null, $bReturnUid = true, $sLimit = '', $sCharset = '', $aSortTypes = null) - { - $sCommandPrefix = ($bReturnUid) ? 'UID ' : ''; - $sSearchCriterias = 0 === \strlen($sSearchCriterias) || '*' === $sSearchCriterias - ? 'ALL' : $sSearchCriterias; - - $sCmd = $bSort ? 'SORT': 'SEARCH'; - if ($bSort && (!\is_array($aSortTypes) || 0 === \count($aSortTypes) || !$this->IsSupported('SORT'))) - { - $this->writeLogException( - new \MailSo\Base\Exceptions\InvalidArgumentException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - if (!$this->IsSupported($bSort ? 'ESORT' : 'ESEARCH')) - { - $this->writeLogException( - new \MailSo\Base\Exceptions\InvalidArgumentException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - if (!\is_array($aSearchOrSortReturn) || 0 === \count($aSearchOrSortReturn)) - { - $aSearchOrSortReturn = array('ALL'); - } - - $aRequest = array(); - if ($bSort) - { - $aRequest[] = 'RETURN'; - $aRequest[] = $aSearchOrSortReturn; - - $aRequest[] = $aSortTypes; - $aRequest[] = \MailSo\Base\Utils::IsAscii($sSearchCriterias) ? 'US-ASCII' : 'UTF-8'; - } - else - { - if (0 < \strlen($sCharset)) - { - $aRequest[] = 'CHARSET'; - $aRequest[] = \strtoupper($sCharset); - } - - $aRequest[] = 'RETURN'; - $aRequest[] = $aSearchOrSortReturn; - } - - $aRequest[] = $sSearchCriterias; - - if (0 < \strlen($sLimit)) - { - $aRequest[] = $sLimit; - } - - $this->SendRequest($sCommandPrefix.$sCmd, $aRequest); - $sRequestTag = $this->getCurrentTag(); - - $aResult = array(); - $aResponse = $this->parseResponseWithValidation(); - - if (\is_array($aResponse)) - { - $oImapResponse = null; - foreach ($aResponse as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) - { - if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType - && ('ESEARCH' === $oImapResponse->StatusOrIndex || 'ESORT' === $oImapResponse->StatusOrIndex) - && \is_array($oImapResponse->ResponseList) - && isset($oImapResponse->ResponseList[2], $oImapResponse->ResponseList[2][0], $oImapResponse->ResponseList[2][1]) - && 'TAG' === $oImapResponse->ResponseList[2][0] && $sRequestTag === $oImapResponse->ResponseList[2][1] - && (!$bReturnUid || ($bReturnUid && !empty($oImapResponse->ResponseList[3]) && 'UID' === $oImapResponse->ResponseList[3])) - ) - { - $iStart = 3; - foreach ($oImapResponse->ResponseList as $iIndex => $mItem) - { - if ($iIndex >= $iStart) - { - switch ($mItem) - { - case 'ALL': - case 'MAX': - case 'MIN': - case 'COUNT': - if (isset($oImapResponse->ResponseList[$iIndex + 1])) - { - $aResult[$mItem] = $oImapResponse->ResponseList[$iIndex + 1]; - } - break; - } - } - } - } - } - } - - return $aResult; - } - - /** - * @param string $sSearchCriterias = 'ALL' - * @param array $aSearchReturn = null - * @param bool $bReturnUid = true - * @param string $sLimit = '' - * @param string $sCharset = '' - * - * @return array - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function MessageSimpleESearch($sSearchCriterias = 'ALL', $aSearchReturn = null, $bReturnUid = true, $sLimit = '', $sCharset = '') - { - return $this->simpleESearchOrESortHelper(false, $sSearchCriterias, $aSearchReturn, $bReturnUid, $sLimit, $sCharset); - } - - /** - * @param array $aSortTypes - * @param string $sSearchCriterias = 'ALL' - * @param array $aSearchReturn = null - * @param bool $bReturnUid = true - * @param string $sLimit = '' - * - * @return array - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function MessageSimpleESort($aSortTypes, $sSearchCriterias = 'ALL', $aSearchReturn = null, $bReturnUid = true, $sLimit = '') - { - return $this->simpleESearchOrESortHelper(true, $sSearchCriterias, $aSearchReturn, $bReturnUid, $sLimit, '', $aSortTypes); - } - - /** - * @param array $aResult - * @return \MailSo\Imap\Response - */ - private function findLastResponse($aResult) - { - $oResult = null; - if (\is_array($aResult) && 0 < \count($aResult)) - { - $oResult = $aResult[\count($aResult) - 1]; - if (!($oResult instanceof \MailSo\Imap\Response)) - { - $oResult = null; - } - } - - return $oResult; - } - - /** - * @param string $sSearchCriterias - * @param bool $bReturnUid = true - * @param string $sCharset = '' - * - * @return array - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function MessageSimpleSearch($sSearchCriterias = 'ALL', $bReturnUid = true, $sCharset = '') - { - $sCommandPrefix = ($bReturnUid) ? 'UID ' : ''; - $sSearchCriterias = 0 === \strlen($sSearchCriterias) || '*' === $sSearchCriterias - ? 'ALL' : $sSearchCriterias; - - $aRequest = array(); - if (0 < \strlen($sCharset)) - { - $aRequest[] = 'CHARSET'; - $aRequest[] = \strtoupper($sCharset); - } - - $aRequest[] = $sSearchCriterias; - - $sCmd = 'SEARCH'; - - $sCont = $this->SendRequest($sCommandPrefix.$sCmd, $aRequest, true); - if ('' !== $sCont) - { - $aResult = $this->parseResponseWithValidation(); - $oItem = $this->findLastResponse($aResult); - - if ($oItem && \MailSo\Imap\Enumerations\ResponseType::CONTINUATION === $oItem->ResponseType) - { - $aParts = explode("\r\n", $sCont); - foreach ($aParts as $sLine) - { - $this->sendRaw($sLine); - - $aResult = $this->parseResponseWithValidation(); - $oItem = $this->findLastResponse($aResult); - if ($oItem && \MailSo\Imap\Enumerations\ResponseType::CONTINUATION === $oItem->ResponseType) - { - continue; - } - } - } - } - else - { - $aResult = $this->parseResponseWithValidation(); - } - - $aReturn = array(); - $oImapResponse = null; - foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) - { - if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType - && ($sCmd === $oImapResponse->StatusOrIndex || - ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex) && !empty($oImapResponse->ResponseList[2]) && - $sCmd === $oImapResponse->ResponseList[2]) - && \is_array($oImapResponse->ResponseList) - && 2 < count($oImapResponse->ResponseList)) - { - $iStart = 2; - if ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex && - !empty($oImapResponse->ResponseList[2]) && - $sCmd === $oImapResponse->ResponseList[2]) - { - $iStart = 3; - } - - for ($iIndex = $iStart, $iLen = \count($oImapResponse->ResponseList); $iIndex < $iLen; $iIndex++) - { - $aReturn[] = (int) $oImapResponse->ResponseList[$iIndex]; - } - } - } - - $aReturn = \array_reverse($aReturn); - return $aReturn; - } - - /** - * @param mixed $aValue - * - * @return mixed - */ - private function validateThreadItem($aValue) - { - $mResult = false; - if (\is_numeric($aValue)) - { - $mResult = (int) $aValue; - if (0 >= $mResult) - { - $mResult = false; - } - } - else if (\is_array($aValue)) - { - if (1 === \count($aValue) && \is_numeric($aValue[0])) - { - $mResult = (int) $aValue[0]; - if (0 >= $mResult) - { - $mResult = false; - } - } - else - { - $mResult = array(); - foreach ($aValue as $aValueItem) - { - $mTemp = $this->validateThreadItem($aValueItem); - if (false !== $mTemp) - { - $mResult[] = $mTemp; - } - } - } - } - - return $mResult; - } - - /** - * @param string $sSearchCriterias = 'ALL' - * @param bool $bReturnUid = true - * @param string $sCharset = \MailSo\Base\Enumerations\Charset::UTF_8 - * - * @return array - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function MessageSimpleThread($sSearchCriterias = 'ALL', $bReturnUid = true, $sCharset = \MailSo\Base\Enumerations\Charset::UTF_8) - { - $sCommandPrefix = ($bReturnUid) ? 'UID ' : ''; - $sSearchCriterias = !\MailSo\Base\Validator::NotEmptyString($sSearchCriterias, true) || '*' === $sSearchCriterias - ? 'ALL' : $sSearchCriterias; - - $sThreadType = ''; - switch (true) - { - case $this->IsSupported('THREAD=REFS'): - $sThreadType = 'REFS'; - break; - case $this->IsSupported('THREAD=REFERENCES'): - $sThreadType = 'REFERENCES'; - break; - case $this->IsSupported('THREAD=ORDEREDSUBJECT'): - $sThreadType = 'ORDEREDSUBJECT'; - break; - default: - $this->writeLogException( - new Exceptions\RuntimeException('Thread is not supported'), - \MailSo\Log\Enumerations\Type::ERROR, true); - break; - } - - $aRequest = array(); - $aRequest[] = $sThreadType; - $aRequest[] = \strtoupper($sCharset); - $aRequest[] = $sSearchCriterias; - - $sCmd = 'THREAD'; - - $this->SendRequest($sCommandPrefix.$sCmd, $aRequest); - $aResult = $this->parseResponseWithValidation(); - - $aReturn = array(); - $oImapResponse = null; - - foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) - { - if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType - && ($sCmd === $oImapResponse->StatusOrIndex || - ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex) && !empty($oImapResponse->ResponseList[2]) && - $sCmd === $oImapResponse->ResponseList[2]) - && \is_array($oImapResponse->ResponseList) - && 2 < \count($oImapResponse->ResponseList)) - { - $iStart = 2; - if ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex && - !empty($oImapResponse->ResponseList[2]) && - $sCmd === $oImapResponse->ResponseList[2]) - { - $iStart = 3; - } - - for ($iIndex = $iStart, $iLen = \count($oImapResponse->ResponseList); $iIndex < $iLen; $iIndex++) - { - $aNewValue = $this->validateThreadItem($oImapResponse->ResponseList[$iIndex]); - if (false !== $aNewValue) - { - $aReturn[] = $aNewValue; - } - } - } - } - - return $aReturn; - } - - /** - * @param string $sToFolder - * @param string $sIndexRange - * @param bool $bIndexIsUid - * - * @return \MailSo\Imap\ImapClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function MessageCopy($sToFolder, $sIndexRange, $bIndexIsUid) - { - if (0 === \strlen($sIndexRange)) - { - $this->writeLogException( - new \MailSo\Base\Exceptions\InvalidArgumentException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - $sCommandPrefix = ($bIndexIsUid) ? 'UID ' : ''; - return $this->SendRequestWithCheck($sCommandPrefix.'COPY', - array($sIndexRange, $this->EscapeString($sToFolder))); - } - - /** - * @param string $sToFolder - * @param string $sIndexRange - * @param bool $bIndexIsUid - * - * @return \MailSo\Imap\ImapClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function MessageMove($sToFolder, $sIndexRange, $bIndexIsUid) - { - if (0 === \strlen($sIndexRange)) - { - $this->writeLogException( - new \MailSo\Base\Exceptions\InvalidArgumentException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - if (!$this->IsSupported('MOVE')) - { - $this->writeLogException( - new Exceptions\RuntimeException('Move is not supported'), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - $sCommandPrefix = ($bIndexIsUid) ? 'UID ' : ''; - return $this->SendRequestWithCheck($sCommandPrefix.'MOVE', - array($sIndexRange, $this->EscapeString($sToFolder))); - } - - /** - * @param string $sUidRangeIfSupported = '' - * @param bool $bForceUidExpunge = false - * @param bool $bExpungeAll = false - * - * @return \MailSo\Imap\ImapClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function MessageExpunge($sUidRangeIfSupported = '', $bForceUidExpunge = false, $bExpungeAll = false) - { - $sUidRangeIfSupported = \trim($sUidRangeIfSupported); - - $sCmd = 'EXPUNGE'; - $aArguments = array(); - - if (!$bExpungeAll && $bForceUidExpunge && 0 < \strlen($sUidRangeIfSupported) && $this->IsSupported('UIDPLUS')) - { - $sCmd = 'UID '.$sCmd; - $aArguments = array($sUidRangeIfSupported); - } - - return $this->SendRequestWithCheck($sCmd, $aArguments); - } - - /** - * @param string $sIndexRange - * @param bool $bIndexIsUid - * @param array $aInputStoreItems - * @param string $sStoreAction - * - * @return \MailSo\Imap\ImapClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function MessageStoreFlag($sIndexRange, $bIndexIsUid, $aInputStoreItems, $sStoreAction) - { - if (!\MailSo\Base\Validator::NotEmptyString($sIndexRange, true) || - !\MailSo\Base\Validator::NotEmptyString($sStoreAction, true) || - 0 === \count($aInputStoreItems)) - { - return false; - } - - $sCmd = ($bIndexIsUid) ? 'UID STORE' : 'STORE'; - return $this->SendRequestWithCheck($sCmd, array($sIndexRange, $sStoreAction, $aInputStoreItems)); - } - - /** - * @param string $sFolderName - * @param resource $rMessageAppendStream - * @param int $iStreamSize - * @param array $aAppendFlags = null - * @param int $iUid = null - * @param int $sDateTime = 0 - * - * @return \MailSo\Imap\ImapClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function MessageAppendStream($sFolderName, $rMessageAppendStream, $iStreamSize, $aAppendFlags = null, &$iUid = null, $sDateTime = 0) - { - $aData = array($this->EscapeString($sFolderName), $aAppendFlags); - if (0 < $sDateTime) - { - $aData[] = $this->EscapeString(\gmdate('d-M-Y H:i:s', $sDateTime).' +0000'); - } - - $aData[] = '{'.$iStreamSize.'}'; - - $this->SendRequest('APPEND', $aData); - $this->parseResponseWithValidation(); - - $this->writeLog('Write to connection stream', \MailSo\Log\Enumerations\Type::NOTE); - - \MailSo\Base\Utils::MultipleStreamWriter($rMessageAppendStream, array($this->rConnect)); - - $this->sendRaw(''); - $this->parseResponseWithValidation(); - - if (null !== $iUid) - { - $aLastResponse = $this->GetLastResponse(); - if (\is_array($aLastResponse) && 0 < \count($aLastResponse) && $aLastResponse[\count($aLastResponse) - 1]) - { - $oLast = $aLastResponse[count($aLastResponse) - 1]; - if ($oLast && \MailSo\Imap\Enumerations\ResponseType::TAGGED === $oLast->ResponseType && \is_array($oLast->OptionalResponse)) - { - if (0 < \strlen($oLast->OptionalResponse[0]) && - 0 < \strlen($oLast->OptionalResponse[2]) && - 'APPENDUID' === strtoupper($oLast->OptionalResponse[0]) && - \is_numeric($oLast->OptionalResponse[2]) - ) - { - $iUid = (int) $oLast->OptionalResponse[2]; - } - } - } - } - - return $this; - } - - /** - * @return \MailSo\Imap\FolderInformation - */ - public function FolderCurrentInformation() - { - return $this->oCurrentFolderInfo; - } - - /** - * @param string $sCommand - * @param array $aParams = array() - * @param bool $bBreakOnLiteral = false - * - * @return string - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - */ - public function SendRequest($sCommand, $aParams = array(), $bBreakOnLiteral = false) - { - if (!\MailSo\Base\Validator::NotEmptyString($sCommand, true) || !\is_array($aParams)) - { - $this->writeLogException( - new \MailSo\Base\Exceptions\InvalidArgumentException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - $this->IsConnected(true); - - $sTag = $this->getNewTag(); - - $sCommand = \trim($sCommand); - $sRealCommand = $sTag.' '.$sCommand.$this->prepearParamLine($aParams); - - $sFakeCommand = ''; - $aFakeParams = $this->secureRequestParams($sCommand, $aParams); - if (null !== $aFakeParams) - { - $sFakeCommand = $sTag.' '.$sCommand.$this->prepearParamLine($aFakeParams); - } - - $this->aTagTimeouts[$sTag] = \microtime(true); - - if ($bBreakOnLiteral && !\preg_match('/\d\+\}\r\n/', $sRealCommand)) - { - $iPos = \strpos($sRealCommand, "}\r\n"); - if (false !== $iPos) - { - $iFakePos = \strpos($sFakeCommand, "}\r\n"); - - $this->sendRaw(\substr($sRealCommand, 0, $iPos + 1), true, - false !== $iFakePos ? \substr($sFakeCommand, 0, $iFakePos + 3) : ''); - - return \substr($sRealCommand, $iPos + 3); - } - } - - $this->sendRaw($sRealCommand, true, $sFakeCommand); - return ''; - } - - /** - * @param string $sCommand - * @param array $aParams - * - * @return array|null - */ - private function secureRequestParams($sCommand, $aParams) - { - $aResult = null; - switch ($sCommand) - { - case 'LOGIN': - $aResult = $aParams; - if (\is_array($aResult) && 2 === count($aResult)) - { - $aResult[1] = '"********"'; - } - break; - } - - return $aResult; - } - - /** - * @param string $sCommand - * @param array $aParams = array() - * @param bool $bFindCapa = false - * - * @return \MailSo\Imap\ImapClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function SendRequestWithCheck($sCommand, $aParams = array(), $bFindCapa = false) - { - $this->SendRequest($sCommand, $aParams); - $this->parseResponseWithValidation(null, $bFindCapa); - - return $this; - } - - /** - * @return array - */ - public function GetLastResponse() - { - return $this->aLastResponse; - } - - /** - * @param mixed $aResult - * - * @return array - * - * @throws \MailSo\Imap\Exceptions\ResponseNotFoundException - * @throws \MailSo\Imap\Exceptions\InvalidResponseException - * @throws \MailSo\Imap\Exceptions\NegativeResponseException - */ - private function validateResponse($aResult) - { - if (!\is_array($aResult) || 0 === $iCnt = \count($aResult)) - { - $this->writeLogException( - new Exceptions\ResponseNotFoundException(), - \MailSo\Log\Enumerations\Type::WARNING, true); - } - - if ($aResult[$iCnt - 1]->ResponseType !== \MailSo\Imap\Enumerations\ResponseType::CONTINUATION) - { - if (!$aResult[$iCnt - 1]->IsStatusResponse) - { - $this->writeLogException( - new Exceptions\InvalidResponseException($aResult), - \MailSo\Log\Enumerations\Type::WARNING, true); - } - - if (\MailSo\Imap\Enumerations\ResponseStatus::OK !== $aResult[$iCnt - 1]->StatusOrIndex) - { - $this->writeLogException( - new Exceptions\NegativeResponseException($aResult), - \MailSo\Log\Enumerations\Type::WARNING, true); - } - } - - return $aResult; - } - - /** - * @param string $sEndTag = null - * @param bool $bFindCapa = false - * - * @return array|bool - */ - protected function parseResponse($sEndTag = null, $bFindCapa = false) - { - if (\is_resource($this->rConnect)) - { - $oImapResponse = null; - $sEndTag = (null === $sEndTag) ? $this->getCurrentTag() : $sEndTag; - - while (true) - { - $oImapResponse = Response::NewInstance(); - - $this->partialParseResponseBranch($oImapResponse); - - if ($oImapResponse) - { - if (\MailSo\Imap\Enumerations\ResponseType::UNKNOWN === $oImapResponse->ResponseType) - { - return false; - } - - if ($bFindCapa) - { - $this->initCapabilityImapResponse($oImapResponse); - } - - $this->aPartialResponses[] = $oImapResponse; - if ($sEndTag === $oImapResponse->Tag || \MailSo\Imap\Enumerations\ResponseType::CONTINUATION === $oImapResponse->ResponseType) - { - if (isset($this->aTagTimeouts[$sEndTag])) - { - $this->writeLog((\microtime(true) - $this->aTagTimeouts[$sEndTag]).' ('.$sEndTag.')', - \MailSo\Log\Enumerations\Type::TIME); - - unset($this->aTagTimeouts[$sEndTag]); - } - - break; - } - } - else - { - return false; - } - - unset($oImapResponse); - } - } - - $this->iResponseBufParsedPos = 0; - $this->aLastResponse = $this->aPartialResponses; - $this->aPartialResponses = array(); - - return $this->aLastResponse; - } - - /** - * @param string $sEndTag = null - * @param bool $bFindCapa = false - * - * @return array - */ - private function parseResponseWithValidation($sEndTag = null, $bFindCapa = false) - { - return $this->validateResponse($this->parseResponse($sEndTag, $bFindCapa)); - } - - /** - * @param \MailSo\Imap\Response $oImapResponse - * - * @return void - */ - private function initCapabilityImapResponse($oImapResponse) - { - if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType - && \is_array($oImapResponse->ResponseList)) - { - $aList = null; - if (isset($oImapResponse->ResponseList[1]) && \is_string($oImapResponse->ResponseList[1]) && - 'CAPABILITY' === \strtoupper($oImapResponse->ResponseList[1])) - { - $aList = \array_slice($oImapResponse->ResponseList, 2); - } - else if ($oImapResponse->OptionalResponse && \is_array($oImapResponse->OptionalResponse) && - 1 < \count($oImapResponse->OptionalResponse) && \is_string($oImapResponse->OptionalResponse[0]) && - 'CAPABILITY' === \strtoupper($oImapResponse->OptionalResponse[0])) - { - $aList = \array_slice($oImapResponse->OptionalResponse, 1); - } - - if (\is_array($aList) && 0 < \count($aList)) - { - $this->aCapabilityItems = \array_map('strtoupper', $aList); - } - } - } - - /** - * @return array|string - * - * @throws \MailSo\Net\Exceptions\Exception - */ - private function partialParseResponseBranch(&$oImapResponse, $iStackIndex = -1, - $bTreatAsAtom = false, $sParentToken = '', $sOpenBracket = '') - { - $mNull = null; - - $iStackIndex++; - $iPos = $this->iResponseBufParsedPos; - - $sPreviousAtomUpperCase = null; - $bIsEndOfList = false; - $bIsClosingBracketSquare = false; - $iLiteralLen = 0; - $iBufferEndIndex = 0; - $iDebugCount = 0; - - $rImapLiteralStream = null; - - $bIsGotoDefault = false; - $bIsGotoLiteral = false; - $bIsGotoLiteralEnd = false; - $bIsGotoAtomBracket = false; - $bIsGotoNotAtomBracket = false; - - $bCountOneInited = false; - $bCountTwoInited = false; - - $sAtomBuilder = $bTreatAsAtom ? '' : null; - $aList = array(); - if (null !== $oImapResponse) - { - $aList =& $oImapResponse->ResponseList; - } - - while (!$bIsEndOfList) - { - $iDebugCount++; - if (100000 === $iDebugCount) - { - $this->Logger()->Write('PartialParseOver: '.$iDebugCount, \MailSo\Log\Enumerations\Type::ERROR); - } - - if ($this->bNeedNext) - { - $iPos = 0; - $this->getNextBuffer(); - $this->iResponseBufParsedPos = $iPos; - $this->bNeedNext = false; - } - - $sChar = null; - if ($bIsGotoDefault) - { - $sChar = 'GOTO_DEFAULT'; - $bIsGotoDefault = false; - } - else if ($bIsGotoLiteral) - { - $bIsGotoLiteral = false; - $bIsGotoLiteralEnd = true; - - if ($this->partialResponseLiteralCallbackCallable( - $sParentToken, null === $sPreviousAtomUpperCase ? '' : \strtoupper($sPreviousAtomUpperCase), $this->rConnect, $iLiteralLen)) - { - if (!$bTreatAsAtom) - { - $aList[] = ''; - } - } - else - { - $sLiteral = ''; - $iRead = $iLiteralLen; - - while (0 < $iRead) - { - $sAddRead = \fread($this->rConnect, $iRead); - if (false === $sAddRead) - { - $sLiteral = false; - break; - } - - $sLiteral .= $sAddRead; - $iRead -= \strlen($sAddRead); - - \MailSo\Base\Utils::ResetTimeLimit(); - } - - if (false !== $sLiteral) - { - $iLiteralSize = \strlen($sLiteral); - \MailSo\Base\Loader::IncStatistic('NetRead', $iLiteralSize); - if ($iLiteralLen !== $iLiteralSize) - { - $this->writeLog('Literal stream read warning "read '.$iLiteralSize.' of '. - $iLiteralLen.'" bytes', \MailSo\Log\Enumerations\Type::WARNING); - } - - if (!$bTreatAsAtom) - { - $aList[] = $sLiteral; - - if (\MailSo\Config::$LogSimpleLiterals) - { - $this->writeLog('{'.\strlen($sLiteral).'} '.$sLiteral, \MailSo\Log\Enumerations\Type::INFO); - } - } - } - else - { - $this->writeLog('Can\'t read imap stream', \MailSo\Log\Enumerations\Type::NOTE); - } - - unset($sLiteral); - } - - continue; - } - else if ($bIsGotoLiteralEnd) - { - $rImapLiteralStream = null; - $sPreviousAtomUpperCase = null; - $this->bNeedNext = true; - $bIsGotoLiteralEnd = false; - - continue; - } - else if ($bIsGotoAtomBracket) - { - if ($bTreatAsAtom) - { - $sAtomBlock = $this->partialParseResponseBranch($mNull, $iStackIndex, true, - null === $sPreviousAtomUpperCase ? '' : \strtoupper($sPreviousAtomUpperCase), $sOpenBracket); - - $sAtomBuilder .= $sAtomBlock; - $iPos = $this->iResponseBufParsedPos; - $sAtomBuilder .= ($bIsClosingBracketSquare) ? ']' : ')'; - } - - $sPreviousAtomUpperCase = null; - $bIsGotoAtomBracket = false; - - continue; - } - else if ($bIsGotoNotAtomBracket) - { - $aSubItems = $this->partialParseResponseBranch($mNull, $iStackIndex, false, - null === $sPreviousAtomUpperCase ? '' : \strtoupper($sPreviousAtomUpperCase), $sOpenBracket); - - $aList[] = $aSubItems; - $iPos = $this->iResponseBufParsedPos; - $sPreviousAtomUpperCase = null; - if (null !== $oImapResponse && $oImapResponse->IsStatusResponse) - { - $oImapResponse->OptionalResponse = $aSubItems; - - $bIsGotoDefault = true; - $bIsGotoNotAtomBracket = false; - continue; - } - $bIsGotoNotAtomBracket = false; - - continue; - } - else - { - $iBufferEndIndex = \strlen($this->sResponseBuffer) - 3; - $this->bResponseBufferChanged = false; - - if ($iPos > $iBufferEndIndex) - { - break; - } - - $sChar = $this->sResponseBuffer[$iPos]; - } - - switch (true) - { - case ']' === $sChar: - $iPos++; - $sPreviousAtomUpperCase = null; - $bIsEndOfList = true; - break; - case ')' === $sChar: - $iPos++; - $sPreviousAtomUpperCase = null; - $bIsEndOfList = true; - break; - case ' ' === $sChar: - if ($bTreatAsAtom) - { - $sAtomBuilder .= ' '; - } - $iPos++; - break; - case '[' === $sChar: - $bIsClosingBracketSquare = true; - case '(' === $sChar: - if ('(' === $sChar) - { - $bIsClosingBracketSquare = false; - } - - if ($bTreatAsAtom) - { - $sAtomBuilder .= $bIsClosingBracketSquare ? '[' : '('; - } - $iPos++; - - $this->iResponseBufParsedPos = $iPos; - if ($bTreatAsAtom) - { - $bIsGotoAtomBracket = true; - $sOpenBracket = $bIsClosingBracketSquare ? '[' : '('; - } - else - { - $bIsGotoNotAtomBracket = true; - $sOpenBracket = $bIsClosingBracketSquare ? '[' : '('; - } - break; - case '{' === $sChar: - $bIsLiteralParsed = false; - $mLiteralEndPos = \strpos($this->sResponseBuffer, '}', $iPos); - if (false !== $mLiteralEndPos && $mLiteralEndPos > $iPos) - { - $sLiteralLenAsString = \substr($this->sResponseBuffer, $iPos + 1, $mLiteralEndPos - $iPos - 1); - if (\is_numeric($sLiteralLenAsString)) - { - $iLiteralLen = (int) $sLiteralLenAsString; - $bIsLiteralParsed = true; - $iPos = $mLiteralEndPos + 3; - $bIsGotoLiteral = true; - break; - } - } - if (!$bIsLiteralParsed) - { - $iPos = $iBufferEndIndex; - } - $sPreviousAtomUpperCase = null; - break; - case '"' === $sChar: - $bIsQuotedParsed = false; - while (true) - { - $iClosingPos = $iPos + 1; - if ($iClosingPos > $iBufferEndIndex) - { - break; - } - - while (true) - { - $iClosingPos = \strpos($this->sResponseBuffer, '"', $iClosingPos); - if (false === $iClosingPos) - { - break; - } - - // TODO - $iClosingPosNext = $iClosingPos + 1; - if ( - isset($this->sResponseBuffer[$iClosingPosNext]) && - ' ' !== $this->sResponseBuffer[$iClosingPosNext] && - "\r" !== $this->sResponseBuffer[$iClosingPosNext] && - "\n" !== $this->sResponseBuffer[$iClosingPosNext] && - ']' !== $this->sResponseBuffer[$iClosingPosNext] && - ')' !== $this->sResponseBuffer[$iClosingPosNext] - ) - { - $iClosingPos++; - continue; - } - - $iSlashCount = 0; - while ('\\' === $this->sResponseBuffer[$iClosingPos - $iSlashCount - 1]) - { - $iSlashCount++; - } - - if ($iSlashCount % 2 == 1) - { - $iClosingPos++; - continue; - } - else - { - break; - } - } - - if (false === $iClosingPos) - { - break; - } - else - { -// $iSkipClosingPos = 0; - $bIsQuotedParsed = true; - if ($bTreatAsAtom) - { - $sAtomBuilder .= \strtr( - \substr($this->sResponseBuffer, $iPos, $iClosingPos - $iPos + 1), - array('\\\\' => '\\', '\\"' => '"') - ); - } - else - { - $aList[] = \strtr( - \substr($this->sResponseBuffer, $iPos + 1, $iClosingPos - $iPos - 1), - array('\\\\' => '\\', '\\"' => '"') - ); - } - - $iPos = $iClosingPos + 1; - break; - } - } - - if (!$bIsQuotedParsed) - { - $iPos = $iBufferEndIndex; - } - - $sPreviousAtomUpperCase = null; - break; - - case 'GOTO_DEFAULT' === $sChar: - default: - $iCharBlockStartPos = $iPos; - - if (null !== $oImapResponse && $oImapResponse->IsStatusResponse) - { - $iPos = $iBufferEndIndex; - - while ($iPos > $iCharBlockStartPos && $this->sResponseBuffer[$iCharBlockStartPos] === ' ') - { - $iCharBlockStartPos++; - } - } - - $bIsAtomDone = false; - while (!$bIsAtomDone && ($iPos <= $iBufferEndIndex)) - { - $sCharDef = $this->sResponseBuffer[$iPos]; - switch (true) - { - case '[' === $sCharDef: - if (null === $sAtomBuilder) - { - $sAtomBuilder = ''; - } - - $sAtomBuilder .= \substr($this->sResponseBuffer, $iCharBlockStartPos, $iPos - $iCharBlockStartPos + 1); - - $iPos++; - $this->iResponseBufParsedPos = $iPos; - - $sListBlock = $this->partialParseResponseBranch($mNull, $iStackIndex, true, - null === $sPreviousAtomUpperCase ? '' : \strtoupper($sPreviousAtomUpperCase), '['); - - if (null !== $sListBlock) - { - $sAtomBuilder .= $sListBlock.']'; - } - - $iPos = $this->iResponseBufParsedPos; - $iCharBlockStartPos = $iPos; - break; - case ' ' === $sCharDef: - case ')' === $sCharDef && '(' === $sOpenBracket: - case ']' === $sCharDef && '[' === $sOpenBracket: - $bIsAtomDone = true; - break; - default: - $iPos++; - break; - } - } - - if ($iPos > $iCharBlockStartPos || null !== $sAtomBuilder) - { - $sLastCharBlock = \substr($this->sResponseBuffer, $iCharBlockStartPos, $iPos - $iCharBlockStartPos); - if (null === $sAtomBuilder) - { - $aList[] = $sLastCharBlock; - $sPreviousAtomUpperCase = $sLastCharBlock; - } - else - { - $sAtomBuilder .= $sLastCharBlock; - - if (!$bTreatAsAtom) - { - $aList[] = $sAtomBuilder; - $sPreviousAtomUpperCase = $sAtomBuilder; - $sAtomBuilder = null; - } - } - - if (null !== $oImapResponse) - { -// if (1 === \count($aList)) - if (!$bCountOneInited && 1 === \count($aList)) -// if (isset($aList[0]) && !isset($aList[1])) // fast 1 === \count($aList) - { - $bCountOneInited = true; - - $oImapResponse->Tag = $aList[0]; - if ('+' === $oImapResponse->Tag) - { - $oImapResponse->ResponseType = \MailSo\Imap\Enumerations\ResponseType::CONTINUATION; - } - else if ('*' === $oImapResponse->Tag) - { - $oImapResponse->ResponseType = \MailSo\Imap\Enumerations\ResponseType::UNTAGGED; - } - else if ($this->getCurrentTag() === $oImapResponse->Tag) - { - $oImapResponse->ResponseType = \MailSo\Imap\Enumerations\ResponseType::TAGGED; - } - else - { - $oImapResponse->ResponseType = \MailSo\Imap\Enumerations\ResponseType::UNKNOWN; - } - } -// else if (2 === \count($aList)) - else if (!$bCountTwoInited && 2 === \count($aList)) -// else if (isset($aList[1]) && !isset($aList[2])) // fast 2 === \count($aList) - { - $bCountTwoInited = true; - - $oImapResponse->StatusOrIndex = strtoupper($aList[1]); - - if ($oImapResponse->StatusOrIndex == \MailSo\Imap\Enumerations\ResponseStatus::OK || - $oImapResponse->StatusOrIndex == \MailSo\Imap\Enumerations\ResponseStatus::NO || - $oImapResponse->StatusOrIndex == \MailSo\Imap\Enumerations\ResponseStatus::BAD || - $oImapResponse->StatusOrIndex == \MailSo\Imap\Enumerations\ResponseStatus::BYE || - $oImapResponse->StatusOrIndex == \MailSo\Imap\Enumerations\ResponseStatus::PREAUTH) - { - $oImapResponse->IsStatusResponse = true; - } - } - else if (\MailSo\Imap\Enumerations\ResponseType::CONTINUATION === $oImapResponse->ResponseType) - { - $oImapResponse->HumanReadable = $sLastCharBlock; - } - else if ($oImapResponse->IsStatusResponse) - { - $oImapResponse->HumanReadable = $sLastCharBlock; - } - } - } - } - } - - $this->iResponseBufParsedPos = $iPos; - if (null !== $oImapResponse) - { - $this->bNeedNext = true; - $this->iResponseBufParsedPos = 0; - } - - if (100000 < $iDebugCount) - { - $this->Logger()->Write('PartialParseOverResult: '.$iDebugCount, \MailSo\Log\Enumerations\Type::ERROR); - } - - return $bTreatAsAtom ? $sAtomBuilder : $aList; - } - - /** - * @param string $sParent - * @param string $sLiteralAtomUpperCase - * @param resource $rImapStream - * @param int $iLiteralLen - * - * @return bool - */ - private function partialResponseLiteralCallbackCallable($sParent, $sLiteralAtomUpperCase, $rImapStream, $iLiteralLen) - { - $sLiteralAtomUpperCasePeek = ''; - if (0 === \strpos($sLiteralAtomUpperCase, 'BODY')) - { - $sLiteralAtomUpperCasePeek = \str_replace('BODY', 'BODY.PEEK', $sLiteralAtomUpperCase); - } - - $sFetchKey = ''; - if (\is_array($this->aFetchCallbacks)) - { - if (0 < \strlen($sLiteralAtomUpperCasePeek) && isset($this->aFetchCallbacks[$sLiteralAtomUpperCasePeek])) - { - $sFetchKey = $sLiteralAtomUpperCasePeek; - } - else if (0 < \strlen($sLiteralAtomUpperCase) && isset($this->aFetchCallbacks[$sLiteralAtomUpperCase])) - { - $sFetchKey = $sLiteralAtomUpperCase; - } - } - - $bResult = false; - if (0 < \strlen($sFetchKey) && '' !== $this->aFetchCallbacks[$sFetchKey] && - \is_callable($this->aFetchCallbacks[$sFetchKey])) - { - $rImapLiteralStream = - \MailSo\Base\StreamWrappers\Literal::CreateStream($rImapStream, $iLiteralLen); - - $bResult = true; - $this->writeLog('Start Callback for '.$sParent.' / '.$sLiteralAtomUpperCase. - ' - try to read '.$iLiteralLen.' bytes.', \MailSo\Log\Enumerations\Type::NOTE); - - $this->bRunningCallback = true; - - try - { - \call_user_func($this->aFetchCallbacks[$sFetchKey], - $sParent, $sLiteralAtomUpperCase, $rImapLiteralStream); - } - catch (\Exception $oException) - { - $this->writeLog('Callback Exception', \MailSo\Log\Enumerations\Type::NOTICE); - $this->writeLogException($oException); - } - - if (\is_resource($rImapLiteralStream)) - { - $iNotReadLiteralLen = 0; - - $bFeof = \feof($rImapLiteralStream); - $this->writeLog('End Callback for '.$sParent.' / '.$sLiteralAtomUpperCase. - ' - feof = '.($bFeof ? 'good' : 'BAD'), $bFeof ? - \MailSo\Log\Enumerations\Type::NOTE : \MailSo\Log\Enumerations\Type::WARNING); - - if (!$bFeof) - { - while (!@\feof($rImapLiteralStream)) - { - $sBuf = @\fread($rImapLiteralStream, 1024 * 1024); - if (false === $sBuf || 0 === \strlen($sBuf) || null === $sBuf) - { - break; - } - - \MailSo\Base\Utils::ResetTimeLimit(); - $iNotReadLiteralLen += \strlen($sBuf); - } - - if (\is_resource($rImapLiteralStream) && !@\feof($rImapLiteralStream)) - { - @\stream_get_contents($rImapLiteralStream); - } - } - - if (\is_resource($rImapLiteralStream)) - { - @\fclose($rImapLiteralStream); - } - - if ($iNotReadLiteralLen > 0) - { - $this->writeLog('Not read literal size is '.$iNotReadLiteralLen.' bytes.', - \MailSo\Log\Enumerations\Type::WARNING); - } - } - else - { - $this->writeLog('Literal stream is not resource after callback.', - \MailSo\Log\Enumerations\Type::WARNING); - } - - \MailSo\Base\Loader::IncStatistic('NetRead', $iLiteralLen); - - $this->bRunningCallback = false; - } - - return $bResult; - } - - /** - * @param array $aParams = null - * - * @return string - */ - private function prepearParamLine($aParams = array()) - { - $sReturn = ''; - if (\is_array($aParams) && 0 < \count($aParams)) - { - foreach ($aParams as $mParamItem) - { - if (\is_array($mParamItem) && 0 < \count($mParamItem)) - { - $sReturn .= ' ('.\trim($this->prepearParamLine($mParamItem)).')'; - } - else if (\is_string($mParamItem)) - { - $sReturn .= ' '.$mParamItem; - } - } - } - return $sReturn; - } - - /** - * @return string - */ - private function getNewTag() - { - $this->iTagCount++; - return $this->getCurrentTag(); - } - - /** - * @return string - */ - private function getCurrentTag() - { - return self::TAG_PREFIX.$this->iTagCount; - } - - /** - * @param string $sStringForEscape - * - * @return string - */ - public function EscapeString($sStringForEscape) - { - return '"'.\str_replace(array('\\', '"'), array('\\\\', '\\"'), $sStringForEscape).'"'; - } - - /** - * @return string - */ - protected function getLogName() - { - return 'IMAP'; - } - - /** - * @param \MailSo\Log\Logger $oLogger - * - * @return \MailSo\Imap\ImapClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public function SetLogger($oLogger) - { - parent::SetLogger($oLogger); - - return $this; - } - - /** - * @param resource $rConnect - * @param array $aCapabilityItems = array() - * - * @return \MailSo\Imap\ImapClient - */ - public function TestSetValues($rConnect, $aCapabilityItems = array()) - { - $this->rConnect = $rConnect; - $this->aCapabilityItems = $aCapabilityItems; - - return $this; - } - - /** - * @param string $sEndTag = null - * @param string $bFindCapa = false - * - * @return array - */ - public function TestParseResponseWithValidationProxy($sEndTag = null, $bFindCapa = false) - { - return $this->parseResponseWithValidation($sEndTag, $bFindCapa); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/NamespaceResult.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/NamespaceResult.php deleted file mode 100755 index f53bd74f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/NamespaceResult.php +++ /dev/null @@ -1,132 +0,0 @@ -sPersonal = ''; - $this->sPersonalDelimiter = ''; - $this->sOtherUser = ''; - $this->sOtherUserDelimiter = ''; - $this->sShared = ''; - $this->sSharedDelimiter = ''; - } - - /** - * @return \MailSo\Imap\NamespaceResult - */ - public static function NewInstance() - { - return new self(); - } - - /** - * @param \MailSo\Imap\Response $oImapResponse - * - * @return \MailSo\Imap\NamespaceResult - */ - public function InitByImapResponse($oImapResponse) - { - if ($oImapResponse && $oImapResponse instanceof \MailSo\Imap\Response) - { - if (isset($oImapResponse->ResponseList[2][0]) && - \is_array($oImapResponse->ResponseList[2][0]) && - 2 <= \count($oImapResponse->ResponseList[2][0])) - { - $this->sPersonal = $oImapResponse->ResponseList[2][0][0]; - $this->sPersonalDelimiter = $oImapResponse->ResponseList[2][0][1]; - - $this->sPersonal = 'INBOX'.$this->sPersonalDelimiter === \substr(\strtoupper($this->sPersonal), 0, 6) ? - 'INBOX'.$this->sPersonalDelimiter.\substr($this->sPersonal, 6) : $this->sPersonal; - } - - if (isset($oImapResponse->ResponseList[3][0]) && - \is_array($oImapResponse->ResponseList[3][0]) && - 2 <= \count($oImapResponse->ResponseList[3][0])) - { - $this->sOtherUser = $oImapResponse->ResponseList[3][0][0]; - $this->sOtherUserDelimiter = $oImapResponse->ResponseList[3][0][1]; - - $this->sOtherUser = 'INBOX'.$this->sOtherUserDelimiter === \substr(\strtoupper($this->sOtherUser), 0, 6) ? - 'INBOX'.$this->sOtherUserDelimiter.\substr($this->sOtherUser, 6) : $this->sOtherUser; - } - - if (isset($oImapResponse->ResponseList[4][0]) && - \is_array($oImapResponse->ResponseList[4][0]) && - 2 <= \count($oImapResponse->ResponseList[4][0])) - { - $this->sShared = $oImapResponse->ResponseList[4][0][0]; - $this->sSharedDelimiter = $oImapResponse->ResponseList[4][0][1]; - - $this->sShared = 'INBOX'.$this->sSharedDelimiter === \substr(\strtoupper($this->sShared), 0, 6) ? - 'INBOX'.$this->sSharedDelimiter.\substr($this->sShared, 6) : $this->sShared; - } - } - - return $this; - } - - /** - * @return string - */ - public function GetPersonalNamespace() - { - return $this->sPersonal; - } - - /** - * @return string - */ - public function GetPersonalNamespaceDelimiter() - { - return $this->sPersonalDelimiter; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Response.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Response.php deleted file mode 100755 index fb787ba3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Imap/Response.php +++ /dev/null @@ -1,104 +0,0 @@ -ResponseList = array(); - $this->OptionalResponse = null; - $this->StatusOrIndex = ''; - $this->HumanReadable = ''; - $this->IsStatusResponse = false; - $this->ResponseType = \MailSo\Imap\Enumerations\ResponseType::UNKNOWN; - $this->Tag = ''; - } - - /** - * @return \MailSo\Imap\Response - */ - public static function NewInstance() - { - return new self(); - } - - /** - * @param string $aList - * - * @return string - */ - private function recToLine($aList) - { - $aResult = array(); - if (\is_array($aList)) - { - foreach ($aList as $mItem) - { - $aResult[] = \is_array($mItem) ? '('.$this->recToLine($mItem).')' : (string) $mItem; - } - } - - return \implode(' ', $aResult); - } - - - /** - * @return string - */ - public function ToLine() - { - return $this->recToLine($this->ResponseList); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/LICENSE b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/LICENSE deleted file mode 100755 index 6229c40e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Usenko Timur - -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. \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Driver.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Driver.php deleted file mode 100755 index 457b78c4..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Driver.php +++ /dev/null @@ -1,408 +0,0 @@ -sDatePattern = 'H:i:s'; - $this->sName = 'INFO'; - $this->sNewLine = "\r\n"; - $this->bTimePrefix = true; - $this->bTypedPrefix = true; - $this->bGuidPrefix = true; - - $this->sTimeOffset = '0'; - - $this->iWriteOnTimeoutOnly = 0; - $this->bWriteOnErrorOnly = false; - $this->bWriteOnPhpErrorOnly = false; - $this->bFlushCache = false; - $this->aCache = array(); - - $this->aPrefixes = array( - \MailSo\Log\Enumerations\Type::INFO => '[DATA]', - \MailSo\Log\Enumerations\Type::SECURE => '[SECURE]', - \MailSo\Log\Enumerations\Type::NOTE => '[NOTE]', - \MailSo\Log\Enumerations\Type::TIME => '[TIME]', - \MailSo\Log\Enumerations\Type::TIME_DELTA => '[TIME]', - \MailSo\Log\Enumerations\Type::MEMORY => '[MEMORY]', - \MailSo\Log\Enumerations\Type::NOTICE => '[NOTICE]', - \MailSo\Log\Enumerations\Type::WARNING => '[WARNING]', - \MailSo\Log\Enumerations\Type::ERROR => '[ERROR]', - - \MailSo\Log\Enumerations\Type::NOTICE_PHP => '[NOTICE]', - \MailSo\Log\Enumerations\Type::WARNING_PHP => '[WARNING]', - \MailSo\Log\Enumerations\Type::ERROR_PHP => '[ERROR]', - ); - } - - /** - * @param string $sTimeOffset - * - * @return \MailSo\Log\Driver - */ - public function SetTimeOffset($sTimeOffset) - { - $this->sTimeOffset = (string) $sTimeOffset; - return $this; - } - - /** - * @return \MailSo\Log\Driver - */ - public function DisableGuidPrefix() - { - $this->bGuidPrefix = false; - return $this; - } - - /** - * @return \MailSo\Log\Driver - */ - public function DisableTimePrefix() - { - $this->bTimePrefix = false; - return $this; - } - - /** - * @param bool $bValue - * - * @return \MailSo\Log\Driver - */ - public function WriteOnErrorOnly($bValue) - { - $this->bWriteOnErrorOnly = !!$bValue; - return $this; - } - - /** - * @param bool $bValue - * - * @return \MailSo\Log\Driver - */ - public function WriteOnPhpErrorOnly($bValue) - { - $this->bWriteOnPhpErrorOnly = !!$bValue; - return $this; - } - - /** - * @param int $iTimeout - * - * @return \MailSo\Log\Driver - */ - public function WriteOnTimeoutOnly($iTimeout) - { - $this->iWriteOnTimeoutOnly = (int) $iTimeout; - if (0 > $this->iWriteOnTimeoutOnly) - { - $this->iWriteOnTimeoutOnly = 0; - } - - return $this; - } - - /** - * @return \MailSo\Log\Driver - */ - public function DisableTypedPrefix() - { - $this->bTypedPrefix = false; - return $this; - } - - /** - * @param string|array $mDesc - * @return bool - */ - abstract protected function writeImplementation($mDesc); - - /** - * @return bool - */ - protected function writeEmptyLineImplementation() - { - return $this->writeImplementation(''); - } - - /** - * @param string $sTimePrefix - * @param string $sDesc - * @param int $iType = \MailSo\Log\Enumerations\Type::INFO - * @param array $sName = '' - * - * @return string - */ - protected function loggerLineImplementation($sTimePrefix, $sDesc, - $iType = \MailSo\Log\Enumerations\Type::INFO, $sName = '') - { - return \ltrim( - ($this->bTimePrefix ? '['.$sTimePrefix.']' : ''). - ($this->bGuidPrefix ? '['.\MailSo\Log\Logger::Guid().']' : ''). - ($this->bTypedPrefix ? ' '.$this->getTypedPrefix($iType, $sName) : '') - ).$sDesc; - } - - /** - * @return bool - */ - protected function clearImplementation() - { - return true; - } - - /** - * @return string - */ - protected function getTimeWithMicroSec() - { - $aMicroTimeItems = \explode(' ', \microtime()); - return \MailSo\Log\Logger::DateHelper($this->sDatePattern, $this->sTimeOffset, $aMicroTimeItems[1]).'.'. - \str_pad((int) ($aMicroTimeItems[0] * 1000), 3, '0', STR_PAD_LEFT); - } - - /** - * @param int $iType - * @param string $sName = '' - * - * @return string - */ - protected function getTypedPrefix($iType, $sName = '') - { - $sName = 0 < \strlen($sName) ? $sName : $this->sName; - return isset($this->aPrefixes[$iType]) ? $sName.$this->aPrefixes[$iType].': ' : ''; - } - - /** - * @param string|array $mDesc - * @param bool $bDiplayCrLf = false - * - * @return string - */ - protected function localWriteImplementation($mDesc, $bDiplayCrLf = false) - { - if ($bDiplayCrLf) - { - if (\is_array($mDesc)) - { - foreach ($mDesc as &$sLine) - { - $sLine = \strtr($sLine, array("\r" => '\r', "\n" => '\n'.$this->sNewLine)); - $sLine = \rtrim($sLine); - } - } - else - { - $mDesc = \strtr($mDesc, array("\r" => '\r', "\n" => '\n'.$this->sNewLine)); - $mDesc = \rtrim($mDesc); - } - } - - return $this->writeImplementation($mDesc); - } - - /** - * @final - * @param string $sDesc - * @param int $iType = \MailSo\Log\Enumerations\Type::INFO - * @param string $sName = '' - * @param bool $bDiplayCrLf = false - * - * @return bool - */ - final public function Write($sDesc, $iType = \MailSo\Log\Enumerations\Type::INFO, $sName = '', $bDiplayCrLf = false) - { - $bResult = true; - if (!$this->bFlushCache && ($this->bWriteOnErrorOnly || $this->bWriteOnPhpErrorOnly || 0 < $this->iWriteOnTimeoutOnly)) - { - $bErrorPhp = false; - - $bError = $this->bWriteOnErrorOnly && \in_array($iType, array( - \MailSo\Log\Enumerations\Type::NOTICE, - \MailSo\Log\Enumerations\Type::NOTICE_PHP, - \MailSo\Log\Enumerations\Type::WARNING, - \MailSo\Log\Enumerations\Type::WARNING_PHP, - \MailSo\Log\Enumerations\Type::ERROR, - \MailSo\Log\Enumerations\Type::ERROR_PHP - )); - - if (!$bError) - { - $bErrorPhp = $this->bWriteOnPhpErrorOnly && \in_array($iType, array( - \MailSo\Log\Enumerations\Type::NOTICE_PHP, - \MailSo\Log\Enumerations\Type::WARNING_PHP, - \MailSo\Log\Enumerations\Type::ERROR_PHP - )); - } - - if ($bError || $bErrorPhp) - { - $sFlush = '--- FlushLogCache: '.($bError ? 'WriteOnErrorOnly' : 'WriteOnPhpErrorOnly'); - if (isset($this->aCache[0]) && empty($this->aCache[0])) - { - $this->aCache[0] = $sFlush; - \array_unshift($this->aCache, ''); - } - else - { - \array_unshift($this->aCache, $sFlush); - } - - $this->aCache[] = '--- FlushLogCache: Trigger'; - $this->aCache[] = $this->loggerLineImplementation($this->getTimeWithMicroSec(), $sDesc, $iType, $sName); - - $this->bFlushCache = true; - $bResult = $this->localWriteImplementation($this->aCache, $bDiplayCrLf); - $this->aCache = array(); - } - else if (0 < $this->iWriteOnTimeoutOnly && \time() - APP_START_TIME > $this->iWriteOnTimeoutOnly) - { - $sFlush = '--- FlushLogCache: WriteOnTimeoutOnly ['.(\time() - APP_START_TIME).'sec]'; - if (isset($this->aCache[0]) && empty($this->aCache[0])) - { - $this->aCache[0] = $sFlush; - \array_unshift($this->aCache, ''); - } - else - { - \array_unshift($this->aCache, $sFlush); - } - - $this->aCache[] = '--- FlushLogCache: Trigger'; - $this->aCache[] = $this->loggerLineImplementation($this->getTimeWithMicroSec(), $sDesc, $iType, $sName); - - $this->bFlushCache = true; - $bResult = $this->localWriteImplementation($this->aCache, $bDiplayCrLf); - $this->aCache = array(); - } - else - { - $this->aCache[] = $this->loggerLineImplementation($this->getTimeWithMicroSec(), $sDesc, $iType, $sName); - } - } - else - { - $bResult = $this->localWriteImplementation( - $this->loggerLineImplementation($this->getTimeWithMicroSec(), $sDesc, $iType, $sName), $bDiplayCrLf); - } - - return $bResult; - } - - /** - * @return string - */ - public function GetNewLine() - { - return $this->sNewLine; - } - - /** - * @final - * @return bool - */ - final public function Clear() - { - return $this->clearImplementation(); - } - - /** - * @final - * @return void - */ - final public function WriteEmptyLine() - { - if (!$this->bFlushCache && ($this->bWriteOnErrorOnly || $this->bWriteOnPhpErrorOnly || 0 < $this->iWriteOnTimeoutOnly)) - { - $this->aCache[] = ''; - } - else - { - $this->writeEmptyLineImplementation(); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Callback.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Callback.php deleted file mode 100755 index 021d7e82..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Callback.php +++ /dev/null @@ -1,83 +0,0 @@ -fWriteCallback = \is_callable($fWriteCallback) ? $fWriteCallback : null; - $this->fClearCallback = \is_callable($fClearCallback) ? $fClearCallback : null; - } - - /** - * @param mixed $fWriteCallback - * @param mixed $fClearCallback = null - * - * @return \MailSo\Log\Drivers\Callback - */ - public static function NewInstance($fWriteCallback, $fClearCallback = null) - { - return new self($fWriteCallback, $fClearCallback); - } - - /** - * @param string|array $mDesc - * - * @return bool - */ - protected function writeImplementation($mDesc) - { - if ($this->fWriteCallback) - { - \call_user_func_array($this->fWriteCallback, array($mDesc)); - } - - return true; - } - - /** - * @return bool - */ - protected function clearImplementation() - { - if ($this->fClearCallback) - { - \call_user_func($this->fClearCallback); - } - - return true; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/File.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/File.php deleted file mode 100755 index b3c3678c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/File.php +++ /dev/null @@ -1,91 +0,0 @@ -sLoggerFileName = $sLoggerFileName; - $this->sNewLine = $sNewLine; - } - - /** - * @param string $sLoggerFileName - */ - public function SetLoggerFileName($sLoggerFileName) - { - $this->sLoggerFileName = $sLoggerFileName; - } - - /** - * @param string $sLoggerFileName - * @param string $sNewLine = "\r\n" - * - * @return \MailSo\Log\Drivers\File - */ - public static function NewInstance($sLoggerFileName, $sNewLine = "\r\n") - { - return new self($sLoggerFileName, $sNewLine); - } - - /** - * @param string|array $mDesc - * - * @return bool - */ - protected function writeImplementation($mDesc) - { - return $this->writeToLogFile($mDesc); - } - - /** - * @return bool - */ - protected function clearImplementation() - { - return \unlink($this->sLoggerFileName); - } - - /** - * @param string|array $mDesc - * - * @return bool - */ - private function writeToLogFile($mDesc) - { - if (\is_array($mDesc)) - { - $mDesc = \implode($this->sNewLine, $mDesc); - } - - return \error_log($mDesc.$this->sNewLine, 3, $this->sLoggerFileName); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Inline.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Inline.php deleted file mode 100755 index 817ffbb5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Inline.php +++ /dev/null @@ -1,89 +0,0 @@ -sNewLine = $sNewLine; - $this->bHtmlEncodeSpecialChars = $bHtmlEncodeSpecialChars; - } - - /** - * @param string $sNewLine = "\r\n" - * @param bool $bHtmlEncodeSpecialChars = false - * - * @return \MailSo\Log\Drivers\Inline - */ - public static function NewInstance($sNewLine = "\r\n", $bHtmlEncodeSpecialChars = false) - { - return new self($sNewLine, $bHtmlEncodeSpecialChars); - } - - /** - * @param string $mDesc - * - * @return bool - */ - protected function writeImplementation($mDesc) - { - if (\is_array($mDesc)) - { - if ($this->bHtmlEncodeSpecialChars) - { - $mDesc = \array_map(function ($sItem) { - return \htmlspecialchars($sItem); - }, $mDesc); - } - - $mDesc = \implode($this->sNewLine, $mDesc); - } - else - { - echo ($this->bHtmlEncodeSpecialChars) ? \htmlspecialchars($mDesc).$this->sNewLine : $mDesc.$this->sNewLine; - } - - return true; - } - - /** - * @return bool - */ - protected function clearImplementation() - { - if (\defined('PHP_SAPI') && 'cli' === PHP_SAPI && \MailSo\Base\Utils::FunctionExistsAndEnabled('system')) - { - \system('clear'); - } - - return true; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Syslog.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Syslog.php deleted file mode 100755 index f1895067..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Drivers/Syslog.php +++ /dev/null @@ -1,81 +0,0 @@ -iLogLevel = \defined('LOG_INFO') ? LOG_INFO : 6; - - if (\function_exists('openlog') && \function_exists('closelog') && \defined('LOG_ODELAY') && \defined('LOG_USER')) - { - \openlog('rainloop', LOG_ODELAY, LOG_USER); - - \register_shutdown_function(function () { - @\closelog(); - }); - } - else - { - $this->iLogLevel = null; - } - } - - /** - * @return \MailSo\Log\Drivers\Syslog - */ - public static function NewInstance() - { - return new self(); - } - - /** - * @param string|array $mDesc - * - * @return bool - */ - protected function writeImplementation($mDesc) - { - if (null === $this->iLogLevel) - { - return false; - } - - if (\is_array($mDesc)) - { - $mDesc = \implode($this->sNewLine, $mDesc); - } - - return \syslog($this->iLogLevel, $mDesc); - } - - /** - * @return bool - */ - protected function clearImplementation() - { - return true; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Enumerations/Type.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Enumerations/Type.php deleted file mode 100755 index 6c3db90d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Log/Enumerations/Type.php +++ /dev/null @@ -1,34 +0,0 @@ -bUsed = false; - $this->aForbiddenTypes = array(); - $this->aSecretWords = array(); - $this->bShowSecter = false; - $this->bHideErrorNotices = false; - - if ($bRegPhpErrorHandler) - { - \set_error_handler(array(&$this, '__phpErrorHandler')); - } - - \register_shutdown_function(array(&$this, '__loggerShutDown')); - } - - /** - * @param bool $bRegPhpErrorHandler = false - * - * @return \MailSo\Log\Logger - */ - public static function NewInstance($bRegPhpErrorHandler = false) - { - return new self($bRegPhpErrorHandler); - } - - /** - * @staticvar \MailSo\Log\Logger $oInstance; - * - * @return \MailSo\Log\Logger - */ - public static function SingletonInstance() - { - static $oInstance = null; - if (null === $oInstance) - { - $oInstance = self::NewInstance(); - } - - return $oInstance; - } - - /** - * @param string $sFormat - * @param string $sTimeOffset = '0' - * @param int $iTimestamp = 0 - * - * @return string - */ - public static function DateHelper($sFormat, $sTimeOffset = '0', $iTimestamp = null) - { - $iTimestamp = null === $iTimestamp ? \time() : (int) $iTimestamp; - return \gmdate($sFormat, $iTimestamp + \MailSo\Base\DateTimeHelper::TimeToSec((string) $sTimeOffset)); - } - - /** - * @return bool - */ - public static function IsSystemEnabled() - { - return !!(\MailSo\Config::$SystemLogger instanceof \MailSo\Log\Logger); - } - - /** - * @param mixed $mData - * @param int $iType = \MailSo\Log\Enumerations\Type::INFO - */ - public static function SystemLog($mData, $iType = \MailSo\Log\Enumerations\Type::INFO) - { - if (\MailSo\Config::$SystemLogger instanceof \MailSo\Log\Logger) - { - \MailSo\Config::$SystemLogger->WriteMixed($mData, $iType); - } - } - - /** - * @staticvar string $sCache; - * - * @return string - */ - public static function Guid() - { - static $sCache = null; - if (null === $sCache) - { - $sCache = \substr(\MailSo\Base\Utils::Md5Rand(), -8); - } - - return $sCache; - } - - /** - * @return bool - */ - public function Ping() - { - return true; - } - - /** - * @return bool - */ - public function IsEnabled() - { - return 0 < $this->Count(); - } - - /** - * @param string $sWord - * - * @return bool - */ - public function AddSecret($sWord) - { - if (\is_string($sWord) && 0 < \strlen(\trim($sWord))) - { - $this->aSecretWords[] = $sWord; - $this->aSecretWords = \array_unique($this->aSecretWords); - } - } - - /** - * @param bool $bShow - * - * @return \MailSo\Log\Logger - */ - public function SetShowSecter($bShow) - { - $this->bShowSecter = !!$bShow; - return $this; - } - - /** - * @param bool $bValue - * - * @return \MailSo\Log\Logger - */ - public function HideErrorNotices($bValue) - { - $this->bHideErrorNotices = !!$bValue; - return $this; - } - - /** - * @return bool - */ - public function IsShowSecter() - { - return $this->bShowSecter; - } - - /** - * @param int $iType - * - * @return \MailSo\Log\Logger - */ - public function AddForbiddenType($iType) - { - $this->aForbiddenTypes[$iType] = true; - - return $this; - } - - /** - * @param int $iType - * - * @return \MailSo\Log\Logger - */ - public function RemoveForbiddenType($iType) - { - $this->aForbiddenTypes[$iType] = false; - return $this; - } - - /** - * @param int $iErrNo - * @param string $sErrStr - * @param string $sErrFile - * @param int $iErrLine - * - * @return bool - */ - public function __phpErrorHandler($iErrNo, $sErrStr, $sErrFile, $iErrLine) - { - $iType = \MailSo\Log\Enumerations\Type::NOTICE_PHP; - switch ($iErrNo) - { - case E_USER_ERROR: - $iType = \MailSo\Log\Enumerations\Type::ERROR_PHP; - break; - case E_USER_WARNING: - $iType = \MailSo\Log\Enumerations\Type::WARNING_PHP; - break; - } - - $this->Write($sErrFile.' [line:'.$iErrLine.', code:'.$iErrNo.']', $iType, 'PHP'); - $this->Write('Error: '.$sErrStr, $iType, 'PHP'); - - return !!(\MailSo\Log\Enumerations\Type::NOTICE === $iType && $this->bHideErrorNotices); - } - - /** - * @return void - */ - public function __loggerShutDown() - { - if ($this->bUsed) - { - $aStatistic = \MailSo\Base\Loader::Statistic(); - if (\is_array($aStatistic)) - { - if (isset($aStatistic['php']['memory_get_peak_usage'])) - { - $this->Write('Memory peak usage: '.$aStatistic['php']['memory_get_peak_usage'], - \MailSo\Log\Enumerations\Type::MEMORY); - } - - if (isset($aStatistic['time'])) - { - $this->Write('Time delta: '.$aStatistic['time'], \MailSo\Log\Enumerations\Type::TIME_DELTA); - } - } - } - } - - /** - * @return bool - */ - public function WriteEmptyLine() - { - $iResult = 1; - - $aLoggers =& $this->GetAsArray(); - foreach ($aLoggers as /* @var $oLogger \MailSo\Log\Driver */ &$oLogger) - { - $iResult &= $oLogger->WriteEmptyLine(); - } - - return (bool) $iResult; - } - - /** - * @param string $sDesc - * @param int $iType = \MailSo\Log\Enumerations\Type::INFO - * @param string $sName = '' - * @param bool $bSearchSecretWords = true - * @param bool $bDiplayCrLf = false - * - * @return bool - */ - public function Write($sDesc, $iType = \MailSo\Log\Enumerations\Type::INFO, - $sName = '', $bSearchSecretWords = true, $bDiplayCrLf = false) - { - if (isset($this->aForbiddenTypes[$iType]) && true === $this->aForbiddenTypes[$iType]) - { - return true; - } - - $this->bUsed = true; - - $oLogger = null; - $aLoggers = array(); - $iResult = 1; - - if ($bSearchSecretWords && !$this->bShowSecter && 0 < \count($this->aSecretWords)) - { - $sDesc = \str_replace($this->aSecretWords, '*******', $sDesc); - } - - $aLoggers =& $this->GetAsArray(); - foreach ($aLoggers as /* @var $oLogger \MailSo\Log\Driver */ $oLogger) - { - $iResult &= $oLogger->Write($sDesc, $iType, $sName, $bDiplayCrLf); - } - - return (bool) $iResult; - } - - /** - * @param mixed $oValue - * @param int $iType = \MailSo\Log\Enumerations\Type::INFO - * @param string $sName = '' - * @param bool $bSearchSecretWords = false - * @param bool $bDiplayCrLf = false - * - * @return bool - */ - public function WriteDump($oValue, $iType = \MailSo\Log\Enumerations\Type::INFO, $sName = '', - $bSearchSecretWords = false, $bDiplayCrLf = false) - { - return $this->Write(\print_r($oValue, true), $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); - } - - /** - * @param \Exception $oException - * @param int $iType = \MailSo\Log\Enumerations\Type::NOTICE - * @param string $sName = '' - * @param bool $bSearchSecretWords = true - * @param bool $bDiplayCrLf = false - * - * @return bool - */ - public function WriteException($oException, $iType = \MailSo\Log\Enumerations\Type::NOTICE, $sName = '', - $bSearchSecretWords = true, $bDiplayCrLf = false) - { - if ($oException instanceof \Exception) - { - if (isset($oException->__LOGINNED__)) - { - return true; - } - - $oException->__LOGINNED__ = true; - - return $this->Write((string) $oException, $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); - } - - return false; - } - - /** - * @param \Exception $oException - * @param int $iType = \MailSo\Log\Enumerations\Type::NOTICE - * @param string $sName = '' - * @param bool $bSearchSecretWords = true - * @param bool $bDiplayCrLf = false - * - * @return bool - */ - public function WriteExceptionShort($oException, $iType = \MailSo\Log\Enumerations\Type::NOTICE, $sName = '', - $bSearchSecretWords = true, $bDiplayCrLf = false) - { - if ($oException instanceof \Exception) - { - if (isset($oException->__LOGINNED__)) - { - return true; - } - - $oException->__LOGINNED__ = true; - - return $this->Write($oException->getMessage(), $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); - } - - return false; - } - - /** - * @param mixed $mData - * @param int $iType = \MailSo\Log\Enumerations\Type::NOTICE - * @param string $sName = '' - * @param bool $bSearchSecretWords = true - * @param bool $bDiplayCrLf = false - * - * @return bool - */ - public function WriteMixed($mData, $iType = null, $sName = '', - $bSearchSecretWords = true, $bDiplayCrLf = false) - { - $iType = null === $iType ? \MailSo\Log\Enumerations\Type::INFO : $iType; - if (\is_array($mData) || \is_object($mData)) - { - if ($mData instanceof \Exception) - { - $iType = null === $iType ? \MailSo\Log\Enumerations\Type::NOTICE : $iType; - return $this->WriteException($mData, $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); - } - else - { - return $this->WriteDump($mData, $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); - } - } - else - { - return $this->Write($mData, $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); - } - - return false; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Attachment.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Attachment.php deleted file mode 100755 index 51def4ef..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Attachment.php +++ /dev/null @@ -1,239 +0,0 @@ -Clear(); - } - - /** - * @return \MailSo\Mail\Attachment - */ - public function Clear() - { - $this->sFolder = ''; - $this->iUid = 0; - $this->oBodyStructure = null; - - return $this; - } - - /** - * @return string - */ - public function Folder() - { - return $this->sFolder; - } - - /** - * @return int - */ - public function Uid() - { - return $this->iUid; - } - - /** - * @return string - */ - public function MimeIndex() - { - return $this->oBodyStructure ? $this->oBodyStructure->PartID() : ''; - } - - /** - * @param bool $bCalculateOnEmpty = false - * - * @return string - */ - public function FileName($bCalculateOnEmpty = false) - { - $sFileName = ''; - if ($this->oBodyStructure) - { - $sFileName = $this->oBodyStructure->FileName(); - if ($bCalculateOnEmpty && 0 === \strlen(trim($sFileName))) - { - $sMimeType = \strtolower(\trim($this->MimeType())); - if ('message/rfc822' === $sMimeType) - { - $sFileName = 'message'.$this->MimeIndex().'.eml'; - } - else if ('text/calendar' === $sMimeType) - { - $sFileName = 'calendar'.$this->MimeIndex().'.ics'; - } - else if (0 < \strlen($sMimeType)) - { - $sFileName = \str_replace('/', $this->MimeIndex().'.', $sMimeType); - } - } - } - - return $sFileName; - } - - /** - * @return string - */ - public function MimeType() - { - return $this->oBodyStructure ? $this->oBodyStructure->ContentType() : ''; - } - - /** - * @return string - */ - public function ContentTransferEncoding() - { - return $this->oBodyStructure ? $this->oBodyStructure->MailEncodingName() : ''; - } - - /** - * @return int - */ - public function EncodedSize() - { - return $this->oBodyStructure ? $this->oBodyStructure->Size() : 0; - } - - /** - * @return int - */ - public function EstimatedSize() - { - return $this->oBodyStructure ? $this->oBodyStructure->EstimatedSize() : 0; - } - - /** - * @return string - */ - public function Cid() - { - return $this->oBodyStructure ? $this->oBodyStructure->ContentID() : ''; - } - - /** - * @return string - */ - public function ContentLocation() - { - return $this->oBodyStructure ? $this->oBodyStructure->ContentLocation() : ''; - } - - /** - * @return bool - */ - public function IsInline() - { - return $this->oBodyStructure ? $this->oBodyStructure->IsInline() : false; - } - - /** - * @return bool - */ - public function IsImage() - { - return $this->oBodyStructure ? $this->oBodyStructure->IsImage() : false; - } - - /** - * @return bool - */ - public function IsArchive() - { - return $this->oBodyStructure ? $this->oBodyStructure->IsArchive() : false; - } - - /** - * @return bool - */ - public function IsPdf() - { - return $this->oBodyStructure ? $this->oBodyStructure->IsPdf() : false; - } - - /** - * @return bool - */ - public function IsDoc() - { - return $this->oBodyStructure ? $this->oBodyStructure->IsDoc() : false; - } - - /** - * @return bool - */ - public function IsPgpSignature() - { - return $this->oBodyStructure ? $this->oBodyStructure->IsPgpSignature() : false; - } - - /** - * @return \MailSo\Mail\Attachment - */ - public static function NewInstance() - { - return new self(); - } - - /** - * @param string $sFolder - * @param int $iUid - * @param \MailSo\Imap\BodyStructure $oBodyStructure - * @return \MailSo\Mail\Attachment - */ - public static function NewBodyStructureInstance($sFolder, $iUid, $oBodyStructure) - { - return self::NewInstance()->InitByBodyStructure($sFolder, $iUid, $oBodyStructure); - } - - /** - * @param string $sFolder - * @param int $iUid - * @param \MailSo\Imap\BodyStructure $oBodyStructure - * @return \MailSo\Mail\Attachment - */ - public function InitByBodyStructure($sFolder, $iUid, $oBodyStructure) - { - $this->sFolder = $sFolder; - $this->iUid = $iUid; - $this->oBodyStructure = $oBodyStructure; - return $this; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/AttachmentCollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/AttachmentCollection.php deleted file mode 100755 index 5cc64b57..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/AttachmentCollection.php +++ /dev/null @@ -1,74 +0,0 @@ -FilterList(function ($oAttachment) { - return $oAttachment && $oAttachment->IsInline(); - }); - - return \is_array($aList) ? \count($aList) : 0; - } - - /** - * @return int - */ - public function NonInlineCount() - { - $aList = $this->FilterList(function ($oAttachment) { - return $oAttachment && !$oAttachment->IsInline(); - }); - - return \is_array($aList) ? \count($aList) : 0; - } - - /** - * @return array - */ - public function SpecData() - { - return $this->MapList(function ($oAttachment) { - if ($oAttachment) - { - return array($oAttachment->FileName(true), $oAttachment->MimeType()); - } - - return null; - }); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Exceptions/Exception.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Exceptions/Exception.php deleted file mode 100755 index 9bf1c421..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Exceptions/Exception.php +++ /dev/null @@ -1,19 +0,0 @@ -oImapFolder = $oImapFolder; - $this->oSubFolders = null; - - $aNames = \explode($this->oImapFolder->Delimiter(), $this->oImapFolder->FullNameRaw()); - $this->iNestingLevel = \count($aNames); - - $this->sParentFullNameRaw = ''; - if (1 < $this->iNestingLevel) - { - \array_pop($aNames); - $this->sParentFullNameRaw = \implode($this->oImapFolder->Delimiter(), $aNames); - } - - $this->bSubscribed = $bSubscribed; - $this->bExisten = $bExisten; - } - else - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - } - - /** - * @param \MailSo\Imap\Folder $oImapFolder - * @param bool $bSubscribed = true - * @param bool $bExisten = true - * - * @return \MailSo\Mail\Folder - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public static function NewInstance($oImapFolder, $bSubscribed = true, $bExisten = true) - { - return new self($oImapFolder, $bSubscribed, $bExisten); - } - - /** - * @param string $sFullNameRaw - * @param string $sDelimiter - * - * @return \MailSo\Mail\Folder - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public static function NewNonExistenInstance($sFullNameRaw, $sDelimiter) - { - return self::NewInstance( - \MailSo\Imap\Folder::NewInstance($sFullNameRaw, $sDelimiter, array('\NoSelect')), true, false); - } - - /** - * @return string - */ - public function Name() - { - return \MailSo\Base\Utils::ConvertEncoding($this->NameRaw(), - \MailSo\Base\Enumerations\Charset::UTF_7_IMAP, - \MailSo\Base\Enumerations\Charset::UTF_8); - } - - /** - * @return string - */ - public function FullName() - { - return \MailSo\Base\Utils::ConvertEncoding($this->FullNameRaw(), - \MailSo\Base\Enumerations\Charset::UTF_7_IMAP, - \MailSo\Base\Enumerations\Charset::UTF_8); - } - - /** - * @return string - */ - public function NameRaw() - { - return $this->oImapFolder->NameRaw(); - } - - /** - * @return string - */ - public function FullNameRaw() - { - return $this->oImapFolder->FullNameRaw(); - } - - /** - * @return string - */ - public function ParentFullName() - { - return \MailSo\Base\Utils::ConvertEncoding($this->sParentFullNameRaw, - \MailSo\Base\Enumerations\Charset::UTF_7_IMAP, - \MailSo\Base\Enumerations\Charset::UTF_8); - } - - /** - * @return string - */ - public function ParentFullNameRaw() - { - return $this->sParentFullNameRaw; - } - - /** - * @return string - */ - public function Delimiter() - { - return $this->oImapFolder->Delimiter(); - } - - /** - * @return array - */ - public function Flags() - { - return $this->oImapFolder->Flags(); - } - - /** - * @return array - */ - public function FlagsLowerCase() - { - return $this->oImapFolder->FlagsLowerCase(); - } - - /** - * @param bool $bCreateIfNull = false - * @return \MailSo\Mail\FolderCollection - */ - public function SubFolders($bCreateIfNull = false) - { - if ($bCreateIfNull && !$this->oSubFolders) - { - $this->oSubFolders = FolderCollection::NewInstance(); - } - - return $this->oSubFolders; - } - - /** - * @return bool - */ - public function HasSubFolders() - { - return $this->oSubFolders && 0 < $this->oSubFolders->Count(); - } - - /** - * @return bool - */ - public function HasVisibleSubFolders() - { - $sList = array(); - if ($this->oSubFolders) - { - $sList = $this->oSubFolders->FilterList(function (\MailSo\Mail\Folder $oFolder) { - return $oFolder->IsSubscribed(); - }); - } - - return 0 < \count($sList); - } - - /** - * @return bool - */ - public function IsSubscribed() - { - return $this->bSubscribed; - } - - /** - * @return bool - */ - public function IsExists() - { - return $this->bExisten; - } - - /** - * @return bool - */ - public function IsSelectable() - { - return $this->IsExists() && $this->oImapFolder->IsSelectable(); - } - - /** - * @return mixed - */ - public function Status() - { - return $this->oImapFolder->GetExtended('STATUS'); - } - - /** - * @return bool - */ - public function IsInbox() - { - return $this->oImapFolder->IsInbox(); - } - - /** - * @return int - */ - public function GetFolderListType() - { - $aFlags = $this->oImapFolder->FlagsLowerCase(); - $iListType = \MailSo\Imap\Enumerations\FolderType::USER; - - if (\is_array($aFlags)) - { - switch (true) - { - case \in_array('\inbox', $aFlags) || 'INBOX' === \strtoupper($this->FullNameRaw()): - $iListType = \MailSo\Imap\Enumerations\FolderType::INBOX; - break; - case \in_array('\sent', $aFlags): - case \in_array('\sentmail', $aFlags): - $iListType = \MailSo\Imap\Enumerations\FolderType::SENT; - break; - case \in_array('\drafts', $aFlags): - $iListType = \MailSo\Imap\Enumerations\FolderType::DRAFTS; - break; - case \in_array('\junk', $aFlags): - case \in_array('\spam', $aFlags): - $iListType = \MailSo\Imap\Enumerations\FolderType::JUNK; - break; - case \in_array('\trash', $aFlags): - case \in_array('\bin', $aFlags): - $iListType = \MailSo\Imap\Enumerations\FolderType::TRASH; - break; - case \in_array('\important', $aFlags): - $iListType = \MailSo\Imap\Enumerations\FolderType::IMPORTANT; - break; - case \in_array('\flagged', $aFlags): - case \in_array('\starred', $aFlags): - $iListType = \MailSo\Imap\Enumerations\FolderType::FLAGGED; - break; - case \in_array('\all', $aFlags): - case \in_array('\allmail', $aFlags): - case \in_array('\archive', $aFlags): - $iListType = \MailSo\Imap\Enumerations\FolderType::ALL; - break; - } - } - - return $iListType; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/FolderCollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/FolderCollection.php deleted file mode 100755 index 9f0c00a0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/FolderCollection.php +++ /dev/null @@ -1,279 +0,0 @@ -Namespace = ''; - $this->FoldersHash = ''; - $this->SystemFolders = array(); - $this->IsThreadsSupported = false; - $this->Optimized = false; - } - - /** - * @return \MailSo\Mail\FolderCollection - */ - public static function NewInstance() - { - return new self(); - } - - /** - * @param string $sFullNameRaw - * - * @return \MailSo\Mail\Folder|null - */ - public function GetByFullNameRaw($sFullNameRaw) - { - $mResult = null; - foreach ($this->aItems as /* @var $oFolder \MailSo\Mail\Folder */ $oFolder) - { - if ($oFolder->FullNameRaw() === $sFullNameRaw) - { - $mResult = $oFolder; - break; - } - else if ($oFolder->HasSubFolders()) - { - $mResult = $oFolder->SubFolders(true)->GetByFullNameRaw($sFullNameRaw); - if ($mResult) - { - break; - } - else - { - $mResult = null; - } - } - } - - return $mResult; - } - - /** - * @return int - */ - public function CountRec() - { - $iResult = $this->Count(); - foreach ($this->aItems as /* @var $oFolder \MailSo\Mail\Folder */ $oFolder) - { - if ($oFolder) - { - $oSub = $oFolder->SubFolders(); - $iResult += $oSub ? $oSub->CountRec() : 0; - } - } - - return $iResult; - } - - /** - * @return string - */ - public function GetNamespace() - { - return $this->Namespace; - } - - /** - * @return string - */ - public function FindDelimiter() - { - $sDelimiter = '/'; - - $oFolder = $this->GetByFullNameRaw('INBOX'); - if (!$oFolder) - { - $oFolder = $this->GetByIndex(0); - } - - if ($oFolder) - { - $sDelimiter = $oFolder->Delimiter(); - } - - return $sDelimiter; - } - - /** - * @param string $sNamespace - * - * @return \MailSo\Mail\FolderCollection - */ - public function SetNamespace($sNamespace) - { - $this->Namespace = $sNamespace; - - return $this; - } - - /** - * @param array $aUnsortedMailFolders - * - * @return void - */ - public function InitByUnsortedMailFolderArray($aUnsortedMailFolders) - { - $this->Clear(); - - $aSortedByLenImapFolders = array(); - foreach ($aUnsortedMailFolders as /* @var $oMailFolder \MailSo\Mail\Folder */ &$oMailFolder) - { - $aSortedByLenImapFolders[$oMailFolder->FullNameRaw()] =& $oMailFolder; - unset($oMailFolder); - } - unset($aUnsortedMailFolders); - - $aAddedFolders = array(); - foreach ($aSortedByLenImapFolders as /* @var $oMailFolder \MailSo\Mail\Folder */ $oMailFolder) - { - $sDelimiter = $oMailFolder->Delimiter(); - $aFolderExplode = \explode($sDelimiter, $oMailFolder->FullNameRaw()); - - if (1 < \count($aFolderExplode)) - { - \array_pop($aFolderExplode); - - $sNonExistenFolderFullNameRaw = ''; - foreach ($aFolderExplode as $sFolderExplodeItem) - { - $sNonExistenFolderFullNameRaw .= (0 < \strlen($sNonExistenFolderFullNameRaw)) - ? $sDelimiter.$sFolderExplodeItem : $sFolderExplodeItem; - - if (!isset($aSortedByLenImapFolders[$sNonExistenFolderFullNameRaw])) - { - try - { - $aAddedFolders[$sNonExistenFolderFullNameRaw] = - Folder::NewNonExistenInstance($sNonExistenFolderFullNameRaw, $sDelimiter); - } - catch (\Exception $oExc) - { - unset($oExc); - } - } - } - } - } - - $aSortedByLenImapFolders = \array_merge($aSortedByLenImapFolders, $aAddedFolders); - unset($aAddedFolders); - - \uasort($aSortedByLenImapFolders, function ($oFolderA, $oFolderB) { - return \strnatcmp($oFolderA->FullNameRaw(), $oFolderB->FullNameRaw()); - }); - - foreach ($aSortedByLenImapFolders as /* @var $oMailFolder \MailSo\Mail\Folder */ &$oMailFolder) - { - $this->AddWithPositionSearch($oMailFolder); - unset($oMailFolder); - } - - unset($aSortedByLenImapFolders); - } - - /** - * @param \MailSo\Mail\Folder $oMailFolder - * - * @return bool - */ - public function AddWithPositionSearch($oMailFolder) - { - $oItemFolder = null; - $bIsAdded = false; - $aList =& $this->GetAsArray(); - - foreach ($aList as /* @var $oItemFolder \MailSo\Mail\Folder */ $oItemFolder) - { - if ($oMailFolder instanceof \MailSo\Mail\Folder && - 0 === \strpos($oMailFolder->FullNameRaw(), $oItemFolder->FullNameRaw().$oItemFolder->Delimiter())) - { - if ($oItemFolder->SubFolders(true)->AddWithPositionSearch($oMailFolder)) - { - $bIsAdded = true; - } - - break; - } - } - - if (!$bIsAdded && $oMailFolder instanceof \MailSo\Mail\Folder) - { - $bIsAdded = true; - $this->Add($oMailFolder); - } - - return $bIsAdded; - } - - /** - * @param callable $fCallback - * - * @return void - */ - public function SortByCallback($fCallback) - { - if (\is_callable($fCallback)) - { - $aList =& $this->GetAsArray(); - - \usort($aList, $fCallback); - - foreach ($aList as &$oItemFolder) - { - if ($oItemFolder->HasSubFolders()) - { - $oItemFolder->SubFolders()->SortByCallback($fCallback); - } - } - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/MailClient.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/MailClient.php deleted file mode 100755 index 1e95e251..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/MailClient.php +++ /dev/null @@ -1,2677 +0,0 @@ -oLogger = null; - - $this->oImapClient = \MailSo\Imap\ImapClient::NewInstance(); - $this->oImapClient->SetTimeOuts(10, \MailSo\Config::$ImapTimeout); - } - - /** - * @return \MailSo\Mail\MailClient - */ - public static function NewInstance() - { - return new self(); - } - - /** - * @return \MailSo\Imap\ImapClient - */ - public function ImapClient() - { - return $this->oImapClient; - } - - /** - * @param string $sServerName - * @param int $iPort = 143 - * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT - * @param bool $bVerifySsl = false - * - * @return \MailSo\Mail\MailClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function Connect($sServerName, $iPort = 143, - $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT, $bVerifySsl = false) - { - $this->oImapClient->Connect($sServerName, $iPort, $iSecurityType, $bVerifySsl); - return $this; - } - - /** - * @param string $sLogin - * @param string $sPassword - * @param string $sProxyAuthUser = '' - * @param bool $bUseAuthPlainIfSupported = true - * @param bool $bUseAuthCramMd5IfSupported = true - * - * @return \MailSo\Mail\MailClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\LoginException - */ - public function Login($sLogin, $sPassword, $sProxyAuthUser = '', - $bUseAuthPlainIfSupported = true, $bUseAuthCramMd5IfSupported = true) - { - $this->oImapClient->Login($sLogin, $sPassword, $sProxyAuthUser, $bUseAuthPlainIfSupported, $bUseAuthCramMd5IfSupported); - return $this; - } - - /** - * @param string $sXOAuth2Token - * - * @return \MailSo\Mail\MailClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\LoginException - */ - public function LoginWithXOauth2($sXOAuth2Token) - { - $this->oImapClient->LoginWithXOauth2($sXOAuth2Token); - return $this; - } - - /** - * @return \MailSo\Mail\MailClient - * - * @throws \MailSo\Net\Exceptions\Exception - */ - public function Logout() - { - $this->oImapClient->Logout(); - return $this; - } - - /** - * @return \MailSo\Mail\MailClient - * - * @throws \MailSo\Net\Exceptions\Exception - */ - public function Disconnect() - { - $this->oImapClient->Disconnect(); - return $this; - } - - /** - * @return \MailSo\Mail\MailClient - * - * @throws \MailSo\Net\Exceptions\Exception - */ - public function LogoutAndDisconnect() - { - return $this->Logout()->Disconnect(); - } - - /** - * @return bool - */ - public function IsConnected() - { - return $this->oImapClient->IsConnected(); - } - - /** - * @return bool - */ - public function IsLoggined() - { - return $this->oImapClient->IsLoggined(); - } - - /** - * @return string - */ - private function getEnvelopeOrHeadersRequestStringForSimpleList() - { - return \MailSo\Imap\Enumerations\FetchType::BuildBodyCustomHeaderRequest(array( - \MailSo\Mime\Enumerations\Header::RETURN_PATH, - \MailSo\Mime\Enumerations\Header::RECEIVED, - \MailSo\Mime\Enumerations\Header::MIME_VERSION, - \MailSo\Mime\Enumerations\Header::FROM_, - \MailSo\Mime\Enumerations\Header::TO_, - \MailSo\Mime\Enumerations\Header::CC, - \MailSo\Mime\Enumerations\Header::SENDER, - \MailSo\Mime\Enumerations\Header::REPLY_TO, - \MailSo\Mime\Enumerations\Header::DATE, - \MailSo\Mime\Enumerations\Header::SUBJECT, - \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, - \MailSo\Mime\Enumerations\Header::LIST_UNSUBSCRIBE, - ), true); - } - - /** - * @return string - */ - private function getEnvelopeOrHeadersRequestString() - { - if (\MailSo\Config::$MessageAllHeaders) - { - return \MailSo\Imap\Enumerations\FetchType::BODY_HEADER_PEEK; - } - - return \MailSo\Imap\Enumerations\FetchType::BuildBodyCustomHeaderRequest(array( - \MailSo\Mime\Enumerations\Header::RETURN_PATH, - \MailSo\Mime\Enumerations\Header::RECEIVED, - \MailSo\Mime\Enumerations\Header::MIME_VERSION, - \MailSo\Mime\Enumerations\Header::MESSAGE_ID, - \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, - \MailSo\Mime\Enumerations\Header::FROM_, - \MailSo\Mime\Enumerations\Header::TO_, - \MailSo\Mime\Enumerations\Header::CC, - \MailSo\Mime\Enumerations\Header::BCC, - \MailSo\Mime\Enumerations\Header::SENDER, - \MailSo\Mime\Enumerations\Header::REPLY_TO, - \MailSo\Mime\Enumerations\Header::DELIVERED_TO, - \MailSo\Mime\Enumerations\Header::IN_REPLY_TO, - \MailSo\Mime\Enumerations\Header::REFERENCES, - \MailSo\Mime\Enumerations\Header::DATE, - \MailSo\Mime\Enumerations\Header::SUBJECT, - \MailSo\Mime\Enumerations\Header::SENSITIVITY, - \MailSo\Mime\Enumerations\Header::X_MSMAIL_PRIORITY, - \MailSo\Mime\Enumerations\Header::IMPORTANCE, - \MailSo\Mime\Enumerations\Header::X_PRIORITY, - \MailSo\Mime\Enumerations\Header::X_DRAFT_INFO, - \MailSo\Mime\Enumerations\Header::RETURN_RECEIPT_TO, - \MailSo\Mime\Enumerations\Header::DISPOSITION_NOTIFICATION_TO, - \MailSo\Mime\Enumerations\Header::X_CONFIRM_READING_TO, - \MailSo\Mime\Enumerations\Header::AUTHENTICATION_RESULTS, - \MailSo\Mime\Enumerations\Header::X_DKIM_AUTHENTICATION_RESULTS, - \MailSo\Mime\Enumerations\Header::LIST_UNSUBSCRIBE, - ), true); -// -// return \MailSo\Imap\Enumerations\FetchType::ENVELOPE; - } - - /** - * @param string $sFolderName - * @param string $sMessageFlag - * @param bool $bSetAction = true - * @param bool $sSkipUnsupportedFlag = false - * @param array $aCustomUids = null - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - * @throws \MailSo\Mail\Exceptions\Exception - */ - public function MessageSetFlagToAll($sFolderName, $sMessageFlag, $bSetAction = true, $sSkipUnsupportedFlag = false, $aCustomUids = null) - { - $this->oImapClient->FolderSelect($sFolderName); - - $oFolderInfo = $this->oImapClient->FolderCurrentInformation(); - if (!$oFolderInfo || !$oFolderInfo->IsFlagSupported($sMessageFlag)) - { - if (!$sSkipUnsupportedFlag) - { - throw new \MailSo\Mail\Exceptions\RuntimeException('Message flag "'.$sMessageFlag.'" is not supported.'); - } - } - - if ($oFolderInfo && 0 < $oFolderInfo->Exists) - { - $sStoreAction = $bSetAction - ? \MailSo\Imap\Enumerations\StoreAction::ADD_FLAGS_SILENT - : \MailSo\Imap\Enumerations\StoreAction::REMOVE_FLAGS_SILENT - ; - - if (is_array($aCustomUids)) - { - if (0 < count($aCustomUids)) - { - $this->oImapClient->MessageStoreFlag(implode(',', $aCustomUids), true, array($sMessageFlag), $sStoreAction); - } - } - else - { - $this->oImapClient->MessageStoreFlag('1:*', false, array($sMessageFlag), $sStoreAction); - } - } - } - - /** - * @param string $sFolderName - * @param array $aIndexRange - * @param bool $bIndexIsUid - * @param string $sMessageFlag - * @param bool $bSetAction = true - * @param bool $sSkipUnsupportedFlag = false - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - * @throws \MailSo\Mail\Exceptions\Exception - */ - public function MessageSetFlag($sFolderName, $aIndexRange, $bIndexIsUid, $sMessageFlag, $bSetAction = true, $sSkipUnsupportedFlag = false) - { - $this->oImapClient->FolderSelect($sFolderName); - - $oFolderInfo = $this->oImapClient->FolderCurrentInformation(); - if (!$oFolderInfo || !$oFolderInfo->IsFlagSupported($sMessageFlag)) - { - if (!$sSkipUnsupportedFlag) - { - throw new \MailSo\Mail\Exceptions\RuntimeException('Message flag "'.$sMessageFlag.'" is not supported.'); - } - } - else - { - $sStoreAction = $bSetAction - ? \MailSo\Imap\Enumerations\StoreAction::ADD_FLAGS_SILENT - : \MailSo\Imap\Enumerations\StoreAction::REMOVE_FLAGS_SILENT - ; - - $this->oImapClient->MessageStoreFlag(\MailSo\Base\Utils::PrepearFetchSequence($aIndexRange), - $bIndexIsUid, array($sMessageFlag), $sStoreAction); - } - } - - /** - * @param string $sFolderName - * @param array $aIndexRange - * @param bool $bIndexIsUid - * @param bool $bSetAction = true - * @param bool $sSkipUnsupportedFlag = false - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function MessageSetFlagged($sFolderName, $aIndexRange, $bIndexIsUid, $bSetAction = true, $sSkipUnsupportedFlag = false) - { - $this->MessageSetFlag($sFolderName, $aIndexRange, $bIndexIsUid, - \MailSo\Imap\Enumerations\MessageFlag::FLAGGED, $bSetAction, $sSkipUnsupportedFlag); - } - - /** - * @param string $sFolderName - * @param bool $bSetAction = true - * @param array $aCustomUids = null - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function MessageSetSeenToAll($sFolderName, $bSetAction = true, $aCustomUids = null) - { - $this->MessageSetFlagToAll($sFolderName, \MailSo\Imap\Enumerations\MessageFlag::SEEN, $bSetAction, true, $aCustomUids); - } - - /** - * @param string $sFolderName - * @param array $aIndexRange - * @param bool $bIndexIsUid - * @param bool $bSetAction = true - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function MessageSetSeen($sFolderName, $aIndexRange, $bIndexIsUid, $bSetAction = true) - { - $this->MessageSetFlag($sFolderName, $aIndexRange, $bIndexIsUid, - \MailSo\Imap\Enumerations\MessageFlag::SEEN, $bSetAction, true); - } - - /** - * @param string $sFolderName - * @param int $iIndex - * @param bool $bIndexIsUid = true - * @param \MailSo\Cache\CacheClient $oCacher = null - * @param int $iBodyTextLimit = null - * - * @return \MailSo\Mail\Message|false - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function Message($sFolderName, $iIndex, $bIndexIsUid = true, $oCacher = null, $iBodyTextLimit = null) - { - if (!\MailSo\Base\Validator::RangeInt($iIndex, 1)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $this->oImapClient->FolderSelect($sFolderName); - - $oBodyStructure = null; - $oMessage = false; - - $aBodyPeekMimeIndexes = array(); - $aSignatureMimeIndexes = array(); - - $aFetchResponse = $this->oImapClient->Fetch(array(\MailSo\Imap\Enumerations\FetchType::BODYSTRUCTURE), $iIndex, $bIndexIsUid); - if (0 < \count($aFetchResponse) && isset($aFetchResponse[0])) - { - $oBodyStructure = $aFetchResponse[0]->GetFetchBodyStructure(); - if ($oBodyStructure) - { - $aTextParts = $oBodyStructure->SearchHtmlOrPlainParts(); - if (is_array($aTextParts) && 0 < \count($aTextParts)) - { - foreach ($aTextParts as $oPart) - { - $aBodyPeekMimeIndexes[] = array($oPart->PartID(), $oPart->Size()); - } - } - - $aSignatureParts = $oBodyStructure->SearchByContentType('application/pgp-signature'); - if (is_array($aSignatureParts) && 0 < \count($aSignatureParts)) - { - foreach ($aSignatureParts as $oPart) - { - $aSignatureMimeIndexes[] = $oPart->PartID(); - } - } - } - } - - $aFetchItems = array( - \MailSo\Imap\Enumerations\FetchType::INDEX, - \MailSo\Imap\Enumerations\FetchType::UID, - \MailSo\Imap\Enumerations\FetchType::RFC822_SIZE, - \MailSo\Imap\Enumerations\FetchType::INTERNALDATE, - \MailSo\Imap\Enumerations\FetchType::FLAGS, - $this->getEnvelopeOrHeadersRequestString() - ); - - if (0 < \count($aBodyPeekMimeIndexes)) - { - foreach ($aBodyPeekMimeIndexes as $aTextMimeData) - { - $sLine = \MailSo\Imap\Enumerations\FetchType::BODY_PEEK.'['.$aTextMimeData[0].']'; - if (\is_numeric($iBodyTextLimit) && 0 < $iBodyTextLimit && $iBodyTextLimit < $aTextMimeData[1]) - { - $sLine .= '<0.'.((int) $iBodyTextLimit).'>'; - } - - $aFetchItems[] = $sLine; - } - } - - if (0 < \count($aSignatureMimeIndexes)) - { - foreach ($aSignatureMimeIndexes as $sTextMimeIndex) - { - $aFetchItems[] = \MailSo\Imap\Enumerations\FetchType::BODY_PEEK.'['.$sTextMimeIndex.']'; - } - } - - if (!$oBodyStructure) - { - $aFetchItems[] = \MailSo\Imap\Enumerations\FetchType::BODYSTRUCTURE; - } - - $aFetchResponse = $this->oImapClient->Fetch($aFetchItems, $iIndex, $bIndexIsUid); - if (0 < \count($aFetchResponse)) - { - $oMessage = \MailSo\Mail\Message::NewFetchResponseInstance( - $sFolderName, $aFetchResponse[0], $oBodyStructure); - } - - return $oMessage; - } - - /** - * @param mixed $mCallback - * @param string $sFolderName - * @param int $iIndex - * @param bool $bIndexIsUid = true, - * @param string $sMimeIndex = '' - * - * @return bool - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function MessageMimeStream($mCallback, $sFolderName, $iIndex, $bIndexIsUid = true, $sMimeIndex = '') - { - if (!is_callable($mCallback)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $this->oImapClient->FolderSelect($sFolderName); - - $sFileName = ''; - $sContentType = ''; - $sMailEncodingName = ''; - - $sMimeIndex = trim($sMimeIndex); - $aFetchResponse = $this->oImapClient->Fetch(array( - 0 === \strlen($sMimeIndex) - ? \MailSo\Imap\Enumerations\FetchType::BODY_HEADER_PEEK - : \MailSo\Imap\Enumerations\FetchType::BODY_PEEK.'['.$sMimeIndex.'.MIME]' - ), $iIndex, $bIndexIsUid); - - if (0 < \count($aFetchResponse)) - { - $sMime = $aFetchResponse[0]->GetFetchValue( - 0 === \strlen($sMimeIndex) - ? \MailSo\Imap\Enumerations\FetchType::BODY_HEADER - : \MailSo\Imap\Enumerations\FetchType::BODY.'['.$sMimeIndex.'.MIME]' - ); - - if (0 < \strlen($sMime)) - { - $oHeaders = \MailSo\Mime\HeaderCollection::NewInstance()->Parse($sMime); - - if (0 < \strlen($sMimeIndex)) - { - $sFileName = $oHeaders->ParameterValue( - \MailSo\Mime\Enumerations\Header::CONTENT_DISPOSITION, - \MailSo\Mime\Enumerations\Parameter::FILENAME); - - if (0 === \strlen($sFileName)) - { - $sFileName = $oHeaders->ParameterValue( - \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, - \MailSo\Mime\Enumerations\Parameter::NAME); - } - - $sMailEncodingName = $oHeaders->ValueByName( - \MailSo\Mime\Enumerations\Header::CONTENT_TRANSFER_ENCODING); - - $sContentType = $oHeaders->ValueByName( - \MailSo\Mime\Enumerations\Header::CONTENT_TYPE); - } - else - { - $sSubject = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::SUBJECT); - - $sFileName = 0 === \strlen($sSubject) ? (string) $iIndex : $sSubject; - $sFileName .= '.eml'; - - $sContentType = 'message/rfc822'; - } - } - } - - $aFetchResponse = $this->oImapClient->Fetch(array( - array(\MailSo\Imap\Enumerations\FetchType::BODY_PEEK.'['.$sMimeIndex.']', - function ($sParent, $sLiteralAtomUpperCase, $rImapLiteralStream) use ($mCallback, $sMimeIndex, $sMailEncodingName, $sContentType, $sFileName) - { - if (0 < \strlen($sLiteralAtomUpperCase)) - { - if (is_resource($rImapLiteralStream) && 'FETCH' === $sParent) - { - $rMessageMimeIndexStream = (0 === \strlen($sMailEncodingName)) - ? $rImapLiteralStream - : \MailSo\Base\StreamWrappers\Binary::CreateStream($rImapLiteralStream, - \MailSo\Base\StreamWrappers\Binary::GetInlineDecodeOrEncodeFunctionName( - $sMailEncodingName, true)); - - \call_user_func($mCallback, $rMessageMimeIndexStream, $sContentType, $sFileName, $sMimeIndex); - } - } - } - )), $iIndex, $bIndexIsUid); - - return ($aFetchResponse && 1 === \count($aFetchResponse)); - } - - /** - * @param string $sFolder - * @param array $aIndexRange - * @param bool $bIndexIsUid - * @param bool $bUseExpunge = true - * @param bool $bExpungeAll = false - * - * @return \MailSo\Mail\MailClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function MessageDelete($sFolder, $aIndexRange, $bIndexIsUid, $bUseExpunge = true, $bExpungeAll = false) - { - if (0 === \strlen($sFolder) || !\is_array($aIndexRange) || 0 === \count($aIndexRange)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $this->oImapClient->FolderSelect($sFolder); - - $sIndexRange = \MailSo\Base\Utils::PrepearFetchSequence($aIndexRange); - - $this->oImapClient->MessageStoreFlag($sIndexRange, $bIndexIsUid, - array(\MailSo\Imap\Enumerations\MessageFlag::DELETED), - \MailSo\Imap\Enumerations\StoreAction::ADD_FLAGS_SILENT - ); - - if ($bUseExpunge) - { - $this->oImapClient->MessageExpunge($bIndexIsUid ? $sIndexRange : '', $bIndexIsUid, $bExpungeAll); - } - - return $this; - } - - /** - * @param string $sFromFolder - * @param string $sToFolder - * @param array $aIndexRange - * @param bool $bIndexIsUid - * @param bool $bUseMoveSupported = false - * @param bool $bExpungeAll = false - * - * @return \MailSo\Mail\MailClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function MessageMove($sFromFolder, $sToFolder, $aIndexRange, $bIndexIsUid, $bUseMoveSupported = false, $bExpungeAll = false) - { - if (0 === \strlen($sFromFolder) || 0 === \strlen($sToFolder) || - !\is_array($aIndexRange) || 0 === \count($aIndexRange)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $this->oImapClient->FolderSelect($sFromFolder); - - if ($bUseMoveSupported && $this->oImapClient->IsSupported('MOVE')) - { - $this->oImapClient->MessageMove($sToFolder, - \MailSo\Base\Utils::PrepearFetchSequence($aIndexRange), $bIndexIsUid); - } - else - { - $this->oImapClient->MessageCopy($sToFolder, - \MailSo\Base\Utils::PrepearFetchSequence($aIndexRange), $bIndexIsUid); - - $this->MessageDelete($sFromFolder, $aIndexRange, $bIndexIsUid, true, $bExpungeAll); - } - - return $this; - } - - /** - * @param string $sFromFolder - * @param string $sToFolder - * @param array $aIndexRange - * @param bool $bIndexIsUid - * - * @return \MailSo\Mail\MailClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function MessageCopy($sFromFolder, $sToFolder, $aIndexRange, $bIndexIsUid) - { - if (0 === \strlen($sFromFolder) || 0 === \strlen($sToFolder) || - !\is_array($aIndexRange) || 0 === \count($aIndexRange)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $this->oImapClient->FolderSelect($sFromFolder); - $this->oImapClient->MessageCopy($sToFolder, - \MailSo\Base\Utils::PrepearFetchSequence($aIndexRange), $bIndexIsUid); - - return $this; - } - - /** - * @return \MailSo\Mail\MailClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function FolderUnSelect() - { - if ($this->oImapClient->IsSelected()) - { - $this->oImapClient->FolderUnSelect(); - } - - return $this; - } - - /** - * @param resource $rMessageStream - * @param int $iMessageStreamSize - * @param string $sFolderToSave - * @param array $aAppendFlags = null - * @param int $iUid = null - * - * @return \MailSo\Mail\MailClient - */ - public function MessageAppendStream($rMessageStream, $iMessageStreamSize, $sFolderToSave, $aAppendFlags = null, &$iUid = null) - { - if (!\is_resource($rMessageStream) || 0 === \strlen($sFolderToSave)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $this->oImapClient->MessageAppendStream( - $sFolderToSave, $rMessageStream, $iMessageStreamSize, $aAppendFlags, $iUid); - - return $this; - } - - /** - * @param string $sMessageFileName - * @param string $sFolderToSave - * @param array $aAppendFlags = null - * @param int &$iUid = null - * - * @return \MailSo\Mail\MailClient - */ - public function MessageAppendFile($sMessageFileName, $sFolderToSave, $aAppendFlags = null, &$iUid = null) - { - if (!@\is_file($sMessageFileName) || !@\is_readable($sMessageFileName)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $iMessageStreamSize = \filesize($sMessageFileName); - $rMessageStream = \fopen($sMessageFileName, 'rb'); - - $this->MessageAppendStream($rMessageStream, $iMessageStreamSize, $sFolderToSave, $aAppendFlags, $iUid); - - if (\is_resource($rMessageStream)) - { - @fclose($rMessageStream); - } - - return $this; - } - - /** - * @param string $sFolderName - * @param int $iCount - * @param int $iUnseenCount - * @param string $sUidNext - * @param string $sHighestModSeq - * - * @return void - */ - protected function initFolderValues($sFolderName, &$iCount, &$iUnseenCount, - &$sUidNext, &$sHighestModSeq = '') - { - $aTypes = array( - \MailSo\Imap\Enumerations\FolderResponseStatus::MESSAGES, - \MailSo\Imap\Enumerations\FolderResponseStatus::UNSEEN, - \MailSo\Imap\Enumerations\FolderResponseStatus::UIDNEXT - ); - - if ($this->oImapClient->IsSupported('CONDSTORE')) - { - $aTypes[] = \MailSo\Imap\Enumerations\FolderResponseStatus::HIGHESTMODSEQ; - } - - $aFolderStatus = $this->oImapClient->FolderStatus($sFolderName, $aTypes); - - $iCount = isset($aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::MESSAGES]) - ? (int) $aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::MESSAGES] : 0; - - $iUnseenCount = isset($aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::UNSEEN]) - ? (int) $aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::UNSEEN] : 0; - - $sUidNext = isset($aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::UIDNEXT]) - ? (string) $aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::UIDNEXT] : '0'; - - $sHighestModSeq = isset($aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::HIGHESTMODSEQ]) - ? (string) $aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::HIGHESTMODSEQ] : ''; - - if ($this->IsGmail() && - ('INBOX' === $sFolderName || '[gmail]' === \strtolower(\substr($sFolderName, 0, 7)))) - { - $oFolder = $this->oImapClient->FolderCurrentInformation(); - if ($oFolder && null !== $oFolder->Exists && $oFolder->FolderName === $sFolderName) - { - $iSubCount = (int) $oFolder->Exists; - if (0 < $iSubCount && $iSubCount < $iCount) - { - $iCount = $iSubCount; - } - } - } - } - - /** - * @return string - */ - public function GenerateImapClientHash() - { - return \md5('ImapClientHash/'. - $this->oImapClient->GetLogginedUser().'@'. - $this->oImapClient->GetConnectedHost().':'. - $this->oImapClient->GetConnectedPort() - ); - } - - /** - * @param string $sFolder - * @param int $iCount - * @param int $iUnseenCount - * @param string $sUidNext - * @param string $sHighestModSeq = '' - * - * @return string - */ - public function GenerateFolderHash($sFolder, $iCount, $iUnseenCount, $sUidNext, $sHighestModSeq = '') - { - $iUnseenCount = 0; // unneccessery - return \md5('FolderHash/'.$sFolder.'-'.$iCount.'-'.$iUnseenCount.'-'.$sUidNext.'-'. - $sHighestModSeq.'-'.$this->GenerateImapClientHash().'-'. - \MailSo\Config::$MessageListPermanentFilter - ); - } - - /** - * @param string $sFolderName - * @param string $sPrevUidNext - * @param string $sCurrentUidNext - * - * @return array - */ - private function getFolderNextMessageInformation($sFolderName, $sPrevUidNext, $sCurrentUidNext) - { - $aNewMessages = array(); - - if (0 < \strlen($sPrevUidNext) && (string) $sPrevUidNext !== (string) $sCurrentUidNext) - { - $this->oImapClient->FolderSelect($sFolderName); - - $aFetchResponse = $this->oImapClient->Fetch(array( - \MailSo\Imap\Enumerations\FetchType::INDEX, - \MailSo\Imap\Enumerations\FetchType::UID, - \MailSo\Imap\Enumerations\FetchType::FLAGS, - \MailSo\Imap\Enumerations\FetchType::BuildBodyCustomHeaderRequest(array( - \MailSo\Mime\Enumerations\Header::FROM_, - \MailSo\Mime\Enumerations\Header::SUBJECT, - \MailSo\Mime\Enumerations\Header::CONTENT_TYPE - )) - ), $sPrevUidNext.':*', true); - - if (\is_array($aFetchResponse) && 0 < \count($aFetchResponse)) - { - foreach ($aFetchResponse as /* @var $oFetchResponse \MailSo\Imap\FetchResponse */ $oFetchResponse) - { - $aFlags = \array_map('strtolower', $oFetchResponse->GetFetchValue( - \MailSo\Imap\Enumerations\FetchType::FLAGS)); - - if (!\in_array(\strtolower(\MailSo\Imap\Enumerations\MessageFlag::SEEN), $aFlags)) - { - $sUid = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::UID); - $sHeaders = $oFetchResponse->GetHeaderFieldsValue(); - - $oHeaders = \MailSo\Mime\HeaderCollection::NewInstance()->Parse($sHeaders); - - $sContentTypeCharset = $oHeaders->ParameterValue( - \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, - \MailSo\Mime\Enumerations\Parameter::CHARSET - ); - - $sCharset = ''; - if (0 < \strlen($sContentTypeCharset)) - { - $sCharset = $sContentTypeCharset; - } - - if (0 < \strlen($sCharset)) - { - $oHeaders->SetParentCharset($sCharset); - } - - $aNewMessages[] = array( - 'Folder' => $sFolderName, - 'Uid' => $sUid, - 'Subject' => $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::SUBJECT, 0 === \strlen($sCharset)), - 'From' => $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::FROM_, 0 === \strlen($sCharset)) - ); - } - } - } - } - - return $aNewMessages; - } - - /** - * @param string $sFolderName - * @param string $sPrevUidNext = '' - * @param array $aUids = '' - * - * @return string - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function FolderInformation($sFolderName, $sPrevUidNext = '', $aUids = array()) - { - $aFlags = array(); - - $bSelect = false; - if ($this->IsGmail() && - ('INBOX' === $sFolderName || '[gmail]' === \strtolower(\substr($sFolderName, 0, 7)))) - { - $this->oImapClient->FolderSelect($sFolderName); - $bSelect = true; - } - - if (\is_array($aUids) && 0 < \count($aUids)) - { - if (!$bSelect) - { - $this->oImapClient->FolderSelect($sFolderName); - } - - $aFetchResponse = $this->oImapClient->Fetch(array( - \MailSo\Imap\Enumerations\FetchType::INDEX, - \MailSo\Imap\Enumerations\FetchType::UID, - \MailSo\Imap\Enumerations\FetchType::FLAGS - ), \MailSo\Base\Utils::PrepearFetchSequence($aUids), true); - - if (\is_array($aFetchResponse) && 0 < \count($aFetchResponse)) - { - foreach ($aFetchResponse as $oFetchResponse) - { - $sUid = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::UID); - $aFlags[(\is_numeric($sUid) ? (int) $sUid : 0)] = - $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::FLAGS); - } - } - } - - $iCount = 0; - $iUnseenCount = 0; - $sUidNext = '0'; - $sHighestModSeq = ''; - - $this->initFolderValues($sFolderName, $iCount, $iUnseenCount, $sUidNext, $sHighestModSeq); - - $aResult = array( - 'Folder' => $sFolderName, - 'Hash' => $this->GenerateFolderHash($sFolderName, $iCount, $iUnseenCount, $sUidNext, $sHighestModSeq), - 'MessageCount' => $iCount, - 'MessageUnseenCount' => $iUnseenCount, - 'UidNext' => $sUidNext, - 'Flags' => $aFlags, - 'HighestModSeq' => $sHighestModSeq, - 'NewMessages' => 'INBOX' === $sFolderName && \MailSo\Config::$CheckNewMessages ? - $this->getFolderNextMessageInformation($sFolderName, $sPrevUidNext, $sUidNext) : array() - ); - - return $aResult; - } - - /** - * @param string $sFolderName - * - * @return string - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function FolderHash($sFolderName) - { - $iCount = 0; - $iUnseenCount = 0; - $sUidNext = '0'; - $sHighestModSeq = ''; - - $this->initFolderValues($sFolderName, $iCount, $iUnseenCount, $sUidNext, $sHighestModSeq); - - return $this->GenerateFolderHash($sFolderName, $iCount, $iUnseenCount, $sUidNext, $sHighestModSeq); - } - - /** - * @return int - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function InboxUnreadCount() - { - $aFolderStatus = $this->oImapClient->FolderStatus('INBOX', array( - \MailSo\Imap\Enumerations\FolderResponseStatus::UNSEEN - )); - - $iResult = isset($aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::UNSEEN]) ? - (int) $aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::UNSEEN] : 0; - - return 0 < $iResult ? $iResult : 0; - } - - /** - * @return bool - */ - public function IsGmail() - { - return 'ssl://imap.gmail.com' === \strtolower($this->oImapClient->GetConnectedHost()); - } - - /** - * @param string $sSearch - * @param bool $bDetectGmail = true - * - * @return string - */ - private function escapeSearchString($sSearch, $bDetectGmail = true) - { - return !\MailSo\Base\Utils::IsAscii($sSearch) - ? '{'.\strlen($sSearch).'}'."\r\n".$sSearch : $this->oImapClient->EscapeString($sSearch); -// return ($bDetectGmail && !\MailSo\Base\Utils::IsAscii($sSearch) && $this->IsGmail()) -// ? '{'.\strlen($sSearch).'+}'."\r\n".$sSearch : $this->oImapClient->EscapeString($sSearch); - } - - /** - * @param string $sDate - * @param int $iTimeZoneOffset - * - * @return int - */ - private function parseSearchDate($sDate, $iTimeZoneOffset) - { - $iResult = 0; - if (0 < \strlen($sDate)) - { - $oDateTime = \DateTime::createFromFormat('Y.m.d', $sDate, \MailSo\Base\DateTimeHelper::GetUtcTimeZoneObject()); - return $oDateTime ? $oDateTime->getTimestamp() - $iTimeZoneOffset : 0; - } - - return $iResult; - } - - /** - * @param string $sSize - * - * @return int - */ - private function parseFriendlySize($sSize) - { - $sSize = preg_replace('/[^0-9bBkKmM]/', '', $sSize); - - $iResult = 0; - $aMatch = array(); - - if (\preg_match('/([\d]+)(B|KB|M|MB|G|GB)$/i', $sSize, $aMatch) && isset($aMatch[1], $aMatch[2])) - { - $iResult = (int) $aMatch[1]; - switch (\strtoupper($aMatch[2])) - { - case 'K': - case 'KB': - $iResult *= 1024; - case 'M': - case 'MB': - $iResult *= 1024; - case 'G': - case 'GB': - $iResult *= 1024; - } - } - else - { - $iResult = (int) $sSize; - } - - return $iResult; - } - - /** - * @param string $sSearch - * - * @return array - */ - private function parseSearchString($sSearch) - { - $aResult = array( - 'OTHER' => '' - ); - - $aCache = array(); - - $sReg = 'e?mail|from|to|subject|has|is|date|text|body|size|larger|bigger|smaller|maxsize|minsize'; - - $sSearch = \MailSo\Base\Utils::StripSpaces($sSearch); - $sSearch = \trim(\preg_replace('/('.$sReg.'): /i', '\\1:', $sSearch)); - - $mMatch = array(); - \preg_match_all('/".*?(? $sName) - { - if (isset($mMatch[2][$iIndex]) && 0 < \strlen($mMatch[2][$iIndex])) - { - $sName = \strtoupper($sName); - $sValue = $mMatch[2][$iIndex]; - switch ($sName) - { - case 'TEXT': - case 'BODY': - case 'EMAIL': - case 'MAIL': - case 'FROM': - case 'TO': - case 'SUBJECT': - case 'IS': - case 'HAS': - case 'SIZE': - case 'SMALLER': - case 'LARGER': - case 'BIGGER': - case 'MAXSIZE': - case 'MINSIZE': - case 'DATE': - if ('MAIL' === $sName) - { - $sName = 'EMAIL'; - } - if ('BODY' === $sName) - { - $sName = 'TEXT'; - } - if ('SIZE' === $sName || 'BIGGER' === $sName || 'MINSIZE' === $sName) - { - $sName = 'LARGER'; - } - if ('MAXSIZE' === $sName) - { - $sName = 'SMALLER'; - } - $aResult[$sName] = $sValue; - break; - } - } - } - } - - $aResult['OTHER'] = $sSearch; - foreach ($aResult as $sName => $sValue) - { - if (isset($aCache[$sValue])) - { - $aResult[$sName] = \trim($aCache[$sValue], '"\' '); - } - } - - return $aResult; - } - - /** - * @param string $sSearch - * @param string $sFilter - * @param int $iTimeZoneOffset = 0 - * @param bool $bUseCache = true - * - * @return string - */ - private function getImapSearchCriterias($sSearch, $sFilter, $iTimeZoneOffset = 0, &$bUseCache = true) - { - $bUseCache = true; - $iTimeFilter = 0; - $aCriteriasResult = array(); - - if (0 < \MailSo\Config::$MessageListDateFilter) - { - $iD = \time() - 3600 * 24 * 30 * \MailSo\Config::$MessageListDateFilter; - $iTimeFilter = \gmmktime(1, 1, 1, \gmdate('n', $iD), 1, \gmdate('Y', $iD)); - } - - if (0 < \strlen(\trim($sSearch))) - { - $sGmailRawSearch = ''; - $sResultBodyTextSearch = ''; - - $aLines = $this->parseSearchString($sSearch); - $bIsGmail = $this->oImapClient->IsSupported('X-GM-EXT-1'); - - if (1 === \count($aLines) && isset($aLines['OTHER'])) - { - $sValue = $this->escapeSearchString($aLines['OTHER']); - - if (\MailSo\Config::$MessageListFastSimpleSearch) - { - $aCriteriasResult[] = 'OR OR OR'; - $aCriteriasResult[] = 'FROM'; - $aCriteriasResult[] = $sValue; - $aCriteriasResult[] = 'TO'; - $aCriteriasResult[] = $sValue; - $aCriteriasResult[] = 'CC'; - $aCriteriasResult[] = $sValue; - $aCriteriasResult[] = 'SUBJECT'; - $aCriteriasResult[] = $sValue; - } - else - { - $aCriteriasResult[] = 'TEXT'; - $aCriteriasResult[] = $sValue; - } - } - else - { - if (isset($aLines['EMAIL'])) - { - $sValue = $this->escapeSearchString($aLines['EMAIL']); - - $aCriteriasResult[] = 'OR OR'; - $aCriteriasResult[] = 'FROM'; - $aCriteriasResult[] = $sValue; - $aCriteriasResult[] = 'TO'; - $aCriteriasResult[] = $sValue; - $aCriteriasResult[] = 'CC'; - $aCriteriasResult[] = $sValue; - - unset($aLines['EMAIL']); - } - - if (isset($aLines['TO'])) - { - $sValue = $this->escapeSearchString($aLines['TO']); - - $aCriteriasResult[] = 'OR'; - $aCriteriasResult[] = 'TO'; - $aCriteriasResult[] = $sValue; - $aCriteriasResult[] = 'CC'; - $aCriteriasResult[] = $sValue; - - unset($aLines['TO']); - } - - $sMainText = ''; - foreach ($aLines as $sName => $sRawValue) - { - if ('' === \trim($sRawValue)) - { - continue; - } - - $sValue = $this->escapeSearchString($sRawValue); - switch ($sName) - { - case 'FROM': - $aCriteriasResult[] = 'FROM'; - $aCriteriasResult[] = $sValue; - break; - case 'SUBJECT': - $aCriteriasResult[] = 'SUBJECT'; - $aCriteriasResult[] = $sValue; - break; - case 'OTHER': - case 'TEXT': - $sMainText .= ' '.$sRawValue; - break; - case 'HAS': - $aValue = \explode(',', \strtolower($sRawValue)); - $aValue = \array_map('trim', $aValue); - - $aCompareArray = array('file', 'files', 'attach', 'attachs', 'attachment', 'attachments'); - if (\count($aCompareArray) > \count(\array_diff($aCompareArray, $aValue))) - { - if ($bIsGmail) - { - $sGmailRawSearch .= ' has:attachment'; - } - else - { - // Simple, is not detailed search (Sometimes doesn't work) - $aCriteriasResult[] = 'OR OR OR'; - $aCriteriasResult[] = 'HEADER Content-Type application/'; - $aCriteriasResult[] = 'HEADER Content-Type multipart/m'; - $aCriteriasResult[] = 'HEADER Content-Type multipart/signed'; - $aCriteriasResult[] = 'HEADER Content-Type multipart/report'; - } - } - - case 'IS': - $aValue = \explode(',', \strtolower($sRawValue)); - $aValue = \array_map('trim', $aValue); - - $aCompareArray = array('flag', 'flagged', 'star', 'starred', 'pinned'); - $aCompareArray2 = array('unflag', 'unflagged', 'unstar', 'unstarred', 'unpinned'); - if (\count($aCompareArray) > \count(\array_diff($aCompareArray, $aValue))) - { - $aCriteriasResult[] = 'FLAGGED'; - $bUseCache = false; - } - else if (\count($aCompareArray2) > \count(\array_diff($aCompareArray2, $aValue))) - { - $aCriteriasResult[] = 'UNFLAGGED'; - $bUseCache = false; - } - - $aCompareArray = array('unread', 'unseen'); - $aCompareArray2 = array('read', 'seen'); - if (\count($aCompareArray) > \count(\array_diff($aCompareArray, $aValue))) - { - $aCriteriasResult[] = 'UNSEEN'; - $bUseCache = false; - } - else if (\count($aCompareArray2) > \count(\array_diff($aCompareArray2, $aValue))) - { - $aCriteriasResult[] = 'SEEN'; - $bUseCache = false; - } - break; - - case 'LARGER': - $aCriteriasResult[] = 'LARGER'; - $aCriteriasResult[] = $this->parseFriendlySize($sRawValue); - break; - case 'SMALLER': - $aCriteriasResult[] = 'SMALLER'; - $aCriteriasResult[] = $this->parseFriendlySize($sRawValue); - break; - case 'DATE': - $iDateStampFrom = $iDateStampTo = 0; - - $sDate = $sRawValue; - $aDate = \explode('/', $sDate); - - if (\is_array($aDate) && 2 === \count($aDate)) - { - if (0 < \strlen($aDate[0])) - { - $iDateStampFrom = $this->parseSearchDate($aDate[0], $iTimeZoneOffset); - } - - if (0 < \strlen($aDate[1])) - { - $iDateStampTo = $this->parseSearchDate($aDate[1], $iTimeZoneOffset); - $iDateStampTo += 60 * 60 * 24; - } - } - else - { - if (0 < \strlen($sDate)) - { - $iDateStampFrom = $this->parseSearchDate($sDate, $iTimeZoneOffset); - $iDateStampTo = $iDateStampFrom + 60 * 60 * 24; - } - } - - if (0 < $iDateStampFrom) - { - $aCriteriasResult[] = 'SINCE'; - $aCriteriasResult[] = \gmdate('j-M-Y', $iTimeFilter > $iDateStampFrom ? - $iTimeFilter : $iDateStampFrom); - - $iTimeFilter = 0; - } - - if (0 < $iDateStampTo) - { - $aCriteriasResult[] = 'BEFORE'; - $aCriteriasResult[] = \gmdate('j-M-Y', $iDateStampTo); - } - break; - } - } - - if ('' !== \trim($sMainText)) - { - $sMainText = \trim(\MailSo\Base\Utils::StripSpaces($sMainText), '"'); - if ($bIsGmail) - { - $sGmailRawSearch .= ' '.$sMainText; - } - else - { - $sResultBodyTextSearch .= ' '.$sMainText; - } - } - } - - $sGmailRawSearch = \trim($sGmailRawSearch); - if ($bIsGmail && 0 < \strlen($sGmailRawSearch)) - { - $aCriteriasResult[] = 'X-GM-RAW'; - $aCriteriasResult[] = $this->escapeSearchString($sGmailRawSearch, false); - } - - $sResultBodyTextSearch = \trim($sResultBodyTextSearch); - if (0 < \strlen($sResultBodyTextSearch)) - { - $aCriteriasResult[] = 'BODY'; - $aCriteriasResult[] = $this->escapeSearchString($sResultBodyTextSearch); - } - } - - $sCriteriasResult = \trim(\implode(' ', $aCriteriasResult)); - - if (0 < $iTimeFilter) - { - $sCriteriasResult .= ' SINCE '.\gmdate('j-M-Y', $iTimeFilter); - } - - $sCriteriasResult = \trim($sCriteriasResult); - if (\MailSo\Config::$MessageListUndeletedOnly) - { - $sCriteriasResult = \trim($sCriteriasResult.' UNDELETED'); - } - - $sFilter = \trim($sFilter); - if ('' !== $sFilter) - { - $sCriteriasResult .= ' '.$sFilter; - } - - $sCriteriasResult = \trim($sCriteriasResult); - if ('' !== \MailSo\Config::$MessageListPermanentFilter) - { - $sCriteriasResult = \trim($sCriteriasResult.' '.\MailSo\Config::$MessageListPermanentFilter); - } - - $sCriteriasResult = \trim($sCriteriasResult); - if ('' === $sCriteriasResult) - { - $sCriteriasResult = 'ALL'; - } - - return $sCriteriasResult; - } - - /** - * @param array $aThreads - * @return array - */ - private function threadArrayMap($aThreads) - { - $aNew = array(); - foreach ($aThreads as $mItem) - { - if (!\is_array($mItem)) - { - $aNew[] = $mItem; - } - else - { - $mMap = $this->threadArrayMap($mItem); - if (\is_array($mMap) && 0 < \count($mMap)) - { - $aNew = \array_merge($aNew, $mMap); - } - } - } - - return $aNew; - } - - /** - * @param array $aThreads - * - * @return array - */ - private function compileThreadArray($aThreads) - { - $aResult = array(); - foreach ($aThreads as $mItem) - { - if (\is_array($mItem)) - { - $aMap = $this->threadArrayMap($mItem); - if (\is_array($aMap)) - { - if (1 < \count($aMap)) - { - $aResult[] = $aMap; - } - else if (0 < \count($aMap)) - { - $aResult[] = $aMap[0]; - } - } - } - else - { - $aResult[] = $mItem; - } - } - - return $aResult; - } - - /** - * @param string $sFolderName - * @param string $sFolderHash - * @param array $aIndexOrUids - * @param \MailSo\Cache\CacheClient $oCacher - * @param bool $bCacheOnly = false - * - * @return array - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function MessageListThreadsMap($sFolderName, $sFolderHash, $aIndexOrUids, $oCacher, $bCacheOnly = false) - { - $iThreadLimit = \MailSo\Config::$LargeThreadLimit; - - $sSearchHash = ''; - if (0 < \MailSo\Config::$MessageListDateFilter) - { - $iD = \time() - 3600 * 24 * 30 * \MailSo\Config::$MessageListDateFilter; - $iTimeFilter = \gmmktime(1, 1, 1, \gmdate('n', $iD), 1, \gmdate('Y', $iD)); - - $sSearchHash .= ' SINCE '.\gmdate('j-M-Y', $iTimeFilter); - } - - if ('' === \trim($sSearchHash)) - { - $sSearchHash = 'ALL'; - } - - if ($oCacher && $oCacher->IsInited()) - { - $sSerializedHashKey = - 'ThreadsMapSorted/'.$sSearchHash.'/'. - 'Limit='.$iThreadLimit.'/'.$sFolderName.'/'.$sFolderHash; - - if ($this->oLogger) - { - $this->oLogger->Write($sSerializedHashKey); - } - - $sSerializedUids = $oCacher->Get($sSerializedHashKey); - if (!empty($sSerializedUids)) - { - $aSerializedUids = @\json_decode($sSerializedUids, true); - if (isset($aSerializedUids['ThreadsUids']) && \is_array($aSerializedUids['ThreadsUids'])) - { - if ($this->oLogger) - { - $this->oLogger->Write('Get Serialized Thread UIDS from cache ("'.$sFolderName.'" / '.$sSearchHash.') [count:'.\count($aSerializedUids['ThreadsUids']).']'); - } - - return $aSerializedUids['ThreadsUids']; - } - } - } - - if ($bCacheOnly) - { - return null; - } - - $this->oImapClient->FolderExamine($sFolderName); - - $aThreadUids = array(); - try - { - $aThreadUids = $this->oImapClient->MessageSimpleThread($sSearchHash); - } - catch (\MailSo\Imap\Exceptions\RuntimeException $oException) - { - unset($oException); - $aThreadUids = array(); - } - - $aResult = array(); - $aCompiledThreads = $this->compileThreadArray($aThreadUids); - - foreach ($aCompiledThreads as $mData) - { - if (\is_array($mData)) - { - foreach ($mData as $mSubData) - { - $aResult[(int) $mSubData] = - \array_diff($mData, array((int) $mSubData)); - } - } - else if (\is_int($mData) || \is_string($mData)) - { - $aResult[(int) $mData] = (int) $mData; - } - } - - $aParentsMap = array(); - foreach ($aIndexOrUids as $iUid) - { - if (isset($aResult[$iUid]) && \is_array($aResult[$iUid])) - { - foreach ($aResult[$iUid] as $iTempUid) - { - $aParentsMap[$iTempUid] = $iUid; - if (isset($aResult[$iTempUid])) - { - unset($aResult[$iTempUid]); - } - } - } - } - - $aSortedThreads = array(); - foreach ($aIndexOrUids as $iUid) - { - if (isset($aResult[$iUid])) - { - $aSortedThreads[$iUid] = $iUid; - } - } - - foreach ($aIndexOrUids as $iUid) - { - if (!isset($aSortedThreads[$iUid]) && - isset($aParentsMap[$iUid]) && - isset($aSortedThreads[$aParentsMap[$iUid]])) - { - if (!\is_array($aSortedThreads[$aParentsMap[$iUid]])) - { - $aSortedThreads[$aParentsMap[$iUid]] = array(); - } - - $aSortedThreads[$aParentsMap[$iUid]][] = $iUid; - } - } - - $aResult = $aSortedThreads; - unset($aParentsMap, $aSortedThreads); - - $aTemp = array(); - foreach ($aResult as $iUid => $mValue) - { - if (0 < $iThreadLimit && \is_array($mValue) && $iThreadLimit < \count($mValue)) - { - $aParts = \array_chunk($mValue, $iThreadLimit); - if (0 < count($aParts)) - { - foreach ($aParts as $iIndex => $aItem) - { - if (0 === $iIndex) - { - $aResult[$iUid] = $aItem; - } - else if (0 < $iIndex && \is_array($aItem)) - { - $mFirst = \array_shift($aItem); - if (!empty($mFirst)) - { - $aTemp[$mFirst] = 0 < \count($aItem) ? $aItem : $mFirst; - } - } - } - } - } - } - - foreach ($aTemp as $iUid => $mValue) - { - $aResult[$iUid] = $mValue; - } - - unset($aTemp); - - $aLastResult = array(); - foreach ($aIndexOrUids as $iUid) - { - if (isset($aResult[$iUid])) - { - $aLastResult[$iUid] = $aResult[$iUid]; - } - } - - $aResult = $aLastResult; - unset($aLastResult); - - if ($oCacher && $oCacher->IsInited() && !empty($sSerializedHashKey)) - { - $oCacher->Set($sSerializedHashKey, @\json_encode(array( - 'ThreadsUids' => $aResult - ))); - - if ($this->oLogger) - { - $this->oLogger->Write('Save Serialized Thread UIDS to cache ("'.$sFolderName.'" / '.$sSearchHash.') [count:'.\count($aResult).']'); - } - } - - return $aResult; - } - - /** - * @param \MailSo\Mail\MessageCollection &$oMessageCollection - * @param array $aRequestIndexOrUids - * @param bool $bIndexAsUid - * @param bool $bSimple = false - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function MessageListByRequestIndexOrUids(&$oMessageCollection, $aRequestIndexOrUids, $bIndexAsUid, $bSimple = false) - { - if (\is_array($aRequestIndexOrUids) && 0 < \count($aRequestIndexOrUids)) - { - $aFetchResponse = $this->oImapClient->Fetch(array( - \MailSo\Imap\Enumerations\FetchType::INDEX, - \MailSo\Imap\Enumerations\FetchType::UID, - \MailSo\Imap\Enumerations\FetchType::RFC822_SIZE, - \MailSo\Imap\Enumerations\FetchType::INTERNALDATE, - \MailSo\Imap\Enumerations\FetchType::FLAGS, - \MailSo\Imap\Enumerations\FetchType::BODYSTRUCTURE, - $bSimple ? - $this->getEnvelopeOrHeadersRequestStringForSimpleList() : - $this->getEnvelopeOrHeadersRequestString() - ), \MailSo\Base\Utils::PrepearFetchSequence($aRequestIndexOrUids), $bIndexAsUid); - - if (\is_array($aFetchResponse) && 0 < \count($aFetchResponse)) - { - $aFetchIndexArray = array(); - $oFetchResponseItem = null; - foreach ($aFetchResponse as /* @var $oFetchResponseItem \MailSo\Imap\FetchResponse */ &$oFetchResponseItem) - { - $aFetchIndexArray[($bIndexAsUid) - ? $oFetchResponseItem->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::UID) - : $oFetchResponseItem->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::INDEX)] =& $oFetchResponseItem; - - unset($oFetchResponseItem); - } - - foreach ($aRequestIndexOrUids as $iFUid) - { - if (isset($aFetchIndexArray[$iFUid])) - { - $oMessageCollection->Add( - Message::NewFetchResponseInstance( - $oMessageCollection->FolderName, $aFetchIndexArray[$iFUid])); - } - } - } - } - } - - /** - * @return bool - * - * @throws \MailSo\Net\Exceptions\Exception - */ - public function IsThreadsSupported() - { - return $this->oImapClient->IsSupported('THREAD=REFS') || - $this->oImapClient->IsSupported('THREAD=REFERENCES') || - $this->oImapClient->IsSupported('THREAD=ORDEREDSUBJECT'); - } - - /** - * @param string $sFolderName - * @param array $aUids - * - * @return \MailSo\Mail\MessageCollection - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function MessageListSimple($sFolderName, $aUids) - { - if (0 === \strlen($sFolderName) || !\MailSo\Base\Validator::NotEmptyArray($aUids)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $this->oImapClient->FolderExamine($sFolderName); - - $oMessageCollection = \MailSo\Mail\MessageCollection::NewInstance(); - $oMessageCollection->FolderName = $sFolderName; - - $this->MessageListByRequestIndexOrUids($oMessageCollection, $aUids, true, true); - - return $oMessageCollection->GetAsArray(); - } - - /** - * @param \MailSo\Cache\CacheClient|null $oCacher - * @param string $sSearch - * @param string $sFilter - * @param string $sFolderName - * @param string $sFolderHash - * @param bool $bUseSortIfSupported = false - * - * @return array - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function GetUids($oCacher, $sSearch, $sFilter, $sFolderName, $sFolderHash, $bUseSortIfSupported = false) - { - $aResultUids = false; - $bUidsFromCacher = false; - $bUseCacheAfterSearch = true; - - $sSerializedHash = ''; - $sSerializedLog = ''; - - $bUseSortIfSupported = $bUseSortIfSupported ? !!$this->oImapClient->IsSupported('SORT') : false; - - if (0 < \strlen($sSearch)) - { - $bUseSortIfSupported = false; - } - - $sSearchCriterias = $this->getImapSearchCriterias($sSearch, $sFilter, 0, $bUseCacheAfterSearch); - if ($bUseCacheAfterSearch && $oCacher && $oCacher->IsInited()) - { - $sSerializedHash = 'GetUids/'. - ($bUseSortIfSupported ? 'S': 'N').'/'. - $this->GenerateImapClientHash().'/'. - $sFolderName.'/'.$sSearchCriterias; - - $sSerializedLog = '"'.$sFolderName.'" / '.$sSearchCriterias.''; - - $sSerialized = $oCacher->Get($sSerializedHash); - if (!empty($sSerialized)) - { - $aSerialized = @\json_decode($sSerialized, true); - if (\is_array($aSerialized) && isset($aSerialized['FolderHash'], $aSerialized['Uids']) && - $sFolderHash === $aSerialized['FolderHash'] && - \is_array($aSerialized['Uids']) - ) - { - if ($this->oLogger) - { - $this->oLogger->Write('Get Serialized UIDS from cache ('.$sSerializedLog.') [count:'.\count($aSerialized['Uids']).']'); - } - - $aResultUids = $aSerialized['Uids']; - $bUidsFromCacher = true; - } - } - } - - if (!\is_array($aResultUids)) - { - $aResultUids = $bUseSortIfSupported ? - $this->oImapClient->MessageSimpleSort(array('REVERSE ARRIVAL'), $sSearchCriterias, true) : - $this->oImapClient->MessageSimpleSearch($sSearchCriterias, true, \MailSo\Base\Utils::IsAscii($sSearchCriterias) ? '' : 'UTF-8') - ; - - if (!$bUidsFromCacher && $bUseCacheAfterSearch && \is_array($aResultUids) && $oCacher && $oCacher->IsInited() && 0 < \strlen($sSerializedHash)) - { - $oCacher->Set($sSerializedHash, @\json_encode(array( - 'FolderHash' => $sFolderHash, - 'Uids' => $aResultUids - ))); - - if ($this->oLogger) - { - $this->oLogger->Write('Save Serialized UIDS to cache ('.$sSerializedLog.') [count:'.\count($aResultUids).']'); - } - } - } - - return \is_array($aResultUids) ? $aResultUids : array(); - } - - /** - * @param string $sFolderName - * @param int $iOffset = 0 - * @param int $iLimit = 10 - * @param string $sSearch = '' - * @param string $sPrevUidNext = '' - * @param \MailSo\Cache\CacheClient|null $oCacher = null - * @param bool $bUseSortIfSupported = false - * @param bool $bUseThreadSortIfSupported = false - * @param bool $bUseESearchOrESortRequest = false - * @param string $sThreadUid = '' - * @param string $sFilter = '' - * - * @return \MailSo\Mail\MessageCollection - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Imap\Exceptions\Exception - */ - public function MessageList($sFolderName, $iOffset = 0, $iLimit = 10, $sSearch = '', $sPrevUidNext = '', $oCacher = null, - $bUseSortIfSupported = false, $bUseThreadSortIfSupported = false, $sThreadUid = '', $sFilter = '') - { - $sFilter = \trim($sFilter); - $sSearch = \trim($sSearch); - if (!\MailSo\Base\Validator::RangeInt($iOffset, 0) || - !\MailSo\Base\Validator::RangeInt($iLimit, 0, 999)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $bUseFilter = '' !== $sFilter; - - $this->oImapClient->FolderSelect($sFolderName); - - $oMessageCollection = MessageCollection::NewInstance(); - $oMessageCollection->FolderName = $sFolderName; - $oMessageCollection->Offset = $iOffset; - $oMessageCollection->Limit = $iLimit; - $oMessageCollection->Search = $sSearch; - $oMessageCollection->ThreadUid = $sThreadUid; - $oMessageCollection->Filtered = '' !== \MailSo\Config::$MessageListPermanentFilter; - - $aUids = array(); - $mAllSortedUids = null; - $mAllThreads = null; - - $iThreadUid = empty($sThreadUid) ? 0 : (int) $sThreadUid; - - $iMessageRealCount = 0; - $iMessageUnseenCount = 0; - $sUidNext = '0'; - $sHighestModSeq = ''; - - $bUseSortIfSupported = $bUseSortIfSupported ? $this->oImapClient->IsSupported('SORT') : false; - - $bUseThreadSortIfSupported = $bUseThreadSortIfSupported ? - ($this->oImapClient->IsSupported('THREAD=REFS') || $this->oImapClient->IsSupported('THREAD=REFERENCES') || $this->oImapClient->IsSupported('THREAD=ORDEREDSUBJECT')) : false; - - if (!empty($sThreadUid) && !$bUseThreadSortIfSupported) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - if (!$oCacher || !($oCacher instanceof \MailSo\Cache\CacheClient)) - { - $oCacher = null; - } - - $this->initFolderValues($sFolderName, $iMessageRealCount, $iMessageUnseenCount, $sUidNext, $sHighestModSeq); - - if ($bUseFilter) - { - $iMessageUnseenCount = 0; - } - - $oMessageCollection->FolderHash = $this->GenerateFolderHash( - $sFolderName, $iMessageRealCount, $iMessageUnseenCount, $sUidNext, $sHighestModSeq); - - $oMessageCollection->UidNext = $sUidNext; - - if (empty($sThreadUid) && 0 < \strlen($sPrevUidNext) && 'INBOX' === $sFolderName) - { - $oMessageCollection->NewMessages = $this->getFolderNextMessageInformation( - $sFolderName, $sPrevUidNext, $sUidNext); - } - - $bSearch = false; - $bMessageListOptimization = 0 < \MailSo\Config::$MessageListCountLimitTrigger && - \MailSo\Config::$MessageListCountLimitTrigger < $iMessageRealCount; - - if ($bMessageListOptimization) - { - $bUseSortIfSupported = false; - $bUseThreadSortIfSupported = false; - } - - if (0 < $iMessageRealCount && !$bMessageListOptimization) - { - $mAllSortedUids = $this->GetUids($oCacher, '', $sFilter, - $oMessageCollection->FolderName, $oMessageCollection->FolderHash, $bUseSortIfSupported); - - $mAllThreads = $bUseThreadSortIfSupported ? $this->MessageListThreadsMap( - $oMessageCollection->FolderName, $oMessageCollection->FolderHash, $mAllSortedUids, $oCacher) : null; - - if ($bUseThreadSortIfSupported && 0 < $iThreadUid && \is_array($mAllThreads)) - { - $aUids = array(); - $iResultRootUid = 0; - - if (isset($mAllThreads[$iThreadUid])) - { - $iResultRootUid = $iThreadUid; - if (\is_array($mAllThreads[$iThreadUid])) - { - $aUids = $mAllThreads[$iThreadUid]; - } - } - else - { - foreach ($mAllThreads as $iRootUid => $mSubUids) - { - if (\is_array($mSubUids) && \in_array($iThreadUid, $mSubUids)) - { - $iResultRootUid = $iRootUid; - $aUids = $mSubUids; - continue; - } - } - } - - if (0 < $iResultRootUid && \in_array($iResultRootUid, $mAllSortedUids)) - { - \array_unshift($aUids, $iResultRootUid); - } - } - else if ($bUseThreadSortIfSupported && \is_array($mAllThreads)) - { - $aUids = \array_keys($mAllThreads); - } - else - { - $bUseThreadSortIfSupported = false; - $aUids = $mAllSortedUids; - } - - if (0 < \strlen($sSearch) && \is_array($aUids)) - { - $aSearchedUids = $this->GetUids($oCacher, $sSearch, $sFilter, - $oMessageCollection->FolderName, $oMessageCollection->FolderHash); - - if (\is_array($aSearchedUids) && 0 < \count($aSearchedUids)) - { - $aFlippedSearchedUids = \array_flip($aSearchedUids); - - $bSearch = true; - $aNewUids = array(); - - foreach ($aUids as $iUid) - { - if (isset($aFlippedSearchedUids[$iUid])) - { - $aNewUids[] = $iUid; - } - else if ($bUseThreadSortIfSupported && 0 === $iThreadUid && isset($mAllThreads[$iUid]) && \is_array($mAllThreads[$iUid])) - { - foreach ($mAllThreads[$iUid] as $iSubUid) - { - if (isset($aFlippedSearchedUids[$iSubUid])) - { - $aNewUids[] = $iUid; - continue; - } - } - } - } - - $aUids = \array_unique($aNewUids); - unset($aNewUids); - } - else - { - $aUids = array(); - } - } - - if (\is_array($aUids)) - { - $oMessageCollection->MessageCount = $iMessageRealCount; - $oMessageCollection->MessageUnseenCount = $iMessageUnseenCount; - $oMessageCollection->MessageResultCount = \count($aUids); - - if (0 < \count($aUids)) - { - $aRequestUids = \array_slice($aUids, $iOffset, $iLimit); - $this->MessageListByRequestIndexOrUids($oMessageCollection, $aRequestUids, true); - } - } - } - else if (0 < $iMessageRealCount) - { - if ($this->oLogger) - { - $this->oLogger->Write('List optimization (count: '.$iMessageRealCount. - ', limit:'.\MailSo\Config::$MessageListCountLimitTrigger.')'); - } - - $oMessageCollection->MessageCount = $iMessageRealCount; - $oMessageCollection->MessageUnseenCount = $iMessageUnseenCount; - - if (0 < \strlen($sSearch) || $bUseFilter) - { - $aUids = $this->GetUids($oCacher, $sSearch, $sFilter, - $oMessageCollection->FolderName, $oMessageCollection->FolderHash); - - if (0 < \count($aUids)) - { - $oMessageCollection->MessageResultCount = \count($aUids); - - $aRequestUids = \array_slice($aUids, $iOffset, $iLimit); - $this->MessageListByRequestIndexOrUids($oMessageCollection, $aRequestUids, true); - } - else - { - $oMessageCollection->MessageResultCount = 0; - } - } - else - { - $oMessageCollection->MessageResultCount = $iMessageRealCount; - - if (1 < $iMessageRealCount) - { - $aRequestIndexes = \array_slice(array_reverse(range(1, $iMessageRealCount)), $iOffset, $iLimit); - } - else - { - $aRequestIndexes = \array_slice(array(1), $iOffset, $iLimit); - } - - $this->MessageListByRequestIndexOrUids($oMessageCollection, $aRequestIndexes, false); - } - } - - if ($bUseThreadSortIfSupported && 0 === $iThreadUid && \is_array($mAllThreads) && 0 < \count($mAllThreads)) - { - $oMessageCollection->ForeachList(function (/* @var $oMessage \MailSo\Mail\Message */ $oMessage) use ($mAllThreads) { - - $iUid = $oMessage->Uid(); - if (isset($mAllThreads[$iUid]) && \is_array($mAllThreads[$iUid]) && 0 < \count($mAllThreads[$iUid])) - { - $aSubThreads = $mAllThreads[$iUid]; - \array_unshift($aSubThreads, $iUid); - - $oMessage->SetThreads(\array_map('trim', $aSubThreads)); - unset($aSubThreads); - } - }); - } - - return $oMessageCollection; - } - - /** - * @return array|false - */ - public function Quota() - { - return $this->oImapClient->Quota(); - } - - /** - * @param string $sFolderName - * @param string $sMessageId - * - * @return int|null - */ - public function FindMessageUidByMessageId($sFolderName, $sMessageId) - { - if (0 === \strlen($sMessageId)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $this->oImapClient->FolderExamine($sFolderName); - - $aUids = $this->oImapClient->MessageSimpleSearch( - 'HEADER Message-ID '.$sMessageId, true); - - return \is_array($aUids) && 1 === \count($aUids) && \is_numeric($aUids[0]) ? (int) $aUids[0] : null; - } - - /** - * @param array $aMailFoldersHelper - * @param int $iOptimizationLimit = 0 - * - * @return array - */ - public function folderListOptimization($aMailFoldersHelper, $iOptimizationLimit = 0) - { - // optimization - if (10 < $iOptimizationLimit && \is_array($aMailFoldersHelper) && $iOptimizationLimit < \count($aMailFoldersHelper)) - { - if ($this->oLogger) - { - $this->oLogger->Write('Start optimization (limit:'.$iOptimizationLimit.') for '.\count($aMailFoldersHelper).' folders'); - } - - $iForeachLimit = 1; - - $aFilteredNames = array( - 'inbox', - 'sent', 'send', 'outbox', 'sentmail', 'sendmail', - 'drafts', 'draft', - 'junk', 'spam', 'spambucket', - 'trash', 'bin', 'deleted', - 'archives', 'archive', 'allmail', 'all', - 'starred', 'flagged', 'important', - 'contacts', 'chats' - ); - - $aNewMailFoldersHelper = array(); - - $iCountLimit = $iForeachLimit; - - foreach ($aMailFoldersHelper as $iIndex => /* @var $oImapFolder \MailSo\Mail\Folder */ $oFolder) - { - // mandatory folders - if ($oFolder && \in_array(\str_replace(' ', '', \strtolower($oFolder->NameRaw())), $aFilteredNames)) - { - $aNewMailFoldersHelper[] = $oFolder; - $aMailFoldersHelper[$iIndex] = null; - } - } - - foreach ($aMailFoldersHelper as $iIndex => /* @var $oImapFolder \MailSo\Mail\Folder */ $oFolder) - { - // subscribed folders - if ($oFolder && $oFolder->IsSubscribed()) - { - $aNewMailFoldersHelper[] = $oFolder; - - $aMailFoldersHelper[$iIndex] = null; - $iCountLimit--; - } - - if (0 > $iCountLimit) - { - if ($iOptimizationLimit < \count($aNewMailFoldersHelper)) - { - break; - } - else - { - $iCountLimit = $iForeachLimit; - } - } - } - - $iCountLimit = $iForeachLimit; - if ($iOptimizationLimit >= \count($aNewMailFoldersHelper)) - { - // name filter - foreach ($aMailFoldersHelper as $iIndex => /* @var $oImapFolder \MailSo\Mail\Folder */ $oFolder) - { - if ($oFolder && !\preg_match('/[{}\[\]]/', $oFolder->NameRaw())) - { - $aNewMailFoldersHelper[] = $oFolder; - - $aMailFoldersHelper[$iIndex] = null; - $iCountLimit--; - } - - if (0 > $iCountLimit) - { - if ($iOptimizationLimit < \count($aNewMailFoldersHelper)) - { - break; - } - else - { - $iCountLimit = $iForeachLimit; - } - } - } - } - - $iCountLimit = $iForeachLimit; - if ($iOptimizationLimit >= \count($aNewMailFoldersHelper)) - { - // other - foreach ($aMailFoldersHelper as $iIndex => /* @var $oImapFolder \MailSo\Mail\Folder */ $oFolder) - { - if ($oFolder) - { - $aNewMailFoldersHelper[] = $oFolder; - - $aMailFoldersHelper[$iIndex] = null; - $iCountLimit--; - } - - if (0 > $iCountLimit) - { - if ($iOptimizationLimit < \count($aNewMailFoldersHelper)) - { - break; - } - else - { - $iCountLimit = $iForeachLimit; - } - } - } - } - - $aMailFoldersHelper = $aNewMailFoldersHelper; - - if ($this->oLogger) - { - $this->oLogger->Write('Result optimization: '.\count($aMailFoldersHelper).' folders'); - } - } - - return $aMailFoldersHelper; - } - - /** - * @param string $sParent = '' - * @param string $sListPattern = '*' - * @param bool $bUseListSubscribeStatus = false - * @param int $iOptimizationLimit = 0 - * - * @return \MailSo\Mail\FolderCollection|false - */ - public function Folders($sParent = '', $sListPattern = '*', $bUseListSubscribeStatus = true, $iOptimizationLimit = 0) - { - $oFolderCollection = false; - - $aSubscribedFolders = null; - if ($bUseListSubscribeStatus) - { - try - { - $aSubscribedFolders = $this->oImapClient->FolderSubscribeList($sParent, $sListPattern); - } - catch (\Exception $oException) - { - unset($oException); - } - } - - $aImapSubscribedFoldersHelper = null; - if (\is_array($aSubscribedFolders)) - { - $aImapSubscribedFoldersHelper = array(); - foreach ($aSubscribedFolders as /* @var $oImapFolder \MailSo\Imap\Folder */ $oImapFolder) - { - $aImapSubscribedFoldersHelper[] = $oImapFolder->FullNameRaw(); - } - } - - $aFolders = $this->oImapClient->FolderList($sParent, $sListPattern); - - $bOptimized = false; - $aMailFoldersHelper = null; - - if (\is_array($aFolders)) - { - $aMailFoldersHelper = array(); - - foreach ($aFolders as /* @var $oImapFolder \MailSo\Imap\Folder */ $oImapFolder) - { - $aMailFoldersHelper[] = Folder::NewInstance($oImapFolder, - (null === $aImapSubscribedFoldersHelper || \in_array($oImapFolder->FullNameRaw(), $aImapSubscribedFoldersHelper)) || - $oImapFolder->IsInbox() - ); - } - - $iCount = \count($aMailFoldersHelper); - $aMailFoldersHelper = $this->folderListOptimization($aMailFoldersHelper, $iOptimizationLimit); - - $bOptimized = $iCount !== \count($aMailFoldersHelper); - } - - if (\is_array($aMailFoldersHelper)) - { - $oFolderCollection = FolderCollection::NewInstance(); - $oFolderCollection->InitByUnsortedMailFolderArray($aMailFoldersHelper); - - $oFolderCollection->Optimized = $bOptimized; - } - - if ($oFolderCollection) - { - $oFolderCollection->SortByCallback(function ($oFolderA, $oFolderB) { - $sA = \strtoupper($oFolderA->FullNameRaw()); - $sB = \strtoupper($oFolderB->FullNameRaw()); - switch (true) - { - case 'INBOX' === $sA: - return -1; - case 'INBOX' === $sB: - return 1; - case '[GMAIL]' === $sA: - return -1; - case '[GMAIL]' === $sB: - return 1; - } - - return \strnatcasecmp($oFolderA->FullName(), $oFolderB->FullName()); - }); - - $oNamespace = $this->oImapClient->GetNamespace(); - if ($oNamespace) - { - $oFolderCollection->SetNamespace($oNamespace->GetPersonalNamespace()); - } - - $oFolderCollection->IsThreadsSupported = $this->IsThreadsSupported(); - } - - return $oFolderCollection; - } - - /** - * @param string $sFolderNameInUtf8 - * @param string $sFolderParentFullNameRaw = '' - * @param bool $bSubscribeOnCreation = true - * @param string $sDelimiter = '' - * - * @return \MailSo\Mail\MailClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public function FolderCreate($sFolderNameInUtf8, $sFolderParentFullNameRaw = '', $bSubscribeOnCreation = true, $sDelimiter = '') - { - if (!\MailSo\Base\Validator::NotEmptyString($sFolderNameInUtf8, true) || - !\is_string($sFolderParentFullNameRaw)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $sFolderNameInUtf8 = \trim($sFolderNameInUtf8); - - if (0 === \strlen($sDelimiter) || 0 < \strlen(\trim($sFolderParentFullNameRaw))) - { - $aFolders = $this->oImapClient->FolderList('', 0 === \strlen(\trim($sFolderParentFullNameRaw)) ? 'INBOX' : $sFolderParentFullNameRaw); - if (!\is_array($aFolders) || !isset($aFolders[0])) - { - // TODO - throw new \MailSo\Mail\Exceptions\RuntimeException( - 0 === \strlen(trim($sFolderParentFullNameRaw)) - ? 'Cannot get folder delimiter' - : 'Cannot create folder in non-existen parent folder'); - } - - $sDelimiter = $aFolders[0]->Delimiter(); - if (0 < \strlen($sDelimiter) && 0 < \strlen(\trim($sFolderParentFullNameRaw))) - { - $sFolderParentFullNameRaw .= $sDelimiter; - } - } - - $sFullNameRawToCreate = \MailSo\Base\Utils::ConvertEncoding($sFolderNameInUtf8, - \MailSo\Base\Enumerations\Charset::UTF_8, - \MailSo\Base\Enumerations\Charset::UTF_7_IMAP); - - if (0 < \strlen($sDelimiter) && false !== \strpos($sFullNameRawToCreate, $sDelimiter)) - { - // TODO - throw new \MailSo\Mail\Exceptions\RuntimeException( - 'New folder name contains delimiter'); - } - - $sFullNameRawToCreate = $sFolderParentFullNameRaw.$sFullNameRawToCreate; - - $this->oImapClient->FolderCreate($sFullNameRawToCreate); - - if ($bSubscribeOnCreation) - { - $this->oImapClient->FolderSubscribe($sFullNameRawToCreate); - } - - return $this; - } - - /** - * @param string $sPrevFolderFullNameRaw - * @param string $sNextFolderFullNameInUtf - * @param bool $bSubscribeOnMove = true - * - * @return \MailSo\Mail\MailClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public function FolderMove($sPrevFolderFullNameRaw, $sNextFolderFullNameInUtf, $bSubscribeOnMove = true) - { - return $this->folderModify($sPrevFolderFullNameRaw, $sNextFolderFullNameInUtf, false, $bSubscribeOnMove); - } - - /** - * @param string $sPrevFolderFullNameRaw - * @param string $sNewTopFolderNameInUtf - * @param bool $bSubscribeOnRename = true - * - * @return \MailSo\Mail\MailClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public function FolderRename($sPrevFolderFullNameRaw, $sNewTopFolderNameInUtf, $bSubscribeOnRename = true) - { - return $this->folderModify($sPrevFolderFullNameRaw, $sNewTopFolderNameInUtf, true, $bSubscribeOnRename); - } - - /** - * @param string $sPrevFolderFullNameRaw - * @param string $sNextFolderNameInUtf - * @param bool $bRenameOrMove - * @param bool $bSubscribeOnModify - * - * @return \MailSo\Mail\MailClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public function folderModify($sPrevFolderFullNameRaw, $sNextFolderNameInUtf, $bRenameOrMove, $bSubscribeOnModify) - { - if (0 === \strlen($sPrevFolderFullNameRaw) || 0 === \strlen($sNextFolderNameInUtf)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $aFolders = $this->oImapClient->FolderList('', $sPrevFolderFullNameRaw); - if (!\is_array($aFolders) || !isset($aFolders[0])) - { - // TODO - throw new \MailSo\Mail\Exceptions\RuntimeException('Cannot rename non-existen folder'); - } - - $sDelimiter = $aFolders[0]->Delimiter(); - $iLast = \strrpos($sPrevFolderFullNameRaw, $sDelimiter); - - $mSubscribeFolders = null; - if ($bSubscribeOnModify) - { - $mSubscribeFolders = $this->oImapClient->FolderSubscribeList($sPrevFolderFullNameRaw, '*'); - if (\is_array($mSubscribeFolders) && 0 < count($mSubscribeFolders)) - { - foreach ($mSubscribeFolders as /* @var $oFolder \MailSo\Imap\Folder */ $oFolder) - { - $this->oImapClient->FolderUnSubscribe($oFolder->FullNameRaw()); - } - } - } - - $sNewFolderFullNameRaw = \MailSo\Base\Utils::ConvertEncoding($sNextFolderNameInUtf, - \MailSo\Base\Enumerations\Charset::UTF_8, - \MailSo\Base\Enumerations\Charset::UTF_7_IMAP); - - if($bRenameOrMove) - { - if (0 < \strlen($sDelimiter) && false !== \strpos($sNewFolderFullNameRaw, $sDelimiter)) - { - // TODO - throw new \MailSo\Mail\Exceptions\RuntimeException('New folder name contains delimiter'); - } - - $sFolderParentFullNameRaw = false === $iLast ? '' : \substr($sPrevFolderFullNameRaw, 0, $iLast + 1); - $sNewFolderFullNameRaw = $sFolderParentFullNameRaw.$sNewFolderFullNameRaw; - } - - $this->oImapClient->FolderRename($sPrevFolderFullNameRaw, $sNewFolderFullNameRaw); - - if (\is_array($mSubscribeFolders) && 0 < count($mSubscribeFolders)) - { - foreach ($mSubscribeFolders as /* @var $oFolder \MailSo\Imap\Folder */ $oFolder) - { - $sFolderFullNameRawForResubscrine = $oFolder->FullNameRaw(); - if (0 === \strpos($sFolderFullNameRawForResubscrine, $sPrevFolderFullNameRaw)) - { - $sNewFolderFullNameRawForResubscrine = $sNewFolderFullNameRaw. - \substr($sFolderFullNameRawForResubscrine, \strlen($sPrevFolderFullNameRaw)); - - $this->oImapClient->FolderSubscribe($sNewFolderFullNameRawForResubscrine); - } - } - } - - return $this; - } - - /** - * @param string $sFolderFullNameRaw - * @param bool $bUnsubscribeOnDeletion = true - * - * @return \MailSo\Mail\MailClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Mail\Exceptions\RuntimeException - */ - public function FolderDelete($sFolderFullNameRaw, $bUnsubscribeOnDeletion = true) - { - if (0 === \strlen($sFolderFullNameRaw) || 'INBOX' === $sFolderFullNameRaw) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $this->oImapClient->FolderExamine($sFolderFullNameRaw); - - $aIndexOrUids = $this->oImapClient->MessageSimpleSearch('ALL'); - if (0 < \count($aIndexOrUids)) - { - throw new \MailSo\Mail\Exceptions\NonEmptyFolder(); - } - - $this->oImapClient->FolderExamine('INBOX'); - - if ($bUnsubscribeOnDeletion) - { - $this->oImapClient->FolderUnSubscribe($sFolderFullNameRaw); - } - - $this->oImapClient->FolderDelete($sFolderFullNameRaw); - - return $this; - } - - /** - * @param string $sFolderFullNameRaw - * - * @return \MailSo\Mail\MailClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public function FolderClear($sFolderFullNameRaw) - { - $this->oImapClient->FolderSelect($sFolderFullNameRaw); - - $oFolderInformation = $this->oImapClient->FolderCurrentInformation(); - if ($oFolderInformation && $oFolderInformation->Exists && 0 < $oFolderInformation->Exists) // STATUS? - { - $this->oImapClient->MessageStoreFlag('1:*', false, - array(\MailSo\Imap\Enumerations\MessageFlag::DELETED), - \MailSo\Imap\Enumerations\StoreAction::ADD_FLAGS_SILENT - ); - - $this->oImapClient->MessageExpunge(); - } - - return $this; - } - - /** - * @param string $sFolderFullNameRaw - * @param bool $bSubscribe - * - * @return \MailSo\Mail\MailClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public function FolderSubscribe($sFolderFullNameRaw, $bSubscribe) - { - if (0 === \strlen($sFolderFullNameRaw)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $this->oImapClient->{($bSubscribe) ? 'FolderSubscribe' : 'FolderUnSubscribe'}($sFolderFullNameRaw); - - return $this; - } - - /** - * @param \MailSo\Log\Logger $oLogger - * - * @return \MailSo\Mail\MailClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public function SetLogger($oLogger) - { - if (!($oLogger instanceof \MailSo\Log\Logger)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $this->oLogger = $oLogger; - $this->oImapClient->SetLogger($this->oLogger); - - return $this; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Message.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Message.php deleted file mode 100755 index 9c1c5251..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/Message.php +++ /dev/null @@ -1,890 +0,0 @@ -Clear(); - } - - /** - * @return \MailSo\Mail\Message - */ - public function Clear() - { - $this->sFolder = ''; - $this->iUid = 0; - $this->sSubject = ''; - $this->sMessageId = ''; - $this->sContentType = ''; - $this->iSize = 0; - $this->iInternalTimeStampInUTC = 0; - $this->iHeaderTimeStampInUTC = 0; - $this->sHeaderDate = ''; - $this->aFlags = array(); - $this->aFlagsLowerCase = array(); - - $this->oFrom = null; - $this->oSender = null; - $this->oReplyTo = null; - $this->oDeliveredTo = null; - $this->oTo = null; - $this->oCc = null; - $this->oBcc = null; - - $this->sPlain = ''; - $this->sHtml = ''; - - $this->oAttachments = null; - $this->aDraftInfo = null; - - $this->sInReplyTo = ''; - $this->sReferences = ''; - $this->aUnsubsribeLinks = array(); - - $this->iSensitivity = \MailSo\Mime\Enumerations\Sensitivity::NOTHING; - $this->iPriority = \MailSo\Mime\Enumerations\MessagePriority::NORMAL; - $this->sDeliveryReceipt = ''; - $this->sReadReceipt = ''; - - $this->aThreads = array(); - - $this->bTextPartIsTrimmed = false; - - $this->sPgpSignature = ''; - $this->bPgpSigned = false; - $this->bPgpEncrypted = false; - - return $this; - } - - /** - * @return \MailSo\Mail\Message - */ - public static function NewInstance() - { - return new self(); - } - - /** - * @return string - */ - public function Plain() - { - return $this->sPlain; - } - - /** - * @return string - */ - public function Html() - { - return $this->sHtml; - } - - /** - * @return string - */ - public function PgpSignature() - { - return $this->sPgpSignature; - } - - /** - * @return bool - */ - public function PgpSigned() - { - return $this->bPgpSigned; - } - - /** - * @return bool - */ - public function PgpEncrypted() - { - return $this->bPgpEncrypted; - } - - /** - * @param string $sHtml - * - * @retun void - */ - public function SetHtml($sHtml) - { - $this->sHtml = $sHtml; - } - - /** - * @return string - */ - public function Folder() - { - return $this->sFolder; - } - - /** - * @return int - */ - public function Uid() - { - return $this->iUid; - } - - /** - * @return string - */ - public function MessageId() - { - return $this->sMessageId; - } - - /** - * @return string - */ - public function Subject() - { - return $this->sSubject; - } - - /** - * @return string - */ - public function ContentType() - { - return $this->sContentType; - } - - /** - * @return int - */ - public function Size() - { - return $this->iSize; - } - - /** - * @return int - */ - public function InternalTimeStampInUTC() - { - return $this->iInternalTimeStampInUTC; - } - - /** - * @return int - */ - public function HeaderTimeStampInUTC() - { - return $this->iHeaderTimeStampInUTC; - } - - /** - * @return string - */ - public function HeaderDate() - { - return $this->sHeaderDate; - } - - /** - * @return array - */ - public function Flags() - { - return $this->aFlags; - } - - /** - * @return array - */ - public function FlagsLowerCase() - { - return $this->aFlagsLowerCase; - } - - /** - * @return \MailSo\Mime\EmailCollection - */ - public function From() - { - return $this->oFrom; - } - - /** - * @return int - */ - public function Sensitivity() - { - return $this->iSensitivity; - } - - /** - * @return int - */ - public function Priority() - { - return $this->iPriority; - } - - /** - * @return \MailSo\Mime\EmailCollection - */ - public function Sender() - { - return $this->oSender; - } - - /** - * @return \MailSo\Mime\EmailCollection - */ - public function ReplyTo() - { - return $this->oReplyTo; - } - - /** - * @return \MailSo\Mime\EmailCollection - */ - public function DeliveredTo() - { - return $this->oDeliveredTo; - } - - /** - * @return \MailSo\Mime\EmailCollection - */ - public function To() - { - return $this->oTo; - } - - /** - * @return \MailSo\Mime\EmailCollection - */ - public function Cc() - { - return $this->oCc; - } - - /** - * @return \MailSo\Mime\EmailCollection - */ - public function Bcc() - { - return $this->oBcc; - } - - /** - * @return \MailSo\Mail\AttachmentCollection - */ - public function Attachments() - { - return $this->oAttachments; - } - - /** - * @return string - */ - public function InReplyTo() - { - return $this->sInReplyTo; - } - - /** - * @return string - */ - public function References() - { - return $this->sReferences; - } - - /** - * @return string - */ - public function DeliveryReceipt() - { - return $this->sDeliveryReceipt; - } - - /** - * @return string - */ - public function ReadReceipt() - { - return $this->sReadReceipt; - } - - /** - * @return array - */ - public function UnsubsribeLinks() - { - return $this->aUnsubsribeLinks; - } - - /** - * @return string - */ - public function ReadingConfirmation() - { - return $this->ReadReceipt(); - } - - /** - * @return array | null - */ - public function DraftInfo() - { - return $this->aDraftInfo; - } - - /** - * @return array - */ - public function Threads() - { - return $this->aThreads; - } - - /** - * @param array $aThreads - */ - public function SetThreads($aThreads) - { - $this->aThreads = \is_array($aThreads) ? $aThreads : array(); - } - - /** - * @return boole - */ - public function TextPartIsTrimmed() - { - return $this->bTextPartIsTrimmed; - } - - /** - * @param string $sFolder - * @param \MailSo\Imap\FetchResponse $oFetchResponse - * @param \MailSo\Imap\BodyStructure $oBodyStructure = null - * - * @return \MailSo\Mail\Message - */ - public static function NewFetchResponseInstance($sFolder, $oFetchResponse, $oBodyStructure = null) - { - return self::NewInstance()->InitByFetchResponse($sFolder, $oFetchResponse, $oBodyStructure); - } - - /** - * @param string $sFolder - * @param \MailSo\Imap\FetchResponse $oFetchResponse - * @param \MailSo\Imap\BodyStructure $oBodyStructure = null - * - * @return \MailSo\Mail\Message - */ - public function InitByFetchResponse($sFolder, $oFetchResponse, $oBodyStructure = null) - { - if (!$oBodyStructure) - { - $oBodyStructure = $oFetchResponse->GetFetchBodyStructure(); - } - - $sUid = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::UID); - $sSize = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::RFC822_SIZE); - $sInternalDate = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::INTERNALDATE); - $aFlags = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::FLAGS); - - $this->sFolder = $sFolder; - $this->iUid = \is_numeric($sUid) ? (int) $sUid : 0; - $this->iSize = \is_numeric($sSize) ? (int) $sSize : 0; - $this->aFlags = \is_array($aFlags) ? $aFlags : array(); - $this->aFlagsLowerCase = \array_map('strtolower', $this->aFlags); - - $this->iInternalTimeStampInUTC = - \MailSo\Base\DateTimeHelper::ParseInternalDateString($sInternalDate); - - $sCharset = $oBodyStructure ? $oBodyStructure->SearchCharset() : ''; - $sCharset = \MailSo\Base\Utils::NormalizeCharset($sCharset); - - $sHeaders = $oFetchResponse->GetHeaderFieldsValue(); - if (0 < \strlen($sHeaders)) - { - $oHeaders = \MailSo\Mime\HeaderCollection::NewInstance()->Parse($sHeaders, false, $sCharset); - - $sContentTypeCharset = $oHeaders->ParameterValue( - \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, - \MailSo\Mime\Enumerations\Parameter::CHARSET - ); - - if (0 < \strlen($sContentTypeCharset)) - { - $sCharset = $sContentTypeCharset; - $sCharset = \MailSo\Base\Utils::NormalizeCharset($sCharset); - } - - if (0 < \strlen($sCharset)) - { - $oHeaders->SetParentCharset($sCharset); - } - - $bCharsetAutoDetect = 0 === \strlen($sCharset); - - $this->sSubject = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::SUBJECT, $bCharsetAutoDetect); - $this->sMessageId = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::MESSAGE_ID); - $this->sContentType = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE); - - $this->oFrom = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::FROM_, $bCharsetAutoDetect); - $this->oTo = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::TO_, $bCharsetAutoDetect); - $this->oCc = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::CC, $bCharsetAutoDetect); - $this->oBcc = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::BCC, $bCharsetAutoDetect); - - $oHeaders->PopulateEmailColectionByDkim($this->oFrom); - - $this->oSender = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::SENDER, $bCharsetAutoDetect); - $this->oReplyTo = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::REPLY_TO, $bCharsetAutoDetect); - $this->oDeliveredTo = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::DELIVERED_TO, $bCharsetAutoDetect); - - $this->sInReplyTo = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::IN_REPLY_TO); - $this->sReferences = \MailSo\Base\Utils::StripSpaces( - $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::REFERENCES)); - - $sHeaderDate = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::DATE); - $this->sHeaderDate = $sHeaderDate; - $this->iHeaderTimeStampInUTC = \MailSo\Base\DateTimeHelper::ParseRFC2822DateString($sHeaderDate); - - // Sensitivity - $this->iSensitivity = \MailSo\Mime\Enumerations\Sensitivity::NOTHING; - $sSensitivity = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::SENSITIVITY); - switch (\strtolower($sSensitivity)) - { - case 'personal': - $this->iSensitivity = \MailSo\Mime\Enumerations\Sensitivity::PERSONAL; - break; - case 'private': - $this->iSensitivity = \MailSo\Mime\Enumerations\Sensitivity::PRIVATE_; - break; - case 'company-confidential': - $this->iSensitivity = \MailSo\Mime\Enumerations\Sensitivity::CONFIDENTIAL; - break; - } - - // Priority - $this->iPriority = \MailSo\Mime\Enumerations\MessagePriority::NORMAL; - $sPriority = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_MSMAIL_PRIORITY); - if (0 === \strlen($sPriority)) - { - $sPriority = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::IMPORTANCE); - } - if (0 === \strlen($sPriority)) - { - $sPriority = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_PRIORITY); - } - if (0 < \strlen($sPriority)) - { - switch (\str_replace(' ', '', \strtolower($sPriority))) - { - case 'high': - case '1(highest)': - case '2(high)': - case '1': - case '2': - $this->iPriority = \MailSo\Mime\Enumerations\MessagePriority::HIGH; - break; - - case 'low': - case '4(low)': - case '5(lowest)': - case '4': - case '5': - $this->iPriority = \MailSo\Mime\Enumerations\MessagePriority::LOW; - break; - } - } - - // Delivery Receipt - $this->sDeliveryReceipt = \trim($oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::RETURN_RECEIPT_TO)); - - // Read Receipt - $this->sReadReceipt = \trim($oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::DISPOSITION_NOTIFICATION_TO)); - if (empty($this->sReadReceipt)) - { - $this->sReadReceipt = \trim($oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_CONFIRM_READING_TO)); - } - - //Unsubscribe links - $this->aUnsubsribeLinks = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::LIST_UNSUBSCRIBE); - if (empty($this->aUnsubsribeLinks)) - { - $this->aUnsubsribeLinks = array(); - } - else - { - $this->aUnsubsribeLinks = explode(',', $this->aUnsubsribeLinks); - $this->aUnsubsribeLinks = array_map( - function ($link) { - return trim($link, ' <>'); - }, - $this->aUnsubsribeLinks - ); - } - - $sDraftInfo = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_DRAFT_INFO); - if (0 < \strlen($sDraftInfo)) - { - $sType = ''; - $sFolder = ''; - $sUid = ''; - - \MailSo\Mime\ParameterCollection::NewInstance($sDraftInfo) - ->ForeachList(function ($oParameter) use (&$sType, &$sFolder, &$sUid) { - - switch (\strtolower($oParameter->Name())) - { - case 'type': - $sType = $oParameter->Value(); - break; - case 'uid': - $sUid = $oParameter->Value(); - break; - case 'folder': - $sFolder = \base64_decode($oParameter->Value()); - break; - } - }) - ; - - if (0 < \strlen($sType) && 0 < \strlen($sFolder) && 0 < \strlen($sUid)) - { - $this->aDraftInfo = array($sType, $sUid, $sFolder); - } - } - } - else if ($oFetchResponse->GetEnvelope()) - { - if (0 === \strlen($sCharset) && $oBodyStructure) - { - $sCharset = $oBodyStructure->SearchCharset(); - $sCharset = \MailSo\Base\Utils::NormalizeCharset($sCharset); - } - - if (0 === \strlen($sCharset)) - { - $sCharset = \MailSo\Base\Enumerations\Charset::ISO_8859_1; - } - - // date, subject, from, sender, reply-to, to, cc, bcc, in-reply-to, message-id - $this->sMessageId = $oFetchResponse->GetFetchEnvelopeValue(9, ''); - $this->sSubject = \MailSo\Base\Utils::DecodeHeaderValue($oFetchResponse->GetFetchEnvelopeValue(1, ''), $sCharset); - - $this->oFrom = $oFetchResponse->GetFetchEnvelopeEmailCollection(2, $sCharset); - $this->oSender = $oFetchResponse->GetFetchEnvelopeEmailCollection(3, $sCharset); - $this->oReplyTo = $oFetchResponse->GetFetchEnvelopeEmailCollection(4, $sCharset); - $this->oTo = $oFetchResponse->GetFetchEnvelopeEmailCollection(5, $sCharset); - $this->oCc = $oFetchResponse->GetFetchEnvelopeEmailCollection(6, $sCharset); - $this->oBcc = $oFetchResponse->GetFetchEnvelopeEmailCollection(7, $sCharset); - $this->sInReplyTo = $oFetchResponse->GetFetchEnvelopeValue(8, ''); - } - - $aTextParts = $oBodyStructure ? $oBodyStructure->SearchHtmlOrPlainParts() : null; - if (\is_array($aTextParts) && 0 < \count($aTextParts)) - { - if (0 === \strlen($sCharset)) - { - $sCharset = \MailSo\Base\Enumerations\Charset::UTF_8; - } - - $aHtmlParts = array(); - $aPlainParts = array(); - - foreach ($aTextParts as $oPart) - { - $sText = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::BODY.'['.$oPart->PartID().']'); - if (null === $sText) - { - $sText = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::BODY.'['.$oPart->PartID().']<0>'); - if (\is_string($sText) && 0 < \strlen($sText)) - { - $this->bTextPartIsTrimmed = true; - } - } - - if (\is_string($sText) && 0 < \strlen($sText)) - { - $sTextCharset = $oPart->Charset(); - if (empty($sTextCharset)) - { - $sTextCharset = $sCharset; - } - - $sTextCharset = \MailSo\Base\Utils::NormalizeCharset($sTextCharset, true); - - $sText = \MailSo\Base\Utils::DecodeEncodingValue($sText, $oPart->MailEncodingName()); - $sText = \MailSo\Base\Utils::ConvertEncoding($sText, $sTextCharset, \MailSo\Base\Enumerations\Charset::UTF_8); - $sText = \MailSo\Base\Utils::Utf8Clear($sText); - - if ('text/html' === $oPart->ContentType()) - { - $aHtmlParts[] = $sText; - } - else - { - if ($oPart->IsFlowedFormat()) - { - $sText = \MailSo\Base\Utils::DecodeFlowedFormat($sText); - } - - $aPlainParts[] = $sText; - } - } - } - - if (0 < \count($aHtmlParts)) - { - $this->sHtml = \implode('
', $aHtmlParts); - } - else - { - $this->sPlain = \trim(\implode("\n", $aPlainParts)); - } - - $aMatch = array(); - if (\preg_match('/-----BEGIN PGP SIGNATURE-----(.+)-----END PGP SIGNATURE-----/ism', $this->sPlain, $aMatch) && !empty($aMatch[0])) - { - $this->sPgpSignature = \trim($aMatch[0]); - $this->bPgpSigned = true; - } - - $aMatch = array(); - if (\preg_match('/-----BEGIN PGP MESSAGE-----/ism', $this->sPlain, $aMatch) && !empty($aMatch[0])) - { - $this->bPgpEncrypted = true; - } - - unset($aHtmlParts, $aPlainParts, $aMatch); - } - -// if (empty($this->sPgpSignature) && 'multipart/signed' === \strtolower($this->sContentType) && -// 'application/pgp-signature' === \strtolower($oHeaders->ParameterValue( -// \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, -// \MailSo\Mime\Enumerations\Parameter::PROTOCOL -// ))) -// { -// $aPgpSignatureParts = $oBodyStructure ? $oBodyStructure->SearchByContentType('application/pgp-signature') : null; -// if (\is_array($aPgpSignatureParts) && 0 < \count($aPgpSignatureParts) && isset($aPgpSignatureParts[0])) -// { -// $sPgpSignatureText = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::BODY.'['.$aPgpSignatureParts[0]->PartID().']'); -// if (\is_string($sPgpSignatureText) && 0 < \strlen($sPgpSignatureText) && 0 < \strpos($sPgpSignatureText, 'BEGIN PGP SIGNATURE')) -// { -// $this->sPgpSignature = \trim($sPgpSignatureText); -// $this->bPgpSigned = true; -// } -// } -// } - - if ($oBodyStructure) - { - $aAttachmentsParts = $oBodyStructure->SearchAttachmentsParts(); - if ($aAttachmentsParts && 0 < count($aAttachmentsParts)) - { - $this->oAttachments = AttachmentCollection::NewInstance(); - foreach ($aAttachmentsParts as /* @var $oAttachmentItem \MailSo\Imap\BodyStructure */ $oAttachmentItem) - { - $this->oAttachments->Add( - \MailSo\Mail\Attachment::NewBodyStructureInstance($this->sFolder, $this->iUid, $oAttachmentItem) - ); - } - } - } - - return $this; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/MessageCollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/MessageCollection.php deleted file mode 100755 index 427a18ca..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mail/MessageCollection.php +++ /dev/null @@ -1,123 +0,0 @@ -Clear(); - } - - /** - * @return \MailSo\Mail\MessageCollection - */ - public static function NewInstance() - { - return new self(); - } - - /** - * @return \MailSo\Mail\MessageCollection - */ - public function Clear() - { - parent::Clear(); - - $this->FolderHash = ''; - - $this->MessageCount = 0; - $this->MessageUnseenCount = 0; - $this->MessageResultCount = 0; - - $this->FolderName = ''; - $this->Offset = 0; - $this->Limit = 0; - $this->Search = ''; - $this->UidNext = ''; - $this->ThreadUid = ''; - $this->NewMessages = array(); - - $this->Filtered = false; - - return $this; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/MailSo.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/MailSo.php deleted file mode 100755 index aa294dca..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/MailSo.php +++ /dev/null @@ -1,40 +0,0 @@ -rResource = $rResource; - $this->sFileName = $sFileName; - $this->iFileSize = $iFileSize; - $this->bIsInline = $bIsInline; - $this->bIsLinked = $bIsLinked; - $this->sCID = $sCID; - $this->aCustomContentTypeParams = $aCustomContentTypeParams; - $this->sContentLocation = $sContentLocation; - } - - /** - * @param resource $rResource - * @param string $sFileName = '' - * @param int $iFileSize = 0 - * @param bool $bIsInline = false - * @param bool $bIsLinked = false - * @param string $sCID = '' - * @param array $aCustomContentTypeParams = array() - * @param string $sContentLocation = '' - * - * @return \MailSo\Mime\Attachment - */ - public static function NewInstance($rResource, $sFileName = '', $iFileSize = 0, $bIsInline = false, - $bIsLinked = false, $sCID = '', $aCustomContentTypeParams = array(), $sContentLocation = '') - { - return new self($rResource, $sFileName, $iFileSize, $bIsInline, $bIsLinked, $sCID, $aCustomContentTypeParams, $sContentLocation); - } - - /** - * @return resource - */ - public function Resource() - { - return $this->rResource; - } - - /** - * @return string - */ - public function ContentType() - { - return \MailSo\Base\Utils::MimeContentType($this->sFileName); - } - - /** - * @return array - */ - public function CustomContentTypeParams() - { - return $this->aCustomContentTypeParams; - } - - /** - * @return string - */ - public function CID() - { - return $this->sCID; - } - - /** - * @return string - */ - public function ContentLocation() - { - return $this->sContentLocation; - } - - /** - * @return string - */ - public function FileName() - { - return $this->sFileName; - } - - /** - * @return int - */ - public function FileSize() - { - return $this->iFileSize; - } - - /** - * @return bool - */ - public function IsInline() - { - return $this->bIsInline; - } - - /** - * @return bool - */ - public function IsImage() - { - return 'image' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); - } - - /** - * @return bool - */ - public function IsArchive() - { - return 'archive' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); - } - - /** - * @return bool - */ - public function IsPdf() - { - return 'pdf' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); - } - - /** - * @return bool - */ - public function IsDoc() - { - return 'doc' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); - } - - /** - * @return bool - */ - public function IsLinked() - { - return $this->bIsLinked && 0 < \strlen($this->sCID); - } -} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/AttachmentCollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/AttachmentCollection.php deleted file mode 100755 index 68376fd7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/AttachmentCollection.php +++ /dev/null @@ -1,71 +0,0 @@ -FilterList(function ($oItem) { - return $oItem && $oItem->IsLinked(); - }); - } - - /** - * @return array - */ - public function UnlinkedAttachments() - { - return $this->FilterList(function ($oItem) { - return $oItem && !$oItem->IsLinked(); - }); - } - - /** - * @return int - */ - public function SizeOfAttachments() - { - $iResult = 0; - $this->ForeachList(function ($oItem) use (&$iResult) { - if ($oItem) - { - $iResult += $oItem->FileSize(); - } - }); - - return $iResult; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Email.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Email.php deleted file mode 100755 index 9dd393f5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Email.php +++ /dev/null @@ -1,315 +0,0 @@ -sEmail = \MailSo\Base\Utils::IdnToAscii( - \MailSo\Base\Utils::Trim($sEmail), true); - - $this->sDisplayName = \MailSo\Base\Utils::Trim($sDisplayName); - - $this->sDkimStatus = \MailSo\Mime\Enumerations\DkimStatus::NONE; - $this->sDkimValue = ''; - } - - /** - * @param string $sEmail - * @param string $sDisplayName = '' - * - * @return \MailSo\Mime\Email - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public static function NewInstance($sEmail, $sDisplayName = '') - { - return new self($sEmail, $sDisplayName); - } - - /** - * @param string $sEmailAddress - * @return \MailSo\Mime\Email - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public static function Parse($sEmailAddress) - { - $sEmailAddress = \MailSo\Base\Utils::Trim($sEmailAddress); - if (!\MailSo\Base\Validator::NotEmptyString($sEmailAddress, true)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $sName = ''; - $sEmail = ''; - $sComment = ''; - - $bInName = false; - $bInAddress = false; - $bInComment = false; - - $iStartIndex = 0; - $iEndIndex = 0; - $iCurrentIndex = 0; - - while ($iCurrentIndex < \strlen($sEmailAddress)) - { - switch ($sEmailAddress{$iCurrentIndex}) - { -// case '\'': - case '"': -// $sQuoteChar = $sEmailAddress{$iCurrentIndex}; - if ((!$bInName) && (!$bInAddress) && (!$bInComment)) - { - $bInName = true; - $iStartIndex = $iCurrentIndex; - } - else if ((!$bInAddress) && (!$bInComment)) - { - $iEndIndex = $iCurrentIndex; - $sName = \substr($sEmailAddress, $iStartIndex + 1, $iEndIndex - $iStartIndex - 1); - $sEmailAddress = \substr_replace($sEmailAddress, '', $iStartIndex, $iEndIndex - $iStartIndex + 1); - $iEndIndex = 0; - $iCurrentIndex = 0; - $iStartIndex = 0; - $bInName = false; - } - break; - case '<': - if ((!$bInName) && (!$bInAddress) && (!$bInComment)) - { - if ($iCurrentIndex > 0 && \strlen($sName) === 0) - { - $sName = \substr($sEmailAddress, 0, $iCurrentIndex); - } - - $bInAddress = true; - $iStartIndex = $iCurrentIndex; - } - break; - case '>': - if ($bInAddress) - { - $iEndIndex = $iCurrentIndex; - $sEmail = \substr($sEmailAddress, $iStartIndex + 1, $iEndIndex - $iStartIndex - 1); - $sEmailAddress = \substr_replace($sEmailAddress, '', $iStartIndex, $iEndIndex - $iStartIndex + 1); - $iEndIndex = 0; - $iCurrentIndex = 0; - $iStartIndex = 0; - $bInAddress = false; - } - break; - case '(': - if ((!$bInName) && (!$bInAddress) && (!$bInComment)) - { - $bInComment = true; - $iStartIndex = $iCurrentIndex; - } - break; - case ')': - if ($bInComment) - { - $iEndIndex = $iCurrentIndex; - $sComment = \substr($sEmailAddress, $iStartIndex + 1, $iEndIndex - $iStartIndex - 1); - $sEmailAddress = \substr_replace($sEmailAddress, '', $iStartIndex, $iEndIndex - $iStartIndex + 1); - $iEndIndex = 0; - $iCurrentIndex = 0; - $iStartIndex = 0; - $bInComment = false; - } - break; - case '\\': - $iCurrentIndex++; - break; - } - - $iCurrentIndex++; - } - - if (\strlen($sEmail) === 0) - { - $aRegs = array(''); - if (\preg_match('/[^@\s]+@\S+/i', $sEmailAddress, $aRegs) && isset($aRegs[0])) - { - $sEmail = $aRegs[0]; - } - else - { - $sName = $sEmailAddress; - } - } - - if ((\strlen($sEmail) > 0) && (\strlen($sName) == 0) && (\strlen($sComment) == 0)) - { - $sName = \str_replace($sEmail, '', $sEmailAddress); - } - - $sEmail = \trim(\trim($sEmail), '<>'); - $sEmail = \rtrim(\trim($sEmail), '.'); - $sEmail = \trim($sEmail); - - $sName = \trim(\trim($sName), '"'); - $sName = \trim($sName, '\''); - $sComment = \trim(\trim($sComment), '()'); - - // Remove backslash - $sName = \preg_replace('/\\\\(.)/s', '$1', $sName); - $sComment = \preg_replace('/\\\\(.)/s', '$1', $sComment); - - return Email::NewInstance($sEmail, $sName); - } - - /** - * @param bool $bIdn = false - * - * @return string - */ - public function GetEmail($bIdn = false) - { - return $bIdn ? \MailSo\Base\Utils::IdnToUtf8($this->sEmail) : $this->sEmail; - } - - /** - * @return string - */ - public function GetDisplayName() - { - return $this->sDisplayName; - } - - /** - * @return string - */ - public function GetDkimStatus() - { - return $this->sDkimStatus; - } - - /** - * @return string - */ - public function GetDkimValue() - { - return $this->sDkimValue; - } - - /** - * @return string - */ - public function GetAccountName() - { - return \MailSo\Base\Utils::GetAccountNameFromEmail($this->GetEmail(false)); - } - - /** - * @param bool $bIdn = false - * - * @return string - */ - public function GetDomain($bIdn = false) - { - return \MailSo\Base\Utils::GetDomainFromEmail($this->GetEmail($bIdn)); - } - - /** - * @param string $sDkimStatus - * @param string $sDkimValue = '' - */ - public function SetDkimStatusAndValue($sDkimStatus, $sDkimValue = '') - { - $this->sDkimStatus = \MailSo\Mime\Enumerations\DkimStatus::normalizeValue($sDkimStatus); - $this->sDkimValue = $sDkimValue; - } - - /** - * @param bool $bIdn = false - * @param bool $bDkim = true - * - * @return array - */ - public function ToArray($bIdn = false, $bDkim = true) - { - return $bDkim ? - array($this->sDisplayName, $this->GetEmail($bIdn), $this->sDkimStatus, $this->sDkimValue) : - array($this->sDisplayName, $this->GetEmail($bIdn)); - } - - /** - * @param bool $bConvertSpecialsName = false - * @param bool $bIdn = false - * - * @return string - */ - public function ToString($bConvertSpecialsName = false, $bIdn = false) - { - $sReturn = ''; - - $sDisplayName = \str_replace('"', '\"', $this->sDisplayName); - if ($bConvertSpecialsName) - { - $sDisplayName = 0 === \strlen($sDisplayName) ? '' : \MailSo\Base\Utils::EncodeUnencodedValue( - \MailSo\Base\Enumerations\Encoding::BASE64_SHORT, - $sDisplayName); - } - - $sDisplayName = 0 === \strlen($sDisplayName) ? '' : '"'.$sDisplayName.'"'; - if (0 < \strlen($this->sEmail)) - { - $sReturn = $this->GetEmail($bIdn); - if (0 < \strlen($sDisplayName)) - { - $sReturn = $sDisplayName.' <'.$sReturn.'>'; - } - } - - return \trim($sReturn); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/EmailCollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/EmailCollection.php deleted file mode 100755 index 53e5db39..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/EmailCollection.php +++ /dev/null @@ -1,243 +0,0 @@ -parseEmailAddresses($sEmailAddresses); - } - } - - /** - * @param string $sEmailAddresses = '' - * - * @return \MailSo\Mime\EmailCollection - */ - public static function NewInstance($sEmailAddresses = '') - { - return new self($sEmailAddresses); - } - - /** - * @param string $sEmailAddresses - * - * @return \MailSo\Mime\EmailCollection - */ - public static function Parse($sEmailAddresses) - { - return self::NewInstance($sEmailAddresses); - } - - /** - * @return array - */ - public function ToArray() - { - $aReturn = $aEmails = array(); - $aEmails =& $this->GetAsArray(); - foreach ($aEmails as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) - { - $aReturn[] = $oEmail->ToArray(); - } - - return $aReturn; - } - - /** - * @param \MailSo\Mime\EmailCollection $oEmails - * - * @return \MailSo\Mime\EmailCollection - */ - public function MergeWithOtherCollection(\MailSo\Mime\EmailCollection $oEmails) - { - $aEmails =& $oEmails->GetAsArray(); - foreach ($aEmails as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) - { - $this->Add($oEmail); - } - - return $this; - } - - /** - * @return \MailSo\Mime\EmailCollection - */ - public function Unique() - { - $aCache = array(); - $aReturn = array(); - - $aEmails =& $this->GetAsArray(); - foreach ($aEmails as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) - { - $sEmail = $oEmail->GetEmail(); - if (!isset($aCache[$sEmail])) - { - $aCache[$sEmail] = true; - $aReturn[] = $oEmail; - } - } - - $this->SetAsArray($aReturn); - - return $this; - } - - /** - * @param bool $bConvertSpecialsName = false - * @param bool $bIdn = false - * - * @return string - */ - public function ToString($bConvertSpecialsName = false, $bIdn = false) - { - $aReturn = $aEmails = array(); - $aEmails =& $this->GetAsArray(); - foreach ($aEmails as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) - { - $aReturn[] = $oEmail->ToString($bConvertSpecialsName, $bIdn); - } - - return \implode(', ', $aReturn); - } - - /** - * @param string $sRawEmails - * - * @return \MailSo\Mime\EmailCollection - */ - private function parseEmailAddresses($sRawEmails) - { - $this->Clear(); - - $sWorkingRecipients = \trim($sRawEmails); - - if (0 === \strlen($sWorkingRecipients)) - { - return $this; - } - - $iEmailStartPos = 0; - $iEmailEndPos = 0; - - $bIsInQuotes = false; - $sChQuote = '"'; - $bIsInAngleBrackets = false; - $bIsInBrackets = false; - - $iCurrentPos = 0; - - $sWorkingRecipientsLen = \strlen($sWorkingRecipients); - - while ($iCurrentPos < $sWorkingRecipientsLen) - { - switch ($sWorkingRecipients{$iCurrentPos}) - { - case '\'': - case '"': - if (!$bIsInQuotes) - { - $sChQuote = $sWorkingRecipients{$iCurrentPos}; - $bIsInQuotes = true; - } - else if ($sChQuote == $sWorkingRecipients{$iCurrentPos}) - { - $bIsInQuotes = false; - } - break; - - case '<': - if (!$bIsInAngleBrackets) - { - $bIsInAngleBrackets = true; - if ($bIsInQuotes) - { - $bIsInQuotes = false; - } - } - break; - - case '>': - if ($bIsInAngleBrackets) - { - $bIsInAngleBrackets = false; - } - break; - - case '(': - if (!$bIsInBrackets) - { - $bIsInBrackets = true; - } - break; - - case ')': - if ($bIsInBrackets) - { - $bIsInBrackets = false; - } - break; - - case ',': - case ';': - if (!$bIsInAngleBrackets && !$bIsInBrackets && !$bIsInQuotes) - { - $iEmailEndPos = $iCurrentPos; - - try - { - $this->Add( - \MailSo\Mime\Email::Parse(\substr($sWorkingRecipients, $iEmailStartPos, $iEmailEndPos - $iEmailStartPos)) - ); - - $iEmailStartPos = $iCurrentPos + 1; - } - catch (\MailSo\Base\Exceptions\InvalidArgumentException $oException) - { - } - } - break; - } - - $iCurrentPos++; - } - - if ($iEmailStartPos < $iCurrentPos) - { - try - { - $this->Add( - \MailSo\Mime\Email::Parse(\substr($sWorkingRecipients, $iEmailStartPos, $iCurrentPos - $iEmailStartPos)) - ); - } - catch (\MailSo\Base\Exceptions\InvalidArgumentException $oException) {} - } - - return $this; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/EmailDep.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/EmailDep.php deleted file mode 100755 index 64173bed..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/EmailDep.php +++ /dev/null @@ -1,339 +0,0 @@ -sEmail = \MailSo\Base\Utils::IdnToAscii( - \MailSo\Base\Utils::Trim($sEmail), true); - - $this->sDisplayName = \MailSo\Base\Utils::Trim($sDisplayName); - $this->sRemark = \MailSo\Base\Utils::Trim($sRemark); - - $this->sDkimStatus = \MailSo\Mime\Enumerations\DkimStatus::NONE; - $this->sDkimValue = ''; - } - - /** - * @param string $sEmail - * @param string $sDisplayName = '' - * @param string $sRemark = '' - * - * @return \MailSo\Mime\Email - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public static function NewInstance($sEmail, $sDisplayName = '', $sRemark = '') - { - return new self($sEmail, $sDisplayName, $sRemark); - } - - /** - * @param string $sEmailAddress - * @return \MailSo\Mime\Email - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public static function Parse($sEmailAddress) - { - $sEmailAddress = \MailSo\Base\Utils::Trim($sEmailAddress); - if (!\MailSo\Base\Validator::NotEmptyString($sEmailAddress, true)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $sName = ''; - $sEmail = ''; - $sComment = ''; - - $bInName = false; - $bInAddress = false; - $bInComment = false; - - $iStartIndex = 0; - $iEndIndex = 0; - $iCurrentIndex = 0; - - while ($iCurrentIndex < \strlen($sEmailAddress)) - { - switch ($sEmailAddress{$iCurrentIndex}) - { -// case '\'': - case '"': -// $sQuoteChar = $sEmailAddress{$iCurrentIndex}; - if ((!$bInName) && (!$bInAddress) && (!$bInComment)) - { - $bInName = true; - $iStartIndex = $iCurrentIndex; - } - else if ((!$bInAddress) && (!$bInComment)) - { - $iEndIndex = $iCurrentIndex; - $sName = \substr($sEmailAddress, $iStartIndex + 1, $iEndIndex - $iStartIndex - 1); - $sEmailAddress = \substr_replace($sEmailAddress, '', $iStartIndex, $iEndIndex - $iStartIndex + 1); - $iEndIndex = 0; - $iCurrentIndex = 0; - $iStartIndex = 0; - $bInName = false; - } - break; - case '<': - if ((!$bInName) && (!$bInAddress) && (!$bInComment)) - { - if ($iCurrentIndex > 0 && \strlen($sName) === 0) - { - $sName = \substr($sEmailAddress, 0, $iCurrentIndex); - } - - $bInAddress = true; - $iStartIndex = $iCurrentIndex; - } - break; - case '>': - if ($bInAddress) - { - $iEndIndex = $iCurrentIndex; - $sEmail = \substr($sEmailAddress, $iStartIndex + 1, $iEndIndex - $iStartIndex - 1); - $sEmailAddress = \substr_replace($sEmailAddress, '', $iStartIndex, $iEndIndex - $iStartIndex + 1); - $iEndIndex = 0; - $iCurrentIndex = 0; - $iStartIndex = 0; - $bInAddress = false; - } - break; - case '(': - if ((!$bInName) && (!$bInAddress) && (!$bInComment)) - { - $bInComment = true; - $iStartIndex = $iCurrentIndex; - } - break; - case ')': - if ($bInComment) - { - $iEndIndex = $iCurrentIndex; - $sComment = \substr($sEmailAddress, $iStartIndex + 1, $iEndIndex - $iStartIndex - 1); - $sEmailAddress = \substr_replace($sEmailAddress, '', $iStartIndex, $iEndIndex - $iStartIndex + 1); - $iEndIndex = 0; - $iCurrentIndex = 0; - $iStartIndex = 0; - $bInComment = false; - } - break; - case '\\': - $iCurrentIndex++; - break; - } - - $iCurrentIndex++; - } - - if (\strlen($sEmail) === 0) - { - $aRegs = array(''); - if (\preg_match('/[^@\s]+@\S+/i', $sEmailAddress, $aRegs) && isset($aRegs[0])) - { - $sEmail = $aRegs[0]; - } - else - { - $sName = $sEmailAddress; - } - } - - if ((\strlen($sEmail) > 0) && (\strlen($sName) == 0) && (\strlen($sComment) == 0)) - { - $sName = \str_replace($sEmail, '', $sEmailAddress); - } - - $sEmail = \trim(\trim($sEmail), '<>'); - $sEmail = \rtrim(\trim($sEmail), '.'); - $sEmail = \trim($sEmail); - - $sName = \trim(\trim($sName), '"'); - $sName = \trim($sName, '\''); - $sComment = \trim(\trim($sComment), '()'); - - // Remove backslash - $sName = \preg_replace('/\\\\(.)/s', '$1', $sName); - $sComment = \preg_replace('/\\\\(.)/s', '$1', $sComment); - - return Email::NewInstance($sEmail, $sName, $sComment); - } - - /** - * @param bool $bIdn = false - * - * @return string - */ - public function GetEmail($bIdn = false) - { - return $bIdn ? \MailSo\Base\Utils::IdnToUtf8($this->sEmail) : $this->sEmail; - } - - /** - * @return string - */ - public function GetDisplayName() - { - return $this->sDisplayName; - } - - /** - * @return string - */ - public function GetRemark() - { - return $this->sRemark; - } - - /** - * @return string - */ - public function GetDkimStatus() - { - return $this->sDkimStatus; - } - - /** - * @return string - */ - public function GetDkimValue() - { - return $this->sDkimValue; - } - - /** - * @return string - */ - public function GetAccountName() - { - return \MailSo\Base\Utils::GetAccountNameFromEmail($this->GetEmail(false)); - } - - /** - * @param bool $bIdn = false - * - * @return string - */ - public function GetDomain($bIdn = false) - { - return \MailSo\Base\Utils::GetDomainFromEmail($this->GetEmail($bIdn)); - } - - /** - * @param string $sDkimStatus - * @param string $sDkimValue = '' - */ - public function SetDkimStatusAndValue($sDkimStatus, $sDkimValue = '') - { - $this->sDkimStatus = \MailSo\Mime\Enumerations\DkimStatus::normalizeValue($sDkimStatus); - $this->sDkimValue = $sDkimValue; - } - - /** - * @param bool $bIdn = false - * @param bool $bDkim = true - * - * @return array - */ - public function ToArray($bIdn = false, $bDkim = true) - { - return $bDkim ? array($this->sDisplayName, $this->GetEmail($bIdn), $this->sRemark, $this->sDkimStatus, $this->sDkimValue) : - array($this->sDisplayName, $this->GetEmail($bIdn), $this->sRemark); - } - - /** - * @param bool $bConvertSpecialsName = false - * @param bool $bIdn = false - * - * @return string - */ - public function ToString($bConvertSpecialsName = false, $bIdn = false) - { - $sReturn = ''; - - $sRemark = \str_replace(')', '\)', $this->sRemark); - $sDisplayName = \str_replace('"', '\"', $this->sDisplayName); - - if ($bConvertSpecialsName) - { - $sDisplayName = 0 === \strlen($sDisplayName) ? '' : \MailSo\Base\Utils::EncodeUnencodedValue( - \MailSo\Base\Enumerations\Encoding::BASE64_SHORT, - $sDisplayName); - - $sRemark = 0 === \strlen($sRemark) ? '' : \MailSo\Base\Utils::EncodeUnencodedValue( - \MailSo\Base\Enumerations\Encoding::BASE64_SHORT, - $sRemark); - } - - $sDisplayName = 0 === \strlen($sDisplayName) ? '' : '"'.$sDisplayName.'"'; - $sRemark = 0 === \strlen($sRemark) ? '' : '('.$sRemark.')'; - - if (0 < \strlen($this->sEmail)) - { - $sReturn = $this->GetEmail($bIdn); - if (0 < \strlen($sDisplayName.$sRemark)) - { - $sReturn = $sDisplayName.' <'.$sReturn.'> '.$sRemark; - } - } - - return \trim($sReturn); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Enumerations/Constants.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Enumerations/Constants.php deleted file mode 100755 index 7f52ee89..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Enumerations/Constants.php +++ /dev/null @@ -1,25 +0,0 @@ -sParentCharset = $sParentCharset; - - $this->initInputData($sName, $sValue, $sEncodedValueForReparse); - } - - /** - * @param string $sName - * @param string $sValue - * @param string $sEncodedValueForReparse - * - * @return void - */ - private function initInputData($sName, $sValue, $sEncodedValueForReparse) - { - $this->sName = trim($sName); - $this->sFullValue = trim($sValue); - $this->sEncodedValueForReparse = ''; - - $this->oParameters = null; - if (0 < \strlen($sEncodedValueForReparse) && $this->IsReparsed()) - { - $this->sEncodedValueForReparse = \trim($sEncodedValueForReparse); - } - - if (0 < \strlen($this->sFullValue) && $this->IsParameterized()) - { - $aRawExplode = \explode(';', $this->sFullValue, 2); - if (2 === \count($aRawExplode)) - { - $this->sValue = $aRawExplode[0]; - $this->oParameters = - \MailSo\Mime\ParameterCollection::NewInstance($aRawExplode[1]); - } - else - { - $this->sValue = $this->sFullValue; - } - } - else - { - $this->sValue = $this->sFullValue; - } - } - - /** - * @param string $sName - * @param string $sValue = '' - * @param string $sEncodedValueForReparse = '' - * @param string $sParentCharset = '' - * - * @return \MailSo\Mime\Header - */ - public static function NewInstance($sName, $sValue = '', $sEncodedValueForReparse = '', $sParentCharset = '') - { - return new self($sName, $sValue, $sEncodedValueForReparse, $sParentCharset); - } - - /** - * @param string $sEncodedLines - * @param string $sIncomingCharset = \MailSo\Base\Enumerations\Charset::ISO_8859_1 - * - * @return \MailSo\Mime\Header | false - */ - public static function NewInstanceFromEncodedString($sEncodedLines, $sIncomingCharset = \MailSo\Base\Enumerations\Charset::ISO_8859_1) - { - if (empty($sIncomingCharset)) - { - $sIncomingCharset = \MailSo\Base\Enumerations\Charset::ISO_8859_1; - } - - $aParts = \explode(':', \str_replace("\r", '', $sEncodedLines), 2); - if (isset($aParts[0]) && isset($aParts[1]) && 0 < \strlen($aParts[0]) && 0 < \strlen($aParts[1])) - { - return self::NewInstance( - \trim($aParts[0]), - \trim(\MailSo\Base\Utils::DecodeHeaderValue(\trim($aParts[1]), $sIncomingCharset)), - \trim($aParts[1]), - $sIncomingCharset - ); - } - - return false; - } - - /** - * @return string - */ - public function Name() - { - return $this->sName; - } - - /** - * @return string - */ - public function NameWithDelimitrom() - { - return $this->Name().': '; - } - - /** - * @return string - */ - public function Value() - { - return $this->sValue; - } - - /** - * @return string - */ - public function FullValue() - { - return $this->sFullValue; - } - - /** - * @param string $sParentCharset - * @return \MailSo\Mime\Header - */ - public function SetParentCharset($sParentCharset) - { - if ($this->sParentCharset !== $sParentCharset && $this->IsReparsed() && 0 < \strlen($this->sEncodedValueForReparse)) - { - $this->initInputData( - $this->sName, - \trim(\MailSo\Base\Utils::DecodeHeaderValue($this->sEncodedValueForReparse, $sParentCharset)), - $this->sEncodedValueForReparse - ); - } - - $this->sParentCharset = $sParentCharset; - - return $this; - } - - /** - * @return \MailSo\Mime\ParameterCollection | null - */ - public function Parameters() - { - return $this->oParameters; - } - - /** - * @param string $sValue - * @return string - */ - private function wordWrapHelper($sValue, $sGlue = "\r\n ") - { - return \trim(substr(wordwrap($this->NameWithDelimitrom().$sValue, - \MailSo\Mime\Enumerations\Constants::LINE_LENGTH, $sGlue - ), \strlen($this->NameWithDelimitrom()))); - } - - /** - * @return string - */ - public function EncodedValue() - { - $sResult = $this->sFullValue; - - if ($this->IsSubject()) - { - if (!\MailSo\Base\Utils::IsAscii($sResult) && - \MailSo\Base\Utils::IsIconvSupported() && - \function_exists('iconv_mime_encode')) - { - $aPreferences = array( -// 'scheme' => \MailSo\Base\Enumerations\Encoding::QUOTED_PRINTABLE_SHORT, - 'scheme' => \MailSo\Base\Enumerations\Encoding::BASE64_SHORT, - 'input-charset' => \MailSo\Base\Enumerations\Charset::UTF_8, - 'output-charset' => \MailSo\Base\Enumerations\Charset::UTF_8, - 'line-length' => \MailSo\Mime\Enumerations\Constants::LINE_LENGTH, - 'line-break-chars' => \MailSo\Mime\Enumerations\Constants::CRLF - ); - - return \iconv_mime_encode($this->Name(), $sResult, $aPreferences); - } - } - else if ($this->IsParameterized() && $this->oParameters && 0 < $this->oParameters->Count()) - { - $sResult = $this->sValue.'; '.$this->oParameters->ToString(true); - } - else if ($this->IsEmail()) - { - $oEmailCollection = \MailSo\Mime\EmailCollection::NewInstance($this->sFullValue); - if ($oEmailCollection && 0 < $oEmailCollection->Count()) - { - $sResult = $oEmailCollection->ToString(true, false); - } - } - - return $this->NameWithDelimitrom().$this->wordWrapHelper($sResult); - } - - /** - * @return bool - */ - public function IsSubject() - { - return \strtolower(\MailSo\Mime\Enumerations\Header::SUBJECT) === \strtolower($this->Name()); - } - - /** - * @return bool - */ - public function IsParameterized() - { - return \in_array(\strtolower($this->sName), array( - \strtolower(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE), - \strtolower(\MailSo\Mime\Enumerations\Header::CONTENT_DISPOSITION) - )); - } - - /** - * @return bool - */ - public function IsEmail() - { - return \in_array(\strtolower($this->sName), array( - \strtolower(\MailSo\Mime\Enumerations\Header::FROM_), - \strtolower(\MailSo\Mime\Enumerations\Header::TO_), - \strtolower(\MailSo\Mime\Enumerations\Header::CC), - \strtolower(\MailSo\Mime\Enumerations\Header::BCC), - \strtolower(\MailSo\Mime\Enumerations\Header::REPLY_TO), - \strtolower(\MailSo\Mime\Enumerations\Header::RETURN_PATH), - \strtolower(\MailSo\Mime\Enumerations\Header::SENDER) - )); - } - - /** - * @return string - */ - public function ValueWithCharsetAutoDetect() - { - $sValue = $this->Value(); - if (!\MailSo\Base\Utils::IsAscii($sValue) && - 0 < \strlen($this->sEncodedValueForReparse) && - !\MailSo\Base\Utils::IsAscii($this->sEncodedValueForReparse)) - { - $sValueCharset = \MailSo\Base\Utils::CharsetDetect($this->sEncodedValueForReparse); - if (0 < \strlen($sValueCharset)) - { - $this->SetParentCharset($sValueCharset); - $sValue = $this->Value(); - } - } - - return $sValue; - } - - /** - * @return bool - */ - public function IsReparsed() - { - return $this->IsEmail() || $this->IsSubject() || $this->IsParameterized(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/HeaderCollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/HeaderCollection.php deleted file mode 100755 index 180d5d57..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/HeaderCollection.php +++ /dev/null @@ -1,480 +0,0 @@ -sRawHeaders = ''; - $this->sParentCharset = ''; - - if (0 < \strlen($sRawHeaders)) - { - $this->Parse($sRawHeaders, $bStoreRawHeaders); - } - } - - /** - * @param string $sRawHeaders = '' - * @param bool $bStoreRawHeaders = true - * - * @return \MailSo\Mime\HeaderCollection - */ - public static function NewInstance($sRawHeaders = '', $bStoreRawHeaders = true) - { - return new self($sRawHeaders, $bStoreRawHeaders); - } - - /** - * @param string $sName - * @param string $sValue - * @param bool $bToTop = false - * - * @return \MailSo\Mime\HeaderCollection - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public function AddByName($sName, $sValue, $bToTop = false) - { - return $this->Add(Header::NewInstance($sName, $sValue), $bToTop); - } - - /** - * @param string $sName - * @param string $sValue - * @param bool $bToTop = false - * - * @return \MailSo\Mime\HeaderCollection - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public function SetByName($sName, $sValue, $bToTop = false) - { - return $this->RemoveByName($sName)->Add(Header::NewInstance($sName, $sValue), $bToTop); - } - - /** - * @return \MailSo\Mime\Header | null - */ - public function &GetByIndex($iIndex) - { - $mResult = null; - $mResult =& parent::GetByIndex($iIndex); - return $mResult; - } - - /** - * @param string $sHeaderName - * @param bool $bCharsetAutoDetect = false - * @return string - */ - public function ValueByName($sHeaderName, $bCharsetAutoDetect = false) - { - $oHeader = null; - $oHeader =& $this->GetByName($sHeaderName); - return (null !== $oHeader) ? ($bCharsetAutoDetect ? $oHeader->ValueWithCharsetAutoDetect() : $oHeader->Value()) : ''; - } - - /** - * @param string $sHeaderName - * @param bool $bCharsetAutoDetect = false - * @return array - */ - public function ValuesByName($sHeaderName, $bCharsetAutoDetect = false) - { - $aResult = array(); - $oHeader = null; - - $sHeaderNameLower = \strtolower($sHeaderName); - $aHeaders =& $this->GetAsArray(); - foreach ($aHeaders as /* @var $oHeader \MailSo\Mime\Header */ &$oHeader) - { - if ($sHeaderNameLower === \strtolower($oHeader->Name())) - { - $aResult[] = $bCharsetAutoDetect ? $oHeader->ValueWithCharsetAutoDetect() : $oHeader->Value(); - } - } - - return $aResult; - } - - /** - * @param string $sHeaderName - * - * @return \MailSo\Mime\HeaderCollection - */ - public function RemoveByName($sHeaderName) - { - $aResult = $this->FilterList(function ($oHeader) use ($sHeaderName) { - return $oHeader && \strtolower($oHeader->Name()) !== \strtolower($sHeaderName); - }); - - return $this->SetAsArray($aResult); - } - - /** - * @param string $sHeaderName - * @param bool $bCharsetAutoDetect = false - * - * @return \MailSo\Mime\EmailCollection|null - */ - public function GetAsEmailCollection($sHeaderName, $bCharsetAutoDetect = false) - { - $oResult = null; - $sValue = $this->ValueByName($sHeaderName, $bCharsetAutoDetect); - if (0 < \strlen($sValue)) - { - $oResult = \MailSo\Mime\EmailCollection::NewInstance($sValue); - } - - return $oResult && 0 < $oResult->Count() ? $oResult : null; - } - - /** - * @param string $sHeaderName - * @return \MailSo\Mime\ParameterCollection|null - */ - public function ParametersByName($sHeaderName) - { - $oParameters = $oHeader = null; - $oHeader =& $this->GetByName($sHeaderName); - if ($oHeader) - { - $oParameters = $oHeader->Parameters(); - } - - return $oParameters; - } - - /** - * @param string $sHeaderName - * @param string $sParamName - * @return string - */ - public function ParameterValue($sHeaderName, $sParamName) - { - $oParameters = $this->ParametersByName($sHeaderName); - return (null !== $oParameters) ? $oParameters->ParameterValueByName($sParamName) : ''; - } - - /** - * @param string $sHeaderName - * @return \MailSo\Mime\Header | false - */ - public function &GetByName($sHeaderName) - { - $oResult = $oHeader = null; - - $sHeaderNameLower = \strtolower($sHeaderName); - $aHeaders =& $this->GetAsArray(); - foreach ($aHeaders as /* @var $oHeader \MailSo\Mime\Header */ &$oHeader) - { - if ($sHeaderNameLower === \strtolower($oHeader->Name())) - { - $oResult =& $oHeader; - break; - } - } - - return $oResult; - } - - /** - * @param array $aList - * @return \MailSo\Mime\HeaderCollection - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public function SetAsArray($aList) - { - parent::SetAsArray($aList); - - return $this; - } - - /** - * @param string $sParentCharset - * @return \MailSo\Mime\HeaderCollection - */ - public function SetParentCharset($sParentCharset) - { - if (0 < \strlen($sParentCharset)) - { - if ($this->sParentCharset !== $sParentCharset) - { - $oHeader = null; - $aHeaders =& $this->GetAsArray(); - - foreach ($aHeaders as /* @var $oHeader \MailSo\Mime\Header */ &$oHeader) - { - $oHeader->SetParentCharset($sParentCharset); - } - - $this->sParentCharset = $sParentCharset; - } - } - - return $this; - } - - /** - * @return void - */ - public function Clear() - { - parent::Clear(); - - $this->sRawHeaders = ''; - } - - /** - * @param string $sRawHeaders - * @param bool $bStoreRawHeaders = false - * @param string $sParentCharset = '' - * - * @return \MailSo\Mime\HeaderCollection - */ - public function Parse($sRawHeaders, $bStoreRawHeaders = false, $sParentCharset = '') - { - $this->Clear(); - - if ($bStoreRawHeaders) - { - $this->sRawHeaders = $sRawHeaders; - } - - if (0 === \strlen($this->sParentCharset)) - { - $this->sParentCharset = $sParentCharset; - } - - $aHeaders = \explode("\n", \str_replace("\r", '', $sRawHeaders)); - - $sName = null; - $sValue = null; - foreach ($aHeaders as $sHeadersValue) - { - if (0 === strlen($sHeadersValue)) - { - continue; - } - - $sFirstChar = \substr($sHeadersValue, 0, 1); - if ($sFirstChar !== ' ' && $sFirstChar !== "\t" && false === \strpos($sHeadersValue, ':')) - { - continue; - } - else if (null !== $sName && ($sFirstChar === ' ' || $sFirstChar === "\t")) - { - $sValue = \is_null($sValue) ? '' : $sValue; - - if ('?=' === \substr(\rtrim($sHeadersValue), -2)) - { - $sHeadersValue = \rtrim($sHeadersValue); - } - - if ('=?' === \substr(\ltrim($sHeadersValue), 0, 2)) - { - $sHeadersValue = \ltrim($sHeadersValue); - } - - if ('=?' === \substr($sHeadersValue, 0, 2)) - { - $sValue .= $sHeadersValue; - } - else - { - $sValue .= "\n".$sHeadersValue; - } - } - else - { - if (null !== $sName) - { - $oHeader = Header::NewInstanceFromEncodedString($sName.': '.$sValue, $this->sParentCharset); - if ($oHeader) - { - $this->Add($oHeader); - } - - $sName = null; - $sValue = null; - } - - $aHeaderParts = \explode(':', $sHeadersValue, 2); - $sName = $aHeaderParts[0]; - $sValue = isset($aHeaderParts[1]) ? $aHeaderParts[1] : ''; - - if ('?=' === \substr(\rtrim($sValue), -2)) - { - $sValue = \rtrim($sValue); - } - } - } - - if (null !== $sName) - { - $oHeader = Header::NewInstanceFromEncodedString($sName.': '.$sValue, $this->sParentCharset); - if ($oHeader) - { - $this->Add($oHeader); - } - } - - return $this; - } - - /** - * @return int - */ - public function DkimStatuses() - { - $aResult = array(); - - $aHeaders = $this->ValuesByName(\MailSo\Mime\Enumerations\Header::AUTHENTICATION_RESULTS); - if (\is_array($aHeaders) && 0 < \count($aHeaders)) - { - foreach ($aHeaders as $sHeaderValue) - { - $sStatus = ''; - $sHeader = ''; - $sDkimLine = ''; - - $aMatch = array(); - - $sHeaderValue = \preg_replace('/[\r\n\t\s]+/', ' ', $sHeaderValue); - - if (\preg_match('/dkim=.+/i', $sHeaderValue, $aMatch) && !empty($aMatch[0])) - { - $sDkimLine = $aMatch[0]; - - $aMatch = array(); - if (\preg_match('/dkim=([a-zA-Z0-9]+)/i', $sDkimLine, $aMatch) && !empty($aMatch[1])) - { - $sStatus = $aMatch[1]; - } - - $aMatch = array(); - if (\preg_match('/header\.(d|i|from)=([^\s;]+)/i', $sDkimLine, $aMatch) && !empty($aMatch[2])) - { - $sHeader = \trim($aMatch[2]); - } - - if (!empty($sStatus) && !empty($sHeader)) - { - $aResult[] = array($sStatus, $sHeader, $sDkimLine); - } - } - } - } - else - { - // X-DKIM-Authentication-Results: signer="hostinger.com" status="pass" - $aHeaders = $this->ValuesByName(\MailSo\Mime\Enumerations\Header::X_DKIM_AUTHENTICATION_RESULTS); - if (\is_array($aHeaders) && 0 < \count($aHeaders)) - { - foreach ($aHeaders as $sHeaderValue) - { - $sStatus = ''; - $sHeader = ''; - - $aMatch = array(); - - $sHeaderValue = \preg_replace('/[\r\n\t\s]+/', ' ', $sHeaderValue); - - if (\preg_match('/status[\s]?=[\s]?"([a-zA-Z0-9]+)"/i', $sHeaderValue, $aMatch) && !empty($aMatch[1])) - { - $sStatus = $aMatch[1]; - } - - if (\preg_match('/signer[\s]?=[\s]?"([^";]+)"/i', $sHeaderValue, $aMatch) && !empty($aMatch[1])) - { - $sHeader = \trim($aMatch[1]); - } - - if (!empty($sStatus) && !empty($sHeader)) - { - $aResult[] = array($sStatus, $sHeader, $sHeaderValue); - } - } - } - } - - return $aResult; - } - - /** - * @return int - */ - public function PopulateEmailColectionByDkim($oEmails) - { - if ($oEmails && $oEmails instanceof \MailSo\Mime\EmailCollection) - { - $aDkimStatuses = $this->DkimStatuses(); - if (\is_array($aDkimStatuses) && 0 < \count($aDkimStatuses)) - { - $oEmails->ForeachList(function (/* @var $oItem \MailSo\Mime\Email */ $oItem) use ($aDkimStatuses) { - if ($oItem && $oItem instanceof \MailSo\Mime\Email) - { - $sEmail = $oItem->GetEmail(); - foreach ($aDkimStatuses as $aDkimData) - { - if (isset($aDkimData[0], $aDkimData[1]) && - $aDkimData[1] === \strstr($sEmail, $aDkimData[1])) - { - $oItem->SetDkimStatusAndValue($aDkimData[0], empty($aDkimData[2]) ? '' : $aDkimData[2]); - } - } - } - }); - } - } - } - - /** - * @return string - */ - public function ToEncodedString() - { - $aResult = array(); - $aHeaders =& $this->GetAsArray(); - foreach ($aHeaders as /* @var $oHeader \MailSo\Mime\Header */ &$oHeader) - { - $aResult[] = $oHeader->EncodedValue(); - } - - return \implode(\MailSo\Mime\Enumerations\Constants::CRLF, $aResult); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Message.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Message.php deleted file mode 100755 index 44dfa80b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Message.php +++ /dev/null @@ -1,937 +0,0 @@ -aHeadersValue = array(); - $this->aAlternativeParts = array(); - $this->oAttachmentCollection = AttachmentCollection::NewInstance(); - $this->bAddEmptyTextPart = true; - $this->bAddDefaultXMailer = true; - } - - /** - * @return \MailSo\Mime\Message - */ - public static function NewInstance() - { - return new self(); - } - - /** - * @return \MailSo\Mime\Message - */ - public function DoesNotCreateEmptyTextPart() - { - $this->bAddEmptyTextPart = false; - - return $this; - } - - /** - * @return \MailSo\Mime\Message - */ - public function DoesNotAddDefaultXMailer() - { - $this->bAddDefaultXMailer = false; - - return $this; - } - - /** - * @return string - */ - public function MessageId() - { - $sResult = ''; - if (!empty($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::MESSAGE_ID])) - { - $sResult = $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::MESSAGE_ID]; - } - return $sResult; - } - - /** - * @param string $sMessageId - * - * @return void - */ - public function SetMessageId($sMessageId) - { - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::MESSAGE_ID] = $sMessageId; - } - - /** - * @param string $sHostName = '' - * - * @return void - */ - public function RegenerateMessageId($sHostName = '') - { - $this->SetMessageId($this->generateNewMessageId($sHostName)); - } - - /** - * @return \MailSo\Mime\AttachmentCollection - */ - public function Attachments() - { - return $this->oAttachmentCollection; - } - - /** - * @return string - */ - public function GetSubject() - { - return isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::SUBJECT]) ? - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::SUBJECT] : ''; - } - - /** - * @return \MailSo\Mime\Email|null - */ - public function GetFrom() - { - $oResult = null; - - if (isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::FROM_]) && - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::FROM_] instanceof \MailSo\Mime\Email) - { - $oResult = $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::FROM_]; - } - - return $oResult; - } - - /** - * @return \MailSo\Mime\EmailCollection - */ - public function GetTo() - { - $oResult = \MailSo\Mime\EmailCollection::NewInstance(); - - if (isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::TO_]) && - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::TO_] instanceof \MailSo\Mime\EmailCollection) - { - $oResult->MergeWithOtherCollection($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::TO_]); - } - - return $oResult->Unique(); - } - - /** - * @return \MailSo\Mime\EmailCollection|null - */ - public function GetBcc() - { - $oResult = null; - - if (isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC]) && - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC] instanceof \MailSo\Mime\EmailCollection) - { - $oResult = $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC]; - } - - return $oResult ? $oResult->Unique() : null; - } - - /** - * @return \MailSo\Mime\EmailCollection - */ - public function GetRcpt() - { - $oResult = \MailSo\Mime\EmailCollection::NewInstance(); - - if (isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::TO_]) && - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::TO_] instanceof \MailSo\Mime\EmailCollection) - { - $oResult->MergeWithOtherCollection($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::TO_]); - } - - if (isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::CC]) && - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::CC] instanceof \MailSo\Mime\EmailCollection) - { - $oResult->MergeWithOtherCollection($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::CC]); - } - - if (isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC]) && - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC] instanceof \MailSo\Mime\EmailCollection) - { - $oResult->MergeWithOtherCollection($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC]); - } - - return $oResult->Unique(); - } - - /** - * @param string $sHeaderName - * @param string $sValue - * - * @return \MailSo\Mime\Message - */ - public function SetCustomHeader($sHeaderName, $sValue) - { - $sHeaderName = \trim($sHeaderName); - if (0 < \strlen($sHeaderName)) - { - $this->aHeadersValue[$sHeaderName] = $sValue; - } - - return $this; - } - - /** - * @param string $sSubject - * - * @return \MailSo\Mime\Message - */ - public function SetSubject($sSubject) - { - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::SUBJECT] = $sSubject; - - return $this; - } - - /** - * @param string $sInReplyTo - * - * @return \MailSo\Mime\Message - */ - public function SetInReplyTo($sInReplyTo) - { - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::IN_REPLY_TO] = $sInReplyTo; - - return $this; - } - - /** - * @param string $sReferences - * - * @return \MailSo\Mime\Message - */ - public function SetReferences($sReferences) - { - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::REFERENCES] = - \MailSo\Base\Utils::StripSpaces($sReferences); - - return $this; - } - - /** - * @param string $sEmail - * - * @return \MailSo\Mime\Message - */ - public function SetReadReceipt($sEmail) - { - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::DISPOSITION_NOTIFICATION_TO] = $sEmail; - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::X_CONFIRM_READING_TO] = $sEmail; - - return $this; - } - - /** - * @param string $sEmail - * - * @return \MailSo\Mime\Message - */ - public function SetReadConfirmation($sEmail) - { - return $this->SetReadReceipt($sEmail); - } - - /** - * @param int $iValue - * - * @return \MailSo\Mime\Message - */ - public function SetPriority($iValue) - { - $sResult = ''; - switch ($iValue) - { - case \MailSo\Mime\Enumerations\MessagePriority::HIGH: - $sResult = \MailSo\Mime\Enumerations\MessagePriority::HIGH.' (Highest)'; - break; - case \MailSo\Mime\Enumerations\MessagePriority::NORMAL: - $sResult = \MailSo\Mime\Enumerations\MessagePriority::NORMAL.' (Normal)'; - break; - case \MailSo\Mime\Enumerations\MessagePriority::LOW: - $sResult = \MailSo\Mime\Enumerations\MessagePriority::LOW.' (Lowest)'; - break; - } - - if (0 < \strlen($sResult)) - { - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::X_PRIORITY] = $sResult; - } - - return $this; - } - - /** - * @param int $iValue - * - * @return \MailSo\Mime\Message - */ - public function SetSensitivity($iValue) - { - $sResult = ''; - switch ($iValue) - { - case \MailSo\Mime\Enumerations\Sensitivity::CONFIDENTIAL: - $sResult = 'Company-Confidential'; - break; - case \MailSo\Mime\Enumerations\Sensitivity::PERSONAL: - $sResult = 'Personal'; - break; - case \MailSo\Mime\Enumerations\Sensitivity::PRIVATE_: - $sResult = 'Private'; - break; - } - - if (0 < \strlen($sResult)) - { - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::SENSITIVITY] = $sResult; - } - - return $this; - } - - /** - * @param string $sXMailer - * - * @return \MailSo\Mime\Message - */ - public function SetXMailer($sXMailer) - { - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::X_MAILER] = $sXMailer; - - return $this; - } - - /** - * @param \MailSo\Mime\Email $oEmail - * - * @return \MailSo\Mime\Message - */ - public function SetFrom(\MailSo\Mime\Email $oEmail) - { - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::FROM_] = $oEmail; - - return $this; - } - - /** - * @param \MailSo\Mime\EmailCollection $oEmails - * - * @return \MailSo\Mime\Message - */ - public function SetTo(\MailSo\Mime\EmailCollection $oEmails) - { - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::TO_] = $oEmails; - - return $this; - } - - /** - * @param int $iDateTime - * - * @return \MailSo\Mime\Message - */ - public function SetDate($iDateTime) - { - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::DATE] = gmdate('r', $iDateTime); - - return $this; - } - - /** - * @param \MailSo\Mime\EmailCollection $oEmails - * - * @return \MailSo\Mime\Message - */ - public function SetReplyTo(\MailSo\Mime\EmailCollection $oEmails) - { - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::REPLY_TO] = $oEmails; - - return $this; - } - - /** - * @param \MailSo\Mime\EmailCollection $oEmails - * - * @return \MailSo\Mime\Message - */ - public function SetCc(\MailSo\Mime\EmailCollection $oEmails) - { - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::CC] = $oEmails; - - return $this; - } - - /** - * @param \MailSo\Mime\EmailCollection $oEmails - * - * @return \MailSo\Mime\Message - */ - public function SetBcc(\MailSo\Mime\EmailCollection $oEmails) - { - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC] = $oEmails; - - return $this; - } - - /** - * @param \MailSo\Mime\EmailCollection $oEmails - * - * @return \MailSo\Mime\Message - */ - public function SetSender(\MailSo\Mime\EmailCollection $oEmails) - { - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::SENDER] = $oEmails; - - return $this; - } - - /** - * @param string $sType - * @param string $sUid - * @param string $sFolder - * - * @return \MailSo\Mime\Message - */ - public function SetDraftInfo($sType, $sUid, $sFolder) - { - $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::X_DRAFT_INFO] = \MailSo\Mime\ParameterCollection::NewInstance() - ->Add(\MailSo\Mime\Parameter::NewInstance('type', $sType)) - ->Add(\MailSo\Mime\Parameter::NewInstance('uid', $sUid)) - ->Add(\MailSo\Mime\Parameter::NewInstance('folder', base64_encode($sFolder))) - ; - - return $this; - } - - /** - * @param string $sPlain - * - * @return \MailSo\Mime\Message - */ - public function AddPlain($sPlain) - { - return $this->AddAlternative( - \MailSo\Mime\Enumerations\MimeType::TEXT_PLAIN, trim($sPlain), - \MailSo\Base\Enumerations\Encoding::QUOTED_PRINTABLE_LOWER); - } - /** - * @param string $sHtml - * - * @return \MailSo\Mime\Message - */ - public function AddHtml($sHtml) - { - return $this->AddAlternative( - \MailSo\Mime\Enumerations\MimeType::TEXT_HTML, trim($sHtml), - \MailSo\Base\Enumerations\Encoding::QUOTED_PRINTABLE_LOWER); - } - - /** - * @param string $sHtmlOrPlainText - * @param bool $bIsHtml = false - * - * @return \MailSo\Mime\Message - */ - public function AddText($sHtmlOrPlainText, $bIsHtml = false) - { - return $bIsHtml ? $this->AddHtml($sHtmlOrPlainText) : $this->AddPlain($sHtmlOrPlainText); - } - - /** - * @param string $sContentType - * @param string|resource $mData - * @param string $sContentTransferEncoding = '' - * @param array $aCustomContentTypeParams = array() - * - * @return \MailSo\Mime\Message - */ - public function AddAlternative($sContentType, $mData, $sContentTransferEncoding = '', $aCustomContentTypeParams = array()) - { - $this->aAlternativeParts[] = array($sContentType, $mData, $sContentTransferEncoding, $aCustomContentTypeParams); - - return $this; - } - - /** - * @return string - */ - private function generateNewBoundary() - { - return '--='.\MailSo\Config::$BoundaryPrefix. - \rand(100, 999).'_'.rand(100000000, 999999999).'.'.\time(); - } - - /** - * @param string $sHostName = '' - * - * @return string - */ - private function generateNewMessageId($sHostName = '') - { - if (0 === \strlen($sHostName)) - { - $sHostName = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : ''; - } - - if (empty($sHostName) && \MailSo\Base\Utils::FunctionExistsAndEnabled('php_uname')) - { - $sHostName = \php_uname('n'); - } - - if (empty($sHostName)) - { - $sHostName = 'localhost'; - } - - return '<'. - \MailSo\Base\Utils::Md5Rand($sHostName. - (\MailSo\Base\Utils::FunctionExistsAndEnabled('getmypid') ? @\getmypid() : '')).'@'.$sHostName.'>'; - } - - /** - * @param \MailSo\Mime\Attachment $oAttachment - * - * @return \MailSo\Mime\Part - */ - private function createNewMessageAttachmentBody($oAttachment) - { - $oAttachmentPart = Part::NewInstance(); - - $sFileName = $oAttachment->FileName(); - $sCID = $oAttachment->CID(); - $sContentLocation = $oAttachment->ContentLocation(); - - $oContentTypeParameters = null; - $oContentDispositionParameters = null; - - if (0 < strlen(trim($sFileName))) - { - $oContentTypeParameters = - ParameterCollection::NewInstance()->Add(Parameter::NewInstance( - \MailSo\Mime\Enumerations\Parameter::NAME, $sFileName)); - - $oContentDispositionParameters = - ParameterCollection::NewInstance()->Add(Parameter::NewInstance( - \MailSo\Mime\Enumerations\Parameter::FILENAME, $sFileName)); - } - - $oAttachmentPart->Headers->Add( - Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE, - $oAttachment->ContentType().';'. - (($oContentTypeParameters) ? ' '.$oContentTypeParameters->ToString() : '') - ) - ); - - $oAttachmentPart->Headers->Add( - Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_DISPOSITION, - ($oAttachment->IsInline() ? 'inline' : 'attachment').';'. - (($oContentDispositionParameters) ? ' '.$oContentDispositionParameters->ToString() : '') - ) - ); - - if (0 < strlen($sCID)) - { - $oAttachmentPart->Headers->Add( - Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_ID, $sCID) - ); - } - - if (0 < strlen($sContentLocation)) - { - $oAttachmentPart->Headers->Add( - Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_LOCATION, $sContentLocation) - ); - } - - $oAttachmentPart->Body = $oAttachment->Resource(); - - if ('message/rfc822' !== strtolower($oAttachment->ContentType())) - { - $oAttachmentPart->Headers->Add( - Header::NewInstance( - \MailSo\Mime\Enumerations\Header::CONTENT_TRANSFER_ENCODING, - \MailSo\Base\Enumerations\Encoding::BASE64_LOWER - ) - ); - - if (is_resource($oAttachmentPart->Body)) - { - if (!\MailSo\Base\StreamWrappers\Binary::IsStreamRemembed($oAttachmentPart->Body)) - { - $oAttachmentPart->Body = - \MailSo\Base\StreamWrappers\Binary::CreateStream($oAttachmentPart->Body, - \MailSo\Base\StreamWrappers\Binary::GetInlineDecodeOrEncodeFunctionName( - \MailSo\Base\Enumerations\Encoding::BASE64, false)); - - \MailSo\Base\StreamWrappers\Binary::RememberStream($oAttachmentPart->Body); - } - } - } - - return $oAttachmentPart; - } - - /** - * @param array $aAlternativeData - * - * @return \MailSo\Mime\Part - */ - private function createNewMessageAlternativePartBody($aAlternativeData) - { - $oAlternativePart = null; - - if (is_array($aAlternativeData) && isset($aAlternativeData[0])) - { - $oAlternativePart = Part::NewInstance(); - $oParameters = ParameterCollection::NewInstance(); - $oParameters->Add( - Parameter::NewInstance( - \MailSo\Mime\Enumerations\Parameter::CHARSET, - \MailSo\Base\Enumerations\Charset::UTF_8) - ); - - if (isset($aAlternativeData[3]) && \is_array($aAlternativeData[3]) && 0 < \count($aAlternativeData[3])) - { - foreach ($aAlternativeData[3] as $sName => $sValue) - { - $oParameters->Add(Parameter::NewInstance($sName, $sValue)); - } - } - - $oAlternativePart->Headers->Add( - Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE, - $aAlternativeData[0].'; '.$oParameters->ToString()) - ); - - $oAlternativePart->Body = null; - if (isset($aAlternativeData[1])) - { - if (is_resource($aAlternativeData[1])) - { - $oAlternativePart->Body = $aAlternativeData[1]; - } - else if (is_string($aAlternativeData[1]) && 0 < strlen($aAlternativeData[1])) - { - $oAlternativePart->Body = - \MailSo\Base\ResourceRegistry::CreateMemoryResourceFromString($aAlternativeData[1]); - } - } - - if (isset($aAlternativeData[2]) && 0 < strlen($aAlternativeData[2])) - { - $oAlternativePart->Headers->Add( - Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_TRANSFER_ENCODING, - $aAlternativeData[2] - ) - ); - - if (is_resource($oAlternativePart->Body)) - { - if (!\MailSo\Base\StreamWrappers\Binary::IsStreamRemembed($oAlternativePart->Body)) - { - $oAlternativePart->Body = - \MailSo\Base\StreamWrappers\Binary::CreateStream($oAlternativePart->Body, - \MailSo\Base\StreamWrappers\Binary::GetInlineDecodeOrEncodeFunctionName( - $aAlternativeData[2], false)); - - \MailSo\Base\StreamWrappers\Binary::RememberStream($oAlternativePart->Body); - } - } - } - - if (!is_resource($oAlternativePart->Body)) - { - $oAlternativePart->Body = - \MailSo\Base\ResourceRegistry::CreateMemoryResourceFromString(''); - } - } - - return $oAlternativePart; - } - - /** - * @param \MailSo\Mime\Part $oPlainPart - * @param \MailSo\Mime\Part $oHtmlPart - * - * @return \MailSo\Mime\Part - */ - private function createNewMessageSimpleOrAlternativeBody() - { - $oResultPart = null; - if (1 < count($this->aAlternativeParts)) - { - $oResultPart = Part::NewInstance(); - - $oResultPart->Headers->Add( - Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE, - \MailSo\Mime\Enumerations\MimeType::MULTIPART_ALTERNATIVE.'; '. - ParameterCollection::NewInstance()->Add( - Parameter::NewInstance( - \MailSo\Mime\Enumerations\Parameter::BOUNDARY, - $this->generateNewBoundary()) - )->ToString() - ) - ); - - foreach ($this->aAlternativeParts as $aAlternativeData) - { - $oAlternativePart = $this->createNewMessageAlternativePartBody($aAlternativeData); - if ($oAlternativePart) - { - $oResultPart->SubParts->Add($oAlternativePart); - } - - unset($oAlternativePart); - } - - } - else if (1 === count($this->aAlternativeParts)) - { - $oAlternativePart = $this->createNewMessageAlternativePartBody($this->aAlternativeParts[0]); - if ($oAlternativePart) - { - $oResultPart = $oAlternativePart; - } - } - - if (!$oResultPart) - { - if ($this->bAddEmptyTextPart) - { - $oResultPart = $this->createNewMessageAlternativePartBody(array( - \MailSo\Mime\Enumerations\MimeType::TEXT_PLAIN, null - )); - } - else - { - $aAttachments = $this->oAttachmentCollection->CloneAsArray(); - if (\is_array($aAttachments) && 1 === count($aAttachments) && isset($aAttachments[0])) - { - $this->oAttachmentCollection->Clear(); - - $oResultPart = $this->createNewMessageAlternativePartBody(array( - $aAttachments[0]->ContentType(), $aAttachments[0]->Resource(), - '', $aAttachments[0]->CustomContentTypeParams() - )); - } - } - } - - return $oResultPart; - } - - /** - * @param \MailSo\Mime\Part $oIncPart - * - * @return \MailSo\Mime\Part - */ - private function createNewMessageRelatedBody($oIncPart) - { - $oResultPart = null; - - $aAttachments = $this->oAttachmentCollection->LinkedAttachments(); - if (0 < count($aAttachments)) - { - $oResultPart = Part::NewInstance(); - - $oResultPart->Headers->Add( - Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE, - \MailSo\Mime\Enumerations\MimeType::MULTIPART_RELATED.'; '. - ParameterCollection::NewInstance()->Add( - Parameter::NewInstance( - \MailSo\Mime\Enumerations\Parameter::BOUNDARY, - $this->generateNewBoundary()) - )->ToString() - ) - ); - - $oResultPart->SubParts->Add($oIncPart); - - foreach ($aAttachments as $oAttachment) - { - $oResultPart->SubParts->Add($this->createNewMessageAttachmentBody($oAttachment)); - } - } - else - { - $oResultPart = $oIncPart; - } - - return $oResultPart; - } - - /** - * @param \MailSo\Mime\Part $oIncPart - * - * @return \MailSo\Mime\Part - */ - private function createNewMessageMixedBody($oIncPart) - { - $oResultPart = null; - - $aAttachments = $this->oAttachmentCollection->UnlinkedAttachments(); - if (0 < count($aAttachments)) - { - $oResultPart = Part::NewInstance(); - - $oResultPart->Headers->AddByName(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE, - \MailSo\Mime\Enumerations\MimeType::MULTIPART_MIXED.'; '. - ParameterCollection::NewInstance()->Add( - Parameter::NewInstance( - \MailSo\Mime\Enumerations\Parameter::BOUNDARY, - $this->generateNewBoundary()) - )->ToString() - ); - - $oResultPart->SubParts->Add($oIncPart); - - foreach ($aAttachments as $oAttachment) - { - $oResultPart->SubParts->Add($this->createNewMessageAttachmentBody($oAttachment)); - } - } - else - { - $oResultPart = $oIncPart; - } - - return $oResultPart; - } - - /** - * @param \MailSo\Mime\Part $oIncPart - * @param bool $bWithoutBcc = false - * - * @return \MailSo\Mime\Part - */ - private function setDefaultHeaders($oIncPart, $bWithoutBcc = false) - { - if (!isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::DATE])) - { - $oIncPart->Headers->SetByName(\MailSo\Mime\Enumerations\Header::DATE, \gmdate('r'), true); - } - - if (!isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::MESSAGE_ID])) - { - $oIncPart->Headers->SetByName(\MailSo\Mime\Enumerations\Header::MESSAGE_ID, $this->generateNewMessageId(), true); - } - - if (!isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::X_MAILER]) && $this->bAddDefaultXMailer) - { - $oIncPart->Headers->SetByName(\MailSo\Mime\Enumerations\Header::X_MAILER, \MailSo\Version::XMailer(), true); - } - - if (!isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::MIME_VERSION])) - { - $oIncPart->Headers->SetByName(\MailSo\Mime\Enumerations\Header::MIME_VERSION, '1.0', true); - } - - foreach ($this->aHeadersValue as $sName => $mValue) - { - if (\is_object($mValue)) - { - if ($mValue instanceof \MailSo\Mime\EmailCollection || $mValue instanceof \MailSo\Mime\Email || - $mValue instanceof \MailSo\Mime\ParameterCollection) - { - $mValue = $mValue->ToString(); - } - } - - if (!($bWithoutBcc && \strtolower(\MailSo\Mime\Enumerations\Header::BCC) === \strtolower($sName))) - { - $oIncPart->Headers->SetByName($sName, (string) $mValue); - } - } - - return $oIncPart; - } - - /** - * @param bool $bWithoutBcc = false - * - * @return \MailSo\Mime\Part - */ - public function ToPart($bWithoutBcc = false) - { - $oPart = $this->createNewMessageSimpleOrAlternativeBody(); - $oPart = $this->createNewMessageRelatedBody($oPart); - $oPart = $this->createNewMessageMixedBody($oPart); - $oPart = $this->setDefaultHeaders($oPart, $bWithoutBcc); - - return $oPart; - } - - /** - * @param bool $bWithoutBcc = false - * - * @return resource - */ - public function ToStream($bWithoutBcc = false) - { - return $this->ToPart($bWithoutBcc)->ToStream(); - } - - /** - * @param bool $bWithoutBcc = false - * - * @return string - */ - public function ToString($bWithoutBcc = false) - { - return \stream_get_contents($this->ToStream($bWithoutBcc)); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Parameter.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Parameter.php deleted file mode 100755 index 487a256e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Parameter.php +++ /dev/null @@ -1,141 +0,0 @@ -sName = $sName; - $this->sValue = $sValue; - } - - /** - * @param string $sName - * @param string $sValue = '' - * - * @return \MailSo\Mime\Parameter - */ - public static function NewInstance($sName, $sValue = '') - { - return new self($sName, $sValue); - } - - /** - * @param string $sName - * @param string $sValue = '' - * - * @return \MailSo\Mime\Parameter - */ - public static function CreateFromParameterLine($sRawParam) - { - $oParameter = self::NewInstance(''); - return $oParameter->Parse($sRawParam); - } - - /** - * @return \MailSo\Mime\Parameter - */ - public function Reset() - { - $this->sName = ''; - $this->sValue = ''; - - return $this; - } - - /** - * @return string - */ - public function Name() - { - return $this->sName; - } - - /** - * @return string - */ - public function Value() - { - return $this->sValue; - } - - /** - * @param string $sRawParam - * @param string $sSeparator = '=' - * - * @return \MailSo\Mime\Parameter - */ - public function Parse($sRawParam, $sSeparator = '=') - { - $this->Reset(); - - $aParts = explode($sSeparator, $sRawParam, 2); - - $this->sName = trim(trim($aParts[0]), '"\''); - if (2 === count($aParts)) - { - $this->sValue = trim(trim($aParts[1]), '"\''); - } - - return $this; - } - - /** - * @param bool $bConvertSpecialsName = false - * - * @return string - */ - public function ToString($bConvertSpecialsName = false) - { - $sResult = ''; - if (0 < strlen($this->sName)) - { - $sResult = $this->sName.'='; - if ($bConvertSpecialsName && in_array(strtolower($this->sName), array( - strtolower(\MailSo\Mime\Enumerations\Parameter::NAME), - strtolower(\MailSo\Mime\Enumerations\Parameter::FILENAME) - ))) - { - $sResult .= '"'.\MailSo\Base\Utils::EncodeUnencodedValue( - \MailSo\Base\Enumerations\Encoding::BASE64_SHORT, - $this->sValue).'"'; - } - else - { - $sResult .= '"'.$this->sValue.'"'; - } - } - - return $sResult; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/ParameterCollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/ParameterCollection.php deleted file mode 100755 index 52b7dd37..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/ParameterCollection.php +++ /dev/null @@ -1,213 +0,0 @@ -Parse($sRawParams); - } - } - - /** - * @param string $sRawParams = '' - * - * @return \MailSo\Mime\ParameterCollection - */ - public static function NewInstance($sRawParams = '') - { - return new self($sRawParams); - } - - /** - * @return \MailSo\Mime\Parameter|null - */ - public function &GetByIndex($iIndex) - { - $mResult = null; - $mResult =& parent::GetByIndex($iIndex); - return $mResult; - } - - /** - * @param array $aList - * - * @return \MailSo\Mime\ParameterCollection - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public function SetAsArray($aList) - { - parent::SetAsArray($aList); - - return $this; - } - - /** - * @param string $sName - * - * @return string - */ - public function ParameterValueByName($sName) - { - $sResult = ''; - $sName = \trim($sName); - - $aParams =& $this->GetAsArray(); - foreach ($aParams as /* @var $oParam \MailSo\Mime\ParameterCollection */ $oParam) - { - if (\strtolower($sName) === \strtolower($oParam->Name())) - { - $sResult = $oParam->Value(); - break; - } - } - - return $sResult; - } - - /** - * @param string $sRawParams - * - * @return \MailSo\Mime\ParameterCollection - */ - public function Parse($sRawParams) - { - $this->Clear(); - - $aDataToParse = \explode(';', $sRawParams); - - foreach ($aDataToParse as $sParam) - { - $this->Add(Parameter::CreateFromParameterLine($sParam)); - } - - $this->reParseParameters(); - - return $this; - } - - /** - * @param bool $bConvertSpecialsName = false - * - * @return string - */ - public function ToString($bConvertSpecialsName = false) - { - $aResult = array(); - $aParams =& $this->GetAsArray(); - foreach ($aParams as /* @var $oParam \MailSo\Mime\Parameter */ $oParam) - { - $sLine = $oParam->ToString($bConvertSpecialsName); - if (0 < \strlen($sLine)) - { - $aResult[] = $sLine; - } - } - - return 0 < \count($aResult) ? \implode('; ', $aResult) : ''; - } - - /** - * @return void - */ - private function reParseParameters() - { - $aDataToReParse = $this->CloneAsArray(); - $sCharset = \MailSo\Base\Enumerations\Charset::UTF_8; - - $this->Clear(); - - $aPreParams = array(); - foreach ($aDataToReParse as /* @var $oParam \MailSo\Mime\Parameter */ $oParam) - { - $aMatch = array(); - $sParamName = $oParam->Name(); - - if (\preg_match('/([^\*]+)\*([\d]{1,2})\*/', $sParamName, $aMatch) && isset($aMatch[1], $aMatch[2]) - && 0 < \strlen($aMatch[1]) && \is_numeric($aMatch[2])) - { - if (!isset($aPreParams[$aMatch[1]])) - { - $aPreParams[$aMatch[1]] = array(); - } - - $sValue = $oParam->Value(); - - if (false !== \strpos($sValue, "''")) - { - $aValueParts = \explode("''", $sValue, 2); - if (\is_array($aValueParts) && 2 === \count($aValueParts) && 0 < \strlen($aValueParts[1])) - { - $sCharset = $aValueParts[0]; - $sValue = $aValueParts[1]; - } - } - - $aPreParams[$aMatch[1]][(int) $aMatch[2]] = $sValue; - } - else if (\preg_match('/([^\*]+)\*/', $sParamName, $aMatch) && isset($aMatch[1])) - { - if (!isset($aPreParams[$aMatch[1]])) - { - $aPreParams[$aMatch[1]] = array(); - } - - $sValue = $oParam->Value(); - if (false !== \strpos($sValue, "''")) - { - $aValueParts = \explode("''", $sValue, 2); - if (\is_array($aValueParts) && 2 === \count($aValueParts) && 0 < \strlen($aValueParts[1])) - { - $sCharset = $aValueParts[0]; - $sValue = $aValueParts[1]; - } - } - - $aPreParams[$aMatch[1]][0] = $sValue; - } - else - { - $this->Add($oParam); - } - } - - foreach ($aPreParams as $sName => $aValues) - { - ksort($aValues); - $sResult = \implode(\array_values($aValues)); - $sResult = \urldecode($sResult); - - if (0 < \strlen($sCharset)) - { - $sResult = \MailSo\Base\Utils::ConvertEncoding($sResult, - $sCharset, \MailSo\Base\Enumerations\Charset::UTF_8); - } - - $this->Add(Parameter::NewInstance($sName, $sResult)); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Parser/ParserEmpty.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Parser/ParserEmpty.php deleted file mode 100755 index 2349ade7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Parser/ParserEmpty.php +++ /dev/null @@ -1,81 +0,0 @@ -oCurrentMime = $oPart; - } - - /** - * @param string $sBuffer - * - * @return void - */ - public function WriteBody($sBuffer) - { - if (null === $this->oCurrentMime->Body) - { - $this->oCurrentMime->Body = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); - } - - if (\is_resource($this->oCurrentMime->Body)) - { - \fwrite($this->oCurrentMime->Body, $sBuffer); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Part.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Part.php deleted file mode 100755 index 2e19af03..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/Part.php +++ /dev/null @@ -1,665 +0,0 @@ -iParseBuffer = \MailSo\Mime\Part::DEFAUL_BUFFER; - $this->Reset(); - } - - /** - * @return \MailSo\Mime\Part - */ - public static function NewInstance() - { - return new self(); - } - - /** - * @return \MailSo\Mime\Part - */ - public function Reset() - { - \MailSo\Base\ResourceRegistry::CloseMemoryResource($this->Body); - $this->Body = null; - - $this->Headers = HeaderCollection::NewInstance(); - $this->SubParts = PartCollection::NewInstance(); - $this->LineParts = array(); - $this->sBoundary = ''; - $this->sParentCharset = \MailSo\Base\Enumerations\Charset::ISO_8859_1; - - return $this; - } - - /** - * @return string - */ - public function Boundary() - { - return $this->sBoundary; - } - - /** - * @return string - */ - public function ParentCharset() - { - return (0 < \strlen($this->sCharset)) ? $this->sParentCharset : self::$DefaultCharset; - } - - /** - * @param string $sParentCharset - * @return \MailSo\Mime\Part - */ - public function SetParentCharset($sParentCharset) - { - $this->sParentCharset = $sParentCharset; - - return $this; - } - - /** - * @param string $sBoundary - * @return \MailSo\Mime\Part - */ - public function SetBoundary($sBoundary) - { - $this->sBoundary = $sBoundary; - - return $this; - } - - /** - * @param int $iParseBuffer - * @return \MailSo\Mime\Part - */ - public function SetParseBuffer($iParseBuffer) - { - $this->iParseBuffer = $iParseBuffer; - - return $this; - } - - /** - * @return string - */ - public function HeaderCharset() - { - return ($this->Headers) ? trim(strtolower($this->Headers->ParameterValue( - \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, - \MailSo\Mime\Enumerations\Parameter::CHARSET))) : ''; - } - - /** - * @return string - */ - public function HeaderBoundary() - { - return ($this->Headers) ? trim($this->Headers->ParameterValue( - \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, - \MailSo\Mime\Enumerations\Parameter::BOUNDARY)) : ''; - } - - /** - * @return string - */ - public function ContentType() - { - return ($this->Headers) ? - trim(strtolower($this->Headers->ValueByName( - \MailSo\Mime\Enumerations\Header::CONTENT_TYPE))) : ''; - } - - /** - * @return string - */ - public function ContentTransferEncoding() - { - return ($this->Headers) ? - trim(strtolower($this->Headers->ValueByName( - \MailSo\Mime\Enumerations\Header::CONTENT_TRANSFER_ENCODING))) : ''; - } - - /** - * @return string - */ - public function ContentID() - { - return ($this->Headers) ? trim($this->Headers->ValueByName( - \MailSo\Mime\Enumerations\Header::CONTENT_ID)) : ''; - } - - /** - * @return string - */ - public function ContentLocation() - { - return ($this->Headers) ? trim($this->Headers->ValueByName( - \MailSo\Mime\Enumerations\Header::CONTENT_LOCATION)) : ''; - } - - /** - * @return bool - */ - public function IsFlowedFormat() - { - $bResult = false; - if ($this->Headers) - { - $bResult = 'flowed' === \trim(\strtolower($this->Headers->ParameterValue( - \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, - \MailSo\Mime\Enumerations\Parameter::FORMAT))); - - if ($bResult && \in_array(\strtolower($this->MailEncodingName()), array('base64', 'quoted-printable'))) - { - $bResult = false; - } - } - - return $bResult; - } - - /** - * @return string - */ - public function FileName() - { - $sResult = ''; - if ($this->Headers) - { - $sResult = trim($this->Headers->ParameterValue( - \MailSo\Mime\Enumerations\Header::CONTENT_DISPOSITION, - \MailSo\Mime\Enumerations\Parameter::FILENAME)); - - if (0 === strlen($sResult)) - { - $sResult = trim($this->Headers->ParameterValue( - \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, - \MailSo\Mime\Enumerations\Parameter::NAME)); - } - } - - return $sResult; - } - - /** - * @param string $sFileName - * @return \MailSo\Mime\Part - */ - public function ParseFromFile($sFileName) - { - $rStreamHandle = (@file_exists($sFileName)) ? @fopen($sFileName, 'rb') : false; - if (is_resource($rStreamHandle)) - { - $this->ParseFromStream($rStreamHandle); - - if (is_resource($rStreamHandle)) - { - fclose($rStreamHandle); - } - } - - return $this; - } - - /** - * @param string $sRawMessage - * @return \MailSo\Mime\Part - */ - public function ParseFromString($sRawMessage) - { - $rStreamHandle = (0 < strlen($sRawMessage)) ? - \MailSo\Base\ResourceRegistry::CreateMemoryResource() : false; - - if (is_resource($rStreamHandle)) - { - fwrite($rStreamHandle, $sRawMessage); - unset($sRawMessage); - fseek($rStreamHandle, 0); - - $this->ParseFromStream($rStreamHandle); - - \MailSo\Base\ResourceRegistry::CloseMemoryResource($rStreamHandle); - } - - return $this; - } - - /** - * @param resource $rStreamHandle - * @return \MailSo\Mime\Part - */ - public function ParseFromStream($rStreamHandle) - { - $this->Reset(); - - $oParserClass = new \MailSo\Mime\Parser\ParserMemory(); - - $oMimePart = null; - $bIsOef = false; - $iOffset = 0; - $sBuffer = ''; - $sPrevBuffer = ''; - $aBoundaryStack = array(); - - - $oParserClass->StartParse($this); - - $this->LineParts[] =& $this; - $this->ParseFromStreamRecursion($rStreamHandle, $oParserClass, $iOffset, - $sPrevBuffer, $sBuffer, $aBoundaryStack, $bIsOef); - - $sFirstNotNullCharset = null; - foreach ($this->LineParts as /* @var $oMimePart \MailSo\Mime\Part */ &$oMimePart) - { - $sCharset = $oMimePart->HeaderCharset(); - if (0 < strlen($sCharset)) - { - $sFirstNotNullCharset = $sCharset; - break; - } - } - - $sForceCharset = self::$ForceCharset; - if (0 < strlen($sForceCharset)) - { - foreach ($this->LineParts as /* @var $oMimePart \MailSo\Mime\Part */ &$oMimePart) - { - $oMimePart->SetParentCharset($sForceCharset); - $oMimePart->Headers->SetParentCharset($sForceCharset); - } - } - else - { - $sFirstNotNullCharset = (null !== $sFirstNotNullCharset) - ? $sFirstNotNullCharset : self::$DefaultCharset; - - foreach ($this->LineParts as /* @var $oMimePart \MailSo\Mime\Part */ &$oMimePart) - { - $sHeaderCharset = $oMimePart->HeaderCharset(); - $oMimePart->SetParentCharset((0 < strlen($sHeaderCharset)) ? $sHeaderCharset : $sFirstNotNullCharset); - $oMimePart->Headers->SetParentCharset($sHeaderCharset); - } - } - - $oParserClass->EndParse($this); - - return $this; - } - - /** - * @param resource $rStreamHandle - * @return \MailSo\Mime\Part - */ - public function ParseFromStreamRecursion($rStreamHandle, &$oCallbackClass, &$iOffset, - &$sPrevBuffer, &$sBuffer, &$aBoundaryStack, &$bIsOef, $bNotFirstRead = false) - { - $oCallbackClass->StartParseMimePart($this); - - $iPos = 0; - $iParsePosition = self::POS_HEADERS; - $sCurrentBoundary = ''; - $bIsBoundaryCheck = false; - $aHeadersLines = array(); - while (true) - { - if (!$bNotFirstRead) - { - $sPrevBuffer = $sBuffer; - $sBuffer = ''; - } - - if (!$bIsOef && !feof($rStreamHandle)) - { - if (!$bNotFirstRead) - { - $sBuffer = @fread($rStreamHandle, $this->iParseBuffer); - if (false === $sBuffer) - { - break; - } - - $oCallbackClass->ReadBuffer($sBuffer); - } - else - { - $bNotFirstRead = false; - } - } - else if ($bIsOef && 0 === strlen($sBuffer)) - { - break; - } - else - { - $bIsOef = true; - } - - while (true) - { - $sCurrentLine = $sPrevBuffer.$sBuffer; - if (self::POS_HEADERS === $iParsePosition) - { - $iEndLen = 4; - $iPos = strpos($sCurrentLine, "\r\n\r\n", $iOffset); - if (false === $iPos) - { - $iEndLen = 2; - $iPos = strpos($sCurrentLine, "\n\n", $iOffset); - } - - if (false !== $iPos) - { - $aHeadersLines[] = substr($sCurrentLine, $iOffset, $iPos + $iEndLen - $iOffset); - - $this->Headers->Parse(implode($aHeadersLines))->SetParentCharset($this->HeaderCharset()); - $aHeadersLines = array(); - - $oCallbackClass->InitMimePartHeader(); - - $sBoundary = $this->HeaderBoundary(); - if (0 < strlen($sBoundary)) - { - $sBoundary = '--'.$sBoundary; - $sCurrentBoundary = $sBoundary; - array_unshift($aBoundaryStack, $sBoundary); - } - - $iOffset = $iPos + $iEndLen; - $iParsePosition = self::POS_BODY; - continue; - } - else - { - $iBufferLen = strlen($sPrevBuffer); - if ($iBufferLen > $iOffset) - { - $aHeadersLines[] = substr($sPrevBuffer, $iOffset); - $iOffset = 0; - } - else - { - $iOffset -= $iBufferLen; - } - break; - } - } - else if (self::POS_BODY === $iParsePosition) - { - $iPos = false; - $sBoundaryLen = 0; - $bIsBoundaryEnd = false; - $bCurrentPartBody = false; - $bIsBoundaryCheck = 0 < count($aBoundaryStack); - - foreach ($aBoundaryStack as $sKey => $sBoundary) - { - if (false !== ($iPos = strpos($sCurrentLine, $sBoundary, $iOffset))) - { - if ($sCurrentBoundary === $sBoundary) - { - $bCurrentPartBody = true; - } - - $sBoundaryLen = strlen($sBoundary); - if ('--' === substr($sCurrentLine, $iPos + $sBoundaryLen, 2)) - { - $sBoundaryLen += 2; - $bIsBoundaryEnd = true; - unset($aBoundaryStack[$sKey]); - $sCurrentBoundary = (isset($aBoundaryStack[$sKey + 1])) - ? $aBoundaryStack[$sKey + 1] : ''; - } - - break; - } - } - - if (false !== $iPos) - { - $oCallbackClass->WriteBody(substr($sCurrentLine, $iOffset, $iPos - $iOffset)); - $iOffset = $iPos; - - if ($bCurrentPartBody) - { - $iParsePosition = self::POS_SUBPARTS; - continue; - } - - $oCallbackClass->EndParseMimePart($this); - return true; - } - else - { - $iBufferLen = strlen($sPrevBuffer); - if ($iBufferLen > $iOffset) - { - $oCallbackClass->WriteBody(substr($sPrevBuffer, $iOffset)); - $iOffset = 0; - } - else - { - $iOffset -= $iBufferLen; - } - break; - } - } - else if (self::POS_SUBPARTS === $iParsePosition) - { - $iPos = false; - $sBoundaryLen = 0; - $bIsBoundaryEnd = false; - $bCurrentPartBody = false; - $bIsBoundaryCheck = 0 < count($aBoundaryStack); - - foreach ($aBoundaryStack as $sKey => $sBoundary) - { - if (false !== ($iPos = strpos($sCurrentLine, $sBoundary, $iOffset))) - { - if ($sCurrentBoundary === $sBoundary) - { - $bCurrentPartBody = true; - } - - $sBoundaryLen = strlen($sBoundary); - if ('--' === substr($sCurrentLine, $iPos + $sBoundaryLen, 2)) - { - $sBoundaryLen += 2; - $bIsBoundaryEnd = true; - unset($aBoundaryStack[$sKey]); - $sCurrentBoundary = (isset($aBoundaryStack[$sKey + 1])) - ? $aBoundaryStack[$sKey + 1] : ''; - } - break; - } - } - - if (false !== $iPos && $bCurrentPartBody) - { - $iOffset = $iPos + $sBoundaryLen; - - $oSubPart = self::NewInstance(); - - $oSubPart - ->SetParseBuffer($this->iParseBuffer) - ->ParseFromStreamRecursion($rStreamHandle, $oCallbackClass, - $iOffset, $sPrevBuffer, $sBuffer, $aBoundaryStack, $bIsOef, true); - - $this->SubParts->Add($oSubPart); - $this->LineParts[] =& $oSubPart; - //$iParsePosition = self::POS_HEADERS; - unset($oSubPart); - } - else - { - $oCallbackClass->EndParseMimePart($this); - return true; - } - } - } - } - - if (0 < strlen($sPrevBuffer)) - { - if (self::POS_HEADERS === $iParsePosition) - { - $aHeadersLines[] = ($iOffset < strlen($sPrevBuffer)) - ? substr($sPrevBuffer, $iOffset) - : $sPrevBuffer; - - $this->Headers->Parse(implode($aHeadersLines))->SetParentCharset($this->HeaderCharset()); - $aHeadersLines = array(); - - $oCallbackClass->InitMimePartHeader(); - } - else if (self::POS_BODY === $iParsePosition) - { - if (!$bIsBoundaryCheck) - { - $oCallbackClass->WriteBody(($iOffset < strlen($sPrevBuffer)) - ? substr($sPrevBuffer, $iOffset) : $sPrevBuffer); - } - } - } - else - { - if (self::POS_HEADERS === $iParsePosition && 0 < count($aHeadersLines)) - { - $this->Headers->Parse(implode($aHeadersLines))->SetParentCharset($this->HeaderCharset()); - $aHeadersLines = array(); - - $oCallbackClass->InitMimePartHeader(); - } - } - - $oCallbackClass->EndParseMimePart($this); - - return $this; - } - - /** - * @return resorce - */ - public function Rewind() - { - if ($this->Body && \is_resource($this->Body)) - { - $aMeta = \stream_get_meta_data($this->Body); - if (isset($aMeta['seekable']) && $aMeta['seekable']) - { - \rewind($this->Body); - } - } - } - - /** - * @return resorce - */ - public function ToStream() - { - $this->Rewind(); - - $aSubStreams = array( - - $this->Headers->ToEncodedString(). - \MailSo\Mime\Enumerations\Constants::CRLF. - \MailSo\Mime\Enumerations\Constants::CRLF, - - null === $this->Body ? '' : $this->Body, - - \MailSo\Mime\Enumerations\Constants::CRLF - ); - - if (0 < $this->SubParts->Count()) - { - $sBoundary = $this->HeaderBoundary(); - if (0 < strlen($sBoundary)) - { - $aSubStreams[] = '--'.$sBoundary.\MailSo\Mime\Enumerations\Constants::CRLF; - - $rSubPartsStream = $this->SubParts->ToStream($sBoundary); - if (is_resource($rSubPartsStream)) - { - $aSubStreams[] = $rSubPartsStream; - } - - $aSubStreams[] = \MailSo\Mime\Enumerations\Constants::CRLF. - '--'.$sBoundary.'--'.\MailSo\Mime\Enumerations\Constants::CRLF; - } - } - - return \MailSo\Base\StreamWrappers\SubStreams::CreateStream($aSubStreams); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/PartCollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/PartCollection.php deleted file mode 100755 index d3c53ca6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Mime/PartCollection.php +++ /dev/null @@ -1,65 +0,0 @@ -GetAsArray(); - foreach ($aParts as /* @var $oPart \MailSo\Mime\Part */ &$oPart) - { - if (0 < count($aResult)) - { - $aResult[] = \MailSo\Mime\Enumerations\Constants::CRLF. - '--'.$sBoundary.\MailSo\Mime\Enumerations\Constants::CRLF; - } - - $aResult[] = $oPart->ToStream(); - } - - return \MailSo\Base\StreamWrappers\SubStreams::CreateStream($aResult); - } - - return $rResult; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Enumerations/ConnectionSecurityType.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Enumerations/ConnectionSecurityType.php deleted file mode 100755 index fed485db..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Enumerations/ConnectionSecurityType.php +++ /dev/null @@ -1,70 +0,0 @@ -sSocketMessage = $sSocketMessage; - $this->iSocketCode = $iSocketCode; - } - - /** - * @return string - */ - public function getSocketMessage() - { - return $this->sSocketMessage; - } - - /** - * @return int - */ - public function getSocketCode() - { - return $this->iSocketCode; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketConnectionDoesNotAvailableException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketConnectionDoesNotAvailableException.php deleted file mode 100755 index b406b3d2..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Net/Exceptions/SocketConnectionDoesNotAvailableException.php +++ /dev/null @@ -1,19 +0,0 @@ -rConnect = null; - $this->bUnreadBuffer = false; - $this->bRunningCallback = false; - $this->oLogger = null; - - $this->__AUTOLOGOUT__ = true; - - $this->sResponseBuffer = ''; - - $this->iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::NONE; - $this->sConnectedHost = ''; - $this->iConnectedPort = 0; - - $this->bSecure = false; - - $this->iConnectTimeOut = 10; - $this->iSocketTimeOut = 10; - - $this->Clear(); - } - - /** - * @return void - */ - public function __destruct() - { - try - { - if ($this->__AUTOLOGOUT__) - { - $this->LogoutAndDisconnect(); - } - else - { - $this->Disconnect(); - } - } - catch (\Exception $oException) {} - } - - /** - * @return void - */ - public function Clear() - { - $this->sResponseBuffer = ''; - - $this->sConnectedHost = ''; - $this->iConnectedPort = 0; - - $this->iStartConnectTime = 0; - $this->bSecure = false; - } - - /** - * @return string - */ - public function GetConnectedHost() - { - return $this->sConnectedHost; - } - - /** - * @return int - */ - public function GetConnectedPort() - { - return $this->iConnectedPort; - } - - /** - * @param int $iConnectTimeOut = 10 - * @param int $iSocketTimeOut = 10 - * - * @return void - */ - public function SetTimeOuts($iConnectTimeOut = 10, $iSocketTimeOut = 10) - { - $this->iConnectTimeOut = 5 < $iConnectTimeOut ? $iConnectTimeOut : 5; - $this->iSocketTimeOut = 5 < $iSocketTimeOut ? $iSocketTimeOut : 5; - } - - /** - * @return resource|null - */ - public function ConnectionResource() - { - return $this->rConnect; - } - - /** - * @param int $iErrNo - * @param string $sErrStr - * @param string $sErrFile - * @param int $iErrLine - * - * @return bool - */ - public function capturePhpErrorWithException($iErrNo, $sErrStr, $sErrFile, $iErrLine) - { - throw new \MailSo\Base\Exceptions\Exception($sErrStr, $iErrNo); - } - - /** - * @param string $sServerName - * @param int $iPort - * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT - * @param bool $bVerifySsl = false - * @param bool $bAllowSelfSigned = true - * - * @return void - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\SocketAlreadyConnectedException - * @throws \MailSo\Net\Exceptions\SocketCanNotConnectToHostException - */ - public function Connect($sServerName, $iPort, - $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT, - $bVerifySsl = false, $bAllowSelfSigned = true) - { - if (!\MailSo\Base\Validator::NotEmptyString($sServerName, true) || !\MailSo\Base\Validator::PortInt($iPort)) - { - $this->writeLogException( - new \MailSo\Base\Exceptions\InvalidArgumentException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - if ($this->IsConnected()) - { - $this->writeLogException( - new Exceptions\SocketAlreadyConnectedException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - $sServerName = \trim($sServerName); - - $sErrorStr = ''; - $iErrorNo = 0; - - $this->sConnectedHost = $sServerName; - $this->iConnectedPort = $iPort; - $this->iSecurityType = $iSecurityType; - $this->bSecure = \MailSo\Net\Enumerations\ConnectionSecurityType::UseSSL( - $this->iConnectedPort, $this->iSecurityType); - - if (!\preg_match('/^[a-z0-9._]{2,8}:\/\//i', $this->sConnectedHost)) - { - $this->sConnectedHost = ($this->bSecure ? 'ssl://' : 'tcp://').$this->sConnectedHost; -// $this->sConnectedHost = ($this->bSecure ? 'ssl://' : '').$this->sConnectedHost; - } - - if (!$this->bSecure && \MailSo\Net\Enumerations\ConnectionSecurityType::SSL === $this->iSecurityType) - { - $this->writeLogException( - new \MailSo\Net\Exceptions\SocketUnsuppoterdSecureConnectionException('SSL isn\'t supported: ('.\implode(', ', \stream_get_transports()).')'), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - $this->iStartConnectTime = \microtime(true); - $this->writeLog('Start connection to "'.$this->sConnectedHost.':'.$this->iConnectedPort.'"', - \MailSo\Log\Enumerations\Type::NOTE); - -// $this->rConnect = @\fsockopen($this->sConnectedHost, $this->iConnectedPort, -// $iErrorNo, $sErrorStr, $this->iConnectTimeOut); - - $bVerifySsl = !!$bVerifySsl; - $bAllowSelfSigned = $bVerifySsl ? !!$bAllowSelfSigned : true; - - $aStreamContextSettings = array( - 'ssl' => array( - 'verify_host' => $bVerifySsl, - 'verify_peer' => $bVerifySsl, - 'verify_peer_name' => $bVerifySsl, - 'allow_self_signed' => $bAllowSelfSigned - ) - ); - - \MailSo\Hooks::Run('Net.NetClient.StreamContextSettings/Filter', array(&$aStreamContextSettings)); - - $rStreamContext = \stream_context_create($aStreamContextSettings); - - \set_error_handler(array(&$this, 'capturePhpErrorWithException')); - - try - { - $this->rConnect = \stream_socket_client($this->sConnectedHost.':'.$this->iConnectedPort, - $iErrorNo, $sErrorStr, $this->iConnectTimeOut, STREAM_CLIENT_CONNECT, $rStreamContext); - } - catch (\Exception $oExc) - { - $sErrorStr = $oExc->getMessage(); - $iErrorNo = $oExc->getCode(); - } - - \restore_error_handler(); - - $this->writeLog('Connected ('.(\is_resource($this->rConnect) ? 'success' : 'unsuccess').')', - \MailSo\Log\Enumerations\Type::NOTE); - - if (!\is_resource($this->rConnect)) - { - $this->writeLogException( - new Exceptions\SocketCanNotConnectToHostException( - \MailSo\Base\Utils::ConvertSystemString($sErrorStr), (int) $iErrorNo, - 'Can\'t connect to host "'.$this->sConnectedHost.':'.$this->iConnectedPort.'"' - ), \MailSo\Log\Enumerations\Type::NOTICE, true); - } - - $this->writeLog((\microtime(true) - $this->iStartConnectTime).' (raw connection)', - \MailSo\Log\Enumerations\Type::TIME); - - if ($this->rConnect) - { - if (\MailSo\Base\Utils::FunctionExistsAndEnabled('stream_set_timeout')) - { - @\stream_set_timeout($this->rConnect, $this->iSocketTimeOut); - } - } - } - - public function EnableCrypto() - { - $bError = true; - if (\is_resource($this->rConnect) && - \MailSo\Base\Utils::FunctionExistsAndEnabled('stream_socket_enable_crypto')) - { - switch (true) - { - case defined('STREAM_CRYPTO_METHOD_ANY_CLIENT') && - @\stream_socket_enable_crypto($this->rConnect, true, STREAM_CRYPTO_METHOD_ANY_CLIENT): - case @\stream_socket_enable_crypto($this->rConnect, true, STREAM_CRYPTO_METHOD_TLS_CLIENT): - case @\stream_socket_enable_crypto($this->rConnect, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT): - $bError = false; - break; - } - } - - if ($bError) - { - $this->writeLogException( - new \MailSo\Net\Exceptions\Exception('Cannot enable STARTTLS.'), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - } - - /** - * @return void - */ - public function Disconnect() - { - if (\is_resource($this->rConnect)) - { - $bResult = \fclose($this->rConnect); - - $this->writeLog('Disconnected from "'.$this->sConnectedHost.':'.$this->iConnectedPort.'" ('. - (($bResult) ? 'success' : 'unsuccess').')', \MailSo\Log\Enumerations\Type::NOTE); - - if (0 !== $this->iStartConnectTime) - { - $this->writeLog((\microtime(true) - $this->iStartConnectTime).' (net session)', - \MailSo\Log\Enumerations\Type::TIME); - - $this->iStartConnectTime = 0; - } - - $this->rConnect = null; - } - } - - /** - * @retun void - * - * @throws \MailSo\Net\Exceptions\Exception - */ - public function LogoutAndDisconnect() - { - if (\method_exists($this, 'Logout') && !$this->bUnreadBuffer && !$this->bRunningCallback) - { - $this->Logout(); - } - - $this->Disconnect(); - } - - /** - * @param bool $bThrowExceptionOnFalse = false - * - * @return bool - */ - public function IsConnected($bThrowExceptionOnFalse = false) - { - $bResult = \is_resource($this->rConnect); - if (!$bResult && $bThrowExceptionOnFalse) - { - $this->writeLogException( - new Exceptions\SocketConnectionDoesNotAvailableException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - return $bResult; - } - - /** - * @return void - * - * @throws \MailSo\Net\Exceptions\SocketConnectionDoesNotAvailableException - */ - public function IsConnectedWithException() - { - $this->IsConnected(true); - } - - /** - * @return array|bool - */ - public function StreamContextParams() - { - return \is_resource($this->rConnect) && \MailSo\Base\Utils::FunctionExistsAndEnabled('stream_context_get_options') - ? \stream_context_get_params($this->rConnect) : false; - } - - /** - * @param string $sRaw - * @param bool $bWriteToLog = true - * @param string $sFakeRaw = '' - * - * @return void - * - * @throws \MailSo\Net\Exceptions\SocketConnectionDoesNotAvailableException - * @throws \MailSo\Net\Exceptions\SocketWriteException - */ - protected function sendRaw($sRaw, $bWriteToLog = true, $sFakeRaw = '') - { - if ($this->bUnreadBuffer) - { - $this->writeLogException( - new Exceptions\SocketUnreadBufferException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - $bFake = 0 < \strlen($sFakeRaw); - $sRaw .= "\r\n"; - - if ($this->oLogger && $this->oLogger->IsShowSecter()) - { - $bFake = false; - } - - if ($bFake) - { - $sFakeRaw .= "\r\n"; - } - - $mResult = @\fwrite($this->rConnect, $sRaw); - if (false === $mResult) - { - $this->IsConnected(true); - - $this->writeLogException( - new Exceptions\SocketWriteException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - else - { - \MailSo\Base\Loader::IncStatistic('NetWrite', $mResult); - - if ($bWriteToLog) - { - $this->writeLogWithCrlf('> '.($bFake ? $sFakeRaw : $sRaw), //.' ['.$iWriteSize.']', - $bFake ? \MailSo\Log\Enumerations\Type::SECURE : \MailSo\Log\Enumerations\Type::INFO); - } - } - } - - /** - * @param mixed $mReadLen = null - * @param bool $bForceLogin = false - * - * @return void - * - * @throws \MailSo\Net\Exceptions\SocketConnectionDoesNotAvailableException - * @throws \MailSo\Net\Exceptions\SocketReadException - */ - protected function getNextBuffer($mReadLen = null, $bForceLogin = false) - { - if (null === $mReadLen) - { - $this->sResponseBuffer = @\fgets($this->rConnect); - } - else - { - $this->sResponseBuffer = ''; - $iRead = $mReadLen; - while (0 < $iRead) - { - $sAddRead = @\fread($this->rConnect, $iRead); - if (false === $sAddRead) - { - $this->sResponseBuffer = false; - break; - } - - $this->sResponseBuffer .= $sAddRead; - $iRead -= \strlen($sAddRead); - } - } - - if (false === $this->sResponseBuffer) - { - $this->IsConnected(true); - $this->bUnreadBuffer = true; - - $aSocketStatus = @\stream_get_meta_data($this->rConnect); - if (isset($aSocketStatus['timed_out']) && $aSocketStatus['timed_out']) - { - $this->writeLogException( - new Exceptions\SocketReadTimeoutException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - else - { - $this->writeLog('Stream Meta: '. - \print_r($aSocketStatus, true), \MailSo\Log\Enumerations\Type::ERROR); - - $this->writeLogException( - new Exceptions\SocketReadException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - } - else - { - $iReadedLen = \strlen($this->sResponseBuffer); - if (null === $mReadLen || $bForceLogin) - { - $iLimit = 5000; // 5KB - if ($iLimit < $iReadedLen) - { - $this->writeLogWithCrlf('[cutted:'.$iReadedLen.'] < '.\substr($this->sResponseBuffer, 0, $iLimit).'...', - \MailSo\Log\Enumerations\Type::INFO); - } - else - { - $this->writeLogWithCrlf('< '.$this->sResponseBuffer, //.' ['.$iReadedLen.']', - \MailSo\Log\Enumerations\Type::INFO); - } - } - else - { - $this->writeLog('Received '.$iReadedLen.'/'.$mReadLen.' bytes.', - \MailSo\Log\Enumerations\Type::INFO); - } - - \MailSo\Base\Loader::IncStatistic('NetRead', $iReadedLen); - } - } - - /** - * @return string - */ - protected function getLogName() - { - return 'NET'; - } - - /** - * @param string $sDesc - * @param int $iDescType = \MailSo\Log\Enumerations\Type::INFO - * - * @return void - */ - protected function writeLog($sDesc, $iDescType = \MailSo\Log\Enumerations\Type::INFO, $bDiplayCrLf = false) - { - if ($this->oLogger) - { - $this->oLogger->Write($sDesc, $iDescType, $this->getLogName(), true, $bDiplayCrLf); - } - } - - /** - * @param string $sDesc - * @param int $iDescType = \MailSo\Log\Enumerations\Type::INFO - * - * @return void - */ - protected function writeLogWithCrlf($sDesc, $iDescType = \MailSo\Log\Enumerations\Type::INFO) - { - $this->writeLog($sDesc, $iDescType, true); - } - - /** - * @param \Exception $oException - * @param int $iDescType = \MailSo\Log\Enumerations\Type::NOTICE - * @param bool $bThrowException = false - * - * @return void - */ - protected function writeLogException($oException, - $iDescType = \MailSo\Log\Enumerations\Type::NOTICE, $bThrowException = false) - { - if ($this->oLogger) - { - if ($oException instanceof Exceptions\SocketCanNotConnectToHostException) - { - $this->oLogger->Write('Socket: ['.$oException->getSocketCode().'] '.$oException->getSocketMessage(), $iDescType, $this->getLogName()); - } - - $this->oLogger->WriteException($oException, $iDescType, $this->getLogName()); - } - - if ($bThrowException) - { - throw $oException; - } - } - - /** - * @param \MailSo\Log\Logger $oLogger - * - * @return void - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public function SetLogger($oLogger) - { - if (!($oLogger instanceof \MailSo\Log\Logger)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $this->oLogger = $oLogger; - } - - /** - * @return \MailSo\Log\Logger|null - */ - public function Logger() - { - return $this->oLogger; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/Exception.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/Exception.php deleted file mode 100755 index 0cc582d5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/Exception.php +++ /dev/null @@ -1,19 +0,0 @@ -aResponses = $aResponses; - } - } - - /** - * @return array - */ - public function GetResponses() - { - return $this->aResponses; - } - - /** - * @return \MailSo\Pop3\Response | null - */ - public function GetLastResponse() - { - return 0 < count($this->aResponses) ? $this->aResponses[count($this->aResponses) - 1] : null; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/RuntimeException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/RuntimeException.php deleted file mode 100755 index 047c32a6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Pop3/Exceptions/RuntimeException.php +++ /dev/null @@ -1,19 +0,0 @@ -bIsLoggined = false; - $this->iRequestTime = 0; - $this->aCapa = null; - $this->sLastMessage = ''; - } - - /** - * @return \MailSo\Pop3\Pop3Client - */ - public static function NewInstance() - { - return new self(); - } - - /** - * @param string $sServerName - * @param int $iPort = 110 - * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT - * @param bool $bVerifySsl = false - * @param bool $bAllowSelfSigned = null - * - * @return \MailSo\Pop3\Pop3Client - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Pop3\Exceptions\ResponseException - */ - public function Connect($sServerName, $iPort = 110, - $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT, - $bVerifySsl = false, $bAllowSelfSigned = null) - { - $this->iRequestTime = microtime(true); - - parent::Connect($sServerName, $iPort, $iSecurityType, $bVerifySsl, $bAllowSelfSigned); - - $this->validateResponse(); - - if (\MailSo\Net\Enumerations\ConnectionSecurityType::UseStartTLS( - in_array('STLS', $this->Capa()), $this->iSecurityType)) - { - $this->sendRequestWithCheck('STLS'); - $this->EnableCrypto(); - - $this->aCapa = null; - } - else if (\MailSo\Net\Enumerations\ConnectionSecurityType::STARTTLS === $this->iSecurityType) - { - $this->writeLogException( - new \MailSo\Net\Exceptions\SocketUnsuppoterdSecureConnectionException('STARTTLS is not supported'), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - return $this; - } - - /** - * @param string $sLogin = '' - * @param string $sPassword = '' - * - * @return \MailSo\Pop3\Pop3Client - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Pop3\Exceptions\ResponseException - */ - public function Login($sLogin, $sPassword) - { - if ($this->bIsLoggined) - { - $this->writeLogException( - new Exceptions\RuntimeException('Already authenticated for this session'), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - $sLogin = trim($sLogin); - $sPassword = $sPassword; - - try - { - $this->sendRequestWithCheck('USER', $sLogin); - $this->sendRequestWithCheck('PASS', $sPassword); - } - catch (\MailSo\Pop3\Exceptions\NegativeResponseException $oException) - { - $this->writeLogException( - new \MailSo\Pop3\Exceptions\LoginBadCredentialsException( - $oException->GetResponses(), '', 0, $oException), - \MailSo\Log\Enumerations\Type::NOTICE, true); - } - - $this->bIsLoggined = true; - $this->aCapa = null; - - return $this; - } - - /** - * @return bool - */ - public function IsLoggined() - { - return $this->IsConnected() && $this->bIsLoggined; - } - - /** - * @return \MailSo\Pop3\Pop3Client - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Pop3\Exceptions\Exception - */ - public function Noop() - { - $this->sendRequestWithCheck('NOOP'); - return $this; - } - - /** - * @return array [MessagesCount, Size] - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Pop3\Exceptions\Exception - */ - public function Status() - { - $this->sendRequestWithCheck('STAT'); - - $iMessageCount = $iSize = 0; - sscanf($this->sLastMessage, '%d %d', $iMessageCount, $iSize); - - return array((int) $iMessageCount, (int) $iSize); - } - - /** - * @return \MailSo\Pop3\Pop3Client - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Pop3\Exceptions\Exception - */ - public function Capa() - { - if (null === $this->aCapa) - { - $this->sendRequestWithCheck('CAPA'); - - $this->aCapa = array_filter(explode("\n", $this->readMultilineResponse()), function (&$sCapa) { - return 0 < strlen(trim($sCapa)); - }); - - $this->aCapa = array_map('trim', $this->aCapa); - } - - return $this->aCapa; - } - - /** - * @return \MailSo\Pop3\Pop3Client - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Pop3\Exceptions\Exception - */ - public function Logout() - { - if ($this->bIsLoggined) - { - $this->sendRequestWithCheck('QUIT'); - } - - $this->bIsLoggined = false; - return $this; - } - - /** - * @param string $sCommand - * @param string $sAddToCommand = '' - * - * @return \MailSo\Pop3\Pop3Client - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - */ - protected function sendRequest($sCommand, $sAddToCommand = '') - { - if (0 === strlen(trim($sCommand))) - { - $this->writeLogException( - new \MailSo\Base\Exceptions\InvalidArgumentException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - $this->IsConnected(true); - - $sCommand = trim($sCommand); - $sRealCommand = $sCommand.(0 === strlen($sAddToCommand) ? '' : ' '.$sAddToCommand); - - $sFakeCommand = ''; - $sFakeAddToCommand = $this->secureRequestParams($sCommand, $sAddToCommand); - if (0 < strlen($sFakeAddToCommand)) - { - $sFakeCommand = $sCommand.' '.$sFakeAddToCommand; - } - - $this->iRequestTime = microtime(true); - $this->sendRaw($sRealCommand, true, $sFakeCommand); - return $this; - } - - /** - * @param string $sCommand - * @param string $sAddToCommand - * - * @return string - */ - private function secureRequestParams($sCommand, $sAddToCommand) - { - $sResult = null; - if (0 < strlen($sAddToCommand)) - { - switch ($sCommand) - { - case 'PASS': - $sResult = '********'; - break; - } - } - - return $sResult; - } - - /** - * @param string $sCommand - * @param string $sAddToCommand = '' - * - * @return \MailSo\Pop3\Pop3Client - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Pop3\Exceptions\Exception - */ - private function sendRequestWithCheck($sCommand, $sAddToCommand = '') - { - $this->sendRequest($sCommand, $sAddToCommand); - return $this->validateResponse(); - } - - /** - * @return string - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Pop3\Exceptions\ResponseException - */ - private function validateResponse() - { - $this->getNextBuffer(); - - $this->sLastMessage = ''; - $sStatus = $sMessage = ''; - $sBuffer = trim($this->sResponseBuffer); - $sStatus = $sBuffer; - if (false !== strpos($sBuffer, ' ')) - { - list($sStatus, $sMessage) = explode(' ', $sBuffer, 2); - } - - $this->sLastMessage = $sMessage; - - if ($sStatus != '+OK') - { - $this->writeLogException( - new Exceptions\NegativeResponseException(), - \MailSo\Log\Enumerations\Type::WARNING, true); - } - - $this->writeLog((microtime(true) - $this->iRequestTime), - \MailSo\Log\Enumerations\Type::TIME); - } - - /** - * @return string - * - * @throws \MailSo\Net\Exceptions\Exception - */ - private function readMultilineResponse() - { - $this->iRequestTime = microtime(true); - - $sResult = ''; - do - { - $this->getNextBuffer(); - if (0 === strpos($this->sResponseBuffer, '.')) - { - $sResult .= substr($this->sResponseBuffer, 1); - } - else - { - $sResult .= $this->sResponseBuffer; - } - } - while ('.' !== rtrim($this->sResponseBuffer, "\r\n")); - - $this->writeLog((microtime(true) - $this->iRequestTime), - \MailSo\Log\Enumerations\Type::TIME); - - return $sResult; - } - - /** - * @return string - */ - protected function getLogName() - { - return 'POP3'; - } - - /** - * @param \MailSo\Log\Logger $oLogger - * @return \MailSo\Pop3\Pop3Client - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public function SetLogger($oLogger) - { - parent::SetLogger($oLogger); - - return $this; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/Exception.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/Exception.php deleted file mode 100755 index 76097ffb..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/Exception.php +++ /dev/null @@ -1,19 +0,0 @@ -aResponses = $aResponses; - } - } - - /** - * @return array - */ - public function GetResponses() - { - return $this->aResponses; - } - - /** - * @return \MailSo\Poppassd\Response | null - */ - public function GetLastResponse() - { - return 0 < \count($this->aResponses) ? $this->aResponses[count($this->aResponses) - 1] : null; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/RuntimeException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/RuntimeException.php deleted file mode 100755 index 5b94cb3f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Poppassd/Exceptions/RuntimeException.php +++ /dev/null @@ -1,19 +0,0 @@ -bIsLoggined = false; - $this->iRequestTime = 0; - - parent::__construct(); - } - - /** - * @return \MailSo\Poppassd\PoppassdClient - */ - public static function NewInstance() - { - return new self(); - } - - /** - * @param string $sServerName - * @param int $iPort = 106 - * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT - * @param bool $bVerifySsl = false - * @param bool $bAllowSelfSigned = true - * - * @return \MailSo\Poppassd\PoppassdClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Poppassd\Exceptions\ResponseException - */ - public function Connect($sServerName, $iPort = 106, - $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT, - $bVerifySsl = false, $bAllowSelfSigned = true) - { - $this->iRequestTime = \microtime(true); - - parent::Connect($sServerName, $iPort, $iSecurityType, $bVerifySsl, $bAllowSelfSigned); - - $this->validateResponse(); - - return $this; - } - - /** - * @param string $sLogin = '' - * @param string $sPassword = '' - * - * @return \MailSo\Poppassd\PoppassdClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Poppassd\Exceptions\ResponseException - */ - public function Login($sLogin, $sPassword) - { - if ($this->bIsLoggined) - { - $this->writeLogException( - new Exceptions\RuntimeException('Already authenticated for this session'), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - $sLogin = \trim($sLogin); - $sPassword = $sPassword; - - try - { - $this->sendRequestWithCheck('user', $sLogin, true); - $this->sendRequestWithCheck('pass', $sPassword, true); - } - catch (\MailSo\Poppassd\Exceptions\NegativeResponseException $oException) - { - $this->writeLogException( - new \MailSo\Poppassd\Exceptions\LoginBadCredentialsException( - $oException->GetResponses(), '', 0, $oException), - \MailSo\Log\Enumerations\Type::NOTICE, true); - } - - $this->bIsLoggined = true; - - return $this; - } - - /** - * @return \MailSo\Poppassd\PoppassdClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Poppassd\Exceptions\Exception - */ - public function Logout() - { - if ($this->bIsLoggined) - { - $this->sendRequestWithCheck('quit'); - } - - $this->bIsLoggined = false; - return $this; - } - - /** - * @param string $sNewPassword - * - * @return \MailSo\Poppassd\PoppassdClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Poppassd\Exceptions\Exception - */ - public function NewPass($sNewPassword) - { - if ($this->bIsLoggined) - { - $this->sendRequestWithCheck('newpass', $sNewPassword); - } - else - { - $this->writeLogException( - new \MailSo\Poppassd\Exceptions\RuntimeException('Required login'), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - return $this; - } - - /** - * @param string $sCommand - * @param string $sAddToCommand - * - * @return string - */ - private function secureRequestParams($sCommand, $sAddToCommand) - { - $sResult = null; - if (0 < \strlen($sAddToCommand)) - { - switch (\strtolower($sCommand)) - { - case 'pass': - case 'newpass': - $sResult = '********'; - break; - } - } - - return $sResult; - } - - /** - * @param string $sCommand - * @param string $sAddToCommand = '' - * - * @return \MailSo\Poppassd\PoppassdClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - */ - private function sendRequest($sCommand, $sAddToCommand = '') - { - if (0 === \strlen(\trim($sCommand))) - { - $this->writeLogException( - new \MailSo\Base\Exceptions\InvalidArgumentException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - $this->IsConnected(true); - - $sCommand = \trim($sCommand); - $sRealCommand = $sCommand.(0 === \strlen($sAddToCommand) ? '' : ' '.$sAddToCommand); - - $sFakeCommand = ''; - $sFakeAddToCommand = $this->secureRequestParams($sCommand, $sAddToCommand); - if (0 < \strlen($sFakeAddToCommand)) - { - $sFakeCommand = $sCommand.' '.$sFakeAddToCommand; - } - - $this->iRequestTime = \microtime(true); - $this->sendRaw($sRealCommand, true, $sFakeCommand); - - return $this; - } - - /** - * @param string $sCommand - * @param string $sAddToCommand = '' - * @param bool $bAuthRequestValidate = false - * - * @return \MailSo\Poppassd\PoppassdClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Poppassd\Exceptions\Exception - */ - private function sendRequestWithCheck($sCommand, $sAddToCommand = '', $bAuthRequestValidate = false) - { - $this->sendRequest($sCommand, $sAddToCommand); - $this->validateResponse($bAuthRequestValidate); - - return $this; - } - - /** - * @param bool $bAuthRequestValidate = false - * - * @return \MailSo\Poppassd\PoppassdClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Poppassd\Exceptions\ResponseException - */ - private function validateResponse($bAuthRequestValidate = false) - { - $this->getNextBuffer(); - - $bResult = false; - if ($bAuthRequestValidate) - { - $bResult = (bool) \preg_match('/^[23]\d\d/', trim($this->sResponseBuffer)); - } - else - { - $bResult = (bool) \preg_match('/^2\d\d/', \trim($this->sResponseBuffer)); - } - - if (!$bResult) - { - // POP3 validation hack - $bResult = '+OK ' === \substr(\trim($this->sResponseBuffer), 0, 4); - } - - if (!$bResult) - { - $this->writeLogException( - new Exceptions\NegativeResponseException(), - \MailSo\Log\Enumerations\Type::WARNING, true); - } - - $this->writeLog((\microtime(true) - $this->iRequestTime), - \MailSo\Log\Enumerations\Type::TIME); - - return $this; - } - - /** - * @return string - */ - protected function getLogName() - { - return 'POPPASSD'; - } - - /** - * @param \MailSo\Log\Logger $oLogger - * - * @return \MailSo\Poppassd\PoppassdClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public function SetLogger($oLogger) - { - parent::SetLogger($oLogger); - - return $this; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/Exception.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/Exception.php deleted file mode 100755 index 0740485c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/Exception.php +++ /dev/null @@ -1,19 +0,0 @@ -aResponses = $aResponses; - } - } - - /** - * @return array - */ - public function GetResponses() - { - return $this->aResponses; - } - - /** - * @return \MailSo\Sieve\Response | null - */ - public function GetLastResponse() - { - return 0 < count($this->aResponses) ? $this->aResponses[count($this->aResponses) - 1] : null; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/RuntimeException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/RuntimeException.php deleted file mode 100755 index 8704e461..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Sieve/Exceptions/RuntimeException.php +++ /dev/null @@ -1,19 +0,0 @@ -bIsLoggined = false; - $this->iRequestTime = 0; - $this->aCapa = array(); - $this->aModules = array(); - - $this->__USE_INITIAL_AUTH_PLAIN_COMMAND = true; - } - - /** - * @return \MailSo\Sieve\ManageSieveClient - */ - public static function NewInstance() - { - return new self(); - } - - /** - * @param string $sCapa - * - * @return bool - */ - public function IsSupported($sCapa) - { - return isset($this->aCapa[\strtoupper($sCapa)]); - } - - /** - * @param string $sModule - * - * @return bool - */ - public function IsModuleSupported($sModule) - { - return $this->IsSupported('SIEVE') && \in_array(\strtolower(\trim($sModule)), $this->aModules); - } - - /** - * @return array - */ - public function Modules() - { - return $this->aModules; - } - - /** - * @param string $sAuth - * - * @return bool - */ - public function IsAuthSupported($sAuth) - { - return $this->IsSupported('SASL') && \in_array(\strtoupper($sAuth), $this->aAuth); - } - - /** - * @param string $sServerName - * @param int $iPort - * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT - * @param bool $bVerifySsl = false - * @param bool $bAllowSelfSigned = true - * - * @return \MailSo\Sieve\ManageSieveClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Sieve\Exceptions\ResponseException - */ - public function Connect($sServerName, $iPort, - $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT, - $bVerifySsl = false, $bAllowSelfSigned = true) - { - $this->iRequestTime = \microtime(true); - - parent::Connect($sServerName, $iPort, $iSecurityType, $bVerifySsl, $bAllowSelfSigned); - - $mResponse = $this->parseResponse(); - $this->validateResponse($mResponse); - $this->parseStartupResponse($mResponse); - - if (\MailSo\Net\Enumerations\ConnectionSecurityType::UseStartTLS( - $this->IsSupported('STARTTLS'), $this->iSecurityType)) - { - $this->sendRequestWithCheck('STARTTLS'); - $this->EnableCrypto(); - - $mResponse = $this->parseResponse(); - $this->validateResponse($mResponse); - $this->parseStartupResponse($mResponse); - } - else if (\MailSo\Net\Enumerations\ConnectionSecurityType::STARTTLS === $this->iSecurityType) - { - $this->writeLogException( - new \MailSo\Net\Exceptions\SocketUnsuppoterdSecureConnectionException('STARTTLS is not supported'), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - return $this; - } - - /** - * @param string $sLogin - * @param string $sPassword - * @param string $sLoginAuthKey = '' - * - * @return \MailSo\Sieve\ManageSieveClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Sieve\Exceptions\LoginException - */ - public function Login($sLogin, $sPassword, $sLoginAuthKey = '') - { - if (!\MailSo\Base\Validator::NotEmptyString($sLogin, true) || - !\MailSo\Base\Validator::NotEmptyString($sPassword, true)) - { - $this->writeLogException( - new \MailSo\Base\Exceptions\InvalidArgumentException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - if ($this->IsSupported('SASL')) - { - $bAuth = false; - try - { - if ($this->IsAuthSupported('PLAIN')) - { - $sAuth = \base64_encode($sLoginAuthKey."\0".$sLogin."\0".$sPassword); - - if ($this->__USE_INITIAL_AUTH_PLAIN_COMMAND) - { - $this->sendRequest('AUTHENTICATE "PLAIN" "'.$sAuth.'"'); - } - else - { - $this->sendRequest('AUTHENTICATE "PLAIN" {'.\strlen($sAuth).'+}'); - $this->sendRequest($sAuth); - } - - $mResponse = $this->parseResponse(); - $this->validateResponse($mResponse); - $this->parseStartupResponse($mResponse); - $bAuth = true; - } - else if ($this->IsAuthSupported('LOGIN')) - { - $sLogin = \base64_encode($sLogin); - $sPassword = \base64_encode($sPassword); - - $this->sendRequest('AUTHENTICATE "LOGIN"'); - $this->sendRequest('{'.\strlen($sLogin).'+}'); - $this->sendRequest($sLogin); - $this->sendRequest('{'.\strlen($sPassword).'+}'); - $this->sendRequest($sPassword); - - $mResponse = $this->parseResponse(); - $this->validateResponse($mResponse); - $this->parseStartupResponse($mResponse); - $bAuth = true; - } - } - catch (\MailSo\Sieve\Exceptions\NegativeResponseException $oException) - { - $this->writeLogException( - new \MailSo\Sieve\Exceptions\LoginBadCredentialsException( - $oException->GetResponses(), '', 0, $oException), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - if (!$bAuth) - { - $this->writeLogException( - new \MailSo\Sieve\Exceptions\LoginBadMethodException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - } - else - { - $this->writeLogException( - new \MailSo\Sieve\Exceptions\LoginException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - $this->bIsLoggined = true; - - return $this; - } - - /** - * @return \MailSo\Sieve\ManageSieveClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Sieve\Exceptions\NegativeResponseException - */ - public function Logout() - { - if ($this->bIsLoggined) - { - $this->sendRequestWithCheck('LOGOUT'); - $this->bIsLoggined = false; - } - - return $this; - } - - /** - * @return array - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Sieve\Exceptions\NegativeResponseException - */ - public function ListScripts() - { - $this->sendRequest('LISTSCRIPTS'); - $mResponse = $this->parseResponse(); - $this->validateResponse($mResponse); - - $aResult = array(); - if (\is_array($mResponse)) - { - foreach ($mResponse as $sLine) - { - $aTokens = $this->parseLine($sLine); - if (false === $aTokens) - { - continue; - } - - $aResult[$aTokens[0]] = 'ACTIVE' === substr($sLine, -6); - } - } - - return $aResult; - } - - /** - * @return array - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Sieve\Exceptions\NegativeResponseException - */ - public function Capability() - { - $this->sendRequest('CAPABILITY'); - $mResponse = $this->parseResponse(); - $this->validateResponse($mResponse); - $this->parseStartupResponse($mResponse); - - return $this->aCapa; - } - - /** - * @return \MailSo\Sieve\ManageSieveClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Sieve\Exceptions\NegativeResponseException - */ - public function Noop() - { - $this->sendRequestWithCheck('NOOP'); - - return $this; - } - - /** - * @param string $sScriptName - * - * @return string - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Sieve\Exceptions\NegativeResponseException - */ - public function GetScript($sScriptName) - { - $this->sendRequest('GETSCRIPT "'.$sScriptName.'"'); - $mResponse = $this->parseResponse(); - $this->validateResponse($mResponse); - - $sScript = ''; - if (\is_array($mResponse) && 0 < \count($mResponse)) - { - if ('{' === $mResponse[0]{0}) - { - \array_shift($mResponse); - } - - if (\in_array(\substr($mResponse[\count($mResponse) - 1], 0, 2), array('OK', 'NO'))) - { - \array_pop($mResponse); - } - - $sScript = \implode("\n", $mResponse); - } - - return $sScript; - } - - /** - * @param string $sScriptName - * @param string $sScriptSource - * - * @return \MailSo\Sieve\ManageSieveClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Sieve\Exceptions\NegativeResponseException - */ - public function PutScript($sScriptName, $sScriptSource) - { - $this->sendRequest('PUTSCRIPT "'.$sScriptName.'" {'.\strlen($sScriptSource).'+}'); - $this->sendRequestWithCheck($sScriptSource); - - return $this; - } - - /** - * @param string $sScriptSource - * - * @return \MailSo\Sieve\ManageSieveClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Sieve\Exceptions\NegativeResponseException - */ - public function CheckScript($sScriptSource) - { - $this->sendRequest('CHECKSCRIPT {'.\strlen($sScriptSource).'+}'); - $this->sendRequestWithCheck($sScriptSource); - - return $this; - } - - /** - * @param string $sScriptName - * - * @return \MailSo\Sieve\ManageSieveClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Sieve\Exceptions\NegativeResponseException - */ - public function SetActiveScript($sScriptName) - { - $this->sendRequestWithCheck('SETACTIVE "'.$sScriptName.'"'); - - return $this; - } - - /** - * @param string $sScriptName - * - * @return \MailSo\Sieve\ManageSieveClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Sieve\Exceptions\NegativeResponseException - */ - public function DeleteScript($sScriptName) - { - $this->sendRequestWithCheck('DELETESCRIPT "'.$sScriptName.'"'); - - return $this; - } - - /** - * @return string - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Sieve\Exceptions\NegativeResponseException - */ - public function GetActiveScriptName() - { - $aList = $this->ListScripts(); - if (\is_array($aList) && 0 < \count($aList)) - { - foreach ($aList as $sName => $bIsActive) - { - if ($bIsActive) - { - return $sName; - } - } - } - - return ''; - } - - /** - * @param string $sScriptName - * - * @return bool - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Sieve\Exceptions\NegativeResponseException - */ - public function IsActiveScript($sScriptName) - { - return $sScriptName === $this->GetActiveScriptName(); - } - - /** - * @param string $sLine - * @return array|false - */ - private function parseLine($sLine) - { - if (false === $sLine || null === $sLine || \in_array(\substr($sLine, 0, 2), array('OK', 'NO'))) - { - return false; - } - - $iStart = -1; - $iIndex = 0; - $aResult = false; - - for ($iPos = 0; $iPos < \strlen($sLine); $iPos++) - { - if ('"' === $sLine[$iPos] && '\\' !== $sLine[$iPos]) - { - if (-1 === $iStart) - { - $iStart = $iPos; - } - else - { - $aResult = \is_array($aResult) ? $aResult : array(); - $aResult[$iIndex++] = \substr($sLine, $iStart + 1, $iPos - $iStart - 1); - $iStart = -1; - } - } - } - - return \is_array($aResult) && isset($aResult[0]) ? $aResult : false; - } - - /** - * @param string $mResponse - * - * @return void - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - */ - private function parseStartupResponse($mResponse) - { - foreach ($mResponse as $sLine) - { - $aTokens = $this->parseLine($sLine); - - if (false === $aTokens || !isset($aTokens[0]) || - \in_array(\substr($sLine, 0, 2), array('OK', 'NO'))) - { - continue; - } - - $sToken = \strtoupper($aTokens[0]); - $this->aCapa[$sToken] = isset($aTokens[1]) ? $aTokens[1] : ''; - - if (isset($aTokens[1])) - { - switch ($sToken) { - case 'SASL': - $this->aAuth = \explode(' ', \strtoupper($aTokens[1])); - break; - case 'SIEVE': - $this->aModules = \explode(' ', \strtolower($aTokens[1])); - break; - } - } - } - } - - /** - * @param string $sRequest - * - * @return void - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - */ - private function sendRequest($sRequest) - { - if (!\MailSo\Base\Validator::NotEmptyString($sRequest, true)) - { - $this->writeLogException( - new \MailSo\Base\Exceptions\InvalidArgumentException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - $this->IsConnected(true); - - $this->sendRaw($sRequest); - } - - /** - * @param string $sRequest - * - * @return void - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Sieve\Exceptions\NegativeResponseException - */ - private function sendRequestWithCheck($sRequest) - { - $this->sendRequest($sRequest); - $this->validateResponse($this->parseResponse()); - } - - /** - * @param string $sLine - * - * @return string - */ - private function convertEndOfLine($sLine) - { - $sLine = \trim($sLine); - if ('}' === \substr($sLine, -1)) - { - $iPos = \strrpos($sLine, '{'); - if (false !== $iPos) - { - $sSunLine = \substr($sLine, $iPos + 1, -1); - if (\is_numeric($sSunLine) && 0 < (int) $sSunLine) - { - $iLen = (int) $sSunLine; - - $this->getNextBuffer($iLen, true); - - if (\strlen($this->sResponseBuffer) === $iLen) - { - $sLine = \trim(\substr_replace($sLine, $this->sResponseBuffer, $iPos)); - } - } - } - } - - return $sLine; - } - - /** - * @return array|bool - */ - private function parseResponse() - { - $this->iRequestTime = \microtime(true); - - $aResult = array(); - do - { - $this->getNextBuffer(); - - $sLine = $this->sResponseBuffer; - if (false === $sLine) - { - break; - } - else if (\in_array(\substr($sLine, 0, 2), array('OK', 'NO'))) - { - $aResult[] = $this->convertEndOfLine($sLine); - break; - } - else - { - $aResult[] = $this->convertEndOfLine($sLine); - } - } - while (true); - - $this->writeLog((\microtime(true) - $this->iRequestTime), - \MailSo\Log\Enumerations\Type::TIME); - - return $aResult; - } - - /** - * @throws \MailSo\Sieve\Exceptions\NegativeResponseException - */ - private function validateResponse($aResponse) - { - if (!\is_array($aResponse) || 0 === \count($aResponse) || - 'OK' !== \substr($aResponse[\count($aResponse) - 1], 0, 2)) - { - $this->writeLogException( - new \MailSo\Sieve\Exceptions\NegativeResponseException($aResponse), - \MailSo\Log\Enumerations\Type::WARNING, true); - } - } - - /** - * @return string - */ - protected function getLogName() - { - return 'SIEVE'; - } - - /** - * @param \MailSo\Log\Logger $oLogger - * - * @return \MailSo\Sieve\ManageSieveClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public function SetLogger($oLogger) - { - parent::SetLogger($oLogger); - - return $this; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/Exception.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/Exception.php deleted file mode 100755 index 7c18f189..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/Exception.php +++ /dev/null @@ -1,19 +0,0 @@ -aResponses = $aResponses; - } - } - - /** - * @return array - */ - public function GetResponses() - { - return $this->aResponses; - } - - /** - * @return \MailSo\Smtp\Response | null - */ - public function GetLastResponse() - { - return 0 < count($this->aResponses) ? $this->aResponses[count($this->aResponses) - 1] : null; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/RuntimeException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/RuntimeException.php deleted file mode 100755 index 294b93b0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Smtp/Exceptions/RuntimeException.php +++ /dev/null @@ -1,19 +0,0 @@ -aAuthTypes = array(); - - $this->iRequestTime = 0; - $this->iSizeCapaValue = 0; - $this->aResults = array(); - $this->aCapa = array(); - - $this->bHelo = false; - $this->bRcpt = false; - $this->bMail = false; - $this->bData = false; - } - - /** - * @return \MailSo\Smtp\SmtpClient - */ - public static function NewInstance() - { - return new self(); - } - - /** - * @return bool - */ - public function IsSupported($sCapa) - { - return in_array(strtoupper($sCapa), $this->aCapa); - } - - /** - * @return bool - */ - public function IsAuthSupported($sAuth) - { - return in_array(strtoupper($sAuth), $this->aAuthTypes); - } - - /** - * @return bool - */ - public function HasSupportedAuth() - { - return $this->IsAuthSupported('PLAIN') || $this->IsAuthSupported('LOGIN'); - } - - /** - * @return string - */ - public static function EhloHelper() - { - $sEhloHost = empty($_SERVER['SERVER_NAME']) ? '' : \trim($_SERVER['SERVER_NAME']); - if (empty($sEhloHost)) - { - $sEhloHost = empty($_SERVER['HTTP_HOST']) ? '' : \trim($_SERVER['HTTP_HOST']); - } - - if (empty($sEhloHost)) - { - $sEhloHost = \function_exists('gethostname') ? \gethostname() : 'localhost'; - } - - $sEhloHost = \trim(\preg_replace('/:\d+$/', '', \trim($sEhloHost))); - - if (\preg_match('/^\d+\.\d+\.\d+\.\d+$/', $sEhloHost)) - { - $sEhloHost = '['.$sEhloHost.']'; - } - - return empty($sEhloHost) ? 'localhost' : $sEhloHost; - } - - /** - * @param string $sServerName - * @param int $iPort = 25 - * @param string $sEhloHost = '[127.0.0.1]' - * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT - * @param bool $bVerifySsl = false - * @param bool $bAllowSelfSigned = true - * - * @return \MailSo\Smtp\SmtpClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Smtp\Exceptions\ResponseException - */ - public function Connect($sServerName, $iPort = 25, $sEhloHost = '[127.0.0.1]', - $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT, - $bVerifySsl = false, $bAllowSelfSigned = true) - { - $this->iRequestTime = microtime(true); - - parent::Connect($sServerName, $iPort, $iSecurityType, $bVerifySsl, $bAllowSelfSigned); - - $this->validateResponse(220); - - $this->preLoginStartTLSAndEhloProcess($sEhloHost); - - return $this; - } - - /** - * @param string $sLogin - * @param string $sPassword - * @param boolean $bUseAuthPlainIfSupported = true - * @param boolean $bUseAuthCramMd5IfSupported = true - * - * @return \MailSo\Smtp\SmtpClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Smtp\Exceptions\Exception - */ - public function Login($sLogin, $sPassword, $bUseAuthPlainIfSupported = true, $bUseAuthCramMd5IfSupported = true) - { - $sLogin = \MailSo\Base\Utils::IdnToAscii(\MailSo\Base\Utils::Trim($sLogin)); - - if ($bUseAuthCramMd5IfSupported && $this->IsAuthSupported('CRAM-MD5')) - { - try - { - $this->sendRequestWithCheck('AUTH', 334, 'CRAM-MD5'); - } - catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) - { - $this->writeLogException( - new \MailSo\Smtp\Exceptions\LoginBadMethodException( - $oException->GetResponses(), $oException->getMessage(), 0, $oException), - \MailSo\Log\Enumerations\Type::NOTICE, true); - } - - $sTicket = ''; - - $sContinuationResponse = !empty($this->aResults[0]) ? \trim($this->aResults[0]) : ''; - if ($sContinuationResponse && '334 ' === \substr($sContinuationResponse, 0, 4) && 0 < \strlen(\substr($sContinuationResponse, 4))) - { - $sTicket = @\base64_decode(\substr($sContinuationResponse, 4)); - $this->writeLogWithCrlf('ticket: '.$sTicket); - } - - if (empty($sTicket)) - { - $this->writeLogException( - new \MailSo\Smtp\Exceptions\NegativeResponseException(), - \MailSo\Log\Enumerations\Type::NOTICE, true - ); - } - - try - { - $this->sendRequestWithCheck(\base64_encode($sLogin.' '.\MailSo\Base\Utils::Hmac($sTicket, $sPassword)), 235, '', true); - } - catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) - { - $this->writeLogException( - new \MailSo\Smtp\Exceptions\LoginBadCredentialsException( - $oException->GetResponses(), $oException->getMessage(), 0, $oException), - \MailSo\Log\Enumerations\Type::NOTICE, true); - } - } - else if ($bUseAuthPlainIfSupported && $this->IsAuthSupported('PLAIN')) - { - if ($this->__USE_SINGLE_LINE_AUTH_PLAIN_COMMAND) - { - try - { - $this->sendRequestWithCheck('AUTH', 235, 'PLAIN '.\base64_encode("\0".$sLogin."\0".$sPassword), true); - } - catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) - { - $this->writeLogException( - new \MailSo\Smtp\Exceptions\LoginBadCredentialsException( - $oException->GetResponses(), $oException->getMessage(), 0, $oException), - \MailSo\Log\Enumerations\Type::NOTICE, true); - } - } - else - { - try - { - $this->sendRequestWithCheck('AUTH', 334, 'PLAIN'); - } - catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) - { - $this->writeLogException( - new \MailSo\Smtp\Exceptions\LoginBadMethodException( - $oException->GetResponses(), $oException->getMessage(), 0, $oException), - \MailSo\Log\Enumerations\Type::NOTICE, true); - } - - try - { - $this->sendRequestWithCheck(\base64_encode("\0".$sLogin."\0".$sPassword), 235, '', true); - } - catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) - { - $this->writeLogException( - new \MailSo\Smtp\Exceptions\LoginBadCredentialsException( - $oException->GetResponses(), $oException->getMessage(), 0, $oException), - \MailSo\Log\Enumerations\Type::NOTICE, true); - } - } - } - else if ($this->IsAuthSupported('LOGIN')) - { - try - { - $this->sendRequestWithCheck('AUTH', 334, 'LOGIN'); - } - catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) - { - $this->writeLogException( - new \MailSo\Smtp\Exceptions\LoginBadMethodException( - $oException->GetResponses(), $oException->getMessage(), 0, $oException), - \MailSo\Log\Enumerations\Type::NOTICE, true); - } - - try - { - $this->sendRequestWithCheck(\base64_encode($sLogin), 334, ''); - $this->sendRequestWithCheck(\base64_encode($sPassword), 235, '', true); - } - catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) - { - $this->writeLogException( - new \MailSo\Smtp\Exceptions\LoginBadCredentialsException( - $oException->GetResponses(), $oException->getMessage(), 0, $oException), - \MailSo\Log\Enumerations\Type::NOTICE, true); - } - } - else - { - $this->writeLogException( - new \MailSo\Smtp\Exceptions\LoginBadMethodException(), - \MailSo\Log\Enumerations\Type::NOTICE, true); - } - - return $this; - } - - /** - * @param string $sXOAuth2Token - * - * @return \MailSo\Smtp\SmtpClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Smtp\Exceptions\Exception - */ - public function LoginWithXOauth2($sXOAuth2Token) - { - if ($this->IsAuthSupported('XOAUTH2')) - { - try - { - $this->sendRequestWithCheck('AUTH', 235, 'XOAUTH2 '.\trim($sXOAuth2Token)); - } - catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) - { - $this->writeLogException( - new \MailSo\Smtp\Exceptions\LoginBadCredentialsException( - $oException->GetResponses(), $oException->getMessage(), 0, $oException), - \MailSo\Log\Enumerations\Type::NOTICE, true); - } - } - else - { - $this->writeLogException( - new \MailSo\Smtp\Exceptions\LoginBadMethodException(), - \MailSo\Log\Enumerations\Type::NOTICE, true); - } - - return $this; - } - - /** - * @param string $sFrom - * @param string $sSizeIfSupported = '' - * @param bool $bDsn = false - * - * @return \MailSo\Smtp\SmtpClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Smtp\Exceptions\Exception - */ - public function MailFrom($sFrom, $sSizeIfSupported = '', $bDsn = false) - { - $sFrom = \MailSo\Base\Utils::IdnToAscii( - \MailSo\Base\Utils::Trim($sFrom), true); - - $sCmd = 'FROM:<'.$sFrom.'>'; - - $sSizeIfSupported = (string) $sSizeIfSupported; - if (0 < \strlen($sSizeIfSupported) && \is_numeric($sSizeIfSupported) && $this->IsSupported('SIZE')) - { - $sCmd .= ' SIZE='.$sSizeIfSupported; - } - - if ($bDsn && $this->IsSupported('DSN')) - { - $sCmd .= ' RET=HDRS'; - } - - $this->sendRequestWithCheck('MAIL', 250, $sCmd); - - $this->bMail = true; - $this->bRcpt = false; - $this->bData = false; - - return $this; - } - - /** - * @param string $sTo - * @param bool $bDsn = false - * - * @return \MailSo\Smtp\SmtpClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Smtp\Exceptions\Exception - */ - public function Rcpt($sTo, $bDsn = false) - { - if (!$this->bMail) - { - $this->writeLogException( - new Exceptions\RuntimeException('No sender reverse path has been supplied'), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - $sTo = \MailSo\Base\Utils::IdnToAscii( - \MailSo\Base\Utils::Trim($sTo), true); - - $sCmd = 'TO:<'.$sTo.'>'; - - if ($bDsn && $this->IsSupported('DSN')) - { - $sCmd .= ' NOTIFY=SUCCESS,FAILURE'; - } - - $this->sendRequestWithCheck( - 'RCPT', array(250, 251), $sCmd, false, - 'Failed to add recipient "'.$sTo.'"' - ); - - $this->bRcpt = true; - - return $this; - } - - /** - * @param string $sTo - * - * @return \MailSo\Smtp\SmtpClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Smtp\Exceptions\Exception - */ - public function MailTo($sTo) - { - return $this->Rcpt($sTo); - } - - /** - * @param string $sData - * - * @return \MailSo\Smtp\SmtpClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Smtp\Exceptions\Exception - */ - public function Data($sData) - { - if (!\MailSo\Base\Validator::NotEmptyString($sData, true)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - $rDataStream = \MailSo\Base\ResourceRegistry::CreateMemoryResourceFromString($sData); - unset($sData); - $this->DataWithStream($rDataStream); - \MailSo\Base\ResourceRegistry::CloseMemoryResource($rDataStream); - - return $this; - } - - /** - * @param resource $rDataStream - * - * @return \MailSo\Smtp\SmtpClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Smtp\Exceptions\Exception - */ - public function DataWithStream($rDataStream) - { - if (!\is_resource($rDataStream)) - { - throw new \MailSo\Base\Exceptions\InvalidArgumentException(); - } - - if (!$this->bRcpt) - { - $this->writeLogException( - new Exceptions\RuntimeException('No recipient forward path has been supplied'), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - $this->sendRequestWithCheck('DATA', 354); - - $this->writeLog('Message data.', \MailSo\Log\Enumerations\Type::NOTE); - - $this->bRunningCallback = true; - - while (!\feof($rDataStream)) - { - $sBuffer = \fgets($rDataStream); - if (false !== $sBuffer) - { - if (0 === \strpos($sBuffer, '.')) - { - $sBuffer = '.'.$sBuffer; - } - - $this->sendRaw(\rtrim($sBuffer, "\r\n"), false); - - \MailSo\Base\Utils::ResetTimeLimit(); - continue; - } - else if (!\feof($rDataStream)) - { - $this->writeLogException( - new Exceptions\RuntimeException('Cannot read input resource'), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - break; - } - - $this->sendRequestWithCheck('.', 250); - - $this->bRunningCallback = false; - - $this->bData = true; - - return $this; - } - - /** - * @return \MailSo\Smtp\SmtpClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Smtp\Exceptions\Exception - */ - public function Rset() - { - $this->sendRequestWithCheck('RSET', array(250, 220)); - - $this->bMail = false; - $this->bRcpt = false; - $this->bData = false; - - return $this; - } - - /** - * @return \MailSo\Smtp\SmtpClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Smtp\Exceptions\Exception - */ - public function Vrfy($sUser) - { - $sUser = \MailSo\Base\Utils::IdnToAscii( - \MailSo\Base\Utils::Trim($sUser)); - - $this->sendRequestWithCheck('VRFY', array(250, 251, 252), $sUser); - - return $this; - } - - /** - * @return \MailSo\Smtp\SmtpClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Smtp\Exceptions\Exception - */ - public function Noop() - { - $this->sendRequestWithCheck('NOOP', 250); - - return $this; - } - - /** - * @return \MailSo\Smtp\SmtpClient - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Smtp\Exceptions\Exception - */ - public function Logout() - { - if ($this->IsConnected()) - { - $this->sendRequestWithCheck('QUIT', 221); - } - - $this->bHelo = false; - $this->bMail = false; - $this->bRcpt = false; - $this->bData = false; - - return $this; - } - - /** - * @param string $sEhloHost - * - * @return void - */ - private function preLoginStartTLSAndEhloProcess($sEhloHost) - { - if ($this->bHelo) - { - $this->writeLogException( - new Exceptions\RuntimeException('Cannot issue EHLO/HELO to existing session'), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - $this->ehloOrHelo($sEhloHost); - - if (\MailSo\Net\Enumerations\ConnectionSecurityType::UseStartTLS( - $this->IsSupported('STARTTLS'), $this->iSecurityType, $this->HasSupportedAuth())) - { - $this->sendRequestWithCheck('STARTTLS', 220); - $this->EnableCrypto(); - - $this->ehloOrHelo($sEhloHost); - } - else if (\MailSo\Net\Enumerations\ConnectionSecurityType::STARTTLS === $this->iSecurityType) - { - $this->writeLogException( - new \MailSo\Net\Exceptions\SocketUnsuppoterdSecureConnectionException('STARTTLS is not supported'), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - $this->bHelo = true; - } - - /** - * @param string $sCommand - * @param string $sAddToCommand = '' - * @param bool $bSecureLog = false - * - * @return void - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - */ - private function sendRequest($sCommand, $sAddToCommand = '', $bSecureLog = false) - { - if (!\MailSo\Base\Validator::NotEmptyString($sCommand, true)) - { - $this->writeLogException( - new \MailSo\Base\Exceptions\InvalidArgumentException(), - \MailSo\Log\Enumerations\Type::ERROR, true); - } - - $this->IsConnected(true); - - $sCommand = \trim($sCommand); - $sRealCommand = $sCommand.(0 === \strlen($sAddToCommand) ? '' : ' '.$sAddToCommand); - - $sFakeCommand = ($bSecureLog) ? '********' : ''; - - $this->iRequestTime = \microtime(true); - $this->sendRaw($sRealCommand, true, $sFakeCommand); - - return $this; - } - - /** - * @param string $sCommand - * @param int|array $mExpectCode - * @param string $sAddToCommand = '' - * @param bool $bSecureLog = false - * @param string $sErrorPrefix = '' - * - * @return void - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Smtp\Exceptions\Exception - */ - private function sendRequestWithCheck($sCommand, $mExpectCode, $sAddToCommand = '', $bSecureLog = false, $sErrorPrefix = '') - { - $this->sendRequest($sCommand, $sAddToCommand, $bSecureLog); - $this->validateResponse($mExpectCode, $sErrorPrefix); - } - - /** - * @param string $sHost - * - * @return void - */ - private function ehloOrHelo($sHost) - { - try - { - $this->ehlo($sHost); - } - catch (\Exception $oException) - { - try - { - $this->helo($sHost); - } - catch (\Exception $oException) - { - throw $oException; - } - } - - return $this; - } - - /** - * @param string $sHost - * - * @return void - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Smtp\Exceptions\Exception - */ - private function ehlo($sHost) - { - $this->sendRequestWithCheck('EHLO', 250, $sHost); - - foreach ($this->aResults as $sLine) - { - $aMatch = array(); - if (\preg_match('/[\d]+[ \-](.+)$/', $sLine, $aMatch) && isset($aMatch[1]) && 0 < \strlen($aMatch[1])) - { - $sLine = \trim($aMatch[1]); - $aLine = \preg_split('/[ =]/', $sLine, 2); - if (\is_array($aLine) && 0 < \count($aLine) && !empty($aLine[0])) - { - $sCapa = \strtoupper($aLine[0]); - if (('AUTH' === $sCapa || 'SIZE' === $sCapa) && !empty($aLine[1])) - { - $sSubLine = \trim(\strtoupper($aLine[1])); - if (0 < \strlen($sSubLine)) - { - if ('AUTH' === $sCapa) - { - $this->aAuthTypes = \explode(' ', $sSubLine); - } - else if ('SIZE' === $sCapa && \is_numeric($sSubLine)) - { - $this->iSizeCapaValue = (int) $sSubLine; - } - } - } - - $this->aCapa[] = $sCapa; - } - } - } - } - - /** - * @param string $sHost - * - * @return void - * - * @throws \MailSo\Net\Exceptions\Exception - * @throws \MailSo\Smtp\Exceptions\Exception - */ - private function helo($sHost) - { - $this->sendRequestWithCheck('HELO', 250, $sHost); - $this->aAuthTypes = array(); - $this->iSizeCapaValue = 0; - $this->aCapa = array(); - } - - /** - * @param int|array $mExpectCode - * @param string $sErrorPrefix = '' - * - * @return void - * - * @throws \MailSo\Smtp\Exceptions\ResponseException - */ - private function validateResponse($mExpectCode, $sErrorPrefix = '') - { - if (!\is_array($mExpectCode)) - { - $mExpectCode = array((int) $mExpectCode); - } - else - { - $mExpectCode = \array_map('intval', $mExpectCode); - } - - $aParts = array('', '', ''); - $this->aResults = array(); - do - { - $this->getNextBuffer(); - $aParts = \preg_split('/([\s\-]+)/', $this->sResponseBuffer, 2, PREG_SPLIT_DELIM_CAPTURE); - - if (\is_array($aParts) && 3 === \count($aParts) && \is_numeric($aParts[0])) - { - if ('-' !== \substr($aParts[1], 0, 1) && !\in_array((int) $aParts[0], $mExpectCode)) - { - $this->writeLogException( - new Exceptions\NegativeResponseException($this->aResults, - ('' === $sErrorPrefix ? '' : $sErrorPrefix.': ').\trim( - (0 < \count($this->aResults) ? \implode("\r\n", $this->aResults)."\r\n" : ''). - $this->sResponseBuffer)), \MailSo\Log\Enumerations\Type::ERROR, true); - } - } - else - { - $this->writeLogException( - new Exceptions\ResponseException($this->aResults, - ('' === $sErrorPrefix ? '' : $sErrorPrefix.': ').\trim( - (0 < \count($this->aResults) ? \implode("\r\n", $this->aResults)."\r\n" : ''). - $this->sResponseBuffer)), \MailSo\Log\Enumerations\Type::ERROR, true); - } - - $this->aResults[] = $this->sResponseBuffer; - } - while ('-' === \substr($aParts[1], 0, 1)); - - $this->writeLog((microtime(true) - $this->iRequestTime), - \MailSo\Log\Enumerations\Type::TIME); - } - - /** - * @return string - */ - protected function getLogName() - { - return 'SMTP'; - } - - /** - * @param \MailSo\Log\Logger $oLogger - * - * @return \MailSo\Smtp\SmtpClient - * - * @throws \MailSo\Base\Exceptions\InvalidArgumentException - */ - public function SetLogger($oLogger) - { - parent::SetLogger($oLogger); - - return $this; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Vendors/Net/IDNA2.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Vendors/Net/IDNA2.php deleted file mode 100755 index 82068341..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Vendors/Net/IDNA2.php +++ /dev/null @@ -1,3404 +0,0 @@ - - * @author Matthias Sommerfeld - * @author Stefan Neufeind - * @version $Id: IDNA2.php 305344 2010-11-14 23:52:42Z neufeind $ - */ -class Net_IDNA2 -{ - // {{{ npdata - /** - * These Unicode codepoints are - * mapped to nothing, See RFC3454 for details - * - * @static - * @var array - * @access private - */ - private static $_np_map_nothing = array( - 0xAD, - 0x34F, - 0x1806, - 0x180B, - 0x180C, - 0x180D, - 0x200B, - 0x200C, - 0x200D, - 0x2060, - 0xFE00, - 0xFE01, - 0xFE02, - 0xFE03, - 0xFE04, - 0xFE05, - 0xFE06, - 0xFE07, - 0xFE08, - 0xFE09, - 0xFE0A, - 0xFE0B, - 0xFE0C, - 0xFE0D, - 0xFE0E, - 0xFE0F, - 0xFEFF - ); - - /** - * Prohibited codepints - * - * @static - * @var array - * @access private - */ - private static $_general_prohibited = array( - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 0xA, - 0xB, - 0xC, - 0xD, - 0xE, - 0xF, - 0x10, - 0x11, - 0x12, - 0x13, - 0x14, - 0x15, - 0x16, - 0x17, - 0x18, - 0x19, - 0x1A, - 0x1B, - 0x1C, - 0x1D, - 0x1E, - 0x1F, - 0x20, - 0x21, - 0x22, - 0x23, - 0x24, - 0x25, - 0x26, - 0x27, - 0x28, - 0x29, - 0x2A, - 0x2B, - 0x2C, - 0x2F, - 0x3B, - 0x3C, - 0x3D, - 0x3E, - 0x3F, - 0x40, - 0x5B, - 0x5C, - 0x5D, - 0x5E, - 0x5F, - 0x60, - 0x7B, - 0x7C, - 0x7D, - 0x7E, - 0x7F, - 0x3002 - ); - - /** - * Codepints prohibited by Nameprep - * @static - * @var array - * @access private - */ - private static $_np_prohibit = array( - 0xA0, - 0x1680, - 0x2000, - 0x2001, - 0x2002, - 0x2003, - 0x2004, - 0x2005, - 0x2006, - 0x2007, - 0x2008, - 0x2009, - 0x200A, - 0x200B, - 0x202F, - 0x205F, - 0x3000, - 0x6DD, - 0x70F, - 0x180E, - 0x200C, - 0x200D, - 0x2028, - 0x2029, - 0xFEFF, - 0xFFF9, - 0xFFFA, - 0xFFFB, - 0xFFFC, - 0xFFFE, - 0xFFFF, - 0x1FFFE, - 0x1FFFF, - 0x2FFFE, - 0x2FFFF, - 0x3FFFE, - 0x3FFFF, - 0x4FFFE, - 0x4FFFF, - 0x5FFFE, - 0x5FFFF, - 0x6FFFE, - 0x6FFFF, - 0x7FFFE, - 0x7FFFF, - 0x8FFFE, - 0x8FFFF, - 0x9FFFE, - 0x9FFFF, - 0xAFFFE, - 0xAFFFF, - 0xBFFFE, - 0xBFFFF, - 0xCFFFE, - 0xCFFFF, - 0xDFFFE, - 0xDFFFF, - 0xEFFFE, - 0xEFFFF, - 0xFFFFE, - 0xFFFFF, - 0x10FFFE, - 0x10FFFF, - 0xFFF9, - 0xFFFA, - 0xFFFB, - 0xFFFC, - 0xFFFD, - 0x340, - 0x341, - 0x200E, - 0x200F, - 0x202A, - 0x202B, - 0x202C, - 0x202D, - 0x202E, - 0x206A, - 0x206B, - 0x206C, - 0x206D, - 0x206E, - 0x206F, - 0xE0001 - ); - - /** - * Codepoint ranges prohibited by nameprep - * - * @static - * @var array - * @access private - */ - private static $_np_prohibit_ranges = array( - array(0x80, 0x9F ), - array(0x2060, 0x206F ), - array(0x1D173, 0x1D17A ), - array(0xE000, 0xF8FF ), - array(0xF0000, 0xFFFFD ), - array(0x100000, 0x10FFFD), - array(0xFDD0, 0xFDEF ), - array(0xD800, 0xDFFF ), - array(0x2FF0, 0x2FFB ), - array(0xE0020, 0xE007F ) - ); - - /** - * Replacement mappings (casemapping, replacement sequences, ...) - * - * @static - * @var array - * @access private - */ - private static $_np_replacemaps = array( - 0x41 => array(0x61), - 0x42 => array(0x62), - 0x43 => array(0x63), - 0x44 => array(0x64), - 0x45 => array(0x65), - 0x46 => array(0x66), - 0x47 => array(0x67), - 0x48 => array(0x68), - 0x49 => array(0x69), - 0x4A => array(0x6A), - 0x4B => array(0x6B), - 0x4C => array(0x6C), - 0x4D => array(0x6D), - 0x4E => array(0x6E), - 0x4F => array(0x6F), - 0x50 => array(0x70), - 0x51 => array(0x71), - 0x52 => array(0x72), - 0x53 => array(0x73), - 0x54 => array(0x74), - 0x55 => array(0x75), - 0x56 => array(0x76), - 0x57 => array(0x77), - 0x58 => array(0x78), - 0x59 => array(0x79), - 0x5A => array(0x7A), - 0xB5 => array(0x3BC), - 0xC0 => array(0xE0), - 0xC1 => array(0xE1), - 0xC2 => array(0xE2), - 0xC3 => array(0xE3), - 0xC4 => array(0xE4), - 0xC5 => array(0xE5), - 0xC6 => array(0xE6), - 0xC7 => array(0xE7), - 0xC8 => array(0xE8), - 0xC9 => array(0xE9), - 0xCA => array(0xEA), - 0xCB => array(0xEB), - 0xCC => array(0xEC), - 0xCD => array(0xED), - 0xCE => array(0xEE), - 0xCF => array(0xEF), - 0xD0 => array(0xF0), - 0xD1 => array(0xF1), - 0xD2 => array(0xF2), - 0xD3 => array(0xF3), - 0xD4 => array(0xF4), - 0xD5 => array(0xF5), - 0xD6 => array(0xF6), - 0xD8 => array(0xF8), - 0xD9 => array(0xF9), - 0xDA => array(0xFA), - 0xDB => array(0xFB), - 0xDC => array(0xFC), - 0xDD => array(0xFD), - 0xDE => array(0xFE), - 0xDF => array(0x73, 0x73), - 0x100 => array(0x101), - 0x102 => array(0x103), - 0x104 => array(0x105), - 0x106 => array(0x107), - 0x108 => array(0x109), - 0x10A => array(0x10B), - 0x10C => array(0x10D), - 0x10E => array(0x10F), - 0x110 => array(0x111), - 0x112 => array(0x113), - 0x114 => array(0x115), - 0x116 => array(0x117), - 0x118 => array(0x119), - 0x11A => array(0x11B), - 0x11C => array(0x11D), - 0x11E => array(0x11F), - 0x120 => array(0x121), - 0x122 => array(0x123), - 0x124 => array(0x125), - 0x126 => array(0x127), - 0x128 => array(0x129), - 0x12A => array(0x12B), - 0x12C => array(0x12D), - 0x12E => array(0x12F), - 0x130 => array(0x69, 0x307), - 0x132 => array(0x133), - 0x134 => array(0x135), - 0x136 => array(0x137), - 0x139 => array(0x13A), - 0x13B => array(0x13C), - 0x13D => array(0x13E), - 0x13F => array(0x140), - 0x141 => array(0x142), - 0x143 => array(0x144), - 0x145 => array(0x146), - 0x147 => array(0x148), - 0x149 => array(0x2BC, 0x6E), - 0x14A => array(0x14B), - 0x14C => array(0x14D), - 0x14E => array(0x14F), - 0x150 => array(0x151), - 0x152 => array(0x153), - 0x154 => array(0x155), - 0x156 => array(0x157), - 0x158 => array(0x159), - 0x15A => array(0x15B), - 0x15C => array(0x15D), - 0x15E => array(0x15F), - 0x160 => array(0x161), - 0x162 => array(0x163), - 0x164 => array(0x165), - 0x166 => array(0x167), - 0x168 => array(0x169), - 0x16A => array(0x16B), - 0x16C => array(0x16D), - 0x16E => array(0x16F), - 0x170 => array(0x171), - 0x172 => array(0x173), - 0x174 => array(0x175), - 0x176 => array(0x177), - 0x178 => array(0xFF), - 0x179 => array(0x17A), - 0x17B => array(0x17C), - 0x17D => array(0x17E), - 0x17F => array(0x73), - 0x181 => array(0x253), - 0x182 => array(0x183), - 0x184 => array(0x185), - 0x186 => array(0x254), - 0x187 => array(0x188), - 0x189 => array(0x256), - 0x18A => array(0x257), - 0x18B => array(0x18C), - 0x18E => array(0x1DD), - 0x18F => array(0x259), - 0x190 => array(0x25B), - 0x191 => array(0x192), - 0x193 => array(0x260), - 0x194 => array(0x263), - 0x196 => array(0x269), - 0x197 => array(0x268), - 0x198 => array(0x199), - 0x19C => array(0x26F), - 0x19D => array(0x272), - 0x19F => array(0x275), - 0x1A0 => array(0x1A1), - 0x1A2 => array(0x1A3), - 0x1A4 => array(0x1A5), - 0x1A6 => array(0x280), - 0x1A7 => array(0x1A8), - 0x1A9 => array(0x283), - 0x1AC => array(0x1AD), - 0x1AE => array(0x288), - 0x1AF => array(0x1B0), - 0x1B1 => array(0x28A), - 0x1B2 => array(0x28B), - 0x1B3 => array(0x1B4), - 0x1B5 => array(0x1B6), - 0x1B7 => array(0x292), - 0x1B8 => array(0x1B9), - 0x1BC => array(0x1BD), - 0x1C4 => array(0x1C6), - 0x1C5 => array(0x1C6), - 0x1C7 => array(0x1C9), - 0x1C8 => array(0x1C9), - 0x1CA => array(0x1CC), - 0x1CB => array(0x1CC), - 0x1CD => array(0x1CE), - 0x1CF => array(0x1D0), - 0x1D1 => array(0x1D2), - 0x1D3 => array(0x1D4), - 0x1D5 => array(0x1D6), - 0x1D7 => array(0x1D8), - 0x1D9 => array(0x1DA), - 0x1DB => array(0x1DC), - 0x1DE => array(0x1DF), - 0x1E0 => array(0x1E1), - 0x1E2 => array(0x1E3), - 0x1E4 => array(0x1E5), - 0x1E6 => array(0x1E7), - 0x1E8 => array(0x1E9), - 0x1EA => array(0x1EB), - 0x1EC => array(0x1ED), - 0x1EE => array(0x1EF), - 0x1F0 => array(0x6A, 0x30C), - 0x1F1 => array(0x1F3), - 0x1F2 => array(0x1F3), - 0x1F4 => array(0x1F5), - 0x1F6 => array(0x195), - 0x1F7 => array(0x1BF), - 0x1F8 => array(0x1F9), - 0x1FA => array(0x1FB), - 0x1FC => array(0x1FD), - 0x1FE => array(0x1FF), - 0x200 => array(0x201), - 0x202 => array(0x203), - 0x204 => array(0x205), - 0x206 => array(0x207), - 0x208 => array(0x209), - 0x20A => array(0x20B), - 0x20C => array(0x20D), - 0x20E => array(0x20F), - 0x210 => array(0x211), - 0x212 => array(0x213), - 0x214 => array(0x215), - 0x216 => array(0x217), - 0x218 => array(0x219), - 0x21A => array(0x21B), - 0x21C => array(0x21D), - 0x21E => array(0x21F), - 0x220 => array(0x19E), - 0x222 => array(0x223), - 0x224 => array(0x225), - 0x226 => array(0x227), - 0x228 => array(0x229), - 0x22A => array(0x22B), - 0x22C => array(0x22D), - 0x22E => array(0x22F), - 0x230 => array(0x231), - 0x232 => array(0x233), - 0x345 => array(0x3B9), - 0x37A => array(0x20, 0x3B9), - 0x386 => array(0x3AC), - 0x388 => array(0x3AD), - 0x389 => array(0x3AE), - 0x38A => array(0x3AF), - 0x38C => array(0x3CC), - 0x38E => array(0x3CD), - 0x38F => array(0x3CE), - 0x390 => array(0x3B9, 0x308, 0x301), - 0x391 => array(0x3B1), - 0x392 => array(0x3B2), - 0x393 => array(0x3B3), - 0x394 => array(0x3B4), - 0x395 => array(0x3B5), - 0x396 => array(0x3B6), - 0x397 => array(0x3B7), - 0x398 => array(0x3B8), - 0x399 => array(0x3B9), - 0x39A => array(0x3BA), - 0x39B => array(0x3BB), - 0x39C => array(0x3BC), - 0x39D => array(0x3BD), - 0x39E => array(0x3BE), - 0x39F => array(0x3BF), - 0x3A0 => array(0x3C0), - 0x3A1 => array(0x3C1), - 0x3A3 => array(0x3C3), - 0x3A4 => array(0x3C4), - 0x3A5 => array(0x3C5), - 0x3A6 => array(0x3C6), - 0x3A7 => array(0x3C7), - 0x3A8 => array(0x3C8), - 0x3A9 => array(0x3C9), - 0x3AA => array(0x3CA), - 0x3AB => array(0x3CB), - 0x3B0 => array(0x3C5, 0x308, 0x301), - 0x3C2 => array(0x3C3), - 0x3D0 => array(0x3B2), - 0x3D1 => array(0x3B8), - 0x3D2 => array(0x3C5), - 0x3D3 => array(0x3CD), - 0x3D4 => array(0x3CB), - 0x3D5 => array(0x3C6), - 0x3D6 => array(0x3C0), - 0x3D8 => array(0x3D9), - 0x3DA => array(0x3DB), - 0x3DC => array(0x3DD), - 0x3DE => array(0x3DF), - 0x3E0 => array(0x3E1), - 0x3E2 => array(0x3E3), - 0x3E4 => array(0x3E5), - 0x3E6 => array(0x3E7), - 0x3E8 => array(0x3E9), - 0x3EA => array(0x3EB), - 0x3EC => array(0x3ED), - 0x3EE => array(0x3EF), - 0x3F0 => array(0x3BA), - 0x3F1 => array(0x3C1), - 0x3F2 => array(0x3C3), - 0x3F4 => array(0x3B8), - 0x3F5 => array(0x3B5), - 0x400 => array(0x450), - 0x401 => array(0x451), - 0x402 => array(0x452), - 0x403 => array(0x453), - 0x404 => array(0x454), - 0x405 => array(0x455), - 0x406 => array(0x456), - 0x407 => array(0x457), - 0x408 => array(0x458), - 0x409 => array(0x459), - 0x40A => array(0x45A), - 0x40B => array(0x45B), - 0x40C => array(0x45C), - 0x40D => array(0x45D), - 0x40E => array(0x45E), - 0x40F => array(0x45F), - 0x410 => array(0x430), - 0x411 => array(0x431), - 0x412 => array(0x432), - 0x413 => array(0x433), - 0x414 => array(0x434), - 0x415 => array(0x435), - 0x416 => array(0x436), - 0x417 => array(0x437), - 0x418 => array(0x438), - 0x419 => array(0x439), - 0x41A => array(0x43A), - 0x41B => array(0x43B), - 0x41C => array(0x43C), - 0x41D => array(0x43D), - 0x41E => array(0x43E), - 0x41F => array(0x43F), - 0x420 => array(0x440), - 0x421 => array(0x441), - 0x422 => array(0x442), - 0x423 => array(0x443), - 0x424 => array(0x444), - 0x425 => array(0x445), - 0x426 => array(0x446), - 0x427 => array(0x447), - 0x428 => array(0x448), - 0x429 => array(0x449), - 0x42A => array(0x44A), - 0x42B => array(0x44B), - 0x42C => array(0x44C), - 0x42D => array(0x44D), - 0x42E => array(0x44E), - 0x42F => array(0x44F), - 0x460 => array(0x461), - 0x462 => array(0x463), - 0x464 => array(0x465), - 0x466 => array(0x467), - 0x468 => array(0x469), - 0x46A => array(0x46B), - 0x46C => array(0x46D), - 0x46E => array(0x46F), - 0x470 => array(0x471), - 0x472 => array(0x473), - 0x474 => array(0x475), - 0x476 => array(0x477), - 0x478 => array(0x479), - 0x47A => array(0x47B), - 0x47C => array(0x47D), - 0x47E => array(0x47F), - 0x480 => array(0x481), - 0x48A => array(0x48B), - 0x48C => array(0x48D), - 0x48E => array(0x48F), - 0x490 => array(0x491), - 0x492 => array(0x493), - 0x494 => array(0x495), - 0x496 => array(0x497), - 0x498 => array(0x499), - 0x49A => array(0x49B), - 0x49C => array(0x49D), - 0x49E => array(0x49F), - 0x4A0 => array(0x4A1), - 0x4A2 => array(0x4A3), - 0x4A4 => array(0x4A5), - 0x4A6 => array(0x4A7), - 0x4A8 => array(0x4A9), - 0x4AA => array(0x4AB), - 0x4AC => array(0x4AD), - 0x4AE => array(0x4AF), - 0x4B0 => array(0x4B1), - 0x4B2 => array(0x4B3), - 0x4B4 => array(0x4B5), - 0x4B6 => array(0x4B7), - 0x4B8 => array(0x4B9), - 0x4BA => array(0x4BB), - 0x4BC => array(0x4BD), - 0x4BE => array(0x4BF), - 0x4C1 => array(0x4C2), - 0x4C3 => array(0x4C4), - 0x4C5 => array(0x4C6), - 0x4C7 => array(0x4C8), - 0x4C9 => array(0x4CA), - 0x4CB => array(0x4CC), - 0x4CD => array(0x4CE), - 0x4D0 => array(0x4D1), - 0x4D2 => array(0x4D3), - 0x4D4 => array(0x4D5), - 0x4D6 => array(0x4D7), - 0x4D8 => array(0x4D9), - 0x4DA => array(0x4DB), - 0x4DC => array(0x4DD), - 0x4DE => array(0x4DF), - 0x4E0 => array(0x4E1), - 0x4E2 => array(0x4E3), - 0x4E4 => array(0x4E5), - 0x4E6 => array(0x4E7), - 0x4E8 => array(0x4E9), - 0x4EA => array(0x4EB), - 0x4EC => array(0x4ED), - 0x4EE => array(0x4EF), - 0x4F0 => array(0x4F1), - 0x4F2 => array(0x4F3), - 0x4F4 => array(0x4F5), - 0x4F8 => array(0x4F9), - 0x500 => array(0x501), - 0x502 => array(0x503), - 0x504 => array(0x505), - 0x506 => array(0x507), - 0x508 => array(0x509), - 0x50A => array(0x50B), - 0x50C => array(0x50D), - 0x50E => array(0x50F), - 0x531 => array(0x561), - 0x532 => array(0x562), - 0x533 => array(0x563), - 0x534 => array(0x564), - 0x535 => array(0x565), - 0x536 => array(0x566), - 0x537 => array(0x567), - 0x538 => array(0x568), - 0x539 => array(0x569), - 0x53A => array(0x56A), - 0x53B => array(0x56B), - 0x53C => array(0x56C), - 0x53D => array(0x56D), - 0x53E => array(0x56E), - 0x53F => array(0x56F), - 0x540 => array(0x570), - 0x541 => array(0x571), - 0x542 => array(0x572), - 0x543 => array(0x573), - 0x544 => array(0x574), - 0x545 => array(0x575), - 0x546 => array(0x576), - 0x547 => array(0x577), - 0x548 => array(0x578), - 0x549 => array(0x579), - 0x54A => array(0x57A), - 0x54B => array(0x57B), - 0x54C => array(0x57C), - 0x54D => array(0x57D), - 0x54E => array(0x57E), - 0x54F => array(0x57F), - 0x550 => array(0x580), - 0x551 => array(0x581), - 0x552 => array(0x582), - 0x553 => array(0x583), - 0x554 => array(0x584), - 0x555 => array(0x585), - 0x556 => array(0x586), - 0x587 => array(0x565, 0x582), - 0x1E00 => array(0x1E01), - 0x1E02 => array(0x1E03), - 0x1E04 => array(0x1E05), - 0x1E06 => array(0x1E07), - 0x1E08 => array(0x1E09), - 0x1E0A => array(0x1E0B), - 0x1E0C => array(0x1E0D), - 0x1E0E => array(0x1E0F), - 0x1E10 => array(0x1E11), - 0x1E12 => array(0x1E13), - 0x1E14 => array(0x1E15), - 0x1E16 => array(0x1E17), - 0x1E18 => array(0x1E19), - 0x1E1A => array(0x1E1B), - 0x1E1C => array(0x1E1D), - 0x1E1E => array(0x1E1F), - 0x1E20 => array(0x1E21), - 0x1E22 => array(0x1E23), - 0x1E24 => array(0x1E25), - 0x1E26 => array(0x1E27), - 0x1E28 => array(0x1E29), - 0x1E2A => array(0x1E2B), - 0x1E2C => array(0x1E2D), - 0x1E2E => array(0x1E2F), - 0x1E30 => array(0x1E31), - 0x1E32 => array(0x1E33), - 0x1E34 => array(0x1E35), - 0x1E36 => array(0x1E37), - 0x1E38 => array(0x1E39), - 0x1E3A => array(0x1E3B), - 0x1E3C => array(0x1E3D), - 0x1E3E => array(0x1E3F), - 0x1E40 => array(0x1E41), - 0x1E42 => array(0x1E43), - 0x1E44 => array(0x1E45), - 0x1E46 => array(0x1E47), - 0x1E48 => array(0x1E49), - 0x1E4A => array(0x1E4B), - 0x1E4C => array(0x1E4D), - 0x1E4E => array(0x1E4F), - 0x1E50 => array(0x1E51), - 0x1E52 => array(0x1E53), - 0x1E54 => array(0x1E55), - 0x1E56 => array(0x1E57), - 0x1E58 => array(0x1E59), - 0x1E5A => array(0x1E5B), - 0x1E5C => array(0x1E5D), - 0x1E5E => array(0x1E5F), - 0x1E60 => array(0x1E61), - 0x1E62 => array(0x1E63), - 0x1E64 => array(0x1E65), - 0x1E66 => array(0x1E67), - 0x1E68 => array(0x1E69), - 0x1E6A => array(0x1E6B), - 0x1E6C => array(0x1E6D), - 0x1E6E => array(0x1E6F), - 0x1E70 => array(0x1E71), - 0x1E72 => array(0x1E73), - 0x1E74 => array(0x1E75), - 0x1E76 => array(0x1E77), - 0x1E78 => array(0x1E79), - 0x1E7A => array(0x1E7B), - 0x1E7C => array(0x1E7D), - 0x1E7E => array(0x1E7F), - 0x1E80 => array(0x1E81), - 0x1E82 => array(0x1E83), - 0x1E84 => array(0x1E85), - 0x1E86 => array(0x1E87), - 0x1E88 => array(0x1E89), - 0x1E8A => array(0x1E8B), - 0x1E8C => array(0x1E8D), - 0x1E8E => array(0x1E8F), - 0x1E90 => array(0x1E91), - 0x1E92 => array(0x1E93), - 0x1E94 => array(0x1E95), - 0x1E96 => array(0x68, 0x331), - 0x1E97 => array(0x74, 0x308), - 0x1E98 => array(0x77, 0x30A), - 0x1E99 => array(0x79, 0x30A), - 0x1E9A => array(0x61, 0x2BE), - 0x1E9B => array(0x1E61), - 0x1EA0 => array(0x1EA1), - 0x1EA2 => array(0x1EA3), - 0x1EA4 => array(0x1EA5), - 0x1EA6 => array(0x1EA7), - 0x1EA8 => array(0x1EA9), - 0x1EAA => array(0x1EAB), - 0x1EAC => array(0x1EAD), - 0x1EAE => array(0x1EAF), - 0x1EB0 => array(0x1EB1), - 0x1EB2 => array(0x1EB3), - 0x1EB4 => array(0x1EB5), - 0x1EB6 => array(0x1EB7), - 0x1EB8 => array(0x1EB9), - 0x1EBA => array(0x1EBB), - 0x1EBC => array(0x1EBD), - 0x1EBE => array(0x1EBF), - 0x1EC0 => array(0x1EC1), - 0x1EC2 => array(0x1EC3), - 0x1EC4 => array(0x1EC5), - 0x1EC6 => array(0x1EC7), - 0x1EC8 => array(0x1EC9), - 0x1ECA => array(0x1ECB), - 0x1ECC => array(0x1ECD), - 0x1ECE => array(0x1ECF), - 0x1ED0 => array(0x1ED1), - 0x1ED2 => array(0x1ED3), - 0x1ED4 => array(0x1ED5), - 0x1ED6 => array(0x1ED7), - 0x1ED8 => array(0x1ED9), - 0x1EDA => array(0x1EDB), - 0x1EDC => array(0x1EDD), - 0x1EDE => array(0x1EDF), - 0x1EE0 => array(0x1EE1), - 0x1EE2 => array(0x1EE3), - 0x1EE4 => array(0x1EE5), - 0x1EE6 => array(0x1EE7), - 0x1EE8 => array(0x1EE9), - 0x1EEA => array(0x1EEB), - 0x1EEC => array(0x1EED), - 0x1EEE => array(0x1EEF), - 0x1EF0 => array(0x1EF1), - 0x1EF2 => array(0x1EF3), - 0x1EF4 => array(0x1EF5), - 0x1EF6 => array(0x1EF7), - 0x1EF8 => array(0x1EF9), - 0x1F08 => array(0x1F00), - 0x1F09 => array(0x1F01), - 0x1F0A => array(0x1F02), - 0x1F0B => array(0x1F03), - 0x1F0C => array(0x1F04), - 0x1F0D => array(0x1F05), - 0x1F0E => array(0x1F06), - 0x1F0F => array(0x1F07), - 0x1F18 => array(0x1F10), - 0x1F19 => array(0x1F11), - 0x1F1A => array(0x1F12), - 0x1F1B => array(0x1F13), - 0x1F1C => array(0x1F14), - 0x1F1D => array(0x1F15), - 0x1F28 => array(0x1F20), - 0x1F29 => array(0x1F21), - 0x1F2A => array(0x1F22), - 0x1F2B => array(0x1F23), - 0x1F2C => array(0x1F24), - 0x1F2D => array(0x1F25), - 0x1F2E => array(0x1F26), - 0x1F2F => array(0x1F27), - 0x1F38 => array(0x1F30), - 0x1F39 => array(0x1F31), - 0x1F3A => array(0x1F32), - 0x1F3B => array(0x1F33), - 0x1F3C => array(0x1F34), - 0x1F3D => array(0x1F35), - 0x1F3E => array(0x1F36), - 0x1F3F => array(0x1F37), - 0x1F48 => array(0x1F40), - 0x1F49 => array(0x1F41), - 0x1F4A => array(0x1F42), - 0x1F4B => array(0x1F43), - 0x1F4C => array(0x1F44), - 0x1F4D => array(0x1F45), - 0x1F50 => array(0x3C5, 0x313), - 0x1F52 => array(0x3C5, 0x313, 0x300), - 0x1F54 => array(0x3C5, 0x313, 0x301), - 0x1F56 => array(0x3C5, 0x313, 0x342), - 0x1F59 => array(0x1F51), - 0x1F5B => array(0x1F53), - 0x1F5D => array(0x1F55), - 0x1F5F => array(0x1F57), - 0x1F68 => array(0x1F60), - 0x1F69 => array(0x1F61), - 0x1F6A => array(0x1F62), - 0x1F6B => array(0x1F63), - 0x1F6C => array(0x1F64), - 0x1F6D => array(0x1F65), - 0x1F6E => array(0x1F66), - 0x1F6F => array(0x1F67), - 0x1F80 => array(0x1F00, 0x3B9), - 0x1F81 => array(0x1F01, 0x3B9), - 0x1F82 => array(0x1F02, 0x3B9), - 0x1F83 => array(0x1F03, 0x3B9), - 0x1F84 => array(0x1F04, 0x3B9), - 0x1F85 => array(0x1F05, 0x3B9), - 0x1F86 => array(0x1F06, 0x3B9), - 0x1F87 => array(0x1F07, 0x3B9), - 0x1F88 => array(0x1F00, 0x3B9), - 0x1F89 => array(0x1F01, 0x3B9), - 0x1F8A => array(0x1F02, 0x3B9), - 0x1F8B => array(0x1F03, 0x3B9), - 0x1F8C => array(0x1F04, 0x3B9), - 0x1F8D => array(0x1F05, 0x3B9), - 0x1F8E => array(0x1F06, 0x3B9), - 0x1F8F => array(0x1F07, 0x3B9), - 0x1F90 => array(0x1F20, 0x3B9), - 0x1F91 => array(0x1F21, 0x3B9), - 0x1F92 => array(0x1F22, 0x3B9), - 0x1F93 => array(0x1F23, 0x3B9), - 0x1F94 => array(0x1F24, 0x3B9), - 0x1F95 => array(0x1F25, 0x3B9), - 0x1F96 => array(0x1F26, 0x3B9), - 0x1F97 => array(0x1F27, 0x3B9), - 0x1F98 => array(0x1F20, 0x3B9), - 0x1F99 => array(0x1F21, 0x3B9), - 0x1F9A => array(0x1F22, 0x3B9), - 0x1F9B => array(0x1F23, 0x3B9), - 0x1F9C => array(0x1F24, 0x3B9), - 0x1F9D => array(0x1F25, 0x3B9), - 0x1F9E => array(0x1F26, 0x3B9), - 0x1F9F => array(0x1F27, 0x3B9), - 0x1FA0 => array(0x1F60, 0x3B9), - 0x1FA1 => array(0x1F61, 0x3B9), - 0x1FA2 => array(0x1F62, 0x3B9), - 0x1FA3 => array(0x1F63, 0x3B9), - 0x1FA4 => array(0x1F64, 0x3B9), - 0x1FA5 => array(0x1F65, 0x3B9), - 0x1FA6 => array(0x1F66, 0x3B9), - 0x1FA7 => array(0x1F67, 0x3B9), - 0x1FA8 => array(0x1F60, 0x3B9), - 0x1FA9 => array(0x1F61, 0x3B9), - 0x1FAA => array(0x1F62, 0x3B9), - 0x1FAB => array(0x1F63, 0x3B9), - 0x1FAC => array(0x1F64, 0x3B9), - 0x1FAD => array(0x1F65, 0x3B9), - 0x1FAE => array(0x1F66, 0x3B9), - 0x1FAF => array(0x1F67, 0x3B9), - 0x1FB2 => array(0x1F70, 0x3B9), - 0x1FB3 => array(0x3B1, 0x3B9), - 0x1FB4 => array(0x3AC, 0x3B9), - 0x1FB6 => array(0x3B1, 0x342), - 0x1FB7 => array(0x3B1, 0x342, 0x3B9), - 0x1FB8 => array(0x1FB0), - 0x1FB9 => array(0x1FB1), - 0x1FBA => array(0x1F70), - 0x1FBB => array(0x1F71), - 0x1FBC => array(0x3B1, 0x3B9), - 0x1FBE => array(0x3B9), - 0x1FC2 => array(0x1F74, 0x3B9), - 0x1FC3 => array(0x3B7, 0x3B9), - 0x1FC4 => array(0x3AE, 0x3B9), - 0x1FC6 => array(0x3B7, 0x342), - 0x1FC7 => array(0x3B7, 0x342, 0x3B9), - 0x1FC8 => array(0x1F72), - 0x1FC9 => array(0x1F73), - 0x1FCA => array(0x1F74), - 0x1FCB => array(0x1F75), - 0x1FCC => array(0x3B7, 0x3B9), - 0x1FD2 => array(0x3B9, 0x308, 0x300), - 0x1FD3 => array(0x3B9, 0x308, 0x301), - 0x1FD6 => array(0x3B9, 0x342), - 0x1FD7 => array(0x3B9, 0x308, 0x342), - 0x1FD8 => array(0x1FD0), - 0x1FD9 => array(0x1FD1), - 0x1FDA => array(0x1F76), - 0x1FDB => array(0x1F77), - 0x1FE2 => array(0x3C5, 0x308, 0x300), - 0x1FE3 => array(0x3C5, 0x308, 0x301), - 0x1FE4 => array(0x3C1, 0x313), - 0x1FE6 => array(0x3C5, 0x342), - 0x1FE7 => array(0x3C5, 0x308, 0x342), - 0x1FE8 => array(0x1FE0), - 0x1FE9 => array(0x1FE1), - 0x1FEA => array(0x1F7A), - 0x1FEB => array(0x1F7B), - 0x1FEC => array(0x1FE5), - 0x1FF2 => array(0x1F7C, 0x3B9), - 0x1FF3 => array(0x3C9, 0x3B9), - 0x1FF4 => array(0x3CE, 0x3B9), - 0x1FF6 => array(0x3C9, 0x342), - 0x1FF7 => array(0x3C9, 0x342, 0x3B9), - 0x1FF8 => array(0x1F78), - 0x1FF9 => array(0x1F79), - 0x1FFA => array(0x1F7C), - 0x1FFB => array(0x1F7D), - 0x1FFC => array(0x3C9, 0x3B9), - 0x20A8 => array(0x72, 0x73), - 0x2102 => array(0x63), - 0x2103 => array(0xB0, 0x63), - 0x2107 => array(0x25B), - 0x2109 => array(0xB0, 0x66), - 0x210B => array(0x68), - 0x210C => array(0x68), - 0x210D => array(0x68), - 0x2110 => array(0x69), - 0x2111 => array(0x69), - 0x2112 => array(0x6C), - 0x2115 => array(0x6E), - 0x2116 => array(0x6E, 0x6F), - 0x2119 => array(0x70), - 0x211A => array(0x71), - 0x211B => array(0x72), - 0x211C => array(0x72), - 0x211D => array(0x72), - 0x2120 => array(0x73, 0x6D), - 0x2121 => array(0x74, 0x65, 0x6C), - 0x2122 => array(0x74, 0x6D), - 0x2124 => array(0x7A), - 0x2126 => array(0x3C9), - 0x2128 => array(0x7A), - 0x212A => array(0x6B), - 0x212B => array(0xE5), - 0x212C => array(0x62), - 0x212D => array(0x63), - 0x2130 => array(0x65), - 0x2131 => array(0x66), - 0x2133 => array(0x6D), - 0x213E => array(0x3B3), - 0x213F => array(0x3C0), - 0x2145 => array(0x64), - 0x2160 => array(0x2170), - 0x2161 => array(0x2171), - 0x2162 => array(0x2172), - 0x2163 => array(0x2173), - 0x2164 => array(0x2174), - 0x2165 => array(0x2175), - 0x2166 => array(0x2176), - 0x2167 => array(0x2177), - 0x2168 => array(0x2178), - 0x2169 => array(0x2179), - 0x216A => array(0x217A), - 0x216B => array(0x217B), - 0x216C => array(0x217C), - 0x216D => array(0x217D), - 0x216E => array(0x217E), - 0x216F => array(0x217F), - 0x24B6 => array(0x24D0), - 0x24B7 => array(0x24D1), - 0x24B8 => array(0x24D2), - 0x24B9 => array(0x24D3), - 0x24BA => array(0x24D4), - 0x24BB => array(0x24D5), - 0x24BC => array(0x24D6), - 0x24BD => array(0x24D7), - 0x24BE => array(0x24D8), - 0x24BF => array(0x24D9), - 0x24C0 => array(0x24DA), - 0x24C1 => array(0x24DB), - 0x24C2 => array(0x24DC), - 0x24C3 => array(0x24DD), - 0x24C4 => array(0x24DE), - 0x24C5 => array(0x24DF), - 0x24C6 => array(0x24E0), - 0x24C7 => array(0x24E1), - 0x24C8 => array(0x24E2), - 0x24C9 => array(0x24E3), - 0x24CA => array(0x24E4), - 0x24CB => array(0x24E5), - 0x24CC => array(0x24E6), - 0x24CD => array(0x24E7), - 0x24CE => array(0x24E8), - 0x24CF => array(0x24E9), - 0x3371 => array(0x68, 0x70, 0x61), - 0x3373 => array(0x61, 0x75), - 0x3375 => array(0x6F, 0x76), - 0x3380 => array(0x70, 0x61), - 0x3381 => array(0x6E, 0x61), - 0x3382 => array(0x3BC, 0x61), - 0x3383 => array(0x6D, 0x61), - 0x3384 => array(0x6B, 0x61), - 0x3385 => array(0x6B, 0x62), - 0x3386 => array(0x6D, 0x62), - 0x3387 => array(0x67, 0x62), - 0x338A => array(0x70, 0x66), - 0x338B => array(0x6E, 0x66), - 0x338C => array(0x3BC, 0x66), - 0x3390 => array(0x68, 0x7A), - 0x3391 => array(0x6B, 0x68, 0x7A), - 0x3392 => array(0x6D, 0x68, 0x7A), - 0x3393 => array(0x67, 0x68, 0x7A), - 0x3394 => array(0x74, 0x68, 0x7A), - 0x33A9 => array(0x70, 0x61), - 0x33AA => array(0x6B, 0x70, 0x61), - 0x33AB => array(0x6D, 0x70, 0x61), - 0x33AC => array(0x67, 0x70, 0x61), - 0x33B4 => array(0x70, 0x76), - 0x33B5 => array(0x6E, 0x76), - 0x33B6 => array(0x3BC, 0x76), - 0x33B7 => array(0x6D, 0x76), - 0x33B8 => array(0x6B, 0x76), - 0x33B9 => array(0x6D, 0x76), - 0x33BA => array(0x70, 0x77), - 0x33BB => array(0x6E, 0x77), - 0x33BC => array(0x3BC, 0x77), - 0x33BD => array(0x6D, 0x77), - 0x33BE => array(0x6B, 0x77), - 0x33BF => array(0x6D, 0x77), - 0x33C0 => array(0x6B, 0x3C9), - 0x33C1 => array(0x6D, 0x3C9), - /* 0x33C2 => array(0x61, 0x2E, 0x6D, 0x2E), */ - 0x33C3 => array(0x62, 0x71), - 0x33C6 => array(0x63, 0x2215, 0x6B, 0x67), - 0x33C7 => array(0x63, 0x6F, 0x2E), - 0x33C8 => array(0x64, 0x62), - 0x33C9 => array(0x67, 0x79), - 0x33CB => array(0x68, 0x70), - 0x33CD => array(0x6B, 0x6B), - 0x33CE => array(0x6B, 0x6D), - 0x33D7 => array(0x70, 0x68), - 0x33D9 => array(0x70, 0x70, 0x6D), - 0x33DA => array(0x70, 0x72), - 0x33DC => array(0x73, 0x76), - 0x33DD => array(0x77, 0x62), - 0xFB00 => array(0x66, 0x66), - 0xFB01 => array(0x66, 0x69), - 0xFB02 => array(0x66, 0x6C), - 0xFB03 => array(0x66, 0x66, 0x69), - 0xFB04 => array(0x66, 0x66, 0x6C), - 0xFB05 => array(0x73, 0x74), - 0xFB06 => array(0x73, 0x74), - 0xFB13 => array(0x574, 0x576), - 0xFB14 => array(0x574, 0x565), - 0xFB15 => array(0x574, 0x56B), - 0xFB16 => array(0x57E, 0x576), - 0xFB17 => array(0x574, 0x56D), - 0xFF21 => array(0xFF41), - 0xFF22 => array(0xFF42), - 0xFF23 => array(0xFF43), - 0xFF24 => array(0xFF44), - 0xFF25 => array(0xFF45), - 0xFF26 => array(0xFF46), - 0xFF27 => array(0xFF47), - 0xFF28 => array(0xFF48), - 0xFF29 => array(0xFF49), - 0xFF2A => array(0xFF4A), - 0xFF2B => array(0xFF4B), - 0xFF2C => array(0xFF4C), - 0xFF2D => array(0xFF4D), - 0xFF2E => array(0xFF4E), - 0xFF2F => array(0xFF4F), - 0xFF30 => array(0xFF50), - 0xFF31 => array(0xFF51), - 0xFF32 => array(0xFF52), - 0xFF33 => array(0xFF53), - 0xFF34 => array(0xFF54), - 0xFF35 => array(0xFF55), - 0xFF36 => array(0xFF56), - 0xFF37 => array(0xFF57), - 0xFF38 => array(0xFF58), - 0xFF39 => array(0xFF59), - 0xFF3A => array(0xFF5A), - 0x10400 => array(0x10428), - 0x10401 => array(0x10429), - 0x10402 => array(0x1042A), - 0x10403 => array(0x1042B), - 0x10404 => array(0x1042C), - 0x10405 => array(0x1042D), - 0x10406 => array(0x1042E), - 0x10407 => array(0x1042F), - 0x10408 => array(0x10430), - 0x10409 => array(0x10431), - 0x1040A => array(0x10432), - 0x1040B => array(0x10433), - 0x1040C => array(0x10434), - 0x1040D => array(0x10435), - 0x1040E => array(0x10436), - 0x1040F => array(0x10437), - 0x10410 => array(0x10438), - 0x10411 => array(0x10439), - 0x10412 => array(0x1043A), - 0x10413 => array(0x1043B), - 0x10414 => array(0x1043C), - 0x10415 => array(0x1043D), - 0x10416 => array(0x1043E), - 0x10417 => array(0x1043F), - 0x10418 => array(0x10440), - 0x10419 => array(0x10441), - 0x1041A => array(0x10442), - 0x1041B => array(0x10443), - 0x1041C => array(0x10444), - 0x1041D => array(0x10445), - 0x1041E => array(0x10446), - 0x1041F => array(0x10447), - 0x10420 => array(0x10448), - 0x10421 => array(0x10449), - 0x10422 => array(0x1044A), - 0x10423 => array(0x1044B), - 0x10424 => array(0x1044C), - 0x10425 => array(0x1044D), - 0x1D400 => array(0x61), - 0x1D401 => array(0x62), - 0x1D402 => array(0x63), - 0x1D403 => array(0x64), - 0x1D404 => array(0x65), - 0x1D405 => array(0x66), - 0x1D406 => array(0x67), - 0x1D407 => array(0x68), - 0x1D408 => array(0x69), - 0x1D409 => array(0x6A), - 0x1D40A => array(0x6B), - 0x1D40B => array(0x6C), - 0x1D40C => array(0x6D), - 0x1D40D => array(0x6E), - 0x1D40E => array(0x6F), - 0x1D40F => array(0x70), - 0x1D410 => array(0x71), - 0x1D411 => array(0x72), - 0x1D412 => array(0x73), - 0x1D413 => array(0x74), - 0x1D414 => array(0x75), - 0x1D415 => array(0x76), - 0x1D416 => array(0x77), - 0x1D417 => array(0x78), - 0x1D418 => array(0x79), - 0x1D419 => array(0x7A), - 0x1D434 => array(0x61), - 0x1D435 => array(0x62), - 0x1D436 => array(0x63), - 0x1D437 => array(0x64), - 0x1D438 => array(0x65), - 0x1D439 => array(0x66), - 0x1D43A => array(0x67), - 0x1D43B => array(0x68), - 0x1D43C => array(0x69), - 0x1D43D => array(0x6A), - 0x1D43E => array(0x6B), - 0x1D43F => array(0x6C), - 0x1D440 => array(0x6D), - 0x1D441 => array(0x6E), - 0x1D442 => array(0x6F), - 0x1D443 => array(0x70), - 0x1D444 => array(0x71), - 0x1D445 => array(0x72), - 0x1D446 => array(0x73), - 0x1D447 => array(0x74), - 0x1D448 => array(0x75), - 0x1D449 => array(0x76), - 0x1D44A => array(0x77), - 0x1D44B => array(0x78), - 0x1D44C => array(0x79), - 0x1D44D => array(0x7A), - 0x1D468 => array(0x61), - 0x1D469 => array(0x62), - 0x1D46A => array(0x63), - 0x1D46B => array(0x64), - 0x1D46C => array(0x65), - 0x1D46D => array(0x66), - 0x1D46E => array(0x67), - 0x1D46F => array(0x68), - 0x1D470 => array(0x69), - 0x1D471 => array(0x6A), - 0x1D472 => array(0x6B), - 0x1D473 => array(0x6C), - 0x1D474 => array(0x6D), - 0x1D475 => array(0x6E), - 0x1D476 => array(0x6F), - 0x1D477 => array(0x70), - 0x1D478 => array(0x71), - 0x1D479 => array(0x72), - 0x1D47A => array(0x73), - 0x1D47B => array(0x74), - 0x1D47C => array(0x75), - 0x1D47D => array(0x76), - 0x1D47E => array(0x77), - 0x1D47F => array(0x78), - 0x1D480 => array(0x79), - 0x1D481 => array(0x7A), - 0x1D49C => array(0x61), - 0x1D49E => array(0x63), - 0x1D49F => array(0x64), - 0x1D4A2 => array(0x67), - 0x1D4A5 => array(0x6A), - 0x1D4A6 => array(0x6B), - 0x1D4A9 => array(0x6E), - 0x1D4AA => array(0x6F), - 0x1D4AB => array(0x70), - 0x1D4AC => array(0x71), - 0x1D4AE => array(0x73), - 0x1D4AF => array(0x74), - 0x1D4B0 => array(0x75), - 0x1D4B1 => array(0x76), - 0x1D4B2 => array(0x77), - 0x1D4B3 => array(0x78), - 0x1D4B4 => array(0x79), - 0x1D4B5 => array(0x7A), - 0x1D4D0 => array(0x61), - 0x1D4D1 => array(0x62), - 0x1D4D2 => array(0x63), - 0x1D4D3 => array(0x64), - 0x1D4D4 => array(0x65), - 0x1D4D5 => array(0x66), - 0x1D4D6 => array(0x67), - 0x1D4D7 => array(0x68), - 0x1D4D8 => array(0x69), - 0x1D4D9 => array(0x6A), - 0x1D4DA => array(0x6B), - 0x1D4DB => array(0x6C), - 0x1D4DC => array(0x6D), - 0x1D4DD => array(0x6E), - 0x1D4DE => array(0x6F), - 0x1D4DF => array(0x70), - 0x1D4E0 => array(0x71), - 0x1D4E1 => array(0x72), - 0x1D4E2 => array(0x73), - 0x1D4E3 => array(0x74), - 0x1D4E4 => array(0x75), - 0x1D4E5 => array(0x76), - 0x1D4E6 => array(0x77), - 0x1D4E7 => array(0x78), - 0x1D4E8 => array(0x79), - 0x1D4E9 => array(0x7A), - 0x1D504 => array(0x61), - 0x1D505 => array(0x62), - 0x1D507 => array(0x64), - 0x1D508 => array(0x65), - 0x1D509 => array(0x66), - 0x1D50A => array(0x67), - 0x1D50D => array(0x6A), - 0x1D50E => array(0x6B), - 0x1D50F => array(0x6C), - 0x1D510 => array(0x6D), - 0x1D511 => array(0x6E), - 0x1D512 => array(0x6F), - 0x1D513 => array(0x70), - 0x1D514 => array(0x71), - 0x1D516 => array(0x73), - 0x1D517 => array(0x74), - 0x1D518 => array(0x75), - 0x1D519 => array(0x76), - 0x1D51A => array(0x77), - 0x1D51B => array(0x78), - 0x1D51C => array(0x79), - 0x1D538 => array(0x61), - 0x1D539 => array(0x62), - 0x1D53B => array(0x64), - 0x1D53C => array(0x65), - 0x1D53D => array(0x66), - 0x1D53E => array(0x67), - 0x1D540 => array(0x69), - 0x1D541 => array(0x6A), - 0x1D542 => array(0x6B), - 0x1D543 => array(0x6C), - 0x1D544 => array(0x6D), - 0x1D546 => array(0x6F), - 0x1D54A => array(0x73), - 0x1D54B => array(0x74), - 0x1D54C => array(0x75), - 0x1D54D => array(0x76), - 0x1D54E => array(0x77), - 0x1D54F => array(0x78), - 0x1D550 => array(0x79), - 0x1D56C => array(0x61), - 0x1D56D => array(0x62), - 0x1D56E => array(0x63), - 0x1D56F => array(0x64), - 0x1D570 => array(0x65), - 0x1D571 => array(0x66), - 0x1D572 => array(0x67), - 0x1D573 => array(0x68), - 0x1D574 => array(0x69), - 0x1D575 => array(0x6A), - 0x1D576 => array(0x6B), - 0x1D577 => array(0x6C), - 0x1D578 => array(0x6D), - 0x1D579 => array(0x6E), - 0x1D57A => array(0x6F), - 0x1D57B => array(0x70), - 0x1D57C => array(0x71), - 0x1D57D => array(0x72), - 0x1D57E => array(0x73), - 0x1D57F => array(0x74), - 0x1D580 => array(0x75), - 0x1D581 => array(0x76), - 0x1D582 => array(0x77), - 0x1D583 => array(0x78), - 0x1D584 => array(0x79), - 0x1D585 => array(0x7A), - 0x1D5A0 => array(0x61), - 0x1D5A1 => array(0x62), - 0x1D5A2 => array(0x63), - 0x1D5A3 => array(0x64), - 0x1D5A4 => array(0x65), - 0x1D5A5 => array(0x66), - 0x1D5A6 => array(0x67), - 0x1D5A7 => array(0x68), - 0x1D5A8 => array(0x69), - 0x1D5A9 => array(0x6A), - 0x1D5AA => array(0x6B), - 0x1D5AB => array(0x6C), - 0x1D5AC => array(0x6D), - 0x1D5AD => array(0x6E), - 0x1D5AE => array(0x6F), - 0x1D5AF => array(0x70), - 0x1D5B0 => array(0x71), - 0x1D5B1 => array(0x72), - 0x1D5B2 => array(0x73), - 0x1D5B3 => array(0x74), - 0x1D5B4 => array(0x75), - 0x1D5B5 => array(0x76), - 0x1D5B6 => array(0x77), - 0x1D5B7 => array(0x78), - 0x1D5B8 => array(0x79), - 0x1D5B9 => array(0x7A), - 0x1D5D4 => array(0x61), - 0x1D5D5 => array(0x62), - 0x1D5D6 => array(0x63), - 0x1D5D7 => array(0x64), - 0x1D5D8 => array(0x65), - 0x1D5D9 => array(0x66), - 0x1D5DA => array(0x67), - 0x1D5DB => array(0x68), - 0x1D5DC => array(0x69), - 0x1D5DD => array(0x6A), - 0x1D5DE => array(0x6B), - 0x1D5DF => array(0x6C), - 0x1D5E0 => array(0x6D), - 0x1D5E1 => array(0x6E), - 0x1D5E2 => array(0x6F), - 0x1D5E3 => array(0x70), - 0x1D5E4 => array(0x71), - 0x1D5E5 => array(0x72), - 0x1D5E6 => array(0x73), - 0x1D5E7 => array(0x74), - 0x1D5E8 => array(0x75), - 0x1D5E9 => array(0x76), - 0x1D5EA => array(0x77), - 0x1D5EB => array(0x78), - 0x1D5EC => array(0x79), - 0x1D5ED => array(0x7A), - 0x1D608 => array(0x61), - 0x1D609 => array(0x62), - 0x1D60A => array(0x63), - 0x1D60B => array(0x64), - 0x1D60C => array(0x65), - 0x1D60D => array(0x66), - 0x1D60E => array(0x67), - 0x1D60F => array(0x68), - 0x1D610 => array(0x69), - 0x1D611 => array(0x6A), - 0x1D612 => array(0x6B), - 0x1D613 => array(0x6C), - 0x1D614 => array(0x6D), - 0x1D615 => array(0x6E), - 0x1D616 => array(0x6F), - 0x1D617 => array(0x70), - 0x1D618 => array(0x71), - 0x1D619 => array(0x72), - 0x1D61A => array(0x73), - 0x1D61B => array(0x74), - 0x1D61C => array(0x75), - 0x1D61D => array(0x76), - 0x1D61E => array(0x77), - 0x1D61F => array(0x78), - 0x1D620 => array(0x79), - 0x1D621 => array(0x7A), - 0x1D63C => array(0x61), - 0x1D63D => array(0x62), - 0x1D63E => array(0x63), - 0x1D63F => array(0x64), - 0x1D640 => array(0x65), - 0x1D641 => array(0x66), - 0x1D642 => array(0x67), - 0x1D643 => array(0x68), - 0x1D644 => array(0x69), - 0x1D645 => array(0x6A), - 0x1D646 => array(0x6B), - 0x1D647 => array(0x6C), - 0x1D648 => array(0x6D), - 0x1D649 => array(0x6E), - 0x1D64A => array(0x6F), - 0x1D64B => array(0x70), - 0x1D64C => array(0x71), - 0x1D64D => array(0x72), - 0x1D64E => array(0x73), - 0x1D64F => array(0x74), - 0x1D650 => array(0x75), - 0x1D651 => array(0x76), - 0x1D652 => array(0x77), - 0x1D653 => array(0x78), - 0x1D654 => array(0x79), - 0x1D655 => array(0x7A), - 0x1D670 => array(0x61), - 0x1D671 => array(0x62), - 0x1D672 => array(0x63), - 0x1D673 => array(0x64), - 0x1D674 => array(0x65), - 0x1D675 => array(0x66), - 0x1D676 => array(0x67), - 0x1D677 => array(0x68), - 0x1D678 => array(0x69), - 0x1D679 => array(0x6A), - 0x1D67A => array(0x6B), - 0x1D67B => array(0x6C), - 0x1D67C => array(0x6D), - 0x1D67D => array(0x6E), - 0x1D67E => array(0x6F), - 0x1D67F => array(0x70), - 0x1D680 => array(0x71), - 0x1D681 => array(0x72), - 0x1D682 => array(0x73), - 0x1D683 => array(0x74), - 0x1D684 => array(0x75), - 0x1D685 => array(0x76), - 0x1D686 => array(0x77), - 0x1D687 => array(0x78), - 0x1D688 => array(0x79), - 0x1D689 => array(0x7A), - 0x1D6A8 => array(0x3B1), - 0x1D6A9 => array(0x3B2), - 0x1D6AA => array(0x3B3), - 0x1D6AB => array(0x3B4), - 0x1D6AC => array(0x3B5), - 0x1D6AD => array(0x3B6), - 0x1D6AE => array(0x3B7), - 0x1D6AF => array(0x3B8), - 0x1D6B0 => array(0x3B9), - 0x1D6B1 => array(0x3BA), - 0x1D6B2 => array(0x3BB), - 0x1D6B3 => array(0x3BC), - 0x1D6B4 => array(0x3BD), - 0x1D6B5 => array(0x3BE), - 0x1D6B6 => array(0x3BF), - 0x1D6B7 => array(0x3C0), - 0x1D6B8 => array(0x3C1), - 0x1D6B9 => array(0x3B8), - 0x1D6BA => array(0x3C3), - 0x1D6BB => array(0x3C4), - 0x1D6BC => array(0x3C5), - 0x1D6BD => array(0x3C6), - 0x1D6BE => array(0x3C7), - 0x1D6BF => array(0x3C8), - 0x1D6C0 => array(0x3C9), - 0x1D6D3 => array(0x3C3), - 0x1D6E2 => array(0x3B1), - 0x1D6E3 => array(0x3B2), - 0x1D6E4 => array(0x3B3), - 0x1D6E5 => array(0x3B4), - 0x1D6E6 => array(0x3B5), - 0x1D6E7 => array(0x3B6), - 0x1D6E8 => array(0x3B7), - 0x1D6E9 => array(0x3B8), - 0x1D6EA => array(0x3B9), - 0x1D6EB => array(0x3BA), - 0x1D6EC => array(0x3BB), - 0x1D6ED => array(0x3BC), - 0x1D6EE => array(0x3BD), - 0x1D6EF => array(0x3BE), - 0x1D6F0 => array(0x3BF), - 0x1D6F1 => array(0x3C0), - 0x1D6F2 => array(0x3C1), - 0x1D6F3 => array(0x3B8), - 0x1D6F4 => array(0x3C3), - 0x1D6F5 => array(0x3C4), - 0x1D6F6 => array(0x3C5), - 0x1D6F7 => array(0x3C6), - 0x1D6F8 => array(0x3C7), - 0x1D6F9 => array(0x3C8), - 0x1D6FA => array(0x3C9), - 0x1D70D => array(0x3C3), - 0x1D71C => array(0x3B1), - 0x1D71D => array(0x3B2), - 0x1D71E => array(0x3B3), - 0x1D71F => array(0x3B4), - 0x1D720 => array(0x3B5), - 0x1D721 => array(0x3B6), - 0x1D722 => array(0x3B7), - 0x1D723 => array(0x3B8), - 0x1D724 => array(0x3B9), - 0x1D725 => array(0x3BA), - 0x1D726 => array(0x3BB), - 0x1D727 => array(0x3BC), - 0x1D728 => array(0x3BD), - 0x1D729 => array(0x3BE), - 0x1D72A => array(0x3BF), - 0x1D72B => array(0x3C0), - 0x1D72C => array(0x3C1), - 0x1D72D => array(0x3B8), - 0x1D72E => array(0x3C3), - 0x1D72F => array(0x3C4), - 0x1D730 => array(0x3C5), - 0x1D731 => array(0x3C6), - 0x1D732 => array(0x3C7), - 0x1D733 => array(0x3C8), - 0x1D734 => array(0x3C9), - 0x1D747 => array(0x3C3), - 0x1D756 => array(0x3B1), - 0x1D757 => array(0x3B2), - 0x1D758 => array(0x3B3), - 0x1D759 => array(0x3B4), - 0x1D75A => array(0x3B5), - 0x1D75B => array(0x3B6), - 0x1D75C => array(0x3B7), - 0x1D75D => array(0x3B8), - 0x1D75E => array(0x3B9), - 0x1D75F => array(0x3BA), - 0x1D760 => array(0x3BB), - 0x1D761 => array(0x3BC), - 0x1D762 => array(0x3BD), - 0x1D763 => array(0x3BE), - 0x1D764 => array(0x3BF), - 0x1D765 => array(0x3C0), - 0x1D766 => array(0x3C1), - 0x1D767 => array(0x3B8), - 0x1D768 => array(0x3C3), - 0x1D769 => array(0x3C4), - 0x1D76A => array(0x3C5), - 0x1D76B => array(0x3C6), - 0x1D76C => array(0x3C7), - 0x1D76D => array(0x3C8), - 0x1D76E => array(0x3C9), - 0x1D781 => array(0x3C3), - 0x1D790 => array(0x3B1), - 0x1D791 => array(0x3B2), - 0x1D792 => array(0x3B3), - 0x1D793 => array(0x3B4), - 0x1D794 => array(0x3B5), - 0x1D795 => array(0x3B6), - 0x1D796 => array(0x3B7), - 0x1D797 => array(0x3B8), - 0x1D798 => array(0x3B9), - 0x1D799 => array(0x3BA), - 0x1D79A => array(0x3BB), - 0x1D79B => array(0x3BC), - 0x1D79C => array(0x3BD), - 0x1D79D => array(0x3BE), - 0x1D79E => array(0x3BF), - 0x1D79F => array(0x3C0), - 0x1D7A0 => array(0x3C1), - 0x1D7A1 => array(0x3B8), - 0x1D7A2 => array(0x3C3), - 0x1D7A3 => array(0x3C4), - 0x1D7A4 => array(0x3C5), - 0x1D7A5 => array(0x3C6), - 0x1D7A6 => array(0x3C7), - 0x1D7A7 => array(0x3C8), - 0x1D7A8 => array(0x3C9), - 0x1D7BB => array(0x3C3), - 0x3F9 => array(0x3C3), - 0x1D2C => array(0x61), - 0x1D2D => array(0xE6), - 0x1D2E => array(0x62), - 0x1D30 => array(0x64), - 0x1D31 => array(0x65), - 0x1D32 => array(0x1DD), - 0x1D33 => array(0x67), - 0x1D34 => array(0x68), - 0x1D35 => array(0x69), - 0x1D36 => array(0x6A), - 0x1D37 => array(0x6B), - 0x1D38 => array(0x6C), - 0x1D39 => array(0x6D), - 0x1D3A => array(0x6E), - 0x1D3C => array(0x6F), - 0x1D3D => array(0x223), - 0x1D3E => array(0x70), - 0x1D3F => array(0x72), - 0x1D40 => array(0x74), - 0x1D41 => array(0x75), - 0x1D42 => array(0x77), - 0x213B => array(0x66, 0x61, 0x78), - 0x3250 => array(0x70, 0x74, 0x65), - 0x32CC => array(0x68, 0x67), - 0x32CE => array(0x65, 0x76), - 0x32CF => array(0x6C, 0x74, 0x64), - 0x337A => array(0x69, 0x75), - 0x33DE => array(0x76, 0x2215, 0x6D), - 0x33DF => array(0x61, 0x2215, 0x6D) - ); - - /** - * Normalization Combining Classes; Code Points not listed - * got Combining Class 0. - * - * @static - * @var array - * @access private - */ - private static $_np_norm_combcls = array( - 0x334 => 1, - 0x335 => 1, - 0x336 => 1, - 0x337 => 1, - 0x338 => 1, - 0x93C => 7, - 0x9BC => 7, - 0xA3C => 7, - 0xABC => 7, - 0xB3C => 7, - 0xCBC => 7, - 0x1037 => 7, - 0x3099 => 8, - 0x309A => 8, - 0x94D => 9, - 0x9CD => 9, - 0xA4D => 9, - 0xACD => 9, - 0xB4D => 9, - 0xBCD => 9, - 0xC4D => 9, - 0xCCD => 9, - 0xD4D => 9, - 0xDCA => 9, - 0xE3A => 9, - 0xF84 => 9, - 0x1039 => 9, - 0x1714 => 9, - 0x1734 => 9, - 0x17D2 => 9, - 0x5B0 => 10, - 0x5B1 => 11, - 0x5B2 => 12, - 0x5B3 => 13, - 0x5B4 => 14, - 0x5B5 => 15, - 0x5B6 => 16, - 0x5B7 => 17, - 0x5B8 => 18, - 0x5B9 => 19, - 0x5BB => 20, - 0x5Bc => 21, - 0x5BD => 22, - 0x5BF => 23, - 0x5C1 => 24, - 0x5C2 => 25, - 0xFB1E => 26, - 0x64B => 27, - 0x64C => 28, - 0x64D => 29, - 0x64E => 30, - 0x64F => 31, - 0x650 => 32, - 0x651 => 33, - 0x652 => 34, - 0x670 => 35, - 0x711 => 36, - 0xC55 => 84, - 0xC56 => 91, - 0xE38 => 103, - 0xE39 => 103, - 0xE48 => 107, - 0xE49 => 107, - 0xE4A => 107, - 0xE4B => 107, - 0xEB8 => 118, - 0xEB9 => 118, - 0xEC8 => 122, - 0xEC9 => 122, - 0xECA => 122, - 0xECB => 122, - 0xF71 => 129, - 0xF72 => 130, - 0xF7A => 130, - 0xF7B => 130, - 0xF7C => 130, - 0xF7D => 130, - 0xF80 => 130, - 0xF74 => 132, - 0x321 => 202, - 0x322 => 202, - 0x327 => 202, - 0x328 => 202, - 0x31B => 216, - 0xF39 => 216, - 0x1D165 => 216, - 0x1D166 => 216, - 0x1D16E => 216, - 0x1D16F => 216, - 0x1D170 => 216, - 0x1D171 => 216, - 0x1D172 => 216, - 0x302A => 218, - 0x316 => 220, - 0x317 => 220, - 0x318 => 220, - 0x319 => 220, - 0x31C => 220, - 0x31D => 220, - 0x31E => 220, - 0x31F => 220, - 0x320 => 220, - 0x323 => 220, - 0x324 => 220, - 0x325 => 220, - 0x326 => 220, - 0x329 => 220, - 0x32A => 220, - 0x32B => 220, - 0x32C => 220, - 0x32D => 220, - 0x32E => 220, - 0x32F => 220, - 0x330 => 220, - 0x331 => 220, - 0x332 => 220, - 0x333 => 220, - 0x339 => 220, - 0x33A => 220, - 0x33B => 220, - 0x33C => 220, - 0x347 => 220, - 0x348 => 220, - 0x349 => 220, - 0x34D => 220, - 0x34E => 220, - 0x353 => 220, - 0x354 => 220, - 0x355 => 220, - 0x356 => 220, - 0x591 => 220, - 0x596 => 220, - 0x59B => 220, - 0x5A3 => 220, - 0x5A4 => 220, - 0x5A5 => 220, - 0x5A6 => 220, - 0x5A7 => 220, - 0x5AA => 220, - 0x655 => 220, - 0x656 => 220, - 0x6E3 => 220, - 0x6EA => 220, - 0x6ED => 220, - 0x731 => 220, - 0x734 => 220, - 0x737 => 220, - 0x738 => 220, - 0x739 => 220, - 0x73B => 220, - 0x73C => 220, - 0x73E => 220, - 0x742 => 220, - 0x744 => 220, - 0x746 => 220, - 0x748 => 220, - 0x952 => 220, - 0xF18 => 220, - 0xF19 => 220, - 0xF35 => 220, - 0xF37 => 220, - 0xFC6 => 220, - 0x193B => 220, - 0x20E8 => 220, - 0x1D17B => 220, - 0x1D17C => 220, - 0x1D17D => 220, - 0x1D17E => 220, - 0x1D17F => 220, - 0x1D180 => 220, - 0x1D181 => 220, - 0x1D182 => 220, - 0x1D18A => 220, - 0x1D18B => 220, - 0x59A => 222, - 0x5AD => 222, - 0x1929 => 222, - 0x302D => 222, - 0x302E => 224, - 0x302F => 224, - 0x1D16D => 226, - 0x5AE => 228, - 0x18A9 => 228, - 0x302B => 228, - 0x300 => 230, - 0x301 => 230, - 0x302 => 230, - 0x303 => 230, - 0x304 => 230, - 0x305 => 230, - 0x306 => 230, - 0x307 => 230, - 0x308 => 230, - 0x309 => 230, - 0x30A => 230, - 0x30B => 230, - 0x30C => 230, - 0x30D => 230, - 0x30E => 230, - 0x30F => 230, - 0x310 => 230, - 0x311 => 230, - 0x312 => 230, - 0x313 => 230, - 0x314 => 230, - 0x33D => 230, - 0x33E => 230, - 0x33F => 230, - 0x340 => 230, - 0x341 => 230, - 0x342 => 230, - 0x343 => 230, - 0x344 => 230, - 0x346 => 230, - 0x34A => 230, - 0x34B => 230, - 0x34C => 230, - 0x350 => 230, - 0x351 => 230, - 0x352 => 230, - 0x357 => 230, - 0x363 => 230, - 0x364 => 230, - 0x365 => 230, - 0x366 => 230, - 0x367 => 230, - 0x368 => 230, - 0x369 => 230, - 0x36A => 230, - 0x36B => 230, - 0x36C => 230, - 0x36D => 230, - 0x36E => 230, - 0x36F => 230, - 0x483 => 230, - 0x484 => 230, - 0x485 => 230, - 0x486 => 230, - 0x592 => 230, - 0x593 => 230, - 0x594 => 230, - 0x595 => 230, - 0x597 => 230, - 0x598 => 230, - 0x599 => 230, - 0x59C => 230, - 0x59D => 230, - 0x59E => 230, - 0x59F => 230, - 0x5A0 => 230, - 0x5A1 => 230, - 0x5A8 => 230, - 0x5A9 => 230, - 0x5AB => 230, - 0x5AC => 230, - 0x5AF => 230, - 0x5C4 => 230, - 0x610 => 230, - 0x611 => 230, - 0x612 => 230, - 0x613 => 230, - 0x614 => 230, - 0x615 => 230, - 0x653 => 230, - 0x654 => 230, - 0x657 => 230, - 0x658 => 230, - 0x6D6 => 230, - 0x6D7 => 230, - 0x6D8 => 230, - 0x6D9 => 230, - 0x6DA => 230, - 0x6DB => 230, - 0x6DC => 230, - 0x6DF => 230, - 0x6E0 => 230, - 0x6E1 => 230, - 0x6E2 => 230, - 0x6E4 => 230, - 0x6E7 => 230, - 0x6E8 => 230, - 0x6EB => 230, - 0x6EC => 230, - 0x730 => 230, - 0x732 => 230, - 0x733 => 230, - 0x735 => 230, - 0x736 => 230, - 0x73A => 230, - 0x73D => 230, - 0x73F => 230, - 0x740 => 230, - 0x741 => 230, - 0x743 => 230, - 0x745 => 230, - 0x747 => 230, - 0x749 => 230, - 0x74A => 230, - 0x951 => 230, - 0x953 => 230, - 0x954 => 230, - 0xF82 => 230, - 0xF83 => 230, - 0xF86 => 230, - 0xF87 => 230, - 0x170D => 230, - 0x193A => 230, - 0x20D0 => 230, - 0x20D1 => 230, - 0x20D4 => 230, - 0x20D5 => 230, - 0x20D6 => 230, - 0x20D7 => 230, - 0x20DB => 230, - 0x20DC => 230, - 0x20E1 => 230, - 0x20E7 => 230, - 0x20E9 => 230, - 0xFE20 => 230, - 0xFE21 => 230, - 0xFE22 => 230, - 0xFE23 => 230, - 0x1D185 => 230, - 0x1D186 => 230, - 0x1D187 => 230, - 0x1D189 => 230, - 0x1D188 => 230, - 0x1D1AA => 230, - 0x1D1AB => 230, - 0x1D1AC => 230, - 0x1D1AD => 230, - 0x315 => 232, - 0x31A => 232, - 0x302C => 232, - 0x35F => 233, - 0x362 => 233, - 0x35D => 234, - 0x35E => 234, - 0x360 => 234, - 0x361 => 234, - 0x345 => 240 - ); - // }}} - - // {{{ properties - /** - * @var string - * @access private - */ - private $_punycode_prefix = 'xn--'; - - /** - * @access private - */ - private $_invalid_ucs = 0x80000000; - - /** - * @access private - */ - private $_max_ucs = 0x10FFFF; - - /** - * @var int - * @access private - */ - private $_base = 36; - - /** - * @var int - * @access private - */ - private $_tmin = 1; - - /** - * @var int - * @access private - */ - private $_tmax = 26; - - /** - * @var int - * @access private - */ - private $_skew = 38; - - /** - * @var int - * @access private - */ - private $_damp = 700; - - /** - * @var int - * @access private - */ - private $_initial_bias = 72; - - /** - * @var int - * @access private - */ - private $_initial_n = 0x80; - - /** - * @var int - * @access private - */ - private $_slast; - - /** - * @access private - */ - private $_sbase = 0xAC00; - - /** - * @access private - */ - private $_lbase = 0x1100; - - /** - * @access private - */ - private $_vbase = 0x1161; - - /** - * @access private - */ - private $_tbase = 0x11a7; - - /** - * @var int - * @access private - */ - private $_lcount = 19; - - /** - * @var int - * @access private - */ - private $_vcount = 21; - - /** - * @var int - * @access private - */ - private $_tcount = 28; - - /** - * vcount * tcount - * - * @var int - * @access private - */ - private $_ncount = 588; - - /** - * lcount * tcount * vcount - * - * @var int - * @access private - */ - private $_scount = 11172; - - /** - * Default encoding for encode()'s input and decode()'s output is UTF-8; - * Other possible encodings are ucs4_string and ucs4_array - * See {@link setParams()} for how to select these - * - * @var bool - * @access private - */ - private $_api_encoding = 'utf8'; - - /** - * Overlong UTF-8 encodings are forbidden - * - * @var bool - * @access private - */ - private $_allow_overlong = false; - - /** - * Behave strict or not - * - * @var bool - * @access private - */ - private $_strict_mode = false; - - /** - * IDNA-version to use - * - * Values are "2003" and "2008". - * Defaults to "2003", since that was the original version and for - * compatibility with previous versions of this library. - * If you need to encode "new" characters like the German "Eszett", - * please switch to 2008 first before encoding. - * - * @var bool - * @access private - */ - private $_version = '2003'; - - /** - * Cached value indicating whether or not mbstring function overloading is - * on for strlen - * - * This is cached for optimal performance. - * - * @var boolean - * @see Net_IDNA2::_byteLength() - */ - private static $_mb_string_overload = null; - // }}} - - - // {{{ constructor - /** - * Constructor - * - * @param array $options Options to initialise the object with - * - * @access public - * @see setParams() - */ - public function __construct($options = null) - { - $this->_slast = $this->_sbase + $this->_lcount * $this->_vcount * $this->_tcount; - - if (is_array($options)) { - $this->setParams($options); - } - - // populate mbstring overloading cache if not set - if (self::$_mb_string_overload === null) { - self::$_mb_string_overload = (extension_loaded('mbstring') - && (ini_get('mbstring.func_overload') & 0x02) === 0x02); - } - } - // }}} - - - /** - * Sets a new option value. Available options and values: - * - * [utf8 - Use either UTF-8 or ISO-8859-1 as input (true for UTF-8, false - * otherwise); The output is always UTF-8] - * [overlong - Unicode does not allow unnecessarily long encodings of chars, - * to allow this, set this parameter to true, else to false; - * default is false.] - * [strict - true: strict mode, good for registration purposes - Causes errors - * on failures; false: loose mode, ideal for "wildlife" applications - * by silently ignoring errors and returning the original input instead] - * - * @param mixed $option Parameter to set (string: single parameter; array of Parameter => Value pairs) - * @param string $value Value to use (if parameter 1 is a string) - * - * @return boolean true on success, false otherwise - * @access public - */ - public function setParams($option, $value = false) - { - if (!is_array($option)) { - $option = array($option => $value); - } - - foreach ($option as $k => $v) { - switch ($k) { - case 'encoding': - switch ($v) { - case 'utf8': - case 'ucs4_string': - case 'ucs4_array': - $this->_api_encoding = $v; - break; - - default: - throw new InvalidArgumentException('Set Parameter: Unknown parameter '.$v.' for option '.$k); - } - - break; - - case 'overlong': - $this->_allow_overlong = ($v) ? true : false; - break; - - case 'strict': - $this->_strict_mode = ($v) ? true : false; - break; - - case 'version': - if (in_array($v, array('2003', '2008'))) { - $this->_version = $v; - } else { - throw new InvalidArgumentException('Set Parameter: Invalid parameter '.$v.' for option '.$k); - } - break; - - default: - return false; - } - } - - return true; - } - - /** - * Encode a given UTF-8 domain name. - * - * @param string $decoded Domain name (UTF-8 or UCS-4) - * @param string $one_time_encoding Desired input encoding, see {@link set_parameter} - * If not given will use default-encoding - * - * @return string Encoded Domain name (ACE string) - * @return mixed processed string - * @throws Exception - * @access public - */ - public function encode($decoded, $one_time_encoding = false) - { - // Forcing conversion of input to UCS4 array - // If one time encoding is given, use this, else the objects property - switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) { - case 'utf8': - $decoded = $this->_utf8_to_ucs4($decoded); - break; - case 'ucs4_string': - $decoded = $this->_ucs4_string_to_ucs4($decoded); - case 'ucs4_array': // No break; before this line. Catch case, but do nothing - break; - default: - throw new InvalidArgumentException('Unsupported input format'); - } - - // No input, no output, what else did you expect? - if (empty($decoded)) return ''; - - // Anchors for iteration - $last_begin = 0; - // Output string - $output = ''; - - foreach ($decoded as $k => $v) { - // Make sure to use just the plain dot - switch($v) { - case 0x3002: - case 0xFF0E: - case 0xFF61: - $decoded[$k] = 0x2E; - // It's right, no break here - // The codepoints above have to be converted to dots anyway - - // Stumbling across an anchoring character - case 0x2E: - case 0x2F: - case 0x3A: - case 0x3F: - case 0x40: - // Neither email addresses nor URLs allowed in strict mode - if ($this->_strict_mode) { - throw new InvalidArgumentException('Neither email addresses nor URLs are allowed in strict mode.'); - } - // Skip first char - if ($k) { - $encoded = ''; - $encoded = $this->_encode(array_slice($decoded, $last_begin, (($k)-$last_begin))); - if ($encoded) { - $output .= $encoded; - } else { - $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($k)-$last_begin))); - } - $output .= chr($decoded[$k]); - } - $last_begin = $k + 1; - } - } - // Catch the rest of the string - if ($last_begin) { - $inp_len = sizeof($decoded); - $encoded = ''; - $encoded = $this->_encode(array_slice($decoded, $last_begin, (($inp_len)-$last_begin))); - if ($encoded) { - $output .= $encoded; - } else { - $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($inp_len)-$last_begin))); - } - return $output; - } - - if ($output = $this->_encode($decoded)) { - return $output; - } - - return $this->_ucs4_to_utf8($decoded); - } - - /** - * Decode a given ACE domain name. - * - * @param string $input Domain name (ACE string) - * @param string $one_time_encoding Desired output encoding, see {@link set_parameter} - * - * @return string Decoded Domain name (UTF-8 or UCS-4) - * @throws Exception - * @access public - */ - public function decode($input, $one_time_encoding = false) - { - // Optionally set - if ($one_time_encoding) { - switch ($one_time_encoding) { - case 'utf8': - case 'ucs4_string': - case 'ucs4_array': - break; - default: - throw new InvalidArgumentException('Unknown encoding '.$one_time_encoding); - } - } - // Make sure to drop any newline characters around - $input = trim($input); - - // Negotiate input and try to determine, wether it is a plain string, - // an email address or something like a complete URL - if (strpos($input, '@')) { // Maybe it is an email address - // No no in strict mode - if ($this->_strict_mode) { - throw new InvalidArgumentException('Only simple domain name parts can be handled in strict mode'); - } - list($email_pref, $input) = explode('@', $input, 2); - $arr = explode('.', $input); - foreach ($arr as $k => $v) { - $conv = $this->_decode($v); - if ($conv) $arr[$k] = $conv; - } - $return = $email_pref . '@' . join('.', $arr); - } elseif (preg_match('![:\./]!', $input)) { // Or a complete domain name (with or without paths / parameters) - // No no in strict mode - if ($this->_strict_mode) { - throw new InvalidArgumentException('Only simple domain name parts can be handled in strict mode'); - } - - $parsed = parse_url($input); - if (isset($parsed['host'])) { - $arr = explode('.', $parsed['host']); - foreach ($arr as $k => $v) { - $conv = $this->_decode($v); - if ($conv) $arr[$k] = $conv; - } - $parsed['host'] = join('.', $arr); - if (isset($parsed['scheme'])) { - $parsed['scheme'] .= (strtolower($parsed['scheme']) == 'mailto') ? ':' : '://'; - } - $return = $this->_unparse_url($parsed); - } else { // parse_url seems to have failed, try without it - $arr = explode('.', $input); - foreach ($arr as $k => $v) { - $conv = $this->_decode($v); - if ($conv) $arr[$k] = $conv; - } - $return = join('.', $arr); - } - } else { // Otherwise we consider it being a pure domain name string - $return = $this->_decode($input); - } - // The output is UTF-8 by default, other output formats need conversion here - // If one time encoding is given, use this, else the objects property - switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) { - case 'utf8': - return $return; - break; - case 'ucs4_string': - return $this->_ucs4_to_ucs4_string($this->_utf8_to_ucs4($return)); - break; - case 'ucs4_array': - return $this->_utf8_to_ucs4($return); - break; - default: - throw new InvalidArgumentException('Unsupported output format'); - } - } - - - // {{{ private - /** - * Opposite function to parse_url() - * - * Inspired by code from comments of php.net-documentation for parse_url() - * - * @param array $parts_arr parts (strings) as returned by parse_url() - * - * @return string - * @access private - */ - private function _unparse_url($parts_arr) - { - if (!empty($parts_arr['scheme'])) { - $ret_url = $parts_arr['scheme']; - } - if (!empty($parts_arr['user'])) { - $ret_url .= $parts_arr['user']; - if (!empty($parts_arr['pass'])) { - $ret_url .= ':' . $parts_arr['pass']; - } - $ret_url .= '@'; - } - $ret_url .= $parts_arr['host']; - if (!empty($parts_arr['port'])) { - $ret_url .= ':' . $parts_arr['port']; - } - $ret_url .= $parts_arr['path']; - if (!empty($parts_arr['query'])) { - $ret_url .= '?' . $parts_arr['query']; - } - if (!empty($parts_arr['fragment'])) { - $ret_url .= '#' . $parts_arr['fragment']; - } - return $ret_url; - } - - /** - * The actual encoding algorithm. - * - * @param string $decoded Decoded string which should be encoded - * - * @return string Encoded string - * @throws Exception - * @access private - */ - private function _encode($decoded) - { - // We cannot encode a domain name containing the Punycode prefix - $extract = self::_byteLength($this->_punycode_prefix); - $check_pref = $this->_utf8_to_ucs4($this->_punycode_prefix); - $check_deco = array_slice($decoded, 0, $extract); - - if ($check_pref == $check_deco) { - throw new InvalidArgumentException('This is already a punycode string'); - } - - // We will not try to encode strings consisting of basic code points only - $encodable = false; - foreach ($decoded as $k => $v) { - if ($v > 0x7a) { - $encodable = true; - break; - } - } - if (!$encodable) { - if ($this->_strict_mode) { - throw new InvalidArgumentException('The given string does not contain encodable chars'); - } - - return false; - } - - // Do NAMEPREP - $decoded = $this->_nameprep($decoded); - - $deco_len = count($decoded); - - // Empty array - if (!$deco_len) { - return false; - } - - // How many chars have been consumed - $codecount = 0; - - // Start with the prefix; copy it to output - $encoded = $this->_punycode_prefix; - - $encoded = ''; - // Copy all basic code points to output - for ($i = 0; $i < $deco_len; ++$i) { - $test = $decoded[$i]; - // Will match [0-9a-zA-Z-] - if ((0x2F < $test && $test < 0x40) - || (0x40 < $test && $test < 0x5B) - || (0x60 < $test && $test <= 0x7B) - || (0x2D == $test) - ) { - $encoded .= chr($decoded[$i]); - $codecount++; - } - } - - // All codepoints were basic ones - if ($codecount == $deco_len) { - return $encoded; - } - - // Start with the prefix; copy it to output - $encoded = $this->_punycode_prefix . $encoded; - - // If we have basic code points in output, add an hyphen to the end - if ($codecount) { - $encoded .= '-'; - } - - // Now find and encode all non-basic code points - $is_first = true; - $cur_code = $this->_initial_n; - $bias = $this->_initial_bias; - $delta = 0; - - while ($codecount < $deco_len) { - // Find the smallest code point >= the current code point and - // remember the last ouccrence of it in the input - for ($i = 0, $next_code = $this->_max_ucs; $i < $deco_len; $i++) { - if ($decoded[$i] >= $cur_code && $decoded[$i] <= $next_code) { - $next_code = $decoded[$i]; - } - } - - $delta += ($next_code - $cur_code) * ($codecount + 1); - $cur_code = $next_code; - - // Scan input again and encode all characters whose code point is $cur_code - for ($i = 0; $i < $deco_len; $i++) { - if ($decoded[$i] < $cur_code) { - $delta++; - } else if ($decoded[$i] == $cur_code) { - for ($q = $delta, $k = $this->_base; 1; $k += $this->_base) { - $t = ($k <= $bias)? - $this->_tmin : - (($k >= $bias + $this->_tmax)? $this->_tmax : $k - $bias); - - if ($q < $t) { - break; - } - - $encoded .= $this->_encodeDigit(ceil($t + (($q - $t) % ($this->_base - $t)))); - $q = ($q - $t) / ($this->_base - $t); - } - - $encoded .= $this->_encodeDigit($q); - $bias = $this->_adapt($delta, $codecount + 1, $is_first); - $codecount++; - $delta = 0; - $is_first = false; - } - } - - $delta++; - $cur_code++; - } - - return $encoded; - } - - /** - * The actual decoding algorithm. - * - * @param string $encoded Encoded string which should be decoded - * - * @return string Decoded string - * @throws Exception - * @access private - */ - private function _decode($encoded) - { - // We do need to find the Punycode prefix - if (!preg_match('!^' . preg_quote($this->_punycode_prefix, '!') . '!', $encoded)) { - return false; - } - - $encode_test = preg_replace('!^' . preg_quote($this->_punycode_prefix, '!') . '!', '', $encoded); - - // If nothing left after removing the prefix, it is hopeless - if (!$encode_test) { - return false; - } - - // Find last occurence of the delimiter - $delim_pos = strrpos($encoded, '-'); - - if ($delim_pos > self::_byteLength($this->_punycode_prefix)) { - for ($k = self::_byteLength($this->_punycode_prefix); $k < $delim_pos; ++$k) { - $decoded[] = ord($encoded{$k}); - } - } else { - $decoded = array(); - } - - $deco_len = count($decoded); - $enco_len = self::_byteLength($encoded); - - // Wandering through the strings; init - $is_first = true; - $bias = $this->_initial_bias; - $idx = 0; - $char = $this->_initial_n; - - for ($enco_idx = ($delim_pos)? ($delim_pos + 1) : 0; $enco_idx < $enco_len; ++$deco_len) { - for ($old_idx = $idx, $w = 1, $k = $this->_base; 1 ; $k += $this->_base) { - $digit = $this->_decodeDigit($encoded{$enco_idx++}); - $idx += $digit * $w; - - $t = ($k <= $bias) ? - $this->_tmin : - (($k >= $bias + $this->_tmax)? $this->_tmax : ($k - $bias)); - - if ($digit < $t) { - break; - } - - $w = (int)($w * ($this->_base - $t)); - } - - $bias = $this->_adapt($idx - $old_idx, $deco_len + 1, $is_first); - $is_first = false; - $char += (int) ($idx / ($deco_len + 1)); - $idx %= ($deco_len + 1); - - if ($deco_len > 0) { - // Make room for the decoded char - for ($i = $deco_len; $i > $idx; $i--) { - $decoded[$i] = $decoded[($i - 1)]; - } - } - - $decoded[$idx++] = $char; - } - - return $this->_ucs4_to_utf8($decoded); - } - - /** - * Adapt the bias according to the current code point and position. - * - * @param int $delta ... - * @param int $npoints ... - * @param boolean $is_first ... - * - * @return int - * @access private - */ - private function _adapt($delta, $npoints, $is_first) - { - $delta = (int) ($is_first ? ($delta / $this->_damp) : ($delta / 2)); - $delta += (int) ($delta / $npoints); - - for ($k = 0; $delta > (($this->_base - $this->_tmin) * $this->_tmax) / 2; $k += $this->_base) { - $delta = (int) ($delta / ($this->_base - $this->_tmin)); - } - - return (int) ($k + ($this->_base - $this->_tmin + 1) * $delta / ($delta + $this->_skew)); - } - - /** - * Encoding a certain digit. - * - * @param int $d One digit to encode - * - * @return char Encoded digit - * @access private - */ - private function _encodeDigit($d) - { - return chr($d + 22 + 75 * ($d < 26)); - } - - /** - * Decode a certain digit. - * - * @param char $cp One digit (character) to decode - * - * @return int Decoded digit - * @access private - */ - private function _decodeDigit($cp) - { - $cp = ord($cp); - return ($cp - 48 < 10)? $cp - 22 : (($cp - 65 < 26)? $cp - 65 : (($cp - 97 < 26)? $cp - 97 : $this->_base)); - } - - /** - * Do Nameprep according to RFC3491 and RFC3454. - * - * @param array $input Unicode Characters - * - * @return string Unicode Characters, Nameprep'd - * @throws Exception - * @access private - */ - private function _nameprep($input) - { - $output = array(); - - // Walking through the input array, performing the required steps on each of - // the input chars and putting the result into the output array - // While mapping required chars we apply the cannonical ordering - - foreach ($input as $v) { - // Map to nothing == skip that code point - if (in_array($v, self::$_np_map_nothing)) { - continue; - } - - // Try to find prohibited input - if (in_array($v, self::$_np_prohibit) || in_array($v, self::$_general_prohibited)) { - throw new Net_IDNA2_Exception_Nameprep('Prohibited input U+' . sprintf('%08X', $v)); - } - - foreach (self::$_np_prohibit_ranges as $range) { - if ($range[0] <= $v && $v <= $range[1]) { - throw new Net_IDNA2_Exception_Nameprep('Prohibited input U+' . sprintf('%08X', $v)); - } - } - - // Hangul syllable decomposition - if (0xAC00 <= $v && $v <= 0xD7AF) { - foreach ($this->_hangulDecompose($v) as $out) { - $output[] = $out; - } - } else if (($this->_version == '2003') && isset(self::$_np_replacemaps[$v])) { - // There's a decomposition mapping for that code point - // Decompositions only in version 2003 (original) of IDNA - foreach ($this->_applyCannonicalOrdering(self::$_np_replacemaps[$v]) as $out) { - $output[] = $out; - } - } else { - $output[] = $v; - } - } - - // Combine code points - - $last_class = 0; - $last_starter = 0; - $out_len = count($output); - - for ($i = 0; $i < $out_len; ++$i) { - $class = $this->_getCombiningClass($output[$i]); - - if ((!$last_class || $last_class != $class) && $class) { - // Try to match - $seq_len = $i - $last_starter; - $out = $this->_combine(array_slice($output, $last_starter, $seq_len)); - - // On match: Replace the last starter with the composed character and remove - // the now redundant non-starter(s) - if ($out) { - $output[$last_starter] = $out; - - if (count($out) != $seq_len) { - for ($j = $i + 1; $j < $out_len; ++$j) { - $output[$j - 1] = $output[$j]; - } - - unset($output[$out_len]); - } - - // Rewind the for loop by one, since there can be more possible compositions - $i--; - $out_len--; - $last_class = ($i == $last_starter)? 0 : $this->_getCombiningClass($output[$i - 1]); - - continue; - } - } - - // The current class is 0 - if (!$class) { - $last_starter = $i; - } - - $last_class = $class; - } - - return $output; - } - - /** - * Decomposes a Hangul syllable - * (see http://www.unicode.org/unicode/reports/tr15/#Hangul). - * - * @param integer $char 32bit UCS4 code point - * - * @return array Either Hangul Syllable decomposed or original 32bit - * value as one value array - * @access private - */ - private function _hangulDecompose($char) - { - $sindex = $char - $this->_sbase; - - if ($sindex < 0 || $sindex >= $this->_scount) { - return array($char); - } - - $result = array(); - $T = $this->_tbase + $sindex % $this->_tcount; - $result[] = (int)($this->_lbase + $sindex / $this->_ncount); - $result[] = (int)($this->_vbase + ($sindex % $this->_ncount) / $this->_tcount); - - if ($T != $this->_tbase) { - $result[] = $T; - } - - return $result; - } - - /** - * Ccomposes a Hangul syllable - * (see http://www.unicode.org/unicode/reports/tr15/#Hangul). - * - * @param array $input Decomposed UCS4 sequence - * - * @return array UCS4 sequence with syllables composed - * @access private - */ - private function _hangulCompose($input) - { - $inp_len = count($input); - - if (!$inp_len) { - return array(); - } - - $result = array(); - $last = $input[0]; - $result[] = $last; // copy first char from input to output - - for ($i = 1; $i < $inp_len; ++$i) { - $char = $input[$i]; - - // Find out, wether two current characters from L and V - $lindex = $last - $this->_lbase; - - if (0 <= $lindex && $lindex < $this->_lcount) { - $vindex = $char - $this->_vbase; - - if (0 <= $vindex && $vindex < $this->_vcount) { - // create syllable of form LV - $last = ($this->_sbase + ($lindex * $this->_vcount + $vindex) * $this->_tcount); - $out_off = count($result) - 1; - $result[$out_off] = $last; // reset last - - // discard char - continue; - } - } - - // Find out, wether two current characters are LV and T - $sindex = $last - $this->_sbase; - - if (0 <= $sindex && $sindex < $this->_scount && ($sindex % $this->_tcount) == 0) { - $tindex = $char - $this->_tbase; - - if (0 <= $tindex && $tindex <= $this->_tcount) { - // create syllable of form LVT - $last += $tindex; - $out_off = count($result) - 1; - $result[$out_off] = $last; // reset last - - // discard char - continue; - } - } - - // if neither case was true, just add the character - $last = $char; - $result[] = $char; - } - - return $result; - } - - /** - * Returns the combining class of a certain wide char. - * - * @param integer $char Wide char to check (32bit integer) - * - * @return integer Combining class if found, else 0 - * @access private - */ - private function _getCombiningClass($char) - { - return isset(self::$_np_norm_combcls[$char])? self::$_np_norm_combcls[$char] : 0; - } - - /** - * Apllies the cannonical ordering of a decomposed UCS4 sequence. - * - * @param array $input Decomposed UCS4 sequence - * - * @return array Ordered USC4 sequence - * @access private - */ - private function _applyCannonicalOrdering($input) - { - $swap = true; - $size = count($input); - - while ($swap) { - $swap = false; - $last = $this->_getCombiningClass($input[0]); - - for ($i = 0; $i < $size - 1; ++$i) { - $next = $this->_getCombiningClass($input[$i + 1]); - - if ($next != 0 && $last > $next) { - // Move item leftward until it fits - for ($j = $i + 1; $j > 0; --$j) { - if ($this->_getCombiningClass($input[$j - 1]) <= $next) { - break; - } - - $t = $input[$j]; - $input[$j] = $input[$j - 1]; - $input[$j - 1] = $t; - $swap = 1; - } - - // Reentering the loop looking at the old character again - $next = $last; - } - - $last = $next; - } - } - - return $input; - } - - /** - * Do composition of a sequence of starter and non-starter. - * - * @param array $input UCS4 Decomposed sequence - * - * @return array Ordered USC4 sequence - * @access private - */ - private function _combine($input) - { - $inp_len = count($input); - - // Is it a Hangul syllable? - if (1 != $inp_len) { - $hangul = $this->_hangulCompose($input); - - // This place is probably wrong - if (count($hangul) != $inp_len) { - return $hangul; - } - } - - foreach (self::$_np_replacemaps as $np_src => $np_target) { - if ($np_target[0] != $input[0]) { - continue; - } - - if (count($np_target) != $inp_len) { - continue; - } - - $hit = false; - - foreach ($input as $k2 => $v2) { - if ($v2 == $np_target[$k2]) { - $hit = true; - } else { - $hit = false; - break; - } - } - - if ($hit) { - return $np_src; - } - } - - return false; - } - - /** - * This converts an UTF-8 encoded string to its UCS-4 (array) representation - * By talking about UCS-4 we mean arrays of 32bit integers representing - * each of the "chars". This is due to PHP not being able to handle strings with - * bit depth different from 8. This applies to the reverse method _ucs4_to_utf8(), too. - * The following UTF-8 encodings are supported: - * - * bytes bits representation - * 1 7 0xxxxxxx - * 2 11 110xxxxx 10xxxxxx - * 3 16 1110xxxx 10xxxxxx 10xxxxxx - * 4 21 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - * 5 26 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx - * 6 31 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx - * - * Each x represents a bit that can be used to store character data. - * - * @param string $input utf8-encoded string - * - * @return array ucs4-encoded array - * @throws Exception - * @access private - */ - private function _utf8_to_ucs4($input) - { - $output = array(); - $out_len = 0; - $inp_len = self::_byteLength($input, '8bit'); - $mode = 'next'; - $test = 'none'; - for ($k = 0; $k < $inp_len; ++$k) { - $v = ord($input{$k}); // Extract byte from input string - - if ($v < 128) { // We found an ASCII char - put into stirng as is - $output[$out_len] = $v; - ++$out_len; - if ('add' == $mode) { - throw new UnexpectedValueException('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k); - } - continue; - } - if ('next' == $mode) { // Try to find the next start byte; determine the width of the Unicode char - $start_byte = $v; - $mode = 'add'; - $test = 'range'; - if ($v >> 5 == 6) { // &110xxxxx 10xxxxx - $next_byte = 0; // Tells, how many times subsequent bitmasks must rotate 6bits to the left - $v = ($v - 192) << 6; - } elseif ($v >> 4 == 14) { // &1110xxxx 10xxxxxx 10xxxxxx - $next_byte = 1; - $v = ($v - 224) << 12; - } elseif ($v >> 3 == 30) { // &11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - $next_byte = 2; - $v = ($v - 240) << 18; - } elseif ($v >> 2 == 62) { // &111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx - $next_byte = 3; - $v = ($v - 248) << 24; - } elseif ($v >> 1 == 126) { // &1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx - $next_byte = 4; - $v = ($v - 252) << 30; - } else { - throw new UnexpectedValueException('This might be UTF-8, but I don\'t understand it at byte '.$k); - } - if ('add' == $mode) { - $output[$out_len] = (int) $v; - ++$out_len; - continue; - } - } - if ('add' == $mode) { - if (!$this->_allow_overlong && $test == 'range') { - $test = 'none'; - if (($v < 0xA0 && $start_byte == 0xE0) || ($v < 0x90 && $start_byte == 0xF0) || ($v > 0x8F && $start_byte == 0xF4)) { - throw new OutOfRangeException('Bogus UTF-8 character detected (out of legal range) at byte '.$k); - } - } - if ($v >> 6 == 2) { // Bit mask must be 10xxxxxx - $v = ($v - 128) << ($next_byte * 6); - $output[($out_len - 1)] += $v; - --$next_byte; - } else { - throw new UnexpectedValueException('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k); - } - if ($next_byte < 0) { - $mode = 'next'; - } - } - } // for - return $output; - } - - /** - * Convert UCS-4 array into UTF-8 string - * - * @param array $input ucs4-encoded array - * - * @return string utf8-encoded string - * @throws Exception - * @access private - */ - private function _ucs4_to_utf8($input) - { - $output = ''; - - foreach ($input as $v) { - // $v = ord($v); - - if ($v < 128) { - // 7bit are transferred literally - $output .= chr($v); - } else if ($v < 1 << 11) { - // 2 bytes - $output .= chr(192 + ($v >> 6)) - . chr(128 + ($v & 63)); - } else if ($v < 1 << 16) { - // 3 bytes - $output .= chr(224 + ($v >> 12)) - . chr(128 + (($v >> 6) & 63)) - . chr(128 + ($v & 63)); - } else if ($v < 1 << 21) { - // 4 bytes - $output .= chr(240 + ($v >> 18)) - . chr(128 + (($v >> 12) & 63)) - . chr(128 + (($v >> 6) & 63)) - . chr(128 + ($v & 63)); - } else if ($v < 1 << 26) { - // 5 bytes - $output .= chr(248 + ($v >> 24)) - . chr(128 + (($v >> 18) & 63)) - . chr(128 + (($v >> 12) & 63)) - . chr(128 + (($v >> 6) & 63)) - . chr(128 + ($v & 63)); - } else if ($v < 1 << 31) { - // 6 bytes - $output .= chr(252 + ($v >> 30)) - . chr(128 + (($v >> 24) & 63)) - . chr(128 + (($v >> 18) & 63)) - . chr(128 + (($v >> 12) & 63)) - . chr(128 + (($v >> 6) & 63)) - . chr(128 + ($v & 63)); - } else { - throw new UnexpectedValueException('Conversion from UCS-4 to UTF-8 failed: malformed input'); - } - } - - return $output; - } - - /** - * Convert UCS-4 array into UCS-4 string - * - * @param array $input ucs4-encoded array - * - * @return string ucs4-encoded string - * @throws Exception - * @access private - */ - private function _ucs4_to_ucs4_string($input) - { - $output = ''; - // Take array values and split output to 4 bytes per value - // The bit mask is 255, which reads &11111111 - foreach ($input as $v) { - $output .= ($v & (255 << 24) >> 24) . ($v & (255 << 16) >> 16) . ($v & (255 << 8) >> 8) . ($v & 255); - } - return $output; - } - - /** - * Convert UCS-4 string into UCS-4 array - * - * @param string $input ucs4-encoded string - * - * @return array ucs4-encoded array - * @throws InvalidArgumentException - * @access private - */ - private function _ucs4_string_to_ucs4($input) - { - $output = array(); - - $inp_len = self::_byteLength($input); - // Input length must be dividable by 4 - if ($inp_len % 4) { - throw new InvalidArgumentException('Input UCS4 string is broken'); - } - - // Empty input - return empty output - if (!$inp_len) { - return $output; - } - - for ($i = 0, $out_len = -1; $i < $inp_len; ++$i) { - // Increment output position every 4 input bytes - if (!$i % 4) { - $out_len++; - $output[$out_len] = 0; - } - $output[$out_len] += ord($input{$i}) << (8 * (3 - ($i % 4) ) ); - } - return $output; - } - - /** - * Echo hex representation of UCS4 sequence. - * - * @param array $input UCS4 sequence - * @param boolean $include_bit Include bitmask in output - * - * @return void - * @static - * @access private - */ - private static function _showHex($input, $include_bit = false) - { - foreach ($input as $k => $v) { - echo '[', $k, '] => ', sprintf('%X', $v); - - if ($include_bit) { - echo ' (', Net_IDNA2::_showBitmask($v), ')'; - } - - echo "\n"; - } - } - - /** - * Gives you a bit representation of given Byte (8 bits), Word (16 bits) or DWord (32 bits) - * Output width is automagically determined - * - * @param int $octet ... - * - * @return string Bitmask-representation - * @static - * @access private - */ - private static function _showBitmask($octet) - { - if ($octet >= (1 << 16)) { - $w = 31; - } else if ($octet >= (1 << 8)) { - $w = 15; - } else { - $w = 7; - } - - $return = ''; - - for ($i = $w; $i > -1; $i--) { - $return .= ($octet & (1 << $i))? '1' : '0'; - } - - return $return; - } - - /** - * Gets the length of a string in bytes even if mbstring function - * overloading is turned on - * - * @param string $string the string for which to get the length. - * - * @return integer the length of the string in bytes. - * - * @see Net_IDNA2::$_mb_string_overload - */ - private static function _byteLength($string) - { - if (self::$_mb_string_overload) { - return mb_strlen($string, '8bit'); - } - return strlen((binary)$string); - } - - // }}}} - - // {{{ factory - /** - * Attempts to return a concrete IDNA instance for either php4 or php5. - * - * @param array $params Set of paramaters - * - * @return Net_IDNA2 - * @access public - */ - function getInstance($params = array()) - { - return new Net_IDNA2($params); - } - // }}} - - // {{{ singleton - /** - * Attempts to return a concrete IDNA instance for either php4 or php5, - * only creating a new instance if no IDNA instance with the same - * parameters currently exists. - * - * @param array $params Set of paramaters - * - * @return object Net_IDNA2 - * @access public - */ - function singleton($params = array()) - { - static $instances; - if (!isset($instances)) { - $instances = array(); - } - - $signature = serialize($params); - if (!isset($instances[$signature])) { - $instances[$signature] = Net_IDNA2::getInstance($params); - } - - return $instances[$signature]; - } - // }}} -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Vendors/Net/IDNA2CustomExceptions.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Vendors/Net/IDNA2CustomExceptions.php deleted file mode 100755 index 69b0f691..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/MailSo/Vendors/Net/IDNA2CustomExceptions.php +++ /dev/null @@ -1,18 +0,0 @@ -getSignature(); - } - - return $sSignature; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/LICENSE.txt b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/LICENSE.txt deleted file mode 100755 index 90e632a7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/LICENSE.txt +++ /dev/null @@ -1,48 +0,0 @@ -MIT License - -Copyright (c) <2011-2015> Serban Ghita, Nick Ilyin and contributors. - -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. - -Developer’s Certificate of Origin 1.1 - -By making a contribution to this project, I certify that: - -(a) The contribution was created in whole or in part by me and I - have the right to submit it under the open source license - indicated in the file; or - -(b) The contribution is based upon previous work that, to the best - of my knowledge, is covered under an appropriate open source - license and I have the right under that license to submit that - work with modifications, whether created in whole or in part - by me, under the same open source license (unless I am - permitted to submit under a different license), as indicated - in the file; or - -(c) The contribution was provided directly to me by some other - person who certified (a), (b) or (c) and I have not modified - it. - -(d) I understand and agree that this project and the contribution - are public and that a record of the contribution (including all - personal information I submit with it, including my sign-off) is - maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/Mobile_Detect.json b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/Mobile_Detect.json deleted file mode 100755 index 63d2aa7b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/Mobile_Detect.json +++ /dev/null @@ -1 +0,0 @@ -{"version":"2.8.26","headerMatch":{"HTTP_ACCEPT":{"matches":["application\/x-obml2d","application\/vnd.rim.html","text\/vnd.wap.wml","application\/vnd.wap.xhtml+xml"]},"HTTP_X_WAP_PROFILE":null,"HTTP_X_WAP_CLIENTID":null,"HTTP_WAP_CONNECTION":null,"HTTP_PROFILE":null,"HTTP_X_OPERAMINI_PHONE_UA":null,"HTTP_X_NOKIA_GATEWAY_ID":null,"HTTP_X_ORANGE_ID":null,"HTTP_X_VODAFONE_3GPDPCONTEXT":null,"HTTP_X_HUAWEI_USERID":null,"HTTP_UA_OS":null,"HTTP_X_MOBILE_GATEWAY":null,"HTTP_X_ATT_DEVICEID":null,"HTTP_UA_CPU":{"matches":["ARM"]}},"uaHttpHeaders":["HTTP_USER_AGENT","HTTP_X_OPERAMINI_PHONE_UA","HTTP_X_DEVICE_USER_AGENT","HTTP_X_ORIGINAL_USER_AGENT","HTTP_X_SKYFIRE_PHONE","HTTP_X_BOLT_PHONE_UA","HTTP_DEVICE_STOCK_UA","HTTP_X_UCBROWSER_DEVICE_UA"],"uaMatch":{"phones":{"iPhone":"\\biPhone\\b|\\biPod\\b","BlackBerry":"BlackBerry|\\bBB10\\b|rim[0-9]+","HTC":"HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\\bEVO\\b|T-Mobile G1|Z520m","Nexus":"Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6","Dell":"Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\\b001DL\\b|\\b101DL\\b|\\bGS01\\b","Motorola":"Motorola|DROIDX|DROID BIONIC|\\bDroid\\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\\bMoto E\\b","Samsung":"\\bSamsung\\b|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F|SM-G920F|SM-G920V|SM-G930F|SM-N910C","LG":"\\bLG\\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|MS323)","Sony":"SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533","Asus":"Asus.*Galaxy|PadFone.*Mobile","NokiaLumia":"Lumia [0-9]{3,4}","Micromax":"Micromax.*\\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\\b","Palm":"PalmSource|Palm","Vertu":"Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature","Pantech":"PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790","Fly":"IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250","Wiko":"KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM","iMobile":"i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)","SimValley":"\\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\\b","Wolfgang":"AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q","Alcatel":"Alcatel","Nintendo":"Nintendo 3DS","Amoi":"Amoi","INQ":"INQ","GenericPhone":"Tapatalk|PDA;|SAGEM|\\bmmp\\b|pocket|\\bpsp\\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\\bwap\\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser"},"tablets":{"iPad":"iPad|iPad.*Mobile","NexusTablet":"Android.*Nexus[\\s]+(7|9|10)","SamsungTablet":"SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-T116BU|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713|SM-T719|SM-T813|SM-T819|SM-T580|SM-T355Y|SM-T280|SM-T817A|SM-T820|SM-W700|SM-P580|SM-T587|SM-P350|SM-P555M|SM-P355M|SM-T113NU|SM-T815Y","Kindle":"Kindle|Silk.*Accelerated|Android.*\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI|KFFOWI|KFGIWI|KFMEWI)\\b|Android.*Silk\/[0-9.]+ like Chrome\/[0-9.]+ (?!Mobile)","SurfaceTablet":"Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)","HPTablet":"HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10","AsusTablet":"^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\\bK00F\\b|\\bK00C\\b|\\bK00E\\b|\\bK00L\\b|TX201LA|ME176C|ME102A|\\bM80TA\\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\\bME70C\\b|ME581C|ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z|\\bP027\\b","BlackBerryTablet":"PlayBook|RIM Tablet","HTCtablet":"HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410","MotorolaTablet":"xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617","NookTablet":"Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2","AcerTablet":"Android.*; \\b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\\b|W3-810|\\bA3-A10\\b|\\bA3-A11\\b|\\bA3-A20\\b|\\bA3-A30","ToshibaTablet":"Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO","LGTablet":"\\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\\b","FujitsuTablet":"Android.*\\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\\b","PrestigioTablet":"PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002","LenovoTablet":"Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-850M|YT3-X90L|YT3-X90F|YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)","DellTablet":"Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7","YarvikTablet":"Android.*\\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\\b","MedionTablet":"Android.*\\bOYO\\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB","ArnovaTablet":"97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2","IntensoTablet":"INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004","IRUTablet":"M702pro","MegafonTablet":"MegaFon V9|\\bZTE V9\\b|Android.*\\bMT7A\\b","EbodaTablet":"E-Boda (Supreme|Impresspeed|Izzycomm|Essential)","AllViewTablet":"Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)","ArchosTablet":"\\b(101G9|80G9|A101IT)\\b|Qilive 97R|Archos5|\\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|c|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\\b","AinolTablet":"NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark","NokiaLumiaTablet":"Lumia 2520","SonyTablet":"Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP612|SOT31","PhilipsTablet":"\\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\\b","CubeTablet":"Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT","CobyTablet":"MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010","MIDTablet":"M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10","MSITablet":"MSI \\b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\\b","SMiTTablet":"Android.*(\\bMID\\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)","RockChipTablet":"Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A","FlyTablet":"IQ310|Fly Vision","bqTablet":"Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris [E|M]10)|Maxwell.*Lite|Maxwell.*Plus","HuaweiTablet":"MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim","NecTablet":"\\bN-06D|\\bN-08D","PantechTablet":"Pantech.*P4100","BronchoTablet":"Broncho.*(N701|N708|N802|a710)","VersusTablet":"TOUCHPAD.*[78910]|\\bTOUCHTAB\\b","ZyncTablet":"z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900","PositivoTablet":"TB07STA|TB10STA|TB07FTA|TB10FTA","NabiTablet":"Android.*\\bNabi","KoboTablet":"Kobo Touch|\\bK080\\b|\\bVox\\b Build|\\bArc\\b Build","DanewTablet":"DSlide.*\\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\\b","TexetTablet":"NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE","PlaystationTablet":"Playstation.*(Portable|Vita)","TrekstorTablet":"ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab","PyleAudioTablet":"\\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\\b","AdvanTablet":"Android.* \\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\b ","DanyTechTablet":"Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1","GalapadTablet":"Android.*\\bG1\\b","MicromaxTablet":"Funbook|Micromax.*\\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\\b","KarbonnTablet":"Android.*\\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\\b","AllFineTablet":"Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide","PROSCANTablet":"\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\b","YONESTablet":"BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026","ChangJiaTablet":"TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503","GUTablet":"TX-A1301|TX-M9002|Q702|kf026","PointOfViewTablet":"TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10","OvermaxTablet":"OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)","HCLTablet":"HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync","DPSTablet":"DPS Dream 9|DPS Dual 7","VistureTablet":"V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10","CrestaTablet":"CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989","MediatekTablet":"\\bMT8125|MT8389|MT8135|MT8377\\b","ConcordeTablet":"Concorde([ ]+)?Tab|ConCorde ReadMan","GoCleverTablet":"GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042","ModecomTablet":"FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003","VoninoTablet":"\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\\bQ8\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\b","ECSTablet":"V07OT2|TM105A|S10OT1|TR10CS1","StorexTablet":"eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab","VodafoneTablet":"SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497","EssentielBTablet":"Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2","RossMoorTablet":"RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711","iMobileTablet":"i-mobile i-note","TolinoTablet":"tolino tab [0-9.]+|tolino shine","AudioSonicTablet":"\\bC-22Q|T7-QC|T-17B|T-17P\\b","AMPETablet":"Android.* A78 ","SkkTablet":"Android.* (SKYPAD|PHOENIX|CYCLOPS)","TecnoTablet":"TECNO P9","JXDTablet":"Android.* \\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\\b","iJoyTablet":"Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)","FX2Tablet":"FX2 PAD7|FX2 PAD10","XoroTablet":"KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151","ViewsonicTablet":"ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a","OdysTablet":"LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\\bXELIO\\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10","CaptivaTablet":"CAPTIVA PAD","IconbitTablet":"NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S","TeclastTablet":"T98 4G|\\bP80\\b|\\bX90HD\\b|X98 Air|X98 Air 3G|\\bX89\\b|P80 3G|\\bX80h\\b|P98 Air|\\bX89HD\\b|P98 3G|\\bP90HD\\b|P89 3G|X98 3G|\\bP70h\\b|P79HD 3G|G18d 3G|\\bP79HD\\b|\\bP89s\\b|\\bA88\\b|\\bP10HD\\b|\\bP19HD\\b|G18 3G|\\bP78HD\\b|\\bA78\\b|\\bP75\\b|G17s 3G|G17h 3G|\\bP85t\\b|\\bP90\\b|\\bP11\\b|\\bP98t\\b|\\bP98HD\\b|\\bG18d\\b|\\bP85s\\b|\\bP11HD\\b|\\bP88s\\b|\\bA80HD\\b|\\bA80se\\b|\\bA10h\\b|\\bP89\\b|\\bP78s\\b|\\bG18\\b|\\bP85\\b|\\bA70h\\b|\\bA70\\b|\\bG17\\b|\\bP18\\b|\\bA80s\\b|\\bA11s\\b|\\bP88HD\\b|\\bA80h\\b|\\bP76s\\b|\\bP76h\\b|\\bP98\\b|\\bA10HD\\b|\\bP78\\b|\\bP88\\b|\\bA11\\b|\\bA10t\\b|\\bP76a\\b|\\bP76t\\b|\\bP76e\\b|\\bP85HD\\b|\\bP85a\\b|\\bP86\\b|\\bP75HD\\b|\\bP76v\\b|\\bA12\\b|\\bP75a\\b|\\bA15\\b|\\bP76Ti\\b|\\bP81HD\\b|\\bA10\\b|\\bT760VE\\b|\\bT720HD\\b|\\bP76\\b|\\bP73\\b|\\bP71\\b|\\bP72\\b|\\bT720SE\\b|\\bC520Ti\\b|\\bT760\\b|\\bT720VE\\b|T720-3GE|T720-WiFi","OndaTablet":"\\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\\b[\\s]+","JaytechTablet":"TPC-PA762","BlaupunktTablet":"Endeavour 800NG|Endeavour 1010","DigmaTablet":"\\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\\b","EvolioTablet":"ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\\bEvotab\\b|\\bNeura\\b","LavaTablet":"QPAD E704|\\bIvoryS\\b|E-TAB IVORY|\\bE-TAB\\b","AocTablet":"MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712","MpmanTablet":"MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\\bMPG7\\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010","CelkonTablet":"CT695|CT888|CT[\\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\\bCT-1\\b","WolderTablet":"miTab \\b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\\b","MiTablet":"\\bMI PAD\\b|\\bHM NOTE 1W\\b","NibiruTablet":"Nibiru M1|Nibiru Jupiter One","NexoTablet":"NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI","LeaderTablet":"TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100","UbislateTablet":"UbiSlate[\\s]?7C","PocketBookTablet":"Pocketbook","KocasoTablet":"\\b(TB-1207)\\b","HisenseTablet":"\\b(F5281|E2371)\\b","Hudl":"Hudl HT7S3|Hudl 2","TelstraTablet":"T-Hub2","GenericTablet":"Android.*\\b97D\\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\\bA7EB\\b|CatNova8|A1_07|CT704|CT1002|\\bM721\\b|rk30sdk|\\bEVOTAB\\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\\bM6pro\\b|CT1020W|arc 10HD|\\bTP750\\b|\\bQTAQZ3\\b"},"browsers":{"Chrome":"\\bCrMo\\b|CriOS|Android.*Chrome\/[.0-9]* (Mobile)?","Dolfin":"\\bDolfin\\b","Opera":"Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR\/[0-9.]+|Coast\/[0-9.]+","Skyfire":"Skyfire","Edge":"Mobile Safari\/[.0-9]* Edge","IE":"IEMobile|MSIEMobile","Firefox":"fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile|FxiOS","Bolt":"bolt","TeaShark":"teashark","Blazer":"Blazer","Safari":"Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari","UCBrowser":"UC.*Browser|UCWEB","baiduboxapp":"baiduboxapp","baidubrowser":"baidubrowser","DiigoBrowser":"DiigoBrowser","Puffin":"Puffin","Mercury":"\\bMercury\\b","ObigoBrowser":"Obigo","NetFront":"NF-Browser","GenericBrowser":"NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger","PaleMoon":"Android.*PaleMoon|Mobile.*PaleMoon"},"os":{"AndroidOS":"Android","BlackBerryOS":"blackberry|\\bBB10\\b|rim tablet os","PalmOS":"PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino","SymbianOS":"Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\\bS60\\b","WindowsMobileOS":"Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;","WindowsPhoneOS":"Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;","iOS":"\\biPhone.*Mobile|\\biPod|\\biPad","MeeGoOS":"MeeGo","MaemoOS":"Maemo","JavaOS":"J2ME\/|\\bMIDP\\b|\\bCLDC\\b","webOS":"webOS|hpwOS","badaOS":"\\bBada\\b","BREWOS":"BREW"},"utilities":{"Bot":"Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|YandexMobileBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom","MobileBot":"Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker\/M1A1-R2D2","DesktopMode":"WPDesktop","TV":"SonyDTV|HbbTV","WebKit":"(webkit)[ \/]([\\w.]+)","Console":"\\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\\b","Watch":"SM-V700"}}} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/Mobile_Detect.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/Mobile_Detect.php deleted file mode 100755 index 6d0a36d5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/Mobile_Detect.php +++ /dev/null @@ -1,1460 +0,0 @@ - - * Nick Ilyin - * - * Original author: Victor Stanciu - * - * @license Code and contributions have 'MIT License' - * More details: https://github.com/serbanghita/Mobile-Detect/blob/master/LICENSE.txt - * - * @link Homepage: http://mobiledetect.net - * GitHub Repo: https://github.com/serbanghita/Mobile-Detect - * Google Code: http://code.google.com/p/php-mobile-detect/ - * README: https://github.com/serbanghita/Mobile-Detect/blob/master/README.md - * HOWTO: https://github.com/serbanghita/Mobile-Detect/wiki/Code-examples - * - * @version 2.8.26 - */ - -class Mobile_Detect -{ - /** - * Mobile detection type. - * - * @deprecated since version 2.6.9 - */ - const DETECTION_TYPE_MOBILE = 'mobile'; - - /** - * Extended detection type. - * - * @deprecated since version 2.6.9 - */ - const DETECTION_TYPE_EXTENDED = 'extended'; - - /** - * A frequently used regular expression to extract version #s. - * - * @deprecated since version 2.6.9 - */ - const VER = '([\w._\+]+)'; - - /** - * Top-level device. - */ - const MOBILE_GRADE_A = 'A'; - - /** - * Mid-level device. - */ - const MOBILE_GRADE_B = 'B'; - - /** - * Low-level device. - */ - const MOBILE_GRADE_C = 'C'; - - /** - * Stores the version number of the current release. - */ - const VERSION = '2.8.26'; - - /** - * A type for the version() method indicating a string return value. - */ - const VERSION_TYPE_STRING = 'text'; - - /** - * A type for the version() method indicating a float return value. - */ - const VERSION_TYPE_FLOAT = 'float'; - - /** - * A cache for resolved matches - * @var array - */ - protected $cache = array(); - - /** - * The User-Agent HTTP header is stored in here. - * @var string - */ - protected $userAgent = null; - - /** - * HTTP headers in the PHP-flavor. So HTTP_USER_AGENT and SERVER_SOFTWARE. - * @var array - */ - protected $httpHeaders = array(); - - /** - * CloudFront headers. E.g. CloudFront-Is-Desktop-Viewer, CloudFront-Is-Mobile-Viewer & CloudFront-Is-Tablet-Viewer. - * @var array - */ - protected $cloudfrontHeaders = array(); - - /** - * The matching Regex. - * This is good for debug. - * @var string - */ - protected $matchingRegex = null; - - /** - * The matches extracted from the regex expression. - * This is good for debug. - * @var string - */ - protected $matchesArray = null; - - /** - * The detection type, using self::DETECTION_TYPE_MOBILE or self::DETECTION_TYPE_EXTENDED. - * - * @deprecated since version 2.6.9 - * - * @var string - */ - protected $detectionType = self::DETECTION_TYPE_MOBILE; - - /** - * HTTP headers that trigger the 'isMobile' detection - * to be true. - * - * @var array - */ - protected static $mobileHeaders = array( - - 'HTTP_ACCEPT' => array('matches' => array( - // Opera Mini; @reference: http://dev.opera.com/articles/view/opera-binary-markup-language/ - 'application/x-obml2d', - // BlackBerry devices. - 'application/vnd.rim.html', - 'text/vnd.wap.wml', - 'application/vnd.wap.xhtml+xml' - )), - 'HTTP_X_WAP_PROFILE' => null, - 'HTTP_X_WAP_CLIENTID' => null, - 'HTTP_WAP_CONNECTION' => null, - 'HTTP_PROFILE' => null, - // Reported by Opera on Nokia devices (eg. C3). - 'HTTP_X_OPERAMINI_PHONE_UA' => null, - 'HTTP_X_NOKIA_GATEWAY_ID' => null, - 'HTTP_X_ORANGE_ID' => null, - 'HTTP_X_VODAFONE_3GPDPCONTEXT' => null, - 'HTTP_X_HUAWEI_USERID' => null, - // Reported by Windows Smartphones. - 'HTTP_UA_OS' => null, - // Reported by Verizon, Vodafone proxy system. - 'HTTP_X_MOBILE_GATEWAY' => null, - // Seen this on HTC Sensation. SensationXE_Beats_Z715e. - 'HTTP_X_ATT_DEVICEID' => null, - // Seen this on a HTC. - 'HTTP_UA_CPU' => array('matches' => array('ARM')), - ); - - /** - * List of mobile devices (phones). - * - * @var array - */ - protected static $phoneDevices = array( - 'iPhone' => '\biPhone\b|\biPod\b', // |\biTunes - 'BlackBerry' => 'BlackBerry|\bBB10\b|rim[0-9]+', - 'HTC' => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m', - 'Nexus' => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6', - // @todo: Is 'Dell Streak' a tablet or a phone? ;) - 'Dell' => 'Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b', - 'Motorola' => 'Motorola|DROIDX|DROID BIONIC|\bDroid\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\bMoto E\b', - 'Samsung' => '\bSamsung\b|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F|SM-G920F|SM-G920V|SM-G930F|SM-N910C', - 'LG' => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|MS323)', - 'Sony' => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533', - 'Asus' => 'Asus.*Galaxy|PadFone.*Mobile', - 'NokiaLumia' => 'Lumia [0-9]{3,4}', - // http://www.micromaxinfo.com/mobiles/smartphones - // Added because the codes might conflict with Acer Tablets. - 'Micromax' => 'Micromax.*\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\b', - // @todo Complete the regex. - 'Palm' => 'PalmSource|Palm', // avantgo|blazer|elaine|hiptop|plucker|xiino ; - 'Vertu' => 'Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature', // Just for fun ;) - // http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA (PANTECH) - // Most of the VEGA devices are legacy. PANTECH seem to be newer devices based on Android. - 'Pantech' => 'PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790', - // http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones. - 'Fly' => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250', - // http://fr.wikomobile.com - 'Wiko' => 'KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM', - 'iMobile' => 'i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)', - // Added simvalley mobile just for fun. They have some interesting devices. - // http://www.simvalley.fr/telephonie---gps-_22_telephonie-mobile_telephones_.html - 'SimValley' => '\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\b', - // Wolfgang - a brand that is sold by Aldi supermarkets. - // http://www.wolfgangmobile.com/ - 'Wolfgang' => 'AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q', - 'Alcatel' => 'Alcatel', - 'Nintendo' => 'Nintendo 3DS', - // http://en.wikipedia.org/wiki/Amoi - 'Amoi' => 'Amoi', - // http://en.wikipedia.org/wiki/INQ - 'INQ' => 'INQ', - // @Tapatalk is a mobile app; http://support.tapatalk.com/threads/smf-2-0-2-os-and-browser-detection-plugin-and-tapatalk.15565/#post-79039 - 'GenericPhone' => 'Tapatalk|PDA;|SAGEM|\bmmp\b|pocket|\bpsp\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\bwap\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser', - ); - - /** - * List of tablet devices. - * - * @var array - */ - protected static $tabletDevices = array( - // @todo: check for mobile friendly emails topic. - 'iPad' => 'iPad|iPad.*Mobile', - // Removed |^.*Android.*Nexus(?!(?:Mobile).)*$ - // @see #442 - 'NexusTablet' => 'Android.*Nexus[\s]+(7|9|10)', - 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-T116BU|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713|SM-T719|SM-T813|SM-T819|SM-T580|SM-T355Y|SM-T280|SM-T817A|SM-T820|SM-W700|SM-P580|SM-T587|SM-P350|SM-P555M|SM-P355M|SM-T113NU|SM-T815Y', // SCH-P709|SCH-P729|SM-T2558|GT-I9205 - Samsung Mega - treat them like a regular phone. - // http://docs.aws.amazon.com/silk/latest/developerguide/user-agent.html - 'Kindle' => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI|KFFOWI|KFGIWI|KFMEWI)\b|Android.*Silk/[0-9.]+ like Chrome/[0-9.]+ (?!Mobile)', - // Only the Surface tablets with Windows RT are considered mobile. - // http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx - 'SurfaceTablet' => 'Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)', - // http://shopping1.hp.com/is-bin/INTERSHOP.enfinity/WFS/WW-USSMBPublicStore-Site/en_US/-/USD/ViewStandardCatalog-Browse?CatalogCategoryID=JfIQ7EN5lqMAAAEyDcJUDwMT - 'HPTablet' => 'HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10', - // Watch out for PadFone, see #132. - // http://www.asus.com/de/Tablets_Mobile/Memo_Pad_Products/ - 'AsusTablet' => '^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\bK00F\b|\bK00C\b|\bK00E\b|\bK00L\b|TX201LA|ME176C|ME102A|\bM80TA\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\bME70C\b|ME581C|ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z|\bP027\b', - 'BlackBerryTablet' => 'PlayBook|RIM Tablet', - 'HTCtablet' => 'HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410', - 'MotorolaTablet' => 'xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617', - 'NookTablet' => 'Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2', - // http://www.acer.ro/ac/ro/RO/content/drivers - // http://www.packardbell.co.uk/pb/en/GB/content/download (Packard Bell is part of Acer) - // http://us.acer.com/ac/en/US/content/group/tablets - // http://www.acer.de/ac/de/DE/content/models/tablets/ - // Can conflict with Micromax and Motorola phones codes. - 'AcerTablet' => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\b|W3-810|\bA3-A10\b|\bA3-A11\b|\bA3-A20\b|\bA3-A30', - // http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/ - // http://us.toshiba.com/tablets/tablet-finder - // http://www.toshiba.co.jp/regza/tablet/ - 'ToshibaTablet' => 'Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO', - // http://www.nttdocomo.co.jp/english/service/developer/smart_phone/technical_info/spec/index.html - // http://www.lg.com/us/tablets - 'LGTablet' => '\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\b', - 'FujitsuTablet' => 'Android.*\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\b', - // Prestigio Tablets http://www.prestigio.com/support - 'PrestigioTablet' => 'PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002', - // http://support.lenovo.com/en_GB/downloads/default.page?# - 'LenovoTablet' => 'Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-850M|YT3-X90L|YT3-X90F|YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)', - // http://www.dell.com/support/home/us/en/04/Products/tab_mob/tablets - 'DellTablet' => 'Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7', - // http://www.yarvik.com/en/matrix/tablets/ - 'YarvikTablet' => 'Android.*\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\b', - 'MedionTablet' => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB', - 'ArnovaTablet' => '97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2', - // http://www.intenso.de/kategorie_en.php?kategorie=33 - // @todo: http://www.nbhkdz.com/read/b8e64202f92a2df129126bff.html - investigate - 'IntensoTablet' => 'INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004', - // IRU.ru Tablets http://www.iru.ru/catalog/soho/planetable/ - 'IRUTablet' => 'M702pro', - 'MegafonTablet' => 'MegaFon V9|\bZTE V9\b|Android.*\bMT7A\b', - // http://www.e-boda.ro/tablete-pc.html - 'EbodaTablet' => 'E-Boda (Supreme|Impresspeed|Izzycomm|Essential)', - // http://www.allview.ro/produse/droseries/lista-tablete-pc/ - 'AllViewTablet' => 'Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)', - // http://wiki.archosfans.com/index.php?title=Main_Page - // @note Rewrite the regex format after we add more UAs. - 'ArchosTablet' => '\b(101G9|80G9|A101IT)\b|Qilive 97R|Archos5|\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|c|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\b', - // http://www.ainol.com/plugin.php?identifier=ainol&module=product - 'AinolTablet' => 'NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark', - 'NokiaLumiaTablet' => 'Lumia 2520', - // @todo: inspect http://esupport.sony.com/US/p/select-system.pl?DIRECTOR=DRIVER - // Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser - // http://www.sony.jp/support/tablet/ - 'SonyTablet' => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP612|SOT31', - // http://www.support.philips.com/support/catalog/worldproducts.jsp?userLanguage=en&userCountry=cn&categoryid=3G_LTE_TABLET_SU_CN_CARE&title=3G%20tablets%20/%20LTE%20range&_dyncharset=UTF-8 - 'PhilipsTablet' => '\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\b', - // db + http://www.cube-tablet.com/buy-products.html - 'CubeTablet' => 'Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT', - // http://www.cobyusa.com/?p=pcat&pcat_id=3001 - 'CobyTablet' => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010', - // http://www.match.net.cn/products.asp - 'MIDTablet' => 'M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10', - // http://www.msi.com/support - // @todo Research the Windows Tablets. - 'MSITablet' => 'MSI \b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\b', - // @todo http://www.kyoceramobile.com/support/drivers/ - // 'KyoceraTablet' => null, - // @todo http://intexuae.com/index.php/category/mobile-devices/tablets-products/ - // 'IntextTablet' => null, - // http://pdadb.net/index.php?m=pdalist&list=SMiT (NoName Chinese Tablets) - // http://www.imp3.net/14/show.php?itemid=20454 - 'SMiTTablet' => 'Android.*(\bMID\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)', - // http://www.rock-chips.com/index.php?do=prod&pid=2 - 'RockChipTablet' => 'Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A', - // http://www.fly-phone.com/devices/tablets/ ; http://www.fly-phone.com/service/ - 'FlyTablet' => 'IQ310|Fly Vision', - // http://www.bqreaders.com/gb/tablets-prices-sale.html - 'bqTablet' => 'Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris [E|M]10)|Maxwell.*Lite|Maxwell.*Plus', - // http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290 - // http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets) - 'HuaweiTablet' => 'MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim', - // Nec or Medias Tab - 'NecTablet' => '\bN-06D|\bN-08D', - // Pantech Tablets: http://www.pantechusa.com/phones/ - 'PantechTablet' => 'Pantech.*P4100', - // Broncho Tablets: http://www.broncho.cn/ (hard to find) - 'BronchoTablet' => 'Broncho.*(N701|N708|N802|a710)', - // http://versusuk.com/support.html - 'VersusTablet' => 'TOUCHPAD.*[78910]|\bTOUCHTAB\b', - // http://www.zync.in/index.php/our-products/tablet-phablets - 'ZyncTablet' => 'z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900', - // http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/ - 'PositivoTablet' => 'TB07STA|TB10STA|TB07FTA|TB10FTA', - // https://www.nabitablet.com/ - 'NabiTablet' => 'Android.*\bNabi', - 'KoboTablet' => 'Kobo Touch|\bK080\b|\bVox\b Build|\bArc\b Build', - // French Danew Tablets http://www.danew.com/produits-tablette.php - 'DanewTablet' => 'DSlide.*\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\b', - // Texet Tablets and Readers http://www.texet.ru/tablet/ - 'TexetTablet' => 'NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE', - // Avoid detecting 'PLAYSTATION 3' as mobile. - 'PlaystationTablet' => 'Playstation.*(Portable|Vita)', - // http://www.trekstor.de/surftabs.html - 'TrekstorTablet' => 'ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab', - // http://www.pyleaudio.com/Products.aspx?%2fproducts%2fPersonal-Electronics%2fTablets - 'PyleAudioTablet' => '\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\b', - // http://www.advandigital.com/index.php?link=content-product&jns=JP001 - // because of the short codenames we have to include whitespaces to reduce the possible conflicts. - 'AdvanTablet' => 'Android.* \b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\b ', - // http://www.danytech.com/category/tablet-pc - 'DanyTechTablet' => 'Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1', - // http://www.galapad.net/product.html - 'GalapadTablet' => 'Android.*\bG1\b', - // http://www.micromaxinfo.com/tablet/funbook - 'MicromaxTablet' => 'Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b', - // http://www.karbonnmobiles.com/products_tablet.php - 'KarbonnTablet' => 'Android.*\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\b', - // http://www.myallfine.com/Products.asp - 'AllFineTablet' => 'Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide', - // http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr= - 'PROSCANTablet' => '\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\b', - // http://www.yonesnav.com/products/products.php - 'YONESTablet' => 'BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026', - // http://www.cjshowroom.com/eproducts.aspx?classcode=004001001 - // China manufacturer makes tablets for different small brands (eg. http://www.zeepad.net/index.html) - 'ChangJiaTablet' => 'TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503', - // http://www.gloryunion.cn/products.asp - // http://www.allwinnertech.com/en/apply/mobile.html - // http://www.ptcl.com.pk/pd_content.php?pd_id=284 (EVOTAB) - // @todo: Softwiner tablets? - // aka. Cute or Cool tablets. Not sure yet, must research to avoid collisions. - 'GUTablet' => 'TX-A1301|TX-M9002|Q702|kf026', // A12R|D75A|D77|D79|R83|A95|A106C|R15|A75|A76|D71|D72|R71|R73|R77|D82|R85|D92|A97|D92|R91|A10F|A77F|W71F|A78F|W78F|W81F|A97F|W91F|W97F|R16G|C72|C73E|K72|K73|R96G - // http://www.pointofview-online.com/showroom.php?shop_mode=product_listing&category_id=118 - 'PointOfViewTablet' => 'TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10', - // http://www.overmax.pl/pl/katalog-produktow,p8/tablety,c14/ - // @todo: add more tests. - 'OvermaxTablet' => 'OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)', - // http://hclmetablet.com/India/index.php - 'HCLTablet' => 'HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync', - // http://www.edigital.hu/Tablet_es_e-book_olvaso/Tablet-c18385.html - 'DPSTablet' => 'DPS Dream 9|DPS Dual 7', - // http://www.visture.com/index.asp - 'VistureTablet' => 'V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10', - // http://www.mijncresta.nl/tablet - 'CrestaTablet' => 'CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989', - // MediaTek - http://www.mediatek.com/_en/01_products/02_proSys.php?cata_sn=1&cata1_sn=1&cata2_sn=309 - 'MediatekTablet' => '\bMT8125|MT8389|MT8135|MT8377\b', - // Concorde tab - 'ConcordeTablet' => 'Concorde([ ]+)?Tab|ConCorde ReadMan', - // GoClever Tablets - http://www.goclever.com/uk/products,c1/tablet,c5/ - 'GoCleverTablet' => 'GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042', - // Modecom Tablets - http://www.modecom.eu/tablets/portal/ - 'ModecomTablet' => 'FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003', - // Vonino Tablets - http://www.vonino.eu/tablets - 'VoninoTablet' => '\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\bQ8\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\b', - // ECS Tablets - http://www.ecs.com.tw/ECSWebSite/Product/Product_Tablet_List.aspx?CategoryID=14&MenuID=107&childid=M_107&LanID=0 - 'ECSTablet' => 'V07OT2|TM105A|S10OT1|TR10CS1', - // Storex Tablets - http://storex.fr/espace_client/support.html - // @note: no need to add all the tablet codes since they are guided by the first regex. - 'StorexTablet' => 'eZee[_\']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab', - // Generic Vodafone tablets. - 'VodafoneTablet' => 'SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497', - // French tablets - Essentiel B http://www.boulanger.fr/tablette_tactile_e-book/tablette_tactile_essentiel_b/cl_68908.htm?multiChoiceToDelete=brand&mc_brand=essentielb - // Aka: http://www.essentielb.fr/ - 'EssentielBTablet' => 'Smart[ \']?TAB[ ]+?[0-9]+|Family[ \']?TAB2', - // Ross & Moor - http://ross-moor.ru/ - 'RossMoorTablet' => 'RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711', - // i-mobile http://product.i-mobilephone.com/Mobile_Device - 'iMobileTablet' => 'i-mobile i-note', - // http://www.tolino.de/de/vergleichen/ - 'TolinoTablet' => 'tolino tab [0-9.]+|tolino shine', - // AudioSonic - a Kmart brand - // http://www.kmart.com.au/webapp/wcs/stores/servlet/Search?langId=-1&storeId=10701&catalogId=10001&categoryId=193001&pageSize=72¤tPage=1&searchCategory=193001%2b4294965664&sortBy=p_MaxPrice%7c1 - 'AudioSonicTablet' => '\bC-22Q|T7-QC|T-17B|T-17P\b', - // AMPE Tablets - http://www.ampe.com.my/product-category/tablets/ - // @todo: add them gradually to avoid conflicts. - 'AMPETablet' => 'Android.* A78 ', - // Skk Mobile - http://skkmobile.com.ph/product_tablets.php - 'SkkTablet' => 'Android.* (SKYPAD|PHOENIX|CYCLOPS)', - // Tecno Mobile (only tablet) - http://www.tecno-mobile.com/index.php/product?filterby=smart&list_order=all&page=1 - 'TecnoTablet' => 'TECNO P9', - // JXD (consoles & tablets) - http://jxd.hk/products.asp?selectclassid=009008&clsid=3 - 'JXDTablet' => 'Android.* \b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\b', - // i-Joy tablets - http://www.i-joy.es/en/cat/products/tablets/ - 'iJoyTablet' => 'Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)', - // http://www.intracon.eu/tablet - 'FX2Tablet' => 'FX2 PAD7|FX2 PAD10', - // http://www.xoro.de/produkte/ - // @note: Might be the same brand with 'Simply tablets' - 'XoroTablet' => 'KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151', - // http://www1.viewsonic.com/products/computing/tablets/ - 'ViewsonicTablet' => 'ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a', - // http://www.odys.de/web/internet-tablet_en.html - 'OdysTablet' => 'LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\bXELIO\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10', - // http://www.captiva-power.de/products.html#tablets-en - 'CaptivaTablet' => 'CAPTIVA PAD', - // IconBIT - http://www.iconbit.com/products/tablets/ - 'IconbitTablet' => 'NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S', - // http://www.teclast.com/topic.php?channelID=70&topicID=140&pid=63 - 'TeclastTablet' => 'T98 4G|\bP80\b|\bX90HD\b|X98 Air|X98 Air 3G|\bX89\b|P80 3G|\bX80h\b|P98 Air|\bX89HD\b|P98 3G|\bP90HD\b|P89 3G|X98 3G|\bP70h\b|P79HD 3G|G18d 3G|\bP79HD\b|\bP89s\b|\bA88\b|\bP10HD\b|\bP19HD\b|G18 3G|\bP78HD\b|\bA78\b|\bP75\b|G17s 3G|G17h 3G|\bP85t\b|\bP90\b|\bP11\b|\bP98t\b|\bP98HD\b|\bG18d\b|\bP85s\b|\bP11HD\b|\bP88s\b|\bA80HD\b|\bA80se\b|\bA10h\b|\bP89\b|\bP78s\b|\bG18\b|\bP85\b|\bA70h\b|\bA70\b|\bG17\b|\bP18\b|\bA80s\b|\bA11s\b|\bP88HD\b|\bA80h\b|\bP76s\b|\bP76h\b|\bP98\b|\bA10HD\b|\bP78\b|\bP88\b|\bA11\b|\bA10t\b|\bP76a\b|\bP76t\b|\bP76e\b|\bP85HD\b|\bP85a\b|\bP86\b|\bP75HD\b|\bP76v\b|\bA12\b|\bP75a\b|\bA15\b|\bP76Ti\b|\bP81HD\b|\bA10\b|\bT760VE\b|\bT720HD\b|\bP76\b|\bP73\b|\bP71\b|\bP72\b|\bT720SE\b|\bC520Ti\b|\bT760\b|\bT720VE\b|T720-3GE|T720-WiFi', - // Onda - http://www.onda-tablet.com/buy-android-onda.html?dir=desc&limit=all&order=price - 'OndaTablet' => '\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\b[\s]+', - 'JaytechTablet' => 'TPC-PA762', - 'BlaupunktTablet' => 'Endeavour 800NG|Endeavour 1010', - // http://www.digma.ru/support/download/ - // @todo: Ebooks also (if requested) - 'DigmaTablet' => '\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\b', - // http://www.evolioshop.com/ro/tablete-pc.html - // http://www.evolio.ro/support/downloads_static.html?cat=2 - // @todo: Research some more - 'EvolioTablet' => 'ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\bEvotab\b|\bNeura\b', - // @todo http://www.lavamobiles.com/tablets-data-cards - 'LavaTablet' => 'QPAD E704|\bIvoryS\b|E-TAB IVORY|\bE-TAB\b', - // http://www.breezetablet.com/ - 'AocTablet' => 'MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712', - // http://www.mpmaneurope.com/en/products/internet-tablets-14/android-tablets-14/ - 'MpmanTablet' => 'MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\bMPG7\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010', - // https://www.celkonmobiles.com/?_a=categoryphones&sid=2 - 'CelkonTablet' => 'CT695|CT888|CT[\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\bCT-1\b', - // http://www.wolderelectronics.com/productos/manuales-y-guias-rapidas/categoria-2-miTab - 'WolderTablet' => 'miTab \b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\b', - // http://www.mi.com/en - 'MiTablet' => '\bMI PAD\b|\bHM NOTE 1W\b', - // http://www.nbru.cn/index.html - 'NibiruTablet' => 'Nibiru M1|Nibiru Jupiter One', - // http://navroad.com/products/produkty/tablety/ - // http://navroad.com/products/produkty/tablety/ - 'NexoTablet' => 'NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI', - // http://leader-online.com/new_site/product-category/tablets/ - // http://www.leader-online.net.au/List/Tablet - 'LeaderTablet' => 'TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100', - // http://www.datawind.com/ubislate/ - 'UbislateTablet' => 'UbiSlate[\s]?7C', - // http://www.pocketbook-int.com/ru/support - 'PocketBookTablet' => 'Pocketbook', - // http://www.kocaso.com/product_tablet.html - 'KocasoTablet' => '\b(TB-1207)\b', - // http://global.hisense.com/product/asia/tablet/Sero7/201412/t20141215_91832.htm - 'HisenseTablet' => '\b(F5281|E2371)\b', - // http://www.tesco.com/direct/hudl/ - 'Hudl' => 'Hudl HT7S3|Hudl 2', - // http://www.telstra.com.au/home-phone/thub-2/ - 'TelstraTablet' => 'T-Hub2', - 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|rk30sdk|\bEVOTAB\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\bM6pro\b|CT1020W|arc 10HD|\bTP750\b|\bQTAQZ3\b' - ); - - /** - * List of mobile Operating Systems. - * - * @var array - */ - protected static $operatingSystems = array( - 'AndroidOS' => 'Android', - 'BlackBerryOS' => 'blackberry|\bBB10\b|rim tablet os', - 'PalmOS' => 'PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino', - 'SymbianOS' => 'Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b', - // @reference: http://en.wikipedia.org/wiki/Windows_Mobile - 'WindowsMobileOS' => 'Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;', - // @reference: http://en.wikipedia.org/wiki/Windows_Phone - // http://wifeng.cn/?r=blog&a=view&id=106 - // http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx - // http://msdn.microsoft.com/library/ms537503.aspx - // https://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx - 'WindowsPhoneOS' => 'Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;', - 'iOS' => '\biPhone.*Mobile|\biPod|\biPad', - // http://en.wikipedia.org/wiki/MeeGo - // @todo: research MeeGo in UAs - 'MeeGoOS' => 'MeeGo', - // http://en.wikipedia.org/wiki/Maemo - // @todo: research Maemo in UAs - 'MaemoOS' => 'Maemo', - 'JavaOS' => 'J2ME/|\bMIDP\b|\bCLDC\b', // '|Java/' produces bug #135 - 'webOS' => 'webOS|hpwOS', - 'badaOS' => '\bBada\b', - 'BREWOS' => 'BREW', - ); - - /** - * List of mobile User Agents. - * - * IMPORTANT: This is a list of only mobile browsers. - * Mobile Detect 2.x supports only mobile browsers, - * it was never designed to detect all browsers. - * The change will come in 2017 in the 3.x release for PHP7. - * - * @var array - */ - protected static $browsers = array( - //'Vivaldi' => 'Vivaldi', - // @reference: https://developers.google.com/chrome/mobile/docs/user-agent - 'Chrome' => '\bCrMo\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?', - 'Dolfin' => '\bDolfin\b', - 'Opera' => 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+|Coast/[0-9.]+', - 'Skyfire' => 'Skyfire', - 'Edge' => 'Mobile Safari/[.0-9]* Edge', - 'IE' => 'IEMobile|MSIEMobile', // |Trident/[.0-9]+ - 'Firefox' => 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile|FxiOS', - 'Bolt' => 'bolt', - 'TeaShark' => 'teashark', - 'Blazer' => 'Blazer', - // @reference: http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/OptimizingforSafarioniPhone/OptimizingforSafarioniPhone.html#//apple_ref/doc/uid/TP40006517-SW3 - 'Safari' => 'Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari', - // http://en.wikipedia.org/wiki/Midori_(web_browser) - //'Midori' => 'midori', - //'Tizen' => 'Tizen', - 'UCBrowser' => 'UC.*Browser|UCWEB', - 'baiduboxapp' => 'baiduboxapp', - 'baidubrowser' => 'baidubrowser', - // https://github.com/serbanghita/Mobile-Detect/issues/7 - 'DiigoBrowser' => 'DiigoBrowser', - // http://www.puffinbrowser.com/index.php - 'Puffin' => 'Puffin', - // http://mercury-browser.com/index.html - 'Mercury' => '\bMercury\b', - // http://en.wikipedia.org/wiki/Obigo_Browser - 'ObigoBrowser' => 'Obigo', - // http://en.wikipedia.org/wiki/NetFront - 'NetFront' => 'NF-Browser', - // @reference: http://en.wikipedia.org/wiki/Minimo - // http://en.wikipedia.org/wiki/Vision_Mobile_Browser - 'GenericBrowser' => 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger', - // @reference: https://en.wikipedia.org/wiki/Pale_Moon_(web_browser) - 'PaleMoon' => 'Android.*PaleMoon|Mobile.*PaleMoon', - ); - - /** - * Utilities. - * - * @var array - */ - protected static $utilities = array( - // Experimental. When a mobile device wants to switch to 'Desktop Mode'. - // http://scottcate.com/technology/windows-phone-8-ie10-desktop-or-mobile/ - // https://github.com/serbanghita/Mobile-Detect/issues/57#issuecomment-15024011 - // https://developers.facebook.com/docs/sharing/best-practices - 'Bot' => 'Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|YandexMobileBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom', - 'MobileBot' => 'Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker/M1A1-R2D2', - 'DesktopMode' => 'WPDesktop', - 'TV' => 'SonyDTV|HbbTV', // experimental - 'WebKit' => '(webkit)[ /]([\w.]+)', - // @todo: Include JXD consoles. - 'Console' => '\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\b', - 'Watch' => 'SM-V700', - ); - - /** - * All possible HTTP headers that represent the - * User-Agent string. - * - * @var array - */ - protected static $uaHttpHeaders = array( - // The default User-Agent string. - 'HTTP_USER_AGENT', - // Header can occur on devices using Opera Mini. - 'HTTP_X_OPERAMINI_PHONE_UA', - // Vodafone specific header: http://www.seoprinciple.com/mobile-web-community-still-angry-at-vodafone/24/ - 'HTTP_X_DEVICE_USER_AGENT', - 'HTTP_X_ORIGINAL_USER_AGENT', - 'HTTP_X_SKYFIRE_PHONE', - 'HTTP_X_BOLT_PHONE_UA', - 'HTTP_DEVICE_STOCK_UA', - 'HTTP_X_UCBROWSER_DEVICE_UA' - ); - - /** - * The individual segments that could exist in a User-Agent string. VER refers to the regular - * expression defined in the constant self::VER. - * - * @var array - */ - protected static $properties = array( - - // Build - 'Mobile' => 'Mobile/[VER]', - 'Build' => 'Build/[VER]', - 'Version' => 'Version/[VER]', - 'VendorID' => 'VendorID/[VER]', - - // Devices - 'iPad' => 'iPad.*CPU[a-z ]+[VER]', - 'iPhone' => 'iPhone.*CPU[a-z ]+[VER]', - 'iPod' => 'iPod.*CPU[a-z ]+[VER]', - //'BlackBerry' => array('BlackBerry[VER]', 'BlackBerry [VER];'), - 'Kindle' => 'Kindle/[VER]', - - // Browser - 'Chrome' => array('Chrome/[VER]', 'CriOS/[VER]', 'CrMo/[VER]'), - 'Coast' => array('Coast/[VER]'), - 'Dolfin' => 'Dolfin/[VER]', - // @reference: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox - 'Firefox' => array('Firefox/[VER]', 'FxiOS/[VER]'), - 'Fennec' => 'Fennec/[VER]', - // http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx - // https://msdn.microsoft.com/en-us/library/ie/hh869301(v=vs.85).aspx - 'Edge' => 'Edge/[VER]', - 'IE' => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];', 'Trident/[0-9.]+;.*rv:[VER]'), - // http://en.wikipedia.org/wiki/NetFront - 'NetFront' => 'NetFront/[VER]', - 'NokiaBrowser' => 'NokiaBrowser/[VER]', - 'Opera' => array( ' OPR/[VER]', 'Opera Mini/[VER]', 'Version/[VER]' ), - 'Opera Mini' => 'Opera Mini/[VER]', - 'Opera Mobi' => 'Version/[VER]', - 'UC Browser' => 'UC Browser[VER]', - 'MQQBrowser' => 'MQQBrowser/[VER]', - 'MicroMessenger' => 'MicroMessenger/[VER]', - 'baiduboxapp' => 'baiduboxapp/[VER]', - 'baidubrowser' => 'baidubrowser/[VER]', - 'SamsungBrowser' => 'SamsungBrowser/[VER]', - 'Iron' => 'Iron/[VER]', - // @note: Safari 7534.48.3 is actually Version 5.1. - // @note: On BlackBerry the Version is overwriten by the OS. - 'Safari' => array( 'Version/[VER]', 'Safari/[VER]' ), - 'Skyfire' => 'Skyfire/[VER]', - 'Tizen' => 'Tizen/[VER]', - 'Webkit' => 'webkit[ /][VER]', - 'PaleMoon' => 'PaleMoon/[VER]', - - // Engine - 'Gecko' => 'Gecko/[VER]', - 'Trident' => 'Trident/[VER]', - 'Presto' => 'Presto/[VER]', - 'Goanna' => 'Goanna/[VER]', - - // OS - 'iOS' => ' \bi?OS\b [VER][ ;]{1}', - 'Android' => 'Android [VER]', - 'BlackBerry' => array('BlackBerry[\w]+/[VER]', 'BlackBerry.*Version/[VER]', 'Version/[VER]'), - 'BREW' => 'BREW [VER]', - 'Java' => 'Java/[VER]', - // @reference: http://windowsteamblog.com/windows_phone/b/wpdev/archive/2011/08/29/introducing-the-ie9-on-windows-phone-mango-user-agent-string.aspx - // @reference: http://en.wikipedia.org/wiki/Windows_NT#Releases - 'Windows Phone OS' => array( 'Windows Phone OS [VER]', 'Windows Phone [VER]'), - 'Windows Phone' => 'Windows Phone [VER]', - 'Windows CE' => 'Windows CE/[VER]', - // http://social.msdn.microsoft.com/Forums/en-US/windowsdeveloperpreviewgeneral/thread/6be392da-4d2f-41b4-8354-8dcee20c85cd - 'Windows NT' => 'Windows NT [VER]', - 'Symbian' => array('SymbianOS/[VER]', 'Symbian/[VER]'), - 'webOS' => array('webOS/[VER]', 'hpwOS/[VER];'), - ); - - /** - * Construct an instance of this class. - * - * @param array $headers Specify the headers as injection. Should be PHP _SERVER flavored. - * If left empty, will use the global _SERVER['HTTP_*'] vars instead. - * @param string $userAgent Inject the User-Agent header. If null, will use HTTP_USER_AGENT - * from the $headers array instead. - */ - public function __construct( - array $headers = null, - $userAgent = null - ) { - $this->setHttpHeaders($headers); - $this->setUserAgent($userAgent); - } - - /** - * Get the current script version. - * This is useful for the demo.php file, - * so people can check on what version they are testing - * for mobile devices. - * - * @return string The version number in semantic version format. - */ - public static function getScriptVersion() - { - return self::VERSION; - } - - /** - * Set the HTTP Headers. Must be PHP-flavored. This method will reset existing headers. - * - * @param array $httpHeaders The headers to set. If null, then using PHP's _SERVER to extract - * the headers. The default null is left for backwards compatibility. - */ - public function setHttpHeaders($httpHeaders = null) - { - // use global _SERVER if $httpHeaders aren't defined - if (!is_array($httpHeaders) || !count($httpHeaders)) { - $httpHeaders = $_SERVER; - } - - // clear existing headers - $this->httpHeaders = array(); - - // Only save HTTP headers. In PHP land, that means only _SERVER vars that - // start with HTTP_. - foreach ($httpHeaders as $key => $value) { - if (substr($key, 0, 5) === 'HTTP_') { - $this->httpHeaders[$key] = $value; - } - } - - // In case we're dealing with CloudFront, we need to know. - $this->setCfHeaders($httpHeaders); - } - - /** - * Retrieves the HTTP headers. - * - * @return array - */ - public function getHttpHeaders() - { - return $this->httpHeaders; - } - - /** - * Retrieves a particular header. If it doesn't exist, no exception/error is caused. - * Simply null is returned. - * - * @param string $header The name of the header to retrieve. Can be HTTP compliant such as - * "User-Agent" or "X-Device-User-Agent" or can be php-esque with the - * all-caps, HTTP_ prefixed, underscore seperated awesomeness. - * - * @return string|null The value of the header. - */ - public function getHttpHeader($header) - { - // are we using PHP-flavored headers? - if (strpos($header, '_') === false) { - $header = str_replace('-', '_', $header); - $header = strtoupper($header); - } - - // test the alternate, too - $altHeader = 'HTTP_' . $header; - - //Test both the regular and the HTTP_ prefix - if (isset($this->httpHeaders[$header])) { - return $this->httpHeaders[$header]; - } elseif (isset($this->httpHeaders[$altHeader])) { - return $this->httpHeaders[$altHeader]; - } - - return null; - } - - public function getMobileHeaders() - { - return self::$mobileHeaders; - } - - /** - * Get all possible HTTP headers that - * can contain the User-Agent string. - * - * @return array List of HTTP headers. - */ - public function getUaHttpHeaders() - { - return self::$uaHttpHeaders; - } - - - /** - * Set CloudFront headers - * http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html#header-caching-web-device - * - * @param array $cfHeaders List of HTTP headers - * - * @return boolean If there were CloudFront headers to be set - */ - public function setCfHeaders($cfHeaders = null) { - // use global _SERVER if $cfHeaders aren't defined - if (!is_array($cfHeaders) || !count($cfHeaders)) { - $cfHeaders = $_SERVER; - } - - // clear existing headers - $this->cloudfrontHeaders = array(); - - // Only save CLOUDFRONT headers. In PHP land, that means only _SERVER vars that - // start with cloudfront-. - $response = false; - foreach ($cfHeaders as $key => $value) { - if (substr(strtolower($key), 0, 16) === 'http_cloudfront_') { - $this->cloudfrontHeaders[strtoupper($key)] = $value; - $response = true; - } - } - - return $response; - } - - /** - * Retrieves the cloudfront headers. - * - * @return array - */ - public function getCfHeaders() - { - return $this->cloudfrontHeaders; - } - - /** - * Set the User-Agent to be used. - * - * @param string $userAgent The user agent string to set. - * - * @return string|null - */ - public function setUserAgent($userAgent = null) - { - // Invalidate cache due to #375 - $this->cache = array(); - - if (false === empty($userAgent)) { - return $this->userAgent = $userAgent; - } else { - $this->userAgent = null; - foreach ($this->getUaHttpHeaders() as $altHeader) { - if (false === empty($this->httpHeaders[$altHeader])) { // @todo: should use getHttpHeader(), but it would be slow. (Serban) - $this->userAgent .= $this->httpHeaders[$altHeader] . " "; - } - } - - if (!empty($this->userAgent)) { - return $this->userAgent = trim($this->userAgent); - } - } - - if (count($this->getCfHeaders()) > 0) { - return $this->userAgent = 'Amazon CloudFront'; - } - return $this->userAgent = null; - } - - /** - * Retrieve the User-Agent. - * - * @return string|null The user agent if it's set. - */ - public function getUserAgent() - { - return $this->userAgent; - } - - /** - * Set the detection type. Must be one of self::DETECTION_TYPE_MOBILE or - * self::DETECTION_TYPE_EXTENDED. Otherwise, nothing is set. - * - * @deprecated since version 2.6.9 - * - * @param string $type The type. Must be a self::DETECTION_TYPE_* constant. The default - * parameter is null which will default to self::DETECTION_TYPE_MOBILE. - */ - public function setDetectionType($type = null) - { - if ($type === null) { - $type = self::DETECTION_TYPE_MOBILE; - } - - if ($type !== self::DETECTION_TYPE_MOBILE && $type !== self::DETECTION_TYPE_EXTENDED) { - return; - } - - $this->detectionType = $type; - } - - public function getMatchingRegex() - { - return $this->matchingRegex; - } - - public function getMatchesArray() - { - return $this->matchesArray; - } - - /** - * Retrieve the list of known phone devices. - * - * @return array List of phone devices. - */ - public static function getPhoneDevices() - { - return self::$phoneDevices; - } - - /** - * Retrieve the list of known tablet devices. - * - * @return array List of tablet devices. - */ - public static function getTabletDevices() - { - return self::$tabletDevices; - } - - /** - * Alias for getBrowsers() method. - * - * @return array List of user agents. - */ - public static function getUserAgents() - { - return self::getBrowsers(); - } - - /** - * Retrieve the list of known browsers. Specifically, the user agents. - * - * @return array List of browsers / user agents. - */ - public static function getBrowsers() - { - return self::$browsers; - } - - /** - * Retrieve the list of known utilities. - * - * @return array List of utilities. - */ - public static function getUtilities() - { - return self::$utilities; - } - - /** - * Method gets the mobile detection rules. This method is used for the magic methods $detect->is*(). - * - * @deprecated since version 2.6.9 - * - * @return array All the rules (but not extended). - */ - public static function getMobileDetectionRules() - { - static $rules; - - if (!$rules) { - $rules = array_merge( - self::$phoneDevices, - self::$tabletDevices, - self::$operatingSystems, - self::$browsers - ); - } - - return $rules; - - } - - /** - * Method gets the mobile detection rules + utilities. - * The reason this is separate is because utilities rules - * don't necessary imply mobile. This method is used inside - * the new $detect->is('stuff') method. - * - * @deprecated since version 2.6.9 - * - * @return array All the rules + extended. - */ - public function getMobileDetectionRulesExtended() - { - static $rules; - - if (!$rules) { - // Merge all rules together. - $rules = array_merge( - self::$phoneDevices, - self::$tabletDevices, - self::$operatingSystems, - self::$browsers, - self::$utilities - ); - } - - return $rules; - } - - /** - * Retrieve the current set of rules. - * - * @deprecated since version 2.6.9 - * - * @return array - */ - public function getRules() - { - if ($this->detectionType == self::DETECTION_TYPE_EXTENDED) { - return self::getMobileDetectionRulesExtended(); - } else { - return self::getMobileDetectionRules(); - } - } - - /** - * Retrieve the list of mobile operating systems. - * - * @return array The list of mobile operating systems. - */ - public static function getOperatingSystems() - { - return self::$operatingSystems; - } - - /** - * Check the HTTP headers for signs of mobile. - * This is the fastest mobile check possible; it's used - * inside isMobile() method. - * - * @return bool - */ - public function checkHttpHeadersForMobile() - { - - foreach ($this->getMobileHeaders() as $mobileHeader => $matchType) { - if (isset($this->httpHeaders[$mobileHeader])) { - if (is_array($matchType['matches'])) { - foreach ($matchType['matches'] as $_match) { - if (strpos($this->httpHeaders[$mobileHeader], $_match) !== false) { - return true; - } - } - - return false; - } else { - return true; - } - } - } - - return false; - - } - - /** - * Magic overloading method. - * - * @method boolean is[...]() - * @param string $name - * @param array $arguments - * @return mixed - * @throws BadMethodCallException when the method doesn't exist and doesn't start with 'is' - */ - public function __call($name, $arguments) - { - // make sure the name starts with 'is', otherwise - if (substr($name, 0, 2) !== 'is') { - throw new BadMethodCallException("No such method exists: $name"); - } - - $this->setDetectionType(self::DETECTION_TYPE_MOBILE); - - $key = substr($name, 2); - - return $this->matchUAAgainstKey($key); - } - - /** - * Find a detection rule that matches the current User-agent. - * - * @param null $userAgent deprecated - * @return boolean - */ - protected function matchDetectionRulesAgainstUA($userAgent = null) - { - // Begin general search. - foreach ($this->getRules() as $_regex) { - if (empty($_regex)) { - continue; - } - - if ($this->match($_regex, $userAgent)) { - return true; - } - } - - return false; - } - - /** - * Search for a certain key in the rules array. - * If the key is found then try to match the corresponding - * regex against the User-Agent. - * - * @param string $key - * - * @return boolean - */ - protected function matchUAAgainstKey($key) - { - // Make the keys lowercase so we can match: isIphone(), isiPhone(), isiphone(), etc. - $key = strtolower($key); - if (false === isset($this->cache[$key])) { - - // change the keys to lower case - $_rules = array_change_key_case($this->getRules()); - - if (false === empty($_rules[$key])) { - $this->cache[$key] = $this->match($_rules[$key]); - } - - if (false === isset($this->cache[$key])) { - $this->cache[$key] = false; - } - } - - return $this->cache[$key]; - } - - /** - * Check if the device is mobile. - * Returns true if any type of mobile device detected, including special ones - * @param null $userAgent deprecated - * @param null $httpHeaders deprecated - * @return bool - */ - public function isMobile($userAgent = null, $httpHeaders = null) - { - - if ($httpHeaders) { - $this->setHttpHeaders($httpHeaders); - } - - if ($userAgent) { - $this->setUserAgent($userAgent); - } - - // Check specifically for cloudfront headers if the useragent === 'Amazon CloudFront' - if ($this->getUserAgent() === 'Amazon CloudFront') { - $cfHeaders = $this->getCfHeaders(); - if(array_key_exists('HTTP_CLOUDFRONT_IS_MOBILE_VIEWER', $cfHeaders) && $cfHeaders['HTTP_CLOUDFRONT_IS_MOBILE_VIEWER'] === 'true') { - return true; - } - } - - $this->setDetectionType(self::DETECTION_TYPE_MOBILE); - - if ($this->checkHttpHeadersForMobile()) { - return true; - } else { - return $this->matchDetectionRulesAgainstUA(); - } - - } - - /** - * Check if the device is a tablet. - * Return true if any type of tablet device is detected. - * - * @param string $userAgent deprecated - * @param array $httpHeaders deprecated - * @return bool - */ - public function isTablet($userAgent = null, $httpHeaders = null) - { - // Check specifically for cloudfront headers if the useragent === 'Amazon CloudFront' - if ($this->getUserAgent() === 'Amazon CloudFront') { - $cfHeaders = $this->getCfHeaders(); - if(array_key_exists('HTTP_CLOUDFRONT_IS_TABLET_VIEWER', $cfHeaders) && $cfHeaders['HTTP_CLOUDFRONT_IS_TABLET_VIEWER'] === 'true') { - return true; - } - } - - $this->setDetectionType(self::DETECTION_TYPE_MOBILE); - - foreach (self::$tabletDevices as $_regex) { - if ($this->match($_regex, $userAgent)) { - return true; - } - } - - return false; - } - - /** - * This method checks for a certain property in the - * userAgent. - * @todo: The httpHeaders part is not yet used. - * - * @param string $key - * @param string $userAgent deprecated - * @param string $httpHeaders deprecated - * @return bool|int|null - */ - public function is($key, $userAgent = null, $httpHeaders = null) - { - // Set the UA and HTTP headers only if needed (eg. batch mode). - if ($httpHeaders) { - $this->setHttpHeaders($httpHeaders); - } - - if ($userAgent) { - $this->setUserAgent($userAgent); - } - - $this->setDetectionType(self::DETECTION_TYPE_EXTENDED); - - return $this->matchUAAgainstKey($key); - } - - /** - * Some detection rules are relative (not standard), - * because of the diversity of devices, vendors and - * their conventions in representing the User-Agent or - * the HTTP headers. - * - * This method will be used to check custom regexes against - * the User-Agent string. - * - * @param $regex - * @param string $userAgent - * @return bool - * - * @todo: search in the HTTP headers too. - */ - public function match($regex, $userAgent = null) - { - $match = (bool) preg_match(sprintf('#%s#is', $regex), (false === empty($userAgent) ? $userAgent : $this->userAgent), $matches); - // If positive match is found, store the results for debug. - if ($match) { - $this->matchingRegex = $regex; - $this->matchesArray = $matches; - } - - return $match; - } - - /** - * Get the properties array. - * - * @return array - */ - public static function getProperties() - { - return self::$properties; - } - - /** - * Prepare the version number. - * - * @todo Remove the error supression from str_replace() call. - * - * @param string $ver The string version, like "2.6.21.2152"; - * - * @return float - */ - public function prepareVersionNo($ver) - { - $ver = str_replace(array('_', ' ', '/'), '.', $ver); - $arrVer = explode('.', $ver, 2); - - if (isset($arrVer[1])) { - $arrVer[1] = @str_replace('.', '', $arrVer[1]); // @todo: treat strings versions. - } - - return (float) implode('.', $arrVer); - } - - /** - * Check the version of the given property in the User-Agent. - * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31) - * - * @param string $propertyName The name of the property. See self::getProperties() array - * keys for all possible properties. - * @param string $type Either self::VERSION_TYPE_STRING to get a string value or - * self::VERSION_TYPE_FLOAT indicating a float value. This parameter - * is optional and defaults to self::VERSION_TYPE_STRING. Passing an - * invalid parameter will default to the this type as well. - * - * @return string|float The version of the property we are trying to extract. - */ - public function version($propertyName, $type = self::VERSION_TYPE_STRING) - { - if (empty($propertyName)) { - return false; - } - - // set the $type to the default if we don't recognize the type - if ($type !== self::VERSION_TYPE_STRING && $type !== self::VERSION_TYPE_FLOAT) { - $type = self::VERSION_TYPE_STRING; - } - - $properties = self::getProperties(); - - // Check if the property exists in the properties array. - if (true === isset($properties[$propertyName])) { - - // Prepare the pattern to be matched. - // Make sure we always deal with an array (string is converted). - $properties[$propertyName] = (array) $properties[$propertyName]; - - foreach ($properties[$propertyName] as $propertyMatchString) { - - $propertyPattern = str_replace('[VER]', self::VER, $propertyMatchString); - - // Identify and extract the version. - preg_match(sprintf('#%s#is', $propertyPattern), $this->userAgent, $match); - - if (false === empty($match[1])) { - $version = ($type == self::VERSION_TYPE_FLOAT ? $this->prepareVersionNo($match[1]) : $match[1]); - - return $version; - } - - } - - } - - return false; - } - - /** - * Retrieve the mobile grading, using self::MOBILE_GRADE_* constants. - * - * @return string One of the self::MOBILE_GRADE_* constants. - */ - public function mobileGrade() - { - $isMobile = $this->isMobile(); - - if ( - // Apple iOS 4-7.0 – Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3 / 5.1 / 6.1), iPad 3 (5.1 / 6.0), iPad Mini (6.1), iPad Retina (7.0), iPhone 3GS (4.3), iPhone 4 (4.3 / 5.1), iPhone 4S (5.1 / 6.0), iPhone 5 (6.0), and iPhone 5S (7.0) - $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT) >= 4.3 || - $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT) >= 4.3 || - $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT) >= 4.3 || - - // Android 2.1-2.3 - Tested on the HTC Incredible (2.2), original Droid (2.2), HTC Aria (2.1), Google Nexus S (2.3). Functional on 1.5 & 1.6 but performance may be sluggish, tested on Google G1 (1.5) - // Android 3.1 (Honeycomb) - Tested on the Samsung Galaxy Tab 10.1 and Motorola XOOM - // Android 4.0 (ICS) - Tested on a Galaxy Nexus. Note: transition performance can be poor on upgraded devices - // Android 4.1 (Jelly Bean) - Tested on a Galaxy Nexus and Galaxy 7 - ( $this->version('Android', self::VERSION_TYPE_FLOAT)>2.1 && $this->is('Webkit') ) || - - // Windows Phone 7.5-8 - Tested on the HTC Surround (7.5), HTC Trophy (7.5), LG-E900 (7.5), Nokia 800 (7.8), HTC Mazaa (7.8), Nokia Lumia 520 (8), Nokia Lumia 920 (8), HTC 8x (8) - $this->version('Windows Phone OS', self::VERSION_TYPE_FLOAT) >= 7.5 || - - // Tested on the Torch 9800 (6) and Style 9670 (6), BlackBerry® Torch 9810 (7), BlackBerry Z10 (10) - $this->is('BlackBerry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) >= 6.0 || - // Blackberry Playbook (1.0-2.0) - Tested on PlayBook - $this->match('Playbook.*Tablet') || - - // Palm WebOS (1.4-3.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0), HP TouchPad (3.0) - ( $this->version('webOS', self::VERSION_TYPE_FLOAT) >= 1.4 && $this->match('Palm|Pre|Pixi') ) || - // Palm WebOS 3.0 - Tested on HP TouchPad - $this->match('hp.*TouchPad') || - - // Firefox Mobile 18 - Tested on Android 2.3 and 4.1 devices - ( $this->is('Firefox') && $this->version('Firefox', self::VERSION_TYPE_FLOAT) >= 18 ) || - - // Chrome for Android - Tested on Android 4.0, 4.1 device - ( $this->is('Chrome') && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 4.0 ) || - - // Skyfire 4.1 - Tested on Android 2.3 device - ( $this->is('Skyfire') && $this->version('Skyfire', self::VERSION_TYPE_FLOAT) >= 4.1 && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 ) || - - // Opera Mobile 11.5-12: Tested on Android 2.3 - ( $this->is('Opera') && $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT) >= 11.5 && $this->is('AndroidOS') ) || - - // Meego 1.2 - Tested on Nokia 950 and N9 - $this->is('MeeGoOS') || - - // Tizen (pre-release) - Tested on early hardware - $this->is('Tizen') || - - // Samsung Bada 2.0 - Tested on a Samsung Wave 3, Dolphin browser - // @todo: more tests here! - $this->is('Dolfin') && $this->version('Bada', self::VERSION_TYPE_FLOAT) >= 2.0 || - - // UC Browser - Tested on Android 2.3 device - ( ($this->is('UC Browser') || $this->is('Dolfin')) && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 ) || - - // Kindle 3 and Fire - Tested on the built-in WebKit browser for each - ( $this->match('Kindle Fire') || - $this->is('Kindle') && $this->version('Kindle', self::VERSION_TYPE_FLOAT) >= 3.0 ) || - - // Nook Color 1.4.1 - Tested on original Nook Color, not Nook Tablet - $this->is('AndroidOS') && $this->is('NookTablet') || - - // Chrome Desktop 16-24 - Tested on OS X 10.7 and Windows 7 - $this->version('Chrome', self::VERSION_TYPE_FLOAT) >= 16 && !$isMobile || - - // Safari Desktop 5-6 - Tested on OS X 10.7 and Windows 7 - $this->version('Safari', self::VERSION_TYPE_FLOAT) >= 5.0 && !$isMobile || - - // Firefox Desktop 10-18 - Tested on OS X 10.7 and Windows 7 - $this->version('Firefox', self::VERSION_TYPE_FLOAT) >= 10.0 && !$isMobile || - - // Internet Explorer 7-9 - Tested on Windows XP, Vista and 7 - $this->version('IE', self::VERSION_TYPE_FLOAT) >= 7.0 && !$isMobile || - - // Opera Desktop 10-12 - Tested on OS X 10.7 and Windows 7 - $this->version('Opera', self::VERSION_TYPE_FLOAT) >= 10 && !$isMobile - ){ - return self::MOBILE_GRADE_A; - } - - if ( - $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT)<4.3 || - $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT)<4.3 || - $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT)<4.3 || - - // Blackberry 5.0: Tested on the Storm 2 9550, Bold 9770 - $this->is('Blackberry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) >= 5 && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<6 || - - //Opera Mini (5.0-6.5) - Tested on iOS 3.2/4.3 and Android 2.3 - ($this->version('Opera Mini', self::VERSION_TYPE_FLOAT) >= 5.0 && $this->version('Opera Mini', self::VERSION_TYPE_FLOAT) <= 7.0 && - ($this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 || $this->is('iOS')) ) || - - // Nokia Symbian^3 - Tested on Nokia N8 (Symbian^3), C7 (Symbian^3), also works on N97 (Symbian^1) - $this->match('NokiaN8|NokiaC7|N97.*Series60|Symbian/3') || - - // @todo: report this (tested on Nokia N71) - $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT) >= 11 && $this->is('SymbianOS') - ){ - return self::MOBILE_GRADE_B; - } - - if ( - // Blackberry 4.x - Tested on the Curve 8330 - $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) <= 5.0 || - // Windows Mobile - Tested on the HTC Leo (WinMo 5.2) - $this->match('MSIEMobile|Windows CE.*Mobile') || $this->version('Windows Mobile', self::VERSION_TYPE_FLOAT) <= 5.2 || - - // Tested on original iPhone (3.1), iPhone 3 (3.2) - $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT) <= 3.2 || - $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT) <= 3.2 || - $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT) <= 3.2 || - - // Internet Explorer 7 and older - Tested on Windows XP - $this->version('IE', self::VERSION_TYPE_FLOAT) <= 7.0 && !$isMobile - ){ - return self::MOBILE_GRADE_C; - } - - // All older smartphone platforms and featurephones - Any device that doesn't support media queries - // will receive the basic, C grade experience. - return self::MOBILE_GRADE_C; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/README.md b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/README.md deleted file mode 100755 index c33d7014..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/README.md +++ /dev/null @@ -1,283 +0,0 @@ -![Mobile Detect](http://demo.mobiledetect.net/logo-github.png) - -> Motto: "Every business should have a mobile detection script to detect mobile readers." - -[![Build Status](https://travis-ci.org/serbanghita/Mobile-Detect.svg?branch=devel)](https://travis-ci.org/serbanghita/Mobile-Detect) -[![Latest Stable Version](https://poser.pugx.org/mobiledetect/mobiledetectlib/v/stable.svg)](https://packagist.org/packages/mobiledetect/mobiledetectlib) -[![Total Downloads](https://poser.pugx.org/mobiledetect/mobiledetectlib/downloads.svg)](https://packagist.org/packages/mobiledetect/mobiledetectlib) -[![Daily Downloads](https://poser.pugx.org/mobiledetect/mobiledetectlib/d/daily.png)](https://packagist.org/packages/mobiledetect/mobiledetectlib) -[![License](https://poser.pugx.org/mobiledetect/mobiledetectlib/license.svg)](https://packagist.org/packages/mobiledetect/mobiledetectlib) - -*Mobile_Detect is a lightweight PHP class for detecting mobile devices (including tablets). -It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.* - -We're committed to make Mobile_Detect the best open-source mobile detection resource and this is why before -each release we're running [unit tests](./tests), we also research and update the detection rules on **daily** -and **weekly** basis. - -Your website's _content strategy_ is important! You need a complete toolkit to deliver an experience that is _optimized_, _fast_ and _relevant_ to your users. Mobile_Detect class is a [server-side detection](http://www.w3.org/TR/mwabp/#bp-devcap-detection) tool that can help you with your RWD strategy, it is not a replacement for CSS3 media queries or other forms of client-side feature detection. - -##### Announcements - -For `2.x` branch we are no longer taking optimizations pull requests, but only new regexes and User-Agents for our tests. -On `2.x` releases we are focusing on **new tablets only**. All the pull requests about TVs, bots or optimizations will be closed and analyzed after `3.0.0-beta` is released. - -Still working on `3.0.0` branch to provide you with device detection! -We're really excited on this one! -We would like to speed this up, but life and family gets in the way ;) - -Special thanks to **JetBrains** for providing licenses for **PHPStorm**. In case you never heard or tried PHPStorm, you're -clearly missing out! [Check PHPStorm](https://www.jetbrains.com/phpstorm/) out! - -##### Download and demo - -|Download|Docs|Examples| -|-------------|-------------|-------------| -|[Go to releases](../../tags)|[Become a contributor](../../wiki/Become-a-contributor)|[Code examples](../../wiki/Code-examples) -|[Mobile_Detect.php](./Mobile_Detect.php)|[History](../../wiki/History)|[:iphone: Live demo!](http://is.gd/mobiletest) -|[Composer package](https://packagist.org/packages/mobiledetect/mobiledetectlib)| - -#### Continuous updates - -You can use [composer](https://getcomposer.org/doc/00-intro.md) in your release and update process to make sure you have the latest Mobile_Detect version. - -``` -composer require mobiledetect/mobiledetectlib -``` - -```json -{ - "require": { - "mobiledetect/mobiledetectlib": "^2.8" - } -} -``` - -##### Help - -|Pledgie|Paypal| -|-------|------| -|[Donate :+1:](https://pledgie.com/campaigns/21856)|[Donate :beer:](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=mobiledetectlib%40gmail%2ecom&lc=US&item_name=Mobile%20Detect¤cy_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted)| - - -I'm currently paying for hosting and spend a lot of my family time to maintain the project and planning the future releases. -I would highly appreciate any money donations that will keep the research going. - -Special thanks to the community :+1: for donations, [BrowserStack](https://www.browserstack.com/) - for providing access to their great platform, [Zend](http://www.zend.com/) - for donating licenses, [Dragos Gavrila](https://twitter.com/grafician) who contributed with the logo. - -##### 3rd party modules / [Submit new](../../issues/new?title=New%203rd%20party%20module&body=Name, Link and Description of the module.) - -:point_right: Keep `Mobile_Detect.php` class in a separate `module` and do NOT include it in your script core because of the high frequency of updates. -:point_right: When including the class into you `web application` or `module` always use `include_once '../path/to/Mobile_Detect.php` to prevent conflicts. - -**JavaScript** - -* mobile-detect.js - A [JavaScript port](https://github.com/hgoebl/mobile-detect.js) of Mobile-Detect class. Made by [Heinrich Goebl](https://github.com/hgoebl). - -**Varnish Cache** - -* [Varnish Mobile Detect](https://github.com/willemk/varnish-mobiletranslate) - Drop-in varnish solution to mobile user -detection based on the Mobile-Detect library. Made by [willemk](https://github.com/willemk). -* [mobiledetect2vcl](https://github.com/carlosabalde/mobiledetect2vcl) - Python script to transform the Mobile -Detect JSON database into an UA-based mobile detection VCL subroutine easily integrable in any Varnish Cache -configuration. Made by [Carlos Abalde](https://github.com/carlosabalde). - -**LUA** - -* [mobile-detect.lua](https://github.com/yourpalmark/mobile-detect.lua) is a port of Mobile-Detect to Lua for -NGINX HTTP servers. Follows closely to mobile-detect.js. Supports all methods that server-side -mobile-detect.js supports. Fully unit-tested and synced with Travis CI (Build Passing badge included). -Made by [Mark Walters](https://github.com/yourpalmark). - -**PHP** - -**WordPress** - -* [WordPress Mobile Detect](https://wordpress.org/plugins/wp-mobile-detect/) - Gives you the ability to wrap that -infographic in a `[notdevice][/notdevice]` shortcode so at the server level WordPress will -decide to show that content only if the user is NOT on a phone or tablet. -Made by [Jesse Friedman](https://profiles.wordpress.org/professor44/). - -* [mobble](https://wordpress.org/plugins/mobble/) - provides mobile related conditional functions for your site. -e.g. `is_iphone()`, `is_mobile()` and `is_tablet()`. Made by Scott Evans. - -* [WordPress Responsage](https://github.com/iamspacehead/responsage) - A small WordPress theme plugin that allows -you to make your images responsive. Made by [Adrian Ciaschetti](https://github.com/iamspacehead). - -* [WP247 Body Classes](https://wordpress.org/plugins/wp247-body-classes/) - Add unique classes to the `body` tag for -easy styling based on various attributes (archive, user, post, mobile) and various WordPress "is" functions. -Mobile attributes include type of device, Operating System, Browser, etc. Examples: .is-mobile, .is-not-mobile, -.is-tablet, .is-ios, .is-not-ios, .is-androidos, .is-chromebrowser. -Made by [wescleveland56](https://github.com/wescleveland56). - -**Drupal** - -* [Drupal Mobile Switch](https://www.drupal.org/project/mobile_switch) - The Mobile Switch Drupal module provides a -automatic theme switch functionality for mobile devices, detected by Browscap or Mobile Detect. -Made by [Siegfried Neumann](https://www.drupal.org/user/45267). - -* [Drupal Context Mobile Detect](https://www.drupal.org/project/context_mobile_detect) - This is a Drupal context module -which integrates Context and PHP Mobile Detect library. -Created by [Artem Shymko](https://www.drupal.org/user/432492). - -* [Drupal Mobile Detect](https://www.drupal.org/project/mobile_detect) - Lightweight mobile detect module for Drupal - created by [Matthew Donadio](https://www.drupal.org/user/325244). - -**Joomla** - -* [yagendoo Joomla! Mobile Detection Plugin](http://www.yagendoo.com/en/blog/free-mobile-detection-plugin-for-joomla.html) - Lightweight PHP plugin for Joomla! -that detects a mobile browser using the Mobile Detect class. -Made by yagendoo media. - -* [User Agent Detector plugin](https://github.com/renekreijveld/UserAgentDetector) - This system plugin detects the user -agent of your website visitor and sets a session variable accordingly. Based on the user agent, the plugin detects if the -site is running on a desktop pc, tablet or smartphone. It can also detect if the visitor is a spider bot (search engine). -Session variable that is set: `ualayout`. Possible values: desktop, tablet, mobile, bot. -Made by @ReneKreijveld. - -**Magento** - -* [Magento helper](http://www.magentocommerce.com/magento-connect/catalog/product/view/id/16835/) from Optimise Web enables -the use of all functions provided by Mobile Detect. Made by [Kathir Vel](http://www.kathirvel.com). - -* [Magento 2 Mobile Detect Theme Change](https://github.com/EaDesgin/magento2-mobiledetect) is an extension for Magento 2 -that will change the theme or redirect to a different URL. Also containing a helper to check for the device type. - -**PrestaShop** - -* [PrestaShop](https://www.prestashop.com) is a free, secure and open source shopping cart platform. Mobile_Detect -is included in the default package since 1.5.x. - -**Laravel** - -* [Agent](https://github.com/jenssegers/agent) is a user agent class for Laravel based on Mobile Detect with some -additional functionality. -Made by [Jens Segers](https://github.com/jenssegers). - -* [BrowserDetect](https://github.com/hisorange/browser-detect) is a browser and mobile detection package, collects -and wrap together the best user-agent identifiers for Laravel. -Created by [Varga Zsolt](https://github.com/hisorange). - -**Zend Framework** - -* [ZF2 Mobile-Detect](https://github.com/neilime/zf2-mobile-detect.git) is a Zend Framework 2 module that provides -Mobile-Detect features (Mobile_Detect class as a service, helper for views and plugin controllers). -Made by [neilime](https://github.com/neilime). - -* [ZF2 MobileDetectModule](https://github.com/nikolaposa/MobileDetectModule) facilitates integration of a PHP MobileDetect -class with some ZF2-based application. Has similar idea like the existing ZF2 Mobile-Detect module, -but differs in initialization and provision routine of the actual Mobile_Detect class. -Appropriate view helper and controller plugin also have different conceptions. -Made by [Nikola Posa](https://github.com/nikolaposa). - -**Symfony** - -* [Symfony2 Mobile Detect Bundle](https://github.com/suncat2000/MobileDetectBundle) is a bundle for detecting mobile devices, -manage mobile view and redirect to the mobile and tablet version. -Made by [Nikolay Ivlev](https://github.com/suncat2000). - -* [Silex Mobile Detect Service Provider](https://github.com/jbinfo/MobileDetectServiceProvider) is a service provider to -interact with Mobile detect class methods. -Made by [Lhassan Baazzi](https://github.com/jbinfo). - -**Slim Framework** - -* [Slim_Mobile_Detect](https://github.com/zguillez/slim_mobile_detect) implements Mobile_Detect lib for different -responses write on Slim Framework App. - -**ExpressionEngine** - -* [EE2 Detect Mobile](https://github.com/garethtdavies/detect-mobile) is a lightweight PHP plugin for EE2 that detects - a mobile browser using the Mobile Detect class. Made by [Gareth Davies](https://github.com/garethtdavies). - -**Yii Framework** - -* [Yii Extension](https://github.com/iamsalnikov/MobileDetect) - Mobile detect plugin for Yii framework. -Made by [Alexey Salnikov](https://github.com/iamsalnikov). - -* [Yii Extension](https://github.com/candasm/yii1-mobile-detect-component) - Mobile detect component for Yii framework -1.x version which supports composer package manager. Made by [Candas Minareci](https://github.com/candasm). - -* [Yii2 Device Detect](https://github.com/alexandernst/yii2-device-detect/) - Yii2 extension for Mobile-Detect library. -Made by [Alexander Nestorov](https://github.com/alexandernst). - -**CakePHP** - -* [CakePHP MobileDetect](https://github.com/chronon/CakePHP-MobileDetectComponent-Plugin) is a plugin component for -CakePHP 2.x. Made by [Gregory Gaskill](https://github.com/chronon). - -**FuelPHP** - -* [Special Agent](https://github.com/rob-bar/special_agent) is a FuelPHP package which uses php-mobile-detect to -determine whether a device is mobile or not. It overrides the Fuelphp Agent class its methods. -Made by [Robbie Bardjin](https://github.com/rob-bar). - - -**TYPO3** - -* [px_mobiledetect](https://typo3.org/extensions/repository/view/px_mobiledetect) is an extension that helps to detect -visitor's mobile device class (if that’s tablet or mobile device like smartphone). Made by Alexander Tretyak. - -**Other** - -* [PageCache](https://github.com/mmamedov/page-cache) is a lightweight PHP library for full page cache, -with built-in Mobile-Detect support. Made by [Muhammed Mamedov](https://github.com/mmamedov). - -* [Statamic CMS Mobile Detect](https://github.com/haikulab/statamic-mobile-detect) is a plugin. -Made by [Sergei Filippov](https://github.com/haikulab/statamic-mobile-detect) of Haiku Lab. - -* [Kohana Mobile Detect](https://github.com/madeinnordeste/kohana-mobile-detect) is an example of implementation of -Mobile_Detect class with Kohana framework. -Written by [Luiz Alberto S. Ribeiro](https://github.com/madeinnordeste). - -* [MemHT](https://www.memht.com) is a Free PHP CMS and Blog that permit the creation and the management online -of websites with few and easy steps. Has the class included in the core. - -* [concrete5](https://www.concrete5.org) is a CMS that is free and open source. The library is included in the core. - -* [engine7](https://github.com/QOXCorp/exengine) is PHP Open Source Framework. The Mobile_Detect class is included in -the engine. - -* [Zikula](http://zikula.org) is a free and open-source Content Management Framework, which allows you to run -impressive websites and build powerful online applications. The core uses Mobile-Detect to switch to a special -Mobile theme, using jQueryMobile. - -* [UserAgentInfo](https://github.com/quentin389/UserAgentInfo) is a PHP class for parsing user agent strings -(HTTP_USER_AGENT). Includes mobile checks, bot checks, browser types/versions and more. -Based on browscap, Mobile_Detect and ua-parser. Created for high traffic websites and fast batch processing. -Made by [quentin389](https://github.com/quentin389). - -* [LJ Mobile Detect](https://github.com/lewisjenkins/craft-lj-mobiledetect) is a simple implementation of Mobile Detect -for Craft CMS. Made by [Lewis Jenkins](https://github.com/lewisjenkins). - -* [Grav Plugin Mobile Detect](https://github.com/dimitrilongo/grav-plugin-mobile-detect/) is a simple implementation -of Mobile Detect for Grav CMS. Made by [Dimitri Longo](https://github.com/dimitrilongo). - - -**Perl** - - * [MobileDetect.pm](https://www.buzzerstar.com/development/) is a Perl module for Mobile Detect. - Made by [Sebastian Enger](https://devop.tools/). - -**Python** - -* [pymobiledetect](https://pypi.python.org/pypi/pymobiledetect) - Mobile detect python package. -Made by Bas van Oostveen. - -**Ruby** - -* [mobile_detect.rb](https://github.com/ktaragorn/mobile_detect) is a Ruby gem using the JSON data exposed by the -php project and implementing a basic subset of the API (as much as can be done by the exposed data). -Made by [Karthik T](https://github.com/ktaragorn). - -**Go** - -* [GoMobileDetect](https://github.com/Shaked/gomobiledetect) is a Go port of Mobile Detect class. -Made by [https://github.com/Shaked](Shaked). - - -**LUA** - -* [ua-lua](https://github.com/robinef/ua-lua) is a small lib written in LUA providing device type detection. -ua-lua is detecting mobile or tablet devices based on user-agent inside nginx daemon. -Made by [Frédéric Robinet](https://github.com/robinef). diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/composer.json b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/composer.json deleted file mode 100755 index 0131e493..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/composer.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "mobiledetect/mobiledetectlib", - "type": "library", - "description": "Mobile_Detect is a lightweight PHP class for detecting mobile devices. It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.", - "keywords": ["mobile", "mobile detect", "mobile detector", "php mobile detect", "detect mobile devices"], - "homepage": "https://github.com/serbanghita/Mobile-Detect", - "license": "MIT", - "authors": [ - { - "name": "Serban Ghita", - "email": "serbanghita@gmail.com", - "homepage": "http://mobiledetect.net", - "role": "Developer" - } - ], - "require": { - "php": ">=5.0.0" - }, - "require-dev": { - "phpunit/phpunit": "*" - }, - "autoload": { - "classmap": ["Mobile_Detect.php"], - "psr-0": { - "Detection": "namespaced/" - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/namespaced/Detection/MobileDetect.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/namespaced/Detection/MobileDetect.php deleted file mode 100755 index ca7efec2..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Mobile_Detect/namespaced/Detection/MobileDetect.php +++ /dev/null @@ -1,22 +0,0 @@ - - - The PSR-2 coding standard. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/Client.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/Client.php deleted file mode 100755 index 6fae0925..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/Client.php +++ /dev/null @@ -1,513 +0,0 @@ - - * @author Anis Berejeb - * @version 1.2-dev - */ -namespace OAuth2; - -class Client -{ - /** - * Different AUTH method - */ - const AUTH_TYPE_URI = 0; - const AUTH_TYPE_AUTHORIZATION_BASIC = 1; - const AUTH_TYPE_FORM = 2; - - /** - * Different Access token type - */ - const ACCESS_TOKEN_URI = 0; - const ACCESS_TOKEN_BEARER = 1; - const ACCESS_TOKEN_OAUTH = 2; - const ACCESS_TOKEN_MAC = 3; - - /** - * Different Grant types - */ - const GRANT_TYPE_AUTH_CODE = 'authorization_code'; - const GRANT_TYPE_PASSWORD = 'password'; - const GRANT_TYPE_CLIENT_CREDENTIALS = 'client_credentials'; - const GRANT_TYPE_REFRESH_TOKEN = 'refresh_token'; - - /** - * HTTP Methods - */ - const HTTP_METHOD_GET = 'GET'; - const HTTP_METHOD_POST = 'POST'; - const HTTP_METHOD_PUT = 'PUT'; - const HTTP_METHOD_DELETE = 'DELETE'; - const HTTP_METHOD_HEAD = 'HEAD'; - - /** - * HTTP Form content types - */ - const HTTP_FORM_CONTENT_TYPE_APPLICATION = 0; - const HTTP_FORM_CONTENT_TYPE_MULTIPART = 1; - - /** - * Client ID - * - * @var string - */ - protected $client_id = null; - - /** - * Client Secret - * - * @var string - */ - protected $client_secret = null; - - /** - * Client Authentication method - * - * @var int - */ - protected $client_auth = self::AUTH_TYPE_URI; - - /** - * Access Token - * - * @var string - */ - protected $access_token = null; - - /** - * Access Token Type - * - * @var int - */ - protected $access_token_type = self::ACCESS_TOKEN_URI; - - /** - * Access Token Secret - * - * @var string - */ - protected $access_token_secret = null; - - /** - * Access Token crypt algorithm - * - * @var string - */ - protected $access_token_algorithm = null; - - /** - * Access Token Parameter name - * - * @var string - */ - protected $access_token_param_name = 'access_token'; - - /** - * The path to the certificate file to use for https connections - * - * @var string Defaults to . - */ - protected $certificate_file = null; - - /** - * cURL options - * - * @var array - */ - protected $curl_options = array(); - - /** - * Construct - * - * @param string $client_id Client ID - * @param string $client_secret Client Secret - * @param int $client_auth (AUTH_TYPE_URI, AUTH_TYPE_AUTHORIZATION_BASIC, AUTH_TYPE_FORM) - * @param string $certificate_file Indicates if we want to use a certificate file to trust the server. Optional, defaults to null. - * @return void - */ - public function __construct($client_id, $client_secret, $client_auth = self::AUTH_TYPE_URI, $certificate_file = null) - { - if (!extension_loaded('curl')) { - throw new Exception('The PHP extension curl must be installed to use this library.', Exception::CURL_NOT_FOUND); - } - - $this->client_id = $client_id; - $this->client_secret = $client_secret; - $this->client_auth = $client_auth; - $this->certificate_file = $certificate_file; - if (!empty($this->certificate_file) && !is_file($this->certificate_file)) { - throw new InvalidArgumentException('The certificate file was not found', InvalidArgumentException::CERTIFICATE_NOT_FOUND); - } - } - - /** - * Get the client Id - * - * @return string Client ID - */ - public function getClientId() - { - return $this->client_id; - } - - /** - * Get the client Secret - * - * @return string Client Secret - */ - public function getClientSecret() - { - return $this->client_secret; - } - - /** - * getAuthenticationUrl - * - * @param string $auth_endpoint Url of the authentication endpoint - * @param string $redirect_uri Redirection URI - * @param array $extra_parameters Array of extra parameters like scope or state (Ex: array('scope' => null, 'state' => '')) - * @return string URL used for authentication - */ - public function getAuthenticationUrl($auth_endpoint, $redirect_uri, array $extra_parameters = array()) - { - $parameters = array_merge(array( - 'response_type' => 'code', - 'client_id' => $this->client_id, - 'redirect_uri' => $redirect_uri - ), $extra_parameters); - return $auth_endpoint . '?' . http_build_query($parameters, null, '&'); - } - - /** - * getAccessToken - * - * @param string $token_endpoint Url of the token endpoint - * @param int $grant_type Grant Type ('authorization_code', 'password', 'client_credentials', 'refresh_token', or a custom code (@see GrantType Classes) - * @param array $parameters Array sent to the server (depend on which grant type you're using) - * @return array Array of parameters required by the grant_type (CF SPEC) - */ - public function getAccessToken($token_endpoint, $grant_type, array $parameters) - { - if (!$grant_type) { - throw new InvalidArgumentException('The grant_type is mandatory.', InvalidArgumentException::INVALID_GRANT_TYPE); - } - $grantTypeClassName = $this->convertToCamelCase($grant_type); - $grantTypeClass = __NAMESPACE__ . '\\GrantType\\' . $grantTypeClassName; - if (!class_exists($grantTypeClass)) { - throw new InvalidArgumentException('Unknown grant type \'' . $grant_type . '\'', InvalidArgumentException::INVALID_GRANT_TYPE); - } - $grantTypeObject = new $grantTypeClass(); - $grantTypeObject->validateParameters($parameters); - if (!defined($grantTypeClass . '::GRANT_TYPE')) { - throw new Exception('Unknown constant GRANT_TYPE for class ' . $grantTypeClassName, Exception::GRANT_TYPE_ERROR); - } - $parameters['grant_type'] = $grantTypeClass::GRANT_TYPE; - $http_headers = array(); - switch ($this->client_auth) { - case self::AUTH_TYPE_URI: - case self::AUTH_TYPE_FORM: - $parameters['client_id'] = $this->client_id; - $parameters['client_secret'] = $this->client_secret; - break; - case self::AUTH_TYPE_AUTHORIZATION_BASIC: - $parameters['client_id'] = $this->client_id; - $http_headers['Authorization'] = 'Basic ' . base64_encode($this->client_id . ':' . $this->client_secret); - break; - default: - throw new Exception('Unknown client auth type.', Exception::INVALID_CLIENT_AUTHENTICATION_TYPE); - break; - } - - return $this->executeRequest($token_endpoint, $parameters, self::HTTP_METHOD_POST, $http_headers, self::HTTP_FORM_CONTENT_TYPE_APPLICATION); - } - - /** - * setToken - * - * @param string $token Set the access token - * @return void - */ - public function setAccessToken($token) - { - $this->access_token = $token; - } - - /** - * Set the client authentication type - * - * @param string $client_auth (AUTH_TYPE_URI, AUTH_TYPE_AUTHORIZATION_BASIC, AUTH_TYPE_FORM) - * @return void - */ - public function setClientAuthType($client_auth) - { - $this->client_auth = $client_auth; - } - - /** - * Set an option for the curl transfer - * - * @param int $option The CURLOPT_XXX option to set - * @param mixed $value The value to be set on option - * @return void - */ - public function setCurlOption($option, $value) - { - $this->curl_options[$option] = $value; - } - - /** - * Set multiple options for a cURL transfer - * - * @param array $options An array specifying which options to set and their values - * @return void - */ - public function setCurlOptions($options) - { - $this->curl_options = array_merge($this->curl_options, $options); - } - - /** - * Set the access token type - * - * @param int $type Access token type (ACCESS_TOKEN_BEARER, ACCESS_TOKEN_MAC, ACCESS_TOKEN_URI) - * @param string $secret The secret key used to encrypt the MAC header - * @param string $algorithm Algorithm used to encrypt the signature - * @return void - */ - public function setAccessTokenType($type, $secret = null, $algorithm = null) - { - $this->access_token_type = $type; - $this->access_token_secret = $secret; - $this->access_token_algorithm = $algorithm; - } - - /** - * Fetch a protected ressource - * - * @param string $protected_ressource_url Protected resource URL - * @param array $parameters Array of parameters - * @param string $http_method HTTP Method to use (POST, PUT, GET, HEAD, DELETE) - * @param array $http_headers HTTP headers - * @param int $form_content_type HTTP form content type to use - * @return array - */ - public function fetch($protected_resource_url, $parameters = array(), $http_method = self::HTTP_METHOD_GET, array $http_headers = array(), $form_content_type = self::HTTP_FORM_CONTENT_TYPE_MULTIPART) - { - if ($this->access_token) { - switch ($this->access_token_type) { - case self::ACCESS_TOKEN_URI: - if (is_array($parameters)) { - $parameters[$this->access_token_param_name] = $this->access_token; - } else { - throw new InvalidArgumentException( - 'You need to give parameters as array if you want to give the token within the URI.', - InvalidArgumentException::REQUIRE_PARAMS_AS_ARRAY - ); - } - break; - case self::ACCESS_TOKEN_BEARER: - $http_headers['Authorization'] = 'Bearer ' . $this->access_token; - break; - case self::ACCESS_TOKEN_OAUTH: - $http_headers['Authorization'] = 'OAuth ' . $this->access_token; - break; - case self::ACCESS_TOKEN_MAC: - $http_headers['Authorization'] = 'MAC ' . $this->generateMACSignature($protected_resource_url, $parameters, $http_method); - break; - default: - throw new Exception('Unknown access token type.', Exception::INVALID_ACCESS_TOKEN_TYPE); - break; - } - } - return $this->executeRequest($protected_resource_url, $parameters, $http_method, $http_headers, $form_content_type); - } - - /** - * Generate the MAC signature - * - * @param string $url Called URL - * @param array $parameters Parameters - * @param string $http_method Http Method - * @return string - */ - private function generateMACSignature($url, $parameters, $http_method) - { - $timestamp = time(); - $nonce = uniqid(); - $parsed_url = parse_url($url); - if (!isset($parsed_url['port'])) - { - $parsed_url['port'] = ($parsed_url['scheme'] == 'https') ? 443 : 80; - } - if ($http_method == self::HTTP_METHOD_GET) { - if (is_array($parameters)) { - $parsed_url['path'] .= '?' . http_build_query($parameters, null, '&'); - } elseif ($parameters) { - $parsed_url['path'] .= '?' . $parameters; - } - } - - $signature = base64_encode(hash_hmac($this->access_token_algorithm, - $timestamp . "\n" - . $nonce . "\n" - . $http_method . "\n" - . $parsed_url['path'] . "\n" - . $parsed_url['host'] . "\n" - . $parsed_url['port'] . "\n\n" - , $this->access_token_secret, true)); - - return 'id="' . $this->access_token . '", ts="' . $timestamp . '", nonce="' . $nonce . '", mac="' . $signature . '"'; - } - - /** - * Execute a request (with curl) - * - * @param string $url URL - * @param mixed $parameters Array of parameters - * @param string $http_method HTTP Method - * @param array $http_headers HTTP Headers - * @param int $form_content_type HTTP form content type to use - * @return array - */ - private function executeRequest($url, $parameters = array(), $http_method = self::HTTP_METHOD_GET, array $http_headers = null, $form_content_type = self::HTTP_FORM_CONTENT_TYPE_MULTIPART) - { - $curl_options = array( - CURLOPT_RETURNTRANSFER => true, - CURLOPT_SSL_VERIFYPEER => true, - CURLOPT_CUSTOMREQUEST => $http_method - ); - - switch($http_method) { - case self::HTTP_METHOD_POST: - $curl_options[CURLOPT_POST] = true; - /* No break */ - case self::HTTP_METHOD_PUT: - - /** - * Passing an array to CURLOPT_POSTFIELDS will encode the data as multipart/form-data, - * while passing a URL-encoded string will encode the data as application/x-www-form-urlencoded. - * http://php.net/manual/en/function.curl-setopt.php - */ - if(is_array($parameters) && self::HTTP_FORM_CONTENT_TYPE_APPLICATION === $form_content_type) { - $parameters = http_build_query($parameters, null, '&'); - } - $curl_options[CURLOPT_POSTFIELDS] = $parameters; - break; - case self::HTTP_METHOD_HEAD: - $curl_options[CURLOPT_NOBODY] = true; - /* No break */ - case self::HTTP_METHOD_DELETE: - case self::HTTP_METHOD_GET: - if (is_array($parameters)) { - $url .= '?' . http_build_query($parameters, null, '&'); - } elseif ($parameters) { - $url .= '?' . $parameters; - } - break; - default: - break; - } - - $curl_options[CURLOPT_URL] = $url; - - if (is_array($http_headers)) { - $header = array(); - foreach($http_headers as $key => $parsed_urlvalue) { - $header[] = "$key: $parsed_urlvalue"; - } - $curl_options[CURLOPT_HTTPHEADER] = $header; - } - - $ch = curl_init(); - curl_setopt_array($ch, $curl_options); - // https handling - if (!empty($this->certificate_file)) { - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); - curl_setopt($ch, CURLOPT_CAINFO, $this->certificate_file); - } else { - // bypass ssl verification - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); - } - if (!empty($this->curl_options)) { - curl_setopt_array($ch, $this->curl_options); - } - $result = curl_exec($ch); - $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); - $content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); - if ($curl_error = curl_error($ch)) { - throw new Exception($curl_error, Exception::CURL_ERROR); - } else { - $json_decode = json_decode($result, true); - } - curl_close($ch); - - return array( - 'result' => (null === $json_decode) ? $result : $json_decode, - 'code' => $http_code, - 'content_type' => $content_type - ); - } - - /** - * Set the name of the parameter that carry the access token - * - * @param string $name Token parameter name - * @return void - */ - public function setAccessTokenParamName($name) - { - $this->access_token_param_name = $name; - } - - /** - * Converts the class name to camel case - * - * @param mixed $grant_type the grant type - * @return string - */ - private function convertToCamelCase($grant_type) - { - $parts = explode('_', $grant_type); - array_walk($parts, function(&$item) { $item = ucfirst($item);}); - return implode('', $parts); - } -} - -class Exception extends \Exception -{ - const CURL_NOT_FOUND = 0x01; - const CURL_ERROR = 0x02; - const GRANT_TYPE_ERROR = 0x03; - const INVALID_CLIENT_AUTHENTICATION_TYPE = 0x04; - const INVALID_ACCESS_TOKEN_TYPE = 0x05; -} - -class InvalidArgumentException extends \InvalidArgumentException -{ - const INVALID_GRANT_TYPE = 0x01; - const CERTIFICATE_NOT_FOUND = 0x02; - const REQUIRE_PARAMS_AS_ARRAY = 0x03; - const MISSING_PARAMETER = 0x04; -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/GrantType/AuthorizationCode.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/GrantType/AuthorizationCode.php deleted file mode 100755 index f3436e4c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHP-OAuth2/GrantType/AuthorizationCode.php +++ /dev/null @@ -1,41 +0,0 @@ -getAuthenticationUrl(AUTHORIZATION_ENDPOINT, REDIRECT_URI); - header('Location: ' . $auth_url); - die('Redirect'); -} -else -{ - $params = array('code' => $_GET['code'], 'redirect_uri' => REDIRECT_URI); - $response = $client->getAccessToken(TOKEN_ENDPOINT, 'authorization_code', $params); - parse_str($response['result'], $info); - $client->setAccessToken($info['access_token']); - $response = $client->fetch('https://graph.facebook.com/me'); - var_dump($response, $response['result']); -} - -How can I add a new Grant Type ? -================================ -Simply write a new class in the namespace OAuth2\GrantType. You can place the class file under GrantType. -Here is an example : - -namespace OAuth2\GrantType; - -/** - * MyCustomGrantType Grant Type - */ -class MyCustomGrantType implements IGrantType -{ - /** - * Defines the Grant Type - * - * @var string Defaults to 'my_custom_grant_type'. - */ - const GRANT_TYPE = 'my_custom_grant_type'; - - /** - * Adds a specific Handling of the parameters - * - * @return array of Specific parameters to be sent. - * @param mixed $parameters the parameters array (passed by reference) - */ - public function validateParameters(&$parameters) - { - if (!isset($parameters['first_mandatory_parameter'])) - { - throw new \Exception('The \'first_mandatory_parameter\' parameter must be defined for the Password grant type'); - } - elseif (!isset($parameters['second_mandatory_parameter'])) - { - throw new \Exception('The \'seconde_mandatory_parameter\' parameter must be defined for the Password grant type'); - } - } -} - -call the OAuth client getAccessToken with the grantType you defined in the GRANT_TYPE constant, As following : -$response = $client->getAccessToken(TOKEN_ENDPOINT, 'my_custom_grant_type', $params); - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPGangsta/GoogleAuthenticator.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPGangsta/GoogleAuthenticator.php deleted file mode 100755 index 5e70eed7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPGangsta/GoogleAuthenticator.php +++ /dev/null @@ -1,201 +0,0 @@ -_getBase32LookupTable(); - unset($validChars[32]); - - $secret = ''; - for ($i = 0; $i < $secretLength; $i++) { - $secret .= $validChars[array_rand($validChars)]; - } - return $secret; - } - - /** - * Calculate the code, with given secret and point in time - * - * @param string $secret - * @param int|null $timeSlice - * @return string - */ - public function getCode($secret, $timeSlice = null) - { - if ($timeSlice === null) { - $timeSlice = floor(time() / 30); - } - - $secretkey = $this->_base32Decode($secret); - - // Pack time into binary string - $time = chr(0).chr(0).chr(0).chr(0).pack('N*', $timeSlice); - // Hash it with users secret key - $hm = hash_hmac('SHA1', $time, $secretkey, true); - // Use last nipple of result as index/offset - $offset = ord(substr($hm, -1)) & 0x0F; - // grab 4 bytes of the result - $hashpart = substr($hm, $offset, 4); - - // Unpak binary value - $value = unpack('N', $hashpart); - $value = $value[1]; - // Only 32 bits - $value = $value & 0x7FFFFFFF; - - $modulo = pow(10, $this->_codeLength); - return str_pad($value % $modulo, $this->_codeLength, '0', STR_PAD_LEFT); - } - - /** - * Get QR-Code URL for image, from google charts - * - * @param string $name - * @param string $secret - * @return string - */ - public function getQRCodeGoogleUrl($name, $secret) { - $urlencoded = urlencode('otpauth://totp/'.$name.'?secret='.$secret.''); - return 'https://chart.googleapis.com/chart?chs=200x200&chld=M|0&cht=qr&chl='.$urlencoded.''; - } - - /** - * Check if the code is correct. This will accept codes starting from $discrepancy*30sec ago to $discrepancy*30sec from now - * - * @param string $secret - * @param string $code - * @param int $discrepancy This is the allowed time drift in 30 second units (8 means 4 minutes before or after) - * @return bool - */ - public function verifyCode($secret, $code, $discrepancy = 1) - { - $currentTimeSlice = floor(time() / 30); - - for ($i = -$discrepancy; $i <= $discrepancy; $i++) { - $calculatedCode = $this->getCode($secret, $currentTimeSlice + $i); - if ($calculatedCode == $code ) { - return true; - } - } - - return false; - } - - /** - * Set the code length, should be >=6 - * - * @param int $length - * @return PHPGangsta_GoogleAuthenticator - */ - public function setCodeLength($length) - { - $this->_codeLength = $length; - return $this; - } - - /** - * Helper class to decode base32 - * - * @param $secret - * @return bool|string - */ - protected function _base32Decode($secret) - { - if (empty($secret)) return ''; - - $base32chars = $this->_getBase32LookupTable(); - $base32charsFlipped = array_flip($base32chars); - - $paddingCharCount = substr_count($secret, $base32chars[32]); - $allowedValues = array(6, 4, 3, 1, 0); - if (!in_array($paddingCharCount, $allowedValues)) return false; - for ($i = 0; $i < 4; $i++){ - if ($paddingCharCount == $allowedValues[$i] && - substr($secret, -($allowedValues[$i])) != str_repeat($base32chars[32], $allowedValues[$i])) return false; - } - $secret = str_replace('=','', $secret); - $secret = str_split($secret); - $binaryString = ""; - for ($i = 0; $i < count($secret); $i = $i+8) { - $x = ""; - if (!in_array($secret[$i], $base32chars)) return false; - for ($j = 0; $j < 8; $j++) { - $x .= str_pad(base_convert(@$base32charsFlipped[@$secret[$i + $j]], 10, 2), 5, '0', STR_PAD_LEFT); - } - $eightBits = str_split($x, 8); - for ($z = 0; $z < count($eightBits); $z++) { - $binaryString .= ( ($y = chr(base_convert($eightBits[$z], 2, 10))) || ord($y) == 48 ) ? $y:""; - } - } - return $binaryString; - } - - /** - * Helper class to encode base32 - * - * @param string $secret - * @param bool $padding - * @return string - */ - protected function _base32Encode($secret, $padding = true) - { - if (empty($secret)) return ''; - - $base32chars = $this->_getBase32LookupTable(); - - $secret = str_split($secret); - $binaryString = ""; - for ($i = 0; $i < count($secret); $i++) { - $binaryString .= str_pad(base_convert(ord($secret[$i]), 10, 2), 8, '0', STR_PAD_LEFT); - } - $fiveBitBinaryArray = str_split($binaryString, 5); - $base32 = ""; - $i = 0; - while ($i < count($fiveBitBinaryArray)) { - $base32 .= $base32chars[base_convert(str_pad($fiveBitBinaryArray[$i], 5, '0'), 2, 10)]; - $i++; - } - if ($padding && ($x = strlen($binaryString) % 40) != 0) { - if ($x == 8) $base32 .= str_repeat($base32chars[32], 6); - elseif ($x == 16) $base32 .= str_repeat($base32chars[32], 4); - elseif ($x == 24) $base32 .= str_repeat($base32chars[32], 3); - elseif ($x == 32) $base32 .= $base32chars[32]; - } - return $base32; - } - - /** - * Get array with all 32 characters for decoding from/encoding to base32 - * - * @return array - */ - protected function _getBase32LookupTable() - { - return array( - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 7 - 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 15 - 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 23 - 'Y', 'Z', '2', '3', '4', '5', '6', '7', // 31 - '=' // padding char - ); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/GD.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/GD.php deleted file mode 100755 index 53469eda..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/GD.php +++ /dev/null @@ -1,1417 +0,0 @@ - - * Copyright (c) 2009, Ian Selby/Gen X Design - * - * Author(s): Ian Selby - * - * Licensed under the MIT License - * Redistributions of files must retain the above copyright notice. - * - * @author Ian Selby - * @copyright Copyright (c) 2009 Gen X Design - * @link http://phpthumb.gxdlabs.com - * @license http://www.opensource.org/licenses/mit-license.php The MIT License - */ - -class GD extends PHPThumb -{ - /** - * The prior image (before manipulation) - * - * @var resource - */ - protected $oldImage; - - /** - * The working image (used during manipulation) - * - * @var resource - */ - protected $workingImage; - - /** - * The current dimensions of the image - * - * @var array - */ - protected $currentDimensions; - - /** - * The new, calculated dimensions of the image - * - * @var array - */ - protected $newDimensions; - - /** - * The options for this class - * - * This array contains various options that determine the behavior in - * various functions throughout the class. Functions note which specific - * option key / values are used in their documentation - * - * @var array - */ - protected $options; - - /** - * The maximum width an image can be after resizing (in pixels) - * - * @var int - */ - protected $maxWidth; - - /** - * The maximum height an image can be after resizing (in pixels) - * - * @var int - */ - protected $maxHeight; - - /** - * The percentage to resize the image by - * - * @var int - */ - protected $percent; - - /** - * @param string $fileName - * @param array $options - * @param array $plugins - */ - public function __construct($fileName, $options = array(), array $plugins = array()) - { - parent::__construct($fileName, $options, $plugins); - - $this->determineFormat(); - $this->verifyFormatCompatiblity(); - - switch ($this->format) { - case 'GIF': - $this->oldImage = @imagecreatefromgif($this->fileName); - break; - case 'JPG': - $this->oldImage = @imagecreatefromjpeg($this->fileName); - break; - case 'PNG': - $this->oldImage = @imagecreatefrompng($this->fileName); - break; - case 'STRING': - $this->oldImage = @imagecreatefromstring($this->fileName); - break; - } - - if (!is_resource($this->oldImage)) - { - throw new \Exception('Invalid image file'); - } - else - { - $this->currentDimensions = array ( - 'width' => imagesx($this->oldImage), - 'height' => imagesy($this->oldImage) - ); - } - } - - public function __destruct() - { - if (is_resource($this->oldImage)) { - imagedestroy($this->oldImage); - } - - if (is_resource($this->workingImage)) { - imagedestroy($this->workingImage); - } - } - - /** - * Pad an image to desired dimensions. Moves the image into the center and fills the rest with $color. - * @param $width - * @param $height - * @param array $color - * @return GD - */ - public function pad($width, $height, $color = array(255, 255, 255)) - { - // no resize - woohoo! - if ($width == $this->currentDimensions['width'] && $height == $this->currentDimensions['height']) { - return $this; - } - - // create the working image - if (function_exists('imagecreatetruecolor')) { - $this->workingImage = imagecreatetruecolor($width, $height); - } else { - $this->workingImage = imagecreate($width, $height); - } - - // create the fill color - $fillColor = imagecolorallocate( - $this->workingImage, - $color[0], - $color[1], - $color[2] - ); - - // fill our working image with the fill color - imagefill( - $this->workingImage, - 0, - 0, - $fillColor - ); - - // copy the image into the center of our working image - imagecopyresampled( - $this->workingImage, - $this->oldImage, - intval(($width-$this->currentDimensions['width']) / 2), - intval(($height-$this->currentDimensions['height']) / 2), - 0, - 0, - $this->currentDimensions['width'], - $this->currentDimensions['height'], - $this->currentDimensions['width'], - $this->currentDimensions['height'] - ); - - // update all the variables and resources to be correct - $this->oldImage = $this->workingImage; - $this->currentDimensions['width'] = $width; - $this->currentDimensions['height'] = $height; - - return $this; - } - - /** - * Resizes an image to be no larger than $maxWidth or $maxHeight - * - * If either param is set to zero, then that dimension will not be considered as a part of the resize. - * Additionally, if $this->options['resizeUp'] is set to true (false by default), then this function will - * also scale the image up to the maximum dimensions provided. - * - * @param int $maxWidth The maximum width of the image in pixels - * @param int $maxHeight The maximum height of the image in pixels - * @return \PHPThumb\GD - */ - public function resize($maxWidth = 0, $maxHeight = 0) - { - // make sure our arguments are valid - if (!is_numeric($maxWidth)) { - throw new \InvalidArgumentException('$maxWidth must be numeric'); - } - - if (!is_numeric($maxHeight)) { - throw new \InvalidArgumentException('$maxHeight must be numeric'); - } - - // make sure we're not exceeding our image size if we're not supposed to - if ($this->options['resizeUp'] === false) { - $this->maxHeight = (intval($maxHeight) > $this->currentDimensions['height']) ? $this->currentDimensions['height'] : $maxHeight; - $this->maxWidth = (intval($maxWidth) > $this->currentDimensions['width']) ? $this->currentDimensions['width'] : $maxWidth; - } else { - $this->maxHeight = intval($maxHeight); - $this->maxWidth = intval($maxWidth); - } - - // get the new dimensions... - $this->calcImageSize($this->currentDimensions['width'], $this->currentDimensions['height']); - - // create the working image - if (function_exists('imagecreatetruecolor')) { - $this->workingImage = imagecreatetruecolor($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); - } else { - $this->workingImage = imagecreate($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); - } - - $this->preserveAlpha(); - - // and create the newly sized image - imagecopyresampled( - $this->workingImage, - $this->oldImage, - 0, - 0, - 0, - 0, - $this->newDimensions['newWidth'], - $this->newDimensions['newHeight'], - $this->currentDimensions['width'], - $this->currentDimensions['height'] - ); - - // update all the variables and resources to be correct - $this->oldImage = $this->workingImage; - $this->currentDimensions['width'] = $this->newDimensions['newWidth']; - $this->currentDimensions['height'] = $this->newDimensions['newHeight']; - - return $this; - } - - /** - * Adaptively Resizes the Image - * - * This function attempts to get the image to as close to the provided dimensions as possible, and then crops the - * remaining overflow (from the center) to get the image to be the size specified - * - * @param int $maxWidth - * @param int $maxHeight - * @return \PHPThumb\GD - */ - public function adaptiveResize($width, $height) - { - // make sure our arguments are valid - if ((!is_numeric($width) || $width == 0) && (!is_numeric($height) || $height == 0)) { - throw new \InvalidArgumentException('$width and $height must be numeric and greater than zero'); - } - - if (!is_numeric($width) || $width == 0) { - $width = ($height * $this->currentDimensions['width']) / $this->currentDimensions['height']; - } - - if (!is_numeric($height) || $height == 0) { - $height = ($width * $this->currentDimensions['height']) / $this->currentDimensions['width']; - } - - // make sure we're not exceeding our image size if we're not supposed to - if ($this->options['resizeUp'] === false) { - $this->maxHeight = (intval($height) > $this->currentDimensions['height']) ? $this->currentDimensions['height'] : $height; - $this->maxWidth = (intval($width) > $this->currentDimensions['width']) ? $this->currentDimensions['width'] : $width; - } else { - $this->maxHeight = intval($height); - $this->maxWidth = intval($width); - } - - $this->calcImageSizeStrict($this->currentDimensions['width'], $this->currentDimensions['height']); - - // resize the image to be close to our desired dimensions - $this->resize($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); - - // reset the max dimensions... - if ($this->options['resizeUp'] === false) { - $this->maxHeight = (intval($height) > $this->currentDimensions['height']) ? $this->currentDimensions['height'] : $height; - $this->maxWidth = (intval($width) > $this->currentDimensions['width']) ? $this->currentDimensions['width'] : $width; - } else { - $this->maxHeight = intval($height); - $this->maxWidth = intval($width); - } - - // create the working image - if (function_exists('imagecreatetruecolor')) { - $this->workingImage = imagecreatetruecolor($this->maxWidth, $this->maxHeight); - } else { - $this->workingImage = imagecreate($this->maxWidth, $this->maxHeight); - } - - $this->preserveAlpha(); - - $cropWidth = $this->maxWidth; - $cropHeight = $this->maxHeight; - $cropX = 0; - $cropY = 0; - - // now, figure out how to crop the rest of the image... - if ($this->currentDimensions['width'] > $this->maxWidth) { - $cropX = intval(($this->currentDimensions['width'] - $this->maxWidth) / 2); - } elseif ($this->currentDimensions['height'] > $this->maxHeight) { - $cropY = intval(($this->currentDimensions['height'] - $this->maxHeight) / 2); - } - - imagecopyresampled( - $this->workingImage, - $this->oldImage, - 0, - 0, - $cropX, - $cropY, - $cropWidth, - $cropHeight, - $cropWidth, - $cropHeight - ); - - // update all the variables and resources to be correct - $this->oldImage = $this->workingImage; - $this->currentDimensions['width'] = $this->maxWidth; - $this->currentDimensions['height'] = $this->maxHeight; - - return $this; - } - - /** - * Adaptively Resizes the Image and Crops Using a Percentage - * - * This function attempts to get the image to as close to the provided dimensions as possible, and then crops the - * remaining overflow using a provided percentage to get the image to be the size specified. - * - * The percentage mean different things depending on the orientation of the original image. - * - * For Landscape images: - * --------------------- - * - * A percentage of 1 would crop the image all the way to the left, which would be the same as - * using adaptiveResizeQuadrant() with $quadrant = 'L' - * - * A percentage of 50 would crop the image to the center which would be the same as using - * adaptiveResizeQuadrant() with $quadrant = 'C', or even the original adaptiveResize() - * - * A percentage of 100 would crop the image to the image all the way to the right, etc, etc. - * Note that you can use any percentage between 1 and 100. - * - * For Portrait images: - * -------------------- - * - * This works the same as for Landscape images except that a percentage of 1 means top and 100 means bottom - * - * @param int $maxWidth - * @param int $maxHeight - * @param int $percent - * @return \PHPThumb\GD - */ - public function adaptiveResizePercent($width, $height, $percent = 50) - { - // make sure our arguments are valid - if (!is_numeric($width) || $width == 0) { - throw new \InvalidArgumentException('$width must be numeric and greater than zero'); - } - - if (!is_numeric($height) || $height == 0) { - throw new \InvalidArgumentException('$height must be numeric and greater than zero'); - } - - // make sure we're not exceeding our image size if we're not supposed to - if ($this->options['resizeUp'] === false) { - $this->maxHeight = (intval($height) > $this->currentDimensions['height']) ? $this->currentDimensions['height'] : $height; - $this->maxWidth = (intval($width) > $this->currentDimensions['width']) ? $this->currentDimensions['width'] : $width; - } else { - $this->maxHeight = intval($height); - $this->maxWidth = intval($width); - } - - $this->calcImageSizeStrict($this->currentDimensions['width'], $this->currentDimensions['height']); - - // resize the image to be close to our desired dimensions - $this->resize($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); - - // reset the max dimensions... - if ($this->options['resizeUp'] === false) { - $this->maxHeight = (intval($height) > $this->currentDimensions['height']) ? $this->currentDimensions['height'] : $height; - $this->maxWidth = (intval($width) > $this->currentDimensions['width']) ? $this->currentDimensions['width'] : $width; - } else { - $this->maxHeight = intval($height); - $this->maxWidth = intval($width); - } - - // create the working image - if (function_exists('imagecreatetruecolor')) { - $this->workingImage = imagecreatetruecolor($this->maxWidth, $this->maxHeight); - } else { - $this->workingImage = imagecreate($this->maxWidth, $this->maxHeight); - } - - $this->preserveAlpha(); - - $cropWidth = $this->maxWidth; - $cropHeight = $this->maxHeight; - $cropX = 0; - $cropY = 0; - - // Crop the rest of the image using the quadrant - - if ($percent > 100) { - $percent = 100; - } elseif ($percent < 1) { - $percent = 1; - } - - if ($this->currentDimensions['width'] > $this->maxWidth) { - // Image is landscape - $maxCropX = $this->currentDimensions['width'] - $this->maxWidth; - $cropX = intval(($percent / 100) * $maxCropX); - - } elseif ($this->currentDimensions['height'] > $this->maxHeight) { - // Image is portrait - $maxCropY = $this->currentDimensions['height'] - $this->maxHeight; - $cropY = intval(($percent / 100) * $maxCropY); - } - - imagecopyresampled( - $this->workingImage, - $this->oldImage, - 0, - 0, - $cropX, - $cropY, - $cropWidth, - $cropHeight, - $cropWidth, - $cropHeight - ); - - // update all the variables and resources to be correct - $this->oldImage = $this->workingImage; - $this->currentDimensions['width'] = $this->maxWidth; - $this->currentDimensions['height'] = $this->maxHeight; - - return $this; - } - - /** - * Adaptively Resizes the Image and Crops Using a Quadrant - * - * This function attempts to get the image to as close to the provided dimensions as possible, and then crops the - * remaining overflow using the quadrant to get the image to be the size specified. - * - * The quadrants available are Top, Bottom, Center, Left, and Right: - * - * - * +---+---+---+ - * | | T | | - * +---+---+---+ - * | L | C | R | - * +---+---+---+ - * | | B | | - * +---+---+---+ - * - * Note that if your image is Landscape and you choose either of the Top or Bottom quadrants (which won't - * make sence since only the Left and Right would be available, then the Center quadrant will be used - * to crop. This would have exactly the same result as using adaptiveResize(). - * The same goes if your image is portrait and you choose either the Left or Right quadrants. - * - * @param int $maxWidth - * @param int $maxHeight - * @param string $quadrant T, B, C, L, R - * @return \PHPThumb\GD - */ - public function adaptiveResizeQuadrant($width, $height, $quadrant = 'C') - { - // make sure our arguments are valid - if (!is_numeric($width) || $width == 0) { - throw new \InvalidArgumentException('$width must be numeric and greater than zero'); - } - - if (!is_numeric($height) || $height == 0) { - throw new \InvalidArgumentException('$height must be numeric and greater than zero'); - } - - // make sure we're not exceeding our image size if we're not supposed to - if ($this->options['resizeUp'] === false) { - $this->maxHeight = (intval($height) > $this->currentDimensions['height']) ? $this->currentDimensions['height'] : $height; - $this->maxWidth = (intval($width) > $this->currentDimensions['width']) ? $this->currentDimensions['width'] : $width; - } else { - $this->maxHeight = intval($height); - $this->maxWidth = intval($width); - } - - $this->calcImageSizeStrict($this->currentDimensions['width'], $this->currentDimensions['height']); - - // resize the image to be close to our desired dimensions - $this->resize($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); - - // reset the max dimensions... - if ($this->options['resizeUp'] === false) { - $this->maxHeight = (intval($height) > $this->currentDimensions['height']) ? $this->currentDimensions['height'] : $height; - $this->maxWidth = (intval($width) > $this->currentDimensions['width']) ? $this->currentDimensions['width'] : $width; - } else { - $this->maxHeight = intval($height); - $this->maxWidth = intval($width); - } - - // create the working image - if (function_exists('imagecreatetruecolor')) { - $this->workingImage = imagecreatetruecolor($this->maxWidth, $this->maxHeight); - } else { - $this->workingImage = imagecreate($this->maxWidth, $this->maxHeight); - } - - $this->preserveAlpha(); - - $cropWidth = $this->maxWidth; - $cropHeight = $this->maxHeight; - $cropX = 0; - $cropY = 0; - - // Crop the rest of the image using the quadrant - - if ($this->currentDimensions['width'] > $this->maxWidth) { - // Image is landscape - switch ($quadrant) { - case 'L': - $cropX = 0; - break; - case 'R': - $cropX = intval(($this->currentDimensions['width'] - $this->maxWidth)); - break; - case 'C': - default: - $cropX = intval(($this->currentDimensions['width'] - $this->maxWidth) / 2); - break; - } - } elseif ($this->currentDimensions['height'] > $this->maxHeight) { - // Image is portrait - switch ($quadrant) { - case 'T': - $cropY = 0; - break; - case 'B': - $cropY = intval(($this->currentDimensions['height'] - $this->maxHeight)); - break; - case 'C': - default: - $cropY = intval(($this->currentDimensions['height'] - $this->maxHeight) / 2); - break; - } - } - - imagecopyresampled( - $this->workingImage, - $this->oldImage, - 0, - 0, - $cropX, - $cropY, - $cropWidth, - $cropHeight, - $cropWidth, - $cropHeight - ); - - // update all the variables and resources to be correct - $this->oldImage = $this->workingImage; - $this->currentDimensions['width'] = $this->maxWidth; - $this->currentDimensions['height'] = $this->maxHeight; - - return $this; - } - - /** - * Resizes an image by a given percent uniformly, - * Percentage should be whole number representation (i.e. 1-100) - * - * @param int $percent - * @return GD - * @throws \InvalidArgumentException - */ - public function resizePercent($percent = 0) - { - if (!is_numeric($percent)) { - throw new \InvalidArgumentException ('$percent must be numeric'); - } - - $this->percent = intval($percent); - - $this->calcImageSizePercent($this->currentDimensions['width'], $this->currentDimensions['height']); - - if (function_exists('imagecreatetruecolor')) { - $this->workingImage = imagecreatetruecolor($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); - } else { - $this->workingImage = imagecreate($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); - } - - $this->preserveAlpha(); - - imagecopyresampled( - $this->workingImage, - $this->oldImage, - 0, - 0, - 0, - 0, - $this->newDimensions['newWidth'], - $this->newDimensions['newHeight'], - $this->currentDimensions['width'], - $this->currentDimensions['height'] - ); - - $this->oldImage = $this->workingImage; - $this->currentDimensions['width'] = $this->newDimensions['newWidth']; - $this->currentDimensions['height'] = $this->newDimensions['newHeight']; - - return $this; - } - - /** - * Crops an image from the center with provided dimensions - * - * If no height is given, the width will be used as a height, thus creating a square crop - * - * @param int $cropWidth - * @param int $cropHeight - * @return \PHPThumb\GD - */ - public function cropFromCenter($cropWidth, $cropHeight = null) - { - if (!is_numeric($cropWidth)) { - throw new \InvalidArgumentException('$cropWidth must be numeric'); - } - - if ($cropHeight !== null && !is_numeric($cropHeight)) { - throw new \InvalidArgumentException('$cropHeight must be numeric'); - } - - if ($cropHeight === null) { - $cropHeight = $cropWidth; - } - - $cropWidth = ($this->currentDimensions['width'] < $cropWidth) ? $this->currentDimensions['width'] : $cropWidth; - $cropHeight = ($this->currentDimensions['height'] < $cropHeight) ? $this->currentDimensions['height'] : $cropHeight; - - $cropX = intval(($this->currentDimensions['width'] - $cropWidth) / 2); - $cropY = intval(($this->currentDimensions['height'] - $cropHeight) / 2); - - $this->crop($cropX, $cropY, $cropWidth, $cropHeight); - - return $this; - } - - /** - * Vanilla Cropping - Crops from x,y with specified width and height - * - * @param int $startX - * @param int $startY - * @param int $cropWidth - * @param int $cropHeight - * @return \PHPThumb\GD - */ - public function crop($startX, $startY, $cropWidth, $cropHeight) - { - // validate input - if (!is_numeric($startX)) { - throw new \InvalidArgumentException('$startX must be numeric'); - } - - if (!is_numeric($startY)) { - throw new \InvalidArgumentException('$startY must be numeric'); - } - - if (!is_numeric($cropWidth)) { - throw new \InvalidArgumentException('$cropWidth must be numeric'); - } - - if (!is_numeric($cropHeight)) { - throw new \InvalidArgumentException('$cropHeight must be numeric'); - } - - // do some calculations - $cropWidth = ($this->currentDimensions['width'] < $cropWidth) ? $this->currentDimensions['width'] : $cropWidth; - $cropHeight = ($this->currentDimensions['height'] < $cropHeight) ? $this->currentDimensions['height'] : $cropHeight; - - // ensure everything's in bounds - if (($startX + $cropWidth) > $this->currentDimensions['width']) { - $startX = ($this->currentDimensions['width'] - $cropWidth); - } - - if (($startY + $cropHeight) > $this->currentDimensions['height']) { - $startY = ($this->currentDimensions['height'] - $cropHeight); - } - - if ($startX < 0) { - $startX = 0; - } - - if ($startY < 0) { - $startY = 0; - } - - // create the working image - if (function_exists('imagecreatetruecolor')) { - $this->workingImage = imagecreatetruecolor($cropWidth, $cropHeight); - } else { - $this->workingImage = imagecreate($cropWidth, $cropHeight); - } - - $this->preserveAlpha(); - - imagecopyresampled( - $this->workingImage, - $this->oldImage, - 0, - 0, - $startX, - $startY, - $cropWidth, - $cropHeight, - $cropWidth, - $cropHeight - ); - - $this->oldImage = $this->workingImage; - $this->currentDimensions['width'] = $cropWidth; - $this->currentDimensions['height'] = $cropHeight; - - return $this; - } - - /** - * Rotates image either 90 degrees clockwise or counter-clockwise - * - * @param string $direction - * @retunrn \PHPThumb\GD - */ - public function rotateImage($direction = 'CW') - { - if ($direction == 'CW') { - $this->rotateImageNDegrees(90); - } else { - $this->rotateImageNDegrees(-90); - } - - return $this; - } - - /** - * Rotates image specified number of degrees - * - * @param int $degrees - * @return \PHPThumb\GD - */ - public function rotateImageNDegrees($degrees) - { - if (!is_numeric($degrees)) { - throw new \InvalidArgumentException('$degrees must be numeric'); - } - - if (!function_exists('imagerotate')) { - throw new \RuntimeException('Your version of GD does not support image rotation'); - } - - $this->workingImage = imagerotate($this->oldImage, $degrees, 0); - - $newWidth = $this->currentDimensions['height']; - $newHeight = $this->currentDimensions['width']; - $this->oldImage = $this->workingImage; - $this->currentDimensions['width'] = $newWidth; - $this->currentDimensions['height'] = $newHeight; - - return $this; - } - - /** - * Applies a filter to the image - * - * @param int $filter - * @return \PHPThumb\GD - */ - public function imageFilter($filter, $arg1 = false, $arg2 = false, $arg3 = false, $arg4 = false) - { - if (!is_numeric($filter)) { - throw new \InvalidArgumentException('$filter must be numeric'); - } - - if (!function_exists('imagefilter')) { - throw new \RuntimeException('Your version of GD does not support image filters'); - } - - $result = false; - if ($arg1 === false) { - $result = imagefilter($this->oldImage, $filter); - } elseif ($arg2 === false) { - $result = imagefilter($this->oldImage, $filter, $arg1); - } elseif ($arg3 === false) { - $result = imagefilter($this->oldImage, $filter, $arg1, $arg2); - } elseif ($arg4 === false) { - $result = imagefilter($this->oldImage, $filter, $arg1, $arg2, $arg3); - } else { - $result = imagefilter($this->oldImage, $filter, $arg1, $arg2, $arg3, $arg4); - } - - if (!$result) { - throw new \RuntimeException('GD imagefilter failed'); - } - - $this->workingImage = $this->oldImage; - - return $this; - } - - /** - * Shows an image - * - * This function will show the current image by first sending the appropriate header - * for the format, and then outputting the image data. If headers have already been sent, - * a runtime exception will be thrown - * - * @param bool $rawData Whether or not the raw image stream should be output - * @return \PHPThumb\GD - */ - public function show($rawData = false) - { - //Execute any plugins - if ($this->plugins) { - foreach ($this->plugins as $plugin) { - /* @var $plugin \PHPThumb\PluginInterface */ - $plugin->execute($this); - } - } - - if (headers_sent() && php_sapi_name() != 'cli') { - throw new \RuntimeException('Cannot show image, headers have already been sent'); - } - - // When the interlace option equals true or false call imageinterlace else leave it to default - if ($this->options['interlace'] === true) { - imageinterlace($this->oldImage, 1); - } elseif ($this->options['interlace'] === false) { - imageinterlace($this->oldImage, 0); - } - - switch ($this->format) { - case 'GIF': - if ($rawData === false) { - header('Content-type: image/gif'); - } - imagegif($this->oldImage); - break; - case 'JPG': - if ($rawData === false) { - header('Content-type: image/jpeg'); - } - imagejpeg($this->oldImage, null, $this->options['jpegQuality']); - break; - case 'PNG': - case 'STRING': - if ($rawData === false) { - header('Content-type: image/png'); - } - imagepng($this->oldImage); - break; - } - - return $this; - } - - /** - * Returns the Working Image as a String - * - * This function is useful for getting the raw image data as a string for storage in - * a database, or other similar things. - * - * @return string - */ - public function getImageAsString() - { - $data = null; - ob_start(); - $this->show(true); - $data = ob_get_contents(); - ob_end_clean(); - - return $data; - } - - /** - * Saves an image - * - * This function will make sure the target directory is writeable, and then save the image. - * - * If the target directory is not writeable, the function will try to correct the permissions (if allowed, this - * is set as an option ($this->options['correctPermissions']). If the target cannot be made writeable, then a - * \RuntimeException is thrown. - * - * @param string $fileName The full path and filename of the image to save - * @param string $format The format to save the image in (optional, must be one of [GIF,JPG,PNG] - * @return \PHPThumb\GD - */ - public function save($fileName, $format = null) - { - $validFormats = array('GIF', 'JPG', 'PNG'); - $format = ($format !== null) ? strtoupper($format) : $this->format; - - if (!in_array($format, $validFormats)) { - throw new \InvalidArgumentException("Invalid format type specified in save function: {$format}"); - } - - // make sure the directory is writeable - if (!is_writeable(dirname($fileName))) { - // try to correct the permissions - if ($this->options['correctPermissions'] === true) { - @chmod(dirname($fileName), 0777); - - // throw an exception if not writeable - if (!is_writeable(dirname($fileName))) { - throw new \RuntimeException("File is not writeable, and could not correct permissions: {$fileName}"); - } - } else { // throw an exception if not writeable - throw new \RuntimeException("File not writeable: {$fileName}"); - } - } - - // When the interlace option equals true or false call imageinterlace else leave it to default - if ($this->options['interlace'] === true) { - imageinterlace($this->oldImage, 1); - } elseif ($this->options['interlace'] === false) { - imageinterlace($this->oldImage, 0); - } - - switch ($format) { - case 'GIF': - imagegif($this->oldImage, $fileName); - break; - case 'JPG': - imagejpeg($this->oldImage, $fileName, $this->options['jpegQuality']); - break; - case 'PNG': - imagepng($this->oldImage, $fileName); - break; - } - - return $this; - } - - ################################# - # ----- GETTERS / SETTERS ----- # - ################################# - - /** - * Sets options for all operations. - * @param array $options - * @return GD - */ - public function setOptions(array $options = array()) - { - // we've yet to init the default options, so create them here - if (sizeof($this->options) == 0) { - $defaultOptions = array( - 'resizeUp' => false, - 'jpegQuality' => 100, - 'correctPermissions' => false, - 'preserveAlpha' => true, - 'alphaMaskColor' => array (255, 255, 255), - 'preserveTransparency' => true, - 'transparencyMaskColor' => array (0, 0, 0), - 'interlace' => null - ); - } else { // otherwise, let's use what we've got already - $defaultOptions = $this->options; - } - - $this->options = array_merge($defaultOptions, $options); - - return $this; - } - - /** - * Returns $currentDimensions. - * - * @see \PHPThumb\GD::$currentDimensions - */ - public function getCurrentDimensions() - { - return $this->currentDimensions; - } - - /** - * @param $currentDimensions - * @return GD - */ - public function setCurrentDimensions($currentDimensions) - { - $this->currentDimensions = $currentDimensions; - - return $this; - } - - /** - * @return int - */ - public function getMaxHeight() - { - return $this->maxHeight; - } - - /** - * @param $maxHeight - * @return GD - */ - public function setMaxHeight($maxHeight) - { - $this->maxHeight = $maxHeight; - - return $this; - } - - /** - * @return int - */ - public function getMaxWidth() - { - return $this->maxWidth; - } - - /** - * @param $maxWidth - * @return GD - */ - public function setMaxWidth($maxWidth) - { - $this->maxWidth = $maxWidth; - - return $this; - } - - /** - * Returns $newDimensions. - * - * @see \PHPThumb\GD::$newDimensions - */ - public function getNewDimensions() - { - return $this->newDimensions; - } - - /** - * Sets $newDimensions. - * - * @param object $newDimensions - * @see \PHPThumb\GD::$newDimensions - */ - public function setNewDimensions($newDimensions) - { - $this->newDimensions = $newDimensions; - - return $this; - } - - /** - * Returns $options. - * - * @see \PHPThumb\GD::$options - */ - public function getOptions() - { - return $this->options; - } - - /** - * Returns $percent. - * - * @see \PHPThumb\GD::$percent - */ - public function getPercent() - { - return $this->percent; - } - - /** - * Sets $percent. - * - * @param object $percent - * @see \PHPThumb\GD::$percent - */ - public function setPercent($percent) - { - $this->percent = $percent; - - return $this; - } - - /** - * Returns $oldImage. - * - * @see \PHPThumb\GD::$oldImage - */ - public function getOldImage() - { - return $this->oldImage; - } - - /** - * Sets $oldImage. - * - * @param object $oldImage - * @see \PHPThumb\GD::$oldImage - */ - public function setOldImage($oldImage) - { - $this->oldImage = $oldImage; - - return $this; - } - - /** - * Returns $workingImage. - * - * @see \PHPThumb\GD::$workingImage - */ - public function getWorkingImage() - { - return $this->workingImage; - } - - /** - * Sets $workingImage. - * - * @param object $workingImage - * @see \PHPThumb\GD::$workingImage - */ - public function setWorkingImage($workingImage) - { - $this->workingImage = $workingImage; - - return $this; - } - - - ################################# - # ----- UTILITY FUNCTIONS ----- # - ################################# - - /** - * Calculates a new width and height for the image based on $this->maxWidth and the provided dimensions - * - * @return array - * @param int $width - * @param int $height - */ - protected function calcWidth($width, $height) - { - $newWidthPercentage = (100 * $this->maxWidth) / $width; - $newHeight = ($height * $newWidthPercentage) / 100; - - return array( - 'newWidth' => intval($this->maxWidth), - 'newHeight' => intval($newHeight) - ); - } - - /** - * Calculates a new width and height for the image based on $this->maxWidth and the provided dimensions - * - * @return array - * @param int $width - * @param int $height - */ - protected function calcHeight($width, $height) - { - $newHeightPercentage = (100 * $this->maxHeight) / $height; - $newWidth = ($width * $newHeightPercentage) / 100; - - return array( - 'newWidth' => ceil($newWidth), - 'newHeight' => ceil($this->maxHeight) - ); - } - - /** - * Calculates a new width and height for the image based on $this->percent and the provided dimensions - * - * @return array - * @param int $width - * @param int $height - */ - protected function calcPercent($width, $height) - { - $newWidth = ($width * $this->percent) / 100; - $newHeight = ($height * $this->percent) / 100; - - return array( - 'newWidth' => ceil($newWidth), - 'newHeight' => ceil($newHeight) - ); - } - - /** - * Calculates the new image dimensions - * - * These calculations are based on both the provided dimensions and $this->maxWidth and $this->maxHeight - * - * @param int $width - * @param int $height - */ - protected function calcImageSize($width, $height) - { - $newSize = array( - 'newWidth' => $width, - 'newHeight' => $height - ); - - if ($this->maxWidth > 0) { - $newSize = $this->calcWidth($width, $height); - - if ($this->maxHeight > 0 && $newSize['newHeight'] > $this->maxHeight) { - $newSize = $this->calcHeight($newSize['newWidth'], $newSize['newHeight']); - } - } - - if ($this->maxHeight > 0) { - $newSize = $this->calcHeight($width, $height); - - if ($this->maxWidth > 0 && $newSize['newWidth'] > $this->maxWidth) { - $newSize = $this->calcWidth($newSize['newWidth'], $newSize['newHeight']); - } - } - - $this->newDimensions = $newSize; - } - - /** - * Calculates new image dimensions, not allowing the width and height to be less than either the max width or height - * - * @param int $width - * @param int $height - */ - protected function calcImageSizeStrict($width, $height) - { - // first, we need to determine what the longest resize dimension is.. - if ($this->maxWidth >= $this->maxHeight) { - // and determine the longest original dimension - if ($width > $height) { - $newDimensions = $this->calcHeight($width, $height); - - if ($newDimensions['newWidth'] < $this->maxWidth) { - $newDimensions = $this->calcWidth($width, $height); - } - } elseif ($height >= $width) { - $newDimensions = $this->calcWidth($width, $height); - - if ($newDimensions['newHeight'] < $this->maxHeight) { - $newDimensions = $this->calcHeight($width, $height); - } - } - } elseif ($this->maxHeight > $this->maxWidth) { - if ($width >= $height) { - $newDimensions = $this->calcWidth($width, $height); - - if ($newDimensions['newHeight'] < $this->maxHeight) { - $newDimensions = $this->calcHeight($width, $height); - } - } elseif ($height > $width) { - $newDimensions = $this->calcHeight($width, $height); - - if ($newDimensions['newWidth'] < $this->maxWidth) { - $newDimensions = $this->calcWidth($width, $height); - } - } - } - - $this->newDimensions = $newDimensions; - } - - /** - * Calculates new dimensions based on $this->percent and the provided dimensions - * - * @param int $width - * @param int $height - */ - protected function calcImageSizePercent($width, $height) - { - if ($this->percent > 0) { - $this->newDimensions = $this->calcPercent($width, $height); - } - } - - /** - * Determines the file format by mime-type - * - * This function will throw exceptions for invalid images / mime-types - * - */ - protected function determineFormat() - { - $formatInfo = getimagesize($this->fileName); - - // non-image files will return false - if ($formatInfo === false) { - if ($this->remoteImage) { - throw new \Exception("Could not determine format of remote image: {$this->fileName}"); - } else { - throw new \Exception("File is not a valid image: {$this->fileName}"); - } - } - - $mimeType = isset($formatInfo['mime']) ? $formatInfo['mime'] : null; - - switch ($mimeType) { - case 'image/gif': - $this->format = 'GIF'; - break; - case 'image/jpeg': - $this->format = 'JPG'; - break; - case 'image/png': - $this->format = 'PNG'; - break; - default: - throw new \Exception("Image format not supported: {$mimeType}"); - } - } - - /** - * Makes sure the correct GD implementation exists for the file type - * - */ - protected function verifyFormatCompatiblity() - { - $isCompatible = true; - $gdInfo = gd_info(); - - switch ($this->format) { - case 'GIF': - $isCompatible = isset($gdInfo['GIF Create Support']); - break; - case 'JPG': - $isCompatible = (isset($gdInfo['JPG Support']) || isset($gdInfo['JPEG Support'])) ? true : false; - break; - case 'PNG': - $isCompatible = isset($gdInfo[$this->format . ' Support']); - break; - default: - $isCompatible = false; - } - - if (!$isCompatible) { - // one last check for "JPEG" instead - $isCompatible = isset($gdInfo['JPEG Support']); - - if (!$isCompatible) { - throw new \Exception("Your GD installation does not support {$this->format} image types"); - } - } - } - - /** - * Preserves the alpha or transparency for PNG and GIF files - * - * Alpha / transparency will not be preserved if the appropriate options are set to false. - * Also, the GIF transparency is pretty skunky (the results aren't awesome), but it works like a - * champ... that's the nature of GIFs tho, so no huge surprise. - * - * This functionality was originally suggested by commenter Aimi (no links / site provided) - Thanks! :) - * - */ - protected function preserveAlpha() - { - if ($this->format == 'PNG' && $this->options['preserveAlpha'] === true) { - imagealphablending($this->workingImage, false); - - $colorTransparent = imagecolorallocatealpha( - $this->workingImage, - $this->options['alphaMaskColor'][0], - $this->options['alphaMaskColor'][1], - $this->options['alphaMaskColor'][2], - 0 - ); - - imagefill($this->workingImage, 0, 0, $colorTransparent); - imagesavealpha($this->workingImage, true); - } - // preserve transparency in GIFs... this is usually pretty rough tho - if ($this->format == 'GIF' && $this->options['preserveTransparency'] === true) { - $colorTransparent = imagecolorallocate( - $this->workingImage, - $this->options['transparencyMaskColor'][0], - $this->options['transparencyMaskColor'][1], - $this->options['transparencyMaskColor'][2] - ); - - imagecolortransparent($this->workingImage, $colorTransparent); - imagetruecolortopalette($this->workingImage, true, 256); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/PHPThumb.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/PHPThumb.php deleted file mode 100755 index a86c8c91..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/PHPThumb.php +++ /dev/null @@ -1,143 +0,0 @@ - - * Copyright (c) 2009, Ian Selby/Gen X Design - * - * Author(s): Ian Selby - * - * Licensed under the MIT License - * Redistributions of files must retain the above copyright notice. - * - * @author Ian Selby - * @copyright Copyright (c) 2009 Gen X Design - * @link http://phpthumb.gxdlabs.com - * @license http://www.opensource.org/licenses/mit-license.php The MIT License - */ - -abstract class PHPThumb -{ - /** - * The name of the file we're manipulating - * This must include the path to the file (absolute paths recommended) - * - * @var string - */ - protected $fileName; - - /** - * What the file format is (mime-type) - * - * @var string - */ - protected $format; - - /** - * Whether or not the image is hosted remotely - * - * @var bool - */ - protected $remoteImage; - - /** - * An array of attached plugins to execute in order. - * @var array - */ - protected $plugins; - - /** - * @param $fileName - * @param array $options - * @param array $plugins - */ - public function __construct($fileName, array $options = array(), array $plugins = array()) - { - $this->fileName = $fileName; - $this->remoteImage = false; - - if(!$this->validateRequestedResource($fileName)) { - throw new \InvalidArgumentException("Image file not found: {$fileName}"); - } - - $this->setOptions($options); - - $this->plugins = $plugins; - } - - abstract public function setOptions(array $options = array()); - - /** - * Check the provided filename/url. If it is a url, validate that it is properly - * formatted. If it is a file, check to make sure that it actually exists on - * the filesystem. - * - * @param $filename - * @return bool - */ - protected function validateRequestedResource($filename) - { - if(false !== filter_var($filename, FILTER_VALIDATE_URL)) { - $this->remoteImage = true; - return true; - } - - if (file_exists($filename)) { - return true; - } - - return false; - } - - /** - * Returns the filename. - * @return string - */ - public function getFileName() - { - return $this->fileName; - } - - /** - * Sets the filename. - * @param $fileName - * @return PHPThumb - */ - public function setFileName($fileName) - { - $this->fileName = $fileName; - - return $this; - } - - /** - * Returns the format. - * @return string - */ - public function getFormat() - { - return $this->format; - } - - /** - * Sets the format. - * @param $format - * @return PHPThumb - */ - public function setFormat($format) - { - $this->format = $format; - - return $this; - } - - /** - * Returns whether the image exists remotely, i.e. it was loaded via a URL. - * @return bool - */ - public function getIsRemoteImage() - { - return $this->remoteImage; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/PluginInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/PluginInterface.php deleted file mode 100755 index 56df9768..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/PHPThumb/PluginInterface.php +++ /dev/null @@ -1,12 +0,0 @@ - - * Copyright (c) 2009, Ian Selby/Gen X Design - * - * Author(s): Ian Selby - * - * Licensed under the MIT License - * Redistributions of files must retain the above copyright notice. - * - * @author Ian Selby - * @copyright Copyright (c) 2009 Gen X Design - * @link http://phpthumb.gxdlabs.com - * @license http://www.opensource.org/licenses/mit-license.php The MIT License - * @version 3.0 - * @package PhpThumb - * @filesource - */ - -/** - * GD Reflection Lib Plugin - * - * This plugin allows you to create those fun Apple(tm)-style reflections in your images - * - * @package PhpThumb - * @subpackage Plugins - */ -class Reflection implements \PHPThumb\PluginInterface -{ - protected $currentDimensions; - protected $workingImage; - protected $newImage; - protected $options; - - protected $percent; - protected $reflection; - protected $white; - protected $border; - protected $borderColor; - - public function __construct($percent, $reflection, $white, $border, $borderColor) - { - $this->percent = $percent; - $this->reflection = $reflection; - $this->white = $white; - $this->border = $border; - $this->borderColor = $borderColor; - } - - /** - * @param \PHPThumb\PHPThumb $phpthumb - * @return \PHPThumb\PHPThumb - */ - public function execute($phpthumb) - { - $this->currentDimensions = $phpthumb->getCurrentDimensions(); - $this->workingImage = $phpthumb->getWorkingImage(); - $this->newImage = $phpthumb->getOldImage(); - $this->options = $phpthumb->getOptions(); - - $width = $this->currentDimensions['width']; - $height = $this->currentDimensions['height']; - $this->reflectionHeight = intval($height * ($this->reflection / 100)); - $newHeight = $height + $this->reflectionHeight; - $reflectedPart = $height * ($this->percent / 100); - - $this->workingImage = imagecreatetruecolor($width, $newHeight); - - imagealphablending($this->workingImage, true); - - $colorToPaint = imagecolorallocatealpha( - $this->workingImage, - 255, - 255, - 255, - 0 - ); - - imagefilledrectangle( - $this->workingImage, - 0, - 0, - $width, - $newHeight, - $colorToPaint - ); - - imagecopyresampled( - $this->workingImage, - $this->newImage, - 0, - 0, - 0, - $reflectedPart, - $width, - $this->reflectionHeight, - $width, - ($height - $reflectedPart) - ); - - $this->imageFlipVertical(); - - imagecopy( - $this->workingImage, - $this->newImage, - 0, - 0, - 0, - 0, - $width, - $height - ); - - imagealphablending($this->workingImage, true); - - for ($i = 0; $i < $this->reflectionHeight; $i++) { - $colorToPaint = imagecolorallocatealpha( - $this->workingImage, - 255, - 255, - 255, - ($i / $this->reflectionHeight * -1 + 1) * $this->white - ); - - imagefilledrectangle( - $this->workingImage, - 0, - $height + $i, - $width, - $height + $i, - $colorToPaint - ); - } - - if ($this->border == true) { - $rgb = $this->hex2rgb($this->borderColor, false); - $colorToPaint = imagecolorallocate($this->workingImage, $rgb[0], $rgb[1], $rgb[2]); - - //top line - imageline( - $this->workingImage, - 0, - 0, - $width, - 0, - $colorToPaint - ); - - //bottom line - imageline( - $this->workingImage, - 0, - $height, - $width, - $height, - $colorToPaint - ); - - //left line - imageline( - $this->workingImage, - 0, - 0, - 0, - $height, - $colorToPaint - ); - - //right line - imageline( - $this->workingImage, - $width - 1, - 0, - $width - 1, - $height, - $colorToPaint - ); - } - - if ($phpthumb->getFormat() == 'PNG') { - $colorTransparent = imagecolorallocatealpha( - $this->workingImage, - $this->options['alphaMaskColor'][0], - $this->options['alphaMaskColor'][1], - $this->options['alphaMaskColor'][2], - 0 - ); - - imagefill($this->workingImage, 0, 0, $colorTransparent); - imagesavealpha($this->workingImage, true); - } - - $phpthumb->setOldImage($this->workingImage); - $this->currentDimensions['width'] = $width; - $this->currentDimensions['height'] = $newHeight; - $phpthumb->setCurrentDimensions($this->currentDimensions); - - return $phpthumb; - } - - /** - * Flips the image vertically - * - */ - protected function imageFlipVertical () - { - $x_i = imagesx($this->workingImage); - $y_i = imagesy($this->workingImage); - - for ($x = 0; $x < $x_i; $x++) { - for ($y = 0; $y < $y_i; $y++) { - imagecopy( - $this->workingImage, - $this->workingImage, - $x, - $y_i - $y - 1, - $x, - $y, - 1, - 1 - ); - } - } - } - - /** - * Converts a hex color to rgb tuples - * - * @return mixed - * @param string $hex - * @param bool $asString - */ - protected function hex2rgb ($hex, $asString = false) - { - // strip off any leading # - if (0 === strpos($hex, '#')) { - $hex = substr($hex, 1); - } elseif (0 === strpos($hex, '&H')) { - $hex = substr($hex, 2); - } - - // break into hex 3-tuple - $cutpoint = ceil(strlen($hex) / 2)-1; - $rgb = explode(':', wordwrap($hex, $cutpoint, ':', $cutpoint), 3); - - // convert each tuple to decimal - $rgb[0] = (isset($rgb[0]) ? hexdec($rgb[0]) : 0); - $rgb[1] = (isset($rgb[1]) ? hexdec($rgb[1]) : 0); - $rgb[2] = (isset($rgb[2]) ? hexdec($rgb[2]) : 0); - - return ($asString ? "{$rgb[0]} {$rgb[1]} {$rgb[2]}" : $rgb); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Autoloader.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Autoloader.php deleted file mode 100755 index 17ec2ff1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Autoloader.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis; - -/** - * Implements a lightweight PSR-0 compliant autoloader for Predis. - * - * @author Eric Naeseth - * @author Daniele Alessandri - */ -class Autoloader -{ - private $directory; - private $prefix; - private $prefixLength; - - /** - * @param string $baseDirectory Base directory where the source files are located. - */ - public function __construct($baseDirectory = __DIR__) - { - $this->directory = $baseDirectory; - $this->prefix = __NAMESPACE__.'\\'; - $this->prefixLength = strlen($this->prefix); - } - - /** - * Registers the autoloader class with the PHP SPL autoloader. - * - * @param bool $prepend Prepend the autoloader on the stack instead of appending it. - */ - public static function register($prepend = false) - { - spl_autoload_register(array(new self(), 'autoload'), true, $prepend); - } - - /** - * Loads a class from a file using its fully qualified name. - * - * @param string $className Fully qualified name of a class. - */ - public function autoload($className) - { - if (0 === strpos($className, $this->prefix)) { - $parts = explode('\\', substr($className, $this->prefixLength)); - $filepath = $this->directory.DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, $parts).'.php'; - - if (is_file($filepath)) { - require $filepath; - } - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Client.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Client.php deleted file mode 100755 index 87596ec9..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Client.php +++ /dev/null @@ -1,523 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis; - -use Predis\Command\CommandInterface; -use Predis\Command\RawCommand; -use Predis\Command\ScriptCommand; -use Predis\Configuration\Options; -use Predis\Configuration\OptionsInterface; -use Predis\Connection\AggregateConnectionInterface; -use Predis\Connection\ConnectionInterface; -use Predis\Connection\ParametersInterface; -use Predis\Monitor\Consumer as MonitorConsumer; -use Predis\Pipeline\Pipeline; -use Predis\PubSub\Consumer as PubSubConsumer; -use Predis\Response\ErrorInterface as ErrorResponseInterface; -use Predis\Response\ResponseInterface; -use Predis\Response\ServerException; -use Predis\Transaction\MultiExec as MultiExecTransaction; - -/** - * Client class used for connecting and executing commands on Redis. - * - * This is the main high-level abstraction of Predis upon which various other - * abstractions are built. Internally it aggregates various other classes each - * one with its own responsibility and scope. - * - * {@inheritdoc} - * - * @author Daniele Alessandri - */ -class Client implements ClientInterface -{ - const VERSION = '1.0.3'; - - protected $connection; - protected $options; - private $profile; - - /** - * @param mixed $parameters Connection parameters for one or more servers. - * @param mixed $options Options to configure some behaviours of the client. - */ - public function __construct($parameters = null, $options = null) - { - $this->options = $this->createOptions($options ?: array()); - $this->connection = $this->createConnection($parameters ?: array()); - $this->profile = $this->options->profile; - } - - /** - * Creates a new instance of Predis\Configuration\Options from different - * types of arguments or simply returns the passed argument if it is an - * instance of Predis\Configuration\OptionsInterface. - * - * @param mixed $options Client options. - * - * @throws \InvalidArgumentException - * - * @return OptionsInterface - */ - protected function createOptions($options) - { - if (is_array($options)) { - return new Options($options); - } - - if ($options instanceof OptionsInterface) { - return $options; - } - - throw new \InvalidArgumentException('Invalid type for client options.'); - } - - /** - * Creates single or aggregate connections from different types of arguments - * (string, array) or returns the passed argument if it is an instance of a - * class implementing Predis\Connection\ConnectionInterface. - * - * Accepted types for connection parameters are: - * - * - Instance of Predis\Connection\ConnectionInterface. - * - Instance of Predis\Connection\ParametersInterface. - * - Array - * - String - * - Callable - * - * @param mixed $parameters Connection parameters or connection instance. - * - * @throws \InvalidArgumentException - * - * @return ConnectionInterface - */ - protected function createConnection($parameters) - { - if ($parameters instanceof ConnectionInterface) { - return $parameters; - } - - if ($parameters instanceof ParametersInterface || is_string($parameters)) { - return $this->options->connections->create($parameters); - } - - if (is_array($parameters)) { - if (!isset($parameters[0])) { - return $this->options->connections->create($parameters); - } - - $options = $this->options; - - if ($options->defined('aggregate')) { - $initializer = $this->getConnectionInitializerWrapper($options->aggregate); - $connection = $initializer($parameters, $options); - } else { - if ($options->defined('replication') && $replication = $options->replication) { - $connection = $replication; - } else { - $connection = $options->cluster; - } - - $options->connections->aggregate($connection, $parameters); - } - - return $connection; - } - - if (is_callable($parameters)) { - $initializer = $this->getConnectionInitializerWrapper($parameters); - $connection = $initializer($this->options); - - return $connection; - } - - throw new \InvalidArgumentException('Invalid type for connection parameters.'); - } - - /** - * Wraps a callable to make sure that its returned value represents a valid - * connection type. - * - * @param mixed $callable - * - * @return \Closure - */ - protected function getConnectionInitializerWrapper($callable) - { - return function () use ($callable) { - $connection = call_user_func_array($callable, func_get_args()); - - if (!$connection instanceof ConnectionInterface) { - throw new \UnexpectedValueException( - 'The callable connection initializer returned an invalid type.' - ); - } - - return $connection; - }; - } - - /** - * {@inheritdoc} - */ - public function getProfile() - { - return $this->profile; - } - - /** - * {@inheritdoc} - */ - public function getOptions() - { - return $this->options; - } - - /** - * Creates a new client instance for the specified connection ID or alias, - * only when working with an aggregate connection (cluster, replication). - * The new client instances uses the same options of the original one. - * - * @param string $connectionID Identifier of a connection. - * - * @throws \InvalidArgumentException - * - * @return Client - */ - public function getClientFor($connectionID) - { - if (!$connection = $this->getConnectionById($connectionID)) { - throw new \InvalidArgumentException("Invalid connection ID: $connectionID."); - } - - return new static($connection, $this->options); - } - - /** - * Opens the underlying connection and connects to the server. - */ - public function connect() - { - $this->connection->connect(); - } - - /** - * Closes the underlying connection and disconnects from the server. - */ - public function disconnect() - { - $this->connection->disconnect(); - } - - /** - * Closes the underlying connection and disconnects from the server. - * - * This is the same as `Client::disconnect()` as it does not actually send - * the `QUIT` command to Redis, but simply closes the connection. - */ - public function quit() - { - $this->disconnect(); - } - - /** - * Returns the current state of the underlying connection. - * - * @return bool - */ - public function isConnected() - { - return $this->connection->isConnected(); - } - - /** - * {@inheritdoc} - */ - public function getConnection() - { - return $this->connection; - } - - /** - * Retrieves the specified connection from the aggregate connection when the - * client is in cluster or replication mode. - * - * @param string $connectionID Index or alias of the single connection. - * - * @throws NotSupportedException - * - * @return Connection\NodeConnectionInterface - */ - public function getConnectionById($connectionID) - { - if (!$this->connection instanceof AggregateConnectionInterface) { - throw new NotSupportedException( - 'Retrieving connections by ID is supported only by aggregate connections.' - ); - } - - return $this->connection->getConnectionById($connectionID); - } - - /** - * Executes a command without filtering its arguments, parsing the response, - * applying any prefix to keys or throwing exceptions on Redis errors even - * regardless of client options. - * - * It is possibile to indentify Redis error responses from normal responses - * using the second optional argument which is populated by reference. - * - * @param array $arguments Command arguments as defined by the command signature. - * @param bool $error Set to TRUE when Redis returned an error response. - * - * @return mixed - */ - public function executeRaw(array $arguments, &$error = null) - { - $error = false; - - $response = $this->connection->executeCommand( - new RawCommand($arguments) - ); - - if ($response instanceof ResponseInterface) { - if ($response instanceof ErrorResponseInterface) { - $error = true; - } - - return (string) $response; - } - - return $response; - } - - /** - * {@inheritdoc} - */ - public function __call($commandID, $arguments) - { - return $this->executeCommand( - $this->createCommand($commandID, $arguments) - ); - } - - /** - * {@inheritdoc} - */ - public function createCommand($commandID, $arguments = array()) - { - return $this->profile->createCommand($commandID, $arguments); - } - - /** - * {@inheritdoc} - */ - public function executeCommand(CommandInterface $command) - { - $response = $this->connection->executeCommand($command); - - if ($response instanceof ResponseInterface) { - if ($response instanceof ErrorResponseInterface) { - $response = $this->onErrorResponse($command, $response); - } - - return $response; - } - - return $command->parseResponse($response); - } - - /** - * Handles -ERR responses returned by Redis. - * - * @param CommandInterface $command Redis command that generated the error. - * @param ErrorResponseInterface $response Instance of the error response. - * - * @throws ServerException - * - * @return mixed - */ - protected function onErrorResponse(CommandInterface $command, ErrorResponseInterface $response) - { - if ($command instanceof ScriptCommand && $response->getErrorType() === 'NOSCRIPT') { - $eval = $this->createCommand('EVAL'); - $eval->setRawArguments($command->getEvalArguments()); - - $response = $this->executeCommand($eval); - - if (!$response instanceof ResponseInterface) { - $response = $command->parseResponse($response); - } - - return $response; - } - - if ($this->options->exceptions) { - throw new ServerException($response->getMessage()); - } - - return $response; - } - - /** - * Executes the specified initializer method on `$this` by adjusting the - * actual invokation depending on the arity (0, 1 or 2 arguments). This is - * simply an utility method to create Redis contexts instances since they - * follow a common initialization path. - * - * @param string $initializer Method name. - * @param array $argv Arguments for the method. - * - * @return mixed - */ - private function sharedContextFactory($initializer, $argv = null) - { - switch (count($argv)) { - case 0: - return $this->$initializer(); - - case 1: - return is_array($argv[0]) - ? $this->$initializer($argv[0]) - : $this->$initializer(null, $argv[0]); - - case 2: - list($arg0, $arg1) = $argv; - - return $this->$initializer($arg0, $arg1); - - default: - return $this->$initializer($this, $argv); - } - } - - /** - * Creates a new pipeline context and returns it, or returns the results of - * a pipeline executed inside the optionally provided callable object. - * - * @param mixed ... Array of options, a callable for execution, or both. - * - * @return Pipeline|array - */ - public function pipeline(/* arguments */) - { - return $this->sharedContextFactory('createPipeline', func_get_args()); - } - - /** - * Actual pipeline context initializer method. - * - * @param array $options Options for the context. - * @param mixed $callable Optional callable used to execute the context. - * - * @return Pipeline|array - */ - protected function createPipeline(array $options = null, $callable = null) - { - if (isset($options['atomic']) && $options['atomic']) { - $class = 'Predis\Pipeline\Atomic'; - } elseif (isset($options['fire-and-forget']) && $options['fire-and-forget']) { - $class = 'Predis\Pipeline\FireAndForget'; - } else { - $class = 'Predis\Pipeline\Pipeline'; - } - - /* - * @var ClientContextInterface - */ - $pipeline = new $class($this); - - if (isset($callable)) { - return $pipeline->execute($callable); - } - - return $pipeline; - } - - /** - * Creates a new transaction context and returns it, or returns the results - * of a transaction executed inside the optionally provided callable object. - * - * @param mixed ... Array of options, a callable for execution, or both. - * - * @return MultiExecTransaction|array - */ - public function transaction(/* arguments */) - { - return $this->sharedContextFactory('createTransaction', func_get_args()); - } - - /** - * Actual transaction context initializer method. - * - * @param array $options Options for the context. - * @param mixed $callable Optional callable used to execute the context. - * - * @return MultiExecTransaction|array - */ - protected function createTransaction(array $options = null, $callable = null) - { - $transaction = new MultiExecTransaction($this, $options); - - if (isset($callable)) { - return $transaction->execute($callable); - } - - return $transaction; - } - - /** - * Creates a new publis/subscribe context and returns it, or starts its loop - * inside the optionally provided callable object. - * - * @param mixed ... Array of options, a callable for execution, or both. - * - * @return PubSubConsumer|null - */ - public function pubSubLoop(/* arguments */) - { - return $this->sharedContextFactory('createPubSub', func_get_args()); - } - - /** - * Actual publish/subscribe context initializer method. - * - * @param array $options Options for the context. - * @param mixed $callable Optional callable used to execute the context. - * - * @return PubSubConsumer|null - */ - protected function createPubSub(array $options = null, $callable = null) - { - $pubsub = new PubSubConsumer($this, $options); - - if (!isset($callable)) { - return $pubsub; - } - - foreach ($pubsub as $message) { - if (call_user_func($callable, $pubsub, $message) === false) { - $pubsub->stop(); - } - } - } - - /** - * Creates a new monitor consumer and returns it. - * - * @return MonitorConsumer - */ - public function monitor() - { - return new MonitorConsumer($this); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientContextInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientContextInterface.php deleted file mode 100755 index 7f695b78..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientContextInterface.php +++ /dev/null @@ -1,189 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis; - -use Predis\Command\CommandInterface; - -/** - * Interface defining a client-side context such as a pipeline or transaction. - * - * @method $this del(array $keys) - * @method $this dump($key) - * @method $this exists($key) - * @method $this expire($key, $seconds) - * @method $this expireat($key, $timestamp) - * @method $this keys($pattern) - * @method $this move($key, $db) - * @method $this object($subcommand, $key) - * @method $this persist($key) - * @method $this pexpire($key, $milliseconds) - * @method $this pexpireat($key, $timestamp) - * @method $this pttl($key) - * @method $this randomkey() - * @method $this rename($key, $target) - * @method $this renamenx($key, $target) - * @method $this scan($cursor, array $options = null) - * @method $this sort($key, array $options = null) - * @method $this ttl($key) - * @method $this type($key) - * @method $this append($key, $value) - * @method $this bitcount($key, $start = null, $end = null) - * @method $this bitop($operation, $destkey, $key) - * @method $this decr($key) - * @method $this decrby($key, $decrement) - * @method $this get($key) - * @method $this getbit($key, $offset) - * @method $this getrange($key, $start, $end) - * @method $this getset($key, $value) - * @method $this incr($key) - * @method $this incrby($key, $increment) - * @method $this incrbyfloat($key, $increment) - * @method $this mget(array $keys) - * @method $this mset(array $dictionary) - * @method $this msetnx(array $dictionary) - * @method $this psetex($key, $milliseconds, $value) - * @method $this set($key, $value, $expireResolution = null, $expireTTL = null, $flag = null) - * @method $this setbit($key, $offset, $value) - * @method $this setex($key, $seconds, $value) - * @method $this setnx($key, $value) - * @method $this setrange($key, $offset, $value) - * @method $this strlen($key) - * @method $this hdel($key, array $fields) - * @method $this hexists($key, $field) - * @method $this hget($key, $field) - * @method $this hgetall($key) - * @method $this hincrby($key, $field, $increment) - * @method $this hincrbyfloat($key, $field, $increment) - * @method $this hkeys($key) - * @method $this hlen($key) - * @method $this hmget($key, array $fields) - * @method $this hmset($key, array $dictionary) - * @method $this hscan($key, $cursor, array $options = null) - * @method $this hset($key, $field, $value) - * @method $this hsetnx($key, $field, $value) - * @method $this hvals($key) - * @method $this blpop(array $keys, $timeout) - * @method $this brpop(array $keys, $timeout) - * @method $this brpoplpush($source, $destination, $timeout) - * @method $this lindex($key, $index) - * @method $this linsert($key, $whence, $pivot, $value) - * @method $this llen($key) - * @method $this lpop($key) - * @method $this lpush($key, array $values) - * @method $this lpushx($key, $value) - * @method $this lrange($key, $start, $stop) - * @method $this lrem($key, $count, $value) - * @method $this lset($key, $index, $value) - * @method $this ltrim($key, $start, $stop) - * @method $this rpop($key) - * @method $this rpoplpush($source, $destination) - * @method $this rpush($key, array $values) - * @method $this rpushx($key, $value) - * @method $this sadd($key, array $members) - * @method $this scard($key) - * @method $this sdiff(array $keys) - * @method $this sdiffstore($destination, array $keys) - * @method $this sinter(array $keys) - * @method $this sinterstore($destination, array $keys) - * @method $this sismember($key, $member) - * @method $this smembers($key) - * @method $this smove($source, $destination, $member) - * @method $this spop($key) - * @method $this srandmember($key, $count = null) - * @method $this srem($key, $member) - * @method $this sscan($key, $cursor, array $options = null) - * @method $this sunion(array $keys) - * @method $this sunionstore($destination, array $keys) - * @method $this zadd($key, array $membersAndScoresDictionary) - * @method $this zcard($key) - * @method $this zcount($key, $min, $max) - * @method $this zincrby($key, $increment, $member) - * @method $this zinterstore($destination, array $keys, array $options = null) - * @method $this zrange($key, $start, $stop, array $options = null) - * @method $this zrangebyscore($key, $min, $max, array $options = null) - * @method $this zrank($key, $member) - * @method $this zrem($key, $member) - * @method $this zremrangebyrank($key, $start, $stop) - * @method $this zremrangebyscore($key, $min, $max) - * @method $this zrevrange($key, $start, $stop, array $options = null) - * @method $this zrevrangebyscore($key, $min, $max, array $options = null) - * @method $this zrevrank($key, $member) - * @method $this zunionstore($destination, array $keys, array $options = null) - * @method $this zscore($key, $member) - * @method $this zscan($key, $cursor, array $options = null) - * @method $this zrangebylex($key, $start, $stop, array $options = null) - * @method $this zremrangebylex($key, $min, $max) - * @method $this zlexcount($key, $min, $max) - * @method $this pfadd($key, array $elements) - * @method $this pfmerge($destinationKey, array $sourceKeys) - * @method $this pfcount(array $keys) - * @method $this pubsub($subcommand, $argument) - * @method $this publish($channel, $message) - * @method $this discard() - * @method $this exec() - * @method $this multi() - * @method $this unwatch() - * @method $this watch($key) - * @method $this eval($script, $numkeys, $keyOrArg1 = null, $keyOrArgN = null) - * @method $this evalsha($script, $numkeys, $keyOrArg1 = null, $keyOrArgN = null) - * @method $this script($subcommand, $argument = null) - * @method $this auth($password) - * @method $this echo($message) - * @method $this ping($message = null) - * @method $this select($database) - * @method $this bgrewriteaof() - * @method $this bgsave() - * @method $this client($subcommand, $argument = null) - * @method $this config($subcommand, $argument = null) - * @method $this dbsize() - * @method $this flushall() - * @method $this flushdb() - * @method $this info($section = null) - * @method $this lastsave() - * @method $this save() - * @method $this slaveof($host, $port) - * @method $this slowlog($subcommand, $argument = null) - * @method $this time() - * @method $this command() - * - * @author Daniele Alessandri - */ -interface ClientContextInterface -{ - /** - * Sends the specified command instance to Redis. - * - * @param CommandInterface $command Command instance. - * - * @return mixed - */ - public function executeCommand(CommandInterface $command); - - /** - * Sends the specified command with its arguments to Redis. - * - * @param string $method Command ID. - * @param array $arguments Arguments for the command. - * - * @return mixed - */ - public function __call($method, $arguments); - - /** - * Starts the execution of the context. - * - * @param mixed $callable Optional callback for execution. - * - * @return array - */ - public function execute($callable = null); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientException.php deleted file mode 100755 index 6c07aaf0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis; - -/** - * Exception class that identifies client-side errors. - * - * @author Daniele Alessandri - */ -class ClientException extends PredisException -{ -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientInterface.php deleted file mode 100755 index f216c470..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/ClientInterface.php +++ /dev/null @@ -1,230 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis; - -use Predis\Command\CommandInterface; -use Predis\Configuration\OptionsInterface; -use Predis\Connection\ConnectionInterface; -use Predis\Profile\ProfileInterface; - -/** - * Interface defining a client able to execute commands against Redis. - * - * All the commands exposed by the client generally have the same signature as - * described by the Redis documentation, but some of them offer an additional - * and more friendly interface to ease programming which is described in the - * following list of methods: - * - * @method int del(array $keys) - * @method string dump($key) - * @method int exists($key) - * @method int expire($key, $seconds) - * @method int expireat($key, $timestamp) - * @method array keys($pattern) - * @method int move($key, $db) - * @method mixed object($subcommand, $key) - * @method int persist($key) - * @method int pexpire($key, $milliseconds) - * @method int pexpireat($key, $timestamp) - * @method int pttl($key) - * @method string randomkey() - * @method mixed rename($key, $target) - * @method int renamenx($key, $target) - * @method array scan($cursor, array $options = null) - * @method array sort($key, array $options = null) - * @method int ttl($key) - * @method mixed type($key) - * @method int append($key, $value) - * @method int bitcount($key, $start = null, $end = null) - * @method int bitop($operation, $destkey, $key) - * @method int decr($key) - * @method int decrby($key, $decrement) - * @method string get($key) - * @method int getbit($key, $offset) - * @method string getrange($key, $start, $end) - * @method string getset($key, $value) - * @method int incr($key) - * @method int incrby($key, $increment) - * @method string incrbyfloat($key, $increment) - * @method array mget(array $keys) - * @method mixed mset(array $dictionary) - * @method int msetnx(array $dictionary) - * @method mixed psetex($key, $milliseconds, $value) - * @method mixed set($key, $value, $expireResolution = null, $expireTTL = null, $flag = null) - * @method int setbit($key, $offset, $value) - * @method int setex($key, $seconds, $value) - * @method int setnx($key, $value) - * @method int setrange($key, $offset, $value) - * @method int strlen($key) - * @method int hdel($key, array $fields) - * @method int hexists($key, $field) - * @method string hget($key, $field) - * @method array hgetall($key) - * @method int hincrby($key, $field, $increment) - * @method string hincrbyfloat($key, $field, $increment) - * @method array hkeys($key) - * @method int hlen($key) - * @method array hmget($key, array $fields) - * @method mixed hmset($key, array $dictionary) - * @method array hscan($key, $cursor, array $options = null) - * @method int hset($key, $field, $value) - * @method int hsetnx($key, $field, $value) - * @method array hvals($key) - * @method array blpop(array $keys, $timeout) - * @method array brpop(array $keys, $timeout) - * @method array brpoplpush($source, $destination, $timeout) - * @method string lindex($key, $index) - * @method int linsert($key, $whence, $pivot, $value) - * @method int llen($key) - * @method string lpop($key) - * @method int lpush($key, array $values) - * @method int lpushx($key, $value) - * @method array lrange($key, $start, $stop) - * @method int lrem($key, $count, $value) - * @method mixed lset($key, $index, $value) - * @method mixed ltrim($key, $start, $stop) - * @method string rpop($key) - * @method string rpoplpush($source, $destination) - * @method int rpush($key, array $values) - * @method int rpushx($key, $value) - * @method int sadd($key, array $members) - * @method int scard($key) - * @method array sdiff(array $keys) - * @method int sdiffstore($destination, array $keys) - * @method array sinter(array $keys) - * @method int sinterstore($destination, array $keys) - * @method int sismember($key, $member) - * @method array smembers($key) - * @method int smove($source, $destination, $member) - * @method string spop($key) - * @method string srandmember($key, $count = null) - * @method int srem($key, $member) - * @method array sscan($key, $cursor, array $options = null) - * @method array sunion(array $keys) - * @method int sunionstore($destination, array $keys) - * @method int zadd($key, array $membersAndScoresDictionary) - * @method int zcard($key) - * @method string zcount($key, $min, $max) - * @method string zincrby($key, $increment, $member) - * @method int zinterstore($destination, array $keys, array $options = null) - * @method array zrange($key, $start, $stop, array $options = null) - * @method array zrangebyscore($key, $min, $max, array $options = null) - * @method int zrank($key, $member) - * @method int zrem($key, $member) - * @method int zremrangebyrank($key, $start, $stop) - * @method int zremrangebyscore($key, $min, $max) - * @method array zrevrange($key, $start, $stop, array $options = null) - * @method array zrevrangebyscore($key, $min, $max, array $options = null) - * @method int zrevrank($key, $member) - * @method int zunionstore($destination, array $keys, array $options = null) - * @method string zscore($key, $member) - * @method array zscan($key, $cursor, array $options = null) - * @method array zrangebylex($key, $start, $stop, array $options = null) - * @method int zremrangebylex($key, $min, $max) - * @method int zlexcount($key, $min, $max) - * @method int pfadd($key, array $elements) - * @method mixed pfmerge($destinationKey, array $sourceKeys) - * @method int pfcount(array $keys) - * @method mixed pubsub($subcommand, $argument) - * @method int publish($channel, $message) - * @method mixed discard() - * @method array exec() - * @method mixed multi() - * @method mixed unwatch() - * @method mixed watch($key) - * @method mixed eval($script, $numkeys, $keyOrArg1 = null, $keyOrArgN = null) - * @method mixed evalsha($script, $numkeys, $keyOrArg1 = null, $keyOrArgN = null) - * @method mixed script($subcommand, $argument = null) - * @method mixed auth($password) - * @method string echo($message) - * @method mixed ping($message = null) - * @method mixed select($database) - * @method mixed bgrewriteaof() - * @method mixed bgsave() - * @method mixed client($subcommand, $argument = null) - * @method mixed config($subcommand, $argument = null) - * @method int dbsize() - * @method mixed flushall() - * @method mixed flushdb() - * @method array info($section = null) - * @method int lastsave() - * @method mixed save() - * @method mixed slaveof($host, $port) - * @method mixed slowlog($subcommand, $argument = null) - * @method array time() - * @method array command() - * - * @author Daniele Alessandri - */ -interface ClientInterface -{ - /** - * Returns the server profile used by the client. - * - * @return ProfileInterface - */ - public function getProfile(); - - /** - * Returns the client options specified upon initialization. - * - * @return OptionsInterface - */ - public function getOptions(); - - /** - * Opens the underlying connection to the server. - */ - public function connect(); - - /** - * Closes the underlying connection from the server. - */ - public function disconnect(); - - /** - * Returns the underlying connection instance. - * - * @return ConnectionInterface - */ - public function getConnection(); - - /** - * Creates a new instance of the specified Redis command. - * - * @param string $method Command ID. - * @param array $arguments Arguments for the command. - * - * @return CommandInterface - */ - public function createCommand($method, $arguments = array()); - - /** - * Executes the specified Redis command. - * - * @param CommandInterface $command Command instance. - * - * @return mixed - */ - public function executeCommand(CommandInterface $command); - - /** - * Creates a Redis command with the specified arguments and sends a request - * to the server. - * - * @param string $method Command ID. - * @param array $arguments Arguments for the command. - * - * @return mixed - */ - public function __call($method, $arguments); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/ClusterStrategy.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/ClusterStrategy.php deleted file mode 100755 index 7635000e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/ClusterStrategy.php +++ /dev/null @@ -1,398 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Cluster; - -use Predis\Command\CommandInterface; -use Predis\Command\ScriptCommand; - -/** - * Common class implementing the logic needed to support clustering strategies. - * - * @author Daniele Alessandri - */ -abstract class ClusterStrategy implements StrategyInterface -{ - protected $commands; - - /** - * - */ - public function __construct() - { - $this->commands = $this->getDefaultCommands(); - } - - /** - * Returns the default map of supported commands with their handlers. - * - * @return array - */ - protected function getDefaultCommands() - { - $getKeyFromFirstArgument = array($this, 'getKeyFromFirstArgument'); - $getKeyFromAllArguments = array($this, 'getKeyFromAllArguments'); - - return array( - /* commands operating on the key space */ - 'EXISTS' => $getKeyFromFirstArgument, - 'DEL' => $getKeyFromAllArguments, - 'TYPE' => $getKeyFromFirstArgument, - 'EXPIRE' => $getKeyFromFirstArgument, - 'EXPIREAT' => $getKeyFromFirstArgument, - 'PERSIST' => $getKeyFromFirstArgument, - 'PEXPIRE' => $getKeyFromFirstArgument, - 'PEXPIREAT' => $getKeyFromFirstArgument, - 'TTL' => $getKeyFromFirstArgument, - 'PTTL' => $getKeyFromFirstArgument, - 'SORT' => $getKeyFromFirstArgument, // TODO - 'DUMP' => $getKeyFromFirstArgument, - 'RESTORE' => $getKeyFromFirstArgument, - - /* commands operating on string values */ - 'APPEND' => $getKeyFromFirstArgument, - 'DECR' => $getKeyFromFirstArgument, - 'DECRBY' => $getKeyFromFirstArgument, - 'GET' => $getKeyFromFirstArgument, - 'GETBIT' => $getKeyFromFirstArgument, - 'MGET' => $getKeyFromAllArguments, - 'SET' => $getKeyFromFirstArgument, - 'GETRANGE' => $getKeyFromFirstArgument, - 'GETSET' => $getKeyFromFirstArgument, - 'INCR' => $getKeyFromFirstArgument, - 'INCRBY' => $getKeyFromFirstArgument, - 'INCRBYFLOAT' => $getKeyFromFirstArgument, - 'SETBIT' => $getKeyFromFirstArgument, - 'SETEX' => $getKeyFromFirstArgument, - 'MSET' => array($this, 'getKeyFromInterleavedArguments'), - 'MSETNX' => array($this, 'getKeyFromInterleavedArguments'), - 'SETNX' => $getKeyFromFirstArgument, - 'SETRANGE' => $getKeyFromFirstArgument, - 'STRLEN' => $getKeyFromFirstArgument, - 'SUBSTR' => $getKeyFromFirstArgument, - 'BITOP' => array($this, 'getKeyFromBitOp'), - 'BITCOUNT' => $getKeyFromFirstArgument, - - /* commands operating on lists */ - 'LINSERT' => $getKeyFromFirstArgument, - 'LINDEX' => $getKeyFromFirstArgument, - 'LLEN' => $getKeyFromFirstArgument, - 'LPOP' => $getKeyFromFirstArgument, - 'RPOP' => $getKeyFromFirstArgument, - 'RPOPLPUSH' => $getKeyFromAllArguments, - 'BLPOP' => array($this, 'getKeyFromBlockingListCommands'), - 'BRPOP' => array($this, 'getKeyFromBlockingListCommands'), - 'BRPOPLPUSH' => array($this, 'getKeyFromBlockingListCommands'), - 'LPUSH' => $getKeyFromFirstArgument, - 'LPUSHX' => $getKeyFromFirstArgument, - 'RPUSH' => $getKeyFromFirstArgument, - 'RPUSHX' => $getKeyFromFirstArgument, - 'LRANGE' => $getKeyFromFirstArgument, - 'LREM' => $getKeyFromFirstArgument, - 'LSET' => $getKeyFromFirstArgument, - 'LTRIM' => $getKeyFromFirstArgument, - - /* commands operating on sets */ - 'SADD' => $getKeyFromFirstArgument, - 'SCARD' => $getKeyFromFirstArgument, - 'SDIFF' => $getKeyFromAllArguments, - 'SDIFFSTORE' => $getKeyFromAllArguments, - 'SINTER' => $getKeyFromAllArguments, - 'SINTERSTORE' => $getKeyFromAllArguments, - 'SUNION' => $getKeyFromAllArguments, - 'SUNIONSTORE' => $getKeyFromAllArguments, - 'SISMEMBER' => $getKeyFromFirstArgument, - 'SMEMBERS' => $getKeyFromFirstArgument, - 'SSCAN' => $getKeyFromFirstArgument, - 'SPOP' => $getKeyFromFirstArgument, - 'SRANDMEMBER' => $getKeyFromFirstArgument, - 'SREM' => $getKeyFromFirstArgument, - - /* commands operating on sorted sets */ - 'ZADD' => $getKeyFromFirstArgument, - 'ZCARD' => $getKeyFromFirstArgument, - 'ZCOUNT' => $getKeyFromFirstArgument, - 'ZINCRBY' => $getKeyFromFirstArgument, - 'ZINTERSTORE' => array($this, 'getKeyFromZsetAggregationCommands'), - 'ZRANGE' => $getKeyFromFirstArgument, - 'ZRANGEBYSCORE' => $getKeyFromFirstArgument, - 'ZRANK' => $getKeyFromFirstArgument, - 'ZREM' => $getKeyFromFirstArgument, - 'ZREMRANGEBYRANK' => $getKeyFromFirstArgument, - 'ZREMRANGEBYSCORE' => $getKeyFromFirstArgument, - 'ZREVRANGE' => $getKeyFromFirstArgument, - 'ZREVRANGEBYSCORE' => $getKeyFromFirstArgument, - 'ZREVRANK' => $getKeyFromFirstArgument, - 'ZSCORE' => $getKeyFromFirstArgument, - 'ZUNIONSTORE' => array($this, 'getKeyFromZsetAggregationCommands'), - 'ZSCAN' => $getKeyFromFirstArgument, - 'ZLEXCOUNT' => $getKeyFromFirstArgument, - 'ZRANGEBYLEX' => $getKeyFromFirstArgument, - 'ZREMRANGEBYLEX' => $getKeyFromFirstArgument, - 'ZREVRANGEBYLEX' => $getKeyFromFirstArgument, - - /* commands operating on hashes */ - 'HDEL' => $getKeyFromFirstArgument, - 'HEXISTS' => $getKeyFromFirstArgument, - 'HGET' => $getKeyFromFirstArgument, - 'HGETALL' => $getKeyFromFirstArgument, - 'HMGET' => $getKeyFromFirstArgument, - 'HMSET' => $getKeyFromFirstArgument, - 'HINCRBY' => $getKeyFromFirstArgument, - 'HINCRBYFLOAT' => $getKeyFromFirstArgument, - 'HKEYS' => $getKeyFromFirstArgument, - 'HLEN' => $getKeyFromFirstArgument, - 'HSET' => $getKeyFromFirstArgument, - 'HSETNX' => $getKeyFromFirstArgument, - 'HVALS' => $getKeyFromFirstArgument, - 'HSCAN' => $getKeyFromFirstArgument, - 'HSTRLEN' => $getKeyFromFirstArgument, - - /* commands operating on HyperLogLog */ - 'PFADD' => $getKeyFromFirstArgument, - 'PFCOUNT' => $getKeyFromAllArguments, - 'PFMERGE' => $getKeyFromAllArguments, - - /* scripting */ - 'EVAL' => array($this, 'getKeyFromScriptingCommands'), - 'EVALSHA' => array($this, 'getKeyFromScriptingCommands'), - ); - } - - /** - * Returns the list of IDs for the supported commands. - * - * @return array - */ - public function getSupportedCommands() - { - return array_keys($this->commands); - } - - /** - * Sets an handler for the specified command ID. - * - * The signature of the callback must have a single parameter of type - * Predis\Command\CommandInterface. - * - * When the callback argument is omitted or NULL, the previously associated - * handler for the specified command ID is removed. - * - * @param string $commandID Command ID. - * @param mixed $callback A valid callable object, or NULL to unset the handler. - * - * @throws \InvalidArgumentException - */ - public function setCommandHandler($commandID, $callback = null) - { - $commandID = strtoupper($commandID); - - if (!isset($callback)) { - unset($this->commands[$commandID]); - - return; - } - - if (!is_callable($callback)) { - throw new \InvalidArgumentException( - 'The argument must be a callable object or NULL.' - ); - } - - $this->commands[$commandID] = $callback; - } - - /** - * Extracts the key from the first argument of a command instance. - * - * @param CommandInterface $command Command instance. - * - * @return string - */ - protected function getKeyFromFirstArgument(CommandInterface $command) - { - return $command->getArgument(0); - } - - /** - * Extracts the key from a command with multiple keys only when all keys in - * the arguments array produce the same hash. - * - * @param CommandInterface $command Command instance. - * - * @return string|null - */ - protected function getKeyFromAllArguments(CommandInterface $command) - { - $arguments = $command->getArguments(); - - if ($this->checkSameSlotForKeys($arguments)) { - return $arguments[0]; - } - } - - /** - * Extracts the key from a command with multiple keys only when all keys in - * the arguments array produce the same hash. - * - * @param CommandInterface $command Command instance. - * - * @return string|null - */ - protected function getKeyFromInterleavedArguments(CommandInterface $command) - { - $arguments = $command->getArguments(); - $keys = array(); - - for ($i = 0; $i < count($arguments); $i += 2) { - $keys[] = $arguments[$i]; - } - - if ($this->checkSameSlotForKeys($keys)) { - return $arguments[0]; - } - } - - /** - * Extracts the key from BLPOP and BRPOP commands. - * - * @param CommandInterface $command Command instance. - * - * @return string|null - */ - protected function getKeyFromBlockingListCommands(CommandInterface $command) - { - $arguments = $command->getArguments(); - - if ($this->checkSameSlotForKeys(array_slice($arguments, 0, count($arguments) - 1))) { - return $arguments[0]; - } - } - - /** - * Extracts the key from BITOP command. - * - * @param CommandInterface $command Command instance. - * - * @return string|null - */ - protected function getKeyFromBitOp(CommandInterface $command) - { - $arguments = $command->getArguments(); - - if ($this->checkSameSlotForKeys(array_slice($arguments, 1, count($arguments)))) { - return $arguments[1]; - } - } - - /** - * Extracts the key from ZINTERSTORE and ZUNIONSTORE commands. - * - * @param CommandInterface $command Command instance. - * - * @return string|null - */ - protected function getKeyFromZsetAggregationCommands(CommandInterface $command) - { - $arguments = $command->getArguments(); - $keys = array_merge(array($arguments[0]), array_slice($arguments, 2, $arguments[1])); - - if ($this->checkSameSlotForKeys($keys)) { - return $arguments[0]; - } - } - - /** - * Extracts the key from EVAL and EVALSHA commands. - * - * @param CommandInterface $command Command instance. - * - * @return string|null - */ - protected function getKeyFromScriptingCommands(CommandInterface $command) - { - if ($command instanceof ScriptCommand) { - $keys = $command->getKeys(); - } else { - $keys = array_slice($args = $command->getArguments(), 2, $args[1]); - } - - if ($keys && $this->checkSameSlotForKeys($keys)) { - return $keys[0]; - } - } - - /** - * {@inheritdoc} - */ - public function getSlot(CommandInterface $command) - { - $slot = $command->getSlot(); - - if (!isset($slot) && isset($this->commands[$cmdID = $command->getId()])) { - $key = call_user_func($this->commands[$cmdID], $command); - - if (isset($key)) { - $slot = $this->getSlotByKey($key); - $command->setSlot($slot); - } - } - - return $slot; - } - - /** - * Checks if the specified array of keys will generate the same hash. - * - * @param array $keys Array of keys. - * - * @return bool - */ - protected function checkSameSlotForKeys(array $keys) - { - if (!$count = count($keys)) { - return false; - } - - $currentSlot = $this->getSlotByKey($keys[0]); - - for ($i = 1; $i < $count; ++$i) { - $nextSlot = $this->getSlotByKey($keys[$i]); - - if ($currentSlot !== $nextSlot) { - return false; - } - - $currentSlot = $nextSlot; - } - - return true; - } - - /** - * Returns only the hashable part of a key (delimited by "{...}"), or the - * whole key if a key tag is not found in the string. - * - * @param string $key A key. - * - * @return string - */ - protected function extractKeyTag($key) - { - if (false !== $start = strpos($key, '{')) { - if (false !== ($end = strpos($key, '}', $start)) && $end !== ++$start) { - $key = substr($key, $start, $end - $start); - } - } - - return $key; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/DistributorInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/DistributorInterface.php deleted file mode 100755 index 831f52c5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/DistributorInterface.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Cluster\Distributor; - -use Predis\Cluster\Hash\HashGeneratorInterface; - -/** - * A distributor implements the logic to automatically distribute keys among - * several nodes for client-side sharding. - * - * @author Daniele Alessandri - */ -interface DistributorInterface -{ - /** - * Adds a node to the distributor with an optional weight. - * - * @param mixed $node Node object. - * @param int $weight Weight for the node. - */ - public function add($node, $weight = null); - - /** - * Removes a node from the distributor. - * - * @param mixed $node Node object. - */ - public function remove($node); - - /** - * Returns the corresponding slot of a node from the distributor using the - * computed hash of a key. - * - * @param mixed $hash - * - * @return mixed - */ - public function getSlot($hash); - - /** - * Returns a node from the distributor using its assigned slot ID. - * - * @param mixed $slot - * - * @return mixed|null - */ - public function getBySlot($slot); - - /** - * Returns a node from the distributor using the computed hash of a key. - * - * @param mixed $hash - * - * @return mixed - */ - public function getByHash($hash); - - /** - * Returns a node from the distributor mapping to the specified value. - * - * @param string $value - * - * @return mixed - */ - public function get($value); - - /** - * Returns the underlying hash generator instance. - * - * @return HashGeneratorInterface - */ - public function getHashGenerator(); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/EmptyRingException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/EmptyRingException.php deleted file mode 100755 index 039f2f2e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/EmptyRingException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Cluster\Distributor; - -/** - * Exception class that identifies empty rings. - * - * @author Daniele Alessandri - */ -class EmptyRingException extends \Exception -{ -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/HashRing.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/HashRing.php deleted file mode 100755 index db864d91..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/HashRing.php +++ /dev/null @@ -1,270 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Cluster\Distributor; - -use Predis\Cluster\Hash\HashGeneratorInterface; - -/** - * This class implements an hashring-based distributor that uses the same - * algorithm of memcache to distribute keys in a cluster using client-side - * sharding. - * - * @author Daniele Alessandri - * @author Lorenzo Castelli - */ -class HashRing implements DistributorInterface, HashGeneratorInterface -{ - const DEFAULT_REPLICAS = 128; - const DEFAULT_WEIGHT = 100; - - private $ring; - private $ringKeys; - private $ringKeysCount; - private $replicas; - private $nodeHashCallback; - private $nodes = array(); - - /** - * @param int $replicas Number of replicas in the ring. - * @param mixed $nodeHashCallback Callback returning a string used to calculate the hash of nodes. - */ - public function __construct($replicas = self::DEFAULT_REPLICAS, $nodeHashCallback = null) - { - $this->replicas = $replicas; - $this->nodeHashCallback = $nodeHashCallback; - } - - /** - * Adds a node to the ring with an optional weight. - * - * @param mixed $node Node object. - * @param int $weight Weight for the node. - */ - public function add($node, $weight = null) - { - // In case of collisions in the hashes of the nodes, the node added - // last wins, thus the order in which nodes are added is significant. - $this->nodes[] = array( - 'object' => $node, - 'weight' => (int) $weight ?: $this::DEFAULT_WEIGHT, - ); - - $this->reset(); - } - - /** - * {@inheritdoc} - */ - public function remove($node) - { - // A node is removed by resetting the ring so that it's recreated from - // scratch, in order to reassign possible hashes with collisions to the - // right node according to the order in which they were added in the - // first place. - for ($i = 0; $i < count($this->nodes); ++$i) { - if ($this->nodes[$i]['object'] === $node) { - array_splice($this->nodes, $i, 1); - $this->reset(); - - break; - } - } - } - - /** - * Resets the distributor. - */ - private function reset() - { - unset( - $this->ring, - $this->ringKeys, - $this->ringKeysCount - ); - } - - /** - * Returns the initialization status of the distributor. - * - * @return bool - */ - private function isInitialized() - { - return isset($this->ringKeys); - } - - /** - * Calculates the total weight of all the nodes in the distributor. - * - * @return int - */ - private function computeTotalWeight() - { - $totalWeight = 0; - - foreach ($this->nodes as $node) { - $totalWeight += $node['weight']; - } - - return $totalWeight; - } - - /** - * Initializes the distributor. - */ - private function initialize() - { - if ($this->isInitialized()) { - return; - } - - if (!$this->nodes) { - throw new EmptyRingException('Cannot initialize an empty hashring.'); - } - - $this->ring = array(); - $totalWeight = $this->computeTotalWeight(); - $nodesCount = count($this->nodes); - - foreach ($this->nodes as $node) { - $weightRatio = $node['weight'] / $totalWeight; - $this->addNodeToRing($this->ring, $node, $nodesCount, $this->replicas, $weightRatio); - } - - ksort($this->ring, SORT_NUMERIC); - $this->ringKeys = array_keys($this->ring); - $this->ringKeysCount = count($this->ringKeys); - } - - /** - * Implements the logic needed to add a node to the hashring. - * - * @param array $ring Source hashring. - * @param mixed $node Node object to be added. - * @param int $totalNodes Total number of nodes. - * @param int $replicas Number of replicas in the ring. - * @param float $weightRatio Weight ratio for the node. - */ - protected function addNodeToRing(&$ring, $node, $totalNodes, $replicas, $weightRatio) - { - $nodeObject = $node['object']; - $nodeHash = $this->getNodeHash($nodeObject); - $replicas = (int) round($weightRatio * $totalNodes * $replicas); - - for ($i = 0; $i < $replicas; ++$i) { - $key = crc32("$nodeHash:$i"); - $ring[$key] = $nodeObject; - } - } - - /** - * {@inheritdoc} - */ - protected function getNodeHash($nodeObject) - { - if (!isset($this->nodeHashCallback)) { - return (string) $nodeObject; - } - - return call_user_func($this->nodeHashCallback, $nodeObject); - } - - /** - * {@inheritdoc} - */ - public function hash($value) - { - return crc32($value); - } - - /** - * {@inheritdoc} - */ - public function getByHash($hash) - { - return $this->ring[$this->getSlot($hash)]; - } - - /** - * {@inheritdoc} - */ - public function getBySlot($slot) - { - $this->initialize(); - - if (isset($this->ring[$slot])) { - return $this->ring[$slot]; - } - } - - /** - * {@inheritdoc} - */ - public function getSlot($hash) - { - $this->initialize(); - - $ringKeys = $this->ringKeys; - $upper = $this->ringKeysCount - 1; - $lower = 0; - - while ($lower <= $upper) { - $index = ($lower + $upper) >> 1; - $item = $ringKeys[$index]; - - if ($item > $hash) { - $upper = $index - 1; - } elseif ($item < $hash) { - $lower = $index + 1; - } else { - return $item; - } - } - - return $ringKeys[$this->wrapAroundStrategy($upper, $lower, $this->ringKeysCount)]; - } - - /** - * {@inheritdoc} - */ - public function get($value) - { - $hash = $this->hash($value); - $node = $this->getByHash($hash); - - return $node; - } - - /** - * Implements a strategy to deal with wrap-around errors during binary searches. - * - * @param int $upper - * @param int $lower - * @param int $ringKeysCount - * - * @return int - */ - protected function wrapAroundStrategy($upper, $lower, $ringKeysCount) - { - // Binary search for the last item in ringkeys with a value less or - // equal to the key. If no such item exists, return the last item. - return $upper >= 0 ? $upper : $ringKeysCount - 1; - } - - /** - * {@inheritdoc} - */ - public function getHashGenerator() - { - return $this; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/KetamaRing.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/KetamaRing.php deleted file mode 100755 index dc77f320..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Distributor/KetamaRing.php +++ /dev/null @@ -1,71 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Cluster\Distributor; - -/** - * This class implements an hashring-based distributor that uses the same - * algorithm of libketama to distribute keys in a cluster using client-side - * sharding. - * - * @author Daniele Alessandri - * @author Lorenzo Castelli - */ -class KetamaRing extends HashRing -{ - const DEFAULT_REPLICAS = 160; - - /** - * @param mixed $nodeHashCallback Callback returning a string used to calculate the hash of nodes. - */ - public function __construct($nodeHashCallback = null) - { - parent::__construct($this::DEFAULT_REPLICAS, $nodeHashCallback); - } - - /** - * {@inheritdoc} - */ - protected function addNodeToRing(&$ring, $node, $totalNodes, $replicas, $weightRatio) - { - $nodeObject = $node['object']; - $nodeHash = $this->getNodeHash($nodeObject); - $replicas = (int) floor($weightRatio * $totalNodes * ($replicas / 4)); - - for ($i = 0; $i < $replicas; ++$i) { - $unpackedDigest = unpack('V4', md5("$nodeHash-$i", true)); - - foreach ($unpackedDigest as $key) { - $ring[$key] = $nodeObject; - } - } - } - - /** - * {@inheritdoc} - */ - public function hash($value) - { - $hash = unpack('V', md5($value, true)); - - return $hash[1]; - } - - /** - * {@inheritdoc} - */ - protected function wrapAroundStrategy($upper, $lower, $ringKeysCount) - { - // Binary search for the first item in ringkeys with a value greater - // or equal to the key. If no such item exists, return the first item. - return $lower < $ringKeysCount ? $lower : 0; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Hash/CRC16.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Hash/CRC16.php deleted file mode 100755 index 3add0cef..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Hash/CRC16.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Cluster\Hash; - -/** - * Hash generator implementing the CRC-CCITT-16 algorithm used by redis-cluster. - * - * @author Daniele Alessandri - */ -class CRC16 implements HashGeneratorInterface -{ - private static $CCITT_16 = array( - 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, - 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, - 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, - 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, - 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, - 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, - 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, - 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, - 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, - 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, - 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, - 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, - 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, - 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, - 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, - 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, - 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, - 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, - 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, - 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, - 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, - 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, - 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, - 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, - 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, - 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, - 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, - 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, - 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, - 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, - 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, - 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0, - ); - - /** - * {@inheritdoc} - */ - public function hash($value) - { - // CRC-CCITT-16 algorithm - $crc = 0; - $CCITT_16 = self::$CCITT_16; - $strlen = strlen($value); - - for ($i = 0; $i < $strlen; ++$i) { - $crc = (($crc << 8) ^ $CCITT_16[($crc >> 8) ^ ord($value[$i])]) & 0xFFFF; - } - - return $crc; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Hash/HashGeneratorInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Hash/HashGeneratorInterface.php deleted file mode 100755 index 271b9e72..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/Hash/HashGeneratorInterface.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Cluster\Hash; - -/** - * An hash generator implements the logic used to calculate the hash of a key to - * distribute operations among Redis nodes. - * - * @author Daniele Alessandri - */ -interface HashGeneratorInterface -{ - /** - * Generates an hash from a string to be used for distribution. - * - * @param string $value String value. - * - * @return int - */ - public function hash($value); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/PredisStrategy.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/PredisStrategy.php deleted file mode 100755 index 20668427..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/PredisStrategy.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Cluster; - -use Predis\Cluster\Distributor\DistributorInterface; -use Predis\Cluster\Distributor\HashRing; - -/** - * Default cluster strategy used by Predis to handle client-side sharding. - * - * @author Daniele Alessandri - */ -class PredisStrategy extends ClusterStrategy -{ - protected $distributor; - - /** - * @param DistributorInterface $distributor Optional distributor instance. - */ - public function __construct(DistributorInterface $distributor = null) - { - parent::__construct(); - - $this->distributor = $distributor ?: new HashRing(); - } - - /** - * {@inheritdoc} - */ - public function getSlotByKey($key) - { - $key = $this->extractKeyTag($key); - $hash = $this->distributor->hash($key); - $slot = $this->distributor->getSlot($hash); - - return $slot; - } - - /** - * {@inheritdoc} - */ - protected function checkSameSlotForKeys(array $keys) - { - if (!$count = count($keys)) { - return false; - } - - $currentKey = $this->extractKeyTag($keys[0]); - - for ($i = 1; $i < $count; ++$i) { - $nextKey = $this->extractKeyTag($keys[$i]); - - if ($currentKey !== $nextKey) { - return false; - } - - $currentKey = $nextKey; - } - - return true; - } - - /** - * {@inheritdoc} - */ - public function getDistributor() - { - return $this->distributor; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/RedisStrategy.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/RedisStrategy.php deleted file mode 100755 index df0bdb49..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/RedisStrategy.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Cluster; - -use Predis\Cluster\Hash\CRC16; -use Predis\Cluster\Hash\HashGeneratorInterface; -use Predis\NotSupportedException; - -/** - * Default class used by Predis to calculate hashes out of keys of - * commands supported by redis-cluster. - * - * @author Daniele Alessandri - */ -class RedisStrategy extends ClusterStrategy -{ - protected $hashGenerator; - - /** - * @param HashGeneratorInterface $hashGenerator Hash generator instance. - */ - public function __construct(HashGeneratorInterface $hashGenerator = null) - { - parent::__construct(); - - $this->hashGenerator = $hashGenerator ?: new CRC16(); - } - - /** - * {@inheritdoc} - */ - public function getSlotByKey($key) - { - $key = $this->extractKeyTag($key); - $slot = $this->hashGenerator->hash($key) & 0x3FFF; - - return $slot; - } - - /** - * {@inheritdoc} - */ - public function getDistributor() - { - throw new NotSupportedException( - 'This cluster strategy does not provide an external distributor' - ); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/StrategyInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/StrategyInterface.php deleted file mode 100755 index cdf7d09f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Cluster/StrategyInterface.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Cluster; - -use Predis\Cluster\Distributor\DistributorInterface; -use Predis\Command\CommandInterface; - -/** - * Interface for classes defining the strategy used to calculate an hash out of - * keys extracted from supported commands. - * - * This is mostly useful to support clustering via client-side sharding. - * - * @author Daniele Alessandri - */ -interface StrategyInterface -{ - /** - * Returns a slot for the given command used for clustering distribution or - * NULL when this is not possible. - * - * @param CommandInterface $command Command instance. - * - * @return int - */ - public function getSlot(CommandInterface $command); - - /** - * Returns a slot for the given key used for clustering distribution or NULL - * when this is not possible. - * - * @param string $key Key string. - * - * @return int - */ - public function getSlotByKey($key); - - /** - * Returns a distributor instance to be used by the cluster. - * - * @return DistributorInterface - */ - public function getDistributor(); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/CursorBasedIterator.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/CursorBasedIterator.php deleted file mode 100755 index 922883f0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/CursorBasedIterator.php +++ /dev/null @@ -1,191 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Collection\Iterator; - -use Predis\ClientInterface; -use Predis\NotSupportedException; - -/** - * Provides the base implementation for a fully-rewindable PHP iterator that can - * incrementally iterate over cursor-based collections stored on Redis using the - * commands in the `SCAN` family. - * - * Given their incremental nature with multiple fetches, these kind of iterators - * offer limited guarantees about the returned elements because the collection - * can change several times during the iteration process. - * - * @see http://redis.io/commands/scan - * - * @author Daniele Alessandri - */ -abstract class CursorBasedIterator implements \Iterator -{ - protected $client; - protected $match; - protected $count; - - protected $valid; - protected $fetchmore; - protected $elements; - protected $cursor; - protected $position; - protected $current; - - /** - * @param ClientInterface $client Client connected to Redis. - * @param string $match Pattern to match during the server-side iteration. - * @param int $count Hint used by Redis to compute the number of results per iteration. - */ - public function __construct(ClientInterface $client, $match = null, $count = null) - { - $this->client = $client; - $this->match = $match; - $this->count = $count; - - $this->reset(); - } - - /** - * Ensures that the client supports the specified Redis command required to - * fetch elements from the server to perform the iteration. - * - * @param ClientInterface $client Client connected to Redis. - * @param string $commandID Command ID. - * - * @throws NotSupportedException - */ - protected function requiredCommand(ClientInterface $client, $commandID) - { - if (!$client->getProfile()->supportsCommand($commandID)) { - throw new NotSupportedException("The current profile does not support '$commandID'."); - } - } - - /** - * Resets the inner state of the iterator. - */ - protected function reset() - { - $this->valid = true; - $this->fetchmore = true; - $this->elements = array(); - $this->cursor = 0; - $this->position = -1; - $this->current = null; - } - - /** - * Returns an array of options for the `SCAN` command. - * - * @return array - */ - protected function getScanOptions() - { - $options = array(); - - if (strlen($this->match) > 0) { - $options['MATCH'] = $this->match; - } - - if ($this->count > 0) { - $options['COUNT'] = $this->count; - } - - return $options; - } - - /** - * Fetches a new set of elements from the remote collection, effectively - * advancing the iteration process. - * - * @return array - */ - abstract protected function executeCommand(); - - /** - * Populates the local buffer of elements fetched from the server during - * the iteration. - */ - protected function fetch() - { - list($cursor, $elements) = $this->executeCommand(); - - if (!$cursor) { - $this->fetchmore = false; - } - - $this->cursor = $cursor; - $this->elements = $elements; - } - - /** - * Extracts next values for key() and current(). - */ - protected function extractNext() - { - ++$this->position; - $this->current = array_shift($this->elements); - } - - /** - * {@inheritdoc} - */ - public function rewind() - { - $this->reset(); - $this->next(); - } - - /** - * {@inheritdoc} - */ - public function current() - { - return $this->current; - } - - /** - * {@inheritdoc} - */ - public function key() - { - return $this->position; - } - - /** - * {@inheritdoc} - */ - public function next() - { - tryFetch: { - if (!$this->elements && $this->fetchmore) { - $this->fetch(); - } - - if ($this->elements) { - $this->extractNext(); - } elseif ($this->cursor) { - goto tryFetch; - } else { - $this->valid = false; - } - } - } - - /** - * {@inheritdoc} - */ - public function valid() - { - return $this->valid; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/HashKey.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/HashKey.php deleted file mode 100755 index aa8aeaf0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/HashKey.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Collection\Iterator; - -use Predis\ClientInterface; - -/** - * Abstracts the iteration of fields and values of an hash by leveraging the - * HSCAN command (Redis >= 2.8) wrapped in a fully-rewindable PHP iterator. - * - * @author Daniele Alessandri - * - * @link http://redis.io/commands/scan - */ -class HashKey extends CursorBasedIterator -{ - protected $key; - - /** - * {@inheritdoc} - */ - public function __construct(ClientInterface $client, $key, $match = null, $count = null) - { - $this->requiredCommand($client, 'HSCAN'); - - parent::__construct($client, $match, $count); - - $this->key = $key; - } - - /** - * {@inheritdoc} - */ - protected function executeCommand() - { - return $this->client->hscan($this->key, $this->cursor, $this->getScanOptions()); - } - - /** - * {@inheritdoc} - */ - protected function extractNext() - { - $this->position = key($this->elements); - $this->current = array_shift($this->elements); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/Keyspace.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/Keyspace.php deleted file mode 100755 index 5d985b9b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/Keyspace.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Collection\Iterator; - -use Predis\ClientInterface; - -/** - * Abstracts the iteration of the keyspace on a Redis instance by leveraging the - * SCAN command (Redis >= 2.8) wrapped in a fully-rewindable PHP iterator. - * - * @author Daniele Alessandri - * - * @link http://redis.io/commands/scan - */ -class Keyspace extends CursorBasedIterator -{ - /** - * {@inheritdoc} - */ - public function __construct(ClientInterface $client, $match = null, $count = null) - { - $this->requiredCommand($client, 'SCAN'); - - parent::__construct($client, $match, $count); - } - - /** - * {@inheritdoc} - */ - protected function executeCommand() - { - return $this->client->scan($this->cursor, $this->getScanOptions()); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/ListKey.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/ListKey.php deleted file mode 100755 index 7a6eb479..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/ListKey.php +++ /dev/null @@ -1,176 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Collection\Iterator; - -use Predis\ClientInterface; -use Predis\NotSupportedException; - -/** - * Abstracts the iteration of items stored in a list by leveraging the LRANGE - * command wrapped in a fully-rewindable PHP iterator. - * - * This iterator tries to emulate the behaviour of cursor-based iterators based - * on the SCAN-family of commands introduced in Redis <= 2.8, meaning that due - * to its incremental nature with multiple fetches it can only offer limited - * guarantees on the returned elements because the collection can change several - * times (trimmed, deleted, overwritten) during the iteration process. - * - * @author Daniele Alessandri - * - * @link http://redis.io/commands/lrange - */ -class ListKey implements \Iterator -{ - protected $client; - protected $count; - protected $key; - - protected $valid; - protected $fetchmore; - protected $elements; - protected $position; - protected $current; - - /** - * @param ClientInterface $client Client connected to Redis. - * @param string $key Redis list key. - * @param int $count Number of items retrieved on each fetch operation. - * - * @throws \InvalidArgumentException - */ - public function __construct(ClientInterface $client, $key, $count = 10) - { - $this->requiredCommand($client, 'LRANGE'); - - if ((false === $count = filter_var($count, FILTER_VALIDATE_INT)) || $count < 0) { - throw new \InvalidArgumentException('The $count argument must be a positive integer.'); - } - - $this->client = $client; - $this->key = $key; - $this->count = $count; - - $this->reset(); - } - - /** - * Ensures that the client instance supports the specified Redis command - * required to fetch elements from the server to perform the iteration. - * - * @param ClientInterface $client Client connected to Redis. - * @param string $commandID Command ID. - * - * @throws NotSupportedException - */ - protected function requiredCommand(ClientInterface $client, $commandID) - { - if (!$client->getProfile()->supportsCommand($commandID)) { - throw new NotSupportedException("The current profile does not support '$commandID'."); - } - } - - /** - * Resets the inner state of the iterator. - */ - protected function reset() - { - $this->valid = true; - $this->fetchmore = true; - $this->elements = array(); - $this->position = -1; - $this->current = null; - } - - /** - * Fetches a new set of elements from the remote collection, effectively - * advancing the iteration process. - * - * @return array - */ - protected function executeCommand() - { - return $this->client->lrange($this->key, $this->position + 1, $this->position + $this->count); - } - - /** - * Populates the local buffer of elements fetched from the server during the - * iteration. - */ - protected function fetch() - { - $elements = $this->executeCommand(); - - if (count($elements) < $this->count) { - $this->fetchmore = false; - } - - $this->elements = $elements; - } - - /** - * Extracts next values for key() and current(). - */ - protected function extractNext() - { - ++$this->position; - $this->current = array_shift($this->elements); - } - - /** - * {@inheritdoc} - */ - public function rewind() - { - $this->reset(); - $this->next(); - } - - /** - * {@inheritdoc} - */ - public function current() - { - return $this->current; - } - - /** - * {@inheritdoc} - */ - public function key() - { - return $this->position; - } - - /** - * {@inheritdoc} - */ - public function next() - { - if (!$this->elements && $this->fetchmore) { - $this->fetch(); - } - - if ($this->elements) { - $this->extractNext(); - } else { - $this->valid = false; - } - } - - /** - * {@inheritdoc} - */ - public function valid() - { - return $this->valid; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/SetKey.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/SetKey.php deleted file mode 100755 index bf254397..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/SetKey.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Collection\Iterator; - -use Predis\ClientInterface; - -/** - * Abstracts the iteration of members stored in a set by leveraging the SSCAN - * command (Redis >= 2.8) wrapped in a fully-rewindable PHP iterator. - * - * @author Daniele Alessandri - * - * @link http://redis.io/commands/scan - */ -class SetKey extends CursorBasedIterator -{ - protected $key; - - /** - * {@inheritdoc} - */ - public function __construct(ClientInterface $client, $key, $match = null, $count = null) - { - $this->requiredCommand($client, 'SSCAN'); - - parent::__construct($client, $match, $count); - - $this->key = $key; - } - - /** - * {@inheritdoc} - */ - protected function executeCommand() - { - return $this->client->sscan($this->key, $this->cursor, $this->getScanOptions()); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/SortedSetKey.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/SortedSetKey.php deleted file mode 100755 index e2f17892..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Collection/Iterator/SortedSetKey.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Collection\Iterator; - -use Predis\ClientInterface; - -/** - * Abstracts the iteration of members stored in a sorted set by leveraging the - * ZSCAN command (Redis >= 2.8) wrapped in a fully-rewindable PHP iterator. - * - * @author Daniele Alessandri - * - * @link http://redis.io/commands/scan - */ -class SortedSetKey extends CursorBasedIterator -{ - protected $key; - - /** - * {@inheritdoc} - */ - public function __construct(ClientInterface $client, $key, $match = null, $count = null) - { - $this->requiredCommand($client, 'ZSCAN'); - - parent::__construct($client, $match, $count); - - $this->key = $key; - } - - /** - * {@inheritdoc} - */ - protected function executeCommand() - { - return $this->client->zscan($this->key, $this->cursor, $this->getScanOptions()); - } - - /** - * {@inheritdoc} - */ - protected function extractNext() - { - if ($kv = each($this->elements)) { - $this->position = $kv[0]; - $this->current = $kv[1]; - - unset($this->elements[$this->position]); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Command.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Command.php deleted file mode 100755 index bb538e7c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Command.php +++ /dev/null @@ -1,129 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * Base class for Redis commands. - * - * @author Daniele Alessandri - */ -abstract class Command implements CommandInterface -{ - private $slot; - private $arguments = array(); - - /** - * Returns a filtered array of the arguments. - * - * @param array $arguments List of arguments. - * - * @return array - */ - protected function filterArguments(array $arguments) - { - return $arguments; - } - - /** - * {@inheritdoc} - */ - public function setArguments(array $arguments) - { - $this->arguments = $this->filterArguments($arguments); - unset($this->slot); - } - - /** - * {@inheritdoc} - */ - public function setRawArguments(array $arguments) - { - $this->arguments = $arguments; - unset($this->slot); - } - - /** - * {@inheritdoc} - */ - public function getArguments() - { - return $this->arguments; - } - - /** - * {@inheritdoc} - */ - public function getArgument($index) - { - if (isset($this->arguments[$index])) { - return $this->arguments[$index]; - } - } - - /** - * {@inheritdoc} - */ - public function setSlot($slot) - { - $this->slot = $slot; - } - - /** - * {@inheritdoc} - */ - public function getSlot() - { - if (isset($this->slot)) { - return $this->slot; - } - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - return $data; - } - - /** - * Normalizes the arguments array passed to a Redis command. - * - * @param array $arguments Arguments for a command. - * - * @return array - */ - public static function normalizeArguments(array $arguments) - { - if (count($arguments) === 1 && is_array($arguments[0])) { - return $arguments[0]; - } - - return $arguments; - } - - /** - * Normalizes the arguments array passed to a variadic Redis command. - * - * @param array $arguments Arguments for a command. - * - * @return array - */ - public static function normalizeVariadic(array $arguments) - { - if (count($arguments) === 2 && is_array($arguments[1])) { - return array_merge(array($arguments[0]), $arguments[1]); - } - - return $arguments; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/CommandInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/CommandInterface.php deleted file mode 100755 index 9f349e1d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/CommandInterface.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * Defines an abstraction representing a Redis command. - * - * @author Daniele Alessandri - */ -interface CommandInterface -{ - /** - * Returns the ID of the Redis command. By convention, command identifiers - * must always be uppercase. - * - * @return string - */ - public function getId(); - - /** - * Assign the specified slot to the command for clustering distribution. - * - * @param int $slot Slot ID. - */ - public function setSlot($slot); - - /** - * Returns the assigned slot of the command for clustering distribution. - * - * @return int|null - */ - public function getSlot(); - - /** - * Sets the arguments for the command. - * - * @param array $arguments List of arguments. - */ - public function setArguments(array $arguments); - - /** - * Sets the raw arguments for the command without processing them. - * - * @param array $arguments List of arguments. - */ - public function setRawArguments(array $arguments); - - /** - * Gets the arguments of the command. - * - * @return array - */ - public function getArguments(); - - /** - * Gets the argument of the command at the specified index. - * - * @param int $index Index of the desired argument. - * - * @return mixed|null - */ - public function getArgument($index); - - /** - * Parses a raw response and returns a PHP object. - * - * @param string $data Binary string containing the whole response. - * - * @return mixed - */ - public function parseResponse($data); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionAuth.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionAuth.php deleted file mode 100755 index c8c9dedc..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionAuth.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/auth - * - * @author Daniele Alessandri - */ -class ConnectionAuth extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'AUTH'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionEcho.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionEcho.php deleted file mode 100755 index fd496097..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionEcho.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/echo - * - * @author Daniele Alessandri - */ -class ConnectionEcho extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ECHO'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionPing.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionPing.php deleted file mode 100755 index fa9d7346..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionPing.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/ping - * - * @author Daniele Alessandri - */ -class ConnectionPing extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'PING'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionQuit.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionQuit.php deleted file mode 100755 index e59e31e3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionQuit.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/quit - * - * @author Daniele Alessandri - */ -class ConnectionQuit extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'QUIT'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionSelect.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionSelect.php deleted file mode 100755 index 1da82567..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ConnectionSelect.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/select - * - * @author Daniele Alessandri - */ -class ConnectionSelect extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SELECT'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashDelete.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashDelete.php deleted file mode 100755 index d5d4c38c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashDelete.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/hdel - * - * @author Daniele Alessandri - */ -class HashDelete extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'HDEL'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - return self::normalizeVariadic($arguments); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashExists.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashExists.php deleted file mode 100755 index a2c69b90..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashExists.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/hexists - * - * @author Daniele Alessandri - */ -class HashExists extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'HEXISTS'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - return (bool) $data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGet.php deleted file mode 100755 index 20f33da5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGet.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/hget - * - * @author Daniele Alessandri - */ -class HashGet extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'HGET'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGetAll.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGetAll.php deleted file mode 100755 index d6986752..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGetAll.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/hgetall - * - * @author Daniele Alessandri - */ -class HashGetAll extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'HGETALL'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - $result = array(); - - for ($i = 0; $i < count($data); ++$i) { - $result[$data[$i]] = $data[++$i]; - } - - return $result; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGetMultiple.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGetMultiple.php deleted file mode 100755 index 820ce958..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashGetMultiple.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/hmget - * - * @author Daniele Alessandri - */ -class HashGetMultiple extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'HMGET'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - return self::normalizeVariadic($arguments); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashIncrementBy.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashIncrementBy.php deleted file mode 100755 index a37359ff..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashIncrementBy.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/hincrby - * - * @author Daniele Alessandri - */ -class HashIncrementBy extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'HINCRBY'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashIncrementByFloat.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashIncrementByFloat.php deleted file mode 100755 index bce9714f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashIncrementByFloat.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/hincrbyfloat - * - * @author Daniele Alessandri - */ -class HashIncrementByFloat extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'HINCRBYFLOAT'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashKeys.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashKeys.php deleted file mode 100755 index 28266020..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashKeys.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/hkeys - * - * @author Daniele Alessandri - */ -class HashKeys extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'HKEYS'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashLength.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashLength.php deleted file mode 100755 index d70926f1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashLength.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/hlen - * - * @author Daniele Alessandri - */ -class HashLength extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'HLEN'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashScan.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashScan.php deleted file mode 100755 index afde74eb..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashScan.php +++ /dev/null @@ -1,85 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/hscan - * - * @author Daniele Alessandri - */ -class HashScan extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'HSCAN'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - if (count($arguments) === 3 && is_array($arguments[2])) { - $options = $this->prepareOptions(array_pop($arguments)); - $arguments = array_merge($arguments, $options); - } - - return $arguments; - } - - /** - * Returns a list of options and modifiers compatible with Redis. - * - * @param array $options List of options. - * - * @return array - */ - protected function prepareOptions($options) - { - $options = array_change_key_case($options, CASE_UPPER); - $normalized = array(); - - if (!empty($options['MATCH'])) { - $normalized[] = 'MATCH'; - $normalized[] = $options['MATCH']; - } - - if (!empty($options['COUNT'])) { - $normalized[] = 'COUNT'; - $normalized[] = $options['COUNT']; - } - - return $normalized; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - if (is_array($data)) { - $fields = $data[1]; - $result = array(); - - for ($i = 0; $i < count($fields); ++$i) { - $result[$fields[$i]] = $fields[++$i]; - } - - $data[1] = $result; - } - - return $data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSet.php deleted file mode 100755 index d3154a9b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSet.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/hset - * - * @author Daniele Alessandri - */ -class HashSet extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'HSET'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - return (bool) $data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSetMultiple.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSetMultiple.php deleted file mode 100755 index 6069e2ad..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSetMultiple.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/hmset - * - * @author Daniele Alessandri - */ -class HashSetMultiple extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'HMSET'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - if (count($arguments) === 2 && is_array($arguments[1])) { - $flattenedKVs = array($arguments[0]); - $args = $arguments[1]; - - foreach ($args as $k => $v) { - $flattenedKVs[] = $k; - $flattenedKVs[] = $v; - } - - return $flattenedKVs; - } - - return $arguments; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSetPreserve.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSetPreserve.php deleted file mode 100755 index 582100d4..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashSetPreserve.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/hsetnx - * - * @author Daniele Alessandri - */ -class HashSetPreserve extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'HSETNX'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - return (bool) $data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashStringLength.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashStringLength.php deleted file mode 100755 index 7cfda80d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashStringLength.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/hstrlen - * - * @author Daniele Alessandri - */ -class HashStringLength extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'HSTRLEN'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashValues.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashValues.php deleted file mode 100755 index 0a5ea5f6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HashValues.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/hvals - * - * @author Daniele Alessandri - */ -class HashValues extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'HVALS'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogAdd.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogAdd.php deleted file mode 100755 index 18d2bd7b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogAdd.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/pfadd - * - * @author Daniele Alessandri - */ -class HyperLogLogAdd extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'PFADD'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - return self::normalizeVariadic($arguments); - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - return (bool) $data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogCount.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogCount.php deleted file mode 100755 index 0afe5427..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogCount.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/pfcount - * - * @author Daniele Alessandri - */ -class HyperLogLogCount extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'PFCOUNT'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - return self::normalizeArguments($arguments); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogMerge.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogMerge.php deleted file mode 100755 index c160be5b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/HyperLogLogMerge.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/pfmerge - * - * @author Daniele Alessandri - */ -class HyperLogLogMerge extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'PFMERGE'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - return self::normalizeArguments($arguments); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyDelete.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyDelete.php deleted file mode 100755 index 89bdfdb7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyDelete.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/del - * - * @author Daniele Alessandri - */ -class KeyDelete extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'DEL'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - return self::normalizeArguments($arguments); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyDump.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyDump.php deleted file mode 100755 index 6d9c4880..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyDump.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/dump - * - * @author Daniele Alessandri - */ -class KeyDump extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'DUMP'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExists.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExists.php deleted file mode 100755 index 5196ca16..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExists.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/exists - * - * @author Daniele Alessandri - */ -class KeyExists extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'EXISTS'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - return (bool) $data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExpire.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExpire.php deleted file mode 100755 index fd7c9c80..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExpire.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/expire - * - * @author Daniele Alessandri - */ -class KeyExpire extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'EXPIRE'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - return (bool) $data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExpireAt.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExpireAt.php deleted file mode 100755 index e2fe7aeb..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyExpireAt.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/expireat - * - * @author Daniele Alessandri - */ -class KeyExpireAt extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'EXPIREAT'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - return (bool) $data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyKeys.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyKeys.php deleted file mode 100755 index 6d74c40d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyKeys.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/keys - * - * @author Daniele Alessandri - */ -class KeyKeys extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'KEYS'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyMigrate.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyMigrate.php deleted file mode 100755 index 3324ef94..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyMigrate.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/migrate - * - * @author Daniele Alessandri - */ -class KeyMigrate extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'MIGRATE'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - if (is_array(end($arguments))) { - foreach (array_pop($arguments) as $modifier => $value) { - $modifier = strtoupper($modifier); - - if ($modifier === 'COPY' && $value == true) { - $arguments[] = $modifier; - } - - if ($modifier === 'REPLACE' && $value == true) { - $arguments[] = $modifier; - } - } - } - - return $arguments; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyMove.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyMove.php deleted file mode 100755 index 8f1ab2a7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyMove.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/move - * - * @author Daniele Alessandri - */ -class KeyMove extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'MOVE'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - return (bool) $data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPersist.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPersist.php deleted file mode 100755 index e7729553..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPersist.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/persist - * - * @author Daniele Alessandri - */ -class KeyPersist extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'PERSIST'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - return (bool) $data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseExpire.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseExpire.php deleted file mode 100755 index 258ec476..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseExpire.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/pexpire - * - * @author Daniele Alessandri - */ -class KeyPreciseExpire extends KeyExpire -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'PEXPIRE'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseExpireAt.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseExpireAt.php deleted file mode 100755 index e4192187..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseExpireAt.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/pexpireat - * - * @author Daniele Alessandri - */ -class KeyPreciseExpireAt extends KeyExpireAt -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'PEXPIREAT'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseTimeToLive.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseTimeToLive.php deleted file mode 100755 index bdcd34b9..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyPreciseTimeToLive.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/pttl - * - * @author Daniele Alessandri - */ -class KeyPreciseTimeToLive extends KeyTimeToLive -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'PTTL'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRandom.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRandom.php deleted file mode 100755 index b208b2db..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRandom.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/randomkey - * - * @author Daniele Alessandri - */ -class KeyRandom extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'RANDOMKEY'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - return $data !== '' ? $data : null; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRename.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRename.php deleted file mode 100755 index 82e44fb2..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRename.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/rename - * - * @author Daniele Alessandri - */ -class KeyRename extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'RENAME'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRenamePreserve.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRenamePreserve.php deleted file mode 100755 index 773ece6d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRenamePreserve.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/renamenx - * - * @author Daniele Alessandri - */ -class KeyRenamePreserve extends KeyRename -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'RENAMENX'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - return (bool) $data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRestore.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRestore.php deleted file mode 100755 index a5b0b2db..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyRestore.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/restore - * - * @author Daniele Alessandri - */ -class KeyRestore extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'RESTORE'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyScan.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyScan.php deleted file mode 100755 index 05f5bb3a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyScan.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/scan - * - * @author Daniele Alessandri - */ -class KeyScan extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SCAN'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - if (count($arguments) === 2 && is_array($arguments[1])) { - $options = $this->prepareOptions(array_pop($arguments)); - $arguments = array_merge($arguments, $options); - } - - return $arguments; - } - - /** - * Returns a list of options and modifiers compatible with Redis. - * - * @param array $options List of options. - * - * @return array - */ - protected function prepareOptions($options) - { - $options = array_change_key_case($options, CASE_UPPER); - $normalized = array(); - - if (!empty($options['MATCH'])) { - $normalized[] = 'MATCH'; - $normalized[] = $options['MATCH']; - } - - if (!empty($options['COUNT'])) { - $normalized[] = 'COUNT'; - $normalized[] = $options['COUNT']; - } - - return $normalized; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeySort.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeySort.php deleted file mode 100755 index fd449f13..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeySort.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/sort - * - * @author Daniele Alessandri - */ -class KeySort extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SORT'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - if (count($arguments) === 1) { - return $arguments; - } - - $query = array($arguments[0]); - $sortParams = array_change_key_case($arguments[1], CASE_UPPER); - - if (isset($sortParams['BY'])) { - $query[] = 'BY'; - $query[] = $sortParams['BY']; - } - - if (isset($sortParams['GET'])) { - $getargs = $sortParams['GET']; - - if (is_array($getargs)) { - foreach ($getargs as $getarg) { - $query[] = 'GET'; - $query[] = $getarg; - } - } else { - $query[] = 'GET'; - $query[] = $getargs; - } - } - - if (isset($sortParams['LIMIT']) && - is_array($sortParams['LIMIT']) && - count($sortParams['LIMIT']) == 2) { - $query[] = 'LIMIT'; - $query[] = $sortParams['LIMIT'][0]; - $query[] = $sortParams['LIMIT'][1]; - } - - if (isset($sortParams['SORT'])) { - $query[] = strtoupper($sortParams['SORT']); - } - - if (isset($sortParams['ALPHA']) && $sortParams['ALPHA'] == true) { - $query[] = 'ALPHA'; - } - - if (isset($sortParams['STORE'])) { - $query[] = 'STORE'; - $query[] = $sortParams['STORE']; - } - - return $query; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyTimeToLive.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyTimeToLive.php deleted file mode 100755 index 67697a6f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyTimeToLive.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/ttl - * - * @author Daniele Alessandri - */ -class KeyTimeToLive extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'TTL'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyType.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyType.php deleted file mode 100755 index f4f06e45..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/KeyType.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/type - * - * @author Daniele Alessandri - */ -class KeyType extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'TYPE'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListIndex.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListIndex.php deleted file mode 100755 index 27c64be7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListIndex.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/lindex - * - * @author Daniele Alessandri - */ -class ListIndex extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'LINDEX'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListInsert.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListInsert.php deleted file mode 100755 index 7d53d11b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListInsert.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/linsert - * - * @author Daniele Alessandri - */ -class ListInsert extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'LINSERT'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListLength.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListLength.php deleted file mode 100755 index 6495beb7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListLength.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/llen - * - * @author Daniele Alessandri - */ -class ListLength extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'LLEN'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopFirst.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopFirst.php deleted file mode 100755 index 84d5d673..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopFirst.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/lpop - * - * @author Daniele Alessandri - */ -class ListPopFirst extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'LPOP'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopFirstBlocking.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopFirstBlocking.php deleted file mode 100755 index 7dc7c000..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopFirstBlocking.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/blpop - * - * @author Daniele Alessandri - */ -class ListPopFirstBlocking extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'BLPOP'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - if (count($arguments) === 2 && is_array($arguments[0])) { - list($arguments, $timeout) = $arguments; - array_push($arguments, $timeout); - } - - return $arguments; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLast.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLast.php deleted file mode 100755 index 9e92db5f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLast.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/rpop - * - * @author Daniele Alessandri - */ -class ListPopLast extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'RPOP'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastBlocking.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastBlocking.php deleted file mode 100755 index 781eb919..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastBlocking.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/brpop - * - * @author Daniele Alessandri - */ -class ListPopLastBlocking extends ListPopFirstBlocking -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'BRPOP'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastPushHead.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastPushHead.php deleted file mode 100755 index f430eb22..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastPushHead.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/rpoplpush - * - * @author Daniele Alessandri - */ -class ListPopLastPushHead extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'RPOPLPUSH'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastPushHeadBlocking.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastPushHeadBlocking.php deleted file mode 100755 index ee9c93c8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPopLastPushHeadBlocking.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/brpoplpush - * - * @author Daniele Alessandri - */ -class ListPopLastPushHeadBlocking extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'BRPOPLPUSH'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushHead.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushHead.php deleted file mode 100755 index 74bf7c49..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushHead.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/lpush - * - * @author Daniele Alessandri - */ -class ListPushHead extends ListPushTail -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'LPUSH'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushHeadX.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushHeadX.php deleted file mode 100755 index 8e136b88..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushHeadX.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/lpushx - * - * @author Daniele Alessandri - */ -class ListPushHeadX extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'LPUSHX'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushTail.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushTail.php deleted file mode 100755 index f2a057c0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushTail.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/rpush - * - * @author Daniele Alessandri - */ -class ListPushTail extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'RPUSH'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - return self::normalizeVariadic($arguments); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushTailX.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushTailX.php deleted file mode 100755 index 1af3645b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListPushTailX.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/rpushx - * - * @author Daniele Alessandri - */ -class ListPushTailX extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'RPUSHX'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListRange.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListRange.php deleted file mode 100755 index 32a21a6e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListRange.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/lrange - * - * @author Daniele Alessandri - */ -class ListRange extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'LRANGE'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListRemove.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListRemove.php deleted file mode 100755 index c5800899..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListRemove.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/lrem - * - * @author Daniele Alessandri - */ -class ListRemove extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'LREM'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListSet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListSet.php deleted file mode 100755 index 5e59864d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListSet.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/lset - * - * @author Daniele Alessandri - */ -class ListSet extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'LSET'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListTrim.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListTrim.php deleted file mode 100755 index 19314180..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ListTrim.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/ltrim - * - * @author Daniele Alessandri - */ -class ListTrim extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'LTRIM'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PrefixableCommandInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PrefixableCommandInterface.php deleted file mode 100755 index 6d54554f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PrefixableCommandInterface.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * Defines a command whose keys can be prefixed. - * - * @author Daniele Alessandri - */ -interface PrefixableCommandInterface extends CommandInterface -{ - /** - * Prefixes all the keys found in the arguments of the command. - * - * @param string $prefix String used to prefix the keys. - */ - public function prefixKeys($prefix); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/KeyPrefixProcessor.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/KeyPrefixProcessor.php deleted file mode 100755 index d966d0e1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/KeyPrefixProcessor.php +++ /dev/null @@ -1,415 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command\Processor; - -use Predis\Command\CommandInterface; -use Predis\Command\PrefixableCommandInterface; - -/** - * Command processor capable of prefixing keys stored in the arguments of Redis - * commands supported. - * - * @author Daniele Alessandri - */ -class KeyPrefixProcessor implements ProcessorInterface -{ - private $prefix; - private $commands; - - /** - * @param string $prefix Prefix for the keys. - */ - public function __construct($prefix) - { - $this->prefix = $prefix; - $this->commands = array( - /* ---------------- Redis 1.2 ---------------- */ - 'EXISTS' => 'static::first', - 'DEL' => 'static::all', - 'TYPE' => 'static::first', - 'KEYS' => 'static::first', - 'RENAME' => 'static::all', - 'RENAMENX' => 'static::all', - 'EXPIRE' => 'static::first', - 'EXPIREAT' => 'static::first', - 'TTL' => 'static::first', - 'MOVE' => 'static::first', - 'SORT' => 'static::sort', - 'DUMP' => 'static::first', - 'RESTORE' => 'static::first', - 'SET' => 'static::first', - 'SETNX' => 'static::first', - 'MSET' => 'static::interleaved', - 'MSETNX' => 'static::interleaved', - 'GET' => 'static::first', - 'MGET' => 'static::all', - 'GETSET' => 'static::first', - 'INCR' => 'static::first', - 'INCRBY' => 'static::first', - 'DECR' => 'static::first', - 'DECRBY' => 'static::first', - 'RPUSH' => 'static::first', - 'LPUSH' => 'static::first', - 'LLEN' => 'static::first', - 'LRANGE' => 'static::first', - 'LTRIM' => 'static::first', - 'LINDEX' => 'static::first', - 'LSET' => 'static::first', - 'LREM' => 'static::first', - 'LPOP' => 'static::first', - 'RPOP' => 'static::first', - 'RPOPLPUSH' => 'static::all', - 'SADD' => 'static::first', - 'SREM' => 'static::first', - 'SPOP' => 'static::first', - 'SMOVE' => 'static::skipLast', - 'SCARD' => 'static::first', - 'SISMEMBER' => 'static::first', - 'SINTER' => 'static::all', - 'SINTERSTORE' => 'static::all', - 'SUNION' => 'static::all', - 'SUNIONSTORE' => 'static::all', - 'SDIFF' => 'static::all', - 'SDIFFSTORE' => 'static::all', - 'SMEMBERS' => 'static::first', - 'SRANDMEMBER' => 'static::first', - 'ZADD' => 'static::first', - 'ZINCRBY' => 'static::first', - 'ZREM' => 'static::first', - 'ZRANGE' => 'static::first', - 'ZREVRANGE' => 'static::first', - 'ZRANGEBYSCORE' => 'static::first', - 'ZCARD' => 'static::first', - 'ZSCORE' => 'static::first', - 'ZREMRANGEBYSCORE' => 'static::first', - /* ---------------- Redis 2.0 ---------------- */ - 'SETEX' => 'static::first', - 'APPEND' => 'static::first', - 'SUBSTR' => 'static::first', - 'BLPOP' => 'static::skipLast', - 'BRPOP' => 'static::skipLast', - 'ZUNIONSTORE' => 'static::zsetStore', - 'ZINTERSTORE' => 'static::zsetStore', - 'ZCOUNT' => 'static::first', - 'ZRANK' => 'static::first', - 'ZREVRANK' => 'static::first', - 'ZREMRANGEBYRANK' => 'static::first', - 'HSET' => 'static::first', - 'HSETNX' => 'static::first', - 'HMSET' => 'static::first', - 'HINCRBY' => 'static::first', - 'HGET' => 'static::first', - 'HMGET' => 'static::first', - 'HDEL' => 'static::first', - 'HEXISTS' => 'static::first', - 'HLEN' => 'static::first', - 'HKEYS' => 'static::first', - 'HVALS' => 'static::first', - 'HGETALL' => 'static::first', - 'SUBSCRIBE' => 'static::all', - 'UNSUBSCRIBE' => 'static::all', - 'PSUBSCRIBE' => 'static::all', - 'PUNSUBSCRIBE' => 'static::all', - 'PUBLISH' => 'static::first', - /* ---------------- Redis 2.2 ---------------- */ - 'PERSIST' => 'static::first', - 'STRLEN' => 'static::first', - 'SETRANGE' => 'static::first', - 'GETRANGE' => 'static::first', - 'SETBIT' => 'static::first', - 'GETBIT' => 'static::first', - 'RPUSHX' => 'static::first', - 'LPUSHX' => 'static::first', - 'LINSERT' => 'static::first', - 'BRPOPLPUSH' => 'static::skipLast', - 'ZREVRANGEBYSCORE' => 'static::first', - 'WATCH' => 'static::all', - /* ---------------- Redis 2.6 ---------------- */ - 'PTTL' => 'static::first', - 'PEXPIRE' => 'static::first', - 'PEXPIREAT' => 'static::first', - 'PSETEX' => 'static::first', - 'INCRBYFLOAT' => 'static::first', - 'BITOP' => 'static::skipFirst', - 'BITCOUNT' => 'static::first', - 'HINCRBYFLOAT' => 'static::first', - 'EVAL' => 'static::evalKeys', - 'EVALSHA' => 'static::evalKeys', - 'MIGRATE' => 'static::migrate', - /* ---------------- Redis 2.8 ---------------- */ - 'SSCAN' => 'static::first', - 'ZSCAN' => 'static::first', - 'HSCAN' => 'static::first', - 'PFADD' => 'static::first', - 'PFCOUNT' => 'static::all', - 'PFMERGE' => 'static::all', - 'ZLEXCOUNT' => 'static::first', - 'ZRANGEBYLEX' => 'static::first', - 'ZREMRANGEBYLEX' => 'static::first', - 'ZREVRANGEBYLEX' => 'static::first', - 'BITPOS' => 'static::first', - /* ---------------- Redis 3.2 ---------------- */ - 'HSTRLEN' => 'static::first', - ); - } - - /** - * Sets a prefix that is applied to all the keys. - * - * @param string $prefix Prefix for the keys. - */ - public function setPrefix($prefix) - { - $this->prefix = $prefix; - } - - /** - * Gets the current prefix. - * - * @return string - */ - public function getPrefix() - { - return $this->prefix; - } - - /** - * {@inheritdoc} - */ - public function process(CommandInterface $command) - { - if ($command instanceof PrefixableCommandInterface) { - $command->prefixKeys($this->prefix); - } elseif (isset($this->commands[$commandID = strtoupper($command->getId())])) { - call_user_func($this->commands[$commandID], $command, $this->prefix); - } - } - - /** - * Sets an handler for the specified command ID. - * - * The callback signature must have 2 parameters of the following types: - * - * - Predis\Command\CommandInterface (command instance) - * - String (prefix) - * - * When the callback argument is omitted or NULL, the previously - * associated handler for the specified command ID is removed. - * - * @param string $commandID The ID of the command to be handled. - * @param mixed $callback A valid callable object or NULL. - * - * @throws \InvalidArgumentException - */ - public function setCommandHandler($commandID, $callback = null) - { - $commandID = strtoupper($commandID); - - if (!isset($callback)) { - unset($this->commands[$commandID]); - - return; - } - - if (!is_callable($callback)) { - throw new \InvalidArgumentException( - 'Callback must be a valid callable object or NULL' - ); - } - - $this->commands[$commandID] = $callback; - } - - /** - * {@inheritdoc} - */ - public function __toString() - { - return $this->getPrefix(); - } - - /** - * Applies the specified prefix only the first argument. - * - * @param CommandInterface $command Command instance. - * @param string $prefix Prefix string. - */ - public static function first(CommandInterface $command, $prefix) - { - if ($arguments = $command->getArguments()) { - $arguments[0] = "$prefix{$arguments[0]}"; - $command->setRawArguments($arguments); - } - } - - /** - * Applies the specified prefix to all the arguments. - * - * @param CommandInterface $command Command instance. - * @param string $prefix Prefix string. - */ - public static function all(CommandInterface $command, $prefix) - { - if ($arguments = $command->getArguments()) { - foreach ($arguments as &$key) { - $key = "$prefix$key"; - } - - $command->setRawArguments($arguments); - } - } - - /** - * Applies the specified prefix only to even arguments in the list. - * - * @param CommandInterface $command Command instance. - * @param string $prefix Prefix string. - */ - public static function interleaved(CommandInterface $command, $prefix) - { - if ($arguments = $command->getArguments()) { - $length = count($arguments); - - for ($i = 0; $i < $length; $i += 2) { - $arguments[$i] = "$prefix{$arguments[$i]}"; - } - - $command->setRawArguments($arguments); - } - } - - /** - * Applies the specified prefix to all the arguments but the first one. - * - * @param CommandInterface $command Command instance. - * @param string $prefix Prefix string. - */ - public static function skipFirst(CommandInterface $command, $prefix) - { - if ($arguments = $command->getArguments()) { - $length = count($arguments); - - for ($i = 1; $i < $length; ++$i) { - $arguments[$i] = "$prefix{$arguments[$i]}"; - } - - $command->setRawArguments($arguments); - } - } - - /** - * Applies the specified prefix to all the arguments but the last one. - * - * @param CommandInterface $command Command instance. - * @param string $prefix Prefix string. - */ - public static function skipLast(CommandInterface $command, $prefix) - { - if ($arguments = $command->getArguments()) { - $length = count($arguments); - - for ($i = 0; $i < $length - 1; ++$i) { - $arguments[$i] = "$prefix{$arguments[$i]}"; - } - - $command->setRawArguments($arguments); - } - } - - /** - * Applies the specified prefix to the keys of a SORT command. - * - * @param CommandInterface $command Command instance. - * @param string $prefix Prefix string. - */ - public static function sort(CommandInterface $command, $prefix) - { - if ($arguments = $command->getArguments()) { - $arguments[0] = "$prefix{$arguments[0]}"; - - if (($count = count($arguments)) > 1) { - for ($i = 1; $i < $count; ++$i) { - switch ($arguments[$i]) { - case 'BY': - case 'STORE': - $arguments[$i] = "$prefix{$arguments[++$i]}"; - break; - - case 'GET': - $value = $arguments[++$i]; - if ($value !== '#') { - $arguments[$i] = "$prefix$value"; - } - break; - - case 'LIMIT'; - $i += 2; - break; - } - } - } - - $command->setRawArguments($arguments); - } - } - - /** - * Applies the specified prefix to the keys of an EVAL-based command. - * - * @param CommandInterface $command Command instance. - * @param string $prefix Prefix string. - */ - public static function evalKeys(CommandInterface $command, $prefix) - { - if ($arguments = $command->getArguments()) { - for ($i = 2; $i < $arguments[1] + 2; ++$i) { - $arguments[$i] = "$prefix{$arguments[$i]}"; - } - - $command->setRawArguments($arguments); - } - } - - /** - * Applies the specified prefix to the keys of Z[INTERSECTION|UNION]STORE. - * - * @param CommandInterface $command Command instance. - * @param string $prefix Prefix string. - */ - public static function zsetStore(CommandInterface $command, $prefix) - { - if ($arguments = $command->getArguments()) { - $arguments[0] = "$prefix{$arguments[0]}"; - $length = ((int) $arguments[1]) + 2; - - for ($i = 2; $i < $length; ++$i) { - $arguments[$i] = "$prefix{$arguments[$i]}"; - } - - $command->setRawArguments($arguments); - } - } - - /** - * Applies the specified prefix to the key of a MIGRATE command. - * - * @param CommandInterface $command Command instance. - * @param string $prefix Prefix string. - */ - public static function migrate(CommandInterface $command, $prefix) - { - if ($arguments = $command->getArguments()) { - $arguments[2] = "$prefix{$arguments[2]}"; - $command->setRawArguments($arguments); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/ProcessorChain.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/ProcessorChain.php deleted file mode 100755 index 0a4768b0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/ProcessorChain.php +++ /dev/null @@ -1,130 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command\Processor; - -use Predis\Command\CommandInterface; - -/** - * Default implementation of a command processors chain. - * - * @author Daniele Alessandri - */ -class ProcessorChain implements \ArrayAccess, ProcessorInterface -{ - private $processors = array(); - - /** - * @param array $processors List of instances of ProcessorInterface. - */ - public function __construct($processors = array()) - { - foreach ($processors as $processor) { - $this->add($processor); - } - } - - /** - * {@inheritdoc} - */ - public function add(ProcessorInterface $processor) - { - $this->processors[] = $processor; - } - - /** - * {@inheritdoc} - */ - public function remove(ProcessorInterface $processor) - { - if (false !== $index = array_search($processor, $this->processors, true)) { - unset($this[$index]); - } - } - - /** - * {@inheritdoc} - */ - public function process(CommandInterface $command) - { - for ($i = 0; $i < $count = count($this->processors); ++$i) { - $this->processors[$i]->process($command); - } - } - - /** - * {@inheritdoc} - */ - public function getProcessors() - { - return $this->processors; - } - - /** - * Returns an iterator over the list of command processor in the chain. - * - * @return \ArrayIterator - */ - public function getIterator() - { - return new \ArrayIterator($this->processors); - } - - /** - * Returns the number of command processors in the chain. - * - * @return int - */ - public function count() - { - return count($this->processors); - } - - /** - * {@inheritdoc} - */ - public function offsetExists($index) - { - return isset($this->processors[$index]); - } - - /** - * {@inheritdoc} - */ - public function offsetGet($index) - { - return $this->processors[$index]; - } - - /** - * {@inheritdoc} - */ - public function offsetSet($index, $processor) - { - if (!$processor instanceof ProcessorInterface) { - throw new \InvalidArgumentException( - 'A processor chain accepts only instances of '. - "'Predis\Command\Processor\ProcessorInterface'." - ); - } - - $this->processors[$index] = $processor; - } - - /** - * {@inheritdoc} - */ - public function offsetUnset($index) - { - unset($this->processors[$index]); - $this->processors = array_values($this->processors); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/ProcessorInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/ProcessorInterface.php deleted file mode 100755 index 2f910580..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/Processor/ProcessorInterface.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command\Processor; - -use Predis\Command\CommandInterface; - -/** - * A command processor processes Redis commands before they are sent to Redis. - * - * @author Daniele Alessandri - */ -interface ProcessorInterface -{ - /** - * Processes the given Redis command. - * - * @param CommandInterface $command Command instance. - */ - public function process(CommandInterface $command); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubPublish.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubPublish.php deleted file mode 100755 index 55508f8d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubPublish.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/publish - * - * @author Daniele Alessandri - */ -class PubSubPublish extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'PUBLISH'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubPubsub.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubPubsub.php deleted file mode 100755 index 8cf81297..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubPubsub.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/pubsub - * - * @author Daniele Alessandri - */ -class PubSubPubsub extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'PUBSUB'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - switch (strtolower($this->getArgument(0))) { - case 'numsub': - return self::processNumsub($data); - - default: - return $data; - } - } - - /** - * Returns the processed response to PUBSUB NUMSUB. - * - * @param array $channels List of channels - * - * @return array - */ - protected static function processNumsub(array $channels) - { - $processed = array(); - $count = count($channels); - - for ($i = 0; $i < $count; ++$i) { - $processed[$channels[$i]] = $channels[++$i]; - } - - return $processed; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubSubscribe.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubSubscribe.php deleted file mode 100755 index e477b313..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubSubscribe.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/subscribe - * - * @author Daniele Alessandri - */ -class PubSubSubscribe extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SUBSCRIBE'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - return self::normalizeArguments($arguments); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubSubscribeByPattern.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubSubscribeByPattern.php deleted file mode 100755 index 01182806..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubSubscribeByPattern.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/psubscribe - * - * @author Daniele Alessandri - */ -class PubSubSubscribeByPattern extends PubSubSubscribe -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'PSUBSCRIBE'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubUnsubscribe.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubUnsubscribe.php deleted file mode 100755 index d57c3ac6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubUnsubscribe.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/unsubscribe - * - * @author Daniele Alessandri - */ -class PubSubUnsubscribe extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'UNSUBSCRIBE'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - return self::normalizeArguments($arguments); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubUnsubscribeByPattern.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubUnsubscribeByPattern.php deleted file mode 100755 index 4d76508b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/PubSubUnsubscribeByPattern.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/punsubscribe - * - * @author Daniele Alessandri - */ -class PubSubUnsubscribeByPattern extends PubSubUnsubscribe -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'PUNSUBSCRIBE'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/RawCommand.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/RawCommand.php deleted file mode 100755 index 2dd48ca1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/RawCommand.php +++ /dev/null @@ -1,131 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * Class for generic "anonymous" Redis commands. - * - * This command class does not filter input arguments or parse responses, but - * can be used to leverage the standard Predis API to execute any command simply - * by providing the needed arguments following the command signature as defined - * by Redis in its documentation. - * - * @author Daniele Alessandri - */ -class RawCommand implements CommandInterface -{ - private $slot; - private $commandID; - private $arguments; - - /** - * @param array $arguments Command ID and its arguments. - * - * @throws \InvalidArgumentException - */ - public function __construct(array $arguments) - { - if (!$arguments) { - throw new \InvalidArgumentException( - 'The arguments array must contain at least the command ID.' - ); - } - - $this->commandID = strtoupper(array_shift($arguments)); - $this->arguments = $arguments; - } - - /** - * Creates a new raw command using a variadic method. - * - * @param string $commandID Redis command ID. - * @param string ... Arguments list for the command. - * - * @return CommandInterface - */ - public static function create($commandID /* [ $arg, ... */) - { - $arguments = func_get_args(); - $command = new self($arguments); - - return $command; - } - - /** - * {@inheritdoc} - */ - public function getId() - { - return $this->commandID; - } - - /** - * {@inheritdoc} - */ - public function setArguments(array $arguments) - { - $this->arguments = $arguments; - unset($this->slot); - } - - /** - * {@inheritdoc} - */ - public function setRawArguments(array $arguments) - { - $this->setArguments($arguments); - } - - /** - * {@inheritdoc} - */ - public function getArguments() - { - return $this->arguments; - } - - /** - * {@inheritdoc} - */ - public function getArgument($index) - { - if (isset($this->arguments[$index])) { - return $this->arguments[$index]; - } - } - - /** - * {@inheritdoc} - */ - public function setSlot($slot) - { - $this->slot = $slot; - } - - /** - * {@inheritdoc} - */ - public function getSlot() - { - if (isset($this->slot)) { - return $this->slot; - } - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - return $data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ScriptCommand.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ScriptCommand.php deleted file mode 100755 index a30bc1d2..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ScriptCommand.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * Base class used to implement an higher level abstraction for commands based - * on Lua scripting with EVAL and EVALSHA. - * - * @link http://redis.io/commands/eval - * - * @author Daniele Alessandri - */ -abstract class ScriptCommand extends ServerEvalSHA -{ - /** - * Gets the body of a Lua script. - * - * @return string - */ - abstract public function getScript(); - - /** - * Specifies the number of arguments that should be considered as keys. - * - * The default behaviour for the base class is to return 0 to indicate that - * all the elements of the arguments array should be considered as keys, but - * subclasses can enforce a static number of keys. - * - * @return int - */ - protected function getKeysCount() - { - return 0; - } - - /** - * Returns the elements from the arguments that are identified as keys. - * - * @return array - */ - public function getKeys() - { - return array_slice($this->getArguments(), 2, $this->getKeysCount()); - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - if (($numkeys = $this->getKeysCount()) && $numkeys < 0) { - $numkeys = count($arguments) + $numkeys; - } - - return array_merge(array(sha1($this->getScript()), (int) $numkeys), $arguments); - } - - /** - * @return array - */ - public function getEvalArguments() - { - $arguments = $this->getArguments(); - $arguments[0] = $this->getScript(); - - return $arguments; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerBackgroundRewriteAOF.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerBackgroundRewriteAOF.php deleted file mode 100755 index c66a294e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerBackgroundRewriteAOF.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/bgrewriteaof - * - * @author Daniele Alessandri - */ -class ServerBackgroundRewriteAOF extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'BGREWRITEAOF'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - return $data == 'Background append only file rewriting started'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerBackgroundSave.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerBackgroundSave.php deleted file mode 100755 index 4bf67ef3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerBackgroundSave.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/bgsave - * - * @author Daniele Alessandri - */ -class ServerBackgroundSave extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'BGSAVE'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - return $data === 'Background saving started' ? true : $data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerClient.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerClient.php deleted file mode 100755 index d00ebbff..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerClient.php +++ /dev/null @@ -1,74 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/client-list - * @link http://redis.io/commands/client-kill - * @link http://redis.io/commands/client-getname - * @link http://redis.io/commands/client-setname - * - * @author Daniele Alessandri - */ -class ServerClient extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'CLIENT'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - $args = array_change_key_case($this->getArguments(), CASE_UPPER); - - switch (strtoupper($args[0])) { - case 'LIST': - return $this->parseClientList($data); - case 'KILL': - case 'GETNAME': - case 'SETNAME': - default: - return $data; - } - } - - /** - * Parses the response to CLIENT LIST and returns a structured list. - * - * @param string $data Response buffer. - * - * @return array - */ - protected function parseClientList($data) - { - $clients = array(); - - foreach (explode("\n", $data, -1) as $clientData) { - $client = array(); - - foreach (explode(' ', $clientData) as $kv) { - @list($k, $v) = explode('=', $kv); - $client[$k] = $v; - } - - $clients[] = $client; - } - - return $clients; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerCommand.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerCommand.php deleted file mode 100755 index e9b3393c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerCommand.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/command - * - * @author Daniele Alessandri - */ -class ServerCommand extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'COMMAND'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerConfig.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerConfig.php deleted file mode 100755 index 81e497ae..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerConfig.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/config-set - * @link http://redis.io/commands/config-get - * @link http://redis.io/commands/config-resetstat - * @link http://redis.io/commands/config-rewrite - * - * @author Daniele Alessandri - */ -class ServerConfig extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'CONFIG'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - if (is_array($data)) { - $result = array(); - - for ($i = 0; $i < count($data); ++$i) { - $result[$data[$i]] = $data[++$i]; - } - - return $result; - } - - return $data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerDatabaseSize.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerDatabaseSize.php deleted file mode 100755 index 6bc89724..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerDatabaseSize.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/dbsize - * - * @author Daniele Alessandri - */ -class ServerDatabaseSize extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'DBSIZE'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerEval.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerEval.php deleted file mode 100755 index f5eefd81..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerEval.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/eval - * - * @author Daniele Alessandri - */ -class ServerEval extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'EVAL'; - } - - /** - * Calculates the SHA1 hash of the body of the script. - * - * @return string SHA1 hash. - */ - public function getScriptHash() - { - return sha1($this->getArgument(0)); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerEvalSHA.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerEvalSHA.php deleted file mode 100755 index 520a8e98..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerEvalSHA.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/evalsha - * - * @author Daniele Alessandri - */ -class ServerEvalSHA extends ServerEval -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'EVALSHA'; - } - - /** - * Returns the SHA1 hash of the body of the script. - * - * @return string SHA1 hash. - */ - public function getScriptHash() - { - return $this->getArgument(0); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerFlushAll.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerFlushAll.php deleted file mode 100755 index c35b2ad6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerFlushAll.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/flushall - * - * @author Daniele Alessandri - */ -class ServerFlushAll extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'FLUSHALL'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerFlushDatabase.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerFlushDatabase.php deleted file mode 100755 index 3da6b320..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerFlushDatabase.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/flushdb - * - * @author Daniele Alessandri - */ -class ServerFlushDatabase extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'FLUSHDB'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerInfo.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerInfo.php deleted file mode 100755 index 96d6adad..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerInfo.php +++ /dev/null @@ -1,111 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/info - * - * @author Daniele Alessandri - */ -class ServerInfo extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'INFO'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - $info = array(); - $infoLines = preg_split('/\r?\n/', $data); - - foreach ($infoLines as $row) { - if (strpos($row, ':') === false) { - continue; - } - - list($k, $v) = $this->parseRow($row); - $info[$k] = $v; - } - - return $info; - } - - /** - * Parses a single row of the response and returns the key-value pair. - * - * @param string $row Single row of the response. - * - * @return array - */ - protected function parseRow($row) - { - list($k, $v) = explode(':', $row, 2); - - if (preg_match('/^db\d+$/', $k)) { - $v = $this->parseDatabaseStats($v); - } - - return array($k, $v); - } - - /** - * Extracts the statistics of each logical DB from the string buffer. - * - * @param string $str Response buffer. - * - * @return array - */ - protected function parseDatabaseStats($str) - { - $db = array(); - - foreach (explode(',', $str) as $dbvar) { - list($dbvk, $dbvv) = explode('=', $dbvar); - $db[trim($dbvk)] = $dbvv; - } - - return $db; - } - - /** - * Parses the response and extracts the allocation statistics. - * - * @param string $str Response buffer. - * - * @return array - */ - protected function parseAllocationStats($str) - { - $stats = array(); - - foreach (explode(',', $str) as $kv) { - @list($size, $objects, $extra) = explode('=', $kv); - - // hack to prevent incorrect values when parsing the >=256 key - if (isset($extra)) { - $size = ">=$objects"; - $objects = $extra; - } - - $stats[$size] = $objects; - } - - return $stats; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerInfoV26x.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerInfoV26x.php deleted file mode 100755 index 90c9b716..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerInfoV26x.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/info - * - * @author Daniele Alessandri - */ -class ServerInfoV26x extends ServerInfo -{ - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - if ($data === '') { - return array(); - } - - $info = array(); - - $current = null; - $infoLines = preg_split('/\r?\n/', $data); - - if (isset($infoLines[0]) && $infoLines[0][0] !== '#') { - return parent::parseResponse($data); - } - - foreach ($infoLines as $row) { - if ($row === '') { - continue; - } - - if (preg_match('/^# (\w+)$/', $row, $matches)) { - $info[$matches[1]] = array(); - $current = &$info[$matches[1]]; - continue; - } - - list($k, $v) = $this->parseRow($row); - $current[$k] = $v; - } - - return $info; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerLastSave.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerLastSave.php deleted file mode 100755 index feeb19a8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerLastSave.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/lastsave - * - * @author Daniele Alessandri - */ -class ServerLastSave extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'LASTSAVE'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerMonitor.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerMonitor.php deleted file mode 100755 index 1c3d3309..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerMonitor.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/monitor - * - * @author Daniele Alessandri - */ -class ServerMonitor extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'MONITOR'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerObject.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerObject.php deleted file mode 100755 index f921701c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerObject.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/object - * - * @author Daniele Alessandri - */ -class ServerObject extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'OBJECT'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSave.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSave.php deleted file mode 100755 index addefe20..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSave.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/save - * - * @author Daniele Alessandri - */ -class ServerSave extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SAVE'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerScript.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerScript.php deleted file mode 100755 index 7a01018d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerScript.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/script - * - * @author Daniele Alessandri - */ -class ServerScript extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SCRIPT'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSentinel.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSentinel.php deleted file mode 100755 index c0962db3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSentinel.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/topics/sentinel - * - * @author Daniele Alessandri - */ -class ServerSentinel extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SENTINEL'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - switch (strtolower($this->getArgument(0))) { - case 'masters': - case 'slaves': - return self::processMastersOrSlaves($data); - - default: - return $data; - } - } - - /** - * Returns a processed response to SENTINEL MASTERS or SENTINEL SLAVES. - * - * @param array $servers List of Redis servers. - * - * @return array - */ - protected static function processMastersOrSlaves(array $servers) - { - foreach ($servers as $idx => $node) { - $processed = array(); - $count = count($node); - - for ($i = 0; $i < $count; ++$i) { - $processed[$node[$i]] = $node[++$i]; - } - - $servers[$idx] = $processed; - } - - return $servers; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerShutdown.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerShutdown.php deleted file mode 100755 index f5b745a2..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerShutdown.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/shutdown - * - * @author Daniele Alessandri - */ -class ServerShutdown extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SHUTDOWN'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSlaveOf.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSlaveOf.php deleted file mode 100755 index 4ff44556..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSlaveOf.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/slaveof - * - * @author Daniele Alessandri - */ -class ServerSlaveOf extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SLAVEOF'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - if (count($arguments) === 0 || $arguments[0] === 'NO ONE') { - return array('NO', 'ONE'); - } - - return $arguments; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSlowlog.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSlowlog.php deleted file mode 100755 index 137ff59e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerSlowlog.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/slowlog - * - * @author Daniele Alessandri - */ -class ServerSlowlog extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SLOWLOG'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - if (is_array($data)) { - $log = array(); - - foreach ($data as $index => $entry) { - $log[$index] = array( - 'id' => $entry[0], - 'timestamp' => $entry[1], - 'duration' => $entry[2], - 'command' => $entry[3], - ); - } - - return $log; - } - - return $data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerTime.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerTime.php deleted file mode 100755 index 589f92c5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ServerTime.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/time - * - * @author Daniele Alessandri - */ -class ServerTime extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'TIME'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetAdd.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetAdd.php deleted file mode 100755 index c1188181..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetAdd.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/sadd - * - * @author Daniele Alessandri - */ -class SetAdd extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SADD'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - return self::normalizeVariadic($arguments); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetCardinality.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetCardinality.php deleted file mode 100755 index a9f959b7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetCardinality.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/scard - * - * @author Daniele Alessandri - */ -class SetCardinality extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SCARD'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetDifference.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetDifference.php deleted file mode 100755 index 35f23f98..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetDifference.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/sdiff - * - * @author Daniele Alessandri - */ -class SetDifference extends SetIntersection -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SDIFF'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetDifferenceStore.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetDifferenceStore.php deleted file mode 100755 index 0cb78155..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetDifferenceStore.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/sdiffstore - * - * @author Daniele Alessandri - */ -class SetDifferenceStore extends SetIntersectionStore -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SDIFFSTORE'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIntersection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIntersection.php deleted file mode 100755 index d18258fd..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIntersection.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/sinter - * - * @author Daniele Alessandri - */ -class SetIntersection extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SINTER'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - return self::normalizeArguments($arguments); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIntersectionStore.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIntersectionStore.php deleted file mode 100755 index b748618a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIntersectionStore.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/sinterstore - * - * @author Daniele Alessandri - */ -class SetIntersectionStore extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SINTERSTORE'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - if (count($arguments) === 2 && is_array($arguments[1])) { - return array_merge(array($arguments[0]), $arguments[1]); - } - - return $arguments; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIsMember.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIsMember.php deleted file mode 100755 index 1b484907..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetIsMember.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/sismember - * - * @author Daniele Alessandri - */ -class SetIsMember extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SISMEMBER'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - return (bool) $data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetMembers.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetMembers.php deleted file mode 100755 index f4076ae8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetMembers.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/smembers - * - * @author Daniele Alessandri - */ -class SetMembers extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SMEMBERS'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetMove.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetMove.php deleted file mode 100755 index 72d514be..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetMove.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/smove - * - * @author Daniele Alessandri - */ -class SetMove extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SMOVE'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - return (bool) $data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetPop.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetPop.php deleted file mode 100755 index b78d3f33..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetPop.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/spop - * - * @author Daniele Alessandri - */ -class SetPop extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SPOP'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetRandomMember.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetRandomMember.php deleted file mode 100755 index 2cb79a04..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetRandomMember.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/srandmember - * - * @author Daniele Alessandri - */ -class SetRandomMember extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SRANDMEMBER'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetRemove.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetRemove.php deleted file mode 100755 index b34710c6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetRemove.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/srem - * - * @author Daniele Alessandri - */ -class SetRemove extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SREM'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - return self::normalizeVariadic($arguments); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetScan.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetScan.php deleted file mode 100755 index d42b28df..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetScan.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/sscan - * - * @author Daniele Alessandri - */ -class SetScan extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SSCAN'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - if (count($arguments) === 3 && is_array($arguments[2])) { - $options = $this->prepareOptions(array_pop($arguments)); - $arguments = array_merge($arguments, $options); - } - - return $arguments; - } - - /** - * Returns a list of options and modifiers compatible with Redis. - * - * @param array $options List of options. - * - * @return array - */ - protected function prepareOptions($options) - { - $options = array_change_key_case($options, CASE_UPPER); - $normalized = array(); - - if (!empty($options['MATCH'])) { - $normalized[] = 'MATCH'; - $normalized[] = $options['MATCH']; - } - - if (!empty($options['COUNT'])) { - $normalized[] = 'COUNT'; - $normalized[] = $options['COUNT']; - } - - return $normalized; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetUnion.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetUnion.php deleted file mode 100755 index 7da842b4..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetUnion.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/sunion - * - * @author Daniele Alessandri - */ -class SetUnion extends SetIntersection -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SUNION'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetUnionStore.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetUnionStore.php deleted file mode 100755 index eac821ad..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/SetUnionStore.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/sunionstore - * - * @author Daniele Alessandri - */ -class SetUnionStore extends SetIntersectionStore -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SUNIONSTORE'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringAppend.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringAppend.php deleted file mode 100755 index dac8b847..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringAppend.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/append - * - * @author Daniele Alessandri - */ -class StringAppend extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'APPEND'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitCount.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitCount.php deleted file mode 100755 index 193cce91..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitCount.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/bitcount - * - * @author Daniele Alessandri - */ -class StringBitCount extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'BITCOUNT'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitOp.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitOp.php deleted file mode 100755 index e04ee79c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitOp.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/bitop - * - * @author Daniele Alessandri - */ -class StringBitOp extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'BITOP'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - if (count($arguments) === 3 && is_array($arguments[2])) { - list($operation, $destination) = $arguments; - $arguments = $arguments[2]; - array_unshift($arguments, $operation, $destination); - } - - return $arguments; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitPos.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitPos.php deleted file mode 100755 index 42957665..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringBitPos.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/bitpos - * - * @author Daniele Alessandri - */ -class StringBitPos extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'BITPOS'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringDecrement.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringDecrement.php deleted file mode 100755 index aa5808cd..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringDecrement.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/decr - * - * @author Daniele Alessandri - */ -class StringDecrement extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'DECR'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringDecrementBy.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringDecrementBy.php deleted file mode 100755 index cbf3e112..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringDecrementBy.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/decrby - * - * @author Daniele Alessandri - */ -class StringDecrementBy extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'DECRBY'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGet.php deleted file mode 100755 index 138e915c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGet.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/get - * - * @author Daniele Alessandri - */ -class StringGet extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'GET'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetBit.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetBit.php deleted file mode 100755 index 3c5b4f9b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetBit.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/getbit - * - * @author Daniele Alessandri - */ -class StringGetBit extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'GETBIT'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetMultiple.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetMultiple.php deleted file mode 100755 index e340f9cf..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetMultiple.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/mget - * - * @author Daniele Alessandri - */ -class StringGetMultiple extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'MGET'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - return self::normalizeArguments($arguments); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetRange.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetRange.php deleted file mode 100755 index bb10565b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetRange.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/getrange - * - * @author Daniele Alessandri - */ -class StringGetRange extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'GETRANGE'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetSet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetSet.php deleted file mode 100755 index b68870d4..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringGetSet.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/getset - * - * @author Daniele Alessandri - */ -class StringGetSet extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'GETSET'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrement.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrement.php deleted file mode 100755 index fa1846e2..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrement.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/incr - * - * @author Daniele Alessandri - */ -class StringIncrement extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'INCR'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrementBy.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrementBy.php deleted file mode 100755 index 9d8241a2..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrementBy.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/incrby - * - * @author Daniele Alessandri - */ -class StringIncrementBy extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'INCRBY'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrementByFloat.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrementByFloat.php deleted file mode 100755 index 164a0869..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringIncrementByFloat.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/incrbyfloat - * - * @author Daniele Alessandri - */ -class StringIncrementByFloat extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'INCRBYFLOAT'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringPreciseSetExpire.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringPreciseSetExpire.php deleted file mode 100755 index 2faa954d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringPreciseSetExpire.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/psetex - * - * @author Daniele Alessandri - */ -class StringPreciseSetExpire extends StringSetExpire -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'PSETEX'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSet.php deleted file mode 100755 index b1469945..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSet.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/set - * - * @author Daniele Alessandri - */ -class StringSet extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SET'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetBit.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetBit.php deleted file mode 100755 index 7933b6be..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetBit.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/setbit - * - * @author Daniele Alessandri - */ -class StringSetBit extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SETBIT'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetExpire.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetExpire.php deleted file mode 100755 index f0881708..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetExpire.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/setex - * - * @author Daniele Alessandri - */ -class StringSetExpire extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SETEX'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetMultiple.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetMultiple.php deleted file mode 100755 index a3c5324d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetMultiple.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/mset - * - * @author Daniele Alessandri - */ -class StringSetMultiple extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'MSET'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - if (count($arguments) === 1 && is_array($arguments[0])) { - $flattenedKVs = array(); - $args = $arguments[0]; - - foreach ($args as $k => $v) { - $flattenedKVs[] = $k; - $flattenedKVs[] = $v; - } - - return $flattenedKVs; - } - - return $arguments; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetMultiplePreserve.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetMultiplePreserve.php deleted file mode 100755 index f98f1f7c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetMultiplePreserve.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/msetnx - * - * @author Daniele Alessandri - */ -class StringSetMultiplePreserve extends StringSetMultiple -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'MSETNX'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - return (bool) $data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetPreserve.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetPreserve.php deleted file mode 100755 index 726c35c8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetPreserve.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/setnx - * - * @author Daniele Alessandri - */ -class StringSetPreserve extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SETNX'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - return (bool) $data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetRange.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetRange.php deleted file mode 100755 index 4d9389f4..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSetRange.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/setrange - * - * @author Daniele Alessandri - */ -class StringSetRange extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SETRANGE'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringStrlen.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringStrlen.php deleted file mode 100755 index 10f492fd..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringStrlen.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/strlen - * - * @author Daniele Alessandri - */ -class StringStrlen extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'STRLEN'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSubstr.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSubstr.php deleted file mode 100755 index 3aab7ade..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/StringSubstr.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/substr - * - * @author Daniele Alessandri - */ -class StringSubstr extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'SUBSTR'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionDiscard.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionDiscard.php deleted file mode 100755 index 44aca2b1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionDiscard.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/discard - * - * @author Daniele Alessandri - */ -class TransactionDiscard extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'DISCARD'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionExec.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionExec.php deleted file mode 100755 index dbd81aae..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionExec.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/exec - * - * @author Daniele Alessandri - */ -class TransactionExec extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'EXEC'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionMulti.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionMulti.php deleted file mode 100755 index 673bf55d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionMulti.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/multi - * - * @author Daniele Alessandri - */ -class TransactionMulti extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'MULTI'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionUnwatch.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionUnwatch.php deleted file mode 100755 index 79255544..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionUnwatch.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/unwatch - * - * @author Daniele Alessandri - */ -class TransactionUnwatch extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'UNWATCH'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionWatch.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionWatch.php deleted file mode 100755 index d3607801..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/TransactionWatch.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/watch - * - * @author Daniele Alessandri - */ -class TransactionWatch extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'WATCH'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - if (isset($arguments[0]) && is_array($arguments[0])) { - return $arguments[0]; - } - - return $arguments; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetAdd.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetAdd.php deleted file mode 100755 index 55e4729e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetAdd.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/zadd - * - * @author Daniele Alessandri - */ -class ZSetAdd extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ZADD'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - if (is_array(end($arguments))) { - foreach (array_pop($arguments) as $member => $score) { - $arguments[] = $score; - $arguments[] = $member; - } - } - - return $arguments; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetCardinality.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetCardinality.php deleted file mode 100755 index 10332009..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetCardinality.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/zcard - * - * @author Daniele Alessandri - */ -class ZSetCardinality extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ZCARD'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetCount.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetCount.php deleted file mode 100755 index 918bd2b8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetCount.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/zcount - * - * @author Daniele Alessandri - */ -class ZSetCount extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ZCOUNT'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetIncrementBy.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetIncrementBy.php deleted file mode 100755 index 245a8e0f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetIncrementBy.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/zincrby - * - * @author Daniele Alessandri - */ -class ZSetIncrementBy extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ZINCRBY'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetIntersectionStore.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetIntersectionStore.php deleted file mode 100755 index 572a7a32..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetIntersectionStore.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/zinterstore - * - * @author Daniele Alessandri - */ -class ZSetIntersectionStore extends ZSetUnionStore -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ZINTERSTORE'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetLexCount.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetLexCount.php deleted file mode 100755 index 447b8eb3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetLexCount.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/zlexcount - * - * @author Daniele Alessandri - */ -class ZSetLexCount extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ZLEXCOUNT'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRange.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRange.php deleted file mode 100755 index ce72c7c0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRange.php +++ /dev/null @@ -1,105 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/zrange - * - * @author Daniele Alessandri - */ -class ZSetRange extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ZRANGE'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - if (count($arguments) === 4) { - $lastType = gettype($arguments[3]); - - if ($lastType === 'string' && strtoupper($arguments[3]) === 'WITHSCORES') { - // Used for compatibility with older versions - $arguments[3] = array('WITHSCORES' => true); - $lastType = 'array'; - } - - if ($lastType === 'array') { - $options = $this->prepareOptions(array_pop($arguments)); - - return array_merge($arguments, $options); - } - } - - return $arguments; - } - - /** - * Returns a list of options and modifiers compatible with Redis. - * - * @param array $options List of options. - * - * @return array - */ - protected function prepareOptions($options) - { - $opts = array_change_key_case($options, CASE_UPPER); - $finalizedOpts = array(); - - if (!empty($opts['WITHSCORES'])) { - $finalizedOpts[] = 'WITHSCORES'; - } - - return $finalizedOpts; - } - - /** - * Checks for the presence of the WITHSCORES modifier. - * - * @return bool - */ - protected function withScores() - { - $arguments = $this->getArguments(); - - if (count($arguments) < 4) { - return false; - } - - return strtoupper($arguments[3]) === 'WITHSCORES'; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - if ($this->withScores()) { - $result = array(); - - for ($i = 0; $i < count($data); ++$i) { - $result[$data[$i]] = $data[++$i]; - } - - return $result; - } - - return $data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRangeByLex.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRangeByLex.php deleted file mode 100755 index 9b2991a8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRangeByLex.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/zrangebylex - * - * @author Daniele Alessandri - */ -class ZSetRangeByLex extends ZSetRange -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ZRANGEBYLEX'; - } - - /** - * {@inheritdoc} - */ - protected function prepareOptions($options) - { - $opts = array_change_key_case($options, CASE_UPPER); - $finalizedOpts = array(); - - if (isset($opts['LIMIT']) && is_array($opts['LIMIT'])) { - $limit = array_change_key_case($opts['LIMIT'], CASE_UPPER); - - $finalizedOpts[] = 'LIMIT'; - $finalizedOpts[] = isset($limit['OFFSET']) ? $limit['OFFSET'] : $limit[0]; - $finalizedOpts[] = isset($limit['COUNT']) ? $limit['COUNT'] : $limit[1]; - } - - return $finalizedOpts; - } - - /** - * {@inheritdoc} - */ - protected function withScores() - { - return false; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRangeByScore.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRangeByScore.php deleted file mode 100755 index 961a5bc2..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRangeByScore.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/zrangebyscore - * - * @author Daniele Alessandri - */ -class ZSetRangeByScore extends ZSetRange -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ZRANGEBYSCORE'; - } - - /** - * {@inheritdoc} - */ - protected function prepareOptions($options) - { - $opts = array_change_key_case($options, CASE_UPPER); - $finalizedOpts = array(); - - if (isset($opts['LIMIT']) && is_array($opts['LIMIT'])) { - $limit = array_change_key_case($opts['LIMIT'], CASE_UPPER); - - $finalizedOpts[] = 'LIMIT'; - $finalizedOpts[] = isset($limit['OFFSET']) ? $limit['OFFSET'] : $limit[0]; - $finalizedOpts[] = isset($limit['COUNT']) ? $limit['COUNT'] : $limit[1]; - } - - return array_merge($finalizedOpts, parent::prepareOptions($options)); - } - - /** - * {@inheritdoc} - */ - protected function withScores() - { - $arguments = $this->getArguments(); - - for ($i = 3; $i < count($arguments); ++$i) { - switch (strtoupper($arguments[$i])) { - case 'WITHSCORES': - return true; - - case 'LIMIT': - $i += 2; - break; - } - } - - return false; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRank.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRank.php deleted file mode 100755 index d0c9c536..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRank.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/zrank - * - * @author Daniele Alessandri - */ -class ZSetRank extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ZRANK'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemove.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemove.php deleted file mode 100755 index cd8ada05..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemove.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/zrem - * - * @author Daniele Alessandri - */ -class ZSetRemove extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ZREM'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - return self::normalizeVariadic($arguments); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByLex.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByLex.php deleted file mode 100755 index 9ea2d9e5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByLex.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/zremrangebylex - * - * @author Daniele Alessandri - */ -class ZSetRemoveRangeByLex extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ZREMRANGEBYLEX'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByRank.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByRank.php deleted file mode 100755 index 89cd5baf..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByRank.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/zremrangebyrank - * - * @author Daniele Alessandri - */ -class ZSetRemoveRangeByRank extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ZREMRANGEBYRANK'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByScore.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByScore.php deleted file mode 100755 index a7c30814..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetRemoveRangeByScore.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/zremrangebyscore - * - * @author Daniele Alessandri - */ -class ZSetRemoveRangeByScore extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ZREMRANGEBYSCORE'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRange.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRange.php deleted file mode 100755 index 6a46a7a5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRange.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/zrevrange - * - * @author Daniele Alessandri - */ -class ZSetReverseRange extends ZSetRange -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ZREVRANGE'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRangeByLex.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRangeByLex.php deleted file mode 100755 index cdd8ba62..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRangeByLex.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -class ZSetReverseRangeByLex extends ZSetRangeByLex -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ZREVRANGEBYLEX'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRangeByScore.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRangeByScore.php deleted file mode 100755 index 1078eb72..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRangeByScore.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/zrevrangebyscore - * - * @author Daniele Alessandri - */ -class ZSetReverseRangeByScore extends ZSetRangeByScore -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ZREVRANGEBYSCORE'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRank.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRank.php deleted file mode 100755 index 33fb8158..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetReverseRank.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/zrevrank - * - * @author Daniele Alessandri - */ -class ZSetReverseRank extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ZREVRANK'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetScan.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetScan.php deleted file mode 100755 index 1dc2352e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetScan.php +++ /dev/null @@ -1,85 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/zscan - * - * @author Daniele Alessandri - */ -class ZSetScan extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ZSCAN'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - if (count($arguments) === 3 && is_array($arguments[2])) { - $options = $this->prepareOptions(array_pop($arguments)); - $arguments = array_merge($arguments, $options); - } - - return $arguments; - } - - /** - * Returns a list of options and modifiers compatible with Redis. - * - * @param array $options List of options. - * - * @return array - */ - protected function prepareOptions($options) - { - $options = array_change_key_case($options, CASE_UPPER); - $normalized = array(); - - if (!empty($options['MATCH'])) { - $normalized[] = 'MATCH'; - $normalized[] = $options['MATCH']; - } - - if (!empty($options['COUNT'])) { - $normalized[] = 'COUNT'; - $normalized[] = $options['COUNT']; - } - - return $normalized; - } - - /** - * {@inheritdoc} - */ - public function parseResponse($data) - { - if (is_array($data)) { - $members = $data[1]; - $result = array(); - - for ($i = 0; $i < count($members); ++$i) { - $result[$members[$i]] = (float) $members[++$i]; - } - - $data[1] = $result; - } - - return $data; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetScore.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetScore.php deleted file mode 100755 index 2e7fce8e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetScore.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/zscore - * - * @author Daniele Alessandri - */ -class ZSetScore extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ZSCORE'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetUnionStore.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetUnionStore.php deleted file mode 100755 index befc5ce7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Command/ZSetUnionStore.php +++ /dev/null @@ -1,78 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Command; - -/** - * @link http://redis.io/commands/zunionstore - * - * @author Daniele Alessandri - */ -class ZSetUnionStore extends Command -{ - /** - * {@inheritdoc} - */ - public function getId() - { - return 'ZUNIONSTORE'; - } - - /** - * {@inheritdoc} - */ - protected function filterArguments(array $arguments) - { - $options = array(); - $argc = count($arguments); - - if ($argc > 2 && is_array($arguments[$argc - 1])) { - $options = $this->prepareOptions(array_pop($arguments)); - } - - if (is_array($arguments[1])) { - $arguments = array_merge( - array($arguments[0], count($arguments[1])), - $arguments[1] - ); - } - - return array_merge($arguments, $options); - } - - /** - * Returns a list of options and modifiers compatible with Redis. - * - * @param array $options List of options. - * - * @return array - */ - private function prepareOptions($options) - { - $opts = array_change_key_case($options, CASE_UPPER); - $finalizedOpts = array(); - - if (isset($opts['WEIGHTS']) && is_array($opts['WEIGHTS'])) { - $finalizedOpts[] = 'WEIGHTS'; - - foreach ($opts['WEIGHTS'] as $weight) { - $finalizedOpts[] = $weight; - } - } - - if (isset($opts['AGGREGATE'])) { - $finalizedOpts[] = 'AGGREGATE'; - $finalizedOpts[] = $opts['AGGREGATE']; - } - - return $finalizedOpts; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/CommunicationException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/CommunicationException.php deleted file mode 100755 index 13fe357c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/CommunicationException.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis; - -use Predis\Connection\NodeConnectionInterface; - -/** - * Base exception class for network-related errors. - * - * @author Daniele Alessandri - */ -abstract class CommunicationException extends PredisException -{ - private $connection; - - /** - * @param NodeConnectionInterface $connection Connection that generated the exception. - * @param string $message Error message. - * @param int $code Error code. - * @param \Exception $innerException Inner exception for wrapping the original error. - */ - public function __construct( - NodeConnectionInterface $connection, - $message = null, - $code = null, - \Exception $innerException = null - ) { - parent::__construct($message, $code, $innerException); - $this->connection = $connection; - } - - /** - * Gets the connection that generated the exception. - * - * @return NodeConnectionInterface - */ - public function getConnection() - { - return $this->connection; - } - - /** - * Indicates if the receiver should reset the underlying connection. - * - * @return bool - */ - public function shouldResetConnection() - { - return true; - } - - /** - * Helper method to handle exceptions generated by a connection object. - * - * @param CommunicationException $exception Exception. - * - * @throws CommunicationException - */ - public static function handle(CommunicationException $exception) - { - if ($exception->shouldResetConnection()) { - $connection = $exception->getConnection(); - - if ($connection->isConnected()) { - $connection->disconnect(); - } - } - - throw $exception; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ClusterOption.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ClusterOption.php deleted file mode 100755 index 69e36de7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ClusterOption.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Configuration; - -use Predis\Connection\Aggregate\ClusterInterface; -use Predis\Connection\Aggregate\PredisCluster; -use Predis\Connection\Aggregate\RedisCluster; - -/** - * Configures an aggregate connection used for clustering - * multiple Redis nodes using various implementations with - * different algorithms or strategies. - * - * @author Daniele Alessandri - */ -class ClusterOption implements OptionInterface -{ - /** - * Creates a new cluster connection from on a known descriptive name. - * - * @param OptionsInterface $options Instance of the client options. - * @param string $id Descriptive identifier of the cluster type (`predis`, `redis-cluster`) - * - * @return ClusterInterface|null - */ - protected function createByDescription(OptionsInterface $options, $id) - { - switch ($id) { - case 'predis': - case 'predis-cluster': - return new PredisCluster(); - - case 'redis': - case 'redis-cluster': - return new RedisCluster($options->connections); - - default: - return; - } - } - - /** - * {@inheritdoc} - */ - public function filter(OptionsInterface $options, $value) - { - if (is_string($value)) { - $value = $this->createByDescription($options, $value); - } - - if (!$value instanceof ClusterInterface) { - throw new \InvalidArgumentException( - "An instance of type 'Predis\Connection\Aggregate\ClusterInterface' was expected." - ); - } - - return $value; - } - - /** - * {@inheritdoc} - */ - public function getDefault(OptionsInterface $options) - { - return new PredisCluster(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ConnectionFactoryOption.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ConnectionFactoryOption.php deleted file mode 100755 index ba38df96..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ConnectionFactoryOption.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Configuration; - -use Predis\Connection\Factory; -use Predis\Connection\FactoryInterface; - -/** - * Configures a connection factory used by the client to create new connection - * instances for single Redis nodes. - * - * @author Daniele Alessandri - */ -class ConnectionFactoryOption implements OptionInterface -{ - /** - * {@inheritdoc} - */ - public function filter(OptionsInterface $options, $value) - { - if ($value instanceof FactoryInterface) { - return $value; - } elseif (is_array($value)) { - $factory = $this->getDefault($options); - - foreach ($value as $scheme => $initializer) { - $factory->define($scheme, $initializer); - } - - return $factory; - } else { - throw new \InvalidArgumentException( - 'Invalid value provided for the connections option.' - ); - } - } - - /** - * {@inheritdoc} - */ - public function getDefault(OptionsInterface $options) - { - return new Factory(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ExceptionsOption.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ExceptionsOption.php deleted file mode 100755 index 337733e4..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ExceptionsOption.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Configuration; - -/** - * Configures whether consumers (such as the client) should throw exceptions on - * Redis errors (-ERR responses) or just return instances of error responses. - * - * @author Daniele Alessandri - */ -class ExceptionsOption implements OptionInterface -{ - /** - * {@inheritdoc} - */ - public function filter(OptionsInterface $options, $value) - { - return filter_var($value, FILTER_VALIDATE_BOOLEAN); - } - - /** - * {@inheritdoc} - */ - public function getDefault(OptionsInterface $options) - { - return true; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/OptionInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/OptionInterface.php deleted file mode 100755 index b31e0c98..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/OptionInterface.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Configuration; - -/** - * Defines an handler used by Predis\Configuration\Options to filter, validate - * or return default values for a given option. - * - * @author Daniele Alessandri - */ -interface OptionInterface -{ - /** - * Filters and validates the passed value. - * - * @param OptionsInterface $options Options container. - * @param mixed $value Input value. - * - * @return mixed - */ - public function filter(OptionsInterface $options, $value); - - /** - * Returns the default value for the option. - * - * @param OptionsInterface $options Options container. - * - * @return mixed - */ - public function getDefault(OptionsInterface $options); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/Options.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/Options.php deleted file mode 100755 index 6f3b331b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/Options.php +++ /dev/null @@ -1,122 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Configuration; - -/** - * Manages Predis options with filtering, conversion and lazy initialization of - * values using a mini-DI container approach. - * - * {@inheritdoc} - * - * @author Daniele Alessandri - */ -class Options implements OptionsInterface -{ - protected $input; - protected $options; - protected $handlers; - - /** - * @param array $options Array of options with their values - */ - public function __construct(array $options = array()) - { - $this->input = $options; - $this->options = array(); - $this->handlers = $this->getHandlers(); - } - - /** - * Ensures that the default options are initialized. - * - * @return array - */ - protected function getHandlers() - { - return array( - 'cluster' => 'Predis\Configuration\ClusterOption', - 'connections' => 'Predis\Configuration\ConnectionFactoryOption', - 'exceptions' => 'Predis\Configuration\ExceptionsOption', - 'prefix' => 'Predis\Configuration\PrefixOption', - 'profile' => 'Predis\Configuration\ProfileOption', - 'replication' => 'Predis\Configuration\ReplicationOption', - ); - } - - /** - * {@inheritdoc} - */ - public function getDefault($option) - { - if (isset($this->handlers[$option])) { - $handler = $this->handlers[$option]; - $handler = new $handler(); - - return $handler->getDefault($this); - } - } - - /** - * {@inheritdoc} - */ - public function defined($option) - { - return ( - array_key_exists($option, $this->options) || - array_key_exists($option, $this->input) - ); - } - - /** - * {@inheritdoc} - */ - public function __isset($option) - { - return ( - array_key_exists($option, $this->options) || - array_key_exists($option, $this->input) - ) && $this->__get($option) !== null; - } - - /** - * {@inheritdoc} - */ - public function __get($option) - { - if (isset($this->options[$option]) || array_key_exists($option, $this->options)) { - return $this->options[$option]; - } - - if (isset($this->input[$option]) || array_key_exists($option, $this->input)) { - $value = $this->input[$option]; - unset($this->input[$option]); - - if (is_object($value) && method_exists($value, '__invoke')) { - $value = $value($this, $option); - } - - if (isset($this->handlers[$option])) { - $handler = $this->handlers[$option]; - $handler = new $handler(); - $value = $handler->filter($this, $value); - } - - return $this->options[$option] = $value; - } - - if (isset($this->handlers[$option])) { - return $this->options[$option] = $this->getDefault($option); - } - - return; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/OptionsInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/OptionsInterface.php deleted file mode 100755 index f8116470..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/OptionsInterface.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Configuration; - -/** - * Interface defining a container for client options. - * - * @property-read mixed aggregate Custom connection aggregator. - * @property-read mixed cluster Aggregate connection for clustering. - * @property-read mixed connections Connection factory. - * @property-read mixed exceptions Toggles exceptions in client for -ERR responses. - * @property-read mixed prefix Key prefixing strategy using the given prefix. - * @property-read mixed profile Server profile. - * @property-read mixed replication Aggregate connection for replication. - * - * @author Daniele Alessandri - */ -interface OptionsInterface -{ - /** - * Returns the default value for the given option. - * - * @param string $option Name of the option. - * - * @return mixed|null - */ - public function getDefault($option); - - /** - * Checks if the given option has been set by the user upon initialization. - * - * @param string $option Name of the option. - * - * @return bool - */ - public function defined($option); - - /** - * Checks if the given option has been set and does not evaluate to NULL. - * - * @param string $option Name of the option. - * - * @return bool - */ - public function __isset($option); - - /** - * Returns the value of the given option. - * - * @param string $option Name of the option. - * - * @return mixed|null - */ - public function __get($option); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/PrefixOption.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/PrefixOption.php deleted file mode 100755 index 5827cdc3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/PrefixOption.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Configuration; - -use Predis\Command\Processor\KeyPrefixProcessor; -use Predis\Command\Processor\ProcessorInterface; - -/** - * Configures a command processor that apply the specified prefix string to a - * series of Redis commands considered prefixable. - * - * @author Daniele Alessandri - */ -class PrefixOption implements OptionInterface -{ - /** - * {@inheritdoc} - */ - public function filter(OptionsInterface $options, $value) - { - if ($value instanceof ProcessorInterface) { - return $value; - } - - return new KeyPrefixProcessor($value); - } - - /** - * {@inheritdoc} - */ - public function getDefault(OptionsInterface $options) - { - // NOOP - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ProfileOption.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ProfileOption.php deleted file mode 100755 index 864936e0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ProfileOption.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Configuration; - -use Predis\Profile\Factory; -use Predis\Profile\ProfileInterface; -use Predis\Profile\RedisProfile; - -/** - * Configures the server profile to be used by the client to create command - * instances depending on the specified version of the Redis server. - * - * @author Daniele Alessandri - */ -class ProfileOption implements OptionInterface -{ - /** - * Sets the commands processors that need to be applied to the profile. - * - * @param OptionsInterface $options Client options. - * @param ProfileInterface $profile Server profile. - */ - protected function setProcessors(OptionsInterface $options, ProfileInterface $profile) - { - if (isset($options->prefix) && $profile instanceof RedisProfile) { - // NOTE: directly using __get('prefix') is actually a workaround for - // HHVM 2.3.0. It's correct and respects the options interface, it's - // just ugly. We will remove this hack when HHVM will fix re-entrant - // calls to __get() once and for all. - - $profile->setProcessor($options->__get('prefix')); - } - } - - /** - * {@inheritdoc} - */ - public function filter(OptionsInterface $options, $value) - { - if (is_string($value)) { - $value = Factory::get($value); - $this->setProcessors($options, $value); - } elseif (!$value instanceof ProfileInterface) { - throw new \InvalidArgumentException('Invalid value for the profile option.'); - } - - return $value; - } - - /** - * {@inheritdoc} - */ - public function getDefault(OptionsInterface $options) - { - $profile = Factory::getDefault(); - $this->setProcessors($options, $profile); - - return $profile; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ReplicationOption.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ReplicationOption.php deleted file mode 100755 index fd2c8108..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Configuration/ReplicationOption.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Configuration; - -use Predis\Connection\Aggregate\MasterSlaveReplication; -use Predis\Connection\Aggregate\ReplicationInterface; - -/** - * Configures an aggregate connection used for master/slave replication among - * multiple Redis nodes. - * - * @author Daniele Alessandri - */ -class ReplicationOption implements OptionInterface -{ - /** - * {@inheritdoc} - * - * @todo There's more code than needed due to a bug in filter_var() as - * discussed here https://bugs.php.net/bug.php?id=49510 and different - * behaviours when encountering NULL values on PHP 5.3. - */ - public function filter(OptionsInterface $options, $value) - { - if ($value instanceof ReplicationInterface) { - return $value; - } - - if (is_bool($value) || $value === null) { - return $value ? $this->getDefault($options) : null; - } - - if ( - !is_object($value) && - null !== $asbool = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) - ) { - return $asbool ? $this->getDefault($options) : null; - } - - throw new \InvalidArgumentException( - "An instance of type 'Predis\Connection\Aggregate\ReplicationInterface' was expected." - ); - } - - /** - * {@inheritdoc} - */ - public function getDefault(OptionsInterface $options) - { - return new MasterSlaveReplication(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/AbstractConnection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/AbstractConnection.php deleted file mode 100755 index 029a337e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/AbstractConnection.php +++ /dev/null @@ -1,239 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Connection; - -use Predis\Command\CommandInterface; -use Predis\CommunicationException; -use Predis\Protocol\ProtocolException; - -/** - * Base class with the common logic used by connection classes to communicate - * with Redis. - * - * @author Daniele Alessandri - */ -abstract class AbstractConnection implements NodeConnectionInterface -{ - private $resource; - private $cachedId; - - protected $parameters; - protected $initCommands = array(); - - /** - * @param ParametersInterface $parameters Initialization parameters for the connection. - */ - public function __construct(ParametersInterface $parameters) - { - $this->parameters = $this->assertParameters($parameters); - } - - /** - * Disconnects from the server and destroys the underlying resource when - * PHP's garbage collector kicks in. - */ - public function __destruct() - { - $this->disconnect(); - } - - /** - * Checks some of the parameters used to initialize the connection. - * - * @param ParametersInterface $parameters Initialization parameters for the connection. - * - * @throws \InvalidArgumentException - * - * @return ParametersInterface - */ - protected function assertParameters(ParametersInterface $parameters) - { - switch ($parameters->scheme) { - case 'tcp': - case 'redis': - case 'unix': - break; - - default: - throw new \InvalidArgumentException("Invalid scheme: '$parameters->scheme'."); - } - - return $parameters; - } - - /** - * Creates the underlying resource used to communicate with Redis. - * - * @return mixed - */ - abstract protected function createResource(); - - /** - * {@inheritdoc} - */ - public function isConnected() - { - return isset($this->resource); - } - - /** - * {@inheritdoc} - */ - public function connect() - { - if (!$this->isConnected()) { - $this->resource = $this->createResource(); - - return true; - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function disconnect() - { - unset($this->resource); - } - - /** - * {@inheritdoc} - */ - public function addConnectCommand(CommandInterface $command) - { - $this->initCommands[] = $command; - } - - /** - * {@inheritdoc} - */ - public function executeCommand(CommandInterface $command) - { - $this->writeRequest($command); - - return $this->readResponse($command); - } - - /** - * {@inheritdoc} - */ - public function readResponse(CommandInterface $command) - { - return $this->read(); - } - - /** - * Helper method that returns an exception message augmented with useful - * details from the connection parameters. - * - * @param string $message Error message. - * - * @return string - */ - private function createExceptionMessage($message) - { - $parameters = $this->parameters; - - if ($parameters->scheme === 'unix') { - return "$message [$parameters->scheme:$parameters->path]"; - } - - if (filter_var($parameters->host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { - return "$message [$parameters->scheme://[$parameters->host]:$parameters->port]"; - } - - return "$message [$parameters->scheme://$parameters->host:$parameters->port]"; - } - - /** - * Helper method to handle connection errors. - * - * @param string $message Error message. - * @param int $code Error code. - */ - protected function onConnectionError($message, $code = null) - { - CommunicationException::handle( - new ConnectionException($this, static::createExceptionMessage($message), $code) - ); - } - - /** - * Helper method to handle protocol errors. - * - * @param string $message Error message. - */ - protected function onProtocolError($message) - { - CommunicationException::handle( - new ProtocolException($this, static::createExceptionMessage($message)) - ); - } - - /** - * {@inheritdoc} - */ - public function getResource() - { - if (isset($this->resource)) { - return $this->resource; - } - - $this->connect(); - - return $this->resource; - } - - /** - * {@inheritdoc} - */ - public function getParameters() - { - return $this->parameters; - } - - /** - * Gets an identifier for the connection. - * - * @return string - */ - protected function getIdentifier() - { - if ($this->parameters->scheme === 'unix') { - return $this->parameters->path; - } - - return "{$this->parameters->host}:{$this->parameters->port}"; - } - - /** - * {@inheritdoc} - */ - public function __toString() - { - if (!isset($this->cachedId)) { - $this->cachedId = $this->getIdentifier(); - } - - return $this->cachedId; - } - - /** - * {@inheritdoc} - */ - public function __sleep() - { - return array('parameters', 'initCommands'); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/ClusterInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/ClusterInterface.php deleted file mode 100755 index af0f5aab..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/ClusterInterface.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Connection\Aggregate; - -use Predis\Connection\AggregateConnectionInterface; - -/** - * Defines a cluster of Redis servers formed by aggregating multiple connection - * instances to single Redis nodes. - * - * @author Daniele Alessandri - */ -interface ClusterInterface extends AggregateConnectionInterface -{ -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/MasterSlaveReplication.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/MasterSlaveReplication.php deleted file mode 100755 index 3104a753..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/MasterSlaveReplication.php +++ /dev/null @@ -1,264 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Connection\Aggregate; - -use Predis\Command\CommandInterface; -use Predis\Connection\NodeConnectionInterface; -use Predis\Replication\ReplicationStrategy; - -/** - * Aggregate connection handling replication of Redis nodes configured in a - * single master / multiple slaves setup. - * - * @author Daniele Alessandri - */ -class MasterSlaveReplication implements ReplicationInterface -{ - protected $strategy; - protected $master; - protected $slaves; - protected $current; - - /** - * {@inheritdoc} - */ - public function __construct(ReplicationStrategy $strategy = null) - { - $this->slaves = array(); - $this->strategy = $strategy ?: new ReplicationStrategy(); - } - - /** - * Checks if one master and at least one slave have been defined. - */ - protected function check() - { - if (!isset($this->master) || !$this->slaves) { - throw new \RuntimeException('Replication needs one master and at least one slave.'); - } - } - - /** - * Resets the connection state. - */ - protected function reset() - { - $this->current = null; - } - - /** - * {@inheritdoc} - */ - public function add(NodeConnectionInterface $connection) - { - $alias = $connection->getParameters()->alias; - - if ($alias === 'master') { - $this->master = $connection; - } else { - $this->slaves[$alias ?: count($this->slaves)] = $connection; - } - - $this->reset(); - } - - /** - * {@inheritdoc} - */ - public function remove(NodeConnectionInterface $connection) - { - if ($connection->getParameters()->alias === 'master') { - $this->master = null; - $this->reset(); - - return true; - } else { - if (($id = array_search($connection, $this->slaves, true)) !== false) { - unset($this->slaves[$id]); - $this->reset(); - - return true; - } - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function getConnection(CommandInterface $command) - { - if ($this->current === null) { - $this->check(); - $this->current = $this->strategy->isReadOperation($command) - ? $this->pickSlave() - : $this->master; - - return $this->current; - } - - if ($this->current === $this->master) { - return $this->current; - } - - if (!$this->strategy->isReadOperation($command)) { - $this->current = $this->master; - } - - return $this->current; - } - - /** - * {@inheritdoc} - */ - public function getConnectionById($connectionId) - { - if ($connectionId === 'master') { - return $this->master; - } - - if (isset($this->slaves[$connectionId])) { - return $this->slaves[$connectionId]; - } - - return; - } - - /** - * {@inheritdoc} - */ - public function switchTo($connection) - { - $this->check(); - - if (!$connection instanceof NodeConnectionInterface) { - $connection = $this->getConnectionById($connection); - } - if ($connection !== $this->master && !in_array($connection, $this->slaves, true)) { - throw new \InvalidArgumentException('Invalid connection or connection not found.'); - } - - $this->current = $connection; - } - - /** - * {@inheritdoc} - */ - public function getCurrent() - { - return $this->current; - } - - /** - * {@inheritdoc} - */ - public function getMaster() - { - return $this->master; - } - - /** - * {@inheritdoc} - */ - public function getSlaves() - { - return array_values($this->slaves); - } - - /** - * Returns the underlying replication strategy. - * - * @return ReplicationStrategy - */ - public function getReplicationStrategy() - { - return $this->strategy; - } - - /** - * Returns a random slave. - * - * @return NodeConnectionInterface - */ - protected function pickSlave() - { - return $this->slaves[array_rand($this->slaves)]; - } - - /** - * {@inheritdoc} - */ - public function isConnected() - { - return $this->current ? $this->current->isConnected() : false; - } - - /** - * {@inheritdoc} - */ - public function connect() - { - if ($this->current === null) { - $this->check(); - $this->current = $this->pickSlave(); - } - - $this->current->connect(); - } - - /** - * {@inheritdoc} - */ - public function disconnect() - { - if ($this->master) { - $this->master->disconnect(); - } - - foreach ($this->slaves as $connection) { - $connection->disconnect(); - } - } - - /** - * {@inheritdoc} - */ - public function writeRequest(CommandInterface $command) - { - $this->getConnection($command)->writeRequest($command); - } - - /** - * {@inheritdoc} - */ - public function readResponse(CommandInterface $command) - { - return $this->getConnection($command)->readResponse($command); - } - - /** - * {@inheritdoc} - */ - public function executeCommand(CommandInterface $command) - { - return $this->getConnection($command)->executeCommand($command); - } - - /** - * {@inheritdoc} - */ - public function __sleep() - { - return array('master', 'slaves', 'strategy'); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/PredisCluster.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/PredisCluster.php deleted file mode 100755 index 33f98bf2..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/PredisCluster.php +++ /dev/null @@ -1,235 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Connection\Aggregate; - -use Predis\Cluster\PredisStrategy; -use Predis\Cluster\StrategyInterface; -use Predis\Command\CommandInterface; -use Predis\Connection\NodeConnectionInterface; -use Predis\NotSupportedException; - -/** - * Abstraction for a cluster of aggregate connections to various Redis servers - * implementing client-side sharding based on pluggable distribution strategies. - * - * @author Daniele Alessandri - * - * @todo Add the ability to remove connections from pool. - */ -class PredisCluster implements ClusterInterface, \IteratorAggregate, \Countable -{ - private $pool; - private $strategy; - private $distributor; - - /** - * @param StrategyInterface $strategy Optional cluster strategy. - */ - public function __construct(StrategyInterface $strategy = null) - { - $this->pool = array(); - $this->strategy = $strategy ?: new PredisStrategy(); - $this->distributor = $this->strategy->getDistributor(); - } - - /** - * {@inheritdoc} - */ - public function isConnected() - { - foreach ($this->pool as $connection) { - if ($connection->isConnected()) { - return true; - } - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function connect() - { - foreach ($this->pool as $connection) { - $connection->connect(); - } - } - - /** - * {@inheritdoc} - */ - public function disconnect() - { - foreach ($this->pool as $connection) { - $connection->disconnect(); - } - } - - /** - * {@inheritdoc} - */ - public function add(NodeConnectionInterface $connection) - { - $parameters = $connection->getParameters(); - - if (isset($parameters->alias)) { - $this->pool[$parameters->alias] = $connection; - } else { - $this->pool[] = $connection; - } - - $weight = isset($parameters->weight) ? $parameters->weight : null; - $this->distributor->add($connection, $weight); - } - - /** - * {@inheritdoc} - */ - public function remove(NodeConnectionInterface $connection) - { - if (($id = array_search($connection, $this->pool, true)) !== false) { - unset($this->pool[$id]); - $this->distributor->remove($connection); - - return true; - } - - return false; - } - - /** - * Removes a connection instance using its alias or index. - * - * @param string $connectionID Alias or index of a connection. - * - * @return bool Returns true if the connection was in the pool. - */ - public function removeById($connectionID) - { - if ($connection = $this->getConnectionById($connectionID)) { - return $this->remove($connection); - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function getConnection(CommandInterface $command) - { - $slot = $this->strategy->getSlot($command); - - if (!isset($slot)) { - throw new NotSupportedException( - "Cannot use '{$command->getId()}' over clusters of connections." - ); - } - - $node = $this->distributor->getBySlot($slot); - - return $node; - } - - /** - * {@inheritdoc} - */ - public function getConnectionById($connectionID) - { - return isset($this->pool[$connectionID]) ? $this->pool[$connectionID] : null; - } - - /** - * Retrieves a connection instance from the cluster using a key. - * - * @param string $key Key string. - * - * @return NodeConnectionInterface - */ - public function getConnectionByKey($key) - { - $hash = $this->strategy->getSlotByKey($key); - $node = $this->distributor->getBySlot($hash); - - return $node; - } - - /** - * Returns the underlying command hash strategy used to hash commands by - * using keys found in their arguments. - * - * @return StrategyInterface - */ - public function getClusterStrategy() - { - return $this->strategy; - } - - /** - * {@inheritdoc} - */ - public function count() - { - return count($this->pool); - } - - /** - * {@inheritdoc} - */ - public function getIterator() - { - return new \ArrayIterator($this->pool); - } - - /** - * {@inheritdoc} - */ - public function writeRequest(CommandInterface $command) - { - $this->getConnection($command)->writeRequest($command); - } - - /** - * {@inheritdoc} - */ - public function readResponse(CommandInterface $command) - { - return $this->getConnection($command)->readResponse($command); - } - - /** - * {@inheritdoc} - */ - public function executeCommand(CommandInterface $command) - { - return $this->getConnection($command)->executeCommand($command); - } - - /** - * Executes the specified Redis command on all the nodes of a cluster. - * - * @param CommandInterface $command A Redis command. - * - * @return array - */ - public function executeCommandOnNodes(CommandInterface $command) - { - $responses = array(); - - foreach ($this->pool as $connection) { - $responses[] = $connection->executeCommand($command); - } - - return $responses; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/RedisCluster.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/RedisCluster.php deleted file mode 100755 index 337c2870..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/RedisCluster.php +++ /dev/null @@ -1,553 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Connection\Aggregate; - -use Predis\Cluster\RedisStrategy as RedisClusterStrategy; -use Predis\Cluster\StrategyInterface; -use Predis\Command\CommandInterface; -use Predis\Command\RawCommand; -use Predis\Connection\FactoryInterface; -use Predis\Connection\NodeConnectionInterface; -use Predis\NotSupportedException; -use Predis\Response\ErrorInterface as ErrorResponseInterface; - -/** - * Abstraction for a Redis-backed cluster of nodes (Redis >= 3.0.0). - * - * This connection backend offers smart support for redis-cluster by handling - * automatic slots map (re)generation upon -MOVED or -ASK responses returned by - * Redis when redirecting a client to a different node. - * - * The cluster can be pre-initialized using only a subset of the actual nodes in - * the cluster, Predis will do the rest by adjusting the slots map and creating - * the missing underlying connection instances on the fly. - * - * It is possible to pre-associate connections to a slots range with the "slots" - * parameter in the form "$first-$last". This can greatly reduce runtime node - * guessing and redirections. - * - * It is also possible to ask for the full and updated slots map directly to one - * of the nodes and optionally enable such a behaviour upon -MOVED redirections. - * Asking for the cluster configuration to Redis is actually done by issuing a - * CLUSTER SLOTS command to a random node in the pool. - * - * @author Daniele Alessandri - */ -class RedisCluster implements ClusterInterface, \IteratorAggregate, \Countable -{ - private $useClusterSlots = true; - private $defaultParameters = array(); - private $pool = array(); - private $slots = array(); - private $slotsMap; - private $strategy; - private $connections; - - /** - * @param FactoryInterface $connections Optional connection factory. - * @param StrategyInterface $strategy Optional cluster strategy. - */ - public function __construct( - FactoryInterface $connections, - StrategyInterface $strategy = null - ) { - $this->connections = $connections; - $this->strategy = $strategy ?: new RedisClusterStrategy(); - } - - /** - * {@inheritdoc} - */ - public function isConnected() - { - foreach ($this->pool as $connection) { - if ($connection->isConnected()) { - return true; - } - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function connect() - { - if ($connection = $this->getRandomConnection()) { - $connection->connect(); - } - } - - /** - * {@inheritdoc} - */ - public function disconnect() - { - foreach ($this->pool as $connection) { - $connection->disconnect(); - } - } - - /** - * {@inheritdoc} - */ - public function add(NodeConnectionInterface $connection) - { - $this->pool[(string) $connection] = $connection; - unset($this->slotsMap); - } - - /** - * {@inheritdoc} - */ - public function remove(NodeConnectionInterface $connection) - { - if (false !== $id = array_search($connection, $this->pool, true)) { - unset( - $this->pool[$id], - $this->slotsMap - ); - - return true; - } - - return false; - } - - /** - * Removes a connection instance by using its identifier. - * - * @param string $connectionID Connection identifier. - * - * @return bool True if the connection was in the pool. - */ - public function removeById($connectionID) - { - if (isset($this->pool[$connectionID])) { - unset( - $this->pool[$connectionID], - $this->slotsMap - ); - - return true; - } - - return false; - } - - /** - * Generates the current slots map by guessing the cluster configuration out - * of the connection parameters of the connections in the pool. - * - * Generation is based on the same algorithm used by Redis to generate the - * cluster, so it is most effective when all of the connections supplied on - * initialization have the "slots" parameter properly set accordingly to the - * current cluster configuration. - */ - public function buildSlotsMap() - { - $this->slotsMap = array(); - - foreach ($this->pool as $connectionID => $connection) { - $parameters = $connection->getParameters(); - - if (!isset($parameters->slots)) { - continue; - } - - $slots = explode('-', $parameters->slots, 2); - $this->setSlots($slots[0], $slots[1], $connectionID); - } - } - - /** - * Generates an updated slots map fetching the cluster configuration using - * the CLUSTER SLOTS command against the specified node or a random one from - * the pool. - * - * @param NodeConnectionInterface $connection Optional connection instance. - * - * @return array - */ - public function askSlotsMap(NodeConnectionInterface $connection = null) - { - if (!$connection && !$connection = $this->getRandomConnection()) { - return array(); - } - - $command = RawCommand::create('CLUSTER', 'SLOTS'); - $response = $connection->executeCommand($command); - - foreach ($response as $slots) { - // We only support master servers for now, so we ignore subsequent - // elements in the $slots array identifying slaves. - list($start, $end, $master) = $slots; - - if ($master[0] === '') { - $this->setSlots($start, $end, (string) $connection); - } else { - $this->setSlots($start, $end, "{$master[0]}:{$master[1]}"); - } - } - - return $this->slotsMap; - } - - /** - * Returns the current slots map for the cluster. - * - * @return array - */ - public function getSlotsMap() - { - if (!isset($this->slotsMap)) { - $this->slotsMap = array(); - } - - return $this->slotsMap; - } - - /** - * Pre-associates a connection to a slots range to avoid runtime guessing. - * - * @param int $first Initial slot of the range. - * @param int $last Last slot of the range. - * @param NodeConnectionInterface|string $connection ID or connection instance. - * - * @throws \OutOfBoundsException - */ - public function setSlots($first, $last, $connection) - { - if ($first < 0x0000 || $first > 0x3FFF || - $last < 0x0000 || $last > 0x3FFF || - $last < $first - ) { - throw new \OutOfBoundsException( - "Invalid slot range for $connection: [$first-$last]." - ); - } - - $slots = array_fill($first, $last - $first + 1, (string) $connection); - $this->slotsMap = $this->getSlotsMap() + $slots; - } - - /** - * Guesses the correct node associated to a given slot using a precalculated - * slots map, falling back to the same logic used by Redis to initialize a - * cluster (best-effort). - * - * @param int $slot Slot index. - * - * @return string Connection ID. - */ - protected function guessNode($slot) - { - if (!isset($this->slotsMap)) { - $this->buildSlotsMap(); - } - - if (isset($this->slotsMap[$slot])) { - return $this->slotsMap[$slot]; - } - - $count = count($this->pool); - $index = min((int) ($slot / (int) (16384 / $count)), $count - 1); - $nodes = array_keys($this->pool); - - return $nodes[$index]; - } - - /** - * Creates a new connection instance from the given connection ID. - * - * @param string $connectionID Identifier for the connection. - * - * @return NodeConnectionInterface - */ - protected function createConnection($connectionID) - { - $separator = strrpos($connectionID, ':'); - - $parameters = array_merge($this->defaultParameters, array( - 'host' => substr($connectionID, 0, $separator), - 'port' => substr($connectionID, $separator + 1), - )); - - $connection = $this->connections->create($parameters); - - return $connection; - } - - /** - * {@inheritdoc} - */ - public function getConnection(CommandInterface $command) - { - $slot = $this->strategy->getSlot($command); - - if (!isset($slot)) { - throw new NotSupportedException( - "Cannot use '{$command->getId()}' with redis-cluster." - ); - } - - if (isset($this->slots[$slot])) { - return $this->slots[$slot]; - } else { - return $this->getConnectionBySlot($slot); - } - } - - /** - * Returns the connection currently associated to a given slot. - * - * @param int $slot Slot index. - * - * @throws \OutOfBoundsException - * - * @return NodeConnectionInterface - */ - public function getConnectionBySlot($slot) - { - if ($slot < 0x0000 || $slot > 0x3FFF) { - throw new \OutOfBoundsException("Invalid slot [$slot]."); - } - - if (isset($this->slots[$slot])) { - return $this->slots[$slot]; - } - - $connectionID = $this->guessNode($slot); - - if (!$connection = $this->getConnectionById($connectionID)) { - $connection = $this->createConnection($connectionID); - $this->pool[$connectionID] = $connection; - } - - return $this->slots[$slot] = $connection; - } - - /** - * {@inheritdoc} - */ - public function getConnectionById($connectionID) - { - if (isset($this->pool[$connectionID])) { - return $this->pool[$connectionID]; - } - } - - /** - * Returns a random connection from the pool. - * - * @return NodeConnectionInterface|null - */ - protected function getRandomConnection() - { - if ($this->pool) { - return $this->pool[array_rand($this->pool)]; - } - } - - /** - * Permanently associates the connection instance to a new slot. - * The connection is added to the connections pool if not yet included. - * - * @param NodeConnectionInterface $connection Connection instance. - * @param int $slot Target slot index. - */ - protected function move(NodeConnectionInterface $connection, $slot) - { - $this->pool[(string) $connection] = $connection; - $this->slots[(int) $slot] = $connection; - } - - /** - * Handles -ERR responses returned by Redis. - * - * @param CommandInterface $command Command that generated the -ERR response. - * @param ErrorResponseInterface $error Redis error response object. - * - * @return mixed - */ - protected function onErrorResponse(CommandInterface $command, ErrorResponseInterface $error) - { - $details = explode(' ', $error->getMessage(), 2); - - switch ($details[0]) { - case 'MOVED': - return $this->onMovedResponse($command, $details[1]); - - case 'ASK': - return $this->onAskResponse($command, $details[1]); - - default: - return $error; - } - } - - /** - * Handles -MOVED responses by executing again the command against the node - * indicated by the Redis response. - * - * @param CommandInterface $command Command that generated the -MOVED response. - * @param string $details Parameters of the -MOVED response. - * - * @return mixed - */ - protected function onMovedResponse(CommandInterface $command, $details) - { - list($slot, $connectionID) = explode(' ', $details, 2); - - if (!$connection = $this->getConnectionById($connectionID)) { - $connection = $this->createConnection($connectionID); - } - - if ($this->useClusterSlots) { - $this->askSlotsMap($connection); - } - - $this->move($connection, $slot); - $response = $this->executeCommand($command); - - return $response; - } - - /** - * Handles -ASK responses by executing again the command against the node - * indicated by the Redis response. - * - * @param CommandInterface $command Command that generated the -ASK response. - * @param string $details Parameters of the -ASK response. - * - * @return mixed - */ - protected function onAskResponse(CommandInterface $command, $details) - { - list($slot, $connectionID) = explode(' ', $details, 2); - - if (!$connection = $this->getConnectionById($connectionID)) { - $connection = $this->createConnection($connectionID); - } - - $connection->executeCommand(RawCommand::create('ASKING')); - $response = $connection->executeCommand($command); - - return $response; - } - - /** - * {@inheritdoc} - */ - public function writeRequest(CommandInterface $command) - { - $this->getConnection($command)->writeRequest($command); - } - - /** - * {@inheritdoc} - */ - public function readResponse(CommandInterface $command) - { - return $this->getConnection($command)->readResponse($command); - } - - /** - * {@inheritdoc} - */ - public function executeCommand(CommandInterface $command) - { - $connection = $this->getConnection($command); - $response = $connection->executeCommand($command); - - if ($response instanceof ErrorResponseInterface) { - return $this->onErrorResponse($command, $response); - } - - return $response; - } - - /** - * {@inheritdoc} - */ - public function count() - { - return count($this->pool); - } - - /** - * {@inheritdoc} - */ - public function getIterator() - { - return new \ArrayIterator(array_values($this->pool)); - } - - /** - * Returns the underlying command hash strategy used to hash commands by - * using keys found in their arguments. - * - * @return StrategyInterface - */ - public function getClusterStrategy() - { - return $this->strategy; - } - - /** - * Returns the underlying connection factory used to create new connection - * instances to Redis nodes indicated by redis-cluster. - * - * @return FactoryInterface - */ - public function getConnectionFactory() - { - return $this->connections; - } - - /** - * Enables automatic fetching of the current slots map from one of the nodes - * using the CLUSTER SLOTS command. This option is disabled by default but - * asking the current slots map to Redis upon -MOVED responses may reduce - * overhead by eliminating the trial-and-error nature of the node guessing - * procedure, mostly when targeting many keys that would end up in a lot of - * redirections. - * - * The slots map can still be manually fetched using the askSlotsMap() - * method whether or not this option is enabled. - * - * @param bool $value Enable or disable the use of CLUSTER SLOTS. - */ - public function useClusterSlots($value) - { - $this->useClusterSlots = (bool) $value; - } - - /** - * Sets a default array of connection parameters to be applied when creating - * new connection instances on the fly when they are not part of the initial - * pool supplied upon cluster initialization. - * - * These parameters are not applied to connections added to the pool using - * the add() method. - * - * @param array $parameters Array of connection parameters. - */ - public function setDefaultParameters(array $parameters) - { - $this->defaultParameters = array_merge( - $this->defaultParameters, - $parameters ?: array() - ); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/ReplicationInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/ReplicationInterface.php deleted file mode 100755 index e09e8265..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Aggregate/ReplicationInterface.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Connection\Aggregate; - -use Predis\Connection\AggregateConnectionInterface; -use Predis\Connection\NodeConnectionInterface; - -/** - * Defines a group of Redis nodes in a master / slave replication setup. - * - * @author Daniele Alessandri - */ -interface ReplicationInterface extends AggregateConnectionInterface -{ - /** - * Switches the internal connection instance in use. - * - * @param string $connection Alias of a connection - */ - public function switchTo($connection); - - /** - * Returns the connection instance currently in use by the aggregate - * connection. - * - * @return NodeConnectionInterface - */ - public function getCurrent(); - - /** - * Returns the connection instance for the master Redis node. - * - * @return NodeConnectionInterface - */ - public function getMaster(); - - /** - * Returns a list of connection instances to slave nodes. - * - * @return NodeConnectionInterface - */ - public function getSlaves(); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/AggregateConnectionInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/AggregateConnectionInterface.php deleted file mode 100755 index 7eeaede7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/AggregateConnectionInterface.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Connection; - -use Predis\Command\CommandInterface; - -/** - * Defines a virtual connection composed of multiple connection instances to - * single Redis nodes. - * - * @author Daniele Alessandri - */ -interface AggregateConnectionInterface extends ConnectionInterface -{ - /** - * Adds a connection instance to the aggregate connection. - * - * @param NodeConnectionInterface $connection Connection instance. - */ - public function add(NodeConnectionInterface $connection); - - /** - * Removes the specified connection instance from the aggregate connection. - * - * @param NodeConnectionInterface $connection Connection instance. - * - * @return bool Returns true if the connection was in the pool. - */ - public function remove(NodeConnectionInterface $connection); - - /** - * Returns the connection instance in charge for the given command. - * - * @param CommandInterface $command Command instance. - * - * @return NodeConnectionInterface - */ - public function getConnection(CommandInterface $command); - - /** - * Returns a connection instance from the aggregate connection by its alias. - * - * @param string $connectionID Connection alias. - * - * @return NodeConnectionInterface|null - */ - public function getConnectionById($connectionID); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/CompositeConnectionInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/CompositeConnectionInterface.php deleted file mode 100755 index 286e082c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/CompositeConnectionInterface.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Connection; - -/** - * Defines a connection to communicate with a single Redis server that leverages - * an external protocol processor to handle pluggable protocol handlers. - * - * @author Daniele Alessandri - */ -interface CompositeConnectionInterface extends NodeConnectionInterface -{ - /** - * Returns the protocol processor used by the connection. - */ - public function getProtocol(); - - /** - * Writes the buffer containing over the connection. - * - * @param string $buffer String buffer to be sent over the connection. - */ - public function writeBuffer($buffer); - - /** - * Reads the given number of bytes from the connection. - * - * @param int $length Number of bytes to read from the connection. - * - * @return string - */ - public function readBuffer($length); - - /** - * Reads a line from the connection. - * - * @param string - */ - public function readLine(); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/CompositeStreamConnection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/CompositeStreamConnection.php deleted file mode 100755 index 7a353405..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/CompositeStreamConnection.php +++ /dev/null @@ -1,125 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Connection; - -use Predis\Command\CommandInterface; -use Predis\Protocol\ProtocolProcessorInterface; -use Predis\Protocol\Text\ProtocolProcessor as TextProtocolProcessor; - -/** - * Connection abstraction to Redis servers based on PHP's stream that uses an - * external protocol processor defining the protocol used for the communication. - * - * @author Daniele Alessandri - */ -class CompositeStreamConnection extends StreamConnection implements CompositeConnectionInterface -{ - protected $protocol; - - /** - * @param ParametersInterface $parameters Initialization parameters for the connection. - * @param ProtocolProcessorInterface $protocol Protocol processor. - */ - public function __construct( - ParametersInterface $parameters, - ProtocolProcessorInterface $protocol = null - ) { - $this->parameters = $this->assertParameters($parameters); - $this->protocol = $protocol ?: new TextProtocolProcessor(); - } - - /** - * {@inheritdoc} - */ - public function getProtocol() - { - return $this->protocol; - } - - /** - * {@inheritdoc} - */ - public function writeBuffer($buffer) - { - $this->write($buffer); - } - - /** - * {@inheritdoc} - */ - public function readBuffer($length) - { - if ($length <= 0) { - throw new \InvalidArgumentException('Length parameter must be greater than 0.'); - } - - $value = ''; - $socket = $this->getResource(); - - do { - $chunk = fread($socket, $length); - - if ($chunk === false || $chunk === '') { - $this->onConnectionError('Error while reading bytes from the server.'); - } - - $value .= $chunk; - } while (($length -= strlen($chunk)) > 0); - - return $value; - } - - /** - * {@inheritdoc} - */ - public function readLine() - { - $value = ''; - $socket = $this->getResource(); - - do { - $chunk = fgets($socket); - - if ($chunk === false || $chunk === '') { - $this->onConnectionError('Error while reading line from the server.'); - } - - $value .= $chunk; - } while (substr($value, -2) !== "\r\n"); - - return substr($value, 0, -2); - } - - /** - * {@inheritdoc} - */ - public function writeRequest(CommandInterface $command) - { - $this->protocol->write($this, $command); - } - - /** - * {@inheritdoc} - */ - public function read() - { - return $this->protocol->read($this); - } - - /** - * {@inheritdoc} - */ - public function __sleep() - { - return array_merge(parent::__sleep(), array('protocol')); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ConnectionException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ConnectionException.php deleted file mode 100755 index ef2e9d73..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ConnectionException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Connection; - -use Predis\CommunicationException; - -/** - * Exception class that identifies connection-related errors. - * - * @author Daniele Alessandri - */ -class ConnectionException extends CommunicationException -{ -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ConnectionInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ConnectionInterface.php deleted file mode 100755 index 11ace1b6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ConnectionInterface.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Connection; - -use Predis\Command\CommandInterface; - -/** - * Defines a connection object used to communicate with one or multiple - * Redis servers. - * - * @author Daniele Alessandri - */ -interface ConnectionInterface -{ - /** - * Opens the connection to Redis. - */ - public function connect(); - - /** - * Closes the connection to Redis. - */ - public function disconnect(); - - /** - * Checks if the connection to Redis is considered open. - * - * @return bool - */ - public function isConnected(); - - /** - * Writes the request for the given command over the connection. - * - * @param CommandInterface $command Command instance. - */ - public function writeRequest(CommandInterface $command); - - /** - * Reads the response to the given command from the connection. - * - * @param CommandInterface $command Command instance. - * - * @return mixed - */ - public function readResponse(CommandInterface $command); - - /** - * Writes a request for the given command over the connection and reads back - * the response returned by Redis. - * - * @param CommandInterface $command Command instance. - * - * @return mixed - */ - public function executeCommand(CommandInterface $command); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Factory.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Factory.php deleted file mode 100755 index c2e93f88..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Factory.php +++ /dev/null @@ -1,151 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Connection; - -use Predis\Command\RawCommand; - -/** - * Standard connection factory for creating connections to Redis nodes. - * - * @author Daniele Alessandri - */ -class Factory implements FactoryInterface -{ - protected $schemes = array( - 'tcp' => 'Predis\Connection\StreamConnection', - 'unix' => 'Predis\Connection\StreamConnection', - 'redis' => 'Predis\Connection\StreamConnection', - 'http' => 'Predis\Connection\WebdisConnection', - ); - - /** - * Checks if the provided argument represents a valid connection class - * implementing Predis\Connection\NodeConnectionInterface. Optionally, - * callable objects are used for lazy initialization of connection objects. - * - * @param mixed $initializer FQN of a connection class or a callable for lazy initialization. - * - * @throws \InvalidArgumentException - * - * @return mixed - */ - protected function checkInitializer($initializer) - { - if (is_callable($initializer)) { - return $initializer; - } - - $class = new \ReflectionClass($initializer); - - if (!$class->isSubclassOf('Predis\Connection\NodeConnectionInterface')) { - throw new \InvalidArgumentException( - 'A connection initializer must be a valid connection class or a callable object.' - ); - } - - return $initializer; - } - - /** - * {@inheritdoc} - */ - public function define($scheme, $initializer) - { - $this->schemes[$scheme] = $this->checkInitializer($initializer); - } - - /** - * {@inheritdoc} - */ - public function undefine($scheme) - { - unset($this->schemes[$scheme]); - } - - /** - * {@inheritdoc} - */ - public function create($parameters) - { - if (!$parameters instanceof ParametersInterface) { - $parameters = $this->createParameters($parameters); - } - - $scheme = $parameters->scheme; - - if (!isset($this->schemes[$scheme])) { - throw new \InvalidArgumentException("Unknown connection scheme: '$scheme'."); - } - - $initializer = $this->schemes[$scheme]; - - if (is_callable($initializer)) { - $connection = call_user_func($initializer, $parameters, $this); - } else { - $connection = new $initializer($parameters); - $this->prepareConnection($connection); - } - - if (!$connection instanceof NodeConnectionInterface) { - throw new \UnexpectedValueException( - 'Objects returned by connection initializers must implement '. - "'Predis\Connection\NodeConnectionInterface'." - ); - } - - return $connection; - } - - /** - * {@inheritdoc} - */ - public function aggregate(AggregateConnectionInterface $connection, array $parameters) - { - foreach ($parameters as $node) { - $connection->add($node instanceof NodeConnectionInterface ? $node : $this->create($node)); - } - } - - /** - * Creates a connection parameters instance from the supplied argument. - * - * @param mixed $parameters Original connection parameters. - * - * @return ParametersInterface - */ - protected function createParameters($parameters) - { - return Parameters::create($parameters); - } - - /** - * Prepares a connection instance after its initialization. - * - * @param NodeConnectionInterface $connection Connection instance. - */ - protected function prepareConnection(NodeConnectionInterface $connection) - { - $parameters = $connection->getParameters(); - - if (isset($parameters->password)) { - $connection->addConnectCommand( - new RawCommand(array('AUTH', $parameters->password)) - ); - } - - if (isset($parameters->database)) { - $connection->addConnectCommand( - new RawCommand(array('SELECT', $parameters->database)) - ); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/FactoryInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/FactoryInterface.php deleted file mode 100755 index 2bae0839..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/FactoryInterface.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Connection; - -/** - * Interface for classes providing a factory of connections to Redis nodes. - * - * @author Daniele Alessandri - */ -interface FactoryInterface -{ - /** - * Defines or overrides the connection class identified by a scheme prefix. - * - * @param string $scheme Target connection scheme. - * @param mixed $initializer Fully-qualified name of a class or a callable for lazy initialization. - */ - public function define($scheme, $initializer); - - /** - * Undefines the connection identified by a scheme prefix. - * - * @param string $scheme Target connection scheme. - */ - public function undefine($scheme); - - /** - * Creates a new connection object. - * - * @param mixed $parameters Initialization parameters for the connection. - * - * @return NodeConnectionInterface - */ - public function create($parameters); - - /** - * Aggregates single connections into an aggregate connection instance. - * - * @param AggregateConnectionInterface $aggregate Aggregate connection instance. - * @param array $parameters List of parameters for each connection. - */ - public function aggregate(AggregateConnectionInterface $aggregate, array $parameters); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/NodeConnectionInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/NodeConnectionInterface.php deleted file mode 100755 index 665b862c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/NodeConnectionInterface.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Connection; - -use Predis\Command\CommandInterface; - -/** - * Defines a connection used to communicate with a single Redis node. - * - * @author Daniele Alessandri - */ -interface NodeConnectionInterface extends ConnectionInterface -{ - /** - * Returns a string representation of the connection. - * - * @return string - */ - public function __toString(); - - /** - * Returns the underlying resource used to communicate with Redis. - * - * @return mixed - */ - public function getResource(); - - /** - * Returns the parameters used to initialize the connection. - * - * @return ParametersInterface - */ - public function getParameters(); - - /** - * Pushes the given command into a queue of commands executed when - * establishing the actual connection to Redis. - * - * @param CommandInterface $command Instance of a Redis command. - */ - public function addConnectCommand(CommandInterface $command); - - /** - * Reads a response from the server. - * - * @return mixed - */ - public function read(); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Parameters.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Parameters.php deleted file mode 100755 index b7d98615..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/Parameters.php +++ /dev/null @@ -1,176 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Connection; - -/** - * Container for connection parameters used to initialize connections to Redis. - * - * {@inheritdoc} - * - * @author Daniele Alessandri - */ -class Parameters implements ParametersInterface -{ - private $parameters; - - private static $defaults = array( - 'scheme' => 'tcp', - 'host' => '127.0.0.1', - 'port' => 6379, - 'timeout' => 5.0, - ); - - /** - * @param array $parameters Named array of connection parameters. - */ - public function __construct(array $parameters = array()) - { - $this->parameters = $this->filter($parameters) + $this->getDefaults(); - } - - /** - * Returns some default parameters with their values. - * - * @return array - */ - protected function getDefaults() - { - return self::$defaults; - } - - /** - * Creates a new instance by supplying the initial parameters either in the - * form of an URI string or a named array. - * - * @param array|string $parameters Set of connection parameters. - * - * @return Parameters - */ - public static function create($parameters) - { - if (is_string($parameters)) { - $parameters = static::parse($parameters); - } - - return new static($parameters ?: array()); - } - - /** - * Parses an URI string returning an array of connection parameters. - * - * When using the "redis" and "rediss" schemes the URI is parsed according - * to the rules defined by the provisional registration documents approved - * by IANA. If the URI has a password in its "user-information" part or a - * database number in the "path" part these values override the values of - * "password" and "database" if they are present in the "query" part. - * - * @link http://www.iana.org/assignments/uri-schemes/prov/redis - * @link http://www.iana.org/assignments/uri-schemes/prov/redis - * - * @param string $uri URI string. - * - * @throws \InvalidArgumentException - * - * @return array - */ - public static function parse($uri) - { - if (stripos($uri, 'unix') === 0) { - // Hack to support URIs for UNIX sockets with minimal effort. - $uri = str_ireplace('unix:///', 'unix://localhost/', $uri); - } - - if (!$parsed = parse_url($uri)) { - throw new \InvalidArgumentException("Invalid parameters URI: $uri"); - } - - if ( - isset($parsed['host']) - && false !== strpos($parsed['host'], '[') - && false !== strpos($parsed['host'], ']') - ) { - $parsed['host'] = substr($parsed['host'], 1, -1); - } - - if (isset($parsed['query'])) { - parse_str($parsed['query'], $queryarray); - unset($parsed['query']); - - $parsed = array_merge($parsed, $queryarray); - } - - if (stripos($uri, 'redis') === 0) { - if (isset($parsed['pass'])) { - $parsed['password'] = $parsed['pass']; - unset($parsed['pass']); - } - - if (isset($parsed['path']) && preg_match('/^\/(\d+)(\/.*)?/', $parsed['path'], $path)) { - $parsed['database'] = $path[1]; - - if (isset($path[2])) { - $parsed['path'] = $path[2]; - } else { - unset($parsed['path']); - } - } - } - - return $parsed; - } - - /** - * Validates and converts each value of the connection parameters array. - * - * @param array $parameters Connection parameters. - * - * @return array - */ - protected function filter(array $parameters) - { - return $parameters ?: array(); - } - - /** - * {@inheritdoc} - */ - public function __get($parameter) - { - if (isset($this->parameters[$parameter])) { - return $this->parameters[$parameter]; - } - } - - /** - * {@inheritdoc} - */ - public function __isset($parameter) - { - return isset($this->parameters[$parameter]); - } - - /** - * {@inheritdoc} - */ - public function toArray() - { - return $this->parameters; - } - - /** - * {@inheritdoc} - */ - public function __sleep() - { - return array('parameters'); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ParametersInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ParametersInterface.php deleted file mode 100755 index fd8a908e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/ParametersInterface.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Connection; - -/** - * Interface defining a container for connection parameters. - * - * The actual list of connection parameters depends on the features supported by - * each connection backend class (please refer to their specific documentation), - * but the most common parameters used through the library are: - * - * @property-read string scheme Connection scheme, such as 'tcp' or 'unix'. - * @property-read string host IP address or hostname of Redis. - * @property-read int port TCP port on which Redis is listening to. - * @property-read string path Path of a UNIX domain socket file. - * @property-read string alias Alias for the connection. - * @property-read float timeout Timeout for the connect() operation. - * @property-read float read_write_timeout Timeout for read() and write() operations. - * @property-read bool async_connect Performs the connect() operation asynchronously. - * @property-read bool tcp_nodelay Toggles the Nagle's algorithm for coalescing. - * @property-read bool persistent Leaves the connection open after a GC collection. - * @property-read string password Password to access Redis (see the AUTH command). - * @property-read string database Database index (see the SELECT command). - * - * @author Daniele Alessandri - */ -interface ParametersInterface -{ - /** - * Checks if the specified parameters is set. - * - * @param string $parameter Name of the parameter. - * - * @return bool - */ - public function __isset($parameter); - - /** - * Returns the value of the specified parameter. - * - * @param string $parameter Name of the parameter. - * - * @return mixed|null - */ - public function __get($parameter); - - /** - * Returns an array representation of the connection parameters. - * - * @return array - */ - public function toArray(); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/PhpiredisSocketConnection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/PhpiredisSocketConnection.php deleted file mode 100755 index 6948f035..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/PhpiredisSocketConnection.php +++ /dev/null @@ -1,393 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Connection; - -use Predis\Command\CommandInterface; -use Predis\NotSupportedException; -use Predis\Response\Error as ErrorResponse; -use Predis\Response\Status as StatusResponse; - -/** - * This class provides the implementation of a Predis connection that uses the - * PHP socket extension for network communication and wraps the phpiredis C - * extension (PHP bindings for hiredis) to parse the Redis protocol. - * - * This class is intended to provide an optional low-overhead alternative for - * processing responses from Redis compared to the standard pure-PHP classes. - * Differences in speed when dealing with short inline responses are practically - * nonexistent, the actual speed boost is for big multibulk responses when this - * protocol processor can parse and return responses very fast. - * - * For instructions on how to build and install the phpiredis extension, please - * consult the repository of the project. - * - * The connection parameters supported by this class are: - * - * - scheme: it can be either 'redis', 'tcp' or 'unix'. - * - host: hostname or IP address of the server. - * - port: TCP port of the server. - * - path: path of a UNIX domain socket when scheme is 'unix'. - * - timeout: timeout to perform the connection. - * - read_write_timeout: timeout of read / write operations. - * - * @link http://github.com/nrk/phpiredis - * - * @author Daniele Alessandri - */ -class PhpiredisSocketConnection extends AbstractConnection -{ - private $reader; - - /** - * {@inheritdoc} - */ - public function __construct(ParametersInterface $parameters) - { - $this->assertExtensions(); - - parent::__construct($parameters); - - $this->reader = $this->createReader(); - } - - /** - * Disconnects from the server and destroys the underlying resource and the - * protocol reader resource when PHP's garbage collector kicks in. - */ - public function __destruct() - { - phpiredis_reader_destroy($this->reader); - - parent::__destruct(); - } - - /** - * Checks if the socket and phpiredis extensions are loaded in PHP. - */ - protected function assertExtensions() - { - if (!extension_loaded('sockets')) { - throw new NotSupportedException( - 'The "sockets" extension is required by this connection backend.' - ); - } - - if (!extension_loaded('phpiredis')) { - throw new NotSupportedException( - 'The "phpiredis" extension is required by this connection backend.' - ); - } - } - - /** - * {@inheritdoc} - */ - protected function assertParameters(ParametersInterface $parameters) - { - parent::assertParameters($parameters); - - if (isset($parameters->persistent)) { - throw new NotSupportedException( - 'Persistent connections are not supported by this connection backend.' - ); - } - - return $parameters; - } - - /** - * Creates a new instance of the protocol reader resource. - * - * @return resource - */ - private function createReader() - { - $reader = phpiredis_reader_create(); - - phpiredis_reader_set_status_handler($reader, $this->getStatusHandler()); - phpiredis_reader_set_error_handler($reader, $this->getErrorHandler()); - - return $reader; - } - - /** - * Returns the underlying protocol reader resource. - * - * @return resource - */ - protected function getReader() - { - return $this->reader; - } - - /** - * Returns the handler used by the protocol reader for inline responses. - * - * @return \Closure - */ - private function getStatusHandler() - { - return function ($payload) { - return StatusResponse::get($payload); - }; - } - - /** - * Returns the handler used by the protocol reader for error responses. - * - * @return \Closure - */ - protected function getErrorHandler() - { - return function ($payload) { - return new ErrorResponse($payload); - }; - } - - /** - * Helper method used to throw exceptions on socket errors. - */ - private function emitSocketError() - { - $errno = socket_last_error(); - $errstr = socket_strerror($errno); - - $this->disconnect(); - - $this->onConnectionError(trim($errstr), $errno); - } - - /** - * Gets the address of an host from connection parameters. - * - * @param ParametersInterface $parameters Parameters used to initialize the connection. - * - * @return string - */ - protected static function getAddress(ParametersInterface $parameters) - { - if (filter_var($host = $parameters->host, FILTER_VALIDATE_IP)) { - return $host; - } - - if ($host === $address = gethostbyname($host)) { - return false; - } - - return $address; - } - - /** - * {@inheritdoc} - */ - protected function createResource() - { - $parameters = $this->parameters; - - if ($parameters->scheme === 'unix') { - $address = $parameters->path; - $domain = AF_UNIX; - $protocol = 0; - } else { - if (false === $address = self::getAddress($parameters)) { - $this->onConnectionError("Cannot resolve the address of '$parameters->host'."); - } - - $domain = filter_var($address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) ? AF_INET6 : AF_INET; - $protocol = SOL_TCP; - } - - $socket = @socket_create($domain, SOCK_STREAM, $protocol); - - if (!is_resource($socket)) { - $this->emitSocketError(); - } - - $this->setSocketOptions($socket, $parameters); - $this->connectWithTimeout($socket, $address, $parameters); - - return $socket; - } - - /** - * Sets options on the socket resource from the connection parameters. - * - * @param resource $socket Socket resource. - * @param ParametersInterface $parameters Parameters used to initialize the connection. - */ - private function setSocketOptions($socket, ParametersInterface $parameters) - { - if ($parameters->scheme !== 'unix') { - if (!socket_set_option($socket, SOL_TCP, TCP_NODELAY, 1)) { - $this->emitSocketError(); - } - - if (!socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)) { - $this->emitSocketError(); - } - } - - if (isset($parameters->read_write_timeout)) { - $rwtimeout = (float) $parameters->read_write_timeout; - $timeoutSec = floor($rwtimeout); - $timeoutUsec = ($rwtimeout - $timeoutSec) * 1000000; - - $timeout = array( - 'sec' => $timeoutSec, - 'usec' => $timeoutUsec, - ); - - if (!socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, $timeout)) { - $this->emitSocketError(); - } - - if (!socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeout)) { - $this->emitSocketError(); - } - } - } - - /** - * Opens the actual connection to the server with a timeout. - * - * @param resource $socket Socket resource. - * @param string $address IP address (DNS-resolved from hostname) - * @param ParametersInterface $parameters Parameters used to initialize the connection. - * - * @return string - */ - private function connectWithTimeout($socket, $address, ParametersInterface $parameters) - { - socket_set_nonblock($socket); - - if (@socket_connect($socket, $address, (int) $parameters->port) === false) { - $error = socket_last_error(); - - if ($error != SOCKET_EINPROGRESS && $error != SOCKET_EALREADY) { - $this->emitSocketError(); - } - } - - socket_set_block($socket); - - $null = null; - $selectable = array($socket); - - $timeout = (float) $parameters->timeout; - $timeoutSecs = floor($timeout); - $timeoutUSecs = ($timeout - $timeoutSecs) * 1000000; - - $selected = socket_select($selectable, $selectable, $null, $timeoutSecs, $timeoutUSecs); - - if ($selected === 2) { - $this->onConnectionError('Connection refused.', SOCKET_ECONNREFUSED); - } - - if ($selected === 0) { - $this->onConnectionError('Connection timed out.', SOCKET_ETIMEDOUT); - } - - if ($selected === false) { - $this->emitSocketError(); - } - } - - /** - * {@inheritdoc} - */ - public function connect() - { - if (parent::connect() && $this->initCommands) { - foreach ($this->initCommands as $command) { - $this->executeCommand($command); - } - } - } - - /** - * {@inheritdoc} - */ - public function disconnect() - { - if ($this->isConnected()) { - socket_close($this->getResource()); - parent::disconnect(); - } - } - - /** - * {@inheritdoc} - */ - protected function write($buffer) - { - $socket = $this->getResource(); - - while (($length = strlen($buffer)) > 0) { - $written = socket_write($socket, $buffer, $length); - - if ($length === $written) { - return; - } - - if ($written === false) { - $this->onConnectionError('Error while writing bytes to the server.'); - } - - $buffer = substr($buffer, $written); - } - } - - /** - * {@inheritdoc} - */ - public function read() - { - $socket = $this->getResource(); - $reader = $this->reader; - - while (PHPIREDIS_READER_STATE_INCOMPLETE === $state = phpiredis_reader_get_state($reader)) { - if (@socket_recv($socket, $buffer, 4096, 0) === false || $buffer === '' || $buffer === null) { - $this->emitSocketError(); - } - - phpiredis_reader_feed($reader, $buffer); - } - - if ($state === PHPIREDIS_READER_STATE_COMPLETE) { - return phpiredis_reader_get_reply($reader); - } else { - $this->onProtocolError(phpiredis_reader_get_error($reader)); - - return; - } - } - - /** - * {@inheritdoc} - */ - public function writeRequest(CommandInterface $command) - { - $arguments = $command->getArguments(); - array_unshift($arguments, $command->getId()); - - $this->write(phpiredis_format_command($arguments)); - } - - /** - * {@inheritdoc} - */ - public function __wakeup() - { - $this->assertExtensions(); - $this->reader = $this->createReader(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/PhpiredisStreamConnection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/PhpiredisStreamConnection.php deleted file mode 100755 index beb23575..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/PhpiredisStreamConnection.php +++ /dev/null @@ -1,228 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Connection; - -use Predis\Command\CommandInterface; -use Predis\NotSupportedException; -use Predis\Response\Error as ErrorResponse; -use Predis\Response\Status as StatusResponse; - -/** - * This class provides the implementation of a Predis connection that uses PHP's - * streams for network communication and wraps the phpiredis C extension (PHP - * bindings for hiredis) to parse and serialize the Redis protocol. - * - * This class is intended to provide an optional low-overhead alternative for - * processing responses from Redis compared to the standard pure-PHP classes. - * Differences in speed when dealing with short inline responses are practically - * nonexistent, the actual speed boost is for big multibulk responses when this - * protocol processor can parse and return responses very fast. - * - * For instructions on how to build and install the phpiredis extension, please - * consult the repository of the project. - * - * The connection parameters supported by this class are: - * - * - scheme: it can be either 'redis', 'tcp' or 'unix'. - * - host: hostname or IP address of the server. - * - port: TCP port of the server. - * - path: path of a UNIX domain socket when scheme is 'unix'. - * - timeout: timeout to perform the connection. - * - read_write_timeout: timeout of read / write operations. - * - async_connect: performs the connection asynchronously. - * - tcp_nodelay: enables or disables Nagle's algorithm for coalescing. - * - persistent: the connection is left intact after a GC collection. - * - * @link https://github.com/nrk/phpiredis - * - * @author Daniele Alessandri - */ -class PhpiredisStreamConnection extends StreamConnection -{ - private $reader; - - /** - * {@inheritdoc} - */ - public function __construct(ParametersInterface $parameters) - { - $this->assertExtensions(); - - parent::__construct($parameters); - - $this->reader = $this->createReader(); - } - - /** - * {@inheritdoc} - */ - public function __destruct() - { - phpiredis_reader_destroy($this->reader); - - parent::__destruct(); - } - - /** - * Checks if the phpiredis extension is loaded in PHP. - */ - private function assertExtensions() - { - if (!extension_loaded('phpiredis')) { - throw new NotSupportedException( - 'The "phpiredis" extension is required by this connection backend.' - ); - } - } - - /** - * {@inheritdoc} - */ - protected function tcpStreamInitializer(ParametersInterface $parameters) - { - $uri = "tcp://[{$parameters->host}]:{$parameters->port}"; - $flags = STREAM_CLIENT_CONNECT; - $socket = null; - - if (isset($parameters->async_connect) && (bool) $parameters->async_connect) { - $flags |= STREAM_CLIENT_ASYNC_CONNECT; - } - - if (isset($parameters->persistent) && (bool) $parameters->persistent) { - $flags |= STREAM_CLIENT_PERSISTENT; - $uri .= strpos($path = $parameters->path, '/') === 0 ? $path : "/$path"; - } - - $resource = @stream_socket_client($uri, $errno, $errstr, (float) $parameters->timeout, $flags); - - if (!$resource) { - $this->onConnectionError(trim($errstr), $errno); - } - - if (isset($parameters->read_write_timeout) && function_exists('socket_import_stream')) { - $rwtimeout = (float) $parameters->read_write_timeout; - $rwtimeout = $rwtimeout > 0 ? $rwtimeout : -1; - - $timeout = array( - 'sec' => $timeoutSeconds = floor($rwtimeout), - 'usec' => ($rwtimeout - $timeoutSeconds) * 1000000, - ); - - $socket = $socket ?: socket_import_stream($resource); - @socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, $timeout); - @socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeout); - } - - if (isset($parameters->tcp_nodelay) && function_exists('socket_import_stream')) { - $socket = $socket ?: socket_import_stream($resource); - socket_set_option($socket, SOL_TCP, TCP_NODELAY, (int) $parameters->tcp_nodelay); - } - - return $resource; - } - - /** - * Creates a new instance of the protocol reader resource. - * - * @return resource - */ - private function createReader() - { - $reader = phpiredis_reader_create(); - - phpiredis_reader_set_status_handler($reader, $this->getStatusHandler()); - phpiredis_reader_set_error_handler($reader, $this->getErrorHandler()); - - return $reader; - } - - /** - * Returns the underlying protocol reader resource. - * - * @return resource - */ - protected function getReader() - { - return $this->reader; - } - - /** - * Returns the handler used by the protocol reader for inline responses. - * - * @return \Closure - */ - protected function getStatusHandler() - { - return function ($payload) { - return StatusResponse::get($payload); - }; - } - - /** - * Returns the handler used by the protocol reader for error responses. - * - * @return \Closure - */ - protected function getErrorHandler() - { - return function ($errorMessage) { - return new ErrorResponse($errorMessage); - }; - } - - /** - * {@inheritdoc} - */ - public function read() - { - $socket = $this->getResource(); - $reader = $this->reader; - - while (PHPIREDIS_READER_STATE_INCOMPLETE === $state = phpiredis_reader_get_state($reader)) { - $buffer = stream_socket_recvfrom($socket, 4096); - - if ($buffer === false || $buffer === '') { - $this->onConnectionError('Error while reading bytes from the server.'); - } - - phpiredis_reader_feed($reader, $buffer); - } - - if ($state === PHPIREDIS_READER_STATE_COMPLETE) { - return phpiredis_reader_get_reply($reader); - } else { - $this->onProtocolError(phpiredis_reader_get_error($reader)); - - return; - } - } - - /** - * {@inheritdoc} - */ - public function writeRequest(CommandInterface $command) - { - $arguments = $command->getArguments(); - array_unshift($arguments, $command->getId()); - - $this->write(phpiredis_format_command($arguments)); - } - - /** - * {@inheritdoc} - */ - public function __wakeup() - { - $this->assertExtensions(); - $this->reader = $this->createReader(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/StreamConnection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/StreamConnection.php deleted file mode 100755 index ed6540b8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/StreamConnection.php +++ /dev/null @@ -1,292 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Connection; - -use Predis\Command\CommandInterface; -use Predis\Response\Error as ErrorResponse; -use Predis\Response\Status as StatusResponse; - -/** - * Standard connection to Redis servers implemented on top of PHP's streams. - * The connection parameters supported by this class are:. - * - * - scheme: it can be either 'redis', 'tcp' or 'unix'. - * - host: hostname or IP address of the server. - * - port: TCP port of the server. - * - path: path of a UNIX domain socket when scheme is 'unix'. - * - timeout: timeout to perform the connection. - * - read_write_timeout: timeout of read / write operations. - * - async_connect: performs the connection asynchronously. - * - tcp_nodelay: enables or disables Nagle's algorithm for coalescing. - * - persistent: the connection is left intact after a GC collection. - * - * @author Daniele Alessandri - */ -class StreamConnection extends AbstractConnection -{ - /** - * Disconnects from the server and destroys the underlying resource when the - * garbage collector kicks in only if the connection has not been marked as - * persistent. - */ - public function __destruct() - { - if (isset($this->parameters->persistent) && $this->parameters->persistent) { - return; - } - - $this->disconnect(); - } - - /** - * {@inheritdoc} - */ - protected function createResource() - { - switch ($this->parameters->scheme) { - case 'tcp': - case 'redis': - return $this->tcpStreamInitializer($this->parameters); - - case 'unix': - return $this->unixStreamInitializer($this->parameters); - - default: - throw new \InvalidArgumentException("Invalid scheme: '{$this->parameters->scheme}'."); - } - } - - /** - * Initializes a TCP stream resource. - * - * @param ParametersInterface $parameters Initialization parameters for the connection. - * - * @return resource - */ - protected function tcpStreamInitializer(ParametersInterface $parameters) - { - if (!filter_var($parameters->host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { - $uri = "tcp://$parameters->host:$parameters->port"; - } else { - $uri = "tcp://[$parameters->host]:$parameters->port"; - } - - $flags = STREAM_CLIENT_CONNECT; - - if (isset($parameters->async_connect) && (bool) $parameters->async_connect) { - $flags |= STREAM_CLIENT_ASYNC_CONNECT; - } - - if (isset($parameters->persistent) && (bool) $parameters->persistent) { - $flags |= STREAM_CLIENT_PERSISTENT; - $uri .= strpos($path = $parameters->path, '/') === 0 ? $path : "/$path"; - } - - $resource = @stream_socket_client($uri, $errno, $errstr, (float) $parameters->timeout, $flags); - - if (!$resource) { - $this->onConnectionError(trim($errstr), $errno); - } - - if (isset($parameters->read_write_timeout)) { - $rwtimeout = (float) $parameters->read_write_timeout; - $rwtimeout = $rwtimeout > 0 ? $rwtimeout : -1; - $timeoutSeconds = floor($rwtimeout); - $timeoutUSeconds = ($rwtimeout - $timeoutSeconds) * 1000000; - stream_set_timeout($resource, $timeoutSeconds, $timeoutUSeconds); - } - - if (isset($parameters->tcp_nodelay) && function_exists('socket_import_stream')) { - $socket = socket_import_stream($resource); - socket_set_option($socket, SOL_TCP, TCP_NODELAY, (int) $parameters->tcp_nodelay); - } - - return $resource; - } - - /** - * Initializes a UNIX stream resource. - * - * @param ParametersInterface $parameters Initialization parameters for the connection. - * - * @return resource - */ - protected function unixStreamInitializer(ParametersInterface $parameters) - { - if (!isset($parameters->path)) { - throw new InvalidArgumentException('Missing UNIX domain socket path.'); - } - - $uri = "unix://{$parameters->path}"; - $flags = STREAM_CLIENT_CONNECT; - - if ((bool) $parameters->persistent) { - $flags |= STREAM_CLIENT_PERSISTENT; - } - - $resource = @stream_socket_client($uri, $errno, $errstr, (float) $parameters->timeout, $flags); - - if (!$resource) { - $this->onConnectionError(trim($errstr), $errno); - } - - if (isset($parameters->read_write_timeout)) { - $rwtimeout = (float) $parameters->read_write_timeout; - $rwtimeout = $rwtimeout > 0 ? $rwtimeout : -1; - $timeoutSeconds = floor($rwtimeout); - $timeoutUSeconds = ($rwtimeout - $timeoutSeconds) * 1000000; - stream_set_timeout($resource, $timeoutSeconds, $timeoutUSeconds); - } - - return $resource; - } - - /** - * {@inheritdoc} - */ - public function connect() - { - if (parent::connect() && $this->initCommands) { - foreach ($this->initCommands as $command) { - $this->executeCommand($command); - } - } - } - - /** - * {@inheritdoc} - */ - public function disconnect() - { - if ($this->isConnected()) { - fclose($this->getResource()); - parent::disconnect(); - } - } - - /** - * Performs a write operation over the stream of the buffer containing a - * command serialized with the Redis wire protocol. - * - * @param string $buffer Representation of a command in the Redis wire protocol. - */ - protected function write($buffer) - { - $socket = $this->getResource(); - - while (($length = strlen($buffer)) > 0) { - $written = @fwrite($socket, $buffer); - - if ($length === $written) { - return; - } - - if ($written === false || $written === 0) { - $this->onConnectionError('Error while writing bytes to the server.'); - } - - $buffer = substr($buffer, $written); - } - } - - /** - * {@inheritdoc} - */ - public function read() - { - $socket = $this->getResource(); - $chunk = fgets($socket); - - if ($chunk === false || $chunk === '') { - $this->onConnectionError('Error while reading line from the server.'); - } - - $prefix = $chunk[0]; - $payload = substr($chunk, 1, -2); - - switch ($prefix) { - case '+': - return StatusResponse::get($payload); - - case '$': - $size = (int) $payload; - - if ($size === -1) { - return; - } - - $bulkData = ''; - $bytesLeft = ($size += 2); - - do { - $chunk = fread($socket, min($bytesLeft, 4096)); - - if ($chunk === false || $chunk === '') { - $this->onConnectionError('Error while reading bytes from the server.'); - } - - $bulkData .= $chunk; - $bytesLeft = $size - strlen($bulkData); - } while ($bytesLeft > 0); - - return substr($bulkData, 0, -2); - - case '*': - $count = (int) $payload; - - if ($count === -1) { - return; - } - - $multibulk = array(); - - for ($i = 0; $i < $count; ++$i) { - $multibulk[$i] = $this->read(); - } - - return $multibulk; - - case ':': - return (int) $payload; - - case '-': - return new ErrorResponse($payload); - - default: - $this->onProtocolError("Unknown response prefix: '$prefix'."); - - return; - } - } - - /** - * {@inheritdoc} - */ - public function writeRequest(CommandInterface $command) - { - $commandID = $command->getId(); - $arguments = $command->getArguments(); - - $cmdlen = strlen($commandID); - $reqlen = count($arguments) + 1; - - $buffer = "*{$reqlen}\r\n\${$cmdlen}\r\n{$commandID}\r\n"; - - for ($i = 0, $reqlen--; $i < $reqlen; ++$i) { - $argument = $arguments[$i]; - $arglen = strlen($argument); - $buffer .= "\${$arglen}\r\n{$argument}\r\n"; - } - - $this->write($buffer); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/WebdisConnection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/WebdisConnection.php deleted file mode 100755 index 9cff9d02..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Connection/WebdisConnection.php +++ /dev/null @@ -1,353 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Connection; - -use Predis\Command\CommandInterface; -use Predis\NotSupportedException; -use Predis\Protocol\ProtocolException; -use Predis\Response\Error as ErrorResponse; -use Predis\Response\Status as StatusResponse; - -/** - * This class implements a Predis connection that actually talks with Webdis - * instead of connecting directly to Redis. It relies on the cURL extension to - * communicate with the web server and the phpiredis extension to parse the - * protocol for responses returned in the http response bodies. - * - * Some features are not yet available or they simply cannot be implemented: - * - Pipelining commands. - * - Publish / Subscribe. - * - MULTI / EXEC transactions (not yet supported by Webdis). - * - * The connection parameters supported by this class are: - * - * - scheme: must be 'http'. - * - host: hostname or IP address of the server. - * - port: TCP port of the server. - * - timeout: timeout to perform the connection. - * - user: username for authentication. - * - pass: password for authentication. - * - * @link http://webd.is - * @link http://github.com/nicolasff/webdis - * @link http://github.com/seppo0010/phpiredis - * - * @author Daniele Alessandri - */ -class WebdisConnection implements NodeConnectionInterface -{ - private $parameters; - private $resource; - private $reader; - - /** - * @param ParametersInterface $parameters Initialization parameters for the connection. - * - * @throws \InvalidArgumentException - */ - public function __construct(ParametersInterface $parameters) - { - $this->assertExtensions(); - - if ($parameters->scheme !== 'http') { - throw new \InvalidArgumentException("Invalid scheme: '{$parameters->scheme}'."); - } - - $this->parameters = $parameters; - - $this->resource = $this->createCurl(); - $this->reader = $this->createReader(); - } - - /** - * Frees the underlying cURL and protocol reader resources when the garbage - * collector kicks in. - */ - public function __destruct() - { - curl_close($this->resource); - phpiredis_reader_destroy($this->reader); - } - - /** - * Helper method used to throw on unsupported methods. - * - * @param string $method Name of the unsupported method. - * - * @throws NotSupportedException - */ - private function throwNotSupportedException($method) - { - $class = __CLASS__; - throw new NotSupportedException("The method $class::$method() is not supported."); - } - - /** - * Checks if the cURL and phpiredis extensions are loaded in PHP. - */ - private function assertExtensions() - { - if (!extension_loaded('curl')) { - throw new NotSupportedException( - 'The "curl" extension is required by this connection backend.' - ); - } - - if (!extension_loaded('phpiredis')) { - throw new NotSupportedException( - 'The "phpiredis" extension is required by this connection backend.' - ); - } - } - - /** - * Initializes cURL. - * - * @return resource - */ - private function createCurl() - { - $parameters = $this->getParameters(); - - if (filter_var($host = $parameters->host, FILTER_VALIDATE_IP)) { - $host = "[$host]"; - } - - $options = array( - CURLOPT_FAILONERROR => true, - CURLOPT_CONNECTTIMEOUT_MS => $parameters->timeout * 1000, - CURLOPT_URL => "$parameters->scheme://$host:$parameters->port", - CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_POST => true, - CURLOPT_WRITEFUNCTION => array($this, 'feedReader'), - ); - - if (isset($parameters->user, $parameters->pass)) { - $options[CURLOPT_USERPWD] = "{$parameters->user}:{$parameters->pass}"; - } - - curl_setopt_array($resource = curl_init(), $options); - - return $resource; - } - - /** - * Initializes the phpiredis protocol reader. - * - * @return resource - */ - private function createReader() - { - $reader = phpiredis_reader_create(); - - phpiredis_reader_set_status_handler($reader, $this->getStatusHandler()); - phpiredis_reader_set_error_handler($reader, $this->getErrorHandler()); - - return $reader; - } - - /** - * Returns the handler used by the protocol reader for inline responses. - * - * @return \Closure - */ - protected function getStatusHandler() - { - return function ($payload) { - return StatusResponse::get($payload); - }; - } - - /** - * Returns the handler used by the protocol reader for error responses. - * - * @return \Closure - */ - protected function getErrorHandler() - { - return function ($payload) { - return new ErrorResponse($payload); - }; - } - - /** - * Feeds the phpredis reader resource with the data read from the network. - * - * @param resource $resource Reader resource. - * @param string $buffer Buffer of data read from a connection. - * - * @return int - */ - protected function feedReader($resource, $buffer) - { - phpiredis_reader_feed($this->reader, $buffer); - - return strlen($buffer); - } - - /** - * {@inheritdoc} - */ - public function connect() - { - // NOOP - } - - /** - * {@inheritdoc} - */ - public function disconnect() - { - // NOOP - } - - /** - * {@inheritdoc} - */ - public function isConnected() - { - return true; - } - - /** - * Checks if the specified command is supported by this connection class. - * - * @param CommandInterface $command Command instance. - * - * @throws NotSupportedException - * - * @return string - */ - protected function getCommandId(CommandInterface $command) - { - switch ($commandID = $command->getId()) { - case 'AUTH': - case 'SELECT': - case 'MULTI': - case 'EXEC': - case 'WATCH': - case 'UNWATCH': - case 'DISCARD': - case 'MONITOR': - throw new NotSupportedException("Command '$commandID' is not allowed by Webdis."); - - default: - return $commandID; - } - } - - /** - * {@inheritdoc} - */ - public function writeRequest(CommandInterface $command) - { - $this->throwNotSupportedException(__FUNCTION__); - } - - /** - * {@inheritdoc} - */ - public function readResponse(CommandInterface $command) - { - $this->throwNotSupportedException(__FUNCTION__); - } - - /** - * {@inheritdoc} - */ - public function executeCommand(CommandInterface $command) - { - $resource = $this->resource; - $commandId = $this->getCommandId($command); - - if ($arguments = $command->getArguments()) { - $arguments = implode('/', array_map('urlencode', $arguments)); - $serializedCommand = "$commandId/$arguments.raw"; - } else { - $serializedCommand = "$commandId.raw"; - } - - curl_setopt($resource, CURLOPT_POSTFIELDS, $serializedCommand); - - if (curl_exec($resource) === false) { - $error = curl_error($resource); - $errno = curl_errno($resource); - - throw new ConnectionException($this, trim($error), $errno); - } - - if (phpiredis_reader_get_state($this->reader) !== PHPIREDIS_READER_STATE_COMPLETE) { - throw new ProtocolException($this, phpiredis_reader_get_error($this->reader)); - } - - return phpiredis_reader_get_reply($this->reader); - } - - /** - * {@inheritdoc} - */ - public function getResource() - { - return $this->resource; - } - - /** - * {@inheritdoc} - */ - public function getParameters() - { - return $this->parameters; - } - - /** - * {@inheritdoc} - */ - public function addConnectCommand(CommandInterface $command) - { - $this->throwNotSupportedException(__FUNCTION__); - } - - /** - * {@inheritdoc} - */ - public function read() - { - $this->throwNotSupportedException(__FUNCTION__); - } - - /** - * {@inheritdoc} - */ - public function __toString() - { - return "{$this->parameters->host}:{$this->parameters->port}"; - } - - /** - * {@inheritdoc} - */ - public function __sleep() - { - return array('parameters'); - } - - /** - * {@inheritdoc} - */ - public function __wakeup() - { - $this->assertExtensions(); - - $this->resource = $this->createCurl(); - $this->reader = $this->createReader(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Monitor/Consumer.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Monitor/Consumer.php deleted file mode 100755 index d10bad1a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Monitor/Consumer.php +++ /dev/null @@ -1,173 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Monitor; - -use Predis\ClientInterface; -use Predis\Connection\AggregateConnectionInterface; -use Predis\NotSupportedException; - -/** - * Redis MONITOR consumer. - * - * @author Daniele Alessandri - */ -class Consumer implements \Iterator -{ - private $client; - private $valid; - private $position; - - /** - * @param ClientInterface $client Client instance used by the consumer. - */ - public function __construct(ClientInterface $client) - { - $this->assertClient($client); - - $this->client = $client; - - $this->start(); - } - - /** - * Automatically stops the consumer when the garbage collector kicks in. - */ - public function __destruct() - { - $this->stop(); - } - - /** - * Checks if the passed client instance satisfies the required conditions - * needed to initialize a monitor consumer. - * - * @param ClientInterface $client Client instance used by the consumer. - * - * @throws NotSupportedException - */ - private function assertClient(ClientInterface $client) - { - if ($client->getConnection() instanceof AggregateConnectionInterface) { - throw new NotSupportedException( - 'Cannot initialize a monitor consumer over aggregate connections.' - ); - } - - if ($client->getProfile()->supportsCommand('MONITOR') === false) { - throw new NotSupportedException("The current profile does not support 'MONITOR'."); - } - } - - /** - * Initializes the consumer and sends the MONITOR command to the server. - */ - protected function start() - { - $this->client->executeCommand( - $this->client->createCommand('MONITOR') - ); - $this->valid = true; - } - - /** - * Stops the consumer. Internally this is done by disconnecting from server - * since there is no way to terminate the stream initialized by MONITOR. - */ - public function stop() - { - $this->client->disconnect(); - $this->valid = false; - } - - /** - * {@inheritdoc} - */ - public function rewind() - { - // NOOP - } - - /** - * Returns the last message payload retrieved from the server. - * - * @return Object - */ - public function current() - { - return $this->getValue(); - } - - /** - * {@inheritdoc} - */ - public function key() - { - return $this->position; - } - - /** - * {@inheritdoc} - */ - public function next() - { - ++$this->position; - } - - /** - * Checks if the the consumer is still in a valid state to continue. - * - * @return bool - */ - public function valid() - { - return $this->valid; - } - - /** - * Waits for a new message from the server generated by MONITOR and returns - * it when available. - * - * @return Object - */ - private function getValue() - { - $database = 0; - $client = null; - $event = $this->client->getConnection()->read(); - - $callback = function ($matches) use (&$database, &$client) { - if (2 === $count = count($matches)) { - // Redis <= 2.4 - $database = (int) $matches[1]; - } - - if (4 === $count) { - // Redis >= 2.6 - $database = (int) $matches[2]; - $client = $matches[3]; - } - - return ' '; - }; - - $event = preg_replace_callback('/ \(db (\d+)\) | \[(\d+) (.*?)\] /', $callback, $event, 1); - @list($timestamp, $command, $arguments) = explode(' ', $event, 3); - - return (object) array( - 'timestamp' => (float) $timestamp, - 'database' => $database, - 'client' => $client, - 'command' => substr($command, 1, -1), - 'arguments' => $arguments, - ); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/NotSupportedException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/NotSupportedException.php deleted file mode 100755 index be82aba7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/NotSupportedException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis; - -/** - * Exception class thrown when trying to use features not supported by certain - * classes or abstractions of Predis. - * - * @author Daniele Alessandri - */ -class NotSupportedException extends PredisException -{ -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/Atomic.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/Atomic.php deleted file mode 100755 index 1c9c92aa..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/Atomic.php +++ /dev/null @@ -1,119 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Pipeline; - -use Predis\ClientException; -use Predis\ClientInterface; -use Predis\Connection\ConnectionInterface; -use Predis\Connection\NodeConnectionInterface; -use Predis\Response\ErrorInterface as ErrorResponseInterface; -use Predis\Response\ResponseInterface; -use Predis\Response\ServerException; - -/** - * Command pipeline wrapped into a MULTI / EXEC transaction. - * - * @author Daniele Alessandri - */ -class Atomic extends Pipeline -{ - /** - * {@inheritdoc} - */ - public function __construct(ClientInterface $client) - { - if (!$client->getProfile()->supportsCommands(array('multi', 'exec', 'discard'))) { - throw new ClientException( - "The current profile does not support 'MULTI', 'EXEC' and 'DISCARD'." - ); - } - - parent::__construct($client); - } - - /** - * {@inheritdoc} - */ - protected function getConnection() - { - $connection = $this->getClient()->getConnection(); - - if (!$connection instanceof NodeConnectionInterface) { - $class = __CLASS__; - - throw new ClientException("The class '$class' does not support aggregate connections."); - } - - return $connection; - } - - /** - * {@inheritdoc} - */ - protected function executePipeline(ConnectionInterface $connection, \SplQueue $commands) - { - $profile = $this->getClient()->getProfile(); - $connection->executeCommand($profile->createCommand('multi')); - - foreach ($commands as $command) { - $connection->writeRequest($command); - } - - foreach ($commands as $command) { - $response = $connection->readResponse($command); - - if ($response instanceof ErrorResponseInterface) { - $connection->executeCommand($profile->createCommand('discard')); - throw new ServerException($response->getMessage()); - } - } - - $executed = $connection->executeCommand($profile->createCommand('exec')); - - if (!isset($executed)) { - // TODO: should be throwing a more appropriate exception. - throw new ClientException( - 'The underlying transaction has been aborted by the server.' - ); - } - - if (count($executed) !== count($commands)) { - $expected = count($commands); - $received = count($executed); - - throw new ClientException( - "Invalid number of responses [expected $expected, received $received]." - ); - } - - $responses = array(); - $sizeOfPipe = count($commands); - $exceptions = $this->throwServerExceptions(); - - for ($i = 0; $i < $sizeOfPipe; ++$i) { - $command = $commands->dequeue(); - $response = $executed[$i]; - - if (!$response instanceof ResponseInterface) { - $responses[] = $command->parseResponse($response); - } elseif ($response instanceof ErrorResponseInterface && $exceptions) { - $this->exception($connection, $response); - } else { - $responses[] = $response; - } - - unset($executed[$i]); - } - - return $responses; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/ConnectionErrorProof.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/ConnectionErrorProof.php deleted file mode 100755 index d3bc732e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/ConnectionErrorProof.php +++ /dev/null @@ -1,130 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Pipeline; - -use Predis\CommunicationException; -use Predis\Connection\Aggregate\ClusterInterface; -use Predis\Connection\ConnectionInterface; -use Predis\Connection\NodeConnectionInterface; -use Predis\NotSupportedException; - -/** - * Command pipeline that does not throw exceptions on connection errors, but - * returns the exception instances as the rest of the response elements. - * - * @todo Awful naming! - * - * @author Daniele Alessandri - */ -class ConnectionErrorProof extends Pipeline -{ - /** - * {@inheritdoc} - */ - protected function getConnection() - { - return $this->getClient()->getConnection(); - } - - /** - * {@inheritdoc} - */ - protected function executePipeline(ConnectionInterface $connection, \SplQueue $commands) - { - if ($connection instanceof NodeConnectionInterface) { - return $this->executeSingleNode($connection, $commands); - } elseif ($connection instanceof ClusterInterface) { - return $this->executeCluster($connection, $commands); - } else { - $class = get_class($connection); - - throw new NotSupportedException("The connection class '$class' is not supported."); - } - } - - /** - * {@inheritdoc} - */ - protected function executeSingleNode(NodeConnectionInterface $connection, \SplQueue $commands) - { - $responses = array(); - $sizeOfPipe = count($commands); - - foreach ($commands as $command) { - try { - $connection->writeRequest($command); - } catch (CommunicationException $exception) { - return array_fill(0, $sizeOfPipe, $exception); - } - } - - for ($i = 0; $i < $sizeOfPipe; ++$i) { - $command = $commands->dequeue(); - - try { - $responses[$i] = $connection->readResponse($command); - } catch (CommunicationException $exception) { - $add = count($commands) - count($responses); - $responses = array_merge($responses, array_fill(0, $add, $exception)); - - break; - } - } - - return $responses; - } - - /** - * {@inheritdoc} - */ - protected function executeCluster(ClusterInterface $connection, \SplQueue $commands) - { - $responses = array(); - $sizeOfPipe = count($commands); - $exceptions = array(); - - foreach ($commands as $command) { - $cmdConnection = $connection->getConnection($command); - - if (isset($exceptions[spl_object_hash($cmdConnection)])) { - continue; - } - - try { - $cmdConnection->writeRequest($command); - } catch (CommunicationException $exception) { - $exceptions[spl_object_hash($cmdConnection)] = $exception; - } - } - - for ($i = 0; $i < $sizeOfPipe; ++$i) { - $command = $commands->dequeue(); - - $cmdConnection = $connection->getConnection($command); - $connectionHash = spl_object_hash($cmdConnection); - - if (isset($exceptions[$connectionHash])) { - $responses[$i] = $exceptions[$connectionHash]; - continue; - } - - try { - $responses[$i] = $cmdConnection->readResponse($command); - } catch (CommunicationException $exception) { - $responses[$i] = $exception; - $exceptions[$connectionHash] = $exception; - } - } - - return $responses; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/FireAndForget.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/FireAndForget.php deleted file mode 100755 index 95a062b6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/FireAndForget.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Pipeline; - -use Predis\Connection\ConnectionInterface; - -/** - * Command pipeline that writes commands to the servers but discards responses. - * - * @author Daniele Alessandri - */ -class FireAndForget extends Pipeline -{ - /** - * {@inheritdoc} - */ - protected function executePipeline(ConnectionInterface $connection, \SplQueue $commands) - { - while (!$commands->isEmpty()) { - $connection->writeRequest($commands->dequeue()); - } - - $connection->disconnect(); - - return array(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/Pipeline.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/Pipeline.php deleted file mode 100755 index cf9c59e4..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Pipeline/Pipeline.php +++ /dev/null @@ -1,247 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Pipeline; - -use Predis\ClientContextInterface; -use Predis\ClientException; -use Predis\ClientInterface; -use Predis\Command\CommandInterface; -use Predis\Connection\Aggregate\ReplicationInterface; -use Predis\Connection\ConnectionInterface; -use Predis\Response\ErrorInterface as ErrorResponseInterface; -use Predis\Response\ResponseInterface; -use Predis\Response\ServerException; - -/** - * Implementation of a command pipeline in which write and read operations of - * Redis commands are pipelined to alleviate the effects of network round-trips. - * - * {@inheritdoc} - * - * @author Daniele Alessandri - */ -class Pipeline implements ClientContextInterface -{ - private $client; - private $pipeline; - - private $responses = array(); - private $running = false; - - /** - * @param ClientInterface $client Client instance used by the context. - */ - public function __construct(ClientInterface $client) - { - $this->client = $client; - $this->pipeline = new \SplQueue(); - } - - /** - * Queues a command into the pipeline buffer. - * - * @param string $method Command ID. - * @param array $arguments Arguments for the command. - * - * @return $this - */ - public function __call($method, $arguments) - { - $command = $this->client->createCommand($method, $arguments); - $this->recordCommand($command); - - return $this; - } - - /** - * Queues a command instance into the pipeline buffer. - * - * @param CommandInterface $command Command to be queued in the buffer. - */ - protected function recordCommand(CommandInterface $command) - { - $this->pipeline->enqueue($command); - } - - /** - * Queues a command instance into the pipeline buffer. - * - * @param CommandInterface $command Command instance to be queued in the buffer. - * - * @return $this - */ - public function executeCommand(CommandInterface $command) - { - $this->recordCommand($command); - - return $this; - } - - /** - * Throws an exception on -ERR responses returned by Redis. - * - * @param ConnectionInterface $connection Redis connection that returned the error. - * @param ErrorResponseInterface $response Instance of the error response. - * - * @throws ServerException - */ - protected function exception(ConnectionInterface $connection, ErrorResponseInterface $response) - { - $connection->disconnect(); - $message = $response->getMessage(); - - throw new ServerException($message); - } - - /** - * Returns the underlying connection to be used by the pipeline. - * - * @return ConnectionInterface - */ - protected function getConnection() - { - $connection = $this->getClient()->getConnection(); - - if ($connection instanceof ReplicationInterface) { - $connection->switchTo('master'); - } - - return $connection; - } - - /** - * Implements the logic to flush the queued commands and read the responses - * from the current connection. - * - * @param ConnectionInterface $connection Current connection instance. - * @param \SplQueue $commands Queued commands. - * - * @return array - */ - protected function executePipeline(ConnectionInterface $connection, \SplQueue $commands) - { - foreach ($commands as $command) { - $connection->writeRequest($command); - } - - $responses = array(); - $exceptions = $this->throwServerExceptions(); - - while (!$commands->isEmpty()) { - $command = $commands->dequeue(); - $response = $connection->readResponse($command); - - if (!$response instanceof ResponseInterface) { - $responses[] = $command->parseResponse($response); - } elseif ($response instanceof ErrorResponseInterface && $exceptions) { - $this->exception($connection, $response); - } else { - $responses[] = $response; - } - } - - return $responses; - } - - /** - * Flushes the buffer holding all of the commands queued so far. - * - * @param bool $send Specifies if the commands in the buffer should be sent to Redis. - * - * @return $this - */ - public function flushPipeline($send = true) - { - if ($send && !$this->pipeline->isEmpty()) { - $responses = $this->executePipeline($this->getConnection(), $this->pipeline); - $this->responses = array_merge($this->responses, $responses); - } else { - $this->pipeline = new \SplQueue(); - } - - return $this; - } - - /** - * Marks the running status of the pipeline. - * - * @param bool $bool Sets the running status of the pipeline. - * - * @throws ClientException - */ - private function setRunning($bool) - { - if ($bool && $this->running) { - throw new ClientException('The current pipeline context is already being executed.'); - } - - $this->running = $bool; - } - - /** - * Handles the actual execution of the whole pipeline. - * - * @param mixed $callable Optional callback for execution. - * - * @throws \Exception - * @throws \InvalidArgumentException - * - * @return array - */ - public function execute($callable = null) - { - if ($callable && !is_callable($callable)) { - throw new \InvalidArgumentException('The argument must be a callable object.'); - } - - $exception = null; - $this->setRunning(true); - - try { - if ($callable) { - call_user_func($callable, $this); - } - - $this->flushPipeline(); - } catch (\Exception $exception) { - // NOOP - } - - $this->setRunning(false); - - if ($exception) { - throw $exception; - } - - return $this->responses; - } - - /** - * Returns if the pipeline should throw exceptions on server errors. - * - * @return bool - */ - protected function throwServerExceptions() - { - return (bool) $this->client->getOptions()->exceptions; - } - - /** - * Returns the underlying client instance used by the pipeline object. - * - * @return ClientInterface - */ - public function getClient() - { - return $this->client; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PredisException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PredisException.php deleted file mode 100755 index 122bde16..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PredisException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis; - -/** - * Base exception class for Predis-related errors. - * - * @author Daniele Alessandri - */ -abstract class PredisException extends \Exception -{ -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/Factory.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/Factory.php deleted file mode 100755 index bcee3c2c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/Factory.php +++ /dev/null @@ -1,100 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Profile; - -use Predis\ClientException; - -/** - * Factory class for creating profile instances from strings. - * - * @author Daniele Alessandri - */ -final class Factory -{ - private static $profiles = array( - '2.0' => 'Predis\Profile\RedisVersion200', - '2.2' => 'Predis\Profile\RedisVersion220', - '2.4' => 'Predis\Profile\RedisVersion240', - '2.6' => 'Predis\Profile\RedisVersion260', - '2.8' => 'Predis\Profile\RedisVersion280', - '3.0' => 'Predis\Profile\RedisVersion300', - 'dev' => 'Predis\Profile\RedisUnstable', - 'default' => 'Predis\Profile\RedisVersion300', - ); - - /** - * - */ - private function __construct() - { - // NOOP - } - - /** - * Returns the default server profile. - * - * @return ProfileInterface - */ - public static function getDefault() - { - return self::get('default'); - } - - /** - * Returns the development server profile. - * - * @return ProfileInterface - */ - public static function getDevelopment() - { - return self::get('dev'); - } - - /** - * Registers a new server profile. - * - * @param string $alias Profile version or alias. - * @param string $class FQN of a class implementing Predis\Profile\ProfileInterface. - * - * @throws \InvalidArgumentException - */ - public static function define($alias, $class) - { - $reflection = new \ReflectionClass($class); - - if (!$reflection->isSubclassOf('Predis\Profile\ProfileInterface')) { - throw new \InvalidArgumentException("The class '$class' is not a valid profile class."); - } - - self::$profiles[$alias] = $class; - } - - /** - * Returns the specified server profile. - * - * @param string $version Profile version or alias. - * - * @throws ClientException - * - * @return ProfileInterface - */ - public static function get($version) - { - if (!isset(self::$profiles[$version])) { - throw new ClientException("Unknown server profile: '$version'."); - } - - $profile = self::$profiles[$version]; - - return new $profile(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/ProfileInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/ProfileInterface.php deleted file mode 100755 index abe71aa6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/ProfileInterface.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Profile; - -use Predis\Command\CommandInterface; - -/** - * A profile defines all the features and commands supported by certain versions - * of Redis. Instances of Predis\Client should use a server profile matching the - * version of Redis being used. - * - * @author Daniele Alessandri - */ -interface ProfileInterface -{ - /** - * Returns the profile version corresponding to the Redis version. - * - * @return string - */ - public function getVersion(); - - /** - * Checks if the profile supports the specified command. - * - * @param string $commandID Command ID. - * - * @return bool - */ - public function supportsCommand($commandID); - - /** - * Checks if the profile supports the specified list of commands. - * - * @param array $commandIDs List of command IDs. - * - * @return string - */ - public function supportsCommands(array $commandIDs); - - /** - * Creates a new command instance. - * - * @param string $commandID Command ID. - * @param array $arguments Arguments for the command. - * - * @return CommandInterface - */ - public function createCommand($commandID, array $arguments = array()); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisProfile.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisProfile.php deleted file mode 100755 index 3ef31688..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisProfile.php +++ /dev/null @@ -1,146 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Profile; - -use Predis\ClientException; -use Predis\Command\Processor\ProcessorInterface; - -/** - * Base class implementing common functionalities for Redis server profiles. - * - * @author Daniele Alessandri - */ -abstract class RedisProfile implements ProfileInterface -{ - private $commands; - private $processor; - - /** - * - */ - public function __construct() - { - $this->commands = $this->getSupportedCommands(); - } - - /** - * Returns a map of all the commands supported by the profile and their - * actual PHP classes. - * - * @return array - */ - abstract protected function getSupportedCommands(); - - /** - * {@inheritdoc} - */ - public function supportsCommand($commandID) - { - return isset($this->commands[strtoupper($commandID)]); - } - - /** - * {@inheritdoc} - */ - public function supportsCommands(array $commandIDs) - { - foreach ($commandIDs as $commandID) { - if (!$this->supportsCommand($commandID)) { - return false; - } - } - - return true; - } - - /** - * Returns the fully-qualified name of a class representing the specified - * command ID registered in the current server profile. - * - * @param string $commandID Command ID. - * - * @return string|null - */ - public function getCommandClass($commandID) - { - if (isset($this->commands[$commandID = strtoupper($commandID)])) { - return $this->commands[$commandID]; - } - } - - /** - * {@inheritdoc} - */ - public function createCommand($commandID, array $arguments = array()) - { - $commandID = strtoupper($commandID); - - if (!isset($this->commands[$commandID])) { - throw new ClientException("Command '$commandID' is not a registered Redis command."); - } - - $commandClass = $this->commands[$commandID]; - $command = new $commandClass(); - $command->setArguments($arguments); - - if (isset($this->processor)) { - $this->processor->process($command); - } - - return $command; - } - - /** - * Defines a new command in the server profile. - * - * @param string $commandID Command ID. - * @param string $class Fully-qualified name of a Predis\Command\CommandInterface. - * - * @throws \InvalidArgumentException - */ - public function defineCommand($commandID, $class) - { - $reflection = new \ReflectionClass($class); - - if (!$reflection->isSubclassOf('Predis\Command\CommandInterface')) { - throw new \InvalidArgumentException("The class '$class' is not a valid command class."); - } - - $this->commands[strtoupper($commandID)] = $class; - } - - /** - * {@inheritdoc} - */ - public function setProcessor(ProcessorInterface $processor = null) - { - $this->processor = $processor; - } - - /** - * {@inheritdoc} - */ - public function getProcessor() - { - return $this->processor; - } - - /** - * Returns the version of server profile as its string representation. - * - * @return string - */ - public function __toString() - { - return $this->getVersion(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisUnstable.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisUnstable.php deleted file mode 100755 index cf6174fe..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisUnstable.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Profile; - -/** - * Server profile for the current unstable version of Redis. - * - * @author Daniele Alessandri - */ -class RedisUnstable extends RedisVersion300 -{ - /** - * {@inheritdoc} - */ - public function getVersion() - { - return '3.2'; - } - - /** - * {@inheritdoc} - */ - public function getSupportedCommands() - { - return array_merge(parent::getSupportedCommands(), array( - /* ---------------- Redis 3.2 ---------------- */ - - /* commands operating on hashes */ - 'HSTRLEN' => 'Predis\Command\HashStringLength', - )); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion200.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion200.php deleted file mode 100755 index 234d53c0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion200.php +++ /dev/null @@ -1,173 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Profile; - -/** - * Server profile for Redis 2.0. - * - * @author Daniele Alessandri - */ -class RedisVersion200 extends RedisProfile -{ - /** - * {@inheritdoc} - */ - public function getVersion() - { - return '2.0'; - } - - /** - * {@inheritdoc} - */ - public function getSupportedCommands() - { - return array( - /* ---------------- Redis 1.2 ---------------- */ - - /* commands operating on the key space */ - 'EXISTS' => 'Predis\Command\KeyExists', - 'DEL' => 'Predis\Command\KeyDelete', - 'TYPE' => 'Predis\Command\KeyType', - 'KEYS' => 'Predis\Command\KeyKeys', - 'RANDOMKEY' => 'Predis\Command\KeyRandom', - 'RENAME' => 'Predis\Command\KeyRename', - 'RENAMENX' => 'Predis\Command\KeyRenamePreserve', - 'EXPIRE' => 'Predis\Command\KeyExpire', - 'EXPIREAT' => 'Predis\Command\KeyExpireAt', - 'TTL' => 'Predis\Command\KeyTimeToLive', - 'MOVE' => 'Predis\Command\KeyMove', - 'SORT' => 'Predis\Command\KeySort', - - /* commands operating on string values */ - 'SET' => 'Predis\Command\StringSet', - 'SETNX' => 'Predis\Command\StringSetPreserve', - 'MSET' => 'Predis\Command\StringSetMultiple', - 'MSETNX' => 'Predis\Command\StringSetMultiplePreserve', - 'GET' => 'Predis\Command\StringGet', - 'MGET' => 'Predis\Command\StringGetMultiple', - 'GETSET' => 'Predis\Command\StringGetSet', - 'INCR' => 'Predis\Command\StringIncrement', - 'INCRBY' => 'Predis\Command\StringIncrementBy', - 'DECR' => 'Predis\Command\StringDecrement', - 'DECRBY' => 'Predis\Command\StringDecrementBy', - - /* commands operating on lists */ - 'RPUSH' => 'Predis\Command\ListPushTail', - 'LPUSH' => 'Predis\Command\ListPushHead', - 'LLEN' => 'Predis\Command\ListLength', - 'LRANGE' => 'Predis\Command\ListRange', - 'LTRIM' => 'Predis\Command\ListTrim', - 'LINDEX' => 'Predis\Command\ListIndex', - 'LSET' => 'Predis\Command\ListSet', - 'LREM' => 'Predis\Command\ListRemove', - 'LPOP' => 'Predis\Command\ListPopFirst', - 'RPOP' => 'Predis\Command\ListPopLast', - 'RPOPLPUSH' => 'Predis\Command\ListPopLastPushHead', - - /* commands operating on sets */ - 'SADD' => 'Predis\Command\SetAdd', - 'SREM' => 'Predis\Command\SetRemove', - 'SPOP' => 'Predis\Command\SetPop', - 'SMOVE' => 'Predis\Command\SetMove', - 'SCARD' => 'Predis\Command\SetCardinality', - 'SISMEMBER' => 'Predis\Command\SetIsMember', - 'SINTER' => 'Predis\Command\SetIntersection', - 'SINTERSTORE' => 'Predis\Command\SetIntersectionStore', - 'SUNION' => 'Predis\Command\SetUnion', - 'SUNIONSTORE' => 'Predis\Command\SetUnionStore', - 'SDIFF' => 'Predis\Command\SetDifference', - 'SDIFFSTORE' => 'Predis\Command\SetDifferenceStore', - 'SMEMBERS' => 'Predis\Command\SetMembers', - 'SRANDMEMBER' => 'Predis\Command\SetRandomMember', - - /* commands operating on sorted sets */ - 'ZADD' => 'Predis\Command\ZSetAdd', - 'ZINCRBY' => 'Predis\Command\ZSetIncrementBy', - 'ZREM' => 'Predis\Command\ZSetRemove', - 'ZRANGE' => 'Predis\Command\ZSetRange', - 'ZREVRANGE' => 'Predis\Command\ZSetReverseRange', - 'ZRANGEBYSCORE' => 'Predis\Command\ZSetRangeByScore', - 'ZCARD' => 'Predis\Command\ZSetCardinality', - 'ZSCORE' => 'Predis\Command\ZSetScore', - 'ZREMRANGEBYSCORE' => 'Predis\Command\ZSetRemoveRangeByScore', - - /* connection related commands */ - 'PING' => 'Predis\Command\ConnectionPing', - 'AUTH' => 'Predis\Command\ConnectionAuth', - 'SELECT' => 'Predis\Command\ConnectionSelect', - 'ECHO' => 'Predis\Command\ConnectionEcho', - 'QUIT' => 'Predis\Command\ConnectionQuit', - - /* remote server control commands */ - 'INFO' => 'Predis\Command\ServerInfo', - 'SLAVEOF' => 'Predis\Command\ServerSlaveOf', - 'MONITOR' => 'Predis\Command\ServerMonitor', - 'DBSIZE' => 'Predis\Command\ServerDatabaseSize', - 'FLUSHDB' => 'Predis\Command\ServerFlushDatabase', - 'FLUSHALL' => 'Predis\Command\ServerFlushAll', - 'SAVE' => 'Predis\Command\ServerSave', - 'BGSAVE' => 'Predis\Command\ServerBackgroundSave', - 'LASTSAVE' => 'Predis\Command\ServerLastSave', - 'SHUTDOWN' => 'Predis\Command\ServerShutdown', - 'BGREWRITEAOF' => 'Predis\Command\ServerBackgroundRewriteAOF', - - /* ---------------- Redis 2.0 ---------------- */ - - /* commands operating on string values */ - 'SETEX' => 'Predis\Command\StringSetExpire', - 'APPEND' => 'Predis\Command\StringAppend', - 'SUBSTR' => 'Predis\Command\StringSubstr', - - /* commands operating on lists */ - 'BLPOP' => 'Predis\Command\ListPopFirstBlocking', - 'BRPOP' => 'Predis\Command\ListPopLastBlocking', - - /* commands operating on sorted sets */ - 'ZUNIONSTORE' => 'Predis\Command\ZSetUnionStore', - 'ZINTERSTORE' => 'Predis\Command\ZSetIntersectionStore', - 'ZCOUNT' => 'Predis\Command\ZSetCount', - 'ZRANK' => 'Predis\Command\ZSetRank', - 'ZREVRANK' => 'Predis\Command\ZSetReverseRank', - 'ZREMRANGEBYRANK' => 'Predis\Command\ZSetRemoveRangeByRank', - - /* commands operating on hashes */ - 'HSET' => 'Predis\Command\HashSet', - 'HSETNX' => 'Predis\Command\HashSetPreserve', - 'HMSET' => 'Predis\Command\HashSetMultiple', - 'HINCRBY' => 'Predis\Command\HashIncrementBy', - 'HGET' => 'Predis\Command\HashGet', - 'HMGET' => 'Predis\Command\HashGetMultiple', - 'HDEL' => 'Predis\Command\HashDelete', - 'HEXISTS' => 'Predis\Command\HashExists', - 'HLEN' => 'Predis\Command\HashLength', - 'HKEYS' => 'Predis\Command\HashKeys', - 'HVALS' => 'Predis\Command\HashValues', - 'HGETALL' => 'Predis\Command\HashGetAll', - - /* transactions */ - 'MULTI' => 'Predis\Command\TransactionMulti', - 'EXEC' => 'Predis\Command\TransactionExec', - 'DISCARD' => 'Predis\Command\TransactionDiscard', - - /* publish - subscribe */ - 'SUBSCRIBE' => 'Predis\Command\PubSubSubscribe', - 'UNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribe', - 'PSUBSCRIBE' => 'Predis\Command\PubSubSubscribeByPattern', - 'PUNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribeByPattern', - 'PUBLISH' => 'Predis\Command\PubSubPublish', - - /* remote server control commands */ - 'CONFIG' => 'Predis\Command\ServerConfig', - ); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion220.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion220.php deleted file mode 100755 index 899014e2..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion220.php +++ /dev/null @@ -1,202 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Profile; - -/** - * Server profile for Redis 2.2. - * - * @author Daniele Alessandri - */ -class RedisVersion220 extends RedisProfile -{ - /** - * {@inheritdoc} - */ - public function getVersion() - { - return '2.2'; - } - - /** - * {@inheritdoc} - */ - public function getSupportedCommands() - { - return array( - /* ---------------- Redis 1.2 ---------------- */ - - /* commands operating on the key space */ - 'EXISTS' => 'Predis\Command\KeyExists', - 'DEL' => 'Predis\Command\KeyDelete', - 'TYPE' => 'Predis\Command\KeyType', - 'KEYS' => 'Predis\Command\KeyKeys', - 'RANDOMKEY' => 'Predis\Command\KeyRandom', - 'RENAME' => 'Predis\Command\KeyRename', - 'RENAMENX' => 'Predis\Command\KeyRenamePreserve', - 'EXPIRE' => 'Predis\Command\KeyExpire', - 'EXPIREAT' => 'Predis\Command\KeyExpireAt', - 'TTL' => 'Predis\Command\KeyTimeToLive', - 'MOVE' => 'Predis\Command\KeyMove', - 'SORT' => 'Predis\Command\KeySort', - - /* commands operating on string values */ - 'SET' => 'Predis\Command\StringSet', - 'SETNX' => 'Predis\Command\StringSetPreserve', - 'MSET' => 'Predis\Command\StringSetMultiple', - 'MSETNX' => 'Predis\Command\StringSetMultiplePreserve', - 'GET' => 'Predis\Command\StringGet', - 'MGET' => 'Predis\Command\StringGetMultiple', - 'GETSET' => 'Predis\Command\StringGetSet', - 'INCR' => 'Predis\Command\StringIncrement', - 'INCRBY' => 'Predis\Command\StringIncrementBy', - 'DECR' => 'Predis\Command\StringDecrement', - 'DECRBY' => 'Predis\Command\StringDecrementBy', - - /* commands operating on lists */ - 'RPUSH' => 'Predis\Command\ListPushTail', - 'LPUSH' => 'Predis\Command\ListPushHead', - 'LLEN' => 'Predis\Command\ListLength', - 'LRANGE' => 'Predis\Command\ListRange', - 'LTRIM' => 'Predis\Command\ListTrim', - 'LINDEX' => 'Predis\Command\ListIndex', - 'LSET' => 'Predis\Command\ListSet', - 'LREM' => 'Predis\Command\ListRemove', - 'LPOP' => 'Predis\Command\ListPopFirst', - 'RPOP' => 'Predis\Command\ListPopLast', - 'RPOPLPUSH' => 'Predis\Command\ListPopLastPushHead', - - /* commands operating on sets */ - 'SADD' => 'Predis\Command\SetAdd', - 'SREM' => 'Predis\Command\SetRemove', - 'SPOP' => 'Predis\Command\SetPop', - 'SMOVE' => 'Predis\Command\SetMove', - 'SCARD' => 'Predis\Command\SetCardinality', - 'SISMEMBER' => 'Predis\Command\SetIsMember', - 'SINTER' => 'Predis\Command\SetIntersection', - 'SINTERSTORE' => 'Predis\Command\SetIntersectionStore', - 'SUNION' => 'Predis\Command\SetUnion', - 'SUNIONSTORE' => 'Predis\Command\SetUnionStore', - 'SDIFF' => 'Predis\Command\SetDifference', - 'SDIFFSTORE' => 'Predis\Command\SetDifferenceStore', - 'SMEMBERS' => 'Predis\Command\SetMembers', - 'SRANDMEMBER' => 'Predis\Command\SetRandomMember', - - /* commands operating on sorted sets */ - 'ZADD' => 'Predis\Command\ZSetAdd', - 'ZINCRBY' => 'Predis\Command\ZSetIncrementBy', - 'ZREM' => 'Predis\Command\ZSetRemove', - 'ZRANGE' => 'Predis\Command\ZSetRange', - 'ZREVRANGE' => 'Predis\Command\ZSetReverseRange', - 'ZRANGEBYSCORE' => 'Predis\Command\ZSetRangeByScore', - 'ZCARD' => 'Predis\Command\ZSetCardinality', - 'ZSCORE' => 'Predis\Command\ZSetScore', - 'ZREMRANGEBYSCORE' => 'Predis\Command\ZSetRemoveRangeByScore', - - /* connection related commands */ - 'PING' => 'Predis\Command\ConnectionPing', - 'AUTH' => 'Predis\Command\ConnectionAuth', - 'SELECT' => 'Predis\Command\ConnectionSelect', - 'ECHO' => 'Predis\Command\ConnectionEcho', - 'QUIT' => 'Predis\Command\ConnectionQuit', - - /* remote server control commands */ - 'INFO' => 'Predis\Command\ServerInfo', - 'SLAVEOF' => 'Predis\Command\ServerSlaveOf', - 'MONITOR' => 'Predis\Command\ServerMonitor', - 'DBSIZE' => 'Predis\Command\ServerDatabaseSize', - 'FLUSHDB' => 'Predis\Command\ServerFlushDatabase', - 'FLUSHALL' => 'Predis\Command\ServerFlushAll', - 'SAVE' => 'Predis\Command\ServerSave', - 'BGSAVE' => 'Predis\Command\ServerBackgroundSave', - 'LASTSAVE' => 'Predis\Command\ServerLastSave', - 'SHUTDOWN' => 'Predis\Command\ServerShutdown', - 'BGREWRITEAOF' => 'Predis\Command\ServerBackgroundRewriteAOF', - - /* ---------------- Redis 2.0 ---------------- */ - - /* commands operating on string values */ - 'SETEX' => 'Predis\Command\StringSetExpire', - 'APPEND' => 'Predis\Command\StringAppend', - 'SUBSTR' => 'Predis\Command\StringSubstr', - - /* commands operating on lists */ - 'BLPOP' => 'Predis\Command\ListPopFirstBlocking', - 'BRPOP' => 'Predis\Command\ListPopLastBlocking', - - /* commands operating on sorted sets */ - 'ZUNIONSTORE' => 'Predis\Command\ZSetUnionStore', - 'ZINTERSTORE' => 'Predis\Command\ZSetIntersectionStore', - 'ZCOUNT' => 'Predis\Command\ZSetCount', - 'ZRANK' => 'Predis\Command\ZSetRank', - 'ZREVRANK' => 'Predis\Command\ZSetReverseRank', - 'ZREMRANGEBYRANK' => 'Predis\Command\ZSetRemoveRangeByRank', - - /* commands operating on hashes */ - 'HSET' => 'Predis\Command\HashSet', - 'HSETNX' => 'Predis\Command\HashSetPreserve', - 'HMSET' => 'Predis\Command\HashSetMultiple', - 'HINCRBY' => 'Predis\Command\HashIncrementBy', - 'HGET' => 'Predis\Command\HashGet', - 'HMGET' => 'Predis\Command\HashGetMultiple', - 'HDEL' => 'Predis\Command\HashDelete', - 'HEXISTS' => 'Predis\Command\HashExists', - 'HLEN' => 'Predis\Command\HashLength', - 'HKEYS' => 'Predis\Command\HashKeys', - 'HVALS' => 'Predis\Command\HashValues', - 'HGETALL' => 'Predis\Command\HashGetAll', - - /* transactions */ - 'MULTI' => 'Predis\Command\TransactionMulti', - 'EXEC' => 'Predis\Command\TransactionExec', - 'DISCARD' => 'Predis\Command\TransactionDiscard', - - /* publish - subscribe */ - 'SUBSCRIBE' => 'Predis\Command\PubSubSubscribe', - 'UNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribe', - 'PSUBSCRIBE' => 'Predis\Command\PubSubSubscribeByPattern', - 'PUNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribeByPattern', - 'PUBLISH' => 'Predis\Command\PubSubPublish', - - /* remote server control commands */ - 'CONFIG' => 'Predis\Command\ServerConfig', - - /* ---------------- Redis 2.2 ---------------- */ - - /* commands operating on the key space */ - 'PERSIST' => 'Predis\Command\KeyPersist', - - /* commands operating on string values */ - 'STRLEN' => 'Predis\Command\StringStrlen', - 'SETRANGE' => 'Predis\Command\StringSetRange', - 'GETRANGE' => 'Predis\Command\StringGetRange', - 'SETBIT' => 'Predis\Command\StringSetBit', - 'GETBIT' => 'Predis\Command\StringGetBit', - - /* commands operating on lists */ - 'RPUSHX' => 'Predis\Command\ListPushTailX', - 'LPUSHX' => 'Predis\Command\ListPushHeadX', - 'LINSERT' => 'Predis\Command\ListInsert', - 'BRPOPLPUSH' => 'Predis\Command\ListPopLastPushHeadBlocking', - - /* commands operating on sorted sets */ - 'ZREVRANGEBYSCORE' => 'Predis\Command\ZSetReverseRangeByScore', - - /* transactions */ - 'WATCH' => 'Predis\Command\TransactionWatch', - 'UNWATCH' => 'Predis\Command\TransactionUnwatch', - - /* remote server control commands */ - 'OBJECT' => 'Predis\Command\ServerObject', - 'SLOWLOG' => 'Predis\Command\ServerSlowlog', - ); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion240.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion240.php deleted file mode 100755 index 0856c37c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion240.php +++ /dev/null @@ -1,207 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Profile; - -/** - * Server profile for Redis 2.4. - * - * @author Daniele Alessandri - */ -class RedisVersion240 extends RedisProfile -{ - /** - * {@inheritdoc} - */ - public function getVersion() - { - return '2.4'; - } - - /** - * {@inheritdoc} - */ - public function getSupportedCommands() - { - return array( - /* ---------------- Redis 1.2 ---------------- */ - - /* commands operating on the key space */ - 'EXISTS' => 'Predis\Command\KeyExists', - 'DEL' => 'Predis\Command\KeyDelete', - 'TYPE' => 'Predis\Command\KeyType', - 'KEYS' => 'Predis\Command\KeyKeys', - 'RANDOMKEY' => 'Predis\Command\KeyRandom', - 'RENAME' => 'Predis\Command\KeyRename', - 'RENAMENX' => 'Predis\Command\KeyRenamePreserve', - 'EXPIRE' => 'Predis\Command\KeyExpire', - 'EXPIREAT' => 'Predis\Command\KeyExpireAt', - 'TTL' => 'Predis\Command\KeyTimeToLive', - 'MOVE' => 'Predis\Command\KeyMove', - 'SORT' => 'Predis\Command\KeySort', - - /* commands operating on string values */ - 'SET' => 'Predis\Command\StringSet', - 'SETNX' => 'Predis\Command\StringSetPreserve', - 'MSET' => 'Predis\Command\StringSetMultiple', - 'MSETNX' => 'Predis\Command\StringSetMultiplePreserve', - 'GET' => 'Predis\Command\StringGet', - 'MGET' => 'Predis\Command\StringGetMultiple', - 'GETSET' => 'Predis\Command\StringGetSet', - 'INCR' => 'Predis\Command\StringIncrement', - 'INCRBY' => 'Predis\Command\StringIncrementBy', - 'DECR' => 'Predis\Command\StringDecrement', - 'DECRBY' => 'Predis\Command\StringDecrementBy', - - /* commands operating on lists */ - 'RPUSH' => 'Predis\Command\ListPushTail', - 'LPUSH' => 'Predis\Command\ListPushHead', - 'LLEN' => 'Predis\Command\ListLength', - 'LRANGE' => 'Predis\Command\ListRange', - 'LTRIM' => 'Predis\Command\ListTrim', - 'LINDEX' => 'Predis\Command\ListIndex', - 'LSET' => 'Predis\Command\ListSet', - 'LREM' => 'Predis\Command\ListRemove', - 'LPOP' => 'Predis\Command\ListPopFirst', - 'RPOP' => 'Predis\Command\ListPopLast', - 'RPOPLPUSH' => 'Predis\Command\ListPopLastPushHead', - - /* commands operating on sets */ - 'SADD' => 'Predis\Command\SetAdd', - 'SREM' => 'Predis\Command\SetRemove', - 'SPOP' => 'Predis\Command\SetPop', - 'SMOVE' => 'Predis\Command\SetMove', - 'SCARD' => 'Predis\Command\SetCardinality', - 'SISMEMBER' => 'Predis\Command\SetIsMember', - 'SINTER' => 'Predis\Command\SetIntersection', - 'SINTERSTORE' => 'Predis\Command\SetIntersectionStore', - 'SUNION' => 'Predis\Command\SetUnion', - 'SUNIONSTORE' => 'Predis\Command\SetUnionStore', - 'SDIFF' => 'Predis\Command\SetDifference', - 'SDIFFSTORE' => 'Predis\Command\SetDifferenceStore', - 'SMEMBERS' => 'Predis\Command\SetMembers', - 'SRANDMEMBER' => 'Predis\Command\SetRandomMember', - - /* commands operating on sorted sets */ - 'ZADD' => 'Predis\Command\ZSetAdd', - 'ZINCRBY' => 'Predis\Command\ZSetIncrementBy', - 'ZREM' => 'Predis\Command\ZSetRemove', - 'ZRANGE' => 'Predis\Command\ZSetRange', - 'ZREVRANGE' => 'Predis\Command\ZSetReverseRange', - 'ZRANGEBYSCORE' => 'Predis\Command\ZSetRangeByScore', - 'ZCARD' => 'Predis\Command\ZSetCardinality', - 'ZSCORE' => 'Predis\Command\ZSetScore', - 'ZREMRANGEBYSCORE' => 'Predis\Command\ZSetRemoveRangeByScore', - - /* connection related commands */ - 'PING' => 'Predis\Command\ConnectionPing', - 'AUTH' => 'Predis\Command\ConnectionAuth', - 'SELECT' => 'Predis\Command\ConnectionSelect', - 'ECHO' => 'Predis\Command\ConnectionEcho', - 'QUIT' => 'Predis\Command\ConnectionQuit', - - /* remote server control commands */ - 'INFO' => 'Predis\Command\ServerInfo', - 'SLAVEOF' => 'Predis\Command\ServerSlaveOf', - 'MONITOR' => 'Predis\Command\ServerMonitor', - 'DBSIZE' => 'Predis\Command\ServerDatabaseSize', - 'FLUSHDB' => 'Predis\Command\ServerFlushDatabase', - 'FLUSHALL' => 'Predis\Command\ServerFlushAll', - 'SAVE' => 'Predis\Command\ServerSave', - 'BGSAVE' => 'Predis\Command\ServerBackgroundSave', - 'LASTSAVE' => 'Predis\Command\ServerLastSave', - 'SHUTDOWN' => 'Predis\Command\ServerShutdown', - 'BGREWRITEAOF' => 'Predis\Command\ServerBackgroundRewriteAOF', - - /* ---------------- Redis 2.0 ---------------- */ - - /* commands operating on string values */ - 'SETEX' => 'Predis\Command\StringSetExpire', - 'APPEND' => 'Predis\Command\StringAppend', - 'SUBSTR' => 'Predis\Command\StringSubstr', - - /* commands operating on lists */ - 'BLPOP' => 'Predis\Command\ListPopFirstBlocking', - 'BRPOP' => 'Predis\Command\ListPopLastBlocking', - - /* commands operating on sorted sets */ - 'ZUNIONSTORE' => 'Predis\Command\ZSetUnionStore', - 'ZINTERSTORE' => 'Predis\Command\ZSetIntersectionStore', - 'ZCOUNT' => 'Predis\Command\ZSetCount', - 'ZRANK' => 'Predis\Command\ZSetRank', - 'ZREVRANK' => 'Predis\Command\ZSetReverseRank', - 'ZREMRANGEBYRANK' => 'Predis\Command\ZSetRemoveRangeByRank', - - /* commands operating on hashes */ - 'HSET' => 'Predis\Command\HashSet', - 'HSETNX' => 'Predis\Command\HashSetPreserve', - 'HMSET' => 'Predis\Command\HashSetMultiple', - 'HINCRBY' => 'Predis\Command\HashIncrementBy', - 'HGET' => 'Predis\Command\HashGet', - 'HMGET' => 'Predis\Command\HashGetMultiple', - 'HDEL' => 'Predis\Command\HashDelete', - 'HEXISTS' => 'Predis\Command\HashExists', - 'HLEN' => 'Predis\Command\HashLength', - 'HKEYS' => 'Predis\Command\HashKeys', - 'HVALS' => 'Predis\Command\HashValues', - 'HGETALL' => 'Predis\Command\HashGetAll', - - /* transactions */ - 'MULTI' => 'Predis\Command\TransactionMulti', - 'EXEC' => 'Predis\Command\TransactionExec', - 'DISCARD' => 'Predis\Command\TransactionDiscard', - - /* publish - subscribe */ - 'SUBSCRIBE' => 'Predis\Command\PubSubSubscribe', - 'UNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribe', - 'PSUBSCRIBE' => 'Predis\Command\PubSubSubscribeByPattern', - 'PUNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribeByPattern', - 'PUBLISH' => 'Predis\Command\PubSubPublish', - - /* remote server control commands */ - 'CONFIG' => 'Predis\Command\ServerConfig', - - /* ---------------- Redis 2.2 ---------------- */ - - /* commands operating on the key space */ - 'PERSIST' => 'Predis\Command\KeyPersist', - - /* commands operating on string values */ - 'STRLEN' => 'Predis\Command\StringStrlen', - 'SETRANGE' => 'Predis\Command\StringSetRange', - 'GETRANGE' => 'Predis\Command\StringGetRange', - 'SETBIT' => 'Predis\Command\StringSetBit', - 'GETBIT' => 'Predis\Command\StringGetBit', - - /* commands operating on lists */ - 'RPUSHX' => 'Predis\Command\ListPushTailX', - 'LPUSHX' => 'Predis\Command\ListPushHeadX', - 'LINSERT' => 'Predis\Command\ListInsert', - 'BRPOPLPUSH' => 'Predis\Command\ListPopLastPushHeadBlocking', - - /* commands operating on sorted sets */ - 'ZREVRANGEBYSCORE' => 'Predis\Command\ZSetReverseRangeByScore', - - /* transactions */ - 'WATCH' => 'Predis\Command\TransactionWatch', - 'UNWATCH' => 'Predis\Command\TransactionUnwatch', - - /* remote server control commands */ - 'OBJECT' => 'Predis\Command\ServerObject', - 'SLOWLOG' => 'Predis\Command\ServerSlowlog', - - /* ---------------- Redis 2.4 ---------------- */ - - /* remote server control commands */ - 'CLIENT' => 'Predis\Command\ServerClient', - ); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion260.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion260.php deleted file mode 100755 index ba5084aa..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion260.php +++ /dev/null @@ -1,235 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Profile; - -/** - * Server profile for Redis 2.6. - * - * @author Daniele Alessandri - */ -class RedisVersion260 extends RedisProfile -{ - /** - * {@inheritdoc} - */ - public function getVersion() - { - return '2.6'; - } - - /** - * {@inheritdoc} - */ - public function getSupportedCommands() - { - return array( - /* ---------------- Redis 1.2 ---------------- */ - - /* commands operating on the key space */ - 'EXISTS' => 'Predis\Command\KeyExists', - 'DEL' => 'Predis\Command\KeyDelete', - 'TYPE' => 'Predis\Command\KeyType', - 'KEYS' => 'Predis\Command\KeyKeys', - 'RANDOMKEY' => 'Predis\Command\KeyRandom', - 'RENAME' => 'Predis\Command\KeyRename', - 'RENAMENX' => 'Predis\Command\KeyRenamePreserve', - 'EXPIRE' => 'Predis\Command\KeyExpire', - 'EXPIREAT' => 'Predis\Command\KeyExpireAt', - 'TTL' => 'Predis\Command\KeyTimeToLive', - 'MOVE' => 'Predis\Command\KeyMove', - 'SORT' => 'Predis\Command\KeySort', - 'DUMP' => 'Predis\Command\KeyDump', - 'RESTORE' => 'Predis\Command\KeyRestore', - - /* commands operating on string values */ - 'SET' => 'Predis\Command\StringSet', - 'SETNX' => 'Predis\Command\StringSetPreserve', - 'MSET' => 'Predis\Command\StringSetMultiple', - 'MSETNX' => 'Predis\Command\StringSetMultiplePreserve', - 'GET' => 'Predis\Command\StringGet', - 'MGET' => 'Predis\Command\StringGetMultiple', - 'GETSET' => 'Predis\Command\StringGetSet', - 'INCR' => 'Predis\Command\StringIncrement', - 'INCRBY' => 'Predis\Command\StringIncrementBy', - 'DECR' => 'Predis\Command\StringDecrement', - 'DECRBY' => 'Predis\Command\StringDecrementBy', - - /* commands operating on lists */ - 'RPUSH' => 'Predis\Command\ListPushTail', - 'LPUSH' => 'Predis\Command\ListPushHead', - 'LLEN' => 'Predis\Command\ListLength', - 'LRANGE' => 'Predis\Command\ListRange', - 'LTRIM' => 'Predis\Command\ListTrim', - 'LINDEX' => 'Predis\Command\ListIndex', - 'LSET' => 'Predis\Command\ListSet', - 'LREM' => 'Predis\Command\ListRemove', - 'LPOP' => 'Predis\Command\ListPopFirst', - 'RPOP' => 'Predis\Command\ListPopLast', - 'RPOPLPUSH' => 'Predis\Command\ListPopLastPushHead', - - /* commands operating on sets */ - 'SADD' => 'Predis\Command\SetAdd', - 'SREM' => 'Predis\Command\SetRemove', - 'SPOP' => 'Predis\Command\SetPop', - 'SMOVE' => 'Predis\Command\SetMove', - 'SCARD' => 'Predis\Command\SetCardinality', - 'SISMEMBER' => 'Predis\Command\SetIsMember', - 'SINTER' => 'Predis\Command\SetIntersection', - 'SINTERSTORE' => 'Predis\Command\SetIntersectionStore', - 'SUNION' => 'Predis\Command\SetUnion', - 'SUNIONSTORE' => 'Predis\Command\SetUnionStore', - 'SDIFF' => 'Predis\Command\SetDifference', - 'SDIFFSTORE' => 'Predis\Command\SetDifferenceStore', - 'SMEMBERS' => 'Predis\Command\SetMembers', - 'SRANDMEMBER' => 'Predis\Command\SetRandomMember', - - /* commands operating on sorted sets */ - 'ZADD' => 'Predis\Command\ZSetAdd', - 'ZINCRBY' => 'Predis\Command\ZSetIncrementBy', - 'ZREM' => 'Predis\Command\ZSetRemove', - 'ZRANGE' => 'Predis\Command\ZSetRange', - 'ZREVRANGE' => 'Predis\Command\ZSetReverseRange', - 'ZRANGEBYSCORE' => 'Predis\Command\ZSetRangeByScore', - 'ZCARD' => 'Predis\Command\ZSetCardinality', - 'ZSCORE' => 'Predis\Command\ZSetScore', - 'ZREMRANGEBYSCORE' => 'Predis\Command\ZSetRemoveRangeByScore', - - /* connection related commands */ - 'PING' => 'Predis\Command\ConnectionPing', - 'AUTH' => 'Predis\Command\ConnectionAuth', - 'SELECT' => 'Predis\Command\ConnectionSelect', - 'ECHO' => 'Predis\Command\ConnectionEcho', - 'QUIT' => 'Predis\Command\ConnectionQuit', - - /* remote server control commands */ - 'INFO' => 'Predis\Command\ServerInfoV26x', - 'SLAVEOF' => 'Predis\Command\ServerSlaveOf', - 'MONITOR' => 'Predis\Command\ServerMonitor', - 'DBSIZE' => 'Predis\Command\ServerDatabaseSize', - 'FLUSHDB' => 'Predis\Command\ServerFlushDatabase', - 'FLUSHALL' => 'Predis\Command\ServerFlushAll', - 'SAVE' => 'Predis\Command\ServerSave', - 'BGSAVE' => 'Predis\Command\ServerBackgroundSave', - 'LASTSAVE' => 'Predis\Command\ServerLastSave', - 'SHUTDOWN' => 'Predis\Command\ServerShutdown', - 'BGREWRITEAOF' => 'Predis\Command\ServerBackgroundRewriteAOF', - - /* ---------------- Redis 2.0 ---------------- */ - - /* commands operating on string values */ - 'SETEX' => 'Predis\Command\StringSetExpire', - 'APPEND' => 'Predis\Command\StringAppend', - 'SUBSTR' => 'Predis\Command\StringSubstr', - - /* commands operating on lists */ - 'BLPOP' => 'Predis\Command\ListPopFirstBlocking', - 'BRPOP' => 'Predis\Command\ListPopLastBlocking', - - /* commands operating on sorted sets */ - 'ZUNIONSTORE' => 'Predis\Command\ZSetUnionStore', - 'ZINTERSTORE' => 'Predis\Command\ZSetIntersectionStore', - 'ZCOUNT' => 'Predis\Command\ZSetCount', - 'ZRANK' => 'Predis\Command\ZSetRank', - 'ZREVRANK' => 'Predis\Command\ZSetReverseRank', - 'ZREMRANGEBYRANK' => 'Predis\Command\ZSetRemoveRangeByRank', - - /* commands operating on hashes */ - 'HSET' => 'Predis\Command\HashSet', - 'HSETNX' => 'Predis\Command\HashSetPreserve', - 'HMSET' => 'Predis\Command\HashSetMultiple', - 'HINCRBY' => 'Predis\Command\HashIncrementBy', - 'HGET' => 'Predis\Command\HashGet', - 'HMGET' => 'Predis\Command\HashGetMultiple', - 'HDEL' => 'Predis\Command\HashDelete', - 'HEXISTS' => 'Predis\Command\HashExists', - 'HLEN' => 'Predis\Command\HashLength', - 'HKEYS' => 'Predis\Command\HashKeys', - 'HVALS' => 'Predis\Command\HashValues', - 'HGETALL' => 'Predis\Command\HashGetAll', - - /* transactions */ - 'MULTI' => 'Predis\Command\TransactionMulti', - 'EXEC' => 'Predis\Command\TransactionExec', - 'DISCARD' => 'Predis\Command\TransactionDiscard', - - /* publish - subscribe */ - 'SUBSCRIBE' => 'Predis\Command\PubSubSubscribe', - 'UNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribe', - 'PSUBSCRIBE' => 'Predis\Command\PubSubSubscribeByPattern', - 'PUNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribeByPattern', - 'PUBLISH' => 'Predis\Command\PubSubPublish', - - /* remote server control commands */ - 'CONFIG' => 'Predis\Command\ServerConfig', - - /* ---------------- Redis 2.2 ---------------- */ - - /* commands operating on the key space */ - 'PERSIST' => 'Predis\Command\KeyPersist', - - /* commands operating on string values */ - 'STRLEN' => 'Predis\Command\StringStrlen', - 'SETRANGE' => 'Predis\Command\StringSetRange', - 'GETRANGE' => 'Predis\Command\StringGetRange', - 'SETBIT' => 'Predis\Command\StringSetBit', - 'GETBIT' => 'Predis\Command\StringGetBit', - - /* commands operating on lists */ - 'RPUSHX' => 'Predis\Command\ListPushTailX', - 'LPUSHX' => 'Predis\Command\ListPushHeadX', - 'LINSERT' => 'Predis\Command\ListInsert', - 'BRPOPLPUSH' => 'Predis\Command\ListPopLastPushHeadBlocking', - - /* commands operating on sorted sets */ - 'ZREVRANGEBYSCORE' => 'Predis\Command\ZSetReverseRangeByScore', - - /* transactions */ - 'WATCH' => 'Predis\Command\TransactionWatch', - 'UNWATCH' => 'Predis\Command\TransactionUnwatch', - - /* remote server control commands */ - 'OBJECT' => 'Predis\Command\ServerObject', - 'SLOWLOG' => 'Predis\Command\ServerSlowlog', - - /* ---------------- Redis 2.4 ---------------- */ - - /* remote server control commands */ - 'CLIENT' => 'Predis\Command\ServerClient', - - /* ---------------- Redis 2.6 ---------------- */ - - /* commands operating on the key space */ - 'PTTL' => 'Predis\Command\KeyPreciseTimeToLive', - 'PEXPIRE' => 'Predis\Command\KeyPreciseExpire', - 'PEXPIREAT' => 'Predis\Command\KeyPreciseExpireAt', - 'MIGRATE' => 'Predis\Command\KeyMigrate', - - /* commands operating on string values */ - 'PSETEX' => 'Predis\Command\StringPreciseSetExpire', - 'INCRBYFLOAT' => 'Predis\Command\StringIncrementByFloat', - 'BITOP' => 'Predis\Command\StringBitOp', - 'BITCOUNT' => 'Predis\Command\StringBitCount', - - /* commands operating on hashes */ - 'HINCRBYFLOAT' => 'Predis\Command\HashIncrementByFloat', - - /* scripting */ - 'EVAL' => 'Predis\Command\ServerEval', - 'EVALSHA' => 'Predis\Command\ServerEvalSHA', - 'SCRIPT' => 'Predis\Command\ServerScript', - - /* remote server control commands */ - 'TIME' => 'Predis\Command\ServerTime', - 'SENTINEL' => 'Predis\Command\ServerSentinel', - ); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion280.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion280.php deleted file mode 100755 index ea17e682..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion280.php +++ /dev/null @@ -1,267 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Profile; - -/** - * Server profile for Redis 2.8. - * - * @author Daniele Alessandri - */ -class RedisVersion280 extends RedisProfile -{ - /** - * {@inheritdoc} - */ - public function getVersion() - { - return '2.8'; - } - - /** - * {@inheritdoc} - */ - public function getSupportedCommands() - { - return array( - /* ---------------- Redis 1.2 ---------------- */ - - /* commands operating on the key space */ - 'EXISTS' => 'Predis\Command\KeyExists', - 'DEL' => 'Predis\Command\KeyDelete', - 'TYPE' => 'Predis\Command\KeyType', - 'KEYS' => 'Predis\Command\KeyKeys', - 'RANDOMKEY' => 'Predis\Command\KeyRandom', - 'RENAME' => 'Predis\Command\KeyRename', - 'RENAMENX' => 'Predis\Command\KeyRenamePreserve', - 'EXPIRE' => 'Predis\Command\KeyExpire', - 'EXPIREAT' => 'Predis\Command\KeyExpireAt', - 'TTL' => 'Predis\Command\KeyTimeToLive', - 'MOVE' => 'Predis\Command\KeyMove', - 'SORT' => 'Predis\Command\KeySort', - 'DUMP' => 'Predis\Command\KeyDump', - 'RESTORE' => 'Predis\Command\KeyRestore', - - /* commands operating on string values */ - 'SET' => 'Predis\Command\StringSet', - 'SETNX' => 'Predis\Command\StringSetPreserve', - 'MSET' => 'Predis\Command\StringSetMultiple', - 'MSETNX' => 'Predis\Command\StringSetMultiplePreserve', - 'GET' => 'Predis\Command\StringGet', - 'MGET' => 'Predis\Command\StringGetMultiple', - 'GETSET' => 'Predis\Command\StringGetSet', - 'INCR' => 'Predis\Command\StringIncrement', - 'INCRBY' => 'Predis\Command\StringIncrementBy', - 'DECR' => 'Predis\Command\StringDecrement', - 'DECRBY' => 'Predis\Command\StringDecrementBy', - - /* commands operating on lists */ - 'RPUSH' => 'Predis\Command\ListPushTail', - 'LPUSH' => 'Predis\Command\ListPushHead', - 'LLEN' => 'Predis\Command\ListLength', - 'LRANGE' => 'Predis\Command\ListRange', - 'LTRIM' => 'Predis\Command\ListTrim', - 'LINDEX' => 'Predis\Command\ListIndex', - 'LSET' => 'Predis\Command\ListSet', - 'LREM' => 'Predis\Command\ListRemove', - 'LPOP' => 'Predis\Command\ListPopFirst', - 'RPOP' => 'Predis\Command\ListPopLast', - 'RPOPLPUSH' => 'Predis\Command\ListPopLastPushHead', - - /* commands operating on sets */ - 'SADD' => 'Predis\Command\SetAdd', - 'SREM' => 'Predis\Command\SetRemove', - 'SPOP' => 'Predis\Command\SetPop', - 'SMOVE' => 'Predis\Command\SetMove', - 'SCARD' => 'Predis\Command\SetCardinality', - 'SISMEMBER' => 'Predis\Command\SetIsMember', - 'SINTER' => 'Predis\Command\SetIntersection', - 'SINTERSTORE' => 'Predis\Command\SetIntersectionStore', - 'SUNION' => 'Predis\Command\SetUnion', - 'SUNIONSTORE' => 'Predis\Command\SetUnionStore', - 'SDIFF' => 'Predis\Command\SetDifference', - 'SDIFFSTORE' => 'Predis\Command\SetDifferenceStore', - 'SMEMBERS' => 'Predis\Command\SetMembers', - 'SRANDMEMBER' => 'Predis\Command\SetRandomMember', - - /* commands operating on sorted sets */ - 'ZADD' => 'Predis\Command\ZSetAdd', - 'ZINCRBY' => 'Predis\Command\ZSetIncrementBy', - 'ZREM' => 'Predis\Command\ZSetRemove', - 'ZRANGE' => 'Predis\Command\ZSetRange', - 'ZREVRANGE' => 'Predis\Command\ZSetReverseRange', - 'ZRANGEBYSCORE' => 'Predis\Command\ZSetRangeByScore', - 'ZCARD' => 'Predis\Command\ZSetCardinality', - 'ZSCORE' => 'Predis\Command\ZSetScore', - 'ZREMRANGEBYSCORE' => 'Predis\Command\ZSetRemoveRangeByScore', - - /* connection related commands */ - 'PING' => 'Predis\Command\ConnectionPing', - 'AUTH' => 'Predis\Command\ConnectionAuth', - 'SELECT' => 'Predis\Command\ConnectionSelect', - 'ECHO' => 'Predis\Command\ConnectionEcho', - 'QUIT' => 'Predis\Command\ConnectionQuit', - - /* remote server control commands */ - 'INFO' => 'Predis\Command\ServerInfoV26x', - 'SLAVEOF' => 'Predis\Command\ServerSlaveOf', - 'MONITOR' => 'Predis\Command\ServerMonitor', - 'DBSIZE' => 'Predis\Command\ServerDatabaseSize', - 'FLUSHDB' => 'Predis\Command\ServerFlushDatabase', - 'FLUSHALL' => 'Predis\Command\ServerFlushAll', - 'SAVE' => 'Predis\Command\ServerSave', - 'BGSAVE' => 'Predis\Command\ServerBackgroundSave', - 'LASTSAVE' => 'Predis\Command\ServerLastSave', - 'SHUTDOWN' => 'Predis\Command\ServerShutdown', - 'BGREWRITEAOF' => 'Predis\Command\ServerBackgroundRewriteAOF', - - /* ---------------- Redis 2.0 ---------------- */ - - /* commands operating on string values */ - 'SETEX' => 'Predis\Command\StringSetExpire', - 'APPEND' => 'Predis\Command\StringAppend', - 'SUBSTR' => 'Predis\Command\StringSubstr', - - /* commands operating on lists */ - 'BLPOP' => 'Predis\Command\ListPopFirstBlocking', - 'BRPOP' => 'Predis\Command\ListPopLastBlocking', - - /* commands operating on sorted sets */ - 'ZUNIONSTORE' => 'Predis\Command\ZSetUnionStore', - 'ZINTERSTORE' => 'Predis\Command\ZSetIntersectionStore', - 'ZCOUNT' => 'Predis\Command\ZSetCount', - 'ZRANK' => 'Predis\Command\ZSetRank', - 'ZREVRANK' => 'Predis\Command\ZSetReverseRank', - 'ZREMRANGEBYRANK' => 'Predis\Command\ZSetRemoveRangeByRank', - - /* commands operating on hashes */ - 'HSET' => 'Predis\Command\HashSet', - 'HSETNX' => 'Predis\Command\HashSetPreserve', - 'HMSET' => 'Predis\Command\HashSetMultiple', - 'HINCRBY' => 'Predis\Command\HashIncrementBy', - 'HGET' => 'Predis\Command\HashGet', - 'HMGET' => 'Predis\Command\HashGetMultiple', - 'HDEL' => 'Predis\Command\HashDelete', - 'HEXISTS' => 'Predis\Command\HashExists', - 'HLEN' => 'Predis\Command\HashLength', - 'HKEYS' => 'Predis\Command\HashKeys', - 'HVALS' => 'Predis\Command\HashValues', - 'HGETALL' => 'Predis\Command\HashGetAll', - - /* transactions */ - 'MULTI' => 'Predis\Command\TransactionMulti', - 'EXEC' => 'Predis\Command\TransactionExec', - 'DISCARD' => 'Predis\Command\TransactionDiscard', - - /* publish - subscribe */ - 'SUBSCRIBE' => 'Predis\Command\PubSubSubscribe', - 'UNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribe', - 'PSUBSCRIBE' => 'Predis\Command\PubSubSubscribeByPattern', - 'PUNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribeByPattern', - 'PUBLISH' => 'Predis\Command\PubSubPublish', - - /* remote server control commands */ - 'CONFIG' => 'Predis\Command\ServerConfig', - - /* ---------------- Redis 2.2 ---------------- */ - - /* commands operating on the key space */ - 'PERSIST' => 'Predis\Command\KeyPersist', - - /* commands operating on string values */ - 'STRLEN' => 'Predis\Command\StringStrlen', - 'SETRANGE' => 'Predis\Command\StringSetRange', - 'GETRANGE' => 'Predis\Command\StringGetRange', - 'SETBIT' => 'Predis\Command\StringSetBit', - 'GETBIT' => 'Predis\Command\StringGetBit', - - /* commands operating on lists */ - 'RPUSHX' => 'Predis\Command\ListPushTailX', - 'LPUSHX' => 'Predis\Command\ListPushHeadX', - 'LINSERT' => 'Predis\Command\ListInsert', - 'BRPOPLPUSH' => 'Predis\Command\ListPopLastPushHeadBlocking', - - /* commands operating on sorted sets */ - 'ZREVRANGEBYSCORE' => 'Predis\Command\ZSetReverseRangeByScore', - - /* transactions */ - 'WATCH' => 'Predis\Command\TransactionWatch', - 'UNWATCH' => 'Predis\Command\TransactionUnwatch', - - /* remote server control commands */ - 'OBJECT' => 'Predis\Command\ServerObject', - 'SLOWLOG' => 'Predis\Command\ServerSlowlog', - - /* ---------------- Redis 2.4 ---------------- */ - - /* remote server control commands */ - 'CLIENT' => 'Predis\Command\ServerClient', - - /* ---------------- Redis 2.6 ---------------- */ - - /* commands operating on the key space */ - 'PTTL' => 'Predis\Command\KeyPreciseTimeToLive', - 'PEXPIRE' => 'Predis\Command\KeyPreciseExpire', - 'PEXPIREAT' => 'Predis\Command\KeyPreciseExpireAt', - 'MIGRATE' => 'Predis\Command\KeyMigrate', - - /* commands operating on string values */ - 'PSETEX' => 'Predis\Command\StringPreciseSetExpire', - 'INCRBYFLOAT' => 'Predis\Command\StringIncrementByFloat', - 'BITOP' => 'Predis\Command\StringBitOp', - 'BITCOUNT' => 'Predis\Command\StringBitCount', - - /* commands operating on hashes */ - 'HINCRBYFLOAT' => 'Predis\Command\HashIncrementByFloat', - - /* scripting */ - 'EVAL' => 'Predis\Command\ServerEval', - 'EVALSHA' => 'Predis\Command\ServerEvalSHA', - 'SCRIPT' => 'Predis\Command\ServerScript', - - /* remote server control commands */ - 'TIME' => 'Predis\Command\ServerTime', - 'SENTINEL' => 'Predis\Command\ServerSentinel', - - /* ---------------- Redis 2.8 ---------------- */ - - /* commands operating on the key space */ - 'SCAN' => 'Predis\Command\KeyScan', - - /* commands operating on string values */ - 'BITPOS' => 'Predis\Command\StringBitPos', - - /* commands operating on sets */ - 'SSCAN' => 'Predis\Command\SetScan', - - /* commands operating on sorted sets */ - 'ZSCAN' => 'Predis\Command\ZSetScan', - 'ZLEXCOUNT' => 'Predis\Command\ZSetLexCount', - 'ZRANGEBYLEX' => 'Predis\Command\ZSetRangeByLex', - 'ZREMRANGEBYLEX' => 'Predis\Command\ZSetRemoveRangeByLex', - 'ZREVRANGEBYLEX' => 'Predis\Command\ZSetReverseRangeByLex', - - /* commands operating on hashes */ - 'HSCAN' => 'Predis\Command\HashScan', - - /* publish - subscribe */ - 'PUBSUB' => 'Predis\Command\PubSubPubsub', - - /* commands operating on HyperLogLog */ - 'PFADD' => 'Predis\Command\HyperLogLogAdd', - 'PFCOUNT' => 'Predis\Command\HyperLogLogCount', - 'PFMERGE' => 'Predis\Command\HyperLogLogMerge', - - /* remote server control commands */ - 'COMMAND' => 'Predis\Command\ServerCommand', - ); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion300.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion300.php deleted file mode 100755 index 8a2fac8b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Profile/RedisVersion300.php +++ /dev/null @@ -1,270 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Profile; - -/** - * Server profile for Redis 3.0. - * - * @author Daniele Alessandri - */ -class RedisVersion300 extends RedisProfile -{ - /** - * {@inheritdoc} - */ - public function getVersion() - { - return '3.0'; - } - - /** - * {@inheritdoc} - */ - public function getSupportedCommands() - { - return array( - /* ---------------- Redis 1.2 ---------------- */ - - /* commands operating on the key space */ - 'EXISTS' => 'Predis\Command\KeyExists', - 'DEL' => 'Predis\Command\KeyDelete', - 'TYPE' => 'Predis\Command\KeyType', - 'KEYS' => 'Predis\Command\KeyKeys', - 'RANDOMKEY' => 'Predis\Command\KeyRandom', - 'RENAME' => 'Predis\Command\KeyRename', - 'RENAMENX' => 'Predis\Command\KeyRenamePreserve', - 'EXPIRE' => 'Predis\Command\KeyExpire', - 'EXPIREAT' => 'Predis\Command\KeyExpireAt', - 'TTL' => 'Predis\Command\KeyTimeToLive', - 'MOVE' => 'Predis\Command\KeyMove', - 'SORT' => 'Predis\Command\KeySort', - 'DUMP' => 'Predis\Command\KeyDump', - 'RESTORE' => 'Predis\Command\KeyRestore', - - /* commands operating on string values */ - 'SET' => 'Predis\Command\StringSet', - 'SETNX' => 'Predis\Command\StringSetPreserve', - 'MSET' => 'Predis\Command\StringSetMultiple', - 'MSETNX' => 'Predis\Command\StringSetMultiplePreserve', - 'GET' => 'Predis\Command\StringGet', - 'MGET' => 'Predis\Command\StringGetMultiple', - 'GETSET' => 'Predis\Command\StringGetSet', - 'INCR' => 'Predis\Command\StringIncrement', - 'INCRBY' => 'Predis\Command\StringIncrementBy', - 'DECR' => 'Predis\Command\StringDecrement', - 'DECRBY' => 'Predis\Command\StringDecrementBy', - - /* commands operating on lists */ - 'RPUSH' => 'Predis\Command\ListPushTail', - 'LPUSH' => 'Predis\Command\ListPushHead', - 'LLEN' => 'Predis\Command\ListLength', - 'LRANGE' => 'Predis\Command\ListRange', - 'LTRIM' => 'Predis\Command\ListTrim', - 'LINDEX' => 'Predis\Command\ListIndex', - 'LSET' => 'Predis\Command\ListSet', - 'LREM' => 'Predis\Command\ListRemove', - 'LPOP' => 'Predis\Command\ListPopFirst', - 'RPOP' => 'Predis\Command\ListPopLast', - 'RPOPLPUSH' => 'Predis\Command\ListPopLastPushHead', - - /* commands operating on sets */ - 'SADD' => 'Predis\Command\SetAdd', - 'SREM' => 'Predis\Command\SetRemove', - 'SPOP' => 'Predis\Command\SetPop', - 'SMOVE' => 'Predis\Command\SetMove', - 'SCARD' => 'Predis\Command\SetCardinality', - 'SISMEMBER' => 'Predis\Command\SetIsMember', - 'SINTER' => 'Predis\Command\SetIntersection', - 'SINTERSTORE' => 'Predis\Command\SetIntersectionStore', - 'SUNION' => 'Predis\Command\SetUnion', - 'SUNIONSTORE' => 'Predis\Command\SetUnionStore', - 'SDIFF' => 'Predis\Command\SetDifference', - 'SDIFFSTORE' => 'Predis\Command\SetDifferenceStore', - 'SMEMBERS' => 'Predis\Command\SetMembers', - 'SRANDMEMBER' => 'Predis\Command\SetRandomMember', - - /* commands operating on sorted sets */ - 'ZADD' => 'Predis\Command\ZSetAdd', - 'ZINCRBY' => 'Predis\Command\ZSetIncrementBy', - 'ZREM' => 'Predis\Command\ZSetRemove', - 'ZRANGE' => 'Predis\Command\ZSetRange', - 'ZREVRANGE' => 'Predis\Command\ZSetReverseRange', - 'ZRANGEBYSCORE' => 'Predis\Command\ZSetRangeByScore', - 'ZCARD' => 'Predis\Command\ZSetCardinality', - 'ZSCORE' => 'Predis\Command\ZSetScore', - 'ZREMRANGEBYSCORE' => 'Predis\Command\ZSetRemoveRangeByScore', - - /* connection related commands */ - 'PING' => 'Predis\Command\ConnectionPing', - 'AUTH' => 'Predis\Command\ConnectionAuth', - 'SELECT' => 'Predis\Command\ConnectionSelect', - 'ECHO' => 'Predis\Command\ConnectionEcho', - 'QUIT' => 'Predis\Command\ConnectionQuit', - - /* remote server control commands */ - 'INFO' => 'Predis\Command\ServerInfoV26x', - 'SLAVEOF' => 'Predis\Command\ServerSlaveOf', - 'MONITOR' => 'Predis\Command\ServerMonitor', - 'DBSIZE' => 'Predis\Command\ServerDatabaseSize', - 'FLUSHDB' => 'Predis\Command\ServerFlushDatabase', - 'FLUSHALL' => 'Predis\Command\ServerFlushAll', - 'SAVE' => 'Predis\Command\ServerSave', - 'BGSAVE' => 'Predis\Command\ServerBackgroundSave', - 'LASTSAVE' => 'Predis\Command\ServerLastSave', - 'SHUTDOWN' => 'Predis\Command\ServerShutdown', - 'BGREWRITEAOF' => 'Predis\Command\ServerBackgroundRewriteAOF', - - /* ---------------- Redis 2.0 ---------------- */ - - /* commands operating on string values */ - 'SETEX' => 'Predis\Command\StringSetExpire', - 'APPEND' => 'Predis\Command\StringAppend', - 'SUBSTR' => 'Predis\Command\StringSubstr', - - /* commands operating on lists */ - 'BLPOP' => 'Predis\Command\ListPopFirstBlocking', - 'BRPOP' => 'Predis\Command\ListPopLastBlocking', - - /* commands operating on sorted sets */ - 'ZUNIONSTORE' => 'Predis\Command\ZSetUnionStore', - 'ZINTERSTORE' => 'Predis\Command\ZSetIntersectionStore', - 'ZCOUNT' => 'Predis\Command\ZSetCount', - 'ZRANK' => 'Predis\Command\ZSetRank', - 'ZREVRANK' => 'Predis\Command\ZSetReverseRank', - 'ZREMRANGEBYRANK' => 'Predis\Command\ZSetRemoveRangeByRank', - - /* commands operating on hashes */ - 'HSET' => 'Predis\Command\HashSet', - 'HSETNX' => 'Predis\Command\HashSetPreserve', - 'HMSET' => 'Predis\Command\HashSetMultiple', - 'HINCRBY' => 'Predis\Command\HashIncrementBy', - 'HGET' => 'Predis\Command\HashGet', - 'HMGET' => 'Predis\Command\HashGetMultiple', - 'HDEL' => 'Predis\Command\HashDelete', - 'HEXISTS' => 'Predis\Command\HashExists', - 'HLEN' => 'Predis\Command\HashLength', - 'HKEYS' => 'Predis\Command\HashKeys', - 'HVALS' => 'Predis\Command\HashValues', - 'HGETALL' => 'Predis\Command\HashGetAll', - - /* transactions */ - 'MULTI' => 'Predis\Command\TransactionMulti', - 'EXEC' => 'Predis\Command\TransactionExec', - 'DISCARD' => 'Predis\Command\TransactionDiscard', - - /* publish - subscribe */ - 'SUBSCRIBE' => 'Predis\Command\PubSubSubscribe', - 'UNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribe', - 'PSUBSCRIBE' => 'Predis\Command\PubSubSubscribeByPattern', - 'PUNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribeByPattern', - 'PUBLISH' => 'Predis\Command\PubSubPublish', - - /* remote server control commands */ - 'CONFIG' => 'Predis\Command\ServerConfig', - - /* ---------------- Redis 2.2 ---------------- */ - - /* commands operating on the key space */ - 'PERSIST' => 'Predis\Command\KeyPersist', - - /* commands operating on string values */ - 'STRLEN' => 'Predis\Command\StringStrlen', - 'SETRANGE' => 'Predis\Command\StringSetRange', - 'GETRANGE' => 'Predis\Command\StringGetRange', - 'SETBIT' => 'Predis\Command\StringSetBit', - 'GETBIT' => 'Predis\Command\StringGetBit', - - /* commands operating on lists */ - 'RPUSHX' => 'Predis\Command\ListPushTailX', - 'LPUSHX' => 'Predis\Command\ListPushHeadX', - 'LINSERT' => 'Predis\Command\ListInsert', - 'BRPOPLPUSH' => 'Predis\Command\ListPopLastPushHeadBlocking', - - /* commands operating on sorted sets */ - 'ZREVRANGEBYSCORE' => 'Predis\Command\ZSetReverseRangeByScore', - - /* transactions */ - 'WATCH' => 'Predis\Command\TransactionWatch', - 'UNWATCH' => 'Predis\Command\TransactionUnwatch', - - /* remote server control commands */ - 'OBJECT' => 'Predis\Command\ServerObject', - 'SLOWLOG' => 'Predis\Command\ServerSlowlog', - - /* ---------------- Redis 2.4 ---------------- */ - - /* remote server control commands */ - 'CLIENT' => 'Predis\Command\ServerClient', - - /* ---------------- Redis 2.6 ---------------- */ - - /* commands operating on the key space */ - 'PTTL' => 'Predis\Command\KeyPreciseTimeToLive', - 'PEXPIRE' => 'Predis\Command\KeyPreciseExpire', - 'PEXPIREAT' => 'Predis\Command\KeyPreciseExpireAt', - 'MIGRATE' => 'Predis\Command\KeyMigrate', - - /* commands operating on string values */ - 'PSETEX' => 'Predis\Command\StringPreciseSetExpire', - 'INCRBYFLOAT' => 'Predis\Command\StringIncrementByFloat', - 'BITOP' => 'Predis\Command\StringBitOp', - 'BITCOUNT' => 'Predis\Command\StringBitCount', - - /* commands operating on hashes */ - 'HINCRBYFLOAT' => 'Predis\Command\HashIncrementByFloat', - - /* scripting */ - 'EVAL' => 'Predis\Command\ServerEval', - 'EVALSHA' => 'Predis\Command\ServerEvalSHA', - 'SCRIPT' => 'Predis\Command\ServerScript', - - /* remote server control commands */ - 'TIME' => 'Predis\Command\ServerTime', - 'SENTINEL' => 'Predis\Command\ServerSentinel', - - /* ---------------- Redis 2.8 ---------------- */ - - /* commands operating on the key space */ - 'SCAN' => 'Predis\Command\KeyScan', - - /* commands operating on string values */ - 'BITPOS' => 'Predis\Command\StringBitPos', - - /* commands operating on sets */ - 'SSCAN' => 'Predis\Command\SetScan', - - /* commands operating on sorted sets */ - 'ZSCAN' => 'Predis\Command\ZSetScan', - 'ZLEXCOUNT' => 'Predis\Command\ZSetLexCount', - 'ZRANGEBYLEX' => 'Predis\Command\ZSetRangeByLex', - 'ZREMRANGEBYLEX' => 'Predis\Command\ZSetRemoveRangeByLex', - 'ZREVRANGEBYLEX' => 'Predis\Command\ZSetReverseRangeByLex', - - /* commands operating on hashes */ - 'HSCAN' => 'Predis\Command\HashScan', - - /* publish - subscribe */ - 'PUBSUB' => 'Predis\Command\PubSubPubsub', - - /* commands operating on HyperLogLog */ - 'PFADD' => 'Predis\Command\HyperLogLogAdd', - 'PFCOUNT' => 'Predis\Command\HyperLogLogCount', - 'PFMERGE' => 'Predis\Command\HyperLogLogMerge', - - /* remote server control commands */ - 'COMMAND' => 'Predis\Command\ServerCommand', - - /* ---------------- Redis 3.0 ---------------- */ - - ); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ProtocolException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ProtocolException.php deleted file mode 100755 index 6fe5d6d3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ProtocolException.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Protocol; - -use Predis\CommunicationException; - -/** - * Exception used to indentify errors encountered while parsing the Redis wire - * protocol. - * - * @author Daniele Alessandri - */ -class ProtocolException extends CommunicationException -{ -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ProtocolProcessorInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ProtocolProcessorInterface.php deleted file mode 100755 index b34ea181..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ProtocolProcessorInterface.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Protocol; - -use Predis\Command\CommandInterface; -use Predis\Connection\CompositeConnectionInterface; - -/** - * Defines a pluggable protocol processor capable of serializing commands and - * deserializing responses into PHP objects directly from a connection. - * - * @author Daniele Alessandri - */ -interface ProtocolProcessorInterface -{ - /** - * Writes a request over a connection to Redis. - * - * @param CompositeConnectionInterface $connection Redis connection. - * @param CommandInterface $command Command instance. - */ - public function write(CompositeConnectionInterface $connection, CommandInterface $command); - - /** - * Reads a response from a connection to Redis. - * - * @param CompositeConnectionInterface $connection Redis connection. - * - * @return mixed - */ - public function read(CompositeConnectionInterface $connection); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/RequestSerializerInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/RequestSerializerInterface.php deleted file mode 100755 index eef72a64..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/RequestSerializerInterface.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Protocol; - -use Predis\Command\CommandInterface; - -/** - * Defines a pluggable serializer for Redis commands. - * - * @author Daniele Alessandri - */ -interface RequestSerializerInterface -{ - /** - * Serializes a Redis command. - * - * @param CommandInterface $command Redis command. - * - * @return string - */ - public function serialize(CommandInterface $command); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ResponseReaderInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ResponseReaderInterface.php deleted file mode 100755 index 86a7bdcc..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/ResponseReaderInterface.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Protocol; - -use Predis\Connection\CompositeConnectionInterface; - -/** - * Defines a pluggable reader capable of parsing responses returned by Redis and - * deserializing them to PHP objects. - * - * @author Daniele Alessandri - */ -interface ResponseReaderInterface -{ - /** - * Reads a response from a connection to Redis. - * - * @param CompositeConnectionInterface $connection Redis connection. - * - * @return mixed - */ - public function read(CompositeConnectionInterface $connection); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/CompositeProtocolProcessor.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/CompositeProtocolProcessor.php deleted file mode 100755 index ea85ed30..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/CompositeProtocolProcessor.php +++ /dev/null @@ -1,107 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Protocol\Text; - -use Predis\Command\CommandInterface; -use Predis\Connection\CompositeConnectionInterface; -use Predis\Protocol\ProtocolProcessorInterface; -use Predis\Protocol\RequestSerializerInterface; -use Predis\Protocol\ResponseReaderInterface; - -/** - * Composite protocol processor for the standard Redis wire protocol using - * pluggable handlers to serialize requests and deserialize responses. - * - * @link http://redis.io/topics/protocol - * - * @author Daniele Alessandri - */ -class CompositeProtocolProcessor implements ProtocolProcessorInterface -{ - /* - * @var RequestSerializerInterface - */ - protected $serializer; - - /* - * @var ResponseReaderInterface - */ - protected $reader; - - /** - * @param RequestSerializerInterface $serializer Request serializer. - * @param ResponseReaderInterface $reader Response reader. - */ - public function __construct( - RequestSerializerInterface $serializer = null, - ResponseReaderInterface $reader = null - ) { - $this->setRequestSerializer($serializer ?: new RequestSerializer()); - $this->setResponseReader($reader ?: new ResponseReader()); - } - - /** - * {@inheritdoc} - */ - public function write(CompositeConnectionInterface $connection, CommandInterface $command) - { - $connection->writeBuffer($this->serializer->serialize($command)); - } - - /** - * {@inheritdoc} - */ - public function read(CompositeConnectionInterface $connection) - { - return $this->reader->read($connection); - } - - /** - * Sets the request serializer used by the protocol processor. - * - * @param RequestSerializerInterface $serializer Request serializer. - */ - public function setRequestSerializer(RequestSerializerInterface $serializer) - { - $this->serializer = $serializer; - } - - /** - * Returns the request serializer used by the protocol processor. - * - * @return RequestSerializerInterface - */ - public function getRequestSerializer() - { - return $this->serializer; - } - - /** - * Sets the response reader used by the protocol processor. - * - * @param ResponseReaderInterface $reader Response reader. - */ - public function setResponseReader(ResponseReaderInterface $reader) - { - $this->reader = $reader; - } - - /** - * Returns the Response reader used by the protocol processor. - * - * @return ResponseReaderInterface - */ - public function getResponseReader() - { - return $this->reader; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/BulkResponse.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/BulkResponse.php deleted file mode 100755 index 5b0bf3c2..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/BulkResponse.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Protocol\Text\Handler; - -use Predis\CommunicationException; -use Predis\Connection\CompositeConnectionInterface; -use Predis\Protocol\ProtocolException; - -/** - * Handler for the bulk response type in the standard Redis wire protocol. - * It translates the payload to a string or a NULL. - * - * @link http://redis.io/topics/protocol - * - * @author Daniele Alessandri - */ -class BulkResponse implements ResponseHandlerInterface -{ - /** - * {@inheritdoc} - */ - public function handle(CompositeConnectionInterface $connection, $payload) - { - $length = (int) $payload; - - if ("$length" !== $payload) { - CommunicationException::handle(new ProtocolException( - $connection, "Cannot parse '$payload' as a valid length for a bulk response." - )); - } - - if ($length >= 0) { - return substr($connection->readBuffer($length + 2), 0, -2); - } - - if ($length == -1) { - return; - } - - CommunicationException::handle(new ProtocolException( - $connection, "Value '$payload' is not a valid length for a bulk response." - )); - - return; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/ErrorResponse.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/ErrorResponse.php deleted file mode 100755 index 3e18b7b9..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/ErrorResponse.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Protocol\Text\Handler; - -use Predis\Connection\CompositeConnectionInterface; -use Predis\Response\Error; - -/** - * Handler for the error response type in the standard Redis wire protocol. - * It translates the payload to a complex response object for Predis. - * - * @link http://redis.io/topics/protocol - * - * @author Daniele Alessandri - */ -class ErrorResponse implements ResponseHandlerInterface -{ - /** - * {@inheritdoc} - */ - public function handle(CompositeConnectionInterface $connection, $payload) - { - return new Error($payload); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/IntegerResponse.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/IntegerResponse.php deleted file mode 100755 index 4639d779..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/IntegerResponse.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Protocol\Text\Handler; - -use Predis\CommunicationException; -use Predis\Connection\CompositeConnectionInterface; -use Predis\Protocol\ProtocolException; - -/** - * Handler for the integer response type in the standard Redis wire protocol. - * It translates the payload an integer or NULL. - * - * @link http://redis.io/topics/protocol - * - * @author Daniele Alessandri - */ -class IntegerResponse implements ResponseHandlerInterface -{ - /** - * {@inheritdoc} - */ - public function handle(CompositeConnectionInterface $connection, $payload) - { - if (is_numeric($payload)) { - return (int) $payload; - } - - if ($payload !== 'nil') { - CommunicationException::handle(new ProtocolException( - $connection, "Cannot parse '$payload' as a valid numeric response." - )); - } - - return; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/MultiBulkResponse.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/MultiBulkResponse.php deleted file mode 100755 index 820b9b4a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/MultiBulkResponse.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Protocol\Text\Handler; - -use Predis\CommunicationException; -use Predis\Connection\CompositeConnectionInterface; -use Predis\Protocol\ProtocolException; - -/** - * Handler for the multibulk response type in the standard Redis wire protocol. - * It returns multibulk responses as PHP arrays. - * - * @link http://redis.io/topics/protocol - * - * @author Daniele Alessandri - */ -class MultiBulkResponse implements ResponseHandlerInterface -{ - /** - * {@inheritdoc} - */ - public function handle(CompositeConnectionInterface $connection, $payload) - { - $length = (int) $payload; - - if ("$length" !== $payload) { - CommunicationException::handle(new ProtocolException( - $connection, "Cannot parse '$payload' as a valid length of a multi-bulk response." - )); - } - - if ($length === -1) { - return; - } - - $list = array(); - - if ($length > 0) { - $handlersCache = array(); - $reader = $connection->getProtocol()->getResponseReader(); - - for ($i = 0; $i < $length; ++$i) { - $header = $connection->readLine(); - $prefix = $header[0]; - - if (isset($handlersCache[$prefix])) { - $handler = $handlersCache[$prefix]; - } else { - $handler = $reader->getHandler($prefix); - $handlersCache[$prefix] = $handler; - } - - $list[$i] = $handler->handle($connection, substr($header, 1)); - } - } - - return $list; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/ResponseHandlerInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/ResponseHandlerInterface.php deleted file mode 100755 index ca08a9c5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/ResponseHandlerInterface.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Protocol\Text\Handler; - -use Predis\Connection\CompositeConnectionInterface; - -/** - * Defines a pluggable handler used to parse a particular type of response. - * - * @author Daniele Alessandri - */ -interface ResponseHandlerInterface -{ - /** - * Deserializes a response returned by Redis and reads more data from the - * connection if needed. - * - * @param CompositeConnectionInterface $connection Redis connection. - * @param string $payload String payload. - * - * @return mixed - */ - public function handle(CompositeConnectionInterface $connection, $payload); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/StatusResponse.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/StatusResponse.php deleted file mode 100755 index 7bde5558..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/StatusResponse.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Protocol\Text\Handler; - -use Predis\Connection\CompositeConnectionInterface; -use Predis\Response\Status; - -/** - * Handler for the status response type in the standard Redis wire protocol. It - * translates certain classes of status response to PHP objects or just returns - * the payload as a string. - * - * @link http://redis.io/topics/protocol - * - * @author Daniele Alessandri - */ -class StatusResponse implements ResponseHandlerInterface -{ - /** - * {@inheritdoc} - */ - public function handle(CompositeConnectionInterface $connection, $payload) - { - return Status::get($payload); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/StreamableMultiBulkResponse.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/StreamableMultiBulkResponse.php deleted file mode 100755 index 7cdb736a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/Handler/StreamableMultiBulkResponse.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Protocol\Text\Handler; - -use Predis\CommunicationException; -use Predis\Connection\CompositeConnectionInterface; -use Predis\Protocol\ProtocolException; -use Predis\Response\Iterator\MultiBulk as MultiBulkIterator; - -/** - * Handler for the multibulk response type in the standard Redis wire protocol. - * It returns multibulk responses as iterators that can stream bulk elements. - * - * Streamable multibulk responses are not globally supported by the abstractions - * built-in into Predis, such as transactions or pipelines. Use them with care! - * - * @link http://redis.io/topics/protocol - * - * @author Daniele Alessandri - */ -class StreamableMultiBulkResponse implements ResponseHandlerInterface -{ - /** - * {@inheritdoc} - */ - public function handle(CompositeConnectionInterface $connection, $payload) - { - $length = (int) $payload; - - if ("$length" != $payload) { - CommunicationException::handle(new ProtocolException( - $connection, "Cannot parse '$payload' as a valid length for a multi-bulk response." - )); - } - - return new MultiBulkIterator($connection, $length); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/ProtocolProcessor.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/ProtocolProcessor.php deleted file mode 100755 index f04c3ed5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/ProtocolProcessor.php +++ /dev/null @@ -1,122 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Protocol\Text; - -use Predis\Command\CommandInterface; -use Predis\CommunicationException; -use Predis\Connection\CompositeConnectionInterface; -use Predis\Protocol\ProtocolException; -use Predis\Protocol\ProtocolProcessorInterface; -use Predis\Response\Error as ErrorResponse; -use Predis\Response\Iterator\MultiBulk as MultiBulkIterator; -use Predis\Response\Status as StatusResponse; - -/** - * Protocol processor for the standard Redis wire protocol. - * - * @link http://redis.io/topics/protocol - * - * @author Daniele Alessandri - */ -class ProtocolProcessor implements ProtocolProcessorInterface -{ - protected $mbiterable; - protected $serializer; - - /** - * - */ - public function __construct() - { - $this->mbiterable = false; - $this->serializer = new RequestSerializer(); - } - - /** - * {@inheritdoc} - */ - public function write(CompositeConnectionInterface $connection, CommandInterface $command) - { - $request = $this->serializer->serialize($command); - $connection->writeBuffer($request); - } - - /** - * {@inheritdoc} - */ - public function read(CompositeConnectionInterface $connection) - { - $chunk = $connection->readLine(); - $prefix = $chunk[0]; - $payload = substr($chunk, 1); - - switch ($prefix) { - case '+': - return new StatusResponse($payload); - - case '$': - $size = (int) $payload; - if ($size === -1) { - return; - } - - return substr($connection->readBuffer($size + 2), 0, -2); - - case '*': - $count = (int) $payload; - - if ($count === -1) { - return; - } - if ($this->mbiterable) { - return new MultiBulkIterator($connection, $count); - } - - $multibulk = array(); - - for ($i = 0; $i < $count; ++$i) { - $multibulk[$i] = $this->read($connection); - } - - return $multibulk; - - case ':': - return (int) $payload; - - case '-': - return new ErrorResponse($payload); - - default: - CommunicationException::handle(new ProtocolException( - $connection, "Unknown response prefix: '$prefix'." - )); - - return; - } - } - - /** - * Enables or disables returning multibulk responses as specialized PHP - * iterators used to stream bulk elements of a multibulk response instead - * returning a plain array. - * - * Streamable multibulk responses are not globally supported by the - * abstractions built-in into Predis, such as transactions or pipelines. - * Use them with care! - * - * @param bool $value Enable or disable streamable multibulk responses. - */ - public function useIterableMultibulk($value) - { - $this->mbiterable = (bool) $value; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/RequestSerializer.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/RequestSerializer.php deleted file mode 100755 index c8cbbfbc..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/RequestSerializer.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Protocol\Text; - -use Predis\Command\CommandInterface; -use Predis\Protocol\RequestSerializerInterface; - -/** - * Request serializer for the standard Redis wire protocol. - * - * @link http://redis.io/topics/protocol - * - * @author Daniele Alessandri - */ -class RequestSerializer implements RequestSerializerInterface -{ - /** - * {@inheritdoc} - */ - public function serialize(CommandInterface $command) - { - $commandID = $command->getId(); - $arguments = $command->getArguments(); - - $cmdlen = strlen($commandID); - $reqlen = count($arguments) + 1; - - $buffer = "*{$reqlen}\r\n\${$cmdlen}\r\n{$commandID}\r\n"; - - for ($i = 0, $reqlen--; $i < $reqlen; ++$i) { - $argument = $arguments[$i]; - $arglen = strlen($argument); - $buffer .= "\${$arglen}\r\n{$argument}\r\n"; - } - - return $buffer; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/ResponseReader.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/ResponseReader.php deleted file mode 100755 index d96218df..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Protocol/Text/ResponseReader.php +++ /dev/null @@ -1,116 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Protocol\Text; - -use Predis\CommunicationException; -use Predis\Connection\CompositeConnectionInterface; -use Predis\Protocol\ProtocolException; -use Predis\Protocol\ResponseReaderInterface; - -/** - * Response reader for the standard Redis wire protocol. - * - * @link http://redis.io/topics/protocol - * - * @author Daniele Alessandri - */ -class ResponseReader implements ResponseReaderInterface -{ - protected $handlers; - - /** - * - */ - public function __construct() - { - $this->handlers = $this->getDefaultHandlers(); - } - - /** - * Returns the default handlers for the supported type of responses. - * - * @return array - */ - protected function getDefaultHandlers() - { - return array( - '+' => new Handler\StatusResponse(), - '-' => new Handler\ErrorResponse(), - ':' => new Handler\IntegerResponse(), - '$' => new Handler\BulkResponse(), - '*' => new Handler\MultiBulkResponse(), - ); - } - - /** - * Sets the handler for the specified prefix identifying the response type. - * - * @param string $prefix Identifier of the type of response. - * @param Handler\ResponseHandlerInterface $handler Response handler. - */ - public function setHandler($prefix, Handler\ResponseHandlerInterface $handler) - { - $this->handlers[$prefix] = $handler; - } - - /** - * Returns the response handler associated to a certain type of response. - * - * @param string $prefix Identifier of the type of response. - * - * @return Handler\ResponseHandlerInterface - */ - public function getHandler($prefix) - { - if (isset($this->handlers[$prefix])) { - return $this->handlers[$prefix]; - } - - return; - } - - /** - * {@inheritdoc} - */ - public function read(CompositeConnectionInterface $connection) - { - $header = $connection->readLine(); - - if ($header === '') { - $this->onProtocolError($connection, 'Unexpected empty reponse header.'); - } - - $prefix = $header[0]; - - if (!isset($this->handlers[$prefix])) { - $this->onProtocolError($connection, "Unknown response prefix: '$prefix'."); - } - - $payload = $this->handlers[$prefix]->handle($connection, substr($header, 1)); - - return $payload; - } - - /** - * Handles protocol errors generated while reading responses from a - * connection. - * - * @param CompositeConnectionInterface $connection Redis connection that generated the error. - * @param string $message Error message. - */ - protected function onProtocolError(CompositeConnectionInterface $connection, $message) - { - CommunicationException::handle( - new ProtocolException($connection, $message) - ); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/AbstractConsumer.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/AbstractConsumer.php deleted file mode 100755 index d7423f1e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/AbstractConsumer.php +++ /dev/null @@ -1,219 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\PubSub; - -/** - * Base implementation of a PUB/SUB consumer abstraction based on PHP iterators. - * - * @author Daniele Alessandri - */ -abstract class AbstractConsumer implements \Iterator -{ - const SUBSCRIBE = 'subscribe'; - const UNSUBSCRIBE = 'unsubscribe'; - const PSUBSCRIBE = 'psubscribe'; - const PUNSUBSCRIBE = 'punsubscribe'; - const MESSAGE = 'message'; - const PMESSAGE = 'pmessage'; - const PONG = 'pong'; - - const STATUS_VALID = 1; // 0b0001 - const STATUS_SUBSCRIBED = 2; // 0b0010 - const STATUS_PSUBSCRIBED = 4; // 0b0100 - - private $position = null; - private $statusFlags = self::STATUS_VALID; - - /** - * Automatically stops the consumer when the garbage collector kicks in. - */ - public function __destruct() - { - $this->stop(true); - } - - /** - * Checks if the specified flag is valid based on the state of the consumer. - * - * @param int $value Flag. - * - * @return bool - */ - protected function isFlagSet($value) - { - return ($this->statusFlags & $value) === $value; - } - - /** - * Subscribes to the specified channels. - * - * @param mixed $channel,... One or more channel names. - */ - public function subscribe($channel /*, ... */) - { - $this->writeRequest(self::SUBSCRIBE, func_get_args()); - $this->statusFlags |= self::STATUS_SUBSCRIBED; - } - - /** - * Unsubscribes from the specified channels. - * - * @param string ... One or more channel names. - */ - public function unsubscribe(/* ... */) - { - $this->writeRequest(self::UNSUBSCRIBE, func_get_args()); - } - - /** - * Subscribes to the specified channels using a pattern. - * - * @param mixed $pattern,... One or more channel name patterns. - */ - public function psubscribe($pattern /* ... */) - { - $this->writeRequest(self::PSUBSCRIBE, func_get_args()); - $this->statusFlags |= self::STATUS_PSUBSCRIBED; - } - - /** - * Unsubscribes from the specified channels using a pattern. - * - * @param string ... One or more channel name patterns. - */ - public function punsubscribe(/* ... */) - { - $this->writeRequest(self::PUNSUBSCRIBE, func_get_args()); - } - - /** - * PING the server with an optional payload that will be echoed as a - * PONG message in the pub/sub loop. - * - * @param string $payload Optional PING payload. - */ - public function ping($payload = null) - { - $this->writeRequest('PING', array($payload)); - } - - /** - * Closes the context by unsubscribing from all the subscribed channels. The - * context can be forcefully closed by dropping the underlying connection. - * - * @param bool $drop Indicates if the context should be closed by dropping the connection. - * - * @return bool Returns false when there are no pending messages. - */ - public function stop($drop = false) - { - if (!$this->valid()) { - return false; - } - - if ($drop) { - $this->invalidate(); - $this->disconnect(); - } else { - if ($this->isFlagSet(self::STATUS_SUBSCRIBED)) { - $this->unsubscribe(); - } - if ($this->isFlagSet(self::STATUS_PSUBSCRIBED)) { - $this->punsubscribe(); - } - } - - return !$drop; - } - - /** - * Closes the underlying connection when forcing a disconnection. - */ - abstract protected function disconnect(); - - /** - * Writes a Redis command on the underlying connection. - * - * @param string $method Command ID. - * @param array $arguments Arguments for the command. - */ - abstract protected function writeRequest($method, $arguments); - - /** - * {@inheritdoc} - */ - public function rewind() - { - // NOOP - } - - /** - * Returns the last message payload retrieved from the server and generated - * by one of the active subscriptions. - * - * @return array - */ - public function current() - { - return $this->getValue(); - } - - /** - * {@inheritdoc} - */ - public function key() - { - return $this->position; - } - - /** - * {@inheritdoc} - */ - public function next() - { - if ($this->valid()) { - ++$this->position; - } - - return $this->position; - } - - /** - * Checks if the the consumer is still in a valid state to continue. - * - * @return bool - */ - public function valid() - { - $isValid = $this->isFlagSet(self::STATUS_VALID); - $subscriptionFlags = self::STATUS_SUBSCRIBED | self::STATUS_PSUBSCRIBED; - $hasSubscriptions = ($this->statusFlags & $subscriptionFlags) > 0; - - return $isValid && $hasSubscriptions; - } - - /** - * Resets the state of the consumer. - */ - protected function invalidate() - { - $this->statusFlags = 0; // 0b0000; - } - - /** - * Waits for a new message from the server generated by one of the active - * subscriptions and returns it when available. - * - * @return array - */ - abstract protected function getValue(); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/Consumer.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/Consumer.php deleted file mode 100755 index 5f2d8a8b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/Consumer.php +++ /dev/null @@ -1,158 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\PubSub; - -use Predis\ClientException; -use Predis\ClientInterface; -use Predis\Command\Command; -use Predis\Connection\AggregateConnectionInterface; -use Predis\NotSupportedException; - -/** - * PUB/SUB consumer abstraction. - * - * @author Daniele Alessandri - */ -class Consumer extends AbstractConsumer -{ - private $client; - private $options; - - /** - * @param ClientInterface $client Client instance used by the consumer. - * @param array $options Options for the consumer initialization. - */ - public function __construct(ClientInterface $client, array $options = null) - { - $this->checkCapabilities($client); - - $this->options = $options ?: array(); - $this->client = $client; - - $this->genericSubscribeInit('subscribe'); - $this->genericSubscribeInit('psubscribe'); - } - - /** - * Returns the underlying client instance used by the pub/sub iterator. - * - * @return ClientInterface - */ - public function getClient() - { - return $this->client; - } - - /** - * Checks if the client instance satisfies the required conditions needed to - * initialize a PUB/SUB consumer. - * - * @param ClientInterface $client Client instance used by the consumer. - * - * @throws NotSupportedException - */ - private function checkCapabilities(ClientInterface $client) - { - if ($client->getConnection() instanceof AggregateConnectionInterface) { - throw new NotSupportedException( - 'Cannot initialize a PUB/SUB consumer over aggregate connections.' - ); - } - - $commands = array('publish', 'subscribe', 'unsubscribe', 'psubscribe', 'punsubscribe'); - - if ($client->getProfile()->supportsCommands($commands) === false) { - throw new NotSupportedException( - 'The current profile does not support PUB/SUB related commands.' - ); - } - } - - /** - * This method shares the logic to handle both SUBSCRIBE and PSUBSCRIBE. - * - * @param string $subscribeAction Type of subscription. - */ - private function genericSubscribeInit($subscribeAction) - { - if (isset($this->options[$subscribeAction])) { - $this->$subscribeAction($this->options[$subscribeAction]); - } - } - - /** - * {@inheritdoc} - */ - protected function writeRequest($method, $arguments) - { - $this->client->getConnection()->writeRequest( - $this->client->createCommand($method, - Command::normalizeArguments($arguments) - ) - ); - } - - /** - * {@inheritdoc} - */ - protected function disconnect() - { - $this->client->disconnect(); - } - - /** - * {@inheritdoc} - */ - protected function getValue() - { - $response = $this->client->getConnection()->read(); - - switch ($response[0]) { - case self::SUBSCRIBE: - case self::UNSUBSCRIBE: - case self::PSUBSCRIBE: - case self::PUNSUBSCRIBE: - if ($response[2] === 0) { - $this->invalidate(); - } - // The missing break here is intentional as we must process - // subscriptions and unsubscriptions as standard messages. - // no break - - case self::MESSAGE: - return (object) array( - 'kind' => $response[0], - 'channel' => $response[1], - 'payload' => $response[2], - ); - - case self::PMESSAGE: - return (object) array( - 'kind' => $response[0], - 'pattern' => $response[1], - 'channel' => $response[2], - 'payload' => $response[3], - ); - - case self::PONG: - return (object) array( - 'kind' => $response[0], - 'payload' => $response[1], - ); - - default: - throw new ClientException( - "Unknown message type '{$response[0]}' received in the PUB/SUB context." - ); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/DispatcherLoop.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/DispatcherLoop.php deleted file mode 100755 index 0d4a08ef..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/PubSub/DispatcherLoop.php +++ /dev/null @@ -1,170 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\PubSub; - -/** - * Method-dispatcher loop built around the client-side abstraction of a Redis - * PUB / SUB context. - * - * @author Daniele Alessandri - */ -class DispatcherLoop -{ - private $pubsub; - - protected $callbacks; - protected $defaultCallback; - protected $subscriptionCallback; - - /** - * @param Consumer $pubsub PubSub consumer instance used by the loop. - */ - public function __construct(Consumer $pubsub) - { - $this->callbacks = array(); - $this->pubsub = $pubsub; - } - - /** - * Checks if the passed argument is a valid callback. - * - * @param mixed $callable A callback. - * - * @throws \InvalidArgumentException - */ - protected function assertCallback($callable) - { - if (!is_callable($callable)) { - throw new \InvalidArgumentException('The given argument must be a callable object.'); - } - } - - /** - * Returns the underlying PUB / SUB context. - * - * @return Consumer - */ - public function getPubSubConsumer() - { - return $this->pubsub; - } - - /** - * Sets a callback that gets invoked upon new subscriptions. - * - * @param mixed $callable A callback. - */ - public function subscriptionCallback($callable = null) - { - if (isset($callable)) { - $this->assertCallback($callable); - } - - $this->subscriptionCallback = $callable; - } - - /** - * Sets a callback that gets invoked when a message is received on a - * channel that does not have an associated callback. - * - * @param mixed $callable A callback. - */ - public function defaultCallback($callable = null) - { - if (isset($callable)) { - $this->assertCallback($callable); - } - - $this->subscriptionCallback = $callable; - } - - /** - * Binds a callback to a channel. - * - * @param string $channel Channel name. - * @param Callable $callback A callback. - */ - public function attachCallback($channel, $callback) - { - $callbackName = $this->getPrefixKeys().$channel; - - $this->assertCallback($callback); - $this->callbacks[$callbackName] = $callback; - $this->pubsub->subscribe($channel); - } - - /** - * Stops listening to a channel and removes the associated callback. - * - * @param string $channel Redis channel. - */ - public function detachCallback($channel) - { - $callbackName = $this->getPrefixKeys().$channel; - - if (isset($this->callbacks[$callbackName])) { - unset($this->callbacks[$callbackName]); - $this->pubsub->unsubscribe($channel); - } - } - - /** - * Starts the dispatcher loop. - */ - public function run() - { - foreach ($this->pubsub as $message) { - $kind = $message->kind; - - if ($kind !== Consumer::MESSAGE && $kind !== Consumer::PMESSAGE) { - if (isset($this->subscriptionCallback)) { - $callback = $this->subscriptionCallback; - call_user_func($callback, $message); - } - - continue; - } - - if (isset($this->callbacks[$message->channel])) { - $callback = $this->callbacks[$message->channel]; - call_user_func($callback, $message->payload); - } elseif (isset($this->defaultCallback)) { - $callback = $this->defaultCallback; - call_user_func($callback, $message); - } - } - } - - /** - * Terminates the dispatcher loop. - */ - public function stop() - { - $this->pubsub->stop(); - } - - /** - * Return the prefix used for keys. - * - * @return string - */ - protected function getPrefixKeys() - { - $options = $this->pubsub->getClient()->getOptions(); - - if (isset($options->prefix)) { - return $options->prefix->getPrefix(); - } - - return ''; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Replication/ReplicationStrategy.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Replication/ReplicationStrategy.php deleted file mode 100755 index 0b769405..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Replication/ReplicationStrategy.php +++ /dev/null @@ -1,237 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Replication; - -use Predis\Command\CommandInterface; -use Predis\NotSupportedException; - -/** - * Defines a strategy for master/slave replication. - * - * @author Daniele Alessandri - */ -class ReplicationStrategy -{ - protected $disallowed; - protected $readonly; - protected $readonlySHA1; - - /** - * - */ - public function __construct() - { - $this->disallowed = $this->getDisallowedOperations(); - $this->readonly = $this->getReadOnlyOperations(); - $this->readonlySHA1 = array(); - } - - /** - * Returns if the specified command will perform a read-only operation - * on Redis or not. - * - * @param CommandInterface $command Command instance. - * - * @throws NotSupportedException - * - * @return bool - */ - public function isReadOperation(CommandInterface $command) - { - if (isset($this->disallowed[$id = $command->getId()])) { - throw new NotSupportedException( - "The command '$id' is not allowed in replication mode." - ); - } - - if (isset($this->readonly[$id])) { - if (true === $readonly = $this->readonly[$id]) { - return true; - } - - return call_user_func($readonly, $command); - } - - if (($eval = $id === 'EVAL') || $id === 'EVALSHA') { - $sha1 = $eval ? sha1($command->getArgument(0)) : $command->getArgument(0); - - if (isset($this->readonlySHA1[$sha1])) { - if (true === $readonly = $this->readonlySHA1[$sha1]) { - return true; - } - - return call_user_func($readonly, $command); - } - } - - return false; - } - - /** - * Returns if the specified command is not allowed for execution in a master - * / slave replication context. - * - * @param CommandInterface $command Command instance. - * - * @return bool - */ - public function isDisallowedOperation(CommandInterface $command) - { - return isset($this->disallowed[$command->getId()]); - } - - /** - * Checks if a SORT command is a readable operation by parsing the arguments - * array of the specified commad instance. - * - * @param CommandInterface $command Command instance. - * - * @return bool - */ - protected function isSortReadOnly(CommandInterface $command) - { - $arguments = $command->getArguments(); - - return ($c = count($arguments)) === 1 ? true : $arguments[$c - 2] !== 'STORE'; - } - - /** - * Marks a command as a read-only operation. - * - * When the behavior of a command can be decided only at runtime depending - * on its arguments, a callable object can be provided to dynamically check - * if the specified command performs a read or a write operation. - * - * @param string $commandID Command ID. - * @param mixed $readonly A boolean value or a callable object. - */ - public function setCommandReadOnly($commandID, $readonly = true) - { - $commandID = strtoupper($commandID); - - if ($readonly) { - $this->readonly[$commandID] = $readonly; - } else { - unset($this->readonly[$commandID]); - } - } - - /** - * Marks a Lua script for EVAL and EVALSHA as a read-only operation. When - * the behaviour of a script can be decided only at runtime depending on - * its arguments, a callable object can be provided to dynamically check - * if the passed instance of EVAL or EVALSHA performs write operations or - * not. - * - * @param string $script Body of the Lua script. - * @param mixed $readonly A boolean value or a callable object. - */ - public function setScriptReadOnly($script, $readonly = true) - { - $sha1 = sha1($script); - - if ($readonly) { - $this->readonlySHA1[$sha1] = $readonly; - } else { - unset($this->readonlySHA1[$sha1]); - } - } - - /** - * Returns the default list of disallowed commands. - * - * @return array - */ - protected function getDisallowedOperations() - { - return array( - 'SHUTDOWN' => true, - 'INFO' => true, - 'DBSIZE' => true, - 'LASTSAVE' => true, - 'CONFIG' => true, - 'MONITOR' => true, - 'SLAVEOF' => true, - 'SAVE' => true, - 'BGSAVE' => true, - 'BGREWRITEAOF' => true, - 'SLOWLOG' => true, - ); - } - - /** - * Returns the default list of commands performing read-only operations. - * - * @return array - */ - protected function getReadOnlyOperations() - { - return array( - 'EXISTS' => true, - 'TYPE' => true, - 'KEYS' => true, - 'SCAN' => true, - 'RANDOMKEY' => true, - 'TTL' => true, - 'GET' => true, - 'MGET' => true, - 'SUBSTR' => true, - 'STRLEN' => true, - 'GETRANGE' => true, - 'GETBIT' => true, - 'LLEN' => true, - 'LRANGE' => true, - 'LINDEX' => true, - 'SCARD' => true, - 'SISMEMBER' => true, - 'SINTER' => true, - 'SUNION' => true, - 'SDIFF' => true, - 'SMEMBERS' => true, - 'SSCAN' => true, - 'SRANDMEMBER' => true, - 'ZRANGE' => true, - 'ZREVRANGE' => true, - 'ZRANGEBYSCORE' => true, - 'ZREVRANGEBYSCORE' => true, - 'ZCARD' => true, - 'ZSCORE' => true, - 'ZCOUNT' => true, - 'ZRANK' => true, - 'ZREVRANK' => true, - 'ZSCAN' => true, - 'ZLEXCOUNT' => true, - 'ZRANGEBYLEX' => true, - 'ZREVRANGEBYLEX' => true, - 'HGET' => true, - 'HMGET' => true, - 'HEXISTS' => true, - 'HLEN' => true, - 'HKEYS' => true, - 'HVALS' => true, - 'HGETALL' => true, - 'HSCAN' => true, - 'HSTRLEN' => true, - 'PING' => true, - 'AUTH' => true, - 'SELECT' => true, - 'ECHO' => true, - 'QUIT' => true, - 'OBJECT' => true, - 'BITCOUNT' => true, - 'BITPOS' => true, - 'TIME' => true, - 'PFCOUNT' => true, - 'SORT' => array($this, 'isSortReadOnly'), - ); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Error.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Error.php deleted file mode 100755 index 3933857e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Error.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Response; - -/** - * Represents an error returned by Redis (-ERR responses) during the execution - * of a command on the server. - * - * @author Daniele Alessandri - */ -class Error implements ErrorInterface -{ - private $message; - - /** - * @param string $message Error message returned by Redis - */ - public function __construct($message) - { - $this->message = $message; - } - - /** - * {@inheritdoc} - */ - public function getMessage() - { - return $this->message; - } - - /** - * {@inheritdoc} - */ - public function getErrorType() - { - list($errorType) = explode(' ', $this->getMessage(), 2); - - return $errorType; - } - - /** - * Converts the object to its string representation. - * - * @return string - */ - public function __toString() - { - return $this->getMessage(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ErrorInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ErrorInterface.php deleted file mode 100755 index a4a4a02f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ErrorInterface.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Response; - -/** - * Represents an error returned by Redis (responses identified by "-" in the - * Redis protocol) during the execution of an operation on the server. - * - * @author Daniele Alessandri - */ -interface ErrorInterface extends ResponseInterface -{ - /** - * Returns the error message. - * - * @return string - */ - public function getMessage(); - - /** - * Returns the error type (e.g. ERR, ASK, MOVED). - * - * @return string - */ - public function getErrorType(); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulk.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulk.php deleted file mode 100755 index b1d29241..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulk.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Response\Iterator; - -use Predis\Connection\NodeConnectionInterface; - -/** - * Streamable multibulk response. - * - * @author Daniele Alessandri - */ -class MultiBulk extends MultiBulkIterator -{ - private $connection; - - /** - * @param NodeConnectionInterface $connection Connection to Redis. - * @param int $size Number of elements of the multibulk response. - */ - public function __construct(NodeConnectionInterface $connection, $size) - { - $this->connection = $connection; - $this->size = $size; - $this->position = 0; - $this->current = $size > 0 ? $this->getValue() : null; - } - - /** - * Handles the synchronization of the client with the Redis protocol when - * the garbage collector kicks in (e.g. when the iterator goes out of the - * scope of a foreach or it is unset). - */ - public function __destruct() - { - $this->drop(true); - } - - /** - * Drop queued elements that have not been read from the connection either - * by consuming the rest of the multibulk response or quickly by closing the - * underlying connection. - * - * @param bool $disconnect Consume the iterator or drop the connection. - */ - public function drop($disconnect = false) - { - if ($disconnect) { - if ($this->valid()) { - $this->position = $this->size; - $this->connection->disconnect(); - } - } else { - while ($this->valid()) { - $this->next(); - } - } - } - - /** - * Reads the next item of the multibulk response from the connection. - * - * @return mixed - */ - protected function getValue() - { - return $this->connection->read(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulkIterator.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulkIterator.php deleted file mode 100755 index 5d328869..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulkIterator.php +++ /dev/null @@ -1,104 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Response\Iterator; - -use Predis\Response\ResponseInterface; - -/** - * Iterator that abstracts the access to multibulk responses allowing them to be - * consumed in a streamable fashion without keeping the whole payload in memory. - * - * This iterator does not support rewinding which means that the iteration, once - * consumed, cannot be restarted. - * - * Always make sure that the whole iteration is consumed (or dropped) to prevent - * protocol desynchronization issues. - * - * @author Daniele Alessandri - */ -abstract class MultiBulkIterator implements \Iterator, \Countable, ResponseInterface -{ - protected $current; - protected $position; - protected $size; - - /** - * {@inheritdoc} - */ - public function rewind() - { - // NOOP - } - - /** - * {@inheritdoc} - */ - public function current() - { - return $this->current; - } - - /** - * {@inheritdoc} - */ - public function key() - { - return $this->position; - } - - /** - * {@inheritdoc} - */ - public function next() - { - if (++$this->position < $this->size) { - $this->current = $this->getValue(); - } - } - - /** - * {@inheritdoc} - */ - public function valid() - { - return $this->position < $this->size; - } - - /** - * Returns the number of items comprising the whole multibulk response. - * - * This method should be used instead of iterator_count() to get the size of - * the current multibulk response since the former consumes the iteration to - * count the number of elements, but our iterators do not support rewinding. - * - * @return int - */ - public function count() - { - return $this->size; - } - - /** - * Returns the current position of the iterator. - * - * @return int - */ - public function getPosition() - { - return $this->position; - } - - /** - * {@inheritdoc} - */ - abstract protected function getValue(); -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulkTuple.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulkTuple.php deleted file mode 100755 index 2b6f593c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Iterator/MultiBulkTuple.php +++ /dev/null @@ -1,90 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Response\Iterator; - -/** - * Outer iterator consuming streamable multibulk responses by yielding tuples of - * keys and values. - * - * This wrapper is useful for responses to commands such as `HGETALL` that can - * be iterater as $key => $value pairs. - * - * @author Daniele Alessandri - */ -class MultiBulkTuple extends MultiBulk implements \OuterIterator -{ - private $iterator; - - /** - * @param MultiBulk $iterator Inner multibulk response iterator. - */ - public function __construct(MultiBulk $iterator) - { - $this->checkPreconditions($iterator); - - $this->size = count($iterator) / 2; - $this->iterator = $iterator; - $this->position = $iterator->getPosition(); - $this->current = $this->size > 0 ? $this->getValue() : null; - } - - /** - * Checks for valid preconditions. - * - * @param MultiBulk $iterator Inner multibulk response iterator. - * - * @throws \InvalidArgumentException - * @throws \UnexpectedValueException - */ - protected function checkPreconditions(MultiBulk $iterator) - { - if ($iterator->getPosition() !== 0) { - throw new \InvalidArgumentException( - 'Cannot initialize a tuple iterator using an already initiated iterator.' - ); - } - - if (($size = count($iterator)) % 2 !== 0) { - throw new \UnexpectedValueException('Invalid response size for a tuple iterator.'); - } - } - - /** - * {@inheritdoc} - */ - public function getInnerIterator() - { - return $this->iterator; - } - - /** - * {@inheritdoc} - */ - public function __destruct() - { - $this->iterator->drop(true); - } - - /** - * {@inheritdoc} - */ - protected function getValue() - { - $k = $this->iterator->current(); - $this->iterator->next(); - - $v = $this->iterator->current(); - $this->iterator->next(); - - return array($k, $v); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ResponseInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ResponseInterface.php deleted file mode 100755 index 0af13574..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ResponseInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Response; - -/** - * Represents a complex response object from Redis. - * - * @author Daniele Alessandri - */ -interface ResponseInterface -{ -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ServerException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ServerException.php deleted file mode 100755 index 407dc5b7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/ServerException.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Response; - -use Predis\PredisException; - -/** - * Exception class that identifies server-side Redis errors. - * - * @author Daniele Alessandri - */ -class ServerException extends PredisException implements ErrorInterface -{ - /** - * Gets the type of the error returned by Redis. - * - * @return string - */ - public function getErrorType() - { - list($errorType) = explode(' ', $this->getMessage(), 2); - - return $errorType; - } - - /** - * Converts the exception to an instance of Predis\Response\Error. - * - * @return Error - */ - public function toErrorResponse() - { - return new Error($this->getMessage()); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Status.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Status.php deleted file mode 100755 index 729bb663..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Response/Status.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Response; - -/** - * Represents a status response returned by Redis. - * - * @author Daniele Alessandri - */ -class Status implements ResponseInterface -{ - private static $OK; - private static $QUEUED; - - private $payload; - - /** - * @param string $payload Payload of the status response as returned by Redis. - */ - public function __construct($payload) - { - $this->payload = $payload; - } - - /** - * Converts the response object to its string representation. - * - * @return string - */ - public function __toString() - { - return $this->payload; - } - - /** - * Returns the payload of status response. - * - * @return string - */ - public function getPayload() - { - return $this->payload; - } - - /** - * Returns an instance of a status response object. - * - * Common status responses such as OK or QUEUED are cached in order to lower - * the global memory usage especially when using pipelines. - * - * @param string $payload Status response payload. - * - * @return string - */ - public static function get($payload) - { - switch ($payload) { - case 'OK': - case 'QUEUED': - if (isset(self::$$payload)) { - return self::$$payload; - } - - return self::$$payload = new self($payload); - - default: - return new self($payload); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Session/Handler.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Session/Handler.php deleted file mode 100755 index cecb9d53..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Session/Handler.php +++ /dev/null @@ -1,142 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Session; - -use Predis\ClientInterface; - -/** - * Session handler class that relies on Predis\Client to store PHP's sessions - * data into one or multiple Redis servers. - * - * This class is mostly intended for PHP 5.4 but it can be used under PHP 5.3 - * provided that a polyfill for `SessionHandlerInterface` is defined by either - * you or an external package such as `symfony/http-foundation`. - * - * @author Daniele Alessandri - */ -class Handler implements \SessionHandlerInterface -{ - protected $client; - protected $ttl; - - /** - * @param ClientInterface $client Fully initialized client instance. - * @param array $options Session handler options. - */ - public function __construct(ClientInterface $client, array $options = array()) - { - $this->client = $client; - - if (isset($options['gc_maxlifetime'])) { - $this->ttl = (int) $options['gc_maxlifetime']; - } else { - $this->ttl = ini_get('session.gc_maxlifetime'); - } - } - - /** - * Registers this instance as the current session handler. - */ - public function register() - { - if (PHP_VERSION_ID >= 50400) { - session_set_save_handler($this, true); - } else { - session_set_save_handler( - array($this, 'open'), - array($this, 'close'), - array($this, 'read'), - array($this, 'write'), - array($this, 'destroy'), - array($this, 'gc') - ); - } - } - - /** - * {@inheritdoc} - */ - public function open($save_path, $session_id) - { - // NOOP - return true; - } - - /** - * {@inheritdoc} - */ - public function close() - { - // NOOP - return true; - } - - /** - * {@inheritdoc} - */ - public function gc($maxlifetime) - { - // NOOP - return true; - } - - /** - * {@inheritdoc} - */ - public function read($session_id) - { - if ($data = $this->client->get($session_id)) { - return $data; - } - - return ''; - } - /** - * {@inheritdoc} - */ - public function write($session_id, $session_data) - { - $this->client->setex($session_id, $this->ttl, $session_data); - - return true; - } - - /** - * {@inheritdoc} - */ - public function destroy($session_id) - { - $this->client->del($session_id); - - return true; - } - - /** - * Returns the underlying client instance. - * - * @return ClientInterface - */ - public function getClient() - { - return $this->client; - } - - /** - * Returns the session max lifetime value. - * - * @return int - */ - public function getMaxLifeTime() - { - return $this->ttl; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/AbortedMultiExecException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/AbortedMultiExecException.php deleted file mode 100755 index b36f38aa..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/AbortedMultiExecException.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Transaction; - -use Predis\PredisException; - -/** - * Exception class that identifies a MULTI / EXEC transaction aborted by Redis. - * - * @author Daniele Alessandri - */ -class AbortedMultiExecException extends PredisException -{ - private $transaction; - - /** - * @param MultiExec $transaction Transaction that generated the exception. - * @param string $message Error message. - * @param int $code Error code. - */ - public function __construct(MultiExec $transaction, $message, $code = null) - { - parent::__construct($message, $code); - $this->transaction = $transaction; - } - - /** - * Returns the transaction that generated the exception. - * - * @return MultiExec - */ - public function getTransaction() - { - return $this->transaction; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/MultiExec.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/MultiExec.php deleted file mode 100755 index 0cf1962d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/MultiExec.php +++ /dev/null @@ -1,461 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Transaction; - -use Predis\ClientContextInterface; -use Predis\ClientException; -use Predis\ClientInterface; -use Predis\Command\CommandInterface; -use Predis\CommunicationException; -use Predis\Connection\AggregateConnectionInterface; -use Predis\NotSupportedException; -use Predis\Protocol\ProtocolException; -use Predis\Response\ErrorInterface as ErrorResponseInterface; -use Predis\Response\ServerException; -use Predis\Response\Status as StatusResponse; - -/** - * Client-side abstraction of a Redis transaction based on MULTI / EXEC. - * - * {@inheritdoc} - * - * @author Daniele Alessandri - */ -class MultiExec implements ClientContextInterface -{ - private $state; - - protected $client; - protected $commands; - protected $exceptions = true; - protected $attempts = 0; - protected $watchKeys = array(); - protected $modeCAS = false; - - /** - * @param ClientInterface $client Client instance used by the transaction. - * @param array $options Initialization options. - */ - public function __construct(ClientInterface $client, array $options = null) - { - $this->assertClient($client); - - $this->client = $client; - $this->state = new MultiExecState(); - - $this->configure($client, $options ?: array()); - $this->reset(); - } - - /** - * Checks if the passed client instance satisfies the required conditions - * needed to initialize the transaction object. - * - * @param ClientInterface $client Client instance used by the transaction object. - * - * @throws NotSupportedException - */ - private function assertClient(ClientInterface $client) - { - if ($client->getConnection() instanceof AggregateConnectionInterface) { - throw new NotSupportedException( - 'Cannot initialize a MULTI/EXEC transaction over aggregate connections.' - ); - } - - if (!$client->getProfile()->supportsCommands(array('MULTI', 'EXEC', 'DISCARD'))) { - throw new NotSupportedException( - 'The current profile does not support MULTI, EXEC and DISCARD.' - ); - } - } - - /** - * Configures the transaction using the provided options. - * - * @param ClientInterface $client Underlying client instance. - * @param array $options Array of options for the transaction. - **/ - protected function configure(ClientInterface $client, array $options) - { - if (isset($options['exceptions'])) { - $this->exceptions = (bool) $options['exceptions']; - } else { - $this->exceptions = $client->getOptions()->exceptions; - } - - if (isset($options['cas'])) { - $this->modeCAS = (bool) $options['cas']; - } - - if (isset($options['watch']) && $keys = $options['watch']) { - $this->watchKeys = $keys; - } - - if (isset($options['retry'])) { - $this->attempts = (int) $options['retry']; - } - } - - /** - * Resets the state of the transaction. - */ - protected function reset() - { - $this->state->reset(); - $this->commands = new \SplQueue(); - } - - /** - * Initializes the transaction context. - */ - protected function initialize() - { - if ($this->state->isInitialized()) { - return; - } - - if ($this->modeCAS) { - $this->state->flag(MultiExecState::CAS); - } - - if ($this->watchKeys) { - $this->watch($this->watchKeys); - } - - $cas = $this->state->isCAS(); - $discarded = $this->state->isDiscarded(); - - if (!$cas || ($cas && $discarded)) { - $this->call('MULTI'); - - if ($discarded) { - $this->state->unflag(MultiExecState::CAS); - } - } - - $this->state->unflag(MultiExecState::DISCARDED); - $this->state->flag(MultiExecState::INITIALIZED); - } - - /** - * Dynamically invokes a Redis command with the specified arguments. - * - * @param string $method Command ID. - * @param array $arguments Arguments for the command. - * - * @return mixed - */ - public function __call($method, $arguments) - { - return $this->executeCommand( - $this->client->createCommand($method, $arguments) - ); - } - - /** - * Executes a Redis command bypassing the transaction logic. - * - * @param string $commandID Command ID. - * @param array $arguments Arguments for the command. - * - * @throws ServerException - * - * @return mixed - */ - protected function call($commandID, array $arguments = array()) - { - $response = $this->client->executeCommand( - $this->client->createCommand($commandID, $arguments) - ); - - if ($response instanceof ErrorResponseInterface) { - throw new ServerException($response->getMessage()); - } - - return $response; - } - - /** - * Executes the specified Redis command. - * - * @param CommandInterface $command Command instance. - * - * @throws AbortedMultiExecException - * @throws CommunicationException - * - * @return $this|mixed - */ - public function executeCommand(CommandInterface $command) - { - $this->initialize(); - - if ($this->state->isCAS()) { - return $this->client->executeCommand($command); - } - - $response = $this->client->getConnection()->executeCommand($command); - - if ($response instanceof StatusResponse && $response == 'QUEUED') { - $this->commands->enqueue($command); - } elseif ($response instanceof ErrorResponseInterface) { - throw new AbortedMultiExecException($this, $response->getMessage()); - } else { - $this->onProtocolError('The server did not return a +QUEUED status response.'); - } - - return $this; - } - - /** - * Executes WATCH against one or more keys. - * - * @param string|array $keys One or more keys. - * - * @throws NotSupportedException - * @throws ClientException - * - * @return mixed - */ - public function watch($keys) - { - if (!$this->client->getProfile()->supportsCommand('WATCH')) { - throw new NotSupportedException('WATCH is not supported by the current profile.'); - } - - if ($this->state->isWatchAllowed()) { - throw new ClientException('Sending WATCH after MULTI is not allowed.'); - } - - $response = $this->call('WATCH', is_array($keys) ? $keys : array($keys)); - $this->state->flag(MultiExecState::WATCH); - - return $response; - } - - /** - * Finalizes the transaction by executing MULTI on the server. - * - * @return MultiExec - */ - public function multi() - { - if ($this->state->check(MultiExecState::INITIALIZED | MultiExecState::CAS)) { - $this->state->unflag(MultiExecState::CAS); - $this->call('MULTI'); - } else { - $this->initialize(); - } - - return $this; - } - - /** - * Executes UNWATCH. - * - * @throws NotSupportedException - * - * @return MultiExec - */ - public function unwatch() - { - if (!$this->client->getProfile()->supportsCommand('UNWATCH')) { - throw new NotSupportedException( - 'UNWATCH is not supported by the current profile.' - ); - } - - $this->state->unflag(MultiExecState::WATCH); - $this->__call('UNWATCH', array()); - - return $this; - } - - /** - * Resets the transaction by UNWATCH-ing the keys that are being WATCHed and - * DISCARD-ing pending commands that have been already sent to the server. - * - * @return MultiExec - */ - public function discard() - { - if ($this->state->isInitialized()) { - $this->call($this->state->isCAS() ? 'UNWATCH' : 'DISCARD'); - - $this->reset(); - $this->state->flag(MultiExecState::DISCARDED); - } - - return $this; - } - - /** - * Executes the whole transaction. - * - * @return mixed - */ - public function exec() - { - return $this->execute(); - } - - /** - * Checks the state of the transaction before execution. - * - * @param mixed $callable Callback for execution. - * - * @throws \InvalidArgumentException - * @throws ClientException - */ - private function checkBeforeExecution($callable) - { - if ($this->state->isExecuting()) { - throw new ClientException( - 'Cannot invoke "execute" or "exec" inside an active transaction context.' - ); - } - - if ($callable) { - if (!is_callable($callable)) { - throw new \InvalidArgumentException('The argument must be a callable object.'); - } - - if (!$this->commands->isEmpty()) { - $this->discard(); - - throw new ClientException( - 'Cannot execute a transaction block after using fluent interface.' - ); - } - } elseif ($this->attempts) { - $this->discard(); - - throw new ClientException( - 'Automatic retries are supported only when a callable block is provided.' - ); - } - } - - /** - * Handles the actual execution of the whole transaction. - * - * @param mixed $callable Optional callback for execution. - * - * @throws CommunicationException - * @throws AbortedMultiExecException - * @throws ServerException - * - * @return array - */ - public function execute($callable = null) - { - $this->checkBeforeExecution($callable); - - $execResponse = null; - $attempts = $this->attempts; - - do { - if ($callable) { - $this->executeTransactionBlock($callable); - } - - if ($this->commands->isEmpty()) { - if ($this->state->isWatching()) { - $this->discard(); - } - - return; - } - - $execResponse = $this->call('EXEC'); - - if ($execResponse === null) { - if ($attempts === 0) { - throw new AbortedMultiExecException( - $this, 'The current transaction has been aborted by the server.' - ); - } - - $this->reset(); - - continue; - } - - break; - } while ($attempts-- > 0); - - $response = array(); - $commands = $this->commands; - $size = count($execResponse); - - if ($size !== count($commands)) { - $this->onProtocolError('EXEC returned an unexpected number of response items.'); - } - - for ($i = 0; $i < $size; ++$i) { - $cmdResponse = $execResponse[$i]; - - if ($cmdResponse instanceof ErrorResponseInterface && $this->exceptions) { - throw new ServerException($cmdResponse->getMessage()); - } - - $response[$i] = $commands->dequeue()->parseResponse($cmdResponse); - } - - return $response; - } - - /** - * Passes the current transaction object to a callable block for execution. - * - * @param mixed $callable Callback. - * - * @throws CommunicationException - * @throws ServerException - */ - protected function executeTransactionBlock($callable) - { - $exception = null; - $this->state->flag(MultiExecState::INSIDEBLOCK); - - try { - call_user_func($callable, $this); - } catch (CommunicationException $exception) { - // NOOP - } catch (ServerException $exception) { - // NOOP - } catch (\Exception $exception) { - $this->discard(); - } - - $this->state->unflag(MultiExecState::INSIDEBLOCK); - - if ($exception) { - throw $exception; - } - } - - /** - * Helper method for protocol errors encountered inside the transaction. - * - * @param string $message Error message. - */ - private function onProtocolError($message) - { - // Since a MULTI/EXEC block cannot be initialized when using aggregate - // connections we can safely assume that Predis\Client::getConnection() - // will return a Predis\Connection\NodeConnectionInterface instance. - CommunicationException::handle(new ProtocolException( - $this->client->getConnection(), $message - )); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/MultiExecState.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/MultiExecState.php deleted file mode 100755 index a0a82852..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/Predis/Transaction/MultiExecState.php +++ /dev/null @@ -1,166 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Predis\Transaction; - -/** - * Utility class used to track the state of a MULTI / EXEC transaction. - * - * @author Daniele Alessandri - */ -class MultiExecState -{ - const INITIALIZED = 1; // 0b00001 - const INSIDEBLOCK = 2; // 0b00010 - const DISCARDED = 4; // 0b00100 - const CAS = 8; // 0b01000 - const WATCH = 16; // 0b10000 - - private $flags; - - /** - * - */ - public function __construct() - { - $this->flags = 0; - } - - /** - * Sets the internal state flags. - * - * @param int $flags Set of flags - */ - public function set($flags) - { - $this->flags = $flags; - } - - /** - * Gets the internal state flags. - * - * @return int - */ - public function get() - { - return $this->flags; - } - - /** - * Sets one or more flags. - * - * @param int $flags Set of flags - */ - public function flag($flags) - { - $this->flags |= $flags; - } - - /** - * Resets one or more flags. - * - * @param int $flags Set of flags - */ - public function unflag($flags) - { - $this->flags &= ~$flags; - } - - /** - * Returns if the specified flag or set of flags is set. - * - * @param int $flags Flag - * - * @return bool - */ - public function check($flags) - { - return ($this->flags & $flags) === $flags; - } - - /** - * Resets the state of a transaction. - */ - public function reset() - { - $this->flags = 0; - } - - /** - * Returns the state of the RESET flag. - * - * @return bool - */ - public function isReset() - { - return $this->flags === 0; - } - - /** - * Returns the state of the INITIALIZED flag. - * - * @return bool - */ - public function isInitialized() - { - return $this->check(self::INITIALIZED); - } - - /** - * Returns the state of the INSIDEBLOCK flag. - * - * @return bool - */ - public function isExecuting() - { - return $this->check(self::INSIDEBLOCK); - } - - /** - * Returns the state of the CAS flag. - * - * @return bool - */ - public function isCAS() - { - return $this->check(self::CAS); - } - - /** - * Returns if WATCH is allowed in the current state. - * - * @return bool - */ - public function isWatchAllowed() - { - return $this->check(self::INITIALIZED) && !$this->check(self::CAS); - } - - /** - * Returns the state of the WATCH flag. - * - * @return bool - */ - public function isWatching() - { - return $this->check(self::WATCH); - } - - /** - * Returns the state of the DISCARDED flag. - * - * @return bool - */ - public function isDiscarded() - { - return $this->check(self::DISCARDED); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Actions.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Actions.php deleted file mode 100755 index 2ae8e10d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Actions.php +++ /dev/null @@ -1,10269 +0,0 @@ -aCurrentActionParams = array(); - - $this->oHttp = null; - $this->oLogger = null; - $this->oPlugins = null; - $this->oMailClient = null; - $this->oSocial = null; - $this->oConfig = null; - $this->aCachers = array(); - - $this->oStorageProvider = null; - $this->oLocalStorageProvider = null; - $this->oSettingsProvider = null; - $this->oLocalSettingsProvider = null; - $this->oFilesProvider = null; - $this->oFiltersProvider = null; - $this->oDomainProvider = null; - $this->oAddressBookProvider = null; - $this->oSuggestionsProvider = null; - $this->oChangePasswordProvider = null; - $this->oTwoFactorAuthProvider = null; - $this->oPremProvider = null; - - $this->sSpecAuthToken = ''; - - $oConfig = $this->Config(); - $this->Plugins()->RunHook('filter.application-config', array(&$oConfig)); - - $this->Logger()->Ping(); - } - - /** - * @return \RainLoop\Actions - */ - public static function NewInstance() - { - return new self(); - } - - /** - * @param string $sSpecAuthToken - * - * @return \RainLoop\Application - */ - public function SetSpecAuthToken($sSpecAuthToken) - { - $this->sSpecAuthToken = $sSpecAuthToken; - - return $this; - } - - /** - * @return string - */ - public function GetSpecAuthToken() - { - return $this->sSpecAuthToken; - } - - /** - * @return string - */ - public function GetShortLifeSpecAuthToken($iLife = 60) - { - $aAccountHash = \RainLoop\Utils::DecodeKeyValues($this->getLocalAuthToken()); - if (!empty($aAccountHash[0]) && 'token' === $aAccountHash[0] && \is_array($aAccountHash)) - { - $aAccountHash[10] = \time() + $iLife; - return \RainLoop\Utils::EncodeKeyValues($aAccountHash); - } - - return ''; - } - - /** - * @return \RainLoop\Application - */ - public function Config() - { - if (null === $this->oConfig) - { - $this->oConfig = new \RainLoop\Config\Application(); - if (!$this->oConfig->Load()) - { - usleep(10000); - $this->oConfig->Load(); - } - -// if (!$bLoaded && !$this->oConfig->IsFileExists()) -// { -// $bSave = true; -// } -// -// if ($bLoaded && !$bSave) -// { -// $bSave = APP_VERSION !== $this->oConfig->Get('version', 'current'); -// } -// -// if ($bSave) -// { -// $this->oConfig->Save(); -// } - } - - return $this->oConfig; - } - - /** - * @param string $sName - * @param \RainLoop\Model\Account $oAccount = null - * - * @return mixed - */ - private function fabrica($sName, $oAccount = null) - { - $mResult = null; - $this->Plugins() - ->RunHook('main.fabrica', array($sName, &$mResult), false) - ->RunHook('main.fabrica[2]', array($sName, &$mResult, $oAccount), false) - ; - - if (null === $mResult) - { - switch ($sName) - { - case 'files': - // RainLoop\Providers\Files\IFiles - $mResult = new \RainLoop\Providers\Files\FileStorage(APP_PRIVATE_DATA.'storage/files'); - break; - case 'storage': - case 'storage-local': - // RainLoop\Providers\Storage\IStorage - $mResult = new \RainLoop\Providers\Storage\FileStorage( - APP_PRIVATE_DATA.'storage', 'storage-local' === $sName); - break; - case 'settings': - case 'settings-local': - // RainLoop\Providers\Settings\ISettings - $mResult = new \RainLoop\Providers\Settings\DefaultSettings( - $this->StorageProvider('settings-local' === $sName)); - break; - case 'login': - // \RainLoop\Providers\Login\LoginInterface - $mResult = new \RainLoop\Providers\Login\DefaultLogin(); - break; - case 'domain': - // \RainLoop\Providers\Domain\DomainAdminInterface - $mResult = new \RainLoop\Providers\Domain\DefaultDomain(APP_PRIVATE_DATA.'domains', $this->Cacher()); - break; - case 'filters': - // \RainLoop\Providers\Filters\FiltersInterface - $mResult = new \RainLoop\Providers\Filters\SieveStorage( - $this->Plugins(), $this->Config() - ); - break; - case 'address-book': - // \RainLoop\Providers\AddressBook\AddressBookInterface - - $sDsn = \trim($this->Config()->Get('contacts', 'pdo_dsn', '')); - $sUser = \trim($this->Config()->Get('contacts', 'pdo_user', '')); - $sPassword = (string) $this->Config()->Get('contacts', 'pdo_password', ''); - - $sDsnType = $this->ValidateContactPdoType(\trim($this->Config()->Get('contacts', 'type', 'sqlite'))); - if ('sqlite' === $sDsnType) - { - $mResult = new \RainLoop\Providers\AddressBook\PdoAddressBook( - 'sqlite:'.APP_PRIVATE_DATA.'AddressBook.sqlite', '', '', 'sqlite'); - } - else - { - $mResult = new \RainLoop\Providers\AddressBook\PdoAddressBook($sDsn, $sUser, $sPassword, $sDsnType); - } - break; - case 'suggestions': - - if (null === $mResult) - { - $mResult = array(); - } - - if (\is_array($mResult) && \RainLoop\Utils::IsOwnCloud() && $this->Config()->Get('labs', 'owncloud_suggestions', true)) - { - // \RainLoop\Providers\Suggestions\ISuggestions - $mResult[] = new \RainLoop\Providers\Suggestions\OwnCloudSuggestions(); - } - - break; - case 'change-password': - // \RainLoop\Providers\ChangePassword\ChangePasswordInterface - break; - case 'two-factor-auth': - // \RainLoop\Providers\TwoFactorAuth\TwoFactorAuthInterface - $mResult = new \RainLoop\Providers\TwoFactorAuth\GoogleTwoFactorAuth(); - break; - } - } - - foreach (\is_array($mResult) ? $mResult : array($mResult) as $oItem) - { - if ($oItem && \method_exists($oItem, 'SetLogger')) - { - $oItem->SetLogger($this->Logger()); - } - } - - $this->Plugins()->RunHook('filter.fabrica', array($sName, &$mResult, $oAccount), false); - - return $mResult; - } - - /** - * @return void - */ - public function BootStart() - { - if (defined('APP_INSTALLED_START') && defined('APP_INSTALLED_VERSION') && - APP_INSTALLED_START && !APP_INSTALLED_VERSION) - { - try - { - $this->KeenIO('Install'); - } - catch (\Exception $oException) { unset($oException); } - } - } - - /** - * @return void - */ - public function BootEnd() - { - try - { - if ($this->MailClient()->IsLoggined()) - { - $this->MailClient()->LogoutAndDisconnect(); - } - } - catch (\Exception $oException) { unset($oException); } - } - - /** - * @return string - */ - public function ParseQueryAuthString() - { - $sQuery = \trim($this->Http()->GetQueryString()); - - $iPos = \strpos($sQuery, '&'); - if (0 < $iPos) - { - $sQuery = \substr($sQuery, 0, $iPos); - } - - $sQuery = \trim(\trim($sQuery), ' /'); - - $aSubQuery = $this->Http()->GetQuery('q', null); - if (\is_array($aSubQuery)) - { - $aSubQuery = \array_map(function ($sS) { - return \trim(\trim($sS), ' /'); - }, $aSubQuery); - - if (0 < \count($aSubQuery)) - { - $sQuery .= '/'.\implode('/', $aSubQuery); - } - } - - if ('' === $this->GetSpecAuthToken()) - { - $aPaths = \explode('/', $sQuery); - if (!empty($aPaths[0]) && !empty($aPaths[1]) && '_' === substr($aPaths[1], 0, 1)) - { - $this->SetSpecAuthToken($aPaths[1]); - } - } - - return $sQuery; - } - - /** - * @param string $sLine - * @param \RainLoop\Model\Account $oAccount = null - * @param bool $bUrlEncode = false - * @param array $aAdditionalParams = array() - * - * @return string - */ - private function compileLogParams($sLine, $oAccount = null, $bUrlEncode = false, $aAdditionalParams = array()) - { - $aClear = array(); - - if (false !== \strpos($sLine, '{date:')) - { - $sTimeOffset = (string) $this->Config()->Get('logs', 'time_offset', '0'); - $sLine = \preg_replace_callback('/\{date:([^}]+)\}/', function ($aMatch) use ($sTimeOffset, $bUrlEncode) { - return \RainLoop\Utils::UrlEncode(\MailSo\Log\Logger::DateHelper($aMatch[1], $sTimeOffset), $bUrlEncode); - }, $sLine); - - $aClear['/\{date:([^}]*)\}/'] = 'date'; - } - - if (false !== \strpos($sLine, '{imap:') || false !== \strpos($sLine, '{smtp:')) - { - if (!$oAccount) - { - $this->ParseQueryAuthString(); - $oAccount = $this->getAccountFromToken(false); - } - - if ($oAccount) - { - $sLine = \str_replace('{imap:login}', \RainLoop\Utils::UrlEncode($oAccount->IncLogin(), $bUrlEncode), $sLine); - $sLine = \str_replace('{imap:host}', \RainLoop\Utils::UrlEncode($oAccount->DomainIncHost(), $bUrlEncode), $sLine); - $sLine = \str_replace('{imap:port}', \RainLoop\Utils::UrlEncode($oAccount->DomainIncPort(), $bUrlEncode), $sLine); - - $sLine = \str_replace('{smtp:login}', \RainLoop\Utils::UrlEncode($oAccount->OutLogin(), $bUrlEncode), $sLine); - $sLine = \str_replace('{smtp:host}', \RainLoop\Utils::UrlEncode($oAccount->DomainOutHost(), $bUrlEncode), $sLine); - $sLine = \str_replace('{smtp:port}', \RainLoop\Utils::UrlEncode($oAccount->DomainOutPort(), $bUrlEncode), $sLine); - } - - $aClear['/\{imap:([^}]*)\}/i'] = 'imap'; - $aClear['/\{smtp:([^}]*)\}/i'] = 'smtp'; - } - - if (false !== \strpos($sLine, '{request:')) - { - if (false !== \strpos($sLine, '{request:ip}')) - { - $sLine = \str_replace('{request:ip}', \RainLoop\Utils::UrlEncode($this->Http()->GetClientIp( - $this->Config()->Get('labs', 'http_client_ip_check_proxy', false)), $bUrlEncode), $sLine); - } - - if (false !== \strpos($sLine, '{request:domain}')) - { - $sLine = \str_replace('{request:domain}', - \RainLoop\Utils::UrlEncode($this->Http()->GetHost(false, true, true), $bUrlEncode), $sLine); - } - - if (false !== \strpos($sLine, '{request:domain-clear}')) - { - $sLine = \str_replace('{request:domain-clear}', - \RainLoop\Utils::UrlEncode( - \MailSo\Base\Utils::GetClearDomainName($this->Http()->GetHost(false, true, true)), $bUrlEncode), $sLine); - } - - $aClear['/\{request:([^}]*)\}/i'] = 'request'; - } - - if (false !== \strpos($sLine, '{user:')) - { - if (false !== \strpos($sLine, '{user:uid}')) - { - $sLine = \str_replace('{user:uid}', - \RainLoop\Utils::UrlEncode(\base_convert(\sprintf('%u', - \crc32(\md5(\RainLoop\Utils::GetConnectionToken()))), 10, 32), $bUrlEncode), - $sLine - ); - } - - if (false !== \strpos($sLine, '{user:ip}')) - { - $sLine = \str_replace('{user:ip}', \RainLoop\Utils::UrlEncode($this->Http()->GetClientIp( - $this->Config()->Get('labs', 'http_client_ip_check_proxy', false)), $bUrlEncode), $sLine); - } - - if (\preg_match('/\{user:(email|login|domain)\}/i', $sLine)) - { - if (!$oAccount) - { - $this->ParseQueryAuthString(); - $oAccount = $this->getAccountFromToken(false); - } - - if ($oAccount) - { - $sEmail = $oAccount->Email(); - - $sLine = \str_replace('{user:email}', \RainLoop\Utils::UrlEncode($sEmail, $bUrlEncode), $sLine); - $sLine = \str_replace('{user:login}', \RainLoop\Utils::UrlEncode( - \MailSo\Base\Utils::GetAccountNameFromEmail($sEmail), $bUrlEncode), $sLine); - $sLine = \str_replace('{user:domain}', \RainLoop\Utils::UrlEncode( - \MailSo\Base\Utils::GetDomainFromEmail($sEmail), $bUrlEncode), $sLine); - $sLine = \str_replace('{user:domain-clear}', \RainLoop\Utils::UrlEncode( - \MailSo\Base\Utils::GetClearDomainName( - \MailSo\Base\Utils::GetDomainFromEmail($sEmail)), $bUrlEncode), $sLine); - } - } - - $aClear['/\{user:([^}]*)\}/i'] = 'unknown'; - } - - if (false !== \strpos($sLine, '{labs:')) - { - $sLine = \preg_replace_callback('/\{labs:rand:([1-9])\}/', function ($aMatch) { - return \rand(\pow(10, $aMatch[1] - 1), \pow(10, $aMatch[1]) - 1); - }, $sLine); - - $aClear['/\{labs:([^}]*)\}/'] = 'labs'; - } - - if (\is_array($aAdditionalParams) && 0 < \count($aAdditionalParams)) - { - foreach ($aAdditionalParams as $sKey => $sValue) - { - $sLine = \str_replace($sKey, $sValue, $sLine); - } - } - - if (0 < \count($aClear)) - { - foreach ($aClear as $sKey => $sValue) - { - $sLine = \preg_replace($sKey, $sValue, $sLine); - } - } - - return $sLine; - } - - /** - * @param string $sFileName - * - * @return string - */ - private function compileLogFileName($sFileName) - { - $sFileName = \trim($sFileName); - - if (0 !== \strlen($sFileName)) - { - $sFileName = $this->compileLogParams($sFileName); - - $sFileName = \preg_replace('/[\/]+/', '/', \preg_replace('/[.]+/', '.', $sFileName)); - $sFileName = \preg_replace('/[^a-zA-Z0-9@_+=\-\.\/!()\[\]]/', '', $sFileName); - } - - if (0 === \strlen($sFileName)) - { - $sFileName = 'rainloop-log.txt'; - } - - return $sFileName; - } - - /** - * @return void - */ - public function SetAuthLogoutToken() - { - @\header('X-RainLoop-Action: Logout'); - \RainLoop\Utils::SetCookie(self::AUTH_SPEC_LOGOUT_TOKEN_KEY, \md5(APP_START_TIME), 0); - } - - /** - * @param \RainLoop\Model\Account $oAccount - * - * @return void - */ - public function SetAuthToken($oAccount) - { - if ($oAccount) - { - $sSpecAuthToken = '_'.$oAccount->GetAuthTokenQ(); - - $this->SetSpecAuthToken($sSpecAuthToken); - \RainLoop\Utils::SetCookie(self::AUTH_SPEC_TOKEN_KEY, $sSpecAuthToken, 0); - - if ($oAccount->SignMe() && 0 < \strlen($oAccount->SignMeToken())) - { - \RainLoop\Utils::SetCookie(self::AUTH_SIGN_ME_TOKEN_KEY, - \RainLoop\Utils::EncodeKeyValuesQ(array( - 'e' => $oAccount->Email(), - 't' => $oAccount->SignMeToken() - )), - \time() + 60 * 60 * 24 * 30); - - $this->StorageProvider()->Put($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'sign_me', - \RainLoop\Utils::EncodeKeyValuesQ(array( - 'Time' => \time(), - 'AuthToken' => $oAccount->GetAuthTokenQ(), - 'SignMetToken' => $oAccount->SignMeToken() - )) - ); - } - } - } - - /** - * @return string - */ - public function GetSpecAuthTokenWithDeletion() - { - $sResult = \RainLoop\Utils::GetCookie(self::AUTH_SPEC_TOKEN_KEY, ''); - if (0 < strlen($sResult)) - { - \RainLoop\Utils::ClearCookie(self::AUTH_SPEC_TOKEN_KEY); - } - - return $sResult; - } - - /** - * @return string - */ - public function GetSpecAuthLogoutTokenWithDeletion() - { - $sResult = \RainLoop\Utils::GetCookie(self::AUTH_SPEC_LOGOUT_TOKEN_KEY, ''); - if (0 < strlen($sResult)) - { - \RainLoop\Utils::ClearCookie(self::AUTH_SPEC_LOGOUT_TOKEN_KEY); - } - - return $sResult; - } - - /** - * @return string - */ - public function GetSpecLogoutCustomMgsWithDeletion() - { - $sResult = \RainLoop\Utils::GetCookie(self::AUTH_SPEC_LOGOUT_CUSTOM_MSG_KEY, ''); - if (0 < strlen($sResult)) - { - \RainLoop\Utils::ClearCookie(self::AUTH_SPEC_LOGOUT_CUSTOM_MSG_KEY); - } - - return $sResult; - } - - /** - * @return string - */ - public function SetSpecLogoutCustomMgsWithDeletion($sMessage) - { - \RainLoop\Utils::SetCookie(self::AUTH_SPEC_LOGOUT_CUSTOM_MSG_KEY, $sMessage, 0); - } - - /** - * @return void - */ - private function setAdminAuthToken($sToken) - { - \RainLoop\Utils::SetCookie(self::AUTH_ADMIN_TOKEN_KEY, $sToken, 0); - } - - /** - * @return string - */ - private function getLocalAuthToken() - { - $sToken = $this->GetSpecAuthToken(); - return !empty($sToken) && '_' === \substr($sToken, 0, 1) ? \substr($sToken, 1) : ''; - } - - /** - * @return string - */ - private function getAdminAuthToken() - { - return \RainLoop\Utils::GetCookie(self::AUTH_ADMIN_TOKEN_KEY, ''); - } - - /** - * @return void - */ - public function ClearAdminAuthToken() - { - $aAdminHash = \RainLoop\Utils::DecodeKeyValuesQ($this->getAdminAuthToken()); - if ( - !empty($aAdminHash[0]) && !empty($aAdminHash[1]) && !empty($aAdminHash[2]) && - 'token' === $aAdminHash[0] && \md5(APP_SALT) === $aAdminHash[1] - ) - { - $this->Cacher(null, true)->Delete(\RainLoop\KeyPathHelper::SessionAdminKey($aAdminHash[2])); - } - - \RainLoop\Utils::ClearCookie(self::AUTH_ADMIN_TOKEN_KEY); - } - - /** - * @param bool $bThrowExceptionOnFalse = false - * - * @return \RainLoop\Model\Account|bool - * @throws \RainLoop\Exceptions\ClientException - */ - public function GetAccount($bThrowExceptionOnFalse = false) - { - return $this->getAccountFromToken($bThrowExceptionOnFalse); - } - - /** - * @return \MailSo\Base\Http - */ - public function Http() - { - if (null === $this->oHttp) - { - $this->oHttp = \MailSo\Base\Http::SingletonInstance(); - } - - return $this->oHttp; - } - - /** - * @return \RainLoop\Social - */ - public function Social() - { - if (null === $this->oSocial) - { - $this->oSocial = new \RainLoop\Social($this->Http(), $this); - } - - return $this->oSocial; - } - - /** - * @return \MailSo\Mail\MailClient - */ - public function MailClient() - { - if (null === $this->oMailClient) - { - $this->oMailClient = \MailSo\Mail\MailClient::NewInstance(); - $this->oMailClient->SetLogger($this->Logger()); - } - - return $this->oMailClient; - } - - /** - * @return \RainLoop\Providers\Filters - */ - public function FiltersProvider() - { - if (null === $this->oFiltersProvider) - { - $this->oFiltersProvider = new \RainLoop\Providers\Filters( - $this->fabrica('filters')); - } - - return $this->oFiltersProvider; - } - - /** - * @return \RainLoop\Providers\ChangePassword - */ - public function ChangePasswordProvider() - { - if (null === $this->oChangePasswordProvider) - { - $this->oChangePasswordProvider = new \RainLoop\Providers\ChangePassword( - $this, $this->fabrica('change-password'), !!$this->Config()->Get('labs', 'check_new_password_strength', true) - ); - } - - return $this->oChangePasswordProvider; - } - - /** - * @return \RainLoop\Providers\TwoFactorAuth - */ - public function TwoFactorAuthProvider() - { - if (null === $this->oTwoFactorAuthProvider) - { - $this->oTwoFactorAuthProvider = new \RainLoop\Providers\TwoFactorAuth( - $this->Config()->Get('security', 'allow_two_factor_auth', false) ? $this->fabrica('two-factor-auth') : null - ); - } - - return $this->oTwoFactorAuthProvider; - } - - /** - * @return \RainLoop\Providers\Prem - */ - public function PremProvider() - { - if (null === $this->oPremProvider) - { - if (\file_exists(APP_VERSION_ROOT_PATH.'app/libraries/RainLoop/Providers/Prem.php')) - { - $this->oPremProvider = new \RainLoop\Providers\Prem( - $this->Config(), $this->Logger(), $this->Cacher(null, true) - ); - } - else - { - $this->oPremProvider = false; - } - } - - return $this->oPremProvider; - } - - /** - * @param bool $bLocal = false - * - * @return \RainLoop\Providers\Storage - */ - public function StorageProvider($bLocal = false) - { - if ($bLocal) - { - if (null === $this->oLocalStorageProvider) - { - $this->oLocalStorageProvider = new \RainLoop\Providers\Storage( - $this->fabrica('storage-local')); - } - - return $this->oLocalStorageProvider; - } - else - { - if (null === $this->oStorageProvider) - { - $this->oStorageProvider = new \RainLoop\Providers\Storage( - $this->fabrica('storage')); - } - - return $this->oStorageProvider; - } - - return null; - } - - /** - * @return \RainLoop\Providers\Settings - */ - public function SettingsProvider($bLocal = false) - { - if ($bLocal) - { - if (null === $this->oLocalSettingsProvider) - { - $this->oLocalSettingsProvider = new \RainLoop\Providers\Settings( - $this->fabrica('settings-local')); - } - - return $this->oLocalSettingsProvider; - } - else - { - if (null === $this->oSettingsProvider) - { - $this->oSettingsProvider = new \RainLoop\Providers\Settings( - $this->fabrica('settings')); - } - - return $this->oSettingsProvider; - } - - return null; - } - - /** - * @return \RainLoop\Providers\Files - */ - public function FilesProvider() - { - if (null === $this->oFilesProvider) - { - $this->oFilesProvider = new \RainLoop\Providers\Files( - $this->fabrica('files')); - } - - return $this->oFilesProvider; - } - - /** - * @return \RainLoop\Providers\Domain - */ - public function DomainProvider() - { - if (null === $this->oDomainProvider) - { - $this->oDomainProvider = new \RainLoop\Providers\Domain( - $this->fabrica('domain'), $this->Plugins()); - } - - return $this->oDomainProvider; - } - - /** - * @return \RainLoop\Providers\Suggestions - */ - public function SuggestionsProvider() - { - if (null === $this->oSuggestionsProvider) - { - $this->oSuggestionsProvider = new \RainLoop\Providers\Suggestions( - $this->fabrica('suggestions')); - } - - return $this->oSuggestionsProvider; - } - - /** - * @param \RainLoop\Model\Account $oAccount = null - * @param bool $bForceEnable = false - * - * @return \RainLoop\Providers\AddressBook - */ - public function AddressBookProvider($oAccount = null, $bForceEnable = false) - { - if (null === $this->oAddressBookProvider) - { - $oDriver = null; - if ($this->GetCapa(false, false, \RainLoop\Enumerations\Capa::CONTACTS, $oAccount)) - { - if ($this->Config()->Get('contacts', 'enable', false) || $bForceEnable) - { - $oDriver = $this->fabrica('address-book', $oAccount); - } - } - - $this->oAddressBookProvider = new \RainLoop\Providers\AddressBook($oDriver); - $this->oAddressBookProvider->SetLogger($this->Logger()); - } - - return $this->oAddressBookProvider; - } - - /** - * @param \RainLoop\Model\Account $oAccount = null - * @param bool $bForceFile = false - * - * @return \MailSo\Cache\CacheClient - */ - public function Cacher($oAccount = null, $bForceFile = false) - { - $sKey = ''; - if ($oAccount) - { - $sKey = $oAccount->ParentEmailHelper(); - } - - $sIndexKey = empty($sKey) ? '_default_' : $sKey; - if ($bForceFile) - { - $sIndexKey .= '/_files_'; - } - - if (!isset($this->aCachers[$sIndexKey])) - { - $this->aCachers[$sIndexKey] = \MailSo\Cache\CacheClient::NewInstance(); - - $oDriver = null; - $sDriver = \strtoupper(\trim($this->Config()->Get('cache', 'fast_cache_driver', 'files'))); - - switch (true) - { - default: - case $bForceFile: - $oDriver = \MailSo\Cache\Drivers\File::NewInstance(APP_PRIVATE_DATA.'cache', $sKey); - break; - - case ('APC' === $sDriver || 'APCU' === $sDriver) && - \MailSo\Base\Utils::FunctionExistsAndEnabled(array( - 'apc_store', 'apc_fetch', 'apc_delete', 'apc_clear_cache')): - - $oDriver = \MailSo\Cache\Drivers\APC::NewInstance($sKey); - break; - - case ('MEMCACHE' === $sDriver || 'MEMCACHED' === $sDriver) && - \MailSo\Base\Utils::FunctionExistsAndEnabled('memcache_connect'): - - $oDriver = \MailSo\Cache\Drivers\Memcache::NewInstance( - $this->Config()->Get('labs', 'fast_cache_memcache_host', '127.0.0.1'), - (int) $this->Config()->Get('labs', 'fast_cache_memcache_port', 11211), - 43200, - $sKey - ); - break; - - case 'REDIS' === $sDriver && \class_exists('Predis\Client'): - $oDriver = \MailSo\Cache\Drivers\Redis::NewInstance( - $this->Config()->Get('labs', 'fast_cache_redis_host', '127.0.0.1'), - (int) $this->Config()->Get('labs', 'fast_cache_redis_port', 6379), - 43200, - $sKey - ); - break; - } - - if ($oDriver) - { - $this->aCachers[$sIndexKey]->SetDriver($oDriver); - } - - $this->aCachers[$sIndexKey]->SetCacheIndex($this->Config()->Get('cache', 'fast_cache_index', '')); - } - - return $this->aCachers[$sIndexKey]; - } - - /** - * @return \RainLoop\Plugins\Manager - */ - public function Plugins() - { - if (null === $this->oPlugins) - { - $this->oPlugins = new \RainLoop\Plugins\Manager($this); - $this->oPlugins->SetLogger($this->Logger()); - } - - return $this->oPlugins; - } - - /** - * @return \MailSo\Log\Logger - */ - public function Logger() - { - if (null === $this->oLogger) - { - $this->oLogger = \MailSo\Log\Logger::SingletonInstance(); - - if (!!$this->Config()->Get('logs', 'enable', false)) - { - $sSessionFilter = (string) $this->Config()->Get('logs', 'session_filter', ''); - if (!empty($sSessionFilter)) - { - $aSessionParts = \explode(':', $sSessionFilter, 2); - - if (empty($aSessionParts[0]) || empty($aSessionParts[1]) || - (string) $aSessionParts[1] !== (string) \RainLoop\Utils::GetCookie($aSessionParts[0], '')) - { - return $this->oLogger; - } - } - - $sTimeOffset = (string) $this->Config()->Get('logs', 'time_offset', '0'); - - $this->oLogger->SetShowSecter(!$this->Config()->Get('logs', 'hide_passwords', true)); - - $sLogFileName = $this->Config()->Get('logs', 'filename', ''); - - $oDriver = null; - if ('syslog' === $sLogFileName) - { - $oDriver = \MailSo\Log\Drivers\Syslog::NewInstance(); - } - else - { - $sLogFileFullPath = \APP_PRIVATE_DATA.'logs/'.$this->compileLogFileName($sLogFileName); - $sLogFileDir = \dirname($sLogFileFullPath); - - if (!@is_dir($sLogFileDir)) - { - @mkdir($sLogFileDir, 0755, true); - } - - $oDriver = \MailSo\Log\Drivers\File::NewInstance($sLogFileFullPath); - } - - $this->oLogger->Add($oDriver - ->WriteOnErrorOnly($this->Config()->Get('logs', 'write_on_error_only', false)) - ->WriteOnPhpErrorOnly($this->Config()->Get('logs', 'write_on_php_error_only', false)) - ->WriteOnTimeoutOnly($this->Config()->Get('logs', 'write_on_timeout_only', 0)) - ->SetTimeOffset($sTimeOffset) - ); - - if (!$this->Config()->Get('debug', 'enable', false)) - { - $this->oLogger->AddForbiddenType(\MailSo\Log\Enumerations\Type::TIME); - } - - $this->oLogger->WriteEmptyLine(); - - $oHttp = $this->Http(); - - $this->oLogger->Write('[DATE:'.\MailSo\Log\Logger::DateHelper('d.m.y', $sTimeOffset). - (0 !== $sTimeOffset ? '][OFFSET:'.(0 < $sTimeOffset ? '+' : '-'). - \str_pad((string) \abs($sTimeOffset), 2, '0', STR_PAD_LEFT) : ''). - '][RL:'.APP_VERSION.'][PHP:'.PHP_VERSION.'][IP:'. - $oHttp->GetClientIp($this->Config()->Get('labs', 'http_client_ip_check_proxy', false)).'][PID:'. - (\MailSo\Base\Utils::FunctionExistsAndEnabled('getmypid') ? \getmypid() : 'unknown').']['. - $oHttp->GetServer('SERVER_SOFTWARE', '~').']['. - (\MailSo\Base\Utils::FunctionExistsAndEnabled('php_sapi_name') ? \php_sapi_name() : '~' ).']' - ); - - $sPdo = (\class_exists('PDO') ? \implode(',', \PDO::getAvailableDrivers()) : 'off'); - $sPdo = empty($sPdo) ? '~' : $sPdo; - - $this->oLogger->Write('['. - 'Suhosin:'.(\extension_loaded('suhosin') || @\ini_get('suhosin.get.max_value_length') ? 'on' : 'off'). - '][APC:'.(\MailSo\Base\Utils::FunctionExistsAndEnabled('apc_fetch') ? 'on' : 'off'). - '][MB:'.(\MailSo\Base\Utils::FunctionExistsAndEnabled('mb_convert_encoding') ? 'on' : 'off'). - '][PDO:'.$sPdo. - (\RainLoop\Utils::IsOwnCloud() ? '][cloud:true' : ''). - '][Streams:'.\implode(',', \stream_get_transports()). - ']'); - - $this->oLogger->Write( - '['.$oHttp->GetMethod().'] '.$oHttp->GetScheme().'://'.$oHttp->GetHost(false, false).$oHttp->GetServer('REQUEST_URI', ''), - \MailSo\Log\Enumerations\Type::NOTE, 'REQUEST'); - } - } - - return $this->oLogger; - } - - /** - * @return \MailSo\Log\Logger - */ - public function LoggerAuth() - { - if (null === $this->oLoggerAuth) - { - $this->oLoggerAuth = \MailSo\Log\Logger::NewInstance(false); - - if (!!$this->Config()->Get('logs', 'auth_logging', false)) - { - $sAuthLogFileFullPath = \APP_PRIVATE_DATA.'logs/'.$this->compileLogFileName( - $this->Config()->Get('logs', 'auth_logging_filename', '')); - - $sLogFileDir = \dirname($sAuthLogFileFullPath); - - if (!@is_dir($sLogFileDir)) - { - @mkdir($sLogFileDir, 0755, true); - } - - $this->oLoggerAuth->AddForbiddenType(\MailSo\Log\Enumerations\Type::MEMORY); - $this->oLoggerAuth->AddForbiddenType(\MailSo\Log\Enumerations\Type::TIME); - $this->oLoggerAuth->AddForbiddenType(\MailSo\Log\Enumerations\Type::TIME_DELTA); - - $oDriver = \MailSo\Log\Drivers\File::NewInstance($sAuthLogFileFullPath); - - $oDriver->DisableTimePrefix(); - $oDriver->DisableGuidPrefix(); - $oDriver->DisableTypedPrefix(); - - $this->oLoggerAuth->Add($oDriver); - } - } - - return $this->oLoggerAuth; - } - - /** - * @param \RainLoop\Model\Account $oAccount = null - * @param array $aAdditionalParams = array() - */ - public function LoggerAuthHelper($oAccount = null, $aAdditionalParams = array()) - { - $sLine = $this->Config()->Get('logs', 'auth_logging_format', ''); - if (!empty($sLine)) - { - $this->LoggerAuth()->Write($this->compileLogParams($sLine, $oAccount, false, $aAdditionalParams)); - } - } - - /** - * @return string - */ - private function getAdminToken() - { - $sRand = \MailSo\Base\Utils::Md5Rand(); - if (!$this->Cacher(null, true)->Set(\RainLoop\KeyPathHelper::SessionAdminKey($sRand), \time())) - { - $this->oLogger->Write('Cannot store an admin token', - \MailSo\Log\Enumerations\Type::WARNING); - - $sRand = ''; - } - - return '' === $sRand ? '' : \RainLoop\Utils::EncodeKeyValuesQ(array('token', \md5(APP_SALT), $sRand)); - } - - /** - * @param bool $bThrowExceptionOnFalse = true - * - * @return bool - */ - public function IsAdminLoggined($bThrowExceptionOnFalse = true) - { - $bResult = false; - if ($this->Config()->Get('security', 'allow_admin_panel', true)) - { - $aAdminHash = \RainLoop\Utils::DecodeKeyValuesQ($this->getAdminAuthToken()); - if (!empty($aAdminHash[0]) && !empty($aAdminHash[1]) && !empty($aAdminHash[2]) && - 'token' === $aAdminHash[0] && \md5(APP_SALT) === $aAdminHash[1] && - '' !== $this->Cacher(null, true)->Get(\RainLoop\KeyPathHelper::SessionAdminKey($aAdminHash[2]), '') - ) - { - $bResult = true; - } - } - - if (!$bResult && $bThrowExceptionOnFalse) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); - } - - return $bResult; - } - - /** - * @param string $sTo - */ - public function SetMailtoRequest($sTo) - { - if (!empty($sTo)) - { - \RainLoop\Utils::SetCookie(self::AUTH_MAILTO_TOKEN_KEY, - \RainLoop\Utils::EncodeKeyValuesQ(array( - 'Time' => \microtime(true), - 'MailTo' => 'MailTo', - 'To' => $sTo - )), 0); - } - } - - /** - * @param string $sEmail - * @param string $sLogin - * @param string $sPassword - * @param string $sSignMeToken = '' - * @param bool $bThrowProvideException = false - * - * @return \RainLoop\Model\Account|null - */ - public function LoginProvide($sEmail, $sLogin, $sPassword, $sSignMeToken = '', $bThrowProvideException = false) - { - $oAccount = null; - if (0 < \strlen($sEmail) && 0 < \strlen($sLogin) && 0 < \strlen($sPassword)) - { - $oDomain = $this->DomainProvider()->Load(\MailSo\Base\Utils::GetDomainFromEmail($sEmail), true); - if ($oDomain instanceof \RainLoop\Model\Domain) - { - if ($oDomain->ValidateWhiteList($sEmail, $sLogin)) - { - $oAccount = \RainLoop\Model\Account::NewInstance($sEmail, $sLogin, $sPassword, $oDomain, $sSignMeToken); - $this->Plugins()->RunHook('filter.account', array(&$oAccount)); - - if ($bThrowProvideException && !($oAccount instanceof \RainLoop\Model\Account)) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); - } - } - else if ($bThrowProvideException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AccountNotAllowed); - } - } - else if ($bThrowProvideException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::DomainNotAllowed); - } - } - - return $oAccount; - } - - /** - * @param string $sToken - * @param bool $bThrowExceptionOnFalse = true - * @param bool $bValidateShortToken = true - * @param bool $bQ = false - * - * @return \RainLoop\Model\Account|bool - * @throws \RainLoop\Exceptions\ClientException - */ - public function GetAccountFromCustomToken($sToken, $bThrowExceptionOnFalse = true, $bValidateShortToken = true, $bQ = false) - { - $oResult = false; - if (!empty($sToken)) - { - $aAccountHash = $bQ ? \RainLoop\Utils::DecodeKeyValuesQ($sToken) : \RainLoop\Utils::DecodeKeyValues($sToken); - if (!empty($aAccountHash[0]) && 'token' === $aAccountHash[0] && // simple token validation - 8 <= \count($aAccountHash) && // length checking - !empty($aAccountHash[7]) && // does short token exist - (!$bValidateShortToken || \RainLoop\Utils::GetShortToken() === $aAccountHash[7] || // check short token if needed - (isset($aAccountHash[10]) && 0 < $aAccountHash[10] && \time() < $aAccountHash[10])) - ) - { - $oAccount = $this->LoginProvide($aAccountHash[1], $aAccountHash[2], $aAccountHash[3], - empty($aAccountHash[5]) ? '' : $aAccountHash[5], $bThrowExceptionOnFalse); - - if ($oAccount instanceof \RainLoop\Model\Account) - { - if (!empty($aAccountHash[8]) && !empty($aAccountHash[9])) // init proxy user/password - { - $oAccount->SetProxyAuthUser($aAccountHash[8]); - $oAccount->SetProxyAuthPassword($aAccountHash[9]); - } - - $this->Logger()->AddSecret($oAccount->Password()); - $this->Logger()->AddSecret($oAccount->ProxyAuthPassword()); - - $oAccount->SetParentEmail($aAccountHash[6]); - $oResult = $oAccount; - } - } - else if ($bThrowExceptionOnFalse) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); - } - } - - if ($bThrowExceptionOnFalse && !($oResult instanceof \RainLoop\Model\Account)) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); - } - - return $oResult; - } - - /** - * @return \RainLoop\Model\Account|bool - */ - public function GetAccountFromSignMeToken() - { - $oAccount = false; - - $sSignMeToken = \RainLoop\Utils::GetCookie(\RainLoop\Actions::AUTH_SIGN_ME_TOKEN_KEY, ''); - if (!empty($sSignMeToken)) - { - $aTokenData = \RainLoop\Utils::DecodeKeyValuesQ($sSignMeToken); - if (\is_array($aTokenData) && !empty($aTokenData['e']) && !empty($aTokenData['t'])) - { - $sTokenSettings = $this->StorageProvider()->Get($aTokenData['e'], - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'sign_me' - ); - - if (!empty($sTokenSettings)) - { - $aSignMeData = \RainLoop\Utils::DecodeKeyValuesQ($sTokenSettings); - if (\is_array($aSignMeData) && - !empty($aSignMeData['AuthToken']) && - !empty($aSignMeData['SignMetToken']) && - $aSignMeData['SignMetToken'] === $aTokenData['t']) - { - $oAccount = $this->GetAccountFromCustomToken($aSignMeData['AuthToken'], false, false, true); - } - } - } - } - else - { - \RainLoop\Utils::ClearCookie(\RainLoop\Actions::AUTH_SIGN_ME_TOKEN_KEY); - } - - return $oAccount; - } - - /** - * @param bool $bThrowExceptionOnFalse = true - * - * @return \RainLoop\Model\Account|bool - * @throws \RainLoop\Exceptions\ClientException - */ - public function getAccountFromToken($bThrowExceptionOnFalse = true) - { - return $this->GetAccountFromCustomToken($this->getLocalAuthToken(), $bThrowExceptionOnFalse, true, true); - } - - /** - * @return bool - */ - public function IsOpen() - { - return !$this->PremProvider(); - } - - /** - * @param bool $bAdmin = false - * @param bool $bMobile = false - * @param bool $bMobileDevice = false - * - * @return array - */ - public function AppDataSystem($bAdmin = false, $bMobile = false, $bMobileDevice = false) - { - $oConfig = $this->Config(); - - $aAttachmentsActions = array(); - if ($this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::ATTACHMENTS_ACTIONS)) - { - if (!!\class_exists('ZipArchive')) - { - $aAttachmentsActions[] = 'zip'; - } - - if (\RainLoop\Utils::IsOwnCloudLoggedIn() && \class_exists('OCP\Files')) - { - $aAttachmentsActions[] = 'owncloud'; - } - - if ($oConfig->Get('social', 'dropbox_enable', false) && 0 < \strlen(\trim($oConfig->Get('social', 'dropbox_api_key', '')))) - { - $aAttachmentsActions[] = 'dropbox'; - } - } - - return \array_merge(array( - 'version' => APP_VERSION, - 'admin' => $bAdmin, - 'mobile' => $bMobile, - 'mobileDevice' => $bMobileDevice, - 'webPath' => \RainLoop\Utils::WebPath(), - 'webVersionPath' => \RainLoop\Utils::WebVersionPath(), - 'token' => $oConfig->Get('security', 'csrf_protection', false) ? \RainLoop\Utils::GetCsrfToken() : '', - 'inIframe' => (bool) $oConfig->Get('labs', 'in_iframe', false), - 'allowHtmlEditorSourceButton' => (bool) $oConfig->Get('labs', 'allow_html_editor_source_button', false), - 'allowHtmlEditorBitiButtons' => (bool) $oConfig->Get('labs', 'allow_html_editor_biti_buttons', false), - 'allowCtrlEnterOnCompose' => (bool) $oConfig->Get('labs', 'allow_ctrl_enter_on_compose', false), - 'customLoginLink' => $oConfig->Get('labs', 'custom_login_link', ''), - 'customLogoutLink' => $oConfig->Get('labs', 'custom_logout_link', ''), - 'forgotPasswordLinkUrl' => \trim($oConfig->Get('login', 'forgot_password_link_url', '')), - 'registrationLinkUrl' => \trim($oConfig->Get('login', 'registration_link_url', '')), - 'hideSubmitButton' => (bool) $oConfig->Get('login', 'hide_submit_button', true), - 'jsHash' => \md5(\RainLoop\Utils::GetConnectionToken()), - 'useImapThread' => (bool) $oConfig->Get('labs', 'use_imap_thread', false), - 'useImapSubscribe' => (bool) $oConfig->Get('labs', 'use_imap_list_subscribe', true), - 'allowAppendMessage' => (bool) $oConfig->Get('labs', 'allow_message_append', false), - 'materialDesign' => (bool) $oConfig->Get('labs', 'use_material_design', true), - 'folderSpecLimit' => (int) $oConfig->Get('labs', 'folders_spec_limit', 50), - 'faviconStatus' => (bool) $oConfig->Get('labs', 'favicon_status', true), - 'allowCmdInterface' => (bool) $oConfig->Get('labs', 'allow_cmd', false), - 'useNativeScrollbars' => (bool) $oConfig->Get('interface', 'use_native_scrollbars', false), - 'listPermanentFiltered' => '' !== \trim(\RainLoop\Api::Config()->Get('labs', 'imap_message_list_permanent_filter', '')), - 'themes' => $this->GetThemes($bMobile, false), - 'languages' => $this->GetLanguages(false), - 'languagesAdmin' => $this->GetLanguages(true), - 'appVersionType' => APP_VERSION_TYPE, - 'attachmentsActions' => $aAttachmentsActions - ), $bAdmin ? array( - 'adminHostUse' => '' !== $oConfig->Get('security', 'admin_panel_host', ''), - 'adminPath' => \strtolower($oConfig->Get('security', 'admin_panel_key', 'admin')), - 'allowAdminPanel' => (bool) $oConfig->Get('security', 'allow_admin_panel', true), - ) : array()); - } - - /** - * @param bool $bAdmin - * @param bool $bMobile = false - * @param string $sAuthAccountHash = '' - * - * @return array - */ - public function AppData($bAdmin, $bMobile = false, $bMobileDevice = false, $sAuthAccountHash = '') - { - if (0 < \strlen($sAuthAccountHash) && \preg_match('/[^_\-\.a-zA-Z0-9]/', $sAuthAccountHash)) - { - $sAuthAccountHash = ''; - } - - $oAccount = null; - $oConfig = $this->Config(); - -/* -required by Index.html and rl.js: -NewThemeLink IncludeCss LoadingDescriptionEsc TemplatesLink LangLink IncludeBackground PluginsLink AuthAccountHash -*/ - - $aResult = array( - 'Auth' => false, - 'AccountHash' => '', - 'AccountSignMe' => false, - 'AuthAccountHash' => '', - 'MailToEmail' => '', - 'Email' => '', - 'DevEmail' => '', - 'DevPassword' => '', - 'Title' => $oConfig->Get('webmail', 'title', 'RainLoop Webmail'), - 'LoadingDescription' => $oConfig->Get('webmail', 'loading_description', 'RainLoop'), - 'LoadingDescriptionEsc' => 'RainLoop', - 'FaviconUrl' => $oConfig->Get('webmail', 'favicon_url', ''), - 'LoginDescription' => '', - 'LoginPowered' => true, - 'LoginLogo' => '', - 'LoginBackground' => '', - 'LoginCss' => '', - 'UserLogo' => '', - 'UserLogoTitle' => '', - 'UserLogoMessage' => '', - 'UserCss' => '', - 'WelcomePageUrl' => '', - 'WelcomePageDisplay' => 'none', - 'IncludeCss' => '', - 'IncludeBackground' => '', - 'LoginDefaultDomain' => $oConfig->Get('login', 'default_domain', ''), - 'DetermineUserLanguage' => (bool) $oConfig->Get('login', 'determine_user_language', true), - 'DetermineUserDomain' => (bool) $oConfig->Get('login', 'determine_user_domain', false), - 'UseLoginWelcomePage' => (bool) $oConfig->Get('login', 'welcome_page', false), - 'StartupUrl' => \trim(\ltrim(\trim($oConfig->Get('labs', 'startup_url', '')), '#/')), - 'SieveAllowFileintoInbox' => (bool) $oConfig->Get('labs', 'sieve_allow_fileinto_inbox', false), - 'ContactsIsAllowed' => false, - 'ChangePasswordIsAllowed' => false, - 'RequireTwoFactor' => false, - 'Community' => true, - 'PremType' => false, - 'Admin' => array(), - 'Capa' => array(), - 'Plugins' => array(), - 'System' => $this->AppDataSystem($bAdmin, $bMobile, $bMobileDevice) - ); - - if (0 < \strlen($sAuthAccountHash)) - { - $aResult['AuthAccountHash'] = $sAuthAccountHash; - } - - $oPremProvider = $this->PremProvider(); - if ($oPremProvider) - { - $oPremProvider->PopulateAppData($aResult); - } - - if ('' !== $aResult['LoadingDescription'] && 'RainLoop' !== $aResult['LoadingDescription']) - { - $aResult['LoadingDescriptionEsc'] = @\htmlspecialchars($aResult['LoadingDescription'], ENT_QUOTES|ENT_IGNORE, 'UTF-8'); - } - - $oSettings = null; - - if (!$bAdmin) - { - $oAccount = $this->getAccountFromToken(false); - if ($oAccount instanceof \RainLoop\Model\Account) - { - $aResult['IncludeCss'] = $aResult['UserCss']; - - $oAddressBookProvider = $this->AddressBookProvider($oAccount); - - $aResult['Auth'] = true; - $aResult['Email'] = $oAccount->Email(); - $aResult['IncLogin'] = $oAccount->IncLogin(); - $aResult['OutLogin'] = $oAccount->OutLogin(); - $aResult['AccountHash'] = $oAccount->Hash(); - $aResult['AccountSignMe'] = $oAccount->SignMe(); - $aResult['ChangePasswordIsAllowed'] = $this->ChangePasswordProvider()->PasswordChangePossibility($oAccount); - $aResult['ContactsIsAllowed'] = $oAddressBookProvider->IsActive(); - $aResult['ContactsSyncIsAllowed'] = (bool) $oConfig->Get('contacts', 'allow_sync', false); - $aResult['ContactsSyncInterval'] = (int) $oConfig->Get('contacts', 'sync_interval', 20); - - $aResult['EnableContactsSync'] = false; - $aResult['ContactsSyncUrl'] = ''; - $aResult['ContactsSyncUser'] = ''; - $aResult['ContactsSyncPassword'] = ''; - - if ($aResult['ContactsIsAllowed'] && $aResult['ContactsSyncIsAllowed']) - { - $mData = $this->getContactsSyncData($oAccount); - if (\is_array($mData)) - { - $aResult['EnableContactsSync'] = isset($mData['Enable']) ? !!$mData['Enable'] : false; - $aResult['ContactsSyncUrl'] = isset($mData['Url']) ? \trim($mData['Url']) : ''; - $aResult['ContactsSyncUser'] = isset($mData['User']) ? \trim($mData['User']) : ''; - $aResult['ContactsSyncPassword'] = APP_DUMMY; - } - } - - if ($aResult['AccountSignMe']) - { - $sToken = \RainLoop\Utils::GetCookie(self::AUTH_MAILTO_TOKEN_KEY, null); - if (null !== $sToken) - { - \RainLoop\Utils::ClearCookie(self::AUTH_MAILTO_TOKEN_KEY); - - $mMailToData = \RainLoop\Utils::DecodeKeyValuesQ($sToken); - if (\is_array($mMailToData) && !empty($mMailToData['MailTo']) && - 'MailTo' === $mMailToData['MailTo'] && !empty($mMailToData['To'])) - { - $aResult['MailToEmail'] = $mMailToData['To']; - } - } - } - - $oSettings = $this->SettingsProvider()->Load($oAccount); - - if (!$oAccount->IsAdditionalAccount() && !empty($aResult['WelcomePageUrl']) && - ('once' === $aResult['WelcomePageDisplay'] || 'always' === $aResult['WelcomePageDisplay'])) - { - if ('once' === $aResult['WelcomePageDisplay']) - { - if ($aResult['WelcomePageUrl'] === $oSettings->GetConf('LastWelcomePage', '')) - { - $aResult['WelcomePageUrl'] = ''; - $aResult['WelcomePageDisplay'] = ''; - } - } - } - else - { - $aResult['WelcomePageUrl'] = ''; - $aResult['WelcomePageDisplay'] = ''; - } - - if (!empty($aResult['StartupUrl'])) - { - $aResult['StartupUrl'] = $this->compileLogParams($aResult['StartupUrl'], $oAccount, true); - } - - if (!empty($aResult['UserIframeMessage'])) - { - $aResult['UserIframeMessage'] = $this->compileLogParams($aResult['UserIframeMessage'], $oAccount, true); - } - } - else - { - $oAccount = null; - - $aResult['IncludeBackground'] = $aResult['LoginBackground']; - $aResult['IncludeCss'] = $aResult['LoginCss']; - - $aResult['DevEmail'] = $oConfig->Get('labs', 'dev_email', ''); - $aResult['DevPassword'] = $oConfig->Get('labs', 'dev_password', ''); - - $aResult['WelcomePageUrl'] = ''; - $aResult['WelcomePageDisplay'] = ''; - - $aResult['StartupUrl'] = ''; - - if (empty($aResult['AdditionalLoginError'])) - { - $aResult['AdditionalLoginError'] = $this->GetSpecLogoutCustomMgsWithDeletion(); - } - } - - $aResult['AllowGoogleSocial'] = (bool) $oConfig->Get('social', 'google_enable', false); - $aResult['AllowGoogleSocialAuth'] = (bool) $oConfig->Get('social', 'google_enable_auth', true); - $aResult['AllowGoogleSocialAuthFast'] = (bool) $oConfig->Get('social', 'google_enable_auth_fast', true); - $aResult['AllowGoogleSocialDrive'] = (bool) $oConfig->Get('social', 'google_enable_drive', true); - $aResult['AllowGoogleSocialPreview'] = (bool) $oConfig->Get('social', 'google_enable_preview', true); - - $aResult['GoogleClientID'] = \trim($oConfig->Get('social', 'google_client_id', '')); - $aResult['GoogleApiKey'] = \trim($oConfig->Get('social', 'google_api_key', '')); - - if (!$aResult['AllowGoogleSocial'] || ($aResult['AllowGoogleSocial'] && ( - '' === \trim($oConfig->Get('social', 'google_client_id', '')) || '' === \trim($oConfig->Get('social', 'google_client_secret', ''))))) - { - $aResult['AllowGoogleSocialAuth'] = false; - $aResult['AllowGoogleSocialAuthFast'] = false; - $aResult['AllowGoogleSocialDrive'] = false; - $aResult['GoogleClientID'] = ''; - $aResult['GoogleApiKey'] = ''; - } - - if (!$aResult['AllowGoogleSocial']) - { - $aResult['AllowGoogleSocialPreview'] = false; - } - - if ($aResult['AllowGoogleSocial'] && - !$aResult['AllowGoogleSocialAuth'] && !$aResult['AllowGoogleSocialAuthFast'] && - !$aResult['AllowGoogleSocialDrive'] && !$aResult['AllowGoogleSocialPreview']) - { - $aResult['AllowGoogleSocial'] = false; - } - - $aResult['AllowFacebookSocial'] = (bool) $oConfig->Get('social', 'fb_enable', false); - if ($aResult['AllowFacebookSocial'] && ( - '' === \trim($oConfig->Get('social', 'fb_app_id', '')) || '' === \trim($oConfig->Get('social', 'fb_app_secret', '')))) - { - $aResult['AllowFacebookSocial'] = false; - } - - $aResult['AllowTwitterSocial'] = (bool) $oConfig->Get('social', 'twitter_enable', false); - if ($aResult['AllowTwitterSocial'] && ( - '' === \trim($oConfig->Get('social', 'twitter_consumer_key', '')) || '' === \trim($oConfig->Get('social', 'twitter_consumer_secret', '')))) - { - $aResult['AllowTwitterSocial'] = false; - } - - $aResult['AllowDropboxSocial'] = (bool) $oConfig->Get('social', 'dropbox_enable', false); - $aResult['DropboxApiKey'] = \trim($oConfig->Get('social', 'dropbox_api_key', '')); - - if (!$aResult['AllowDropboxSocial']) - { - $aResult['DropboxApiKey'] = ''; - } - else if (0 === strlen($aResult['DropboxApiKey'])) - { - $aResult['AllowDropboxSocial'] = false; - } - - $aResult['Capa'] = $this->Capa(false, $bMobile, $oAccount); - - if ($aResult['Auth'] && !$aResult['RequireTwoFactor']) - { - if ($this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount) && - $this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::TWO_FACTOR_FORCE, $oAccount) && - $this->TwoFactorAuthProvider()->IsActive()) - { - $aData = $this->getTwoFactorInfo($oAccount, true); - - $aResult['RequireTwoFactor'] = !$aData || - !isset($aData['User'], $aData['IsSet'], $aData['Enable']) || - !($aData['IsSet'] && $aData['Enable']); - } - } - } - else - { - $aResult['Auth'] = $this->IsAdminLoggined(false); - if ($aResult['Auth']) - { - $aResult['AdminDomain'] = APP_SITE; - $aResult['AdminLogin'] = (string) $oConfig->Get('security', 'admin_login', ''); - $aResult['UseTokenProtection'] = (bool) $oConfig->Get('security', 'csrf_protection', true); - $aResult['EnabledPlugins'] = (bool) $oConfig->Get('plugins', 'enable', false); - - $aResult['VerifySslCertificate'] = (bool) $oConfig->Get('ssl', 'verify_certificate', false); - $aResult['AllowSelfSigned'] = (bool) $oConfig->Get('ssl', 'allow_self_signed', true); - - $aDrivers = \class_exists('PDO') ? \PDO::getAvailableDrivers() : null; - $aResult['MySqlIsSupported'] = \is_array($aDrivers) ? \in_array('mysql', $aDrivers) : false; - $aResult['SQLiteIsSupported'] = \is_array($aDrivers) ? \in_array('sqlite', $aDrivers) : false; - $aResult['PostgreSqlIsSupported'] = \is_array($aDrivers) ? \in_array('pgsql', $aDrivers) : false; - - $aResult['ContactsEnable'] = (bool) $oConfig->Get('contacts', 'enable', false); - $aResult['ContactsSync'] = (bool) $oConfig->Get('contacts', 'allow_sync', false); - $aResult['ContactsPdoType'] = (string) $this->ValidateContactPdoType(\trim($this->Config()->Get('contacts', 'type', 'sqlite'))); - $aResult['ContactsPdoDsn'] = (string) $oConfig->Get('contacts', 'pdo_dsn', ''); - $aResult['ContactsPdoType'] = (string) $oConfig->Get('contacts', 'type', ''); - $aResult['ContactsPdoUser'] = (string) $oConfig->Get('contacts', 'pdo_user', ''); - $aResult['ContactsPdoPassword'] = (string) APP_DUMMY; - - $aResult['AllowGoogleSocial'] = (bool) $oConfig->Get('social', 'google_enable', false); - $aResult['AllowGoogleSocialAuth'] = (bool) $oConfig->Get('social', 'google_enable_auth', true); - $aResult['AllowGoogleSocialAuthFast'] = (bool) $oConfig->Get('social', 'google_enable_auth_fast', true); - $aResult['AllowGoogleSocialDrive'] = (bool) $oConfig->Get('social', 'google_enable_drive', true); - $aResult['AllowGoogleSocialPreview'] = (bool) $oConfig->Get('social', 'google_enable_preview', true); - - $aResult['GoogleClientID'] = (string) $oConfig->Get('social', 'google_client_id', ''); - $aResult['GoogleClientSecret'] = (string) $oConfig->Get('social', 'google_client_secret', ''); - $aResult['GoogleApiKey'] = (string) $oConfig->Get('social', 'google_api_key', ''); - - $aResult['AllowFacebookSocial'] = (bool) $oConfig->Get('social', 'fb_enable', false); - $aResult['FacebookAppID'] = (string) $oConfig->Get('social', 'fb_app_id', ''); - $aResult['FacebookAppSecret'] = (string) $oConfig->Get('social', 'fb_app_secret', ''); - - $aResult['AllowTwitterSocial'] = (bool) $oConfig->Get('social', 'twitter_enable', false); - $aResult['TwitterConsumerKey'] = (string) $oConfig->Get('social', 'twitter_consumer_key', ''); - $aResult['TwitterConsumerSecret'] = (string) $oConfig->Get('social', 'twitter_consumer_secret', ''); - - $aResult['AllowDropboxSocial'] = (bool) $oConfig->Get('social', 'dropbox_enable', false); - $aResult['DropboxApiKey'] = (string) $oConfig->Get('social', 'dropbox_api_key', ''); - - $aResult['SubscriptionEnabled'] = (bool) \MailSo\Base\Utils::ValidateDomain($aResult['AdminDomain'], true); -// || \MailSo\Base\Utils::ValidateIP($aResult['AdminDomain']); - - $aResult['WeakPassword'] = (bool) $oConfig->ValidatePassword('12345'); - $aResult['CoreAccess'] = (bool) $this->rainLoopCoreAccess(); - - $aResult['PhpUploadSizes'] = array( - 'upload_max_filesize' => \ini_get('upload_max_filesize'), - 'post_max_size' => \ini_get('post_max_size') - ); - } - - $aResult['Capa'] = $this->Capa(true, $bMobile); - } - - $aResult['SupportedFacebookSocial'] = (bool) \version_compare(PHP_VERSION, '5.4.0', '>='); - if (!$aResult['SupportedFacebookSocial']) - { - $aResult['AllowFacebookSocial'] = false; - $aResult['FacebookAppID'] = ''; - $aResult['FacebookAppSecret'] = ''; - } - - $aResult['ProjectHash'] = \md5($aResult['AccountHash'].APP_VERSION.$this->Plugins()->Hash()); - - $sLanguage = $oConfig->Get('webmail', 'language', 'en'); - $sLanguageAdmin = $oConfig->Get('webmail', 'language_admin', 'en'); - $sTheme = $oConfig->Get('webmail', 'theme', 'Default'); - - $aResult['NewMoveToFolder'] = (bool) $oConfig->Get('interface', 'new_move_to_folder_button', true); - $aResult['AllowLanguagesOnSettings'] = (bool) $oConfig->Get('webmail', 'allow_languages_on_settings', true); - $aResult['AllowLanguagesOnLogin'] = (bool) $oConfig->Get('login', 'allow_languages_on_login', true); - $aResult['AttachmentLimit'] = ((int) $oConfig->Get('webmail', 'attachment_size_limit', 10)) * 1024 * 1024; - $aResult['SignMe'] = (string) $oConfig->Get('login', 'sign_me_auto', \RainLoop\Enumerations\SignMeType::DEFAILT_OFF); - $aResult['UseLocalProxyForExternalImages'] = (bool) $oConfig->Get('labs', 'use_local_proxy_for_external_images', false); - - // user - $aResult['ShowImages'] = (bool) $oConfig->Get('defaults', 'show_images', false); - $aResult['MPP'] = (int) $oConfig->Get('webmail', 'messages_per_page', 25); - $aResult['SoundNotification'] = false; - $aResult['DesktopNotifications'] = false; - $aResult['Layout'] = (int) $oConfig->Get('defaults', 'view_layout', \RainLoop\Enumerations\Layout::SIDE_PREVIEW); - $aResult['EditorDefaultType'] = (string) $oConfig->Get('defaults', 'view_editor_type', ''); - $aResult['UseCheckboxesInList'] = (bool) $oConfig->Get('defaults', 'view_use_checkboxes', true); - $aResult['AutoLogout'] = (int) $oConfig->Get('defaults', 'autologout', 30); - $aResult['UseThreads'] = (bool) $oConfig->Get('defaults', 'mail_use_threads', false); - $aResult['AllowDraftAutosave'] = (bool) $oConfig->Get('defaults', 'allow_draft_autosave', true); - $aResult['ReplySameFolder'] = (bool) $oConfig->Get('defaults', 'mail_reply_same_folder', false); - $aResult['ContactsAutosave'] = (bool) $oConfig->Get('defaults', 'contacts_autosave', true); - $aResult['EnableTwoFactor'] = false; - $aResult['ParentEmail'] = ''; - $aResult['InterfaceAnimation'] = true; - $aResult['UserBackgroundName'] = ''; - $aResult['UserBackgroundHash'] = ''; - - if (!$bAdmin && $oAccount instanceof \RainLoop\Model\Account) - { - $aResult['ParentEmail'] = $oAccount->ParentEmail(); - - $oSettingsLocal = $this->SettingsProvider(true)->Load($oAccount); - - if ($oSettingsLocal instanceof \RainLoop\Settings) - { -// if ($this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::FOLDERS, $oAccount)) - - $aResult['SentFolder'] = (string) $oSettingsLocal->GetConf('SentFolder', ''); - $aResult['DraftFolder'] = (string) $oSettingsLocal->GetConf('DraftFolder', ''); - $aResult['SpamFolder'] = (string) $oSettingsLocal->GetConf('SpamFolder', ''); - $aResult['TrashFolder'] = (string) $oSettingsLocal->GetConf('TrashFolder', ''); - $aResult['ArchiveFolder'] = (string) $oSettingsLocal->GetConf('ArchiveFolder', ''); - $aResult['NullFolder'] = (string) $oSettingsLocal->GetConf('NullFolder', ''); - } - - if ($this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::SETTINGS, $oAccount)) - { - if ($oSettings instanceof \RainLoop\Settings) - { - if ($oConfig->Get('webmail', 'allow_languages_on_settings', true)) - { - $sLanguage = (string) $oSettings->GetConf('Language', $sLanguage); - } - - $aResult['EditorDefaultType'] = (string) $oSettings->GetConf('EditorDefaultType', $aResult['EditorDefaultType']); - $aResult['ShowImages'] = (bool) $oSettings->GetConf('ShowImages', $aResult['ShowImages']); - $aResult['ContactsAutosave'] = (bool) $oSettings->GetConf('ContactsAutosave', $aResult['ContactsAutosave']); - $aResult['MPP'] = (int) $oSettings->GetConf('MPP', $aResult['MPP']); - $aResult['SoundNotification'] = (bool) $oSettings->GetConf('SoundNotification', $aResult['SoundNotification']); - $aResult['DesktopNotifications'] = (bool) $oSettings->GetConf('DesktopNotifications', $aResult['DesktopNotifications']); - $aResult['UseCheckboxesInList'] = (bool) $oSettings->GetConf('UseCheckboxesInList', $aResult['UseCheckboxesInList']); - $aResult['AllowDraftAutosave'] = (bool) $oSettings->GetConf('AllowDraftAutosave', $aResult['AllowDraftAutosave']); - $aResult['AutoLogout'] = (int) $oSettings->GetConf('AutoLogout', $aResult['AutoLogout']); - $aResult['Layout'] = (int) $oSettings->GetConf('Layout', $aResult['Layout']); - - if (!$this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::AUTOLOGOUT, $oAccount)) - { - $aResult['AutoLogout'] = 0; - } - - if ($this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::USER_BACKGROUND, $oAccount)) - { - $aResult['UserBackgroundName'] = (string) $oSettings->GetConf('UserBackgroundName', $aResult['UserBackgroundName']); - $aResult['UserBackgroundHash'] = (string) $oSettings->GetConf('UserBackgroundHash', $aResult['UserBackgroundHash']); -// if (!empty($aResult['UserBackgroundName']) && !empty($aResult['UserBackgroundHash'])) -// { -// $aResult['IncludeBackground'] = './?/Raw/&q[]=/{{USER}}/UserBackground/&q[]=/'. -// $aResult['UserBackgroundHash'].'/'; -// } - } - - $aResult['EnableTwoFactor'] = (bool) $oSettings->GetConf('EnableTwoFactor', $aResult['EnableTwoFactor']); - } - - if ($oSettingsLocal instanceof \RainLoop\Settings) - { - $aResult['UseThreads'] = (bool) $oSettingsLocal->GetConf('UseThreads', $aResult['UseThreads']); - $aResult['ReplySameFolder'] = (bool) $oSettingsLocal->GetConf('ReplySameFolder', $aResult['ReplySameFolder']); - - if ($this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::THEMES, $oAccount)) - { - $sTheme = (string) $oSettingsLocal->GetConf('Theme', $sTheme); - } - } - } - } - - if (!$aResult['Auth']) - { - if (!$bAdmin) - { - if ($oConfig->Get('login', 'allow_languages_on_login', true) && - $oConfig->Get('login', 'determine_user_language', true)) - { - $sLanguage = $this->ValidateLanguage( - $this->detectUserLanguage($bAdmin), $sLanguage, false); - } - } - } - - $sTheme = $this->ValidateTheme($sTheme, $bMobile); - $sStaticCache = $this->StaticCache(); - - $aResult['Theme'] = $sTheme; - $aResult['NewThemeLink'] = $this->ThemeLink($sTheme, $bAdmin); - - $aResult['Language'] = $this->ValidateLanguage($sLanguage, '', false); - $aResult['LanguageAdmin'] = $this->ValidateLanguage($sLanguageAdmin, '', true); - - $aResult['UserLanguageRaw'] = $this->detectUserLanguage($bAdmin); - - $aResult['UserLanguage'] = $this->ValidateLanguage($aResult['UserLanguageRaw'], '', false, true); - $aResult['UserLanguageAdmin'] = $this->ValidateLanguage($aResult['UserLanguageRaw'], '', true, true); - - $aResult['PluginsLink'] = ''; - if (0 < $this->Plugins()->Count() && $this->Plugins()->HaveJs($bAdmin)) - { - $aResult['PluginsLink'] = './?/Plugins/0/'.($bAdmin ? 'Admin' : 'User').'/'.$sStaticCache.'/'; - } - - $aResult['LangLink'] = './?/Lang/0/'.($bAdmin ? 'Admin' : 'App').'/'. - ($bAdmin ? $aResult['LanguageAdmin'] : $aResult['Language']).'/'.$sStaticCache.'/'; - - $aResult['TemplatesLink'] = './?/Templates/0/'.($bAdmin ? 'Admin' : 'App').'/'.$sStaticCache.'/'; - - $bAppJsDebug = !!$this->Config()->Get('labs', 'use_app_debug_js', false); - - $aResult['StaticLibJsLink'] = $this->StaticPath('js/'.($bAppJsDebug ? '' : 'min/'). - 'libs'.($bAppJsDebug ? '' : '.min').'.js'); - $aResult['StaticAppJsLink'] = $this->StaticPath('js/'.($bAppJsDebug ? '' : 'min/'). - ($bAdmin ? 'admin' : 'app').($bAppJsDebug ? '' : '.min').'.js'); - - $aResult['StaticAppJsNextLink'] = $this->StaticPath('js/'.($bAdmin ? 'admin' : 'app').'.next.js'); - $aResult['StaticEditorJsLink'] = $this->StaticPath('ckeditor/ckeditor.js'); - - $aResult['EditorDefaultType'] = \in_array($aResult['EditorDefaultType'], array('Plain', 'Html', 'HtmlForced', 'PlainForced')) ? - $aResult['EditorDefaultType'] : 'Plain'; - - // IDN - $aResult['Email'] = \MailSo\Base\Utils::IdnToUtf8($aResult['Email']); - $aResult['ParentEmail'] = \MailSo\Base\Utils::IdnToUtf8($aResult['ParentEmail']); - $aResult['MailToEmail'] = \MailSo\Base\Utils::IdnToUtf8($aResult['MailToEmail']); - $aResult['DevEmail'] = \MailSo\Base\Utils::IdnToUtf8($aResult['DevEmail']); - - // Mobile override - if ($bMobile) - { - $aResult['Layout'] = \RainLoop\Enumerations\Layout::NO_PREVIW; - - $aResult['SoundNotification'] = false; - $aResult['DesktopNotifications'] = false; - $aResult['UseCheckboxesInList'] = true; - - $aResult['UserBackgroundName'] = ''; - $aResult['UserBackgroundHash'] = ''; - } - - $this->Plugins()->InitAppData($bAdmin, $aResult, $oAccount); - - return $aResult; - } - - /** - * @return array - */ - private function getUserLanguagesFromHeader() - { - $aResult = $aList = array(); - $sAcceptLang = \strtolower($this->Http()->GetServer('HTTP_ACCEPT_LANGUAGE', 'en')); - if (!empty($sAcceptLang) && \preg_match_all('/([a-z]{1,8}(?:-[a-z]{1,8})?)(?:;q=([0-9.]+))?/', $sAcceptLang, $aList)) - { - $aResult = \array_combine($aList[1], $aList[2]); - foreach ($aResult as $n => $v) - { - $aResult[$n] = $v ? $v : 1; - } - - \arsort($aResult, SORT_NUMERIC); - } - - return $aResult; - } - - /** - * @return string - */ - public function detectUserLanguage($bAdmin = false) - { - $sResult = ''; - $aLangs = $this->getUserLanguagesFromHeader(); - - foreach (\array_keys($aLangs) as $sLang) - { - $sLang = $this->ValidateLanguage($sLang, '', $bAdmin, true); - if (!empty($sLang)) - { - $sResult = $sLang; - break; - } - } - - return $sResult; - } - - /** - * @param int $iWait = 1 - * @param int $iDelay = 1 - */ - private function requestSleep($iWait = 1, $iDelay = 1) - { - if (0 < $iDelay && 0 < $iWait) - { - if ($iWait > \time() - APP_START_TIME) - { - \sleep($iDelay); - } - } - } - - private function loginErrorDelay() - { - $iDelay = (int) $this->Config()->Get('labs', 'login_fault_delay', 0); - if (0 < $iDelay) - { - $this->requestSleep(1, $iDelay); - } - } - - /** - * @param \RainLoop\Model\Account $oAccount - */ - public function AuthToken($oAccount) - { - if ($oAccount instanceof \RainLoop\Model\Account) - { - $this->SetAuthToken($oAccount); - - $aAccounts = $this->GetAccounts($oAccount); - if (\is_array($aAccounts) && isset($aAccounts[$oAccount->Email()])) - { - $aAccounts[$oAccount->Email()] = $oAccount->GetAuthToken(); - $this->SetAccounts($oAccount, $aAccounts); - } - } - } - - /** - * @param \RainLoop\Model\Account $oAccount - * @param bool $bAuthLog = false - * - * @throws \RainLoop\Exceptions\ClientException - */ - public function CheckMailConnection($oAccount, $bAuthLog = false) - { - try - { - $oAccount->IncConnectAndLoginHelper($this->Plugins(), $this->MailClient(), $this->Config()); - } - catch (\RainLoop\Exceptions\ClientException $oException) - { - throw $oException; - } - catch (\MailSo\Net\Exceptions\ConnectionException $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::ConnectionError, $oException); - } - catch (\MailSo\Imap\Exceptions\LoginBadCredentialsException $oException) - { - if ($bAuthLog) - { - $this->LoggerAuthHelper($oAccount); - } - - if ($this->Config()->Get('labs', 'imap_show_login_alert', true)) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError, - $oException, $oException->getAlertFromStatus()); - } - else - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError, $oException); - } - } - catch (\Exception $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError, $oException); - } - } - - /** - * @param string $sLogin - * @param bool $bAdmin = false - * @return array - */ - private function getAdditionalLogParamsByUserLogin($sLogin, $bAdmin = false) - { - $sHost = $bAdmin ? $this->Http()->GetHost(false, true, true) : \MailSo\Base\Utils::GetDomainFromEmail($sLogin); - return array( - '{imap:login}' => $sLogin, - '{imap:host}' => $sHost, - '{smtp:login}' => $sLogin, - '{smtp:host}' => $sHost, - '{user:email}' => $sLogin, - '{user:login}' => \MailSo\Base\Utils::GetAccountNameFromEmail($sLogin), - '{user:domain}' => $sHost, - ); - } - - /** - * @param string $sEmail - * @param string $sPassword - * @param string $sSignMeToken = '' - * @param string $sAdditionalCode = '' - * @param string $bAdditionalCodeSignMe = false - * @param string $bSkipTwoFactorAuth = false - * - * @return \RainLoop\Model\Account - * @throws \RainLoop\Exceptions\ClientException - */ - public function LoginProcess(&$sEmail, &$sPassword, $sSignMeToken = '', - $sAdditionalCode = '', $bAdditionalCodeSignMe = false, $bSkipTwoFactorAuth = false) - { - $sInputEmail = $sEmail; - - $this->Plugins()->RunHook('filter.login-credentials.step-1', array(&$sEmail, &$sPassword)); - - $sEmail = \MailSo\Base\Utils::Trim($sEmail); - if ($this->Config()->Get('login', 'login_lowercase', true)) - { - $sEmail = \MailSo\Base\Utils::StrToLowerIfAscii($sEmail); - } - - if (false === \strpos($sEmail, '@')) - { - $this->Logger()->Write('The email address "'.$sEmail.'" is not complete', \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); - - if (false === \strpos($sEmail, '@') && !!$this->Config()->Get('login', 'determine_user_domain', false)) - { - $sUserHost = \trim($this->Http()->GetHost(false, true, true)); - $this->Logger()->Write('Determined user domain: '.$sUserHost, \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); - - $bAdded = false; - - $iLimit = 14; - $aDomainParts = \explode('.', $sUserHost); - - $oDomainProvider = $this->DomainProvider(); - while (0 < \count($aDomainParts) && 0 < $iLimit) - { - $sLine = \trim(\implode('.', $aDomainParts), '. '); - - $oDomain = $oDomainProvider->Load($sLine, false); - if ($oDomain && $oDomain instanceof \RainLoop\Model\Domain) - { - $bAdded = true; - $this->Logger()->Write('Check "'.$sLine.'": OK ('.$sEmail.' > '.$sEmail.'@'.$sLine.')', - \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); - - $sEmail = $sEmail.'@'.$sLine; - break; - } - else - { - $this->Logger()->Write('Check "'.$sLine.'": NO', \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); - } - - \array_shift($aDomainParts); - $iLimit--; - } - - if (!$bAdded) - { - $sLine = $sUserHost; - $oDomain = $oDomainProvider->Load($sLine, true); - if ($oDomain && $oDomain instanceof \RainLoop\Model\Domain) - { - $bAdded = true; - $this->Logger()->Write('Check "'.$sLine.'" with wildcard: OK ('.$sEmail.' > '.$sEmail.'@'.$sLine.')', - \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); - - $sEmail = $sEmail.'@'.$sLine; - } - else - { - $this->Logger()->Write('Check "'.$sLine.'" with wildcard: NO', \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); - } - } - - if (!$bAdded) - { - $this->Logger()->Write('Domain was not found!', \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); - } - } - - $sDefDomain = \trim($this->Config()->Get('login', 'default_domain', '')); - if (false === \strpos($sEmail, '@') && 0 < \strlen($sDefDomain)) - { - $this->Logger()->Write('Default domain "'.$sDefDomain.'" was used. ('.$sEmail.' > '.$sEmail.'@'.$sDefDomain.')', - \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); - - $sEmail = $sEmail.'@'.$sDefDomain; - } - } - - $this->Plugins()->RunHook('filter.login-credentials.step-2', array(&$sEmail, &$sPassword)); - - if (false === \strpos($sEmail, '@') || 0 === \strlen($sPassword)) - { - $this->loginErrorDelay(); - - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::InvalidInputArgument); - } - - $this->Logger()->AddSecret($sPassword); - - $sLogin = $sEmail; - if ($this->Config()->Get('login', 'login_lowercase', true)) - { - $sLogin = \MailSo\Base\Utils::StrToLowerIfAscii($sLogin); - } - - $this->Plugins()->RunHook('filter.login-credentials', array(&$sEmail, &$sLogin, &$sPassword)); - - $this->Logger()->AddSecret($sPassword); - - $this->Plugins()->RunHook('event.login-pre-login-provide', array()); - - $oAccount = null; - - try - { - $oAccount = $this->LoginProvide($sEmail, $sLogin, $sPassword, $sSignMeToken, true); - - if (!($oAccount instanceof \RainLoop\Model\Account)) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); - } - - $this->Plugins()->RunHook('event.login-post-login-provide', array(&$oAccount)); - - if (!($oAccount instanceof \RainLoop\Model\Account)) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); - } - } - catch (\Exception $oException) - { - $this->loginErrorDelay(); - $this->LoggerAuthHelper($oAccount, $this->getAdditionalLogParamsByUserLogin($sInputEmail)); - throw $oException; - } - - // 2FA - if (!$bSkipTwoFactorAuth && $this->TwoFactorAuthProvider()->IsActive()) - { - $aData = $this->getTwoFactorInfo($oAccount); - if ($aData && isset($aData['IsSet'], $aData['Enable']) && !empty($aData['Secret']) && $aData['IsSet'] && $aData['Enable']) - { - $sSecretHash = \md5(APP_SALT.$aData['Secret'].\RainLoop\Utils::Fingerprint()); - $sSecretCookieHash = \RainLoop\Utils::GetCookie(self::AUTH_TFA_SIGN_ME_TOKEN_KEY, ''); - - if (empty($sSecretCookieHash) || $sSecretHash !== $sSecretCookieHash) - { - $sAdditionalCode = \trim($sAdditionalCode); - if (empty($sAdditionalCode)) - { - $this->Logger()->Write('TFA: Required Code for '.$oAccount->ParentEmailHelper().' account.'); - - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AccountTwoFactorAuthRequired); - } - else - { - $this->Logger()->Write('TFA: Verify Code for '.$oAccount->ParentEmailHelper().' account.'); - - $bUseBackupCode = false; - if (6 < \strlen($sAdditionalCode) && !empty($aData['BackupCodes'])) - { - $aBackupCodes = \explode(' ', \trim(\preg_replace('/[^\d]+/', ' ', $aData['BackupCodes']))); - $bUseBackupCode = \in_array($sAdditionalCode, $aBackupCodes); - - if ($bUseBackupCode) - { - $this->removeBackupCodeFromTwoFactorInfo($oAccount->ParentEmailHelper(), $sAdditionalCode); - } - } - - if (!$bUseBackupCode && !$this->TwoFactorAuthProvider()->VerifyCode($aData['Secret'], $sAdditionalCode)) - { - $this->loginErrorDelay(); - - $this->LoggerAuthHelper($oAccount); - - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AccountTwoFactorAuthError); - } - - if ($bAdditionalCodeSignMe) - { - \RainLoop\Utils::SetCookie(self::AUTH_TFA_SIGN_ME_TOKEN_KEY, $sSecretHash, - \time() + 60 * 60 * 24 * 14); - } - } - } - } - } - - try - { - $this->CheckMailConnection($oAccount, true); - } - catch (\Exception $oException) - { - $this->loginErrorDelay(); - - throw $oException; - } - - return $oAccount; - } - - /** - * @param string $sEmail - * - * @return string - */ - private function generateSignMeToken($sEmail) - { - return \MailSo\Base\Utils::Md5Rand(APP_SALT.$sEmail); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoLogin() - { - $sEmail = \MailSo\Base\Utils::Trim($this->GetActionParam('Email', '')); - $sPassword = $this->GetActionParam('Password', ''); - $sLanguage = $this->GetActionParam('Language', ''); - $bSignMe = '1' === (string) $this->GetActionParam('SignMe', '0'); - - $sAdditionalCode = $this->GetActionParam('AdditionalCode', ''); - $bAdditionalCodeSignMe = '1' === (string) $this->GetActionParam('AdditionalCodeSignMe', '0'); - - $oAccount = null; - - $this->Logger()->AddSecret($sPassword); - - if ('sleep@sleep.dev' === $sEmail && 0 < \strlen($sPassword) && - \is_numeric($sPassword) && $this->Config()->Get('debug', 'enable', false) && - 0 < (int) $sPassword && 30 > (int) $sPassword - ) - { - \sleep((int) $sPassword); - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); - } - - try - { - $oAccount = $this->LoginProcess($sEmail, $sPassword, - $bSignMe ? $this->generateSignMeToken($sEmail) : '', - $sAdditionalCode, $bAdditionalCodeSignMe); - } - catch (\RainLoop\Exceptions\ClientException $oException) - { - if ($oException && - \RainLoop\Notifications::AccountTwoFactorAuthRequired === $oException->getCode()) - { - return $this->DefaultResponse(__FUNCTION__, true, array( - 'TwoFactorAuth' => true - )); - } - else - { - throw $oException; - } - } - - $this->AuthToken($oAccount); - - if ($oAccount && 0 < \strlen($sLanguage)) - { - $oSettings = $this->SettingsProvider()->Load($oAccount); - if ($oSettings) - { - $sLanguage = $this->ValidateLanguage($sLanguage); - $sCurrentLanguage = $oSettings->GetConf('Language', ''); - - if ($sCurrentLanguage !== $sLanguage) - { - $oSettings->SetConf('Language', $sLanguage); - $this->SettingsProvider()->Save($oAccount, $oSettings); - } - } - } - - return $this->TrueResponse(__FUNCTION__); - } - - /** - * @param \RainLoop\Model\Account $oAccount - * - * @return array - */ - public function GetAccounts($oAccount) - { - if ($this->GetCapa(false, false, \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS, $oAccount)) - { - $sAccounts = $this->StorageProvider()->Get($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'accounts' - ); - - $aAccounts = array(); - if ('' !== $sAccounts && '{' === \substr($sAccounts, 0, 1)) - { - $aAccounts = @\json_decode($sAccounts, true); - } - - if (\is_array($aAccounts) && 0 < \count($aAccounts)) - { - if (1 === \count($aAccounts)) - { - $this->SetAccounts($oAccount, array()); - - } - else if (1 < \count($aAccounts)) - { - $sOrder = $this->StorageProvider()->Get($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'accounts_identities_order' - ); - - $aOrder = empty($sOrder) ? array() : @\json_decode($sOrder, true); - if (isset($aOrder['Accounts']) && \is_array($aOrder['Accounts']) && - 1 < \count($aOrder['Accounts'])) - { - $aAccounts = \array_merge(\array_flip($aOrder['Accounts']), $aAccounts); - - $aAccounts = \array_filter($aAccounts, function ($sHash) { - return 5 < \strlen($sHash); - }); - } - } - - return $aAccounts; - } - } - - $aAccounts = array(); - if (!$oAccount->IsAdditionalAccount()) - { - $aAccounts[$oAccount->Email()] = $oAccount->GetAuthToken(); - } - - return $aAccounts; - } - - /** - * @param \RainLoop\Model\Account $oAccount - * - * @return array - */ - public function GetTemplates($oAccount) - { - $aTemplates = array(); - if ($oAccount) - { - $aData = array(); - - $sData = $this->StorageProvider(true)->Get($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'templates' - ); - - if ('' !== $sData && '[' === \substr($sData, 0, 1)) - { - $aData = @\json_decode($sData, true); - } - - if (\is_array($aData) && 0 < \count($aData)) - { - foreach ($aData as $aItem) - { - $oItem = \RainLoop\Model\Template::NewInstance(); - $oItem->FromJSON($aItem); - - if ($oItem && $oItem->Validate()) - { - \array_push($aTemplates, $oItem); - } - } - } - - if (1 < \count($aTemplates)) - { - $sOrder = $this->StorageProvider()->Get($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'templates_order' - ); - - $aOrder = empty($sOrder) ? array() : @\json_decode($sOrder, true); - if (\is_array($aOrder) && 1 < \count($aOrder)) - { - \usort($aTemplates, function ($a, $b) use ($aOrder) { - return \array_search($a->Id(), $aOrder) < \array_search($b->Id(), $aOrder) ? -1 : 1; - }); - } - } - } - - return $aTemplates; - } - - /** - * @param \RainLoop\Model\Account $oAccount - * @param string $sID - * - * @return \RainLoop\Model\Identity - */ - public function GetTemplateByID($oAccount, $sID) - { - $aTemplates = $this->GetTemplates($oAccount); - if (\is_array($aTemplates)) - { - foreach ($aTemplates as $oIdentity) - { - if ($oIdentity && $sID === $oIdentity->Id()) - { - return $oIdentity; - } - } - } - - return isset($aTemplates[0]) ? $aTemplates[0] : null; - } - - /** - * @param \RainLoop\Model\Account $oAccount - * - * @return array - */ - public function GetIdentities($oAccount) - { - $bAllowIdentities = $this->GetCapa(false, false, - \RainLoop\Enumerations\Capa::IDENTITIES, $oAccount); - - $aIdentities = array(); - if ($oAccount) - { - $aSubIdentities = array(); - - $sData = $this->StorageProvider(true)->Get($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'identities' - ); - - if ('' !== $sData && '[' === \substr($sData, 0, 1)) - { - $aSubIdentities = @\json_decode($sData, true); - } - - $bHasAccountIdentity = false; - - if (\is_array($aSubIdentities) && 0 < \count($aSubIdentities)) - { - foreach ($aSubIdentities as $aItem) - { - $oItem = \RainLoop\Model\Identity::NewInstance(); - $oItem->FromJSON($aItem); - - if ($oItem && $oItem->Validate()) - { - if ($oItem->IsAccountIdentities()) - { - $oItem->SetEmail($oAccount->Email()); - $bHasAccountIdentity = true; - - \array_push($aIdentities, $oItem); - } - else if ($bAllowIdentities) - { - \array_push($aIdentities, $oItem); - } - } - } - } - - if (!$bHasAccountIdentity) - { - \array_unshift($aIdentities, - \RainLoop\Model\Identity::NewInstanceFromAccount($oAccount)); - } - - if (1 < \count($aIdentities) && $bAllowIdentities) - { - $sOrder = $this->StorageProvider()->Get($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'accounts_identities_order' - ); - - $aOrder = empty($sOrder) ? array() : @\json_decode($sOrder, true); - if (isset($aOrder['Identities']) && \is_array($aOrder['Identities']) && - 1 < \count($aOrder['Identities'])) - { - $aList = $aOrder['Identities']; - foreach ($aList as $iIndex => $sItem) - { - if ('' === $sItem) - { - $aList[$iIndex] = '---'; - } - } - - \usort($aIdentities, function ($a, $b) use ($aList) { - return \array_search($a->Id(true), $aList) < \array_search($b->Id(true), $aList) ? -1 : 1; - }); - } - } - } - - return $aIdentities; - } - - /** - * @param \RainLoop\Model\Account $oAccount - * @param string $sID - * @param bool $bFirstOnEmpty = false - * - * @return \RainLoop\Model\Identity - */ - public function GetIdentityByID($oAccount, $sID, $bFirstOnEmpty = false) - { - $aIdentities = $this->GetIdentities($oAccount); - - if (\is_array($aIdentities)) - { - foreach ($aIdentities as $oIdentity) - { - if ($oIdentity && $sID === $oIdentity->Id()) - { - return $oIdentity; - } - } - } - - return $bFirstOnEmpty && \is_array($aIdentities) && isset($aIdentities[0]) ? $aIdentities[0] : null; - } - /** - * @param \RainLoop\Model\Account $oAccount - * - * @return \RainLoop\Model\Identity - */ - public function GetAccountIdentity($oAccount) - { - return $this->GetIdentityByID($oAccount, '', true); - } - - /** - * @param \RainLoop\Model\Account $oAccount - * @param array $aAccounts = array() - * - * @return array - */ - public function SetAccounts($oAccount, $aAccounts = array()) - { - $sParentEmail = $oAccount->ParentEmailHelper(); - if (!\is_array($aAccounts) || 0 >= \count($aAccounts) || - (1 === \count($aAccounts) && !empty($aAccounts[$sParentEmail]))) - { - $this->StorageProvider()->Clear($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'accounts' - ); - } - else - { - $this->StorageProvider()->Put($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'accounts', - @\json_encode($aAccounts) - ); - } - } - - /** - * @param \RainLoop\Model\Account $oAccount - * @param array $aIdentities = array() - * - * @return array - */ - public function SetIdentities($oAccount, $aIdentities = array()) - { - $bAllowIdentities = $this->GetCapa(false, false, \RainLoop\Enumerations\Capa::IDENTITIES, $oAccount); - - $aResult = array(); - foreach ($aIdentities as $oItem) - { - if (!$bAllowIdentities && $oItem && !$oItem->IsAccountIdentities()) - { - continue; - } - - $aResult[] = $oItem->ToSimpleJSON(false); - } - - return $this->StorageProvider(true)->Put($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'identities', - @\json_encode($aResult) - ); - } - - /** - * @param \RainLoop\Model\Account $oAccount - * @param array $aTemplates = array() - * - * @return array - */ - public function SetTemplates($oAccount, $aTemplates = array()) - { - $aResult = array(); - foreach ($aTemplates as $oItem) - { - $aResult[] = $oItem->ToSimpleJSON(false); - } - - return $this->StorageProvider(true)->Put($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'templates', - @\json_encode($aResult) - ); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoFilters() - { - $oAccount = $this->getAccountFromToken(); - - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FILTERS, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $aFakeFilters = null; - - $this->Plugins() - ->RunHook('filter.filters-fake', array($oAccount, &$aFakeFilters)) - ; - - if ($aFakeFilters) - { - return $this->DefaultResponse(__FUNCTION__, $aFakeFilters); - } - - return $this->DefaultResponse(__FUNCTION__, - $this->FiltersProvider()->Load($oAccount, $oAccount->DomainSieveAllowRaw())); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoFiltersSave() - { - $oAccount = $this->getAccountFromToken(); - - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FILTERS, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $aIncFilters = $this->GetActionParam('Filters', array()); - - $sRaw = $this->GetActionParam('Raw', ''); - $bRawIsActive = '1' === (string) $this->GetActionParam('RawIsActive', '0'); - - $aFilters = array(); - foreach ($aIncFilters as $aFilter) - { - if ($aFilter) - { - $oFilter = new \RainLoop\Providers\Filters\Classes\Filter(); - if ($oFilter->FromJSON($aFilter)) - { - $aFilters[] = $oFilter; - } - } - } - - $this->Plugins() - ->RunHook('filter.filters-save', array($oAccount, &$aFilters, &$sRaw, &$bRawIsActive)) - ; - - return $this->DefaultResponse(__FUNCTION__, $this->FiltersProvider()->Save($oAccount, - $aFilters, $sRaw, $bRawIsActive)); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoAccountSetup() - { - $oAccount = $this->getAccountFromToken(); - - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $sParentEmail = $oAccount->ParentEmailHelper(); - - $aAccounts = $this->GetAccounts($oAccount); - if (!\is_array($aAccounts)) - { - $aAccounts = array(); - } - - $sEmail = \trim($this->GetActionParam('Email', '')); - $sPassword = $this->GetActionParam('Password', ''); - $bNew = '1' === (string) $this->GetActionParam('New', '1'); - - $sEmail = \MailSo\Base\Utils::IdnToAscii($sEmail, true); - if ($bNew && ($oAccount->Email() === $sEmail || $sParentEmail === $sEmail || isset($aAccounts[$sEmail]))) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AccountAlreadyExists); - } - else if (!$bNew && !isset($aAccounts[$sEmail])) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AccountDoesNotExist); - } - - $oNewAccount = $this->LoginProcess($sEmail, $sPassword, '', '', false, true); - $oNewAccount->SetParentEmail($sParentEmail); - - $aAccounts[$oNewAccount->Email()] = $oNewAccount->GetAuthToken(); - if (!$oAccount->IsAdditionalAccount()) - { - $aAccounts[$oAccount->Email()] = $oAccount->GetAuthToken(); - } - - $this->SetAccounts($oAccount, $aAccounts); - return $this->TrueResponse(__FUNCTION__); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoAccountDelete() - { - $oAccount = $this->getAccountFromToken(); - - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $sParentEmail = $oAccount->ParentEmailHelper(); - $sEmailToDelete = \trim($this->GetActionParam('EmailToDelete', '')); - $sEmailToDelete = \MailSo\Base\Utils::IdnToAscii($sEmailToDelete, true); - - $aAccounts = $this->GetAccounts($oAccount); - - if (0 < \strlen($sEmailToDelete) && $sEmailToDelete !== $sParentEmail && \is_array($aAccounts) && isset($aAccounts[$sEmailToDelete])) - { - unset($aAccounts[$sEmailToDelete]); - - $oAccountToChange = null; - if ($oAccount->Email() === $sEmailToDelete && !empty($aAccounts[$sParentEmail])) - { - $oAccountToChange = $this->GetAccountFromCustomToken($aAccounts[$sParentEmail], false, false); - if ($oAccountToChange) - { - $this->AuthToken($oAccountToChange); - } - } - - $this->SetAccounts($oAccount, $aAccounts); - return $this->TrueResponse(__FUNCTION__, array('Reload' => !!$oAccountToChange)); - } - - return $this->FalseResponse(__FUNCTION__); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoAttachmentsActions() - { - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::ATTACHMENTS_ACTIONS)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $oAccount = $this->initMailClientConnection(); - - $sAction = $this->GetActionParam('Do', ''); - $aHashes = $this->GetActionParam('Hashes', null); - - $mResult = false; - $bError = false; - $aData = false; - - if (\is_array($aHashes) && 0 < \count($aHashes)) - { - $aData = array(); - foreach ($aHashes as $sZipHash) - { - $aResult = $this->getMimeFileByHash($oAccount, $sZipHash); - if (\is_array($aResult) && !empty($aResult['FileHash'])) - { - $aData[] = $aResult; - } - else - { - $bError = true; - break; - } - } - } - - $oFilesProvider = $this->FilesProvider(); - if (!empty($sAction) && !$bError && \is_array($aData) && 0 < \count($aData) && - $oFilesProvider && $oFilesProvider->IsActive()) - { - $bError = false; - switch (\strtolower($sAction)) - { - case 'zip': - - if (\class_exists('ZipArchive')) - { - $sZipHash = \MailSo\Base\Utils::Md5Rand(); - $sZipFileName = $oFilesProvider->GenerateLocalFullFileName($oAccount, $sZipHash); - - if (!empty($sZipFileName)) - { - $oZip = new \ZipArchive(); - $oZip->open($sZipFileName, \ZIPARCHIVE::CREATE | \ZIPARCHIVE::OVERWRITE); - $oZip->setArchiveComment('RainLoop/'.APP_VERSION); - - foreach ($aData as $aItem) - { - $sFileName = (string) (isset($aItem['FileName']) ? $aItem['FileName'] : 'file.dat'); - $sFileHash = (string) (isset($aItem['FileHash']) ? $aItem['FileHash'] : ''); - - if (!empty($sFileHash)) - { - $sFullFileNameHash = $oFilesProvider->GetFileName($oAccount, $sFileHash); - if (!$oZip->addFile($sFullFileNameHash, $sFileName)) - { - $bError = true; - } - } - } - - if (!$bError) - { - $bError = !$oZip->close(); - } - else - { - $oZip->close(); - } - } - - foreach ($aData as $aItem) - { - $sFileHash = (string) (isset($aItem['FileHash']) ? $aItem['FileHash'] : ''); - if (!empty($sFileHash)) - { - $oFilesProvider->Clear($oAccount, $sFileHash); - } - } - - if (!$bError) - { - $mResult = array( - 'Files' => array(array( - 'FileName' => 'attachments.zip', - 'Hash' => \RainLoop\Utils::EncodeKeyValuesQ(array( - 'V' => APP_VERSION, - 'Account' => $oAccount ? \md5($oAccount->Hash()) : '', - 'FileName' => 'attachments.zip', - 'MimeType' => 'application/zip', - 'FileHash' => $sZipHash - )) - )) - ); - } - } - break; - - case 'owncloud': - - $mResult = false; - - if (\RainLoop\Utils::IsOwnCloudLoggedIn() && \class_exists('OCP\Files')) - { - $sSaveFolder = $this->Config()->Get('labs', 'owncloud_save_folder', ''); - if (empty($sSaveFolder)) - { - $sSaveFolder = 'Attachments'; - } - - $oFiles = \OCP\Files::getStorage('files'); - - if ($oFilesProvider && $oFiles && $oFilesProvider->IsActive() && - \method_exists($oFiles, 'file_put_contents')) - { - if (!$oFiles->is_dir($sSaveFolder)) - { - $oFiles->mkdir($sSaveFolder); - } - - $mResult = true; - foreach ($aData as $aItem) - { - $sSavedFileName = isset($aItem['FileName']) ? $aItem['FileName'] : 'file.dat'; - $sSavedFileHash = !empty($aItem['FileHash']) ? $aItem['FileHash'] : ''; - - if (!empty($sSavedFileHash)) - { - $fFile = $oFilesProvider->GetFile($oAccount, $sSavedFileHash, 'rb'); - if (\is_resource($fFile)) - { - $sSavedFileNameFull = \MailSo\Base\Utils::SmartFileExists($sSaveFolder.'/'.$sSavedFileName, function ($sPath) use ($oFiles) { - return $oFiles->file_exists($sPath); - }); - - if (!$oFiles->file_put_contents($sSavedFileNameFull, $fFile)) - { - $mResult = false; - } - - if (\is_resource($fFile)) - { - @\fclose($fFile); - } - } - } - } - } - } - - foreach ($aData as $aItem) - { - $sFileHash = (string) (isset($aItem['FileHash']) ? $aItem['FileHash'] : ''); - if (!empty($sFileHash)) - { - $oFilesProvider->Clear($oAccount, $sFileHash); - } - } - - break; - - case 'dropbox': - - $mResult = array( - 'ShortLife' => '_'.$this->GetShortLifeSpecAuthToken(), - 'Url' => \preg_replace('/\?(.*)$/', '', $this->Http()->GetFullUrl()), - 'Files' => array() - ); - - foreach ($aData as $aItem) - { - $mResult['Files'][] = array( - 'FileName' => isset($aItem['FileName']) ? $aItem['FileName'] : 'file.dat', - 'Hash' => \RainLoop\Utils::EncodeKeyValuesQ($aItem) - ); - } - - break; - } - } - else - { - $bError = true; - } - - $this->requestSleep(); - return $this->DefaultResponse(__FUNCTION__, $bError ? false : $mResult); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoIdentityUpdate() - { - $oAccount = $this->getAccountFromToken(); - - $oIdentity = \RainLoop\Model\Identity::NewInstance(); - if (!$oIdentity->FromJSON($this->GetActionParams(), true)) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::InvalidInputArgument); - } - - $aIdentities = $this->GetIdentities($oAccount); - - $bAdded = false; - $aIdentitiesForSave = array(); - foreach ($aIdentities as $oItem) - { - if ($oItem) - { - if ($oItem->Id() === $oIdentity->Id()) - { - $aIdentitiesForSave[] = $oIdentity; - $bAdded = true; - } - else - { - $aIdentitiesForSave[] = $oItem; - } - } - } - - if (!$bAdded) - { - $aIdentitiesForSave[] = $oIdentity; - } - - return $this->DefaultResponse(__FUNCTION__, $this->SetIdentities($oAccount, $aIdentitiesForSave)); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoIdentityDelete() - { - $oAccount = $this->getAccountFromToken(); - - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::IDENTITIES, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $sId = \trim($this->GetActionParam('IdToDelete', '')); - if (empty($sId)) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::UnknownError); - } - - $aNew = array(); - $aIdentities = $this->GetIdentities($oAccount); - - foreach ($aIdentities as $oItem) - { - if ($oItem && $sId !== $oItem->Id()) - { - $aNew[] = $oItem; - } - } - - return $this->DefaultResponse(__FUNCTION__, $this->SetIdentities($oAccount, $aNew)); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoTemplateSetup() - { - $oAccount = $this->getAccountFromToken(); - - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TEMPLATES, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $oTemplate = \RainLoop\Model\Template::NewInstance(); - if (!$oTemplate->FromJSON($this->GetActionParams(), true)) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::InvalidInputArgument); - } - - if ('' === $oTemplate->Id()) - { - $oTemplate->GenerateID(); - } - - $aTemplatesForSave = array(); - $aTemplates = $this->GetTemplates($oAccount); - - - foreach ($aTemplates as $oItem) - { - if ($oItem && $oItem->Id() !== $oTemplate->Id()) - { - $aTemplatesForSave[] = $oItem; - } - } - - $aTemplatesForSave[] = $oTemplate; - - return $this->DefaultResponse(__FUNCTION__, $this->SetTemplates($oAccount, $aTemplatesForSave)); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoTemplateDelete() - { - $oAccount = $this->getAccountFromToken(); - - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TEMPLATES, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $sId = \trim($this->GetActionParam('IdToDelete', '')); - if (empty($sId)) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::UnknownError); - } - - $aNew = array(); - $aTemplates = $this->GetTemplates($oAccount); - foreach ($aTemplates as $oItem) - { - if ($oItem && $sId !== $oItem->Id()) - { - $aNew[] = $oItem; - } - } - - return $this->DefaultResponse(__FUNCTION__, $this->SetTemplates($oAccount, $aNew)); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoTemplateGetByID() - { - $oAccount = $this->getAccountFromToken(); - - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TEMPLATES, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $sId = \trim($this->GetActionParam('ID', '')); - if (empty($sId)) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::UnknownError); - } - - $oTemplate = false; - $aTemplates = $this->GetTemplates($oAccount); - - foreach ($aTemplates as $oItem) - { - if ($oItem && $sId === $oItem->Id()) - { - $oTemplate = $oItem; - break; - } - } - - $oTemplate->SetPopulateAlways(true); - return $this->DefaultResponse(__FUNCTION__, $oTemplate); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoAccountsAndIdentitiesSortOrder() - { - $oAccount = $this->getAccountFromToken(); - - $aAccounts = $this->GetActionParam('Accounts', null); - $aIdentities = $this->GetActionParam('Identities', null); - - if (!\is_array($aAccounts) && !\is_array($aIdentities)) - { - return $this->FalseResponse(__FUNCTION__); - } - - return $this->DefaultResponse(__FUNCTION__, $this->StorageProvider()->Put($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'accounts_identities_order', - \json_encode(array( - 'Accounts' => \is_array($aAccounts) ? $aAccounts : array(), - 'Identities' => \is_array($aIdentities) ? $aIdentities : array() - )) - )); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoAccountsAndIdentities() - { - $oAccount = $this->getAccountFromToken(); - - $mAccounts = false; - - if ($this->GetCapa(false, false, \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS, $oAccount)) - { - $mAccounts = $this->GetAccounts($oAccount); - $mAccounts = \array_keys($mAccounts); - - foreach ($mAccounts as $iIndex => $sName) - { - $mAccounts[$iIndex] = \MailSo\Base\Utils::IdnToUtf8($sName); - } - } - - return $this->DefaultResponse(__FUNCTION__, array( - 'Accounts' => $mAccounts, - 'Identities' => $this->GetIdentities($oAccount) - )); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoTemplates() - { - $oAccount = $this->getAccountFromToken(); - - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TEMPLATES, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - return $this->DefaultResponse(__FUNCTION__, array( - 'Templates' => $this->GetTemplates($oAccount) - )); - } - - /** - * @param string $sHash - * - * @return int - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function getAccountUnredCountFromHash($sHash) - { - $iResult = 0; - - $oAccount = $this->GetAccountFromCustomToken($sHash, false); - if ($oAccount) - { - try - { - $oMailClient = \MailSo\Mail\MailClient::NewInstance(); - $oMailClient->SetLogger($this->Logger()); - - $oAccount->IncConnectAndLoginHelper($this->Plugins(),$oMailClient, $this->Config()); - - $iResult = $oMailClient->InboxUnreadCount(); - - $oMailClient->LogoutAndDisconnect(); - } - catch (\Exception $oException) - { - $this->Logger()->WriteException($oException); - } - } - - return $iResult; - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoAccountsCounts() - { - $oAccount = $this->getAccountFromToken(); - - $bComplete = true; - $aCounts = array(); - - if ($this->GetCapa(false, false, \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS, $oAccount)) - { - $iLimit = 7; - $mAccounts = $this->GetAccounts($oAccount); - if (\is_array($mAccounts) && 0 < \count($mAccounts)) - { - if ($iLimit > \count($mAccounts)) - { - $mAccounts = \array_slice($mAccounts, 0, $iLimit); - } - else - { - $bComplete = false; - } - - if (0 < \count($mAccounts)) - { - foreach ($mAccounts as $sEmail => $sHash) - { - $aCounts[] = array(\MailSo\Base\Utils::IdnToUtf8($sEmail), - $oAccount->Email() === $sEmail ? 0 : $this->getAccountUnredCountFromHash($sHash)); - } - } - } - } - else - { - $aCounts[] = array(\MailSo\Base\Utils::IdnToUtf8($oAccount->Email()), 0); - } - - return $this->DefaultResponse(__FUNCTION__, array( - 'Complete' => $bComplete, - 'Counts' => $aCounts - )); - } - - /** - * @param \RainLoop\Model\Account $oAccount - */ - public function ClearSignMeData($oAccount) - { - if ($oAccount) - { - \RainLoop\Utils::ClearCookie(\RainLoop\Actions::AUTH_SIGN_ME_TOKEN_KEY); - - $this->StorageProvider()->Clear($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'sign_me' - ); - } - } - - /** - * @return array - */ - public function DoLogout() - { - $oAccount = $this->getAccountFromToken(false); - if ($oAccount) - { - if ($oAccount->SignMe()) - { - $this->ClearSignMeData($oAccount); - } - - if (!$oAccount->IsAdditionalAccount()) - { - \RainLoop\Utils::ClearCookie(\RainLoop\Actions::AUTH_SPEC_TOKEN_KEY); - } - } - - return $this->TrueResponse(__FUNCTION__); - } - - /** - * @return array - */ - public function DoAppDelayStart() - { - $this->Plugins()->RunHook('service.app-delay-start-begin'); - - \RainLoop\Utils::UpdateConnectionToken(); - - $bMainCache = false; - $bFilesCache = false; - $bVersionsCache = false; - - $iOneDay1 = 60 * 60 * 23; - $iOneDay2 = 60 * 60 * 25; - $iOneDay3 = 60 * 60 * 30; - - $sTimers = $this->StorageProvider()->Get(null, - \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, 'Cache/Timers', ''); - - $aTimers = \explode(',', $sTimers); - - $iMainCacheTime = !empty($aTimers[0]) && \is_numeric($aTimers[0]) ? (int) $aTimers[0] : 0; - $iFilesCacheTime = !empty($aTimers[1]) && \is_numeric($aTimers[1]) ? (int) $aTimers[1] : 0; - $iVersionsCacheTime = !empty($aTimers[2]) && \is_numeric($aTimers[2]) ? (int) $aTimers[2] : 0; - - if (0 === $iMainCacheTime || $iMainCacheTime + $iOneDay1 < \time()) - { - $bMainCache = true; - $iMainCacheTime = \time(); - } - - if (0 === $iFilesCacheTime || $iFilesCacheTime + $iOneDay2 < \time()) - { - $bFilesCache = true; - $iFilesCacheTime = \time(); - } - - if (0 === $iVersionsCacheTime || $iVersionsCacheTime + $iOneDay3 < \time()) - { - $bVersionsCache = true; - $iVersionsCacheTime = \time(); - } - - if ($bMainCache || $bFilesCache || $bVersionsCache) - { - if (!$this->StorageProvider()->Put(null, - \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, 'Cache/Timers', - \implode(',', array($iMainCacheTime, $iFilesCacheTime, $iVersionsCacheTime)))) - { - $bMainCache = $bFilesCache = $bVersionsCache = false; - } - } - - if ($bMainCache) - { - $this->Logger()->Write('Cacher GC: Begin'); - $this->Cacher()->GC(48); - $this->Logger()->Write('Cacher GC: End'); - } - else if ($bFilesCache) - { - $this->Logger()->Write('Files GC: Begin'); - $this->FilesProvider()->GC(48); - $this->Logger()->Write('Files GC: End'); - } - else if ($bVersionsCache) - { - $oPremProvider = $this->PremProvider(); - if ($oPremProvider) - { - $oPremProvider->ClearOldVersion(); - } - } - - $this->Plugins()->RunHook('service.app-delay-start-end'); - - return $this->TrueResponse(__FUNCTION__); - } - - /** - * @return array - */ - public function DoSystemFoldersUpdate() - { - $oAccount = $this->getAccountFromToken(); - - $oSettingsLocal = $this->SettingsProvider(true)->Load($oAccount); - - $oSettingsLocal->SetConf('SentFolder', $this->GetActionParam('SentFolder', '')); - $oSettingsLocal->SetConf('DraftFolder', $this->GetActionParam('DraftFolder', '')); - $oSettingsLocal->SetConf('SpamFolder', $this->GetActionParam('SpamFolder', '')); - $oSettingsLocal->SetConf('TrashFolder', $this->GetActionParam('TrashFolder', '')); - $oSettingsLocal->SetConf('ArchiveFolder', $this->GetActionParam('ArchiveFolder', '')); - $oSettingsLocal->SetConf('NullFolder', $this->GetActionParam('NullFolder', '')); - - return $this->DefaultResponse(__FUNCTION__, - $this->SettingsProvider(true)->Save($oAccount, $oSettingsLocal)); - } - - /** - * @param \RainLoop\Config\Application $oConfig - * @param string $sParamName - * @param string $sConfigSector - * @param string $sConfigName - * @param string $sType = 'string' - * @param callable|null $mStringCallback = null - */ - public function setConfigFromParams(&$oConfig, $sParamName, $sConfigSector, $sConfigName, $sType = 'string', $mStringCallback = null) - { - $sValue = $this->GetActionParam($sParamName, ''); - if ($this->HasActionParam($sParamName)) - { - switch ($sType) - { - default: - case 'string': - $sValue = (string) $sValue; - if ($mStringCallback && is_callable($mStringCallback)) - { - $sValue = call_user_func($mStringCallback, $sValue); - } - - $oConfig->Set($sConfigSector, $sConfigName, (string) $sValue); - break; - - case 'dummy': - $sValue = (string) $this->GetActionParam('ContactsPdoPassword', APP_DUMMY); - if (APP_DUMMY !== $sValue) - { - $oConfig->Set($sConfigSector, $sConfigName, (string) $sValue); - } - break; - - case 'int': - $iValue = (int) $sValue; - $oConfig->Set($sConfigSector, $sConfigName, $iValue); - break; - - case 'bool': - $oConfig->Set($sConfigSector, $sConfigName, '1' === (string) $sValue); - break; - } - } - } - - /** - * @param \RainLoop\Config\Application $oConfig - * @param string $sParamName - * @param string $sCapa - */ - private function setCapaFromParams(&$oConfig, $sParamName, $sCapa) - { - switch ($sCapa) - { - case \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS: - $this->setConfigFromParams($oConfig, $sParamName, 'webmail', 'allow_additional_accounts', 'bool'); - break; - case \RainLoop\Enumerations\Capa::IDENTITIES: - $this->setConfigFromParams($oConfig, $sParamName, 'webmail', 'allow_additional_identities', 'bool'); - break; - case \RainLoop\Enumerations\Capa::TEMPLATES: - $this->setConfigFromParams($oConfig, $sParamName, 'capa', 'x-templates', 'bool'); - break; - case \RainLoop\Enumerations\Capa::TWO_FACTOR: - $this->setConfigFromParams($oConfig, $sParamName, 'security', 'allow_two_factor_auth', 'bool'); - break; - case \RainLoop\Enumerations\Capa::TWO_FACTOR_FORCE: - $this->setConfigFromParams($oConfig, $sParamName, 'security', 'force_two_factor_auth', 'bool'); - break; - case \RainLoop\Enumerations\Capa::GRAVATAR: - $this->setConfigFromParams($oConfig, $sParamName, 'labs', 'allow_gravatar', 'bool'); - break; - case \RainLoop\Enumerations\Capa::ATTACHMENT_THUMBNAILS: - $this->setConfigFromParams($oConfig, $sParamName, 'interface', 'show_attachment_thumbnail', 'bool'); - break; - case \RainLoop\Enumerations\Capa::THEMES: - $this->setConfigFromParams($oConfig, $sParamName, 'webmail', 'allow_themes', 'bool'); - break; - case \RainLoop\Enumerations\Capa::USER_BACKGROUND: - $this->setConfigFromParams($oConfig, $sParamName, 'webmail', 'allow_user_background', 'bool'); - break; - case \RainLoop\Enumerations\Capa::OPEN_PGP: - $this->setConfigFromParams($oConfig, $sParamName, 'security', 'openpgp', 'bool'); - break; - } - } - - /** - * @param \RainLoop\Settings $oSettings - * @param string $sConfigName - * @param string $sType = 'string' - * @param callable|null $mStringCallback = null - */ - private function setSettingsFromParams(&$oSettings, $sConfigName, $sType = 'string', $mStringCallback = null) - { - if ($this->HasActionParam($sConfigName)) - { - $sValue = $this->GetActionParam($sConfigName, ''); - switch ($sType) - { - default: - case 'string': - $sValue = (string) $sValue; - if ($mStringCallback && is_callable($mStringCallback)) - { - $sValue = call_user_func($mStringCallback, $sValue); - } - - $oSettings->SetConf($sConfigName, (string) $sValue); - break; - - case 'int': - $iValue = (int) $sValue; - $oSettings->SetConf($sConfigName, $iValue); - break; - - case 'bool': - $oSettings->SetConf($sConfigName, '1' === (string) $sValue); - break; - } - } - } - - /** - * @return array - */ - public function DoAdminSettingsUpdate() - { -// sleep(3); -// return $this->DefaultResponse(__FUNCTION__, false); - - $this->IsAdminLoggined(); - - $oConfig = $this->Config(); - - $self = $this; - - $this->setConfigFromParams($oConfig, 'Language', 'webmail', 'language', 'string', function ($sLanguage) use ($self) { - return $self->ValidateLanguage($sLanguage, '', false); - }); - - $this->setConfigFromParams($oConfig, 'LanguageAdmin', 'webmail', 'language_admin', 'string', function ($sLanguage) use ($self) { - return $self->ValidateLanguage($sLanguage, '', true); - }); - - $this->setConfigFromParams($oConfig, 'Theme', 'webmail', 'theme', 'string', function ($sTheme) use ($self) { - return $self->ValidateTheme($sTheme); - }); - - $this->setConfigFromParams($oConfig, 'VerifySslCertificate', 'ssl', 'verify_certificate', 'bool'); - $this->setConfigFromParams($oConfig, 'AllowSelfSigned', 'ssl', 'allow_self_signed', 'bool'); - - $this->setConfigFromParams($oConfig, 'UseLocalProxyForExternalImages', 'labs', 'use_local_proxy_for_external_images', 'bool'); - - $this->setConfigFromParams($oConfig, 'NewMoveToFolder', 'interface', 'new_move_to_folder_button', 'bool'); - - $this->setConfigFromParams($oConfig, 'AllowLanguagesOnSettings', 'webmail', 'allow_languages_on_settings', 'bool'); - $this->setConfigFromParams($oConfig, 'AllowLanguagesOnLogin', 'login', 'allow_languages_on_login', 'bool'); - $this->setConfigFromParams($oConfig, 'AttachmentLimit', 'webmail', 'attachment_size_limit', 'int'); - - $this->setConfigFromParams($oConfig, 'LoginDefaultDomain', 'login', 'default_domain', 'string'); - - $this->setConfigFromParams($oConfig, 'ContactsEnable', 'contacts', 'enable', 'bool'); - $this->setConfigFromParams($oConfig, 'ContactsSync', 'contacts', 'allow_sync', 'bool'); - $this->setConfigFromParams($oConfig, 'ContactsPdoDsn', 'contacts', 'pdo_dsn', 'string'); - $this->setConfigFromParams($oConfig, 'ContactsPdoUser', 'contacts', 'pdo_user', 'string'); - $this->setConfigFromParams($oConfig, 'ContactsPdoPassword', 'contacts', 'pdo_password', 'dummy'); - - $this->setConfigFromParams($oConfig, 'ContactsPdoType', 'contacts', 'type', 'string', function ($sType) use ($self) { - return $self->ValidateContactPdoType($sType); - }); - - $this->setCapaFromParams($oConfig, 'CapaAdditionalAccounts', \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS); - $this->setCapaFromParams($oConfig, 'CapaIdentities', \RainLoop\Enumerations\Capa::IDENTITIES); - $this->setCapaFromParams($oConfig, 'CapaTemplates', \RainLoop\Enumerations\Capa::TEMPLATES); - $this->setCapaFromParams($oConfig, 'CapaTwoFactorAuth', \RainLoop\Enumerations\Capa::TWO_FACTOR); - $this->setCapaFromParams($oConfig, 'CapaTwoFactorAuthForce', \RainLoop\Enumerations\Capa::TWO_FACTOR_FORCE); - $this->setCapaFromParams($oConfig, 'CapaOpenPGP', \RainLoop\Enumerations\Capa::OPEN_PGP); - $this->setCapaFromParams($oConfig, 'CapaGravatar', \RainLoop\Enumerations\Capa::GRAVATAR); - $this->setCapaFromParams($oConfig, 'CapaThemes', \RainLoop\Enumerations\Capa::THEMES); - $this->setCapaFromParams($oConfig, 'CapaUserBackground', \RainLoop\Enumerations\Capa::USER_BACKGROUND); - $this->setCapaFromParams($oConfig, 'CapaAttachmentThumbnails', \RainLoop\Enumerations\Capa::ATTACHMENT_THUMBNAILS); - - $this->setConfigFromParams($oConfig, 'DetermineUserLanguage', 'login', 'determine_user_language', 'bool'); - $this->setConfigFromParams($oConfig, 'DetermineUserDomain', 'login', 'determine_user_domain', 'bool'); - - $this->setConfigFromParams($oConfig, 'Title', 'webmail', 'title', 'string'); - $this->setConfigFromParams($oConfig, 'LoadingDescription', 'webmail', 'loading_description', 'string'); - $this->setConfigFromParams($oConfig, 'FaviconUrl', 'webmail', 'favicon_url', 'string'); - - $this->setConfigFromParams($oConfig, 'TokenProtection', 'security', 'csrf_protection', 'bool'); - $this->setConfigFromParams($oConfig, 'EnabledPlugins', 'plugins', 'enable', 'bool'); - - $this->setConfigFromParams($oConfig, 'GoogleEnable', 'social', 'google_enable', 'bool'); - $this->setConfigFromParams($oConfig, 'GoogleEnableAuth', 'social', 'google_enable_auth', 'bool'); - $this->setConfigFromParams($oConfig, 'GoogleEnableAuthFast', 'social', 'google_enable_auth_fast', 'bool'); - $this->setConfigFromParams($oConfig, 'GoogleEnableDrive', 'social', 'google_enable_drive', 'bool'); - $this->setConfigFromParams($oConfig, 'GoogleEnablePreview', 'social', 'google_enable_preview', 'bool'); - $this->setConfigFromParams($oConfig, 'GoogleClientID', 'social', 'google_client_id', 'string'); - $this->setConfigFromParams($oConfig, 'GoogleClientSecret', 'social', 'google_client_secret', 'string'); - $this->setConfigFromParams($oConfig, 'GoogleApiKey', 'social', 'google_api_key', 'string'); - - $this->setConfigFromParams($oConfig, 'FacebookEnable', 'social', 'fb_enable', 'bool'); - $this->setConfigFromParams($oConfig, 'FacebookAppID', 'social', 'fb_app_id', 'string'); - $this->setConfigFromParams($oConfig, 'FacebookAppSecret', 'social', 'fb_app_secret', 'string'); - - $this->setConfigFromParams($oConfig, 'TwitterEnable', 'social', 'twitter_enable', 'bool'); - $this->setConfigFromParams($oConfig, 'TwitterConsumerKey', 'social', 'twitter_consumer_key', 'string'); - $this->setConfigFromParams($oConfig, 'TwitterConsumerSecret', 'social', 'twitter_consumer_secret', 'string'); - - $this->setConfigFromParams($oConfig, 'DropboxEnable', 'social', 'dropbox_enable', 'bool'); - $this->setConfigFromParams($oConfig, 'DropboxApiKey', 'social', 'dropbox_api_key', 'string'); - - $oPremProvider = $this->PremProvider(); - if ($oPremProvider) - { - $oPremProvider->PremSection($this, $oConfig); - } - - return $this->DefaultResponse(__FUNCTION__, $oConfig->Save()); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoAdminLogin() - { - $sLogin = trim($this->GetActionParam('Login', '')); - $sPassword = $this->GetActionParam('Password', ''); - - $this->Logger()->AddSecret($sPassword); - - if (0 === strlen($sLogin) || 0 === strlen($sPassword) || - !$this->Config()->Get('security', 'allow_admin_panel', true) || - $sLogin !== $this->Config()->Get('security', 'admin_login', '') || - !$this->Config()->ValidatePassword($sPassword)) - { - $this->loginErrorDelay(); - $this->LoggerAuthHelper(null, $this->getAdditionalLogParamsByUserLogin($sLogin, true)); - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); - } - - $sToken = $this->getAdminToken(); - $this->setAdminAuthToken($sToken); - - return $this->DefaultResponse(__FUNCTION__, $sToken ? true : false); - } - - /** - * @return array - */ - public function DoAdminLogout() - { - $this->ClearAdminAuthToken(); - return $this->TrueResponse(__FUNCTION__); - } - - /** - * @return array - */ - public function DoAdminPing() - { - $this->IsAdminLoggined(); - - return $this->DefaultResponse(__FUNCTION__, true); - } - - /** - * @return array - */ - public function DoAdminContactsTest() - { - $this->IsAdminLoggined(); - - $oConfig = $this->Config(); - - $this->setConfigFromParams($oConfig, 'ContactsPdoDsn', 'contacts', 'pdo_dsn', 'string'); - $this->setConfigFromParams($oConfig, 'ContactsPdoUser', 'contacts', 'pdo_user', 'string'); - $this->setConfigFromParams($oConfig, 'ContactsPdoPassword', 'contacts', 'pdo_password', 'dummy'); - - $self = $this; - $this->setConfigFromParams($oConfig, 'ContactsPdoType', 'contacts', 'type', 'string', function ($sType) use ($self) { - return $self->ValidateContactPdoType($sType); - }); - - $sTestMessage = $this->AddressBookProvider(null, true)->Test(); - return $this->DefaultResponse(__FUNCTION__, array( - 'Result' => '' === $sTestMessage, - 'Message' => \MailSo\Base\Utils::Utf8Clear($sTestMessage, '?') - )); - } - - /** - * @return array - */ - public function DoAdminLicensing() - { - $this->IsAdminLoggined(); - - $bForce = '1' === (string) $this->GetActionParam('Force', '0'); - - $mResult = false; - $iErrorCode = -1; - - $oPremProvider = $this->PremProvider(); - - if ($oPremProvider && 2 < \strlen(APP_SITE)) - { - $sValue = $oPremProvider->Fetcher($bForce); - - $this->requestSleep(); - - $iExpired = 0; - if ($oPremProvider->Parser($sValue, $iExpired)) - { - $mResult = array( - 'Banned' => false, - 'Expired' => $iExpired, - ); - } - else if ($sValue === 'NO' || \preg_match('/^EXPIRED:[\d]+$/', $sValue)) - { - $iErrorCode = -1; - } - else if ($sValue === 'TOO_MANY_CONNECTIONS') - { - $iErrorCode = -1; - } - else - { - $iErrorCode = \RainLoop\Notifications::LicensingServerIsUnavailable; - } - } - - if (0 < $iErrorCode && !$mResult) - { - throw new \RainLoop\Exceptions\ClientException($iErrorCode); - } - - return $this->DefaultResponse(__FUNCTION__, $mResult); - } - - /** - * @return array - */ - public function DoAdminLicensingActivate() - { - $this->IsAdminLoggined(); - - $sDomain = (string) $this->GetActionParam('Domain', ''); - $sKey = (string) $this->GetActionParam('Key', ''); - - $mResult = false; - $iErrorCode = -1; - - $oPrem = $this->PremProvider(); - - if ($oPrem && 2 < \strlen($sDomain) && 2 < \strlen($sKey) && $sDomain === APP_SITE) - { - $iCode = 0; - $sValue = $oPrem->Activate($sDomain, $sKey, $iCode); - - $this->requestSleep(); - - $aMatch = array(); - if ('OK' === $sValue) - { - $mResult = true; - } - else if ('TOO_MANY_CONNECTIONS' === $sValue) - { - $mResult = 'Too many connections. Please try again later.'; - } - else if (\preg_match('/^ERROR:(.+)$/', $sValue, $aMatch) && !empty($aMatch[1])) - { - $mResult = trim($aMatch[1]); - - $this->Logger()->Write('Activation error for: '.$sKey.' ('.$sDomain.')', \MailSo\Log\Enumerations\Type::ERROR); - $this->Logger()->Write($mResult, \MailSo\Log\Enumerations\Type::ERROR); - } - else - { - $iErrorCode = \RainLoop\Notifications::LicensingServerIsUnavailable; - } - } - - if (0 < $iErrorCode && !$mResult) - { - throw new \RainLoop\Exceptions\ClientException($iErrorCode); - } - - return $this->DefaultResponse(__FUNCTION__, $mResult); - } - - /** - * @return array - */ - public function DoAdminPasswordUpdate() - { - $this->IsAdminLoggined(); - - $bResult = false; - $oConfig = $this->Config(); - - $sLogin = \trim($this->GetActionParam('Login', '')); - $sPassword = $this->GetActionParam('Password', ''); - $this->Logger()->AddSecret($sPassword); - - $sNewPassword = $this->GetActionParam('NewPassword', ''); - if (0 < \strlen(\trim($sNewPassword))) - { - $this->Logger()->AddSecret($sNewPassword); - } - - if ($oConfig->ValidatePassword($sPassword)) - { - if (0 < \strlen($sLogin)) - { - $oConfig->Set('security', 'admin_login', $sLogin); - } - - if (0 < \strlen(\trim($sNewPassword))) - { - $oConfig->SetPassword($sNewPassword); - } - - $bResult = true; - } - - return $this->DefaultResponse(__FUNCTION__, $bResult ? - ($oConfig->Save() ? array('Weak' => $oConfig->ValidatePassword('12345')) : false) : false); - } - - /** - * @return array - */ - public function DoAdminDomainLoad() - { - $this->IsAdminLoggined(); - - return $this->DefaultResponse(__FUNCTION__, - $this->DomainProvider()->Load($this->GetActionParam('Name', ''), false, false)); - } - - /** - * @return array - */ - public function DoAdminDomainList() - { - $this->IsAdminLoggined(); - - $iOffset = (int) $this->GetActionParam('Offset', 0); - $iLimit = (int) $this->GetActionParam('Limit', 20); - $sSearch = (string) $this->GetActionParam('Search', ''); - $bIncludeAliases = '1' === (string) $this->GetActionParam('IncludeAliases', '1'); - - $iOffset = 0; - $sSearch = ''; - $iLimit = $this->Config()->Get('labs', 'domain_list_limit', 99); - - return $this->DefaultResponse(__FUNCTION__, - $this->DomainProvider()->GetList($iOffset, $iLimit, $sSearch, $bIncludeAliases)); - } - - /** - * @return array - */ - public function DoAdminDomainDelete() - { - $this->IsAdminLoggined(); - - return $this->DefaultResponse(__FUNCTION__, - $this->DomainProvider()->Delete((string) $this->GetActionParam('Name', ''))); - } - - /** - * @return array - */ - public function DoAdminDomainDisable() - { - $this->IsAdminLoggined(); - - return $this->DefaultResponse(__FUNCTION__, $this->DomainProvider()->Disable( - (string) $this->GetActionParam('Name', ''), - '1' === (string) $this->GetActionParam('Disabled', '0') - )); - } - - /** - * @return array - */ - public function DoAdminDomainSave() - { - $this->IsAdminLoggined(); - - $oDomain = $this->DomainProvider()->LoadOrCreateNewFromAction($this); - - return $this->DefaultResponse(__FUNCTION__, - $oDomain instanceof \RainLoop\Model\Domain ? $this->DomainProvider()->Save($oDomain) : false); - } - - /** - * @return array - */ - public function DoAdminDomainAliasSave() - { - $this->IsAdminLoggined(); - - return $this->DefaultResponse(__FUNCTION__, $this->DomainProvider()->SaveAlias( - (string) $this->GetActionParam('Name', ''), - (string) $this->GetActionParam('Alias', '') - )); - } - - /** - * @return array - */ - public function DoAdminDomainTest() - { - $this->IsAdminLoggined(); - - $bImapResult = false; - $sImapErrorDesc = ''; - $bSmtpResult = false; - $sSmtpErrorDesc = ''; - $bSieveResult = false; - $sSieveErrorDesc = ''; - - $iImapTime = 0; - $iSmtpTime = 0; - $iSieveTime = 0; - - $iConnectionTimeout = 5; - - $oDomain = $this->DomainProvider()->LoadOrCreateNewFromAction($this, 'domain-test-connection.de'); - if ($oDomain) - { - try - { - $oImapClient = \MailSo\Imap\ImapClient::NewInstance()->SetLogger($this->Logger()); - $oImapClient->SetTimeOuts($iConnectionTimeout); - - $iTime = \microtime(true); - $oImapClient->Connect($oDomain->IncHost(), $oDomain->IncPort(), $oDomain->IncSecure(), - !!$this->Config()->Get('ssl', 'verify_certificate', false), - !!$this->Config()->Get('ssl', 'allow_self_signed', true) - ); - - $iImapTime = \microtime(true) - $iTime; - $oImapClient->Disconnect(); - $bImapResult = true; - } - catch (\MailSo\Net\Exceptions\SocketCanNotConnectToHostException $oException) - { - $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); - $sImapErrorDesc = $oException->getSocketMessage(); - if (empty($sImapErrorDesc)) - { - $sImapErrorDesc = $oException->getMessage(); - } - } - catch (\Exception $oException) - { - $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); - $sImapErrorDesc = $oException->getMessage(); - } - - if ($oDomain->OutUsePhpMail()) - { - $bSmtpResult = \MailSo\Base\Utils::FunctionExistsAndEnabled('mail'); - if (!$bSmtpResult) - { - $sSmtpErrorDesc = 'PHP: mail() function is undefined'; - } - } - else - { - try - { - $oSmtpClient = \MailSo\Smtp\SmtpClient::NewInstance()->SetLogger($this->Logger()); - $oSmtpClient->SetTimeOuts($iConnectionTimeout); - - $iTime = \microtime(true); - $oSmtpClient->Connect($oDomain->OutHost(), $oDomain->OutPort(), - \MailSo\Smtp\SmtpClient::EhloHelper(), $oDomain->OutSecure(), - !!$this->Config()->Get('ssl', 'verify_certificate', false), - !!$this->Config()->Get('ssl', 'allow_self_signed', true) - ); - - $iSmtpTime = \microtime(true) - $iTime; - $oSmtpClient->Disconnect(); - $bSmtpResult = true; - } - catch (\MailSo\Net\Exceptions\SocketCanNotConnectToHostException $oException) - { - $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); - $sSmtpErrorDesc = $oException->getSocketMessage(); - if (empty($sSmtpErrorDesc)) - { - $sSmtpErrorDesc = $oException->getMessage(); - } - } - catch (\Exception $oException) - { - $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); - $sSmtpErrorDesc = $oException->getMessage(); - } - } - - if ($oDomain->UseSieve()) - { - try - { - $oSieveClient = \MailSo\Sieve\ManageSieveClient::NewInstance()->SetLogger($this->Logger()); - $oSieveClient->SetTimeOuts($iConnectionTimeout); - $oSieveClient->__USE_INITIAL_AUTH_PLAIN_COMMAND = !!$this->Config()->Get('labs', 'sieve_auth_plain_initial', true); - - $iTime = \microtime(true); - $oSieveClient->Connect($oDomain->SieveHost(), $oDomain->SievePort(), $oDomain->SieveSecure(), - !!$this->Config()->Get('ssl', 'verify_certificate', false), - !!$this->Config()->Get('ssl', 'allow_self_signed', true) - ); - - $iSieveTime = \microtime(true) - $iTime; - $oSieveClient->Disconnect(); - $bSieveResult = true; - } - catch (\MailSo\Net\Exceptions\SocketCanNotConnectToHostException $oException) - { - $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); - $sSieveErrorDesc = $oException->getSocketMessage(); - if (empty($sSieveErrorDesc)) - { - $sSieveErrorDesc = $oException->getMessage(); - } - } - catch (\Exception $oException) - { - $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); - $sSieveErrorDesc = $oException->getMessage(); - } - } - else - { - $bSieveResult = true; - } - } - - return $this->DefaultResponse(__FUNCTION__, array( - 'Imap' => $bImapResult ? true : $sImapErrorDesc, - 'Smtp' => $bSmtpResult ? true : $sSmtpErrorDesc, - 'Sieve' => $bSieveResult ? true : $sSieveErrorDesc - )); - } - - /** - * @return string - */ - private function rainLoopRepo() - { - $sUrl = APP_REPOSITORY_PATH; - if ('' !== $sUrl) - { - $sUrl = rtrim($sUrl, '\\/').'/'; - } - - return $sUrl; - } - - private function rainLoopUpdatable() - { - return @file_exists(APP_INDEX_ROOT_PATH.'index.php') && - @is_writable(APP_INDEX_ROOT_PATH.'index.php') && - @is_writable(APP_INDEX_ROOT_PATH.'rainloop/') && - APP_VERSION !== APP_DEV_VERSION - ; - } - - private function rainLoopCoreAccess() - { - $sCoreAccess = \strtolower(\preg_replace('/[\s,;]+/', ' ', - $this->Config()->Get('security', 'core_install_access_domain', ''))); - - return '' === $sCoreAccess || '*' === $sCoreAccess || APP_SITE === $sCoreAccess; - } - - /** - * @param string $sRepo - * @param bool $bReal = false - * - * @return array - */ - private function getRepositoryDataByUrl($sRepo, &$bReal = false) - { - $bReal = false; - $aRep = null; - - $sRep = ''; - $sRepoFile = 'repository.json'; - $iRepTime = 0; - - $oHttp = \MailSo\Base\Http::SingletonInstance(); - - $sCacheKey = \RainLoop\KeyPathHelper::RepositoryCacheFile($sRepo, $sRepoFile); - $sRep = $this->Cacher()->Get($sCacheKey); - if ('' !== $sRep) - { - $iRepTime = $this->Cacher()->GetTimer($sCacheKey); - } - - if ('' === $sRep || 0 === $iRepTime || time() - 3600 > $iRepTime) - { - $iCode = 0; - $sContentType = ''; - - $sRepPath = $sRepo.$sRepoFile; - $sRep = '' !== $sRepo ? $oHttp->GetUrlAsString($sRepPath, 'RainLoop', $sContentType, $iCode, $this->Logger(), 10, - $this->Config()->Get('labs', 'curl_proxy', ''), $this->Config()->Get('labs', 'curl_proxy_auth', '')) : false; - - if (false !== $sRep) - { - $aRep = @\json_decode($sRep); - $bReal = \is_array($aRep) && 0 < \count($aRep); - - if ($bReal) - { - $this->Cacher()->Set($sCacheKey, $sRep); - $this->Cacher()->SetTimer($sCacheKey); - } - } - else - { - $this->Logger()->Write('Cannot read remote repository file: '.$sRepPath, \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER'); - } - } - else if ('' !== $sRep) - { - $aRep = @\json_decode($sRep, false, 10); - $bReal = \is_array($aRep) && 0 < \count($aRep); - } - - $aResult = array(); - if (\is_array($aRep)) - { - foreach ($aRep as $oItem) - { - if ($oItem && isset($oItem->type, $oItem->id, $oItem->name, - $oItem->version, $oItem->release, $oItem->file, $oItem->description)) - { - if (!empty($oItem->required) && APP_DEV_VERSION !== APP_VERSION && version_compare(APP_VERSION, $oItem->required, '<')) - { - continue; - } - - if (!empty($oItem->depricated) && APP_DEV_VERSION !== APP_VERSION && version_compare(APP_VERSION, $oItem->depricated, '>=')) - { - continue; - } - - if ('plugin' === $oItem->type) - { - $aResult[] = array( - 'type' => $oItem->type, - 'id' => $oItem->id, - 'name' => $oItem->name, - 'installed' => '', - 'version' => $oItem->version, - 'file' => $oItem->file, - 'release' => $oItem->release, - 'desc' => $oItem->description - ); - } - } - } - } - - return $aResult; - } - - /** - * @return string - */ - private function getCoreChannel() - { - $sChannel = \trim(\strtolower($this->Config()->Get('labs', 'update_channel', 'stable'))); - if (empty($sChannel) || !\in_array($sChannel, array('stable', 'beta'))) - { - $sChannel = 'stable'; - } - - return $sChannel; - } - - private function getCoreData(&$bReal) - { - $bReal = false; - - $sChannel = $this->getCoreChannel(); - - $sRepo = \str_replace('{{channel}}', $sChannel, APP_REPO_CORE_FILE); - - $oHttp = \MailSo\Base\Http::SingletonInstance(); - - $sCacheKey = \RainLoop\KeyPathHelper::RepositoryCacheCore($sRepo); - $sRep = $this->Cacher()->Get($sCacheKey); - if ('' !== $sRep) - { - $iRepTime = $this->Cacher()->GetTimer($sCacheKey); - } - - if ('' === $sRep || 0 === $iRepTime || time() - 3600 > $iRepTime) - { - $iCode = 0; - $sContentType = ''; - - $sRep = '' !== $sRepo ? $oHttp->GetUrlAsString($sRepo, 'RainLoop', $sContentType, $iCode, $this->Logger(), 10, - $this->Config()->Get('labs', 'curl_proxy', ''), $this->Config()->Get('labs', 'curl_proxy_auth', '')) : false; - - if (false !== $sRep) - { - $aRep = @\json_decode($sRep, true, 10); - $bReal = \is_array($aRep) && 0 < \count($aRep) && isset($aRep['id']) && 'rainloop' === $aRep['id']; - - if ($bReal) - { - $this->Cacher()->Set($sCacheKey, $sRep); - $this->Cacher()->SetTimer($sCacheKey); - } - } - else - { - $this->Logger()->Write('Cannot read remote repository file: '.$sRepo, \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER'); - } - } - else if ('' !== $sRep) - { - $aRep = @\json_decode($sRep, true, 10); - $bReal = \is_array($aRep) && 0 < \count($aRep) && isset($aRep['id']) && 'rainloop' === $aRep['id']; - } - - return $bReal ? $aRep : false; - } - - private function getRepositoryData(&$bReal, &$bRainLoopUpdatable) - { - $bRainLoopUpdatable = $this->rainLoopUpdatable(); - - $aResult = $this->getRepositoryDataByUrl($this->rainLoopRepo(), $bReal); - - $aSub = array(); - if (\is_array($aResult)) - { - foreach ($aResult as $aItem) - { - if ('plugin' === $aItem['type']) - { - $aSub[] = $aItem; - } - } - - $aResult = $aSub; - unset($aSub); - } - - $aInstalled = $this->Plugins()->InstalledPlugins(); - if (\is_array($aInstalled)) - { - foreach ($aResult as &$aItem) - { - if ('plugin' === $aItem['type']) - { - foreach ($aInstalled as &$aSubItem) - { - if (\is_array($aSubItem) && isset($aSubItem[0]) && $aSubItem[0] === $aItem['id']) - { - $aSubItem[2] = true; - $aItem['installed'] = $aSubItem[1]; - } - } - } - } - - foreach ($aInstalled as $aSubItemSec) - { - if ($aSubItemSec && !isset($aSubItemSec[2])) - { - \array_push($aResult, array( - 'type' => 'plugin', - 'id' => $aSubItemSec[0], - 'name' => $aSubItemSec[0], - 'installed' => $aSubItemSec[1], - 'version' => '', - 'file' => '', - 'release' => '', - 'desc' => '' - )); - } - } - } - - foreach ($aResult as &$aItem) - { - $aItem['compare'] = \version_compare($aItem['installed'], $aItem['version'], '<'); - $aItem['canBeDeleted'] = '' !== $aItem['installed'] && 'plugin' === $aItem['type']; - $aItem['canBeUpdated'] = $aItem['compare']; - $aItem['canBeInstalled'] = true; - } - - return $aResult; - } - - /** - * @return array - */ - public function DoAdminPackagesList() - { - $this->IsAdminLoggined(); - - $bReal = false; - $bRainLoopUpdatable = false; - $aList = $this->getRepositoryData($bReal, $bRainLoopUpdatable); - - return $this->DefaultResponse(__FUNCTION__, array( - 'Real' => $bReal, - 'MainUpdatable' => $bRainLoopUpdatable, - 'List' => $aList - )); - } - - /** - * @return array - */ - public function DoAdminCoreData() - { - $this->IsAdminLoggined(); - - $bReal = false; - $aData = array(); - - $bRainLoopUpdatable = $this->rainLoopUpdatable(); - $bRainLoopAccess = $this->rainLoopCoreAccess(); - - if ($bRainLoopAccess) - { - $aData = $this->getCoreData($bReal); - } - - $sVersion = empty($aData['version']) ? '' : $aData['version']; - $sType = empty($aData['channel']) ? 'stable' : $aData['channel']; - - $sWarnings = empty($aData['warnings']) ? '' : $aData['warnings']; - $aWarnings = $sWarnings ? explode('|', $sWarnings) : array(); - - $sCurrentVersion = APP_VERSION; - - $bShowWarning = false; - if ($sCurrentVersion !== APP_DEV_VERSION) - { - foreach ($aWarnings as $sWarningVersion) - { - $sWarningVersion = \trim($sWarningVersion); - - if (\version_compare($sCurrentVersion, $sWarningVersion, '<') && - \version_compare($sVersion, $sWarningVersion, '>=')) - { - $bShowWarning = true; - break; - } - } - } - - return $this->DefaultResponse(__FUNCTION__, array( - 'Real' => $bReal, - 'Access' => $bRainLoopAccess, - 'Updatable' => $bRainLoopUpdatable, - 'Warning' => $bShowWarning, - 'Channel' => $this->getCoreChannel(), - 'Type' => $sType, - 'Version' => $sCurrentVersion, - 'RemoteVersion' => $sVersion, - 'RemoteRelease' => empty($aData['release']) ? '' : $aData['release'], - 'VersionCompare' => \version_compare($sCurrentVersion, $sVersion) - )); - } - - /** - * @return array - */ - public function DoAdminUpdateCoreData() - { - $this->IsAdminLoggined(); - - $bReal = false; - - $bRainLoopUpdatable = $this->rainLoopUpdatable(); - $bRainLoopAccess = $this->rainLoopCoreAccess(); - $oPremProvider = $this->PremProvider(); - - $aData = array(); - if ($bRainLoopUpdatable && $bRainLoopAccess) - { - $aData = $this->getCoreData($bReal); - } - - $bResult = false; - if ($bReal && $oPremProvider && !empty($aData['file'])) - { - $bResult = $oPremProvider->UpdateCore($this, $aData['file']); - } - - return $this->DefaultResponse(__FUNCTION__, $bResult); - } - - /** - * @return array - */ - public function DoAdminPackageDelete() - { - $this->IsAdminLoggined(); - - $sId = $this->GetActionParam('Id', ''); - - $bReal = false; - $bRainLoopUpdatable = false; - $aList = $this->getRepositoryData($bReal, $bRainLoopUpdatable); - - $sResultId = ''; - foreach ($aList as $oItem) - { - if ($oItem && 'plugin' === $oItem['type'] && $sId === $oItem['id']) - { - $sResultId = $sId; - break; - } - } - - $bResult = false; - if ('' !== $sResultId) - { - $bResult = \MailSo\Base\Utils::RecRmDir(APP_PLUGINS_PATH.$sResultId); - if ($bResult) - { - $this->pluginEnable($sResultId, false); - } - } - - return $this->DefaultResponse(__FUNCTION__, $bResult); - } - - /** - * @param string $sUrl - * - * @return string - */ - public function downloadRemotePackageByUrl($sUrl) - { - $bResult = false; - $sTmp = APP_PRIVATE_DATA.\md5(\microtime(true).$sUrl).'.zip'; - $pDest = @\fopen($sTmp, 'w+b'); - if ($pDest) - { - $iCode = 0; - $sContentType = ''; - - @\set_time_limit(120); - - $oHttp = \MailSo\Base\Http::SingletonInstance(); - $bResult = $oHttp->SaveUrlToFile($sUrl, $pDest, $sTmp, $sContentType, $iCode, $this->Logger(), 60, - $this->Config()->Get('labs', 'curl_proxy', ''), $this->Config()->Get('labs', 'curl_proxy_auth', '')); - - if (!$bResult) - { - $this->Logger()->Write('Cannot save url to temp file: ', \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER'); - $this->Logger()->Write($sUrl.' -> '.$sTmp, \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER'); - } - - @\fclose($pDest); - } - else - { - $this->Logger()->Write('Cannot create temp file: '.$sTmp, \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER'); - } - - return $bResult ? $sTmp : ''; - } - - /** - * @return array - */ - public function DoAdminPackageInstall() - { - $this->IsAdminLoggined(); - - $sType = $this->GetActionParam('Type', ''); - $sId = $this->GetActionParam('Id', ''); - $sFile = $this->GetActionParam('File', ''); - - $this->Logger()->Write('Start package install: '.$sFile.' ('.$sType.')', \MailSo\Log\Enumerations\Type::INFO, 'INSTALLER'); - - $sRealFile = ''; - - $bReal = false; - $bRainLoopUpdatable = false; - $aList = $this->getRepositoryData($bReal, $bRainLoopUpdatable); - - if ('plugin' === $sType) - { - foreach ($aList as $oItem) - { - if ($oItem && $sFile === $oItem['file'] && $sId === $oItem['id']) - { - $sRealFile = $sFile; - break; - } - } - } - - $sTmp = ''; - $bResult = false; - if ('' !== $sRealFile) - { - $sUrl = $this->rainLoopRepo().$sRealFile; - $sTmp = $this->downloadRemotePackageByUrl($sUrl); - } - - if ('' !== $sTmp) - { - include_once APP_VERSION_ROOT_PATH.'app/libraries/pclzip/pclzip.lib.php'; - - $oArchive = new \PclZip($sTmp); - if ('plugin' === $sType) - { - $bResult = true; - if (\is_dir(APP_PLUGINS_PATH.$sId)) - { - $bResult = \MailSo\Base\Utils::RecRmDir(APP_PLUGINS_PATH.$sId); - if (!$bResult) - { - $this->Logger()->Write('Cannot remove previous plugin folder: '.$sId, \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER'); - } - } - - if ($bResult) - { - $bResult = 0 !== $oArchive->extract(PCLZIP_OPT_PATH, APP_PLUGINS_PATH); - if (!$bResult) - { - $this->Logger()->Write('Cannot extract package files: '.$oArchive->errorInfo(), \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER'); - } - } - } - - @\unlink($sTmp); - } - - return $this->DefaultResponse(__FUNCTION__, $bResult ? - ('plugin' !== $sType ? array('Reload' => true) : true) : false); - } - - /** - * @return array - */ - public function DoAdminPluginList() - { - $this->IsAdminLoggined(); - - $aResult = array(); - - $sEnabledPlugins = $this->Config()->Get('plugins', 'enabled_list', ''); - $aEnabledPlugins = \explode(',', \strtolower($sEnabledPlugins)); - $aEnabledPlugins = \array_map('trim', $aEnabledPlugins); - - $aList = $this->Plugins()->InstalledPlugins(); - foreach ($aList as $aItem) - { - $aResult[] = array( - 'Name' => $aItem[0], - 'Enabled' => \in_array(\strtolower($aItem[0]), $aEnabledPlugins), - 'Configured' => false - ); - } - - return $this->DefaultResponse(__FUNCTION__, $aResult); - } - - /** - * @param string $sName - * @param bool $bEnable = true - * @return bool - */ - private function pluginEnable($sName, $bEnable = true) - { - if (0 === \strlen($sName)) - { - return false; - } - - $oConfig = $this->Config(); - - $sEnabledPlugins = $oConfig->Get('plugins', 'enabled_list', ''); - $aEnabledPlugins = \explode(',', \strtolower($sEnabledPlugins)); - $aEnabledPlugins = \array_map('trim', $aEnabledPlugins); - - $aNewEnabledPlugins = array(); - if ($bEnable) - { - $aNewEnabledPlugins = $aEnabledPlugins; - $aNewEnabledPlugins[] = $sName; - } - else - { - foreach ($aEnabledPlugins as $sPlugin) - { - if ($sName !== $sPlugin && 0 < \strlen($sPlugin)) - { - $aNewEnabledPlugins[] = $sPlugin; - } - } - } - - $aNewEnabledPlugins = \array_unique($aNewEnabledPlugins); - $oConfig->Set('plugins', 'enabled_list', \trim(\implode(',', $aNewEnabledPlugins), ' ,')); - - return $oConfig->Save(); - } - - /** - * @return array - */ - public function DoAdminPluginDisable() - { - $this->IsAdminLoggined(); - - $sName = (string) $this->GetActionParam('Name', ''); - $bDisable = '1' === (string) $this->GetActionParam('Disabled', '1'); - - if (!$bDisable) - { - $oPlugin = $this->Plugins()->CreatePluginByName($sName); - if ($oPlugin && ($oPlugin instanceof \RainLoop\Plugins\AbstractPlugin)) - { - $sValue = $oPlugin->Supported(); - if (0 < \strlen($sValue)) - { - return $this->FalseResponse(__FUNCTION__, \RainLoop\Notifications::UnsupportedPluginPackage, $sValue); - } - } - else - { - return $this->FalseResponse(__FUNCTION__, \RainLoop\Notifications::InvalidPluginPackage); - } - } - - return $this->DefaultResponse(__FUNCTION__, $this->pluginEnable($sName, !$bDisable)); - } - - /** - * @return array - */ - public function DoAdminPluginLoad() - { - $this->IsAdminLoggined(); - - $mResult = false; - $sName = (string) $this->GetActionParam('Name', ''); - - if (!empty($sName)) - { - $oPlugin = $this->Plugins()->CreatePluginByName($sName); - if ($oPlugin) - { - $mResult = array( - 'Name' => $sName, - 'Readme' => file_exists($oPlugin->Path().'/README') ? file_get_contents($oPlugin->Path().'/README') : '', - 'Config' => array() - ); - - $aMap = $oPlugin->ConfigMap(); - $oConfig = $oPlugin->Config(); - if (is_array($aMap) && 0 < count($aMap)) - { - foreach ($aMap as $oItem) - { - if ($oItem && ($oItem instanceof \RainLoop\Plugins\Property)) - { - $aItem = $oItem->ToArray(); - $aItem[0] = $oConfig->Get('plugin', $oItem->Name(), ''); - if (\RainLoop\Enumerations\PluginPropertyType::PASSWORD === $oItem->Type()) - { - $aItem[0] = APP_DUMMY; - } - - $mResult['Config'][] = $aItem; - } - } - } - } - } - - return $this->DefaultResponse(__FUNCTION__, $mResult); - } - - /** - * @return array - */ - public function DoAdminPluginSettingsUpdate() - { - $this->IsAdminLoggined(); - - $mResult = false; - $sName = (string) $this->GetActionParam('Name', ''); - - if (!empty($sName)) - { - $oPlugin = $this->Plugins()->CreatePluginByName($sName); - if ($oPlugin) - { - $oConfig = $oPlugin->Config(); - $aMap = $oPlugin->ConfigMap(); - if (is_array($aMap) && 0 < count($aMap)) - { - foreach ($aMap as $oItem) - { - $sValue = $this->GetActionParam('_'.$oItem->Name(), $oConfig->Get('plugin', $oItem->Name())); - if (\RainLoop\Enumerations\PluginPropertyType::PASSWORD !== $oItem->Type() || APP_DUMMY !== $sValue) - { - $mResultValue = null; - switch ($oItem->Type()) { - case \RainLoop\Enumerations\PluginPropertyType::INT: - $mResultValue = (int) $sValue; - break; - case \RainLoop\Enumerations\PluginPropertyType::BOOL: - $mResultValue = '1' === (string) $sValue; - break; - case \RainLoop\Enumerations\PluginPropertyType::SELECTION: - if (is_array($oItem->DefaultValue()) && in_array($sValue, $oItem->DefaultValue())) - { - $mResultValue = (string) $sValue; - } - break; - case \RainLoop\Enumerations\PluginPropertyType::PASSWORD: - case \RainLoop\Enumerations\PluginPropertyType::STRING: - case \RainLoop\Enumerations\PluginPropertyType::STRING_TEXT: - $mResultValue = (string) $sValue; - break; - } - - if (null !== $mResultValue) - { - $oConfig->Set('plugin', $oItem->Name(), $mResultValue); - } - } - } - } - - $mResult = $oConfig->Save(); - } - } - - if (!$mResult) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSavePluginSettings); - } - - return $this->DefaultResponse(__FUNCTION__, true); - } - - /** - * @return array - */ - public function DoSettingsUpdate() - { - $oAccount = $this->getAccountFromToken(); - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::SETTINGS, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $self = $this; - $oConfig = $this->Config(); - - $oSettings = $this->SettingsProvider()->Load($oAccount); - $oSettingsLocal = $this->SettingsProvider(true)->Load($oAccount); - - if ($oConfig->Get('webmail', 'allow_languages_on_settings', true)) - { - $this->setSettingsFromParams($oSettings, 'Language', 'string', function ($sLanguage) use ($self) { - return $self->ValidateLanguage($sLanguage); - }); - } - else - { - $oSettings->SetConf('Language', $this->ValidateLanguage($oConfig->Get('webmail', 'language', 'en'))); - } - - if ($this->GetCapa(false, false, \RainLoop\Enumerations\Capa::THEMES, $oAccount)) - { - $this->setSettingsFromParams($oSettingsLocal, 'Theme', 'string', function ($sTheme) use ($self) { - return $self->ValidateTheme($sTheme); - }); - } - else - { - $oSettingsLocal->SetConf('Theme', $this->ValidateTheme($oConfig->Get('webmail', 'theme', 'Default'))); - } - - $this->setSettingsFromParams($oSettings, 'MPP', 'int', function ($iValue) { - return (int) (\in_array($iValue, array(10, 20, 30, 50, 100, 150, 200, 300)) ? $iValue : 20); - }); - - $this->setSettingsFromParams($oSettings, 'Layout', 'int', function ($iValue) { - return (int) (\in_array((int) $iValue, array(\RainLoop\Enumerations\Layout::NO_PREVIW, - \RainLoop\Enumerations\Layout::SIDE_PREVIEW, \RainLoop\Enumerations\Layout::BOTTOM_PREVIEW)) ? - $iValue : \RainLoop\Enumerations\Layout::SIDE_PREVIEW); - }); - - $this->setSettingsFromParams($oSettings, 'EditorDefaultType', 'string'); - $this->setSettingsFromParams($oSettings, 'ShowImages', 'bool'); - $this->setSettingsFromParams($oSettings, 'ContactsAutosave', 'bool'); - $this->setSettingsFromParams($oSettings, 'DesktopNotifications', 'bool'); - $this->setSettingsFromParams($oSettings, 'SoundNotification', 'bool'); - $this->setSettingsFromParams($oSettings, 'UseCheckboxesInList', 'bool'); - $this->setSettingsFromParams($oSettings, 'AllowDraftAutosave', 'bool'); - $this->setSettingsFromParams($oSettings, 'AutoLogout', 'int'); - - $this->setSettingsFromParams($oSettings, 'EnableTwoFactor', 'bool'); - - $this->setSettingsFromParams($oSettingsLocal, 'UseThreads', 'bool'); - $this->setSettingsFromParams($oSettingsLocal, 'ReplySameFolder', 'bool'); - - return $this->DefaultResponse(__FUNCTION__, - $this->SettingsProvider()->Save($oAccount, $oSettings) && - $this->SettingsProvider(true)->Save($oAccount, $oSettingsLocal)); - } - - /** - * @return array - */ - public function DoNoop() - { - $this->initMailClientConnection(); - return $this->TrueResponse(__FUNCTION__); - } - - /** - * @return array - */ - public function DoPing() - { - return $this->DefaultResponse(__FUNCTION__, 'Pong'); - } - - /** - * @return array - */ - public function DoChangePassword() - { - $mResult = false; - - $oAccount = $this->getAccountFromToken(); - if ($oAccount) - { - try - { - $mResult = $this->ChangePasswordProvider()->ChangePassword( - $oAccount, - $this->GetActionParam('PrevPassword', ''), - $this->GetActionParam('NewPassword', '') - ); - } - catch (\Exception $oException) - { - $this->loginErrorDelay(); - $this->Logger()->Write('Error: Can\'t change password for '.$oAccount->Email().' account.', \MailSo\Log\Enumerations\Type::NOTICE); - - throw $oException; - } - } - - return $this->DefaultResponse(__FUNCTION__, $mResult); - } - - /** - * @return array - */ - public function DoJsInfo() - { - $bIsError = '1' === (string) $this->GetActionParam('IsError', '0'); - $mData = $this->GetActionParam('Data', null); - - $this->Logger()->WriteDump(is_array($mData) ? $mData : array(), - $bIsError ? \MailSo\Log\Enumerations\Type::ERROR : \MailSo\Log\Enumerations\Type::INFO, 'JS-INFO'); - - return $this->DefaultResponse(__FUNCTION__, true); - } - - /** - * @return array - */ - public function DoWelcomeClose() - { - $oAccount = $this->getAccountFromToken(); - if ($oAccount && !$oAccount->IsAdditionalAccount()) - { - $oSettings = $this->SettingsProvider()->Load($oAccount); - $oSettings->SetConf('LastWelcomePage', - $this->Config()->Get('branding', 'welcome_page_url', '')); - - return $this->DefaultResponse(__FUNCTION__, - $this->SettingsProvider()->Save($oAccount, $oSettings)); - } - - return $this->FalseResponse(__FUNCTION__); - } - - /** - * @return array - */ - public function DoVersion() - { - return $this->DefaultResponse(__FUNCTION__, - APP_VERSION === (string) $this->GetActionParam('Version', '')); - } - - /** - * @return array - */ - public function DoJsError() - { - $sMessage = $this->GetActionParam('Message', ''); - if (0 < strlen($sMessage)) - { - $sFileName = $this->GetActionParam('FileName', ''); - $sLineNo = $this->GetActionParam('LineNo', ''); - $sLocation = $this->GetActionParam('Location', ''); - $sHtmlCapa = $this->GetActionParam('HtmlCapa', ''); - $sTimeOnPage = $this->GetActionParam('TimeOnPage', ''); - - $oHttp = $this->Http(); - - $this->Logger()->Write($sMessage.' ('.$sFileName.' ~ '.$sLineNo.')', \MailSo\Log\Enumerations\Type::ERROR, 'JS'); - $this->Logger()->WriteDump(array( - 'Location' => $sLocation, - 'Capability' => $sHtmlCapa, - 'TimeOnPage' => $sTimeOnPage, - 'HTTP_USER_AGENT' => $oHttp->GetServer('HTTP_USER_AGENT', ''), - 'HTTP_ACCEPT_ENCODING' => $oHttp->GetServer('HTTP_ACCEPT_ENCODING', ''), - 'HTTP_ACCEPT_LANGUAGE' => $oHttp->GetServer('HTTP_ACCEPT_LANGUAGE', '') - )); - } - - return $this->DefaultResponse(__FUNCTION__, true); - } - - /** - * @param \MailSo\Mail\FolderCollection $oFolders - * @return array - */ - private function recFoldersNames($oFolders) - { - $aResult = array(); - if ($oFolders) - { - $aFolders =& $oFolders->GetAsArray(); - - foreach ($aFolders as $oFolder) - { - $aResult[] = $oFolder->FullNameRaw()."|". - implode("|", $oFolder->Flags()).($oFolder->IsSubscribed() ? '1' : '0'); - - $oSub = $oFolder->SubFolders(); - if ($oSub && 0 < $oSub->Count()) - { - $aResult = \array_merge($aResult, $this->recFoldersNames($oSub)); - } - } - } - - return $aResult; - } - - /** - * @staticvar array $aCache - * @param \RainLoop\Model\Account $oAccount - * - * @return array - */ - private function systemFoldersNames($oAccount) - { - static $aCache = null; - if (null === $aCache) - { - $aCache = array( - - 'Sent' => \MailSo\Imap\Enumerations\FolderType::SENT, - 'Send' => \MailSo\Imap\Enumerations\FolderType::SENT, - - 'Outbox' => \MailSo\Imap\Enumerations\FolderType::SENT, - 'Out box' => \MailSo\Imap\Enumerations\FolderType::SENT, - - 'Sent Item' => \MailSo\Imap\Enumerations\FolderType::SENT, - 'Sent Items' => \MailSo\Imap\Enumerations\FolderType::SENT, - 'Send Item' => \MailSo\Imap\Enumerations\FolderType::SENT, - 'Send Items' => \MailSo\Imap\Enumerations\FolderType::SENT, - 'Sent Mail' => \MailSo\Imap\Enumerations\FolderType::SENT, - 'Sent Mails' => \MailSo\Imap\Enumerations\FolderType::SENT, - 'Send Mail' => \MailSo\Imap\Enumerations\FolderType::SENT, - 'Send Mails' => \MailSo\Imap\Enumerations\FolderType::SENT, - - 'Drafts' => \MailSo\Imap\Enumerations\FolderType::DRAFTS, - - 'Draft' => \MailSo\Imap\Enumerations\FolderType::DRAFTS, - 'Draft Mail' => \MailSo\Imap\Enumerations\FolderType::DRAFTS, - 'Draft Mails' => \MailSo\Imap\Enumerations\FolderType::DRAFTS, - 'Drafts Mail' => \MailSo\Imap\Enumerations\FolderType::DRAFTS, - 'Drafts Mails' => \MailSo\Imap\Enumerations\FolderType::DRAFTS, - - 'Junk E-mail' => \MailSo\Imap\Enumerations\FolderType::JUNK, - - 'Spam' => \MailSo\Imap\Enumerations\FolderType::JUNK, - 'Spams' => \MailSo\Imap\Enumerations\FolderType::JUNK, - - 'Junk' => \MailSo\Imap\Enumerations\FolderType::JUNK, - 'Bulk Mail' => \MailSo\Imap\Enumerations\FolderType::JUNK, - 'Bulk Mails' => \MailSo\Imap\Enumerations\FolderType::JUNK, - - 'Deleted Items' => \MailSo\Imap\Enumerations\FolderType::TRASH, - - 'Trash' => \MailSo\Imap\Enumerations\FolderType::TRASH, - 'Deleted' => \MailSo\Imap\Enumerations\FolderType::TRASH, - 'Bin' => \MailSo\Imap\Enumerations\FolderType::TRASH, - - 'Archive' => \MailSo\Imap\Enumerations\FolderType::ALL, - 'Archives' => \MailSo\Imap\Enumerations\FolderType::ALL, - - 'All' => \MailSo\Imap\Enumerations\FolderType::ALL, - 'All Mail' => \MailSo\Imap\Enumerations\FolderType::ALL, - 'All Mails' => \MailSo\Imap\Enumerations\FolderType::ALL, - ); - - $aNewCache = array(); - foreach ($aCache as $sKey => $iType) - { - $aNewCache[$sKey] = $iType; - $aNewCache[\str_replace(' ', '', $sKey)] = $iType; - } - - $aCache = $aNewCache; - - $this->Plugins()->RunHook('filter.system-folders-names', array($oAccount, &$aCache)); - } - - return $aCache; - } - - /** - * @param \RainLoop\Model\Account $oAccount - * @param \MailSo\Mail\FolderCollection $oFolders - * @param array $aResult - * @param bool $bListFolderTypes = true - */ - private function recFoldersTypes($oAccount, $oFolders, &$aResult, $bListFolderTypes = true) - { - if ($oFolders) - { - $aFolders =& $oFolders->GetAsArray(); - if (\is_array($aFolders) && 0 < \count($aFolders)) - { - if ($bListFolderTypes) - { - foreach ($aFolders as $oFolder) - { - $iFolderListType = $oFolder->GetFolderListType(); - if (!isset($aResult[$iFolderListType]) && \in_array($iFolderListType, array( - \MailSo\Imap\Enumerations\FolderType::SENT, - \MailSo\Imap\Enumerations\FolderType::DRAFTS, - \MailSo\Imap\Enumerations\FolderType::JUNK, - \MailSo\Imap\Enumerations\FolderType::TRASH, - \MailSo\Imap\Enumerations\FolderType::ALL - ))) - { - $aResult[$iFolderListType] = $oFolder->FullNameRaw(); - } - } - - foreach ($aFolders as $oFolder) - { - $oSub = $oFolder->SubFolders(); - if ($oSub && 0 < $oSub->Count()) - { - $this->recFoldersTypes($oAccount, $oSub, $aResult, true); - } - } - } - - $aMap = $this->systemFoldersNames($oAccount); - foreach ($aFolders as $oFolder) - { - $sName = $oFolder->Name(); - $sFullName = $oFolder->FullName(); - - if (isset($aMap[$sName]) || isset($aMap[$sFullName])) - { - $iFolderType = isset($aMap[$sName]) ? $aMap[$sName] : $aMap[$sFullName]; - if (!isset($aResult[$iFolderType]) && \in_array($iFolderType, array( - \MailSo\Imap\Enumerations\FolderType::SENT, - \MailSo\Imap\Enumerations\FolderType::DRAFTS, - \MailSo\Imap\Enumerations\FolderType::JUNK, - \MailSo\Imap\Enumerations\FolderType::TRASH, - \MailSo\Imap\Enumerations\FolderType::ALL - ))) - { - $aResult[$iFolderType] = $oFolder->FullNameRaw(); - } - } - } - - foreach ($aFolders as $oFolder) - { - $oSub = $oFolder->SubFolders(); - if ($oSub && 0 < $oSub->Count()) - { - $this->recFoldersTypes($oAccount, $oSub, $aResult, false); - } - } - } - } - } - - /** - * @return array - */ - public function DoFolders() - { - $oAccount = $this->initMailClientConnection(); - - $oFolderCollection = null; - $this->Plugins()->RunHook('filter.folders-before', array($oAccount, &$oFolderCollection)); - - $bUseFolders = $this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FOLDERS, $oAccount); - - if (null === $oFolderCollection) - { - $oFolderCollection = $this->MailClient()->Folders('', - $bUseFolders ? '*' : 'INBOX', - !!$this->Config()->Get('labs', 'use_imap_list_subscribe', true), - (int) $this->Config()->Get('labs', 'imap_folder_list_limit', 200) - ); - } - - $this->Plugins()->RunHook('filter.folders-post', array($oAccount, &$oFolderCollection)); - - if ($oFolderCollection instanceof \MailSo\Mail\FolderCollection) - { - $oSettingsLocal = $this->SettingsProvider(true)->Load($oAccount); - - $aSystemFolders = array(); - $this->recFoldersTypes($oAccount, $oFolderCollection, $aSystemFolders); - $oFolderCollection->SystemFolders = $aSystemFolders; - - if ($bUseFolders && $this->Config()->Get('labs', 'autocreate_system_folders', true)) - { - $bDoItAgain = false; - - $sNamespace = $oFolderCollection->GetNamespace(); - $sParent = empty($sNamespace) ? '' : \substr($sNamespace, 0, -1); - - $sDelimiter = $oFolderCollection->FindDelimiter(); - - $aList = array(); - $aMap = $this->systemFoldersNames($oAccount); - - if ('' === $oSettingsLocal->GetConf('SentFolder', '')) - { - $aList[] = \MailSo\Imap\Enumerations\FolderType::SENT; - } - - if ('' === $oSettingsLocal->GetConf('DraftFolder', '')) - { - $aList[] = \MailSo\Imap\Enumerations\FolderType::DRAFTS; - } - - if ('' === $oSettingsLocal->GetConf('SpamFolder', '')) - { - $aList[] = \MailSo\Imap\Enumerations\FolderType::JUNK; - } - - if ('' === $oSettingsLocal->GetConf('TrashFolder', '')) - { - $aList[] = \MailSo\Imap\Enumerations\FolderType::TRASH; - } - - if ('' === $oSettingsLocal->GetConf('ArchiveFolder', '')) - { - $aList[] = \MailSo\Imap\Enumerations\FolderType::ALL; - } - - $this->Plugins()->RunHook('filter.folders-system-types', array($oAccount, &$aList)); - - foreach ($aList as $iType) - { - if (!isset($aSystemFolders[$iType])) - { - $mFolderNameToCreate = \array_search($iType, $aMap); - if (!empty($mFolderNameToCreate)) - { - $iPos = \strrpos($mFolderNameToCreate, $sDelimiter); - if (false !== $iPos) - { - $mNewParent = \substr($mFolderNameToCreate, 0, $iPos); - $mNewFolderNameToCreate = \substr($mFolderNameToCreate, $iPos + 1); - if (0 < \strlen($mNewFolderNameToCreate)) - { - $mFolderNameToCreate = $mNewFolderNameToCreate; - } - - if (0 < \strlen($mNewParent)) - { - $sParent = 0 < \strlen($sParent) ? $sParent.$sDelimiter.$mNewParent : $mNewParent; - } - } - - $sFullNameToCheck = \MailSo\Base\Utils::ConvertEncoding($mFolderNameToCreate, - \MailSo\Base\Enumerations\Charset::UTF_8, \MailSo\Base\Enumerations\Charset::UTF_7_IMAP); - - if (0 < \strlen(\trim($sParent))) - { - $sFullNameToCheck = $sParent.$sDelimiter.$sFullNameToCheck; - } - - if (!$oFolderCollection->GetByFullNameRaw($sFullNameToCheck)) - { - try - { - if ($this->MailClient()->FolderCreate($mFolderNameToCreate, $sParent, true, $sDelimiter)) - { - $bDoItAgain = true; - } - } - catch (\Exception $oException) - { - $this->Logger()->WriteException($oException); - } - } - } - } - } - - if ($bDoItAgain) - { - $oFolderCollection = $this->MailClient()->Folders('', '*', - !!$this->Config()->Get('labs', 'use_imap_list_subscribe', true), - (int) $this->Config()->Get('labs', 'imap_folder_list_limit', 200) - ); - - if ($oFolderCollection) - { - $aSystemFolders = array(); - $this->recFoldersTypes($oAccount, $oFolderCollection, $aSystemFolders); - $oFolderCollection->SystemFolders = $aSystemFolders; - } - } - } - - if ($oFolderCollection) - { - $oFolderCollection->FoldersHash = \md5(\implode("\x0", $this->recFoldersNames($oFolderCollection))); - } - } - - $this->Plugins()->RunHook('filter.folders-complete', array($oAccount, &$oFolderCollection)); - - return $this->DefaultResponse(__FUNCTION__, $oFolderCollection); - } - - /** - * @return array - */ - public function DoFolderCreate() - { - $oAccount = $this->initMailClientConnection(); - - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FOLDERS, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - try - { - $sFolderNameInUtf = $this->GetActionParam('Folder', ''); - $sFolderParentFullNameRaw = $this->GetActionParam('Parent', ''); - - $this->MailClient()->FolderCreate($sFolderNameInUtf, $sFolderParentFullNameRaw, - !!$this->Config()->Get('labs', 'use_imap_list_subscribe', true)); - } - catch (\Exception $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantCreateFolder, $oException); - } - - return $this->TrueResponse(__FUNCTION__); - } - - /** - * @return array - */ - public function DoFolderSubscribe() - { - $oAccount = $this->initMailClientConnection(); - - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FOLDERS, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $sFolderFullNameRaw = $this->GetActionParam('Folder', ''); - $bSubscribe = '1' === (string) $this->GetActionParam('Subscribe', '0'); - - try - { - $this->MailClient()->FolderSubscribe($sFolderFullNameRaw, !!$bSubscribe); - } - catch (\Exception $oException) - { - if ($bSubscribe) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSubscribeFolder, $oException); - } - else - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantUnsubscribeFolder, $oException); - } - } - - return $this->TrueResponse(__FUNCTION__); - } - - /** - * @return array - */ - public function DoFolderCheckable() - { - $oAccount = $this->getAccountFromToken(); - - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FOLDERS, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $sFolderFullNameRaw = $this->GetActionParam('Folder', ''); - $bCheckable = '1' === (string) $this->GetActionParam('Checkable', '0'); - - $oSettingsLocal = $this->SettingsProvider(true)->Load($oAccount); - - $sCheckableFolder = $oSettingsLocal->GetConf('CheckableFolder', '[]'); - $aCheckableFolder = @\json_decode($sCheckableFolder); - - if (!\is_array($aCheckableFolder)) - { - $aCheckableFolder = array(); - } - - if ($bCheckable) - { - $aCheckableFolder[] = $sFolderFullNameRaw; - } - else - { - $aCheckableFolderNew = array(); - foreach ($aCheckableFolder as $sFolder) - { - if ($sFolder !== $sFolderFullNameRaw) - { - $aCheckableFolderNew[] = $sFolder; - } - } - $aCheckableFolder = $aCheckableFolderNew; - } - - $aCheckableFolder = \array_unique($aCheckableFolder); - - $oSettingsLocal->SetConf('CheckableFolder', @\json_encode($aCheckableFolder)); - - return $this->DefaultResponse(__FUNCTION__, - $this->SettingsProvider(true)->Save($oAccount, $oSettingsLocal)); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoFolderRename() - { - $oAccount = $this->initMailClientConnection(); - - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FOLDERS, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $sPrevFolderFullNameRaw = $this->GetActionParam('Folder', ''); - $sNewTopFolderNameInUtf = $this->GetActionParam('NewFolderName', ''); - - try - { - $this->MailClient()->FolderRename($sPrevFolderFullNameRaw, $sNewTopFolderNameInUtf, - !!$this->Config()->Get('labs', 'use_imap_list_subscribe', true)); - } - catch (\Exception $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantRenameFolder, $oException); - } - - return $this->TrueResponse(__FUNCTION__); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoFolderDelete() - { - $oAccount = $this->initMailClientConnection(); - - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FOLDERS, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $sFolderFullNameRaw = $this->GetActionParam('Folder', ''); - - try - { - $this->MailClient()->FolderDelete($sFolderFullNameRaw, - !!$this->Config()->Get('labs', 'use_imap_list_subscribe', true)); - } - catch (\MailSo\Mail\Exceptions\NonEmptyFolder $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantDeleteNonEmptyFolder, $oException); - } - catch (\Exception $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantDeleteFolder, $oException); - } - - return $this->TrueResponse(__FUNCTION__); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoFolderClear() - { - $this->initMailClientConnection(); - - $sFolderFullNameRaw = $this->GetActionParam('Folder', ''); - - try - { - $this->MailClient()->FolderClear($sFolderFullNameRaw); - } - catch (\Exception $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::MailServerError, $oException); - } - - return $this->TrueResponse(__FUNCTION__); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoFolderInformation() - { - $sFolder = $this->GetActionParam('Folder', ''); - $sPrevUidNext = $this->GetActionParam('UidNext', ''); - $aFlagsUids = array(); - $sFlagsUids = (string) $this->GetActionParam('FlagsUids', ''); - - $aFlagsFilteredUids = array(); - if (0 < strlen($sFlagsUids)) - { - $aFlagsUids = explode(',', $sFlagsUids); - $aFlagsFilteredUids = array_filter($aFlagsUids, function (&$sUid) { - $sUid = (int) trim($sUid); - return 0 < (int) trim($sUid); - }); - } - - $this->initMailClientConnection(); - - $sForwardedFlag = $this->Config()->Get('labs', 'imap_forwarded_flag', ''); - $sReadReceiptFlag = $this->Config()->Get('labs', 'imap_read_receipt_flag', ''); - try - { - $aInboxInformation = $this->MailClient()->FolderInformation( - $sFolder, $sPrevUidNext, $aFlagsFilteredUids - ); - - if (\is_array($aInboxInformation) && isset($aInboxInformation['Flags']) && \is_array($aInboxInformation['Flags'])) - { - foreach ($aInboxInformation['Flags'] as $iUid => $aFlags) - { - $aLowerFlags = array_map('strtolower', $aFlags); - $aInboxInformation['Flags'][$iUid] = array( - 'IsSeen' => in_array('\\seen', $aLowerFlags), - 'IsFlagged' => in_array('\\flagged', $aLowerFlags), - 'IsAnswered' => in_array('\\answered', $aLowerFlags), - 'IsDeleted' => in_array('\\deleted', $aLowerFlags), - 'IsForwarded' => 0 < strlen($sForwardedFlag) && in_array(strtolower($sForwardedFlag), $aLowerFlags), - 'IsReadReceipt' => 0 < strlen($sReadReceiptFlag) && in_array(strtolower($sReadReceiptFlag), $aLowerFlags) - ); - } - } - } - catch (\Exception $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::MailServerError, $oException); - } - - if (\is_array($aInboxInformation)) - { - $aInboxInformation['Version'] = APP_VERSION; - } - - return $this->DefaultResponse(__FUNCTION__, $aInboxInformation); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoFolderInformationMultiply() - { - $aResult = array( - 'List' => array(), - 'Version' => APP_VERSION - ); - - $aFolders = $this->GetActionParam('Folders', null); - if (\is_array($aFolders)) - { - $this->initMailClientConnection(); - - $aFolders = \array_unique($aFolders); - foreach ($aFolders as $sFolder) - { - if (0 < \strlen(\trim($sFolder)) && 'INBOX' !== \strtoupper($sFolder)) - { - try - { - $aInboxInformation = $this->MailClient()->FolderInformation($sFolder, '', array()); - if (\is_array($aInboxInformation) && isset($aInboxInformation['Folder'])) - { - $aResult['List'][] = $aInboxInformation; - } - } - catch (\Exception $oException) - { - $this->Logger()->WriteException($oException); - } - } - } - } - - return $this->DefaultResponse(__FUNCTION__, $aResult); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoMessageList() - { -// \sleep(1); -// throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantGetMessageList); - - $sFolder = ''; - $iOffset = 0; - $iLimit = 20; - $sSearch = ''; - $sUidNext = ''; - $bUseThreads = false; - $sThreadUid = ''; - - $sRawKey = $this->GetActionParam('RawKey', ''); - $aValues = $this->getDecodedClientRawKeyValue($sRawKey, 9); - - if (\is_array($aValues) && 7 < \count($aValues)) - { - $sFolder =(string) $aValues[0]; - $iOffset = (int) $aValues[1]; - $iLimit = (int) $aValues[2]; - $sSearch = (string) $aValues[3]; - $sUidNext = (string) $aValues[6]; - $bUseThreads = (bool) $aValues[7]; - - if ($bUseThreads) - { - $sThreadUid = isset($aValues[8]) ? (string) $aValues[8] : ''; - } - - $this->verifyCacheByKey($sRawKey); - } - else - { - $sFolder = $this->GetActionParam('Folder', ''); - $iOffset = (int) $this->GetActionParam('Offset', 0); - $iLimit = (int) $this->GetActionParam('Limit', 10); - $sSearch = $this->GetActionParam('Search', ''); - $sUidNext = $this->GetActionParam('UidNext', ''); - $bUseThreads = '1' === (string) $this->GetActionParam('UseThreads', '0'); - - if ($bUseThreads) - { - $sThreadUid = (string) $this->GetActionParam('ThreadUid', ''); - } - } - - if (0 === strlen($sFolder)) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantGetMessageList); - } - - $this->initMailClientConnection(); - - try - { - if (!$this->Config()->Get('labs', 'use_imap_thread', false)) - { - $bUseThreads = false; - } - - $oMessageList = $this->MailClient()->MessageList( - $sFolder, $iOffset, $iLimit, $sSearch, $sUidNext, - $this->cacherForUids(), - !!$this->Config()->Get('labs', 'use_imap_sort', false), - $bUseThreads, - $sThreadUid, - '' - ); - } - catch (\Exception $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantGetMessageList, $oException); - } - - if ($oMessageList instanceof \MailSo\Mail\MessageCollection) - { - $this->cacheByKey($sRawKey); - } - - return $this->DefaultResponse(__FUNCTION__, $oMessageList); - } - - /** - * @param \RainLoop\Model\Account $oAccount - * @param bool $bWithDraftInfo = true - * - * @return \MailSo\Mime\Message - */ - private function buildMessage($oAccount, $bWithDraftInfo = true) - { - $sIdentityID = $this->GetActionParam('IdentityID', ''); - $sTo = $this->GetActionParam('To', ''); - $sCc = $this->GetActionParam('Cc', ''); - $sBcc = $this->GetActionParam('Bcc', ''); - $sReplyTo = $this->GetActionParam('ReplyTo', ''); - $sSubject = $this->GetActionParam('Subject', ''); - $bTextIsHtml = '1' === $this->GetActionParam('TextIsHtml', '0'); - $bReadReceiptRequest = '1' === $this->GetActionParam('ReadReceiptRequest', '0'); - $bMarkAsImportant = '1' === $this->GetActionParam('MarkAsImportant', '0'); - $sText = $this->GetActionParam('Text', ''); - $aAttachments = $this->GetActionParam('Attachments', null); - - $aDraftInfo = $this->GetActionParam('DraftInfo', null); - $sInReplyTo = $this->GetActionParam('InReplyTo', ''); - $sReferences = $this->GetActionParam('References', ''); - - $oMessage = \MailSo\Mime\Message::NewInstance(); - - if (!$this->Config()->Get('security', 'hide_x_mailer_header', false)) - { - $oMessage->SetXMailer('RainLoop/'.APP_VERSION); - } - - $oFromIdentity = $this->GetIdentityByID($oAccount, $sIdentityID); - if ($oFromIdentity) - { - $oMessage->SetFrom(\MailSo\Mime\Email::NewInstance( - $oFromIdentity->Email(), $oFromIdentity->Name())); - } - else - { - $oMessage->SetFrom(\MailSo\Mime\Email::Parse($oAccount->Email())); - } - - $oFrom = $oMessage->GetFrom(); - $oMessage->RegenerateMessageId($oFrom ? $oFrom->GetDomain() : ''); - - if (!empty($sReplyTo)) - { - $oReplyTo = \MailSo\Mime\EmailCollection::NewInstance($sReplyTo); - if ($oReplyTo && 0 < $oReplyTo->Count()) - { - $oMessage->SetReplyTo($oReplyTo); - } - } - - if ($bReadReceiptRequest) - { - $oMessage->SetReadReceipt($oAccount->Email()); - } - - if ($bMarkAsImportant) - { - $oMessage->SetPriority(\MailSo\Mime\Enumerations\MessagePriority::HIGH); - } - - $oMessage->SetSubject($sSubject); - - $oToEmails = \MailSo\Mime\EmailCollection::NewInstance($sTo); - if ($oToEmails && $oToEmails->Count()) - { - $oMessage->SetTo($oToEmails); - } - - $oCcEmails = \MailSo\Mime\EmailCollection::NewInstance($sCc); - if ($oCcEmails && $oCcEmails->Count()) - { - $oMessage->SetCc($oCcEmails); - } - - $oBccEmails = \MailSo\Mime\EmailCollection::NewInstance($sBcc); - if ($oBccEmails && $oBccEmails->Count()) - { - $oMessage->SetBcc($oBccEmails); - } - - if ($bWithDraftInfo && \is_array($aDraftInfo) && !empty($aDraftInfo[0]) && !empty($aDraftInfo[1]) && !empty($aDraftInfo[2])) - { - $oMessage->SetDraftInfo($aDraftInfo[0], $aDraftInfo[1], $aDraftInfo[2]); - } - - if (0 < \strlen($sInReplyTo)) - { - $oMessage->SetInReplyTo($sInReplyTo); - } - - if (0 < \strlen($sReferences)) - { - $oMessage->SetReferences($sReferences); - } - - $aFoundedCids = array(); - $mFoundDataURL = array(); - $aFoundedContentLocationUrls = array(); - - $sTextToAdd = $bTextIsHtml ? - \MailSo\Base\HtmlUtils::BuildHtml($sText, $aFoundedCids, $mFoundDataURL, $aFoundedContentLocationUrls) : $sText; - - $this->Plugins()->RunHook($bTextIsHtml ? 'filter.message-html' : 'filter.message-plain', - array($oAccount, &$oMessage, &$sTextToAdd)); - - if ($bTextIsHtml && 0 < \strlen($sTextToAdd)) - { - $sTextConverted = \MailSo\Base\HtmlUtils::ConvertHtmlToPlain($sTextToAdd); - $this->Plugins()->RunHook('filter.message-plain', array($oAccount, &$oMessage, &$sTextConverted)); - $oMessage->AddText($sTextConverted, false); - } - - $oMessage->AddText($sTextToAdd, $bTextIsHtml); - - if (\is_array($aAttachments)) - { - foreach ($aAttachments as $sTempName => $aData) - { - $sFileName = (string) $aData[0]; - $bIsInline = (bool) $aData[1]; - $sCID = (string) $aData[2]; - $sContentLocation = isset($aData[3]) ? (string) $aData[3] : ''; - - $rResource = $this->FilesProvider()->GetFile($oAccount, $sTempName); - if (\is_resource($rResource)) - { - $iFileSize = $this->FilesProvider()->FileSize($oAccount, $sTempName); - - $oMessage->Attachments()->Add( - \MailSo\Mime\Attachment::NewInstance($rResource, $sFileName, $iFileSize, $bIsInline, - \in_array(trim(trim($sCID), '<>'), $aFoundedCids), - $sCID, array(), $sContentLocation - ) - ); - } - } - } - - if ($mFoundDataURL && \is_array($mFoundDataURL) && 0 < \count($mFoundDataURL)) - { - foreach ($mFoundDataURL as $sCidHash => $sDataUrlString) - { - $aMatch = array(); - $sCID = '<'.$sCidHash.'>'; - if (\preg_match('/^data:(image\/[a-zA-Z0-9]+);base64,(.+)$/i', $sDataUrlString, $aMatch) && - !empty($aMatch[1]) && !empty($aMatch[2])) - { - $sRaw = \MailSo\Base\Utils::Base64Decode($aMatch[2]); - $iFileSize = \strlen($sRaw); - if (0 < $iFileSize) - { - $sFileName = \preg_replace('/[^a-z0-9]+/i', '.', $aMatch[1]); - $rResource = \MailSo\Base\ResourceRegistry::CreateMemoryResourceFromString($sRaw); - - $sRaw = ''; - unset($sRaw); - unset($aMatch); - - $oMessage->Attachments()->Add( - \MailSo\Mime\Attachment::NewInstance($rResource, $sFileName, $iFileSize, true, true, $sCID) - ); - } - } - } - } - - $this->Plugins()->RunHook('filter.build-message', array(&$oMessage)); - $this->Plugins()->RunHook('filter.build-message[2]', array(&$oMessage, $oAccount)); - - return $oMessage; - } - - /** - * @param \RainLoop\Model\Account $oAccount - * - * @return void - */ - private function deleteMessageAttachmnets($oAccount) - { - $aAttachments = $this->GetActionParam('Attachments', null); - - if (\is_array($aAttachments)) - { - foreach (\array_keys($aAttachments) as $sTempName) - { - if ($this->FilesProvider()->FileExists($oAccount, $sTempName)) - { - $this->FilesProvider()->Clear($oAccount, $sTempName); - } - } - } - } - - /** - * @param \RainLoop\Model\Account $oAccount - * - * @return \MailSo\Mime\Message - */ - private function buildReadReceiptMessage($oAccount) - { - $sReadReceipt = $this->GetActionParam('ReadReceipt', ''); - $sSubject = $this->GetActionParam('Subject', ''); - $sText = $this->GetActionParam('Text', ''); - - $oIdentity = $this->GetAccountIdentity($oAccount); - - if (empty($sReadReceipt) || empty($sSubject) || empty($sText) || !$oIdentity) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::UnknownError); - } - - $oMessage = \MailSo\Mime\Message::NewInstance(); - - if (!$this->Config()->Get('security', 'hide_x_mailer_header', false)) - { - $oMessage->SetXMailer('RainLoop/'.APP_VERSION); - } - - $oMessage->SetFrom(\MailSo\Mime\Email::NewInstance($oIdentity->Email(), $oIdentity->Name())); - - $oFrom = $oMessage->GetFrom(); - $oMessage->RegenerateMessageId($oFrom ? $oFrom->GetDomain() : ''); - - $sReplyTo = $oIdentity->ReplyTo(); - if (!empty($sReplyTo)) - { - $oReplyTo = \MailSo\Mime\EmailCollection::NewInstance($sReplyTo); - if ($oReplyTo && $oReplyTo->Count()) - { - $oMessage->SetReplyTo($oReplyTo); - } - } - - $oMessage->SetSubject($sSubject); - - $oToEmails = \MailSo\Mime\EmailCollection::NewInstance($sReadReceipt); - if ($oToEmails && $oToEmails->Count()) - { - $oMessage->SetTo($oToEmails); - } - - $this->Plugins()->RunHook('filter.read-receipt-message-plain', array($oAccount, &$oMessage, &$sText)); - - $oMessage->AddText($sText, false); - - $this->Plugins()->RunHook('filter.build-read-receipt-message', array(&$oMessage, $oAccount)); - - return $oMessage; - } - - /** - * @return array - */ - public function DoSaveMessage() - { - $oAccount = $this->initMailClientConnection(); - - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::COMPOSER, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $sMessageFolder = $this->GetActionParam('MessageFolder', ''); - $sMessageUid = $this->GetActionParam('MessageUid', ''); - - $sDraftFolder = $this->GetActionParam('DraftFolder', ''); - if (0 === strlen($sDraftFolder)) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::UnknownError); - } - - $oMessage = $this->buildMessage($oAccount, true); - - $this->Plugins() - ->RunHook('filter.save-message', array(&$oMessage)) - ->RunHook('filter.save-message[2]', array(&$oMessage, $oAccount)) - ; - - $mResult = false; - if ($oMessage) - { - $rMessageStream = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); - - $iMessageStreamSize = \MailSo\Base\Utils::MultipleStreamWriter( - $oMessage->ToStream(false), array($rMessageStream), 8192, true, true); - - if (false !== $iMessageStreamSize) - { - $sMessageId = $oMessage->MessageId(); - - \rewind($rMessageStream); - - $iNewUid = 0; - $this->MailClient()->MessageAppendStream( - $rMessageStream, $iMessageStreamSize, $sDraftFolder, array( - \MailSo\Imap\Enumerations\MessageFlag::SEEN - ), $iNewUid); - - if (!empty($sMessageId) && (null === $iNewUid || 0 === $iNewUid)) - { - $iNewUid = $this->MailClient()->FindMessageUidByMessageId($sDraftFolder, $sMessageId); - } - - $mResult = true; - - if (0 < strlen($sMessageFolder) && 0 < strlen($sMessageUid)) - { - $this->MailClient()->MessageDelete($sMessageFolder, array($sMessageUid), true, true); - } - - if (null !== $iNewUid && 0 < $iNewUid) - { - $mResult = array( - 'NewFolder' => $sDraftFolder, - 'NewUid' => $iNewUid - ); - } - } - } - - return $this->DefaultResponse(__FUNCTION__, $mResult); - } - - /** - * - * @param \RainLoop\Model\Account $oAccount - * @param \MailSo\Mime\Message $oMessage - * @param resource $rMessageStream - * @param bool $bDsn = false - * @param bool $bAddHiddenRcpt = true - * - * @throws \RainLoop\Exceptions\ClientException - * @throws \MailSo\Net\Exceptions\ConnectionException - */ - private function smtpSendMessage($oAccount, $oMessage, - &$rMessageStream, &$iMessageStreamSize, $bDsn = false, $bAddHiddenRcpt = true) - { - $oRcpt = $oMessage->GetRcpt(); - if ($oRcpt && 0 < $oRcpt->Count()) - { - $this->Plugins()->RunHook('filter.smtp-message-stream', - array($oAccount, &$rMessageStream, &$iMessageStreamSize)); - - $this->Plugins()->RunHook('filter.message-rcpt', array($oAccount, &$oRcpt)); - - try - { - $oFrom = $oMessage->GetFrom(); - $sFrom = $oFrom instanceof \MailSo\Mime\Email ? $oFrom->GetEmail() : ''; - $sFrom = empty($sFrom) ? $oAccount->Email() : $sFrom; - - $this->Plugins()->RunHook('filter.smtp-from', array($oAccount, $oMessage, &$sFrom)); - - $aHiddenRcpt = array(); - if ($bAddHiddenRcpt) - { - $this->Plugins()->RunHook('filter.smtp-hidden-rcpt', array($oAccount, $oMessage, &$aHiddenRcpt)); - } - - $bUsePhpMail = $oAccount->Domain()->OutUsePhpMail(); - - $oSmtpClient = \MailSo\Smtp\SmtpClient::NewInstance()->SetLogger($this->Logger()); - $oSmtpClient->SetTimeOuts(10, (int) \RainLoop\Api::Config()->Get('labs', 'smtp_timeout', 60)); - - $bLoggined = $oAccount->OutConnectAndLoginHelper($this->Plugins(), $oSmtpClient, $this->Config(), $bUsePhpMail); - - if ($bUsePhpMail) - { - if (\MailSo\Base\Utils::FunctionExistsAndEnabled('mail')) - { - $aToCollection = $oMessage->GetTo(); - if ($aToCollection && $oFrom) - { - $sRawBody = @\stream_get_contents($rMessageStream); - if (!empty($sRawBody)) - { - $sMailTo = \trim($aToCollection->ToString(true)); - $sMailSubject = \trim($oMessage->GetSubject()); - $sMailSubject = 0 === \strlen($sMailSubject) ? '' : \MailSo\Base\Utils::EncodeUnencodedValue( - \MailSo\Base\Enumerations\Encoding::BASE64_SHORT, $sMailSubject); - - $sMailHeaders = $sMailBody = ''; - list($sMailHeaders, $sMailBody) = \explode("\r\n\r\n", $sRawBody, 2); - unset($sRawBody); - - if ($this->Config()->Get('labs', 'mail_func_clear_headers', true)) - { - $sMailHeaders = \MailSo\Base\Utils::RemoveHeaderFromHeaders($sMailHeaders, array( - \MailSo\Mime\Enumerations\Header::TO_, - \MailSo\Mime\Enumerations\Header::SUBJECT - )); - } - - if ($this->Config()->Get('debug', 'enable', false)) - { - $this->Logger()->WriteDump(array( - $sMailTo, $sMailSubject, $sMailBody, $sMailHeaders - )); - } - - $bR = $this->Config()->Get('labs', 'mail_func_additional_parameters', false) ? - \mail($sMailTo, $sMailSubject, $sMailBody, $sMailHeaders, '-f'.$oFrom->GetEmail()) : - \mail($sMailTo, $sMailSubject, $sMailBody, $sMailHeaders); - - if (!$bR) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSendMessage); - } - } - } - } - else - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSendMessage); - } - } - else if ($oSmtpClient->IsConnected()) - { - if (!empty($sFrom)) - { - $oSmtpClient->MailFrom($sFrom, '', $bDsn); - } - - $aRcpt =& $oRcpt->GetAsArray(); - foreach ($aRcpt as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) - { - $oSmtpClient->Rcpt($oEmail->GetEmail(), $bDsn); - } - - if ($bAddHiddenRcpt && \is_array($aHiddenRcpt) && 0 < \count($aHiddenRcpt)) - { - foreach ($aHiddenRcpt as $sEmail) - { - if (\preg_match('/^[^@\s]+@[^@\s]+$/', $sEmail)) - { - $oSmtpClient->Rcpt($sEmail); - } - } - } - - $oSmtpClient->DataWithStream($rMessageStream); - - if ($bLoggined) - { - $oSmtpClient->Logout(); - } - - $oSmtpClient->Disconnect(); - } - } - catch (\MailSo\Net\Exceptions\ConnectionException $oException) - { - if ($this->Config()->Get('labs', 'smtp_show_server_errors')) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::ClientViewError, $oException); - } - else - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::ConnectionError, $oException); - } - } - catch (\MailSo\Smtp\Exceptions\LoginException $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError, $oException); - } - catch (\Exception $oException) - { - if ($this->Config()->Get('labs', 'smtp_show_server_errors')) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::ClientViewError, $oException); - } - else - { - throw $oException; - } - } - } - else - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::InvalidRecipients); - } - } - - /** - * @return array - */ - public function DoSendMessage() - { - $oAccount = $this->initMailClientConnection(); - - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::COMPOSER, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $oConfig = $this->Config(); - - $sDraftFolder = $this->GetActionParam('MessageFolder', ''); - $sDraftUid = $this->GetActionParam('MessageUid', ''); - $sSentFolder = $this->GetActionParam('SentFolder', ''); - $aDraftInfo = $this->GetActionParam('DraftInfo', null); - $bDsn = '1' === (string) $this->GetActionParam('Dsn', '0'); - - $oMessage = $this->buildMessage($oAccount, false); - - $this->Plugins() - ->RunHook('filter.send-message', array(&$oMessage)) - ->RunHook('filter.send-message[2]', array(&$oMessage, $oAccount)) - ; - - $mResult = false; - try - { - if ($oMessage) - { - $rMessageStream = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); - - $iMessageStreamSize = \MailSo\Base\Utils::MultipleStreamWriter( - $oMessage->ToStream(true), array($rMessageStream), 8192, true, true, true); - - if (false !== $iMessageStreamSize) - { - $this->smtpSendMessage($oAccount, $oMessage, $rMessageStream, $iMessageStreamSize, $bDsn, true); - - if (\is_array($aDraftInfo) && 3 === \count($aDraftInfo)) - { - $sDraftInfoType = $aDraftInfo[0]; - $sDraftInfoUid = $aDraftInfo[1]; - $sDraftInfoFolder = $aDraftInfo[2]; - - try - { - switch (\strtolower($sDraftInfoType)) - { - case 'reply': - case 'reply-all': - $this->MailClient()->MessageSetFlag($sDraftInfoFolder, array($sDraftInfoUid), true, - \MailSo\Imap\Enumerations\MessageFlag::ANSWERED, true); - break; - case 'forward': - $sForwardedFlag = $this->Config()->Get('labs', 'imap_forwarded_flag', ''); - if (0 < strlen($sForwardedFlag)) - { - $this->MailClient()->MessageSetFlag($sDraftInfoFolder, array($sDraftInfoUid), true, - $sForwardedFlag, true); - } - break; - } - } - catch (\Exception $oException) - { - $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); - } - } - - if (0 < \strlen($sSentFolder)) - { - try - { - if (!$oMessage->GetBcc()) - { - if (\is_resource($rMessageStream)) - { - \rewind($rMessageStream); - } - - $this->Plugins()->RunHook('filter.sent-message-stream', - array($oAccount, &$rMessageStream, &$iMessageStreamSize)); - - $this->MailClient()->MessageAppendStream( - $rMessageStream, $iMessageStreamSize, $sSentFolder, array( - \MailSo\Imap\Enumerations\MessageFlag::SEEN - ) - ); - } - else - { - $rAppendMessageStream = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); - - $iAppendMessageStreamSize = \MailSo\Base\Utils::MultipleStreamWriter( - $oMessage->ToStream(false), array($rAppendMessageStream), 8192, true, true, true); - - $this->Plugins()->RunHook('filter.sent-message-stream', - array($oAccount, &$rAppendMessageStream, &$iAppendMessageStreamSize)); - - $this->MailClient()->MessageAppendStream( - $rAppendMessageStream, $iAppendMessageStreamSize, $sSentFolder, array( - \MailSo\Imap\Enumerations\MessageFlag::SEEN - )); - - if (\is_resource($rAppendMessageStream)) - { - @fclose($rAppendMessageStream); - } - } - } - catch (\Exception $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSaveMessage, $oException); - } - } - - if (\is_resource($rMessageStream)) - { - @\fclose($rMessageStream); - } - - $this->deleteMessageAttachmnets($oAccount); - - if (0 < \strlen($sDraftFolder) && 0 < \strlen($sDraftUid)) - { - try - { - $this->MailClient()->MessageDelete($sDraftFolder, array($sDraftUid), true, true); - } - catch (\Exception $oException) - { - $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); - } - } - - $mResult = true; - } - } - } - catch (\RainLoop\Exceptions\ClientException $oException) - { - throw $oException; - } - catch (\Exception $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSendMessage, $oException); - } - - if (false === $mResult) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSendMessage); - } - - try - { - if ($oMessage && $this->AddressBookProvider($oAccount)->IsActive()) - { - $aArrayToFrec = array(); - $oToCollection = $oMessage->GetTo(); - if ($oToCollection) - { - $aTo =& $oToCollection->GetAsArray(); - foreach ($aTo as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) - { - $aArrayToFrec[$oEmail->GetEmail(true)] = $oEmail->ToString(false, true); - } - } - - if (0 < \count($aArrayToFrec)) - { - $oSettings = $this->SettingsProvider()->Load($oAccount); - - $this->AddressBookProvider($oAccount)->IncFrec( - $oAccount->ParentEmailHelper(), \array_values($aArrayToFrec), - !!$oSettings->GetConf('ContactsAutosave', - !!$oConfig->Get('defaults', 'contacts_autosave', true))); - } - } - } - catch (\Exception $oException) - { - $this->Logger()->WriteException($oException); - } - - return $this->TrueResponse(__FUNCTION__); - } - - /** - * @return array - */ - public function DoSendReadReceiptMessage() - { - $oAccount = $this->initMailClientConnection(); - - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::COMPOSER, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $oMessage = $this->buildReadReceiptMessage($oAccount); - - $this->Plugins()->RunHook('filter.send-read-receipt-message', array(&$oMessage, $oAccount)); - - $mResult = false; - try - { - if ($oMessage) - { - $rMessageStream = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); - - $iMessageStreamSize = \MailSo\Base\Utils::MultipleStreamWriter( - $oMessage->ToStream(true), array($rMessageStream), 8192, true, true, true); - - if (false !== $iMessageStreamSize) - { - $this->smtpSendMessage($oAccount, $oMessage, $rMessageStream, $iMessageStreamSize, false, false); - - if (\is_resource($rMessageStream)) - { - @\fclose($rMessageStream); - } - - $mResult = true; - - $sReadReceiptFlag = $this->Config()->Get('labs', 'imap_read_receipt_flag', ''); - if (!empty($sReadReceiptFlag)) - { - $sFolderFullName = $this->GetActionParam('MessageFolder', ''); - $sUid = $this->GetActionParam('MessageUid', ''); - - $this->Cacher($oAccount)->Set(\RainLoop\KeyPathHelper::ReadReceiptCache($oAccount->Email(), $sFolderFullName, $sUid), '1'); - - if (0 < \strlen($sFolderFullName) && 0 < \strlen($sUid)) - { - try - { - $this->MailClient()->MessageSetFlag($sFolderFullName, array($sUid), true, $sReadReceiptFlag, true, true); - } - catch (\Exception $oException) {} - } - } - } - } - } - catch (\RainLoop\Exceptions\ClientException $oException) - { - throw $oException; - } - catch (\Exception $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSendMessage, $oException); - } - - if (false === $mResult) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSendMessage); - } - - return $this->TrueResponse(__FUNCTION__); - } - - /** - * @return array - */ - public function DoQuota() - { - $oAccount = $this->initMailClientConnection(); - - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::QUOTA, $oAccount)) - { - return $this->DefaultResponse(__FUNCTION__, array(0, 0, 0, 0)); - } - - try - { - $aQuota = $this->MailClient()->Quota(); - } - catch (\Exception $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::MailServerError, $oException); - } - - return $this->DefaultResponse(__FUNCTION__, $aQuota); - } - - private function getContactsSyncData($oAccount) - { - $mResult = null; - - $sData = $this->StorageProvider()->Get($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'contacts_sync' - ); - - if (!empty($sData)) - { - $mData = \RainLoop\Utils::DecodeKeyValues($sData); - if (\is_array($mData)) - { - $mResult = array( - 'Enable' => isset($mData['Enable']) ? !!$mData['Enable'] : false, - 'Url' => isset($mData['Url']) ? \trim($mData['Url']) : '', - 'User' => isset($mData['User']) ? \trim($mData['User']) : '', - 'Password' => isset($mData['Password']) ? $mData['Password'] : '' - ); - } - } - - return $mResult; - } - - /** - * @return array - */ - public function DoSaveContactsSyncData() - { - $oAccount = $this->getAccountFromToken(); - - $oAddressBookProvider = $this->AddressBookProvider($oAccount); - if (!$oAddressBookProvider || !$oAddressBookProvider->IsActive()) - { - return $this->FalseResponse(__FUNCTION__); - } - - $bEnabled = '1' === (string) $this->GetActionParam('Enable', '0'); - $sUrl = $this->GetActionParam('Url', ''); - $sUser = $this->GetActionParam('User', ''); - $sPassword = $this->GetActionParam('Password', ''); - - $mData = $this->getContactsSyncData($oAccount); - - $bResult = $this->StorageProvider()->Put($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'contacts_sync', - \RainLoop\Utils::EncodeKeyValues(array( - 'Enable' => $bEnabled, - 'User' => $sUser, - 'Password' => APP_DUMMY === $sPassword && isset($mData['Password']) ? - $mData['Password'] : (APP_DUMMY === $sPassword ? '' : $sPassword), - 'Url' => $sUrl - )) - ); - - return $this->DefaultResponse(__FUNCTION__, $bResult); - } - - /** - * @return array - */ - public function DoContactsSync() - { - $bResult = false; - $oAccount = $this->getAccountFromToken(); - - $oAddressBookProvider = $this->AddressBookProvider($oAccount); - if ($oAddressBookProvider && $oAddressBookProvider->IsActive()) - { - $mData = $this->getContactsSyncData($oAccount); - if (\is_array($mData) && isset($mData['Enable'], $mData['User'], $mData['Password'], $mData['Url']) && $mData['Enable']) - { - $bResult = $oAddressBookProvider->Sync( - $oAccount->ParentEmailHelper(), - $mData['Url'], $mData['User'], $mData['Password']); - } - } - - if (!$bResult) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::ContactsSyncError); - } - - return $this->TrueResponse(__FUNCTION__); - } - - private function getTwoFactorInfo($oAccount, $bRemoveSecret = false) - { - $sEmail = $oAccount->ParentEmailHelper(); - - $mData = null; - - $aResult = array( - 'User' => '', - 'IsSet' => false, - 'Enable' => false, - 'Secret' => '', - 'UrlTitle' => '', - 'BackupCodes' => '' - ); - - if (!empty($sEmail)) - { - $aResult['User'] = $sEmail; - - $sData = $this->StorageProvider()->Get($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'two_factor' - ); - - if ($sData) - { - $mData = \RainLoop\Utils::DecodeKeyValues($sData); - } - } - - if (\is_array($mData) && !empty($aResult['User']) && - !empty($mData['User']) && !empty($mData['Secret']) && - !empty($mData['BackupCodes']) && $sEmail === $mData['User']) - { - $aResult['IsSet'] = true; - $aResult['Enable'] = isset($mData['Enable']) ? !!$mData['Enable'] : false; - $aResult['Secret'] = $mData['Secret']; - $aResult['BackupCodes'] = $mData['BackupCodes']; - $aResult['UrlTitle'] = $this->Config()->Get('webmail', 'title', ''); - } - - if ($bRemoveSecret) - { - if (isset($aResult['Secret'])) - { - unset($aResult['Secret']); - } - - if (isset($aResult['UrlTitle'])) - { - unset($aResult['UrlTitle']); - } - - if (isset($aResult['BackupCodes'])) - { - unset($aResult['BackupCodes']); - } - } - - return $aResult; - } - - /** - * @param \RainLoop\Model\Account $oAccount - * @param string $sCode - * - * @return bool - */ - private function removeBackupCodeFromTwoFactorInfo($oAccount, $sCode) - { - if (!$oAccount || empty($sCode)) - { - return false; - } - - $sData = $this->StorageProvider()->Get($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'two_factor' - ); - - if ($sData) - { - $mData = \RainLoop\Utils::DecodeKeyValues($sData); - - if (!empty($mData['BackupCodes'])) - { - $sBackupCodes = \preg_replace('/[^\d]+/', ' ', ' '.$mData['BackupCodes'].' '); - $sBackupCodes = \str_replace(' '.$sCode.' ', '', $sBackupCodes); - - $mData['BackupCodes'] = \trim(\preg_replace('/[^\d]+/', ' ', $sBackupCodes)); - - return $this->StorageProvider()->Put($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'two_factor', - \RainLoop\Utils::EncodeKeyValues($mData) - ); - } - } - - return false; - } - - /** - * @return array - */ - public function DoGetTwoFactorInfo() - { - $oAccount = $this->getAccountFromToken(); - - if (!$this->TwoFactorAuthProvider()->IsActive() || - !$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - return $this->DefaultResponse(__FUNCTION__, - $this->getTwoFactorInfo($oAccount, true)); - } - - /** - * @return array - */ - public function DoCreateTwoFactorSecret() - { - $oAccount = $this->getAccountFromToken(); - - if (!$this->TwoFactorAuthProvider()->IsActive() || - !$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $sEmail = $oAccount->ParentEmailHelper(); - - $sSecret = $this->TwoFactorAuthProvider()->CreateSecret(); - - $aCodes = array(); - for ($iIndex = 9; $iIndex > 0; $iIndex--) - { - $aCodes[] = \rand(100000000, 900000000); - } - - $this->StorageProvider()->Put($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'two_factor', - \RainLoop\Utils::EncodeKeyValues(array( - 'User' => $sEmail, - 'Enable' => false, - 'Secret' => $sSecret, - 'BackupCodes' => \implode(' ', $aCodes) - )) - ); - - $this->requestSleep(); - - return $this->DefaultResponse(__FUNCTION__, - $this->getTwoFactorInfo($oAccount)); - } - - /** - * @return array - */ - public function DoShowTwoFactorSecret() - { - $oAccount = $this->getAccountFromToken(); - - if (!$this->TwoFactorAuthProvider()->IsActive() || - !$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $aResult = $this->getTwoFactorInfo($oAccount); - if (\is_array($aResult)) - { - unset($aResult['BackupCodes']); - } - - return $this->DefaultResponse(__FUNCTION__, $aResult); - } - - /** - * @return array - */ - public function DoEnableTwoFactor() - { - $oAccount = $this->getAccountFromToken(); - - if (!$this->TwoFactorAuthProvider()->IsActive() || - !$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $sEmail = $oAccount->ParentEmailHelper(); - - $bResult = false; - $mData = $this->getTwoFactorInfo($oAccount); - if (isset($mData['Secret'], $mData['BackupCodes'])) - { - $bResult = $this->StorageProvider()->Put($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'two_factor', - \RainLoop\Utils::EncodeKeyValues(array( - 'User' => $sEmail, - 'Enable' => '1' === \trim($this->GetActionParam('Enable', '0')), - 'Secret' => $mData['Secret'], - 'BackupCodes' => $mData['BackupCodes'] - )) - ); - } - - return $this->DefaultResponse(__FUNCTION__, $bResult); - } - - /** - * @return array - */ - public function DoTestTwoFactorInfo() - { - $oAccount = $this->getAccountFromToken(); - - if (!$this->TwoFactorAuthProvider()->IsActive() || - !$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $sCode = \trim($this->GetActionParam('Code', '')); - - $aData = $this->getTwoFactorInfo($oAccount); - $sSecret = !empty($aData['Secret']) ? $aData['Secret'] : ''; - -// $this->Logger()->WriteDump(array( -// $sCode, $sSecret, $aData, -// $this->TwoFactorAuthProvider()->VerifyCode($sSecret, $sCode) -// )); - - $this->requestSleep(); - - return $this->DefaultResponse(__FUNCTION__, - $this->TwoFactorAuthProvider()->VerifyCode($sSecret, $sCode)); - } - - /** - * @return array - */ - public function DoClearTwoFactorInfo() - { - $oAccount = $this->getAccountFromToken(); - - if (!$this->TwoFactorAuthProvider()->IsActive() || - !$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $this->StorageProvider()->Clear($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'two_factor' - ); - - return $this->DefaultResponse(__FUNCTION__, - $this->getTwoFactorInfo($oAccount, true)); - } - - /** - * @return array - */ - public function DoContacts() - { - $oAccount = $this->getAccountFromToken(); - - $sSearch = \trim($this->GetActionParam('Search', '')); - $iOffset = (int) $this->GetActionParam('Offset', 0); - $iLimit = (int) $this->GetActionParam('Limit', 20); - $iOffset = 0 > $iOffset ? 0 : $iOffset; - $iLimit = 0 > $iLimit ? 20 : $iLimit; - - $iResultCount = 0; - $mResult = array(); - - $oAbp = $this->AddressBookProvider($oAccount); - if ($oAbp->IsActive()) - { - $iResultCount = 0; - $mResult = $oAbp->GetContacts($oAccount->ParentEmailHelper(), - $iOffset, $iLimit, $sSearch, $iResultCount); - } - - return $this->DefaultResponse(__FUNCTION__, array( - 'Offset' => $iOffset, - 'Limit' => $iLimit, - 'Count' => $iResultCount, - 'Search' => $sSearch, - 'List' => $mResult - )); - } - - /** - * @return array - */ - public function DoContactsDelete() - { - $oAccount = $this->getAccountFromToken(); - $aUids = \explode(',', (string) $this->GetActionParam('Uids', '')); - - $aFilteredUids = \array_filter($aUids, function (&$mUid) { - $mUid = (int) \trim($mUid); - return 0 < $mUid; - }); - - $bResult = false; - if (0 < \count($aFilteredUids) && $this->AddressBookProvider($oAccount)->IsActive()) - { - $bResult = $this->AddressBookProvider($oAccount)->DeleteContacts($oAccount->ParentEmailHelper(), $aFilteredUids); - } - - return $this->DefaultResponse(__FUNCTION__, $bResult); - } - - /** - * @return array - */ - public function DoContactSave() - { - $oAccount = $this->getAccountFromToken(); - - $bResult = false; - - $oAddressBookProvider = $this->AddressBookProvider($oAccount); - $sRequestUid = \trim($this->GetActionParam('RequestUid', '')); - if ($oAddressBookProvider && $oAddressBookProvider->IsActive() && 0 < \strlen($sRequestUid)) - { - $sUid = \trim($this->GetActionParam('Uid', '')); - - $oContact = null; - if (0 < \strlen($sUid)) - { - $oContact = $oAddressBookProvider->GetContactByID($oAccount->ParentEmailHelper(), $sUid); - } - - if (!$oContact) - { - $oContact = new \RainLoop\Providers\AddressBook\Classes\Contact(); - if (0 < \strlen($sUid)) - { - $oContact->IdContact = $sUid; - } - } - - $oContact->Properties = array(); - $aProperties = $this->GetActionParam('Properties', array()); - if (\is_array($aProperties)) - { - foreach ($aProperties as $aItem) - { - if ($aItem && isset($aItem[0], $aItem[1]) && \is_numeric($aItem[0])) - { - $oProp = new \RainLoop\Providers\AddressBook\Classes\Property(); - $oProp->Type = (int) $aItem[0]; - $oProp->Value = $aItem[1]; - $oProp->TypeStr = empty($aItem[2]) ? '': $aItem[2]; - - $oContact->Properties[] = $oProp; - } - } - } - - if (!empty($oContact->Etag)) - { - $oContact->Etag = \md5($oContact->ToVCard()); - } - - $oContact->PopulateDisplayAndFullNameValue(true); - - $bResult = $oAddressBookProvider->ContactSave($oAccount->ParentEmailHelper(), $oContact); - } - - return $this->DefaultResponse(__FUNCTION__, array( - 'RequestUid' => $sRequestUid, - 'ResultID' => $bResult ? $oContact->IdContact : '', - 'Result' => $bResult - )); - } - - /** - * @return array - */ - public function DoSuggestions() - { - $oAccount = $this->getAccountFromToken(); - - $sQuery = \trim($this->GetActionParam('Query', '')); - $iLimit = (int) $this->Config()->Get('contacts', 'suggestions_limit', 20); - - $aResult = array(); - - $this->Plugins()->RunHook('ajax.suggestions-input-parameters', array(&$sQuery, &$iLimit, $oAccount)); - - $iLimit = (int) $iLimit; - if (5 > $iLimit) - { - $iLimit = 5; - } - - $this->Plugins()->RunHook('ajax.suggestions-pre', array(&$aResult, $sQuery, $oAccount, $iLimit)); - - if ($iLimit > \count($aResult) && 0 < \strlen($sQuery)) - { - try - { - // Address Book - $oAddressBookProvider = $this->AddressBookProvider($oAccount); - if ($oAddressBookProvider && $oAddressBookProvider->IsActive()) - { - $aSuggestions = $oAddressBookProvider->GetSuggestions($oAccount->ParentEmailHelper(), $sQuery, $iLimit); - if (0 === \count($aResult)) - { - $aResult = $aSuggestions; - } - else - { - $aResult = \array_merge($aResult, $aSuggestions); - } - } - } - catch (\Exception $oException) - { - $this->Logger()->WriteException($oException); - } - } - - if ($iLimit > \count($aResult) && 0 < \strlen($sQuery)) - { - $oSuggestionsProvider = $this->SuggestionsProvider(); - if ($oSuggestionsProvider && $oSuggestionsProvider->IsActive()) - { - $aSuggestionsProviderResult = $oSuggestionsProvider->Process($oAccount, $sQuery, $iLimit); - if (\is_array($aSuggestionsProviderResult) && 0 < \count($aSuggestionsProviderResult)) - { - $aResult = \array_merge($aResult, $aSuggestionsProviderResult); - } - } - - } - - $aResult = \RainLoop\Utils::RemoveSuggestionDuplicates($aResult); - if ($iLimit < \count($aResult)) - { - $aResult = \array_slice($aResult, 0, $iLimit); - } - - $this->Plugins()->RunHook('ajax.suggestions-post', array(&$aResult, $sQuery, $oAccount, $iLimit)); - - $aResult = \RainLoop\Utils::RemoveSuggestionDuplicates($aResult); - if ($iLimit < \count($aResult)) - { - $aResult = \array_slice($aResult, 0, $iLimit); - } - - return $this->DefaultResponse(__FUNCTION__, $aResult); - } - - /** - * @return array - */ - private function messageSetFlag($sActionFunction, $sResponseFunction) - { - $this->initMailClientConnection(); - - $sFolder = $this->GetActionParam('Folder', ''); - $bSetAction = '1' === (string) $this->GetActionParam('SetAction', '0'); - $aUids = \explode(',', (string) $this->GetActionParam('Uids', '')); - $aFilteredUids = \array_filter($aUids, function (&$sUid) { - $sUid = (int) \trim($sUid); - return 0 < $sUid; - }); - - try - { - $this->MailClient()->{$sActionFunction}($sFolder, $aFilteredUids, true, $bSetAction, true); - } - catch (\Exception $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::MailServerError, $oException); - } - - return $this->TrueResponse($sResponseFunction); - } - - /** - * @return array - */ - public function DoMessageSetSeen() - { - return $this->messageSetFlag('MessageSetSeen', __FUNCTION__); - } - - /** - * @return array - */ - public function DoMessageSetSeenToAll() - { - $this->initMailClientConnection(); - - $sFolder = $this->GetActionParam('Folder', ''); - $bSetAction = '1' === (string) $this->GetActionParam('SetAction', '0'); - $sThreadUids = \trim($this->GetActionParam('ThreadUids', '')); - - try - { - $this->MailClient()->MessageSetSeenToAll($sFolder, $bSetAction, - !empty($sThreadUids) ? explode(',', $sThreadUids) : null); - } - catch (\Exception $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::MailServerError, $oException); - } - - return $this->TrueResponse(__FUNCTION__); - } - - /** - * @return array - */ - public function DoMessageSetFlagged() - { - return $this->messageSetFlag('MessageSetFlagged', __FUNCTION__); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoMessage() - { - $sRawKey = (string) $this->GetActionParam('RawKey', ''); - - $sFolder = ''; - $iUid = 0; - - $aValues = $this->getDecodedClientRawKeyValue($sRawKey, 4); - if (is_array($aValues) && 4 === count($aValues)) - { - $sFolder = (string) $aValues[0]; - $iUid = (int) $aValues[1]; - - $this->verifyCacheByKey($sRawKey); - } - else - { - $sFolder = $this->GetActionParam('Folder', ''); - $iUid = (int) $this->GetActionParam('Uid', 0); - } - - $oAccount = $this->initMailClientConnection(); - - try - { - $oMessage = $this->MailClient()->Message($sFolder, $iUid, true, - $this->cacherForThreads(), - (int) $this->Config()->Get('labs', 'imap_body_text_limit', 0) - ); - } - catch (\Exception $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantGetMessage, $oException); - } - - if ($oMessage instanceof \MailSo\Mail\Message) - { - $this->Plugins() - ->RunHook('filter.result-message', array(&$oMessage)) - ->RunHook('filter.result-message[2]', array(&$oMessage, $oAccount)) - ; - - $this->cacheByKey($sRawKey); - } - - return $this->DefaultResponse(__FUNCTION__, $oMessage); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoMessageDelete() - { - $this->initMailClientConnection(); - - $sFolder = $this->GetActionParam('Folder', ''); - $aUids = \explode(',', (string) $this->GetActionParam('Uids', '')); - - $aFilteredUids = \array_filter($aUids, function (&$sUid) { - $sUid = (int) \trim($sUid); - return 0 < $sUid; - }); - - try - { - $this->MailClient()->MessageDelete($sFolder, $aFilteredUids, true, true, - !!$this->Config()->Get('labs', 'use_imap_expunge_all_on_delete', false)); - } - catch (\Exception $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantDeleteMessage, $oException); - } - - if ($this->Config()->Get('labs', 'use_imap_unselect', true)) - { - try - { - $this->MailClient()->FolderUnSelect(); - } - catch (\Exception $oException) - { - unset($oException); - } - } - - $sHash = ''; - - try - { - $sHash = $this->MailClient()->FolderHash($sFolder); - } - catch (\Exception $oException) - { - unset($oException); - } - - return $this->DefaultResponse(__FUNCTION__, '' === $sHash ? false : array($sFolder, $sHash)); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoMessageMove() - { - $this->initMailClientConnection(); - - $sFromFolder = $this->GetActionParam('FromFolder', ''); - $sToFolder = $this->GetActionParam('ToFolder', ''); - $aUids = \explode(',', (string) $this->GetActionParam('Uids', '')); - $bMarkAsRead = '1' === (string) $this->GetActionParam('MarkAsRead', '0'); - - $aFilteredUids = \array_filter($aUids, function (&$mUid) { - $mUid = (int) \trim($mUid); - return 0 < $mUid; - }); - - if ($bMarkAsRead) - { - try - { - $this->MailClient()->MessageSetSeen($sFromFolder, $aFilteredUids, true, true); - } - catch (\Exception $oException) - { - unset($oException); - } - } - - try - { - $this->MailClient()->MessageMove($sFromFolder, $sToFolder, $aFilteredUids, true, - !!$this->Config()->Get('labs', 'use_imap_move', true), - !!$this->Config()->Get('labs', 'use_imap_expunge_all_on_delete', false) - ); - } - catch (\Exception $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantMoveMessage, $oException); - } - - if ($this->Config()->Get('labs', 'use_imap_unselect', true)) - { - try - { - $this->MailClient()->FolderUnSelect(); - } - catch (\Exception $oException) - { - unset($oException); - } - } - - $sHash = ''; - - try - { - $sHash = $this->MailClient()->FolderHash($sFromFolder); - } - catch (\Exception $oException) - { - unset($oException); - } - - return $this->DefaultResponse(__FUNCTION__, '' === $sHash ? false : array($sFromFolder, $sHash)); - } - - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoMessageCopy() - { - $this->initMailClientConnection(); - - $sFromFolder = $this->GetActionParam('FromFolder', ''); - $sToFolder = $this->GetActionParam('ToFolder', ''); - $aUids = \explode(',', (string) $this->GetActionParam('Uids', '')); - - $aFilteredUids = \array_filter($aUids, function (&$mUid) { - $mUid = (int) \trim($mUid); - return 0 < $mUid; - }); - - try - { - $this->MailClient()->MessageCopy($sFromFolder, $sToFolder, - $aFilteredUids, true); - - $sHash = $this->MailClient()->FolderHash($sFromFolder); - } - catch (\Exception $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantCopyMessage, $oException); - } - - return $this->DefaultResponse(__FUNCTION__, - '' === $sHash ? false : array($sFromFolder, $sHash)); - } - - /** - * @param string $sFileName - * @param string $sContentType - * @param string $sMimeIndex - * @param int $iMaxLength = 250 - * - * @return string - */ - public function MainClearFileName($sFileName, $sContentType, $sMimeIndex, $iMaxLength = 250) - { - $sFileName = 0 === \strlen($sFileName) ? \preg_replace('/[^a-zA-Z0-9]/', '.', (empty($sMimeIndex) ? '' : $sMimeIndex.'.').$sContentType) : $sFileName; - $sClearedFileName = \MailSo\Base\Utils::StripSpaces(\preg_replace('/[\.]+/', '.', $sFileName)); - $sExt = \MailSo\Base\Utils::GetFileExtension($sClearedFileName); - - if (10 < $iMaxLength && $iMaxLength < \strlen($sClearedFileName) - \strlen($sExt)) - { - $sClearedFileName = \substr($sClearedFileName, 0, $iMaxLength).(empty($sExt) ? '' : '.'.$sExt); - } - - return \MailSo\Base\Utils::ClearFileName(\MailSo\Base\Utils::Utf8Clear($sClearedFileName)); - } - - /** - * @return array - */ - public function DoMessageUploadAttachments() - { - $oAccount = $this->initMailClientConnection(); - - $mResult = false; - $self = $this; - - try - { - $aAttachments = $this->GetActionParam('Attachments', array()); - if (\is_array($aAttachments) && 0 < \count($aAttachments)) - { - $mResult = array(); - foreach ($aAttachments as $sAttachment) - { - $aValues = \RainLoop\Utils::DecodeKeyValuesQ($sAttachment); - if (\is_array($aValues)) - { - $sFolder = isset($aValues['Folder']) ? $aValues['Folder'] : ''; - $iUid = (int) isset($aValues['Uid']) ? $aValues['Uid'] : 0; - $sMimeIndex = (string) isset($aValues['MimeIndex']) ? $aValues['MimeIndex'] : ''; - - $sTempName = \md5($sAttachment); - if (!$this->FilesProvider()->FileExists($oAccount, $sTempName)) - { - $this->MailClient()->MessageMimeStream( - function($rResource, $sContentType, $sFileName, $sMimeIndex = '') use ($oAccount, &$mResult, $sTempName, $sAttachment, $self) { - if (is_resource($rResource)) - { - $sContentType = (empty($sFileName)) ? 'text/plain' : \MailSo\Base\Utils::MimeContentType($sFileName); - $sFileName = $self->MainClearFileName($sFileName, $sContentType, $sMimeIndex); - - if ($self->FilesProvider()->PutFile($oAccount, $sTempName, $rResource)) - { - $mResult[$sTempName] = $sAttachment; - } - } - }, $sFolder, $iUid, true, $sMimeIndex); - } - else - { - $mResult[$sTempName] = $sAttachment; - } - } - } - } - } - catch (\Exception $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::MailServerError, $oException); - } - - return $this->DefaultResponse(__FUNCTION__, $mResult); - } - - /** - * @return array - */ - public function DoComposeUploadExternals() - { - $oAccount = $this->getAccountFromToken(); - - $mResult = false; - $aExternals = $this->GetActionParam('Externals', array()); - if (\is_array($aExternals) && 0 < \count($aExternals)) - { - $oHttp = \MailSo\Base\Http::SingletonInstance(); - - $mResult = array(); - foreach ($aExternals as $sUrl) - { - $mResult[$sUrl] = ''; - - $sTempName = \md5($sUrl); - - $iCode = 0; - $sContentType = ''; - - $rFile = $this->FilesProvider()->GetFile($oAccount, $sTempName, 'wb+'); - if ($rFile && $oHttp->SaveUrlToFile($sUrl, $rFile, '', $sContentType, $iCode, $this->Logger(), 60, - $this->Config()->Get('labs', 'curl_proxy', ''), $this->Config()->Get('labs', 'curl_proxy_auth', ''))) - { - $mResult[$sUrl] = $sTempName; - } - - if (\is_resource($rFile)) - { - @\fclose($rFile); - } - } - } - - return $this->DefaultResponse(__FUNCTION__, $mResult); - } - - /** - * @return array - */ - public function DoComposeUploadDrive() - { - $oAccount = $this->getAccountFromToken(); - - $mResult = false; - - $sUrl = $this->GetActionParam('Url', ''); - $sAccessToken = $this->GetActionParam('AccessToken', ''); - $sGoogleApiKey = (string) $this->Config()->Get('social', 'google_api_key', ''); - - if (0 < \strlen($sUrl) && 0 < \strlen($sAccessToken) && 0 < \strlen($sGoogleApiKey)) - { - $oHttp = \MailSo\Base\Http::SingletonInstance(); - - $mResult[$sUrl] = false; - - $sTempName = \md5($sUrl); - - $iCode = 0; - $sContentType = ''; - - $rFile = $this->FilesProvider()->GetFile($oAccount, $sTempName, 'wb+'); - if ($rFile && $oHttp->SaveUrlToFile($sUrl.'&key='.$sGoogleApiKey, $rFile, '', $sContentType, $iCode, $this->Logger(), 60, - $this->Config()->Get('labs', 'curl_proxy', ''), $this->Config()->Get('labs', 'curl_proxy_auth', ''), - array('Authorization: Bearer '.$sAccessToken))) - { - $mResult[$sUrl] = array($sTempName, 0); - } - - if (\is_resource($rFile)) - { - @\fclose($rFile); - } - - if (isset($mResult[$sUrl][1])) - { - $mResult[$sUrl][1] = $rFile = $this->FilesProvider()->FileSize($oAccount, $sTempName); - } - } - - return $this->DefaultResponse(__FUNCTION__, $mResult); - } - - /** - * @return array - */ - public function DoSocialUsers() - { - $oAccount = $this->getAccountFromToken(); - - $oSettings = $this->SettingsProvider()->Load($oAccount); - - $aData = array( - 'Google' => '', - 'Facebook' => '', - 'Twitter' => '' - ); - - if ($oSettings) - { - $aData['Google'] = $oSettings->GetConf('GoogleSocialName', ''); - $aData['Facebook'] = $oSettings->GetConf('FacebookSocialName', ''); - $aData['Twitter'] = $oSettings->GetConf('TwitterSocialName', ''); - } - - return $this->DefaultResponse(__FUNCTION__, $aData); - } - - /** - * @return array - */ - public function DoSocialGoogleDisconnect() - { - $oAccount = $this->getAccountFromToken(); - return $this->DefaultResponse(__FUNCTION__, $this->Social()->GoogleDisconnect($oAccount)); - } - - /** - * @return array - */ - public function DoSocialTwitterDisconnect() - { - $oAccount = $this->getAccountFromToken(); - return $this->DefaultResponse(__FUNCTION__, $this->Social()->TwitterDisconnect($oAccount)); - } - - /** - * @return array - */ - public function DoSocialFacebookDisconnect() - { - $oAccount = $this->getAccountFromToken(); - return $this->DefaultResponse(__FUNCTION__, $this->Social()->FacebookDisconnect($oAccount)); - } - - /** - * @param int $iError - * @param int $iClientError - * - * @return string - */ - private function getUploadErrorMessageByCode($iError, &$iClientError) - { - $sError = ''; - $iClientError = UploadClientError::NORMAL; - switch($iError) - { - case UPLOAD_ERR_OK: - break; - case UPLOAD_ERR_INI_SIZE: - case UPLOAD_ERR_FORM_SIZE: - case UploadError::CONFIG_SIZE: - case UploadError::EMPTY_FILES_DATA: - $sError = 'File is too big'; - $iClientError = UploadClientError::FILE_IS_TOO_BIG; - break; - case UPLOAD_ERR_PARTIAL: - $sError = 'File partially uploaded'; - $iClientError = UploadClientError::FILE_PARTIALLY_UPLOADED; - break; - case UPLOAD_ERR_NO_FILE: - $sError = 'No file uploaded'; - $iClientError = UploadClientError::FILE_NO_UPLOADED; - break; - case UPLOAD_ERR_NO_TMP_DIR: - case UPLOAD_ERR_CANT_WRITE: - case UPLOAD_ERR_EXTENSION: - $sError = 'Missing temp folder'; - $iClientError = UploadClientError::MISSING_TEMP_FOLDER; - break; - case UploadError::ON_SAVING: - $sError = 'Error on saving file'; - $iClientError = UploadClientError::FILE_ON_SAVING_ERROR; - break; - case UploadError::FILE_TYPE: - $sError = 'Invalid file type'; - $iClientError = UploadClientError::FILE_TYPE; - break; - case UploadError::UNKNOWN: - default: - $sError = 'Unknown error'; - $iClientError = UploadClientError::UNKNOWN; - break; - } - - return $sError; - } - - /** - * @return array - */ - public function Upload() - { - $oAccount = $this->getAccountFromToken(); - - $aResponse = array(); - - $aFile = $this->GetActionParam('File', null); - $iError = $this->GetActionParam('Error', \RainLoop\Enumerations\UploadError::UNKNOWN); - - if ($oAccount && UPLOAD_ERR_OK === $iError && \is_array($aFile)) - { - $sSavedName = 'upload-post-'.\md5($aFile['name'].$aFile['tmp_name']); - if (!$this->FilesProvider()->MoveUploadedFile($oAccount, $sSavedName, $aFile['tmp_name'])) - { - $iError = \RainLoop\Enumerations\UploadError::ON_SAVING; - } - else - { - $sUploadName = $aFile['name']; - $iSize = $aFile['size']; - $sMimeType = $aFile['type']; - - $aResponse['Attachment'] = array( - 'Name' => $sUploadName, - 'TempName' => $sSavedName, - 'MimeType' => $sMimeType, - 'Size' => (int) $iSize - ); - } - } - - if (UPLOAD_ERR_OK !== $iError) - { - $iClientError = \RainLoop\Enumerations\UploadClientError::NORMAL; - $sError = $this->getUploadErrorMessageByCode($iError, $iClientError); - - if (!empty($sError)) - { - $aResponse['ErrorCode'] = $iClientError; - $aResponse['Error'] = $sError; - } - } - - return $this->DefaultResponse(__FUNCTION__, $aResponse); - } - - /** - * @return array - */ - public function DoClearUserBackground() - { - $oAccount = $this->getAccountFromToken(); - - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::USER_BACKGROUND, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $oSettings = $this->SettingsProvider()->Load($oAccount); - if ($oAccount && $oSettings) - { - $this->StorageProvider()->Clear($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'background' - ); - - $oSettings->SetConf('UserBackgroundName', ''); - $oSettings->SetConf('UserBackgroundHash', ''); - } - - return $this->DefaultResponse(__FUNCTION__, $oAccount && $oSettings ? - $this->SettingsProvider()->Save($oAccount, $oSettings) : false); - } - - /** - * @return array - */ - public function UploadBackground() - { - $oAccount = $this->getAccountFromToken(); - - if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::USER_BACKGROUND, $oAccount)) - { - return $this->FalseResponse(__FUNCTION__); - } - - $sName = ''; - $sHash = ''; - - $aFile = $this->GetActionParam('File', null); - $iError = $this->GetActionParam('Error', \RainLoop\Enumerations\UploadError::UNKNOWN); - - if ($oAccount && UPLOAD_ERR_OK === $iError && \is_array($aFile)) - { - $sMimeType = \strtolower(\MailSo\Base\Utils::MimeContentType($aFile['name'])); - if (\in_array($sMimeType, array('image/png', 'image/jpg', 'image/jpeg'))) - { - $sSavedName = 'upload-post-'.\md5($aFile['name'].$aFile['tmp_name']); - if (!$this->FilesProvider()->MoveUploadedFile($oAccount, $sSavedName, $aFile['tmp_name'])) - { - $iError = \RainLoop\Enumerations\UploadError::ON_SAVING; - } - else - { - $rData = $this->FilesProvider()->GetFile($oAccount, $sSavedName); - if (@\is_resource($rData)) - { - $sData = @\stream_get_contents($rData); - if (!empty($sData) && 0 < \strlen($sData)) - { - $sName = $aFile['name']; - if (empty($sName)) - { - $sName = '_'; - } - - if ($this->StorageProvider()->Put($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'background', - \json_encode(array( - 'Name' => $aFile['name'], - 'ContentType' => $sMimeType, - 'Raw' => \base64_encode($sData) - )) - )) - { - $oSettings = $this->SettingsProvider()->Load($oAccount); - if ($oSettings) - { - $sHash = \MailSo\Base\Utils::Md5Rand($sName.APP_VERSION.APP_SALT); - - $oSettings->SetConf('UserBackgroundName', $sName); - $oSettings->SetConf('UserBackgroundHash', $sHash); - $this->SettingsProvider()->Save($oAccount, $oSettings); - } - } - } - - unset($sData); - } - - if (@\is_resource($rData)) - { - @\fclose($rData); - } - - unset($rData); - } - - $this->FilesProvider()->Clear($oAccount, $sSavedName); - } - else - { - $iError = \RainLoop\Enumerations\UploadError::FILE_TYPE; - } - } - - if (UPLOAD_ERR_OK !== $iError) - { - $iClientError = \RainLoop\Enumerations\UploadClientError::NORMAL; - $sError = $this->getUploadErrorMessageByCode($iError, $iClientError); - - if (!empty($sError)) - { - return $this->FalseResponse(__FUNCTION__, $iClientError, $sError); - } - } - - return $this->DefaultResponse(__FUNCTION__, !empty($sName) && !empty($sHash) ? array( - 'Name' => $sName, - 'Hash' => $sHash - ) : false); - } - - /** - * @return array - */ - public function UploadContacts() - { - $oAccount = $this->getAccountFromToken(); - - $mResponse = false; - - $aFile = $this->GetActionParam('File', null); - $iError = $this->GetActionParam('Error', \RainLoop\Enumerations\UploadError::UNKNOWN); - - if ($oAccount && UPLOAD_ERR_OK === $iError && \is_array($aFile)) - { - $sSavedName = 'upload-post-'.\md5($aFile['name'].$aFile['tmp_name']); - if (!$this->FilesProvider()->MoveUploadedFile($oAccount, $sSavedName, $aFile['tmp_name'])) - { - $iError = \RainLoop\Enumerations\UploadError::ON_SAVING; - } - else - { - @\ini_set('auto_detect_line_endings', true); - $mData = $this->FilesProvider()->GetFile($oAccount, $sSavedName); - if ($mData) - { - $sFileStart = @\fread($mData, 20); - \rewind($mData); - - if (false !== $sFileStart) - { - $sFileStart = \trim($sFileStart); - if (false !== \strpos($sFileStart, 'BEGIN:VCARD')) - { - $mResponse = $this->importContactsFromVcfFile($oAccount, $mData); - } - else if (false !== \strpos($sFileStart, ',') || false !== \strpos($sFileStart, ';')) - { - $mResponse = $this->importContactsFromCsvFile($oAccount, $mData, $sFileStart); - } - } - } - - if (\is_resource($mData)) - { - @\fclose($mData); - } - - unset($mData); - $this->FilesProvider()->Clear($oAccount, $sSavedName); - - @\ini_set('auto_detect_line_endings', false); - } - } - - if (UPLOAD_ERR_OK !== $iError) - { - $iClientError = \RainLoop\Enumerations\UploadClientError::NORMAL; - $sError = $this->getUploadErrorMessageByCode($iError, $iClientError); - - if (!empty($sError)) - { - return $this->FalseResponse(__FUNCTION__, $iClientError, $sError); - } - } - - return $this->DefaultResponse(__FUNCTION__, $mResponse); - } - - /** - * @param \RainLoop\Model\Account $oAccount - * @param resource $rFile - * @param string $sFileStart - * - * @return int - */ - private function importContactsFromCsvFile($oAccount, $rFile, $sFileStart) - { - $iCount = 0; - $aHeaders = null; - $aData = array(); - - if ($oAccount && \is_resource($rFile)) - { - $oAddressBookProvider = $this->AddressBookProvider($oAccount); - if ($oAddressBookProvider && $oAddressBookProvider->IsActive()) - { - $sDelimiter = ((int) \strpos($sFileStart, ',') > (int) \strpos($sFileStart, ';')) ? ',' : ';'; - - @\setlocale(LC_CTYPE, 'en_US.UTF-8'); - while (false !== ($mRow = \fgetcsv($rFile, 5000, $sDelimiter, '"'))) - { - if (null === $aHeaders) - { - if (3 >= \count($mRow)) - { - return 0; - } - - $aHeaders = $mRow; - - foreach ($aHeaders as $iIndex => $sHeaderValue) - { - $aHeaders[$iIndex] = \MailSo\Base\Utils::Utf8Clear($sHeaderValue); - } - } - else - { - $aNewItem = array(); - foreach ($aHeaders as $iIndex => $sHeaderValue) - { - $aNewItem[$sHeaderValue] = isset($mRow[$iIndex]) ? $mRow[$iIndex] : ''; - } - - $aData[] = $aNewItem; - } - } - - if (\is_array($aData) && 0 < \count($aData)) - { - $this->Logger()->Write('Import contacts from csv'); - $iCount = $oAddressBookProvider->ImportCsvArray($oAccount->ParentEmailHelper(), $aData); - } - } - } - - return $iCount; - } - - /** - * @param \RainLoop\Model\Account $oAccount - * @param resource $rFile - * - * @return int - */ - private function importContactsFromVcfFile($oAccount, $rFile) - { - $iCount = 0; - if ($oAccount && \is_resource($rFile)) - { - $oAddressBookProvider = $this->AddressBookProvider($oAccount); - if ($oAddressBookProvider && $oAddressBookProvider->IsActive()) - { - $sFile = \stream_get_contents($rFile); - if (\is_resource($rFile)) - { - \fclose($rFile); - } - - if (is_string($sFile) && 5 < \strlen($sFile)) - { - $this->Logger()->Write('Import contacts from vcf'); - $iCount = $oAddressBookProvider->ImportVcfFile($oAccount->ParentEmailHelper(), $sFile); - } - } - } - - return $iCount; - } - - /** - * @return bool - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function RawViewAsPlain() - { - $this->initMailClientConnection(); - - $sRawKey = (string) $this->GetActionParam('RawKey', ''); - $aValues = $this->getDecodedRawKeyValue($sRawKey); - - $sFolder = isset($aValues['Folder']) ? $aValues['Folder'] : ''; - $iUid = (int) (isset($aValues['Uid']) ? $aValues['Uid'] : 0); - $sMimeIndex = (string) (isset($aValues['MimeIndex']) ? $aValues['MimeIndex'] : ''); - - \header('Content-Type: text/plain', true); - - return $this->MailClient()->MessageMimeStream(function ($rResource) { - if (\is_resource($rResource)) - { - \MailSo\Base\Utils::FpassthruWithTimeLimitReset($rResource); - } - }, $sFolder, $iUid, true, $sMimeIndex); - } - - /** - * @return string - */ - public function RawFramedView() - { - $oAccount = $this->getAccountFromToken(false); - if ($oAccount) - { - $sRawKey = (string) $this->GetActionParam('RawKey', ''); - $aParams = $this->GetActionParam('Params', null); - $this->Http()->ServerNoCache(); - - $aData = \RainLoop\Utils::DecodeKeyValuesQ($sRawKey); - if (isset($aParams[0], $aParams[1], $aParams[2]) && - 'Raw' === $aParams[0] && 'FramedView' === $aParams[2] && isset($aData['Framed']) && $aData['Framed'] && $aData['FileName']) - { - if ($this->isFileHasFramedPreview($aData['FileName'])) - { - $sNewSpecAuthToken = $this->GetShortLifeSpecAuthToken(); - if (!empty($sNewSpecAuthToken)) - { - $aParams[1] = '_'.$sNewSpecAuthToken; - $aParams[2] = 'View'; - - \array_shift($aParams); - $sLast = \array_pop($aParams); - - $sUrl = $this->Http()->GetFullUrl().'?/Raw/&q[]=/'.\implode('/', $aParams).'/&q[]=/'.$sLast; - $sFullUrl = 'https://docs.google.com/viewer?embedded=true&url='.\urlencode($sUrl); - - @\header('Content-Type: text/html; charset=utf-8'); - echo ''. - ''. - ''. - ''; - } - } - } - } - - - return true; - - } - - /** - * @return bool - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function Append() - { - $oAccount = $this->initMailClientConnection(); - - $sFolderFullNameRaw = $this->GetActionParam('Folder', ''); - - $_FILES = isset($_FILES) ? $_FILES : null; - if ($oAccount instanceof \RainLoop\Model\Account && - $this->Config()->Get('labs', 'allow_message_append', false) && - isset($_FILES, $_FILES['AppendFile'], $_FILES['AppendFile']['name'], - $_FILES['AppendFile']['tmp_name'], $_FILES['AppendFile']['size'])) - { - if (is_string($_FILES['AppendFile']['tmp_name']) && 0 < strlen($_FILES['AppendFile']['tmp_name'])) - { - if (\UPLOAD_ERR_OK === (int) $_FILES['AppendFile']['error'] && !empty($sFolderFullNameRaw)) - { - $sSavedName = 'append-post-'.md5($sFolderFullNameRaw.$_FILES['AppendFile']['name'].$_FILES['AppendFile']['tmp_name']); - - if ($this->FilesProvider()->MoveUploadedFile($oAccount, - $sSavedName, $_FILES['AppendFile']['tmp_name'])) - { - $iMessageStreamSize = $this->FilesProvider()->FileSize($oAccount, $sSavedName); - $rMessageStream = $this->FilesProvider()->GetFile($oAccount, $sSavedName); - - $this->MailClient()->MessageAppendStream($rMessageStream, $iMessageStreamSize, $sFolderFullNameRaw); - - $this->FilesProvider()->Clear($oAccount, $sSavedName); - } - } - } - } - - return $this->DefaultResponse(__FUNCTION__, true); - } - - /** - * @param bool $bAdmin - * @param bool $bMobile = false - * @param \RainLoop\Model\Account $oAccount = null - * - * @return array - */ - public function Capa($bAdmin, $bMobile = false, $oAccount = null) - { - $oConfig = $this->Config(); - - $aResult = array(); - - if ($oConfig->Get('capa', 'folders', true)) - { - $aResult[] = \RainLoop\Enumerations\Capa::FOLDERS; - - if ($oConfig->Get('capa', 'messagelist_actions', true)) - { - $aResult[] = \RainLoop\Enumerations\Capa::MESSAGELIST_ACTIONS; - - if ($oConfig->Get('capa', 'dangerous_actions', true)) - { - $aResult[] = \RainLoop\Enumerations\Capa::DANGEROUS_ACTIONS; - } - } - } - - if ($oConfig->Get('capa', 'reload', true)) - { - $aResult[] = \RainLoop\Enumerations\Capa::RELOAD; - } - - if ($oConfig->Get('capa', 'quota', true)) - { - $aResult[] = \RainLoop\Enumerations\Capa::QUOTA; - } - - if ($oConfig->Get('capa', 'settings', true)) - { - $aResult[] = \RainLoop\Enumerations\Capa::SETTINGS; - - if ($oConfig->Get('webmail', 'allow_additional_accounts', false)) - { - $aResult[] = \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS; - } - - if ($oConfig->Get('webmail', 'allow_additional_identities', false)) - { - $aResult[] = \RainLoop\Enumerations\Capa::IDENTITIES; - } - - if ($oConfig->Get('capa', 'x-templates', true) && !$bMobile) - { - $aResult[] = \RainLoop\Enumerations\Capa::TEMPLATES; - } - - if ($oConfig->Get('webmail', 'allow_themes', false) && !$bMobile) - { - $aResult[] = \RainLoop\Enumerations\Capa::THEMES; - } - - if ($oConfig->Get('webmail', 'allow_user_background', false) && !$bMobile) - { - $aResult[] = \RainLoop\Enumerations\Capa::USER_BACKGROUND; - } - - if ($oConfig->Get('security', 'openpgp', false) && !$bMobile) - { - $aResult[] = \RainLoop\Enumerations\Capa::OPEN_PGP; - } - - if ($oConfig->Get('capa', 'filters', false)) - { - $aResult[] = \RainLoop\Enumerations\Capa::FILTERS; - if ($bAdmin || ($oAccount && $oAccount->Domain()->UseSieve())) - { - $aResult[] = \RainLoop\Enumerations\Capa::SIEVE; - } - } - } - - if ($oConfig->Get('security', 'allow_two_factor_auth', false) && - ($bAdmin || ($oAccount && !$oAccount->IsAdditionalAccount()))) - { - $aResult[] = \RainLoop\Enumerations\Capa::TWO_FACTOR; - - if ($oConfig->Get('security', 'force_two_factor_auth', false) && - ($bAdmin || ($oAccount && !$oAccount->IsAdditionalAccount()))) - { - $aResult[] = \RainLoop\Enumerations\Capa::TWO_FACTOR_FORCE; - } - } - - if ($oConfig->Get('capa', 'help', true) && !$bMobile) - { - $aResult[] = \RainLoop\Enumerations\Capa::HELP; - } - - if ($oConfig->Get('capa', 'attachments_actions', false)) - { - $aResult[] = \RainLoop\Enumerations\Capa::ATTACHMENTS_ACTIONS; - } - - if ($oConfig->Get('capa', 'message_actions', true)) - { - $aResult[] = \RainLoop\Enumerations\Capa::MESSAGE_ACTIONS; - } - - if ($oConfig->Get('capa', 'composer', true)) - { - $aResult[] = \RainLoop\Enumerations\Capa::COMPOSER; - - if ($oConfig->Get('capa', 'contacts', true)) - { - $aResult[] = \RainLoop\Enumerations\Capa::CONTACTS; - } - } - - if ($oConfig->Get('capa', 'search', true)) - { - $aResult[] = \RainLoop\Enumerations\Capa::SEARCH; - - if ($oConfig->Get('capa', 'search_adv', true) && !$bMobile) - { - $aResult[] = \RainLoop\Enumerations\Capa::SEARCH_ADV; - } - } - - if ($oConfig->Get('labs', 'allow_gravatar', false)) - { - $aResult[] = \RainLoop\Enumerations\Capa::GRAVATAR; - } - - if ($oConfig->Get('interface', 'show_attachment_thumbnail', true)) - { - $aResult[] = \RainLoop\Enumerations\Capa::ATTACHMENT_THUMBNAILS; - } - - if ($oConfig->Get('labs', 'allow_prefetch', false) && !$bMobile) - { - $aResult[] = \RainLoop\Enumerations\Capa::PREFETCH; - } - - if (!\RainLoop\Utils::IsOwnCloud()) - { - $aResult[] = \RainLoop\Enumerations\Capa::AUTOLOGOUT; - } - - return $aResult; - } - - /** - * @param bool $bAdmin - * @param bool $bMobile - * @param string $sName - * @param \RainLoop\Model\Account $oAccount = null - * - * @return bool - */ - public function GetCapa($bAdmin, $bMobile, $sName, $oAccount = null) - { - return \in_array($sName, $this->Capa($bAdmin, $bMobile, $oAccount)); - } - - /** - * @param string $sKey - * - * @return string - */ - public function etag($sKey) - { - return \md5('Etag:'.\md5($sKey.\md5($this->Config()->Get('cache', 'index', '')))); - } - - /** - * @param string $sKey - * @param bool $bForce = false - * - * @return bool - */ - public function cacheByKey($sKey, $bForce = false) - { - $bResult = false; - if (!empty($sKey) && ($bForce || ($this->Config()->Get('cache', 'enable', true) && $this->Config()->Get('cache', 'http', true)))) - { - $iExpires = $this->Config()->Get('cache', 'http_expires', 3600); - if (0 < $iExpires) - { - $this->oHttp->ServerUseCache($this->etag($sKey), 1382478804, time() + $iExpires); - $bResult = true; - } - } - - if (!$bResult) - { - $this->oHttp->ServerNoCache(); - } - - return $bResult; - } - - /** - * @param string $sKey - * @param bool $bForce = false - * - * @return void - */ - public function verifyCacheByKey($sKey, $bForce = false) - { - if (!empty($sKey) && ($bForce || $this->Config()->Get('cache', 'enable', true) && $this->Config()->Get('cache', 'http', true))) - { - $sIfNoneMatch = $this->Http()->GetHeader('If-None-Match', ''); - if ($this->etag($sKey) === $sIfNoneMatch) - { - $this->Http()->StatusHeader(304); - $this->cacheByKey($sKey); - exit(0); - } - } - } - - /** - * @param \RainLoop\Model\Account $oAccount - * @param string $sHash - * - * @return array - */ - private function getMimeFileByHash($oAccount, $sHash) - { - $aValues = $this->getDecodedRawKeyValue($sHash); - - $sFolder = isset($aValues['Folder']) ? $aValues['Folder'] : ''; - $iUid = (int) isset($aValues['Uid']) ? $aValues['Uid'] : 0; - $sMimeIndex = (string) isset($aValues['MimeIndex']) ? $aValues['MimeIndex'] : ''; - - $sContentTypeIn = (string) isset($aValues['MimeType']) ? $aValues['MimeType'] : ''; - $sFileNameIn = (string) isset($aValues['FileName']) ? $aValues['FileName'] : ''; - - $oFileProvider = $this->FilesProvider(); - - $sResultHash = ''; - - $mResult = $this->MailClient()->MessageMimeStream(function($rResource, $sContentType, $sFileName, $sMimeIndex = '') - use ($oAccount, $oFileProvider, $sFileNameIn, $sContentTypeIn, &$sResultHash) { - - unset($sContentType, $sFileName, $sMimeIndex); - - if ($oAccount && \is_resource($rResource)) - { - $sHash = \MailSo\Base\Utils::Md5Rand($sFileNameIn.'~'.$sContentTypeIn); - $rTempResource = $oFileProvider->GetFile($oAccount, $sHash, 'wb+'); - - if (@\is_resource($rTempResource)) - { - if (false !== \MailSo\Base\Utils::MultipleStreamWriter($rResource, array($rTempResource))) - { - $sResultHash = $sHash; - } - - @\fclose($rTempResource); - } - } - - }, $sFolder, $iUid, true, $sMimeIndex); - - $aValues['FileHash'] = ''; - if ($mResult) - { - $aValues['FileHash'] = $sResultHash; - } - - return $aValues; - } - - /** - * @param \Imagine\Image\AbstractImage $oImage - * @param int $iOrientation - */ - private function rotateImageByOrientation(&$oImage, $iOrientation) - { - if (0 < $iOrientation) - { - switch ($iOrientation) - { - default: - case 1: - break; - - case 2: // flip horizontal - $oImage->flipHorizontally(); - break; - - case 3: // rotate 180 - $oImage->rotate(180); - break; - - case 4: // flip vertical - $oImage->flipVertically(); - break; - - case 5: // vertical flip + 90 rotate - $oImage->flipVertically(); - $oImage->rotate(90); - break; - - case 6: // rotate 90 - $oImage->rotate(90); - break; - - case 7: // horizontal flip + 90 rotate - $oImage->flipHorizontally(); - $oImage->rotate(90); - break; - - case 8: // rotate 270 - $oImage->rotate(270); - break; - } - } - } - - /** - * @param \Imagine\Image\AbstractImage $oImage - */ - public function correctImageOrientation($oImage, $bDetectImageOrientation = true, $iThumbnailBoxSize = null) - { - $iOrientation = 1; - if ($bDetectImageOrientation && \MailSo\Base\Utils::FunctionExistsAndEnabled('exif_read_data') && - \MailSo\Base\Utils::FunctionExistsAndEnabled('gd_info')) - { - $oMetadata = $oImage->metadata(new \Imagine\Image\Metadata\ExifMetadataReader()); - $iOrientation = isset($oMetadata['ifd0.Orientation']) && - is_numeric($oMetadata['ifd0.Orientation']) ? (int) $oMetadata['ifd0.Orientation'] : 1; - } - - if ($iThumbnailBoxSize && 0 < $iThumbnailBoxSize) - { - $oImage = $oImage->thumbnail( - new \Imagine\Image\Box($iThumbnailBoxSize, $iThumbnailBoxSize), - \Imagine\Image\ImageInterface::THUMBNAIL_OUTBOUND); - - $this->rotateImageByOrientation($oImage, $iOrientation); - } - else - { - $this->rotateImageByOrientation($oImage, $iOrientation); - } - - return $oImage; - } - - /** - * @param bool $bDownload - * @param bool $bThumbnail = false - * - * @return bool - */ - private function rawSmart($bDownload, $bThumbnail = false) - { - $sRawKey = (string) $this->GetActionParam('RawKey', ''); - $aValues = $this->getDecodedRawKeyValue($sRawKey); - - $sRange = $this->Http()->GetHeader('Range'); - - $aMatch = array(); - $sRangeStart = $sRangeEnd = ''; - $bIsRangeRequest = false; - - if (!empty($sRange) && 'bytes=0-' !== \strtolower($sRange) && \preg_match('/^bytes=([0-9]+)-([0-9]*)/i', \trim($sRange), $aMatch)) - { - $sRangeStart = $aMatch[1]; - $sRangeEnd = $aMatch[2]; - - $bIsRangeRequest = true; - } - - $sFolder = isset($aValues['Folder']) ? $aValues['Folder'] : ''; - $iUid = isset($aValues['Uid']) ? (int) $aValues['Uid'] : 0; - $sMimeIndex = isset($aValues['MimeIndex']) ? (string) $aValues['MimeIndex'] : ''; - - $sContentTypeIn = isset($aValues['MimeType']) ? (string) $aValues['MimeType'] : ''; - $sFileNameIn = isset($aValues['FileName']) ? (string) $aValues['FileName'] : ''; - $sFileHashIn = isset($aValues['FileHash']) ? (string) $aValues['FileHash'] : ''; - - $bDetectImageOrientation = !!$this->Config()->Get('labs', 'detect_image_exif_orientation', true); - - if (!empty($sFileHashIn)) - { - $this->verifyCacheByKey($sRawKey); - - $oAccount = $this->getAccountFromToken(); - - $sContentTypeOut = empty($sContentTypeIn) ? - \MailSo\Base\Utils::MimeContentType($sFileNameIn) : $sContentTypeIn; - - $sFileNameOut = $this->MainClearFileName($sFileNameIn, $sContentTypeIn, $sMimeIndex); - - $rResource = $this->FilesProvider()->GetFile($oAccount, $sFileHashIn); - if (\is_resource($rResource)) - { - $sFileNameOut = \MailSo\Base\Utils::ConvertEncoding( - $sFileNameOut, \MailSo\Base\Enumerations\Charset::UTF_8, - \MailSo\Base\Enumerations\Charset::CP858); - - \header('Content-Type: '.$sContentTypeOut); - \header('Content-Disposition: attachment; '. - \trim(\MailSo\Base\Utils::EncodeHeaderUtf8AttributeValue('filename', $sFileNameOut)), true); - - \header('Accept-Ranges: none', true); - \header('Content-Transfer-Encoding: binary'); - - \MailSo\Base\Utils::FpassthruWithTimeLimitReset($rResource); - return true; - } - - return false; - } - else - { - if (!empty($sFolder) && 0 < $iUid) - { - $this->verifyCacheByKey($sRawKey); - } - } - - $oAccount = $this->initMailClientConnection(); - - $self = $this; - return $this->MailClient()->MessageMimeStream( - function($rResource, $sContentType, $sFileName, $sMimeIndex = '') use ( - $self, $oAccount, $sRawKey, $sContentTypeIn, $sFileNameIn, $bDownload, $bThumbnail, $bDetectImageOrientation, - $bIsRangeRequest, $sRangeStart, $sRangeEnd - ) { - if ($oAccount && \is_resource($rResource)) - { - \MailSo\Base\Utils::ResetTimeLimit(); - - $sContentTypeOut = $sContentTypeIn; - if (empty($sContentTypeOut)) - { - $sContentTypeOut = $sContentType; - if (empty($sContentTypeOut)) - { - $sContentTypeOut = (empty($sFileName)) ? 'text/plain' : \MailSo\Base\Utils::MimeContentType($sFileName); - } - } - - $sFileNameOut = $sFileNameIn; - if (empty($sFileNameOut)) - { - $sFileNameOut = $sFileName; - } - - $sFileNameOut = $self->MainClearFileName($sFileNameOut, $sContentTypeOut, $sMimeIndex); - - $self->cacheByKey($sRawKey); - - $sLoadedData = null; - if (!$bDownload) - { - if ($bThumbnail) - { - try - { - $oImagine = new \Imagine\Gd\Imagine(); - - $oImage = $oImagine->load(\stream_get_contents($rResource)); - - $oImage = $self->correctImageOrientation($oImage, $bDetectImageOrientation, 60); - - \header('Content-Disposition: inline; '. - \trim(\MailSo\Base\Utils::EncodeHeaderUtf8AttributeValue('filename', $sFileNameOut.'_thumb60x60.png')), true); - - $oImage->show('png'); - } - catch (\Exception $oException) - { - $self->Logger()->WriteExceptionShort($oException); - } - } - else if ($bDetectImageOrientation && - \in_array($sContentTypeOut, array('image/png', 'image/jpeg', 'image/jpg')) && - \MailSo\Base\Utils::FunctionExistsAndEnabled('gd_info')) - { - try - { - $oImagine = new \Imagine\Gd\Imagine(); - - $sLoadedData = \stream_get_contents($rResource); - - $oImage = $oImagine->load($sLoadedData); - - $oImage = $self->correctImageOrientation($oImage, $bDetectImageOrientation); - - \header('Content-Disposition: inline; '. - \trim(\MailSo\Base\Utils::EncodeHeaderUtf8AttributeValue('filename', $sFileNameOut)), true); - - $oImage->show($sContentTypeOut === 'image/png' ? 'png' : 'jpg'); - } - catch (\Exception $oException) - { - $self->Logger()->WriteExceptionShort($oException); - } - } - else - { - $sLoadedData = \stream_get_contents($rResource); - } - } - - if ($bDownload || $sLoadedData) - { - if (!headers_sent()) { - \header('Content-Type: '.$sContentTypeOut); - \header('Content-Disposition: '.($bDownload ? 'attachment' : 'inline').'; '. - \trim(\MailSo\Base\Utils::EncodeHeaderUtf8AttributeValue('filename', $sFileNameOut)), true); - - \header('Accept-Ranges: bytes'); - \header('Content-Transfer-Encoding: binary'); - } - - if ($bIsRangeRequest && !$sLoadedData) - { - $sLoadedData = \stream_get_contents($rResource); - } - - \MailSo\Base\Utils::ResetTimeLimit(); - - if ($sLoadedData) - { - if ($bIsRangeRequest && (0 < \strlen($sRangeStart) || 0 < \strlen($sRangeEnd))) - { - $iFullContentLength = \strlen($sLoadedData); - - $self->Http()->StatusHeader(206); - - $iRangeStart = (int) $sRangeStart; - $iRangeEnd = (int) $sRangeEnd; - - if ('' === $sRangeEnd) - { - $sLoadedData = 0 < $iRangeStart ? \substr($sLoadedData, $iRangeStart) : $sLoadedData; - } - else - { - if ($iRangeStart < $iRangeEnd) - { - $sLoadedData = \substr($sLoadedData, $iRangeStart, $iRangeEnd - $iRangeStart); - } - else - { - $sLoadedData = 0 < $iRangeStart ? \substr($sLoadedData, $iRangeStart) : $sLoadedData; - } - } - - $iContentLength = \strlen($sLoadedData); - - if (0 < $iContentLength) - { - \header('Content-Length: '.$iContentLength, true); - \header('Content-Range: bytes '.$sRangeStart.'-'.(0 < $iRangeEnd ? $iRangeEnd : $iFullContentLength - 1).'/'.$iFullContentLength); - } - - echo $sLoadedData; - } - else - { - echo $sLoadedData; - } - - unset($sLoadedData); - } - else - { - \MailSo\Base\Utils::FpassthruWithTimeLimitReset($rResource); - } - } - } - }, $sFolder, $iUid, true, $sMimeIndex); - } - - /** - * @return bool - */ - public function RawDownload() - { - return $this->rawSmart(true); - } - - /** - * @return bool - */ - public function RawView() - { - return $this->rawSmart(false); - } - - /** - * @return bool - */ - public function RawViewThumbnail() - { - return $this->rawSmart(false, true); - } - - /** - * @return bool - */ - public function RawUserBackground() - { - $sRawKey = (string) $this->GetActionParam('RawKey', ''); - $this->verifyCacheByKey($sRawKey); - - $oAccount = $this->getAccountFromToken(); - - $sData = $this->StorageProvider()->Get($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, - 'background' - ); - - if (!empty($sData)) - { - $aData = \json_decode($sData, true); - unset($sData); - - if (!empty($aData['ContentType']) && !empty($aData['Raw']) && - \in_array($aData['ContentType'], array('image/png', 'image/jpg', 'image/jpeg'))) - { - $this->cacheByKey($sRawKey); - - @\header('Content-Type: '.$aData['ContentType']); - echo \base64_decode($aData['Raw']); - unset($aData); - - return true; - } - } - - return false; - } - - /** - * @return bool - */ - public function RawPublic() - { - $sRawKey = (string) $this->GetActionParam('RawKey', ''); - $this->verifyCacheByKey($sRawKey); - - $sHash = $sRawKey; - $sData = ''; - - if (!empty($sHash)) - { - $sData = $this->StorageProvider()->Get(null, - \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, - \RainLoop\KeyPathHelper::PublicFile($sHash) - ); - } - - $aMatch = array(); - if (!empty($sData) && 0 === \strpos($sData, 'data:') && - \preg_match('/^data:([^:]+):/', $sData, $aMatch) && !empty($aMatch[1])) - { - $sContentType = \trim($aMatch[1]); - if (\in_array($sContentType, array('image/png', 'image/jpg', 'image/jpeg'))) - { - $this->cacheByKey($sRawKey); - - @\header('Content-Type: '.$sContentType); - echo \preg_replace('/^data:[^:]+:/', '', $sData); - unset($sData); - - return true; - } - } - - return false; - } - - /** - * @param string $sFileName - * - * @return bool - */ - public function isFileHasFramedPreview($sFileName) - { - $sExt = \MailSo\Base\Utils::GetFileExtension($sFileName); - return \in_array($sExt, array('doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx')); - } - - /** - * @param string $sFileName - * - * @return bool - */ - public function isFileHasThumbnail($sFileName) - { - static $aCache = array(); - - $sExt = \MailSo\Base\Utils::GetFileExtension($sFileName); - if (isset($aCache[$sExt])) - { - return $aCache[$sExt]; - } - - $bResult = \function_exists('gd_info'); - if ($bResult) - { - $bResult = false; - switch ($sExt) - { - case 'png': - $bResult = \function_exists('imagecreatefrompng'); - break; - case 'gif': - $bResult = \function_exists('imagecreatefromgif'); - break; - case 'jpg': - case 'jpeg': - $bResult = \function_exists('imagecreatefromjpeg'); - break; - } - } - - $aCache[$sExt] = $bResult; - - return $bResult; - } - - /** - * @return bool - */ - public function RawAvatar() - { - $sData = ''; - - $sRawKey = (string) $this->GetActionParam('RawKey', ''); - $sRawKey = \urldecode($sRawKey); - - $this->verifyCacheByKey($sRawKey); - - if (0 < \strlen($sRawKey) && \preg_match('/^[^@]+@([^@]+)$/', $sRawKey)) - { - $sEmail = \MailSo\Base\Utils::IdnToAscii($sRawKey, true); - - $iCode = 0; - $sContentType = ''; - - $sGravatarUrl = 'http://gravatar.com/avatar/'.\md5(strtolower($sEmail)).'.jpg?s=80&d=404'; - - $this->Logger()->Write('gravatar: '.$sGravatarUrl); - - $sData = $this->Http()->GetUrlAsString($sGravatarUrl, null, $sContentType, $iCode, null, 5, - $this->Config()->Get('labs', 'curl_proxy', ''), $this->Config()->Get('labs', 'curl_proxy_auth', '')); - - $sContentType = \strtolower(\trim($sContentType)); - if (200 !== $iCode || empty($sData) || !\in_array($sContentType, array('image/jpeg', 'image/jpg', 'image/png'))) - { - $this->Logger()->Write('gravatar: code: '.$iCode.', content-type: '.$sContentType); - - $sData = ''; - - $aMatch = array(); - if (\preg_match('/^[^@]+@([a-z0-9\-\.]+)$/', $sEmail, $aMatch) && !empty($aMatch[1])) - { - $sDomain = $aMatch[1]; - if (\file_exists(APP_VERSION_ROOT_PATH.'app/resources/images/services/'.$sDomain.'.png')) - { - $sContentType = 'image/png'; - $sData = \file_get_contents(APP_VERSION_ROOT_PATH.'app/resources/images/services/'.$sDomain.'.png'); - } - } - } - } - - if (empty($sData) || empty($sContentType)) - { - $sContentType = 'image/png'; - $sData = \file_get_contents(APP_VERSION_ROOT_PATH.'app/resources/images/empty-contact.png'); - } - - $this->cacheByKey($sRawKey); - \header('Content-Type: '.$sContentType); - echo $sData; - return true; - } - - /** - * @return bool - */ - public function RawContactsVcf() - { - $oAccount = $this->getAccountFromToken(); - - \header('Content-Type: text/x-vcard; charset=UTF-8'); - \header('Content-Disposition: attachment; filename="contacts.vcf"', true); - \header('Accept-Ranges: none', true); - \header('Content-Transfer-Encoding: binary'); - - $this->oHttp->ServerNoCache(); - - return $this->AddressBookProvider($oAccount)->IsActive() ? - $this->AddressBookProvider($oAccount)->Export($oAccount->ParentEmailHelper(), 'vcf') : false; - } - - /** - * @return bool - */ - public function RawContactsCsv() - { - $oAccount = $this->getAccountFromToken(); - - \header('Content-Type: text/csv; charset=UTF-8'); - \header('Content-Disposition: attachment; filename="contacts.csv"', true); - \header('Accept-Ranges: none', true); - \header('Content-Transfer-Encoding: binary'); - - $this->oHttp->ServerNoCache(); - - return $this->AddressBookProvider($oAccount)->IsActive() ? - $this->AddressBookProvider($oAccount)->Export($oAccount->ParentEmailHelper(), 'csv') : false; - } - - /** - * @return \RainLoop\Model\Account|bool - */ - private function initMailClientConnection() - { - $oAccount = null; - - if (!$this->MailClient()->IsLoggined()) - { - $oAccount = $this->getAccountFromToken(); - - try - { - $oAccount->IncConnectAndLoginHelper($this->Plugins(), $this->MailClient(), $this->Config()); - } - catch (\MailSo\Net\Exceptions\ConnectionException $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::ConnectionError, $oException); - } - catch (\Exception $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError, $oException); - } - - $this->MailClient()->ImapClient()->__FORCE_SELECT_ON_EXAMINE__ = !!$this->Config()->Get('labs', 'use_imap_force_selection'); - } - - return $oAccount; - } - - /** - * @param string $sRawKey - * - * @return array | false - */ - private function getDecodedRawKeyValue($sRawKey) - { - $bResult = false; - if (!empty($sRawKey)) - { - $aValues = \RainLoop\Utils::DecodeKeyValuesQ($sRawKey); - if (is_array($aValues)) - { - $bResult = $aValues; - } - } - - return $bResult; - } - - /** - * @param string $sRawKey - * @param int | null $iLenCache - * @return array | bool - */ - private function getDecodedClientRawKeyValue($sRawKey, $iLenCache = null) - { - $mResult = false; - if (!empty($sRawKey)) - { - $sRawKey = \MailSo\Base\Utils::UrlSafeBase64Decode($sRawKey); - $aValues = explode("\x0", $sRawKey); - - if (is_array($aValues) && (null === $iLenCache || $iLenCache === count($aValues))) - { - $mResult = $aValues; - } - } - - return $mResult; - } - - /** - * @return string - */ - public function StaticCache() - { - static $sCache = null; - if (!$sCache) - { - $sCache = \md5(APP_VERSION.$this->Plugins()->Hash()); - } - return $sCache; - } - - /** - * @param string $sTheme - * - * @return string - */ - public function ThemeLink($sTheme, $bAdmin) - { - return './?/Css/0/'.($bAdmin ? 'Admin' : 'User').'/-/'.$sTheme.'/-/'.$this->StaticCache().'/Hash/-/'; - } - - /** - * @param string $sTheme - * - * @return string - */ - public function ValidateTheme($sTheme, $bMobile = false) - { - if ($bMobile) - { - return 'Mobile'; - } - - return \in_array($sTheme, $this->GetThemes($bMobile)) ? - $sTheme : $this->Config()->Get('themes', 'default', $bMobile ? 'Mobile' : 'Default'); - } - - /** - * @param string $sLanguage - * @param string $sDefault = '' - * @param bool $bAdmin = false - * @param bool $bAllowEmptyResult = false - * - * @return string - */ - public function ValidateLanguage($sLanguage, $sDefault = '', $bAdmin = false, $bAllowEmptyResult = false) - { - $sResult = ''; - $aLang = $this->GetLanguages($bAdmin); - - if (\is_array($aLang)) - { - $aHelper = array('en' => 'en_us', 'ar' => 'ar_sa', 'cs' => 'cs_cz', 'no' => 'nb_no', 'ua' => 'uk_ua', - 'cn' => 'zh_cn', 'zh' => 'zh_cn', 'tw' => 'zh_tw', 'fa' => 'fa_ir'); - - $sLanguage = isset($aHelper[$sLanguage]) ? $aHelper[$sLanguage] : $sLanguage; - $sDefault = isset($aHelper[$sDefault]) ? $aHelper[$sDefault] : $sDefault; - - $sLanguage = \strtolower(\str_replace('-', '_', $sLanguage)); - if (2 === strlen($sLanguage)) - { - $sLanguage = $sLanguage.'_'.$sLanguage; - } - - $sDefault = \strtolower(\str_replace('-', '_', $sDefault)); - if (2 === strlen($sDefault)) - { - $sDefault = $sDefault.'_'.$sDefault; - } - - $sLanguage = \preg_replace_callback('/_([a-zA-Z0-9]{2})$/', function ($aData) { - return \strtoupper($aData[0]); - }, $sLanguage); - - $sDefault = \preg_replace_callback('/_([a-zA-Z0-9]{2})$/', function ($aData) { - return \strtoupper($aData[0]); - }, $sDefault); - - if (\in_array($sLanguage, $aLang)) - { - $sResult = $sLanguage; - } - - if (empty($sResult) && !empty($sDefault) && \in_array($sDefault, $aLang)) - { - $sResult = $sDefault; - } - - if (empty($sResult) && !$bAllowEmptyResult) - { - $sResult = $this->Config()->Get('webmail', $bAdmin ? 'language_admin' : 'language', 'en_US'); - $sResult = \in_array($sResult, $aLang) ? $sResult : 'en_US'; - } - } - - return $sResult; - } - - /** - * @param string $sType - * - * @return string - */ - public function ValidateContactPdoType($sType) - { - return \in_array($sType, array('mysql', 'pgsql', 'sqlite')) ? $sType : 'sqlite'; - } - - /** - * @staticvar array $aCache - * - * @return array - */ - public function GetThemes($bMobile = false, $bIncludeMobile = true) - { - if ($bMobile) - { - return array('Mobile'); - } - - static $aCache = array('full' => null, 'mobile' => null); - if ($bIncludeMobile && \is_array($aCache['full'])) - { - return $aCache['full']; - } - else if ($bIncludeMobile && \is_array($aCache['mobile'])) - { - return $aCache['mobile']; - } - - $bClear = false; - $bDefault = false; - $sList = array(); - $sDir = APP_VERSION_ROOT_PATH.'themes'; - if (@\is_dir($sDir)) - { - $rDirH = \opendir($sDir); - if ($rDirH) - { - while (($sFile = \readdir($rDirH)) !== false) - { - if ('.' !== $sFile{0} && \is_dir($sDir.'/'.$sFile) && \file_exists($sDir.'/'.$sFile.'/styles.less')) - { - if ('Default' === $sFile) - { - $bDefault = true; - } - else if ('Clear' === $sFile) - { - $bClear = true; - } - else if ($bIncludeMobile || 'Mobile' !== $sFile) - { - $sList[] = $sFile; - } - } - } - @closedir($rDirH); - } - } - - $sDir = APP_INDEX_ROOT_PATH.'themes'; // custom user themes - if (@\is_dir($sDir)) - { - $rDirH = \opendir($sDir); - if ($rDirH) - { - while (($sFile = \readdir($rDirH)) !== false) - { - if ('.' !== $sFile{0} && \is_dir($sDir.'/'.$sFile) && \file_exists($sDir.'/'.$sFile.'/styles.less')) - { - $sList[] = $sFile.'@custom'; - } - } - - @\closedir($rDirH); - } - } - - $sList = \array_unique($sList); - \sort($sList); - - if ($bDefault) - { - \array_unshift($sList, 'Default'); - } - - if ($bClear) - { - \array_push($sList, 'Clear'); - } - - $aCache[$bIncludeMobile ? 'full' : 'mobile'] = $sList; - return $sList; - } - - /** - * @staticvar array $aCache - * @param bool $bAdmin = false - * - * @return array - */ - public function GetLanguages($bAdmin = false) - { - static $aCache = array(); - $sDir = APP_VERSION_ROOT_PATH.'app/localization/'.($bAdmin ? 'admin' : 'webmail').'/'; - - if (isset($aCache[$sDir])) - { - return $aCache[$sDir]; - } - - $aTop = array(); - $aList = array(); - - if (@\is_dir($sDir)) - { - $rDirH = \opendir($sDir); - if ($rDirH) - { - while (($sFile = \readdir($rDirH)) !== false) - { - if ('.' !== $sFile{0} && \is_file($sDir.'/'.$sFile) && '.yml' === \substr($sFile, -4)) - { - $sLang = \substr($sFile, 0, -4); - if (0 < \strlen($sLang) && 'always' !== $sLang && '_source.en' !== $sLang) - { - \array_push($aList, $sLang); - } - } - } - - @\closedir($rDirH); - } - } - - \sort($aTop); - \sort($aList); - - $aCache[$sDir] = \array_merge($aTop, $aList); - return $aCache[$sDir]; - } - - /** - * @param string $sName - * @param string $sHtml - * - * @return string - */ - public function ProcessTemplate($sName, $sHtml) - { - $sHtml = $this->Plugins()->ProcessTemplate($sName, $sHtml); - $sHtml = \preg_replace('/\{\{INCLUDE\/([a-zA-Z]+)\/PLACE\}\}/', '', $sHtml); - - $sHtml = \preg_replace('/'; - } - - unset($aTemplates); - - return $bJsOutput ? 'window.rainloopTEMPLATES='.\MailSo\Base\Utils::Php2js(array($sHtml), $this->Logger()).';' : $sHtml; - } - - /** - * @param string $sLanguage - * - * @return string - */ - private function convertLanguageNameToMomentLanguageName($sLanguage) - { - $aHelper = array('en_gb' => 'en-gb', 'fr_ca' => 'fr-ca', 'pt_br' => 'pt-br', - 'uk_ua' => 'ua', 'zh_cn' => 'zh-cn', 'zh_tw' => 'zh-tw', 'fa_ir' => 'fa'); - - return isset($aHelper[$sLanguage]) ? $aHelper[$sLanguage] : \substr($sLanguage, 0, 2); - } - - /** - * @param string $sLanguage - * @param bool $bAdmin = false - * @param bool $bWrapByScriptTag = true - * - * @return string - */ - private function compileLanguage($sLanguage, $bAdmin = false, $bWrapByScriptTag = true) - { - $aResultLang = array(); - - $sMoment = 'window.moment && window.moment.locale && window.moment.locale(\'en\');'; - $sMomentFileName = APP_VERSION_ROOT_PATH.'app/localization/moment/'. - $this->convertLanguageNameToMomentLanguageName($sLanguage).'.js'; - - if (\file_exists($sMomentFileName)) - { - $sMoment = \file_get_contents($sMomentFileName); - $sMoment = \preg_replace('/\/\/[^\n]+\n/', '', $sMoment); - } - - \RainLoop\Utils::ReadAndAddLang(APP_VERSION_ROOT_PATH.'app/localization/langs.yml', $aResultLang); - \RainLoop\Utils::ReadAndAddLang(APP_VERSION_ROOT_PATH.'app/localization/'. - ($bAdmin ? 'admin' : 'webmail').'/_source.en.yml', $aResultLang); - \RainLoop\Utils::ReadAndAddLang(APP_VERSION_ROOT_PATH.'app/localization/'. - ($bAdmin ? 'admin' : 'webmail').'/'.$sLanguage.'.yml', $aResultLang); - - $this->Plugins()->ReadLang($sLanguage, $aResultLang); - - $sLangJs = ''; - $aLangKeys = \array_keys($aResultLang); - foreach ($aLangKeys as $sKey) - { - $sString = isset($aResultLang[$sKey]) ? $aResultLang[$sKey] : $sKey; - if (\is_array($sString)) - { - $sString = \implode("\n", $sString); - } - - $sLangJs .= '"'.\str_replace('"', '\\"', \str_replace('\\', '\\\\', $sKey)).'":' - .'"'.\str_replace(array("\r", "\n", "\t"), array('\r', '\n', '\t'), - \str_replace('"', '\\"', \str_replace('\\', '\\\\', $sString))).'",'; - } - - $sResult = empty($sLangJs) ? 'null' : '{'.\substr($sLangJs, 0, -1).'}'; - - return - ($bWrapByScriptTag ? '' : '') - ; - } - - /** - * @param array $aAppData - * @param bool $bWrapByScriptTag = true - * - * @return string - */ - private function compileAppData($aAppData, $bWrapByScriptTag = true) - { - return - ($bWrapByScriptTag ? '' : '') - ; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Settings.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Settings.php deleted file mode 100755 index d234f083..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Settings.php +++ /dev/null @@ -1,78 +0,0 @@ -aData = array(); - $this->bLocal = !!$bLocal; - } - - /** - * @param array $aData - * - * @return \RainLoop\Settings - */ - public function InitData($aData) - { - if (\is_array($aData)) - { - $this->aData = $aData; - } - - return $this; - } - - /** - * @return array - */ - public function DataAsArray() - { - return $this->aData; - } - - /** - * @return bool - */ - public function IsLocal() - { - return $this->bLocal; - } - - /** - * @param string $sName - * @param mixed $mDefValue = null - * - * @return mixed - */ - public function GetConf($sName, $mDefValue = null) - { - return isset($this->aData[$sName]) ? $this->aData[$sName] : $mDefValue; - } - - /** - * @param string $sName - * @param mixed $mValue - * - * @return void - */ - public function SetConf($sName, $mValue) - { - $this->aData[$sName] = $mValue; - } -} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Social.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Social.php deleted file mode 100755 index a1363756..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Social.php +++ /dev/null @@ -1,792 +0,0 @@ -oHttp = $oHttp; - $this->oActions = $oActions; - } - - /** - * @return bool - */ - public function GoogleDisconnect($oAccount) - { - $oGoogle = $this->GoogleConnector(); - if ($oAccount && $oGoogle) - { - $oSettings = $this->oActions->SettingsProvider()->Load($oAccount); - $sEncodedeData = $oSettings->GetConf('GoogleAccessToken', ''); - - if (!empty($sEncodedeData)) - { - $aData = \RainLoop\Utils::DecodeKeyValues($sEncodedeData); - if (\is_array($aData) && !empty($aData['id'])) - { - $this->oActions->StorageProvider()->Clear(null, - \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, - $this->GoogleUserLoginStorageKey($oGoogle, $aData['id']) - ); - } - } - - $oSettings->SetConf('GoogleAccessToken', ''); - $oSettings->SetConf('GoogleSocialName', ''); - - return $this->oActions->SettingsProvider()->Save($oAccount, $oSettings); - } - - return false; - } - - /** - * @return bool - */ - public function FacebookDisconnect($oAccount) - { - $oFacebook = $this->FacebookConnector($oAccount ? $oAccount : null); - if ($oAccount && $oFacebook) - { - $oSettings = $this->oActions->SettingsProvider()->Load($oAccount); - - $sEncodedeData = $oSettings->GetConf('FacebookAccessToken', ''); - - if (!empty($sEncodedeData)) - { - $aData = \RainLoop\Utils::DecodeKeyValues($sEncodedeData); - if (is_array($aData) && isset($aData['id'])) - { - $this->oActions->StorageProvider()->Clear(null, - \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, - $this->FacebookUserLoginStorageKey($oFacebook, $aData['id']) - ); - } - } - - $oSettings->SetConf('FacebookAccessToken', ''); - $oSettings->SetConf('FacebookSocialName', ''); - - return $this->oActions->SettingsProvider()->Save($oAccount, $oSettings); - } - - return false; - } - - /** - * @return bool - */ - public function TwitterDisconnect($oAccount) - { - $oTwitter = $this->TwitterConnector(); - if ($oAccount && $oTwitter) - { - $oSettings = $this->oActions->SettingsProvider()->Load($oAccount); - $sEncodedData = $oSettings->GetConf('TwitterAccessToken', ''); - - if (!empty($sEncodedData)) - { - $aData = \RainLoop\Utils::DecodeKeyValues($sEncodedData); - if (is_array($aData) && isset($aData['id'])) - { - $this->oActions->StorageProvider()->Clear(null, - \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, - $this->TwitterUserLoginStorageKey($oTwitter, $aData['id']) - ); - } - } - - $oSettings->SetConf('TwitterAccessToken', ''); - $oSettings->SetConf('TwitterSocialName', ''); - - return $this->oActions->SettingsProvider()->Save($oAccount, $oSettings); - } - - return false; - } - - /** - * @return string - */ - public function popupServiceResult($sTypeStr, $sLoginUrl, $bLogin, $iErrorCode) - { - $sResult = ''; - $bAppCssDebug = !!$this->oActions->Config()->Get('labs', 'use_app_debug_css', false); - - $sIcon = $sTypeStr; - if ('facebook' === $sIcon) - { - $sIcon = $sIcon.'-alt'; - } - - if ($sLoginUrl) - { - $this->oHttp->ServerNoCache(); - @\header('Content-Type: text/html; charset=utf-8'); - - $sResult = \strtr(\file_get_contents(APP_VERSION_ROOT_PATH.'app/templates/Social.html'), array( - '{{RefreshMeta}}' => '', - '{{Stylesheet}}' => $this->oActions->StaticPath('css/social'.($bAppCssDebug ? '' : '.min').'.css'), - '{{Icon}}' => $sIcon, - '{{Script}}' => '' - )); - } - else - { - $this->oHttp->ServerNoCache(); - @\header('Content-Type: text/html; charset=utf-8'); - - $sCallBackType = $bLogin ? '_login' : ''; - $sConnectionFunc = 'rl_'.\md5(\RainLoop\Utils::GetConnectionToken()).'_'.$sTypeStr.$sCallBackType.'_service'; - - $sResult = \strtr(\file_get_contents(APP_VERSION_ROOT_PATH.'app/templates/Social.html'), array( - '{{RefreshMeta}}' => '', - '{{Stylesheet}}' => $this->oActions->StaticPath('css/social'.($bAppCssDebug ? '' : '.min').'.css'), - '{{Icon}}' => $sIcon, - '{{Script}}' => '' - )); - } - - return $sResult; - } - - /** - * @return string - */ - public function GooglePopupService($bGmail = false) - { - $sLoginUrl = ''; - $oAccount = null; - - $bLogin = false; - $iErrorCode = \RainLoop\Notifications::UnknownError; - - try - { - $oGoogle = $this->GoogleConnector(); - if ($this->oHttp->HasQuery('error')) - { - $iErrorCode = ('access_denied' === $this->oHttp->GetQuery('error')) ? - \RainLoop\Notifications::SocialGoogleLoginAccessDisable : \RainLoop\Notifications::UnknownError; - } - else if ($oGoogle) - { - $oAccount = $this->oActions->GetAccount(); - $bLogin = !$oAccount; - - $sCheckToken = ''; - $sCheckAuth = ''; - $sState = $this->oHttp->GetQuery('state'); - if (!empty($sState)) - { - $aParts = explode('|', $sState, 3); - - if (!$bGmail) - { - $bGmail = !empty($aParts[0]) ? '1' === (string) $aParts[0] : false; - } - - $sCheckToken = !empty($aParts[1]) ? $aParts[1] : ''; - $sCheckAuth = !empty($aParts[2]) ? $aParts[2] : ''; - } - - $sRedirectUrl = $this->oHttp->GetFullUrl().'?SocialGoogle'; - if (!$this->oHttp->HasQuery('code')) - { - $aParams = array( - 'scope' => \trim(\implode(' ', array( - 'https://www.googleapis.com/auth/userinfo.email', - 'https://www.googleapis.com/auth/userinfo.profile', - $bGmail ? 'https://mail.google.com/' : '' - ))), - 'state' => ($bGmail ? '1' : '0').'|'.\RainLoop\Utils::GetConnectionToken().'|'.$this->oActions->GetSpecAuthToken(), - 'response_type' => 'code' - ); - -// if ($bGmail) -// { -// $aParams['access_type'] = 'offline'; -// $aParams['approval_prompt'] = 'force'; -// } - - $sLoginUrl = $oGoogle->getAuthenticationUrl('https://accounts.google.com/o/oauth2/auth', $sRedirectUrl, $aParams); - } - else if (!empty($sState) && $sCheckToken === \RainLoop\Utils::GetConnectionToken()) - { - if (!empty($sCheckAuth)) - { - $this->oActions->SetSpecAuthToken($sCheckAuth); - $oAccount = $this->oActions->GetAccount(); - $bLogin = !$oAccount; - } - - $aParams = array('code' => $this->oHttp->GetQuery('code'), 'redirect_uri' => $sRedirectUrl); - $aAuthorizationResponse = $oGoogle->getAccessToken('https://accounts.google.com/o/oauth2/token', 'authorization_code', $aParams); - - if (!empty($aAuthorizationResponse['result']['access_token'])) - { - $oGoogle->setAccessToken($aAuthorizationResponse['result']['access_token']); - $aUserInfoResponse = $oGoogle->fetch('https://www.googleapis.com/oauth2/v2/userinfo'); - - if (!empty($aUserInfoResponse['result']['id'])) - { - if ($bLogin) - { - $aUserData = null; - if ($bGmail) - { - if (!empty($aUserInfoResponse['result']['email'])) - { - $aUserData = array( - 'Email' => $aUserInfoResponse['result']['email'], - 'Password' => APP_GOOGLE_ACCESS_TOKEN_PREFIX.$aAuthorizationResponse['result']['access_token'] - ); - } - } - else - { - $sUserData = $this->oActions->StorageProvider()->Get(null, - \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, - $this->GoogleUserLoginStorageKey($oGoogle, $aUserInfoResponse['result']['id']) - ); - - $aUserData = \RainLoop\Utils::DecodeKeyValues($sUserData); - } - - if ($aUserData && \is_array($aUserData) && - !empty($aUserData['Email']) && isset($aUserData['Password'])) - { - $iErrorCode = $this->loginProcess($oAccount, $aUserData['Email'], $aUserData['Password']); - } - else - { - $iErrorCode = \RainLoop\Notifications::SocialGoogleLoginAccessDisable; - } - } - - if ($oAccount && !$bGmail) - { - $aUserData = array( - 'ID' => $aUserInfoResponse['result']['id'], - 'Email' => $oAccount->Email(), - 'Password' => $oAccount->Password() - ); - - $sSocialName = !empty($aUserInfoResponse['result']['name']) ? $aUserInfoResponse['result']['name'] : ''; - $sSocialName .= !empty($aUserInfoResponse['result']['email']) ? ' ('.$aUserInfoResponse['result']['email'].')' : ''; - $sSocialName = \trim($sSocialName); - - $oSettings = $this->oActions->SettingsProvider()->Load($oAccount); - - $oSettings->SetConf('GoogleAccessToken', \RainLoop\Utils::EncodeKeyValues(array( - 'id' => $aUserInfoResponse['result']['id'] - ))); - - $oSettings->SetConf('GoogleSocialName', $sSocialName); - - $this->oActions->SettingsProvider()->Save($oAccount, $oSettings); - - $this->oActions->StorageProvider()->Put(null, - \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, - $this->GoogleUserLoginStorageKey($oGoogle, $aUserInfoResponse['result']['id']), - \RainLoop\Utils::EncodeKeyValues($aUserData)); - - $iErrorCode = 0; - } - } - } - } - } - } - catch (\Exception $oException) - { - $this->oActions->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); - } - - return $this->popupServiceResult('google', $sLoginUrl, $bLogin, $iErrorCode); - } - - /** - * @return string - */ - public function FacebookPopupService() - { - $sLoginUrl = ''; - $sSocialName = ''; - - $mData = false; - $sUserData = ''; - $aUserData = false; - $oAccount = null; - - $bLogin = false; - $iErrorCode = \RainLoop\Notifications::UnknownError; - - if (0 === \strlen($this->oActions->GetSpecAuthToken()) && $this->oHttp->HasQuery('rlah')) - { - $this->oActions->SetSpecAuthToken($this->oHttp->GetQuery('rlah', '')); - } - - $oAccount = $this->oActions->GetAccount(); - - $sRedirectUrl = ''; - $oFacebook = $this->FacebookConnector($oAccount, $sRedirectUrl); - if ($oFacebook) - { - try - { - $oRedirectLoginHelper = $oFacebook->getRedirectLoginHelper(); - $oAccessToken = $oRedirectLoginHelper->getAccessToken(); - - if (!$oAccessToken && !$this->oHttp->HasQuery('state')) - { - $sLoginUrl = $oFacebook->getRedirectLoginHelper()->getLoginUrl($sRedirectUrl.'&display=popup'); - } - else if ($oAccessToken) - { - $oResponse = $oFacebook->get('/me?fields=id,name', (string) $oAccessToken); - $oGraphUser = $oResponse->getGraphUser(); - - $mData = $oGraphUser->getId(); - $sSocialName = $oGraphUser->getName(); - - if ($oAccount) - { - if ($mData && 0 < \strlen($mData)) - { - $aUserData = array( - 'id' => $mData, - 'Email' => $oAccount->Email(), - 'Password' => $oAccount->Password() - ); - - $oSettings = $this->oActions->SettingsProvider()->Load($oAccount); - $oSettings->SetConf('FacebookSocialName', $sSocialName); - $oSettings->SetConf('FacebookAccessToken', \RainLoop\Utils::EncodeKeyValues(array('id' => $mData))); - - $this->oActions->SettingsProvider()->Save($oAccount, $oSettings); - - $this->oActions->StorageProvider()->Put(null, - \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, - $this->FacebookUserLoginStorageKey($oFacebook, $mData), - \RainLoop\Utils::EncodeKeyValues($aUserData)); - - $iErrorCode = 0; - } - } - else - { - $bLogin = true; - - if ($mData && 0 < \strlen($mData)) - { - $sUserData = $this->oActions->StorageProvider()->Get(null, - \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, - $this->FacebookUserLoginStorageKey($oFacebook, $mData)); - - if ($sUserData) - { - $aUserData = \RainLoop\Utils::DecodeKeyValues($sUserData); - } - } - - if ($aUserData && \is_array($aUserData) && - !empty($aUserData['Email']) && isset($aUserData['Password'])) - { - $iErrorCode = $this->loginProcess($oAccount, $aUserData['Email'], $aUserData['Password']); - } - else - { - $iErrorCode = \RainLoop\Notifications::SocialFacebookLoginAccessDisable; - } - } - } - } - catch (\Exception $oException) - { - $this->oActions->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); - } - } - - return $this->popupServiceResult('facebook', $sLoginUrl, $bLogin, $iErrorCode); - } - - /** - * @return string - */ - public function TwitterPopupService() - { - $sLoginUrl = ''; - - $sSocialName = ''; - $oAccount = null; - - $bLogin = false; - $iErrorCode = \RainLoop\Notifications::UnknownError; - - $sRedirectUrl = $this->oHttp->GetFullUrl().'?SocialTwitter'; - if (0 < strlen($this->oActions->GetSpecAuthToken())) - { - $sRedirectUrl .= '&rlah='.$this->oActions->GetSpecAuthToken(); - } - else if ($this->oHttp->HasQuery('rlah')) - { - $this->oActions->SetSpecAuthToken($this->oHttp->GetQuery('rlah', '')); - $sRedirectUrl .= '&rlah='.$this->oActions->GetSpecAuthToken(); - } - - try - { - $oTwitter = $this->TwitterConnector(); - if ($oTwitter) - { - $sSessionKey = \implode('_', array('twitter', - \md5($oTwitter->config['consumer_secret']), \md5(\RainLoop\Utils::GetConnectionToken()), 'AuthSessionData')); - - $oAccount = $this->oActions->GetAccount(); - if ($oAccount) - { - if (isset($_REQUEST['oauth_verifier'])) - { - $sAuth = $this->oActions->Cacher()->Get($sSessionKey); - $oAuth = $sAuth ? \json_decode($sAuth, true) : null; - - if ($oAuth && !empty($oAuth['oauth_token']) && !empty($oAuth['oauth_token_secret'])) - { - $oTwitter->config['user_token'] = $oAuth['oauth_token']; - $oTwitter->config['user_secret'] = $oAuth['oauth_token_secret']; - - $iCode = $oTwitter->request('POST', $oTwitter->url('oauth/access_token', ''), array( - 'oauth_callback' => $sRedirectUrl, - 'oauth_verifier' => $_REQUEST['oauth_verifier'] - )); - - if (200 === $iCode && isset($oTwitter->response['response'])) - { - $aAccessToken = $oTwitter->extract_params($oTwitter->response['response']); - if ($aAccessToken && isset($aAccessToken['oauth_token']) && !empty($aAccessToken['user_id'])) - { - $aAccessToken['id'] = $aAccessToken['user_id']; - - $oTwitter->config['user_token'] = $aAccessToken['oauth_token']; - $oTwitter->config['user_secret'] = $aAccessToken['oauth_token_secret']; - - $sSocialName = !empty($aAccessToken['screen_name']) ? '@'.$aAccessToken['screen_name'] : $aAccessToken['user_id']; - $sSocialName = \trim($sSocialName); - - $aUserData = array( - 'id' => $aAccessToken['id'], - 'Email' => $oAccount->Email(), - 'Password' => $oAccount->Password() - ); - - $oSettings = $this->oActions->SettingsProvider()->Load($oAccount); - $oSettings->SetConf('TwitterAccessToken', \RainLoop\Utils::EncodeKeyValues($aAccessToken)); - $oSettings->SetConf('TwitterSocialName', $sSocialName); - $this->oActions->SettingsProvider()->Save($oAccount, $oSettings); - - $this->oActions->StorageProvider()->Put(null, - \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, - $this->TwitterUserLoginStorageKey($oTwitter, $aAccessToken['id']), - \RainLoop\Utils::EncodeKeyValues($aUserData)); - - $iErrorCode = 0; - } - } - } - } - else - { - $aParams = array( - 'oauth_callback' => $sRedirectUrl, - 'x_auth_access_type' => 'read' - ); - - $iCode = $oTwitter->request('POST', $oTwitter->url('oauth/request_token', ''), $aParams); - if (200 === $iCode && isset($oTwitter->response['response'])) - { - $oAuth = $oTwitter->extract_params($oTwitter->response['response']); - if (!empty($oAuth['oauth_token'])) - { - $this->oActions->Cacher()->Set($sSessionKey, \json_encode($oAuth)); - $sLoginUrl = $oTwitter->url('oauth/authenticate', '').'?oauth_token='.$oAuth['oauth_token']; - } - } - } - } - else - { - $bLogin = true; - - if (isset($_REQUEST['oauth_verifier'])) - { - $sAuth = $this->oActions->Cacher()->Get($sSessionKey); - $oAuth = $sAuth ? \json_decode($sAuth, true) : null; - if ($oAuth && !empty($oAuth['oauth_token']) && !empty($oAuth['oauth_token_secret'])) - { - $oTwitter->config['user_token'] = $oAuth['oauth_token']; - $oTwitter->config['user_secret'] = $oAuth['oauth_token_secret']; - - $iCode = $oTwitter->request('POST', $oTwitter->url('oauth/access_token', ''), array( - 'oauth_callback' => $sRedirectUrl, - 'oauth_verifier' => $_REQUEST['oauth_verifier'] - )); - - if (200 === $iCode && isset($oTwitter->response['response'])) - { - $aAccessToken = $oTwitter->extract_params($oTwitter->response['response']); - if ($aAccessToken && isset($aAccessToken['oauth_token']) && !empty($aAccessToken['user_id'])) - { - $sUserData = $this->oActions->StorageProvider()->Get(null, - \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, - $this->TwitterUserLoginStorageKey($oTwitter, $aAccessToken['user_id']) - ); - - $aUserData = \RainLoop\Utils::DecodeKeyValues($sUserData); - - if ($aUserData && \is_array($aUserData) && - !empty($aUserData['Email']) && isset($aUserData['Password'])) - { - $iErrorCode = $this->loginProcess($oAccount, $aUserData['Email'], $aUserData['Password']); - } - else - { - $iErrorCode = \RainLoop\Notifications::SocialTwitterLoginAccessDisable; - } - - $this->oActions->Cacher()->Delete($sSessionKey); - } - } - } - } - else - { - $aParams = array( - 'oauth_callback' => $sRedirectUrl, - 'x_auth_access_type' => 'read' - ); - - $iCode = $oTwitter->request('POST', $oTwitter->url('oauth/request_token', ''), $aParams); - if (200 === $iCode && isset($oTwitter->response['response'])) - { - $oAuth = $oTwitter->extract_params($oTwitter->response['response']); - if (!empty($oAuth['oauth_token'])) - { - $this->oActions->Cacher()->Set($sSessionKey, \json_encode($oAuth)); - $sLoginUrl = $oTwitter->url('oauth/authenticate', '').'?oauth_token='.$oAuth['oauth_token']; - } - } - } - } - } - } - catch (\Exception $oException) - { - $this->oActions->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); - } - - return $this->popupServiceResult('twitter', $sLoginUrl, $bLogin, $iErrorCode); - } - - /** - * @return \OAuth2\Client|null - */ - public function GoogleConnector() - { - $oGoogle = false; - $oConfig = $this->oActions->Config(); - if ($oConfig->Get('social', 'google_enable', false) && - '' !== \trim($oConfig->Get('social', 'google_client_id', '')) && - '' !== \trim($oConfig->Get('social', 'google_client_secret', ''))) - { - include_once APP_VERSION_ROOT_PATH.'app/libraries/PHP-OAuth2/Client.php'; - include_once APP_VERSION_ROOT_PATH.'app/libraries/PHP-OAuth2/GrantType/IGrantType.php'; - include_once APP_VERSION_ROOT_PATH.'app/libraries/PHP-OAuth2/GrantType/AuthorizationCode.php'; - include_once APP_VERSION_ROOT_PATH.'app/libraries/PHP-OAuth2/GrantType/RefreshToken.php'; - - try - { - $oGoogle = new \OAuth2\Client( - \trim($oConfig->Get('social', 'google_client_id', '')), - \trim($oConfig->Get('social', 'google_client_secret', ''))); - - $sProxy = $this->oActions->Config()->Get('labs', 'curl_proxy', ''); - if (0 < \strlen($sProxy)) - { - $oGoogle->setCurlOption(CURLOPT_PROXY, $sProxy); - - $sProxyAuth = $this->oActions->Config()->Get('labs', 'curl_proxy_auth', ''); - if (0 < \strlen($sProxyAuth)) - { - $oGoogle->setCurlOption(CURLOPT_PROXYUSERPWD, $sProxyAuth); - } - } - } - catch (\Exception $oException) - { - $this->oActions->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); - } - } - - return false === $oGoogle ? null : $oGoogle; - } - - /** - * @return \tmhOAuth|null - */ - public function TwitterConnector() - { - $oTwitter = false; - $oConfig = $this->oActions->Config(); - if ($oConfig->Get('social', 'twitter_enable', false) && - '' !== \trim($oConfig->Get('social', 'twitter_consumer_key', '')) && - '' !== \trim($oConfig->Get('social', 'twitter_consumer_secret', ''))) - { - include_once APP_VERSION_ROOT_PATH.'app/libraries/tmhOAuth/tmhOAuth.php'; - include_once APP_VERSION_ROOT_PATH.'app/libraries/tmhOAuth/tmhUtilities.php'; - - $sProxy = $this->oActions->Config()->Get('labs', 'curl_proxy', ''); - $sProxyAuth = $this->oActions->Config()->Get('labs', 'curl_proxy_auth', ''); - - $oTwitter = new \tmhOAuth(array( - 'consumer_key' => \trim($oConfig->Get('social', 'twitter_consumer_key', '')), - 'consumer_secret' => \trim($oConfig->Get('social', 'twitter_consumer_secret', '')), - 'curl_proxy' => 0 < \strlen($sProxy) ? $sProxy : false, - 'curl_proxyuserpwd' => 0 < \strlen($sProxyAuth) ? $sProxyAuth : false - )); - } - - return false === $oTwitter ? null : $oTwitter; - } - - /** - * @param \RainLoop\Model\Account|null $oAccount = null - * @param string $sRedirectUrl = '' - * - * @return \RainLoop\Common\RainLoopFacebookRedirectLoginHelper|null - */ - public function FacebookConnector($oAccount = null, &$sRedirectUrl = '') - { - $oFacebook = false; - $oConfig = $this->oActions->Config(); - $sAppID = \trim($oConfig->Get('social', 'fb_app_id', '')); - $sAppSecret = \trim($oConfig->Get('social', 'fb_app_secret', '')); - - if (\version_compare(PHP_VERSION, '5.4.0', '>=') && - $oConfig->Get('social', 'fb_enable', false) && '' !== $sAppID && - '' !== \trim($oConfig->Get('social', 'fb_app_secret', '')) && - \class_exists('Facebook\Facebook') - ) - { - $sRedirectUrl = $this->oHttp->GetFullUrl().'?SocialFacebook'; - if (0 < \strlen($this->oActions->GetSpecAuthToken())) - { - $sRedirectUrl .= '&rlah='.$this->oActions->GetSpecAuthToken(); - } - else if ($this->oHttp->HasQuery('rlah')) - { - $this->oActions->SetSpecAuthToken($this->oHttp->GetQuery('rlah', '')); - $sRedirectUrl .= '&rlah='.$this->oActions->GetSpecAuthToken(); - } - - try - { - $oAccount = $this->oActions->GetAccount(); - - $oFacebook = new \Facebook\Facebook(array( - 'app_id' => $sAppID, // Replace {app-id} with your app id - 'app_secret' => $sAppSecret, - 'persistent_data_handler' => new \RainLoop\Common\FacebookRainLoopPersistentDataHandler( - $oAccount, \RainLoop\Utils::GetConnectionToken(), $this->oActions->StorageProvider() - ) - )); - } - catch (\Exception $oException) - { - $this->oActions->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); - } - } - - return false === $oFacebook ? null : $oFacebook; - } - - /** - * @return string - */ - public function GoogleUserLoginStorageKey($oGoogle, $sGoogleUserId) - { - return \implode('_', array('google', \md5($oGoogle->getClientId()), $sGoogleUserId, APP_SALT)); - } - - /** - * @return string - */ - public function FacebookUserLoginStorageKey($oFacebook, $sFacebookUserId) - { - return \implode('_', array('facebookNew', \md5($oFacebook->getApp()->getId()), $sFacebookUserId, APP_SALT)); - } - - /** - * @return string - */ - public function TwitterUserLoginStorageKey($oTwitter, $sTwitterUserId) - { - return \implode('_', array('twitter_2', \md5($oTwitter->config['consumer_secret']), $sTwitterUserId, APP_SALT)); - } - - /** - * @param \RainLoop\Model\Account|null $oAccount - * @param string $sEmail - * @param string $sPassword - * - * @return int - */ - private function loginProcess(&$oAccount, $sEmail, $sPassword) - { - $iErrorCode = \RainLoop\Notifications::UnknownError; - - try - { - $oAccount = $this->oActions->LoginProcess($sEmail, $sPassword, '', '', false, true); - if ($oAccount instanceof \RainLoop\Model\Account) - { - $this->oActions->AuthToken($oAccount); - $iErrorCode = 0; - } - else - { - $oAccount = null; - $iErrorCode = \RainLoop\Notifications::AuthError; - } - } - catch (\RainLoop\Exceptions\ClientException $oException) - { - $iErrorCode = $oException->getCode(); - } - catch (\Exception $oException) - { - unset($oException); - $iErrorCode = \RainLoop\Notifications::UnknownError; - } - - return $iErrorCode; - } -} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Utils.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Utils.php deleted file mode 100755 index 83b20418..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/RainLoop/Utils.php +++ /dev/null @@ -1,735 +0,0 @@ -setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); - $oRsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1); - $oRsa->setPrivateKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1); - - $sPrivateKey = \file_exists(APP_PRIVATE_DATA.'rsa/private') ? - \file_get_contents(APP_PRIVATE_DATA.'rsa/private') : ''; - - if (!empty($sPrivateKey)) - { - $oRsa->loadKey($sPrivateKey, CRYPT_RSA_PRIVATE_FORMAT_PKCS1); - $oRsa->loadKey($oRsa->getPublicKey(), CRYPT_RSA_PUBLIC_FORMAT_PKCS1); - - \RainLoop\Utils::$RSA = $oRsa; - } - } - } - - return \RainLoop\Utils::$RSA; - } - - /** - * @return string - */ - static public function RsaPrivateKey() - { - if (!empty(\RainLoop\Utils::$RsaKey)) - { - return \RainLoop\Utils::$RsaKey; - } - - \RainLoop\Utils::$RsaKey = \file_exists(APP_PRIVATE_DATA.'rsa/private') ? - \file_get_contents(APP_PRIVATE_DATA.'rsa/private') : ''; - - \RainLoop\Utils::$RsaKey = \is_string(\RainLoop\Utils::$RsaKey) ? \RainLoop\Utils::$RsaKey : ''; - } - - /** - * @param string $sString - * @param string $sKey = '' - * - * @return string|false - */ - static public function EncryptStringRSA($sString, $sKey = '') - { - $sResult = ''; - $sKey = \md5($sKey); - - $sPrivateKey = \RainLoop\Utils::RsaPrivateKey(); - if (!empty($sPrivateKey)) - { - $oPrivKey = \openssl_pkey_get_private($sPrivateKey); - $oKeyDetails = \openssl_pkey_get_details($oPrivKey); - - if (!empty($oKeyDetails['key']) && !empty($oKeyDetails['bits'])) - { - $oPubKey = \openssl_pkey_get_public($oKeyDetails['key']); - - $iC = (($oKeyDetails['bits'] / 8) - 15); - $aString = \str_split($sString, $iC); - - foreach ($aString as $iIndex => $sLine) - { - $sEncrypted = ''; - \openssl_public_encrypt($sLine, $sEncrypted, $oPubKey); - $aString[$iIndex] = $sEncrypted; - } - - $aString[] = $sKey; - $sResult = @\serialize($aString); - - \openssl_free_key($oPubKey); - } - - \openssl_free_key($oPrivKey); - } - - return $sResult; - } - - /** - * @param string $sString - * @param string $sKey = '' - * - * @return string|false - */ - static public function DecryptStringRSA($sString, $sKey = '') - { - $sResult = ''; - $sKey = \md5($sKey); - - $sPrivateKey = \RainLoop\Utils::RsaPrivateKey(); - if (!empty($sPrivateKey) && !empty($sString)) - { - $oPrivKey = \openssl_pkey_get_private($sPrivateKey); - - $aString = @\unserialize($sString); - if (\is_array($aString)) - { - if ($sKey === \array_pop($aString)) - { - foreach ($aString as $iIndex => $sLine) - { - $sDecrypted = ''; - \openssl_private_decrypt($sLine, $sDecrypted, $oPrivKey); - $aString[$iIndex] = $sDecrypted; - } - - $sResult = \implode('', $aString); - } - } - - \openssl_free_key($oPrivKey); - } - - return $sResult; - } - - /** - * @param string $sString - * @param string $sKey - * - * @return string - */ - static public function EncryptString($sString, $sKey) - { - return \MailSo\Base\Crypt::XxteaEncrypt($sString, $sKey); - } - - /** - * @param string $sEncriptedString - * @param string $sKey - * - * @return string - */ - static public function DecryptString($sEncriptedString, $sKey) - { - return \MailSo\Base\Crypt::XxteaDecrypt($sEncriptedString, $sKey); - } - - /** - * @param string $sString - * @param string $sKey - * - * @return string - */ - static public function EncryptStringQ($sString, $sKey) - { -// if (\MailSo\Base\Utils::FunctionExistsAndEnabled('openssl_pkey_get_private')) -// { -// return \RainLoop\Utils::EncryptStringRSA($sString, -// $sKey.'Q'.\RainLoop\Utils::GetShortToken()); -// } - - return \MailSo\Base\Crypt::XxteaEncrypt($sString, - $sKey.'Q'.\RainLoop\Utils::GetShortToken()); - } - - /** - * @param string $sEncriptedString - * @param string $sKey - * - * @return string - */ - static public function DecryptStringQ($sEncriptedString, $sKey) - { -// if (\MailSo\Base\Utils::FunctionExistsAndEnabled('openssl_pkey_get_private')) -// { -// return \RainLoop\Utils::DecryptStringRSA($sEncriptedString, -// $sKey.'Q'.\RainLoop\Utils::GetShortToken()); -// } - - return \MailSo\Base\Crypt::XxteaDecrypt($sEncriptedString, - $sKey.'Q'.\RainLoop\Utils::GetShortToken()); - } - - /** - * @param array $aValues - * @param string $sCustomKey = '' - * - * @return string - */ - static public function EncodeKeyValues(array $aValues, $sCustomKey = '') - { - return \MailSo\Base\Utils::UrlSafeBase64Encode( - \RainLoop\Utils::EncryptString(@\serialize($aValues), \md5(APP_SALT.$sCustomKey))); - } - - /** - * @param string $sEncodedValues - * @param string $sCustomKey = '' - * - * @return array - */ - static public function DecodeKeyValues($sEncodedValues, $sCustomKey = '') - { - $aResult = @\unserialize( - \RainLoop\Utils::DecryptString( - \MailSo\Base\Utils::UrlSafeBase64Decode($sEncodedValues), \md5(APP_SALT.$sCustomKey))); - - return \is_array($aResult) ? $aResult : array(); - } - - /** - * @param array $aValues - * @param string $sCustomKey = '' - * - * @return string - */ - static public function EncodeKeyValuesQ(array $aValues, $sCustomKey = '') - { - return \MailSo\Base\Utils::UrlSafeBase64Encode( - \RainLoop\Utils::EncryptStringQ( - @\serialize($aValues), \md5(APP_SALT.$sCustomKey))); - } - - /** - * @param string $sEncodedValues - * @param string $sCustomKey = '' - * - * @return array - */ - static public function DecodeKeyValuesQ($sEncodedValues, $sCustomKey = '') - { - $aResult = @\unserialize( - \RainLoop\Utils::DecryptStringQ( - \MailSo\Base\Utils::UrlSafeBase64Decode($sEncodedValues), \md5(APP_SALT.$sCustomKey))); - - return \is_array($aResult) ? $aResult : array(); - } - - /** - * @return string - */ - static public function GetConnectionToken() - { - $sKey = 'rltoken'; - - $sToken = \RainLoop\Utils::GetCookie($sKey, null); - if (null === $sToken) - { - $sToken = \MailSo\Base\Utils::Md5Rand(APP_SALT); - \RainLoop\Utils::SetCookie($sKey, $sToken, \time() + 60 * 60 * 24 * 30); - } - - return \md5('Connection'.APP_SALT.$sToken.'Token'.APP_SALT); - } - - /** - * @return string - */ - static public function Fingerprint() - { - return \md5(empty($_SERVER['HTTP_USER_AGENT']) ? 'RainLoopFingerprint' : $_SERVER['HTTP_USER_AGENT']); - } - - /** - * @return string - */ - static public function GetShortToken() - { - $sKey = 'rlsession'; - - $sToken = \RainLoop\Utils::GetCookie($sKey, null); - if (null === $sToken) - { - $sToken = \MailSo\Base\Utils::Md5Rand(APP_SALT); - \RainLoop\Utils::SetCookie($sKey, $sToken, 0); - } - - return \md5('Session'.APP_SALT.$sToken.'Token'.APP_SALT); - } - - /** - * @return void - */ - static public function UpdateConnectionToken() - { - $sKey = 'rltoken'; - - $sToken = \RainLoop\Utils::GetCookie($sKey, ''); - if (!empty($sToken)) - { - \RainLoop\Utils::SetCookie($sKey, $sToken, \time() + 60 * 60 * 24 * 30); - } - } - - /** - * @return string - */ - static public function GetCsrfToken() - { - return \md5('Csrf'.APP_SALT.self::GetConnectionToken().'Token'.APP_SALT); - } - - /** - * @param string $sPath - * - * @return string - */ - public static function PathMD5($sPath) - { - $sResult = ''; - if (@\is_dir($sPath)) - { - $oDirIterator = new \RecursiveDirectoryIterator($sPath); - $oIterator = new \RecursiveIteratorIterator($oDirIterator, \RecursiveIteratorIterator::SELF_FIRST); - - foreach ($oIterator as $oFile) - { - $sResult = \md5($sResult.($oFile->isFile() ? \md5_file($oFile) : $oFile)); - } - } - - return $sResult; - } - - /** - * @param string $sFileName - * @param array $aResultLang - * - * @return void - */ - public static function ReadAndAddLang($sFileName, &$aResultLang) - { - if (\file_exists($sFileName)) - { - $isYml = '.yml' === substr($sFileName, -4); - if ($isYml) - { - $aLang = \spyc_load(\str_replace(array(': >-', ': |-', ': |+'), array(': >', ': |', ': |'), \file_get_contents($sFileName))); - if (\is_array($aLang)) - { - \reset($aLang); - $sLangKey = key($aLang); - if (isset($aLang[$sLangKey]) && is_array($aLang[$sLangKey])) - { - $aLang = $aLang[$sLangKey]; - } - else - { - $aLang = null; - } - } - } - else - { - $aLang = \RainLoop\Utils::CustomParseIniFile($sFileName, true); - } - - if (\is_array($aLang)) - { - foreach ($aLang as $sKey => $mValue) - { - if (\is_array($mValue)) - { - foreach ($mValue as $sSecKey => $mSecValue) - { - $aResultLang[$sKey.'/'.$sSecKey] = $mSecValue; - } - } - else - { - $aResultLang[$sKey] = $mValue; - } - } - } - } - } - - /** - * @param string $sDir - * @param string $sType = '' - * @return array - */ - public static function FolderFiles($sDir, $sType = '') - { - $aResult = array(); - if (@\is_dir($sDir)) - { - if (false !== ($rDirHandle = @\opendir($sDir))) - { - while (false !== ($sFile = @\readdir($rDirHandle))) - { - if (empty($sType) || $sType === \substr($sFile, -\strlen($sType))) - { - if (\is_file($sDir.'/'.$sFile)) - { - $aResult[] = $sFile; - } - } - } - - @\closedir($rDirHandle); - } - } - - return $aResult; - } - - /** - * @param string $sHtml - * - * @return string - */ - public static function ClearHtmlOutput($sHtml) - { -// return $sHtml; - return \trim(\str_replace('> <', '><', - \str_replace('" />', '"/>', - \preg_replace('/[\s]+ /i', ' ', - \preg_replace('/ [\s]+/i', ' ', - \preg_replace('/[\r\n\t]+/', ' ', - $sHtml - )))))); - } - - /** - * @param string $sKey - * @return bool - */ - public static function FastCheck($sKey) - { - $bResult = false; - - $aMatches = array(); - if (!empty($sKey) && 0 < \strlen($sKey) && \preg_match('/^(RL[\d]+)\-(.+)\-([^\-]+)$/', $sKey, $aMatches) && 3 === \count($aMatches)) - { - $bResult = $aMatches[3] === \strtoupper(\base_convert(\crc32(\md5( - $aMatches[1].'-'.$aMatches[2].'-')), 10, 32)); - } - - return $bResult; - } - - /** - * @param array $aList - * @param string $sDirName - * @param string $sNameSuffix = '' - */ - public static function CompileTemplates(&$aList, $sDirName, $sNameSuffix = '') - { - if (\file_exists($sDirName)) - { - $aFileList = \RainLoop\Utils::FolderFiles($sDirName, '.html'); - - foreach ($aFileList as $sName) - { - $sTemplateName = \substr($sName, 0, -5).$sNameSuffix; - $aList[$sTemplateName] = $sDirName.'/'.$sName; - } - } - } - - /** - * @param string $sName - * @param mixed $mDefault = null - * @return mixed - */ - public static function GetCookie($sName, $mDefault = null) - { - if (null === \RainLoop\Utils::$Cookies) - { - \RainLoop\Utils::$Cookies = is_array($_COOKIE) ? $_COOKIE : array(); - } - - return isset(\RainLoop\Utils::$Cookies[$sName]) ? \RainLoop\Utils::$Cookies[$sName] : $mDefault; - } - - public static function SetCookie($sName, $sValue = '', $iExpire = 0, $sPath = null, $sDomain = null, $bSecure = null, $bHttpOnly = true) - { - if (null === \RainLoop\Utils::$Cookies) - { - \RainLoop\Utils::$Cookies = is_array($_COOKIE) ? $_COOKIE : array(); - } - - if (null === $sPath) - { - $sPath = \RainLoop\Utils::$CookieDefaultPath; - $sPath = $sPath && 0 < \strlen($sPath) ? $sPath : null; - } - - if (null === $bSecure) - { - $bSecure = \RainLoop\Utils::$CookieDefaultSecure; - } - - \RainLoop\Utils::$Cookies[$sName] = $sValue; - @\setcookie($sName, $sValue, $iExpire, $sPath, $sDomain, $bSecure, $bHttpOnly); - } - - public static function ClearCookie($sName) - { - if (null === \RainLoop\Utils::$Cookies) - { - \RainLoop\Utils::$Cookies = is_array($_COOKIE) ? $_COOKIE : array(); - } - - $sPath = \RainLoop\Utils::$CookieDefaultPath; - $sPath = $sPath && 0 < \strlen($sPath) ? $sPath : null; - - unset(\RainLoop\Utils::$Cookies[$sName]); - @\setcookie($sName, '', \time() - 3600 * 24 * 30, $sPath); - } - - /** - * @return bool - */ - public static function IsOwnCloud() - { - return isset($_ENV['RAINLOOP_OWNCLOUD']) && $_ENV['RAINLOOP_OWNCLOUD'] && - \class_exists('OC'); - } - /** - * @return bool - */ - public static function IsOwnCloudLoggedIn() - { - return self::IsOwnCloud() && \class_exists('OCP\User') && \OCP\User::isLoggedIn(); - } - - /** - * @param string $sV - * @param bool $bEncode = false - * - * @return string - */ - public static function UrlEncode($sV, $bEncode = false) - { - return $bEncode ? \urlencode($sV) : $sV; - } - - /** - * @return string - */ - public static function WebPath() - { - $sAppPath = ''; - if (\RainLoop\Utils::IsOwnCloud()) - { - if (\class_exists('OC_App')) - { - $sAppPath = \rtrim(\trim(\OC_App::getAppWebPath('rainloop')), '\\/').'/app/'; - } - - if (empty($sAppPath)) - { - $sUrl = \MailSo\Base\Http::SingletonInstance()->GetUrl(); - if ($sUrl && \preg_match('/\/index\.php\/apps\/rainloop/', $sUrl)) - { - $sAppPath = \preg_replace('/\/index\.php\/apps\/rainloop.+$/', - '/apps/rainloop/app/', $sUrl); - } - } - } - - return $sAppPath; - } - /** - * @return string - */ - public static function WebVersionPath() - { - return self::WebPath().'rainloop/v/'.APP_VERSION.'/'; - } - - /** - * @return string - */ - public static function WebStaticPath() - { - return self::WebVersionPath().'static/'; - } - - /** - * @param array $aSuggestions - * - * @return array - */ - public static function RemoveSuggestionDuplicates($aSuggestions) - { - $aResult = array(); - - if (is_array($aSuggestions)) - { - $aCache = array(); - foreach ($aSuggestions as $aItem) - { - $sLine = \implode('~~', $aItem); - if (!isset($aCache[$sLine])) - { - $aCache[$sLine] = true; - $aResult[] = $aItem; - } - } - } - - return $aResult; - } - - /** - * @param string $sFileName - * @param bool $bProcessSections = false - * - * @return array - */ - public static function CustomParseIniFile($sFileName, $bProcessSections = false) - { -// if (\MailSo\Base\Utils::FunctionExistsAndEnabled('parse_ini_file')) -// { -// return @\parse_ini_file($sFileName, !!$bProcessSections); -// } - - $sData = @\file_get_contents($sFileName); - return \is_string($sData) ? @\parse_ini_string($sData, !!$bProcessSections) : null; - } - - public static function CustomBaseConvert($sNumberInput, $sFromBaseInput = '0123456789', $sToBaseInput = '0123456789') - { - if ($sFromBaseInput === $sToBaseInput) - { - return $sNumberInput; - } - - $mFromBase = \str_split($sFromBaseInput, 1); - $mToBase = \str_split($sToBaseInput, 1); - $aNumber = \str_split($sNumberInput, 1); - $iFromLen = \strlen($sFromBaseInput); - $iToLen = \strlen($sToBaseInput); - $numberLen = \strlen($sNumberInput); - $mRetVal = ''; - - if ($sToBaseInput === '0123456789') - { - $mRetVal = 0; - for ($iIndex = 1; $iIndex <= $numberLen; $iIndex++) - { - $mRetVal = \bcadd($mRetVal, \bcmul(\array_search($aNumber[$iIndex - 1], $mFromBase), \bcpow($iFromLen, $numberLen - $iIndex))); - } - - return $mRetVal; - } - - if ($sFromBaseInput != '0123456789') - { - $sBase10 = \RainLoop\Utils::CustomBaseConvert($sNumberInput, $sFromBaseInput, '0123456789'); - } - else - { - $sBase10 = $sNumberInput; - } - - if ($sBase10 < \strlen($sToBaseInput)) - { - return $mToBase[$sBase10]; - } - - while ($sBase10 !== '0') - { - $mRetVal = $mToBase[\bcmod($sBase10, $iToLen)].$mRetVal; - $sBase10 = \bcdiv($sBase10, $iToLen, 0); - } - - return $mRetVal; - } -} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/AbstractBackend.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/AbstractBackend.php deleted file mode 100755 index eab64407..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/AbstractBackend.php +++ /dev/null @@ -1,155 +0,0 @@ - array( - * '{DAV:}displayname' => null, - * ), - * 424 => array( - * '{DAV:}owner' => null, - * ) - * ) - * - * In this example it was forbidden to update {DAV:}displayname. - * (403 Forbidden), which in turn also caused {DAV:}owner to fail - * (424 Failed Dependency) because the request needs to be atomic. - * - * @param mixed $calendarId - * @param array $mutations - * @return bool|array - */ - public function updateCalendar($calendarId, array $mutations) { - - return false; - - } - - /** - * Performs a calendar-query on the contents of this calendar. - * - * The calendar-query is defined in RFC4791 : CalDAV. Using the - * calendar-query it is possible for a client to request a specific set of - * object, based on contents of iCalendar properties, date-ranges and - * iCalendar component types (VTODO, VEVENT). - * - * This method should just return a list of (relative) urls that match this - * query. - * - * The list of filters are specified as an array. The exact array is - * documented by \SabreForRainLoop\CalDAV\CalendarQueryParser. - * - * Note that it is extremely likely that getCalendarObject for every path - * returned from this method will be called almost immediately after. You - * may want to anticipate this to speed up these requests. - * - * This method provides a default implementation, which parses *all* the - * iCalendar objects in the specified calendar. - * - * This default may well be good enough for personal use, and calendars - * that aren't very large. But if you anticipate high usage, big calendars - * or high loads, you are strongly adviced to optimize certain paths. - * - * The best way to do so is override this method and to optimize - * specifically for 'common filters'. - * - * Requests that are extremely common are: - * * requests for just VEVENTS - * * requests for just VTODO - * * requests with a time-range-filter on either VEVENT or VTODO. - * - * ..and combinations of these requests. It may not be worth it to try to - * handle every possible situation and just rely on the (relatively - * easy to use) CalendarQueryValidator to handle the rest. - * - * Note that especially time-range-filters may be difficult to parse. A - * time-range filter specified on a VEVENT must for instance also handle - * recurrence rules correctly. - * A good example of how to interprete all these filters can also simply - * be found in \SabreForRainLoop\CalDAV\CalendarQueryFilter. This class is as correct - * as possible, so it gives you a good idea on what type of stuff you need - * to think of. - * - * @param mixed $calendarId - * @param array $filters - * @return array - */ - public function calendarQuery($calendarId, array $filters) { - - $result = array(); - $objects = $this->getCalendarObjects($calendarId); - - $validator = new \SabreForRainLoop\CalDAV\CalendarQueryValidator(); - - foreach($objects as $object) { - - if ($this->validateFilterForObject($object, $filters)) { - $result[] = $object['uri']; - } - - } - - return $result; - - } - - /** - * This method validates if a filters (as passed to calendarQuery) matches - * the given object. - * - * @param array $object - * @param array $filters - * @return bool - */ - protected function validateFilterForObject(array $object, array $filters) { - - // Unfortunately, setting the 'calendardata' here is optional. If - // it was excluded, we actually need another call to get this as - // well. - if (!isset($object['calendardata'])) { - $object = $this->getCalendarObject($object['calendarid'], $object['uri']); - } - - $data = is_resource($object['calendardata'])?stream_get_contents($object['calendardata']):$object['calendardata']; - $vObject = VObject\Reader::read($data); - - $validator = new CalDAV\CalendarQueryValidator(); - return $validator->validate($vObject, $filters); - - } - - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/BackendInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/BackendInterface.php deleted file mode 100755 index ddfe5d8c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/BackendInterface.php +++ /dev/null @@ -1,233 +0,0 @@ - array( - * '{DAV:}displayname' => null, - * ), - * 424 => array( - * '{DAV:}owner' => null, - * ) - * ) - * - * In this example it was forbidden to update {DAV:}displayname. - * (403 Forbidden), which in turn also caused {DAV:}owner to fail - * (424 Failed Dependency) because the request needs to be atomic. - * - * @param mixed $calendarId - * @param array $mutations - * @return bool|array - */ - public function updateCalendar($calendarId, array $mutations); - - /** - * Delete a calendar and all it's objects - * - * @param mixed $calendarId - * @return void - */ - public function deleteCalendar($calendarId); - - /** - * Returns all calendar objects within a calendar. - * - * Every item contains an array with the following keys: - * * id - unique identifier which will be used for subsequent updates - * * calendardata - The iCalendar-compatible calendar data - * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string. - * * lastmodified - a timestamp of the last modification time - * * etag - An arbitrary string, surrounded by double-quotes. (e.g.: - * ' "abcdef"') - * * calendarid - The calendarid as it was passed to this function. - * * size - The size of the calendar objects, in bytes. - * - * Note that the etag is optional, but it's highly encouraged to return for - * speed reasons. - * - * The calendardata is also optional. If it's not returned - * 'getCalendarObject' will be called later, which *is* expected to return - * calendardata. - * - * If neither etag or size are specified, the calendardata will be - * used/fetched to determine these numbers. If both are specified the - * amount of times this is needed is reduced by a great degree. - * - * @param mixed $calendarId - * @return array - */ - public function getCalendarObjects($calendarId); - - /** - * Returns information from a single calendar object, based on it's object - * uri. - * - * The returned array must have the same keys as getCalendarObjects. The - * 'calendardata' object is required here though, while it's not required - * for getCalendarObjects. - * - * This method must return null if the object did not exist. - * - * @param mixed $calendarId - * @param string $objectUri - * @return array|null - */ - public function getCalendarObject($calendarId,$objectUri); - - /** - * Creates a new calendar object. - * - * It is possible return an etag from this function, which will be used in - * the response to this PUT request. Note that the ETag must be surrounded - * by double-quotes. - * - * However, you should only really return this ETag if you don't mangle the - * calendar-data. If the result of a subsequent GET to this object is not - * the exact same as this request body, you should omit the ETag. - * - * @param mixed $calendarId - * @param string $objectUri - * @param string $calendarData - * @return string|null - */ - public function createCalendarObject($calendarId,$objectUri,$calendarData); - - /** - * Updates an existing calendarobject, based on it's uri. - * - * It is possible return an etag from this function, which will be used in - * the response to this PUT request. Note that the ETag must be surrounded - * by double-quotes. - * - * However, you should only really return this ETag if you don't mangle the - * calendar-data. If the result of a subsequent GET to this object is not - * the exact same as this request body, you should omit the ETag. - * - * @param mixed $calendarId - * @param string $objectUri - * @param string $calendarData - * @return string|null - */ - public function updateCalendarObject($calendarId,$objectUri,$calendarData); - - /** - * Deletes an existing calendar object. - * - * @param mixed $calendarId - * @param string $objectUri - * @return void - */ - public function deleteCalendarObject($calendarId,$objectUri); - - /** - * Performs a calendar-query on the contents of this calendar. - * - * The calendar-query is defined in RFC4791 : CalDAV. Using the - * calendar-query it is possible for a client to request a specific set of - * object, based on contents of iCalendar properties, date-ranges and - * iCalendar component types (VTODO, VEVENT). - * - * This method should just return a list of (relative) urls that match this - * query. - * - * The list of filters are specified as an array. The exact array is - * documented by SabreForRainLoop\CalDAV\CalendarQueryParser. - * - * Note that it is extremely likely that getCalendarObject for every path - * returned from this method will be called almost immediately after. You - * may want to anticipate this to speed up these requests. - * - * This method provides a default implementation, which parses *all* the - * iCalendar objects in the specified calendar. - * - * This default may well be good enough for personal use, and calendars - * that aren't very large. But if you anticipate high usage, big calendars - * or high loads, you are strongly adviced to optimize certain paths. - * - * The best way to do so is override this method and to optimize - * specifically for 'common filters'. - * - * Requests that are extremely common are: - * * requests for just VEVENTS - * * requests for just VTODO - * * requests with a time-range-filter on either VEVENT or VTODO. - * - * ..and combinations of these requests. It may not be worth it to try to - * handle every possible situation and just rely on the (relatively - * easy to use) CalendarQueryValidator to handle the rest. - * - * Note that especially time-range-filters may be difficult to parse. A - * time-range filter specified on a VEVENT must for instance also handle - * recurrence rules correctly. - * A good example of how to interprete all these filters can also simply - * be found in SabreForRainLoop\CalDAV\CalendarQueryFilter. This class is as correct - * as possible, so it gives you a good idea on what type of stuff you need - * to think of. - * - * @param mixed $calendarId - * @param array $filters - * @return array - */ - public function calendarQuery($calendarId, array $filters); - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/NotificationSupport.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/NotificationSupport.php deleted file mode 100755 index 9ae43c8b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/NotificationSupport.php +++ /dev/null @@ -1,47 +0,0 @@ - 'displayname', - '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'description', - '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => 'timezone', - '{http://apple.com/ns/ical/}calendar-order' => 'calendarorder', - '{http://apple.com/ns/ical/}calendar-color' => 'calendarcolor', - ); - - /** - * Creates the backend - * - * @param \PDO $pdo - * @param string $calendarTableName - * @param string $calendarObjectTableName - */ - public function __construct(\PDO $pdo, $calendarTableName = 'calendars', $calendarObjectTableName = 'calendarobjects') { - - $this->pdo = $pdo; - $this->calendarTableName = $calendarTableName; - $this->calendarObjectTableName = $calendarObjectTableName; - - } - - /** - * Returns a list of calendars for a principal. - * - * Every project is an array with the following keys: - * * id, a unique id that will be used by other functions to modify the - * calendar. This can be the same as the uri or a database key. - * * uri, which the basename of the uri with which the calendar is - * accessed. - * * principaluri. The owner of the calendar. Almost always the same as - * principalUri passed to this method. - * - * Furthermore it can contain webdav properties in clark notation. A very - * common one is '{DAV:}displayname'. - * - * @param string $principalUri - * @return array - */ - public function getCalendarsForUser($principalUri) { - - $fields = array_values($this->propertyMap); - $fields[] = 'id'; - $fields[] = 'uri'; - $fields[] = 'ctag'; - $fields[] = 'components'; - $fields[] = 'principaluri'; - $fields[] = 'transparent'; - - // Making fields a comma-delimited list - $fields = implode(', ', $fields); - $stmt = $this->pdo->prepare("SELECT " . $fields . " FROM ".$this->calendarTableName." WHERE principaluri = ? ORDER BY calendarorder ASC"); - $stmt->execute(array($principalUri)); - - $calendars = array(); - while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { - - $components = array(); - if ($row['components']) { - $components = explode(',',$row['components']); - } - - $calendar = array( - 'id' => $row['id'], - 'uri' => $row['uri'], - 'principaluri' => $row['principaluri'], - '{' . CalDAV\Plugin::NS_CALENDARSERVER . '}getctag' => $row['ctag']?$row['ctag']:'0', - '{' . CalDAV\Plugin::NS_CALDAV . '}supported-calendar-component-set' => new CalDAV\Property\SupportedCalendarComponentSet($components), - '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-calendar-transp' => new CalDAV\Property\ScheduleCalendarTransp($row['transparent']?'transparent':'opaque'), - ); - - - foreach($this->propertyMap as $xmlName=>$dbName) { - $calendar[$xmlName] = $row[$dbName]; - } - - $calendars[] = $calendar; - - } - - return $calendars; - - } - - /** - * Creates a new calendar for a principal. - * - * If the creation was a success, an id must be returned that can be used to reference - * this calendar in other methods, such as updateCalendar - * - * @param string $principalUri - * @param string $calendarUri - * @param array $properties - * @return string - */ - public function createCalendar($principalUri, $calendarUri, array $properties) { - - $fieldNames = array( - 'principaluri', - 'uri', - 'ctag', - 'transparent', - ); - $values = array( - ':principaluri' => $principalUri, - ':uri' => $calendarUri, - ':ctag' => 1, - ':transparent' => 0, - ); - - // Default value - $sccs = '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set'; - $fieldNames[] = 'components'; - if (!isset($properties[$sccs])) { - $values[':components'] = 'VEVENT,VTODO'; - } else { - if (!($properties[$sccs] instanceof CalDAV\Property\SupportedCalendarComponentSet)) { - throw new DAV\Exception('The ' . $sccs . ' property must be of type: \SabreForRainLoop\CalDAV\Property\SupportedCalendarComponentSet'); - } - $values[':components'] = implode(',',$properties[$sccs]->getValue()); - } - $transp = '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-calendar-transp'; - if (isset($properties[$transp])) { - $values[':transparent'] = $properties[$transp]->getValue()==='transparent'; - } - - foreach($this->propertyMap as $xmlName=>$dbName) { - if (isset($properties[$xmlName])) { - - $values[':' . $dbName] = $properties[$xmlName]; - $fieldNames[] = $dbName; - } - } - - $stmt = $this->pdo->prepare("INSERT INTO ".$this->calendarTableName." (".implode(', ', $fieldNames).") VALUES (".implode(', ',array_keys($values)).")"); - $stmt->execute($values); - - return $this->pdo->lastInsertId(); - - } - - /** - * Updates properties for a calendar. - * - * The mutations array uses the propertyName in clark-notation as key, - * and the array value for the property value. In the case a property - * should be deleted, the property value will be null. - * - * This method must be atomic. If one property cannot be changed, the - * entire operation must fail. - * - * If the operation was successful, true can be returned. - * If the operation failed, false can be returned. - * - * Deletion of a non-existent property is always successful. - * - * Lastly, it is optional to return detailed information about any - * failures. In this case an array should be returned with the following - * structure: - * - * array( - * 403 => array( - * '{DAV:}displayname' => null, - * ), - * 424 => array( - * '{DAV:}owner' => null, - * ) - * ) - * - * In this example it was forbidden to update {DAV:}displayname. - * (403 Forbidden), which in turn also caused {DAV:}owner to fail - * (424 Failed Dependency) because the request needs to be atomic. - * - * @param string $calendarId - * @param array $mutations - * @return bool|array - */ - public function updateCalendar($calendarId, array $mutations) { - - $newValues = array(); - $result = array( - 200 => array(), // Ok - 403 => array(), // Forbidden - 424 => array(), // Failed Dependency - ); - - $hasError = false; - - foreach($mutations as $propertyName=>$propertyValue) { - - switch($propertyName) { - case '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-calendar-transp' : - $fieldName = 'transparent'; - $newValues[$fieldName] = $propertyValue->getValue()==='transparent'; - break; - default : - // Checking the property map - if (!isset($this->propertyMap[$propertyName])) { - // We don't know about this property. - $hasError = true; - $result[403][$propertyName] = null; - unset($mutations[$propertyName]); - continue; - } - - $fieldName = $this->propertyMap[$propertyName]; - $newValues[$fieldName] = $propertyValue; - } - - } - - // If there were any errors we need to fail the request - if ($hasError) { - // Properties has the remaining properties - foreach($mutations as $propertyName=>$propertyValue) { - $result[424][$propertyName] = null; - } - - // Removing unused statuscodes for cleanliness - foreach($result as $status=>$properties) { - if (is_array($properties) && count($properties)===0) unset($result[$status]); - } - - return $result; - - } - - // Success - - // Now we're generating the sql query. - $valuesSql = array(); - foreach($newValues as $fieldName=>$value) { - $valuesSql[] = $fieldName . ' = ?'; - } - $valuesSql[] = 'ctag = ctag + 1'; - - $stmt = $this->pdo->prepare("UPDATE " . $this->calendarTableName . " SET " . implode(', ',$valuesSql) . " WHERE id = ?"); - $newValues['id'] = $calendarId; - $stmt->execute(array_values($newValues)); - - return true; - - } - - /** - * Delete a calendar and all it's objects - * - * @param string $calendarId - * @return void - */ - public function deleteCalendar($calendarId) { - - $stmt = $this->pdo->prepare('DELETE FROM '.$this->calendarObjectTableName.' WHERE calendarid = ?'); - $stmt->execute(array($calendarId)); - - $stmt = $this->pdo->prepare('DELETE FROM '.$this->calendarTableName.' WHERE id = ?'); - $stmt->execute(array($calendarId)); - - } - - /** - * Returns all calendar objects within a calendar. - * - * Every item contains an array with the following keys: - * * id - unique identifier which will be used for subsequent updates - * * calendardata - The iCalendar-compatible calendar data - * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string. - * * lastmodified - a timestamp of the last modification time - * * etag - An arbitrary string, surrounded by double-quotes. (e.g.: - * ' "abcdef"') - * * calendarid - The calendarid as it was passed to this function. - * * size - The size of the calendar objects, in bytes. - * - * Note that the etag is optional, but it's highly encouraged to return for - * speed reasons. - * - * The calendardata is also optional. If it's not returned - * 'getCalendarObject' will be called later, which *is* expected to return - * calendardata. - * - * If neither etag or size are specified, the calendardata will be - * used/fetched to determine these numbers. If both are specified the - * amount of times this is needed is reduced by a great degree. - * - * @param string $calendarId - * @return array - */ - public function getCalendarObjects($calendarId) { - - $stmt = $this->pdo->prepare('SELECT id, uri, lastmodified, etag, calendarid, size FROM '.$this->calendarObjectTableName.' WHERE calendarid = ?'); - $stmt->execute(array($calendarId)); - - $result = array(); - foreach($stmt->fetchAll(\PDO::FETCH_ASSOC) as $row) { - $result[] = array( - 'id' => $row['id'], - 'uri' => $row['uri'], - 'lastmodified' => $row['lastmodified'], - 'etag' => '"' . $row['etag'] . '"', - 'calendarid' => $row['calendarid'], - 'size' => (int)$row['size'], - ); - } - - return $result; - - } - - /** - * Returns information from a single calendar object, based on it's object - * uri. - * - * The returned array must have the same keys as getCalendarObjects. The - * 'calendardata' object is required here though, while it's not required - * for getCalendarObjects. - * - * This method must return null if the object did not exist. - * - * @param string $calendarId - * @param string $objectUri - * @return array|null - */ - public function getCalendarObject($calendarId,$objectUri) { - - $stmt = $this->pdo->prepare('SELECT id, uri, lastmodified, etag, calendarid, size, calendardata FROM '.$this->calendarObjectTableName.' WHERE calendarid = ? AND uri = ?'); - $stmt->execute(array($calendarId, $objectUri)); - $row = $stmt->fetch(\PDO::FETCH_ASSOC); - - if(!$row) return null; - - return array( - 'id' => $row['id'], - 'uri' => $row['uri'], - 'lastmodified' => $row['lastmodified'], - 'etag' => '"' . $row['etag'] . '"', - 'calendarid' => $row['calendarid'], - 'size' => (int)$row['size'], - 'calendardata' => $row['calendardata'], - ); - - } - - - /** - * Creates a new calendar object. - * - * It is possible return an etag from this function, which will be used in - * the response to this PUT request. Note that the ETag must be surrounded - * by double-quotes. - * - * However, you should only really return this ETag if you don't mangle the - * calendar-data. If the result of a subsequent GET to this object is not - * the exact same as this request body, you should omit the ETag. - * - * @param mixed $calendarId - * @param string $objectUri - * @param string $calendarData - * @return string|null - */ - public function createCalendarObject($calendarId,$objectUri,$calendarData) { - - $extraData = $this->getDenormalizedData($calendarData); - - $stmt = $this->pdo->prepare('INSERT INTO '.$this->calendarObjectTableName.' (calendarid, uri, calendardata, lastmodified, etag, size, componenttype, firstoccurence, lastoccurence) VALUES (?,?,?,?,?,?,?,?,?)'); - $stmt->execute(array( - $calendarId, - $objectUri, - $calendarData, - time(), - $extraData['etag'], - $extraData['size'], - $extraData['componentType'], - $extraData['firstOccurence'], - $extraData['lastOccurence'], - )); - $stmt = $this->pdo->prepare('UPDATE '.$this->calendarTableName.' SET ctag = ctag + 1 WHERE id = ?'); - $stmt->execute(array($calendarId)); - - return '"' . $extraData['etag'] . '"'; - - } - - /** - * Updates an existing calendarobject, based on it's uri. - * - * It is possible return an etag from this function, which will be used in - * the response to this PUT request. Note that the ETag must be surrounded - * by double-quotes. - * - * However, you should only really return this ETag if you don't mangle the - * calendar-data. If the result of a subsequent GET to this object is not - * the exact same as this request body, you should omit the ETag. - * - * @param mixed $calendarId - * @param string $objectUri - * @param string $calendarData - * @return string|null - */ - public function updateCalendarObject($calendarId,$objectUri,$calendarData) { - - $extraData = $this->getDenormalizedData($calendarData); - - $stmt = $this->pdo->prepare('UPDATE '.$this->calendarObjectTableName.' SET calendardata = ?, lastmodified = ?, etag = ?, size = ?, componenttype = ?, firstoccurence = ?, lastoccurence = ? WHERE calendarid = ? AND uri = ?'); - $stmt->execute(array($calendarData,time(), $extraData['etag'], $extraData['size'], $extraData['componentType'], $extraData['firstOccurence'], $extraData['lastOccurence'] ,$calendarId,$objectUri)); - $stmt = $this->pdo->prepare('UPDATE '.$this->calendarTableName.' SET ctag = ctag + 1 WHERE id = ?'); - $stmt->execute(array($calendarId)); - - return '"' . $extraData['etag'] . '"'; - - } - - /** - * Parses some information from calendar objects, used for optimized - * calendar-queries. - * - * Returns an array with the following keys: - * * etag - * * size - * * componentType - * * firstOccurence - * * lastOccurence - * - * @param string $calendarData - * @return array - */ - protected function getDenormalizedData($calendarData) { - - $vObject = VObject\Reader::read($calendarData); - $componentType = null; - $component = null; - $firstOccurence = null; - $lastOccurence = null; - foreach($vObject->getComponents() as $component) { - if ($component->name!=='VTIMEZONE') { - $componentType = $component->name; - break; - } - } - if (!$componentType) { - throw new \SabreForRainLoop\DAV\Exception\BadRequest('Calendar objects must have a VJOURNAL, VEVENT or VTODO component'); - } - if ($componentType === 'VEVENT') { - $firstOccurence = $component->DTSTART->getDateTime()->getTimeStamp(); - // Finding the last occurence is a bit harder - if (!isset($component->RRULE)) { - if (isset($component->DTEND)) { - $lastOccurence = $component->DTEND->getDateTime()->getTimeStamp(); - } elseif (isset($component->DURATION)) { - $endDate = clone $component->DTSTART->getDateTime(); - $endDate->add(VObject\DateTimeParser::parse($component->DURATION->getValue())); - $lastOccurence = $endDate->getTimeStamp(); - } elseif (!$component->DTSTART->hasTime()) { - $endDate = clone $component->DTSTART->getDateTime(); - $endDate->modify('+1 day'); - $lastOccurence = $endDate->getTimeStamp(); - } else { - $lastOccurence = $firstOccurence; - } - } else { - $it = new VObject\RecurrenceIterator($vObject, (string)$component->UID); - $maxDate = new \DateTime(self::MAX_DATE); - if ($it->isInfinite()) { - $lastOccurence = $maxDate->getTimeStamp(); - } else { - $end = $it->getDtEnd(); - while($it->valid() && $end < $maxDate) { - $end = $it->getDtEnd(); - $it->next(); - - } - $lastOccurence = $end->getTimeStamp(); - } - - } - } - - return array( - 'etag' => md5($calendarData), - 'size' => strlen($calendarData), - 'componentType' => $componentType, - 'firstOccurence' => $firstOccurence, - 'lastOccurence' => $lastOccurence, - ); - - } - - /** - * Deletes an existing calendar object. - * - * @param string $calendarId - * @param string $objectUri - * @return void - */ - public function deleteCalendarObject($calendarId,$objectUri) { - - $stmt = $this->pdo->prepare('DELETE FROM '.$this->calendarObjectTableName.' WHERE calendarid = ? AND uri = ?'); - $stmt->execute(array($calendarId,$objectUri)); - $stmt = $this->pdo->prepare('UPDATE '. $this->calendarTableName .' SET ctag = ctag + 1 WHERE id = ?'); - $stmt->execute(array($calendarId)); - - } - - /** - * Performs a calendar-query on the contents of this calendar. - * - * The calendar-query is defined in RFC4791 : CalDAV. Using the - * calendar-query it is possible for a client to request a specific set of - * object, based on contents of iCalendar properties, date-ranges and - * iCalendar component types (VTODO, VEVENT). - * - * This method should just return a list of (relative) urls that match this - * query. - * - * The list of filters are specified as an array. The exact array is - * documented by \SabreForRainLoop\CalDAV\CalendarQueryParser. - * - * Note that it is extremely likely that getCalendarObject for every path - * returned from this method will be called almost immediately after. You - * may want to anticipate this to speed up these requests. - * - * This method provides a default implementation, which parses *all* the - * iCalendar objects in the specified calendar. - * - * This default may well be good enough for personal use, and calendars - * that aren't very large. But if you anticipate high usage, big calendars - * or high loads, you are strongly adviced to optimize certain paths. - * - * The best way to do so is override this method and to optimize - * specifically for 'common filters'. - * - * Requests that are extremely common are: - * * requests for just VEVENTS - * * requests for just VTODO - * * requests with a time-range-filter on a VEVENT. - * - * ..and combinations of these requests. It may not be worth it to try to - * handle every possible situation and just rely on the (relatively - * easy to use) CalendarQueryValidator to handle the rest. - * - * Note that especially time-range-filters may be difficult to parse. A - * time-range filter specified on a VEVENT must for instance also handle - * recurrence rules correctly. - * A good example of how to interprete all these filters can also simply - * be found in \SabreForRainLoop\CalDAV\CalendarQueryFilter. This class is as correct - * as possible, so it gives you a good idea on what type of stuff you need - * to think of. - * - * This specific implementation (for the PDO) backend optimizes filters on - * specific components, and VEVENT time-ranges. - * - * @param string $calendarId - * @param array $filters - * @return array - */ - public function calendarQuery($calendarId, array $filters) { - - $result = array(); - $validator = new \SabreForRainLoop\CalDAV\CalendarQueryValidator(); - - $componentType = null; - $requirePostFilter = true; - $timeRange = null; - - // if no filters were specified, we don't need to filter after a query - if (!$filters['prop-filters'] && !$filters['comp-filters']) { - $requirePostFilter = false; - } - - // Figuring out if there's a component filter - if (count($filters['comp-filters']) > 0 && !$filters['comp-filters'][0]['is-not-defined']) { - $componentType = $filters['comp-filters'][0]['name']; - - // Checking if we need post-filters - if (!$filters['prop-filters'] && !$filters['comp-filters'][0]['comp-filters'] && !$filters['comp-filters'][0]['time-range'] && !$filters['comp-filters'][0]['prop-filters']) { - $requirePostFilter = false; - } - // There was a time-range filter - if ($componentType == 'VEVENT' && isset($filters['comp-filters'][0]['time-range'])) { - $timeRange = $filters['comp-filters'][0]['time-range']; - - // If start time OR the end time is not specified, we can do a - // 100% accurate mysql query. - if (!$filters['prop-filters'] && !$filters['comp-filters'][0]['comp-filters'] && !$filters['comp-filters'][0]['prop-filters'] && (!$timeRange['start'] || !$timeRange['end'])) { - $requirePostFilter = false; - } - } - - } - - if ($requirePostFilter) { - $query = "SELECT uri, calendardata FROM ".$this->calendarObjectTableName." WHERE calendarid = :calendarid"; - } else { - $query = "SELECT uri FROM ".$this->calendarObjectTableName." WHERE calendarid = :calendarid"; - } - - $values = array( - 'calendarid' => $calendarId, - ); - - if ($componentType) { - $query.=" AND componenttype = :componenttype"; - $values['componenttype'] = $componentType; - } - - if ($timeRange && $timeRange['start']) { - $query.=" AND lastoccurence > :startdate"; - $values['startdate'] = $timeRange['start']->getTimeStamp(); - } - if ($timeRange && $timeRange['end']) { - $query.=" AND firstoccurence < :enddate"; - $values['enddate'] = $timeRange['end']->getTimeStamp(); - } - - $stmt = $this->pdo->prepare($query); - $stmt->execute($values); - - $result = array(); - while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { - if ($requirePostFilter) { - if (!$this->validateFilterForObject($row, $filters)) { - continue; - } - } - $result[] = $row['uri']; - - } - - return $result; - - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/SharingSupport.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/SharingSupport.php deleted file mode 100755 index 3bfcc145..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Backend/SharingSupport.php +++ /dev/null @@ -1,243 +0,0 @@ -caldavBackend = $caldavBackend; - $this->calendarInfo = $calendarInfo; - - } - - /** - * Returns the name of the calendar - * - * @return string - */ - public function getName() { - - return $this->calendarInfo['uri']; - - } - - /** - * Updates properties such as the display name and description - * - * @param array $mutations - * @return array - */ - public function updateProperties($mutations) { - - return $this->caldavBackend->updateCalendar($this->calendarInfo['id'],$mutations); - - } - - /** - * Returns the list of properties - * - * @param array $requestedProperties - * @return array - */ - public function getProperties($requestedProperties) { - - $response = array(); - - foreach($requestedProperties as $prop) switch($prop) { - - case '{urn:ietf:params:xml:ns:caldav}supported-calendar-data' : - $response[$prop] = new Property\SupportedCalendarData(); - break; - case '{urn:ietf:params:xml:ns:caldav}supported-collation-set' : - $response[$prop] = new Property\SupportedCollationSet(); - break; - case '{DAV:}owner' : - $response[$prop] = new DAVACL\Property\Principal(DAVACL\Property\Principal::HREF,$this->calendarInfo['principaluri']); - break; - default : - if (isset($this->calendarInfo[$prop])) $response[$prop] = $this->calendarInfo[$prop]; - break; - - } - return $response; - - } - - /** - * Returns a calendar object - * - * The contained calendar objects are for example Events or Todo's. - * - * @param string $name - * @return \SabreForRainLoop\CalDAV\ICalendarObject - */ - public function getChild($name) { - - $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'],$name); - - if (!$obj) throw new DAV\Exception\NotFound('Calendar object not found'); - - $obj['acl'] = $this->getACL(); - // Removing the irrelivant - foreach($obj['acl'] as $key=>$acl) { - if ($acl['privilege'] === '{' . Plugin::NS_CALDAV . '}read-free-busy') { - unset($obj['acl'][$key]); - } - } - - return new CalendarObject($this->caldavBackend,$this->calendarInfo,$obj); - - } - - /** - * Returns the full list of calendar objects - * - * @return array - */ - public function getChildren() { - - $objs = $this->caldavBackend->getCalendarObjects($this->calendarInfo['id']); - $children = array(); - foreach($objs as $obj) { - $obj['acl'] = $this->getACL(); - // Removing the irrelivant - foreach($obj['acl'] as $key=>$acl) { - if ($acl['privilege'] === '{' . Plugin::NS_CALDAV . '}read-free-busy') { - unset($obj['acl'][$key]); - } - } - $children[] = new CalendarObject($this->caldavBackend,$this->calendarInfo,$obj); - } - return $children; - - } - - /** - * Checks if a child-node exists. - * - * @param string $name - * @return bool - */ - public function childExists($name) { - - $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'],$name); - if (!$obj) - return false; - else - return true; - - } - - /** - * Creates a new directory - * - * We actually block this, as subdirectories are not allowed in calendars. - * - * @param string $name - * @return void - */ - public function createDirectory($name) { - - throw new DAV\Exception\MethodNotAllowed('Creating collections in calendar objects is not allowed'); - - } - - /** - * Creates a new file - * - * The contents of the new file must be a valid ICalendar string. - * - * @param string $name - * @param resource $calendarData - * @return string|null - */ - public function createFile($name,$calendarData = null) { - - if (is_resource($calendarData)) { - $calendarData = stream_get_contents($calendarData); - } - return $this->caldavBackend->createCalendarObject($this->calendarInfo['id'],$name,$calendarData); - - } - - /** - * Deletes the calendar. - * - * @return void - */ - public function delete() { - - $this->caldavBackend->deleteCalendar($this->calendarInfo['id']); - - } - - /** - * Renames the calendar. Note that most calendars use the - * {DAV:}displayname to display a name to display a name. - * - * @param string $newName - * @return void - */ - public function setName($newName) { - - throw new DAV\Exception\MethodNotAllowed('Renaming calendars is not yet supported'); - - } - - /** - * Returns the last modification date as a unix timestamp. - * - * @return void - */ - public function getLastModified() { - - return null; - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->calendarInfo['principaluri']; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->getOwner(), - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->getOwner(), - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->getOwner() . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->getOwner() . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->getOwner() . '/calendar-proxy-read', - 'protected' => true, - ), - array( - 'privilege' => '{' . Plugin::NS_CALDAV . '}read-free-busy', - 'principal' => '{DAV:}authenticated', - 'protected' => true, - ), - - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported'); - - } - - /** - * Returns the list of supported privileges for this node. - * - * The returned data structure is a list of nested privileges. - * See \SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple - * standard structure. - * - * If null is returned from this method, the default privilege set is used, - * which is fine for most common usecases. - * - * @return array|null - */ - public function getSupportedPrivilegeSet() { - - $default = DAVACL\Plugin::getDefaultSupportedPrivilegeSet(); - - // We need to inject 'read-free-busy' in the tree, aggregated under - // {DAV:}read. - foreach($default['aggregates'] as &$agg) { - - if ($agg['privilege'] !== '{DAV:}read') continue; - - $agg['aggregates'][] = array( - 'privilege' => '{' . Plugin::NS_CALDAV . '}read-free-busy', - ); - - } - return $default; - - } - - /** - * Performs a calendar-query on the contents of this calendar. - * - * The calendar-query is defined in RFC4791 : CalDAV. Using the - * calendar-query it is possible for a client to request a specific set of - * object, based on contents of iCalendar properties, date-ranges and - * iCalendar component types (VTODO, VEVENT). - * - * This method should just return a list of (relative) urls that match this - * query. - * - * The list of filters are specified as an array. The exact array is - * documented by SabreForRainLoop\CalDAV\CalendarQueryParser. - * - * @param array $filters - * @return array - */ - public function calendarQuery(array $filters) { - - return $this->caldavBackend->calendarQuery($this->calendarInfo['id'], $filters); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarObject.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarObject.php deleted file mode 100755 index 9f6b4988..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarObject.php +++ /dev/null @@ -1,279 +0,0 @@ -caldavBackend = $caldavBackend; - - if (!isset($objectData['calendarid'])) { - throw new \InvalidArgumentException('The objectData argument must contain a \'calendarid\' property'); - } - if (!isset($objectData['uri'])) { - throw new \InvalidArgumentException('The objectData argument must contain an \'uri\' property'); - } - - $this->calendarInfo = $calendarInfo; - $this->objectData = $objectData; - - } - - /** - * Returns the uri for this object - * - * @return string - */ - public function getName() { - - return $this->objectData['uri']; - - } - - /** - * Returns the ICalendar-formatted object - * - * @return string - */ - public function get() { - - // Pre-populating the 'calendardata' is optional, if we don't have it - // already we fetch it from the backend. - if (!isset($this->objectData['calendardata'])) { - $this->objectData = $this->caldavBackend->getCalendarObject($this->objectData['calendarid'], $this->objectData['uri']); - } - return $this->objectData['calendardata']; - - } - - /** - * Updates the ICalendar-formatted object - * - * @param string|resource $calendarData - * @return string - */ - public function put($calendarData) { - - if (is_resource($calendarData)) { - $calendarData = stream_get_contents($calendarData); - } - $etag = $this->caldavBackend->updateCalendarObject($this->calendarInfo['id'],$this->objectData['uri'],$calendarData); - $this->objectData['calendardata'] = $calendarData; - $this->objectData['etag'] = $etag; - - return $etag; - - } - - /** - * Deletes the calendar object - * - * @return void - */ - public function delete() { - - $this->caldavBackend->deleteCalendarObject($this->calendarInfo['id'],$this->objectData['uri']); - - } - - /** - * Returns the mime content-type - * - * @return string - */ - public function getContentType() { - - return 'text/calendar; charset=utf-8'; - - } - - /** - * Returns an ETag for this object. - * - * The ETag is an arbitrary string, but MUST be surrounded by double-quotes. - * - * @return string - */ - public function getETag() { - - if (isset($this->objectData['etag'])) { - return $this->objectData['etag']; - } else { - return '"' . md5($this->get()). '"'; - } - - } - - /** - * Returns the last modification date as a unix timestamp - * - * @return int - */ - public function getLastModified() { - - return $this->objectData['lastmodified']; - - } - - /** - * Returns the size of this object in bytes - * - * @return int - */ - public function getSize() { - - if (array_key_exists('size',$this->objectData)) { - return $this->objectData['size']; - } else { - return strlen($this->get()); - } - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->calendarInfo['principaluri']; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - // An alternative acl may be specified in the object data. - if (isset($this->objectData['acl'])) { - return $this->objectData['acl']; - } - - // The default ACL - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->calendarInfo['principaluri'], - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->calendarInfo['principaluri'], - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-read', - 'protected' => true, - ), - - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new \SabreForRainLoop\DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported'); - - } - - /** - * Returns the list of supported privileges for this node. - * - * The returned data structure is a list of nested privileges. - * See \SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple - * standard structure. - * - * If null is returned from this method, the default privilege set is used, - * which is fine for most common usecases. - * - * @return array|null - */ - public function getSupportedPrivilegeSet() { - - return null; - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarQueryParser.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarQueryParser.php deleted file mode 100755 index 8a3aec7f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarQueryParser.php +++ /dev/null @@ -1,298 +0,0 @@ -dom = $dom; - $this->xpath = new \DOMXPath($dom); - $this->xpath->registerNameSpace('cal',Plugin::NS_CALDAV); - $this->xpath->registerNameSpace('dav','urn:DAV'); - - } - - /** - * Parses the request. - * - * @return void - */ - public function parse() { - - $filterNode = null; - - $filter = $this->xpath->query('/cal:calendar-query/cal:filter'); - if ($filter->length !== 1) { - throw new \SabreForRainLoop\DAV\Exception\BadRequest('Only one filter element is allowed'); - } - - $compFilters = $this->parseCompFilters($filter->item(0)); - if (count($compFilters)!==1) { - throw new \SabreForRainLoop\DAV\Exception\BadRequest('There must be exactly 1 top-level comp-filter.'); - } - - $this->filters = $compFilters[0]; - $this->requestedProperties = array_keys(\SabreForRainLoop\DAV\XMLUtil::parseProperties($this->dom->firstChild)); - - $expand = $this->xpath->query('/cal:calendar-query/dav:prop/cal:calendar-data/cal:expand'); - if ($expand->length>0) { - $this->expand = $this->parseExpand($expand->item(0)); - } - - - } - - /** - * Parses all the 'comp-filter' elements from a node - * - * @param \DOMElement $parentNode - * @return array - */ - protected function parseCompFilters(\DOMElement $parentNode) { - - $compFilterNodes = $this->xpath->query('cal:comp-filter', $parentNode); - $result = array(); - - for($ii=0; $ii < $compFilterNodes->length; $ii++) { - - $compFilterNode = $compFilterNodes->item($ii); - - $compFilter = array(); - $compFilter['name'] = $compFilterNode->getAttribute('name'); - $compFilter['is-not-defined'] = $this->xpath->query('cal:is-not-defined', $compFilterNode)->length>0; - $compFilter['comp-filters'] = $this->parseCompFilters($compFilterNode); - $compFilter['prop-filters'] = $this->parsePropFilters($compFilterNode); - $compFilter['time-range'] = $this->parseTimeRange($compFilterNode); - - if ($compFilter['time-range'] && !in_array($compFilter['name'],array( - 'VEVENT', - 'VTODO', - 'VJOURNAL', - 'VFREEBUSY', - 'VALARM', - ))) { - throw new \SabreForRainLoop\DAV\Exception\BadRequest('The time-range filter is not defined for the ' . $compFilter['name'] . ' component'); - }; - - $result[] = $compFilter; - - } - - return $result; - - } - - /** - * Parses all the prop-filter elements from a node - * - * @param \DOMElement $parentNode - * @return array - */ - protected function parsePropFilters(\DOMElement $parentNode) { - - $propFilterNodes = $this->xpath->query('cal:prop-filter', $parentNode); - $result = array(); - - for ($ii=0; $ii < $propFilterNodes->length; $ii++) { - - $propFilterNode = $propFilterNodes->item($ii); - $propFilter = array(); - $propFilter['name'] = $propFilterNode->getAttribute('name'); - $propFilter['is-not-defined'] = $this->xpath->query('cal:is-not-defined', $propFilterNode)->length>0; - $propFilter['param-filters'] = $this->parseParamFilters($propFilterNode); - $propFilter['text-match'] = $this->parseTextMatch($propFilterNode); - $propFilter['time-range'] = $this->parseTimeRange($propFilterNode); - - $result[] = $propFilter; - - } - - return $result; - - } - - /** - * Parses the param-filter element - * - * @param \DOMElement $parentNode - * @return array - */ - protected function parseParamFilters(\DOMElement $parentNode) { - - $paramFilterNodes = $this->xpath->query('cal:param-filter', $parentNode); - $result = array(); - - for($ii=0;$ii<$paramFilterNodes->length;$ii++) { - - $paramFilterNode = $paramFilterNodes->item($ii); - $paramFilter = array(); - $paramFilter['name'] = $paramFilterNode->getAttribute('name'); - $paramFilter['is-not-defined'] = $this->xpath->query('cal:is-not-defined', $paramFilterNode)->length>0; - $paramFilter['text-match'] = $this->parseTextMatch($paramFilterNode); - - $result[] = $paramFilter; - - } - - return $result; - - } - - /** - * Parses the text-match element - * - * @param \DOMElement $parentNode - * @return array|null - */ - protected function parseTextMatch(\DOMElement $parentNode) { - - $textMatchNodes = $this->xpath->query('cal:text-match', $parentNode); - - if ($textMatchNodes->length === 0) - return null; - - $textMatchNode = $textMatchNodes->item(0); - $negateCondition = $textMatchNode->getAttribute('negate-condition'); - $negateCondition = $negateCondition==='yes'; - $collation = $textMatchNode->getAttribute('collation'); - if (!$collation) $collation = 'i;ascii-casemap'; - - return array( - 'negate-condition' => $negateCondition, - 'collation' => $collation, - 'value' => $textMatchNode->nodeValue - ); - - } - - /** - * Parses the time-range element - * - * @param \DOMElement $parentNode - * @return array|null - */ - protected function parseTimeRange(\DOMElement $parentNode) { - - $timeRangeNodes = $this->xpath->query('cal:time-range', $parentNode); - if ($timeRangeNodes->length === 0) { - return null; - } - - $timeRangeNode = $timeRangeNodes->item(0); - - if ($start = $timeRangeNode->getAttribute('start')) { - $start = VObject\DateTimeParser::parseDateTime($start); - } else { - $start = null; - } - if ($end = $timeRangeNode->getAttribute('end')) { - $end = VObject\DateTimeParser::parseDateTime($end); - } else { - $end = null; - } - - if (!is_null($start) && !is_null($end) && $end <= $start) { - throw new \SabreForRainLoop\DAV\Exception\BadRequest('The end-date must be larger than the start-date in the time-range filter'); - } - - return array( - 'start' => $start, - 'end' => $end, - ); - - } - - /** - * Parses the CALDAV:expand element - * - * @param \DOMElement $parentNode - * @return void - */ - protected function parseExpand(\DOMElement $parentNode) { - - $start = $parentNode->getAttribute('start'); - if(!$start) { - throw new \SabreForRainLoop\DAV\Exception\BadRequest('The "start" attribute is required for the CALDAV:expand element'); - } - $start = VObject\DateTimeParser::parseDateTime($start); - - $end = $parentNode->getAttribute('end'); - if(!$end) { - throw new \SabreForRainLoop\DAV\Exception\BadRequest('The "end" attribute is required for the CALDAV:expand element'); - } - - $end = VObject\DateTimeParser::parseDateTime($end); - - if ($end <= $start) { - throw new \SabreForRainLoop\DAV\Exception\BadRequest('The end-date must be larger than the start-date in the expand element.'); - } - - return array( - 'start' => $start, - 'end' => $end, - ); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarQueryValidator.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarQueryValidator.php deleted file mode 100755 index 4537d3bf..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarQueryValidator.php +++ /dev/null @@ -1,392 +0,0 @@ -name !== $filters['name']) { - return false; - } - - return - $this->validateCompFilters($vObject, $filters['comp-filters']) && - $this->validatePropFilters($vObject, $filters['prop-filters']); - - - } - - /** - * This method checks the validity of comp-filters. - * - * A list of comp-filters needs to be specified. Also the parent of the - * component we're checking should be specified, not the component to check - * itself. - * - * @param VObject\Component $parent - * @param array $filters - * @return bool - */ - protected function validateCompFilters(VObject\Component $parent, array $filters) { - - foreach($filters as $filter) { - - $isDefined = isset($parent->$filter['name']); - - if ($filter['is-not-defined']) { - - if ($isDefined) { - return false; - } else { - continue; - } - - } - if (!$isDefined) { - return false; - } - - if ($filter['time-range']) { - foreach($parent->$filter['name'] as $subComponent) { - if ($this->validateTimeRange($subComponent, $filter['time-range']['start'], $filter['time-range']['end'])) { - continue 2; - } - } - return false; - } - - if (!$filter['comp-filters'] && !$filter['prop-filters']) { - continue; - } - - // If there are sub-filters, we need to find at least one component - // for which the subfilters hold true. - foreach($parent->$filter['name'] as $subComponent) { - - if ( - $this->validateCompFilters($subComponent, $filter['comp-filters']) && - $this->validatePropFilters($subComponent, $filter['prop-filters'])) { - // We had a match, so this comp-filter succeeds - continue 2; - } - - } - - // If we got here it means there were sub-comp-filters or - // sub-prop-filters and there was no match. This means this filter - // needs to return false. - return false; - - } - - // If we got here it means we got through all comp-filters alive so the - // filters were all true. - return true; - - } - - /** - * This method checks the validity of prop-filters. - * - * A list of prop-filters needs to be specified. Also the parent of the - * property we're checking should be specified, not the property to check - * itself. - * - * @param VObject\Component $parent - * @param array $filters - * @return bool - */ - protected function validatePropFilters(VObject\Component $parent, array $filters) { - - foreach($filters as $filter) { - - $isDefined = isset($parent->$filter['name']); - - if ($filter['is-not-defined']) { - - if ($isDefined) { - return false; - } else { - continue; - } - - } - if (!$isDefined) { - return false; - } - - if ($filter['time-range']) { - foreach($parent->$filter['name'] as $subComponent) { - if ($this->validateTimeRange($subComponent, $filter['time-range']['start'], $filter['time-range']['end'])) { - continue 2; - } - } - return false; - } - - if (!$filter['param-filters'] && !$filter['text-match']) { - continue; - } - - // If there are sub-filters, we need to find at least one property - // for which the subfilters hold true. - foreach($parent->$filter['name'] as $subComponent) { - - if( - $this->validateParamFilters($subComponent, $filter['param-filters']) && - (!$filter['text-match'] || $this->validateTextMatch($subComponent, $filter['text-match'])) - ) { - // We had a match, so this prop-filter succeeds - continue 2; - } - - } - - // If we got here it means there were sub-param-filters or - // text-match filters and there was no match. This means the - // filter needs to return false. - return false; - - } - - // If we got here it means we got through all prop-filters alive so the - // filters were all true. - return true; - - } - - /** - * This method checks the validity of param-filters. - * - * A list of param-filters needs to be specified. Also the parent of the - * parameter we're checking should be specified, not the parameter to check - * itself. - * - * @param VObject\Property $parent - * @param array $filters - * @return bool - */ - protected function validateParamFilters(VObject\Property $parent, array $filters) { - - foreach($filters as $filter) { - - $isDefined = isset($parent[$filter['name']]); - - if ($filter['is-not-defined']) { - - if ($isDefined) { - return false; - } else { - continue; - } - - } - if (!$isDefined) { - return false; - } - - if (!$filter['text-match']) { - continue; - } - - if (version_compare(VObject\Version::VERSION, '3.0.0beta1', '>=')) { - - // If there are sub-filters, we need to find at least one parameter - // for which the subfilters hold true. - foreach($parent[$filter['name']]->getParts() as $subParam) { - - if($this->validateTextMatch($subParam,$filter['text-match'])) { - // We had a match, so this param-filter succeeds - continue 2; - } - - } - - } else { - - // If there are sub-filters, we need to find at least one parameter - // for which the subfilters hold true. - foreach($parent[$filter['name']] as $subParam) { - - if($this->validateTextMatch($subParam,$filter['text-match'])) { - // We had a match, so this param-filter succeeds - continue 2; - } - - } - - } - - // If we got here it means there was a text-match filter and there - // were no matches. This means the filter needs to return false. - return false; - - } - - // If we got here it means we got through all param-filters alive so the - // filters were all true. - return true; - - } - - /** - * This method checks the validity of a text-match. - * - * A single text-match should be specified as well as the specific property - * or parameter we need to validate. - * - * @param VObject\Node|string $check Value to check against. - * @param array $textMatch - * @return bool - */ - protected function validateTextMatch($check, array $textMatch) { - - if ($check instanceof VObject\Node) { - $check = (string)$check; - } - - $isMatching = \SabreForRainLoop\DAV\StringUtil::textMatch($check, $textMatch['value'], $textMatch['collation']); - - return ($textMatch['negate-condition'] xor $isMatching); - - } - - /** - * Validates if a component matches the given time range. - * - * This is all based on the rules specified in rfc4791, which are quite - * complex. - * - * @param VObject\Node $component - * @param DateTime $start - * @param DateTime $end - * @return bool - */ - protected function validateTimeRange(VObject\Node $component, $start, $end) { - - if (is_null($start)) { - $start = new DateTime('1900-01-01'); - } - if (is_null($end)) { - $end = new DateTime('3000-01-01'); - } - - switch($component->name) { - - case 'VEVENT' : - case 'VTODO' : - case 'VJOURNAL' : - - return $component->isInTimeRange($start, $end); - - case 'VALARM' : - - // If the valarm is wrapped in a recurring event, we need to - // expand the recursions, and validate each. - // - // Our datamodel doesn't easily allow us to do this straight - // in the VALARM component code, so this is a hack, and an - // expensive one too. - if ($component->parent->name === 'VEVENT' && $component->parent->RRULE) { - - // Fire up the iterator! - $it = new VObject\RecurrenceIterator($component->parent->parent, (string)$component->parent->UID); - while($it->valid()) { - $expandedEvent = $it->getEventObject(); - - // We need to check from these expanded alarms, which - // one is the first to trigger. Based on this, we can - // determine if we can 'give up' expanding events. - $firstAlarm = null; - if ($expandedEvent->VALARM !== null) { - foreach($expandedEvent->VALARM as $expandedAlarm) { - - $effectiveTrigger = $expandedAlarm->getEffectiveTriggerTime(); - if ($expandedAlarm->isInTimeRange($start, $end)) { - return true; - } - - if ((string)$expandedAlarm->TRIGGER['VALUE'] === 'DATE-TIME') { - // This is an alarm with a non-relative trigger - // time, likely created by a buggy client. The - // implication is that every alarm in this - // recurring event trigger at the exact same - // time. It doesn't make sense to traverse - // further. - } else { - // We store the first alarm as a means to - // figure out when we can stop traversing. - if (!$firstAlarm || $effectiveTrigger < $firstAlarm) { - $firstAlarm = $effectiveTrigger; - } - } - } - } - if (is_null($firstAlarm)) { - // No alarm was found. - // - // Or technically: No alarm that will change for - // every instance of the recurrence was found, - // which means we can assume there was no match. - return false; - } - if ($firstAlarm > $end) { - return false; - } - $it->next(); - } - return false; - } else { - return $component->isInTimeRange($start, $end); - } - - case 'VFREEBUSY' : - throw new \SabreForRainLoop\DAV\Exception\NotImplemented('time-range filters are currently not supported on ' . $component->name . ' components'); - - case 'COMPLETED' : - case 'CREATED' : - case 'DTEND' : - case 'DTSTAMP' : - case 'DTSTART' : - case 'DUE' : - case 'LAST-MODIFIED' : - return ($start <= $component->getDateTime() && $end >= $component->getDateTime()); - - - - default : - throw new \SabreForRainLoop\DAV\Exception\BadRequest('You cannot create a time-range filter on a ' . $component->name . ' component'); - - } - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarRootNode.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarRootNode.php deleted file mode 100755 index 69e01b1a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/CalendarRootNode.php +++ /dev/null @@ -1,77 +0,0 @@ -caldavBackend = $caldavBackend; - - } - - /** - * Returns the nodename - * - * We're overriding this, because the default will be the 'principalPrefix', - * and we want it to be SabreForRainLoop\CalDAV\Plugin::CALENDAR_ROOT - * - * @return string - */ - public function getName() { - - return Plugin::CALENDAR_ROOT; - - } - - /** - * This method returns a node for a principal. - * - * The passed array contains principal information, and is guaranteed to - * at least contain a uri item. Other properties may or may not be - * supplied by the authentication backend. - * - * @param array $principal - * @return \SabreForRainLoop\DAV\INode - */ - public function getChildForPrincipal(array $principal) { - - return new UserCalendars($this->caldavBackend, $principal); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Exception/InvalidComponentType.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Exception/InvalidComponentType.php deleted file mode 100755 index c7d0ea92..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Exception/InvalidComponentType.php +++ /dev/null @@ -1,35 +0,0 @@ -ownerDocument; - - $np = $doc->createElementNS(CalDAV\Plugin::NS_CALDAV,'cal:supported-calendar-component'); - $errorNode->appendChild($np); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ICSExportPlugin.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ICSExportPlugin.php deleted file mode 100755 index 6e36274e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ICSExportPlugin.php +++ /dev/null @@ -1,142 +0,0 @@ -server = $server; - $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90); - - } - - /** - * 'beforeMethod' event handles. This event handles intercepts GET requests ending - * with ?export - * - * @param string $method - * @param string $uri - * @return bool - */ - public function beforeMethod($method, $uri) { - - if ($method!='GET') return; - if ($this->server->httpRequest->getQueryString()!='export') return; - - // splitting uri - list($uri) = explode('?',$uri,2); - - $node = $this->server->tree->getNodeForPath($uri); - - if (!($node instanceof Calendar)) return; - - // Checking ACL, if available. - if ($aclPlugin = $this->server->getPlugin('acl')) { - $aclPlugin->checkPrivileges($uri, '{DAV:}read'); - } - - $this->server->httpResponse->setHeader('Content-Type','text/calendar'); - $this->server->httpResponse->sendStatus(200); - - $nodes = $this->server->getPropertiesForPath($uri, array( - '{' . Plugin::NS_CALDAV . '}calendar-data', - ),1); - - $this->server->httpResponse->sendBody($this->generateICS($nodes)); - - // Returning false to break the event chain - return false; - - } - - /** - * Merges all calendar objects, and builds one big ics export - * - * @param array $nodes - * @return string - */ - public function generateICS(array $nodes) { - - $calendar = new VObject\Component\VCalendar(); - $calendar->version = '2.0'; - if (DAV\Server::$exposeVersion) { - $calendar->prodid = '-//SabreDAV//SabreDAV ' . DAV\Version::VERSION . '//EN'; - } else { - $calendar->prodid = '-//SabreDAV//SabreDAV//EN'; - } - $calendar->calscale = 'GREGORIAN'; - - $collectedTimezones = array(); - - $timezones = array(); - $objects = array(); - - foreach($nodes as $node) { - - if (!isset($node[200]['{' . Plugin::NS_CALDAV . '}calendar-data'])) { - continue; - } - $nodeData = $node[200]['{' . Plugin::NS_CALDAV . '}calendar-data']; - - $nodeComp = VObject\Reader::read($nodeData); - - foreach($nodeComp->children() as $child) { - - switch($child->name) { - case 'VEVENT' : - case 'VTODO' : - case 'VJOURNAL' : - $objects[] = $child; - break; - - // VTIMEZONE is special, because we need to filter out the duplicates - case 'VTIMEZONE' : - // Naively just checking tzid. - if (in_array((string)$child->TZID, $collectedTimezones)) continue; - - $timezones[] = $child; - $collectedTimezones[] = $child->TZID; - break; - - } - - } - - } - - foreach($timezones as $tz) $calendar->add($tz); - foreach($objects as $obj) $calendar->add($obj); - - return $calendar->serialize(); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ICalendar.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ICalendar.php deleted file mode 100755 index e6de95b5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ICalendar.php +++ /dev/null @@ -1,36 +0,0 @@ -caldavBackend = $caldavBackend; - $this->principalUri = $principalUri; - - } - - /** - * Returns all notifications for a principal - * - * @return array - */ - public function getChildren() { - - $children = array(); - $notifications = $this->caldavBackend->getNotificationsForPrincipal($this->principalUri); - - foreach($notifications as $notification) { - - $children[] = new Node( - $this->caldavBackend, - $this->principalUri, - $notification - ); - } - - return $children; - - } - - /** - * Returns the name of this object - * - * @return string - */ - public function getName() { - - return 'notifications'; - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->principalUri; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'principal' => $this->getOwner(), - 'privilege' => '{DAV:}read', - 'protected' => true, - ), - array( - 'principal' => $this->getOwner(), - 'privilege' => '{DAV:}write', - 'protected' => true, - ) - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's as an array argument. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new DAV\Exception\NotImplemented('Updating ACLs is not implemented here'); - - } - - /** - * Returns the list of supported privileges for this node. - * - * The returned data structure is a list of nested privileges. - * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple - * standard structure. - * - * If null is returned from this method, the default privilege set is used, - * which is fine for most common usecases. - * - * @return array|null - */ - public function getSupportedPrivilegeSet() { - - return null; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/ICollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/ICollection.php deleted file mode 100755 index f145f388..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/ICollection.php +++ /dev/null @@ -1,24 +0,0 @@ -caldavBackend = $caldavBackend; - $this->principalUri = $principalUri; - $this->notification = $notification; - - } - - /** - * Returns the path name for this notification - * - * @return id - */ - public function getName() { - - return $this->notification->getId() . '.xml'; - - } - - /** - * Returns the etag for the notification. - * - * The etag must be surrounded by litteral double-quotes. - * - * @return string - */ - public function getETag() { - - return $this->notification->getETag(); - - } - - /** - * This method must return an xml element, using the - * SabreForRainLoop\CalDAV\Notifications\INotificationType classes. - * - * @return INotificationType - */ - public function getNotificationType() { - - return $this->notification; - - } - - /** - * Deletes this notification - * - * @return void - */ - public function delete() { - - $this->caldavBackend->deleteNotification($this->getOwner(), $this->notification); - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->principalUri; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'principal' => $this->getOwner(), - 'privilege' => '{DAV:}read', - 'protected' => true, - ), - array( - 'principal' => $this->getOwner(), - 'privilege' => '{DAV:}write', - 'protected' => true, - ) - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's as an array argument. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new DAV\Exception\NotImplemented('Updating ACLs is not implemented here'); - - } - - /** - * Returns the list of supported privileges for this node. - * - * The returned data structure is a list of nested privileges. - * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple - * standard structure. - * - * If null is returned from this method, the default privilege set is used, - * which is fine for most common usecases. - * - * @return array|null - */ - public function getSupportedPrivilegeSet() { - - return null; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/Invite.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/Invite.php deleted file mode 100755 index 26237550..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/Invite.php +++ /dev/null @@ -1,324 +0,0 @@ -$value) { - if (!property_exists($this, $key)) { - throw new \InvalidArgumentException('Unknown option: ' . $key); - } - $this->$key = $value; - } - - } - - /** - * Serializes the notification as a single property. - * - * You should usually just encode the single top-level element of the - * notification. - * - * @param DAV\Server $server - * @param \DOMElement $node - * @return void - */ - public function serialize(DAV\Server $server, \DOMElement $node) { - - $prop = $node->ownerDocument->createElement('cs:invite-notification'); - $node->appendChild($prop); - - } - - /** - * This method serializes the entire notification, as it is used in the - * response body. - * - * @param DAV\Server $server - * @param \DOMElement $node - * @return void - */ - public function serializeBody(DAV\Server $server, \DOMElement $node) { - - $doc = $node->ownerDocument; - - $dt = $doc->createElement('cs:dtstamp'); - $this->dtStamp->setTimezone(new \DateTimezone('GMT')); - $dt->appendChild($doc->createTextNode($this->dtStamp->format('Ymd\\THis\\Z'))); - $node->appendChild($dt); - - $prop = $doc->createElement('cs:invite-notification'); - $node->appendChild($prop); - - $uid = $doc->createElement('cs:uid'); - $uid->appendChild( $doc->createTextNode($this->id) ); - $prop->appendChild($uid); - - $href = $doc->createElement('d:href'); - $href->appendChild( $doc->createTextNode( $this->href ) ); - $prop->appendChild($href); - - $nodeName = null; - switch($this->type) { - - case SharingPlugin::STATUS_ACCEPTED : - $nodeName = 'cs:invite-accepted'; - break; - case SharingPlugin::STATUS_DECLINED : - $nodeName = 'cs:invite-declined'; - break; - case SharingPlugin::STATUS_DELETED : - $nodeName = 'cs:invite-deleted'; - break; - case SharingPlugin::STATUS_NORESPONSE : - $nodeName = 'cs:invite-noresponse'; - break; - - } - $prop->appendChild( - $doc->createElement($nodeName) - ); - $hostHref = $doc->createElement('d:href', $server->getBaseUri() . $this->hostUrl); - $hostUrl = $doc->createElement('cs:hosturl'); - $hostUrl->appendChild($hostHref); - $prop->appendChild($hostUrl); - - $access = $doc->createElement('cs:access'); - if ($this->readOnly) { - $access->appendChild($doc->createElement('cs:read')); - } else { - $access->appendChild($doc->createElement('cs:read-write')); - } - $prop->appendChild($access); - - $organizerUrl = $doc->createElement('cs:organizer'); - // If the organizer contains a 'mailto:' part, it means it should be - // treated as absolute. - if (strtolower(substr($this->organizer,0,7))==='mailto:') { - $organizerHref = new DAV\Property\Href($this->organizer, false); - } else { - $organizerHref = new DAV\Property\Href($this->organizer, true); - } - $organizerHref->serialize($server, $organizerUrl); - - if ($this->commonName) { - $commonName = $doc->createElement('cs:common-name'); - $commonName->appendChild($doc->createTextNode($this->commonName)); - $organizerUrl->appendChild($commonName); - - $commonNameOld = $doc->createElement('cs:organizer-cn'); - $commonNameOld->appendChild($doc->createTextNode($this->commonName)); - $prop->appendChild($commonNameOld); - - } - if ($this->firstName) { - $firstName = $doc->createElement('cs:first-name'); - $firstName->appendChild($doc->createTextNode($this->firstName)); - $organizerUrl->appendChild($firstName); - - $firstNameOld = $doc->createElement('cs:organizer-first'); - $firstNameOld->appendChild($doc->createTextNode($this->firstName)); - $prop->appendChild($firstNameOld); - } - if ($this->lastName) { - $lastName = $doc->createElement('cs:last-name'); - $lastName->appendChild($doc->createTextNode($this->lastName)); - $organizerUrl->appendChild($lastName); - - $lastNameOld = $doc->createElement('cs:organizer-last'); - $lastNameOld->appendChild($doc->createTextNode($this->lastName)); - $prop->appendChild($lastNameOld); - } - $prop->appendChild($organizerUrl); - - if ($this->summary) { - $summary = $doc->createElement('cs:summary'); - $summary->appendChild($doc->createTextNode($this->summary)); - $prop->appendChild($summary); - } - if ($this->supportedComponents) { - - $xcomp = $doc->createElement('cal:supported-calendar-component-set'); - $this->supportedComponents->serialize($server, $xcomp); - $prop->appendChild($xcomp); - - } - - } - - /** - * Returns a unique id for this notification - * - * This is just the base url. This should generally be some kind of unique - * id. - * - * @return string - */ - public function getId() { - - return $this->id; - - } - - /** - * Returns the ETag for this notification. - * - * The ETag must be surrounded by literal double-quotes. - * - * @return string - */ - public function getETag() { - - return $this->etag; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/InviteReply.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/InviteReply.php deleted file mode 100755 index 3964c940..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/InviteReply.php +++ /dev/null @@ -1,218 +0,0 @@ -$value) { - if (!property_exists($this, $key)) { - throw new \InvalidArgumentException('Unknown option: ' . $key); - } - $this->$key = $value; - } - - } - - /** - * Serializes the notification as a single property. - * - * You should usually just encode the single top-level element of the - * notification. - * - * @param DAV\Server $server - * @param \DOMElement $node - * @return void - */ - public function serialize(DAV\Server $server, \DOMElement $node) { - - $prop = $node->ownerDocument->createElement('cs:invite-reply'); - $node->appendChild($prop); - - } - - /** - * This method serializes the entire notification, as it is used in the - * response body. - * - * @param DAV\Server $server - * @param \DOMElement $node - * @return void - */ - public function serializeBody(DAV\Server $server, \DOMElement $node) { - - $doc = $node->ownerDocument; - - $dt = $doc->createElement('cs:dtstamp'); - $this->dtStamp->setTimezone(new \DateTimezone('GMT')); - $dt->appendChild($doc->createTextNode($this->dtStamp->format('Ymd\\THis\\Z'))); - $node->appendChild($dt); - - $prop = $doc->createElement('cs:invite-reply'); - $node->appendChild($prop); - - $uid = $doc->createElement('cs:uid'); - $uid->appendChild($doc->createTextNode($this->id)); - $prop->appendChild($uid); - - $inReplyTo = $doc->createElement('cs:in-reply-to'); - $inReplyTo->appendChild( $doc->createTextNode($this->inReplyTo) ); - $prop->appendChild($inReplyTo); - - $href = $doc->createElement('d:href'); - $href->appendChild( $doc->createTextNode($this->href) ); - $prop->appendChild($href); - - $nodeName = null; - switch($this->type) { - - case SharingPlugin::STATUS_ACCEPTED : - $nodeName = 'cs:invite-accepted'; - break; - case SharingPlugin::STATUS_DECLINED : - $nodeName = 'cs:invite-declined'; - break; - - } - $prop->appendChild( - $doc->createElement($nodeName) - ); - $hostHref = $doc->createElement('d:href', $server->getBaseUri() . $this->hostUrl); - $hostUrl = $doc->createElement('cs:hosturl'); - $hostUrl->appendChild($hostHref); - $prop->appendChild($hostUrl); - - if ($this->summary) { - $summary = $doc->createElement('cs:summary'); - $summary->appendChild($doc->createTextNode($this->summary)); - $prop->appendChild($summary); - } - - } - - /** - * Returns a unique id for this notification - * - * This is just the base url. This should generally be some kind of unique - * id. - * - * @return string - */ - public function getId() { - - return $this->id; - - } - - /** - * Returns the ETag for this notification. - * - * The ETag must be surrounded by literal double-quotes. - * - * @return string - */ - public function getETag() { - - return $this->etag; - - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/SystemStatus.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/SystemStatus.php deleted file mode 100755 index dfe571a5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification/SystemStatus.php +++ /dev/null @@ -1,182 +0,0 @@ -id = $id; - $this->type = $type; - $this->description = $description; - $this->href = $href; - $this->etag = $etag; - - } - - /** - * Serializes the notification as a single property. - * - * You should usually just encode the single top-level element of the - * notification. - * - * @param DAV\Server $server - * @param \DOMElement $node - * @return void - */ - public function serialize(DAV\Server $server, \DOMElement $node) { - - switch($this->type) { - case self::TYPE_LOW : - $type = 'low'; - break; - case self::TYPE_MEDIUM : - $type = 'medium'; - break; - default : - case self::TYPE_HIGH : - $type = 'high'; - break; - } - - $prop = $node->ownerDocument->createElement('cs:systemstatus'); - $prop->setAttribute('type', $type); - - $node->appendChild($prop); - - } - - /** - * This method serializes the entire notification, as it is used in the - * response body. - * - * @param DAV\Server $server - * @param \DOMElement $node - * @return void - */ - public function serializeBody(DAV\Server $server, \DOMElement $node) { - - switch($this->type) { - case self::TYPE_LOW : - $type = 'low'; - break; - case self::TYPE_MEDIUM : - $type = 'medium'; - break; - default : - case self::TYPE_HIGH : - $type = 'high'; - break; - } - - $prop = $node->ownerDocument->createElement('cs:systemstatus'); - $prop->setAttribute('type', $type); - - if ($this->description) { - $text = $node->ownerDocument->createTextNode($this->description); - $desc = $node->ownerDocument->createElement('cs:description'); - $desc->appendChild($text); - $prop->appendChild($desc); - } - if ($this->href) { - $text = $node->ownerDocument->createTextNode($this->href); - $href = $node->ownerDocument->createElement('d:href'); - $href->appendChild($text); - $prop->appendChild($href); - } - - $node->appendChild($prop); - - } - - /** - * Returns a unique id for this notification - * - * This is just the base url. This should generally be some kind of unique - * id. - * - * @return string - */ - public function getId() { - - return $this->id; - - } - - /* - * Returns the ETag for this notification. - * - * The ETag must be surrounded by literal double-quotes. - * - * @return string - */ - public function getETag() { - - return $this->etag; - - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Plugin.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Plugin.php deleted file mode 100755 index 9ed56955..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Plugin.php +++ /dev/null @@ -1,1338 +0,0 @@ -imipHandler = $imipHandler; - - } - - /** - * Use this method to tell the server this plugin defines additional - * HTTP methods. - * - * This method is passed a uri. It should only return HTTP methods that are - * available for the specified uri. - * - * @param string $uri - * @return array - */ - public function getHTTPMethods($uri) { - - // The MKCALENDAR is only available on unmapped uri's, whose - // parents extend IExtendedCollection - list($parent, $name) = DAV\URLUtil::splitPath($uri); - - $node = $this->server->tree->getNodeForPath($parent); - - if ($node instanceof DAV\IExtendedCollection) { - try { - $node->getChild($name); - } catch (DAV\Exception\NotFound $e) { - return array('MKCALENDAR'); - } - } - return array(); - - } - - /** - * Returns a list of features for the DAV: HTTP header. - * - * @return array - */ - public function getFeatures() { - - return array('calendar-access', 'calendar-proxy'); - - } - - /** - * Returns a plugin name. - * - * Using this name other plugins will be able to access other plugins - * using DAV\Server::getPlugin - * - * @return string - */ - public function getPluginName() { - - return 'caldav'; - - } - - /** - * Returns a list of reports this plugin supports. - * - * This will be used in the {DAV:}supported-report-set property. - * Note that you still need to subscribe to the 'report' event to actually - * implement them - * - * @param string $uri - * @return array - */ - public function getSupportedReportSet($uri) { - - $node = $this->server->tree->getNodeForPath($uri); - - $reports = array(); - if ($node instanceof ICalendar || $node instanceof ICalendarObject) { - $reports[] = '{' . self::NS_CALDAV . '}calendar-multiget'; - $reports[] = '{' . self::NS_CALDAV . '}calendar-query'; - } - if ($node instanceof ICalendar) { - $reports[] = '{' . self::NS_CALDAV . '}free-busy-query'; - } - return $reports; - - } - - /** - * Initializes the plugin - * - * @param DAV\Server $server - * @return void - */ - public function initialize(DAV\Server $server) { - - $this->server = $server; - - $server->subscribeEvent('unknownMethod',array($this,'unknownMethod')); - //$server->subscribeEvent('unknownMethod',array($this,'unknownMethod2'),1000); - $server->subscribeEvent('report',array($this,'report')); - $server->subscribeEvent('beforeGetProperties',array($this,'beforeGetProperties')); - $server->subscribeEvent('onHTMLActionsPanel', array($this,'htmlActionsPanel')); - $server->subscribeEvent('onBrowserPostAction', array($this,'browserPostAction')); - $server->subscribeEvent('beforeWriteContent', array($this, 'beforeWriteContent')); - $server->subscribeEvent('beforeCreateFile', array($this, 'beforeCreateFile')); - $server->subscribeEvent('beforeMethod', array($this,'beforeMethod')); - - $server->xmlNamespaces[self::NS_CALDAV] = 'cal'; - $server->xmlNamespaces[self::NS_CALENDARSERVER] = 'cs'; - - $server->propertyMap['{' . self::NS_CALDAV . '}supported-calendar-component-set'] = 'SabreForRainLoop\\CalDAV\\Property\\SupportedCalendarComponentSet'; - $server->propertyMap['{' . self::NS_CALDAV . '}schedule-calendar-transp'] = 'SabreForRainLoop\\CalDAV\\Property\\ScheduleCalendarTransp'; - - $server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\ICalendar'] = '{urn:ietf:params:xml:ns:caldav}calendar'; - $server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\Schedule\\IOutbox'] = '{urn:ietf:params:xml:ns:caldav}schedule-outbox'; - $server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\Principal\\IProxyRead'] = '{http://calendarserver.org/ns/}calendar-proxy-read'; - $server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\Principal\\IProxyWrite'] = '{http://calendarserver.org/ns/}calendar-proxy-write'; - $server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\Notifications\\ICollection'] = '{' . self::NS_CALENDARSERVER . '}notification'; - - array_push($server->protectedProperties, - - '{' . self::NS_CALDAV . '}supported-calendar-component-set', - '{' . self::NS_CALDAV . '}supported-calendar-data', - '{' . self::NS_CALDAV . '}max-resource-size', - '{' . self::NS_CALDAV . '}min-date-time', - '{' . self::NS_CALDAV . '}max-date-time', - '{' . self::NS_CALDAV . '}max-instances', - '{' . self::NS_CALDAV . '}max-attendees-per-instance', - '{' . self::NS_CALDAV . '}calendar-home-set', - '{' . self::NS_CALDAV . '}supported-collation-set', - '{' . self::NS_CALDAV . '}calendar-data', - - // scheduling extension - '{' . self::NS_CALDAV . '}schedule-inbox-URL', - '{' . self::NS_CALDAV . '}schedule-outbox-URL', - '{' . self::NS_CALDAV . '}calendar-user-address-set', - '{' . self::NS_CALDAV . '}calendar-user-type', - - // CalendarServer extensions - '{' . self::NS_CALENDARSERVER . '}getctag', - '{' . self::NS_CALENDARSERVER . '}calendar-proxy-read-for', - '{' . self::NS_CALENDARSERVER . '}calendar-proxy-write-for', - '{' . self::NS_CALENDARSERVER . '}notification-URL', - '{' . self::NS_CALENDARSERVER . '}notificationtype' - - ); - } - - /** - * This function handles support for the MKCALENDAR method - * - * @param string $method - * @param string $uri - * @return bool - */ - public function unknownMethod($method, $uri) { - - switch ($method) { - case 'MKCALENDAR' : - $this->httpMkCalendar($uri); - // false is returned to stop the propagation of the - // unknownMethod event. - return false; - case 'POST' : - - // Checking if this is a text/calendar content type - $contentType = $this->server->httpRequest->getHeader('Content-Type'); - if (strpos($contentType, 'text/calendar')!==0) { - return; - } - - // Checking if we're talking to an outbox - try { - $node = $this->server->tree->getNodeForPath($uri); - } catch (DAV\Exception\NotFound $e) { - return; - } - if (!$node instanceof Schedule\IOutbox) - return; - - $this->outboxRequest($node, $uri); - return false; - - } - - } - - /** - * This functions handles REPORT requests specific to CalDAV - * - * @param string $reportName - * @param \DOMNode $dom - * @return bool - */ - public function report($reportName,$dom) { - - switch($reportName) { - case '{'.self::NS_CALDAV.'}calendar-multiget' : - $this->calendarMultiGetReport($dom); - return false; - case '{'.self::NS_CALDAV.'}calendar-query' : - $this->calendarQueryReport($dom); - return false; - case '{'.self::NS_CALDAV.'}free-busy-query' : - $this->freeBusyQueryReport($dom); - return false; - - } - - - } - - /** - * This function handles the MKCALENDAR HTTP method, which creates - * a new calendar. - * - * @param string $uri - * @return void - */ - public function httpMkCalendar($uri) { - - // Due to unforgivable bugs in iCal, we're completely disabling MKCALENDAR support - // for clients matching iCal in the user agent - //$ua = $this->server->httpRequest->getHeader('User-Agent'); - //if (strpos($ua,'iCal/')!==false) { - // throw new \SabreForRainLoop\DAV\Exception\Forbidden('iCal has major bugs in it\'s RFC3744 support. Therefore we are left with no other choice but disabling this feature.'); - //} - - $body = $this->server->httpRequest->getBody(true); - $properties = array(); - - if ($body) { - - $dom = DAV\XMLUtil::loadDOMDocument($body); - - foreach($dom->firstChild->childNodes as $child) { - - if (DAV\XMLUtil::toClarkNotation($child)!=='{DAV:}set') continue; - foreach(DAV\XMLUtil::parseProperties($child,$this->server->propertyMap) as $k=>$prop) { - $properties[$k] = $prop; - } - - } - } - - $resourceType = array('{DAV:}collection','{urn:ietf:params:xml:ns:caldav}calendar'); - - $this->server->createCollection($uri,$resourceType,$properties); - - $this->server->httpResponse->sendStatus(201); - $this->server->httpResponse->setHeader('Content-Length',0); - } - - /** - * beforeGetProperties - * - * This method handler is invoked before any after properties for a - * resource are fetched. This allows us to add in any CalDAV specific - * properties. - * - * @param string $path - * @param DAV\INode $node - * @param array $requestedProperties - * @param array $returnedProperties - * @return void - */ - public function beforeGetProperties($path, DAV\INode $node, &$requestedProperties, &$returnedProperties) { - - if ($node instanceof DAVACL\IPrincipal) { - - // calendar-home-set property - $calHome = '{' . self::NS_CALDAV . '}calendar-home-set'; - if (in_array($calHome,$requestedProperties)) { - $principalId = $node->getName(); - $calendarHomePath = self::CALENDAR_ROOT . '/' . $principalId . '/'; - - unset($requestedProperties[array_search($calHome, $requestedProperties)]); - $returnedProperties[200][$calHome] = new DAV\Property\Href($calendarHomePath); - - } - - // schedule-outbox-URL property - $scheduleProp = '{' . self::NS_CALDAV . '}schedule-outbox-URL'; - if (in_array($scheduleProp,$requestedProperties)) { - $principalId = $node->getName(); - $outboxPath = self::CALENDAR_ROOT . '/' . $principalId . '/outbox'; - - unset($requestedProperties[array_search($scheduleProp, $requestedProperties)]); - $returnedProperties[200][$scheduleProp] = new DAV\Property\Href($outboxPath); - - } - - // calendar-user-address-set property - $calProp = '{' . self::NS_CALDAV . '}calendar-user-address-set'; - if (in_array($calProp,$requestedProperties)) { - - $addresses = $node->getAlternateUriSet(); - $addresses[] = $this->server->getBaseUri() . DAV\URLUtil::encodePath($node->getPrincipalUrl() . '/'); - unset($requestedProperties[array_search($calProp, $requestedProperties)]); - $returnedProperties[200][$calProp] = new DAV\Property\HrefList($addresses, false); - - } - - // These two properties are shortcuts for ical to easily find - // other principals this principal has access to. - $propRead = '{' . self::NS_CALENDARSERVER . '}calendar-proxy-read-for'; - $propWrite = '{' . self::NS_CALENDARSERVER . '}calendar-proxy-write-for'; - if (in_array($propRead,$requestedProperties) || in_array($propWrite,$requestedProperties)) { - - $aclPlugin = $this->server->getPlugin('acl'); - $membership = $aclPlugin->getPrincipalMembership($path); - $readList = array(); - $writeList = array(); - - foreach($membership as $group) { - - $groupNode = $this->server->tree->getNodeForPath($group); - - // If the node is either ap proxy-read or proxy-write - // group, we grab the parent principal and add it to the - // list. - if ($groupNode instanceof Principal\IProxyRead) { - list($readList[]) = DAV\URLUtil::splitPath($group); - } - if ($groupNode instanceof Principal\IProxyWrite) { - list($writeList[]) = DAV\URLUtil::splitPath($group); - } - - } - if (in_array($propRead,$requestedProperties)) { - unset($requestedProperties[$propRead]); - $returnedProperties[200][$propRead] = new DAV\Property\HrefList($readList); - } - if (in_array($propWrite,$requestedProperties)) { - unset($requestedProperties[$propWrite]); - $returnedProperties[200][$propWrite] = new DAV\Property\HrefList($writeList); - } - - } - - // notification-URL property - $notificationUrl = '{' . self::NS_CALENDARSERVER . '}notification-URL'; - if (($index = array_search($notificationUrl, $requestedProperties)) !== false) { - $principalId = $node->getName(); - $calendarHomePath = 'calendars/' . $principalId . '/notifications/'; - unset($requestedProperties[$index]); - $returnedProperties[200][$notificationUrl] = new DAV\Property\Href($calendarHomePath); - } - - } // instanceof IPrincipal - - if ($node instanceof Notifications\INode) { - - $propertyName = '{' . self::NS_CALENDARSERVER . '}notificationtype'; - if (($index = array_search($propertyName, $requestedProperties)) !== false) { - - $returnedProperties[200][$propertyName] = - $node->getNotificationType(); - - unset($requestedProperties[$index]); - - } - - } // instanceof Notifications_INode - - - if ($node instanceof ICalendarObject) { - // The calendar-data property is not supposed to be a 'real' - // property, but in large chunks of the spec it does act as such. - // Therefore we simply expose it as a property. - $calDataProp = '{' . Plugin::NS_CALDAV . '}calendar-data'; - if (in_array($calDataProp, $requestedProperties)) { - unset($requestedProperties[$calDataProp]); - $val = $node->get(); - if (is_resource($val)) - $val = stream_get_contents($val); - - // Taking out \r to not screw up the xml output - $returnedProperties[200][$calDataProp] = str_replace("\r","", $val); - - } - } - - } - - /** - * This function handles the calendar-multiget REPORT. - * - * This report is used by the client to fetch the content of a series - * of urls. Effectively avoiding a lot of redundant requests. - * - * @param \DOMNode $dom - * @return void - */ - public function calendarMultiGetReport($dom) { - - $properties = array_keys(DAV\XMLUtil::parseProperties($dom->firstChild)); - $hrefElems = $dom->getElementsByTagNameNS('urn:DAV','href'); - - $xpath = new \DOMXPath($dom); - $xpath->registerNameSpace('cal',Plugin::NS_CALDAV); - $xpath->registerNameSpace('dav','urn:DAV'); - - $expand = $xpath->query('/cal:calendar-multiget/dav:prop/cal:calendar-data/cal:expand'); - if ($expand->length>0) { - $expandElem = $expand->item(0); - $start = $expandElem->getAttribute('start'); - $end = $expandElem->getAttribute('end'); - if(!$start || !$end) { - throw new DAV\Exception\BadRequest('The "start" and "end" attributes are required for the CALDAV:expand element'); - } - $start = VObject\DateTimeParser::parseDateTime($start); - $end = VObject\DateTimeParser::parseDateTime($end); - - if ($end <= $start) { - throw new DAV\Exception\BadRequest('The end-date must be larger than the start-date in the expand element.'); - } - - $expand = true; - - } else { - - $expand = false; - - } - - foreach($hrefElems as $elem) { - $uri = $this->server->calculateUri($elem->nodeValue); - list($objProps) = $this->server->getPropertiesForPath($uri,$properties); - - if ($expand && isset($objProps[200]['{' . self::NS_CALDAV . '}calendar-data'])) { - $vObject = VObject\Reader::read($objProps[200]['{' . self::NS_CALDAV . '}calendar-data']); - $vObject->expand($start, $end); - $objProps[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize(); - } - - $propertyList[]=$objProps; - - } - - $prefer = $this->server->getHTTPPRefer(); - - $this->server->httpResponse->sendStatus(207); - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); - $this->server->httpResponse->sendBody($this->server->generateMultiStatus($propertyList, $prefer['return-minimal'])); - - } - - /** - * This function handles the calendar-query REPORT - * - * This report is used by clients to request calendar objects based on - * complex conditions. - * - * @param \DOMNode $dom - * @return void - */ - public function calendarQueryReport($dom) { - - $parser = new CalendarQueryParser($dom); - $parser->parse(); - - $node = $this->server->tree->getNodeForPath($this->server->getRequestUri()); - $depth = $this->server->getHTTPDepth(0); - - // The default result is an empty array - $result = array(); - - // The calendarobject was requested directly. In this case we handle - // this locally. - if ($depth == 0 && $node instanceof ICalendarObject) { - - $requestedCalendarData = true; - $requestedProperties = $parser->requestedProperties; - - if (!in_array('{urn:ietf:params:xml:ns:caldav}calendar-data', $requestedProperties)) { - - // We always retrieve calendar-data, as we need it for filtering. - $requestedProperties[] = '{urn:ietf:params:xml:ns:caldav}calendar-data'; - - // If calendar-data wasn't explicitly requested, we need to remove - // it after processing. - $requestedCalendarData = false; - } - - $properties = $this->server->getPropertiesForPath( - $this->server->getRequestUri(), - $requestedProperties, - 0 - ); - - // This array should have only 1 element, the first calendar - // object. - $properties = current($properties); - - // If there wasn't any calendar-data returned somehow, we ignore - // this. - if (isset($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data'])) { - - $validator = new CalendarQueryValidator(); - - $vObject = VObject\Reader::read($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']); - if ($validator->validate($vObject,$parser->filters)) { - - // If the client didn't require the calendar-data property, - // we won't give it back. - if (!$requestedCalendarData) { - unset($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']); - } else { - if ($parser->expand) { - $vObject->expand($parser->expand['start'], $parser->expand['end']); - $properties[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize(); - } - } - - $result = array($properties); - - } - - } - - } - // If we're dealing with a calendar, the calendar itself is responsible - // for the calendar-query. - if ($node instanceof ICalendar && $depth = 1) { - - $nodePaths = $node->calendarQuery($parser->filters); - - foreach($nodePaths as $path) { - - list($properties) = - $this->server->getPropertiesForPath($this->server->getRequestUri() . '/' . $path, $parser->requestedProperties); - - if ($parser->expand) { - // We need to do some post-processing - $vObject = VObject\Reader::read($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']); - $vObject->expand($parser->expand['start'], $parser->expand['end']); - $properties[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize(); - } - - $result[] = $properties; - - } - - } - - $prefer = $this->server->getHTTPPRefer(); - - $this->server->httpResponse->sendStatus(207); - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); - $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result, $prefer['return-minimal'])); - - } - - /** - * This method is responsible for parsing the request and generating the - * response for the CALDAV:free-busy-query REPORT. - * - * @param \DOMNode $dom - * @return void - */ - protected function freeBusyQueryReport(\DOMNode $dom) { - - $start = null; - $end = null; - - foreach($dom->firstChild->childNodes as $childNode) { - - $clark = DAV\XMLUtil::toClarkNotation($childNode); - if ($clark == '{' . self::NS_CALDAV . '}time-range') { - $start = $childNode->getAttribute('start'); - $end = $childNode->getAttribute('end'); - break; - } - - } - if ($start) { - $start = VObject\DateTimeParser::parseDateTime($start); - } - if ($end) { - $end = VObject\DateTimeParser::parseDateTime($end); - } - - if (!$start && !$end) { - throw new DAV\Exception\BadRequest('The freebusy report must have a time-range filter'); - } - $acl = $this->server->getPlugin('acl'); - - if (!$acl) { - throw new DAV\Exception('The ACL plugin must be loaded for free-busy queries to work'); - } - $uri = $this->server->getRequestUri(); - $acl->checkPrivileges($uri,'{' . self::NS_CALDAV . '}read-free-busy'); - - $calendar = $this->server->tree->getNodeForPath($uri); - if (!$calendar instanceof ICalendar) { - throw new DAV\Exception\NotImplemented('The free-busy-query REPORT is only implemented on calendars'); - } - - // Doing a calendar-query first, to make sure we get the most - // performance. - $urls = $calendar->calendarQuery(array( - 'name' => 'VCALENDAR', - 'comp-filters' => array( - array( - 'name' => 'VEVENT', - 'comp-filters' => array(), - 'prop-filters' => array(), - 'is-not-defined' => false, - 'time-range' => array( - 'start' => $start, - 'end' => $end, - ), - ), - ), - 'prop-filters' => array(), - 'is-not-defined' => false, - 'time-range' => null, - )); - - $objects = array_map(function($url) use ($calendar) { - $obj = $calendar->getChild($url)->get(); - return $obj; - }, $urls); - - $generator = new VObject\FreeBusyGenerator(); - $generator->setObjects($objects); - $generator->setTimeRange($start, $end); - $result = $generator->getResult(); - $result = $result->serialize(); - - $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->setHeader('Content-Type', 'text/calendar'); - $this->server->httpResponse->setHeader('Content-Length', strlen($result)); - $this->server->httpResponse->sendBody($result); - - } - - /** - * This method is triggered before a file gets updated with new content. - * - * This plugin uses this method to ensure that CalDAV objects receive - * valid calendar data. - * - * @param string $path - * @param DAV\IFile $node - * @param resource $data - * @return void - */ - public function beforeWriteContent($path, DAV\IFile $node, &$data) { - - if (!$node instanceof ICalendarObject) - return; - - $this->validateICalendar($data, $path); - - } - - /** - * This method is triggered before a new file is created. - * - * This plugin uses this method to ensure that newly created calendar - * objects contain valid calendar data. - * - * @param string $path - * @param resource $data - * @param DAV\ICollection $parentNode - * @return void - */ - public function beforeCreateFile($path, &$data, DAV\ICollection $parentNode) { - - if (!$parentNode instanceof Calendar) - return; - - $this->validateICalendar($data, $path); - - } - - /** - * This event is triggered before any HTTP request is handled. - * - * We use this to intercept GET calls to notification nodes, and return the - * proper response. - * - * @param string $method - * @param string $path - * @return void - */ - public function beforeMethod($method, $path) { - - if ($method!=='GET') return; - - try { - $node = $this->server->tree->getNodeForPath($path); - } catch (DAV\Exception\NotFound $e) { - return; - } - - if (!$node instanceof Notifications\INode) - return; - - if (!$this->server->checkPreconditions(true)) return false; - $dom = new \DOMDocument('1.0', 'UTF-8'); - - $dom->formatOutput = true; - - $root = $dom->createElement('cs:notification'); - foreach($this->server->xmlNamespaces as $namespace => $prefix) { - $root->setAttribute('xmlns:' . $prefix, $namespace); - } - - $dom->appendChild($root); - $node->getNotificationType()->serializeBody($this->server, $root); - - $this->server->httpResponse->setHeader('Content-Type','application/xml'); - $this->server->httpResponse->setHeader('ETag',$node->getETag()); - $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->sendBody($dom->saveXML()); - - return false; - - } - - /** - * Checks if the submitted iCalendar data is in fact, valid. - * - * An exception is thrown if it's not. - * - * @param resource|string $data - * @param string $path - * @return void - */ - protected function validateICalendar(&$data, $path) { - - // If it's a stream, we convert it to a string first. - if (is_resource($data)) { - $data = stream_get_contents($data); - } - - // Converting the data to unicode, if needed. - $data = DAV\StringUtil::ensureUTF8($data); - - try { - - $vobj = VObject\Reader::read($data); - - } catch (VObject\ParseException $e) { - - throw new DAV\Exception\UnsupportedMediaType('This resource only supports valid iCalendar 2.0 data. Parse error: ' . $e->getMessage()); - - } - - if ($vobj->name !== 'VCALENDAR') { - throw new DAV\Exception\UnsupportedMediaType('This collection can only support iCalendar objects.'); - } - - // Get the Supported Components for the target calendar - list($parentPath,$object) = DAV\URLUtil::splitPath($path); - $calendarProperties = $this->server->getProperties($parentPath,array('{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set')); - $supportedComponents = $calendarProperties['{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set']->getValue(); - - $foundType = null; - $foundUID = null; - foreach($vobj->getComponents() as $component) { - switch($component->name) { - case 'VTIMEZONE' : - continue 2; - case 'VEVENT' : - case 'VTODO' : - case 'VJOURNAL' : - if (is_null($foundType)) { - $foundType = $component->name; - if (!in_array($foundType, $supportedComponents)) { - throw new Exception\InvalidComponentType('This calendar only supports ' . implode(', ', $supportedComponents) . '. We found a ' . $foundType); - } - if (!isset($component->UID)) { - throw new DAV\Exception\BadRequest('Every ' . $component->name . ' component must have an UID'); - } - $foundUID = (string)$component->UID; - } else { - if ($foundType !== $component->name) { - throw new DAV\Exception\BadRequest('A calendar object must only contain 1 component. We found a ' . $component->name . ' as well as a ' . $foundType); - } - if ($foundUID !== (string)$component->UID) { - throw new DAV\Exception\BadRequest('Every ' . $component->name . ' in this object must have identical UIDs'); - } - } - break; - default : - throw new DAV\Exception\BadRequest('You are not allowed to create components of type: ' . $component->name . ' here'); - - } - } - if (!$foundType) - throw new DAV\Exception\BadRequest('iCalendar object must contain at least 1 of VEVENT, VTODO or VJOURNAL'); - - } - - /** - * This method handles POST requests to the schedule-outbox. - * - * Currently, two types of requests are support: - * * FREEBUSY requests from RFC 6638 - * * Simple iTIP messages from draft-desruisseaux-caldav-sched-04 - * - * The latter is from an expired early draft of the CalDAV scheduling - * extensions, but iCal depends on a feature from that spec, so we - * implement it. - * - * @param Schedule\IOutbox $outboxNode - * @param string $outboxUri - * @return void - */ - public function outboxRequest(Schedule\IOutbox $outboxNode, $outboxUri) { - - // Parsing the request body - try { - $vObject = VObject\Reader::read($this->server->httpRequest->getBody(true)); - } catch (VObject\ParseException $e) { - throw new DAV\Exception\BadRequest('The request body must be a valid iCalendar object. Parse error: ' . $e->getMessage()); - } - - // The incoming iCalendar object must have a METHOD property, and a - // component. The combination of both determines what type of request - // this is. - $componentType = null; - foreach($vObject->getComponents() as $component) { - if ($component->name !== 'VTIMEZONE') { - $componentType = $component->name; - break; - } - } - if (is_null($componentType)) { - throw new DAV\Exception\BadRequest('We expected at least one VTODO, VJOURNAL, VFREEBUSY or VEVENT component'); - } - - // Validating the METHOD - $method = strtoupper((string)$vObject->METHOD); - if (!$method) { - throw new DAV\Exception\BadRequest('A METHOD property must be specified in iTIP messages'); - } - - // So we support two types of requests: - // - // REQUEST with a VFREEBUSY component - // REQUEST, REPLY, ADD, CANCEL on VEVENT components - - $acl = $this->server->getPlugin('acl'); - - if ($componentType === 'VFREEBUSY' && $method === 'REQUEST') { - - $acl && $acl->checkPrivileges($outboxUri,'{' . Plugin::NS_CALDAV . '}schedule-query-freebusy'); - $this->handleFreeBusyRequest($outboxNode, $vObject); - - } elseif ($componentType === 'VEVENT' && in_array($method, array('REQUEST','REPLY','ADD','CANCEL'))) { - - $acl && $acl->checkPrivileges($outboxUri,'{' . Plugin::NS_CALDAV . '}schedule-post-vevent'); - $this->handleEventNotification($outboxNode, $vObject); - - } else { - - throw new DAV\Exception\NotImplemented('SabreDAV supports only VFREEBUSY (REQUEST) and VEVENT (REQUEST, REPLY, ADD, CANCEL)'); - - } - - } - - /** - * This method handles the REQUEST, REPLY, ADD and CANCEL methods for - * VEVENT iTip messages. - * - * @return void - */ - protected function handleEventNotification(Schedule\IOutbox $outboxNode, VObject\Component $vObject) { - - $originator = $this->server->httpRequest->getHeader('Originator'); - $recipients = $this->server->httpRequest->getHeader('Recipient'); - - if (!$originator) { - throw new DAV\Exception\BadRequest('The Originator: header must be specified when making POST requests'); - } - if (!$recipients) { - throw new DAV\Exception\BadRequest('The Recipient: header must be specified when making POST requests'); - } - - $recipients = explode(',',$recipients); - foreach($recipients as $k=>$recipient) { - - $recipient = trim($recipient); - if (!preg_match('/^mailto:(.*)@(.*)$/i', $recipient)) { - throw new DAV\Exception\BadRequest('Recipients must start with mailto: and must be valid email address'); - } - $recipient = substr($recipient, 7); - $recipients[$k] = $recipient; - } - - // We need to make sure that 'originator' matches one of the email - // addresses of the selected principal. - $principal = $outboxNode->getOwner(); - $props = $this->server->getProperties($principal,array( - '{' . self::NS_CALDAV . '}calendar-user-address-set', - )); - - $addresses = array(); - if (isset($props['{' . self::NS_CALDAV . '}calendar-user-address-set'])) { - $addresses = $props['{' . self::NS_CALDAV . '}calendar-user-address-set']->getHrefs(); - } - - $found = false; - foreach($addresses as $address) { - - // Trimming the / on both sides, just in case.. - if (rtrim(strtolower($originator),'/') === rtrim(strtolower($address),'/')) { - $found = true; - break; - } - - } - - if (!$found) { - throw new DAV\Exception\Forbidden('The addresses specified in the Originator header did not match any addresses in the owners calendar-user-address-set header'); - } - - // If the Originator header was a url, and not a mailto: address.. - // we're going to try to pull the mailto: from the vobject body. - if (strtolower(substr($originator,0,7)) !== 'mailto:') { - $originator = (string)$vObject->VEVENT->ORGANIZER; - - } - if (strtolower(substr($originator,0,7)) !== 'mailto:') { - throw new DAV\Exception\Forbidden('Could not find mailto: address in both the Orignator header, and the ORGANIZER property in the VEVENT'); - } - $originator = substr($originator,7); - - $result = $this->iMIPMessage($originator, $recipients, $vObject, $principal); - $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->setHeader('Content-Type','application/xml'); - $this->server->httpResponse->sendBody($this->generateScheduleResponse($result)); - - } - - /** - * Sends an iMIP message by email. - * - * This method must return an array with status codes per recipient. - * This should look something like: - * - * array( - * 'user1@example.org' => '2.0;Success' - * ) - * - * Formatting for this status code can be found at: - * https://tools.ietf.org/html/rfc5545#section-3.8.8.3 - * - * A list of valid status codes can be found at: - * https://tools.ietf.org/html/rfc5546#section-3.6 - * - * @param string $originator - * @param array $recipients - * @param VObject\Component $vObject - * @param string $principal Principal url - * @return array - */ - protected function iMIPMessage($originator, array $recipients, VObject\Component $vObject, $principal) { - - if (!$this->imipHandler) { - $resultStatus = '5.2;This server does not support this operation'; - } else { - $this->imipHandler->sendMessage($originator, $recipients, $vObject, $principal); - $resultStatus = '2.0;Success'; - } - - $result = array(); - foreach($recipients as $recipient) { - $result[$recipient] = $resultStatus; - } - - return $result; - - } - - /** - * Generates a schedule-response XML body - * - * The recipients array is a key->value list, containing email addresses - * and iTip status codes. See the iMIPMessage method for a description of - * the value. - * - * @param array $recipients - * @return string - */ - public function generateScheduleResponse(array $recipients) { - - $dom = new \DOMDocument('1.0','utf-8'); - $dom->formatOutput = true; - $xscheduleResponse = $dom->createElement('cal:schedule-response'); - $dom->appendChild($xscheduleResponse); - - foreach($this->server->xmlNamespaces as $namespace=>$prefix) { - - $xscheduleResponse->setAttribute('xmlns:' . $prefix, $namespace); - - } - - foreach($recipients as $recipient=>$status) { - $xresponse = $dom->createElement('cal:response'); - - $xrecipient = $dom->createElement('cal:recipient'); - $xrecipient->appendChild($dom->createTextNode($recipient)); - $xresponse->appendChild($xrecipient); - - $xrequestStatus = $dom->createElement('cal:request-status'); - $xrequestStatus->appendChild($dom->createTextNode($status)); - $xresponse->appendChild($xrequestStatus); - - $xscheduleResponse->appendChild($xresponse); - - } - - return $dom->saveXML(); - - } - - /** - * This method is responsible for parsing a free-busy query request and - * returning it's result. - * - * @param Schedule\IOutbox $outbox - * @param string $request - * @return string - */ - protected function handleFreeBusyRequest(Schedule\IOutbox $outbox, VObject\Component $vObject) { - - $vFreeBusy = $vObject->VFREEBUSY; - $organizer = $vFreeBusy->organizer; - - $organizer = (string)$organizer; - - // Validating if the organizer matches the owner of the inbox. - $owner = $outbox->getOwner(); - - $caldavNS = '{' . Plugin::NS_CALDAV . '}'; - - $uas = $caldavNS . 'calendar-user-address-set'; - $props = $this->server->getProperties($owner,array($uas)); - - if (empty($props[$uas]) || !in_array($organizer, $props[$uas]->getHrefs())) { - throw new DAV\Exception\Forbidden('The organizer in the request did not match any of the addresses for the owner of this inbox'); - } - - if (!isset($vFreeBusy->ATTENDEE)) { - throw new DAV\Exception\BadRequest('You must at least specify 1 attendee'); - } - - $attendees = array(); - foreach($vFreeBusy->ATTENDEE as $attendee) { - $attendees[]= (string)$attendee; - } - - - if (!isset($vFreeBusy->DTSTART) || !isset($vFreeBusy->DTEND)) { - throw new DAV\Exception\BadRequest('DTSTART and DTEND must both be specified'); - } - - $startRange = $vFreeBusy->DTSTART->getDateTime(); - $endRange = $vFreeBusy->DTEND->getDateTime(); - - $results = array(); - foreach($attendees as $attendee) { - $results[] = $this->getFreeBusyForEmail($attendee, $startRange, $endRange, $vObject); - } - - $dom = new \DOMDocument('1.0','utf-8'); - $dom->formatOutput = true; - $scheduleResponse = $dom->createElement('cal:schedule-response'); - foreach($this->server->xmlNamespaces as $namespace=>$prefix) { - - $scheduleResponse->setAttribute('xmlns:' . $prefix,$namespace); - - } - $dom->appendChild($scheduleResponse); - - foreach($results as $result) { - $response = $dom->createElement('cal:response'); - - $recipient = $dom->createElement('cal:recipient'); - $recipientHref = $dom->createElement('d:href'); - - $recipientHref->appendChild($dom->createTextNode($result['href'])); - $recipient->appendChild($recipientHref); - $response->appendChild($recipient); - - $reqStatus = $dom->createElement('cal:request-status'); - $reqStatus->appendChild($dom->createTextNode($result['request-status'])); - $response->appendChild($reqStatus); - - if (isset($result['calendar-data'])) { - - $calendardata = $dom->createElement('cal:calendar-data'); - $calendardata->appendChild($dom->createTextNode(str_replace("\r\n","\n",$result['calendar-data']->serialize()))); - $response->appendChild($calendardata); - - } - $scheduleResponse->appendChild($response); - } - - $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->setHeader('Content-Type','application/xml'); - $this->server->httpResponse->sendBody($dom->saveXML()); - - } - - /** - * Returns free-busy information for a specific address. The returned - * data is an array containing the following properties: - * - * calendar-data : A VFREEBUSY VObject - * request-status : an iTip status code. - * href: The principal's email address, as requested - * - * The following request status codes may be returned: - * * 2.0;description - * * 3.7;description - * - * @param string $email address - * @param \DateTime $start - * @param \DateTime $end - * @param VObject\Component $request - * @return array - */ - protected function getFreeBusyForEmail($email, \DateTime $start, \DateTime $end, VObject\Component $request) { - - $caldavNS = '{' . Plugin::NS_CALDAV . '}'; - - $aclPlugin = $this->server->getPlugin('acl'); - if (substr($email,0,7)==='mailto:') $email = substr($email,7); - - $result = $aclPlugin->principalSearch( - array('{http://sabredav.org/ns}email-address' => $email), - array( - '{DAV:}principal-URL', $caldavNS . 'calendar-home-set', - '{http://sabredav.org/ns}email-address', - ) - ); - - if (!count($result)) { - return array( - 'request-status' => '3.7;Could not find principal', - 'href' => 'mailto:' . $email, - ); - } - - if (!isset($result[0][200][$caldavNS . 'calendar-home-set'])) { - return array( - 'request-status' => '3.7;No calendar-home-set property found', - 'href' => 'mailto:' . $email, - ); - } - $homeSet = $result[0][200][$caldavNS . 'calendar-home-set']->getHref(); - - // Grabbing the calendar list - $objects = array(); - foreach($this->server->tree->getNodeForPath($homeSet)->getChildren() as $node) { - if (!$node instanceof ICalendar) { - continue; - } - $aclPlugin->checkPrivileges($homeSet . $node->getName() ,$caldavNS . 'read-free-busy'); - - // Getting the list of object uris within the time-range - $urls = $node->calendarQuery(array( - 'name' => 'VCALENDAR', - 'comp-filters' => array( - array( - 'name' => 'VEVENT', - 'comp-filters' => array(), - 'prop-filters' => array(), - 'is-not-defined' => false, - 'time-range' => array( - 'start' => $start, - 'end' => $end, - ), - ), - ), - 'prop-filters' => array(), - 'is-not-defined' => false, - 'time-range' => null, - )); - - $calObjects = array_map(function($url) use ($node) { - $obj = $node->getChild($url)->get(); - return $obj; - }, $urls); - - $objects = array_merge($objects,$calObjects); - - } - - $vcalendar = new VObject\Component\VCalendar(); - $vcalendar->VERSION = '2.0'; - $vcalendar->METHOD = 'REPLY'; - $vcalendar->CALSCALE = 'GREGORIAN'; - $vcalendar->PRODID = '-//SabreDAV//SabreDAV ' . DAV\Version::VERSION . '//EN'; - - $generator = new VObject\FreeBusyGenerator(); - $generator->setObjects($objects); - $generator->setTimeRange($start, $end); - $generator->setBaseObject($vcalendar); - - $result = $generator->getResult(); - - $vcalendar->VFREEBUSY->ATTENDEE = 'mailto:' . $email; - $vcalendar->VFREEBUSY->UID = (string)$request->VFREEBUSY->UID; - $vcalendar->VFREEBUSY->ORGANIZER = clone $request->VFREEBUSY->ORGANIZER; - - return array( - 'calendar-data' => $result, - 'request-status' => '2.0;Success', - 'href' => 'mailto:' . $email, - ); - } - - /** - * This method is used to generate HTML output for the - * DAV\Browser\Plugin. This allows us to generate an interface users - * can use to create new calendars. - * - * @param DAV\INode $node - * @param string $output - * @return bool - */ - public function htmlActionsPanel(DAV\INode $node, &$output) { - - if (!$node instanceof UserCalendars) - return; - - $output.= '
-

Create new calendar

- -
-
- -
- '; - - return false; - - } - - /** - * This method allows us to intercept the 'mkcalendar' sabreAction. This - * action enables the user to create new calendars from the browser plugin. - * - * @param string $uri - * @param string $action - * @param array $postVars - * @return bool - */ - public function browserPostAction($uri, $action, array $postVars) { - - if ($action!=='mkcalendar') - return; - - $resourceType = array('{DAV:}collection','{urn:ietf:params:xml:ns:caldav}calendar'); - $properties = array(); - if (isset($postVars['{DAV:}displayname'])) { - $properties['{DAV:}displayname'] = $postVars['{DAV:}displayname']; - } - $this->server->createCollection($uri . '/' . $postVars['name'],$resourceType,$properties); - return false; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/Collection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/Collection.php deleted file mode 100755 index e4559c87..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/Collection.php +++ /dev/null @@ -1,32 +0,0 @@ -principalBackend, $principalInfo); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/IProxyRead.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/IProxyRead.php deleted file mode 100755 index f2215ebe..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/IProxyRead.php +++ /dev/null @@ -1,19 +0,0 @@ -principalInfo = $principalInfo; - $this->principalBackend = $principalBackend; - - } - - /** - * Returns this principals name. - * - * @return string - */ - public function getName() { - - return 'calendar-proxy-read'; - - } - - /** - * Returns the last modification time - * - * @return null - */ - public function getLastModified() { - - return null; - - } - - /** - * Deletes the current node - * - * @throws DAV\Exception\Forbidden - * @return void - */ - public function delete() { - - throw new DAV\Exception\Forbidden('Permission denied to delete node'); - - } - - /** - * Renames the node - * - * @throws DAV\Exception\Forbidden - * @param string $name The new name - * @return void - */ - public function setName($name) { - - throw new DAV\Exception\Forbidden('Permission denied to rename file'); - - } - - - /** - * Returns a list of alternative urls for a principal - * - * This can for example be an email address, or ldap url. - * - * @return array - */ - public function getAlternateUriSet() { - - return array(); - - } - - /** - * Returns the full principal url - * - * @return string - */ - public function getPrincipalUrl() { - - return $this->principalInfo['uri'] . '/' . $this->getName(); - - } - - /** - * Returns the list of group members - * - * If this principal is a group, this function should return - * all member principal uri's for the group. - * - * @return array - */ - public function getGroupMemberSet() { - - return $this->principalBackend->getGroupMemberSet($this->getPrincipalUrl()); - - } - - /** - * Returns the list of groups this principal is member of - * - * If this principal is a member of a (list of) groups, this function - * should return a list of principal uri's for it's members. - * - * @return array - */ - public function getGroupMembership() { - - return $this->principalBackend->getGroupMembership($this->getPrincipalUrl()); - - } - - /** - * Sets a list of group members - * - * If this principal is a group, this method sets all the group members. - * The list of members is always overwritten, never appended to. - * - * This method should throw an exception if the members could not be set. - * - * @param array $principals - * @return void - */ - public function setGroupMemberSet(array $principals) { - - $this->principalBackend->setGroupMemberSet($this->getPrincipalUrl(), $principals); - - } - - /** - * Returns the displayname - * - * This should be a human readable name for the principal. - * If none is available, return the nodename. - * - * @return string - */ - public function getDisplayName() { - - return $this->getName(); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/ProxyWrite.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/ProxyWrite.php deleted file mode 100755 index 1ebaf6a1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/ProxyWrite.php +++ /dev/null @@ -1,180 +0,0 @@ -principalInfo = $principalInfo; - $this->principalBackend = $principalBackend; - - } - - /** - * Returns this principals name. - * - * @return string - */ - public function getName() { - - return 'calendar-proxy-write'; - - } - - /** - * Returns the last modification time - * - * @return null - */ - public function getLastModified() { - - return null; - - } - - /** - * Deletes the current node - * - * @throws DAV\Exception\Forbidden - * @return void - */ - public function delete() { - - throw new DAV\Exception\Forbidden('Permission denied to delete node'); - - } - - /** - * Renames the node - * - * @throws DAV\Exception\Forbidden - * @param string $name The new name - * @return void - */ - public function setName($name) { - - throw new DAV\Exception\Forbidden('Permission denied to rename file'); - - } - - - /** - * Returns a list of alternative urls for a principal - * - * This can for example be an email address, or ldap url. - * - * @return array - */ - public function getAlternateUriSet() { - - return array(); - - } - - /** - * Returns the full principal url - * - * @return string - */ - public function getPrincipalUrl() { - - return $this->principalInfo['uri'] . '/' . $this->getName(); - - } - - /** - * Returns the list of group members - * - * If this principal is a group, this function should return - * all member principal uri's for the group. - * - * @return array - */ - public function getGroupMemberSet() { - - return $this->principalBackend->getGroupMemberSet($this->getPrincipalUrl()); - - } - - /** - * Returns the list of groups this principal is member of - * - * If this principal is a member of a (list of) groups, this function - * should return a list of principal uri's for it's members. - * - * @return array - */ - public function getGroupMembership() { - - return $this->principalBackend->getGroupMembership($this->getPrincipalUrl()); - - } - - /** - * Sets a list of group members - * - * If this principal is a group, this method sets all the group members. - * The list of members is always overwritten, never appended to. - * - * This method should throw an exception if the members could not be set. - * - * @param array $principals - * @return void - */ - public function setGroupMemberSet(array $principals) { - - $this->principalBackend->setGroupMemberSet($this->getPrincipalUrl(), $principals); - - } - - /** - * Returns the displayname - * - * This should be a human readable name for the principal. - * If none is available, return the nodename. - * - * @return string - */ - public function getDisplayName() { - - return $this->getName(); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/User.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/User.php deleted file mode 100755 index 1887f8ad..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Principal/User.php +++ /dev/null @@ -1,134 +0,0 @@ -principalBackend->getPrincipalByPath($this->getPrincipalURL() . '/' . $name); - if (!$principal) { - throw new DAV\Exception\NotFound('Node with name ' . $name . ' was not found'); - } - if ($name === 'calendar-proxy-read') - return new ProxyRead($this->principalBackend, $this->principalProperties); - - if ($name === 'calendar-proxy-write') - return new ProxyWrite($this->principalBackend, $this->principalProperties); - - throw new DAV\Exception\NotFound('Node with name ' . $name . ' was not found'); - - } - - /** - * Returns an array with all the child nodes - * - * @return DAV\INode[] - */ - public function getChildren() { - - $r = array(); - if ($this->principalBackend->getPrincipalByPath($this->getPrincipalURL() . '/calendar-proxy-read')) { - $r[] = new ProxyRead($this->principalBackend, $this->principalProperties); - } - if ($this->principalBackend->getPrincipalByPath($this->getPrincipalURL() . '/calendar-proxy-write')) { - $r[] = new ProxyWrite($this->principalBackend, $this->principalProperties); - } - - return $r; - - } - - /** - * Returns whether or not the child node exists - * - * @param string $name - * @return bool - */ - public function childExists($name) { - - try { - $this->getChild($name); - return true; - } catch (DAV\Exception\NotFound $e) { - return false; - } - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - $acl = parent::getACL(); - $acl[] = array( - 'privilege' => '{DAV:}read', - 'principal' => $this->principalProperties['uri'] . '/calendar-proxy-read', - 'protected' => true, - ); - $acl[] = array( - 'privilege' => '{DAV:}read', - 'principal' => $this->principalProperties['uri'] . '/calendar-proxy-write', - 'protected' => true, - ); - return $acl; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/AllowedSharingModes.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/AllowedSharingModes.php deleted file mode 100755 index 97b888a0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/AllowedSharingModes.php +++ /dev/null @@ -1,74 +0,0 @@ -canBeShared = $canBeShared; - $this->canBePublished = $canBePublished; - - } - - /** - * Serializes the property in a DOMDocument - * - * @param DAV\Server $server - * @param \DOMElement $node - * @return void - */ - public function serialize(DAV\Server $server, \DOMElement $node) { - - $doc = $node->ownerDocument; - if ($this->canBeShared) { - $xcomp = $doc->createElement('cs:can-be-shared'); - $node->appendChild($xcomp); - } - if ($this->canBePublished) { - $xcomp = $doc->createElement('cs:can-be-published'); - $node->appendChild($xcomp); - } - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/Invite.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/Invite.php deleted file mode 100755 index 7a8683ac..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/Invite.php +++ /dev/null @@ -1,227 +0,0 @@ -users = $users; - $this->organizer = $organizer; - - } - - /** - * Returns the list of users, as it was passed to the constructor. - * - * @return array - */ - public function getValue() { - - return $this->users; - - } - - /** - * Serializes the property in a DOMDocument - * - * @param DAV\Server $server - * @param \DOMElement $node - * @return void - */ - public function serialize(DAV\Server $server,\DOMElement $node) { - - $doc = $node->ownerDocument; - - if (!is_null($this->organizer)) { - - $xorganizer = $doc->createElement('cs:organizer'); - - $href = $doc->createElement('d:href'); - $href->appendChild($doc->createTextNode($this->organizer['href'])); - $xorganizer->appendChild($href); - - if (isset($this->organizer['commonName']) && $this->organizer['commonName']) { - $commonName = $doc->createElement('cs:common-name'); - $commonName->appendChild($doc->createTextNode($this->organizer['commonName'])); - $xorganizer->appendChild($commonName); - } - if (isset($this->organizer['firstName']) && $this->organizer['firstName']) { - $firstName = $doc->createElement('cs:first-name'); - $firstName->appendChild($doc->createTextNode($this->organizer['firstName'])); - $xorganizer->appendChild($firstName); - } - if (isset($this->organizer['lastName']) && $this->organizer['lastName']) { - $lastName = $doc->createElement('cs:last-name'); - $lastName->appendChild($doc->createTextNode($this->organizer['lastName'])); - $xorganizer->appendChild($lastName); - } - - $node->appendChild($xorganizer); - - - } - - foreach($this->users as $user) { - - $xuser = $doc->createElement('cs:user'); - - $href = $doc->createElement('d:href'); - $href->appendChild($doc->createTextNode($user['href'])); - $xuser->appendChild($href); - - if (isset($user['commonName']) && $user['commonName']) { - $commonName = $doc->createElement('cs:common-name'); - $commonName->appendChild($doc->createTextNode($user['commonName'])); - $xuser->appendChild($commonName); - } - - switch($user['status']) { - - case SharingPlugin::STATUS_ACCEPTED : - $status = $doc->createElement('cs:invite-accepted'); - $xuser->appendChild($status); - break; - case SharingPlugin::STATUS_DECLINED : - $status = $doc->createElement('cs:invite-declined'); - $xuser->appendChild($status); - break; - case SharingPlugin::STATUS_NORESPONSE : - $status = $doc->createElement('cs:invite-noresponse'); - $xuser->appendChild($status); - break; - case SharingPlugin::STATUS_INVALID : - $status = $doc->createElement('cs:invite-invalid'); - $xuser->appendChild($status); - break; - - } - - $xaccess = $doc->createElement('cs:access'); - - if ($user['readOnly']) { - $xaccess->appendChild( - $doc->createElement('cs:read') - ); - } else { - $xaccess->appendChild( - $doc->createElement('cs:read-write') - ); - } - $xuser->appendChild($xaccess); - - if (isset($user['summary']) && $user['summary']) { - $summary = $doc->createElement('cs:summary'); - $summary->appendChild($doc->createTextNode($user['summary'])); - $xuser->appendChild($summary); - } - - $node->appendChild($xuser); - - } - - - } - - /** - * Unserializes the property. - * - * This static method should return a an instance of this object. - * - * @param \DOMElement $prop - * @return DAV\IProperty - */ - static function unserialize(\DOMElement $prop) { - - $xpath = new \DOMXPath($prop->ownerDocument); - $xpath->registerNamespace('cs', CalDAV\Plugin::NS_CALENDARSERVER); - $xpath->registerNamespace('d', 'urn:DAV'); - - $users = array(); - - foreach($xpath->query('cs:user', $prop) as $user) { - - $status = null; - if ($xpath->evaluate('boolean(cs:invite-accepted)', $user)) { - $status = SharingPlugin::STATUS_ACCEPTED; - } elseif ($xpath->evaluate('boolean(cs:invite-declined)', $user)) { - $status = SharingPlugin::STATUS_DECLINED; - } elseif ($xpath->evaluate('boolean(cs:invite-noresponse)', $user)) { - $status = SharingPlugin::STATUS_NORESPONSE; - } elseif ($xpath->evaluate('boolean(cs:invite-invalid)', $user)) { - $status = SharingPlugin::STATUS_INVALID; - } else { - throw new DAV\Exception('Every cs:user property must have one of cs:invite-accepted, cs:invite-declined, cs:invite-noresponse or cs:invite-invalid'); - } - $users[] = array( - 'href' => $xpath->evaluate('string(d:href)', $user), - 'commonName' => $xpath->evaluate('string(cs:common-name)', $user), - 'readOnly' => $xpath->evaluate('boolean(cs:access/cs:read)', $user), - 'summary' => $xpath->evaluate('string(cs:summary)', $user), - 'status' => $status, - ); - - } - - return new self($users); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/ScheduleCalendarTransp.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/ScheduleCalendarTransp.php deleted file mode 100755 index 328ac764..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/ScheduleCalendarTransp.php +++ /dev/null @@ -1,102 +0,0 @@ -value = $value; - - } - - /** - * Returns the current value - * - * @return string - */ - public function getValue() { - - return $this->value; - - } - - /** - * Serializes the property in a DOMDocument - * - * @param DAV\Server $server - * @param \DOMElement $node - * @return void - */ - public function serialize(DAV\Server $server,\DOMElement $node) { - - $doc = $node->ownerDocument; - switch($this->value) { - case self::TRANSPARENT : - $xval = $doc->createElement('cal:transparent'); - break; - case self::OPAQUE : - $xval = $doc->createElement('cal:opaque'); - break; - } - - $node->appendChild($xval); - - } - - /** - * Unserializes the DOMElement back into a Property class. - * - * @param \DOMElement $node - * @return ScheduleCalendarTransp - */ - static function unserialize(\DOMElement $node) { - - $value = null; - foreach($node->childNodes as $childNode) { - switch(DAV\XMLUtil::toClarkNotation($childNode)) { - case '{' . CalDAV\Plugin::NS_CALDAV . '}opaque' : - $value = self::OPAQUE; - break; - case '{' . CalDAV\Plugin::NS_CALDAV . '}transparent' : - $value = self::TRANSPARENT; - break; - } - } - if (is_null($value)) - return null; - - return new self($value); - - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCalendarComponentSet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCalendarComponentSet.php deleted file mode 100755 index c533762e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCalendarComponentSet.php +++ /dev/null @@ -1,88 +0,0 @@ -components = $components; - - } - - /** - * Returns the list of supported components - * - * @return array - */ - public function getValue() { - - return $this->components; - - } - - /** - * Serializes the property in a DOMDocument - * - * @param DAV\Server $server - * @param \DOMElement $node - * @return void - */ - public function serialize(DAV\Server $server,\DOMElement $node) { - - $doc = $node->ownerDocument; - foreach($this->components as $component) { - - $xcomp = $doc->createElement('cal:comp'); - $xcomp->setAttribute('name',$component); - $node->appendChild($xcomp); - - } - - } - - /** - * Unserializes the DOMElement back into a Property class. - * - * @param \DOMElement $node - * @return Property_SupportedCalendarComponentSet - */ - static function unserialize(\DOMElement $node) { - - $components = array(); - foreach($node->childNodes as $childNode) { - if (DAV\XMLUtil::toClarkNotation($childNode)==='{' . CalDAV\Plugin::NS_CALDAV . '}comp') { - $components[] = $childNode->getAttribute('name'); - } - } - return new self($components); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCalendarData.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCalendarData.php deleted file mode 100755 index ed742daf..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCalendarData.php +++ /dev/null @@ -1,40 +0,0 @@ -ownerDocument; - - $prefix = isset($server->xmlNamespaces[Plugin::NS_CALDAV])?$server->xmlNamespaces[Plugin::NS_CALDAV]:'cal'; - - $caldata = $doc->createElement($prefix . ':calendar-data'); - $caldata->setAttribute('content-type','text/calendar'); - $caldata->setAttribute('version','2.0'); - - $node->appendChild($caldata); - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCollationSet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCollationSet.php deleted file mode 100755 index 7c853f26..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Property/SupportedCollationSet.php +++ /dev/null @@ -1,45 +0,0 @@ -ownerDocument; - - $prefix = $node->lookupPrefix('urn:ietf:params:xml:ns:caldav'); - if (!$prefix) $prefix = 'cal'; - - $node->appendChild( - $doc->createElement($prefix . ':supported-collation','i;ascii-casemap') - ); - $node->appendChild( - $doc->createElement($prefix . ':supported-collation','i;octet') - ); - $node->appendChild( - $doc->createElement($prefix . ':supported-collation','i;unicode-casemap') - ); - - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Schedule/IMip.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Schedule/IMip.php deleted file mode 100755 index 0efacff6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Schedule/IMip.php +++ /dev/null @@ -1,111 +0,0 @@ -senderEmail = $senderEmail; - - } - - /** - * Sends one or more iTip messages through email. - * - * @param string $originator Originator Email - * @param array $recipients Array of email addresses - * @param VObject\Component $vObject - * @param string $principal Principal Url of the originator - * @return void - */ - public function sendMessage($originator, array $recipients, VObject\Component $vObject, $principal) { - - foreach($recipients as $recipient) { - - $to = $recipient; - $replyTo = $originator; - $subject = 'SabreDAV iTIP message'; - - switch(strtoupper($vObject->METHOD)) { - case 'REPLY' : - $subject = 'Response for: ' . $vObject->VEVENT->SUMMARY; - break; - case 'REQUEST' : - $subject = 'Invitation for: ' .$vObject->VEVENT->SUMMARY; - break; - case 'CANCEL' : - $subject = 'Cancelled event: ' . $vObject->VEVENT->SUMMARY; - break; - } - - $headers = array(); - $headers[] = 'Reply-To: ' . $replyTo; - $headers[] = 'From: ' . $this->senderEmail; - $headers[] = 'Content-Type: text/calendar; method=' . (string)$vObject->method . '; charset=utf-8'; - if (DAV\Server::$exposeVersion) { - $headers[] = 'X-Sabre-Version: ' . DAV\Version::VERSION . '-' . DAV\Version::STABILITY; - } - - $vcalBody = $vObject->serialize(); - - $this->mail($to, $subject, $vcalBody, $headers); - - } - - } - - // @codeCoverageIgnoreStart - // This is deemed untestable in a reasonable manner - - /** - * This function is reponsible for sending the actual email. - * - * @param string $to Recipient email address - * @param string $subject Subject of the email - * @param string $body iCalendar body - * @param array $headers List of headers - * @return void - */ - protected function mail($to, $subject, $body, array $headers) { - - - mail($to, $subject, $body, implode("\r\n", $headers)); - - } - - // @codeCoverageIgnoreEnd - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Schedule/IOutbox.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Schedule/IOutbox.php deleted file mode 100755 index e9edc510..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Schedule/IOutbox.php +++ /dev/null @@ -1,16 +0,0 @@ -principalUri = $principalUri; - - } - - /** - * Returns the name of the node. - * - * This is used to generate the url. - * - * @return string - */ - public function getName() { - - return 'outbox'; - - } - - /** - * Returns an array with all the child nodes - * - * @return \SabreForRainLoop\DAV\INode[] - */ - public function getChildren() { - - return array(); - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->principalUri; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-query-freebusy', - 'principal' => $this->getOwner(), - 'protected' => true, - ), - array( - 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-post-vevent', - 'principal' => $this->getOwner(), - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->getOwner(), - 'protected' => true, - ), - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new DAV\Exception\MethodNotAllowed('You\'re not allowed to update the ACL'); - - } - - /** - * Returns the list of supported privileges for this node. - * - * The returned data structure is a list of nested privileges. - * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple - * standard structure. - * - * If null is returned from this method, the default privilege set is used, - * which is fine for most common usecases. - * - * @return array|null - */ - public function getSupportedPrivilegeSet() { - - $default = DAVACL\Plugin::getDefaultSupportedPrivilegeSet(); - $default['aggregates'][] = array( - 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-query-freebusy', - ); - $default['aggregates'][] = array( - 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-post-vevent', - ); - - return $default; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ShareableCalendar.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ShareableCalendar.php deleted file mode 100755 index 43b051a2..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/ShareableCalendar.php +++ /dev/null @@ -1,72 +0,0 @@ -caldavBackend->updateShares($this->calendarInfo['id'], $add, $remove); - - } - - /** - * Returns the list of people whom this calendar is shared with. - * - * Every element in this array should have the following properties: - * * href - Often a mailto: address - * * commonName - Optional, for example a first + last name - * * status - See the SabreForRainLoop\CalDAV\SharingPlugin::STATUS_ constants. - * * readOnly - boolean - * * summary - Optional, a description for the share - * - * @return array - */ - public function getShares() { - - return $this->caldavBackend->getShares($this->calendarInfo['id']); - - } - - /** - * Marks this calendar as published. - * - * Publishing a calendar should automatically create a read-only, public, - * subscribable calendar. - * - * @param bool $value - * @return void - */ - public function setPublishStatus($value) { - - $this->caldavBackend->setPublishStatus($this->calendarInfo['id'], $value); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/SharedCalendar.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/SharedCalendar.php deleted file mode 100755 index fda75159..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/SharedCalendar.php +++ /dev/null @@ -1,116 +0,0 @@ -calendarInfo['{http://calendarserver.org/ns/}shared-url']; - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->calendarInfo['{http://sabredav.org/ns}owner-principal']; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - // The top-level ACL only contains access information for the true - // owner of the calendar, so we need to add the information for the - // sharee. - $acl = parent::getACL(); - $acl[] = array( - 'privilege' => '{DAV:}read', - 'principal' => $this->calendarInfo['principaluri'], - 'protected' => true, - ); - if (!$this->calendarInfo['{http://sabredav.org/ns}read-only']) { - $acl[] = array( - 'privilege' => '{DAV:}write', - 'principal' => $this->calendarInfo['principaluri'], - 'protected' => true, - ); - } - return $acl; - - } - - /** - * Returns the list of people whom this calendar is shared with. - * - * Every element in this array should have the following properties: - * * href - Often a mailto: address - * * commonName - Optional, for example a first + last name - * * status - See the SabreForRainLoop\CalDAV\SharingPlugin::STATUS_ constants. - * * readOnly - boolean - * * summary - Optional, a description for the share - * - * @return array - */ - public function getShares() { - - return $this->caldavBackend->getShares($this->calendarInfo['id']); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/SharingPlugin.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/SharingPlugin.php deleted file mode 100755 index 7a89075a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/SharingPlugin.php +++ /dev/null @@ -1,526 +0,0 @@ -server = $server; - $server->resourceTypeMapping['SabreForRainLoop\\CalDAV\\ISharedCalendar'] = '{' . Plugin::NS_CALENDARSERVER . '}shared'; - - array_push( - $this->server->protectedProperties, - '{' . Plugin::NS_CALENDARSERVER . '}invite', - '{' . Plugin::NS_CALENDARSERVER . '}allowed-sharing-modes', - '{' . Plugin::NS_CALENDARSERVER . '}shared-url' - ); - - $this->server->subscribeEvent('beforeGetProperties', array($this, 'beforeGetProperties')); - $this->server->subscribeEvent('afterGetProperties', array($this, 'afterGetProperties')); - $this->server->subscribeEvent('updateProperties', array($this, 'updateProperties')); - $this->server->subscribeEvent('unknownMethod', array($this,'unknownMethod')); - - } - - /** - * This event is triggered when properties are requested for a certain - * node. - * - * This allows us to inject any properties early. - * - * @param string $path - * @param DAV\INode $node - * @param array $requestedProperties - * @param array $returnedProperties - * @return void - */ - public function beforeGetProperties($path, DAV\INode $node, &$requestedProperties, &$returnedProperties) { - - if ($node instanceof IShareableCalendar) { - if (($index = array_search('{' . Plugin::NS_CALENDARSERVER . '}invite', $requestedProperties))!==false) { - - unset($requestedProperties[$index]); - $returnedProperties[200]['{' . Plugin::NS_CALENDARSERVER . '}invite'] = - new Property\Invite( - $node->getShares() - ); - - } - - } - - if ($node instanceof ISharedCalendar) { - - if (($index = array_search('{' . Plugin::NS_CALENDARSERVER . '}shared-url', $requestedProperties))!==false) { - - unset($requestedProperties[$index]); - $returnedProperties[200]['{' . Plugin::NS_CALENDARSERVER . '}shared-url'] = - new DAV\Property\Href( - $node->getSharedUrl() - ); - - } - // The 'invite' property is slightly different for the 'shared' - // instance of the calendar, as it also contains the owner - // information. - if (($index = array_search('{' . Plugin::NS_CALENDARSERVER . '}invite', $requestedProperties))!==false) { - - unset($requestedProperties[$index]); - - // Fetching owner information - $props = $this->server->getPropertiesForPath($node->getOwner(), array( - '{http://sabredav.org/ns}email-address', - '{DAV:}displayname', - ), 1); - - $ownerInfo = array( - 'href' => $node->getOwner(), - ); - - if (isset($props[0][200])) { - - // We're mapping the internal webdav properties to the - // elements caldav-sharing expects. - if (isset($props[0][200]['{http://sabredav.org/ns}email-address'])) { - $ownerInfo['href'] = 'mailto:' . $props[0][200]['{http://sabredav.org/ns}email-address']; - } - if (isset($props[0][200]['{DAV:}displayname'])) { - $ownerInfo['commonName'] = $props[0][200]['{DAV:}displayname']; - } - - } - - $returnedProperties[200]['{' . Plugin::NS_CALENDARSERVER . '}invite'] = - new Property\Invite( - $node->getShares(), - $ownerInfo - ); - - } - - - } - - } - - /** - * This method is triggered *after* all properties have been retrieved. - * This allows us to inject the correct resourcetype for calendars that - * have been shared. - * - * @param string $path - * @param array $properties - * @param DAV\INode $node - * @return void - */ - public function afterGetProperties($path, &$properties, DAV\INode $node) { - - if ($node instanceof IShareableCalendar) { - if (isset($properties[200]['{DAV:}resourcetype'])) { - if (count($node->getShares())>0) { - $properties[200]['{DAV:}resourcetype']->add( - '{' . Plugin::NS_CALENDARSERVER . '}shared-owner' - ); - } - } - $propName = '{' . Plugin::NS_CALENDARSERVER . '}allowed-sharing-modes'; - if (array_key_exists($propName, $properties[404])) { - unset($properties[404][$propName]); - $properties[200][$propName] = new Property\AllowedSharingModes(true,false); - } - - } - - } - - /** - * This method is trigged when a user attempts to update a node's - * properties. - * - * A previous draft of the sharing spec stated that it was possible to use - * PROPPATCH to remove 'shared-owner' from the resourcetype, thus unsharing - * the calendar. - * - * Even though this is no longer in the current spec, we keep this around - * because OS X 10.7 may still make use of this feature. - * - * @param array $mutations - * @param array $result - * @param DAV\INode $node - * @return void - */ - public function updateProperties(array &$mutations, array &$result, DAV\INode $node) { - - if (!$node instanceof IShareableCalendar) - return; - - if (!isset($mutations['{DAV:}resourcetype'])) { - return; - } - - // Only doing something if shared-owner is indeed not in the list. - if($mutations['{DAV:}resourcetype']->is('{' . Plugin::NS_CALENDARSERVER . '}shared-owner')) return; - - $shares = $node->getShares(); - $remove = array(); - foreach($shares as $share) { - $remove[] = $share['href']; - } - $node->updateShares(array(), $remove); - - // We're marking this update as 200 OK - $result[200]['{DAV:}resourcetype'] = null; - - // Removing it from the mutations list - unset($mutations['{DAV:}resourcetype']); - - } - - /** - * This event is triggered when the server didn't know how to handle a - * certain request. - * - * We intercept this to handle POST requests on calendars. - * - * @param string $method - * @param string $uri - * @return null|bool - */ - public function unknownMethod($method, $uri) { - - if ($method!=='POST') { - return; - } - - // Only handling xml - $contentType = $this->server->httpRequest->getHeader('Content-Type'); - if (strpos($contentType,'application/xml')===false && strpos($contentType,'text/xml')===false) - return; - - // Making sure the node exists - try { - $node = $this->server->tree->getNodeForPath($uri); - } catch (DAV\Exception\NotFound $e) { - return; - } - - $requestBody = $this->server->httpRequest->getBody(true); - - // If this request handler could not deal with this POST request, it - // will return 'null' and other plugins get a chance to handle the - // request. - // - // However, we already requested the full body. This is a problem, - // because a body can only be read once. This is why we preemptively - // re-populated the request body with the existing data. - $this->server->httpRequest->setBody($requestBody); - - $dom = DAV\XMLUtil::loadDOMDocument($requestBody); - - $documentType = DAV\XMLUtil::toClarkNotation($dom->firstChild); - - switch($documentType) { - - // Dealing with the 'share' document, which modified invitees on a - // calendar. - case '{' . Plugin::NS_CALENDARSERVER . '}share' : - - // We can only deal with IShareableCalendar objects - if (!$node instanceof IShareableCalendar) { - return; - } - - // Getting ACL info - $acl = $this->server->getPlugin('acl'); - - // If there's no ACL support, we allow everything - if ($acl) { - $acl->checkPrivileges($uri, '{DAV:}write'); - } - - $mutations = $this->parseShareRequest($dom); - - $node->updateShares($mutations[0], $mutations[1]); - - $this->server->httpResponse->sendStatus(200); - // Adding this because sending a response body may cause issues, - // and I wanted some type of indicator the response was handled. - $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well'); - - // Breaking the event chain - return false; - - // The invite-reply document is sent when the user replies to an - // invitation of a calendar share. - case '{'. Plugin::NS_CALENDARSERVER.'}invite-reply' : - - // This only works on the calendar-home-root node. - if (!$node instanceof UserCalendars) { - return; - } - - // Getting ACL info - $acl = $this->server->getPlugin('acl'); - - // If there's no ACL support, we allow everything - if ($acl) { - $acl->checkPrivileges($uri, '{DAV:}write'); - } - - $message = $this->parseInviteReplyRequest($dom); - - $url = $node->shareReply( - $message['href'], - $message['status'], - $message['calendarUri'], - $message['inReplyTo'], - $message['summary'] - ); - - $this->server->httpResponse->sendStatus(200); - // Adding this because sending a response body may cause issues, - // and I wanted some type of indicator the response was handled. - $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well'); - - if ($url) { - $dom = new \DOMDocument('1.0', 'UTF-8'); - $dom->formatOutput = true; - - $root = $dom->createElement('cs:shared-as'); - foreach($this->server->xmlNamespaces as $namespace => $prefix) { - $root->setAttribute('xmlns:' . $prefix, $namespace); - } - - $dom->appendChild($root); - $href = new DAV\Property\Href($url); - - $href->serialize($this->server, $root); - $this->server->httpResponse->setHeader('Content-Type','application/xml'); - $this->server->httpResponse->sendBody($dom->saveXML()); - - } - - // Breaking the event chain - return false; - - case '{' . Plugin::NS_CALENDARSERVER . '}publish-calendar' : - - // We can only deal with IShareableCalendar objects - if (!$node instanceof IShareableCalendar) { - return; - } - - // Getting ACL info - $acl = $this->server->getPlugin('acl'); - - // If there's no ACL support, we allow everything - if ($acl) { - $acl->checkPrivileges($uri, '{DAV:}write'); - } - - $node->setPublishStatus(true); - - // iCloud sends back the 202, so we will too. - $this->server->httpResponse->sendStatus(202); - - // Adding this because sending a response body may cause issues, - // and I wanted some type of indicator the response was handled. - $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well'); - - // Breaking the event chain - return false; - - case '{' . Plugin::NS_CALENDARSERVER . '}unpublish-calendar' : - - // We can only deal with IShareableCalendar objects - if (!$node instanceof IShareableCalendar) { - return; - } - - // Getting ACL info - $acl = $this->server->getPlugin('acl'); - - // If there's no ACL support, we allow everything - if ($acl) { - $acl->checkPrivileges($uri, '{DAV:}write'); - } - - $node->setPublishStatus(false); - - $this->server->httpResponse->sendStatus(200); - - // Adding this because sending a response body may cause issues, - // and I wanted some type of indicator the response was handled. - $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well'); - - // Breaking the event chain - return false; - - } - - - - } - - /** - * Parses the 'share' POST request. - * - * This method returns an array, containing two arrays. - * The first array is a list of new sharees. Every element is a struct - * containing a: - * * href element. (usually a mailto: address) - * * commonName element (often a first and lastname, but can also be - * false) - * * readOnly (true or false) - * * summary (A description of the share, can also be false) - * - * The second array is a list of sharees that are to be removed. This is - * just a simple array with 'hrefs'. - * - * @param \DOMDocument $dom - * @return array - */ - protected function parseShareRequest(\DOMDocument $dom) { - - $xpath = new \DOMXPath($dom); - $xpath->registerNamespace('cs', Plugin::NS_CALENDARSERVER); - $xpath->registerNamespace('d', 'urn:DAV'); - - $set = array(); - $elems = $xpath->query('cs:set'); - - for($i=0; $i < $elems->length; $i++) { - - $xset = $elems->item($i); - $set[] = array( - 'href' => $xpath->evaluate('string(d:href)', $xset), - 'commonName' => $xpath->evaluate('string(cs:common-name)', $xset), - 'summary' => $xpath->evaluate('string(cs:summary)', $xset), - 'readOnly' => $xpath->evaluate('boolean(cs:read)', $xset)!==false - ); - - } - - $remove = array(); - $elems = $xpath->query('cs:remove'); - - for($i=0; $i < $elems->length; $i++) { - - $xremove = $elems->item($i); - $remove[] = $xpath->evaluate('string(d:href)', $xremove); - - } - - return array($set, $remove); - - } - - /** - * Parses the 'invite-reply' POST request. - * - * This method returns an array, containing the following properties: - * * href - The sharee who is replying - * * status - One of the self::STATUS_* constants - * * calendarUri - The url of the shared calendar - * * inReplyTo - The unique id of the share invitation. - * * summary - Optional description of the reply. - * - * @param \DOMDocument $dom - * @return array - */ - protected function parseInviteReplyRequest(\DOMDocument $dom) { - - $xpath = new \DOMXPath($dom); - $xpath->registerNamespace('cs', Plugin::NS_CALENDARSERVER); - $xpath->registerNamespace('d', 'urn:DAV'); - - $hostHref = $xpath->evaluate('string(cs:hosturl/d:href)'); - if (!$hostHref) { - throw new DAV\Exception\BadRequest('The {' . Plugin::NS_CALENDARSERVER . '}hosturl/{DAV:}href element is required'); - } - - return array( - 'href' => $xpath->evaluate('string(d:href)'), - 'calendarUri' => $this->server->calculateUri($hostHref), - 'inReplyTo' => $xpath->evaluate('string(cs:in-reply-to)'), - 'summary' => $xpath->evaluate('string(cs:summary)'), - 'status' => $xpath->evaluate('boolean(cs:invite-accepted)')?self::STATUS_ACCEPTED:self::STATUS_DECLINED - ); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/UserCalendars.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/UserCalendars.php deleted file mode 100755 index 17f7956f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/UserCalendars.php +++ /dev/null @@ -1,342 +0,0 @@ -caldavBackend = $caldavBackend; - $this->principalInfo = $principalInfo; - - } - - /** - * Returns the name of this object - * - * @return string - */ - public function getName() { - - list(,$name) = DAV\URLUtil::splitPath($this->principalInfo['uri']); - return $name; - - } - - /** - * Updates the name of this object - * - * @param string $name - * @return void - */ - public function setName($name) { - - throw new DAV\Exception\Forbidden(); - - } - - /** - * Deletes this object - * - * @return void - */ - public function delete() { - - throw new DAV\Exception\Forbidden(); - - } - - /** - * Returns the last modification date - * - * @return int - */ - public function getLastModified() { - - return null; - - } - - /** - * Creates a new file under this object. - * - * This is currently not allowed - * - * @param string $filename - * @param resource $data - * @return void - */ - public function createFile($filename, $data=null) { - - throw new DAV\Exception\MethodNotAllowed('Creating new files in this collection is not supported'); - - } - - /** - * Creates a new directory under this object. - * - * This is currently not allowed. - * - * @param string $filename - * @return void - */ - public function createDirectory($filename) { - - throw new DAV\Exception\MethodNotAllowed('Creating new collections in this collection is not supported'); - - } - - /** - * Returns a single calendar, by name - * - * @param string $name - * @todo needs optimizing - * @return Calendar - */ - public function getChild($name) { - - foreach($this->getChildren() as $child) { - if ($name==$child->getName()) - return $child; - - } - throw new DAV\Exception\NotFound('Calendar with name \'' . $name . '\' could not be found'); - - } - - /** - * Checks if a calendar exists. - * - * @param string $name - * @todo needs optimizing - * @return bool - */ - public function childExists($name) { - - foreach($this->getChildren() as $child) { - if ($name==$child->getName()) - return true; - - } - return false; - - } - - /** - * Returns a list of calendars - * - * @return array - */ - public function getChildren() { - - $calendars = $this->caldavBackend->getCalendarsForUser($this->principalInfo['uri']); - $objs = array(); - foreach($calendars as $calendar) { - if ($this->caldavBackend instanceof Backend\SharingSupport) { - if (isset($calendar['{http://calendarserver.org/ns/}shared-url'])) { - $objs[] = new SharedCalendar($this->caldavBackend, $calendar); - } else { - $objs[] = new ShareableCalendar($this->caldavBackend, $calendar); - } - } else { - $objs[] = new Calendar($this->caldavBackend, $calendar); - } - } - $objs[] = new Schedule\Outbox($this->principalInfo['uri']); - - // We're adding a notifications node, if it's supported by the backend. - if ($this->caldavBackend instanceof Backend\NotificationSupport) { - $objs[] = new Notifications\Collection($this->caldavBackend, $this->principalInfo['uri']); - } - return $objs; - - } - - /** - * Creates a new calendar - * - * @param string $name - * @param array $resourceType - * @param array $properties - * @return void - */ - public function createExtendedCollection($name, array $resourceType, array $properties) { - - $isCalendar = false; - foreach($resourceType as $rt) { - switch ($rt) { - case '{DAV:}collection' : - case '{http://calendarserver.org/ns/}shared-owner' : - // ignore - break; - case '{urn:ietf:params:xml:ns:caldav}calendar' : - $isCalendar = true; - break; - default : - throw new DAV\Exception\InvalidResourceType('Unknown resourceType: ' . $rt); - } - } - if (!$isCalendar) { - throw new DAV\Exception\InvalidResourceType('You can only create calendars in this collection'); - } - $this->caldavBackend->createCalendar($this->principalInfo['uri'], $name, $properties); - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->principalInfo['uri']; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->principalInfo['uri'], - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->principalInfo['uri'], - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-read', - 'protected' => true, - ), - - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported'); - - } - - /** - * Returns the list of supported privileges for this node. - * - * The returned data structure is a list of nested privileges. - * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple - * standard structure. - * - * If null is returned from this method, the default privilege set is used, - * which is fine for most common usecases. - * - * @return array|null - */ - public function getSupportedPrivilegeSet() { - - return null; - - } - - /** - * This method is called when a user replied to a request to share. - * - * This method should return the url of the newly created calendar if the - * share was accepted. - * - * @param string href The sharee who is replying (often a mailto: address) - * @param int status One of the SharingPlugin::STATUS_* constants - * @param string $calendarUri The url to the calendar thats being shared - * @param string $inReplyTo The unique id this message is a response to - * @param string $summary A description of the reply - * @return null|string - */ - public function shareReply($href, $status, $calendarUri, $inReplyTo, $summary = null) { - - if (!$this->caldavBackend instanceof Backend\SharingSupport) { - throw new DAV\Exception\NotImplemented('Sharing support is not implemented by this backend.'); - } - - return $this->caldavBackend->shareReply($href, $status, $calendarUri, $inReplyTo, $summary); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Version.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Version.php deleted file mode 100755 index b85b3400..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CalDAV/Version.php +++ /dev/null @@ -1,24 +0,0 @@ -carddavBackend = $carddavBackend; - $this->addressBookInfo = $addressBookInfo; - - } - - /** - * Returns the name of the addressbook - * - * @return string - */ - public function getName() { - - return $this->addressBookInfo['uri']; - - } - - /** - * Returns a card - * - * @param string $name - * @return \ICard - */ - public function getChild($name) { - - $obj = $this->carddavBackend->getCard($this->addressBookInfo['id'],$name); - if (!$obj) throw new DAV\Exception\NotFound('Card not found'); - return new Card($this->carddavBackend,$this->addressBookInfo,$obj); - - } - - /** - * Returns the full list of cards - * - * @return array - */ - public function getChildren() { - - $objs = $this->carddavBackend->getCards($this->addressBookInfo['id']); - $children = array(); - foreach($objs as $obj) { - $children[] = new Card($this->carddavBackend,$this->addressBookInfo,$obj); - } - return $children; - - } - - /** - * Creates a new directory - * - * We actually block this, as subdirectories are not allowed in addressbooks. - * - * @param string $name - * @return void - */ - public function createDirectory($name) { - - throw new DAV\Exception\MethodNotAllowed('Creating collections in addressbooks is not allowed'); - - } - - /** - * Creates a new file - * - * The contents of the new file must be a valid VCARD. - * - * This method may return an ETag. - * - * @param string $name - * @param resource $vcardData - * @return string|null - */ - public function createFile($name,$vcardData = null) { - - if (is_resource($vcardData)) { - $vcardData = stream_get_contents($vcardData); - } - // Converting to UTF-8, if needed - $vcardData = DAV\StringUtil::ensureUTF8($vcardData); - - return $this->carddavBackend->createCard($this->addressBookInfo['id'],$name,$vcardData); - - } - - /** - * Deletes the entire addressbook. - * - * @return void - */ - public function delete() { - - $this->carddavBackend->deleteAddressBook($this->addressBookInfo['id']); - - } - - /** - * Renames the addressbook - * - * @param string $newName - * @return void - */ - public function setName($newName) { - - throw new DAV\Exception\MethodNotAllowed('Renaming addressbooks is not yet supported'); - - } - - /** - * Returns the last modification date as a unix timestamp. - * - * @return void - */ - public function getLastModified() { - - return null; - - } - - /** - * Updates properties on this node, - * - * The properties array uses the propertyName in clark-notation as key, - * and the array value for the property value. In the case a property - * should be deleted, the property value will be null. - * - * This method must be atomic. If one property cannot be changed, the - * entire operation must fail. - * - * If the operation was successful, true can be returned. - * If the operation failed, false can be returned. - * - * Deletion of a non-existent property is always successful. - * - * Lastly, it is optional to return detailed information about any - * failures. In this case an array should be returned with the following - * structure: - * - * array( - * 403 => array( - * '{DAV:}displayname' => null, - * ), - * 424 => array( - * '{DAV:}owner' => null, - * ) - * ) - * - * In this example it was forbidden to update {DAV:}displayname. - * (403 Forbidden), which in turn also caused {DAV:}owner to fail - * (424 Failed Dependency) because the request needs to be atomic. - * - * @param array $mutations - * @return bool|array - */ - public function updateProperties($mutations) { - - return $this->carddavBackend->updateAddressBook($this->addressBookInfo['id'], $mutations); - - } - - /** - * Returns a list of properties for this nodes. - * - * The properties list is a list of propertynames the client requested, - * encoded in clark-notation {xmlnamespace}tagname - * - * If the array is empty, it means 'all properties' were requested. - * - * @param array $properties - * @return array - */ - public function getProperties($properties) { - - $response = array(); - foreach($properties as $propertyName) { - - if (isset($this->addressBookInfo[$propertyName])) { - - $response[$propertyName] = $this->addressBookInfo[$propertyName]; - - } - - } - - return $response; - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->addressBookInfo['principaluri']; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->addressBookInfo['principaluri'], - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->addressBookInfo['principaluri'], - 'protected' => true, - ), - - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported'); - - } - - /** - * Returns the list of supported privileges for this node. - * - * The returned data structure is a list of nested privileges. - * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple - * standard structure. - * - * If null is returned from this method, the default privilege set is used, - * which is fine for most common usecases. - * - * @return array|null - */ - public function getSupportedPrivilegeSet() { - - return null; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/AddressBookQueryParser.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/AddressBookQueryParser.php deleted file mode 100755 index 579937e8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/AddressBookQueryParser.php +++ /dev/null @@ -1,221 +0,0 @@ -dom = $dom; - - $this->xpath = new \DOMXPath($dom); - $this->xpath->registerNameSpace('card',Plugin::NS_CARDDAV); - - } - - /** - * Parses the request. - * - * @return void - */ - public function parse() { - - $filterNode = null; - - $limit = $this->xpath->evaluate('number(/card:addressbook-query/card:limit/card:nresults)'); - if (is_nan($limit)) $limit = null; - - $filter = $this->xpath->query('/card:addressbook-query/card:filter'); - - // According to the CardDAV spec there needs to be exactly 1 filter - // element. However, KDE 4.8.2 contains a bug that will encode 0 filter - // elements, so this is a workaround for that. - // - // See: https://bugs.kde.org/show_bug.cgi?id=300047 - if ($filter->length === 0) { - $test = null; - $filter = null; - } elseif ($filter->length === 1) { - $filter = $filter->item(0); - $test = $this->xpath->evaluate('string(@test)', $filter); - } else { - throw new DAV\Exception\BadRequest('Only one filter element is allowed'); - } - - if (!$test) $test = self::TEST_ANYOF; - if ($test !== self::TEST_ANYOF && $test !== self::TEST_ALLOF) { - throw new DAV\Exception\BadRequest('The test attribute must either hold "anyof" or "allof"'); - } - - $propFilters = array(); - - $propFilterNodes = $this->xpath->query('card:prop-filter', $filter); - for($ii=0; $ii < $propFilterNodes->length; $ii++) { - - $propFilters[] = $this->parsePropFilterNode($propFilterNodes->item($ii)); - - - } - - $this->filters = $propFilters; - $this->limit = $limit; - $this->requestedProperties = array_keys(DAV\XMLUtil::parseProperties($this->dom->firstChild)); - $this->test = $test; - - } - - /** - * Parses the prop-filter xml element - * - * @param \DOMElement $propFilterNode - * @return array - */ - protected function parsePropFilterNode(\DOMElement $propFilterNode) { - - $propFilter = array(); - $propFilter['name'] = $propFilterNode->getAttribute('name'); - $propFilter['test'] = $propFilterNode->getAttribute('test'); - if (!$propFilter['test']) $propFilter['test'] = 'anyof'; - - $propFilter['is-not-defined'] = $this->xpath->query('card:is-not-defined', $propFilterNode)->length>0; - - $paramFilterNodes = $this->xpath->query('card:param-filter', $propFilterNode); - - $propFilter['param-filters'] = array(); - - - for($ii=0;$ii<$paramFilterNodes->length;$ii++) { - - $propFilter['param-filters'][] = $this->parseParamFilterNode($paramFilterNodes->item($ii)); - - } - $propFilter['text-matches'] = array(); - $textMatchNodes = $this->xpath->query('card:text-match', $propFilterNode); - - for($ii=0;$ii<$textMatchNodes->length;$ii++) { - - $propFilter['text-matches'][] = $this->parseTextMatchNode($textMatchNodes->item($ii)); - - } - - return $propFilter; - - } - - /** - * Parses the param-filter element - * - * @param \DOMElement $paramFilterNode - * @return array - */ - public function parseParamFilterNode(\DOMElement $paramFilterNode) { - - $paramFilter = array(); - $paramFilter['name'] = $paramFilterNode->getAttribute('name'); - $paramFilter['is-not-defined'] = $this->xpath->query('card:is-not-defined', $paramFilterNode)->length>0; - $paramFilter['text-match'] = null; - - $textMatch = $this->xpath->query('card:text-match', $paramFilterNode); - if ($textMatch->length>0) { - $paramFilter['text-match'] = $this->parseTextMatchNode($textMatch->item(0)); - } - - return $paramFilter; - - } - - /** - * Text match - * - * @param \DOMElement $textMatchNode - * @return array - */ - public function parseTextMatchNode(\DOMElement $textMatchNode) { - - $matchType = $textMatchNode->getAttribute('match-type'); - if (!$matchType) $matchType = 'contains'; - - if (!in_array($matchType, array('contains', 'equals', 'starts-with', 'ends-with'))) { - throw new DAV\Exception\BadRequest('Unknown match-type: ' . $matchType); - } - - $negateCondition = $textMatchNode->getAttribute('negate-condition'); - $negateCondition = $negateCondition==='yes'; - $collation = $textMatchNode->getAttribute('collation'); - if (!$collation) $collation = 'i;unicode-casemap'; - - return array( - 'negate-condition' => $negateCondition, - 'collation' => $collation, - 'match-type' => $matchType, - 'value' => $textMatchNode->nodeValue - ); - - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/AddressBookRoot.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/AddressBookRoot.php deleted file mode 100755 index 5cbd9183..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/AddressBookRoot.php +++ /dev/null @@ -1,80 +0,0 @@ -carddavBackend = $carddavBackend; - parent::__construct($principalBackend, $principalPrefix); - - } - - /** - * Returns the name of the node - * - * @return string - */ - public function getName() { - - return Plugin::ADDRESSBOOK_ROOT; - - } - - /** - * This method returns a node for a principal. - * - * The passed array contains principal information, and is guaranteed to - * at least contain a uri item. Other properties may or may not be - * supplied by the authentication backend. - * - * @param array $principal - * @return \SabreForRainLoop\DAV\INode - */ - public function getChildForPrincipal(array $principal) { - - return new UserAddressBooks($this->carddavBackend, $principal['uri']); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Backend/AbstractBackend.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Backend/AbstractBackend.php deleted file mode 100755 index 14504d6f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Backend/AbstractBackend.php +++ /dev/null @@ -1,18 +0,0 @@ -pdo = $pdo; - $this->addressBooksTableName = $addressBooksTableName; - $this->cardsTableName = $cardsTableName; - - } - - /** - * Returns the list of addressbooks for a specific user. - * - * @param string $principalUri - * @return array - */ - public function getAddressBooksForUser($principalUri) { - - $stmt = $this->pdo->prepare('SELECT id, uri, displayname, principaluri, description, ctag FROM '.$this->addressBooksTableName.' WHERE principaluri = ?'); - $stmt->execute(array($principalUri)); - - $addressBooks = array(); - - foreach($stmt->fetchAll() as $row) { - - $addressBooks[] = array( - 'id' => $row['id'], - 'uri' => $row['uri'], - 'principaluri' => $row['principaluri'], - '{DAV:}displayname' => $row['displayname'], - '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'], - '{http://calendarserver.org/ns/}getctag' => $row['ctag'], - '{' . CardDAV\Plugin::NS_CARDDAV . '}supported-address-data' => - new CardDAV\Property\SupportedAddressData(), - ); - - } - - return $addressBooks; - - } - - - /** - * Updates an addressbook's properties - * - * See SabreForRainLoop\DAV\IProperties for a description of the mutations array, as - * well as the return value. - * - * @param mixed $addressBookId - * @param array $mutations - * @see SabreForRainLoop\DAV\IProperties::updateProperties - * @return bool|array - */ - public function updateAddressBook($addressBookId, array $mutations) { - - $updates = array(); - - foreach($mutations as $property=>$newValue) { - - switch($property) { - case '{DAV:}displayname' : - $updates['displayname'] = $newValue; - break; - case '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' : - $updates['description'] = $newValue; - break; - default : - // If any unsupported values were being updated, we must - // let the entire request fail. - return false; - } - - } - - // No values are being updated? - if (!$updates) { - return false; - } - - $query = 'UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 '; - foreach($updates as $key=>$value) { - $query.=', `' . $key . '` = :' . $key . ' '; - } - $query.=' WHERE id = :addressbookid'; - - $stmt = $this->pdo->prepare($query); - $updates['addressbookid'] = $addressBookId; - - $stmt->execute($updates); - - return true; - - } - - /** - * Creates a new address book - * - * @param string $principalUri - * @param string $url Just the 'basename' of the url. - * @param array $properties - * @return void - */ - public function createAddressBook($principalUri, $url, array $properties) { - - $values = array( - 'displayname' => null, - 'description' => null, - 'principaluri' => $principalUri, - 'uri' => $url, - ); - - foreach($properties as $property=>$newValue) { - - switch($property) { - case '{DAV:}displayname' : - $values['displayname'] = $newValue; - break; - case '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' : - $values['description'] = $newValue; - break; - default : - throw new DAV\Exception\BadRequest('Unknown property: ' . $property); - } - - } - - $query = 'INSERT INTO ' . $this->addressBooksTableName . ' (uri, displayname, description, principaluri, ctag) VALUES (:uri, :displayname, :description, :principaluri, 1)'; - $stmt = $this->pdo->prepare($query); - $stmt->execute($values); - - } - - /** - * Deletes an entire addressbook and all its contents - * - * @param int $addressBookId - * @return void - */ - public function deleteAddressBook($addressBookId) { - - $stmt = $this->pdo->prepare('DELETE FROM ' . $this->cardsTableName . ' WHERE addressbookid = ?'); - $stmt->execute(array($addressBookId)); - - $stmt = $this->pdo->prepare('DELETE FROM ' . $this->addressBooksTableName . ' WHERE id = ?'); - $stmt->execute(array($addressBookId)); - - } - - /** - * Returns all cards for a specific addressbook id. - * - * This method should return the following properties for each card: - * * carddata - raw vcard data - * * uri - Some unique url - * * lastmodified - A unix timestamp - * - * It's recommended to also return the following properties: - * * etag - A unique etag. This must change every time the card changes. - * * size - The size of the card in bytes. - * - * If these last two properties are provided, less time will be spent - * calculating them. If they are specified, you can also ommit carddata. - * This may speed up certain requests, especially with large cards. - * - * @param mixed $addressbookId - * @return array - */ - public function getCards($addressbookId) { - - $stmt = $this->pdo->prepare('SELECT id, carddata, uri, lastmodified FROM ' . $this->cardsTableName . ' WHERE addressbookid = ?'); - $stmt->execute(array($addressbookId)); - - return $stmt->fetchAll(\PDO::FETCH_ASSOC); - - - } - - /** - * Returns a specfic card. - * - * The same set of properties must be returned as with getCards. The only - * exception is that 'carddata' is absolutely required. - * - * @param mixed $addressBookId - * @param string $cardUri - * @return array - */ - public function getCard($addressBookId, $cardUri) { - - $stmt = $this->pdo->prepare('SELECT id, carddata, uri, lastmodified FROM ' . $this->cardsTableName . ' WHERE addressbookid = ? AND uri = ? LIMIT 1'); - $stmt->execute(array($addressBookId, $cardUri)); - - $result = $stmt->fetchAll(\PDO::FETCH_ASSOC); - - return (count($result)>0?$result[0]:false); - - } - - /** - * Creates a new card. - * - * The addressbook id will be passed as the first argument. This is the - * same id as it is returned from the getAddressbooksForUser method. - * - * The cardUri is a base uri, and doesn't include the full path. The - * cardData argument is the vcard body, and is passed as a string. - * - * It is possible to return an ETag from this method. This ETag is for the - * newly created resource, and must be enclosed with double quotes (that - * is, the string itself must contain the double quotes). - * - * You should only return the ETag if you store the carddata as-is. If a - * subsequent GET request on the same card does not have the same body, - * byte-by-byte and you did return an ETag here, clients tend to get - * confused. - * - * If you don't return an ETag, you can just return null. - * - * @param mixed $addressBookId - * @param string $cardUri - * @param string $cardData - * @return string|null - */ - public function createCard($addressBookId, $cardUri, $cardData) { - - $stmt = $this->pdo->prepare('INSERT INTO ' . $this->cardsTableName . ' (carddata, uri, lastmodified, addressbookid) VALUES (?, ?, ?, ?)'); - - $result = $stmt->execute(array($cardData, $cardUri, time(), $addressBookId)); - - $stmt2 = $this->pdo->prepare('UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 WHERE id = ?'); - $stmt2->execute(array($addressBookId)); - - return '"' . md5($cardData) . '"'; - - } - - /** - * Updates a card. - * - * The addressbook id will be passed as the first argument. This is the - * same id as it is returned from the getAddressbooksForUser method. - * - * The cardUri is a base uri, and doesn't include the full path. The - * cardData argument is the vcard body, and is passed as a string. - * - * It is possible to return an ETag from this method. This ETag should - * match that of the updated resource, and must be enclosed with double - * quotes (that is: the string itself must contain the actual quotes). - * - * You should only return the ETag if you store the carddata as-is. If a - * subsequent GET request on the same card does not have the same body, - * byte-by-byte and you did return an ETag here, clients tend to get - * confused. - * - * If you don't return an ETag, you can just return null. - * - * @param mixed $addressBookId - * @param string $cardUri - * @param string $cardData - * @return string|null - */ - public function updateCard($addressBookId, $cardUri, $cardData) { - - $stmt = $this->pdo->prepare('UPDATE ' . $this->cardsTableName . ' SET carddata = ?, lastmodified = ? WHERE uri = ? AND addressbookid =?'); - $stmt->execute(array($cardData, time(), $cardUri, $addressBookId)); - - $stmt2 = $this->pdo->prepare('UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 WHERE id = ?'); - $stmt2->execute(array($addressBookId)); - - return '"' . md5($cardData) . '"'; - - } - - /** - * Deletes a card - * - * @param mixed $addressBookId - * @param string $cardUri - * @return bool - */ - public function deleteCard($addressBookId, $cardUri) { - - $stmt = $this->pdo->prepare('DELETE FROM ' . $this->cardsTableName . ' WHERE addressbookid = ? AND uri = ?'); - $stmt->execute(array($addressBookId, $cardUri)); - - $stmt2 = $this->pdo->prepare('UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 WHERE id = ?'); - $stmt2->execute(array($addressBookId)); - - return $stmt->rowCount()===1; - - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Card.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Card.php deleted file mode 100755 index dba09ec6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Card.php +++ /dev/null @@ -1,260 +0,0 @@ -carddavBackend = $carddavBackend; - $this->addressBookInfo = $addressBookInfo; - $this->cardData = $cardData; - - } - - /** - * Returns the uri for this object - * - * @return string - */ - public function getName() { - - return $this->cardData['uri']; - - } - - /** - * Returns the VCard-formatted object - * - * @return string - */ - public function get() { - - // Pre-populating 'carddata' is optional. If we don't yet have it - // already, we fetch it from the backend. - if (!isset($this->cardData['carddata'])) { - $this->cardData = $this->carddavBackend->getCard($this->addressBookInfo['id'], $this->cardData['uri']); - } - return $this->cardData['carddata']; - - } - - /** - * Updates the VCard-formatted object - * - * @param string $cardData - * @return string|null - */ - public function put($cardData) { - - if (is_resource($cardData)) - $cardData = stream_get_contents($cardData); - - // Converting to UTF-8, if needed - $cardData = DAV\StringUtil::ensureUTF8($cardData); - - $etag = $this->carddavBackend->updateCard($this->addressBookInfo['id'],$this->cardData['uri'],$cardData); - $this->cardData['carddata'] = $cardData; - $this->cardData['etag'] = $etag; - - return $etag; - - } - - /** - * Deletes the card - * - * @return void - */ - public function delete() { - - $this->carddavBackend->deleteCard($this->addressBookInfo['id'],$this->cardData['uri']); - - } - - /** - * Returns the mime content-type - * - * @return string - */ - public function getContentType() { - - return 'text/x-vcard; charset=utf-8'; - - } - - /** - * Returns an ETag for this object - * - * @return string - */ - public function getETag() { - - if (isset($this->cardData['etag'])) { - return $this->cardData['etag']; - } else { - $data = $this->get(); - if (is_string($data)) { - return '"' . md5($data) . '"'; - } else { - // We refuse to calculate the md5 if it's a stream. - return null; - } - } - - } - - /** - * Returns the last modification date as a unix timestamp - * - * @return int - */ - public function getLastModified() { - - return isset($this->cardData['lastmodified'])?$this->cardData['lastmodified']:null; - - } - - /** - * Returns the size of this object in bytes - * - * @return int - */ - public function getSize() { - - if (array_key_exists('size', $this->cardData)) { - return $this->cardData['size']; - } else { - return strlen($this->get()); - } - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->addressBookInfo['principaluri']; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->addressBookInfo['principaluri'], - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->addressBookInfo['principaluri'], - 'protected' => true, - ), - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported'); - - } - - /** - * Returns the list of supported privileges for this node. - * - * The returned data structure is a list of nested privileges. - * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple - * standard structure. - * - * If null is returned from this method, the default privilege set is used, - * which is fine for most common usecases. - * - * @return array|null - */ - public function getSupportedPrivilegeSet() { - - return null; - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/IAddressBook.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/IAddressBook.php deleted file mode 100755 index a8d74c6b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/IAddressBook.php +++ /dev/null @@ -1,20 +0,0 @@ -subscribeEvent('beforeGetProperties', array($this, 'beforeGetProperties')); - $server->subscribeEvent('afterGetProperties', array($this, 'afterGetProperties')); - $server->subscribeEvent('updateProperties', array($this, 'updateProperties')); - $server->subscribeEvent('report', array($this,'report')); - $server->subscribeEvent('onHTMLActionsPanel', array($this,'htmlActionsPanel')); - $server->subscribeEvent('onBrowserPostAction', array($this,'browserPostAction')); - $server->subscribeEvent('beforeWriteContent', array($this, 'beforeWriteContent')); - $server->subscribeEvent('beforeCreateFile', array($this, 'beforeCreateFile')); - - /* Namespaces */ - $server->xmlNamespaces[self::NS_CARDDAV] = 'card'; - - /* Mapping Interfaces to {DAV:}resourcetype values */ - $server->resourceTypeMapping['SabreForRainLoop\\CardDAV\\IAddressBook'] = '{' . self::NS_CARDDAV . '}addressbook'; - $server->resourceTypeMapping['SabreForRainLoop\\CardDAV\\IDirectory'] = '{' . self::NS_CARDDAV . '}directory'; - - /* Adding properties that may never be changed */ - $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}supported-address-data'; - $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}max-resource-size'; - $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}addressbook-home-set'; - $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}supported-collation-set'; - - $server->propertyMap['{http://calendarserver.org/ns/}me-card'] = 'SabreForRainLoop\\DAV\\Property\\Href'; - - $this->server = $server; - - } - - /** - * Returns a list of supported features. - * - * This is used in the DAV: header in the OPTIONS and PROPFIND requests. - * - * @return array - */ - public function getFeatures() { - - return array('addressbook'); - - } - - /** - * Returns a list of reports this plugin supports. - * - * This will be used in the {DAV:}supported-report-set property. - * Note that you still need to subscribe to the 'report' event to actually - * implement them - * - * @param string $uri - * @return array - */ - public function getSupportedReportSet($uri) { - - $node = $this->server->tree->getNodeForPath($uri); - if ($node instanceof IAddressBook || $node instanceof ICard) { - return array( - '{' . self::NS_CARDDAV . '}addressbook-multiget', - '{' . self::NS_CARDDAV . '}addressbook-query', - ); - } - return array(); - - } - - - /** - * Adds all CardDAV-specific properties - * - * @param string $path - * @param DAV\INode $node - * @param array $requestedProperties - * @param array $returnedProperties - * @return void - */ - public function beforeGetProperties($path, DAV\INode $node, array &$requestedProperties, array &$returnedProperties) { - - if ($node instanceof DAVACL\IPrincipal) { - - // calendar-home-set property - $addHome = '{' . self::NS_CARDDAV . '}addressbook-home-set'; - if (in_array($addHome,$requestedProperties)) { - $principalId = $node->getName(); - $addressbookHomePath = self::ADDRESSBOOK_ROOT . '/' . $principalId . '/'; - unset($requestedProperties[array_search($addHome, $requestedProperties)]); - $returnedProperties[200][$addHome] = new DAV\Property\Href($addressbookHomePath); - } - - $directories = '{' . self::NS_CARDDAV . '}directory-gateway'; - if ($this->directories && in_array($directories, $requestedProperties)) { - unset($requestedProperties[array_search($directories, $requestedProperties)]); - $returnedProperties[200][$directories] = new DAV\Property\HrefList($this->directories); - } - - } - - if ($node instanceof ICard) { - - // The address-data property is not supposed to be a 'real' - // property, but in large chunks of the spec it does act as such. - // Therefore we simply expose it as a property. - $addressDataProp = '{' . self::NS_CARDDAV . '}address-data'; - if (in_array($addressDataProp, $requestedProperties)) { - unset($requestedProperties[$addressDataProp]); - $val = $node->get(); - if (is_resource($val)) - $val = stream_get_contents($val); - - $returnedProperties[200][$addressDataProp] = $val; - - } - } - - if ($node instanceof UserAddressBooks) { - - $meCardProp = '{http://calendarserver.org/ns/}me-card'; - if (in_array($meCardProp, $requestedProperties)) { - - $props = $this->server->getProperties($node->getOwner(), array('{http://sabredav.org/ns}vcard-url')); - if (isset($props['{http://sabredav.org/ns}vcard-url'])) { - - $returnedProperties[200][$meCardProp] = new DAV\Property\Href( - $props['{http://sabredav.org/ns}vcard-url'] - ); - $pos = array_search($meCardProp, $requestedProperties); - unset($requestedProperties[$pos]); - - } - - } - - } - - } - - /** - * This event is triggered when a PROPPATCH method is executed - * - * @param array $mutations - * @param array $result - * @param DAV\INode $node - * @return bool - */ - public function updateProperties(&$mutations, &$result, DAV\INode $node) { - - if (!$node instanceof UserAddressBooks) { - return true; - } - - $meCard = '{http://calendarserver.org/ns/}me-card'; - - // The only property we care about - if (!isset($mutations[$meCard])) - return true; - - $value = $mutations[$meCard]; - unset($mutations[$meCard]); - - if ($value instanceof DAV\Property\IHref) { - $value = $value->getHref(); - $value = $this->server->calculateUri($value); - } elseif (!is_null($value)) { - $result[400][$meCard] = null; - return false; - } - - $innerResult = $this->server->updateProperties( - $node->getOwner(), - array( - '{http://sabredav.org/ns}vcard-url' => $value, - ) - ); - - $closureResult = false; - foreach($innerResult as $status => $props) { - if (is_array($props) && array_key_exists('{http://sabredav.org/ns}vcard-url', $props)) { - $result[$status][$meCard] = null; - $closureResult = ($status>=200 && $status<300); - } - - } - - return $result; - - } - - /** - * This functions handles REPORT requests specific to CardDAV - * - * @param string $reportName - * @param \DOMNode $dom - * @return bool - */ - public function report($reportName,$dom) { - - switch($reportName) { - case '{'.self::NS_CARDDAV.'}addressbook-multiget' : - $this->addressbookMultiGetReport($dom); - return false; - case '{'.self::NS_CARDDAV.'}addressbook-query' : - $this->addressBookQueryReport($dom); - return false; - default : - return; - - } - - - } - - /** - * This function handles the addressbook-multiget REPORT. - * - * This report is used by the client to fetch the content of a series - * of urls. Effectively avoiding a lot of redundant requests. - * - * @param \DOMNode $dom - * @return void - */ - public function addressbookMultiGetReport($dom) { - - $properties = array_keys(DAV\XMLUtil::parseProperties($dom->firstChild)); - - $hrefElems = $dom->getElementsByTagNameNS('urn:DAV','href'); - $propertyList = array(); - - foreach($hrefElems as $elem) { - - $uri = $this->server->calculateUri($elem->nodeValue); - list($propertyList[]) = $this->server->getPropertiesForPath($uri,$properties); - - } - - $prefer = $this->server->getHTTPPRefer(); - - $this->server->httpResponse->sendStatus(207); - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); - $this->server->httpResponse->sendBody($this->server->generateMultiStatus($propertyList, $prefer['return-minimal'])); - - } - - /** - * This method is triggered before a file gets updated with new content. - * - * This plugin uses this method to ensure that Card nodes receive valid - * vcard data. - * - * @param string $path - * @param DAV\IFile $node - * @param resource $data - * @return void - */ - public function beforeWriteContent($path, DAV\IFile $node, &$data) { - - if (!$node instanceof ICard) - return; - - $this->validateVCard($data); - - } - - /** - * This method is triggered before a new file is created. - * - * This plugin uses this method to ensure that Card nodes receive valid - * vcard data. - * - * @param string $path - * @param resource $data - * @param DAV\ICollection $parentNode - * @return void - */ - public function beforeCreateFile($path, &$data, DAV\ICollection $parentNode) { - - if (!$parentNode instanceof IAddressBook) - return; - - $this->validateVCard($data); - - } - - /** - * Checks if the submitted iCalendar data is in fact, valid. - * - * An exception is thrown if it's not. - * - * @param resource|string $data - * @return void - */ - protected function validateVCard(&$data) { - - // If it's a stream, we convert it to a string first. - if (is_resource($data)) { - $data = stream_get_contents($data); - } - - // Converting the data to unicode, if needed. - $data = DAV\StringUtil::ensureUTF8($data); - - try { - - $vobj = VObject\Reader::read($data); - - } catch (VObject\ParseException $e) { - - throw new DAV\Exception\UnsupportedMediaType('This resource only supports valid vcard data. Parse error: ' . $e->getMessage()); - - } - - if ($vobj->name !== 'VCARD') { - throw new DAV\Exception\UnsupportedMediaType('This collection can only support vcard objects.'); - } - - if (!isset($vobj->UID)) { - // No UID in vcards is invalid, but we'll just add it in anyway. - $vobj->add('UID', DAV\UUIDUtil::getUUID()); - $data = $vobj->serialize(); - } - - } - - - /** - * This function handles the addressbook-query REPORT - * - * This report is used by the client to filter an addressbook based on a - * complex query. - * - * @param \DOMNode $dom - * @return void - */ - protected function addressbookQueryReport($dom) { - - $query = new AddressBookQueryParser($dom); - $query->parse(); - - $depth = $this->server->getHTTPDepth(0); - - if ($depth==0) { - $candidateNodes = array( - $this->server->tree->getNodeForPath($this->server->getRequestUri()) - ); - } else { - $candidateNodes = $this->server->tree->getChildren($this->server->getRequestUri()); - } - - $validNodes = array(); - foreach($candidateNodes as $node) { - - if (!$node instanceof ICard) - continue; - - $blob = $node->get(); - if (is_resource($blob)) { - $blob = stream_get_contents($blob); - } - - if (!$this->validateFilters($blob, $query->filters, $query->test)) { - continue; - } - - $validNodes[] = $node; - - if ($query->limit && $query->limit <= count($validNodes)) { - // We hit the maximum number of items, we can stop now. - break; - } - - } - - $result = array(); - foreach($validNodes as $validNode) { - - if ($depth==0) { - $href = $this->server->getRequestUri(); - } else { - $href = $this->server->getRequestUri() . '/' . $validNode->getName(); - } - - list($result[]) = $this->server->getPropertiesForPath($href, $query->requestedProperties, 0); - - } - - $prefer = $this->server->getHTTPPRefer(); - - $this->server->httpResponse->sendStatus(207); - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); - $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result, $prefer['return-minimal'])); - - } - - /** - * Validates if a vcard makes it throught a list of filters. - * - * @param string $vcardData - * @param array $filters - * @param string $test anyof or allof (which means OR or AND) - * @return bool - */ - public function validateFilters($vcardData, array $filters, $test) { - - $vcard = VObject\Reader::read($vcardData); - - if (!$filters) return true; - - foreach($filters as $filter) { - - $isDefined = isset($vcard->{$filter['name']}); - if ($filter['is-not-defined']) { - if ($isDefined) { - $success = false; - } else { - $success = true; - } - } elseif ((!$filter['param-filters'] && !$filter['text-matches']) || !$isDefined) { - - // We only need to check for existence - $success = $isDefined; - - } else { - - $vProperties = $vcard->select($filter['name']); - - $results = array(); - if ($filter['param-filters']) { - $results[] = $this->validateParamFilters($vProperties, $filter['param-filters'], $filter['test']); - } - if ($filter['text-matches']) { - $texts = array(); - foreach($vProperties as $vProperty) - $texts[] = $vProperty->getValue(); - - $results[] = $this->validateTextMatches($texts, $filter['text-matches'], $filter['test']); - } - - if (count($results)===1) { - $success = $results[0]; - } else { - if ($filter['test'] === 'anyof') { - $success = $results[0] || $results[1]; - } else { - $success = $results[0] && $results[1]; - } - } - - } // else - - // There are two conditions where we can already determine whether - // or not this filter succeeds. - if ($test==='anyof' && $success) { - return true; - } - if ($test==='allof' && !$success) { - return false; - } - - } // foreach - - // If we got all the way here, it means we haven't been able to - // determine early if the test failed or not. - // - // This implies for 'anyof' that the test failed, and for 'allof' that - // we succeeded. Sounds weird, but makes sense. - return $test==='allof'; - - } - - /** - * Validates if a param-filter can be applied to a specific property. - * - * @todo currently we're only validating the first parameter of the passed - * property. Any subsequence parameters with the same name are - * ignored. - * @param array $vProperties - * @param array $filters - * @param string $test - * @return bool - */ - protected function validateParamFilters(array $vProperties, array $filters, $test) { - - foreach($filters as $filter) { - - $isDefined = false; - foreach($vProperties as $vProperty) { - $isDefined = isset($vProperty[$filter['name']]); - if ($isDefined) break; - } - - if ($filter['is-not-defined']) { - if ($isDefined) { - $success = false; - } else { - $success = true; - } - - // If there's no text-match, we can just check for existence - } elseif (!$filter['text-match'] || !$isDefined) { - - $success = $isDefined; - - } else { - - $success = false; - foreach($vProperties as $vProperty) { - // If we got all the way here, we'll need to validate the - // text-match filter. - $success = DAV\StringUtil::textMatch($vProperty[$filter['name']]->getValue(), $filter['text-match']['value'], $filter['text-match']['collation'], $filter['text-match']['match-type']); - if ($success) break; - } - if ($filter['text-match']['negate-condition']) { - $success = !$success; - } - - } // else - - // There are two conditions where we can already determine whether - // or not this filter succeeds. - if ($test==='anyof' && $success) { - return true; - } - if ($test==='allof' && !$success) { - return false; - } - - } - - // If we got all the way here, it means we haven't been able to - // determine early if the test failed or not. - // - // This implies for 'anyof' that the test failed, and for 'allof' that - // we succeeded. Sounds weird, but makes sense. - return $test==='allof'; - - } - - /** - * Validates if a text-filter can be applied to a specific property. - * - * @param array $texts - * @param array $filters - * @param string $test - * @return bool - */ - protected function validateTextMatches(array $texts, array $filters, $test) { - - foreach($filters as $filter) { - - $success = false; - foreach($texts as $haystack) { - $success = DAV\StringUtil::textMatch($haystack, $filter['value'], $filter['collation'], $filter['match-type']); - - // Breaking on the first match - if ($success) break; - } - if ($filter['negate-condition']) { - $success = !$success; - } - - if ($success && $test==='anyof') - return true; - - if (!$success && $test=='allof') - return false; - - - } - - // If we got all the way here, it means we haven't been able to - // determine early if the test failed or not. - // - // This implies for 'anyof' that the test failed, and for 'allof' that - // we succeeded. Sounds weird, but makes sense. - return $test==='allof'; - - } - - /** - * This event is triggered after webdav-properties have been retrieved. - * - * @return bool - */ - public function afterGetProperties($uri, &$properties) { - - // If the request was made using the SOGO connector, we must rewrite - // the content-type property. By default SabreDAV will send back - // text/x-vcard; charset=utf-8, but for SOGO we must strip that last - // part. - if (!isset($properties[200]['{DAV:}getcontenttype'])) - return; - - if (strpos($this->server->httpRequest->getHeader('User-Agent'),'Thunderbird')===false) { - return; - } - - if (strpos($properties[200]['{DAV:}getcontenttype'],'text/x-vcard')===0) { - $properties[200]['{DAV:}getcontenttype'] = 'text/x-vcard'; - } - - } - - /** - * This method is used to generate HTML output for the - * SabreForRainLoop\DAV\Browser\Plugin. This allows us to generate an interface users - * can use to create new calendars. - * - * @param DAV\INode $node - * @param string $output - * @return bool - */ - public function htmlActionsPanel(DAV\INode $node, &$output) { - - if (!$node instanceof UserAddressBooks) - return; - - $output.= '
-

Create new address book

- -
-
- -
- '; - - return false; - - } - - /** - * This method allows us to intercept the 'mkcalendar' sabreAction. This - * action enables the user to create new calendars from the browser plugin. - * - * @param string $uri - * @param string $action - * @param array $postVars - * @return bool - */ - public function browserPostAction($uri, $action, array $postVars) { - - if ($action!=='mkaddressbook') - return; - - $resourceType = array('{DAV:}collection','{urn:ietf:params:xml:ns:carddav}addressbook'); - $properties = array(); - if (isset($postVars['{DAV:}displayname'])) { - $properties['{DAV:}displayname'] = $postVars['{DAV:}displayname']; - } - $this->server->createCollection($uri . '/' . $postVars['name'],$resourceType,$properties); - return false; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Property/SupportedAddressData.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Property/SupportedAddressData.php deleted file mode 100755 index 084c06f3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Property/SupportedAddressData.php +++ /dev/null @@ -1,72 +0,0 @@ - 'text/vcard', 'version' => '3.0'), - // array('contentType' => 'text/vcard', 'version' => '4.0'), - ); - } - - $this->supportedData = $supportedData; - - } - - /** - * Serializes the property in a DOMDocument - * - * @param DAV\Server $server - * @param \DOMElement $node - * @return void - */ - public function serialize(DAV\Server $server,\DOMElement $node) { - - $doc = $node->ownerDocument; - - $prefix = - isset($server->xmlNamespaces[CardDAV\Plugin::NS_CARDDAV]) ? - $server->xmlNamespaces[CardDAV\Plugin::NS_CARDDAV] : - 'card'; - - foreach($this->supportedData as $supported) { - - $caldata = $doc->createElementNS(CardDAV\Plugin::NS_CARDDAV, $prefix . ':address-data-type'); - $caldata->setAttribute('content-type',$supported['contentType']); - $caldata->setAttribute('version',$supported['version']); - $node->appendChild($caldata); - - } - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/UserAddressBooks.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/UserAddressBooks.php deleted file mode 100755 index 0970fe3d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/UserAddressBooks.php +++ /dev/null @@ -1,260 +0,0 @@ -carddavBackend = $carddavBackend; - $this->principalUri = $principalUri; - - } - - /** - * Returns the name of this object - * - * @return string - */ - public function getName() { - - list(,$name) = DAV\URLUtil::splitPath($this->principalUri); - return $name; - - } - - /** - * Updates the name of this object - * - * @param string $name - * @return void - */ - public function setName($name) { - - throw new DAV\Exception\MethodNotAllowed(); - - } - - /** - * Deletes this object - * - * @return void - */ - public function delete() { - - throw new DAV\Exception\MethodNotAllowed(); - - } - - /** - * Returns the last modification date - * - * @return int - */ - public function getLastModified() { - - return null; - - } - - /** - * Creates a new file under this object. - * - * This is currently not allowed - * - * @param string $filename - * @param resource $data - * @return void - */ - public function createFile($filename, $data=null) { - - throw new DAV\Exception\MethodNotAllowed('Creating new files in this collection is not supported'); - - } - - /** - * Creates a new directory under this object. - * - * This is currently not allowed. - * - * @param string $filename - * @return void - */ - public function createDirectory($filename) { - - throw new DAV\Exception\MethodNotAllowed('Creating new collections in this collection is not supported'); - - } - - /** - * Returns a single calendar, by name - * - * @param string $name - * @todo needs optimizing - * @return \AddressBook - */ - public function getChild($name) { - - foreach($this->getChildren() as $child) { - if ($name==$child->getName()) - return $child; - - } - throw new DAV\Exception\NotFound('Addressbook with name \'' . $name . '\' could not be found'); - - } - - /** - * Returns a list of addressbooks - * - * @return array - */ - public function getChildren() { - - $addressbooks = $this->carddavBackend->getAddressbooksForUser($this->principalUri); - $objs = array(); - foreach($addressbooks as $addressbook) { - $objs[] = new AddressBook($this->carddavBackend, $addressbook); - } - return $objs; - - } - - /** - * Creates a new addressbook - * - * @param string $name - * @param array $resourceType - * @param array $properties - * @return void - */ - public function createExtendedCollection($name, array $resourceType, array $properties) { - - if (!in_array('{'.Plugin::NS_CARDDAV.'}addressbook',$resourceType) || count($resourceType)!==2) { - throw new DAV\Exception\InvalidResourceType('Unknown resourceType for this collection'); - } - $this->carddavBackend->createAddressBook($this->principalUri, $name, $properties); - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->principalUri; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->principalUri, - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->principalUri, - 'protected' => true, - ), - - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported'); - - } - - /** - * Returns the list of supported privileges for this node. - * - * The returned data structure is a list of nested privileges. - * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple - * standard structure. - * - * If null is returned from this method, the default privilege set is used, - * which is fine for most common usecases. - * - * @return array|null - */ - public function getSupportedPrivilegeSet() { - - return null; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/VCFExportPlugin.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/VCFExportPlugin.php deleted file mode 100755 index 081bdd22..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/VCFExportPlugin.php +++ /dev/null @@ -1,108 +0,0 @@ -server = $server; - $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90); - - } - - /** - * 'beforeMethod' event handles. This event handles intercepts GET requests ending - * with ?export - * - * @param string $method - * @param string $uri - * @return bool - */ - public function beforeMethod($method, $uri) { - - if ($method!='GET') return; - if ($this->server->httpRequest->getQueryString()!='export') return; - - // splitting uri - list($uri) = explode('?',$uri,2); - - $node = $this->server->tree->getNodeForPath($uri); - - if (!($node instanceof IAddressBook)) return; - - // Checking ACL, if available. - if ($aclPlugin = $this->server->getPlugin('acl')) { - $aclPlugin->checkPrivileges($uri, '{DAV:}read'); - } - - $this->server->httpResponse->setHeader('Content-Type','text/directory'); - $this->server->httpResponse->sendStatus(200); - - $nodes = $this->server->getPropertiesForPath($uri, array( - '{' . Plugin::NS_CARDDAV . '}address-data', - ),1); - - $this->server->httpResponse->sendBody($this->generateVCF($nodes)); - - // Returning false to break the event chain - return false; - - } - - /** - * Merges all vcard objects, and builds one big vcf export - * - * @param array $nodes - * @return string - */ - public function generateVCF(array $nodes) { - - $output = ""; - - foreach($nodes as $node) { - - if (!isset($node[200]['{' . Plugin::NS_CARDDAV . '}address-data'])) { - continue; - } - $nodeData = $node[200]['{' . Plugin::NS_CARDDAV . '}address-data']; - - // Parsing this node so VObject can clean up the output. - $output .= - VObject\Reader::read($nodeData)->serialize(); - - } - - return $output; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Version.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Version.php deleted file mode 100755 index d3ce9816..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/CardDAV/Version.php +++ /dev/null @@ -1,26 +0,0 @@ -currentUser; - } - - - /** - * Authenticates the user based on the current request. - * - * If authentication is successful, true must be returned. - * If authentication fails, an exception must be thrown. - * - * @param DAV\Server $server - * @param string $realm - * @throws DAV\Exception\NotAuthenticated - * @return bool - */ - public function authenticate(DAV\Server $server, $realm) { - - $auth = new HTTP\BasicAuth(); - $auth->setHTTPRequest($server->httpRequest); - $auth->setHTTPResponse($server->httpResponse); - $auth->setRealm($realm); - $userpass = $auth->getUserPass(); - if (!$userpass) { - $auth->requireLogin(); - throw new DAV\Exception\NotAuthenticated('No basic authentication headers were found'); - } - - // Authenticates the user - if (!$this->validateUserPass($userpass[0],$userpass[1])) { - $auth->requireLogin(); - throw new DAV\Exception\NotAuthenticated('Username or password does not match'); - } - $this->currentUser = $userpass[0]; - return true; - } - - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/AbstractDigest.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/AbstractDigest.php deleted file mode 100755 index ca642c6c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/AbstractDigest.php +++ /dev/null @@ -1,101 +0,0 @@ -setHTTPRequest($server->httpRequest); - $digest->setHTTPResponse($server->httpResponse); - - $digest->setRealm($realm); - $digest->init(); - - $username = $digest->getUsername(); - - // No username was given - if (!$username) { - $digest->requireLogin(); - throw new DAV\Exception\NotAuthenticated('No digest authentication headers were found'); - } - - $hash = $this->getDigestHash($realm, $username); - // If this was false, the user account didn't exist - if ($hash===false || is_null($hash)) { - $digest->requireLogin(); - throw new DAV\Exception\NotAuthenticated('The supplied username was not on file'); - } - if (!is_string($hash)) { - throw new DAV\Exception('The returned value from getDigestHash must be a string or null'); - } - - // If this was false, the password or part of the hash was incorrect. - if (!$digest->validateA1($hash)) { - $digest->requireLogin(); - throw new DAV\Exception\NotAuthenticated('Incorrect username'); - } - - $this->currentUser = $username; - return true; - - } - - /** - * Returns the currently logged in username. - * - * @return string|null - */ - public function getCurrentUser() { - - return $this->currentUser; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/Apache.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/Apache.php deleted file mode 100755 index be19a681..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/Apache.php +++ /dev/null @@ -1,63 +0,0 @@ -httpRequest->getRawServerValue('REMOTE_USER'); - if (is_null($remoteUser)) { - throw new DAV\Exception('We did not receive the $_SERVER[REMOTE_USER] property. This means that apache might have been misconfigured'); - } - - $this->remoteUser = $remoteUser; - return true; - - } - - /** - * Returns information about the currently logged in user. - * - * If nobody is currently logged in, this method should return null. - * - * @return array|null - */ - public function getCurrentUser() { - - return $this->remoteUser; - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/BackendInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/BackendInterface.php deleted file mode 100755 index 1193489d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/BackendInterface.php +++ /dev/null @@ -1,36 +0,0 @@ -loadFile($filename); - - } - - /** - * Loads an htdigest-formatted file. This method can be called multiple times if - * more than 1 file is used. - * - * @param string $filename - * @return void - */ - public function loadFile($filename) { - - foreach(file($filename,FILE_IGNORE_NEW_LINES) as $line) { - - if (substr_count($line, ":") !== 2) - throw new DAV\Exception('Malformed htdigest file. Every line should contain 2 colons'); - - list($username,$realm,$A1) = explode(':',$line); - - if (!preg_match('/^[a-zA-Z0-9]{32}$/', $A1)) - throw new DAV\Exception('Malformed htdigest file. Invalid md5 hash'); - - $this->users[$realm . ':' . $username] = $A1; - - } - - } - - /** - * Returns a users' information - * - * @param string $realm - * @param string $username - * @return string - */ - public function getDigestHash($realm, $username) { - - return isset($this->users[$realm . ':' . $username])?$this->users[$realm . ':' . $username]:false; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/PDO.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/PDO.php deleted file mode 100755 index 7e8e31d6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/PDO.php +++ /dev/null @@ -1,65 +0,0 @@ -pdo = $pdo; - $this->tableName = $tableName; - - } - - /** - * Returns the digest hash for a user. - * - * @param string $realm - * @param string $username - * @return string|null - */ - public function getDigestHash($realm,$username) { - - $stmt = $this->pdo->prepare('SELECT username, digesta1 FROM '.$this->tableName.' WHERE username = ?'); - $stmt->execute(array($username)); - $result = $stmt->fetchAll(); - - if (!count($result)) return; - - return $result[0]['digesta1']; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Plugin.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Plugin.php deleted file mode 100755 index ade6a5f7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Auth/Plugin.php +++ /dev/null @@ -1,112 +0,0 @@ -authBackend = $authBackend; - $this->realm = $realm; - - } - - /** - * Initializes the plugin. This function is automatically called by the server - * - * @param DAV\Server $server - * @return void - */ - public function initialize(DAV\Server $server) { - - $this->server = $server; - $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'),10); - - } - - /** - * Returns a plugin name. - * - * Using this name other plugins will be able to access other plugins - * using DAV\Server::getPlugin - * - * @return string - */ - public function getPluginName() { - - return 'auth'; - - } - - /** - * Returns the current users' principal uri. - * - * If nobody is logged in, this will return null. - * - * @return string|null - */ - public function getCurrentUser() { - - $userInfo = $this->authBackend->getCurrentUser(); - if (!$userInfo) return null; - - return $userInfo; - - } - - /** - * This method is called before any HTTP method and forces users to be authenticated - * - * @param string $method - * @param string $uri - * @throws SabreForRainLoop\DAV\Exception\NotAuthenticated - * @return bool - */ - public function beforeMethod($method, $uri) { - - $this->authBackend->authenticate($this->server,$this->realm); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/GuessContentType.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/GuessContentType.php deleted file mode 100755 index c787fdda..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/GuessContentType.php +++ /dev/null @@ -1,99 +0,0 @@ - 'image/jpeg', - 'gif' => 'image/gif', - 'png' => 'image/png', - - // groupware - 'ics' => 'text/calendar', - 'vcf' => 'text/x-vcard', - - // text - 'txt' => 'text/plain', - - ); - - /** - * Initializes the plugin - * - * @param DAV\Server $server - * @return void - */ - public function initialize(DAV\Server $server) { - - // Using a relatively low priority (200) to allow other extensions - // to set the content-type first. - $server->subscribeEvent('afterGetProperties',array($this,'afterGetProperties'),200); - - } - - /** - * Handler for teh afterGetProperties event - * - * @param string $path - * @param array $properties - * @return void - */ - public function afterGetProperties($path, &$properties) { - - if (array_key_exists('{DAV:}getcontenttype', $properties[404])) { - - list(, $fileName) = DAV\URLUtil::splitPath($path); - $contentType = $this->getContentType($fileName); - - if ($contentType) { - $properties[200]['{DAV:}getcontenttype'] = $contentType; - unset($properties[404]['{DAV:}getcontenttype']); - } - - } - - } - - /** - * Simple method to return the contenttype - * - * @param string $fileName - * @return string - */ - protected function getContentType($fileName) { - - // Just grabbing the extension - $extension = strtolower(substr($fileName,strrpos($fileName,'.')+1)); - if (isset($this->extensionMap[$extension])) - return $this->extensionMap[$extension]; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/MapGetToPropFind.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/MapGetToPropFind.php deleted file mode 100755 index 3792252b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/MapGetToPropFind.php +++ /dev/null @@ -1,57 +0,0 @@ -server = $server; - $this->server->subscribeEvent('beforeMethod',array($this,'httpGetInterceptor')); - } - - /** - * This method intercepts GET requests to non-files, and changes it into an HTTP PROPFIND request - * - * @param string $method - * @param string $uri - * @return bool - */ - public function httpGetInterceptor($method, $uri) { - - if ($method!='GET') return true; - - $node = $this->server->tree->getNodeForPath($uri); - if ($node instanceof DAV\IFile) return; - - $this->server->invokeMethod('PROPFIND',$uri); - return false; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/Plugin.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/Plugin.php deleted file mode 100755 index d19ba58e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/Plugin.php +++ /dev/null @@ -1,491 +0,0 @@ - 'icons/file', - 'SabreForRainLoop\\DAV\\ICollection' => 'icons/collection', - 'SabreForRainLoop\\DAVACL\\IPrincipal' => 'icons/principal', - 'SabreForRainLoop\\CalDAV\\ICalendar' => 'icons/calendar', - 'SabreForRainLoop\\CardDAV\\IAddressBook' => 'icons/addressbook', - 'SabreForRainLoop\\CardDAV\\ICard' => 'icons/card', - ); - - /** - * The file extension used for all icons - * - * @var string - */ - public $iconExtension = '.png'; - - /** - * reference to server class - * - * @var SabreForRainLoop\DAV\Server - */ - protected $server; - - /** - * enablePost turns on the 'actions' panel, which allows people to create - * folders and upload files straight from a browser. - * - * @var bool - */ - protected $enablePost = true; - - /** - * By default the browser plugin will generate a favicon and other images. - * To turn this off, set this property to false. - * - * @var bool - */ - protected $enableAssets = true; - - /** - * Creates the object. - * - * By default it will allow file creation and uploads. - * Specify the first argument as false to disable this - * - * @param bool $enablePost - * @param bool $enableAssets - */ - public function __construct($enablePost=true, $enableAssets = true) { - - $this->enablePost = $enablePost; - $this->enableAssets = $enableAssets; - - } - - /** - * Initializes the plugin and subscribes to events - * - * @param DAV\Server $server - * @return void - */ - public function initialize(DAV\Server $server) { - - $this->server = $server; - $this->server->subscribeEvent('beforeMethod',array($this,'httpGetInterceptor')); - $this->server->subscribeEvent('onHTMLActionsPanel', array($this, 'htmlActionsPanel'),200); - if ($this->enablePost) $this->server->subscribeEvent('unknownMethod',array($this,'httpPOSTHandler')); - } - - /** - * This method intercepts GET requests to collections and returns the html - * - * @param string $method - * @param string $uri - * @return bool - */ - public function httpGetInterceptor($method, $uri) { - - if ($method !== 'GET') return true; - - // We're not using straight-up $_GET, because we want everything to be - // unit testable. - $getVars = array(); - parse_str($this->server->httpRequest->getQueryString(), $getVars); - - if (isset($getVars['sabreAction']) && $getVars['sabreAction'] === 'asset' && isset($getVars['assetName'])) { - $this->serveAsset($getVars['assetName']); - return false; - } - - try { - $node = $this->server->tree->getNodeForPath($uri); - } catch (DAV\Exception\NotFound $e) { - // We're simply stopping when the file isn't found to not interfere - // with other plugins. - return; - } - if ($node instanceof DAV\IFile) - return; - - $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->setHeader('Content-Type','text/html; charset=utf-8'); - - $this->server->httpResponse->sendBody( - $this->generateDirectoryIndex($uri) - ); - - return false; - - } - - /** - * Handles POST requests for tree operations. - * - * @param string $method - * @param string $uri - * @return bool - */ - public function httpPOSTHandler($method, $uri) { - - if ($method!='POST') return; - $contentType = $this->server->httpRequest->getHeader('Content-Type'); - list($contentType) = explode(';', $contentType); - if ($contentType !== 'application/x-www-form-urlencoded' && - $contentType !== 'multipart/form-data') { - return; - } - $postVars = $this->server->httpRequest->getPostVars(); - - if (!isset($postVars['sabreAction'])) - return; - - if ($this->server->broadcastEvent('onBrowserPostAction', array($uri, $postVars['sabreAction'], $postVars))) { - - switch($postVars['sabreAction']) { - - case 'mkcol' : - if (isset($postVars['name']) && trim($postVars['name'])) { - // Using basename() because we won't allow slashes - list(, $folderName) = DAV\URLUtil::splitPath(trim($postVars['name'])); - $this->server->createDirectory($uri . '/' . $folderName); - } - break; - case 'put' : - if ($_FILES) $file = current($_FILES); - else break; - - list(, $newName) = DAV\URLUtil::splitPath(trim($file['name'])); - if (isset($postVars['name']) && trim($postVars['name'])) - $newName = trim($postVars['name']); - - // Making sure we only have a 'basename' component - list(, $newName) = DAV\URLUtil::splitPath($newName); - - if (is_uploaded_file($file['tmp_name'])) { - $this->server->createFile($uri . '/' . $newName, fopen($file['tmp_name'],'r')); - } - break; - - } - - } - $this->server->httpResponse->setHeader('Location',$this->server->httpRequest->getUri()); - $this->server->httpResponse->sendStatus(302); - return false; - - } - - /** - * Escapes a string for html. - * - * @param string $value - * @return string - */ - public function escapeHTML($value) { - - return htmlspecialchars($value,ENT_QUOTES,'UTF-8'); - - } - - /** - * Generates the html directory index for a given url - * - * @param string $path - * @return string - */ - public function generateDirectoryIndex($path) { - - $version = ''; - if (DAV\Server::$exposeVersion) { - $version = DAV\Version::VERSION ."-". DAV\Version::STABILITY; - } - - $html = " - - Index for " . $this->escapeHTML($path) . "/ - SabreDAV " . $version . " - - "; - - if ($this->enableAssets) { - $html.=''; - } - - $html .= " - -

Index for " . $this->escapeHTML($path) . "/

- - - "; - - $files = $this->server->getPropertiesForPath($path,array( - '{DAV:}displayname', - '{DAV:}resourcetype', - '{DAV:}getcontenttype', - '{DAV:}getcontentlength', - '{DAV:}getlastmodified', - ),1); - - $parent = $this->server->tree->getNodeForPath($path); - - - if ($path) { - - list($parentUri) = DAV\URLUtil::splitPath($path); - $fullPath = DAV\URLUtil::encodePath($this->server->getBaseUri() . $parentUri); - - $icon = $this->enableAssets?'Parent':''; - $html.= " - - - - - - "; - - } - - foreach($files as $file) { - - // This is the current directory, we can skip it - if (rtrim($file['href'],'/')==$path) continue; - - list(, $name) = DAV\URLUtil::splitPath($file['href']); - - $type = null; - - - if (isset($file[200]['{DAV:}resourcetype'])) { - $type = $file[200]['{DAV:}resourcetype']->getValue(); - - // resourcetype can have multiple values - if (!is_array($type)) $type = array($type); - - foreach($type as $k=>$v) { - - // Some name mapping is preferred - switch($v) { - case '{DAV:}collection' : - $type[$k] = 'Collection'; - break; - case '{DAV:}principal' : - $type[$k] = 'Principal'; - break; - case '{urn:ietf:params:xml:ns:carddav}addressbook' : - $type[$k] = 'Addressbook'; - break; - case '{urn:ietf:params:xml:ns:caldav}calendar' : - $type[$k] = 'Calendar'; - break; - case '{urn:ietf:params:xml:ns:caldav}schedule-inbox' : - $type[$k] = 'Schedule Inbox'; - break; - case '{urn:ietf:params:xml:ns:caldav}schedule-outbox' : - $type[$k] = 'Schedule Outbox'; - break; - case '{http://calendarserver.org/ns/}calendar-proxy-read' : - $type[$k] = 'Proxy-Read'; - break; - case '{http://calendarserver.org/ns/}calendar-proxy-write' : - $type[$k] = 'Proxy-Write'; - break; - } - - } - $type = implode(', ', $type); - } - - // If no resourcetype was found, we attempt to use - // the contenttype property - if (!$type && isset($file[200]['{DAV:}getcontenttype'])) { - $type = $file[200]['{DAV:}getcontenttype']; - } - if (!$type) $type = 'Unknown'; - - $size = isset($file[200]['{DAV:}getcontentlength'])?(int)$file[200]['{DAV:}getcontentlength']:''; - $lastmodified = isset($file[200]['{DAV:}getlastmodified'])?$file[200]['{DAV:}getlastmodified']->getTime()->format(\DateTime::ATOM):''; - - $fullPath = DAV\URLUtil::encodePath('/' . trim($this->server->getBaseUri() . ($path?$path . '/':'') . $name,'/')); - - $displayName = isset($file[200]['{DAV:}displayname'])?$file[200]['{DAV:}displayname']:$name; - - $displayName = $this->escapeHTML($displayName); - $type = $this->escapeHTML($type); - - $icon = ''; - - if ($this->enableAssets) { - $node = $this->server->tree->getNodeForPath(($path?$path.'/':'') . $name); - foreach(array_reverse($this->iconMap) as $class=>$iconName) { - - if ($node instanceof $class) { - $icon = ''; - break; - } - - - } - - } - - $html.= " - - - - - - "; - - } - - $html.= ""; - - $output = ''; - - if ($this->enablePost) { - $this->server->broadcastEvent('onHTMLActionsPanel',array($parent, &$output)); - } - - $html.=$output; - - $html.= "
NameTypeSizeLast modified

$icon..[parent]
$icon{$displayName}{$type}{$size}{$lastmodified}

-
Generated by SabreDAV " . $version . " (c)2007-2013 http://code.google.com/p/sabredav/
- - "; - - return $html; - - } - - /** - * This method is used to generate the 'actions panel' output for - * collections. - * - * This specifically generates the interfaces for creating new files, and - * creating new directories. - * - * @param DAV\INode $node - * @param mixed $output - * @return void - */ - public function htmlActionsPanel(DAV\INode $node, &$output) { - - if (!$node instanceof DAV\ICollection) - return; - - // We also know fairly certain that if an object is a non-extended - // SimpleCollection, we won't need to show the panel either. - if (get_class($node)==='SabreForRainLoop\\DAV\\SimpleCollection') - return; - - $output.= '
-

Create new folder

- - Name:
- -
-
-

Upload file

- - Name (optional):
- File:
- -
- '; - - } - - /** - * This method takes a path/name of an asset and turns it into url - * suiteable for http access. - * - * @param string $assetName - * @return string - */ - protected function getAssetUrl($assetName) { - - return $this->server->getBaseUri() . '?sabreAction=asset&assetName=' . urlencode($assetName); - - } - - /** - * This method returns a local pathname to an asset. - * - * @param string $assetName - * @return string - */ - protected function getLocalAssetPath($assetName) { - - $assetDir = __DIR__ . '/assets/'; - $path = $assetDir . $assetName; - - // Making sure people aren't trying to escape from the base path. - if (strpos(realpath($path), realpath($assetDir)) === 0) { - return $path; - } - throw new DAV\Exception\Forbidden('Path does not exist, or escaping from the base path was detected'); - } - - /** - * This method reads an asset from disk and generates a full http response. - * - * @param string $assetName - * @return void - */ - protected function serveAsset($assetName) { - - $assetPath = $this->getLocalAssetPath($assetName); - if (!file_exists($assetPath)) { - throw new DAV\Exception\NotFound('Could not find an asset with this name'); - } - // Rudimentary mime type detection - switch(strtolower(substr($assetPath,strpos($assetPath,'.')+1))) { - - case 'ico' : - $mime = 'image/vnd.microsoft.icon'; - break; - - case 'png' : - $mime = 'image/png'; - break; - - default: - $mime = 'application/octet-stream'; - break; - - } - - $this->server->httpResponse->setHeader('Content-Type', $mime); - $this->server->httpResponse->setHeader('Content-Length', filesize($assetPath)); - $this->server->httpResponse->setHeader('Cache-Control', 'public, max-age=1209600'); - $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->sendBody(fopen($assetPath,'r')); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/favicon.ico b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/favicon.ico deleted file mode 100755 index 2b2c10a22cc7a57c4dc5d7156f184448f2bee92b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmc&&O-NKx6uz%14NNBzA}E}JHil3^6a|4&P_&6!RGSD}1rgCAC@`9dTC_@vqNoT8 z0%;dQR0K_{iUM;bf#3*%o1h^C2N7@IH_nmc?Va~t5U6~f`_BE&`Of`&_n~tUev3uN zziw!)bL*XR-2hy!51_yCgT8fb3s`VC=e=KcI5&)PGGQlpSAh?}1mK&Pg8c>z0Y`y$ zAT_6qJ%yV?|0!S$5WO@z3+`QD17OyXL4PyiM}RavtA7Tu7p)pn^p7Ks@m6m7)A}X$ z4Y+@;NrHYq_;V@RoZ|;69MPx!46Ftg*Tc~711C+J`JMuUfYwNBzXPB9sZm3WK9272 z&x|>@f_EO{b3cubqjOyc~J3I$d_lHIpN}q z!{kjX{c{12XF=~Z$w$kazXHB!b53>u!rx}_$e&dD`xNgv+MR&p2yN1xb0>&9t@28Z zV&5u#j_D=P9mI#){2s8@eGGj(?>gooo<%RT14>`VSZ&_l6GlGnan=^bemD56rRN{? zSAqZD$i;oS9SF6#f5I`#^C&hW@13s_lc3LUl(PWmHcop2{vr^kO`kP(*4!m=3Hn3e#Oc!a2;iDn+FbXzcOHEQ zbXZ)u93cj1WA=KS+M>jZ=oYyXq}1?ZdsjsX0A zkJXCvi~cfO@2ffd7r^;>=SsL-3U%l5HRoEZ#0r%`7%&% ziLTXJqU*JeXt3H5`AS#h(dpfl+`Ox|)*~QS%h&VO!d#)!>r3U5_YsDi2fY6Sd&vw% diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/addressbook.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/addressbook.png deleted file mode 100755 index c9acc84172dad59708b6b298b310b8d29eeeb671..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7232 zcmeHMXH=70vktu%m8u{iNEJu|p@k-dEbh;oQp! z004N*&5Ug6PsrAvofQCJ0J8kPi!O*#jGZWUL@!DZii8CiV2GYrpt(N^hqc9`Fu^B& z$Li3XlkoOV6epx598L6BMs3+BQ~d+z-T;7(J~aS^_Qg_wo>&~7pbMI-s0IP?7+sK~ z8WMsGKw!P`W~WG4yHi&7=u^IEEeuFsk5h*Vrvvz7DJUS--;Y3sQ*}YxxN!P<>ophz z+%}>3>Vm!{<%F~bB8Vg`5T>l6tfGX5sH+0iRFzfLRMb^qia-?zL=z0r0INcjpqg-q z8XN`%e*b~=IDtAOj2GP2$mDxCx}*#8rceUlU~o`SkaCc!GLeJ>L$$QDzz`L%ii#55 zLWvwqprEKq1hUi?#5W8hEE!G02T<@t0&oixr=z>6WJ@7j?2K@s&Aduv@jf_Eq zv3^*8EP+A>LzSW6o%VDlZ1Fg63i*c{f&86iI^SR_DuC_+0h6|E{^l9rO{5UX-o$`^ z_WYsV_TL%OJb;3R(c^9r`oovLEA)1 zN5s+d$KcTvEQUfv6TQ5!SY-@$JAofL!3_c_-b51Fnn=cPu}SA}i)5e<1`YqV)ot+` z>jr+5Z_+o>55Gk<+z&;->4K&f4Xf4 z*@?Opg@UK}VRyv%Go$a__mho-f4Ygk@O1vF+EFt7eA{D5{^b9!NI%8a+1W>M#5WER zMEbcxQ_Klo#O-7AcN@F`hGa~opfIFAkJbOyBk+{qpKERDlW4o4eu8d|CSvGq|Ls8h z12~2BGjMyXpCge(pGp7dYwVB0|0n%X(x2Mxf_>}29Rr14jc@PhgNi;Q!9RxNw=(VM z?f=Sho2~x}@($2{gX|#V*UNwD`ZY&8EdHfy2N}O!{!7=dIoe_IFI_vx`1SH%x_-^k z4vYUp7w2EsEG&V3w+f&Lv``pA3oHbg@?#%M;1t1p-E2-|c|#H-_R1@JzcNBq&XcTyD{j<6UEo zI0B^10yQ<)ne~ii-I(2&&uI#3*c>cE#4F`4kjf9Yf_ZrA9}M*e%!^mAR}E$zo9Zu3 zORdt;YtL*^N_oifn?F+u*|JG0gxkI3G?lUOvJIf`xLe&LM~@;G2ok9*GlYr@Go9q^ zEz`#}@G`i`7&#X(r(J-?mH-)D<>Cgao26JlhL$0DkE{zbmf-K(&|l=DD*83q#uQGU zBfS~GLtVKIm&%cnvH3DXpH6YX+nd@SWMv({*9pmf$($M!medu{2S+`*XCh6t-wjlCNsFC~wA ztcbPif81a*Yr3ti?%Lg-nYeKf;M-OF)`;J@?PY=n6fA4v!4Y!-RK&GE!e|%E#rOE^ zoFOK;>>L^svjrm2h{sHx(ZWK2#aNC-Iyotq$HA~D8yWs;GH{Czl&W$vSX9co>CY_Jx^p$*HJ(W=11 z2PK+Q^PIpqE{Q$`e^qZ}9+2ghQRIQ~E)V}@K_6kS`C%KoxHO#-#55!NTr9BH z$Gf;zV1y&|YokQx-X0?N;CZI65bn4U4me(v9v zt~$4NQ0?3rdSimd1&!>(WtET&)ww0Fc3t+>j11iq;<6g?d`;6m(?o-v--hwhsT@)D z0tIfwG=F`%g`|b}Fj5F8rtn%b=Q*N4c476cdco@zbJ{%maeVAa3Aft*j9lATg{8YasCtKb*)A6 z&p)mOy?*~>Rz>8ALTwmBci{43pegY-Rz z@eqaDI>U++PdYkRyrs|SG9%{4tSuE@XNM|3erf14y>^dbo%`=<#-XIL;5_gIA^7h8{BBuh8QFCLWCMz zjybw8t#D>`diqPK?x2S16YVFy=Uha*f^b!zgR4JJ1ZT}vGx=G3Onb-tVMfdR7D0dD z`glZQZoz|4cc%WQut~kEYa)eZXSH#>_lm0s76*KCRHhC+4HUTh7P+wZx$aU#-1PwD zSw(J?U7Ia5Q(8A&im4#q-#hZkl`FX)bHqF}g8`PDLh%P9%#Y3|7lfHZ&tmX5;&hWT z<5fx_3!1T4E*<_n0Pc)>)%JSuOcLRfI-%tzZ;gP!lL*7d())_#@^@3z?2K^hXQMez zmDt>^G}ZL42){nsmzQ~bTugJ`1R|Rsv0yNHf_;8B=k-ptG#j-&17x9xZl-tKyA+#6 ztpovzDJU_K53r$#T&zg?0a^a6-O5L(t?|buEi^7SuU@r^ia5%0=)partDxHpgbYVJ zf7*m%AIoR4_ci_L>MqZ+*&Gus1R1Cu%z!(p(e54?)BHFeZReqE|p;9|xOx#=mi9BR2G+bFNE z-l%Yn{d&pegCmMktsLdiG9F(%KkR?98FB?ye>(quR3lC}e?WDi>cbomAm@FBzd$g^ zV;Gwwu)@-|QaU>tzvM-TZ+$#1$T~4m^(w?f*!&T{%)ZSN@d_#2fI@5Rm8uEfOL0E93XfHpv@9<(lpR4mCW=Wvos2vP=RffHC{UD;WbfFVr5`q+#U0o}O{-IJS~eAv(asK`d^)1aHQ ziy$S$GkI8i4v*0tgFSBcLh-pWdJsuP?pNabJmX@Z_2OKk=(*Z@o+mKR5yN;JSh0YO z;_LHf?tcg;o|L=R`eA^auo>D~-ub>gnZ&aogPZNsR-M?G+g#spUS#6M*q%}`oxWOC zeSONjTSg*?%f^N&jiG)pQcJJ-=+ayFwkTSC&8&4Qaq3x))DfvNqQv#nS&JAl^B7b(Tia2WaO$md0D6JDpTV=dCihh zQ4IexnVGqpv4g8h+U=%}z6rv`flBeFYR&i{J@Lk9WM+$=Dcj=aFB+24EdQMu1Z35i3S>ORB({g=d7Sfc(FkLfW`1UO z{)U`pu+|%A1{9(x2s#>kQGEY6mjQOyW35MuUrjoDTz&Cr=j$yJ%f!y>222$-wGR#^ zPN>LNhJplQ3fd3rD)m~H=?JTcNmm6(GWiC#@iqmIk{%gyHD^6lw7tt zhMhcptW>Ps#OeK11)H|fL)fJ|=F`I?@r=te)Adow=3hu^^>w4s zs9r~e!tV^N-`jWDP0kaCJGkt1WnrBrilEV4XHRx~iV?{UMKtsA@Ek2{pXlE0kR$8K zvUgsr*wQ{^erT2u61=e2S;I*CS-d4bT4LYe&2Z2R+NOWD&k|R#};cqIY8^5>EQfcq87f$;c)(zU)I@Er+1@JoG9p za9q{*!gAy(yOu~ku$Py95#Ec`?GJ;Omy3r6Q~g@+Je)1x%Tl~Q%D9&QWWh;Vh-wC- zOV=yUyC*dJXWMyT-U3!~it`e2?`E=SeW8nCPUFMoJ(mdqi$ZMzi+PbsS?Ln`$rt&C z22GC)MK|$t@NY4UO}@4o{^JomDd#w}qr&tsN2Ce$^FHtM``!2b+`s4fUDtck$-!DgP+AZK z0*Tlh*ze5wM{NA~`9L5p$hHm%5Qz5?(ba?IVQ+`VQ$k@l0>vMI(L=*HQ6P{Jh8~8) zhX6E)KM+VH8$;Q3O;8AtU<`HFwMW>8SpY%A12I&KFqB+kSui;S0W(Y0B7;3gb2=TCYf>=vNBJfmV7>&pw-N3~8 zQzB``P$*{}@?$x;FlS<55G~>-1v%mm<2V+=>9{bsHVgr$ZpOg>migav{v1re|BMZb zq>?rlK)}NR5)cZIX%QR_?JaN);g%k>JK*m^!_hVaekS{qD1jV#1R|aW5NH%UB_IF* zU<6>3i<67C=ahtiqv7^*GL4}eiw(38+FD4Yt2P3S&_ipZG!WWo1Y*-8h!Fvg#!~?t zjY8e<><`ymfbgx+mWd>yi6e;^1yCWb(KsrB5*-mjG=gu~$(h;8+8q5zGlKsOb%TZQ zpGy3R$&5t%E7L|%&?Fo=&=^YBA^-unND>Wd!Y*in*y9KQgi}Tw=LxT%tVlOA+`IvF zJSj4QBM%Zlp+a0jaS=g8av&!t5Enxv1OFuS2kWNLzYE(C8xiRr4B-Eewz(P2ae;po zYC^=^_85;xCr|hjlCTPp6P0W$PX1baQ$O{AY9F41TsJfXwMh zR8I4mLhO%;Pg5k5nOR-Tdcx6XN4R2$6lk6VHpVUe3;E-_E^l z;WvaTDoU-bF1J9GmD?cd>W@L*>GEeVKAk$;TWsH{xI5X?bzYQL47CPO7l5 z5ZvG24+e41nenL!Cz(oqPcyHbc%VVUvkR@m&uhl=QQqwp{9VZNc>ELdR;+XGIVS8i z7X#ASnX~?4lH%(Av>N}mv_pJ5_ObB!%i%mNHT41lHFHmWO%BsNnV~Y)XJ=OOf-3fk zwwSuw#$6q~oE2CBR_p;MG4d3O3TZC3b=)f z?%4ef>b~PcF(TJb?iLkfuMHWDe+eKSFisLGms@6*-%SzSU4m|ZI*9vfV$35Z?P9s_ z5}2=Ib}^yc^_~Bd8Rpj|zjJ$K=iY!+uo)i|VX^x~iHZpVyDZP7x*X2twh$DKJKp)( z2kw6GgE8L7esT)Qb>Tr( z9~+tndeS6(A`%>gHQC0hnDpG4a`j{Aduz4YDCCG^iN3zz)g)Fyfx|L90rp1bdXl%Y zyUK~Ei6NRKl;(cL^HNGscg=^^sLE%FyI~!%3h=7B zzszfnFp9c81oKP0C;anLqlfT^WPY1Z@7{s4JZJc5don3}Xh*wKc9qr01boh0X+-zr z-qf9*1w-|Y*FK@7JEW($S3f3=?#nlTGX>o zt(ig!wA>)%ps~lJw{NHHdL&-|VuBEU;_^bKN){=e-{_*9Qhv9FU;F#;R|PkE4)WVM z=HwJY51A>IesjE?+ILM(w!LRQOy5=DdDTD#_rgkCirx#5w|MSzRP~eG*YVei^U7Xc z@2{#@#=_rszahJG@g*g&G=ccRN0CQLUk1ly`R!v#T*v|A`7e}>QcL5Ds}Y5&?%#%{ zzTCZX>D}3tp_2ZU=(^l05g}L9Q|&iO`OUnzx40nvcAq(>PhSw~;ph5%l=1mEf#$g7 z@?r@~+^U}K&dhgLQ=A8Rcl#fy6*uz<=qY-=drm~sPhpAAyl(2XCGD-PLIw-wlM1PL zW}AeEFkz_4g;nyns7_l7;f!T0?t)?Ttnql>%J@p-XEwfP{r$*-6e+(pXH{FgGKt!o zDC*O6Zc(6eCLuU4zDA7u{L-6OLap6}QbDP{FmVwZWURR%d zA)jN{@_V&v=4G!I=!boXA}=H9HQX za=Ol`$kPr_kk=(;)$e(AbsZcL%<9CZ9xHXVJ(>DdYTOfc9wxuSKQ2y+Kz5ef;}}j= zm-RY!>Anw#Akxz&Xy5Mh+ZLT25<=s7lW`A0Df-2gvUYqeJ)%I0`IQ!l>D`Y^RCb^8 zynUl9z@@s{OY88>K3(Hz880-S-r9N#Nt77PFL(qtN)?V&kT3EcErwIw^NP{ zeNb4ET>U~W2{+9xQO-KaOq-TCxJcOEhB$M}C+RoSz8aPCSmmr9^>zRkDVLAUY<7|o@!c4td_gCN@+g! zCSG5xp{c)j!CKiPdoR)~7CrtTtp=nuH4MO}^Hv#&f_JF8fr(3ko`nr6DHXwim#9i- zcH?gJNB-vYRtT%6nZ*Phy@^U*31-w)(-{I|MfFTP&tt$|LzN7FwOz^9R|@3QHI-5G zTG!6AgaQo(YUuzM#{h)@4JzPIgn!;bQ1U2WFyl8(ZqYWEu|Lq3YR_~Zwlau0bM zVQ((GR&hm0E&l8dR*NMD^K#jJ+qp&Elk1>PBPOb#0?ebqQ4ulFIg;sj=3v3uvCm*T9iJ>!a>etUgsb!o&U zspnei)pt2djm+ zC|Tti+{zZKG{1J%A>Zgn6zH_Lif%tEkaeT7L! zR3$sXM`KHcZb3!$O!dLd!eK^6Mt8FI><G75RR_~_31AY4R>1)BBS#x|MpEfUkf*zmlzFecJsHpfVWoCLB zyw@?Gt6=OnP7ynk$d&&31>XnubtAEnk{~MexewOfWvE@IZh|FmWMZPnEB3jjvC-Gh zAPT@@o4o`FK^7-@8Z)wkX=wutKbHozw4qn=U0q$@7~t_;^UD|H^OlWg2f*WT&tJV_ zk|-2!nbR2=-rMDFl4F#U7}e1lJmkcFBVND25%a<>(FzG+E!|S9v=aFFR#24it$UAjtSmRU4DWYZp&MOpC4>2 VG`ly3;d~;1Y%Cr2-!R7}{u}gUbfEwM diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/card.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/card.png deleted file mode 100755 index 2ce954866d853edb737a7e281de221f7846846f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5695 zcmeHLdpMN&7ay0fZjDGHnIU_zPvqiXLJR^Cf~{zk;|Xg)J1@|U9t5%pOaNj{q6Y#nCn|vq-~j?D zD!diI@|=%S+`T|A7iSESPSqnU+URkp44yXxg0qmazu zo<=T67lthmOmU260&daU-HFkmL{k#n(n1o;!SDd607!sws9`h~hGP!r<6?O0#n%Wp zjBf&ln!}fp@^W#7+0vN+%uvrj&p?-mG)BRUP_3L%N#^ii5M*Ew2sWFo$42SVnPh~%si`RfX@D>=(B)a^ zvZ81pful=fZCr#{!oUG6B9p=ZDRdfa5t9%|j{wc#aGoCa5u8L^#%4q?!}!P~A_52l zr~nOQA@ue15rXzSCh!z;FvwbVqp?1+%;OuuAuxC@NCcB_^O+|jm=4le!F0yodoHW_ z{(>Q$7$DJ*7k81+WnbQ|i2P((APFI8!FT7^X({@0!Wd5=&q%(Ol z>2H1Qs07MC={=aAwETiCb)djN;ZvN}EdGfu$-k~y0F8IIV)HIh z5{E|(ArJ{WC!DoA=P{UeStb?<6;XwS#%;;LNbQ}{CM7#|?9Xh32Dh%x3TtD+4p}NX z=P33;*+id>O0iGPc83m}%^N~*wua<4LyK_8p+k!J`?_)c}(WuGwGA@!ezR_oo+Od{B|q6241IjlJgdO zt0-DJLWQ6S$lE}Psp!!rN*<=Kx7=v*sanVQU?~tKKQ9K)+6f(AnY>P8K1pf#TqeBS z$Vqb#QNlAhwEXRph1E7nj+({eIjq7oeeFw^ARD9$ScuTq;*aYf_cHWln_$v*hrBQ& zVybQRkK{?ER}xT2L#||ZYfIr%*xgm%ohRO9jr5sc06l^D+Jk(!J-KhFTSUGjL^WK!sA+18ml0HpUiCAi%da1ixGAcTjB}ST<6|c^O zb;Vjdzop!GveBdU$c$xEG{o0xpU>7~^yrB?6!Iu*93$O?E8aIC^GhRcLjuKH(doGC z>g>#i`DLb~d%7dmo&#@oN8I$V@l#0CH&zpB(caUa5C@Z_AA>t;`qo}S#BKDns84A& zktlJp&Cn}0>mFqbanu~f=u7SW=ts7#i9_@eilO9@bm=aYe?khhFtg%k-MKB2QxH5&9dJ%BoUAv9<>+K z&!i+MxZT|9@WNE%=1ECpD+IjSo$Fm`lAXsSzc$_`Q8D7beUrKS=9H#9tA5cz@-zSJ ztyNdD&YeeuJ|~@lF^h(OGlz>j(wK~pb2<{61@xBK&W$9|T{>SKSO2bb(`g&OtP%DA zSDX9ZwR_qkoml4}`3K`XTB<&#>#7D6*Wi)|UD<%YW&@pE`LJijg{Ef5S5@gJ>|$)n zj%rk$h8I0@tT!%BTo{C!<@=lp`1OV<&F`siSjOE0BNma|_VK=(xxE|Ls0yV+7B-=O z=m_3H7&6yJKijn16Ir=>-HiidZ=^#X(rR`nK>FoG zN~@eDM8L5!cP+`l7kRHz1{K!D7eQik+D6=!^V?NCwRY zd4*hGrygYw%hs9nJLmK_ z&D@&!ISrcJ+5EvCQkavY^)y$uLcCzGQXyPa;);)+Z%Jp=Bz8hax`~|In?Enk3BF@? z&%35i)iK4Q_;pj@Wr^2gt08j@=Z9+iE4#Uqz4DfzNv<;}_ReO{+l-83CtIBIPdTy=p?FxkVsl{i?s8V`{<&J} zd&Sef7bsM?L{moBE_j?(U<-m*@mDS{9d0Ww#M?RUh}QgLv-llgMDdZ)(OIJZMiEXAELrv z`K@ze{)cl57I`gKme=kVBbx&L#O06>H(N9R#EEb$-IT@vZ7O7i3cHSe)Sxw-sPw@l~2F-b$rpmHb^+G_g^smmN*w zLHndv&MEb0CKi{MkFs>@YPc5ma<1QH>m3Dc%7ndO2G8%|j+5UUAI9V)btp4?bEBy2 z8n(6fn3%Cp_vy5vLD9^&Ej}v)gcG2br#O4hDyNySR+ySvq&LeydAJ*jABP)&$qY^P zW^2yc2^uAkCea|`C9#I5`xL!XU5M9nr!PFUcqO@;g4J)(rE4uS4W-RH!KrD>nonw?_3 z-{*F+?e3#yLgQT_RW;EA`%Bcm@0wRkKe2TLxc=m+MvcR^Hai_#>zD$46R(reH$M=t z>)F<6JuzkG3uWEEzaGrDt?frTyKHh4IrgT}e6RdZPsT&%9hpZIj@^s&IrVr-6P=$U&LPIV iv*os~CbdYl&#K_=OkBmrhgdFt(si=ij;pWxEzMhwDg6VRB9Bbk!O z6tW@c#N~iA9v>u-KoWsq0uoKBtI5n{}YsCay6 zXecgpHIB45La^gu2Pk;h~+gfLUcWpMrcU>L`Qr@4?^ zsuNNYCM1NckxX+eVll;tKr|we+=&D#flMVD8xV+80%6)C(2U8TGWakg9duh6)1MX80*Pk(rsS>Cv||GyLCBr&ySORpJLGTA=V} zrm3P(10fE}94j(n!hTS2pb%>@c&Zw7f|xLflo3Ln7|V56h-ho4e_#8jQ-s& zzd$I28_fSNvx09LcmJct?A`0Q3wm*e z`r?VnFDmKiCBuXFJooSP4*}5gRtywBz3qeGUmH}Mtd5LTuaQb6O%3@sYx9blBsI;A zlExZ^^pW9bCUwadsyU_q`ZA={G*Tl`6spRN&H3$BZ*Qcc;iN?*V?=h*$S;1fRzOvg zjx40UKgPN3tm+bUKvGRcm|>Yy13P6EO366rn9RIDhtr4DCd@2ZL505eHF3AQ{I=N7 z_jjkWkMSlR7@ryWaG*i!S3!YTDG*XJ@b9UP)|cl+qwZ`%t<(=+x(`xU&|`0nk3JZ^ znm1clS#tZfLY}W5a~(Z*$qio`fl$hywQpZacC%KC^Qx;3SD2J7Z`+$cow$>C+IqvA z?RR-)3IsXds1@arpAx(cVtXzr)_BcVd~V-bUKY>5^sNxQ(tKZ<tM9$5tdWz%ej0ez^ya?f6Uo&{%mXC{m5-D|#M})nH&YH-de-MQ_7o1- z#CD#)h-GilV$|^-wK4g~F|==SXVAR;kpJOJ1QJh|oFtLRE%fX| z6QYi#L~SE1SFVxVR-KodqG8#ke`e#DwxLZ(TjPcNUV+ccwwC;%P~eLCW!nG}$^T5* z2KCN+25ld-C9`res#RIF2P5tNTFFQKZl)nOJ3ud(wWUs zigV_31!`Y>wXYA;a?fF$(=%0GqwWNR=hK#(^eg1=iA+9BvdZsrMKSZFgBQm?$NQu` z8ZI~ectr(JHJI%V2a*>8RF)v5JGOae_N$Wm${=X$hi-;9sN)kvM_4=Pfs=| zS6fzbZGnxWj`*s@zJp#mRncNO44E8)p~G)x#}$pp#DF0V_ifP^|3taUb;iljLK-u= zA6bT$8xsfkC2wEwO#~I!zKmC8__u1;#63TLz6lka$q6`+BpOakz5ZZrZ}=A#73X%3 z({QtIxVNXrh(9j^5Q#4!7NNWO(CB>_QSo7(eHhPOeUC z?V^-SvGAl$U%2WnSuJ;3uuJhX*QK-%=kK-0b(|&s4!GIP?Z1h-aVs>vOUAkGm^gR36sr&_zj%NG!0qfsPSSWYtzWaqIns?Yya)Zez_}3HkrU=7y$!KPW zZqo*AUyHJ*^w{93gBM1h74AJPqoQZOtK4%?yY{_CD1T+9OuhO?(MDGYTIw*KlH3>b zk{(_!kE{DF^KfdIM`vPMhm!umMB}U?x0K|j^mm>bN1vDvM4ldQnvU{wMbGop6+;X3O=sODx{wXdGn!#Iowd2S3j=3v%!vAF1s^TonKOpMr4QroDy zquS4he|@yd1iv=v5>ENHRZ|4FXT>M&JyMF^WMy~ zw<@-N9+-ID5_^>URu8zEs0$dnY|E(MuOEe5*(a%}q7^4R-GMnWm~Y3pugtL=B#07U zXtoU}A4b&&Fjh&IkTl%00j+p_z%KoqL-6H zsy0St$fopeoNbs^0c&p6~Uw>GXW; zOnr}u;fk}!A*9*X0m+VuA=cNgd}=IGkJO6S`nCFi_>?27XD9XAi>;K9$g&uxo*Iv% zN0vCW6uK=7Ymg@KEN`Tq0*&i*<@zl0-FwdV`f-&ABBYP9l zmiYvvoml12_ApZyNX5#l7|GAe=qHVnpNUhum)mVcXL~&dyBYC$&+{kjvMrxjRlfHa z=*~;8`n4bAQ>(4E_l(})VnJ}E-H#ZyGF=R`%OK2VpUn?#rMG@{Z-l*1a~S z1#>P&^t~(6`?%86zGjT^@;pwC}Q1RrXH8pScuyuG^&BCf5knD@5o zK&{USOy%2DN>RroTCx-MxT4oq7D$qmE~dBEt;$#{8h6o>mjZQNW$3K>`0h!3+Z^?0 zq#?|y0K3Zesv@7I_q+ol(sUCW*PZ(!&TCuIQtx%>IL6+g8JE!i^75e35Vq1nvVQz++X-2Na-jNuQTP-uom}bmOGfQTu9TlY;TkVum z;*bjI!YPtVa*0h_yQ|zQicoe*?XuSpyE>ioJZC-6thN62f8YDQ|NH&__e{Kp`${d% zxtag~Xt}yLd7@9U@`qCc01P;#b~*rHYxrzm#Mf;VgChv%45-EkfBHh`XNCAh=B`mkqWXc&RKp2cb zpgc?{k}>2g!Wb?CeOG=a5x}t!M8G20D+xhgHxJNJEQLWDkz&aqTP*=;Hbm-Dstw)7 z0(29LKzoT4BvU~unY;v~EM-{PFsyCB&lkZ~6J$!cAq-Ea6`vW=5sMItAQA?N6cG_Y zjIbh#r92XaPN$Q|R1%eHiAGq;6e0wYTZ&{RN{Dd`Cs@Xj@+Al#B~@ZV!Qya)MIfN_ z;KXtui6@^IipVA@M6%Dup%#+lkc31bl1b9B7}7VH|2yZ)U@m7eRuV21jxB)8A;Cg8 z3>G0Wl!G!3juMXRVfetoUI>JY1xzLf3&lKC9+%HSU@ju&h(khPn8=04xX@gN8(I=B zgg{PcCX0YtOt&OcEU8pBh0Gw^Feo&0GKE1Vk9h<#xf}*Z3PXrks`Tu$YhLiC@zJ=6 zLcZ;4A%8P01=$ghlq-&q3HVHs(oS?{JZo$;k;Wu_gQ{fV{!@uBnCykf*G$TyFockZ z$0Eorxo`*+E<^~n0~w{D8^nb{w2Tn?#xY)CBDY^Qc7x>{VYm#H2Zo5HpjQ|q3+0P= zXb=yIb@J5*PS=!iUbbxqY3$^8Q#3I?(=#zGZ2%*j5aOr=U zl}%_2`>w`Gl!+>Xh!`BN^VfjmqX}hWi}_Nxav|fp_Ww7$;*9ce(!pQ__#dSQzo+6W zOaEaV5B=g4qEg1cp{E<|Eu_ijf(|Cz6D&e|k`!$|{n#~4XyclLIQt@A;t&MgelRfJ zV_Z@5U{4t0DmK-^OaPeDuKi z(&CWpjmOsQtr2w2>c76os!MO>Zd~@+fphg(f}aGx)P_KmV|7e|d`h-{(CbSd9%vhF zD-g`C@IGm~^*x?y6f)b$$f(kL+o!)U$40xV@ob+MB!+$Q;zep%A2)_S`lfgGV>2B9 z2hQ>-i5k`pru^}+Y(wx;#cNYXHhY%IDy=k10QI-Puy3raN~UJp(EI4je@<`VZ1?HVUK1>j=z9~ zl{0=f)Ri^teW7EQA8LJxp6vPl;CvP5(@r}mAB(9vX%?D)md|UCdeRjAi)V_}+@8Lp z<--RKwdQm!dA#D~+`h&nBG9rObL#GJ`OLCY*<82y(=%=Ca^Kva>j<>o>W_nTc9+v$ zsNwXY*CZaHb&-yW@e%gyZIQ z)%t;po`#$EpHyEF*Xd?z;`)+cyR-cdmmg~j?&S?J&*!SFN`tMJ>kYRSAD3;5aQ#Ii zR{NI2+Xp~teVKTnKK^9hrkBZ>1kONW?f{S@C>#n|_`;ai=yQcbzlq zS~HTLQzFs0=pWLDpVNzG7v0@QCT}%0UKDCq8QM1b+p+FOU4xc{)j9aq!g%3Ri@MHd z3bpF1Bb03<&FQmrcKOn=%ih)$<$>b7F#jcPcR2cSf=#=#u@$u{ih+?cf|O@bZNnd7 zgKA!(%1y%tjCajQ(0yx{R}nH%;C6GMm|1x2rGl zWlUuHy>q<6=1a1)o@~uoR0lQK{6UTpm3ma}uX76XE8A|^kq#>M#}dueH?m4DTuN4r zx5~gRX5)G^25RslhBCNg*)i`y`%H2nt(LsUp>ijM#;*G4VZT~;Af@(#cA-jy_jK*I zUOQv_b7x@Q&<^*cspF=MEX1k`>{O8WH66uqwwAFHxtI6d1*D>Wy$EXVlTxk4Wqu8f z7pSbP89Cbr-Hi*kUw)Ki{CfEcgCxP`7w;Z!dA%oSTc)KECZ(XTSuFb{z@tEIWSp8j6-6W8K(M@5_M zzM(ap>AgjFUdfp&hob@i^-&!S%)^__m?ce)TcZPr$q<4Xd?BHHSI3IyO0DU()TXl(gK1eqCMlT5UAa%-vKs*e z{1f4!PyJ0*MUPbL)dU&7_9Lq@1gY)9cQZ`ZT7hdl{S1!vUE5%}_BJ6sJyyrpsY-CI z*LF*lK$;-lW$ky-w+=Ms&LPicKhRG>`;bXD&CR(v|9MK|Ky|y%;EDyN%xC)aYr1&`JU!`) zU`3-!RzOL*K6r~#TZ=CUG47?UtS$+c&%6n=q;a(zkC;{Ty<{g*)hWBOG^q9KmSxpt ze|j9eKR3^y1z4}zR2x?ALSLU0aFj~G5oFA%A#gxM$>ZYQhTOKRZqbjE>~73kxI^Tg zm}+D?;NE)t8bh(^J};-Md&W6t`*ob+{rStcW``Q%lQLXv%9Q_RU7g*X@*Fm7{~MA6 BY2g3> diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/parent.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/parent.png deleted file mode 100755 index 156fa64fd50f15d9e838326d42d68feba2c23c3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3474 zcmb7H2{=@1A3sx*ElZmr6{pFPFk2dCvP~gNlqE}xoS8YsL^ES%F!9N9n-C#MNxEne zBBg~(j5Sk9R1{fSrMg$$D9Z93RJZPTzwddzInT^F?|J|K-|zSS{_p#Lo{8V=yg^Ap zLjeE)C3`z-SL9BZ`pU@w01BKVoeu!$Cbqkm(93BfmBHPOgP2@8j1%qVAyEKeW+~!9 zi~v{&(qR^xV~!oHsK$b9ra9JgjT6C%w;uLq+lBFAw=idSMpyuY!o*ryD42<;2*7Sw z2!W#AfgAxxEzMhwDg6VRB9Bbk!O z6tW@c#N~iA9v>u-KoWsq0uoKBtI5n{}YsCay6 zXecgpHIB45La^gu2Pk;h~+gfLUcWpMrcU>L`Qr@4?^ zsuNNYCM1NckxX+eVll;tKr|we+=&D#flMVD8xV+80%6)C(2U8TGWakg9duh6)1MX80*Pk(rsS>Cv||GyLCBr&ySORpJLGTA=V} zrm3P(10fE}94j(n!hTS2pb%>@c&Zw7f|xLflo3Ln7|V56h-ho4e_#8jQ-s& zzd$I28_fSNvx09LcmJct?A`0Q3wm*e z`r?VnFDmKiCBuXFJooSP4*}5gRtywBz3qeGUmH}Mtd5LTuaQb6O%3@sYx9blBsI;A zlExZ^^pW9bCUwadsyU_q`ZA={G*Tl`6spRN&H3$BZ*Qcc;iN?*V?=h*$S;1fRzOvg zjx40UKgPN3tm+bUKvGRcm|>Yy13P6EO366rn9RIDhtr4DCd@2ZL505eHF3AQ{I=N7 z_jjkWkMSlR7@ryWaG*i!S3!YTDG*XJ@b9UP)|cl+qwZ`%t<(=+x(`xU&|`0nk3JZ^ znm1clS#tZfLY}W5a~(Z*$qio`fl$hywQpZacC%KC^Qx;3SD2J7Z`+$cow$>C+IqvA z?RR-)3IsXds1@arpAx(cVtXzr)_BcVd~V-bUKY>5^sNxQ(tKZ<tM9$5tdWz%ej0ez^ya?f6Uo&{%mXC{m5-D|#M})nH&YH-de-MQ_7o1- z#CD#)h-GilV$|^-wK4g~F|==SXVAR;kpJOJ1QJh|oFtLRE%fX| z6QYi#L~SE1SFVxVR-KodqG8#ke`e#DwxLZ(TjPcNUV+ccwwC;%P~eLCW!nG}$^T5* z2KCN+25ld-C9`res#RIF2P5tNTFFQKZl)nOJ3ud(wWUs zigV_31!`Y>wXYA;a?fF$(=%0GqwWNR=hK#(^eg1=iA+9BvdZsrMKSZFgBQm?$NQu` z8ZI~ectr(JHJI%V2a*>8RF)v5JGOae_N$Wm${=X$hi-;9sN)kvM_4=Pfs=| zS6fzbZGnxWj`*s@zJp#mRncNO44E8)p~G)x#}$pp#DF0V_ifP^|3taUb;iljLK-u= zA6bT$8xsfkC2wEwO#~I!zKmC8__u1;#63TLz6lka$q6`+BpOakz5ZZrZ}=A#73X%3 z({QtIxVNXrh(9j^5Q#4!7NNWO(CB>_QSo7(eHhPOeUC z?V^-SvGAl$U%2WnSuJ;3uuJhX*QK-%=kK-0b(|&s4!GIP?Z1h-aVs>vOUAkGm^gR36sr&_zj%NG!0qfsPSSWYtzWaqIns?Yya)Zez_}3HkrU=7y$!KPW zZqo*AUyHJ*^w{93gBM1h74AJPqoQZOtK4%?yY{_CD1T+9OuhO?(MDGYTIw*KlH3>b zk{(_!kE{DF^KfdIM`vPMhm!umMB}U?x0K|j^mm>bN1vDvM4ldQnvU{wMbGop6+;X3O=sODx{wXdGn!#Iowd2S3j=3v%!vAF1s^TonKOpMr4QroDy zquS4he|@yd1iv=v5>ENHRZ|4FXT>M&JyMF^WMy~ zw<@-N9+-ID5_^>URu8zEs0$dnY|E(MuOEe5*(a%}q7^4R-GMnWm~Y3pugtL=B#07U zXtoU}A4b&&Fjh&IkTl%00j+p_z%KoqL-6H zsy0St$fopeoNbs^0c&p6~Uw>GXW; zOnr}u;fk}!A*9*X0m+VuA=cNgd}=IGkJO6S`nCFi_>?27XD9XAi>;K9$g&uxo*Iv% zN0vCW6uK=7Ymg@KEN`Tq0*&i*<@zl0-FwdV`f-&ABBYP9l zmiYvvoml12_ApZyNX5#l7|GAe=qHVnpNUhum)mVcXL~&dyBYC$&+{kjvMrxjRlfHa z=*~;8`n4bAQ>(4E_l(})VnJ}E-H#ZyGF=R`%OK2VpUn?#rMG@{Z-l*1a~S z1#>P&^t~(6`?%86zGjT^@;pwC}Q1RrXH8pScuyuG^&BCf5knD@5o zK&{USOy%2DN>RroTCx-MxT4oq7D$qmE~dBEt;$#{8h6o>mjZQNW$3K>`0h!3+Z^?0 zq#?|y0K3Zesv@7I_q+ol(sUCW*PZ(!&TCuIQtx%>IL6+g8JE!i^75``Y6gr#$Vf>RpCKLvN z^z@Wgh%9j~V?{(G(ZN9^8k~#+r8YQ0GFRda0Ax=A7o;UY2qpnyvN-P8;j`zl7#7_f zyL?eFA(-m}C9?c7cu;u8(g<2c63vy4_4Lpn3rG@xWC#H|IEN zMI=Xi%=;hKLjyzR(HW#L>f-m|B$7Ke5ka^lJU%Tg4VUJCgLzE6y{oG$oUVFczU!rZ_2oL0;H z&5t^eUu9VPeU&*d$vSj%P9WQSobC=a=D*AN7q~%aTI07QFjZNbuuwkYoe>#hX zKy(DA!3+ij;pmVof$5w`lvE@U=J7*dK1<4`ghMIG7&4tkn%b&NoMN5AMy8}Gkc;vsT7Ri^K?+A#O%>REy`Xn}4zK=*gQyluhl5<5v{5cF*c5FVjVNvKj zUjYKrc^{6|f9ri%NcyL>VUkHCYp744htOcUr0u5;#NU7;yib8gKzV~|BzLPc$t6mCu;ISHTOg@8{`1v`W!_A;zE{UtDEr zWmQzGgfqu3{F+s9ezhnZa2)Z9uFly_+2XbaSRA()h1LeQ%&&Ta2PA<^aue(oO@qP85~&ePYGTyx|%5fgoi~uQi^> z^R~lr#QqcJ9`=+ib7xnz%$~dZ(#8E~<6(XZPiMH$_!Ml?JJ6rtbw!X2C~!EOMyL41 z-v0ivmTOnq+Am#F4`QP_Mhe0h8NZ5|?KO3W-!!Cjs8aOMy5sXFJX8AT#T`)B&>#fW zxbD<`wpV0`12&Y+{k{Meex?3e$;QU!mcJ4v$8TxiUPS|M4XSc}dtiW{(Zr;vuD!$36|9bDk{df1+vF6yo{oS3n4FqdohLjw_`5~{?3hM@%4|Xg-TL<{!O54QXQz7JRVWFg}t9!8~JKOWQ zXT$280Ugww0mhTe$9;WZJdLKd-;~kNxBIDXL_kvgLD9N(f|+G{RN;<4&mB8hEZn+a z+3YxvY)Whl6NGL$-)81KwT}IPb3++5b4S$3MoP7|K-3wHW^b(cq+{x2V4&ZIg?(=#W?0>RtB8i22g=Mf#Bi7Z;Qg%I8uy z*SJIR4Cq4fut#HiS#`znyk{DP`QOH`zcljnPSW~OyLiaeYxg{rZNc>=*5$S#6 z$DhrKGs_ges@%z*nI(Rk)O@Yryvm;X-SyNTRcbufHvzWR=#hhc1O460))F6`PN|DY z3N-G<8bnv+8mVk<3D`e5IeDrxy2})>S8_tJLtXkDs_SdLBZDEVnwznb8v)mu!!o08 z7^@cU@7;4z%`E)kNXGcUL9#`|B&23EE;ehpb-DTai0G=h~gE@oaLKP&CrKmLvQXGSLUx*u87evamzB<=YVdFE$c6=%+IIj zb(*XE*lGwo=q*;Z1ER)M`pb3R5s5^UVf$+Om}t;B)R!2drR3M%)xq=tY%(cF401Bm znz2|^8m9-u7y=s&RCQ@I)%Zd4l*@;n%^BA+O8oYV; zmSUuz`b>|k@p)ISH#d9PaR=L0-KLNK{u<^UE@8}_72?Kkaasu|BFt3t;CyiGfmo|8 z(kAw1)_s##8y6c|6xVLbRqmhnZ1@VU&hK0arg4ab{>^E|*JUl1MFe%lJw=>GLdz5O zqOLY_RmOhP?FW+24ZmO?*^Hr+W!1tihruhm?RS;tp3u`h`8t|>`Ww6Qg=sQYTaFybZ9Z5Y@)k-y*mr@hLWqYfqA;VU2Q zHBNnUR%_UBz^IQtcD4Ra(_LZl;oJ^`p5m8BPp(6#hwq6xvtIJ3L8A|>e|^?8zem00 zJ}v)`(cV4{T4cWWn<_^C={vqR@1<>k^WGgle2cM~Z}`oF!WYridplU=KYwT0mV}rO zX5u#U!P=-pW9^}4eV(a$l|!cJ(pT5KcRxu8R2%DxtGdD2wM$d{a=lZP&BEZyfE7_c zor&e>lw>hoN`E&ponu-*TOm7XrJC1)R{9#Rb!W65F4!5Ar}WPIboMORSS924n9T=H zFK9bUq3sFy!&sxys8c8RRp1}>PijmWx~i8JZkQKto%Ps~doqk#*?Q^i*trmf%RqJU z;#=VlXJ@*Ot@Tm7cQh70`TUgTilj9ygRTDMD_Wna-`nRr)Vk*kX+&p+_hoCb$go`z z(mGzZL{lr@+q}G%)%W7iTIF2Zt6P@o>RvYSKjuC`!I)?+XJl_PxHBh4;f`g!!E>A4VP5$SQ5CLF_=0&A@lnwhleUz`(>k&GBZWCDT3kgv cn$validSetting = $settings[$validSetting]; - } - } - - if (isset($settings['authType'])) { - $this->authType = $settings['authType']; - } else { - $this->authType = self::AUTH_BASIC | self::AUTH_DIGEST; - } - - $this->propertyMap['{DAV:}resourcetype'] = 'SabreForRainLoop\\DAV\\Property\\ResourceType'; - - } - - /** - * Add trusted root certificates to the webdav client. - * - * The parameter certificates should be a absolute path to a file - * which contains all trusted certificates - * - * @param string $certificates - */ - public function addTrustedCertificates($certificates) { - $this->trustedCertificates = $certificates; - } - - /** - * Enables/disables SSL peer verification - * - * @param boolean $value - */ - public function setVerifyPeer($value) { - $this->verifyPeer = $value; - } - - /** - * Does a PROPFIND request - * - * The list of requested properties must be specified as an array, in clark - * notation. - * - * The returned array will contain a list of filenames as keys, and - * properties as values. - * - * The properties array will contain the list of properties. Only properties - * that are actually returned from the server (without error) will be - * returned, anything else is discarded. - * - * Depth should be either 0 or 1. A depth of 1 will cause a request to be - * made to the server to also return all child resources. - * - * @param string $url - * @param array $properties - * @param int $depth - * @return array - */ - public function propFind($url, array $properties, $depth = 0) { - - $body = '' . "\n"; - $body.= '' . "\n"; - $body.= ' ' . "\n"; - - foreach($properties as $property) { - - list( - $namespace, - $elementName - ) = XMLUtil::parseClarkNotation($property); - - if ($namespace === 'DAV:') { - $body.=' ' . "\n"; - } else { - $body.=" \n"; - } - - } - - $body.= ' ' . "\n"; - $body.= ''; - - $response = $this->request('PROPFIND', $url, $body, array( - 'Depth' => $depth, - 'Content-Type' => 'application/xml' - )); - - $result = $this->parseMultiStatus($response['body']); - - // If depth was 0, we only return the top item - if ($depth===0) { - reset($result); - $result = current($result); - return isset($result[200])?$result[200]:array(); - } - - $newResult = array(); - foreach($result as $href => $statusList) { - - $newResult[$href] = isset($statusList[200])?$statusList[200]:array(); - - } - - return $newResult; - - } - - /** - * Updates a list of properties on the server - * - * The list of properties must have clark-notation properties for the keys, - * and the actual (string) value for the value. If the value is null, an - * attempt is made to delete the property. - * - * @todo Must be building the request using the DOM, and does not yet - * support complex properties. - * @param string $url - * @param array $properties - * @return void - */ - public function propPatch($url, array $properties) { - - $body = '' . "\n"; - $body.= '' . "\n"; - - foreach($properties as $propName => $propValue) { - - list( - $namespace, - $elementName - ) = XMLUtil::parseClarkNotation($propName); - - if ($propValue === null) { - - $body.="\n"; - - if ($namespace === 'DAV:') { - $body.=' ' . "\n"; - } else { - $body.=" \n"; - } - - $body.="\n"; - - } else { - - $body.="\n"; - if ($namespace === 'DAV:') { - $body.=' '; - } else { - $body.=" "; - } - // Shitty.. i know - $body.=htmlspecialchars($propValue, ENT_NOQUOTES, 'UTF-8'); - if ($namespace === 'DAV:') { - $body.='' . "\n"; - } else { - $body.="\n"; - } - $body.="\n"; - - } - - } - - $body.= ''; - - $this->request('PROPPATCH', $url, $body, array( - 'Content-Type' => 'application/xml' - )); - - } - - /** - * Performs an HTTP options request - * - * This method returns all the features from the 'DAV:' header as an array. - * If there was no DAV header, or no contents this method will return an - * empty array. - * - * @return array - */ - public function options() { - - $result = $this->request('OPTIONS'); - if (!isset($result['headers']['dav'])) { - return array(); - } - - $features = explode(',', $result['headers']['dav']); - foreach($features as &$v) { - $v = trim($v); - } - return $features; - - } - - /** - * Performs an actual HTTP request, and returns the result. - * - * If the specified url is relative, it will be expanded based on the base - * url. - * - * The returned array contains 3 keys: - * * body - the response body - * * httpCode - a HTTP code (200, 404, etc) - * * headers - a list of response http headers. The header names have - * been lowercased. - * - * @param string $method - * @param string $url - * @param string $body - * @param array $headers - * @return array - */ - public function request($method, $url = '', $body = null, $headers = array()) { - - $url = $this->getAbsoluteUrl($url); - - $curlSettings = array( - CURLOPT_RETURNTRANSFER => true, - // Return headers as part of the response - CURLOPT_HEADER => true, - CURLOPT_POSTFIELDS => $body, - CURLOPT_USERAGENT => 'RainLoop DAV Client', // TODO rainloop - // Automatically follow redirects - CURLOPT_FOLLOWLOCATION => true, - CURLOPT_MAXREDIRS => 5, - ); - - if($this->verifyPeer !== null) { - $curlSettings[CURLOPT_SSL_VERIFYPEER] = $this->verifyPeer; - // TODO rainloop - if (!$this->verifyPeer) { - $curlSettings[CURLOPT_SSL_VERIFYHOST] = 0; - } // --- - } - - if($this->trustedCertificates) { - $curlSettings[CURLOPT_CAINFO] = $this->trustedCertificates; - } - - switch ($method) { - case 'HEAD' : - - // do not read body with HEAD requests (this is necessary because cURL does not ignore the body with HEAD - // requests when the Content-Length header is given - which in turn is perfectly valid according to HTTP - // specs...) cURL does unfortunately return an error in this case ("transfer closed transfer closed with - // ... bytes remaining to read") this can be circumvented by explicitly telling cURL to ignore the - // response body - $curlSettings[CURLOPT_NOBODY] = true; - $curlSettings[CURLOPT_CUSTOMREQUEST] = 'HEAD'; - break; - - default: - $curlSettings[CURLOPT_CUSTOMREQUEST] = $method; - break; - - } - - // Adding HTTP headers - $nHeaders = array(); - foreach($headers as $key=>$value) { - - $nHeaders[] = $key . ': ' . $value; - - } - $curlSettings[CURLOPT_HTTPHEADER] = $nHeaders; - - if ($this->proxy) { - $curlSettings[CURLOPT_PROXY] = $this->proxy; - } - - if ($this->userName && $this->authType) { - $curlType = 0; - if ($this->authType & self::AUTH_BASIC) { - $curlType |= CURLAUTH_BASIC; - } - if ($this->authType & self::AUTH_DIGEST) { - $curlType |= CURLAUTH_DIGEST; - } - $curlSettings[CURLOPT_HTTPAUTH] = $curlType; - $curlSettings[CURLOPT_USERPWD] = $this->userName . ':' . $this->password; - } - -// var_dump($url); -// var_dump($curlSettings); - - list( - $response, - $curlInfo, - $curlErrNo, - $curlError - ) = $this->curlRequest($url, $curlSettings); - -// var_dump($response); - - $headerBlob = substr($response, 0, $curlInfo['header_size']); - $response = substr($response, $curlInfo['header_size']); - - - // In the case of 100 Continue, or redirects we'll have multiple lists - // of headers for each separate HTTP response. We can easily split this - // because they are separated by \r\n\r\n - $headerBlob = explode("\r\n\r\n", trim($headerBlob, "\r\n")); - - // We only care about the last set of headers - $headerBlob = $headerBlob[count($headerBlob)-1]; - - // Splitting headers - $headerBlob = explode("\r\n", $headerBlob); - - $headers = array(); - foreach($headerBlob as $header) { - $parts = explode(':', $header, 2); - if (count($parts)==2) { - $headers[strtolower(trim($parts[0]))] = trim($parts[1]); - } - } - - $response = array( - 'body' => $response, - 'statusCode' => $curlInfo['http_code'], - 'headers' => $headers - ); - - if ($curlErrNo) { - throw new Exception('[CURL] Error while making request: ' . $curlError . ' (error code: ' . $curlErrNo . ')'); - } - - if ($response['statusCode']>=400) { - switch ($response['statusCode']) { - case 400 : - throw new Exception\BadRequest('Bad request'); - case 401 : - throw new Exception\NotAuthenticated('Not authenticated'); - case 402 : - throw new Exception\PaymentRequired('Payment required'); - case 403 : - throw new Exception\Forbidden('Forbidden'); - case 404: - throw new Exception\NotFound('Resource not found.'); - case 405 : - throw new Exception\MethodNotAllowed('Method not allowed'); - case 409 : - throw new Exception\Conflict('Conflict'); - case 412 : - throw new Exception\PreconditionFailed('Precondition failed'); - case 416 : - throw new Exception\RequestedRangeNotSatisfiable('Requested Range Not Satisfiable'); - case 500 : - throw new Exception('Internal server error'); - case 501 : - throw new Exception\NotImplemented('Not Implemented'); - case 507 : - throw new Exception\InsufficientStorage('Insufficient storage'); - default: - throw new Exception('HTTP error response. (errorcode ' . $response['statusCode'] . ')'); - } - } - - return $response; - - } - - /** - * Wrapper for all curl functions. - * - * The only reason this was split out in a separate method, is so it - * becomes easier to unittest. - * - * @param string $url - * @param array $settings - * @return array - */ - // @codeCoverageIgnoreStart - protected function curlRequest($url, $settings) { - - // TODO rainloop - $curl = curl_init($url); - $sSafeMode = strtolower(trim(@ini_get('safe_mode'))); - $bSafeMode = 'on' === $sSafeMode || '1' === $sSafeMode; - - if (!$bSafeMode && ini_get('open_basedir') === '') - { - curl_setopt_array($curl, $settings); - $data = curl_exec($curl); - } - else - { - $settings[CURLOPT_FOLLOWLOCATION] = false; - curl_setopt_array($curl, $settings); - - $max_redirects = isset($settings[CURLOPT_MAXREDIRS]) ? $settings[CURLOPT_MAXREDIRS] : 5; - $mr = $max_redirects; - if ($mr > 0) - { - $newurl = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL); - - $rcurl = curl_copy_handle($curl); - curl_setopt($rcurl, CURLOPT_HEADER, true); - curl_setopt($rcurl, CURLOPT_NOBODY, true); - curl_setopt($rcurl, CURLOPT_FORBID_REUSE, false); - curl_setopt($rcurl, CURLOPT_RETURNTRANSFER, true); - do - { - curl_setopt($rcurl, CURLOPT_URL, $newurl); - $header = curl_exec($rcurl); - if (curl_errno($rcurl)) - { - $code = 0; - } - else - { - $code = curl_getinfo($rcurl, CURLINFO_HTTP_CODE); - if ($code == 301 || $code == 302) - { - $matches = array(); - preg_match('/Location:(.*?)\n/', $header, $matches); - $newurl = trim(array_pop($matches)); - } - else - { - $code = 0; - } - } - } while ($code && --$mr); - - curl_close($rcurl); - if ($mr > 0) - { - curl_setopt($curl, CURLOPT_URL, $newurl); - } - } - - if ($mr == 0 && $max_redirects > 0) - { - $data = false; - } - else - { - $data = curl_exec($curl); - } - } - - return array( - $data, - curl_getinfo($curl), - curl_errno($curl), - curl_error($curl) - ); - - } - // @codeCoverageIgnoreEnd - - /** - * Returns the full url based on the given url (which may be relative). All - * urls are expanded based on the base url as given by the server. - * - * @param string $url - * @return string - */ - protected function getAbsoluteUrl($url) { - - // If the url starts with http:// or https://, the url is already absolute. - if (preg_match('/^http(s?):\/\//', $url)) { - return $url; - } - - // If the url starts with a slash, we must calculate the url based off - // the root of the base url. - if (strpos($url,'/') === 0) { - $parts = parse_url($this->baseUri); - return $parts['scheme'] . '://' . $parts['host'] . (isset($parts['port'])?':' . $parts['port']:'') . $url; - } - - // Otherwise... - return $this->baseUri . $url; - - } - - /** - * Parses a WebDAV multistatus response body - * - * This method returns an array with the following structure - * - * array( - * 'url/to/resource' => array( - * '200' => array( - * '{DAV:}property1' => 'value1', - * '{DAV:}property2' => 'value2', - * ), - * '404' => array( - * '{DAV:}property1' => null, - * '{DAV:}property2' => null, - * ), - * ) - * 'url/to/resource2' => array( - * .. etc .. - * ) - * ) - * - * - * @param string $body xml body - * @return array - */ - public function parseMultiStatus($body) { - - $body = XMLUtil::convertDAVNamespace($body); - - $responseXML = simplexml_load_string($body, null, LIBXML_NOBLANKS | LIBXML_NOCDATA); - if ($responseXML===false) { - throw new \InvalidArgumentException('The passed data is not valid XML'); - } - - $responseXML->registerXPathNamespace('d', 'urn:DAV'); - - $propResult = array(); - - foreach($responseXML->xpath('d:response') as $response) { - $response->registerXPathNamespace('d', 'urn:DAV'); - $href = $response->xpath('d:href'); - $href = (string)$href[0]; - - $properties = array(); - - foreach($response->xpath('d:propstat') as $propStat) { - - $propStat->registerXPathNamespace('d', 'urn:DAV'); - $status = $propStat->xpath('d:status'); - list($httpVersion, $statusCode, $message) = explode(' ', (string)$status[0],3); - - // Only using the propertymap for results with status 200. - $propertyMap = $statusCode==='200' ? $this->propertyMap : array(); - - $properties[$statusCode] = XMLUtil::parseProperties(dom_import_simplexml($propStat), $propertyMap); - - } - - $propResult[$href] = $properties; - - } - - return $propResult; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Collection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Collection.php deleted file mode 100755 index 1e070e76..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Collection.php +++ /dev/null @@ -1,110 +0,0 @@ -getChildren() as $child) { - - if ($child->getName()==$name) return $child; - - } - throw new Exception\NotFound('File not found: ' . $name); - - } - - /** - * Checks is a child-node exists. - * - * It is generally a good idea to try and override this. Usually it can be optimized. - * - * @param string $name - * @return bool - */ - public function childExists($name) { - - try { - - $this->getChild($name); - return true; - - } catch(Exception\NotFound $e) { - - return false; - - } - - } - - /** - * Creates a new file in the directory - * - * Data will either be supplied as a stream resource, or in certain cases - * as a string. Keep in mind that you may have to support either. - * - * After succesful creation of the file, you may choose to return the ETag - * of the new file here. - * - * The returned ETag must be surrounded by double-quotes (The quotes should - * be part of the actual string). - * - * If you cannot accurately determine the ETag, you should not return it. - * If you don't store the file exactly as-is (you're transforming it - * somehow) you should also not return an ETag. - * - * This means that if a subsequent GET to this new file does not exactly - * return the same contents of what was submitted here, you are strongly - * recommended to omit the ETag. - * - * @param string $name Name of the file - * @param resource|string $data Initial payload - * @return null|string - */ - public function createFile($name, $data = null) { - - throw new Exception\Forbidden('Permission denied to create file (filename ' . $name . ')'); - - } - - /** - * Creates a new subdirectory - * - * @param string $name - * @throws Exception\Forbidden - * @return void - */ - public function createDirectory($name) { - - throw new Exception\Forbidden('Permission denied to create directory'); - - } - - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception.php deleted file mode 100755 index 7140bdf4..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception.php +++ /dev/null @@ -1,64 +0,0 @@ -lock) { - $error = $errorNode->ownerDocument->createElementNS('DAV:','d:no-conflicting-lock'); - $errorNode->appendChild($error); - if (!is_object($this->lock)) var_dump($this->lock); - $error->appendChild($errorNode->ownerDocument->createElementNS('DAV:','d:href',$this->lock->uri)); - } - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/FileNotFound.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/FileNotFound.php deleted file mode 100755 index 24a0e64f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/FileNotFound.php +++ /dev/null @@ -1,19 +0,0 @@ -ownerDocument->createElementNS('DAV:','d:valid-resourcetype'); - $errorNode->appendChild($error); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/LockTokenMatchesRequestUri.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/LockTokenMatchesRequestUri.php deleted file mode 100755 index 6fbd2889..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/LockTokenMatchesRequestUri.php +++ /dev/null @@ -1,41 +0,0 @@ -message = 'The locktoken supplied does not match any locks on this entity'; - - } - - /** - * This method allows the exception to include additional information into the WebDAV error response - * - * @param DAV\Server $server - * @param \DOMElement $errorNode - * @return void - */ - public function serialize(DAV\Server $server,\DOMElement $errorNode) { - - $error = $errorNode->ownerDocument->createElementNS('DAV:','d:lock-token-matches-request-uri'); - $errorNode->appendChild($error); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/Locked.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/Locked.php deleted file mode 100755 index ebcc46c5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/Locked.php +++ /dev/null @@ -1,73 +0,0 @@ -lock = $lock; - - } - - /** - * Returns the HTTP statuscode for this exception - * - * @return int - */ - public function getHTTPCode() { - - return 423; - - } - - /** - * This method allows the exception to include additional information into the WebDAV error response - * - * @param DAV\Server $server - * @param \DOMElement $errorNode - * @return void - */ - public function serialize(DAV\Server $server,\DOMElement $errorNode) { - - if ($this->lock) { - $error = $errorNode->ownerDocument->createElementNS('DAV:','d:lock-token-submitted'); - $errorNode->appendChild($error); - - $href = $errorNode->ownerDocument->createElementNS('DAV:','d:href'); - $href->appendChild($errorNode->ownerDocument->createTextNode($this->lock->uri)); - $error->appendChild( - $href - ); - } - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/MethodNotAllowed.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/MethodNotAllowed.php deleted file mode 100755 index 0c2b67eb..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/MethodNotAllowed.php +++ /dev/null @@ -1,45 +0,0 @@ -getAllowedMethods($server->getRequestUri()); - - return array( - 'Allow' => strtoupper(implode(', ',$methods)), - ); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/NotAuthenticated.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/NotAuthenticated.php deleted file mode 100755 index 99e2ad26..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/NotAuthenticated.php +++ /dev/null @@ -1,30 +0,0 @@ -header = $header; - - } - - /** - * Returns the HTTP statuscode for this exception - * - * @return int - */ - public function getHTTPCode() { - - return 412; - - } - - /** - * This method allows the exception to include additional information into the WebDAV error response - * - * @param DAV\Server $server - * @param \DOMElement $errorNode - * @return void - */ - public function serialize(DAV\Server $server,\DOMElement $errorNode) { - - if ($this->header) { - $prop = $errorNode->ownerDocument->createElement('s:header'); - $prop->nodeValue = $this->header; - $errorNode->appendChild($prop); - } - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/ReportNotSupported.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/ReportNotSupported.php deleted file mode 100755 index d7fa05fb..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/ReportNotSupported.php +++ /dev/null @@ -1,32 +0,0 @@ -ownerDocument->createElementNS('DAV:','d:supported-report'); - $errorNode->appendChild($error); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/RequestedRangeNotSatisfiable.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/RequestedRangeNotSatisfiable.php deleted file mode 100755 index 2080388c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/RequestedRangeNotSatisfiable.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/). - * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License - */ -class ServiceUnavailable extends DAV\Exception { - - /** - * Returns the HTTP statuscode for this exception - * - * @return int - */ - public function getHTTPCode() { - - return 503; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/UnsupportedMediaType.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/UnsupportedMediaType.php deleted file mode 100755 index 05b245d9..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Exception/UnsupportedMediaType.php +++ /dev/null @@ -1,28 +0,0 @@ -path . '/' . $name; - file_put_contents($newPath,$data); - - } - - /** - * Creates a new subdirectory - * - * @param string $name - * @return void - */ - public function createDirectory($name) { - - $newPath = $this->path . '/' . $name; - mkdir($newPath); - - } - - /** - * Returns a specific child node, referenced by its name - * - * This method must throw DAV\Exception\NotFound if the node does not - * exist. - * - * @param string $name - * @throws DAV\Exception\NotFound - * @return DAV\INode - */ - public function getChild($name) { - - $path = $this->path . '/' . $name; - - if (!file_exists($path)) throw new DAV\Exception\NotFound('File with name ' . $path . ' could not be located'); - - if (is_dir($path)) { - - return new Directory($path); - - } else { - - return new File($path); - - } - - } - - /** - * Returns an array with all the child nodes - * - * @return DAV\INode[] - */ - public function getChildren() { - - $nodes = array(); - foreach(scandir($this->path) as $node) if($node!='.' && $node!='..') $nodes[] = $this->getChild($node); - return $nodes; - - } - - /** - * Checks if a child exists. - * - * @param string $name - * @return bool - */ - public function childExists($name) { - - $path = $this->path . '/' . $name; - return file_exists($path); - - } - - /** - * Deletes all files in this directory, and then itself - * - * @return void - */ - public function delete() { - - foreach($this->getChildren() as $child) $child->delete(); - rmdir($this->path); - - } - - /** - * Returns available diskspace information - * - * @return array - */ - public function getQuotaInfo() { - - return array( - disk_total_space($this->path)-disk_free_space($this->path), - disk_free_space($this->path) - ); - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FS/File.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FS/File.php deleted file mode 100755 index 36106dea..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FS/File.php +++ /dev/null @@ -1,91 +0,0 @@ -path,$data); - - } - - /** - * Returns the data - * - * @return string - */ - public function get() { - - return fopen($this->path,'r'); - - } - - /** - * Delete the current file - * - * @return void - */ - public function delete() { - - unlink($this->path); - - } - - /** - * Returns the size of the node, in bytes - * - * @return int - */ - public function getSize() { - - return filesize($this->path); - - } - - /** - * Returns the ETag for a file - * - * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change. - * The ETag is an arbitrary string, but MUST be surrounded by double-quotes. - * - * Return null if the ETag can not effectively be determined - * - * @return mixed - */ - public function getETag() { - - return null; - - } - - /** - * Returns the mime-type for a file - * - * If null is returned, we'll assume application/octet-stream - * - * @return mixed - */ - public function getContentType() { - - return null; - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FS/Node.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FS/Node.php deleted file mode 100755 index 0e2145bb..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FS/Node.php +++ /dev/null @@ -1,82 +0,0 @@ -path = $path; - - } - - - - /** - * Returns the name of the node - * - * @return string - */ - public function getName() { - - list(, $name) = DAV\URLUtil::splitPath($this->path); - return $name; - - } - - /** - * Renames the node - * - * @param string $name The new name - * @return void - */ - public function setName($name) { - - list($parentPath, ) = DAV\URLUtil::splitPath($this->path); - list(, $newName) = DAV\URLUtil::splitPath($name); - - $newPath = $parentPath . '/' . $newName; - rename($this->path,$newPath); - - $this->path = $newPath; - - } - - - - /** - * Returns the last modification time, as a unix timestamp - * - * @return int - */ - public function getLastModified() { - - return filemtime($this->path); - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/Directory.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/Directory.php deleted file mode 100755 index ca26db09..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/Directory.php +++ /dev/null @@ -1,159 +0,0 @@ -path . '/' . $name; - file_put_contents($newPath,$data); - - return '"' . md5_file($newPath) . '"'; - - } - - /** - * Creates a new subdirectory - * - * @param string $name - * @return void - */ - public function createDirectory($name) { - - // We're not allowing dots - if ($name=='.' || $name=='..') throw new DAV\Exception\Forbidden('Permission denied to . and ..'); - $newPath = $this->path . '/' . $name; - mkdir($newPath); - - } - - /** - * Returns a specific child node, referenced by its name - * - * This method must throw SabreForRainLoop\DAV\Exception\NotFound if the node does not - * exist. - * - * @param string $name - * @throws DAV\Exception\NotFound - * @return DAV\INode - */ - public function getChild($name) { - - $path = $this->path . '/' . $name; - - if (!file_exists($path)) throw new DAV\Exception\NotFound('File could not be located'); - if ($name=='.' || $name=='..') throw new DAV\Exception\Forbidden('Permission denied to . and ..'); - - if (is_dir($path)) { - - return new Directory($path); - - } else { - - return new File($path); - - } - - } - - /** - * Checks if a child exists. - * - * @param string $name - * @return bool - */ - public function childExists($name) { - - if ($name=='.' || $name=='..') - throw new DAV\Exception\Forbidden('Permission denied to . and ..'); - - $path = $this->path . '/' . $name; - return file_exists($path); - - } - - /** - * Returns an array with all the child nodes - * - * @return DAV\INode[] - */ - public function getChildren() { - - $nodes = array(); - foreach(scandir($this->path) as $node) if($node!='.' && $node!='..' && $node!='.sabredav') $nodes[] = $this->getChild($node); - return $nodes; - - } - - /** - * Deletes all files in this directory, and then itself - * - * @return bool - */ - public function delete() { - - // Deleting all children - foreach($this->getChildren() as $child) $child->delete(); - - // Removing resource info, if its still around - if (file_exists($this->path . '/.sabredav')) unlink($this->path . '/.sabredav'); - - // Removing the directory itself - rmdir($this->path); - - return parent::delete(); - - } - - /** - * Returns available diskspace information - * - * @return array - */ - public function getQuotaInfo() { - - return array( - disk_total_space($this->path)-disk_free_space($this->path), - disk_free_space($this->path) - ); - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/File.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/File.php deleted file mode 100755 index 425637ce..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/File.php +++ /dev/null @@ -1,118 +0,0 @@ -path,$data); - return '"' . md5_file($this->path) . '"'; - - } - - /** - * Updates the data at a given offset - * - * The data argument is a readable stream resource. - * The offset argument is a 0-based offset where the data should be - * written. - * - * param resource|string $data - * @return void - */ - public function putRange($data, $offset) { - - $f = fopen($this->path, 'c'); - fseek($f,$offset-1); - if (is_string($data)) { - fwrite($f, $data); - } else { - stream_copy_to_stream($data,$f); - } - fclose($f); - return '"' . md5_file($this->path) . '"'; - - } - - /** - * Returns the data - * - * @return resource - */ - public function get() { - - return fopen($this->path,'r'); - - } - - /** - * Delete the current file - * - * @return bool - */ - public function delete() { - - unlink($this->path); - return parent::delete(); - - } - - /** - * Returns the ETag for a file - * - * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change. - * The ETag is an arbitrary string, but MUST be surrounded by double-quotes. - * - * Return null if the ETag can not effectively be determined - * - * @return string|null - */ - public function getETag() { - - return '"' . md5_file($this->path). '"'; - - } - - /** - * Returns the mime-type for a file - * - * If null is returned, we'll assume application/octet-stream - * - * @return string|null - */ - public function getContentType() { - - return null; - - } - - /** - * Returns the size of the file, in bytes - * - * @return int - */ - public function getSize() { - - return filesize($this->path); - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/Node.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/Node.php deleted file mode 100755 index 17cd32c8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/FSExt/Node.php +++ /dev/null @@ -1,214 +0,0 @@ -getResourceData(); - - foreach($properties as $propertyName=>$propertyValue) { - - // If it was null, we need to delete the property - if (is_null($propertyValue)) { - if (isset($resourceData['properties'][$propertyName])) { - unset($resourceData['properties'][$propertyName]); - } - } else { - $resourceData['properties'][$propertyName] = $propertyValue; - } - - } - - $this->putResourceData($resourceData); - return true; - } - - /** - * Returns a list of properties for this nodes.; - * - * The properties list is a list of propertynames the client requested, encoded as xmlnamespace#tagName, for example: http://www.example.org/namespace#author - * If the array is empty, all properties should be returned - * - * @param array $properties - * @return array - */ - function getProperties($properties) { - - $resourceData = $this->getResourceData(); - - // if the array was empty, we need to return everything - if (!$properties) return $resourceData['properties']; - - $props = array(); - foreach($properties as $property) { - if (isset($resourceData['properties'][$property])) $props[$property] = $resourceData['properties'][$property]; - } - - return $props; - - } - - /** - * Returns the path to the resource file - * - * @return string - */ - protected function getResourceInfoPath() { - - list($parentDir) = DAV\URLUtil::splitPath($this->path); - return $parentDir . '/.sabredav'; - - } - - /** - * Returns all the stored resource information - * - * @return array - */ - protected function getResourceData() { - - $path = $this->getResourceInfoPath(); - if (!file_exists($path)) return array('properties' => array()); - - // opening up the file, and creating a shared lock - $handle = fopen($path,'r'); - flock($handle,LOCK_SH); - $data = ''; - - // Reading data until the eof - while(!feof($handle)) { - $data.=fread($handle,8192); - } - - // We're all good - fclose($handle); - - // Unserializing and checking if the resource file contains data for this file - $data = unserialize($data); - if (!isset($data[$this->getName()])) { - return array('properties' => array()); - } - - $data = $data[$this->getName()]; - if (!isset($data['properties'])) $data['properties'] = array(); - return $data; - - } - - /** - * Updates the resource information - * - * @param array $newData - * @return void - */ - protected function putResourceData(array $newData) { - - $path = $this->getResourceInfoPath(); - - // opening up the file, and creating a shared lock - $handle = fopen($path,'a+'); - flock($handle,LOCK_EX); - $data = ''; - - rewind($handle); - - // Reading data until the eof - while(!feof($handle)) { - $data.=fread($handle,8192); - } - - // Unserializing and checking if the resource file contains data for this file - $data = unserialize($data); - $data[$this->getName()] = $newData; - ftruncate($handle,0); - rewind($handle); - - fwrite($handle,serialize($data)); - fclose($handle); - - } - - /** - * Renames the node - * - * @param string $name The new name - * @return void - */ - public function setName($name) { - - list($parentPath, ) = DAV\URLUtil::splitPath($this->path); - list(, $newName) = DAV\URLUtil::splitPath($name); - $newPath = $parentPath . '/' . $newName; - - // We're deleting the existing resourcedata, and recreating it - // for the new path. - $resourceData = $this->getResourceData(); - $this->deleteResourceData(); - - rename($this->path,$newPath); - $this->path = $newPath; - $this->putResourceData($resourceData); - - - } - - /** - * @return bool - */ - public function deleteResourceData() { - - // When we're deleting this node, we also need to delete any resource information - $path = $this->getResourceInfoPath(); - if (!file_exists($path)) return true; - - // opening up the file, and creating a shared lock - $handle = fopen($path,'a+'); - flock($handle,LOCK_EX); - $data = ''; - - rewind($handle); - - // Reading data until the eof - while(!feof($handle)) { - $data.=fread($handle,8192); - } - - // Unserializing and checking if the resource file contains data for this file - $data = unserialize($data); - if (isset($data[$this->getName()])) unset($data[$this->getName()]); - ftruncate($handle,0); - rewind($handle); - fwrite($handle,serialize($data)); - fclose($handle); - - return true; - } - - public function delete() { - - return $this->deleteResourceData(); - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/File.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/File.php deleted file mode 100755 index e21d240b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/File.php +++ /dev/null @@ -1,85 +0,0 @@ - array( - * '{DAV:}displayname' => null, - * ), - * 424 => array( - * '{DAV:}owner' => null, - * ) - * ) - * - * In this example it was forbidden to update {DAV:}displayname. - * (403 Forbidden), which in turn also caused {DAV:}owner to fail - * (424 Failed Dependency) because the request needs to be atomic. - * - * @param array $mutations - * @return bool|array - */ - function updateProperties($mutations); - - /** - * Returns a list of properties for this nodes. - * - * The properties list is a list of propertynames the client requested, - * encoded in clark-notation {xmlnamespace}tagname - * - * If the array is empty, it means 'all properties' were requested. - * - * Note that it's fine to liberally give properties back, instead of - * conforming to the list of requested properties. - * The Server class will filter out the extra. - * - * @param array $properties - * @return void - */ - function getProperties($properties); - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/IQuota.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/IQuota.php deleted file mode 100755 index dd42fc51..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/IQuota.php +++ /dev/null @@ -1,27 +0,0 @@ -dataDir = $dataDir; - - } - - protected function getFileNameForUri($uri) { - - return $this->dataDir . '/sabredav_' . md5($uri) . '.locks'; - - } - - - /** - * Returns a list of SabreForRainLoop\DAV\Locks\LockInfo objects - * - * This method should return all the locks for a particular uri, including - * locks that might be set on a parent uri. - * - * If returnChildLocks is set to true, this method should also look for - * any locks in the subtree of the uri for locks. - * - * @param string $uri - * @param bool $returnChildLocks - * @return array - */ - public function getLocks($uri, $returnChildLocks) { - - $lockList = array(); - $currentPath = ''; - - foreach(explode('/',$uri) as $uriPart) { - - // weird algorithm that can probably be improved, but we're traversing the path top down - if ($currentPath) $currentPath.='/'; - $currentPath.=$uriPart; - - $uriLocks = $this->getData($currentPath); - - foreach($uriLocks as $uriLock) { - - // Unless we're on the leaf of the uri-tree we should ignore locks with depth 0 - if($uri==$currentPath || $uriLock->depth!=0) { - $uriLock->uri = $currentPath; - $lockList[] = $uriLock; - } - - } - - } - - // Checking if we can remove any of these locks - foreach($lockList as $k=>$lock) { - if (time() > $lock->timeout + $lock->created) unset($lockList[$k]); - } - return $lockList; - - } - - /** - * Locks a uri - * - * @param string $uri - * @param LockInfo $lockInfo - * @return bool - */ - public function lock($uri, LockInfo $lockInfo) { - - // We're making the lock timeout 30 minutes - $lockInfo->timeout = 1800; - $lockInfo->created = time(); - - $locks = $this->getLocks($uri,false); - foreach($locks as $k=>$lock) { - if ($lock->token == $lockInfo->token) unset($locks[$k]); - } - $locks[] = $lockInfo; - $this->putData($uri,$locks); - return true; - - } - - /** - * Removes a lock from a uri - * - * @param string $uri - * @param LockInfo $lockInfo - * @return bool - */ - public function unlock($uri, LockInfo $lockInfo) { - - $locks = $this->getLocks($uri,false); - foreach($locks as $k=>$lock) { - - if ($lock->token == $lockInfo->token) { - - unset($locks[$k]); - $this->putData($uri,$locks); - return true; - - } - } - return false; - - } - - /** - * Returns the stored data for a uri - * - * @param string $uri - * @return array - */ - protected function getData($uri) { - - $path = $this->getFilenameForUri($uri); - if (!file_exists($path)) return array(); - - // opening up the file, and creating a shared lock - $handle = fopen($path,'r'); - flock($handle,LOCK_SH); - $data = ''; - - // Reading data until the eof - while(!feof($handle)) { - $data.=fread($handle,8192); - } - - // We're all good - fclose($handle); - - // Unserializing and checking if the resource file contains data for this file - $data = unserialize($data); - if (!$data) return array(); - return $data; - - } - - /** - * Updates the lock information - * - * @param string $uri - * @param array $newData - * @return void - */ - protected function putData($uri,array $newData) { - - $path = $this->getFileNameForUri($uri); - - // opening up the file, and creating a shared lock - $handle = fopen($path,'a+'); - flock($handle,LOCK_EX); - ftruncate($handle,0); - rewind($handle); - - fwrite($handle,serialize($newData)); - fclose($handle); - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/File.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/File.php deleted file mode 100755 index b4050859..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/File.php +++ /dev/null @@ -1,183 +0,0 @@ -locksFile = $locksFile; - - } - - /** - * Returns a list of SabreForRainLoop\DAV\Locks\LockInfo objects - * - * This method should return all the locks for a particular uri, including - * locks that might be set on a parent uri. - * - * If returnChildLocks is set to true, this method should also look for - * any locks in the subtree of the uri for locks. - * - * @param string $uri - * @param bool $returnChildLocks - * @return array - */ - public function getLocks($uri, $returnChildLocks) { - - $newLocks = array(); - - $locks = $this->getData(); - - foreach($locks as $lock) { - - if ($lock->uri === $uri || - //deep locks on parents - ($lock->depth!=0 && strpos($uri, $lock->uri . '/')===0) || - - // locks on children - ($returnChildLocks && (strpos($lock->uri, $uri . '/')===0)) ) { - - $newLocks[] = $lock; - - } - - } - - // Checking if we can remove any of these locks - foreach($newLocks as $k=>$lock) { - if (time() > $lock->timeout + $lock->created) unset($newLocks[$k]); - } - return $newLocks; - - } - - /** - * Locks a uri - * - * @param string $uri - * @param LockInfo $lockInfo - * @return bool - */ - public function lock($uri, LockInfo $lockInfo) { - - // We're making the lock timeout 30 minutes - $lockInfo->timeout = 1800; - $lockInfo->created = time(); - $lockInfo->uri = $uri; - - $locks = $this->getData(); - - foreach($locks as $k=>$lock) { - if ( - ($lock->token == $lockInfo->token) || - (time() > $lock->timeout + $lock->created) - ) { - unset($locks[$k]); - } - } - $locks[] = $lockInfo; - $this->putData($locks); - return true; - - } - - /** - * Removes a lock from a uri - * - * @param string $uri - * @param LockInfo $lockInfo - * @return bool - */ - public function unlock($uri, LockInfo $lockInfo) { - - $locks = $this->getData(); - foreach($locks as $k=>$lock) { - - if ($lock->token == $lockInfo->token) { - - unset($locks[$k]); - $this->putData($locks); - return true; - - } - } - return false; - - } - - /** - * Loads the lockdata from the filesystem. - * - * @return array - */ - protected function getData() { - - if (!file_exists($this->locksFile)) return array(); - - // opening up the file, and creating a shared lock - $handle = fopen($this->locksFile,'r'); - flock($handle,LOCK_SH); - - // Reading data until the eof - $data = stream_get_contents($handle); - - // We're all good - fclose($handle); - - // Unserializing and checking if the resource file contains data for this file - $data = unserialize($data); - if (!$data) return array(); - return $data; - - } - - /** - * Saves the lockdata - * - * @param array $newData - * @return void - */ - protected function putData(array $newData) { - - // opening up the file, and creating an exclusive lock - $handle = fopen($this->locksFile,'a+'); - flock($handle,LOCK_EX); - - // We can only truncate and rewind once the lock is acquired. - ftruncate($handle,0); - rewind($handle); - - fwrite($handle,serialize($newData)); - fclose($handle); - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/PDO.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/PDO.php deleted file mode 100755 index 27185333..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/PDO.php +++ /dev/null @@ -1,167 +0,0 @@ -pdo = $pdo; - $this->tableName = $tableName; - - } - - /** - * Returns a list of SabreForRainLoop\DAV\Locks\LockInfo objects - * - * This method should return all the locks for a particular uri, including - * locks that might be set on a parent uri. - * - * If returnChildLocks is set to true, this method should also look for - * any locks in the subtree of the uri for locks. - * - * @param string $uri - * @param bool $returnChildLocks - * @return array - */ - public function getLocks($uri, $returnChildLocks) { - - // NOTE: the following 10 lines or so could be easily replaced by - // pure sql. MySQL's non-standard string concatenation prevents us - // from doing this though. - $query = 'SELECT owner, token, timeout, created, scope, depth, uri FROM '.$this->tableName.' WHERE ((created + timeout) > CAST(? AS UNSIGNED INTEGER)) AND ((uri = ?)'; - $params = array(time(),$uri); - - // We need to check locks for every part in the uri. - $uriParts = explode('/',$uri); - - // We already covered the last part of the uri - array_pop($uriParts); - - $currentPath=''; - - foreach($uriParts as $part) { - - if ($currentPath) $currentPath.='/'; - $currentPath.=$part; - - $query.=' OR (depth!=0 AND uri = ?)'; - $params[] = $currentPath; - - } - - if ($returnChildLocks) { - - $query.=' OR (uri LIKE ?)'; - $params[] = $uri . '/%'; - - } - $query.=')'; - - $stmt = $this->pdo->prepare($query); - $stmt->execute($params); - $result = $stmt->fetchAll(); - - $lockList = array(); - foreach($result as $row) { - - $lockInfo = new LockInfo(); - $lockInfo->owner = $row['owner']; - $lockInfo->token = $row['token']; - $lockInfo->timeout = $row['timeout']; - $lockInfo->created = $row['created']; - $lockInfo->scope = $row['scope']; - $lockInfo->depth = $row['depth']; - $lockInfo->uri = $row['uri']; - $lockList[] = $lockInfo; - - } - - return $lockList; - - } - - /** - * Locks a uri - * - * @param string $uri - * @param LockInfo $lockInfo - * @return bool - */ - public function lock($uri, LockInfo $lockInfo) { - - // We're making the lock timeout 30 minutes - $lockInfo->timeout = 30*60; - $lockInfo->created = time(); - $lockInfo->uri = $uri; - - $locks = $this->getLocks($uri,false); - $exists = false; - foreach($locks as $lock) { - if ($lock->token == $lockInfo->token) $exists = true; - } - - if ($exists) { - $stmt = $this->pdo->prepare('UPDATE '.$this->tableName.' SET owner = ?, timeout = ?, scope = ?, depth = ?, uri = ?, created = ? WHERE token = ?'); - $stmt->execute(array($lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,$lockInfo->token)); - } else { - $stmt = $this->pdo->prepare('INSERT INTO '.$this->tableName.' (owner,timeout,scope,depth,uri,created,token) VALUES (?,?,?,?,?,?,?)'); - $stmt->execute(array($lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,$lockInfo->token)); - } - - return true; - - } - - - - /** - * Removes a lock from a uri - * - * @param string $uri - * @param LockInfo $lockInfo - * @return bool - */ - public function unlock($uri, LockInfo $lockInfo) { - - $stmt = $this->pdo->prepare('DELETE FROM '.$this->tableName.' WHERE uri = ? AND token = ?'); - $stmt->execute(array($uri,$lockInfo->token)); - - return $stmt->rowCount()===1; - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/LockInfo.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/LockInfo.php deleted file mode 100755 index 894ac574..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Locks/LockInfo.php +++ /dev/null @@ -1,81 +0,0 @@ -addPlugin($lockPlugin); - * - * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/). - * @author Evert Pot (http://evertpot.com/) - * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License - */ -class Plugin extends DAV\ServerPlugin { - - /** - * locksBackend - * - * @var Backend\Backend\Interface - */ - protected $locksBackend; - - /** - * server - * - * @var SabreForRainLoop\DAV\Server - */ - protected $server; - - /** - * __construct - * - * @param Backend\BackendInterface $locksBackend - */ - public function __construct(Backend\BackendInterface $locksBackend = null) { - - $this->locksBackend = $locksBackend; - - } - - /** - * Initializes the plugin - * - * This method is automatically called by the Server class after addPlugin. - * - * @param DAV\Server $server - * @return void - */ - public function initialize(DAV\Server $server) { - - $this->server = $server; - $server->subscribeEvent('unknownMethod',array($this,'unknownMethod')); - $server->subscribeEvent('beforeMethod',array($this,'beforeMethod'),50); - $server->subscribeEvent('afterGetProperties',array($this,'afterGetProperties')); - - } - - /** - * Returns a plugin name. - * - * Using this name other plugins will be able to access other plugins - * using SabreForRainLoop\DAV\Server::getPlugin - * - * @return string - */ - public function getPluginName() { - - return 'locks'; - - } - - /** - * This method is called by the Server if the user used an HTTP method - * the server didn't recognize. - * - * This plugin intercepts the LOCK and UNLOCK methods. - * - * @param string $method - * @param string $uri - * @return bool - */ - public function unknownMethod($method, $uri) { - - switch($method) { - - case 'LOCK' : $this->httpLock($uri); return false; - case 'UNLOCK' : $this->httpUnlock($uri); return false; - - } - - } - - /** - * This method is called after most properties have been found - * it allows us to add in any Lock-related properties - * - * @param string $path - * @param array $newProperties - * @return bool - */ - public function afterGetProperties($path, &$newProperties) { - - foreach($newProperties[404] as $propName=>$discard) { - - switch($propName) { - - case '{DAV:}supportedlock' : - $val = false; - if ($this->locksBackend) $val = true; - $newProperties[200][$propName] = new DAV\Property\SupportedLock($val); - unset($newProperties[404][$propName]); - break; - - case '{DAV:}lockdiscovery' : - $newProperties[200][$propName] = new DAV\Property\LockDiscovery($this->getLocks($path)); - unset($newProperties[404][$propName]); - break; - - } - - - } - return true; - - } - - - /** - * This method is called before the logic for any HTTP method is - * handled. - * - * This plugin uses that feature to intercept access to locked resources. - * - * @param string $method - * @param string $uri - * @return bool - */ - public function beforeMethod($method, $uri) { - - switch($method) { - - case 'DELETE' : - $lastLock = null; - if (!$this->validateLock($uri,$lastLock, true)) - throw new DAV\Exception\Locked($lastLock); - break; - case 'MKCOL' : - case 'PROPPATCH' : - case 'PUT' : - case 'PATCH' : - $lastLock = null; - if (!$this->validateLock($uri,$lastLock)) - throw new DAV\Exception\Locked($lastLock); - break; - case 'MOVE' : - $lastLock = null; - if (!$this->validateLock(array( - $uri, - $this->server->calculateUri($this->server->httpRequest->getHeader('Destination')), - ),$lastLock, true)) - throw new DAV\Exception\Locked($lastLock); - break; - case 'COPY' : - $lastLock = null; - if (!$this->validateLock( - $this->server->calculateUri($this->server->httpRequest->getHeader('Destination')), - $lastLock, true)) - throw new DAV\Exception\Locked($lastLock); - break; - } - - return true; - - } - - /** - * Use this method to tell the server this plugin defines additional - * HTTP methods. - * - * This method is passed a uri. It should only return HTTP methods that are - * available for the specified uri. - * - * @param string $uri - * @return array - */ - public function getHTTPMethods($uri) { - - if ($this->locksBackend) - return array('LOCK','UNLOCK'); - - return array(); - - } - - /** - * Returns a list of features for the HTTP OPTIONS Dav: header. - * - * In this case this is only the number 2. The 2 in the Dav: header - * indicates the server supports locks. - * - * @return array - */ - public function getFeatures() { - - return array(2); - - } - - /** - * Returns all lock information on a particular uri - * - * This function should return an array with SabreForRainLoop\DAV\Locks\LockInfo objects. If there are no locks on a file, return an empty array. - * - * Additionally there is also the possibility of locks on parent nodes, so we'll need to traverse every part of the tree - * If the $returnChildLocks argument is set to true, we'll also traverse all the children of the object - * for any possible locks and return those as well. - * - * @param string $uri - * @param bool $returnChildLocks - * @return array - */ - public function getLocks($uri, $returnChildLocks = false) { - - $lockList = array(); - - if ($this->locksBackend) - $lockList = array_merge($lockList,$this->locksBackend->getLocks($uri, $returnChildLocks)); - - return $lockList; - - } - - /** - * Locks an uri - * - * The WebDAV lock request can be operated to either create a new lock on a file, or to refresh an existing lock - * If a new lock is created, a full XML body should be supplied, containing information about the lock such as the type - * of lock (shared or exclusive) and the owner of the lock - * - * If a lock is to be refreshed, no body should be supplied and there should be a valid If header containing the lock - * - * Additionally, a lock can be requested for a non-existent file. In these case we're obligated to create an empty file as per RFC4918:S7.3 - * - * @param string $uri - * @return void - */ - protected function httpLock($uri) { - - $lastLock = null; - if (!$this->validateLock($uri,$lastLock)) { - - // If the existing lock was an exclusive lock, we need to fail - if (!$lastLock || $lastLock->scope == LockInfo::EXCLUSIVE) { - //var_dump($lastLock); - throw new DAV\Exception\ConflictingLock($lastLock); - } - - } - - if ($body = $this->server->httpRequest->getBody(true)) { - // This is a new lock request - $lockInfo = $this->parseLockRequest($body); - $lockInfo->depth = $this->server->getHTTPDepth(); - $lockInfo->uri = $uri; - if($lastLock && $lockInfo->scope != LockInfo::SHARED) throw new DAV\Exception\ConflictingLock($lastLock); - - } elseif ($lastLock) { - - // This must have been a lock refresh - $lockInfo = $lastLock; - - // The resource could have been locked through another uri. - if ($uri!=$lockInfo->uri) $uri = $lockInfo->uri; - - } else { - - // There was neither a lock refresh nor a new lock request - throw new DAV\Exception\BadRequest('An xml body is required for lock requests'); - - } - - if ($timeout = $this->getTimeoutHeader()) $lockInfo->timeout = $timeout; - - $newFile = false; - - // If we got this far.. we should go check if this node actually exists. If this is not the case, we need to create it first - try { - $this->server->tree->getNodeForPath($uri); - - // We need to call the beforeWriteContent event for RFC3744 - // Edit: looks like this is not used, and causing problems now. - // - // See Issue 222 - // $this->server->broadcastEvent('beforeWriteContent',array($uri)); - - } catch (DAV\Exception\NotFound $e) { - - // It didn't, lets create it - $this->server->createFile($uri,fopen('php://memory','r')); - $newFile = true; - - } - - $this->lockNode($uri,$lockInfo); - - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->setHeader('Lock-Token','token . '>'); - $this->server->httpResponse->sendStatus($newFile?201:200); - $this->server->httpResponse->sendBody($this->generateLockResponse($lockInfo)); - - } - - /** - * Unlocks a uri - * - * This WebDAV method allows you to remove a lock from a node. The client should provide a valid locktoken through the Lock-token http header - * The server should return 204 (No content) on success - * - * @param string $uri - * @return void - */ - protected function httpUnlock($uri) { - - $lockToken = $this->server->httpRequest->getHeader('Lock-Token'); - - // If the locktoken header is not supplied, we need to throw a bad request exception - if (!$lockToken) throw new DAV\Exception\BadRequest('No lock token was supplied'); - - $locks = $this->getLocks($uri); - - // Windows sometimes forgets to include < and > in the Lock-Token - // header - if ($lockToken[0]!=='<') $lockToken = '<' . $lockToken . '>'; - - foreach($locks as $lock) { - - if ('token . '>' == $lockToken) { - - $this->unlockNode($uri,$lock); - $this->server->httpResponse->setHeader('Content-Length','0'); - $this->server->httpResponse->sendStatus(204); - return; - - } - - } - - // If we got here, it means the locktoken was invalid - throw new DAV\Exception\LockTokenMatchesRequestUri(); - - } - - /** - * Locks a uri - * - * All the locking information is supplied in the lockInfo object. The object has a suggested timeout, but this can be safely ignored - * It is important that if the existing timeout is ignored, the property is overwritten, as this needs to be sent back to the client - * - * @param string $uri - * @param LockInfo $lockInfo - * @return bool - */ - public function lockNode($uri,LockInfo $lockInfo) { - - if (!$this->server->broadcastEvent('beforeLock',array($uri,$lockInfo))) return; - - if ($this->locksBackend) return $this->locksBackend->lock($uri,$lockInfo); - throw new DAV\Exception\MethodNotAllowed('Locking support is not enabled for this resource. No Locking backend was found so if you didn\'t expect this error, please check your configuration.'); - - } - - /** - * Unlocks a uri - * - * This method removes a lock from a uri. It is assumed all the supplied information is correct and verified - * - * @param string $uri - * @param LockInfo $lockInfo - * @return bool - */ - public function unlockNode($uri, LockInfo $lockInfo) { - - if (!$this->server->broadcastEvent('beforeUnlock',array($uri,$lockInfo))) return; - if ($this->locksBackend) return $this->locksBackend->unlock($uri,$lockInfo); - - } - - - /** - * Returns the contents of the HTTP Timeout header. - * - * The method formats the header into an integer. - * - * @return int - */ - public function getTimeoutHeader() { - - $header = $this->server->httpRequest->getHeader('Timeout'); - - if ($header) { - - if (stripos($header,'second-')===0) $header = (int)(substr($header,7)); - else if (strtolower($header)=='infinite') $header = LockInfo::TIMEOUT_INFINITE; - else throw new DAV\Exception\BadRequest('Invalid HTTP timeout header'); - - } else { - - $header = 0; - - } - - return $header; - - } - - /** - * Generates the response for successful LOCK requests - * - * @param LockInfo $lockInfo - * @return string - */ - protected function generateLockResponse(LockInfo $lockInfo) { - - $dom = new \DOMDocument('1.0','utf-8'); - $dom->formatOutput = true; - - $prop = $dom->createElementNS('DAV:','d:prop'); - $dom->appendChild($prop); - - $lockDiscovery = $dom->createElementNS('DAV:','d:lockdiscovery'); - $prop->appendChild($lockDiscovery); - - $lockObj = new DAV\Property\LockDiscovery(array($lockInfo),true); - $lockObj->serialize($this->server,$lockDiscovery); - - return $dom->saveXML(); - - } - - /** - * validateLock should be called when a write operation is about to happen - * It will check if the requested url is locked, and see if the correct lock tokens are passed - * - * @param mixed $urls List of relevant urls. Can be an array, a string or nothing at all for the current request uri - * @param mixed $lastLock This variable will be populated with the last checked lock object (SabreForRainLoop\DAV\Locks\LockInfo) - * @param bool $checkChildLocks If set to true, this function will also look for any locks set on child resources of the supplied urls. This is needed for for example deletion of entire trees. - * @return bool - */ - protected function validateLock($urls = null,&$lastLock = null, $checkChildLocks = false) { - - if (is_null($urls)) { - $urls = array($this->server->getRequestUri()); - } elseif (is_string($urls)) { - $urls = array($urls); - } elseif (!is_array($urls)) { - throw new DAV\Exception('The urls parameter should either be null, a string or an array'); - } - - $conditions = $this->getIfConditions(); - - // We're going to loop through the urls and make sure all lock conditions are satisfied - foreach($urls as $url) { - - $locks = $this->getLocks($url, $checkChildLocks); - - // If there were no conditions, but there were locks, we fail - if (!$conditions && $locks) { - reset($locks); - $lastLock = current($locks); - return false; - } - - // If there were no locks or conditions, we go to the next url - if (!$locks && !$conditions) continue; - - foreach($conditions as $condition) { - - if (!$condition['uri']) { - $conditionUri = $this->server->getRequestUri(); - } else { - $conditionUri = $this->server->calculateUri($condition['uri']); - } - - // If the condition has a url, and it isn't part of the affected url at all, check the next condition - if ($conditionUri && strpos($url,$conditionUri)!==0) continue; - - // The tokens array contians arrays with 2 elements. 0=true/false for normal/not condition, 1=locktoken - // At least 1 condition has to be satisfied - foreach($condition['tokens'] as $conditionToken) { - - $etagValid = true; - $lockValid = true; - - // key 2 can contain an etag - if ($conditionToken[2]) { - - $uri = $conditionUri?$conditionUri:$this->server->getRequestUri(); - $node = $this->server->tree->getNodeForPath($uri); - $etagValid = $node->getETag()==$conditionToken[2]; - - } - - // key 1 can contain a lock token - if ($conditionToken[1]) { - - $lockValid = false; - // Match all the locks - foreach($locks as $lockIndex=>$lock) { - - $lockToken = 'opaquelocktoken:' . $lock->token; - - // Checking NOT - if (!$conditionToken[0] && $lockToken != $conditionToken[1]) { - - // Condition valid, onto the next - $lockValid = true; - break; - } - if ($conditionToken[0] && $lockToken == $conditionToken[1]) { - - $lastLock = $lock; - // Condition valid and lock matched - unset($locks[$lockIndex]); - $lockValid = true; - break; - - } - - } - - } - - // If, after checking both etags and locks they are stil valid, - // we can continue with the next condition. - if ($etagValid && $lockValid) continue 2; - } - // No conditions matched, so we fail - throw new DAV\Exception\PreconditionFailed('The tokens provided in the if header did not match','If'); - } - - // Conditions were met, we'll also need to check if all the locks are gone - if (count($locks)) { - - reset($locks); - - // There's still locks, we fail - $lastLock = current($locks); - return false; - - } - - - } - - // We got here, this means every condition was satisfied - return true; - - } - - /** - * This method is created to extract information from the WebDAV HTTP 'If:' header - * - * The If header can be quite complex, and has a bunch of features. We're using a regex to extract all relevant information - * The function will return an array, containing structs with the following keys - * - * * uri - the uri the condition applies to. If this is returned as an - * empty string, this implies it's referring to the request url. - * * tokens - The lock token. another 2 dimensional array containing 2 elements (0 = true/false.. If this is a negative condition its set to false, 1 = the actual token) - * * etag - an etag, if supplied - * - * @return array - */ - public function getIfConditions() { - - $header = $this->server->httpRequest->getHeader('If'); - if (!$header) return array(); - - $matches = array(); - - $regex = '/(?:\<(?P.*?)\>\s)?\((?PNot\s)?(?:\<(?P[^\>]*)\>)?(?:\s?)(?:\[(?P[^\]]*)\])?\)/im'; - preg_match_all($regex,$header,$matches,PREG_SET_ORDER); - - $conditions = array(); - - foreach($matches as $match) { - - $condition = array( - 'uri' => $match['uri'], - 'tokens' => array( - array($match['not']?0:1,$match['token'],isset($match['etag'])?$match['etag']:'') - ), - ); - - if (!$condition['uri'] && count($conditions)) $conditions[count($conditions)-1]['tokens'][] = array( - $match['not']?0:1, - $match['token'], - isset($match['etag'])?$match['etag']:'' - ); - else { - $conditions[] = $condition; - } - - } - - return $conditions; - - } - - /** - * Parses a webdav lock xml body, and returns a new SabreForRainLoop\DAV\Locks\LockInfo object - * - * @param string $body - * @return DAV\Locks\LockInfo - */ - protected function parseLockRequest($body) { - - $xml = simplexml_load_string( - DAV\XMLUtil::convertDAVNamespace($body), - null, - LIBXML_NOWARNING); - $xml->registerXPathNamespace('d','urn:DAV'); - $lockInfo = new LockInfo(); - - $children = $xml->children("urn:DAV"); - $lockInfo->owner = (string)$children->owner; - - $lockInfo->token = DAV\UUIDUtil::getUUID(); - $lockInfo->scope = count($xml->xpath('d:lockscope/d:exclusive'))>0 ? LockInfo::EXCLUSIVE : LockInfo::SHARED; - - return $lockInfo; - - } - - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Mount/Plugin.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Mount/Plugin.php deleted file mode 100755 index 4959f012..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Mount/Plugin.php +++ /dev/null @@ -1,83 +0,0 @@ -server = $server; - $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90); - - } - - /** - * 'beforeMethod' event handles. This event handles intercepts GET requests ending - * with ?mount - * - * @param string $method - * @param string $uri - * @return bool - */ - public function beforeMethod($method, $uri) { - - if ($method!='GET') return; - if ($this->server->httpRequest->getQueryString()!='mount') return; - - $currentUri = $this->server->httpRequest->getAbsoluteUri(); - - // Stripping off everything after the ? - list($currentUri) = explode('?',$currentUri); - - $this->davMount($currentUri); - - // Returning false to break the event chain - return false; - - } - - /** - * Generates the davmount response - * - * @param string $uri absolute uri - * @return void - */ - public function davMount($uri) { - - $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->setHeader('Content-Type','application/davmount+xml'); - ob_start(); - echo '', "\n"; - echo "\n"; - echo " ", htmlspecialchars($uri, ENT_NOQUOTES, 'UTF-8'), "\n"; - echo ""; - $this->server->httpResponse->sendBody(ob_get_clean()); - - } - - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Node.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Node.php deleted file mode 100755 index 52e460e2..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Node.php +++ /dev/null @@ -1,55 +0,0 @@ -rootNode = $rootNode; - - } - - /** - * Returns the INode object for the requested path - * - * @param string $path - * @return INode - */ - public function getNodeForPath($path) { - - $path = trim($path,'/'); - if (isset($this->cache[$path])) return $this->cache[$path]; - - // Is it the root node? - if (!strlen($path)) { - return $this->rootNode; - } - - // Attempting to fetch its parent - list($parentName, $baseName) = URLUtil::splitPath($path); - - // If there was no parent, we must simply ask it from the root node. - if ($parentName==="") { - $node = $this->rootNode->getChild($baseName); - } else { - // Otherwise, we recursively grab the parent and ask him/her. - $parent = $this->getNodeForPath($parentName); - - if (!($parent instanceof ICollection)) - throw new Exception\NotFound('Could not find node at path: ' . $path); - - $node = $parent->getChild($baseName); - - } - - $this->cache[$path] = $node; - return $node; - - } - - /** - * This function allows you to check if a node exists. - * - * @param string $path - * @return bool - */ - public function nodeExists($path) { - - try { - - // The root always exists - if ($path==='') return true; - - list($parent, $base) = URLUtil::splitPath($path); - - $parentNode = $this->getNodeForPath($parent); - if (!$parentNode instanceof ICollection) return false; - return $parentNode->childExists($base); - - } catch (Exception\NotFound $e) { - - return false; - - } - - } - - /** - * Returns a list of childnodes for a given path. - * - * @param string $path - * @return array - */ - public function getChildren($path) { - - $node = $this->getNodeForPath($path); - $children = $node->getChildren(); - foreach($children as $child) { - - $this->cache[trim($path,'/') . '/' . $child->getName()] = $child; - - } - return $children; - - } - - /** - * This method is called with every tree update - * - * Examples of tree updates are: - * * node deletions - * * node creations - * * copy - * * move - * * renaming nodes - * - * If Tree classes implement a form of caching, this will allow - * them to make sure caches will be expired. - * - * If a path is passed, it is assumed that the entire subtree is dirty - * - * @param string $path - * @return void - */ - public function markDirty($path) { - - // We don't care enough about sub-paths - // flushing the entire cache - $path = trim($path,'/'); - foreach($this->cache as $nodePath=>$node) { - if ($nodePath == $path || strpos($nodePath,$path.'/')===0) - unset($this->cache[$nodePath]); - - } - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/PartialUpdate/IFile.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/PartialUpdate/IFile.php deleted file mode 100755 index a3eee51e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/PartialUpdate/IFile.php +++ /dev/null @@ -1,40 +0,0 @@ -addPlugin($patchPlugin); - * - * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/). - * @author Jean-Tiare LE BIGOT (http://www.jtlebi.fr/) - * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License - */ -class Plugin extends DAV\ServerPlugin { - - /** - * Reference to server - * - * @var SabreForRainLoop\DAV\Server - */ - protected $server; - - /** - * Initializes the plugin - * - * This method is automatically called by the Server class after addPlugin. - * - * @param DAV\Server $server - * @return void - */ - public function initialize(DAV\Server $server) { - - $this->server = $server; - $server->subscribeEvent('unknownMethod',array($this,'unknownMethod')); - - } - - /** - * Returns a plugin name. - * - * Using this name other plugins will be able to access other plugins - * using DAV\Server::getPlugin - * - * @return string - */ - public function getPluginName() { - - return 'partialupdate'; - - } - - /** - * This method is called by the Server if the user used an HTTP method - * the server didn't recognize. - * - * This plugin intercepts the PATCH methods. - * - * @param string $method - * @param string $uri - * @return bool|null - */ - public function unknownMethod($method, $uri) { - - switch($method) { - - case 'PATCH': - return $this->httpPatch($uri); - - } - - } - - /** - * Use this method to tell the server this plugin defines additional - * HTTP methods. - * - * This method is passed a uri. It should only return HTTP methods that are - * available for the specified uri. - * - * We claim to support PATCH method (partial update) if and only if - * - the node exist - * - the node implements our partial update interface - * - * @param string $uri - * @return array - */ - public function getHTTPMethods($uri) { - - $tree = $this->server->tree; - - if ($tree->nodeExists($uri) && - $tree->getNodeForPath($uri) instanceof IFile) { - return array('PATCH'); - } - - return array(); - - } - - /** - * Returns a list of features for the HTTP OPTIONS Dav: header. - * - * @return array - */ - public function getFeatures() { - - return array('sabredav-partialupdate'); - - } - - /** - * Patch an uri - * - * The WebDAV patch request can be used to modify only a part of an - * existing resource. If the resource does not exist yet and the first - * offset is not 0, the request fails - * - * @param string $uri - * @return void - */ - protected function httpPatch($uri) { - - // Get the node. Will throw a 404 if not found - $node = $this->server->tree->getNodeForPath($uri); - if (!($node instanceof IFile)) { - throw new DAV\Exception\MethodNotAllowed('The target resource does not support the PATCH method.'); - } - - $range = $this->getHTTPUpdateRange(); - - if (!$range) { - throw new DAV\Exception\BadRequest('No valid "X-Update-Range" found in the headers'); - } - - $contentType = strtolower( - $this->server->httpRequest->getHeader('Content-Type') - ); - - if ($contentType != 'application/x-sabredav-partialupdate') { - throw new DAV\Exception\UnsupportedMediaType('Unknown Content-Type header "' . $contentType . '"'); - } - - $len = $this->server->httpRequest->getHeader('Content-Length'); - - // Load the begin and end data - $start = ($range[0])?$range[0]:0; - $end = ($range[1])?$range[1]:$len-1; - - // Check consistency - if($end < $start) - throw new DAV\Exception\RequestedRangeNotSatisfiable('The end offset (' . $range[1] . ') is lower than the start offset (' . $range[0] . ')'); - if($end - $start + 1 != $len) - throw new DAV\Exception\RequestedRangeNotSatisfiable('Actual data length (' . $len . ') is not consistent with begin (' . $range[0] . ') and end (' . $range[1] . ') offsets'); - - // Checking If-None-Match and related headers. - if (!$this->server->checkPreconditions()) return; - - if (!$this->server->broadcastEvent('beforeWriteContent',array($uri, $node, null))) - return; - - $body = $this->server->httpRequest->getBody(); - $etag = $node->putRange($body, $start-1); - - $this->server->broadcastEvent('afterWriteContent',array($uri, $node)); - - $this->server->httpResponse->setHeader('Content-Length','0'); - if ($etag) $this->server->httpResponse->setHeader('ETag',$etag); - $this->server->httpResponse->sendStatus(204); - - return false; - - } - - /** - * Returns the HTTP custom range update header - * - * This method returns null if there is no well-formed HTTP range request - * header or array($start, $end). - * - * The first number is the offset of the first byte in the range. - * The second number is the offset of the last byte in the range. - * - * If the second offset is null, it should be treated as the offset of the last byte of the entity - * If the first offset is null, the second offset should be used to retrieve the last x bytes of the entity - * - * @return array|null - */ - public function getHTTPUpdateRange() { - - $range = $this->server->httpRequest->getHeader('X-Update-Range'); - if (is_null($range)) return null; - - // Matching "Range: bytes=1234-5678: both numbers are optional - - if (!preg_match('/^bytes=([0-9]*)-([0-9]*)$/i',$range,$matches)) return null; - - if ($matches[1]==='' && $matches[2]==='') return null; - - return array( - $matches[1]!==''?$matches[1]:null, - $matches[2]!==''?$matches[2]:null, - ); - - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property.php deleted file mode 100755 index 36d4ea69..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property.php +++ /dev/null @@ -1,31 +0,0 @@ -time = $time; - } elseif (is_int($time) || ctype_digit($time)) { - $this->time = new \DateTime('@' . $time); - } else { - $this->time = new \DateTime($time); - } - - // Setting timezone to UTC - $this->time->setTimezone(new \DateTimeZone('UTC')); - - } - - /** - * serialize - * - * @param DAV\Server $server - * @param \DOMElement $prop - * @return void - */ - public function serialize(DAV\Server $server, \DOMElement $prop) { - - $doc = $prop->ownerDocument; - //$prop->setAttribute('xmlns:b','urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/'); - //$prop->setAttribute('b:dt','dateTime.rfc1123'); - $prop->nodeValue = HTTP\Util::toHTTPDate($this->time); - - } - - /** - * getTime - * - * @return \DateTime - */ - public function getTime() { - - return $this->time; - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/Href.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/Href.php deleted file mode 100755 index 71dcc244..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/Href.php +++ /dev/null @@ -1,99 +0,0 @@ -href = $href; - $this->autoPrefix = $autoPrefix; - - } - - /** - * Returns the uri - * - * @return string - */ - public function getHref() { - - return $this->href; - - } - - /** - * Serializes this property. - * - * It will additionally prepend the href property with the server's base uri. - * - * @param DAV\Server $server - * @param \DOMElement $dom - * @return void - */ - public function serialize(DAV\Server $server, \DOMElement $dom) { - - $prefix = $server->xmlNamespaces['DAV:']; - $elem = $dom->ownerDocument->createElement($prefix . ':href'); - - if ($this->autoPrefix) { - $value = $server->getBaseUri() . DAV\URLUtil::encodePath($this->href); - } else { - $value = $this->href; - } - $elem->appendChild($dom->ownerDocument->createTextNode($value)); - - $dom->appendChild($elem); - - } - - /** - * Unserializes this property from a DOM Element - * - * This method returns an instance of this class. - * It will only decode {DAV:}href values. For non-compatible elements null will be returned. - * - * @param \DOMElement $dom - * @return DAV\Property\Href - */ - static function unserialize(\DOMElement $dom) { - - if ($dom->firstChild && DAV\XMLUtil::toClarkNotation($dom->firstChild)==='{DAV:}href') { - return new self($dom->firstChild->textContent,false); - } - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/HrefList.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/HrefList.php deleted file mode 100755 index 05ba266a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/HrefList.php +++ /dev/null @@ -1,105 +0,0 @@ -hrefs = $hrefs; - $this->autoPrefix = $autoPrefix; - - } - - /** - * Returns the uris - * - * @return array - */ - public function getHrefs() { - - return $this->hrefs; - - } - - /** - * Serializes this property. - * - * It will additionally prepend the href property with the server's base uri. - * - * @param DAV\Server $server - * @param \DOMElement $dom - * @return void - */ - public function serialize(DAV\Server $server,\DOMElement $dom) { - - $prefix = $server->xmlNamespaces['DAV:']; - - foreach($this->hrefs as $href) { - - $elem = $dom->ownerDocument->createElement($prefix . ':href'); - if ($this->autoPrefix) { - $value = $server->getBaseUri() . DAV\URLUtil::encodePath($href); - } else { - $value = $href; - } - $elem->appendChild($dom->ownerDocument->createTextNode($value)); - - $dom->appendChild($elem); - } - - } - - /** - * Unserializes this property from a DOM Element - * - * This method returns an instance of this class. - * It will only decode {DAV:}href values. - * - * @param \DOMElement $dom - * @return DAV\Property\HrefList - */ - static function unserialize(\DOMElement $dom) { - - $hrefs = array(); - foreach($dom->childNodes as $child) { - if (DAV\XMLUtil::toClarkNotation($child)==='{DAV:}href') { - $hrefs[] = $child->textContent; - } - } - return new self($hrefs, false); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/IHref.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/IHref.php deleted file mode 100755 index d2b4d4d2..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/IHref.php +++ /dev/null @@ -1,25 +0,0 @@ -locks = $locks; - $this->revealLockToken = $revealLockToken; - - } - - /** - * serialize - * - * @param DAV\Server $server - * @param \DOMElement $prop - * @return void - */ - public function serialize(DAV\Server $server, \DOMElement $prop) { - - $doc = $prop->ownerDocument; - - foreach($this->locks as $lock) { - - $activeLock = $doc->createElementNS('DAV:','d:activelock'); - $prop->appendChild($activeLock); - - $lockScope = $doc->createElementNS('DAV:','d:lockscope'); - $activeLock->appendChild($lockScope); - - $lockScope->appendChild($doc->createElementNS('DAV:','d:' . ($lock->scope==DAV\Locks\LockInfo::EXCLUSIVE?'exclusive':'shared'))); - - $lockType = $doc->createElementNS('DAV:','d:locktype'); - $activeLock->appendChild($lockType); - - $lockType->appendChild($doc->createElementNS('DAV:','d:write')); - - /* {DAV:}lockroot */ - if (!self::$hideLockRoot) { - $lockRoot = $doc->createElementNS('DAV:','d:lockroot'); - $activeLock->appendChild($lockRoot); - $href = $doc->createElementNS('DAV:','d:href'); - $href->appendChild($doc->createTextNode($server->getBaseUri() . $lock->uri)); - $lockRoot->appendChild($href); - } - - $activeLock->appendChild($doc->createElementNS('DAV:','d:depth',($lock->depth == DAV\Server::DEPTH_INFINITY?'infinity':$lock->depth))); - $activeLock->appendChild($doc->createElementNS('DAV:','d:timeout','Second-' . $lock->timeout)); - - if ($this->revealLockToken) { - $lockToken = $doc->createElementNS('DAV:','d:locktoken'); - $activeLock->appendChild($lockToken); - $lockToken->appendChild($doc->createElementNS('DAV:','d:href','opaquelocktoken:' . $lock->token)); - } - - $activeLock->appendChild($doc->createElementNS('DAV:','d:owner',$lock->owner)); - - } - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/ResourceType.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/ResourceType.php deleted file mode 100755 index 7d12e313..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/ResourceType.php +++ /dev/null @@ -1,127 +0,0 @@ -resourceType = array(); - elseif ($resourceType === DAV\Server::NODE_DIRECTORY) - $this->resourceType = array('{DAV:}collection'); - elseif (is_array($resourceType)) - $this->resourceType = $resourceType; - else - $this->resourceType = array($resourceType); - - } - - /** - * serialize - * - * @param DAV\Server $server - * @param \DOMElement $prop - * @return void - */ - public function serialize(DAV\Server $server, \DOMElement $prop) { - - $propName = null; - $rt = $this->resourceType; - - foreach($rt as $resourceType) { - if (preg_match('/^{([^}]*)}(.*)$/',$resourceType,$propName)) { - - if (isset($server->xmlNamespaces[$propName[1]])) { - $prop->appendChild($prop->ownerDocument->createElement($server->xmlNamespaces[$propName[1]] . ':' . $propName[2])); - } else { - $prop->appendChild($prop->ownerDocument->createElementNS($propName[1],'custom:' . $propName[2])); - } - - } - } - - } - - /** - * Returns the values in clark-notation - * - * For example array('{DAV:}collection') - * - * @return array - */ - public function getValue() { - - return $this->resourceType; - - } - - /** - * Checks if the principal contains a certain value - * - * @param string $type - * @return bool - */ - public function is($type) { - - return in_array($type, $this->resourceType); - - } - - /** - * Adds a resourcetype value to this property - * - * @param string $type - * @return void - */ - public function add($type) { - - $this->resourceType[] = $type; - $this->resourceType = array_unique($this->resourceType); - - } - - /** - * Unserializes a DOM element into a ResourceType property. - * - * @param \DOMElement $dom - * @return DAV\Property\ResourceType - */ - static public function unserialize(\DOMElement $dom) { - - $value = array(); - foreach($dom->childNodes as $child) { - - $value[] = DAV\XMLUtil::toClarkNotation($child); - - } - - return new self($value); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/Response.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/Response.php deleted file mode 100755 index 151e795d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/Response.php +++ /dev/null @@ -1,157 +0,0 @@ -href = $href; - $this->responseProperties = $responseProperties; - - } - - /** - * Returns the url - * - * @return string - */ - public function getHref() { - - return $this->href; - - } - - /** - * Returns the property list - * - * @return array - */ - public function getResponseProperties() { - - return $this->responseProperties; - - } - - /** - * serialize - * - * @param DAV\Server $server - * @param \DOMElement $dom - * @return void - */ - public function serialize(DAV\Server $server, \DOMElement $dom) { - - $document = $dom->ownerDocument; - $properties = $this->responseProperties; - - $xresponse = $document->createElement('d:response'); - $dom->appendChild($xresponse); - - $uri = DAV\URLUtil::encodePath($this->href); - - // Adding the baseurl to the beginning of the url - $uri = $server->getBaseUri() . $uri; - - $xresponse->appendChild($document->createElement('d:href',$uri)); - - // The properties variable is an array containing properties, grouped by - // HTTP status - foreach($properties as $httpStatus=>$propertyGroup) { - - // The 'href' is also in this array, and it's special cased. - // We will ignore it - if ($httpStatus=='href') continue; - - // If there are no properties in this group, we can also just carry on - if (!count($propertyGroup)) continue; - - $xpropstat = $document->createElement('d:propstat'); - $xresponse->appendChild($xpropstat); - - $xprop = $document->createElement('d:prop'); - $xpropstat->appendChild($xprop); - - $nsList = $server->xmlNamespaces; - - foreach($propertyGroup as $propertyName=>$propertyValue) { - - $propName = null; - preg_match('/^{([^}]*)}(.*)$/',$propertyName,$propName); - - // special case for empty namespaces - if ($propName[1]=='') { - - $currentProperty = $document->createElement($propName[2]); - $xprop->appendChild($currentProperty); - $currentProperty->setAttribute('xmlns',''); - - } else { - - if (!isset($nsList[$propName[1]])) { - $nsList[$propName[1]] = 'x' . count($nsList); - } - - // If the namespace was defined in the top-level xml namespaces, it means - // there was already a namespace declaration, and we don't have to worry about it. - if (isset($server->xmlNamespaces[$propName[1]])) { - $currentProperty = $document->createElement($nsList[$propName[1]] . ':' . $propName[2]); - } else { - $currentProperty = $document->createElementNS($propName[1],$nsList[$propName[1]].':' . $propName[2]); - } - $xprop->appendChild($currentProperty); - - } - - if (is_scalar($propertyValue)) { - $text = $document->createTextNode($propertyValue); - $currentProperty->appendChild($text); - } elseif ($propertyValue instanceof DAV\PropertyInterface) { - $propertyValue->serialize($server,$currentProperty); - } elseif (!is_null($propertyValue)) { - throw new DAV\Exception('Unknown property value type: ' . gettype($propertyValue) . ' for property: ' . $propertyName); - } - - } - - $xpropstat->appendChild($document->createElement('d:status',$server->httpResponse->getStatusMessage($httpStatus))); - - } - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/ResponseList.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/ResponseList.php deleted file mode 100755 index 62c4308f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/ResponseList.php +++ /dev/null @@ -1,59 +0,0 @@ -responses = $responses; - - } - - /** - * serialize - * - * @param DAV\Server $server - * @param \DOMElement $dom - * @return void - */ - public function serialize(DAV\Server $server,\DOMElement $dom) { - - foreach($this->responses as $response) { - $response->serialize($server, $dom); - } - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/SupportedLock.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/SupportedLock.php deleted file mode 100755 index 5ddde647..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/SupportedLock.php +++ /dev/null @@ -1,78 +0,0 @@ -supportsLocks = $supportsLocks; - - } - - /** - * serialize - * - * @param DAV\Server $server - * @param \DOMElement $prop - * @return void - */ - public function serialize(DAV\Server $server,\DOMElement $prop) { - - $doc = $prop->ownerDocument; - - if (!$this->supportsLocks) return null; - - $lockEntry1 = $doc->createElement('d:lockentry'); - $lockEntry2 = $doc->createElement('d:lockentry'); - - $prop->appendChild($lockEntry1); - $prop->appendChild($lockEntry2); - - $lockScope1 = $doc->createElement('d:lockscope'); - $lockScope2 = $doc->createElement('d:lockscope'); - $lockType1 = $doc->createElement('d:locktype'); - $lockType2 = $doc->createElement('d:locktype'); - - $lockEntry1->appendChild($lockScope1); - $lockEntry1->appendChild($lockType1); - $lockEntry2->appendChild($lockScope2); - $lockEntry2->appendChild($lockType2); - - $lockScope1->appendChild($doc->createElement('d:exclusive')); - $lockScope2->appendChild($doc->createElement('d:shared')); - - $lockType1->appendChild($doc->createElement('d:write')); - $lockType2->appendChild($doc->createElement('d:write')); - - //$frag->appendXML(''); - //$frag->appendXML(''); - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/SupportedReportSet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/SupportedReportSet.php deleted file mode 100755 index d0273e46..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Property/SupportedReportSet.php +++ /dev/null @@ -1,111 +0,0 @@ -addReport($reports); - - } - - /** - * Adds a report to this property - * - * The report must be a string in clark-notation. - * Multiple reports can be specified as an array. - * - * @param mixed $report - * @return void - */ - public function addReport($report) { - - if (!is_array($report)) $report = array($report); - - foreach($report as $r) { - - if (!preg_match('/^{([^}]*)}(.*)$/',$r)) - throw new DAV\Exception('Reportname must be in clark-notation'); - - $this->reports[] = $r; - - } - - } - - /** - * Returns the list of supported reports - * - * @return array - */ - public function getValue() { - - return $this->reports; - - } - - /** - * Serializes the node - * - * @param DAV\Server $server - * @param \DOMElement $prop - * @return void - */ - public function serialize(DAV\Server $server, \DOMElement $prop) { - - foreach($this->reports as $reportName) { - - $supportedReport = $prop->ownerDocument->createElement('d:supported-report'); - $prop->appendChild($supportedReport); - - $report = $prop->ownerDocument->createElement('d:report'); - $supportedReport->appendChild($report); - - preg_match('/^{([^}]*)}(.*)$/',$reportName,$matches); - - list(, $namespace, $element) = $matches; - - $prefix = isset($server->xmlNamespaces[$namespace])?$server->xmlNamespaces[$namespace]:null; - - if ($prefix) { - $report->appendChild($prop->ownerDocument->createElement($prefix . ':' . $element)); - } else { - $report->appendChild($prop->ownerDocument->createElementNS($namespace, 'x:' . $element)); - } - - } - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/PropertyInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/PropertyInterface.php deleted file mode 100755 index fe0c016e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/PropertyInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - 'd', - 'http://sabredav.org/ns' => 's', - ); - - /** - * The propertymap can be used to map properties from - * requests to property classes. - * - * @var array - */ - public $propertyMap = array( - '{DAV:}resourcetype' => 'SabreForRainLoop\\DAV\\Property\\ResourceType', - ); - - public $protectedProperties = array( - // RFC4918 - '{DAV:}getcontentlength', - '{DAV:}getetag', - '{DAV:}getlastmodified', - '{DAV:}lockdiscovery', - '{DAV:}supportedlock', - - // RFC4331 - '{DAV:}quota-available-bytes', - '{DAV:}quota-used-bytes', - - // RFC3744 - '{DAV:}supported-privilege-set', - '{DAV:}current-user-privilege-set', - '{DAV:}acl', - '{DAV:}acl-restrictions', - '{DAV:}inherited-acl-set', - - ); - - /** - * This is a flag that allow or not showing file, line and code - * of the exception in the returned XML - * - * @var bool - */ - public $debugExceptions = false; - - /** - * This property allows you to automatically add the 'resourcetype' value - * based on a node's classname or interface. - * - * The preset ensures that {DAV:}collection is automaticlly added for nodes - * implementing SabreForRainLoop\DAV\ICollection. - * - * @var array - */ - public $resourceTypeMapping = array( - 'SabreForRainLoop\\DAV\\ICollection' => '{DAV:}collection', - ); - - /** - * If this setting is turned off, SabreDAV's version number will be hidden - * from various places. - * - * Some people feel this is a good security measure. - * - * @var bool - */ - static public $exposeVersion = true; - - /** - * Sets up the server - * - * If a SabreForRainLoop\DAV\Tree object is passed as an argument, it will - * use it as the directory tree. If a SabreForRainLoop\DAV\INode is passed, it - * will create a SabreForRainLoop\DAV\ObjectTree and use the node as the root. - * - * If nothing is passed, a SabreForRainLoop\DAV\SimpleCollection is created in - * a SabreForRainLoop\DAV\ObjectTree. - * - * If an array is passed, we automatically create a root node, and use - * the nodes in the array as top-level children. - * - * @param Tree|INode|array|null $treeOrNode The tree object - */ - public function __construct($treeOrNode = null) { - - if ($treeOrNode instanceof Tree) { - $this->tree = $treeOrNode; - } elseif ($treeOrNode instanceof INode) { - $this->tree = new ObjectTree($treeOrNode); - } elseif (is_array($treeOrNode)) { - - // If it's an array, a list of nodes was passed, and we need to - // create the root node. - foreach($treeOrNode as $node) { - if (!($node instanceof INode)) { - throw new Exception('Invalid argument passed to constructor. If you\'re passing an array, all the values must implement SabreForRainLoop\\DAV\\INode'); - } - } - - $root = new SimpleCollection('root', $treeOrNode); - $this->tree = new ObjectTree($root); - - } elseif (is_null($treeOrNode)) { - $root = new SimpleCollection('root'); - $this->tree = new ObjectTree($root); - } else { - throw new Exception('Invalid argument passed to constructor. Argument must either be an instance of SabreForRainLoop\\DAV\\Tree, SabreForRainLoop\\DAV\\INode, an array or null'); - } - $this->httpResponse = new HTTP\Response(); - $this->httpRequest = new HTTP\Request(); - - } - - /** - * Starts the DAV Server - * - * @return void - */ - public function exec() { - - try { - - // If nginx (pre-1.2) is used as a proxy server, and SabreDAV as an - // origin, we must make sure we send back HTTP/1.0 if this was - // requested. - // This is mainly because nginx doesn't support Chunked Transfer - // Encoding, and this forces the webserver SabreDAV is running on, - // to buffer entire responses to calculate Content-Length. - $this->httpResponse->defaultHttpVersion = $this->httpRequest->getHTTPVersion(); - - $this->invokeMethod($this->httpRequest->getMethod(), $this->getRequestUri()); - - } catch (Exception $e) { - - try { - $this->broadcastEvent('exception', array($e)); - } catch (Exception $ignore) { - } - $DOM = new \DOMDocument('1.0','utf-8'); - $DOM->formatOutput = true; - - $error = $DOM->createElementNS('DAV:','d:error'); - $error->setAttribute('xmlns:s',self::NS_SABREDAV); - $DOM->appendChild($error); - - $h = function($v) { - - return htmlspecialchars($v, ENT_NOQUOTES, 'UTF-8'); - - }; - - $error->appendChild($DOM->createElement('s:exception',$h(get_class($e)))); - $error->appendChild($DOM->createElement('s:message',$h($e->getMessage()))); - if ($this->debugExceptions) { - $error->appendChild($DOM->createElement('s:file',$h($e->getFile()))); - $error->appendChild($DOM->createElement('s:line',$h($e->getLine()))); - $error->appendChild($DOM->createElement('s:code',$h($e->getCode()))); - $error->appendChild($DOM->createElement('s:stacktrace',$h($e->getTraceAsString()))); - - } - if (self::$exposeVersion) { - $error->appendChild($DOM->createElement('s:sabredav-version',$h(Version::VERSION))); - } - - if($e instanceof Exception) { - - $httpCode = $e->getHTTPCode(); - $e->serialize($this,$error); - $headers = $e->getHTTPHeaders($this); - - } else { - - $httpCode = 500; - $headers = array(); - - } - $headers['Content-Type'] = 'application/xml; charset=utf-8'; - - $this->httpResponse->sendStatus($httpCode); - $this->httpResponse->setHeaders($headers); - $this->httpResponse->sendBody($DOM->saveXML()); - - } - - } - - /** - * Sets the base server uri - * - * @param string $uri - * @return void - */ - public function setBaseUri($uri) { - - // If the baseUri does not end with a slash, we must add it - if ($uri[strlen($uri)-1]!=='/') - $uri.='/'; - - $this->baseUri = $uri; - - } - - /** - * Returns the base responding uri - * - * @return string - */ - public function getBaseUri() { - - if (is_null($this->baseUri)) $this->baseUri = $this->guessBaseUri(); - return $this->baseUri; - - } - - /** - * This method attempts to detect the base uri. - * Only the PATH_INFO variable is considered. - * - * If this variable is not set, the root (/) is assumed. - * - * @return string - */ - public function guessBaseUri() { - - $pathInfo = $this->httpRequest->getRawServerValue('PATH_INFO'); - $uri = $this->httpRequest->getRawServerValue('REQUEST_URI'); - - // If PATH_INFO is found, we can assume it's accurate. - if (!empty($pathInfo)) { - - // We need to make sure we ignore the QUERY_STRING part - if ($pos = strpos($uri,'?')) - $uri = substr($uri,0,$pos); - - // PATH_INFO is only set for urls, such as: /example.php/path - // in that case PATH_INFO contains '/path'. - // Note that REQUEST_URI is percent encoded, while PATH_INFO is - // not, Therefore they are only comparable if we first decode - // REQUEST_INFO as well. - $decodedUri = URLUtil::decodePath($uri); - - // A simple sanity check: - if(substr($decodedUri,strlen($decodedUri)-strlen($pathInfo))===$pathInfo) { - $baseUri = substr($decodedUri,0,strlen($decodedUri)-strlen($pathInfo)); - return rtrim($baseUri,'/') . '/'; - } - - throw new Exception('The REQUEST_URI ('. $uri . ') did not end with the contents of PATH_INFO (' . $pathInfo . '). This server might be misconfigured.'); - - } - - // The last fallback is that we're just going to assume the server root. - return '/'; - - } - - /** - * Adds a plugin to the server - * - * For more information, console the documentation of SabreForRainLoop\DAV\ServerPlugin - * - * @param ServerPlugin $plugin - * @return void - */ - public function addPlugin(ServerPlugin $plugin) { - - $this->plugins[$plugin->getPluginName()] = $plugin; - $plugin->initialize($this); - - } - - /** - * Returns an initialized plugin by it's name. - * - * This function returns null if the plugin was not found. - * - * @param string $name - * @return ServerPlugin - */ - public function getPlugin($name) { - - if (isset($this->plugins[$name])) - return $this->plugins[$name]; - - // This is a fallback and deprecated. - foreach($this->plugins as $plugin) { - if (get_class($plugin)===$name) return $plugin; - } - - return null; - - } - - /** - * Returns all plugins - * - * @return array - */ - public function getPlugins() { - - return $this->plugins; - - } - - - /** - * Subscribe to an event. - * - * When the event is triggered, we'll call all the specified callbacks. - * It is possible to control the order of the callbacks through the - * priority argument. - * - * This is for example used to make sure that the authentication plugin - * is triggered before anything else. If it's not needed to change this - * number, it is recommended to ommit. - * - * @param string $event - * @param callback $callback - * @param int $priority - * @return void - */ - public function subscribeEvent($event, $callback, $priority = 100) { - - if (!isset($this->eventSubscriptions[$event])) { - $this->eventSubscriptions[$event] = array(); - } - while(isset($this->eventSubscriptions[$event][$priority])) $priority++; - $this->eventSubscriptions[$event][$priority] = $callback; - ksort($this->eventSubscriptions[$event]); - - } - - /** - * Broadcasts an event - * - * This method will call all subscribers. If one of the subscribers returns false, the process stops. - * - * The arguments parameter will be sent to all subscribers - * - * @param string $eventName - * @param array $arguments - * @return bool - */ - public function broadcastEvent($eventName,$arguments = array()) { - - if (isset($this->eventSubscriptions[$eventName])) { - - foreach($this->eventSubscriptions[$eventName] as $subscriber) { - - $result = call_user_func_array($subscriber,$arguments); - if ($result===false) return false; - - } - - } - - return true; - - } - - /** - * Handles a http request, and execute a method based on its name - * - * @param string $method - * @param string $uri - * @return void - */ - public function invokeMethod($method, $uri) { - - $method = strtoupper($method); - - if (!$this->broadcastEvent('beforeMethod',array($method, $uri))) return; - - // Make sure this is a HTTP method we support - $internalMethods = array( - 'OPTIONS', - 'GET', - 'HEAD', - 'DELETE', - 'PROPFIND', - 'MKCOL', - 'PUT', - 'PROPPATCH', - 'COPY', - 'MOVE', - 'REPORT' - ); - - if (in_array($method,$internalMethods)) { - - call_user_func(array($this,'http' . $method), $uri); - - } else { - - if ($this->broadcastEvent('unknownMethod',array($method, $uri))) { - // Unsupported method - throw new Exception\NotImplemented('There was no handler found for this "' . $method . '" method'); - } - - } - - } - - // {{{ HTTP Method implementations - - /** - * HTTP OPTIONS - * - * @param string $uri - * @return void - */ - protected function httpOptions($uri) { - - $methods = $this->getAllowedMethods($uri); - - $this->httpResponse->setHeader('Allow',strtoupper(implode(', ',$methods))); - $features = array('1','3', 'extended-mkcol'); - - foreach($this->plugins as $plugin) $features = array_merge($features,$plugin->getFeatures()); - - $this->httpResponse->setHeader('DAV',implode(', ',$features)); - $this->httpResponse->setHeader('MS-Author-Via','DAV'); - $this->httpResponse->setHeader('Accept-Ranges','bytes'); - if (self::$exposeVersion) { - $this->httpResponse->setHeader('X-Sabre-Version',Version::VERSION); - } - $this->httpResponse->setHeader('Content-Length',0); - $this->httpResponse->sendStatus(200); - - } - - /** - * HTTP GET - * - * This method simply fetches the contents of a uri, like normal - * - * @param string $uri - * @return bool - */ - protected function httpGet($uri) { - - $node = $this->tree->getNodeForPath($uri,0); - - if (!$this->checkPreconditions(true)) return false; - if (!$node instanceof IFile) throw new Exception\NotImplemented('GET is only implemented on File objects'); - - $body = $node->get(); - - // Converting string into stream, if needed. - if (is_string($body)) { - $stream = fopen('php://temp','r+'); - fwrite($stream,$body); - rewind($stream); - $body = $stream; - } - - /* - * TODO: getetag, getlastmodified, getsize should also be used using - * this method - */ - $httpHeaders = $this->getHTTPHeaders($uri); - - /* ContentType needs to get a default, because many webservers will otherwise - * default to text/html, and we don't want this for security reasons. - */ - if (!isset($httpHeaders['Content-Type'])) { - $httpHeaders['Content-Type'] = 'application/octet-stream'; - } - - - if (isset($httpHeaders['Content-Length'])) { - - $nodeSize = $httpHeaders['Content-Length']; - - // Need to unset Content-Length, because we'll handle that during figuring out the range - unset($httpHeaders['Content-Length']); - - } else { - $nodeSize = null; - } - - $this->httpResponse->setHeaders($httpHeaders); - - $range = $this->getHTTPRange(); - $ifRange = $this->httpRequest->getHeader('If-Range'); - $ignoreRangeHeader = false; - - // If ifRange is set, and range is specified, we first need to check - // the precondition. - if ($nodeSize && $range && $ifRange) { - - // if IfRange is parsable as a date we'll treat it as a DateTime - // otherwise, we must treat it as an etag. - try { - $ifRangeDate = new \DateTime($ifRange); - - // It's a date. We must check if the entity is modified since - // the specified date. - if (!isset($httpHeaders['Last-Modified'])) $ignoreRangeHeader = true; - else { - $modified = new \DateTime($httpHeaders['Last-Modified']); - if($modified > $ifRangeDate) $ignoreRangeHeader = true; - } - - } catch (\Exception $e) { - - // It's an entity. We can do a simple comparison. - if (!isset($httpHeaders['ETag'])) $ignoreRangeHeader = true; - elseif ($httpHeaders['ETag']!==$ifRange) $ignoreRangeHeader = true; - } - } - - // We're only going to support HTTP ranges if the backend provided a filesize - if (!$ignoreRangeHeader && $nodeSize && $range) { - - // Determining the exact byte offsets - if (!is_null($range[0])) { - - $start = $range[0]; - $end = $range[1]?$range[1]:$nodeSize-1; - if($start >= $nodeSize) - throw new Exception\RequestedRangeNotSatisfiable('The start offset (' . $range[0] . ') exceeded the size of the entity (' . $nodeSize . ')'); - - if($end < $start) throw new Exception\RequestedRangeNotSatisfiable('The end offset (' . $range[1] . ') is lower than the start offset (' . $range[0] . ')'); - if($end >= $nodeSize) $end = $nodeSize-1; - - } else { - - $start = $nodeSize-$range[1]; - $end = $nodeSize-1; - - if ($start<0) $start = 0; - - } - - // New read/write stream - $newStream = fopen('php://temp','r+'); - - // stream_copy_to_stream() has a bug/feature: the `whence` argument - // is interpreted as SEEK_SET (count from absolute offset 0), while - // for a stream it should be SEEK_CUR (count from current offset). - // If a stream is nonseekable, the function fails. So we *emulate* - // the correct behaviour with fseek(): - if ($start > 0) { - if (($curOffs = ftell($body)) === false) $curOffs = 0; - fseek($body, $start - $curOffs, SEEK_CUR); - } - stream_copy_to_stream($body, $newStream, $end-$start+1); - rewind($newStream); - - $this->httpResponse->setHeader('Content-Length', $end-$start+1); - $this->httpResponse->setHeader('Content-Range','bytes ' . $start . '-' . $end . '/' . $nodeSize); - $this->httpResponse->sendStatus(206); - $this->httpResponse->sendBody($newStream); - - - } else { - - if ($nodeSize) $this->httpResponse->setHeader('Content-Length',$nodeSize); - $this->httpResponse->sendStatus(200); - $this->httpResponse->sendBody($body); - - } - - } - - /** - * HTTP HEAD - * - * This method is normally used to take a peak at a url, and only get the HTTP response headers, without the body - * This is used by clients to determine if a remote file was changed, so they can use a local cached version, instead of downloading it again - * - * @param string $uri - * @return void - */ - protected function httpHead($uri) { - - $node = $this->tree->getNodeForPath($uri); - /* This information is only collection for File objects. - * Ideally we want to throw 405 Method Not Allowed for every - * non-file, but MS Office does not like this - */ - if ($node instanceof IFile) { - $headers = $this->getHTTPHeaders($this->getRequestUri()); - if (!isset($headers['Content-Type'])) { - $headers['Content-Type'] = 'application/octet-stream'; - } - $this->httpResponse->setHeaders($headers); - } - $this->httpResponse->sendStatus(200); - - } - - /** - * HTTP Delete - * - * The HTTP delete method, deletes a given uri - * - * @param string $uri - * @return void - */ - protected function httpDelete($uri) { - - if (!$this->broadcastEvent('beforeUnbind',array($uri))) return; - $this->tree->delete($uri); - $this->broadcastEvent('afterUnbind',array($uri)); - - $this->httpResponse->sendStatus(204); - $this->httpResponse->setHeader('Content-Length','0'); - - } - - - /** - * WebDAV PROPFIND - * - * This WebDAV method requests information about an uri resource, or a list of resources - * If a client wants to receive the properties for a single resource it will add an HTTP Depth: header with a 0 value - * If the value is 1, it means that it also expects a list of sub-resources (e.g.: files in a directory) - * - * The request body contains an XML data structure that has a list of properties the client understands - * The response body is also an xml document, containing information about every uri resource and the requested properties - * - * It has to return a HTTP 207 Multi-status status code - * - * @param string $uri - * @return void - */ - protected function httpPropfind($uri) { - - $requestedProperties = $this->parsePropFindRequest($this->httpRequest->getBody(true)); - - $depth = $this->getHTTPDepth(1); - // The only two options for the depth of a propfind is 0 or 1 - if ($depth!=0) $depth = 1; - - $newProperties = $this->getPropertiesForPath($uri,$requestedProperties,$depth); - - // This is a multi-status response - $this->httpResponse->sendStatus(207); - $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->httpResponse->setHeader('Vary','Brief,Prefer'); - - // Normally this header is only needed for OPTIONS responses, however.. - // iCal seems to also depend on these being set for PROPFIND. Since - // this is not harmful, we'll add it. - $features = array('1','3', 'extended-mkcol'); - foreach($this->plugins as $plugin) $features = array_merge($features,$plugin->getFeatures()); - $this->httpResponse->setHeader('DAV',implode(', ',$features)); - - $prefer = $this->getHTTPPrefer(); - $minimal = $prefer['return-minimal']; - - $data = $this->generateMultiStatus($newProperties, $minimal); - $this->httpResponse->sendBody($data); - - } - - /** - * WebDAV PROPPATCH - * - * This method is called to update properties on a Node. The request is an XML body with all the mutations. - * In this XML body it is specified which properties should be set/updated and/or deleted - * - * @param string $uri - * @return void - */ - protected function httpPropPatch($uri) { - - $newProperties = $this->parsePropPatchRequest($this->httpRequest->getBody(true)); - - $result = $this->updateProperties($uri, $newProperties); - - $prefer = $this->getHTTPPrefer(); - $this->httpResponse->setHeader('Vary','Brief,Prefer'); - - if ($prefer['return-minimal']) { - - // If return-minimal is specified, we only have to check if the - // request was succesful, and don't need to return the - // multi-status. - $ok = true; - foreach($result as $code=>$prop) { - if ((int)$code > 299) { - $ok = false; - } - } - - if ($ok) { - - $this->httpResponse->sendStatus(204); - return; - - } - - } - - $this->httpResponse->sendStatus(207); - $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - - $this->httpResponse->sendBody( - $this->generateMultiStatus(array($result)) - ); - - } - - /** - * HTTP PUT method - * - * This HTTP method updates a file, or creates a new one. - * - * If a new resource was created, a 201 Created status code should be returned. If an existing resource is updated, it's a 204 No Content - * - * @param string $uri - * @return bool - */ - protected function httpPut($uri) { - - $body = $this->httpRequest->getBody(); - - // Intercepting Content-Range - if ($this->httpRequest->getHeader('Content-Range')) { - /** - Content-Range is dangerous for PUT requests: PUT per definition - stores a full resource. draft-ietf-httpbis-p2-semantics-15 says - in section 7.6: - An origin server SHOULD reject any PUT request that contains a - Content-Range header field, since it might be misinterpreted as - partial content (or might be partial content that is being mistakenly - PUT as a full representation). Partial content updates are possible - by targeting a separately identified resource with state that - overlaps a portion of the larger resource, or by using a different - method that has been specifically defined for partial updates (for - example, the PATCH method defined in [RFC5789]). - This clarifies RFC2616 section 9.6: - The recipient of the entity MUST NOT ignore any Content-* - (e.g. Content-Range) headers that it does not understand or implement - and MUST return a 501 (Not Implemented) response in such cases. - OTOH is a PUT request with a Content-Range currently the only way to - continue an aborted upload request and is supported by curl, mod_dav, - Tomcat and others. Since some clients do use this feature which results - in unexpected behaviour (cf PEAR::HTTP_WebDAV_Client 1.0.1), we reject - all PUT requests with a Content-Range for now. - */ - - throw new Exception\NotImplemented('PUT with Content-Range is not allowed.'); - } - - // Intercepting the Finder problem - if (($expected = $this->httpRequest->getHeader('X-Expected-Entity-Length')) && $expected > 0) { - - /** - Many webservers will not cooperate well with Finder PUT requests, - because it uses 'Chunked' transfer encoding for the request body. - - The symptom of this problem is that Finder sends files to the - server, but they arrive as 0-length files in PHP. - - If we don't do anything, the user might think they are uploading - files successfully, but they end up empty on the server. Instead, - we throw back an error if we detect this. - - The reason Finder uses Chunked, is because it thinks the files - might change as it's being uploaded, and therefore the - Content-Length can vary. - - Instead it sends the X-Expected-Entity-Length header with the size - of the file at the very start of the request. If this header is set, - but we don't get a request body we will fail the request to - protect the end-user. - */ - - // Only reading first byte - $firstByte = fread($body,1); - if (strlen($firstByte)!==1) { - throw new Exception\Forbidden('This server is not compatible with OS/X finder. Consider using a different WebDAV client or webserver.'); - } - - // The body needs to stay intact, so we copy everything to a - // temporary stream. - - $newBody = fopen('php://temp','r+'); - fwrite($newBody,$firstByte); - stream_copy_to_stream($body, $newBody); - rewind($newBody); - - $body = $newBody; - - } - - if ($this->tree->nodeExists($uri)) { - - $node = $this->tree->getNodeForPath($uri); - - // Checking If-None-Match and related headers. - if (!$this->checkPreconditions()) return; - - // If the node is a collection, we'll deny it - if (!($node instanceof IFile)) throw new Exception\Conflict('PUT is not allowed on non-files.'); - if (!$this->broadcastEvent('beforeWriteContent',array($uri, $node, &$body))) return false; - - $etag = $node->put($body); - - $this->broadcastEvent('afterWriteContent',array($uri, $node)); - - $this->httpResponse->setHeader('Content-Length','0'); - if ($etag) $this->httpResponse->setHeader('ETag',$etag); - $this->httpResponse->sendStatus(204); - - } else { - - $etag = null; - // If we got here, the resource didn't exist yet. - if (!$this->createFile($this->getRequestUri(),$body,$etag)) { - // For one reason or another the file was not created. - return; - } - - $this->httpResponse->setHeader('Content-Length','0'); - if ($etag) $this->httpResponse->setHeader('ETag', $etag); - $this->httpResponse->sendStatus(201); - - } - - } - - - /** - * WebDAV MKCOL - * - * The MKCOL method is used to create a new collection (directory) on the server - * - * @param string $uri - * @return void - */ - protected function httpMkcol($uri) { - - $requestBody = $this->httpRequest->getBody(true); - - if ($requestBody) { - - $contentType = $this->httpRequest->getHeader('Content-Type'); - if (strpos($contentType,'application/xml')!==0 && strpos($contentType,'text/xml')!==0) { - - // We must throw 415 for unsupported mkcol bodies - throw new Exception\UnsupportedMediaType('The request body for the MKCOL request must have an xml Content-Type'); - - } - - $dom = XMLUtil::loadDOMDocument($requestBody); - if (XMLUtil::toClarkNotation($dom->firstChild)!=='{DAV:}mkcol') { - - // We must throw 415 for unsupported mkcol bodies - throw new Exception\UnsupportedMediaType('The request body for the MKCOL request must be a {DAV:}mkcol request construct.'); - - } - - $properties = array(); - foreach($dom->firstChild->childNodes as $childNode) { - - if (XMLUtil::toClarkNotation($childNode)!=='{DAV:}set') continue; - $properties = array_merge($properties, XMLUtil::parseProperties($childNode, $this->propertyMap)); - - } - if (!isset($properties['{DAV:}resourcetype'])) - throw new Exception\BadRequest('The mkcol request must include a {DAV:}resourcetype property'); - - $resourceType = $properties['{DAV:}resourcetype']->getValue(); - unset($properties['{DAV:}resourcetype']); - - } else { - - $properties = array(); - $resourceType = array('{DAV:}collection'); - - } - - $result = $this->createCollection($uri, $resourceType, $properties); - - if (is_array($result)) { - $this->httpResponse->sendStatus(207); - $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - - $this->httpResponse->sendBody( - $this->generateMultiStatus(array($result)) - ); - - } else { - $this->httpResponse->setHeader('Content-Length','0'); - $this->httpResponse->sendStatus(201); - } - - } - - /** - * WebDAV HTTP MOVE method - * - * This method moves one uri to a different uri. A lot of the actual request processing is done in getCopyMoveInfo - * - * @param string $uri - * @return bool - */ - protected function httpMove($uri) { - - $moveInfo = $this->getCopyAndMoveInfo(); - - // If the destination is part of the source tree, we must fail - if ($moveInfo['destination']==$uri) - throw new Exception\Forbidden('Source and destination uri are identical.'); - - if ($moveInfo['destinationExists']) { - - if (!$this->broadcastEvent('beforeUnbind',array($moveInfo['destination']))) return false; - $this->tree->delete($moveInfo['destination']); - $this->broadcastEvent('afterUnbind',array($moveInfo['destination'])); - - } - - if (!$this->broadcastEvent('beforeUnbind',array($uri))) return false; - if (!$this->broadcastEvent('beforeBind',array($moveInfo['destination']))) return false; - $this->tree->move($uri,$moveInfo['destination']); - $this->broadcastEvent('afterUnbind',array($uri)); - $this->broadcastEvent('afterBind',array($moveInfo['destination'])); - - // If a resource was overwritten we should send a 204, otherwise a 201 - $this->httpResponse->setHeader('Content-Length','0'); - $this->httpResponse->sendStatus($moveInfo['destinationExists']?204:201); - - } - - /** - * WebDAV HTTP COPY method - * - * This method copies one uri to a different uri, and works much like the MOVE request - * A lot of the actual request processing is done in getCopyMoveInfo - * - * @param string $uri - * @return bool - */ - protected function httpCopy($uri) { - - $copyInfo = $this->getCopyAndMoveInfo(); - // If the destination is part of the source tree, we must fail - if ($copyInfo['destination']==$uri) - throw new Exception\Forbidden('Source and destination uri are identical.'); - - if ($copyInfo['destinationExists']) { - if (!$this->broadcastEvent('beforeUnbind',array($copyInfo['destination']))) return false; - $this->tree->delete($copyInfo['destination']); - - } - if (!$this->broadcastEvent('beforeBind',array($copyInfo['destination']))) return false; - $this->tree->copy($uri,$copyInfo['destination']); - $this->broadcastEvent('afterBind',array($copyInfo['destination'])); - - // If a resource was overwritten we should send a 204, otherwise a 201 - $this->httpResponse->setHeader('Content-Length','0'); - $this->httpResponse->sendStatus($copyInfo['destinationExists']?204:201); - - } - - - - /** - * HTTP REPORT method implementation - * - * Although the REPORT method is not part of the standard WebDAV spec (it's from rfc3253) - * It's used in a lot of extensions, so it made sense to implement it into the core. - * - * @param string $uri - * @return void - */ - protected function httpReport($uri) { - - $body = $this->httpRequest->getBody(true); - $dom = XMLUtil::loadDOMDocument($body); - - $reportName = XMLUtil::toClarkNotation($dom->firstChild); - - if ($this->broadcastEvent('report',array($reportName,$dom, $uri))) { - - // If broadcastEvent returned true, it means the report was not supported - throw new Exception\ReportNotSupported(); - - } - - } - - // }}} - // {{{ HTTP/WebDAV protocol helpers - - /** - * Returns an array with all the supported HTTP methods for a specific uri. - * - * @param string $uri - * @return array - */ - public function getAllowedMethods($uri) { - - $methods = array( - 'OPTIONS', - 'GET', - 'HEAD', - 'DELETE', - 'PROPFIND', - 'PUT', - 'PROPPATCH', - 'COPY', - 'MOVE', - 'REPORT' - ); - - // The MKCOL is only allowed on an unmapped uri - try { - $this->tree->getNodeForPath($uri); - } catch (Exception\NotFound $e) { - $methods[] = 'MKCOL'; - } - - // We're also checking if any of the plugins register any new methods - foreach($this->plugins as $plugin) $methods = array_merge($methods, $plugin->getHTTPMethods($uri)); - array_unique($methods); - - return $methods; - - } - - /** - * Gets the uri for the request, keeping the base uri into consideration - * - * @return string - */ - public function getRequestUri() { - - return $this->calculateUri($this->httpRequest->getUri()); - - } - - /** - * Calculates the uri for a request, making sure that the base uri is stripped out - * - * @param string $uri - * @throws Exception\Forbidden A permission denied exception is thrown whenever there was an attempt to supply a uri outside of the base uri - * @return string - */ - public function calculateUri($uri) { - - if ($uri[0]!='/' && strpos($uri,'://')) { - - $uri = parse_url($uri,PHP_URL_PATH); - - } - - $uri = str_replace('//','/',$uri); - - if (strpos($uri,$this->getBaseUri())===0) { - - return trim(URLUtil::decodePath(substr($uri,strlen($this->getBaseUri()))),'/'); - - // A special case, if the baseUri was accessed without a trailing - // slash, we'll accept it as well. - } elseif ($uri.'/' === $this->getBaseUri()) { - - return ''; - - } else { - - throw new Exception\Forbidden('Requested uri (' . $uri . ') is out of base uri (' . $this->getBaseUri() . ')'); - - } - - } - - /** - * Returns the HTTP depth header - * - * This method returns the contents of the HTTP depth request header. If the depth header was 'infinity' it will return the SabreForRainLoop\DAV\Server::DEPTH_INFINITY object - * It is possible to supply a default depth value, which is used when the depth header has invalid content, or is completely non-existent - * - * @param mixed $default - * @return int - */ - public function getHTTPDepth($default = self::DEPTH_INFINITY) { - - // If its not set, we'll grab the default - $depth = $this->httpRequest->getHeader('Depth'); - - if (is_null($depth)) return $default; - - if ($depth == 'infinity') return self::DEPTH_INFINITY; - - - // If its an unknown value. we'll grab the default - if (!ctype_digit($depth)) return $default; - - return (int)$depth; - - } - - /** - * Returns the HTTP range header - * - * This method returns null if there is no well-formed HTTP range request - * header or array($start, $end). - * - * The first number is the offset of the first byte in the range. - * The second number is the offset of the last byte in the range. - * - * If the second offset is null, it should be treated as the offset of the last byte of the entity - * If the first offset is null, the second offset should be used to retrieve the last x bytes of the entity - * - * @return array|null - */ - public function getHTTPRange() { - - $range = $this->httpRequest->getHeader('range'); - if (is_null($range)) return null; - - // Matching "Range: bytes=1234-5678: both numbers are optional - - if (!preg_match('/^bytes=([0-9]*)-([0-9]*)$/i',$range,$matches)) return null; - - if ($matches[1]==='' && $matches[2]==='') return null; - - return array( - $matches[1]!==''?$matches[1]:null, - $matches[2]!==''?$matches[2]:null, - ); - - } - - /** - * Returns the HTTP Prefer header information. - * - * The prefer header is defined in: - * http://tools.ietf.org/html/draft-snell-http-prefer-14 - * - * This method will return an array with options. - * - * Currently, the following options may be returned: - * array( - * 'return-asynch' => true, - * 'return-minimal' => true, - * 'return-representation' => true, - * 'wait' => 30, - * 'strict' => true, - * 'lenient' => true, - * ) - * - * This method also supports the Brief header, and will also return - * 'return-minimal' if the brief header was set to 't'. - * - * For the boolean options, false will be returned if the headers are not - * specified. For the integer options it will be 'null'. - * - * @return array - */ - public function getHTTPPrefer() { - - $result = array( - 'return-asynch' => false, - 'return-minimal' => false, - 'return-representation' => false, - 'wait' => null, - 'strict' => false, - 'lenient' => false, - ); - - if ($prefer = $this->httpRequest->getHeader('Prefer')) { - - $parameters = array_map('trim', - explode(',', $prefer) - ); - - foreach($parameters as $parameter) { - - // Right now our regex only supports the tokens actually - // specified in the draft. We may need to expand this if new - // tokens get registered. - if(!preg_match('/^(?P[a-z0-9-]+)(?:=(?P[0-9]+))?$/', $parameter, $matches)) { - continue; - } - - switch($matches['token']) { - - case 'return-asynch' : - case 'return-minimal' : - case 'return-representation' : - case 'strict' : - case 'lenient' : - $result[$matches['token']] = true; - break; - case 'wait' : - $result[$matches['token']] = $matches['value']; - break; - - } - - } - - } - - if ($this->httpRequest->getHeader('Brief')=='t') { - $result['return-minimal'] = true; - } - - return $result; - - } - - - /** - * Returns information about Copy and Move requests - * - * This function is created to help getting information about the source and the destination for the - * WebDAV MOVE and COPY HTTP request. It also validates a lot of information and throws proper exceptions - * - * The returned value is an array with the following keys: - * * destination - Destination path - * * destinationExists - Whether or not the destination is an existing url (and should therefore be overwritten) - * - * @return array - */ - public function getCopyAndMoveInfo() { - - // Collecting the relevant HTTP headers - if (!$this->httpRequest->getHeader('Destination')) throw new Exception\BadRequest('The destination header was not supplied'); - $destination = $this->calculateUri($this->httpRequest->getHeader('Destination')); - $overwrite = $this->httpRequest->getHeader('Overwrite'); - if (!$overwrite) $overwrite = 'T'; - if (strtoupper($overwrite)=='T') $overwrite = true; - elseif (strtoupper($overwrite)=='F') $overwrite = false; - // We need to throw a bad request exception, if the header was invalid - else throw new Exception\BadRequest('The HTTP Overwrite header should be either T or F'); - - list($destinationDir) = URLUtil::splitPath($destination); - - try { - $destinationParent = $this->tree->getNodeForPath($destinationDir); - if (!($destinationParent instanceof ICollection)) throw new Exception\UnsupportedMediaType('The destination node is not a collection'); - } catch (Exception\NotFound $e) { - - // If the destination parent node is not found, we throw a 409 - throw new Exception\Conflict('The destination node is not found'); - } - - try { - - $destinationNode = $this->tree->getNodeForPath($destination); - - // If this succeeded, it means the destination already exists - // we'll need to throw precondition failed in case overwrite is false - if (!$overwrite) throw new Exception\PreconditionFailed('The destination node already exists, and the overwrite header is set to false','Overwrite'); - - } catch (Exception\NotFound $e) { - - // Destination didn't exist, we're all good - $destinationNode = false; - - - - } - - // These are the three relevant properties we need to return - return array( - 'destination' => $destination, - 'destinationExists' => $destinationNode==true, - 'destinationNode' => $destinationNode, - ); - - } - - /** - * Returns a list of properties for a path - * - * This is a simplified version getPropertiesForPath. - * if you aren't interested in status codes, but you just - * want to have a flat list of properties. Use this method. - * - * @param string $path - * @param array $propertyNames - */ - public function getProperties($path, $propertyNames) { - - $result = $this->getPropertiesForPath($path,$propertyNames,0); - return $result[0][200]; - - } - - /** - * A kid-friendly way to fetch properties for a node's children. - * - * The returned array will be indexed by the path of the of child node. - * Only properties that are actually found will be returned. - * - * The parent node will not be returned. - * - * @param string $path - * @param array $propertyNames - * @return array - */ - public function getPropertiesForChildren($path, $propertyNames) { - - $result = array(); - foreach($this->getPropertiesForPath($path,$propertyNames,1) as $k=>$row) { - - // Skipping the parent path - if ($k === 0) continue; - - $result[$row['href']] = $row[200]; - - } - return $result; - - } - - /** - * Returns a list of HTTP headers for a particular resource - * - * The generated http headers are based on properties provided by the - * resource. The method basically provides a simple mapping between - * DAV property and HTTP header. - * - * The headers are intended to be used for HEAD and GET requests. - * - * @param string $path - * @return array - */ - public function getHTTPHeaders($path) { - - $propertyMap = array( - '{DAV:}getcontenttype' => 'Content-Type', - '{DAV:}getcontentlength' => 'Content-Length', - '{DAV:}getlastmodified' => 'Last-Modified', - '{DAV:}getetag' => 'ETag', - ); - - $properties = $this->getProperties($path,array_keys($propertyMap)); - - $headers = array(); - foreach($propertyMap as $property=>$header) { - if (!isset($properties[$property])) continue; - - if (is_scalar($properties[$property])) { - $headers[$header] = $properties[$property]; - - // GetLastModified gets special cased - } elseif ($properties[$property] instanceof Property\GetLastModified) { - $headers[$header] = HTTP\Util::toHTTPDate($properties[$property]->getTime()); - } - - } - - return $headers; - - } - - /** - * Returns a list of properties for a given path - * - * The path that should be supplied should have the baseUrl stripped out - * The list of properties should be supplied in Clark notation. If the list is empty - * 'allprops' is assumed. - * - * If a depth of 1 is requested child elements will also be returned. - * - * @param string $path - * @param array $propertyNames - * @param int $depth - * @return array - */ - public function getPropertiesForPath($path, $propertyNames = array(), $depth = 0) { - - if ($depth!=0) $depth = 1; - - $path = rtrim($path,'/'); - - // This event allows people to intercept these requests early on in the - // process. - // - // We're not doing anything with the result, but this can be helpful to - // pre-fetch certain expensive live properties. - $this->broadCastEvent('beforeGetPropertiesForPath', array($path, $propertyNames, $depth)); - - $returnPropertyList = array(); - - $parentNode = $this->tree->getNodeForPath($path); - $nodes = array( - $path => $parentNode - ); - if ($depth==1 && $parentNode instanceof ICollection) { - foreach($this->tree->getChildren($path) as $childNode) - $nodes[$path . '/' . $childNode->getName()] = $childNode; - } - - // If the propertyNames array is empty, it means all properties are requested. - // We shouldn't actually return everything we know though, and only return a - // sensible list. - $allProperties = count($propertyNames)==0; - - foreach($nodes as $myPath=>$node) { - - $currentPropertyNames = $propertyNames; - - $newProperties = array( - '200' => array(), - '404' => array(), - ); - - if ($allProperties) { - // Default list of propertyNames, when all properties were requested. - $currentPropertyNames = array( - '{DAV:}getlastmodified', - '{DAV:}getcontentlength', - '{DAV:}resourcetype', - '{DAV:}quota-used-bytes', - '{DAV:}quota-available-bytes', - '{DAV:}getetag', - '{DAV:}getcontenttype', - ); - } - - // If the resourceType was not part of the list, we manually add it - // and mark it for removal. We need to know the resourcetype in order - // to make certain decisions about the entry. - // WebDAV dictates we should add a / and the end of href's for collections - $removeRT = false; - if (!in_array('{DAV:}resourcetype',$currentPropertyNames)) { - $currentPropertyNames[] = '{DAV:}resourcetype'; - $removeRT = true; - } - - $result = $this->broadcastEvent('beforeGetProperties',array($myPath, $node, &$currentPropertyNames, &$newProperties)); - // If this method explicitly returned false, we must ignore this - // node as it is inaccessible. - if ($result===false) continue; - - if (count($currentPropertyNames) > 0) { - - if ($node instanceof IProperties) { - $nodeProperties = $node->getProperties($currentPropertyNames); - - // The getProperties method may give us too much, - // properties, in case the implementor was lazy. - // - // So as we loop through this list, we will only take the - // properties that were actually requested and discard the - // rest. - foreach($currentPropertyNames as $k=>$currentPropertyName) { - if (isset($nodeProperties[$currentPropertyName])) { - unset($currentPropertyNames[$k]); - $newProperties[200][$currentPropertyName] = $nodeProperties[$currentPropertyName]; - } - } - - } - - } - - foreach($currentPropertyNames as $prop) { - - if (isset($newProperties[200][$prop])) continue; - - switch($prop) { - case '{DAV:}getlastmodified' : if ($node->getLastModified()) $newProperties[200][$prop] = new Property\GetLastModified($node->getLastModified()); break; - case '{DAV:}getcontentlength' : - if ($node instanceof IFile) { - $size = $node->getSize(); - if (!is_null($size)) { - $newProperties[200][$prop] = (int)$node->getSize(); - } - } - break; - case '{DAV:}quota-used-bytes' : - if ($node instanceof IQuota) { - $quotaInfo = $node->getQuotaInfo(); - $newProperties[200][$prop] = $quotaInfo[0]; - } - break; - case '{DAV:}quota-available-bytes' : - if ($node instanceof IQuota) { - $quotaInfo = $node->getQuotaInfo(); - $newProperties[200][$prop] = $quotaInfo[1]; - } - break; - case '{DAV:}getetag' : if ($node instanceof IFile && $etag = $node->getETag()) $newProperties[200][$prop] = $etag; break; - case '{DAV:}getcontenttype' : if ($node instanceof IFile && $ct = $node->getContentType()) $newProperties[200][$prop] = $ct; break; - case '{DAV:}supported-report-set' : - $reports = array(); - foreach($this->plugins as $plugin) { - $reports = array_merge($reports, $plugin->getSupportedReportSet($myPath)); - } - $newProperties[200][$prop] = new Property\SupportedReportSet($reports); - break; - case '{DAV:}resourcetype' : - $newProperties[200]['{DAV:}resourcetype'] = new Property\ResourceType(); - foreach($this->resourceTypeMapping as $className => $resourceType) { - if ($node instanceof $className) $newProperties[200]['{DAV:}resourcetype']->add($resourceType); - } - break; - - } - - // If we were unable to find the property, we will list it as 404. - if (!$allProperties && !isset($newProperties[200][$prop])) $newProperties[404][$prop] = null; - - } - - $this->broadcastEvent('afterGetProperties',array(trim($myPath,'/'),&$newProperties, $node)); - - $newProperties['href'] = trim($myPath,'/'); - - // Its is a WebDAV recommendation to add a trailing slash to collectionnames. - // Apple's iCal also requires a trailing slash for principals (rfc 3744), though this is non-standard. - if ($myPath!='' && isset($newProperties[200]['{DAV:}resourcetype'])) { - $rt = $newProperties[200]['{DAV:}resourcetype']; - if ($rt->is('{DAV:}collection') || $rt->is('{DAV:}principal')) { - $newProperties['href'] .='/'; - } - } - - // If the resourcetype property was manually added to the requested property list, - // we will remove it again. - if ($removeRT) unset($newProperties[200]['{DAV:}resourcetype']); - - $returnPropertyList[] = $newProperties; - - } - - return $returnPropertyList; - - } - - /** - * This method is invoked by sub-systems creating a new file. - * - * Currently this is done by HTTP PUT and HTTP LOCK (in the Locks_Plugin). - * It was important to get this done through a centralized function, - * allowing plugins to intercept this using the beforeCreateFile event. - * - * This method will return true if the file was actually created - * - * @param string $uri - * @param resource $data - * @param string $etag - * @return bool - */ - public function createFile($uri,$data, &$etag = null) { - - list($dir,$name) = URLUtil::splitPath($uri); - - if (!$this->broadcastEvent('beforeBind',array($uri))) return false; - - $parent = $this->tree->getNodeForPath($dir); - if (!$parent instanceof ICollection) { - throw new Exception\Conflict('Files can only be created as children of collections'); - } - - if (!$this->broadcastEvent('beforeCreateFile',array($uri, &$data, $parent))) return false; - - $etag = $parent->createFile($name,$data); - $this->tree->markDirty($dir . '/' . $name); - - $this->broadcastEvent('afterBind',array($uri)); - $this->broadcastEvent('afterCreateFile',array($uri, $parent)); - - return true; - } - - /** - * This method is invoked by sub-systems creating a new directory. - * - * @param string $uri - * @return void - */ - public function createDirectory($uri) { - - $this->createCollection($uri,array('{DAV:}collection'),array()); - - } - - /** - * Use this method to create a new collection - * - * The {DAV:}resourcetype is specified using the resourceType array. - * At the very least it must contain {DAV:}collection. - * - * The properties array can contain a list of additional properties. - * - * @param string $uri The new uri - * @param array $resourceType The resourceType(s) - * @param array $properties A list of properties - * @return array|null - */ - public function createCollection($uri, array $resourceType, array $properties) { - - list($parentUri,$newName) = URLUtil::splitPath($uri); - - // Making sure {DAV:}collection was specified as resourceType - if (!in_array('{DAV:}collection', $resourceType)) { - throw new Exception\InvalidResourceType('The resourceType for this collection must at least include {DAV:}collection'); - } - - - // Making sure the parent exists - try { - - $parent = $this->tree->getNodeForPath($parentUri); - - } catch (Exception\NotFound $e) { - - throw new Exception\Conflict('Parent node does not exist'); - - } - - // Making sure the parent is a collection - if (!$parent instanceof ICollection) { - throw new Exception\Conflict('Parent node is not a collection'); - } - - - - // Making sure the child does not already exist - try { - $parent->getChild($newName); - - // If we got here.. it means there's already a node on that url, and we need to throw a 405 - throw new Exception\MethodNotAllowed('The resource you tried to create already exists'); - - } catch (Exception\NotFound $e) { - // This is correct - } - - - if (!$this->broadcastEvent('beforeBind',array($uri))) return; - - // There are 2 modes of operation. The standard collection - // creates the directory, and then updates properties - // the extended collection can create it directly. - if ($parent instanceof IExtendedCollection) { - - $parent->createExtendedCollection($newName, $resourceType, $properties); - - } else { - - // No special resourcetypes are supported - if (count($resourceType)>1) { - throw new Exception\InvalidResourceType('The {DAV:}resourcetype you specified is not supported here.'); - } - - $parent->createDirectory($newName); - $rollBack = false; - $exception = null; - $errorResult = null; - - if (count($properties)>0) { - - try { - - $errorResult = $this->updateProperties($uri, $properties); - if (!isset($errorResult[200])) { - $rollBack = true; - } - - } catch (Exception $e) { - - $rollBack = true; - $exception = $e; - - } - - } - - if ($rollBack) { - if (!$this->broadcastEvent('beforeUnbind',array($uri))) return; - $this->tree->delete($uri); - - // Re-throwing exception - if ($exception) throw $exception; - - return $errorResult; - } - - } - $this->tree->markDirty($parentUri); - $this->broadcastEvent('afterBind',array($uri)); - - } - - /** - * This method updates a resource's properties - * - * The properties array must be a list of properties. Array-keys are - * property names in clarknotation, array-values are it's values. - * If a property must be deleted, the value should be null. - * - * Note that this request should either completely succeed, or - * completely fail. - * - * The response is an array with statuscodes for keys, which in turn - * contain arrays with propertynames. This response can be used - * to generate a multistatus body. - * - * @param string $uri - * @param array $properties - * @return array - */ - public function updateProperties($uri, array $properties) { - - // we'll start by grabbing the node, this will throw the appropriate - // exceptions if it doesn't. - $node = $this->tree->getNodeForPath($uri); - - $result = array( - 200 => array(), - 403 => array(), - 424 => array(), - ); - $remainingProperties = $properties; - $hasError = false; - - // Running through all properties to make sure none of them are protected - if (!$hasError) foreach($properties as $propertyName => $value) { - if(in_array($propertyName, $this->protectedProperties)) { - $result[403][$propertyName] = null; - unset($remainingProperties[$propertyName]); - $hasError = true; - } - } - - if (!$hasError) { - // Allowing plugins to take care of property updating - $hasError = !$this->broadcastEvent('updateProperties',array( - &$remainingProperties, - &$result, - $node - )); - } - - // If the node is not an instance of SabreForRainLoop\DAV\IProperties, every - // property is 403 Forbidden - if (!$hasError && count($remainingProperties) && !($node instanceof IProperties)) { - $hasError = true; - foreach($properties as $propertyName=> $value) { - $result[403][$propertyName] = null; - } - $remainingProperties = array(); - } - - // Only if there were no errors we may attempt to update the resource - if (!$hasError) { - - if (count($remainingProperties)>0) { - - $updateResult = $node->updateProperties($remainingProperties); - - if ($updateResult===true) { - // success - foreach($remainingProperties as $propertyName=>$value) { - $result[200][$propertyName] = null; - } - - } elseif ($updateResult===false) { - // The node failed to update the properties for an - // unknown reason - foreach($remainingProperties as $propertyName=>$value) { - $result[403][$propertyName] = null; - } - - } elseif (is_array($updateResult)) { - - // The node has detailed update information - // We need to merge the results with the earlier results. - foreach($updateResult as $status => $props) { - if (is_array($props)) { - if (!isset($result[$status])) - $result[$status] = array(); - - $result[$status] = array_merge($result[$status], $updateResult[$status]); - } - } - - } else { - throw new Exception('Invalid result from updateProperties'); - } - $remainingProperties = array(); - } - - } - - foreach($remainingProperties as $propertyName=>$value) { - // if there are remaining properties, it must mean - // there's a dependency failure - $result[424][$propertyName] = null; - } - - // Removing empty array values - foreach($result as $status=>$props) { - - if (count($props)===0) unset($result[$status]); - - } - $result['href'] = $uri; - return $result; - - } - - /** - * This method checks the main HTTP preconditions. - * - * Currently these are: - * * If-Match - * * If-None-Match - * * If-Modified-Since - * * If-Unmodified-Since - * - * The method will return true if all preconditions are met - * The method will return false, or throw an exception if preconditions - * failed. If false is returned the operation should be aborted, and - * the appropriate HTTP response headers are already set. - * - * Normally this method will throw 412 Precondition Failed for failures - * related to If-None-Match, If-Match and If-Unmodified Since. It will - * set the status to 304 Not Modified for If-Modified_since. - * - * If the $handleAsGET argument is set to true, it will also return 304 - * Not Modified for failure of the If-None-Match precondition. This is the - * desired behaviour for HTTP GET and HTTP HEAD requests. - * - * @param bool $handleAsGET - * @return bool - */ - public function checkPreconditions($handleAsGET = false) { - - $uri = $this->getRequestUri(); - $node = null; - $lastMod = null; - $etag = null; - - if ($ifMatch = $this->httpRequest->getHeader('If-Match')) { - - // If-Match contains an entity tag. Only if the entity-tag - // matches we are allowed to make the request succeed. - // If the entity-tag is '*' we are only allowed to make the - // request succeed if a resource exists at that url. - try { - $node = $this->tree->getNodeForPath($uri); - } catch (Exception\NotFound $e) { - throw new Exception\PreconditionFailed('An If-Match header was specified and the resource did not exist','If-Match'); - } - - // Only need to check entity tags if they are not * - if ($ifMatch!=='*') { - - // There can be multiple etags - $ifMatch = explode(',',$ifMatch); - $haveMatch = false; - foreach($ifMatch as $ifMatchItem) { - - // Stripping any extra spaces - $ifMatchItem = trim($ifMatchItem,' '); - - $etag = $node->getETag(); - if ($etag===$ifMatchItem) { - $haveMatch = true; - } else { - // Evolution has a bug where it sometimes prepends the " - // with a \. This is our workaround. - if (str_replace('\\"','"', $ifMatchItem) === $etag) { - $haveMatch = true; - } - } - - } - if (!$haveMatch) { - throw new Exception\PreconditionFailed('An If-Match header was specified, but none of the specified the ETags matched.','If-Match'); - } - } - } - - if ($ifNoneMatch = $this->httpRequest->getHeader('If-None-Match')) { - - // The If-None-Match header contains an etag. - // Only if the ETag does not match the current ETag, the request will succeed - // The header can also contain *, in which case the request - // will only succeed if the entity does not exist at all. - $nodeExists = true; - if (!$node) { - try { - $node = $this->tree->getNodeForPath($uri); - } catch (Exception\NotFound $e) { - $nodeExists = false; - } - } - if ($nodeExists) { - $haveMatch = false; - if ($ifNoneMatch==='*') $haveMatch = true; - else { - - // There might be multiple etags - $ifNoneMatch = explode(',', $ifNoneMatch); - $etag = $node->getETag(); - - foreach($ifNoneMatch as $ifNoneMatchItem) { - - // Stripping any extra spaces - $ifNoneMatchItem = trim($ifNoneMatchItem,' '); - - if ($etag===$ifNoneMatchItem) $haveMatch = true; - - } - - } - - if ($haveMatch) { - if ($handleAsGET) { - $this->httpResponse->sendStatus(304); - return false; - } else { - throw new Exception\PreconditionFailed('An If-None-Match header was specified, but the ETag matched (or * was specified).','If-None-Match'); - } - } - } - - } - - if (!$ifNoneMatch && ($ifModifiedSince = $this->httpRequest->getHeader('If-Modified-Since'))) { - - // The If-Modified-Since header contains a date. We - // will only return the entity if it has been changed since - // that date. If it hasn't been changed, we return a 304 - // header - // Note that this header only has to be checked if there was no If-None-Match header - // as per the HTTP spec. - $date = HTTP\Util::parseHTTPDate($ifModifiedSince); - - if ($date) { - if (is_null($node)) { - $node = $this->tree->getNodeForPath($uri); - } - $lastMod = $node->getLastModified(); - if ($lastMod) { - $lastMod = new \DateTime('@' . $lastMod); - if ($lastMod <= $date) { - $this->httpResponse->sendStatus(304); - $this->httpResponse->setHeader('Last-Modified', HTTP\Util::toHTTPDate($lastMod)); - return false; - } - } - } - } - - if ($ifUnmodifiedSince = $this->httpRequest->getHeader('If-Unmodified-Since')) { - - // The If-Unmodified-Since will allow allow the request if the - // entity has not changed since the specified date. - $date = HTTP\Util::parseHTTPDate($ifUnmodifiedSince); - - // We must only check the date if it's valid - if ($date) { - if (is_null($node)) { - $node = $this->tree->getNodeForPath($uri); - } - $lastMod = $node->getLastModified(); - if ($lastMod) { - $lastMod = new \DateTime('@' . $lastMod); - if ($lastMod > $date) { - throw new Exception\PreconditionFailed('An If-Unmodified-Since header was specified, but the entity has been changed since the specified date.','If-Unmodified-Since'); - } - } - } - - } - return true; - - } - - // }}} - // {{{ XML Readers & Writers - - - /** - * Generates a WebDAV propfind response body based on a list of nodes. - * - * If 'strip404s' is set to true, all 404 responses will be removed. - * - * @param array $fileProperties The list with nodes - * @param bool strip404s - * @return string - */ - public function generateMultiStatus(array $fileProperties, $strip404s = false) { - - $dom = new \DOMDocument('1.0','utf-8'); - //$dom->formatOutput = true; - $multiStatus = $dom->createElement('d:multistatus'); - $dom->appendChild($multiStatus); - - // Adding in default namespaces - foreach($this->xmlNamespaces as $namespace=>$prefix) { - - $multiStatus->setAttribute('xmlns:' . $prefix,$namespace); - - } - - foreach($fileProperties as $entry) { - - $href = $entry['href']; - unset($entry['href']); - - if ($strip404s && isset($entry[404])) { - unset($entry[404]); - } - - $response = new Property\Response($href,$entry); - $response->serialize($this,$multiStatus); - - } - - return $dom->saveXML(); - - } - - /** - * This method parses a PropPatch request - * - * PropPatch changes the properties for a resource. This method - * returns a list of properties. - * - * The keys in the returned array contain the property name (e.g.: {DAV:}displayname, - * and the value contains the property value. If a property is to be removed the value - * will be null. - * - * @param string $body xml body - * @return array list of properties in need of updating or deletion - */ - public function parsePropPatchRequest($body) { - - //We'll need to change the DAV namespace declaration to something else in order to make it parsable - $dom = XMLUtil::loadDOMDocument($body); - - $newProperties = array(); - - foreach($dom->firstChild->childNodes as $child) { - - if ($child->nodeType !== XML_ELEMENT_NODE) continue; - - $operation = XMLUtil::toClarkNotation($child); - - if ($operation!=='{DAV:}set' && $operation!=='{DAV:}remove') continue; - - $innerProperties = XMLUtil::parseProperties($child, $this->propertyMap); - - foreach($innerProperties as $propertyName=>$propertyValue) { - - if ($operation==='{DAV:}remove') { - $propertyValue = null; - } - - $newProperties[$propertyName] = $propertyValue; - - } - - } - - return $newProperties; - - } - - /** - * This method parses the PROPFIND request and returns its information - * - * This will either be a list of properties, or an empty array; in which case - * an {DAV:}allprop was requested. - * - * @param string $body - * @return array - */ - public function parsePropFindRequest($body) { - - // If the propfind body was empty, it means IE is requesting 'all' properties - if (!$body) return array(); - - $dom = XMLUtil::loadDOMDocument($body); - $elem = $dom->getElementsByTagNameNS('urn:DAV','propfind')->item(0); - return array_keys(XMLUtil::parseProperties($elem)); - - } - - // }}} - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/ServerPlugin.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/ServerPlugin.php deleted file mode 100755 index 83cde575..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/ServerPlugin.php +++ /dev/null @@ -1,90 +0,0 @@ -name = $name; - foreach($children as $child) { - - if (!($child instanceof INode)) throw new Exception('Only instances of SabreForRainLoop\DAV\INode are allowed to be passed in the children argument'); - $this->addChild($child); - - } - - } - - /** - * Adds a new childnode to this collection - * - * @param INode $child - * @return void - */ - public function addChild(INode $child) { - - $this->children[$child->getName()] = $child; - - } - - /** - * Returns the name of the collection - * - * @return string - */ - public function getName() { - - return $this->name; - - } - - /** - * Returns a child object, by its name. - * - * This method makes use of the getChildren method to grab all the child nodes, and compares the name. - * Generally its wise to override this, as this can usually be optimized - * - * This method must throw SabreForRainLoop\DAV\Exception\NotFound if the node does not - * exist. - * - * @param string $name - * @throws Exception\NotFound - * @return INode - */ - public function getChild($name) { - - if (isset($this->children[$name])) return $this->children[$name]; - throw new Exception\NotFound('File not found: ' . $name . ' in \'' . $this->getName() . '\''); - - } - - /** - * Returns a list of children for this collection - * - * @return array - */ - public function getChildren() { - - return array_values($this->children); - - } - - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/SimpleFile.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/SimpleFile.php deleted file mode 100755 index d1b2d7e3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/SimpleFile.php +++ /dev/null @@ -1,121 +0,0 @@ -name = $name; - $this->contents = $contents; - $this->mimeType = $mimeType; - - } - - /** - * Returns the node name for this file. - * - * This name is used to construct the url. - * - * @return string - */ - public function getName() { - - return $this->name; - - } - - /** - * Returns the data - * - * This method may either return a string or a readable stream resource - * - * @return mixed - */ - public function get() { - - return $this->contents; - - } - - /** - * Returns the size of the file, in bytes. - * - * @return int - */ - public function getSize() { - - return strlen($this->contents); - - } - - /** - * Returns the ETag for a file - * - * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change. - * The ETag is an arbitrary string, but MUST be surrounded by double-quotes. - * - * Return null if the ETag can not effectively be determined - * @return string - */ - public function getETag() { - - return '"' . md5($this->contents) . '"'; - - } - - /** - * Returns the mime-type for a file - * - * If null is returned, we'll assume application/octet-stream - * @return string - */ - public function getContentType() { - - return $this->mimeType; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/StringUtil.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/StringUtil.php deleted file mode 100755 index 4c9dcee5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/StringUtil.php +++ /dev/null @@ -1,91 +0,0 @@ -dataDir = $dataDir; - - } - - /** - * Initialize the plugin - * - * This is called automatically be the Server class after this plugin is - * added with SabreForRainLoop\DAV\Server::addPlugin() - * - * @param Server $server - * @return void - */ - public function initialize(Server $server) { - - $this->server = $server; - $server->subscribeEvent('beforeMethod',array($this,'beforeMethod')); - $server->subscribeEvent('beforeCreateFile',array($this,'beforeCreateFile')); - - } - - /** - * This method is called before any HTTP method handler - * - * This method intercepts any GET, DELETE, PUT and PROPFIND calls to - * filenames that are known to match the 'temporary file' regex. - * - * @param string $method - * @param string $uri - * @return bool - */ - public function beforeMethod($method, $uri) { - - if (!$tempLocation = $this->isTempFile($uri)) - return true; - - switch($method) { - case 'GET' : - return $this->httpGet($tempLocation); - case 'PUT' : - return $this->httpPut($tempLocation); - case 'PROPFIND' : - return $this->httpPropfind($tempLocation, $uri); - case 'DELETE' : - return $this->httpDelete($tempLocation); - } - return true; - - } - - /** - * This method is invoked if some subsystem creates a new file. - * - * This is used to deal with HTTP LOCK requests which create a new - * file. - * - * @param string $uri - * @param resource $data - * @return bool - */ - public function beforeCreateFile($uri,$data) { - - if ($tempPath = $this->isTempFile($uri)) { - - $hR = $this->server->httpResponse; - $hR->setHeader('X-Sabre-Temp','true'); - file_put_contents($tempPath,$data); - return false; - } - return true; - - } - - /** - * This method will check if the url matches the temporary file pattern - * if it does, it will return an path based on $this->dataDir for the - * temporary file storage. - * - * @param string $path - * @return boolean|string - */ - protected function isTempFile($path) { - - // We're only interested in the basename. - list(, $tempPath) = URLUtil::splitPath($path); - - foreach($this->temporaryFilePatterns as $tempFile) { - - if (preg_match($tempFile,$tempPath)) { - return $this->getDataDir() . '/sabredav_' . md5($path) . '.tempfile'; - } - - } - - return false; - - } - - - /** - * This method handles the GET method for temporary files. - * If the file doesn't exist, it will return false which will kick in - * the regular system for the GET method. - * - * @param string $tempLocation - * @return bool - */ - public function httpGet($tempLocation) { - - if (!file_exists($tempLocation)) return true; - - $hR = $this->server->httpResponse; - $hR->setHeader('Content-Type','application/octet-stream'); - $hR->setHeader('Content-Length',filesize($tempLocation)); - $hR->setHeader('X-Sabre-Temp','true'); - $hR->sendStatus(200); - $hR->sendBody(fopen($tempLocation,'r')); - return false; - - } - - /** - * This method handles the PUT method. - * - * @param string $tempLocation - * @return bool - */ - public function httpPut($tempLocation) { - - $hR = $this->server->httpResponse; - $hR->setHeader('X-Sabre-Temp','true'); - - $newFile = !file_exists($tempLocation); - - if (!$newFile && ($this->server->httpRequest->getHeader('If-None-Match'))) { - throw new Exception\PreconditionFailed('The resource already exists, and an If-None-Match header was supplied'); - } - - file_put_contents($tempLocation,$this->server->httpRequest->getBody()); - $hR->sendStatus($newFile?201:200); - return false; - - } - - /** - * This method handles the DELETE method. - * - * If the file didn't exist, it will return false, which will make the - * standard HTTP DELETE handler kick in. - * - * @param string $tempLocation - * @return bool - */ - public function httpDelete($tempLocation) { - - if (!file_exists($tempLocation)) return true; - - unlink($tempLocation); - $hR = $this->server->httpResponse; - $hR->setHeader('X-Sabre-Temp','true'); - $hR->sendStatus(204); - return false; - - } - - /** - * This method handles the PROPFIND method. - * - * It's a very lazy method, it won't bother checking the request body - * for which properties were requested, and just sends back a default - * set of properties. - * - * @param string $tempLocation - * @param string $uri - * @return bool - */ - public function httpPropfind($tempLocation, $uri) { - - if (!file_exists($tempLocation)) return true; - - $hR = $this->server->httpResponse; - $hR->setHeader('X-Sabre-Temp','true'); - $hR->sendStatus(207); - $hR->setHeader('Content-Type','application/xml; charset=utf-8'); - - $this->server->parsePropFindRequest($this->server->httpRequest->getBody(true)); - - $properties = array( - 'href' => $uri, - 200 => array( - '{DAV:}getlastmodified' => new Property\GetLastModified(filemtime($tempLocation)), - '{DAV:}getcontentlength' => filesize($tempLocation), - '{DAV:}resourcetype' => new Property\ResourceType(null), - '{'.Server::NS_SABREDAV.'}tempFile' => true, - - ), - ); - - $data = $this->server->generateMultiStatus(array($properties)); - $hR->sendBody($data); - return false; - - } - - - /** - * This method returns the directory where the temporary files should be stored. - * - * @return string - */ - protected function getDataDir() - { - return $this->dataDir; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Tree.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Tree.php deleted file mode 100755 index 49fa99d6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Tree.php +++ /dev/null @@ -1,193 +0,0 @@ -getNodeForPath($path); - return true; - - } catch (Exception\NotFound $e) { - - return false; - - } - - } - - /** - * Copies a file from path to another - * - * @param string $sourcePath The source location - * @param string $destinationPath The full destination path - * @return void - */ - public function copy($sourcePath, $destinationPath) { - - $sourceNode = $this->getNodeForPath($sourcePath); - - // grab the dirname and basename components - list($destinationDir, $destinationName) = URLUtil::splitPath($destinationPath); - - $destinationParent = $this->getNodeForPath($destinationDir); - $this->copyNode($sourceNode,$destinationParent,$destinationName); - - $this->markDirty($destinationDir); - - } - - /** - * Moves a file from one location to another - * - * @param string $sourcePath The path to the file which should be moved - * @param string $destinationPath The full destination path, so not just the destination parent node - * @return int - */ - public function move($sourcePath, $destinationPath) { - - list($sourceDir, $sourceName) = URLUtil::splitPath($sourcePath); - list($destinationDir, $destinationName) = URLUtil::splitPath($destinationPath); - - if ($sourceDir===$destinationDir) { - $renameable = $this->getNodeForPath($sourcePath); - $renameable->setName($destinationName); - } else { - $this->copy($sourcePath,$destinationPath); - $this->getNodeForPath($sourcePath)->delete(); - } - $this->markDirty($sourceDir); - $this->markDirty($destinationDir); - - } - - /** - * Deletes a node from the tree - * - * @param string $path - * @return void - */ - public function delete($path) { - - $node = $this->getNodeForPath($path); - $node->delete(); - - list($parent) = URLUtil::splitPath($path); - $this->markDirty($parent); - - } - - /** - * Returns a list of childnodes for a given path. - * - * @param string $path - * @return array - */ - public function getChildren($path) { - - $node = $this->getNodeForPath($path); - return $node->getChildren(); - - } - - /** - * This method is called with every tree update - * - * Examples of tree updates are: - * * node deletions - * * node creations - * * copy - * * move - * * renaming nodes - * - * If Tree classes implement a form of caching, this will allow - * them to make sure caches will be expired. - * - * If a path is passed, it is assumed that the entire subtree is dirty - * - * @param string $path - * @return void - */ - public function markDirty($path) { - - - } - - /** - * copyNode - * - * @param INode $source - * @param ICollection $destinationParent - * @param string $destinationName - * @return void - */ - protected function copyNode(INode $source,ICollection $destinationParent,$destinationName = null) { - - if (!$destinationName) $destinationName = $source->getName(); - - if ($source instanceof IFile) { - - $data = $source->get(); - - // If the body was a string, we need to convert it to a stream - if (is_string($data)) { - $stream = fopen('php://temp','r+'); - fwrite($stream,$data); - rewind($stream); - $data = $stream; - } - $destinationParent->createFile($destinationName,$data); - $destination = $destinationParent->getChild($destinationName); - - } elseif ($source instanceof ICollection) { - - $destinationParent->createDirectory($destinationName); - - $destination = $destinationParent->getChild($destinationName); - foreach($source->getChildren() as $child) { - - $this->copyNode($child,$destination); - - } - - } - if ($source instanceof IProperties && $destination instanceof IProperties) { - - $props = $source->getProperties(array()); - $destination->updateProperties($props); - - } - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Tree/Filesystem.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Tree/Filesystem.php deleted file mode 100755 index 7546c058..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/Tree/Filesystem.php +++ /dev/null @@ -1,133 +0,0 @@ -basePath = $basePath; - - } - - /** - * Returns a new node for the given path - * - * @param string $path - * @return DAV\FS\Node - */ - public function getNodeForPath($path) { - - $realPath = $this->getRealPath($path); - if (!file_exists($realPath)) { - throw new DAV\Exception\NotFound('File at location ' . $realPath . ' not found'); - } - if (is_dir($realPath)) { - return new DAV\FS\Directory($realPath); - } else { - return new DAV\FS\File($realPath); - } - - } - - /** - * Returns the real filesystem path for a webdav url. - * - * @param string $publicPath - * @return string - */ - protected function getRealPath($publicPath) { - - return rtrim($this->basePath,'/') . '/' . trim($publicPath,'/'); - - } - - /** - * Copies a file or directory. - * - * This method must work recursively and delete the destination - * if it exists - * - * @param string $source - * @param string $destination - * @return void - */ - public function copy($source,$destination) { - - $source = $this->getRealPath($source); - $destination = $this->getRealPath($destination); - $this->realCopy($source,$destination); - - } - - /** - * Used by self::copy - * - * @param string $source - * @param string $destination - * @return void - */ - protected function realCopy($source,$destination) { - - if (is_file($source)) { - copy($source,$destination); - } else { - mkdir($destination); - foreach(scandir($source) as $subnode) { - - if ($subnode=='.' || $subnode=='..') continue; - $this->realCopy($source.'/'.$subnode,$destination.'/'.$subnode); - - } - } - - } - - /** - * Moves a file or directory recursively. - * - * If the destination exists, delete it first. - * - * @param string $source - * @param string $destination - * @return void - */ - public function move($source,$destination) { - - $source = $this->getRealPath($source); - $destination = $this->getRealPath($destination); - rename($source,$destination); - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/URLUtil.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/URLUtil.php deleted file mode 100755 index 65f4d9ba..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAV/URLUtil.php +++ /dev/null @@ -1,121 +0,0 @@ - - * will be returned as: - * {http://www.example.org}myelem - * - * This format is used throughout the SabreDAV sourcecode. - * Elements encoded with the urn:DAV namespace will - * be returned as if they were in the DAV: namespace. This is to avoid - * compatibility problems. - * - * This function will return null if a nodetype other than an Element is passed. - * - * @param \DOMNode $dom - * @return string - */ - static function toClarkNotation(\DOMNode $dom) { - - if ($dom->nodeType !== XML_ELEMENT_NODE) return null; - - // Mapping back to the real namespace, in case it was dav - if ($dom->namespaceURI=='urn:DAV') $ns = 'DAV:'; else $ns = $dom->namespaceURI; - - // Mapping to clark notation - return '{' . $ns . '}' . $dom->localName; - - } - - /** - * Parses a clark-notation string, and returns the namespace and element - * name components. - * - * If the string was invalid, it will throw an InvalidArgumentException. - * - * @param string $str - * @throws InvalidArgumentException - * @return array - */ - static function parseClarkNotation($str) { - - if (!preg_match('/^{([^}]*)}(.*)$/',$str,$matches)) { - throw new \InvalidArgumentException('\'' . $str . '\' is not a valid clark-notation formatted string'); - } - - return array( - $matches[1], - $matches[2] - ); - - } - - /** - * This method takes an XML document (as string) and converts all instances of the - * DAV: namespace to urn:DAV - * - * This is unfortunately needed, because the DAV: namespace violates the xml namespaces - * spec, and causes the DOM to throw errors - * - * @param string $xmlDocument - * @return array|string|null - */ - static function convertDAVNamespace($xmlDocument) { - - // This is used to map the DAV: namespace to urn:DAV. This is needed, because the DAV: - // namespace is actually a violation of the XML namespaces specification, and will cause errors - return preg_replace("/xmlns(:[A-Za-z0-9_]*)?=(\"|\')DAV:(\\2)/","xmlns\\1=\\2urn:DAV\\2",$xmlDocument); - - } - - /** - * This method provides a generic way to load a DOMDocument for WebDAV use. - * - * This method throws a SabreForRainLoop\DAV\Exception\BadRequest exception for any xml errors. - * It does not preserve whitespace, and it converts the DAV: namespace to urn:DAV. - * - * @param string $xml - * @throws SabreForRainLoop\DAV\Exception\BadRequest - * @return DOMDocument - */ - static function loadDOMDocument($xml) { - - if (empty($xml)) - throw new Exception\BadRequest('Empty XML document sent'); - - // The BitKinex client sends xml documents as UTF-16. PHP 5.3.1 (and presumably lower) - // does not support this, so we must intercept this and convert to UTF-8. - if (substr($xml,0,12) === "\x3c\x00\x3f\x00\x78\x00\x6d\x00\x6c\x00\x20\x00") { - - // Note: the preceeding byte sequence is "]*)encoding="UTF-16"([^>]*)>|u','',$xml); - - } - - // Retaining old error setting - $oldErrorSetting = libxml_use_internal_errors(true); - - // Clearing any previous errors - libxml_clear_errors(); - - $dom = new \DOMDocument(); - - // We don't generally care about any whitespace - $dom->preserveWhiteSpace = false; - - $dom->loadXML(self::convertDAVNamespace($xml),LIBXML_NOWARNING | LIBXML_NOERROR); - - if ($error = libxml_get_last_error()) { - libxml_clear_errors(); - throw new Exception\BadRequest('The request body had an invalid XML body. (message: ' . $error->message . ', errorcode: ' . $error->code . ', line: ' . $error->line . ')'); - } - - // Restoring old mechanism for error handling - if ($oldErrorSetting===false) libxml_use_internal_errors(false); - - return $dom; - - } - - /** - * Parses all WebDAV properties out of a DOM Element - * - * Generally WebDAV properties are enclosed in {DAV:}prop elements. This - * method helps by going through all these and pulling out the actual - * propertynames, making them array keys and making the property values, - * well.. the array values. - * - * If no value was given (self-closing element) null will be used as the - * value. This is used in for example PROPFIND requests. - * - * Complex values are supported through the propertyMap argument. The - * propertyMap should have the clark-notation properties as it's keys, and - * classnames as values. - * - * When any of these properties are found, the unserialize() method will be - * (statically) called. The result of this method is used as the value. - * - * @param \DOMElement $parentNode - * @param array $propertyMap - * @return array - */ - static function parseProperties(\DOMElement $parentNode, array $propertyMap = array()) { - - $propList = array(); - foreach($parentNode->childNodes as $propNode) { - - if (self::toClarkNotation($propNode)!=='{DAV:}prop') continue; - - foreach($propNode->childNodes as $propNodeData) { - - /* If there are no elements in here, we actually get 1 text node, this special case is dedicated to netdrive */ - if ($propNodeData->nodeType != XML_ELEMENT_NODE) continue; - - $propertyName = self::toClarkNotation($propNodeData); - if (isset($propertyMap[$propertyName])) { - $propList[$propertyName] = call_user_func(array($propertyMap[$propertyName],'unserialize'),$propNodeData); - } else { - $propList[$propertyName] = $propNodeData->textContent; - } - } - - - } - return $propList; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/AbstractPrincipalCollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/AbstractPrincipalCollection.php deleted file mode 100755 index 342796fb..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/AbstractPrincipalCollection.php +++ /dev/null @@ -1,155 +0,0 @@ -principalPrefix = $principalPrefix; - $this->principalBackend = $principalBackend; - - } - - /** - * This method returns a node for a principal. - * - * The passed array contains principal information, and is guaranteed to - * at least contain a uri item. Other properties may or may not be - * supplied by the authentication backend. - * - * @param array $principalInfo - * @return IPrincipal - */ - abstract function getChildForPrincipal(array $principalInfo); - - /** - * Returns the name of this collection. - * - * @return string - */ - public function getName() { - - list(,$name) = DAV\URLUtil::splitPath($this->principalPrefix); - return $name; - - } - - /** - * Return the list of users - * - * @return array - */ - public function getChildren() { - - if ($this->disableListing) - throw new DAV\Exception\MethodNotAllowed('Listing members of this collection is disabled'); - - $children = array(); - foreach($this->principalBackend->getPrincipalsByPrefix($this->principalPrefix) as $principalInfo) { - - $children[] = $this->getChildForPrincipal($principalInfo); - - - } - return $children; - - } - - /** - * Returns a child object, by its name. - * - * @param string $name - * @throws DAV\Exception\NotFound - * @return IPrincipal - */ - public function getChild($name) { - - $principalInfo = $this->principalBackend->getPrincipalByPath($this->principalPrefix . '/' . $name); - if (!$principalInfo) throw new DAV\Exception\NotFound('Principal with name ' . $name . ' not found'); - return $this->getChildForPrincipal($principalInfo); - - } - - /** - * This method is used to search for principals matching a set of - * properties. - * - * This search is specifically used by RFC3744's principal-property-search - * REPORT. You should at least allow searching on - * http://sabredav.org/ns}email-address. - * - * The actual search should be a unicode-non-case-sensitive search. The - * keys in searchProperties are the WebDAV property names, while the values - * are the property values to search on. - * - * If multiple properties are being searched on, the search should be - * AND'ed. - * - * This method should simply return a list of 'child names', which may be - * used to call $this->getChild in the future. - * - * @param array $searchProperties - * @return array - */ - public function searchPrincipals(array $searchProperties) { - - $result = $this->principalBackend->searchPrincipals($this->principalPrefix, $searchProperties); - $r = array(); - - foreach($result as $row) { - list(, $r[]) = DAV\URLUtil::splitPath($row); - } - - return $r; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/AceConflict.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/AceConflict.php deleted file mode 100755 index cc91a95d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/AceConflict.php +++ /dev/null @@ -1,35 +0,0 @@ -ownerDocument; - - $np = $doc->createElementNS('DAV:','d:no-ace-conflict'); - $errorNode->appendChild($np); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NeedPrivileges.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NeedPrivileges.php deleted file mode 100755 index 9b4db9b5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NeedPrivileges.php +++ /dev/null @@ -1,83 +0,0 @@ -uri = $uri; - $this->privileges = $privileges; - - parent::__construct('User did not have the required privileges (' . implode(',', $privileges) . ') for path "' . $uri . '"'); - - } - - /** - * Adds in extra information in the xml response. - * - * This method adds the {DAV:}need-privileges element as defined in rfc3744 - * - * @param DAV\Server $server - * @param \DOMElement $errorNode - * @return void - */ - public function serialize(DAV\Server $server,\DOMElement $errorNode) { - - $doc = $errorNode->ownerDocument; - - $np = $doc->createElementNS('DAV:','d:need-privileges'); - $errorNode->appendChild($np); - - foreach($this->privileges as $privilege) { - - $resource = $doc->createElementNS('DAV:','d:resource'); - $np->appendChild($resource); - - $resource->appendChild($doc->createElementNS('DAV:','d:href',$server->getBaseUri() . $this->uri)); - - $priv = $doc->createElementNS('DAV:','d:privilege'); - $resource->appendChild($priv); - - preg_match('/^{([^}]*)}(.*)$/',$privilege,$privilegeParts); - $priv->appendChild($doc->createElementNS($privilegeParts[1],'d:' . $privilegeParts[2])); - - - } - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NoAbstract.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NoAbstract.php deleted file mode 100755 index 0f821062..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NoAbstract.php +++ /dev/null @@ -1,35 +0,0 @@ -ownerDocument; - - $np = $doc->createElementNS('DAV:','d:no-abstract'); - $errorNode->appendChild($np); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NotRecognizedPrincipal.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NotRecognizedPrincipal.php deleted file mode 100755 index 9e95cc51..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NotRecognizedPrincipal.php +++ /dev/null @@ -1,35 +0,0 @@ -ownerDocument; - - $np = $doc->createElementNS('DAV:','d:recognized-principal'); - $errorNode->appendChild($np); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NotSupportedPrivilege.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NotSupportedPrivilege.php deleted file mode 100755 index 461ebe3f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Exception/NotSupportedPrivilege.php +++ /dev/null @@ -1,35 +0,0 @@ -ownerDocument; - - $np = $doc->createElementNS('DAV:','d:not-supported-privilege'); - $errorNode->appendChild($np); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/IACL.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/IACL.php deleted file mode 100755 index 31971d54..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/IACL.php +++ /dev/null @@ -1,74 +0,0 @@ -getChild in the future. - * - * @param array $searchProperties - * @return array - */ - function searchPrincipals(array $searchProperties); - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Plugin.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Plugin.php deleted file mode 100755 index 89269b43..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Plugin.php +++ /dev/null @@ -1,1402 +0,0 @@ - 'Display name', - '{http://sabredav.org/ns}email-address' => 'Email address', - ); - - /** - * Any principal uri's added here, will automatically be added to the list - * of ACL's. They will effectively receive {DAV:}all privileges, as a - * protected privilege. - * - * @var array - */ - public $adminPrincipals = array(); - - /** - * Returns a list of features added by this plugin. - * - * This list is used in the response of a HTTP OPTIONS request. - * - * @return array - */ - public function getFeatures() { - - return array('access-control', 'calendarserver-principal-property-search'); - - } - - /** - * Returns a list of available methods for a given url - * - * @param string $uri - * @return array - */ - public function getMethods($uri) { - - return array('ACL'); - - } - - /** - * Returns a plugin name. - * - * Using this name other plugins will be able to access other plugins - * using SabreForRainLoop\DAV\Server::getPlugin - * - * @return string - */ - public function getPluginName() { - - return 'acl'; - - } - - /** - * Returns a list of reports this plugin supports. - * - * This will be used in the {DAV:}supported-report-set property. - * Note that you still need to subscribe to the 'report' event to actually - * implement them - * - * @param string $uri - * @return array - */ - public function getSupportedReportSet($uri) { - - return array( - '{DAV:}expand-property', - '{DAV:}principal-property-search', - '{DAV:}principal-search-property-set', - ); - - } - - - /** - * Checks if the current user has the specified privilege(s). - * - * You can specify a single privilege, or a list of privileges. - * This method will throw an exception if the privilege is not available - * and return true otherwise. - * - * @param string $uri - * @param array|string $privileges - * @param int $recursion - * @param bool $throwExceptions if set to false, this method won't throw exceptions. - * @throws SabreForRainLoop\DAVACL\Exception\NeedPrivileges - * @return bool - */ - public function checkPrivileges($uri, $privileges, $recursion = self::R_PARENT, $throwExceptions = true) { - - if (!is_array($privileges)) $privileges = array($privileges); - - $acl = $this->getCurrentUserPrivilegeSet($uri); - - if (is_null($acl)) { - if ($this->allowAccessToNodesWithoutACL) { - return true; - } else { - if ($throwExceptions) - throw new Exception\NeedPrivileges($uri,$privileges); - else - return false; - - } - } - - $failed = array(); - foreach($privileges as $priv) { - - if (!in_array($priv, $acl)) { - $failed[] = $priv; - } - - } - - if ($failed) { - if ($throwExceptions) - throw new Exception\NeedPrivileges($uri,$failed); - else - return false; - } - return true; - - } - - /** - * Returns the standard users' principal. - * - * This is one authorative principal url for the current user. - * This method will return null if the user wasn't logged in. - * - * @return string|null - */ - public function getCurrentUserPrincipal() { - - $authPlugin = $this->server->getPlugin('auth'); - if (is_null($authPlugin)) return null; - /** @var $authPlugin SabreForRainLoop\DAV\Auth\Plugin */ - - $userName = $authPlugin->getCurrentUser(); - if (!$userName) return null; - - return $this->defaultUsernamePath . '/' . $userName; - - } - - - /** - * Returns a list of principals that's associated to the current - * user, either directly or through group membership. - * - * @return array - */ - public function getCurrentUserPrincipals() { - - $currentUser = $this->getCurrentUserPrincipal(); - - if (is_null($currentUser)) return array(); - - return array_merge( - array($currentUser), - $this->getPrincipalMembership($currentUser) - ); - - } - - /** - * This array holds a cache for all the principals that are associated with - * a single principal. - * - * @var array - */ - protected $principalMembershipCache = array(); - - - /** - * Returns all the principal groups the specified principal is a member of. - * - * @param string $principal - * @return array - */ - public function getPrincipalMembership($mainPrincipal) { - - // First check our cache - if (isset($this->principalMembershipCache[$mainPrincipal])) { - return $this->principalMembershipCache[$mainPrincipal]; - } - - $check = array($mainPrincipal); - $principals = array(); - - while(count($check)) { - - $principal = array_shift($check); - - $node = $this->server->tree->getNodeForPath($principal); - if ($node instanceof IPrincipal) { - foreach($node->getGroupMembership() as $groupMember) { - - if (!in_array($groupMember, $principals)) { - - $check[] = $groupMember; - $principals[] = $groupMember; - - } - - } - - } - - } - - // Store the result in the cache - $this->principalMembershipCache[$mainPrincipal] = $principals; - - return $principals; - - } - - /** - * Returns the supported privilege structure for this ACL plugin. - * - * See RFC3744 for more details. Currently we default on a simple, - * standard structure. - * - * You can either get the list of privileges by a uri (path) or by - * specifying a Node. - * - * @param string|DAV\INode $node - * @return array - */ - public function getSupportedPrivilegeSet($node) { - - if (is_string($node)) { - $node = $this->server->tree->getNodeForPath($node); - } - - if ($node instanceof IACL) { - $result = $node->getSupportedPrivilegeSet(); - - if ($result) - return $result; - } - - return self::getDefaultSupportedPrivilegeSet(); - - } - - /** - * Returns a fairly standard set of privileges, which may be useful for - * other systems to use as a basis. - * - * @return array - */ - static function getDefaultSupportedPrivilegeSet() { - - return array( - 'privilege' => '{DAV:}all', - 'abstract' => true, - 'aggregates' => array( - array( - 'privilege' => '{DAV:}read', - 'aggregates' => array( - array( - 'privilege' => '{DAV:}read-acl', - 'abstract' => true, - ), - array( - 'privilege' => '{DAV:}read-current-user-privilege-set', - 'abstract' => true, - ), - ), - ), // {DAV:}read - array( - 'privilege' => '{DAV:}write', - 'aggregates' => array( - array( - 'privilege' => '{DAV:}write-acl', - 'abstract' => true, - ), - array( - 'privilege' => '{DAV:}write-properties', - 'abstract' => true, - ), - array( - 'privilege' => '{DAV:}write-content', - 'abstract' => true, - ), - array( - 'privilege' => '{DAV:}bind', - 'abstract' => true, - ), - array( - 'privilege' => '{DAV:}unbind', - 'abstract' => true, - ), - array( - 'privilege' => '{DAV:}unlock', - 'abstract' => true, - ), - ), - ), // {DAV:}write - ), - ); // {DAV:}all - - } - - /** - * Returns the supported privilege set as a flat list - * - * This is much easier to parse. - * - * The returned list will be index by privilege name. - * The value is a struct containing the following properties: - * - aggregates - * - abstract - * - concrete - * - * @param string|DAV\INode $node - * @return array - */ - final public function getFlatPrivilegeSet($node) { - - $privs = $this->getSupportedPrivilegeSet($node); - - $flat = array(); - $this->getFPSTraverse($privs, null, $flat); - - return $flat; - - } - - /** - * Traverses the privilege set tree for reordering - * - * This function is solely used by getFlatPrivilegeSet, and would have been - * a closure if it wasn't for the fact I need to support PHP 5.2. - * - * @param array $priv - * @param $concrete - * @param array $flat - * @return void - */ - final private function getFPSTraverse($priv, $concrete, &$flat) { - - $myPriv = array( - 'privilege' => $priv['privilege'], - 'abstract' => isset($priv['abstract']) && $priv['abstract'], - 'aggregates' => array(), - 'concrete' => isset($priv['abstract']) && $priv['abstract']?$concrete:$priv['privilege'], - ); - - if (isset($priv['aggregates'])) - foreach($priv['aggregates'] as $subPriv) $myPriv['aggregates'][] = $subPriv['privilege']; - - $flat[$priv['privilege']] = $myPriv; - - if (isset($priv['aggregates'])) { - - foreach($priv['aggregates'] as $subPriv) { - - $this->getFPSTraverse($subPriv, $myPriv['concrete'], $flat); - - } - - } - - } - - /** - * Returns the full ACL list. - * - * Either a uri or a DAV\INode may be passed. - * - * null will be returned if the node doesn't support ACLs. - * - * @param string|DAV\INode $node - * @return array - */ - public function getACL($node) { - - if (is_string($node)) { - $node = $this->server->tree->getNodeForPath($node); - } - if (!$node instanceof IACL) { - return null; - } - $acl = $node->getACL(); - foreach($this->adminPrincipals as $adminPrincipal) { - $acl[] = array( - 'principal' => $adminPrincipal, - 'privilege' => '{DAV:}all', - 'protected' => true, - ); - } - return $acl; - - } - - /** - * Returns a list of privileges the current user has - * on a particular node. - * - * Either a uri or a DAV\INode may be passed. - * - * null will be returned if the node doesn't support ACLs. - * - * @param string|DAV\INode $node - * @return array - */ - public function getCurrentUserPrivilegeSet($node) { - - if (is_string($node)) { - $node = $this->server->tree->getNodeForPath($node); - } - - $acl = $this->getACL($node); - - if (is_null($acl)) return null; - - $principals = $this->getCurrentUserPrincipals(); - - $collected = array(); - - foreach($acl as $ace) { - - $principal = $ace['principal']; - - switch($principal) { - - case '{DAV:}owner' : - $owner = $node->getOwner(); - if ($owner && in_array($owner, $principals)) { - $collected[] = $ace; - } - break; - - - // 'all' matches for every user - case '{DAV:}all' : - - // 'authenticated' matched for every user that's logged in. - // Since it's not possible to use ACL while not being logged - // in, this is also always true. - case '{DAV:}authenticated' : - $collected[] = $ace; - break; - - // 'unauthenticated' can never occur either, so we simply - // ignore these. - case '{DAV:}unauthenticated' : - break; - - default : - if (in_array($ace['principal'], $principals)) { - $collected[] = $ace; - } - break; - - } - - - } - - // Now we deduct all aggregated privileges. - $flat = $this->getFlatPrivilegeSet($node); - - $collected2 = array(); - while(count($collected)) { - - $current = array_pop($collected); - $collected2[] = $current['privilege']; - - foreach($flat[$current['privilege']]['aggregates'] as $subPriv) { - $collected2[] = $subPriv; - $collected[] = $flat[$subPriv]; - } - - } - - return array_values(array_unique($collected2)); - - } - - /** - * Principal property search - * - * This method can search for principals matching certain values in - * properties. - * - * This method will return a list of properties for the matched properties. - * - * @param array $searchProperties The properties to search on. This is a - * key-value list. The keys are property - * names, and the values the strings to - * match them on. - * @param array $requestedProperties This is the list of properties to - * return for every match. - * @param string $collectionUri The principal collection to search on. - * If this is ommitted, the standard - * principal collection-set will be used. - * @return array This method returns an array structure similar to - * SabreForRainLoop\DAV\Server::getPropertiesForPath. Returned - * properties are index by a HTTP status code. - * - */ - public function principalSearch(array $searchProperties, array $requestedProperties, $collectionUri = null) { - - if (!is_null($collectionUri)) { - $uris = array($collectionUri); - } else { - $uris = $this->principalCollectionSet; - } - - $lookupResults = array(); - foreach($uris as $uri) { - - $principalCollection = $this->server->tree->getNodeForPath($uri); - if (!$principalCollection instanceof IPrincipalCollection) { - // Not a principal collection, we're simply going to ignore - // this. - continue; - } - - $results = $principalCollection->searchPrincipals($searchProperties); - foreach($results as $result) { - $lookupResults[] = rtrim($uri,'/') . '/' . $result; - } - - } - - $matches = array(); - - foreach($lookupResults as $lookupResult) { - - list($matches[]) = $this->server->getPropertiesForPath($lookupResult, $requestedProperties, 0); - - } - - return $matches; - - } - - /** - * Sets up the plugin - * - * This method is automatically called by the server class. - * - * @param DAV\Server $server - * @return void - */ - public function initialize(DAV\Server $server) { - - $this->server = $server; - $server->subscribeEvent('beforeGetProperties',array($this,'beforeGetProperties')); - - $server->subscribeEvent('beforeMethod', array($this,'beforeMethod'),20); - $server->subscribeEvent('beforeBind', array($this,'beforeBind'),20); - $server->subscribeEvent('beforeUnbind', array($this,'beforeUnbind'),20); - $server->subscribeEvent('updateProperties',array($this,'updateProperties')); - $server->subscribeEvent('beforeUnlock', array($this,'beforeUnlock'),20); - $server->subscribeEvent('report',array($this,'report')); - $server->subscribeEvent('unknownMethod', array($this, 'unknownMethod')); - - array_push($server->protectedProperties, - '{DAV:}alternate-URI-set', - '{DAV:}principal-URL', - '{DAV:}group-membership', - '{DAV:}principal-collection-set', - '{DAV:}current-user-principal', - '{DAV:}supported-privilege-set', - '{DAV:}current-user-privilege-set', - '{DAV:}acl', - '{DAV:}acl-restrictions', - '{DAV:}inherited-acl-set', - '{DAV:}owner', - '{DAV:}group' - ); - - // Automatically mapping nodes implementing IPrincipal to the - // {DAV:}principal resourcetype. - $server->resourceTypeMapping['SabreForRainLoop\\DAVACL\\IPrincipal'] = '{DAV:}principal'; - - // Mapping the group-member-set property to the HrefList property - // class. - $server->propertyMap['{DAV:}group-member-set'] = 'SabreForRainLoop\\DAV\\Property\\HrefList'; - - } - - - /* {{{ Event handlers */ - - /** - * Triggered before any method is handled - * - * @param string $method - * @param string $uri - * @return void - */ - public function beforeMethod($method, $uri) { - - $exists = $this->server->tree->nodeExists($uri); - - // If the node doesn't exists, none of these checks apply - if (!$exists) return; - - switch($method) { - - case 'GET' : - case 'HEAD' : - case 'OPTIONS' : - // For these 3 we only need to know if the node is readable. - $this->checkPrivileges($uri,'{DAV:}read'); - break; - - case 'PUT' : - case 'LOCK' : - case 'UNLOCK' : - // This method requires the write-content priv if the node - // already exists, and bind on the parent if the node is being - // created. - // The bind privilege is handled in the beforeBind event. - $this->checkPrivileges($uri,'{DAV:}write-content'); - break; - - - case 'PROPPATCH' : - $this->checkPrivileges($uri,'{DAV:}write-properties'); - break; - - case 'ACL' : - $this->checkPrivileges($uri,'{DAV:}write-acl'); - break; - - case 'COPY' : - case 'MOVE' : - // Copy requires read privileges on the entire source tree. - // If the target exists write-content normally needs to be - // checked, however, we're deleting the node beforehand and - // creating a new one after, so this is handled by the - // beforeUnbind event. - // - // The creation of the new node is handled by the beforeBind - // event. - // - // If MOVE is used beforeUnbind will also be used to check if - // the sourcenode can be deleted. - $this->checkPrivileges($uri,'{DAV:}read',self::R_RECURSIVE); - - break; - - } - - } - - /** - * Triggered before a new node is created. - * - * This allows us to check permissions for any operation that creates a - * new node, such as PUT, MKCOL, MKCALENDAR, LOCK, COPY and MOVE. - * - * @param string $uri - * @return void - */ - public function beforeBind($uri) { - - list($parentUri,$nodeName) = DAV\URLUtil::splitPath($uri); - $this->checkPrivileges($parentUri,'{DAV:}bind'); - - } - - /** - * Triggered before a node is deleted - * - * This allows us to check permissions for any operation that will delete - * an existing node. - * - * @param string $uri - * @return void - */ - public function beforeUnbind($uri) { - - list($parentUri,$nodeName) = DAV\URLUtil::splitPath($uri); - $this->checkPrivileges($parentUri,'{DAV:}unbind',self::R_RECURSIVEPARENTS); - - } - - /** - * Triggered before a node is unlocked. - * - * @param string $uri - * @param DAV\Locks\LockInfo $lock - * @TODO: not yet implemented - * @return void - */ - public function beforeUnlock($uri, DAV\Locks\LockInfo $lock) { - - - } - - /** - * Triggered before properties are looked up in specific nodes. - * - * @param string $uri - * @param DAV\INode $node - * @param array $requestedProperties - * @param array $returnedProperties - * @TODO really should be broken into multiple methods, or even a class. - * @return bool - */ - public function beforeGetProperties($uri, DAV\INode $node, &$requestedProperties, &$returnedProperties) { - - // Checking the read permission - if (!$this->checkPrivileges($uri,'{DAV:}read',self::R_PARENT,false)) { - - // User is not allowed to read properties - if ($this->hideNodesFromListings) { - return false; - } - - // Marking all requested properties as '403'. - foreach($requestedProperties as $key=>$requestedProperty) { - unset($requestedProperties[$key]); - $returnedProperties[403][$requestedProperty] = null; - } - return; - - } - - /* Adding principal properties */ - if ($node instanceof IPrincipal) { - - if (false !== ($index = array_search('{DAV:}alternate-URI-set', $requestedProperties))) { - - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}alternate-URI-set'] = new DAV\Property\HrefList($node->getAlternateUriSet()); - - } - if (false !== ($index = array_search('{DAV:}principal-URL', $requestedProperties))) { - - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}principal-URL'] = new DAV\Property\Href($node->getPrincipalUrl() . '/'); - - } - if (false !== ($index = array_search('{DAV:}group-member-set', $requestedProperties))) { - - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}group-member-set'] = new DAV\Property\HrefList($node->getGroupMemberSet()); - - } - if (false !== ($index = array_search('{DAV:}group-membership', $requestedProperties))) { - - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}group-membership'] = new DAV\Property\HrefList($node->getGroupMembership()); - - } - - if (false !== ($index = array_search('{DAV:}displayname', $requestedProperties))) { - - $returnedProperties[200]['{DAV:}displayname'] = $node->getDisplayName(); - - } - - } - if (false !== ($index = array_search('{DAV:}principal-collection-set', $requestedProperties))) { - - unset($requestedProperties[$index]); - $val = $this->principalCollectionSet; - // Ensuring all collections end with a slash - foreach($val as $k=>$v) $val[$k] = $v . '/'; - $returnedProperties[200]['{DAV:}principal-collection-set'] = new DAV\Property\HrefList($val); - - } - if (false !== ($index = array_search('{DAV:}current-user-principal', $requestedProperties))) { - - unset($requestedProperties[$index]); - if ($url = $this->getCurrentUserPrincipal()) { - $returnedProperties[200]['{DAV:}current-user-principal'] = new Property\Principal(Property\Principal::HREF, $url . '/'); - } else { - $returnedProperties[200]['{DAV:}current-user-principal'] = new Property\Principal(Property\Principal::UNAUTHENTICATED); - } - - } - if (false !== ($index = array_search('{DAV:}supported-privilege-set', $requestedProperties))) { - - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}supported-privilege-set'] = new Property\SupportedPrivilegeSet($this->getSupportedPrivilegeSet($node)); - - } - if (false !== ($index = array_search('{DAV:}current-user-privilege-set', $requestedProperties))) { - - if (!$this->checkPrivileges($uri, '{DAV:}read-current-user-privilege-set', self::R_PARENT, false)) { - $returnedProperties[403]['{DAV:}current-user-privilege-set'] = null; - unset($requestedProperties[$index]); - } else { - $val = $this->getCurrentUserPrivilegeSet($node); - if (!is_null($val)) { - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}current-user-privilege-set'] = new Property\CurrentUserPrivilegeSet($val); - } - } - - } - - /* The ACL property contains all the permissions */ - if (false !== ($index = array_search('{DAV:}acl', $requestedProperties))) { - - if (!$this->checkPrivileges($uri, '{DAV:}read-acl', self::R_PARENT, false)) { - - unset($requestedProperties[$index]); - $returnedProperties[403]['{DAV:}acl'] = null; - - } else { - - $acl = $this->getACL($node); - if (!is_null($acl)) { - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}acl'] = new Property\Acl($this->getACL($node)); - } - - } - - } - - /* The acl-restrictions property contains information on how privileges - * must behave. - */ - if (false !== ($index = array_search('{DAV:}acl-restrictions', $requestedProperties))) { - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}acl-restrictions'] = new Property\AclRestrictions(); - } - - /* Adding ACL properties */ - if ($node instanceof IACL) { - - if (false !== ($index = array_search('{DAV:}owner', $requestedProperties))) { - - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}owner'] = new DAV\Property\Href($node->getOwner() . '/'); - - } - - } - - } - - /** - * This method intercepts PROPPATCH methods and make sure the - * group-member-set is updated correctly. - * - * @param array $propertyDelta - * @param array $result - * @param DAV\INode $node - * @return bool - */ - public function updateProperties(&$propertyDelta, &$result, DAV\INode $node) { - - if (!array_key_exists('{DAV:}group-member-set', $propertyDelta)) - return; - - if (is_null($propertyDelta['{DAV:}group-member-set'])) { - $memberSet = array(); - } elseif ($propertyDelta['{DAV:}group-member-set'] instanceof DAV\Property\HrefList) { - $memberSet = array_map( - array($this->server,'calculateUri'), - $propertyDelta['{DAV:}group-member-set']->getHrefs() - ); - } else { - throw new DAV\Exception('The group-member-set property MUST be an instance of SabreForRainLoop\DAV\Property\HrefList or null'); - } - - if (!($node instanceof IPrincipal)) { - $result[403]['{DAV:}group-member-set'] = null; - unset($propertyDelta['{DAV:}group-member-set']); - - // Returning false will stop the updateProperties process - return false; - } - - $node->setGroupMemberSet($memberSet); - // We must also clear our cache, just in case - - $this->principalMembershipCache = array(); - - $result[200]['{DAV:}group-member-set'] = null; - unset($propertyDelta['{DAV:}group-member-set']); - - } - - /** - * This method handles HTTP REPORT requests - * - * @param string $reportName - * @param \DOMNode $dom - * @return bool - */ - public function report($reportName, $dom) { - - switch($reportName) { - - case '{DAV:}principal-property-search' : - $this->principalPropertySearchReport($dom); - return false; - case '{DAV:}principal-search-property-set' : - $this->principalSearchPropertySetReport($dom); - return false; - case '{DAV:}expand-property' : - $this->expandPropertyReport($dom); - return false; - - } - - } - - /** - * This event is triggered for any HTTP method that is not known by the - * webserver. - * - * @param string $method - * @param string $uri - * @return bool - */ - public function unknownMethod($method, $uri) { - - if ($method!=='ACL') return; - - $this->httpACL($uri); - return false; - - } - - /** - * This method is responsible for handling the 'ACL' event. - * - * @param string $uri - * @return void - */ - public function httpACL($uri) { - - $body = $this->server->httpRequest->getBody(true); - $dom = DAV\XMLUtil::loadDOMDocument($body); - - $newAcl = - Property\Acl::unserialize($dom->firstChild) - ->getPrivileges(); - - // Normalizing urls - foreach($newAcl as $k=>$newAce) { - $newAcl[$k]['principal'] = $this->server->calculateUri($newAce['principal']); - } - - $node = $this->server->tree->getNodeForPath($uri); - - if (!($node instanceof IACL)) { - throw new DAV\Exception\MethodNotAllowed('This node does not support the ACL method'); - } - - $oldAcl = $this->getACL($node); - - $supportedPrivileges = $this->getFlatPrivilegeSet($node); - - /* Checking if protected principals from the existing principal set are - not overwritten. */ - foreach($oldAcl as $oldAce) { - - if (!isset($oldAce['protected']) || !$oldAce['protected']) continue; - - $found = false; - foreach($newAcl as $newAce) { - if ( - $newAce['privilege'] === $oldAce['privilege'] && - $newAce['principal'] === $oldAce['principal'] && - $newAce['protected'] - ) - $found = true; - } - - if (!$found) - throw new Exception\AceConflict('This resource contained a protected {DAV:}ace, but this privilege did not occur in the ACL request'); - - } - - foreach($newAcl as $newAce) { - - // Do we recognize the privilege - if (!isset($supportedPrivileges[$newAce['privilege']])) { - throw new Exception\NotSupportedPrivilege('The privilege you specified (' . $newAce['privilege'] . ') is not recognized by this server'); - } - - if ($supportedPrivileges[$newAce['privilege']]['abstract']) { - throw new Exception\NoAbstract('The privilege you specified (' . $newAce['privilege'] . ') is an abstract privilege'); - } - - // Looking up the principal - try { - $principal = $this->server->tree->getNodeForPath($newAce['principal']); - } catch (DAV\Exception\NotFound $e) { - throw new Exception\NotRecognizedPrincipal('The specified principal (' . $newAce['principal'] . ') does not exist'); - } - if (!($principal instanceof IPrincipal)) { - throw new Exception\NotRecognizedPrincipal('The specified uri (' . $newAce['principal'] . ') is not a principal'); - } - - } - $node->setACL($newAcl); - - } - - /* }}} */ - - /* Reports {{{ */ - - /** - * The expand-property report is defined in RFC3253 section 3-8. - * - * This report is very similar to a standard PROPFIND. The difference is - * that it has the additional ability to look at properties containing a - * {DAV:}href element, follow that property and grab additional elements - * there. - * - * Other rfc's, such as ACL rely on this report, so it made sense to put - * it in this plugin. - * - * @param \DOMElement $dom - * @return void - */ - protected function expandPropertyReport($dom) { - - $requestedProperties = $this->parseExpandPropertyReportRequest($dom->firstChild->firstChild); - $depth = $this->server->getHTTPDepth(0); - $requestUri = $this->server->getRequestUri(); - - $result = $this->expandProperties($requestUri,$requestedProperties,$depth); - - $dom = new \DOMDocument('1.0','utf-8'); - $dom->formatOutput = true; - $multiStatus = $dom->createElement('d:multistatus'); - $dom->appendChild($multiStatus); - - // Adding in default namespaces - foreach($this->server->xmlNamespaces as $namespace=>$prefix) { - - $multiStatus->setAttribute('xmlns:' . $prefix,$namespace); - - } - - foreach($result as $response) { - $response->serialize($this->server, $multiStatus); - } - - $xml = $dom->saveXML(); - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->sendStatus(207); - $this->server->httpResponse->sendBody($xml); - - } - - /** - * This method is used by expandPropertyReport to parse - * out the entire HTTP request. - * - * @param \DOMElement $node - * @return array - */ - protected function parseExpandPropertyReportRequest($node) { - - $requestedProperties = array(); - do { - - if (DAV\XMLUtil::toClarkNotation($node)!=='{DAV:}property') continue; - - if ($node->firstChild) { - - $children = $this->parseExpandPropertyReportRequest($node->firstChild); - - } else { - - $children = array(); - - } - - $namespace = $node->getAttribute('namespace'); - if (!$namespace) $namespace = 'DAV:'; - - $propName = '{'.$namespace.'}' . $node->getAttribute('name'); - $requestedProperties[$propName] = $children; - - } while ($node = $node->nextSibling); - - return $requestedProperties; - - } - - /** - * This method expands all the properties and returns - * a list with property values - * - * @param array $path - * @param array $requestedProperties the list of required properties - * @param int $depth - * @return array - */ - protected function expandProperties($path, array $requestedProperties, $depth) { - - $foundProperties = $this->server->getPropertiesForPath($path, array_keys($requestedProperties), $depth); - - $result = array(); - - foreach($foundProperties as $node) { - - foreach($requestedProperties as $propertyName=>$childRequestedProperties) { - - // We're only traversing if sub-properties were requested - if(count($childRequestedProperties)===0) continue; - - // We only have to do the expansion if the property was found - // and it contains an href element. - if (!array_key_exists($propertyName,$node[200])) continue; - - if ($node[200][$propertyName] instanceof DAV\Property\IHref) { - $hrefs = array($node[200][$propertyName]->getHref()); - } elseif ($node[200][$propertyName] instanceof DAV\Property\HrefList) { - $hrefs = $node[200][$propertyName]->getHrefs(); - } - - $childProps = array(); - foreach($hrefs as $href) { - $childProps = array_merge($childProps, $this->expandProperties($href, $childRequestedProperties, 0)); - } - $node[200][$propertyName] = new DAV\Property\ResponseList($childProps); - - } - $result[] = new DAV\Property\Response($node['href'], $node); - - } - - return $result; - - } - - /** - * principalSearchPropertySetReport - * - * This method responsible for handing the - * {DAV:}principal-search-property-set report. This report returns a list - * of properties the client may search on, using the - * {DAV:}principal-property-search report. - * - * @param \DOMDocument $dom - * @return void - */ - protected function principalSearchPropertySetReport(\DOMDocument $dom) { - - $httpDepth = $this->server->getHTTPDepth(0); - if ($httpDepth!==0) { - throw new DAV\Exception\BadRequest('This report is only defined when Depth: 0'); - } - - if ($dom->firstChild->hasChildNodes()) - throw new DAV\Exception\BadRequest('The principal-search-property-set report element is not allowed to have child elements'); - - $dom = new \DOMDocument('1.0','utf-8'); - $dom->formatOutput = true; - $root = $dom->createElement('d:principal-search-property-set'); - $dom->appendChild($root); - // Adding in default namespaces - foreach($this->server->xmlNamespaces as $namespace=>$prefix) { - - $root->setAttribute('xmlns:' . $prefix,$namespace); - - } - - $nsList = $this->server->xmlNamespaces; - - foreach($this->principalSearchPropertySet as $propertyName=>$description) { - - $psp = $dom->createElement('d:principal-search-property'); - $root->appendChild($psp); - - $prop = $dom->createElement('d:prop'); - $psp->appendChild($prop); - - $propName = null; - preg_match('/^{([^}]*)}(.*)$/',$propertyName,$propName); - - $currentProperty = $dom->createElement($nsList[$propName[1]] . ':' . $propName[2]); - $prop->appendChild($currentProperty); - - $descriptionElem = $dom->createElement('d:description'); - $descriptionElem->setAttribute('xml:lang','en'); - $descriptionElem->appendChild($dom->createTextNode($description)); - $psp->appendChild($descriptionElem); - - - } - - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->sendBody($dom->saveXML()); - - } - - /** - * principalPropertySearchReport - * - * This method is responsible for handing the - * {DAV:}principal-property-search report. This report can be used for - * clients to search for groups of principals, based on the value of one - * or more properties. - * - * @param \DOMDocument $dom - * @return void - */ - protected function principalPropertySearchReport(\DOMDocument $dom) { - - list($searchProperties, $requestedProperties, $applyToPrincipalCollectionSet) = $this->parsePrincipalPropertySearchReportRequest($dom); - - $uri = null; - if (!$applyToPrincipalCollectionSet) { - $uri = $this->server->getRequestUri(); - } - $result = $this->principalSearch($searchProperties, $requestedProperties, $uri); - - $prefer = $this->server->getHTTPPRefer(); - - $this->server->httpResponse->sendStatus(207); - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); - $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result, $prefer['return-minimal'])); - - } - - /** - * parsePrincipalPropertySearchReportRequest - * - * This method parses the request body from a - * {DAV:}principal-property-search report. - * - * This method returns an array with two elements: - * 1. an array with properties to search on, and their values - * 2. a list of propertyvalues that should be returned for the request. - * - * @param \DOMDocument $dom - * @return array - */ - protected function parsePrincipalPropertySearchReportRequest($dom) { - - $httpDepth = $this->server->getHTTPDepth(0); - if ($httpDepth!==0) { - throw new DAV\Exception\BadRequest('This report is only defined when Depth: 0'); - } - - $searchProperties = array(); - - $applyToPrincipalCollectionSet = false; - - // Parsing the search request - foreach($dom->firstChild->childNodes as $searchNode) { - - if (DAV\XMLUtil::toClarkNotation($searchNode) == '{DAV:}apply-to-principal-collection-set') { - $applyToPrincipalCollectionSet = true; - } - - if (DAV\XMLUtil::toClarkNotation($searchNode)!=='{DAV:}property-search') - continue; - - $propertyName = null; - $propertyValue = null; - - foreach($searchNode->childNodes as $childNode) { - - switch(DAV\XMLUtil::toClarkNotation($childNode)) { - - case '{DAV:}prop' : - $property = DAV\XMLUtil::parseProperties($searchNode); - reset($property); - $propertyName = key($property); - break; - - case '{DAV:}match' : - $propertyValue = $childNode->textContent; - break; - - } - - - } - - if (is_null($propertyName) || is_null($propertyValue)) - throw new DAV\Exception\BadRequest('Invalid search request. propertyname: ' . $propertyName . '. propertvvalue: ' . $propertyValue); - - $searchProperties[$propertyName] = $propertyValue; - - } - - return array($searchProperties, array_keys(DAV\XMLUtil::parseProperties($dom->firstChild)), $applyToPrincipalCollectionSet); - - } - - - /* }}} */ - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Principal.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Principal.php deleted file mode 100755 index b2d9e9da..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Principal.php +++ /dev/null @@ -1,281 +0,0 @@ -principalBackend = $principalBackend; - $this->principalProperties = $principalProperties; - - } - - /** - * Returns the full principal url - * - * @return string - */ - public function getPrincipalUrl() { - - return $this->principalProperties['uri']; - - } - - /** - * Returns a list of alternative urls for a principal - * - * This can for example be an email address, or ldap url. - * - * @return array - */ - public function getAlternateUriSet() { - - $uris = array(); - if (isset($this->principalProperties['{DAV:}alternate-URI-set'])) { - - $uris = $this->principalProperties['{DAV:}alternate-URI-set']; - - } - - if (isset($this->principalProperties['{http://sabredav.org/ns}email-address'])) { - $uris[] = 'mailto:' . $this->principalProperties['{http://sabredav.org/ns}email-address']; - } - - return array_unique($uris); - - } - - /** - * Returns the list of group members - * - * If this principal is a group, this function should return - * all member principal uri's for the group. - * - * @return array - */ - public function getGroupMemberSet() { - - return $this->principalBackend->getGroupMemberSet($this->principalProperties['uri']); - - } - - /** - * Returns the list of groups this principal is member of - * - * If this principal is a member of a (list of) groups, this function - * should return a list of principal uri's for it's members. - * - * @return array - */ - public function getGroupMembership() { - - return $this->principalBackend->getGroupMemberShip($this->principalProperties['uri']); - - } - - - /** - * Sets a list of group members - * - * If this principal is a group, this method sets all the group members. - * The list of members is always overwritten, never appended to. - * - * This method should throw an exception if the members could not be set. - * - * @param array $groupMembers - * @return void - */ - public function setGroupMemberSet(array $groupMembers) { - - $this->principalBackend->setGroupMemberSet($this->principalProperties['uri'], $groupMembers); - - } - - - /** - * Returns this principals name. - * - * @return string - */ - public function getName() { - - $uri = $this->principalProperties['uri']; - list(, $name) = DAV\URLUtil::splitPath($uri); - return $name; - - } - - /** - * Returns the name of the user - * - * @return string - */ - public function getDisplayName() { - - if (isset($this->principalProperties['{DAV:}displayname'])) { - return $this->principalProperties['{DAV:}displayname']; - } else { - return $this->getName(); - } - - } - - /** - * Returns a list of properties - * - * @param array $requestedProperties - * @return array - */ - public function getProperties($requestedProperties) { - - $newProperties = array(); - foreach($requestedProperties as $propName) { - - if (isset($this->principalProperties[$propName])) { - $newProperties[$propName] = $this->principalProperties[$propName]; - } - - } - - return $newProperties; - - } - - /** - * Updates this principals properties. - * - * @param array $mutations - * @see SabreForRainLoop\DAV\IProperties::updateProperties - * @return bool|array - */ - public function updateProperties($mutations) { - - return $this->principalBackend->updatePrincipal($this->principalProperties['uri'], $mutations); - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->principalProperties['uri']; - - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->getPrincipalUrl(), - 'protected' => true, - ), - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new DAV\Exception\MethodNotAllowed('Updating ACLs is not allowed here'); - - } - - /** - * Returns the list of supported privileges for this node. - * - * The returned data structure is a list of nested privileges. - * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple - * standard structure. - * - * If null is returned from this method, the default privilege set is used, - * which is fine for most common usecases. - * - * @return array|null - */ - public function getSupportedPrivilegeSet() { - - return null; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalBackend/AbstractBackend.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalBackend/AbstractBackend.php deleted file mode 100755 index 3f500e30..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalBackend/AbstractBackend.php +++ /dev/null @@ -1,18 +0,0 @@ - array( - * '{DAV:}prop1' => null, - * ), - * 201 => array( - * '{DAV:}prop2' => null, - * ), - * 403 => array( - * '{DAV:}prop3' => null, - * ), - * 424 => array( - * '{DAV:}prop4' => null, - * ), - * ); - * - * In this previous example prop1 was successfully updated or deleted, and - * prop2 was succesfully created. - * - * prop3 failed to update due to '403 Forbidden' and because of this prop4 - * also could not be updated with '424 Failed dependency'. - * - * This last example was actually incorrect. While 200 and 201 could appear - * in 1 response, if there's any error (403) the other properties should - * always fail with 423 (failed dependency). - * - * But anyway, if you don't want to scratch your head over this, just - * return true or false. - * - * @param string $path - * @param array $mutations - * @return array|bool - */ - function updatePrincipal($path, $mutations); - - /** - * This method is used to search for principals matching a set of - * properties. - * - * This search is specifically used by RFC3744's principal-property-search - * REPORT. You should at least allow searching on - * http://sabredav.org/ns}email-address. - * - * The actual search should be a unicode-non-case-sensitive search. The - * keys in searchProperties are the WebDAV property names, while the values - * are the property values to search on. - * - * If multiple properties are being searched on, the search should be - * AND'ed. - * - * This method should simply return an array with full principal uri's. - * - * If somebody attempted to search on a property the backend does not - * support, you should simply return 0 results. - * - * You can also just return 0 results if you choose to not support - * searching at all, but keep in mind that this may stop certain features - * from working. - * - * @param string $prefixPath - * @param array $searchProperties - * @return array - */ - function searchPrincipals($prefixPath, array $searchProperties); - - /** - * Returns the list of members for a group-principal - * - * @param string $principal - * @return array - */ - function getGroupMemberSet($principal); - - /** - * Returns the list of groups a principal is a member of - * - * @param string $principal - * @return array - */ - function getGroupMembership($principal); - - /** - * Updates the list of group members for a group principal. - * - * The principals should be passed as a list of uri's. - * - * @param string $principal - * @param array $members - * @return void - */ - function setGroupMemberSet($principal, array $members); - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalBackend/PDO.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalBackend/PDO.php deleted file mode 100755 index 4717c495..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalBackend/PDO.php +++ /dev/null @@ -1,428 +0,0 @@ - array( - 'dbField' => 'displayname', - ), - - /** - * This property is actually used by the CardDAV plugin, where it gets - * mapped to {http://calendarserver.orgi/ns/}me-card. - * - * The reason we don't straight-up use that property, is because - * me-card is defined as a property on the users' addressbook - * collection. - */ - '{http://sabredav.org/ns}vcard-url' => array( - 'dbField' => 'vcardurl', - ), - /** - * This is the users' primary email-address. - */ - '{http://sabredav.org/ns}email-address' => array( - 'dbField' => 'email', - ), - ); - - /** - * Sets up the backend. - * - * @param PDO $pdo - * @param string $tableName - * @param string $groupMembersTableName - */ - public function __construct(\PDO $pdo, $tableName = 'principals', $groupMembersTableName = 'groupmembers') { - - $this->pdo = $pdo; - $this->tableName = $tableName; - $this->groupMembersTableName = $groupMembersTableName; - - } - - - /** - * Returns a list of principals based on a prefix. - * - * This prefix will often contain something like 'principals'. You are only - * expected to return principals that are in this base path. - * - * You are expected to return at least a 'uri' for every user, you can - * return any additional properties if you wish so. Common properties are: - * {DAV:}displayname - * {http://sabredav.org/ns}email-address - This is a custom SabreDAV - * field that's actualy injected in a number of other properties. If - * you have an email address, use this property. - * - * @param string $prefixPath - * @return array - */ - public function getPrincipalsByPrefix($prefixPath) { - - $fields = array( - 'uri', - ); - - foreach($this->fieldMap as $key=>$value) { - $fields[] = $value['dbField']; - } - $result = $this->pdo->query('SELECT '.implode(',', $fields).' FROM '. $this->tableName); - - $principals = array(); - - while($row = $result->fetch(\PDO::FETCH_ASSOC)) { - - // Checking if the principal is in the prefix - list($rowPrefix) = DAV\URLUtil::splitPath($row['uri']); - if ($rowPrefix !== $prefixPath) continue; - - $principal = array( - 'uri' => $row['uri'], - ); - foreach($this->fieldMap as $key=>$value) { - if ($row[$value['dbField']]) { - $principal[$key] = $row[$value['dbField']]; - } - } - $principals[] = $principal; - - } - - return $principals; - - } - - /** - * Returns a specific principal, specified by it's path. - * The returned structure should be the exact same as from - * getPrincipalsByPrefix. - * - * @param string $path - * @return array - */ - public function getPrincipalByPath($path) { - - $fields = array( - 'id', - 'uri', - ); - - foreach($this->fieldMap as $key=>$value) { - $fields[] = $value['dbField']; - } - $stmt = $this->pdo->prepare('SELECT '.implode(',', $fields).' FROM '. $this->tableName . ' WHERE uri = ?'); - $stmt->execute(array($path)); - - $row = $stmt->fetch(\PDO::FETCH_ASSOC); - if (!$row) return; - - $principal = array( - 'id' => $row['id'], - 'uri' => $row['uri'], - ); - foreach($this->fieldMap as $key=>$value) { - if ($row[$value['dbField']]) { - $principal[$key] = $row[$value['dbField']]; - } - } - return $principal; - - } - - /** - * Updates one ore more webdav properties on a principal. - * - * The list of mutations is supplied as an array. Each key in the array is - * a propertyname, such as {DAV:}displayname. - * - * Each value is the actual value to be updated. If a value is null, it - * must be deleted. - * - * This method should be atomic. It must either completely succeed, or - * completely fail. Success and failure can simply be returned as 'true' or - * 'false'. - * - * It is also possible to return detailed failure information. In that case - * an array such as this should be returned: - * - * array( - * 200 => array( - * '{DAV:}prop1' => null, - * ), - * 201 => array( - * '{DAV:}prop2' => null, - * ), - * 403 => array( - * '{DAV:}prop3' => null, - * ), - * 424 => array( - * '{DAV:}prop4' => null, - * ), - * ); - * - * In this previous example prop1 was successfully updated or deleted, and - * prop2 was succesfully created. - * - * prop3 failed to update due to '403 Forbidden' and because of this prop4 - * also could not be updated with '424 Failed dependency'. - * - * This last example was actually incorrect. While 200 and 201 could appear - * in 1 response, if there's any error (403) the other properties should - * always fail with 423 (failed dependency). - * - * But anyway, if you don't want to scratch your head over this, just - * return true or false. - * - * @param string $path - * @param array $mutations - * @return array|bool - */ - public function updatePrincipal($path, $mutations) { - - $updateAble = array(); - foreach($mutations as $key=>$value) { - - // We are not aware of this field, we must fail. - if (!isset($this->fieldMap[$key])) { - - $response = array( - 403 => array( - $key => null, - ), - 424 => array(), - ); - - // Adding the rest to the response as a 424 - foreach($mutations as $subKey=>$subValue) { - if ($subKey !== $key) { - $response[424][$subKey] = null; - } - } - return $response; - } - - $updateAble[$this->fieldMap[$key]['dbField']] = $value; - - } - - // No fields to update - $query = "UPDATE " . $this->tableName . " SET "; - - $first = true; - foreach($updateAble as $key => $value) { - if (!$first) { - $query.= ', '; - } - $first = false; - $query.= "$key = :$key "; - } - $query.='WHERE uri = :uri'; - $stmt = $this->pdo->prepare($query); - $updateAble['uri'] = $path; - $stmt->execute($updateAble); - - return true; - - } - - /** - * This method is used to search for principals matching a set of - * properties. - * - * This search is specifically used by RFC3744's principal-property-search - * REPORT. You should at least allow searching on - * http://sabredav.org/ns}email-address. - * - * The actual search should be a unicode-non-case-sensitive search. The - * keys in searchProperties are the WebDAV property names, while the values - * are the property values to search on. - * - * If multiple properties are being searched on, the search should be - * AND'ed. - * - * This method should simply return an array with full principal uri's. - * - * If somebody attempted to search on a property the backend does not - * support, you should simply return 0 results. - * - * You can also just return 0 results if you choose to not support - * searching at all, but keep in mind that this may stop certain features - * from working. - * - * @param string $prefixPath - * @param array $searchProperties - * @return array - */ - public function searchPrincipals($prefixPath, array $searchProperties) { - - $query = 'SELECT uri FROM ' . $this->tableName . ' WHERE 1=1 '; - $values = array(); - foreach($searchProperties as $property => $value) { - - switch($property) { - - case '{DAV:}displayname' : - $query.=' AND displayname LIKE ?'; - $values[] = '%' . $value . '%'; - break; - case '{http://sabredav.org/ns}email-address' : - $query.=' AND email LIKE ?'; - $values[] = '%' . $value . '%'; - break; - default : - // Unsupported property - return array(); - - } - - } - $stmt = $this->pdo->prepare($query); - $stmt->execute($values); - - $principals = array(); - while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { - - // Checking if the principal is in the prefix - list($rowPrefix) = DAV\URLUtil::splitPath($row['uri']); - if ($rowPrefix !== $prefixPath) continue; - - $principals[] = $row['uri']; - - } - - return $principals; - - } - - /** - * Returns the list of members for a group-principal - * - * @param string $principal - * @return array - */ - public function getGroupMemberSet($principal) { - - $principal = $this->getPrincipalByPath($principal); - if (!$principal) throw new DAV\Exception('Principal not found'); - - $stmt = $this->pdo->prepare('SELECT principals.uri as uri FROM '.$this->groupMembersTableName.' AS groupmembers LEFT JOIN '.$this->tableName.' AS principals ON groupmembers.member_id = principals.id WHERE groupmembers.principal_id = ?'); - $stmt->execute(array($principal['id'])); - - $result = array(); - while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { - $result[] = $row['uri']; - } - return $result; - - } - - /** - * Returns the list of groups a principal is a member of - * - * @param string $principal - * @return array - */ - public function getGroupMembership($principal) { - - $principal = $this->getPrincipalByPath($principal); - if (!$principal) throw new DAV\Exception('Principal not found'); - - $stmt = $this->pdo->prepare('SELECT principals.uri as uri FROM '.$this->groupMembersTableName.' AS groupmembers LEFT JOIN '.$this->tableName.' AS principals ON groupmembers.principal_id = principals.id WHERE groupmembers.member_id = ?'); - $stmt->execute(array($principal['id'])); - - $result = array(); - while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { - $result[] = $row['uri']; - } - return $result; - - } - - /** - * Updates the list of group members for a group principal. - * - * The principals should be passed as a list of uri's. - * - * @param string $principal - * @param array $members - * @return void - */ - public function setGroupMemberSet($principal, array $members) { - - // Grabbing the list of principal id's. - $stmt = $this->pdo->prepare('SELECT id, uri FROM '.$this->tableName.' WHERE uri IN (? ' . str_repeat(', ? ', count($members)) . ');'); - $stmt->execute(array_merge(array($principal), $members)); - - $memberIds = array(); - $principalId = null; - - while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { - if ($row['uri'] == $principal) { - $principalId = $row['id']; - } else { - $memberIds[] = $row['id']; - } - } - if (!$principalId) throw new DAV\Exception('Principal not found'); - - // Wiping out old members - $stmt = $this->pdo->prepare('DELETE FROM '.$this->groupMembersTableName.' WHERE principal_id = ?;'); - $stmt->execute(array($principalId)); - - foreach($memberIds as $memberId) { - - $stmt = $this->pdo->prepare('INSERT INTO '.$this->groupMembersTableName.' (principal_id, member_id) VALUES (?, ?);'); - $stmt->execute(array($principalId, $memberId)); - - } - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalCollection.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalCollection.php deleted file mode 100755 index aa8cdd89..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalCollection.php +++ /dev/null @@ -1,33 +0,0 @@ -principalBackend, $principal); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/Acl.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/Acl.php deleted file mode 100755 index 8284fd37..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/Acl.php +++ /dev/null @@ -1,211 +0,0 @@ -privileges = $privileges; - $this->prefixBaseUrl = $prefixBaseUrl; - - } - - /** - * Returns the list of privileges for this property - * - * @return array - */ - public function getPrivileges() { - - return $this->privileges; - - } - - /** - * Serializes the property into a DOMElement - * - * @param DAV\Server $server - * @param \DOMElement $node - * @return void - */ - public function serialize(DAV\Server $server,\DOMElement $node) { - - $doc = $node->ownerDocument; - foreach($this->privileges as $ace) { - - $this->serializeAce($doc, $node, $ace, $server); - - } - - } - - /** - * Unserializes the {DAV:}acl xml element. - * - * @param \DOMElement $dom - * @return Acl - */ - static public function unserialize(\DOMElement $dom) { - - $privileges = array(); - $xaces = $dom->getElementsByTagNameNS('urn:DAV','ace'); - for($ii=0; $ii < $xaces->length; $ii++) { - - $xace = $xaces->item($ii); - $principal = $xace->getElementsByTagNameNS('urn:DAV','principal'); - if ($principal->length !== 1) { - throw new DAV\Exception\BadRequest('Each {DAV:}ace element must have one {DAV:}principal element'); - } - $principal = Principal::unserialize($principal->item(0)); - - switch($principal->getType()) { - case Principal::HREF : - $principal = $principal->getHref(); - break; - case Principal::AUTHENTICATED : - $principal = '{DAV:}authenticated'; - break; - case Principal::UNAUTHENTICATED : - $principal = '{DAV:}unauthenticated'; - break; - case Principal::ALL : - $principal = '{DAV:}all'; - break; - - } - - $protected = false; - - if ($xace->getElementsByTagNameNS('urn:DAV','protected')->length > 0) { - $protected = true; - } - - $grants = $xace->getElementsByTagNameNS('urn:DAV','grant'); - if ($grants->length < 1) { - throw new DAV\Exception\NotImplemented('Every {DAV:}ace element must have a {DAV:}grant element. {DAV:}deny is not yet supported'); - } - $grant = $grants->item(0); - - $xprivs = $grant->getElementsByTagNameNS('urn:DAV','privilege'); - for($jj=0; $jj<$xprivs->length; $jj++) { - - $xpriv = $xprivs->item($jj); - - $privilegeName = null; - - for ($kk=0;$kk<$xpriv->childNodes->length;$kk++) { - - $childNode = $xpriv->childNodes->item($kk); - if ($t = DAV\XMLUtil::toClarkNotation($childNode)) { - $privilegeName = $t; - break; - } - } - if (is_null($privilegeName)) { - throw new DAV\Exception\BadRequest('{DAV:}privilege elements must have a privilege element contained within them.'); - } - - $privileges[] = array( - 'principal' => $principal, - 'protected' => $protected, - 'privilege' => $privilegeName, - ); - - } - - } - - return new self($privileges); - - } - - /** - * Serializes a single access control entry. - * - * @param \DOMDocument $doc - * @param \DOMElement $node - * @param array $ace - * @param DAV\Server $server - * @return void - */ - private function serializeAce($doc,$node,$ace, DAV\Server $server) { - - $xace = $doc->createElementNS('DAV:','d:ace'); - $node->appendChild($xace); - - $principal = $doc->createElementNS('DAV:','d:principal'); - $xace->appendChild($principal); - switch($ace['principal']) { - case '{DAV:}authenticated' : - $principal->appendChild($doc->createElementNS('DAV:','d:authenticated')); - break; - case '{DAV:}unauthenticated' : - $principal->appendChild($doc->createElementNS('DAV:','d:unauthenticated')); - break; - case '{DAV:}all' : - $principal->appendChild($doc->createElementNS('DAV:','d:all')); - break; - default: - $principal->appendChild($doc->createElementNS('DAV:','d:href',($this->prefixBaseUrl?$server->getBaseUri():'') . $ace['principal'] . '/')); - } - - $grant = $doc->createElementNS('DAV:','d:grant'); - $xace->appendChild($grant); - - $privParts = null; - - preg_match('/^{([^}]*)}(.*)$/',$ace['privilege'],$privParts); - - $xprivilege = $doc->createElementNS('DAV:','d:privilege'); - $grant->appendChild($xprivilege); - - $xprivilege->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2])); - - if (isset($ace['protected']) && $ace['protected']) - $xace->appendChild($doc->createElement('d:protected')); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/AclRestrictions.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/AclRestrictions.php deleted file mode 100755 index f512424b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/AclRestrictions.php +++ /dev/null @@ -1,34 +0,0 @@ -ownerDocument; - - $elem->appendChild($doc->createElementNS('DAV:','d:grant-only')); - $elem->appendChild($doc->createElementNS('DAV:','d:no-invert')); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/CurrentUserPrivilegeSet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/CurrentUserPrivilegeSet.php deleted file mode 100755 index 42307930..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/CurrentUserPrivilegeSet.php +++ /dev/null @@ -1,124 +0,0 @@ -privileges = $privileges; - - } - - /** - * Serializes the property in the DOM - * - * @param DAV\Server $server - * @param \DOMElement $node - * @return void - */ - public function serialize(DAV\Server $server,\DOMElement $node) { - - $doc = $node->ownerDocument; - foreach($this->privileges as $privName) { - - $this->serializePriv($doc,$node,$privName); - - } - - } - - /** - * Returns true or false, whether the specified principal appears in the - * list. - * - * @return bool - */ - public function has($privilegeName) { - - return in_array($privilegeName, $this->privileges); - - } - - /** - * Serializes one privilege - * - * @param \DOMDocument $doc - * @param \DOMElement $node - * @param string $privName - * @return void - */ - protected function serializePriv($doc,$node,$privName) { - - $xp = $doc->createElementNS('DAV:','d:privilege'); - $node->appendChild($xp); - - $privParts = null; - preg_match('/^{([^}]*)}(.*)$/',$privName,$privParts); - - $xp->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2])); - - } - - /** - * Unserializes the {DAV:}current-user-privilege-set element. - * - * @param DOMElement $node - * @return CurrentUserPrivilegeSet - */ - static public function unserialize(\DOMElement $node) { - - $result = array(); - - $xprivs = $node->getElementsByTagNameNS('urn:DAV','privilege'); - - for($jj=0; $jj<$xprivs->length; $jj++) { - - $xpriv = $xprivs->item($jj); - - $privilegeName = null; - - for ($kk=0;$kk<$xpriv->childNodes->length;$kk++) { - - $childNode = $xpriv->childNodes->item($kk); - if ($t = DAV\XMLUtil::toClarkNotation($childNode)) { - $privilegeName = $t; - break; - } - } - - $result[] = $privilegeName; - - } - - return new self($result); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/Principal.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/Principal.php deleted file mode 100755 index c6f813f1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/Principal.php +++ /dev/null @@ -1,161 +0,0 @@ -type = $type; - - if ($type===self::HREF && is_null($href)) { - throw new DAV\Exception('The href argument must be specified for the HREF principal type.'); - } - $this->href = $href; - - } - - /** - * Returns the principal type - * - * @return int - */ - public function getType() { - - return $this->type; - - } - - /** - * Returns the principal uri. - * - * @return string - */ - public function getHref() { - - return $this->href; - - } - - /** - * Serializes the property into a DOMElement. - * - * @param DAV\Server $server - * @param \DOMElement $node - * @return void - */ - public function serialize(DAV\Server $server, \DOMElement $node) { - - $prefix = $server->xmlNamespaces['DAV:']; - switch($this->type) { - - case self::UNAUTHENTICATED : - $node->appendChild( - $node->ownerDocument->createElement($prefix . ':unauthenticated') - ); - break; - case self::AUTHENTICATED : - $node->appendChild( - $node->ownerDocument->createElement($prefix . ':authenticated') - ); - break; - case self::HREF : - $href = $node->ownerDocument->createElement($prefix . ':href'); - $href->nodeValue = $server->getBaseUri() . DAV\URLUtil::encodePath($this->href); - $node->appendChild($href); - break; - - } - - } - - /** - * Deserializes a DOM element into a property object. - * - * @param \DOMElement $dom - * @return Principal - */ - static public function unserialize(\DOMElement $dom) { - - $parent = $dom->firstChild; - while(!DAV\XMLUtil::toClarkNotation($parent)) { - $parent = $parent->nextSibling; - } - - switch(DAV\XMLUtil::toClarkNotation($parent)) { - - case '{DAV:}unauthenticated' : - return new self(self::UNAUTHENTICATED); - case '{DAV:}authenticated' : - return new self(self::AUTHENTICATED); - case '{DAV:}href': - return new self(self::HREF, $parent->textContent); - case '{DAV:}all': - return new self(self::ALL); - default : - throw new DAV\Exception\BadRequest('Unexpected element (' . DAV\XMLUtil::toClarkNotation($parent) . '). Could not deserialize'); - - } - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/SupportedPrivilegeSet.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/SupportedPrivilegeSet.php deleted file mode 100755 index 2f3e507f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Property/SupportedPrivilegeSet.php +++ /dev/null @@ -1,94 +0,0 @@ -privileges = $privileges; - - } - - /** - * Serializes the property into a domdocument. - * - * @param DAV\Server $server - * @param \DOMElement $node - * @return void - */ - public function serialize(DAV\Server $server,\DOMElement $node) { - - $doc = $node->ownerDocument; - $this->serializePriv($doc, $node, $this->privileges); - - } - - /** - * Serializes a property - * - * This is a recursive function. - * - * @param \DOMDocument $doc - * @param \DOMElement $node - * @param array $privilege - * @return void - */ - private function serializePriv($doc,$node,$privilege) { - - $xsp = $doc->createElementNS('DAV:','d:supported-privilege'); - $node->appendChild($xsp); - - $xp = $doc->createElementNS('DAV:','d:privilege'); - $xsp->appendChild($xp); - - $privParts = null; - preg_match('/^{([^}]*)}(.*)$/',$privilege['privilege'],$privParts); - - $xp->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2])); - - if (isset($privilege['abstract']) && $privilege['abstract']) { - $xsp->appendChild($doc->createElementNS('DAV:','d:abstract')); - } - - if (isset($privilege['description'])) { - $xsp->appendChild($doc->createElementNS('DAV:','d:description',$privilege['description'])); - } - - if (isset($privilege['aggregates'])) { - foreach($privilege['aggregates'] as $subPrivilege) { - $this->serializePriv($doc,$xsp,$subPrivilege); - } - } - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Version.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Version.php deleted file mode 100755 index 722ab490..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/DAVACL/Version.php +++ /dev/null @@ -1,24 +0,0 @@ -httpRequest->getHeader('Authorization'); - $authHeader = explode(' ',$authHeader); - - if ($authHeader[0]!='AWS' || !isset($authHeader[1])) { - $this->errorCode = self::ERR_NOAWSHEADER; - return false; - } - - list($this->accessKey,$this->signature) = explode(':',$authHeader[1]); - - return true; - - } - - /** - * Returns the username for the request - * - * @return string - */ - public function getAccessKey() { - - return $this->accessKey; - - } - - /** - * Validates the signature based on the secretKey - * - * @param string $secretKey - * @return bool - */ - public function validate($secretKey) { - - $contentMD5 = $this->httpRequest->getHeader('Content-MD5'); - - if ($contentMD5) { - // We need to validate the integrity of the request - $body = $this->httpRequest->getBody(true); - $this->httpRequest->setBody($body,true); - - if ($contentMD5!=base64_encode(md5($body,true))) { - // content-md5 header did not match md5 signature of body - $this->errorCode = self::ERR_MD5CHECKSUMWRONG; - return false; - } - - } - - if (!$requestDate = $this->httpRequest->getHeader('x-amz-date')) - $requestDate = $this->httpRequest->getHeader('Date'); - - if (!$this->validateRFC2616Date($requestDate)) - return false; - - $amzHeaders = $this->getAmzHeaders(); - - $signature = base64_encode( - $this->hmacsha1($secretKey, - $this->httpRequest->getMethod() . "\n" . - $contentMD5 . "\n" . - $this->httpRequest->getHeader('Content-type') . "\n" . - $requestDate . "\n" . - $amzHeaders . - $this->httpRequest->getURI() - ) - ); - - if ($this->signature != $signature) { - - $this->errorCode = self::ERR_INVALIDSIGNATURE; - return false; - - } - - return true; - - } - - - /** - * Returns an HTTP 401 header, forcing login - * - * This should be called when username and password are incorrect, or not supplied at all - * - * @return void - */ - public function requireLogin() { - - $this->httpResponse->setHeader('WWW-Authenticate','AWS'); - $this->httpResponse->sendStatus(401); - - } - - /** - * Makes sure the supplied value is a valid RFC2616 date. - * - * If we would just use strtotime to get a valid timestamp, we have no way of checking if a - * user just supplied the word 'now' for the date header. - * - * This function also makes sure the Date header is within 15 minutes of the operating - * system date, to prevent replay attacks. - * - * @param string $dateHeader - * @return bool - */ - protected function validateRFC2616Date($dateHeader) { - - $date = Util::parseHTTPDate($dateHeader); - - // Unknown format - if (!$date) { - $this->errorCode = self::ERR_INVALIDDATEFORMAT; - return false; - } - - $min = new \DateTime('-15 minutes'); - $max = new \DateTime('+15 minutes'); - - // We allow 15 minutes around the current date/time - if ($date > $max || $date < $min) { - $this->errorCode = self::ERR_REQUESTTIMESKEWED; - return false; - } - - return $date; - - } - - /** - * Returns a list of AMZ headers - * - * @return string - */ - protected function getAmzHeaders() { - - $amzHeaders = array(); - $headers = $this->httpRequest->getHeaders(); - foreach($headers as $headerName => $headerValue) { - if (strpos(strtolower($headerName),'x-amz-')===0) { - $amzHeaders[strtolower($headerName)] = str_replace(array("\r\n"),array(' '),$headerValue) . "\n"; - } - } - ksort($amzHeaders); - - $headerStr = ''; - foreach($amzHeaders as $h=>$v) { - $headerStr.=$h.':'.$v; - } - - return $headerStr; - - } - - /** - * Generates an HMAC-SHA1 signature - * - * @param string $key - * @param string $message - * @return string - */ - private function hmacsha1($key, $message) { - - $blocksize=64; - if (strlen($key)>$blocksize) - $key=pack('H*', sha1($key)); - $key=str_pad($key,$blocksize,chr(0x00)); - $ipad=str_repeat(chr(0x36),$blocksize); - $opad=str_repeat(chr(0x5c),$blocksize); - $hmac = pack('H*',sha1(($key^$opad).pack('H*',sha1(($key^$ipad).$message)))); - return $hmac; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/AbstractAuth.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/AbstractAuth.php deleted file mode 100755 index 0db29830..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/AbstractAuth.php +++ /dev/null @@ -1,111 +0,0 @@ -httpResponse = new Response(); - $this->httpRequest = new Request(); - - } - - /** - * Sets an alternative HTTP response object - * - * @param Response $response - * @return void - */ - public function setHTTPResponse(Response $response) { - - $this->httpResponse = $response; - - } - - /** - * Sets an alternative HTTP request object - * - * @param Request $request - * @return void - */ - public function setHTTPRequest(Request $request) { - - $this->httpRequest = $request; - - } - - - /** - * Sets the realm - * - * The realm is often displayed in authentication dialog boxes - * Commonly an application name displayed here - * - * @param string $realm - * @return void - */ - public function setRealm($realm) { - - $this->realm = $realm; - - } - - /** - * Returns the realm - * - * @return string - */ - public function getRealm() { - - return $this->realm; - - } - - /** - * Returns an HTTP 401 header, forcing login - * - * This should be called when username and password are incorrect, or not supplied at all - * - * @return void - */ - abstract public function requireLogin(); - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/BasicAuth.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/BasicAuth.php deleted file mode 100755 index bcb087ed..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/BasicAuth.php +++ /dev/null @@ -1,67 +0,0 @@ -httpRequest->getRawServerValue('PHP_AUTH_USER')) && ($pass = $this->httpRequest->getRawServerValue('PHP_AUTH_PW'))) { - - return array($user,$pass); - - } - - // Most other webservers - $auth = $this->httpRequest->getHeader('Authorization'); - - // Apache could prefix environment variables with REDIRECT_ when urls - // are passed through mod_rewrite - if (!$auth) { - $auth = $this->httpRequest->getRawServerValue('REDIRECT_HTTP_AUTHORIZATION'); - } - - if (!$auth) return false; - - if (strpos(strtolower($auth),'basic')!==0) return false; - - return explode(':', base64_decode(substr($auth, 6)),2); - - } - - /** - * Returns an HTTP 401 header, forcing login - * - * This should be called when username and password are incorrect, or not supplied at all - * - * @return void - */ - public function requireLogin() { - - $this->httpResponse->setHeader('WWW-Authenticate','Basic realm="' . $this->realm . '"'); - $this->httpResponse->sendStatus(401); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/DigestAuth.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/DigestAuth.php deleted file mode 100755 index 62310f7c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/DigestAuth.php +++ /dev/null @@ -1,240 +0,0 @@ -nonce = uniqid(); - $this->opaque = md5($this->realm); - parent::__construct(); - - } - - /** - * Gathers all information from the headers - * - * This method needs to be called prior to anything else. - * - * @return void - */ - public function init() { - - $digest = $this->getDigest(); - $this->digestParts = $this->parseDigest($digest); - - } - - /** - * Sets the quality of protection value. - * - * Possible values are: - * SabreForRainLoop\HTTP\DigestAuth::QOP_AUTH - * SabreForRainLoop\HTTP\DigestAuth::QOP_AUTHINT - * - * Multiple values can be specified using logical OR. - * - * QOP_AUTHINT ensures integrity of the request body, but this is not - * supported by most HTTP clients. QOP_AUTHINT also requires the entire - * request body to be md5'ed, which can put strains on CPU and memory. - * - * @param int $qop - * @return void - */ - public function setQOP($qop) { - - $this->qop = $qop; - - } - - /** - * Validates the user. - * - * The A1 parameter should be md5($username . ':' . $realm . ':' . $password); - * - * @param string $A1 - * @return bool - */ - public function validateA1($A1) { - - $this->A1 = $A1; - return $this->validate(); - - } - - /** - * Validates authentication through a password. The actual password must be provided here. - * It is strongly recommended not store the password in plain-text and use validateA1 instead. - * - * @param string $password - * @return bool - */ - public function validatePassword($password) { - - $this->A1 = md5($this->digestParts['username'] . ':' . $this->realm . ':' . $password); - return $this->validate(); - - } - - /** - * Returns the username for the request - * - * @return string - */ - public function getUsername() { - - return $this->digestParts['username']; - - } - - /** - * Validates the digest challenge - * - * @return bool - */ - protected function validate() { - - $A2 = $this->httpRequest->getMethod() . ':' . $this->digestParts['uri']; - - if ($this->digestParts['qop']=='auth-int') { - // Making sure we support this qop value - if (!($this->qop & self::QOP_AUTHINT)) return false; - // We need to add an md5 of the entire request body to the A2 part of the hash - $body = $this->httpRequest->getBody(true); - $this->httpRequest->setBody($body,true); - $A2 .= ':' . md5($body); - } else { - - // We need to make sure we support this qop value - if (!($this->qop & self::QOP_AUTH)) return false; - } - - $A2 = md5($A2); - - $validResponse = md5("{$this->A1}:{$this->digestParts['nonce']}:{$this->digestParts['nc']}:{$this->digestParts['cnonce']}:{$this->digestParts['qop']}:{$A2}"); - - return $this->digestParts['response']==$validResponse; - - - } - - /** - * Returns an HTTP 401 header, forcing login - * - * This should be called when username and password are incorrect, or not supplied at all - * - * @return void - */ - public function requireLogin() { - - $qop = ''; - switch($this->qop) { - case self::QOP_AUTH : $qop = 'auth'; break; - case self::QOP_AUTHINT : $qop = 'auth-int'; break; - case self::QOP_AUTH | self::QOP_AUTHINT : $qop = 'auth,auth-int'; break; - } - - $this->httpResponse->setHeader('WWW-Authenticate','Digest realm="' . $this->realm . '",qop="'.$qop.'",nonce="' . $this->nonce . '",opaque="' . $this->opaque . '"'); - $this->httpResponse->sendStatus(401); - - } - - - /** - * This method returns the full digest string. - * - * It should be compatibile with mod_php format and other webservers. - * - * If the header could not be found, null will be returned - * - * @return mixed - */ - public function getDigest() { - - // mod_php - $digest = $this->httpRequest->getRawServerValue('PHP_AUTH_DIGEST'); - if ($digest) return $digest; - - // most other servers - $digest = $this->httpRequest->getHeader('Authorization'); - - // Apache could prefix environment variables with REDIRECT_ when urls - // are passed through mod_rewrite - if (!$digest) { - $digest = $this->httpRequest->getRawServerValue('REDIRECT_HTTP_AUTHORIZATION'); - } - - if ($digest && strpos(strtolower($digest),'digest')===0) { - return substr($digest,7); - } else { - return null; - } - - } - - - /** - * Parses the different pieces of the digest string into an array. - * - * This method returns false if an incomplete digest was supplied - * - * @param string $digest - * @return mixed - */ - protected function parseDigest($digest) { - - // protect against missing data - $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1); - $data = array(); - - preg_match_all('@(\w+)=(?:(?:")([^"]+)"|([^\s,$]+))@', $digest, $matches, PREG_SET_ORDER); - - foreach ($matches as $m) { - $data[$m[1]] = $m[2] ? $m[2] : $m[3]; - unset($needed_parts[$m[1]]); - } - - return $needed_parts ? false : $data; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Request.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Request.php deleted file mode 100755 index 3942af8c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Request.php +++ /dev/null @@ -1,284 +0,0 @@ -_SERVER = $serverData; - else $this->_SERVER =& $_SERVER; - - if ($postData) $this->_POST = $postData; - else $this->_POST =& $_POST; - - } - - /** - * Returns the value for a specific http header. - * - * This method returns null if the header did not exist. - * - * @param string $name - * @return string - */ - public function getHeader($name) { - - $name = strtoupper(str_replace(array('-'),array('_'),$name)); - if (isset($this->_SERVER['HTTP_' . $name])) { - return $this->_SERVER['HTTP_' . $name]; - } - - // There's a few headers that seem to end up in the top-level - // server array. - switch($name) { - case 'CONTENT_TYPE' : - case 'CONTENT_LENGTH' : - if (isset($this->_SERVER[$name])) { - return $this->_SERVER[$name]; - } - break; - - } - return; - - } - - /** - * Returns all (known) HTTP headers. - * - * All headers are converted to lower-case, and additionally all underscores - * are automatically converted to dashes - * - * @return array - */ - public function getHeaders() { - - $hdrs = array(); - foreach($this->_SERVER as $key=>$value) { - - switch($key) { - case 'CONTENT_LENGTH' : - case 'CONTENT_TYPE' : - $hdrs[strtolower(str_replace('_','-',$key))] = $value; - break; - default : - if (strpos($key,'HTTP_')===0) { - $hdrs[substr(strtolower(str_replace('_','-',$key)),5)] = $value; - } - break; - } - - } - - return $hdrs; - - } - - /** - * Returns the HTTP request method - * - * This is for example POST or GET - * - * @return string - */ - public function getMethod() { - - return $this->_SERVER['REQUEST_METHOD']; - - } - - /** - * Returns the requested uri - * - * @return string - */ - public function getUri() { - - return $this->_SERVER['REQUEST_URI']; - - } - - /** - * Will return protocol + the hostname + the uri - * - * @return string - */ - public function getAbsoluteUri() { - - // Checking if the request was made through HTTPS. The last in line is for IIS - $protocol = isset($this->_SERVER['HTTPS']) && ($this->_SERVER['HTTPS']) && ($this->_SERVER['HTTPS']!='off'); - return ($protocol?'https':'http') . '://' . $this->getHeader('Host') . $this->getUri(); - - } - - /** - * Returns everything after the ? from the current url - * - * @return string - */ - public function getQueryString() { - - return isset($this->_SERVER['QUERY_STRING'])?$this->_SERVER['QUERY_STRING']:''; - - } - - /** - * Returns the HTTP request body body - * - * This method returns a readable stream resource. - * If the asString parameter is set to true, a string is sent instead. - * - * @param bool $asString - * @return resource - */ - public function getBody($asString = false) { - - if (is_null($this->body)) { - if (!is_null(self::$defaultInputStream)) { - $this->body = self::$defaultInputStream; - } else { - $this->body = fopen('php://input','r'); - self::$defaultInputStream = $this->body; - } - } - if ($asString) { - $body = stream_get_contents($this->body); - return $body; - } else { - return $this->body; - } - - } - - /** - * Sets the contents of the HTTP request body - * - * This method can either accept a string, or a readable stream resource. - * - * If the setAsDefaultInputStream is set to true, it means for this run of the - * script the supplied body will be used instead of php://input. - * - * @param mixed $body - * @param bool $setAsDefaultInputStream - * @return void - */ - public function setBody($body,$setAsDefaultInputStream = false) { - - if(is_resource($body)) { - $this->body = $body; - } else { - - $stream = fopen('php://temp','r+'); - fputs($stream,$body); - rewind($stream); - // String is assumed - $this->body = $stream; - } - if ($setAsDefaultInputStream) { - self::$defaultInputStream = $this->body; - } - - } - - /** - * Returns PHP's _POST variable. - * - * The reason this is in a method is so it can be subclassed and - * overridden. - * - * @return array - */ - public function getPostVars() { - - return $this->_POST; - - } - - /** - * Returns a specific item from the _SERVER array. - * - * Do not rely on this feature, it is for internal use only. - * - * @param string $field - * @return string - */ - public function getRawServerValue($field) { - - return isset($this->_SERVER[$field])?$this->_SERVER[$field]:null; - - } - - /** - * Returns the HTTP version specified within the request. - * - * @return string - */ - public function getHTTPVersion() { - - $protocol = $this->getRawServerValue('SERVER_PROTOCOL'); - if ($protocol==='HTTP/1.0') { - return '1.0'; - } else { - return '1.1'; - } - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Response.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Response.php deleted file mode 100755 index cb4b9dab..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Response.php +++ /dev/null @@ -1,175 +0,0 @@ - 'Continue', - 101 => 'Switching Protocols', - 102 => 'Processing', - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authorative Information', - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', - 207 => 'Multi-Status', // RFC 4918 - 208 => 'Already Reported', // RFC 5842 - 226 => 'IM Used', // RFC 3229 - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', - 303 => 'See Other', - 304 => 'Not Modified', - 305 => 'Use Proxy', - 306 => 'Reserved', - 307 => 'Temporary Redirect', - 400 => 'Bad request', - 401 => 'Unauthorized', - 402 => 'Payment Required', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 406 => 'Not Acceptable', - 407 => 'Proxy Authentication Required', - 408 => 'Request Timeout', - 409 => 'Conflict', - 410 => 'Gone', - 411 => 'Length Required', - 412 => 'Precondition failed', - 413 => 'Request Entity Too Large', - 414 => 'Request-URI Too Long', - 415 => 'Unsupported Media Type', - 416 => 'Requested Range Not Satisfiable', - 417 => 'Expectation Failed', - 418 => 'I\'m a teapot', // RFC 2324 - 422 => 'Unprocessable Entity', // RFC 4918 - 423 => 'Locked', // RFC 4918 - 424 => 'Failed Dependency', // RFC 4918 - 426 => 'Upgrade required', - 428 => 'Precondition required', // draft-nottingham-http-new-status - 429 => 'Too Many Requests', // draft-nottingham-http-new-status - 431 => 'Request Header Fields Too Large', // draft-nottingham-http-new-status - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout', - 505 => 'HTTP Version not supported', - 506 => 'Variant Also Negotiates', - 507 => 'Insufficient Storage', // RFC 4918 - 508 => 'Loop Detected', // RFC 5842 - 509 => 'Bandwidth Limit Exceeded', // non-standard - 510 => 'Not extended', - 511 => 'Network Authentication Required', // draft-nottingham-http-new-status - ); - - return 'HTTP/' . $httpVersion . ' ' . $code . ' ' . $msg[$code]; - - } - - // @codeCoverageIgnoreStart - // We cannot reasonably test header() related methods. - - /** - * Sends an HTTP status header to the client. - * - * @param int $code HTTP status code - * @return bool - */ - public function sendStatus($code) { - - if (!headers_sent()) - return header($this->getStatusMessage($code, $this->defaultHttpVersion)); - else return false; - - } - - /** - * Sets an HTTP header for the response - * - * @param string $name - * @param string $value - * @param bool $replace - * @return bool - */ - public function setHeader($name, $value, $replace = true) { - - $value = str_replace(array("\r","\n"),array('\r','\n'),$value); - if (!headers_sent()) - return header($name . ': ' . $value, $replace); - else return false; - - - } - // @codeCoverageIgnoreEnd - - /** - * Sets a bunch of HTTP Headers - * - * headersnames are specified as keys, value in the array value - * - * @param array $headers - * @return void - */ - public function setHeaders(array $headers) { - - foreach($headers as $key=>$value) - $this->setHeader($key, $value); - - } - - /** - * Sends the entire response body - * - * This method can accept either an open filestream, or a string. - * - * @param mixed $body - * @return void - */ - public function sendBody($body) { - - if (is_resource($body)) { - - fpassthru($body); - - } else { - - // We assume a string - echo $body; - - } - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Util.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Util.php deleted file mode 100755 index e308618a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Util.php +++ /dev/null @@ -1,82 +0,0 @@ -= 0) - return new \DateTime('@' . $realDate, new \DateTimeZone('UTC')); - - } - - /** - * Transforms a DateTime object to HTTP's most common date format. - * - * We're serializing it as the RFC 1123 date, which, for HTTP must be - * specified as GMT. - * - * @param \DateTime $dateTime - * @return string - */ - static function toHTTPDate(\DateTime $dateTime) { - - // We need to clone it, as we don't want to affect the existing - // DateTime. - $dateTime = clone $dateTime; - $dateTime->setTimeZone(new \DateTimeZone('GMT')); - return $dateTime->format('D, d M Y H:i:s \G\M\T'); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Version.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Version.php deleted file mode 100755 index c14bd03f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/HTTP/Version.php +++ /dev/null @@ -1,24 +0,0 @@ -stderr) { - $this->stderr = STDERR; - } - if (!$this->stdout) { - $this->stdout = STDOUT; - } - if (!$this->stdin) { - $this->stdin = STDIN; - } - - // @codeCoverageIgnoreEnd - - - try { - - list($options, $positional) = $this->parseArguments($argv); - - if (isset($options['q'])) { - $this->quiet = true; - } - $this->log($this->colorize('green', "sabre-vobject ") . $this->colorize('yellow', Version::VERSION)); - - foreach($options as $name=>$value) { - - switch($name) { - - case 'q' : - // Already handled earlier. - break; - case 'h' : - case 'help' : - $this->showHelp(); - return 0; - break; - case 'format' : - switch($value) { - - // jcard/jcal documents - case 'jcard' : - case 'jcal' : - - // specific document versions - case 'vcard21' : - case 'vcard30' : - case 'vcard40' : - case 'icalendar20' : - - // specific formats - case 'json' : - case 'mimedir' : - - // icalendar/vcad - case 'icalendar' : - case 'vcard' : - $this->format = $value; - break; - - default : - throw new InvalidArgumentException('Unknown format: ' . $value); - - } - break; - case 'pretty' : - if (version_compare(PHP_VERSION, '5.4.0') >= 0) { - $this->pretty = true; - } - break; - case 'forgiving' : - $this->forgiving = true; - break; - case 'inputformat' : - switch($value) { - // json formats - case 'jcard' : - case 'jcal' : - case 'json' : - $this->inputFormat = 'json'; - break; - - // mimedir formats - case 'mimedir' : - case 'icalendar' : - case 'vcard' : - case 'vcard21' : - case 'vcard30' : - case 'vcard40' : - case 'icalendar20' : - - $this->inputFormat = 'mimedir'; - break; - - default : - throw new InvalidArgumentException('Unknown format: ' . $value); - - } - break; - default : - throw new InvalidArgumentException('Unknown option: ' . $name); - - } - - } - - if (count($positional) === 0) { - $this->showHelp(); - return 1; - } - - if (count($positional) === 1) { - throw new InvalidArgumentException('Inputfile is a required argument'); - } - - if (count($positional) > 3) { - throw new InvalidArgumentException('Too many arguments'); - } - - if (!in_array($positional[0], array('validate','repair','convert','color'))) { - throw new InvalidArgumentException('Uknown command: ' . $positional[0]); - } - - } catch (InvalidArgumentException $e) { - $this->showHelp(); - $this->log('Error: ' . $e->getMessage(),'red'); - return 1; - } - - $command = $positional[0]; - - $this->inputPath = $positional[1]; - $this->outputPath = isset($positional[2])?$positional[2]:'-'; - - if ($this->outputPath !== '-') { - $this->stdout = fopen($this->outputPath,'w'); - } - - if (!$this->inputFormat) { - if (substr($this->inputPath,-5)==='.json') { - $this->inputFormat = 'json'; - } else { - $this->inputFormat = 'mimedir'; - } - } - if (!$this->format) { - if (substr($this->outputPath,-5)==='.json') { - $this->format = 'json'; - } else { - $this->format = 'mimedir'; - } - } - - - $realCode = 0; - - try { - - while($input = $this->readInput()) { - - $returnCode = $this->$command($input); - if ($returnCode!==0) $realCode = $returnCode; - - } - - } catch (EofException $e) { - // end of file - } catch (\Exception $e) { - $this->log('Error: ' . $e->getMessage(),'red'); - return 2; - } - - return $realCode; - - } - - /** - * Shows the help message. - * - * @return void - */ - protected function showHelp() { - - $this->log('Usage:', 'yellow'); - $this->log(" vobject [options] command [arguments]"); - $this->log(''); - $this->log('Options:', 'yellow'); - $this->log($this->colorize('green', ' -q ') . "Don't output anything."); - $this->log($this->colorize('green', ' -help -h ') . "Display this help message."); - $this->log($this->colorize('green', ' --format ') . "Convert to a specific format. Must be one of: vcard, vcard21,"); - $this->log($this->colorize('green', ' --forgiving ') . "Makes the parser less strict."); - $this->log(" vcard30, vcard40, icalendar20, jcal, jcard, json, mimedir."); - $this->log($this->colorize('green', ' --inputformat ') . "If the input format cannot be guessed from the extension, it"); - $this->log(" must be specified here."); - // Only PHP 5.4 and up - if (version_compare(PHP_VERSION, '5.4.0') >= 0) { - $this->log($this->colorize('green', ' --pretty ') . "json pretty-print."); - } - $this->log(''); - $this->log('Commands:', 'yellow'); - $this->log($this->colorize('green', ' validate') . ' source_file Validates a file for correctness.'); - $this->log($this->colorize('green', ' repair') . ' source_file [output_file] Repairs a file.'); - $this->log($this->colorize('green', ' convert') . ' source_file [output_file] Converts a file.'); - $this->log($this->colorize('green', ' color') . ' source_file Colorize a file, useful for debbugging.'); - $this->log(<<log('Examples:', 'yellow'); - $this->log(' vobject convert contact.vcf contact.json'); - $this->log(' vobject convert --format=vcard40 old.vcf new.vcf'); - $this->log(' vobject convert --inputformat=json --format=mimedir - -'); - $this->log(' vobject color calendar.ics'); - $this->log(''); - $this->log('https://github.com/fruux/sabre-vobject','purple'); - - } - - /** - * Validates a VObject file - * - * @param Component $vObj - * @return int - */ - protected function validate($vObj) { - - $returnCode = 0; - - switch($vObj->name) { - case 'VCALENDAR' : - $this->log("iCalendar: " . (string)$vObj->VERSION); - break; - case 'VCARD' : - $this->log("vCard: " . (string)$vObj->VERSION); - break; - } - - $warnings = $vObj->validate(); - if (!count($warnings)) { - $this->log(" No warnings!"); - } else { - - $returnCode = 2; - foreach($warnings as $warn) { - - $this->log(" " . $warn['message']); - - } - - } - - return $returnCode; - - } - - /** - * Repairs a VObject file - * - * @param Component $vObj - * @return int - */ - protected function repair($vObj) { - - $returnCode = 0; - - switch($vObj->name) { - case 'VCALENDAR' : - $this->log("iCalendar: " . (string)$vObj->VERSION); - break; - case 'VCARD' : - $this->log("vCard: " . (string)$vObj->VERSION); - break; - } - - $warnings = $vObj->validate(Node::REPAIR); - if (!count($warnings)) { - $this->log(" No warnings!"); - } else { - foreach($warnings as $warn) { - - $returnCode = 2; - $this->log(" " . $warn['message']); - - } - - } - fwrite($this->stdout, $vObj->serialize()); - - return $returnCode; - - } - - /** - * Converts a vObject file to a new format. - * - * @param Component $vObj - * @return int - */ - protected function convert($vObj) { - - $json = false; - $convertVersion = null; - $forceInput = null; - - switch($this->format) { - case 'json' : - $json = true; - if ($vObj->name === 'VCARD') { - $convertVersion = Document::VCARD40; - } - break; - case 'jcard' : - $json = true; - $forceInput = 'VCARD'; - $convertVersion = Document::VCARD40; - break; - case 'jcal' : - $json = true; - $forceInput = 'VCALENDAR'; - break; - case 'mimedir' : - case 'icalendar' : - case 'icalendar20' : - case 'vcard' : - break; - case 'vcard21' : - $convertVersion = Document::VCARD21; - break; - case 'vcard30' : - $convertVersion = Document::VCARD30; - break; - case 'vcard40' : - $convertVersion = Document::VCARD40; - break; - - } - - if ($forceInput && $vObj->name !== $forceInput) { - throw new \Exception('You cannot convert a ' . strtolower($vObj->name) . ' to ' . $this->format); - } - if ($convertVersion) { - $vObj = $vObj->convert($convertVersion); - } - if ($json) { - $jsonOptions = 0; - if ($this->pretty) { - $jsonOptions = JSON_PRETTY_PRINT; - } - fwrite($this->stdout, json_encode($vObj->jsonSerialize(), $jsonOptions)); - } else { - fwrite($this->stdout, $vObj->serialize()); - } - - return 0; - - } - - /** - * Colorizes a file - * - * @param Component $vObj - * @return int - */ - protected function color($vObj) { - - fwrite($this->stdout, $this->serializeComponent($vObj)); - - } - - /** - * Returns an ansi color string for a color name. - * - * @param string $color - * @return string - */ - protected function colorize($color, $str, $resetTo = 'default') { - - $colors = array( - 'cyan' => '1;36', - 'red' => '1;31', - 'yellow' => '1;33', - 'blue' => '0;34', - 'green' => '0;32', - 'default' => '0', - 'purple' => '0;35', - ); - return "\033[" . $colors[$color] . 'm' . $str . "\033[".$colors[$resetTo]."m"; - - } - - /** - * Writes out a string in specific color. - * - * @param string $color - * @param string $str - * @return void - */ - protected function cWrite($color, $str) { - - fwrite($this->stdout, $this->colorize($color, $str)); - - } - - protected function serializeComponent(Component $vObj) { - - $this->cWrite('cyan', 'BEGIN'); - $this->cWrite('red', ':'); - $this->cWrite('yellow', $vObj->name . "\n"); - - /** - * Gives a component a 'score' for sorting purposes. - * - * This is solely used by the childrenSort method. - * - * A higher score means the item will be lower in the list. - * To avoid score collisions, each "score category" has a reasonable - * space to accomodate elements. The $key is added to the $score to - * preserve the original relative order of elements. - * - * @param int $key - * @param array $array - * @return int - */ - $sortScore = function($key, $array) { - - if ($array[$key] instanceof Component) { - - // We want to encode VTIMEZONE first, this is a personal - // preference. - if ($array[$key]->name === 'VTIMEZONE') { - $score=300000000; - return $score+$key; - } else { - $score=400000000; - return $score+$key; - } - } else { - // Properties get encoded first - // VCARD version 4.0 wants the VERSION property to appear first - if ($array[$key] instanceof Property) { - if ($array[$key]->name === 'VERSION') { - $score=100000000; - return $score+$key; - } else { - // All other properties - $score=200000000; - return $score+$key; - } - } - } - - }; - - $tmp = $vObj->children; - uksort($vObj->children, function($a, $b) use ($sortScore, $tmp) { - - $sA = $sortScore($a, $tmp); - $sB = $sortScore($b, $tmp); - - return $sA - $sB; - - }); - - foreach($vObj->children as $child) { - if ($child instanceof Component) { - $this->serializeComponent($child); - } else { - $this->serializeProperty($child); - } - } - - $this->cWrite('cyan', 'END'); - $this->cWrite('red', ':'); - $this->cWrite('yellow', $vObj->name . "\n"); - - } - - /** - * Colorizes a property. - * - * @param Property $property - * @return void - */ - protected function serializeProperty(Property $property) { - - if ($property->group) { - $this->cWrite('default', $property->group); - $this->cWrite('red', '.'); - } - - $str = ''; - $this->cWrite('yellow', $property->name); - - foreach($property->parameters as $param) { - - $this->cWrite('red',';'); - $this->cWrite('blue', $param->serialize()); - - } - $this->cWrite('red',':'); - - if ($property instanceof Property\Binary) { - - $this->cWrite('default', 'embedded binary stripped. (' . strlen($property->getValue()) . ' bytes)'); - - } else { - - $parts = $property->getParts(); - $first1 = true; - // Looping through property values - foreach($parts as $part) { - if ($first1) { - $first1 = false; - } else { - $this->cWrite('red', $property->delimiter); - } - $first2 = true; - // Looping through property sub-values - foreach((array)$part as $subPart) { - if ($first2) { - $first2 = false; - } else { - // The sub-value delimiter is always comma - $this->cWrite('red', ','); - } - - $subPart = strtr($subPart, array( - '\\' => $this->colorize('purple', '\\\\', 'green'), - ';' => $this->colorize('purple', '\;', 'green'), - ',' => $this->colorize('purple', '\,', 'green'), - "\n" => $this->colorize('purple', "\\n\n\t", 'green'), - "\r" => "", - )); - - $this->cWrite('green', $subPart); - } - } - - } - $this->cWrite("default", "\n"); - - } - - /** - * Parses the list of arguments. - * - * @param array $argv - * @return void - */ - protected function parseArguments(array $argv) { - - $positional = array(); - $options = array(); - - for($ii=0; $ii < count($argv); $ii++) { - - // Skipping the first argument. - if ($ii===0) continue; - - $v = $argv[$ii]; - - if (substr($v,0,2)==='--') { - // This is a long-form option. - $optionName = substr($v,2); - $optionValue = true; - if (strpos($optionName,'=')) { - list($optionName, $optionValue) = explode('=', $optionName); - } - $options[$optionName] = $optionValue; - } elseif (substr($v,0,1) === '-' && strlen($v)>1) { - // This is a short-form option. - foreach(str_split(substr($v,1)) as $option) { - $options[$option] = true; - } - - } else { - - $positional[] = $v; - - } - - } - - return array($options, $positional); - - } - - protected $parser; - - /** - * Reads the input file - * - * @return Component - */ - protected function readInput() { - - if (!$this->parser) { - if ($this->inputPath!=='-') { - $this->stdin = fopen($this->inputPath,'r'); - } - - if ($this->inputFormat === 'mimedir') { - $this->parser = new Parser\MimeDir($this->stdin, ($this->forgiving?Reader::OPTION_FORGIVING:0)); - } else { - $this->parser = new Parser\Json($this->stdin, ($this->forgiving?Reader::OPTION_FORGIVING:0)); - } - } - - return $this->parser->parse(); - - } - - /** - * Sends a message to STDERR. - * - * @param string $msg - * @return void - */ - protected function log($msg, $color = 'default') { - - if (!$this->quiet) { - if ($color!=='default') { - $msg = $this->colorize($color, $msg); - } - fwrite($this->stderr, $msg . "\n"); - } - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component.php deleted file mode 100755 index 70cf550d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component.php +++ /dev/null @@ -1,473 +0,0 @@ -value syntax, in which case - * properties will automatically be created, or you can just pass a list of - * Component and Property object. - * - * By default, a set of sensible values will be added to the component. For - * an iCalendar object, this may be something like CALSCALE:GREGORIAN. To - * ensure that this does not happen, set $defaults to false. - * - * @param Document $root - * @param string $name such as VCALENDAR, VEVENT. - * @param array $children - * @param bool $defaults - * @return void - */ - public function __construct(Document $root, $name, array $children = array(), $defaults = true) { - - $this->name = strtoupper($name); - $this->root = $root; - - if ($defaults) { - $children = array_merge($this->getDefaults(), $children); - } - - foreach($children as $k=>$child) { - if ($child instanceof Node) { - - // Component or Property - $this->add($child); - } else { - - // Property key=>value - $this->add($k, $child); - } - } - - } - - /** - * Adds a new property or component, and returns the new item. - * - * This method has 3 possible signatures: - * - * add(Component $comp) // Adds a new component - * add(Property $prop) // Adds a new property - * add($name, $value, array $parameters = array()) // Adds a new property - * add($name, array $children = array()) // Adds a new component - * by name. - * - * @return Node - */ - public function add($a1, $a2 = null, $a3 = null) { - - if ($a1 instanceof Node) { - if (!is_null($a2)) { - throw new \InvalidArgumentException('The second argument must not be specified, when passing a VObject Node'); - } - $a1->parent = $this; - $this->children[] = $a1; - - return $a1; - - } elseif(is_string($a1)) { - - $item = $this->root->create($a1, $a2, $a3); - $item->parent = $this; - $this->children[] = $item; - - return $item; - - } else { - - throw new \InvalidArgumentException('The first argument must either be a \\SabreForRainLoop\\VObject\\Node or a string'); - - } - - } - - /** - * This method removes a component or property from this component. - * - * You can either specify the item by name (like DTSTART), in which case - * all properties/components with that name will be removed, or you can - * pass an instance of a property or component, in which case only that - * exact item will be removed. - * - * The removed item will be returned. In case there were more than 1 items - * removed, only the last one will be returned. - * - * @param mixed $item - * @return void - */ - public function remove($item) { - - if (is_string($item)) { - $children = $this->select($item); - foreach($children as $k=>$child) { - unset($this->children[$k]); - } - return $child; - } else { - foreach($this->children as $k => $child) { - if ($child===$item) { - unset($this->children[$k]); - return $child; - } - } - - throw new \InvalidArgumentException('The item you passed to remove() was not a child of this component'); - - } - - } - - /** - * Returns an iterable list of children - * - * @return array - */ - public function children() { - - return $this->children; - - } - - /** - * This method only returns a list of sub-components. Properties are - * ignored. - * - * @return array - */ - public function getComponents() { - - $result = array(); - foreach($this->children as $child) { - if ($child instanceof Component) { - $result[] = $child; - } - } - - return $result; - - } - - /** - * Returns an array with elements that match the specified name. - * - * This function is also aware of MIME-Directory groups (as they appear in - * vcards). This means that if a property is grouped as "HOME.EMAIL", it - * will also be returned when searching for just "EMAIL". If you want to - * search for a property in a specific group, you can select on the entire - * string ("HOME.EMAIL"). If you want to search on a specific property that - * has not been assigned a group, specify ".EMAIL". - * - * Keys are retained from the 'children' array, which may be confusing in - * certain cases. - * - * @param string $name - * @return array - */ - public function select($name) { - - $group = null; - $name = strtoupper($name); - if (strpos($name,'.')!==false) { - list($group,$name) = explode('.', $name, 2); - } - - $result = array(); - foreach($this->children as $key=>$child) { - - if ( - strtoupper($child->name) === $name && - (is_null($group) || ( $child instanceof Property && strtoupper($child->group) === $group)) - ) { - - $result[$key] = $child; - - } - } - - reset($result); - return $result; - - } - - /** - * Turns the object back into a serialized blob. - * - * @return string - */ - public function serialize() { - - $str = "BEGIN:" . $this->name . "\r\n"; - - /** - * Gives a component a 'score' for sorting purposes. - * - * This is solely used by the childrenSort method. - * - * A higher score means the item will be lower in the list. - * To avoid score collisions, each "score category" has a reasonable - * space to accomodate elements. The $key is added to the $score to - * preserve the original relative order of elements. - * - * @param int $key - * @param array $array - * @return int - */ - $sortScore = function($key, $array) { - - if ($array[$key] instanceof Component) { - - // We want to encode VTIMEZONE first, this is a personal - // preference. - if ($array[$key]->name === 'VTIMEZONE') { - $score=300000000; - return $score+$key; - } else { - $score=400000000; - return $score+$key; - } - } else { - // Properties get encoded first - // VCARD version 4.0 wants the VERSION property to appear first - if ($array[$key] instanceof Property) { - if ($array[$key]->name === 'VERSION') { - $score=100000000; - return $score+$key; - } else { - // All other properties - $score=200000000; - return $score+$key; - } - } - } - - }; - - $tmp = $this->children; - uksort($this->children, function($a, $b) use ($sortScore, $tmp) { - - $sA = $sortScore($a, $tmp); - $sB = $sortScore($b, $tmp); - - return $sA - $sB; - - }); - - foreach($this->children as $child) $str.=$child->serialize(); - $str.= "END:" . $this->name . "\r\n"; - - return $str; - - } - - /** - * This method returns an array, with the representation as it should be - * encoded in json. This is used to create jCard or jCal documents. - * - * @return array - */ - public function jsonSerialize() { - - $components = array(); - $properties = array(); - - foreach($this->children as $child) { - if ($child instanceof Component) { - $components[] = $child->jsonSerialize(); - } else { - $properties[] = $child->jsonSerialize(); - } - } - - return array( - strtolower($this->name), - $properties, - $components - ); - - } - - /** - * This method should return a list of default property values. - * - * @return array - */ - protected function getDefaults() { - - return array(); - - } - - /* Magic property accessors {{{ */ - - /** - * Using 'get' you will either get a property or component. - * - * If there were no child-elements found with the specified name, - * null is returned. - * - * To use this, this may look something like this: - * - * $event = $calendar->VEVENT; - * - * @param string $name - * @return Property - */ - public function __get($name) { - - $matches = $this->select($name); - if (count($matches)===0) { - return null; - } else { - $firstMatch = current($matches); - /** @var $firstMatch Property */ - $firstMatch->setIterator(new ElementList(array_values($matches))); - return $firstMatch; - } - - } - - /** - * This method checks if a sub-element with the specified name exists. - * - * @param string $name - * @return bool - */ - public function __isset($name) { - - $matches = $this->select($name); - return count($matches)>0; - - } - - /** - * Using the setter method you can add properties or subcomponents - * - * You can either pass a Component, Property - * object, or a string to automatically create a Property. - * - * If the item already exists, it will be removed. If you want to add - * a new item with the same name, always use the add() method. - * - * @param string $name - * @param mixed $value - * @return void - */ - public function __set($name, $value) { - - $matches = $this->select($name); - $overWrite = count($matches)?key($matches):null; - - if ($value instanceof Component || $value instanceof Property) { - $value->parent = $this; - if (!is_null($overWrite)) { - $this->children[$overWrite] = $value; - } else { - $this->children[] = $value; - } - } elseif (is_scalar($value) || is_array($value) || is_null($value)) { - $property = $this->root->create($name,$value); - $property->parent = $this; - if (!is_null($overWrite)) { - $this->children[$overWrite] = $property; - } else { - $this->children[] = $property; - } - } else { - throw new \InvalidArgumentException('You must pass a \\SabreForRainLoop\\VObject\\Component, \\SabreForRainLoop\\VObject\\Property or scalar type'); - } - - } - - /** - * Removes all properties and components within this component with the - * specified name. - * - * @param string $name - * @return void - */ - public function __unset($name) { - - $matches = $this->select($name); - foreach($matches as $k=>$child) { - - unset($this->children[$k]); - $child->parent = null; - - } - - } - - /* }}} */ - - /** - * This method is automatically called when the object is cloned. - * Specifically, this will ensure all child elements are also cloned. - * - * @return void - */ - public function __clone() { - - foreach($this->children as $key=>$child) { - $this->children[$key] = clone $child; - $this->children[$key]->parent = $this; - } - - } - - /** - * Validates the node for correctness. - * - * The following options are supported: - * - Node::REPAIR - If something is broken, an automatic repair may - * be attempted. - * - * An array is returned with warnings. - * - * Every item in the array has the following properties: - * * level - (number between 1 and 3 with severity information) - * * message - (human readable message) - * * node - (reference to the offending node) - * - * @param int $options - * @return array - */ - public function validate($options = 0) { - - $result = array(); - foreach($this->children as $child) { - $result = array_merge($result, $child->validate($options)); - } - return $result; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VAlarm.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VAlarm.php deleted file mode 100755 index 6951c199..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VAlarm.php +++ /dev/null @@ -1,108 +0,0 @@ -TRIGGER; - if(!isset($trigger['VALUE']) || strtoupper($trigger['VALUE']) === 'DURATION') { - $triggerDuration = VObject\DateTimeParser::parseDuration($this->TRIGGER); - $related = (isset($trigger['RELATED']) && strtoupper($trigger['RELATED']) == 'END') ? 'END' : 'START'; - - $parentComponent = $this->parent; - if ($related === 'START') { - - if ($parentComponent->name === 'VTODO') { - $propName = 'DUE'; - } else { - $propName = 'DTSTART'; - } - - $effectiveTrigger = clone $parentComponent->$propName->getDateTime(); - $effectiveTrigger->add($triggerDuration); - } else { - if ($parentComponent->name === 'VTODO') { - $endProp = 'DUE'; - } elseif ($parentComponent->name === 'VEVENT') { - $endProp = 'DTEND'; - } else { - throw new \LogicException('time-range filters on VALARM components are only supported when they are a child of VTODO or VEVENT'); - } - - if (isset($parentComponent->$endProp)) { - $effectiveTrigger = clone $parentComponent->$endProp->getDateTime(); - $effectiveTrigger->add($triggerDuration); - } elseif (isset($parentComponent->DURATION)) { - $effectiveTrigger = clone $parentComponent->DTSTART->getDateTime(); - $duration = VObject\DateTimeParser::parseDuration($parentComponent->DURATION); - $effectiveTrigger->add($duration); - $effectiveTrigger->add($triggerDuration); - } else { - $effectiveTrigger = clone $parentComponent->DTSTART->getDateTime(); - $effectiveTrigger->add($triggerDuration); - } - } - } else { - $effectiveTrigger = $trigger->getDateTime(); - } - return $effectiveTrigger; - - } - - /** - * Returns true or false depending on if the event falls in the specified - * time-range. This is used for filtering purposes. - * - * The rules used to determine if an event falls within the specified - * time-range is based on the CalDAV specification. - * - * @param \DateTime $start - * @param \DateTime $end - * @return bool - */ - public function isInTimeRange(\DateTime $start, \DateTime $end) { - - $effectiveTrigger = $this->getEffectiveTriggerTime(); - - if (isset($this->DURATION)) { - $duration = VObject\DateTimeParser::parseDuration($this->DURATION); - $repeat = (string)$this->repeat; - if (!$repeat) { - $repeat = 1; - } - - $period = new \DatePeriod($effectiveTrigger, $duration, (int)$repeat); - - foreach($period as $occurrence) { - - if ($start <= $occurrence && $end > $occurrence) { - return true; - } - } - return false; - } else { - return ($start <= $effectiveTrigger && $end > $effectiveTrigger); - } - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VCalendar.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VCalendar.php deleted file mode 100755 index ecc6784d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VCalendar.php +++ /dev/null @@ -1,369 +0,0 @@ - 'SabreForRainLoop\\VObject\\Component\\VEvent', - 'VFREEBUSY' => 'SabreForRainLoop\\VObject\\Component\\VFreeBusy', - 'VJOURNAL' => 'SabreForRainLoop\\VObject\\Component\\VJournal', - 'VTODO' => 'SabreForRainLoop\\VObject\\Component\\VTodo', - 'VALARM' => 'SabreForRainLoop\\VObject\\Component\\VAlarm', - ); - - /** - * List of value-types, and which classes they map to. - * - * @var array - */ - static public $valueMap = array( - 'BINARY' => 'SabreForRainLoop\\VObject\\Property\\Binary', - 'BOOLEAN' => 'SabreForRainLoop\\VObject\\Property\\Boolean', - 'CAL-ADDRESS' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\CalAddress', - 'DATE' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Date', - 'DATE-TIME' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', - 'DURATION' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Duration', - 'FLOAT' => 'SabreForRainLoop\\VObject\\Property\\Float', - 'INTEGER' => 'SabreForRainLoop\\VObject\\Property\\Integer', - 'PERIOD' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Period', - 'RECUR' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Recur', - 'TEXT' => 'SabreForRainLoop\\VObject\\Property\\Text', - 'TIME' => 'SabreForRainLoop\\VObject\\Property\\Time', - 'UNKNOWN' => 'SabreForRainLoop\\VObject\\Property\\Unknown', // jCard / jCal-only. - 'URI' => 'SabreForRainLoop\\VObject\\Property\\Uri', - 'UTC-OFFSET' => 'SabreForRainLoop\\VObject\\Property\\UtcOffset', - ); - - /** - * List of properties, and which classes they map to. - * - * @var array - */ - static public $propertyMap = array( - // Calendar properties - 'CALSCALE' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'METHOD' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'PRODID' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'VERSION' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - - // Component properties - 'ATTACH' => 'SabreForRainLoop\\VObject\\Property\\Binary', - 'CATEGORIES' => 'SabreForRainLoop\\VObject\\Property\\Text', - 'CLASS' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'COMMENT' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'DESCRIPTION' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'GEO' => 'SabreForRainLoop\\VObject\\Property\\Float', - 'LOCATION' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'PERCENT-COMPLETE' => 'SabreForRainLoop\\VObject\\Property\\Integer', - 'PRIORITY' => 'SabreForRainLoop\\VObject\\Property\\Integer', - 'RESOURCES' => 'SabreForRainLoop\\VObject\\Property\\Text', - 'STATUS' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'SUMMARY' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - - // Date and Time Component Properties - 'COMPLETED' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', - 'DTEND' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', - 'DUE' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', - 'DTSTART' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', - 'DURATION' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Duration', - 'FREEBUSY' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Period', - 'TRANSP' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - - // Time Zone Component Properties - 'TZID' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'TZNAME' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'TZOFFSETFROM' => 'SabreForRainLoop\\VObject\\Property\\UtcOffset', - 'TZOFFSETTO' => 'SabreForRainLoop\\VObject\\Property\\UtcOffset', - 'TZURL' => 'SabreForRainLoop\\VObject\\Property\\Uri', - - // Relationship Component Properties - 'ATTENDEE' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\CalAddress', - 'CONTACT' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'ORGANIZER' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\CalAddress', - 'RECURRENCE-ID' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', - 'RELATED-TO' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'URL' => 'SabreForRainLoop\\VObject\\Property\\Uri', - 'UID' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - - // Recurrence Component Properties - 'EXDATE' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', - 'RDATE' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', - 'RRULE' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Recur', - 'EXRULE' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Recur', // Deprecated since rfc5545 - - // Alarm Component Properties - 'ACTION' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'REPEAT' => 'SabreForRainLoop\\VObject\\Property\\Integer', - 'TRIGGER' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Duration', - - // Change Management Component Properties - 'CREATED' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', - 'DTSTAMP' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', - 'LAST-MODIFIED' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', - 'SEQUENCE' => 'SabreForRainLoop\\VObject\\Property\\Integer', - - // Request Status - 'REQUEST-STATUS' => 'SabreForRainLoop\\VObject\\Property\\Text', - - // Additions from draft-daboo-valarm-extensions-04 - 'ALARM-AGENT' => 'SabreForRainLoop\\VObject\\Property\\Text', - 'ACKNOWLEDGED' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', - 'PROXIMITY' => 'SabreForRainLoop\\VObject\\Property\\Text', - 'DEFAULT-ALARM' => 'SabreForRainLoop\\VObject\\Property\\Boolean', - - ); - - /** - * Returns the current document type. - * - * @return void - */ - public function getDocumentType() { - - return self::ICALENDAR20; - - } - - /** - * Returns a list of all 'base components'. For instance, if an Event has - * a recurrence rule, and one instance is overridden, the overridden event - * will have the same UID, but will be excluded from this list. - * - * VTIMEZONE components will always be excluded. - * - * @param string $componentName filter by component name - * @return array - */ - public function getBaseComponents($componentName = null) { - - $components = array(); - foreach($this->children as $component) { - - if (!$component instanceof VObject\Component) - continue; - - if (isset($component->{'RECURRENCE-ID'})) - continue; - - if ($componentName && $component->name !== strtoupper($componentName)) - continue; - - if ($component->name === 'VTIMEZONE') - continue; - - $components[] = $component; - - } - - return $components; - - } - - /** - * If this calendar object, has events with recurrence rules, this method - * can be used to expand the event into multiple sub-events. - * - * Each event will be stripped from it's recurrence information, and only - * the instances of the event in the specified timerange will be left - * alone. - * - * In addition, this method will cause timezone information to be stripped, - * and normalized to UTC. - * - * This method will alter the VCalendar. This cannot be reversed. - * - * This functionality is specifically used by the CalDAV standard. It is - * possible for clients to request expand events, if they are rather simple - * clients and do not have the possibility to calculate recurrences. - * - * @param DateTime $start - * @param DateTime $end - * @return void - */ - public function expand(\DateTime $start, \DateTime $end) { - - $newEvents = array(); - - foreach($this->select('VEVENT') as $key=>$vevent) { - - if (isset($vevent->{'RECURRENCE-ID'})) { - unset($this->children[$key]); - continue; - } - - - if (!$vevent->rrule) { - unset($this->children[$key]); - if ($vevent->isInTimeRange($start, $end)) { - $newEvents[] = $vevent; - } - continue; - } - - $uid = (string)$vevent->uid; - if (!$uid) { - throw new \LogicException('Event did not have a UID!'); - } - - $it = new VObject\RecurrenceIterator($this, $vevent->uid); - $it->fastForward($start); - - while($it->valid() && $it->getDTStart() < $end) { - - if ($it->getDTEnd() > $start) { - - $newEvents[] = $it->getEventObject(); - - } - $it->next(); - - } - unset($this->children[$key]); - - } - - // Setting all properties to UTC time. - foreach($newEvents as $newEvent) { - - foreach($newEvent->children as $child) { - if ($child instanceof VObject\Property\ICalendar\DateTime && $child->hasTime()) { - $dt = $child->getDateTimes(); - // We only need to update the first timezone, because - // setDateTimes will match all other timezones to the - // first. - $dt[0]->setTimeZone(new \DateTimeZone('UTC')); - $child->setDateTimes($dt); - } - - } - - $this->add($newEvent); - - } - - // Removing all VTIMEZONE components - unset($this->VTIMEZONE); - - } - - /** - * This method should return a list of default property values. - * - * @return array - */ - protected function getDefaults() { - - return array( - 'VERSION' => '2.0', - 'PRODID' => '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN', - 'CALSCALE' => 'GREGORIAN', - ); - - } - - /** - * Validates the node for correctness. - * An array is returned with warnings. - * - * Every item in the array has the following properties: - * * level - (number between 1 and 3 with severity information) - * * message - (human readable message) - * * node - (reference to the offending node) - * - * @return array - */ - public function validate($options = 0) { - - $warnings = array(); - - $version = $this->select('VERSION'); - if (count($version)!==1) { - $warnings[] = array( - 'level' => 1, - 'message' => 'The VERSION property must appear in the VCALENDAR component exactly 1 time', - 'node' => $this, - ); - } else { - if ((string)$this->VERSION !== '2.0') { - $warnings[] = array( - 'level' => 1, - 'message' => 'Only iCalendar version 2.0 as defined in rfc5545 is supported.', - 'node' => $this, - ); - } - } - $version = $this->select('PRODID'); - if (count($version)!==1) { - $warnings[] = array( - 'level' => 2, - 'message' => 'The PRODID property must appear in the VCALENDAR component exactly 1 time', - 'node' => $this, - ); - } - if (count($this->CALSCALE) > 1) { - $warnings[] = array( - 'level' => 2, - 'message' => 'The CALSCALE property must not be specified more than once.', - 'node' => $this, - ); - } - if (count($this->METHOD) > 1) { - $warnings[] = array( - 'level' => 2, - 'message' => 'The METHOD property must not be specified more than once.', - 'node' => $this, - ); - } - - $componentsFound = 0; - foreach($this->children as $child) { - if($child instanceof Component) { - $componentsFound++; - } - } - - if ($componentsFound===0) { - $warnings[] = array( - 'level' => 1, - 'message' => 'An iCalendar object must have at least 1 component.', - 'node' => $this, - ); - } - - return array_merge( - $warnings, - parent::validate() - ); - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VCard.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VCard.php deleted file mode 100755 index e44ac3f1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VCard.php +++ /dev/null @@ -1,353 +0,0 @@ - 'SabreForRainLoop\\VObject\\Property\\Binary', - 'BOOLEAN' => 'SabreForRainLoop\\VObject\\Property\\Boolean', - 'CONTENT-ID' => 'SabreForRainLoop\\VObject\\Property\\FlatText', // vCard 2.1 only - 'DATE' => 'SabreForRainLoop\\VObject\\Property\\VCard\\Date', - 'DATE-TIME' => 'SabreForRainLoop\\VObject\\Property\\VCard\\DateTime', - 'DATE-AND-OR-TIME' => 'SabreForRainLoop\\VObject\\Property\\VCard\\DateAndOrTime', // vCard only - 'FLOAT' => 'SabreForRainLoop\\VObject\\Property\\Float', - 'INTEGER' => 'SabreForRainLoop\\VObject\\Property\\Integer', - 'LANGUAGE-TAG' => 'SabreForRainLoop\\VObject\\Property\\VCard\\LanguageTag', - 'TIMESTAMP' => 'SabreForRainLoop\\VObject\\Property\\VCard\\TimeStamp', - 'TEXT' => 'SabreForRainLoop\\VObject\\Property\\Text', - 'TIME' => 'SabreForRainLoop\\VObject\\Property\\Time', - 'UNKNOWN' => 'SabreForRainLoop\\VObject\\Property\\Unknown', // jCard / jCal-only. - 'URI' => 'SabreForRainLoop\\VObject\\Property\\Uri', - 'URL' => 'SabreForRainLoop\\VObject\\Property\\Uri', // vCard 2.1 only - 'UTC-OFFSET' => 'SabreForRainLoop\\VObject\\Property\\UtcOffset', - ); - - /** - * List of properties, and which classes they map to. - * - * @var array - */ - static public $propertyMap = array( - - // vCard 2.1 properties and up - 'N' => 'SabreForRainLoop\\VObject\\Property\\Text', - 'FN' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'PHOTO' => 'SabreForRainLoop\\VObject\\Property\\Binary', // Todo: we should add a class for Binary values. - 'BDAY' => 'SabreForRainLoop\\VObject\\Property\\VCard\\DateAndOrTime', - 'ADR' => 'SabreForRainLoop\\VObject\\Property\\Text', - 'LABEL' => 'SabreForRainLoop\\VObject\\Property\\FlatText', // Removed in vCard 4.0 - 'TEL' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'EMAIL' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'MAILER' => 'SabreForRainLoop\\VObject\\Property\\FlatText', // Removed in vCard 4.0 - 'GEO' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'TITLE' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'ROLE' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'LOGO' => 'SabreForRainLoop\\VObject\\Property\\Binary', - // 'AGENT' => 'SabreForRainLoop\\VObject\\Property\\', // Todo: is an embedded vCard. Probably rare, so - // not supported at the moment - 'ORG' => 'SabreForRainLoop\\VObject\\Property\\Text', - 'NOTE' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'REV' => 'SabreForRainLoop\\VObject\\Property\\VCard\\TimeStamp', - 'SOUND' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'URL' => 'SabreForRainLoop\\VObject\\Property\\Uri', - 'UID' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'VERSION' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'KEY' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'TZ' => 'SabreForRainLoop\\VObject\\Property\\Text', - - // vCard 3.0 properties - 'CATEGORIES' => 'SabreForRainLoop\\VObject\\Property\\Text', - 'SORT-STRING' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'PRODID' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'NICKNAME' => 'SabreForRainLoop\\VObject\\Property\\Text', - 'CLASS' => 'SabreForRainLoop\\VObject\\Property\\FlatText', // Removed in vCard 4.0 - - // rfc2739 properties - 'FBURL' => 'SabreForRainLoop\\VObject\\Property\\Uri', - 'CAPURI' => 'SabreForRainLoop\\VObject\\Property\\Uri', - 'CALURI' => 'SabreForRainLoop\\VObject\\Property\\Uri', - - // rfc4770 properties - 'IMPP' => 'SabreForRainLoop\\VObject\\Property\\Uri', - - // vCard 4.0 properties - 'XML' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - 'ANNIVERSARY' => 'SabreForRainLoop\\VObject\\Property\\VCard\\DateAndOrTime', - 'CLIENTPIDMAP' => 'SabreForRainLoop\\VObject\\Property\\Text', - 'LANG' => 'SabreForRainLoop\\VObject\\Property\\VCard\\LanguageTag', - 'GENDER' => 'SabreForRainLoop\\VObject\\Property\\Text', - 'KIND' => 'SabreForRainLoop\\VObject\\Property\\FlatText', - - ); - - /** - * Returns the current document type. - * - * @return void - */ - public function getDocumentType() { - - if (!$this->version) { - $version = (string)$this->VERSION; - switch($version) { - case '2.1' : - $this->version = self::VCARD21; - break; - case '3.0' : - $this->version = self::VCARD30; - break; - case '4.0' : - $this->version = self::VCARD40; - break; - default : - $this->version = self::UNKNOWN; - break; - - } - } - - return $this->version; - - } - - /** - * Converts the document to a different vcard version. - * - * Use one of the VCARD constants for the target. This method will return - * a copy of the vcard in the new version. - * - * At the moment the only supported conversion is from 3.0 to 4.0. - * - * If input and output version are identical, a clone is returned. - * - * @param int $target - * @return VCard - */ - public function convert($target) { - - $converter = new VObject\VCardConverter(); - return $converter->convert($this, $target); - - } - - /** - * VCards with version 2.1, 3.0 and 4.0 are found. - * - * If the VCARD doesn't know its version, 2.1 is assumed. - */ - const DEFAULT_VERSION = self::VCARD21; - - - - /** - * Validates the node for correctness. - * - * The following options are supported: - * - Node::REPAIR - If something is broken, and automatic repair may - * be attempted. - * - * An array is returned with warnings. - * - * Every item in the array has the following properties: - * * level - (number between 1 and 3 with severity information) - * * message - (human readable message) - * * node - (reference to the offending node) - * - * @param int $options - * @return array - */ - public function validate($options = 0) { - - $warnings = array(); - - $versionMap = array( - self::VCARD21 => '2.1', - self::VCARD30 => '3.0', - self::VCARD40 => '4.0', - ); - - $version = $this->select('VERSION'); - if (count($version)!==1) { - $warnings[] = array( - 'level' => 1, - 'message' => 'The VERSION property must appear in the VCARD component exactly 1 time', - 'node' => $this, - ); - if ($options & self::REPAIR) { - $this->VERSION = $versionMap[self::DEFAULT_VERSION]; - } - } else { - $version = (string)$this->VERSION; - if ($version!=='2.1' && $version!=='3.0' && $version!=='4.0') { - $warnings[] = array( - 'level' => 1, - 'message' => 'Only vcard version 4.0 (RFC6350), version 3.0 (RFC2426) or version 2.1 (icm-vcard-2.1) are supported.', - 'node' => $this, - ); - if ($options & self::REPAIR) { - $this->VERSION = $versionMap[self::DEFAULT_VERSION]; - } - } - - } - $fn = $this->select('FN'); - if (count($fn)!==1) { - $warnings[] = array( - 'level' => 1, - 'message' => 'The FN property must appear in the VCARD component exactly 1 time', - 'node' => $this, - ); - if (($options & self::REPAIR) && count($fn) === 0) { - // We're going to try to see if we can use the contents of the - // N property. - if (isset($this->N)) { - $value = explode(';', (string)$this->N); - if (isset($value[1]) && $value[1]) { - $this->FN = $value[1] . ' ' . $value[0]; - } else { - $this->FN = $value[0]; - } - - // Otherwise, the ORG property may work - } elseif (isset($this->ORG)) { - $this->FN = (string)$this->ORG; - } - - } - } - - return array_merge( - parent::validate($options), - $warnings - ); - - } - - /** - * Returns a preferred field. - * - * VCards can indicate wether a field such as ADR, TEL or EMAIL is - * preferred by specifying TYPE=PREF (vcard 2.1, 3) or PREF=x (vcard 4, x - * being a number between 1 and 100). - * - * If neither of those parameters are specified, the first is returned, if - * a field with that name does not exist, null is returned. - * - * @param string $fieldName - * @return VObject\Property|null - */ - public function preferred($propertyName) { - - $preferred = null; - $lastPref = 101; - foreach($this->select($propertyName) as $field) { - - $pref = 101; - if (isset($field['TYPE']) && $field['TYPE']->has('PREF')) { - $pref = 1; - } elseif (isset($field['PREF'])) { - $pref = $field['PREF']->getValue(); - } - - if ($pref < $lastPref || is_null($preferred)) { - $preferred = $field; - $lastPref = $pref; - } - - } - return $preferred; - - } - - /** - * This method should return a list of default property values. - * - * @return array - */ - protected function getDefaults() { - - return array( - 'VERSION' => '3.0', - 'PRODID' => '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN', - ); - - } - - /** - * This method returns an array, with the representation as it should be - * encoded in json. This is used to create jCard or jCal documents. - * - * @return array - */ - public function jsonSerialize() { - - // A vcard does not have sub-components, so we're overriding this - // method to remove that array element. - $properties = array(); - - foreach($this->children as $child) { - $properties[] = $child->jsonSerialize(); - } - - return array( - strtolower($this->name), - $properties, - ); - - } - - /** - * Returns the default class for a property name. - * - * @param string $propertyName - * @return string - */ - public function getClassNameForPropertyName($propertyName) { - - $className = parent::getClassNameForPropertyName($propertyName); - // In vCard 4, BINARY no longer exists, and we need URI instead. - - if ($className == 'SabreForRainLoop\\VObject\\Property\\Binary' && $this->getDocumentType()===self::VCARD40) { - return 'SabreForRainLoop\\VObject\\Property\\Uri'; - } - return $className; - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VEvent.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VEvent.php deleted file mode 100755 index b1dc1933..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VEvent.php +++ /dev/null @@ -1,70 +0,0 @@ -RRULE) { - $it = new VObject\RecurrenceIterator($this); - $it->fastForward($start); - - // We fast-forwarded to a spot where the end-time of the - // recurrence instance exceeded the start of the requested - // time-range. - // - // If the starttime of the recurrence did not exceed the - // end of the time range as well, we have a match. - return ($it->getDTStart() < $end && $it->getDTEnd() > $start); - - } - - $effectiveStart = $this->DTSTART->getDateTime(); - if (isset($this->DTEND)) { - - // The DTEND property is considered non inclusive. So for a 3 day - // event in july, dtstart and dtend would have to be July 1st and - // July 4th respectively. - // - // See: - // http://tools.ietf.org/html/rfc5545#page-54 - $effectiveEnd = $this->DTEND->getDateTime(); - - } elseif (isset($this->DURATION)) { - $effectiveEnd = clone $effectiveStart; - $effectiveEnd->add( VObject\DateTimeParser::parseDuration($this->DURATION) ); - } elseif (!$this->DTSTART->hasTime()) { - $effectiveEnd = clone $effectiveStart; - $effectiveEnd->modify('+1 day'); - } else { - $effectiveEnd = clone $effectiveStart; - } - return ( - ($start <= $effectiveEnd) && ($end > $effectiveStart) - ); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VFreeBusy.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VFreeBusy.php deleted file mode 100755 index 1787c6bb..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VFreeBusy.php +++ /dev/null @@ -1,68 +0,0 @@ -select('FREEBUSY') as $freebusy) { - - // We are only interested in FBTYPE=BUSY (the default), - // FBTYPE=BUSY-TENTATIVE or FBTYPE=BUSY-UNAVAILABLE. - if (isset($freebusy['FBTYPE']) && strtoupper(substr((string)$freebusy['FBTYPE'],0,4))!=='BUSY') { - continue; - } - - // The freebusy component can hold more than 1 value, separated by - // commas. - $periods = explode(',', (string)$freebusy); - - foreach($periods as $period) { - // Every period is formatted as [start]/[end]. The start is an - // absolute UTC time, the end may be an absolute UTC time, or - // duration (relative) value. - list($busyStart, $busyEnd) = explode('/', $period); - - $busyStart = VObject\DateTimeParser::parse($busyStart); - $busyEnd = VObject\DateTimeParser::parse($busyEnd); - if ($busyEnd instanceof \DateInterval) { - $tmp = clone $busyStart; - $tmp->add($busyEnd); - $busyEnd = $tmp; - } - - if($start < $busyEnd && $end > $busyStart) { - return false; - } - - } - - } - - return true; - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VJournal.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VJournal.php deleted file mode 100755 index 8a54a2b0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VJournal.php +++ /dev/null @@ -1,46 +0,0 @@ -DTSTART)?$this->DTSTART->getDateTime():null; - if ($dtstart) { - $effectiveEnd = clone $dtstart; - if (!$this->DTSTART->hasTime()) { - $effectiveEnd->modify('+1 day'); - } - - return ($start <= $effectiveEnd && $end > $dtstart); - - } - return false; - - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VTodo.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VTodo.php deleted file mode 100755 index 27bd2e30..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Component/VTodo.php +++ /dev/null @@ -1,68 +0,0 @@ -DTSTART)?$this->DTSTART->getDateTime():null; - $duration = isset($this->DURATION)?VObject\DateTimeParser::parseDuration($this->DURATION):null; - $due = isset($this->DUE)?$this->DUE->getDateTime():null; - $completed = isset($this->COMPLETED)?$this->COMPLETED->getDateTime():null; - $created = isset($this->CREATED)?$this->CREATED->getDateTime():null; - - if ($dtstart) { - if ($duration) { - $effectiveEnd = clone $dtstart; - $effectiveEnd->add($duration); - return $start <= $effectiveEnd && $end > $dtstart; - } elseif ($due) { - return - ($start < $due || $start <= $dtstart) && - ($end > $dtstart || $end >= $due); - } else { - return $start <= $dtstart && $end > $dtstart; - } - } - if ($due) { - return ($start < $due && $end >= $due); - } - if ($completed && $created) { - return - ($start <= $created || $start <= $completed) && - ($end >= $created || $end >= $completed); - } - if ($completed) { - return ($start <= $completed && $end >= $completed); - } - if ($created) { - return ($end > $created); - } - return true; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/DateTimeParser.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/DateTimeParser.php deleted file mode 100755 index 687a9176..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/DateTimeParser.php +++ /dev/null @@ -1,415 +0,0 @@ -setTimeZone(new \DateTimeZone('UTC')); - return $date; - - } - - /** - * Parses an iCalendar (rfc5545) formatted date and returns a DateTime object - * - * @param string $date - * @return DateTime - */ - static public function parseDate($date) { - - // Format is YYYYMMDD - $result = preg_match('/^([0-9]{4})([0-1][0-9])([0-3][0-9])$/',$date,$matches); - - if (!$result) { - throw new \LogicException('The supplied iCalendar date value is incorrect: ' . $date); - } - - $date = new \DateTime($matches[1] . '-' . $matches[2] . '-' . $matches[3], new \DateTimeZone('UTC')); - return $date; - - } - - /** - * Parses an iCalendar (RFC5545) formatted duration value. - * - * This method will either return a DateTimeInterval object, or a string - * suitable for strtotime or DateTime::modify. - * - * @param string $duration - * @param bool $asString - * @return DateInterval|string - */ - static public function parseDuration($duration, $asString = false) { - - $result = preg_match('/^(?P\+|-)?P((?P\d+)W)?((?P\d+)D)?(T((?P\d+)H)?((?P\d+)M)?((?P\d+)S)?)?$/', $duration, $matches); - if (!$result) { - throw new \LogicException('The supplied iCalendar duration value is incorrect: ' . $duration); - } - - if (!$asString) { - $invert = false; - if ($matches['plusminus']==='-') { - $invert = true; - } - - - $parts = array( - 'week', - 'day', - 'hour', - 'minute', - 'second', - ); - foreach($parts as $part) { - $matches[$part] = isset($matches[$part])&&$matches[$part]?(int)$matches[$part]:0; - } - - - // We need to re-construct the $duration string, because weeks and - // days are not supported by DateInterval in the same string. - $duration = 'P'; - $days = $matches['day']; - if ($matches['week']) { - $days+=$matches['week']*7; - } - if ($days) - $duration.=$days . 'D'; - - if ($matches['minute'] || $matches['second'] || $matches['hour']) { - $duration.='T'; - - if ($matches['hour']) - $duration.=$matches['hour'].'H'; - - if ($matches['minute']) - $duration.=$matches['minute'].'M'; - - if ($matches['second']) - $duration.=$matches['second'].'S'; - - } - - if ($duration==='P') { - $duration = 'PT0S'; - } - $iv = new \DateInterval($duration); - if ($invert) $iv->invert = true; - - return $iv; - - } - - - - $parts = array( - 'week', - 'day', - 'hour', - 'minute', - 'second', - ); - - $newDur = ''; - foreach($parts as $part) { - if (isset($matches[$part]) && $matches[$part]) { - $newDur.=' '.$matches[$part] . ' ' . $part . 's'; - } - } - - $newDur = ($matches['plusminus']==='-'?'-':'+') . trim($newDur); - if ($newDur === '+') { $newDur = '+0 seconds'; }; - return $newDur; - - } - - /** - * Parses either a Date or DateTime, or Duration value. - * - * @param string $date - * @param DateTimeZone|string $referenceTZ - * @return DateTime|DateInterval - */ - static public function parse($date, $referenceTZ = null) { - - if ($date[0]==='P' || ($date[0]==='-' && $date[1]==='P')) { - return self::parseDuration($date); - } elseif (strlen($date)===8) { - return self::parseDate($date); - } else { - return self::parseDateTime($date, $referenceTZ); - } - - } - - /** - * This method parses a vCard date and or time value. - * - * This can be used for the DATE, DATE-TIME, TIMESTAMP and - * DATE-AND-OR-TIME value. - * - * This method returns an array, not a DateTime value. - * - * The elements in the array are in the following order: - * year, month, date, hour, minute, second, timezone - * - * Almost any part of the string may be omitted. It's for example legal to - * just specify seconds, leave out the year, etc. - * - * Timezone is either returned as 'Z' or as '+08:00' - * - * For any non-specified values null is returned. - * - * List of date formats that are supported: - * YYYY - * YYYY-MM - * YYYYMMDD - * --MMDD - * ---DD - * - * YYYY-MM-DD - * --MM-DD - * ---DD - * - * List of supported time formats: - * - * HH - * HHMM - * HHMMSS - * -MMSS - * --SS - * - * HH - * HH:MM - * HH:MM:SS - * -MM:SS - * --SS - * - * A full basic-format date-time string looks like : - * 20130603T133901 - * - * A full extended-format date-time string looks like : - * 2013-06-03T13:39:01 - * - * Times may be postfixed by a timezone offset. This can be either 'Z' for - * UTC, or a string like -0500 or +1100. - * - * @param string $date - * @return array - */ - static public function parseVCardDateTime($date) { - - $regex = '/^ - (?: # date part - (?: - (?: (?P [0-9]{4}) (?: -)?| --) - (?P [0-9]{2})? - |---) - (?P [0-9]{2})? - )? - (?:T # time part - (?P [0-9]{2} | -) - (?P [0-9]{2} | -)? - (?P [0-9]{2})? - - (?P # timezone offset - - Z | (?: \+|-)(?: [0-9]{4}) - - )? - - )? - $/x'; - - - if (!preg_match($regex, $date, $matches)) { - - // Attempting to parse the extended format. - $regex = '/^ - (?: # date part - (?: (?P [0-9]{4}) - | -- ) - (?P [0-9]{2}) - - (?P [0-9]{2}) - )? - (?:T # time part - - (?: (?P [0-9]{2}) : | -) - (?: (?P [0-9]{2}) : | -)? - (?P [0-9]{2})? - - (?P # timezone offset - - Z | (?: \+|-)(?: [0-9]{2}:[0-9]{2}) - - )? - - )? - $/x'; - - if (!preg_match($regex, $date, $matches)) { - throw new \InvalidArgumentException('Invalid vCard date-time string: ' . $date); - } - - } - $parts = array( - 'year', - 'month', - 'date', - 'hour', - 'minute', - 'second', - 'timezone' - ); - - $result = array(); - foreach($parts as $part) { - - if (empty($matches[$part])) { - $result[$part] = null; - } elseif ($matches[$part] === '-' || $matches[$part] === '--') { - $result[$part] = null; - } else { - $result[$part] = $matches[$part]; - } - - } - - return $result; - - } - - /** - * This method parses a vCard TIME value. - * - * This method returns an array, not a DateTime value. - * - * The elements in the array are in the following order: - * hour, minute, second, timezone - * - * Almost any part of the string may be omitted. It's for example legal to - * just specify seconds, leave out the hour etc. - * - * Timezone is either returned as 'Z' or as '+08:00' - * - * For any non-specified values null is returned. - * - * List of supported time formats: - * - * HH - * HHMM - * HHMMSS - * -MMSS - * --SS - * - * HH - * HH:MM - * HH:MM:SS - * -MM:SS - * --SS - * - * A full basic-format time string looks like : - * 133901 - * - * A full extended-format time string looks like : - * 13:39:01 - * - * Times may be postfixed by a timezone offset. This can be either 'Z' for - * UTC, or a string like -0500 or +11:00. - * - * @param string $date - * @return array - */ - static public function parseVCardTime($date) { - - $regex = '/^ - (?P [0-9]{2} | -) - (?P [0-9]{2} | -)? - (?P [0-9]{2})? - - (?P # timezone offset - - Z | (?: \+|-)(?: [0-9]{4}) - - )? - $/x'; - - - if (!preg_match($regex, $date, $matches)) { - - // Attempting to parse the extended format. - $regex = '/^ - (?: (?P [0-9]{2}) : | -) - (?: (?P [0-9]{2}) : | -)? - (?P [0-9]{2})? - - (?P # timezone offset - - Z | (?: \+|-)(?: [0-9]{2}:[0-9]{2}) - - )? - $/x'; - - if (!preg_match($regex, $date, $matches)) { - throw new \InvalidArgumentException('Invalid vCard time string: ' . $date); - } - - } - $parts = array( - 'hour', - 'minute', - 'second', - 'timezone' - ); - - $result = array(); - foreach($parts as $part) { - - if (empty($matches[$part])) { - $result[$part] = null; - } elseif ($matches[$part] === '-') { - $result[$part] = null; - } else { - $result[$part] = $matches[$part]; - } - - } - - return $result; - - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Document.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Document.php deleted file mode 100755 index fd17b162..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Document.php +++ /dev/null @@ -1,261 +0,0 @@ -value syntax, in which case - * properties will automatically be created, or you can just pass a list of - * Component and Property object. - * - * By default, a set of sensible values will be added to the component. For - * an iCalendar object, this may be something like CALSCALE:GREGORIAN. To - * ensure that this does not happen, set $defaults to false. - * - * @param string $name - * @param array $children - * @param bool $defaults - * @return Component - */ - public function createComponent($name, array $children = null, $defaults = true) { - - $name = strtoupper($name); - $class = 'SabreForRainLoop\\VObject\\Component'; - - if (isset(static::$componentMap[$name])) { - $class=static::$componentMap[$name]; - } - if (is_null($children)) $children = array(); - return new $class($this, $name, $children, $defaults); - - } - - /** - * Factory method for creating new properties - * - * This method automatically searches for the correct property class, based - * on its name. - * - * You can specify the parameters either in key=>value syntax, in which case - * parameters will automatically be created, or you can just pass a list of - * Parameter objects. - * - * @param string $name - * @param mixed $value - * @param array $parameters - * @param string $valueType Force a specific valuetype, such as URI or TEXT - * @return Property - */ - public function createProperty($name, $value = null, array $parameters = null, $valueType = null) { - - // If there's a . in the name, it means it's prefixed by a groupname. - if (($i=strpos($name,'.'))!==false) { - $group = substr($name, 0, $i); - $name = strtoupper(substr($name, $i+1)); - } else { - $name = strtoupper($name); - $group = null; - } - - $class = null; - - if ($valueType) { - // The valueType argument comes first to figure out the correct - // class. - $class = $this->getClassNameForPropertyValue($valueType); - } - - if (is_null($class) && isset($parameters['VALUE'])) { - // If a VALUE parameter is supplied, we should use that. - $class = $this->getClassNameForPropertyValue($parameters['VALUE']); - } - if (is_null($class)) { - $class = $this->getClassNameForPropertyName($name); - } - if (is_null($parameters)) $parameters = array(); - - return new $class($this, $name, $value, $parameters, $group); - - } - - /** - * This method returns a full class-name for a value parameter. - * - * For instance, DTSTART may have VALUE=DATE. In that case we will look in - * our valueMap table and return the appropriate class name. - * - * This method returns null if we don't have a specialized class. - * - * @param string $valueParam - * @return void - */ - public function getClassNameForPropertyValue($valueParam) { - - $valueParam = strtoupper($valueParam); - if (isset(static::$valueMap[$valueParam])) { - return static::$valueMap[$valueParam]; - } - - } - - /** - * Returns the default class for a property name. - * - * @param string $propertyName - * @return string - */ - public function getClassNameForPropertyName($propertyName) { - - if (isset(static::$propertyMap[$propertyName])) { - return static::$propertyMap[$propertyName]; - } else { - return 'SabreForRainLoop\\VObject\\Property\\Unknown'; - } - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/ElementList.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/ElementList.php deleted file mode 100755 index 807a085c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/ElementList.php +++ /dev/null @@ -1,172 +0,0 @@ -vevent where there's multiple VEVENT objects. - * - * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/). - * @author Evert Pot (http://evertpot.com/) - * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License - */ -class ElementList implements \Iterator, \Countable, \ArrayAccess { - - /** - * Inner elements - * - * @var array - */ - protected $elements = array(); - - /** - * Creates the element list. - * - * @param array $elements - */ - public function __construct(array $elements) { - - $this->elements = $elements; - - } - - /* {{{ Iterator interface */ - - /** - * Current position - * - * @var int - */ - private $key = 0; - - /** - * Returns current item in iteration - * - * @return Element - */ - public function current() { - - return $this->elements[$this->key]; - - } - - /** - * To the next item in the iterator - * - * @return void - */ - public function next() { - - $this->key++; - - } - - /** - * Returns the current iterator key - * - * @return int - */ - public function key() { - - return $this->key; - - } - - /** - * Returns true if the current position in the iterator is a valid one - * - * @return bool - */ - public function valid() { - - return isset($this->elements[$this->key]); - - } - - /** - * Rewinds the iterator - * - * @return void - */ - public function rewind() { - - $this->key = 0; - - } - - /* }}} */ - - /* {{{ Countable interface */ - - /** - * Returns the number of elements - * - * @return int - */ - public function count() { - - return count($this->elements); - - } - - /* }}} */ - - /* {{{ ArrayAccess Interface */ - - - /** - * Checks if an item exists through ArrayAccess. - * - * @param int $offset - * @return bool - */ - public function offsetExists($offset) { - - return isset($this->elements[$offset]); - - } - - /** - * Gets an item through ArrayAccess. - * - * @param int $offset - * @return mixed - */ - public function offsetGet($offset) { - - return $this->elements[$offset]; - - } - - /** - * Sets an item through ArrayAccess. - * - * @param int $offset - * @param mixed $value - * @return void - */ - public function offsetSet($offset,$value) { - - throw new \LogicException('You can not add new objects to an ElementList'); - - } - - /** - * Sets an item through ArrayAccess. - * - * This method just forwards the request to the inner iterator - * - * @param int $offset - * @return void - */ - public function offsetUnset($offset) { - - throw new \LogicException('You can not remove objects from an ElementList'); - - } - - /* }}} */ - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/EofException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/EofException.php deleted file mode 100755 index fc935098..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/EofException.php +++ /dev/null @@ -1,13 +0,0 @@ -setTimeRange($start, $end); - } - - if ($objects) { - $this->setObjects($objects); - } - - } - - /** - * Sets the VCALENDAR object. - * - * If this is set, it will not be generated for you. You are responsible - * for setting things like the METHOD, CALSCALE, VERSION, etc.. - * - * The VFREEBUSY object will be automatically added though. - * - * @param Component $vcalendar - * @return void - */ - public function setBaseObject(Component $vcalendar) { - - $this->baseObject = $vcalendar; - - } - - /** - * Sets the input objects - * - * You must either specify a valendar object as a strong, or as the parse - * Component. - * It's also possible to specify multiple objects as an array. - * - * @param mixed $objects - * @return void - */ - public function setObjects($objects) { - - if (!is_array($objects)) { - $objects = array($objects); - } - - $this->objects = array(); - foreach($objects as $object) { - - if (is_string($object)) { - $this->objects[] = Reader::read($object); - } elseif ($object instanceof Component) { - $this->objects[] = $object; - } else { - throw new \InvalidArgumentException('You can only pass strings or \\SabreForRainLoop\\VObject\\Component arguments to setObjects'); - } - - } - - } - - /** - * Sets the time range - * - * Any freebusy object falling outside of this time range will be ignored. - * - * @param DateTime $start - * @param DateTime $end - * @return void - */ - public function setTimeRange(\DateTime $start = null, \DateTime $end = null) { - - $this->start = $start; - $this->end = $end; - - } - - /** - * Parses the input data and returns a correct VFREEBUSY object, wrapped in - * a VCALENDAR. - * - * @return Component - */ - public function getResult() { - - $busyTimes = array(); - - foreach($this->objects as $object) { - - foreach($object->getBaseComponents() as $component) { - - switch($component->name) { - - case 'VEVENT' : - - $FBTYPE = 'BUSY'; - if (isset($component->TRANSP) && (strtoupper($component->TRANSP) === 'TRANSPARENT')) { - break; - } - if (isset($component->STATUS)) { - $status = strtoupper($component->STATUS); - if ($status==='CANCELLED') { - break; - } - if ($status==='TENTATIVE') { - $FBTYPE = 'BUSY-TENTATIVE'; - } - } - - $times = array(); - - if ($component->RRULE) { - - $iterator = new RecurrenceIterator($object, (string)$component->uid); - if ($this->start) { - $iterator->fastForward($this->start); - } - - $maxRecurrences = 200; - - while($iterator->valid() && --$maxRecurrences) { - - $startTime = $iterator->getDTStart(); - if ($this->end && $startTime > $this->end) { - break; - } - $times[] = array( - $iterator->getDTStart(), - $iterator->getDTEnd(), - ); - - $iterator->next(); - - } - - } else { - - $startTime = $component->DTSTART->getDateTime(); - if ($this->end && $startTime > $this->end) { - break; - } - $endTime = null; - if (isset($component->DTEND)) { - $endTime = $component->DTEND->getDateTime(); - } elseif (isset($component->DURATION)) { - $duration = DateTimeParser::parseDuration((string)$component->DURATION); - $endTime = clone $startTime; - $endTime->add($duration); - } elseif (!$component->DTSTART->hasTime()) { - $endTime = clone $startTime; - $endTime->modify('+1 day'); - } else { - // The event had no duration (0 seconds) - break; - } - - $times[] = array($startTime, $endTime); - - } - - foreach($times as $time) { - - if ($this->end && $time[0] > $this->end) break; - if ($this->start && $time[1] < $this->start) break; - - $busyTimes[] = array( - $time[0], - $time[1], - $FBTYPE, - ); - } - break; - - case 'VFREEBUSY' : - foreach($component->FREEBUSY as $freebusy) { - - $fbType = isset($freebusy['FBTYPE'])?strtoupper($freebusy['FBTYPE']):'BUSY'; - - // Skipping intervals marked as 'free' - if ($fbType==='FREE') - continue; - - $values = explode(',', $freebusy); - foreach($values as $value) { - list($startTime, $endTime) = explode('/', $value); - $startTime = DateTimeParser::parseDateTime($startTime); - - if (substr($endTime,0,1)==='P' || substr($endTime,0,2)==='-P') { - $duration = DateTimeParser::parseDuration($endTime); - $endTime = clone $startTime; - $endTime->add($duration); - } else { - $endTime = DateTimeParser::parseDateTime($endTime); - } - - if($this->start && $this->start > $endTime) continue; - if($this->end && $this->end < $startTime) continue; - $busyTimes[] = array( - $startTime, - $endTime, - $fbType - ); - - } - - - } - break; - - - - } - - - } - - } - - if ($this->baseObject) { - $calendar = $this->baseObject; - } else { - $calendar = new VCalendar(); - } - - $vfreebusy = $calendar->createComponent('VFREEBUSY'); - $calendar->add($vfreebusy); - - if ($this->start) { - $dtstart = $calendar->createProperty('DTSTART'); - $dtstart->setDateTime($this->start); - $vfreebusy->add($dtstart); - } - if ($this->end) { - $dtend = $calendar->createProperty('DTEND'); - $dtend->setDateTime($this->end); - $vfreebusy->add($dtend); - } - $dtstamp = $calendar->createProperty('DTSTAMP'); - $dtstamp->setDateTime(new \DateTime('now', new \DateTimeZone('UTC'))); - $vfreebusy->add($dtstamp); - - foreach($busyTimes as $busyTime) { - - $busyTime[0]->setTimeZone(new \DateTimeZone('UTC')); - $busyTime[1]->setTimeZone(new \DateTimeZone('UTC')); - - $prop = $calendar->createProperty( - 'FREEBUSY', - $busyTime[0]->format('Ymd\\THis\\Z') . '/' . $busyTime[1]->format('Ymd\\THis\\Z') - ); - $prop['FBTYPE'] = $busyTime[2]; - $vfreebusy->add($prop); - - } - - return $calendar; - - } - -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Node.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Node.php deleted file mode 100755 index 3330fcef..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Node.php +++ /dev/null @@ -1,201 +0,0 @@ -iterator)) - return $this->iterator; - - return new ElementList(array($this)); - - } - - /** - * Sets the overridden iterator - * - * Note that this is not actually part of the iterator interface - * - * @param ElementList $iterator - * @return void - */ - public function setIterator(ElementList $iterator) { - - $this->iterator = $iterator; - - } - - /** - * Validates the node for correctness. - * - * The following options are supported: - * - Node::REPAIR - If something is broken, and automatic repair may - * be attempted. - * - * An array is returned with warnings. - * - * Every item in the array has the following properties: - * * level - (number between 1 and 3 with severity information) - * * message - (human readable message) - * * node - (reference to the offending node) - * - * @param int $options - * @return array - */ - public function validate($options = 0) { - - return array(); - - } - - /* }}} */ - - /* {{{ Countable interface */ - - /** - * Returns the number of elements - * - * @return int - */ - public function count() { - - $it = $this->getIterator(); - return $it->count(); - - } - - /* }}} */ - - /* {{{ ArrayAccess Interface */ - - - /** - * Checks if an item exists through ArrayAccess. - * - * This method just forwards the request to the inner iterator - * - * @param int $offset - * @return bool - */ - public function offsetExists($offset) { - - $iterator = $this->getIterator(); - return $iterator->offsetExists($offset); - - } - - /** - * Gets an item through ArrayAccess. - * - * This method just forwards the request to the inner iterator - * - * @param int $offset - * @return mixed - */ - public function offsetGet($offset) { - - $iterator = $this->getIterator(); - return $iterator->offsetGet($offset); - - } - - /** - * Sets an item through ArrayAccess. - * - * This method just forwards the request to the inner iterator - * - * @param int $offset - * @param mixed $value - * @return void - */ - public function offsetSet($offset,$value) { - - $iterator = $this->getIterator(); - $iterator->offsetSet($offset,$value); - - // @codeCoverageIgnoreStart - // - // This method always throws an exception, so we ignore the closing - // brace - } - // @codeCoverageIgnoreEnd - - /** - * Sets an item through ArrayAccess. - * - * This method just forwards the request to the inner iterator - * - * @param int $offset - * @return void - */ - public function offsetUnset($offset) { - - $iterator = $this->getIterator(); - $iterator->offsetUnset($offset); - - // @codeCoverageIgnoreStart - // - // This method always throws an exception, so we ignore the closing - // brace - } - // @codeCoverageIgnoreEnd - - /* }}} */ -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parameter.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parameter.php deleted file mode 100755 index 6e153175..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parameter.php +++ /dev/null @@ -1,343 +0,0 @@ -name = strtoupper($name); - $this->root = $root; - if (is_null($name)) { - $this->noName = true; - $this->name = static::guessParameterNameByValue($value); - } - $this->setValue($value); - } - - /** - * Try to guess property name by value, can be used for vCard 2.1 nameless parameters. - * - * Figuring out what the name should have been. Note that a ton of - * these are rather silly in 2013 and would probably rarely be - * used, but we like to be complete. - * - * @param string $value - * @return string - */ - public static function guessParameterNameByValue($value) { - switch(strtoupper($value)) { - - // Encodings - case '7-BIT' : - case 'QUOTED-PRINTABLE' : - case 'BASE64' : - $name = 'ENCODING'; - break; - - // Common types - case 'WORK' : - case 'HOME' : - case 'PREF' : - - // Delivery Label Type - case 'DOM' : - case 'INTL' : - case 'POSTAL' : - case 'PARCEL' : - - // Telephone types - case 'VOICE' : - case 'FAX' : - case 'MSG' : - case 'CELL' : - case 'PAGER' : - case 'BBS' : - case 'MODEM' : - case 'CAR' : - case 'ISDN' : - case 'VIDEO' : - - // EMAIL types (lol) - case 'AOL' : - case 'APPLELINK' : - case 'ATTMAIL' : - case 'CIS' : - case 'EWORLD' : - case 'INTERNET' : - case 'IBMMAIL' : - case 'MCIMAIL' : - case 'POWERSHARE' : - case 'PRODIGY' : - case 'TLX' : - case 'X400' : - - // Photo / Logo format types - case 'GIF' : - case 'CGM' : - case 'WMF' : - case 'BMP' : - case 'DIB' : - case 'PICT' : - case 'TIFF' : - case 'PDF ': - case 'PS' : - case 'JPEG' : - case 'MPEG' : - case 'MPEG2' : - case 'AVI' : - case 'QTIME' : - - // Sound Digital Audio Type - case 'WAVE' : - case 'PCM' : - case 'AIFF' : - - // Key types - case 'X509' : - case 'PGP' : - $name = 'TYPE'; - break; - - // Value types - case 'INLINE' : - case 'URL' : - case 'CONTENT-ID' : - case 'CID' : - $name = 'VALUE'; - break; - - default: - $name = ''; - } - - return $name; - } - - /** - * Updates the current value. - * - * This may be either a single, or multiple strings in an array. - * - * @param string|array $value - * @return void - */ - public function setValue($value) { - - $this->value = $value; - - } - - /** - * Returns the current value - * - * This method will always return a string, or null. If there were multiple - * values, it will automatically concatinate them (separated by comma). - * - * @return string|null - */ - public function getValue() { - - if (is_array($this->value)) { - return implode(',' , $this->value); - } else { - return $this->value; - } - - } - - /** - * Sets multiple values for this parameter. - * - * @param array $value - * @return void - */ - public function setParts(array $value) { - - $this->value = $value; - - } - - /** - * Returns all values for this parameter. - * - * If there were no values, an empty array will be returned. - * - * @return array - */ - public function getParts() { - - if (is_array($this->value)) { - return $this->value; - } elseif (is_null($this->value)) { - return array(); - } else { - return array($this->value); - } - - } - - /** - * Adds a value to this parameter - * - * If the argument is specified as an array, all items will be added to the - * parameter value list. - * - * @param string|array $part - * @return void - */ - public function addValue($part) { - - if (is_null($this->value)) { - $this->value = $part; - } else { - $this->value = array_merge((array)$this->value, (array)$part); - } - - } - - /** - * Checks if this parameter contains the specified value. - * - * This is a case-insensitive match. It makes sense to call this for for - * instance the TYPE parameter, to see if it contains a keyword such as - * 'WORK' or 'FAX'. - * - * @param string $value - * @return bool - */ - public function has($value) { - - return in_array( - strtolower($value), - array_map('strtolower', (array)$this->value) - ); - - } - - /** - * Turns the object back into a serialized blob. - * - * @return string - */ - public function serialize() { - - $value = $this->getParts(); - - if (count($value)===0) { - return $this->name; - } - - if ($this->root->getDocumentType() === Document::VCARD21 && $this->noName) { - - return implode(';', $value); - - } - - return $this->name . '=' . array_reduce($value, function($out, $item) { - - if (!is_null($out)) $out.=','; - - // If there's no special characters in the string, we'll use the simple - // format - if (!preg_match('#(?: [\n":;\^,] )#x', $item)) { - return $out.$item; - } else { - // Enclosing in double-quotes, and using RFC6868 for encoding any - // special characters - $out.='"' . strtr($item, array( - '^' => '^^', - "\n" => '^n', - '"' => '^\'', - )) . '"'; - return $out; - } - - }); - - } - - /** - * This method returns an array, with the representation as it should be - * encoded in json. This is used to create jCard or jCal documents. - * - * @return array - */ - public function jsonSerialize() { - - return $this->value; - - } - - /** - * Called when this object is being cast to a string - * - * @return string - */ - public function __toString() { - - return $this->getValue(); - - } - - /** - * Returns the iterator for this object - * - * @return ElementList - */ - public function getIterator() { - - if (!is_null($this->iterator)) - return $this->iterator; - - return $this->iterator = new ArrayObject((array)$this->value); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/ParseException.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/ParseException.php deleted file mode 100755 index 5e3658c5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/ParseException.php +++ /dev/null @@ -1,12 +0,0 @@ -setInput($input); - } - if (is_null($this->input)) { - throw new EofException('End of input stream, or no input supplied'); - } - - if (!is_null($options)) { - $this->options = $options; - } - - switch($this->input[0]) { - case 'vcalendar' : - $this->root = new VCalendar(array(), false); - break; - case 'vcard' : - $this->root = new VCard(array(), false); - break; - default : - throw new ParseException('The root component must either be a vcalendar, or a vcard'); - - } - foreach($this->input[1] as $prop) { - $this->root->add($this->parseProperty($prop)); - } - if (isset($this->input[2])) foreach($this->input[2] as $comp) { - $this->root->add($this->parseComponent($comp)); - } - - // Resetting the input so we can throw an feof exception the next time. - $this->input = null; - - return $this->root; - - } - - /** - * Parses a component - * - * @param array $jComp - * @return \SabreForRainLoop\VObject\Component - */ - public function parseComponent(array $jComp) { - - // We can remove $self from PHP 5.4 onward. - $self = $this; - - $properties = array_map(function($jProp) use ($self) { - return $self->parseProperty($jProp); - }, $jComp[1]); - - if (isset($jComp[2])) { - - $components = array_map(function($jComp) use ($self) { - return $self->parseComponent($jComp); - }, $jComp[2]); - - } else $components = array(); - - return $this->root->createComponent( - $jComp[0], - array_merge( $properties, $components), - $defaults = false - ); - - } - - /** - * Parses properties. - * - * @param array $jProp - * @return \SabreForRainLoop\VObject\Property - */ - public function parseProperty(array $jProp) { - - list( - $propertyName, - $parameters, - $valueType - ) = $jProp; - - $propertyName = strtoupper($propertyName); - - // This is the default class we would be using if we didn't know the - // value type. We're using this value later in this function. - $defaultPropertyClass = $this->root->getClassNameForPropertyName($propertyName); - - $parameters = (array)$parameters; - - $value = array_slice($jProp, 3); - - $valueType = strtoupper($valueType); - - if (isset($parameters['group'])) { - $propertyName = $parameters['group'] . '.' . $propertyName; - unset($parameters['group']); - } - - $prop = $this->root->createProperty($propertyName, null, $parameters, $valueType); - $prop->setJsonValue($value); - - // We have to do something awkward here. FlatText as well as Text - // represents TEXT values. We have to normalize these here. In the - // future we can get rid of FlatText once we're allowed to break BC - // again. - if ($defaultPropertyClass === 'SabreForRainLoop\VObject\Property\FlatText') { - $defaultPropertyClass = 'SabreForRainLoop\VObject\Property\Text'; - } - - // If the value type we received (e.g.: TEXT) was not the default value - // type for the given property (e.g.: BDAY), we need to add a VALUE= - // parameter. - if ($defaultPropertyClass !== get_class($prop)) { - $prop["VALUE"] = $valueType; - } - - return $prop; - - } - - /** - * Sets the input data - * - * @param resource|string|array $input - * @return void - */ - public function setInput($input) { - - if (is_resource($input)) { - $input = stream_get_contents($input); - } - if (is_string($input)) { - $input = json_decode($input); - } - $this->input = $input; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parser/MimeDir.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parser/MimeDir.php deleted file mode 100755 index e95741fd..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parser/MimeDir.php +++ /dev/null @@ -1,602 +0,0 @@ -root = null; - if (!is_null($input)) { - - $this->setInput($input); - - } - - if (!is_null($options)) $this->options = $options; - - $this->parseDocument(); - - return $this->root; - - } - - /** - * Sets the input buffer. Must be a string or stream. - * - * @param resource|string $input - * @return void - */ - public function setInput($input) { - - // Resetting the parser - $this->lineIndex = 0; - $this->startLine = 0; - - if (is_string($input)) { - // Convering to a stream. - $stream = fopen('php://temp', 'r+'); - fwrite($stream, $input); - rewind($stream); - $this->input = $stream; - } else { - $this->input = $input; - } - - } - - /** - * Parses an entire document. - * - * @return void - */ - protected function parseDocument() { - - $line = $this->readLine(); - switch(strtoupper($line)) { - case 'BEGIN:VCALENDAR' : - $class = isset(VCalendar::$componentMap['VCALENDAR']) - ? VCalendar::$componentMap[$name] - : 'SabreForRainLoop\\VObject\\Component\\VCalendar'; - break; - case 'BEGIN:VCARD' : - $class = isset(VCard::$componentMap['VCARD']) - ? VCard::$componentMap['VCARD'] - : 'SabreForRainLoop\\VObject\\Component\\VCard'; - break; - default : - throw new ParseException('This parser only supports VCARD and VCALENDAR files'); - } - - $this->root = new $class(array(), false); - - while(true) { - - // Reading until we hit END: - $line = $this->readLine(); - if (strtoupper(substr($line,0,4)) === 'END:') { - break; - } - $result = $this->parseLine($line); - if ($result) { - $this->root->add($result); - } - - } - - $name = strtoupper(substr($line, 4)); - if ($name!==$this->root->name) { - throw new ParseException('Invalid MimeDir file. expected: "END:' . $this->root->name . '" got: "END:' . $name . '"'); - } - - } - - /** - * Parses a line, and if it hits a component, it will also attempt to parse - * the entire component - * - * @param string $line Unfolded line - * @return Node - */ - protected function parseLine($line) { - - // Start of a new component - if (strtoupper(substr($line, 0, 6)) === 'BEGIN:') { - - $component = $this->root->createComponent(substr($line,6), array(), false); - - while(true) { - - // Reading until we hit END: - $line = $this->readLine(); - if (strtoupper(substr($line,0,4)) === 'END:') { - break; - } - $result = $this->parseLine($line); - if ($result) { - $component->add($result); - } - - } - - $name = strtoupper(substr($line, 4)); - if ($name!==$component->name) { - throw new ParseException('Invalid MimeDir file. expected: "END:' . $component->name . '" got: "END:' . $name . '"'); - } - - return $component; - - } else { - - // Property reader - $property = $this->readProperty($line); - if (!$property) { - // Ignored line - return false; - } - return $property; - - } - - } - - /** - * We need to look ahead 1 line every time to see if we need to 'unfold' - * the next line. - * - * If that was not the case, we store it here. - * - * @var null|string - */ - protected $lineBuffer; - - /** - * The real current line number. - */ - protected $lineIndex = 0; - - /** - * In the case of unfolded lines, this property holds the line number for - * the start of the line. - * - * @var int - */ - protected $startLine = 0; - - /** - * Contains a 'raw' representation of the current line. - * - * @var string - */ - protected $rawLine; - - /** - * Reads a single line from the buffer. - * - * This method strips any newlines and also takes care of unfolding. - * - * @throws \SabreForRainLoop\VObject\EofException - * @return string - */ - protected function readLine() { - - if (!is_null($this->lineBuffer)) { - $rawLine = $this->lineBuffer; - $this->lineBuffer = null; - } else { - do { - $rawLine = fgets($this->input); - if ($rawLine === false && feof($this->input)) { - throw new EofException('End of document reached prematurely'); - } - $rawLine = rtrim($rawLine, "\r\n"); - } while ($rawLine === ''); // Skipping empty lines - $this->lineIndex++; - } - $line = $rawLine; - - $this->startLine = $this->lineIndex; - - // Looking ahead for folded lines. - while (true) { - - $nextLine = rtrim(fgets($this->input), "\r\n"); - $this->lineIndex++; - if (!$nextLine) { - break; - } - if ($nextLine[0] === "\t" || $nextLine[0] === " ") { - $line .= substr($nextLine, 1); - $rawLine .= "\n " . substr($nextLine, 1); - } else { - $this->lineBuffer = $nextLine; - break; - } - - } - $this->rawLine = $rawLine; - return $line; - - } - - /** - * Reads a property or component from a line. - * - * @return void - */ - protected function readProperty($line) { - - if ($this->options & self::OPTION_FORGIVING) { - $propNameToken = 'A-Z0-9\-\._\\/'; - } else { - $propNameToken = 'A-Z0-9\-\.'; - } - - $paramNameToken = 'A-Z0-9\-'; - $safeChar = '^";:,'; - $qSafeChar = '^"'; - - $regex = "/ - ^(?P [$propNameToken]+ ) (?=[;:]) # property name - | - (?<=:)(?P .*)$ # property value - | - ;(?P [$paramNameToken]+) (?=[=;:]) # parameter name - | - (=|,)(?P # parameter value - (?: [$safeChar]*) | - \"(?: [$qSafeChar]+)\" - ) (?=[;:,]) - /xi"; - - //echo $regex, "\n"; die(); - preg_match_all($regex, $line, $matches, PREG_SET_ORDER ); - - $property = array( - 'name' => null, - 'parameters' => array(), - 'value' => null - ); - - $lastParam = null; - - /** - * Looping through all the tokens. - * - * Note that we are looping through them in reverse order, because if a - * sub-pattern matched, the subsequent named patterns will not show up - * in the result. - */ - foreach($matches as $match) { - - if (isset($match['paramValue'])) { - if ($match['paramValue'] && $match['paramValue'][0] === '"') { - $value = substr($match['paramValue'], 1, -1); - } else { - $value = $match['paramValue']; - } - - $value = $this->unescapeParam($value); - - if (is_null($property['parameters'][$lastParam])) { - $property['parameters'][$lastParam] = $value; - } elseif (is_array($property['parameters'][$lastParam])) { - $property['parameters'][$lastParam][] = $value; - } else { - $property['parameters'][$lastParam] = array( - $property['parameters'][$lastParam], - $value - ); - } - continue; - } - if (isset($match['paramName'])) { - $lastParam = strtoupper($match['paramName']); - if (!isset($property['parameters'][$lastParam])) { - $property['parameters'][$lastParam] = null; - } - continue; - } - if (isset($match['propValue'])) { - $property['value'] = $match['propValue']; - continue; - } - if (isset($match['name']) && $match['name']) { - $property['name'] = strtoupper($match['name']); - continue; - } - - // @codeCoverageIgnoreStart - throw new \LogicException('This code should not be reachable'); - // @codeCoverageIgnoreEnd - - } - - if (is_null($property['value']) || !$property['name']) { - if ($this->options & self::OPTION_IGNORE_INVALID_LINES) { - return false; - } - throw new ParseException('Invalid Mimedir file. Line starting at ' . $this->startLine . ' did not follow iCalendar/vCard conventions'); - } - - // vCard 2.1 states that parameters may appear without a name, and only - // a value. We can deduce the value based on it's name. - // - // Our parser will get those as parameters without a value instead, so - // we're filtering these parameters out first. - $namedParameters = array(); - $namelessParameters = array(); - - foreach($property['parameters'] as $name=>$value) { - if (!is_null($value)) { - $namedParameters[$name] = $value; - } else { - $namelessParameters[] = $name; - } - } - - $propObj = $this->root->createProperty($property['name'], null, $namedParameters); - - foreach($namelessParameters as $namelessParameter) { - $propObj->add(null, $namelessParameter); - } - - if (strtoupper($propObj['ENCODING']) === 'QUOTED-PRINTABLE') { - $propObj->setQuotedPrintableValue($this->extractQuotedPrintableValue()); - } else { - $propObj->setRawMimeDirValue($property['value']); - } - - return $propObj; - - } - - /** - * Unescapes a property value. - * - * vCard 2.1 says: - * * Semi-colons must be escaped in some property values, specifically - * ADR, ORG and N. - * * Semi-colons must be escaped in parameter values, because semi-colons - * are also use to separate values. - * * No mention of escaping backslashes with another backslash. - * * newlines are not escaped either, instead QUOTED-PRINTABLE is used to - * span values over more than 1 line. - * - * vCard 3.0 says: - * * (rfc2425) Backslashes, newlines (\n or \N) and comma's must be - * escaped, all time time. - * * Comma's are used for delimeters in multiple values - * * (rfc2426) Adds to to this that the semi-colon MUST also be escaped, - * as in some properties semi-colon is used for separators. - * * Properties using semi-colons: N, ADR, GEO, ORG - * * Both ADR and N's individual parts may be broken up further with a - * comma. - * * Properties using commas: NICKNAME, CATEGORIES - * - * vCard 4.0 (rfc6350) says: - * * Commas must be escaped. - * * Semi-colons may be escaped, an unescaped semi-colon _may_ be a - * delimiter, depending on the property. - * * Backslashes must be escaped - * * Newlines must be escaped as either \N or \n. - * * Some compound properties may contain multiple parts themselves, so a - * comma within a semi-colon delimited property may also be unescaped - * to denote multiple parts _within_ the compound property. - * * Text-properties using semi-colons: N, ADR, ORG, CLIENTPIDMAP. - * * Text-properties using commas: NICKNAME, RELATED, CATEGORIES, PID. - * - * Even though the spec says that commas must always be escaped, the - * example for GEO in Section 6.5.2 seems to violate this. - * - * iCalendar 2.0 (rfc5545) says: - * * Commas or semi-colons may be used as delimiters, depending on the - * property. - * * Commas, semi-colons, backslashes, newline (\N or \n) are always - * escaped, unless they are delimiters. - * * Colons shall not be escaped. - * * Commas can be considered the 'default delimiter' and is described as - * the delimiter in cases where the order of the multiple values is - * insignificant. - * * Semi-colons are described as the delimiter for 'structured values'. - * They are specifically used in Semi-colons are used as a delimiter in - * REQUEST-STATUS, RRULE, GEO and EXRULE. EXRULE is deprecated however. - * - * Now for the parameters - * - * If delimiter is not set (null) this method will just return a string. - * If it's a comma or a semi-colon the string will be split on those - * characters, and always return an array. - * - * @param string $input - * @param string $delimiter - * @return string|string[] - */ - static public function unescapeValue($input, $delimiter = ';') { - - $regex = '# (?: (\\\\ (?: \\\\ | N | n | ; | , ) )'; - if ($delimiter) { - $regex .= ' | (' . $delimiter . ')'; - } - $regex .= ') #x'; - - $matches = preg_split($regex, $input, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); - - $resultArray = array(); - $result = ''; - - foreach($matches as $match) { - - switch ($match) { - case '\\\\' : - $result .='\\'; - break; - case '\N' : - case '\n' : - $result .="\n"; - break; - case '\;' : - $result .=';'; - break; - case '\,' : - $result .=','; - break; - case $delimiter : - $resultArray[] = $result; - $result = ''; - break; - default : - $result .= $match; - break; - - } - - } - - $resultArray[] = $result; - return $delimiter ? $resultArray : $result; - - } - - /** - * Unescapes a parameter value. - * - * vCard 2.1: - * * Does not mention a mechanism for this. In addition, double quotes - * are never used to wrap values. - * * This means that parameters can simply not contain colons or - * semi-colons. - * - * vCard 3.0 (rfc2425, rfc2426): - * * Parameters _may_ be surrounded by double quotes. - * * If this is not the case, semi-colon, colon and comma may simply not - * occur (the comma used for multiple parameter values though). - * * If it is surrounded by double-quotes, it may simply not contain - * double-quotes. - * * This means that a parameter can in no case encode double-quotes, or - * newlines. - * - * vCard 4.0 (rfc6350) - * * Behavior seems to be identical to vCard 3.0 - * - * iCalendar 2.0 (rfc5545) - * * Behavior seems to be identical to vCard 3.0 - * - * Parameter escaping mechanism (rfc6868) : - * * This rfc describes a new way to escape parameter values. - * * New-line is encoded as ^n - * * ^ is encoded as ^^. - * * " is encoded as ^' - * - * @param string $input - * @return void - */ - private function unescapeParam($input) { - - return - preg_replace_callback('#(\^(\^|n|\'))#',function($matches) { - switch($matches[2]) { - case 'n' : - return "\n"; - case '^' : - return '^'; - case '\'' : - return '"'; - - // @codeCoverageIgnoreStart - } - // @codeCoverageIgnoreEnd - }, $input); - - } - - /** - * Gets the full quoted printable value. - * - * We need a special method for this, because newlines have both a meaning - * in vCards, and in QuotedPrintable. - * - * This method does not do any decoding. - * - * @return string - */ - private function extractQuotedPrintableValue() { - - // We need to parse the raw line again to get the start of the value. - // - // We are basically looking for the first colon (:), but we need to - // skip over the parameters first, as they may contain one. - $regex = '/^ - (?: [^:])+ # Anything but a colon - (?: "[^"]")* # A parameter in double quotes - : # start of the value we really care about - (.*)$ - /xs'; - - preg_match($regex, $this->rawLine, $matches); - - $value = $matches[1]; - // Removing the first whitespace character from every line. Kind of - // like unfolding, but we keep the newline. - $value = str_replace("\n ", "\n", $value); - - // Microsoft products don't always correctly fold lines, they may be - // missing a whitespace. So if 'forgiving' is turned on, we will take - // those as well. - if ($this->options & self::OPTION_FORGIVING) { - while(substr($value,-1) === '=') { - // Reading the line - $this->readLine(); - // Grabbing the raw form - $value.="\n" . $this->rawLine; - } - } - - return $value; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parser/Parser.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parser/Parser.php deleted file mode 100755 index 22c90a1f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Parser/Parser.php +++ /dev/null @@ -1,77 +0,0 @@ -setInput($input); - } - $this->options = $options; - } - - /** - * This method starts the parsing process. - * - * If the input was not supplied during construction, it's possible to pass - * it here instead. - * - * If either input or options are not supplied, the defaults will be used. - * - * @param mixed $input - * @param int|null $options - * @return array - */ - abstract public function parse($input = null, $options = null); - - /** - * Sets the input data - * - * @param mixed $input - * @return void - */ - abstract public function setInput($input); - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property.php deleted file mode 100755 index 0dde8d0d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property.php +++ /dev/null @@ -1,502 +0,0 @@ -value syntax. - * - * @param Component $root The root document - * @param string $name - * @param string|array|null $value - * @param array $parameters List of parameters - * @param string $group The vcard property group - * @return void - */ - public function __construct(Component $root, $name, $value = null, array $parameters = array(), $group = null) { - - $this->name = $name; - $this->group = $group; - - $this->root = $root; - - if (!is_null($value)) { - $this->setValue($value); - } - - foreach($parameters as $k=>$v) { - $this->add($k, $v); - } - - } - - /** - * Updates the current value. - * - * This may be either a single, or multiple strings in an array. - * - * @param string|array $value - * @return void - */ - public function setValue($value) { - - $this->value = $value; - - } - - /** - * Returns the current value. - * - * This method will always return a singular value. If this was a - * multi-value object, some decision will be made first on how to represent - * it as a string. - * - * To get the correct multi-value version, use getParts. - * - * @return string - */ - public function getValue() { - - if (is_array($this->value)) { - if (count($this->value)==0) { - return null; - } elseif (count($this->value)===1) { - return $this->value[0]; - } else { - return $this->getRawMimeDirValue($this->value); - } - } else { - return $this->value; - } - - } - - /** - * Sets a multi-valued property. - * - * @param array $parts - * @return void - */ - public function setParts(array $parts) { - - $this->value = $parts; - - } - - /** - * Returns a multi-valued property. - * - * This method always returns an array, if there was only a single value, - * it will still be wrapped in an array. - * - * @return array - */ - public function getParts() { - - if (is_null($this->value)) { - return array(); - } elseif (is_array($this->value)) { - return $this->value; - } else { - return array($this->value); - } - - } - - /** - * Adds a new parameter, and returns the new item. - * - * If a parameter with same name already existed, the values will be - * combined. - * If nameless parameter is added, we try to guess it's name. - * - * @param string $name - * @param string|null|array $value - * @return Node - */ - public function add($name, $value = null) { - $noName = false; - if ($name === null) { - $name = Parameter::guessParameterNameByValue($value); - $noName = true; - } - - if (isset($this->parameters[strtoupper($name)])) { - $this->parameters[strtoupper($name)]->addValue($value); - } - else { - $param = new Parameter($this->root, $name, $value); - $param->noName = $noName; - $this->parameters[$param->name] = $param; - } - } - - /** - * Returns an iterable list of children - * - * @return array - */ - public function parameters() { - - return $this->parameters; - - } - - /** - * Returns the type of value. - * - * This corresponds to the VALUE= parameter. Every property also has a - * 'default' valueType. - * - * @return string - */ - abstract public function getValueType(); - - /** - * Sets a raw value coming from a mimedir (iCalendar/vCard) file. - * - * This has been 'unfolded', so only 1 line will be passed. Unescaping is - * not yet done, but parameters are not included. - * - * @param string $val - * @return void - */ - abstract public function setRawMimeDirValue($val); - - /** - * Returns a raw mime-dir representation of the value. - * - * @return string - */ - abstract public function getRawMimeDirValue(); - - /** - * Turns the object back into a serialized blob. - * - * @return string - */ - public function serialize() { - - $str = $this->name; - if ($this->group) $str = $this->group . '.' . $this->name; - - foreach($this->parameters as $param) { - - $str.=';' . $param->serialize(); - - } - - $str.=':' . $this->getRawMimeDirValue(); - - $out = ''; - while(strlen($str)>0) { - if (strlen($str)>75) { - $out.= mb_strcut($str,0,75,'utf-8') . "\r\n"; - $str = ' ' . mb_strcut($str,75,strlen($str),'utf-8'); - } else { - $out.=$str . "\r\n"; - $str=''; - break; - } - } - - return $out; - - } - - /** - * Returns the value, in the format it should be encoded for json. - * - * This method must always return an array. - * - * @return array - */ - public function getJsonValue() { - - return $this->getParts(); - - } - - /** - * Sets the json value, as it would appear in a jCard or jCal object. - * - * The value must always be an array. - * - * @param array $value - * @return void - */ - public function setJsonValue(array $value) { - - if (count($value)===1) { - $this->setValue(reset($value)); - } else { - $this->setValue($value); - } - - } - - /** - * This method returns an array, with the representation as it should be - * encoded in json. This is used to create jCard or jCal documents. - * - * @return array - */ - public function jsonSerialize() { - - $parameters = array(); - - foreach($this->parameters as $parameter) { - if ($parameter->name === 'VALUE') { - continue; - } - $parameters[strtolower($parameter->name)] = $parameter->jsonSerialize(); - } - // In jCard, we need to encode the property-group as a separate 'group' - // parameter. - if ($this->group) { - $parameters['group'] = $this->group; - } - - return array_merge( - array( - strtolower($this->name), - (object)$parameters, - strtolower($this->getValueType()), - ), - $this->getJsonValue() - ); - } - - - /** - * Called when this object is being cast to a string. - * - * If the property only had a single value, you will get just that. In the - * case the property had multiple values, the contents will be escaped and - * combined with ,. - * - * @return string - */ - public function __toString() { - - return (string)$this->getValue(); - - } - - /* ArrayAccess interface {{{ */ - - /** - * Checks if an array element exists - * - * @param mixed $name - * @return bool - */ - public function offsetExists($name) { - - if (is_int($name)) return parent::offsetExists($name); - - $name = strtoupper($name); - - foreach($this->parameters as $parameter) { - if ($parameter->name == $name) return true; - } - return false; - - } - - /** - * Returns a parameter. - * - * If the parameter does not exist, null is returned. - * - * @param string $name - * @return Node - */ - public function offsetGet($name) { - - if (is_int($name)) return parent::offsetGet($name); - $name = strtoupper($name); - - if (!isset($this->parameters[$name])) { - return null; - } - - return $this->parameters[$name]; - - } - - /** - * Creates a new parameter - * - * @param string $name - * @param mixed $value - * @return void - */ - public function offsetSet($name, $value) { - - if (is_int($name)) { - parent::offsetSet($name, $value); - // @codeCoverageIgnoreStart - // This will never be reached, because an exception is always - // thrown. - return; - // @codeCoverageIgnoreEnd - } - - $param = new Parameter($this->root, $name, $value); - $this->parameters[$param->name] = $param; - - } - - /** - * Removes one or more parameters with the specified name - * - * @param string $name - * @return void - */ - public function offsetUnset($name) { - - if (is_int($name)) { - parent::offsetUnset($name); - // @codeCoverageIgnoreStart - // This will never be reached, because an exception is always - // thrown. - return; - // @codeCoverageIgnoreEnd - } - - unset($this->parameters[strtoupper($name)]); - - } - /* }}} */ - - /** - * This method is automatically called when the object is cloned. - * Specifically, this will ensure all child elements are also cloned. - * - * @return void - */ - public function __clone() { - - foreach($this->parameters as $key=>$child) { - $this->parameters[$key] = clone $child; - $this->parameters[$key]->parent = $this; - } - - } - - /** - * Validates the node for correctness. - * - * The following options are supported: - * - Node::REPAIR - If something is broken, and automatic repair may - * be attempted. - * - * An array is returned with warnings. - * - * Every item in the array has the following properties: - * * level - (number between 1 and 3 with severity information) - * * message - (human readable message) - * * node - (reference to the offending node) - * - * @param int $options - * @return array - */ - public function validate($options = 0) { - - $warnings = array(); - - // Checking if our value is UTF-8 - if (!StringUtil::isUTF8($this->getRawMimeDirValue())) { - $warnings[] = array( - 'level' => 1, - 'message' => 'Property is not valid UTF-8!', - 'node' => $this, - ); - if ($options & self::REPAIR) { - $this->setRawMimeDirValue(StringUtil::convertToUTF8($this->getRawMimeDirValue())); - } - } - - // Checking if the propertyname does not contain any invalid bytes. - if (!preg_match('/^([A-Z0-9-]+)$/', $this->name)) { - $warnings[] = array( - 'level' => 1, - 'message' => 'The propertyname: ' . $this->name . ' contains invalid characters. Only A-Z, 0-9 and - are allowed', - 'node' => $this, - ); - if ($options & self::REPAIR) { - // Uppercasing and converting underscores to dashes. - $this->name = strtoupper( - str_replace('_', '-', $this->name) - ); - // Removing every other invalid character - $this->name = preg_replace('/([^A-Z0-9-])/u', '', $this->name); - - } - - } - - // Validating inner parameters - foreach($this->parameters as $param) { - $warnings = array_merge($warnings, $param->validate($options)); - } - - return $warnings; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Binary.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Binary.php deleted file mode 100755 index 2e857c3d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Binary.php +++ /dev/null @@ -1,127 +0,0 @@ -value = $value[0]; - } else { - throw new \InvalidArgumentException('The argument must either be a string or an array with only one child'); - } - - } else { - - $this->value = $value; - - } - - } - - /** - * Sets a raw value coming from a mimedir (iCalendar/vCard) file. - * - * This has been 'unfolded', so only 1 line will be passed. Unescaping is - * not yet done, but parameters are not included. - * - * @param string $val - * @return void - */ - public function setRawMimeDirValue($val) { - - $this->value = base64_decode($val); - - } - - /** - * Returns a raw mime-dir representation of the value. - * - * @return string - */ - public function getRawMimeDirValue() { - - return base64_encode($this->value); - - } - - /** - * Returns the type of value. - * - * This corresponds to the VALUE= parameter. Every property also has a - * 'default' valueType. - * - * @return string - */ - public function getValueType() { - - return 'BINARY'; - - } - - /** - * Returns the value, in the format it should be encoded for json. - * - * This method must always return an array. - * - * @return array - */ - public function getJsonValue() { - - return array(base64_encode($this->getValue())); - - } - - /** - * Sets the json value, as it would appear in a jCard or jCal object. - * - * The value must always be an array. - * - * @param array $value - * @return void - */ - public function setJsonValue(array $value) { - - $value = array_map('base64_decode', $value); - parent::setJsonValue($value); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Boolean.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Boolean.php deleted file mode 100755 index 75ea0d69..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Boolean.php +++ /dev/null @@ -1,63 +0,0 @@ -setValue($val); - - } - - /** - * Returns a raw mime-dir representation of the value. - * - * @return string - */ - public function getRawMimeDirValue() { - - return $this->value?'TRUE':'FALSE'; - - } - - /** - * Returns the type of value. - * - * This corresponds to the VALUE= parameter. Every property also has a - * 'default' valueType. - * - * @return string - */ - public function getValueType() { - - return 'BOOLEAN'; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/FlatText.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/FlatText.php deleted file mode 100755 index 57f30cda..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/FlatText.php +++ /dev/null @@ -1,49 +0,0 @@ -setValue($val); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Float.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Float.php deleted file mode 100755 index 02476f8d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Float.php +++ /dev/null @@ -1,101 +0,0 @@ -delimiter, $val); - foreach($val as &$item) { - $item = (float)$item; - } - $this->setParts($val); - - } - - /** - * Returns a raw mime-dir representation of the value. - * - * @return string - */ - public function getRawMimeDirValue() { - - return implode( - $this->delimiter, - $this->getParts() - ); - - } - - /** - * Returns the type of value. - * - * This corresponds to the VALUE= parameter. Every property also has a - * 'default' valueType. - * - * @return string - */ - public function getValueType() { - - return "FLOAT"; - - } - - /** - * Returns the value, in the format it should be encoded for json. - * - * This method must always return an array. - * - * @return array - */ - public function getJsonValue() { - - $val = array_map(function($item) { - - return (float)$item; - - }, $this->getParts()); - - // Special-casing the GEO property. - // - // See: - // http://tools.ietf.org/html/draft-ietf-jcardcal-jcal-04#section-3.4.1.2 - if ($this->name==='GEO') { - return array($val); - } else { - return $val; - } - - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/CalAddress.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/CalAddress.php deleted file mode 100755 index e76a302a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/CalAddress.php +++ /dev/null @@ -1,41 +0,0 @@ -setDateTimes($parts); - } else { - parent::setParts($parts); - } - - } - - /** - * Updates the current value. - * - * This may be either a single, or multiple strings in an array. - * - * Instead of strings, you may also use DateTime here. - * - * @param string|array|\DateTime $value - * @return void - */ - public function setValue($value) { - - if (is_array($value) && isset($value[0]) && $value[0] instanceof \DateTime) { - $this->setDateTimes($value); - } elseif ($value instanceof \DateTime) { - $this->setDateTimes(array($value)); - } else { - parent::setValue($value); - } - - } - - /** - * Sets a raw value coming from a mimedir (iCalendar/vCard) file. - * - * This has been 'unfolded', so only 1 line will be passed. Unescaping is - * not yet done, but parameters are not included. - * - * @param string $val - * @return void - */ - public function setRawMimeDirValue($val) { - - $this->setValue(explode($this->delimiter, $val)); - - } - - /** - * Returns a raw mime-dir representation of the value. - * - * @return string - */ - public function getRawMimeDirValue() { - - return implode($this->delimiter, $this->getParts()); - - } - - /** - * Returns true if this is a DATE-TIME value, false if it's a DATE. - * - * @return bool - */ - public function hasTime() { - - return strtoupper((string)$this['VALUE']) !== 'DATE'; - - } - - /** - * Returns a date-time value. - * - * Note that if this property contained more than 1 date-time, only the - * first will be returned. To get an array with multiple values, call - * getDateTimes. - * - * @return \DateTime - */ - public function getDateTime() { - - $dt = $this->getDateTimes(); - if (!$dt) return null; - - return $dt[0]; - - } - - /** - * Returns multiple date-time values. - * - * @return \DateTime[] - */ - public function getDateTimes() { - - // Finding the timezone. - $tz = $this['TZID']; - - if ($tz) { - $tz = TimeZoneUtil::getTimeZone((string)$tz, $this->root); - } - - $dts = array(); - foreach($this->getParts() as $part) { - $dts[] = DateTimeParser::parse($part, $tz); - } - return $dts; - - } - - /** - * Sets the property as a DateTime object. - * - * @param \DateTime $dt - * @param bool isFloating If set to true, timezones will be ignored. - * @return void - */ - public function setDateTime(\DateTime $dt, $isFloating = false) { - - $this->setDateTimes(array($dt), $isFloating); - - } - - /** - * Sets the property as multiple date-time objects. - * - * The first value will be used as a reference for the timezones, and all - * the otehr values will be adjusted for that timezone - * - * @param \DateTime[] $dt - * @param bool isFloating If set to true, timezones will be ignored. - * @return void - */ - public function setDateTimes(array $dt, $isFloating = false) { - - $values = array(); - - if($this->hasTime()) { - - $tz = null; - $isUtc = false; - - foreach($dt as $d) { - - if ($isFloating) { - $values[] = $d->format('Ymd\\THis'); - continue; - } - if (is_null($tz)) { - $tz = $d->getTimeZone(); - $isUtc = in_array($tz->getName() , array('UTC', 'GMT', 'Z')); - if (!$isUtc) { - $this->offsetSet('TZID', $tz->getName()); - } - } else { - $d->setTimeZone($tz); - } - - if ($isUtc) { - $values[] = $d->format('Ymd\\THis\\Z'); - } else { - $values[] = $d->format('Ymd\\THis'); - } - - } - if ($isUtc || $isFloating) { - $this->offsetUnset('TZID'); - } - - } else { - - foreach($dt as $d) { - - $values[] = $d->format('Ymd'); - - } - $this->offsetUnset('TZID'); - - } - - $this->value = $values; - - } - - /** - * Returns the type of value. - * - * This corresponds to the VALUE= parameter. Every property also has a - * 'default' valueType. - * - * @return string - */ - public function getValueType() { - - return $this->hasTime()?'DATE-TIME':'DATE'; - - } - - /** - * Returns the value, in the format it should be encoded for json. - * - * This method must always return an array. - * - * @return array - */ - public function getJsonValue() { - - $dts = $this->getDateTimes(); - $hasTime = $this->hasTime(); - - $tz = $dts[0]->getTimeZone(); - $isUtc = in_array($tz->getName() , array('UTC', 'GMT', 'Z')); - - return array_map(function($dt) use ($hasTime, $isUtc) { - - if ($hasTime) { - return $dt->format('Y-m-d\\TH:i:s') . ($isUtc?'Z':''); - } else { - return $dt->format('Y-m-d'); - } - - }, $dts); - - } - - /** - * Sets the json value, as it would appear in a jCard or jCal object. - * - * The value must always be an array. - * - * @param array $value - * @return void - */ - public function setJsonValue(array $value) { - - // dates and times in jCal have one difference to dates and times in - // iCalendar. In jCal date-parts are separated by dashes, and - // time-parts are separated by colons. It makes sense to just remove - // those. - $this->setValue(array_map(function($item) { - - return strtr($item, array(':'=>'', '-'=>'')); - - }, $value)); - - } - /** - * We need to intercept offsetSet, because it may be used to alter the - * VALUE from DATE-TIME to DATE or vice-versa. - * - * @param string $name - * @param mixed $value - * @return void - */ - public function offsetSet($name, $value) { - - parent::offsetSet($name, $value); - if (strtoupper($name)!=='VALUE') { - return; - } - - // This will ensure that dates are correctly encoded. - $this->setDateTimes($this->getDateTimes()); - - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Duration.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Duration.php deleted file mode 100755 index 0f251102..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Duration.php +++ /dev/null @@ -1,86 +0,0 @@ -setValue(explode($this->delimiter, $val)); - - } - - /** - * Returns a raw mime-dir representation of the value. - * - * @return string - */ - public function getRawMimeDirValue() { - - return implode($this->delimiter, $this->getParts()); - - } - - /** - * Returns the type of value. - * - * This corresponds to the VALUE= parameter. Every property also has a - * 'default' valueType. - * - * @return string - */ - public function getValueType() { - - return 'DURATION'; - - } - - /** - * Returns a DateInterval representation of the Duration property. - * - * If the property has more than one value, only the first is returned. - * - * @return \DateInterval - */ - public function getDateInterval() { - - $parts = $this->getParts(); - $value = $parts[0]; - return DateTimeParser::parseDuration($value); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Period.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Period.php deleted file mode 100755 index 67c818c7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Period.php +++ /dev/null @@ -1,126 +0,0 @@ -setValue(explode($this->delimiter, $val)); - - } - - /** - * Returns a raw mime-dir representation of the value. - * - * @return string - */ - public function getRawMimeDirValue() { - - return implode($this->delimiter, $this->getParts()); - - } - - /** - * Returns the type of value. - * - * This corresponds to the VALUE= parameter. Every property also has a - * 'default' valueType. - * - * @return string - */ - public function getValueType() { - - return "PERIOD"; - - } - - /** - * Sets the json value, as it would appear in a jCard or jCal object. - * - * The value must always be an array. - * - * @param array $value - * @return void - */ - public function setJsonValue(array $value) { - - $value = array_map(function($item) { - - return strtr(implode('/', $item), array(':' => '', '-' => '')); - - }, $value); - parent::setJsonValue($value); - - } - - /** - * Returns the value, in the format it should be encoded for json. - * - * This method must always return an array. - * - * @return array - */ - public function getJsonValue() { - - $return = array(); - foreach($this->getParts() as $item) { - - list($start, $end) = explode('/', $item, 2); - - $start = DateTimeParser::parseDateTime($start); - - // This is a duration value. - if ($end[0]==='P') { - $return[] = array( - $start->format('Y-m-d\\TH:i:s'), - $end - ); - } else { - $end = DateTimeParser::parseDateTime($end); - $return[] = array( - $start->format('Y-m-d\\TH:i:s'), - $end->format('Y-m-d\\TH:i:s'), - ); - } - - } - - return $return; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Recur.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Recur.php deleted file mode 100755 index 98e3f19d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/Recur.php +++ /dev/null @@ -1,189 +0,0 @@ -value array that is accessible using - * getParts, and may be set using setParts. - * - * @copyright Copyright (C) 2007-2013 fruux GmbH. All rights reserved. - * @author Evert Pot (http://evertpot.com/) - * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License - */ -class Recur extends Property { - - /** - * Updates the current value. - * - * This may be either a single, or multiple strings in an array. - * - * @param string|array $value - * @return void - */ - public function setValue($value) { - - // If we're getting the data from json, we'll be receiving an object - if ($value instanceof \StdClass) { - $value = (array)$value; - } - - if (is_array($value)) { - $newVal = array(); - foreach($value as $k=>$v) { - - if (is_string($v)) { - $v = strtoupper($v); - - // The value had multiple sub-values - if (strpos($v,',')!==false) { - $v = explode(',', $v); - } - } else { - $v = array_map('strtoupper', $v); - } - - $newVal[strtoupper($k)] = $v; - } - $this->value = $newVal; - } elseif (is_string($value)) { - $value = strtoupper($value); - $newValue = array(); - foreach(explode(';', $value) as $part) { - - // Skipping empty parts. - if (empty($part)) { - continue; - } - list($partName, $partValue) = explode('=', $part); - - // The value itself had multiple values.. - if (strpos($partValue,',')!==false) { - $partValue=explode(',', $partValue); - } - $newValue[$partName] = $partValue; - - } - $this->value = $newValue; - } else { - throw new \InvalidArgumentException('You must either pass a string, or a key=>value array'); - } - - } - - /** - * Returns the current value. - * - * This method will always return a singular value. If this was a - * multi-value object, some decision will be made first on how to represent - * it as a string. - * - * To get the correct multi-value version, use getParts. - * - * @return string - */ - public function getValue() { - - $out = array(); - foreach($this->value as $key=>$value) { - $out[] = $key . '=' . (is_array($value)?implode(',', $value):$value); - } - return strtoupper(implode(';',$out)); - - } - - /** - * Sets a multi-valued property. - * - * @param array $parts - * @return void - */ - public function setParts(array $parts) { - - $this->setValue($parts); - - } - - /** - * Returns a multi-valued property. - * - * This method always returns an array, if there was only a single value, - * it will still be wrapped in an array. - * - * @return array - */ - public function getParts() { - - return $this->value; - - } - - /** - * Sets a raw value coming from a mimedir (iCalendar/vCard) file. - * - * This has been 'unfolded', so only 1 line will be passed. Unescaping is - * not yet done, but parameters are not included. - * - * @param string $val - * @return void - */ - public function setRawMimeDirValue($val) { - - $this->setValue($val); - - } - - /** - * Returns a raw mime-dir representation of the value. - * - * @return string - */ - public function getRawMimeDirValue() { - - return $this->getValue(); - - } - - /** - * Returns the type of value. - * - * This corresponds to the VALUE= parameter. Every property also has a - * 'default' valueType. - * - * @return string - */ - public function getValueType() { - - return "RECUR"; - - } - - /** - * Returns the value, in the format it should be encoded for json. - * - * This method must always return an array. - * - * @return array - */ - public function getJsonValue() { - - $values = array(); - foreach($this->getParts() as $k=>$v) { - $values[strtolower($k)] = $v; - } - return array($values); - - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Integer.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Integer.php deleted file mode 100755 index a48c8740..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Integer.php +++ /dev/null @@ -1,72 +0,0 @@ -setValue((int)$val); - - } - - /** - * Returns a raw mime-dir representation of the value. - * - * @return string - */ - public function getRawMimeDirValue() { - - return $this->value; - - } - - /** - * Returns the type of value. - * - * This corresponds to the VALUE= parameter. Every property also has a - * 'default' valueType. - * - * @return string - */ - public function getValueType() { - - return "INTEGER"; - - } - - /** - * Returns the value, in the format it should be encoded for json. - * - * This method must always return an array. - * - * @return array - */ - public function getJsonValue() { - - return array((int)$this->getValue()); - - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Text.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Text.php deleted file mode 100755 index b1651e3a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Text.php +++ /dev/null @@ -1,330 +0,0 @@ - 5, - 'ADR' => 7, - ); - - /** - * Creates the property. - * - * You can specify the parameters either in key=>value syntax, in which case - * parameters will automatically be created, or you can just pass a list of - * Parameter objects. - * - * @param Component $root The root document - * @param string $name - * @param string|array|null $value - * @param array $parameters List of parameters - * @param string $group The vcard property group - * @return void - */ - public function __construct(Component $root, $name, $value = null, array $parameters = array(), $group = null) { - - // There's two types of multi-valued text properties: - // 1. multivalue properties. - // 2. structured value properties - // - // The former is always separated by a comma, the latter by semi-colon. - if (in_array($name, $this->structuredValues)) { - $this->delimiter = ';'; - } - - parent::__construct($root, $name, $value, $parameters, $group); - - } - - - /** - * Sets a raw value coming from a mimedir (iCalendar/vCard) file. - * - * This has been 'unfolded', so only 1 line will be passed. Unescaping is - * not yet done, but parameters are not included. - * - * @param string $val - * @return void - */ - public function setRawMimeDirValue($val) { - - $this->setValue(MimeDir::unescapeValue($val, $this->delimiter)); - - } - - /** - * Sets the value as a quoted-printable encoded string. - * - * @param string $val - * @return void - */ - public function setQuotedPrintableValue($val) { - - $val = quoted_printable_decode($val); - - // Quoted printable only appears in vCard 2.1, and the only character - // that may be escaped there is ;. So we are simply splitting on just - // that. - // - // We also don't have to unescape \\, so all we need to look for is a ; - // that's not preceeded with a \. - $regex = '# (?setValue($matches); - - } - - /** - * Returns a raw mime-dir representation of the value. - * - * @return string - */ - public function getRawMimeDirValue() { - - $val = $this->getParts(); - - if (isset($this->minimumPropertyValues[$this->name])) { - $val = array_pad($val, $this->minimumPropertyValues[$this->name], ''); - } - - foreach($val as &$item) { - - if (!is_array($item)) { - $item = array($item); - } - - foreach($item as &$subItem) { - $subItem = strtr($subItem, array( - '\\' => '\\\\', - ';' => '\;', - ',' => '\,', - "\n" => '\n', - "\r" => "", - )); - } - $item = implode(',', $item); - - } - - return implode($this->delimiter, $val); - - } - - /** - * Returns the value, in the format it should be encoded for json. - * - * This method must always return an array. - * - * @return array - */ - public function getJsonValue() { - - // Structured text values should always be returned as a single - // array-item. Multi-value text should be returned as multiple items in - // the top-array. - if (in_array($this->name, $this->structuredValues)) { - return array($this->getParts()); - } else { - return $this->getParts(); - } - - } - - /** - * Returns the type of value. - * - * This corresponds to the VALUE= parameter. Every property also has a - * 'default' valueType. - * - * @return string - */ - public function getValueType() { - - return "TEXT"; - - } - - /** - * Turns the object back into a serialized blob. - * - * @return string - */ - public function serialize() { - - // We need to kick in a special type of encoding, if it's a 2.1 vcard. - if ($this->root->getDocumentType() !== Document::VCARD21) { - return parent::serialize(); - } - - $val = $this->getParts(); - - if (isset($this->minimumPropertyValues[$this->name])) { - $val = array_pad($val, $this->minimumPropertyValues[$this->name], ''); - } - - // Imploding multiple parts into a single value, and splitting the - // values with ;. - if (count($val)>1) { - foreach($val as $k=>$v) { - $val[$k] = str_replace(';','\;', $v); - } - $val = implode(';', $val); - } else { - $val = $val[0]; - } - - $str = $this->name; - if ($this->group) $str = $this->group . '.' . $this->name; - foreach($this->parameters as $param) { - - if ($param->getValue() === 'QUOTED-PRINTABLE') { - continue; - } - $str.=';' . $param->serialize(); - - } - - - - // If the resulting value contains a \n, we must encode it as - // quoted-printable. - if (strpos($val,"\n") !== false) { - - $str.=';ENCODING=QUOTED-PRINTABLE:'; - $lastLine=$str; - $out = null; - - // The PHP built-in quoted-printable-encode does not correctly - // encode newlines for us. Specifically, the \r\n sequence must in - // vcards be encoded as =0D=OA and we must insert soft-newlines - // every 75 bytes. - for($ii=0;$ii= 32 && $ord <=126) { - $lastLine.=$val[$ii]; - } else { - $lastLine.='=' . strtoupper(bin2hex($val[$ii])); - } - if (strlen($lastLine)>=75) { - // Soft line break - $out.=$lastLine. "=\r\n "; - $lastLine = null; - } - - } - if (!is_null($lastLine)) $out.= $lastLine . "\r\n"; - return $out; - - } else { - $str.=':' . $val; - $out = ''; - while(strlen($str)>0) { - if (strlen($str)>75) { - $out.= mb_strcut($str,0,75,'utf-8') . "\r\n"; - $str = ' ' . mb_strcut($str,75,strlen($str),'utf-8'); - } else { - $out.=$str . "\r\n"; - $str=''; - break; - } - } - - return $out; - - - } - - } - - /** - * Validates the node for correctness. - * - * The following options are supported: - * - Node::REPAIR - If something is broken, and automatic repair may - * be attempted. - * - * An array is returned with warnings. - * - * Every item in the array has the following properties: - * * level - (number between 1 and 3 with severity information) - * * message - (human readable message) - * * node - (reference to the offending node) - * - * @param int $options - * @return array - */ - public function validate($options = 0) { - - $warnings = parent::validate($options); - - if (isset($this->minimumPropertyValues[$this->name])) { - - $minimum = $this->minimumPropertyValues[$this->name]; - $parts = $this->getParts(); - if (count($parts) < $minimum) { - $warnings[] = array( - 'level' => 1, - 'message' => 'This property must have at least ' . $minimum . ' components. It only has ' . count($parts), - 'node' => $this, - ); - if ($options & self::REPAIR) { - $parts = array_pad($parts, $minimum, ''); - $this->setParts($parts); - } - } - - } - return $warnings; - - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Time.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Time.php deleted file mode 100755 index 394e37f6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Time.php +++ /dev/null @@ -1,94 +0,0 @@ -getValue()); - - $timeStr = ''; - - // Hour - if (!is_null($parts['hour'])) { - $timeStr.=$parts['hour']; - - if (!is_null($parts['minute'])) { - $timeStr.=':'; - } - } else { - // We know either minute or second _must_ be set, so we insert a - // dash for an empty value. - $timeStr.='-'; - } - - // Minute - if (!is_null($parts['minute'])) { - $timeStr.=$parts['minute']; - - if (!is_null($parts['second'])) { - $timeStr.=':'; - } - } else { - if (isset($parts['second'])) { - // Dash for empty minute - $timeStr.='-'; - } - } - - // Second - if (!is_null($parts['second'])) { - $timeStr.=$parts['second']; - } - - // Timezone - if (!is_null($parts['timezone'])) { - $timeStr.=$parts['timezone']; - } - - return array($timeStr); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Unknown.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Unknown.php deleted file mode 100755 index c2a49515..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Unknown.php +++ /dev/null @@ -1,50 +0,0 @@ -getRawMimeDirValue()); - - } - - /** - * Returns the type of value. - * - * This corresponds to the VALUE= parameter. Every property also has a - * 'default' valueType. - * - * @return string - */ - public function getValueType() { - - return "UNKNOWN"; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Uri.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Uri.php deleted file mode 100755 index b6107808..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/Uri.php +++ /dev/null @@ -1,70 +0,0 @@ -value = $val; - - } - - /** - * Returns a raw mime-dir representation of the value. - * - * @return string - */ - public function getRawMimeDirValue() { - - if (is_array($this->value)) { - return $this->value[0]; - } else { - return $this->value; - } - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/UtcOffset.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/UtcOffset.php deleted file mode 100755 index f2d0d170..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/UtcOffset.php +++ /dev/null @@ -1,37 +0,0 @@ -getValue()); - - $dateStr = ''; - - // Year - if (!is_null($parts['year'])) { - $dateStr.=$parts['year']; - - if (!is_null($parts['month'])) { - // If a year and a month is set, we need to insert a separator - // dash. - $dateStr.='-'; - } - - } else { - - if (!is_null($parts['month']) || !is_null($parts['date'])) { - // Inserting two dashes - $dateStr.='--'; - } - - } - - // Month - - if (!is_null($parts['month'])) { - $dateStr.=$parts['month']; - - if (isset($parts['date'])) { - // If month and date are set, we need the separator dash. - $dateStr.='-'; - } - } else { - if (isset($parts['date'])) { - // If the month is empty, and a date is set, we need a 'empty - // dash' - $dateStr.='-'; - } - } - - // Date - if (!is_null($parts['date'])) { - $dateStr.=$parts['date']; - } - - - // Early exit if we don't have a time string. - if (is_null($parts['hour']) && is_null($parts['minute']) && is_null($parts['second'])) { - return array($dateStr); - } - - $dateStr.='T'; - - // Hour - if (!is_null($parts['hour'])) { - $dateStr.=$parts['hour']; - - if (!is_null($parts['minute'])) { - $dateStr.=':'; - } - } else { - // We know either minute or second _must_ be set, so we insert a - // dash for an empty value. - $dateStr.='-'; - } - - // Minute - if (!is_null($parts['minute'])) { - $dateStr.=$parts['minute']; - - if (!is_null($parts['second'])) { - $dateStr.=':'; - } - } else { - if (isset($parts['second'])) { - // Dash for empty minute - $dateStr.='-'; - } - } - - // Second - if (!is_null($parts['second'])) { - $dateStr.=$parts['second']; - } - - // Timezone - if (!is_null($parts['timezone'])) { - $dateStr.=$parts['timezone']; - } - - return array($dateStr); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/DateTime.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/DateTime.php deleted file mode 100755 index ae8ffd3f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/DateTime.php +++ /dev/null @@ -1,33 +0,0 @@ -setValue($val); - - } - - /** - * Returns a raw mime-dir representation of the value. - * - * @return string - */ - public function getRawMimeDirValue() { - - return $this->value; - - } - - /** - * Returns the type of value. - * - * This corresponds to the VALUE= parameter. Every property also has a - * 'default' valueType. - * - * @return string - */ - public function getValueType() { - - return "LANGUAGE-TAG"; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/TimeStamp.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/TimeStamp.php deleted file mode 100755 index 00522dc3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Property/VCard/TimeStamp.php +++ /dev/null @@ -1,69 +0,0 @@ -getValue()); - - $dateStr = - $parts['year'] . '-' . - $parts['month'] . '-' . - $parts['date'] . 'T' . - $parts['hour'] . ':' . - $parts['minute'] . ':' . - $parts['second']; - - // Timezone - if (!is_null($parts['timezone'])) { - $dateStr.=$parts['timezone']; - } - - return array($dateStr); - - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Reader.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Reader.php deleted file mode 100755 index 89432f1f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Reader.php +++ /dev/null @@ -1,73 +0,0 @@ -parse($data, $options); - - return $result; - - } - - /** - * Parses a jCard or jCal object, and returns the top component. - * - * The options argument is a bitfield. Pass any of the OPTIONS constant to - * alter the parsers' behaviour. - * - * You can either a string, a readable stream, or an array for it's input. - * Specifying the array is useful if json_decode was already called on the - * input. - * - * @param string|resource|array $data - * @param int $options - * @return Node - */ - static function readJson($data, $options = 0) { - - $parser = new Parser\Json(); - $result = $parser->parse($data, $options); - - return $result; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/RecurrenceIterator.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/RecurrenceIterator.php deleted file mode 100755 index 5d6d8e2b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/RecurrenceIterator.php +++ /dev/null @@ -1,1153 +0,0 @@ - 0, - 'MO' => 1, - 'TU' => 2, - 'WE' => 3, - 'TH' => 4, - 'FR' => 5, - 'SA' => 6, - ); - - /** - * Mappings between the day number and english day name. - * - * @var array - */ - private $dayNames = array( - 0 => 'Sunday', - 1 => 'Monday', - 2 => 'Tuesday', - 3 => 'Wednesday', - 4 => 'Thursday', - 5 => 'Friday', - 6 => 'Saturday', - ); - - /** - * If the current iteration of the event is an overriden event, this - * property will hold the VObject - * - * @var Component - */ - private $currentOverriddenEvent; - - /** - * This property may contain the date of the next not-overridden event. - * This date is calculated sometimes a bit early, before overridden events - * are evaluated. - * - * @var DateTime - */ - private $nextDate; - - /** - * This counts the number of overridden events we've handled so far - * - * @var int - */ - private $handledOverridden = 0; - - /** - * Creates the iterator - * - * You should pass a VCALENDAR component, as well as the UID of the event - * we're going to traverse. - * - * @param Component $vcal - * @param string|null $uid - */ - public function __construct(Component $vcal, $uid=null) { - - if (is_null($uid)) { - if ($vcal instanceof Component\VCalendar) { - throw new \InvalidArgumentException('If you pass a VCALENDAR object, you must pass a uid argument as well'); - } - $components = array($vcal); - $uid = (string)$vcal->uid; - } else { - $components = $vcal->select('VEVENT'); - } - foreach($components as $component) { - if ((string)$component->uid == $uid) { - if (isset($component->{'RECURRENCE-ID'})) { - $this->overriddenEvents[$component->DTSTART->getDateTime()->getTimeStamp()] = $component; - $this->overriddenDates[] = $component->{'RECURRENCE-ID'}->getDateTime(); - } else { - $this->baseEvent = $component; - } - } - } - - ksort($this->overriddenEvents); - - if (!$this->baseEvent) { - // No base event was found. CalDAV does allow cases where only - // overridden instances are stored. - // - // In this barticular case, we're just going to grab the first - // event and use that instead. This may not always give the - // desired result. - if (!count($this->overriddenEvents)) { - throw new \InvalidArgumentException('Could not find an event with uid: ' . $uid); - } - ksort($this->overriddenEvents, SORT_NUMERIC); - $this->baseEvent = array_shift($this->overriddenEvents); - } - - $this->startDate = clone $this->baseEvent->DTSTART->getDateTime(); - - $this->endDate = null; - if (isset($this->baseEvent->DTEND)) { - $this->endDate = clone $this->baseEvent->DTEND->getDateTime(); - } else { - $this->endDate = clone $this->startDate; - if (isset($this->baseEvent->DURATION)) { - $this->endDate->add(DateTimeParser::parse((string)$this->baseEvent->DURATION)); - } elseif (!$this->baseEvent->DTSTART->hasTime()) { - $this->endDate->modify('+1 day'); - } - } - $this->currentDate = clone $this->startDate; - - $rrule = $this->baseEvent->RRULE; - - // If no rrule was specified, we create a default setting - if (!$rrule) { - $this->frequency = 'daily'; - $this->count = 1; - } else foreach($rrule->getParts() as $key=>$value) { - - switch($key) { - - case 'FREQ' : - if (!in_array( - strtolower($value), - array('secondly','minutely','hourly','daily','weekly','monthly','yearly') - )) { - throw new \InvalidArgumentException('Unknown value for FREQ=' . strtoupper($value)); - - } - $this->frequency = strtolower($value); - break; - - case 'UNTIL' : - $this->until = DateTimeParser::parse($value); - - // In some cases events are generated with an UNTIL= - // parameter before the actual start of the event. - // - // Not sure why this is happening. We assume that the - // intention was that the event only recurs once. - // - // So we are modifying the parameter so our code doesn't - // break. - if($this->until < $this->baseEvent->DTSTART->getDateTime()) { - $this->until = $this->baseEvent->DTSTART->getDateTime(); - } - break; - - case 'COUNT' : - $this->count = (int)$value; - break; - - case 'INTERVAL' : - $this->interval = (int)$value; - if ($this->interval < 1) { - throw new \InvalidArgumentException('INTERVAL in RRULE must be a positive integer!'); - } - break; - - case 'BYSECOND' : - $this->bySecond = (array)$value; - break; - - case 'BYMINUTE' : - $this->byMinute = (array)$value; - break; - - case 'BYHOUR' : - $this->byHour = (array)$value; - break; - - case 'BYDAY' : - $this->byDay = (array)$value; - break; - - case 'BYMONTHDAY' : - $this->byMonthDay = (array)$value; - break; - - case 'BYYEARDAY' : - $this->byYearDay = (array)$value; - break; - - case 'BYWEEKNO' : - $this->byWeekNo = (array)$value; - break; - - case 'BYMONTH' : - $this->byMonth = (array)$value; - break; - - case 'BYSETPOS' : - $this->bySetPos = (array)$value; - break; - - case 'WKST' : - $this->weekStart = strtoupper($value); - break; - - } - - } - - // Parsing exception dates - if (isset($this->baseEvent->EXDATE)) { - foreach($this->baseEvent->EXDATE as $exDate) { - - foreach(explode(',', (string)$exDate) as $exceptionDate) { - - $this->exceptionDates[] = - DateTimeParser::parse($exceptionDate, $this->startDate->getTimeZone()); - - } - - } - - } - - } - - /** - * Returns the current item in the list - * - * @return DateTime - */ - public function current() { - - if (!$this->valid()) return null; - return clone $this->currentDate; - - } - - /** - * This method returns the startdate for the current iteration of the - * event. - * - * @return DateTime - */ - public function getDtStart() { - - if (!$this->valid()) return null; - return clone $this->currentDate; - - } - - /** - * This method returns the enddate for the current iteration of the - * event. - * - * @return DateTime - */ - public function getDtEnd() { - - if (!$this->valid()) return null; - $dtEnd = clone $this->currentDate; - $dtEnd->add( $this->startDate->diff( $this->endDate ) ); - return clone $dtEnd; - - } - - /** - * Returns a VEVENT object with the updated start and end date. - * - * Any recurrence information is removed, and this function may return an - * 'overridden' event instead. - * - * This method always returns a cloned instance. - * - * @return Component\VEvent - */ - public function getEventObject() { - - if ($this->currentOverriddenEvent) { - return clone $this->currentOverriddenEvent; - } - $event = clone $this->baseEvent; - unset($event->RRULE); - unset($event->EXDATE); - unset($event->RDATE); - unset($event->EXRULE); - - $event->DTSTART->setDateTime($this->getDTStart()); - if (isset($event->DTEND)) { - $event->DTEND->setDateTime($this->getDtEnd()); - } - if ($this->counter > 0) { - $event->{'RECURRENCE-ID'} = (string)$event->DTSTART; - } - - return $event; - - } - - /** - * Returns the current item number - * - * @return int - */ - public function key() { - - return $this->counter; - - } - - /** - * Whether or not there is a 'next item' - * - * @return bool - */ - public function valid() { - - if (!is_null($this->count)) { - return $this->counter < $this->count; - } - if (!is_null($this->until) && $this->currentDate > $this->until) { - - // Need to make sure there's no overridden events past the - // until date. - foreach($this->overriddenEvents as $overriddenEvent) { - - if ($overriddenEvent->DTSTART->getDateTime() >= $this->currentDate) { - - return true; - } - } - return false; - } - return true; - - } - - /** - * Resets the iterator - * - * @return void - */ - public function rewind() { - - $this->currentDate = clone $this->startDate; - $this->counter = 0; - - } - - /** - * This method allows you to quickly go to the next occurrence after the - * specified date. - * - * Note that this checks the current 'endDate', not the 'stardDate'. This - * means that if you forward to January 1st, the iterator will stop at the - * first event that ends *after* January 1st. - * - * @param DateTime $dt - * @return void - */ - public function fastForward(\DateTime $dt) { - - while($this->valid() && $this->getDTEnd() <= $dt) { - $this->next(); - } - - } - - /** - * Returns true if this recurring event never ends. - * - * @return bool - */ - public function isInfinite() { - - return !$this->count && !$this->until; - - } - - /** - * Goes on to the next iteration - * - * @return void - */ - public function next() { - - $previousStamp = $this->currentDate->getTimeStamp(); - - // Finding the next overridden event in line, and storing that for - // later use. - $overriddenEvent = null; - $overriddenDate = null; - $this->currentOverriddenEvent = null; - - foreach($this->overriddenEvents as $index=>$event) { - if ($index > $previousStamp) { - $overriddenEvent = $event; - $overriddenDate = clone $event->DTSTART->getDateTime(); - break; - } - } - - // If we have a stored 'next date', we will use that. - if ($this->nextDate) { - if (!$overriddenDate || $this->nextDate < $overriddenDate) { - $this->currentDate = $this->nextDate; - $currentStamp = $this->currentDate->getTimeStamp(); - $this->nextDate = null; - } else { - $this->currentDate = clone $overriddenDate; - $this->currentOverriddenEvent = $overriddenEvent; - } - $this->counter++; - return; - } - - while(true) { - - // Otherwise, we find the next event in the normal RRULE - // sequence. - switch($this->frequency) { - - case 'hourly' : - $this->nextHourly(); - break; - - case 'daily' : - $this->nextDaily(); - break; - - case 'weekly' : - $this->nextWeekly(); - break; - - case 'monthly' : - $this->nextMonthly(); - break; - - case 'yearly' : - $this->nextYearly(); - break; - - } - $currentStamp = $this->currentDate->getTimeStamp(); - - - // Checking exception dates - foreach($this->exceptionDates as $exceptionDate) { - if ($this->currentDate == $exceptionDate) { - $this->counter++; - continue 2; - } - } - foreach($this->overriddenDates as $check) { - if ($this->currentDate == $check) { - continue 2; - } - } - break; - - } - - - - // Is the date we have actually higher than the next overiddenEvent? - if ($overriddenDate && $this->currentDate > $overriddenDate) { - $this->nextDate = clone $this->currentDate; - $this->currentDate = clone $overriddenDate; - $this->currentOverriddenEvent = $overriddenEvent; - $this->handledOverridden++; - } - $this->counter++; - - - /* - * If we have overridden events left in the queue, but our counter is - * running out, we should grab one of those. - */ - if (!is_null($overriddenEvent) && !is_null($this->count) && count($this->overriddenEvents) - $this->handledOverridden >= ($this->count - $this->counter)) { - - $this->currentOverriddenEvent = $overriddenEvent; - $this->currentDate = clone $overriddenDate; - $this->handledOverridden++; - - } - - } - - /** - * Does the processing for advancing the iterator for hourly frequency. - * - * @return void - */ - protected function nextHourly() { - - if (!$this->byHour) { - $this->currentDate->modify('+' . $this->interval . ' hours'); - return; - } - // @codeCoverageIgnoreStart - } - // @codeCoverageIgnoreEnd - - /** - * Does the processing for advancing the iterator for daily frequency. - * - * @return void - */ - protected function nextDaily() { - - if (!$this->byHour && !$this->byDay) { - $this->currentDate->modify('+' . $this->interval . ' days'); - return; - } - - if (isset($this->byHour)) { - $recurrenceHours = $this->getHours(); - } - - if (isset($this->byDay)) { - $recurrenceDays = $this->getDays(); - } - - do { - - if ($this->byHour) { - if ($this->currentDate->format('G') == '23') { - // to obey the interval rule - $this->currentDate->modify('+' . $this->interval-1 . ' days'); - } - - $this->currentDate->modify('+1 hours'); - - } else { - $this->currentDate->modify('+' . $this->interval . ' days'); - - } - - // Current day of the week - $currentDay = $this->currentDate->format('w'); - - // Current hour of the day - $currentHour = $this->currentDate->format('G'); - - } while (($this->byDay && !in_array($currentDay, $recurrenceDays)) || ($this->byHour && !in_array($currentHour, $recurrenceHours))); - - } - - /** - * Does the processing for advancing the iterator for weekly frequency. - * - * @return void - */ - protected function nextWeekly() { - - if (!$this->byHour && !$this->byDay) { - $this->currentDate->modify('+' . $this->interval . ' weeks'); - return; - } - - if ($this->byHour) { - $recurrenceHours = $this->getHours(); - } - - if ($this->byDay) { - $recurrenceDays = $this->getDays(); - } - - // First day of the week: - $firstDay = $this->dayMap[$this->weekStart]; - - do { - - if ($this->byHour) { - $this->currentDate->modify('+1 hours'); - } else { - $this->currentDate->modify('+1 days'); - } - - // Current day of the week - $currentDay = (int) $this->currentDate->format('w'); - - // Current hour of the day - $currentHour = (int) $this->currentDate->format('G'); - - // We need to roll over to the next week - if ($currentDay === $firstDay && (!$this->byHour || $currentHour == '0')) { - $this->currentDate->modify('+' . $this->interval-1 . ' weeks'); - - // We need to go to the first day of this week, but only if we - // are not already on this first day of this week. - if($this->currentDate->format('w') != $firstDay) { - $this->currentDate->modify('last ' . $this->dayNames[$this->dayMap[$this->weekStart]]); - } - } - - // We have a match - } while (($this->byDay && !in_array($currentDay, $recurrenceDays)) || ($this->byHour && !in_array($currentHour, $recurrenceHours))); - } - - /** - * Does the processing for advancing the iterator for monthly frequency. - * - * @return void - */ - protected function nextMonthly() { - - $currentDayOfMonth = $this->currentDate->format('j'); - if (!$this->byMonthDay && !$this->byDay) { - - // If the current day is higher than the 28th, rollover can - // occur to the next month. We Must skip these invalid - // entries. - if ($currentDayOfMonth < 29) { - $this->currentDate->modify('+' . $this->interval . ' months'); - } else { - $increase = 0; - do { - $increase++; - $tempDate = clone $this->currentDate; - $tempDate->modify('+ ' . ($this->interval*$increase) . ' months'); - } while ($tempDate->format('j') != $currentDayOfMonth); - $this->currentDate = $tempDate; - } - return; - } - - while(true) { - - $occurrences = $this->getMonthlyOccurrences(); - - foreach($occurrences as $occurrence) { - - // The first occurrence thats higher than the current - // day of the month wins. - if ($occurrence > $currentDayOfMonth) { - break 2; - } - - } - - // If we made it all the way here, it means there were no - // valid occurrences, and we need to advance to the next - // month. - $this->currentDate->modify('first day of this month'); - $this->currentDate->modify('+ ' . $this->interval . ' months'); - - // This goes to 0 because we need to start counting at hte - // beginning. - $currentDayOfMonth = 0; - - } - - $this->currentDate->setDate($this->currentDate->format('Y'), $this->currentDate->format('n'), $occurrence); - - } - - /** - * Does the processing for advancing the iterator for yearly frequency. - * - * @return void - */ - protected function nextYearly() { - - $currentMonth = $this->currentDate->format('n'); - $currentYear = $this->currentDate->format('Y'); - $currentDayOfMonth = $this->currentDate->format('j'); - - // No sub-rules, so we just advance by year - if (!$this->byMonth) { - - // Unless it was a leap day! - if ($currentMonth==2 && $currentDayOfMonth==29) { - - $counter = 0; - do { - $counter++; - // Here we increase the year count by the interval, until - // we hit a date that's also in a leap year. - // - // We could just find the next interval that's dividable by - // 4, but that would ignore the rule that there's no leap - // year every year that's dividable by a 100, but not by - // 400. (1800, 1900, 2100). So we just rely on the datetime - // functions instead. - $nextDate = clone $this->currentDate; - $nextDate->modify('+ ' . ($this->interval*$counter) . ' years'); - } while ($nextDate->format('n')!=2); - $this->currentDate = $nextDate; - - return; - - } - - // The easiest form - $this->currentDate->modify('+' . $this->interval . ' years'); - return; - - } - - $currentMonth = $this->currentDate->format('n'); - $currentYear = $this->currentDate->format('Y'); - $currentDayOfMonth = $this->currentDate->format('j'); - - $advancedToNewMonth = false; - - // If we got a byDay or getMonthDay filter, we must first expand - // further. - if ($this->byDay || $this->byMonthDay) { - - while(true) { - - $occurrences = $this->getMonthlyOccurrences(); - - foreach($occurrences as $occurrence) { - - // The first occurrence that's higher than the current - // day of the month wins. - // If we advanced to the next month or year, the first - // occurrence is always correct. - if ($occurrence > $currentDayOfMonth || $advancedToNewMonth) { - break 2; - } - - } - - // If we made it here, it means we need to advance to - // the next month or year. - $currentDayOfMonth = 1; - $advancedToNewMonth = true; - do { - - $currentMonth++; - if ($currentMonth>12) { - $currentYear+=$this->interval; - $currentMonth = 1; - } - } while (!in_array($currentMonth, $this->byMonth)); - - $this->currentDate->setDate($currentYear, $currentMonth, $currentDayOfMonth); - - } - - // If we made it here, it means we got a valid occurrence - $this->currentDate->setDate($currentYear, $currentMonth, $occurrence); - return; - - } else { - - // These are the 'byMonth' rules, if there are no byDay or - // byMonthDay sub-rules. - do { - - $currentMonth++; - if ($currentMonth>12) { - $currentYear+=$this->interval; - $currentMonth = 1; - } - } while (!in_array($currentMonth, $this->byMonth)); - $this->currentDate->setDate($currentYear, $currentMonth, $currentDayOfMonth); - - return; - - } - - } - - /** - * Returns all the occurrences for a monthly frequency with a 'byDay' or - * 'byMonthDay' expansion for the current month. - * - * The returned list is an array of integers with the day of month (1-31). - * - * @return array - */ - protected function getMonthlyOccurrences() { - - $startDate = clone $this->currentDate; - - $byDayResults = array(); - - // Our strategy is to simply go through the byDays, advance the date to - // that point and add it to the results. - if ($this->byDay) foreach($this->byDay as $day) { - - $dayName = $this->dayNames[$this->dayMap[substr($day,-2)]]; - - // Dayname will be something like 'wednesday'. Now we need to find - // all wednesdays in this month. - $dayHits = array(); - - $checkDate = clone $startDate; - $checkDate->modify('first day of this month'); - $checkDate->modify($dayName); - - do { - $dayHits[] = $checkDate->format('j'); - $checkDate->modify('next ' . $dayName); - } while ($checkDate->format('n') === $startDate->format('n')); - - // So now we have 'all wednesdays' for month. It is however - // possible that the user only really wanted the 1st, 2nd or last - // wednesday. - if (strlen($day)>2) { - $offset = (int)substr($day,0,-2); - - if ($offset>0) { - // It is possible that the day does not exist, such as a - // 5th or 6th wednesday of the month. - if (isset($dayHits[$offset-1])) { - $byDayResults[] = $dayHits[$offset-1]; - } - } else { - - // if it was negative we count from the end of the array - $byDayResults[] = $dayHits[count($dayHits) + $offset]; - } - } else { - // There was no counter (first, second, last wednesdays), so we - // just need to add the all to the list). - $byDayResults = array_merge($byDayResults, $dayHits); - - } - - } - - $byMonthDayResults = array(); - if ($this->byMonthDay) foreach($this->byMonthDay as $monthDay) { - - // Removing values that are out of range for this month - if ($monthDay > $startDate->format('t') || - $monthDay < 0-$startDate->format('t')) { - continue; - } - if ($monthDay>0) { - $byMonthDayResults[] = $monthDay; - } else { - // Negative values - $byMonthDayResults[] = $startDate->format('t') + 1 + $monthDay; - } - } - - // If there was just byDay or just byMonthDay, they just specify our - // (almost) final list. If both were provided, then byDay limits the - // list. - if ($this->byMonthDay && $this->byDay) { - $result = array_intersect($byMonthDayResults, $byDayResults); - } elseif ($this->byMonthDay) { - $result = $byMonthDayResults; - } else { - $result = $byDayResults; - } - $result = array_unique($result); - sort($result, SORT_NUMERIC); - - // The last thing that needs checking is the BYSETPOS. If it's set, it - // means only certain items in the set survive the filter. - if (!$this->bySetPos) { - return $result; - } - - $filteredResult = array(); - foreach($this->bySetPos as $setPos) { - - if ($setPos<0) { - $setPos = count($result)-($setPos+1); - } - if (isset($result[$setPos-1])) { - $filteredResult[] = $result[$setPos-1]; - } - } - - sort($filteredResult, SORT_NUMERIC); - return $filteredResult; - - } - - protected function getHours() - { - $recurrenceHours = array(); - foreach($this->byHour as $byHour) { - $recurrenceHours[] = $byHour; - } - - return $recurrenceHours; - } - - protected function getDays() - { - $recurrenceDays = array(); - foreach($this->byDay as $byDay) { - - // The day may be preceeded with a positive (+n) or - // negative (-n) integer. However, this does not make - // sense in 'weekly' so we ignore it here. - $recurrenceDays[] = $this->dayMap[substr($byDay,-2)]; - - } - - return $recurrenceDays; - } -} - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Splitter/ICalendar.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Splitter/ICalendar.php deleted file mode 100755 index eb5db80b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Splitter/ICalendar.php +++ /dev/null @@ -1,114 +0,0 @@ -children() as $component) { - if (!$component instanceof VObject\Component) { - continue; - } - - // Get all timezones - if ($component->name === 'VTIMEZONE') { - $this->vtimezones[(string)$component->TZID] = $component; - continue; - } - - // Get component UID for recurring Events search - if($component->UID) { - $uid = (string)$component->UID; - } else { - // Generating a random UID - $uid = sha1(microtime()) . '-vobjectimport'; - } - - // Take care of recurring events - if (!array_key_exists($uid, $this->objects)) { - $this->objects[$uid] = new VCalendar(); - } - - $this->objects[$uid]->add(clone $component); - } - - } - - /** - * Every time getNext() is called, a new object will be parsed, until we - * hit the end of the stream. - * - * When the end is reached, null will be returned. - * - * @return SabreForRainLoop\VObject\Component|null - */ - public function getNext() { - - if($object=array_shift($this->objects)) { - - // create our baseobject - $object->version = '2.0'; - $object->prodid = '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN'; - $object->calscale = 'GREGORIAN'; - - // add vtimezone information to obj (if we have it) - foreach ($this->vtimezones as $vtimezone) { - $object->add($vtimezone); - } - - return $object; - - } else { - - return null; - - } - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Splitter/SplitterInterface.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Splitter/SplitterInterface.php deleted file mode 100755 index 116da8af..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Splitter/SplitterInterface.php +++ /dev/null @@ -1,39 +0,0 @@ -input = $input; - $this->parser = new MimeDir($input, $options); - - } - - /** - * Every time getNext() is called, a new object will be parsed, until we - * hit the end of the stream. - * - * When the end is reached, null will be returned. - * - * @return SabreForRainLoop\VObject\Component|null - */ - public function getNext() { - - try { - $object = $this->parser->parse(); - } catch (VObject\EofException $e) { - return null; - } - - return $object; - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/StringUtil.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/StringUtil.php deleted file mode 100755 index 39011373..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/StringUtil.php +++ /dev/null @@ -1,61 +0,0 @@ -'Australia/Darwin', - 'AUS Eastern Standard Time'=>'Australia/Sydney', - 'Afghanistan Standard Time'=>'Asia/Kabul', - 'Alaskan Standard Time'=>'America/Anchorage', - 'Arab Standard Time'=>'Asia/Riyadh', - 'Arabian Standard Time'=>'Asia/Dubai', - 'Arabic Standard Time'=>'Asia/Baghdad', - 'Argentina Standard Time'=>'America/Buenos_Aires', - 'Armenian Standard Time'=>'Asia/Yerevan', - 'Atlantic Standard Time'=>'America/Halifax', - 'Azerbaijan Standard Time'=>'Asia/Baku', - 'Azores Standard Time'=>'Atlantic/Azores', - 'Bangladesh Standard Time'=>'Asia/Dhaka', - 'Canada Central Standard Time'=>'America/Regina', - 'Cape Verde Standard Time'=>'Atlantic/Cape_Verde', - 'Caucasus Standard Time'=>'Asia/Yerevan', - 'Cen. Australia Standard Time'=>'Australia/Adelaide', - 'Central America Standard Time'=>'America/Guatemala', - 'Central Asia Standard Time'=>'Asia/Almaty', - 'Central Brazilian Standard Time'=>'America/Cuiaba', - 'Central Europe Standard Time'=>'Europe/Budapest', - 'Central European Standard Time'=>'Europe/Warsaw', - 'Central Pacific Standard Time'=>'Pacific/Guadalcanal', - 'Central Standard Time'=>'America/Chicago', - 'Central Standard Time (Mexico)'=>'America/Mexico_City', - 'China Standard Time'=>'Asia/Shanghai', - 'Dateline Standard Time'=>'Etc/GMT+12', - 'E. Africa Standard Time'=>'Africa/Nairobi', - 'E. Australia Standard Time'=>'Australia/Brisbane', - 'E. Europe Standard Time'=>'Europe/Minsk', - 'E. South America Standard Time'=>'America/Sao_Paulo', - 'Eastern Standard Time'=>'America/New_York', - 'Egypt Standard Time'=>'Africa/Cairo', - 'Ekaterinburg Standard Time'=>'Asia/Yekaterinburg', - 'FLE Standard Time'=>'Europe/Kiev', - 'Fiji Standard Time'=>'Pacific/Fiji', - 'GMT Standard Time'=>'Europe/London', - 'GTB Standard Time'=>'Europe/Istanbul', - 'Georgian Standard Time'=>'Asia/Tbilisi', - 'Greenland Standard Time'=>'America/Godthab', - 'Greenwich Standard Time'=>'Atlantic/Reykjavik', - 'Hawaiian Standard Time'=>'Pacific/Honolulu', - 'India Standard Time'=>'Asia/Calcutta', - 'Iran Standard Time'=>'Asia/Tehran', - 'Israel Standard Time'=>'Asia/Jerusalem', - 'Jordan Standard Time'=>'Asia/Amman', - 'Kamchatka Standard Time'=>'Asia/Kamchatka', - 'Korea Standard Time'=>'Asia/Seoul', - 'Magadan Standard Time'=>'Asia/Magadan', - 'Mauritius Standard Time'=>'Indian/Mauritius', - 'Mexico Standard Time'=>'America/Mexico_City', - 'Mexico Standard Time 2'=>'America/Chihuahua', - 'Mid-Atlantic Standard Time'=>'Etc/GMT-2', - 'Middle East Standard Time'=>'Asia/Beirut', - 'Montevideo Standard Time'=>'America/Montevideo', - 'Morocco Standard Time'=>'Africa/Casablanca', - 'Mountain Standard Time'=>'America/Denver', - 'Mountain Standard Time (Mexico)'=>'America/Chihuahua', - 'Myanmar Standard Time'=>'Asia/Rangoon', - 'N. Central Asia Standard Time'=>'Asia/Novosibirsk', - 'Namibia Standard Time'=>'Africa/Windhoek', - 'Nepal Standard Time'=>'Asia/Katmandu', - 'New Zealand Standard Time'=>'Pacific/Auckland', - 'Newfoundland Standard Time'=>'America/St_Johns', - 'North Asia East Standard Time'=>'Asia/Irkutsk', - 'North Asia Standard Time'=>'Asia/Krasnoyarsk', - 'Pacific SA Standard Time'=>'America/Santiago', - 'Pacific Standard Time'=>'America/Los_Angeles', - 'Pacific Standard Time (Mexico)'=>'America/Santa_Isabel', - 'Pakistan Standard Time'=>'Asia/Karachi', - 'Paraguay Standard Time'=>'America/Asuncion', - 'Romance Standard Time'=>'Europe/Paris', - 'Russian Standard Time'=>'Europe/Moscow', - 'SA Eastern Standard Time'=>'America/Cayenne', - 'SA Pacific Standard Time'=>'America/Bogota', - 'SA Western Standard Time'=>'America/La_Paz', - 'SE Asia Standard Time'=>'Asia/Bangkok', - 'Samoa Standard Time'=>'Pacific/Apia', - 'Singapore Standard Time'=>'Asia/Singapore', - 'South Africa Standard Time'=>'Africa/Johannesburg', - 'Sri Lanka Standard Time'=>'Asia/Colombo', - 'Syria Standard Time'=>'Asia/Damascus', - 'Taipei Standard Time'=>'Asia/Taipei', - 'Tasmania Standard Time'=>'Australia/Hobart', - 'Tokyo Standard Time'=>'Asia/Tokyo', - 'Tonga Standard Time'=>'Pacific/Tongatapu', - 'US Eastern Standard Time'=>'America/Indianapolis', - 'US Mountain Standard Time'=>'America/Phoenix', - 'UTC+12'=>'Etc/GMT-12', - 'UTC-02'=>'Etc/GMT+2', - 'UTC-11'=>'Etc/GMT+11', - 'Ulaanbaatar Standard Time'=>'Asia/Ulaanbaatar', - 'Venezuela Standard Time'=>'America/Caracas', - 'Vladivostok Standard Time'=>'Asia/Vladivostok', - 'W. Australia Standard Time'=>'Australia/Perth', - 'W. Central Africa Standard Time'=>'Africa/Lagos', - 'W. Europe Standard Time'=>'Europe/Berlin', - 'West Asia Standard Time'=>'Asia/Tashkent', - 'West Pacific Standard Time'=>'Pacific/Port_Moresby', - 'Yakutsk Standard Time'=>'Asia/Yakutsk', - - // Microsoft exchange timezones - // Source: - // http://msdn.microsoft.com/en-us/library/ms988620%28v=exchg.65%29.aspx - // - // Correct timezones deduced with help from: - // http://en.wikipedia.org/wiki/List_of_tz_database_time_zones - 'Universal Coordinated Time' => 'UTC', - 'Casablanca, Monrovia' => 'Africa/Casablanca', - 'Greenwich Mean Time: Dublin, Edinburgh, Lisbon, London' => 'Europe/Lisbon', - 'Greenwich Mean Time; Dublin, Edinburgh, London' => 'Europe/London', - 'Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna' => 'Europe/Berlin', - 'Belgrade, Pozsony, Budapest, Ljubljana, Prague' => 'Europe/Prague', - 'Brussels, Copenhagen, Madrid, Paris' => 'Europe/Paris', - 'Paris, Madrid, Brussels, Copenhagen' => 'Europe/Paris', - 'Prague, Central Europe' => 'Europe/Prague', - 'Sarajevo, Skopje, Sofija, Vilnius, Warsaw, Zagreb' => 'Europe/Sarajevo', - 'West Central Africa' => 'Africa/Luanda', // This was a best guess - 'Athens, Istanbul, Minsk' => 'Europe/Athens', - 'Bucharest' => 'Europe/Bucharest', - 'Cairo' => 'Africa/Cairo', - 'Harare, Pretoria' => 'Africa/Harare', - 'Helsinki, Riga, Tallinn' => 'Europe/Helsinki', - 'Israel, Jerusalem Standard Time' => 'Asia/Jerusalem', - 'Baghdad' => 'Asia/Baghdad', - 'Arab, Kuwait, Riyadh' => 'Asia/Kuwait', - 'Moscow, St. Petersburg, Volgograd' => 'Europe/Moscow', - 'East Africa, Nairobi' => 'Africa/Nairobi', - 'Tehran' => 'Asia/Tehran', - 'Abu Dhabi, Muscat' => 'Asia/Muscat', // Best guess - 'Baku, Tbilisi, Yerevan' => 'Asia/Baku', - 'Kabul' => 'Asia/Kabul', - 'Ekaterinburg' => 'Asia/Yekaterinburg', - 'Islamabad, Karachi, Tashkent' => 'Asia/Karachi', - 'Kolkata, Chennai, Mumbai, New Delhi, India Standard Time' => 'Asia/Calcutta', - 'Kathmandu, Nepal' => 'Asia/Kathmandu', - 'Almaty, Novosibirsk, North Central Asia' => 'Asia/Almaty', - 'Astana, Dhaka' => 'Asia/Dhaka', - 'Sri Jayawardenepura, Sri Lanka' => 'Asia/Colombo', - 'Rangoon' => 'Asia/Rangoon', - 'Bangkok, Hanoi, Jakarta' => 'Asia/Bangkok', - 'Krasnoyarsk' => 'Asia/Krasnoyarsk', - 'Beijing, Chongqing, Hong Kong SAR, Urumqi' => 'Asia/Shanghai', - 'Irkutsk, Ulaan Bataar' => 'Asia/Irkutsk', - 'Kuala Lumpur, Singapore' => 'Asia/Singapore', - 'Perth, Western Australia' => 'Australia/Perth', - 'Taipei' => 'Asia/Taipei', - 'Osaka, Sapporo, Tokyo' => 'Asia/Tokyo', - 'Seoul, Korea Standard time' => 'Asia/Seoul', - 'Yakutsk' => 'Asia/Yakutsk', - 'Adelaide, Central Australia' => 'Australia/Adelaide', - 'Darwin' => 'Australia/Darwin', - 'Brisbane, East Australia' => 'Australia/Brisbane', - 'Canberra, Melbourne, Sydney, Hobart (year 2000 only)' => 'Australia/Sydney', - 'Guam, Port Moresby' => 'Pacific/Guam', - 'Hobart, Tasmania' => 'Australia/Hobart', - 'Vladivostok' => 'Asia/Vladivostok', - 'Magadan, Solomon Is., New Caledonia' => 'Asia/Magadan', - 'Auckland, Wellington' => 'Pacific/Auckland', - 'Fiji Islands, Kamchatka, Marshall Is.' => 'Pacific/Fiji', - 'Nuku\'alofa, Tonga' => 'Pacific/Tongatapu', - 'Azores' => 'Atlantic/Azores', - 'Cape Verde Is.' => 'Atlantic/Cape_Verde', - 'Mid-Atlantic' => 'America/Noronha', - 'Brasilia' => 'America/Sao_Paulo', // Best guess - 'Buenos Aires' => 'America/Argentina/Buenos_Aires', - 'Greenland' => 'America/Godthab', - 'Newfoundland' => 'America/St_Johns', - 'Atlantic Time (Canada)' => 'America/Halifax', - 'Caracas, La Paz' => 'America/Caracas', - 'Santiago' => 'America/Santiago', - 'Bogota, Lima, Quito' => 'America/Bogota', - 'Eastern Time (US & Canada)' => 'America/New_York', - 'Indiana (East)' => 'America/Indiana/Indianapolis', - 'Central America' => 'America/Guatemala', - 'Central Time (US & Canada)' => 'America/Chicago', - 'Mexico City, Tegucigalpa' => 'America/Mexico_City', - 'Saskatchewan' => 'America/Edmonton', - 'Arizona' => 'America/Phoenix', - 'Mountain Time (US & Canada)' => 'America/Denver', // Best guess - 'Pacific Time (US & Canada); Tijuana' => 'America/Los_Angeles', // Best guess - 'Alaska' => 'America/Anchorage', - 'Hawaii' => 'Pacific/Honolulu', - 'Midway Island, Samoa' => 'Pacific/Midway', - 'Eniwetok, Kwajalein, Dateline Time' => 'Pacific/Kwajalein', - - // The following list are timezone names that could be generated by - // Lotus / Domino - 'Dateline' => 'Etc/GMT-12', - 'Samoa' => 'Pacific/Apia', - 'Hawaiian' => 'Pacific/Honolulu', - 'Alaskan' => 'America/Anchorage', - 'Pacific' => 'America/Los_Angeles', - 'Pacific Standard Time' => 'America/Los_Angeles', - 'Mexico Standard Time 2' => 'America/Chihuahua', - 'Mountain' => 'America/Denver', - 'Mountain Standard Time' => 'America/Chihuahua', - 'US Mountain' => 'America/Phoenix', - 'Canada Central' => 'America/Edmonton', - 'Central America' => 'America/Guatemala', - 'Central' => 'America/Chicago', - 'Central Standard Time' => 'America/Mexico_City', - 'Mexico' => 'America/Mexico_City', - 'Eastern' => 'America/New_York', - 'SA Pacific' => 'America/Bogota', - 'US Eastern' => 'America/Indiana/Indianapolis', - 'Venezuela' => 'America/Caracas', - 'Atlantic' => 'America/Halifax', - 'Central Brazilian' => 'America/Manaus', - 'Pacific SA' => 'America/Santiago', - 'SA Western' => 'America/La_Paz', - 'Newfoundland' => 'America/St_Johns', - 'Argentina' => 'America/Argentina/Buenos_Aires', - 'E. South America' => 'America/Belem', - 'Greenland' => 'America/Godthab', - 'Montevideo' => 'America/Montevideo', - 'SA Eastern' => 'America/Belem', - 'Mid-Atlantic' => 'Etc/GMT-2', - 'Azores' => 'Atlantic/Azores', - 'Cape Verde' => 'Atlantic/Cape_Verde', - 'Greenwich' => 'Atlantic/Reykjavik', // No I'm serious.. Greenwich is not GMT. - 'Morocco' => 'Africa/Casablanca', - 'Central Europe' => 'Europe/Prague', - 'Central European' => 'Europe/Sarajevo', - 'Romance' => 'Europe/Paris', - 'W. Central Africa' => 'Africa/Lagos', // Best guess - 'W. Europe' => 'Europe/Amsterdam', - 'E. Europe' => 'Europe/Minsk', - 'Egypt' => 'Africa/Cairo', - 'FLE' => 'Europe/Helsinki', - 'GTB' => 'Europe/Athens', - 'Israel' => 'Asia/Jerusalem', - 'Jordan' => 'Asia/Amman', - 'Middle East' => 'Asia/Beirut', - 'Namibia' => 'Africa/Windhoek', - 'South Africa' => 'Africa/Harare', - 'Arab' => 'Asia/Kuwait', - 'Arabic' => 'Asia/Baghdad', - 'E. Africa' => 'Africa/Nairobi', - 'Georgian' => 'Asia/Tbilisi', - 'Russian' => 'Europe/Moscow', - 'Iran' => 'Asia/Tehran', - 'Arabian' => 'Asia/Muscat', - 'Armenian' => 'Asia/Yerevan', - 'Azerbijan' => 'Asia/Baku', - 'Caucasus' => 'Asia/Yerevan', - 'Mauritius' => 'Indian/Mauritius', - 'Afghanistan' => 'Asia/Kabul', - 'Ekaterinburg' => 'Asia/Yekaterinburg', - 'Pakistan' => 'Asia/Karachi', - 'West Asia' => 'Asia/Tashkent', - 'India' => 'Asia/Calcutta', - 'Sri Lanka' => 'Asia/Colombo', - 'Nepal' => 'Asia/Kathmandu', - 'Central Asia' => 'Asia/Dhaka', - 'N. Central Asia' => 'Asia/Almaty', - 'Myanmar' => 'Asia/Rangoon', - 'North Asia' => 'Asia/Krasnoyarsk', - 'SE Asia' => 'Asia/Bangkok', - 'China' => 'Asia/Shanghai', - 'North Asia East' => 'Asia/Irkutsk', - 'Singapore' => 'Asia/Singapore', - 'Taipei' => 'Asia/Taipei', - 'W. Australia' => 'Australia/Perth', - 'Korea' => 'Asia/Seoul', - 'Tokyo' => 'Asia/Tokyo', - 'Yakutsk' => 'Asia/Yakutsk', - 'AUS Central' => 'Australia/Darwin', - 'Cen. Australia' => 'Australia/Adelaide', - 'AUS Eastern' => 'Australia/Sydney', - 'E. Australia' => 'Australia/Brisbane', - 'Tasmania' => 'Australia/Hobart', - 'Vladivostok' => 'Asia/Vladivostok', - 'West Pacific' => 'Pacific/Guam', - 'Central Pacific' => 'Asia/Magadan', - 'Fiji' => 'Pacific/Fiji', - 'New Zealand' => 'Pacific/Auckland', - 'Tonga' => 'Pacific/Tongatapu', - ); - - /** - * List of microsoft exchange timezone ids. - * - * Source: http://msdn.microsoft.com/en-us/library/aa563018(loband).aspx - */ - public static $microsoftExchangeMap = array( - 0 => 'UTC', - 31 => 'Africa/Casablanca', - - // Insanely, id #2 is used for both Europe/Lisbon, and Europe/Sarajevo. - // I'm not even kidding.. We handle this special case in the - // getTimeZone method. - 2 => 'Europe/Lisbon', - 1 => 'Europe/London', - 4 => 'Europe/Berlin', - 6 => 'Europe/Prague', - 3 => 'Europe/Paris', - 69 => 'Africa/Luanda', // This was a best guess - 7 => 'Europe/Athens', - 5 => 'Europe/Bucharest', - 49 => 'Africa/Cairo', - 50 => 'Africa/Harare', - 59 => 'Europe/Helsinki', - 27 => 'Asia/Jerusalem', - 26 => 'Asia/Baghdad', - 74 => 'Asia/Kuwait', - 51 => 'Europe/Moscow', - 56 => 'Africa/Nairobi', - 25 => 'Asia/Tehran', - 24 => 'Asia/Muscat', // Best guess - 54 => 'Asia/Baku', - 48 => 'Asia/Kabul', - 58 => 'Asia/Yekaterinburg', - 47 => 'Asia/Karachi', - 23 => 'Asia/Calcutta', - 62 => 'Asia/Kathmandu', - 46 => 'Asia/Almaty', - 71 => 'Asia/Dhaka', - 66 => 'Asia/Colombo', - 61 => 'Asia/Rangoon', - 22 => 'Asia/Bangkok', - 64 => 'Asia/Krasnoyarsk', - 45 => 'Asia/Shanghai', - 63 => 'Asia/Irkutsk', - 21 => 'Asia/Singapore', - 73 => 'Australia/Perth', - 75 => 'Asia/Taipei', - 20 => 'Asia/Tokyo', - 72 => 'Asia/Seoul', - 70 => 'Asia/Yakutsk', - 19 => 'Australia/Adelaide', - 44 => 'Australia/Darwin', - 18 => 'Australia/Brisbane', - 76 => 'Australia/Sydney', - 43 => 'Pacific/Guam', - 42 => 'Australia/Hobart', - 68 => 'Asia/Vladivostok', - 41 => 'Asia/Magadan', - 17 => 'Pacific/Auckland', - 40 => 'Pacific/Fiji', - 67 => 'Pacific/Tongatapu', - 29 => 'Atlantic/Azores', - 53 => 'Atlantic/Cape_Verde', - 30 => 'America/Noronha', - 8 => 'America/Sao_Paulo', // Best guess - 32 => 'America/Argentina/Buenos_Aires', - 60 => 'America/Godthab', - 28 => 'America/St_Johns', - 9 => 'America/Halifax', - 33 => 'America/Caracas', - 65 => 'America/Santiago', - 35 => 'America/Bogota', - 10 => 'America/New_York', - 34 => 'America/Indiana/Indianapolis', - 55 => 'America/Guatemala', - 11 => 'America/Chicago', - 37 => 'America/Mexico_City', - 36 => 'America/Edmonton', - 38 => 'America/Phoenix', - 12 => 'America/Denver', // Best guess - 13 => 'America/Los_Angeles', // Best guess - 14 => 'America/Anchorage', - 15 => 'Pacific/Honolulu', - 16 => 'Pacific/Midway', - 39 => 'Pacific/Kwajalein', - ); - - /** - * This method will try to find out the correct timezone for an iCalendar - * date-time value. - * - * You must pass the contents of the TZID parameter, as well as the full - * calendar. - * - * If the lookup fails, this method will return the default PHP timezone - * (as configured using date_default_timezone_set, or the date.timezone ini - * setting). - * - * Alternatively, if $failIfUncertain is set to true, it will throw an - * exception if we cannot accurately determine the timezone. - * - * @param string $tzid - * @param SabreForRainLoop\VObject\Component $vcalendar - * @return DateTimeZone - */ - static public function getTimeZone($tzid, Component $vcalendar = null, $failIfUncertain = false) { - - // First we will just see if the tzid is a support timezone identifier. - try { - return new \DateTimeZone($tzid); - } catch (\Exception $e) { - } - - // Next, we check if the tzid is somewhere in our tzid map. - if (isset(self::$map[$tzid])) { - return new \DateTimeZone(self::$map[$tzid]); - } - - // Maybe the author was hyper-lazy and just included an offset. We - // support it, but we aren't happy about it. - if (preg_match('/^GMT(\+|-)([0-9]{4})$/', $tzid, $matches)) { - return new \DateTimeZone('Etc/GMT' . $matches[1] . ltrim(substr($matches[2],0,2),'0')); - } - - if ($vcalendar) { - - // If that didn't work, we will scan VTIMEZONE objects - foreach($vcalendar->select('VTIMEZONE') as $vtimezone) { - - if ((string)$vtimezone->TZID === $tzid) { - - // Some clients add 'X-LIC-LOCATION' with the olson name. - if (isset($vtimezone->{'X-LIC-LOCATION'})) { - - $lic = (string)$vtimezone->{'X-LIC-LOCATION'}; - - // Libical generators may specify strings like - // "SystemV/EST5EDT". For those we must remove the - // SystemV part. - if (substr($lic,0,8)==='SystemV/') { - $lic = substr($lic,8); - } - - try { - return new \DateTimeZone($lic); - } catch (\Exception $e) { - } - - } - // Microsoft may add a magic number, which we also have an - // answer for. - if (isset($vtimezone->{'X-MICROSOFT-CDO-TZID'})) { - $cdoId = (int)$vtimezone->{'X-MICROSOFT-CDO-TZID'}->getValue(); - - // 2 can mean both Europe/Lisbon and Europe/Sarajevo. - if ($cdoId===2 && strpos((string)$vtimezone->TZID, 'Sarajevo')!==false) { - return new \DateTimeZone('Europe/Sarajevo'); - } - - if (isset(self::$microsoftExchangeMap[$cdoId])) { - return new \DateTimeZone(self::$microsoftExchangeMap[$cdoId]); - } - } - - } - - } - - } - - if ($failIfUncertain) { - throw new \InvalidArgumentException('We were unable to determine the correct PHP timezone for tzid: ' . $tzid); - } - - // If we got all the way here, we default to UTC. - return new \DateTimeZone(date_default_timezone_get()); - - } - -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/VCardConverter.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/VCardConverter.php deleted file mode 100755 index 4b5d6d14..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/VCardConverter.php +++ /dev/null @@ -1,382 +0,0 @@ -getDocumentType(); - if ($inputVersion===$targetVersion) { - return clone $input; - } - - if (!in_array($inputVersion, array(Document::VCARD21, Document::VCARD30, Document::VCARD40))) { - throw new \InvalidArgumentException('Only vCard 2.1, 3.0 and 4.0 are supported for the input data'); - } - if (!in_array($targetVersion, array(Document::VCARD30, Document::VCARD40))) { - throw new \InvalidArgumentException('You can only use vCard 3.0 or 4.0 for the target version'); - } - - $newVersion = $targetVersion===Document::VCARD40?'4.0':'3.0'; - - $output = new Component\VCard(array( - 'VERSION' => $newVersion, - )); - - foreach($input->children as $property) { - - $this->convertProperty($input, $output, $property, $targetVersion); - - } - - return $output; - - } - - /** - * Handles conversion of a single property. - * - * @param Component\VCard $input - * @param Component\VCard $output - * @param Property $property - * @param int $targetVersion - * @return void - */ - protected function convertProperty(Component\VCard $input, Component\VCard $output, Property $property, $targetVersion) { - - // Skipping these, those are automatically added. - if (in_array($property->name, array('VERSION', 'PRODID'))) { - return; - } - - $parameters = $property->parameters(); - - $valueType = null; - if (isset($parameters['VALUE'])) { - $valueType = $parameters['VALUE']->getValue(); - unset($parameters['VALUE']); - } - if (!$valueType) { - $valueType = $property->getValueType(); - } - - $newProperty = null; - - if ($targetVersion===Document::VCARD30) { - - if ($property instanceof Property\Uri && in_array($property->name, array('PHOTO','LOGO','SOUND'))) { - - $newProperty = $this->convertUriToBinary($output, $property, $parameters); - - } elseif ($property->name === 'KIND') { - - switch(strtolower($property->getValue())) { - case 'org' : - // OS X addressbook property. - $newProperty = $output->createProperty('X-ABSHOWAS','COMPANY'); - break; - case 'individual' : - // Individual is implied, so we can just skip it. - return; - - case 'group' : - // OS X addressbook property - $newProperty = $output->createProperty('X-ADDRESSBOOKSERVER-KIND','GROUP'); - break; - } - - - } - - } elseif ($targetVersion===Document::VCARD40) { - - // These properties were removed in vCard 4.0 - if (in_array($property->name, array('NAME', 'MAILER', 'LABEL', 'CLASS'))) { - return; - } - - if ($property instanceOf Property\Binary) { - - $newProperty = $this->convertBinaryToUri($output, $property, $parameters); - - } else { - switch($property->name) { - case 'X-ABSHOWAS' : - if (strtoupper($property->getValue()) === 'COMPANY') { - $newProperty = $output->createProperty('KIND','org'); - } - break; - case 'X-ADDRESSBOOKSERVER-KIND' : - if (strtoupper($property->getValue()) === 'GROUP') { - $newProperty = $output->createProperty('KIND','group'); - } - break; - } - - } - - } - - - if (is_null($newProperty)) { - - $newProperty = $output->createProperty( - $property->name, - $property->getParts(), - array(), // no parameters yet - $valueType - ); - - } - - // set property group - $newProperty->group = $property->group; - - if ($targetVersion===Document::VCARD40) { - $this->convertParameters40($newProperty, $parameters); - } else { - $this->convertParameters30($newProperty, $parameters); - } - - // Lastly, we need to see if there's a need for a VALUE parameter. - // - // We can do that by instantating a empty property with that name, and - // seeing if the default valueType is identical to the current one. - $tempProperty = $output->createProperty($newProperty->name); - if ($tempProperty->getValueType() !== $newProperty->getValueType()) { - $newProperty['VALUE'] = $newProperty->getValueType(); - } - - $output->add($newProperty); - - - } - - /** - * Converts a BINARY property to a URI property. - * - * vCard 4.0 no longer supports BINARY properties. - * - * @param Component\VCard $output - * @param Property\Uri $property The input property. - * @param $parameters List of parameters that will eventually be added to - * the new property. - * @return Property\Uri - */ - protected function convertBinaryToUri(Component\VCard $output, Property\Binary $property, array &$parameters) { - - $newProperty = $output->createProperty( - $property->name, - null, // no value - array(), // no parameters yet - 'URI' // Forcing the BINARY type - ); - - $mimeType = 'application/octet-stream'; - - // See if we can find a better mimetype. - if (isset($parameters['TYPE'])) { - - $newTypes = array(); - foreach($parameters['TYPE']->getParts() as $typePart) { - if (in_array( - strtoupper($typePart), - array('JPEG','PNG','GIF') - )) { - $mimeType = 'image/' . strtolower($typePart); - } else { - $newTypes[] = $typePart; - } - } - - // If there were any parameters we're not converting to a - // mime-type, we need to keep them. - if ($newTypes) { - $parameters['TYPE']->setParts($newTypes); - } else { - unset($parameters['TYPE']); - } - - } - - $newProperty->setValue('data:' . $mimeType . ';base64,' . base64_encode($property->getValue())); - - return $newProperty; - - } - - /** - * Converts a URI property to a BINARY property. - * - * In vCard 4.0 attachments are encoded as data: uri. Even though these may - * be valid in vCard 3.0 as well, we should convert those to BINARY if - * possible, to improve compatibility. - * - * @param Component\VCard $output - * @param Property\Uri $property The input property. - * @param $parameters List of parameters that will eventually be added to - * the new property. - * @return Property\Binary|null - */ - protected function convertUriToBinary(Component\VCard $output, Property\Uri $property, array &$parameters) { - - $value = $property->getValue(); - - // Only converting data: uris - if (substr($value, 0, 5)!=='data:') { - return; - } - - $newProperty = $output->createProperty( - $property->name, - null, // no value - array(), // no parameters yet - 'BINARY' - ); - - $mimeType = substr($value, 5, strpos($value, ',')-5); - if (strpos($mimeType, ';')) { - $mimeType = substr($mimeType,0,strpos($mimeType, ';')); - $newProperty->setValue(base64_decode(substr($value, strpos($value,',')+1))); - } else { - $newProperty->setValue(substr($value, strpos($value,',')+1)); - } - unset($value); - - $newProperty['ENCODING'] = 'b'; - switch($mimeType) { - - case 'image/jpeg' : - $newProperty['TYPE'] = 'JPEG'; - break; - case 'image/png' : - $newProperty['TYPE'] = 'PNG'; - break; - case 'image/gif' : - $newProperty['TYPE'] = 'GIF'; - break; - - } - - - return $newProperty; - - } - - /** - * Adds parameters to a new property for vCard 4.0 - * - * @param Property $newProperty - * @param array $parameters - * @return void - */ - protected function convertParameters40(Property $newProperty, array $parameters) { - - // Adding all parameters. - foreach($parameters as $param) { - - // vCard 2.1 allowed parameters with no name - if ($param->noName) $param->noName = false; - - switch($param->name) { - - // We need to see if there's any TYPE=PREF, because in vCard 4 - // that's now PREF=1. - case 'TYPE' : - foreach($param->getParts() as $paramPart) { - - if (strtoupper($paramPart)==='PREF') { - $newProperty->add('PREF','1'); - } else { - $newProperty->add($param->name, $paramPart); - } - - } - break; - // These no longer exist in vCard 4 - case 'ENCODING' : - case 'CHARSET' : - break; - - default : - $newProperty->add($param->name, $param->getParts()); - break; - - } - - } - - } - - /** - * Adds parameters to a new property for vCard 3.0 - * - * @param Property $newProperty - * @param array $parameters - * @return void - */ - protected function convertParameters30(Property $newProperty, array $parameters) { - - // Adding all parameters. - foreach($parameters as $param) { - - // vCard 2.1 allowed parameters with no name - if ($param->noName) $param->noName = false; - - switch($param->name) { - - case 'ENCODING' : - // This value only existed in vCard 2.1, and should be - // removed for anything else. - if (strtoupper($param->getValue())!=='QUOTED-PRINTABLE') { - $newProperty->add($param->name, $param->getParts()); - } - break; - - /* - * Converting PREF=1 to TYPE=PREF. - * - * Any other PREF numbers we'll drop. - */ - case 'PREF' : - if ($param->getValue()=='1') { - $newProperty->add('TYPE','PREF'); - } - break; - - default : - $newProperty->add($param->name, $param->getParts()); - break; - - } - - } - - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Version.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Version.php deleted file mode 100755 index 76283639..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/SabreForRainLoop/VObject/Version.php +++ /dev/null @@ -1,19 +0,0 @@ - - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is 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. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -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. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - 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 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. Use with the GNU Affero General Public License. - - 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 Affero 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 special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 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 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 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. - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/lessphp/README.md b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/lessphp/README.md deleted file mode 100755 index 0085e19d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/lessphp/README.md +++ /dev/null @@ -1,96 +0,0 @@ -# lessphp v0.3.9 -### - -[![Build Status](https://secure.travis-ci.org/leafo/lessphp.png)](http://travis-ci.org/leafo/lessphp) - -`lessphp` is a compiler for LESS written in PHP. The documentation is great, -so check it out: . - -Here's a quick tutorial: - -### How to use in your PHP project - -The only file required is `lessc.inc.php`, so copy that to your include directory. - -The typical flow of **lessphp** is to create a new instance of `lessc`, -configure it how you like, then tell it to compile something using one built in -compile methods. - -The `compile` method compiles a string of LESS code to CSS. - -```php -compile(".block { padding: 3 + 4px }"); -``` - -The `compileFile` method reads and compiles a file. It will either return the -result or write it to the path specified by an optional second argument. - -```php -compileFile("input.less"); -``` - -The `compileChecked` method is like `compileFile`, but it only compiles if the output -file doesn't exist or it's older than the input file: - -```php -checkedCompile("input.less", "output.css"); -``` - -If there any problem compiling your code, an exception is thrown with a helpful message: - -```php -compile("invalid LESS } {"); -} catch (exception $e) { - echo "fatal error: " . $e->getMessage(); -} -``` - -The `lessc` object can be configured through an assortment of instance methods. -Some possible configuration options include [changing the output format][1], -[setting variables from PHP][2], and [controlling the preservation of -comments][3], writing [custom functions][4] and much more. It's all described -in [the documentation][0]. - - - [0]: http://leafo.net/lessphp/docs/ - [1]: http://leafo.net/lessphp/docs/#output_formatting - [2]: http://leafo.net/lessphp/docs/#setting_variables_from_php - [3]: http://leafo.net/lessphp/docs/#preserving_comments - [4]: http://leafo.net/lessphp/docs/#custom_functions - - -### How to use from the command line - -An additional script has been included to use the compiler from the command -line. In the simplest invocation, you specify an input file and the compiled -css is written to standard out: - - $ plessc input.less > output.css - -Using the -r flag, you can specify LESS code directly as an argument or, if -the argument is left off, from standard in: - - $ plessc -r "my less code here" - -Finally, by using the -w flag you can watch a specified input file and have it -compile as needed to the output file: - - $ plessc -w input-file output-file - -Errors from watch mode are written to standard out. - -The -f flag sets the [output formatter][1]. For example, to compress the -output run this: - - $ plessc -f=compressed myfile.less - -For more help, run `plessc --help` - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/lessphp/ctype.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/lessphp/ctype.php deleted file mode 100755 index 74a12d14..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/lessphp/ctype.php +++ /dev/null @@ -1,40 +0,0 @@ - - * Licensed under MIT or GPLv3, see LICENSE - */ - - -/** - * The less compiler and parser. - * - * Converting LESS to CSS is a three stage process. The incoming file is parsed - * by `lessc_parser` into a syntax tree, then it is compiled into another tree - * representing the CSS structure by `lessc`. The CSS tree is fed into a - * formatter, like `lessc_formatter` which then outputs CSS as a string. - * - * During the first compile, all values are *reduced*, which means that their - * types are brought to the lowest form before being dump as strings. This - * handles math equations, variable dereferences, and the like. - * - * The `parse` function of `lessc` is the entry point. - * - * In summary: - * - * The `lessc` class creates an intstance of the parser, feeds it LESS code, - * then transforms the resulting tree to a CSS tree. This class also holds the - * evaluation context, such as all available mixins and variables at any given - * time. - * - * The `lessc_parser` class is only concerned with parsing its input. - * - * The `lessc_formatter` takes a CSS tree, and dumps it to a formatted string, - * handling things like indentation. - */ -class lessc { - static public $VERSION = "v0.3.9"; - static protected $TRUE = array("keyword", "true"); - static protected $FALSE = array("keyword", "false"); - - protected $libFunctions = array(); - protected $registeredVars = array(); - protected $preserveComments = false; - - public $vPrefix = '@'; // prefix of abstract properties - public $mPrefix = '$'; // prefix of abstract blocks - public $parentSelector = '&'; - - public $importDisabled = false; - public $importDir = ''; - - protected $numberPrecision = null; - - // set to the parser that generated the current line when compiling - // so we know how to create error messages - protected $sourceParser = null; - protected $sourceLoc = null; - - static public $defaultValue = array("keyword", ""); - - static protected $nextImportId = 0; // uniquely identify imports - - // attempts to find the path of an import url, returns null for css files - protected function findImport($url) { - foreach ((array)$this->importDir as $dir) { - $full = $dir.(substr($dir, -1) != '/' ? '/' : '').$url; - if ($this->fileExists($file = $full.'.less') || $this->fileExists($file = $full)) { - return $file; - } - } - - return null; - } - - protected function fileExists($name) { - return is_file($name); - } - - static public function compressList($items, $delim) { - if (!isset($items[1]) && isset($items[0])) return $items[0]; - else return array('list', $delim, $items); - } - - static public function preg_quote($what) { - return preg_quote($what, '/'); - } - - protected function tryImport($importPath, $parentBlock, $out) { - if ($importPath[0] == "function" && $importPath[1] == "url") { - $importPath = $this->flattenList($importPath[2]); - } - - $str = $this->coerceString($importPath); - if ($str === null) return false; - - $url = $this->compileValue($this->lib_e($str)); - - // don't import if it ends in css - if (substr_compare($url, '.css', -4, 4) === 0) return false; - - $realPath = $this->findImport($url); - if ($realPath === null) return false; - - if ($this->importDisabled) { - return array(false, "/* import disabled */"); - } - - $this->addParsedFile($realPath); - $parser = $this->makeParser($realPath); - $root = $parser->parse(file_get_contents($realPath)); - - // set the parents of all the block props - foreach ($root->props as $prop) { - if ($prop[0] == "block") { - $prop[1]->parent = $parentBlock; - } - } - - // copy mixins into scope, set their parents - // bring blocks from import into current block - // TODO: need to mark the source parser these came from this file - foreach ($root->children as $childName => $child) { - if (isset($parentBlock->children[$childName])) { - $parentBlock->children[$childName] = array_merge( - $parentBlock->children[$childName], - $child); - } else { - $parentBlock->children[$childName] = $child; - } - } - - $pi = pathinfo($realPath); - $dir = $pi["dirname"]; - - list($top, $bottom) = $this->sortProps($root->props, true); - $this->compileImportedProps($top, $parentBlock, $out, $parser, $dir); - - return array(true, $bottom, $parser, $dir); - } - - protected function compileImportedProps($props, $block, $out, $sourceParser, $importDir) { - $oldSourceParser = $this->sourceParser; - - $oldImport = $this->importDir; - - // TODO: this is because the importDir api is stupid - $this->importDir = (array)$this->importDir; - array_unshift($this->importDir, $importDir); - - foreach ($props as $prop) { - $this->compileProp($prop, $block, $out); - } - - $this->importDir = $oldImport; - $this->sourceParser = $oldSourceParser; - } - - /** - * Recursively compiles a block. - * - * A block is analogous to a CSS block in most cases. A single LESS document - * is encapsulated in a block when parsed, but it does not have parent tags - * so all of it's children appear on the root level when compiled. - * - * Blocks are made up of props and children. - * - * Props are property instructions, array tuples which describe an action - * to be taken, eg. write a property, set a variable, mixin a block. - * - * The children of a block are just all the blocks that are defined within. - * This is used to look up mixins when performing a mixin. - * - * Compiling the block involves pushing a fresh environment on the stack, - * and iterating through the props, compiling each one. - * - * See lessc::compileProp() - * - */ - protected function compileBlock($block) { - switch ($block->type) { - case "root": - $this->compileRoot($block); - break; - case null: - $this->compileCSSBlock($block); - break; - case "media": - $this->compileMedia($block); - break; - case "directive": - $name = "@" . $block->name; - if (!empty($block->value)) { - $name .= " " . $this->compileValue($this->reduce($block->value)); - } - - $this->compileNestedBlock($block, array($name)); - break; - default: - $this->throwError("unknown block type: $block->type\n"); - } - } - - protected function compileCSSBlock($block) { - $env = $this->pushEnv(); - - $selectors = $this->compileSelectors($block->tags); - $env->selectors = $this->multiplySelectors($selectors); - $out = $this->makeOutputBlock(null, $env->selectors); - - $this->scope->children[] = $out; - $this->compileProps($block, $out); - - $block->scope = $env; // mixins carry scope with them! - $this->popEnv(); - } - - protected function compileMedia($media) { - $env = $this->pushEnv($media); - $parentScope = $this->mediaParent($this->scope); - - $query = $this->compileMediaQuery($this->multiplyMedia($env)); - - $this->scope = $this->makeOutputBlock($media->type, array($query)); - $parentScope->children[] = $this->scope; - - $this->compileProps($media, $this->scope); - - if (count($this->scope->lines) > 0) { - $orphanSelelectors = $this->findClosestSelectors(); - if (!is_null($orphanSelelectors)) { - $orphan = $this->makeOutputBlock(null, $orphanSelelectors); - $orphan->lines = $this->scope->lines; - array_unshift($this->scope->children, $orphan); - $this->scope->lines = array(); - } - } - - $this->scope = $this->scope->parent; - $this->popEnv(); - } - - protected function mediaParent($scope) { - while (!empty($scope->parent)) { - if (!empty($scope->type) && $scope->type != "media") { - break; - } - $scope = $scope->parent; - } - - return $scope; - } - - protected function compileNestedBlock($block, $selectors) { - $this->pushEnv($block); - $this->scope = $this->makeOutputBlock($block->type, $selectors); - $this->scope->parent->children[] = $this->scope; - - $this->compileProps($block, $this->scope); - - $this->scope = $this->scope->parent; - $this->popEnv(); - } - - protected function compileRoot($root) { - $this->pushEnv(); - $this->scope = $this->makeOutputBlock($root->type); - $this->compileProps($root, $this->scope); - $this->popEnv(); - } - - protected function compileProps($block, $out) { - foreach ($this->sortProps($block->props) as $prop) { - $this->compileProp($prop, $block, $out); - } - } - - protected function sortProps($props, $split = false) { - $vars = array(); - $imports = array(); - $other = array(); - - foreach ($props as $prop) { - switch ($prop[0]) { - case "assign": - if (isset($prop[1][0]) && $prop[1][0] == $this->vPrefix) { - $vars[] = $prop; - } else { - $other[] = $prop; - } - break; - case "import": - $id = self::$nextImportId++; - $prop[] = $id; - $imports[] = $prop; - $other[] = array("import_mixin", $id); - break; - default: - $other[] = $prop; - } - } - - if ($split) { - return array(array_merge($vars, $imports), $other); - } else { - return array_merge($vars, $imports, $other); - } - } - - protected function compileMediaQuery($queries) { - $compiledQueries = array(); - foreach ($queries as $query) { - $parts = array(); - foreach ($query as $q) { - switch ($q[0]) { - case "mediaType": - $parts[] = implode(" ", array_slice($q, 1)); - break; - case "mediaExp": - if (isset($q[2])) { - $parts[] = "($q[1]: " . - $this->compileValue($this->reduce($q[2])) . ")"; - } else { - $parts[] = "($q[1])"; - } - break; - case "variable": - $parts[] = $this->compileValue($this->reduce($q)); - break; - } - } - - if (count($parts) > 0) { - $compiledQueries[] = implode(" and ", $parts); - } - } - - $out = "@media"; - if (!empty($parts)) { - $out .= " " . - implode($this->formatter->selectorSeparator, $compiledQueries); - } - return $out; - } - - protected function multiplyMedia($env, $childQueries = null) { - if (is_null($env) || - !empty($env->block->type) && $env->block->type != "media") - { - return $childQueries; - } - - // plain old block, skip - if (empty($env->block->type)) { - return $this->multiplyMedia($env->parent, $childQueries); - } - - $out = array(); - $queries = $env->block->queries; - if (is_null($childQueries)) { - $out = $queries; - } else { - foreach ($queries as $parent) { - foreach ($childQueries as $child) { - $out[] = array_merge($parent, $child); - } - } - } - - return $this->multiplyMedia($env->parent, $out); - } - - protected function expandParentSelectors(&$tag, $replace) { - $parts = explode("$&$", $tag); - $count = 0; - foreach ($parts as &$part) { - $part = str_replace($this->parentSelector, $replace, $part, $c); - $count += $c; - } - $tag = implode($this->parentSelector, $parts); - return $count; - } - - protected function findClosestSelectors() { - $env = $this->env; - $selectors = null; - while ($env !== null) { - if (isset($env->selectors)) { - $selectors = $env->selectors; - break; - } - $env = $env->parent; - } - - return $selectors; - } - - - // multiply $selectors against the nearest selectors in env - protected function multiplySelectors($selectors) { - // find parent selectors - - $parentSelectors = $this->findClosestSelectors(); - if (is_null($parentSelectors)) { - // kill parent reference in top level selector - foreach ($selectors as &$s) { - $this->expandParentSelectors($s, ""); - } - - return $selectors; - } - - $out = array(); - foreach ($parentSelectors as $parent) { - foreach ($selectors as $child) { - $count = $this->expandParentSelectors($child, $parent); - - // don't prepend the parent tag if & was used - if ($count > 0) { - $out[] = trim($child); - } else { - $out[] = trim($parent . ' ' . $child); - } - } - } - - return $out; - } - - // reduces selector expressions - protected function compileSelectors($selectors) { - $out = array(); - - foreach ($selectors as $s) { - if (is_array($s)) { - list(, $value) = $s; - $out[] = trim($this->compileValue($this->reduce($value))); - } else { - $out[] = $s; - } - } - - return $out; - } - - protected function eq($left, $right) { - return $left == $right; - } - - protected function patternMatch($block, $callingArgs) { - // match the guards if it has them - // any one of the groups must have all its guards pass for a match - if (!empty($block->guards)) { - $groupPassed = false; - foreach ($block->guards as $guardGroup) { - foreach ($guardGroup as $guard) { - $this->pushEnv(); - $this->zipSetArgs($block->args, $callingArgs); - - $negate = false; - if ($guard[0] == "negate") { - $guard = $guard[1]; - $negate = true; - } - - $passed = $this->reduce($guard) == self::$TRUE; - if ($negate) $passed = !$passed; - - $this->popEnv(); - - if ($passed) { - $groupPassed = true; - } else { - $groupPassed = false; - break; - } - } - - if ($groupPassed) break; - } - - if (!$groupPassed) { - return false; - } - } - - $numCalling = count($callingArgs); - - if (empty($block->args)) { - return $block->isVararg || $numCalling == 0; - } - - $i = -1; // no args - // try to match by arity or by argument literal - foreach ($block->args as $i => $arg) { - switch ($arg[0]) { - case "lit": - if (empty($callingArgs[$i]) || !$this->eq($arg[1], $callingArgs[$i])) { - return false; - } - break; - case "arg": - // no arg and no default value - if (!isset($callingArgs[$i]) && !isset($arg[2])) { - return false; - } - break; - case "rest": - $i--; // rest can be empty - break 2; - } - } - - if ($block->isVararg) { - return true; // not having enough is handled above - } else { - $numMatched = $i + 1; - // greater than becuase default values always match - return $numMatched >= $numCalling; - } - } - - protected function patternMatchAll($blocks, $callingArgs) { - $matches = null; - foreach ($blocks as $block) { - if ($this->patternMatch($block, $callingArgs)) { - $matches[] = $block; - } - } - - return $matches; - } - - // attempt to find blocks matched by path and args - protected function findBlocks($searchIn, $path, $args, $seen=array()) { - if ($searchIn == null) return null; - if (isset($seen[$searchIn->id])) return null; - $seen[$searchIn->id] = true; - - $name = $path[0]; - - if (isset($searchIn->children[$name])) { - $blocks = $searchIn->children[$name]; - if (count($path) == 1) { - $matches = $this->patternMatchAll($blocks, $args); - if (!empty($matches)) { - // This will return all blocks that match in the closest - // scope that has any matching block, like lessjs - return $matches; - } - } else { - $matches = array(); - foreach ($blocks as $subBlock) { - $subMatches = $this->findBlocks($subBlock, - array_slice($path, 1), $args, $seen); - - if (!is_null($subMatches)) { - foreach ($subMatches as $sm) { - $matches[] = $sm; - } - } - } - - return count($matches) > 0 ? $matches : null; - } - } - - if ($searchIn->parent === $searchIn) return null; - return $this->findBlocks($searchIn->parent, $path, $args, $seen); - } - - // sets all argument names in $args to either the default value - // or the one passed in through $values - protected function zipSetArgs($args, $values) { - $i = 0; - $assignedValues = array(); - foreach ($args as $a) { - if ($a[0] == "arg") { - if ($i < count($values) && !is_null($values[$i])) { - $value = $values[$i]; - } elseif (isset($a[2])) { - $value = $a[2]; - } else $value = null; - - $value = $this->reduce($value); - $this->set($a[1], $value); - $assignedValues[] = $value; - } - $i++; - } - - // check for a rest - $last = end($args); - if ($last[0] == "rest") { - $rest = array_slice($values, count($args) - 1); - $this->set($last[1], $this->reduce(array("list", " ", $rest))); - } - - $this->env->arguments = $assignedValues; - } - - // compile a prop and update $lines or $blocks appropriately - protected function compileProp($prop, $block, $out) { - // set error position context - $this->sourceLoc = isset($prop[-1]) ? $prop[-1] : -1; - - switch ($prop[0]) { - case 'assign': - list(, $name, $value) = $prop; - if ($name[0] == $this->vPrefix) { - $this->set($name, $value); - } else { - $out->lines[] = $this->formatter->property($name, - $this->compileValue($this->reduce($value))); - } - break; - case 'block': - list(, $child) = $prop; - $this->compileBlock($child); - break; - case 'mixin': - list(, $path, $args, $suffix) = $prop; - - $args = array_map(array($this, "reduce"), (array)$args); - $mixins = $this->findBlocks($block, $path, $args); - - if ($mixins === null) { - // fwrite(STDERR,"failed to find block: ".implode(" > ", $path)."\n"); - break; // throw error here?? - } - - foreach ($mixins as $mixin) { - $haveScope = false; - if (isset($mixin->parent->scope)) { - $haveScope = true; - $mixinParentEnv = $this->pushEnv(); - $mixinParentEnv->storeParent = $mixin->parent->scope; - } - - $haveArgs = false; - if (isset($mixin->args)) { - $haveArgs = true; - $this->pushEnv(); - $this->zipSetArgs($mixin->args, $args); - } - - $oldParent = $mixin->parent; - if ($mixin != $block) $mixin->parent = $block; - - foreach ($this->sortProps($mixin->props) as $subProp) { - if ($suffix !== null && - $subProp[0] == "assign" && - is_string($subProp[1]) && - $subProp[1]{0} != $this->vPrefix) - { - $subProp[2] = array( - 'list', ' ', - array($subProp[2], array('keyword', $suffix)) - ); - } - - $this->compileProp($subProp, $mixin, $out); - } - - $mixin->parent = $oldParent; - - if ($haveArgs) $this->popEnv(); - if ($haveScope) $this->popEnv(); - } - - break; - case 'raw': - $out->lines[] = $prop[1]; - break; - case "directive": - list(, $name, $value) = $prop; - $out->lines[] = "@$name " . $this->compileValue($this->reduce($value)).';'; - break; - case "comment": - $out->lines[] = $prop[1]; - break; - case "import"; - list(, $importPath, $importId) = $prop; - $importPath = $this->reduce($importPath); - - if (!isset($this->env->imports)) { - $this->env->imports = array(); - } - - $result = $this->tryImport($importPath, $block, $out); - - $this->env->imports[$importId] = $result === false ? - array(false, "@import " . $this->compileValue($importPath).";") : - $result; - - break; - case "import_mixin": - list(,$importId) = $prop; - $import = $this->env->imports[$importId]; - if ($import[0] === false) { - $out->lines[] = $import[1]; - } else { - list(, $bottom, $parser, $importDir) = $import; - $this->compileImportedProps($bottom, $block, $out, $parser, $importDir); - } - - break; - default: - $this->throwError("unknown op: {$prop[0]}\n"); - } - } - - - /** - * Compiles a primitive value into a CSS property value. - * - * Values in lessphp are typed by being wrapped in arrays, their format is - * typically: - * - * array(type, contents [, additional_contents]*) - * - * The input is expected to be reduced. This function will not work on - * things like expressions and variables. - */ - protected function compileValue($value) { - switch ($value[0]) { - case 'list': - // [1] - delimiter - // [2] - array of values - return implode($value[1], array_map(array($this, 'compileValue'), $value[2])); - case 'raw_color': - if (!empty($this->formatter->compressColors)) { - return $this->compileValue($this->coerceColor($value)); - } - return $value[1]; - case 'keyword': - // [1] - the keyword - return $value[1]; - case 'number': - list(, $num, $unit) = $value; - // [1] - the number - // [2] - the unit - if ($this->numberPrecision !== null) { - $num = round($num, $this->numberPrecision); - } - return $num . $unit; - case 'string': - // [1] - contents of string (includes quotes) - list(, $delim, $content) = $value; - foreach ($content as &$part) { - if (is_array($part)) { - $part = $this->compileValue($part); - } - } - return $delim . implode($content) . $delim; - case 'color': - // [1] - red component (either number or a %) - // [2] - green component - // [3] - blue component - // [4] - optional alpha component - list(, $r, $g, $b) = $value; - $r = round($r); - $g = round($g); - $b = round($b); - - if (count($value) == 5 && $value[4] != 1) { // rgba - return 'rgba('.$r.','.$g.','.$b.','.$value[4].')'; - } - - $h = sprintf("#%02x%02x%02x", $r, $g, $b); - - if (!empty($this->formatter->compressColors)) { - // Converting hex color to short notation (e.g. #003399 to #039) - if ($h[1] === $h[2] && $h[3] === $h[4] && $h[5] === $h[6]) { - $h = '#' . $h[1] . $h[3] . $h[5]; - } - } - - return $h; - - case 'function': - list(, $name, $args) = $value; - return $name.'('.$this->compileValue($args).')'; - default: // assumed to be unit - $this->throwError("unknown value type: $value[0]"); - } - } - - protected function lib_isnumber($value) { - return $this->toBool($value[0] == "number"); - } - - protected function lib_isstring($value) { - return $this->toBool($value[0] == "string"); - } - - protected function lib_iscolor($value) { - return $this->toBool($this->coerceColor($value)); - } - - protected function lib_iskeyword($value) { - return $this->toBool($value[0] == "keyword"); - } - - protected function lib_ispixel($value) { - return $this->toBool($value[0] == "number" && $value[2] == "px"); - } - - protected function lib_ispercentage($value) { - return $this->toBool($value[0] == "number" && $value[2] == "%"); - } - - protected function lib_isem($value) { - return $this->toBool($value[0] == "number" && $value[2] == "em"); - } - - protected function lib_isrem($value) { - return $this->toBool($value[0] == "number" && $value[2] == "rem"); - } - - protected function lib_rgbahex($color) { - $color = $this->coerceColor($color); - if (is_null($color)) - $this->throwError("color expected for rgbahex"); - - return sprintf("#%02x%02x%02x%02x", - isset($color[4]) ? $color[4]*255 : 255, - $color[1],$color[2], $color[3]); - } - - protected function lib_argb($color){ - return $this->lib_rgbahex($color); - } - - // utility func to unquote a string - protected function lib_e($arg) { - switch ($arg[0]) { - case "list": - $items = $arg[2]; - if (isset($items[0])) { - return $this->lib_e($items[0]); - } - return self::$defaultValue; - case "string": - $arg[1] = ""; - return $arg; - case "keyword": - return $arg; - default: - return array("keyword", $this->compileValue($arg)); - } - } - - protected function lib__sprintf($args) { - if ($args[0] != "list") return $args; - $values = $args[2]; - $string = array_shift($values); - $template = $this->compileValue($this->lib_e($string)); - - $i = 0; - if (preg_match_all('/%[dsa]/', $template, $m)) { - foreach ($m[0] as $match) { - $val = isset($values[$i]) ? - $this->reduce($values[$i]) : array('keyword', ''); - - // lessjs compat, renders fully expanded color, not raw color - if ($color = $this->coerceColor($val)) { - $val = $color; - } - - $i++; - $rep = $this->compileValue($this->lib_e($val)); - $template = preg_replace('/'.self::preg_quote($match).'/', - $rep, $template, 1); - } - } - - $d = $string[0] == "string" ? $string[1] : '"'; - return array("string", $d, array($template)); - } - - protected function lib_floor($arg) { - $value = $this->assertNumber($arg); - return array("number", floor($value), $arg[2]); - } - - protected function lib_ceil($arg) { - $value = $this->assertNumber($arg); - return array("number", ceil($value), $arg[2]); - } - - protected function lib_round($arg) { - $value = $this->assertNumber($arg); - return array("number", round($value), $arg[2]); - } - - protected function lib_unit($arg) { - if ($arg[0] == "list") { - list($number, $newUnit) = $arg[2]; - return array("number", $this->assertNumber($number), - $this->compileValue($this->lib_e($newUnit))); - } else { - return array("number", $this->assertNumber($arg), ""); - } - } - - /** - * Helper function to get arguments for color manipulation functions. - * takes a list that contains a color like thing and a percentage - */ - protected function colorArgs($args) { - if ($args[0] != 'list' || count($args[2]) < 2) { - return array(array('color', 0, 0, 0), 0); - } - list($color, $delta) = $args[2]; - $color = $this->assertColor($color); - $delta = floatval($delta[1]); - - return array($color, $delta); - } - - protected function lib_darken($args) { - list($color, $delta) = $this->colorArgs($args); - - $hsl = $this->toHSL($color); - $hsl[3] = $this->clamp($hsl[3] - $delta, 100); - return $this->toRGB($hsl); - } - - protected function lib_lighten($args) { - list($color, $delta) = $this->colorArgs($args); - - $hsl = $this->toHSL($color); - $hsl[3] = $this->clamp($hsl[3] + $delta, 100); - return $this->toRGB($hsl); - } - - protected function lib_saturate($args) { - list($color, $delta) = $this->colorArgs($args); - - $hsl = $this->toHSL($color); - $hsl[2] = $this->clamp($hsl[2] + $delta, 100); - return $this->toRGB($hsl); - } - - protected function lib_desaturate($args) { - list($color, $delta) = $this->colorArgs($args); - - $hsl = $this->toHSL($color); - $hsl[2] = $this->clamp($hsl[2] - $delta, 100); - return $this->toRGB($hsl); - } - - protected function lib_spin($args) { - list($color, $delta) = $this->colorArgs($args); - - $hsl = $this->toHSL($color); - - $hsl[1] = $hsl[1] + $delta % 360; - if ($hsl[1] < 0) $hsl[1] += 360; - - return $this->toRGB($hsl); - } - - protected function lib_fadeout($args) { - list($color, $delta) = $this->colorArgs($args); - $color[4] = $this->clamp((isset($color[4]) ? $color[4] : 1) - $delta/100); - return $color; - } - - protected function lib_fadein($args) { - list($color, $delta) = $this->colorArgs($args); - $color[4] = $this->clamp((isset($color[4]) ? $color[4] : 1) + $delta/100); - return $color; - } - - protected function lib_hue($color) { - $hsl = $this->toHSL($this->assertColor($color)); - return round($hsl[1]); - } - - protected function lib_saturation($color) { - $hsl = $this->toHSL($this->assertColor($color)); - return round($hsl[2]); - } - - protected function lib_lightness($color) { - $hsl = $this->toHSL($this->assertColor($color)); - return round($hsl[3]); - } - - // get the alpha of a color - // defaults to 1 for non-colors or colors without an alpha - protected function lib_alpha($value) { - if (!is_null($color = $this->coerceColor($value))) { - return isset($color[4]) ? $color[4] : 1; - } - } - - // set the alpha of the color - protected function lib_fade($args) { - list($color, $alpha) = $this->colorArgs($args); - $color[4] = $this->clamp($alpha / 100.0); - return $color; - } - - protected function lib_percentage($arg) { - $num = $this->assertNumber($arg); - return array("number", $num*100, "%"); - } - - // mixes two colors by weight - // mix(@color1, @color2, @weight); - // http://sass-lang.com/docs/yardoc/Sass/Script/Functions.html#mix-instance_method - protected function lib_mix($args) { - if ($args[0] != "list" || count($args[2]) < 3) - $this->throwError("mix expects (color1, color2, weight)"); - - list($first, $second, $weight) = $args[2]; - $first = $this->assertColor($first); - $second = $this->assertColor($second); - - $first_a = $this->lib_alpha($first); - $second_a = $this->lib_alpha($second); - $weight = $weight[1] / 100.0; - - $w = $weight * 2 - 1; - $a = $first_a - $second_a; - - $w1 = (($w * $a == -1 ? $w : ($w + $a)/(1 + $w * $a)) + 1) / 2.0; - $w2 = 1.0 - $w1; - - $new = array('color', - $w1 * $first[1] + $w2 * $second[1], - $w1 * $first[2] + $w2 * $second[2], - $w1 * $first[3] + $w2 * $second[3], - ); - - if ($first_a != 1.0 || $second_a != 1.0) { - $new[] = $first_a * $weight + $second_a * ($weight - 1); - } - - return $this->fixColor($new); - } - - protected function lib_contrast($args) { - if ($args[0] != 'list' || count($args[2]) < 3) { - return array(array('color', 0, 0, 0), 0); - } - - list($inputColor, $darkColor, $lightColor) = $args[2]; - - $inputColor = $this->assertColor($inputColor); - $darkColor = $this->assertColor($darkColor); - $lightColor = $this->assertColor($lightColor); - $hsl = $this->toHSL($inputColor); - - if ($hsl[3] > 50) { - return $darkColor; - } - - return $lightColor; - } - - protected function assertColor($value, $error = "expected color value") { - $color = $this->coerceColor($value); - if (is_null($color)) $this->throwError($error); - return $color; - } - - protected function assertNumber($value, $error = "expecting number") { - if ($value[0] == "number") return $value[1]; - $this->throwError($error); - } - - protected function toHSL($color) { - if ($color[0] == 'hsl') return $color; - - $r = $color[1] / 255; - $g = $color[2] / 255; - $b = $color[3] / 255; - - $min = min($r, $g, $b); - $max = max($r, $g, $b); - - $L = ($min + $max) / 2; - if ($min == $max) { - $S = $H = 0; - } else { - if ($L < 0.5) - $S = ($max - $min)/($max + $min); - else - $S = ($max - $min)/(2.0 - $max - $min); - - if ($r == $max) $H = ($g - $b)/($max - $min); - elseif ($g == $max) $H = 2.0 + ($b - $r)/($max - $min); - elseif ($b == $max) $H = 4.0 + ($r - $g)/($max - $min); - - } - - $out = array('hsl', - ($H < 0 ? $H + 6 : $H)*60, - $S*100, - $L*100, - ); - - if (count($color) > 4) $out[] = $color[4]; // copy alpha - return $out; - } - - protected function toRGB_helper($comp, $temp1, $temp2) { - if ($comp < 0) $comp += 1.0; - elseif ($comp > 1) $comp -= 1.0; - - if (6 * $comp < 1) return $temp1 + ($temp2 - $temp1) * 6 * $comp; - if (2 * $comp < 1) return $temp2; - if (3 * $comp < 2) return $temp1 + ($temp2 - $temp1)*((2/3) - $comp) * 6; - - return $temp1; - } - - /** - * Converts a hsl array into a color value in rgb. - * Expects H to be in range of 0 to 360, S and L in 0 to 100 - */ - protected function toRGB($color) { - if ($color[0] == 'color') return $color; - - $H = $color[1] / 360; - $S = $color[2] / 100; - $L = $color[3] / 100; - - if ($S == 0) { - $r = $g = $b = $L; - } else { - $temp2 = $L < 0.5 ? - $L*(1.0 + $S) : - $L + $S - $L * $S; - - $temp1 = 2.0 * $L - $temp2; - - $r = $this->toRGB_helper($H + 1/3, $temp1, $temp2); - $g = $this->toRGB_helper($H, $temp1, $temp2); - $b = $this->toRGB_helper($H - 1/3, $temp1, $temp2); - } - - // $out = array('color', round($r*255), round($g*255), round($b*255)); - $out = array('color', $r*255, $g*255, $b*255); - if (count($color) > 4) $out[] = $color[4]; // copy alpha - return $out; - } - - protected function clamp($v, $max = 1, $min = 0) { - return min($max, max($min, $v)); - } - - /** - * Convert the rgb, rgba, hsl color literals of function type - * as returned by the parser into values of color type. - */ - protected function funcToColor($func) { - $fname = $func[1]; - if ($func[2][0] != 'list') return false; // need a list of arguments - $rawComponents = $func[2][2]; - - if ($fname == 'hsl' || $fname == 'hsla') { - $hsl = array('hsl'); - $i = 0; - foreach ($rawComponents as $c) { - $val = $this->reduce($c); - $val = isset($val[1]) ? floatval($val[1]) : 0; - - if ($i == 0) $clamp = 360; - elseif ($i < 3) $clamp = 100; - else $clamp = 1; - - $hsl[] = $this->clamp($val, $clamp); - $i++; - } - - while (count($hsl) < 4) $hsl[] = 0; - return $this->toRGB($hsl); - - } elseif ($fname == 'rgb' || $fname == 'rgba') { - $components = array(); - $i = 1; - foreach ($rawComponents as $c) { - $c = $this->reduce($c); - if ($i < 4) { - if ($c[0] == "number" && $c[2] == "%") { - $components[] = 255 * ($c[1] / 100); - } else { - $components[] = floatval($c[1]); - } - } elseif ($i == 4) { - if ($c[0] == "number" && $c[2] == "%") { - $components[] = 1.0 * ($c[1] / 100); - } else { - $components[] = floatval($c[1]); - } - } else break; - - $i++; - } - while (count($components) < 3) $components[] = 0; - array_unshift($components, 'color'); - return $this->fixColor($components); - } - - return false; - } - - protected function reduce($value, $forExpression = false) { - switch ($value[0]) { - case "interpolate": - $reduced = $this->reduce($value[1]); - $var = $this->compileValue($reduced); - $res = $this->reduce(array("variable", $this->vPrefix . $var)); - - if (empty($value[2])) $res = $this->lib_e($res); - - return $res; - case "variable": - $key = $value[1]; - if (is_array($key)) { - $key = $this->reduce($key); - $key = $this->vPrefix . $this->compileValue($this->lib_e($key)); - } - - $seen =& $this->env->seenNames; - - if (!empty($seen[$key])) { - $this->throwError("infinite loop detected: $key"); - } - - $seen[$key] = true; - $out = $this->reduce($this->get($key, self::$defaultValue)); - $seen[$key] = false; - return $out; - case "list": - foreach ($value[2] as &$item) { - $item = $this->reduce($item, $forExpression); - } - return $value; - case "expression": - return $this->evaluate($value); - case "string": - foreach ($value[2] as &$part) { - if (is_array($part)) { - $strip = $part[0] == "variable"; - $part = $this->reduce($part); - if ($strip) $part = $this->lib_e($part); - } - } - return $value; - case "escape": - list(,$inner) = $value; - return $this->lib_e($this->reduce($inner)); - case "function": - $color = $this->funcToColor($value); - if ($color) return $color; - - list(, $name, $args) = $value; - if ($name == "%") $name = "_sprintf"; - $f = isset($this->libFunctions[$name]) ? - $this->libFunctions[$name] : array($this, 'lib_'.$name); - - if (is_callable($f)) { - if ($args[0] == 'list') - $args = self::compressList($args[2], $args[1]); - - $ret = call_user_func($f, $this->reduce($args, true), $this); - - if (is_null($ret)) { - return array("string", "", array( - $name, "(", $args, ")" - )); - } - - // convert to a typed value if the result is a php primitive - if (is_numeric($ret)) $ret = array('number', $ret, ""); - elseif (!is_array($ret)) $ret = array('keyword', $ret); - - return $ret; - } - - // plain function, reduce args - $value[2] = $this->reduce($value[2]); - return $value; - case "unary": - list(, $op, $exp) = $value; - $exp = $this->reduce($exp); - - if ($exp[0] == "number") { - switch ($op) { - case "+": - return $exp; - case "-": - $exp[1] *= -1; - return $exp; - } - } - return array("string", "", array($op, $exp)); - } - - if ($forExpression) { - switch ($value[0]) { - case "keyword": - if ($color = $this->coerceColor($value)) { - return $color; - } - break; - case "raw_color": - return $this->coerceColor($value); - } - } - - return $value; - } - - - // coerce a value for use in color operation - protected function coerceColor($value) { - switch($value[0]) { - case 'color': return $value; - case 'raw_color': - $c = array("color", 0, 0, 0); - $colorStr = substr($value[1], 1); - $num = hexdec($colorStr); - $width = strlen($colorStr) == 3 ? 16 : 256; - - for ($i = 3; $i > 0; $i--) { // 3 2 1 - $t = $num % $width; - $num /= $width; - - $c[$i] = $t * (256/$width) + $t * floor(16/$width); - } - - return $c; - case 'keyword': - $name = $value[1]; - if (isset(self::$cssColors[$name])) { - $rgba = explode(',', self::$cssColors[$name]); - - if(isset($rgba[3])) - return array('color', $rgba[0], $rgba[1], $rgba[2], $rgba[3]); - - return array('color', $rgba[0], $rgba[1], $rgba[2]); - } - return null; - } - } - - // make something string like into a string - protected function coerceString($value) { - switch ($value[0]) { - case "string": - return $value; - case "keyword": - return array("string", "", array($value[1])); - } - return null; - } - - // turn list of length 1 into value type - protected function flattenList($value) { - if ($value[0] == "list" && count($value[2]) == 1) { - return $this->flattenList($value[2][0]); - } - return $value; - } - - protected function toBool($a) { - if ($a) return self::$TRUE; - else return self::$FALSE; - } - - // evaluate an expression - protected function evaluate($exp) { - list(, $op, $left, $right, $whiteBefore, $whiteAfter) = $exp; - - $left = $this->reduce($left, true); - $right = $this->reduce($right, true); - - if ($leftColor = $this->coerceColor($left)) { - $left = $leftColor; - } - - if ($rightColor = $this->coerceColor($right)) { - $right = $rightColor; - } - - $ltype = $left[0]; - $rtype = $right[0]; - - // operators that work on all types - if ($op == "and") { - return $this->toBool($left == self::$TRUE && $right == self::$TRUE); - } - - if ($op == "=") { - return $this->toBool($this->eq($left, $right) ); - } - - if ($op == "+" && !is_null($str = $this->stringConcatenate($left, $right))) { - return $str; - } - - // type based operators - $fname = "op_${ltype}_${rtype}"; - if (is_callable(array($this, $fname))) { - $out = $this->$fname($op, $left, $right); - if (!is_null($out)) return $out; - } - - // make the expression look it did before being parsed - $paddedOp = $op; - if ($whiteBefore) $paddedOp = " " . $paddedOp; - if ($whiteAfter) $paddedOp .= " "; - - return array("string", "", array($left, $paddedOp, $right)); - } - - protected function stringConcatenate($left, $right) { - if ($strLeft = $this->coerceString($left)) { - if ($right[0] == "string") { - $right[1] = ""; - } - $strLeft[2][] = $right; - return $strLeft; - } - - if ($strRight = $this->coerceString($right)) { - array_unshift($strRight[2], $left); - return $strRight; - } - } - - - // make sure a color's components don't go out of bounds - protected function fixColor($c) { - foreach (range(1, 3) as $i) { - if ($c[$i] < 0) $c[$i] = 0; - if ($c[$i] > 255) $c[$i] = 255; - } - - return $c; - } - - protected function op_number_color($op, $lft, $rgt) { - if ($op == '+' || $op == '*') { - return $this->op_color_number($op, $rgt, $lft); - } - } - - protected function op_color_number($op, $lft, $rgt) { - if ($rgt[0] == '%') $rgt[1] /= 100; - - return $this->op_color_color($op, $lft, - array_fill(1, count($lft) - 1, $rgt[1])); - } - - protected function op_color_color($op, $left, $right) { - $out = array('color'); - $max = count($left) > count($right) ? count($left) : count($right); - foreach (range(1, $max - 1) as $i) { - $lval = isset($left[$i]) ? $left[$i] : 0; - $rval = isset($right[$i]) ? $right[$i] : 0; - switch ($op) { - case '+': - $out[] = $lval + $rval; - break; - case '-': - $out[] = $lval - $rval; - break; - case '*': - $out[] = $lval * $rval; - break; - case '%': - $out[] = $lval % $rval; - break; - case '/': - if ($rval == 0) $this->throwError("evaluate error: can't divide by zero"); - $out[] = $lval / $rval; - break; - default: - $this->throwError('evaluate error: color op number failed on op '.$op); - } - } - return $this->fixColor($out); - } - - function lib_red($color){ - $color = $this->coerceColor($color); - if (is_null($color)) { - $this->throwError('color expected for red()'); - } - - return $color[1]; - } - - function lib_green($color){ - $color = $this->coerceColor($color); - if (is_null($color)) { - $this->throwError('color expected for green()'); - } - - return $color[2]; - } - - function lib_blue($color){ - $color = $this->coerceColor($color); - if (is_null($color)) { - $this->throwError('color expected for blue()'); - } - - return $color[3]; - } - - - // operator on two numbers - protected function op_number_number($op, $left, $right) { - $unit = empty($left[2]) ? $right[2] : $left[2]; - - $value = 0; - switch ($op) { - case '+': - $value = $left[1] + $right[1]; - break; - case '*': - $value = $left[1] * $right[1]; - break; - case '-': - $value = $left[1] - $right[1]; - break; - case '%': - $value = $left[1] % $right[1]; - break; - case '/': - if ($right[1] == 0) $this->throwError('parse error: divide by zero'); - $value = $left[1] / $right[1]; - break; - case '<': - return $this->toBool($left[1] < $right[1]); - case '>': - return $this->toBool($left[1] > $right[1]); - case '>=': - return $this->toBool($left[1] >= $right[1]); - case '=<': - return $this->toBool($left[1] <= $right[1]); - default: - $this->throwError('parse error: unknown number operator: '.$op); - } - - return array("number", $value, $unit); - } - - - /* environment functions */ - - protected function makeOutputBlock($type, $selectors = null) { - $b = new stdclass; - $b->lines = array(); - $b->children = array(); - $b->selectors = $selectors; - $b->type = $type; - $b->parent = $this->scope; - return $b; - } - - // the state of execution - protected function pushEnv($block = null) { - $e = new stdclass; - $e->parent = $this->env; - $e->store = array(); - $e->block = $block; - - $this->env = $e; - return $e; - } - - // pop something off the stack - protected function popEnv() { - $old = $this->env; - $this->env = $this->env->parent; - return $old; - } - - // set something in the current env - protected function set($name, $value) { - $this->env->store[$name] = $value; - } - - - // get the highest occurrence entry for a name - protected function get($name, $default=null) { - $current = $this->env; - - $isArguments = $name == $this->vPrefix . 'arguments'; - while ($current) { - if ($isArguments && isset($current->arguments)) { - return array('list', ' ', $current->arguments); - } - - if (isset($current->store[$name])) - return $current->store[$name]; - else { - $current = isset($current->storeParent) ? - $current->storeParent : $current->parent; - } - } - - return $default; - } - - // inject array of unparsed strings into environment as variables - protected function injectVariables($args) { - $this->pushEnv(); - $parser = new lessc_parser($this, __METHOD__); - foreach ($args as $name => $strValue) { - if ($name{0} != '@') $name = '@'.$name; - $parser->count = 0; - $parser->buffer = (string)$strValue; - if (!$parser->propertyValue($value)) { - throw new Exception("failed to parse passed in variable $name: $strValue"); - } - - $this->set($name, $value); - } - } - - /** - * Initialize any static state, can initialize parser for a file - * $opts isn't used yet - */ - public function __construct($fname = null) { - if ($fname !== null) { - // used for deprecated parse method - $this->_parseFile = $fname; - } - } - - public function compile($string, $name = null) { - $locale = setlocale(LC_NUMERIC, 0); - setlocale(LC_NUMERIC, "C"); - - $this->parser = $this->makeParser($name); - $root = $this->parser->parse($string); - - $this->env = null; - $this->scope = null; - - $this->formatter = $this->newFormatter(); - - if (!empty($this->registeredVars)) { - $this->injectVariables($this->registeredVars); - } - - $this->sourceParser = $this->parser; // used for error messages - $this->compileBlock($root); - - ob_start(); - $this->formatter->block($this->scope); - $out = ob_get_clean(); - setlocale(LC_NUMERIC, $locale); - return $out; - } - - public function compileFile($fname, $outFname = null) { - if (!is_readable($fname)) { - throw new Exception('load error: failed to find '.$fname); - } - - $pi = pathinfo($fname); - - $oldImport = $this->importDir; - - $this->importDir = (array)$this->importDir; - $this->importDir[] = $pi['dirname'].'/'; - - $this->allParsedFiles = array(); - $this->addParsedFile($fname); - - $out = $this->compile(file_get_contents($fname), $fname); - - $this->importDir = $oldImport; - - if ($outFname !== null) { - return file_put_contents($outFname, $out); - } - - return $out; - } - - // compile only if changed input has changed or output doesn't exist - public function checkedCompile($in, $out) { - if (!is_file($out) || filemtime($in) > filemtime($out)) { - $this->compileFile($in, $out); - return true; - } - return false; - } - - /** - * Execute lessphp on a .less file or a lessphp cache structure - * - * The lessphp cache structure contains information about a specific - * less file having been parsed. It can be used as a hint for future - * calls to determine whether or not a rebuild is required. - * - * The cache structure contains two important keys that may be used - * externally: - * - * compiled: The final compiled CSS - * updated: The time (in seconds) the CSS was last compiled - * - * The cache structure is a plain-ol' PHP associative array and can - * be serialized and unserialized without a hitch. - * - * @param mixed $in Input - * @param bool $force Force rebuild? - * @return array lessphp cache structure - */ - public function cachedCompile($in, $force = false) { - // assume no root - $root = null; - - if (is_string($in)) { - $root = $in; - } elseif (is_array($in) and isset($in['root'])) { - if ($force or ! isset($in['files'])) { - // If we are forcing a recompile or if for some reason the - // structure does not contain any file information we should - // specify the root to trigger a rebuild. - $root = $in['root']; - } elseif (isset($in['files']) and is_array($in['files'])) { - foreach ($in['files'] as $fname => $ftime ) { - if (!file_exists($fname) or filemtime($fname) > $ftime) { - // One of the files we knew about previously has changed - // so we should look at our incoming root again. - $root = $in['root']; - break; - } - } - } - } else { - // TODO: Throw an exception? We got neither a string nor something - // that looks like a compatible lessphp cache structure. - return null; - } - - if ($root !== null) { - // If we have a root value which means we should rebuild. - $out = array(); - $out['root'] = $root; - $out['compiled'] = $this->compileFile($root); - $out['files'] = $this->allParsedFiles(); - $out['updated'] = time(); - return $out; - } else { - // No changes, pass back the structure - // we were given initially. - return $in; - } - - } - - // parse and compile buffer - // This is deprecated - public function parse($str = null, $initialVariables = null) { - if (is_array($str)) { - $initialVariables = $str; - $str = null; - } - - $oldVars = $this->registeredVars; - if ($initialVariables !== null) { - $this->setVariables($initialVariables); - } - - if ($str == null) { - if (empty($this->_parseFile)) { - throw new exception("nothing to parse"); - } - - $out = $this->compileFile($this->_parseFile); - } else { - $out = $this->compile($str); - } - - $this->registeredVars = $oldVars; - return $out; - } - - protected function makeParser($name) { - $parser = new lessc_parser($this, $name); - $parser->writeComments = $this->preserveComments; - - return $parser; - } - - public function setFormatter($name) { - $this->formatterName = $name; - } - - protected function newFormatter() { - $className = "lessc_formatter_lessjs"; - if (!empty($this->formatterName)) { - if (!is_string($this->formatterName)) - return $this->formatterName; - $className = "lessc_formatter_$this->formatterName"; - } - - $className = 'RainLoopVendor\\'.$className; - return new $className; - } - - public function setPreserveComments($preserve) { - $this->preserveComments = $preserve; - } - - public function registerFunction($name, $func) { - $this->libFunctions[$name] = $func; - } - - public function unregisterFunction($name) { - unset($this->libFunctions[$name]); - } - - public function setVariables($variables) { - $this->registeredVars = array_merge($this->registeredVars, $variables); - } - - public function unsetVariable($name) { - unset($this->registeredVars[$name]); - } - - public function setImportDir($dirs) { - $this->importDir = (array)$dirs; - } - - public function addImportDir($dir) { - $this->importDir = (array)$this->importDir; - $this->importDir[] = $dir; - } - - public function allParsedFiles() { - return $this->allParsedFiles; - } - - protected function addParsedFile($file) { - $this->allParsedFiles[realpath($file)] = filemtime($file); - } - - /** - * Uses the current value of $this->count to show line and line number - */ - protected function throwError($msg = null) { - if ($this->sourceLoc >= 0) { - $this->sourceParser->throwError($msg, $this->sourceLoc); - } - throw new exception($msg); - } - - // compile file $in to file $out if $in is newer than $out - // returns true when it compiles, false otherwise - public static function ccompile($in, $out, $less = null) { - if ($less === null) { - $less = new self; - } - return $less->checkedCompile($in, $out); - } - - public static function cexecute($in, $force = false, $less = null) { - if ($less === null) { - $less = new self; - } - return $less->cachedCompile($in, $force); - } - - static protected $cssColors = array( - 'aliceblue' => '240,248,255', - 'antiquewhite' => '250,235,215', - 'aqua' => '0,255,255', - 'aquamarine' => '127,255,212', - 'azure' => '240,255,255', - 'beige' => '245,245,220', - 'bisque' => '255,228,196', - 'black' => '0,0,0', - 'blanchedalmond' => '255,235,205', - 'blue' => '0,0,255', - 'blueviolet' => '138,43,226', - 'brown' => '165,42,42', - 'burlywood' => '222,184,135', - 'cadetblue' => '95,158,160', - 'chartreuse' => '127,255,0', - 'chocolate' => '210,105,30', - 'coral' => '255,127,80', - 'cornflowerblue' => '100,149,237', - 'cornsilk' => '255,248,220', - 'crimson' => '220,20,60', - 'cyan' => '0,255,255', - 'darkblue' => '0,0,139', - 'darkcyan' => '0,139,139', - 'darkgoldenrod' => '184,134,11', - 'darkgray' => '169,169,169', - 'darkgreen' => '0,100,0', - 'darkgrey' => '169,169,169', - 'darkkhaki' => '189,183,107', - 'darkmagenta' => '139,0,139', - 'darkolivegreen' => '85,107,47', - 'darkorange' => '255,140,0', - 'darkorchid' => '153,50,204', - 'darkred' => '139,0,0', - 'darksalmon' => '233,150,122', - 'darkseagreen' => '143,188,143', - 'darkslateblue' => '72,61,139', - 'darkslategray' => '47,79,79', - 'darkslategrey' => '47,79,79', - 'darkturquoise' => '0,206,209', - 'darkviolet' => '148,0,211', - 'deeppink' => '255,20,147', - 'deepskyblue' => '0,191,255', - 'dimgray' => '105,105,105', - 'dimgrey' => '105,105,105', - 'dodgerblue' => '30,144,255', - 'firebrick' => '178,34,34', - 'floralwhite' => '255,250,240', - 'forestgreen' => '34,139,34', - 'fuchsia' => '255,0,255', - 'gainsboro' => '220,220,220', - 'ghostwhite' => '248,248,255', - 'gold' => '255,215,0', - 'goldenrod' => '218,165,32', - 'gray' => '128,128,128', - 'green' => '0,128,0', - 'greenyellow' => '173,255,47', - 'grey' => '128,128,128', - 'honeydew' => '240,255,240', - 'hotpink' => '255,105,180', - 'indianred' => '205,92,92', - 'indigo' => '75,0,130', - 'ivory' => '255,255,240', - 'khaki' => '240,230,140', - 'lavender' => '230,230,250', - 'lavenderblush' => '255,240,245', - 'lawngreen' => '124,252,0', - 'lemonchiffon' => '255,250,205', - 'lightblue' => '173,216,230', - 'lightcoral' => '240,128,128', - 'lightcyan' => '224,255,255', - 'lightgoldenrodyellow' => '250,250,210', - 'lightgray' => '211,211,211', - 'lightgreen' => '144,238,144', - 'lightgrey' => '211,211,211', - 'lightpink' => '255,182,193', - 'lightsalmon' => '255,160,122', - 'lightseagreen' => '32,178,170', - 'lightskyblue' => '135,206,250', - 'lightslategray' => '119,136,153', - 'lightslategrey' => '119,136,153', - 'lightsteelblue' => '176,196,222', - 'lightyellow' => '255,255,224', - 'lime' => '0,255,0', - 'limegreen' => '50,205,50', - 'linen' => '250,240,230', - 'magenta' => '255,0,255', - 'maroon' => '128,0,0', - 'mediumaquamarine' => '102,205,170', - 'mediumblue' => '0,0,205', - 'mediumorchid' => '186,85,211', - 'mediumpurple' => '147,112,219', - 'mediumseagreen' => '60,179,113', - 'mediumslateblue' => '123,104,238', - 'mediumspringgreen' => '0,250,154', - 'mediumturquoise' => '72,209,204', - 'mediumvioletred' => '199,21,133', - 'midnightblue' => '25,25,112', - 'mintcream' => '245,255,250', - 'mistyrose' => '255,228,225', - 'moccasin' => '255,228,181', - 'navajowhite' => '255,222,173', - 'navy' => '0,0,128', - 'oldlace' => '253,245,230', - 'olive' => '128,128,0', - 'olivedrab' => '107,142,35', - 'orange' => '255,165,0', - 'orangered' => '255,69,0', - 'orchid' => '218,112,214', - 'palegoldenrod' => '238,232,170', - 'palegreen' => '152,251,152', - 'paleturquoise' => '175,238,238', - 'palevioletred' => '219,112,147', - 'papayawhip' => '255,239,213', - 'peachpuff' => '255,218,185', - 'peru' => '205,133,63', - 'pink' => '255,192,203', - 'plum' => '221,160,221', - 'powderblue' => '176,224,230', - 'purple' => '128,0,128', - 'red' => '255,0,0', - 'rosybrown' => '188,143,143', - 'royalblue' => '65,105,225', - 'saddlebrown' => '139,69,19', - 'salmon' => '250,128,114', - 'sandybrown' => '244,164,96', - 'seagreen' => '46,139,87', - 'seashell' => '255,245,238', - 'sienna' => '160,82,45', - 'silver' => '192,192,192', - 'skyblue' => '135,206,235', - 'slateblue' => '106,90,205', - 'slategray' => '112,128,144', - 'slategrey' => '112,128,144', - 'snow' => '255,250,250', - 'springgreen' => '0,255,127', - 'steelblue' => '70,130,180', - 'tan' => '210,180,140', - 'teal' => '0,128,128', - 'thistle' => '216,191,216', - 'tomato' => '255,99,71', - 'transparent' => '0,0,0,0', - 'turquoise' => '64,224,208', - 'violet' => '238,130,238', - 'wheat' => '245,222,179', - 'white' => '255,255,255', - 'whitesmoke' => '245,245,245', - 'yellow' => '255,255,0', - 'yellowgreen' => '154,205,50' - ); -} - -// responsible for taking a string of LESS code and converting it into a -// syntax tree -class lessc_parser { - static protected $nextBlockId = 0; // used to uniquely identify blocks - - static protected $precedence = array( - '=<' => 0, - '>=' => 0, - '=' => 0, - '<' => 0, - '>' => 0, - - '+' => 1, - '-' => 1, - '*' => 2, - '/' => 2, - '%' => 2, - ); - - static protected $whitePattern; - static protected $commentMulti; - - static protected $commentSingle = "//"; - static protected $commentMultiLeft = "/*"; - static protected $commentMultiRight = "*/"; - - // regex string to match any of the operators - static protected $operatorString; - - // these properties will supress division unless it's inside parenthases - static protected $supressDivisionProps = - array('/border-radius$/i', '/^font$/i'); - - protected $blockDirectives = array("font-face", "keyframes", "page", "-moz-document"); - protected $lineDirectives = array("charset"); - - /** - * if we are in parens we can be more liberal with whitespace around - * operators because it must evaluate to a single value and thus is less - * ambiguous. - * - * Consider: - * property1: 10 -5; // is two numbers, 10 and -5 - * property2: (10 -5); // should evaluate to 5 - */ - protected $inParens = false; - - // caches preg escaped literals - static protected $literalCache = array(); - - public function __construct($lessc, $sourceName = null) { - $this->eatWhiteDefault = true; - // reference to less needed for vPrefix, mPrefix, and parentSelector - $this->lessc = $lessc; - - $this->sourceName = $sourceName; // name used for error messages - - $this->writeComments = false; - - if (!self::$operatorString) { - self::$operatorString = - '('.implode('|', array_map(array('RainLoopVendor\\lessc', 'preg_quote'), - array_keys(self::$precedence))).')'; - - $commentSingle = lessc::preg_quote(self::$commentSingle); - $commentMultiLeft = lessc::preg_quote(self::$commentMultiLeft); - $commentMultiRight = lessc::preg_quote(self::$commentMultiRight); - - self::$commentMulti = $commentMultiLeft.'.*?'.$commentMultiRight; - self::$whitePattern = '/'.$commentSingle.'[^\n]*\s*|('.self::$commentMulti.')\s*|\s+/Ais'; - } - } - - public function parse($buffer) { - $this->count = 0; - $this->line = 1; - - $this->env = null; // block stack - $this->buffer = $this->writeComments ? $buffer : $this->removeComments($buffer); - $this->pushSpecialBlock("root"); - $this->eatWhiteDefault = true; - $this->seenComments = array(); - - // trim whitespace on head - // if (preg_match('/^\s+/', $this->buffer, $m)) { - // $this->line += substr_count($m[0], "\n"); - // $this->buffer = ltrim($this->buffer); - // } - $this->whitespace(); - - // parse the entire file - $lastCount = $this->count; - while (false !== $this->parseChunk()); - - if ($this->count != strlen($this->buffer)) - $this->throwError(); - - // TODO report where the block was opened - if (!is_null($this->env->parent)) - throw new exception('parse error: unclosed block'); - - return $this->env; - } - - /** - * Parse a single chunk off the head of the buffer and append it to the - * current parse environment. - * Returns false when the buffer is empty, or when there is an error. - * - * This function is called repeatedly until the entire document is - * parsed. - * - * This parser is most similar to a recursive descent parser. Single - * functions represent discrete grammatical rules for the language, and - * they are able to capture the text that represents those rules. - * - * Consider the function lessc::keyword(). (all parse functions are - * structured the same) - * - * The function takes a single reference argument. When calling the - * function it will attempt to match a keyword on the head of the buffer. - * If it is successful, it will place the keyword in the referenced - * argument, advance the position in the buffer, and return true. If it - * fails then it won't advance the buffer and it will return false. - * - * All of these parse functions are powered by lessc::match(), which behaves - * the same way, but takes a literal regular expression. Sometimes it is - * more convenient to use match instead of creating a new function. - * - * Because of the format of the functions, to parse an entire string of - * grammatical rules, you can chain them together using &&. - * - * But, if some of the rules in the chain succeed before one fails, then - * the buffer position will be left at an invalid state. In order to - * avoid this, lessc::seek() is used to remember and set buffer positions. - * - * Before parsing a chain, use $s = $this->seek() to remember the current - * position into $s. Then if a chain fails, use $this->seek($s) to - * go back where we started. - */ - protected function parseChunk() { - if (empty($this->buffer)) return false; - $s = $this->seek(); - - // setting a property - if ($this->keyword($key) && $this->assign() && - $this->propertyValue($value, $key) && $this->end()) - { - $this->append(array('assign', $key, $value), $s); - return true; - } else { - $this->seek($s); - } - - - // look for special css blocks - if ($this->literal('@', false)) { - $this->count--; - - // media - if ($this->literal('@media')) { - if (($this->mediaQueryList($mediaQueries) || true) - && $this->literal('{')) - { - $media = $this->pushSpecialBlock("media"); - $media->queries = is_null($mediaQueries) ? array() : $mediaQueries; - return true; - } else { - $this->seek($s); - return false; - } - } - - if ($this->literal("@", false) && $this->keyword($dirName)) { - if ($this->isDirective($dirName, $this->blockDirectives)) { - if (($this->openString("{", $dirValue, null, array(";")) || true) && - $this->literal("{")) - { - $dir = $this->pushSpecialBlock("directive"); - $dir->name = $dirName; - if (isset($dirValue)) $dir->value = $dirValue; - return true; - } - } elseif ($this->isDirective($dirName, $this->lineDirectives)) { - if ($this->propertyValue($dirValue) && $this->end()) { - $this->append(array("directive", $dirName, $dirValue)); - return true; - } - } - } - - $this->seek($s); - } - - // setting a variable - if ($this->variable($var) && $this->assign() && - $this->propertyValue($value) && $this->end()) - { - $this->append(array('assign', $var, $value), $s); - return true; - } else { - $this->seek($s); - } - - if ($this->import($importValue)) { - $this->append($importValue, $s); - return true; - } - - // opening parametric mixin - if ($this->tag($tag, true) && $this->argumentDef($args, $isVararg) && - ($this->guards($guards) || true) && - $this->literal('{')) - { - $block = $this->pushBlock($this->fixTags(array($tag))); - $block->args = $args; - $block->isVararg = $isVararg; - if (!empty($guards)) $block->guards = $guards; - return true; - } else { - $this->seek($s); - } - - // opening a simple block - if ($this->tags($tags) && $this->literal('{')) { - $tags = $this->fixTags($tags); - $this->pushBlock($tags); - return true; - } else { - $this->seek($s); - } - - // closing a block - if ($this->literal('}', false)) { - try { - $block = $this->pop(); - } catch (exception $e) { - $this->seek($s); - $this->throwError($e->getMessage()); - } - - $hidden = false; - if (is_null($block->type)) { - $hidden = true; - if (!isset($block->args)) { - foreach ($block->tags as $tag) { - if (!is_string($tag) || $tag{0} != $this->lessc->mPrefix) { - $hidden = false; - break; - } - } - } - - foreach ($block->tags as $tag) { - if (is_string($tag)) { - $this->env->children[$tag][] = $block; - } - } - } - - if (!$hidden) { - $this->append(array('block', $block), $s); - } - - // this is done here so comments aren't bundled into he block that - // was just closed - $this->whitespace(); - return true; - } - - // mixin - if ($this->mixinTags($tags) && - ($this->argumentValues($argv) || true) && - ($this->keyword($suffix) || true) && $this->end()) - { - $tags = $this->fixTags($tags); - $this->append(array('mixin', $tags, $argv, $suffix), $s); - return true; - } else { - $this->seek($s); - } - - // spare ; - if ($this->literal(';')) return true; - - return false; // got nothing, throw error - } - - protected function isDirective($dirname, $directives) { - // TODO: cache pattern in parser - $pattern = implode('|', - array_map(array('RainLoopVendor\\lessc', 'preg_quote'), $directives)); - $pattern = '/^(-[a-z-]+-)?(' . $pattern . ')$/i'; - - return preg_match($pattern, $dirname); - } - - protected function fixTags($tags) { - // move @ tags out of variable namespace - foreach ($tags as &$tag) { - if ($tag{0} == $this->lessc->vPrefix) - $tag[0] = $this->lessc->mPrefix; - } - return $tags; - } - - // a list of expressions - protected function expressionList(&$exps) { - $values = array(); - - while ($this->expression($exp)) { - $values[] = $exp; - } - - if (count($values) == 0) return false; - - $exps = lessc::compressList($values, ' '); - return true; - } - - /** - * Attempt to consume an expression. - * @link http://en.wikipedia.org/wiki/Operator-precedence_parser#Pseudo-code - */ - protected function expression(&$out) { - if ($this->value($lhs)) { - $out = $this->expHelper($lhs, 0); - - // look for / shorthand - if (!empty($this->env->supressedDivision)) { - unset($this->env->supressedDivision); - $s = $this->seek(); - if ($this->literal("/") && $this->value($rhs)) { - $out = array("list", "", - array($out, array("keyword", "/"), $rhs)); - } else { - $this->seek($s); - } - } - - return true; - } - return false; - } - - /** - * recursively parse infix equation with $lhs at precedence $minP - */ - protected function expHelper($lhs, $minP) { - $this->inExp = true; - $ss = $this->seek(); - - while (true) { - $whiteBefore = isset($this->buffer[$this->count - 1]) && - ctype_space($this->buffer[$this->count - 1]); - - // If there is whitespace before the operator, then we require - // whitespace after the operator for it to be an expression - $needWhite = $whiteBefore && !$this->inParens; - - if ($this->match(self::$operatorString.($needWhite ? '\s' : ''), $m) && self::$precedence[$m[1]] >= $minP) { - if (!$this->inParens && isset($this->env->currentProperty) && $m[1] == "/" && empty($this->env->supressedDivision)) { - foreach (self::$supressDivisionProps as $pattern) { - if (preg_match($pattern, $this->env->currentProperty)) { - $this->env->supressedDivision = true; - break 2; - } - } - } - - - $whiteAfter = isset($this->buffer[$this->count - 1]) && - ctype_space($this->buffer[$this->count - 1]); - - if (!$this->value($rhs)) break; - - // peek for next operator to see what to do with rhs - if ($this->peek(self::$operatorString, $next) && self::$precedence[$next[1]] > self::$precedence[$m[1]]) { - $rhs = $this->expHelper($rhs, self::$precedence[$next[1]]); - } - - $lhs = array('expression', $m[1], $lhs, $rhs, $whiteBefore, $whiteAfter); - $ss = $this->seek(); - - continue; - } - - break; - } - - $this->seek($ss); - - return $lhs; - } - - // consume a list of values for a property - public function propertyValue(&$value, $keyName = null) { - $values = array(); - - if ($keyName !== null) $this->env->currentProperty = $keyName; - - $s = null; - while ($this->expressionList($v)) { - $values[] = $v; - $s = $this->seek(); - if (!$this->literal(',')) break; - } - - if ($s) $this->seek($s); - - if ($keyName !== null) unset($this->env->currentProperty); - - if (count($values) == 0) return false; - - $value = lessc::compressList($values, ', '); - return true; - } - - protected function parenValue(&$out) { - $s = $this->seek(); - - // speed shortcut - if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] != "(") { - return false; - } - - $inParens = $this->inParens; - if ($this->literal("(") && - ($this->inParens = true) && $this->expression($exp) && - $this->literal(")")) - { - $out = $exp; - $this->inParens = $inParens; - return true; - } else { - $this->inParens = $inParens; - $this->seek($s); - } - - return false; - } - - // a single value - protected function value(&$value) { - $s = $this->seek(); - - // speed shortcut - if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] == "-") { - // negation - if ($this->literal("-", false) && - (($this->variable($inner) && $inner = array("variable", $inner)) || - $this->unit($inner) || - $this->parenValue($inner))) - { - $value = array("unary", "-", $inner); - return true; - } else { - $this->seek($s); - } - } - - if ($this->parenValue($value)) return true; - if ($this->unit($value)) return true; - if ($this->color($value)) return true; - if ($this->func($value)) return true; - if ($this->string($value)) return true; - - if ($this->keyword($word)) { - $value = array('keyword', $word); - return true; - } - - // try a variable - if ($this->variable($var)) { - $value = array('variable', $var); - return true; - } - - // unquote string (should this work on any type? - if ($this->literal("~") && $this->string($str)) { - $value = array("escape", $str); - return true; - } else { - $this->seek($s); - } - - // css hack: \0 - if ($this->literal('\\') && $this->match('([0-9]+)', $m)) { - $value = array('keyword', '\\'.$m[1]); - return true; - } else { - $this->seek($s); - } - - return false; - } - - // an import statement - protected function import(&$out) { - $s = $this->seek(); - if (!$this->literal('@import')) return false; - - // @import "something.css" media; - // @import url("something.css") media; - // @import url(something.css) media; - - if ($this->propertyValue($value)) { - $out = array("import", $value); - return true; - } - } - - protected function mediaQueryList(&$out) { - if ($this->genericList($list, "mediaQuery", ",", false)) { - $out = $list[2]; - return true; - } - return false; - } - - protected function mediaQuery(&$out) { - $s = $this->seek(); - - $expressions = null; - $parts = array(); - - if (($this->literal("only") && ($only = true) || $this->literal("not") && ($not = true) || true) && $this->keyword($mediaType)) { - $prop = array("mediaType"); - if (isset($only)) $prop[] = "only"; - if (isset($not)) $prop[] = "not"; - $prop[] = $mediaType; - $parts[] = $prop; - } else { - $this->seek($s); - } - - - if (!empty($mediaType) && !$this->literal("and")) { - // ~ - } else { - $this->genericList($expressions, "mediaExpression", "and", false); - if (is_array($expressions)) $parts = array_merge($parts, $expressions[2]); - } - - if (count($parts) == 0) { - $this->seek($s); - return false; - } - - $out = $parts; - return true; - } - - protected function mediaExpression(&$out) { - $s = $this->seek(); - $value = null; - if ($this->literal("(") && - $this->keyword($feature) && - ($this->literal(":") && $this->expression($value) || true) && - $this->literal(")")) - { - $out = array("mediaExp", $feature); - if ($value) $out[] = $value; - return true; - } elseif ($this->variable($variable)) { - $out = array('variable', $variable); - return true; - } - - $this->seek($s); - return false; - } - - // an unbounded string stopped by $end - protected function openString($end, &$out, $nestingOpen=null, $rejectStrs = null) { - $oldWhite = $this->eatWhiteDefault; - $this->eatWhiteDefault = false; - - $stop = array("'", '"', "@{", $end); - $stop = array_map(array('RainLoopVendor\\lessc', 'preg_quote'), $stop); - // $stop[] = self::$commentMulti; - - if (!is_null($rejectStrs)) { - $stop = array_merge($stop, $rejectStrs); - } - - $patt = '(.*?)('.implode("|", $stop).')'; - - $nestingLevel = 0; - - $content = array(); - while ($this->match($patt, $m, false)) { - if (!empty($m[1])) { - $content[] = $m[1]; - if ($nestingOpen) { - $nestingLevel += substr_count($m[1], $nestingOpen); - } - } - - $tok = $m[2]; - - $this->count-= strlen($tok); - if ($tok == $end) { - if ($nestingLevel == 0) { - break; - } else { - $nestingLevel--; - } - } - - if (($tok == "'" || $tok == '"') && $this->string($str)) { - $content[] = $str; - continue; - } - - if ($tok == "@{" && $this->interpolation($inter)) { - $content[] = $inter; - continue; - } - - if (!empty($rejectStrs) && in_array($tok, $rejectStrs)) { - $ount = null; - break; - } - - $content[] = $tok; - $this->count+= strlen($tok); - } - - $this->eatWhiteDefault = $oldWhite; - - if (count($content) == 0) return false; - - // trim the end - if (is_string(end($content))) { - $content[count($content) - 1] = rtrim(end($content)); - } - - $out = array("string", "", $content); - return true; - } - - protected function string(&$out) { - $s = $this->seek(); - if ($this->literal('"', false)) { - $delim = '"'; - } elseif ($this->literal("'", false)) { - $delim = "'"; - } else { - return false; - } - - $content = array(); - - // look for either ending delim , escape, or string interpolation - $patt = '([^\n]*?)(@\{|\\\\|' . - lessc::preg_quote($delim).')'; - - $oldWhite = $this->eatWhiteDefault; - $this->eatWhiteDefault = false; - - while ($this->match($patt, $m, false)) { - $content[] = $m[1]; - if ($m[2] == "@{") { - $this->count -= strlen($m[2]); - if ($this->interpolation($inter, false)) { - $content[] = $inter; - } else { - $this->count += strlen($m[2]); - $content[] = "@{"; // ignore it - } - } elseif ($m[2] == '\\') { - $content[] = $m[2]; - if ($this->literal($delim, false)) { - $content[] = $delim; - } - } else { - $this->count -= strlen($delim); - break; // delim - } - } - - $this->eatWhiteDefault = $oldWhite; - - if ($this->literal($delim)) { - $out = array("string", $delim, $content); - return true; - } - - $this->seek($s); - return false; - } - - protected function interpolation(&$out) { - $oldWhite = $this->eatWhiteDefault; - $this->eatWhiteDefault = true; - - $s = $this->seek(); - if ($this->literal("@{") && - $this->openString("}", $interp, null, array("'", '"', ";")) && - $this->literal("}", false)) - { - $out = array("interpolate", $interp); - $this->eatWhiteDefault = $oldWhite; - if ($this->eatWhiteDefault) $this->whitespace(); - return true; - } - - $this->eatWhiteDefault = $oldWhite; - $this->seek($s); - return false; - } - - protected function unit(&$unit) { - // speed shortcut - if (isset($this->buffer[$this->count])) { - $char = $this->buffer[$this->count]; - if (!ctype_digit($char) && $char != ".") return false; - } - - if ($this->match('([0-9]+(?:\.[0-9]*)?|\.[0-9]+)([%a-zA-Z]+)?', $m)) { - $unit = array("number", $m[1], empty($m[2]) ? "" : $m[2]); - return true; - } - return false; - } - - // a # color - protected function color(&$out) { - if ($this->match('(#(?:[0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{3}))', $m)) { - if (strlen($m[1]) > 7) { - $out = array("string", "", array($m[1])); - } else { - $out = array("raw_color", $m[1]); - } - return true; - } - - return false; - } - - // consume a list of property values delimited by ; and wrapped in () - protected function argumentValues(&$args, $delim = ',') { - $s = $this->seek(); - if (!$this->literal('(')) return false; - - $values = array(); - while (true) { - if ($this->expressionList($value)) $values[] = $value; - if (!$this->literal($delim)) break; - else { - if ($value == null) $values[] = null; - $value = null; - } - } - - if (!$this->literal(')')) { - $this->seek($s); - return false; - } - - $args = $values; - return true; - } - - // consume an argument definition list surrounded by () - // each argument is a variable name with optional value - // or at the end a ... or a variable named followed by ... - protected function argumentDef(&$args, &$isVararg, $delim = ',') { - $s = $this->seek(); - if (!$this->literal('(')) return false; - - $values = array(); - - $isVararg = false; - while (true) { - if ($this->literal("...")) { - $isVararg = true; - break; - } - - if ($this->variable($vname)) { - $arg = array("arg", $vname); - $ss = $this->seek(); - if ($this->assign() && $this->expressionList($value)) { - $arg[] = $value; - } else { - $this->seek($ss); - if ($this->literal("...")) { - $arg[0] = "rest"; - $isVararg = true; - } - } - $values[] = $arg; - if ($isVararg) break; - continue; - } - - if ($this->value($literal)) { - $values[] = array("lit", $literal); - } - - if (!$this->literal($delim)) break; - } - - if (!$this->literal(')')) { - $this->seek($s); - return false; - } - - $args = $values; - - return true; - } - - // consume a list of tags - // this accepts a hanging delimiter - protected function tags(&$tags, $simple = false, $delim = ',') { - $tags = array(); - while ($this->tag($tt, $simple)) { - $tags[] = $tt; - if (!$this->literal($delim)) break; - } - if (count($tags) == 0) return false; - - return true; - } - - // list of tags of specifying mixin path - // optionally separated by > (lazy, accepts extra >) - protected function mixinTags(&$tags) { - $s = $this->seek(); - $tags = array(); - while ($this->tag($tt, true)) { - $tags[] = $tt; - $this->literal(">"); - } - - if (count($tags) == 0) return false; - - return true; - } - - // a bracketed value (contained within in a tag definition) - protected function tagBracket(&$value) { - // speed shortcut - if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] != "[") { - return false; - } - - $s = $this->seek(); - if ($this->literal('[') && $this->to(']', $c, true) && $this->literal(']', false)) { - $value = '['.$c.']'; - // whitespace? - if ($this->whitespace()) $value .= " "; - - // escape parent selector, (yuck) - $value = str_replace($this->lessc->parentSelector, "$&$", $value); - return true; - } - - $this->seek($s); - return false; - } - - protected function tagExpression(&$value) { - $s = $this->seek(); - if ($this->literal("(") && $this->expression($exp) && $this->literal(")")) { - $value = array('exp', $exp); - return true; - } - - $this->seek($s); - return false; - } - - // a space separated list of selectors - protected function tag(&$tag, $simple = false) { - if ($simple) - $chars = '^@,:;{}\][>\(\) "\''; - else - $chars = '^@,;{}["\''; - - $s = $this->seek(); - - if (!$simple && $this->tagExpression($tag)) { - return true; - } - - $hasExpression = false; - $parts = array(); - while ($this->tagBracket($first)) $parts[] = $first; - - $oldWhite = $this->eatWhiteDefault; - $this->eatWhiteDefault = false; - - while (true) { - if ($this->match('(['.$chars.'0-9]['.$chars.']*)', $m)) { - $parts[] = $m[1]; - if ($simple) break; - - while ($this->tagBracket($brack)) { - $parts[] = $brack; - } - continue; - } - - if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] == "@") { - if ($this->interpolation($interp)) { - $hasExpression = true; - $interp[2] = true; // don't unescape - $parts[] = $interp; - continue; - } - - if ($this->literal("@")) { - $parts[] = "@"; - continue; - } - } - - if ($this->unit($unit)) { // for keyframes - $parts[] = $unit[1]; - $parts[] = $unit[2]; - continue; - } - - break; - } - - $this->eatWhiteDefault = $oldWhite; - if (!$parts) { - $this->seek($s); - return false; - } - - if ($hasExpression) { - $tag = array("exp", array("string", "", $parts)); - } else { - $tag = trim(implode($parts)); - } - - $this->whitespace(); - return true; - } - - // a css function - protected function func(&$func) { - $s = $this->seek(); - - if ($this->match('(%|[\w\-_][\w\-_:\.]+|[\w_])', $m) && $this->literal('(')) { - $fname = $m[1]; - - $sPreArgs = $this->seek(); - - $args = array(); - while (true) { - $ss = $this->seek(); - // this ugly nonsense is for ie filter properties - if ($this->keyword($name) && $this->literal('=') && $this->expressionList($value)) { - $args[] = array("string", "", array($name, "=", $value)); - } else { - $this->seek($ss); - if ($this->expressionList($value)) { - $args[] = $value; - } - } - - if (!$this->literal(',')) break; - } - $args = array('list', ',', $args); - - if ($this->literal(')')) { - $func = array('function', $fname, $args); - return true; - } elseif ($fname == 'url') { - // couldn't parse and in url? treat as string - $this->seek($sPreArgs); - if ($this->openString(")", $string) && $this->literal(")")) { - $func = array('function', $fname, $string); - return true; - } - } - } - - $this->seek($s); - return false; - } - - // consume a less variable - protected function variable(&$name) { - $s = $this->seek(); - if ($this->literal($this->lessc->vPrefix, false) && - ($this->variable($sub) || $this->keyword($name))) - { - if (!empty($sub)) { - $name = array('variable', $sub); - } else { - $name = $this->lessc->vPrefix.$name; - } - return true; - } - - $name = null; - $this->seek($s); - return false; - } - - /** - * Consume an assignment operator - * Can optionally take a name that will be set to the current property name - */ - protected function assign($name = null) { - if ($name) $this->currentProperty = $name; - return $this->literal(':') || $this->literal('='); - } - - // consume a keyword - protected function keyword(&$word) { - if ($this->match('([\w_\-\*!"][\w\-_"]*)', $m)) { - $word = $m[1]; - return true; - } - return false; - } - - // consume an end of statement delimiter - protected function end() { - if ($this->literal(';')) { - return true; - } elseif ($this->count == strlen($this->buffer) || $this->buffer{$this->count} == '}') { - // if there is end of file or a closing block next then we don't need a ; - return true; - } - return false; - } - - protected function guards(&$guards) { - $s = $this->seek(); - - if (!$this->literal("when")) { - $this->seek($s); - return false; - } - - $guards = array(); - - while ($this->guardGroup($g)) { - $guards[] = $g; - if (!$this->literal(",")) break; - } - - if (count($guards) == 0) { - $guards = null; - $this->seek($s); - return false; - } - - return true; - } - - // a bunch of guards that are and'd together - // TODO rename to guardGroup - protected function guardGroup(&$guardGroup) { - $s = $this->seek(); - $guardGroup = array(); - while ($this->guard($guard)) { - $guardGroup[] = $guard; - if (!$this->literal("and")) break; - } - - if (count($guardGroup) == 0) { - $guardGroup = null; - $this->seek($s); - return false; - } - - return true; - } - - protected function guard(&$guard) { - $s = $this->seek(); - $negate = $this->literal("not"); - - if ($this->literal("(") && $this->expression($exp) && $this->literal(")")) { - $guard = $exp; - if ($negate) $guard = array("negate", $guard); - return true; - } - - $this->seek($s); - return false; - } - - /* raw parsing functions */ - - protected function literal($what, $eatWhitespace = null) { - if ($eatWhitespace === null) $eatWhitespace = $this->eatWhiteDefault; - - // shortcut on single letter - if (!isset($what[1]) && isset($this->buffer[$this->count])) { - if ($this->buffer[$this->count] == $what) { - if (!$eatWhitespace) { - $this->count++; - return true; - } - // goes below... - } else { - return false; - } - } - - if (!isset(self::$literalCache[$what])) { - self::$literalCache[$what] = lessc::preg_quote($what); - } - - return $this->match(self::$literalCache[$what], $m, $eatWhitespace); - } - - protected function genericList(&$out, $parseItem, $delim="", $flatten=true) { - $s = $this->seek(); - $items = array(); - while ($this->$parseItem($value)) { - $items[] = $value; - if ($delim) { - if (!$this->literal($delim)) break; - } - } - - if (count($items) == 0) { - $this->seek($s); - return false; - } - - if ($flatten && count($items) == 1) { - $out = $items[0]; - } else { - $out = array("list", $delim, $items); - } - - return true; - } - - - // advance counter to next occurrence of $what - // $until - don't include $what in advance - // $allowNewline, if string, will be used as valid char set - protected function to($what, &$out, $until = false, $allowNewline = false) { - if (is_string($allowNewline)) { - $validChars = $allowNewline; - } else { - $validChars = $allowNewline ? "." : "[^\n]"; - } - if (!$this->match('('.$validChars.'*?)'.lessc::preg_quote($what), $m, !$until)) return false; - if ($until) $this->count -= strlen($what); // give back $what - $out = $m[1]; - return true; - } - - // try to match something on head of buffer - protected function match($regex, &$out, $eatWhitespace = null) { - if ($eatWhitespace === null) $eatWhitespace = $this->eatWhiteDefault; - - $r = '/'.$regex.($eatWhitespace && !$this->writeComments ? '\s*' : '').'/Ais'; - if (preg_match($r, $this->buffer, $out, null, $this->count)) { - $this->count += strlen($out[0]); - if ($eatWhitespace && $this->writeComments) $this->whitespace(); - return true; - } - return false; - } - - // match some whitespace - protected function whitespace() { - if ($this->writeComments) { - $gotWhite = false; - while (preg_match(self::$whitePattern, $this->buffer, $m, null, $this->count)) { - if (isset($m[1]) && empty($this->commentsSeen[$this->count])) { - $this->append(array("comment", $m[1])); - $this->commentsSeen[$this->count] = true; - } - $this->count += strlen($m[0]); - $gotWhite = true; - } - return $gotWhite; - } else { - $this->match("", $m); - return strlen($m[0]) > 0; - } - } - - // match something without consuming it - protected function peek($regex, &$out = null, $from=null) { - if (is_null($from)) $from = $this->count; - $r = '/'.$regex.'/Ais'; - $result = preg_match($r, $this->buffer, $out, null, $from); - - return $result; - } - - // seek to a spot in the buffer or return where we are on no argument - protected function seek($where = null) { - if ($where === null) return $this->count; - else $this->count = $where; - return true; - } - - /* misc functions */ - - public function throwError($msg = "parse error", $count = null) { - $count = is_null($count) ? $this->count : $count; - - $line = $this->line + - substr_count(substr($this->buffer, 0, $count), "\n"); - - if (!empty($this->sourceName)) { - $loc = "$this->sourceName on line $line"; - } else { - $loc = "line: $line"; - } - - // TODO this depends on $this->count - if ($this->peek("(.*?)(\n|$)", $m, $count)) { - throw new exception("$msg: failed at `$m[1]` $loc"); - } else { - throw new exception("$msg: $loc"); - } - } - - protected function pushBlock($selectors=null, $type=null) { - $b = new stdclass; - $b->parent = $this->env; - - $b->type = $type; - $b->id = self::$nextBlockId++; - - $b->isVararg = false; // TODO: kill me from here - $b->tags = $selectors; - - $b->props = array(); - $b->children = array(); - - $this->env = $b; - return $b; - } - - // push a block that doesn't multiply tags - protected function pushSpecialBlock($type) { - return $this->pushBlock(null, $type); - } - - // append a property to the current block - protected function append($prop, $pos = null) { - if ($pos !== null) $prop[-1] = $pos; - $this->env->props[] = $prop; - } - - // pop something off the stack - protected function pop() { - $old = $this->env; - $this->env = $this->env->parent; - return $old; - } - - // remove comments from $text - // todo: make it work for all functions, not just url - protected function removeComments($text) { - $look = array( - 'url(', '//', '/*', '"', "'" - ); - - $out = ''; - $min = null; - while (true) { - // find the next item - foreach ($look as $token) { - $pos = strpos($text, $token); - if ($pos !== false) { - if (!isset($min) || $pos < $min[1]) $min = array($token, $pos); - } - } - - if (is_null($min)) break; - - $count = $min[1]; - $skip = 0; - $newlines = 0; - switch ($min[0]) { - case 'url(': - if (preg_match('/url\(.*?\)/', $text, $m, 0, $count)) - $count += strlen($m[0]) - strlen($min[0]); - break; - case '"': - case "'": - if (preg_match('/'.$min[0].'.*?'.$min[0].'/', $text, $m, 0, $count)) - $count += strlen($m[0]) - 1; - break; - case '//': - $skip = strpos($text, "\n", $count); - if ($skip === false) $skip = strlen($text) - $count; - else $skip -= $count; - break; - case '/*': - if (preg_match('/\/\*.*?\*\//s', $text, $m, 0, $count)) { - $skip = strlen($m[0]); - $newlines = substr_count($m[0], "\n"); - } - break; - } - - if ($skip == 0) $count += strlen($min[0]); - - $out .= substr($text, 0, $count).str_repeat("\n", $newlines); - $text = substr($text, $count + $skip); - - $min = null; - } - - return $out.$text; - } - -} - -class lessc_formatter_classic { - public $indentChar = " "; - - public $break = "\n"; - public $open = " {"; - public $close = "}"; - public $selectorSeparator = ", "; - public $assignSeparator = ":"; - - public $openSingle = " { "; - public $closeSingle = " }"; - - public $disableSingle = false; - public $breakSelectors = false; - - public $compressColors = false; - - public function __construct() { - $this->indentLevel = 0; - } - - public function indentStr($n = 0) { - return str_repeat($this->indentChar, max($this->indentLevel + $n, 0)); - } - - public function property($name, $value) { - return $name . $this->assignSeparator . $value . ";"; - } - - protected function isEmpty($block) { - if (empty($block->lines)) { - foreach ($block->children as $child) { - if (!$this->isEmpty($child)) return false; - } - - return true; - } - return false; - } - - public function block($block) { - if ($this->isEmpty($block)) return; - - $inner = $pre = $this->indentStr(); - - $isSingle = !$this->disableSingle && - is_null($block->type) && count($block->lines) == 1; - - if (!empty($block->selectors)) { - $this->indentLevel++; - - if ($this->breakSelectors) { - $selectorSeparator = $this->selectorSeparator . $this->break . $pre; - } else { - $selectorSeparator = $this->selectorSeparator; - } - - echo $pre . - implode($selectorSeparator, $block->selectors); - if ($isSingle) { - echo $this->openSingle; - $inner = ""; - } else { - echo $this->open . $this->break; - $inner = $this->indentStr(); - } - - } - - if (!empty($block->lines)) { - $glue = $this->break.$inner; - echo $inner . implode($glue, $block->lines); - if (!$isSingle && !empty($block->children)) { - echo $this->break; - } - } - - foreach ($block->children as $child) { - $this->block($child); - } - - if (!empty($block->selectors)) { - if (!$isSingle && empty($block->children)) echo $this->break; - - if ($isSingle) { - echo $this->closeSingle . $this->break; - } else { - echo $pre . $this->close . $this->break; - } - - $this->indentLevel--; - } - } -} - -class lessc_formatter_compressed extends lessc_formatter_classic { - public $disableSingle = true; - public $open = "{"; - public $selectorSeparator = ","; - public $assignSeparator = ":"; - public $break = ""; - public $compressColors = true; - - public function indentStr($n = 0) { - return ""; - } -} - -class lessc_formatter_lessjs extends lessc_formatter_classic { - public $disableSingle = true; - public $breakSelectors = true; - public $assignSeparator = ": "; - public $selectorSeparator = ","; -} - - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/_pclzip.lib.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/_pclzip.lib.php deleted file mode 100755 index a93e2212..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/_pclzip.lib.php +++ /dev/null @@ -1,5693 +0,0 @@ -zipname = $p_zipname; - $this->zip_fd = 0; - $this->magic_quotes_status = -1; - - // ----- Return - return; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : - // create($p_filelist, $p_add_dir="", $p_remove_dir="") - // create($p_filelist, $p_option, $p_option_value, ...) - // Description : - // This method supports two different synopsis. The first one is historical. - // This method creates a Zip Archive. The Zip file is created in the - // filesystem. The files and directories indicated in $p_filelist - // are added in the archive. See the parameters description for the - // supported format of $p_filelist. - // When a directory is in the list, the directory and its content is added - // in the archive. - // In this synopsis, the function takes an optional variable list of - // options. See bellow the supported options. - // Parameters : - // $p_filelist : An array containing file or directory names, or - // a string containing one filename or one directory name, or - // a string containing a list of filenames and/or directory - // names separated by spaces. - // $p_add_dir : A path to add before the real path of the archived file, - // in order to have it memorized in the archive. - // $p_remove_dir : A path to remove from the real path of the file to archive, - // in order to have a shorter path memorized in the archive. - // When $p_add_dir and $p_remove_dir are set, $p_remove_dir - // is removed first, before $p_add_dir is added. - // Options : - // PCLZIP_OPT_ADD_PATH : - // PCLZIP_OPT_REMOVE_PATH : - // PCLZIP_OPT_REMOVE_ALL_PATH : - // PCLZIP_OPT_COMMENT : - // PCLZIP_CB_PRE_ADD : - // PCLZIP_CB_POST_ADD : - // Return Values : - // 0 on failure, - // The list of the added files, with a status of the add action. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - function create($p_filelist) - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Set default values - $v_options = array(); - $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; - - // ----- Look for variable options arguments - $v_size = func_num_args(); - - // ----- Look for arguments - if ($v_size > 1) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Remove from the options list the first argument - array_shift($v_arg_list); - $v_size--; - - // ----- Look for first arg - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_REMOVE_PATH => 'optional', - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', - PCLZIP_OPT_ADD_PATH => 'optional', - PCLZIP_CB_PRE_ADD => 'optional', - PCLZIP_CB_POST_ADD => 'optional', - PCLZIP_OPT_NO_COMPRESSION => 'optional', - PCLZIP_OPT_COMMENT => 'optional', - PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', - PCLZIP_OPT_TEMP_FILE_ON => 'optional', - PCLZIP_OPT_TEMP_FILE_OFF => 'optional' - //, PCLZIP_OPT_CRYPT => 'optional' - )); - if ($v_result != 1) { - return 0; - } - } - - // ----- Look for 2 args - // Here we need to support the first historic synopsis of the - // method. - else { - - // ----- Get the first argument - $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0]; - - // ----- Look for the optional second argument - if ($v_size == 2) { - $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; - } - else if ($v_size > 2) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, - "Invalid number / type of arguments"); - return 0; - } - } - } - - // ----- Look for default option values - $this->privOptionDefaultThreshold($v_options); - - // ----- Init - $v_string_list = array(); - $v_att_list = array(); - $v_filedescr_list = array(); - $p_result_list = array(); - - // ----- Look if the $p_filelist is really an array - if (is_array($p_filelist)) { - - // ----- Look if the first element is also an array - // This will mean that this is a file description entry - if (isset($p_filelist[0]) && is_array($p_filelist[0])) { - $v_att_list = $p_filelist; - } - - // ----- The list is a list of string names - else { - $v_string_list = $p_filelist; - } - } - - // ----- Look if the $p_filelist is a string - else if (is_string($p_filelist)) { - // ----- Create a list from the string - $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); - } - - // ----- Invalid variable type for $p_filelist - else { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist"); - return 0; - } - - // ----- Reformat the string list - if (sizeof($v_string_list) != 0) { - foreach ($v_string_list as $v_string) { - if ($v_string != '') { - $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; - } - else { - } - } - } - - // ----- For each file in the list check the attributes - $v_supported_attributes - = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' - ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' - ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' - ,PCLZIP_ATT_FILE_MTIME => 'optional' - ,PCLZIP_ATT_FILE_CONTENT => 'optional' - ,PCLZIP_ATT_FILE_COMMENT => 'optional' - ); - foreach ($v_att_list as $v_entry) { - $v_result = $this->privFileDescrParseAtt($v_entry, - $v_filedescr_list[], - $v_options, - $v_supported_attributes); - if ($v_result != 1) { - return 0; - } - } - - // ----- Expand the filelist (expand directories) - $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); - if ($v_result != 1) { - return 0; - } - - // ----- Call the create fct - $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options); - if ($v_result != 1) { - return 0; - } - - // ----- Return - return $p_result_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : - // add($p_filelist, $p_add_dir="", $p_remove_dir="") - // add($p_filelist, $p_option, $p_option_value, ...) - // Description : - // This method supports two synopsis. The first one is historical. - // This methods add the list of files in an existing archive. - // If a file with the same name already exists, it is added at the end of the - // archive, the first one is still present. - // If the archive does not exist, it is created. - // Parameters : - // $p_filelist : An array containing file or directory names, or - // a string containing one filename or one directory name, or - // a string containing a list of filenames and/or directory - // names separated by spaces. - // $p_add_dir : A path to add before the real path of the archived file, - // in order to have it memorized in the archive. - // $p_remove_dir : A path to remove from the real path of the file to archive, - // in order to have a shorter path memorized in the archive. - // When $p_add_dir and $p_remove_dir are set, $p_remove_dir - // is removed first, before $p_add_dir is added. - // Options : - // PCLZIP_OPT_ADD_PATH : - // PCLZIP_OPT_REMOVE_PATH : - // PCLZIP_OPT_REMOVE_ALL_PATH : - // PCLZIP_OPT_COMMENT : - // PCLZIP_OPT_ADD_COMMENT : - // PCLZIP_OPT_PREPEND_COMMENT : - // PCLZIP_CB_PRE_ADD : - // PCLZIP_CB_POST_ADD : - // Return Values : - // 0 on failure, - // The list of the added files, with a status of the add action. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - function add($p_filelist) - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Set default values - $v_options = array(); - $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; - - // ----- Look for variable options arguments - $v_size = func_num_args(); - - // ----- Look for arguments - if ($v_size > 1) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Remove form the options list the first argument - array_shift($v_arg_list); - $v_size--; - - // ----- Look for first arg - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_REMOVE_PATH => 'optional', - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', - PCLZIP_OPT_ADD_PATH => 'optional', - PCLZIP_CB_PRE_ADD => 'optional', - PCLZIP_CB_POST_ADD => 'optional', - PCLZIP_OPT_NO_COMPRESSION => 'optional', - PCLZIP_OPT_COMMENT => 'optional', - PCLZIP_OPT_ADD_COMMENT => 'optional', - PCLZIP_OPT_PREPEND_COMMENT => 'optional', - PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', - PCLZIP_OPT_TEMP_FILE_ON => 'optional', - PCLZIP_OPT_TEMP_FILE_OFF => 'optional' - //, PCLZIP_OPT_CRYPT => 'optional' - )); - if ($v_result != 1) { - return 0; - } - } - - // ----- Look for 2 args - // Here we need to support the first historic synopsis of the - // method. - else { - - // ----- Get the first argument - $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0]; - - // ----- Look for the optional second argument - if ($v_size == 2) { - $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; - } - else if ($v_size > 2) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); - - // ----- Return - return 0; - } - } - } - - // ----- Look for default option values - $this->privOptionDefaultThreshold($v_options); - - // ----- Init - $v_string_list = array(); - $v_att_list = array(); - $v_filedescr_list = array(); - $p_result_list = array(); - - // ----- Look if the $p_filelist is really an array - if (is_array($p_filelist)) { - - // ----- Look if the first element is also an array - // This will mean that this is a file description entry - if (isset($p_filelist[0]) && is_array($p_filelist[0])) { - $v_att_list = $p_filelist; - } - - // ----- The list is a list of string names - else { - $v_string_list = $p_filelist; - } - } - - // ----- Look if the $p_filelist is a string - else if (is_string($p_filelist)) { - // ----- Create a list from the string - $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); - } - - // ----- Invalid variable type for $p_filelist - else { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist"); - return 0; - } - - // ----- Reformat the string list - if (sizeof($v_string_list) != 0) { - foreach ($v_string_list as $v_string) { - $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; - } - } - - // ----- For each file in the list check the attributes - $v_supported_attributes - = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' - ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' - ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' - ,PCLZIP_ATT_FILE_MTIME => 'optional' - ,PCLZIP_ATT_FILE_CONTENT => 'optional' - ,PCLZIP_ATT_FILE_COMMENT => 'optional' - ); - foreach ($v_att_list as $v_entry) { - $v_result = $this->privFileDescrParseAtt($v_entry, - $v_filedescr_list[], - $v_options, - $v_supported_attributes); - if ($v_result != 1) { - return 0; - } - } - - // ----- Expand the filelist (expand directories) - $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); - if ($v_result != 1) { - return 0; - } - - // ----- Call the create fct - $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options); - if ($v_result != 1) { - return 0; - } - - // ----- Return - return $p_result_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : listContent() - // Description : - // This public method, gives the list of the files and directories, with their - // properties. - // The properties of each entries in the list are (used also in other functions) : - // filename : Name of the file. For a create or add action it is the filename - // given by the user. For an extract function it is the filename - // of the extracted file. - // stored_filename : Name of the file / directory stored in the archive. - // size : Size of the stored file. - // compressed_size : Size of the file's data compressed in the archive - // (without the headers overhead) - // mtime : Last known modification date of the file (UNIX timestamp) - // comment : Comment associated with the file - // folder : true | false - // index : index of the file in the archive - // status : status of the action (depending of the action) : - // Values are : - // ok : OK ! - // filtered : the file / dir is not extracted (filtered by user) - // already_a_directory : the file can not be extracted because a - // directory with the same name already exists - // write_protected : the file can not be extracted because a file - // with the same name already exists and is - // write protected - // newer_exist : the file was not extracted because a newer file exists - // path_creation_fail : the file is not extracted because the folder - // does not exist and can not be created - // write_error : the file was not extracted because there was a - // error while writing the file - // read_error : the file was not extracted because there was a error - // while reading the file - // invalid_header : the file was not extracted because of an archive - // format error (bad file header) - // Note that each time a method can continue operating when there - // is an action error on a file, the error is only logged in the file status. - // Return Values : - // 0 on an unrecoverable failure, - // The list of the files in the archive. - // -------------------------------------------------------------------------------- - function listContent() - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - return(0); - } - - // ----- Call the extracting fct - $p_list = array(); - if (($v_result = $this->privList($p_list)) != 1) - { - unset($p_list); - return(0); - } - - // ----- Return - return $p_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : - // extract($p_path="./", $p_remove_path="") - // extract([$p_option, $p_option_value, ...]) - // Description : - // This method supports two synopsis. The first one is historical. - // This method extract all the files / directories from the archive to the - // folder indicated in $p_path. - // If you want to ignore the 'root' part of path of the memorized files - // you can indicate this in the optional $p_remove_path parameter. - // By default, if a newer file with the same name already exists, the - // file is not extracted. - // - // If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions - // are used, the path indicated in PCLZIP_OPT_ADD_PATH is append - // at the end of the path value of PCLZIP_OPT_PATH. - // Parameters : - // $p_path : Path where the files and directories are to be extracted - // $p_remove_path : First part ('root' part) of the memorized path - // (if any similar) to remove while extracting. - // Options : - // PCLZIP_OPT_PATH : - // PCLZIP_OPT_ADD_PATH : - // PCLZIP_OPT_REMOVE_PATH : - // PCLZIP_OPT_REMOVE_ALL_PATH : - // PCLZIP_CB_PRE_EXTRACT : - // PCLZIP_CB_POST_EXTRACT : - // Return Values : - // 0 or a negative value on failure, - // The list of the extracted files, with a status of the action. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - function extract() - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - return(0); - } - - // ----- Set default values - $v_options = array(); -// $v_path = "./"; - $v_path = ''; - $v_remove_path = ""; - $v_remove_all_path = false; - - // ----- Look for variable options arguments - $v_size = func_num_args(); - - // ----- Default values for option - $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; - - // ----- Look for arguments - if ($v_size > 0) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Look for first arg - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_PATH => 'optional', - PCLZIP_OPT_REMOVE_PATH => 'optional', - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', - PCLZIP_OPT_ADD_PATH => 'optional', - PCLZIP_CB_PRE_EXTRACT => 'optional', - PCLZIP_CB_POST_EXTRACT => 'optional', - PCLZIP_OPT_SET_CHMOD => 'optional', - PCLZIP_OPT_BY_NAME => 'optional', - PCLZIP_OPT_BY_EREG => 'optional', - PCLZIP_OPT_BY_PREG => 'optional', - PCLZIP_OPT_BY_INDEX => 'optional', - PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', - PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional', - PCLZIP_OPT_REPLACE_NEWER => 'optional' - ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' - ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', - PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', - PCLZIP_OPT_TEMP_FILE_ON => 'optional', - PCLZIP_OPT_TEMP_FILE_OFF => 'optional' - )); - if ($v_result != 1) { - return 0; - } - - // ----- Set the arguments - if (isset($v_options[PCLZIP_OPT_PATH])) { - $v_path = $v_options[PCLZIP_OPT_PATH]; - } - if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { - $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; - } - if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { - $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; - } - if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { - // ----- Check for '/' in last path char - if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { - $v_path .= '/'; - } - $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; - } - } - - // ----- Look for 2 args - // Here we need to support the first historic synopsis of the - // method. - else { - - // ----- Get the first argument - $v_path = $v_arg_list[0]; - - // ----- Look for the optional second argument - if ($v_size == 2) { - $v_remove_path = $v_arg_list[1]; - } - else if ($v_size > 2) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); - - // ----- Return - return 0; - } - } - } - - // ----- Look for default option values - $this->privOptionDefaultThreshold($v_options); - - // ----- Trace - - // ----- Call the extracting fct - $p_list = array(); - $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, - $v_remove_all_path, $v_options); - if ($v_result < 1) { - unset($p_list); - return(0); - } - - // ----- Return - return $p_list; - } - // -------------------------------------------------------------------------------- - - - // -------------------------------------------------------------------------------- - // Function : - // extractByIndex($p_index, $p_path="./", $p_remove_path="") - // extractByIndex($p_index, [$p_option, $p_option_value, ...]) - // Description : - // This method supports two synopsis. The first one is historical. - // This method is doing a partial extract of the archive. - // The extracted files or folders are identified by their index in the - // archive (from 0 to n). - // Note that if the index identify a folder, only the folder entry is - // extracted, not all the files included in the archive. - // Parameters : - // $p_index : A single index (integer) or a string of indexes of files to - // extract. The form of the string is "0,4-6,8-12" with only numbers - // and '-' for range or ',' to separate ranges. No spaces or ';' - // are allowed. - // $p_path : Path where the files and directories are to be extracted - // $p_remove_path : First part ('root' part) of the memorized path - // (if any similar) to remove while extracting. - // Options : - // PCLZIP_OPT_PATH : - // PCLZIP_OPT_ADD_PATH : - // PCLZIP_OPT_REMOVE_PATH : - // PCLZIP_OPT_REMOVE_ALL_PATH : - // PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and - // not as files. - // The resulting content is in a new field 'content' in the file - // structure. - // This option must be used alone (any other options are ignored). - // PCLZIP_CB_PRE_EXTRACT : - // PCLZIP_CB_POST_EXTRACT : - // Return Values : - // 0 on failure, - // The list of the extracted files, with a status of the action. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - //function extractByIndex($p_index, options...) - function extractByIndex($p_index) - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - return(0); - } - - // ----- Set default values - $v_options = array(); -// $v_path = "./"; - $v_path = ''; - $v_remove_path = ""; - $v_remove_all_path = false; - - // ----- Look for variable options arguments - $v_size = func_num_args(); - - // ----- Default values for option - $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; - - // ----- Look for arguments - if ($v_size > 1) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Remove form the options list the first argument - array_shift($v_arg_list); - $v_size--; - - // ----- Look for first arg - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_PATH => 'optional', - PCLZIP_OPT_REMOVE_PATH => 'optional', - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', - PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', - PCLZIP_OPT_ADD_PATH => 'optional', - PCLZIP_CB_PRE_EXTRACT => 'optional', - PCLZIP_CB_POST_EXTRACT => 'optional', - PCLZIP_OPT_SET_CHMOD => 'optional', - PCLZIP_OPT_REPLACE_NEWER => 'optional' - ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' - ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', - PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', - PCLZIP_OPT_TEMP_FILE_ON => 'optional', - PCLZIP_OPT_TEMP_FILE_OFF => 'optional' - )); - if ($v_result != 1) { - return 0; - } - - // ----- Set the arguments - if (isset($v_options[PCLZIP_OPT_PATH])) { - $v_path = $v_options[PCLZIP_OPT_PATH]; - } - if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { - $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; - } - if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { - $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; - } - if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { - // ----- Check for '/' in last path char - if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { - $v_path .= '/'; - } - $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; - } - if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) { - $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; - } - else { - } - } - - // ----- Look for 2 args - // Here we need to support the first historic synopsis of the - // method. - else { - - // ----- Get the first argument - $v_path = $v_arg_list[0]; - - // ----- Look for the optional second argument - if ($v_size == 2) { - $v_remove_path = $v_arg_list[1]; - } - else if ($v_size > 2) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); - - // ----- Return - return 0; - } - } - } - - // ----- Trace - - // ----- Trick - // Here I want to reuse extractByRule(), so I need to parse the $p_index - // with privParseOptions() - $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index); - $v_options_trick = array(); - $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick, - array (PCLZIP_OPT_BY_INDEX => 'optional' )); - if ($v_result != 1) { - return 0; - } - $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX]; - - // ----- Look for default option values - $this->privOptionDefaultThreshold($v_options); - - // ----- Call the extracting fct - if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) { - return(0); - } - - // ----- Return - return $p_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : - // delete([$p_option, $p_option_value, ...]) - // Description : - // This method removes files from the archive. - // If no parameters are given, then all the archive is emptied. - // Parameters : - // None or optional arguments. - // Options : - // PCLZIP_OPT_BY_INDEX : - // PCLZIP_OPT_BY_NAME : - // PCLZIP_OPT_BY_EREG : - // PCLZIP_OPT_BY_PREG : - // Return Values : - // 0 on failure, - // The list of the files which are still present in the archive. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - function delete() - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - return(0); - } - - // ----- Set default values - $v_options = array(); - - // ----- Look for variable options arguments - $v_size = func_num_args(); - - // ----- Look for arguments - if ($v_size > 0) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_BY_NAME => 'optional', - PCLZIP_OPT_BY_EREG => 'optional', - PCLZIP_OPT_BY_PREG => 'optional', - PCLZIP_OPT_BY_INDEX => 'optional' )); - if ($v_result != 1) { - return 0; - } - } - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Call the delete fct - $v_list = array(); - if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) { - $this->privSwapBackMagicQuotes(); - unset($v_list); - return(0); - } - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : deleteByIndex() - // Description : - // ***** Deprecated ***** - // delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered. - // -------------------------------------------------------------------------------- - function deleteByIndex($p_index) - { - - $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index); - - // ----- Return - return $p_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : properties() - // Description : - // This method gives the properties of the archive. - // The properties are : - // nb : Number of files in the archive - // comment : Comment associated with the archive file - // status : not_exist, ok - // Parameters : - // None - // Return Values : - // 0 on failure, - // An array with the archive properties. - // -------------------------------------------------------------------------------- - function properties() - { - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - $this->privSwapBackMagicQuotes(); - return(0); - } - - // ----- Default properties - $v_prop = array(); - $v_prop['comment'] = ''; - $v_prop['nb'] = 0; - $v_prop['status'] = 'not_exist'; - - // ----- Look if file exists - if (@is_file($this->zipname)) - { - // ----- Open the zip file - if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) - { - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); - - // ----- Return - return 0; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privSwapBackMagicQuotes(); - return 0; - } - - // ----- Close the zip file - $this->privCloseFd(); - - // ----- Set the user attributes - $v_prop['comment'] = $v_central_dir['comment']; - $v_prop['nb'] = $v_central_dir['entries']; - $v_prop['status'] = 'ok'; - } - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_prop; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : duplicate() - // Description : - // This method creates an archive by copying the content of an other one. If - // the archive already exist, it is replaced by the new one without any warning. - // Parameters : - // $p_archive : The filename of a valid archive, or - // a valid PclZip object. - // Return Values : - // 1 on success. - // 0 or a negative value on error (error code). - // -------------------------------------------------------------------------------- - function duplicate($p_archive) - { - $v_result = 1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Look if the $p_archive is a PclZip object - if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')) - { - - // ----- Duplicate the archive - $v_result = $this->privDuplicate($p_archive->zipname); - } - - // ----- Look if the $p_archive is a string (so a filename) - else if (is_string($p_archive)) - { - - // ----- Check that $p_archive is a valid zip file - // TBC : Should also check the archive format - if (!is_file($p_archive)) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'"); - $v_result = PCLZIP_ERR_MISSING_FILE; - } - else { - // ----- Duplicate the archive - $v_result = $this->privDuplicate($p_archive); - } - } - - // ----- Invalid variable - else - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); - $v_result = PCLZIP_ERR_INVALID_PARAMETER; - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : merge() - // Description : - // This method merge the $p_archive_to_add archive at the end of the current - // one ($this). - // If the archive ($this) does not exist, the merge becomes a duplicate. - // If the $p_archive_to_add archive does not exist, the merge is a success. - // Parameters : - // $p_archive_to_add : It can be directly the filename of a valid zip archive, - // or a PclZip object archive. - // Return Values : - // 1 on success, - // 0 or negative values on error (see below). - // -------------------------------------------------------------------------------- - function merge($p_archive_to_add) - { - $v_result = 1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - return(0); - } - - // ----- Look if the $p_archive_to_add is a PclZip object - if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')) - { - - // ----- Merge the archive - $v_result = $this->privMerge($p_archive_to_add); - } - - // ----- Look if the $p_archive_to_add is a string (so a filename) - else if (is_string($p_archive_to_add)) - { - - // ----- Create a temporary archive - $v_object_archive = new PclZip($p_archive_to_add); - - // ----- Merge the archive - $v_result = $this->privMerge($v_object_archive); - } - - // ----- Invalid variable - else - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); - $v_result = PCLZIP_ERR_INVALID_PARAMETER; - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - - - // -------------------------------------------------------------------------------- - // Function : errorCode() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function errorCode() - { - if (PCLZIP_ERROR_EXTERNAL == 1) { - return(PclErrorCode()); - } - else { - return($this->error_code); - } - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : errorName() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function errorName($p_with_code=false) - { - $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR', - PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL', - PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL', - PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER', - PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE', - PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG', - PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP', - PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE', - PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL', - PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION', - PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT', - PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL', - PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL', - PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM', - PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', - PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE', - PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE', - PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', - PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION' - ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE' - ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION' - ); - - if (isset($v_name[$this->error_code])) { - $v_value = $v_name[$this->error_code]; - } - else { - $v_value = 'NoName'; - } - - if ($p_with_code) { - return($v_value.' ('.$this->error_code.')'); - } - else { - return($v_value); - } - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : errorInfo() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function errorInfo($p_full=false) - { - if (PCLZIP_ERROR_EXTERNAL == 1) { - return(PclErrorString()); - } - else { - if ($p_full) { - return($this->errorName(true)." : ".$this->error_string); - } - else { - return($this->error_string." [code ".$this->error_code."]"); - } - } - } - // -------------------------------------------------------------------------------- - - -// -------------------------------------------------------------------------------- -// ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS ***** -// ***** ***** -// ***** THESES FUNCTIONS MUST NOT BE USED DIRECTLY ***** -// -------------------------------------------------------------------------------- - - - - // -------------------------------------------------------------------------------- - // Function : privCheckFormat() - // Description : - // This method check that the archive exists and is a valid zip archive. - // Several level of check exists. (futur) - // Parameters : - // $p_level : Level of check. Default 0. - // 0 : Check the first bytes (magic codes) (default value)) - // 1 : 0 + Check the central directory (futur) - // 2 : 1 + Check each file header (futur) - // Return Values : - // true on success, - // false on error, the error code is set. - // -------------------------------------------------------------------------------- - function privCheckFormat($p_level=0) - { - $v_result = true; - - // ----- Reset the file system cache - clearstatcache(); - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Look if the file exits - if (!is_file($this->zipname)) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'"); - return(false); - } - - // ----- Check that the file is readeable - if (!is_readable($this->zipname)) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'"); - return(false); - } - - // ----- Check the magic code - // TBC - - // ----- Check the central header - // TBC - - // ----- Check each file header - // TBC - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privParseOptions() - // Description : - // This internal methods reads the variable list of arguments ($p_options_list, - // $p_size) and generate an array with the options and values ($v_result_list). - // $v_requested_options contains the options that can be present and those that - // must be present. - // $v_requested_options is an array, with the option value as key, and 'optional', - // or 'mandatory' as value. - // Parameters : - // See above. - // Return Values : - // 1 on success. - // 0 on failure. - // -------------------------------------------------------------------------------- - function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false) - { - $v_result=1; - - // ----- Read the options - $i=0; - while ($i<$p_size) { - - // ----- Check if the option is supported - if (!isset($v_requested_options[$p_options_list[$i]])) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Look for next option - switch ($p_options_list[$i]) { - // ----- Look for options that request a path value - case PCLZIP_OPT_PATH : - case PCLZIP_OPT_REMOVE_PATH : - case PCLZIP_OPT_ADD_PATH : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); - $i++; - break; - - case PCLZIP_OPT_TEMP_FILE_THRESHOLD : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - return PclZip::errorCode(); - } - - // ----- Check for incompatible options - if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); - return PclZip::errorCode(); - } - - // ----- Check the value - $v_value = $p_options_list[$i+1]; - if ((!is_integer($v_value)) || ($v_value<0)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - return PclZip::errorCode(); - } - - // ----- Get the value (and convert it in bytes) - $v_result_list[$p_options_list[$i]] = $v_value*1048576; - $i++; - break; - - case PCLZIP_OPT_TEMP_FILE_ON : - // ----- Check for incompatible options - if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); - return PclZip::errorCode(); - } - - $v_result_list[$p_options_list[$i]] = true; - break; - - case PCLZIP_OPT_TEMP_FILE_OFF : - // ----- Check for incompatible options - if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'"); - return PclZip::errorCode(); - } - // ----- Check for incompatible options - if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'"); - return PclZip::errorCode(); - } - - $v_result_list[$p_options_list[$i]] = true; - break; - - case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - if ( is_string($p_options_list[$i+1]) - && ($p_options_list[$i+1] != '')) { - $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); - $i++; - } - else { - } - break; - - // ----- Look for options that request an array of string for value - case PCLZIP_OPT_BY_NAME : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - if (is_string($p_options_list[$i+1])) { - $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1]; - } - else if (is_array($p_options_list[$i+1])) { - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; - } - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - $i++; - break; - - // ----- Look for options that request an EREG or PREG expression - case PCLZIP_OPT_BY_EREG : - // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG - // to PCLZIP_OPT_BY_PREG - $p_options_list[$i] = PCLZIP_OPT_BY_PREG; - case PCLZIP_OPT_BY_PREG : - //case PCLZIP_OPT_CRYPT : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - if (is_string($p_options_list[$i+1])) { - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; - } - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - $i++; - break; - - // ----- Look for options that takes a string - case PCLZIP_OPT_COMMENT : - case PCLZIP_OPT_ADD_COMMENT : - case PCLZIP_OPT_PREPEND_COMMENT : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, - "Missing parameter value for option '" - .PclZipUtilOptionText($p_options_list[$i]) - ."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - if (is_string($p_options_list[$i+1])) { - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; - } - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, - "Wrong parameter value for option '" - .PclZipUtilOptionText($p_options_list[$i]) - ."'"); - - // ----- Return - return PclZip::errorCode(); - } - $i++; - break; - - // ----- Look for options that request an array of index - case PCLZIP_OPT_BY_INDEX : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - $v_work_list = array(); - if (is_string($p_options_list[$i+1])) { - - // ----- Remove spaces - $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', ''); - - // ----- Parse items - $v_work_list = explode(",", $p_options_list[$i+1]); - } - else if (is_integer($p_options_list[$i+1])) { - $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1]; - } - else if (is_array($p_options_list[$i+1])) { - $v_work_list = $p_options_list[$i+1]; - } - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Reduce the index list - // each index item in the list must be a couple with a start and - // an end value : [0,3], [5-5], [8-10], ... - // ----- Check the format of each item - $v_sort_flag=false; - $v_sort_value=0; - for ($j=0; $j= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; - $i++; - break; - - // ----- Look for options that request a call-back - case PCLZIP_CB_PRE_EXTRACT : - case PCLZIP_CB_POST_EXTRACT : - case PCLZIP_CB_PRE_ADD : - case PCLZIP_CB_POST_ADD : - /* for futur use - case PCLZIP_CB_PRE_DELETE : - case PCLZIP_CB_POST_DELETE : - case PCLZIP_CB_PRE_LIST : - case PCLZIP_CB_POST_LIST : - */ - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - $v_function_name = $p_options_list[$i+1]; - - // ----- Check that the value is a valid existing function - if (!function_exists($v_function_name)) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Set the attribute - $v_result_list[$p_options_list[$i]] = $v_function_name; - $i++; - break; - - default : - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, - "Unknown parameter '" - .$p_options_list[$i]."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Next options - $i++; - } - - // ----- Look for mandatory options - if ($v_requested_options !== false) { - for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { - // ----- Look for mandatory option - if ($v_requested_options[$key] == 'mandatory') { - // ----- Look if present - if (!isset($v_result_list[$key])) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); - - // ----- Return - return PclZip::errorCode(); - } - } - } - } - - // ----- Look for default values - if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { - - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privOptionDefaultThreshold() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privOptionDefaultThreshold(&$p_options) - { - $v_result=1; - - if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) - || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) { - return $v_result; - } - - // ----- Get 'memory_limit' configuration value - $v_memory_limit = ini_get('memory_limit'); - $v_memory_limit = trim($v_memory_limit); - $last = strtolower(substr($v_memory_limit, -1)); - - if($last == 'g') - //$v_memory_limit = $v_memory_limit*1024*1024*1024; - $v_memory_limit = $v_memory_limit*1073741824; - if($last == 'm') - //$v_memory_limit = $v_memory_limit*1024*1024; - $v_memory_limit = $v_memory_limit*1048576; - if($last == 'k') - $v_memory_limit = $v_memory_limit*1024; - - $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO); - - - // ----- Sanity check : No threshold if value lower than 1M - if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) { - unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privFileDescrParseAtt() - // Description : - // Parameters : - // Return Values : - // 1 on success. - // 0 on failure. - // -------------------------------------------------------------------------------- - function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false) - { - $v_result=1; - - // ----- For each file in the list check the attributes - foreach ($p_file_list as $v_key => $v_value) { - - // ----- Check if the option is supported - if (!isset($v_requested_options[$v_key])) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Look for attribute - switch ($v_key) { - case PCLZIP_ATT_FILE_NAME : - if (!is_string($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - $p_filedescr['filename'] = PclZipUtilPathReduction($v_value); - - if ($p_filedescr['filename'] == '') { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - break; - - case PCLZIP_ATT_FILE_NEW_SHORT_NAME : - if (!is_string($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value); - - if ($p_filedescr['new_short_name'] == '') { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - break; - - case PCLZIP_ATT_FILE_NEW_FULL_NAME : - if (!is_string($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value); - - if ($p_filedescr['new_full_name'] == '') { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - break; - - // ----- Look for options that takes a string - case PCLZIP_ATT_FILE_COMMENT : - if (!is_string($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - $p_filedescr['comment'] = $v_value; - break; - - case PCLZIP_ATT_FILE_MTIME : - if (!is_integer($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - $p_filedescr['mtime'] = $v_value; - break; - - case PCLZIP_ATT_FILE_CONTENT : - $p_filedescr['content'] = $v_value; - break; - - default : - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, - "Unknown parameter '".$v_key."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Look for mandatory options - if ($v_requested_options !== false) { - for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { - // ----- Look for mandatory option - if ($v_requested_options[$key] == 'mandatory') { - // ----- Look if present - if (!isset($p_file_list[$key])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); - return PclZip::errorCode(); - } - } - } - } - - // end foreach - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privFileDescrExpand() - // Description : - // This method look for each item of the list to see if its a file, a folder - // or a string to be added as file. For any other type of files (link, other) - // just ignore the item. - // Then prepare the information that will be stored for that file. - // When its a folder, expand the folder with all the files that are in that - // folder (recursively). - // Parameters : - // Return Values : - // 1 on success. - // 0 on failure. - // -------------------------------------------------------------------------------- - function privFileDescrExpand(&$p_filedescr_list, &$p_options) - { - $v_result=1; - - // ----- Create a result list - $v_result_list = array(); - - // ----- Look each entry - for ($i=0; $iprivCalculateStoredFilename($v_descr, $p_options); - - // ----- Add the descriptor in result list - $v_result_list[sizeof($v_result_list)] = $v_descr; - - // ----- Look for folder - if ($v_descr['type'] == 'folder') { - // ----- List of items in folder - $v_dirlist_descr = array(); - $v_dirlist_nb = 0; - if ($v_folder_handler = @opendir($v_descr['filename'])) { - while (($v_item_handler = @readdir($v_folder_handler)) !== false) { - - // ----- Skip '.' and '..' - if (($v_item_handler == '.') || ($v_item_handler == '..')) { - continue; - } - - // ----- Compose the full filename - $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler; - - // ----- Look for different stored filename - // Because the name of the folder was changed, the name of the - // files/sub-folders also change - if (($v_descr['stored_filename'] != $v_descr['filename']) - && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) { - if ($v_descr['stored_filename'] != '') { - $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler; - } - else { - $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler; - } - } - - $v_dirlist_nb++; - } - - @closedir($v_folder_handler); - } - else { - // TBC : unable to open folder in read mode - } - - // ----- Expand each element of the list - if ($v_dirlist_nb != 0) { - // ----- Expand - if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) { - return $v_result; - } - - // ----- Concat the resulting list - $v_result_list = array_merge($v_result_list, $v_dirlist_descr); - } - else { - } - - // ----- Free local array - unset($v_dirlist_descr); - } - } - - // ----- Get the result list - $p_filedescr_list = $v_result_list; - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privCreate() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privCreate($p_filedescr_list, &$p_result_list, &$p_options) - { - $v_result=1; - $v_list_detail = array(); - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Open the file in write mode - if (($v_result = $this->privOpenFd('wb')) != 1) - { - // ----- Return - return $v_result; - } - - // ----- Add the list of files - $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options); - - // ----- Close - $this->privCloseFd(); - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAdd() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privAdd($p_filedescr_list, &$p_result_list, &$p_options) - { - $v_result=1; - $v_list_detail = array(); - - // ----- Look if the archive exists or is empty - if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)) - { - - // ----- Do a create - $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options); - - // ----- Return - return $v_result; - } - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Open the zip file - if (($v_result=$this->privOpenFd('rb')) != 1) - { - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result; - } - - // ----- Go to beginning of File - @rewind($this->zip_fd); - - // ----- Creates a temporay file - $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; - - // ----- Open the temporary file in write mode - if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) - { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Copy the files from the archive to the temporary file - // TBC : Here I should better append the file and go back to erase the central dir - $v_size = $v_central_dir['offset']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = fread($this->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Swap the file descriptor - // Here is a trick : I swap the temporary fd with the zip fd, in order to use - // the following methods on the temporary fil and not the real archive - $v_swap = $this->zip_fd; - $this->zip_fd = $v_zip_temp_fd; - $v_zip_temp_fd = $v_swap; - - // ----- Add the files - $v_header_list = array(); - if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) - { - fclose($v_zip_temp_fd); - $this->privCloseFd(); - @unlink($v_zip_temp_name); - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - - // ----- Store the offset of the central dir - $v_offset = @ftell($this->zip_fd); - - // ----- Copy the block of file headers from the old archive - $v_size = $v_central_dir['size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($v_zip_temp_fd, $v_read_size); - @fwrite($this->zip_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Create the Central Dir files header - for ($i=0, $v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { - fclose($v_zip_temp_fd); - $this->privCloseFd(); - @unlink($v_zip_temp_name); - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - $v_count++; - } - - // ----- Transform the header to a 'usable' info - $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); - } - - // ----- Zip file comment - $v_comment = $v_central_dir['comment']; - if (isset($p_options[PCLZIP_OPT_COMMENT])) { - $v_comment = $p_options[PCLZIP_OPT_COMMENT]; - } - if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) { - $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT]; - } - if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) { - $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment; - } - - // ----- Calculate the size of the central header - $v_size = @ftell($this->zip_fd)-$v_offset; - - // ----- Create the central dir footer - if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1) - { - // ----- Reset the file list - unset($v_header_list); - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - - // ----- Swap back the file descriptor - $v_swap = $this->zip_fd; - $this->zip_fd = $v_zip_temp_fd; - $v_zip_temp_fd = $v_swap; - - // ----- Close - $this->privCloseFd(); - - // ----- Close the temporary file - @fclose($v_zip_temp_fd); - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Delete the zip file - // TBC : I should test the result ... - @unlink($this->zipname); - - // ----- Rename the temporary file - // TBC : I should test the result ... - //@rename($v_zip_temp_name, $this->zipname); - PclZipUtilRename($v_zip_temp_name, $this->zipname); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privOpenFd() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function privOpenFd($p_mode) - { - $v_result=1; - - // ----- Look if already open - if ($this->zip_fd != 0) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Open the zip file - if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privCloseFd() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function privCloseFd() - { - $v_result=1; - - if ($this->zip_fd != 0) - @fclose($this->zip_fd); - $this->zip_fd = 0; - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAddList() - // Description : - // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is - // different from the real path of the file. This is usefull if you want to have PclTar - // running in any directory, and memorize relative path from an other directory. - // Parameters : - // $p_list : An array containing the file or directory names to add in the tar - // $p_result_list : list of added files with their properties (specially the status field) - // $p_add_dir : Path to add in the filename path archived - // $p_remove_dir : Path to remove in the filename path archived - // Return Values : - // -------------------------------------------------------------------------------- -// function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) - function privAddList($p_filedescr_list, &$p_result_list, &$p_options) - { - $v_result=1; - - // ----- Add the files - $v_header_list = array(); - if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) - { - // ----- Return - return $v_result; - } - - // ----- Store the offset of the central dir - $v_offset = @ftell($this->zip_fd); - - // ----- Create the Central Dir files header - for ($i=0,$v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { - // ----- Return - return $v_result; - } - $v_count++; - } - - // ----- Transform the header to a 'usable' info - $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); - } - - // ----- Zip file comment - $v_comment = ''; - if (isset($p_options[PCLZIP_OPT_COMMENT])) { - $v_comment = $p_options[PCLZIP_OPT_COMMENT]; - } - - // ----- Calculate the size of the central header - $v_size = @ftell($this->zip_fd)-$v_offset; - - // ----- Create the central dir footer - if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1) - { - // ----- Reset the file list - unset($v_header_list); - - // ----- Return - return $v_result; - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAddFileList() - // Description : - // Parameters : - // $p_filedescr_list : An array containing the file description - // or directory names to add in the zip - // $p_result_list : list of added files with their properties (specially the status field) - // Return Values : - // -------------------------------------------------------------------------------- - function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options) - { - $v_result=1; - $v_header = array(); - - // ----- Recuperate the current number of elt in list - $v_nb = sizeof($p_result_list); - - // ----- Loop on the files - for ($j=0; ($jprivAddFile($p_filedescr_list[$j], $v_header, - $p_options); - if ($v_result != 1) { - return $v_result; - } - - // ----- Store the file infos - $p_result_list[$v_nb++] = $v_header; - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAddFile() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privAddFile($p_filedescr, &$p_header, &$p_options) - { - $v_result=1; - - // ----- Working variable - $p_filename = $p_filedescr['filename']; - - // TBC : Already done in the fileAtt check ... ? - if ($p_filename == "") { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Look for a stored different filename - /* TBC : Removed - if (isset($p_filedescr['stored_filename'])) { - $v_stored_filename = $p_filedescr['stored_filename']; - } - else { - $v_stored_filename = $p_filedescr['stored_filename']; - } - */ - - // ----- Set the file properties - clearstatcache(); - $p_header['version'] = 20; - $p_header['version_extracted'] = 10; - $p_header['flag'] = 0; - $p_header['compression'] = 0; - $p_header['crc'] = 0; - $p_header['compressed_size'] = 0; - $p_header['filename_len'] = strlen($p_filename); - $p_header['extra_len'] = 0; - $p_header['disk'] = 0; - $p_header['internal'] = 0; - $p_header['offset'] = 0; - $p_header['filename'] = $p_filename; -// TBC : Removed $p_header['stored_filename'] = $v_stored_filename; - $p_header['stored_filename'] = $p_filedescr['stored_filename']; - $p_header['extra'] = ''; - $p_header['status'] = 'ok'; - $p_header['index'] = -1; - - // ----- Look for regular file - if ($p_filedescr['type']=='file') { - $p_header['external'] = 0x00000000; - $p_header['size'] = filesize($p_filename); - } - - // ----- Look for regular folder - else if ($p_filedescr['type']=='folder') { - $p_header['external'] = 0x00000010; - $p_header['mtime'] = filemtime($p_filename); - $p_header['size'] = filesize($p_filename); - } - - // ----- Look for virtual file - else if ($p_filedescr['type'] == 'virtual_file') { - $p_header['external'] = 0x00000000; - $p_header['size'] = strlen($p_filedescr['content']); - } - - - // ----- Look for filetime - if (isset($p_filedescr['mtime'])) { - $p_header['mtime'] = $p_filedescr['mtime']; - } - else if ($p_filedescr['type'] == 'virtual_file') { - $p_header['mtime'] = time(); - } - else { - $p_header['mtime'] = filemtime($p_filename); - } - - // ------ Look for file comment - if (isset($p_filedescr['comment'])) { - $p_header['comment_len'] = strlen($p_filedescr['comment']); - $p_header['comment'] = $p_filedescr['comment']; - } - else { - $p_header['comment_len'] = 0; - $p_header['comment'] = ''; - } - - // ----- Look for pre-add callback - if (isset($p_options[PCLZIP_CB_PRE_ADD])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_header, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header); - if ($v_result == 0) { - // ----- Change the file status - $p_header['status'] = "skipped"; - $v_result = 1; - } - - // ----- Update the informations - // Only some fields can be modified - if ($p_header['stored_filename'] != $v_local_header['stored_filename']) { - $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']); - } - } - - // ----- Look for empty stored filename - if ($p_header['stored_filename'] == "") { - $p_header['status'] = "filtered"; - } - - // ----- Check the path length - if (strlen($p_header['stored_filename']) > 0xFF) { - $p_header['status'] = 'filename_too_long'; - } - - // ----- Look if no error, or file not skipped - if ($p_header['status'] == 'ok') { - - // ----- Look for a file - if ($p_filedescr['type'] == 'file') { - // ----- Look for using temporary file to zip - if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) - && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) - || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) - && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) { - $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options); - if ($v_result < PCLZIP_ERR_NO_ERROR) { - return $v_result; - } - } - - // ----- Use "in memory" zip algo - else { - - // ----- Open the source file - if (($v_file = @fopen($p_filename, "rb")) == 0) { - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); - return PclZip::errorCode(); - } - - // ----- Read the file content - $v_content = @fread($v_file, $p_header['size']); - - // ----- Close the file - @fclose($v_file); - - // ----- Calculate the CRC - $p_header['crc'] = @crc32($v_content); - - // ----- Look for no compression - if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { - // ----- Set header parameters - $p_header['compressed_size'] = $p_header['size']; - $p_header['compression'] = 0; - } - - // ----- Look for normal compression - else { - // ----- Compress the content - $v_content = @gzdeflate($v_content); - - // ----- Set header parameters - $p_header['compressed_size'] = strlen($v_content); - $p_header['compression'] = 8; - } - - // ----- Call the header generation - if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { - @fclose($v_file); - return $v_result; - } - - // ----- Write the compressed (or not) content - @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); - - } - - } - - // ----- Look for a virtual file (a file from string) - else if ($p_filedescr['type'] == 'virtual_file') { - - $v_content = $p_filedescr['content']; - - // ----- Calculate the CRC - $p_header['crc'] = @crc32($v_content); - - // ----- Look for no compression - if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { - // ----- Set header parameters - $p_header['compressed_size'] = $p_header['size']; - $p_header['compression'] = 0; - } - - // ----- Look for normal compression - else { - // ----- Compress the content - $v_content = @gzdeflate($v_content); - - // ----- Set header parameters - $p_header['compressed_size'] = strlen($v_content); - $p_header['compression'] = 8; - } - - // ----- Call the header generation - if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { - @fclose($v_file); - return $v_result; - } - - // ----- Write the compressed (or not) content - @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); - } - - // ----- Look for a directory - else if ($p_filedescr['type'] == 'folder') { - // ----- Look for directory last '/' - if (@substr($p_header['stored_filename'], -1) != '/') { - $p_header['stored_filename'] .= '/'; - } - - // ----- Set the file properties - $p_header['size'] = 0; - //$p_header['external'] = 0x41FF0010; // Value for a folder : to be checked - $p_header['external'] = 0x00000010; // Value for a folder : to be checked - - // ----- Call the header generation - if (($v_result = $this->privWriteFileHeader($p_header)) != 1) - { - return $v_result; - } - } - } - - // ----- Look for post-add callback - if (isset($p_options[PCLZIP_CB_POST_ADD])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_header, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header); - if ($v_result == 0) { - // ----- Ignored - $v_result = 1; - } - - // ----- Update the informations - // Nothing can be modified - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAddFileUsingTempFile() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options) - { - $v_result=PCLZIP_ERR_NO_ERROR; - - // ----- Working variable - $p_filename = $p_filedescr['filename']; - - - // ----- Open the source file - if (($v_file = @fopen($p_filename, "rb")) == 0) { - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); - return PclZip::errorCode(); - } - - // ----- Creates a compressed temporary file - $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; - if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) { - fclose($v_file); - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); - return PclZip::errorCode(); - } - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - $v_size = filesize($p_filename); - while ($v_size != 0) { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($v_file, $v_read_size); - //$v_binary_data = pack('a'.$v_read_size, $v_buffer); - @gzputs($v_file_compressed, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Close the file - @fclose($v_file); - @gzclose($v_file_compressed); - - // ----- Check the minimum file size - if (filesize($v_gzip_temp_name) < 18) { - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \''.$v_gzip_temp_name.'\' has invalid filesize - should be minimum 18 bytes'); - return PclZip::errorCode(); - } - - // ----- Extract the compressed attributes - if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); - return PclZip::errorCode(); - } - - // ----- Read the gzip file header - $v_binary_data = @fread($v_file_compressed, 10); - $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data); - - // ----- Check some parameters - $v_data_header['os'] = bin2hex($v_data_header['os']); - - // ----- Read the gzip file footer - @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8); - $v_binary_data = @fread($v_file_compressed, 8); - $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data); - - // ----- Set the attributes - $p_header['compression'] = ord($v_data_header['cm']); - //$p_header['mtime'] = $v_data_header['mtime']; - $p_header['crc'] = $v_data_footer['crc']; - $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18; - - // ----- Close the file - @fclose($v_file_compressed); - - // ----- Call the header generation - if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { - return $v_result; - } - - // ----- Add the compressed data - if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) - { - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); - return PclZip::errorCode(); - } - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - fseek($v_file_compressed, 10); - $v_size = $p_header['compressed_size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($v_file_compressed, $v_read_size); - //$v_binary_data = pack('a'.$v_read_size, $v_buffer); - @fwrite($this->zip_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Close the file - @fclose($v_file_compressed); - - // ----- Unlink the temporary file - @unlink($v_gzip_temp_name); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privCalculateStoredFilename() - // Description : - // Based on file descriptor properties and global options, this method - // calculate the filename that will be stored in the archive. - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privCalculateStoredFilename(&$p_filedescr, &$p_options) - { - $v_result=1; - - // ----- Working variables - $p_filename = $p_filedescr['filename']; - if (isset($p_options[PCLZIP_OPT_ADD_PATH])) { - $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH]; - } - else { - $p_add_dir = ''; - } - if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) { - $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH]; - } - else { - $p_remove_dir = ''; - } - if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { - $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH]; - } - else { - $p_remove_all_dir = 0; - } - - - // ----- Look for full name change - if (isset($p_filedescr['new_full_name'])) { - // ----- Remove drive letter if any - $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']); - } - - // ----- Look for path and/or short name change - else { - - // ----- Look for short name change - // Its when we cahnge just the filename but not the path - if (isset($p_filedescr['new_short_name'])) { - $v_path_info = pathinfo($p_filename); - $v_dir = ''; - if ($v_path_info['dirname'] != '') { - $v_dir = $v_path_info['dirname'].'/'; - } - $v_stored_filename = $v_dir.$p_filedescr['new_short_name']; - } - else { - // ----- Calculate the stored filename - $v_stored_filename = $p_filename; - } - - // ----- Look for all path to remove - if ($p_remove_all_dir) { - $v_stored_filename = basename($p_filename); - } - // ----- Look for partial path remove - else if ($p_remove_dir != "") { - if (substr($p_remove_dir, -1) != '/') - $p_remove_dir .= "/"; - - if ( (substr($p_filename, 0, 2) == "./") - || (substr($p_remove_dir, 0, 2) == "./")) { - - if ( (substr($p_filename, 0, 2) == "./") - && (substr($p_remove_dir, 0, 2) != "./")) { - $p_remove_dir = "./".$p_remove_dir; - } - if ( (substr($p_filename, 0, 2) != "./") - && (substr($p_remove_dir, 0, 2) == "./")) { - $p_remove_dir = substr($p_remove_dir, 2); - } - } - - $v_compare = PclZipUtilPathInclusion($p_remove_dir, - $v_stored_filename); - if ($v_compare > 0) { - if ($v_compare == 2) { - $v_stored_filename = ""; - } - else { - $v_stored_filename = substr($v_stored_filename, - strlen($p_remove_dir)); - } - } - } - - // ----- Remove drive letter if any - $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename); - - // ----- Look for path to add - if ($p_add_dir != "") { - if (substr($p_add_dir, -1) == "/") - $v_stored_filename = $p_add_dir.$v_stored_filename; - else - $v_stored_filename = $p_add_dir."/".$v_stored_filename; - } - } - - // ----- Filename (reduce the path of stored name) - $v_stored_filename = PclZipUtilPathReduction($v_stored_filename); - $p_filedescr['stored_filename'] = $v_stored_filename; - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privWriteFileHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privWriteFileHeader(&$p_header) - { - $v_result=1; - - // ----- Store the offset position of the file - $p_header['offset'] = ftell($this->zip_fd); - - // ----- Transform UNIX mtime to DOS format mdate/mtime - $v_date = getdate($p_header['mtime']); - $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; - $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; - - // ----- Packed data - $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50, - $p_header['version_extracted'], $p_header['flag'], - $p_header['compression'], $v_mtime, $v_mdate, - $p_header['crc'], $p_header['compressed_size'], - $p_header['size'], - strlen($p_header['stored_filename']), - $p_header['extra_len']); - - // ----- Write the first 148 bytes of the header in the archive - fputs($this->zip_fd, $v_binary_data, 30); - - // ----- Write the variable fields - if (strlen($p_header['stored_filename']) != 0) - { - fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); - } - if ($p_header['extra_len'] != 0) - { - fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privWriteCentralFileHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privWriteCentralFileHeader(&$p_header) - { - $v_result=1; - - // TBC - //for(reset($p_header); $key = key($p_header); next($p_header)) { - //} - - // ----- Transform UNIX mtime to DOS format mdate/mtime - $v_date = getdate($p_header['mtime']); - $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; - $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; - - - // ----- Packed data - $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50, - $p_header['version'], $p_header['version_extracted'], - $p_header['flag'], $p_header['compression'], - $v_mtime, $v_mdate, $p_header['crc'], - $p_header['compressed_size'], $p_header['size'], - strlen($p_header['stored_filename']), - $p_header['extra_len'], $p_header['comment_len'], - $p_header['disk'], $p_header['internal'], - $p_header['external'], $p_header['offset']); - - // ----- Write the 42 bytes of the header in the zip file - fputs($this->zip_fd, $v_binary_data, 46); - - // ----- Write the variable fields - if (strlen($p_header['stored_filename']) != 0) - { - fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); - } - if ($p_header['extra_len'] != 0) - { - fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); - } - if ($p_header['comment_len'] != 0) - { - fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privWriteCentralHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment) - { - $v_result=1; - - // ----- Packed data - $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries, - $p_nb_entries, $p_size, - $p_offset, strlen($p_comment)); - - // ----- Write the 22 bytes of the header in the zip file - fputs($this->zip_fd, $v_binary_data, 22); - - // ----- Write the variable fields - if (strlen($p_comment) != 0) - { - fputs($this->zip_fd, $p_comment, strlen($p_comment)); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privList() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privList(&$p_list) - { - $v_result=1; - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Open the zip file - if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) - { - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privSwapBackMagicQuotes(); - return $v_result; - } - - // ----- Go to beginning of Central Dir - @rewind($this->zip_fd); - if (@fseek($this->zip_fd, $v_central_dir['offset'])) - { - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read each entry - for ($i=0; $i<$v_central_dir['entries']; $i++) - { - // ----- Read the file header - if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) - { - $this->privSwapBackMagicQuotes(); - return $v_result; - } - $v_header['index'] = $i; - - // ----- Get the only interesting attributes - $this->privConvertHeader2FileInfo($v_header, $p_list[$i]); - unset($v_header); - } - - // ----- Close the zip file - $this->privCloseFd(); - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privConvertHeader2FileInfo() - // Description : - // This function takes the file informations from the central directory - // entries and extract the interesting parameters that will be given back. - // The resulting file infos are set in the array $p_info - // $p_info['filename'] : Filename with full path. Given by user (add), - // extracted in the filesystem (extract). - // $p_info['stored_filename'] : Stored filename in the archive. - // $p_info['size'] = Size of the file. - // $p_info['compressed_size'] = Compressed size of the file. - // $p_info['mtime'] = Last modification date of the file. - // $p_info['comment'] = Comment associated with the file. - // $p_info['folder'] = true/false : indicates if the entry is a folder or not. - // $p_info['status'] = status of the action on the file. - // $p_info['crc'] = CRC of the file content. - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privConvertHeader2FileInfo($p_header, &$p_info) - { - $v_result=1; - - // ----- Get the interesting attributes - $v_temp_path = PclZipUtilPathReduction($p_header['filename']); - $p_info['filename'] = $v_temp_path; - $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']); - $p_info['stored_filename'] = $v_temp_path; - $p_info['size'] = $p_header['size']; - $p_info['compressed_size'] = $p_header['compressed_size']; - $p_info['mtime'] = $p_header['mtime']; - $p_info['comment'] = $p_header['comment']; - $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010); - $p_info['index'] = $p_header['index']; - $p_info['status'] = $p_header['status']; - $p_info['crc'] = $p_header['crc']; - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractByRule() - // Description : - // Extract a file or directory depending of rules (by index, by name, ...) - // Parameters : - // $p_file_list : An array where will be placed the properties of each - // extracted file - // $p_path : Path to add while writing the extracted files - // $p_remove_path : Path to remove (from the file memorized path) while writing the - // extracted files. If the path does not match the file path, - // the file is extracted with its memorized path. - // $p_remove_path does not apply to 'list' mode. - // $p_path and $p_remove_path are commulative. - // Return Values : - // 1 on success,0 or less on error (see error code list) - // -------------------------------------------------------------------------------- - function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) - { - $v_result=1; - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Check the path - if ( ($p_path == "") - || ( (substr($p_path, 0, 1) != "/") - && (substr($p_path, 0, 3) != "../") - && (substr($p_path,1,2)!=":/"))) - $p_path = "./".$p_path; - - // ----- Reduce the path last (and duplicated) '/' - if (($p_path != "./") && ($p_path != "/")) - { - // ----- Look for the path end '/' - while (substr($p_path, -1) == "/") - { - $p_path = substr($p_path, 0, strlen($p_path)-1); - } - } - - // ----- Look for path to remove format (should end by /) - if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) - { - $p_remove_path .= '/'; - } - $p_remove_path_size = strlen($p_remove_path); - - // ----- Open the zip file - if (($v_result = $this->privOpenFd('rb')) != 1) - { - $this->privSwapBackMagicQuotes(); - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - return $v_result; - } - - // ----- Start at beginning of Central Dir - $v_pos_entry = $v_central_dir['offset']; - - // ----- Read each entry - $j_start = 0; - for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) - { - - // ----- Read next Central dir entry - @rewind($this->zip_fd); - if (@fseek($this->zip_fd, $v_pos_entry)) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read the file header - $v_header = array(); - if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - return $v_result; - } - - // ----- Store the index - $v_header['index'] = $i; - - // ----- Store the file position - $v_pos_entry = ftell($this->zip_fd); - - // ----- Look for the specific extract rules - $v_extract = false; - - // ----- Look for extract by name rule - if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) - && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { - - // ----- Look if the filename is in the list - for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) - && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { - $v_extract = true; - } - } - // ----- Look for a filename - elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { - $v_extract = true; - } - } - } - - // ----- Look for extract by ereg rule - // ereg() is deprecated with PHP 5.3 - /* - else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) - && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { - - if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) { - $v_extract = true; - } - } - */ - - // ----- Look for extract by preg rule - else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) - && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { - - if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) { - $v_extract = true; - } - } - - // ----- Look for extract by index rule - else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) - && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { - - // ----- Look if the index is in the list - for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { - $v_extract = true; - } - if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { - $j_start = $j+1; - } - - if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { - break; - } - } - } - - // ----- Look for no rule, which means extract all the archive - else { - $v_extract = true; - } - - // ----- Check compression method - if ( ($v_extract) - && ( ($v_header['compression'] != 8) - && ($v_header['compression'] != 0))) { - $v_header['status'] = 'unsupported_compression'; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - - $this->privSwapBackMagicQuotes(); - - PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, - "Filename '".$v_header['stored_filename']."' is " - ."compressed by an unsupported compression " - ."method (".$v_header['compression'].") "); - - return PclZip::errorCode(); - } - } - - // ----- Check encrypted files - if (($v_extract) && (($v_header['flag'] & 1) == 1)) { - $v_header['status'] = 'unsupported_encryption'; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - - $this->privSwapBackMagicQuotes(); - - PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, - "Unsupported encryption for " - ." filename '".$v_header['stored_filename'] - ."'"); - - return PclZip::errorCode(); - } - } - - // ----- Look for real extraction - if (($v_extract) && ($v_header['status'] != 'ok')) { - $v_result = $this->privConvertHeader2FileInfo($v_header, - $p_file_list[$v_nb_extracted++]); - if ($v_result != 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result; - } - - $v_extract = false; - } - - // ----- Look for real extraction - if ($v_extract) - { - - // ----- Go to the file position - @rewind($this->zip_fd); - if (@fseek($this->zip_fd, $v_header['offset'])) - { - // ----- Close the zip file - $this->privCloseFd(); - - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Look for extraction as string - if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) { - - $v_string = ''; - - // ----- Extracting the file - $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options); - if ($v_result1 < 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result1; - } - - // ----- Get the only interesting attributes - if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - return $v_result; - } - - // ----- Set the file content - $p_file_list[$v_nb_extracted]['content'] = $v_string; - - // ----- Next extracted file - $v_nb_extracted++; - - // ----- Look for user callback abort - if ($v_result1 == 2) { - break; - } - } - // ----- Look for extraction in standard output - elseif ( (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) - && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) { - // ----- Extracting the file in standard output - $v_result1 = $this->privExtractFileInOutput($v_header, $p_options); - if ($v_result1 < 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result1; - } - - // ----- Get the only interesting attributes - if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result; - } - - // ----- Look for user callback abort - if ($v_result1 == 2) { - break; - } - } - // ----- Look for normal extraction - else { - // ----- Extracting the file - $v_result1 = $this->privExtractFile($v_header, - $p_path, $p_remove_path, - $p_remove_all_path, - $p_options); - if ($v_result1 < 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result1; - } - - // ----- Get the only interesting attributes - if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - return $v_result; - } - - // ----- Look for user callback abort - if ($v_result1 == 2) { - break; - } - } - } - } - - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractFile() - // Description : - // Parameters : - // Return Values : - // - // 1 : ... ? - // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback - // -------------------------------------------------------------------------------- - function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) - { - $v_result=1; - - // ----- Read the file header - if (($v_result = $this->privReadFileHeader($v_header)) != 1) - { - // ----- Return - return $v_result; - } - - - // ----- Check that the file header is coherent with $p_entry info - if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { - // TBC - } - - // ----- Look for all path to remove - if ($p_remove_all_path == true) { - // ----- Look for folder entry that not need to be extracted - if (($p_entry['external']&0x00000010)==0x00000010) { - - $p_entry['status'] = "filtered"; - - return $v_result; - } - - // ----- Get the basename of the path - $p_entry['filename'] = basename($p_entry['filename']); - } - - // ----- Look for path to remove - else if ($p_remove_path != "") - { - if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) - { - - // ----- Change the file status - $p_entry['status'] = "filtered"; - - // ----- Return - return $v_result; - } - - $p_remove_path_size = strlen($p_remove_path); - if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) - { - - // ----- Remove the path - $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size); - - } - } - - // ----- Add the path - if ($p_path != '') { - $p_entry['filename'] = $p_path."/".$p_entry['filename']; - } - - // ----- Check a base_dir_restriction - if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) { - $v_inclusion - = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION], - $p_entry['filename']); - if ($v_inclusion == 0) { - - PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION, - "Filename '".$p_entry['filename']."' is " - ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION"); - - return PclZip::errorCode(); - } - } - - // ----- Look for pre-extract callback - if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); - if ($v_result == 0) { - // ----- Change the file status - $p_entry['status'] = "skipped"; - $v_result = 1; - } - - // ----- Look for abort result - if ($v_result == 2) { - // ----- This status is internal and will be changed in 'skipped' - $p_entry['status'] = "aborted"; - $v_result = PCLZIP_ERR_USER_ABORTED; - } - - // ----- Update the informations - // Only some fields can be modified - $p_entry['filename'] = $v_local_header['filename']; - } - - - // ----- Look if extraction should be done - if ($p_entry['status'] == 'ok') { - - // ----- Look for specific actions while the file exist - if (file_exists($p_entry['filename'])) - { - - // ----- Look if file is a directory - if (is_dir($p_entry['filename'])) - { - - // ----- Change the file status - $p_entry['status'] = "already_a_directory"; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - // For historical reason first PclZip implementation does not stop - // when this kind of error occurs. - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - - PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY, - "Filename '".$p_entry['filename']."' is " - ."already used by an existing directory"); - - return PclZip::errorCode(); - } - } - // ----- Look if file is write protected - else if (!is_writeable($p_entry['filename'])) - { - - // ----- Change the file status - $p_entry['status'] = "write_protected"; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - // For historical reason first PclZip implementation does not stop - // when this kind of error occurs. - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, - "Filename '".$p_entry['filename']."' exists " - ."and is write protected"); - - return PclZip::errorCode(); - } - } - - // ----- Look if the extracted file is older - else if (filemtime($p_entry['filename']) > $p_entry['mtime']) - { - // ----- Change the file status - if ( (isset($p_options[PCLZIP_OPT_REPLACE_NEWER])) - && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) { - } - else { - $p_entry['status'] = "newer_exist"; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - // For historical reason first PclZip implementation does not stop - // when this kind of error occurs. - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, - "Newer version of '".$p_entry['filename']."' exists " - ."and option PCLZIP_OPT_REPLACE_NEWER is not selected"); - - return PclZip::errorCode(); - } - } - } - else { - } - } - - // ----- Check the directory availability and create it if necessary - else { - if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/')) - $v_dir_to_check = $p_entry['filename']; - else if (!strstr($p_entry['filename'], "/")) - $v_dir_to_check = ""; - else - $v_dir_to_check = dirname($p_entry['filename']); - - if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) { - - // ----- Change the file status - $p_entry['status'] = "path_creation_fail"; - - // ----- Return - //return $v_result; - $v_result = 1; - } - } - } - - // ----- Look if extraction should be done - if ($p_entry['status'] == 'ok') { - - // ----- Do the extraction (if not a folder) - if (!(($p_entry['external']&0x00000010)==0x00000010)) - { - // ----- Look for not compressed file - if ($p_entry['compression'] == 0) { - - // ----- Opening destination file - if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) - { - - // ----- Change the file status - $p_entry['status'] = "write_error"; - - // ----- Return - return $v_result; - } - - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - $v_size = $p_entry['compressed_size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($this->zip_fd, $v_read_size); - /* Try to speed up the code - $v_binary_data = pack('a'.$v_read_size, $v_buffer); - @fwrite($v_dest_file, $v_binary_data, $v_read_size); - */ - @fwrite($v_dest_file, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Closing the destination file - fclose($v_dest_file); - - // ----- Change the file mtime - touch($p_entry['filename'], $p_entry['mtime']); - - - } - else { - // ----- TBC - // Need to be finished - if (($p_entry['flag'] & 1) == 1) { - PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \''.$p_entry['filename'].'\' is encrypted. Encrypted files are not supported.'); - return PclZip::errorCode(); - } - - - // ----- Look for using temporary file to unzip - if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) - && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) - || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) - && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) ) ) { - $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options); - if ($v_result < PCLZIP_ERR_NO_ERROR) { - return $v_result; - } - } - - // ----- Look for extract in memory - else { - - - // ----- Read the compressed file in a buffer (one shot) - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); - - // ----- Decompress the file - $v_file_content = @gzinflate($v_buffer); - unset($v_buffer); - if ($v_file_content === FALSE) { - - // ----- Change the file status - // TBC - $p_entry['status'] = "error"; - - return $v_result; - } - - // ----- Opening destination file - if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { - - // ----- Change the file status - $p_entry['status'] = "write_error"; - - return $v_result; - } - - // ----- Write the uncompressed data - @fwrite($v_dest_file, $v_file_content, $p_entry['size']); - unset($v_file_content); - - // ----- Closing the destination file - @fclose($v_dest_file); - - } - - // ----- Change the file mtime - @touch($p_entry['filename'], $p_entry['mtime']); - } - - // ----- Look for chmod option - if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) { - - // ----- Change the mode of the file - @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]); - } - - } - } - - // ----- Change abort status - if ($p_entry['status'] == "aborted") { - $p_entry['status'] = "skipped"; - } - - // ----- Look for post-extract callback - elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); - - // ----- Look for abort result - if ($v_result == 2) { - $v_result = PCLZIP_ERR_USER_ABORTED; - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractFileUsingTempFile() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privExtractFileUsingTempFile(&$p_entry, &$p_options) - { - $v_result=1; - - // ----- Creates a temporary file - $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; - if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) { - fclose($v_file); - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); - return PclZip::errorCode(); - } - - - // ----- Write gz file format header - $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3)); - @fwrite($v_dest_file, $v_binary_data, 10); - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - $v_size = $p_entry['compressed_size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($this->zip_fd, $v_read_size); - //$v_binary_data = pack('a'.$v_read_size, $v_buffer); - @fwrite($v_dest_file, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Write gz file format footer - $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']); - @fwrite($v_dest_file, $v_binary_data, 8); - - // ----- Close the temporary file - @fclose($v_dest_file); - - // ----- Opening destination file - if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { - $p_entry['status'] = "write_error"; - return $v_result; - } - - // ----- Open the temporary gz file - if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) { - @fclose($v_dest_file); - $p_entry['status'] = "read_error"; - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); - return PclZip::errorCode(); - } - - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - $v_size = $p_entry['size']; - while ($v_size != 0) { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @gzread($v_src_file, $v_read_size); - //$v_binary_data = pack('a'.$v_read_size, $v_buffer); - @fwrite($v_dest_file, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - @fclose($v_dest_file); - @gzclose($v_src_file); - - // ----- Delete the temporary file - @unlink($v_gzip_temp_name); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractFileInOutput() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privExtractFileInOutput(&$p_entry, &$p_options) - { - $v_result=1; - - // ----- Read the file header - if (($v_result = $this->privReadFileHeader($v_header)) != 1) { - return $v_result; - } - - - // ----- Check that the file header is coherent with $p_entry info - if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { - // TBC - } - - // ----- Look for pre-extract callback - if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); - if ($v_result == 0) { - // ----- Change the file status - $p_entry['status'] = "skipped"; - $v_result = 1; - } - - // ----- Look for abort result - if ($v_result == 2) { - // ----- This status is internal and will be changed in 'skipped' - $p_entry['status'] = "aborted"; - $v_result = PCLZIP_ERR_USER_ABORTED; - } - - // ----- Update the informations - // Only some fields can be modified - $p_entry['filename'] = $v_local_header['filename']; - } - - // ----- Trace - - // ----- Look if extraction should be done - if ($p_entry['status'] == 'ok') { - - // ----- Do the extraction (if not a folder) - if (!(($p_entry['external']&0x00000010)==0x00000010)) { - // ----- Look for not compressed file - if ($p_entry['compressed_size'] == $p_entry['size']) { - - // ----- Read the file in a buffer (one shot) - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); - - // ----- Send the file to the output - echo $v_buffer; - unset($v_buffer); - } - else { - - // ----- Read the compressed file in a buffer (one shot) - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); - - // ----- Decompress the file - $v_file_content = gzinflate($v_buffer); - unset($v_buffer); - - // ----- Send the file to the output - echo $v_file_content; - unset($v_file_content); - } - } - } - - // ----- Change abort status - if ($p_entry['status'] == "aborted") { - $p_entry['status'] = "skipped"; - } - - // ----- Look for post-extract callback - elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); - - // ----- Look for abort result - if ($v_result == 2) { - $v_result = PCLZIP_ERR_USER_ABORTED; - } - } - - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractFileAsString() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privExtractFileAsString(&$p_entry, &$p_string, &$p_options) - { - $v_result=1; - - // ----- Read the file header - $v_header = array(); - if (($v_result = $this->privReadFileHeader($v_header)) != 1) - { - // ----- Return - return $v_result; - } - - - // ----- Check that the file header is coherent with $p_entry info - if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { - // TBC - } - - // ----- Look for pre-extract callback - if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); - if ($v_result == 0) { - // ----- Change the file status - $p_entry['status'] = "skipped"; - $v_result = 1; - } - - // ----- Look for abort result - if ($v_result == 2) { - // ----- This status is internal and will be changed in 'skipped' - $p_entry['status'] = "aborted"; - $v_result = PCLZIP_ERR_USER_ABORTED; - } - - // ----- Update the informations - // Only some fields can be modified - $p_entry['filename'] = $v_local_header['filename']; - } - - - // ----- Look if extraction should be done - if ($p_entry['status'] == 'ok') { - - // ----- Do the extraction (if not a folder) - if (!(($p_entry['external']&0x00000010)==0x00000010)) { - // ----- Look for not compressed file - // if ($p_entry['compressed_size'] == $p_entry['size']) - if ($p_entry['compression'] == 0) { - - // ----- Reading the file - $p_string = @fread($this->zip_fd, $p_entry['compressed_size']); - } - else { - - // ----- Reading the file - $v_data = @fread($this->zip_fd, $p_entry['compressed_size']); - - // ----- Decompress the file - if (($p_string = @gzinflate($v_data)) === FALSE) { - // TBC - } - } - - // ----- Trace - } - else { - // TBC : error : can not extract a folder in a string - } - - } - - // ----- Change abort status - if ($p_entry['status'] == "aborted") { - $p_entry['status'] = "skipped"; - } - - // ----- Look for post-extract callback - elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Swap the content to header - $v_local_header['content'] = $p_string; - $p_string = ''; - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); - - // ----- Swap back the content to header - $p_string = $v_local_header['content']; - unset($v_local_header['content']); - - // ----- Look for abort result - if ($v_result == 2) { - $v_result = PCLZIP_ERR_USER_ABORTED; - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privReadFileHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privReadFileHeader(&$p_header) - { - $v_result=1; - - // ----- Read the 4 bytes signature - $v_binary_data = @fread($this->zip_fd, 4); - $v_data = unpack('Vid', $v_binary_data); - - // ----- Check signature - if ($v_data['id'] != 0x04034b50) - { - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read the first 42 bytes of the header - $v_binary_data = fread($this->zip_fd, 26); - - // ----- Look for invalid block size - if (strlen($v_binary_data) != 26) - { - $p_header['filename'] = ""; - $p_header['status'] = "invalid_header"; - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Extract the values - $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data); - - // ----- Get filename - $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']); - - // ----- Get extra_fields - if ($v_data['extra_len'] != 0) { - $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']); - } - else { - $p_header['extra'] = ''; - } - - // ----- Extract properties - $p_header['version_extracted'] = $v_data['version']; - $p_header['compression'] = $v_data['compression']; - $p_header['size'] = $v_data['size']; - $p_header['compressed_size'] = $v_data['compressed_size']; - $p_header['crc'] = $v_data['crc']; - $p_header['flag'] = $v_data['flag']; - $p_header['filename_len'] = $v_data['filename_len']; - - // ----- Recuperate date in UNIX format - $p_header['mdate'] = $v_data['mdate']; - $p_header['mtime'] = $v_data['mtime']; - if ($p_header['mdate'] && $p_header['mtime']) - { - // ----- Extract time - $v_hour = ($p_header['mtime'] & 0xF800) >> 11; - $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; - $v_seconde = ($p_header['mtime'] & 0x001F)*2; - - // ----- Extract date - $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; - $v_month = ($p_header['mdate'] & 0x01E0) >> 5; - $v_day = $p_header['mdate'] & 0x001F; - - // ----- Get UNIX date format - $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); - - } - else - { - $p_header['mtime'] = time(); - } - - // TBC - //for(reset($v_data); $key = key($v_data); next($v_data)) { - //} - - // ----- Set the stored filename - $p_header['stored_filename'] = $p_header['filename']; - - // ----- Set the status field - $p_header['status'] = "ok"; - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privReadCentralFileHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privReadCentralFileHeader(&$p_header) - { - $v_result=1; - - // ----- Read the 4 bytes signature - $v_binary_data = @fread($this->zip_fd, 4); - $v_data = unpack('Vid', $v_binary_data); - - // ----- Check signature - if ($v_data['id'] != 0x02014b50) - { - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read the first 42 bytes of the header - $v_binary_data = fread($this->zip_fd, 42); - - // ----- Look for invalid block size - if (strlen($v_binary_data) != 42) - { - $p_header['filename'] = ""; - $p_header['status'] = "invalid_header"; - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Extract the values - $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data); - - // ----- Get filename - if ($p_header['filename_len'] != 0) - $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']); - else - $p_header['filename'] = ''; - - // ----- Get extra - if ($p_header['extra_len'] != 0) - $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']); - else - $p_header['extra'] = ''; - - // ----- Get comment - if ($p_header['comment_len'] != 0) - $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']); - else - $p_header['comment'] = ''; - - // ----- Extract properties - - // ----- Recuperate date in UNIX format - //if ($p_header['mdate'] && $p_header['mtime']) - // TBC : bug : this was ignoring time with 0/0/0 - if (1) - { - // ----- Extract time - $v_hour = ($p_header['mtime'] & 0xF800) >> 11; - $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; - $v_seconde = ($p_header['mtime'] & 0x001F)*2; - - // ----- Extract date - $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; - $v_month = ($p_header['mdate'] & 0x01E0) >> 5; - $v_day = $p_header['mdate'] & 0x001F; - - // ----- Get UNIX date format - $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); - - } - else - { - $p_header['mtime'] = time(); - } - - // ----- Set the stored filename - $p_header['stored_filename'] = $p_header['filename']; - - // ----- Set default status to ok - $p_header['status'] = 'ok'; - - // ----- Look if it is a directory - if (substr($p_header['filename'], -1) == '/') { - //$p_header['external'] = 0x41FF0010; - $p_header['external'] = 0x00000010; - } - - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privCheckFileHeaders() - // Description : - // Parameters : - // Return Values : - // 1 on success, - // 0 on error; - // -------------------------------------------------------------------------------- - function privCheckFileHeaders(&$p_local_header, &$p_central_header) - { - $v_result=1; - - // ----- Check the static values - // TBC - if ($p_local_header['filename'] != $p_central_header['filename']) { - } - if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) { - } - if ($p_local_header['flag'] != $p_central_header['flag']) { - } - if ($p_local_header['compression'] != $p_central_header['compression']) { - } - if ($p_local_header['mtime'] != $p_central_header['mtime']) { - } - if ($p_local_header['filename_len'] != $p_central_header['filename_len']) { - } - - // ----- Look for flag bit 3 - if (($p_local_header['flag'] & 8) == 8) { - $p_local_header['size'] = $p_central_header['size']; - $p_local_header['compressed_size'] = $p_central_header['compressed_size']; - $p_local_header['crc'] = $p_central_header['crc']; - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privReadEndCentralDir() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privReadEndCentralDir(&$p_central_dir) - { - $v_result=1; - - // ----- Go to the end of the zip file - $v_size = filesize($this->zipname); - @fseek($this->zip_fd, $v_size); - if (@ftell($this->zip_fd) != $v_size) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\''); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- First try : look if this is an archive with no commentaries (most of the time) - // in this case the end of central dir is at 22 bytes of the file end - $v_found = 0; - if ($v_size > 26) { - @fseek($this->zip_fd, $v_size-22); - if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22)) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read for bytes - $v_binary_data = @fread($this->zip_fd, 4); - $v_data = @unpack('Vid', $v_binary_data); - - // ----- Check signature - if ($v_data['id'] == 0x06054b50) { - $v_found = 1; - } - - $v_pos = ftell($this->zip_fd); - } - - // ----- Go back to the maximum possible size of the Central Dir End Record - if (!$v_found) { - $v_maximum_size = 65557; // 0xFFFF + 22; - if ($v_maximum_size > $v_size) - $v_maximum_size = $v_size; - @fseek($this->zip_fd, $v_size-$v_maximum_size); - if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size)) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read byte per byte in order to find the signature - $v_pos = ftell($this->zip_fd); - $v_bytes = 0x00000000; - while ($v_pos < $v_size) - { - // ----- Read a byte - $v_byte = @fread($this->zip_fd, 1); - - // ----- Add the byte - //$v_bytes = ($v_bytes << 8) | Ord($v_byte); - // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number - // Otherwise on systems where we have 64bit integers the check below for the magic number will fail. - $v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte); - - // ----- Compare the bytes - if ($v_bytes == 0x504b0506) - { - $v_pos++; - break; - } - - $v_pos++; - } - - // ----- Look if not found end of central dir - if ($v_pos == $v_size) - { - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature"); - - // ----- Return - return PclZip::errorCode(); - } - } - - // ----- Read the first 18 bytes of the header - $v_binary_data = fread($this->zip_fd, 18); - - // ----- Look for invalid block size - if (strlen($v_binary_data) != 18) - { - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data)); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Extract the values - $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data); - - // ----- Check the global size - if (($v_pos + $v_data['comment_size'] + 18) != $v_size) { - - // ----- Removed in release 2.2 see readme file - // The check of the file size is a little too strict. - // Some bugs where found when a zip is encrypted/decrypted with 'crypt'. - // While decrypted, zip has training 0 bytes - if (0) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, - 'The central dir is not at the end of the archive.' - .' Some trailing bytes exists after the archive.'); - - // ----- Return - return PclZip::errorCode(); - } - } - - // ----- Get comment - if ($v_data['comment_size'] != 0) { - $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']); - } - else - $p_central_dir['comment'] = ''; - - $p_central_dir['entries'] = $v_data['entries']; - $p_central_dir['disk_entries'] = $v_data['disk_entries']; - $p_central_dir['offset'] = $v_data['offset']; - $p_central_dir['size'] = $v_data['size']; - $p_central_dir['disk'] = $v_data['disk']; - $p_central_dir['disk_start'] = $v_data['disk_start']; - - // TBC - //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) { - //} - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privDeleteByRule() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privDeleteByRule(&$p_result_list, &$p_options) - { - $v_result=1; - $v_list_detail = array(); - - // ----- Open the zip file - if (($v_result=$this->privOpenFd('rb')) != 1) - { - // ----- Return - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privCloseFd(); - return $v_result; - } - - // ----- Go to beginning of File - @rewind($this->zip_fd); - - // ----- Scan all the files - // ----- Start at beginning of Central Dir - $v_pos_entry = $v_central_dir['offset']; - @rewind($this->zip_fd); - if (@fseek($this->zip_fd, $v_pos_entry)) - { - // ----- Close the zip file - $this->privCloseFd(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read each entry - $v_header_list = array(); - $j_start = 0; - for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) - { - - // ----- Read the file header - $v_header_list[$v_nb_extracted] = array(); - if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - - return $v_result; - } - - - // ----- Store the index - $v_header_list[$v_nb_extracted]['index'] = $i; - - // ----- Look for the specific extract rules - $v_found = false; - - // ----- Look for extract by name rule - if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) - && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { - - // ----- Look if the filename is in the list - for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) - && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { - $v_found = true; - } - elseif ( (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */ - && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) { - $v_found = true; - } - } - // ----- Look for a filename - elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { - $v_found = true; - } - } - } - - // ----- Look for extract by ereg rule - // ereg() is deprecated with PHP 5.3 - /* - else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) - && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { - - if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { - $v_found = true; - } - } - */ - - // ----- Look for extract by preg rule - else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) - && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { - - if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { - $v_found = true; - } - } - - // ----- Look for extract by index rule - else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) - && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { - - // ----- Look if the index is in the list - for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { - $v_found = true; - } - if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { - $j_start = $j+1; - } - - if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { - break; - } - } - } - else { - $v_found = true; - } - - // ----- Look for deletion - if ($v_found) - { - unset($v_header_list[$v_nb_extracted]); - } - else - { - $v_nb_extracted++; - } - } - - // ----- Look if something need to be deleted - if ($v_nb_extracted > 0) { - - // ----- Creates a temporay file - $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; - - // ----- Creates a temporary zip archive - $v_temp_zip = new PclZip($v_zip_temp_name); - - // ----- Open the temporary zip file in write mode - if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) { - $this->privCloseFd(); - - // ----- Return - return $v_result; - } - - // ----- Look which file need to be kept - for ($i=0; $izip_fd); - if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) { - // ----- Close the zip file - $this->privCloseFd(); - $v_temp_zip->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read the file header - $v_local_header = array(); - if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) { - // ----- Close the zip file - $this->privCloseFd(); - $v_temp_zip->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - return $v_result; - } - - // ----- Check that local file header is same as central file header - if ($this->privCheckFileHeaders($v_local_header, - $v_header_list[$i]) != 1) { - // TBC - } - unset($v_local_header); - - // ----- Write the file header - if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) { - // ----- Close the zip file - $this->privCloseFd(); - $v_temp_zip->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - return $v_result; - } - - // ----- Read/write the data block - if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) { - // ----- Close the zip file - $this->privCloseFd(); - $v_temp_zip->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - return $v_result; - } - } - - // ----- Store the offset of the central dir - $v_offset = @ftell($v_temp_zip->zip_fd); - - // ----- Re-Create the Central Dir files header - for ($i=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { - $v_temp_zip->privCloseFd(); - $this->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - return $v_result; - } - - // ----- Transform the header to a 'usable' info - $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); - } - - - // ----- Zip file comment - $v_comment = ''; - if (isset($p_options[PCLZIP_OPT_COMMENT])) { - $v_comment = $p_options[PCLZIP_OPT_COMMENT]; - } - - // ----- Calculate the size of the central header - $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset; - - // ----- Create the central dir footer - if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) { - // ----- Reset the file list - unset($v_header_list); - $v_temp_zip->privCloseFd(); - $this->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - return $v_result; - } - - // ----- Close - $v_temp_zip->privCloseFd(); - $this->privCloseFd(); - - // ----- Delete the zip file - // TBC : I should test the result ... - @unlink($this->zipname); - - // ----- Rename the temporary file - // TBC : I should test the result ... - //@rename($v_zip_temp_name, $this->zipname); - PclZipUtilRename($v_zip_temp_name, $this->zipname); - - // ----- Destroy the temporary archive - unset($v_temp_zip); - } - - // ----- Remove every files : reset the file - else if ($v_central_dir['entries'] != 0) { - $this->privCloseFd(); - - if (($v_result = $this->privOpenFd('wb')) != 1) { - return $v_result; - } - - if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) { - return $v_result; - } - - $this->privCloseFd(); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privDirCheck() - // Description : - // Check if a directory exists, if not it creates it and all the parents directory - // which may be useful. - // Parameters : - // $p_dir : Directory path to check. - // Return Values : - // 1 : OK - // -1 : Unable to create directory - // -------------------------------------------------------------------------------- - function privDirCheck($p_dir, $p_is_dir=false) - { - $v_result = 1; - - - // ----- Remove the final '/' - if (($p_is_dir) && (substr($p_dir, -1)=='/')) - { - $p_dir = substr($p_dir, 0, strlen($p_dir)-1); - } - - // ----- Check the directory availability - if ((is_dir($p_dir)) || ($p_dir == "")) - { - return 1; - } - - // ----- Extract parent directory - $p_parent_dir = dirname($p_dir); - - // ----- Just a check - if ($p_parent_dir != $p_dir) - { - // ----- Look for parent directory - if ($p_parent_dir != "") - { - if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) - { - return $v_result; - } - } - } - - // ----- Create the directory - if (!@mkdir($p_dir, 0777)) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privMerge() - // Description : - // If $p_archive_to_add does not exist, the function exit with a success result. - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privMerge(&$p_archive_to_add) - { - $v_result=1; - - // ----- Look if the archive_to_add exists - if (!is_file($p_archive_to_add->zipname)) - { - - // ----- Nothing to merge, so merge is a success - $v_result = 1; - - // ----- Return - return $v_result; - } - - // ----- Look if the archive exists - if (!is_file($this->zipname)) - { - - // ----- Do a duplicate - $v_result = $this->privDuplicate($p_archive_to_add->zipname); - - // ----- Return - return $v_result; - } - - // ----- Open the zip file - if (($v_result=$this->privOpenFd('rb')) != 1) - { - // ----- Return - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privCloseFd(); - return $v_result; - } - - // ----- Go to beginning of File - @rewind($this->zip_fd); - - // ----- Open the archive_to_add file - if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1) - { - $this->privCloseFd(); - - // ----- Return - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir_to_add = array(); - if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) - { - $this->privCloseFd(); - $p_archive_to_add->privCloseFd(); - - return $v_result; - } - - // ----- Go to beginning of File - @rewind($p_archive_to_add->zip_fd); - - // ----- Creates a temporay file - $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; - - // ----- Open the temporary file in write mode - if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) - { - $this->privCloseFd(); - $p_archive_to_add->privCloseFd(); - - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Copy the files from the archive to the temporary file - // TBC : Here I should better append the file and go back to erase the central dir - $v_size = $v_central_dir['offset']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = fread($this->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Copy the files from the archive_to_add into the temporary file - $v_size = $v_central_dir_to_add['offset']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Store the offset of the central dir - $v_offset = @ftell($v_zip_temp_fd); - - // ----- Copy the block of file headers from the old archive - $v_size = $v_central_dir['size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($this->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Copy the block of file headers from the archive_to_add - $v_size = $v_central_dir_to_add['size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Merge the file comments - $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment']; - - // ----- Calculate the size of the (new) central header - $v_size = @ftell($v_zip_temp_fd)-$v_offset; - - // ----- Swap the file descriptor - // Here is a trick : I swap the temporary fd with the zip fd, in order to use - // the following methods on the temporary fil and not the real archive fd - $v_swap = $this->zip_fd; - $this->zip_fd = $v_zip_temp_fd; - $v_zip_temp_fd = $v_swap; - - // ----- Create the central dir footer - if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1) - { - $this->privCloseFd(); - $p_archive_to_add->privCloseFd(); - @fclose($v_zip_temp_fd); - $this->zip_fd = null; - - // ----- Reset the file list - unset($v_header_list); - - // ----- Return - return $v_result; - } - - // ----- Swap back the file descriptor - $v_swap = $this->zip_fd; - $this->zip_fd = $v_zip_temp_fd; - $v_zip_temp_fd = $v_swap; - - // ----- Close - $this->privCloseFd(); - $p_archive_to_add->privCloseFd(); - - // ----- Close the temporary file - @fclose($v_zip_temp_fd); - - // ----- Delete the zip file - // TBC : I should test the result ... - @unlink($this->zipname); - - // ----- Rename the temporary file - // TBC : I should test the result ... - //@rename($v_zip_temp_name, $this->zipname); - PclZipUtilRename($v_zip_temp_name, $this->zipname); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privDuplicate() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privDuplicate($p_archive_filename) - { - $v_result=1; - - // ----- Look if the $p_archive_filename exists - if (!is_file($p_archive_filename)) - { - - // ----- Nothing to duplicate, so duplicate is a success. - $v_result = 1; - - // ----- Return - return $v_result; - } - - // ----- Open the zip file - if (($v_result=$this->privOpenFd('wb')) != 1) - { - // ----- Return - return $v_result; - } - - // ----- Open the temporary file in write mode - if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) - { - $this->privCloseFd(); - - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Copy the files from the archive to the temporary file - // TBC : Here I should better append the file and go back to erase the central dir - $v_size = filesize($p_archive_filename); - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = fread($v_zip_temp_fd, $v_read_size); - @fwrite($this->zip_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Close - $this->privCloseFd(); - - // ----- Close the temporary file - @fclose($v_zip_temp_fd); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privErrorLog() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function privErrorLog($p_error_code=0, $p_error_string='') - { - if (PCLZIP_ERROR_EXTERNAL == 1) { - PclError($p_error_code, $p_error_string); - } - else { - $this->error_code = $p_error_code; - $this->error_string = $p_error_string; - } - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privErrorReset() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function privErrorReset() - { - if (PCLZIP_ERROR_EXTERNAL == 1) { - PclErrorReset(); - } - else { - $this->error_code = 0; - $this->error_string = ''; - } - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privDisableMagicQuotes() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privDisableMagicQuotes() - { - $v_result=1; - - // ----- Look if function exists - if ( (!function_exists("get_magic_quotes_runtime")) - || (!function_exists("set_magic_quotes_runtime"))) { - return $v_result; - } - - // ----- Look if already done - if ($this->magic_quotes_status != -1) { - return $v_result; - } - - // ----- Get and memorize the magic_quote value - $this->magic_quotes_status = @get_magic_quotes_runtime(); - - // ----- Disable magic_quotes - if ($this->magic_quotes_status == 1) { - @set_magic_quotes_runtime(0); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privSwapBackMagicQuotes() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privSwapBackMagicQuotes() - { - $v_result=1; - - // ----- Look if function exists - if ( (!function_exists("get_magic_quotes_runtime")) - || (!function_exists("set_magic_quotes_runtime"))) { - return $v_result; - } - - // ----- Look if something to do - if ($this->magic_quotes_status != -1) { - return $v_result; - } - - // ----- Swap back magic_quotes - if ($this->magic_quotes_status == 1) { - @set_magic_quotes_runtime($this->magic_quotes_status); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - } - // End of class - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclZipUtilPathReduction() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function PclZipUtilPathReduction($p_dir) - { - $v_result = ""; - - // ----- Look for not empty path - if ($p_dir != "") { - // ----- Explode path by directory names - $v_list = explode("/", $p_dir); - - // ----- Study directories from last to first - $v_skip = 0; - for ($i=sizeof($v_list)-1; $i>=0; $i--) { - // ----- Look for current path - if ($v_list[$i] == ".") { - // ----- Ignore this directory - // Should be the first $i=0, but no check is done - } - else if ($v_list[$i] == "..") { - $v_skip++; - } - else if ($v_list[$i] == "") { - // ----- First '/' i.e. root slash - if ($i == 0) { - $v_result = "/".$v_result; - if ($v_skip > 0) { - // ----- It is an invalid path, so the path is not modified - // TBC - $v_result = $p_dir; - $v_skip = 0; - } - } - // ----- Last '/' i.e. indicates a directory - else if ($i == (sizeof($v_list)-1)) { - $v_result = $v_list[$i]; - } - // ----- Double '/' inside the path - else { - // ----- Ignore only the double '//' in path, - // but not the first and last '/' - } - } - else { - // ----- Look for item to skip - if ($v_skip > 0) { - $v_skip--; - } - else { - $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:""); - } - } - } - - // ----- Look for skip - if ($v_skip > 0) { - while ($v_skip > 0) { - $v_result = '../'.$v_result; - $v_skip--; - } - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclZipUtilPathInclusion() - // Description : - // This function indicates if the path $p_path is under the $p_dir tree. Or, - // said in an other way, if the file or sub-dir $p_path is inside the dir - // $p_dir. - // The function indicates also if the path is exactly the same as the dir. - // This function supports path with duplicated '/' like '//', but does not - // support '.' or '..' statements. - // Parameters : - // Return Values : - // 0 if $p_path is not inside directory $p_dir - // 1 if $p_path is inside directory $p_dir - // 2 if $p_path is exactly the same as $p_dir - // -------------------------------------------------------------------------------- - function PclZipUtilPathInclusion($p_dir, $p_path) - { - $v_result = 1; - - // ----- Look for path beginning by ./ - if ( ($p_dir == '.') - || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) { - $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1); - } - if ( ($p_path == '.') - || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) { - $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1); - } - - // ----- Explode dir and path by directory separator - $v_list_dir = explode("/", $p_dir); - $v_list_dir_size = sizeof($v_list_dir); - $v_list_path = explode("/", $p_path); - $v_list_path_size = sizeof($v_list_path); - - // ----- Study directories paths - $i = 0; - $j = 0; - while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) { - - // ----- Look for empty dir (path reduction) - if ($v_list_dir[$i] == '') { - $i++; - continue; - } - if ($v_list_path[$j] == '') { - $j++; - continue; - } - - // ----- Compare the items - if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != '')) { - $v_result = 0; - } - - // ----- Next items - $i++; - $j++; - } - - // ----- Look if everything seems to be the same - if ($v_result) { - // ----- Skip all the empty items - while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++; - while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++; - - if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) { - // ----- There are exactly the same - $v_result = 2; - } - else if ($i < $v_list_dir_size) { - // ----- The path is shorter than the dir - $v_result = 0; - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclZipUtilCopyBlock() - // Description : - // Parameters : - // $p_mode : read/write compression mode - // 0 : src & dest normal - // 1 : src gzip, dest normal - // 2 : src normal, dest gzip - // 3 : src & dest gzip - // Return Values : - // -------------------------------------------------------------------------------- - function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0) - { - $v_result = 1; - - if ($p_mode==0) - { - while ($p_size != 0) - { - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($p_src, $v_read_size); - @fwrite($p_dest, $v_buffer, $v_read_size); - $p_size -= $v_read_size; - } - } - else if ($p_mode==1) - { - while ($p_size != 0) - { - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @gzread($p_src, $v_read_size); - @fwrite($p_dest, $v_buffer, $v_read_size); - $p_size -= $v_read_size; - } - } - else if ($p_mode==2) - { - while ($p_size != 0) - { - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($p_src, $v_read_size); - @gzwrite($p_dest, $v_buffer, $v_read_size); - $p_size -= $v_read_size; - } - } - else if ($p_mode==3) - { - while ($p_size != 0) - { - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @gzread($p_src, $v_read_size); - @gzwrite($p_dest, $v_buffer, $v_read_size); - $p_size -= $v_read_size; - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclZipUtilRename() - // Description : - // This function tries to do a simple rename() function. If it fails, it - // tries to copy the $p_src file in a new $p_dest file and then unlink the - // first one. - // Parameters : - // $p_src : Old filename - // $p_dest : New filename - // Return Values : - // 1 on success, 0 on failure. - // -------------------------------------------------------------------------------- - function PclZipUtilRename($p_src, $p_dest) - { - $v_result = 1; - - // ----- Try to rename the files - if (!@rename($p_src, $p_dest)) { - - // ----- Try to copy & unlink the src - if (!@copy($p_src, $p_dest)) { - $v_result = 0; - } - else if (!@unlink($p_src)) { - $v_result = 0; - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclZipUtilOptionText() - // Description : - // Translate option value in text. Mainly for debug purpose. - // Parameters : - // $p_option : the option value. - // Return Values : - // The option text value. - // -------------------------------------------------------------------------------- - function PclZipUtilOptionText($p_option) - { - - $v_list = get_defined_constants(); - for (reset($v_list); $v_key = key($v_list); next($v_list)) { - $v_prefix = substr($v_key, 0, 10); - if (( ($v_prefix == 'PCLZIP_OPT') - || ($v_prefix == 'PCLZIP_CB_') - || ($v_prefix == 'PCLZIP_ATT')) - && ($v_list[$v_key] == $p_option)) { - return $v_key; - } - } - - $v_result = 'Unknown'; - - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclZipUtilTranslateWinPath() - // Description : - // Translate windows path by replacing '\' by '/' and optionally removing - // drive letter. - // Parameters : - // $p_path : path to translate. - // $p_remove_disk_letter : true | false - // Return Values : - // The path translated. - // -------------------------------------------------------------------------------- - function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true) - { - if (stristr(php_uname(), 'windows')) { - // ----- Look for potential disk letter - if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { - $p_path = substr($p_path, $v_position+1); - } - // ----- Change potential windows directory separator - if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) { - $p_path = strtr($p_path, '\\', '/'); - } - } - return $p_path; - } - // -------------------------------------------------------------------------------- - - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/gnu-lgpl.txt b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/gnu-lgpl.txt deleted file mode 100755 index cbee875b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/gnu-lgpl.txt +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/pclzip.lib.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/pclzip.lib.php deleted file mode 100755 index 74365b1c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/pclzip.lib.php +++ /dev/null @@ -1,5719 +0,0 @@ -bUseGzopen64 = !function_exists('gzopen') && function_exists('gzopen64'); - - // ----- Set the attributes - $this->zipname = $p_zipname; - $this->zip_fd = 0; - $this->magic_quotes_status = -1; - - // ----- Return - return; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : - // create($p_filelist, $p_add_dir="", $p_remove_dir="") - // create($p_filelist, $p_option, $p_option_value, ...) - // Description : - // This method supports two different synopsis. The first one is historical. - // This method creates a Zip Archive. The Zip file is created in the - // filesystem. The files and directories indicated in $p_filelist - // are added in the archive. See the parameters description for the - // supported format of $p_filelist. - // When a directory is in the list, the directory and its content is added - // in the archive. - // In this synopsis, the function takes an optional variable list of - // options. See bellow the supported options. - // Parameters : - // $p_filelist : An array containing file or directory names, or - // a string containing one filename or one directory name, or - // a string containing a list of filenames and/or directory - // names separated by spaces. - // $p_add_dir : A path to add before the real path of the archived file, - // in order to have it memorized in the archive. - // $p_remove_dir : A path to remove from the real path of the file to archive, - // in order to have a shorter path memorized in the archive. - // When $p_add_dir and $p_remove_dir are set, $p_remove_dir - // is removed first, before $p_add_dir is added. - // Options : - // PCLZIP_OPT_ADD_PATH : - // PCLZIP_OPT_REMOVE_PATH : - // PCLZIP_OPT_REMOVE_ALL_PATH : - // PCLZIP_OPT_COMMENT : - // PCLZIP_CB_PRE_ADD : - // PCLZIP_CB_POST_ADD : - // Return Values : - // 0 on failure, - // The list of the added files, with a status of the add action. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - function create($p_filelist) - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Set default values - $v_options = array(); - $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; - - // ----- Look for variable options arguments - $v_size = func_num_args(); - - // ----- Look for arguments - if ($v_size > 1) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Remove from the options list the first argument - array_shift($v_arg_list); - $v_size--; - - // ----- Look for first arg - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_REMOVE_PATH => 'optional', - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', - PCLZIP_OPT_ADD_PATH => 'optional', - PCLZIP_CB_PRE_ADD => 'optional', - PCLZIP_CB_POST_ADD => 'optional', - PCLZIP_OPT_NO_COMPRESSION => 'optional', - PCLZIP_OPT_COMMENT => 'optional', - PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', - PCLZIP_OPT_TEMP_FILE_ON => 'optional', - PCLZIP_OPT_TEMP_FILE_OFF => 'optional' - //, PCLZIP_OPT_CRYPT => 'optional' - )); - if ($v_result != 1) { - return 0; - } - } - - // ----- Look for 2 args - // Here we need to support the first historic synopsis of the - // method. - else { - - // ----- Get the first argument - $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0]; - - // ----- Look for the optional second argument - if ($v_size == 2) { - $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; - } - else if ($v_size > 2) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, - "Invalid number / type of arguments"); - return 0; - } - } - } - - // ----- Look for default option values - $this->privOptionDefaultThreshold($v_options); - - // ----- Init - $v_string_list = array(); - $v_att_list = array(); - $v_filedescr_list = array(); - $p_result_list = array(); - - // ----- Look if the $p_filelist is really an array - if (is_array($p_filelist)) { - - // ----- Look if the first element is also an array - // This will mean that this is a file description entry - if (isset($p_filelist[0]) && is_array($p_filelist[0])) { - $v_att_list = $p_filelist; - } - - // ----- The list is a list of string names - else { - $v_string_list = $p_filelist; - } - } - - // ----- Look if the $p_filelist is a string - else if (is_string($p_filelist)) { - // ----- Create a list from the string - $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); - } - - // ----- Invalid variable type for $p_filelist - else { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist"); - return 0; - } - - // ----- Reformat the string list - if (sizeof($v_string_list) != 0) { - foreach ($v_string_list as $v_string) { - if ($v_string != '') { - $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; - } - else { - } - } - } - - // ----- For each file in the list check the attributes - $v_supported_attributes - = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' - ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' - ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' - ,PCLZIP_ATT_FILE_MTIME => 'optional' - ,PCLZIP_ATT_FILE_CONTENT => 'optional' - ,PCLZIP_ATT_FILE_COMMENT => 'optional' - ); - foreach ($v_att_list as $v_entry) { - $v_result = $this->privFileDescrParseAtt($v_entry, - $v_filedescr_list[], - $v_options, - $v_supported_attributes); - if ($v_result != 1) { - return 0; - } - } - - // ----- Expand the filelist (expand directories) - $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); - if ($v_result != 1) { - return 0; - } - - // ----- Call the create fct - $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options); - if ($v_result != 1) { - return 0; - } - - // ----- Return - return $p_result_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : - // add($p_filelist, $p_add_dir="", $p_remove_dir="") - // add($p_filelist, $p_option, $p_option_value, ...) - // Description : - // This method supports two synopsis. The first one is historical. - // This methods add the list of files in an existing archive. - // If a file with the same name already exists, it is added at the end of the - // archive, the first one is still present. - // If the archive does not exist, it is created. - // Parameters : - // $p_filelist : An array containing file or directory names, or - // a string containing one filename or one directory name, or - // a string containing a list of filenames and/or directory - // names separated by spaces. - // $p_add_dir : A path to add before the real path of the archived file, - // in order to have it memorized in the archive. - // $p_remove_dir : A path to remove from the real path of the file to archive, - // in order to have a shorter path memorized in the archive. - // When $p_add_dir and $p_remove_dir are set, $p_remove_dir - // is removed first, before $p_add_dir is added. - // Options : - // PCLZIP_OPT_ADD_PATH : - // PCLZIP_OPT_REMOVE_PATH : - // PCLZIP_OPT_REMOVE_ALL_PATH : - // PCLZIP_OPT_COMMENT : - // PCLZIP_OPT_ADD_COMMENT : - // PCLZIP_OPT_PREPEND_COMMENT : - // PCLZIP_CB_PRE_ADD : - // PCLZIP_CB_POST_ADD : - // Return Values : - // 0 on failure, - // The list of the added files, with a status of the add action. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - function add($p_filelist) - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Set default values - $v_options = array(); - $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; - - // ----- Look for variable options arguments - $v_size = func_num_args(); - - // ----- Look for arguments - if ($v_size > 1) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Remove form the options list the first argument - array_shift($v_arg_list); - $v_size--; - - // ----- Look for first arg - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_REMOVE_PATH => 'optional', - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', - PCLZIP_OPT_ADD_PATH => 'optional', - PCLZIP_CB_PRE_ADD => 'optional', - PCLZIP_CB_POST_ADD => 'optional', - PCLZIP_OPT_NO_COMPRESSION => 'optional', - PCLZIP_OPT_COMMENT => 'optional', - PCLZIP_OPT_ADD_COMMENT => 'optional', - PCLZIP_OPT_PREPEND_COMMENT => 'optional', - PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', - PCLZIP_OPT_TEMP_FILE_ON => 'optional', - PCLZIP_OPT_TEMP_FILE_OFF => 'optional' - //, PCLZIP_OPT_CRYPT => 'optional' - )); - if ($v_result != 1) { - return 0; - } - } - - // ----- Look for 2 args - // Here we need to support the first historic synopsis of the - // method. - else { - - // ----- Get the first argument - $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0]; - - // ----- Look for the optional second argument - if ($v_size == 2) { - $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; - } - else if ($v_size > 2) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); - - // ----- Return - return 0; - } - } - } - - // ----- Look for default option values - $this->privOptionDefaultThreshold($v_options); - - // ----- Init - $v_string_list = array(); - $v_att_list = array(); - $v_filedescr_list = array(); - $p_result_list = array(); - - // ----- Look if the $p_filelist is really an array - if (is_array($p_filelist)) { - - // ----- Look if the first element is also an array - // This will mean that this is a file description entry - if (isset($p_filelist[0]) && is_array($p_filelist[0])) { - $v_att_list = $p_filelist; - } - - // ----- The list is a list of string names - else { - $v_string_list = $p_filelist; - } - } - - // ----- Look if the $p_filelist is a string - else if (is_string($p_filelist)) { - // ----- Create a list from the string - $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); - } - - // ----- Invalid variable type for $p_filelist - else { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist"); - return 0; - } - - // ----- Reformat the string list - if (sizeof($v_string_list) != 0) { - foreach ($v_string_list as $v_string) { - $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; - } - } - - // ----- For each file in the list check the attributes - $v_supported_attributes - = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' - ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' - ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' - ,PCLZIP_ATT_FILE_MTIME => 'optional' - ,PCLZIP_ATT_FILE_CONTENT => 'optional' - ,PCLZIP_ATT_FILE_COMMENT => 'optional' - ); - foreach ($v_att_list as $v_entry) { - $v_result = $this->privFileDescrParseAtt($v_entry, - $v_filedescr_list[], - $v_options, - $v_supported_attributes); - if ($v_result != 1) { - return 0; - } - } - - // ----- Expand the filelist (expand directories) - $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); - if ($v_result != 1) { - return 0; - } - - // ----- Call the create fct - $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options); - if ($v_result != 1) { - return 0; - } - - // ----- Return - return $p_result_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : listContent() - // Description : - // This public method, gives the list of the files and directories, with their - // properties. - // The properties of each entries in the list are (used also in other functions) : - // filename : Name of the file. For a create or add action it is the filename - // given by the user. For an extract function it is the filename - // of the extracted file. - // stored_filename : Name of the file / directory stored in the archive. - // size : Size of the stored file. - // compressed_size : Size of the file's data compressed in the archive - // (without the headers overhead) - // mtime : Last known modification date of the file (UNIX timestamp) - // comment : Comment associated with the file - // folder : true | false - // index : index of the file in the archive - // status : status of the action (depending of the action) : - // Values are : - // ok : OK ! - // filtered : the file / dir is not extracted (filtered by user) - // already_a_directory : the file can not be extracted because a - // directory with the same name already exists - // write_protected : the file can not be extracted because a file - // with the same name already exists and is - // write protected - // newer_exist : the file was not extracted because a newer file exists - // path_creation_fail : the file is not extracted because the folder - // does not exist and can not be created - // write_error : the file was not extracted because there was a - // error while writing the file - // read_error : the file was not extracted because there was a error - // while reading the file - // invalid_header : the file was not extracted because of an archive - // format error (bad file header) - // Note that each time a method can continue operating when there - // is an action error on a file, the error is only logged in the file status. - // Return Values : - // 0 on an unrecoverable failure, - // The list of the files in the archive. - // -------------------------------------------------------------------------------- - function listContent() - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - return(0); - } - - // ----- Call the extracting fct - $p_list = array(); - if (($v_result = $this->privList($p_list)) != 1) - { - unset($p_list); - return(0); - } - - // ----- Return - return $p_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : - // extract($p_path="./", $p_remove_path="") - // extract([$p_option, $p_option_value, ...]) - // Description : - // This method supports two synopsis. The first one is historical. - // This method extract all the files / directories from the archive to the - // folder indicated in $p_path. - // If you want to ignore the 'root' part of path of the memorized files - // you can indicate this in the optional $p_remove_path parameter. - // By default, if a newer file with the same name already exists, the - // file is not extracted. - // - // If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions - // are used, the path indicated in PCLZIP_OPT_ADD_PATH is append - // at the end of the path value of PCLZIP_OPT_PATH. - // Parameters : - // $p_path : Path where the files and directories are to be extracted - // $p_remove_path : First part ('root' part) of the memorized path - // (if any similar) to remove while extracting. - // Options : - // PCLZIP_OPT_PATH : - // PCLZIP_OPT_ADD_PATH : - // PCLZIP_OPT_REMOVE_PATH : - // PCLZIP_OPT_REMOVE_ALL_PATH : - // PCLZIP_CB_PRE_EXTRACT : - // PCLZIP_CB_POST_EXTRACT : - // Return Values : - // 0 or a negative value on failure, - // The list of the extracted files, with a status of the action. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - function extract() - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - return(0); - } - - // ----- Set default values - $v_options = array(); -// $v_path = "./"; - $v_path = ''; - $v_remove_path = ""; - $v_remove_all_path = false; - - // ----- Look for variable options arguments - $v_size = func_num_args(); - - // ----- Default values for option - $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; - - // ----- Look for arguments - if ($v_size > 0) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Look for first arg - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_PATH => 'optional', - PCLZIP_OPT_REMOVE_PATH => 'optional', - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', - PCLZIP_OPT_ADD_PATH => 'optional', - PCLZIP_CB_PRE_EXTRACT => 'optional', - PCLZIP_CB_POST_EXTRACT => 'optional', - PCLZIP_OPT_SET_CHMOD => 'optional', - PCLZIP_OPT_BY_NAME => 'optional', - PCLZIP_OPT_BY_EREG => 'optional', - PCLZIP_OPT_BY_PREG => 'optional', - PCLZIP_OPT_BY_INDEX => 'optional', - PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', - PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional', - PCLZIP_OPT_REPLACE_NEWER => 'optional' - ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' - ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', - PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', - PCLZIP_OPT_TEMP_FILE_ON => 'optional', - PCLZIP_OPT_TEMP_FILE_OFF => 'optional' - )); - if ($v_result != 1) { - return 0; - } - - // ----- Set the arguments - if (isset($v_options[PCLZIP_OPT_PATH])) { - $v_path = $v_options[PCLZIP_OPT_PATH]; - } - if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { - $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; - } - if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { - $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; - } - if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { - // ----- Check for '/' in last path char - if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { - $v_path .= '/'; - } - $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; - } - } - - // ----- Look for 2 args - // Here we need to support the first historic synopsis of the - // method. - else { - - // ----- Get the first argument - $v_path = $v_arg_list[0]; - - // ----- Look for the optional second argument - if ($v_size == 2) { - $v_remove_path = $v_arg_list[1]; - } - else if ($v_size > 2) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); - - // ----- Return - return 0; - } - } - } - - // ----- Look for default option values - $this->privOptionDefaultThreshold($v_options); - - // ----- Trace - - // ----- Call the extracting fct - $p_list = array(); - $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, - $v_remove_all_path, $v_options); - if ($v_result < 1) { - unset($p_list); - return(0); - } - - // ----- Return - return $p_list; - } - // -------------------------------------------------------------------------------- - - - // -------------------------------------------------------------------------------- - // Function : - // extractByIndex($p_index, $p_path="./", $p_remove_path="") - // extractByIndex($p_index, [$p_option, $p_option_value, ...]) - // Description : - // This method supports two synopsis. The first one is historical. - // This method is doing a partial extract of the archive. - // The extracted files or folders are identified by their index in the - // archive (from 0 to n). - // Note that if the index identify a folder, only the folder entry is - // extracted, not all the files included in the archive. - // Parameters : - // $p_index : A single index (integer) or a string of indexes of files to - // extract. The form of the string is "0,4-6,8-12" with only numbers - // and '-' for range or ',' to separate ranges. No spaces or ';' - // are allowed. - // $p_path : Path where the files and directories are to be extracted - // $p_remove_path : First part ('root' part) of the memorized path - // (if any similar) to remove while extracting. - // Options : - // PCLZIP_OPT_PATH : - // PCLZIP_OPT_ADD_PATH : - // PCLZIP_OPT_REMOVE_PATH : - // PCLZIP_OPT_REMOVE_ALL_PATH : - // PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and - // not as files. - // The resulting content is in a new field 'content' in the file - // structure. - // This option must be used alone (any other options are ignored). - // PCLZIP_CB_PRE_EXTRACT : - // PCLZIP_CB_POST_EXTRACT : - // Return Values : - // 0 on failure, - // The list of the extracted files, with a status of the action. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - //function extractByIndex($p_index, options...) - function extractByIndex($p_index) - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - return(0); - } - - // ----- Set default values - $v_options = array(); -// $v_path = "./"; - $v_path = ''; - $v_remove_path = ""; - $v_remove_all_path = false; - - // ----- Look for variable options arguments - $v_size = func_num_args(); - - // ----- Default values for option - $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; - - // ----- Look for arguments - if ($v_size > 1) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Remove form the options list the first argument - array_shift($v_arg_list); - $v_size--; - - // ----- Look for first arg - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_PATH => 'optional', - PCLZIP_OPT_REMOVE_PATH => 'optional', - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', - PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', - PCLZIP_OPT_ADD_PATH => 'optional', - PCLZIP_CB_PRE_EXTRACT => 'optional', - PCLZIP_CB_POST_EXTRACT => 'optional', - PCLZIP_OPT_SET_CHMOD => 'optional', - PCLZIP_OPT_REPLACE_NEWER => 'optional' - ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' - ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', - PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', - PCLZIP_OPT_TEMP_FILE_ON => 'optional', - PCLZIP_OPT_TEMP_FILE_OFF => 'optional' - )); - if ($v_result != 1) { - return 0; - } - - // ----- Set the arguments - if (isset($v_options[PCLZIP_OPT_PATH])) { - $v_path = $v_options[PCLZIP_OPT_PATH]; - } - if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { - $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; - } - if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { - $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; - } - if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { - // ----- Check for '/' in last path char - if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { - $v_path .= '/'; - } - $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; - } - if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) { - $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; - } - else { - } - } - - // ----- Look for 2 args - // Here we need to support the first historic synopsis of the - // method. - else { - - // ----- Get the first argument - $v_path = $v_arg_list[0]; - - // ----- Look for the optional second argument - if ($v_size == 2) { - $v_remove_path = $v_arg_list[1]; - } - else if ($v_size > 2) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); - - // ----- Return - return 0; - } - } - } - - // ----- Trace - - // ----- Trick - // Here I want to reuse extractByRule(), so I need to parse the $p_index - // with privParseOptions() - $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index); - $v_options_trick = array(); - $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick, - array (PCLZIP_OPT_BY_INDEX => 'optional' )); - if ($v_result != 1) { - return 0; - } - $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX]; - - // ----- Look for default option values - $this->privOptionDefaultThreshold($v_options); - - // ----- Call the extracting fct - if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) { - return(0); - } - - // ----- Return - return $p_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : - // delete([$p_option, $p_option_value, ...]) - // Description : - // This method removes files from the archive. - // If no parameters are given, then all the archive is emptied. - // Parameters : - // None or optional arguments. - // Options : - // PCLZIP_OPT_BY_INDEX : - // PCLZIP_OPT_BY_NAME : - // PCLZIP_OPT_BY_EREG : - // PCLZIP_OPT_BY_PREG : - // Return Values : - // 0 on failure, - // The list of the files which are still present in the archive. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - function delete() - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - return(0); - } - - // ----- Set default values - $v_options = array(); - - // ----- Look for variable options arguments - $v_size = func_num_args(); - - // ----- Look for arguments - if ($v_size > 0) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_BY_NAME => 'optional', - PCLZIP_OPT_BY_EREG => 'optional', - PCLZIP_OPT_BY_PREG => 'optional', - PCLZIP_OPT_BY_INDEX => 'optional' )); - if ($v_result != 1) { - return 0; - } - } - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Call the delete fct - $v_list = array(); - if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) { - $this->privSwapBackMagicQuotes(); - unset($v_list); - return(0); - } - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : deleteByIndex() - // Description : - // ***** Deprecated ***** - // delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered. - // -------------------------------------------------------------------------------- - function deleteByIndex($p_index) - { - - $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index); - - // ----- Return - return $p_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : properties() - // Description : - // This method gives the properties of the archive. - // The properties are : - // nb : Number of files in the archive - // comment : Comment associated with the archive file - // status : not_exist, ok - // Parameters : - // None - // Return Values : - // 0 on failure, - // An array with the archive properties. - // -------------------------------------------------------------------------------- - function properties() - { - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - $this->privSwapBackMagicQuotes(); - return(0); - } - - // ----- Default properties - $v_prop = array(); - $v_prop['comment'] = ''; - $v_prop['nb'] = 0; - $v_prop['status'] = 'not_exist'; - - // ----- Look if file exists - if (@is_file($this->zipname)) - { - // ----- Open the zip file - if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) - { - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); - - // ----- Return - return 0; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privSwapBackMagicQuotes(); - return 0; - } - - // ----- Close the zip file - $this->privCloseFd(); - - // ----- Set the user attributes - $v_prop['comment'] = $v_central_dir['comment']; - $v_prop['nb'] = $v_central_dir['entries']; - $v_prop['status'] = 'ok'; - } - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_prop; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : duplicate() - // Description : - // This method creates an archive by copying the content of an other one. If - // the archive already exist, it is replaced by the new one without any warning. - // Parameters : - // $p_archive : The filename of a valid archive, or - // a valid PclZip object. - // Return Values : - // 1 on success. - // 0 or a negative value on error (error code). - // -------------------------------------------------------------------------------- - function duplicate($p_archive) - { - $v_result = 1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Look if the $p_archive is a PclZip object - if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')) - { - - // ----- Duplicate the archive - $v_result = $this->privDuplicate($p_archive->zipname); - } - - // ----- Look if the $p_archive is a string (so a filename) - else if (is_string($p_archive)) - { - - // ----- Check that $p_archive is a valid zip file - // TBC : Should also check the archive format - if (!is_file($p_archive)) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'"); - $v_result = PCLZIP_ERR_MISSING_FILE; - } - else { - // ----- Duplicate the archive - $v_result = $this->privDuplicate($p_archive); - } - } - - // ----- Invalid variable - else - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); - $v_result = PCLZIP_ERR_INVALID_PARAMETER; - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : merge() - // Description : - // This method merge the $p_archive_to_add archive at the end of the current - // one ($this). - // If the archive ($this) does not exist, the merge becomes a duplicate. - // If the $p_archive_to_add archive does not exist, the merge is a success. - // Parameters : - // $p_archive_to_add : It can be directly the filename of a valid zip archive, - // or a PclZip object archive. - // Return Values : - // 1 on success, - // 0 or negative values on error (see below). - // -------------------------------------------------------------------------------- - function merge($p_archive_to_add) - { - $v_result = 1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - return(0); - } - - // ----- Look if the $p_archive_to_add is a PclZip object - if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')) - { - - // ----- Merge the archive - $v_result = $this->privMerge($p_archive_to_add); - } - - // ----- Look if the $p_archive_to_add is a string (so a filename) - else if (is_string($p_archive_to_add)) - { - - // ----- Create a temporary archive - $v_object_archive = new PclZip($p_archive_to_add); - - // ----- Merge the archive - $v_result = $this->privMerge($v_object_archive); - } - - // ----- Invalid variable - else - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); - $v_result = PCLZIP_ERR_INVALID_PARAMETER; - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - - - // -------------------------------------------------------------------------------- - // Function : errorCode() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function errorCode() - { - if (PCLZIP_ERROR_EXTERNAL == 1) { - return(PclErrorCode()); - } - else { - return($this->error_code); - } - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : errorName() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function errorName($p_with_code=false) - { - $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR', - PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL', - PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL', - PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER', - PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE', - PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG', - PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP', - PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE', - PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL', - PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION', - PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT', - PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL', - PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL', - PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM', - PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', - PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE', - PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE', - PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', - PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION' - ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE' - ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION' - ); - - if (isset($v_name[$this->error_code])) { - $v_value = $v_name[$this->error_code]; - } - else { - $v_value = 'NoName'; - } - - if ($p_with_code) { - return($v_value.' ('.$this->error_code.')'); - } - else { - return($v_value); - } - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : errorInfo() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function errorInfo($p_full=false) - { - if (PCLZIP_ERROR_EXTERNAL == 1) { - return(PclErrorString()); - } - else { - if ($p_full) { - return($this->errorName(true)." : ".$this->error_string); - } - else { - return($this->error_string." [code ".$this->error_code."]"); - } - } - } - // -------------------------------------------------------------------------------- - - -// -------------------------------------------------------------------------------- -// ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS ***** -// ***** ***** -// ***** THESES FUNCTIONS MUST NOT BE USED DIRECTLY ***** -// -------------------------------------------------------------------------------- - - - - // -------------------------------------------------------------------------------- - // Function : privCheckFormat() - // Description : - // This method check that the archive exists and is a valid zip archive. - // Several level of check exists. (futur) - // Parameters : - // $p_level : Level of check. Default 0. - // 0 : Check the first bytes (magic codes) (default value)) - // 1 : 0 + Check the central directory (futur) - // 2 : 1 + Check each file header (futur) - // Return Values : - // true on success, - // false on error, the error code is set. - // -------------------------------------------------------------------------------- - function privCheckFormat($p_level=0) - { - $v_result = true; - - // ----- Reset the file system cache - clearstatcache(); - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Look if the file exits - if (!is_file($this->zipname)) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'"); - return(false); - } - - // ----- Check that the file is readeable - if (!is_readable($this->zipname)) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'"); - return(false); - } - - // ----- Check the magic code - // TBC - - // ----- Check the central header - // TBC - - // ----- Check each file header - // TBC - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privParseOptions() - // Description : - // This internal methods reads the variable list of arguments ($p_options_list, - // $p_size) and generate an array with the options and values ($v_result_list). - // $v_requested_options contains the options that can be present and those that - // must be present. - // $v_requested_options is an array, with the option value as key, and 'optional', - // or 'mandatory' as value. - // Parameters : - // See above. - // Return Values : - // 1 on success. - // 0 on failure. - // -------------------------------------------------------------------------------- - function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false) - { - $v_result=1; - - // ----- Read the options - $i=0; - while ($i<$p_size) { - - // ----- Check if the option is supported - if (!isset($v_requested_options[$p_options_list[$i]])) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Look for next option - switch ($p_options_list[$i]) { - // ----- Look for options that request a path value - case PCLZIP_OPT_PATH : - case PCLZIP_OPT_REMOVE_PATH : - case PCLZIP_OPT_ADD_PATH : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); - $i++; - break; - - case PCLZIP_OPT_TEMP_FILE_THRESHOLD : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - return PclZip::errorCode(); - } - - // ----- Check for incompatible options - if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); - return PclZip::errorCode(); - } - - // ----- Check the value - $v_value = $p_options_list[$i+1]; - if ((!is_integer($v_value)) || ($v_value<0)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - return PclZip::errorCode(); - } - - // ----- Get the value (and convert it in bytes) - $v_result_list[$p_options_list[$i]] = $v_value*1048576; - $i++; - break; - - case PCLZIP_OPT_TEMP_FILE_ON : - // ----- Check for incompatible options - if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); - return PclZip::errorCode(); - } - - $v_result_list[$p_options_list[$i]] = true; - break; - - case PCLZIP_OPT_TEMP_FILE_OFF : - // ----- Check for incompatible options - if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'"); - return PclZip::errorCode(); - } - // ----- Check for incompatible options - if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'"); - return PclZip::errorCode(); - } - - $v_result_list[$p_options_list[$i]] = true; - break; - - case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - if ( is_string($p_options_list[$i+1]) - && ($p_options_list[$i+1] != '')) { - $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); - $i++; - } - else { - } - break; - - // ----- Look for options that request an array of string for value - case PCLZIP_OPT_BY_NAME : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - if (is_string($p_options_list[$i+1])) { - $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1]; - } - else if (is_array($p_options_list[$i+1])) { - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; - } - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - $i++; - break; - - // ----- Look for options that request an EREG or PREG expression - case PCLZIP_OPT_BY_EREG : - // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG - // to PCLZIP_OPT_BY_PREG - $p_options_list[$i] = PCLZIP_OPT_BY_PREG; - case PCLZIP_OPT_BY_PREG : - //case PCLZIP_OPT_CRYPT : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - if (is_string($p_options_list[$i+1])) { - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; - } - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - $i++; - break; - - // ----- Look for options that takes a string - case PCLZIP_OPT_COMMENT : - case PCLZIP_OPT_ADD_COMMENT : - case PCLZIP_OPT_PREPEND_COMMENT : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, - "Missing parameter value for option '" - .PclZipUtilOptionText($p_options_list[$i]) - ."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - if (is_string($p_options_list[$i+1])) { - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; - } - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, - "Wrong parameter value for option '" - .PclZipUtilOptionText($p_options_list[$i]) - ."'"); - - // ----- Return - return PclZip::errorCode(); - } - $i++; - break; - - // ----- Look for options that request an array of index - case PCLZIP_OPT_BY_INDEX : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - $v_work_list = array(); - if (is_string($p_options_list[$i+1])) { - - // ----- Remove spaces - $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', ''); - - // ----- Parse items - $v_work_list = explode(",", $p_options_list[$i+1]); - } - else if (is_integer($p_options_list[$i+1])) { - $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1]; - } - else if (is_array($p_options_list[$i+1])) { - $v_work_list = $p_options_list[$i+1]; - } - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Reduce the index list - // each index item in the list must be a couple with a start and - // an end value : [0,3], [5-5], [8-10], ... - // ----- Check the format of each item - $v_sort_flag=false; - $v_sort_value=0; - for ($j=0; $j= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; - $i++; - break; - - // ----- Look for options that request a call-back - case PCLZIP_CB_PRE_EXTRACT : - case PCLZIP_CB_POST_EXTRACT : - case PCLZIP_CB_PRE_ADD : - case PCLZIP_CB_POST_ADD : - /* for futur use - case PCLZIP_CB_PRE_DELETE : - case PCLZIP_CB_POST_DELETE : - case PCLZIP_CB_PRE_LIST : - case PCLZIP_CB_POST_LIST : - */ - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - $v_function_name = $p_options_list[$i+1]; - - // ----- Check that the value is a valid existing function - if (!function_exists($v_function_name)) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Set the attribute - $v_result_list[$p_options_list[$i]] = $v_function_name; - $i++; - break; - - default : - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, - "Unknown parameter '" - .$p_options_list[$i]."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Next options - $i++; - } - - // ----- Look for mandatory options - if ($v_requested_options !== false) { - for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { - // ----- Look for mandatory option - if ($v_requested_options[$key] == 'mandatory') { - // ----- Look if present - if (!isset($v_result_list[$key])) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); - - // ----- Return - return PclZip::errorCode(); - } - } - } - } - - // ----- Look for default values - if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { - - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privOptionDefaultThreshold() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privOptionDefaultThreshold(&$p_options) - { - $v_result=1; - - if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) - || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) { - return $v_result; - } - - // ----- Get 'memory_limit' configuration value - $v_memory_limit = ini_get('memory_limit'); - $v_memory_limit = trim($v_memory_limit); - $last = strtolower(substr($v_memory_limit, -1)); - - if($last == 'g') - //$v_memory_limit = $v_memory_limit*1024*1024*1024; - $v_memory_limit = $v_memory_limit*1073741824; - if($last == 'm') - //$v_memory_limit = $v_memory_limit*1024*1024; - $v_memory_limit = $v_memory_limit*1048576; - if($last == 'k') - $v_memory_limit = $v_memory_limit*1024; - - $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO); - - - // ----- Sanity check : No threshold if value lower than 1M - if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) { - unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privFileDescrParseAtt() - // Description : - // Parameters : - // Return Values : - // 1 on success. - // 0 on failure. - // -------------------------------------------------------------------------------- - function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false) - { - $v_result=1; - - // ----- For each file in the list check the attributes - foreach ($p_file_list as $v_key => $v_value) { - - // ----- Check if the option is supported - if (!isset($v_requested_options[$v_key])) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Look for attribute - switch ($v_key) { - case PCLZIP_ATT_FILE_NAME : - if (!is_string($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - $p_filedescr['filename'] = PclZipUtilPathReduction($v_value); - - if ($p_filedescr['filename'] == '') { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - break; - - case PCLZIP_ATT_FILE_NEW_SHORT_NAME : - if (!is_string($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value); - - if ($p_filedescr['new_short_name'] == '') { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - break; - - case PCLZIP_ATT_FILE_NEW_FULL_NAME : - if (!is_string($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value); - - if ($p_filedescr['new_full_name'] == '') { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - break; - - // ----- Look for options that takes a string - case PCLZIP_ATT_FILE_COMMENT : - if (!is_string($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - $p_filedescr['comment'] = $v_value; - break; - - case PCLZIP_ATT_FILE_MTIME : - if (!is_integer($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - $p_filedescr['mtime'] = $v_value; - break; - - case PCLZIP_ATT_FILE_CONTENT : - $p_filedescr['content'] = $v_value; - break; - - default : - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, - "Unknown parameter '".$v_key."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Look for mandatory options - if ($v_requested_options !== false) { - for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { - // ----- Look for mandatory option - if ($v_requested_options[$key] == 'mandatory') { - // ----- Look if present - if (!isset($p_file_list[$key])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); - return PclZip::errorCode(); - } - } - } - } - - // end foreach - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privFileDescrExpand() - // Description : - // This method look for each item of the list to see if its a file, a folder - // or a string to be added as file. For any other type of files (link, other) - // just ignore the item. - // Then prepare the information that will be stored for that file. - // When its a folder, expand the folder with all the files that are in that - // folder (recursively). - // Parameters : - // Return Values : - // 1 on success. - // 0 on failure. - // -------------------------------------------------------------------------------- - function privFileDescrExpand(&$p_filedescr_list, &$p_options) - { - $v_result=1; - - // ----- Create a result list - $v_result_list = array(); - - // ----- Look each entry - for ($i=0; $iprivCalculateStoredFilename($v_descr, $p_options); - - // ----- Add the descriptor in result list - $v_result_list[sizeof($v_result_list)] = $v_descr; - - // ----- Look for folder - if ($v_descr['type'] == 'folder') { - // ----- List of items in folder - $v_dirlist_descr = array(); - $v_dirlist_nb = 0; - if ($v_folder_handler = @opendir($v_descr['filename'])) { - while (($v_item_handler = @readdir($v_folder_handler)) !== false) { - - // ----- Skip '.' and '..' - if (($v_item_handler == '.') || ($v_item_handler == '..')) { - continue; - } - - // ----- Compose the full filename - $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler; - - // ----- Look for different stored filename - // Because the name of the folder was changed, the name of the - // files/sub-folders also change - if (($v_descr['stored_filename'] != $v_descr['filename']) - && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) { - if ($v_descr['stored_filename'] != '') { - $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler; - } - else { - $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler; - } - } - - $v_dirlist_nb++; - } - - @closedir($v_folder_handler); - } - else { - // TBC : unable to open folder in read mode - } - - // ----- Expand each element of the list - if ($v_dirlist_nb != 0) { - // ----- Expand - if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) { - return $v_result; - } - - // ----- Concat the resulting list - $v_result_list = array_merge($v_result_list, $v_dirlist_descr); - } - else { - } - - // ----- Free local array - unset($v_dirlist_descr); - } - } - - // ----- Get the result list - $p_filedescr_list = $v_result_list; - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privCreate() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privCreate($p_filedescr_list, &$p_result_list, &$p_options) - { - $v_result=1; - $v_list_detail = array(); - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Open the file in write mode - if (($v_result = $this->privOpenFd('wb')) != 1) - { - // ----- Return - return $v_result; - } - - // ----- Add the list of files - $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options); - - // ----- Close - $this->privCloseFd(); - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAdd() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privAdd($p_filedescr_list, &$p_result_list, &$p_options) - { - $v_result=1; - $v_list_detail = array(); - - // ----- Look if the archive exists or is empty - if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)) - { - - // ----- Do a create - $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options); - - // ----- Return - return $v_result; - } - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Open the zip file - if (($v_result=$this->privOpenFd('rb')) != 1) - { - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result; - } - - // ----- Go to beginning of File - @rewind($this->zip_fd); - - // ----- Creates a temporay file - $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; - - // ----- Open the temporary file in write mode - if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) - { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Copy the files from the archive to the temporary file - // TBC : Here I should better append the file and go back to erase the central dir - $v_size = $v_central_dir['offset']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = fread($this->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Swap the file descriptor - // Here is a trick : I swap the temporary fd with the zip fd, in order to use - // the following methods on the temporary fil and not the real archive - $v_swap = $this->zip_fd; - $this->zip_fd = $v_zip_temp_fd; - $v_zip_temp_fd = $v_swap; - - // ----- Add the files - $v_header_list = array(); - if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) - { - fclose($v_zip_temp_fd); - $this->privCloseFd(); - @unlink($v_zip_temp_name); - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - - // ----- Store the offset of the central dir - $v_offset = @ftell($this->zip_fd); - - // ----- Copy the block of file headers from the old archive - $v_size = $v_central_dir['size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($v_zip_temp_fd, $v_read_size); - @fwrite($this->zip_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Create the Central Dir files header - for ($i=0, $v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { - fclose($v_zip_temp_fd); - $this->privCloseFd(); - @unlink($v_zip_temp_name); - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - $v_count++; - } - - // ----- Transform the header to a 'usable' info - $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); - } - - // ----- Zip file comment - $v_comment = $v_central_dir['comment']; - if (isset($p_options[PCLZIP_OPT_COMMENT])) { - $v_comment = $p_options[PCLZIP_OPT_COMMENT]; - } - if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) { - $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT]; - } - if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) { - $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment; - } - - // ----- Calculate the size of the central header - $v_size = @ftell($this->zip_fd)-$v_offset; - - // ----- Create the central dir footer - if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1) - { - // ----- Reset the file list - unset($v_header_list); - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - - // ----- Swap back the file descriptor - $v_swap = $this->zip_fd; - $this->zip_fd = $v_zip_temp_fd; - $v_zip_temp_fd = $v_swap; - - // ----- Close - $this->privCloseFd(); - - // ----- Close the temporary file - @fclose($v_zip_temp_fd); - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Delete the zip file - // TBC : I should test the result ... - @unlink($this->zipname); - - // ----- Rename the temporary file - // TBC : I should test the result ... - //@rename($v_zip_temp_name, $this->zipname); - PclZipUtilRename($v_zip_temp_name, $this->zipname); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privOpenFd() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function privOpenFd($p_mode) - { - $v_result=1; - - // ----- Look if already open - if ($this->zip_fd != 0) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Open the zip file - if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privCloseFd() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function privCloseFd() - { - $v_result=1; - - if ($this->zip_fd != 0) - @fclose($this->zip_fd); - $this->zip_fd = 0; - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAddList() - // Description : - // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is - // different from the real path of the file. This is usefull if you want to have PclTar - // running in any directory, and memorize relative path from an other directory. - // Parameters : - // $p_list : An array containing the file or directory names to add in the tar - // $p_result_list : list of added files with their properties (specially the status field) - // $p_add_dir : Path to add in the filename path archived - // $p_remove_dir : Path to remove in the filename path archived - // Return Values : - // -------------------------------------------------------------------------------- -// function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) - function privAddList($p_filedescr_list, &$p_result_list, &$p_options) - { - $v_result=1; - - // ----- Add the files - $v_header_list = array(); - if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) - { - // ----- Return - return $v_result; - } - - // ----- Store the offset of the central dir - $v_offset = @ftell($this->zip_fd); - - // ----- Create the Central Dir files header - for ($i=0,$v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { - // ----- Return - return $v_result; - } - $v_count++; - } - - // ----- Transform the header to a 'usable' info - $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); - } - - // ----- Zip file comment - $v_comment = ''; - if (isset($p_options[PCLZIP_OPT_COMMENT])) { - $v_comment = $p_options[PCLZIP_OPT_COMMENT]; - } - - // ----- Calculate the size of the central header - $v_size = @ftell($this->zip_fd)-$v_offset; - - // ----- Create the central dir footer - if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1) - { - // ----- Reset the file list - unset($v_header_list); - - // ----- Return - return $v_result; - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAddFileList() - // Description : - // Parameters : - // $p_filedescr_list : An array containing the file description - // or directory names to add in the zip - // $p_result_list : list of added files with their properties (specially the status field) - // Return Values : - // -------------------------------------------------------------------------------- - function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options) - { - $v_result=1; - $v_header = array(); - - // ----- Recuperate the current number of elt in list - $v_nb = sizeof($p_result_list); - - // ----- Loop on the files - for ($j=0; ($jprivAddFile($p_filedescr_list[$j], $v_header, - $p_options); - if ($v_result != 1) { - return $v_result; - } - - // ----- Store the file infos - $p_result_list[$v_nb++] = $v_header; - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAddFile() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privAddFile($p_filedescr, &$p_header, &$p_options) - { - $v_result=1; - - // ----- Working variable - $p_filename = $p_filedescr['filename']; - - // TBC : Already done in the fileAtt check ... ? - if ($p_filename == "") { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Look for a stored different filename - /* TBC : Removed - if (isset($p_filedescr['stored_filename'])) { - $v_stored_filename = $p_filedescr['stored_filename']; - } - else { - $v_stored_filename = $p_filedescr['stored_filename']; - } - */ - - // ----- Set the file properties - clearstatcache(); - $p_header['version'] = 20; - $p_header['version_extracted'] = 10; - $p_header['flag'] = 0; - $p_header['compression'] = 0; - $p_header['crc'] = 0; - $p_header['compressed_size'] = 0; - $p_header['filename_len'] = strlen($p_filename); - $p_header['extra_len'] = 0; - $p_header['disk'] = 0; - $p_header['internal'] = 0; - $p_header['offset'] = 0; - $p_header['filename'] = $p_filename; -// TBC : Removed $p_header['stored_filename'] = $v_stored_filename; - $p_header['stored_filename'] = $p_filedescr['stored_filename']; - $p_header['extra'] = ''; - $p_header['status'] = 'ok'; - $p_header['index'] = -1; - - // ----- Look for regular file - if ($p_filedescr['type']=='file') { - $p_header['external'] = 0x00000000; - $p_header['size'] = filesize($p_filename); - } - - // ----- Look for regular folder - else if ($p_filedescr['type']=='folder') { - $p_header['external'] = 0x00000010; - $p_header['mtime'] = filemtime($p_filename); - $p_header['size'] = filesize($p_filename); - } - - // ----- Look for virtual file - else if ($p_filedescr['type'] == 'virtual_file') { - $p_header['external'] = 0x00000000; - $p_header['size'] = strlen($p_filedescr['content']); - } - - - // ----- Look for filetime - if (isset($p_filedescr['mtime'])) { - $p_header['mtime'] = $p_filedescr['mtime']; - } - else if ($p_filedescr['type'] == 'virtual_file') { - $p_header['mtime'] = time(); - } - else { - $p_header['mtime'] = filemtime($p_filename); - } - - // ------ Look for file comment - if (isset($p_filedescr['comment'])) { - $p_header['comment_len'] = strlen($p_filedescr['comment']); - $p_header['comment'] = $p_filedescr['comment']; - } - else { - $p_header['comment_len'] = 0; - $p_header['comment'] = ''; - } - - // ----- Look for pre-add callback - if (isset($p_options[PCLZIP_CB_PRE_ADD])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_header, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header); - if ($v_result == 0) { - // ----- Change the file status - $p_header['status'] = "skipped"; - $v_result = 1; - } - - // ----- Update the informations - // Only some fields can be modified - if ($p_header['stored_filename'] != $v_local_header['stored_filename']) { - $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']); - } - } - - // ----- Look for empty stored filename - if ($p_header['stored_filename'] == "") { - $p_header['status'] = "filtered"; - } - - // ----- Check the path length - if (strlen($p_header['stored_filename']) > 0xFF) { - $p_header['status'] = 'filename_too_long'; - } - - // ----- Look if no error, or file not skipped - if ($p_header['status'] == 'ok') { - - // ----- Look for a file - if ($p_filedescr['type'] == 'file') { - // ----- Look for using temporary file to zip - if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) - && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) - || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) - && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) { - $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options); - if ($v_result < PCLZIP_ERR_NO_ERROR) { - return $v_result; - } - } - - // ----- Use "in memory" zip algo - else { - - // ----- Open the source file - if (($v_file = @fopen($p_filename, "rb")) == 0) { - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); - return PclZip::errorCode(); - } - - // ----- Read the file content - $v_content = @fread($v_file, $p_header['size']); - - // ----- Close the file - @fclose($v_file); - - // ----- Calculate the CRC - $p_header['crc'] = @crc32($v_content); - - // ----- Look for no compression - if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { - // ----- Set header parameters - $p_header['compressed_size'] = $p_header['size']; - $p_header['compression'] = 0; - } - - // ----- Look for normal compression - else { - // ----- Compress the content - $v_content = @gzdeflate($v_content); - - // ----- Set header parameters - $p_header['compressed_size'] = strlen($v_content); - $p_header['compression'] = 8; - } - - // ----- Call the header generation - if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { - @fclose($v_file); - return $v_result; - } - - // ----- Write the compressed (or not) content - @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); - - } - - } - - // ----- Look for a virtual file (a file from string) - else if ($p_filedescr['type'] == 'virtual_file') { - - $v_content = $p_filedescr['content']; - - // ----- Calculate the CRC - $p_header['crc'] = @crc32($v_content); - - // ----- Look for no compression - if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { - // ----- Set header parameters - $p_header['compressed_size'] = $p_header['size']; - $p_header['compression'] = 0; - } - - // ----- Look for normal compression - else { - // ----- Compress the content - $v_content = @gzdeflate($v_content); - - // ----- Set header parameters - $p_header['compressed_size'] = strlen($v_content); - $p_header['compression'] = 8; - } - - // ----- Call the header generation - if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { - @fclose($v_file); - return $v_result; - } - - // ----- Write the compressed (or not) content - @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); - } - - // ----- Look for a directory - else if ($p_filedescr['type'] == 'folder') { - // ----- Look for directory last '/' - if (@substr($p_header['stored_filename'], -1) != '/') { - $p_header['stored_filename'] .= '/'; - } - - // ----- Set the file properties - $p_header['size'] = 0; - //$p_header['external'] = 0x41FF0010; // Value for a folder : to be checked - $p_header['external'] = 0x00000010; // Value for a folder : to be checked - - // ----- Call the header generation - if (($v_result = $this->privWriteFileHeader($p_header)) != 1) - { - return $v_result; - } - } - } - - // ----- Look for post-add callback - if (isset($p_options[PCLZIP_CB_POST_ADD])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_header, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header); - if ($v_result == 0) { - // ----- Ignored - $v_result = 1; - } - - // ----- Update the informations - // Nothing can be modified - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAddFileUsingTempFile() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options) - { - $v_result=PCLZIP_ERR_NO_ERROR; - - // ----- Working variable - $p_filename = $p_filedescr['filename']; - - - // ----- Open the source file - if (($v_file = @fopen($p_filename, "rb")) == 0) { - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); - return PclZip::errorCode(); - } - - // ----- Creates a compressed temporary file - $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; - if ($this->bUseGzopen64) - { - if (($v_file_compressed = @gzopen64($v_gzip_temp_name, "wb")) == 0) { - fclose($v_file); - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); - return PclZip::errorCode(); - } - } - else - { - if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) { - fclose($v_file); - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); - return PclZip::errorCode(); - } - } - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - $v_size = filesize($p_filename); - while ($v_size != 0) { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($v_file, $v_read_size); - //$v_binary_data = pack('a'.$v_read_size, $v_buffer); - @gzputs($v_file_compressed, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Close the file - @fclose($v_file); - @gzclose($v_file_compressed); - - // ----- Check the minimum file size - if (filesize($v_gzip_temp_name) < 18) { - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \''.$v_gzip_temp_name.'\' has invalid filesize - should be minimum 18 bytes'); - return PclZip::errorCode(); - } - - // ----- Extract the compressed attributes - if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); - return PclZip::errorCode(); - } - - // ----- Read the gzip file header - $v_binary_data = @fread($v_file_compressed, 10); - $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data); - - // ----- Check some parameters - $v_data_header['os'] = bin2hex($v_data_header['os']); - - // ----- Read the gzip file footer - @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8); - $v_binary_data = @fread($v_file_compressed, 8); - $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data); - - // ----- Set the attributes - $p_header['compression'] = ord($v_data_header['cm']); - //$p_header['mtime'] = $v_data_header['mtime']; - $p_header['crc'] = $v_data_footer['crc']; - $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18; - - // ----- Close the file - @fclose($v_file_compressed); - - // ----- Call the header generation - if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { - return $v_result; - } - - // ----- Add the compressed data - if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) - { - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); - return PclZip::errorCode(); - } - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - fseek($v_file_compressed, 10); - $v_size = $p_header['compressed_size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($v_file_compressed, $v_read_size); - //$v_binary_data = pack('a'.$v_read_size, $v_buffer); - @fwrite($this->zip_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Close the file - @fclose($v_file_compressed); - - // ----- Unlink the temporary file - @unlink($v_gzip_temp_name); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privCalculateStoredFilename() - // Description : - // Based on file descriptor properties and global options, this method - // calculate the filename that will be stored in the archive. - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privCalculateStoredFilename(&$p_filedescr, &$p_options) - { - $v_result=1; - - // ----- Working variables - $p_filename = $p_filedescr['filename']; - if (isset($p_options[PCLZIP_OPT_ADD_PATH])) { - $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH]; - } - else { - $p_add_dir = ''; - } - if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) { - $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH]; - } - else { - $p_remove_dir = ''; - } - if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { - $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH]; - } - else { - $p_remove_all_dir = 0; - } - - - // ----- Look for full name change - if (isset($p_filedescr['new_full_name'])) { - // ----- Remove drive letter if any - $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']); - } - - // ----- Look for path and/or short name change - else { - - // ----- Look for short name change - // Its when we cahnge just the filename but not the path - if (isset($p_filedescr['new_short_name'])) { - $v_path_info = pathinfo($p_filename); - $v_dir = ''; - if ($v_path_info['dirname'] != '') { - $v_dir = $v_path_info['dirname'].'/'; - } - $v_stored_filename = $v_dir.$p_filedescr['new_short_name']; - } - else { - // ----- Calculate the stored filename - $v_stored_filename = $p_filename; - } - - // ----- Look for all path to remove - if ($p_remove_all_dir) { - $v_stored_filename = basename($p_filename); - } - // ----- Look for partial path remove - else if ($p_remove_dir != "") { - if (substr($p_remove_dir, -1) != '/') - $p_remove_dir .= "/"; - - if ( (substr($p_filename, 0, 2) == "./") - || (substr($p_remove_dir, 0, 2) == "./")) { - - if ( (substr($p_filename, 0, 2) == "./") - && (substr($p_remove_dir, 0, 2) != "./")) { - $p_remove_dir = "./".$p_remove_dir; - } - if ( (substr($p_filename, 0, 2) != "./") - && (substr($p_remove_dir, 0, 2) == "./")) { - $p_remove_dir = substr($p_remove_dir, 2); - } - } - - $v_compare = PclZipUtilPathInclusion($p_remove_dir, - $v_stored_filename); - if ($v_compare > 0) { - if ($v_compare == 2) { - $v_stored_filename = ""; - } - else { - $v_stored_filename = substr($v_stored_filename, - strlen($p_remove_dir)); - } - } - } - - // ----- Remove drive letter if any - $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename); - - // ----- Look for path to add - if ($p_add_dir != "") { - if (substr($p_add_dir, -1) == "/") - $v_stored_filename = $p_add_dir.$v_stored_filename; - else - $v_stored_filename = $p_add_dir."/".$v_stored_filename; - } - } - - // ----- Filename (reduce the path of stored name) - $v_stored_filename = PclZipUtilPathReduction($v_stored_filename); - $p_filedescr['stored_filename'] = $v_stored_filename; - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privWriteFileHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privWriteFileHeader(&$p_header) - { - $v_result=1; - - // ----- Store the offset position of the file - $p_header['offset'] = ftell($this->zip_fd); - - // ----- Transform UNIX mtime to DOS format mdate/mtime - $v_date = getdate($p_header['mtime']); - $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; - $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; - - // ----- Packed data - $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50, - $p_header['version_extracted'], $p_header['flag'], - $p_header['compression'], $v_mtime, $v_mdate, - $p_header['crc'], $p_header['compressed_size'], - $p_header['size'], - strlen($p_header['stored_filename']), - $p_header['extra_len']); - - // ----- Write the first 148 bytes of the header in the archive - fputs($this->zip_fd, $v_binary_data, 30); - - // ----- Write the variable fields - if (strlen($p_header['stored_filename']) != 0) - { - fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); - } - if ($p_header['extra_len'] != 0) - { - fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privWriteCentralFileHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privWriteCentralFileHeader(&$p_header) - { - $v_result=1; - - // TBC - //for(reset($p_header); $key = key($p_header); next($p_header)) { - //} - - // ----- Transform UNIX mtime to DOS format mdate/mtime - $v_date = getdate($p_header['mtime']); - $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; - $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; - - - // ----- Packed data - $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50, - $p_header['version'], $p_header['version_extracted'], - $p_header['flag'], $p_header['compression'], - $v_mtime, $v_mdate, $p_header['crc'], - $p_header['compressed_size'], $p_header['size'], - strlen($p_header['stored_filename']), - $p_header['extra_len'], $p_header['comment_len'], - $p_header['disk'], $p_header['internal'], - $p_header['external'], $p_header['offset']); - - // ----- Write the 42 bytes of the header in the zip file - fputs($this->zip_fd, $v_binary_data, 46); - - // ----- Write the variable fields - if (strlen($p_header['stored_filename']) != 0) - { - fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); - } - if ($p_header['extra_len'] != 0) - { - fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); - } - if ($p_header['comment_len'] != 0) - { - fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privWriteCentralHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment) - { - $v_result=1; - - // ----- Packed data - $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries, - $p_nb_entries, $p_size, - $p_offset, strlen($p_comment)); - - // ----- Write the 22 bytes of the header in the zip file - fputs($this->zip_fd, $v_binary_data, 22); - - // ----- Write the variable fields - if (strlen($p_comment) != 0) - { - fputs($this->zip_fd, $p_comment, strlen($p_comment)); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privList() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privList(&$p_list) - { - $v_result=1; - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Open the zip file - if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) - { - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privSwapBackMagicQuotes(); - return $v_result; - } - - // ----- Go to beginning of Central Dir - @rewind($this->zip_fd); - if (@fseek($this->zip_fd, $v_central_dir['offset'])) - { - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read each entry - for ($i=0; $i<$v_central_dir['entries']; $i++) - { - // ----- Read the file header - if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) - { - $this->privSwapBackMagicQuotes(); - return $v_result; - } - $v_header['index'] = $i; - - // ----- Get the only interesting attributes - $this->privConvertHeader2FileInfo($v_header, $p_list[$i]); - unset($v_header); - } - - // ----- Close the zip file - $this->privCloseFd(); - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privConvertHeader2FileInfo() - // Description : - // This function takes the file informations from the central directory - // entries and extract the interesting parameters that will be given back. - // The resulting file infos are set in the array $p_info - // $p_info['filename'] : Filename with full path. Given by user (add), - // extracted in the filesystem (extract). - // $p_info['stored_filename'] : Stored filename in the archive. - // $p_info['size'] = Size of the file. - // $p_info['compressed_size'] = Compressed size of the file. - // $p_info['mtime'] = Last modification date of the file. - // $p_info['comment'] = Comment associated with the file. - // $p_info['folder'] = true/false : indicates if the entry is a folder or not. - // $p_info['status'] = status of the action on the file. - // $p_info['crc'] = CRC of the file content. - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privConvertHeader2FileInfo($p_header, &$p_info) - { - $v_result=1; - - // ----- Get the interesting attributes - $v_temp_path = PclZipUtilPathReduction($p_header['filename']); - $p_info['filename'] = $v_temp_path; - $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']); - $p_info['stored_filename'] = $v_temp_path; - $p_info['size'] = $p_header['size']; - $p_info['compressed_size'] = $p_header['compressed_size']; - $p_info['mtime'] = $p_header['mtime']; - $p_info['comment'] = $p_header['comment']; - $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010); - $p_info['index'] = $p_header['index']; - $p_info['status'] = $p_header['status']; - $p_info['crc'] = $p_header['crc']; - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractByRule() - // Description : - // Extract a file or directory depending of rules (by index, by name, ...) - // Parameters : - // $p_file_list : An array where will be placed the properties of each - // extracted file - // $p_path : Path to add while writing the extracted files - // $p_remove_path : Path to remove (from the file memorized path) while writing the - // extracted files. If the path does not match the file path, - // the file is extracted with its memorized path. - // $p_remove_path does not apply to 'list' mode. - // $p_path and $p_remove_path are commulative. - // Return Values : - // 1 on success,0 or less on error (see error code list) - // -------------------------------------------------------------------------------- - function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) - { - $v_result=1; - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Check the path - if ( ($p_path == "") - || ( (substr($p_path, 0, 1) != "/") - && (substr($p_path, 0, 3) != "../") - && (substr($p_path,1,2)!=":/"))) - $p_path = "./".$p_path; - - // ----- Reduce the path last (and duplicated) '/' - if (($p_path != "./") && ($p_path != "/")) - { - // ----- Look for the path end '/' - while (substr($p_path, -1) == "/") - { - $p_path = substr($p_path, 0, strlen($p_path)-1); - } - } - - // ----- Look for path to remove format (should end by /) - if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) - { - $p_remove_path .= '/'; - } - $p_remove_path_size = strlen($p_remove_path); - - // ----- Open the zip file - if (($v_result = $this->privOpenFd('rb')) != 1) - { - $this->privSwapBackMagicQuotes(); - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - return $v_result; - } - - // ----- Start at beginning of Central Dir - $v_pos_entry = $v_central_dir['offset']; - - // ----- Read each entry - $j_start = 0; - for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) - { - - // ----- Read next Central dir entry - @rewind($this->zip_fd); - if (@fseek($this->zip_fd, $v_pos_entry)) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read the file header - $v_header = array(); - if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - return $v_result; - } - - // ----- Store the index - $v_header['index'] = $i; - - // ----- Store the file position - $v_pos_entry = ftell($this->zip_fd); - - // ----- Look for the specific extract rules - $v_extract = false; - - // ----- Look for extract by name rule - if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) - && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { - - // ----- Look if the filename is in the list - for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) - && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { - $v_extract = true; - } - } - // ----- Look for a filename - elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { - $v_extract = true; - } - } - } - - // ----- Look for extract by ereg rule - // ereg() is deprecated with PHP 5.3 - /* - else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) - && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { - - if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) { - $v_extract = true; - } - } - */ - - // ----- Look for extract by preg rule - else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) - && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { - - if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) { - $v_extract = true; - } - } - - // ----- Look for extract by index rule - else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) - && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { - - // ----- Look if the index is in the list - for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { - $v_extract = true; - } - if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { - $j_start = $j+1; - } - - if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { - break; - } - } - } - - // ----- Look for no rule, which means extract all the archive - else { - $v_extract = true; - } - - // ----- Check compression method - if ( ($v_extract) - && ( ($v_header['compression'] != 8) - && ($v_header['compression'] != 0))) { - $v_header['status'] = 'unsupported_compression'; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - - $this->privSwapBackMagicQuotes(); - - PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, - "Filename '".$v_header['stored_filename']."' is " - ."compressed by an unsupported compression " - ."method (".$v_header['compression'].") "); - - return PclZip::errorCode(); - } - } - - // ----- Check encrypted files - if (($v_extract) && (($v_header['flag'] & 1) == 1)) { - $v_header['status'] = 'unsupported_encryption'; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - - $this->privSwapBackMagicQuotes(); - - PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, - "Unsupported encryption for " - ." filename '".$v_header['stored_filename'] - ."'"); - - return PclZip::errorCode(); - } - } - - // ----- Look for real extraction - if (($v_extract) && ($v_header['status'] != 'ok')) { - $v_result = $this->privConvertHeader2FileInfo($v_header, - $p_file_list[$v_nb_extracted++]); - if ($v_result != 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result; - } - - $v_extract = false; - } - - // ----- Look for real extraction - if ($v_extract) - { - - // ----- Go to the file position - @rewind($this->zip_fd); - if (@fseek($this->zip_fd, $v_header['offset'])) - { - // ----- Close the zip file - $this->privCloseFd(); - - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Look for extraction as string - if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) { - - $v_string = ''; - - // ----- Extracting the file - $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options); - if ($v_result1 < 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result1; - } - - // ----- Get the only interesting attributes - if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - return $v_result; - } - - // ----- Set the file content - $p_file_list[$v_nb_extracted]['content'] = $v_string; - - // ----- Next extracted file - $v_nb_extracted++; - - // ----- Look for user callback abort - if ($v_result1 == 2) { - break; - } - } - // ----- Look for extraction in standard output - elseif ( (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) - && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) { - // ----- Extracting the file in standard output - $v_result1 = $this->privExtractFileInOutput($v_header, $p_options); - if ($v_result1 < 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result1; - } - - // ----- Get the only interesting attributes - if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result; - } - - // ----- Look for user callback abort - if ($v_result1 == 2) { - break; - } - } - // ----- Look for normal extraction - else { - // ----- Extracting the file - $v_result1 = $this->privExtractFile($v_header, - $p_path, $p_remove_path, - $p_remove_all_path, - $p_options); - if ($v_result1 < 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result1; - } - - // ----- Get the only interesting attributes - if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - return $v_result; - } - - // ----- Look for user callback abort - if ($v_result1 == 2) { - break; - } - } - } - } - - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractFile() - // Description : - // Parameters : - // Return Values : - // - // 1 : ... ? - // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback - // -------------------------------------------------------------------------------- - function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) - { - $v_result=1; - - // ----- Read the file header - if (($v_result = $this->privReadFileHeader($v_header)) != 1) - { - // ----- Return - return $v_result; - } - - - // ----- Check that the file header is coherent with $p_entry info - if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { - // TBC - } - - // ----- Look for all path to remove - if ($p_remove_all_path == true) { - // ----- Look for folder entry that not need to be extracted - if (($p_entry['external']&0x00000010)==0x00000010) { - - $p_entry['status'] = "filtered"; - - return $v_result; - } - - // ----- Get the basename of the path - $p_entry['filename'] = basename($p_entry['filename']); - } - - // ----- Look for path to remove - else if ($p_remove_path != "") - { - if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) - { - - // ----- Change the file status - $p_entry['status'] = "filtered"; - - // ----- Return - return $v_result; - } - - $p_remove_path_size = strlen($p_remove_path); - if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) - { - - // ----- Remove the path - $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size); - - } - } - - // ----- Add the path - if ($p_path != '') { - $p_entry['filename'] = $p_path."/".$p_entry['filename']; - } - - // ----- Check a base_dir_restriction - if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) { - $v_inclusion - = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION], - $p_entry['filename']); - if ($v_inclusion == 0) { - - PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION, - "Filename '".$p_entry['filename']."' is " - ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION"); - - return PclZip::errorCode(); - } - } - - // ----- Look for pre-extract callback - if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); - if ($v_result == 0) { - // ----- Change the file status - $p_entry['status'] = "skipped"; - $v_result = 1; - } - - // ----- Look for abort result - if ($v_result == 2) { - // ----- This status is internal and will be changed in 'skipped' - $p_entry['status'] = "aborted"; - $v_result = PCLZIP_ERR_USER_ABORTED; - } - - // ----- Update the informations - // Only some fields can be modified - $p_entry['filename'] = $v_local_header['filename']; - } - - - // ----- Look if extraction should be done - if ($p_entry['status'] == 'ok') { - - // ----- Look for specific actions while the file exist - if (file_exists($p_entry['filename'])) - { - - // ----- Look if file is a directory - if (is_dir($p_entry['filename'])) - { - - // ----- Change the file status - $p_entry['status'] = "already_a_directory"; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - // For historical reason first PclZip implementation does not stop - // when this kind of error occurs. - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - - PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY, - "Filename '".$p_entry['filename']."' is " - ."already used by an existing directory"); - - return PclZip::errorCode(); - } - } - // ----- Look if file is write protected - else if (!is_writeable($p_entry['filename'])) - { - - // ----- Change the file status - $p_entry['status'] = "write_protected"; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - // For historical reason first PclZip implementation does not stop - // when this kind of error occurs. - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, - "Filename '".$p_entry['filename']."' exists " - ."and is write protected"); - - return PclZip::errorCode(); - } - } - - // ----- Look if the extracted file is older - else if (filemtime($p_entry['filename']) > $p_entry['mtime']) - { - // ----- Change the file status - if ( (isset($p_options[PCLZIP_OPT_REPLACE_NEWER])) - && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) { - } - else { - $p_entry['status'] = "newer_exist"; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - // For historical reason first PclZip implementation does not stop - // when this kind of error occurs. - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, - "Newer version of '".$p_entry['filename']."' exists " - ."and option PCLZIP_OPT_REPLACE_NEWER is not selected"); - - return PclZip::errorCode(); - } - } - } - else { - } - } - - // ----- Check the directory availability and create it if necessary - else { - if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/')) - $v_dir_to_check = $p_entry['filename']; - else if (!strstr($p_entry['filename'], "/")) - $v_dir_to_check = ""; - else - $v_dir_to_check = dirname($p_entry['filename']); - - if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) { - - // ----- Change the file status - $p_entry['status'] = "path_creation_fail"; - - // ----- Return - //return $v_result; - $v_result = 1; - } - } - } - - // ----- Look if extraction should be done - if ($p_entry['status'] == 'ok') { - - // ----- Do the extraction (if not a folder) - if (!(($p_entry['external']&0x00000010)==0x00000010)) - { - // ----- Look for not compressed file - if ($p_entry['compression'] == 0) { - - // ----- Opening destination file - if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) - { - - // ----- Change the file status - $p_entry['status'] = "write_error"; - - // ----- Return - return $v_result; - } - - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - $v_size = $p_entry['compressed_size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($this->zip_fd, $v_read_size); - /* Try to speed up the code - $v_binary_data = pack('a'.$v_read_size, $v_buffer); - @fwrite($v_dest_file, $v_binary_data, $v_read_size); - */ - @fwrite($v_dest_file, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Closing the destination file - fclose($v_dest_file); - - // ----- Change the file mtime - touch($p_entry['filename'], $p_entry['mtime']); - - - } - else { - // ----- TBC - // Need to be finished - if (($p_entry['flag'] & 1) == 1) { - PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \''.$p_entry['filename'].'\' is encrypted. Encrypted files are not supported.'); - return PclZip::errorCode(); - } - - - // ----- Look for using temporary file to unzip - if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) - && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) - || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) - && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) ) ) { - $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options); - if ($v_result < PCLZIP_ERR_NO_ERROR) { - return $v_result; - } - } - - // ----- Look for extract in memory - else { - - - // ----- Read the compressed file in a buffer (one shot) - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); - - // ----- Decompress the file - $v_file_content = @gzinflate($v_buffer); - unset($v_buffer); - if ($v_file_content === FALSE) { - - // ----- Change the file status - // TBC - $p_entry['status'] = "error"; - - return $v_result; - } - - // ----- Opening destination file - if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { - - // ----- Change the file status - $p_entry['status'] = "write_error"; - - return $v_result; - } - - // ----- Write the uncompressed data - @fwrite($v_dest_file, $v_file_content, $p_entry['size']); - unset($v_file_content); - - // ----- Closing the destination file - @fclose($v_dest_file); - - } - - // ----- Change the file mtime - @touch($p_entry['filename'], $p_entry['mtime']); - } - - // ----- Look for chmod option - if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) { - - // ----- Change the mode of the file - @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]); - } - - } - } - - // ----- Change abort status - if ($p_entry['status'] == "aborted") { - $p_entry['status'] = "skipped"; - } - - // ----- Look for post-extract callback - elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); - - // ----- Look for abort result - if ($v_result == 2) { - $v_result = PCLZIP_ERR_USER_ABORTED; - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractFileUsingTempFile() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privExtractFileUsingTempFile(&$p_entry, &$p_options) - { - $v_result=1; - - // ----- Creates a temporary file - $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; - if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) { - fclose($v_file); - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); - return PclZip::errorCode(); - } - - - // ----- Write gz file format header - $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3)); - @fwrite($v_dest_file, $v_binary_data, 10); - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - $v_size = $p_entry['compressed_size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($this->zip_fd, $v_read_size); - //$v_binary_data = pack('a'.$v_read_size, $v_buffer); - @fwrite($v_dest_file, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Write gz file format footer - $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']); - @fwrite($v_dest_file, $v_binary_data, 8); - - // ----- Close the temporary file - @fclose($v_dest_file); - - // ----- Opening destination file - if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { - $p_entry['status'] = "write_error"; - return $v_result; - } - - // ----- Open the temporary gz file - if ($this->bUseGzopen64) - { - if (($v_src_file = @gzopen64($v_gzip_temp_name, 'rb')) == 0) { - @fclose($v_dest_file); - $p_entry['status'] = "read_error"; - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); - return PclZip::errorCode(); - } - } - else - { - if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) { - @fclose($v_dest_file); - $p_entry['status'] = "read_error"; - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); - return PclZip::errorCode(); - } - } - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - $v_size = $p_entry['size']; - while ($v_size != 0) { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @gzread($v_src_file, $v_read_size); - //$v_binary_data = pack('a'.$v_read_size, $v_buffer); - @fwrite($v_dest_file, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - @fclose($v_dest_file); - @gzclose($v_src_file); - - // ----- Delete the temporary file - @unlink($v_gzip_temp_name); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractFileInOutput() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privExtractFileInOutput(&$p_entry, &$p_options) - { - $v_result=1; - - // ----- Read the file header - if (($v_result = $this->privReadFileHeader($v_header)) != 1) { - return $v_result; - } - - - // ----- Check that the file header is coherent with $p_entry info - if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { - // TBC - } - - // ----- Look for pre-extract callback - if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); - if ($v_result == 0) { - // ----- Change the file status - $p_entry['status'] = "skipped"; - $v_result = 1; - } - - // ----- Look for abort result - if ($v_result == 2) { - // ----- This status is internal and will be changed in 'skipped' - $p_entry['status'] = "aborted"; - $v_result = PCLZIP_ERR_USER_ABORTED; - } - - // ----- Update the informations - // Only some fields can be modified - $p_entry['filename'] = $v_local_header['filename']; - } - - // ----- Trace - - // ----- Look if extraction should be done - if ($p_entry['status'] == 'ok') { - - // ----- Do the extraction (if not a folder) - if (!(($p_entry['external']&0x00000010)==0x00000010)) { - // ----- Look for not compressed file - if ($p_entry['compressed_size'] == $p_entry['size']) { - - // ----- Read the file in a buffer (one shot) - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); - - // ----- Send the file to the output - echo $v_buffer; - unset($v_buffer); - } - else { - - // ----- Read the compressed file in a buffer (one shot) - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); - - // ----- Decompress the file - $v_file_content = gzinflate($v_buffer); - unset($v_buffer); - - // ----- Send the file to the output - echo $v_file_content; - unset($v_file_content); - } - } - } - - // ----- Change abort status - if ($p_entry['status'] == "aborted") { - $p_entry['status'] = "skipped"; - } - - // ----- Look for post-extract callback - elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); - - // ----- Look for abort result - if ($v_result == 2) { - $v_result = PCLZIP_ERR_USER_ABORTED; - } - } - - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractFileAsString() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privExtractFileAsString(&$p_entry, &$p_string, &$p_options) - { - $v_result=1; - - // ----- Read the file header - $v_header = array(); - if (($v_result = $this->privReadFileHeader($v_header)) != 1) - { - // ----- Return - return $v_result; - } - - - // ----- Check that the file header is coherent with $p_entry info - if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { - // TBC - } - - // ----- Look for pre-extract callback - if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); - if ($v_result == 0) { - // ----- Change the file status - $p_entry['status'] = "skipped"; - $v_result = 1; - } - - // ----- Look for abort result - if ($v_result == 2) { - // ----- This status is internal and will be changed in 'skipped' - $p_entry['status'] = "aborted"; - $v_result = PCLZIP_ERR_USER_ABORTED; - } - - // ----- Update the informations - // Only some fields can be modified - $p_entry['filename'] = $v_local_header['filename']; - } - - - // ----- Look if extraction should be done - if ($p_entry['status'] == 'ok') { - - // ----- Do the extraction (if not a folder) - if (!(($p_entry['external']&0x00000010)==0x00000010)) { - // ----- Look for not compressed file - // if ($p_entry['compressed_size'] == $p_entry['size']) - if ($p_entry['compression'] == 0) { - - // ----- Reading the file - $p_string = @fread($this->zip_fd, $p_entry['compressed_size']); - } - else { - - // ----- Reading the file - $v_data = @fread($this->zip_fd, $p_entry['compressed_size']); - - // ----- Decompress the file - if (($p_string = @gzinflate($v_data)) === FALSE) { - // TBC - } - } - - // ----- Trace - } - else { - // TBC : error : can not extract a folder in a string - } - - } - - // ----- Change abort status - if ($p_entry['status'] == "aborted") { - $p_entry['status'] = "skipped"; - } - - // ----- Look for post-extract callback - elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Swap the content to header - $v_local_header['content'] = $p_string; - $p_string = ''; - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); - - // ----- Swap back the content to header - $p_string = $v_local_header['content']; - unset($v_local_header['content']); - - // ----- Look for abort result - if ($v_result == 2) { - $v_result = PCLZIP_ERR_USER_ABORTED; - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privReadFileHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privReadFileHeader(&$p_header) - { - $v_result=1; - - // ----- Read the 4 bytes signature - $v_binary_data = @fread($this->zip_fd, 4); - $v_data = unpack('Vid', $v_binary_data); - - // ----- Check signature - if ($v_data['id'] != 0x04034b50) - { - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read the first 42 bytes of the header - $v_binary_data = fread($this->zip_fd, 26); - - // ----- Look for invalid block size - if (strlen($v_binary_data) != 26) - { - $p_header['filename'] = ""; - $p_header['status'] = "invalid_header"; - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Extract the values - $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data); - - // ----- Get filename - $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']); - - // ----- Get extra_fields - if ($v_data['extra_len'] != 0) { - $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']); - } - else { - $p_header['extra'] = ''; - } - - // ----- Extract properties - $p_header['version_extracted'] = $v_data['version']; - $p_header['compression'] = $v_data['compression']; - $p_header['size'] = $v_data['size']; - $p_header['compressed_size'] = $v_data['compressed_size']; - $p_header['crc'] = $v_data['crc']; - $p_header['flag'] = $v_data['flag']; - $p_header['filename_len'] = $v_data['filename_len']; - - // ----- Recuperate date in UNIX format - $p_header['mdate'] = $v_data['mdate']; - $p_header['mtime'] = $v_data['mtime']; - if ($p_header['mdate'] && $p_header['mtime']) - { - // ----- Extract time - $v_hour = ($p_header['mtime'] & 0xF800) >> 11; - $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; - $v_seconde = ($p_header['mtime'] & 0x001F)*2; - - // ----- Extract date - $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; - $v_month = ($p_header['mdate'] & 0x01E0) >> 5; - $v_day = $p_header['mdate'] & 0x001F; - - // ----- Get UNIX date format - $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); - - } - else - { - $p_header['mtime'] = time(); - } - - // TBC - //for(reset($v_data); $key = key($v_data); next($v_data)) { - //} - - // ----- Set the stored filename - $p_header['stored_filename'] = $p_header['filename']; - - // ----- Set the status field - $p_header['status'] = "ok"; - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privReadCentralFileHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privReadCentralFileHeader(&$p_header) - { - $v_result=1; - - // ----- Read the 4 bytes signature - $v_binary_data = @fread($this->zip_fd, 4); - $v_data = unpack('Vid', $v_binary_data); - - // ----- Check signature - if ($v_data['id'] != 0x02014b50) - { - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read the first 42 bytes of the header - $v_binary_data = fread($this->zip_fd, 42); - - // ----- Look for invalid block size - if (strlen($v_binary_data) != 42) - { - $p_header['filename'] = ""; - $p_header['status'] = "invalid_header"; - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Extract the values - $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data); - - // ----- Get filename - if ($p_header['filename_len'] != 0) - $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']); - else - $p_header['filename'] = ''; - - // ----- Get extra - if ($p_header['extra_len'] != 0) - $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']); - else - $p_header['extra'] = ''; - - // ----- Get comment - if ($p_header['comment_len'] != 0) - $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']); - else - $p_header['comment'] = ''; - - // ----- Extract properties - - // ----- Recuperate date in UNIX format - //if ($p_header['mdate'] && $p_header['mtime']) - // TBC : bug : this was ignoring time with 0/0/0 - if (1) - { - // ----- Extract time - $v_hour = ($p_header['mtime'] & 0xF800) >> 11; - $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; - $v_seconde = ($p_header['mtime'] & 0x001F)*2; - - // ----- Extract date - $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; - $v_month = ($p_header['mdate'] & 0x01E0) >> 5; - $v_day = $p_header['mdate'] & 0x001F; - - // ----- Get UNIX date format - $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); - - } - else - { - $p_header['mtime'] = time(); - } - - // ----- Set the stored filename - $p_header['stored_filename'] = $p_header['filename']; - - // ----- Set default status to ok - $p_header['status'] = 'ok'; - - // ----- Look if it is a directory - if (substr($p_header['filename'], -1) == '/') { - //$p_header['external'] = 0x41FF0010; - $p_header['external'] = 0x00000010; - } - - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privCheckFileHeaders() - // Description : - // Parameters : - // Return Values : - // 1 on success, - // 0 on error; - // -------------------------------------------------------------------------------- - function privCheckFileHeaders(&$p_local_header, &$p_central_header) - { - $v_result=1; - - // ----- Check the static values - // TBC - if ($p_local_header['filename'] != $p_central_header['filename']) { - } - if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) { - } - if ($p_local_header['flag'] != $p_central_header['flag']) { - } - if ($p_local_header['compression'] != $p_central_header['compression']) { - } - if ($p_local_header['mtime'] != $p_central_header['mtime']) { - } - if ($p_local_header['filename_len'] != $p_central_header['filename_len']) { - } - - // ----- Look for flag bit 3 - if (($p_local_header['flag'] & 8) == 8) { - $p_local_header['size'] = $p_central_header['size']; - $p_local_header['compressed_size'] = $p_central_header['compressed_size']; - $p_local_header['crc'] = $p_central_header['crc']; - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privReadEndCentralDir() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privReadEndCentralDir(&$p_central_dir) - { - $v_result=1; - - // ----- Go to the end of the zip file - $v_size = filesize($this->zipname); - @fseek($this->zip_fd, $v_size); - if (@ftell($this->zip_fd) != $v_size) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\''); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- First try : look if this is an archive with no commentaries (most of the time) - // in this case the end of central dir is at 22 bytes of the file end - $v_found = 0; - if ($v_size > 26) { - @fseek($this->zip_fd, $v_size-22); - if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22)) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read for bytes - $v_binary_data = @fread($this->zip_fd, 4); - $v_data = @unpack('Vid', $v_binary_data); - - // ----- Check signature - if ($v_data['id'] == 0x06054b50) { - $v_found = 1; - } - - $v_pos = ftell($this->zip_fd); - } - - // ----- Go back to the maximum possible size of the Central Dir End Record - if (!$v_found) { - $v_maximum_size = 65557; // 0xFFFF + 22; - if ($v_maximum_size > $v_size) - $v_maximum_size = $v_size; - @fseek($this->zip_fd, $v_size-$v_maximum_size); - if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size)) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read byte per byte in order to find the signature - $v_pos = ftell($this->zip_fd); - $v_bytes = 0x00000000; - while ($v_pos < $v_size) - { - // ----- Read a byte - $v_byte = @fread($this->zip_fd, 1); - - // ----- Add the byte - //$v_bytes = ($v_bytes << 8) | Ord($v_byte); - // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number - // Otherwise on systems where we have 64bit integers the check below for the magic number will fail. - $v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte); - - // ----- Compare the bytes - if ($v_bytes == 0x504b0506) - { - $v_pos++; - break; - } - - $v_pos++; - } - - // ----- Look if not found end of central dir - if ($v_pos == $v_size) - { - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature"); - - // ----- Return - return PclZip::errorCode(); - } - } - - // ----- Read the first 18 bytes of the header - $v_binary_data = fread($this->zip_fd, 18); - - // ----- Look for invalid block size - if (strlen($v_binary_data) != 18) - { - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data)); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Extract the values - $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data); - - // ----- Check the global size - if (($v_pos + $v_data['comment_size'] + 18) != $v_size) { - - // ----- Removed in release 2.2 see readme file - // The check of the file size is a little too strict. - // Some bugs where found when a zip is encrypted/decrypted with 'crypt'. - // While decrypted, zip has training 0 bytes - if (0) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, - 'The central dir is not at the end of the archive.' - .' Some trailing bytes exists after the archive.'); - - // ----- Return - return PclZip::errorCode(); - } - } - - // ----- Get comment - if ($v_data['comment_size'] != 0) { - $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']); - } - else - $p_central_dir['comment'] = ''; - - $p_central_dir['entries'] = $v_data['entries']; - $p_central_dir['disk_entries'] = $v_data['disk_entries']; - $p_central_dir['offset'] = $v_data['offset']; - $p_central_dir['size'] = $v_data['size']; - $p_central_dir['disk'] = $v_data['disk']; - $p_central_dir['disk_start'] = $v_data['disk_start']; - - // TBC - //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) { - //} - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privDeleteByRule() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privDeleteByRule(&$p_result_list, &$p_options) - { - $v_result=1; - $v_list_detail = array(); - - // ----- Open the zip file - if (($v_result=$this->privOpenFd('rb')) != 1) - { - // ----- Return - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privCloseFd(); - return $v_result; - } - - // ----- Go to beginning of File - @rewind($this->zip_fd); - - // ----- Scan all the files - // ----- Start at beginning of Central Dir - $v_pos_entry = $v_central_dir['offset']; - @rewind($this->zip_fd); - if (@fseek($this->zip_fd, $v_pos_entry)) - { - // ----- Close the zip file - $this->privCloseFd(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read each entry - $v_header_list = array(); - $j_start = 0; - for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) - { - - // ----- Read the file header - $v_header_list[$v_nb_extracted] = array(); - if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - - return $v_result; - } - - - // ----- Store the index - $v_header_list[$v_nb_extracted]['index'] = $i; - - // ----- Look for the specific extract rules - $v_found = false; - - // ----- Look for extract by name rule - if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) - && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { - - // ----- Look if the filename is in the list - for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) - && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { - $v_found = true; - } - elseif ( (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */ - && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) { - $v_found = true; - } - } - // ----- Look for a filename - elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { - $v_found = true; - } - } - } - - // ----- Look for extract by ereg rule - // ereg() is deprecated with PHP 5.3 - /* - else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) - && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { - - if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { - $v_found = true; - } - } - */ - - // ----- Look for extract by preg rule - else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) - && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { - - if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { - $v_found = true; - } - } - - // ----- Look for extract by index rule - else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) - && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { - - // ----- Look if the index is in the list - for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { - $v_found = true; - } - if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { - $j_start = $j+1; - } - - if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { - break; - } - } - } - else { - $v_found = true; - } - - // ----- Look for deletion - if ($v_found) - { - unset($v_header_list[$v_nb_extracted]); - } - else - { - $v_nb_extracted++; - } - } - - // ----- Look if something need to be deleted - if ($v_nb_extracted > 0) { - - // ----- Creates a temporay file - $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; - - // ----- Creates a temporary zip archive - $v_temp_zip = new PclZip($v_zip_temp_name); - - // ----- Open the temporary zip file in write mode - if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) { - $this->privCloseFd(); - - // ----- Return - return $v_result; - } - - // ----- Look which file need to be kept - for ($i=0; $izip_fd); - if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) { - // ----- Close the zip file - $this->privCloseFd(); - $v_temp_zip->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read the file header - $v_local_header = array(); - if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) { - // ----- Close the zip file - $this->privCloseFd(); - $v_temp_zip->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - return $v_result; - } - - // ----- Check that local file header is same as central file header - if ($this->privCheckFileHeaders($v_local_header, - $v_header_list[$i]) != 1) { - // TBC - } - unset($v_local_header); - - // ----- Write the file header - if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) { - // ----- Close the zip file - $this->privCloseFd(); - $v_temp_zip->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - return $v_result; - } - - // ----- Read/write the data block - if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) { - // ----- Close the zip file - $this->privCloseFd(); - $v_temp_zip->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - return $v_result; - } - } - - // ----- Store the offset of the central dir - $v_offset = @ftell($v_temp_zip->zip_fd); - - // ----- Re-Create the Central Dir files header - for ($i=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { - $v_temp_zip->privCloseFd(); - $this->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - return $v_result; - } - - // ----- Transform the header to a 'usable' info - $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); - } - - - // ----- Zip file comment - $v_comment = ''; - if (isset($p_options[PCLZIP_OPT_COMMENT])) { - $v_comment = $p_options[PCLZIP_OPT_COMMENT]; - } - - // ----- Calculate the size of the central header - $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset; - - // ----- Create the central dir footer - if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) { - // ----- Reset the file list - unset($v_header_list); - $v_temp_zip->privCloseFd(); - $this->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - return $v_result; - } - - // ----- Close - $v_temp_zip->privCloseFd(); - $this->privCloseFd(); - - // ----- Delete the zip file - // TBC : I should test the result ... - @unlink($this->zipname); - - // ----- Rename the temporary file - // TBC : I should test the result ... - //@rename($v_zip_temp_name, $this->zipname); - PclZipUtilRename($v_zip_temp_name, $this->zipname); - - // ----- Destroy the temporary archive - unset($v_temp_zip); - } - - // ----- Remove every files : reset the file - else if ($v_central_dir['entries'] != 0) { - $this->privCloseFd(); - - if (($v_result = $this->privOpenFd('wb')) != 1) { - return $v_result; - } - - if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) { - return $v_result; - } - - $this->privCloseFd(); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privDirCheck() - // Description : - // Check if a directory exists, if not it creates it and all the parents directory - // which may be useful. - // Parameters : - // $p_dir : Directory path to check. - // Return Values : - // 1 : OK - // -1 : Unable to create directory - // -------------------------------------------------------------------------------- - function privDirCheck($p_dir, $p_is_dir=false) - { - $v_result = 1; - - - // ----- Remove the final '/' - if (($p_is_dir) && (substr($p_dir, -1)=='/')) - { - $p_dir = substr($p_dir, 0, strlen($p_dir)-1); - } - - // ----- Check the directory availability - if ((is_dir($p_dir)) || ($p_dir == "")) - { - return 1; - } - - // ----- Extract parent directory - $p_parent_dir = dirname($p_dir); - - // ----- Just a check - if ($p_parent_dir != $p_dir) - { - // ----- Look for parent directory - if ($p_parent_dir != "") - { - if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) - { - return $v_result; - } - } - } - - // ----- Create the directory - if (!@mkdir($p_dir, 0777)) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privMerge() - // Description : - // If $p_archive_to_add does not exist, the function exit with a success result. - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privMerge(&$p_archive_to_add) - { - $v_result=1; - - // ----- Look if the archive_to_add exists - if (!is_file($p_archive_to_add->zipname)) - { - - // ----- Nothing to merge, so merge is a success - $v_result = 1; - - // ----- Return - return $v_result; - } - - // ----- Look if the archive exists - if (!is_file($this->zipname)) - { - - // ----- Do a duplicate - $v_result = $this->privDuplicate($p_archive_to_add->zipname); - - // ----- Return - return $v_result; - } - - // ----- Open the zip file - if (($v_result=$this->privOpenFd('rb')) != 1) - { - // ----- Return - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privCloseFd(); - return $v_result; - } - - // ----- Go to beginning of File - @rewind($this->zip_fd); - - // ----- Open the archive_to_add file - if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1) - { - $this->privCloseFd(); - - // ----- Return - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir_to_add = array(); - if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) - { - $this->privCloseFd(); - $p_archive_to_add->privCloseFd(); - - return $v_result; - } - - // ----- Go to beginning of File - @rewind($p_archive_to_add->zip_fd); - - // ----- Creates a temporay file - $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; - - // ----- Open the temporary file in write mode - if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) - { - $this->privCloseFd(); - $p_archive_to_add->privCloseFd(); - - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Copy the files from the archive to the temporary file - // TBC : Here I should better append the file and go back to erase the central dir - $v_size = $v_central_dir['offset']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = fread($this->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Copy the files from the archive_to_add into the temporary file - $v_size = $v_central_dir_to_add['offset']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Store the offset of the central dir - $v_offset = @ftell($v_zip_temp_fd); - - // ----- Copy the block of file headers from the old archive - $v_size = $v_central_dir['size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($this->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Copy the block of file headers from the archive_to_add - $v_size = $v_central_dir_to_add['size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Merge the file comments - $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment']; - - // ----- Calculate the size of the (new) central header - $v_size = @ftell($v_zip_temp_fd)-$v_offset; - - // ----- Swap the file descriptor - // Here is a trick : I swap the temporary fd with the zip fd, in order to use - // the following methods on the temporary fil and not the real archive fd - $v_swap = $this->zip_fd; - $this->zip_fd = $v_zip_temp_fd; - $v_zip_temp_fd = $v_swap; - - // ----- Create the central dir footer - if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1) - { - $this->privCloseFd(); - $p_archive_to_add->privCloseFd(); - @fclose($v_zip_temp_fd); - $this->zip_fd = null; - - // ----- Reset the file list - unset($v_header_list); - - // ----- Return - return $v_result; - } - - // ----- Swap back the file descriptor - $v_swap = $this->zip_fd; - $this->zip_fd = $v_zip_temp_fd; - $v_zip_temp_fd = $v_swap; - - // ----- Close - $this->privCloseFd(); - $p_archive_to_add->privCloseFd(); - - // ----- Close the temporary file - @fclose($v_zip_temp_fd); - - // ----- Delete the zip file - // TBC : I should test the result ... - @unlink($this->zipname); - - // ----- Rename the temporary file - // TBC : I should test the result ... - //@rename($v_zip_temp_name, $this->zipname); - PclZipUtilRename($v_zip_temp_name, $this->zipname); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privDuplicate() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privDuplicate($p_archive_filename) - { - $v_result=1; - - // ----- Look if the $p_archive_filename exists - if (!is_file($p_archive_filename)) - { - - // ----- Nothing to duplicate, so duplicate is a success. - $v_result = 1; - - // ----- Return - return $v_result; - } - - // ----- Open the zip file - if (($v_result=$this->privOpenFd('wb')) != 1) - { - // ----- Return - return $v_result; - } - - // ----- Open the temporary file in write mode - if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) - { - $this->privCloseFd(); - - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Copy the files from the archive to the temporary file - // TBC : Here I should better append the file and go back to erase the central dir - $v_size = filesize($p_archive_filename); - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = fread($v_zip_temp_fd, $v_read_size); - @fwrite($this->zip_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Close - $this->privCloseFd(); - - // ----- Close the temporary file - @fclose($v_zip_temp_fd); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privErrorLog() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function privErrorLog($p_error_code=0, $p_error_string='') - { - if (PCLZIP_ERROR_EXTERNAL == 1) { - PclError($p_error_code, $p_error_string); - } - else { - $this->error_code = $p_error_code; - $this->error_string = $p_error_string; - } - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privErrorReset() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function privErrorReset() - { - if (PCLZIP_ERROR_EXTERNAL == 1) { - PclErrorReset(); - } - else { - $this->error_code = 0; - $this->error_string = ''; - } - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privDisableMagicQuotes() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privDisableMagicQuotes() - { - $v_result=1; - - // ----- Look if function exists - if ( (!function_exists("get_magic_quotes_runtime")) - || (!function_exists("set_magic_quotes_runtime"))) { - return $v_result; - } - - // ----- Look if already done - if ($this->magic_quotes_status != -1) { - return $v_result; - } - - // ----- Get and memorize the magic_quote value - $this->magic_quotes_status = @get_magic_quotes_runtime(); - - // ----- Disable magic_quotes - if ($this->magic_quotes_status == 1) { - @set_magic_quotes_runtime(0); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privSwapBackMagicQuotes() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privSwapBackMagicQuotes() - { - $v_result=1; - - // ----- Look if function exists - if ( (!function_exists("get_magic_quotes_runtime")) - || (!function_exists("set_magic_quotes_runtime"))) { - return $v_result; - } - - // ----- Look if something to do - if ($this->magic_quotes_status != -1) { - return $v_result; - } - - // ----- Swap back magic_quotes - if ($this->magic_quotes_status == 1) { - @set_magic_quotes_runtime($this->magic_quotes_status); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - } - // End of class - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclZipUtilPathReduction() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function PclZipUtilPathReduction($p_dir) - { - $v_result = ""; - - // ----- Look for not empty path - if ($p_dir != "") { - // ----- Explode path by directory names - $v_list = explode("/", $p_dir); - - // ----- Study directories from last to first - $v_skip = 0; - for ($i=sizeof($v_list)-1; $i>=0; $i--) { - // ----- Look for current path - if ($v_list[$i] == ".") { - // ----- Ignore this directory - // Should be the first $i=0, but no check is done - } - else if ($v_list[$i] == "..") { - $v_skip++; - } - else if ($v_list[$i] == "") { - // ----- First '/' i.e. root slash - if ($i == 0) { - $v_result = "/".$v_result; - if ($v_skip > 0) { - // ----- It is an invalid path, so the path is not modified - // TBC - $v_result = $p_dir; - $v_skip = 0; - } - } - // ----- Last '/' i.e. indicates a directory - else if ($i == (sizeof($v_list)-1)) { - $v_result = $v_list[$i]; - } - // ----- Double '/' inside the path - else { - // ----- Ignore only the double '//' in path, - // but not the first and last '/' - } - } - else { - // ----- Look for item to skip - if ($v_skip > 0) { - $v_skip--; - } - else { - $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:""); - } - } - } - - // ----- Look for skip - if ($v_skip > 0) { - while ($v_skip > 0) { - $v_result = '../'.$v_result; - $v_skip--; - } - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclZipUtilPathInclusion() - // Description : - // This function indicates if the path $p_path is under the $p_dir tree. Or, - // said in an other way, if the file or sub-dir $p_path is inside the dir - // $p_dir. - // The function indicates also if the path is exactly the same as the dir. - // This function supports path with duplicated '/' like '//', but does not - // support '.' or '..' statements. - // Parameters : - // Return Values : - // 0 if $p_path is not inside directory $p_dir - // 1 if $p_path is inside directory $p_dir - // 2 if $p_path is exactly the same as $p_dir - // -------------------------------------------------------------------------------- - function PclZipUtilPathInclusion($p_dir, $p_path) - { - $v_result = 1; - - // ----- Look for path beginning by ./ - if ( ($p_dir == '.') - || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) { - $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1); - } - if ( ($p_path == '.') - || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) { - $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1); - } - - // ----- Explode dir and path by directory separator - $v_list_dir = explode("/", $p_dir); - $v_list_dir_size = sizeof($v_list_dir); - $v_list_path = explode("/", $p_path); - $v_list_path_size = sizeof($v_list_path); - - // ----- Study directories paths - $i = 0; - $j = 0; - while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) { - - // ----- Look for empty dir (path reduction) - if ($v_list_dir[$i] == '') { - $i++; - continue; - } - if ($v_list_path[$j] == '') { - $j++; - continue; - } - - // ----- Compare the items - if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != '')) { - $v_result = 0; - } - - // ----- Next items - $i++; - $j++; - } - - // ----- Look if everything seems to be the same - if ($v_result) { - // ----- Skip all the empty items - while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++; - while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++; - - if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) { - // ----- There are exactly the same - $v_result = 2; - } - else if ($i < $v_list_dir_size) { - // ----- The path is shorter than the dir - $v_result = 0; - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclZipUtilCopyBlock() - // Description : - // Parameters : - // $p_mode : read/write compression mode - // 0 : src & dest normal - // 1 : src gzip, dest normal - // 2 : src normal, dest gzip - // 3 : src & dest gzip - // Return Values : - // -------------------------------------------------------------------------------- - function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0) - { - $v_result = 1; - - if ($p_mode==0) - { - while ($p_size != 0) - { - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($p_src, $v_read_size); - @fwrite($p_dest, $v_buffer, $v_read_size); - $p_size -= $v_read_size; - } - } - else if ($p_mode==1) - { - while ($p_size != 0) - { - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @gzread($p_src, $v_read_size); - @fwrite($p_dest, $v_buffer, $v_read_size); - $p_size -= $v_read_size; - } - } - else if ($p_mode==2) - { - while ($p_size != 0) - { - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($p_src, $v_read_size); - @gzwrite($p_dest, $v_buffer, $v_read_size); - $p_size -= $v_read_size; - } - } - else if ($p_mode==3) - { - while ($p_size != 0) - { - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @gzread($p_src, $v_read_size); - @gzwrite($p_dest, $v_buffer, $v_read_size); - $p_size -= $v_read_size; - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclZipUtilRename() - // Description : - // This function tries to do a simple rename() function. If it fails, it - // tries to copy the $p_src file in a new $p_dest file and then unlink the - // first one. - // Parameters : - // $p_src : Old filename - // $p_dest : New filename - // Return Values : - // 1 on success, 0 on failure. - // -------------------------------------------------------------------------------- - function PclZipUtilRename($p_src, $p_dest) - { - $v_result = 1; - - // ----- Try to rename the files - if (!@rename($p_src, $p_dest)) { - - // ----- Try to copy & unlink the src - if (!@copy($p_src, $p_dest)) { - $v_result = 0; - } - else if (!@unlink($p_src)) { - $v_result = 0; - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclZipUtilOptionText() - // Description : - // Translate option value in text. Mainly for debug purpose. - // Parameters : - // $p_option : the option value. - // Return Values : - // The option text value. - // -------------------------------------------------------------------------------- - function PclZipUtilOptionText($p_option) - { - - $v_list = get_defined_constants(); - for (reset($v_list); $v_key = key($v_list); next($v_list)) { - $v_prefix = substr($v_key, 0, 10); - if (( ($v_prefix == 'PCLZIP_OPT') - || ($v_prefix == 'PCLZIP_CB_') - || ($v_prefix == 'PCLZIP_ATT')) - && ($v_list[$v_key] == $p_option)) { - return $v_key; - } - } - - $v_result = 'Unknown'; - - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclZipUtilTranslateWinPath() - // Description : - // Translate windows path by replacing '\' by '/' and optionally removing - // drive letter. - // Parameters : - // $p_path : path to translate. - // $p_remove_disk_letter : true | false - // Return Values : - // The path translated. - // -------------------------------------------------------------------------------- - function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true) - { - if (stristr(php_uname(), 'windows')) { - // ----- Look for potential disk letter - if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { - $p_path = substr($p_path, $v_position+1); - } - // ----- Change potential windows directory separator - if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) { - $p_path = strtr($p_path, '\\', '/'); - } - } - return $p_path; - } - // -------------------------------------------------------------------------------- - - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/readme.txt b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/readme.txt deleted file mode 100755 index 6ed88394..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/pclzip/readme.txt +++ /dev/null @@ -1,421 +0,0 @@ -// -------------------------------------------------------------------------------- -// PclZip 2.8.2 - readme.txt -// -------------------------------------------------------------------------------- -// License GNU/LGPL - August 2009 -// Vincent Blavet - vincent@phpconcept.net -// http://www.phpconcept.net -// -------------------------------------------------------------------------------- -// $Id: readme.txt,v 1.60 2009/09/30 20:35:21 vblavet Exp $ -// -------------------------------------------------------------------------------- - - - -0 - Sommaire -============ - 1 - Introduction - 2 - What's new - 3 - Corrected bugs - 4 - Known bugs or limitations - 5 - License - 6 - Warning - 7 - Documentation - 8 - Author - 9 - Contribute - -1 - Introduction -================ - - PclZip is a library that allow you to manage a Zip archive. - - Full documentation about PclZip can be found here : http://www.phpconcept.net/pclzip - -2 - What's new -============== - - Version 2.8.2 : - - PCLZIP_CB_PRE_EXTRACT and PCLZIP_CB_POST_EXTRACT are now supported with - extraction as a string (PCLZIP_OPT_EXTRACT_AS_STRING). The string - can also be modified in the post-extract call back. - **Bugs correction : - - PCLZIP_OPT_REMOVE_ALL_PATH was not working correctly - - Remove use of eval() and do direct call to callback functions - - Correct support of 64bits systems (Thanks to WordPress team) - - Version 2.8.1 : - - Move option PCLZIP_OPT_BY_EREG to PCLZIP_OPT_BY_PREG because ereg() is - deprecated in PHP 5.3. When using option PCLZIP_OPT_BY_EREG, PclZip will - automatically replace it by PCLZIP_OPT_BY_PREG. - - Version 2.8 : - - Improve extraction of zip archive for large files by using temporary files - This feature is working like the one defined in r2.7. - Options are renamed : PCLZIP_OPT_TEMP_FILE_ON, PCLZIP_OPT_TEMP_FILE_OFF, - PCLZIP_OPT_TEMP_FILE_THRESHOLD - - Add a ratio constant PCLZIP_TEMPORARY_FILE_RATIO to configure the auto - sense of temporary file use. - - Bug correction : Reduce filepath in returned file list to remove ennoying - './/' preambule in file path. - - Version 2.7 : - - Improve creation of zip archive for large files : - PclZip will now autosense the configured memory and use temporary files - when large file is suspected. - This feature can also ne triggered by manual options in create() and add() - methods. 'PCLZIP_OPT_ADD_TEMP_FILE_ON' force the use of temporary files, - 'PCLZIP_OPT_ADD_TEMP_FILE_OFF' disable the autosense technic, - 'PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD' allow for configuration of a size - threshold to use temporary files. - Using "temporary files" rather than "memory" might take more time, but - might give the ability to zip very large files : - Tested on my win laptop with a 88Mo file : - Zip "in-memory" : 18sec (max_execution_time=30, memory_limit=180Mo) - Zip "tmporary-files" : 23sec (max_execution_time=30, memory_limit=30Mo) - - Replace use of mktime() by time() to limit the E_STRICT error messages. - - Bug correction : When adding files with full windows path (drive letter) - PclZip is now working. Before, if the drive letter is not the default - path, PclZip was not able to add the file. - - Version 2.6 : - - Code optimisation - - New attributes PCLZIP_ATT_FILE_COMMENT gives the ability to - add a comment for a specific file. (Don't really know if this is usefull) - - New attribute PCLZIP_ATT_FILE_CONTENT gives the ability to add a string - as a file. - - New attribute PCLZIP_ATT_FILE_MTIME modify the timestamp associated with - a file. - - Correct a bug. Files archived with a timestamp with 0h0m0s were extracted - with current time - - Add CRC value in the informations returned back for each file after an - action. - - Add missing closedir() statement. - - When adding a folder, and removing the path of this folder, files were - incorrectly added with a '/' at the beginning. Which means files are - related to root in unix systems. Corrected. - - Add conditional if before constant definition. This will allow users - to redefine constants without changing the file, and then improve - upgrade of pclzip code for new versions. - - Version 2.5 : - - Introduce the ability to add file/folder with individual properties (file descriptor). - This gives for example the ability to change the filename of a zipped file. - . Able to add files individually - . Able to change full name - . Able to change short name - . Compatible with global options - - New attributes : PCLZIP_ATT_FILE_NAME, PCLZIP_ATT_FILE_NEW_SHORT_NAME, PCLZIP_ATT_FILE_NEW_FULL_NAME - - New error code : PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE - - Add a security control feature. PclZip can extract any file in any folder - of a system. People may use this to upload a zip file and try to override - a system file. The PCLZIP_OPT_EXTRACT_DIR_RESTRICTION will give the - ability to forgive any directory transversal behavior. - - New PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : check extraction path - - New error code : PCLZIP_ERR_DIRECTORY_RESTRICTION - - Modification in PclZipUtilPathInclusion() : dir and path beginning with ./ will be prepend - by current path (getcwd()) - - Version 2.4 : - - Code improvment : try to speed up the code by removing unusefull call to pack() - - Correct bug in delete() : delete() should be called with no argument. This was not - the case in 2.3. This is corrected in 2.4. - - Correct a bug in path_inclusion function. When the path has several '../../', the - result was bad. - - Add a check for magic_quotes_runtime configuration. If enabled, PclZip will - disable it while working and det it back to its original value. - This resolve a lots of bad formated archive errors. - - Bug correction : PclZip now correctly unzip file in some specific situation, - when compressed content has same size as uncompressed content. - - Bug correction : When selecting option 'PCLZIP_OPT_REMOVE_ALL_PATH', - directories are not any more created. - - Code improvment : correct unclosed opendir(), better handling of . and .. in - loops. - - - Version 2.3 : - - Correct a bug with PHP5 : affecting the value 0xFE49FFE0 to a variable does not - give the same result in PHP4 and PHP5 .... - - Version 2.2 : - - Try development of PCLZIP_OPT_CRYPT ..... - However this becomes to a stop. To crypt/decrypt I need to multiply 2 long integers, - the result (greater than a long) is not supported by PHP. Even the use of bcmath - functions does not help. I did not find yet a solution ...; - - Add missing '/' at end of directory entries - - Check is a file is encrypted or not. Returns status 'unsupported_encryption' and/or - error code PCLZIP_ERR_UNSUPPORTED_ENCRYPTION. - - Corrected : Bad "version need to extract" field in local file header - - Add private method privCheckFileHeaders() in order to check local and central - file headers. PclZip is now supporting purpose bit flag bit 3. Purpose bit flag bit 3 gives - the ability to have a local file header without size, compressed size and crc filled. - - Add a generic status 'error' for file status - - Add control of compression type. PclZip only support deflate compression method. - Before v2.2, PclZip does not check the compression method used in an archive while - extracting. With v2.2 PclZip returns a new error status for a file using an unsupported - compression method. New status is "unsupported_compression". New error code is - PCLZIP_ERR_UNSUPPORTED_COMPRESSION. - - Add optional attribute PCLZIP_OPT_STOP_ON_ERROR. This will stop the extract of files - when errors like 'a folder with same name exists' or 'a newer file exists' or - 'a write protected file' exists, rather than set a status for the concerning file - and resume the extract of the zip. - - Add optional attribute PCLZIP_OPT_REPLACE_NEWER. This will force, during an extract' the - replacement of the file, even if a newer version of the file exists. - Note that today if a file with the same name already exists but is older it will be - replaced by the extracted one. - - Improve PclZipUtilOption() - - Support of zip archive with trailing bytes. Before 2.2, PclZip checks that the central - directory structure is the last data in the archive. Crypt encryption/decryption of - zip archive put trailing 0 bytes after decryption. PclZip is now supporting this. - - Version 2.1 : - - Add the ability to abort the extraction by using a user callback function. - The user can now return the value '2' in its callback which indicates to stop the - extraction. For a pre call-back extract is stopped before the extration of the current - file. For a post call back, the extraction is stopped after. - - Add the ability to extract a file (or several files) directly in the standard output. - This is done by the new parameter PCLZIP_OPT_EXTRACT_IN_OUTPUT with method extract(). - - Add support for parameters PCLZIP_OPT_COMMENT, PCLZIP_OPT_ADD_COMMENT, - PCLZIP_OPT_PREPEND_COMMENT. This will create, replace, add, or prepend comments - in the zip archive. - - When merging two archives, the comments are not any more lost, but merged, with a - blank space separator. - - Corrected bug : Files are not deleted when all files are asked to be deleted. - - Corrected bug : Folders with name '0' made PclZip to abort the create or add feature. - - - Version 2.0 : - ***** Warning : Some new features may break the backward compatibility for your scripts. - Please carefully read the readme file. - - Add the ability to delete by Index, name and regular expression. This feature is - performed by the method delete(), which uses the optional parameters - PCLZIP_OPT_BY_INDEX, PCLZIP_OPT_BY_NAME, PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG. - - Add the ability to extract by regular expression. To extract by regexp you must use the method - extract(), with the option PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG - (depending if you want to use ereg() or preg_match() syntax) followed by the - regular expression pattern. - - Add the ability to extract by index, directly with the extract() method. This is a - code improvment of the extractByIndex() method. - - Add the ability to extract by name. To extract by name you must use the method - extract(), with the option PCLZIP_OPT_BY_NAME followed by the filename to - extract or an array of filenames to extract. To extract all a folder, use the folder - name rather than the filename with a '/' at the end. - - Add the ability to add files without compression. This is done with a new attribute - which is PCLZIP_OPT_NO_COMPRESSION. - - Add the attribute PCLZIP_OPT_EXTRACT_AS_STRING, which allow to extract a file directly - in a string without using any file (or temporary file). - - Add constant PCLZIP_SEPARATOR for static configuration of filename separators in a single string. - The default separator is now a comma (,) and not any more a blank space. - THIS BREAK THE BACKWARD COMPATIBILITY : Please check if this may have an impact with - your script. - - Improve algorythm performance by removing the use of temporary files when adding or - extracting files in an archive. - - Add (correct) detection of empty filename zipping. This can occurs when the removed - path is the same - as a zipped dir. The dir is not zipped (['status'] = filtered), only its content. - - Add better support for windows paths (thanks for help from manus@manusfreedom.com). - - Corrected bug : When the archive file already exists with size=0, the add() method - fails. Corrected in 2.0. - - Remove the use of OS_WINDOWS constant. Use php_uname() function rather. - - Control the order of index ranges in extract by index feature. - - Change the internal management of folders (better handling of internal flag). - - - Version 1.3 : - - Removing the double include check. This is now done by include_once() and require_once() - PHP directives. - - Changing the error handling mecanism : Remove the use of an external error library. - The former PclError...() functions are replaced by internal equivalent methods. - By changing the environment variable PCLZIP_ERROR_EXTERNAL you can still use the former library. - Introducing the use of constants for error codes rather than integer values. This will help - in futur improvment. - Introduction of error handling functions like errorCode(), errorName() and errorInfo(). - - Remove the deprecated use of calling function with arguments passed by reference. - - Add the calling of extract(), extractByIndex(), create() and add() functions - with variable options rather than fixed arguments. - - Add the ability to remove all the file path while extracting or adding, - without any need to specify the path to remove. - This is available for extract(), extractByIndex(), create() and add() functionS by using - the new variable options parameters : - - PCLZIP_OPT_REMOVE_ALL_PATH : by indicating this option while calling the fct. - - Ability to change the mode of a file after the extraction (chmod()). - This is available for extract() and extractByIndex() functionS by using - the new variable options parameters. - - PCLZIP_OPT_SET_CHMOD : by setting the value of this option. - - Ability to definition call-back options. These call-back will be called during the adding, - or the extracting of file (extract(), extractByIndex(), create() and add() functions) : - - PCLZIP_CB_PRE_EXTRACT : will be called before each extraction of a file. The user - can trigerred the change the filename of the extracted file. The user can triggered the - skip of the extraction. This is adding a 'skipped' status in the file list result value. - - PCLZIP_CB_POST_EXTRACT : will be called after each extraction of a file. - Nothing can be triggered from that point. - - PCLZIP_CB_PRE_ADD : will be called before each add of a file. The user - can trigerred the change the stored filename of the added file. The user can triggered the - skip of the add. This is adding a 'skipped' status in the file list result value. - - PCLZIP_CB_POST_ADD : will be called after each add of a file. - Nothing can be triggered from that point. - - Two status are added in the file list returned as function result : skipped & filename_too_long - 'skipped' is used when a call-back function ask for skipping the file. - 'filename_too_long' is used while adding a file with a too long filename to archive (the file is - not added) - - Adding the function PclZipUtilPathInclusion(), that check the inclusion of a path into - a directory. - - Add a check of the presence of the archive file before some actions (like list, ...) - - Add the initialisation of field "index" in header array. This means that by - default index will be -1 when not explicitly set by the methods. - - Version 1.2 : - - Adding a duplicate function. - - Adding a merge function. The merge function is a "quick merge" function, - it just append the content of an archive at the end of the first one. There - is no check for duplicate files or more recent files. - - Improve the search of the central directory end. - - Version 1.1.2 : - - - Changing the license of PclZip. PclZip is now released under the GNU / LGPL license - (see License section). - - Adding the optional support of a static temporary directory. You will need to configure - the constant PCLZIP_TEMPORARY_DIR if you want to use this feature. - - Improving the rename() function. In some cases rename() does not work (different - Filesystems), so it will be replaced by a copy() + unlink() functions. - - Version 1.1.1 : - - - Maintenance release, no new feature. - - Version 1.1 : - - - New method Add() : adding files in the archive - - New method ExtractByIndex() : partial extract of the archive, files are identified by - their index in the archive - - New method DeleteByIndex() : delete some files/folder entries from the archive, - files are identified by their index in the archive. - - Adding a test of the zlib extension presence. If not present abort the script. - - Version 1.0.1 : - - - No new feature - - -3 - Corrected bugs -================== - - Corrected in Version 2.0 : - - Corrected : During an extraction, if a call-back fucntion is used and try to skip - a file, all the extraction process is stopped. - - Corrected in Version 1.3 : - - Corrected : Support of static synopsis for method extract() is broken. - - Corrected : invalid size of archive content field (0xFF) should be (0xFFFF). - - Corrected : When an extract is done with a remove_path parameter, the entry for - the directory with exactly the same path is not skipped/filtered. - - Corrected : extractByIndex() and deleteByIndex() were not managing index in the - right way. For example indexes '1,3-5,11' will only extract files 1 and 11. This - is due to a sort of the index resulting table that puts 11 before 3-5 (sort on - string and not interger). The sort is temporarilly removed, this means that - you must provide a sorted list of index ranges. - - Corrected in Version 1.2 : - - - Nothing. - - Corrected in Version 1.1.2 : - - - Corrected : Winzip is unable to delete or add new files in a PclZip created archives. - - Corrected in Version 1.1.1 : - - - Corrected : When archived file is not compressed (0% compression), the - extract method fails. - - Corrected in Version 1.1 : - - - Corrected : Adding a complete tree of folder may result in a bad archive - creation. - - Corrected in Version 1.0.1 : - - - Corrected : Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024). - - -4 - Known bugs or limitations -============================= - - Please publish bugs reports in SourceForge : - http://sourceforge.net/tracker/?group_id=40254&atid=427564 - - In Version 2.x : - - PclZip does only support file uncompressed or compressed with deflate (compression method 8) - - PclZip does not support password protected zip archive - - Some concern were seen when changing mtime of a file while archiving. - Seems to be linked to Daylight Saving Time (PclTest_changing_mtime). - - In Version 1.2 : - - - merge() methods does not check for duplicate files or last date of modifications. - - In Version 1.1 : - - - Limitation : Using 'extract' fields in the file header in the zip archive is not supported. - - WinZip is unable to delete a single file in a PclZip created archive. It is also unable to - add a file in a PclZip created archive. (Corrected in v.1.2) - - In Version 1.0.1 : - - - Adding a complete tree of folder may result in a bad archive - creation. (Corrected in V.1.1). - - Path given to methods must be in the unix format (/) and not the Windows format (\). - Workaround : Use only / directory separators. - - PclZip is using temporary files that are sometime the name of the file with a .tmp or .gz - added suffix. Files with these names may already exist and may be overwritten. - Workaround : none. - - PclZip does not check if the zlib extension is present. If it is absent, the zip - file is not created and the lib abort without warning. - Workaround : enable the zlib extension on the php install - - In Version 1.0 : - - - Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024). - (Corrected in v.1.0.1) - - Limitation : Multi-disk zip archive are not supported. - - -5 - License -=========== - - Since version 1.1.2, PclZip Library is released under GNU/LGPL license. - This library is free, so you can use it at no cost. - - HOWEVER, if you release a script, an application, a library or any kind of - code using PclZip library (or a part of it), YOU MUST : - - Indicate in the documentation (or a readme file), that your work - uses PclZip Library, and make a reference to the author and the web site - http://www.phpconcept.net - - Gives the ability to the final user to update the PclZip libary. - - I will also appreciate that you send me a mail (vincent@phpconcept.net), just to - be aware that someone is using PclZip. - - For more information about GNU/LGPL license : http://www.gnu.org - -6 - Warning -================= - - This library and the associated files are non commercial, non professional work. - It should not have unexpected results. However if any damage is caused by this software - the author can not be responsible. - The use of this software is at the risk of the user. - -7 - Documentation -================= - PclZip User Manuel is available in English on PhpConcept : http://www.phpconcept.net/pclzip/man/en/index.php - A Russian translation was done by Feskov Kuzma : http://php.russofile.ru/ru/authors/unsort/zip/ - -8 - Author -========== - - This software was written by Vincent Blavet (vincent@phpconcept.net) on its leasure time. - -9 - Contribute -============== - If you want to contribute to the development of PclZip, please contact vincent@phpconcept.net. - If you can help in financing PhpConcept hosting service, please go to - http://www.phpconcept.net/soutien.php diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/AES.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/AES.php deleted file mode 100755 index 6b1f9daa..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/AES.php +++ /dev/null @@ -1,207 +0,0 @@ - - * setKey('abcdefghijklmnop'); - * - * $size = 10 * 1024; - * $plaintext = ''; - * for ($i = 0; $i < $size; $i++) { - * $plaintext.= 'a'; - * } - * - * echo $aes->decrypt($aes->encrypt($plaintext)); - * ?> - * - * - * LICENSE: 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. - * - * @category Crypt - * @package Crypt_AES - * @author Jim Wigginton - * @copyright 2008 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include Crypt_Rijndael - */ -if (!class_exists('Crypt_Rijndael')) { - include_once 'Rijndael.php'; -} - -/**#@+ - * @access public - * @see Crypt_AES::encrypt() - * @see Crypt_AES::decrypt() - */ -/** - * Encrypt / decrypt using the Counter mode. - * - * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 - */ -define('CRYPT_AES_MODE_CTR', CRYPT_MODE_CTR); -/** - * Encrypt / decrypt using the Electronic Code Book mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 - */ -define('CRYPT_AES_MODE_ECB', CRYPT_MODE_ECB); -/** - * Encrypt / decrypt using the Code Book Chaining mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 - */ -define('CRYPT_AES_MODE_CBC', CRYPT_MODE_CBC); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 - */ -define('CRYPT_AES_MODE_CFB', CRYPT_MODE_CFB); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 - */ -define('CRYPT_AES_MODE_OFB', CRYPT_MODE_OFB); -/**#@-*/ - -/**#@+ - * @access private - * @see Crypt_Base::Crypt_Base() - */ -/** - * Toggles the internal implementation - */ -define('CRYPT_AES_MODE_INTERNAL', CRYPT_MODE_INTERNAL); -/** - * Toggles the mcrypt implementation - */ -define('CRYPT_AES_MODE_MCRYPT', CRYPT_MODE_MCRYPT); -/**#@-*/ - -/** - * Pure-PHP implementation of AES. - * - * @package Crypt_AES - * @author Jim Wigginton - * @access public - */ -class Crypt_AES extends Crypt_Rijndael -{ - /** - * The namespace used by the cipher for its constants. - * - * @see Crypt_Base::const_namespace - * @var String - * @access private - */ - var $const_namespace = 'AES'; - - /** - * Dummy function - * - * Since Crypt_AES extends Crypt_Rijndael, this function is, technically, available, but it doesn't do anything. - * - * @see Crypt_Rijndael::setBlockLength() - * @access public - * @param Integer $length - */ - function setBlockLength($length) - { - return; - } - - /** - * Sets the key length - * - * Valid key lengths are 128, 192, and 256. If the length is less than 128, it will be rounded up to - * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount. - * - * @see Crypt_Rijndael:setKeyLength() - * @access public - * @param Integer $length - */ - function setKeyLength($length) - { - switch ($length) { - case 160: - $length = 192; - break; - case 224: - $length = 256; - } - parent::setKeyLength($length); - } - - /** - * Sets the key. - * - * Rijndael supports five different key lengths, AES only supports three. - * - * @see Crypt_Rijndael:setKey() - * @see setKeyLength() - * @access public - * @param String $key - */ - function setKey($key) - { - parent::setKey($key); - - if (!$this->explicit_key_length) { - $length = strlen($key); - switch (true) { - case $length <= 16: - $this->key_size = 16; - break; - case $length <= 24: - $this->key_size = 24; - break; - default: - $this->key_size = 32; - } - $this->_setupEngine(); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Base.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Base.php deleted file mode 100755 index 4df2a2db..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Base.php +++ /dev/null @@ -1,2011 +0,0 @@ - - * @author Hans-Juergen Petrich - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/**#@+ - * @access public - * @see Crypt_Base::encrypt() - * @see Crypt_Base::decrypt() - */ -/** - * Encrypt / decrypt using the Counter mode. - * - * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 - */ -define('CRYPT_MODE_CTR', -1); -/** - * Encrypt / decrypt using the Electronic Code Book mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 - */ -define('CRYPT_MODE_ECB', 1); -/** - * Encrypt / decrypt using the Code Book Chaining mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 - */ -define('CRYPT_MODE_CBC', 2); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 - */ -define('CRYPT_MODE_CFB', 3); -/** - * Encrypt / decrypt using the Output Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 - */ -define('CRYPT_MODE_OFB', 4); -/** - * Encrypt / decrypt using streaming mode. - * - */ -define('CRYPT_MODE_STREAM', 5); -/**#@-*/ - -/**#@+ - * @access private - * @see Crypt_Base::Crypt_Base() - */ -/** - * Base value for the internal implementation $engine switch - */ -define('CRYPT_MODE_INTERNAL', 1); -/** - * Base value for the mcrypt implementation $engine switch - */ -define('CRYPT_MODE_MCRYPT', 2); -/**#@-*/ - -/** - * Base Class for all Crypt_* cipher classes - * - * @package Crypt_Base - * @author Jim Wigginton - * @author Hans-Juergen Petrich - * @access public - */ -class Crypt_Base -{ - /** - * The Encryption Mode - * - * @see Crypt_Base::Crypt_Base() - * @var Integer - * @access private - */ - var $mode; - - /** - * The Block Length of the block cipher - * - * @var Integer - * @access private - */ - var $block_size = 16; - - /** - * The Key - * - * @see Crypt_Base::setKey() - * @var String - * @access private - */ - var $key = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; - - /** - * The Initialization Vector - * - * @see Crypt_Base::setIV() - * @var String - * @access private - */ - var $iv; - - /** - * A "sliding" Initialization Vector - * - * @see Crypt_Base::enableContinuousBuffer() - * @see Crypt_Base::_clearBuffers() - * @var String - * @access private - */ - var $encryptIV; - - /** - * A "sliding" Initialization Vector - * - * @see Crypt_Base::enableContinuousBuffer() - * @see Crypt_Base::_clearBuffers() - * @var String - * @access private - */ - var $decryptIV; - - /** - * Continuous Buffer status - * - * @see Crypt_Base::enableContinuousBuffer() - * @var Boolean - * @access private - */ - var $continuousBuffer = false; - - /** - * Encryption buffer for CTR, OFB and CFB modes - * - * @see Crypt_Base::encrypt() - * @see Crypt_Base::_clearBuffers() - * @var Array - * @access private - */ - var $enbuffer; - - /** - * Decryption buffer for CTR, OFB and CFB modes - * - * @see Crypt_Base::decrypt() - * @see Crypt_Base::_clearBuffers() - * @var Array - * @access private - */ - var $debuffer; - - /** - * mcrypt resource for encryption - * - * The mcrypt resource can be recreated every time something needs to be created or it can be created just once. - * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode. - * - * @see Crypt_Base::encrypt() - * @var Resource - * @access private - */ - var $enmcrypt; - - /** - * mcrypt resource for decryption - * - * The mcrypt resource can be recreated every time something needs to be created or it can be created just once. - * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode. - * - * @see Crypt_Base::decrypt() - * @var Resource - * @access private - */ - var $demcrypt; - - /** - * Does the enmcrypt resource need to be (re)initialized? - * - * @see Crypt_Twofish::setKey() - * @see Crypt_Twofish::setIV() - * @var Boolean - * @access private - */ - var $enchanged = true; - - /** - * Does the demcrypt resource need to be (re)initialized? - * - * @see Crypt_Twofish::setKey() - * @see Crypt_Twofish::setIV() - * @var Boolean - * @access private - */ - var $dechanged = true; - - /** - * mcrypt resource for CFB mode - * - * mcrypt's CFB mode, in (and only in) buffered context, - * is broken, so phpseclib implements the CFB mode by it self, - * even when the mcrypt php extension is available. - * - * In order to do the CFB-mode work (fast) phpseclib - * use a separate ECB-mode mcrypt resource. - * - * @link http://phpseclib.sourceforge.net/cfb-demo.phps - * @see Crypt_Base::encrypt() - * @see Crypt_Base::decrypt() - * @see Crypt_Base::_setupMcrypt() - * @var Resource - * @access private - */ - var $ecb; - - /** - * Optimizing value while CFB-encrypting - * - * Only relevant if $continuousBuffer enabled - * and $engine == CRYPT_MODE_MCRYPT - * - * It's faster to re-init $enmcrypt if - * $buffer bytes > $cfb_init_len than - * using the $ecb resource furthermore. - * - * This value depends of the chosen cipher - * and the time it would be needed for it's - * initialization [by mcrypt_generic_init()] - * which, typically, depends on the complexity - * on its internaly Key-expanding algorithm. - * - * @see Crypt_Base::encrypt() - * @var Integer - * @access private - */ - var $cfb_init_len = 600; - - /** - * Does internal cipher state need to be (re)initialized? - * - * @see setKey() - * @see setIV() - * @see disableContinuousBuffer() - * @var Boolean - * @access private - */ - var $changed = true; - - /** - * Padding status - * - * @see Crypt_Base::enablePadding() - * @var Boolean - * @access private - */ - var $padding = true; - - /** - * Is the mode one that is paddable? - * - * @see Crypt_Base::Crypt_Base() - * @var Boolean - * @access private - */ - var $paddable = false; - - /** - * Holds which crypt engine internaly should be use, - * which will be determined automatically on __construct() - * - * Currently available $engines are: - * - CRYPT_MODE_MCRYPT (fast, php-extension: mcrypt, extension_loaded('mcrypt') required) - * - CRYPT_MODE_INTERNAL (slower, pure php-engine, no php-extension required) - * - * In the pipeline... maybe. But currently not available: - * - CRYPT_MODE_OPENSSL (very fast, php-extension: openssl, extension_loaded('openssl') required) - * - * If possible, CRYPT_MODE_MCRYPT will be used for each cipher. - * Otherwise CRYPT_MODE_INTERNAL - * - * @see Crypt_Base::encrypt() - * @see Crypt_Base::decrypt() - * @var Integer - * @access private - */ - var $engine; - - /** - * The mcrypt specific name of the cipher - * - * Only used if $engine == CRYPT_MODE_MCRYPT - * - * @link http://www.php.net/mcrypt_module_open - * @link http://www.php.net/mcrypt_list_algorithms - * @see Crypt_Base::_setupMcrypt() - * @var String - * @access private - */ - var $cipher_name_mcrypt; - - /** - * The default password key_size used by setPassword() - * - * @see Crypt_Base::setPassword() - * @var Integer - * @access private - */ - var $password_key_size = 32; - - /** - * The default salt used by setPassword() - * - * @see Crypt_Base::setPassword() - * @var String - * @access private - */ - var $password_default_salt = 'phpseclib/salt'; - - /** - * The namespace used by the cipher for its constants. - * - * ie: AES.php is using CRYPT_AES_MODE_* for its constants - * so $const_namespace is AES - * - * DES.php is using CRYPT_DES_MODE_* for its constants - * so $const_namespace is DES... and so on - * - * All CRYPT_<$const_namespace>_MODE_* are aliases of - * the generic CRYPT_MODE_* constants, so both could be used - * for each cipher. - * - * Example: - * $aes = new Crypt_AES(CRYPT_AES_MODE_CFB); // $aes will operate in cfb mode - * $aes = new Crypt_AES(CRYPT_MODE_CFB); // identical - * - * @see Crypt_Base::Crypt_Base() - * @var String - * @access private - */ - var $const_namespace; - - /** - * The name of the performance-optimized callback function - * - * Used by encrypt() / decrypt() - * only if $engine == CRYPT_MODE_INTERNAL - * - * @see Crypt_Base::encrypt() - * @see Crypt_Base::decrypt() - * @see Crypt_Base::_setupInlineCrypt() - * @see Crypt_Base::$use_inline_crypt - * @var Callback - * @access private - */ - var $inline_crypt; - - /** - * Holds whether performance-optimized $inline_crypt() can/should be used. - * - * @see Crypt_Base::encrypt() - * @see Crypt_Base::decrypt() - * @see Crypt_Base::inline_crypt - * @var mixed - * @access private - */ - var $use_inline_crypt; - - /** - * Default Constructor. - * - * Determines whether or not the mcrypt extension should be used. - * - * $mode could be: - * - * - CRYPT_MODE_ECB - * - * - CRYPT_MODE_CBC - * - * - CRYPT_MODE_CTR - * - * - CRYPT_MODE_CFB - * - * - CRYPT_MODE_OFB - * - * (or the alias constants of the chosen cipher, for example for AES: CRYPT_AES_MODE_ECB or CRYPT_AES_MODE_CBC ...) - * - * If not explicitly set, CRYPT_MODE_CBC will be used. - * - * @param optional Integer $mode - * @access public - */ - function Crypt_Base($mode = CRYPT_MODE_CBC) - { - $const_crypt_mode = 'CRYPT_' . $this->const_namespace . '_MODE'; - - // Determining the availibility of mcrypt support for the cipher - if (!defined($const_crypt_mode)) { - switch (true) { - case extension_loaded('mcrypt') && in_array($this->cipher_name_mcrypt, mcrypt_list_algorithms()): - define($const_crypt_mode, CRYPT_MODE_MCRYPT); - break; - default: - define($const_crypt_mode, CRYPT_MODE_INTERNAL); - } - } - - // Determining which internal $engine should be used. - // The fastes possible first. - switch (true) { - case empty($this->cipher_name_mcrypt): // The cipher module has no mcrypt-engine support at all so we force CRYPT_MODE_INTERNAL - $this->engine = CRYPT_MODE_INTERNAL; - break; - case constant($const_crypt_mode) == CRYPT_MODE_MCRYPT: - $this->engine = CRYPT_MODE_MCRYPT; - break; - default: - $this->engine = CRYPT_MODE_INTERNAL; - } - - // $mode dependent settings - switch ($mode) { - case CRYPT_MODE_ECB: - $this->paddable = true; - $this->mode = $mode; - break; - case CRYPT_MODE_CTR: - case CRYPT_MODE_CFB: - case CRYPT_MODE_OFB: - case CRYPT_MODE_STREAM: - $this->mode = $mode; - break; - case CRYPT_MODE_CBC: - default: - $this->paddable = true; - $this->mode = CRYPT_MODE_CBC; - } - - // Determining whether inline crypting can be used by the cipher - if ($this->use_inline_crypt !== false && function_exists('create_function')) { - $this->use_inline_crypt = true; - } - } - - /** - * Sets the initialization vector. (optional) - * - * SetIV is not required when CRYPT_MODE_ECB (or ie for AES: CRYPT_AES_MODE_ECB) is being used. If not explicitly set, it'll be assumed - * to be all zero's. - * - * Note: Could, but not must, extend by the child Crypt_* class - * - * @access public - * @param String $iv - */ - function setIV($iv) - { - if ($this->mode == CRYPT_MODE_ECB) { - return; - } - - $this->iv = $iv; - $this->changed = true; - } - - /** - * Sets the key. - * - * The min/max length(s) of the key depends on the cipher which is used. - * If the key not fits the length(s) of the cipher it will paded with null bytes - * up to the closest valid key length. If the key is more than max length, - * we trim the excess bits. - * - * If the key is not explicitly set, it'll be assumed to be all null bytes. - * - * Note: Could, but not must, extend by the child Crypt_* class - * - * @access public - * @param String $key - */ - function setKey($key) - { - $this->key = $key; - $this->changed = true; - } - - /** - * Sets the password. - * - * Depending on what $method is set to, setPassword()'s (optional) parameters are as follows: - * {@link http://en.wikipedia.org/wiki/PBKDF2 pbkdf2} or pbkdf1: - * $hash, $salt, $count, $dkLen - * - * Where $hash (default = sha1) currently supports the following hashes: see: Crypt/Hash.php - * - * Note: Could, but not must, extend by the child Crypt_* class - * - * @see Crypt/Hash.php - * @param String $password - * @param optional String $method - * @return Boolean - * @access public - */ - function setPassword($password, $method = 'pbkdf2') - { - $key = ''; - - switch ($method) { - default: // 'pbkdf2' or 'pbkdf1' - $func_args = func_get_args(); - - // Hash function - $hash = isset($func_args[2]) ? $func_args[2] : 'sha1'; - - // WPA and WPA2 use the SSID as the salt - $salt = isset($func_args[3]) ? $func_args[3] : $this->password_default_salt; - - // RFC2898#section-4.2 uses 1,000 iterations by default - // WPA and WPA2 use 4,096. - $count = isset($func_args[4]) ? $func_args[4] : 1000; - - // Keylength - if (isset($func_args[5])) { - $dkLen = $func_args[5]; - } else { - $dkLen = $method == 'pbkdf1' ? 2 * $this->password_key_size : $this->password_key_size; - } - - switch (true) { - case $method == 'pbkdf1': - if (!class_exists('Crypt_Hash')) { - include_once 'Crypt/Hash.php'; - } - $hashObj = new Crypt_Hash(); - $hashObj->setHash($hash); - if ($dkLen > $hashObj->getLength()) { - user_error('Derived key too long'); - return false; - } - $t = $password . $salt; - for ($i = 0; $i < $count; ++$i) { - $t = $hashObj->hash($t); - } - $key = substr($t, 0, $dkLen); - - $this->setKey(substr($key, 0, $dkLen >> 1)); - $this->setIV(substr($key, $dkLen >> 1)); - - return true; - // Determining if php[>=5.5.0]'s hash_pbkdf2() function avail- and useable - case !function_exists('hash_pbkdf2'): - case !function_exists('hash_algos'): - case !in_array($hash, hash_algos()): - if (!class_exists('Crypt_Hash')) { - include_once 'Crypt/Hash.php'; - } - $i = 1; - while (strlen($key) < $dkLen) { - $hmac = new Crypt_Hash(); - $hmac->setHash($hash); - $hmac->setKey($password); - $f = $u = $hmac->hash($salt . pack('N', $i++)); - for ($j = 2; $j <= $count; ++$j) { - $u = $hmac->hash($u); - $f^= $u; - } - $key.= $f; - } - $key = substr($key, 0, $dkLen); - break; - default: - $key = hash_pbkdf2($hash, $password, $salt, $count, $dkLen, true); - } - } - - $this->setKey($key); - - return true; - } - - /** - * Encrypts a message. - * - * $plaintext will be padded with additional bytes such that it's length is a multiple of the block size. Other cipher - * implementations may or may not pad in the same manner. Other common approaches to padding and the reasons why it's - * necessary are discussed in the following - * URL: - * - * {@link http://www.di-mgt.com.au/cryptopad.html http://www.di-mgt.com.au/cryptopad.html} - * - * An alternative to padding is to, separately, send the length of the file. This is what SSH, in fact, does. - * strlen($plaintext) will still need to be a multiple of the block size, however, arbitrary values can be added to make it that - * length. - * - * Note: Could, but not must, extend by the child Crypt_* class - * - * @see Crypt_Base::decrypt() - * @access public - * @param String $plaintext - * @return String $cipertext - */ - function encrypt($plaintext) - { - if ($this->engine == CRYPT_MODE_MCRYPT) { - if ($this->changed) { - $this->_setupMcrypt(); - $this->changed = false; - } - if ($this->enchanged) { - mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV); - $this->enchanged = false; - } - - // re: {@link http://phpseclib.sourceforge.net/cfb-demo.phps} - // using mcrypt's default handing of CFB the above would output two different things. using phpseclib's - // rewritten CFB implementation the above outputs the same thing twice. - if ($this->mode == CRYPT_MODE_CFB && $this->continuousBuffer) { - $block_size = $this->block_size; - $iv = &$this->encryptIV; - $pos = &$this->enbuffer['pos']; - $len = strlen($plaintext); - $ciphertext = ''; - $i = 0; - if ($pos) { - $orig_pos = $pos; - $max = $block_size - $pos; - if ($len >= $max) { - $i = $max; - $len-= $max; - $pos = 0; - } else { - $i = $len; - $pos+= $len; - $len = 0; - } - $ciphertext = substr($iv, $orig_pos) ^ $plaintext; - $iv = substr_replace($iv, $ciphertext, $orig_pos, $i); - $this->enbuffer['enmcrypt_init'] = true; - } - if ($len >= $block_size) { - if ($this->enbuffer['enmcrypt_init'] === false || $len > $this->cfb_init_len) { - if ($this->enbuffer['enmcrypt_init'] === true) { - mcrypt_generic_init($this->enmcrypt, $this->key, $iv); - $this->enbuffer['enmcrypt_init'] = false; - } - $ciphertext.= mcrypt_generic($this->enmcrypt, substr($plaintext, $i, $len - $len % $block_size)); - $iv = substr($ciphertext, -$block_size); - $len%= $block_size; - } else { - while ($len >= $block_size) { - $iv = mcrypt_generic($this->ecb, $iv) ^ substr($plaintext, $i, $block_size); - $ciphertext.= $iv; - $len-= $block_size; - $i+= $block_size; - } - } - } - - if ($len) { - $iv = mcrypt_generic($this->ecb, $iv); - $block = $iv ^ substr($plaintext, -$len); - $iv = substr_replace($iv, $block, 0, $len); - $ciphertext.= $block; - $pos = $len; - } - - return $ciphertext; - } - - if ($this->paddable) { - $plaintext = $this->_pad($plaintext); - } - - $ciphertext = mcrypt_generic($this->enmcrypt, $plaintext); - - if (!$this->continuousBuffer) { - mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV); - } - - return $ciphertext; - } - - if ($this->changed) { - $this->_setup(); - $this->changed = false; - } - if ($this->use_inline_crypt) { - $inline = $this->inline_crypt; - return $inline('encrypt', $this, $plaintext); - } - if ($this->paddable) { - $plaintext = $this->_pad($plaintext); - } - - $buffer = &$this->enbuffer; - $block_size = $this->block_size; - $ciphertext = ''; - switch ($this->mode) { - case CRYPT_MODE_ECB: - for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { - $ciphertext.= $this->_encryptBlock(substr($plaintext, $i, $block_size)); - } - break; - case CRYPT_MODE_CBC: - $xor = $this->encryptIV; - for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { - $block = substr($plaintext, $i, $block_size); - $block = $this->_encryptBlock($block ^ $xor); - $xor = $block; - $ciphertext.= $block; - } - if ($this->continuousBuffer) { - $this->encryptIV = $xor; - } - break; - case CRYPT_MODE_CTR: - $xor = $this->encryptIV; - if (strlen($buffer['encrypted'])) { - for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { - $block = substr($plaintext, $i, $block_size); - if (strlen($block) > strlen($buffer['encrypted'])) { - $buffer['encrypted'].= $this->_encryptBlock($this->_generateXor($xor, $block_size)); - } - $key = $this->_stringShift($buffer['encrypted'], $block_size); - $ciphertext.= $block ^ $key; - } - } else { - for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { - $block = substr($plaintext, $i, $block_size); - $key = $this->_encryptBlock($this->_generateXor($xor, $block_size)); - $ciphertext.= $block ^ $key; - } - } - if ($this->continuousBuffer) { - $this->encryptIV = $xor; - if ($start = strlen($plaintext) % $block_size) { - $buffer['encrypted'] = substr($key, $start) . $buffer['encrypted']; - } - } - break; - case CRYPT_MODE_CFB: - // cfb loosely routines inspired by openssl's: - // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1} - if ($this->continuousBuffer) { - $iv = &$this->encryptIV; - $pos = &$buffer['pos']; - } else { - $iv = $this->encryptIV; - $pos = 0; - } - $len = strlen($plaintext); - $i = 0; - if ($pos) { - $orig_pos = $pos; - $max = $block_size - $pos; - if ($len >= $max) { - $i = $max; - $len-= $max; - $pos = 0; - } else { - $i = $len; - $pos+= $len; - $len = 0; - } - // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize - $ciphertext = substr($iv, $orig_pos) ^ $plaintext; - $iv = substr_replace($iv, $ciphertext, $orig_pos, $i); - } - while ($len >= $block_size) { - $iv = $this->_encryptBlock($iv) ^ substr($plaintext, $i, $block_size); - $ciphertext.= $iv; - $len-= $block_size; - $i+= $block_size; - } - if ($len) { - $iv = $this->_encryptBlock($iv); - $block = $iv ^ substr($plaintext, $i); - $iv = substr_replace($iv, $block, 0, $len); - $ciphertext.= $block; - $pos = $len; - } - break; - case CRYPT_MODE_OFB: - $xor = $this->encryptIV; - if (strlen($buffer['xor'])) { - for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { - $block = substr($plaintext, $i, $block_size); - if (strlen($block) > strlen($buffer['xor'])) { - $xor = $this->_encryptBlock($xor); - $buffer['xor'].= $xor; - } - $key = $this->_stringShift($buffer['xor'], $block_size); - $ciphertext.= $block ^ $key; - } - } else { - for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { - $xor = $this->_encryptBlock($xor); - $ciphertext.= substr($plaintext, $i, $block_size) ^ $xor; - } - $key = $xor; - } - if ($this->continuousBuffer) { - $this->encryptIV = $xor; - if ($start = strlen($plaintext) % $block_size) { - $buffer['xor'] = substr($key, $start) . $buffer['xor']; - } - } - break; - case CRYPT_MODE_STREAM: - $ciphertext = $this->_encryptBlock($plaintext); - break; - } - - return $ciphertext; - } - - /** - * Decrypts a message. - * - * If strlen($ciphertext) is not a multiple of the block size, null bytes will be added to the end of the string until - * it is. - * - * Note: Could, but not must, extend by the child Crypt_* class - * - * @see Crypt_Base::encrypt() - * @access public - * @param String $ciphertext - * @return String $plaintext - */ - function decrypt($ciphertext) - { - if ($this->engine == CRYPT_MODE_MCRYPT) { - $block_size = $this->block_size; - if ($this->changed) { - $this->_setupMcrypt(); - $this->changed = false; - } - if ($this->dechanged) { - mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV); - $this->dechanged = false; - } - - if ($this->mode == CRYPT_MODE_CFB && $this->continuousBuffer) { - $iv = &$this->decryptIV; - $pos = &$this->debuffer['pos']; - $len = strlen($ciphertext); - $plaintext = ''; - $i = 0; - if ($pos) { - $orig_pos = $pos; - $max = $block_size - $pos; - if ($len >= $max) { - $i = $max; - $len-= $max; - $pos = 0; - } else { - $i = $len; - $pos+= $len; - $len = 0; - } - // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize - $plaintext = substr($iv, $orig_pos) ^ $ciphertext; - $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i); - } - if ($len >= $block_size) { - $cb = substr($ciphertext, $i, $len - $len % $block_size); - $plaintext.= mcrypt_generic($this->ecb, $iv . $cb) ^ $cb; - $iv = substr($cb, -$block_size); - $len%= $block_size; - } - if ($len) { - $iv = mcrypt_generic($this->ecb, $iv); - $plaintext.= $iv ^ substr($ciphertext, -$len); - $iv = substr_replace($iv, substr($ciphertext, -$len), 0, $len); - $pos = $len; - } - - return $plaintext; - } - - if ($this->paddable) { - // we pad with chr(0) since that's what mcrypt_generic does. to quote from {@link http://www.php.net/function.mcrypt-generic}: - // "The data is padded with "\0" to make sure the length of the data is n * blocksize." - $ciphertext = str_pad($ciphertext, strlen($ciphertext) + ($block_size - strlen($ciphertext) % $block_size) % $block_size, chr(0)); - } - - $plaintext = mdecrypt_generic($this->demcrypt, $ciphertext); - - if (!$this->continuousBuffer) { - mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV); - } - - return $this->paddable ? $this->_unpad($plaintext) : $plaintext; - } - - if ($this->changed) { - $this->_setup(); - $this->changed = false; - } - if ($this->use_inline_crypt) { - $inline = $this->inline_crypt; - return $inline('decrypt', $this, $ciphertext); - } - - $block_size = $this->block_size; - if ($this->paddable) { - // we pad with chr(0) since that's what mcrypt_generic does [...] - $ciphertext = str_pad($ciphertext, strlen($ciphertext) + ($block_size - strlen($ciphertext) % $block_size) % $block_size, chr(0)); - } - - $buffer = &$this->debuffer; - $plaintext = ''; - switch ($this->mode) { - case CRYPT_MODE_ECB: - for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { - $plaintext.= $this->_decryptBlock(substr($ciphertext, $i, $block_size)); - } - break; - case CRYPT_MODE_CBC: - $xor = $this->decryptIV; - for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { - $block = substr($ciphertext, $i, $block_size); - $plaintext.= $this->_decryptBlock($block) ^ $xor; - $xor = $block; - } - if ($this->continuousBuffer) { - $this->decryptIV = $xor; - } - break; - case CRYPT_MODE_CTR: - $xor = $this->decryptIV; - if (strlen($buffer['ciphertext'])) { - for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { - $block = substr($ciphertext, $i, $block_size); - if (strlen($block) > strlen($buffer['ciphertext'])) { - $buffer['ciphertext'].= $this->_encryptBlock($this->_generateXor($xor, $block_size)); - } - $key = $this->_stringShift($buffer['ciphertext'], $block_size); - $plaintext.= $block ^ $key; - } - } else { - for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { - $block = substr($ciphertext, $i, $block_size); - $key = $this->_encryptBlock($this->_generateXor($xor, $block_size)); - $plaintext.= $block ^ $key; - } - } - if ($this->continuousBuffer) { - $this->decryptIV = $xor; - if ($start = strlen($ciphertext) % $block_size) { - $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext']; - } - } - break; - case CRYPT_MODE_CFB: - if ($this->continuousBuffer) { - $iv = &$this->decryptIV; - $pos = &$buffer['pos']; - } else { - $iv = $this->decryptIV; - $pos = 0; - } - $len = strlen($ciphertext); - $i = 0; - if ($pos) { - $orig_pos = $pos; - $max = $block_size - $pos; - if ($len >= $max) { - $i = $max; - $len-= $max; - $pos = 0; - } else { - $i = $len; - $pos+= $len; - $len = 0; - } - // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize - $plaintext = substr($iv, $orig_pos) ^ $ciphertext; - $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i); - } - while ($len >= $block_size) { - $iv = $this->_encryptBlock($iv); - $cb = substr($ciphertext, $i, $block_size); - $plaintext.= $iv ^ $cb; - $iv = $cb; - $len-= $block_size; - $i+= $block_size; - } - if ($len) { - $iv = $this->_encryptBlock($iv); - $plaintext.= $iv ^ substr($ciphertext, $i); - $iv = substr_replace($iv, substr($ciphertext, $i), 0, $len); - $pos = $len; - } - break; - case CRYPT_MODE_OFB: - $xor = $this->decryptIV; - if (strlen($buffer['xor'])) { - for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { - $block = substr($ciphertext, $i, $block_size); - if (strlen($block) > strlen($buffer['xor'])) { - $xor = $this->_encryptBlock($xor); - $buffer['xor'].= $xor; - } - $key = $this->_stringShift($buffer['xor'], $block_size); - $plaintext.= $block ^ $key; - } - } else { - for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { - $xor = $this->_encryptBlock($xor); - $plaintext.= substr($ciphertext, $i, $block_size) ^ $xor; - } - $key = $xor; - } - if ($this->continuousBuffer) { - $this->decryptIV = $xor; - if ($start = strlen($ciphertext) % $block_size) { - $buffer['xor'] = substr($key, $start) . $buffer['xor']; - } - } - break; - case CRYPT_MODE_STREAM: - $plaintext = $this->_decryptBlock($ciphertext); - break; - } - return $this->paddable ? $this->_unpad($plaintext) : $plaintext; - } - - /** - * Pad "packets". - * - * Block ciphers working by encrypting between their specified [$this->]block_size at a time - * If you ever need to encrypt or decrypt something that isn't of the proper length, it becomes necessary to - * pad the input so that it is of the proper length. - * - * Padding is enabled by default. Sometimes, however, it is undesirable to pad strings. Such is the case in SSH, - * where "packets" are padded with random bytes before being encrypted. Unpad these packets and you risk stripping - * away characters that shouldn't be stripped away. (SSH knows how many bytes are added because the length is - * transmitted separately) - * - * @see Crypt_Base::disablePadding() - * @access public - */ - function enablePadding() - { - $this->padding = true; - } - - /** - * Do not pad packets. - * - * @see Crypt_Base::enablePadding() - * @access public - */ - function disablePadding() - { - $this->padding = false; - } - - /** - * Treat consecutive "packets" as if they are a continuous buffer. - * - * Say you have a 32-byte plaintext $plaintext. Using the default behavior, the two following code snippets - * will yield different outputs: - * - * - * echo $rijndael->encrypt(substr($plaintext, 0, 16)); - * echo $rijndael->encrypt(substr($plaintext, 16, 16)); - * - * - * echo $rijndael->encrypt($plaintext); - * - * - * The solution is to enable the continuous buffer. Although this will resolve the above discrepancy, it creates - * another, as demonstrated with the following: - * - * - * $rijndael->encrypt(substr($plaintext, 0, 16)); - * echo $rijndael->decrypt($rijndael->encrypt(substr($plaintext, 16, 16))); - * - * - * echo $rijndael->decrypt($rijndael->encrypt(substr($plaintext, 16, 16))); - * - * - * With the continuous buffer disabled, these would yield the same output. With it enabled, they yield different - * outputs. The reason is due to the fact that the initialization vector's change after every encryption / - * decryption round when the continuous buffer is enabled. When it's disabled, they remain constant. - * - * Put another way, when the continuous buffer is enabled, the state of the Crypt_*() object changes after each - * encryption / decryption round, whereas otherwise, it'd remain constant. For this reason, it's recommended that - * continuous buffers not be used. They do offer better security and are, in fact, sometimes required (SSH uses them), - * however, they are also less intuitive and more likely to cause you problems. - * - * Note: Could, but not must, extend by the child Crypt_* class - * - * @see Crypt_Base::disableContinuousBuffer() - * @access public - */ - function enableContinuousBuffer() - { - if ($this->mode == CRYPT_MODE_ECB) { - return; - } - - $this->continuousBuffer = true; - } - - /** - * Treat consecutive packets as if they are a discontinuous buffer. - * - * The default behavior. - * - * Note: Could, but not must, extend by the child Crypt_* class - * - * @see Crypt_Base::enableContinuousBuffer() - * @access public - */ - function disableContinuousBuffer() - { - if ($this->mode == CRYPT_MODE_ECB) { - return; - } - if (!$this->continuousBuffer) { - return; - } - - $this->continuousBuffer = false; - $this->changed = true; - } - - /** - * Encrypts a block - * - * Note: Must extend by the child Crypt_* class - * - * @access private - * @param String $in - * @return String - */ - function _encryptBlock($in) - { - user_error((version_compare(PHP_VERSION, '5.0.0', '>=') ? __METHOD__ : __FUNCTION__) . '() must extend by class ' . get_class($this), E_USER_ERROR); - } - - /** - * Decrypts a block - * - * Note: Must extend by the child Crypt_* class - * - * @access private - * @param String $in - * @return String - */ - function _decryptBlock($in) - { - user_error((version_compare(PHP_VERSION, '5.0.0', '>=') ? __METHOD__ : __FUNCTION__) . '() must extend by class ' . get_class($this), E_USER_ERROR); - } - - /** - * Setup the key (expansion) - * - * Only used if $engine == CRYPT_MODE_INTERNAL - * - * Note: Must extend by the child Crypt_* class - * - * @see Crypt_Base::_setup() - * @access private - */ - function _setupKey() - { - user_error((version_compare(PHP_VERSION, '5.0.0', '>=') ? __METHOD__ : __FUNCTION__) . '() must extend by class ' . get_class($this), E_USER_ERROR); - } - - /** - * Setup the CRYPT_MODE_INTERNAL $engine - * - * (re)init, if necessary, the internal cipher $engine and flush all $buffers - * Used (only) if $engine == CRYPT_MODE_INTERNAL - * - * _setup() will be called each time if $changed === true - * typically this happens when using one or more of following public methods: - * - * - setKey() - * - * - setIV() - * - * - disableContinuousBuffer() - * - * - First run of encrypt() / decrypt() with no init-settings - * - * Internally: _setup() is called always before(!) en/decryption. - * - * Note: Could, but not must, extend by the child Crypt_* class - * - * @see setKey() - * @see setIV() - * @see disableContinuousBuffer() - * @access private - */ - function _setup() - { - $this->_clearBuffers(); - $this->_setupKey(); - - if ($this->use_inline_crypt) { - $this->_setupInlineCrypt(); - } - } - - /** - * Setup the CRYPT_MODE_MCRYPT $engine - * - * (re)init, if necessary, the (ext)mcrypt resources and flush all $buffers - * Used (only) if $engine = CRYPT_MODE_MCRYPT - * - * _setupMcrypt() will be called each time if $changed === true - * typically this happens when using one or more of following public methods: - * - * - setKey() - * - * - setIV() - * - * - disableContinuousBuffer() - * - * - First run of encrypt() / decrypt() - * - * - * Note: Could, but not must, extend by the child Crypt_* class - * - * @see setKey() - * @see setIV() - * @see disableContinuousBuffer() - * @access private - */ - function _setupMcrypt() - { - $this->_clearBuffers(); - $this->enchanged = $this->dechanged = true; - - if (!isset($this->enmcrypt)) { - static $mcrypt_modes = array( - CRYPT_MODE_CTR => 'ctr', - CRYPT_MODE_ECB => MCRYPT_MODE_ECB, - CRYPT_MODE_CBC => MCRYPT_MODE_CBC, - CRYPT_MODE_CFB => 'ncfb', - CRYPT_MODE_OFB => MCRYPT_MODE_NOFB, - CRYPT_MODE_STREAM => MCRYPT_MODE_STREAM, - ); - - $this->demcrypt = mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], ''); - $this->enmcrypt = mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], ''); - - // we need the $ecb mcrypt resource (only) in MODE_CFB with enableContinuousBuffer() - // to workaround mcrypt's broken ncfb implementation in buffered mode - // see: {@link http://phpseclib.sourceforge.net/cfb-demo.phps} - if ($this->mode == CRYPT_MODE_CFB) { - $this->ecb = mcrypt_module_open($this->cipher_name_mcrypt, '', MCRYPT_MODE_ECB, ''); - } - - } // else should mcrypt_generic_deinit be called? - - if ($this->mode == CRYPT_MODE_CFB) { - mcrypt_generic_init($this->ecb, $this->key, str_repeat("\0", $this->block_size)); - } - } - - /** - * Pads a string - * - * Pads a string using the RSA PKCS padding standards so that its length is a multiple of the blocksize. - * $this->block_size - (strlen($text) % $this->block_size) bytes are added, each of which is equal to - * chr($this->block_size - (strlen($text) % $this->block_size) - * - * If padding is disabled and $text is not a multiple of the blocksize, the string will be padded regardless - * and padding will, hence forth, be enabled. - * - * @see Crypt_Base::_unpad() - * @param String $text - * @access private - * @return String - */ - function _pad($text) - { - $length = strlen($text); - - if (!$this->padding) { - if ($length % $this->block_size == 0) { - return $text; - } else { - user_error("The plaintext's length ($length) is not a multiple of the block size ({$this->block_size})"); - $this->padding = true; - } - } - - $pad = $this->block_size - ($length % $this->block_size); - - return str_pad($text, $length + $pad, chr($pad)); - } - - /** - * Unpads a string. - * - * If padding is enabled and the reported padding length is invalid the encryption key will be assumed to be wrong - * and false will be returned. - * - * @see Crypt_Base::_pad() - * @param String $text - * @access private - * @return String - */ - function _unpad($text) - { - if (!$this->padding) { - return $text; - } - - $length = ord($text[strlen($text) - 1]); - - if (!$length || $length > $this->block_size) { - return false; - } - - return substr($text, 0, -$length); - } - - /** - * Clears internal buffers - * - * Clearing/resetting the internal buffers is done everytime - * after disableContinuousBuffer() or on cipher $engine (re)init - * ie after setKey() or setIV() - * - * Note: Could, but not must, extend by the child Crypt_* class - * - * @access public - */ - function _clearBuffers() - { - $this->enbuffer = array('encrypted' => '', 'xor' => '', 'pos' => 0, 'enmcrypt_init' => true); - $this->debuffer = array('ciphertext' => '', 'xor' => '', 'pos' => 0, 'demcrypt_init' => true); - - // mcrypt's handling of invalid's $iv: - // $this->encryptIV = $this->decryptIV = strlen($this->iv) == $this->block_size ? $this->iv : str_repeat("\0", $this->block_size); - $this->encryptIV = $this->decryptIV = str_pad(substr($this->iv, 0, $this->block_size), $this->block_size, "\0"); - } - - /** - * String Shift - * - * Inspired by array_shift - * - * @param String $string - * @param optional Integer $index - * @access private - * @return String - */ - function _stringShift(&$string, $index = 1) - { - $substr = substr($string, 0, $index); - $string = substr($string, $index); - return $substr; - } - - /** - * Generate CTR XOR encryption key - * - * Encrypt the output of this and XOR it against the ciphertext / plaintext to get the - * plaintext / ciphertext in CTR mode. - * - * @see Crypt_Base::decrypt() - * @see Crypt_Base::encrypt() - * @param String $iv - * @param Integer $length - * @access private - * @return String $xor - */ - function _generateXor(&$iv, $length) - { - $xor = ''; - $block_size = $this->block_size; - $num_blocks = floor(($length + ($block_size - 1)) / $block_size); - for ($i = 0; $i < $num_blocks; $i++) { - $xor.= $iv; - for ($j = 4; $j <= $block_size; $j+= 4) { - $temp = substr($iv, -$j, 4); - switch ($temp) { - case "\xFF\xFF\xFF\xFF": - $iv = substr_replace($iv, "\x00\x00\x00\x00", -$j, 4); - break; - case "\x7F\xFF\xFF\xFF": - $iv = substr_replace($iv, "\x80\x00\x00\x00", -$j, 4); - break 2; - default: - extract(unpack('Ncount', $temp)); - $iv = substr_replace($iv, pack('N', $count + 1), -$j, 4); - break 2; - } - } - } - - return $xor; - } - - /** - * Setup the performance-optimized function for de/encrypt() - * - * Stores the created (or existing) callback function-name - * in $this->inline_crypt - * - * Internally for phpseclib developers: - * - * _setupInlineCrypt() would be called only if: - * - * - $engine == CRYPT_MODE_INTERNAL and - * - * - $use_inline_crypt === true - * - * - each time on _setup(), after(!) _setupKey() - * - * - * This ensures that _setupInlineCrypt() has always a - * full ready2go initializated internal cipher $engine state - * where, for example, the keys allready expanded, - * keys/block_size calculated and such. - * - * It is, each time if called, the responsibility of _setupInlineCrypt(): - * - * - to set $this->inline_crypt to a valid and fully working callback function - * as a (faster) replacement for encrypt() / decrypt() - * - * - NOT to create unlimited callback functions (for memory reasons!) - * no matter how often _setupInlineCrypt() would be called. At some - * point of amount they must be generic re-useable. - * - * - the code of _setupInlineCrypt() it self, - * and the generated callback code, - * must be, in following order: - * - 100% safe - * - 100% compatible to encrypt()/decrypt() - * - using only php5+ features/lang-constructs/php-extensions if - * compatibility (down to php4) or fallback is provided - * - readable/maintainable/understandable/commented and... not-cryptic-styled-code :-) - * - >= 10% faster than encrypt()/decrypt() [which is, by the way, - * the reason for the existence of _setupInlineCrypt() :-)] - * - memory-nice - * - short (as good as possible) - * - * Note: - _setupInlineCrypt() is using _createInlineCryptFunction() to create the full callback function code. - * - In case of using inline crypting, _setupInlineCrypt() must extend by the child Crypt_* class. - * - The following variable names are reserved: - * - $_* (all variable names prefixed with an underscore) - * - $self (object reference to it self. Do not use $this, but $self instead) - * - $in (the content of $in has to en/decrypt by the generated code) - * - The callback function should not use the 'return' statement, but en/decrypt'ing the content of $in only - * - * - * @see Crypt_Base::_setup() - * @see Crypt_Base::_createInlineCryptFunction() - * @see Crypt_Base::encrypt() - * @see Crypt_Base::decrypt() - * @access private - */ - function _setupInlineCrypt() - { - // If a Crypt_* class providing inline crypting it must extend _setupInlineCrypt() - - // If, for any reason, an extending Crypt_Base() Crypt_* class - // not using inline crypting then it must be ensured that: $this->use_inline_crypt = false - // ie in the class var declaration of $use_inline_crypt in general for the Crypt_* class, - // in the constructor at object instance-time - // or, if it's runtime-specific, at runtime - - $this->use_inline_crypt = false; - } - - /** - * Creates the performance-optimized function for en/decrypt() - * - * Internally for phpseclib developers: - * - * _createInlineCryptFunction(): - * - * - merge the $cipher_code [setup'ed by _setupInlineCrypt()] - * with the current [$this->]mode of operation code - * - * - create the $inline function, which called by encrypt() / decrypt() - * as its replacement to speed up the en/decryption operations. - * - * - return the name of the created $inline callback function - * - * - used to speed up en/decryption - * - * - * - * The main reason why can speed up things [up to 50%] this way are: - * - * - using variables more effective then regular. - * (ie no use of expensive arrays but integers $k_0, $k_1 ... - * or even, for example, the pure $key[] values hardcoded) - * - * - avoiding 1000's of function calls of ie _encryptBlock() - * but inlining the crypt operations. - * in the mode of operation for() loop. - * - * - full loop unroll the (sometimes key-dependent) rounds - * avoiding this way ++$i counters and runtime-if's etc... - * - * The basic code architectur of the generated $inline en/decrypt() - * lambda function, in pseudo php, is: - * - * - * +----------------------------------------------------------------------------------------------+ - * | callback $inline = create_function: | - * | lambda_function_0001_crypt_ECB($action, $text) | - * | { | - * | INSERT PHP CODE OF: | - * | $cipher_code['init_crypt']; // general init code. | - * | // ie: $sbox'es declarations used for | - * | // encrypt and decrypt'ing. | - * | | - * | switch ($action) { | - * | case 'encrypt': | - * | INSERT PHP CODE OF: | - * | $cipher_code['init_encrypt']; // encrypt sepcific init code. | - * | ie: specified $key or $box | - * | declarations for encrypt'ing. | - * | | - * | foreach ($ciphertext) { | - * | $in = $block_size of $ciphertext; | - * | | - * | INSERT PHP CODE OF: | - * | $cipher_code['encrypt_block']; // encrypt's (string) $in, which is always: | - * | // strlen($in) == $this->block_size | - * | // here comes the cipher algorithm in action | - * | // for encryption. | - * | // $cipher_code['encrypt_block'] has to | - * | // encrypt the content of the $in variable | - * | | - * | $plaintext .= $in; | - * | } | - * | return $plaintext; | - * | | - * | case 'decrypt': | - * | INSERT PHP CODE OF: | - * | $cipher_code['init_decrypt']; // decrypt sepcific init code | - * | ie: specified $key or $box | - * | declarations for decrypt'ing. | - * | foreach ($plaintext) { | - * | $in = $block_size of $plaintext; | - * | | - * | INSERT PHP CODE OF: | - * | $cipher_code['decrypt_block']; // decrypt's (string) $in, which is always | - * | // strlen($in) == $this->block_size | - * | // here comes the cipher algorithm in action | - * | // for decryption. | - * | // $cipher_code['decrypt_block'] has to | - * | // decrypt the content of the $in variable | - * | $ciphertext .= $in; | - * | } | - * | return $ciphertext; | - * | } | - * | } | - * +----------------------------------------------------------------------------------------------+ - * - * - * See also the Crypt_*::_setupInlineCrypt()'s for - * productive inline $cipher_code's how they works. - * - * Structure of: - * - * $cipher_code = array( - * 'init_crypt' => (string) '', // optional - * 'init_encrypt' => (string) '', // optional - * 'init_decrypt' => (string) '', // optional - * 'encrypt_block' => (string) '', // required - * 'decrypt_block' => (string) '' // required - * ); - * - * - * @see Crypt_Base::_setupInlineCrypt() - * @see Crypt_Base::encrypt() - * @see Crypt_Base::decrypt() - * @param Array $cipher_code - * @access private - * @return String (the name of the created callback function) - */ - function _createInlineCryptFunction($cipher_code) - { - $block_size = $this->block_size; - - // optional - $init_crypt = isset($cipher_code['init_crypt']) ? $cipher_code['init_crypt'] : ''; - $init_encrypt = isset($cipher_code['init_encrypt']) ? $cipher_code['init_encrypt'] : ''; - $init_decrypt = isset($cipher_code['init_decrypt']) ? $cipher_code['init_decrypt'] : ''; - // required - $encrypt_block = $cipher_code['encrypt_block']; - $decrypt_block = $cipher_code['decrypt_block']; - - // Generating mode of operation inline code, - // merged with the $cipher_code algorithm - // for encrypt- and decryption. - switch ($this->mode) { - case CRYPT_MODE_ECB: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_text = $self->_pad($_text); - $_plaintext_len = strlen($_text); - - for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { - $in = substr($_text, $_i, '.$block_size.'); - '.$encrypt_block.' - $_ciphertext.= $in; - } - - return $_ciphertext; - '; - - $decrypt = $init_decrypt . ' - $_plaintext = ""; - $_text = str_pad($_text, strlen($_text) + ('.$block_size.' - strlen($_text) % '.$block_size.') % '.$block_size.', chr(0)); - $_ciphertext_len = strlen($_text); - - for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { - $in = substr($_text, $_i, '.$block_size.'); - '.$decrypt_block.' - $_plaintext.= $in; - } - - return $self->_unpad($_plaintext); - '; - break; - case CRYPT_MODE_CTR: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_plaintext_len = strlen($_text); - $_xor = $self->encryptIV; - $_buffer = &$self->enbuffer; - - if (strlen($_buffer["encrypted"])) { - for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { - $_block = substr($_text, $_i, '.$block_size.'); - if (strlen($_block) > strlen($_buffer["encrypted"])) { - $in = $self->_generateXor($_xor, '.$block_size.'); - '.$encrypt_block.' - $_buffer["encrypted"].= $in; - } - $_key = $self->_stringShift($_buffer["encrypted"], '.$block_size.'); - $_ciphertext.= $_block ^ $_key; - } - } else { - for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { - $_block = substr($_text, $_i, '.$block_size.'); - $in = $self->_generateXor($_xor, '.$block_size.'); - '.$encrypt_block.' - $_key = $in; - $_ciphertext.= $_block ^ $_key; - } - } - if ($self->continuousBuffer) { - $self->encryptIV = $_xor; - if ($_start = $_plaintext_len % '.$block_size.') { - $_buffer["encrypted"] = substr($_key, $_start) . $_buffer["encrypted"]; - } - } - - return $_ciphertext; - '; - - $decrypt = $init_encrypt . ' - $_plaintext = ""; - $_ciphertext_len = strlen($_text); - $_xor = $self->decryptIV; - $_buffer = &$self->debuffer; - - if (strlen($_buffer["ciphertext"])) { - for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { - $_block = substr($_text, $_i, '.$block_size.'); - if (strlen($_block) > strlen($_buffer["ciphertext"])) { - $in = $self->_generateXor($_xor, '.$block_size.'); - '.$encrypt_block.' - $_buffer["ciphertext"].= $in; - } - $_key = $self->_stringShift($_buffer["ciphertext"], '.$block_size.'); - $_plaintext.= $_block ^ $_key; - } - } else { - for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { - $_block = substr($_text, $_i, '.$block_size.'); - $in = $self->_generateXor($_xor, '.$block_size.'); - '.$encrypt_block.' - $_key = $in; - $_plaintext.= $_block ^ $_key; - } - } - if ($self->continuousBuffer) { - $self->decryptIV = $_xor; - if ($_start = $_ciphertext_len % '.$block_size.') { - $_buffer["ciphertext"] = substr($_key, $_start) . $_buffer["ciphertext"]; - } - } - - return $_plaintext; - '; - break; - case CRYPT_MODE_CFB: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_buffer = &$self->enbuffer; - - if ($self->continuousBuffer) { - $_iv = &$self->encryptIV; - $_pos = &$_buffer["pos"]; - } else { - $_iv = $self->encryptIV; - $_pos = 0; - } - $_len = strlen($_text); - $_i = 0; - if ($_pos) { - $_orig_pos = $_pos; - $_max = '.$block_size.' - $_pos; - if ($_len >= $_max) { - $_i = $_max; - $_len-= $_max; - $_pos = 0; - } else { - $_i = $_len; - $_pos+= $_len; - $_len = 0; - } - $_ciphertext = substr($_iv, $_orig_pos) ^ $_text; - $_iv = substr_replace($_iv, $_ciphertext, $_orig_pos, $_i); - } - while ($_len >= '.$block_size.') { - $in = $_iv; - '.$encrypt_block.'; - $_iv = $in ^ substr($_text, $_i, '.$block_size.'); - $_ciphertext.= $_iv; - $_len-= '.$block_size.'; - $_i+= '.$block_size.'; - } - if ($_len) { - $in = $_iv; - '.$encrypt_block.' - $_iv = $in; - $_block = $_iv ^ substr($_text, $_i); - $_iv = substr_replace($_iv, $_block, 0, $_len); - $_ciphertext.= $_block; - $_pos = $_len; - } - return $_ciphertext; - '; - - $decrypt = $init_encrypt . ' - $_plaintext = ""; - $_buffer = &$self->debuffer; - - if ($self->continuousBuffer) { - $_iv = &$self->decryptIV; - $_pos = &$_buffer["pos"]; - } else { - $_iv = $self->decryptIV; - $_pos = 0; - } - $_len = strlen($_text); - $_i = 0; - if ($_pos) { - $_orig_pos = $_pos; - $_max = '.$block_size.' - $_pos; - if ($_len >= $_max) { - $_i = $_max; - $_len-= $_max; - $_pos = 0; - } else { - $_i = $_len; - $_pos+= $_len; - $_len = 0; - } - $_plaintext = substr($_iv, $_orig_pos) ^ $_text; - $_iv = substr_replace($_iv, substr($_text, 0, $_i), $_orig_pos, $_i); - } - while ($_len >= '.$block_size.') { - $in = $_iv; - '.$encrypt_block.' - $_iv = $in; - $cb = substr($_text, $_i, '.$block_size.'); - $_plaintext.= $_iv ^ $cb; - $_iv = $cb; - $_len-= '.$block_size.'; - $_i+= '.$block_size.'; - } - if ($_len) { - $in = $_iv; - '.$encrypt_block.' - $_iv = $in; - $_plaintext.= $_iv ^ substr($_text, $_i); - $_iv = substr_replace($_iv, substr($_text, $_i), 0, $_len); - $_pos = $_len; - } - - return $_plaintext; - '; - break; - case CRYPT_MODE_OFB: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_plaintext_len = strlen($_text); - $_xor = $self->encryptIV; - $_buffer = &$self->enbuffer; - - if (strlen($_buffer["xor"])) { - for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { - $_block = substr($_text, $_i, '.$block_size.'); - if (strlen($_block) > strlen($_buffer["xor"])) { - $in = $_xor; - '.$encrypt_block.' - $_xor = $in; - $_buffer["xor"].= $_xor; - } - $_key = $self->_stringShift($_buffer["xor"], '.$block_size.'); - $_ciphertext.= $_block ^ $_key; - } - } else { - for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { - $in = $_xor; - '.$encrypt_block.' - $_xor = $in; - $_ciphertext.= substr($_text, $_i, '.$block_size.') ^ $_xor; - } - $_key = $_xor; - } - if ($self->continuousBuffer) { - $self->encryptIV = $_xor; - if ($_start = $_plaintext_len % '.$block_size.') { - $_buffer["xor"] = substr($_key, $_start) . $_buffer["xor"]; - } - } - return $_ciphertext; - '; - - $decrypt = $init_encrypt . ' - $_plaintext = ""; - $_ciphertext_len = strlen($_text); - $_xor = $self->decryptIV; - $_buffer = &$self->debuffer; - - if (strlen($_buffer["xor"])) { - for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { - $_block = substr($_text, $_i, '.$block_size.'); - if (strlen($_block) > strlen($_buffer["xor"])) { - $in = $_xor; - '.$encrypt_block.' - $_xor = $in; - $_buffer["xor"].= $_xor; - } - $_key = $self->_stringShift($_buffer["xor"], '.$block_size.'); - $_plaintext.= $_block ^ $_key; - } - } else { - for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { - $in = $_xor; - '.$encrypt_block.' - $_xor = $in; - $_plaintext.= substr($_text, $_i, '.$block_size.') ^ $_xor; - } - $_key = $_xor; - } - if ($self->continuousBuffer) { - $self->decryptIV = $_xor; - if ($_start = $_ciphertext_len % '.$block_size.') { - $_buffer["xor"] = substr($_key, $_start) . $_buffer["xor"]; - } - } - return $_plaintext; - '; - break; - case CRYPT_MODE_STREAM: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - '.$encrypt_block.' - return $_ciphertext; - '; - $decrypt = $init_decrypt . ' - $_plaintext = ""; - '.$decrypt_block.' - return $_plaintext; - '; - break; - // case CRYPT_MODE_CBC: - default: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_text = $self->_pad($_text); - $_plaintext_len = strlen($_text); - - $in = $self->encryptIV; - - for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { - $in = substr($_text, $_i, '.$block_size.') ^ $in; - '.$encrypt_block.' - $_ciphertext.= $in; - } - - if ($self->continuousBuffer) { - $self->encryptIV = $in; - } - - return $_ciphertext; - '; - - $decrypt = $init_decrypt . ' - $_plaintext = ""; - $_text = str_pad($_text, strlen($_text) + ('.$block_size.' - strlen($_text) % '.$block_size.') % '.$block_size.', chr(0)); - $_ciphertext_len = strlen($_text); - - $_iv = $self->decryptIV; - - for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { - $in = $_block = substr($_text, $_i, '.$block_size.'); - '.$decrypt_block.' - $_plaintext.= $in ^ $_iv; - $_iv = $_block; - } - - if ($self->continuousBuffer) { - $self->decryptIV = $_iv; - } - - return $self->_unpad($_plaintext); - '; - break; - } - - // Create the $inline function and return its name as string. Ready to run! - return create_function('$_action, &$self, $_text', $init_crypt . 'if ($_action == "encrypt") { ' . $encrypt . ' } else { ' . $decrypt . ' }'); - } - - /** - * Holds the lambda_functions table (classwide) - * - * Each name of the lambda function, created from - * _setupInlineCrypt() && _createInlineCryptFunction() - * is stored, classwide (!), here for reusing. - * - * The string-based index of $function is a classwide - * uniqe value representing, at least, the $mode of - * operation (or more... depends of the optimizing level) - * for which $mode the lambda function was created. - * - * @access private - * @return &Array - */ - function &_getLambdaFunctions() - { - static $functions = array(); - return $functions; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Blowfish.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Blowfish.php deleted file mode 100755 index f39f17d7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Blowfish.php +++ /dev/null @@ -1,644 +0,0 @@ - - * setKey('12345678901234567890123456789012'); - * - * $plaintext = str_repeat('a', 1024); - * - * echo $blowfish->decrypt($blowfish->encrypt($plaintext)); - * ?> - * - * - * LICENSE: 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. - * - * @category Crypt - * @package Crypt_Blowfish - * @author Jim Wigginton - * @author Hans-Juergen Petrich - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include Crypt_Base - * - * Base cipher class - */ -if (!class_exists('Crypt_Base')) { - include_once 'Base.php'; -} - -/**#@+ - * @access public - * @see Crypt_Blowfish::encrypt() - * @see Crypt_Blowfish::decrypt() - */ -/** - * Encrypt / decrypt using the Counter mode. - * - * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 - */ -define('CRYPT_BLOWFISH_MODE_CTR', CRYPT_MODE_CTR); -/** - * Encrypt / decrypt using the Electronic Code Book mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 - */ -define('CRYPT_BLOWFISH_MODE_ECB', CRYPT_MODE_ECB); -/** - * Encrypt / decrypt using the Code Book Chaining mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 - */ -define('CRYPT_BLOWFISH_MODE_CBC', CRYPT_MODE_CBC); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 - */ -define('CRYPT_BLOWFISH_MODE_CFB', CRYPT_MODE_CFB); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 - */ -define('CRYPT_BLOWFISH_MODE_OFB', CRYPT_MODE_OFB); -/**#@-*/ - -/**#@+ - * @access private - * @see Crypt_Base::Crypt_Base() - */ -/** - * Toggles the internal implementation - */ -define('CRYPT_BLOWFISH_MODE_INTERNAL', CRYPT_MODE_INTERNAL); -/** - * Toggles the mcrypt implementation - */ -define('CRYPT_BLOWFISH_MODE_MCRYPT', CRYPT_MODE_MCRYPT); -/**#@-*/ - -/** - * Pure-PHP implementation of Blowfish. - * - * @package Crypt_Blowfish - * @author Jim Wigginton - * @author Hans-Juergen Petrich - * @access public - */ -class Crypt_Blowfish extends Crypt_Base -{ - /** - * Block Length of the cipher - * - * @see Crypt_Base::block_size - * @var Integer - * @access private - */ - var $block_size = 8; - - /** - * The default password key_size used by setPassword() - * - * @see Crypt_Base::password_key_size - * @see Crypt_Base::setPassword() - * @var Integer - * @access private - */ - var $password_key_size = 56; - - /** - * The namespace used by the cipher for its constants. - * - * @see Crypt_Base::const_namespace - * @var String - * @access private - */ - var $const_namespace = 'BLOWFISH'; - - /** - * The mcrypt specific name of the cipher - * - * @see Crypt_Base::cipher_name_mcrypt - * @var String - * @access private - */ - var $cipher_name_mcrypt = 'blowfish'; - - /** - * Optimizing value while CFB-encrypting - * - * @see Crypt_Base::cfb_init_len - * @var Integer - * @access private - */ - var $cfb_init_len = 500; - - /** - * The fixed subkeys boxes ($sbox0 - $sbox3) with 256 entries each - * - * S-Box 1 - * - * @access private - * @var array - */ - var $sbox0 = array ( - 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, - 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, - 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, - 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, - 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, - 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, - 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, - 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, - 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, - 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, - 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, - 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, - 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, - 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, - 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, - 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, - 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, - 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, - 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, - 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, - 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, - 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, - 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, - 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, - 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, - 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, - 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, - 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, - 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, - 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, - 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, - 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a - ); - - /** - * S-Box 1 - * - * @access private - * @var array - */ - var $sbox1 = array( - 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, - 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, - 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, - 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, - 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, - 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, - 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, - 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, - 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, - 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, - 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, - 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, - 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, - 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, - 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, - 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, - 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, - 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, - 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, - 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, - 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, - 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, - 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, - 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, - 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, - 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, - 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, - 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, - 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, - 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, - 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, - 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 - ); - - /** - * S-Box 2 - * - * @access private - * @var array - */ - var $sbox2 = array( - 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, - 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, - 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, - 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, - 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, - 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, - 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, - 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, - 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, - 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, - 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, - 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, - 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, - 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, - 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, - 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, - 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, - 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, - 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, - 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, - 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, - 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, - 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, - 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, - 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, - 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, - 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, - 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, - 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, - 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, - 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, - 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 - ); - - /** - * S-Box 3 - * - * @access private - * @var array - */ - var $sbox3 = array( - 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, - 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, - 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, - 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, - 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, - 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, - 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, - 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, - 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, - 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, - 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, - 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, - 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, - 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, - 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, - 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, - 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, - 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, - 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, - 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, - 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, - 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, - 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, - 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, - 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, - 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, - 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, - 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, - 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, - 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, - 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, - 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 - ); - - /** - * P-Array consists of 18 32-bit subkeys - * - * @var array $parray - * @access private - */ - var $parray = array( - 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, - 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, - 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b - ); - - /** - * The BCTX-working Array - * - * Holds the expanded key [p] and the key-depended s-boxes [sb] - * - * @var array $bctx - * @access private - */ - var $bctx; - - /** - * Holds the last used key - * - * @var Array - * @access private - */ - var $kl; - - /** - * Sets the key. - * - * Keys can be of any length. Blowfish, itself, requires the use of a key between 32 and max. 448-bits long. - * If the key is less than 32-bits we NOT fill the key to 32bit but let the key as it is to be compatible - * with mcrypt because mcrypt act this way with blowfish key's < 32 bits. - * - * If the key is more than 448-bits, we trim the excess bits. - * - * If the key is not explicitly set, or empty, it'll be assumed a 128 bits key to be all null bytes. - * - * @access public - * @see Crypt_Base::setKey() - * @param String $key - */ - function setKey($key) - { - $keylength = strlen($key); - - if (!$keylength) { - $key = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; - } elseif ($keylength > 56) { - $key = substr($key, 0, 56); - } - - parent::setKey($key); - } - - /** - * Setup the key (expansion) - * - * @see Crypt_Base::_setupKey() - * @access private - */ - function _setupKey() - { - if (isset($this->kl['key']) && $this->key === $this->kl['key']) { - // already expanded - return; - } - $this->kl = array('key' => $this->key); - - /* key-expanding p[] and S-Box building sb[] */ - $this->bctx = array( - 'p' => array(), - 'sb' => array( - $this->sbox0, - $this->sbox1, - $this->sbox2, - $this->sbox3 - ) - ); - - // unpack binary string in unsigned chars - $key = array_values(unpack('C*', $this->key)); - $keyl = count($key); - for ($j = 0, $i = 0; $i < 18; ++$i) { - // xor P1 with the first 32-bits of the key, xor P2 with the second 32-bits ... - for ($data = 0, $k = 0; $k < 4; ++$k) { - $data = ($data << 8) | $key[$j]; - if (++$j >= $keyl) { - $j = 0; - } - } - $this->bctx['p'][] = $this->parray[$i] ^ $data; - } - - // encrypt the zero-string, replace P1 and P2 with the encrypted data, - // encrypt P3 and P4 with the new P1 and P2, do it with all P-array and subkeys - $data = "\0\0\0\0\0\0\0\0"; - for ($i = 0; $i < 18; $i += 2) { - list($l, $r) = array_values(unpack('N*', $data = $this->_encryptBlock($data))); - $this->bctx['p'][$i ] = $l; - $this->bctx['p'][$i + 1] = $r; - } - for ($i = 0; $i < 4; ++$i) { - for ($j = 0; $j < 256; $j += 2) { - list($l, $r) = array_values(unpack('N*', $data = $this->_encryptBlock($data))); - $this->bctx['sb'][$i][$j ] = $l; - $this->bctx['sb'][$i][$j + 1] = $r; - } - } - } - - /** - * Encrypts a block - * - * @access private - * @param String $in - * @return String - */ - function _encryptBlock($in) - { - $p = $this->bctx["p"]; - // extract($this->bctx["sb"], EXTR_PREFIX_ALL, "sb"); // slower - $sb_0 = $this->bctx["sb"][0]; - $sb_1 = $this->bctx["sb"][1]; - $sb_2 = $this->bctx["sb"][2]; - $sb_3 = $this->bctx["sb"][3]; - - $in = unpack("N*", $in); - $l = $in[1]; - $r = $in[2]; - - for ($i = 0; $i < 16; $i+= 2) { - $l^= $p[$i]; - $r^= ($sb_0[$l >> 24 & 0xff] + - $sb_1[$l >> 16 & 0xff] ^ - $sb_2[$l >> 8 & 0xff]) + - $sb_3[$l & 0xff]; - - $r^= $p[$i + 1]; - $l^= ($sb_0[$r >> 24 & 0xff] + - $sb_1[$r >> 16 & 0xff] ^ - $sb_2[$r >> 8 & 0xff]) + - $sb_3[$r & 0xff]; - } - return pack("N*", $r ^ $p[17], $l ^ $p[16]); - } - - /** - * Decrypts a block - * - * @access private - * @param String $in - * @return String - */ - function _decryptBlock($in) - { - $p = $this->bctx["p"]; - $sb_0 = $this->bctx["sb"][0]; - $sb_1 = $this->bctx["sb"][1]; - $sb_2 = $this->bctx["sb"][2]; - $sb_3 = $this->bctx["sb"][3]; - - $in = unpack("N*", $in); - $l = $in[1]; - $r = $in[2]; - - for ($i = 17; $i > 2; $i-= 2) { - $l^= $p[$i]; - $r^= ($sb_0[$l >> 24 & 0xff] + - $sb_1[$l >> 16 & 0xff] ^ - $sb_2[$l >> 8 & 0xff]) + - $sb_3[$l & 0xff]; - - $r^= $p[$i - 1]; - $l^= ($sb_0[$r >> 24 & 0xff] + - $sb_1[$r >> 16 & 0xff] ^ - $sb_2[$r >> 8 & 0xff]) + - $sb_3[$r & 0xff]; - } - - return pack("N*", $r ^ $p[0], $l ^ $p[1]); - } - - /** - * Setup the performance-optimized function for de/encrypt() - * - * @see Crypt_Base::_setupInlineCrypt() - * @access private - */ - function _setupInlineCrypt() - { - $lambda_functions =& Crypt_Blowfish::_getLambdaFunctions(); - - // We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function. - // After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one. - $gen_hi_opt_code = (bool)( count($lambda_functions) < 10); - - switch (true) { - case $gen_hi_opt_code: - $code_hash = md5(str_pad("Crypt_Blowfish, {$this->mode}, ", 32, "\0") . $this->key); - break; - default: - $code_hash = "Crypt_Blowfish, {$this->mode}"; - } - - if (!isset($lambda_functions[$code_hash])) { - switch (true) { - case $gen_hi_opt_code: - $p = $this->bctx['p']; - $init_crypt = ' - static $sb_0, $sb_1, $sb_2, $sb_3; - if (!$sb_0) { - $sb_0 = $self->bctx["sb"][0]; - $sb_1 = $self->bctx["sb"][1]; - $sb_2 = $self->bctx["sb"][2]; - $sb_3 = $self->bctx["sb"][3]; - } - '; - break; - default: - $p = array(); - for ($i = 0; $i < 18; ++$i) { - $p[] = '$p_' . $i; - } - $init_crypt = ' - list($sb_0, $sb_1, $sb_2, $sb_3) = $self->bctx["sb"]; - list(' . implode(',', $p) . ') = $self->bctx["p"]; - - '; - } - - // Generating encrypt code: - $encrypt_block = ' - $in = unpack("N*", $in); - $l = $in[1]; - $r = $in[2]; - '; - for ($i = 0; $i < 16; $i+= 2) { - $encrypt_block.= ' - $l^= ' . $p[$i] . '; - $r^= ($sb_0[$l >> 24 & 0xff] + - $sb_1[$l >> 16 & 0xff] ^ - $sb_2[$l >> 8 & 0xff]) + - $sb_3[$l & 0xff]; - - $r^= ' . $p[$i + 1] . '; - $l^= ($sb_0[$r >> 24 & 0xff] + - $sb_1[$r >> 16 & 0xff] ^ - $sb_2[$r >> 8 & 0xff]) + - $sb_3[$r & 0xff]; - '; - } - $encrypt_block.= ' - $in = pack("N*", - $r ^ ' . $p[17] . ', - $l ^ ' . $p[16] . ' - ); - '; - - // Generating decrypt code: - $decrypt_block = ' - $in = unpack("N*", $in); - $l = $in[1]; - $r = $in[2]; - '; - - for ($i = 17; $i > 2; $i-= 2) { - $decrypt_block.= ' - $l^= ' . $p[$i] . '; - $r^= ($sb_0[$l >> 24 & 0xff] + - $sb_1[$l >> 16 & 0xff] ^ - $sb_2[$l >> 8 & 0xff]) + - $sb_3[$l & 0xff]; - - $r^= ' . $p[$i - 1] . '; - $l^= ($sb_0[$r >> 24 & 0xff] + - $sb_1[$r >> 16 & 0xff] ^ - $sb_2[$r >> 8 & 0xff]) + - $sb_3[$r & 0xff]; - '; - } - - $decrypt_block.= ' - $in = pack("N*", - $r ^ ' . $p[0] . ', - $l ^ ' . $p[1] . ' - ); - '; - - $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( - array( - 'init_crypt' => $init_crypt, - 'init_encrypt' => '', - 'init_decrypt' => '', - 'encrypt_block' => $encrypt_block, - 'decrypt_block' => $decrypt_block - ) - ); - } - $this->inline_crypt = $lambda_functions[$code_hash]; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/DES.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/DES.php deleted file mode 100755 index f92f30b2..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/DES.php +++ /dev/null @@ -1,1506 +0,0 @@ - - * setKey('abcdefgh'); - * - * $size = 10 * 1024; - * $plaintext = ''; - * for ($i = 0; $i < $size; $i++) { - * $plaintext.= 'a'; - * } - * - * echo $des->decrypt($des->encrypt($plaintext)); - * ?> - * - * - * LICENSE: 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. - * - * @category Crypt - * @package Crypt_DES - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include Crypt_Base - * - * Base cipher class - */ -if (!class_exists('Crypt_Base')) { - include_once 'Base.php'; -} - -/**#@+ - * @access private - * @see Crypt_DES::_setupKey() - * @see Crypt_DES::_processBlock() - */ -/** - * Contains $keys[CRYPT_DES_ENCRYPT] - */ -define('CRYPT_DES_ENCRYPT', 0); -/** - * Contains $keys[CRYPT_DES_DECRYPT] - */ -define('CRYPT_DES_DECRYPT', 1); -/**#@-*/ - -/**#@+ - * @access public - * @see Crypt_DES::encrypt() - * @see Crypt_DES::decrypt() - */ -/** - * Encrypt / decrypt using the Counter mode. - * - * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 - */ -define('CRYPT_DES_MODE_CTR', CRYPT_MODE_CTR); -/** - * Encrypt / decrypt using the Electronic Code Book mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 - */ -define('CRYPT_DES_MODE_ECB', CRYPT_MODE_ECB); -/** - * Encrypt / decrypt using the Code Book Chaining mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 - */ -define('CRYPT_DES_MODE_CBC', CRYPT_MODE_CBC); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 - */ -define('CRYPT_DES_MODE_CFB', CRYPT_MODE_CFB); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 - */ -define('CRYPT_DES_MODE_OFB', CRYPT_MODE_OFB); -/**#@-*/ - -/**#@+ - * @access private - * @see Crypt_Base::Crypt_Base() - */ -/** - * Toggles the internal implementation - */ -define('CRYPT_DES_MODE_INTERNAL', CRYPT_MODE_INTERNAL); -/** - * Toggles the mcrypt implementation - */ -define('CRYPT_DES_MODE_MCRYPT', CRYPT_MODE_MCRYPT); -/**#@-*/ - -/** - * Pure-PHP implementation of DES. - * - * @package Crypt_DES - * @author Jim Wigginton - * @access public - */ -class Crypt_DES extends Crypt_Base -{ - /** - * Block Length of the cipher - * - * @see Crypt_Base::block_size - * @var Integer - * @access private - */ - var $block_size = 8; - - /** - * The Key - * - * @see Crypt_Base::key - * @see setKey() - * @var String - * @access private - */ - var $key = "\0\0\0\0\0\0\0\0"; - - /** - * The default password key_size used by setPassword() - * - * @see Crypt_Base::password_key_size - * @see Crypt_Base::setPassword() - * @var Integer - * @access private - */ - var $password_key_size = 8; - - /** - * The namespace used by the cipher for its constants. - * - * @see Crypt_Base::const_namespace - * @var String - * @access private - */ - var $const_namespace = 'DES'; - - /** - * The mcrypt specific name of the cipher - * - * @see Crypt_Base::cipher_name_mcrypt - * @var String - * @access private - */ - var $cipher_name_mcrypt = 'des'; - - /** - * Optimizing value while CFB-encrypting - * - * @see Crypt_Base::cfb_init_len - * @var Integer - * @access private - */ - var $cfb_init_len = 500; - - /** - * Switch for DES/3DES encryption - * - * Used only if $engine == CRYPT_DES_MODE_INTERNAL - * - * @see Crypt_DES::_setupKey() - * @see Crypt_DES::_processBlock() - * @var Integer - * @access private - */ - var $des_rounds = 1; - - /** - * max possible size of $key - * - * @see Crypt_DES::setKey() - * @var String - * @access private - */ - var $key_size_max = 8; - - /** - * The Key Schedule - * - * @see Crypt_DES::_setupKey() - * @var Array - * @access private - */ - var $keys; - - /** - * Shuffle table. - * - * For each byte value index, the entry holds an 8-byte string - * with each byte containing all bits in the same state as the - * corresponding bit in the index value. - * - * @see Crypt_DES::_processBlock() - * @see Crypt_DES::_setupKey() - * @var Array - * @access private - */ - var $shuffle = array( - "\x00\x00\x00\x00\x00\x00\x00\x00", "\x00\x00\x00\x00\x00\x00\x00\xFF", - "\x00\x00\x00\x00\x00\x00\xFF\x00", "\x00\x00\x00\x00\x00\x00\xFF\xFF", - "\x00\x00\x00\x00\x00\xFF\x00\x00", "\x00\x00\x00\x00\x00\xFF\x00\xFF", - "\x00\x00\x00\x00\x00\xFF\xFF\x00", "\x00\x00\x00\x00\x00\xFF\xFF\xFF", - "\x00\x00\x00\x00\xFF\x00\x00\x00", "\x00\x00\x00\x00\xFF\x00\x00\xFF", - "\x00\x00\x00\x00\xFF\x00\xFF\x00", "\x00\x00\x00\x00\xFF\x00\xFF\xFF", - "\x00\x00\x00\x00\xFF\xFF\x00\x00", "\x00\x00\x00\x00\xFF\xFF\x00\xFF", - "\x00\x00\x00\x00\xFF\xFF\xFF\x00", "\x00\x00\x00\x00\xFF\xFF\xFF\xFF", - "\x00\x00\x00\xFF\x00\x00\x00\x00", "\x00\x00\x00\xFF\x00\x00\x00\xFF", - "\x00\x00\x00\xFF\x00\x00\xFF\x00", "\x00\x00\x00\xFF\x00\x00\xFF\xFF", - "\x00\x00\x00\xFF\x00\xFF\x00\x00", "\x00\x00\x00\xFF\x00\xFF\x00\xFF", - "\x00\x00\x00\xFF\x00\xFF\xFF\x00", "\x00\x00\x00\xFF\x00\xFF\xFF\xFF", - "\x00\x00\x00\xFF\xFF\x00\x00\x00", "\x00\x00\x00\xFF\xFF\x00\x00\xFF", - "\x00\x00\x00\xFF\xFF\x00\xFF\x00", "\x00\x00\x00\xFF\xFF\x00\xFF\xFF", - "\x00\x00\x00\xFF\xFF\xFF\x00\x00", "\x00\x00\x00\xFF\xFF\xFF\x00\xFF", - "\x00\x00\x00\xFF\xFF\xFF\xFF\x00", "\x00\x00\x00\xFF\xFF\xFF\xFF\xFF", - "\x00\x00\xFF\x00\x00\x00\x00\x00", "\x00\x00\xFF\x00\x00\x00\x00\xFF", - "\x00\x00\xFF\x00\x00\x00\xFF\x00", "\x00\x00\xFF\x00\x00\x00\xFF\xFF", - "\x00\x00\xFF\x00\x00\xFF\x00\x00", "\x00\x00\xFF\x00\x00\xFF\x00\xFF", - "\x00\x00\xFF\x00\x00\xFF\xFF\x00", "\x00\x00\xFF\x00\x00\xFF\xFF\xFF", - "\x00\x00\xFF\x00\xFF\x00\x00\x00", "\x00\x00\xFF\x00\xFF\x00\x00\xFF", - "\x00\x00\xFF\x00\xFF\x00\xFF\x00", "\x00\x00\xFF\x00\xFF\x00\xFF\xFF", - "\x00\x00\xFF\x00\xFF\xFF\x00\x00", "\x00\x00\xFF\x00\xFF\xFF\x00\xFF", - "\x00\x00\xFF\x00\xFF\xFF\xFF\x00", "\x00\x00\xFF\x00\xFF\xFF\xFF\xFF", - "\x00\x00\xFF\xFF\x00\x00\x00\x00", "\x00\x00\xFF\xFF\x00\x00\x00\xFF", - "\x00\x00\xFF\xFF\x00\x00\xFF\x00", "\x00\x00\xFF\xFF\x00\x00\xFF\xFF", - "\x00\x00\xFF\xFF\x00\xFF\x00\x00", "\x00\x00\xFF\xFF\x00\xFF\x00\xFF", - "\x00\x00\xFF\xFF\x00\xFF\xFF\x00", "\x00\x00\xFF\xFF\x00\xFF\xFF\xFF", - "\x00\x00\xFF\xFF\xFF\x00\x00\x00", "\x00\x00\xFF\xFF\xFF\x00\x00\xFF", - "\x00\x00\xFF\xFF\xFF\x00\xFF\x00", "\x00\x00\xFF\xFF\xFF\x00\xFF\xFF", - "\x00\x00\xFF\xFF\xFF\xFF\x00\x00", "\x00\x00\xFF\xFF\xFF\xFF\x00\xFF", - "\x00\x00\xFF\xFF\xFF\xFF\xFF\x00", "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF", - "\x00\xFF\x00\x00\x00\x00\x00\x00", "\x00\xFF\x00\x00\x00\x00\x00\xFF", - "\x00\xFF\x00\x00\x00\x00\xFF\x00", "\x00\xFF\x00\x00\x00\x00\xFF\xFF", - "\x00\xFF\x00\x00\x00\xFF\x00\x00", "\x00\xFF\x00\x00\x00\xFF\x00\xFF", - "\x00\xFF\x00\x00\x00\xFF\xFF\x00", "\x00\xFF\x00\x00\x00\xFF\xFF\xFF", - "\x00\xFF\x00\x00\xFF\x00\x00\x00", "\x00\xFF\x00\x00\xFF\x00\x00\xFF", - "\x00\xFF\x00\x00\xFF\x00\xFF\x00", "\x00\xFF\x00\x00\xFF\x00\xFF\xFF", - "\x00\xFF\x00\x00\xFF\xFF\x00\x00", "\x00\xFF\x00\x00\xFF\xFF\x00\xFF", - "\x00\xFF\x00\x00\xFF\xFF\xFF\x00", "\x00\xFF\x00\x00\xFF\xFF\xFF\xFF", - "\x00\xFF\x00\xFF\x00\x00\x00\x00", "\x00\xFF\x00\xFF\x00\x00\x00\xFF", - "\x00\xFF\x00\xFF\x00\x00\xFF\x00", "\x00\xFF\x00\xFF\x00\x00\xFF\xFF", - "\x00\xFF\x00\xFF\x00\xFF\x00\x00", "\x00\xFF\x00\xFF\x00\xFF\x00\xFF", - "\x00\xFF\x00\xFF\x00\xFF\xFF\x00", "\x00\xFF\x00\xFF\x00\xFF\xFF\xFF", - "\x00\xFF\x00\xFF\xFF\x00\x00\x00", "\x00\xFF\x00\xFF\xFF\x00\x00\xFF", - "\x00\xFF\x00\xFF\xFF\x00\xFF\x00", "\x00\xFF\x00\xFF\xFF\x00\xFF\xFF", - "\x00\xFF\x00\xFF\xFF\xFF\x00\x00", "\x00\xFF\x00\xFF\xFF\xFF\x00\xFF", - "\x00\xFF\x00\xFF\xFF\xFF\xFF\x00", "\x00\xFF\x00\xFF\xFF\xFF\xFF\xFF", - "\x00\xFF\xFF\x00\x00\x00\x00\x00", "\x00\xFF\xFF\x00\x00\x00\x00\xFF", - "\x00\xFF\xFF\x00\x00\x00\xFF\x00", "\x00\xFF\xFF\x00\x00\x00\xFF\xFF", - "\x00\xFF\xFF\x00\x00\xFF\x00\x00", "\x00\xFF\xFF\x00\x00\xFF\x00\xFF", - "\x00\xFF\xFF\x00\x00\xFF\xFF\x00", "\x00\xFF\xFF\x00\x00\xFF\xFF\xFF", - "\x00\xFF\xFF\x00\xFF\x00\x00\x00", "\x00\xFF\xFF\x00\xFF\x00\x00\xFF", - "\x00\xFF\xFF\x00\xFF\x00\xFF\x00", "\x00\xFF\xFF\x00\xFF\x00\xFF\xFF", - "\x00\xFF\xFF\x00\xFF\xFF\x00\x00", "\x00\xFF\xFF\x00\xFF\xFF\x00\xFF", - "\x00\xFF\xFF\x00\xFF\xFF\xFF\x00", "\x00\xFF\xFF\x00\xFF\xFF\xFF\xFF", - "\x00\xFF\xFF\xFF\x00\x00\x00\x00", "\x00\xFF\xFF\xFF\x00\x00\x00\xFF", - "\x00\xFF\xFF\xFF\x00\x00\xFF\x00", "\x00\xFF\xFF\xFF\x00\x00\xFF\xFF", - "\x00\xFF\xFF\xFF\x00\xFF\x00\x00", "\x00\xFF\xFF\xFF\x00\xFF\x00\xFF", - "\x00\xFF\xFF\xFF\x00\xFF\xFF\x00", "\x00\xFF\xFF\xFF\x00\xFF\xFF\xFF", - "\x00\xFF\xFF\xFF\xFF\x00\x00\x00", "\x00\xFF\xFF\xFF\xFF\x00\x00\xFF", - "\x00\xFF\xFF\xFF\xFF\x00\xFF\x00", "\x00\xFF\xFF\xFF\xFF\x00\xFF\xFF", - "\x00\xFF\xFF\xFF\xFF\xFF\x00\x00", "\x00\xFF\xFF\xFF\xFF\xFF\x00\xFF", - "\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00", "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF", - "\xFF\x00\x00\x00\x00\x00\x00\x00", "\xFF\x00\x00\x00\x00\x00\x00\xFF", - "\xFF\x00\x00\x00\x00\x00\xFF\x00", "\xFF\x00\x00\x00\x00\x00\xFF\xFF", - "\xFF\x00\x00\x00\x00\xFF\x00\x00", "\xFF\x00\x00\x00\x00\xFF\x00\xFF", - "\xFF\x00\x00\x00\x00\xFF\xFF\x00", "\xFF\x00\x00\x00\x00\xFF\xFF\xFF", - "\xFF\x00\x00\x00\xFF\x00\x00\x00", "\xFF\x00\x00\x00\xFF\x00\x00\xFF", - "\xFF\x00\x00\x00\xFF\x00\xFF\x00", "\xFF\x00\x00\x00\xFF\x00\xFF\xFF", - "\xFF\x00\x00\x00\xFF\xFF\x00\x00", "\xFF\x00\x00\x00\xFF\xFF\x00\xFF", - "\xFF\x00\x00\x00\xFF\xFF\xFF\x00", "\xFF\x00\x00\x00\xFF\xFF\xFF\xFF", - "\xFF\x00\x00\xFF\x00\x00\x00\x00", "\xFF\x00\x00\xFF\x00\x00\x00\xFF", - "\xFF\x00\x00\xFF\x00\x00\xFF\x00", "\xFF\x00\x00\xFF\x00\x00\xFF\xFF", - "\xFF\x00\x00\xFF\x00\xFF\x00\x00", "\xFF\x00\x00\xFF\x00\xFF\x00\xFF", - "\xFF\x00\x00\xFF\x00\xFF\xFF\x00", "\xFF\x00\x00\xFF\x00\xFF\xFF\xFF", - "\xFF\x00\x00\xFF\xFF\x00\x00\x00", "\xFF\x00\x00\xFF\xFF\x00\x00\xFF", - "\xFF\x00\x00\xFF\xFF\x00\xFF\x00", "\xFF\x00\x00\xFF\xFF\x00\xFF\xFF", - "\xFF\x00\x00\xFF\xFF\xFF\x00\x00", "\xFF\x00\x00\xFF\xFF\xFF\x00\xFF", - "\xFF\x00\x00\xFF\xFF\xFF\xFF\x00", "\xFF\x00\x00\xFF\xFF\xFF\xFF\xFF", - "\xFF\x00\xFF\x00\x00\x00\x00\x00", "\xFF\x00\xFF\x00\x00\x00\x00\xFF", - "\xFF\x00\xFF\x00\x00\x00\xFF\x00", "\xFF\x00\xFF\x00\x00\x00\xFF\xFF", - "\xFF\x00\xFF\x00\x00\xFF\x00\x00", "\xFF\x00\xFF\x00\x00\xFF\x00\xFF", - "\xFF\x00\xFF\x00\x00\xFF\xFF\x00", "\xFF\x00\xFF\x00\x00\xFF\xFF\xFF", - "\xFF\x00\xFF\x00\xFF\x00\x00\x00", "\xFF\x00\xFF\x00\xFF\x00\x00\xFF", - "\xFF\x00\xFF\x00\xFF\x00\xFF\x00", "\xFF\x00\xFF\x00\xFF\x00\xFF\xFF", - "\xFF\x00\xFF\x00\xFF\xFF\x00\x00", "\xFF\x00\xFF\x00\xFF\xFF\x00\xFF", - "\xFF\x00\xFF\x00\xFF\xFF\xFF\x00", "\xFF\x00\xFF\x00\xFF\xFF\xFF\xFF", - "\xFF\x00\xFF\xFF\x00\x00\x00\x00", "\xFF\x00\xFF\xFF\x00\x00\x00\xFF", - "\xFF\x00\xFF\xFF\x00\x00\xFF\x00", "\xFF\x00\xFF\xFF\x00\x00\xFF\xFF", - "\xFF\x00\xFF\xFF\x00\xFF\x00\x00", "\xFF\x00\xFF\xFF\x00\xFF\x00\xFF", - "\xFF\x00\xFF\xFF\x00\xFF\xFF\x00", "\xFF\x00\xFF\xFF\x00\xFF\xFF\xFF", - "\xFF\x00\xFF\xFF\xFF\x00\x00\x00", "\xFF\x00\xFF\xFF\xFF\x00\x00\xFF", - "\xFF\x00\xFF\xFF\xFF\x00\xFF\x00", "\xFF\x00\xFF\xFF\xFF\x00\xFF\xFF", - "\xFF\x00\xFF\xFF\xFF\xFF\x00\x00", "\xFF\x00\xFF\xFF\xFF\xFF\x00\xFF", - "\xFF\x00\xFF\xFF\xFF\xFF\xFF\x00", "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF", - "\xFF\xFF\x00\x00\x00\x00\x00\x00", "\xFF\xFF\x00\x00\x00\x00\x00\xFF", - "\xFF\xFF\x00\x00\x00\x00\xFF\x00", "\xFF\xFF\x00\x00\x00\x00\xFF\xFF", - "\xFF\xFF\x00\x00\x00\xFF\x00\x00", "\xFF\xFF\x00\x00\x00\xFF\x00\xFF", - "\xFF\xFF\x00\x00\x00\xFF\xFF\x00", "\xFF\xFF\x00\x00\x00\xFF\xFF\xFF", - "\xFF\xFF\x00\x00\xFF\x00\x00\x00", "\xFF\xFF\x00\x00\xFF\x00\x00\xFF", - "\xFF\xFF\x00\x00\xFF\x00\xFF\x00", "\xFF\xFF\x00\x00\xFF\x00\xFF\xFF", - "\xFF\xFF\x00\x00\xFF\xFF\x00\x00", "\xFF\xFF\x00\x00\xFF\xFF\x00\xFF", - "\xFF\xFF\x00\x00\xFF\xFF\xFF\x00", "\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF", - "\xFF\xFF\x00\xFF\x00\x00\x00\x00", "\xFF\xFF\x00\xFF\x00\x00\x00\xFF", - "\xFF\xFF\x00\xFF\x00\x00\xFF\x00", "\xFF\xFF\x00\xFF\x00\x00\xFF\xFF", - "\xFF\xFF\x00\xFF\x00\xFF\x00\x00", "\xFF\xFF\x00\xFF\x00\xFF\x00\xFF", - "\xFF\xFF\x00\xFF\x00\xFF\xFF\x00", "\xFF\xFF\x00\xFF\x00\xFF\xFF\xFF", - "\xFF\xFF\x00\xFF\xFF\x00\x00\x00", "\xFF\xFF\x00\xFF\xFF\x00\x00\xFF", - "\xFF\xFF\x00\xFF\xFF\x00\xFF\x00", "\xFF\xFF\x00\xFF\xFF\x00\xFF\xFF", - "\xFF\xFF\x00\xFF\xFF\xFF\x00\x00", "\xFF\xFF\x00\xFF\xFF\xFF\x00\xFF", - "\xFF\xFF\x00\xFF\xFF\xFF\xFF\x00", "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF", - "\xFF\xFF\xFF\x00\x00\x00\x00\x00", "\xFF\xFF\xFF\x00\x00\x00\x00\xFF", - "\xFF\xFF\xFF\x00\x00\x00\xFF\x00", "\xFF\xFF\xFF\x00\x00\x00\xFF\xFF", - "\xFF\xFF\xFF\x00\x00\xFF\x00\x00", "\xFF\xFF\xFF\x00\x00\xFF\x00\xFF", - "\xFF\xFF\xFF\x00\x00\xFF\xFF\x00", "\xFF\xFF\xFF\x00\x00\xFF\xFF\xFF", - "\xFF\xFF\xFF\x00\xFF\x00\x00\x00", "\xFF\xFF\xFF\x00\xFF\x00\x00\xFF", - "\xFF\xFF\xFF\x00\xFF\x00\xFF\x00", "\xFF\xFF\xFF\x00\xFF\x00\xFF\xFF", - "\xFF\xFF\xFF\x00\xFF\xFF\x00\x00", "\xFF\xFF\xFF\x00\xFF\xFF\x00\xFF", - "\xFF\xFF\xFF\x00\xFF\xFF\xFF\x00", "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF", - "\xFF\xFF\xFF\xFF\x00\x00\x00\x00", "\xFF\xFF\xFF\xFF\x00\x00\x00\xFF", - "\xFF\xFF\xFF\xFF\x00\x00\xFF\x00", "\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF", - "\xFF\xFF\xFF\xFF\x00\xFF\x00\x00", "\xFF\xFF\xFF\xFF\x00\xFF\x00\xFF", - "\xFF\xFF\xFF\xFF\x00\xFF\xFF\x00", "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF", - "\xFF\xFF\xFF\xFF\xFF\x00\x00\x00", "\xFF\xFF\xFF\xFF\xFF\x00\x00\xFF", - "\xFF\xFF\xFF\xFF\xFF\x00\xFF\x00", "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF", - "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00", "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF", - "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00", "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" - ); - - /** - * IP mapping helper table. - * - * Indexing this table with each source byte performs the initial bit permutation. - * - * @var Array - * @access private - */ - var $ipmap = array( - 0x00, 0x10, 0x01, 0x11, 0x20, 0x30, 0x21, 0x31, - 0x02, 0x12, 0x03, 0x13, 0x22, 0x32, 0x23, 0x33, - 0x40, 0x50, 0x41, 0x51, 0x60, 0x70, 0x61, 0x71, - 0x42, 0x52, 0x43, 0x53, 0x62, 0x72, 0x63, 0x73, - 0x04, 0x14, 0x05, 0x15, 0x24, 0x34, 0x25, 0x35, - 0x06, 0x16, 0x07, 0x17, 0x26, 0x36, 0x27, 0x37, - 0x44, 0x54, 0x45, 0x55, 0x64, 0x74, 0x65, 0x75, - 0x46, 0x56, 0x47, 0x57, 0x66, 0x76, 0x67, 0x77, - 0x80, 0x90, 0x81, 0x91, 0xA0, 0xB0, 0xA1, 0xB1, - 0x82, 0x92, 0x83, 0x93, 0xA2, 0xB2, 0xA3, 0xB3, - 0xC0, 0xD0, 0xC1, 0xD1, 0xE0, 0xF0, 0xE1, 0xF1, - 0xC2, 0xD2, 0xC3, 0xD3, 0xE2, 0xF2, 0xE3, 0xF3, - 0x84, 0x94, 0x85, 0x95, 0xA4, 0xB4, 0xA5, 0xB5, - 0x86, 0x96, 0x87, 0x97, 0xA6, 0xB6, 0xA7, 0xB7, - 0xC4, 0xD4, 0xC5, 0xD5, 0xE4, 0xF4, 0xE5, 0xF5, - 0xC6, 0xD6, 0xC7, 0xD7, 0xE6, 0xF6, 0xE7, 0xF7, - 0x08, 0x18, 0x09, 0x19, 0x28, 0x38, 0x29, 0x39, - 0x0A, 0x1A, 0x0B, 0x1B, 0x2A, 0x3A, 0x2B, 0x3B, - 0x48, 0x58, 0x49, 0x59, 0x68, 0x78, 0x69, 0x79, - 0x4A, 0x5A, 0x4B, 0x5B, 0x6A, 0x7A, 0x6B, 0x7B, - 0x0C, 0x1C, 0x0D, 0x1D, 0x2C, 0x3C, 0x2D, 0x3D, - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4C, 0x5C, 0x4D, 0x5D, 0x6C, 0x7C, 0x6D, 0x7D, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x88, 0x98, 0x89, 0x99, 0xA8, 0xB8, 0xA9, 0xB9, - 0x8A, 0x9A, 0x8B, 0x9B, 0xAA, 0xBA, 0xAB, 0xBB, - 0xC8, 0xD8, 0xC9, 0xD9, 0xE8, 0xF8, 0xE9, 0xF9, - 0xCA, 0xDA, 0xCB, 0xDB, 0xEA, 0xFA, 0xEB, 0xFB, - 0x8C, 0x9C, 0x8D, 0x9D, 0xAC, 0xBC, 0xAD, 0xBD, - 0x8E, 0x9E, 0x8F, 0x9F, 0xAE, 0xBE, 0xAF, 0xBF, - 0xCC, 0xDC, 0xCD, 0xDD, 0xEC, 0xFC, 0xED, 0xFD, - 0xCE, 0xDE, 0xCF, 0xDF, 0xEE, 0xFE, 0xEF, 0xFF - ); - - /** - * Inverse IP mapping helper table. - * Indexing this table with a byte value reverses the bit order. - * - * @var Array - * @access private - */ - var $invipmap = array( - 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, - 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, - 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, - 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, - 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, - 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, - 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, - 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, - 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, - 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, - 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, - 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, - 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, - 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, - 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, - 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, - 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, - 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, - 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, - 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, - 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, - 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, - 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, - 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, - 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, - 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, - 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, - 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, - 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, - 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, - 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, - 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF - ); - - /** - * Pre-permuted S-box1 - * - * Each box ($sbox1-$sbox8) has been vectorized, then each value pre-permuted using the - * P table: concatenation can then be replaced by exclusive ORs. - * - * @var Array - * @access private - */ - var $sbox1 = array( - 0x00808200, 0x00000000, 0x00008000, 0x00808202, - 0x00808002, 0x00008202, 0x00000002, 0x00008000, - 0x00000200, 0x00808200, 0x00808202, 0x00000200, - 0x00800202, 0x00808002, 0x00800000, 0x00000002, - 0x00000202, 0x00800200, 0x00800200, 0x00008200, - 0x00008200, 0x00808000, 0x00808000, 0x00800202, - 0x00008002, 0x00800002, 0x00800002, 0x00008002, - 0x00000000, 0x00000202, 0x00008202, 0x00800000, - 0x00008000, 0x00808202, 0x00000002, 0x00808000, - 0x00808200, 0x00800000, 0x00800000, 0x00000200, - 0x00808002, 0x00008000, 0x00008200, 0x00800002, - 0x00000200, 0x00000002, 0x00800202, 0x00008202, - 0x00808202, 0x00008002, 0x00808000, 0x00800202, - 0x00800002, 0x00000202, 0x00008202, 0x00808200, - 0x00000202, 0x00800200, 0x00800200, 0x00000000, - 0x00008002, 0x00008200, 0x00000000, 0x00808002 - ); - - /** - * Pre-permuted S-box2 - * - * @var Array - * @access private - */ - var $sbox2 = array( - 0x40084010, 0x40004000, 0x00004000, 0x00084010, - 0x00080000, 0x00000010, 0x40080010, 0x40004010, - 0x40000010, 0x40084010, 0x40084000, 0x40000000, - 0x40004000, 0x00080000, 0x00000010, 0x40080010, - 0x00084000, 0x00080010, 0x40004010, 0x00000000, - 0x40000000, 0x00004000, 0x00084010, 0x40080000, - 0x00080010, 0x40000010, 0x00000000, 0x00084000, - 0x00004010, 0x40084000, 0x40080000, 0x00004010, - 0x00000000, 0x00084010, 0x40080010, 0x00080000, - 0x40004010, 0x40080000, 0x40084000, 0x00004000, - 0x40080000, 0x40004000, 0x00000010, 0x40084010, - 0x00084010, 0x00000010, 0x00004000, 0x40000000, - 0x00004010, 0x40084000, 0x00080000, 0x40000010, - 0x00080010, 0x40004010, 0x40000010, 0x00080010, - 0x00084000, 0x00000000, 0x40004000, 0x00004010, - 0x40000000, 0x40080010, 0x40084010, 0x00084000 - ); - - /** - * Pre-permuted S-box3 - * - * @var Array - * @access private - */ - var $sbox3 = array( - 0x00000104, 0x04010100, 0x00000000, 0x04010004, - 0x04000100, 0x00000000, 0x00010104, 0x04000100, - 0x00010004, 0x04000004, 0x04000004, 0x00010000, - 0x04010104, 0x00010004, 0x04010000, 0x00000104, - 0x04000000, 0x00000004, 0x04010100, 0x00000100, - 0x00010100, 0x04010000, 0x04010004, 0x00010104, - 0x04000104, 0x00010100, 0x00010000, 0x04000104, - 0x00000004, 0x04010104, 0x00000100, 0x04000000, - 0x04010100, 0x04000000, 0x00010004, 0x00000104, - 0x00010000, 0x04010100, 0x04000100, 0x00000000, - 0x00000100, 0x00010004, 0x04010104, 0x04000100, - 0x04000004, 0x00000100, 0x00000000, 0x04010004, - 0x04000104, 0x00010000, 0x04000000, 0x04010104, - 0x00000004, 0x00010104, 0x00010100, 0x04000004, - 0x04010000, 0x04000104, 0x00000104, 0x04010000, - 0x00010104, 0x00000004, 0x04010004, 0x00010100 - ); - - /** - * Pre-permuted S-box4 - * - * @var Array - * @access private - */ - var $sbox4 = array( - 0x80401000, 0x80001040, 0x80001040, 0x00000040, - 0x00401040, 0x80400040, 0x80400000, 0x80001000, - 0x00000000, 0x00401000, 0x00401000, 0x80401040, - 0x80000040, 0x00000000, 0x00400040, 0x80400000, - 0x80000000, 0x00001000, 0x00400000, 0x80401000, - 0x00000040, 0x00400000, 0x80001000, 0x00001040, - 0x80400040, 0x80000000, 0x00001040, 0x00400040, - 0x00001000, 0x00401040, 0x80401040, 0x80000040, - 0x00400040, 0x80400000, 0x00401000, 0x80401040, - 0x80000040, 0x00000000, 0x00000000, 0x00401000, - 0x00001040, 0x00400040, 0x80400040, 0x80000000, - 0x80401000, 0x80001040, 0x80001040, 0x00000040, - 0x80401040, 0x80000040, 0x80000000, 0x00001000, - 0x80400000, 0x80001000, 0x00401040, 0x80400040, - 0x80001000, 0x00001040, 0x00400000, 0x80401000, - 0x00000040, 0x00400000, 0x00001000, 0x00401040 - ); - - /** - * Pre-permuted S-box5 - * - * @var Array - * @access private - */ - var $sbox5 = array( - 0x00000080, 0x01040080, 0x01040000, 0x21000080, - 0x00040000, 0x00000080, 0x20000000, 0x01040000, - 0x20040080, 0x00040000, 0x01000080, 0x20040080, - 0x21000080, 0x21040000, 0x00040080, 0x20000000, - 0x01000000, 0x20040000, 0x20040000, 0x00000000, - 0x20000080, 0x21040080, 0x21040080, 0x01000080, - 0x21040000, 0x20000080, 0x00000000, 0x21000000, - 0x01040080, 0x01000000, 0x21000000, 0x00040080, - 0x00040000, 0x21000080, 0x00000080, 0x01000000, - 0x20000000, 0x01040000, 0x21000080, 0x20040080, - 0x01000080, 0x20000000, 0x21040000, 0x01040080, - 0x20040080, 0x00000080, 0x01000000, 0x21040000, - 0x21040080, 0x00040080, 0x21000000, 0x21040080, - 0x01040000, 0x00000000, 0x20040000, 0x21000000, - 0x00040080, 0x01000080, 0x20000080, 0x00040000, - 0x00000000, 0x20040000, 0x01040080, 0x20000080 - ); - - /** - * Pre-permuted S-box6 - * - * @var Array - * @access private - */ - var $sbox6 = array( - 0x10000008, 0x10200000, 0x00002000, 0x10202008, - 0x10200000, 0x00000008, 0x10202008, 0x00200000, - 0x10002000, 0x00202008, 0x00200000, 0x10000008, - 0x00200008, 0x10002000, 0x10000000, 0x00002008, - 0x00000000, 0x00200008, 0x10002008, 0x00002000, - 0x00202000, 0x10002008, 0x00000008, 0x10200008, - 0x10200008, 0x00000000, 0x00202008, 0x10202000, - 0x00002008, 0x00202000, 0x10202000, 0x10000000, - 0x10002000, 0x00000008, 0x10200008, 0x00202000, - 0x10202008, 0x00200000, 0x00002008, 0x10000008, - 0x00200000, 0x10002000, 0x10000000, 0x00002008, - 0x10000008, 0x10202008, 0x00202000, 0x10200000, - 0x00202008, 0x10202000, 0x00000000, 0x10200008, - 0x00000008, 0x00002000, 0x10200000, 0x00202008, - 0x00002000, 0x00200008, 0x10002008, 0x00000000, - 0x10202000, 0x10000000, 0x00200008, 0x10002008 - ); - - /** - * Pre-permuted S-box7 - * - * @var Array - * @access private - */ - var $sbox7 = array( - 0x00100000, 0x02100001, 0x02000401, 0x00000000, - 0x00000400, 0x02000401, 0x00100401, 0x02100400, - 0x02100401, 0x00100000, 0x00000000, 0x02000001, - 0x00000001, 0x02000000, 0x02100001, 0x00000401, - 0x02000400, 0x00100401, 0x00100001, 0x02000400, - 0x02000001, 0x02100000, 0x02100400, 0x00100001, - 0x02100000, 0x00000400, 0x00000401, 0x02100401, - 0x00100400, 0x00000001, 0x02000000, 0x00100400, - 0x02000000, 0x00100400, 0x00100000, 0x02000401, - 0x02000401, 0x02100001, 0x02100001, 0x00000001, - 0x00100001, 0x02000000, 0x02000400, 0x00100000, - 0x02100400, 0x00000401, 0x00100401, 0x02100400, - 0x00000401, 0x02000001, 0x02100401, 0x02100000, - 0x00100400, 0x00000000, 0x00000001, 0x02100401, - 0x00000000, 0x00100401, 0x02100000, 0x00000400, - 0x02000001, 0x02000400, 0x00000400, 0x00100001 - ); - - /** - * Pre-permuted S-box8 - * - * @var Array - * @access private - */ - var $sbox8 = array( - 0x08000820, 0x00000800, 0x00020000, 0x08020820, - 0x08000000, 0x08000820, 0x00000020, 0x08000000, - 0x00020020, 0x08020000, 0x08020820, 0x00020800, - 0x08020800, 0x00020820, 0x00000800, 0x00000020, - 0x08020000, 0x08000020, 0x08000800, 0x00000820, - 0x00020800, 0x00020020, 0x08020020, 0x08020800, - 0x00000820, 0x00000000, 0x00000000, 0x08020020, - 0x08000020, 0x08000800, 0x00020820, 0x00020000, - 0x00020820, 0x00020000, 0x08020800, 0x00000800, - 0x00000020, 0x08020020, 0x00000800, 0x00020820, - 0x08000800, 0x00000020, 0x08000020, 0x08020000, - 0x08020020, 0x08000000, 0x00020000, 0x08000820, - 0x00000000, 0x08020820, 0x00020020, 0x08000020, - 0x08020000, 0x08000800, 0x08000820, 0x00000000, - 0x08020820, 0x00020800, 0x00020800, 0x00000820, - 0x00000820, 0x00020020, 0x08000000, 0x08020800 - ); - - /** - * Sets the key. - * - * Keys can be of any length. DES, itself, uses 64-bit keys (eg. strlen($key) == 8), however, we - * only use the first eight, if $key has more then eight characters in it, and pad $key with the - * null byte if it is less then eight characters long. - * - * DES also requires that every eighth bit be a parity bit, however, we'll ignore that. - * - * If the key is not explicitly set, it'll be assumed to be all zero's. - * - * @see Crypt_Base::setKey() - * @access public - * @param String $key - */ - function setKey($key) - { - // We check/cut here only up to max length of the key. - // Key padding to the proper length will be done in _setupKey() - if (strlen($key) > $this->key_size_max) { - $key = substr($key, 0, $this->key_size_max); - } - - // Sets the key - parent::setKey($key); - } - - /** - * Encrypts a block - * - * @see Crypt_Base::_encryptBlock() - * @see Crypt_Base::encrypt() - * @see Crypt_DES::encrypt() - * @access private - * @param String $in - * @return String - */ - function _encryptBlock($in) - { - return $this->_processBlock($in, CRYPT_DES_ENCRYPT); - } - - /** - * Decrypts a block - * - * @see Crypt_Base::_decryptBlock() - * @see Crypt_Base::decrypt() - * @see Crypt_DES::decrypt() - * @access private - * @param String $in - * @return String - */ - function _decryptBlock($in) - { - return $this->_processBlock($in, CRYPT_DES_DECRYPT); - } - - /** - * Encrypts or decrypts a 64-bit block - * - * $mode should be either CRYPT_DES_ENCRYPT or CRYPT_DES_DECRYPT. See - * {@link http://en.wikipedia.org/wiki/Image:Feistel.png Feistel.png} to get a general - * idea of what this function does. - * - * @see Crypt_DES::_encryptBlock() - * @see Crypt_DES::_decryptBlock() - * @access private - * @param String $block - * @param Integer $mode - * @return String - */ - function _processBlock($block, $mode) - { - static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip; - if (!$sbox1) { - $sbox1 = array_map("intval", $this->sbox1); - $sbox2 = array_map("intval", $this->sbox2); - $sbox3 = array_map("intval", $this->sbox3); - $sbox4 = array_map("intval", $this->sbox4); - $sbox5 = array_map("intval", $this->sbox5); - $sbox6 = array_map("intval", $this->sbox6); - $sbox7 = array_map("intval", $this->sbox7); - $sbox8 = array_map("intval", $this->sbox8); - /* Merge $shuffle with $[inv]ipmap */ - for ($i = 0; $i < 256; ++$i) { - $shuffleip[] = $this->shuffle[$this->ipmap[$i]]; - $shuffleinvip[] = $this->shuffle[$this->invipmap[$i]]; - } - } - - $keys = $this->keys[$mode]; - $ki = -1; - - // Do the initial IP permutation. - $t = unpack('Nl/Nr', $block); - list($l, $r) = array($t['l'], $t['r']); - $block = ($shuffleip[ $r & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | - ($shuffleip[($r >> 8) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | - ($shuffleip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | - ($shuffleip[($r >> 24) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | - ($shuffleip[ $l & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | - ($shuffleip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | - ($shuffleip[($l >> 16) & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | - ($shuffleip[($l >> 24) & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01"); - - // Extract L0 and R0. - $t = unpack('Nl/Nr', $block); - list($l, $r) = array($t['l'], $t['r']); - - for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) { - // Perform the 16 steps. - for ($i = 0; $i < 16; $i++) { - // start of "the Feistel (F) function" - see the following URL: - // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png - // Merge key schedule. - $b1 = (($r >> 3) & 0x1FFFFFFF) ^ ($r << 29) ^ $keys[++$ki]; - $b2 = (($r >> 31) & 0x00000001) ^ ($r << 1) ^ $keys[++$ki]; - - // S-box indexing. - $t = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^ - $sbox3[($b1 >> 16) & 0x3F] ^ $sbox4[($b2 >> 16) & 0x3F] ^ - $sbox5[($b1 >> 8) & 0x3F] ^ $sbox6[($b2 >> 8) & 0x3F] ^ - $sbox7[ $b1 & 0x3F] ^ $sbox8[ $b2 & 0x3F] ^ $l; - // end of "the Feistel (F) function" - - $l = $r; - $r = $t; - } - - // Last step should not permute L & R. - $t = $l; - $l = $r; - $r = $t; - } - - // Perform the inverse IP permutation. - return ($shuffleinvip[($r >> 24) & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | - ($shuffleinvip[($l >> 24) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | - ($shuffleinvip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | - ($shuffleinvip[($l >> 16) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | - ($shuffleinvip[($r >> 8) & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | - ($shuffleinvip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | - ($shuffleinvip[ $r & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | - ($shuffleinvip[ $l & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01"); - } - - /** - * Creates the key schedule - * - * @see Crypt_Base::_setupKey() - * @access private - */ - function _setupKey() - { - if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->des_rounds === $this->kl['des_rounds']) { - // already expanded - return; - } - $this->kl = array('key' => $this->key, 'des_rounds' => $this->des_rounds); - - static $shifts = array( // number of key bits shifted per round - 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 - ); - - static $pc1map = array( - 0x00, 0x00, 0x08, 0x08, 0x04, 0x04, 0x0C, 0x0C, - 0x02, 0x02, 0x0A, 0x0A, 0x06, 0x06, 0x0E, 0x0E, - 0x10, 0x10, 0x18, 0x18, 0x14, 0x14, 0x1C, 0x1C, - 0x12, 0x12, 0x1A, 0x1A, 0x16, 0x16, 0x1E, 0x1E, - 0x20, 0x20, 0x28, 0x28, 0x24, 0x24, 0x2C, 0x2C, - 0x22, 0x22, 0x2A, 0x2A, 0x26, 0x26, 0x2E, 0x2E, - 0x30, 0x30, 0x38, 0x38, 0x34, 0x34, 0x3C, 0x3C, - 0x32, 0x32, 0x3A, 0x3A, 0x36, 0x36, 0x3E, 0x3E, - 0x40, 0x40, 0x48, 0x48, 0x44, 0x44, 0x4C, 0x4C, - 0x42, 0x42, 0x4A, 0x4A, 0x46, 0x46, 0x4E, 0x4E, - 0x50, 0x50, 0x58, 0x58, 0x54, 0x54, 0x5C, 0x5C, - 0x52, 0x52, 0x5A, 0x5A, 0x56, 0x56, 0x5E, 0x5E, - 0x60, 0x60, 0x68, 0x68, 0x64, 0x64, 0x6C, 0x6C, - 0x62, 0x62, 0x6A, 0x6A, 0x66, 0x66, 0x6E, 0x6E, - 0x70, 0x70, 0x78, 0x78, 0x74, 0x74, 0x7C, 0x7C, - 0x72, 0x72, 0x7A, 0x7A, 0x76, 0x76, 0x7E, 0x7E, - 0x80, 0x80, 0x88, 0x88, 0x84, 0x84, 0x8C, 0x8C, - 0x82, 0x82, 0x8A, 0x8A, 0x86, 0x86, 0x8E, 0x8E, - 0x90, 0x90, 0x98, 0x98, 0x94, 0x94, 0x9C, 0x9C, - 0x92, 0x92, 0x9A, 0x9A, 0x96, 0x96, 0x9E, 0x9E, - 0xA0, 0xA0, 0xA8, 0xA8, 0xA4, 0xA4, 0xAC, 0xAC, - 0xA2, 0xA2, 0xAA, 0xAA, 0xA6, 0xA6, 0xAE, 0xAE, - 0xB0, 0xB0, 0xB8, 0xB8, 0xB4, 0xB4, 0xBC, 0xBC, - 0xB2, 0xB2, 0xBA, 0xBA, 0xB6, 0xB6, 0xBE, 0xBE, - 0xC0, 0xC0, 0xC8, 0xC8, 0xC4, 0xC4, 0xCC, 0xCC, - 0xC2, 0xC2, 0xCA, 0xCA, 0xC6, 0xC6, 0xCE, 0xCE, - 0xD0, 0xD0, 0xD8, 0xD8, 0xD4, 0xD4, 0xDC, 0xDC, - 0xD2, 0xD2, 0xDA, 0xDA, 0xD6, 0xD6, 0xDE, 0xDE, - 0xE0, 0xE0, 0xE8, 0xE8, 0xE4, 0xE4, 0xEC, 0xEC, - 0xE2, 0xE2, 0xEA, 0xEA, 0xE6, 0xE6, 0xEE, 0xEE, - 0xF0, 0xF0, 0xF8, 0xF8, 0xF4, 0xF4, 0xFC, 0xFC, - 0xF2, 0xF2, 0xFA, 0xFA, 0xF6, 0xF6, 0xFE, 0xFE - ); - - // Mapping tables for the PC-2 transformation. - static $pc2mapc1 = array( - 0x00000000, 0x00000400, 0x00200000, 0x00200400, - 0x00000001, 0x00000401, 0x00200001, 0x00200401, - 0x02000000, 0x02000400, 0x02200000, 0x02200400, - 0x02000001, 0x02000401, 0x02200001, 0x02200401 - ); - static $pc2mapc2 = array( - 0x00000000, 0x00000800, 0x08000000, 0x08000800, - 0x00010000, 0x00010800, 0x08010000, 0x08010800, - 0x00000000, 0x00000800, 0x08000000, 0x08000800, - 0x00010000, 0x00010800, 0x08010000, 0x08010800, - 0x00000100, 0x00000900, 0x08000100, 0x08000900, - 0x00010100, 0x00010900, 0x08010100, 0x08010900, - 0x00000100, 0x00000900, 0x08000100, 0x08000900, - 0x00010100, 0x00010900, 0x08010100, 0x08010900, - 0x00000010, 0x00000810, 0x08000010, 0x08000810, - 0x00010010, 0x00010810, 0x08010010, 0x08010810, - 0x00000010, 0x00000810, 0x08000010, 0x08000810, - 0x00010010, 0x00010810, 0x08010010, 0x08010810, - 0x00000110, 0x00000910, 0x08000110, 0x08000910, - 0x00010110, 0x00010910, 0x08010110, 0x08010910, - 0x00000110, 0x00000910, 0x08000110, 0x08000910, - 0x00010110, 0x00010910, 0x08010110, 0x08010910, - 0x00040000, 0x00040800, 0x08040000, 0x08040800, - 0x00050000, 0x00050800, 0x08050000, 0x08050800, - 0x00040000, 0x00040800, 0x08040000, 0x08040800, - 0x00050000, 0x00050800, 0x08050000, 0x08050800, - 0x00040100, 0x00040900, 0x08040100, 0x08040900, - 0x00050100, 0x00050900, 0x08050100, 0x08050900, - 0x00040100, 0x00040900, 0x08040100, 0x08040900, - 0x00050100, 0x00050900, 0x08050100, 0x08050900, - 0x00040010, 0x00040810, 0x08040010, 0x08040810, - 0x00050010, 0x00050810, 0x08050010, 0x08050810, - 0x00040010, 0x00040810, 0x08040010, 0x08040810, - 0x00050010, 0x00050810, 0x08050010, 0x08050810, - 0x00040110, 0x00040910, 0x08040110, 0x08040910, - 0x00050110, 0x00050910, 0x08050110, 0x08050910, - 0x00040110, 0x00040910, 0x08040110, 0x08040910, - 0x00050110, 0x00050910, 0x08050110, 0x08050910, - 0x01000000, 0x01000800, 0x09000000, 0x09000800, - 0x01010000, 0x01010800, 0x09010000, 0x09010800, - 0x01000000, 0x01000800, 0x09000000, 0x09000800, - 0x01010000, 0x01010800, 0x09010000, 0x09010800, - 0x01000100, 0x01000900, 0x09000100, 0x09000900, - 0x01010100, 0x01010900, 0x09010100, 0x09010900, - 0x01000100, 0x01000900, 0x09000100, 0x09000900, - 0x01010100, 0x01010900, 0x09010100, 0x09010900, - 0x01000010, 0x01000810, 0x09000010, 0x09000810, - 0x01010010, 0x01010810, 0x09010010, 0x09010810, - 0x01000010, 0x01000810, 0x09000010, 0x09000810, - 0x01010010, 0x01010810, 0x09010010, 0x09010810, - 0x01000110, 0x01000910, 0x09000110, 0x09000910, - 0x01010110, 0x01010910, 0x09010110, 0x09010910, - 0x01000110, 0x01000910, 0x09000110, 0x09000910, - 0x01010110, 0x01010910, 0x09010110, 0x09010910, - 0x01040000, 0x01040800, 0x09040000, 0x09040800, - 0x01050000, 0x01050800, 0x09050000, 0x09050800, - 0x01040000, 0x01040800, 0x09040000, 0x09040800, - 0x01050000, 0x01050800, 0x09050000, 0x09050800, - 0x01040100, 0x01040900, 0x09040100, 0x09040900, - 0x01050100, 0x01050900, 0x09050100, 0x09050900, - 0x01040100, 0x01040900, 0x09040100, 0x09040900, - 0x01050100, 0x01050900, 0x09050100, 0x09050900, - 0x01040010, 0x01040810, 0x09040010, 0x09040810, - 0x01050010, 0x01050810, 0x09050010, 0x09050810, - 0x01040010, 0x01040810, 0x09040010, 0x09040810, - 0x01050010, 0x01050810, 0x09050010, 0x09050810, - 0x01040110, 0x01040910, 0x09040110, 0x09040910, - 0x01050110, 0x01050910, 0x09050110, 0x09050910, - 0x01040110, 0x01040910, 0x09040110, 0x09040910, - 0x01050110, 0x01050910, 0x09050110, 0x09050910 - ); - static $pc2mapc3 = array( - 0x00000000, 0x00000004, 0x00001000, 0x00001004, - 0x00000000, 0x00000004, 0x00001000, 0x00001004, - 0x10000000, 0x10000004, 0x10001000, 0x10001004, - 0x10000000, 0x10000004, 0x10001000, 0x10001004, - 0x00000020, 0x00000024, 0x00001020, 0x00001024, - 0x00000020, 0x00000024, 0x00001020, 0x00001024, - 0x10000020, 0x10000024, 0x10001020, 0x10001024, - 0x10000020, 0x10000024, 0x10001020, 0x10001024, - 0x00080000, 0x00080004, 0x00081000, 0x00081004, - 0x00080000, 0x00080004, 0x00081000, 0x00081004, - 0x10080000, 0x10080004, 0x10081000, 0x10081004, - 0x10080000, 0x10080004, 0x10081000, 0x10081004, - 0x00080020, 0x00080024, 0x00081020, 0x00081024, - 0x00080020, 0x00080024, 0x00081020, 0x00081024, - 0x10080020, 0x10080024, 0x10081020, 0x10081024, - 0x10080020, 0x10080024, 0x10081020, 0x10081024, - 0x20000000, 0x20000004, 0x20001000, 0x20001004, - 0x20000000, 0x20000004, 0x20001000, 0x20001004, - 0x30000000, 0x30000004, 0x30001000, 0x30001004, - 0x30000000, 0x30000004, 0x30001000, 0x30001004, - 0x20000020, 0x20000024, 0x20001020, 0x20001024, - 0x20000020, 0x20000024, 0x20001020, 0x20001024, - 0x30000020, 0x30000024, 0x30001020, 0x30001024, - 0x30000020, 0x30000024, 0x30001020, 0x30001024, - 0x20080000, 0x20080004, 0x20081000, 0x20081004, - 0x20080000, 0x20080004, 0x20081000, 0x20081004, - 0x30080000, 0x30080004, 0x30081000, 0x30081004, - 0x30080000, 0x30080004, 0x30081000, 0x30081004, - 0x20080020, 0x20080024, 0x20081020, 0x20081024, - 0x20080020, 0x20080024, 0x20081020, 0x20081024, - 0x30080020, 0x30080024, 0x30081020, 0x30081024, - 0x30080020, 0x30080024, 0x30081020, 0x30081024, - 0x00000002, 0x00000006, 0x00001002, 0x00001006, - 0x00000002, 0x00000006, 0x00001002, 0x00001006, - 0x10000002, 0x10000006, 0x10001002, 0x10001006, - 0x10000002, 0x10000006, 0x10001002, 0x10001006, - 0x00000022, 0x00000026, 0x00001022, 0x00001026, - 0x00000022, 0x00000026, 0x00001022, 0x00001026, - 0x10000022, 0x10000026, 0x10001022, 0x10001026, - 0x10000022, 0x10000026, 0x10001022, 0x10001026, - 0x00080002, 0x00080006, 0x00081002, 0x00081006, - 0x00080002, 0x00080006, 0x00081002, 0x00081006, - 0x10080002, 0x10080006, 0x10081002, 0x10081006, - 0x10080002, 0x10080006, 0x10081002, 0x10081006, - 0x00080022, 0x00080026, 0x00081022, 0x00081026, - 0x00080022, 0x00080026, 0x00081022, 0x00081026, - 0x10080022, 0x10080026, 0x10081022, 0x10081026, - 0x10080022, 0x10080026, 0x10081022, 0x10081026, - 0x20000002, 0x20000006, 0x20001002, 0x20001006, - 0x20000002, 0x20000006, 0x20001002, 0x20001006, - 0x30000002, 0x30000006, 0x30001002, 0x30001006, - 0x30000002, 0x30000006, 0x30001002, 0x30001006, - 0x20000022, 0x20000026, 0x20001022, 0x20001026, - 0x20000022, 0x20000026, 0x20001022, 0x20001026, - 0x30000022, 0x30000026, 0x30001022, 0x30001026, - 0x30000022, 0x30000026, 0x30001022, 0x30001026, - 0x20080002, 0x20080006, 0x20081002, 0x20081006, - 0x20080002, 0x20080006, 0x20081002, 0x20081006, - 0x30080002, 0x30080006, 0x30081002, 0x30081006, - 0x30080002, 0x30080006, 0x30081002, 0x30081006, - 0x20080022, 0x20080026, 0x20081022, 0x20081026, - 0x20080022, 0x20080026, 0x20081022, 0x20081026, - 0x30080022, 0x30080026, 0x30081022, 0x30081026, - 0x30080022, 0x30080026, 0x30081022, 0x30081026 - ); - static $pc2mapc4 = array( - 0x00000000, 0x00100000, 0x00000008, 0x00100008, - 0x00000200, 0x00100200, 0x00000208, 0x00100208, - 0x00000000, 0x00100000, 0x00000008, 0x00100008, - 0x00000200, 0x00100200, 0x00000208, 0x00100208, - 0x04000000, 0x04100000, 0x04000008, 0x04100008, - 0x04000200, 0x04100200, 0x04000208, 0x04100208, - 0x04000000, 0x04100000, 0x04000008, 0x04100008, - 0x04000200, 0x04100200, 0x04000208, 0x04100208, - 0x00002000, 0x00102000, 0x00002008, 0x00102008, - 0x00002200, 0x00102200, 0x00002208, 0x00102208, - 0x00002000, 0x00102000, 0x00002008, 0x00102008, - 0x00002200, 0x00102200, 0x00002208, 0x00102208, - 0x04002000, 0x04102000, 0x04002008, 0x04102008, - 0x04002200, 0x04102200, 0x04002208, 0x04102208, - 0x04002000, 0x04102000, 0x04002008, 0x04102008, - 0x04002200, 0x04102200, 0x04002208, 0x04102208, - 0x00000000, 0x00100000, 0x00000008, 0x00100008, - 0x00000200, 0x00100200, 0x00000208, 0x00100208, - 0x00000000, 0x00100000, 0x00000008, 0x00100008, - 0x00000200, 0x00100200, 0x00000208, 0x00100208, - 0x04000000, 0x04100000, 0x04000008, 0x04100008, - 0x04000200, 0x04100200, 0x04000208, 0x04100208, - 0x04000000, 0x04100000, 0x04000008, 0x04100008, - 0x04000200, 0x04100200, 0x04000208, 0x04100208, - 0x00002000, 0x00102000, 0x00002008, 0x00102008, - 0x00002200, 0x00102200, 0x00002208, 0x00102208, - 0x00002000, 0x00102000, 0x00002008, 0x00102008, - 0x00002200, 0x00102200, 0x00002208, 0x00102208, - 0x04002000, 0x04102000, 0x04002008, 0x04102008, - 0x04002200, 0x04102200, 0x04002208, 0x04102208, - 0x04002000, 0x04102000, 0x04002008, 0x04102008, - 0x04002200, 0x04102200, 0x04002208, 0x04102208, - 0x00020000, 0x00120000, 0x00020008, 0x00120008, - 0x00020200, 0x00120200, 0x00020208, 0x00120208, - 0x00020000, 0x00120000, 0x00020008, 0x00120008, - 0x00020200, 0x00120200, 0x00020208, 0x00120208, - 0x04020000, 0x04120000, 0x04020008, 0x04120008, - 0x04020200, 0x04120200, 0x04020208, 0x04120208, - 0x04020000, 0x04120000, 0x04020008, 0x04120008, - 0x04020200, 0x04120200, 0x04020208, 0x04120208, - 0x00022000, 0x00122000, 0x00022008, 0x00122008, - 0x00022200, 0x00122200, 0x00022208, 0x00122208, - 0x00022000, 0x00122000, 0x00022008, 0x00122008, - 0x00022200, 0x00122200, 0x00022208, 0x00122208, - 0x04022000, 0x04122000, 0x04022008, 0x04122008, - 0x04022200, 0x04122200, 0x04022208, 0x04122208, - 0x04022000, 0x04122000, 0x04022008, 0x04122008, - 0x04022200, 0x04122200, 0x04022208, 0x04122208, - 0x00020000, 0x00120000, 0x00020008, 0x00120008, - 0x00020200, 0x00120200, 0x00020208, 0x00120208, - 0x00020000, 0x00120000, 0x00020008, 0x00120008, - 0x00020200, 0x00120200, 0x00020208, 0x00120208, - 0x04020000, 0x04120000, 0x04020008, 0x04120008, - 0x04020200, 0x04120200, 0x04020208, 0x04120208, - 0x04020000, 0x04120000, 0x04020008, 0x04120008, - 0x04020200, 0x04120200, 0x04020208, 0x04120208, - 0x00022000, 0x00122000, 0x00022008, 0x00122008, - 0x00022200, 0x00122200, 0x00022208, 0x00122208, - 0x00022000, 0x00122000, 0x00022008, 0x00122008, - 0x00022200, 0x00122200, 0x00022208, 0x00122208, - 0x04022000, 0x04122000, 0x04022008, 0x04122008, - 0x04022200, 0x04122200, 0x04022208, 0x04122208, - 0x04022000, 0x04122000, 0x04022008, 0x04122008, - 0x04022200, 0x04122200, 0x04022208, 0x04122208 - ); - static $pc2mapd1 = array( - 0x00000000, 0x00000001, 0x08000000, 0x08000001, - 0x00200000, 0x00200001, 0x08200000, 0x08200001, - 0x00000002, 0x00000003, 0x08000002, 0x08000003, - 0x00200002, 0x00200003, 0x08200002, 0x08200003 - ); - static $pc2mapd2 = array( - 0x00000000, 0x00100000, 0x00000800, 0x00100800, - 0x00000000, 0x00100000, 0x00000800, 0x00100800, - 0x04000000, 0x04100000, 0x04000800, 0x04100800, - 0x04000000, 0x04100000, 0x04000800, 0x04100800, - 0x00000004, 0x00100004, 0x00000804, 0x00100804, - 0x00000004, 0x00100004, 0x00000804, 0x00100804, - 0x04000004, 0x04100004, 0x04000804, 0x04100804, - 0x04000004, 0x04100004, 0x04000804, 0x04100804, - 0x00000000, 0x00100000, 0x00000800, 0x00100800, - 0x00000000, 0x00100000, 0x00000800, 0x00100800, - 0x04000000, 0x04100000, 0x04000800, 0x04100800, - 0x04000000, 0x04100000, 0x04000800, 0x04100800, - 0x00000004, 0x00100004, 0x00000804, 0x00100804, - 0x00000004, 0x00100004, 0x00000804, 0x00100804, - 0x04000004, 0x04100004, 0x04000804, 0x04100804, - 0x04000004, 0x04100004, 0x04000804, 0x04100804, - 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, - 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, - 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, - 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, - 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, - 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, - 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, - 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, - 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, - 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, - 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, - 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, - 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, - 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, - 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, - 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, - 0x00020000, 0x00120000, 0x00020800, 0x00120800, - 0x00020000, 0x00120000, 0x00020800, 0x00120800, - 0x04020000, 0x04120000, 0x04020800, 0x04120800, - 0x04020000, 0x04120000, 0x04020800, 0x04120800, - 0x00020004, 0x00120004, 0x00020804, 0x00120804, - 0x00020004, 0x00120004, 0x00020804, 0x00120804, - 0x04020004, 0x04120004, 0x04020804, 0x04120804, - 0x04020004, 0x04120004, 0x04020804, 0x04120804, - 0x00020000, 0x00120000, 0x00020800, 0x00120800, - 0x00020000, 0x00120000, 0x00020800, 0x00120800, - 0x04020000, 0x04120000, 0x04020800, 0x04120800, - 0x04020000, 0x04120000, 0x04020800, 0x04120800, - 0x00020004, 0x00120004, 0x00020804, 0x00120804, - 0x00020004, 0x00120004, 0x00020804, 0x00120804, - 0x04020004, 0x04120004, 0x04020804, 0x04120804, - 0x04020004, 0x04120004, 0x04020804, 0x04120804, - 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, - 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, - 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, - 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, - 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, - 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, - 0x04020204, 0x04120204, 0x04020A04, 0x04120A04, - 0x04020204, 0x04120204, 0x04020A04, 0x04120A04, - 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, - 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, - 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, - 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, - 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, - 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, - 0x04020204, 0x04120204, 0x04020A04, 0x04120A04, - 0x04020204, 0x04120204, 0x04020A04, 0x04120A04 - ); - static $pc2mapd3 = array( - 0x00000000, 0x00010000, 0x02000000, 0x02010000, - 0x00000020, 0x00010020, 0x02000020, 0x02010020, - 0x00040000, 0x00050000, 0x02040000, 0x02050000, - 0x00040020, 0x00050020, 0x02040020, 0x02050020, - 0x00002000, 0x00012000, 0x02002000, 0x02012000, - 0x00002020, 0x00012020, 0x02002020, 0x02012020, - 0x00042000, 0x00052000, 0x02042000, 0x02052000, - 0x00042020, 0x00052020, 0x02042020, 0x02052020, - 0x00000000, 0x00010000, 0x02000000, 0x02010000, - 0x00000020, 0x00010020, 0x02000020, 0x02010020, - 0x00040000, 0x00050000, 0x02040000, 0x02050000, - 0x00040020, 0x00050020, 0x02040020, 0x02050020, - 0x00002000, 0x00012000, 0x02002000, 0x02012000, - 0x00002020, 0x00012020, 0x02002020, 0x02012020, - 0x00042000, 0x00052000, 0x02042000, 0x02052000, - 0x00042020, 0x00052020, 0x02042020, 0x02052020, - 0x00000010, 0x00010010, 0x02000010, 0x02010010, - 0x00000030, 0x00010030, 0x02000030, 0x02010030, - 0x00040010, 0x00050010, 0x02040010, 0x02050010, - 0x00040030, 0x00050030, 0x02040030, 0x02050030, - 0x00002010, 0x00012010, 0x02002010, 0x02012010, - 0x00002030, 0x00012030, 0x02002030, 0x02012030, - 0x00042010, 0x00052010, 0x02042010, 0x02052010, - 0x00042030, 0x00052030, 0x02042030, 0x02052030, - 0x00000010, 0x00010010, 0x02000010, 0x02010010, - 0x00000030, 0x00010030, 0x02000030, 0x02010030, - 0x00040010, 0x00050010, 0x02040010, 0x02050010, - 0x00040030, 0x00050030, 0x02040030, 0x02050030, - 0x00002010, 0x00012010, 0x02002010, 0x02012010, - 0x00002030, 0x00012030, 0x02002030, 0x02012030, - 0x00042010, 0x00052010, 0x02042010, 0x02052010, - 0x00042030, 0x00052030, 0x02042030, 0x02052030, - 0x20000000, 0x20010000, 0x22000000, 0x22010000, - 0x20000020, 0x20010020, 0x22000020, 0x22010020, - 0x20040000, 0x20050000, 0x22040000, 0x22050000, - 0x20040020, 0x20050020, 0x22040020, 0x22050020, - 0x20002000, 0x20012000, 0x22002000, 0x22012000, - 0x20002020, 0x20012020, 0x22002020, 0x22012020, - 0x20042000, 0x20052000, 0x22042000, 0x22052000, - 0x20042020, 0x20052020, 0x22042020, 0x22052020, - 0x20000000, 0x20010000, 0x22000000, 0x22010000, - 0x20000020, 0x20010020, 0x22000020, 0x22010020, - 0x20040000, 0x20050000, 0x22040000, 0x22050000, - 0x20040020, 0x20050020, 0x22040020, 0x22050020, - 0x20002000, 0x20012000, 0x22002000, 0x22012000, - 0x20002020, 0x20012020, 0x22002020, 0x22012020, - 0x20042000, 0x20052000, 0x22042000, 0x22052000, - 0x20042020, 0x20052020, 0x22042020, 0x22052020, - 0x20000010, 0x20010010, 0x22000010, 0x22010010, - 0x20000030, 0x20010030, 0x22000030, 0x22010030, - 0x20040010, 0x20050010, 0x22040010, 0x22050010, - 0x20040030, 0x20050030, 0x22040030, 0x22050030, - 0x20002010, 0x20012010, 0x22002010, 0x22012010, - 0x20002030, 0x20012030, 0x22002030, 0x22012030, - 0x20042010, 0x20052010, 0x22042010, 0x22052010, - 0x20042030, 0x20052030, 0x22042030, 0x22052030, - 0x20000010, 0x20010010, 0x22000010, 0x22010010, - 0x20000030, 0x20010030, 0x22000030, 0x22010030, - 0x20040010, 0x20050010, 0x22040010, 0x22050010, - 0x20040030, 0x20050030, 0x22040030, 0x22050030, - 0x20002010, 0x20012010, 0x22002010, 0x22012010, - 0x20002030, 0x20012030, 0x22002030, 0x22012030, - 0x20042010, 0x20052010, 0x22042010, 0x22052010, - 0x20042030, 0x20052030, 0x22042030, 0x22052030 - ); - static $pc2mapd4 = array( - 0x00000000, 0x00000400, 0x01000000, 0x01000400, - 0x00000000, 0x00000400, 0x01000000, 0x01000400, - 0x00000100, 0x00000500, 0x01000100, 0x01000500, - 0x00000100, 0x00000500, 0x01000100, 0x01000500, - 0x10000000, 0x10000400, 0x11000000, 0x11000400, - 0x10000000, 0x10000400, 0x11000000, 0x11000400, - 0x10000100, 0x10000500, 0x11000100, 0x11000500, - 0x10000100, 0x10000500, 0x11000100, 0x11000500, - 0x00080000, 0x00080400, 0x01080000, 0x01080400, - 0x00080000, 0x00080400, 0x01080000, 0x01080400, - 0x00080100, 0x00080500, 0x01080100, 0x01080500, - 0x00080100, 0x00080500, 0x01080100, 0x01080500, - 0x10080000, 0x10080400, 0x11080000, 0x11080400, - 0x10080000, 0x10080400, 0x11080000, 0x11080400, - 0x10080100, 0x10080500, 0x11080100, 0x11080500, - 0x10080100, 0x10080500, 0x11080100, 0x11080500, - 0x00000008, 0x00000408, 0x01000008, 0x01000408, - 0x00000008, 0x00000408, 0x01000008, 0x01000408, - 0x00000108, 0x00000508, 0x01000108, 0x01000508, - 0x00000108, 0x00000508, 0x01000108, 0x01000508, - 0x10000008, 0x10000408, 0x11000008, 0x11000408, - 0x10000008, 0x10000408, 0x11000008, 0x11000408, - 0x10000108, 0x10000508, 0x11000108, 0x11000508, - 0x10000108, 0x10000508, 0x11000108, 0x11000508, - 0x00080008, 0x00080408, 0x01080008, 0x01080408, - 0x00080008, 0x00080408, 0x01080008, 0x01080408, - 0x00080108, 0x00080508, 0x01080108, 0x01080508, - 0x00080108, 0x00080508, 0x01080108, 0x01080508, - 0x10080008, 0x10080408, 0x11080008, 0x11080408, - 0x10080008, 0x10080408, 0x11080008, 0x11080408, - 0x10080108, 0x10080508, 0x11080108, 0x11080508, - 0x10080108, 0x10080508, 0x11080108, 0x11080508, - 0x00001000, 0x00001400, 0x01001000, 0x01001400, - 0x00001000, 0x00001400, 0x01001000, 0x01001400, - 0x00001100, 0x00001500, 0x01001100, 0x01001500, - 0x00001100, 0x00001500, 0x01001100, 0x01001500, - 0x10001000, 0x10001400, 0x11001000, 0x11001400, - 0x10001000, 0x10001400, 0x11001000, 0x11001400, - 0x10001100, 0x10001500, 0x11001100, 0x11001500, - 0x10001100, 0x10001500, 0x11001100, 0x11001500, - 0x00081000, 0x00081400, 0x01081000, 0x01081400, - 0x00081000, 0x00081400, 0x01081000, 0x01081400, - 0x00081100, 0x00081500, 0x01081100, 0x01081500, - 0x00081100, 0x00081500, 0x01081100, 0x01081500, - 0x10081000, 0x10081400, 0x11081000, 0x11081400, - 0x10081000, 0x10081400, 0x11081000, 0x11081400, - 0x10081100, 0x10081500, 0x11081100, 0x11081500, - 0x10081100, 0x10081500, 0x11081100, 0x11081500, - 0x00001008, 0x00001408, 0x01001008, 0x01001408, - 0x00001008, 0x00001408, 0x01001008, 0x01001408, - 0x00001108, 0x00001508, 0x01001108, 0x01001508, - 0x00001108, 0x00001508, 0x01001108, 0x01001508, - 0x10001008, 0x10001408, 0x11001008, 0x11001408, - 0x10001008, 0x10001408, 0x11001008, 0x11001408, - 0x10001108, 0x10001508, 0x11001108, 0x11001508, - 0x10001108, 0x10001508, 0x11001108, 0x11001508, - 0x00081008, 0x00081408, 0x01081008, 0x01081408, - 0x00081008, 0x00081408, 0x01081008, 0x01081408, - 0x00081108, 0x00081508, 0x01081108, 0x01081508, - 0x00081108, 0x00081508, 0x01081108, 0x01081508, - 0x10081008, 0x10081408, 0x11081008, 0x11081408, - 0x10081008, 0x10081408, 0x11081008, 0x11081408, - 0x10081108, 0x10081508, 0x11081108, 0x11081508, - 0x10081108, 0x10081508, 0x11081108, 0x11081508 - ); - - $keys = array(); - for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) { - // pad the key and remove extra characters as appropriate. - $key = str_pad(substr($this->key, $des_round * 8, 8), 8, "\0"); - - // Perform the PC/1 transformation and compute C and D. - $t = unpack('Nl/Nr', $key); - list($l, $r) = array($t['l'], $t['r']); - $key = ($this->shuffle[$pc1map[ $r & 0xFF]] & "\x80\x80\x80\x80\x80\x80\x80\x00") | - ($this->shuffle[$pc1map[($r >> 8) & 0xFF]] & "\x40\x40\x40\x40\x40\x40\x40\x00") | - ($this->shuffle[$pc1map[($r >> 16) & 0xFF]] & "\x20\x20\x20\x20\x20\x20\x20\x00") | - ($this->shuffle[$pc1map[($r >> 24) & 0xFF]] & "\x10\x10\x10\x10\x10\x10\x10\x00") | - ($this->shuffle[$pc1map[ $l & 0xFF]] & "\x08\x08\x08\x08\x08\x08\x08\x00") | - ($this->shuffle[$pc1map[($l >> 8) & 0xFF]] & "\x04\x04\x04\x04\x04\x04\x04\x00") | - ($this->shuffle[$pc1map[($l >> 16) & 0xFF]] & "\x02\x02\x02\x02\x02\x02\x02\x00") | - ($this->shuffle[$pc1map[($l >> 24) & 0xFF]] & "\x01\x01\x01\x01\x01\x01\x01\x00"); - $key = unpack('Nc/Nd', $key); - $c = ( $key['c'] >> 4) & 0x0FFFFFFF; - $d = (($key['d'] >> 4) & 0x0FFFFFF0) | ($key['c'] & 0x0F); - - $keys[$des_round] = array( - CRYPT_DES_ENCRYPT => array(), - CRYPT_DES_DECRYPT => array_fill(0, 32, 0) - ); - for ($i = 0, $ki = 31; $i < 16; ++$i, $ki-= 2) { - $c <<= $shifts[$i]; - $c = ($c | ($c >> 28)) & 0x0FFFFFFF; - $d <<= $shifts[$i]; - $d = ($d | ($d >> 28)) & 0x0FFFFFFF; - - // Perform the PC-2 transformation. - $cp = $pc2mapc1[ $c >> 24 ] | $pc2mapc2[($c >> 16) & 0xFF] | - $pc2mapc3[($c >> 8) & 0xFF] | $pc2mapc4[ $c & 0xFF]; - $dp = $pc2mapd1[ $d >> 24 ] | $pc2mapd2[($d >> 16) & 0xFF] | - $pc2mapd3[($d >> 8) & 0xFF] | $pc2mapd4[ $d & 0xFF]; - - // Reorder: odd bytes/even bytes. Push the result in key schedule. - $val1 = ( $cp & 0xFF000000) | (($cp << 8) & 0x00FF0000) | - (($dp >> 16) & 0x0000FF00) | (($dp >> 8) & 0x000000FF); - $val2 = (($cp << 8) & 0xFF000000) | (($cp << 16) & 0x00FF0000) | - (($dp >> 8) & 0x0000FF00) | ( $dp & 0x000000FF); - $keys[$des_round][CRYPT_DES_ENCRYPT][ ] = $val1; - $keys[$des_round][CRYPT_DES_DECRYPT][$ki - 1] = $val1; - $keys[$des_round][CRYPT_DES_ENCRYPT][ ] = $val2; - $keys[$des_round][CRYPT_DES_DECRYPT][$ki ] = $val2; - } - } - - switch ($this->des_rounds) { - case 3: // 3DES keys - $this->keys = array( - CRYPT_DES_ENCRYPT => array_merge( - $keys[0][CRYPT_DES_ENCRYPT], - $keys[1][CRYPT_DES_DECRYPT], - $keys[2][CRYPT_DES_ENCRYPT] - ), - CRYPT_DES_DECRYPT => array_merge( - $keys[2][CRYPT_DES_DECRYPT], - $keys[1][CRYPT_DES_ENCRYPT], - $keys[0][CRYPT_DES_DECRYPT] - ) - ); - break; - // case 1: // DES keys - default: - $this->keys = array( - CRYPT_DES_ENCRYPT => $keys[0][CRYPT_DES_ENCRYPT], - CRYPT_DES_DECRYPT => $keys[0][CRYPT_DES_DECRYPT] - ); - } - } - - /** - * Setup the performance-optimized function for de/encrypt() - * - * @see Crypt_Base::_setupInlineCrypt() - * @access private - */ - function _setupInlineCrypt() - { - $lambda_functions =& Crypt_DES::_getLambdaFunctions(); - - // Engine configuration for: - // - DES ($des_rounds == 1) or - // - 3DES ($des_rounds == 3) - $des_rounds = $this->des_rounds; - - // We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function. - // After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one - $gen_hi_opt_code = (bool)( count($lambda_functions) < 10 ); - - // Generation of a uniqe hash for our generated code - switch (true) { - case $gen_hi_opt_code: - // For hi-optimized code, we create for each combination of - // $mode, $des_rounds and $this->key its own encrypt/decrypt function. - $code_hash = md5(str_pad("Crypt_DES, $des_rounds, {$this->mode}, ", 32, "\0") . $this->key); - break; - default: - // After max 10 hi-optimized functions, we create generic - // (still very fast.. but not ultra) functions for each $mode/$des_rounds - // Currently 2 * 5 generic functions will be then max. possible. - $code_hash = "Crypt_DES, $des_rounds, {$this->mode}"; - } - - // Is there a re-usable $lambda_functions in there? If not, we have to create it. - if (!isset($lambda_functions[$code_hash])) { - // Init code for both, encrypt and decrypt. - $init_crypt = 'static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip; - if (!$sbox1) { - $sbox1 = array_map("intval", $self->sbox1); - $sbox2 = array_map("intval", $self->sbox2); - $sbox3 = array_map("intval", $self->sbox3); - $sbox4 = array_map("intval", $self->sbox4); - $sbox5 = array_map("intval", $self->sbox5); - $sbox6 = array_map("intval", $self->sbox6); - $sbox7 = array_map("intval", $self->sbox7); - $sbox8 = array_map("intval", $self->sbox8);' - /* Merge $shuffle with $[inv]ipmap */ . ' - for ($i = 0; $i < 256; ++$i) { - $shuffleip[] = $self->shuffle[$self->ipmap[$i]]; - $shuffleinvip[] = $self->shuffle[$self->invipmap[$i]]; - } - } - '; - - switch (true) { - case $gen_hi_opt_code: - // In Hi-optimized code mode, we use our [3]DES key schedule as hardcoded integers. - // No futher initialisation of the $keys schedule is necessary. - // That is the extra performance boost. - $k = array( - CRYPT_DES_ENCRYPT => $this->keys[CRYPT_DES_ENCRYPT], - CRYPT_DES_DECRYPT => $this->keys[CRYPT_DES_DECRYPT] - ); - $init_encrypt = ''; - $init_decrypt = ''; - break; - default: - // In generic optimized code mode, we have to use, as the best compromise [currently], - // our key schedule as $ke/$kd arrays. (with hardcoded indexes...) - $k = array( - CRYPT_DES_ENCRYPT => array(), - CRYPT_DES_DECRYPT => array() - ); - for ($i = 0, $c = count($this->keys[CRYPT_DES_ENCRYPT]); $i < $c; ++$i) { - $k[CRYPT_DES_ENCRYPT][$i] = '$ke[' . $i . ']'; - $k[CRYPT_DES_DECRYPT][$i] = '$kd[' . $i . ']'; - } - $init_encrypt = '$ke = $self->keys[CRYPT_DES_ENCRYPT];'; - $init_decrypt = '$kd = $self->keys[CRYPT_DES_DECRYPT];'; - break; - } - - // Creating code for en- and decryption. - $crypt_block = array(); - foreach (array(CRYPT_DES_ENCRYPT, CRYPT_DES_DECRYPT) as $c) { - - /* Do the initial IP permutation. */ - $crypt_block[$c] = ' - $in = unpack("N*", $in); - $l = $in[1]; - $r = $in[2]; - $in = unpack("N*", - ($shuffleip[ $r & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | - ($shuffleip[($r >> 8) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | - ($shuffleip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | - ($shuffleip[($r >> 24) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | - ($shuffleip[ $l & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | - ($shuffleip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | - ($shuffleip[($l >> 16) & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | - ($shuffleip[($l >> 24) & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01") - ); - ' . /* Extract L0 and R0 */ ' - $l = $in[1]; - $r = $in[2]; - '; - - $l = '$l'; - $r = '$r'; - - // Perform DES or 3DES. - for ($ki = -1, $des_round = 0; $des_round < $des_rounds; ++$des_round) { - // Perform the 16 steps. - for ($i = 0; $i < 16; ++$i) { - // start of "the Feistel (F) function" - see the following URL: - // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png - // Merge key schedule. - $crypt_block[$c].= ' - $b1 = ((' . $r . ' >> 3) & 0x1FFFFFFF) ^ (' . $r . ' << 29) ^ ' . $k[$c][++$ki] . '; - $b2 = ((' . $r . ' >> 31) & 0x00000001) ^ (' . $r . ' << 1) ^ ' . $k[$c][++$ki] . ';' . - /* S-box indexing. */ - $l . ' = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^ - $sbox3[($b1 >> 16) & 0x3F] ^ $sbox4[($b2 >> 16) & 0x3F] ^ - $sbox5[($b1 >> 8) & 0x3F] ^ $sbox6[($b2 >> 8) & 0x3F] ^ - $sbox7[ $b1 & 0x3F] ^ $sbox8[ $b2 & 0x3F] ^ ' . $l . '; - '; - // end of "the Feistel (F) function" - - // swap L & R - list($l, $r) = array($r, $l); - } - list($l, $r) = array($r, $l); - } - - // Perform the inverse IP permutation. - $crypt_block[$c].= '$in = - ($shuffleinvip[($l >> 24) & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | - ($shuffleinvip[($r >> 24) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | - ($shuffleinvip[($l >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | - ($shuffleinvip[($r >> 16) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | - ($shuffleinvip[($l >> 8) & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | - ($shuffleinvip[($r >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | - ($shuffleinvip[ $l & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | - ($shuffleinvip[ $r & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01"); - '; - } - - // Creates the inline-crypt function - $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( - array( - 'init_crypt' => $init_crypt, - 'init_encrypt' => $init_encrypt, - 'init_decrypt' => $init_decrypt, - 'encrypt_block' => $crypt_block[CRYPT_DES_ENCRYPT], - 'decrypt_block' => $crypt_block[CRYPT_DES_DECRYPT] - ) - ); - } - - // Set the inline-crypt function as callback in: $this->inline_crypt - $this->inline_crypt = $lambda_functions[$code_hash]; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Hash.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Hash.php deleted file mode 100755 index 4ab75b2d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Hash.php +++ /dev/null @@ -1,841 +0,0 @@ - - * setKey('abcdefg'); - * - * echo base64_encode($hash->hash('abcdefg')); - * ?> - * - * - * LICENSE: 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. - * - * @category Crypt - * @package Crypt_Hash - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/**#@+ - * @access private - * @see Crypt_Hash::Crypt_Hash() - */ -/** - * Toggles the internal implementation - */ -define('CRYPT_HASH_MODE_INTERNAL', 1); -/** - * Toggles the mhash() implementation, which has been deprecated on PHP 5.3.0+. - */ -define('CRYPT_HASH_MODE_MHASH', 2); -/** - * Toggles the hash() implementation, which works on PHP 5.1.2+. - */ -define('CRYPT_HASH_MODE_HASH', 3); -/**#@-*/ - -/** - * Pure-PHP implementations of keyed-hash message authentication codes (HMACs) and various cryptographic hashing functions. - * - * @package Crypt_Hash - * @author Jim Wigginton - * @access public - */ -class Crypt_Hash -{ - /** - * Hash Parameter - * - * @see Crypt_Hash::setHash() - * @var Integer - * @access private - */ - var $hashParam; - - /** - * Byte-length of compression blocks / key (Internal HMAC) - * - * @see Crypt_Hash::setAlgorithm() - * @var Integer - * @access private - */ - var $b; - - /** - * Byte-length of hash output (Internal HMAC) - * - * @see Crypt_Hash::setHash() - * @var Integer - * @access private - */ - var $l = false; - - /** - * Hash Algorithm - * - * @see Crypt_Hash::setHash() - * @var String - * @access private - */ - var $hash; - - /** - * Key - * - * @see Crypt_Hash::setKey() - * @var String - * @access private - */ - var $key = false; - - /** - * Outer XOR (Internal HMAC) - * - * @see Crypt_Hash::setKey() - * @var String - * @access private - */ - var $opad; - - /** - * Inner XOR (Internal HMAC) - * - * @see Crypt_Hash::setKey() - * @var String - * @access private - */ - var $ipad; - - /** - * Default Constructor. - * - * @param optional String $hash - * @return Crypt_Hash - * @access public - */ - function Crypt_Hash($hash = 'sha1') - { - if ( !defined('CRYPT_HASH_MODE') ) { - switch (true) { - case extension_loaded('hash'): - define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_HASH); - break; - case extension_loaded('mhash'): - define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_MHASH); - break; - default: - define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_INTERNAL); - } - } - - $this->setHash($hash); - } - - /** - * Sets the key for HMACs - * - * Keys can be of any length. - * - * @access public - * @param optional String $key - */ - function setKey($key = false) - { - $this->key = $key; - } - - /** - * Gets the hash function. - * - * As set by the constructor or by the setHash() method. - * - * @access public - * @return String - */ - function getHash() - { - return $this->hashParam; - } - - /** - * Sets the hash function. - * - * @access public - * @param String $hash - */ - function setHash($hash) - { - $this->hashParam = $hash = strtolower($hash); - switch ($hash) { - case 'md5-96': - case 'sha1-96': - case 'sha256-96': - case 'sha512-96': - $hash = substr($hash, 0, -3); - $this->l = 12; // 96 / 8 = 12 - break; - case 'md2': - case 'md5': - $this->l = 16; - break; - case 'sha1': - $this->l = 20; - break; - case 'sha256': - $this->l = 32; - break; - case 'sha384': - $this->l = 48; - break; - case 'sha512': - $this->l = 64; - } - - switch ($hash) { - case 'md2': - $mode = CRYPT_HASH_MODE == CRYPT_HASH_MODE_HASH && in_array('md2', hash_algos()) ? - CRYPT_HASH_MODE_HASH : CRYPT_HASH_MODE_INTERNAL; - break; - case 'sha384': - case 'sha512': - $mode = CRYPT_HASH_MODE == CRYPT_HASH_MODE_MHASH ? CRYPT_HASH_MODE_INTERNAL : CRYPT_HASH_MODE; - break; - default: - $mode = CRYPT_HASH_MODE; - } - - switch ( $mode ) { - case CRYPT_HASH_MODE_MHASH: - switch ($hash) { - case 'md5': - $this->hash = MHASH_MD5; - break; - case 'sha256': - $this->hash = MHASH_SHA256; - break; - case 'sha1': - default: - $this->hash = MHASH_SHA1; - } - return; - case CRYPT_HASH_MODE_HASH: - switch ($hash) { - case 'md5': - $this->hash = 'md5'; - return; - case 'md2': - case 'sha256': - case 'sha384': - case 'sha512': - $this->hash = $hash; - return; - case 'sha1': - default: - $this->hash = 'sha1'; - } - return; - } - - switch ($hash) { - case 'md2': - $this->b = 16; - $this->hash = array($this, '_md2'); - break; - case 'md5': - $this->b = 64; - $this->hash = array($this, '_md5'); - break; - case 'sha256': - $this->b = 64; - $this->hash = array($this, '_sha256'); - break; - case 'sha384': - case 'sha512': - $this->b = 128; - $this->hash = array($this, '_sha512'); - break; - case 'sha1': - default: - $this->b = 64; - $this->hash = array($this, '_sha1'); - } - - $this->ipad = str_repeat(chr(0x36), $this->b); - $this->opad = str_repeat(chr(0x5C), $this->b); - } - - /** - * Compute the HMAC. - * - * @access public - * @param String $text - * @return String - */ - function hash($text) - { - $mode = is_array($this->hash) ? CRYPT_HASH_MODE_INTERNAL : CRYPT_HASH_MODE; - - if (!empty($this->key) || is_string($this->key)) { - switch ( $mode ) { - case CRYPT_HASH_MODE_MHASH: - $output = mhash($this->hash, $text, $this->key); - break; - case CRYPT_HASH_MODE_HASH: - $output = hash_hmac($this->hash, $text, $this->key, true); - break; - case CRYPT_HASH_MODE_INTERNAL: - /* "Applications that use keys longer than B bytes will first hash the key using H and then use the - resultant L byte string as the actual key to HMAC." - - -- http://tools.ietf.org/html/rfc2104#section-2 */ - $key = strlen($this->key) > $this->b ? call_user_func($this->hash, $this->key) : $this->key; - - $key = str_pad($key, $this->b, chr(0)); // step 1 - $temp = $this->ipad ^ $key; // step 2 - $temp .= $text; // step 3 - $temp = call_user_func($this->hash, $temp); // step 4 - $output = $this->opad ^ $key; // step 5 - $output.= $temp; // step 6 - $output = call_user_func($this->hash, $output); // step 7 - } - } else { - switch ( $mode ) { - case CRYPT_HASH_MODE_MHASH: - $output = mhash($this->hash, $text); - break; - case CRYPT_HASH_MODE_HASH: - $output = hash($this->hash, $text, true); - break; - case CRYPT_HASH_MODE_INTERNAL: - $output = call_user_func($this->hash, $text); - } - } - - return substr($output, 0, $this->l); - } - - /** - * Returns the hash length (in bytes) - * - * @access public - * @return Integer - */ - function getLength() - { - return $this->l; - } - - /** - * Wrapper for MD5 - * - * @access private - * @param String $m - */ - function _md5($m) - { - return pack('H*', md5($m)); - } - - /** - * Wrapper for SHA1 - * - * @access private - * @param String $m - */ - function _sha1($m) - { - return pack('H*', sha1($m)); - } - - /** - * Pure-PHP implementation of MD2 - * - * See {@link http://tools.ietf.org/html/rfc1319 RFC1319}. - * - * @access private - * @param String $m - */ - function _md2($m) - { - static $s = array( - 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6, - 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188, - 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24, - 138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251, - 245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63, - 148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50, - 39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165, - 181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210, - 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157, - 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27, - 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15, - 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197, - 234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65, - 129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123, - 8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233, - 203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228, - 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237, - 31, 26, 219, 153, 141, 51, 159, 17, 131, 20 - ); - - // Step 1. Append Padding Bytes - $pad = 16 - (strlen($m) & 0xF); - $m.= str_repeat(chr($pad), $pad); - - $length = strlen($m); - - // Step 2. Append Checksum - $c = str_repeat(chr(0), 16); - $l = chr(0); - for ($i = 0; $i < $length; $i+= 16) { - for ($j = 0; $j < 16; $j++) { - // RFC1319 incorrectly states that C[j] should be set to S[c xor L] - //$c[$j] = chr($s[ord($m[$i + $j] ^ $l)]); - // per , however, C[j] should be set to S[c xor L] xor C[j] - $c[$j] = chr($s[ord($m[$i + $j] ^ $l)] ^ ord($c[$j])); - $l = $c[$j]; - } - } - $m.= $c; - - $length+= 16; - - // Step 3. Initialize MD Buffer - $x = str_repeat(chr(0), 48); - - // Step 4. Process Message in 16-Byte Blocks - for ($i = 0; $i < $length; $i+= 16) { - for ($j = 0; $j < 16; $j++) { - $x[$j + 16] = $m[$i + $j]; - $x[$j + 32] = $x[$j + 16] ^ $x[$j]; - } - $t = chr(0); - for ($j = 0; $j < 18; $j++) { - for ($k = 0; $k < 48; $k++) { - $x[$k] = $t = $x[$k] ^ chr($s[ord($t)]); - //$t = $x[$k] = $x[$k] ^ chr($s[ord($t)]); - } - $t = chr(ord($t) + $j); - } - } - - // Step 5. Output - return substr($x, 0, 16); - } - - /** - * Pure-PHP implementation of SHA256 - * - * See {@link http://en.wikipedia.org/wiki/SHA_hash_functions#SHA-256_.28a_SHA-2_variant.29_pseudocode SHA-256 (a SHA-2 variant) pseudocode - Wikipedia}. - * - * @access private - * @param String $m - */ - function _sha256($m) - { - if (extension_loaded('suhosin')) { - return pack('H*', sha256($m)); - } - - // Initialize variables - $hash = array( - 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 - ); - // Initialize table of round constants - // (first 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311) - static $k = array( - 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 - ); - - // Pre-processing - $length = strlen($m); - // to round to nearest 56 mod 64, we'll add 64 - (length + (64 - 56)) % 64 - $m.= str_repeat(chr(0), 64 - (($length + 8) & 0x3F)); - $m[$length] = chr(0x80); - // we don't support hashing strings 512MB long - $m.= pack('N2', 0, $length << 3); - - // Process the message in successive 512-bit chunks - $chunks = str_split($m, 64); - foreach ($chunks as $chunk) { - $w = array(); - for ($i = 0; $i < 16; $i++) { - extract(unpack('Ntemp', $this->_string_shift($chunk, 4))); - $w[] = $temp; - } - - // Extend the sixteen 32-bit words into sixty-four 32-bit words - for ($i = 16; $i < 64; $i++) { - $s0 = $this->_rightRotate($w[$i - 15], 7) ^ - $this->_rightRotate($w[$i - 15], 18) ^ - $this->_rightShift( $w[$i - 15], 3); - $s1 = $this->_rightRotate($w[$i - 2], 17) ^ - $this->_rightRotate($w[$i - 2], 19) ^ - $this->_rightShift( $w[$i - 2], 10); - $w[$i] = $this->_add($w[$i - 16], $s0, $w[$i - 7], $s1); - - } - - // Initialize hash value for this chunk - list($a, $b, $c, $d, $e, $f, $g, $h) = $hash; - - // Main loop - for ($i = 0; $i < 64; $i++) { - $s0 = $this->_rightRotate($a, 2) ^ - $this->_rightRotate($a, 13) ^ - $this->_rightRotate($a, 22); - $maj = ($a & $b) ^ - ($a & $c) ^ - ($b & $c); - $t2 = $this->_add($s0, $maj); - - $s1 = $this->_rightRotate($e, 6) ^ - $this->_rightRotate($e, 11) ^ - $this->_rightRotate($e, 25); - $ch = ($e & $f) ^ - ($this->_not($e) & $g); - $t1 = $this->_add($h, $s1, $ch, $k[$i], $w[$i]); - - $h = $g; - $g = $f; - $f = $e; - $e = $this->_add($d, $t1); - $d = $c; - $c = $b; - $b = $a; - $a = $this->_add($t1, $t2); - } - - // Add this chunk's hash to result so far - $hash = array( - $this->_add($hash[0], $a), - $this->_add($hash[1], $b), - $this->_add($hash[2], $c), - $this->_add($hash[3], $d), - $this->_add($hash[4], $e), - $this->_add($hash[5], $f), - $this->_add($hash[6], $g), - $this->_add($hash[7], $h) - ); - } - - // Produce the final hash value (big-endian) - return pack('N8', $hash[0], $hash[1], $hash[2], $hash[3], $hash[4], $hash[5], $hash[6], $hash[7]); - } - - /** - * Pure-PHP implementation of SHA384 and SHA512 - * - * @access private - * @param String $m - */ - function _sha512($m) - { - if (!class_exists('Math_BigInteger')) { - include_once 'Math/BigInteger.php'; - } - - static $init384, $init512, $k; - - if (!isset($k)) { - // Initialize variables - $init384 = array( // initial values for SHA384 - 'cbbb9d5dc1059ed8', '629a292a367cd507', '9159015a3070dd17', '152fecd8f70e5939', - '67332667ffc00b31', '8eb44a8768581511', 'db0c2e0d64f98fa7', '47b5481dbefa4fa4' - ); - $init512 = array( // initial values for SHA512 - '6a09e667f3bcc908', 'bb67ae8584caa73b', '3c6ef372fe94f82b', 'a54ff53a5f1d36f1', - '510e527fade682d1', '9b05688c2b3e6c1f', '1f83d9abfb41bd6b', '5be0cd19137e2179' - ); - - for ($i = 0; $i < 8; $i++) { - $init384[$i] = new Math_BigInteger($init384[$i], 16); - $init384[$i]->setPrecision(64); - $init512[$i] = new Math_BigInteger($init512[$i], 16); - $init512[$i]->setPrecision(64); - } - - // Initialize table of round constants - // (first 64 bits of the fractional parts of the cube roots of the first 80 primes 2..409) - $k = array( - '428a2f98d728ae22', '7137449123ef65cd', 'b5c0fbcfec4d3b2f', 'e9b5dba58189dbbc', - '3956c25bf348b538', '59f111f1b605d019', '923f82a4af194f9b', 'ab1c5ed5da6d8118', - 'd807aa98a3030242', '12835b0145706fbe', '243185be4ee4b28c', '550c7dc3d5ffb4e2', - '72be5d74f27b896f', '80deb1fe3b1696b1', '9bdc06a725c71235', 'c19bf174cf692694', - 'e49b69c19ef14ad2', 'efbe4786384f25e3', '0fc19dc68b8cd5b5', '240ca1cc77ac9c65', - '2de92c6f592b0275', '4a7484aa6ea6e483', '5cb0a9dcbd41fbd4', '76f988da831153b5', - '983e5152ee66dfab', 'a831c66d2db43210', 'b00327c898fb213f', 'bf597fc7beef0ee4', - 'c6e00bf33da88fc2', 'd5a79147930aa725', '06ca6351e003826f', '142929670a0e6e70', - '27b70a8546d22ffc', '2e1b21385c26c926', '4d2c6dfc5ac42aed', '53380d139d95b3df', - '650a73548baf63de', '766a0abb3c77b2a8', '81c2c92e47edaee6', '92722c851482353b', - 'a2bfe8a14cf10364', 'a81a664bbc423001', 'c24b8b70d0f89791', 'c76c51a30654be30', - 'd192e819d6ef5218', 'd69906245565a910', 'f40e35855771202a', '106aa07032bbd1b8', - '19a4c116b8d2d0c8', '1e376c085141ab53', '2748774cdf8eeb99', '34b0bcb5e19b48a8', - '391c0cb3c5c95a63', '4ed8aa4ae3418acb', '5b9cca4f7763e373', '682e6ff3d6b2b8a3', - '748f82ee5defb2fc', '78a5636f43172f60', '84c87814a1f0ab72', '8cc702081a6439ec', - '90befffa23631e28', 'a4506cebde82bde9', 'bef9a3f7b2c67915', 'c67178f2e372532b', - 'ca273eceea26619c', 'd186b8c721c0c207', 'eada7dd6cde0eb1e', 'f57d4f7fee6ed178', - '06f067aa72176fba', '0a637dc5a2c898a6', '113f9804bef90dae', '1b710b35131c471b', - '28db77f523047d84', '32caab7b40c72493', '3c9ebe0a15c9bebc', '431d67c49c100d4c', - '4cc5d4becb3e42b6', '597f299cfc657e2a', '5fcb6fab3ad6faec', '6c44198c4a475817' - ); - - for ($i = 0; $i < 80; $i++) { - $k[$i] = new Math_BigInteger($k[$i], 16); - } - } - - $hash = $this->l == 48 ? $init384 : $init512; - - // Pre-processing - $length = strlen($m); - // to round to nearest 112 mod 128, we'll add 128 - (length + (128 - 112)) % 128 - $m.= str_repeat(chr(0), 128 - (($length + 16) & 0x7F)); - $m[$length] = chr(0x80); - // we don't support hashing strings 512MB long - $m.= pack('N4', 0, 0, 0, $length << 3); - - // Process the message in successive 1024-bit chunks - $chunks = str_split($m, 128); - foreach ($chunks as $chunk) { - $w = array(); - for ($i = 0; $i < 16; $i++) { - $temp = new Math_BigInteger($this->_string_shift($chunk, 8), 256); - $temp->setPrecision(64); - $w[] = $temp; - } - - // Extend the sixteen 32-bit words into eighty 32-bit words - for ($i = 16; $i < 80; $i++) { - $temp = array( - $w[$i - 15]->bitwise_rightRotate(1), - $w[$i - 15]->bitwise_rightRotate(8), - $w[$i - 15]->bitwise_rightShift(7) - ); - $s0 = $temp[0]->bitwise_xor($temp[1]); - $s0 = $s0->bitwise_xor($temp[2]); - $temp = array( - $w[$i - 2]->bitwise_rightRotate(19), - $w[$i - 2]->bitwise_rightRotate(61), - $w[$i - 2]->bitwise_rightShift(6) - ); - $s1 = $temp[0]->bitwise_xor($temp[1]); - $s1 = $s1->bitwise_xor($temp[2]); - $w[$i] = $w[$i - 16]->copy(); - $w[$i] = $w[$i]->add($s0); - $w[$i] = $w[$i]->add($w[$i - 7]); - $w[$i] = $w[$i]->add($s1); - } - - // Initialize hash value for this chunk - $a = $hash[0]->copy(); - $b = $hash[1]->copy(); - $c = $hash[2]->copy(); - $d = $hash[3]->copy(); - $e = $hash[4]->copy(); - $f = $hash[5]->copy(); - $g = $hash[6]->copy(); - $h = $hash[7]->copy(); - - // Main loop - for ($i = 0; $i < 80; $i++) { - $temp = array( - $a->bitwise_rightRotate(28), - $a->bitwise_rightRotate(34), - $a->bitwise_rightRotate(39) - ); - $s0 = $temp[0]->bitwise_xor($temp[1]); - $s0 = $s0->bitwise_xor($temp[2]); - $temp = array( - $a->bitwise_and($b), - $a->bitwise_and($c), - $b->bitwise_and($c) - ); - $maj = $temp[0]->bitwise_xor($temp[1]); - $maj = $maj->bitwise_xor($temp[2]); - $t2 = $s0->add($maj); - - $temp = array( - $e->bitwise_rightRotate(14), - $e->bitwise_rightRotate(18), - $e->bitwise_rightRotate(41) - ); - $s1 = $temp[0]->bitwise_xor($temp[1]); - $s1 = $s1->bitwise_xor($temp[2]); - $temp = array( - $e->bitwise_and($f), - $g->bitwise_and($e->bitwise_not()) - ); - $ch = $temp[0]->bitwise_xor($temp[1]); - $t1 = $h->add($s1); - $t1 = $t1->add($ch); - $t1 = $t1->add($k[$i]); - $t1 = $t1->add($w[$i]); - - $h = $g->copy(); - $g = $f->copy(); - $f = $e->copy(); - $e = $d->add($t1); - $d = $c->copy(); - $c = $b->copy(); - $b = $a->copy(); - $a = $t1->add($t2); - } - - // Add this chunk's hash to result so far - $hash = array( - $hash[0]->add($a), - $hash[1]->add($b), - $hash[2]->add($c), - $hash[3]->add($d), - $hash[4]->add($e), - $hash[5]->add($f), - $hash[6]->add($g), - $hash[7]->add($h) - ); - } - - // Produce the final hash value (big-endian) - // (Crypt_Hash::hash() trims the output for hashes but not for HMACs. as such, we trim the output here) - $temp = $hash[0]->toBytes() . $hash[1]->toBytes() . $hash[2]->toBytes() . $hash[3]->toBytes() . - $hash[4]->toBytes() . $hash[5]->toBytes(); - if ($this->l != 48) { - $temp.= $hash[6]->toBytes() . $hash[7]->toBytes(); - } - - return $temp; - } - - /** - * Right Rotate - * - * @access private - * @param Integer $int - * @param Integer $amt - * @see _sha256() - * @return Integer - */ - function _rightRotate($int, $amt) - { - $invamt = 32 - $amt; - $mask = (1 << $invamt) - 1; - return (($int << $invamt) & 0xFFFFFFFF) | (($int >> $amt) & $mask); - } - - /** - * Right Shift - * - * @access private - * @param Integer $int - * @param Integer $amt - * @see _sha256() - * @return Integer - */ - function _rightShift($int, $amt) - { - $mask = (1 << (32 - $amt)) - 1; - return ($int >> $amt) & $mask; - } - - /** - * Not - * - * @access private - * @param Integer $int - * @see _sha256() - * @return Integer - */ - function _not($int) - { - return ~$int & 0xFFFFFFFF; - } - - /** - * Add - * - * _sha256() adds multiple unsigned 32-bit integers. Since PHP doesn't support unsigned integers and since the - * possibility of overflow exists, care has to be taken. Math_BigInteger() could be used but this should be faster. - * - * @param Integer $... - * @return Integer - * @see _sha256() - * @access private - */ - function _add() - { - static $mod; - if (!isset($mod)) { - $mod = pow(2, 32); - } - - $result = 0; - $arguments = func_get_args(); - foreach ($arguments as $argument) { - $result+= $argument < 0 ? ($argument & 0x7FFFFFFF) + 0x80000000 : $argument; - } - - return fmod($result, $mod); - } - - /** - * String Shift - * - * Inspired by array_shift - * - * @param String $string - * @param optional Integer $index - * @return String - * @access private - */ - function _string_shift(&$string, $index = 1) - { - $substr = substr($string, 0, $index); - $string = substr($string, $index); - return $substr; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RC2.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RC2.php deleted file mode 100755 index 96c9f18c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RC2.php +++ /dev/null @@ -1,652 +0,0 @@ - - * setKey('abcdefgh'); - * - * $plaintext = str_repeat('a', 1024); - * - * echo $rc2->decrypt($rc2->encrypt($plaintext)); - * ?> - * - * - * LICENSE: 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. - * - * @category Crypt - * @package Crypt_RC2 - * @author Patrick Monnerat - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include Crypt_Base - * - * Base cipher class - */ -if (!class_exists('Crypt_Base')) { - include_once 'Base.php'; -} - -/**#@+ - * @access public - * @see Crypt_RC2::encrypt() - * @see Crypt_RC2::decrypt() - */ -/** - * Encrypt / decrypt using the Counter mode. - * - * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 - */ -define('CRYPT_RC2_MODE_CTR', CRYPT_MODE_CTR); -/** - * Encrypt / decrypt using the Electronic Code Book mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 - */ -define('CRYPT_RC2_MODE_ECB', CRYPT_MODE_ECB); -/** - * Encrypt / decrypt using the Code Book Chaining mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 - */ -define('CRYPT_RC2_MODE_CBC', CRYPT_MODE_CBC); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 - */ -define('CRYPT_RC2_MODE_CFB', CRYPT_MODE_CFB); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 - */ -define('CRYPT_RC2_MODE_OFB', CRYPT_MODE_OFB); -/**#@-*/ - -/**#@+ - * @access private - * @see Crypt_RC2::Crypt_RC2() - */ -/** - * Toggles the internal implementation - */ -define('CRYPT_RC2_MODE_INTERNAL', CRYPT_MODE_INTERNAL); -/** - * Toggles the mcrypt implementation - */ -define('CRYPT_RC2_MODE_MCRYPT', CRYPT_MODE_MCRYPT); -/**#@-*/ - -/** - * Pure-PHP implementation of RC2. - * - * @package Crypt_RC2 - * @access public - */ -class Crypt_RC2 extends Crypt_Base -{ - /** - * Block Length of the cipher - * - * @see Crypt_Base::block_size - * @var Integer - * @access private - */ - var $block_size = 8; - - /** - * The Key - * - * @see Crypt_Base::key - * @see setKey() - * @var String - * @access private - */ - var $key = "\0"; - - /** - * The default password key_size used by setPassword() - * - * @see Crypt_Base::password_key_size - * @see Crypt_Base::setPassword() - * @var Integer - * @access private - */ - var $password_key_size = 16; // = 128 bits - - /** - * The namespace used by the cipher for its constants. - * - * @see Crypt_Base::const_namespace - * @var String - * @access private - */ - var $const_namespace = 'RC2'; - - /** - * The mcrypt specific name of the cipher - * - * @see Crypt_Base::cipher_name_mcrypt - * @var String - * @access private - */ - var $cipher_name_mcrypt = 'rc2'; - - /** - * Optimizing value while CFB-encrypting - * - * @see Crypt_Base::cfb_init_len - * @var Integer - * @access private - */ - var $cfb_init_len = 500; - - /** - * The key length in bits. - * - * @see Crypt_RC2::setKeyLength() - * @see Crypt_RC2::setKey() - * @var Integer - * @access private - * @internal Should be in range [1..1024]. - * @internal Changing this value after setting the key has no effect. - */ - var $default_key_length = 1024; - - /** - * The Key Schedule - * - * @see Crypt_RC2::_setupKey() - * @var Array - * @access private - */ - var $keys; - - /** - * Key expansion randomization table. - * Twice the same 256-value sequence to save a modulus in key expansion. - * - * @see Crypt_RC2::setKey() - * @var Array - * @access private - */ - var $pitable = array( - 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED, - 0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D, - 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E, - 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2, - 0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13, - 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32, - 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B, - 0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82, - 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C, - 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC, - 0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1, - 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26, - 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57, - 0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03, - 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7, - 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7, - 0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7, - 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A, - 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74, - 0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC, - 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC, - 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39, - 0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A, - 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31, - 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE, - 0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9, - 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C, - 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9, - 0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0, - 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E, - 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77, - 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD, - 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED, - 0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D, - 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E, - 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2, - 0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13, - 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32, - 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B, - 0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82, - 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C, - 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC, - 0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1, - 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26, - 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57, - 0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03, - 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7, - 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7, - 0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7, - 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A, - 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74, - 0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC, - 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC, - 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39, - 0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A, - 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31, - 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE, - 0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9, - 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C, - 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9, - 0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0, - 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E, - 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77, - 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD - ); - - /** - * Inverse key expansion randomization table. - * - * @see Crypt_RC2::setKey() - * @var Array - * @access private - */ - var $invpitable = array( - 0xD1, 0xDA, 0xB9, 0x6F, 0x9C, 0xC8, 0x78, 0x66, - 0x80, 0x2C, 0xF8, 0x37, 0xEA, 0xE0, 0x62, 0xA4, - 0xCB, 0x71, 0x50, 0x27, 0x4B, 0x95, 0xD9, 0x20, - 0x9D, 0x04, 0x91, 0xE3, 0x47, 0x6A, 0x7E, 0x53, - 0xFA, 0x3A, 0x3B, 0xB4, 0xA8, 0xBC, 0x5F, 0x68, - 0x08, 0xCA, 0x8F, 0x14, 0xD7, 0xC0, 0xEF, 0x7B, - 0x5B, 0xBF, 0x2F, 0xE5, 0xE2, 0x8C, 0xBA, 0x12, - 0xE1, 0xAF, 0xB2, 0x54, 0x5D, 0x59, 0x76, 0xDB, - 0x32, 0xA2, 0x58, 0x6E, 0x1C, 0x29, 0x64, 0xF3, - 0xE9, 0x96, 0x0C, 0x98, 0x19, 0x8D, 0x3E, 0x26, - 0xAB, 0xA5, 0x85, 0x16, 0x40, 0xBD, 0x49, 0x67, - 0xDC, 0x22, 0x94, 0xBB, 0x3C, 0xC1, 0x9B, 0xEB, - 0x45, 0x28, 0x18, 0xD8, 0x1A, 0x42, 0x7D, 0xCC, - 0xFB, 0x65, 0x8E, 0x3D, 0xCD, 0x2A, 0xA3, 0x60, - 0xAE, 0x93, 0x8A, 0x48, 0x97, 0x51, 0x15, 0xF7, - 0x01, 0x0B, 0xB7, 0x36, 0xB1, 0x2E, 0x11, 0xFD, - 0x84, 0x2D, 0x3F, 0x13, 0x88, 0xB3, 0x34, 0x24, - 0x1B, 0xDE, 0xC5, 0x1D, 0x4D, 0x2B, 0x17, 0x31, - 0x74, 0xA9, 0xC6, 0x43, 0x6D, 0x39, 0x90, 0xBE, - 0xC3, 0xB0, 0x21, 0x6B, 0xF6, 0x0F, 0xD5, 0x99, - 0x0D, 0xAC, 0x1F, 0x5C, 0x9E, 0xF5, 0xF9, 0x4C, - 0xD6, 0xDF, 0x89, 0xE4, 0x8B, 0xFF, 0xC7, 0xAA, - 0xE7, 0xED, 0x46, 0x25, 0xB6, 0x06, 0x5E, 0x35, - 0xB5, 0xEC, 0xCE, 0xE8, 0x6C, 0x30, 0x55, 0x61, - 0x4A, 0xFE, 0xA0, 0x79, 0x03, 0xF0, 0x10, 0x72, - 0x7C, 0xCF, 0x52, 0xA6, 0xA7, 0xEE, 0x44, 0xD3, - 0x9A, 0x57, 0x92, 0xD0, 0x5A, 0x7A, 0x41, 0x7F, - 0x0E, 0x00, 0x63, 0xF2, 0x4F, 0x05, 0x83, 0xC9, - 0xA1, 0xD4, 0xDD, 0xC4, 0x56, 0xF4, 0xD2, 0x77, - 0x81, 0x09, 0x82, 0x33, 0x9F, 0x07, 0x86, 0x75, - 0x38, 0x4E, 0x69, 0xF1, 0xAD, 0x23, 0x73, 0x87, - 0x70, 0x02, 0xC2, 0x1E, 0xB8, 0x0A, 0xFC, 0xE6 - ); - - /** - * Default Constructor. - * - * Determines whether or not the mcrypt extension should be used. - * - * $mode could be: - * - * - CRYPT_RC2_MODE_ECB - * - * - CRYPT_RC2_MODE_CBC - * - * - CRYPT_RC2_MODE_CTR - * - * - CRYPT_RC2_MODE_CFB - * - * - CRYPT_RC2_MODE_OFB - * - * If not explicitly set, CRYPT_RC2_MODE_CBC will be used. - * - * @see Crypt_Base::Crypt_Base() - * @param optional Integer $mode - * @access public - */ - function Crypt_RC2($mode = CRYPT_RC2_MODE_CBC) - { - parent::Crypt_Base($mode); - $this->setKey(''); - } - - /** - * Sets the key length - * - * Valid key lengths are 1 to 1024. - * Calling this function after setting the key has no effect until the next - * Crypt_RC2::setKey() call. - * - * @access public - * @param Integer $length in bits - */ - function setKeyLength($length) - { - if ($length >= 1 && $length <= 1024) { - $this->default_key_length = $length; - } - } - - /** - * Sets the key. - * - * Keys can be of any length. RC2, itself, uses 1 to 1024 bit keys (eg. - * strlen($key) <= 128), however, we only use the first 128 bytes if $key - * has more then 128 bytes in it, and set $key to a single null byte if - * it is empty. - * - * If the key is not explicitly set, it'll be assumed to be a single - * null byte. - * - * @see Crypt_Base::setKey() - * @access public - * @param String $key - * @param Integer $t1 optional Effective key length in bits. - */ - function setKey($key, $t1 = 0) - { - if ($t1 <= 0) { - $t1 = $this->default_key_length; - } else if ($t1 > 1024) { - $t1 = 1024; - } - // Key byte count should be 1..128. - $key = strlen($key) ? substr($key, 0, 128) : "\x00"; - $t = strlen($key); - - // The mcrypt RC2 implementation only supports effective key length - // of 1024 bits. It is however possible to handle effective key - // lengths in range 1..1024 by expanding the key and applying - // inverse pitable mapping to the first byte before submitting it - // to mcrypt. - - // Key expansion. - $l = array_values(unpack('C*', $key)); - $t8 = ($t1 + 7) >> 3; - $tm = 0xFF >> (8 * $t8 - $t1); - - // Expand key. - $pitable = $this->pitable; - for ($i = $t; $i < 128; $i++) { - $l[$i] = $pitable[$l[$i - 1] + $l[$i - $t]]; - } - $i = 128 - $t8; - $l[$i] = $pitable[$l[$i] & $tm]; - while ($i--) { - $l[$i] = $pitable[$l[$i + 1] ^ $l[$i + $t8]]; - } - - // Prepare the key for mcrypt. - $l[0] = $this->invpitable[$l[0]]; - array_unshift($l, 'C*'); - parent::setKey(call_user_func_array('pack', $l)); - } - - /** - * Encrypts a block - * - * @see Crypt_Base::_encryptBlock() - * @see Crypt_Base::encrypt() - * @access private - * @param String $in - * @return String - */ - function _encryptBlock($in) - { - list($r0, $r1, $r2, $r3) = array_values(unpack('v*', $in)); - $keys = $this->keys; - $limit = 20; - $actions = array($limit => 44, 44 => 64); - $j = 0; - - for (;;) { - // Mixing round. - $r0 = (($r0 + $keys[$j++] + ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF) << 1; - $r0 |= $r0 >> 16; - $r1 = (($r1 + $keys[$j++] + ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF) << 2; - $r1 |= $r1 >> 16; - $r2 = (($r2 + $keys[$j++] + ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF) << 3; - $r2 |= $r2 >> 16; - $r3 = (($r3 + $keys[$j++] + ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF) << 5; - $r3 |= $r3 >> 16; - - if ($j === $limit) { - if ($limit === 64) { - break; - } - - // Mashing round. - $r0 += $keys[$r3 & 0x3F]; - $r1 += $keys[$r0 & 0x3F]; - $r2 += $keys[$r1 & 0x3F]; - $r3 += $keys[$r2 & 0x3F]; - $limit = $actions[$limit]; - } - } - - return pack('vvvv', $r0, $r1, $r2, $r3); - } - - /** - * Decrypts a block - * - * @see Crypt_Base::_decryptBlock() - * @see Crypt_Base::decrypt() - * @access private - * @param String $in - * @return String - */ - function _decryptBlock($in) - { - list($r0, $r1, $r2, $r3) = array_values(unpack('v*', $in)); - $keys = $this->keys; - $limit = 44; - $actions = array($limit => 20, 20 => 0); - $j = 64; - - for (;;) { - // R-mixing round. - $r3 = ($r3 | ($r3 << 16)) >> 5; - $r3 = ($r3 - $keys[--$j] - ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF; - $r2 = ($r2 | ($r2 << 16)) >> 3; - $r2 = ($r2 - $keys[--$j] - ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF; - $r1 = ($r1 | ($r1 << 16)) >> 2; - $r1 = ($r1 - $keys[--$j] - ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF; - $r0 = ($r0 | ($r0 << 16)) >> 1; - $r0 = ($r0 - $keys[--$j] - ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF; - - if ($j === $limit) { - if ($limit === 0) { - break; - } - - // R-mashing round. - $r3 = ($r3 - $keys[$r2 & 0x3F]) & 0xFFFF; - $r2 = ($r2 - $keys[$r1 & 0x3F]) & 0xFFFF; - $r1 = ($r1 - $keys[$r0 & 0x3F]) & 0xFFFF; - $r0 = ($r0 - $keys[$r3 & 0x3F]) & 0xFFFF; - $limit = $actions[$limit]; - } - } - - return pack('vvvv', $r0, $r1, $r2, $r3); - } - - /** - * Creates the key schedule - * - * @see Crypt_Base::_setupKey() - * @access private - */ - function _setupKey() - { - // Key has already been expanded in Crypt_RC2::setKey(): - // Only the first value must be altered. - $l = unpack('Ca/Cb/v*', $this->key); - array_unshift($l, $this->pitable[$l['a']] | ($l['b'] << 8)); - unset($l['a']); - unset($l['b']); - $this->keys = $l; - } - - /** - * Setup the performance-optimized function for de/encrypt() - * - * @see Crypt_Base::_setupInlineCrypt() - * @access private - */ - function _setupInlineCrypt() - { - $lambda_functions = &Crypt_RC2::_getLambdaFunctions(); - - // The first 10 generated $lambda_functions will use the $keys hardcoded as integers - // for the mixing rounds, for better inline crypt performance [~20% faster]. - // But for memory reason we have to limit those ultra-optimized $lambda_functions to an amount of 10. - $keys = $this->keys; - if (count($lambda_functions) >= 10) { - foreach ($this->keys as $k => $v) { - $keys[$k] = '$keys[' . $k . ']'; - } - } - - $code_hash = md5(str_pad("Crypt_RC2, {$this->mode}, ", 32, "\0") . implode(',', $keys)); - - // Is there a re-usable $lambda_functions in there? - // If not, we have to create it. - if (!isset($lambda_functions[$code_hash])) { - // Init code for both, encrypt and decrypt. - $init_crypt = '$keys = $self->keys;'; - - // $in is the current 8 bytes block which has to be en/decrypt - $encrypt_block = $decrypt_block = ' - $in = unpack("v4", $in); - $r0 = $in[1]; - $r1 = $in[2]; - $r2 = $in[3]; - $r3 = $in[4]; - '; - - // Create code for encryption. - $limit = 20; - $actions = array($limit => 44, 44 => 64); - $j = 0; - - for (;;) { - // Mixing round. - $encrypt_block .= ' - $r0 = (($r0 + ' . $keys[$j++] . ' + - ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF) << 1; - $r0 |= $r0 >> 16; - $r1 = (($r1 + ' . $keys[$j++] . ' + - ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF) << 2; - $r1 |= $r1 >> 16; - $r2 = (($r2 + ' . $keys[$j++] . ' + - ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF) << 3; - $r2 |= $r2 >> 16; - $r3 = (($r3 + ' . $keys[$j++] . ' + - ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF) << 5; - $r3 |= $r3 >> 16;'; - - if ($j === $limit) { - if ($limit === 64) { - break; - } - - // Mashing round. - $encrypt_block .= ' - $r0 += $keys[$r3 & 0x3F]; - $r1 += $keys[$r0 & 0x3F]; - $r2 += $keys[$r1 & 0x3F]; - $r3 += $keys[$r2 & 0x3F];'; - $limit = $actions[$limit]; - } - } - - $encrypt_block .= '$in = pack("v4", $r0, $r1, $r2, $r3);'; - - // Create code for decryption. - $limit = 44; - $actions = array($limit => 20, 20 => 0); - $j = 64; - - for (;;) { - // R-mixing round. - $decrypt_block .= ' - $r3 = ($r3 | ($r3 << 16)) >> 5; - $r3 = ($r3 - ' . $keys[--$j] . ' - - ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF; - $r2 = ($r2 | ($r2 << 16)) >> 3; - $r2 = ($r2 - ' . $keys[--$j] . ' - - ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF; - $r1 = ($r1 | ($r1 << 16)) >> 2; - $r1 = ($r1 - ' . $keys[--$j] . ' - - ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF; - $r0 = ($r0 | ($r0 << 16)) >> 1; - $r0 = ($r0 - ' . $keys[--$j] . ' - - ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF;'; - - if ($j === $limit) { - if ($limit === 0) { - break; - } - - // R-mashing round. - $decrypt_block .= ' - $r3 = ($r3 - $keys[$r2 & 0x3F]) & 0xFFFF; - $r2 = ($r2 - $keys[$r1 & 0x3F]) & 0xFFFF; - $r1 = ($r1 - $keys[$r0 & 0x3F]) & 0xFFFF; - $r0 = ($r0 - $keys[$r3 & 0x3F]) & 0xFFFF;'; - $limit = $actions[$limit]; - } - } - - $decrypt_block .= '$in = pack("v4", $r0, $r1, $r2, $r3);'; - - // Creates the inline-crypt function - $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( - array( - 'init_crypt' => $init_crypt, - 'encrypt_block' => $encrypt_block, - 'decrypt_block' => $decrypt_block - ) - ); - } - - // Set the inline-crypt function as callback in: $this->inline_crypt - $this->inline_crypt = $lambda_functions[$code_hash]; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RC4.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RC4.php deleted file mode 100755 index d5eda8c3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RC4.php +++ /dev/null @@ -1,329 +0,0 @@ - - * setKey('abcdefgh'); - * - * $size = 10 * 1024; - * $plaintext = ''; - * for ($i = 0; $i < $size; $i++) { - * $plaintext.= 'a'; - * } - * - * echo $rc4->decrypt($rc4->encrypt($plaintext)); - * ?> - * - * - * LICENSE: 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. - * - * @category Crypt - * @package Crypt_RC4 - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include Crypt_Base - * - * Base cipher class - */ -if (!class_exists('Crypt_Base')) { - include_once 'Base.php'; -} - -/**#@+ - * @access private - * @see Crypt_RC4::Crypt_RC4() - */ -/** - * Toggles the internal implementation - */ -define('CRYPT_RC4_MODE_INTERNAL', CRYPT_MODE_INTERNAL); -/** - * Toggles the mcrypt implementation - */ -define('CRYPT_RC4_MODE_MCRYPT', CRYPT_MODE_MCRYPT); -/**#@-*/ - -/**#@+ - * @access private - * @see Crypt_RC4::_crypt() - */ -define('CRYPT_RC4_ENCRYPT', 0); -define('CRYPT_RC4_DECRYPT', 1); -/**#@-*/ - -/** - * Pure-PHP implementation of RC4. - * - * @package Crypt_RC4 - * @author Jim Wigginton - * @access public - */ -class Crypt_RC4 extends Crypt_Base -{ - /** - * Block Length of the cipher - * - * RC4 is a stream cipher - * so we the block_size to 0 - * - * @see Crypt_Base::block_size - * @var Integer - * @access private - */ - var $block_size = 0; - - /** - * The default password key_size used by setPassword() - * - * @see Crypt_Base::password_key_size - * @see Crypt_Base::setPassword() - * @var Integer - * @access private - */ - var $password_key_size = 128; // = 1024 bits - - /** - * The namespace used by the cipher for its constants. - * - * @see Crypt_Base::const_namespace - * @var String - * @access private - */ - var $const_namespace = 'RC4'; - - /** - * The mcrypt specific name of the cipher - * - * @see Crypt_Base::cipher_name_mcrypt - * @var String - * @access private - */ - var $cipher_name_mcrypt = 'arcfour'; - - /** - * Holds whether performance-optimized $inline_crypt() can/should be used. - * - * @see Crypt_Base::inline_crypt - * @var mixed - * @access private - */ - var $use_inline_crypt = false; // currently not available - - /** - * The Key - * - * @see Crypt_RC4::setKey() - * @var String - * @access private - */ - var $key = "\0"; - - /** - * The Key Stream for decryption and encryption - * - * @see Crypt_RC4::setKey() - * @var Array - * @access private - */ - var $stream; - - /** - * Default Constructor. - * - * Determines whether or not the mcrypt extension should be used. - * - * @see Crypt_Base::Crypt_Base() - * @return Crypt_RC4 - * @access public - */ - function Crypt_RC4() - { - parent::Crypt_Base(CRYPT_MODE_STREAM); - } - - /** - * Dummy function. - * - * Some protocols, such as WEP, prepend an "initialization vector" to the key, effectively creating a new key [1]. - * If you need to use an initialization vector in this manner, feel free to prepend it to the key, yourself, before - * calling setKey(). - * - * [1] WEP's initialization vectors (IV's) are used in a somewhat insecure way. Since, in that protocol, - * the IV's are relatively easy to predict, an attack described by - * {@link http://www.drizzle.com/~aboba/IEEE/rc4_ksaproc.pdf Scott Fluhrer, Itsik Mantin, and Adi Shamir} - * can be used to quickly guess at the rest of the key. The following links elaborate: - * - * {@link http://www.rsa.com/rsalabs/node.asp?id=2009 http://www.rsa.com/rsalabs/node.asp?id=2009} - * {@link http://en.wikipedia.org/wiki/Related_key_attack http://en.wikipedia.org/wiki/Related_key_attack} - * - * @param String $iv - * @see Crypt_RC4::setKey() - * @access public - */ - function setIV($iv) - { - } - - /** - * Sets the key. - * - * Keys can be between 1 and 256 bytes long. If they are longer then 256 bytes, the first 256 bytes will - * be used. If no key is explicitly set, it'll be assumed to be a single null byte. - * - * @access public - * @see Crypt_Base::setKey() - * @param String $key - */ - function setKey($key) - { - parent::setKey(substr($key, 0, 256)); - } - - /** - * Encrypts a message. - * - * @see Crypt_Base::decrypt() - * @see Crypt_RC4::_crypt() - * @access public - * @param String $plaintext - * @return String $ciphertext - */ - function encrypt($plaintext) - { - if ($this->engine == CRYPT_MODE_MCRYPT) { - return parent::encrypt($plaintext); - } - return $this->_crypt($plaintext, CRYPT_RC4_ENCRYPT); - } - - /** - * Decrypts a message. - * - * $this->decrypt($this->encrypt($plaintext)) == $this->encrypt($this->encrypt($plaintext)). - * At least if the continuous buffer is disabled. - * - * @see Crypt_Base::encrypt() - * @see Crypt_RC4::_crypt() - * @access public - * @param String $ciphertext - * @return String $plaintext - */ - function decrypt($ciphertext) - { - if ($this->engine == CRYPT_MODE_MCRYPT) { - return parent::decrypt($ciphertext); - } - return $this->_crypt($ciphertext, CRYPT_RC4_DECRYPT); - } - - - /** - * Setup the key (expansion) - * - * @see Crypt_Base::_setupKey() - * @access private - */ - function _setupKey() - { - $key = $this->key; - $keyLength = strlen($key); - $keyStream = range(0, 255); - $j = 0; - for ($i = 0; $i < 256; $i++) { - $j = ($j + $keyStream[$i] + ord($key[$i % $keyLength])) & 255; - $temp = $keyStream[$i]; - $keyStream[$i] = $keyStream[$j]; - $keyStream[$j] = $temp; - } - - $this->stream = array(); - $this->stream[CRYPT_RC4_DECRYPT] = $this->stream[CRYPT_RC4_ENCRYPT] = array( - 0, // index $i - 0, // index $j - $keyStream - ); - } - - /** - * Encrypts or decrypts a message. - * - * @see Crypt_RC4::encrypt() - * @see Crypt_RC4::decrypt() - * @access private - * @param String $text - * @param Integer $mode - * @return String $text - */ - function _crypt($text, $mode) - { - if ($this->changed) { - $this->_setup(); - $this->changed = false; - } - - $stream = &$this->stream[$mode]; - if ($this->continuousBuffer) { - $i = &$stream[0]; - $j = &$stream[1]; - $keyStream = &$stream[2]; - } else { - $i = $stream[0]; - $j = $stream[1]; - $keyStream = $stream[2]; - } - - $len = strlen($text); - for ($k = 0; $k < $len; ++$k) { - $i = ($i + 1) & 255; - $ksi = $keyStream[$i]; - $j = ($j + $ksi) & 255; - $ksj = $keyStream[$j]; - - $keyStream[$i] = $ksj; - $keyStream[$j] = $ksi; - $text[$k] = $text[$k] ^ chr($keyStream[($ksj + $ksi) & 255]); - } - - return $text; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RSA.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RSA.php deleted file mode 100755 index 53f94354..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/RSA.php +++ /dev/null @@ -1,2997 +0,0 @@ - - * createKey()); - * - * $plaintext = 'terrafrost'; - * - * $rsa->loadKey($privatekey); - * $ciphertext = $rsa->encrypt($plaintext); - * - * $rsa->loadKey($publickey); - * echo $rsa->decrypt($ciphertext); - * ?> - * - * - * Here's an example of how to create signatures and verify signatures with this library: - * - * createKey()); - * - * $plaintext = 'terrafrost'; - * - * $rsa->loadKey($privatekey); - * $signature = $rsa->sign($plaintext); - * - * $rsa->loadKey($publickey); - * echo $rsa->verify($plaintext, $signature) ? 'verified' : 'unverified'; - * ?> - * - * - * LICENSE: 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. - * - * @category Crypt - * @package Crypt_RSA - * @author Jim Wigginton - * @copyright 2009 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include Crypt_Random - */ -// the class_exists() will only be called if the crypt_random_string function hasn't been defined and -// will trigger a call to __autoload() if you're wanting to auto-load classes -// call function_exists() a second time to stop the include_once from being called outside -// of the auto loader -if (!function_exists('crypt_random_string')) { - include_once 'Random.php'; -} - -/** - * Include Crypt_Hash - */ -if (!class_exists('Crypt_Hash')) { - include_once 'Hash.php'; -} - -/**#@+ - * @access public - * @see Crypt_RSA::encrypt() - * @see Crypt_RSA::decrypt() - */ -/** - * Use {@link http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding Optimal Asymmetric Encryption Padding} - * (OAEP) for encryption / decryption. - * - * Uses sha1 by default. - * - * @see Crypt_RSA::setHash() - * @see Crypt_RSA::setMGFHash() - */ -define('CRYPT_RSA_ENCRYPTION_OAEP', 1); -/** - * Use PKCS#1 padding. - * - * Although CRYPT_RSA_ENCRYPTION_OAEP offers more security, including PKCS#1 padding is necessary for purposes of backwards - * compatibility with protocols (like SSH-1) written before OAEP's introduction. - */ -define('CRYPT_RSA_ENCRYPTION_PKCS1', 2); -/**#@-*/ - -/**#@+ - * @access public - * @see Crypt_RSA::sign() - * @see Crypt_RSA::verify() - * @see Crypt_RSA::setHash() - */ -/** - * Use the Probabilistic Signature Scheme for signing - * - * Uses sha1 by default. - * - * @see Crypt_RSA::setSaltLength() - * @see Crypt_RSA::setMGFHash() - */ -define('CRYPT_RSA_SIGNATURE_PSS', 1); -/** - * Use the PKCS#1 scheme by default. - * - * Although CRYPT_RSA_SIGNATURE_PSS offers more security, including PKCS#1 signing is necessary for purposes of backwards - * compatibility with protocols (like SSH-2) written before PSS's introduction. - */ -define('CRYPT_RSA_SIGNATURE_PKCS1', 2); -/**#@-*/ - -/**#@+ - * @access private - * @see Crypt_RSA::createKey() - */ -/** - * ASN1 Integer - */ -define('CRYPT_RSA_ASN1_INTEGER', 2); -/** - * ASN1 Bit String - */ -define('CRYPT_RSA_ASN1_BITSTRING', 3); -/** - * ASN1 Octet String - */ -define('CRYPT_RSA_ASN1_OCTETSTRING', 4); -/** - * ASN1 Object Identifier - */ -define('CRYPT_RSA_ASN1_OBJECT', 6); -/** - * ASN1 Sequence (with the constucted bit set) - */ -define('CRYPT_RSA_ASN1_SEQUENCE', 48); -/**#@-*/ - -/**#@+ - * @access private - * @see Crypt_RSA::Crypt_RSA() - */ -/** - * To use the pure-PHP implementation - */ -define('CRYPT_RSA_MODE_INTERNAL', 1); -/** - * To use the OpenSSL library - * - * (if enabled; otherwise, the internal implementation will be used) - */ -define('CRYPT_RSA_MODE_OPENSSL', 2); -/**#@-*/ - -/** - * Default openSSL configuration file. - */ -define('CRYPT_RSA_OPENSSL_CONFIG', dirname(__FILE__) . '/../openssl.cnf'); - -/**#@+ - * @access public - * @see Crypt_RSA::createKey() - * @see Crypt_RSA::setPrivateKeyFormat() - */ -/** - * PKCS#1 formatted private key - * - * Used by OpenSSH - */ -define('CRYPT_RSA_PRIVATE_FORMAT_PKCS1', 0); -/** - * PuTTY formatted private key - */ -define('CRYPT_RSA_PRIVATE_FORMAT_PUTTY', 1); -/** - * XML formatted private key - */ -define('CRYPT_RSA_PRIVATE_FORMAT_XML', 2); -/** - * PKCS#8 formatted private key - */ -define('CRYPT_RSA_PRIVATE_FORMAT_PKCS8', 3); -/**#@-*/ - -/**#@+ - * @access public - * @see Crypt_RSA::createKey() - * @see Crypt_RSA::setPublicKeyFormat() - */ -/** - * Raw public key - * - * An array containing two Math_BigInteger objects. - * - * The exponent can be indexed with any of the following: - * - * 0, e, exponent, publicExponent - * - * The modulus can be indexed with any of the following: - * - * 1, n, modulo, modulus - */ -define('CRYPT_RSA_PUBLIC_FORMAT_RAW', 3); -/** - * PKCS#1 formatted public key (raw) - * - * Used by File/X509.php - * - * Has the following header: - * - * -----BEGIN RSA PUBLIC KEY----- - * - * Analogous to ssh-keygen's pem format (as specified by -m) - */ -define('CRYPT_RSA_PUBLIC_FORMAT_PKCS1', 4); -define('CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW', 4); -/** - * XML formatted public key - */ -define('CRYPT_RSA_PUBLIC_FORMAT_XML', 5); -/** - * OpenSSH formatted public key - * - * Place in $HOME/.ssh/authorized_keys - */ -define('CRYPT_RSA_PUBLIC_FORMAT_OPENSSH', 6); -/** - * PKCS#1 formatted public key (encapsulated) - * - * Used by PHP's openssl_public_encrypt() and openssl's rsautl (when -pubin is set) - * - * Has the following header: - * - * -----BEGIN PUBLIC KEY----- - * - * Analogous to ssh-keygen's pkcs8 format (as specified by -m). Although PKCS8 - * is specific to private keys it's basically creating a DER-encoded wrapper - * for keys. This just extends that same concept to public keys (much like ssh-keygen) - */ -define('CRYPT_RSA_PUBLIC_FORMAT_PKCS8', 7); -/**#@-*/ - -/** - * Pure-PHP PKCS#1 compliant implementation of RSA. - * - * @package Crypt_RSA - * @author Jim Wigginton - * @access public - */ -class Crypt_RSA -{ - /** - * Precomputed Zero - * - * @var Array - * @access private - */ - var $zero; - - /** - * Precomputed One - * - * @var Array - * @access private - */ - var $one; - - /** - * Private Key Format - * - * @var Integer - * @access private - */ - var $privateKeyFormat = CRYPT_RSA_PRIVATE_FORMAT_PKCS1; - - /** - * Public Key Format - * - * @var Integer - * @access public - */ - var $publicKeyFormat = CRYPT_RSA_PUBLIC_FORMAT_PKCS8; - - /** - * Modulus (ie. n) - * - * @var Math_BigInteger - * @access private - */ - var $modulus; - - /** - * Modulus length - * - * @var Math_BigInteger - * @access private - */ - var $k; - - /** - * Exponent (ie. e or d) - * - * @var Math_BigInteger - * @access private - */ - var $exponent; - - /** - * Primes for Chinese Remainder Theorem (ie. p and q) - * - * @var Array - * @access private - */ - var $primes; - - /** - * Exponents for Chinese Remainder Theorem (ie. dP and dQ) - * - * @var Array - * @access private - */ - var $exponents; - - /** - * Coefficients for Chinese Remainder Theorem (ie. qInv) - * - * @var Array - * @access private - */ - var $coefficients; - - /** - * Hash name - * - * @var String - * @access private - */ - var $hashName; - - /** - * Hash function - * - * @var Crypt_Hash - * @access private - */ - var $hash; - - /** - * Length of hash function output - * - * @var Integer - * @access private - */ - var $hLen; - - /** - * Length of salt - * - * @var Integer - * @access private - */ - var $sLen; - - /** - * Hash function for the Mask Generation Function - * - * @var Crypt_Hash - * @access private - */ - var $mgfHash; - - /** - * Length of MGF hash function output - * - * @var Integer - * @access private - */ - var $mgfHLen; - - /** - * Encryption mode - * - * @var Integer - * @access private - */ - var $encryptionMode = CRYPT_RSA_ENCRYPTION_OAEP; - - /** - * Signature mode - * - * @var Integer - * @access private - */ - var $signatureMode = CRYPT_RSA_SIGNATURE_PSS; - - /** - * Public Exponent - * - * @var Mixed - * @access private - */ - var $publicExponent = false; - - /** - * Password - * - * @var String - * @access private - */ - var $password = false; - - /** - * Components - * - * For use with parsing XML formatted keys. PHP's XML Parser functions use utilized - instead of PHP's DOM functions - - * because PHP's XML Parser functions work on PHP4 whereas PHP's DOM functions - although surperior - don't. - * - * @see Crypt_RSA::_start_element_handler() - * @var Array - * @access private - */ - var $components = array(); - - /** - * Current String - * - * For use with parsing XML formatted keys. - * - * @see Crypt_RSA::_character_handler() - * @see Crypt_RSA::_stop_element_handler() - * @var Mixed - * @access private - */ - var $current; - - /** - * OpenSSL configuration file name. - * - * Set to null to use system configuration file. - * @see Crypt_RSA::createKey() - * @var Mixed - * @Access public - */ - var $configFile; - - /** - * Public key comment field. - * - * @var String - * @access private - */ - var $comment = 'phpseclib-generated-key'; - - /** - * The constructor - * - * If you want to make use of the openssl extension, you'll need to set the mode manually, yourself. The reason - * Crypt_RSA doesn't do it is because OpenSSL doesn't fail gracefully. openssl_pkey_new(), in particular, requires - * openssl.cnf be present somewhere and, unfortunately, the only real way to find out is too late. - * - * @return Crypt_RSA - * @access public - */ - function Crypt_RSA() - { - if (!class_exists('Math_BigInteger')) { - include_once 'Math/BigInteger.php'; - } - - $this->configFile = CRYPT_RSA_OPENSSL_CONFIG; - - if ( !defined('CRYPT_RSA_MODE') ) { - switch (true) { - // Math/BigInteger's openssl requirements are a little less stringent than Crypt/RSA's. in particular, - // Math/BigInteger doesn't require an openssl.cfg file whereas Crypt/RSA does. so if Math/BigInteger - // can't use OpenSSL it can be pretty trivially assumed, then, that Crypt/RSA can't either. - case defined('MATH_BIGINTEGER_OPENSSL_DISABLE'): - define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); - break; - // openssl_pkey_get_details - which is used in the only place Crypt/RSA.php uses OpenSSL - was introduced in PHP 5.2.0 - case !function_exists('openssl_pkey_get_details'): - define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); - break; - case extension_loaded('openssl') && version_compare(PHP_VERSION, '4.2.0', '>=') && file_exists($this->configFile): - // some versions of XAMPP have mismatched versions of OpenSSL which causes it not to work - ob_start(); - @phpinfo(); - $content = ob_get_contents(); - ob_end_clean(); - - preg_match_all('#OpenSSL (Header|Library) Version(.*)#im', $content, $matches); - - $versions = array(); - if (!empty($matches[1])) { - for ($i = 0; $i < count($matches[1]); $i++) { - $fullVersion = trim(str_replace('=>', '', strip_tags($matches[2][$i]))); - - // Remove letter part in OpenSSL version - if (!preg_match('/(\d+\.\d+\.\d+)/i', $fullVersion, $m)) { - $versions[$matches[1][$i]] = $fullVersion; - } else { - $versions[$matches[1][$i]] = $m[0]; - } - } - } - - // it doesn't appear that OpenSSL versions were reported upon until PHP 5.3+ - switch (true) { - case !isset($versions['Header']): - case !isset($versions['Library']): - case $versions['Header'] == $versions['Library']: - define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_OPENSSL); - break; - default: - define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); - define('MATH_BIGINTEGER_OPENSSL_DISABLE', true); - } - break; - default: - define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); - } - } - - $this->zero = new Math_BigInteger(); - $this->one = new Math_BigInteger(1); - - $this->hash = new Crypt_Hash('sha1'); - $this->hLen = $this->hash->getLength(); - $this->hashName = 'sha1'; - $this->mgfHash = new Crypt_Hash('sha1'); - $this->mgfHLen = $this->mgfHash->getLength(); - } - - /** - * Create public / private key pair - * - * Returns an array with the following three elements: - * - 'privatekey': The private key. - * - 'publickey': The public key. - * - 'partialkey': A partially computed key (if the execution time exceeded $timeout). - * Will need to be passed back to Crypt_RSA::createKey() as the third parameter for further processing. - * - * @access public - * @param optional Integer $bits - * @param optional Integer $timeout - * @param optional Math_BigInteger $p - */ - function createKey($bits = 1024, $timeout = false, $partial = array()) - { - if (!defined('CRYPT_RSA_EXPONENT')) { - // http://en.wikipedia.org/wiki/65537_%28number%29 - define('CRYPT_RSA_EXPONENT', '65537'); - } - // per , this number ought not result in primes smaller - // than 256 bits. as a consequence if the key you're trying to create is 1024 bits and you've set CRYPT_RSA_SMALLEST_PRIME - // to 384 bits then you're going to get a 384 bit prime and a 640 bit prime (384 + 1024 % 384). at least if - // CRYPT_RSA_MODE is set to CRYPT_RSA_MODE_INTERNAL. if CRYPT_RSA_MODE is set to CRYPT_RSA_MODE_OPENSSL then - // CRYPT_RSA_SMALLEST_PRIME is ignored (ie. multi-prime RSA support is more intended as a way to speed up RSA key - // generation when there's a chance neither gmp nor OpenSSL are installed) - if (!defined('CRYPT_RSA_SMALLEST_PRIME')) { - define('CRYPT_RSA_SMALLEST_PRIME', 4096); - } - - // OpenSSL uses 65537 as the exponent and requires RSA keys be 384 bits minimum - if ( CRYPT_RSA_MODE == CRYPT_RSA_MODE_OPENSSL && $bits >= 384 && CRYPT_RSA_EXPONENT == 65537) { - $config = array(); - if (isset($this->configFile)) { - $config['config'] = $this->configFile; - } - $rsa = openssl_pkey_new(array('private_key_bits' => $bits) + $config); - openssl_pkey_export($rsa, $privatekey, null, $config); - $publickey = openssl_pkey_get_details($rsa); - $publickey = $publickey['key']; - - $privatekey = call_user_func_array(array($this, '_convertPrivateKey'), array_values($this->_parseKey($privatekey, CRYPT_RSA_PRIVATE_FORMAT_PKCS1))); - $publickey = call_user_func_array(array($this, '_convertPublicKey'), array_values($this->_parseKey($publickey, CRYPT_RSA_PUBLIC_FORMAT_PKCS1))); - - // clear the buffer of error strings stemming from a minimalistic openssl.cnf - while (openssl_error_string() !== false); - - return array( - 'privatekey' => $privatekey, - 'publickey' => $publickey, - 'partialkey' => false - ); - } - - static $e; - if (!isset($e)) { - $e = new Math_BigInteger(CRYPT_RSA_EXPONENT); - } - - extract($this->_generateMinMax($bits)); - $absoluteMin = $min; - $temp = $bits >> 1; // divide by two to see how many bits P and Q would be - if ($temp > CRYPT_RSA_SMALLEST_PRIME) { - $num_primes = floor($bits / CRYPT_RSA_SMALLEST_PRIME); - $temp = CRYPT_RSA_SMALLEST_PRIME; - } else { - $num_primes = 2; - } - extract($this->_generateMinMax($temp + $bits % $temp)); - $finalMax = $max; - extract($this->_generateMinMax($temp)); - - $generator = new Math_BigInteger(); - - $n = $this->one->copy(); - if (!empty($partial)) { - extract(unserialize($partial)); - } else { - $exponents = $coefficients = $primes = array(); - $lcm = array( - 'top' => $this->one->copy(), - 'bottom' => false - ); - } - - $start = time(); - $i0 = count($primes) + 1; - - do { - for ($i = $i0; $i <= $num_primes; $i++) { - if ($timeout !== false) { - $timeout-= time() - $start; - $start = time(); - if ($timeout <= 0) { - return array( - 'privatekey' => '', - 'publickey' => '', - 'partialkey' => serialize(array( - 'primes' => $primes, - 'coefficients' => $coefficients, - 'lcm' => $lcm, - 'exponents' => $exponents - )) - ); - } - } - - if ($i == $num_primes) { - list($min, $temp) = $absoluteMin->divide($n); - if (!$temp->equals($this->zero)) { - $min = $min->add($this->one); // ie. ceil() - } - $primes[$i] = $generator->randomPrime($min, $finalMax, $timeout); - } else { - $primes[$i] = $generator->randomPrime($min, $max, $timeout); - } - - if ($primes[$i] === false) { // if we've reached the timeout - if (count($primes) > 1) { - $partialkey = ''; - } else { - array_pop($primes); - $partialkey = serialize(array( - 'primes' => $primes, - 'coefficients' => $coefficients, - 'lcm' => $lcm, - 'exponents' => $exponents - )); - } - - return array( - 'privatekey' => '', - 'publickey' => '', - 'partialkey' => $partialkey - ); - } - - // the first coefficient is calculated differently from the rest - // ie. instead of being $primes[1]->modInverse($primes[2]), it's $primes[2]->modInverse($primes[1]) - if ($i > 2) { - $coefficients[$i] = $n->modInverse($primes[$i]); - } - - $n = $n->multiply($primes[$i]); - - $temp = $primes[$i]->subtract($this->one); - - // textbook RSA implementations use Euler's totient function instead of the least common multiple. - // see http://en.wikipedia.org/wiki/Euler%27s_totient_function - $lcm['top'] = $lcm['top']->multiply($temp); - $lcm['bottom'] = $lcm['bottom'] === false ? $temp : $lcm['bottom']->gcd($temp); - - $exponents[$i] = $e->modInverse($temp); - } - - list($temp) = $lcm['top']->divide($lcm['bottom']); - $gcd = $temp->gcd($e); - $i0 = 1; - } while (!$gcd->equals($this->one)); - - $d = $e->modInverse($temp); - - $coefficients[2] = $primes[2]->modInverse($primes[1]); - - // from : - // RSAPrivateKey ::= SEQUENCE { - // version Version, - // modulus INTEGER, -- n - // publicExponent INTEGER, -- e - // privateExponent INTEGER, -- d - // prime1 INTEGER, -- p - // prime2 INTEGER, -- q - // exponent1 INTEGER, -- d mod (p-1) - // exponent2 INTEGER, -- d mod (q-1) - // coefficient INTEGER, -- (inverse of q) mod p - // otherPrimeInfos OtherPrimeInfos OPTIONAL - // } - - return array( - 'privatekey' => $this->_convertPrivateKey($n, $e, $d, $primes, $exponents, $coefficients), - 'publickey' => $this->_convertPublicKey($n, $e), - 'partialkey' => false - ); - } - - /** - * Convert a private key to the appropriate format. - * - * @access private - * @see setPrivateKeyFormat() - * @param String $RSAPrivateKey - * @return String - */ - function _convertPrivateKey($n, $e, $d, $primes, $exponents, $coefficients) - { - $signed = $this->privateKeyFormat != CRYPT_RSA_PRIVATE_FORMAT_XML; - $num_primes = count($primes); - $raw = array( - 'version' => $num_primes == 2 ? chr(0) : chr(1), // two-prime vs. multi - 'modulus' => $n->toBytes($signed), - 'publicExponent' => $e->toBytes($signed), - 'privateExponent' => $d->toBytes($signed), - 'prime1' => $primes[1]->toBytes($signed), - 'prime2' => $primes[2]->toBytes($signed), - 'exponent1' => $exponents[1]->toBytes($signed), - 'exponent2' => $exponents[2]->toBytes($signed), - 'coefficient' => $coefficients[2]->toBytes($signed) - ); - - // if the format in question does not support multi-prime rsa and multi-prime rsa was used, - // call _convertPublicKey() instead. - switch ($this->privateKeyFormat) { - case CRYPT_RSA_PRIVATE_FORMAT_XML: - if ($num_primes != 2) { - return false; - } - return "\r\n" . - ' ' . base64_encode($raw['modulus']) . "\r\n" . - ' ' . base64_encode($raw['publicExponent']) . "\r\n" . - '

' . base64_encode($raw['prime1']) . "

\r\n" . - ' ' . base64_encode($raw['prime2']) . "\r\n" . - ' ' . base64_encode($raw['exponent1']) . "\r\n" . - ' ' . base64_encode($raw['exponent2']) . "\r\n" . - ' ' . base64_encode($raw['coefficient']) . "\r\n" . - ' ' . base64_encode($raw['privateExponent']) . "\r\n" . - '
'; - break; - case CRYPT_RSA_PRIVATE_FORMAT_PUTTY: - if ($num_primes != 2) { - return false; - } - $key = "PuTTY-User-Key-File-2: ssh-rsa\r\nEncryption: "; - $encryption = (!empty($this->password) || is_string($this->password)) ? 'aes256-cbc' : 'none'; - $key.= $encryption; - $key.= "\r\nComment: " . $this->comment . "\r\n"; - $public = pack('Na*Na*Na*', - strlen('ssh-rsa'), 'ssh-rsa', strlen($raw['publicExponent']), $raw['publicExponent'], strlen($raw['modulus']), $raw['modulus'] - ); - $source = pack('Na*Na*Na*Na*', - strlen('ssh-rsa'), 'ssh-rsa', strlen($encryption), $encryption, - strlen($this->comment), $this->comment, strlen($public), $public - ); - $public = base64_encode($public); - $key.= "Public-Lines: " . ((strlen($public) + 63) >> 6) . "\r\n"; - $key.= chunk_split($public, 64); - $private = pack('Na*Na*Na*Na*', - strlen($raw['privateExponent']), $raw['privateExponent'], strlen($raw['prime1']), $raw['prime1'], - strlen($raw['prime2']), $raw['prime2'], strlen($raw['coefficient']), $raw['coefficient'] - ); - if (empty($this->password) && !is_string($this->password)) { - $source.= pack('Na*', strlen($private), $private); - $hashkey = 'putty-private-key-file-mac-key'; - } else { - $private.= crypt_random_string(16 - (strlen($private) & 15)); - $source.= pack('Na*', strlen($private), $private); - if (!class_exists('Crypt_AES')) { - include_once 'Crypt/AES.php'; - } - $sequence = 0; - $symkey = ''; - while (strlen($symkey) < 32) { - $temp = pack('Na*', $sequence++, $this->password); - $symkey.= pack('H*', sha1($temp)); - } - $symkey = substr($symkey, 0, 32); - $crypto = new Crypt_AES(); - - $crypto->setKey($symkey); - $crypto->disablePadding(); - $private = $crypto->encrypt($private); - $hashkey = 'putty-private-key-file-mac-key' . $this->password; - } - - $private = base64_encode($private); - $key.= 'Private-Lines: ' . ((strlen($private) + 63) >> 6) . "\r\n"; - $key.= chunk_split($private, 64); - if (!class_exists('Crypt_Hash')) { - include_once 'Crypt/Hash.php'; - } - $hash = new Crypt_Hash('sha1'); - $hash->setKey(pack('H*', sha1($hashkey))); - $key.= 'Private-MAC: ' . bin2hex($hash->hash($source)) . "\r\n"; - - return $key; - default: // eg. CRYPT_RSA_PRIVATE_FORMAT_PKCS1 - $components = array(); - foreach ($raw as $name => $value) { - $components[$name] = pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($value)), $value); - } - - $RSAPrivateKey = implode('', $components); - - if ($num_primes > 2) { - $OtherPrimeInfos = ''; - for ($i = 3; $i <= $num_primes; $i++) { - // OtherPrimeInfos ::= SEQUENCE SIZE(1..MAX) OF OtherPrimeInfo - // - // OtherPrimeInfo ::= SEQUENCE { - // prime INTEGER, -- ri - // exponent INTEGER, -- di - // coefficient INTEGER -- ti - // } - $OtherPrimeInfo = pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($primes[$i]->toBytes(true))), $primes[$i]->toBytes(true)); - $OtherPrimeInfo.= pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($exponents[$i]->toBytes(true))), $exponents[$i]->toBytes(true)); - $OtherPrimeInfo.= pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($coefficients[$i]->toBytes(true))), $coefficients[$i]->toBytes(true)); - $OtherPrimeInfos.= pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($OtherPrimeInfo)), $OtherPrimeInfo); - } - $RSAPrivateKey.= pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($OtherPrimeInfos)), $OtherPrimeInfos); - } - - $RSAPrivateKey = pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey); - - if ($this->privateKeyFormat == CRYPT_RSA_PRIVATE_FORMAT_PKCS8) { - $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA - $RSAPrivateKey = pack('Ca*a*Ca*a*', - CRYPT_RSA_ASN1_INTEGER, "\01\00", $rsaOID, 4, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey - ); - $RSAPrivateKey = pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey); - if (!empty($this->password) || is_string($this->password)) { - $salt = crypt_random_string(8); - $iterationCount = 2048; - - if (!class_exists('Crypt_DES')) { - include_once 'Crypt/DES.php'; - } - $crypto = new Crypt_DES(); - $crypto->setPassword($this->password, 'pbkdf1', 'md5', $salt, $iterationCount); - $RSAPrivateKey = $crypto->encrypt($RSAPrivateKey); - - $parameters = pack('Ca*a*Ca*N', - CRYPT_RSA_ASN1_OCTETSTRING, $this->_encodeLength(strlen($salt)), $salt, - CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(4), $iterationCount - ); - $pbeWithMD5AndDES_CBC = "\x2a\x86\x48\x86\xf7\x0d\x01\x05\x03"; - - $encryptionAlgorithm = pack('Ca*a*Ca*a*', - CRYPT_RSA_ASN1_OBJECT, $this->_encodeLength(strlen($pbeWithMD5AndDES_CBC)), $pbeWithMD5AndDES_CBC, - CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($parameters)), $parameters - ); - - $RSAPrivateKey = pack('Ca*a*Ca*a*', - CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($encryptionAlgorithm)), $encryptionAlgorithm, - CRYPT_RSA_ASN1_OCTETSTRING, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey - ); - - $RSAPrivateKey = pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey); - - $RSAPrivateKey = "-----BEGIN ENCRYPTED PRIVATE KEY-----\r\n" . - chunk_split(base64_encode($RSAPrivateKey), 64) . - '-----END ENCRYPTED PRIVATE KEY-----'; - } else { - $RSAPrivateKey = "-----BEGIN PRIVATE KEY-----\r\n" . - chunk_split(base64_encode($RSAPrivateKey), 64) . - '-----END PRIVATE KEY-----'; - } - return $RSAPrivateKey; - } - - if (!empty($this->password) || is_string($this->password)) { - $iv = crypt_random_string(8); - $symkey = pack('H*', md5($this->password . $iv)); // symkey is short for symmetric key - $symkey.= substr(pack('H*', md5($symkey . $this->password . $iv)), 0, 8); - if (!class_exists('Crypt_TripleDES')) { - include_once 'Crypt/TripleDES.php'; - } - $des = new Crypt_TripleDES(); - $des->setKey($symkey); - $des->setIV($iv); - $iv = strtoupper(bin2hex($iv)); - $RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" . - "Proc-Type: 4,ENCRYPTED\r\n" . - "DEK-Info: DES-EDE3-CBC,$iv\r\n" . - "\r\n" . - chunk_split(base64_encode($des->encrypt($RSAPrivateKey)), 64) . - '-----END RSA PRIVATE KEY-----'; - } else { - $RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" . - chunk_split(base64_encode($RSAPrivateKey), 64) . - '-----END RSA PRIVATE KEY-----'; - } - - return $RSAPrivateKey; - } - } - - /** - * Convert a public key to the appropriate format - * - * @access private - * @see setPublicKeyFormat() - * @param String $RSAPrivateKey - * @return String - */ - function _convertPublicKey($n, $e) - { - $signed = $this->publicKeyFormat != CRYPT_RSA_PUBLIC_FORMAT_XML; - - $modulus = $n->toBytes($signed); - $publicExponent = $e->toBytes($signed); - - switch ($this->publicKeyFormat) { - case CRYPT_RSA_PUBLIC_FORMAT_RAW: - return array('e' => $e->copy(), 'n' => $n->copy()); - case CRYPT_RSA_PUBLIC_FORMAT_XML: - return "\r\n" . - ' ' . base64_encode($modulus) . "\r\n" . - ' ' . base64_encode($publicExponent) . "\r\n" . - ''; - break; - case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH: - // from : - // string "ssh-rsa" - // mpint e - // mpint n - $RSAPublicKey = pack('Na*Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publicExponent), $publicExponent, strlen($modulus), $modulus); - $RSAPublicKey = 'ssh-rsa ' . base64_encode($RSAPublicKey) . ' ' . $this->comment; - - return $RSAPublicKey; - default: // eg. CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW or CRYPT_RSA_PUBLIC_FORMAT_PKCS1 - // from : - // RSAPublicKey ::= SEQUENCE { - // modulus INTEGER, -- n - // publicExponent INTEGER -- e - // } - $components = array( - 'modulus' => pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($modulus)), $modulus), - 'publicExponent' => pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($publicExponent)), $publicExponent) - ); - - $RSAPublicKey = pack('Ca*a*a*', - CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($components['modulus']) + strlen($components['publicExponent'])), - $components['modulus'], $components['publicExponent'] - ); - - if ($this->publicKeyFormat == CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW) { - $RSAPublicKey = "-----BEGIN RSA PUBLIC KEY-----\r\n" . - chunk_split(base64_encode($RSAPublicKey), 64) . - '-----END RSA PUBLIC KEY-----'; - } else { - // sequence(oid(1.2.840.113549.1.1.1), null)) = rsaEncryption. - $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA - $RSAPublicKey = chr(0) . $RSAPublicKey; - $RSAPublicKey = chr(3) . $this->_encodeLength(strlen($RSAPublicKey)) . $RSAPublicKey; - - $RSAPublicKey = pack('Ca*a*', - CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($rsaOID . $RSAPublicKey)), $rsaOID . $RSAPublicKey - ); - - $RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" . - chunk_split(base64_encode($RSAPublicKey), 64) . - '-----END PUBLIC KEY-----'; - } - - return $RSAPublicKey; - } - } - - /** - * Break a public or private key down into its constituant components - * - * @access private - * @see _convertPublicKey() - * @see _convertPrivateKey() - * @param String $key - * @param Integer $type - * @return Array - */ - function _parseKey($key, $type) - { - if ($type != CRYPT_RSA_PUBLIC_FORMAT_RAW && !is_string($key)) { - return false; - } - - switch ($type) { - case CRYPT_RSA_PUBLIC_FORMAT_RAW: - if (!is_array($key)) { - return false; - } - $components = array(); - switch (true) { - case isset($key['e']): - $components['publicExponent'] = $key['e']->copy(); - break; - case isset($key['exponent']): - $components['publicExponent'] = $key['exponent']->copy(); - break; - case isset($key['publicExponent']): - $components['publicExponent'] = $key['publicExponent']->copy(); - break; - case isset($key[0]): - $components['publicExponent'] = $key[0]->copy(); - } - switch (true) { - case isset($key['n']): - $components['modulus'] = $key['n']->copy(); - break; - case isset($key['modulo']): - $components['modulus'] = $key['modulo']->copy(); - break; - case isset($key['modulus']): - $components['modulus'] = $key['modulus']->copy(); - break; - case isset($key[1]): - $components['modulus'] = $key[1]->copy(); - } - return isset($components['modulus']) && isset($components['publicExponent']) ? $components : false; - case CRYPT_RSA_PRIVATE_FORMAT_PKCS1: - case CRYPT_RSA_PRIVATE_FORMAT_PKCS8: - case CRYPT_RSA_PUBLIC_FORMAT_PKCS1: - /* Although PKCS#1 proposes a format that public and private keys can use, encrypting them is - "outside the scope" of PKCS#1. PKCS#1 then refers you to PKCS#12 and PKCS#15 if you're wanting to - protect private keys, however, that's not what OpenSSL* does. OpenSSL protects private keys by adding - two new "fields" to the key - DEK-Info and Proc-Type. These fields are discussed here: - - http://tools.ietf.org/html/rfc1421#section-4.6.1.1 - http://tools.ietf.org/html/rfc1421#section-4.6.1.3 - - DES-EDE3-CBC as an algorithm, however, is not discussed anywhere, near as I can tell. - DES-CBC and DES-EDE are discussed in RFC1423, however, DES-EDE3-CBC isn't, nor is its key derivation - function. As is, the definitive authority on this encoding scheme isn't the IETF but rather OpenSSL's - own implementation. ie. the implementation *is* the standard and any bugs that may exist in that - implementation are part of the standard, as well. - - * OpenSSL is the de facto standard. It's utilized by OpenSSH and other projects */ - if (preg_match('#DEK-Info: (.+),(.+)#', $key, $matches)) { - $iv = pack('H*', trim($matches[2])); - $symkey = pack('H*', md5($this->password . substr($iv, 0, 8))); // symkey is short for symmetric key - $symkey.= pack('H*', md5($symkey . $this->password . substr($iv, 0, 8))); - // remove the Proc-Type / DEK-Info sections as they're no longer needed - $key = preg_replace('#^(?:Proc-Type|DEK-Info): .*#m', '', $key); - $ciphertext = $this->_extractBER($key); - if ($ciphertext === false) { - $ciphertext = $key; - } - switch ($matches[1]) { - case 'AES-256-CBC': - if (!class_exists('Crypt_AES')) { - include_once 'Crypt/AES.php'; - } - $crypto = new Crypt_AES(); - break; - case 'AES-128-CBC': - if (!class_exists('Crypt_AES')) { - include_once 'Crypt/AES.php'; - } - $symkey = substr($symkey, 0, 16); - $crypto = new Crypt_AES(); - break; - case 'DES-EDE3-CFB': - if (!class_exists('Crypt_TripleDES')) { - include_once 'Crypt/TripleDES.php'; - } - $crypto = new Crypt_TripleDES(CRYPT_DES_MODE_CFB); - break; - case 'DES-EDE3-CBC': - if (!class_exists('Crypt_TripleDES')) { - include_once 'Crypt/TripleDES.php'; - } - $symkey = substr($symkey, 0, 24); - $crypto = new Crypt_TripleDES(); - break; - case 'DES-CBC': - if (!class_exists('Crypt_DES')) { - include_once 'Crypt/DES.php'; - } - $crypto = new Crypt_DES(); - break; - default: - return false; - } - $crypto->setKey($symkey); - $crypto->setIV($iv); - $decoded = $crypto->decrypt($ciphertext); - } else { - $decoded = $this->_extractBER($key); - } - - if ($decoded !== false) { - $key = $decoded; - } - - $components = array(); - - if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) { - return false; - } - if ($this->_decodeLength($key) != strlen($key)) { - return false; - } - - $tag = ord($this->_string_shift($key)); - /* intended for keys for which OpenSSL's asn1parse returns the following: - - 0:d=0 hl=4 l= 631 cons: SEQUENCE - 4:d=1 hl=2 l= 1 prim: INTEGER :00 - 7:d=1 hl=2 l= 13 cons: SEQUENCE - 9:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 20:d=2 hl=2 l= 0 prim: NULL - 22:d=1 hl=4 l= 609 prim: OCTET STRING - - ie. PKCS8 keys*/ - - if ($tag == CRYPT_RSA_ASN1_INTEGER && substr($key, 0, 3) == "\x01\x00\x30") { - $this->_string_shift($key, 3); - $tag = CRYPT_RSA_ASN1_SEQUENCE; - } - - if ($tag == CRYPT_RSA_ASN1_SEQUENCE) { - $temp = $this->_string_shift($key, $this->_decodeLength($key)); - if (ord($this->_string_shift($temp)) != CRYPT_RSA_ASN1_OBJECT) { - return false; - } - $length = $this->_decodeLength($temp); - switch ($this->_string_shift($temp, $length)) { - case "\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01": // rsaEncryption - break; - case "\x2a\x86\x48\x86\xf7\x0d\x01\x05\x03": // pbeWithMD5AndDES-CBC - /* - PBEParameter ::= SEQUENCE { - salt OCTET STRING (SIZE(8)), - iterationCount INTEGER } - */ - if (ord($this->_string_shift($temp)) != CRYPT_RSA_ASN1_SEQUENCE) { - return false; - } - if ($this->_decodeLength($temp) != strlen($temp)) { - return false; - } - $this->_string_shift($temp); // assume it's an octet string - $salt = $this->_string_shift($temp, $this->_decodeLength($temp)); - if (ord($this->_string_shift($temp)) != CRYPT_RSA_ASN1_INTEGER) { - return false; - } - $this->_decodeLength($temp); - list(, $iterationCount) = unpack('N', str_pad($temp, 4, chr(0), STR_PAD_LEFT)); - $this->_string_shift($key); // assume it's an octet string - $length = $this->_decodeLength($key); - if (strlen($key) != $length) { - return false; - } - - if (!class_exists('Crypt_DES')) { - include_once 'Crypt/DES.php'; - } - $crypto = new Crypt_DES(); - $crypto->setPassword($this->password, 'pbkdf1', 'md5', $salt, $iterationCount); - $key = $crypto->decrypt($key); - if ($key === false) { - return false; - } - return $this->_parseKey($key, CRYPT_RSA_PRIVATE_FORMAT_PKCS1); - default: - return false; - } - /* intended for keys for which OpenSSL's asn1parse returns the following: - - 0:d=0 hl=4 l= 290 cons: SEQUENCE - 4:d=1 hl=2 l= 13 cons: SEQUENCE - 6:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 17:d=2 hl=2 l= 0 prim: NULL - 19:d=1 hl=4 l= 271 prim: BIT STRING */ - $tag = ord($this->_string_shift($key)); // skip over the BIT STRING / OCTET STRING tag - $this->_decodeLength($key); // skip over the BIT STRING / OCTET STRING length - // "The initial octet shall encode, as an unsigned binary integer wtih bit 1 as the least significant bit, the number of - // unused bits in the final subsequent octet. The number shall be in the range zero to seven." - // -- http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf (section 8.6.2.2) - if ($tag == CRYPT_RSA_ASN1_BITSTRING) { - $this->_string_shift($key); - } - if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) { - return false; - } - if ($this->_decodeLength($key) != strlen($key)) { - return false; - } - $tag = ord($this->_string_shift($key)); - } - if ($tag != CRYPT_RSA_ASN1_INTEGER) { - return false; - } - - $length = $this->_decodeLength($key); - $temp = $this->_string_shift($key, $length); - if (strlen($temp) != 1 || ord($temp) > 2) { - $components['modulus'] = new Math_BigInteger($temp, 256); - $this->_string_shift($key); // skip over CRYPT_RSA_ASN1_INTEGER - $length = $this->_decodeLength($key); - $components[$type == CRYPT_RSA_PUBLIC_FORMAT_PKCS1 ? 'publicExponent' : 'privateExponent'] = new Math_BigInteger($this->_string_shift($key, $length), 256); - - return $components; - } - if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_INTEGER) { - return false; - } - $length = $this->_decodeLength($key); - $components['modulus'] = new Math_BigInteger($this->_string_shift($key, $length), 256); - $this->_string_shift($key); - $length = $this->_decodeLength($key); - $components['publicExponent'] = new Math_BigInteger($this->_string_shift($key, $length), 256); - $this->_string_shift($key); - $length = $this->_decodeLength($key); - $components['privateExponent'] = new Math_BigInteger($this->_string_shift($key, $length), 256); - $this->_string_shift($key); - $length = $this->_decodeLength($key); - $components['primes'] = array(1 => new Math_BigInteger($this->_string_shift($key, $length), 256)); - $this->_string_shift($key); - $length = $this->_decodeLength($key); - $components['primes'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); - $this->_string_shift($key); - $length = $this->_decodeLength($key); - $components['exponents'] = array(1 => new Math_BigInteger($this->_string_shift($key, $length), 256)); - $this->_string_shift($key); - $length = $this->_decodeLength($key); - $components['exponents'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); - $this->_string_shift($key); - $length = $this->_decodeLength($key); - $components['coefficients'] = array(2 => new Math_BigInteger($this->_string_shift($key, $length), 256)); - - if (!empty($key)) { - if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) { - return false; - } - $this->_decodeLength($key); - while (!empty($key)) { - if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) { - return false; - } - $this->_decodeLength($key); - $key = substr($key, 1); - $length = $this->_decodeLength($key); - $components['primes'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); - $this->_string_shift($key); - $length = $this->_decodeLength($key); - $components['exponents'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); - $this->_string_shift($key); - $length = $this->_decodeLength($key); - $components['coefficients'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); - } - } - - return $components; - case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH: - $parts = explode(' ', $key, 3); - - $key = isset($parts[1]) ? base64_decode($parts[1]) : false; - if ($key === false) { - return false; - } - - $comment = isset($parts[2]) ? $parts[2] : false; - - $cleanup = substr($key, 0, 11) == "\0\0\0\7ssh-rsa"; - - if (strlen($key) <= 4) { - return false; - } - extract(unpack('Nlength', $this->_string_shift($key, 4))); - $publicExponent = new Math_BigInteger($this->_string_shift($key, $length), -256); - if (strlen($key) <= 4) { - return false; - } - extract(unpack('Nlength', $this->_string_shift($key, 4))); - $modulus = new Math_BigInteger($this->_string_shift($key, $length), -256); - - if ($cleanup && strlen($key)) { - if (strlen($key) <= 4) { - return false; - } - extract(unpack('Nlength', $this->_string_shift($key, 4))); - $realModulus = new Math_BigInteger($this->_string_shift($key, $length), -256); - return strlen($key) ? false : array( - 'modulus' => $realModulus, - 'publicExponent' => $modulus, - 'comment' => $comment - ); - } else { - return strlen($key) ? false : array( - 'modulus' => $modulus, - 'publicExponent' => $publicExponent, - 'comment' => $comment - ); - } - // http://www.w3.org/TR/xmldsig-core/#sec-RSAKeyValue - // http://en.wikipedia.org/wiki/XML_Signature - case CRYPT_RSA_PRIVATE_FORMAT_XML: - case CRYPT_RSA_PUBLIC_FORMAT_XML: - $this->components = array(); - - $xml = xml_parser_create('UTF-8'); - xml_set_object($xml, $this); - xml_set_element_handler($xml, '_start_element_handler', '_stop_element_handler'); - xml_set_character_data_handler($xml, '_data_handler'); - // add to account for "dangling" tags like ... that are sometimes added - if (!xml_parse($xml, '' . $key . '')) { - return false; - } - - return isset($this->components['modulus']) && isset($this->components['publicExponent']) ? $this->components : false; - // from PuTTY's SSHPUBK.C - case CRYPT_RSA_PRIVATE_FORMAT_PUTTY: - $components = array(); - $key = preg_split('#\r\n|\r|\n#', $key); - $type = trim(preg_replace('#PuTTY-User-Key-File-2: (.+)#', '$1', $key[0])); - if ($type != 'ssh-rsa') { - return false; - } - $encryption = trim(preg_replace('#Encryption: (.+)#', '$1', $key[1])); - $comment = trim(preg_replace('#Comment: (.+)#', '$1', $key[2])); - - $publicLength = trim(preg_replace('#Public-Lines: (\d+)#', '$1', $key[3])); - $public = base64_decode(implode('', array_map('trim', array_slice($key, 4, $publicLength)))); - $public = substr($public, 11); - extract(unpack('Nlength', $this->_string_shift($public, 4))); - $components['publicExponent'] = new Math_BigInteger($this->_string_shift($public, $length), -256); - extract(unpack('Nlength', $this->_string_shift($public, 4))); - $components['modulus'] = new Math_BigInteger($this->_string_shift($public, $length), -256); - - $privateLength = trim(preg_replace('#Private-Lines: (\d+)#', '$1', $key[$publicLength + 4])); - $private = base64_decode(implode('', array_map('trim', array_slice($key, $publicLength + 5, $privateLength)))); - - switch ($encryption) { - case 'aes256-cbc': - if (!class_exists('Crypt_AES')) { - include_once 'Crypt/AES.php'; - } - $symkey = ''; - $sequence = 0; - while (strlen($symkey) < 32) { - $temp = pack('Na*', $sequence++, $this->password); - $symkey.= pack('H*', sha1($temp)); - } - $symkey = substr($symkey, 0, 32); - $crypto = new Crypt_AES(); - } - - if ($encryption != 'none') { - $crypto->setKey($symkey); - $crypto->disablePadding(); - $private = $crypto->decrypt($private); - if ($private === false) { - return false; - } - } - - extract(unpack('Nlength', $this->_string_shift($private, 4))); - if (strlen($private) < $length) { - return false; - } - $components['privateExponent'] = new Math_BigInteger($this->_string_shift($private, $length), -256); - extract(unpack('Nlength', $this->_string_shift($private, 4))); - if (strlen($private) < $length) { - return false; - } - $components['primes'] = array(1 => new Math_BigInteger($this->_string_shift($private, $length), -256)); - extract(unpack('Nlength', $this->_string_shift($private, 4))); - if (strlen($private) < $length) { - return false; - } - $components['primes'][] = new Math_BigInteger($this->_string_shift($private, $length), -256); - - $temp = $components['primes'][1]->subtract($this->one); - $components['exponents'] = array(1 => $components['publicExponent']->modInverse($temp)); - $temp = $components['primes'][2]->subtract($this->one); - $components['exponents'][] = $components['publicExponent']->modInverse($temp); - - extract(unpack('Nlength', $this->_string_shift($private, 4))); - if (strlen($private) < $length) { - return false; - } - $components['coefficients'] = array(2 => new Math_BigInteger($this->_string_shift($private, $length), -256)); - - return $components; - } - } - - /** - * Returns the key size - * - * More specifically, this returns the size of the modulo in bits. - * - * @access public - * @return Integer - */ - function getSize() - { - return !isset($this->modulus) ? 0 : strlen($this->modulus->toBits()); - } - - /** - * Start Element Handler - * - * Called by xml_set_element_handler() - * - * @access private - * @param Resource $parser - * @param String $name - * @param Array $attribs - */ - function _start_element_handler($parser, $name, $attribs) - { - //$name = strtoupper($name); - switch ($name) { - case 'MODULUS': - $this->current = &$this->components['modulus']; - break; - case 'EXPONENT': - $this->current = &$this->components['publicExponent']; - break; - case 'P': - $this->current = &$this->components['primes'][1]; - break; - case 'Q': - $this->current = &$this->components['primes'][2]; - break; - case 'DP': - $this->current = &$this->components['exponents'][1]; - break; - case 'DQ': - $this->current = &$this->components['exponents'][2]; - break; - case 'INVERSEQ': - $this->current = &$this->components['coefficients'][2]; - break; - case 'D': - $this->current = &$this->components['privateExponent']; - } - $this->current = ''; - } - - /** - * Stop Element Handler - * - * Called by xml_set_element_handler() - * - * @access private - * @param Resource $parser - * @param String $name - */ - function _stop_element_handler($parser, $name) - { - if (isset($this->current)) { - $this->current = new Math_BigInteger(base64_decode($this->current), 256); - unset($this->current); - } - } - - /** - * Data Handler - * - * Called by xml_set_character_data_handler() - * - * @access private - * @param Resource $parser - * @param String $data - */ - function _data_handler($parser, $data) - { - if (!isset($this->current) || is_object($this->current)) { - return; - } - $this->current.= trim($data); - } - - /** - * Loads a public or private key - * - * Returns true on success and false on failure (ie. an incorrect password was provided or the key was malformed) - * - * @access public - * @param String $key - * @param Integer $type optional - */ - function loadKey($key, $type = false) - { - if (is_object($key) && strtolower(get_class($key)) == 'crypt_rsa') { - $this->privateKeyFormat = $key->privateKeyFormat; - $this->publicKeyFormat = $key->publicKeyFormat; - $this->k = $key->k; - $this->hLen = $key->hLen; - $this->sLen = $key->sLen; - $this->mgfHLen = $key->mgfHLen; - $this->encryptionMode = $key->encryptionMode; - $this->signatureMode = $key->signatureMode; - $this->password = $key->password; - $this->configFile = $key->configFile; - $this->comment = $key->comment; - - if (is_object($key->hash)) { - $this->hash = new Crypt_Hash($key->hash->getHash()); - } - if (is_object($key->mgfHash)) { - $this->mgfHash = new Crypt_Hash($key->mgfHash->getHash()); - } - - if (is_object($key->modulus)) { - $this->modulus = $key->modulus->copy(); - } - if (is_object($key->exponent)) { - $this->exponent = $key->exponent->copy(); - } - if (is_object($key->publicExponent)) { - $this->publicExponent = $key->publicExponent->copy(); - } - - $this->primes = array(); - $this->exponents = array(); - $this->coefficients = array(); - - foreach ($this->primes as $prime) { - $this->primes[] = $prime->copy(); - } - foreach ($this->exponents as $exponent) { - $this->exponents[] = $exponent->copy(); - } - foreach ($this->coefficients as $coefficient) { - $this->coefficients[] = $coefficient->copy(); - } - - return true; - } - - if ($type === false) { - $types = array( - CRYPT_RSA_PUBLIC_FORMAT_RAW, - CRYPT_RSA_PRIVATE_FORMAT_PKCS1, - CRYPT_RSA_PRIVATE_FORMAT_XML, - CRYPT_RSA_PRIVATE_FORMAT_PUTTY, - CRYPT_RSA_PUBLIC_FORMAT_OPENSSH - ); - foreach ($types as $type) { - $components = $this->_parseKey($key, $type); - if ($components !== false) { - break; - } - } - - } else { - $components = $this->_parseKey($key, $type); - } - - if ($components === false) { - return false; - } - - if (isset($components['comment']) && $components['comment'] !== false) { - $this->comment = $components['comment']; - } - $this->modulus = $components['modulus']; - $this->k = strlen($this->modulus->toBytes()); - $this->exponent = isset($components['privateExponent']) ? $components['privateExponent'] : $components['publicExponent']; - if (isset($components['primes'])) { - $this->primes = $components['primes']; - $this->exponents = $components['exponents']; - $this->coefficients = $components['coefficients']; - $this->publicExponent = $components['publicExponent']; - } else { - $this->primes = array(); - $this->exponents = array(); - $this->coefficients = array(); - $this->publicExponent = false; - } - - switch ($type) { - case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH: - case CRYPT_RSA_PUBLIC_FORMAT_RAW: - $this->setPublicKey(); - break; - case CRYPT_RSA_PRIVATE_FORMAT_PKCS1: - switch (true) { - case strpos($key, '-BEGIN PUBLIC KEY-') !== false: - case strpos($key, '-BEGIN RSA PUBLIC KEY-') !== false: - $this->setPublicKey(); - } - } - - return true; - } - - /** - * Sets the password - * - * Private keys can be encrypted with a password. To unset the password, pass in the empty string or false. - * Or rather, pass in $password such that empty($password) && !is_string($password) is true. - * - * @see createKey() - * @see loadKey() - * @access public - * @param String $password - */ - function setPassword($password = false) - { - $this->password = $password; - } - - /** - * Defines the public key - * - * Some private key formats define the public exponent and some don't. Those that don't define it are problematic when - * used in certain contexts. For example, in SSH-2, RSA authentication works by sending the public key along with a - * message signed by the private key to the server. The SSH-2 server looks the public key up in an index of public keys - * and if it's present then proceeds to verify the signature. Problem is, if your private key doesn't include the public - * exponent this won't work unless you manually add the public exponent. phpseclib tries to guess if the key being used - * is the public key but in the event that it guesses incorrectly you might still want to explicitly set the key as being - * public. - * - * Do note that when a new key is loaded the index will be cleared. - * - * Returns true on success, false on failure - * - * @see getPublicKey() - * @access public - * @param String $key optional - * @param Integer $type optional - * @return Boolean - */ - function setPublicKey($key = false, $type = false) - { - // if a public key has already been loaded return false - if (!empty($this->publicExponent)) { - return false; - } - - if ($key === false && !empty($this->modulus)) { - $this->publicExponent = $this->exponent; - return true; - } - - if ($type === false) { - $types = array( - CRYPT_RSA_PUBLIC_FORMAT_RAW, - CRYPT_RSA_PUBLIC_FORMAT_PKCS1, - CRYPT_RSA_PUBLIC_FORMAT_XML, - CRYPT_RSA_PUBLIC_FORMAT_OPENSSH - ); - foreach ($types as $type) { - $components = $this->_parseKey($key, $type); - if ($components !== false) { - break; - } - } - } else { - $components = $this->_parseKey($key, $type); - } - - if ($components === false) { - return false; - } - - if (empty($this->modulus) || !$this->modulus->equals($components['modulus'])) { - $this->modulus = $components['modulus']; - $this->exponent = $this->publicExponent = $components['publicExponent']; - return true; - } - - $this->publicExponent = $components['publicExponent']; - - return true; - } - - /** - * Defines the private key - * - * If phpseclib guessed a private key was a public key and loaded it as such it might be desirable to force - * phpseclib to treat the key as a private key. This function will do that. - * - * Do note that when a new key is loaded the index will be cleared. - * - * Returns true on success, false on failure - * - * @see getPublicKey() - * @access public - * @param String $key optional - * @param Integer $type optional - * @return Boolean - */ - function setPrivateKey($key = false, $type = false) - { - if ($key === false && !empty($this->publicExponent)) { - unset($this->publicExponent); - return true; - } - - $rsa = new Crypt_RSA(); - if (!$rsa->loadKey($key, $type)) { - return false; - } - unset($rsa->publicExponent); - - // don't overwrite the old key if the new key is invalid - $this->loadKey($rsa); - return true; - } - - /** - * Returns the public key - * - * The public key is only returned under two circumstances - if the private key had the public key embedded within it - * or if the public key was set via setPublicKey(). If the currently loaded key is supposed to be the public key this - * function won't return it since this library, for the most part, doesn't distinguish between public and private keys. - * - * @see getPublicKey() - * @access public - * @param String $key - * @param Integer $type optional - */ - function getPublicKey($type = CRYPT_RSA_PUBLIC_FORMAT_PKCS8) - { - if (empty($this->modulus) || empty($this->publicExponent)) { - return false; - } - - $oldFormat = $this->publicKeyFormat; - $this->publicKeyFormat = $type; - $temp = $this->_convertPublicKey($this->modulus, $this->publicExponent); - $this->publicKeyFormat = $oldFormat; - return $temp; - } - - /** - * Returns the private key - * - * The private key is only returned if the currently loaded key contains the constituent prime numbers. - * - * @see getPublicKey() - * @access public - * @param String $key - * @param Integer $type optional - */ - function getPrivateKey($type = CRYPT_RSA_PUBLIC_FORMAT_PKCS1) - { - if (empty($this->primes)) { - return false; - } - - $oldFormat = $this->privateKeyFormat; - $this->privateKeyFormat = $type; - $temp = $this->_convertPrivateKey($this->modulus, $this->publicExponent, $this->exponent, $this->primes, $this->exponents, $this->coefficients); - $this->privateKeyFormat = $oldFormat; - return $temp; - } - - /** - * Returns a minimalistic private key - * - * Returns the private key without the prime number constituants. Structurally identical to a public key that - * hasn't been set as the public key - * - * @see getPrivateKey() - * @access private - * @param String $key - * @param Integer $type optional - */ - function _getPrivatePublicKey($mode = CRYPT_RSA_PUBLIC_FORMAT_PKCS8) - { - if (empty($this->modulus) || empty($this->exponent)) { - return false; - } - - $oldFormat = $this->publicKeyFormat; - $this->publicKeyFormat = $mode; - $temp = $this->_convertPublicKey($this->modulus, $this->exponent); - $this->publicKeyFormat = $oldFormat; - return $temp; - } - - /** - * __toString() magic method - * - * @access public - */ - function __toString() - { - $key = $this->getPrivateKey($this->privateKeyFormat); - if ($key !== false) { - return $key; - } - $key = $this->_getPrivatePublicKey($this->publicKeyFormat); - return $key !== false ? $key : ''; - } - - /** - * __clone() magic method - * - * @access public - */ - function __clone() - { - $key = new Crypt_RSA(); - $key->loadKey($this); - return $key; - } - - /** - * Generates the smallest and largest numbers requiring $bits bits - * - * @access private - * @param Integer $bits - * @return Array - */ - function _generateMinMax($bits) - { - $bytes = $bits >> 3; - $min = str_repeat(chr(0), $bytes); - $max = str_repeat(chr(0xFF), $bytes); - $msb = $bits & 7; - if ($msb) { - $min = chr(1 << ($msb - 1)) . $min; - $max = chr((1 << $msb) - 1) . $max; - } else { - $min[0] = chr(0x80); - } - - return array( - 'min' => new Math_BigInteger($min, 256), - 'max' => new Math_BigInteger($max, 256) - ); - } - - /** - * DER-decode the length - * - * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See - * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. - * - * @access private - * @param String $string - * @return Integer - */ - function _decodeLength(&$string) - { - $length = ord($this->_string_shift($string)); - if ( $length & 0x80 ) { // definite length, long form - $length&= 0x7F; - $temp = $this->_string_shift($string, $length); - list(, $length) = unpack('N', substr(str_pad($temp, 4, chr(0), STR_PAD_LEFT), -4)); - } - return $length; - } - - /** - * DER-encode the length - * - * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See - * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. - * - * @access private - * @param Integer $length - * @return String - */ - function _encodeLength($length) - { - if ($length <= 0x7F) { - return chr($length); - } - - $temp = ltrim(pack('N', $length), chr(0)); - return pack('Ca*', 0x80 | strlen($temp), $temp); - } - - /** - * String Shift - * - * Inspired by array_shift - * - * @param String $string - * @param optional Integer $index - * @return String - * @access private - */ - function _string_shift(&$string, $index = 1) - { - $substr = substr($string, 0, $index); - $string = substr($string, $index); - return $substr; - } - - /** - * Determines the private key format - * - * @see createKey() - * @access public - * @param Integer $format - */ - function setPrivateKeyFormat($format) - { - $this->privateKeyFormat = $format; - } - - /** - * Determines the public key format - * - * @see createKey() - * @access public - * @param Integer $format - */ - function setPublicKeyFormat($format) - { - $this->publicKeyFormat = $format; - } - - /** - * Determines which hashing function should be used - * - * Used with signature production / verification and (if the encryption mode is CRYPT_RSA_ENCRYPTION_OAEP) encryption and - * decryption. If $hash isn't supported, sha1 is used. - * - * @access public - * @param String $hash - */ - function setHash($hash) - { - // Crypt_Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example. - switch ($hash) { - case 'md2': - case 'md5': - case 'sha1': - case 'sha256': - case 'sha384': - case 'sha512': - $this->hash = new Crypt_Hash($hash); - $this->hashName = $hash; - break; - default: - $this->hash = new Crypt_Hash('sha1'); - $this->hashName = 'sha1'; - } - $this->hLen = $this->hash->getLength(); - } - - /** - * Determines which hashing function should be used for the mask generation function - * - * The mask generation function is used by CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_SIGNATURE_PSS and although it's - * best if Hash and MGFHash are set to the same thing this is not a requirement. - * - * @access public - * @param String $hash - */ - function setMGFHash($hash) - { - // Crypt_Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example. - switch ($hash) { - case 'md2': - case 'md5': - case 'sha1': - case 'sha256': - case 'sha384': - case 'sha512': - $this->mgfHash = new Crypt_Hash($hash); - break; - default: - $this->mgfHash = new Crypt_Hash('sha1'); - } - $this->mgfHLen = $this->mgfHash->getLength(); - } - - /** - * Determines the salt length - * - * To quote from {@link http://tools.ietf.org/html/rfc3447#page-38 RFC3447#page-38}: - * - * Typical salt lengths in octets are hLen (the length of the output - * of the hash function Hash) and 0. - * - * @access public - * @param Integer $format - */ - function setSaltLength($sLen) - { - $this->sLen = $sLen; - } - - /** - * Integer-to-Octet-String primitive - * - * See {@link http://tools.ietf.org/html/rfc3447#section-4.1 RFC3447#section-4.1}. - * - * @access private - * @param Math_BigInteger $x - * @param Integer $xLen - * @return String - */ - function _i2osp($x, $xLen) - { - $x = $x->toBytes(); - if (strlen($x) > $xLen) { - user_error('Integer too large'); - return false; - } - return str_pad($x, $xLen, chr(0), STR_PAD_LEFT); - } - - /** - * Octet-String-to-Integer primitive - * - * See {@link http://tools.ietf.org/html/rfc3447#section-4.2 RFC3447#section-4.2}. - * - * @access private - * @param String $x - * @return Math_BigInteger - */ - function _os2ip($x) - { - return new Math_BigInteger($x, 256); - } - - /** - * Exponentiate with or without Chinese Remainder Theorem - * - * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.1 RFC3447#section-5.1.2}. - * - * @access private - * @param Math_BigInteger $x - * @return Math_BigInteger - */ - function _exponentiate($x) - { - if (empty($this->primes) || empty($this->coefficients) || empty($this->exponents)) { - return $x->modPow($this->exponent, $this->modulus); - } - - $num_primes = count($this->primes); - - if (defined('CRYPT_RSA_DISABLE_BLINDING')) { - $m_i = array( - 1 => $x->modPow($this->exponents[1], $this->primes[1]), - 2 => $x->modPow($this->exponents[2], $this->primes[2]) - ); - $h = $m_i[1]->subtract($m_i[2]); - $h = $h->multiply($this->coefficients[2]); - list(, $h) = $h->divide($this->primes[1]); - $m = $m_i[2]->add($h->multiply($this->primes[2])); - - $r = $this->primes[1]; - for ($i = 3; $i <= $num_primes; $i++) { - $m_i = $x->modPow($this->exponents[$i], $this->primes[$i]); - - $r = $r->multiply($this->primes[$i - 1]); - - $h = $m_i->subtract($m); - $h = $h->multiply($this->coefficients[$i]); - list(, $h) = $h->divide($this->primes[$i]); - - $m = $m->add($r->multiply($h)); - } - } else { - $smallest = $this->primes[1]; - for ($i = 2; $i <= $num_primes; $i++) { - if ($smallest->compare($this->primes[$i]) > 0) { - $smallest = $this->primes[$i]; - } - } - - $one = new Math_BigInteger(1); - - $r = $one->random($one, $smallest->subtract($one)); - - $m_i = array( - 1 => $this->_blind($x, $r, 1), - 2 => $this->_blind($x, $r, 2) - ); - $h = $m_i[1]->subtract($m_i[2]); - $h = $h->multiply($this->coefficients[2]); - list(, $h) = $h->divide($this->primes[1]); - $m = $m_i[2]->add($h->multiply($this->primes[2])); - - $r = $this->primes[1]; - for ($i = 3; $i <= $num_primes; $i++) { - $m_i = $this->_blind($x, $r, $i); - - $r = $r->multiply($this->primes[$i - 1]); - - $h = $m_i->subtract($m); - $h = $h->multiply($this->coefficients[$i]); - list(, $h) = $h->divide($this->primes[$i]); - - $m = $m->add($r->multiply($h)); - } - } - - return $m; - } - - /** - * Performs RSA Blinding - * - * Protects against timing attacks by employing RSA Blinding. - * Returns $x->modPow($this->exponents[$i], $this->primes[$i]) - * - * @access private - * @param Math_BigInteger $x - * @param Math_BigInteger $r - * @param Integer $i - * @return Math_BigInteger - */ - function _blind($x, $r, $i) - { - $x = $x->multiply($r->modPow($this->publicExponent, $this->primes[$i])); - $x = $x->modPow($this->exponents[$i], $this->primes[$i]); - - $r = $r->modInverse($this->primes[$i]); - $x = $x->multiply($r); - list(, $x) = $x->divide($this->primes[$i]); - - return $x; - } - - /** - * Performs blinded RSA equality testing - * - * Protects against a particular type of timing attack described. - * - * See {@link http://codahale.com/a-lesson-in-timing-attacks/ A Lesson In Timing Attacks (or, Don't use MessageDigest.isEquals)} - * - * Thanks for the heads up singpolyma! - * - * @access private - * @param String $x - * @param String $y - * @return Boolean - */ - function _equals($x, $y) - { - if (strlen($x) != strlen($y)) { - return false; - } - - $result = 0; - for ($i = 0; $i < strlen($x); $i++) { - $result |= ord($x[$i]) ^ ord($y[$i]); - } - - return $result == 0; - } - - /** - * RSAEP - * - * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.1 RFC3447#section-5.1.1}. - * - * @access private - * @param Math_BigInteger $m - * @return Math_BigInteger - */ - function _rsaep($m) - { - if ($m->compare($this->zero) < 0 || $m->compare($this->modulus) > 0) { - user_error('Message representative out of range'); - return false; - } - return $this->_exponentiate($m); - } - - /** - * RSADP - * - * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.2 RFC3447#section-5.1.2}. - * - * @access private - * @param Math_BigInteger $c - * @return Math_BigInteger - */ - function _rsadp($c) - { - if ($c->compare($this->zero) < 0 || $c->compare($this->modulus) > 0) { - user_error('Ciphertext representative out of range'); - return false; - } - return $this->_exponentiate($c); - } - - /** - * RSASP1 - * - * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.1 RFC3447#section-5.2.1}. - * - * @access private - * @param Math_BigInteger $m - * @return Math_BigInteger - */ - function _rsasp1($m) - { - if ($m->compare($this->zero) < 0 || $m->compare($this->modulus) > 0) { - user_error('Message representative out of range'); - return false; - } - return $this->_exponentiate($m); - } - - /** - * RSAVP1 - * - * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.2 RFC3447#section-5.2.2}. - * - * @access private - * @param Math_BigInteger $s - * @return Math_BigInteger - */ - function _rsavp1($s) - { - if ($s->compare($this->zero) < 0 || $s->compare($this->modulus) > 0) { - user_error('Signature representative out of range'); - return false; - } - return $this->_exponentiate($s); - } - - /** - * MGF1 - * - * See {@link http://tools.ietf.org/html/rfc3447#appendix-B.2.1 RFC3447#appendix-B.2.1}. - * - * @access private - * @param String $mgfSeed - * @param Integer $mgfLen - * @return String - */ - function _mgf1($mgfSeed, $maskLen) - { - // if $maskLen would yield strings larger than 4GB, PKCS#1 suggests a "Mask too long" error be output. - - $t = ''; - $count = ceil($maskLen / $this->mgfHLen); - for ($i = 0; $i < $count; $i++) { - $c = pack('N', $i); - $t.= $this->mgfHash->hash($mgfSeed . $c); - } - - return substr($t, 0, $maskLen); - } - - /** - * RSAES-OAEP-ENCRYPT - * - * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.1 RFC3447#section-7.1.1} and - * {http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding OAES}. - * - * @access private - * @param String $m - * @param String $l - * @return String - */ - function _rsaes_oaep_encrypt($m, $l = '') - { - $mLen = strlen($m); - - // Length checking - - // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error - // be output. - - if ($mLen > $this->k - 2 * $this->hLen - 2) { - user_error('Message too long'); - return false; - } - - // EME-OAEP encoding - - $lHash = $this->hash->hash($l); - $ps = str_repeat(chr(0), $this->k - $mLen - 2 * $this->hLen - 2); - $db = $lHash . $ps . chr(1) . $m; - $seed = crypt_random_string($this->hLen); - $dbMask = $this->_mgf1($seed, $this->k - $this->hLen - 1); - $maskedDB = $db ^ $dbMask; - $seedMask = $this->_mgf1($maskedDB, $this->hLen); - $maskedSeed = $seed ^ $seedMask; - $em = chr(0) . $maskedSeed . $maskedDB; - - // RSA encryption - - $m = $this->_os2ip($em); - $c = $this->_rsaep($m); - $c = $this->_i2osp($c, $this->k); - - // Output the ciphertext C - - return $c; - } - - /** - * RSAES-OAEP-DECRYPT - * - * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.2 RFC3447#section-7.1.2}. The fact that the error - * messages aren't distinguishable from one another hinders debugging, but, to quote from RFC3447#section-7.1.2: - * - * Note. Care must be taken to ensure that an opponent cannot - * distinguish the different error conditions in Step 3.g, whether by - * error message or timing, or, more generally, learn partial - * information about the encoded message EM. Otherwise an opponent may - * be able to obtain useful information about the decryption of the - * ciphertext C, leading to a chosen-ciphertext attack such as the one - * observed by Manger [36]. - * - * As for $l... to quote from {@link http://tools.ietf.org/html/rfc3447#page-17 RFC3447#page-17}: - * - * Both the encryption and the decryption operations of RSAES-OAEP take - * the value of a label L as input. In this version of PKCS #1, L is - * the empty string; other uses of the label are outside the scope of - * this document. - * - * @access private - * @param String $c - * @param String $l - * @return String - */ - function _rsaes_oaep_decrypt($c, $l = '') - { - // Length checking - - // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error - // be output. - - if (strlen($c) != $this->k || $this->k < 2 * $this->hLen + 2) { - user_error('Decryption error'); - return false; - } - - // RSA decryption - - $c = $this->_os2ip($c); - $m = $this->_rsadp($c); - if ($m === false) { - user_error('Decryption error'); - return false; - } - $em = $this->_i2osp($m, $this->k); - - // EME-OAEP decoding - - $lHash = $this->hash->hash($l); - $y = ord($em[0]); - $maskedSeed = substr($em, 1, $this->hLen); - $maskedDB = substr($em, $this->hLen + 1); - $seedMask = $this->_mgf1($maskedDB, $this->hLen); - $seed = $maskedSeed ^ $seedMask; - $dbMask = $this->_mgf1($seed, $this->k - $this->hLen - 1); - $db = $maskedDB ^ $dbMask; - $lHash2 = substr($db, 0, $this->hLen); - $m = substr($db, $this->hLen); - if ($lHash != $lHash2) { - user_error('Decryption error'); - return false; - } - $m = ltrim($m, chr(0)); - if (ord($m[0]) != 1) { - user_error('Decryption error'); - return false; - } - - // Output the message M - - return substr($m, 1); - } - - /** - * RSAES-PKCS1-V1_5-ENCRYPT - * - * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.1 RFC3447#section-7.2.1}. - * - * @access private - * @param String $m - * @return String - */ - function _rsaes_pkcs1_v1_5_encrypt($m) - { - $mLen = strlen($m); - - // Length checking - - if ($mLen > $this->k - 11) { - user_error('Message too long'); - return false; - } - - // EME-PKCS1-v1_5 encoding - - $psLen = $this->k - $mLen - 3; - $ps = ''; - while (strlen($ps) != $psLen) { - $temp = crypt_random_string($psLen - strlen($ps)); - $temp = str_replace("\x00", '', $temp); - $ps.= $temp; - } - $type = 2; - // see the comments of _rsaes_pkcs1_v1_5_decrypt() to understand why this is being done - if (defined('CRYPT_RSA_PKCS15_COMPAT') && (!isset($this->publicExponent) || $this->exponent !== $this->publicExponent)) { - $type = 1; - // "The padding string PS shall consist of k-3-||D|| octets. ... for block type 01, they shall have value FF" - $ps = str_repeat("\xFF", $psLen); - } - $em = chr(0) . chr($type) . $ps . chr(0) . $m; - - // RSA encryption - $m = $this->_os2ip($em); - $c = $this->_rsaep($m); - $c = $this->_i2osp($c, $this->k); - - // Output the ciphertext C - - return $c; - } - - /** - * RSAES-PKCS1-V1_5-DECRYPT - * - * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.2 RFC3447#section-7.2.2}. - * - * For compatibility purposes, this function departs slightly from the description given in RFC3447. - * The reason being that RFC2313#section-8.1 (PKCS#1 v1.5) states that ciphertext's encrypted by the - * private key should have the second byte set to either 0 or 1 and that ciphertext's encrypted by the - * public key should have the second byte set to 2. In RFC3447 (PKCS#1 v2.1), the second byte is supposed - * to be 2 regardless of which key is used. For compatibility purposes, we'll just check to make sure the - * second byte is 2 or less. If it is, we'll accept the decrypted string as valid. - * - * As a consequence of this, a private key encrypted ciphertext produced with Crypt_RSA may not decrypt - * with a strictly PKCS#1 v1.5 compliant RSA implementation. Public key encrypted ciphertext's should but - * not private key encrypted ciphertext's. - * - * @access private - * @param String $c - * @return String - */ - function _rsaes_pkcs1_v1_5_decrypt($c) - { - // Length checking - - if (strlen($c) != $this->k) { // or if k < 11 - user_error('Decryption error'); - return false; - } - - // RSA decryption - - $c = $this->_os2ip($c); - $m = $this->_rsadp($c); - - if ($m === false) { - user_error('Decryption error'); - return false; - } - $em = $this->_i2osp($m, $this->k); - - // EME-PKCS1-v1_5 decoding - - if (ord($em[0]) != 0 || ord($em[1]) > 2) { - user_error('Decryption error'); - return false; - } - - $ps = substr($em, 2, strpos($em, chr(0), 2) - 2); - $m = substr($em, strlen($ps) + 3); - - if (strlen($ps) < 8) { - user_error('Decryption error'); - return false; - } - - // Output M - - return $m; - } - - /** - * EMSA-PSS-ENCODE - * - * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.1 RFC3447#section-9.1.1}. - * - * @access private - * @param String $m - * @param Integer $emBits - */ - function _emsa_pss_encode($m, $emBits) - { - // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error - // be output. - - $emLen = ($emBits + 1) >> 3; // ie. ceil($emBits / 8) - $sLen = $this->sLen == false ? $this->hLen : $this->sLen; - - $mHash = $this->hash->hash($m); - if ($emLen < $this->hLen + $sLen + 2) { - user_error('Encoding error'); - return false; - } - - $salt = crypt_random_string($sLen); - $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt; - $h = $this->hash->hash($m2); - $ps = str_repeat(chr(0), $emLen - $sLen - $this->hLen - 2); - $db = $ps . chr(1) . $salt; - $dbMask = $this->_mgf1($h, $emLen - $this->hLen - 1); - $maskedDB = $db ^ $dbMask; - $maskedDB[0] = ~chr(0xFF << ($emBits & 7)) & $maskedDB[0]; - $em = $maskedDB . $h . chr(0xBC); - - return $em; - } - - /** - * EMSA-PSS-VERIFY - * - * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.2 RFC3447#section-9.1.2}. - * - * @access private - * @param String $m - * @param String $em - * @param Integer $emBits - * @return String - */ - function _emsa_pss_verify($m, $em, $emBits) - { - // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error - // be output. - - $emLen = ($emBits + 1) >> 3; // ie. ceil($emBits / 8); - $sLen = $this->sLen == false ? $this->hLen : $this->sLen; - - $mHash = $this->hash->hash($m); - if ($emLen < $this->hLen + $sLen + 2) { - return false; - } - - if ($em[strlen($em) - 1] != chr(0xBC)) { - return false; - } - - $maskedDB = substr($em, 0, -$this->hLen - 1); - $h = substr($em, -$this->hLen - 1, $this->hLen); - $temp = chr(0xFF << ($emBits & 7)); - if ((~$maskedDB[0] & $temp) != $temp) { - return false; - } - $dbMask = $this->_mgf1($h, $emLen - $this->hLen - 1); - $db = $maskedDB ^ $dbMask; - $db[0] = ~chr(0xFF << ($emBits & 7)) & $db[0]; - $temp = $emLen - $this->hLen - $sLen - 2; - if (substr($db, 0, $temp) != str_repeat(chr(0), $temp) || ord($db[$temp]) != 1) { - return false; - } - $salt = substr($db, $temp + 1); // should be $sLen long - $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt; - $h2 = $this->hash->hash($m2); - return $this->_equals($h, $h2); - } - - /** - * RSASSA-PSS-SIGN - * - * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.1 RFC3447#section-8.1.1}. - * - * @access private - * @param String $m - * @return String - */ - function _rsassa_pss_sign($m) - { - // EMSA-PSS encoding - - $em = $this->_emsa_pss_encode($m, 8 * $this->k - 1); - - // RSA signature - - $m = $this->_os2ip($em); - $s = $this->_rsasp1($m); - $s = $this->_i2osp($s, $this->k); - - // Output the signature S - - return $s; - } - - /** - * RSASSA-PSS-VERIFY - * - * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.2 RFC3447#section-8.1.2}. - * - * @access private - * @param String $m - * @param String $s - * @return String - */ - function _rsassa_pss_verify($m, $s) - { - // Length checking - - if (strlen($s) != $this->k) { - user_error('Invalid signature'); - return false; - } - - // RSA verification - - $modBits = 8 * $this->k; - - $s2 = $this->_os2ip($s); - $m2 = $this->_rsavp1($s2); - if ($m2 === false) { - user_error('Invalid signature'); - return false; - } - $em = $this->_i2osp($m2, $modBits >> 3); - if ($em === false) { - user_error('Invalid signature'); - return false; - } - - // EMSA-PSS verification - - return $this->_emsa_pss_verify($m, $em, $modBits - 1); - } - - /** - * EMSA-PKCS1-V1_5-ENCODE - * - * See {@link http://tools.ietf.org/html/rfc3447#section-9.2 RFC3447#section-9.2}. - * - * @access private - * @param String $m - * @param Integer $emLen - * @return String - */ - function _emsa_pkcs1_v1_5_encode($m, $emLen) - { - $h = $this->hash->hash($m); - if ($h === false) { - return false; - } - - // see http://tools.ietf.org/html/rfc3447#page-43 - switch ($this->hashName) { - case 'md2': - $t = pack('H*', '3020300c06082a864886f70d020205000410'); - break; - case 'md5': - $t = pack('H*', '3020300c06082a864886f70d020505000410'); - break; - case 'sha1': - $t = pack('H*', '3021300906052b0e03021a05000414'); - break; - case 'sha256': - $t = pack('H*', '3031300d060960864801650304020105000420'); - break; - case 'sha384': - $t = pack('H*', '3041300d060960864801650304020205000430'); - break; - case 'sha512': - $t = pack('H*', '3051300d060960864801650304020305000440'); - } - $t.= $h; - $tLen = strlen($t); - - if ($emLen < $tLen + 11) { - user_error('Intended encoded message length too short'); - return false; - } - - $ps = str_repeat(chr(0xFF), $emLen - $tLen - 3); - - $em = "\0\1$ps\0$t"; - - return $em; - } - - /** - * RSASSA-PKCS1-V1_5-SIGN - * - * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.1 RFC3447#section-8.2.1}. - * - * @access private - * @param String $m - * @return String - */ - function _rsassa_pkcs1_v1_5_sign($m) - { - // EMSA-PKCS1-v1_5 encoding - - $em = $this->_emsa_pkcs1_v1_5_encode($m, $this->k); - if ($em === false) { - user_error('RSA modulus too short'); - return false; - } - - // RSA signature - - $m = $this->_os2ip($em); - $s = $this->_rsasp1($m); - $s = $this->_i2osp($s, $this->k); - - // Output the signature S - - return $s; - } - - /** - * RSASSA-PKCS1-V1_5-VERIFY - * - * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.2 RFC3447#section-8.2.2}. - * - * @access private - * @param String $m - * @return String - */ - function _rsassa_pkcs1_v1_5_verify($m, $s) - { - // Length checking - - if (strlen($s) != $this->k) { - user_error('Invalid signature'); - return false; - } - - // RSA verification - - $s = $this->_os2ip($s); - $m2 = $this->_rsavp1($s); - if ($m2 === false) { - user_error('Invalid signature'); - return false; - } - $em = $this->_i2osp($m2, $this->k); - if ($em === false) { - user_error('Invalid signature'); - return false; - } - - // EMSA-PKCS1-v1_5 encoding - - $em2 = $this->_emsa_pkcs1_v1_5_encode($m, $this->k); - if ($em2 === false) { - user_error('RSA modulus too short'); - return false; - } - - // Compare - return $this->_equals($em, $em2); - } - - /** - * Set Encryption Mode - * - * Valid values include CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_ENCRYPTION_PKCS1. - * - * @access public - * @param Integer $mode - */ - function setEncryptionMode($mode) - { - $this->encryptionMode = $mode; - } - - /** - * Set Signature Mode - * - * Valid values include CRYPT_RSA_SIGNATURE_PSS and CRYPT_RSA_SIGNATURE_PKCS1 - * - * @access public - * @param Integer $mode - */ - function setSignatureMode($mode) - { - $this->signatureMode = $mode; - } - - /** - * Set public key comment. - * - * @access public - * @param String $comment - */ - function setComment($comment) - { - $this->comment = $comment; - } - - /** - * Get public key comment. - * - * @access public - * @return String - */ - function getComment() - { - return $this->comment; - } - - /** - * Encryption - * - * Both CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_ENCRYPTION_PKCS1 both place limits on how long $plaintext can be. - * If $plaintext exceeds those limits it will be broken up so that it does and the resultant ciphertext's will - * be concatenated together. - * - * @see decrypt() - * @access public - * @param String $plaintext - * @return String - */ - function encrypt($plaintext) - { - switch ($this->encryptionMode) { - case CRYPT_RSA_ENCRYPTION_PKCS1: - $length = $this->k - 11; - if ($length <= 0) { - return false; - } - - $plaintext = str_split($plaintext, $length); - $ciphertext = ''; - foreach ($plaintext as $m) { - $ciphertext.= $this->_rsaes_pkcs1_v1_5_encrypt($m); - } - return $ciphertext; - //case CRYPT_RSA_ENCRYPTION_OAEP: - default: - $length = $this->k - 2 * $this->hLen - 2; - if ($length <= 0) { - return false; - } - - $plaintext = str_split($plaintext, $length); - $ciphertext = ''; - foreach ($plaintext as $m) { - $ciphertext.= $this->_rsaes_oaep_encrypt($m); - } - return $ciphertext; - } - } - - /** - * Decryption - * - * @see encrypt() - * @access public - * @param String $plaintext - * @return String - */ - function decrypt($ciphertext) - { - if ($this->k <= 0) { - return false; - } - - $ciphertext = str_split($ciphertext, $this->k); - $ciphertext[count($ciphertext) - 1] = str_pad($ciphertext[count($ciphertext) - 1], $this->k, chr(0), STR_PAD_LEFT); - - $plaintext = ''; - - switch ($this->encryptionMode) { - case CRYPT_RSA_ENCRYPTION_PKCS1: - $decrypt = '_rsaes_pkcs1_v1_5_decrypt'; - break; - //case CRYPT_RSA_ENCRYPTION_OAEP: - default: - $decrypt = '_rsaes_oaep_decrypt'; - } - - foreach ($ciphertext as $c) { - $temp = $this->$decrypt($c); - if ($temp === false) { - return false; - } - $plaintext.= $temp; - } - - return $plaintext; - } - - /** - * Create a signature - * - * @see verify() - * @access public - * @param String $message - * @return String - */ - function sign($message) - { - if (empty($this->modulus) || empty($this->exponent)) { - return false; - } - - switch ($this->signatureMode) { - case CRYPT_RSA_SIGNATURE_PKCS1: - return $this->_rsassa_pkcs1_v1_5_sign($message); - //case CRYPT_RSA_SIGNATURE_PSS: - default: - return $this->_rsassa_pss_sign($message); - } - } - - /** - * Verifies a signature - * - * @see sign() - * @access public - * @param String $message - * @param String $signature - * @return Boolean - */ - function verify($message, $signature) - { - if (empty($this->modulus) || empty($this->exponent)) { - return false; - } - - switch ($this->signatureMode) { - case CRYPT_RSA_SIGNATURE_PKCS1: - return $this->_rsassa_pkcs1_v1_5_verify($message, $signature); - //case CRYPT_RSA_SIGNATURE_PSS: - default: - return $this->_rsassa_pss_verify($message, $signature); - } - } - - /** - * Extract raw BER from Base64 encoding - * - * @access private - * @param String $str - * @return String - */ - function _extractBER($str) - { - /* X.509 certs are assumed to be base64 encoded but sometimes they'll have additional things in them - * above and beyond the ceritificate. - * ie. some may have the following preceding the -----BEGIN CERTIFICATE----- line: - * - * Bag Attributes - * localKeyID: 01 00 00 00 - * subject=/O=organization/OU=org unit/CN=common name - * issuer=/O=organization/CN=common name - */ - $temp = preg_replace('#.*?^-+[^-]+-+#ms', '', $str, 1); - // remove the -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- stuff - $temp = preg_replace('#-+[^-]+-+#', '', $temp); - // remove new lines - $temp = str_replace(array("\r", "\n", ' '), '', $temp); - $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? base64_decode($temp) : false; - return $temp != false ? $temp : $str; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Random.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Random.php deleted file mode 100755 index 918b97bf..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Random.php +++ /dev/null @@ -1,300 +0,0 @@ - - * - * - * - * LICENSE: 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. - * - * @category Crypt - * @package Crypt_Random - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -// laravel is a PHP framework that utilizes phpseclib. laravel workbenches may, independently, -// have phpseclib as a requirement as well. if you're developing such a program you may encounter -// a "Cannot redeclare crypt_random_string()" error. -if (!function_exists('crypt_random_string')) { - /** - * "Is Windows" test - * - * @access private - */ - define('CRYPT_RANDOM_IS_WINDOWS', strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'); - - /** - * Generate a random string. - * - * Although microoptimizations are generally discouraged as they impair readability this function is ripe with - * microoptimizations because this function has the potential of being called a huge number of times. - * eg. for RSA key generation. - * - * @param Integer $length - * @return String - * @access public - */ - function crypt_random_string($length) - { - if (CRYPT_RANDOM_IS_WINDOWS) { - // method 1. prior to PHP 5.3 this would call rand() on windows hence the function_exists('class_alias') call. - // ie. class_alias is a function that was introduced in PHP 5.3 - if (function_exists('mcrypt_create_iv') && function_exists('class_alias')) { - return mcrypt_create_iv($length); - } - // method 2. openssl_random_pseudo_bytes was introduced in PHP 5.3.0 but prior to PHP 5.3.4 there was, - // to quote , "possible blocking behavior". as of 5.3.4 - // openssl_random_pseudo_bytes and mcrypt_create_iv do the exact same thing on Windows. ie. they both - // call php_win32_get_random_bytes(): - // - // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/openssl/openssl.c#L5008 - // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1392 - // - // php_win32_get_random_bytes() is defined thusly: - // - // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/win32/winutil.c#L80 - // - // we're calling it, all the same, in the off chance that the mcrypt extension is not available - if (function_exists('openssl_random_pseudo_bytes') && version_compare(PHP_VERSION, '5.3.4', '>=')) { - return openssl_random_pseudo_bytes($length); - } - } else { - // method 1. the fastest - if (function_exists('openssl_random_pseudo_bytes')) { - return openssl_random_pseudo_bytes($length); - } - // method 2 - static $fp = true; - if ($fp === true) { - // warning's will be output unles the error suppression operator is used. errors such as - // "open_basedir restriction in effect", "Permission denied", "No such file or directory", etc. - $fp = @fopen('/dev/urandom', 'rb'); - } - if ($fp !== true && $fp !== false) { // surprisingly faster than !is_bool() or is_resource() - return fread($fp, $length); - } - // method 3. pretty much does the same thing as method 2 per the following url: - // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1391 - // surprisingly slower than method 2. maybe that's because mcrypt_create_iv does a bunch of error checking that we're - // not doing. regardless, this'll only be called if this PHP script couldn't open /dev/urandom due to open_basedir - // restrictions or some such - if (function_exists('mcrypt_create_iv')) { - return mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); - } - } - // at this point we have no choice but to use a pure-PHP CSPRNG - - // cascade entropy across multiple PHP instances by fixing the session and collecting all - // environmental variables, including the previous session data and the current session - // data. - // - // mt_rand seeds itself by looking at the PID and the time, both of which are (relatively) - // easy to guess at. linux uses mouse clicks, keyboard timings, etc, as entropy sources, but - // PHP isn't low level to be able to use those as sources and on a web server there's not likely - // going to be a ton of keyboard or mouse action. web servers do have one thing that we can use - // however, a ton of people visiting the website. obviously you don't want to base your seeding - // soley on parameters a potential attacker sends but (1) not everything in $_SERVER is controlled - // by the user and (2) this isn't just looking at the data sent by the current user - it's based - // on the data sent by all users. one user requests the page and a hash of their info is saved. - // another user visits the page and the serialization of their data is utilized along with the - // server envirnment stuff and a hash of the previous http request data (which itself utilizes - // a hash of the session data before that). certainly an attacker should be assumed to have - // full control over his own http requests. he, however, is not going to have control over - // everyone's http requests. - static $crypto = false, $v; - if ($crypto === false) { - // save old session data - $old_session_id = session_id(); - $old_use_cookies = ini_get('session.use_cookies'); - $old_session_cache_limiter = session_cache_limiter(); - $_OLD_SESSION = isset($_SESSION) ? $_SESSION : false; - if ($old_session_id != '') { - session_write_close(); - } - - session_id(1); - ini_set('session.use_cookies', 0); - session_cache_limiter(''); - session_start(); - - $v = $seed = $_SESSION['seed'] = pack('H*', sha1( - serialize($_SERVER) . - serialize($_POST) . - serialize($_GET) . - serialize($_COOKIE) . - serialize($GLOBALS) . - serialize($_SESSION) . - serialize($_OLD_SESSION) - )); - if (!isset($_SESSION['count'])) { - $_SESSION['count'] = 0; - } - $_SESSION['count']++; - - session_write_close(); - - // restore old session data - if ($old_session_id != '') { - session_id($old_session_id); - session_start(); - ini_set('session.use_cookies', $old_use_cookies); - session_cache_limiter($old_session_cache_limiter); - } else { - if ($_OLD_SESSION !== false) { - $_SESSION = $_OLD_SESSION; - unset($_OLD_SESSION); - } else { - unset($_SESSION); - } - } - - // in SSH2 a shared secret and an exchange hash are generated through the key exchange process. - // the IV client to server is the hash of that "nonce" with the letter A and for the encryption key it's the letter C. - // if the hash doesn't produce enough a key or an IV that's long enough concat successive hashes of the - // original hash and the current hash. we'll be emulating that. for more info see the following URL: - // - // http://tools.ietf.org/html/rfc4253#section-7.2 - // - // see the is_string($crypto) part for an example of how to expand the keys - $key = pack('H*', sha1($seed . 'A')); - $iv = pack('H*', sha1($seed . 'C')); - - // ciphers are used as per the nist.gov link below. also, see this link: - // - // http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator#Designs_based_on_cryptographic_primitives - switch (true) { - case phpseclib_resolve_include_path('Crypt/AES.php'): - if (!class_exists('Crypt_AES')) { - include_once 'AES.php'; - } - $crypto = new Crypt_AES(CRYPT_AES_MODE_CTR); - break; - case phpseclib_resolve_include_path('Crypt/Twofish.php'): - if (!class_exists('Crypt_Twofish')) { - include_once 'Twofish.php'; - } - $crypto = new Crypt_Twofish(CRYPT_TWOFISH_MODE_CTR); - break; - case phpseclib_resolve_include_path('Crypt/Blowfish.php'): - if (!class_exists('Crypt_Blowfish')) { - include_once 'Blowfish.php'; - } - $crypto = new Crypt_Blowfish(CRYPT_BLOWFISH_MODE_CTR); - break; - case phpseclib_resolve_include_path('Crypt/TripleDES.php'): - if (!class_exists('Crypt_TripleDES')) { - include_once 'TripleDES.php'; - } - $crypto = new Crypt_TripleDES(CRYPT_DES_MODE_CTR); - break; - case phpseclib_resolve_include_path('Crypt/DES.php'): - if (!class_exists('Crypt_DES')) { - include_once 'DES.php'; - } - $crypto = new Crypt_DES(CRYPT_DES_MODE_CTR); - break; - case phpseclib_resolve_include_path('Crypt/RC4.php'): - if (!class_exists('Crypt_RC4')) { - include_once 'RC4.php'; - } - $crypto = new Crypt_RC4(); - break; - default: - user_error('crypt_random_string requires at least one symmetric cipher be loaded'); - return false; - } - - $crypto->setKey($key); - $crypto->setIV($iv); - $crypto->enableContinuousBuffer(); - } - - //return $crypto->encrypt(str_repeat("\0", $length)); - - // the following is based off of ANSI X9.31: - // - // http://csrc.nist.gov/groups/STM/cavp/documents/rng/931rngext.pdf - // - // OpenSSL uses that same standard for it's random numbers: - // - // http://www.opensource.apple.com/source/OpenSSL/OpenSSL-38/openssl/fips-1.0/rand/fips_rand.c - // (do a search for "ANS X9.31 A.2.4") - $result = ''; - while (strlen($result) < $length) { - $i = $crypto->encrypt(microtime()); // strlen(microtime()) == 21 - $r = $crypto->encrypt($i ^ $v); // strlen($v) == 20 - $v = $crypto->encrypt($r ^ $i); // strlen($r) == 20 - $result.= $r; - } - return substr($result, 0, $length); - } -} - -if (!function_exists('phpseclib_resolve_include_path')) { - /** - * Resolve filename against the include path. - * - * Wrapper around stream_resolve_include_path() (which was introduced in - * PHP 5.3.2) with fallback implementation for earlier PHP versions. - * - * @param string $filename - * @return mixed Filename (string) on success, false otherwise. - * @access public - */ - function phpseclib_resolve_include_path($filename) - { - if (function_exists('stream_resolve_include_path')) { - return stream_resolve_include_path($filename); - } - - // handle non-relative paths - if (file_exists($filename)) { - return realpath($filename); - } - - $paths = PATH_SEPARATOR == ':' ? - preg_split('#(? - * setKey('abcdefghijklmnop'); - * - * $size = 10 * 1024; - * $plaintext = ''; - * for ($i = 0; $i < $size; $i++) { - * $plaintext.= 'a'; - * } - * - * echo $rijndael->decrypt($rijndael->encrypt($plaintext)); - * ?> - * - * - * LICENSE: 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. - * - * @category Crypt - * @package Crypt_Rijndael - * @author Jim Wigginton - * @copyright 2008 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include Crypt_Base - * - * Base cipher class - */ -if (!class_exists('Crypt_Base')) { - include_once 'Base.php'; -} - -/**#@+ - * @access public - * @see Crypt_Rijndael::encrypt() - * @see Crypt_Rijndael::decrypt() - */ -/** - * Encrypt / decrypt using the Counter mode. - * - * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 - */ -define('CRYPT_RIJNDAEL_MODE_CTR', CRYPT_MODE_CTR); -/** - * Encrypt / decrypt using the Electronic Code Book mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 - */ -define('CRYPT_RIJNDAEL_MODE_ECB', CRYPT_MODE_ECB); -/** - * Encrypt / decrypt using the Code Book Chaining mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 - */ -define('CRYPT_RIJNDAEL_MODE_CBC', CRYPT_MODE_CBC); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 - */ -define('CRYPT_RIJNDAEL_MODE_CFB', CRYPT_MODE_CFB); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 - */ -define('CRYPT_RIJNDAEL_MODE_OFB', CRYPT_MODE_OFB); -/**#@-*/ - -/**#@+ - * @access private - * @see Crypt_Base::Crypt_Base() - */ -/** - * Toggles the internal implementation - */ -define('CRYPT_RIJNDAEL_MODE_INTERNAL', CRYPT_MODE_INTERNAL); -/** - * Toggles the mcrypt implementation - */ -define('CRYPT_RIJNDAEL_MODE_MCRYPT', CRYPT_MODE_MCRYPT); -/**#@-*/ - -/** - * Pure-PHP implementation of Rijndael. - * - * @package Crypt_Rijndael - * @author Jim Wigginton - * @access public - */ -class Crypt_Rijndael extends Crypt_Base -{ - /** - * The default password key_size used by setPassword() - * - * @see Crypt_Base::password_key_size - * @see Crypt_Base::setPassword() - * @var Integer - * @access private - */ - var $password_key_size = 16; - - /** - * The namespace used by the cipher for its constants. - * - * @see Crypt_Base::const_namespace - * @var String - * @access private - */ - var $const_namespace = 'RIJNDAEL'; - - /** - * The mcrypt specific name of the cipher - * - * Mcrypt is useable for 128/192/256-bit $block_size/$key_size. For 160/224 not. - * Crypt_Rijndael determines automatically whether mcrypt is useable - * or not for the current $block_size/$key_size. - * In case of, $cipher_name_mcrypt will be set dynamically at run time accordingly. - * - * @see Crypt_Base::cipher_name_mcrypt - * @see Crypt_Base::engine - * @see _setupEngine() - * @var String - * @access private - */ - var $cipher_name_mcrypt = 'rijndael-128'; - - /** - * The default salt used by setPassword() - * - * @see Crypt_Base::password_default_salt - * @see Crypt_Base::setPassword() - * @var String - * @access private - */ - var $password_default_salt = 'phpseclib'; - - /** - * Has the key length explicitly been set or should it be derived from the key, itself? - * - * @see setKeyLength() - * @var Boolean - * @access private - */ - var $explicit_key_length = false; - - /** - * The Key Schedule - * - * @see _setup() - * @var Array - * @access private - */ - var $w; - - /** - * The Inverse Key Schedule - * - * @see _setup() - * @var Array - * @access private - */ - var $dw; - - /** - * The Block Length divided by 32 - * - * @see setBlockLength() - * @var Integer - * @access private - * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4. Exists in conjunction with $block_size - * because the encryption / decryption / key schedule creation requires this number and not $block_size. We could - * derive this from $block_size or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu - * of that, we'll just precompute it once. - * - */ - var $Nb = 4; - - /** - * The Key Length - * - * @see setKeyLength() - * @var Integer - * @access private - * @internal The max value is 256 / 8 = 32, the min value is 128 / 8 = 16. Exists in conjunction with $Nk - * because the encryption / decryption / key schedule creation requires this number and not $key_size. We could - * derive this from $key_size or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu - * of that, we'll just precompute it once. - */ - var $key_size = 16; - - /** - * The Key Length divided by 32 - * - * @see setKeyLength() - * @var Integer - * @access private - * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4 - */ - var $Nk = 4; - - /** - * The Number of Rounds - * - * @var Integer - * @access private - * @internal The max value is 14, the min value is 10. - */ - var $Nr; - - /** - * Shift offsets - * - * @var Array - * @access private - */ - var $c; - - /** - * Holds the last used key- and block_size information - * - * @var Array - * @access private - */ - var $kl; - - /** - * Precomputed mixColumns table - * - * According to (section 5.2.1), - * precomputed tables can be used in the mixColumns phase. in that example, they're assigned t0...t3, so - * those are the names we'll use. - * - * @see Crypt_Rijndael:_encryptBlock() - * @see Crypt_Rijndael:_decryptBlock() - * @var Array - * @access private - */ - var $t0 = array( - 0xC66363A5, 0xF87C7C84, 0xEE777799, 0xF67B7B8D, 0xFFF2F20D, 0xD66B6BBD, 0xDE6F6FB1, 0x91C5C554, - 0x60303050, 0x02010103, 0xCE6767A9, 0x562B2B7D, 0xE7FEFE19, 0xB5D7D762, 0x4DABABE6, 0xEC76769A, - 0x8FCACA45, 0x1F82829D, 0x89C9C940, 0xFA7D7D87, 0xEFFAFA15, 0xB25959EB, 0x8E4747C9, 0xFBF0F00B, - 0x41ADADEC, 0xB3D4D467, 0x5FA2A2FD, 0x45AFAFEA, 0x239C9CBF, 0x53A4A4F7, 0xE4727296, 0x9BC0C05B, - 0x75B7B7C2, 0xE1FDFD1C, 0x3D9393AE, 0x4C26266A, 0x6C36365A, 0x7E3F3F41, 0xF5F7F702, 0x83CCCC4F, - 0x6834345C, 0x51A5A5F4, 0xD1E5E534, 0xF9F1F108, 0xE2717193, 0xABD8D873, 0x62313153, 0x2A15153F, - 0x0804040C, 0x95C7C752, 0x46232365, 0x9DC3C35E, 0x30181828, 0x379696A1, 0x0A05050F, 0x2F9A9AB5, - 0x0E070709, 0x24121236, 0x1B80809B, 0xDFE2E23D, 0xCDEBEB26, 0x4E272769, 0x7FB2B2CD, 0xEA75759F, - 0x1209091B, 0x1D83839E, 0x582C2C74, 0x341A1A2E, 0x361B1B2D, 0xDC6E6EB2, 0xB45A5AEE, 0x5BA0A0FB, - 0xA45252F6, 0x763B3B4D, 0xB7D6D661, 0x7DB3B3CE, 0x5229297B, 0xDDE3E33E, 0x5E2F2F71, 0x13848497, - 0xA65353F5, 0xB9D1D168, 0x00000000, 0xC1EDED2C, 0x40202060, 0xE3FCFC1F, 0x79B1B1C8, 0xB65B5BED, - 0xD46A6ABE, 0x8DCBCB46, 0x67BEBED9, 0x7239394B, 0x944A4ADE, 0x984C4CD4, 0xB05858E8, 0x85CFCF4A, - 0xBBD0D06B, 0xC5EFEF2A, 0x4FAAAAE5, 0xEDFBFB16, 0x864343C5, 0x9A4D4DD7, 0x66333355, 0x11858594, - 0x8A4545CF, 0xE9F9F910, 0x04020206, 0xFE7F7F81, 0xA05050F0, 0x783C3C44, 0x259F9FBA, 0x4BA8A8E3, - 0xA25151F3, 0x5DA3A3FE, 0x804040C0, 0x058F8F8A, 0x3F9292AD, 0x219D9DBC, 0x70383848, 0xF1F5F504, - 0x63BCBCDF, 0x77B6B6C1, 0xAFDADA75, 0x42212163, 0x20101030, 0xE5FFFF1A, 0xFDF3F30E, 0xBFD2D26D, - 0x81CDCD4C, 0x180C0C14, 0x26131335, 0xC3ECEC2F, 0xBE5F5FE1, 0x359797A2, 0x884444CC, 0x2E171739, - 0x93C4C457, 0x55A7A7F2, 0xFC7E7E82, 0x7A3D3D47, 0xC86464AC, 0xBA5D5DE7, 0x3219192B, 0xE6737395, - 0xC06060A0, 0x19818198, 0x9E4F4FD1, 0xA3DCDC7F, 0x44222266, 0x542A2A7E, 0x3B9090AB, 0x0B888883, - 0x8C4646CA, 0xC7EEEE29, 0x6BB8B8D3, 0x2814143C, 0xA7DEDE79, 0xBC5E5EE2, 0x160B0B1D, 0xADDBDB76, - 0xDBE0E03B, 0x64323256, 0x743A3A4E, 0x140A0A1E, 0x924949DB, 0x0C06060A, 0x4824246C, 0xB85C5CE4, - 0x9FC2C25D, 0xBDD3D36E, 0x43ACACEF, 0xC46262A6, 0x399191A8, 0x319595A4, 0xD3E4E437, 0xF279798B, - 0xD5E7E732, 0x8BC8C843, 0x6E373759, 0xDA6D6DB7, 0x018D8D8C, 0xB1D5D564, 0x9C4E4ED2, 0x49A9A9E0, - 0xD86C6CB4, 0xAC5656FA, 0xF3F4F407, 0xCFEAEA25, 0xCA6565AF, 0xF47A7A8E, 0x47AEAEE9, 0x10080818, - 0x6FBABAD5, 0xF0787888, 0x4A25256F, 0x5C2E2E72, 0x381C1C24, 0x57A6A6F1, 0x73B4B4C7, 0x97C6C651, - 0xCBE8E823, 0xA1DDDD7C, 0xE874749C, 0x3E1F1F21, 0x964B4BDD, 0x61BDBDDC, 0x0D8B8B86, 0x0F8A8A85, - 0xE0707090, 0x7C3E3E42, 0x71B5B5C4, 0xCC6666AA, 0x904848D8, 0x06030305, 0xF7F6F601, 0x1C0E0E12, - 0xC26161A3, 0x6A35355F, 0xAE5757F9, 0x69B9B9D0, 0x17868691, 0x99C1C158, 0x3A1D1D27, 0x279E9EB9, - 0xD9E1E138, 0xEBF8F813, 0x2B9898B3, 0x22111133, 0xD26969BB, 0xA9D9D970, 0x078E8E89, 0x339494A7, - 0x2D9B9BB6, 0x3C1E1E22, 0x15878792, 0xC9E9E920, 0x87CECE49, 0xAA5555FF, 0x50282878, 0xA5DFDF7A, - 0x038C8C8F, 0x59A1A1F8, 0x09898980, 0x1A0D0D17, 0x65BFBFDA, 0xD7E6E631, 0x844242C6, 0xD06868B8, - 0x824141C3, 0x299999B0, 0x5A2D2D77, 0x1E0F0F11, 0x7BB0B0CB, 0xA85454FC, 0x6DBBBBD6, 0x2C16163A - ); - - /** - * Precomputed mixColumns table - * - * @see Crypt_Rijndael:_encryptBlock() - * @see Crypt_Rijndael:_decryptBlock() - * @var Array - * @access private - */ - var $t1 = array( - 0xA5C66363, 0x84F87C7C, 0x99EE7777, 0x8DF67B7B, 0x0DFFF2F2, 0xBDD66B6B, 0xB1DE6F6F, 0x5491C5C5, - 0x50603030, 0x03020101, 0xA9CE6767, 0x7D562B2B, 0x19E7FEFE, 0x62B5D7D7, 0xE64DABAB, 0x9AEC7676, - 0x458FCACA, 0x9D1F8282, 0x4089C9C9, 0x87FA7D7D, 0x15EFFAFA, 0xEBB25959, 0xC98E4747, 0x0BFBF0F0, - 0xEC41ADAD, 0x67B3D4D4, 0xFD5FA2A2, 0xEA45AFAF, 0xBF239C9C, 0xF753A4A4, 0x96E47272, 0x5B9BC0C0, - 0xC275B7B7, 0x1CE1FDFD, 0xAE3D9393, 0x6A4C2626, 0x5A6C3636, 0x417E3F3F, 0x02F5F7F7, 0x4F83CCCC, - 0x5C683434, 0xF451A5A5, 0x34D1E5E5, 0x08F9F1F1, 0x93E27171, 0x73ABD8D8, 0x53623131, 0x3F2A1515, - 0x0C080404, 0x5295C7C7, 0x65462323, 0x5E9DC3C3, 0x28301818, 0xA1379696, 0x0F0A0505, 0xB52F9A9A, - 0x090E0707, 0x36241212, 0x9B1B8080, 0x3DDFE2E2, 0x26CDEBEB, 0x694E2727, 0xCD7FB2B2, 0x9FEA7575, - 0x1B120909, 0x9E1D8383, 0x74582C2C, 0x2E341A1A, 0x2D361B1B, 0xB2DC6E6E, 0xEEB45A5A, 0xFB5BA0A0, - 0xF6A45252, 0x4D763B3B, 0x61B7D6D6, 0xCE7DB3B3, 0x7B522929, 0x3EDDE3E3, 0x715E2F2F, 0x97138484, - 0xF5A65353, 0x68B9D1D1, 0x00000000, 0x2CC1EDED, 0x60402020, 0x1FE3FCFC, 0xC879B1B1, 0xEDB65B5B, - 0xBED46A6A, 0x468DCBCB, 0xD967BEBE, 0x4B723939, 0xDE944A4A, 0xD4984C4C, 0xE8B05858, 0x4A85CFCF, - 0x6BBBD0D0, 0x2AC5EFEF, 0xE54FAAAA, 0x16EDFBFB, 0xC5864343, 0xD79A4D4D, 0x55663333, 0x94118585, - 0xCF8A4545, 0x10E9F9F9, 0x06040202, 0x81FE7F7F, 0xF0A05050, 0x44783C3C, 0xBA259F9F, 0xE34BA8A8, - 0xF3A25151, 0xFE5DA3A3, 0xC0804040, 0x8A058F8F, 0xAD3F9292, 0xBC219D9D, 0x48703838, 0x04F1F5F5, - 0xDF63BCBC, 0xC177B6B6, 0x75AFDADA, 0x63422121, 0x30201010, 0x1AE5FFFF, 0x0EFDF3F3, 0x6DBFD2D2, - 0x4C81CDCD, 0x14180C0C, 0x35261313, 0x2FC3ECEC, 0xE1BE5F5F, 0xA2359797, 0xCC884444, 0x392E1717, - 0x5793C4C4, 0xF255A7A7, 0x82FC7E7E, 0x477A3D3D, 0xACC86464, 0xE7BA5D5D, 0x2B321919, 0x95E67373, - 0xA0C06060, 0x98198181, 0xD19E4F4F, 0x7FA3DCDC, 0x66442222, 0x7E542A2A, 0xAB3B9090, 0x830B8888, - 0xCA8C4646, 0x29C7EEEE, 0xD36BB8B8, 0x3C281414, 0x79A7DEDE, 0xE2BC5E5E, 0x1D160B0B, 0x76ADDBDB, - 0x3BDBE0E0, 0x56643232, 0x4E743A3A, 0x1E140A0A, 0xDB924949, 0x0A0C0606, 0x6C482424, 0xE4B85C5C, - 0x5D9FC2C2, 0x6EBDD3D3, 0xEF43ACAC, 0xA6C46262, 0xA8399191, 0xA4319595, 0x37D3E4E4, 0x8BF27979, - 0x32D5E7E7, 0x438BC8C8, 0x596E3737, 0xB7DA6D6D, 0x8C018D8D, 0x64B1D5D5, 0xD29C4E4E, 0xE049A9A9, - 0xB4D86C6C, 0xFAAC5656, 0x07F3F4F4, 0x25CFEAEA, 0xAFCA6565, 0x8EF47A7A, 0xE947AEAE, 0x18100808, - 0xD56FBABA, 0x88F07878, 0x6F4A2525, 0x725C2E2E, 0x24381C1C, 0xF157A6A6, 0xC773B4B4, 0x5197C6C6, - 0x23CBE8E8, 0x7CA1DDDD, 0x9CE87474, 0x213E1F1F, 0xDD964B4B, 0xDC61BDBD, 0x860D8B8B, 0x850F8A8A, - 0x90E07070, 0x427C3E3E, 0xC471B5B5, 0xAACC6666, 0xD8904848, 0x05060303, 0x01F7F6F6, 0x121C0E0E, - 0xA3C26161, 0x5F6A3535, 0xF9AE5757, 0xD069B9B9, 0x91178686, 0x5899C1C1, 0x273A1D1D, 0xB9279E9E, - 0x38D9E1E1, 0x13EBF8F8, 0xB32B9898, 0x33221111, 0xBBD26969, 0x70A9D9D9, 0x89078E8E, 0xA7339494, - 0xB62D9B9B, 0x223C1E1E, 0x92158787, 0x20C9E9E9, 0x4987CECE, 0xFFAA5555, 0x78502828, 0x7AA5DFDF, - 0x8F038C8C, 0xF859A1A1, 0x80098989, 0x171A0D0D, 0xDA65BFBF, 0x31D7E6E6, 0xC6844242, 0xB8D06868, - 0xC3824141, 0xB0299999, 0x775A2D2D, 0x111E0F0F, 0xCB7BB0B0, 0xFCA85454, 0xD66DBBBB, 0x3A2C1616 - ); - - /** - * Precomputed mixColumns table - * - * @see Crypt_Rijndael:_encryptBlock() - * @see Crypt_Rijndael:_decryptBlock() - * @var Array - * @access private - */ - var $t2 = array( - 0x63A5C663, 0x7C84F87C, 0x7799EE77, 0x7B8DF67B, 0xF20DFFF2, 0x6BBDD66B, 0x6FB1DE6F, 0xC55491C5, - 0x30506030, 0x01030201, 0x67A9CE67, 0x2B7D562B, 0xFE19E7FE, 0xD762B5D7, 0xABE64DAB, 0x769AEC76, - 0xCA458FCA, 0x829D1F82, 0xC94089C9, 0x7D87FA7D, 0xFA15EFFA, 0x59EBB259, 0x47C98E47, 0xF00BFBF0, - 0xADEC41AD, 0xD467B3D4, 0xA2FD5FA2, 0xAFEA45AF, 0x9CBF239C, 0xA4F753A4, 0x7296E472, 0xC05B9BC0, - 0xB7C275B7, 0xFD1CE1FD, 0x93AE3D93, 0x266A4C26, 0x365A6C36, 0x3F417E3F, 0xF702F5F7, 0xCC4F83CC, - 0x345C6834, 0xA5F451A5, 0xE534D1E5, 0xF108F9F1, 0x7193E271, 0xD873ABD8, 0x31536231, 0x153F2A15, - 0x040C0804, 0xC75295C7, 0x23654623, 0xC35E9DC3, 0x18283018, 0x96A13796, 0x050F0A05, 0x9AB52F9A, - 0x07090E07, 0x12362412, 0x809B1B80, 0xE23DDFE2, 0xEB26CDEB, 0x27694E27, 0xB2CD7FB2, 0x759FEA75, - 0x091B1209, 0x839E1D83, 0x2C74582C, 0x1A2E341A, 0x1B2D361B, 0x6EB2DC6E, 0x5AEEB45A, 0xA0FB5BA0, - 0x52F6A452, 0x3B4D763B, 0xD661B7D6, 0xB3CE7DB3, 0x297B5229, 0xE33EDDE3, 0x2F715E2F, 0x84971384, - 0x53F5A653, 0xD168B9D1, 0x00000000, 0xED2CC1ED, 0x20604020, 0xFC1FE3FC, 0xB1C879B1, 0x5BEDB65B, - 0x6ABED46A, 0xCB468DCB, 0xBED967BE, 0x394B7239, 0x4ADE944A, 0x4CD4984C, 0x58E8B058, 0xCF4A85CF, - 0xD06BBBD0, 0xEF2AC5EF, 0xAAE54FAA, 0xFB16EDFB, 0x43C58643, 0x4DD79A4D, 0x33556633, 0x85941185, - 0x45CF8A45, 0xF910E9F9, 0x02060402, 0x7F81FE7F, 0x50F0A050, 0x3C44783C, 0x9FBA259F, 0xA8E34BA8, - 0x51F3A251, 0xA3FE5DA3, 0x40C08040, 0x8F8A058F, 0x92AD3F92, 0x9DBC219D, 0x38487038, 0xF504F1F5, - 0xBCDF63BC, 0xB6C177B6, 0xDA75AFDA, 0x21634221, 0x10302010, 0xFF1AE5FF, 0xF30EFDF3, 0xD26DBFD2, - 0xCD4C81CD, 0x0C14180C, 0x13352613, 0xEC2FC3EC, 0x5FE1BE5F, 0x97A23597, 0x44CC8844, 0x17392E17, - 0xC45793C4, 0xA7F255A7, 0x7E82FC7E, 0x3D477A3D, 0x64ACC864, 0x5DE7BA5D, 0x192B3219, 0x7395E673, - 0x60A0C060, 0x81981981, 0x4FD19E4F, 0xDC7FA3DC, 0x22664422, 0x2A7E542A, 0x90AB3B90, 0x88830B88, - 0x46CA8C46, 0xEE29C7EE, 0xB8D36BB8, 0x143C2814, 0xDE79A7DE, 0x5EE2BC5E, 0x0B1D160B, 0xDB76ADDB, - 0xE03BDBE0, 0x32566432, 0x3A4E743A, 0x0A1E140A, 0x49DB9249, 0x060A0C06, 0x246C4824, 0x5CE4B85C, - 0xC25D9FC2, 0xD36EBDD3, 0xACEF43AC, 0x62A6C462, 0x91A83991, 0x95A43195, 0xE437D3E4, 0x798BF279, - 0xE732D5E7, 0xC8438BC8, 0x37596E37, 0x6DB7DA6D, 0x8D8C018D, 0xD564B1D5, 0x4ED29C4E, 0xA9E049A9, - 0x6CB4D86C, 0x56FAAC56, 0xF407F3F4, 0xEA25CFEA, 0x65AFCA65, 0x7A8EF47A, 0xAEE947AE, 0x08181008, - 0xBAD56FBA, 0x7888F078, 0x256F4A25, 0x2E725C2E, 0x1C24381C, 0xA6F157A6, 0xB4C773B4, 0xC65197C6, - 0xE823CBE8, 0xDD7CA1DD, 0x749CE874, 0x1F213E1F, 0x4BDD964B, 0xBDDC61BD, 0x8B860D8B, 0x8A850F8A, - 0x7090E070, 0x3E427C3E, 0xB5C471B5, 0x66AACC66, 0x48D89048, 0x03050603, 0xF601F7F6, 0x0E121C0E, - 0x61A3C261, 0x355F6A35, 0x57F9AE57, 0xB9D069B9, 0x86911786, 0xC15899C1, 0x1D273A1D, 0x9EB9279E, - 0xE138D9E1, 0xF813EBF8, 0x98B32B98, 0x11332211, 0x69BBD269, 0xD970A9D9, 0x8E89078E, 0x94A73394, - 0x9BB62D9B, 0x1E223C1E, 0x87921587, 0xE920C9E9, 0xCE4987CE, 0x55FFAA55, 0x28785028, 0xDF7AA5DF, - 0x8C8F038C, 0xA1F859A1, 0x89800989, 0x0D171A0D, 0xBFDA65BF, 0xE631D7E6, 0x42C68442, 0x68B8D068, - 0x41C38241, 0x99B02999, 0x2D775A2D, 0x0F111E0F, 0xB0CB7BB0, 0x54FCA854, 0xBBD66DBB, 0x163A2C16 - ); - - /** - * Precomputed mixColumns table - * - * @see Crypt_Rijndael:_encryptBlock() - * @see Crypt_Rijndael:_decryptBlock() - * @var Array - * @access private - */ - var $t3 = array( - 0x6363A5C6, 0x7C7C84F8, 0x777799EE, 0x7B7B8DF6, 0xF2F20DFF, 0x6B6BBDD6, 0x6F6FB1DE, 0xC5C55491, - 0x30305060, 0x01010302, 0x6767A9CE, 0x2B2B7D56, 0xFEFE19E7, 0xD7D762B5, 0xABABE64D, 0x76769AEC, - 0xCACA458F, 0x82829D1F, 0xC9C94089, 0x7D7D87FA, 0xFAFA15EF, 0x5959EBB2, 0x4747C98E, 0xF0F00BFB, - 0xADADEC41, 0xD4D467B3, 0xA2A2FD5F, 0xAFAFEA45, 0x9C9CBF23, 0xA4A4F753, 0x727296E4, 0xC0C05B9B, - 0xB7B7C275, 0xFDFD1CE1, 0x9393AE3D, 0x26266A4C, 0x36365A6C, 0x3F3F417E, 0xF7F702F5, 0xCCCC4F83, - 0x34345C68, 0xA5A5F451, 0xE5E534D1, 0xF1F108F9, 0x717193E2, 0xD8D873AB, 0x31315362, 0x15153F2A, - 0x04040C08, 0xC7C75295, 0x23236546, 0xC3C35E9D, 0x18182830, 0x9696A137, 0x05050F0A, 0x9A9AB52F, - 0x0707090E, 0x12123624, 0x80809B1B, 0xE2E23DDF, 0xEBEB26CD, 0x2727694E, 0xB2B2CD7F, 0x75759FEA, - 0x09091B12, 0x83839E1D, 0x2C2C7458, 0x1A1A2E34, 0x1B1B2D36, 0x6E6EB2DC, 0x5A5AEEB4, 0xA0A0FB5B, - 0x5252F6A4, 0x3B3B4D76, 0xD6D661B7, 0xB3B3CE7D, 0x29297B52, 0xE3E33EDD, 0x2F2F715E, 0x84849713, - 0x5353F5A6, 0xD1D168B9, 0x00000000, 0xEDED2CC1, 0x20206040, 0xFCFC1FE3, 0xB1B1C879, 0x5B5BEDB6, - 0x6A6ABED4, 0xCBCB468D, 0xBEBED967, 0x39394B72, 0x4A4ADE94, 0x4C4CD498, 0x5858E8B0, 0xCFCF4A85, - 0xD0D06BBB, 0xEFEF2AC5, 0xAAAAE54F, 0xFBFB16ED, 0x4343C586, 0x4D4DD79A, 0x33335566, 0x85859411, - 0x4545CF8A, 0xF9F910E9, 0x02020604, 0x7F7F81FE, 0x5050F0A0, 0x3C3C4478, 0x9F9FBA25, 0xA8A8E34B, - 0x5151F3A2, 0xA3A3FE5D, 0x4040C080, 0x8F8F8A05, 0x9292AD3F, 0x9D9DBC21, 0x38384870, 0xF5F504F1, - 0xBCBCDF63, 0xB6B6C177, 0xDADA75AF, 0x21216342, 0x10103020, 0xFFFF1AE5, 0xF3F30EFD, 0xD2D26DBF, - 0xCDCD4C81, 0x0C0C1418, 0x13133526, 0xECEC2FC3, 0x5F5FE1BE, 0x9797A235, 0x4444CC88, 0x1717392E, - 0xC4C45793, 0xA7A7F255, 0x7E7E82FC, 0x3D3D477A, 0x6464ACC8, 0x5D5DE7BA, 0x19192B32, 0x737395E6, - 0x6060A0C0, 0x81819819, 0x4F4FD19E, 0xDCDC7FA3, 0x22226644, 0x2A2A7E54, 0x9090AB3B, 0x8888830B, - 0x4646CA8C, 0xEEEE29C7, 0xB8B8D36B, 0x14143C28, 0xDEDE79A7, 0x5E5EE2BC, 0x0B0B1D16, 0xDBDB76AD, - 0xE0E03BDB, 0x32325664, 0x3A3A4E74, 0x0A0A1E14, 0x4949DB92, 0x06060A0C, 0x24246C48, 0x5C5CE4B8, - 0xC2C25D9F, 0xD3D36EBD, 0xACACEF43, 0x6262A6C4, 0x9191A839, 0x9595A431, 0xE4E437D3, 0x79798BF2, - 0xE7E732D5, 0xC8C8438B, 0x3737596E, 0x6D6DB7DA, 0x8D8D8C01, 0xD5D564B1, 0x4E4ED29C, 0xA9A9E049, - 0x6C6CB4D8, 0x5656FAAC, 0xF4F407F3, 0xEAEA25CF, 0x6565AFCA, 0x7A7A8EF4, 0xAEAEE947, 0x08081810, - 0xBABAD56F, 0x787888F0, 0x25256F4A, 0x2E2E725C, 0x1C1C2438, 0xA6A6F157, 0xB4B4C773, 0xC6C65197, - 0xE8E823CB, 0xDDDD7CA1, 0x74749CE8, 0x1F1F213E, 0x4B4BDD96, 0xBDBDDC61, 0x8B8B860D, 0x8A8A850F, - 0x707090E0, 0x3E3E427C, 0xB5B5C471, 0x6666AACC, 0x4848D890, 0x03030506, 0xF6F601F7, 0x0E0E121C, - 0x6161A3C2, 0x35355F6A, 0x5757F9AE, 0xB9B9D069, 0x86869117, 0xC1C15899, 0x1D1D273A, 0x9E9EB927, - 0xE1E138D9, 0xF8F813EB, 0x9898B32B, 0x11113322, 0x6969BBD2, 0xD9D970A9, 0x8E8E8907, 0x9494A733, - 0x9B9BB62D, 0x1E1E223C, 0x87879215, 0xE9E920C9, 0xCECE4987, 0x5555FFAA, 0x28287850, 0xDFDF7AA5, - 0x8C8C8F03, 0xA1A1F859, 0x89898009, 0x0D0D171A, 0xBFBFDA65, 0xE6E631D7, 0x4242C684, 0x6868B8D0, - 0x4141C382, 0x9999B029, 0x2D2D775A, 0x0F0F111E, 0xB0B0CB7B, 0x5454FCA8, 0xBBBBD66D, 0x16163A2C - ); - - /** - * Precomputed invMixColumns table - * - * @see Crypt_Rijndael:_encryptBlock() - * @see Crypt_Rijndael:_decryptBlock() - * @var Array - * @access private - */ - var $dt0 = array( - 0x51F4A750, 0x7E416553, 0x1A17A4C3, 0x3A275E96, 0x3BAB6BCB, 0x1F9D45F1, 0xACFA58AB, 0x4BE30393, - 0x2030FA55, 0xAD766DF6, 0x88CC7691, 0xF5024C25, 0x4FE5D7FC, 0xC52ACBD7, 0x26354480, 0xB562A38F, - 0xDEB15A49, 0x25BA1B67, 0x45EA0E98, 0x5DFEC0E1, 0xC32F7502, 0x814CF012, 0x8D4697A3, 0x6BD3F9C6, - 0x038F5FE7, 0x15929C95, 0xBF6D7AEB, 0x955259DA, 0xD4BE832D, 0x587421D3, 0x49E06929, 0x8EC9C844, - 0x75C2896A, 0xF48E7978, 0x99583E6B, 0x27B971DD, 0xBEE14FB6, 0xF088AD17, 0xC920AC66, 0x7DCE3AB4, - 0x63DF4A18, 0xE51A3182, 0x97513360, 0x62537F45, 0xB16477E0, 0xBB6BAE84, 0xFE81A01C, 0xF9082B94, - 0x70486858, 0x8F45FD19, 0x94DE6C87, 0x527BF8B7, 0xAB73D323, 0x724B02E2, 0xE31F8F57, 0x6655AB2A, - 0xB2EB2807, 0x2FB5C203, 0x86C57B9A, 0xD33708A5, 0x302887F2, 0x23BFA5B2, 0x02036ABA, 0xED16825C, - 0x8ACF1C2B, 0xA779B492, 0xF307F2F0, 0x4E69E2A1, 0x65DAF4CD, 0x0605BED5, 0xD134621F, 0xC4A6FE8A, - 0x342E539D, 0xA2F355A0, 0x058AE132, 0xA4F6EB75, 0x0B83EC39, 0x4060EFAA, 0x5E719F06, 0xBD6E1051, - 0x3E218AF9, 0x96DD063D, 0xDD3E05AE, 0x4DE6BD46, 0x91548DB5, 0x71C45D05, 0x0406D46F, 0x605015FF, - 0x1998FB24, 0xD6BDE997, 0x894043CC, 0x67D99E77, 0xB0E842BD, 0x07898B88, 0xE7195B38, 0x79C8EEDB, - 0xA17C0A47, 0x7C420FE9, 0xF8841EC9, 0x00000000, 0x09808683, 0x322BED48, 0x1E1170AC, 0x6C5A724E, - 0xFD0EFFFB, 0x0F853856, 0x3DAED51E, 0x362D3927, 0x0A0FD964, 0x685CA621, 0x9B5B54D1, 0x24362E3A, - 0x0C0A67B1, 0x9357E70F, 0xB4EE96D2, 0x1B9B919E, 0x80C0C54F, 0x61DC20A2, 0x5A774B69, 0x1C121A16, - 0xE293BA0A, 0xC0A02AE5, 0x3C22E043, 0x121B171D, 0x0E090D0B, 0xF28BC7AD, 0x2DB6A8B9, 0x141EA9C8, - 0x57F11985, 0xAF75074C, 0xEE99DDBB, 0xA37F60FD, 0xF701269F, 0x5C72F5BC, 0x44663BC5, 0x5BFB7E34, - 0x8B432976, 0xCB23C6DC, 0xB6EDFC68, 0xB8E4F163, 0xD731DCCA, 0x42638510, 0x13972240, 0x84C61120, - 0x854A247D, 0xD2BB3DF8, 0xAEF93211, 0xC729A16D, 0x1D9E2F4B, 0xDCB230F3, 0x0D8652EC, 0x77C1E3D0, - 0x2BB3166C, 0xA970B999, 0x119448FA, 0x47E96422, 0xA8FC8CC4, 0xA0F03F1A, 0x567D2CD8, 0x223390EF, - 0x87494EC7, 0xD938D1C1, 0x8CCAA2FE, 0x98D40B36, 0xA6F581CF, 0xA57ADE28, 0xDAB78E26, 0x3FADBFA4, - 0x2C3A9DE4, 0x5078920D, 0x6A5FCC9B, 0x547E4662, 0xF68D13C2, 0x90D8B8E8, 0x2E39F75E, 0x82C3AFF5, - 0x9F5D80BE, 0x69D0937C, 0x6FD52DA9, 0xCF2512B3, 0xC8AC993B, 0x10187DA7, 0xE89C636E, 0xDB3BBB7B, - 0xCD267809, 0x6E5918F4, 0xEC9AB701, 0x834F9AA8, 0xE6956E65, 0xAAFFE67E, 0x21BCCF08, 0xEF15E8E6, - 0xBAE79BD9, 0x4A6F36CE, 0xEA9F09D4, 0x29B07CD6, 0x31A4B2AF, 0x2A3F2331, 0xC6A59430, 0x35A266C0, - 0x744EBC37, 0xFC82CAA6, 0xE090D0B0, 0x33A7D815, 0xF104984A, 0x41ECDAF7, 0x7FCD500E, 0x1791F62F, - 0x764DD68D, 0x43EFB04D, 0xCCAA4D54, 0xE49604DF, 0x9ED1B5E3, 0x4C6A881B, 0xC12C1FB8, 0x4665517F, - 0x9D5EEA04, 0x018C355D, 0xFA877473, 0xFB0B412E, 0xB3671D5A, 0x92DBD252, 0xE9105633, 0x6DD64713, - 0x9AD7618C, 0x37A10C7A, 0x59F8148E, 0xEB133C89, 0xCEA927EE, 0xB761C935, 0xE11CE5ED, 0x7A47B13C, - 0x9CD2DF59, 0x55F2733F, 0x1814CE79, 0x73C737BF, 0x53F7CDEA, 0x5FFDAA5B, 0xDF3D6F14, 0x7844DB86, - 0xCAAFF381, 0xB968C43E, 0x3824342C, 0xC2A3405F, 0x161DC372, 0xBCE2250C, 0x283C498B, 0xFF0D9541, - 0x39A80171, 0x080CB3DE, 0xD8B4E49C, 0x6456C190, 0x7BCB8461, 0xD532B670, 0x486C5C74, 0xD0B85742 - ); - - /** - * Precomputed invMixColumns table - * - * @see Crypt_Rijndael:_encryptBlock() - * @see Crypt_Rijndael:_decryptBlock() - * @var Array - * @access private - */ - var $dt1 = array( - 0x5051F4A7, 0x537E4165, 0xC31A17A4, 0x963A275E, 0xCB3BAB6B, 0xF11F9D45, 0xABACFA58, 0x934BE303, - 0x552030FA, 0xF6AD766D, 0x9188CC76, 0x25F5024C, 0xFC4FE5D7, 0xD7C52ACB, 0x80263544, 0x8FB562A3, - 0x49DEB15A, 0x6725BA1B, 0x9845EA0E, 0xE15DFEC0, 0x02C32F75, 0x12814CF0, 0xA38D4697, 0xC66BD3F9, - 0xE7038F5F, 0x9515929C, 0xEBBF6D7A, 0xDA955259, 0x2DD4BE83, 0xD3587421, 0x2949E069, 0x448EC9C8, - 0x6A75C289, 0x78F48E79, 0x6B99583E, 0xDD27B971, 0xB6BEE14F, 0x17F088AD, 0x66C920AC, 0xB47DCE3A, - 0x1863DF4A, 0x82E51A31, 0x60975133, 0x4562537F, 0xE0B16477, 0x84BB6BAE, 0x1CFE81A0, 0x94F9082B, - 0x58704868, 0x198F45FD, 0x8794DE6C, 0xB7527BF8, 0x23AB73D3, 0xE2724B02, 0x57E31F8F, 0x2A6655AB, - 0x07B2EB28, 0x032FB5C2, 0x9A86C57B, 0xA5D33708, 0xF2302887, 0xB223BFA5, 0xBA02036A, 0x5CED1682, - 0x2B8ACF1C, 0x92A779B4, 0xF0F307F2, 0xA14E69E2, 0xCD65DAF4, 0xD50605BE, 0x1FD13462, 0x8AC4A6FE, - 0x9D342E53, 0xA0A2F355, 0x32058AE1, 0x75A4F6EB, 0x390B83EC, 0xAA4060EF, 0x065E719F, 0x51BD6E10, - 0xF93E218A, 0x3D96DD06, 0xAEDD3E05, 0x464DE6BD, 0xB591548D, 0x0571C45D, 0x6F0406D4, 0xFF605015, - 0x241998FB, 0x97D6BDE9, 0xCC894043, 0x7767D99E, 0xBDB0E842, 0x8807898B, 0x38E7195B, 0xDB79C8EE, - 0x47A17C0A, 0xE97C420F, 0xC9F8841E, 0x00000000, 0x83098086, 0x48322BED, 0xAC1E1170, 0x4E6C5A72, - 0xFBFD0EFF, 0x560F8538, 0x1E3DAED5, 0x27362D39, 0x640A0FD9, 0x21685CA6, 0xD19B5B54, 0x3A24362E, - 0xB10C0A67, 0x0F9357E7, 0xD2B4EE96, 0x9E1B9B91, 0x4F80C0C5, 0xA261DC20, 0x695A774B, 0x161C121A, - 0x0AE293BA, 0xE5C0A02A, 0x433C22E0, 0x1D121B17, 0x0B0E090D, 0xADF28BC7, 0xB92DB6A8, 0xC8141EA9, - 0x8557F119, 0x4CAF7507, 0xBBEE99DD, 0xFDA37F60, 0x9FF70126, 0xBC5C72F5, 0xC544663B, 0x345BFB7E, - 0x768B4329, 0xDCCB23C6, 0x68B6EDFC, 0x63B8E4F1, 0xCAD731DC, 0x10426385, 0x40139722, 0x2084C611, - 0x7D854A24, 0xF8D2BB3D, 0x11AEF932, 0x6DC729A1, 0x4B1D9E2F, 0xF3DCB230, 0xEC0D8652, 0xD077C1E3, - 0x6C2BB316, 0x99A970B9, 0xFA119448, 0x2247E964, 0xC4A8FC8C, 0x1AA0F03F, 0xD8567D2C, 0xEF223390, - 0xC787494E, 0xC1D938D1, 0xFE8CCAA2, 0x3698D40B, 0xCFA6F581, 0x28A57ADE, 0x26DAB78E, 0xA43FADBF, - 0xE42C3A9D, 0x0D507892, 0x9B6A5FCC, 0x62547E46, 0xC2F68D13, 0xE890D8B8, 0x5E2E39F7, 0xF582C3AF, - 0xBE9F5D80, 0x7C69D093, 0xA96FD52D, 0xB3CF2512, 0x3BC8AC99, 0xA710187D, 0x6EE89C63, 0x7BDB3BBB, - 0x09CD2678, 0xF46E5918, 0x01EC9AB7, 0xA8834F9A, 0x65E6956E, 0x7EAAFFE6, 0x0821BCCF, 0xE6EF15E8, - 0xD9BAE79B, 0xCE4A6F36, 0xD4EA9F09, 0xD629B07C, 0xAF31A4B2, 0x312A3F23, 0x30C6A594, 0xC035A266, - 0x37744EBC, 0xA6FC82CA, 0xB0E090D0, 0x1533A7D8, 0x4AF10498, 0xF741ECDA, 0x0E7FCD50, 0x2F1791F6, - 0x8D764DD6, 0x4D43EFB0, 0x54CCAA4D, 0xDFE49604, 0xE39ED1B5, 0x1B4C6A88, 0xB8C12C1F, 0x7F466551, - 0x049D5EEA, 0x5D018C35, 0x73FA8774, 0x2EFB0B41, 0x5AB3671D, 0x5292DBD2, 0x33E91056, 0x136DD647, - 0x8C9AD761, 0x7A37A10C, 0x8E59F814, 0x89EB133C, 0xEECEA927, 0x35B761C9, 0xEDE11CE5, 0x3C7A47B1, - 0x599CD2DF, 0x3F55F273, 0x791814CE, 0xBF73C737, 0xEA53F7CD, 0x5B5FFDAA, 0x14DF3D6F, 0x867844DB, - 0x81CAAFF3, 0x3EB968C4, 0x2C382434, 0x5FC2A340, 0x72161DC3, 0x0CBCE225, 0x8B283C49, 0x41FF0D95, - 0x7139A801, 0xDE080CB3, 0x9CD8B4E4, 0x906456C1, 0x617BCB84, 0x70D532B6, 0x74486C5C, 0x42D0B857 - ); - - /** - * Precomputed invMixColumns table - * - * @see Crypt_Rijndael:_encryptBlock() - * @see Crypt_Rijndael:_decryptBlock() - * @var Array - * @access private - */ - var $dt2 = array( - 0xA75051F4, 0x65537E41, 0xA4C31A17, 0x5E963A27, 0x6BCB3BAB, 0x45F11F9D, 0x58ABACFA, 0x03934BE3, - 0xFA552030, 0x6DF6AD76, 0x769188CC, 0x4C25F502, 0xD7FC4FE5, 0xCBD7C52A, 0x44802635, 0xA38FB562, - 0x5A49DEB1, 0x1B6725BA, 0x0E9845EA, 0xC0E15DFE, 0x7502C32F, 0xF012814C, 0x97A38D46, 0xF9C66BD3, - 0x5FE7038F, 0x9C951592, 0x7AEBBF6D, 0x59DA9552, 0x832DD4BE, 0x21D35874, 0x692949E0, 0xC8448EC9, - 0x896A75C2, 0x7978F48E, 0x3E6B9958, 0x71DD27B9, 0x4FB6BEE1, 0xAD17F088, 0xAC66C920, 0x3AB47DCE, - 0x4A1863DF, 0x3182E51A, 0x33609751, 0x7F456253, 0x77E0B164, 0xAE84BB6B, 0xA01CFE81, 0x2B94F908, - 0x68587048, 0xFD198F45, 0x6C8794DE, 0xF8B7527B, 0xD323AB73, 0x02E2724B, 0x8F57E31F, 0xAB2A6655, - 0x2807B2EB, 0xC2032FB5, 0x7B9A86C5, 0x08A5D337, 0x87F23028, 0xA5B223BF, 0x6ABA0203, 0x825CED16, - 0x1C2B8ACF, 0xB492A779, 0xF2F0F307, 0xE2A14E69, 0xF4CD65DA, 0xBED50605, 0x621FD134, 0xFE8AC4A6, - 0x539D342E, 0x55A0A2F3, 0xE132058A, 0xEB75A4F6, 0xEC390B83, 0xEFAA4060, 0x9F065E71, 0x1051BD6E, - 0x8AF93E21, 0x063D96DD, 0x05AEDD3E, 0xBD464DE6, 0x8DB59154, 0x5D0571C4, 0xD46F0406, 0x15FF6050, - 0xFB241998, 0xE997D6BD, 0x43CC8940, 0x9E7767D9, 0x42BDB0E8, 0x8B880789, 0x5B38E719, 0xEEDB79C8, - 0x0A47A17C, 0x0FE97C42, 0x1EC9F884, 0x00000000, 0x86830980, 0xED48322B, 0x70AC1E11, 0x724E6C5A, - 0xFFFBFD0E, 0x38560F85, 0xD51E3DAE, 0x3927362D, 0xD9640A0F, 0xA621685C, 0x54D19B5B, 0x2E3A2436, - 0x67B10C0A, 0xE70F9357, 0x96D2B4EE, 0x919E1B9B, 0xC54F80C0, 0x20A261DC, 0x4B695A77, 0x1A161C12, - 0xBA0AE293, 0x2AE5C0A0, 0xE0433C22, 0x171D121B, 0x0D0B0E09, 0xC7ADF28B, 0xA8B92DB6, 0xA9C8141E, - 0x198557F1, 0x074CAF75, 0xDDBBEE99, 0x60FDA37F, 0x269FF701, 0xF5BC5C72, 0x3BC54466, 0x7E345BFB, - 0x29768B43, 0xC6DCCB23, 0xFC68B6ED, 0xF163B8E4, 0xDCCAD731, 0x85104263, 0x22401397, 0x112084C6, - 0x247D854A, 0x3DF8D2BB, 0x3211AEF9, 0xA16DC729, 0x2F4B1D9E, 0x30F3DCB2, 0x52EC0D86, 0xE3D077C1, - 0x166C2BB3, 0xB999A970, 0x48FA1194, 0x642247E9, 0x8CC4A8FC, 0x3F1AA0F0, 0x2CD8567D, 0x90EF2233, - 0x4EC78749, 0xD1C1D938, 0xA2FE8CCA, 0x0B3698D4, 0x81CFA6F5, 0xDE28A57A, 0x8E26DAB7, 0xBFA43FAD, - 0x9DE42C3A, 0x920D5078, 0xCC9B6A5F, 0x4662547E, 0x13C2F68D, 0xB8E890D8, 0xF75E2E39, 0xAFF582C3, - 0x80BE9F5D, 0x937C69D0, 0x2DA96FD5, 0x12B3CF25, 0x993BC8AC, 0x7DA71018, 0x636EE89C, 0xBB7BDB3B, - 0x7809CD26, 0x18F46E59, 0xB701EC9A, 0x9AA8834F, 0x6E65E695, 0xE67EAAFF, 0xCF0821BC, 0xE8E6EF15, - 0x9BD9BAE7, 0x36CE4A6F, 0x09D4EA9F, 0x7CD629B0, 0xB2AF31A4, 0x23312A3F, 0x9430C6A5, 0x66C035A2, - 0xBC37744E, 0xCAA6FC82, 0xD0B0E090, 0xD81533A7, 0x984AF104, 0xDAF741EC, 0x500E7FCD, 0xF62F1791, - 0xD68D764D, 0xB04D43EF, 0x4D54CCAA, 0x04DFE496, 0xB5E39ED1, 0x881B4C6A, 0x1FB8C12C, 0x517F4665, - 0xEA049D5E, 0x355D018C, 0x7473FA87, 0x412EFB0B, 0x1D5AB367, 0xD25292DB, 0x5633E910, 0x47136DD6, - 0x618C9AD7, 0x0C7A37A1, 0x148E59F8, 0x3C89EB13, 0x27EECEA9, 0xC935B761, 0xE5EDE11C, 0xB13C7A47, - 0xDF599CD2, 0x733F55F2, 0xCE791814, 0x37BF73C7, 0xCDEA53F7, 0xAA5B5FFD, 0x6F14DF3D, 0xDB867844, - 0xF381CAAF, 0xC43EB968, 0x342C3824, 0x405FC2A3, 0xC372161D, 0x250CBCE2, 0x498B283C, 0x9541FF0D, - 0x017139A8, 0xB3DE080C, 0xE49CD8B4, 0xC1906456, 0x84617BCB, 0xB670D532, 0x5C74486C, 0x5742D0B8 - ); - - /** - * Precomputed invMixColumns table - * - * @see Crypt_Rijndael:_encryptBlock() - * @see Crypt_Rijndael:_decryptBlock() - * @var Array - * @access private - */ - var $dt3 = array( - 0xF4A75051, 0x4165537E, 0x17A4C31A, 0x275E963A, 0xAB6BCB3B, 0x9D45F11F, 0xFA58ABAC, 0xE303934B, - 0x30FA5520, 0x766DF6AD, 0xCC769188, 0x024C25F5, 0xE5D7FC4F, 0x2ACBD7C5, 0x35448026, 0x62A38FB5, - 0xB15A49DE, 0xBA1B6725, 0xEA0E9845, 0xFEC0E15D, 0x2F7502C3, 0x4CF01281, 0x4697A38D, 0xD3F9C66B, - 0x8F5FE703, 0x929C9515, 0x6D7AEBBF, 0x5259DA95, 0xBE832DD4, 0x7421D358, 0xE0692949, 0xC9C8448E, - 0xC2896A75, 0x8E7978F4, 0x583E6B99, 0xB971DD27, 0xE14FB6BE, 0x88AD17F0, 0x20AC66C9, 0xCE3AB47D, - 0xDF4A1863, 0x1A3182E5, 0x51336097, 0x537F4562, 0x6477E0B1, 0x6BAE84BB, 0x81A01CFE, 0x082B94F9, - 0x48685870, 0x45FD198F, 0xDE6C8794, 0x7BF8B752, 0x73D323AB, 0x4B02E272, 0x1F8F57E3, 0x55AB2A66, - 0xEB2807B2, 0xB5C2032F, 0xC57B9A86, 0x3708A5D3, 0x2887F230, 0xBFA5B223, 0x036ABA02, 0x16825CED, - 0xCF1C2B8A, 0x79B492A7, 0x07F2F0F3, 0x69E2A14E, 0xDAF4CD65, 0x05BED506, 0x34621FD1, 0xA6FE8AC4, - 0x2E539D34, 0xF355A0A2, 0x8AE13205, 0xF6EB75A4, 0x83EC390B, 0x60EFAA40, 0x719F065E, 0x6E1051BD, - 0x218AF93E, 0xDD063D96, 0x3E05AEDD, 0xE6BD464D, 0x548DB591, 0xC45D0571, 0x06D46F04, 0x5015FF60, - 0x98FB2419, 0xBDE997D6, 0x4043CC89, 0xD99E7767, 0xE842BDB0, 0x898B8807, 0x195B38E7, 0xC8EEDB79, - 0x7C0A47A1, 0x420FE97C, 0x841EC9F8, 0x00000000, 0x80868309, 0x2BED4832, 0x1170AC1E, 0x5A724E6C, - 0x0EFFFBFD, 0x8538560F, 0xAED51E3D, 0x2D392736, 0x0FD9640A, 0x5CA62168, 0x5B54D19B, 0x362E3A24, - 0x0A67B10C, 0x57E70F93, 0xEE96D2B4, 0x9B919E1B, 0xC0C54F80, 0xDC20A261, 0x774B695A, 0x121A161C, - 0x93BA0AE2, 0xA02AE5C0, 0x22E0433C, 0x1B171D12, 0x090D0B0E, 0x8BC7ADF2, 0xB6A8B92D, 0x1EA9C814, - 0xF1198557, 0x75074CAF, 0x99DDBBEE, 0x7F60FDA3, 0x01269FF7, 0x72F5BC5C, 0x663BC544, 0xFB7E345B, - 0x4329768B, 0x23C6DCCB, 0xEDFC68B6, 0xE4F163B8, 0x31DCCAD7, 0x63851042, 0x97224013, 0xC6112084, - 0x4A247D85, 0xBB3DF8D2, 0xF93211AE, 0x29A16DC7, 0x9E2F4B1D, 0xB230F3DC, 0x8652EC0D, 0xC1E3D077, - 0xB3166C2B, 0x70B999A9, 0x9448FA11, 0xE9642247, 0xFC8CC4A8, 0xF03F1AA0, 0x7D2CD856, 0x3390EF22, - 0x494EC787, 0x38D1C1D9, 0xCAA2FE8C, 0xD40B3698, 0xF581CFA6, 0x7ADE28A5, 0xB78E26DA, 0xADBFA43F, - 0x3A9DE42C, 0x78920D50, 0x5FCC9B6A, 0x7E466254, 0x8D13C2F6, 0xD8B8E890, 0x39F75E2E, 0xC3AFF582, - 0x5D80BE9F, 0xD0937C69, 0xD52DA96F, 0x2512B3CF, 0xAC993BC8, 0x187DA710, 0x9C636EE8, 0x3BBB7BDB, - 0x267809CD, 0x5918F46E, 0x9AB701EC, 0x4F9AA883, 0x956E65E6, 0xFFE67EAA, 0xBCCF0821, 0x15E8E6EF, - 0xE79BD9BA, 0x6F36CE4A, 0x9F09D4EA, 0xB07CD629, 0xA4B2AF31, 0x3F23312A, 0xA59430C6, 0xA266C035, - 0x4EBC3774, 0x82CAA6FC, 0x90D0B0E0, 0xA7D81533, 0x04984AF1, 0xECDAF741, 0xCD500E7F, 0x91F62F17, - 0x4DD68D76, 0xEFB04D43, 0xAA4D54CC, 0x9604DFE4, 0xD1B5E39E, 0x6A881B4C, 0x2C1FB8C1, 0x65517F46, - 0x5EEA049D, 0x8C355D01, 0x877473FA, 0x0B412EFB, 0x671D5AB3, 0xDBD25292, 0x105633E9, 0xD647136D, - 0xD7618C9A, 0xA10C7A37, 0xF8148E59, 0x133C89EB, 0xA927EECE, 0x61C935B7, 0x1CE5EDE1, 0x47B13C7A, - 0xD2DF599C, 0xF2733F55, 0x14CE7918, 0xC737BF73, 0xF7CDEA53, 0xFDAA5B5F, 0x3D6F14DF, 0x44DB8678, - 0xAFF381CA, 0x68C43EB9, 0x24342C38, 0xA3405FC2, 0x1DC37216, 0xE2250CBC, 0x3C498B28, 0x0D9541FF, - 0xA8017139, 0x0CB3DE08, 0xB4E49CD8, 0x56C19064, 0xCB84617B, 0x32B670D5, 0x6C5C7448, 0xB85742D0 - ); - - /** - * The SubByte S-Box - * - * @see Crypt_Rijndael::_encryptBlock() - * @var Array - * @access private - */ - var $sbox = array( - 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, - 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, - 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, - 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, - 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, - 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, - 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, - 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, - 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, - 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, - 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, - 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, - 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, - 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, - 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, - 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 - ); - - /** - * The inverse SubByte S-Box - * - * @see Crypt_Rijndael::_decryptBlock() - * @var Array - * @access private - */ - var $isbox = array( - 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, - 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, - 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, - 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, - 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, - 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, - 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, - 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, - 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, - 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, - 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, - 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, - 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, - 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, - 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D - ); - - /** - * Sets the key. - * - * Keys can be of any length. Rijndael, itself, requires the use of a key that's between 128-bits and 256-bits long and - * whose length is a multiple of 32. If the key is less than 256-bits and the key length isn't set, we round the length - * up to the closest valid key length, padding $key with null bytes. If the key is more than 256-bits, we trim the - * excess bits. - * - * If the key is not explicitly set, it'll be assumed to be all null bytes. - * - * Note: 160/224-bit keys must explicitly set by setKeyLength(), otherwise they will be round/pad up to 192/256 bits. - * - * @see Crypt_Base:setKey() - * @see setKeyLength() - * @access public - * @param String $key - */ - function setKey($key) - { - parent::setKey($key); - - if (!$this->explicit_key_length) { - $length = strlen($key); - switch (true) { - case $length <= 16: - $this->key_size = 16; - break; - case $length <= 20: - $this->key_size = 20; - break; - case $length <= 24: - $this->key_size = 24; - break; - case $length <= 28: - $this->key_size = 28; - break; - default: - $this->key_size = 32; - } - $this->_setupEngine(); - } - } - - /** - * Sets the key length - * - * Valid key lengths are 128, 160, 192, 224, and 256. If the length is less than 128, it will be rounded up to - * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount. - * - * Note: phpseclib extends Rijndael (and AES) for using 160- and 224-bit keys but they are officially not defined - * and the most (if not all) implementations are not able using 160/224-bit keys but round/pad them up to - * 192/256 bits as, for example, mcrypt will do. - * - * That said, if you want be compatible with other Rijndael and AES implementations, - * you should not setKeyLength(160) or setKeyLength(224). - * - * Additional: In case of 160- and 224-bit keys, phpseclib will/can, for that reason, not use - * the mcrypt php extension, even if available. - * This results then in slower encryption. - * - * @access public - * @param Integer $length - */ - function setKeyLength($length) - { - switch (true) { - case $length == 160: - $this->key_size = 20; - break; - case $length == 224: - $this->key_size = 28; - break; - case $length <= 128: - $this->key_size = 16; - break; - case $length <= 192: - $this->key_size = 24; - break; - default: - $this->key_size = 32; - } - - $this->explicit_key_length = true; - $this->changed = true; - $this->_setupEngine(); - } - - /** - * Sets the block length - * - * Valid block lengths are 128, 160, 192, 224, and 256. If the length is less than 128, it will be rounded up to - * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount. - * - * @access public - * @param Integer $length - */ - function setBlockLength($length) - { - $length >>= 5; - if ($length > 8) { - $length = 8; - } else if ($length < 4) { - $length = 4; - } - $this->Nb = $length; - $this->block_size = $length << 2; - $this->changed = true; - $this->_setupEngine(); - } - - /** - * Setup the fastest possible $engine - * - * Determines if the mcrypt (MODE_MCRYPT) $engine available - * and usable for the current $block_size and $key_size. - * - * If not, the slower MODE_INTERNAL $engine will be set. - * - * @see setKey() - * @see setKeyLength() - * @see setBlockLength() - * @access private - */ - function _setupEngine() - { - if (constant('CRYPT_' . $this->const_namespace . '_MODE') == CRYPT_MODE_INTERNAL) { - // No mcrypt support at all for rijndael - return; - } - - // The required mcrypt module name for the current $block_size of rijndael - $cipher_name_mcrypt = 'rijndael-' . ($this->block_size << 3); - - // Determining the availibility/usability of $cipher_name_mcrypt - switch (true) { - case $this->key_size % 8: // mcrypt is not usable for 160/224-bit keys, only for 128/192/256-bit keys - case !in_array($cipher_name_mcrypt, mcrypt_list_algorithms()): // $cipher_name_mcrypt is not available for the current $block_size - $engine = CRYPT_MODE_INTERNAL; - break; - default: - $engine = CRYPT_MODE_MCRYPT; - } - - if ($this->engine == $engine && $this->cipher_name_mcrypt == $cipher_name_mcrypt) { - // allready set, so we not unnecessary close $this->enmcrypt/demcrypt/ecb - return; - } - - // Set the $engine - $this->engine = $engine; - $this->cipher_name_mcrypt = $cipher_name_mcrypt; - - if ($this->enmcrypt) { - // Closing the current mcrypt resource(s). _mcryptSetup() will, if needed, - // (re)open them with the module named in $this->cipher_name_mcrypt - mcrypt_module_close($this->enmcrypt); - mcrypt_module_close($this->demcrypt); - $this->enmcrypt = null; - $this->demcrypt = null; - - if ($this->ecb) { - mcrypt_module_close($this->ecb); - $this->ecb = null; - } - } - } - - /** - * Setup the CRYPT_MODE_MCRYPT $engine - * - * @see Crypt_Base::_setupMcrypt() - * @access private - */ - function _setupMcrypt() - { - $this->key = str_pad(substr($this->key, 0, $this->key_size), $this->key_size, "\0"); - parent::_setupMcrypt(); - } - - /** - * Encrypts a block - * - * @access private - * @param String $in - * @return String - */ - function _encryptBlock($in) - { - static $t0, $t1, $t2, $t3, $sbox; - if (!$t0) { - for ($i = 0; $i < 256; ++$i) { - $t0[] = (int)$this->t0[$i]; - $t1[] = (int)$this->t1[$i]; - $t2[] = (int)$this->t2[$i]; - $t3[] = (int)$this->t3[$i]; - $sbox[] = (int)$this->sbox[$i]; - } - } - - $state = array(); - $words = unpack('N*', $in); - - $c = $this->c; - $w = $this->w; - $Nb = $this->Nb; - $Nr = $this->Nr; - - // addRoundKey - $i = -1; - foreach ($words as $word) { - $state[] = $word ^ $w[0][++$i]; - } - - // fips-197.pdf#page=19, "Figure 5. Pseudo Code for the Cipher", states that this loop has four components - - // subBytes, shiftRows, mixColumns, and addRoundKey. fips-197.pdf#page=30, "Implementation Suggestions Regarding - // Various Platforms" suggests that performs enhanced implementations are described in Rijndael-ammended.pdf. - // Rijndael-ammended.pdf#page=20, "Implementation aspects / 32-bit processor", discusses such an optimization. - // Unfortunately, the description given there is not quite correct. Per aes.spec.v316.pdf#page=19 [1], - // equation (7.4.7) is supposed to use addition instead of subtraction, so we'll do that here, as well. - - // [1] http://fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.v316.pdf - $temp = array(); - for ($round = 1; $round < $Nr; ++$round) { - $i = 0; // $c[0] == 0 - $j = $c[1]; - $k = $c[2]; - $l = $c[3]; - - while ($i < $Nb) { - $temp[$i] = $t0[$state[$i] >> 24 & 0x000000FF] ^ - $t1[$state[$j] >> 16 & 0x000000FF] ^ - $t2[$state[$k] >> 8 & 0x000000FF] ^ - $t3[$state[$l] & 0x000000FF] ^ - $w[$round][$i]; - ++$i; - $j = ($j + 1) % $Nb; - $k = ($k + 1) % $Nb; - $l = ($l + 1) % $Nb; - } - $state = $temp; - } - - // subWord - for ($i = 0; $i < $Nb; ++$i) { - $state[$i] = $sbox[$state[$i] & 0x000000FF] | - ($sbox[$state[$i] >> 8 & 0x000000FF] << 8) | - ($sbox[$state[$i] >> 16 & 0x000000FF] << 16) | - ($sbox[$state[$i] >> 24 & 0x000000FF] << 24); - } - - // shiftRows + addRoundKey - $i = 0; // $c[0] == 0 - $j = $c[1]; - $k = $c[2]; - $l = $c[3]; - while ($i < $Nb) { - $temp[$i] = ($state[$i] & 0xFF000000) ^ - ($state[$j] & 0x00FF0000) ^ - ($state[$k] & 0x0000FF00) ^ - ($state[$l] & 0x000000FF) ^ - $w[$Nr][$i]; - ++$i; - $j = ($j + 1) % $Nb; - $k = ($k + 1) % $Nb; - $l = ($l + 1) % $Nb; - } - - switch ($Nb) { - case 8: - return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6], $temp[7]); - case 7: - return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6]); - case 6: - return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5]); - case 5: - return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4]); - default: - return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3]); - } - } - - /** - * Decrypts a block - * - * @access private - * @param String $in - * @return String - */ - function _decryptBlock($in) - { - static $dt0, $dt1, $dt2, $dt3, $isbox; - if (!$dt0) { - for ($i = 0; $i < 256; ++$i) { - $dt0[] = (int)$this->dt0[$i]; - $dt1[] = (int)$this->dt1[$i]; - $dt2[] = (int)$this->dt2[$i]; - $dt3[] = (int)$this->dt3[$i]; - $isbox[] = (int)$this->isbox[$i]; - } - } - - $state = array(); - $words = unpack('N*', $in); - - $c = $this->c; - $dw = $this->dw; - $Nb = $this->Nb; - $Nr = $this->Nr; - - // addRoundKey - $i = -1; - foreach ($words as $word) { - $state[] = $word ^ $dw[$Nr][++$i]; - } - - $temp = array(); - for ($round = $Nr - 1; $round > 0; --$round) { - $i = 0; // $c[0] == 0 - $j = $Nb - $c[1]; - $k = $Nb - $c[2]; - $l = $Nb - $c[3]; - - while ($i < $Nb) { - $temp[$i] = $dt0[$state[$i] >> 24 & 0x000000FF] ^ - $dt1[$state[$j] >> 16 & 0x000000FF] ^ - $dt2[$state[$k] >> 8 & 0x000000FF] ^ - $dt3[$state[$l] & 0x000000FF] ^ - $dw[$round][$i]; - ++$i; - $j = ($j + 1) % $Nb; - $k = ($k + 1) % $Nb; - $l = ($l + 1) % $Nb; - } - $state = $temp; - } - - // invShiftRows + invSubWord + addRoundKey - $i = 0; // $c[0] == 0 - $j = $Nb - $c[1]; - $k = $Nb - $c[2]; - $l = $Nb - $c[3]; - - while ($i < $Nb) { - $word = ($state[$i] & 0xFF000000) | - ($state[$j] & 0x00FF0000) | - ($state[$k] & 0x0000FF00) | - ($state[$l] & 0x000000FF); - - $temp[$i] = $dw[0][$i] ^ ($isbox[$word & 0x000000FF] | - ($isbox[$word >> 8 & 0x000000FF] << 8) | - ($isbox[$word >> 16 & 0x000000FF] << 16) | - ($isbox[$word >> 24 & 0x000000FF] << 24)); - ++$i; - $j = ($j + 1) % $Nb; - $k = ($k + 1) % $Nb; - $l = ($l + 1) % $Nb; - } - - switch ($Nb) { - case 8: - return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6], $temp[7]); - case 7: - return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6]); - case 6: - return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5]); - case 5: - return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4]); - default: - return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3]); - } - } - - /** - * Setup the key (expansion) - * - * @see Crypt_Base::_setupKey() - * @access private - */ - function _setupKey() - { - // Each number in $rcon is equal to the previous number multiplied by two in Rijndael's finite field. - // See http://en.wikipedia.org/wiki/Finite_field_arithmetic#Multiplicative_inverse - static $rcon = array(0, - 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, - 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000, - 0x6C000000, 0xD8000000, 0xAB000000, 0x4D000000, 0x9A000000, - 0x2F000000, 0x5E000000, 0xBC000000, 0x63000000, 0xC6000000, - 0x97000000, 0x35000000, 0x6A000000, 0xD4000000, 0xB3000000, - 0x7D000000, 0xFA000000, 0xEF000000, 0xC5000000, 0x91000000 - ); - - $this->key = str_pad(substr($this->key, 0, $this->key_size), $this->key_size, "\0"); - - if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->key_size === $this->kl['key_size'] && $this->block_size === $this->kl['block_size']) { - // already expanded - return; - } - $this->kl = array('key' => $this->key, 'key_size' => $this->key_size, 'block_size' => $this->block_size); - - $this->Nk = $this->key_size >> 2; - // see Rijndael-ammended.pdf#page=44 - $this->Nr = max($this->Nk, $this->Nb) + 6; - - // shift offsets for Nb = 5, 7 are defined in Rijndael-ammended.pdf#page=44, - // "Table 8: Shift offsets in Shiftrow for the alternative block lengths" - // shift offsets for Nb = 4, 6, 8 are defined in Rijndael-ammended.pdf#page=14, - // "Table 2: Shift offsets for different block lengths" - switch ($this->Nb) { - case 4: - case 5: - case 6: - $this->c = array(0, 1, 2, 3); - break; - case 7: - $this->c = array(0, 1, 2, 4); - break; - case 8: - $this->c = array(0, 1, 3, 4); - } - - $w = array_values(unpack('N*words', $this->key)); - - $length = $this->Nb * ($this->Nr + 1); - for ($i = $this->Nk; $i < $length; $i++) { - $temp = $w[$i - 1]; - if ($i % $this->Nk == 0) { - // according to , "the size of an integer is platform-dependent". - // on a 32-bit machine, it's 32-bits, and on a 64-bit machine, it's 64-bits. on a 32-bit machine, - // 0xFFFFFFFF << 8 == 0xFFFFFF00, but on a 64-bit machine, it equals 0xFFFFFFFF00. as such, doing 'and' - // with 0xFFFFFFFF (or 0xFFFFFF00) on a 32-bit machine is unnecessary, but on a 64-bit machine, it is. - $temp = (($temp << 8) & 0xFFFFFF00) | (($temp >> 24) & 0x000000FF); // rotWord - $temp = $this->_subWord($temp) ^ $rcon[$i / $this->Nk]; - } else if ($this->Nk > 6 && $i % $this->Nk == 4) { - $temp = $this->_subWord($temp); - } - $w[$i] = $w[$i - $this->Nk] ^ $temp; - } - - // convert the key schedule from a vector of $Nb * ($Nr + 1) length to a matrix with $Nr + 1 rows and $Nb columns - // and generate the inverse key schedule. more specifically, - // according to (section 5.3.3), - // "The key expansion for the Inverse Cipher is defined as follows: - // 1. Apply the Key Expansion. - // 2. Apply InvMixColumn to all Round Keys except the first and the last one." - // also, see fips-197.pdf#page=27, "5.3.5 Equivalent Inverse Cipher" - $temp = $this->w = $this->dw = array(); - for ($i = $row = $col = 0; $i < $length; $i++, $col++) { - if ($col == $this->Nb) { - if ($row == 0) { - $this->dw[0] = $this->w[0]; - } else { - // subWord + invMixColumn + invSubWord = invMixColumn - $j = 0; - while ($j < $this->Nb) { - $dw = $this->_subWord($this->w[$row][$j]); - $temp[$j] = $this->dt0[$dw >> 24 & 0x000000FF] ^ - $this->dt1[$dw >> 16 & 0x000000FF] ^ - $this->dt2[$dw >> 8 & 0x000000FF] ^ - $this->dt3[$dw & 0x000000FF]; - $j++; - } - $this->dw[$row] = $temp; - } - - $col = 0; - $row++; - } - $this->w[$row][$col] = $w[$i]; - } - - $this->dw[$row] = $this->w[$row]; - - // In case of $this->use_inline_crypt === true we have to use 1-dim key arrays (both ascending) - if ($this->use_inline_crypt) { - $this->dw = array_reverse($this->dw); - $w = array_pop($this->w); - $dw = array_pop($this->dw); - foreach ($this->w as $r => $wr) { - foreach ($wr as $c => $wc) { - $w[] = $wc; - $dw[] = $this->dw[$r][$c]; - } - } - $this->w = $w; - $this->dw = $dw; - } - } - - /** - * Performs S-Box substitutions - * - * @access private - * @param Integer $word - */ - function _subWord($word) - { - $sbox = $this->sbox; - - return $sbox[$word & 0x000000FF] | - ($sbox[$word >> 8 & 0x000000FF] << 8) | - ($sbox[$word >> 16 & 0x000000FF] << 16) | - ($sbox[$word >> 24 & 0x000000FF] << 24); - } - - /** - * Setup the performance-optimized function for de/encrypt() - * - * @see Crypt_Base::_setupInlineCrypt() - * @access private - */ - function _setupInlineCrypt() - { - // Note: _setupInlineCrypt() will be called only if $this->changed === true - // So here we are'nt under the same heavy timing-stress as we are in _de/encryptBlock() or de/encrypt(). - // However...the here generated function- $code, stored as php callback in $this->inline_crypt, must work as fast as even possible. - - $lambda_functions =& Crypt_Rijndael::_getLambdaFunctions(); - - // The first 10 generated $lambda_functions will use the key-words hardcoded for better performance. - // For memory reason we limit those ultra-optimized functions. - // After that, we use pure (extracted) integer vars for the key-words which is faster than accessing them via array. - if (count($lambda_functions) < 10) { - $w = $this->w; - $dw = $this->dw; - $init_encrypt = ''; - $init_decrypt = ''; - } else { - for ($i = 0, $cw = count($this->w); $i < $cw; ++$i) { - $w[] = '$w[' . $i . ']'; - $dw[] = '$dw[' . $i . ']'; - } - $init_encrypt = '$w = $self->w;'; - $init_decrypt = '$dw = $self->dw;'; - } - - $code_hash = md5(str_pad("Crypt_Rijndael, {$this->mode}, {$this->block_size}, ", 32, "\0") . implode(',', $w)); - - if (!isset($lambda_functions[$code_hash])) { - $Nr = $this->Nr; - $Nb = $this->Nb; - $c = $this->c; - - // Generating encrypt code: - $init_encrypt.= ' - static $t0, $t1, $t2, $t3, $sbox; - if (!$t0) { - for ($i = 0; $i < 256; ++$i) { - $t0[$i] = (int)$self->t0[$i]; - $t1[$i] = (int)$self->t1[$i]; - $t2[$i] = (int)$self->t2[$i]; - $t3[$i] = (int)$self->t3[$i]; - $sbox[$i] = (int)$self->sbox[$i]; - } - } - '; - - $s = 'e'; - $e = 's'; - $wc = $Nb - 1; - - // Preround: addRoundKey - $encrypt_block = '$in = unpack("N*", $in);'."\n"; - for ($i = 0; $i < $Nb; ++$i) { - $encrypt_block .= '$s'.$i.' = $in['.($i + 1).'] ^ '.$w[++$wc].";\n"; - } - - // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey - for ($round = 1; $round < $Nr; ++$round) { - list($s, $e) = array($e, $s); - for ($i = 0; $i < $Nb; ++$i) { - $encrypt_block.= - '$'.$e.$i.' = - $t0[($'.$s.$i .' >> 24) & 0xff] ^ - $t1[($'.$s.(($i + $c[1]) % $Nb).' >> 16) & 0xff] ^ - $t2[($'.$s.(($i + $c[2]) % $Nb).' >> 8) & 0xff] ^ - $t3[ $'.$s.(($i + $c[3]) % $Nb).' & 0xff] ^ - '.$w[++$wc].";\n"; - } - } - - // Finalround: subWord + shiftRows + addRoundKey - for ($i = 0; $i < $Nb; ++$i) { - $encrypt_block.= - '$'.$e.$i.' = - $sbox[ $'.$e.$i.' & 0xff] | - ($sbox[($'.$e.$i.' >> 8) & 0xff] << 8) | - ($sbox[($'.$e.$i.' >> 16) & 0xff] << 16) | - ($sbox[($'.$e.$i.' >> 24) & 0xff] << 24);'."\n"; - } - $encrypt_block .= '$in = pack("N*"'."\n"; - for ($i = 0; $i < $Nb; ++$i) { - $encrypt_block.= ', - ($'.$e.$i .' & 0xFF000000) ^ - ($'.$e.(($i + $c[1]) % $Nb).' & 0x00FF0000) ^ - ($'.$e.(($i + $c[2]) % $Nb).' & 0x0000FF00) ^ - ($'.$e.(($i + $c[3]) % $Nb).' & 0x000000FF) ^ - '.$w[$i]."\n"; - } - $encrypt_block .= ');'; - - // Generating decrypt code: - $init_decrypt.= ' - static $dt0, $dt1, $dt2, $dt3, $isbox; - if (!$dt0) { - for ($i = 0; $i < 256; ++$i) { - $dt0[$i] = (int)$self->dt0[$i]; - $dt1[$i] = (int)$self->dt1[$i]; - $dt2[$i] = (int)$self->dt2[$i]; - $dt3[$i] = (int)$self->dt3[$i]; - $isbox[$i] = (int)$self->isbox[$i]; - } - } - '; - - $s = 'e'; - $e = 's'; - $wc = $Nb - 1; - - // Preround: addRoundKey - $decrypt_block = '$in = unpack("N*", $in);'."\n"; - for ($i = 0; $i < $Nb; ++$i) { - $decrypt_block .= '$s'.$i.' = $in['.($i + 1).'] ^ '.$dw[++$wc].';'."\n"; - } - - // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey - for ($round = 1; $round < $Nr; ++$round) { - list($s, $e) = array($e, $s); - for ($i = 0; $i < $Nb; ++$i) { - $decrypt_block.= - '$'.$e.$i.' = - $dt0[($'.$s.$i .' >> 24) & 0xff] ^ - $dt1[($'.$s.(($Nb + $i - $c[1]) % $Nb).' >> 16) & 0xff] ^ - $dt2[($'.$s.(($Nb + $i - $c[2]) % $Nb).' >> 8) & 0xff] ^ - $dt3[ $'.$s.(($Nb + $i - $c[3]) % $Nb).' & 0xff] ^ - '.$dw[++$wc].";\n"; - } - } - - // Finalround: subWord + shiftRows + addRoundKey - for ($i = 0; $i < $Nb; ++$i) { - $decrypt_block.= - '$'.$e.$i.' = - $isbox[ $'.$e.$i.' & 0xff] | - ($isbox[($'.$e.$i.' >> 8) & 0xff] << 8) | - ($isbox[($'.$e.$i.' >> 16) & 0xff] << 16) | - ($isbox[($'.$e.$i.' >> 24) & 0xff] << 24);'."\n"; - } - $decrypt_block .= '$in = pack("N*"'."\n"; - for ($i = 0; $i < $Nb; ++$i) { - $decrypt_block.= ', - ($'.$e.$i. ' & 0xFF000000) ^ - ($'.$e.(($Nb + $i - $c[1]) % $Nb).' & 0x00FF0000) ^ - ($'.$e.(($Nb + $i - $c[2]) % $Nb).' & 0x0000FF00) ^ - ($'.$e.(($Nb + $i - $c[3]) % $Nb).' & 0x000000FF) ^ - '.$dw[$i]."\n"; - } - $decrypt_block .= ');'; - - $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( - array( - 'init_crypt' => '', - 'init_encrypt' => $init_encrypt, - 'init_decrypt' => $init_decrypt, - 'encrypt_block' => $encrypt_block, - 'decrypt_block' => $decrypt_block - ) - ); - } - $this->inline_crypt = $lambda_functions[$code_hash]; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/TripleDES.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/TripleDES.php deleted file mode 100755 index 06ea09b1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/TripleDES.php +++ /dev/null @@ -1,428 +0,0 @@ - - * setKey('abcdefghijklmnopqrstuvwx'); - * - * $size = 10 * 1024; - * $plaintext = ''; - * for ($i = 0; $i < $size; $i++) { - * $plaintext.= 'a'; - * } - * - * echo $des->decrypt($des->encrypt($plaintext)); - * ?> - * - * - * LICENSE: 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. - * - * @category Crypt - * @package Crypt_TripleDES - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include Crypt_DES - */ -if (!class_exists('Crypt_DES')) { - include_once 'DES.php'; -} - -/** - * Encrypt / decrypt using inner chaining - * - * Inner chaining is used by SSH-1 and is generally considered to be less secure then outer chaining (CRYPT_DES_MODE_CBC3). - */ -define('CRYPT_DES_MODE_3CBC', -2); - -/** - * Encrypt / decrypt using outer chaining - * - * Outer chaining is used by SSH-2 and when the mode is set to CRYPT_DES_MODE_CBC. - */ -define('CRYPT_DES_MODE_CBC3', CRYPT_DES_MODE_CBC); - -/** - * Pure-PHP implementation of Triple DES. - * - * @package Crypt_TripleDES - * @author Jim Wigginton - * @access public - */ -class Crypt_TripleDES extends Crypt_DES -{ - /** - * The default password key_size used by setPassword() - * - * @see Crypt_DES::password_key_size - * @see Crypt_Base::password_key_size - * @see Crypt_Base::setPassword() - * @var Integer - * @access private - */ - var $password_key_size = 24; - - /** - * The default salt used by setPassword() - * - * @see Crypt_Base::password_default_salt - * @see Crypt_Base::setPassword() - * @var String - * @access private - */ - var $password_default_salt = 'phpseclib'; - - /** - * The namespace used by the cipher for its constants. - * - * @see Crypt_DES::const_namespace - * @see Crypt_Base::const_namespace - * @var String - * @access private - */ - var $const_namespace = 'DES'; - - /** - * The mcrypt specific name of the cipher - * - * @see Crypt_DES::cipher_name_mcrypt - * @see Crypt_Base::cipher_name_mcrypt - * @var String - * @access private - */ - var $cipher_name_mcrypt = 'tripledes'; - - /** - * Optimizing value while CFB-encrypting - * - * @see Crypt_Base::cfb_init_len - * @var Integer - * @access private - */ - var $cfb_init_len = 750; - - /** - * max possible size of $key - * - * @see Crypt_TripleDES::setKey() - * @see Crypt_DES::setKey() - * @var String - * @access private - */ - var $key_size_max = 24; - - /** - * Internal flag whether using CRYPT_DES_MODE_3CBC or not - * - * @var Boolean - * @access private - */ - var $mode_3cbc; - - /** - * The Crypt_DES objects - * - * Used only if $mode_3cbc === true - * - * @var Array - * @access private - */ - var $des; - - /** - * Default Constructor. - * - * Determines whether or not the mcrypt extension should be used. - * - * $mode could be: - * - * - CRYPT_DES_MODE_ECB - * - * - CRYPT_DES_MODE_CBC - * - * - CRYPT_DES_MODE_CTR - * - * - CRYPT_DES_MODE_CFB - * - * - CRYPT_DES_MODE_OFB - * - * - CRYPT_DES_MODE_3CBC - * - * If not explicitly set, CRYPT_DES_MODE_CBC will be used. - * - * @see Crypt_DES::Crypt_DES() - * @see Crypt_Base::Crypt_Base() - * @param optional Integer $mode - * @access public - */ - function Crypt_TripleDES($mode = CRYPT_DES_MODE_CBC) - { - switch ($mode) { - // In case of CRYPT_DES_MODE_3CBC, we init as CRYPT_DES_MODE_CBC - // and additional flag us internally as 3CBC - case CRYPT_DES_MODE_3CBC: - parent::Crypt_Base(CRYPT_DES_MODE_CBC); - $this->mode_3cbc = true; - - // This three $des'es will do the 3CBC work (if $key > 64bits) - $this->des = array( - new Crypt_DES(CRYPT_DES_MODE_CBC), - new Crypt_DES(CRYPT_DES_MODE_CBC), - new Crypt_DES(CRYPT_DES_MODE_CBC), - ); - - // we're going to be doing the padding, ourselves, so disable it in the Crypt_DES objects - $this->des[0]->disablePadding(); - $this->des[1]->disablePadding(); - $this->des[2]->disablePadding(); - break; - // If not 3CBC, we init as usual - default: - parent::Crypt_Base($mode); - } - } - - /** - * Sets the initialization vector. (optional) - * - * SetIV is not required when CRYPT_DES_MODE_ECB is being used. If not explicitly set, it'll be assumed - * to be all zero's. - * - * @see Crypt_Base::setIV() - * @access public - * @param String $iv - */ - function setIV($iv) - { - parent::setIV($iv); - if ($this->mode_3cbc) { - $this->des[0]->setIV($iv); - $this->des[1]->setIV($iv); - $this->des[2]->setIV($iv); - } - } - - /** - * Sets the key. - * - * Keys can be of any length. Triple DES, itself, can use 128-bit (eg. strlen($key) == 16) or - * 192-bit (eg. strlen($key) == 24) keys. This function pads and truncates $key as appropriate. - * - * DES also requires that every eighth bit be a parity bit, however, we'll ignore that. - * - * If the key is not explicitly set, it'll be assumed to be all null bytes. - * - * @access public - * @see Crypt_DES::setKey() - * @see Crypt_Base::setKey() - * @param String $key - */ - function setKey($key) - { - $length = strlen($key); - if ($length > 8) { - $key = str_pad(substr($key, 0, 24), 24, chr(0)); - // if $key is between 64 and 128-bits, use the first 64-bits as the last, per this: - // http://php.net/function.mcrypt-encrypt#47973 - //$key = $length <= 16 ? substr_replace($key, substr($key, 0, 8), 16) : substr($key, 0, 24); - } else { - $key = str_pad($key, 8, chr(0)); - } - parent::setKey($key); - - // And in case of CRYPT_DES_MODE_3CBC: - // if key <= 64bits we not need the 3 $des to work, - // because we will then act as regular DES-CBC with just a <= 64bit key. - // So only if the key > 64bits (> 8 bytes) we will call setKey() for the 3 $des. - if ($this->mode_3cbc && $length > 8) { - $this->des[0]->setKey(substr($key, 0, 8)); - $this->des[1]->setKey(substr($key, 8, 8)); - $this->des[2]->setKey(substr($key, 16, 8)); - } - } - - /** - * Encrypts a message. - * - * @see Crypt_Base::encrypt() - * @access public - * @param String $plaintext - * @return String $cipertext - */ - function encrypt($plaintext) - { - // parent::en/decrypt() is able to do all the work for all modes and keylengths, - // except for: CRYPT_DES_MODE_3CBC (inner chaining CBC) with a key > 64bits - - // if the key is smaller then 8, do what we'd normally do - if ($this->mode_3cbc && strlen($this->key) > 8) { - return $this->des[2]->encrypt( - $this->des[1]->decrypt( - $this->des[0]->encrypt( - $this->_pad($plaintext) - ) - ) - ); - } - - return parent::encrypt($plaintext); - } - - /** - * Decrypts a message. - * - * @see Crypt_Base::decrypt() - * @access public - * @param String $ciphertext - * @return String $plaintext - */ - function decrypt($ciphertext) - { - if ($this->mode_3cbc && strlen($this->key) > 8) { - return $this->_unpad( - $this->des[0]->decrypt( - $this->des[1]->encrypt( - $this->des[2]->decrypt( - str_pad($ciphertext, (strlen($ciphertext) + 7) & 0xFFFFFFF8, "\0") - ) - ) - ) - ); - } - - return parent::decrypt($ciphertext); - } - - /** - * Treat consecutive "packets" as if they are a continuous buffer. - * - * Say you have a 16-byte plaintext $plaintext. Using the default behavior, the two following code snippets - * will yield different outputs: - * - * - * echo $des->encrypt(substr($plaintext, 0, 8)); - * echo $des->encrypt(substr($plaintext, 8, 8)); - * - * - * echo $des->encrypt($plaintext); - * - * - * The solution is to enable the continuous buffer. Although this will resolve the above discrepancy, it creates - * another, as demonstrated with the following: - * - * - * $des->encrypt(substr($plaintext, 0, 8)); - * echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8))); - * - * - * echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8))); - * - * - * With the continuous buffer disabled, these would yield the same output. With it enabled, they yield different - * outputs. The reason is due to the fact that the initialization vector's change after every encryption / - * decryption round when the continuous buffer is enabled. When it's disabled, they remain constant. - * - * Put another way, when the continuous buffer is enabled, the state of the Crypt_DES() object changes after each - * encryption / decryption round, whereas otherwise, it'd remain constant. For this reason, it's recommended that - * continuous buffers not be used. They do offer better security and are, in fact, sometimes required (SSH uses them), - * however, they are also less intuitive and more likely to cause you problems. - * - * @see Crypt_Base::enableContinuousBuffer() - * @see Crypt_TripleDES::disableContinuousBuffer() - * @access public - */ - function enableContinuousBuffer() - { - parent::enableContinuousBuffer(); - if ($this->mode_3cbc) { - $this->des[0]->enableContinuousBuffer(); - $this->des[1]->enableContinuousBuffer(); - $this->des[2]->enableContinuousBuffer(); - } - } - - /** - * Treat consecutive packets as if they are a discontinuous buffer. - * - * The default behavior. - * - * @see Crypt_Base::disableContinuousBuffer() - * @see Crypt_TripleDES::enableContinuousBuffer() - * @access public - */ - function disableContinuousBuffer() - { - parent::disableContinuousBuffer(); - if ($this->mode_3cbc) { - $this->des[0]->disableContinuousBuffer(); - $this->des[1]->disableContinuousBuffer(); - $this->des[2]->disableContinuousBuffer(); - } - } - - /** - * Creates the key schedule - * - * @see Crypt_DES::_setupKey() - * @see Crypt_Base::_setupKey() - * @access private - */ - function _setupKey() - { - switch (true) { - // if $key <= 64bits we configure our internal pure-php cipher engine - // to act as regular [1]DES, not as 3DES. mcrypt.so::tripledes does the same. - case strlen($this->key) <= 8: - $this->des_rounds = 1; - break; - - // otherwise, if $key > 64bits, we configure our engine to work as 3DES. - default: - $this->des_rounds = 3; - - // (only) if 3CBC is used we have, of course, to setup the $des[0-2] keys also separately. - if ($this->mode_3cbc) { - $this->des[0]->_setupKey(); - $this->des[1]->_setupKey(); - $this->des[2]->_setupKey(); - - // because $des[0-2] will, now, do all the work we can return here - // not need unnecessary stress parent::_setupKey() with our, now unused, $key. - return; - } - } - // setup our key - parent::_setupKey(); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Twofish.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Twofish.php deleted file mode 100755 index 8dd7933a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Crypt/Twofish.php +++ /dev/null @@ -1,895 +0,0 @@ - - * setKey('12345678901234567890123456789012'); - * - * $plaintext = str_repeat('a', 1024); - * - * echo $twofish->decrypt($twofish->encrypt($plaintext)); - * ?> - * - * - * LICENSE: 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. - * - * @category Crypt - * @package Crypt_Twofish - * @author Jim Wigginton - * @author Hans-Juergen Petrich - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include Crypt_Base - * - * Base cipher class - */ -if (!class_exists('Crypt_Base')) { - include_once 'Base.php'; -} - -/**#@+ - * @access public - * @see Crypt_Twofish::encrypt() - * @see Crypt_Twofish::decrypt() - */ -/** - * Encrypt / decrypt using the Counter mode. - * - * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 - */ -define('CRYPT_TWOFISH_MODE_CTR', CRYPT_MODE_CTR); -/** - * Encrypt / decrypt using the Electronic Code Book mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 - */ -define('CRYPT_TWOFISH_MODE_ECB', CRYPT_MODE_ECB); -/** - * Encrypt / decrypt using the Code Book Chaining mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 - */ -define('CRYPT_TWOFISH_MODE_CBC', CRYPT_MODE_CBC); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 - */ -define('CRYPT_TWOFISH_MODE_CFB', CRYPT_MODE_CFB); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 - */ -define('CRYPT_TWOFISH_MODE_OFB', CRYPT_MODE_OFB); -/**#@-*/ - -/**#@+ - * @access private - * @see Crypt_Base::Crypt_Base() - */ -/** - * Toggles the internal implementation - */ -define('CRYPT_TWOFISH_MODE_INTERNAL', CRYPT_MODE_INTERNAL); -/** - * Toggles the mcrypt implementation - */ -define('CRYPT_TWOFISH_MODE_MCRYPT', CRYPT_MODE_MCRYPT); -/**#@-*/ - -/** - * Pure-PHP implementation of Twofish. - * - * @package Crypt_Twofish - * @author Jim Wigginton - * @author Hans-Juergen Petrich - * @access public - */ -class Crypt_Twofish extends Crypt_Base -{ - /** - * The namespace used by the cipher for its constants. - * - * @see Crypt_Base::const_namespace - * @var String - * @access private - */ - var $const_namespace = 'TWOFISH'; - - /** - * The mcrypt specific name of the cipher - * - * @see Crypt_Base::cipher_name_mcrypt - * @var String - * @access private - */ - var $cipher_name_mcrypt = 'twofish'; - - /** - * Optimizing value while CFB-encrypting - * - * @see Crypt_Base::cfb_init_len - * @var Integer - * @access private - */ - var $cfb_init_len = 800; - - /** - * Q-Table - * - * @var Array - * @access private - */ - var $q0 = array ( - 0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76, - 0x9A, 0x92, 0x80, 0x78, 0xE4, 0xDD, 0xD1, 0x38, - 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7, 0xEC, 0x6C, - 0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48, - 0xF2, 0xD0, 0x8B, 0x30, 0x84, 0x54, 0xDF, 0x23, - 0x19, 0x5B, 0x3D, 0x59, 0xF3, 0xAE, 0xA2, 0x82, - 0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B, 0x7C, - 0xA6, 0xEB, 0xA5, 0xBE, 0x16, 0x0C, 0xE3, 0x61, - 0xC0, 0x8C, 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B, - 0xBB, 0x4E, 0x89, 0x6B, 0x53, 0x6A, 0xB4, 0xF1, - 0xE1, 0xE6, 0xBD, 0x45, 0xE2, 0xF4, 0xB6, 0x66, - 0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7, - 0xFB, 0xC3, 0x8E, 0xB5, 0xE9, 0xCF, 0xBF, 0xBA, - 0xEA, 0x77, 0x39, 0xAF, 0x33, 0xC9, 0x62, 0x71, - 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8, - 0xE5, 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7, - 0xA1, 0x1D, 0xAA, 0xED, 0x06, 0x70, 0xB2, 0xD2, - 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27, 0x90, - 0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB, - 0x9E, 0x9C, 0x52, 0x1B, 0x5F, 0x93, 0x0A, 0xEF, - 0x91, 0x85, 0x49, 0xEE, 0x2D, 0x4F, 0x8F, 0x3B, - 0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64, - 0x2A, 0xCE, 0xCB, 0x2F, 0xFC, 0x97, 0x05, 0x7A, - 0xAC, 0x7F, 0xD5, 0x1A, 0x4B, 0x0E, 0xA7, 0x5A, - 0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C, 0x4C, 0x02, - 0xB8, 0xDA, 0xB0, 0x17, 0x55, 0x1F, 0x8A, 0x7D, - 0x57, 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72, - 0x7E, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34, - 0x6E, 0x50, 0xDE, 0x68, 0x65, 0xBC, 0xDB, 0xF8, - 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4, - 0xCA, 0x10, 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00, - 0x6F, 0x9D, 0x36, 0x42, 0x4A, 0x5E, 0xC1, 0xE0 - ); - - /** - * Q-Table - * - * @var Array - * @access private - */ - var $q1 = array ( - 0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8, - 0x4A, 0xD3, 0xE6, 0x6B, 0x45, 0x7D, 0xE8, 0x4B, - 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71, 0xF1, 0xE1, - 0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F, - 0x5E, 0xBA, 0xAE, 0x5B, 0x8A, 0x00, 0xBC, 0x9D, - 0x6D, 0xC1, 0xB1, 0x0E, 0x80, 0x5D, 0xD2, 0xD5, - 0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C, 0xA3, - 0xB2, 0x73, 0x4C, 0x54, 0x92, 0x74, 0x36, 0x51, - 0x38, 0xB0, 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96, - 0x6C, 0x42, 0xF7, 0x10, 0x7C, 0x28, 0x27, 0x8C, - 0x13, 0x95, 0x9C, 0xC7, 0x24, 0x46, 0x3B, 0x70, - 0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8, - 0xA6, 0x83, 0x20, 0xFF, 0x9F, 0x77, 0xC3, 0xCC, - 0x03, 0x6F, 0x08, 0xBF, 0x40, 0xE7, 0x2B, 0xE2, - 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9, - 0xE4, 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17, - 0x66, 0x94, 0xA1, 0x1D, 0x3D, 0xF0, 0xDE, 0xB3, - 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53, 0x3E, - 0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49, - 0x81, 0x88, 0xEE, 0x21, 0xC4, 0x1A, 0xEB, 0xD9, - 0xC5, 0x39, 0x99, 0xCD, 0xAD, 0x31, 0x8B, 0x01, - 0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48, - 0x4F, 0xF2, 0x65, 0x8E, 0x78, 0x5C, 0x58, 0x19, - 0x8D, 0xE5, 0x98, 0x57, 0x67, 0x7F, 0x05, 0x64, - 0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7, 0x3C, 0xA5, - 0xCE, 0xE9, 0x68, 0x44, 0xE0, 0x4D, 0x43, 0x69, - 0x29, 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E, - 0x6E, 0x47, 0xDF, 0x34, 0x35, 0x6A, 0xCF, 0xDC, - 0x22, 0xC9, 0xC0, 0x9B, 0x89, 0xD4, 0xED, 0xAB, - 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9, - 0xD7, 0x61, 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2, - 0x16, 0x25, 0x86, 0x56, 0x55, 0x09, 0xBE, 0x91 - ); - - /** - * M-Table - * - * @var Array - * @access private - */ - var $m0 = array ( - 0xBCBC3275, 0xECEC21F3, 0x202043C6, 0xB3B3C9F4, 0xDADA03DB, 0x02028B7B, 0xE2E22BFB, 0x9E9EFAC8, - 0xC9C9EC4A, 0xD4D409D3, 0x18186BE6, 0x1E1E9F6B, 0x98980E45, 0xB2B2387D, 0xA6A6D2E8, 0x2626B74B, - 0x3C3C57D6, 0x93938A32, 0x8282EED8, 0x525298FD, 0x7B7BD437, 0xBBBB3771, 0x5B5B97F1, 0x474783E1, - 0x24243C30, 0x5151E20F, 0xBABAC6F8, 0x4A4AF31B, 0xBFBF4887, 0x0D0D70FA, 0xB0B0B306, 0x7575DE3F, - 0xD2D2FD5E, 0x7D7D20BA, 0x666631AE, 0x3A3AA35B, 0x59591C8A, 0x00000000, 0xCDCD93BC, 0x1A1AE09D, - 0xAEAE2C6D, 0x7F7FABC1, 0x2B2BC7B1, 0xBEBEB90E, 0xE0E0A080, 0x8A8A105D, 0x3B3B52D2, 0x6464BAD5, - 0xD8D888A0, 0xE7E7A584, 0x5F5FE807, 0x1B1B1114, 0x2C2CC2B5, 0xFCFCB490, 0x3131272C, 0x808065A3, - 0x73732AB2, 0x0C0C8173, 0x79795F4C, 0x6B6B4154, 0x4B4B0292, 0x53536974, 0x94948F36, 0x83831F51, - 0x2A2A3638, 0xC4C49CB0, 0x2222C8BD, 0xD5D5F85A, 0xBDBDC3FC, 0x48487860, 0xFFFFCE62, 0x4C4C0796, - 0x4141776C, 0xC7C7E642, 0xEBEB24F7, 0x1C1C1410, 0x5D5D637C, 0x36362228, 0x6767C027, 0xE9E9AF8C, - 0x4444F913, 0x1414EA95, 0xF5F5BB9C, 0xCFCF18C7, 0x3F3F2D24, 0xC0C0E346, 0x7272DB3B, 0x54546C70, - 0x29294CCA, 0xF0F035E3, 0x0808FE85, 0xC6C617CB, 0xF3F34F11, 0x8C8CE4D0, 0xA4A45993, 0xCACA96B8, - 0x68683BA6, 0xB8B84D83, 0x38382820, 0xE5E52EFF, 0xADAD569F, 0x0B0B8477, 0xC8C81DC3, 0x9999FFCC, - 0x5858ED03, 0x19199A6F, 0x0E0E0A08, 0x95957EBF, 0x70705040, 0xF7F730E7, 0x6E6ECF2B, 0x1F1F6EE2, - 0xB5B53D79, 0x09090F0C, 0x616134AA, 0x57571682, 0x9F9F0B41, 0x9D9D803A, 0x111164EA, 0x2525CDB9, - 0xAFAFDDE4, 0x4545089A, 0xDFDF8DA4, 0xA3A35C97, 0xEAEAD57E, 0x353558DA, 0xEDEDD07A, 0x4343FC17, - 0xF8F8CB66, 0xFBFBB194, 0x3737D3A1, 0xFAFA401D, 0xC2C2683D, 0xB4B4CCF0, 0x32325DDE, 0x9C9C71B3, - 0x5656E70B, 0xE3E3DA72, 0x878760A7, 0x15151B1C, 0xF9F93AEF, 0x6363BFD1, 0x3434A953, 0x9A9A853E, - 0xB1B1428F, 0x7C7CD133, 0x88889B26, 0x3D3DA65F, 0xA1A1D7EC, 0xE4E4DF76, 0x8181942A, 0x91910149, - 0x0F0FFB81, 0xEEEEAA88, 0x161661EE, 0xD7D77321, 0x9797F5C4, 0xA5A5A81A, 0xFEFE3FEB, 0x6D6DB5D9, - 0x7878AEC5, 0xC5C56D39, 0x1D1DE599, 0x7676A4CD, 0x3E3EDCAD, 0xCBCB6731, 0xB6B6478B, 0xEFEF5B01, - 0x12121E18, 0x6060C523, 0x6A6AB0DD, 0x4D4DF61F, 0xCECEE94E, 0xDEDE7C2D, 0x55559DF9, 0x7E7E5A48, - 0x2121B24F, 0x03037AF2, 0xA0A02665, 0x5E5E198E, 0x5A5A6678, 0x65654B5C, 0x62624E58, 0xFDFD4519, - 0x0606F48D, 0x404086E5, 0xF2F2BE98, 0x3333AC57, 0x17179067, 0x05058E7F, 0xE8E85E05, 0x4F4F7D64, - 0x89896AAF, 0x10109563, 0x74742FB6, 0x0A0A75FE, 0x5C5C92F5, 0x9B9B74B7, 0x2D2D333C, 0x3030D6A5, - 0x2E2E49CE, 0x494989E9, 0x46467268, 0x77775544, 0xA8A8D8E0, 0x9696044D, 0x2828BD43, 0xA9A92969, - 0xD9D97929, 0x8686912E, 0xD1D187AC, 0xF4F44A15, 0x8D8D1559, 0xD6D682A8, 0xB9B9BC0A, 0x42420D9E, - 0xF6F6C16E, 0x2F2FB847, 0xDDDD06DF, 0x23233934, 0xCCCC6235, 0xF1F1C46A, 0xC1C112CF, 0x8585EBDC, - 0x8F8F9E22, 0x7171A1C9, 0x9090F0C0, 0xAAAA539B, 0x0101F189, 0x8B8BE1D4, 0x4E4E8CED, 0x8E8E6FAB, - 0xABABA212, 0x6F6F3EA2, 0xE6E6540D, 0xDBDBF252, 0x92927BBB, 0xB7B7B602, 0x6969CA2F, 0x3939D9A9, - 0xD3D30CD7, 0xA7A72361, 0xA2A2AD1E, 0xC3C399B4, 0x6C6C4450, 0x07070504, 0x04047FF6, 0x272746C2, - 0xACACA716, 0xD0D07625, 0x50501386, 0xDCDCF756, 0x84841A55, 0xE1E15109, 0x7A7A25BE, 0x1313EF91 - ); - - /** - * M-Table - * - * @var Array - * @access private - */ - var $m1 = array ( - 0xA9D93939, 0x67901717, 0xB3719C9C, 0xE8D2A6A6, 0x04050707, 0xFD985252, 0xA3658080, 0x76DFE4E4, - 0x9A084545, 0x92024B4B, 0x80A0E0E0, 0x78665A5A, 0xE4DDAFAF, 0xDDB06A6A, 0xD1BF6363, 0x38362A2A, - 0x0D54E6E6, 0xC6432020, 0x3562CCCC, 0x98BEF2F2, 0x181E1212, 0xF724EBEB, 0xECD7A1A1, 0x6C774141, - 0x43BD2828, 0x7532BCBC, 0x37D47B7B, 0x269B8888, 0xFA700D0D, 0x13F94444, 0x94B1FBFB, 0x485A7E7E, - 0xF27A0303, 0xD0E48C8C, 0x8B47B6B6, 0x303C2424, 0x84A5E7E7, 0x54416B6B, 0xDF06DDDD, 0x23C56060, - 0x1945FDFD, 0x5BA33A3A, 0x3D68C2C2, 0x59158D8D, 0xF321ECEC, 0xAE316666, 0xA23E6F6F, 0x82165757, - 0x63951010, 0x015BEFEF, 0x834DB8B8, 0x2E918686, 0xD9B56D6D, 0x511F8383, 0x9B53AAAA, 0x7C635D5D, - 0xA63B6868, 0xEB3FFEFE, 0xA5D63030, 0xBE257A7A, 0x16A7ACAC, 0x0C0F0909, 0xE335F0F0, 0x6123A7A7, - 0xC0F09090, 0x8CAFE9E9, 0x3A809D9D, 0xF5925C5C, 0x73810C0C, 0x2C273131, 0x2576D0D0, 0x0BE75656, - 0xBB7B9292, 0x4EE9CECE, 0x89F10101, 0x6B9F1E1E, 0x53A93434, 0x6AC4F1F1, 0xB499C3C3, 0xF1975B5B, - 0xE1834747, 0xE66B1818, 0xBDC82222, 0x450E9898, 0xE26E1F1F, 0xF4C9B3B3, 0xB62F7474, 0x66CBF8F8, - 0xCCFF9999, 0x95EA1414, 0x03ED5858, 0x56F7DCDC, 0xD4E18B8B, 0x1C1B1515, 0x1EADA2A2, 0xD70CD3D3, - 0xFB2BE2E2, 0xC31DC8C8, 0x8E195E5E, 0xB5C22C2C, 0xE9894949, 0xCF12C1C1, 0xBF7E9595, 0xBA207D7D, - 0xEA641111, 0x77840B0B, 0x396DC5C5, 0xAF6A8989, 0x33D17C7C, 0xC9A17171, 0x62CEFFFF, 0x7137BBBB, - 0x81FB0F0F, 0x793DB5B5, 0x0951E1E1, 0xADDC3E3E, 0x242D3F3F, 0xCDA47676, 0xF99D5555, 0xD8EE8282, - 0xE5864040, 0xC5AE7878, 0xB9CD2525, 0x4D049696, 0x44557777, 0x080A0E0E, 0x86135050, 0xE730F7F7, - 0xA1D33737, 0x1D40FAFA, 0xAA346161, 0xED8C4E4E, 0x06B3B0B0, 0x706C5454, 0xB22A7373, 0xD2523B3B, - 0x410B9F9F, 0x7B8B0202, 0xA088D8D8, 0x114FF3F3, 0x3167CBCB, 0xC2462727, 0x27C06767, 0x90B4FCFC, - 0x20283838, 0xF67F0404, 0x60784848, 0xFF2EE5E5, 0x96074C4C, 0x5C4B6565, 0xB1C72B2B, 0xAB6F8E8E, - 0x9E0D4242, 0x9CBBF5F5, 0x52F2DBDB, 0x1BF34A4A, 0x5FA63D3D, 0x9359A4A4, 0x0ABCB9B9, 0xEF3AF9F9, - 0x91EF1313, 0x85FE0808, 0x49019191, 0xEE611616, 0x2D7CDEDE, 0x4FB22121, 0x8F42B1B1, 0x3BDB7272, - 0x47B82F2F, 0x8748BFBF, 0x6D2CAEAE, 0x46E3C0C0, 0xD6573C3C, 0x3E859A9A, 0x6929A9A9, 0x647D4F4F, - 0x2A948181, 0xCE492E2E, 0xCB17C6C6, 0x2FCA6969, 0xFCC3BDBD, 0x975CA3A3, 0x055EE8E8, 0x7AD0EDED, - 0xAC87D1D1, 0x7F8E0505, 0xD5BA6464, 0x1AA8A5A5, 0x4BB72626, 0x0EB9BEBE, 0xA7608787, 0x5AF8D5D5, - 0x28223636, 0x14111B1B, 0x3FDE7575, 0x2979D9D9, 0x88AAEEEE, 0x3C332D2D, 0x4C5F7979, 0x02B6B7B7, - 0xB896CACA, 0xDA583535, 0xB09CC4C4, 0x17FC4343, 0x551A8484, 0x1FF64D4D, 0x8A1C5959, 0x7D38B2B2, - 0x57AC3333, 0xC718CFCF, 0x8DF40606, 0x74695353, 0xB7749B9B, 0xC4F59797, 0x9F56ADAD, 0x72DAE3E3, - 0x7ED5EAEA, 0x154AF4F4, 0x229E8F8F, 0x12A2ABAB, 0x584E6262, 0x07E85F5F, 0x99E51D1D, 0x34392323, - 0x6EC1F6F6, 0x50446C6C, 0xDE5D3232, 0x68724646, 0x6526A0A0, 0xBC93CDCD, 0xDB03DADA, 0xF8C6BABA, - 0xC8FA9E9E, 0xA882D6D6, 0x2BCF6E6E, 0x40507070, 0xDCEB8585, 0xFE750A0A, 0x328A9393, 0xA48DDFDF, - 0xCA4C2929, 0x10141C1C, 0x2173D7D7, 0xF0CCB4B4, 0xD309D4D4, 0x5D108A8A, 0x0FE25151, 0x00000000, - 0x6F9A1919, 0x9DE01A1A, 0x368F9494, 0x42E6C7C7, 0x4AECC9C9, 0x5EFDD2D2, 0xC1AB7F7F, 0xE0D8A8A8 - ); - - /** - * M-Table - * - * @var Array - * @access private - */ - var $m2 = array ( - 0xBC75BC32, 0xECF3EC21, 0x20C62043, 0xB3F4B3C9, 0xDADBDA03, 0x027B028B, 0xE2FBE22B, 0x9EC89EFA, - 0xC94AC9EC, 0xD4D3D409, 0x18E6186B, 0x1E6B1E9F, 0x9845980E, 0xB27DB238, 0xA6E8A6D2, 0x264B26B7, - 0x3CD63C57, 0x9332938A, 0x82D882EE, 0x52FD5298, 0x7B377BD4, 0xBB71BB37, 0x5BF15B97, 0x47E14783, - 0x2430243C, 0x510F51E2, 0xBAF8BAC6, 0x4A1B4AF3, 0xBF87BF48, 0x0DFA0D70, 0xB006B0B3, 0x753F75DE, - 0xD25ED2FD, 0x7DBA7D20, 0x66AE6631, 0x3A5B3AA3, 0x598A591C, 0x00000000, 0xCDBCCD93, 0x1A9D1AE0, - 0xAE6DAE2C, 0x7FC17FAB, 0x2BB12BC7, 0xBE0EBEB9, 0xE080E0A0, 0x8A5D8A10, 0x3BD23B52, 0x64D564BA, - 0xD8A0D888, 0xE784E7A5, 0x5F075FE8, 0x1B141B11, 0x2CB52CC2, 0xFC90FCB4, 0x312C3127, 0x80A38065, - 0x73B2732A, 0x0C730C81, 0x794C795F, 0x6B546B41, 0x4B924B02, 0x53745369, 0x9436948F, 0x8351831F, - 0x2A382A36, 0xC4B0C49C, 0x22BD22C8, 0xD55AD5F8, 0xBDFCBDC3, 0x48604878, 0xFF62FFCE, 0x4C964C07, - 0x416C4177, 0xC742C7E6, 0xEBF7EB24, 0x1C101C14, 0x5D7C5D63, 0x36283622, 0x672767C0, 0xE98CE9AF, - 0x441344F9, 0x149514EA, 0xF59CF5BB, 0xCFC7CF18, 0x3F243F2D, 0xC046C0E3, 0x723B72DB, 0x5470546C, - 0x29CA294C, 0xF0E3F035, 0x088508FE, 0xC6CBC617, 0xF311F34F, 0x8CD08CE4, 0xA493A459, 0xCAB8CA96, - 0x68A6683B, 0xB883B84D, 0x38203828, 0xE5FFE52E, 0xAD9FAD56, 0x0B770B84, 0xC8C3C81D, 0x99CC99FF, - 0x580358ED, 0x196F199A, 0x0E080E0A, 0x95BF957E, 0x70407050, 0xF7E7F730, 0x6E2B6ECF, 0x1FE21F6E, - 0xB579B53D, 0x090C090F, 0x61AA6134, 0x57825716, 0x9F419F0B, 0x9D3A9D80, 0x11EA1164, 0x25B925CD, - 0xAFE4AFDD, 0x459A4508, 0xDFA4DF8D, 0xA397A35C, 0xEA7EEAD5, 0x35DA3558, 0xED7AEDD0, 0x431743FC, - 0xF866F8CB, 0xFB94FBB1, 0x37A137D3, 0xFA1DFA40, 0xC23DC268, 0xB4F0B4CC, 0x32DE325D, 0x9CB39C71, - 0x560B56E7, 0xE372E3DA, 0x87A78760, 0x151C151B, 0xF9EFF93A, 0x63D163BF, 0x345334A9, 0x9A3E9A85, - 0xB18FB142, 0x7C337CD1, 0x8826889B, 0x3D5F3DA6, 0xA1ECA1D7, 0xE476E4DF, 0x812A8194, 0x91499101, - 0x0F810FFB, 0xEE88EEAA, 0x16EE1661, 0xD721D773, 0x97C497F5, 0xA51AA5A8, 0xFEEBFE3F, 0x6DD96DB5, - 0x78C578AE, 0xC539C56D, 0x1D991DE5, 0x76CD76A4, 0x3EAD3EDC, 0xCB31CB67, 0xB68BB647, 0xEF01EF5B, - 0x1218121E, 0x602360C5, 0x6ADD6AB0, 0x4D1F4DF6, 0xCE4ECEE9, 0xDE2DDE7C, 0x55F9559D, 0x7E487E5A, - 0x214F21B2, 0x03F2037A, 0xA065A026, 0x5E8E5E19, 0x5A785A66, 0x655C654B, 0x6258624E, 0xFD19FD45, - 0x068D06F4, 0x40E54086, 0xF298F2BE, 0x335733AC, 0x17671790, 0x057F058E, 0xE805E85E, 0x4F644F7D, - 0x89AF896A, 0x10631095, 0x74B6742F, 0x0AFE0A75, 0x5CF55C92, 0x9BB79B74, 0x2D3C2D33, 0x30A530D6, - 0x2ECE2E49, 0x49E94989, 0x46684672, 0x77447755, 0xA8E0A8D8, 0x964D9604, 0x284328BD, 0xA969A929, - 0xD929D979, 0x862E8691, 0xD1ACD187, 0xF415F44A, 0x8D598D15, 0xD6A8D682, 0xB90AB9BC, 0x429E420D, - 0xF66EF6C1, 0x2F472FB8, 0xDDDFDD06, 0x23342339, 0xCC35CC62, 0xF16AF1C4, 0xC1CFC112, 0x85DC85EB, - 0x8F228F9E, 0x71C971A1, 0x90C090F0, 0xAA9BAA53, 0x018901F1, 0x8BD48BE1, 0x4EED4E8C, 0x8EAB8E6F, - 0xAB12ABA2, 0x6FA26F3E, 0xE60DE654, 0xDB52DBF2, 0x92BB927B, 0xB702B7B6, 0x692F69CA, 0x39A939D9, - 0xD3D7D30C, 0xA761A723, 0xA21EA2AD, 0xC3B4C399, 0x6C506C44, 0x07040705, 0x04F6047F, 0x27C22746, - 0xAC16ACA7, 0xD025D076, 0x50865013, 0xDC56DCF7, 0x8455841A, 0xE109E151, 0x7ABE7A25, 0x139113EF - ); - - /** - * M-Table - * - * @var Array - * @access private - */ - var $m3 = array ( - 0xD939A9D9, 0x90176790, 0x719CB371, 0xD2A6E8D2, 0x05070405, 0x9852FD98, 0x6580A365, 0xDFE476DF, - 0x08459A08, 0x024B9202, 0xA0E080A0, 0x665A7866, 0xDDAFE4DD, 0xB06ADDB0, 0xBF63D1BF, 0x362A3836, - 0x54E60D54, 0x4320C643, 0x62CC3562, 0xBEF298BE, 0x1E12181E, 0x24EBF724, 0xD7A1ECD7, 0x77416C77, - 0xBD2843BD, 0x32BC7532, 0xD47B37D4, 0x9B88269B, 0x700DFA70, 0xF94413F9, 0xB1FB94B1, 0x5A7E485A, - 0x7A03F27A, 0xE48CD0E4, 0x47B68B47, 0x3C24303C, 0xA5E784A5, 0x416B5441, 0x06DDDF06, 0xC56023C5, - 0x45FD1945, 0xA33A5BA3, 0x68C23D68, 0x158D5915, 0x21ECF321, 0x3166AE31, 0x3E6FA23E, 0x16578216, - 0x95106395, 0x5BEF015B, 0x4DB8834D, 0x91862E91, 0xB56DD9B5, 0x1F83511F, 0x53AA9B53, 0x635D7C63, - 0x3B68A63B, 0x3FFEEB3F, 0xD630A5D6, 0x257ABE25, 0xA7AC16A7, 0x0F090C0F, 0x35F0E335, 0x23A76123, - 0xF090C0F0, 0xAFE98CAF, 0x809D3A80, 0x925CF592, 0x810C7381, 0x27312C27, 0x76D02576, 0xE7560BE7, - 0x7B92BB7B, 0xE9CE4EE9, 0xF10189F1, 0x9F1E6B9F, 0xA93453A9, 0xC4F16AC4, 0x99C3B499, 0x975BF197, - 0x8347E183, 0x6B18E66B, 0xC822BDC8, 0x0E98450E, 0x6E1FE26E, 0xC9B3F4C9, 0x2F74B62F, 0xCBF866CB, - 0xFF99CCFF, 0xEA1495EA, 0xED5803ED, 0xF7DC56F7, 0xE18BD4E1, 0x1B151C1B, 0xADA21EAD, 0x0CD3D70C, - 0x2BE2FB2B, 0x1DC8C31D, 0x195E8E19, 0xC22CB5C2, 0x8949E989, 0x12C1CF12, 0x7E95BF7E, 0x207DBA20, - 0x6411EA64, 0x840B7784, 0x6DC5396D, 0x6A89AF6A, 0xD17C33D1, 0xA171C9A1, 0xCEFF62CE, 0x37BB7137, - 0xFB0F81FB, 0x3DB5793D, 0x51E10951, 0xDC3EADDC, 0x2D3F242D, 0xA476CDA4, 0x9D55F99D, 0xEE82D8EE, - 0x8640E586, 0xAE78C5AE, 0xCD25B9CD, 0x04964D04, 0x55774455, 0x0A0E080A, 0x13508613, 0x30F7E730, - 0xD337A1D3, 0x40FA1D40, 0x3461AA34, 0x8C4EED8C, 0xB3B006B3, 0x6C54706C, 0x2A73B22A, 0x523BD252, - 0x0B9F410B, 0x8B027B8B, 0x88D8A088, 0x4FF3114F, 0x67CB3167, 0x4627C246, 0xC06727C0, 0xB4FC90B4, - 0x28382028, 0x7F04F67F, 0x78486078, 0x2EE5FF2E, 0x074C9607, 0x4B655C4B, 0xC72BB1C7, 0x6F8EAB6F, - 0x0D429E0D, 0xBBF59CBB, 0xF2DB52F2, 0xF34A1BF3, 0xA63D5FA6, 0x59A49359, 0xBCB90ABC, 0x3AF9EF3A, - 0xEF1391EF, 0xFE0885FE, 0x01914901, 0x6116EE61, 0x7CDE2D7C, 0xB2214FB2, 0x42B18F42, 0xDB723BDB, - 0xB82F47B8, 0x48BF8748, 0x2CAE6D2C, 0xE3C046E3, 0x573CD657, 0x859A3E85, 0x29A96929, 0x7D4F647D, - 0x94812A94, 0x492ECE49, 0x17C6CB17, 0xCA692FCA, 0xC3BDFCC3, 0x5CA3975C, 0x5EE8055E, 0xD0ED7AD0, - 0x87D1AC87, 0x8E057F8E, 0xBA64D5BA, 0xA8A51AA8, 0xB7264BB7, 0xB9BE0EB9, 0x6087A760, 0xF8D55AF8, - 0x22362822, 0x111B1411, 0xDE753FDE, 0x79D92979, 0xAAEE88AA, 0x332D3C33, 0x5F794C5F, 0xB6B702B6, - 0x96CAB896, 0x5835DA58, 0x9CC4B09C, 0xFC4317FC, 0x1A84551A, 0xF64D1FF6, 0x1C598A1C, 0x38B27D38, - 0xAC3357AC, 0x18CFC718, 0xF4068DF4, 0x69537469, 0x749BB774, 0xF597C4F5, 0x56AD9F56, 0xDAE372DA, - 0xD5EA7ED5, 0x4AF4154A, 0x9E8F229E, 0xA2AB12A2, 0x4E62584E, 0xE85F07E8, 0xE51D99E5, 0x39233439, - 0xC1F66EC1, 0x446C5044, 0x5D32DE5D, 0x72466872, 0x26A06526, 0x93CDBC93, 0x03DADB03, 0xC6BAF8C6, - 0xFA9EC8FA, 0x82D6A882, 0xCF6E2BCF, 0x50704050, 0xEB85DCEB, 0x750AFE75, 0x8A93328A, 0x8DDFA48D, - 0x4C29CA4C, 0x141C1014, 0x73D72173, 0xCCB4F0CC, 0x09D4D309, 0x108A5D10, 0xE2510FE2, 0x00000000, - 0x9A196F9A, 0xE01A9DE0, 0x8F94368F, 0xE6C742E6, 0xECC94AEC, 0xFDD25EFD, 0xAB7FC1AB, 0xD8A8E0D8 - ); - - /** - * The Key Schedule Array - * - * @var Array - * @access private - */ - var $K = array(); - - /** - * The Key depended S-Table 0 - * - * @var Array - * @access private - */ - var $S0 = array(); - - /** - * The Key depended S-Table 1 - * - * @var Array - * @access private - */ - var $S1 = array(); - - /** - * The Key depended S-Table 2 - * - * @var Array - * @access private - */ - var $S2 = array(); - - /** - * The Key depended S-Table 3 - * - * @var Array - * @access private - */ - var $S3 = array(); - - /** - * Holds the last used key - * - * @var Array - * @access private - */ - var $kl; - - /** - * Sets the key. - * - * Keys can be of any length. Twofish, itself, requires the use of a key that's 128, 192 or 256-bits long. - * If the key is less than 256-bits we round the length up to the closest valid key length, - * padding $key with null bytes. If the key is more than 256-bits, we trim the excess bits. - * - * If the key is not explicitly set, it'll be assumed a 128 bits key to be all null bytes. - * - * @access public - * @see Crypt_Base::setKey() - * @param String $key - */ - function setKey($key) - { - $keylength = strlen($key); - switch (true) { - case $keylength <= 16: - $key = str_pad($key, 16, "\0"); - break; - case $keylength <= 24: - $key = str_pad($key, 24, "\0"); - break; - case $keylength < 32: - $key = str_pad($key, 32, "\0"); - break; - case $keylength > 32: - $key = substr($key, 0, 32); - } - parent::setKey($key); - } - - /** - * Setup the key (expansion) - * - * @see Crypt_Base::_setupKey() - * @access private - */ - function _setupKey() - { - if (isset($this->kl['key']) && $this->key === $this->kl['key']) { - // already expanded - return; - } - $this->kl = array('key' => $this->key); - - /* Key expanding and generating the key-depended s-boxes */ - $le_longs = unpack('V*', $this->key); - $key = unpack('C*', $this->key); - $m0 = $this->m0; - $m1 = $this->m1; - $m2 = $this->m2; - $m3 = $this->m3; - $q0 = $this->q0; - $q1 = $this->q1; - - $K = $S0 = $S1 = $S2 = $S3 = array(); - - switch (strlen($this->key)) { - case 16: - list ($s7, $s6, $s5, $s4) = $this->_mdsrem($le_longs[1], $le_longs[2]); - list ($s3, $s2, $s1, $s0) = $this->_mdsrem($le_longs[3], $le_longs[4]); - for ($i = 0, $j = 1; $i < 40; $i+= 2,$j+= 2) { - $A = $m0[$q0[$q0[$i] ^ $key[ 9]] ^ $key[1]] ^ - $m1[$q0[$q1[$i] ^ $key[10]] ^ $key[2]] ^ - $m2[$q1[$q0[$i] ^ $key[11]] ^ $key[3]] ^ - $m3[$q1[$q1[$i] ^ $key[12]] ^ $key[4]]; - $B = $m0[$q0[$q0[$j] ^ $key[13]] ^ $key[5]] ^ - $m1[$q0[$q1[$j] ^ $key[14]] ^ $key[6]] ^ - $m2[$q1[$q0[$j] ^ $key[15]] ^ $key[7]] ^ - $m3[$q1[$q1[$j] ^ $key[16]] ^ $key[8]]; - $B = ($B << 8) | ($B >> 24 & 0xff); - $K[] = $A+= $B; - $K[] = (($A+= $B) << 9 | $A >> 23 & 0x1ff); - } - for ($i = 0; $i < 256; ++$i) { - $S0[$i] = $m0[$q0[$q0[$i] ^ $s4] ^ $s0]; - $S1[$i] = $m1[$q0[$q1[$i] ^ $s5] ^ $s1]; - $S2[$i] = $m2[$q1[$q0[$i] ^ $s6] ^ $s2]; - $S3[$i] = $m3[$q1[$q1[$i] ^ $s7] ^ $s3]; - } - break; - case 24: - list ($sb, $sa, $s9, $s8) = $this->_mdsrem($le_longs[1], $le_longs[2]); - list ($s7, $s6, $s5, $s4) = $this->_mdsrem($le_longs[3], $le_longs[4]); - list ($s3, $s2, $s1, $s0) = $this->_mdsrem($le_longs[5], $le_longs[6]); - for ($i = 0, $j = 1; $i < 40; $i+= 2, $j+= 2) { - $A = $m0[$q0[$q0[$q1[$i] ^ $key[17]] ^ $key[ 9]] ^ $key[1]] ^ - $m1[$q0[$q1[$q1[$i] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^ - $m2[$q1[$q0[$q0[$i] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^ - $m3[$q1[$q1[$q0[$i] ^ $key[20]] ^ $key[12]] ^ $key[4]]; - $B = $m0[$q0[$q0[$q1[$j] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^ - $m1[$q0[$q1[$q1[$j] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^ - $m2[$q1[$q0[$q0[$j] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^ - $m3[$q1[$q1[$q0[$j] ^ $key[24]] ^ $key[16]] ^ $key[8]]; - $B = ($B << 8) | ($B >> 24 & 0xff); - $K[] = $A+= $B; - $K[] = (($A+= $B) << 9 | $A >> 23 & 0x1ff); - } - for ($i = 0; $i < 256; ++$i) { - $S0[$i] = $m0[$q0[$q0[$q1[$i] ^ $s8] ^ $s4] ^ $s0]; - $S1[$i] = $m1[$q0[$q1[$q1[$i] ^ $s9] ^ $s5] ^ $s1]; - $S2[$i] = $m2[$q1[$q0[$q0[$i] ^ $sa] ^ $s6] ^ $s2]; - $S3[$i] = $m3[$q1[$q1[$q0[$i] ^ $sb] ^ $s7] ^ $s3]; - } - break; - default: // 32 - list ($sf, $se, $sd, $sc) = $this->_mdsrem($le_longs[1], $le_longs[2]); - list ($sb, $sa, $s9, $s8) = $this->_mdsrem($le_longs[3], $le_longs[4]); - list ($s7, $s6, $s5, $s4) = $this->_mdsrem($le_longs[5], $le_longs[6]); - list ($s3, $s2, $s1, $s0) = $this->_mdsrem($le_longs[7], $le_longs[8]); - for ($i = 0, $j = 1; $i < 40; $i+= 2, $j+= 2) { - $A = $m0[$q0[$q0[$q1[$q1[$i] ^ $key[25]] ^ $key[17]] ^ $key[ 9]] ^ $key[1]] ^ - $m1[$q0[$q1[$q1[$q0[$i] ^ $key[26]] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^ - $m2[$q1[$q0[$q0[$q0[$i] ^ $key[27]] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^ - $m3[$q1[$q1[$q0[$q1[$i] ^ $key[28]] ^ $key[20]] ^ $key[12]] ^ $key[4]]; - $B = $m0[$q0[$q0[$q1[$q1[$j] ^ $key[29]] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^ - $m1[$q0[$q1[$q1[$q0[$j] ^ $key[30]] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^ - $m2[$q1[$q0[$q0[$q0[$j] ^ $key[31]] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^ - $m3[$q1[$q1[$q0[$q1[$j] ^ $key[32]] ^ $key[24]] ^ $key[16]] ^ $key[8]]; - $B = ($B << 8) | ($B >> 24 & 0xff); - $K[] = $A+= $B; - $K[] = (($A+= $B) << 9 | $A >> 23 & 0x1ff); - } - for ($i = 0; $i < 256; ++$i) { - $S0[$i] = $m0[$q0[$q0[$q1[$q1[$i] ^ $sc] ^ $s8] ^ $s4] ^ $s0]; - $S1[$i] = $m1[$q0[$q1[$q1[$q0[$i] ^ $sd] ^ $s9] ^ $s5] ^ $s1]; - $S2[$i] = $m2[$q1[$q0[$q0[$q0[$i] ^ $se] ^ $sa] ^ $s6] ^ $s2]; - $S3[$i] = $m3[$q1[$q1[$q0[$q1[$i] ^ $sf] ^ $sb] ^ $s7] ^ $s3]; - } - } - - $this->K = $K; - $this->S0 = $S0; - $this->S1 = $S1; - $this->S2 = $S2; - $this->S3 = $S3; - } - - /** - * _mdsrem function using by the twofish cipher algorithm - * - * @access private - * @param String $A - * @param String $B - * @return Array - */ - function _mdsrem($A, $B) - { - // No gain by unrolling this loop. - for ($i = 0; $i < 8; ++$i) { - // Get most significant coefficient. - $t = 0xff & ($B >> 24); - - // Shift the others up. - $B = ($B << 8) | (0xff & ($A >> 24)); - $A<<= 8; - - $u = $t << 1; - - // Subtract the modular polynomial on overflow. - if ($t & 0x80) { - $u^= 0x14d; - } - - // Remove t * (a * x^2 + 1). - $B ^= $t ^ ($u << 16); - - // Form u = a*t + t/a = t*(a + 1/a). - $u^= 0x7fffffff & ($t >> 1); - - // Add the modular polynomial on underflow. - if ($t & 0x01) $u^= 0xa6 ; - - // Remove t * (a + 1/a) * (x^3 + x). - $B^= ($u << 24) | ($u << 8); - } - - return array( - 0xff & $B >> 24, - 0xff & $B >> 16, - 0xff & $B >> 8, - 0xff & $B); - } - - /** - * Encrypts a block - * - * @access private - * @param String $in - * @return String - */ - function _encryptBlock($in) - { - $S0 = $this->S0; - $S1 = $this->S1; - $S2 = $this->S2; - $S3 = $this->S3; - $K = $this->K; - - $in = unpack("V4", $in); - $R0 = $K[0] ^ $in[1]; - $R1 = $K[1] ^ $in[2]; - $R2 = $K[2] ^ $in[3]; - $R3 = $K[3] ^ $in[4]; - - $ki = 7; - while ($ki < 39) { - $t0 = $S0[ $R0 & 0xff] ^ - $S1[($R0 >> 8) & 0xff] ^ - $S2[($R0 >> 16) & 0xff] ^ - $S3[($R0 >> 24) & 0xff]; - $t1 = $S0[($R1 >> 24) & 0xff] ^ - $S1[ $R1 & 0xff] ^ - $S2[($R1 >> 8) & 0xff] ^ - $S3[($R1 >> 16) & 0xff]; - $R2^= $t0 + $t1 + $K[++$ki]; - $R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31); - $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ ($t0 + ($t1 << 1) + $K[++$ki]); - - $t0 = $S0[ $R2 & 0xff] ^ - $S1[($R2 >> 8) & 0xff] ^ - $S2[($R2 >> 16) & 0xff] ^ - $S3[($R2 >> 24) & 0xff]; - $t1 = $S0[($R3 >> 24) & 0xff] ^ - $S1[ $R3 & 0xff] ^ - $S2[($R3 >> 8) & 0xff] ^ - $S3[($R3 >> 16) & 0xff]; - $R0^= ($t0 + $t1 + $K[++$ki]); - $R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31); - $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ ($t0 + ($t1 << 1) + $K[++$ki]); - } - - // @codingStandardsIgnoreStart - return pack("V4", $K[4] ^ $R2, - $K[5] ^ $R3, - $K[6] ^ $R0, - $K[7] ^ $R1); - // @codingStandardsIgnoreEnd - } - - /** - * Decrypts a block - * - * @access private - * @param String $in - * @return String - */ - function _decryptBlock($in) - { - $S0 = $this->S0; - $S1 = $this->S1; - $S2 = $this->S2; - $S3 = $this->S3; - $K = $this->K; - - $in = unpack("V4", $in); - $R0 = $K[4] ^ $in[1]; - $R1 = $K[5] ^ $in[2]; - $R2 = $K[6] ^ $in[3]; - $R3 = $K[7] ^ $in[4]; - - $ki = 40; - while ($ki > 8) { - $t0 = $S0[$R0 & 0xff] ^ - $S1[$R0 >> 8 & 0xff] ^ - $S2[$R0 >> 16 & 0xff] ^ - $S3[$R0 >> 24 & 0xff]; - $t1 = $S0[$R1 >> 24 & 0xff] ^ - $S1[$R1 & 0xff] ^ - $S2[$R1 >> 8 & 0xff] ^ - $S3[$R1 >> 16 & 0xff]; - $R3^= $t0 + ($t1 << 1) + $K[--$ki]; - $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31; - $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ ($t0 + $t1 + $K[--$ki]); - - $t0 = $S0[$R2 & 0xff] ^ - $S1[$R2 >> 8 & 0xff] ^ - $S2[$R2 >> 16 & 0xff] ^ - $S3[$R2 >> 24 & 0xff]; - $t1 = $S0[$R3 >> 24 & 0xff] ^ - $S1[$R3 & 0xff] ^ - $S2[$R3 >> 8 & 0xff] ^ - $S3[$R3 >> 16 & 0xff]; - $R1^= $t0 + ($t1 << 1) + $K[--$ki]; - $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31; - $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ ($t0 + $t1 + $K[--$ki]); - } - - // @codingStandardsIgnoreStart - return pack("V4", $K[0] ^ $R2, - $K[1] ^ $R3, - $K[2] ^ $R0, - $K[3] ^ $R1); - // @codingStandardsIgnoreEnd - } - - /** - * Setup the performance-optimized function for de/encrypt() - * - * @see Crypt_Base::_setupInlineCrypt() - * @access private - */ - function _setupInlineCrypt() - { - $lambda_functions =& Crypt_Twofish::_getLambdaFunctions(); - - // Max. 10 Ultra-Hi-optimized inline-crypt functions. After that, we'll (still) create very fast code, but not the ultimate fast one. - $gen_hi_opt_code = (bool)( count($lambda_functions) < 10 ); - - switch (true) { - case $gen_hi_opt_code: - $code_hash = md5(str_pad("Crypt_Twofish, {$this->mode}, ", 32, "\0") . $this->key); - break; - default: - $code_hash = "Crypt_Twofish, {$this->mode}"; - } - - if (!isset($lambda_functions[$code_hash])) { - switch (true) { - case $gen_hi_opt_code: - $K = $this->K; - - $init_crypt = ' - static $S0, $S1, $S2, $S3; - if (!$S0) { - for ($i = 0; $i < 256; ++$i) { - $S0[] = (int)$self->S0[$i]; - $S1[] = (int)$self->S1[$i]; - $S2[] = (int)$self->S2[$i]; - $S3[] = (int)$self->S3[$i]; - } - } - '; - break; - default: - $K = array(); - for ($i = 0; $i < 40; ++$i) { - $K[] = '$K_' . $i; - } - - $init_crypt = ' - $S0 = $self->S0; - $S1 = $self->S1; - $S2 = $self->S2; - $S3 = $self->S3; - list(' . implode(',', $K) . ') = $self->K; - '; - } - - // Generating encrypt code: - $encrypt_block = ' - $in = unpack("V4", $in); - $R0 = '.$K[0].' ^ $in[1]; - $R1 = '.$K[1].' ^ $in[2]; - $R2 = '.$K[2].' ^ $in[3]; - $R3 = '.$K[3].' ^ $in[4]; - '; - for ($ki = 7, $i = 0; $i < 8; ++$i) { - $encrypt_block.= ' - $t0 = $S0[ $R0 & 0xff] ^ - $S1[($R0 >> 8) & 0xff] ^ - $S2[($R0 >> 16) & 0xff] ^ - $S3[($R0 >> 24) & 0xff]; - $t1 = $S0[($R1 >> 24) & 0xff] ^ - $S1[ $R1 & 0xff] ^ - $S2[($R1 >> 8) & 0xff] ^ - $S3[($R1 >> 16) & 0xff]; - $R2^= ($t0 + $t1 + '.$K[++$ki].'); - $R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31); - $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ ($t0 + ($t1 << 1) + '.$K[++$ki].'); - - $t0 = $S0[ $R2 & 0xff] ^ - $S1[($R2 >> 8) & 0xff] ^ - $S2[($R2 >> 16) & 0xff] ^ - $S3[($R2 >> 24) & 0xff]; - $t1 = $S0[($R3 >> 24) & 0xff] ^ - $S1[ $R3 & 0xff] ^ - $S2[($R3 >> 8) & 0xff] ^ - $S3[($R3 >> 16) & 0xff]; - $R0^= ($t0 + $t1 + '.$K[++$ki].'); - $R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31); - $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ ($t0 + ($t1 << 1) + '.$K[++$ki].'); - '; - } - $encrypt_block.= ' - $in = pack("V4", '.$K[4].' ^ $R2, - '.$K[5].' ^ $R3, - '.$K[6].' ^ $R0, - '.$K[7].' ^ $R1); - '; - - // Generating decrypt code: - $decrypt_block = ' - $in = unpack("V4", $in); - $R0 = '.$K[4].' ^ $in[1]; - $R1 = '.$K[5].' ^ $in[2]; - $R2 = '.$K[6].' ^ $in[3]; - $R3 = '.$K[7].' ^ $in[4]; - '; - for ($ki = 40, $i = 0; $i < 8; ++$i) { - $decrypt_block.= ' - $t0 = $S0[$R0 & 0xff] ^ - $S1[$R0 >> 8 & 0xff] ^ - $S2[$R0 >> 16 & 0xff] ^ - $S3[$R0 >> 24 & 0xff]; - $t1 = $S0[$R1 >> 24 & 0xff] ^ - $S1[$R1 & 0xff] ^ - $S2[$R1 >> 8 & 0xff] ^ - $S3[$R1 >> 16 & 0xff]; - $R3^= $t0 + ($t1 << 1) + '.$K[--$ki].'; - $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31; - $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ ($t0 + $t1 + '.$K[--$ki].'); - - $t0 = $S0[$R2 & 0xff] ^ - $S1[$R2 >> 8 & 0xff] ^ - $S2[$R2 >> 16 & 0xff] ^ - $S3[$R2 >> 24 & 0xff]; - $t1 = $S0[$R3 >> 24 & 0xff] ^ - $S1[$R3 & 0xff] ^ - $S2[$R3 >> 8 & 0xff] ^ - $S3[$R3 >> 16 & 0xff]; - $R1^= $t0 + ($t1 << 1) + '.$K[--$ki].'; - $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31; - $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ ($t0 + $t1 + '.$K[--$ki].'); - '; - } - $decrypt_block.= ' - $in = pack("V4", '.$K[0].' ^ $R2, - '.$K[1].' ^ $R3, - '.$K[2].' ^ $R0, - '.$K[3].' ^ $R1); - '; - - $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( - array( - 'init_crypt' => $init_crypt, - 'init_encrypt' => '', - 'init_decrypt' => '', - 'encrypt_block' => $encrypt_block, - 'decrypt_block' => $decrypt_block - ) - ); - } - $this->inline_crypt = $lambda_functions[$code_hash]; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/ANSI.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/ANSI.php deleted file mode 100755 index 3ff1b7d4..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/ANSI.php +++ /dev/null @@ -1,559 +0,0 @@ - - * @copyright 2012 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Pure-PHP ANSI Decoder - * - * @package File_ANSI - * @author Jim Wigginton - * @access public - */ -class File_ANSI -{ - /** - * Max Width - * - * @var Integer - * @access private - */ - var $max_x; - - /** - * Max Height - * - * @var Integer - * @access private - */ - var $max_y; - - /** - * Max History - * - * @var Integer - * @access private - */ - var $max_history; - - /** - * History - * - * @var Array - * @access private - */ - var $history; - - /** - * History Attributes - * - * @var Array - * @access private - */ - var $history_attrs; - - /** - * Current Column - * - * @var Integer - * @access private - */ - var $x; - - /** - * Current Row - * - * @var Integer - * @access private - */ - var $y; - - /** - * Old Column - * - * @var Integer - * @access private - */ - var $old_x; - - /** - * Old Row - * - * @var Integer - * @access private - */ - var $old_y; - - /** - * An empty attribute row - * - * @var Array - * @access private - */ - var $attr_row; - - /** - * The current screen text - * - * @var Array - * @access private - */ - var $screen; - - /** - * The current screen attributes - * - * @var Array - * @access private - */ - var $attrs; - - /** - * The current foreground color - * - * @var String - * @access private - */ - var $foreground; - - /** - * The current background color - * - * @var String - * @access private - */ - var $background; - - /** - * Bold flag - * - * @var Boolean - * @access private - */ - var $bold; - - /** - * Underline flag - * - * @var Boolean - * @access private - */ - var $underline; - - /** - * Blink flag - * - * @var Boolean - * @access private - */ - var $blink; - - /** - * Reverse flag - * - * @var Boolean - * @access private - */ - var $reverse; - - /** - * Color flag - * - * @var Boolean - * @access private - */ - var $color; - - /** - * Current ANSI code - * - * @var String - * @access private - */ - var $ansi; - - /** - * Default Constructor. - * - * @return File_ANSI - * @access public - */ - function File_ANSI() - { - $this->setHistory(200); - $this->setDimensions(80, 24); - } - - /** - * Set terminal width and height - * - * Resets the screen as well - * - * @param Integer $x - * @param Integer $y - * @access public - */ - function setDimensions($x, $y) - { - $this->max_x = $x - 1; - $this->max_y = $y - 1; - $this->x = $this->y = 0; - $this->history = $this->history_attrs = array(); - $this->attr_row = array_fill(0, $this->max_x + 1, ''); - $this->screen = array_fill(0, $this->max_y + 1, ''); - $this->attrs = array_fill(0, $this->max_y + 1, $this->attr_row); - $this->foreground = 'white'; - $this->background = 'black'; - $this->bold = false; - $this->underline = false; - $this->blink = false; - $this->reverse = false; - $this->color = false; - - $this->ansi = ''; - } - - /** - * Set the number of lines that should be logged past the terminal height - * - * @param Integer $x - * @param Integer $y - * @access public - */ - function setHistory($history) - { - $this->max_history = $history; - } - - /** - * Load a string - * - * @param String $source - * @access public - */ - function loadString($source) - { - $this->setDimensions($this->max_x + 1, $this->max_y + 1); - $this->appendString($source); - } - - /** - * Appdend a string - * - * @param String $source - * @access public - */ - function appendString($source) - { - for ($i = 0; $i < strlen($source); $i++) { - if (strlen($this->ansi)) { - $this->ansi.= $source[$i]; - $chr = ord($source[$i]); - // http://en.wikipedia.org/wiki/ANSI_escape_code#Sequence_elements - // single character CSI's not currently supported - switch (true) { - case $this->ansi == "\x1B=": - $this->ansi = ''; - continue 2; - case strlen($this->ansi) == 2 && $chr >= 64 && $chr <= 95 && $chr != ord('['): - case strlen($this->ansi) > 2 && $chr >= 64 && $chr <= 126: - break; - default: - continue 2; - } - // http://ascii-table.com/ansi-escape-sequences-vt-100.php - switch ($this->ansi) { - case "\x1B[H": // Move cursor to upper left corner - $this->old_x = $this->x; - $this->old_y = $this->y; - $this->x = $this->y = 0; - break; - case "\x1B[J": // Clear screen from cursor down - $this->history = array_merge($this->history, array_slice(array_splice($this->screen, $this->y + 1), 0, $this->old_y)); - $this->screen = array_merge($this->screen, array_fill($this->y, $this->max_y, '')); - - $this->history_attrs = array_merge($this->history_attrs, array_slice(array_splice($this->attrs, $this->y + 1), 0, $this->old_y)); - $this->attrs = array_merge($this->attrs, array_fill($this->y, $this->max_y, $this->attr_row)); - - if (count($this->history) == $this->max_history) { - array_shift($this->history); - array_shift($this->history_attrs); - } - case "\x1B[K": // Clear screen from cursor right - $this->screen[$this->y] = substr($this->screen[$this->y], 0, $this->x); - - array_splice($this->attrs[$this->y], $this->x + 1); - break; - case "\x1B[2K": // Clear entire line - $this->screen[$this->y] = str_repeat(' ', $this->x); - $this->attrs[$this->y] = $this->attr_row; - break; - case "\x1B[?1h": // set cursor key to application - case "\x1B[?25h": // show the cursor - break; - case "\x1BE": // Move to next line - $this->_newLine(); - $this->x = 0; - break; - default: - switch (true) { - case preg_match('#\x1B\[(\d+);(\d+)H#', $this->ansi, $match): // Move cursor to screen location v,h - $this->old_x = $this->x; - $this->old_y = $this->y; - $this->x = $match[2] - 1; - $this->y = $match[1] - 1; - break; - case preg_match('#\x1B\[(\d+)C#', $this->ansi, $match): // Move cursor right n lines - $this->old_x = $this->x; - $x = $match[1] - 1; - break; - case preg_match('#\x1B\[(\d+);(\d+)r#', $this->ansi, $match): // Set top and bottom lines of a window - break; - case preg_match('#\x1B\[(\d*(?:;\d*)*)m#', $this->ansi, $match): // character attributes - $mods = explode(';', $match[1]); - foreach ($mods as $mod) { - switch ($mod) { - case 0: // Turn off character attributes - $this->attrs[$this->y][$this->x] = ''; - - if ($this->bold) $this->attrs[$this->y][$this->x].= '
'; - if ($this->underline) $this->attrs[$this->y][$this->x].= ''; - if ($this->blink) $this->attrs[$this->y][$this->x].= ''; - if ($this->color) $this->attrs[$this->y][$this->x].= ''; - - if ($this->reverse) { - $temp = $this->background; - $this->background = $this->foreground; - $this->foreground = $temp; - } - - $this->bold = $this->underline = $this->blink = $this->color = $this->reverse = false; - break; - case 1: // Turn bold mode on - if (!$this->bold) { - $this->attrs[$this->y][$this->x] = ''; - $this->bold = true; - } - break; - case 4: // Turn underline mode on - if (!$this->underline) { - $this->attrs[$this->y][$this->x] = ''; - $this->underline = true; - } - break; - case 5: // Turn blinking mode on - if (!$this->blink) { - $this->attrs[$this->y][$this->x] = ''; - $this->blink = true; - } - break; - case 7: // Turn reverse video on - $this->reverse = !$this->reverse; - $temp = $this->background; - $this->background = $this->foreground; - $this->foreground = $temp; - $this->attrs[$this->y][$this->x] = ''; - if ($this->color) { - $this->attrs[$this->y][$this->x] = '' . $this->attrs[$this->y][$this->x]; - } - $this->color = true; - break; - default: // set colors - //$front = $this->reverse ? &$this->background : &$this->foreground; - $front = &$this->{ $this->reverse ? 'background' : 'foreground' }; - //$back = $this->reverse ? &$this->foreground : &$this->background; - $back = &$this->{ $this->reverse ? 'foreground' : 'background' }; - switch ($mod) { - case 30: $front = 'black'; break; - case 31: $front = 'red'; break; - case 32: $front = 'green'; break; - case 33: $front = 'yellow'; break; - case 34: $front = 'blue'; break; - case 35: $front = 'magenta'; break; - case 36: $front = 'cyan'; break; - case 37: $front = 'white'; break; - - case 40: $back = 'black'; break; - case 41: $back = 'red'; break; - case 42: $back = 'green'; break; - case 43: $back = 'yellow'; break; - case 44: $back = 'blue'; break; - case 45: $back = 'magenta'; break; - case 46: $back = 'cyan'; break; - case 47: $back = 'white'; break; - - default: - user_error('Unsupported attribute: ' . $mod); - $this->ansi = ''; - break 2; - } - - unset($temp); - $this->attrs[$this->y][$this->x] = ''; - if ($this->color) { - $this->attrs[$this->y][$this->x] = '' . $this->attrs[$this->y][$this->x]; - } - $this->color = true; - } - } - break; - default: - user_error("{$this->ansi} unsupported\r\n"); - } - } - $this->ansi = ''; - continue; - } - - switch ($source[$i]) { - case "\r": - $this->x = 0; - break; - case "\n": - $this->_newLine(); - break; - case "\x0F": // shift - break; - case "\x1B": // start ANSI escape code - $this->ansi.= "\x1B"; - break; - default: - $this->screen[$this->y] = substr_replace( - $this->screen[$this->y], - $source[$i], - $this->x, - 1 - ); - - if ($this->x > $this->max_x) { - $this->x = 0; - $this->y++; - } else { - $this->x++; - } - } - } - } - - /** - * Add a new line - * - * Also update the $this->screen and $this->history buffers - * - * @access private - */ - function _newLine() - { - //if ($this->y < $this->max_y) { - // $this->y++; - //} - - while ($this->y >= $this->max_y) { - $this->history = array_merge($this->history, array(array_shift($this->screen))); - $this->screen[] = ''; - - $this->history_attrs = array_merge($this->history_attrs, array(array_shift($this->attrs))); - $this->attrs[] = $this->attr_row; - - if (count($this->history) >= $this->max_history) { - array_shift($this->history); - array_shift($this->history_attrs); - } - - $this->y--; - } - $this->y++; - } - - /** - * Returns the current screen without preformating - * - * @access private - * @return String - */ - function _getScreen() - { - $output = ''; - for ($i = 0; $i <= $this->max_y; $i++) { - for ($j = 0; $j <= $this->max_x + 1; $j++) { - if (isset($this->attrs[$i][$j])) { - $output.= $this->attrs[$i][$j]; - } - if (isset($this->screen[$i][$j])) { - $output.= htmlspecialchars($this->screen[$i][$j]); - } - } - $output.= "\r\n"; - } - return rtrim($output); - } - - /** - * Returns the current screen - * - * @access public - * @return String - */ - function getScreen() - { - return '
' . $this->_getScreen() . '
'; - } - - /** - * Returns the current screen and the x previous lines - * - * @access public - * @return String - */ - function getHistory() - { - $scrollback = ''; - for ($i = 0; $i < count($this->history); $i++) { - for ($j = 0; $j <= $this->max_x + 1; $j++) { - if (isset($this->history_attrs[$i][$j])) { - $scrollback.= $this->history_attrs[$i][$j]; - } - if (isset($this->history[$i][$j])) { - $scrollback.= htmlspecialchars($this->history[$i][$j]); - } - } - $scrollback.= "\r\n"; - } - $scrollback.= $this->_getScreen(); - - return '
' . $scrollback . '
'; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/ASN1.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/ASN1.php deleted file mode 100755 index 1d66793a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/ASN1.php +++ /dev/null @@ -1,1358 +0,0 @@ - - * @copyright 2012 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/**#@+ - * Tag Classes - * - * @access private - * @link http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=12 - */ -define('FILE_ASN1_CLASS_UNIVERSAL', 0); -define('FILE_ASN1_CLASS_APPLICATION', 1); -define('FILE_ASN1_CLASS_CONTEXT_SPECIFIC', 2); -define('FILE_ASN1_CLASS_PRIVATE', 3); -/**#@-*/ - -/**#@+ - * Tag Classes - * - * @access private - * @link http://www.obj-sys.com/asn1tutorial/node124.html - */ -define('FILE_ASN1_TYPE_BOOLEAN', 1); -define('FILE_ASN1_TYPE_INTEGER', 2); -define('FILE_ASN1_TYPE_BIT_STRING', 3); -define('FILE_ASN1_TYPE_OCTET_STRING', 4); -define('FILE_ASN1_TYPE_NULL', 5); -define('FILE_ASN1_TYPE_OBJECT_IDENTIFIER', 6); -//define('FILE_ASN1_TYPE_OBJECT_DESCRIPTOR', 7); -//define('FILE_ASN1_TYPE_INSTANCE_OF', 8); // EXTERNAL -define('FILE_ASN1_TYPE_REAL', 9); -define('FILE_ASN1_TYPE_ENUMERATED', 10); -//define('FILE_ASN1_TYPE_EMBEDDED', 11); -define('FILE_ASN1_TYPE_UTF8_STRING', 12); -//define('FILE_ASN1_TYPE_RELATIVE_OID', 13); -define('FILE_ASN1_TYPE_SEQUENCE', 16); // SEQUENCE OF -define('FILE_ASN1_TYPE_SET', 17); // SET OF -/**#@-*/ -/**#@+ - * More Tag Classes - * - * @access private - * @link http://www.obj-sys.com/asn1tutorial/node10.html - */ -define('FILE_ASN1_TYPE_NUMERIC_STRING', 18); -define('FILE_ASN1_TYPE_PRINTABLE_STRING', 19); -define('FILE_ASN1_TYPE_TELETEX_STRING', 20); // T61String -define('FILE_ASN1_TYPE_VIDEOTEX_STRING', 21); -define('FILE_ASN1_TYPE_IA5_STRING', 22); -define('FILE_ASN1_TYPE_UTC_TIME', 23); -define('FILE_ASN1_TYPE_GENERALIZED_TIME', 24); -define('FILE_ASN1_TYPE_GRAPHIC_STRING', 25); -define('FILE_ASN1_TYPE_VISIBLE_STRING', 26); // ISO646String -define('FILE_ASN1_TYPE_GENERAL_STRING', 27); -define('FILE_ASN1_TYPE_UNIVERSAL_STRING', 28); -//define('FILE_ASN1_TYPE_CHARACTER_STRING', 29); -define('FILE_ASN1_TYPE_BMP_STRING', 30); -/**#@-*/ - -/**#@+ - * Tag Aliases - * - * These tags are kinda place holders for other tags. - * - * @access private - */ -define('FILE_ASN1_TYPE_CHOICE', -1); -define('FILE_ASN1_TYPE_ANY', -2); -/**#@-*/ - -/** - * ASN.1 Element - * - * Bypass normal encoding rules in File_ASN1::encodeDER() - * - * @package File_ASN1 - * @author Jim Wigginton - * @access public - */ -class File_ASN1_Element -{ - /** - * Raw element value - * - * @var String - * @access private - */ - var $element; - - /** - * Constructor - * - * @param String $encoded - * @return File_ASN1_Element - * @access public - */ - function File_ASN1_Element($encoded) - { - $this->element = $encoded; - } -} - -/** - * Pure-PHP ASN.1 Parser - * - * @package File_ASN1 - * @author Jim Wigginton - * @access public - */ -class File_ASN1 -{ - /** - * ASN.1 object identifier - * - * @var Array - * @access private - * @link http://en.wikipedia.org/wiki/Object_identifier - */ - var $oids = array(); - - /** - * Default date format - * - * @var String - * @access private - * @link http://php.net/class.datetime - */ - var $format = 'D, d M Y H:i:s O'; - - /** - * Default date format - * - * @var Array - * @access private - * @see File_ASN1::setTimeFormat() - * @see File_ASN1::asn1map() - * @link http://php.net/class.datetime - */ - var $encoded; - - /** - * Filters - * - * If the mapping type is FILE_ASN1_TYPE_ANY what do we actually encode it as? - * - * @var Array - * @access private - * @see File_ASN1::_encode_der() - */ - var $filters; - - /** - * Type mapping table for the ANY type. - * - * Structured or unknown types are mapped to a FILE_ASN1_Element. - * Unambiguous types get the direct mapping (int/real/bool). - * Others are mapped as a choice, with an extra indexing level. - * - * @var Array - * @access public - */ - var $ANYmap = array( - FILE_ASN1_TYPE_BOOLEAN => true, - FILE_ASN1_TYPE_INTEGER => true, - FILE_ASN1_TYPE_BIT_STRING => 'bitString', - FILE_ASN1_TYPE_OCTET_STRING => 'octetString', - FILE_ASN1_TYPE_NULL => 'null', - FILE_ASN1_TYPE_OBJECT_IDENTIFIER => 'objectIdentifier', - FILE_ASN1_TYPE_REAL => true, - FILE_ASN1_TYPE_ENUMERATED => 'enumerated', - FILE_ASN1_TYPE_UTF8_STRING => 'utf8String', - FILE_ASN1_TYPE_NUMERIC_STRING => 'numericString', - FILE_ASN1_TYPE_PRINTABLE_STRING => 'printableString', - FILE_ASN1_TYPE_TELETEX_STRING => 'teletexString', - FILE_ASN1_TYPE_VIDEOTEX_STRING => 'videotexString', - FILE_ASN1_TYPE_IA5_STRING => 'ia5String', - FILE_ASN1_TYPE_UTC_TIME => 'utcTime', - FILE_ASN1_TYPE_GENERALIZED_TIME => 'generalTime', - FILE_ASN1_TYPE_GRAPHIC_STRING => 'graphicString', - FILE_ASN1_TYPE_VISIBLE_STRING => 'visibleString', - FILE_ASN1_TYPE_GENERAL_STRING => 'generalString', - FILE_ASN1_TYPE_UNIVERSAL_STRING => 'universalString', - //FILE_ASN1_TYPE_CHARACTER_STRING => 'characterString', - FILE_ASN1_TYPE_BMP_STRING => 'bmpString' - ); - - /** - * String type to character size mapping table. - * - * Non-convertable types are absent from this table. - * size == 0 indicates variable length encoding. - * - * @var Array - * @access public - */ - var $stringTypeSize = array( - FILE_ASN1_TYPE_UTF8_STRING => 0, - FILE_ASN1_TYPE_BMP_STRING => 2, - FILE_ASN1_TYPE_UNIVERSAL_STRING => 4, - FILE_ASN1_TYPE_PRINTABLE_STRING => 1, - FILE_ASN1_TYPE_TELETEX_STRING => 1, - FILE_ASN1_TYPE_IA5_STRING => 1, - FILE_ASN1_TYPE_VISIBLE_STRING => 1, - ); - - /** - * Default Constructor. - * - * @access public - */ - function File_ASN1() - { - static $static_init = null; - if (!$static_init) { - $static_init = true; - if (!class_exists('Math_BigInteger')) { - include_once 'Math/BigInteger.php'; - } - } - } - - /** - * Parse BER-encoding - * - * Serves a similar purpose to openssl's asn1parse - * - * @param String $encoded - * @return Array - * @access public - */ - function decodeBER($encoded) - { - if (is_object($encoded) && strtolower(get_class($encoded)) == 'file_asn1_element') { - $encoded = $encoded->element; - } - - $this->encoded = $encoded; - // encapsulate in an array for BC with the old decodeBER - return array($this->_decode_ber($encoded)); - } - - /** - * Parse BER-encoding (Helper function) - * - * Sometimes we want to get the BER encoding of a particular tag. $start lets us do that without having to reencode. - * $encoded is passed by reference for the recursive calls done for FILE_ASN1_TYPE_BIT_STRING and - * FILE_ASN1_TYPE_OCTET_STRING. In those cases, the indefinite length is used. - * - * @param String $encoded - * @param Integer $start - * @return Array - * @access private - */ - function _decode_ber($encoded, $start = 0) - { - $current = array('start' => $start); - - $type = ord($this->_string_shift($encoded)); - $start++; - - $constructed = ($type >> 5) & 1; - - $tag = $type & 0x1F; - if ($tag == 0x1F) { - $tag = 0; - // process septets (since the eighth bit is ignored, it's not an octet) - do { - $loop = ord($encoded[0]) >> 7; - $tag <<= 7; - $tag |= ord($this->_string_shift($encoded)) & 0x7F; - $start++; - } while ( $loop ); - } - - // Length, as discussed in paragraph 8.1.3 of X.690-0207.pdf#page=13 - $length = ord($this->_string_shift($encoded)); - $start++; - if ( $length == 0x80 ) { // indefinite length - // "[A sender shall] use the indefinite form (see 8.1.3.6) if the encoding is constructed and is not all - // immediately available." -- paragraph 8.1.3.2.c - $length = strlen($encoded); - } elseif ( $length & 0x80 ) { // definite length, long form - // technically, the long form of the length can be represented by up to 126 octets (bytes), but we'll only - // support it up to four. - $length&= 0x7F; - $temp = $this->_string_shift($encoded, $length); - // tags of indefinte length don't really have a header length; this length includes the tag - $current+= array('headerlength' => $length + 2); - $start+= $length; - extract(unpack('Nlength', substr(str_pad($temp, 4, chr(0), STR_PAD_LEFT), -4))); - } else { - $current+= array('headerlength' => 2); - } - - $content = $this->_string_shift($encoded, $length); - - // at this point $length can be overwritten. it's only accurate for definite length things as is - - /* Class is UNIVERSAL, APPLICATION, PRIVATE, or CONTEXT-SPECIFIC. The UNIVERSAL class is restricted to the ASN.1 - built-in types. It defines an application-independent data type that must be distinguishable from all other - data types. The other three classes are user defined. The APPLICATION class distinguishes data types that - have a wide, scattered use within a particular presentation context. PRIVATE distinguishes data types within - a particular organization or country. CONTEXT-SPECIFIC distinguishes members of a sequence or set, the - alternatives of a CHOICE, or universally tagged set members. Only the class number appears in braces for this - data type; the term CONTEXT-SPECIFIC does not appear. - - -- http://www.obj-sys.com/asn1tutorial/node12.html */ - $class = ($type >> 6) & 3; - switch ($class) { - case FILE_ASN1_CLASS_APPLICATION: - case FILE_ASN1_CLASS_PRIVATE: - case FILE_ASN1_CLASS_CONTEXT_SPECIFIC: - if (!$constructed) { - return array( - 'type' => $class, - 'constant' => $tag, - 'content' => $content, - 'length' => $length + $start - $current['start'] - ); - } - - $newcontent = array(); - if (strlen($content)) { - $newcontent = $this->_decode_ber($content, $start); - $length = $newcontent['length']; - if (substr($content, $length, 2) == "\0\0") { - $length+= 2; - } - $start+= $length; - $newcontent = array($newcontent); - } - - return array( - 'type' => $class, - 'constant' => $tag, - // the array encapsulation is for BC with the old format - 'content' => $newcontent, - // the only time when $content['headerlength'] isn't defined is when the length is indefinite. - // the absence of $content['headerlength'] is how we know if something is indefinite or not. - // technically, it could be defined to be 2 and then another indicator could be used but whatever. - 'length' => $start - $current['start'] - ) + $current; - } - - $current+= array('type' => $tag); - - // decode UNIVERSAL tags - switch ($tag) { - case FILE_ASN1_TYPE_BOOLEAN: - // "The contents octets shall consist of a single octet." -- paragraph 8.2.1 - //if (strlen($content) != 1) { - // return false; - //} - $current['content'] = (bool) ord($content[0]); - break; - case FILE_ASN1_TYPE_INTEGER: - case FILE_ASN1_TYPE_ENUMERATED: - $current['content'] = new Math_BigInteger($content, -256); - break; - case FILE_ASN1_TYPE_REAL: // not currently supported - return false; - case FILE_ASN1_TYPE_BIT_STRING: - // The initial octet shall encode, as an unsigned binary integer with bit 1 as the least significant bit, - // the number of unused bits in the final subsequent octet. The number shall be in the range zero to - // seven. - if (!$constructed) { - $current['content'] = $content; - } else { - $temp = $this->_decode_ber($content, $start); - $length-= strlen($content); - $last = count($temp) - 1; - for ($i = 0; $i < $last; $i++) { - // all subtags should be bit strings - //if ($temp[$i]['type'] != FILE_ASN1_TYPE_BIT_STRING) { - // return false; - //} - $current['content'].= substr($temp[$i]['content'], 1); - } - // all subtags should be bit strings - //if ($temp[$last]['type'] != FILE_ASN1_TYPE_BIT_STRING) { - // return false; - //} - $current['content'] = $temp[$last]['content'][0] . $current['content'] . substr($temp[$i]['content'], 1); - } - break; - case FILE_ASN1_TYPE_OCTET_STRING: - if (!$constructed) { - $current['content'] = $content; - } else { - $current['content'] = ''; - $length = 0; - while (substr($content, 0, 2) != "\0\0") { - $temp = $this->_decode_ber($content, $length + $start); - $this->_string_shift($content, $temp['length']); - // all subtags should be octet strings - //if ($temp['type'] != FILE_ASN1_TYPE_OCTET_STRING) { - // return false; - //} - $current['content'].= $temp['content']; - $length+= $temp['length']; - } - if (substr($content, 0, 2) == "\0\0") { - $length+= 2; // +2 for the EOC - } - } - break; - case FILE_ASN1_TYPE_NULL: - // "The contents octets shall not contain any octets." -- paragraph 8.8.2 - //if (strlen($content)) { - // return false; - //} - break; - case FILE_ASN1_TYPE_SEQUENCE: - case FILE_ASN1_TYPE_SET: - $offset = 0; - $current['content'] = array(); - while (strlen($content)) { - // if indefinite length construction was used and we have an end-of-content string next - // see paragraphs 8.1.1.3, 8.1.3.2, 8.1.3.6, 8.1.5, and (for an example) 8.6.4.2 - if (!isset($current['headerlength']) && substr($content, 0, 2) == "\0\0") { - $length = $offset + 2; // +2 for the EOC - break 2; - } - $temp = $this->_decode_ber($content, $start + $offset); - $this->_string_shift($content, $temp['length']); - $current['content'][] = $temp; - $offset+= $temp['length']; - } - break; - case FILE_ASN1_TYPE_OBJECT_IDENTIFIER: - $temp = ord($this->_string_shift($content)); - $current['content'] = sprintf('%d.%d', floor($temp / 40), $temp % 40); - $valuen = 0; - // process septets - while (strlen($content)) { - $temp = ord($this->_string_shift($content)); - $valuen <<= 7; - $valuen |= $temp & 0x7F; - if (~$temp & 0x80) { - $current['content'].= ".$valuen"; - $valuen = 0; - } - } - // the eighth bit of the last byte should not be 1 - //if ($temp >> 7) { - // return false; - //} - break; - /* Each character string type shall be encoded as if it had been declared: - [UNIVERSAL x] IMPLICIT OCTET STRING - - -- X.690-0207.pdf#page=23 (paragraph 8.21.3) - - Per that, we're not going to do any validation. If there are any illegal characters in the string, - we don't really care */ - case FILE_ASN1_TYPE_NUMERIC_STRING: - // 0,1,2,3,4,5,6,7,8,9, and space - case FILE_ASN1_TYPE_PRINTABLE_STRING: - // Upper and lower case letters, digits, space, apostrophe, left/right parenthesis, plus sign, comma, - // hyphen, full stop, solidus, colon, equal sign, question mark - case FILE_ASN1_TYPE_TELETEX_STRING: - // The Teletex character set in CCITT's T61, space, and delete - // see http://en.wikipedia.org/wiki/Teletex#Character_sets - case FILE_ASN1_TYPE_VIDEOTEX_STRING: - // The Videotex character set in CCITT's T.100 and T.101, space, and delete - case FILE_ASN1_TYPE_VISIBLE_STRING: - // Printing character sets of international ASCII, and space - case FILE_ASN1_TYPE_IA5_STRING: - // International Alphabet 5 (International ASCII) - case FILE_ASN1_TYPE_GRAPHIC_STRING: - // All registered G sets, and space - case FILE_ASN1_TYPE_GENERAL_STRING: - // All registered C and G sets, space and delete - case FILE_ASN1_TYPE_UTF8_STRING: - // ???? - case FILE_ASN1_TYPE_BMP_STRING: - $current['content'] = $content; - break; - case FILE_ASN1_TYPE_UTC_TIME: - case FILE_ASN1_TYPE_GENERALIZED_TIME: - $current['content'] = $this->_decodeTime($content, $tag); - default: - } - - $start+= $length; - - // ie. length is the length of the full TLV encoding - it's not just the length of the value - return $current + array('length' => $start - $current['start']); - } - - /** - * ASN.1 Map - * - * Provides an ASN.1 semantic mapping ($mapping) from a parsed BER-encoding to a human readable format. - * - * "Special" mappings may be applied on a per tag-name basis via $special. - * - * @param Array $decoded - * @param Array $mapping - * @param Array $special - * @return Array - * @access public - */ - function asn1map($decoded, $mapping, $special = array()) - { - if (isset($mapping['explicit']) && is_array($decoded['content'])) { - $decoded = $decoded['content'][0]; - } - - switch (true) { - case $mapping['type'] == FILE_ASN1_TYPE_ANY: - $intype = $decoded['type']; - if (isset($decoded['constant']) || !isset($this->ANYmap[$intype]) || ($this->encoded[$decoded['start']] & 0x20)) { - return new File_ASN1_Element(substr($this->encoded, $decoded['start'], $decoded['length'])); - } - $inmap = $this->ANYmap[$intype]; - if (is_string($inmap)) { - return array($inmap => $this->asn1map($decoded, array('type' => $intype) + $mapping, $special)); - } - break; - case $mapping['type'] == FILE_ASN1_TYPE_CHOICE: - foreach ($mapping['children'] as $key => $option) { - switch (true) { - case isset($option['constant']) && $option['constant'] == $decoded['constant']: - case !isset($option['constant']) && $option['type'] == $decoded['type']: - $value = $this->asn1map($decoded, $option, $special); - break; - case !isset($option['constant']) && $option['type'] == FILE_ASN1_TYPE_CHOICE: - $v = $this->asn1map($decoded, $option, $special); - if (isset($v)) { - $value = $v; - } - } - if (isset($value)) { - if (isset($special[$key])) { - $value = call_user_func($special[$key], $value); - } - return array($key => $value); - } - } - return null; - case isset($mapping['implicit']): - case isset($mapping['explicit']): - case $decoded['type'] == $mapping['type']: - break; - default: - // if $decoded['type'] and $mapping['type'] are both strings, but different types of strings, - // let it through - switch (true) { - case $decoded['type'] < 18: // FILE_ASN1_TYPE_NUMERIC_STRING == 18 - case $decoded['type'] > 30: // FILE_ASN1_TYPE_BMP_STRING == 30 - case $mapping['type'] < 18: - case $mapping['type'] > 30: - return null; - } - } - - if (isset($mapping['implicit'])) { - $decoded['type'] = $mapping['type']; - } - - switch ($decoded['type']) { - case FILE_ASN1_TYPE_SEQUENCE: - $map = array(); - - // ignore the min and max - if (isset($mapping['min']) && isset($mapping['max'])) { - $child = $mapping['children']; - foreach ($decoded['content'] as $content) { - if (($map[] = $this->asn1map($content, $child, $special)) === null) { - return null; - } - } - - return $map; - } - - $n = count($decoded['content']); - $i = 0; - - foreach ($mapping['children'] as $key => $child) { - $maymatch = $i < $n; // Match only existing input. - if ($maymatch) { - $temp = $decoded['content'][$i]; - - if ($child['type'] != FILE_ASN1_TYPE_CHOICE) { - // Get the mapping and input class & constant. - $childClass = $tempClass = FILE_ASN1_CLASS_UNIVERSAL; - $constant = null; - if (isset($temp['constant'])) { - $tempClass = isset($temp['class']) ? $temp['class'] : FILE_ASN1_CLASS_CONTEXT_SPECIFIC; - } - if (isset($child['class'])) { - $childClass = $child['class']; - $constant = $child['cast']; - } elseif (isset($child['constant'])) { - $childClass = FILE_ASN1_CLASS_CONTEXT_SPECIFIC; - $constant = $child['constant']; - } - - if (isset($constant) && isset($temp['constant'])) { - // Can only match if constants and class match. - $maymatch = $constant == $temp['constant'] && $childClass == $tempClass; - } else { - // Can only match if no constant expected and type matches or is generic. - $maymatch = !isset($child['constant']) && array_search($child['type'], array($temp['type'], FILE_ASN1_TYPE_ANY, FILE_ASN1_TYPE_CHOICE)) !== false; - } - } - } - - if ($maymatch) { - // Attempt submapping. - $candidate = $this->asn1map($temp, $child, $special); - $maymatch = $candidate !== null; - } - - if ($maymatch) { - // Got the match: use it. - if (isset($special[$key])) { - $candidate = call_user_func($special[$key], $candidate); - } - $map[$key] = $candidate; - $i++; - } elseif (isset($child['default'])) { - $map[$key] = $child['default']; // Use default. - } elseif (!isset($child['optional'])) { - return null; // Syntax error. - } - } - - // Fail mapping if all input items have not been consumed. - return $i < $n? null: $map; - - // the main diff between sets and sequences is the encapsulation of the foreach in another for loop - case FILE_ASN1_TYPE_SET: - $map = array(); - - // ignore the min and max - if (isset($mapping['min']) && isset($mapping['max'])) { - $child = $mapping['children']; - foreach ($decoded['content'] as $content) { - if (($map[] = $this->asn1map($content, $child, $special)) === null) { - return null; - } - } - - return $map; - } - - for ($i = 0; $i < count($decoded['content']); $i++) { - $temp = $decoded['content'][$i]; - $tempClass = FILE_ASN1_CLASS_UNIVERSAL; - if (isset($temp['constant'])) { - $tempClass = isset($temp['class']) ? $temp['class'] : FILE_ASN1_CLASS_CONTEXT_SPECIFIC; - } - - foreach ($mapping['children'] as $key => $child) { - if (isset($map[$key])) { - continue; - } - $maymatch = true; - if ($child['type'] != FILE_ASN1_TYPE_CHOICE) { - $childClass = FILE_ASN1_CLASS_UNIVERSAL; - $constant = null; - if (isset($child['class'])) { - $childClass = $child['class']; - $constant = $child['cast']; - } elseif (isset($child['constant'])) { - $childClass = FILE_ASN1_CLASS_CONTEXT_SPECIFIC; - $constant = $child['constant']; - } - - if (isset($constant) && isset($temp['constant'])) { - // Can only match if constants and class match. - $maymatch = $constant == $temp['constant'] && $childClass == $tempClass; - } else { - // Can only match if no constant expected and type matches or is generic. - $maymatch = !isset($child['constant']) && array_search($child['type'], array($temp['type'], FILE_ASN1_TYPE_ANY, FILE_ASN1_TYPE_CHOICE)) !== false; - } - } - - if ($maymatch) { - // Attempt submapping. - $candidate = $this->asn1map($temp, $child, $special); - $maymatch = $candidate !== null; - } - - if (!$maymatch) { - break; - } - - // Got the match: use it. - if (isset($special[$key])) { - $candidate = call_user_func($special[$key], $candidate); - } - $map[$key] = $candidate; - break; - } - } - - foreach ($mapping['children'] as $key => $child) { - if (!isset($map[$key])) { - if (isset($child['default'])) { - $map[$key] = $child['default']; - } elseif (!isset($child['optional'])) { - return null; - } - } - } - return $map; - case FILE_ASN1_TYPE_OBJECT_IDENTIFIER: - return isset($this->oids[$decoded['content']]) ? $this->oids[$decoded['content']] : $decoded['content']; - case FILE_ASN1_TYPE_UTC_TIME: - case FILE_ASN1_TYPE_GENERALIZED_TIME: - if (isset($mapping['implicit'])) { - $decoded['content'] = $this->_decodeTime($decoded['content'], $decoded['type']); - } - return @date($this->format, $decoded['content']); - case FILE_ASN1_TYPE_BIT_STRING: - if (isset($mapping['mapping'])) { - $offset = ord($decoded['content'][0]); - $size = (strlen($decoded['content']) - 1) * 8 - $offset; - /* - From X.680-0207.pdf#page=46 (21.7): - - "When a "NamedBitList" is used in defining a bitstring type ASN.1 encoding rules are free to add (or remove) - arbitrarily any trailing 0 bits to (or from) values that are being encoded or decoded. Application designers should - therefore ensure that different semantics are not associated with such values which differ only in the number of trailing - 0 bits." - */ - $bits = count($mapping['mapping']) == $size ? array() : array_fill(0, count($mapping['mapping']) - $size, false); - for ($i = strlen($decoded['content']) - 1; $i > 0; $i--) { - $current = ord($decoded['content'][$i]); - for ($j = $offset; $j < 8; $j++) { - $bits[] = (bool) ($current & (1 << $j)); - } - $offset = 0; - } - $values = array(); - $map = array_reverse($mapping['mapping']); - foreach ($map as $i => $value) { - if ($bits[$i]) { - $values[] = $value; - } - } - return $values; - } - case FILE_ASN1_TYPE_OCTET_STRING: - return base64_encode($decoded['content']); - case FILE_ASN1_TYPE_NULL: - return ''; - case FILE_ASN1_TYPE_BOOLEAN: - return $decoded['content']; - case FILE_ASN1_TYPE_NUMERIC_STRING: - case FILE_ASN1_TYPE_PRINTABLE_STRING: - case FILE_ASN1_TYPE_TELETEX_STRING: - case FILE_ASN1_TYPE_VIDEOTEX_STRING: - case FILE_ASN1_TYPE_IA5_STRING: - case FILE_ASN1_TYPE_GRAPHIC_STRING: - case FILE_ASN1_TYPE_VISIBLE_STRING: - case FILE_ASN1_TYPE_GENERAL_STRING: - case FILE_ASN1_TYPE_UNIVERSAL_STRING: - case FILE_ASN1_TYPE_UTF8_STRING: - case FILE_ASN1_TYPE_BMP_STRING: - return $decoded['content']; - case FILE_ASN1_TYPE_INTEGER: - case FILE_ASN1_TYPE_ENUMERATED: - $temp = $decoded['content']; - if (isset($mapping['implicit'])) { - $temp = new Math_BigInteger($decoded['content'], -256); - } - if (isset($mapping['mapping'])) { - $temp = (int) $temp->toString(); - return isset($mapping['mapping'][$temp]) ? - $mapping['mapping'][$temp] : - false; - } - return $temp; - } - } - - /** - * ASN.1 Encode - * - * DER-encodes an ASN.1 semantic mapping ($mapping). Some libraries would probably call this function - * an ASN.1 compiler. - * - * "Special" mappings can be applied via $special. - * - * @param String $source - * @param String $mapping - * @param Integer $idx - * @return String - * @access public - */ - function encodeDER($source, $mapping, $special = array()) - { - $this->location = array(); - return $this->_encode_der($source, $mapping, null, $special); - } - - /** - * ASN.1 Encode (Helper function) - * - * @param String $source - * @param String $mapping - * @param Integer $idx - * @return String - * @access private - */ - function _encode_der($source, $mapping, $idx = null, $special = array()) - { - if (is_object($source) && strtolower(get_class($source)) == 'file_asn1_element') { - return $source->element; - } - - // do not encode (implicitly optional) fields with value set to default - if (isset($mapping['default']) && $source === $mapping['default']) { - return ''; - } - - if (isset($idx)) { - if (isset($special[$idx])) { - $source = call_user_func($special[$idx], $source); - } - $this->location[] = $idx; - } - - $tag = $mapping['type']; - - switch ($tag) { - case FILE_ASN1_TYPE_SET: // Children order is not important, thus process in sequence. - case FILE_ASN1_TYPE_SEQUENCE: - $tag|= 0x20; // set the constructed bit - $value = ''; - - // ignore the min and max - if (isset($mapping['min']) && isset($mapping['max'])) { - $child = $mapping['children']; - - foreach ($source as $content) { - $temp = $this->_encode_der($content, $child, null, $special); - if ($temp === false) { - return false; - } - $value.= $temp; - } - break; - } - - foreach ($mapping['children'] as $key => $child) { - if (!isset($source[$key])) { - if (!isset($child['optional'])) { - return false; - } - continue; - } - - $temp = $this->_encode_der($source[$key], $child, $key, $special); - if ($temp === false) { - return false; - } - - // An empty child encoding means it has been optimized out. - // Else we should have at least one tag byte. - if ($temp === '') { - continue; - } - - // if isset($child['constant']) is true then isset($child['optional']) should be true as well - if (isset($child['constant'])) { - /* - From X.680-0207.pdf#page=58 (30.6): - - "The tagging construction specifies explicit tagging if any of the following holds: - ... - c) the "Tag Type" alternative is used and the value of "TagDefault" for the module is IMPLICIT TAGS or - AUTOMATIC TAGS, but the type defined by "Type" is an untagged choice type, an untagged open type, or - an untagged "DummyReference" (see ITU-T Rec. X.683 | ISO/IEC 8824-4, 8.3)." - */ - if (isset($child['explicit']) || $child['type'] == FILE_ASN1_TYPE_CHOICE) { - $subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | 0x20 | $child['constant']); - $temp = $subtag . $this->_encodeLength(strlen($temp)) . $temp; - } else { - $subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | (ord($temp[0]) & 0x20) | $child['constant']); - $temp = $subtag . substr($temp, 1); - } - } - $value.= $temp; - } - break; - case FILE_ASN1_TYPE_CHOICE: - $temp = false; - - foreach ($mapping['children'] as $key => $child) { - if (!isset($source[$key])) { - continue; - } - - $temp = $this->_encode_der($source[$key], $child, $key, $special); - if ($temp === false) { - return false; - } - - // An empty child encoding means it has been optimized out. - // Else we should have at least one tag byte. - if ($temp === '') { - continue; - } - - $tag = ord($temp[0]); - - // if isset($child['constant']) is true then isset($child['optional']) should be true as well - if (isset($child['constant'])) { - if (isset($child['explicit']) || $child['type'] == FILE_ASN1_TYPE_CHOICE) { - $subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | 0x20 | $child['constant']); - $temp = $subtag . $this->_encodeLength(strlen($temp)) . $temp; - } else { - $subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | (ord($temp[0]) & 0x20) | $child['constant']); - $temp = $subtag . substr($temp, 1); - } - } - } - - if (isset($idx)) { - array_pop($this->location); - } - - if ($temp && isset($mapping['cast'])) { - $temp[0] = chr(($mapping['class'] << 6) | ($tag & 0x20) | $mapping['cast']); - } - - return $temp; - case FILE_ASN1_TYPE_INTEGER: - case FILE_ASN1_TYPE_ENUMERATED: - if (!isset($mapping['mapping'])) { - if (is_numeric($source)) { - $source = new Math_BigInteger($source); - } - $value = $source->toBytes(true); - } else { - $value = array_search($source, $mapping['mapping']); - if ($value === false) { - return false; - } - $value = new Math_BigInteger($value); - $value = $value->toBytes(true); - } - if (!strlen($value)) { - $value = chr(0); - } - break; - case FILE_ASN1_TYPE_UTC_TIME: - case FILE_ASN1_TYPE_GENERALIZED_TIME: - $format = $mapping['type'] == FILE_ASN1_TYPE_UTC_TIME ? 'y' : 'Y'; - $format.= 'mdHis'; - $value = @gmdate($format, strtotime($source)) . 'Z'; - break; - case FILE_ASN1_TYPE_BIT_STRING: - if (isset($mapping['mapping'])) { - $bits = array_fill(0, count($mapping['mapping']), 0); - $size = 0; - for ($i = 0; $i < count($mapping['mapping']); $i++) { - if (in_array($mapping['mapping'][$i], $source)) { - $bits[$i] = 1; - $size = $i; - } - } - - if (isset($mapping['min']) && $mapping['min'] >= 1 && $size < $mapping['min']) { - $size = $mapping['min'] - 1; - } - - $offset = 8 - (($size + 1) & 7); - $offset = $offset !== 8 ? $offset : 0; - - $value = chr($offset); - - for ($i = $size + 1; $i < count($mapping['mapping']); $i++) { - unset($bits[$i]); - } - - $bits = implode('', array_pad($bits, $size + $offset + 1, 0)); - $bytes = explode(' ', rtrim(chunk_split($bits, 8, ' '))); - foreach ($bytes as $byte) { - $value.= chr(bindec($byte)); - } - - break; - } - case FILE_ASN1_TYPE_OCTET_STRING: - /* The initial octet shall encode, as an unsigned binary integer with bit 1 as the least significant bit, - the number of unused bits in the final subsequent octet. The number shall be in the range zero to seven. - - -- http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=16 */ - $value = base64_decode($source); - break; - case FILE_ASN1_TYPE_OBJECT_IDENTIFIER: - $oid = preg_match('#(?:\d+\.)+#', $source) ? $source : array_search($source, $this->oids); - if ($oid === false) { - user_error('Invalid OID'); - return false; - } - $value = ''; - $parts = explode('.', $oid); - $value = chr(40 * $parts[0] + $parts[1]); - for ($i = 2; $i < count($parts); $i++) { - $temp = ''; - if (!$parts[$i]) { - $temp = "\0"; - } else { - while ($parts[$i]) { - $temp = chr(0x80 | ($parts[$i] & 0x7F)) . $temp; - $parts[$i] >>= 7; - } - $temp[strlen($temp) - 1] = $temp[strlen($temp) - 1] & chr(0x7F); - } - $value.= $temp; - } - break; - case FILE_ASN1_TYPE_ANY: - $loc = $this->location; - if (isset($idx)) { - array_pop($this->location); - } - - switch (true) { - case !isset($source): - return $this->_encode_der(null, array('type' => FILE_ASN1_TYPE_NULL) + $mapping, null, $special); - case is_int($source): - case is_object($source) && strtolower(get_class($source)) == 'math_biginteger': - return $this->_encode_der($source, array('type' => FILE_ASN1_TYPE_INTEGER) + $mapping, null, $special); - case is_float($source): - return $this->_encode_der($source, array('type' => FILE_ASN1_TYPE_REAL) + $mapping, null, $special); - case is_bool($source): - return $this->_encode_der($source, array('type' => FILE_ASN1_TYPE_BOOLEAN) + $mapping, null, $special); - case is_array($source) && count($source) == 1: - $typename = implode('', array_keys($source)); - $outtype = array_search($typename, $this->ANYmap, true); - if ($outtype !== false) { - return $this->_encode_der($source[$typename], array('type' => $outtype) + $mapping, null, $special); - } - } - - $filters = $this->filters; - foreach ($loc as $part) { - if (!isset($filters[$part])) { - $filters = false; - break; - } - $filters = $filters[$part]; - } - if ($filters === false) { - user_error('No filters defined for ' . implode('/', $loc)); - return false; - } - return $this->_encode_der($source, $filters + $mapping, null, $special); - case FILE_ASN1_TYPE_NULL: - $value = ''; - break; - case FILE_ASN1_TYPE_NUMERIC_STRING: - case FILE_ASN1_TYPE_TELETEX_STRING: - case FILE_ASN1_TYPE_PRINTABLE_STRING: - case FILE_ASN1_TYPE_UNIVERSAL_STRING: - case FILE_ASN1_TYPE_UTF8_STRING: - case FILE_ASN1_TYPE_BMP_STRING: - case FILE_ASN1_TYPE_IA5_STRING: - case FILE_ASN1_TYPE_VISIBLE_STRING: - case FILE_ASN1_TYPE_VIDEOTEX_STRING: - case FILE_ASN1_TYPE_GRAPHIC_STRING: - case FILE_ASN1_TYPE_GENERAL_STRING: - $value = $source; - break; - case FILE_ASN1_TYPE_BOOLEAN: - $value = $source ? "\xFF" : "\x00"; - break; - default: - user_error('Mapping provides no type definition for ' . implode('/', $this->location)); - return false; - } - - if (isset($idx)) { - array_pop($this->location); - } - - if (isset($mapping['cast'])) { - if (isset($mapping['explicit']) || $mapping['type'] == FILE_ASN1_TYPE_CHOICE) { - $value = chr($tag) . $this->_encodeLength(strlen($value)) . $value; - $tag = ($mapping['class'] << 6) | 0x20 | $mapping['cast']; - } else { - $tag = ($mapping['class'] << 6) | (ord($temp[0]) & 0x20) | $mapping['cast']; - } - } - - return chr($tag) . $this->_encodeLength(strlen($value)) . $value; - } - - /** - * DER-encode the length - * - * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See - * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. - * - * @access private - * @param Integer $length - * @return String - */ - function _encodeLength($length) - { - if ($length <= 0x7F) { - return chr($length); - } - - $temp = ltrim(pack('N', $length), chr(0)); - return pack('Ca*', 0x80 | strlen($temp), $temp); - } - - /** - * BER-decode the time - * - * Called by _decode_ber() and in the case of implicit tags asn1map(). - * - * @access private - * @param String $content - * @param Integer $tag - * @return String - */ - function _decodeTime($content, $tag) - { - /* UTCTime: - http://tools.ietf.org/html/rfc5280#section-4.1.2.5.1 - http://www.obj-sys.com/asn1tutorial/node15.html - - GeneralizedTime: - http://tools.ietf.org/html/rfc5280#section-4.1.2.5.2 - http://www.obj-sys.com/asn1tutorial/node14.html */ - - $pattern = $tag == FILE_ASN1_TYPE_UTC_TIME ? - '#(..)(..)(..)(..)(..)(..)(.*)#' : - '#(....)(..)(..)(..)(..)(..).*([Z+-].*)$#'; - - preg_match($pattern, $content, $matches); - - list(, $year, $month, $day, $hour, $minute, $second, $timezone) = $matches; - - if ($tag == FILE_ASN1_TYPE_UTC_TIME) { - $year = $year >= 50 ? "19$year" : "20$year"; - } - - if ($timezone == 'Z') { - $mktime = 'gmmktime'; - $timezone = 0; - } elseif (preg_match('#([+-])(\d\d)(\d\d)#', $timezone, $matches)) { - $mktime = 'gmmktime'; - $timezone = 60 * $matches[3] + 3600 * $matches[2]; - if ($matches[1] == '-') { - $timezone = -$timezone; - } - } else { - $mktime = 'mktime'; - $timezone = 0; - } - - return @$mktime($hour, $minute, $second, $month, $day, $year) + $timezone; - } - - /** - * Set the time format - * - * Sets the time / date format for asn1map(). - * - * @access public - * @param String $format - */ - function setTimeFormat($format) - { - $this->format = $format; - } - - /** - * Load OIDs - * - * Load the relevant OIDs for a particular ASN.1 semantic mapping. - * - * @access public - * @param Array $oids - */ - function loadOIDs($oids) - { - $this->oids = $oids; - } - - /** - * Load filters - * - * See File_X509, etc, for an example. - * - * @access public - * @param Array $filters - */ - function loadFilters($filters) - { - $this->filters = $filters; - } - - /** - * String Shift - * - * Inspired by array_shift - * - * @param String $string - * @param optional Integer $index - * @return String - * @access private - */ - function _string_shift(&$string, $index = 1) - { - $substr = substr($string, 0, $index); - $string = substr($string, $index); - return $substr; - } - - /** - * String type conversion - * - * This is a lazy conversion, dealing only with character size. - * No real conversion table is used. - * - * @param String $in - * @param optional Integer $from - * @param optional Integer $to - * @return String - * @access public - */ - function convert($in, $from = FILE_ASN1_TYPE_UTF8_STRING, $to = FILE_ASN1_TYPE_UTF8_STRING) - { - if (!isset($this->stringTypeSize[$from]) || !isset($this->stringTypeSize[$to])) { - return false; - } - $insize = $this->stringTypeSize[$from]; - $outsize = $this->stringTypeSize[$to]; - $inlength = strlen($in); - $out = ''; - - for ($i = 0; $i < $inlength;) { - if ($inlength - $i < $insize) { - return false; - } - - // Get an input character as a 32-bit value. - $c = ord($in[$i++]); - switch (true) { - case $insize == 4: - $c = ($c << 8) | ord($in[$i++]); - $c = ($c << 8) | ord($in[$i++]); - case $insize == 2: - $c = ($c << 8) | ord($in[$i++]); - case $insize == 1: - break; - case ($c & 0x80) == 0x00: - break; - case ($c & 0x40) == 0x00: - return false; - default: - $bit = 6; - do { - if ($bit > 25 || $i >= $inlength || (ord($in[$i]) & 0xC0) != 0x80) { - return false; - } - $c = ($c << 6) | (ord($in[$i++]) & 0x3F); - $bit += 5; - $mask = 1 << $bit; - } while ($c & $bit); - $c &= $mask - 1; - break; - } - - // Convert and append the character to output string. - $v = ''; - switch (true) { - case $outsize == 4: - $v .= chr($c & 0xFF); - $c >>= 8; - $v .= chr($c & 0xFF); - $c >>= 8; - case $outsize == 2: - $v .= chr($c & 0xFF); - $c >>= 8; - case $outsize == 1: - $v .= chr($c & 0xFF); - $c >>= 8; - if ($c) { - return false; - } - break; - case ($c & 0x80000000) != 0: - return false; - case $c >= 0x04000000: - $v .= chr(0x80 | ($c & 0x3F)); - $c = ($c >> 6) | 0x04000000; - case $c >= 0x00200000: - $v .= chr(0x80 | ($c & 0x3F)); - $c = ($c >> 6) | 0x00200000; - case $c >= 0x00010000: - $v .= chr(0x80 | ($c & 0x3F)); - $c = ($c >> 6) | 0x00010000; - case $c >= 0x00000800: - $v .= chr(0x80 | ($c & 0x3F)); - $c = ($c >> 6) | 0x00000800; - case $c >= 0x00000080: - $v .= chr(0x80 | ($c & 0x3F)); - $c = ($c >> 6) | 0x000000C0; - default: - $v .= chr($c); - break; - } - $out .= strrev($v); - } - return $out; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/X509.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/X509.php deleted file mode 100755 index 36a6287b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/File/X509.php +++ /dev/null @@ -1,4583 +0,0 @@ - - * @copyright 2012 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include File_ASN1 - */ -if (!class_exists('File_ASN1')) { - include_once 'ASN1.php'; -} - -/** - * Flag to only accept signatures signed by certificate authorities - * - * Not really used anymore but retained all the same to suppress E_NOTICEs from old installs - * - * @access public - */ -define('FILE_X509_VALIDATE_SIGNATURE_BY_CA', 1); - -/**#@+ - * @access public - * @see File_X509::getDN() - */ -/** - * Return internal array representation - */ -define('FILE_X509_DN_ARRAY', 0); -/** - * Return string - */ -define('FILE_X509_DN_STRING', 1); -/** - * Return ASN.1 name string - */ -define('FILE_X509_DN_ASN1', 2); -/** - * Return OpenSSL compatible array - */ -define('FILE_X509_DN_OPENSSL', 3); -/** - * Return canonical ASN.1 RDNs string - */ -define('FILE_X509_DN_CANON', 4); -/** - * Return name hash for file indexing - */ -define('FILE_X509_DN_HASH', 5); -/**#@-*/ - -/**#@+ - * @access public - * @see File_X509::saveX509() - * @see File_X509::saveCSR() - * @see File_X509::saveCRL() - */ -/** - * Save as PEM - * - * ie. a base64-encoded PEM with a header and a footer - */ -define('FILE_X509_FORMAT_PEM', 0); -/** - * Save as DER - */ -define('FILE_X509_FORMAT_DER', 1); -/** - * Save as a SPKAC - * - * Only works on CSRs. Not currently supported. - */ -define('FILE_X509_FORMAT_SPKAC', 2); -/**#@-*/ - -/** - * Attribute value disposition. - * If disposition is >= 0, this is the index of the target value. - */ -define('FILE_X509_ATTR_ALL', -1); // All attribute values (array). -define('FILE_X509_ATTR_APPEND', -2); // Add a value. -define('FILE_X509_ATTR_REPLACE', -3); // Clear first, then add a value. - -/** - * Pure-PHP X.509 Parser - * - * @package File_X509 - * @author Jim Wigginton - * @access public - */ -class File_X509 -{ - /** - * ASN.1 syntax for X.509 certificates - * - * @var Array - * @access private - */ - var $Certificate; - - /**#@+ - * ASN.1 syntax for various extensions - * - * @access private - */ - var $DirectoryString; - var $PKCS9String; - var $AttributeValue; - var $Extensions; - var $KeyUsage; - var $ExtKeyUsageSyntax; - var $BasicConstraints; - var $KeyIdentifier; - var $CRLDistributionPoints; - var $AuthorityKeyIdentifier; - var $CertificatePolicies; - var $AuthorityInfoAccessSyntax; - var $SubjectAltName; - var $PrivateKeyUsagePeriod; - var $IssuerAltName; - var $PolicyMappings; - var $NameConstraints; - - var $CPSuri; - var $UserNotice; - - var $netscape_cert_type; - var $netscape_comment; - var $netscape_ca_policy_url; - - var $Name; - var $RelativeDistinguishedName; - var $CRLNumber; - var $CRLReason; - var $IssuingDistributionPoint; - var $InvalidityDate; - var $CertificateIssuer; - var $HoldInstructionCode; - var $SignedPublicKeyAndChallenge; - /**#@-*/ - - /** - * ASN.1 syntax for Certificate Signing Requests (RFC2986) - * - * @var Array - * @access private - */ - var $CertificationRequest; - - /** - * ASN.1 syntax for Certificate Revocation Lists (RFC5280) - * - * @var Array - * @access private - */ - var $CertificateList; - - /** - * Distinguished Name - * - * @var Array - * @access private - */ - var $dn; - - /** - * Public key - * - * @var String - * @access private - */ - var $publicKey; - - /** - * Private key - * - * @var String - * @access private - */ - var $privateKey; - - /** - * Object identifiers for X.509 certificates - * - * @var Array - * @access private - * @link http://en.wikipedia.org/wiki/Object_identifier - */ - var $oids; - - /** - * The certificate authorities - * - * @var Array - * @access private - */ - var $CAs; - - /** - * The currently loaded certificate - * - * @var Array - * @access private - */ - var $currentCert; - - /** - * The signature subject - * - * There's no guarantee File_X509 is going to reencode an X.509 cert in the same way it was originally - * encoded so we take save the portion of the original cert that the signature would have made for. - * - * @var String - * @access private - */ - var $signatureSubject; - - /** - * Certificate Start Date - * - * @var String - * @access private - */ - var $startDate; - - /** - * Certificate End Date - * - * @var String - * @access private - */ - var $endDate; - - /** - * Serial Number - * - * @var String - * @access private - */ - var $serialNumber; - - /** - * Key Identifier - * - * See {@link http://tools.ietf.org/html/rfc5280#section-4.2.1.1 RFC5280#section-4.2.1.1} and - * {@link http://tools.ietf.org/html/rfc5280#section-4.2.1.2 RFC5280#section-4.2.1.2}. - * - * @var String - * @access private - */ - var $currentKeyIdentifier; - - /** - * CA Flag - * - * @var Boolean - * @access private - */ - var $caFlag = false; - - /** - * SPKAC Challenge - * - * @var String - * @access private - */ - var $challenge; - - /** - * Default Constructor. - * - * @return File_X509 - * @access public - */ - function File_X509() - { - if (!class_exists('Math_BigInteger')) { - include_once 'Math/BigInteger.php'; - } - - // Explicitly Tagged Module, 1988 Syntax - // http://tools.ietf.org/html/rfc5280#appendix-A.1 - - $this->DirectoryString = array( - 'type' => FILE_ASN1_TYPE_CHOICE, - 'children' => array( - 'teletexString' => array('type' => FILE_ASN1_TYPE_TELETEX_STRING), - 'printableString' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING), - 'universalString' => array('type' => FILE_ASN1_TYPE_UNIVERSAL_STRING), - 'utf8String' => array('type' => FILE_ASN1_TYPE_UTF8_STRING), - 'bmpString' => array('type' => FILE_ASN1_TYPE_BMP_STRING) - ) - ); - - $this->PKCS9String = array( - 'type' => FILE_ASN1_TYPE_CHOICE, - 'children' => array( - 'ia5String' => array('type' => FILE_ASN1_TYPE_IA5_STRING), - 'directoryString' => $this->DirectoryString - ) - ); - - $this->AttributeValue = array('type' => FILE_ASN1_TYPE_ANY); - - $AttributeType = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER); - - $AttributeTypeAndValue = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'type' => $AttributeType, - 'value'=> $this->AttributeValue - ) - ); - - /* - In practice, RDNs containing multiple name-value pairs (called "multivalued RDNs") are rare, - but they can be useful at times when either there is no unique attribute in the entry or you - want to ensure that the entry's DN contains some useful identifying information. - - - https://www.opends.org/wiki/page/DefinitionRelativeDistinguishedName - */ - $this->RelativeDistinguishedName = array( - 'type' => FILE_ASN1_TYPE_SET, - 'min' => 1, - 'max' => -1, - 'children' => $AttributeTypeAndValue - ); - - // http://tools.ietf.org/html/rfc5280#section-4.1.2.4 - $RDNSequence = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - // RDNSequence does not define a min or a max, which means it doesn't have one - 'min' => 0, - 'max' => -1, - 'children' => $this->RelativeDistinguishedName - ); - - $this->Name = array( - 'type' => FILE_ASN1_TYPE_CHOICE, - 'children' => array( - 'rdnSequence' => $RDNSequence - ) - ); - - // http://tools.ietf.org/html/rfc5280#section-4.1.1.2 - $AlgorithmIdentifier = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'algorithm' => array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER), - 'parameters' => array( - 'type' => FILE_ASN1_TYPE_ANY, - 'optional' => true - ) - ) - ); - - /* - A certificate using system MUST reject the certificate if it encounters - a critical extension it does not recognize; however, a non-critical - extension may be ignored if it is not recognized. - - http://tools.ietf.org/html/rfc5280#section-4.2 - */ - $Extension = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'extnId' => array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER), - 'critical' => array( - 'type' => FILE_ASN1_TYPE_BOOLEAN, - 'optional' => true, - 'default' => false - ), - 'extnValue' => array('type' => FILE_ASN1_TYPE_OCTET_STRING) - ) - ); - - $this->Extensions = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - // technically, it's MAX, but we'll assume anything < 0 is MAX - 'max' => -1, - // if 'children' isn't an array then 'min' and 'max' must be defined - 'children' => $Extension - ); - - $SubjectPublicKeyInfo = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'algorithm' => $AlgorithmIdentifier, - 'subjectPublicKey' => array('type' => FILE_ASN1_TYPE_BIT_STRING) - ) - ); - - $UniqueIdentifier = array('type' => FILE_ASN1_TYPE_BIT_STRING); - - $Time = array( - 'type' => FILE_ASN1_TYPE_CHOICE, - 'children' => array( - 'utcTime' => array('type' => FILE_ASN1_TYPE_UTC_TIME), - 'generalTime' => array('type' => FILE_ASN1_TYPE_GENERALIZED_TIME) - ) - ); - - // http://tools.ietf.org/html/rfc5280#section-4.1.2.5 - $Validity = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'notBefore' => $Time, - 'notAfter' => $Time - ) - ); - - $CertificateSerialNumber = array('type' => FILE_ASN1_TYPE_INTEGER); - - $Version = array( - 'type' => FILE_ASN1_TYPE_INTEGER, - 'mapping' => array('v1', 'v2', 'v3') - ); - - // assert($TBSCertificate['children']['signature'] == $Certificate['children']['signatureAlgorithm']) - $TBSCertificate = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - // technically, default implies optional, but we'll define it as being optional, none-the-less, just to - // reenforce that fact - 'version' => array( - 'constant' => 0, - 'optional' => true, - 'explicit' => true, - 'default' => 'v1' - ) + $Version, - 'serialNumber' => $CertificateSerialNumber, - 'signature' => $AlgorithmIdentifier, - 'issuer' => $this->Name, - 'validity' => $Validity, - 'subject' => $this->Name, - 'subjectPublicKeyInfo' => $SubjectPublicKeyInfo, - // implicit means that the T in the TLV structure is to be rewritten, regardless of the type - 'issuerUniqueID' => array( - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ) + $UniqueIdentifier, - 'subjectUniqueID' => array( - 'constant' => 2, - 'optional' => true, - 'implicit' => true - ) + $UniqueIdentifier, - // doesn't use the EXPLICIT keyword but if - // it's not IMPLICIT, it's EXPLICIT - 'extensions' => array( - 'constant' => 3, - 'optional' => true, - 'explicit' => true - ) + $this->Extensions - ) - ); - - $this->Certificate = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'tbsCertificate' => $TBSCertificate, - 'signatureAlgorithm' => $AlgorithmIdentifier, - 'signature' => array('type' => FILE_ASN1_TYPE_BIT_STRING) - ) - ); - - $this->KeyUsage = array( - 'type' => FILE_ASN1_TYPE_BIT_STRING, - 'mapping' => array( - 'digitalSignature', - 'nonRepudiation', - 'keyEncipherment', - 'dataEncipherment', - 'keyAgreement', - 'keyCertSign', - 'cRLSign', - 'encipherOnly', - 'decipherOnly' - ) - ); - - $this->BasicConstraints = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'cA' => array( - 'type' => FILE_ASN1_TYPE_BOOLEAN, - 'optional' => true, - 'default' => false - ), - 'pathLenConstraint' => array( - 'type' => FILE_ASN1_TYPE_INTEGER, - 'optional' => true - ) - ) - ); - - $this->KeyIdentifier = array('type' => FILE_ASN1_TYPE_OCTET_STRING); - - $OrganizationalUnitNames = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - 'max' => 4, // ub-organizational-units - 'children' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING) - ); - - $PersonalName = array( - 'type' => FILE_ASN1_TYPE_SET, - 'children' => array( - 'surname' => array( - 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING, - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ), - 'given-name' => array( - 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING, - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ), - 'initials' => array( - 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING, - 'constant' => 2, - 'optional' => true, - 'implicit' => true - ), - 'generation-qualifier' => array( - 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING, - 'constant' => 3, - 'optional' => true, - 'implicit' => true - ) - ) - ); - - $NumericUserIdentifier = array('type' => FILE_ASN1_TYPE_NUMERIC_STRING); - - $OrganizationName = array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING); - - $PrivateDomainName = array( - 'type' => FILE_ASN1_TYPE_CHOICE, - 'children' => array( - 'numeric' => array('type' => FILE_ASN1_TYPE_NUMERIC_STRING), - 'printable' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING) - ) - ); - - $TerminalIdentifier = array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING); - - $NetworkAddress = array('type' => FILE_ASN1_TYPE_NUMERIC_STRING); - - $AdministrationDomainName = array( - 'type' => FILE_ASN1_TYPE_CHOICE, - // if class isn't present it's assumed to be FILE_ASN1_CLASS_UNIVERSAL or - // (if constant is present) FILE_ASN1_CLASS_CONTEXT_SPECIFIC - 'class' => FILE_ASN1_CLASS_APPLICATION, - 'cast' => 2, - 'children' => array( - 'numeric' => array('type' => FILE_ASN1_TYPE_NUMERIC_STRING), - 'printable' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING) - ) - ); - - $CountryName = array( - 'type' => FILE_ASN1_TYPE_CHOICE, - // if class isn't present it's assumed to be FILE_ASN1_CLASS_UNIVERSAL or - // (if constant is present) FILE_ASN1_CLASS_CONTEXT_SPECIFIC - 'class' => FILE_ASN1_CLASS_APPLICATION, - 'cast' => 1, - 'children' => array( - 'x121-dcc-code' => array('type' => FILE_ASN1_TYPE_NUMERIC_STRING), - 'iso-3166-alpha2-code' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING) - ) - ); - - $AnotherName = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'type-id' => array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER), - 'value' => array( - 'type' => FILE_ASN1_TYPE_ANY, - 'constant' => 0, - 'optional' => true, - 'explicit' => true - ) - ) - ); - - $ExtensionAttribute = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'extension-attribute-type' => array( - 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING, - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ), - 'extension-attribute-value' => array( - 'type' => FILE_ASN1_TYPE_ANY, - 'constant' => 1, - 'optional' => true, - 'explicit' => true - ) - ) - ); - - $ExtensionAttributes = array( - 'type' => FILE_ASN1_TYPE_SET, - 'min' => 1, - 'max' => 256, // ub-extension-attributes - 'children' => $ExtensionAttribute - ); - - $BuiltInDomainDefinedAttribute = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'type' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING), - 'value' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING) - ) - ); - - $BuiltInDomainDefinedAttributes = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - 'max' => 4, // ub-domain-defined-attributes - 'children' => $BuiltInDomainDefinedAttribute - ); - - $BuiltInStandardAttributes = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'country-name' => array('optional' => true) + $CountryName, - 'administration-domain-name' => array('optional' => true) + $AdministrationDomainName, - 'network-address' => array( - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ) + $NetworkAddress, - 'terminal-identifier' => array( - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ) + $TerminalIdentifier, - 'private-domain-name' => array( - 'constant' => 2, - 'optional' => true, - 'explicit' => true - ) + $PrivateDomainName, - 'organization-name' => array( - 'constant' => 3, - 'optional' => true, - 'implicit' => true - ) + $OrganizationName, - 'numeric-user-identifier' => array( - 'constant' => 4, - 'optional' => true, - 'implicit' => true - ) + $NumericUserIdentifier, - 'personal-name' => array( - 'constant' => 5, - 'optional' => true, - 'implicit' => true - ) + $PersonalName, - 'organizational-unit-names' => array( - 'constant' => 6, - 'optional' => true, - 'implicit' => true - ) + $OrganizationalUnitNames - ) - ); - - $ORAddress = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'built-in-standard-attributes' => $BuiltInStandardAttributes, - 'built-in-domain-defined-attributes' => array('optional' => true) + $BuiltInDomainDefinedAttributes, - 'extension-attributes' => array('optional' => true) + $ExtensionAttributes - ) - ); - - $EDIPartyName = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'nameAssigner' => array( - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ) + $this->DirectoryString, - // partyName is technically required but File_ASN1 doesn't currently support non-optional constants and - // setting it to optional gets the job done in any event. - 'partyName' => array( - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ) + $this->DirectoryString - ) - ); - - $GeneralName = array( - 'type' => FILE_ASN1_TYPE_CHOICE, - 'children' => array( - 'otherName' => array( - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ) + $AnotherName, - 'rfc822Name' => array( - 'type' => FILE_ASN1_TYPE_IA5_STRING, - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ), - 'dNSName' => array( - 'type' => FILE_ASN1_TYPE_IA5_STRING, - 'constant' => 2, - 'optional' => true, - 'implicit' => true - ), - 'x400Address' => array( - 'constant' => 3, - 'optional' => true, - 'implicit' => true - ) + $ORAddress, - 'directoryName' => array( - 'constant' => 4, - 'optional' => true, - 'explicit' => true - ) + $this->Name, - 'ediPartyName' => array( - 'constant' => 5, - 'optional' => true, - 'implicit' => true - ) + $EDIPartyName, - 'uniformResourceIdentifier' => array( - 'type' => FILE_ASN1_TYPE_IA5_STRING, - 'constant' => 6, - 'optional' => true, - 'implicit' => true - ), - 'iPAddress' => array( - 'type' => FILE_ASN1_TYPE_OCTET_STRING, - 'constant' => 7, - 'optional' => true, - 'implicit' => true - ), - 'registeredID' => array( - 'type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER, - 'constant' => 8, - 'optional' => true, - 'implicit' => true - ) - ) - ); - - $GeneralNames = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => $GeneralName - ); - - $this->IssuerAltName = $GeneralNames; - - $ReasonFlags = array( - 'type' => FILE_ASN1_TYPE_BIT_STRING, - 'mapping' => array( - 'unused', - 'keyCompromise', - 'cACompromise', - 'affiliationChanged', - 'superseded', - 'cessationOfOperation', - 'certificateHold', - 'privilegeWithdrawn', - 'aACompromise' - ) - ); - - $DistributionPointName = array( - 'type' => FILE_ASN1_TYPE_CHOICE, - 'children' => array( - 'fullName' => array( - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ) + $GeneralNames, - 'nameRelativeToCRLIssuer' => array( - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ) + $this->RelativeDistinguishedName - ) - ); - - $DistributionPoint = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'distributionPoint' => array( - 'constant' => 0, - 'optional' => true, - 'explicit' => true - ) + $DistributionPointName, - 'reasons' => array( - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ) + $ReasonFlags, - 'cRLIssuer' => array( - 'constant' => 2, - 'optional' => true, - 'implicit' => true - ) + $GeneralNames - ) - ); - - $this->CRLDistributionPoints = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => $DistributionPoint - ); - - $this->AuthorityKeyIdentifier = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'keyIdentifier' => array( - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ) + $this->KeyIdentifier, - 'authorityCertIssuer' => array( - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ) + $GeneralNames, - 'authorityCertSerialNumber' => array( - 'constant' => 2, - 'optional' => true, - 'implicit' => true - ) + $CertificateSerialNumber - ) - ); - - $PolicyQualifierId = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER); - - $PolicyQualifierInfo = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'policyQualifierId' => $PolicyQualifierId, - 'qualifier' => array('type' => FILE_ASN1_TYPE_ANY) - ) - ); - - $CertPolicyId = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER); - - $PolicyInformation = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'policyIdentifier' => $CertPolicyId, - 'policyQualifiers' => array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 0, - 'max' => -1, - 'optional' => true, - 'children' => $PolicyQualifierInfo - ) - ) - ); - - $this->CertificatePolicies = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => $PolicyInformation - ); - - $this->PolicyMappings = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'issuerDomainPolicy' => $CertPolicyId, - 'subjectDomainPolicy' => $CertPolicyId - ) - ) - ); - - $KeyPurposeId = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER); - - $this->ExtKeyUsageSyntax = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => $KeyPurposeId - ); - - $AccessDescription = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'accessMethod' => array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER), - 'accessLocation' => $GeneralName - ) - ); - - $this->AuthorityInfoAccessSyntax = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => $AccessDescription - ); - - $this->SubjectAltName = $GeneralNames; - - $this->PrivateKeyUsagePeriod = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'notBefore' => array( - 'constant' => 0, - 'optional' => true, - 'implicit' => true, - 'type' => FILE_ASN1_TYPE_GENERALIZED_TIME), - 'notAfter' => array( - 'constant' => 1, - 'optional' => true, - 'implicit' => true, - 'type' => FILE_ASN1_TYPE_GENERALIZED_TIME) - ) - ); - - $BaseDistance = array('type' => FILE_ASN1_TYPE_INTEGER); - - $GeneralSubtree = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'base' => $GeneralName, - 'minimum' => array( - 'constant' => 0, - 'optional' => true, - 'implicit' => true, - 'default' => new Math_BigInteger(0) - ) + $BaseDistance, - 'maximum' => array( - 'constant' => 1, - 'optional' => true, - 'implicit' => true, - ) + $BaseDistance - ) - ); - - $GeneralSubtrees = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => $GeneralSubtree - ); - - $this->NameConstraints = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'permittedSubtrees' => array( - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ) + $GeneralSubtrees, - 'excludedSubtrees' => array( - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ) + $GeneralSubtrees - ) - ); - - $this->CPSuri = array('type' => FILE_ASN1_TYPE_IA5_STRING); - - $DisplayText = array( - 'type' => FILE_ASN1_TYPE_CHOICE, - 'children' => array( - 'ia5String' => array('type' => FILE_ASN1_TYPE_IA5_STRING), - 'visibleString' => array('type' => FILE_ASN1_TYPE_VISIBLE_STRING), - 'bmpString' => array('type' => FILE_ASN1_TYPE_BMP_STRING), - 'utf8String' => array('type' => FILE_ASN1_TYPE_UTF8_STRING) - ) - ); - - $NoticeReference = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'organization' => $DisplayText, - 'noticeNumbers' => array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - 'max' => 200, - 'children' => array('type' => FILE_ASN1_TYPE_INTEGER) - ) - ) - ); - - $this->UserNotice = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'noticeRef' => array( - 'optional' => true, - 'implicit' => true - ) + $NoticeReference, - 'explicitText' => array( - 'optional' => true, - 'implicit' => true - ) + $DisplayText - ) - ); - - // mapping is from - $this->netscape_cert_type = array( - 'type' => FILE_ASN1_TYPE_BIT_STRING, - 'mapping' => array( - 'SSLClient', - 'SSLServer', - 'Email', - 'ObjectSigning', - 'Reserved', - 'SSLCA', - 'EmailCA', - 'ObjectSigningCA' - ) - ); - - $this->netscape_comment = array('type' => FILE_ASN1_TYPE_IA5_STRING); - $this->netscape_ca_policy_url = array('type' => FILE_ASN1_TYPE_IA5_STRING); - - // attribute is used in RFC2986 but we're using the RFC5280 definition - - $Attribute = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'type' => $AttributeType, - 'value'=> array( - 'type' => FILE_ASN1_TYPE_SET, - 'min' => 1, - 'max' => -1, - 'children' => $this->AttributeValue - ) - ) - ); - - // adapted from - - $Attributes = array( - 'type' => FILE_ASN1_TYPE_SET, - 'min' => 1, - 'max' => -1, - 'children' => $Attribute - ); - - $CertificationRequestInfo = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'version' => array( - 'type' => FILE_ASN1_TYPE_INTEGER, - 'mapping' => array('v1') - ), - 'subject' => $this->Name, - 'subjectPKInfo' => $SubjectPublicKeyInfo, - 'attributes' => array( - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ) + $Attributes, - ) - ); - - $this->CertificationRequest = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'certificationRequestInfo' => $CertificationRequestInfo, - 'signatureAlgorithm' => $AlgorithmIdentifier, - 'signature' => array('type' => FILE_ASN1_TYPE_BIT_STRING) - ) - ); - - $RevokedCertificate = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'userCertificate' => $CertificateSerialNumber, - 'revocationDate' => $Time, - 'crlEntryExtensions' => array( - 'optional' => true - ) + $this->Extensions - ) - ); - - $TBSCertList = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'version' => array( - 'optional' => true, - 'default' => 'v1' - ) + $Version, - 'signature' => $AlgorithmIdentifier, - 'issuer' => $this->Name, - 'thisUpdate' => $Time, - 'nextUpdate' => array( - 'optional' => true - ) + $Time, - 'revokedCertificates' => array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'optional' => true, - 'min' => 0, - 'max' => -1, - 'children' => $RevokedCertificate - ), - 'crlExtensions' => array( - 'constant' => 0, - 'optional' => true, - 'explicit' => true - ) + $this->Extensions - ) - ); - - $this->CertificateList = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'tbsCertList' => $TBSCertList, - 'signatureAlgorithm' => $AlgorithmIdentifier, - 'signature' => array('type' => FILE_ASN1_TYPE_BIT_STRING) - ) - ); - - $this->CRLNumber = array('type' => FILE_ASN1_TYPE_INTEGER); - - $this->CRLReason = array('type' => FILE_ASN1_TYPE_ENUMERATED, - 'mapping' => array( - 'unspecified', - 'keyCompromise', - 'cACompromise', - 'affiliationChanged', - 'superseded', - 'cessationOfOperation', - 'certificateHold', - // Value 7 is not used. - 8 => 'removeFromCRL', - 'privilegeWithdrawn', - 'aACompromise' - ) - ); - - $this->IssuingDistributionPoint = array('type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'distributionPoint' => array( - 'constant' => 0, - 'optional' => true, - 'explicit' => true - ) + $DistributionPointName, - 'onlyContainsUserCerts' => array( - 'type' => FILE_ASN1_TYPE_BOOLEAN, - 'constant' => 1, - 'optional' => true, - 'default' => false, - 'implicit' => true - ), - 'onlyContainsCACerts' => array( - 'type' => FILE_ASN1_TYPE_BOOLEAN, - 'constant' => 2, - 'optional' => true, - 'default' => false, - 'implicit' => true - ), - 'onlySomeReasons' => array( - 'constant' => 3, - 'optional' => true, - 'implicit' => true - ) + $ReasonFlags, - 'indirectCRL' => array( - 'type' => FILE_ASN1_TYPE_BOOLEAN, - 'constant' => 4, - 'optional' => true, - 'default' => false, - 'implicit' => true - ), - 'onlyContainsAttributeCerts' => array( - 'type' => FILE_ASN1_TYPE_BOOLEAN, - 'constant' => 5, - 'optional' => true, - 'default' => false, - 'implicit' => true - ) - ) - ); - - $this->InvalidityDate = array('type' => FILE_ASN1_TYPE_GENERALIZED_TIME); - - $this->CertificateIssuer = $GeneralNames; - - $this->HoldInstructionCode = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER); - - $PublicKeyAndChallenge = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'spki' => $SubjectPublicKeyInfo, - 'challenge' => array('type' => FILE_ASN1_TYPE_IA5_STRING) - ) - ); - - $this->SignedPublicKeyAndChallenge = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'publicKeyAndChallenge' => $PublicKeyAndChallenge, - 'signatureAlgorithm' => $AlgorithmIdentifier, - 'signature' => array('type' => FILE_ASN1_TYPE_BIT_STRING) - ) - ); - - // OIDs from RFC5280 and those RFCs mentioned in RFC5280#section-4.1.1.2 - $this->oids = array( - '1.3.6.1.5.5.7' => 'id-pkix', - '1.3.6.1.5.5.7.1' => 'id-pe', - '1.3.6.1.5.5.7.2' => 'id-qt', - '1.3.6.1.5.5.7.3' => 'id-kp', - '1.3.6.1.5.5.7.48' => 'id-ad', - '1.3.6.1.5.5.7.2.1' => 'id-qt-cps', - '1.3.6.1.5.5.7.2.2' => 'id-qt-unotice', - '1.3.6.1.5.5.7.48.1' =>'id-ad-ocsp', - '1.3.6.1.5.5.7.48.2' => 'id-ad-caIssuers', - '1.3.6.1.5.5.7.48.3' => 'id-ad-timeStamping', - '1.3.6.1.5.5.7.48.5' => 'id-ad-caRepository', - '2.5.4' => 'id-at', - '2.5.4.41' => 'id-at-name', - '2.5.4.4' => 'id-at-surname', - '2.5.4.42' => 'id-at-givenName', - '2.5.4.43' => 'id-at-initials', - '2.5.4.44' => 'id-at-generationQualifier', - '2.5.4.3' => 'id-at-commonName', - '2.5.4.7' => 'id-at-localityName', - '2.5.4.8' => 'id-at-stateOrProvinceName', - '2.5.4.10' => 'id-at-organizationName', - '2.5.4.11' => 'id-at-organizationalUnitName', - '2.5.4.12' => 'id-at-title', - '2.5.4.13' => 'id-at-description', - '2.5.4.46' => 'id-at-dnQualifier', - '2.5.4.6' => 'id-at-countryName', - '2.5.4.5' => 'id-at-serialNumber', - '2.5.4.65' => 'id-at-pseudonym', - '2.5.4.17' => 'id-at-postalCode', - '2.5.4.9' => 'id-at-streetAddress', - '2.5.4.45' => 'id-at-uniqueIdentifier', - '2.5.4.72' => 'id-at-role', - - '0.9.2342.19200300.100.1.25' => 'id-domainComponent', - '1.2.840.113549.1.9' => 'pkcs-9', - '1.2.840.113549.1.9.1' => 'pkcs-9-at-emailAddress', - '2.5.29' => 'id-ce', - '2.5.29.35' => 'id-ce-authorityKeyIdentifier', - '2.5.29.14' => 'id-ce-subjectKeyIdentifier', - '2.5.29.15' => 'id-ce-keyUsage', - '2.5.29.16' => 'id-ce-privateKeyUsagePeriod', - '2.5.29.32' => 'id-ce-certificatePolicies', - '2.5.29.32.0' => 'anyPolicy', - - '2.5.29.33' => 'id-ce-policyMappings', - '2.5.29.17' => 'id-ce-subjectAltName', - '2.5.29.18' => 'id-ce-issuerAltName', - '2.5.29.9' => 'id-ce-subjectDirectoryAttributes', - '2.5.29.19' => 'id-ce-basicConstraints', - '2.5.29.30' => 'id-ce-nameConstraints', - '2.5.29.36' => 'id-ce-policyConstraints', - '2.5.29.31' => 'id-ce-cRLDistributionPoints', - '2.5.29.37' => 'id-ce-extKeyUsage', - '2.5.29.37.0' => 'anyExtendedKeyUsage', - '1.3.6.1.5.5.7.3.1' => 'id-kp-serverAuth', - '1.3.6.1.5.5.7.3.2' => 'id-kp-clientAuth', - '1.3.6.1.5.5.7.3.3' => 'id-kp-codeSigning', - '1.3.6.1.5.5.7.3.4' => 'id-kp-emailProtection', - '1.3.6.1.5.5.7.3.8' => 'id-kp-timeStamping', - '1.3.6.1.5.5.7.3.9' => 'id-kp-OCSPSigning', - '2.5.29.54' => 'id-ce-inhibitAnyPolicy', - '2.5.29.46' => 'id-ce-freshestCRL', - '1.3.6.1.5.5.7.1.1' => 'id-pe-authorityInfoAccess', - '1.3.6.1.5.5.7.1.11' => 'id-pe-subjectInfoAccess', - '2.5.29.20' => 'id-ce-cRLNumber', - '2.5.29.28' => 'id-ce-issuingDistributionPoint', - '2.5.29.27' => 'id-ce-deltaCRLIndicator', - '2.5.29.21' => 'id-ce-cRLReasons', - '2.5.29.29' => 'id-ce-certificateIssuer', - '2.5.29.23' => 'id-ce-holdInstructionCode', - '1.2.840.10040.2' => 'holdInstruction', - '1.2.840.10040.2.1' => 'id-holdinstruction-none', - '1.2.840.10040.2.2' => 'id-holdinstruction-callissuer', - '1.2.840.10040.2.3' => 'id-holdinstruction-reject', - '2.5.29.24' => 'id-ce-invalidityDate', - - '1.2.840.113549.2.2' => 'md2', - '1.2.840.113549.2.5' => 'md5', - '1.3.14.3.2.26' => 'id-sha1', - '1.2.840.10040.4.1' => 'id-dsa', - '1.2.840.10040.4.3' => 'id-dsa-with-sha1', - '1.2.840.113549.1.1' => 'pkcs-1', - '1.2.840.113549.1.1.1' => 'rsaEncryption', - '1.2.840.113549.1.1.2' => 'md2WithRSAEncryption', - '1.2.840.113549.1.1.4' => 'md5WithRSAEncryption', - '1.2.840.113549.1.1.5' => 'sha1WithRSAEncryption', - '1.2.840.10046.2.1' => 'dhpublicnumber', - '2.16.840.1.101.2.1.1.22' => 'id-keyExchangeAlgorithm', - '1.2.840.10045' => 'ansi-X9-62', - '1.2.840.10045.4' => 'id-ecSigType', - '1.2.840.10045.4.1' => 'ecdsa-with-SHA1', - '1.2.840.10045.1' => 'id-fieldType', - '1.2.840.10045.1.1' => 'prime-field', - '1.2.840.10045.1.2' => 'characteristic-two-field', - '1.2.840.10045.1.2.3' => 'id-characteristic-two-basis', - '1.2.840.10045.1.2.3.1' => 'gnBasis', - '1.2.840.10045.1.2.3.2' => 'tpBasis', - '1.2.840.10045.1.2.3.3' => 'ppBasis', - '1.2.840.10045.2' => 'id-publicKeyType', - '1.2.840.10045.2.1' => 'id-ecPublicKey', - '1.2.840.10045.3' => 'ellipticCurve', - '1.2.840.10045.3.0' => 'c-TwoCurve', - '1.2.840.10045.3.0.1' => 'c2pnb163v1', - '1.2.840.10045.3.0.2' => 'c2pnb163v2', - '1.2.840.10045.3.0.3' => 'c2pnb163v3', - '1.2.840.10045.3.0.4' => 'c2pnb176w1', - '1.2.840.10045.3.0.5' => 'c2pnb191v1', - '1.2.840.10045.3.0.6' => 'c2pnb191v2', - '1.2.840.10045.3.0.7' => 'c2pnb191v3', - '1.2.840.10045.3.0.8' => 'c2pnb191v4', - '1.2.840.10045.3.0.9' => 'c2pnb191v5', - '1.2.840.10045.3.0.10' => 'c2pnb208w1', - '1.2.840.10045.3.0.11' => 'c2pnb239v1', - '1.2.840.10045.3.0.12' => 'c2pnb239v2', - '1.2.840.10045.3.0.13' => 'c2pnb239v3', - '1.2.840.10045.3.0.14' => 'c2pnb239v4', - '1.2.840.10045.3.0.15' => 'c2pnb239v5', - '1.2.840.10045.3.0.16' => 'c2pnb272w1', - '1.2.840.10045.3.0.17' => 'c2pnb304w1', - '1.2.840.10045.3.0.18' => 'c2pnb359v1', - '1.2.840.10045.3.0.19' => 'c2pnb368w1', - '1.2.840.10045.3.0.20' => 'c2pnb431r1', - '1.2.840.10045.3.1' => 'primeCurve', - '1.2.840.10045.3.1.1' => 'prime192v1', - '1.2.840.10045.3.1.2' => 'prime192v2', - '1.2.840.10045.3.1.3' => 'prime192v3', - '1.2.840.10045.3.1.4' => 'prime239v1', - '1.2.840.10045.3.1.5' => 'prime239v2', - '1.2.840.10045.3.1.6' => 'prime239v3', - '1.2.840.10045.3.1.7' => 'prime256v1', - '1.2.840.113549.1.1.7' => 'id-RSAES-OAEP', - '1.2.840.113549.1.1.9' => 'id-pSpecified', - '1.2.840.113549.1.1.10' => 'id-RSASSA-PSS', - '1.2.840.113549.1.1.8' => 'id-mgf1', - '1.2.840.113549.1.1.14' => 'sha224WithRSAEncryption', - '1.2.840.113549.1.1.11' => 'sha256WithRSAEncryption', - '1.2.840.113549.1.1.12' => 'sha384WithRSAEncryption', - '1.2.840.113549.1.1.13' => 'sha512WithRSAEncryption', - '2.16.840.1.101.3.4.2.4' => 'id-sha224', - '2.16.840.1.101.3.4.2.1' => 'id-sha256', - '2.16.840.1.101.3.4.2.2' => 'id-sha384', - '2.16.840.1.101.3.4.2.3' => 'id-sha512', - '1.2.643.2.2.4' => 'id-GostR3411-94-with-GostR3410-94', - '1.2.643.2.2.3' => 'id-GostR3411-94-with-GostR3410-2001', - '1.2.643.2.2.20' => 'id-GostR3410-2001', - '1.2.643.2.2.19' => 'id-GostR3410-94', - // Netscape Object Identifiers from "Netscape Certificate Extensions" - '2.16.840.1.113730' => 'netscape', - '2.16.840.1.113730.1' => 'netscape-cert-extension', - '2.16.840.1.113730.1.1' => 'netscape-cert-type', - '2.16.840.1.113730.1.13' => 'netscape-comment', - '2.16.840.1.113730.1.8' => 'netscape-ca-policy-url', - // the following are X.509 extensions not supported by phpseclib - '1.3.6.1.5.5.7.1.12' => 'id-pe-logotype', - '1.2.840.113533.7.65.0' => 'entrustVersInfo', - '2.16.840.1.113733.1.6.9' => 'verisignPrivate', - // for Certificate Signing Requests - // see http://tools.ietf.org/html/rfc2985 - '1.2.840.113549.1.9.2' => 'pkcs-9-at-unstructuredName', // PKCS #9 unstructured name - '1.2.840.113549.1.9.7' => 'pkcs-9-at-challengePassword', // Challenge password for certificate revocations - '1.2.840.113549.1.9.14' => 'pkcs-9-at-extensionRequest' // Certificate extension request - ); - } - - /** - * Load X.509 certificate - * - * Returns an associative array describing the X.509 cert or a false if the cert failed to load - * - * @param String $cert - * @access public - * @return Mixed - */ - function loadX509($cert) - { - if (is_array($cert) && isset($cert['tbsCertificate'])) { - unset($this->currentCert); - unset($this->currentKeyIdentifier); - $this->dn = $cert['tbsCertificate']['subject']; - if (!isset($this->dn)) { - return false; - } - $this->currentCert = $cert; - - $currentKeyIdentifier = $this->getExtension('id-ce-subjectKeyIdentifier'); - $this->currentKeyIdentifier = is_string($currentKeyIdentifier) ? $currentKeyIdentifier : null; - - unset($this->signatureSubject); - - return $cert; - } - - $asn1 = new File_ASN1(); - - $cert = $this->_extractBER($cert); - - if ($cert === false) { - $this->currentCert = false; - return false; - } - - $asn1->loadOIDs($this->oids); - $decoded = $asn1->decodeBER($cert); - - if (!empty($decoded)) { - $x509 = $asn1->asn1map($decoded[0], $this->Certificate); - } - if (!isset($x509) || $x509 === false) { - $this->currentCert = false; - return false; - } - - $this->signatureSubject = substr($cert, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); - - $this->_mapInExtensions($x509, 'tbsCertificate/extensions', $asn1); - - $key = &$x509['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']; - $key = $this->_reformatKey($x509['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'], $key); - - $this->currentCert = $x509; - $this->dn = $x509['tbsCertificate']['subject']; - - $currentKeyIdentifier = $this->getExtension('id-ce-subjectKeyIdentifier'); - $this->currentKeyIdentifier = is_string($currentKeyIdentifier) ? $currentKeyIdentifier : null; - - return $x509; - } - - /** - * Save X.509 certificate - * - * @param Array $cert - * @param Integer $format optional - * @access public - * @return String - */ - function saveX509($cert, $format = FILE_X509_FORMAT_PEM) - { - if (!is_array($cert) || !isset($cert['tbsCertificate'])) { - return false; - } - - switch (true) { - // "case !$a: case !$b: break; default: whatever();" is the same thing as "if ($a && $b) whatever()" - case !($algorithm = $this->_subArray($cert, 'tbsCertificate/subjectPublicKeyInfo/algorithm/algorithm')): - case is_object($cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']): - break; - default: - switch ($algorithm) { - case 'rsaEncryption': - $cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'] - = base64_encode("\0" . base64_decode(preg_replace('#-.+-|[\r\n]#', '', $cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']))); - } - } - - $asn1 = new File_ASN1(); - $asn1->loadOIDs($this->oids); - - $filters = array(); - $type_utf8_string = array('type' => FILE_ASN1_TYPE_UTF8_STRING); - $filters['tbsCertificate']['signature']['parameters'] = $type_utf8_string; - $filters['tbsCertificate']['signature']['issuer']['rdnSequence']['value'] = $type_utf8_string; - $filters['tbsCertificate']['issuer']['rdnSequence']['value'] = $type_utf8_string; - $filters['tbsCertificate']['subject']['rdnSequence']['value'] = $type_utf8_string; - $filters['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['parameters'] = $type_utf8_string; - $filters['signatureAlgorithm']['parameters'] = $type_utf8_string; - $filters['authorityCertIssuer']['directoryName']['rdnSequence']['value'] = $type_utf8_string; - //$filters['policyQualifiers']['qualifier'] = $type_utf8_string; - $filters['distributionPoint']['fullName']['directoryName']['rdnSequence']['value'] = $type_utf8_string; - $filters['directoryName']['rdnSequence']['value'] = $type_utf8_string; - - /* in the case of policyQualifiers/qualifier, the type has to be FILE_ASN1_TYPE_IA5_STRING. - FILE_ASN1_TYPE_PRINTABLE_STRING will cause OpenSSL's X.509 parser to spit out random - characters. - */ - $filters['policyQualifiers']['qualifier'] - = array('type' => FILE_ASN1_TYPE_IA5_STRING); - - $asn1->loadFilters($filters); - - $this->_mapOutExtensions($cert, 'tbsCertificate/extensions', $asn1); - - $cert = $asn1->encodeDER($cert, $this->Certificate); - - switch ($format) { - case FILE_X509_FORMAT_DER: - return $cert; - // case FILE_X509_FORMAT_PEM: - default: - return "-----BEGIN CERTIFICATE-----\r\n" . chunk_split(base64_encode($cert), 64) . '-----END CERTIFICATE-----'; - } - } - - /** - * Map extension values from octet string to extension-specific internal - * format. - * - * @param Array ref $root - * @param String $path - * @param Object $asn1 - * @access private - */ - function _mapInExtensions(&$root, $path, $asn1) - { - $extensions = &$this->_subArray($root, $path); - - if (is_array($extensions)) { - for ($i = 0; $i < count($extensions); $i++) { - $id = $extensions[$i]['extnId']; - $value = &$extensions[$i]['extnValue']; - $value = base64_decode($value); - $decoded = $asn1->decodeBER($value); - /* [extnValue] contains the DER encoding of an ASN.1 value - corresponding to the extension type identified by extnID */ - $map = $this->_getMapping($id); - if (!is_bool($map)) { - $mapped = $asn1->asn1map($decoded[0], $map, array('iPAddress' => array($this, '_decodeIP'))); - $value = $mapped === false ? $decoded[0] : $mapped; - - if ($id == 'id-ce-certificatePolicies') { - for ($j = 0; $j < count($value); $j++) { - if (!isset($value[$j]['policyQualifiers'])) { - continue; - } - for ($k = 0; $k < count($value[$j]['policyQualifiers']); $k++) { - $subid = $value[$j]['policyQualifiers'][$k]['policyQualifierId']; - $map = $this->_getMapping($subid); - $subvalue = &$value[$j]['policyQualifiers'][$k]['qualifier']; - if ($map !== false) { - $decoded = $asn1->decodeBER($subvalue); - $mapped = $asn1->asn1map($decoded[0], $map); - $subvalue = $mapped === false ? $decoded[0] : $mapped; - } - } - } - } - } elseif ($map) { - $value = base64_encode($value); - } - } - } - } - - /** - * Map extension values from extension-specific internal format to - * octet string. - * - * @param Array ref $root - * @param String $path - * @param Object $asn1 - * @access private - */ - function _mapOutExtensions(&$root, $path, $asn1) - { - $extensions = &$this->_subArray($root, $path); - - if (is_array($extensions)) { - $size = count($extensions); - for ($i = 0; $i < $size; $i++) { - $id = $extensions[$i]['extnId']; - $value = &$extensions[$i]['extnValue']; - - switch ($id) { - case 'id-ce-certificatePolicies': - for ($j = 0; $j < count($value); $j++) { - if (!isset($value[$j]['policyQualifiers'])) { - continue; - } - for ($k = 0; $k < count($value[$j]['policyQualifiers']); $k++) { - $subid = $value[$j]['policyQualifiers'][$k]['policyQualifierId']; - $map = $this->_getMapping($subid); - $subvalue = &$value[$j]['policyQualifiers'][$k]['qualifier']; - if ($map !== false) { - // by default File_ASN1 will try to render qualifier as a FILE_ASN1_TYPE_IA5_STRING since it's - // actual type is FILE_ASN1_TYPE_ANY - $subvalue = new File_ASN1_Element($asn1->encodeDER($subvalue, $map)); - } - } - } - break; - case 'id-ce-authorityKeyIdentifier': // use 00 as the serial number instead of an empty string - if (isset($value['authorityCertSerialNumber'])) { - if ($value['authorityCertSerialNumber']->toBytes() == '') { - $temp = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | 2) . "\1\0"; - $value['authorityCertSerialNumber'] = new File_ASN1_Element($temp); - } - } - } - - /* [extnValue] contains the DER encoding of an ASN.1 value - corresponding to the extension type identified by extnID */ - $map = $this->_getMapping($id); - if (is_bool($map)) { - if (!$map) { - user_error($id . ' is not a currently supported extension'); - unset($extensions[$i]); - } - } else { - $temp = $asn1->encodeDER($value, $map, array('iPAddress' => array($this, '_encodeIP'))); - $value = base64_encode($temp); - } - } - } - } - - /** - * Map attribute values from ANY type to attribute-specific internal - * format. - * - * @param Array ref $root - * @param String $path - * @param Object $asn1 - * @access private - */ - function _mapInAttributes(&$root, $path, $asn1) - { - $attributes = &$this->_subArray($root, $path); - - if (is_array($attributes)) { - for ($i = 0; $i < count($attributes); $i++) { - $id = $attributes[$i]['type']; - /* $value contains the DER encoding of an ASN.1 value - corresponding to the attribute type identified by type */ - $map = $this->_getMapping($id); - if (is_array($attributes[$i]['value'])) { - $values = &$attributes[$i]['value']; - for ($j = 0; $j < count($values); $j++) { - $value = $asn1->encodeDER($values[$j], $this->AttributeValue); - $decoded = $asn1->decodeBER($value); - if (!is_bool($map)) { - $mapped = $asn1->asn1map($decoded[0], $map); - if ($mapped !== false) { - $values[$j] = $mapped; - } - if ($id == 'pkcs-9-at-extensionRequest') { - $this->_mapInExtensions($values, $j, $asn1); - } - } elseif ($map) { - $values[$j] = base64_encode($value); - } - } - } - } - } - } - - /** - * Map attribute values from attribute-specific internal format to - * ANY type. - * - * @param Array ref $root - * @param String $path - * @param Object $asn1 - * @access private - */ - function _mapOutAttributes(&$root, $path, $asn1) - { - $attributes = &$this->_subArray($root, $path); - - if (is_array($attributes)) { - $size = count($attributes); - for ($i = 0; $i < $size; $i++) { - /* [value] contains the DER encoding of an ASN.1 value - corresponding to the attribute type identified by type */ - $id = $attributes[$i]['type']; - $map = $this->_getMapping($id); - if ($map === false) { - user_error($id . ' is not a currently supported attribute', E_USER_NOTICE); - unset($attributes[$i]); - } elseif (is_array($attributes[$i]['value'])) { - $values = &$attributes[$i]['value']; - for ($j = 0; $j < count($values); $j++) { - switch ($id) { - case 'pkcs-9-at-extensionRequest': - $this->_mapOutExtensions($values, $j, $asn1); - break; - } - - if (!is_bool($map)) { - $temp = $asn1->encodeDER($values[$j], $map); - $decoded = $asn1->decodeBER($temp); - $values[$j] = $asn1->asn1map($decoded[0], $this->AttributeValue); - } - } - } - } - } - } - - /** - * Associate an extension ID to an extension mapping - * - * @param String $extnId - * @access private - * @return Mixed - */ - function _getMapping($extnId) - { - if (!is_string($extnId)) { // eg. if it's a File_ASN1_Element object - return true; - } - - switch ($extnId) { - case 'id-ce-keyUsage': - return $this->KeyUsage; - case 'id-ce-basicConstraints': - return $this->BasicConstraints; - case 'id-ce-subjectKeyIdentifier': - return $this->KeyIdentifier; - case 'id-ce-cRLDistributionPoints': - return $this->CRLDistributionPoints; - case 'id-ce-authorityKeyIdentifier': - return $this->AuthorityKeyIdentifier; - case 'id-ce-certificatePolicies': - return $this->CertificatePolicies; - case 'id-ce-extKeyUsage': - return $this->ExtKeyUsageSyntax; - case 'id-pe-authorityInfoAccess': - return $this->AuthorityInfoAccessSyntax; - case 'id-ce-subjectAltName': - return $this->SubjectAltName; - case 'id-ce-privateKeyUsagePeriod': - return $this->PrivateKeyUsagePeriod; - case 'id-ce-issuerAltName': - return $this->IssuerAltName; - case 'id-ce-policyMappings': - return $this->PolicyMappings; - case 'id-ce-nameConstraints': - return $this->NameConstraints; - - case 'netscape-cert-type': - return $this->netscape_cert_type; - case 'netscape-comment': - return $this->netscape_comment; - case 'netscape-ca-policy-url': - return $this->netscape_ca_policy_url; - - // since id-qt-cps isn't a constructed type it will have already been decoded as a string by the time it gets - // back around to asn1map() and we don't want it decoded again. - //case 'id-qt-cps': - // return $this->CPSuri; - case 'id-qt-unotice': - return $this->UserNotice; - - // the following OIDs are unsupported but we don't want them to give notices when calling saveX509(). - case 'id-pe-logotype': // http://www.ietf.org/rfc/rfc3709.txt - case 'entrustVersInfo': - // http://support.microsoft.com/kb/287547 - case '1.3.6.1.4.1.311.20.2': // szOID_ENROLL_CERTTYPE_EXTENSION - case '1.3.6.1.4.1.311.21.1': // szOID_CERTSRV_CA_VERSION - // "SET Secure Electronic Transaction Specification" - // http://www.maithean.com/docs/set_bk3.pdf - case '2.23.42.7.0': // id-set-hashedRootKey - return true; - - // CSR attributes - case 'pkcs-9-at-unstructuredName': - return $this->PKCS9String; - case 'pkcs-9-at-challengePassword': - return $this->DirectoryString; - case 'pkcs-9-at-extensionRequest': - return $this->Extensions; - - // CRL extensions. - case 'id-ce-cRLNumber': - return $this->CRLNumber; - case 'id-ce-deltaCRLIndicator': - return $this->CRLNumber; - case 'id-ce-issuingDistributionPoint': - return $this->IssuingDistributionPoint; - case 'id-ce-freshestCRL': - return $this->CRLDistributionPoints; - case 'id-ce-cRLReasons': - return $this->CRLReason; - case 'id-ce-invalidityDate': - return $this->InvalidityDate; - case 'id-ce-certificateIssuer': - return $this->CertificateIssuer; - case 'id-ce-holdInstructionCode': - return $this->HoldInstructionCode; - } - - return false; - } - - /** - * Load an X.509 certificate as a certificate authority - * - * @param String $cert - * @access public - * @return Boolean - */ - function loadCA($cert) - { - $olddn = $this->dn; - $oldcert = $this->currentCert; - $oldsigsubj = $this->signatureSubject; - $oldkeyid = $this->currentKeyIdentifier; - - $cert = $this->loadX509($cert); - if (!$cert) { - $this->dn = $olddn; - $this->currentCert = $oldcert; - $this->signatureSubject = $oldsigsubj; - $this->currentKeyIdentifier = $oldkeyid; - - return false; - } - - /* From RFC5280 "PKIX Certificate and CRL Profile": - - If the keyUsage extension is present, then the subject public key - MUST NOT be used to verify signatures on certificates or CRLs unless - the corresponding keyCertSign or cRLSign bit is set. */ - //$keyUsage = $this->getExtension('id-ce-keyUsage'); - //if ($keyUsage && !in_array('keyCertSign', $keyUsage)) { - // return false; - //} - - /* From RFC5280 "PKIX Certificate and CRL Profile": - - The cA boolean indicates whether the certified public key may be used - to verify certificate signatures. If the cA boolean is not asserted, - then the keyCertSign bit in the key usage extension MUST NOT be - asserted. If the basic constraints extension is not present in a - version 3 certificate, or the extension is present but the cA boolean - is not asserted, then the certified public key MUST NOT be used to - verify certificate signatures. */ - //$basicConstraints = $this->getExtension('id-ce-basicConstraints'); - //if (!$basicConstraints || !$basicConstraints['cA']) { - // return false; - //} - - $this->CAs[] = $cert; - - $this->dn = $olddn; - $this->currentCert = $oldcert; - $this->signatureSubject = $oldsigsubj; - - return true; - } - - /** - * Validate an X.509 certificate against a URL - * - * From RFC2818 "HTTP over TLS": - * - * Matching is performed using the matching rules specified by - * [RFC2459]. If more than one identity of a given type is present in - * the certificate (e.g., more than one dNSName name, a match in any one - * of the set is considered acceptable.) Names may contain the wildcard - * character * which is considered to match any single domain name - * component or component fragment. E.g., *.a.com matches foo.a.com but - * not bar.foo.a.com. f*.com matches foo.com but not bar.com. - * - * @param String $url - * @access public - * @return Boolean - */ - function validateURL($url) - { - if (!is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { - return false; - } - - $components = parse_url($url); - if (!isset($components['host'])) { - return false; - } - - if ($names = $this->getExtension('id-ce-subjectAltName')) { - foreach ($names as $key => $value) { - $value = str_replace(array('.', '*'), array('\.', '[^.]*'), $value); - switch ($key) { - case 'dNSName': - /* From RFC2818 "HTTP over TLS": - - If a subjectAltName extension of type dNSName is present, that MUST - be used as the identity. Otherwise, the (most specific) Common Name - field in the Subject field of the certificate MUST be used. Although - the use of the Common Name is existing practice, it is deprecated and - Certification Authorities are encouraged to use the dNSName instead. */ - if (preg_match('#^' . $value . '$#', $components['host'])) { - return true; - } - break; - case 'iPAddress': - /* From RFC2818 "HTTP over TLS": - - In some cases, the URI is specified as an IP address rather than a - hostname. In this case, the iPAddress subjectAltName must be present - in the certificate and must exactly match the IP in the URI. */ - if (preg_match('#(?:\d{1-3}\.){4}#', $components['host'] . '.') && preg_match('#^' . $value . '$#', $components['host'])) { - return true; - } - } - } - return false; - } - - if ($value = $this->getDNProp('id-at-commonName')) { - $value = str_replace(array('.', '*'), array('\.', '[^.]*'), $value[0]); - return preg_match('#^' . $value . '$#', $components['host']); - } - - return false; - } - - /** - * Validate a date - * - * If $date isn't defined it is assumed to be the current date. - * - * @param Integer $date optional - * @access public - */ - function validateDate($date = null) - { - if (!is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { - return false; - } - - if (!isset($date)) { - $date = time(); - } - - $notBefore = $this->currentCert['tbsCertificate']['validity']['notBefore']; - $notBefore = isset($notBefore['generalTime']) ? $notBefore['generalTime'] : $notBefore['utcTime']; - - $notAfter = $this->currentCert['tbsCertificate']['validity']['notAfter']; - $notAfter = isset($notAfter['generalTime']) ? $notAfter['generalTime'] : $notAfter['utcTime']; - - switch (true) { - case $date < @strtotime($notBefore): - case $date > @strtotime($notAfter): - return false; - } - - return true; - } - - /** - * Validate a signature - * - * Works on X.509 certs, CSR's and CRL's. - * Returns true if the signature is verified, false if it is not correct or null on error - * - * By default returns false for self-signed certs. Call validateSignature(false) to make this support - * self-signed. - * - * The behavior of this function is inspired by {@link http://php.net/openssl-verify openssl_verify}. - * - * @param Boolean $caonly optional - * @access public - * @return Mixed - */ - function validateSignature($caonly = true) - { - if (!is_array($this->currentCert) || !isset($this->signatureSubject)) { - return null; - } - - /* TODO: - "emailAddress attribute values are not case-sensitive (e.g., "subscriber@example.com" is the same as "SUBSCRIBER@EXAMPLE.COM")." - -- http://tools.ietf.org/html/rfc5280#section-4.1.2.6 - - implement pathLenConstraint in the id-ce-basicConstraints extension */ - - switch (true) { - case isset($this->currentCert['tbsCertificate']): - // self-signed cert - if ($this->currentCert['tbsCertificate']['issuer'] === $this->currentCert['tbsCertificate']['subject']) { - $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier'); - $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier'); - switch (true) { - case !is_array($authorityKey): - case is_array($authorityKey) && isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: - $signingCert = $this->currentCert; // working cert - } - } - - if (!empty($this->CAs)) { - for ($i = 0; $i < count($this->CAs); $i++) { - // even if the cert is a self-signed one we still want to see if it's a CA; - // if not, we'll conditionally return an error - $ca = $this->CAs[$i]; - if ($this->currentCert['tbsCertificate']['issuer'] === $ca['tbsCertificate']['subject']) { - $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier'); - $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca); - switch (true) { - case !is_array($authorityKey): - case is_array($authorityKey) && isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: - $signingCert = $ca; // working cert - break 2; - } - } - } - if (count($this->CAs) == $i && $caonly) { - return false; - } - } elseif (!isset($signingCert) || $caonly) { - return false; - } - return $this->_validateSignature( - $signingCert['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'], - $signingCert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], - $this->currentCert['signatureAlgorithm']['algorithm'], - substr(base64_decode($this->currentCert['signature']), 1), - $this->signatureSubject - ); - case isset($this->currentCert['certificationRequestInfo']): - return $this->_validateSignature( - $this->currentCert['certificationRequestInfo']['subjectPKInfo']['algorithm']['algorithm'], - $this->currentCert['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'], - $this->currentCert['signatureAlgorithm']['algorithm'], - substr(base64_decode($this->currentCert['signature']), 1), - $this->signatureSubject - ); - case isset($this->currentCert['publicKeyAndChallenge']): - return $this->_validateSignature( - $this->currentCert['publicKeyAndChallenge']['spki']['algorithm']['algorithm'], - $this->currentCert['publicKeyAndChallenge']['spki']['subjectPublicKey'], - $this->currentCert['signatureAlgorithm']['algorithm'], - substr(base64_decode($this->currentCert['signature']), 1), - $this->signatureSubject - ); - case isset($this->currentCert['tbsCertList']): - if (!empty($this->CAs)) { - for ($i = 0; $i < count($this->CAs); $i++) { - $ca = $this->CAs[$i]; - if ($this->currentCert['tbsCertList']['issuer'] === $ca['tbsCertificate']['subject']) { - $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier'); - $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca); - switch (true) { - case !is_array($authorityKey): - case is_array($authorityKey) && isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: - $signingCert = $ca; // working cert - break 2; - } - } - } - } - if (!isset($signingCert)) { - return false; - } - return $this->_validateSignature( - $signingCert['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'], - $signingCert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], - $this->currentCert['signatureAlgorithm']['algorithm'], - substr(base64_decode($this->currentCert['signature']), 1), - $this->signatureSubject - ); - default: - return false; - } - } - - /** - * Validates a signature - * - * Returns true if the signature is verified, false if it is not correct or null on error - * - * @param String $publicKeyAlgorithm - * @param String $publicKey - * @param String $signatureAlgorithm - * @param String $signature - * @param String $signatureSubject - * @access private - * @return Integer - */ - function _validateSignature($publicKeyAlgorithm, $publicKey, $signatureAlgorithm, $signature, $signatureSubject) - { - switch ($publicKeyAlgorithm) { - case 'rsaEncryption': - if (!class_exists('Crypt_RSA')) { - include_once 'Crypt/RSA.php'; - } - $rsa = new Crypt_RSA(); - $rsa->loadKey($publicKey); - - switch ($signatureAlgorithm) { - case 'md2WithRSAEncryption': - case 'md5WithRSAEncryption': - case 'sha1WithRSAEncryption': - case 'sha224WithRSAEncryption': - case 'sha256WithRSAEncryption': - case 'sha384WithRSAEncryption': - case 'sha512WithRSAEncryption': - $rsa->setHash(preg_replace('#WithRSAEncryption$#', '', $signatureAlgorithm)); - $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); - if (!@$rsa->verify($signatureSubject, $signature)) { - return false; - } - break; - default: - return null; - } - break; - default: - return null; - } - - return true; - } - - /** - * Reformat public keys - * - * Reformats a public key to a format supported by phpseclib (if applicable) - * - * @param String $algorithm - * @param String $key - * @access private - * @return String - */ - function _reformatKey($algorithm, $key) - { - switch ($algorithm) { - case 'rsaEncryption': - return - "-----BEGIN RSA PUBLIC KEY-----\r\n" . - // subjectPublicKey is stored as a bit string in X.509 certs. the first byte of a bit string represents how many bits - // in the last byte should be ignored. the following only supports non-zero stuff but as none of the X.509 certs Firefox - // uses as a cert authority actually use a non-zero bit I think it's safe to assume that none do. - chunk_split(base64_encode(substr(base64_decode($key), 1)), 64) . - '-----END RSA PUBLIC KEY-----'; - default: - return $key; - } - } - - /** - * Decodes an IP address - * - * Takes in a base64 encoded "blob" and returns a human readable IP address - * - * @param String $ip - * @access private - * @return String - */ - function _decodeIP($ip) - { - $ip = base64_decode($ip); - list(, $ip) = unpack('N', $ip); - return long2ip($ip); - } - - /** - * Encodes an IP address - * - * Takes a human readable IP address into a base64-encoded "blob" - * - * @param String $ip - * @access private - * @return String - */ - function _encodeIP($ip) - { - return base64_encode(pack('N', ip2long($ip))); - } - - /** - * "Normalizes" a Distinguished Name property - * - * @param String $propName - * @access private - * @return Mixed - */ - function _translateDNProp($propName) - { - switch (strtolower($propName)) { - case 'id-at-countryname': - case 'countryname': - case 'c': - return 'id-at-countryName'; - case 'id-at-organizationname': - case 'organizationname': - case 'o': - return 'id-at-organizationName'; - case 'id-at-dnqualifier': - case 'dnqualifier': - return 'id-at-dnQualifier'; - case 'id-at-commonname': - case 'commonname': - case 'cn': - return 'id-at-commonName'; - case 'id-at-stateorprovincename': - case 'stateorprovincename': - case 'state': - case 'province': - case 'provincename': - case 'st': - return 'id-at-stateOrProvinceName'; - case 'id-at-localityname': - case 'localityname': - case 'l': - return 'id-at-localityName'; - case 'id-emailaddress': - case 'emailaddress': - return 'pkcs-9-at-emailAddress'; - case 'id-at-serialnumber': - case 'serialnumber': - return 'id-at-serialNumber'; - case 'id-at-postalcode': - case 'postalcode': - return 'id-at-postalCode'; - case 'id-at-streetaddress': - case 'streetaddress': - return 'id-at-streetAddress'; - case 'id-at-name': - case 'name': - return 'id-at-name'; - case 'id-at-givenname': - case 'givenname': - return 'id-at-givenName'; - case 'id-at-surname': - case 'surname': - case 'sn': - return 'id-at-surname'; - case 'id-at-initials': - case 'initials': - return 'id-at-initials'; - case 'id-at-generationqualifier': - case 'generationqualifier': - return 'id-at-generationQualifier'; - case 'id-at-organizationalunitname': - case 'organizationalunitname': - case 'ou': - return 'id-at-organizationalUnitName'; - case 'id-at-pseudonym': - case 'pseudonym': - return 'id-at-pseudonym'; - case 'id-at-title': - case 'title': - return 'id-at-title'; - case 'id-at-description': - case 'description': - return 'id-at-description'; - case 'id-at-role': - case 'role': - return 'id-at-role'; - case 'id-at-uniqueidentifier': - case 'uniqueidentifier': - case 'x500uniqueidentifier': - return 'id-at-uniqueIdentifier'; - default: - return false; - } - } - - /** - * Set a Distinguished Name property - * - * @param String $propName - * @param Mixed $propValue - * @param String $type optional - * @access public - * @return Boolean - */ - function setDNProp($propName, $propValue, $type = 'utf8String') - { - if (empty($this->dn)) { - $this->dn = array('rdnSequence' => array()); - } - - if (($propName = $this->_translateDNProp($propName)) === false) { - return false; - } - - foreach ((array) $propValue as $v) { - if (!is_array($v) && isset($type)) { - $v = array($type => $v); - } - $this->dn['rdnSequence'][] = array( - array( - 'type' => $propName, - 'value'=> $v - ) - ); - } - - return true; - } - - /** - * Remove Distinguished Name properties - * - * @param String $propName - * @access public - */ - function removeDNProp($propName) - { - if (empty($this->dn)) { - return; - } - - if (($propName = $this->_translateDNProp($propName)) === false) { - return; - } - - $dn = &$this->dn['rdnSequence']; - $size = count($dn); - for ($i = 0; $i < $size; $i++) { - if ($dn[$i][0]['type'] == $propName) { - unset($dn[$i]); - } - } - - $dn = array_values($dn); - } - - /** - * Get Distinguished Name properties - * - * @param String $propName - * @param Array $dn optional - * @param Boolean $withType optional - * @return Mixed - * @access public - */ - function getDNProp($propName, $dn = null, $withType = false) - { - if (!isset($dn)) { - $dn = $this->dn; - } - - if (empty($dn)) { - return false; - } - - if (($propName = $this->_translateDNProp($propName)) === false) { - return false; - } - - $dn = $dn['rdnSequence']; - $result = array(); - $asn1 = new File_ASN1(); - for ($i = 0; $i < count($dn); $i++) { - if ($dn[$i][0]['type'] == $propName) { - $v = $dn[$i][0]['value']; - if (!$withType && is_array($v)) { - foreach ($v as $type => $s) { - $type = array_search($type, $asn1->ANYmap, true); - if ($type !== false && isset($asn1->stringTypeSize[$type])) { - $s = $asn1->convert($s, $type); - if ($s !== false) { - $v = $s; - break; - } - } - } - if (is_array($v)) { - $v = array_pop($v); // Always strip data type. - } - } - $result[] = $v; - } - } - - return $result; - } - - /** - * Set a Distinguished Name - * - * @param Mixed $dn - * @param Boolean $merge optional - * @param String $type optional - * @access public - * @return Boolean - */ - function setDN($dn, $merge = false, $type = 'utf8String') - { - if (!$merge) { - $this->dn = null; - } - - if (is_array($dn)) { - if (isset($dn['rdnSequence'])) { - $this->dn = $dn; // No merge here. - return true; - } - - // handles stuff generated by openssl_x509_parse() - foreach ($dn as $prop => $value) { - if (!$this->setDNProp($prop, $value, $type)) { - return false; - } - } - return true; - } - - // handles everything else - $results = preg_split('#((?:^|, *|/)(?:C=|O=|OU=|CN=|L=|ST=|SN=|postalCode=|streetAddress=|emailAddress=|serialNumber=|organizationalUnitName=|title=|description=|role=|x500UniqueIdentifier=))#', $dn, -1, PREG_SPLIT_DELIM_CAPTURE); - for ($i = 1; $i < count($results); $i+=2) { - $prop = trim($results[$i], ', =/'); - $value = $results[$i + 1]; - if (!$this->setDNProp($prop, $value, $type)) { - return false; - } - } - - return true; - } - - /** - * Get the Distinguished Name for a certificates subject - * - * @param Mixed $format optional - * @param Array $dn optional - * @access public - * @return Boolean - */ - function getDN($format = FILE_X509_DN_ARRAY, $dn = null) - { - if (!isset($dn)) { - $dn = isset($this->currentCert['tbsCertList']) ? $this->currentCert['tbsCertList']['issuer'] : $this->dn; - } - - switch ((int) $format) { - case FILE_X509_DN_ARRAY: - return $dn; - case FILE_X509_DN_ASN1: - $asn1 = new File_ASN1(); - $asn1->loadOIDs($this->oids); - $filters = array(); - $filters['rdnSequence']['value'] = array('type' => FILE_ASN1_TYPE_UTF8_STRING); - $asn1->loadFilters($filters); - return $asn1->encodeDER($dn, $this->Name); - case FILE_X509_DN_OPENSSL: - $dn = $this->getDN(FILE_X509_DN_STRING, $dn); - if ($dn === false) { - return false; - } - $attrs = preg_split('#((?:^|, *|/)[a-z][a-z0-9]*=)#i', $dn, -1, PREG_SPLIT_DELIM_CAPTURE); - $dn = array(); - for ($i = 1; $i < count($attrs); $i += 2) { - $prop = trim($attrs[$i], ', =/'); - $value = $attrs[$i + 1]; - if (!isset($dn[$prop])) { - $dn[$prop] = $value; - } else { - $dn[$prop] = array_merge((array) $dn[$prop], array($value)); - } - } - return $dn; - case FILE_X509_DN_CANON: - // No SEQUENCE around RDNs and all string values normalized as - // trimmed lowercase UTF-8 with all spacing as one blank. - $asn1 = new File_ASN1(); - $asn1->loadOIDs($this->oids); - $filters = array(); - $filters['value'] = array('type' => FILE_ASN1_TYPE_UTF8_STRING); - $asn1->loadFilters($filters); - $result = ''; - foreach ($dn['rdnSequence'] as $rdn) { - foreach ($rdn as $i=>$attr) { - $attr = &$rdn[$i]; - if (is_array($attr['value'])) { - foreach ($attr['value'] as $type => $v) { - $type = array_search($type, $asn1->ANYmap, true); - if ($type !== false && isset($asn1->stringTypeSize[$type])) { - $v = $asn1->convert($v, $type); - if ($v !== false) { - $v = preg_replace('/\s+/', ' ', $v); - $attr['value'] = strtolower(trim($v)); - break; - } - } - } - } - } - $result .= $asn1->encodeDER($rdn, $this->RelativeDistinguishedName); - } - return $result; - case FILE_X509_DN_HASH: - $dn = $this->getDN(FILE_X509_DN_CANON, $dn); - if (!class_exists('Crypt_Hash')) { - include_once 'Crypt/Hash.php'; - } - $hash = new Crypt_Hash('sha1'); - $hash = $hash->hash($dn); - extract(unpack('Vhash', $hash)); - return strtolower(bin2hex(pack('N', $hash))); - } - - // Default is to return a string. - $start = true; - $output = ''; - $asn1 = new File_ASN1(); - foreach ($dn['rdnSequence'] as $field) { - $prop = $field[0]['type']; - $value = $field[0]['value']; - - $delim = ', '; - switch ($prop) { - case 'id-at-countryName': - $desc = 'C='; - break; - case 'id-at-stateOrProvinceName': - $desc = 'ST='; - break; - case 'id-at-organizationName': - $desc = 'O='; - break; - case 'id-at-organizationalUnitName': - $desc = 'OU='; - break; - case 'id-at-commonName': - $desc = 'CN='; - break; - case 'id-at-localityName': - $desc = 'L='; - break; - case 'id-at-surname': - $desc = 'SN='; - break; - case 'id-at-uniqueIdentifier': - $delim = '/'; - $desc = 'x500UniqueIdentifier='; - break; - default: - $delim = '/'; - $desc = preg_replace('#.+-([^-]+)$#', '$1', $prop) . '='; - } - - if (!$start) { - $output.= $delim; - } - if (is_array($value)) { - foreach ($value as $type => $v) { - $type = array_search($type, $asn1->ANYmap, true); - if ($type !== false && isset($asn1->stringTypeSize[$type])) { - $v = $asn1->convert($v, $type); - if ($v !== false) { - $value = $v; - break; - } - } - } - if (is_array($value)) { - $value = array_pop($value); // Always strip data type. - } - } - $output.= $desc . $value; - $start = false; - } - - return $output; - } - - /** - * Get the Distinguished Name for a certificate/crl issuer - * - * @param Integer $format optional - * @access public - * @return Mixed - */ - function getIssuerDN($format = FILE_X509_DN_ARRAY) - { - switch (true) { - case !isset($this->currentCert) || !is_array($this->currentCert): - break; - case isset($this->currentCert['tbsCertificate']): - return $this->getDN($format, $this->currentCert['tbsCertificate']['issuer']); - case isset($this->currentCert['tbsCertList']): - return $this->getDN($format, $this->currentCert['tbsCertList']['issuer']); - } - - return false; - } - - /** - * Get the Distinguished Name for a certificate/csr subject - * Alias of getDN() - * - * @param Integer $format optional - * @access public - * @return Mixed - */ - function getSubjectDN($format = FILE_X509_DN_ARRAY) - { - switch (true) { - case !empty($this->dn): - return $this->getDN($format); - case !isset($this->currentCert) || !is_array($this->currentCert): - break; - case isset($this->currentCert['tbsCertificate']): - return $this->getDN($format, $this->currentCert['tbsCertificate']['subject']); - case isset($this->currentCert['certificationRequestInfo']): - return $this->getDN($format, $this->currentCert['certificationRequestInfo']['subject']); - } - - return false; - } - - /** - * Get an individual Distinguished Name property for a certificate/crl issuer - * - * @param String $propName - * @param Boolean $withType optional - * @access public - * @return Mixed - */ - function getIssuerDNProp($propName, $withType = false) - { - switch (true) { - case !isset($this->currentCert) || !is_array($this->currentCert): - break; - case isset($this->currentCert['tbsCertificate']): - return $this->getDNProp($propName, $this->currentCert['tbsCertificate']['issuer'], $withType); - case isset($this->currentCert['tbsCertList']): - return $this->getDNProp($propName, $this->currentCert['tbsCertList']['issuer'], $withType); - } - - return false; - } - - /** - * Get an individual Distinguished Name property for a certificate/csr subject - * - * @param String $propName - * @param Boolean $withType optional - * @access public - * @return Mixed - */ - function getSubjectDNProp($propName, $withType = false) - { - switch (true) { - case !empty($this->dn): - return $this->getDNProp($propName, null, $withType); - case !isset($this->currentCert) || !is_array($this->currentCert): - break; - case isset($this->currentCert['tbsCertificate']): - return $this->getDNProp($propName, $this->currentCert['tbsCertificate']['subject'], $withType); - case isset($this->currentCert['certificationRequestInfo']): - return $this->getDNProp($propName, $this->currentCert['certificationRequestInfo']['subject'], $withType); - } - - return false; - } - - /** - * Get the certificate chain for the current cert - * - * @access public - * @return Mixed - */ - function getChain() - { - $chain = array($this->currentCert); - - if (!is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { - return false; - } - if (empty($this->CAs)) { - return $chain; - } - while (true) { - $currentCert = $chain[count($chain) - 1]; - for ($i = 0; $i < count($this->CAs); $i++) { - $ca = $this->CAs[$i]; - if ($currentCert['tbsCertificate']['issuer'] === $ca['tbsCertificate']['subject']) { - $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier', $currentCert); - $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca); - switch (true) { - case !is_array($authorityKey): - case is_array($authorityKey) && isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: - if ($currentCert === $ca) { - break 3; - } - $chain[] = $ca; - break 2; - } - } - } - if ($i == count($this->CAs)) { - break; - } - } - foreach ($chain as $key=>$value) { - $chain[$key] = new File_X509(); - $chain[$key]->loadX509($value); - } - return $chain; - } - - /** - * Set public key - * - * Key needs to be a Crypt_RSA object - * - * @param Object $key - * @access public - * @return Boolean - */ - function setPublicKey($key) - { - $key->setPublicKey(); - $this->publicKey = $key; - } - - /** - * Set private key - * - * Key needs to be a Crypt_RSA object - * - * @param Object $key - * @access public - */ - function setPrivateKey($key) - { - $this->privateKey = $key; - } - - /** - * Set challenge - * - * Used for SPKAC CSR's - * - * @param String $challenge - * @access public - */ - function setChallenge($challenge) - { - $this->challenge = $challenge; - } - - /** - * Gets the public key - * - * Returns a Crypt_RSA object or a false. - * - * @access public - * @return Mixed - */ - function getPublicKey() - { - if (isset($this->publicKey)) { - return $this->publicKey; - } - - if (isset($this->currentCert) && is_array($this->currentCert)) { - foreach (array('tbsCertificate/subjectPublicKeyInfo', 'certificationRequestInfo/subjectPKInfo') as $path) { - $keyinfo = $this->_subArray($this->currentCert, $path); - if (!empty($keyinfo)) { - break; - } - } - } - if (empty($keyinfo)) { - return false; - } - - $key = $keyinfo['subjectPublicKey']; - - switch ($keyinfo['algorithm']['algorithm']) { - case 'rsaEncryption': - if (!class_exists('Crypt_RSA')) { - include_once 'Crypt/RSA.php'; - } - $publicKey = new Crypt_RSA(); - $publicKey->loadKey($key); - $publicKey->setPublicKey(); - break; - default: - return false; - } - - return $publicKey; - } - - /** - * Load a Certificate Signing Request - * - * @param String $csr - * @access public - * @return Mixed - */ - function loadCSR($csr) - { - if (is_array($csr) && isset($csr['certificationRequestInfo'])) { - unset($this->currentCert); - unset($this->currentKeyIdentifier); - unset($this->signatureSubject); - $this->dn = $csr['certificationRequestInfo']['subject']; - if (!isset($this->dn)) { - return false; - } - - $this->currentCert = $csr; - return $csr; - } - - // see http://tools.ietf.org/html/rfc2986 - - $asn1 = new File_ASN1(); - - $csr = $this->_extractBER($csr); - $orig = $csr; - - if ($csr === false) { - $this->currentCert = false; - return false; - } - - $asn1->loadOIDs($this->oids); - $decoded = $asn1->decodeBER($csr); - - if (empty($decoded)) { - $this->currentCert = false; - return false; - } - - $csr = $asn1->asn1map($decoded[0], $this->CertificationRequest); - if (!isset($csr) || $csr === false) { - $this->currentCert = false; - return false; - } - - $this->dn = $csr['certificationRequestInfo']['subject']; - $this->_mapInAttributes($csr, 'certificationRequestInfo/attributes', $asn1); - - $this->signatureSubject = substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); - - $algorithm = &$csr['certificationRequestInfo']['subjectPKInfo']['algorithm']['algorithm']; - $key = &$csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']; - $key = $this->_reformatKey($algorithm, $key); - - switch ($algorithm) { - case 'rsaEncryption': - if (!class_exists('Crypt_RSA')) { - include_once 'Crypt/RSA.php'; - } - $this->publicKey = new Crypt_RSA(); - $this->publicKey->loadKey($key); - $this->publicKey->setPublicKey(); - break; - default: - $this->publicKey = null; - } - - $this->currentKeyIdentifier = null; - $this->currentCert = $csr; - - return $csr; - } - - /** - * Save CSR request - * - * @param Array $csr - * @param Integer $format optional - * @access public - * @return String - */ - function saveCSR($csr, $format = FILE_X509_FORMAT_PEM) - { - if (!is_array($csr) || !isset($csr['certificationRequestInfo'])) { - return false; - } - - switch (true) { - case !($algorithm = $this->_subArray($csr, 'certificationRequestInfo/subjectPKInfo/algorithm/algorithm')): - case is_object($csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']); - break; - default: - switch ($algorithm) { - case 'rsaEncryption': - $csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'] - = base64_encode("\0" . base64_decode(preg_replace('#-.+-|[\r\n]#', '', $csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']))); - } - } - - $asn1 = new File_ASN1(); - - $asn1->loadOIDs($this->oids); - - $filters = array(); - $filters['certificationRequestInfo']['subject']['rdnSequence']['value'] - = array('type' => FILE_ASN1_TYPE_UTF8_STRING); - - $asn1->loadFilters($filters); - - $this->_mapOutAttributes($csr, 'certificationRequestInfo/attributes', $asn1); - $csr = $asn1->encodeDER($csr, $this->CertificationRequest); - - switch ($format) { - case FILE_X509_FORMAT_DER: - return $csr; - // case FILE_X509_FORMAT_PEM: - default: - return "-----BEGIN CERTIFICATE REQUEST-----\r\n" . chunk_split(base64_encode($csr), 64) . '-----END CERTIFICATE REQUEST-----'; - } - } - - /** - * Load a SPKAC CSR - * - * SPKAC's are produced by the HTML5 keygen element: - * - * https://developer.mozilla.org/en-US/docs/HTML/Element/keygen - * - * @param String $csr - * @access public - * @return Mixed - */ - function loadSPKAC($spkac) - { - if (is_array($spkac) && isset($spkac['publicKeyAndChallenge'])) { - unset($this->currentCert); - unset($this->currentKeyIdentifier); - unset($this->signatureSubject); - $this->currentCert = $spkac; - return $spkac; - } - - // see http://www.w3.org/html/wg/drafts/html/master/forms.html#signedpublickeyandchallenge - - $asn1 = new File_ASN1(); - - // OpenSSL produces SPKAC's that are preceeded by the string SPKAC= - $temp = preg_replace('#(?:SPKAC=)|[ \r\n\\\]#', '', $spkac); - $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? base64_decode($temp) : false; - if ($temp != false) { - $spkac = $temp; - } - $orig = $spkac; - - if ($spkac === false) { - $this->currentCert = false; - return false; - } - - $asn1->loadOIDs($this->oids); - $decoded = $asn1->decodeBER($spkac); - - if (empty($decoded)) { - $this->currentCert = false; - return false; - } - - $spkac = $asn1->asn1map($decoded[0], $this->SignedPublicKeyAndChallenge); - - if (!isset($spkac) || $spkac === false) { - $this->currentCert = false; - return false; - } - - $this->signatureSubject = substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); - - $algorithm = &$spkac['publicKeyAndChallenge']['spki']['algorithm']['algorithm']; - $key = &$spkac['publicKeyAndChallenge']['spki']['subjectPublicKey']; - $key = $this->_reformatKey($algorithm, $key); - - switch ($algorithm) { - case 'rsaEncryption': - if (!class_exists('Crypt_RSA')) { - include_once 'Crypt/RSA.php'; - } - $this->publicKey = new Crypt_RSA(); - $this->publicKey->loadKey($key); - $this->publicKey->setPublicKey(); - break; - default: - $this->publicKey = null; - } - - $this->currentKeyIdentifier = null; - $this->currentCert = $spkac; - - return $spkac; - } - - /** - * Save a SPKAC CSR request - * - * @param Array $csr - * @param Integer $format optional - * @access public - * @return String - */ - function saveSPKAC($spkac, $format = FILE_X509_FORMAT_PEM) - { - if (!is_array($spkac) || !isset($spkac['publicKeyAndChallenge'])) { - return false; - } - - $algorithm = $this->_subArray($spkac, 'publicKeyAndChallenge/spki/algorithm/algorithm'); - switch (true) { - case !$algorithm: - case is_object($spkac['publicKeyAndChallenge']['spki']['subjectPublicKey']); - break; - default: - switch ($algorithm) { - case 'rsaEncryption': - $spkac['publicKeyAndChallenge']['spki']['subjectPublicKey'] - = base64_encode("\0" . base64_decode(preg_replace('#-.+-|[\r\n]#', '', $spkac['publicKeyAndChallenge']['spki']['subjectPublicKey']))); - } - } - - $asn1 = new File_ASN1(); - - $asn1->loadOIDs($this->oids); - $spkac = $asn1->encodeDER($spkac, $this->SignedPublicKeyAndChallenge); - - switch ($format) { - case FILE_X509_FORMAT_DER: - return $spkac; - // case FILE_X509_FORMAT_PEM: - default: - // OpenSSL's implementation of SPKAC requires the SPKAC be preceeded by SPKAC= and since there are pretty much - // no other SPKAC decoders phpseclib will use that same format - return 'SPKAC=' . base64_encode($spkac); - } - } - - /** - * Load a Certificate Revocation List - * - * @param String $crl - * @access public - * @return Mixed - */ - function loadCRL($crl) - { - if (is_array($crl) && isset($crl['tbsCertList'])) { - $this->currentCert = $crl; - unset($this->signatureSubject); - return $crl; - } - - $asn1 = new File_ASN1(); - - $crl = $this->_extractBER($crl); - $orig = $crl; - - if ($crl === false) { - $this->currentCert = false; - return false; - } - - $asn1->loadOIDs($this->oids); - $decoded = $asn1->decodeBER($crl); - - if (empty($decoded)) { - $this->currentCert = false; - return false; - } - - $crl = $asn1->asn1map($decoded[0], $this->CertificateList); - if (!isset($crl) || $crl === false) { - $this->currentCert = false; - return false; - } - - $this->signatureSubject = substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); - - $this->_mapInExtensions($crl, 'tbsCertList/crlExtensions', $asn1); - $rclist = &$this->_subArray($crl, 'tbsCertList/revokedCertificates'); - if (is_array($rclist)) { - foreach ($rclist as $i => $extension) { - $this->_mapInExtensions($rclist, "$i/crlEntryExtensions", $asn1); - } - } - - $this->currentKeyIdentifier = null; - $this->currentCert = $crl; - - return $crl; - } - - /** - * Save Certificate Revocation List. - * - * @param Array $crl - * @param Integer $format optional - * @access public - * @return String - */ - function saveCRL($crl, $format = FILE_X509_FORMAT_PEM) - { - if (!is_array($crl) || !isset($crl['tbsCertList'])) { - return false; - } - - $asn1 = new File_ASN1(); - - $asn1->loadOIDs($this->oids); - - $filters = array(); - $filters['tbsCertList']['issuer']['rdnSequence']['value'] - = array('type' => FILE_ASN1_TYPE_UTF8_STRING); - $filters['tbsCertList']['signature']['parameters'] - = array('type' => FILE_ASN1_TYPE_UTF8_STRING); - $filters['signatureAlgorithm']['parameters'] - = array('type' => FILE_ASN1_TYPE_UTF8_STRING); - - if (empty($crl['tbsCertList']['signature']['parameters'])) { - $filters['tbsCertList']['signature']['parameters'] - = array('type' => FILE_ASN1_TYPE_NULL); - } - - if (empty($crl['signatureAlgorithm']['parameters'])) { - $filters['signatureAlgorithm']['parameters'] - = array('type' => FILE_ASN1_TYPE_NULL); - } - - $asn1->loadFilters($filters); - - $this->_mapOutExtensions($crl, 'tbsCertList/crlExtensions', $asn1); - $rclist = &$this->_subArray($crl, 'tbsCertList/revokedCertificates'); - if (is_array($rclist)) { - foreach ($rclist as $i => $extension) { - $this->_mapOutExtensions($rclist, "$i/crlEntryExtensions", $asn1); - } - } - - $crl = $asn1->encodeDER($crl, $this->CertificateList); - - switch ($format) { - case FILE_X509_FORMAT_DER: - return $crl; - // case FILE_X509_FORMAT_PEM: - default: - return "-----BEGIN X509 CRL-----\r\n" . chunk_split(base64_encode($crl), 64) . '-----END X509 CRL-----'; - } - } - - /** - * Helper function to build a time field according to RFC 3280 section - * - 4.1.2.5 Validity - * - 5.1.2.4 This Update - * - 5.1.2.5 Next Update - * - 5.1.2.6 Revoked Certificates - * by choosing utcTime iff year of date given is before 2050 and generalTime else. - * - * @param String $date in format date('D, d M Y H:i:s O') - * @access private - * @return Array - */ - function _timeField($date) - { - $year = @gmdate("Y", @strtotime($date)); // the same way ASN1.php parses this - if ($year < 2050) { - return array('utcTime' => $date); - } else { - return array('generalTime' => $date); - } - } - - /** - * Sign an X.509 certificate - * - * $issuer's private key needs to be loaded. - * $subject can be either an existing X.509 cert (if you want to resign it), - * a CSR or something with the DN and public key explicitly set. - * - * @param File_X509 $issuer - * @param File_X509 $subject - * @param String $signatureAlgorithm optional - * @access public - * @return Mixed - */ - function sign($issuer, $subject, $signatureAlgorithm = 'sha1WithRSAEncryption') - { - if (!is_object($issuer->privateKey) || empty($issuer->dn)) { - return false; - } - - if (isset($subject->publicKey) && !($subjectPublicKey = $subject->_formatSubjectPublicKey())) { - return false; - } - - $currentCert = isset($this->currentCert) ? $this->currentCert : null; - $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject: null; - - if (isset($subject->currentCert) && is_array($subject->currentCert) && isset($subject->currentCert['tbsCertificate'])) { - $this->currentCert = $subject->currentCert; - $this->currentCert['tbsCertificate']['signature']['algorithm'] = $signatureAlgorithm; - $this->currentCert['signatureAlgorithm']['algorithm'] = $signatureAlgorithm; - - if (!empty($this->startDate)) { - $this->currentCert['tbsCertificate']['validity']['notBefore'] = $this->_timeField($this->startDate); - } - if (!empty($this->endDate)) { - $this->currentCert['tbsCertificate']['validity']['notAfter'] = $this->_timeField($this->endDate); - } - if (!empty($this->serialNumber)) { - $this->currentCert['tbsCertificate']['serialNumber'] = $this->serialNumber; - } - if (!empty($subject->dn)) { - $this->currentCert['tbsCertificate']['subject'] = $subject->dn; - } - if (!empty($subject->publicKey)) { - $this->currentCert['tbsCertificate']['subjectPublicKeyInfo'] = $subjectPublicKey; - } - $this->removeExtension('id-ce-authorityKeyIdentifier'); - if (isset($subject->domains)) { - $this->removeExtension('id-ce-subjectAltName'); - } - } else if (isset($subject->currentCert) && is_array($subject->currentCert) && isset($subject->currentCert['tbsCertList'])) { - return false; - } else { - if (!isset($subject->publicKey)) { - return false; - } - - $startDate = !empty($this->startDate) ? $this->startDate : @date('D, d M Y H:i:s O'); - $endDate = !empty($this->endDate) ? $this->endDate : @date('D, d M Y H:i:s O', strtotime('+1 year')); - $serialNumber = !empty($this->serialNumber) ? $this->serialNumber : new Math_BigInteger(); - - $this->currentCert = array( - 'tbsCertificate' => - array( - 'version' => 'v3', - 'serialNumber' => $serialNumber, // $this->setserialNumber() - 'signature' => array('algorithm' => $signatureAlgorithm), - 'issuer' => false, // this is going to be overwritten later - 'validity' => array( - 'notBefore' => $this->_timeField($startDate), // $this->setStartDate() - 'notAfter' => $this->_timeField($endDate) // $this->setEndDate() - ), - 'subject' => $subject->dn, - 'subjectPublicKeyInfo' => $subjectPublicKey - ), - 'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm), - 'signature' => false // this is going to be overwritten later - ); - - // Copy extensions from CSR. - $csrexts = $subject->getAttribute('pkcs-9-at-extensionRequest', 0); - - if (!empty($csrexts)) { - $this->currentCert['tbsCertificate']['extensions'] = $csrexts; - } - } - - $this->currentCert['tbsCertificate']['issuer'] = $issuer->dn; - - if (isset($issuer->currentKeyIdentifier)) { - $this->setExtension('id-ce-authorityKeyIdentifier', array( - //'authorityCertIssuer' => array( - // array( - // 'directoryName' => $issuer->dn - // ) - //), - 'keyIdentifier' => $issuer->currentKeyIdentifier - ) - ); - //$extensions = &$this->currentCert['tbsCertificate']['extensions']; - //if (isset($issuer->serialNumber)) { - // $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber; - //} - //unset($extensions); - } - - if (isset($subject->currentKeyIdentifier)) { - $this->setExtension('id-ce-subjectKeyIdentifier', $subject->currentKeyIdentifier); - } - - $altName = array(); - - if (isset($subject->domains) && count($subject->domains) > 1) { - $altName = array_map(array('File_X509', '_dnsName'), $subject->domains); - } - - if (isset($subject->ipAddresses) && count($subject->ipAddresses)) { - // should an IP address appear as the CN if no domain name is specified? idk - //$ips = count($subject->domains) ? $subject->ipAddresses : array_slice($subject->ipAddresses, 1); - $ipAddresses = array(); - foreach ($subject->ipAddresses as $ipAddress) { - $encoded = $subject->_ipAddress($ipAddress); - if ($encoded !== false) { - $ipAddresses[] = $encoded; - } - } - if (count($ipAddresses)) { - $altName = array_merge($altName, $ipAddresses); - } - } - - if (!empty($altName)) { - $this->setExtension('id-ce-subjectAltName', $altName); - } - - if ($this->caFlag) { - $keyUsage = $this->getExtension('id-ce-keyUsage'); - if (!$keyUsage) { - $keyUsage = array(); - } - - $this->setExtension('id-ce-keyUsage', - array_values(array_unique(array_merge($keyUsage, array('cRLSign', 'keyCertSign')))) - ); - - $basicConstraints = $this->getExtension('id-ce-basicConstraints'); - if (!$basicConstraints) { - $basicConstraints = array(); - } - - $this->setExtension('id-ce-basicConstraints', - array_unique(array_merge(array('cA' => true), $basicConstraints)), true); - - if (!isset($subject->currentKeyIdentifier)) { - $this->setExtension('id-ce-subjectKeyIdentifier', base64_encode($this->computeKeyIdentifier($this->currentCert)), false, false); - } - } - - // resync $this->signatureSubject - // save $tbsCertificate in case there are any File_ASN1_Element objects in it - $tbsCertificate = $this->currentCert['tbsCertificate']; - $this->loadX509($this->saveX509($this->currentCert)); - - $result = $this->_sign($issuer->privateKey, $signatureAlgorithm); - $result['tbsCertificate'] = $tbsCertificate; - - $this->currentCert = $currentCert; - $this->signatureSubject = $signatureSubject; - - return $result; - } - - /** - * Sign a CSR - * - * @access public - * @return Mixed - */ - function signCSR($signatureAlgorithm = 'sha1WithRSAEncryption') - { - if (!is_object($this->privateKey) || empty($this->dn)) { - return false; - } - - $origPublicKey = $this->publicKey; - $class = get_class($this->privateKey); - $this->publicKey = new $class(); - $this->publicKey->loadKey($this->privateKey->getPublicKey()); - $this->publicKey->setPublicKey(); - if (!($publicKey = $this->_formatSubjectPublicKey())) { - return false; - } - $this->publicKey = $origPublicKey; - - $currentCert = isset($this->currentCert) ? $this->currentCert : null; - $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject: null; - - if (isset($this->currentCert) && is_array($this->currentCert) && isset($this->currentCert['certificationRequestInfo'])) { - $this->currentCert['signatureAlgorithm']['algorithm'] = $signatureAlgorithm; - if (!empty($this->dn)) { - $this->currentCert['certificationRequestInfo']['subject'] = $this->dn; - } - $this->currentCert['certificationRequestInfo']['subjectPKInfo'] = $publicKey; - } else { - $this->currentCert = array( - 'certificationRequestInfo' => - array( - 'version' => 'v1', - 'subject' => $this->dn, - 'subjectPKInfo' => $publicKey - ), - 'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm), - 'signature' => false // this is going to be overwritten later - ); - } - - // resync $this->signatureSubject - // save $certificationRequestInfo in case there are any File_ASN1_Element objects in it - $certificationRequestInfo = $this->currentCert['certificationRequestInfo']; - $this->loadCSR($this->saveCSR($this->currentCert)); - - $result = $this->_sign($this->privateKey, $signatureAlgorithm); - $result['certificationRequestInfo'] = $certificationRequestInfo; - - $this->currentCert = $currentCert; - $this->signatureSubject = $signatureSubject; - - return $result; - } - - /** - * Sign a SPKAC - * - * @access public - * @return Mixed - */ - function signSPKAC($signatureAlgorithm = 'sha1WithRSAEncryption') - { - if (!is_object($this->privateKey)) { - return false; - } - - $origPublicKey = $this->publicKey; - $class = get_class($this->privateKey); - $this->publicKey = new $class(); - $this->publicKey->loadKey($this->privateKey->getPublicKey()); - $this->publicKey->setPublicKey(); - $publicKey = $this->_formatSubjectPublicKey(); - if (!$publicKey) { - return false; - } - $this->publicKey = $origPublicKey; - - $currentCert = isset($this->currentCert) ? $this->currentCert : null; - $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject: null; - - // re-signing a SPKAC seems silly but since everything else supports re-signing why not? - if (isset($this->currentCert) && is_array($this->currentCert) && isset($this->currentCert['publicKeyAndChallenge'])) { - $this->currentCert['signatureAlgorithm']['algorithm'] = $signatureAlgorithm; - $this->currentCert['publicKeyAndChallenge']['spki'] = $publicKey; - if (!empty($this->challenge)) { - // the bitwise AND ensures that the output is a valid IA5String - $this->currentCert['publicKeyAndChallenge']['challenge'] = $this->challenge & str_repeat("\x7F", strlen($this->challenge)); - } - } else { - $this->currentCert = array( - 'publicKeyAndChallenge' => - array( - 'spki' => $publicKey, - // quoting , - // "A challenge string that is submitted along with the public key. Defaults to an empty string if not specified." - // both Firefox and OpenSSL ("openssl spkac -key private.key") behave this way - // we could alternatively do this instead if we ignored the specs: - // crypt_random_string(8) & str_repeat("\x7F", 8) - 'challenge' => !empty($this->challenge) ? $this->challenge : '' - ), - 'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm), - 'signature' => false // this is going to be overwritten later - ); - } - - // resync $this->signatureSubject - // save $publicKeyAndChallenge in case there are any File_ASN1_Element objects in it - $publicKeyAndChallenge = $this->currentCert['publicKeyAndChallenge']; - $this->loadSPKAC($this->saveSPKAC($this->currentCert)); - - $result = $this->_sign($this->privateKey, $signatureAlgorithm); - $result['publicKeyAndChallenge'] = $publicKeyAndChallenge; - - $this->currentCert = $currentCert; - $this->signatureSubject = $signatureSubject; - - return $result; - } - - /** - * Sign a CRL - * - * $issuer's private key needs to be loaded. - * - * @param File_X509 $issuer - * @param File_X509 $crl - * @param String $signatureAlgorithm optional - * @access public - * @return Mixed - */ - function signCRL($issuer, $crl, $signatureAlgorithm = 'sha1WithRSAEncryption') - { - if (!is_object($issuer->privateKey) || empty($issuer->dn)) { - return false; - } - - $currentCert = isset($this->currentCert) ? $this->currentCert : null; - $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject : null; - $thisUpdate = !empty($this->startDate) ? $this->startDate : @date('D, d M Y H:i:s O'); - - if (isset($crl->currentCert) && is_array($crl->currentCert) && isset($crl->currentCert['tbsCertList'])) { - $this->currentCert = $crl->currentCert; - $this->currentCert['tbsCertList']['signature']['algorithm'] = $signatureAlgorithm; - $this->currentCert['signatureAlgorithm']['algorithm'] = $signatureAlgorithm; - } else { - $this->currentCert = array( - 'tbsCertList' => - array( - 'version' => 'v2', - 'signature' => array('algorithm' => $signatureAlgorithm), - 'issuer' => false, // this is going to be overwritten later - 'thisUpdate' => $this->_timeField($thisUpdate) // $this->setStartDate() - ), - 'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm), - 'signature' => false // this is going to be overwritten later - ); - } - - $tbsCertList = &$this->currentCert['tbsCertList']; - $tbsCertList['issuer'] = $issuer->dn; - $tbsCertList['thisUpdate'] = $this->_timeField($thisUpdate); - - if (!empty($this->endDate)) { - $tbsCertList['nextUpdate'] = $this->_timeField($this->endDate); // $this->setEndDate() - } else { - unset($tbsCertList['nextUpdate']); - } - - if (!empty($this->serialNumber)) { - $crlNumber = $this->serialNumber; - } else { - $crlNumber = $this->getExtension('id-ce-cRLNumber'); - $crlNumber = $crlNumber !== false ? $crlNumber->add(new Math_BigInteger(1)) : null; - } - - $this->removeExtension('id-ce-authorityKeyIdentifier'); - $this->removeExtension('id-ce-issuerAltName'); - - // Be sure version >= v2 if some extension found. - $version = isset($tbsCertList['version']) ? $tbsCertList['version'] : 0; - if (!$version) { - if (!empty($tbsCertList['crlExtensions'])) { - $version = 1; // v2. - } elseif (!empty($tbsCertList['revokedCertificates'])) { - foreach ($tbsCertList['revokedCertificates'] as $cert) { - if (!empty($cert['crlEntryExtensions'])) { - $version = 1; // v2. - } - } - } - - if ($version) { - $tbsCertList['version'] = $version; - } - } - - // Store additional extensions. - if (!empty($tbsCertList['version'])) { // At least v2. - if (!empty($crlNumber)) { - $this->setExtension('id-ce-cRLNumber', $crlNumber); - } - - if (isset($issuer->currentKeyIdentifier)) { - $this->setExtension('id-ce-authorityKeyIdentifier', array( - //'authorityCertIssuer' => array( - // array( - // 'directoryName' => $issuer->dn - // ) - //), - 'keyIdentifier' => $issuer->currentKeyIdentifier - ) - ); - //$extensions = &$tbsCertList['crlExtensions']; - //if (isset($issuer->serialNumber)) { - // $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber; - //} - //unset($extensions); - } - - $issuerAltName = $this->getExtension('id-ce-subjectAltName', $issuer->currentCert); - - if ($issuerAltName !== false) { - $this->setExtension('id-ce-issuerAltName', $issuerAltName); - } - } - - if (empty($tbsCertList['revokedCertificates'])) { - unset($tbsCertList['revokedCertificates']); - } - - unset($tbsCertList); - - // resync $this->signatureSubject - // save $tbsCertList in case there are any File_ASN1_Element objects in it - $tbsCertList = $this->currentCert['tbsCertList']; - $this->loadCRL($this->saveCRL($this->currentCert)); - - $result = $this->_sign($issuer->privateKey, $signatureAlgorithm); - $result['tbsCertList'] = $tbsCertList; - - $this->currentCert = $currentCert; - $this->signatureSubject = $signatureSubject; - - return $result; - } - - /** - * X.509 certificate signing helper function. - * - * @param Object $key - * @param File_X509 $subject - * @param String $signatureAlgorithm - * @access public - * @return Mixed - */ - function _sign($key, $signatureAlgorithm) - { - switch (strtolower(get_class($key))) { - case 'crypt_rsa': - switch ($signatureAlgorithm) { - case 'md2WithRSAEncryption': - case 'md5WithRSAEncryption': - case 'sha1WithRSAEncryption': - case 'sha224WithRSAEncryption': - case 'sha256WithRSAEncryption': - case 'sha384WithRSAEncryption': - case 'sha512WithRSAEncryption': - $key->setHash(preg_replace('#WithRSAEncryption$#', '', $signatureAlgorithm)); - $key->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); - - $this->currentCert['signature'] = base64_encode("\0" . $key->sign($this->signatureSubject)); - return $this->currentCert; - } - default: - return false; - } - } - - /** - * Set certificate start date - * - * @param String $date - * @access public - */ - function setStartDate($date) - { - $this->startDate = @date('D, d M Y H:i:s O', @strtotime($date)); - } - - /** - * Set certificate end date - * - * @param String $date - * @access public - */ - function setEndDate($date) - { - /* - To indicate that a certificate has no well-defined expiration date, - the notAfter SHOULD be assigned the GeneralizedTime value of - 99991231235959Z. - - -- http://tools.ietf.org/html/rfc5280#section-4.1.2.5 - */ - if (strtolower($date) == 'lifetime') { - $temp = '99991231235959Z'; - $asn1 = new File_ASN1(); - $temp = chr(FILE_ASN1_TYPE_GENERALIZED_TIME) . $asn1->_encodeLength(strlen($temp)) . $temp; - $this->endDate = new File_ASN1_Element($temp); - } else { - $this->endDate = @date('D, d M Y H:i:s O', @strtotime($date)); - } - } - - /** - * Set Serial Number - * - * @param String $serial - * @param $base optional - * @access public - */ - function setSerialNumber($serial, $base = -256) - { - $this->serialNumber = new Math_BigInteger($serial, $base); - } - - /** - * Turns the certificate into a certificate authority - * - * @access public - */ - function makeCA() - { - $this->caFlag = true; - } - - /** - * Get a reference to a subarray - * - * @param array $root - * @param String $path absolute path with / as component separator - * @param Boolean $create optional - * @access private - * @return array item ref or false - */ - function &_subArray(&$root, $path, $create = false) - { - $false = false; - - if (!is_array($root)) { - return $false; - } - - foreach (explode('/', $path) as $i) { - if (!is_array($root)) { - return $false; - } - - if (!isset($root[$i])) { - if (!$create) { - return $false; - } - - $root[$i] = array(); - } - - $root = &$root[$i]; - } - - return $root; - } - - /** - * Get a reference to an extension subarray - * - * @param array $root - * @param String $path optional absolute path with / as component separator - * @param Boolean $create optional - * @access private - * @return array ref or false - */ - function &_extensions(&$root, $path = null, $create = false) - { - if (!isset($root)) { - $root = $this->currentCert; - } - - switch (true) { - case !empty($path): - case !is_array($root): - break; - case isset($root['tbsCertificate']): - $path = 'tbsCertificate/extensions'; - break; - case isset($root['tbsCertList']): - $path = 'tbsCertList/crlExtensions'; - break; - case isset($root['certificationRequestInfo']): - $pth = 'certificationRequestInfo/attributes'; - $attributes = &$this->_subArray($root, $pth, $create); - - if (is_array($attributes)) { - foreach ($attributes as $key => $value) { - if ($value['type'] == 'pkcs-9-at-extensionRequest') { - $path = "$pth/$key/value/0"; - break 2; - } - } - if ($create) { - $key = count($attributes); - $attributes[] = array('type' => 'pkcs-9-at-extensionRequest', 'value' => array()); - $path = "$pth/$key/value/0"; - } - } - break; - } - - $extensions = &$this->_subArray($root, $path, $create); - - if (!is_array($extensions)) { - $false = false; - return $false; - } - - return $extensions; - } - - /** - * Remove an Extension - * - * @param String $id - * @param String $path optional - * @access private - * @return Boolean - */ - function _removeExtension($id, $path = null) - { - $extensions = &$this->_extensions($this->currentCert, $path); - - if (!is_array($extensions)) { - return false; - } - - $result = false; - foreach ($extensions as $key => $value) { - if ($value['extnId'] == $id) { - unset($extensions[$key]); - $result = true; - } - } - - $extensions = array_values($extensions); - return $result; - } - - /** - * Get an Extension - * - * Returns the extension if it exists and false if not - * - * @param String $id - * @param Array $cert optional - * @param String $path optional - * @access private - * @return Mixed - */ - function _getExtension($id, $cert = null, $path = null) - { - $extensions = $this->_extensions($cert, $path); - - if (!is_array($extensions)) { - return false; - } - - foreach ($extensions as $key => $value) { - if ($value['extnId'] == $id) { - return $value['extnValue']; - } - } - - return false; - } - - /** - * Returns a list of all extensions in use - * - * @param array $cert optional - * @param String $path optional - * @access private - * @return Array - */ - function _getExtensions($cert = null, $path = null) - { - $exts = $this->_extensions($cert, $path); - $extensions = array(); - - if (is_array($exts)) { - foreach ($exts as $extension) { - $extensions[] = $extension['extnId']; - } - } - - return $extensions; - } - - /** - * Set an Extension - * - * @param String $id - * @param Mixed $value - * @param Boolean $critical optional - * @param Boolean $replace optional - * @param String $path optional - * @access private - * @return Boolean - */ - function _setExtension($id, $value, $critical = false, $replace = true, $path = null) - { - $extensions = &$this->_extensions($this->currentCert, $path, true); - - if (!is_array($extensions)) { - return false; - } - - $newext = array('extnId' => $id, 'critical' => $critical, 'extnValue' => $value); - - foreach ($extensions as $key => $value) { - if ($value['extnId'] == $id) { - if (!$replace) { - return false; - } - - $extensions[$key] = $newext; - return true; - } - } - - $extensions[] = $newext; - return true; - } - - /** - * Remove a certificate, CSR or CRL Extension - * - * @param String $id - * @access public - * @return Boolean - */ - function removeExtension($id) - { - return $this->_removeExtension($id); - } - - /** - * Get a certificate, CSR or CRL Extension - * - * Returns the extension if it exists and false if not - * - * @param String $id - * @param Array $cert optional - * @access public - * @return Mixed - */ - function getExtension($id, $cert = null) - { - return $this->_getExtension($id, $cert); - } - - /** - * Returns a list of all extensions in use in certificate, CSR or CRL - * - * @param array $cert optional - * @access public - * @return Array - */ - function getExtensions($cert = null) - { - return $this->_getExtensions($cert); - } - - /** - * Set a certificate, CSR or CRL Extension - * - * @param String $id - * @param Mixed $value - * @param Boolean $critical optional - * @param Boolean $replace optional - * @access public - * @return Boolean - */ - function setExtension($id, $value, $critical = false, $replace = true) - { - return $this->_setExtension($id, $value, $critical, $replace); - } - - /** - * Remove a CSR attribute. - * - * @param String $id - * @param Integer $disposition optional - * @access public - * @return Boolean - */ - function removeAttribute($id, $disposition = FILE_X509_ATTR_ALL) - { - $attributes = &$this->_subArray($this->currentCert, 'certificationRequestInfo/attributes'); - - if (!is_array($attributes)) { - return false; - } - - $result = false; - foreach ($attributes as $key => $attribute) { - if ($attribute['type'] == $id) { - $n = count($attribute['value']); - switch (true) { - case $disposition == FILE_X509_ATTR_APPEND: - case $disposition == FILE_X509_ATTR_REPLACE: - return false; - case $disposition >= $n: - $disposition -= $n; - break; - case $disposition == FILE_X509_ATTR_ALL: - case $n == 1: - unset($attributes[$key]); - $result = true; - break; - default: - unset($attributes[$key]['value'][$disposition]); - $attributes[$key]['value'] = array_values($attributes[$key]['value']); - $result = true; - break; - } - if ($result && $disposition != FILE_X509_ATTR_ALL) { - break; - } - } - } - - $attributes = array_values($attributes); - return $result; - } - - /** - * Get a CSR attribute - * - * Returns the attribute if it exists and false if not - * - * @param String $id - * @param Integer $disposition optional - * @param Array $csr optional - * @access public - * @return Mixed - */ - function getAttribute($id, $disposition = FILE_X509_ATTR_ALL, $csr = null) - { - if (empty($csr)) { - $csr = $this->currentCert; - } - - $attributes = $this->_subArray($csr, 'certificationRequestInfo/attributes'); - - if (!is_array($attributes)) { - return false; - } - - foreach ($attributes as $key => $attribute) { - if ($attribute['type'] == $id) { - $n = count($attribute['value']); - switch (true) { - case $disposition == FILE_X509_ATTR_APPEND: - case $disposition == FILE_X509_ATTR_REPLACE: - return false; - case $disposition == FILE_X509_ATTR_ALL: - return $attribute['value']; - case $disposition >= $n: - $disposition -= $n; - break; - default: - return $attribute['value'][$disposition]; - } - } - } - - return false; - } - - /** - * Returns a list of all CSR attributes in use - * - * @param array $csr optional - * @access public - * @return Array - */ - function getAttributes($csr = null) - { - if (empty($csr)) { - $csr = $this->currentCert; - } - - $attributes = $this->_subArray($csr, 'certificationRequestInfo/attributes'); - $attrs = array(); - - if (is_array($attributes)) { - foreach ($attributes as $attribute) { - $attrs[] = $attribute['type']; - } - } - - return $attrs; - } - - /** - * Set a CSR attribute - * - * @param String $id - * @param Mixed $value - * @param Boolean $disposition optional - * @access public - * @return Boolean - */ - function setAttribute($id, $value, $disposition = FILE_X509_ATTR_ALL) - { - $attributes = &$this->_subArray($this->currentCert, 'certificationRequestInfo/attributes', true); - - if (!is_array($attributes)) { - return false; - } - - switch ($disposition) { - case FILE_X509_ATTR_REPLACE: - $disposition = FILE_X509_ATTR_APPEND; - case FILE_X509_ATTR_ALL: - $this->removeAttribute($id); - break; - } - - foreach ($attributes as $key => $attribute) { - if ($attribute['type'] == $id) { - $n = count($attribute['value']); - switch (true) { - case $disposition == FILE_X509_ATTR_APPEND: - $last = $key; - break; - case $disposition >= $n; - $disposition -= $n; - break; - default: - $attributes[$key]['value'][$disposition] = $value; - return true; - } - } - } - - switch (true) { - case $disposition >= 0: - return false; - case isset($last): - $attributes[$last]['value'][] = $value; - break; - default: - $attributes[] = array('type' => $id, 'value' => $disposition == FILE_X509_ATTR_ALL ? $value: array($value)); - break; - } - - return true; - } - - /** - * Sets the subject key identifier - * - * This is used by the id-ce-authorityKeyIdentifier and the id-ce-subjectKeyIdentifier extensions. - * - * @param String $value - * @access public - */ - function setKeyIdentifier($value) - { - if (empty($value)) { - unset($this->currentKeyIdentifier); - } else { - $this->currentKeyIdentifier = base64_encode($value); - } - } - - /** - * Compute a public key identifier. - * - * Although key identifiers may be set to any unique value, this function - * computes key identifiers from public key according to the two - * recommended methods (4.2.1.2 RFC 3280). - * Highly polymorphic: try to accept all possible forms of key: - * - Key object - * - File_X509 object with public or private key defined - * - Certificate or CSR array - * - File_ASN1_Element object - * - PEM or DER string - * - * @param Mixed $key optional - * @param Integer $method optional - * @access public - * @return String binary key identifier - */ - function computeKeyIdentifier($key = null, $method = 1) - { - if (is_null($key)) { - $key = $this; - } - - switch (true) { - case is_string($key): - break; - case is_array($key) && isset($key['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']): - return $this->computeKeyIdentifier($key['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], $method); - case is_array($key) && isset($key['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']): - return $this->computeKeyIdentifier($key['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'], $method); - case !is_object($key): - return false; - case strtolower(get_class($key)) == 'file_asn1_element': - // Assume the element is a bitstring-packed key. - $asn1 = new File_ASN1(); - $decoded = $asn1->decodeBER($key->element); - if (empty($decoded)) { - return false; - } - $raw = $asn1->asn1map($decoded[0], array('type' => FILE_ASN1_TYPE_BIT_STRING)); - if (empty($raw)) { - return false; - } - $raw = base64_decode($raw); - // If the key is private, compute identifier from its corresponding public key. - if (!class_exists('Crypt_RSA')) { - include_once 'Crypt/RSA.php'; - } - $key = new Crypt_RSA(); - if (!$key->loadKey($raw)) { - return false; // Not an unencrypted RSA key. - } - if ($key->getPrivateKey() !== false) { // If private. - return $this->computeKeyIdentifier($key, $method); - } - $key = $raw; // Is a public key. - break; - case strtolower(get_class($key)) == 'file_x509': - if (isset($key->publicKey)) { - return $this->computeKeyIdentifier($key->publicKey, $method); - } - if (isset($key->privateKey)) { - return $this->computeKeyIdentifier($key->privateKey, $method); - } - if (isset($key->currentCert['tbsCertificate']) || isset($key->currentCert['certificationRequestInfo'])) { - return $this->computeKeyIdentifier($key->currentCert, $method); - } - return false; - default: // Should be a key object (i.e.: Crypt_RSA). - $key = $key->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_PKCS1); - break; - } - - // If in PEM format, convert to binary. - $key = $this->_extractBER($key); - - // Now we have the key string: compute its sha-1 sum. - if (!class_exists('Crypt_Hash')) { - include_once 'Crypt/Hash.php'; - } - $hash = new Crypt_Hash('sha1'); - $hash = $hash->hash($key); - - if ($method == 2) { - $hash = substr($hash, -8); - $hash[0] = chr((ord($hash[0]) & 0x0F) | 0x40); - } - - return $hash; - } - - /** - * Format a public key as appropriate - * - * @access private - * @return Array - */ - function _formatSubjectPublicKey() - { - if (!isset($this->publicKey) || !is_object($this->publicKey)) { - return false; - } - - switch (strtolower(get_class($this->publicKey))) { - case 'crypt_rsa': - // the following two return statements do the same thing. i dunno.. i just prefer the later for some reason. - // the former is a good example of how to do fuzzing on the public key - //return new File_ASN1_Element(base64_decode(preg_replace('#-.+-|[\r\n]#', '', $this->publicKey->getPublicKey()))); - return array( - 'algorithm' => array('algorithm' => 'rsaEncryption'), - 'subjectPublicKey' => $this->publicKey->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_PKCS1) - ); - default: - return false; - } - } - - /** - * Set the domain name's which the cert is to be valid for - * - * @access public - * @return Array - */ - function setDomain() - { - $this->domains = func_get_args(); - $this->removeDNProp('id-at-commonName'); - $this->setDNProp('id-at-commonName', $this->domains[0]); - } - - /** - * Set the IP Addresses's which the cert is to be valid for - * - * @access public - * @param String $ipAddress optional - */ - function setIPAddress() - { - $this->ipAddresses = func_get_args(); - /* - if (!isset($this->domains)) { - $this->removeDNProp('id-at-commonName'); - $this->setDNProp('id-at-commonName', $this->ipAddresses[0]); - } - */ - } - - /** - * Helper function to build domain array - * - * @access private - * @param String $domain - * @return Array - */ - function _dnsName($domain) - { - return array('dNSName' => $domain); - } - - /** - * Helper function to build IP Address array - * - * (IPv6 is not currently supported) - * - * @access private - * @param String $address - * @return Array - */ - function _iPAddress($address) - { - return array('iPAddress' => $address); - } - - /** - * Get the index of a revoked certificate. - * - * @param array $rclist - * @param String $serial - * @param Boolean $create optional - * @access private - * @return Integer or false - */ - function _revokedCertificate(&$rclist, $serial, $create = false) - { - $serial = new Math_BigInteger($serial); - - foreach ($rclist as $i => $rc) { - if (!($serial->compare($rc['userCertificate']))) { - return $i; - } - } - - if (!$create) { - return false; - } - - $i = count($rclist); - $rclist[] = array('userCertificate' => $serial, - 'revocationDate' => $this->_timeField(@date('D, d M Y H:i:s O'))); - return $i; - } - - /** - * Revoke a certificate. - * - * @param String $serial - * @param String $date optional - * @access public - * @return Boolean - */ - function revoke($serial, $date = null) - { - if (isset($this->currentCert['tbsCertList'])) { - if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates', true))) { - if ($this->_revokedCertificate($rclist, $serial) === false) { // If not yet revoked - if (($i = $this->_revokedCertificate($rclist, $serial, true)) !== false) { - - if (!empty($date)) { - $rclist[$i]['revocationDate'] = $this->_timeField($date); - } - - return true; - } - } - } - } - - return false; - } - - /** - * Unrevoke a certificate. - * - * @param String $serial - * @access public - * @return Boolean - */ - function unrevoke($serial) - { - if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) { - unset($rclist[$i]); - $rclist = array_values($rclist); - return true; - } - } - - return false; - } - - /** - * Get a revoked certificate. - * - * @param String $serial - * @access public - * @return Mixed - */ - function getRevoked($serial) - { - if (is_array($rclist = $this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) { - return $rclist[$i]; - } - } - - return false; - } - - /** - * List revoked certificates - * - * @param array $crl optional - * @access public - * @return array - */ - function listRevoked($crl = null) - { - if (!isset($crl)) { - $crl = $this->currentCert; - } - - if (!isset($crl['tbsCertList'])) { - return false; - } - - $result = array(); - - if (is_array($rclist = $this->_subArray($crl, 'tbsCertList/revokedCertificates'))) { - foreach ($rclist as $rc) { - $result[] = $rc['userCertificate']->toString(); - } - } - - return $result; - } - - /** - * Remove a Revoked Certificate Extension - * - * @param String $serial - * @param String $id - * @access public - * @return Boolean - */ - function removeRevokedCertificateExtension($serial, $id) - { - if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) { - return $this->_removeExtension($id, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); - } - } - - return false; - } - - /** - * Get a Revoked Certificate Extension - * - * Returns the extension if it exists and false if not - * - * @param String $serial - * @param String $id - * @param Array $crl optional - * @access public - * @return Mixed - */ - function getRevokedCertificateExtension($serial, $id, $crl = null) - { - if (!isset($crl)) { - $crl = $this->currentCert; - } - - if (is_array($rclist = $this->_subArray($crl, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) { - return $this->_getExtension($id, $crl, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); - } - } - - return false; - } - - /** - * Returns a list of all extensions in use for a given revoked certificate - * - * @param String $serial - * @param array $crl optional - * @access public - * @return Array - */ - function getRevokedCertificateExtensions($serial, $crl = null) - { - if (!isset($crl)) { - $crl = $this->currentCert; - } - - if (is_array($rclist = $this->_subArray($crl, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) { - return $this->_getExtensions($crl, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); - } - } - - return false; - } - - /** - * Set a Revoked Certificate Extension - * - * @param String $serial - * @param String $id - * @param Mixed $value - * @param Boolean $critical optional - * @param Boolean $replace optional - * @access public - * @return Boolean - */ - function setRevokedCertificateExtension($serial, $id, $value, $critical = false, $replace = true) - { - if (isset($this->currentCert['tbsCertList'])) { - if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates', true))) { - if (($i = $this->_revokedCertificate($rclist, $serial, true)) !== false) { - return $this->_setExtension($id, $value, $critical, $replace, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); - } - } - } - - return false; - } - - /** - * Extract raw BER from Base64 encoding - * - * @access private - * @param String $str - * @return String - */ - function _extractBER($str) - { - /* X.509 certs are assumed to be base64 encoded but sometimes they'll have additional things in them - * above and beyond the ceritificate. - * ie. some may have the following preceding the -----BEGIN CERTIFICATE----- line: - * - * Bag Attributes - * localKeyID: 01 00 00 00 - * subject=/O=organization/OU=org unit/CN=common name - * issuer=/O=organization/CN=common name - */ - $temp = preg_replace('#.*?^-+[^-]+-+#ms', '', $str, 1); - // remove the -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- stuff - $temp = preg_replace('#-+[^-]+-+#', '', $temp); - // remove new lines - $temp = str_replace(array("\r", "\n", ' '), '', $temp); - $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? base64_decode($temp) : false; - return $temp != false ? $temp : $str; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Math/BigInteger.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Math/BigInteger.php deleted file mode 100755 index 8e54f741..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Math/BigInteger.php +++ /dev/null @@ -1,3758 +0,0 @@ -> and << cannot be used, nor can the modulo operator %, - * which only supports integers. Although this fact will slow this library down, the fact that such a high - * base is being used should more than compensate. - * - * Numbers are stored in {@link http://en.wikipedia.org/wiki/Endianness little endian} format. ie. - * (new Math_BigInteger(pow(2, 26)))->value = array(0, 1) - * - * Useful resources are as follows: - * - * - {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf Handbook of Applied Cryptography (HAC)} - * - {@link http://math.libtomcrypt.com/files/tommath.pdf Multi-Precision Math (MPM)} - * - Java's BigInteger classes. See /j2se/src/share/classes/java/math in jdk-1_5_0-src-jrl.zip - * - * Here's an example of how to use this library: - * - * add($b); - * - * echo $c->toString(); // outputs 5 - * ?> - * - * - * LICENSE: 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. - * - * @category Math - * @package Math_BigInteger - * @author Jim Wigginton - * @copyright 2006 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -/**#@+ - * Reduction constants - * - * @access private - * @see Math_BigInteger::_reduce() - */ -/** - * @see Math_BigInteger::_montgomery() - * @see Math_BigInteger::_prepMontgomery() - */ -define('MATH_BIGINTEGER_MONTGOMERY', 0); -/** - * @see Math_BigInteger::_barrett() - */ -define('MATH_BIGINTEGER_BARRETT', 1); -/** - * @see Math_BigInteger::_mod2() - */ -define('MATH_BIGINTEGER_POWEROF2', 2); -/** - * @see Math_BigInteger::_remainder() - */ -define('MATH_BIGINTEGER_CLASSIC', 3); -/** - * @see Math_BigInteger::__clone() - */ -define('MATH_BIGINTEGER_NONE', 4); -/**#@-*/ - -/**#@+ - * Array constants - * - * Rather than create a thousands and thousands of new Math_BigInteger objects in repeated function calls to add() and - * multiply() or whatever, we'll just work directly on arrays, taking them in as parameters and returning them. - * - * @access private - */ -/** - * $result[MATH_BIGINTEGER_VALUE] contains the value. - */ -define('MATH_BIGINTEGER_VALUE', 0); -/** - * $result[MATH_BIGINTEGER_SIGN] contains the sign. - */ -define('MATH_BIGINTEGER_SIGN', 1); -/**#@-*/ - -/**#@+ - * @access private - * @see Math_BigInteger::_montgomery() - * @see Math_BigInteger::_barrett() - */ -/** - * Cache constants - * - * $cache[MATH_BIGINTEGER_VARIABLE] tells us whether or not the cached data is still valid. - */ -define('MATH_BIGINTEGER_VARIABLE', 0); -/** - * $cache[MATH_BIGINTEGER_DATA] contains the cached data. - */ -define('MATH_BIGINTEGER_DATA', 1); -/**#@-*/ - -/**#@+ - * Mode constants. - * - * @access private - * @see Math_BigInteger::Math_BigInteger() - */ -/** - * To use the pure-PHP implementation - */ -define('MATH_BIGINTEGER_MODE_INTERNAL', 1); -/** - * To use the BCMath library - * - * (if enabled; otherwise, the internal implementation will be used) - */ -define('MATH_BIGINTEGER_MODE_BCMATH', 2); -/** - * To use the GMP library - * - * (if present; otherwise, either the BCMath or the internal implementation will be used) - */ -define('MATH_BIGINTEGER_MODE_GMP', 3); -/**#@-*/ - -/** - * Karatsuba Cutoff - * - * At what point do we switch between Karatsuba multiplication and schoolbook long multiplication? - * - * @access private - */ -define('MATH_BIGINTEGER_KARATSUBA_CUTOFF', 25); - -/** - * Pure-PHP arbitrary precision integer arithmetic library. Supports base-2, base-10, base-16, and base-256 - * numbers. - * - * @package Math_BigInteger - * @author Jim Wigginton - * @access public - */ -class Math_BigInteger -{ - /** - * Holds the BigInteger's value. - * - * @var Array - * @access private - */ - var $value; - - /** - * Holds the BigInteger's magnitude. - * - * @var Boolean - * @access private - */ - var $is_negative = false; - - /** - * Random number generator function - * - * @see setRandomGenerator() - * @access private - */ - var $generator = 'mt_rand'; - - /** - * Precision - * - * @see setPrecision() - * @access private - */ - var $precision = -1; - - /** - * Precision Bitmask - * - * @see setPrecision() - * @access private - */ - var $bitmask = false; - - /** - * Mode independent value used for serialization. - * - * If the bcmath or gmp extensions are installed $this->value will be a non-serializable resource, hence the need for - * a variable that'll be serializable regardless of whether or not extensions are being used. Unlike $this->value, - * however, $this->hex is only calculated when $this->__sleep() is called. - * - * @see __sleep() - * @see __wakeup() - * @var String - * @access private - */ - var $hex; - - /** - * Converts base-2, base-10, base-16, and binary strings (base-256) to BigIntegers. - * - * If the second parameter - $base - is negative, then it will be assumed that the number's are encoded using - * two's compliment. The sole exception to this is -10, which is treated the same as 10 is. - * - * Here's an example: - * - * toString(); // outputs 50 - * ?> - * - * - * @param optional $x base-10 number or base-$base number if $base set. - * @param optional integer $base - * @return Math_BigInteger - * @access public - */ - function Math_BigInteger($x = 0, $base = 10) - { - if ( !defined('MATH_BIGINTEGER_MODE') ) { - switch (true) { - case extension_loaded('gmp'): - define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_GMP); - break; - case extension_loaded('bcmath'): - define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_BCMATH); - break; - default: - define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_INTERNAL); - } - } - - if (function_exists('openssl_public_encrypt') && !defined('MATH_BIGINTEGER_OPENSSL_DISABLE') && !defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) { - // some versions of XAMPP have mismatched versions of OpenSSL which causes it not to work - ob_start(); - @phpinfo(); - $content = ob_get_contents(); - ob_end_clean(); - - preg_match_all('#OpenSSL (Header|Library) Version(.*)#im', $content, $matches); - - $versions = array(); - if (!empty($matches[1])) { - for ($i = 0; $i < count($matches[1]); $i++) { - $fullVersion = trim(str_replace('=>', '', strip_tags($matches[2][$i]))); - - // Remove letter part in OpenSSL version - if (!preg_match('/(\d+\.\d+\.\d+)/i', $fullVersion, $m)) { - $versions[$matches[1][$i]] = $fullVersion; - } else { - $versions[$matches[1][$i]] = $m[0]; - } - } - } - - // it doesn't appear that OpenSSL versions were reported upon until PHP 5.3+ - switch (true) { - case !isset($versions['Header']): - case !isset($versions['Library']): - case $versions['Header'] == $versions['Library']: - define('MATH_BIGINTEGER_OPENSSL_ENABLED', true); - break; - default: - define('MATH_BIGINTEGER_OPENSSL_DISABLE', true); - } - } - - if (!defined('PHP_INT_SIZE')) { - define('PHP_INT_SIZE', 4); - } - - if (!defined('MATH_BIGINTEGER_BASE') && MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_INTERNAL) { - switch (PHP_INT_SIZE) { - case 8: // use 64-bit integers if int size is 8 bytes - define('MATH_BIGINTEGER_BASE', 31); - define('MATH_BIGINTEGER_BASE_FULL', 0x80000000); - define('MATH_BIGINTEGER_MAX_DIGIT', 0x7FFFFFFF); - define('MATH_BIGINTEGER_MSB', 0x40000000); - // 10**9 is the closest we can get to 2**31 without passing it - define('MATH_BIGINTEGER_MAX10', 1000000000); - define('MATH_BIGINTEGER_MAX10_LEN', 9); - // the largest digit that may be used in addition / subtraction - define('MATH_BIGINTEGER_MAX_DIGIT2', pow(2, 62)); - break; - //case 4: // use 64-bit floats if int size is 4 bytes - default: - define('MATH_BIGINTEGER_BASE', 26); - define('MATH_BIGINTEGER_BASE_FULL', 0x4000000); - define('MATH_BIGINTEGER_MAX_DIGIT', 0x3FFFFFF); - define('MATH_BIGINTEGER_MSB', 0x2000000); - // 10**7 is the closest to 2**26 without passing it - define('MATH_BIGINTEGER_MAX10', 10000000); - define('MATH_BIGINTEGER_MAX10_LEN', 7); - // the largest digit that may be used in addition / subtraction - // we do pow(2, 52) instead of using 4503599627370496 directly because some - // PHP installations will truncate 4503599627370496. - define('MATH_BIGINTEGER_MAX_DIGIT2', pow(2, 52)); - } - } - - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - switch (true) { - case is_resource($x) && get_resource_type($x) == 'GMP integer': - // PHP 5.6 switched GMP from using resources to objects - case is_object($x) && get_class($x) == 'GMP': - $this->value = $x; - return; - } - $this->value = gmp_init(0); - break; - case MATH_BIGINTEGER_MODE_BCMATH: - $this->value = '0'; - break; - default: - $this->value = array(); - } - - // '0' counts as empty() but when the base is 256 '0' is equal to ord('0') or 48 - // '0' is the only value like this per http://php.net/empty - if (empty($x) && (abs($base) != 256 || $x !== '0')) { - return; - } - - switch ($base) { - case -256: - if (ord($x[0]) & 0x80) { - $x = ~$x; - $this->is_negative = true; - } - case 256: - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $sign = $this->is_negative ? '-' : ''; - $this->value = gmp_init($sign . '0x' . bin2hex($x)); - break; - case MATH_BIGINTEGER_MODE_BCMATH: - // round $len to the nearest 4 (thanks, DavidMJ!) - $len = (strlen($x) + 3) & 0xFFFFFFFC; - - $x = str_pad($x, $len, chr(0), STR_PAD_LEFT); - - for ($i = 0; $i < $len; $i+= 4) { - $this->value = bcmul($this->value, '4294967296', 0); // 4294967296 == 2**32 - $this->value = bcadd($this->value, 0x1000000 * ord($x[$i]) + ((ord($x[$i + 1]) << 16) | (ord($x[$i + 2]) << 8) | ord($x[$i + 3])), 0); - } - - if ($this->is_negative) { - $this->value = '-' . $this->value; - } - - break; - // converts a base-2**8 (big endian / msb) number to base-2**26 (little endian / lsb) - default: - while (strlen($x)) { - $this->value[] = $this->_bytes2int($this->_base256_rshift($x, MATH_BIGINTEGER_BASE)); - } - } - - if ($this->is_negative) { - if (MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL) { - $this->is_negative = false; - } - $temp = $this->add(new Math_BigInteger('-1')); - $this->value = $temp->value; - } - break; - case 16: - case -16: - if ($base > 0 && $x[0] == '-') { - $this->is_negative = true; - $x = substr($x, 1); - } - - $x = preg_replace('#^(?:0x)?([A-Fa-f0-9]*).*#', '$1', $x); - - $is_negative = false; - if ($base < 0 && hexdec($x[0]) >= 8) { - $this->is_negative = $is_negative = true; - $x = bin2hex(~pack('H*', $x)); - } - - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $temp = $this->is_negative ? '-0x' . $x : '0x' . $x; - $this->value = gmp_init($temp); - $this->is_negative = false; - break; - case MATH_BIGINTEGER_MODE_BCMATH: - $x = ( strlen($x) & 1 ) ? '0' . $x : $x; - $temp = new Math_BigInteger(pack('H*', $x), 256); - $this->value = $this->is_negative ? '-' . $temp->value : $temp->value; - $this->is_negative = false; - break; - default: - $x = ( strlen($x) & 1 ) ? '0' . $x : $x; - $temp = new Math_BigInteger(pack('H*', $x), 256); - $this->value = $temp->value; - } - - if ($is_negative) { - $temp = $this->add(new Math_BigInteger('-1')); - $this->value = $temp->value; - } - break; - case 10: - case -10: - // (?value = gmp_init($x); - break; - case MATH_BIGINTEGER_MODE_BCMATH: - // explicitly casting $x to a string is necessary, here, since doing $x[0] on -1 yields different - // results then doing it on '-1' does (modInverse does $x[0]) - $this->value = $x === '-' ? '0' : (string) $x; - break; - default: - $temp = new Math_BigInteger(); - - $multiplier = new Math_BigInteger(); - $multiplier->value = array(MATH_BIGINTEGER_MAX10); - - if ($x[0] == '-') { - $this->is_negative = true; - $x = substr($x, 1); - } - - $x = str_pad($x, strlen($x) + ((MATH_BIGINTEGER_MAX10_LEN - 1) * strlen($x)) % MATH_BIGINTEGER_MAX10_LEN, 0, STR_PAD_LEFT); - while (strlen($x)) { - $temp = $temp->multiply($multiplier); - $temp = $temp->add(new Math_BigInteger($this->_int2bytes(substr($x, 0, MATH_BIGINTEGER_MAX10_LEN)), 256)); - $x = substr($x, MATH_BIGINTEGER_MAX10_LEN); - } - - $this->value = $temp->value; - } - break; - case 2: // base-2 support originally implemented by Lluis Pamies - thanks! - case -2: - if ($base > 0 && $x[0] == '-') { - $this->is_negative = true; - $x = substr($x, 1); - } - - $x = preg_replace('#^([01]*).*#', '$1', $x); - $x = str_pad($x, strlen($x) + (3 * strlen($x)) % 4, 0, STR_PAD_LEFT); - - $str = '0x'; - while (strlen($x)) { - $part = substr($x, 0, 4); - $str.= dechex(bindec($part)); - $x = substr($x, 4); - } - - if ($this->is_negative) { - $str = '-' . $str; - } - - $temp = new Math_BigInteger($str, 8 * $base); // ie. either -16 or +16 - $this->value = $temp->value; - $this->is_negative = $temp->is_negative; - - break; - default: - // base not supported, so we'll let $this == 0 - } - } - - /** - * Converts a BigInteger to a byte string (eg. base-256). - * - * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're - * saved as two's compliment. - * - * Here's an example: - * - * toBytes(); // outputs chr(65) - * ?> - * - * - * @param Boolean $twos_compliment - * @return String - * @access public - * @internal Converts a base-2**26 number to base-2**8 - */ - function toBytes($twos_compliment = false) - { - if ($twos_compliment) { - $comparison = $this->compare(new Math_BigInteger()); - if ($comparison == 0) { - return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; - } - - $temp = $comparison < 0 ? $this->add(new Math_BigInteger(1)) : $this->copy(); - $bytes = $temp->toBytes(); - - if (empty($bytes)) { // eg. if the number we're trying to convert is -1 - $bytes = chr(0); - } - - if (ord($bytes[0]) & 0x80) { - $bytes = chr(0) . $bytes; - } - - return $comparison < 0 ? ~$bytes : $bytes; - } - - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - if (gmp_cmp($this->value, gmp_init(0)) == 0) { - return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; - } - - $temp = gmp_strval(gmp_abs($this->value), 16); - $temp = ( strlen($temp) & 1 ) ? '0' . $temp : $temp; - $temp = pack('H*', $temp); - - return $this->precision > 0 ? - substr(str_pad($temp, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) : - ltrim($temp, chr(0)); - case MATH_BIGINTEGER_MODE_BCMATH: - if ($this->value === '0') { - return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; - } - - $value = ''; - $current = $this->value; - - if ($current[0] == '-') { - $current = substr($current, 1); - } - - while (bccomp($current, '0', 0) > 0) { - $temp = bcmod($current, '16777216'); - $value = chr($temp >> 16) . chr($temp >> 8) . chr($temp) . $value; - $current = bcdiv($current, '16777216', 0); - } - - return $this->precision > 0 ? - substr(str_pad($value, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) : - ltrim($value, chr(0)); - } - - if (!count($this->value)) { - return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; - } - $result = $this->_int2bytes($this->value[count($this->value) - 1]); - - $temp = $this->copy(); - - for ($i = count($temp->value) - 2; $i >= 0; --$i) { - $temp->_base256_lshift($result, MATH_BIGINTEGER_BASE); - $result = $result | str_pad($temp->_int2bytes($temp->value[$i]), strlen($result), chr(0), STR_PAD_LEFT); - } - - return $this->precision > 0 ? - str_pad(substr($result, -(($this->precision + 7) >> 3)), ($this->precision + 7) >> 3, chr(0), STR_PAD_LEFT) : - $result; - } - - /** - * Converts a BigInteger to a hex string (eg. base-16)). - * - * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're - * saved as two's compliment. - * - * Here's an example: - * - * toHex(); // outputs '41' - * ?> - * - * - * @param Boolean $twos_compliment - * @return String - * @access public - * @internal Converts a base-2**26 number to base-2**8 - */ - function toHex($twos_compliment = false) - { - return bin2hex($this->toBytes($twos_compliment)); - } - - /** - * Converts a BigInteger to a bit string (eg. base-2). - * - * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're - * saved as two's compliment. - * - * Here's an example: - * - * toBits(); // outputs '1000001' - * ?> - * - * - * @param Boolean $twos_compliment - * @return String - * @access public - * @internal Converts a base-2**26 number to base-2**2 - */ - function toBits($twos_compliment = false) - { - $hex = $this->toHex($twos_compliment); - $bits = ''; - for ($i = strlen($hex) - 8, $start = strlen($hex) & 7; $i >= $start; $i-=8) { - $bits = str_pad(decbin(hexdec(substr($hex, $i, 8))), 32, '0', STR_PAD_LEFT) . $bits; - } - if ($start) { // hexdec('') == 0 - $bits = str_pad(decbin(hexdec(substr($hex, 0, $start))), 8, '0', STR_PAD_LEFT) . $bits; - } - $result = $this->precision > 0 ? substr($bits, -$this->precision) : ltrim($bits, '0'); - - if ($twos_compliment && $this->compare(new Math_BigInteger()) > 0 && $this->precision <= 0) { - return '0' . $result; - } - - return $result; - } - - /** - * Converts a BigInteger to a base-10 number. - * - * Here's an example: - * - * toString(); // outputs 50 - * ?> - * - * - * @return String - * @access public - * @internal Converts a base-2**26 number to base-10**7 (which is pretty much base-10) - */ - function toString() - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - return gmp_strval($this->value); - case MATH_BIGINTEGER_MODE_BCMATH: - if ($this->value === '0') { - return '0'; - } - - return ltrim($this->value, '0'); - } - - if (!count($this->value)) { - return '0'; - } - - $temp = $this->copy(); - $temp->is_negative = false; - - $divisor = new Math_BigInteger(); - $divisor->value = array(MATH_BIGINTEGER_MAX10); - $result = ''; - while (count($temp->value)) { - list($temp, $mod) = $temp->divide($divisor); - $result = str_pad(isset($mod->value[0]) ? $mod->value[0] : '', MATH_BIGINTEGER_MAX10_LEN, '0', STR_PAD_LEFT) . $result; - } - $result = ltrim($result, '0'); - if (empty($result)) { - $result = '0'; - } - - if ($this->is_negative) { - $result = '-' . $result; - } - - return $result; - } - - /** - * Copy an object - * - * PHP5 passes objects by reference while PHP4 passes by value. As such, we need a function to guarantee - * that all objects are passed by value, when appropriate. More information can be found here: - * - * {@link http://php.net/language.oop5.basic#51624} - * - * @access public - * @see __clone() - * @return Math_BigInteger - */ - function copy() - { - $temp = new Math_BigInteger(); - $temp->value = $this->value; - $temp->is_negative = $this->is_negative; - $temp->generator = $this->generator; - $temp->precision = $this->precision; - $temp->bitmask = $this->bitmask; - return $temp; - } - - /** - * __toString() magic method - * - * Will be called, automatically, if you're supporting just PHP5. If you're supporting PHP4, you'll need to call - * toString(). - * - * @access public - * @internal Implemented per a suggestion by Techie-Michael - thanks! - */ - function __toString() - { - return $this->toString(); - } - - /** - * __clone() magic method - * - * Although you can call Math_BigInteger::__toString() directly in PHP5, you cannot call Math_BigInteger::__clone() - * directly in PHP5. You can in PHP4 since it's not a magic method, but in PHP5, you have to call it by using the PHP5 - * only syntax of $y = clone $x. As such, if you're trying to write an application that works on both PHP4 and PHP5, - * call Math_BigInteger::copy(), instead. - * - * @access public - * @see copy() - * @return Math_BigInteger - */ - function __clone() - { - return $this->copy(); - } - - /** - * __sleep() magic method - * - * Will be called, automatically, when serialize() is called on a Math_BigInteger object. - * - * @see __wakeup() - * @access public - */ - function __sleep() - { - $this->hex = $this->toHex(true); - $vars = array('hex'); - if ($this->generator != 'mt_rand') { - $vars[] = 'generator'; - } - if ($this->precision > 0) { - $vars[] = 'precision'; - } - return $vars; - - } - - /** - * __wakeup() magic method - * - * Will be called, automatically, when unserialize() is called on a Math_BigInteger object. - * - * @see __sleep() - * @access public - */ - function __wakeup() - { - $temp = new Math_BigInteger($this->hex, -16); - $this->value = $temp->value; - $this->is_negative = $temp->is_negative; - $this->setRandomGenerator($this->generator); - if ($this->precision > 0) { - // recalculate $this->bitmask - $this->setPrecision($this->precision); - } - } - - /** - * Adds two BigIntegers. - * - * Here's an example: - * - * add($b); - * - * echo $c->toString(); // outputs 30 - * ?> - * - * - * @param Math_BigInteger $y - * @return Math_BigInteger - * @access public - * @internal Performs base-2**52 addition - */ - function add($y) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $temp = new Math_BigInteger(); - $temp->value = gmp_add($this->value, $y->value); - - return $this->_normalize($temp); - case MATH_BIGINTEGER_MODE_BCMATH: - $temp = new Math_BigInteger(); - $temp->value = bcadd($this->value, $y->value, 0); - - return $this->_normalize($temp); - } - - $temp = $this->_add($this->value, $this->is_negative, $y->value, $y->is_negative); - - $result = new Math_BigInteger(); - $result->value = $temp[MATH_BIGINTEGER_VALUE]; - $result->is_negative = $temp[MATH_BIGINTEGER_SIGN]; - - return $this->_normalize($result); - } - - /** - * Performs addition. - * - * @param Array $x_value - * @param Boolean $x_negative - * @param Array $y_value - * @param Boolean $y_negative - * @return Array - * @access private - */ - function _add($x_value, $x_negative, $y_value, $y_negative) - { - $x_size = count($x_value); - $y_size = count($y_value); - - if ($x_size == 0) { - return array( - MATH_BIGINTEGER_VALUE => $y_value, - MATH_BIGINTEGER_SIGN => $y_negative - ); - } else if ($y_size == 0) { - return array( - MATH_BIGINTEGER_VALUE => $x_value, - MATH_BIGINTEGER_SIGN => $x_negative - ); - } - - // subtract, if appropriate - if ( $x_negative != $y_negative ) { - if ( $x_value == $y_value ) { - return array( - MATH_BIGINTEGER_VALUE => array(), - MATH_BIGINTEGER_SIGN => false - ); - } - - $temp = $this->_subtract($x_value, false, $y_value, false); - $temp[MATH_BIGINTEGER_SIGN] = $this->_compare($x_value, false, $y_value, false) > 0 ? - $x_negative : $y_negative; - - return $temp; - } - - if ($x_size < $y_size) { - $size = $x_size; - $value = $y_value; - } else { - $size = $y_size; - $value = $x_value; - } - - $value[count($value)] = 0; // just in case the carry adds an extra digit - - $carry = 0; - for ($i = 0, $j = 1; $j < $size; $i+=2, $j+=2) { - $sum = $x_value[$j] * MATH_BIGINTEGER_BASE_FULL + $x_value[$i] + $y_value[$j] * MATH_BIGINTEGER_BASE_FULL + $y_value[$i] + $carry; - $carry = $sum >= MATH_BIGINTEGER_MAX_DIGIT2; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1 - $sum = $carry ? $sum - MATH_BIGINTEGER_MAX_DIGIT2 : $sum; - - $temp = MATH_BIGINTEGER_BASE === 26 ? intval($sum / 0x4000000) : ($sum >> 31); - - $value[$i] = (int) ($sum - MATH_BIGINTEGER_BASE_FULL * $temp); // eg. a faster alternative to fmod($sum, 0x4000000) - $value[$j] = $temp; - } - - if ($j == $size) { // ie. if $y_size is odd - $sum = $x_value[$i] + $y_value[$i] + $carry; - $carry = $sum >= MATH_BIGINTEGER_BASE_FULL; - $value[$i] = $carry ? $sum - MATH_BIGINTEGER_BASE_FULL : $sum; - ++$i; // ie. let $i = $j since we've just done $value[$i] - } - - if ($carry) { - for (; $value[$i] == MATH_BIGINTEGER_MAX_DIGIT; ++$i) { - $value[$i] = 0; - } - ++$value[$i]; - } - - return array( - MATH_BIGINTEGER_VALUE => $this->_trim($value), - MATH_BIGINTEGER_SIGN => $x_negative - ); - } - - /** - * Subtracts two BigIntegers. - * - * Here's an example: - * - * subtract($b); - * - * echo $c->toString(); // outputs -10 - * ?> - * - * - * @param Math_BigInteger $y - * @return Math_BigInteger - * @access public - * @internal Performs base-2**52 subtraction - */ - function subtract($y) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $temp = new Math_BigInteger(); - $temp->value = gmp_sub($this->value, $y->value); - - return $this->_normalize($temp); - case MATH_BIGINTEGER_MODE_BCMATH: - $temp = new Math_BigInteger(); - $temp->value = bcsub($this->value, $y->value, 0); - - return $this->_normalize($temp); - } - - $temp = $this->_subtract($this->value, $this->is_negative, $y->value, $y->is_negative); - - $result = new Math_BigInteger(); - $result->value = $temp[MATH_BIGINTEGER_VALUE]; - $result->is_negative = $temp[MATH_BIGINTEGER_SIGN]; - - return $this->_normalize($result); - } - - /** - * Performs subtraction. - * - * @param Array $x_value - * @param Boolean $x_negative - * @param Array $y_value - * @param Boolean $y_negative - * @return Array - * @access private - */ - function _subtract($x_value, $x_negative, $y_value, $y_negative) - { - $x_size = count($x_value); - $y_size = count($y_value); - - if ($x_size == 0) { - return array( - MATH_BIGINTEGER_VALUE => $y_value, - MATH_BIGINTEGER_SIGN => !$y_negative - ); - } else if ($y_size == 0) { - return array( - MATH_BIGINTEGER_VALUE => $x_value, - MATH_BIGINTEGER_SIGN => $x_negative - ); - } - - // add, if appropriate (ie. -$x - +$y or +$x - -$y) - if ( $x_negative != $y_negative ) { - $temp = $this->_add($x_value, false, $y_value, false); - $temp[MATH_BIGINTEGER_SIGN] = $x_negative; - - return $temp; - } - - $diff = $this->_compare($x_value, $x_negative, $y_value, $y_negative); - - if ( !$diff ) { - return array( - MATH_BIGINTEGER_VALUE => array(), - MATH_BIGINTEGER_SIGN => false - ); - } - - // switch $x and $y around, if appropriate. - if ( (!$x_negative && $diff < 0) || ($x_negative && $diff > 0) ) { - $temp = $x_value; - $x_value = $y_value; - $y_value = $temp; - - $x_negative = !$x_negative; - - $x_size = count($x_value); - $y_size = count($y_value); - } - - // at this point, $x_value should be at least as big as - if not bigger than - $y_value - - $carry = 0; - for ($i = 0, $j = 1; $j < $y_size; $i+=2, $j+=2) { - $sum = $x_value[$j] * MATH_BIGINTEGER_BASE_FULL + $x_value[$i] - $y_value[$j] * MATH_BIGINTEGER_BASE_FULL - $y_value[$i] - $carry; - $carry = $sum < 0; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1 - $sum = $carry ? $sum + MATH_BIGINTEGER_MAX_DIGIT2 : $sum; - - $temp = MATH_BIGINTEGER_BASE === 26 ? intval($sum / 0x4000000) : ($sum >> 31); - - $x_value[$i] = (int) ($sum - MATH_BIGINTEGER_BASE_FULL * $temp); - $x_value[$j] = $temp; - } - - if ($j == $y_size) { // ie. if $y_size is odd - $sum = $x_value[$i] - $y_value[$i] - $carry; - $carry = $sum < 0; - $x_value[$i] = $carry ? $sum + MATH_BIGINTEGER_BASE_FULL : $sum; - ++$i; - } - - if ($carry) { - for (; !$x_value[$i]; ++$i) { - $x_value[$i] = MATH_BIGINTEGER_MAX_DIGIT; - } - --$x_value[$i]; - } - - return array( - MATH_BIGINTEGER_VALUE => $this->_trim($x_value), - MATH_BIGINTEGER_SIGN => $x_negative - ); - } - - /** - * Multiplies two BigIntegers - * - * Here's an example: - * - * multiply($b); - * - * echo $c->toString(); // outputs 200 - * ?> - * - * - * @param Math_BigInteger $x - * @return Math_BigInteger - * @access public - */ - function multiply($x) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $temp = new Math_BigInteger(); - $temp->value = gmp_mul($this->value, $x->value); - - return $this->_normalize($temp); - case MATH_BIGINTEGER_MODE_BCMATH: - $temp = new Math_BigInteger(); - $temp->value = bcmul($this->value, $x->value, 0); - - return $this->_normalize($temp); - } - - $temp = $this->_multiply($this->value, $this->is_negative, $x->value, $x->is_negative); - - $product = new Math_BigInteger(); - $product->value = $temp[MATH_BIGINTEGER_VALUE]; - $product->is_negative = $temp[MATH_BIGINTEGER_SIGN]; - - return $this->_normalize($product); - } - - /** - * Performs multiplication. - * - * @param Array $x_value - * @param Boolean $x_negative - * @param Array $y_value - * @param Boolean $y_negative - * @return Array - * @access private - */ - function _multiply($x_value, $x_negative, $y_value, $y_negative) - { - //if ( $x_value == $y_value ) { - // return array( - // MATH_BIGINTEGER_VALUE => $this->_square($x_value), - // MATH_BIGINTEGER_SIGN => $x_sign != $y_value - // ); - //} - - $x_length = count($x_value); - $y_length = count($y_value); - - if ( !$x_length || !$y_length ) { // a 0 is being multiplied - return array( - MATH_BIGINTEGER_VALUE => array(), - MATH_BIGINTEGER_SIGN => false - ); - } - - return array( - MATH_BIGINTEGER_VALUE => min($x_length, $y_length) < 2 * MATH_BIGINTEGER_KARATSUBA_CUTOFF ? - $this->_trim($this->_regularMultiply($x_value, $y_value)) : - $this->_trim($this->_karatsuba($x_value, $y_value)), - MATH_BIGINTEGER_SIGN => $x_negative != $y_negative - ); - } - - /** - * Performs long multiplication on two BigIntegers - * - * Modeled after 'multiply' in MutableBigInteger.java. - * - * @param Array $x_value - * @param Array $y_value - * @return Array - * @access private - */ - function _regularMultiply($x_value, $y_value) - { - $x_length = count($x_value); - $y_length = count($y_value); - - if ( !$x_length || !$y_length ) { // a 0 is being multiplied - return array(); - } - - if ( $x_length < $y_length ) { - $temp = $x_value; - $x_value = $y_value; - $y_value = $temp; - - $x_length = count($x_value); - $y_length = count($y_value); - } - - $product_value = $this->_array_repeat(0, $x_length + $y_length); - - // the following for loop could be removed if the for loop following it - // (the one with nested for loops) initially set $i to 0, but - // doing so would also make the result in one set of unnecessary adds, - // since on the outermost loops first pass, $product->value[$k] is going - // to always be 0 - - $carry = 0; - - for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0 - $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0 - $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); - $product_value[$j] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); - } - - $product_value[$j] = $carry; - - // the above for loop is what the previous comment was talking about. the - // following for loop is the "one with nested for loops" - for ($i = 1; $i < $y_length; ++$i) { - $carry = 0; - - for ($j = 0, $k = $i; $j < $x_length; ++$j, ++$k) { - $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry; - $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); - $product_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); - } - - $product_value[$k] = $carry; - } - - return $product_value; - } - - /** - * Performs Karatsuba multiplication on two BigIntegers - * - * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=120 MPM 5.2.3}. - * - * @param Array $x_value - * @param Array $y_value - * @return Array - * @access private - */ - function _karatsuba($x_value, $y_value) - { - $m = min(count($x_value) >> 1, count($y_value) >> 1); - - if ($m < MATH_BIGINTEGER_KARATSUBA_CUTOFF) { - return $this->_regularMultiply($x_value, $y_value); - } - - $x1 = array_slice($x_value, $m); - $x0 = array_slice($x_value, 0, $m); - $y1 = array_slice($y_value, $m); - $y0 = array_slice($y_value, 0, $m); - - $z2 = $this->_karatsuba($x1, $y1); - $z0 = $this->_karatsuba($x0, $y0); - - $z1 = $this->_add($x1, false, $x0, false); - $temp = $this->_add($y1, false, $y0, false); - $z1 = $this->_karatsuba($z1[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_VALUE]); - $temp = $this->_add($z2, false, $z0, false); - $z1 = $this->_subtract($z1, false, $temp[MATH_BIGINTEGER_VALUE], false); - - $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2); - $z1[MATH_BIGINTEGER_VALUE] = array_merge(array_fill(0, $m, 0), $z1[MATH_BIGINTEGER_VALUE]); - - $xy = $this->_add($z2, false, $z1[MATH_BIGINTEGER_VALUE], $z1[MATH_BIGINTEGER_SIGN]); - $xy = $this->_add($xy[MATH_BIGINTEGER_VALUE], $xy[MATH_BIGINTEGER_SIGN], $z0, false); - - return $xy[MATH_BIGINTEGER_VALUE]; - } - - /** - * Performs squaring - * - * @param Array $x - * @return Array - * @access private - */ - function _square($x = false) - { - return count($x) < 2 * MATH_BIGINTEGER_KARATSUBA_CUTOFF ? - $this->_trim($this->_baseSquare($x)) : - $this->_trim($this->_karatsubaSquare($x)); - } - - /** - * Performs traditional squaring on two BigIntegers - * - * Squaring can be done faster than multiplying a number by itself can be. See - * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=7 HAC 14.2.4} / - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=141 MPM 5.3} for more information. - * - * @param Array $value - * @return Array - * @access private - */ - function _baseSquare($value) - { - if ( empty($value) ) { - return array(); - } - $square_value = $this->_array_repeat(0, 2 * count($value)); - - for ($i = 0, $max_index = count($value) - 1; $i <= $max_index; ++$i) { - $i2 = $i << 1; - - $temp = $square_value[$i2] + $value[$i] * $value[$i]; - $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); - $square_value[$i2] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); - - // note how we start from $i+1 instead of 0 as we do in multiplication. - for ($j = $i + 1, $k = $i2 + 1; $j <= $max_index; ++$j, ++$k) { - $temp = $square_value[$k] + 2 * $value[$j] * $value[$i] + $carry; - $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); - $square_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); - } - - // the following line can yield values larger 2**15. at this point, PHP should switch - // over to floats. - $square_value[$i + $max_index + 1] = $carry; - } - - return $square_value; - } - - /** - * Performs Karatsuba "squaring" on two BigIntegers - * - * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=151 MPM 5.3.4}. - * - * @param Array $value - * @return Array - * @access private - */ - function _karatsubaSquare($value) - { - $m = count($value) >> 1; - - if ($m < MATH_BIGINTEGER_KARATSUBA_CUTOFF) { - return $this->_baseSquare($value); - } - - $x1 = array_slice($value, $m); - $x0 = array_slice($value, 0, $m); - - $z2 = $this->_karatsubaSquare($x1); - $z0 = $this->_karatsubaSquare($x0); - - $z1 = $this->_add($x1, false, $x0, false); - $z1 = $this->_karatsubaSquare($z1[MATH_BIGINTEGER_VALUE]); - $temp = $this->_add($z2, false, $z0, false); - $z1 = $this->_subtract($z1, false, $temp[MATH_BIGINTEGER_VALUE], false); - - $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2); - $z1[MATH_BIGINTEGER_VALUE] = array_merge(array_fill(0, $m, 0), $z1[MATH_BIGINTEGER_VALUE]); - - $xx = $this->_add($z2, false, $z1[MATH_BIGINTEGER_VALUE], $z1[MATH_BIGINTEGER_SIGN]); - $xx = $this->_add($xx[MATH_BIGINTEGER_VALUE], $xx[MATH_BIGINTEGER_SIGN], $z0, false); - - return $xx[MATH_BIGINTEGER_VALUE]; - } - - /** - * Divides two BigIntegers. - * - * Returns an array whose first element contains the quotient and whose second element contains the - * "common residue". If the remainder would be positive, the "common residue" and the remainder are the - * same. If the remainder would be negative, the "common residue" is equal to the sum of the remainder - * and the divisor (basically, the "common residue" is the first positive modulo). - * - * Here's an example: - * - * divide($b); - * - * echo $quotient->toString(); // outputs 0 - * echo "\r\n"; - * echo $remainder->toString(); // outputs 10 - * ?> - * - * - * @param Math_BigInteger $y - * @return Array - * @access public - * @internal This function is based off of {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=9 HAC 14.20}. - */ - function divide($y) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $quotient = new Math_BigInteger(); - $remainder = new Math_BigInteger(); - - list($quotient->value, $remainder->value) = gmp_div_qr($this->value, $y->value); - - if (gmp_sign($remainder->value) < 0) { - $remainder->value = gmp_add($remainder->value, gmp_abs($y->value)); - } - - return array($this->_normalize($quotient), $this->_normalize($remainder)); - case MATH_BIGINTEGER_MODE_BCMATH: - $quotient = new Math_BigInteger(); - $remainder = new Math_BigInteger(); - - $quotient->value = bcdiv($this->value, $y->value, 0); - $remainder->value = bcmod($this->value, $y->value); - - if ($remainder->value[0] == '-') { - $remainder->value = bcadd($remainder->value, $y->value[0] == '-' ? substr($y->value, 1) : $y->value, 0); - } - - return array($this->_normalize($quotient), $this->_normalize($remainder)); - } - - if (count($y->value) == 1) { - list($q, $r) = $this->_divide_digit($this->value, $y->value[0]); - $quotient = new Math_BigInteger(); - $remainder = new Math_BigInteger(); - $quotient->value = $q; - $remainder->value = array($r); - $quotient->is_negative = $this->is_negative != $y->is_negative; - return array($this->_normalize($quotient), $this->_normalize($remainder)); - } - - static $zero; - if ( !isset($zero) ) { - $zero = new Math_BigInteger(); - } - - $x = $this->copy(); - $y = $y->copy(); - - $x_sign = $x->is_negative; - $y_sign = $y->is_negative; - - $x->is_negative = $y->is_negative = false; - - $diff = $x->compare($y); - - if ( !$diff ) { - $temp = new Math_BigInteger(); - $temp->value = array(1); - $temp->is_negative = $x_sign != $y_sign; - return array($this->_normalize($temp), $this->_normalize(new Math_BigInteger())); - } - - if ( $diff < 0 ) { - // if $x is negative, "add" $y. - if ( $x_sign ) { - $x = $y->subtract($x); - } - return array($this->_normalize(new Math_BigInteger()), $this->_normalize($x)); - } - - // normalize $x and $y as described in HAC 14.23 / 14.24 - $msb = $y->value[count($y->value) - 1]; - for ($shift = 0; !($msb & MATH_BIGINTEGER_MSB); ++$shift) { - $msb <<= 1; - } - $x->_lshift($shift); - $y->_lshift($shift); - $y_value = &$y->value; - - $x_max = count($x->value) - 1; - $y_max = count($y->value) - 1; - - $quotient = new Math_BigInteger(); - $quotient_value = &$quotient->value; - $quotient_value = $this->_array_repeat(0, $x_max - $y_max + 1); - - static $temp, $lhs, $rhs; - if (!isset($temp)) { - $temp = new Math_BigInteger(); - $lhs = new Math_BigInteger(); - $rhs = new Math_BigInteger(); - } - $temp_value = &$temp->value; - $rhs_value = &$rhs->value; - - // $temp = $y << ($x_max - $y_max-1) in base 2**26 - $temp_value = array_merge($this->_array_repeat(0, $x_max - $y_max), $y_value); - - while ( $x->compare($temp) >= 0 ) { - // calculate the "common residue" - ++$quotient_value[$x_max - $y_max]; - $x = $x->subtract($temp); - $x_max = count($x->value) - 1; - } - - for ($i = $x_max; $i >= $y_max + 1; --$i) { - $x_value = &$x->value; - $x_window = array( - isset($x_value[$i]) ? $x_value[$i] : 0, - isset($x_value[$i - 1]) ? $x_value[$i - 1] : 0, - isset($x_value[$i - 2]) ? $x_value[$i - 2] : 0 - ); - $y_window = array( - $y_value[$y_max], - ( $y_max > 0 ) ? $y_value[$y_max - 1] : 0 - ); - - $q_index = $i - $y_max - 1; - if ($x_window[0] == $y_window[0]) { - $quotient_value[$q_index] = MATH_BIGINTEGER_MAX_DIGIT; - } else { - $quotient_value[$q_index] = $this->_safe_divide( - $x_window[0] * MATH_BIGINTEGER_BASE_FULL + $x_window[1], - $y_window[0] - ); - } - - $temp_value = array($y_window[1], $y_window[0]); - - $lhs->value = array($quotient_value[$q_index]); - $lhs = $lhs->multiply($temp); - - $rhs_value = array($x_window[2], $x_window[1], $x_window[0]); - - while ( $lhs->compare($rhs) > 0 ) { - --$quotient_value[$q_index]; - - $lhs->value = array($quotient_value[$q_index]); - $lhs = $lhs->multiply($temp); - } - - $adjust = $this->_array_repeat(0, $q_index); - $temp_value = array($quotient_value[$q_index]); - $temp = $temp->multiply($y); - $temp_value = &$temp->value; - $temp_value = array_merge($adjust, $temp_value); - - $x = $x->subtract($temp); - - if ($x->compare($zero) < 0) { - $temp_value = array_merge($adjust, $y_value); - $x = $x->add($temp); - - --$quotient_value[$q_index]; - } - - $x_max = count($x_value) - 1; - } - - // unnormalize the remainder - $x->_rshift($shift); - - $quotient->is_negative = $x_sign != $y_sign; - - // calculate the "common residue", if appropriate - if ( $x_sign ) { - $y->_rshift($shift); - $x = $y->subtract($x); - } - - return array($this->_normalize($quotient), $this->_normalize($x)); - } - - /** - * Divides a BigInteger by a regular integer - * - * abc / x = a00 / x + b0 / x + c / x - * - * @param Array $dividend - * @param Array $divisor - * @return Array - * @access private - */ - function _divide_digit($dividend, $divisor) - { - $carry = 0; - $result = array(); - - for ($i = count($dividend) - 1; $i >= 0; --$i) { - $temp = MATH_BIGINTEGER_BASE_FULL * $carry + $dividend[$i]; - $result[$i] = $this->_safe_divide($temp, $divisor); - $carry = (int) ($temp - $divisor * $result[$i]); - } - - return array($result, $carry); - } - - /** - * Performs modular exponentiation. - * - * Here's an example: - * - * modPow($b, $c); - * - * echo $c->toString(); // outputs 10 - * ?> - * - * - * @param Math_BigInteger $e - * @param Math_BigInteger $n - * @return Math_BigInteger - * @access public - * @internal The most naive approach to modular exponentiation has very unreasonable requirements, and - * and although the approach involving repeated squaring does vastly better, it, too, is impractical - * for our purposes. The reason being that division - by far the most complicated and time-consuming - * of the basic operations (eg. +,-,*,/) - occurs multiple times within it. - * - * Modular reductions resolve this issue. Although an individual modular reduction takes more time - * then an individual division, when performed in succession (with the same modulo), they're a lot faster. - * - * The two most commonly used modular reductions are Barrett and Montgomery reduction. Montgomery reduction, - * although faster, only works when the gcd of the modulo and of the base being used is 1. In RSA, when the - * base is a power of two, the modulo - a product of two primes - is always going to have a gcd of 1 (because - * the product of two odd numbers is odd), but what about when RSA isn't used? - * - * In contrast, Barrett reduction has no such constraint. As such, some bigint implementations perform a - * Barrett reduction after every operation in the modpow function. Others perform Barrett reductions when the - * modulo is even and Montgomery reductions when the modulo is odd. BigInteger.java's modPow method, however, - * uses a trick involving the Chinese Remainder Theorem to factor the even modulo into two numbers - one odd and - * the other, a power of two - and recombine them, later. This is the method that this modPow function uses. - * {@link http://islab.oregonstate.edu/papers/j34monex.pdf Montgomery Reduction with Even Modulus} elaborates. - */ - function modPow($e, $n) - { - $n = $this->bitmask !== false && $this->bitmask->compare($n) < 0 ? $this->bitmask : $n->abs(); - - if ($e->compare(new Math_BigInteger()) < 0) { - $e = $e->abs(); - - $temp = $this->modInverse($n); - if ($temp === false) { - return false; - } - - return $this->_normalize($temp->modPow($e, $n)); - } - - if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_GMP ) { - $temp = new Math_BigInteger(); - $temp->value = gmp_powm($this->value, $e->value, $n->value); - - return $this->_normalize($temp); - } - - if ($this->compare(new Math_BigInteger()) < 0 || $this->compare($n) > 0) { - list(, $temp) = $this->divide($n); - return $temp->modPow($e, $n); - } - - if (defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) { - $components = array( - 'modulus' => $n->toBytes(true), - 'publicExponent' => $e->toBytes(true) - ); - - $components = array( - 'modulus' => pack('Ca*a*', 2, $this->_encodeASN1Length(strlen($components['modulus'])), $components['modulus']), - 'publicExponent' => pack('Ca*a*', 2, $this->_encodeASN1Length(strlen($components['publicExponent'])), $components['publicExponent']) - ); - - $RSAPublicKey = pack('Ca*a*a*', - 48, $this->_encodeASN1Length(strlen($components['modulus']) + strlen($components['publicExponent'])), - $components['modulus'], $components['publicExponent'] - ); - - $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA - $RSAPublicKey = chr(0) . $RSAPublicKey; - $RSAPublicKey = chr(3) . $this->_encodeASN1Length(strlen($RSAPublicKey)) . $RSAPublicKey; - - $encapsulated = pack('Ca*a*', - 48, $this->_encodeASN1Length(strlen($rsaOID . $RSAPublicKey)), $rsaOID . $RSAPublicKey - ); - - $RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" . - chunk_split(base64_encode($encapsulated)) . - '-----END PUBLIC KEY-----'; - - $plaintext = str_pad($this->toBytes(), strlen($n->toBytes(true)) - 1, "\0", STR_PAD_LEFT); - - if (openssl_public_encrypt($plaintext, $result, $RSAPublicKey, OPENSSL_NO_PADDING)) { - return new Math_BigInteger($result, 256); - } - } - - if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH ) { - $temp = new Math_BigInteger(); - $temp->value = bcpowmod($this->value, $e->value, $n->value, 0); - - return $this->_normalize($temp); - } - - if ( empty($e->value) ) { - $temp = new Math_BigInteger(); - $temp->value = array(1); - return $this->_normalize($temp); - } - - if ( $e->value == array(1) ) { - list(, $temp) = $this->divide($n); - return $this->_normalize($temp); - } - - if ( $e->value == array(2) ) { - $temp = new Math_BigInteger(); - $temp->value = $this->_square($this->value); - list(, $temp) = $temp->divide($n); - return $this->_normalize($temp); - } - - return $this->_normalize($this->_slidingWindow($e, $n, MATH_BIGINTEGER_BARRETT)); - - // the following code, although not callable, can be run independently of the above code - // although the above code performed better in my benchmarks the following could might - // perform better under different circumstances. in lieu of deleting it it's just been - // made uncallable - - // is the modulo odd? - if ( $n->value[0] & 1 ) { - return $this->_normalize($this->_slidingWindow($e, $n, MATH_BIGINTEGER_MONTGOMERY)); - } - // if it's not, it's even - - // find the lowest set bit (eg. the max pow of 2 that divides $n) - for ($i = 0; $i < count($n->value); ++$i) { - if ( $n->value[$i] ) { - $temp = decbin($n->value[$i]); - $j = strlen($temp) - strrpos($temp, '1') - 1; - $j+= 26 * $i; - break; - } - } - // at this point, 2^$j * $n/(2^$j) == $n - - $mod1 = $n->copy(); - $mod1->_rshift($j); - $mod2 = new Math_BigInteger(); - $mod2->value = array(1); - $mod2->_lshift($j); - - $part1 = ( $mod1->value != array(1) ) ? $this->_slidingWindow($e, $mod1, MATH_BIGINTEGER_MONTGOMERY) : new Math_BigInteger(); - $part2 = $this->_slidingWindow($e, $mod2, MATH_BIGINTEGER_POWEROF2); - - $y1 = $mod2->modInverse($mod1); - $y2 = $mod1->modInverse($mod2); - - $result = $part1->multiply($mod2); - $result = $result->multiply($y1); - - $temp = $part2->multiply($mod1); - $temp = $temp->multiply($y2); - - $result = $result->add($temp); - list(, $result) = $result->divide($n); - - return $this->_normalize($result); - } - - /** - * Performs modular exponentiation. - * - * Alias for Math_BigInteger::modPow() - * - * @param Math_BigInteger $e - * @param Math_BigInteger $n - * @return Math_BigInteger - * @access public - */ - function powMod($e, $n) - { - return $this->modPow($e, $n); - } - - /** - * Sliding Window k-ary Modular Exponentiation - * - * Based on {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=27 HAC 14.85} / - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=210 MPM 7.7}. In a departure from those algorithims, - * however, this function performs a modular reduction after every multiplication and squaring operation. - * As such, this function has the same preconditions that the reductions being used do. - * - * @param Math_BigInteger $e - * @param Math_BigInteger $n - * @param Integer $mode - * @return Math_BigInteger - * @access private - */ - function _slidingWindow($e, $n, $mode) - { - static $window_ranges = array(7, 25, 81, 241, 673, 1793); // from BigInteger.java's oddModPow function - //static $window_ranges = array(0, 7, 36, 140, 450, 1303, 3529); // from MPM 7.3.1 - - $e_value = $e->value; - $e_length = count($e_value) - 1; - $e_bits = decbin($e_value[$e_length]); - for ($i = $e_length - 1; $i >= 0; --$i) { - $e_bits.= str_pad(decbin($e_value[$i]), MATH_BIGINTEGER_BASE, '0', STR_PAD_LEFT); - } - - $e_length = strlen($e_bits); - - // calculate the appropriate window size. - // $window_size == 3 if $window_ranges is between 25 and 81, for example. - for ($i = 0, $window_size = 1; $e_length > $window_ranges[$i] && $i < count($window_ranges); ++$window_size, ++$i); - - $n_value = $n->value; - - // precompute $this^0 through $this^$window_size - $powers = array(); - $powers[1] = $this->_prepareReduce($this->value, $n_value, $mode); - $powers[2] = $this->_squareReduce($powers[1], $n_value, $mode); - - // we do every other number since substr($e_bits, $i, $j+1) (see below) is supposed to end - // in a 1. ie. it's supposed to be odd. - $temp = 1 << ($window_size - 1); - for ($i = 1; $i < $temp; ++$i) { - $i2 = $i << 1; - $powers[$i2 + 1] = $this->_multiplyReduce($powers[$i2 - 1], $powers[2], $n_value, $mode); - } - - $result = array(1); - $result = $this->_prepareReduce($result, $n_value, $mode); - - for ($i = 0; $i < $e_length; ) { - if ( !$e_bits[$i] ) { - $result = $this->_squareReduce($result, $n_value, $mode); - ++$i; - } else { - for ($j = $window_size - 1; $j > 0; --$j) { - if ( !empty($e_bits[$i + $j]) ) { - break; - } - } - - for ($k = 0; $k <= $j; ++$k) {// eg. the length of substr($e_bits, $i, $j+1) - $result = $this->_squareReduce($result, $n_value, $mode); - } - - $result = $this->_multiplyReduce($result, $powers[bindec(substr($e_bits, $i, $j + 1))], $n_value, $mode); - - $i+=$j + 1; - } - } - - $temp = new Math_BigInteger(); - $temp->value = $this->_reduce($result, $n_value, $mode); - - return $temp; - } - - /** - * Modular reduction - * - * For most $modes this will return the remainder. - * - * @see _slidingWindow() - * @access private - * @param Array $x - * @param Array $n - * @param Integer $mode - * @return Array - */ - function _reduce($x, $n, $mode) - { - switch ($mode) { - case MATH_BIGINTEGER_MONTGOMERY: - return $this->_montgomery($x, $n); - case MATH_BIGINTEGER_BARRETT: - return $this->_barrett($x, $n); - case MATH_BIGINTEGER_POWEROF2: - $lhs = new Math_BigInteger(); - $lhs->value = $x; - $rhs = new Math_BigInteger(); - $rhs->value = $n; - return $x->_mod2($n); - case MATH_BIGINTEGER_CLASSIC: - $lhs = new Math_BigInteger(); - $lhs->value = $x; - $rhs = new Math_BigInteger(); - $rhs->value = $n; - list(, $temp) = $lhs->divide($rhs); - return $temp->value; - case MATH_BIGINTEGER_NONE: - return $x; - default: - // an invalid $mode was provided - } - } - - /** - * Modular reduction preperation - * - * @see _slidingWindow() - * @access private - * @param Array $x - * @param Array $n - * @param Integer $mode - * @return Array - */ - function _prepareReduce($x, $n, $mode) - { - if ($mode == MATH_BIGINTEGER_MONTGOMERY) { - return $this->_prepMontgomery($x, $n); - } - return $this->_reduce($x, $n, $mode); - } - - /** - * Modular multiply - * - * @see _slidingWindow() - * @access private - * @param Array $x - * @param Array $y - * @param Array $n - * @param Integer $mode - * @return Array - */ - function _multiplyReduce($x, $y, $n, $mode) - { - if ($mode == MATH_BIGINTEGER_MONTGOMERY) { - return $this->_montgomeryMultiply($x, $y, $n); - } - $temp = $this->_multiply($x, false, $y, false); - return $this->_reduce($temp[MATH_BIGINTEGER_VALUE], $n, $mode); - } - - /** - * Modular square - * - * @see _slidingWindow() - * @access private - * @param Array $x - * @param Array $n - * @param Integer $mode - * @return Array - */ - function _squareReduce($x, $n, $mode) - { - if ($mode == MATH_BIGINTEGER_MONTGOMERY) { - return $this->_montgomeryMultiply($x, $x, $n); - } - return $this->_reduce($this->_square($x), $n, $mode); - } - - /** - * Modulos for Powers of Two - * - * Calculates $x%$n, where $n = 2**$e, for some $e. Since this is basically the same as doing $x & ($n-1), - * we'll just use this function as a wrapper for doing that. - * - * @see _slidingWindow() - * @access private - * @param Math_BigInteger - * @return Math_BigInteger - */ - function _mod2($n) - { - $temp = new Math_BigInteger(); - $temp->value = array(1); - return $this->bitwise_and($n->subtract($temp)); - } - - /** - * Barrett Modular Reduction - * - * See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=14 HAC 14.3.3} / - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=165 MPM 6.2.5} for more information. Modified slightly, - * so as not to require negative numbers (initially, this script didn't support negative numbers). - * - * Employs "folding", as described at - * {@link http://www.cosic.esat.kuleuven.be/publications/thesis-149.pdf#page=66 thesis-149.pdf#page=66}. To quote from - * it, "the idea [behind folding] is to find a value x' such that x (mod m) = x' (mod m), with x' being smaller than x." - * - * Unfortunately, the "Barrett Reduction with Folding" algorithm described in thesis-149.pdf is not, as written, all that - * usable on account of (1) its not using reasonable radix points as discussed in - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=162 MPM 6.2.2} and (2) the fact that, even with reasonable - * radix points, it only works when there are an even number of digits in the denominator. The reason for (2) is that - * (x >> 1) + (x >> 1) != x / 2 + x / 2. If x is even, they're the same, but if x is odd, they're not. See the in-line - * comments for details. - * - * @see _slidingWindow() - * @access private - * @param Array $n - * @param Array $m - * @return Array - */ - function _barrett($n, $m) - { - static $cache = array( - MATH_BIGINTEGER_VARIABLE => array(), - MATH_BIGINTEGER_DATA => array() - ); - - $m_length = count($m); - - // if ($this->_compare($n, $this->_square($m)) >= 0) { - if (count($n) > 2 * $m_length) { - $lhs = new Math_BigInteger(); - $rhs = new Math_BigInteger(); - $lhs->value = $n; - $rhs->value = $m; - list(, $temp) = $lhs->divide($rhs); - return $temp->value; - } - - // if (m.length >> 1) + 2 <= m.length then m is too small and n can't be reduced - if ($m_length < 5) { - return $this->_regularBarrett($n, $m); - } - - // n = 2 * m.length - - if ( ($key = array_search($m, $cache[MATH_BIGINTEGER_VARIABLE])) === false ) { - $key = count($cache[MATH_BIGINTEGER_VARIABLE]); - $cache[MATH_BIGINTEGER_VARIABLE][] = $m; - - $lhs = new Math_BigInteger(); - $lhs_value = &$lhs->value; - $lhs_value = $this->_array_repeat(0, $m_length + ($m_length >> 1)); - $lhs_value[] = 1; - $rhs = new Math_BigInteger(); - $rhs->value = $m; - - list($u, $m1) = $lhs->divide($rhs); - $u = $u->value; - $m1 = $m1->value; - - $cache[MATH_BIGINTEGER_DATA][] = array( - 'u' => $u, // m.length >> 1 (technically (m.length >> 1) + 1) - 'm1'=> $m1 // m.length - ); - } else { - extract($cache[MATH_BIGINTEGER_DATA][$key]); - } - - $cutoff = $m_length + ($m_length >> 1); - $lsd = array_slice($n, 0, $cutoff); // m.length + (m.length >> 1) - $msd = array_slice($n, $cutoff); // m.length >> 1 - $lsd = $this->_trim($lsd); - $temp = $this->_multiply($msd, false, $m1, false); - $n = $this->_add($lsd, false, $temp[MATH_BIGINTEGER_VALUE], false); // m.length + (m.length >> 1) + 1 - - if ($m_length & 1) { - return $this->_regularBarrett($n[MATH_BIGINTEGER_VALUE], $m); - } - - // (m.length + (m.length >> 1) + 1) - (m.length - 1) == (m.length >> 1) + 2 - $temp = array_slice($n[MATH_BIGINTEGER_VALUE], $m_length - 1); - // if even: ((m.length >> 1) + 2) + (m.length >> 1) == m.length + 2 - // if odd: ((m.length >> 1) + 2) + (m.length >> 1) == (m.length - 1) + 2 == m.length + 1 - $temp = $this->_multiply($temp, false, $u, false); - // if even: (m.length + 2) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) + 1 - // if odd: (m.length + 1) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) - $temp = array_slice($temp[MATH_BIGINTEGER_VALUE], ($m_length >> 1) + 1); - // if even: (m.length - (m.length >> 1) + 1) + m.length = 2 * m.length - (m.length >> 1) + 1 - // if odd: (m.length - (m.length >> 1)) + m.length = 2 * m.length - (m.length >> 1) - $temp = $this->_multiply($temp, false, $m, false); - - // at this point, if m had an odd number of digits, we'd be subtracting a 2 * m.length - (m.length >> 1) digit - // number from a m.length + (m.length >> 1) + 1 digit number. ie. there'd be an extra digit and the while loop - // following this comment would loop a lot (hence our calling _regularBarrett() in that situation). - - $result = $this->_subtract($n[MATH_BIGINTEGER_VALUE], false, $temp[MATH_BIGINTEGER_VALUE], false); - - while ($this->_compare($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $m, false) >= 0) { - $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $m, false); - } - - return $result[MATH_BIGINTEGER_VALUE]; - } - - /** - * (Regular) Barrett Modular Reduction - * - * For numbers with more than four digits Math_BigInteger::_barrett() is faster. The difference between that and this - * is that this function does not fold the denominator into a smaller form. - * - * @see _slidingWindow() - * @access private - * @param Array $x - * @param Array $n - * @return Array - */ - function _regularBarrett($x, $n) - { - static $cache = array( - MATH_BIGINTEGER_VARIABLE => array(), - MATH_BIGINTEGER_DATA => array() - ); - - $n_length = count($n); - - if (count($x) > 2 * $n_length) { - $lhs = new Math_BigInteger(); - $rhs = new Math_BigInteger(); - $lhs->value = $x; - $rhs->value = $n; - list(, $temp) = $lhs->divide($rhs); - return $temp->value; - } - - if ( ($key = array_search($n, $cache[MATH_BIGINTEGER_VARIABLE])) === false ) { - $key = count($cache[MATH_BIGINTEGER_VARIABLE]); - $cache[MATH_BIGINTEGER_VARIABLE][] = $n; - $lhs = new Math_BigInteger(); - $lhs_value = &$lhs->value; - $lhs_value = $this->_array_repeat(0, 2 * $n_length); - $lhs_value[] = 1; - $rhs = new Math_BigInteger(); - $rhs->value = $n; - list($temp, ) = $lhs->divide($rhs); // m.length - $cache[MATH_BIGINTEGER_DATA][] = $temp->value; - } - - // 2 * m.length - (m.length - 1) = m.length + 1 - $temp = array_slice($x, $n_length - 1); - // (m.length + 1) + m.length = 2 * m.length + 1 - $temp = $this->_multiply($temp, false, $cache[MATH_BIGINTEGER_DATA][$key], false); - // (2 * m.length + 1) - (m.length - 1) = m.length + 2 - $temp = array_slice($temp[MATH_BIGINTEGER_VALUE], $n_length + 1); - - // m.length + 1 - $result = array_slice($x, 0, $n_length + 1); - // m.length + 1 - $temp = $this->_multiplyLower($temp, false, $n, false, $n_length + 1); - // $temp == array_slice($temp->_multiply($temp, false, $n, false)->value, 0, $n_length + 1) - - if ($this->_compare($result, false, $temp[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_SIGN]) < 0) { - $corrector_value = $this->_array_repeat(0, $n_length + 1); - $corrector_value[count($corrector_value)] = 1; - $result = $this->_add($result, false, $corrector_value, false); - $result = $result[MATH_BIGINTEGER_VALUE]; - } - - // at this point, we're subtracting a number with m.length + 1 digits from another number with m.length + 1 digits - $result = $this->_subtract($result, false, $temp[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_SIGN]); - while ($this->_compare($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $n, false) > 0) { - $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $n, false); - } - - return $result[MATH_BIGINTEGER_VALUE]; - } - - /** - * Performs long multiplication up to $stop digits - * - * If you're going to be doing array_slice($product->value, 0, $stop), some cycles can be saved. - * - * @see _regularBarrett() - * @param Array $x_value - * @param Boolean $x_negative - * @param Array $y_value - * @param Boolean $y_negative - * @param Integer $stop - * @return Array - * @access private - */ - function _multiplyLower($x_value, $x_negative, $y_value, $y_negative, $stop) - { - $x_length = count($x_value); - $y_length = count($y_value); - - if ( !$x_length || !$y_length ) { // a 0 is being multiplied - return array( - MATH_BIGINTEGER_VALUE => array(), - MATH_BIGINTEGER_SIGN => false - ); - } - - if ( $x_length < $y_length ) { - $temp = $x_value; - $x_value = $y_value; - $y_value = $temp; - - $x_length = count($x_value); - $y_length = count($y_value); - } - - $product_value = $this->_array_repeat(0, $x_length + $y_length); - - // the following for loop could be removed if the for loop following it - // (the one with nested for loops) initially set $i to 0, but - // doing so would also make the result in one set of unnecessary adds, - // since on the outermost loops first pass, $product->value[$k] is going - // to always be 0 - - $carry = 0; - - for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0, $k = $i - $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0 - $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); - $product_value[$j] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); - } - - if ($j < $stop) { - $product_value[$j] = $carry; - } - - // the above for loop is what the previous comment was talking about. the - // following for loop is the "one with nested for loops" - - for ($i = 1; $i < $y_length; ++$i) { - $carry = 0; - - for ($j = 0, $k = $i; $j < $x_length && $k < $stop; ++$j, ++$k) { - $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry; - $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); - $product_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); - } - - if ($k < $stop) { - $product_value[$k] = $carry; - } - } - - return array( - MATH_BIGINTEGER_VALUE => $this->_trim($product_value), - MATH_BIGINTEGER_SIGN => $x_negative != $y_negative - ); - } - - /** - * Montgomery Modular Reduction - * - * ($x->_prepMontgomery($n))->_montgomery($n) yields $x % $n. - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=170 MPM 6.3} provides insights on how this can be - * improved upon (basically, by using the comba method). gcd($n, 2) must be equal to one for this function - * to work correctly. - * - * @see _prepMontgomery() - * @see _slidingWindow() - * @access private - * @param Array $x - * @param Array $n - * @return Array - */ - function _montgomery($x, $n) - { - static $cache = array( - MATH_BIGINTEGER_VARIABLE => array(), - MATH_BIGINTEGER_DATA => array() - ); - - if ( ($key = array_search($n, $cache[MATH_BIGINTEGER_VARIABLE])) === false ) { - $key = count($cache[MATH_BIGINTEGER_VARIABLE]); - $cache[MATH_BIGINTEGER_VARIABLE][] = $x; - $cache[MATH_BIGINTEGER_DATA][] = $this->_modInverse67108864($n); - } - - $k = count($n); - - $result = array(MATH_BIGINTEGER_VALUE => $x); - - for ($i = 0; $i < $k; ++$i) { - $temp = $result[MATH_BIGINTEGER_VALUE][$i] * $cache[MATH_BIGINTEGER_DATA][$key]; - $temp = $temp - MATH_BIGINTEGER_BASE_FULL * (MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); - $temp = $this->_regularMultiply(array($temp), $n); - $temp = array_merge($this->_array_repeat(0, $i), $temp); - $result = $this->_add($result[MATH_BIGINTEGER_VALUE], false, $temp, false); - } - - $result[MATH_BIGINTEGER_VALUE] = array_slice($result[MATH_BIGINTEGER_VALUE], $k); - - if ($this->_compare($result, false, $n, false) >= 0) { - $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], false, $n, false); - } - - return $result[MATH_BIGINTEGER_VALUE]; - } - - /** - * Montgomery Multiply - * - * Interleaves the montgomery reduction and long multiplication algorithms together as described in - * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=13 HAC 14.36} - * - * @see _prepMontgomery() - * @see _montgomery() - * @access private - * @param Array $x - * @param Array $y - * @param Array $m - * @return Array - */ - function _montgomeryMultiply($x, $y, $m) - { - $temp = $this->_multiply($x, false, $y, false); - return $this->_montgomery($temp[MATH_BIGINTEGER_VALUE], $m); - - // the following code, although not callable, can be run independently of the above code - // although the above code performed better in my benchmarks the following could might - // perform better under different circumstances. in lieu of deleting it it's just been - // made uncallable - - static $cache = array( - MATH_BIGINTEGER_VARIABLE => array(), - MATH_BIGINTEGER_DATA => array() - ); - - if ( ($key = array_search($m, $cache[MATH_BIGINTEGER_VARIABLE])) === false ) { - $key = count($cache[MATH_BIGINTEGER_VARIABLE]); - $cache[MATH_BIGINTEGER_VARIABLE][] = $m; - $cache[MATH_BIGINTEGER_DATA][] = $this->_modInverse67108864($m); - } - - $n = max(count($x), count($y), count($m)); - $x = array_pad($x, $n, 0); - $y = array_pad($y, $n, 0); - $m = array_pad($m, $n, 0); - $a = array(MATH_BIGINTEGER_VALUE => $this->_array_repeat(0, $n + 1)); - for ($i = 0; $i < $n; ++$i) { - $temp = $a[MATH_BIGINTEGER_VALUE][0] + $x[$i] * $y[0]; - $temp = $temp - MATH_BIGINTEGER_BASE_FULL * (MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); - $temp = $temp * $cache[MATH_BIGINTEGER_DATA][$key]; - $temp = $temp - MATH_BIGINTEGER_BASE_FULL * (MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); - $temp = $this->_add($this->_regularMultiply(array($x[$i]), $y), false, $this->_regularMultiply(array($temp), $m), false); - $a = $this->_add($a[MATH_BIGINTEGER_VALUE], false, $temp[MATH_BIGINTEGER_VALUE], false); - $a[MATH_BIGINTEGER_VALUE] = array_slice($a[MATH_BIGINTEGER_VALUE], 1); - } - if ($this->_compare($a[MATH_BIGINTEGER_VALUE], false, $m, false) >= 0) { - $a = $this->_subtract($a[MATH_BIGINTEGER_VALUE], false, $m, false); - } - return $a[MATH_BIGINTEGER_VALUE]; - } - - /** - * Prepare a number for use in Montgomery Modular Reductions - * - * @see _montgomery() - * @see _slidingWindow() - * @access private - * @param Array $x - * @param Array $n - * @return Array - */ - function _prepMontgomery($x, $n) - { - $lhs = new Math_BigInteger(); - $lhs->value = array_merge($this->_array_repeat(0, count($n)), $x); - $rhs = new Math_BigInteger(); - $rhs->value = $n; - - list(, $temp) = $lhs->divide($rhs); - return $temp->value; - } - - /** - * Modular Inverse of a number mod 2**26 (eg. 67108864) - * - * Based off of the bnpInvDigit function implemented and justified in the following URL: - * - * {@link http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js} - * - * The following URL provides more info: - * - * {@link http://groups.google.com/group/sci.crypt/msg/7a137205c1be7d85} - * - * As for why we do all the bitmasking... strange things can happen when converting from floats to ints. For - * instance, on some computers, var_dump((int) -4294967297) yields int(-1) and on others, it yields - * int(-2147483648). To avoid problems stemming from this, we use bitmasks to guarantee that ints aren't - * auto-converted to floats. The outermost bitmask is present because without it, there's no guarantee that - * the "residue" returned would be the so-called "common residue". We use fmod, in the last step, because the - * maximum possible $x is 26 bits and the maximum $result is 16 bits. Thus, we have to be able to handle up to - * 40 bits, which only 64-bit floating points will support. - * - * Thanks to Pedro Gimeno Fortea for input! - * - * @see _montgomery() - * @access private - * @param Array $x - * @return Integer - */ - function _modInverse67108864($x) // 2**26 == 67,108,864 - { - $x = -$x[0]; - $result = $x & 0x3; // x**-1 mod 2**2 - $result = ($result * (2 - $x * $result)) & 0xF; // x**-1 mod 2**4 - $result = ($result * (2 - ($x & 0xFF) * $result)) & 0xFF; // x**-1 mod 2**8 - $result = ($result * ((2 - ($x & 0xFFFF) * $result) & 0xFFFF)) & 0xFFFF; // x**-1 mod 2**16 - $result = fmod($result * (2 - fmod($x * $result, MATH_BIGINTEGER_BASE_FULL)), MATH_BIGINTEGER_BASE_FULL); // x**-1 mod 2**26 - return $result & MATH_BIGINTEGER_MAX_DIGIT; - } - - /** - * Calculates modular inverses. - * - * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. - * - * Here's an example: - * - * modInverse($b); - * echo $c->toString(); // outputs 4 - * - * echo "\r\n"; - * - * $d = $a->multiply($c); - * list(, $d) = $d->divide($b); - * echo $d; // outputs 1 (as per the definition of modular inverse) - * ?> - * - * - * @param Math_BigInteger $n - * @return mixed false, if no modular inverse exists, Math_BigInteger, otherwise. - * @access public - * @internal See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=21 HAC 14.64} for more information. - */ - function modInverse($n) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $temp = new Math_BigInteger(); - $temp->value = gmp_invert($this->value, $n->value); - - return ( $temp->value === false ) ? false : $this->_normalize($temp); - } - - static $zero, $one; - if (!isset($zero)) { - $zero = new Math_BigInteger(); - $one = new Math_BigInteger(1); - } - - // $x mod -$n == $x mod $n. - $n = $n->abs(); - - if ($this->compare($zero) < 0) { - $temp = $this->abs(); - $temp = $temp->modInverse($n); - return $this->_normalize($n->subtract($temp)); - } - - extract($this->extendedGCD($n)); - - if (!$gcd->equals($one)) { - return false; - } - - $x = $x->compare($zero) < 0 ? $x->add($n) : $x; - - return $this->compare($zero) < 0 ? $this->_normalize($n->subtract($x)) : $this->_normalize($x); - } - - /** - * Calculates the greatest common divisor and Bezout's identity. - * - * Say you have 693 and 609. The GCD is 21. Bezout's identity states that there exist integers x and y such that - * 693*x + 609*y == 21. In point of fact, there are actually an infinite number of x and y combinations and which - * combination is returned is dependant upon which mode is in use. See - * {@link http://en.wikipedia.org/wiki/B%C3%A9zout%27s_identity Bezout's identity - Wikipedia} for more information. - * - * Here's an example: - * - * extendedGCD($b)); - * - * echo $gcd->toString() . "\r\n"; // outputs 21 - * echo $a->toString() * $x->toString() + $b->toString() * $y->toString(); // outputs 21 - * ?> - * - * - * @param Math_BigInteger $n - * @return Math_BigInteger - * @access public - * @internal Calculates the GCD using the binary xGCD algorithim described in - * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=19 HAC 14.61}. As the text above 14.61 notes, - * the more traditional algorithim requires "relatively costly multiple-precision divisions". - */ - function extendedGCD($n) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - extract(gmp_gcdext($this->value, $n->value)); - - return array( - 'gcd' => $this->_normalize(new Math_BigInteger($g)), - 'x' => $this->_normalize(new Math_BigInteger($s)), - 'y' => $this->_normalize(new Math_BigInteger($t)) - ); - case MATH_BIGINTEGER_MODE_BCMATH: - // it might be faster to use the binary xGCD algorithim here, as well, but (1) that algorithim works - // best when the base is a power of 2 and (2) i don't think it'd make much difference, anyway. as is, - // the basic extended euclidean algorithim is what we're using. - - $u = $this->value; - $v = $n->value; - - $a = '1'; - $b = '0'; - $c = '0'; - $d = '1'; - - while (bccomp($v, '0', 0) != 0) { - $q = bcdiv($u, $v, 0); - - $temp = $u; - $u = $v; - $v = bcsub($temp, bcmul($v, $q, 0), 0); - - $temp = $a; - $a = $c; - $c = bcsub($temp, bcmul($a, $q, 0), 0); - - $temp = $b; - $b = $d; - $d = bcsub($temp, bcmul($b, $q, 0), 0); - } - - return array( - 'gcd' => $this->_normalize(new Math_BigInteger($u)), - 'x' => $this->_normalize(new Math_BigInteger($a)), - 'y' => $this->_normalize(new Math_BigInteger($b)) - ); - } - - $y = $n->copy(); - $x = $this->copy(); - $g = new Math_BigInteger(); - $g->value = array(1); - - while ( !(($x->value[0] & 1)|| ($y->value[0] & 1)) ) { - $x->_rshift(1); - $y->_rshift(1); - $g->_lshift(1); - } - - $u = $x->copy(); - $v = $y->copy(); - - $a = new Math_BigInteger(); - $b = new Math_BigInteger(); - $c = new Math_BigInteger(); - $d = new Math_BigInteger(); - - $a->value = $d->value = $g->value = array(1); - $b->value = $c->value = array(); - - while ( !empty($u->value) ) { - while ( !($u->value[0] & 1) ) { - $u->_rshift(1); - if ( (!empty($a->value) && ($a->value[0] & 1)) || (!empty($b->value) && ($b->value[0] & 1)) ) { - $a = $a->add($y); - $b = $b->subtract($x); - } - $a->_rshift(1); - $b->_rshift(1); - } - - while ( !($v->value[0] & 1) ) { - $v->_rshift(1); - if ( (!empty($d->value) && ($d->value[0] & 1)) || (!empty($c->value) && ($c->value[0] & 1)) ) { - $c = $c->add($y); - $d = $d->subtract($x); - } - $c->_rshift(1); - $d->_rshift(1); - } - - if ($u->compare($v) >= 0) { - $u = $u->subtract($v); - $a = $a->subtract($c); - $b = $b->subtract($d); - } else { - $v = $v->subtract($u); - $c = $c->subtract($a); - $d = $d->subtract($b); - } - } - - return array( - 'gcd' => $this->_normalize($g->multiply($v)), - 'x' => $this->_normalize($c), - 'y' => $this->_normalize($d) - ); - } - - /** - * Calculates the greatest common divisor - * - * Say you have 693 and 609. The GCD is 21. - * - * Here's an example: - * - * extendedGCD($b); - * - * echo $gcd->toString() . "\r\n"; // outputs 21 - * ?> - * - * - * @param Math_BigInteger $n - * @return Math_BigInteger - * @access public - */ - function gcd($n) - { - extract($this->extendedGCD($n)); - return $gcd; - } - - /** - * Absolute value. - * - * @return Math_BigInteger - * @access public - */ - function abs() - { - $temp = new Math_BigInteger(); - - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $temp->value = gmp_abs($this->value); - break; - case MATH_BIGINTEGER_MODE_BCMATH: - $temp->value = (bccomp($this->value, '0', 0) < 0) ? substr($this->value, 1) : $this->value; - break; - default: - $temp->value = $this->value; - } - - return $temp; - } - - /** - * Compares two numbers. - * - * Although one might think !$x->compare($y) means $x != $y, it, in fact, means the opposite. The reason for this is - * demonstrated thusly: - * - * $x > $y: $x->compare($y) > 0 - * $x < $y: $x->compare($y) < 0 - * $x == $y: $x->compare($y) == 0 - * - * Note how the same comparison operator is used. If you want to test for equality, use $x->equals($y). - * - * @param Math_BigInteger $y - * @return Integer < 0 if $this is less than $y; > 0 if $this is greater than $y, and 0 if they are equal. - * @access public - * @see equals() - * @internal Could return $this->subtract($x), but that's not as fast as what we do do. - */ - function compare($y) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - return gmp_cmp($this->value, $y->value); - case MATH_BIGINTEGER_MODE_BCMATH: - return bccomp($this->value, $y->value, 0); - } - - return $this->_compare($this->value, $this->is_negative, $y->value, $y->is_negative); - } - - /** - * Compares two numbers. - * - * @param Array $x_value - * @param Boolean $x_negative - * @param Array $y_value - * @param Boolean $y_negative - * @return Integer - * @see compare() - * @access private - */ - function _compare($x_value, $x_negative, $y_value, $y_negative) - { - if ( $x_negative != $y_negative ) { - return ( !$x_negative && $y_negative ) ? 1 : -1; - } - - $result = $x_negative ? -1 : 1; - - if ( count($x_value) != count($y_value) ) { - return ( count($x_value) > count($y_value) ) ? $result : -$result; - } - $size = max(count($x_value), count($y_value)); - - $x_value = array_pad($x_value, $size, 0); - $y_value = array_pad($y_value, $size, 0); - - for ($i = count($x_value) - 1; $i >= 0; --$i) { - if ($x_value[$i] != $y_value[$i]) { - return ( $x_value[$i] > $y_value[$i] ) ? $result : -$result; - } - } - - return 0; - } - - /** - * Tests the equality of two numbers. - * - * If you need to see if one number is greater than or less than another number, use Math_BigInteger::compare() - * - * @param Math_BigInteger $x - * @return Boolean - * @access public - * @see compare() - */ - function equals($x) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - return gmp_cmp($this->value, $x->value) == 0; - default: - return $this->value === $x->value && $this->is_negative == $x->is_negative; - } - } - - /** - * Set Precision - * - * Some bitwise operations give different results depending on the precision being used. Examples include left - * shift, not, and rotates. - * - * @param Integer $bits - * @access public - */ - function setPrecision($bits) - { - $this->precision = $bits; - if ( MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_BCMATH ) { - $this->bitmask = new Math_BigInteger(chr((1 << ($bits & 0x7)) - 1) . str_repeat(chr(0xFF), $bits >> 3), 256); - } else { - $this->bitmask = new Math_BigInteger(bcpow('2', $bits, 0)); - } - - $temp = $this->_normalize($this); - $this->value = $temp->value; - } - - /** - * Logical And - * - * @param Math_BigInteger $x - * @access public - * @internal Implemented per a request by Lluis Pamies i Juarez - * @return Math_BigInteger - */ - function bitwise_and($x) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $temp = new Math_BigInteger(); - $temp->value = gmp_and($this->value, $x->value); - - return $this->_normalize($temp); - case MATH_BIGINTEGER_MODE_BCMATH: - $left = $this->toBytes(); - $right = $x->toBytes(); - - $length = max(strlen($left), strlen($right)); - - $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); - $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); - - return $this->_normalize(new Math_BigInteger($left & $right, 256)); - } - - $result = $this->copy(); - - $length = min(count($x->value), count($this->value)); - - $result->value = array_slice($result->value, 0, $length); - - for ($i = 0; $i < $length; ++$i) { - $result->value[$i]&= $x->value[$i]; - } - - return $this->_normalize($result); - } - - /** - * Logical Or - * - * @param Math_BigInteger $x - * @access public - * @internal Implemented per a request by Lluis Pamies i Juarez - * @return Math_BigInteger - */ - function bitwise_or($x) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $temp = new Math_BigInteger(); - $temp->value = gmp_or($this->value, $x->value); - - return $this->_normalize($temp); - case MATH_BIGINTEGER_MODE_BCMATH: - $left = $this->toBytes(); - $right = $x->toBytes(); - - $length = max(strlen($left), strlen($right)); - - $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); - $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); - - return $this->_normalize(new Math_BigInteger($left | $right, 256)); - } - - $length = max(count($this->value), count($x->value)); - $result = $this->copy(); - $result->value = array_pad($result->value, $length, 0); - $x->value = array_pad($x->value, $length, 0); - - for ($i = 0; $i < $length; ++$i) { - $result->value[$i]|= $x->value[$i]; - } - - return $this->_normalize($result); - } - - /** - * Logical Exclusive-Or - * - * @param Math_BigInteger $x - * @access public - * @internal Implemented per a request by Lluis Pamies i Juarez - * @return Math_BigInteger - */ - function bitwise_xor($x) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $temp = new Math_BigInteger(); - $temp->value = gmp_xor($this->value, $x->value); - - return $this->_normalize($temp); - case MATH_BIGINTEGER_MODE_BCMATH: - $left = $this->toBytes(); - $right = $x->toBytes(); - - $length = max(strlen($left), strlen($right)); - - $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); - $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); - - return $this->_normalize(new Math_BigInteger($left ^ $right, 256)); - } - - $length = max(count($this->value), count($x->value)); - $result = $this->copy(); - $result->value = array_pad($result->value, $length, 0); - $x->value = array_pad($x->value, $length, 0); - - for ($i = 0; $i < $length; ++$i) { - $result->value[$i]^= $x->value[$i]; - } - - return $this->_normalize($result); - } - - /** - * Logical Not - * - * @access public - * @internal Implemented per a request by Lluis Pamies i Juarez - * @return Math_BigInteger - */ - function bitwise_not() - { - // calculuate "not" without regard to $this->precision - // (will always result in a smaller number. ie. ~1 isn't 1111 1110 - it's 0) - $temp = $this->toBytes(); - $pre_msb = decbin(ord($temp[0])); - $temp = ~$temp; - $msb = decbin(ord($temp[0])); - if (strlen($msb) == 8) { - $msb = substr($msb, strpos($msb, '0')); - } - $temp[0] = chr(bindec($msb)); - - // see if we need to add extra leading 1's - $current_bits = strlen($pre_msb) + 8 * strlen($temp) - 8; - $new_bits = $this->precision - $current_bits; - if ($new_bits <= 0) { - return $this->_normalize(new Math_BigInteger($temp, 256)); - } - - // generate as many leading 1's as we need to. - $leading_ones = chr((1 << ($new_bits & 0x7)) - 1) . str_repeat(chr(0xFF), $new_bits >> 3); - $this->_base256_lshift($leading_ones, $current_bits); - - $temp = str_pad($temp, strlen($leading_ones), chr(0), STR_PAD_LEFT); - - return $this->_normalize(new Math_BigInteger($leading_ones | $temp, 256)); - } - - /** - * Logical Right Shift - * - * Shifts BigInteger's by $shift bits, effectively dividing by 2**$shift. - * - * @param Integer $shift - * @return Math_BigInteger - * @access public - * @internal The only version that yields any speed increases is the internal version. - */ - function bitwise_rightShift($shift) - { - $temp = new Math_BigInteger(); - - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - static $two; - - if (!isset($two)) { - $two = gmp_init('2'); - } - - $temp->value = gmp_div_q($this->value, gmp_pow($two, $shift)); - - break; - case MATH_BIGINTEGER_MODE_BCMATH: - $temp->value = bcdiv($this->value, bcpow('2', $shift, 0), 0); - - break; - default: // could just replace _lshift with this, but then all _lshift() calls would need to be rewritten - // and I don't want to do that... - $temp->value = $this->value; - $temp->_rshift($shift); - } - - return $this->_normalize($temp); - } - - /** - * Logical Left Shift - * - * Shifts BigInteger's by $shift bits, effectively multiplying by 2**$shift. - * - * @param Integer $shift - * @return Math_BigInteger - * @access public - * @internal The only version that yields any speed increases is the internal version. - */ - function bitwise_leftShift($shift) - { - $temp = new Math_BigInteger(); - - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - static $two; - - if (!isset($two)) { - $two = gmp_init('2'); - } - - $temp->value = gmp_mul($this->value, gmp_pow($two, $shift)); - - break; - case MATH_BIGINTEGER_MODE_BCMATH: - $temp->value = bcmul($this->value, bcpow('2', $shift, 0), 0); - - break; - default: // could just replace _rshift with this, but then all _lshift() calls would need to be rewritten - // and I don't want to do that... - $temp->value = $this->value; - $temp->_lshift($shift); - } - - return $this->_normalize($temp); - } - - /** - * Logical Left Rotate - * - * Instead of the top x bits being dropped they're appended to the shifted bit string. - * - * @param Integer $shift - * @return Math_BigInteger - * @access public - */ - function bitwise_leftRotate($shift) - { - $bits = $this->toBytes(); - - if ($this->precision > 0) { - $precision = $this->precision; - if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH ) { - $mask = $this->bitmask->subtract(new Math_BigInteger(1)); - $mask = $mask->toBytes(); - } else { - $mask = $this->bitmask->toBytes(); - } - } else { - $temp = ord($bits[0]); - for ($i = 0; $temp >> $i; ++$i); - $precision = 8 * strlen($bits) - 8 + $i; - $mask = chr((1 << ($precision & 0x7)) - 1) . str_repeat(chr(0xFF), $precision >> 3); - } - - if ($shift < 0) { - $shift+= $precision; - } - $shift%= $precision; - - if (!$shift) { - return $this->copy(); - } - - $left = $this->bitwise_leftShift($shift); - $left = $left->bitwise_and(new Math_BigInteger($mask, 256)); - $right = $this->bitwise_rightShift($precision - $shift); - $result = MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_BCMATH ? $left->bitwise_or($right) : $left->add($right); - return $this->_normalize($result); - } - - /** - * Logical Right Rotate - * - * Instead of the bottom x bits being dropped they're prepended to the shifted bit string. - * - * @param Integer $shift - * @return Math_BigInteger - * @access public - */ - function bitwise_rightRotate($shift) - { - return $this->bitwise_leftRotate(-$shift); - } - - /** - * Set random number generator function - * - * This function is deprecated. - * - * @param String $generator - * @access public - */ - function setRandomGenerator($generator) - { - } - - /** - * Generates a random BigInteger - * - * Byte length is equal to $length. Uses crypt_random if it's loaded and mt_rand if it's not. - * - * @param Integer $length - * @return Math_BigInteger - * @access private - */ - function _random_number_helper($size) - { - if (function_exists('crypt_random_string')) { - $random = crypt_random_string($size); - } else { - $random = ''; - - if ($size & 1) { - $random.= chr(mt_rand(0, 255)); - } - - $blocks = $size >> 1; - for ($i = 0; $i < $blocks; ++$i) { - // mt_rand(-2147483648, 0x7FFFFFFF) always produces -2147483648 on some systems - $random.= pack('n', mt_rand(0, 0xFFFF)); - } - } - - return new Math_BigInteger($random, 256); - } - - /** - * Generate a random number - * - * Returns a random number between $min and $max where $min and $max - * can be defined using one of the two methods: - * - * $min->random($max) - * $max->random($min) - * - * @param Math_BigInteger $arg1 - * @param optional Math_BigInteger $arg2 - * @return Math_BigInteger - * @access public - * @internal The API for creating random numbers used to be $a->random($min, $max), where $a was a Math_BigInteger object. - * That method is still supported for BC purposes. - */ - function random($arg1, $arg2 = false) - { - if ($arg1 === false) { - return false; - } - - if ($arg2 === false) { - $max = $arg1; - $min = $this; - } else { - $min = $arg1; - $max = $arg2; - } - - $compare = $max->compare($min); - - if (!$compare) { - return $this->_normalize($min); - } else if ($compare < 0) { - // if $min is bigger then $max, swap $min and $max - $temp = $max; - $max = $min; - $min = $temp; - } - - static $one; - if (!isset($one)) { - $one = new Math_BigInteger(1); - } - - $max = $max->subtract($min->subtract($one)); - $size = strlen(ltrim($max->toBytes(), chr(0))); - - /* - doing $random % $max doesn't work because some numbers will be more likely to occur than others. - eg. if $max is 140 and $random's max is 255 then that'd mean both $random = 5 and $random = 145 - would produce 5 whereas the only value of random that could produce 139 would be 139. ie. - not all numbers would be equally likely. some would be more likely than others. - - creating a whole new random number until you find one that is within the range doesn't work - because, for sufficiently small ranges, the likelihood that you'd get a number within that range - would be pretty small. eg. with $random's max being 255 and if your $max being 1 the probability - would be pretty high that $random would be greater than $max. - - phpseclib works around this using the technique described here: - - http://crypto.stackexchange.com/questions/5708/creating-a-small-number-from-a-cryptographically-secure-random-string - */ - $random_max = new Math_BigInteger(chr(1) . str_repeat("\0", $size), 256); - $random = $this->_random_number_helper($size); - - list($max_multiple) = $random_max->divide($max); - $max_multiple = $max_multiple->multiply($max); - - while ($random->compare($max_multiple) >= 0) { - $random = $random->subtract($max_multiple); - $random_max = $random_max->subtract($max_multiple); - $random = $random->bitwise_leftShift(8); - $random = $random->add($this->_random_number_helper(1)); - $random_max = $random_max->bitwise_leftShift(8); - list($max_multiple) = $random_max->divide($max); - $max_multiple = $max_multiple->multiply($max); - } - list(, $random) = $random->divide($max); - - return $this->_normalize($random->add($min)); - } - - /** - * Generate a random prime number. - * - * If there's not a prime within the given range, false will be returned. If more than $timeout seconds have elapsed, - * give up and return false. - * - * @param Math_BigInteger $arg1 - * @param optional Math_BigInteger $arg2 - * @param optional Integer $timeout - * @return Mixed - * @access public - * @internal See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap4.pdf#page=15 HAC 4.44}. - */ - function randomPrime($arg1, $arg2 = false, $timeout = false) - { - if ($arg1 === false) { - return false; - } - - if ($arg2 === false) { - $max = $arg1; - $min = $this; - } else { - $min = $arg1; - $max = $arg2; - } - - $compare = $max->compare($min); - - if (!$compare) { - return $min->isPrime() ? $min : false; - } else if ($compare < 0) { - // if $min is bigger then $max, swap $min and $max - $temp = $max; - $max = $min; - $min = $temp; - } - - static $one, $two; - if (!isset($one)) { - $one = new Math_BigInteger(1); - $two = new Math_BigInteger(2); - } - - $start = time(); - - $x = $this->random($min, $max); - - // gmp_nextprime() requires PHP 5 >= 5.2.0 per . - if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_GMP && function_exists('gmp_nextprime') ) { - $p = new Math_BigInteger(); - $p->value = gmp_nextprime($x->value); - - if ($p->compare($max) <= 0) { - return $p; - } - - if (!$min->equals($x)) { - $x = $x->subtract($one); - } - - return $x->randomPrime($min, $x); - } - - if ($x->equals($two)) { - return $x; - } - - $x->_make_odd(); - if ($x->compare($max) > 0) { - // if $x > $max then $max is even and if $min == $max then no prime number exists between the specified range - if ($min->equals($max)) { - return false; - } - $x = $min->copy(); - $x->_make_odd(); - } - - $initial_x = $x->copy(); - - while (true) { - if ($timeout !== false && time() - $start > $timeout) { - return false; - } - - if ($x->isPrime()) { - return $x; - } - - $x = $x->add($two); - - if ($x->compare($max) > 0) { - $x = $min->copy(); - if ($x->equals($two)) { - return $x; - } - $x->_make_odd(); - } - - if ($x->equals($initial_x)) { - return false; - } - } - } - - /** - * Make the current number odd - * - * If the current number is odd it'll be unchanged. If it's even, one will be added to it. - * - * @see randomPrime() - * @access private - */ - function _make_odd() - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - gmp_setbit($this->value, 0); - break; - case MATH_BIGINTEGER_MODE_BCMATH: - if ($this->value[strlen($this->value) - 1] % 2 == 0) { - $this->value = bcadd($this->value, '1'); - } - break; - default: - $this->value[0] |= 1; - } - } - - /** - * Checks a numer to see if it's prime - * - * Assuming the $t parameter is not set, this function has an error rate of 2**-80. The main motivation for the - * $t parameter is distributability. Math_BigInteger::randomPrime() can be distributed across multiple pageloads - * on a website instead of just one. - * - * @param optional Math_BigInteger $t - * @return Boolean - * @access public - * @internal Uses the - * {@link http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test Miller-Rabin primality test}. See - * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap4.pdf#page=8 HAC 4.24}. - */ - function isPrime($t = false) - { - $length = strlen($this->toBytes()); - - if (!$t) { - // see HAC 4.49 "Note (controlling the error probability)" - // @codingStandardsIgnoreStart - if ($length >= 163) { $t = 2; } // floor(1300 / 8) - else if ($length >= 106) { $t = 3; } // floor( 850 / 8) - else if ($length >= 81 ) { $t = 4; } // floor( 650 / 8) - else if ($length >= 68 ) { $t = 5; } // floor( 550 / 8) - else if ($length >= 56 ) { $t = 6; } // floor( 450 / 8) - else if ($length >= 50 ) { $t = 7; } // floor( 400 / 8) - else if ($length >= 43 ) { $t = 8; } // floor( 350 / 8) - else if ($length >= 37 ) { $t = 9; } // floor( 300 / 8) - else if ($length >= 31 ) { $t = 12; } // floor( 250 / 8) - else if ($length >= 25 ) { $t = 15; } // floor( 200 / 8) - else if ($length >= 18 ) { $t = 18; } // floor( 150 / 8) - else { $t = 27; } - // @codingStandardsIgnoreEnd - } - - // ie. gmp_testbit($this, 0) - // ie. isEven() or !isOdd() - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - return gmp_prob_prime($this->value, $t) != 0; - case MATH_BIGINTEGER_MODE_BCMATH: - if ($this->value === '2') { - return true; - } - if ($this->value[strlen($this->value) - 1] % 2 == 0) { - return false; - } - break; - default: - if ($this->value == array(2)) { - return true; - } - if (~$this->value[0] & 1) { - return false; - } - } - - static $primes, $zero, $one, $two; - - if (!isset($primes)) { - $primes = array( - 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, - 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, - 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, - 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, - 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, - 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, - 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, - 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, - 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, - 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, - 953, 967, 971, 977, 983, 991, 997 - ); - - if ( MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL ) { - for ($i = 0; $i < count($primes); ++$i) { - $primes[$i] = new Math_BigInteger($primes[$i]); - } - } - - $zero = new Math_BigInteger(); - $one = new Math_BigInteger(1); - $two = new Math_BigInteger(2); - } - - if ($this->equals($one)) { - return false; - } - - // see HAC 4.4.1 "Random search for probable primes" - if ( MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL ) { - foreach ($primes as $prime) { - list(, $r) = $this->divide($prime); - if ($r->equals($zero)) { - return $this->equals($prime); - } - } - } else { - $value = $this->value; - foreach ($primes as $prime) { - list(, $r) = $this->_divide_digit($value, $prime); - if (!$r) { - return count($value) == 1 && $value[0] == $prime; - } - } - } - - $n = $this->copy(); - $n_1 = $n->subtract($one); - $n_2 = $n->subtract($two); - - $r = $n_1->copy(); - $r_value = $r->value; - // ie. $s = gmp_scan1($n, 0) and $r = gmp_div_q($n, gmp_pow(gmp_init('2'), $s)); - if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH ) { - $s = 0; - // if $n was 1, $r would be 0 and this would be an infinite loop, hence our $this->equals($one) check earlier - while ($r->value[strlen($r->value) - 1] % 2 == 0) { - $r->value = bcdiv($r->value, '2', 0); - ++$s; - } - } else { - for ($i = 0, $r_length = count($r_value); $i < $r_length; ++$i) { - $temp = ~$r_value[$i] & 0xFFFFFF; - for ($j = 1; ($temp >> $j) & 1; ++$j); - if ($j != 25) { - break; - } - } - $s = 26 * $i + $j - 1; - $r->_rshift($s); - } - - for ($i = 0; $i < $t; ++$i) { - $a = $this->random($two, $n_2); - $y = $a->modPow($r, $n); - - if (!$y->equals($one) && !$y->equals($n_1)) { - for ($j = 1; $j < $s && !$y->equals($n_1); ++$j) { - $y = $y->modPow($two, $n); - if ($y->equals($one)) { - return false; - } - } - - if (!$y->equals($n_1)) { - return false; - } - } - } - return true; - } - - /** - * Logical Left Shift - * - * Shifts BigInteger's by $shift bits. - * - * @param Integer $shift - * @access private - */ - function _lshift($shift) - { - if ( $shift == 0 ) { - return; - } - - $num_digits = (int) ($shift / MATH_BIGINTEGER_BASE); - $shift %= MATH_BIGINTEGER_BASE; - $shift = 1 << $shift; - - $carry = 0; - - for ($i = 0; $i < count($this->value); ++$i) { - $temp = $this->value[$i] * $shift + $carry; - $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); - $this->value[$i] = (int) ($temp - $carry * MATH_BIGINTEGER_BASE_FULL); - } - - if ( $carry ) { - $this->value[count($this->value)] = $carry; - } - - while ($num_digits--) { - array_unshift($this->value, 0); - } - } - - /** - * Logical Right Shift - * - * Shifts BigInteger's by $shift bits. - * - * @param Integer $shift - * @access private - */ - function _rshift($shift) - { - if ($shift == 0) { - return; - } - - $num_digits = (int) ($shift / MATH_BIGINTEGER_BASE); - $shift %= MATH_BIGINTEGER_BASE; - $carry_shift = MATH_BIGINTEGER_BASE - $shift; - $carry_mask = (1 << $shift) - 1; - - if ( $num_digits ) { - $this->value = array_slice($this->value, $num_digits); - } - - $carry = 0; - - for ($i = count($this->value) - 1; $i >= 0; --$i) { - $temp = $this->value[$i] >> $shift | $carry; - $carry = ($this->value[$i] & $carry_mask) << $carry_shift; - $this->value[$i] = $temp; - } - - $this->value = $this->_trim($this->value); - } - - /** - * Normalize - * - * Removes leading zeros and truncates (if necessary) to maintain the appropriate precision - * - * @param Math_BigInteger - * @return Math_BigInteger - * @see _trim() - * @access private - */ - function _normalize($result) - { - $result->precision = $this->precision; - $result->bitmask = $this->bitmask; - - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - if (!empty($result->bitmask->value)) { - $result->value = gmp_and($result->value, $result->bitmask->value); - } - - return $result; - case MATH_BIGINTEGER_MODE_BCMATH: - if (!empty($result->bitmask->value)) { - $result->value = bcmod($result->value, $result->bitmask->value); - } - - return $result; - } - - $value = &$result->value; - - if ( !count($value) ) { - return $result; - } - - $value = $this->_trim($value); - - if (!empty($result->bitmask->value)) { - $length = min(count($value), count($this->bitmask->value)); - $value = array_slice($value, 0, $length); - - for ($i = 0; $i < $length; ++$i) { - $value[$i] = $value[$i] & $this->bitmask->value[$i]; - } - } - - return $result; - } - - /** - * Trim - * - * Removes leading zeros - * - * @param Array $value - * @return Math_BigInteger - * @access private - */ - function _trim($value) - { - for ($i = count($value) - 1; $i >= 0; --$i) { - if ( $value[$i] ) { - break; - } - unset($value[$i]); - } - - return $value; - } - - /** - * Array Repeat - * - * @param $input Array - * @param $multiplier mixed - * @return Array - * @access private - */ - function _array_repeat($input, $multiplier) - { - return ($multiplier) ? array_fill(0, $multiplier, $input) : array(); - } - - /** - * Logical Left Shift - * - * Shifts binary strings $shift bits, essentially multiplying by 2**$shift. - * - * @param $x String - * @param $shift Integer - * @return String - * @access private - */ - function _base256_lshift(&$x, $shift) - { - if ($shift == 0) { - return; - } - - $num_bytes = $shift >> 3; // eg. floor($shift/8) - $shift &= 7; // eg. $shift % 8 - - $carry = 0; - for ($i = strlen($x) - 1; $i >= 0; --$i) { - $temp = ord($x[$i]) << $shift | $carry; - $x[$i] = chr($temp); - $carry = $temp >> 8; - } - $carry = ($carry != 0) ? chr($carry) : ''; - $x = $carry . $x . str_repeat(chr(0), $num_bytes); - } - - /** - * Logical Right Shift - * - * Shifts binary strings $shift bits, essentially dividing by 2**$shift and returning the remainder. - * - * @param $x String - * @param $shift Integer - * @return String - * @access private - */ - function _base256_rshift(&$x, $shift) - { - if ($shift == 0) { - $x = ltrim($x, chr(0)); - return ''; - } - - $num_bytes = $shift >> 3; // eg. floor($shift/8) - $shift &= 7; // eg. $shift % 8 - - $remainder = ''; - if ($num_bytes) { - $start = $num_bytes > strlen($x) ? -strlen($x) : -$num_bytes; - $remainder = substr($x, $start); - $x = substr($x, 0, -$num_bytes); - } - - $carry = 0; - $carry_shift = 8 - $shift; - for ($i = 0; $i < strlen($x); ++$i) { - $temp = (ord($x[$i]) >> $shift) | $carry; - $carry = (ord($x[$i]) << $carry_shift) & 0xFF; - $x[$i] = chr($temp); - } - $x = ltrim($x, chr(0)); - - $remainder = chr($carry >> $carry_shift) . $remainder; - - return ltrim($remainder, chr(0)); - } - - // one quirk about how the following functions are implemented is that PHP defines N to be an unsigned long - // at 32-bits, while java's longs are 64-bits. - - /** - * Converts 32-bit integers to bytes. - * - * @param Integer $x - * @return String - * @access private - */ - function _int2bytes($x) - { - return ltrim(pack('N', $x), chr(0)); - } - - /** - * Converts bytes to 32-bit integers - * - * @param String $x - * @return Integer - * @access private - */ - function _bytes2int($x) - { - $temp = unpack('Nint', str_pad($x, 4, chr(0), STR_PAD_LEFT)); - return $temp['int']; - } - - /** - * DER-encode an integer - * - * The ability to DER-encode integers is needed to create RSA public keys for use with OpenSSL - * - * @see modPow() - * @access private - * @param Integer $length - * @return String - */ - function _encodeASN1Length($length) - { - if ($length <= 0x7F) { - return chr($length); - } - - $temp = ltrim(pack('N', $length), chr(0)); - return pack('Ca*', 0x80 | strlen($temp), $temp); - } - - /** - * Single digit division - * - * Even if int64 is being used the division operator will return a float64 value - * if the dividend is not evenly divisible by the divisor. Since a float64 doesn't - * have the precision of int64 this is a problem so, when int64 is being used, - * we'll guarantee that the dividend is divisible by first subtracting the remainder. - * - * @access private - * @param Integer $x - * @param Integer $y - * @return Integer - */ - function _safe_divide($x, $y) - { - if (MATH_BIGINTEGER_BASE === 26) { - return (int) ($x / $y); - } - - // MATH_BIGINTEGER_BASE === 31 - return ($x - ($x % $y)) / $y; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SCP.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SCP.php deleted file mode 100755 index b5cd2f55..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SCP.php +++ /dev/null @@ -1,360 +0,0 @@ - - * login('username', 'password')) { - * exit('bad login'); - * } - - * $scp = new Net_SCP($ssh); - * $scp->put('abcd', str_repeat('x', 1024*1024)); - * ?> - * - * - * LICENSE: 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. - * - * @category Net - * @package Net_SCP - * @author Jim Wigginton - * @copyright 2010 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/**#@+ - * @access public - * @see Net_SCP::put() - */ -/** - * Reads data from a local file. - */ -define('NET_SCP_LOCAL_FILE', 1); -/** - * Reads data from a string. - */ -define('NET_SCP_STRING', 2); -/**#@-*/ - -/**#@+ - * @access private - * @see Net_SCP::_send() - * @see Net_SCP::_receive() - */ -/** - * SSH1 is being used. - */ -define('NET_SCP_SSH1', 1); -/** - * SSH2 is being used. - */ -define('NET_SCP_SSH2', 2); -/**#@-*/ - -/** - * Pure-PHP implementations of SCP. - * - * @package Net_SCP - * @author Jim Wigginton - * @access public - */ -class Net_SCP -{ - /** - * SSH Object - * - * @var Object - * @access private - */ - var $ssh; - - /** - * Packet Size - * - * @var Integer - * @access private - */ - var $packet_size; - - /** - * Mode - * - * @var Integer - * @access private - */ - var $mode; - - /** - * Default Constructor. - * - * Connects to an SSH server - * - * @param String $host - * @param optional Integer $port - * @param optional Integer $timeout - * @return Net_SCP - * @access public - */ - function Net_SCP($ssh) - { - if (!is_object($ssh)) { - return; - } - - switch (strtolower(get_class($ssh))) { - case 'net_ssh2': - $this->mode = NET_SCP_SSH2; - break; - case 'net_ssh1': - $this->packet_size = 50000; - $this->mode = NET_SCP_SSH1; - break; - default: - return; - } - - $this->ssh = $ssh; - } - - /** - * Uploads a file to the SCP server. - * - * By default, Net_SCP::put() does not read from the local filesystem. $data is dumped directly into $remote_file. - * So, for example, if you set $data to 'filename.ext' and then do Net_SCP::get(), you will get a file, twelve bytes - * long, containing 'filename.ext' as its contents. - * - * Setting $mode to NET_SCP_LOCAL_FILE will change the above behavior. With NET_SCP_LOCAL_FILE, $remote_file will - * contain as many bytes as filename.ext does on your local filesystem. If your filename.ext is 1MB then that is how - * large $remote_file will be, as well. - * - * Currently, only binary mode is supported. As such, if the line endings need to be adjusted, you will need to take - * care of that, yourself. - * - * @param String $remote_file - * @param String $data - * @param optional Integer $mode - * @param optional Callable $callback - * @return Boolean - * @access public - */ - function put($remote_file, $data, $mode = NET_SCP_STRING, $callback = null) - { - if (!isset($this->ssh)) { - return false; - } - - if (!$this->ssh->exec('scp -t ' . escapeshellarg($remote_file), false)) { // -t = to - return false; - } - - $temp = $this->_receive(); - if ($temp !== chr(0)) { - return false; - } - - if ($this->mode == NET_SCP_SSH2) { - $this->packet_size = $this->ssh->packet_size_client_to_server[NET_SSH2_CHANNEL_EXEC] - 4; - } - - $remote_file = basename($remote_file); - - if ($mode == NET_SCP_STRING) { - $size = strlen($data); - } else { - if (!is_file($data)) { - user_error("$data is not a valid file", E_USER_NOTICE); - return false; - } - - $fp = @fopen($data, 'rb'); - if (!$fp) { - return false; - } - $size = filesize($data); - } - - $this->_send('C0644 ' . $size . ' ' . $remote_file . "\n"); - - $temp = $this->_receive(); - if ($temp !== chr(0)) { - return false; - } - - $sent = 0; - while ($sent < $size) { - $temp = $mode & NET_SCP_STRING ? substr($data, $sent, $this->packet_size) : fread($fp, $this->packet_size); - $this->_send($temp); - $sent+= strlen($temp); - - if (is_callable($callback)) { - call_user_func($callback, $sent); - } - } - $this->_close(); - - if ($mode != NET_SCP_STRING) { - fclose($fp); - } - - return true; - } - - /** - * Downloads a file from the SCP server. - * - * Returns a string containing the contents of $remote_file if $local_file is left undefined or a boolean false if - * the operation was unsuccessful. If $local_file is defined, returns true or false depending on the success of the - * operation - * - * @param String $remote_file - * @param optional String $local_file - * @return Mixed - * @access public - */ - function get($remote_file, $local_file = false) - { - if (!isset($this->ssh)) { - return false; - } - - if (!$this->ssh->exec('scp -f ' . escapeshellarg($remote_file), false)) { // -f = from - return false; - } - - $this->_send("\0"); - - if (!preg_match('#(?[^ ]+) (?\d+) (?.+)#', rtrim($this->_receive()), $info)) { - return false; - } - - $this->_send("\0"); - - $size = 0; - - if ($local_file !== false) { - $fp = @fopen($local_file, 'wb'); - if (!$fp) { - return false; - } - } - - $content = ''; - while ($size < $info['size']) { - $data = $this->_receive(); - // SCP usually seems to split stuff out into 16k chunks - $size+= strlen($data); - - if ($local_file === false) { - $content.= $data; - } else { - fputs($fp, $data); - } - } - - $this->_close(); - - if ($local_file !== false) { - fclose($fp); - return true; - } - - return $content; - } - - /** - * Sends a packet to an SSH server - * - * @param String $data - * @access private - */ - function _send($data) - { - switch ($this->mode) { - case NET_SCP_SSH2: - $this->ssh->_send_channel_packet(NET_SSH2_CHANNEL_EXEC, $data); - break; - case NET_SCP_SSH1: - $data = pack('CNa*', NET_SSH1_CMSG_STDIN_DATA, strlen($data), $data); - $this->ssh->_send_binary_packet($data); - } - } - - /** - * Receives a packet from an SSH server - * - * @return String - * @access private - */ - function _receive() - { - switch ($this->mode) { - case NET_SCP_SSH2: - return $this->ssh->_get_channel_packet(NET_SSH2_CHANNEL_EXEC, true); - case NET_SCP_SSH1: - if (!$this->ssh->bitmap) { - return false; - } - while (true) { - $response = $this->ssh->_get_binary_packet(); - switch ($response[NET_SSH1_RESPONSE_TYPE]) { - case NET_SSH1_SMSG_STDOUT_DATA: - extract(unpack('Nlength', $response[NET_SSH1_RESPONSE_DATA])); - return $this->ssh->_string_shift($response[NET_SSH1_RESPONSE_DATA], $length); - case NET_SSH1_SMSG_STDERR_DATA: - break; - case NET_SSH1_SMSG_EXITSTATUS: - $this->ssh->_send_binary_packet(chr(NET_SSH1_CMSG_EXIT_CONFIRMATION)); - fclose($this->ssh->fsock); - $this->ssh->bitmap = 0; - return false; - default: - user_error('Unknown packet received', E_USER_NOTICE); - return false; - } - } - } - } - - /** - * Closes the connection to an SSH server - * - * @access private - */ - function _close() - { - switch ($this->mode) { - case NET_SCP_SSH2: - $this->ssh->_close_channel(NET_SSH2_CHANNEL_EXEC, true); - break; - case NET_SCP_SSH1: - $this->ssh->disconnect(); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SFTP.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SFTP.php deleted file mode 100755 index 5f7d3666..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SFTP.php +++ /dev/null @@ -1,2778 +0,0 @@ - - * login('username', 'password')) { - * exit('Login Failed'); - * } - * - * echo $sftp->pwd() . "\r\n"; - * $sftp->put('filename.ext', 'hello, world!'); - * print_r($sftp->nlist()); - * ?> - * - * - * LICENSE: 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. - * - * @category Net - * @package Net_SFTP - * @author Jim Wigginton - * @copyright 2009 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include Net_SSH2 - */ -if (!class_exists('Net_SSH2')) { - include_once 'SSH2.php'; -} - -/**#@+ - * @access public - * @see Net_SFTP::getLog() - */ -/** - * Returns the message numbers - */ -define('NET_SFTP_LOG_SIMPLE', NET_SSH2_LOG_SIMPLE); -/** - * Returns the message content - */ -define('NET_SFTP_LOG_COMPLEX', NET_SSH2_LOG_COMPLEX); -/** - * Outputs the message content in real-time. - */ -define('NET_SFTP_LOG_REALTIME', 3); -/**#@-*/ - -/** - * SFTP channel constant - * - * Net_SSH2::exec() uses 0 and Net_SSH2::read() / Net_SSH2::write() use 1. - * - * @see Net_SSH2::_send_channel_packet() - * @see Net_SSH2::_get_channel_packet() - * @access private - */ -define('NET_SFTP_CHANNEL', 0x100); - -/**#@+ - * @access public - * @see Net_SFTP::put() - */ -/** - * Reads data from a local file. - */ -define('NET_SFTP_LOCAL_FILE', 1); -/** - * Reads data from a string. - */ -// this value isn't really used anymore but i'm keeping it reserved for historical reasons -define('NET_SFTP_STRING', 2); -/** - * Resumes an upload - */ -define('NET_SFTP_RESUME', 4); -/** - * Append a local file to an already existing remote file - */ -define('NET_SFTP_RESUME_START', 8); -/**#@-*/ - -/** - * Pure-PHP implementations of SFTP. - * - * @package Net_SFTP - * @author Jim Wigginton - * @access public - */ -class Net_SFTP extends Net_SSH2 -{ - /** - * Packet Types - * - * @see Net_SFTP::Net_SFTP() - * @var Array - * @access private - */ - var $packet_types = array(); - - /** - * Status Codes - * - * @see Net_SFTP::Net_SFTP() - * @var Array - * @access private - */ - var $status_codes = array(); - - /** - * The Request ID - * - * The request ID exists in the off chance that a packet is sent out-of-order. Of course, this library doesn't support - * concurrent actions, so it's somewhat academic, here. - * - * @var Integer - * @see Net_SFTP::_send_sftp_packet() - * @access private - */ - var $request_id = false; - - /** - * The Packet Type - * - * The request ID exists in the off chance that a packet is sent out-of-order. Of course, this library doesn't support - * concurrent actions, so it's somewhat academic, here. - * - * @var Integer - * @see Net_SFTP::_get_sftp_packet() - * @access private - */ - var $packet_type = -1; - - /** - * Packet Buffer - * - * @var String - * @see Net_SFTP::_get_sftp_packet() - * @access private - */ - var $packet_buffer = ''; - - /** - * Extensions supported by the server - * - * @var Array - * @see Net_SFTP::_initChannel() - * @access private - */ - var $extensions = array(); - - /** - * Server SFTP version - * - * @var Integer - * @see Net_SFTP::_initChannel() - * @access private - */ - var $version; - - /** - * Current working directory - * - * @var String - * @see Net_SFTP::_realpath() - * @see Net_SFTP::chdir() - * @access private - */ - var $pwd = false; - - /** - * Packet Type Log - * - * @see Net_SFTP::getLog() - * @var Array - * @access private - */ - var $packet_type_log = array(); - - /** - * Packet Log - * - * @see Net_SFTP::getLog() - * @var Array - * @access private - */ - var $packet_log = array(); - - /** - * Error information - * - * @see Net_SFTP::getSFTPErrors() - * @see Net_SFTP::getLastSFTPError() - * @var String - * @access private - */ - var $sftp_errors = array(); - - /** - * Stat Cache - * - * Rather than always having to open a directory and close it immediately there after to see if a file is a directory - * we'll cache the results. - * - * @see Net_SFTP::_update_stat_cache() - * @see Net_SFTP::_remove_from_stat_cache() - * @see Net_SFTP::_query_stat_cache() - * @var Array - * @access private - */ - var $stat_cache = array(); - - /** - * Max SFTP Packet Size - * - * @see Net_SFTP::Net_SFTP() - * @see Net_SFTP::get() - * @var Array - * @access private - */ - var $max_sftp_packet; - - /** - * Stat Cache Flag - * - * @see Net_SFTP::disableStatCache() - * @see Net_SFTP::enableStatCache() - * @var Boolean - * @access private - */ - var $use_stat_cache = true; - - /** - * Sort Options - * - * @see Net_SFTP::_comparator() - * @see Net_SFTP::setListOrder() - * @var Array - * @access private - */ - var $sortOptions = array(); - - /** - * Default Constructor. - * - * Connects to an SFTP server - * - * @param String $host - * @param optional Integer $port - * @param optional Integer $timeout - * @return Net_SFTP - * @access public - */ - function Net_SFTP($host, $port = 22, $timeout = 10) - { - parent::Net_SSH2($host, $port, $timeout); - - $this->max_sftp_packet = 1 << 15; - - $this->packet_types = array( - 1 => 'NET_SFTP_INIT', - 2 => 'NET_SFTP_VERSION', - /* the format of SSH_FXP_OPEN changed between SFTPv4 and SFTPv5+: - SFTPv5+: http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.1.1 - pre-SFTPv5 : http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-6.3 */ - 3 => 'NET_SFTP_OPEN', - 4 => 'NET_SFTP_CLOSE', - 5 => 'NET_SFTP_READ', - 6 => 'NET_SFTP_WRITE', - 7 => 'NET_SFTP_LSTAT', - 9 => 'NET_SFTP_SETSTAT', - 11 => 'NET_SFTP_OPENDIR', - 12 => 'NET_SFTP_READDIR', - 13 => 'NET_SFTP_REMOVE', - 14 => 'NET_SFTP_MKDIR', - 15 => 'NET_SFTP_RMDIR', - 16 => 'NET_SFTP_REALPATH', - 17 => 'NET_SFTP_STAT', - /* the format of SSH_FXP_RENAME changed between SFTPv4 and SFTPv5+: - SFTPv5+: http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.3 - pre-SFTPv5 : http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-6.5 */ - 18 => 'NET_SFTP_RENAME', - 19 => 'NET_SFTP_READLINK', - 20 => 'NET_SFTP_SYMLINK', - - 101=> 'NET_SFTP_STATUS', - 102=> 'NET_SFTP_HANDLE', - /* the format of SSH_FXP_NAME changed between SFTPv3 and SFTPv4+: - SFTPv4+: http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-9.4 - pre-SFTPv4 : http://tools.ietf.org/html/draft-ietf-secsh-filexfer-02#section-7 */ - 103=> 'NET_SFTP_DATA', - 104=> 'NET_SFTP_NAME', - 105=> 'NET_SFTP_ATTRS', - - 200=> 'NET_SFTP_EXTENDED' - ); - $this->status_codes = array( - 0 => 'NET_SFTP_STATUS_OK', - 1 => 'NET_SFTP_STATUS_EOF', - 2 => 'NET_SFTP_STATUS_NO_SUCH_FILE', - 3 => 'NET_SFTP_STATUS_PERMISSION_DENIED', - 4 => 'NET_SFTP_STATUS_FAILURE', - 5 => 'NET_SFTP_STATUS_BAD_MESSAGE', - 6 => 'NET_SFTP_STATUS_NO_CONNECTION', - 7 => 'NET_SFTP_STATUS_CONNECTION_LOST', - 8 => 'NET_SFTP_STATUS_OP_UNSUPPORTED', - 9 => 'NET_SFTP_STATUS_INVALID_HANDLE', - 10 => 'NET_SFTP_STATUS_NO_SUCH_PATH', - 11 => 'NET_SFTP_STATUS_FILE_ALREADY_EXISTS', - 12 => 'NET_SFTP_STATUS_WRITE_PROTECT', - 13 => 'NET_SFTP_STATUS_NO_MEDIA', - 14 => 'NET_SFTP_STATUS_NO_SPACE_ON_FILESYSTEM', - 15 => 'NET_SFTP_STATUS_QUOTA_EXCEEDED', - 16 => 'NET_SFTP_STATUS_UNKNOWN_PRINCIPAL', - 17 => 'NET_SFTP_STATUS_LOCK_CONFLICT', - 18 => 'NET_SFTP_STATUS_DIR_NOT_EMPTY', - 19 => 'NET_SFTP_STATUS_NOT_A_DIRECTORY', - 20 => 'NET_SFTP_STATUS_INVALID_FILENAME', - 21 => 'NET_SFTP_STATUS_LINK_LOOP', - 22 => 'NET_SFTP_STATUS_CANNOT_DELETE', - 23 => 'NET_SFTP_STATUS_INVALID_PARAMETER', - 24 => 'NET_SFTP_STATUS_FILE_IS_A_DIRECTORY', - 25 => 'NET_SFTP_STATUS_BYTE_RANGE_LOCK_CONFLICT', - 26 => 'NET_SFTP_STATUS_BYTE_RANGE_LOCK_REFUSED', - 27 => 'NET_SFTP_STATUS_DELETE_PENDING', - 28 => 'NET_SFTP_STATUS_FILE_CORRUPT', - 29 => 'NET_SFTP_STATUS_OWNER_INVALID', - 30 => 'NET_SFTP_STATUS_GROUP_INVALID', - 31 => 'NET_SFTP_STATUS_NO_MATCHING_BYTE_RANGE_LOCK' - ); - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-7.1 - // the order, in this case, matters quite a lot - see Net_SFTP::_parseAttributes() to understand why - $this->attributes = array( - 0x00000001 => 'NET_SFTP_ATTR_SIZE', - 0x00000002 => 'NET_SFTP_ATTR_UIDGID', // defined in SFTPv3, removed in SFTPv4+ - 0x00000004 => 'NET_SFTP_ATTR_PERMISSIONS', - 0x00000008 => 'NET_SFTP_ATTR_ACCESSTIME', - // 0x80000000 will yield a floating point on 32-bit systems and converting floating points to integers - // yields inconsistent behavior depending on how php is compiled. so we left shift -1 (which, in - // two's compliment, consists of all 1 bits) by 31. on 64-bit systems this'll yield 0xFFFFFFFF80000000. - // that's not a problem, however, and 'anded' and a 32-bit number, as all the leading 1 bits are ignored. - -1 << 31 => 'NET_SFTP_ATTR_EXTENDED' - ); - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-6.3 - // the flag definitions change somewhat in SFTPv5+. if SFTPv5+ support is added to this library, maybe name - // the array for that $this->open5_flags and similarily alter the constant names. - $this->open_flags = array( - 0x00000001 => 'NET_SFTP_OPEN_READ', - 0x00000002 => 'NET_SFTP_OPEN_WRITE', - 0x00000004 => 'NET_SFTP_OPEN_APPEND', - 0x00000008 => 'NET_SFTP_OPEN_CREATE', - 0x00000010 => 'NET_SFTP_OPEN_TRUNCATE', - 0x00000020 => 'NET_SFTP_OPEN_EXCL' - ); - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-5.2 - // see Net_SFTP::_parseLongname() for an explanation - $this->file_types = array( - 1 => 'NET_SFTP_TYPE_REGULAR', - 2 => 'NET_SFTP_TYPE_DIRECTORY', - 3 => 'NET_SFTP_TYPE_SYMLINK', - 4 => 'NET_SFTP_TYPE_SPECIAL', - 5 => 'NET_SFTP_TYPE_UNKNOWN', - // the followin types were first defined for use in SFTPv5+ - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-05#section-5.2 - 6 => 'NET_SFTP_TYPE_SOCKET', - 7 => 'NET_SFTP_TYPE_CHAR_DEVICE', - 8 => 'NET_SFTP_TYPE_BLOCK_DEVICE', - 9 => 'NET_SFTP_TYPE_FIFO' - ); - $this->_define_array( - $this->packet_types, - $this->status_codes, - $this->attributes, - $this->open_flags, - $this->file_types - ); - - if (!defined('NET_SFTP_QUEUE_SIZE')) { - define('NET_SFTP_QUEUE_SIZE', 50); - } - } - - /** - * Login - * - * @param String $username - * @param optional String $password - * @return Boolean - * @access public - */ - function login($username) - { - $args = func_get_args(); - if (!call_user_func_array(array(&$this, '_login'), $args)) { - return false; - } - - $this->window_size_server_to_client[NET_SFTP_CHANNEL] = $this->window_size; - - $packet = pack('CNa*N3', - NET_SSH2_MSG_CHANNEL_OPEN, strlen('session'), 'session', NET_SFTP_CHANNEL, $this->window_size, 0x4000); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $this->channel_status[NET_SFTP_CHANNEL] = NET_SSH2_MSG_CHANNEL_OPEN; - - $response = $this->_get_channel_packet(NET_SFTP_CHANNEL); - if ($response === false) { - return false; - } - - $packet = pack('CNNa*CNa*', - NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SFTP_CHANNEL], strlen('subsystem'), 'subsystem', 1, strlen('sftp'), 'sftp'); - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $this->channel_status[NET_SFTP_CHANNEL] = NET_SSH2_MSG_CHANNEL_REQUEST; - - $response = $this->_get_channel_packet(NET_SFTP_CHANNEL); - if ($response === false) { - // from PuTTY's psftp.exe - $command = "test -x /usr/lib/sftp-server && exec /usr/lib/sftp-server\n" . - "test -x /usr/local/lib/sftp-server && exec /usr/local/lib/sftp-server\n" . - "exec sftp-server"; - // we don't do $this->exec($command, false) because exec() operates on a different channel and plus the SSH_MSG_CHANNEL_OPEN that exec() does - // is redundant - $packet = pack('CNNa*CNa*', - NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SFTP_CHANNEL], strlen('exec'), 'exec', 1, strlen($command), $command); - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $this->channel_status[NET_SFTP_CHANNEL] = NET_SSH2_MSG_CHANNEL_REQUEST; - - $response = $this->_get_channel_packet(NET_SFTP_CHANNEL); - if ($response === false) { - return false; - } - } - - $this->channel_status[NET_SFTP_CHANNEL] = NET_SSH2_MSG_CHANNEL_DATA; - - if (!$this->_send_sftp_packet(NET_SFTP_INIT, "\0\0\0\3")) { - return false; - } - - $response = $this->_get_sftp_packet(); - if ($this->packet_type != NET_SFTP_VERSION) { - user_error('Expected SSH_FXP_VERSION'); - return false; - } - - extract(unpack('Nversion', $this->_string_shift($response, 4))); - $this->version = $version; - while (!empty($response)) { - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $key = $this->_string_shift($response, $length); - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $value = $this->_string_shift($response, $length); - $this->extensions[$key] = $value; - } - - /* - SFTPv4+ defines a 'newline' extension. SFTPv3 seems to have unofficial support for it via 'newline@vandyke.com', - however, I'm not sure what 'newline@vandyke.com' is supposed to do (the fact that it's unofficial means that it's - not in the official SFTPv3 specs) and 'newline@vandyke.com' / 'newline' are likely not drop-in substitutes for - one another due to the fact that 'newline' comes with a SSH_FXF_TEXT bitmask whereas it seems unlikely that - 'newline@vandyke.com' would. - */ - /* - if (isset($this->extensions['newline@vandyke.com'])) { - $this->extensions['newline'] = $this->extensions['newline@vandyke.com']; - unset($this->extensions['newline@vandyke.com']); - } - */ - - $this->request_id = 1; - - /* - A Note on SFTPv4/5/6 support: - states the following: - - "If the client wishes to interoperate with servers that support noncontiguous version - numbers it SHOULD send '3'" - - Given that the server only sends its version number after the client has already done so, the above - seems to be suggesting that v3 should be the default version. This makes sense given that v3 is the - most popular. - - states the following; - - "If the server did not send the "versions" extension, or the version-from-list was not included, the - server MAY send a status response describing the failure, but MUST then close the channel without - processing any further requests." - - So what do you do if you have a client whose initial SSH_FXP_INIT packet says it implements v3 and - a server whose initial SSH_FXP_VERSION reply says it implements v4 and only v4? If it only implements - v4, the "versions" extension is likely not going to have been sent so version re-negotiation as discussed - in draft-ietf-secsh-filexfer-13 would be quite impossible. As such, what Net_SFTP would do is close the - channel and reopen it with a new and updated SSH_FXP_INIT packet. - */ - switch ($this->version) { - case 2: - case 3: - break; - default: - return false; - } - - $this->pwd = $this->_realpath('.'); - - $this->_update_stat_cache($this->pwd, array()); - - return true; - } - - /** - * Disable the stat cache - * - * @access public - */ - function disableStatCache() - { - $this->use_stat_cache = false; - } - - /** - * Enable the stat cache - * - * @access public - */ - function enableStatCache() - { - $this->use_stat_cache = true; - } - - /** - * Clear the stat cache - * - * @access public - */ - function clearStatCache() - { - $this->stat_cache = array(); - } - - /** - * Returns the current directory name - * - * @return Mixed - * @access public - */ - function pwd() - { - return $this->pwd; - } - - /** - * Logs errors - * - * @param String $response - * @param optional Integer $status - * @access public - */ - function _logError($response, $status = -1) - { - if ($status == -1) { - extract(unpack('Nstatus', $this->_string_shift($response, 4))); - } - - $error = $this->status_codes[$status]; - - if ($this->version > 2) { - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $this->sftp_errors[] = $error . ': ' . $this->_string_shift($response, $length); - } else { - $this->sftp_errors[] = $error; - } - } - - /** - * Canonicalize the Server-Side Path Name - * - * SFTP doesn't provide a mechanism by which the current working directory can be changed, so we'll emulate it. Returns - * the absolute (canonicalized) path. - * - * @see Net_SFTP::chdir() - * @param String $path - * @return Mixed - * @access private - */ - function _realpath($path) - { - if ($this->pwd === false) { - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.9 - if (!$this->_send_sftp_packet(NET_SFTP_REALPATH, pack('Na*', strlen($path), $path))) { - return false; - } - - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_NAME: - // although SSH_FXP_NAME is implemented differently in SFTPv3 than it is in SFTPv4+, the following - // should work on all SFTP versions since the only part of the SSH_FXP_NAME packet the following looks - // at is the first part and that part is defined the same in SFTP versions 3 through 6. - $this->_string_shift($response, 4); // skip over the count - it should be 1, anyway - extract(unpack('Nlength', $this->_string_shift($response, 4))); - return $this->_string_shift($response, $length); - case NET_SFTP_STATUS: - $this->_logError($response); - return false; - default: - user_error('Expected SSH_FXP_NAME or SSH_FXP_STATUS'); - return false; - } - } - - if ($path[0] != '/') { - $path = $this->pwd . '/' . $path; - } - - $path = explode('/', $path); - $new = array(); - foreach ($path as $dir) { - if (!strlen($dir)) { - continue; - } - switch ($dir) { - case '..': - array_pop($new); - case '.': - break; - default: - $new[] = $dir; - } - } - - return '/' . implode('/', $new); - } - - /** - * Changes the current directory - * - * @param String $dir - * @return Boolean - * @access public - */ - function chdir($dir) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - // assume current dir if $dir is empty - if ($dir === '') { - $dir = './'; - // suffix a slash if needed - } elseif ($dir[strlen($dir) - 1] != '/') { - $dir.= '/'; - } - - $dir = $this->_realpath($dir); - - // confirm that $dir is, in fact, a valid directory - if ($this->use_stat_cache && is_array($this->_query_stat_cache($dir))) { - $this->pwd = $dir; - return true; - } - - // we could do a stat on the alleged $dir to see if it's a directory but that doesn't tell us - // the currently logged in user has the appropriate permissions or not. maybe you could see if - // the file's uid / gid match the currently logged in user's uid / gid but how there's no easy - // way to get those with SFTP - - if (!$this->_send_sftp_packet(NET_SFTP_OPENDIR, pack('Na*', strlen($dir), $dir))) { - return false; - } - - // see Net_SFTP::nlist() for a more thorough explanation of the following - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - $handle = substr($response, 4); - break; - case NET_SFTP_STATUS: - $this->_logError($response); - return false; - default: - user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); - return false; - } - - if (!$this->_close_handle($handle)) { - return false; - } - - $this->_update_stat_cache($dir, array()); - - $this->pwd = $dir; - return true; - } - - /** - * Returns a list of files in the given directory - * - * @param optional String $dir - * @param optional Boolean $recursive - * @return Mixed - * @access public - */ - function nlist($dir = '.', $recursive = false) - { - return $this->_nlist_helper($dir, $recursive, ''); - } - - /** - * Helper method for nlist - * - * @param String $dir - * @param Boolean $recursive - * @param String $relativeDir - * @return Mixed - * @access private - */ - function _nlist_helper($dir, $recursive, $relativeDir) - { - $files = $this->_list($dir, false); - - if (!$recursive) { - return $files; - } - - $result = array(); - foreach ($files as $value) { - if ($value == '.' || $value == '..') { - if ($relativeDir == '') { - $result[] = $value; - } - continue; - } - if (is_array($this->_query_stat_cache($this->_realpath($dir . '/' . $value)))) { - $temp = $this->_nlist_helper($dir . '/' . $value, true, $relativeDir . $value . '/'); - $result = array_merge($result, $temp); - } else { - $result[] = $relativeDir . $value; - } - } - - return $result; - } - - /** - * Returns a detailed list of files in the given directory - * - * @param optional String $dir - * @param optional Boolean $recursive - * @return Mixed - * @access public - */ - function rawlist($dir = '.', $recursive = false) - { - $files = $this->_list($dir, true); - if (!$recursive || $files === false) { - return $files; - } - - static $depth = 0; - - foreach ($files as $key=>$value) { - if ($depth != 0 && $key == '..') { - unset($files[$key]); - continue; - } - if ($key != '.' && $key != '..' && is_array($this->_query_stat_cache($this->_realpath($dir . '/' . $key)))) { - $depth++; - $files[$key] = $this->rawlist($dir . '/' . $key, true); - $depth--; - } else { - $files[$key] = (object) $value; - } - } - - return $files; - } - - /** - * Reads a list, be it detailed or not, of files in the given directory - * - * @param String $dir - * @param optional Boolean $raw - * @return Mixed - * @access private - */ - function _list($dir, $raw = true) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $dir = $this->_realpath($dir . '/'); - if ($dir === false) { - return false; - } - - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.1.2 - if (!$this->_send_sftp_packet(NET_SFTP_OPENDIR, pack('Na*', strlen($dir), $dir))) { - return false; - } - - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-9.2 - // since 'handle' is the last field in the SSH_FXP_HANDLE packet, we'll just remove the first four bytes that - // represent the length of the string and leave it at that - $handle = substr($response, 4); - break; - case NET_SFTP_STATUS: - // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - $this->_logError($response); - return false; - default: - user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); - return false; - } - - $this->_update_stat_cache($dir, array()); - - $contents = array(); - while (true) { - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.2.2 - // why multiple SSH_FXP_READDIR packets would be sent when the response to a single one can span arbitrarily many - // SSH_MSG_CHANNEL_DATA messages is not known to me. - if (!$this->_send_sftp_packet(NET_SFTP_READDIR, pack('Na*', strlen($handle), $handle))) { - return false; - } - - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_NAME: - extract(unpack('Ncount', $this->_string_shift($response, 4))); - for ($i = 0; $i < $count; $i++) { - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $shortname = $this->_string_shift($response, $length); - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $longname = $this->_string_shift($response, $length); - $attributes = $this->_parseAttributes($response); - if (!isset($attributes['type'])) { - $fileType = $this->_parseLongname($longname); - if ($fileType) { - $attributes['type'] = $fileType; - } - } - $contents[$shortname] = $attributes + array('filename' => $shortname); - - if (isset($attributes['type']) && $attributes['type'] == NET_SFTP_TYPE_DIRECTORY && ($shortname != '.' && $shortname != '..')) { - $this->_update_stat_cache($dir . '/' . $shortname, array()); - } else { - if ($shortname == '..') { - $temp = $this->_realpath($dir . '/..') . '/.'; - } else { - $temp = $dir . '/' . $shortname; - } - $this->_update_stat_cache($temp, (object) $attributes); - } - // SFTPv6 has an optional boolean end-of-list field, but we'll ignore that, since the - // final SSH_FXP_STATUS packet should tell us that, already. - } - break; - case NET_SFTP_STATUS: - extract(unpack('Nstatus', $this->_string_shift($response, 4))); - if ($status != NET_SFTP_STATUS_EOF) { - $this->_logError($response, $status); - return false; - } - break 2; - default: - user_error('Expected SSH_FXP_NAME or SSH_FXP_STATUS'); - return false; - } - } - - if (!$this->_close_handle($handle)) { - return false; - } - - if (count($this->sortOptions)) { - uasort($contents, array(&$this, '_comparator')); - } - - return $raw ? $contents : array_keys($contents); - } - - /** - * Compares two rawlist entries using parameters set by setListOrder() - * - * Intended for use with uasort() - * - * @param Array $a - * @param Array $b - * @return Integer - * @access private - */ - function _comparator($a, $b) - { - switch (true) { - case $a['filename'] === '.' || $b['filename'] === '.': - if ($a['filename'] === $b['filename']) { - return 0; - } - return $a['filename'] === '.' ? -1 : 1; - case $a['filename'] === '..' || $b['filename'] === '..': - if ($a['filename'] === $b['filename']) { - return 0; - } - return $a['filename'] === '..' ? -1 : 1; - case isset($a['type']) && $a['type'] === NET_SFTP_TYPE_DIRECTORY: - if (!isset($b['type'])) { - return 1; - } - if ($b['type'] !== $a['type']) { - return -1; - } - break; - case isset($b['type']) && $b['type'] === NET_SFTP_TYPE_DIRECTORY: - return 1; - } - foreach ($this->sortOptions as $sort => $order) { - if (!isset($a[$sort]) || !isset($b[$sort])) { - if (isset($a[$sort])) { - return -1; - } - if (isset($b[$sort])) { - return 1; - } - return 0; - } - switch ($sort) { - case 'filename': - $result = strcasecmp($a['filename'], $b['filename']); - if ($result) { - return $order === SORT_DESC ? -$result : $result; - } - break; - case 'permissions': - case 'mode': - $a[$sort]&= 07777; - $b[$sort]&= 07777; - default: - if ($a[$sort] === $b[$sort]) { - break; - } - return $order === SORT_ASC ? $a[$sort] - $b[$sort] : $b[$sort] - $a[$sort]; - } - } - } - - /** - * Defines how nlist() and rawlist() will be sorted - if at all. - * - * If sorting is enabled directories and files will be sorted independently with - * directories appearing before files in the resultant array that is returned. - * - * Any parameter returned by stat is a valid sort parameter for this function. - * Filename comparisons are case insensitive. - * - * Examples: - * - * $sftp->setListOrder('filename', SORT_ASC); - * $sftp->setListOrder('size', SORT_DESC, 'filename', SORT_ASC); - * $sftp->setListOrder(true); - * Separates directories from files but doesn't do any sorting beyond that - * $sftp->setListOrder(); - * Don't do any sort of sorting - * - * @access public - */ - function setListOrder() - { - $this->sortOptions = array(); - $args = func_get_args(); - if (empty($args)) { - return; - } - $len = count($args) & 0x7FFFFFFE; - for ($i = 0; $i < $len; $i+=2) { - $this->sortOptions[$args[$i]] = $args[$i + 1]; - } - if (!count($this->sortOptions)) { - $this->sortOptions = array('bogus' => true); - } - } - - /** - * Returns the file size, in bytes, or false, on failure - * - * Files larger than 4GB will show up as being exactly 4GB. - * - * @param String $filename - * @return Mixed - * @access public - */ - function size($filename) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $result = $this->stat($filename); - if ($result === false) { - return false; - } - return isset($result['size']) ? $result['size'] : -1; - } - - /** - * Save files / directories to cache - * - * @param String $path - * @param Mixed $value - * @access private - */ - function _update_stat_cache($path, $value) - { - // preg_replace('#^/|/(?=/)|/$#', '', $dir) == str_replace('//', '/', trim($path, '/')) - $dirs = explode('/', preg_replace('#^/|/(?=/)|/$#', '', $path)); - - $temp = &$this->stat_cache; - $max = count($dirs) - 1; - foreach ($dirs as $i=>$dir) { - if (!isset($temp[$dir])) { - $temp[$dir] = array(); - } - if ($i === $max) { - $temp[$dir] = $value; - break; - } - $temp = &$temp[$dir]; - } - } - - /** - * Remove files / directories from cache - * - * @param String $path - * @return Boolean - * @access private - */ - function _remove_from_stat_cache($path) - { - $dirs = explode('/', preg_replace('#^/|/(?=/)|/$#', '', $path)); - - $temp = &$this->stat_cache; - $max = count($dirs) - 1; - foreach ($dirs as $i=>$dir) { - if ($i === $max) { - unset($temp[$dir]); - return true; - } - if (!isset($temp[$dir])) { - return false; - } - $temp = &$temp[$dir]; - } - } - - /** - * Checks cache for path - * - * Mainly used by file_exists - * - * @param String $dir - * @return Mixed - * @access private - */ - function _query_stat_cache($path) - { - $dirs = explode('/', preg_replace('#^/|/(?=/)|/$#', '', $path)); - - $temp = &$this->stat_cache; - foreach ($dirs as $dir) { - if (!isset($temp[$dir])) { - return null; - } - $temp = &$temp[$dir]; - } - return $temp; - } - - /** - * Returns general information about a file. - * - * Returns an array on success and false otherwise. - * - * @param String $filename - * @return Mixed - * @access public - */ - function stat($filename) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $filename = $this->_realpath($filename); - if ($filename === false) { - return false; - } - - if ($this->use_stat_cache) { - $result = $this->_query_stat_cache($filename); - if (is_array($result) && isset($result['.'])) { - return (array) $result['.']; - } - if (is_object($result)) { - return (array) $result; - } - } - - $stat = $this->_stat($filename, NET_SFTP_STAT); - if ($stat === false) { - $this->_remove_from_stat_cache($filename); - return false; - } - if (isset($stat['type'])) { - if ($stat['type'] == NET_SFTP_TYPE_DIRECTORY) { - $filename.= '/.'; - } - $this->_update_stat_cache($filename, (object) $stat); - return $stat; - } - - $pwd = $this->pwd; - $stat['type'] = $this->chdir($filename) ? - NET_SFTP_TYPE_DIRECTORY : - NET_SFTP_TYPE_REGULAR; - $this->pwd = $pwd; - - if ($stat['type'] == NET_SFTP_TYPE_DIRECTORY) { - $filename.= '/.'; - } - $this->_update_stat_cache($filename, (object) $stat); - - return $stat; - } - - /** - * Returns general information about a file or symbolic link. - * - * Returns an array on success and false otherwise. - * - * @param String $filename - * @return Mixed - * @access public - */ - function lstat($filename) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $filename = $this->_realpath($filename); - if ($filename === false) { - return false; - } - - if ($this->use_stat_cache) { - $result = $this->_query_stat_cache($filename); - if (is_array($result) && isset($result['.'])) { - return (array) $result['.']; - } - if (is_object($result)) { - return (array) $result; - } - } - - $lstat = $this->_stat($filename, NET_SFTP_LSTAT); - if ($lstat === false) { - $this->_remove_from_stat_cache($filename); - return false; - } - if (isset($lstat['type'])) { - if ($lstat['type'] == NET_SFTP_TYPE_DIRECTORY) { - $filename.= '/.'; - } - $this->_update_stat_cache($filename, (object) $lstat); - return $lstat; - } - - $stat = $this->_stat($filename, NET_SFTP_STAT); - - if ($lstat != $stat) { - $lstat = array_merge($lstat, array('type' => NET_SFTP_TYPE_SYMLINK)); - $this->_update_stat_cache($filename, (object) $lstat); - return $stat; - } - - $pwd = $this->pwd; - $lstat['type'] = $this->chdir($filename) ? - NET_SFTP_TYPE_DIRECTORY : - NET_SFTP_TYPE_REGULAR; - $this->pwd = $pwd; - - if ($lstat['type'] == NET_SFTP_TYPE_DIRECTORY) { - $filename.= '/.'; - } - $this->_update_stat_cache($filename, (object) $lstat); - - return $lstat; - } - - /** - * Returns general information about a file or symbolic link - * - * Determines information without calling Net_SFTP::_realpath(). - * The second parameter can be either NET_SFTP_STAT or NET_SFTP_LSTAT. - * - * @param String $filename - * @param Integer $type - * @return Mixed - * @access private - */ - function _stat($filename, $type) - { - // SFTPv4+ adds an additional 32-bit integer field - flags - to the following: - $packet = pack('Na*', strlen($filename), $filename); - if (!$this->_send_sftp_packet($type, $packet)) { - return false; - } - - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_ATTRS: - return $this->_parseAttributes($response); - case NET_SFTP_STATUS: - $this->_logError($response); - return false; - } - - user_error('Expected SSH_FXP_ATTRS or SSH_FXP_STATUS'); - return false; - } - - /** - * Truncates a file to a given length - * - * @param String $filename - * @param Integer $new_size - * @return Boolean - * @access public - */ - function truncate($filename, $new_size) - { - $attr = pack('N3', NET_SFTP_ATTR_SIZE, $new_size / 4294967296, $new_size); // 4294967296 == 0x100000000 == 1<<32 - - return $this->_setstat($filename, $attr, false); - } - - /** - * Sets access and modification time of file. - * - * If the file does not exist, it will be created. - * - * @param String $filename - * @param optional Integer $time - * @param optional Integer $atime - * @return Boolean - * @access public - */ - function touch($filename, $time = null, $atime = null) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $filename = $this->_realpath($filename); - if ($filename === false) { - return false; - } - - if (!isset($time)) { - $time = time(); - } - if (!isset($atime)) { - $atime = $time; - } - - $flags = NET_SFTP_OPEN_WRITE | NET_SFTP_OPEN_CREATE | NET_SFTP_OPEN_EXCL; - $attr = pack('N3', NET_SFTP_ATTR_ACCESSTIME, $time, $atime); - $packet = pack('Na*Na*', strlen($filename), $filename, $flags, $attr); - if (!$this->_send_sftp_packet(NET_SFTP_OPEN, $packet)) { - return false; - } - - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - return $this->_close_handle(substr($response, 4)); - case NET_SFTP_STATUS: - $this->_logError($response); - break; - default: - user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); - return false; - } - - return $this->_setstat($filename, $attr, false); - } - - /** - * Changes file or directory owner - * - * Returns true on success or false on error. - * - * @param String $filename - * @param Integer $uid - * @param optional Boolean $recursive - * @return Boolean - * @access public - */ - function chown($filename, $uid, $recursive = false) - { - // quoting from , - // "if the owner or group is specified as -1, then that ID is not changed" - $attr = pack('N3', NET_SFTP_ATTR_UIDGID, $uid, -1); - - return $this->_setstat($filename, $attr, $recursive); - } - - /** - * Changes file or directory group - * - * Returns true on success or false on error. - * - * @param String $filename - * @param Integer $gid - * @param optional Boolean $recursive - * @return Boolean - * @access public - */ - function chgrp($filename, $gid, $recursive = false) - { - $attr = pack('N3', NET_SFTP_ATTR_UIDGID, -1, $gid); - - return $this->_setstat($filename, $attr, $recursive); - } - - /** - * Set permissions on a file. - * - * Returns the new file permissions on success or false on error. - * If $recursive is true than this just returns true or false. - * - * @param Integer $mode - * @param String $filename - * @param optional Boolean $recursive - * @return Mixed - * @access public - */ - function chmod($mode, $filename, $recursive = false) - { - if (is_string($mode) && is_int($filename)) { - $temp = $mode; - $mode = $filename; - $filename = $temp; - } - - $attr = pack('N2', NET_SFTP_ATTR_PERMISSIONS, $mode & 07777); - if (!$this->_setstat($filename, $attr, $recursive)) { - return false; - } - if ($recursive) { - return true; - } - - // rather than return what the permissions *should* be, we'll return what they actually are. this will also - // tell us if the file actually exists. - // incidentally, SFTPv4+ adds an additional 32-bit integer field - flags - to the following: - $packet = pack('Na*', strlen($filename), $filename); - if (!$this->_send_sftp_packet(NET_SFTP_STAT, $packet)) { - return false; - } - - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_ATTRS: - $attrs = $this->_parseAttributes($response); - return $attrs['permissions']; - case NET_SFTP_STATUS: - $this->_logError($response); - return false; - } - - user_error('Expected SSH_FXP_ATTRS or SSH_FXP_STATUS'); - return false; - } - - /** - * Sets information about a file - * - * @param String $filename - * @param String $attr - * @param Boolean $recursive - * @return Boolean - * @access private - */ - function _setstat($filename, $attr, $recursive) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $filename = $this->_realpath($filename); - if ($filename === false) { - return false; - } - - $this->_remove_from_stat_cache($filename); - - if ($recursive) { - $i = 0; - $result = $this->_setstat_recursive($filename, $attr, $i); - $this->_read_put_responses($i); - return $result; - } - - // SFTPv4+ has an additional byte field - type - that would need to be sent, as well. setting it to - // SSH_FILEXFER_TYPE_UNKNOWN might work. if not, we'd have to do an SSH_FXP_STAT before doing an SSH_FXP_SETSTAT. - if (!$this->_send_sftp_packet(NET_SFTP_SETSTAT, pack('Na*a*', strlen($filename), $filename, $attr))) { - return false; - } - - /* - "Because some systems must use separate system calls to set various attributes, it is possible that a failure - response will be returned, but yet some of the attributes may be have been successfully modified. If possible, - servers SHOULD avoid this situation; however, clients MUST be aware that this is possible." - - -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.6 - */ - $response = $this->_get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - user_error('Expected SSH_FXP_STATUS'); - return false; - } - - extract(unpack('Nstatus', $this->_string_shift($response, 4))); - if ($status != NET_SFTP_STATUS_OK) { - $this->_logError($response, $status); - return false; - } - - return true; - } - - /** - * Recursively sets information on directories on the SFTP server - * - * Minimizes directory lookups and SSH_FXP_STATUS requests for speed. - * - * @param String $path - * @param String $attr - * @param Integer $i - * @return Boolean - * @access private - */ - function _setstat_recursive($path, $attr, &$i) - { - if (!$this->_read_put_responses($i)) { - return false; - } - $i = 0; - $entries = $this->_list($path, true); - - if ($entries === false) { - return $this->_setstat($path, $attr, false); - } - - // normally $entries would have at least . and .. but it might not if the directories - // permissions didn't allow reading - if (empty($entries)) { - return false; - } - - unset($entries['.'], $entries['..']); - foreach ($entries as $filename=>$props) { - if (!isset($props['type'])) { - return false; - } - - $temp = $path . '/' . $filename; - if ($props['type'] == NET_SFTP_TYPE_DIRECTORY) { - if (!$this->_setstat_recursive($temp, $attr, $i)) { - return false; - } - } else { - if (!$this->_send_sftp_packet(NET_SFTP_SETSTAT, pack('Na*a*', strlen($temp), $temp, $attr))) { - return false; - } - - $i++; - - if ($i >= NET_SFTP_QUEUE_SIZE) { - if (!$this->_read_put_responses($i)) { - return false; - } - $i = 0; - } - } - } - - if (!$this->_send_sftp_packet(NET_SFTP_SETSTAT, pack('Na*a*', strlen($path), $path, $attr))) { - return false; - } - - $i++; - - if ($i >= NET_SFTP_QUEUE_SIZE) { - if (!$this->_read_put_responses($i)) { - return false; - } - $i = 0; - } - - return true; - } - - /** - * Return the target of a symbolic link - * - * @param String $link - * @return Mixed - * @access public - */ - function readlink($link) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $link = $this->_realpath($link); - - if (!$this->_send_sftp_packet(NET_SFTP_READLINK, pack('Na*', strlen($link), $link))) { - return false; - } - - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_NAME: - break; - case NET_SFTP_STATUS: - $this->_logError($response); - return false; - default: - user_error('Expected SSH_FXP_NAME or SSH_FXP_STATUS'); - return false; - } - - extract(unpack('Ncount', $this->_string_shift($response, 4))); - // the file isn't a symlink - if (!$count) { - return false; - } - - extract(unpack('Nlength', $this->_string_shift($response, 4))); - return $this->_string_shift($response, $length); - } - - /** - * Create a symlink - * - * symlink() creates a symbolic link to the existing target with the specified name link. - * - * @param String $target - * @param String $link - * @return Boolean - * @access public - */ - function symlink($target, $link) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $target = $this->_realpath($target); - $link = $this->_realpath($link); - - $packet = pack('Na*Na*', strlen($target), $target, strlen($link), $link); - if (!$this->_send_sftp_packet(NET_SFTP_SYMLINK, $packet)) { - return false; - } - - $response = $this->_get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - user_error('Expected SSH_FXP_STATUS'); - return false; - } - - extract(unpack('Nstatus', $this->_string_shift($response, 4))); - if ($status != NET_SFTP_STATUS_OK) { - $this->_logError($response, $status); - return false; - } - - return true; - } - - /** - * Creates a directory. - * - * @param String $dir - * @return Boolean - * @access public - */ - function mkdir($dir, $mode = -1, $recursive = false) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $dir = $this->_realpath($dir); - // by not providing any permissions, hopefully the server will use the logged in users umask - their - // default permissions. - $attr = $mode == -1 ? "\0\0\0\0" : pack('N2', NET_SFTP_ATTR_PERMISSIONS, $mode & 07777); - - if ($recursive) { - $dirs = explode('/', preg_replace('#/(?=/)|/$#', '', $dir)); - if (empty($dirs[0])) { - array_shift($dirs); - $dirs[0] = '/' . $dirs[0]; - } - for ($i = 0; $i < count($dirs); $i++) { - $temp = array_slice($dirs, 0, $i + 1); - $temp = implode('/', $temp); - $result = $this->_mkdir_helper($temp, $attr); - } - return $result; - } - - return $this->_mkdir_helper($dir, $attr); - } - - /** - * Helper function for directory creation - * - * @param String $dir - * @return Boolean - * @access private - */ - function _mkdir_helper($dir, $attr) - { - if (!$this->_send_sftp_packet(NET_SFTP_MKDIR, pack('Na*a*', strlen($dir), $dir, $attr))) { - return false; - } - - $response = $this->_get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - user_error('Expected SSH_FXP_STATUS'); - return false; - } - - extract(unpack('Nstatus', $this->_string_shift($response, 4))); - if ($status != NET_SFTP_STATUS_OK) { - $this->_logError($response, $status); - return false; - } - - return true; - } - - /** - * Removes a directory. - * - * @param String $dir - * @return Boolean - * @access public - */ - function rmdir($dir) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $dir = $this->_realpath($dir); - if ($dir === false) { - return false; - } - - if (!$this->_send_sftp_packet(NET_SFTP_RMDIR, pack('Na*', strlen($dir), $dir))) { - return false; - } - - $response = $this->_get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - user_error('Expected SSH_FXP_STATUS'); - return false; - } - - extract(unpack('Nstatus', $this->_string_shift($response, 4))); - if ($status != NET_SFTP_STATUS_OK) { - // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED? - $this->_logError($response, $status); - return false; - } - - $this->_remove_from_stat_cache($dir); - // the following will do a soft delete, which would be useful if you deleted a file - // and then tried to do a stat on the deleted file. the above, in contrast, does - // a hard delete - //$this->_update_stat_cache($dir, false); - - return true; - } - - /** - * Uploads a file to the SFTP server. - * - * By default, Net_SFTP::put() does not read from the local filesystem. $data is dumped directly into $remote_file. - * So, for example, if you set $data to 'filename.ext' and then do Net_SFTP::get(), you will get a file, twelve bytes - * long, containing 'filename.ext' as its contents. - * - * Setting $mode to NET_SFTP_LOCAL_FILE will change the above behavior. With NET_SFTP_LOCAL_FILE, $remote_file will - * contain as many bytes as filename.ext does on your local filesystem. If your filename.ext is 1MB then that is how - * large $remote_file will be, as well. - * - * If $data is a resource then it'll be used as a resource instead. - * - * Currently, only binary mode is supported. As such, if the line endings need to be adjusted, you will need to take - * care of that, yourself. - * - * $mode can take an additional two parameters - NET_SFTP_RESUME and NET_SFTP_RESUME_START. These are bitwise AND'd with - * $mode. So if you want to resume upload of a 300mb file on the local file system you'd set $mode to the following: - * - * NET_SFTP_LOCAL_FILE | NET_SFTP_RESUME - * - * If you wanted to simply append the full contents of a local file to the full contents of a remote file you'd replace - * NET_SFTP_RESUME with NET_SFTP_RESUME_START. - * - * If $mode & (NET_SFTP_RESUME | NET_SFTP_RESUME_START) then NET_SFTP_RESUME_START will be assumed. - * - * $start and $local_start give you more fine grained control over this process and take precident over NET_SFTP_RESUME - * when they're non-negative. ie. $start could let you write at the end of a file (like NET_SFTP_RESUME) or in the middle - * of one. $local_start could let you start your reading from the end of a file (like NET_SFTP_RESUME_START) or in the - * middle of one. - * - * Setting $local_start to > 0 or $mode | NET_SFTP_RESUME_START doesn't do anything unless $mode | NET_SFTP_LOCAL_FILE. - * - * @param String $remote_file - * @param String|resource $data - * @param optional Integer $mode - * @param optional Integer $start - * @param optional Integer $local_start - * @return Boolean - * @access public - * @internal ASCII mode for SFTPv4/5/6 can be supported by adding a new function - Net_SFTP::setMode(). - */ - function put($remote_file, $data, $mode = NET_SFTP_STRING, $start = -1, $local_start = -1) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $remote_file = $this->_realpath($remote_file); - if ($remote_file === false) { - return false; - } - - $this->_remove_from_stat_cache($remote_file); - - $flags = NET_SFTP_OPEN_WRITE | NET_SFTP_OPEN_CREATE; - // according to the SFTP specs, NET_SFTP_OPEN_APPEND should "force all writes to append data at the end of the file." - // in practice, it doesn't seem to do that. - //$flags|= ($mode & NET_SFTP_RESUME) ? NET_SFTP_OPEN_APPEND : NET_SFTP_OPEN_TRUNCATE; - - if ($start >= 0) { - $offset = $start; - } elseif ($mode & NET_SFTP_RESUME) { - // if NET_SFTP_OPEN_APPEND worked as it should _size() wouldn't need to be called - $size = $this->size($remote_file); - $offset = $size !== false ? $size : 0; - } else { - $offset = 0; - $flags|= NET_SFTP_OPEN_TRUNCATE; - } - - $packet = pack('Na*N2', strlen($remote_file), $remote_file, $flags, 0); - if (!$this->_send_sftp_packet(NET_SFTP_OPEN, $packet)) { - return false; - } - - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - $handle = substr($response, 4); - break; - case NET_SFTP_STATUS: - $this->_logError($response); - return false; - default: - user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); - return false; - } - - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.2.3 - switch (true) { - case is_resource($data): - $mode = $mode & ~NET_SFTP_LOCAL_FILE; - $fp = $data; - break; - case $mode & NET_SFTP_LOCAL_FILE: - if (!is_file($data)) { - user_error("$data is not a valid file"); - return false; - } - $fp = @fopen($data, 'rb'); - if (!$fp) { - return false; - } - } - - if (isset($fp)) { - $stat = fstat($fp); - $size = $stat['size']; - - if ($local_start >= 0) { - fseek($fp, $local_start); - } elseif ($mode & NET_SFTP_RESUME_START) { - // do nothing - } else { - fseek($fp, $offset); - } - } else { - $size = strlen($data); - } - - $sent = 0; - $size = $size < 0 ? ($size & 0x7FFFFFFF) + 0x80000000 : $size; - - $sftp_packet_size = 4096; // PuTTY uses 4096 - // make the SFTP packet be exactly 4096 bytes by including the bytes in the NET_SFTP_WRITE packets "header" - $sftp_packet_size-= strlen($handle) + 25; - $i = 0; - while ($sent < $size) { - $temp = isset($fp) ? fread($fp, $sftp_packet_size) : substr($data, $sent, $sftp_packet_size); - $subtemp = $offset + $sent; - $packet = pack('Na*N3a*', strlen($handle), $handle, $subtemp / 4294967296, $subtemp, strlen($temp), $temp); - if (!$this->_send_sftp_packet(NET_SFTP_WRITE, $packet)) { - if ($mode & NET_SFTP_LOCAL_FILE) { - fclose($fp); - } - return false; - } - $sent+= strlen($temp); - - $i++; - - if ($i == NET_SFTP_QUEUE_SIZE) { - if (!$this->_read_put_responses($i)) { - $i = 0; - break; - } - $i = 0; - } - } - - if (!$this->_read_put_responses($i)) { - if ($mode & NET_SFTP_LOCAL_FILE) { - fclose($fp); - } - $this->_close_handle($handle); - return false; - } - - if ($mode & NET_SFTP_LOCAL_FILE) { - fclose($fp); - } - - return $this->_close_handle($handle); - } - - /** - * Reads multiple successive SSH_FXP_WRITE responses - * - * Sending an SSH_FXP_WRITE packet and immediately reading its response isn't as efficient as blindly sending out $i - * SSH_FXP_WRITEs, in succession, and then reading $i responses. - * - * @param Integer $i - * @return Boolean - * @access private - */ - function _read_put_responses($i) - { - while ($i--) { - $response = $this->_get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - user_error('Expected SSH_FXP_STATUS'); - return false; - } - - extract(unpack('Nstatus', $this->_string_shift($response, 4))); - if ($status != NET_SFTP_STATUS_OK) { - $this->_logError($response, $status); - break; - } - } - - return $i < 0; - } - - /** - * Close handle - * - * @param String $handle - * @return Boolean - * @access private - */ - function _close_handle($handle) - { - if (!$this->_send_sftp_packet(NET_SFTP_CLOSE, pack('Na*', strlen($handle), $handle))) { - return false; - } - - // "The client MUST release all resources associated with the handle regardless of the status." - // -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.1.3 - $response = $this->_get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - user_error('Expected SSH_FXP_STATUS'); - return false; - } - - extract(unpack('Nstatus', $this->_string_shift($response, 4))); - if ($status != NET_SFTP_STATUS_OK) { - $this->_logError($response, $status); - return false; - } - - return true; - } - - /** - * Downloads a file from the SFTP server. - * - * Returns a string containing the contents of $remote_file if $local_file is left undefined or a boolean false if - * the operation was unsuccessful. If $local_file is defined, returns true or false depending on the success of the - * operation. - * - * $offset and $length can be used to download files in chunks. - * - * @param String $remote_file - * @param optional String $local_file - * @param optional Integer $offset - * @param optional Integer $length - * @return Mixed - * @access public - */ - function get($remote_file, $local_file = false, $offset = 0, $length = -1) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $remote_file = $this->_realpath($remote_file); - if ($remote_file === false) { - return false; - } - - $packet = pack('Na*N2', strlen($remote_file), $remote_file, NET_SFTP_OPEN_READ, 0); - if (!$this->_send_sftp_packet(NET_SFTP_OPEN, $packet)) { - return false; - } - - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - $handle = substr($response, 4); - break; - case NET_SFTP_STATUS: // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - $this->_logError($response); - return false; - default: - user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); - return false; - } - - if (is_resource($local_file)) { - $fp = $local_file; - $stat = fstat($fp); - $res_offset = $stat['size']; - } else { - $res_offset = 0; - if ($local_file !== false) { - $fp = fopen($local_file, 'wb'); - if (!$fp) { - return false; - } - } else { - $content = ''; - } - } - - $fclose_check = $local_file !== false && !is_resource($local_file); - - $start = $offset; - $size = $this->max_sftp_packet < $length || $length < 0 ? $this->max_sftp_packet : $length; - while (true) { - $packet = pack('Na*N3', strlen($handle), $handle, $offset / 4294967296, $offset, $size); - if (!$this->_send_sftp_packet(NET_SFTP_READ, $packet)) { - if ($fclose_check) { - fclose($fp); - } - return false; - } - - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_DATA: - $temp = substr($response, 4); - $offset+= strlen($temp); - if ($local_file === false) { - $content.= $temp; - } else { - fputs($fp, $temp); - } - break; - case NET_SFTP_STATUS: - // could, in theory, return false if !strlen($content) but we'll hold off for the time being - $this->_logError($response); - break 2; - default: - user_error('Expected SSH_FXP_DATA or SSH_FXP_STATUS'); - if ($fclose_check) { - fclose($fp); - } - return false; - } - - if ($length > 0 && $length <= $offset - $start) { - break; - } - } - - if ($length > 0 && $length <= $offset - $start) { - if ($local_file === false) { - $content = substr($content, 0, $length); - } else { - ftruncate($fp, $length + $res_offset); - } - } - - if ($fclose_check) { - fclose($fp); - } - - if (!$this->_close_handle($handle)) { - return false; - } - - // if $content isn't set that means a file was written to - return isset($content) ? $content : true; - } - - /** - * Deletes a file on the SFTP server. - * - * @param String $path - * @param Boolean $recursive - * @return Boolean - * @access public - */ - function delete($path, $recursive = true) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $path = $this->_realpath($path); - if ($path === false) { - return false; - } - - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.3 - if (!$this->_send_sftp_packet(NET_SFTP_REMOVE, pack('Na*', strlen($path), $path))) { - return false; - } - - $response = $this->_get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - user_error('Expected SSH_FXP_STATUS'); - return false; - } - - // if $status isn't SSH_FX_OK it's probably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - extract(unpack('Nstatus', $this->_string_shift($response, 4))); - if ($status != NET_SFTP_STATUS_OK) { - $this->_logError($response, $status); - if (!$recursive) { - return false; - } - $i = 0; - $result = $this->_delete_recursive($path, $i); - $this->_read_put_responses($i); - return $result; - } - - $this->_remove_from_stat_cache($path); - - return true; - } - - /** - * Recursively deletes directories on the SFTP server - * - * Minimizes directory lookups and SSH_FXP_STATUS requests for speed. - * - * @param String $path - * @param Integer $i - * @return Boolean - * @access private - */ - function _delete_recursive($path, &$i) - { - if (!$this->_read_put_responses($i)) { - return false; - } - $i = 0; - $entries = $this->_list($path, true); - - // normally $entries would have at least . and .. but it might not if the directories - // permissions didn't allow reading - if (empty($entries)) { - return false; - } - - unset($entries['.'], $entries['..']); - foreach ($entries as $filename=>$props) { - if (!isset($props['type'])) { - return false; - } - - $temp = $path . '/' . $filename; - if ($props['type'] == NET_SFTP_TYPE_DIRECTORY) { - if (!$this->_delete_recursive($temp, $i)) { - return false; - } - } else { - if (!$this->_send_sftp_packet(NET_SFTP_REMOVE, pack('Na*', strlen($temp), $temp))) { - return false; - } - - $i++; - - if ($i >= NET_SFTP_QUEUE_SIZE) { - if (!$this->_read_put_responses($i)) { - return false; - } - $i = 0; - } - } - $this->_remove_from_stat_cache($path); - } - - if (!$this->_send_sftp_packet(NET_SFTP_RMDIR, pack('Na*', strlen($path), $path))) { - return false; - } - - $i++; - - if ($i >= NET_SFTP_QUEUE_SIZE) { - if (!$this->_read_put_responses($i)) { - return false; - } - $i = 0; - } - - return true; - } - - /** - * Checks whether a file or directory exists - * - * @param String $path - * @return Boolean - * @access public - */ - function file_exists($path) - { - if ($this->use_stat_cache) { - $path = $this->_realpath($path); - - $result = $this->_query_stat_cache($path); - - if (isset($result)) { - // return true if $result is an array or if it's an stdClass object - return $result !== false; - } - } - - return $this->stat($path) !== false; - } - - /** - * Tells whether the filename is a directory - * - * @param String $path - * @return Boolean - * @access public - */ - function is_dir($path) - { - $result = $this->_get_stat_cache_prop($path, 'type'); - if ($result === false) { - return false; - } - return $result === NET_SFTP_TYPE_DIRECTORY; - } - - /** - * Tells whether the filename is a regular file - * - * @param String $path - * @return Boolean - * @access public - */ - function is_file($path) - { - $result = $this->_get_stat_cache_prop($path, 'type'); - if ($result === false) { - return false; - } - return $result === NET_SFTP_TYPE_REGULAR; - } - - /** - * Tells whether the filename is a symbolic link - * - * @param String $path - * @return Boolean - * @access public - */ - function is_link($path) - { - $result = $this->_get_stat_cache_prop($path, 'type'); - if ($result === false) { - return false; - } - return $result === NET_SFTP_TYPE_SYMLINK; - } - - /** - * Gets last access time of file - * - * @param String $path - * @return Mixed - * @access public - */ - function fileatime($path) - { - return $this->_get_stat_cache_prop($path, 'atime'); - } - - /** - * Gets file modification time - * - * @param String $path - * @return Mixed - * @access public - */ - function filemtime($path) - { - return $this->_get_stat_cache_prop($path, 'mtime'); - } - - /** - * Gets file permissions - * - * @param String $path - * @return Mixed - * @access public - */ - function fileperms($path) - { - return $this->_get_stat_cache_prop($path, 'permissions'); - } - - /** - * Gets file owner - * - * @param String $path - * @return Mixed - * @access public - */ - function fileowner($path) - { - return $this->_get_stat_cache_prop($path, 'uid'); - } - - /** - * Gets file group - * - * @param String $path - * @return Mixed - * @access public - */ - function filegroup($path) - { - return $this->_get_stat_cache_prop($path, 'gid'); - } - - /** - * Gets file size - * - * @param String $path - * @return Mixed - * @access public - */ - function filesize($path) - { - return $this->_get_stat_cache_prop($path, 'size'); - } - - /** - * Gets file type - * - * @param String $path - * @return Mixed - * @access public - */ - function filetype($path) - { - $type = $this->_get_stat_cache_prop($path, 'type'); - if ($type === false) { - return false; - } - - switch ($type) { - case NET_SFTP_TYPE_BLOCK_DEVICE: return 'block'; - case NET_SFTP_TYPE_CHAR_DEVICE: return 'char'; - case NET_SFTP_TYPE_DIRECTORY: return 'dir'; - case NET_SFTP_TYPE_FIFO: return 'fifo'; - case NET_SFTP_TYPE_REGULAR: return 'file'; - case NET_SFTP_TYPE_SYMLINK: return 'link'; - default: return false; - } - } - - /** - * Return a stat properity - * - * Uses cache if appropriate. - * - * @param String $path - * @param String $prop - * @return Mixed - * @access private - */ - function _get_stat_cache_prop($path, $prop) - { - if ($this->use_stat_cache) { - $path = $this->_realpath($path); - - $result = $this->_query_stat_cache($path); - - if (is_object($result) && isset($result->$prop)) { - return $result->$prop; - } - } - - $result = $this->stat($path); - - if ($result === false || !isset($result[$prop])) { - return false; - } - - return $result[$prop]; - } - - /** - * Renames a file or a directory on the SFTP server - * - * @param String $oldname - * @param String $newname - * @return Boolean - * @access public - */ - function rename($oldname, $newname) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $oldname = $this->_realpath($oldname); - $newname = $this->_realpath($newname); - if ($oldname === false || $newname === false) { - return false; - } - - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.3 - $packet = pack('Na*Na*', strlen($oldname), $oldname, strlen($newname), $newname); - if (!$this->_send_sftp_packet(NET_SFTP_RENAME, $packet)) { - return false; - } - - $response = $this->_get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - user_error('Expected SSH_FXP_STATUS'); - return false; - } - - // if $status isn't SSH_FX_OK it's probably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - extract(unpack('Nstatus', $this->_string_shift($response, 4))); - if ($status != NET_SFTP_STATUS_OK) { - $this->_logError($response, $status); - return false; - } - - // don't move the stat cache entry over since this operation could very well change the - // atime and mtime attributes - //$this->_update_stat_cache($newname, $this->_query_stat_cache($oldname)); - $this->_remove_from_stat_cache($oldname); - $this->_remove_from_stat_cache($newname); - - return true; - } - - /** - * Parse Attributes - * - * See '7. File Attributes' of draft-ietf-secsh-filexfer-13 for more info. - * - * @param String $response - * @return Array - * @access private - */ - function _parseAttributes(&$response) - { - $attr = array(); - extract(unpack('Nflags', $this->_string_shift($response, 4))); - // SFTPv4+ have a type field (a byte) that follows the above flag field - foreach ($this->attributes as $key => $value) { - switch ($flags & $key) { - case NET_SFTP_ATTR_SIZE: // 0x00000001 - // The size attribute is defined as an unsigned 64-bit integer. - // The following will use floats on 32-bit platforms, if necessary. - // As can be seen in the BigInteger class, floats are generally - // IEEE 754 binary64 "double precision" on such platforms and - // as such can represent integers of at least 2^50 without loss - // of precision. Interpreted in filesize, 2^50 bytes = 1024 TiB. - $attr['size'] = hexdec(bin2hex($this->_string_shift($response, 8))); - break; - case NET_SFTP_ATTR_UIDGID: // 0x00000002 (SFTPv3 only) - $attr+= unpack('Nuid/Ngid', $this->_string_shift($response, 8)); - break; - case NET_SFTP_ATTR_PERMISSIONS: // 0x00000004 - $attr+= unpack('Npermissions', $this->_string_shift($response, 4)); - // mode == permissions; permissions was the original array key and is retained for bc purposes. - // mode was added because that's the more industry standard terminology - $attr+= array('mode' => $attr['permissions']); - $fileType = $this->_parseMode($attr['permissions']); - if ($fileType !== false) { - $attr+= array('type' => $fileType); - } - break; - case NET_SFTP_ATTR_ACCESSTIME: // 0x00000008 - $attr+= unpack('Natime/Nmtime', $this->_string_shift($response, 8)); - break; - case NET_SFTP_ATTR_EXTENDED: // 0x80000000 - extract(unpack('Ncount', $this->_string_shift($response, 4))); - for ($i = 0; $i < $count; $i++) { - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $key = $this->_string_shift($response, $length); - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $attr[$key] = $this->_string_shift($response, $length); - } - } - } - return $attr; - } - - /** - * Attempt to identify the file type - * - * Quoting the SFTP RFC, "Implementations MUST NOT send bits that are not defined" but they seem to anyway - * - * @param Integer $mode - * @return Integer - * @access private - */ - function _parseMode($mode) - { - // values come from http://lxr.free-electrons.com/source/include/uapi/linux/stat.h#L12 - // see, also, http://linux.die.net/man/2/stat - switch ($mode & 0170000) {// ie. 1111 0000 0000 0000 - case 0000000: // no file type specified - figure out the file type using alternative means - return false; - case 0040000: - return NET_SFTP_TYPE_DIRECTORY; - case 0100000: - return NET_SFTP_TYPE_REGULAR; - case 0120000: - return NET_SFTP_TYPE_SYMLINK; - // new types introduced in SFTPv5+ - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-05#section-5.2 - case 0010000: // named pipe (fifo) - return NET_SFTP_TYPE_FIFO; - case 0020000: // character special - return NET_SFTP_TYPE_CHAR_DEVICE; - case 0060000: // block special - return NET_SFTP_TYPE_BLOCK_DEVICE; - case 0140000: // socket - return NET_SFTP_TYPE_SOCKET; - case 0160000: // whiteout - // "SPECIAL should be used for files that are of - // a known type which cannot be expressed in the protocol" - return NET_SFTP_TYPE_SPECIAL; - default: - return NET_SFTP_TYPE_UNKNOWN; - } - } - - /** - * Parse Longname - * - * SFTPv3 doesn't provide any easy way of identifying a file type. You could try to open - * a file as a directory and see if an error is returned or you could try to parse the - * SFTPv3-specific longname field of the SSH_FXP_NAME packet. That's what this function does. - * The result is returned using the - * {@link http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-5.2 SFTPv4 type constants}. - * - * If the longname is in an unrecognized format bool(false) is returned. - * - * @param String $longname - * @return Mixed - * @access private - */ - function _parseLongname($longname) - { - // http://en.wikipedia.org/wiki/Unix_file_types - // http://en.wikipedia.org/wiki/Filesystem_permissions#Notation_of_traditional_Unix_permissions - if (preg_match('#^[^/]([r-][w-][xstST-]){3}#', $longname)) { - switch ($longname[0]) { - case '-': - return NET_SFTP_TYPE_REGULAR; - case 'd': - return NET_SFTP_TYPE_DIRECTORY; - case 'l': - return NET_SFTP_TYPE_SYMLINK; - default: - return NET_SFTP_TYPE_SPECIAL; - } - } - - return false; - } - - /** - * Sends SFTP Packets - * - * See '6. General Packet Format' of draft-ietf-secsh-filexfer-13 for more info. - * - * @param Integer $type - * @param String $data - * @see Net_SFTP::_get_sftp_packet() - * @see Net_SSH2::_send_channel_packet() - * @return Boolean - * @access private - */ - function _send_sftp_packet($type, $data) - { - $packet = $this->request_id !== false ? - pack('NCNa*', strlen($data) + 5, $type, $this->request_id, $data) : - pack('NCa*', strlen($data) + 1, $type, $data); - - $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 - $result = $this->_send_channel_packet(NET_SFTP_CHANNEL, $packet); - $stop = strtok(microtime(), ' ') + strtok(''); - - if (defined('NET_SFTP_LOGGING')) { - $packet_type = '-> ' . $this->packet_types[$type] . - ' (' . round($stop - $start, 4) . 's)'; - if (NET_SFTP_LOGGING == NET_SFTP_LOG_REALTIME) { - echo "
\r\n" . $this->_format_log(array($data), array($packet_type)) . "\r\n
\r\n"; - flush(); - ob_flush(); - } else { - $this->packet_type_log[] = $packet_type; - if (NET_SFTP_LOGGING == NET_SFTP_LOG_COMPLEX) { - $this->packet_log[] = $data; - } - } - } - - return $result; - } - - /** - * Receives SFTP Packets - * - * See '6. General Packet Format' of draft-ietf-secsh-filexfer-13 for more info. - * - * Incidentally, the number of SSH_MSG_CHANNEL_DATA messages has no bearing on the number of SFTP packets present. - * There can be one SSH_MSG_CHANNEL_DATA messages containing two SFTP packets or there can be two SSH_MSG_CHANNEL_DATA - * messages containing one SFTP packet. - * - * @see Net_SFTP::_send_sftp_packet() - * @return String - * @access private - */ - function _get_sftp_packet() - { - $this->curTimeout = false; - - $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 - - // SFTP packet length - while (strlen($this->packet_buffer) < 4) { - $temp = $this->_get_channel_packet(NET_SFTP_CHANNEL); - if (is_bool($temp)) { - $this->packet_type = false; - $this->packet_buffer = ''; - return false; - } - $this->packet_buffer.= $temp; - } - extract(unpack('Nlength', $this->_string_shift($this->packet_buffer, 4))); - $tempLength = $length; - $tempLength-= strlen($this->packet_buffer); - - // SFTP packet type and data payload - while ($tempLength > 0) { - $temp = $this->_get_channel_packet(NET_SFTP_CHANNEL); - if (is_bool($temp)) { - $this->packet_type = false; - $this->packet_buffer = ''; - return false; - } - $this->packet_buffer.= $temp; - $tempLength-= strlen($temp); - } - - $stop = strtok(microtime(), ' ') + strtok(''); - - $this->packet_type = ord($this->_string_shift($this->packet_buffer)); - - if ($this->request_id !== false) { - $this->_string_shift($this->packet_buffer, 4); // remove the request id - $length-= 5; // account for the request id and the packet type - } else { - $length-= 1; // account for the packet type - } - - $packet = $this->_string_shift($this->packet_buffer, $length); - - if (defined('NET_SFTP_LOGGING')) { - $packet_type = '<- ' . $this->packet_types[$this->packet_type] . - ' (' . round($stop - $start, 4) . 's)'; - if (NET_SFTP_LOGGING == NET_SFTP_LOG_REALTIME) { - echo "
\r\n" . $this->_format_log(array($packet), array($packet_type)) . "\r\n
\r\n"; - flush(); - ob_flush(); - } else { - $this->packet_type_log[] = $packet_type; - if (NET_SFTP_LOGGING == NET_SFTP_LOG_COMPLEX) { - $this->packet_log[] = $packet; - } - } - } - - return $packet; - } - - /** - * Returns a log of the packets that have been sent and received. - * - * Returns a string if NET_SFTP_LOGGING == NET_SFTP_LOG_COMPLEX, an array if NET_SFTP_LOGGING == NET_SFTP_LOG_SIMPLE and false if !defined('NET_SFTP_LOGGING') - * - * @access public - * @return String or Array - */ - function getSFTPLog() - { - if (!defined('NET_SFTP_LOGGING')) { - return false; - } - - switch (NET_SFTP_LOGGING) { - case NET_SFTP_LOG_COMPLEX: - return $this->_format_log($this->packet_log, $this->packet_type_log); - break; - //case NET_SFTP_LOG_SIMPLE: - default: - return $this->packet_type_log; - } - } - - /** - * Returns all errors - * - * @return String - * @access public - */ - function getSFTPErrors() - { - return $this->sftp_errors; - } - - /** - * Returns the last error - * - * @return String - * @access public - */ - function getLastSFTPError() - { - return count($this->sftp_errors) ? $this->sftp_errors[count($this->sftp_errors) - 1] : ''; - } - - /** - * Get supported SFTP versions - * - * @return Array - * @access public - */ - function getSupportedVersions() - { - $temp = array('version' => $this->version); - if (isset($this->extensions['versions'])) { - $temp['extensions'] = $this->extensions['versions']; - } - return $temp; - } - - /** - * Disconnect - * - * @param Integer $reason - * @return Boolean - * @access private - */ - function _disconnect($reason) - { - $this->pwd = false; - parent::_disconnect($reason); - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SFTP/Stream.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SFTP/Stream.php deleted file mode 100755 index eda1cdba..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SFTP/Stream.php +++ /dev/null @@ -1,801 +0,0 @@ - - * @copyright 2013 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * SFTP Stream Wrapper - * - * @package Net_SFTP_Stream - * @author Jim Wigginton - * @access public - */ -class Net_SFTP_Stream -{ - /** - * SFTP instances - * - * Rather than re-create the connection we re-use instances if possible - * - * @var Array - */ - static $instances; - - /** - * SFTP instance - * - * @var Object - * @access private - */ - var $sftp; - - /** - * Path - * - * @var String - * @access private - */ - var $path; - - /** - * Mode - * - * @var String - * @access private - */ - var $mode; - - /** - * Position - * - * @var Integer - * @access private - */ - var $pos; - - /** - * Size - * - * @var Integer - * @access private - */ - var $size; - - /** - * Directory entries - * - * @var Array - * @access private - */ - var $entries; - - /** - * EOF flag - * - * @var Boolean - * @access private - */ - var $eof; - - /** - * Context resource - * - * Technically this needs to be publically accessible so PHP can set it directly - * - * @var Resource - * @access public - */ - var $context; - - /** - * Notification callback function - * - * @var Callable - * @access public - */ - var $notification; - - /** - * Registers this class as a URL wrapper. - * - * @param optional String $protocol The wrapper name to be registered. - * @return Boolean True on success, false otherwise. - * @access public - */ - static function register($protocol = 'sftp') - { - if (in_array($protocol, stream_get_wrappers(), true)) { - return false; - } - $class = function_exists('get_called_class') ? get_called_class() : __CLASS__; - return stream_wrapper_register($protocol, $class); - } - - /** - * The Constructor - * - * @access public - */ - function Net_SFTP_Stream() - { - if (defined('NET_SFTP_STREAM_LOGGING')) { - echo "__construct()\r\n"; - } - - if (!class_exists('Net_SFTP')) { - include_once 'Net/SFTP.php'; - } - } - - /** - * Path Parser - * - * Extract a path from a URI and actually connect to an SSH server if appropriate - * - * If "notification" is set as a context parameter the message code for successful login is - * NET_SSH2_MSG_USERAUTH_SUCCESS. For a failed login it's NET_SSH2_MSG_USERAUTH_FAILURE. - * - * @param String $path - * @return String - * @access private - */ - function _parse_path($path) - { - extract(parse_url($path) + array('port' => 22)); - - if (!isset($host)) { - return false; - } - - if (isset($this->context)) { - $context = stream_context_get_params($this->context); - if (isset($context['notification'])) { - $this->notification = $context['notification']; - } - } - - if ($host[0] == '$') { - $host = substr($host, 1); - global $$host; - if (!is_object($$host) || get_class($$host) != 'Net_SFTP') { - return false; - } - $this->sftp = $$host; - } else { - if (isset($this->context)) { - $context = stream_context_get_options($this->context); - } - if (isset($context[$scheme]['session'])) { - $sftp = $context[$scheme]['session']; - } - if (isset($context[$scheme]['sftp'])) { - $sftp = $context[$scheme]['sftp']; - } - if (isset($sftp) && is_object($sftp) && get_class($sftp) == 'Net_SFTP') { - $this->sftp = $sftp; - return $path; - } - if (isset($context[$scheme]['username'])) { - $user = $context[$scheme]['username']; - } - if (isset($context[$scheme]['password'])) { - $pass = $context[$scheme]['password']; - } - if (isset($context[$scheme]['privkey']) && is_object($context[$scheme]['privkey']) && get_Class($context[$scheme]['privkey']) == 'Crypt_RSA') { - $pass = $context[$scheme]['privkey']; - } - - if (!isset($user) || !isset($pass)) { - return false; - } - - // casting $pass to a string is necessary in the event that it's a Crypt_RSA object - if (isset(self::$instances[$host][$port][$user][(string) $pass])) { - $this->sftp = self::$instances[$host][$port][$user][(string) $pass]; - } else { - $this->sftp = new Net_SFTP($host, $port); - $this->sftp->disableStatCache(); - if (isset($this->notification) && is_callable($this->notification)) { - /* if !is_callable($this->notification) we could do this: - - user_error('fopen(): failed to call user notifier', E_USER_WARNING); - - the ftp wrapper gives errors like that when the notifier isn't callable. - i've opted not to do that, however, since the ftp wrapper gives the line - on which the fopen occurred as the line number - not the line that the - user_error is on. - */ - call_user_func($this->notification, STREAM_NOTIFY_CONNECT, STREAM_NOTIFY_SEVERITY_INFO, '', 0, 0, 0); - call_user_func($this->notification, STREAM_NOTIFY_AUTH_REQUIRED, STREAM_NOTIFY_SEVERITY_INFO, '', 0, 0, 0); - if (!$this->sftp->login($user, $pass)) { - call_user_func($this->notification, STREAM_NOTIFY_AUTH_RESULT, STREAM_NOTIFY_SEVERITY_ERR, 'Login Failure', NET_SSH2_MSG_USERAUTH_FAILURE, 0, 0); - return false; - } - call_user_func($this->notification, STREAM_NOTIFY_AUTH_RESULT, STREAM_NOTIFY_SEVERITY_INFO, 'Login Success', NET_SSH2_MSG_USERAUTH_SUCCESS, 0, 0); - } else { - if (!$this->sftp->login($user, $pass)) { - return false; - } - } - self::$instances[$host][$port][$user][(string) $pass] = $this->sftp; - } - } - - return $path; - } - - /** - * Opens file or URL - * - * @param String $path - * @param String $mode - * @param Integer $options - * @param String $opened_path - * @return Boolean - * @access public - */ - function _stream_open($path, $mode, $options, &$opened_path) - { - $path = $this->_parse_path($path); - - if ($path === false) { - return false; - } - $this->path = $path; - - $this->size = $this->sftp->size($path); - $this->mode = preg_replace('#[bt]$#', '', $mode); - $this->eof = false; - - if ($this->size === false) { - if ($this->mode[0] == 'r') { - return false; - } - } else { - switch ($this->mode[0]) { - case 'x': - return false; - case 'w': - case 'c': - $this->sftp->truncate($path, 0); - } - } - - $this->pos = $this->mode[0] != 'a' ? 0 : $this->size; - - return true; - } - - /** - * Read from stream - * - * @param Integer $count - * @return Mixed - * @access public - */ - function _stream_read($count) - { - switch ($this->mode) { - case 'w': - case 'a': - case 'x': - case 'c': - return false; - } - - // commented out because some files - eg. /dev/urandom - will say their size is 0 when in fact it's kinda infinite - //if ($this->pos >= $this->size) { - // $this->eof = true; - // return false; - //} - - $result = $this->sftp->get($this->path, false, $this->pos, $count); - if (isset($this->notification) && is_callable($this->notification)) { - if ($result === false) { - call_user_func($this->notification, STREAM_NOTIFY_FAILURE, STREAM_NOTIFY_SEVERITY_ERR, $this->sftp->getLastSFTPError(), NET_SFTP_OPEN, 0, 0); - return 0; - } - // seems that PHP calls stream_read in 8k chunks - call_user_func($this->notification, STREAM_NOTIFY_PROGRESS, STREAM_NOTIFY_SEVERITY_INFO, '', 0, strlen($result), $this->size); - } - - if (empty($result)) { // ie. false or empty string - $this->eof = true; - return false; - } - $this->pos+= strlen($result); - - return $result; - } - - /** - * Write to stream - * - * @param String $data - * @return Mixed - * @access public - */ - function _stream_write($data) - { - switch ($this->mode) { - case 'r': - return false; - } - - $result = $this->sftp->put($this->path, $data, NET_SFTP_STRING, $this->pos); - if (isset($this->notification) && is_callable($this->notification)) { - if (!$result) { - call_user_func($this->notification, STREAM_NOTIFY_FAILURE, STREAM_NOTIFY_SEVERITY_ERR, $this->sftp->getLastSFTPError(), NET_SFTP_OPEN, 0, 0); - return 0; - } - // seems that PHP splits up strings into 8k blocks before calling stream_write - call_user_func($this->notification, STREAM_NOTIFY_PROGRESS, STREAM_NOTIFY_SEVERITY_INFO, '', 0, strlen($data), strlen($data)); - } - - if ($result === false) { - return false; - } - $this->pos+= strlen($data); - if ($this->pos > $this->size) { - $this->size = $this->pos; - } - $this->eof = false; - return strlen($data); - } - - /** - * Retrieve the current position of a stream - * - * @return Integer - * @access public - */ - function _stream_tell() - { - return $this->pos; - } - - /** - * Tests for end-of-file on a file pointer - * - * In my testing there are four classes functions that normally effect the pointer: - * fseek, fputs / fwrite, fgets / fread and ftruncate. - * - * Only fgets / fread, however, results in feof() returning true. do fputs($fp, 'aaa') on a blank file and feof() - * will return false. do fread($fp, 1) and feof() will then return true. do fseek($fp, 10) on ablank file and feof() - * will return false. do fread($fp, 1) and feof() will then return true. - * - * @return Boolean - * @access public - */ - function _stream_eof() - { - return $this->eof; - } - - /** - * Seeks to specific location in a stream - * - * @param Integer $offset - * @param Integer $whence - * @return Boolean - * @access public - */ - function _stream_seek($offset, $whence) - { - switch ($whence) { - case SEEK_SET: - if ($offset >= $this->size || $offset < 0) { - return false; - } - break; - case SEEK_CUR: - $offset+= $this->pos; - break; - case SEEK_END: - $offset+= $this->size; - } - - $this->pos = $offset; - $this->eof = false; - return true; - } - - /** - * Change stream options - * - * @param String $path - * @param Integer $option - * @param Mixed $var - * @return Boolean - * @access public - */ - function _stream_metadata($path, $option, $var) - { - $path = $this->_parse_path($path); - if ($path === false) { - return false; - } - - // stream_metadata was introduced in PHP 5.4.0 but as of 5.4.11 the constants haven't been defined - // see http://www.php.net/streamwrapper.stream-metadata and https://bugs.php.net/64246 - // and https://github.com/php/php-src/blob/master/main/php_streams.h#L592 - switch ($option) { - case 1: // PHP_STREAM_META_TOUCH - return $this->sftp->touch($path, $var[0], $var[1]); - case 2: // PHP_STREAM_OWNER_NAME - case 3: // PHP_STREAM_GROUP_NAME - return false; - case 4: // PHP_STREAM_META_OWNER - return $this->sftp->chown($path, $var); - case 5: // PHP_STREAM_META_GROUP - return $this->sftp->chgrp($path, $var); - case 6: // PHP_STREAM_META_ACCESS - return $this->sftp->chmod($path, $var) !== false; - } - } - - /** - * Retrieve the underlaying resource - * - * @param Integer $cast_as - * @return Resource - * @access public - */ - function _stream_cast($cast_as) - { - return $this->sftp->fsock; - } - - /** - * Advisory file locking - * - * @param Integer $operation - * @return Boolean - * @access public - */ - function _stream_lock($operation) - { - return false; - } - - /** - * Renames a file or directory - * - * Attempts to rename oldname to newname, moving it between directories if necessary. - * If newname exists, it will be overwritten. This is a departure from what Net_SFTP - * does. - * - * @param String $path_from - * @param String $path_to - * @return Boolean - * @access public - */ - function _rename($path_from, $path_to) - { - $path1 = parse_url($path_from); - $path2 = parse_url($path_to); - unset($path1['path'], $path2['path']); - if ($path1 != $path2) { - return false; - } - - $path_from = $this->_parse_path($path_from); - $path_to = parse_url($path_to); - if ($path_from == false) { - return false; - } - - $path_to = $path_to['path']; // the $component part of parse_url() was added in PHP 5.1.2 - // "It is an error if there already exists a file with the name specified by newpath." - // -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-02#section-6.5 - if (!$this->sftp->rename($path_from, $path_to)) { - if ($this->sftp->stat($path_to)) { - return $this->sftp->delete($path_to, true) && $this->sftp->rename($path_from, $path_to); - } - return false; - } - - return true; - } - - /** - * Open directory handle - * - * The only $options is "whether or not to enforce safe_mode (0x04)". Since safe mode was deprecated in 5.3 and - * removed in 5.4 I'm just going to ignore it. - * - * Also, nlist() is the best that this function is realistically going to be able to do. When an SFTP client - * sends a SSH_FXP_READDIR packet you don't generally get info on just one file but on multiple files. Quoting - * the SFTP specs: - * - * The SSH_FXP_NAME response has the following format: - * - * uint32 id - * uint32 count - * repeats count times: - * string filename - * string longname - * ATTRS attrs - * - * @param String $path - * @param Integer $options - * @return Boolean - * @access public - */ - function _dir_opendir($path, $options) - { - $path = $this->_parse_path($path); - if ($path === false) { - return false; - } - $this->pos = 0; - $this->entries = $this->sftp->nlist($path); - return $this->entries !== false; - } - - /** - * Read entry from directory handle - * - * @return Mixed - * @access public - */ - function _dir_readdir() - { - if (isset($this->entries[$this->pos])) { - return $this->entries[$this->pos++]; - } - return false; - } - - /** - * Rewind directory handle - * - * @return Boolean - * @access public - */ - function _dir_rewinddir() - { - $this->pos = 0; - return true; - } - - /** - * Close directory handle - * - * @return Boolean - * @access public - */ - function _dir_closedir() - { - return true; - } - - /** - * Create a directory - * - * Only valid $options is STREAM_MKDIR_RECURSIVE - * - * @param String $path - * @param Integer $mode - * @param Integer $options - * @return Boolean - * @access public - */ - function _mkdir($path, $mode, $options) - { - $path = $this->_parse_path($path); - if ($path === false) { - return false; - } - - return $this->sftp->mkdir($path, $mode, $options & STREAM_MKDIR_RECURSIVE); - } - - /** - * Removes a directory - * - * Only valid $options is STREAM_MKDIR_RECURSIVE per , however, - * does not have a $recursive parameter as mkdir() does so I don't know how - * STREAM_MKDIR_RECURSIVE is supposed to be set. Also, when I try it out with rmdir() I get 8 as - * $options. What does 8 correspond to? - * - * @param String $path - * @param Integer $mode - * @param Integer $options - * @return Boolean - * @access public - */ - function _rmdir($path, $options) - { - $path = $this->_parse_path($path); - if ($path === false) { - return false; - } - - return $this->sftp->rmdir($path); - } - - /** - * Flushes the output - * - * See . Always returns true because Net_SFTP doesn't cache stuff before writing - * - * @return Boolean - * @access public - */ - function _stream_flush() - { - return true; - } - - /** - * Retrieve information about a file resource - * - * @return Mixed - * @access public - */ - function _stream_stat() - { - $results = $this->sftp->stat($this->path); - if ($results === false) { - return false; - } - return $results; - } - - /** - * Delete a file - * - * @param String $path - * @return Boolean - * @access public - */ - function _unlink($path) - { - $path = $this->_parse_path($path); - if ($path === false) { - return false; - } - - return $this->sftp->delete($path, false); - } - - /** - * Retrieve information about a file - * - * Ignores the STREAM_URL_STAT_QUIET flag because the entirety of Net_SFTP_Stream is quiet by default - * might be worthwhile to reconstruct bits 12-16 (ie. the file type) if mode doesn't have them but we'll - * cross that bridge when and if it's reached - * - * @param String $path - * @param Integer $flags - * @return Mixed - * @access public - */ - function _url_stat($path, $flags) - { - $path = $this->_parse_path($path); - if ($path === false) { - return false; - } - - $results = $flags & STREAM_URL_STAT_LINK ? $this->sftp->lstat($path) : $this->sftp->stat($path); - if ($results === false) { - return false; - } - - return $results; - } - - /** - * Truncate stream - * - * @param Integer $new_size - * @return Boolean - * @access public - */ - function _stream_truncate($new_size) - { - if (!$this->sftp->truncate($this->path, $new_size)) { - return false; - } - - $this->eof = false; - $this->size = $new_size; - - return true; - } - - /** - * Change stream options - * - * STREAM_OPTION_WRITE_BUFFER isn't supported for the same reason stream_flush isn't. - * The other two aren't supported because of limitations in Net_SFTP. - * - * @param Integer $option - * @param Integer $arg1 - * @param Integer $arg2 - * @return Boolean - * @access public - */ - function _stream_set_option($option, $arg1, $arg2) - { - return false; - } - - /** - * Close an resource - * - * @access public - */ - function _stream_close() - { - } - - /** - * __call Magic Method - * - * When you're utilizing an SFTP stream you're not calling the methods in this class directly - PHP is calling them for you. - * Which kinda begs the question... what methods is PHP calling and what parameters is it passing to them? This function - * lets you figure that out. - * - * If NET_SFTP_STREAM_LOGGING is defined all calls will be output on the screen and then (regardless of whether or not - * NET_SFTP_STREAM_LOGGING is enabled) the parameters will be passed through to the appropriate method. - * - * @param String - * @param Array - * @return Mixed - * @access public - */ - function __call($name, $arguments) - { - if (defined('NET_SFTP_STREAM_LOGGING')) { - echo $name . '('; - $last = count($arguments) - 1; - foreach ($arguments as $i => $argument) { - var_export($argument); - if ($i != $last) { - echo ','; - } - } - echo ")\r\n"; - } - $name = '_' . $name; - if (!method_exists($this, $name)) { - return false; - } - return call_user_func_array(array($this, $name), $arguments); - } -} - -Net_SFTP_Stream::register(); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SSH1.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SSH1.php deleted file mode 100755 index f1fae02b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SSH1.php +++ /dev/null @@ -1,1651 +0,0 @@ - - * login('username', 'password')) { - * exit('Login Failed'); - * } - * - * echo $ssh->exec('ls -la'); - * ?> - * - * - * Here's another short example: - * - * login('username', 'password')) { - * exit('Login Failed'); - * } - * - * echo $ssh->read('username@username:~$'); - * $ssh->write("ls -la\n"); - * echo $ssh->read('username@username:~$'); - * ?> - * - * - * More information on the SSHv1 specification can be found by reading - * {@link http://www.snailbook.com/docs/protocol-1.5.txt protocol-1.5.txt}. - * - * LICENSE: 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. - * - * @category Net - * @package Net_SSH1 - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/**#@+ - * Encryption Methods - * - * @see Net_SSH1::getSupportedCiphers() - * @access public - */ -/** - * No encryption - * - * Not supported. - */ -define('NET_SSH1_CIPHER_NONE', 0); -/** - * IDEA in CFB mode - * - * Not supported. - */ -define('NET_SSH1_CIPHER_IDEA', 1); -/** - * DES in CBC mode - */ -define('NET_SSH1_CIPHER_DES', 2); -/** - * Triple-DES in CBC mode - * - * All implementations are required to support this - */ -define('NET_SSH1_CIPHER_3DES', 3); -/** - * TRI's Simple Stream encryption CBC - * - * Not supported nor is it defined in the official SSH1 specs. OpenSSH, however, does define it (see cipher.h), - * although it doesn't use it (see cipher.c) - */ -define('NET_SSH1_CIPHER_BROKEN_TSS', 4); -/** - * RC4 - * - * Not supported. - * - * @internal According to the SSH1 specs: - * - * "The first 16 bytes of the session key are used as the key for - * the server to client direction. The remaining 16 bytes are used - * as the key for the client to server direction. This gives - * independent 128-bit keys for each direction." - * - * This library currently only supports encryption when the same key is being used for both directions. This is - * because there's only one $crypto object. Two could be added ($encrypt and $decrypt, perhaps). - */ -define('NET_SSH1_CIPHER_RC4', 5); -/** - * Blowfish - * - * Not supported nor is it defined in the official SSH1 specs. OpenSSH, however, defines it (see cipher.h) and - * uses it (see cipher.c) - */ -define('NET_SSH1_CIPHER_BLOWFISH', 6); -/**#@-*/ - -/**#@+ - * Authentication Methods - * - * @see Net_SSH1::getSupportedAuthentications() - * @access public - */ -/** - * .rhosts or /etc/hosts.equiv - */ -define('NET_SSH1_AUTH_RHOSTS', 1); -/** - * pure RSA authentication - */ -define('NET_SSH1_AUTH_RSA', 2); -/** - * password authentication - * - * This is the only method that is supported by this library. - */ -define('NET_SSH1_AUTH_PASSWORD', 3); -/** - * .rhosts with RSA host authentication - */ -define('NET_SSH1_AUTH_RHOSTS_RSA', 4); -/**#@-*/ - -/**#@+ - * Terminal Modes - * - * @link http://3sp.com/content/developer/maverick-net/docs/Maverick.SSH.PseudoTerminalModesMembers.html - * @access private - */ -define('NET_SSH1_TTY_OP_END', 0); -/**#@-*/ - -/** - * The Response Type - * - * @see Net_SSH1::_get_binary_packet() - * @access private - */ -define('NET_SSH1_RESPONSE_TYPE', 1); - -/** - * The Response Data - * - * @see Net_SSH1::_get_binary_packet() - * @access private - */ -define('NET_SSH1_RESPONSE_DATA', 2); - -/**#@+ - * Execution Bitmap Masks - * - * @see Net_SSH1::bitmap - * @access private - */ -define('NET_SSH1_MASK_CONSTRUCTOR', 0x00000001); -define('NET_SSH1_MASK_CONNECTED', 0x00000002); -define('NET_SSH1_MASK_LOGIN', 0x00000004); -define('NET_SSH1_MASK_SHELL', 0x00000008); -/**#@-*/ - -/**#@+ - * @access public - * @see Net_SSH1::getLog() - */ -/** - * Returns the message numbers - */ -define('NET_SSH1_LOG_SIMPLE', 1); -/** - * Returns the message content - */ -define('NET_SSH1_LOG_COMPLEX', 2); -/** - * Outputs the content real-time - */ -define('NET_SSH1_LOG_REALTIME', 3); -/** - * Dumps the content real-time to a file - */ -define('NET_SSH1_LOG_REALTIME_FILE', 4); -/**#@-*/ - -/**#@+ - * @access public - * @see Net_SSH1::read() - */ -/** - * Returns when a string matching $expect exactly is found - */ -define('NET_SSH1_READ_SIMPLE', 1); -/** - * Returns when a string matching the regular expression $expect is found - */ -define('NET_SSH1_READ_REGEX', 2); -/**#@-*/ - -/** - * Pure-PHP implementation of SSHv1. - * - * @package Net_SSH1 - * @author Jim Wigginton - * @access public - */ -class Net_SSH1 -{ - /** - * The SSH identifier - * - * @var String - * @access private - */ - var $identifier = 'SSH-1.5-phpseclib'; - - /** - * The Socket Object - * - * @var Object - * @access private - */ - var $fsock; - - /** - * The cryptography object - * - * @var Object - * @access private - */ - var $crypto = false; - - /** - * Execution Bitmap - * - * The bits that are set represent functions that have been called already. This is used to determine - * if a requisite function has been successfully executed. If not, an error should be thrown. - * - * @var Integer - * @access private - */ - var $bitmap = 0; - - /** - * The Server Key Public Exponent - * - * Logged for debug purposes - * - * @see Net_SSH1::getServerKeyPublicExponent() - * @var String - * @access private - */ - var $server_key_public_exponent; - - /** - * The Server Key Public Modulus - * - * Logged for debug purposes - * - * @see Net_SSH1::getServerKeyPublicModulus() - * @var String - * @access private - */ - var $server_key_public_modulus; - - /** - * The Host Key Public Exponent - * - * Logged for debug purposes - * - * @see Net_SSH1::getHostKeyPublicExponent() - * @var String - * @access private - */ - var $host_key_public_exponent; - - /** - * The Host Key Public Modulus - * - * Logged for debug purposes - * - * @see Net_SSH1::getHostKeyPublicModulus() - * @var String - * @access private - */ - var $host_key_public_modulus; - - /** - * Supported Ciphers - * - * Logged for debug purposes - * - * @see Net_SSH1::getSupportedCiphers() - * @var Array - * @access private - */ - var $supported_ciphers = array( - NET_SSH1_CIPHER_NONE => 'No encryption', - NET_SSH1_CIPHER_IDEA => 'IDEA in CFB mode', - NET_SSH1_CIPHER_DES => 'DES in CBC mode', - NET_SSH1_CIPHER_3DES => 'Triple-DES in CBC mode', - NET_SSH1_CIPHER_BROKEN_TSS => 'TRI\'s Simple Stream encryption CBC', - NET_SSH1_CIPHER_RC4 => 'RC4', - NET_SSH1_CIPHER_BLOWFISH => 'Blowfish' - ); - - /** - * Supported Authentications - * - * Logged for debug purposes - * - * @see Net_SSH1::getSupportedAuthentications() - * @var Array - * @access private - */ - var $supported_authentications = array( - NET_SSH1_AUTH_RHOSTS => '.rhosts or /etc/hosts.equiv', - NET_SSH1_AUTH_RSA => 'pure RSA authentication', - NET_SSH1_AUTH_PASSWORD => 'password authentication', - NET_SSH1_AUTH_RHOSTS_RSA => '.rhosts with RSA host authentication' - ); - - /** - * Server Identification - * - * @see Net_SSH1::getServerIdentification() - * @var String - * @access private - */ - var $server_identification = ''; - - /** - * Protocol Flags - * - * @see Net_SSH1::Net_SSH1() - * @var Array - * @access private - */ - var $protocol_flags = array(); - - /** - * Protocol Flag Log - * - * @see Net_SSH1::getLog() - * @var Array - * @access private - */ - var $protocol_flag_log = array(); - - /** - * Message Log - * - * @see Net_SSH1::getLog() - * @var Array - * @access private - */ - var $message_log = array(); - - /** - * Real-time log file pointer - * - * @see Net_SSH1::_append_log() - * @var Resource - * @access private - */ - var $realtime_log_file; - - /** - * Real-time log file size - * - * @see Net_SSH1::_append_log() - * @var Integer - * @access private - */ - var $realtime_log_size; - - /** - * Real-time log file wrap boolean - * - * @see Net_SSH1::_append_log() - * @var Boolean - * @access private - */ - var $realtime_log_wrap; - - /** - * Interactive Buffer - * - * @see Net_SSH1::read() - * @var Array - * @access private - */ - var $interactiveBuffer = ''; - - /** - * Timeout - * - * @see Net_SSH1::setTimeout() - * @access private - */ - var $timeout; - - /** - * Current Timeout - * - * @see Net_SSH1::_get_channel_packet() - * @access private - */ - var $curTimeout; - - /** - * Log Boundary - * - * @see Net_SSH1::_format_log - * @access private - */ - var $log_boundary = ':'; - - /** - * Log Long Width - * - * @see Net_SSH1::_format_log - * @access private - */ - var $log_long_width = 65; - - /** - * Log Short Width - * - * @see Net_SSH1::_format_log - * @access private - */ - var $log_short_width = 16; - - /** - * Hostname - * - * @see Net_SSH1::Net_SSH1() - * @see Net_SSH1::_connect() - * @var String - * @access private - */ - var $host; - - /** - * Port Number - * - * @see Net_SSH1::Net_SSH1() - * @see Net_SSH1::_connect() - * @var Integer - * @access private - */ - var $port; - - /** - * Timeout for initial connection - * - * Set by the constructor call. Calling setTimeout() is optional. If it's not called functions like - * exec() won't timeout unless some PHP setting forces it too. The timeout specified in the constructor, - * however, is non-optional. There will be a timeout, whether or not you set it. If you don't it'll be - * 10 seconds. It is used by fsockopen() in that function. - * - * @see Net_SSH1::Net_SSH1() - * @see Net_SSH1::_connect() - * @var Integer - * @access private - */ - var $connectionTimeout; - - /** - * Default cipher - * - * @see Net_SSH1::Net_SSH1() - * @see Net_SSH1::_connect() - * @var Integer - * @access private - */ - var $cipher; - - /** - * Default Constructor. - * - * Connects to an SSHv1 server - * - * @param String $host - * @param optional Integer $port - * @param optional Integer $timeout - * @param optional Integer $cipher - * @return Net_SSH1 - * @access public - */ - function Net_SSH1($host, $port = 22, $timeout = 10, $cipher = NET_SSH1_CIPHER_3DES) - { - if (!class_exists('Math_BigInteger')) { - include_once 'Math/BigInteger.php'; - } - - // Include Crypt_Random - // the class_exists() will only be called if the crypt_random_string function hasn't been defined and - // will trigger a call to __autoload() if you're wanting to auto-load classes - // call function_exists() a second time to stop the include_once from being called outside - // of the auto loader - if (!function_exists('crypt_random_string') && !class_exists('Crypt_Random') && !function_exists('crypt_random_string')) { - include_once 'Crypt/Random.php'; - } - - $this->protocol_flags = array( - 1 => 'NET_SSH1_MSG_DISCONNECT', - 2 => 'NET_SSH1_SMSG_PUBLIC_KEY', - 3 => 'NET_SSH1_CMSG_SESSION_KEY', - 4 => 'NET_SSH1_CMSG_USER', - 9 => 'NET_SSH1_CMSG_AUTH_PASSWORD', - 10 => 'NET_SSH1_CMSG_REQUEST_PTY', - 12 => 'NET_SSH1_CMSG_EXEC_SHELL', - 13 => 'NET_SSH1_CMSG_EXEC_CMD', - 14 => 'NET_SSH1_SMSG_SUCCESS', - 15 => 'NET_SSH1_SMSG_FAILURE', - 16 => 'NET_SSH1_CMSG_STDIN_DATA', - 17 => 'NET_SSH1_SMSG_STDOUT_DATA', - 18 => 'NET_SSH1_SMSG_STDERR_DATA', - 19 => 'NET_SSH1_CMSG_EOF', - 20 => 'NET_SSH1_SMSG_EXITSTATUS', - 33 => 'NET_SSH1_CMSG_EXIT_CONFIRMATION' - ); - - $this->_define_array($this->protocol_flags); - - $this->host = $host; - $this->port = $port; - $this->connectionTimeout = $timeout; - $this->cipher = $cipher; - } - - /** - * Connect to an SSHv1 server - * - * @return Boolean - * @access private - */ - function _connect() - { - $this->fsock = @fsockopen($this->host, $this->port, $errno, $errstr, $this->connectionTimeout); - if (!$this->fsock) { - user_error(rtrim("Cannot connect to {$this->host}:{$this->port}. Error $errno. $errstr")); - return false; - } - - $this->server_identification = $init_line = fgets($this->fsock, 255); - - if (defined('NET_SSH1_LOGGING')) { - $this->_append_log('<-', $this->server_identification); - $this->_append_log('->', $this->identifier . "\r\n"); - } - - if (!preg_match('#SSH-([0-9\.]+)-(.+)#', $init_line, $parts)) { - user_error('Can only connect to SSH servers'); - return false; - } - if ($parts[1][0] != 1) { - user_error("Cannot connect to SSH $parts[1] servers"); - return false; - } - - fputs($this->fsock, $this->identifier."\r\n"); - - $response = $this->_get_binary_packet(); - if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_PUBLIC_KEY) { - user_error('Expected SSH_SMSG_PUBLIC_KEY'); - return false; - } - - $anti_spoofing_cookie = $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 8); - - $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4); - - $temp = unpack('nlen', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 2)); - $server_key_public_exponent = new Math_BigInteger($this->_string_shift($response[NET_SSH1_RESPONSE_DATA], ceil($temp['len'] / 8)), 256); - $this->server_key_public_exponent = $server_key_public_exponent; - - $temp = unpack('nlen', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 2)); - $server_key_public_modulus = new Math_BigInteger($this->_string_shift($response[NET_SSH1_RESPONSE_DATA], ceil($temp['len'] / 8)), 256); - $this->server_key_public_modulus = $server_key_public_modulus; - - $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4); - - $temp = unpack('nlen', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 2)); - $host_key_public_exponent = new Math_BigInteger($this->_string_shift($response[NET_SSH1_RESPONSE_DATA], ceil($temp['len'] / 8)), 256); - $this->host_key_public_exponent = $host_key_public_exponent; - - $temp = unpack('nlen', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 2)); - $host_key_public_modulus = new Math_BigInteger($this->_string_shift($response[NET_SSH1_RESPONSE_DATA], ceil($temp['len'] / 8)), 256); - $this->host_key_public_modulus = $host_key_public_modulus; - - $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4); - - // get a list of the supported ciphers - extract(unpack('Nsupported_ciphers_mask', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4))); - foreach ($this->supported_ciphers as $mask=>$name) { - if (($supported_ciphers_mask & (1 << $mask)) == 0) { - unset($this->supported_ciphers[$mask]); - } - } - - // get a list of the supported authentications - extract(unpack('Nsupported_authentications_mask', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4))); - foreach ($this->supported_authentications as $mask=>$name) { - if (($supported_authentications_mask & (1 << $mask)) == 0) { - unset($this->supported_authentications[$mask]); - } - } - - $session_id = pack('H*', md5($host_key_public_modulus->toBytes() . $server_key_public_modulus->toBytes() . $anti_spoofing_cookie)); - - $session_key = crypt_random_string(32); - $double_encrypted_session_key = $session_key ^ str_pad($session_id, 32, chr(0)); - - if ($server_key_public_modulus->compare($host_key_public_modulus) < 0) { - $double_encrypted_session_key = $this->_rsa_crypt( - $double_encrypted_session_key, - array( - $server_key_public_exponent, - $server_key_public_modulus - ) - ); - $double_encrypted_session_key = $this->_rsa_crypt( - $double_encrypted_session_key, - array( - $host_key_public_exponent, - $host_key_public_modulus - ) - ); - } else { - $double_encrypted_session_key = $this->_rsa_crypt( - $double_encrypted_session_key, - array( - $host_key_public_exponent, - $host_key_public_modulus - ) - ); - $double_encrypted_session_key = $this->_rsa_crypt( - $double_encrypted_session_key, - array( - $server_key_public_exponent, - $server_key_public_modulus - ) - ); - } - - $cipher = isset($this->supported_ciphers[$this->cipher]) ? $this->cipher : NET_SSH1_CIPHER_3DES; - $data = pack('C2a*na*N', NET_SSH1_CMSG_SESSION_KEY, $cipher, $anti_spoofing_cookie, 8 * strlen($double_encrypted_session_key), $double_encrypted_session_key, 0); - - if (!$this->_send_binary_packet($data)) { - user_error('Error sending SSH_CMSG_SESSION_KEY'); - return false; - } - - switch ($cipher) { - //case NET_SSH1_CIPHER_NONE: - // $this->crypto = new Crypt_Null(); - // break; - case NET_SSH1_CIPHER_DES: - if (!class_exists('Crypt_DES')) { - include_once 'Crypt/DES.php'; - } - $this->crypto = new Crypt_DES(); - $this->crypto->disablePadding(); - $this->crypto->enableContinuousBuffer(); - $this->crypto->setKey(substr($session_key, 0, 8)); - break; - case NET_SSH1_CIPHER_3DES: - if (!class_exists('Crypt_TripleDES')) { - include_once 'Crypt/TripleDES.php'; - } - $this->crypto = new Crypt_TripleDES(CRYPT_DES_MODE_3CBC); - $this->crypto->disablePadding(); - $this->crypto->enableContinuousBuffer(); - $this->crypto->setKey(substr($session_key, 0, 24)); - break; - //case NET_SSH1_CIPHER_RC4: - // if (!class_exists('Crypt_RC4')) { - // include_once 'Crypt/RC4.php'; - // } - // $this->crypto = new Crypt_RC4(); - // $this->crypto->enableContinuousBuffer(); - // $this->crypto->setKey(substr($session_key, 0, 16)); - // break; - } - - $response = $this->_get_binary_packet(); - - if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_SUCCESS) { - user_error('Expected SSH_SMSG_SUCCESS'); - return false; - } - - $this->bitmap = NET_SSH1_MASK_CONNECTED; - - return true; - } - - /** - * Login - * - * @param String $username - * @param optional String $password - * @return Boolean - * @access public - */ - function login($username, $password = '') - { - if (!($this->bitmap & NET_SSH1_MASK_CONSTRUCTOR)) { - $this->bitmap |= NET_SSH1_MASK_CONSTRUCTOR; - if (!$this->_connect()) { - return false; - } - } - - if (!($this->bitmap & NET_SSH1_MASK_CONNECTED)) { - return false; - } - - $data = pack('CNa*', NET_SSH1_CMSG_USER, strlen($username), $username); - - if (!$this->_send_binary_packet($data)) { - user_error('Error sending SSH_CMSG_USER'); - return false; - } - - $response = $this->_get_binary_packet(); - - if ($response === true) { - return false; - } - if ($response[NET_SSH1_RESPONSE_TYPE] == NET_SSH1_SMSG_SUCCESS) { - $this->bitmap |= NET_SSH1_MASK_LOGIN; - return true; - } else if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_FAILURE) { - user_error('Expected SSH_SMSG_SUCCESS or SSH_SMSG_FAILURE'); - return false; - } - - $data = pack('CNa*', NET_SSH1_CMSG_AUTH_PASSWORD, strlen($password), $password); - - if (!$this->_send_binary_packet($data)) { - user_error('Error sending SSH_CMSG_AUTH_PASSWORD'); - return false; - } - - // remove the username and password from the last logged packet - if (defined('NET_SSH1_LOGGING') && NET_SSH1_LOGGING == NET_SSH1_LOG_COMPLEX) { - $data = pack('CNa*', NET_SSH1_CMSG_AUTH_PASSWORD, strlen('password'), 'password'); - $this->message_log[count($this->message_log) - 1] = $data; - } - - $response = $this->_get_binary_packet(); - - if ($response === true) { - return false; - } - if ($response[NET_SSH1_RESPONSE_TYPE] == NET_SSH1_SMSG_SUCCESS) { - $this->bitmap |= NET_SSH1_MASK_LOGIN; - return true; - } else if ($response[NET_SSH1_RESPONSE_TYPE] == NET_SSH1_SMSG_FAILURE) { - return false; - } else { - user_error('Expected SSH_SMSG_SUCCESS or SSH_SMSG_FAILURE'); - return false; - } - } - - /** - * Set Timeout - * - * $ssh->exec('ping 127.0.0.1'); on a Linux host will never return and will run indefinitely. setTimeout() makes it so it'll timeout. - * Setting $timeout to false or 0 will mean there is no timeout. - * - * @param Mixed $timeout - */ - function setTimeout($timeout) - { - $this->timeout = $this->curTimeout = $timeout; - } - - /** - * Executes a command on a non-interactive shell, returns the output, and quits. - * - * An SSH1 server will close the connection after a command has been executed on a non-interactive shell. SSH2 - * servers don't, however, this isn't an SSH2 client. The way this works, on the server, is by initiating a - * shell with the -s option, as discussed in the following links: - * - * {@link http://www.faqs.org/docs/bashman/bashref_65.html http://www.faqs.org/docs/bashman/bashref_65.html} - * {@link http://www.faqs.org/docs/bashman/bashref_62.html http://www.faqs.org/docs/bashman/bashref_62.html} - * - * To execute further commands, a new Net_SSH1 object will need to be created. - * - * Returns false on failure and the output, otherwise. - * - * @see Net_SSH1::interactiveRead() - * @see Net_SSH1::interactiveWrite() - * @param String $cmd - * @return mixed - * @access public - */ - function exec($cmd, $block = true) - { - if (!($this->bitmap & NET_SSH1_MASK_LOGIN)) { - user_error('Operation disallowed prior to login()'); - return false; - } - - $data = pack('CNa*', NET_SSH1_CMSG_EXEC_CMD, strlen($cmd), $cmd); - - if (!$this->_send_binary_packet($data)) { - user_error('Error sending SSH_CMSG_EXEC_CMD'); - return false; - } - - if (!$block) { - return true; - } - - $output = ''; - $response = $this->_get_binary_packet(); - - if ($response !== false) { - do { - $output.= substr($response[NET_SSH1_RESPONSE_DATA], 4); - $response = $this->_get_binary_packet(); - } while (is_array($response) && $response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_EXITSTATUS); - } - - $data = pack('C', NET_SSH1_CMSG_EXIT_CONFIRMATION); - - // i don't think it's really all that important if this packet gets sent or not. - $this->_send_binary_packet($data); - - fclose($this->fsock); - - // reset the execution bitmap - a new Net_SSH1 object needs to be created. - $this->bitmap = 0; - - return $output; - } - - /** - * Creates an interactive shell - * - * @see Net_SSH1::interactiveRead() - * @see Net_SSH1::interactiveWrite() - * @return Boolean - * @access private - */ - function _initShell() - { - // connect using the sample parameters in protocol-1.5.txt. - // according to wikipedia.org's entry on text terminals, "the fundamental type of application running on a text - // terminal is a command line interpreter or shell". thus, opening a terminal session to run the shell. - $data = pack('CNa*N4C', NET_SSH1_CMSG_REQUEST_PTY, strlen('vt100'), 'vt100', 24, 80, 0, 0, NET_SSH1_TTY_OP_END); - - if (!$this->_send_binary_packet($data)) { - user_error('Error sending SSH_CMSG_REQUEST_PTY'); - return false; - } - - $response = $this->_get_binary_packet(); - - if ($response === true) { - return false; - } - if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_SUCCESS) { - user_error('Expected SSH_SMSG_SUCCESS'); - return false; - } - - $data = pack('C', NET_SSH1_CMSG_EXEC_SHELL); - - if (!$this->_send_binary_packet($data)) { - user_error('Error sending SSH_CMSG_EXEC_SHELL'); - return false; - } - - $this->bitmap |= NET_SSH1_MASK_SHELL; - - //stream_set_blocking($this->fsock, 0); - - return true; - } - - /** - * Inputs a command into an interactive shell. - * - * @see Net_SSH1::interactiveWrite() - * @param String $cmd - * @return Boolean - * @access public - */ - function write($cmd) - { - return $this->interactiveWrite($cmd); - } - - /** - * Returns the output of an interactive shell when there's a match for $expect - * - * $expect can take the form of a string literal or, if $mode == NET_SSH1_READ_REGEX, - * a regular expression. - * - * @see Net_SSH1::write() - * @param String $expect - * @param Integer $mode - * @return Boolean - * @access public - */ - function read($expect, $mode = NET_SSH1_READ_SIMPLE) - { - if (!($this->bitmap & NET_SSH1_MASK_LOGIN)) { - user_error('Operation disallowed prior to login()'); - return false; - } - - if (!($this->bitmap & NET_SSH1_MASK_SHELL) && !$this->_initShell()) { - user_error('Unable to initiate an interactive shell session'); - return false; - } - - $match = $expect; - while (true) { - if ($mode == NET_SSH1_READ_REGEX) { - preg_match($expect, $this->interactiveBuffer, $matches); - $match = isset($matches[0]) ? $matches[0] : ''; - } - $pos = strlen($match) ? strpos($this->interactiveBuffer, $match) : false; - if ($pos !== false) { - return $this->_string_shift($this->interactiveBuffer, $pos + strlen($match)); - } - $response = $this->_get_binary_packet(); - - if ($response === true) { - return $this->_string_shift($this->interactiveBuffer, strlen($this->interactiveBuffer)); - } - $this->interactiveBuffer.= substr($response[NET_SSH1_RESPONSE_DATA], 4); - } - } - - /** - * Inputs a command into an interactive shell. - * - * @see Net_SSH1::interactiveRead() - * @param String $cmd - * @return Boolean - * @access public - */ - function interactiveWrite($cmd) - { - if (!($this->bitmap & NET_SSH1_MASK_LOGIN)) { - user_error('Operation disallowed prior to login()'); - return false; - } - - if (!($this->bitmap & NET_SSH1_MASK_SHELL) && !$this->_initShell()) { - user_error('Unable to initiate an interactive shell session'); - return false; - } - - $data = pack('CNa*', NET_SSH1_CMSG_STDIN_DATA, strlen($cmd), $cmd); - - if (!$this->_send_binary_packet($data)) { - user_error('Error sending SSH_CMSG_STDIN'); - return false; - } - - return true; - } - - /** - * Returns the output of an interactive shell when no more output is available. - * - * Requires PHP 4.3.0 or later due to the use of the stream_select() function. If you see stuff like - * "^[[00m", you're seeing ANSI escape codes. According to - * {@link http://support.microsoft.com/kb/101875 How to Enable ANSI.SYS in a Command Window}, "Windows NT - * does not support ANSI escape sequences in Win32 Console applications", so if you're a Windows user, - * there's not going to be much recourse. - * - * @see Net_SSH1::interactiveRead() - * @return String - * @access public - */ - function interactiveRead() - { - if (!($this->bitmap & NET_SSH1_MASK_LOGIN)) { - user_error('Operation disallowed prior to login()'); - return false; - } - - if (!($this->bitmap & NET_SSH1_MASK_SHELL) && !$this->_initShell()) { - user_error('Unable to initiate an interactive shell session'); - return false; - } - - $read = array($this->fsock); - $write = $except = null; - if (stream_select($read, $write, $except, 0)) { - $response = $this->_get_binary_packet(); - return substr($response[NET_SSH1_RESPONSE_DATA], 4); - } else { - return ''; - } - } - - /** - * Disconnect - * - * @access public - */ - function disconnect() - { - $this->_disconnect(); - } - - /** - * Destructor. - * - * Will be called, automatically, if you're supporting just PHP5. If you're supporting PHP4, you'll need to call - * disconnect(). - * - * @access public - */ - function __destruct() - { - $this->_disconnect(); - } - - /** - * Disconnect - * - * @param String $msg - * @access private - */ - function _disconnect($msg = 'Client Quit') - { - if ($this->bitmap) { - $data = pack('C', NET_SSH1_CMSG_EOF); - $this->_send_binary_packet($data); - /* - $response = $this->_get_binary_packet(); - if ($response === true) { - $response = array(NET_SSH1_RESPONSE_TYPE => -1); - } - switch ($response[NET_SSH1_RESPONSE_TYPE]) { - case NET_SSH1_SMSG_EXITSTATUS: - $data = pack('C', NET_SSH1_CMSG_EXIT_CONFIRMATION); - break; - default: - $data = pack('CNa*', NET_SSH1_MSG_DISCONNECT, strlen($msg), $msg); - } - */ - $data = pack('CNa*', NET_SSH1_MSG_DISCONNECT, strlen($msg), $msg); - - $this->_send_binary_packet($data); - fclose($this->fsock); - $this->bitmap = 0; - } - } - - /** - * Gets Binary Packets - * - * See 'The Binary Packet Protocol' of protocol-1.5.txt for more info. - * - * Also, this function could be improved upon by adding detection for the following exploit: - * http://www.securiteam.com/securitynews/5LP042K3FY.html - * - * @see Net_SSH1::_send_binary_packet() - * @return Array - * @access private - */ - function _get_binary_packet() - { - if (feof($this->fsock)) { - //user_error('connection closed prematurely'); - return false; - } - - if ($this->curTimeout) { - $read = array($this->fsock); - $write = $except = null; - - $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 - $sec = floor($this->curTimeout); - $usec = 1000000 * ($this->curTimeout - $sec); - // on windows this returns a "Warning: Invalid CRT parameters detected" error - if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) { - //$this->_disconnect('Timeout'); - return true; - } - $elapsed = strtok(microtime(), ' ') + strtok('') - $start; - $this->curTimeout-= $elapsed; - } - - $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 - $temp = unpack('Nlength', fread($this->fsock, 4)); - - $padding_length = 8 - ($temp['length'] & 7); - $length = $temp['length'] + $padding_length; - $raw = ''; - - while ($length > 0) { - $temp = fread($this->fsock, $length); - $raw.= $temp; - $length-= strlen($temp); - } - $stop = strtok(microtime(), ' ') + strtok(''); - - if (strlen($raw) && $this->crypto !== false) { - $raw = $this->crypto->decrypt($raw); - } - - $padding = substr($raw, 0, $padding_length); - $type = $raw[$padding_length]; - $data = substr($raw, $padding_length + 1, -4); - - $temp = unpack('Ncrc', substr($raw, -4)); - - //if ( $temp['crc'] != $this->_crc($padding . $type . $data) ) { - // user_error('Bad CRC in packet from server'); - // return false; - //} - - $type = ord($type); - - if (defined('NET_SSH1_LOGGING')) { - $temp = isset($this->protocol_flags[$type]) ? $this->protocol_flags[$type] : 'UNKNOWN'; - $temp = '<- ' . $temp . - ' (' . round($stop - $start, 4) . 's)'; - $this->_append_log($temp, $data); - } - - return array( - NET_SSH1_RESPONSE_TYPE => $type, - NET_SSH1_RESPONSE_DATA => $data - ); - } - - /** - * Sends Binary Packets - * - * Returns true on success, false on failure. - * - * @see Net_SSH1::_get_binary_packet() - * @param String $data - * @return Boolean - * @access private - */ - function _send_binary_packet($data) - { - if (feof($this->fsock)) { - //user_error('connection closed prematurely'); - return false; - } - - $length = strlen($data) + 4; - - $padding = crypt_random_string(8 - ($length & 7)); - - $orig = $data; - $data = $padding . $data; - $data.= pack('N', $this->_crc($data)); - - if ($this->crypto !== false) { - $data = $this->crypto->encrypt($data); - } - - $packet = pack('Na*', $length, $data); - - $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 - $result = strlen($packet) == fputs($this->fsock, $packet); - $stop = strtok(microtime(), ' ') + strtok(''); - - if (defined('NET_SSH1_LOGGING')) { - $temp = isset($this->protocol_flags[ord($orig[0])]) ? $this->protocol_flags[ord($orig[0])] : 'UNKNOWN'; - $temp = '-> ' . $temp . - ' (' . round($stop - $start, 4) . 's)'; - $this->_append_log($temp, $orig); - } - - return $result; - } - - /** - * Cyclic Redundancy Check (CRC) - * - * PHP's crc32 function is implemented slightly differently than the one that SSH v1 uses, so - * we've reimplemented it. A more detailed discussion of the differences can be found after - * $crc_lookup_table's initialization. - * - * @see Net_SSH1::_get_binary_packet() - * @see Net_SSH1::_send_binary_packet() - * @param String $data - * @return Integer - * @access private - */ - function _crc($data) - { - static $crc_lookup_table = array( - 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, - 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, - 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, - 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, - 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, - 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, - 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, - 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, - 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, - 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, - 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, - 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, - 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, - 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, - 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, - 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, - 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, - 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, - 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, - 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, - 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, - 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, - 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, - 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, - 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, - 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, - 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, - 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, - 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, - 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, - 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, - 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, - 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, - 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, - 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, - 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, - 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, - 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, - 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, - 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, - 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, - 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, - 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, - 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, - 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, - 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, - 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, - 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, - 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, - 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, - 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, - 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, - 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, - 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, - 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, - 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, - 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, - 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, - 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, - 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, - 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, - 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, - 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, - 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D - ); - - // For this function to yield the same output as PHP's crc32 function, $crc would have to be - // set to 0xFFFFFFFF, initially - not 0x00000000 as it currently is. - $crc = 0x00000000; - $length = strlen($data); - - for ($i=0;$i<$length;$i++) { - // We AND $crc >> 8 with 0x00FFFFFF because we want the eight newly added bits to all - // be zero. PHP, unfortunately, doesn't always do this. 0x80000000 >> 8, as an example, - // yields 0xFF800000 - not 0x00800000. The following link elaborates: - // http://www.php.net/manual/en/language.operators.bitwise.php#57281 - $crc = (($crc >> 8) & 0x00FFFFFF) ^ $crc_lookup_table[($crc & 0xFF) ^ ord($data[$i])]; - } - - // In addition to having to set $crc to 0xFFFFFFFF, initially, the return value must be XOR'd with - // 0xFFFFFFFF for this function to return the same thing that PHP's crc32 function would. - return $crc; - } - - /** - * String Shift - * - * Inspired by array_shift - * - * @param String $string - * @param optional Integer $index - * @return String - * @access private - */ - function _string_shift(&$string, $index = 1) - { - $substr = substr($string, 0, $index); - $string = substr($string, $index); - return $substr; - } - - /** - * RSA Encrypt - * - * Returns mod(pow($m, $e), $n), where $n should be the product of two (large) primes $p and $q and where $e - * should be a number with the property that gcd($e, ($p - 1) * ($q - 1)) == 1. Could just make anything that - * calls this call modexp, instead, but I think this makes things clearer, maybe... - * - * @see Net_SSH1::Net_SSH1() - * @param Math_BigInteger $m - * @param Array $key - * @return Math_BigInteger - * @access private - */ - function _rsa_crypt($m, $key) - { - /* - if (!class_exists('Crypt_RSA')) { - include_once 'Crypt/RSA.php'; - } - - $rsa = new Crypt_RSA(); - $rsa->loadKey($key, CRYPT_RSA_PUBLIC_FORMAT_RAW); - $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); - return $rsa->encrypt($m); - */ - - // To quote from protocol-1.5.txt: - // The most significant byte (which is only partial as the value must be - // less than the public modulus, which is never a power of two) is zero. - // - // The next byte contains the value 2 (which stands for public-key - // encrypted data in the PKCS standard [PKCS#1]). Then, there are non- - // zero random bytes to fill any unused space, a zero byte, and the data - // to be encrypted in the least significant bytes, the last byte of the - // data in the least significant byte. - - // Presumably the part of PKCS#1 they're refering to is "Section 7.2.1 Encryption Operation", - // under "7.2 RSAES-PKCS1-v1.5" and "7 Encryption schemes" of the following URL: - // ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1.pdf - $modulus = $key[1]->toBytes(); - $length = strlen($modulus) - strlen($m) - 3; - $random = ''; - while (strlen($random) != $length) { - $block = crypt_random_string($length - strlen($random)); - $block = str_replace("\x00", '', $block); - $random.= $block; - } - $temp = chr(0) . chr(2) . $random . chr(0) . $m; - - $m = new Math_BigInteger($temp, 256); - $m = $m->modPow($key[0], $key[1]); - - return $m->toBytes(); - } - - /** - * Define Array - * - * Takes any number of arrays whose indices are integers and whose values are strings and defines a bunch of - * named constants from it, using the value as the name of the constant and the index as the value of the constant. - * If any of the constants that would be defined already exists, none of the constants will be defined. - * - * @param Array $array - * @access private - */ - function _define_array() - { - $args = func_get_args(); - foreach ($args as $arg) { - foreach ($arg as $key=>$value) { - if (!defined($value)) { - define($value, $key); - } else { - break 2; - } - } - } - } - - /** - * Returns a log of the packets that have been sent and received. - * - * Returns a string if NET_SSH1_LOGGING == NET_SSH1_LOG_COMPLEX, an array if NET_SSH1_LOGGING == NET_SSH1_LOG_SIMPLE and false if !defined('NET_SSH1_LOGGING') - * - * @access public - * @return String or Array - */ - function getLog() - { - if (!defined('NET_SSH1_LOGGING')) { - return false; - } - - switch (NET_SSH1_LOGGING) { - case NET_SSH1_LOG_SIMPLE: - return $this->message_number_log; - break; - case NET_SSH1_LOG_COMPLEX: - return $this->_format_log($this->message_log, $this->protocol_flags_log); - break; - default: - return false; - } - } - - /** - * Formats a log for printing - * - * @param Array $message_log - * @param Array $message_number_log - * @access private - * @return String - */ - function _format_log($message_log, $message_number_log) - { - $output = ''; - for ($i = 0; $i < count($message_log); $i++) { - $output.= $message_number_log[$i] . "\r\n"; - $current_log = $message_log[$i]; - $j = 0; - do { - if (strlen($current_log)) { - $output.= str_pad(dechex($j), 7, '0', STR_PAD_LEFT) . '0 '; - } - $fragment = $this->_string_shift($current_log, $this->log_short_width); - $hex = substr(preg_replace_callback('#.#s', array($this, '_format_log_helper'), $fragment), strlen($this->log_boundary)); - // replace non ASCII printable characters with dots - // http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters - // also replace < with a . since < messes up the output on web browsers - $raw = preg_replace('#[^\x20-\x7E]|<#', '.', $fragment); - $output.= str_pad($hex, $this->log_long_width - $this->log_short_width, ' ') . $raw . "\r\n"; - $j++; - } while (strlen($current_log)); - $output.= "\r\n"; - } - - return $output; - } - - /** - * Helper function for _format_log - * - * For use with preg_replace_callback() - * - * @param Array $matches - * @access private - * @return String - */ - function _format_log_helper($matches) - { - return $this->log_boundary . str_pad(dechex(ord($matches[0])), 2, '0', STR_PAD_LEFT); - } - - /** - * Return the server key public exponent - * - * Returns, by default, the base-10 representation. If $raw_output is set to true, returns, instead, - * the raw bytes. This behavior is similar to PHP's md5() function. - * - * @param optional Boolean $raw_output - * @return String - * @access public - */ - function getServerKeyPublicExponent($raw_output = false) - { - return $raw_output ? $this->server_key_public_exponent->toBytes() : $this->server_key_public_exponent->toString(); - } - - /** - * Return the server key public modulus - * - * Returns, by default, the base-10 representation. If $raw_output is set to true, returns, instead, - * the raw bytes. This behavior is similar to PHP's md5() function. - * - * @param optional Boolean $raw_output - * @return String - * @access public - */ - function getServerKeyPublicModulus($raw_output = false) - { - return $raw_output ? $this->server_key_public_modulus->toBytes() : $this->server_key_public_modulus->toString(); - } - - /** - * Return the host key public exponent - * - * Returns, by default, the base-10 representation. If $raw_output is set to true, returns, instead, - * the raw bytes. This behavior is similar to PHP's md5() function. - * - * @param optional Boolean $raw_output - * @return String - * @access public - */ - function getHostKeyPublicExponent($raw_output = false) - { - return $raw_output ? $this->host_key_public_exponent->toBytes() : $this->host_key_public_exponent->toString(); - } - - /** - * Return the host key public modulus - * - * Returns, by default, the base-10 representation. If $raw_output is set to true, returns, instead, - * the raw bytes. This behavior is similar to PHP's md5() function. - * - * @param optional Boolean $raw_output - * @return String - * @access public - */ - function getHostKeyPublicModulus($raw_output = false) - { - return $raw_output ? $this->host_key_public_modulus->toBytes() : $this->host_key_public_modulus->toString(); - } - - /** - * Return a list of ciphers supported by SSH1 server. - * - * Just because a cipher is supported by an SSH1 server doesn't mean it's supported by this library. If $raw_output - * is set to true, returns, instead, an array of constants. ie. instead of array('Triple-DES in CBC mode'), you'll - * get array(NET_SSH1_CIPHER_3DES). - * - * @param optional Boolean $raw_output - * @return Array - * @access public - */ - function getSupportedCiphers($raw_output = false) - { - return $raw_output ? array_keys($this->supported_ciphers) : array_values($this->supported_ciphers); - } - - /** - * Return a list of authentications supported by SSH1 server. - * - * Just because a cipher is supported by an SSH1 server doesn't mean it's supported by this library. If $raw_output - * is set to true, returns, instead, an array of constants. ie. instead of array('password authentication'), you'll - * get array(NET_SSH1_AUTH_PASSWORD). - * - * @param optional Boolean $raw_output - * @return Array - * @access public - */ - function getSupportedAuthentications($raw_output = false) - { - return $raw_output ? array_keys($this->supported_authentications) : array_values($this->supported_authentications); - } - - /** - * Return the server identification. - * - * @return String - * @access public - */ - function getServerIdentification() - { - return rtrim($this->server_identification); - } - - /** - * Logs data packets - * - * Makes sure that only the last 1MB worth of packets will be logged - * - * @param String $data - * @access private - */ - function _append_log($protocol_flags, $message) - { - switch (NET_SSH1_LOGGING) { - // useful for benchmarks - case NET_SSH1_LOG_SIMPLE: - $this->protocol_flags_log[] = $protocol_flags; - break; - // the most useful log for SSH1 - case NET_SSH1_LOG_COMPLEX: - $this->protocol_flags_log[] = $protocol_flags; - $this->_string_shift($message); - $this->log_size+= strlen($message); - $this->message_log[] = $message; - while ($this->log_size > NET_SSH1_LOG_MAX_SIZE) { - $this->log_size-= strlen(array_shift($this->message_log)); - array_shift($this->protocol_flags_log); - } - break; - // dump the output out realtime; packets may be interspersed with non packets, - // passwords won't be filtered out and select other packets may not be correctly - // identified - case NET_SSH1_LOG_REALTIME: - echo "
\r\n" . $this->_format_log(array($message), array($protocol_flags)) . "\r\n
\r\n"; - @flush(); - @ob_flush(); - break; - // basically the same thing as NET_SSH1_LOG_REALTIME with the caveat that NET_SSH1_LOG_REALTIME_FILE - // needs to be defined and that the resultant log file will be capped out at NET_SSH1_LOG_MAX_SIZE. - // the earliest part of the log file is denoted by the first <<< START >>> and is not going to necessarily - // at the beginning of the file - case NET_SSH1_LOG_REALTIME_FILE: - if (!isset($this->realtime_log_file)) { - // PHP doesn't seem to like using constants in fopen() - $filename = NET_SSH1_LOG_REALTIME_FILE; - $fp = fopen($filename, 'w'); - $this->realtime_log_file = $fp; - } - if (!is_resource($this->realtime_log_file)) { - break; - } - $entry = $this->_format_log(array($message), array($protocol_flags)); - if ($this->realtime_log_wrap) { - $temp = "<<< START >>>\r\n"; - $entry.= $temp; - fseek($this->realtime_log_file, ftell($this->realtime_log_file) - strlen($temp)); - } - $this->realtime_log_size+= strlen($entry); - if ($this->realtime_log_size > NET_SSH1_LOG_MAX_SIZE) { - fseek($this->realtime_log_file, 0); - $this->realtime_log_size = strlen($entry); - $this->realtime_log_wrap = true; - } - fputs($this->realtime_log_file, $entry); - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SSH2.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SSH2.php deleted file mode 100755 index d6134562..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/Net/SSH2.php +++ /dev/null @@ -1,3878 +0,0 @@ - - * login('username', 'password')) { - * exit('Login Failed'); - * } - * - * echo $ssh->exec('pwd'); - * echo $ssh->exec('ls -la'); - * ?> - * - * - * - * setPassword('whatever'); - * $key->loadKey(file_get_contents('privatekey')); - * - * $ssh = new Net_SSH2('www.domain.tld'); - * if (!$ssh->login('username', $key)) { - * exit('Login Failed'); - * } - * - * echo $ssh->read('username@username:~$'); - * $ssh->write("ls -la\n"); - * echo $ssh->read('username@username:~$'); - * ?> - * - * - * LICENSE: 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. - * - * @category Net - * @package Net_SSH2 - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/**#@+ - * Execution Bitmap Masks - * - * @see Net_SSH2::bitmap - * @access private - */ -define('NET_SSH2_MASK_CONSTRUCTOR', 0x00000001); -define('NET_SSH2_MASK_CONNECTED', 0x00000002); -define('NET_SSH2_MASK_LOGIN_REQ', 0x00000004); -define('NET_SSH2_MASK_LOGIN', 0x00000008); -define('NET_SSH2_MASK_SHELL', 0x00000010); -define('NET_SSH2_MASK_WINDOW_ADJUST', 0x00000020); -/**#@-*/ - -/**#@+ - * Channel constants - * - * RFC4254 refers not to client and server channels but rather to sender and recipient channels. we don't refer - * to them in that way because RFC4254 toggles the meaning. the client sends a SSH_MSG_CHANNEL_OPEN message with - * a sender channel and the server sends a SSH_MSG_CHANNEL_OPEN_CONFIRMATION in response, with a sender and a - * recepient channel. at first glance, you might conclude that SSH_MSG_CHANNEL_OPEN_CONFIRMATION's sender channel - * would be the same thing as SSH_MSG_CHANNEL_OPEN's sender channel, but it's not, per this snipet: - * The 'recipient channel' is the channel number given in the original - * open request, and 'sender channel' is the channel number allocated by - * the other side. - * - * @see Net_SSH2::_send_channel_packet() - * @see Net_SSH2::_get_channel_packet() - * @access private - */ -define('NET_SSH2_CHANNEL_EXEC', 0); // PuTTy uses 0x100 -define('NET_SSH2_CHANNEL_SHELL', 1); -define('NET_SSH2_CHANNEL_SUBSYSTEM', 2); -/**#@-*/ - -/**#@+ - * @access public - * @see Net_SSH2::getLog() - */ -/** - * Returns the message numbers - */ -define('NET_SSH2_LOG_SIMPLE', 1); -/** - * Returns the message content - */ -define('NET_SSH2_LOG_COMPLEX', 2); -/** - * Outputs the content real-time - */ -define('NET_SSH2_LOG_REALTIME', 3); -/** - * Dumps the content real-time to a file - */ -define('NET_SSH2_LOG_REALTIME_FILE', 4); -/**#@-*/ - -/**#@+ - * @access public - * @see Net_SSH2::read() - */ -/** - * Returns when a string matching $expect exactly is found - */ -define('NET_SSH2_READ_SIMPLE', 1); -/** - * Returns when a string matching the regular expression $expect is found - */ -define('NET_SSH2_READ_REGEX', 2); -/** - * Make sure that the log never gets larger than this - */ -define('NET_SSH2_LOG_MAX_SIZE', 1024 * 1024); -/**#@-*/ - -/** - * Pure-PHP implementation of SSHv2. - * - * @package Net_SSH2 - * @author Jim Wigginton - * @access public - */ -class Net_SSH2 -{ - /** - * The SSH identifier - * - * @var String - * @access private - */ - var $identifier; - - /** - * The Socket Object - * - * @var Object - * @access private - */ - var $fsock; - - /** - * Execution Bitmap - * - * The bits that are set represent functions that have been called already. This is used to determine - * if a requisite function has been successfully executed. If not, an error should be thrown. - * - * @var Integer - * @access private - */ - var $bitmap = 0; - - /** - * Error information - * - * @see Net_SSH2::getErrors() - * @see Net_SSH2::getLastError() - * @var String - * @access private - */ - var $errors = array(); - - /** - * Server Identifier - * - * @see Net_SSH2::getServerIdentification() - * @var mixed false or Array - * @access private - */ - var $server_identifier = false; - - /** - * Key Exchange Algorithms - * - * @see Net_SSH2::getKexAlgorithims() - * @var mixed false or Array - * @access private - */ - var $kex_algorithms = false; - - /** - * Server Host Key Algorithms - * - * @see Net_SSH2::getServerHostKeyAlgorithms() - * @var mixed false or Array - * @access private - */ - var $server_host_key_algorithms = false; - - /** - * Encryption Algorithms: Client to Server - * - * @see Net_SSH2::getEncryptionAlgorithmsClient2Server() - * @var mixed false or Array - * @access private - */ - var $encryption_algorithms_client_to_server = false; - - /** - * Encryption Algorithms: Server to Client - * - * @see Net_SSH2::getEncryptionAlgorithmsServer2Client() - * @var mixed false or Array - * @access private - */ - var $encryption_algorithms_server_to_client = false; - - /** - * MAC Algorithms: Client to Server - * - * @see Net_SSH2::getMACAlgorithmsClient2Server() - * @var mixed false or Array - * @access private - */ - var $mac_algorithms_client_to_server = false; - - /** - * MAC Algorithms: Server to Client - * - * @see Net_SSH2::getMACAlgorithmsServer2Client() - * @var mixed false or Array - * @access private - */ - var $mac_algorithms_server_to_client = false; - - /** - * Compression Algorithms: Client to Server - * - * @see Net_SSH2::getCompressionAlgorithmsClient2Server() - * @var mixed false or Array - * @access private - */ - var $compression_algorithms_client_to_server = false; - - /** - * Compression Algorithms: Server to Client - * - * @see Net_SSH2::getCompressionAlgorithmsServer2Client() - * @var mixed false or Array - * @access private - */ - var $compression_algorithms_server_to_client = false; - - /** - * Languages: Server to Client - * - * @see Net_SSH2::getLanguagesServer2Client() - * @var mixed false or Array - * @access private - */ - var $languages_server_to_client = false; - - /** - * Languages: Client to Server - * - * @see Net_SSH2::getLanguagesClient2Server() - * @var mixed false or Array - * @access private - */ - var $languages_client_to_server = false; - - /** - * Block Size for Server to Client Encryption - * - * "Note that the length of the concatenation of 'packet_length', - * 'padding_length', 'payload', and 'random padding' MUST be a multiple - * of the cipher block size or 8, whichever is larger. This constraint - * MUST be enforced, even when using stream ciphers." - * - * -- http://tools.ietf.org/html/rfc4253#section-6 - * - * @see Net_SSH2::Net_SSH2() - * @see Net_SSH2::_send_binary_packet() - * @var Integer - * @access private - */ - var $encrypt_block_size = 8; - - /** - * Block Size for Client to Server Encryption - * - * @see Net_SSH2::Net_SSH2() - * @see Net_SSH2::_get_binary_packet() - * @var Integer - * @access private - */ - var $decrypt_block_size = 8; - - /** - * Server to Client Encryption Object - * - * @see Net_SSH2::_get_binary_packet() - * @var Object - * @access private - */ - var $decrypt = false; - - /** - * Client to Server Encryption Object - * - * @see Net_SSH2::_send_binary_packet() - * @var Object - * @access private - */ - var $encrypt = false; - - /** - * Client to Server HMAC Object - * - * @see Net_SSH2::_send_binary_packet() - * @var Object - * @access private - */ - var $hmac_create = false; - - /** - * Server to Client HMAC Object - * - * @see Net_SSH2::_get_binary_packet() - * @var Object - * @access private - */ - var $hmac_check = false; - - /** - * Size of server to client HMAC - * - * We need to know how big the HMAC will be for the server to client direction so that we know how many bytes to read. - * For the client to server side, the HMAC object will make the HMAC as long as it needs to be. All we need to do is - * append it. - * - * @see Net_SSH2::_get_binary_packet() - * @var Integer - * @access private - */ - var $hmac_size = false; - - /** - * Server Public Host Key - * - * @see Net_SSH2::getServerPublicHostKey() - * @var String - * @access private - */ - var $server_public_host_key; - - /** - * Session identifer - * - * "The exchange hash H from the first key exchange is additionally - * used as the session identifier, which is a unique identifier for - * this connection." - * - * -- http://tools.ietf.org/html/rfc4253#section-7.2 - * - * @see Net_SSH2::_key_exchange() - * @var String - * @access private - */ - var $session_id = false; - - /** - * Exchange hash - * - * The current exchange hash - * - * @see Net_SSH2::_key_exchange() - * @var String - * @access private - */ - var $exchange_hash = false; - - /** - * Message Numbers - * - * @see Net_SSH2::Net_SSH2() - * @var Array - * @access private - */ - var $message_numbers = array(); - - /** - * Disconnection Message 'reason codes' defined in RFC4253 - * - * @see Net_SSH2::Net_SSH2() - * @var Array - * @access private - */ - var $disconnect_reasons = array(); - - /** - * SSH_MSG_CHANNEL_OPEN_FAILURE 'reason codes', defined in RFC4254 - * - * @see Net_SSH2::Net_SSH2() - * @var Array - * @access private - */ - var $channel_open_failure_reasons = array(); - - /** - * Terminal Modes - * - * @link http://tools.ietf.org/html/rfc4254#section-8 - * @see Net_SSH2::Net_SSH2() - * @var Array - * @access private - */ - var $terminal_modes = array(); - - /** - * SSH_MSG_CHANNEL_EXTENDED_DATA's data_type_codes - * - * @link http://tools.ietf.org/html/rfc4254#section-5.2 - * @see Net_SSH2::Net_SSH2() - * @var Array - * @access private - */ - var $channel_extended_data_type_codes = array(); - - /** - * Send Sequence Number - * - * See 'Section 6.4. Data Integrity' of rfc4253 for more info. - * - * @see Net_SSH2::_send_binary_packet() - * @var Integer - * @access private - */ - var $send_seq_no = 0; - - /** - * Get Sequence Number - * - * See 'Section 6.4. Data Integrity' of rfc4253 for more info. - * - * @see Net_SSH2::_get_binary_packet() - * @var Integer - * @access private - */ - var $get_seq_no = 0; - - /** - * Server Channels - * - * Maps client channels to server channels - * - * @see Net_SSH2::_get_channel_packet() - * @see Net_SSH2::exec() - * @var Array - * @access private - */ - var $server_channels = array(); - - /** - * Channel Buffers - * - * If a client requests a packet from one channel but receives two packets from another those packets should - * be placed in a buffer - * - * @see Net_SSH2::_get_channel_packet() - * @see Net_SSH2::exec() - * @var Array - * @access private - */ - var $channel_buffers = array(); - - /** - * Channel Status - * - * Contains the type of the last sent message - * - * @see Net_SSH2::_get_channel_packet() - * @var Array - * @access private - */ - var $channel_status = array(); - - /** - * Packet Size - * - * Maximum packet size indexed by channel - * - * @see Net_SSH2::_send_channel_packet() - * @var Array - * @access private - */ - var $packet_size_client_to_server = array(); - - /** - * Message Number Log - * - * @see Net_SSH2::getLog() - * @var Array - * @access private - */ - var $message_number_log = array(); - - /** - * Message Log - * - * @see Net_SSH2::getLog() - * @var Array - * @access private - */ - var $message_log = array(); - - /** - * The Window Size - * - * Bytes the other party can send before it must wait for the window to be adjusted (0x7FFFFFFF = 2GB) - * - * @var Integer - * @see Net_SSH2::_send_channel_packet() - * @see Net_SSH2::exec() - * @access private - */ - var $window_size = 0x7FFFFFFF; - - /** - * Window size, server to client - * - * Window size indexed by channel - * - * @see Net_SSH2::_send_channel_packet() - * @var Array - * @access private - */ - var $window_size_server_to_client = array(); - - /** - * Window size, client to server - * - * Window size indexed by channel - * - * @see Net_SSH2::_get_channel_packet() - * @var Array - * @access private - */ - var $window_size_client_to_server = array(); - - /** - * Server signature - * - * Verified against $this->session_id - * - * @see Net_SSH2::getServerPublicHostKey() - * @var String - * @access private - */ - var $signature = ''; - - /** - * Server signature format - * - * ssh-rsa or ssh-dss. - * - * @see Net_SSH2::getServerPublicHostKey() - * @var String - * @access private - */ - var $signature_format = ''; - - /** - * Interactive Buffer - * - * @see Net_SSH2::read() - * @var Array - * @access private - */ - var $interactiveBuffer = ''; - - /** - * Current log size - * - * Should never exceed NET_SSH2_LOG_MAX_SIZE - * - * @see Net_SSH2::_send_binary_packet() - * @see Net_SSH2::_get_binary_packet() - * @var Integer - * @access private - */ - var $log_size; - - /** - * Timeout - * - * @see Net_SSH2::setTimeout() - * @access private - */ - var $timeout; - - /** - * Current Timeout - * - * @see Net_SSH2::_get_channel_packet() - * @access private - */ - var $curTimeout; - - /** - * Real-time log file pointer - * - * @see Net_SSH2::_append_log() - * @var Resource - * @access private - */ - var $realtime_log_file; - - /** - * Real-time log file size - * - * @see Net_SSH2::_append_log() - * @var Integer - * @access private - */ - var $realtime_log_size; - - /** - * Has the signature been validated? - * - * @see Net_SSH2::getServerPublicHostKey() - * @var Boolean - * @access private - */ - var $signature_validated = false; - - /** - * Real-time log file wrap boolean - * - * @see Net_SSH2::_append_log() - * @access private - */ - var $realtime_log_wrap; - - /** - * Flag to suppress stderr from output - * - * @see Net_SSH2::enableQuietMode() - * @access private - */ - var $quiet_mode = false; - - /** - * Time of first network activity - * - * @var Integer - * @access private - */ - var $last_packet; - - /** - * Exit status returned from ssh if any - * - * @var Integer - * @access private - */ - var $exit_status; - - /** - * Flag to request a PTY when using exec() - * - * @var Boolean - * @see Net_SSH2::enablePTY() - * @access private - */ - var $request_pty = false; - - /** - * Flag set while exec() is running when using enablePTY() - * - * @var Boolean - * @access private - */ - var $in_request_pty_exec = false; - - /** - * Flag set after startSubsystem() is called - * - * @var Boolean - * @access private - */ - var $in_subsystem; - - /** - * Contents of stdError - * - * @var String - * @access private - */ - var $stdErrorLog; - - /** - * The Last Interactive Response - * - * @see Net_SSH2::_keyboard_interactive_process() - * @var String - * @access private - */ - var $last_interactive_response = ''; - - /** - * Keyboard Interactive Request / Responses - * - * @see Net_SSH2::_keyboard_interactive_process() - * @var Array - * @access private - */ - var $keyboard_requests_responses = array(); - - /** - * Banner Message - * - * Quoting from the RFC, "in some jurisdictions, sending a warning message before - * authentication may be relevant for getting legal protection." - * - * @see Net_SSH2::_filter() - * @see Net_SSH2::getBannerMessage() - * @var String - * @access private - */ - var $banner_message = ''; - - /** - * Did read() timeout or return normally? - * - * @see Net_SSH2::isTimeout() - * @var Boolean - * @access private - */ - var $is_timeout = false; - - /** - * Log Boundary - * - * @see Net_SSH2::_format_log() - * @var String - * @access private - */ - var $log_boundary = ':'; - - /** - * Log Long Width - * - * @see Net_SSH2::_format_log() - * @var Integer - * @access private - */ - var $log_long_width = 65; - - /** - * Log Short Width - * - * @see Net_SSH2::_format_log() - * @var Integer - * @access private - */ - var $log_short_width = 16; - - /** - * Hostname - * - * @see Net_SSH2::Net_SSH2() - * @see Net_SSH2::_connect() - * @var String - * @access private - */ - var $host; - - /** - * Port Number - * - * @see Net_SSH2::Net_SSH2() - * @see Net_SSH2::_connect() - * @var Integer - * @access private - */ - var $port; - - /** - * Timeout for initial connection - * - * Set by the constructor call. Calling setTimeout() is optional. If it's not called functions like - * exec() won't timeout unless some PHP setting forces it too. The timeout specified in the constructor, - * however, is non-optional. There will be a timeout, whether or not you set it. If you don't it'll be - * 10 seconds. It is used by fsockopen() and the initial stream_select in that function. - * - * @see Net_SSH2::Net_SSH2() - * @see Net_SSH2::_connect() - * @var Integer - * @access private - */ - var $connectionTimeout; - - /** - * Number of columns for terminal window size - * - * @see Net_SSH2::getWindowColumns() - * @see Net_SSH2::setWindowColumns() - * @see Net_SSH2::setWindowSize() - * @var Integer - * @access private - */ - var $windowColumns = 80; - - /** - * Number of columns for terminal window size - * - * @see Net_SSH2::getWindowRows() - * @see Net_SSH2::setWindowRows() - * @see Net_SSH2::setWindowSize() - * @var Integer - * @access private - */ - var $windowRows = 24; - - /** - * Default Constructor. - * - * @param String $host - * @param optional Integer $port - * @param optional Integer $timeout - * @see Net_SSH2::login() - * @return Net_SSH2 - * @access public - */ - function Net_SSH2($host, $port = 22, $timeout = 10) - { - // Include Math_BigInteger - // Used to do Diffie-Hellman key exchange and DSA/RSA signature verification. - if (!class_exists('Math_BigInteger')) { - include_once 'Math/BigInteger.php'; - } - - if (!function_exists('crypt_random_string')) { - include_once 'Crypt/Random.php'; - } - - if (!class_exists('Crypt_Hash')) { - include_once 'Crypt/Hash.php'; - } - - $this->message_numbers = array( - 1 => 'NET_SSH2_MSG_DISCONNECT', - 2 => 'NET_SSH2_MSG_IGNORE', - 3 => 'NET_SSH2_MSG_UNIMPLEMENTED', - 4 => 'NET_SSH2_MSG_DEBUG', - 5 => 'NET_SSH2_MSG_SERVICE_REQUEST', - 6 => 'NET_SSH2_MSG_SERVICE_ACCEPT', - 20 => 'NET_SSH2_MSG_KEXINIT', - 21 => 'NET_SSH2_MSG_NEWKEYS', - 30 => 'NET_SSH2_MSG_KEXDH_INIT', - 31 => 'NET_SSH2_MSG_KEXDH_REPLY', - 50 => 'NET_SSH2_MSG_USERAUTH_REQUEST', - 51 => 'NET_SSH2_MSG_USERAUTH_FAILURE', - 52 => 'NET_SSH2_MSG_USERAUTH_SUCCESS', - 53 => 'NET_SSH2_MSG_USERAUTH_BANNER', - - 80 => 'NET_SSH2_MSG_GLOBAL_REQUEST', - 81 => 'NET_SSH2_MSG_REQUEST_SUCCESS', - 82 => 'NET_SSH2_MSG_REQUEST_FAILURE', - 90 => 'NET_SSH2_MSG_CHANNEL_OPEN', - 91 => 'NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION', - 92 => 'NET_SSH2_MSG_CHANNEL_OPEN_FAILURE', - 93 => 'NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST', - 94 => 'NET_SSH2_MSG_CHANNEL_DATA', - 95 => 'NET_SSH2_MSG_CHANNEL_EXTENDED_DATA', - 96 => 'NET_SSH2_MSG_CHANNEL_EOF', - 97 => 'NET_SSH2_MSG_CHANNEL_CLOSE', - 98 => 'NET_SSH2_MSG_CHANNEL_REQUEST', - 99 => 'NET_SSH2_MSG_CHANNEL_SUCCESS', - 100 => 'NET_SSH2_MSG_CHANNEL_FAILURE' - ); - $this->disconnect_reasons = array( - 1 => 'NET_SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT', - 2 => 'NET_SSH2_DISCONNECT_PROTOCOL_ERROR', - 3 => 'NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED', - 4 => 'NET_SSH2_DISCONNECT_RESERVED', - 5 => 'NET_SSH2_DISCONNECT_MAC_ERROR', - 6 => 'NET_SSH2_DISCONNECT_COMPRESSION_ERROR', - 7 => 'NET_SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE', - 8 => 'NET_SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED', - 9 => 'NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE', - 10 => 'NET_SSH2_DISCONNECT_CONNECTION_LOST', - 11 => 'NET_SSH2_DISCONNECT_BY_APPLICATION', - 12 => 'NET_SSH2_DISCONNECT_TOO_MANY_CONNECTIONS', - 13 => 'NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER', - 14 => 'NET_SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE', - 15 => 'NET_SSH2_DISCONNECT_ILLEGAL_USER_NAME' - ); - $this->channel_open_failure_reasons = array( - 1 => 'NET_SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED' - ); - $this->terminal_modes = array( - 0 => 'NET_SSH2_TTY_OP_END' - ); - $this->channel_extended_data_type_codes = array( - 1 => 'NET_SSH2_EXTENDED_DATA_STDERR' - ); - - $this->_define_array( - $this->message_numbers, - $this->disconnect_reasons, - $this->channel_open_failure_reasons, - $this->terminal_modes, - $this->channel_extended_data_type_codes, - array(60 => 'NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ'), - array(60 => 'NET_SSH2_MSG_USERAUTH_PK_OK'), - array(60 => 'NET_SSH2_MSG_USERAUTH_INFO_REQUEST', - 61 => 'NET_SSH2_MSG_USERAUTH_INFO_RESPONSE') - ); - - $this->host = $host; - $this->port = $port; - $this->connectionTimeout = $timeout; - } - - /** - * Connect to an SSHv2 server - * - * @return Boolean - * @access private - */ - function _connect() - { - if ($this->bitmap & NET_SSH2_MASK_CONSTRUCTOR) { - return false; - } - - $this->bitmap |= NET_SSH2_MASK_CONSTRUCTOR; - - $timeout = $this->connectionTimeout; - $host = $this->host . ':' . $this->port; - - $this->last_packet = strtok(microtime(), ' ') + strtok(''); // == microtime(true) in PHP5 - - $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 - $this->fsock = @fsockopen($this->host, $this->port, $errno, $errstr, $timeout); - if (!$this->fsock) { - user_error(rtrim("Cannot connect to $host. Error $errno. $errstr")); - return false; - } - $elapsed = strtok(microtime(), ' ') + strtok('') - $start; - - $timeout-= $elapsed; - - if ($timeout <= 0) { - user_error("Cannot connect to $host. Timeout error"); - return false; - } - - $read = array($this->fsock); - $write = $except = null; - - $sec = floor($timeout); - $usec = 1000000 * ($timeout - $sec); - - // on windows this returns a "Warning: Invalid CRT parameters detected" error - // the !count() is done as a workaround for - if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) { - user_error("Cannot connect to $host. Banner timeout"); - return false; - } - - /* According to the SSH2 specs, - - "The server MAY send other lines of data before sending the version - string. Each line SHOULD be terminated by a Carriage Return and Line - Feed. Such lines MUST NOT begin with "SSH-", and SHOULD be encoded - in ISO-10646 UTF-8 [RFC3629] (language is not specified). Clients - MUST be able to process such lines." */ - $temp = ''; - $extra = ''; - while (!feof($this->fsock) && !preg_match('#^SSH-(\d\.\d+)#', $temp, $matches)) { - if (substr($temp, -2) == "\r\n") { - $extra.= $temp; - $temp = ''; - } - $temp.= fgets($this->fsock, 255); - } - - if (feof($this->fsock)) { - user_error('Connection closed by server'); - return false; - } - - $this->identifier = $this->_generate_identifier(); - - if (defined('NET_SSH2_LOGGING')) { - $this->_append_log('<-', $extra . $temp); - $this->_append_log('->', $this->identifier . "\r\n"); - } - - $this->server_identifier = trim($temp, "\r\n"); - if (strlen($extra)) { - $this->errors[] = utf8_decode($extra); - } - - if ($matches[1] != '1.99' && $matches[1] != '2.0') { - user_error("Cannot connect to SSH $matches[1] servers"); - return false; - } - - fputs($this->fsock, $this->identifier . "\r\n"); - - $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - - if (ord($response[0]) != NET_SSH2_MSG_KEXINIT) { - user_error('Expected SSH_MSG_KEXINIT'); - return false; - } - - if (!$this->_key_exchange($response)) { - return false; - } - - $this->bitmap|= NET_SSH2_MASK_CONNECTED; - - return true; - } - - /** - * Generates the SSH identifier - * - * You should overwrite this method in your own class if you want to use another identifier - * - * @access protected - * @return String - */ - function _generate_identifier() - { - $identifier = 'SSH-2.0-phpseclib_0.3'; - - $ext = array(); - if (extension_loaded('mcrypt')) { - $ext[] = 'mcrypt'; - } - - if (extension_loaded('gmp')) { - $ext[] = 'gmp'; - } elseif (extension_loaded('bcmath')) { - $ext[] = 'bcmath'; - } - - if (!empty($ext)) { - $identifier .= ' (' . implode(', ', $ext) . ')'; - } - - return $identifier; - } - - /** - * Key Exchange - * - * @param String $kexinit_payload_server - * @access private - */ - function _key_exchange($kexinit_payload_server) - { - static $kex_algorithms = array( - 'diffie-hellman-group1-sha1', // REQUIRED - 'diffie-hellman-group14-sha1' // REQUIRED - ); - - static $server_host_key_algorithms = array( - 'ssh-rsa', // RECOMMENDED sign Raw RSA Key - 'ssh-dss' // REQUIRED sign Raw DSS Key - ); - - static $encryption_algorithms = false; - if ($encryption_algorithms === false) { - $encryption_algorithms = array( - // from : - 'arcfour256', - 'arcfour128', - - //'arcfour', // OPTIONAL the ARCFOUR stream cipher with a 128-bit key - - // CTR modes from : - 'aes128-ctr', // RECOMMENDED AES (Rijndael) in SDCTR mode, with 128-bit key - 'aes192-ctr', // RECOMMENDED AES with 192-bit key - 'aes256-ctr', // RECOMMENDED AES with 256-bit key - - 'twofish128-ctr', // OPTIONAL Twofish in SDCTR mode, with 128-bit key - 'twofish192-ctr', // OPTIONAL Twofish with 192-bit key - 'twofish256-ctr', // OPTIONAL Twofish with 256-bit key - - 'aes128-cbc', // RECOMMENDED AES with a 128-bit key - 'aes192-cbc', // OPTIONAL AES with a 192-bit key - 'aes256-cbc', // OPTIONAL AES in CBC mode, with a 256-bit key - - 'twofish128-cbc', // OPTIONAL Twofish with a 128-bit key - 'twofish192-cbc', // OPTIONAL Twofish with a 192-bit key - 'twofish256-cbc', - 'twofish-cbc', // OPTIONAL alias for "twofish256-cbc" - // (this is being retained for historical reasons) - - 'blowfish-ctr', // OPTIONAL Blowfish in SDCTR mode - - 'blowfish-cbc', // OPTIONAL Blowfish in CBC mode - - '3des-ctr', // RECOMMENDED Three-key 3DES in SDCTR mode - - '3des-cbc', // REQUIRED three-key 3DES in CBC mode - //'none' // OPTIONAL no encryption; NOT RECOMMENDED - ); - - if (phpseclib_resolve_include_path('Crypt/RC4.php') === false) { - $encryption_algorithms = array_diff( - $encryption_algorithms, - array('arcfour256', 'arcfour128', 'arcfour') - ); - } - if (phpseclib_resolve_include_path('Crypt/Rijndael.php') === false) { - $encryption_algorithms = array_diff( - $encryption_algorithms, - array('aes128-ctr', 'aes192-ctr', 'aes256-ctr', 'aes128-cbc', 'aes192-cbc', 'aes256-cbc') - ); - } - if (phpseclib_resolve_include_path('Crypt/Twofish.php') === false) { - $encryption_algorithms = array_diff( - $encryption_algorithms, - array('twofish128-ctr', 'twofish192-ctr', 'twofish256-ctr', 'twofish128-cbc', 'twofish192-cbc', 'twofish256-cbc', 'twofish-cbc') - ); - } - if (phpseclib_resolve_include_path('Crypt/Blowfish.php') === false) { - $encryption_algorithms = array_diff( - $encryption_algorithms, - array('blowfish-ctr', 'blowfish-cbc') - ); - } - if (phpseclib_resolve_include_path('Crypt/TripleDES.php') === false) { - $encryption_algorithms = array_diff( - $encryption_algorithms, - array('3des-ctr', '3des-cbc') - ); - } - $encryption_algorithms = array_values($encryption_algorithms); - } - - $mac_algorithms = array( - // from : - 'hmac-sha2-256',// RECOMMENDED HMAC-SHA256 (digest length = key length = 32) - - 'hmac-sha1-96', // RECOMMENDED first 96 bits of HMAC-SHA1 (digest length = 12, key length = 20) - 'hmac-sha1', // REQUIRED HMAC-SHA1 (digest length = key length = 20) - 'hmac-md5-96', // OPTIONAL first 96 bits of HMAC-MD5 (digest length = 12, key length = 16) - 'hmac-md5', // OPTIONAL HMAC-MD5 (digest length = key length = 16) - //'none' // OPTIONAL no MAC; NOT RECOMMENDED - ); - - static $compression_algorithms = array( - 'none' // REQUIRED no compression - //'zlib' // OPTIONAL ZLIB (LZ77) compression - ); - - // some SSH servers have buggy implementations of some of the above algorithms - switch ($this->server_identifier) { - case 'SSH-2.0-SSHD': - $mac_algorithms = array_values(array_diff( - $mac_algorithms, - array('hmac-sha1-96', 'hmac-md5-96') - )); - } - - static $str_kex_algorithms, $str_server_host_key_algorithms, - $encryption_algorithms_server_to_client, $mac_algorithms_server_to_client, $compression_algorithms_server_to_client, - $encryption_algorithms_client_to_server, $mac_algorithms_client_to_server, $compression_algorithms_client_to_server; - - if (empty($str_kex_algorithms)) { - $str_kex_algorithms = implode(',', $kex_algorithms); - $str_server_host_key_algorithms = implode(',', $server_host_key_algorithms); - $encryption_algorithms_server_to_client = $encryption_algorithms_client_to_server = implode(',', $encryption_algorithms); - $mac_algorithms_server_to_client = $mac_algorithms_client_to_server = implode(',', $mac_algorithms); - $compression_algorithms_server_to_client = $compression_algorithms_client_to_server = implode(',', $compression_algorithms); - } - - $client_cookie = crypt_random_string(16); - - $response = $kexinit_payload_server; - $this->_string_shift($response, 1); // skip past the message number (it should be SSH_MSG_KEXINIT) - $server_cookie = $this->_string_shift($response, 16); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->kex_algorithms = explode(',', $this->_string_shift($response, $temp['length'])); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->server_host_key_algorithms = explode(',', $this->_string_shift($response, $temp['length'])); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->encryption_algorithms_client_to_server = explode(',', $this->_string_shift($response, $temp['length'])); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->encryption_algorithms_server_to_client = explode(',', $this->_string_shift($response, $temp['length'])); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->mac_algorithms_client_to_server = explode(',', $this->_string_shift($response, $temp['length'])); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->mac_algorithms_server_to_client = explode(',', $this->_string_shift($response, $temp['length'])); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->compression_algorithms_client_to_server = explode(',', $this->_string_shift($response, $temp['length'])); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->compression_algorithms_server_to_client = explode(',', $this->_string_shift($response, $temp['length'])); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->languages_client_to_server = explode(',', $this->_string_shift($response, $temp['length'])); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->languages_server_to_client = explode(',', $this->_string_shift($response, $temp['length'])); - - extract(unpack('Cfirst_kex_packet_follows', $this->_string_shift($response, 1))); - $first_kex_packet_follows = $first_kex_packet_follows != 0; - - // the sending of SSH2_MSG_KEXINIT could go in one of two places. this is the second place. - $kexinit_payload_client = pack('Ca*Na*Na*Na*Na*Na*Na*Na*Na*Na*Na*CN', - NET_SSH2_MSG_KEXINIT, $client_cookie, strlen($str_kex_algorithms), $str_kex_algorithms, - strlen($str_server_host_key_algorithms), $str_server_host_key_algorithms, strlen($encryption_algorithms_client_to_server), - $encryption_algorithms_client_to_server, strlen($encryption_algorithms_server_to_client), $encryption_algorithms_server_to_client, - strlen($mac_algorithms_client_to_server), $mac_algorithms_client_to_server, strlen($mac_algorithms_server_to_client), - $mac_algorithms_server_to_client, strlen($compression_algorithms_client_to_server), $compression_algorithms_client_to_server, - strlen($compression_algorithms_server_to_client), $compression_algorithms_server_to_client, 0, '', 0, '', - 0, 0 - ); - - if (!$this->_send_binary_packet($kexinit_payload_client)) { - return false; - } - // here ends the second place. - - // we need to decide upon the symmetric encryption algorithms before we do the diffie-hellman key exchange - for ($i = 0; $i < count($encryption_algorithms) && !in_array($encryption_algorithms[$i], $this->encryption_algorithms_server_to_client); $i++); - if ($i == count($encryption_algorithms)) { - user_error('No compatible server to client encryption algorithms found'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - - // we don't initialize any crypto-objects, yet - we do that, later. for now, we need the lengths to make the - // diffie-hellman key exchange as fast as possible - $decrypt = $encryption_algorithms[$i]; - switch ($decrypt) { - case '3des-cbc': - case '3des-ctr': - $decryptKeyLength = 24; // eg. 192 / 8 - break; - case 'aes256-cbc': - case 'aes256-ctr': - case 'twofish-cbc': - case 'twofish256-cbc': - case 'twofish256-ctr': - $decryptKeyLength = 32; // eg. 256 / 8 - break; - case 'aes192-cbc': - case 'aes192-ctr': - case 'twofish192-cbc': - case 'twofish192-ctr': - $decryptKeyLength = 24; // eg. 192 / 8 - break; - case 'aes128-cbc': - case 'aes128-ctr': - case 'twofish128-cbc': - case 'twofish128-ctr': - case 'blowfish-cbc': - case 'blowfish-ctr': - $decryptKeyLength = 16; // eg. 128 / 8 - break; - case 'arcfour': - case 'arcfour128': - $decryptKeyLength = 16; // eg. 128 / 8 - break; - case 'arcfour256': - $decryptKeyLength = 32; // eg. 128 / 8 - break; - case 'none'; - $decryptKeyLength = 0; - } - - for ($i = 0; $i < count($encryption_algorithms) && !in_array($encryption_algorithms[$i], $this->encryption_algorithms_client_to_server); $i++); - if ($i == count($encryption_algorithms)) { - user_error('No compatible client to server encryption algorithms found'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - - $encrypt = $encryption_algorithms[$i]; - switch ($encrypt) { - case '3des-cbc': - case '3des-ctr': - $encryptKeyLength = 24; - break; - case 'aes256-cbc': - case 'aes256-ctr': - case 'twofish-cbc': - case 'twofish256-cbc': - case 'twofish256-ctr': - $encryptKeyLength = 32; - break; - case 'aes192-cbc': - case 'aes192-ctr': - case 'twofish192-cbc': - case 'twofish192-ctr': - $encryptKeyLength = 24; - break; - case 'aes128-cbc': - case 'aes128-ctr': - case 'twofish128-cbc': - case 'twofish128-ctr': - case 'blowfish-cbc': - case 'blowfish-ctr': - $encryptKeyLength = 16; - break; - case 'arcfour': - case 'arcfour128': - $encryptKeyLength = 16; - break; - case 'arcfour256': - $encryptKeyLength = 32; - break; - case 'none'; - $encryptKeyLength = 0; - } - - $keyLength = $decryptKeyLength > $encryptKeyLength ? $decryptKeyLength : $encryptKeyLength; - - // through diffie-hellman key exchange a symmetric key is obtained - for ($i = 0; $i < count($kex_algorithms) && !in_array($kex_algorithms[$i], $this->kex_algorithms); $i++); - if ($i == count($kex_algorithms)) { - user_error('No compatible key exchange algorithms found'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - - switch ($kex_algorithms[$i]) { - // see http://tools.ietf.org/html/rfc2409#section-6.2 and - // http://tools.ietf.org/html/rfc2412, appendex E - case 'diffie-hellman-group1-sha1': - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . - '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . - '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . - 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF'; - break; - // see http://tools.ietf.org/html/rfc3526#section-3 - case 'diffie-hellman-group14-sha1': - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . - '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . - '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . - 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . - '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . - '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . - 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . - '3995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF'; - break; - } - - // For both diffie-hellman-group1-sha1 and diffie-hellman-group14-sha1 - // the generator field element is 2 (decimal) and the hash function is sha1. - $g = new Math_BigInteger(2); - $prime = new Math_BigInteger($prime, 16); - $kexHash = new Crypt_Hash('sha1'); - //$q = $p->bitwise_rightShift(1); - - /* To increase the speed of the key exchange, both client and server may - reduce the size of their private exponents. It should be at least - twice as long as the key material that is generated from the shared - secret. For more details, see the paper by van Oorschot and Wiener - [VAN-OORSCHOT]. - - -- http://tools.ietf.org/html/rfc4419#section-6.2 */ - $one = new Math_BigInteger(1); - $keyLength = min($keyLength, $kexHash->getLength()); - $max = $one->bitwise_leftShift(16 * $keyLength); // 2 * 8 * $keyLength - $max = $max->subtract($one); - - $x = $one->random($one, $max); - $e = $g->modPow($x, $prime); - - $eBytes = $e->toBytes(true); - $data = pack('CNa*', NET_SSH2_MSG_KEXDH_INIT, strlen($eBytes), $eBytes); - - if (!$this->_send_binary_packet($data)) { - user_error('Connection closed by server'); - return false; - } - - $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - extract(unpack('Ctype', $this->_string_shift($response, 1))); - - if ($type != NET_SSH2_MSG_KEXDH_REPLY) { - user_error('Expected SSH_MSG_KEXDH_REPLY'); - return false; - } - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->server_public_host_key = $server_public_host_key = $this->_string_shift($response, $temp['length']); - - $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); - $public_key_format = $this->_string_shift($server_public_host_key, $temp['length']); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $fBytes = $this->_string_shift($response, $temp['length']); - $f = new Math_BigInteger($fBytes, -256); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->signature = $this->_string_shift($response, $temp['length']); - - $temp = unpack('Nlength', $this->_string_shift($this->signature, 4)); - $this->signature_format = $this->_string_shift($this->signature, $temp['length']); - - $key = $f->modPow($x, $prime); - $keyBytes = $key->toBytes(true); - - $this->exchange_hash = pack('Na*Na*Na*Na*Na*Na*Na*Na*', - strlen($this->identifier), $this->identifier, strlen($this->server_identifier), $this->server_identifier, - strlen($kexinit_payload_client), $kexinit_payload_client, strlen($kexinit_payload_server), - $kexinit_payload_server, strlen($this->server_public_host_key), $this->server_public_host_key, strlen($eBytes), - $eBytes, strlen($fBytes), $fBytes, strlen($keyBytes), $keyBytes - ); - - $this->exchange_hash = $kexHash->hash($this->exchange_hash); - - if ($this->session_id === false) { - $this->session_id = $this->exchange_hash; - } - - for ($i = 0; $i < count($server_host_key_algorithms) && !in_array($server_host_key_algorithms[$i], $this->server_host_key_algorithms); $i++); - if ($i == count($server_host_key_algorithms)) { - user_error('No compatible server host key algorithms found'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - - if ($public_key_format != $server_host_key_algorithms[$i] || $this->signature_format != $server_host_key_algorithms[$i]) { - user_error('Server Host Key Algorithm Mismatch'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - - $packet = pack('C', - NET_SSH2_MSG_NEWKEYS - ); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $response = $this->_get_binary_packet(); - - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - - extract(unpack('Ctype', $this->_string_shift($response, 1))); - - if ($type != NET_SSH2_MSG_NEWKEYS) { - user_error('Expected SSH_MSG_NEWKEYS'); - return false; - } - - switch ($encrypt) { - case '3des-cbc': - if (!class_exists('Crypt_TripleDES')) { - include_once 'Crypt/TripleDES.php'; - } - $this->encrypt = new Crypt_TripleDES(); - // $this->encrypt_block_size = 64 / 8 == the default - break; - case '3des-ctr': - if (!class_exists('Crypt_TripleDES')) { - include_once 'Crypt/TripleDES.php'; - } - $this->encrypt = new Crypt_TripleDES(CRYPT_DES_MODE_CTR); - // $this->encrypt_block_size = 64 / 8 == the default - break; - case 'aes256-cbc': - case 'aes192-cbc': - case 'aes128-cbc': - if (!class_exists('Crypt_Rijndael')) { - include_once 'Crypt/Rijndael.php'; - } - $this->encrypt = new Crypt_Rijndael(); - $this->encrypt_block_size = 16; // eg. 128 / 8 - break; - case 'aes256-ctr': - case 'aes192-ctr': - case 'aes128-ctr': - if (!class_exists('Crypt_Rijndael')) { - include_once 'Crypt/Rijndael.php'; - } - $this->encrypt = new Crypt_Rijndael(CRYPT_RIJNDAEL_MODE_CTR); - $this->encrypt_block_size = 16; // eg. 128 / 8 - break; - case 'blowfish-cbc': - if (!class_exists('Crypt_Blowfish')) { - include_once 'Crypt/Blowfish.php'; - } - $this->encrypt = new Crypt_Blowfish(); - $this->encrypt_block_size = 8; - break; - case 'blowfish-ctr': - if (!class_exists('Crypt_Blowfish')) { - include_once 'Crypt/Blowfish.php'; - } - $this->encrypt = new Crypt_Blowfish(CRYPT_BLOWFISH_MODE_CTR); - $this->encrypt_block_size = 8; - break; - case 'twofish128-cbc': - case 'twofish192-cbc': - case 'twofish256-cbc': - case 'twofish-cbc': - if (!class_exists('Crypt_Twofish')) { - include_once 'Crypt/Twofish.php'; - } - $this->encrypt = new Crypt_Twofish(); - $this->encrypt_block_size = 16; - break; - case 'twofish128-ctr': - case 'twofish192-ctr': - case 'twofish256-ctr': - if (!class_exists('Crypt_Twofish')) { - include_once 'Crypt/Twofish.php'; - } - $this->encrypt = new Crypt_Twofish(CRYPT_TWOFISH_MODE_CTR); - $this->encrypt_block_size = 16; - break; - case 'arcfour': - case 'arcfour128': - case 'arcfour256': - if (!class_exists('Crypt_RC4')) { - include_once 'Crypt/RC4.php'; - } - $this->encrypt = new Crypt_RC4(); - break; - case 'none'; - //$this->encrypt = new Crypt_Null(); - } - - switch ($decrypt) { - case '3des-cbc': - if (!class_exists('Crypt_TripleDES')) { - include_once 'Crypt/TripleDES.php'; - } - $this->decrypt = new Crypt_TripleDES(); - break; - case '3des-ctr': - if (!class_exists('Crypt_TripleDES')) { - include_once 'Crypt/TripleDES.php'; - } - $this->decrypt = new Crypt_TripleDES(CRYPT_DES_MODE_CTR); - break; - case 'aes256-cbc': - case 'aes192-cbc': - case 'aes128-cbc': - if (!class_exists('Crypt_Rijndael')) { - include_once 'Crypt/Rijndael.php'; - } - $this->decrypt = new Crypt_Rijndael(); - $this->decrypt_block_size = 16; - break; - case 'aes256-ctr': - case 'aes192-ctr': - case 'aes128-ctr': - if (!class_exists('Crypt_Rijndael')) { - include_once 'Crypt/Rijndael.php'; - } - $this->decrypt = new Crypt_Rijndael(CRYPT_RIJNDAEL_MODE_CTR); - $this->decrypt_block_size = 16; - break; - case 'blowfish-cbc': - if (!class_exists('Crypt_Blowfish')) { - include_once 'Crypt/Blowfish.php'; - } - $this->decrypt = new Crypt_Blowfish(); - $this->decrypt_block_size = 8; - break; - case 'blowfish-ctr': - if (!class_exists('Crypt_Blowfish')) { - include_once 'Crypt/Blowfish.php'; - } - $this->decrypt = new Crypt_Blowfish(CRYPT_BLOWFISH_MODE_CTR); - $this->decrypt_block_size = 8; - break; - case 'twofish128-cbc': - case 'twofish192-cbc': - case 'twofish256-cbc': - case 'twofish-cbc': - if (!class_exists('Crypt_Twofish')) { - include_once 'Crypt/Twofish.php'; - } - $this->decrypt = new Crypt_Twofish(); - $this->decrypt_block_size = 16; - break; - case 'twofish128-ctr': - case 'twofish192-ctr': - case 'twofish256-ctr': - if (!class_exists('Crypt_Twofish')) { - include_once 'Crypt/Twofish.php'; - } - $this->decrypt = new Crypt_Twofish(CRYPT_TWOFISH_MODE_CTR); - $this->decrypt_block_size = 16; - break; - case 'arcfour': - case 'arcfour128': - case 'arcfour256': - if (!class_exists('Crypt_RC4')) { - include_once 'Crypt/RC4.php'; - } - $this->decrypt = new Crypt_RC4(); - break; - case 'none'; - //$this->decrypt = new Crypt_Null(); - } - - $keyBytes = pack('Na*', strlen($keyBytes), $keyBytes); - - if ($this->encrypt) { - $this->encrypt->enableContinuousBuffer(); - $this->encrypt->disablePadding(); - - $iv = $kexHash->hash($keyBytes . $this->exchange_hash . 'A' . $this->session_id); - while ($this->encrypt_block_size > strlen($iv)) { - $iv.= $kexHash->hash($keyBytes . $this->exchange_hash . $iv); - } - $this->encrypt->setIV(substr($iv, 0, $this->encrypt_block_size)); - - $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'C' . $this->session_id); - while ($encryptKeyLength > strlen($key)) { - $key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key); - } - $this->encrypt->setKey(substr($key, 0, $encryptKeyLength)); - } - - if ($this->decrypt) { - $this->decrypt->enableContinuousBuffer(); - $this->decrypt->disablePadding(); - - $iv = $kexHash->hash($keyBytes . $this->exchange_hash . 'B' . $this->session_id); - while ($this->decrypt_block_size > strlen($iv)) { - $iv.= $kexHash->hash($keyBytes . $this->exchange_hash . $iv); - } - $this->decrypt->setIV(substr($iv, 0, $this->decrypt_block_size)); - - $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'D' . $this->session_id); - while ($decryptKeyLength > strlen($key)) { - $key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key); - } - $this->decrypt->setKey(substr($key, 0, $decryptKeyLength)); - } - - /* The "arcfour128" algorithm is the RC4 cipher, as described in - [SCHNEIER], using a 128-bit key. The first 1536 bytes of keystream - generated by the cipher MUST be discarded, and the first byte of the - first encrypted packet MUST be encrypted using the 1537th byte of - keystream. - - -- http://tools.ietf.org/html/rfc4345#section-4 */ - if ($encrypt == 'arcfour128' || $encrypt == 'arcfour256') { - $this->encrypt->encrypt(str_repeat("\0", 1536)); - } - if ($decrypt == 'arcfour128' || $decrypt == 'arcfour256') { - $this->decrypt->decrypt(str_repeat("\0", 1536)); - } - - for ($i = 0; $i < count($mac_algorithms) && !in_array($mac_algorithms[$i], $this->mac_algorithms_client_to_server); $i++); - if ($i == count($mac_algorithms)) { - user_error('No compatible client to server message authentication algorithms found'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - - $createKeyLength = 0; // ie. $mac_algorithms[$i] == 'none' - switch ($mac_algorithms[$i]) { - case 'hmac-sha2-256': - $this->hmac_create = new Crypt_Hash('sha256'); - $createKeyLength = 32; - break; - case 'hmac-sha1': - $this->hmac_create = new Crypt_Hash('sha1'); - $createKeyLength = 20; - break; - case 'hmac-sha1-96': - $this->hmac_create = new Crypt_Hash('sha1-96'); - $createKeyLength = 20; - break; - case 'hmac-md5': - $this->hmac_create = new Crypt_Hash('md5'); - $createKeyLength = 16; - break; - case 'hmac-md5-96': - $this->hmac_create = new Crypt_Hash('md5-96'); - $createKeyLength = 16; - } - - for ($i = 0; $i < count($mac_algorithms) && !in_array($mac_algorithms[$i], $this->mac_algorithms_server_to_client); $i++); - if ($i == count($mac_algorithms)) { - user_error('No compatible server to client message authentication algorithms found'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - - $checkKeyLength = 0; - $this->hmac_size = 0; - switch ($mac_algorithms[$i]) { - case 'hmac-sha2-256': - $this->hmac_check = new Crypt_Hash('sha256'); - $checkKeyLength = 32; - $this->hmac_size = 32; - break; - case 'hmac-sha1': - $this->hmac_check = new Crypt_Hash('sha1'); - $checkKeyLength = 20; - $this->hmac_size = 20; - break; - case 'hmac-sha1-96': - $this->hmac_check = new Crypt_Hash('sha1-96'); - $checkKeyLength = 20; - $this->hmac_size = 12; - break; - case 'hmac-md5': - $this->hmac_check = new Crypt_Hash('md5'); - $checkKeyLength = 16; - $this->hmac_size = 16; - break; - case 'hmac-md5-96': - $this->hmac_check = new Crypt_Hash('md5-96'); - $checkKeyLength = 16; - $this->hmac_size = 12; - } - - $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'E' . $this->session_id); - while ($createKeyLength > strlen($key)) { - $key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key); - } - $this->hmac_create->setKey(substr($key, 0, $createKeyLength)); - - $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'F' . $this->session_id); - while ($checkKeyLength > strlen($key)) { - $key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key); - } - $this->hmac_check->setKey(substr($key, 0, $checkKeyLength)); - - for ($i = 0; $i < count($compression_algorithms) && !in_array($compression_algorithms[$i], $this->compression_algorithms_server_to_client); $i++); - if ($i == count($compression_algorithms)) { - user_error('No compatible server to client compression algorithms found'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - $this->decompress = $compression_algorithms[$i] == 'zlib'; - - for ($i = 0; $i < count($compression_algorithms) && !in_array($compression_algorithms[$i], $this->compression_algorithms_client_to_server); $i++); - if ($i == count($compression_algorithms)) { - user_error('No compatible client to server compression algorithms found'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - $this->compress = $compression_algorithms[$i] == 'zlib'; - - return true; - } - - /** - * Login - * - * The $password parameter can be a plaintext password, a Crypt_RSA object or an array - * - * @param String $username - * @param Mixed $password - * @param Mixed $... - * @return Boolean - * @see _login - * @access public - */ - function login($username) - { - $args = func_get_args(); - return call_user_func_array(array(&$this, '_login'), $args); - } - - /** - * Login Helper - * - * @param String $username - * @param Mixed $password - * @param Mixed $... - * @return Boolean - * @see _login_helper - * @access private - */ - function _login($username) - { - if (!($this->bitmap & NET_SSH2_MASK_CONSTRUCTOR)) { - if (!$this->_connect()) { - return false; - } - } - - $args = array_slice(func_get_args(), 1); - if (empty($args)) { - return $this->_login_helper($username); - } - - foreach ($args as $arg) { - if ($this->_login_helper($username, $arg)) { - return true; - } - } - return false; - } - - /** - * Login Helper - * - * @param String $username - * @param optional String $password - * @return Boolean - * @access private - * @internal It might be worthwhile, at some point, to protect against {@link http://tools.ietf.org/html/rfc4251#section-9.3.9 traffic analysis} - * by sending dummy SSH_MSG_IGNORE messages. - */ - function _login_helper($username, $password = null) - { - if (!($this->bitmap & NET_SSH2_MASK_CONNECTED)) { - return false; - } - - if (!($this->bitmap & NET_SSH2_MASK_LOGIN_REQ)) { - $packet = pack('CNa*', - NET_SSH2_MSG_SERVICE_REQUEST, strlen('ssh-userauth'), 'ssh-userauth' - ); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - - extract(unpack('Ctype', $this->_string_shift($response, 1))); - - if ($type != NET_SSH2_MSG_SERVICE_ACCEPT) { - user_error('Expected SSH_MSG_SERVICE_ACCEPT'); - return false; - } - $this->bitmap |= NET_SSH2_MASK_LOGIN_REQ; - } - - if (strlen($this->last_interactive_response)) { - return !is_string($password) && !is_array($password) ? false : $this->_keyboard_interactive_process($password); - } - - // although PHP5's get_class() preserves the case, PHP4's does not - if (is_object($password)) { - switch (strtolower(get_class($password))) { - case 'crypt_rsa': - return $this->_privatekey_login($username, $password); - case 'system_ssh_agent': - return $this->_ssh_agent_login($username, $password); - } - } - - if (is_array($password)) { - if ($this->_keyboard_interactive_login($username, $password)) { - $this->bitmap |= NET_SSH2_MASK_LOGIN; - return true; - } - return false; - } - - if (!isset($password)) { - $packet = pack('CNa*Na*Na*', - NET_SSH2_MSG_USERAUTH_REQUEST, strlen($username), $username, strlen('ssh-connection'), 'ssh-connection', - strlen('none'), 'none' - ); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - - extract(unpack('Ctype', $this->_string_shift($response, 1))); - - switch ($type) { - case NET_SSH2_MSG_USERAUTH_SUCCESS: - $this->bitmap |= NET_SSH2_MASK_LOGIN; - return true; - //case NET_SSH2_MSG_USERAUTH_FAILURE: - default: - return false; - } - } - - $packet = pack('CNa*Na*Na*CNa*', - NET_SSH2_MSG_USERAUTH_REQUEST, strlen($username), $username, strlen('ssh-connection'), 'ssh-connection', - strlen('password'), 'password', 0, strlen($password), $password - ); - - // remove the username and password from the logged packet - if (!defined('NET_SSH2_LOGGING')) { - $logged = null; - } else { - $logged = pack('CNa*Na*Na*CNa*', - NET_SSH2_MSG_USERAUTH_REQUEST, strlen('username'), 'username', strlen('ssh-connection'), 'ssh-connection', - strlen('password'), 'password', 0, strlen('password'), 'password' - ); - } - - if (!$this->_send_binary_packet($packet, $logged)) { - return false; - } - - $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - - extract(unpack('Ctype', $this->_string_shift($response, 1))); - - switch ($type) { - case NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ: // in theory, the password can be changed - if (defined('NET_SSH2_LOGGING')) { - $this->message_number_log[count($this->message_number_log) - 1] = 'NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ'; - } - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $this->errors[] = 'SSH_MSG_USERAUTH_PASSWD_CHANGEREQ: ' . utf8_decode($this->_string_shift($response, $length)); - return $this->_disconnect(NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER); - case NET_SSH2_MSG_USERAUTH_FAILURE: - // can we use keyboard-interactive authentication? if not then either the login is bad or the server employees - // multi-factor authentication - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $auth_methods = explode(',', $this->_string_shift($response, $length)); - extract(unpack('Cpartial_success', $this->_string_shift($response, 1))); - $partial_success = $partial_success != 0; - - if (!$partial_success && in_array('keyboard-interactive', $auth_methods)) { - if ($this->_keyboard_interactive_login($username, $password)) { - $this->bitmap |= NET_SSH2_MASK_LOGIN; - return true; - } - return false; - } - return false; - case NET_SSH2_MSG_USERAUTH_SUCCESS: - $this->bitmap |= NET_SSH2_MASK_LOGIN; - return true; - } - - return false; - } - - /** - * Login via keyboard-interactive authentication - * - * See {@link http://tools.ietf.org/html/rfc4256 RFC4256} for details. This is not a full-featured keyboard-interactive authenticator. - * - * @param String $username - * @param String $password - * @return Boolean - * @access private - */ - function _keyboard_interactive_login($username, $password) - { - $packet = pack('CNa*Na*Na*Na*Na*', - NET_SSH2_MSG_USERAUTH_REQUEST, strlen($username), $username, strlen('ssh-connection'), 'ssh-connection', - strlen('keyboard-interactive'), 'keyboard-interactive', 0, '', 0, '' - ); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - - return $this->_keyboard_interactive_process($password); - } - - /** - * Handle the keyboard-interactive requests / responses. - * - * @param String $responses... - * @return Boolean - * @access private - */ - function _keyboard_interactive_process() - { - $responses = func_get_args(); - - if (strlen($this->last_interactive_response)) { - $response = $this->last_interactive_response; - } else { - $orig = $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - } - - extract(unpack('Ctype', $this->_string_shift($response, 1))); - - switch ($type) { - case NET_SSH2_MSG_USERAUTH_INFO_REQUEST: - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $this->_string_shift($response, $length); // name; may be empty - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $this->_string_shift($response, $length); // instruction; may be empty - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $this->_string_shift($response, $length); // language tag; may be empty - extract(unpack('Nnum_prompts', $this->_string_shift($response, 4))); - - for ($i = 0; $i < count($responses); $i++) { - if (is_array($responses[$i])) { - foreach ($responses[$i] as $key => $value) { - $this->keyboard_requests_responses[$key] = $value; - } - unset($responses[$i]); - } - } - $responses = array_values($responses); - - if (isset($this->keyboard_requests_responses)) { - for ($i = 0; $i < $num_prompts; $i++) { - extract(unpack('Nlength', $this->_string_shift($response, 4))); - // prompt - ie. "Password: "; must not be empty - $prompt = $this->_string_shift($response, $length); - //$echo = $this->_string_shift($response) != chr(0); - foreach ($this->keyboard_requests_responses as $key => $value) { - if (substr($prompt, 0, strlen($key)) == $key) { - $responses[] = $value; - break; - } - } - } - } - - // see http://tools.ietf.org/html/rfc4256#section-3.2 - if (strlen($this->last_interactive_response)) { - $this->last_interactive_response = ''; - } else if (defined('NET_SSH2_LOGGING')) { - $this->message_number_log[count($this->message_number_log) - 1] = str_replace( - 'UNKNOWN', - 'NET_SSH2_MSG_USERAUTH_INFO_REQUEST', - $this->message_number_log[count($this->message_number_log) - 1] - ); - } - - if (!count($responses) && $num_prompts) { - $this->last_interactive_response = $orig; - return false; - } - - /* - After obtaining the requested information from the user, the client - MUST respond with an SSH_MSG_USERAUTH_INFO_RESPONSE message. - */ - // see http://tools.ietf.org/html/rfc4256#section-3.4 - $packet = $logged = pack('CN', NET_SSH2_MSG_USERAUTH_INFO_RESPONSE, count($responses)); - for ($i = 0; $i < count($responses); $i++) { - $packet.= pack('Na*', strlen($responses[$i]), $responses[$i]); - $logged.= pack('Na*', strlen('dummy-answer'), 'dummy-answer'); - } - - if (!$this->_send_binary_packet($packet, $logged)) { - return false; - } - - if (defined('NET_SSH2_LOGGING') && NET_SSH2_LOGGING == NET_SSH2_LOG_COMPLEX) { - $this->message_number_log[count($this->message_number_log) - 1] = str_replace( - 'UNKNOWN', - 'NET_SSH2_MSG_USERAUTH_INFO_RESPONSE', - $this->message_number_log[count($this->message_number_log) - 1] - ); - } - - /* - After receiving the response, the server MUST send either an - SSH_MSG_USERAUTH_SUCCESS, SSH_MSG_USERAUTH_FAILURE, or another - SSH_MSG_USERAUTH_INFO_REQUEST message. - */ - // maybe phpseclib should force close the connection after x request / responses? unless something like that is done - // there could be an infinite loop of request / responses. - return $this->_keyboard_interactive_process(); - case NET_SSH2_MSG_USERAUTH_SUCCESS: - return true; - case NET_SSH2_MSG_USERAUTH_FAILURE: - return false; - } - - return false; - } - - /** - * Login with an ssh-agent provided key - * - * @param String $username - * @param System_SSH_Agent $agent - * @return Boolean - * @access private - */ - function _ssh_agent_login($username, $agent) - { - $keys = $agent->requestIdentities(); - foreach ($keys as $key) { - if ($this->_privatekey_login($username, $key)) { - return true; - } - } - - return false; - } - - /** - * Login with an RSA private key - * - * @param String $username - * @param Crypt_RSA $password - * @return Boolean - * @access private - * @internal It might be worthwhile, at some point, to protect against {@link http://tools.ietf.org/html/rfc4251#section-9.3.9 traffic analysis} - * by sending dummy SSH_MSG_IGNORE messages. - */ - function _privatekey_login($username, $privatekey) - { - // see http://tools.ietf.org/html/rfc4253#page-15 - $publickey = $privatekey->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_RAW); - if ($publickey === false) { - return false; - } - - $publickey = array( - 'e' => $publickey['e']->toBytes(true), - 'n' => $publickey['n']->toBytes(true) - ); - $publickey = pack('Na*Na*Na*', - strlen('ssh-rsa'), 'ssh-rsa', strlen($publickey['e']), $publickey['e'], strlen($publickey['n']), $publickey['n'] - ); - - $part1 = pack('CNa*Na*Na*', - NET_SSH2_MSG_USERAUTH_REQUEST, strlen($username), $username, strlen('ssh-connection'), 'ssh-connection', - strlen('publickey'), 'publickey' - ); - $part2 = pack('Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publickey), $publickey); - - $packet = $part1 . chr(0) . $part2; - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - - extract(unpack('Ctype', $this->_string_shift($response, 1))); - - switch ($type) { - case NET_SSH2_MSG_USERAUTH_FAILURE: - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $this->errors[] = 'SSH_MSG_USERAUTH_FAILURE: ' . $this->_string_shift($response, $length); - return false; - case NET_SSH2_MSG_USERAUTH_PK_OK: - // we'll just take it on faith that the public key blob and the public key algorithm name are as - // they should be - if (defined('NET_SSH2_LOGGING') && NET_SSH2_LOGGING == NET_SSH2_LOG_COMPLEX) { - $this->message_number_log[count($this->message_number_log) - 1] = str_replace( - 'UNKNOWN', - 'NET_SSH2_MSG_USERAUTH_PK_OK', - $this->message_number_log[count($this->message_number_log) - 1] - ); - } - } - - $packet = $part1 . chr(1) . $part2; - $privatekey->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); - $signature = $privatekey->sign(pack('Na*a*', strlen($this->session_id), $this->session_id, $packet)); - $signature = pack('Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($signature), $signature); - $packet.= pack('Na*', strlen($signature), $signature); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - - extract(unpack('Ctype', $this->_string_shift($response, 1))); - - switch ($type) { - case NET_SSH2_MSG_USERAUTH_FAILURE: - // either the login is bad or the server employs multi-factor authentication - return false; - case NET_SSH2_MSG_USERAUTH_SUCCESS: - $this->bitmap |= NET_SSH2_MASK_LOGIN; - return true; - } - - return false; - } - - /** - * Set Timeout - * - * $ssh->exec('ping 127.0.0.1'); on a Linux host will never return and will run indefinitely. setTimeout() makes it so it'll timeout. - * Setting $timeout to false or 0 will mean there is no timeout. - * - * @param Mixed $timeout - * @access public - */ - function setTimeout($timeout) - { - $this->timeout = $this->curTimeout = $timeout; - } - - /** - * Get the output from stdError - * - * @access public - */ - function getStdError() - { - return $this->stdErrorLog; - } - - /** - * Execute Command - * - * If $callback is set to false then Net_SSH2::_get_channel_packet(NET_SSH2_CHANNEL_EXEC) will need to be called manually. - * In all likelihood, this is not a feature you want to be taking advantage of. - * - * @param String $command - * @param optional Callback $callback - * @return String - * @access public - */ - function exec($command, $callback = null) - { - $this->curTimeout = $this->timeout; - $this->is_timeout = false; - $this->stdErrorLog = ''; - - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - // RFC4254 defines the (client) window size as "bytes the other party can send before it must wait for the window to - // be adjusted". 0x7FFFFFFF is, at 2GB, the max size. technically, it should probably be decremented, but, - // honestly, if you're transfering more than 2GB, you probably shouldn't be using phpseclib, anyway. - // see http://tools.ietf.org/html/rfc4254#section-5.2 for more info - $this->window_size_server_to_client[NET_SSH2_CHANNEL_EXEC] = $this->window_size; - // 0x8000 is the maximum max packet size, per http://tools.ietf.org/html/rfc4253#section-6.1, although since PuTTy - // uses 0x4000, that's what will be used here, as well. - $packet_size = 0x4000; - - $packet = pack('CNa*N3', - NET_SSH2_MSG_CHANNEL_OPEN, strlen('session'), 'session', NET_SSH2_CHANNEL_EXEC, $this->window_size_server_to_client[NET_SSH2_CHANNEL_EXEC], $packet_size); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $this->channel_status[NET_SSH2_CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_OPEN; - - $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_EXEC); - if ($response === false) { - return false; - } - - if ($this->request_pty === true) { - $terminal_modes = pack('C', NET_SSH2_TTY_OP_END); - $packet = pack('CNNa*CNa*N5a*', - NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SSH2_CHANNEL_EXEC], strlen('pty-req'), 'pty-req', 1, strlen('vt100'), 'vt100', - $this->windowColumns, $this->windowRows, 0, 0, strlen($terminal_modes), $terminal_modes); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - - list(, $type) = unpack('C', $this->_string_shift($response, 1)); - - switch ($type) { - case NET_SSH2_MSG_CHANNEL_SUCCESS: - break; - case NET_SSH2_MSG_CHANNEL_FAILURE: - default: - user_error('Unable to request pseudo-terminal'); - return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); - } - $this->in_request_pty_exec = true; - } - - // sending a pty-req SSH_MSG_CHANNEL_REQUEST message is unnecessary and, in fact, in most cases, slows things - // down. the one place where it might be desirable is if you're doing something like Net_SSH2::exec('ping localhost &'). - // with a pty-req SSH_MSG_CHANNEL_REQUEST, exec() will return immediately and the ping process will then - // then immediately terminate. without such a request exec() will loop indefinitely. the ping process won't end but - // neither will your script. - - // although, in theory, the size of SSH_MSG_CHANNEL_REQUEST could exceed the maximum packet size established by - // SSH_MSG_CHANNEL_OPEN_CONFIRMATION, RFC4254#section-5.1 states that the "maximum packet size" refers to the - // "maximum size of an individual data packet". ie. SSH_MSG_CHANNEL_DATA. RFC4254#section-5.2 corroborates. - $packet = pack('CNNa*CNa*', - NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SSH2_CHANNEL_EXEC], strlen('exec'), 'exec', 1, strlen($command), $command); - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $this->channel_status[NET_SSH2_CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_REQUEST; - - $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_EXEC); - if ($response === false) { - return false; - } - - $this->channel_status[NET_SSH2_CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_DATA; - - if ($callback === false || $this->in_request_pty_exec) { - return true; - } - - $output = ''; - while (true) { - $temp = $this->_get_channel_packet(NET_SSH2_CHANNEL_EXEC); - switch (true) { - case $temp === true: - return is_callable($callback) ? true : $output; - case $temp === false: - return false; - default: - if (is_callable($callback)) { - if (call_user_func($callback, $temp) === true) { - $this->_close_channel(NET_SSH2_CHANNEL_EXEC); - return true; - } - } else { - $output.= $temp; - } - } - } - } - - /** - * Creates an interactive shell - * - * @see Net_SSH2::read() - * @see Net_SSH2::write() - * @return Boolean - * @access private - */ - function _initShell() - { - if ($this->in_request_pty_exec === true) { - return true; - } - - $this->window_size_server_to_client[NET_SSH2_CHANNEL_SHELL] = $this->window_size; - $packet_size = 0x4000; - - $packet = pack('CNa*N3', - NET_SSH2_MSG_CHANNEL_OPEN, strlen('session'), 'session', NET_SSH2_CHANNEL_SHELL, $this->window_size_server_to_client[NET_SSH2_CHANNEL_SHELL], $packet_size); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $this->channel_status[NET_SSH2_CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_OPEN; - - $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_SHELL); - if ($response === false) { - return false; - } - - $terminal_modes = pack('C', NET_SSH2_TTY_OP_END); - $packet = pack('CNNa*CNa*N5a*', - NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SSH2_CHANNEL_SHELL], strlen('pty-req'), 'pty-req', 1, strlen('vt100'), 'vt100', - $this->windowColumns, $this->windowRows, 0, 0, strlen($terminal_modes), $terminal_modes); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - - list(, $type) = unpack('C', $this->_string_shift($response, 1)); - - switch ($type) { - case NET_SSH2_MSG_CHANNEL_SUCCESS: - // if a pty can't be opened maybe commands can still be executed - case NET_SSH2_MSG_CHANNEL_FAILURE: - break; - default: - user_error('Unable to request pseudo-terminal'); - return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); - } - - $packet = pack('CNNa*C', - NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SSH2_CHANNEL_SHELL], strlen('shell'), 'shell', 1); - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $this->channel_status[NET_SSH2_CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_REQUEST; - - $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_SHELL); - if ($response === false) { - return false; - } - - $this->channel_status[NET_SSH2_CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_DATA; - - $this->bitmap |= NET_SSH2_MASK_SHELL; - - return true; - } - - /** - * Return the channel to be used with read() / write() - * - * @see Net_SSH2::read() - * @see Net_SSH2::write() - * @return Integer - * @access public - */ - function _get_interactive_channel() - { - switch (true) { - case $this->in_subsystem: - return NET_SSH2_CHANNEL_SUBSYSTEM; - case $this->in_request_pty_exec: - return NET_SSH2_CHANNEL_EXEC; - default: - return NET_SSH2_CHANNEL_SHELL; - } - } - - /** - * Returns the output of an interactive shell - * - * Returns when there's a match for $expect, which can take the form of a string literal or, - * if $mode == NET_SSH2_READ_REGEX, a regular expression. - * - * @see Net_SSH2::write() - * @param String $expect - * @param Integer $mode - * @return String - * @access public - */ - function read($expect = '', $mode = NET_SSH2_READ_SIMPLE) - { - $this->curTimeout = $this->timeout; - $this->is_timeout = false; - - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - user_error('Operation disallowed prior to login()'); - return false; - } - - if (!($this->bitmap & NET_SSH2_MASK_SHELL) && !$this->_initShell()) { - user_error('Unable to initiate an interactive shell session'); - return false; - } - - $channel = $this->_get_interactive_channel(); - - $match = $expect; - while (true) { - if ($mode == NET_SSH2_READ_REGEX) { - preg_match($expect, $this->interactiveBuffer, $matches); - $match = isset($matches[0]) ? $matches[0] : ''; - } - $pos = strlen($match) ? strpos($this->interactiveBuffer, $match) : false; - if ($pos !== false) { - return $this->_string_shift($this->interactiveBuffer, $pos + strlen($match)); - } - $response = $this->_get_channel_packet($channel); - if (is_bool($response)) { - $this->in_request_pty_exec = false; - return $response ? $this->_string_shift($this->interactiveBuffer, strlen($this->interactiveBuffer)) : false; - } - - $this->interactiveBuffer.= $response; - } - } - - /** - * Inputs a command into an interactive shell. - * - * @see Net_SSH2::read() - * @param String $cmd - * @return Boolean - * @access public - */ - function write($cmd) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - user_error('Operation disallowed prior to login()'); - return false; - } - - if (!($this->bitmap & NET_SSH2_MASK_SHELL) && !$this->_initShell()) { - user_error('Unable to initiate an interactive shell session'); - return false; - } - - return $this->_send_channel_packet($this->_get_interactive_channel(), $cmd); - } - - /** - * Start a subsystem. - * - * Right now only one subsystem at a time is supported. To support multiple subsystem's stopSubsystem() could accept - * a string that contained the name of the subsystem, but at that point, only one subsystem of each type could be opened. - * To support multiple subsystem's of the same name maybe it'd be best if startSubsystem() generated a new channel id and - * returns that and then that that was passed into stopSubsystem() but that'll be saved for a future date and implemented - * if there's sufficient demand for such a feature. - * - * @see Net_SSH2::stopSubsystem() - * @param String $subsystem - * @return Boolean - * @access public - */ - function startSubsystem($subsystem) - { - $this->window_size_server_to_client[NET_SSH2_CHANNEL_SUBSYSTEM] = $this->window_size; - - $packet = pack('CNa*N3', - NET_SSH2_MSG_CHANNEL_OPEN, strlen('session'), 'session', NET_SSH2_CHANNEL_SUBSYSTEM, $this->window_size, 0x4000); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $this->channel_status[NET_SSH2_CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_OPEN; - - $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_SUBSYSTEM); - if ($response === false) { - return false; - } - - $packet = pack('CNNa*CNa*', - NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SSH2_CHANNEL_SUBSYSTEM], strlen('subsystem'), 'subsystem', 1, strlen($subsystem), $subsystem); - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $this->channel_status[NET_SSH2_CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_REQUEST; - - $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_SUBSYSTEM); - - if ($response === false) { - return false; - } - - $this->channel_status[NET_SSH2_CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_DATA; - - $this->bitmap |= NET_SSH2_MASK_SHELL; - $this->in_subsystem = true; - - return true; - } - - /** - * Stops a subsystem. - * - * @see Net_SSH2::startSubsystem() - * @return Boolean - * @access public - */ - function stopSubsystem() - { - $this->in_subsystem = false; - $this->_close_channel(NET_SSH2_CHANNEL_SUBSYSTEM); - return true; - } - - /** - * Closes a channel - * - * If read() timed out you might want to just close the channel and have it auto-restart on the next read() call - * - * @access public - */ - function reset() - { - $this->_close_channel($this->_get_interactive_channel()); - } - - /** - * Is timeout? - * - * Did exec() or read() return because they timed out or because they encountered the end? - * - * @access public - */ - function isTimeout() - { - return $this->is_timeout; - } - - /** - * Disconnect - * - * @access public - */ - function disconnect() - { - $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); - if (isset($this->realtime_log_file) && is_resource($this->realtime_log_file)) { - fclose($this->realtime_log_file); - } - } - - /** - * Destructor. - * - * Will be called, automatically, if you're supporting just PHP5. If you're supporting PHP4, you'll need to call - * disconnect(). - * - * @access public - */ - function __destruct() - { - $this->disconnect(); - } - - /** - * Is the connection still active? - * - * @return boolean - * @access public - */ - function isConnected() - { - return (bool) ($this->bitmap & NET_SSH2_MASK_CONNECTED); - } - - /** - * Gets Binary Packets - * - * See '6. Binary Packet Protocol' of rfc4253 for more info. - * - * @see Net_SSH2::_send_binary_packet() - * @return String - * @access private - */ - function _get_binary_packet() - { - if (!is_resource($this->fsock) || feof($this->fsock)) { - user_error('Connection closed prematurely'); - $this->bitmap = 0; - return false; - } - - $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 - $raw = fread($this->fsock, $this->decrypt_block_size); - - if (!strlen($raw)) { - return ''; - } - - if ($this->decrypt !== false) { - $raw = $this->decrypt->decrypt($raw); - } - if ($raw === false) { - user_error('Unable to decrypt content'); - return false; - } - - extract(unpack('Npacket_length/Cpadding_length', $this->_string_shift($raw, 5))); - - $remaining_length = $packet_length + 4 - $this->decrypt_block_size; - - // quoting , - // "implementations SHOULD check that the packet length is reasonable" - // PuTTY uses 0x9000 as the actual max packet size and so to shall we - if ($remaining_length < -$this->decrypt_block_size || $remaining_length > 0x9000 || $remaining_length % $this->decrypt_block_size != 0) { - user_error('Invalid size'); - return false; - } - - $buffer = ''; - while ($remaining_length > 0) { - $temp = fread($this->fsock, $remaining_length); - if ($temp === false || feof($this->fsock)) { - user_error('Error reading from socket'); - $this->bitmap = 0; - return false; - } - $buffer.= $temp; - $remaining_length-= strlen($temp); - } - $stop = strtok(microtime(), ' ') + strtok(''); - if (strlen($buffer)) { - $raw.= $this->decrypt !== false ? $this->decrypt->decrypt($buffer) : $buffer; - } - - $payload = $this->_string_shift($raw, $packet_length - $padding_length - 1); - $padding = $this->_string_shift($raw, $padding_length); // should leave $raw empty - - if ($this->hmac_check !== false) { - $hmac = fread($this->fsock, $this->hmac_size); - if ($hmac === false || strlen($hmac) != $this->hmac_size) { - user_error('Error reading socket'); - $this->bitmap = 0; - return false; - } elseif ($hmac != $this->hmac_check->hash(pack('NNCa*', $this->get_seq_no, $packet_length, $padding_length, $payload . $padding))) { - user_error('Invalid HMAC'); - return false; - } - } - - //if ($this->decompress) { - // $payload = gzinflate(substr($payload, 2)); - //} - - $this->get_seq_no++; - - if (defined('NET_SSH2_LOGGING')) { - $current = strtok(microtime(), ' ') + strtok(''); - $message_number = isset($this->message_numbers[ord($payload[0])]) ? $this->message_numbers[ord($payload[0])] : 'UNKNOWN (' . ord($payload[0]) . ')'; - $message_number = '<- ' . $message_number . - ' (since last: ' . round($current - $this->last_packet, 4) . ', network: ' . round($stop - $start, 4) . 's)'; - $this->_append_log($message_number, $payload); - $this->last_packet = $current; - } - - return $this->_filter($payload); - } - - /** - * Filter Binary Packets - * - * Because some binary packets need to be ignored... - * - * @see Net_SSH2::_get_binary_packet() - * @return String - * @access private - */ - function _filter($payload) - { - switch (ord($payload[0])) { - case NET_SSH2_MSG_DISCONNECT: - $this->_string_shift($payload, 1); - extract(unpack('Nreason_code/Nlength', $this->_string_shift($payload, 8))); - $this->errors[] = 'SSH_MSG_DISCONNECT: ' . $this->disconnect_reasons[$reason_code] . "\r\n" . utf8_decode($this->_string_shift($payload, $length)); - $this->bitmap = 0; - return false; - case NET_SSH2_MSG_IGNORE: - $payload = $this->_get_binary_packet(); - break; - case NET_SSH2_MSG_DEBUG: - $this->_string_shift($payload, 2); - extract(unpack('Nlength', $this->_string_shift($payload, 4))); - $this->errors[] = 'SSH_MSG_DEBUG: ' . utf8_decode($this->_string_shift($payload, $length)); - $payload = $this->_get_binary_packet(); - break; - case NET_SSH2_MSG_UNIMPLEMENTED: - return false; - case NET_SSH2_MSG_KEXINIT: - if ($this->session_id !== false) { - if (!$this->_key_exchange($payload)) { - $this->bitmap = 0; - return false; - } - $payload = $this->_get_binary_packet(); - } - } - - // see http://tools.ietf.org/html/rfc4252#section-5.4; only called when the encryption has been activated and when we haven't already logged in - if (($this->bitmap & NET_SSH2_MASK_CONNECTED) && !($this->bitmap & NET_SSH2_MASK_LOGIN) && ord($payload[0]) == NET_SSH2_MSG_USERAUTH_BANNER) { - $this->_string_shift($payload, 1); - extract(unpack('Nlength', $this->_string_shift($payload, 4))); - $this->banner_message = utf8_decode($this->_string_shift($payload, $length)); - $payload = $this->_get_binary_packet(); - } - - // only called when we've already logged in - if (($this->bitmap & NET_SSH2_MASK_CONNECTED) && ($this->bitmap & NET_SSH2_MASK_LOGIN)) { - switch (ord($payload[0])) { - case NET_SSH2_MSG_GLOBAL_REQUEST: // see http://tools.ietf.org/html/rfc4254#section-4 - $this->_string_shift($payload, 1); - extract(unpack('Nlength', $this->_string_shift($payload))); - $this->errors[] = 'SSH_MSG_GLOBAL_REQUEST: ' . utf8_decode($this->_string_shift($payload, $length)); - - if (!$this->_send_binary_packet(pack('C', NET_SSH2_MSG_REQUEST_FAILURE))) { - return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); - } - - $payload = $this->_get_binary_packet(); - break; - case NET_SSH2_MSG_CHANNEL_OPEN: // see http://tools.ietf.org/html/rfc4254#section-5.1 - $this->_string_shift($payload, 1); - extract(unpack('Nlength', $this->_string_shift($payload, 4))); - $this->errors[] = 'SSH_MSG_CHANNEL_OPEN: ' . utf8_decode($this->_string_shift($payload, $length)); - - $this->_string_shift($payload, 4); // skip over client channel - extract(unpack('Nserver_channel', $this->_string_shift($payload, 4))); - - $packet = pack('CN3a*Na*', - NET_SSH2_MSG_REQUEST_FAILURE, $server_channel, NET_SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED, 0, '', 0, ''); - - if (!$this->_send_binary_packet($packet)) { - return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); - } - - $payload = $this->_get_binary_packet(); - break; - case NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST: - $this->_string_shift($payload, 1); - extract(unpack('Nchannel', $this->_string_shift($payload, 4))); - extract(unpack('Nwindow_size', $this->_string_shift($payload, 4))); - $this->window_size_client_to_server[$channel]+= $window_size; - - $payload = ($this->bitmap & NET_SSH2_MASK_WINDOW_ADJUST) ? true : $this->_get_binary_packet(); - } - } - - return $payload; - } - - /** - * Enable Quiet Mode - * - * Suppress stderr from output - * - * @access public - */ - function enableQuietMode() - { - $this->quiet_mode = true; - } - - /** - * Disable Quiet Mode - * - * Show stderr in output - * - * @access public - */ - function disableQuietMode() - { - $this->quiet_mode = false; - } - - /** - * Returns whether Quiet Mode is enabled or not - * - * @see Net_SSH2::enableQuietMode() - * @see Net_SSH2::disableQuietMode() - * - * @access public - * @return boolean - */ - function isQuietModeEnabled() - { - return $this->quiet_mode; - } - - /** - * Enable request-pty when using exec() - * - * @access public - */ - function enablePTY() - { - $this->request_pty = true; - } - - /** - * Disable request-pty when using exec() - * - * @access public - */ - function disablePTY() - { - $this->request_pty = false; - } - - /** - * Returns whether request-pty is enabled or not - * - * @see Net_SSH2::enablePTY() - * @see Net_SSH2::disablePTY() - * - * @access public - * @return boolean - */ - function isPTYEnabled() - { - return $this->request_pty; - } - - /** - * Gets channel data - * - * Returns the data as a string if it's available and false if not. - * - * @param $client_channel - * @return Mixed - * @access private - */ - function _get_channel_packet($client_channel, $skip_extended = false) - { - if (!empty($this->channel_buffers[$client_channel])) { - return array_shift($this->channel_buffers[$client_channel]); - } - - while (true) { - if ($this->curTimeout) { - if ($this->curTimeout < 0) { - $this->is_timeout = true; - return true; - } - - $read = array($this->fsock); - $write = $except = null; - - $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 - $sec = floor($this->curTimeout); - $usec = 1000000 * ($this->curTimeout - $sec); - // on windows this returns a "Warning: Invalid CRT parameters detected" error - if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) { - $this->is_timeout = true; - return true; - } - $elapsed = strtok(microtime(), ' ') + strtok('') - $start; - $this->curTimeout-= $elapsed; - } - - $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - if ($client_channel == -1 && $response === true) { - return true; - } - if (!strlen($response)) { - return ''; - } - - extract(unpack('Ctype/Nchannel', $this->_string_shift($response, 5))); - - $this->window_size_server_to_client[$channel]-= strlen($response); - - // resize the window, if appropriate - if ($this->window_size_server_to_client[$channel] < 0) { - $packet = pack('CNN', NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST, $this->server_channels[$channel], $this->window_size); - if (!$this->_send_binary_packet($packet)) { - return false; - } - $this->window_size_server_to_client[$channel]+= $this->window_size; - } - - switch ($this->channel_status[$channel]) { - case NET_SSH2_MSG_CHANNEL_OPEN: - switch ($type) { - case NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION: - extract(unpack('Nserver_channel', $this->_string_shift($response, 4))); - $this->server_channels[$channel] = $server_channel; - extract(unpack('Nwindow_size', $this->_string_shift($response, 4))); - $this->window_size_client_to_server[$channel] = $window_size; - $temp = unpack('Npacket_size_client_to_server', $this->_string_shift($response, 4)); - $this->packet_size_client_to_server[$channel] = $temp['packet_size_client_to_server']; - return $client_channel == $channel ? true : $this->_get_channel_packet($client_channel, $skip_extended); - //case NET_SSH2_MSG_CHANNEL_OPEN_FAILURE: - default: - user_error('Unable to open channel'); - return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); - } - break; - case NET_SSH2_MSG_CHANNEL_REQUEST: - switch ($type) { - case NET_SSH2_MSG_CHANNEL_SUCCESS: - return true; - case NET_SSH2_MSG_CHANNEL_FAILURE: - return false; - default: - user_error('Unable to fulfill channel request'); - return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); - } - case NET_SSH2_MSG_CHANNEL_CLOSE: - return $type == NET_SSH2_MSG_CHANNEL_CLOSE ? true : $this->_get_channel_packet($client_channel, $skip_extended); - } - - // ie. $this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_DATA - - switch ($type) { - case NET_SSH2_MSG_CHANNEL_DATA: - /* - if ($channel == NET_SSH2_CHANNEL_EXEC) { - // SCP requires null packets, such as this, be sent. further, in the case of the ssh.com SSH server - // this actually seems to make things twice as fast. more to the point, the message right after - // SSH_MSG_CHANNEL_DATA (usually SSH_MSG_IGNORE) won't block for as long as it would have otherwise. - // in OpenSSH it slows things down but only by a couple thousandths of a second. - $this->_send_channel_packet($channel, chr(0)); - } - */ - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $data = $this->_string_shift($response, $length); - if ($client_channel == $channel) { - return $data; - } - if (!isset($this->channel_buffers[$channel])) { - $this->channel_buffers[$channel] = array(); - } - $this->channel_buffers[$channel][] = $data; - break; - case NET_SSH2_MSG_CHANNEL_EXTENDED_DATA: - /* - if ($client_channel == NET_SSH2_CHANNEL_EXEC) { - $this->_send_channel_packet($client_channel, chr(0)); - } - */ - // currently, there's only one possible value for $data_type_code: NET_SSH2_EXTENDED_DATA_STDERR - extract(unpack('Ndata_type_code/Nlength', $this->_string_shift($response, 8))); - $data = $this->_string_shift($response, $length); - $this->stdErrorLog.= $data; - if ($skip_extended || $this->quiet_mode) { - break; - } - if ($client_channel == $channel) { - return $data; - } - if (!isset($this->channel_buffers[$channel])) { - $this->channel_buffers[$channel] = array(); - } - $this->channel_buffers[$channel][] = $data; - break; - case NET_SSH2_MSG_CHANNEL_REQUEST: - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $value = $this->_string_shift($response, $length); - switch ($value) { - case 'exit-signal': - $this->_string_shift($response, 1); - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $this->errors[] = 'SSH_MSG_CHANNEL_REQUEST (exit-signal): ' . $this->_string_shift($response, $length); - $this->_string_shift($response, 1); - extract(unpack('Nlength', $this->_string_shift($response, 4))); - if ($length) { - $this->errors[count($this->errors)].= "\r\n" . $this->_string_shift($response, $length); - } - - $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_EOF, $this->server_channels[$client_channel])); - $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$channel])); - - $this->channel_status[$channel] = NET_SSH2_MSG_CHANNEL_EOF; - - break; - case 'exit-status': - extract(unpack('Cfalse/Nexit_status', $this->_string_shift($response, 5))); - $this->exit_status = $exit_status; - - // "The client MAY ignore these messages." - // -- http://tools.ietf.org/html/rfc4254#section-6.10 - - break; - default: - // "Some systems may not implement signals, in which case they SHOULD ignore this message." - // -- http://tools.ietf.org/html/rfc4254#section-6.9 - break; - } - break; - case NET_SSH2_MSG_CHANNEL_CLOSE: - $this->curTimeout = 0; - - if ($this->bitmap & NET_SSH2_MASK_SHELL) { - $this->bitmap&= ~NET_SSH2_MASK_SHELL; - } - if ($this->channel_status[$channel] != NET_SSH2_MSG_CHANNEL_EOF) { - $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$channel])); - } - - $this->channel_status[$channel] = NET_SSH2_MSG_CHANNEL_CLOSE; - return true; - case NET_SSH2_MSG_CHANNEL_EOF: - break; - default: - user_error('Error reading channel data'); - return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); - } - } - } - - /** - * Sends Binary Packets - * - * See '6. Binary Packet Protocol' of rfc4253 for more info. - * - * @param String $data - * @param optional String $logged - * @see Net_SSH2::_get_binary_packet() - * @return Boolean - * @access private - */ - function _send_binary_packet($data, $logged = null) - { - if (!is_resource($this->fsock) || feof($this->fsock)) { - user_error('Connection closed prematurely'); - $this->bitmap = 0; - return false; - } - - //if ($this->compress) { - // // the -4 removes the checksum: - // // http://php.net/function.gzcompress#57710 - // $data = substr(gzcompress($data), 0, -4); - //} - - // 4 (packet length) + 1 (padding length) + 4 (minimal padding amount) == 9 - $packet_length = strlen($data) + 9; - // round up to the nearest $this->encrypt_block_size - $packet_length+= (($this->encrypt_block_size - 1) * $packet_length) % $this->encrypt_block_size; - // subtracting strlen($data) is obvious - subtracting 5 is necessary because of packet_length and padding_length - $padding_length = $packet_length - strlen($data) - 5; - $padding = crypt_random_string($padding_length); - - // we subtract 4 from packet_length because the packet_length field isn't supposed to include itself - $packet = pack('NCa*', $packet_length - 4, $padding_length, $data . $padding); - - $hmac = $this->hmac_create !== false ? $this->hmac_create->hash(pack('Na*', $this->send_seq_no, $packet)) : ''; - $this->send_seq_no++; - - if ($this->encrypt !== false) { - $packet = $this->encrypt->encrypt($packet); - } - - $packet.= $hmac; - - $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 - $result = strlen($packet) == fputs($this->fsock, $packet); - $stop = strtok(microtime(), ' ') + strtok(''); - - if (defined('NET_SSH2_LOGGING')) { - $current = strtok(microtime(), ' ') + strtok(''); - $message_number = isset($this->message_numbers[ord($data[0])]) ? $this->message_numbers[ord($data[0])] : 'UNKNOWN (' . ord($data[0]) . ')'; - $message_number = '-> ' . $message_number . - ' (since last: ' . round($current - $this->last_packet, 4) . ', network: ' . round($stop - $start, 4) . 's)'; - $this->_append_log($message_number, isset($logged) ? $logged : $data); - $this->last_packet = $current; - } - - return $result; - } - - /** - * Logs data packets - * - * Makes sure that only the last 1MB worth of packets will be logged - * - * @param String $data - * @access private - */ - function _append_log($message_number, $message) - { - // remove the byte identifying the message type from all but the first two messages (ie. the identification strings) - if (strlen($message_number) > 2) { - $this->_string_shift($message); - } - - switch (NET_SSH2_LOGGING) { - // useful for benchmarks - case NET_SSH2_LOG_SIMPLE: - $this->message_number_log[] = $message_number; - break; - // the most useful log for SSH2 - case NET_SSH2_LOG_COMPLEX: - $this->message_number_log[] = $message_number; - $this->log_size+= strlen($message); - $this->message_log[] = $message; - while ($this->log_size > NET_SSH2_LOG_MAX_SIZE) { - $this->log_size-= strlen(array_shift($this->message_log)); - array_shift($this->message_number_log); - } - break; - // dump the output out realtime; packets may be interspersed with non packets, - // passwords won't be filtered out and select other packets may not be correctly - // identified - case NET_SSH2_LOG_REALTIME: - switch (PHP_SAPI) { - case 'cli': - $start = $stop = "\r\n"; - break; - default: - $start = '
';
-                        $stop = '
'; - } - echo $start . $this->_format_log(array($message), array($message_number)) . $stop; - @flush(); - @ob_flush(); - break; - // basically the same thing as NET_SSH2_LOG_REALTIME with the caveat that NET_SSH2_LOG_REALTIME_FILE - // needs to be defined and that the resultant log file will be capped out at NET_SSH2_LOG_MAX_SIZE. - // the earliest part of the log file is denoted by the first <<< START >>> and is not going to necessarily - // at the beginning of the file - case NET_SSH2_LOG_REALTIME_FILE: - if (!isset($this->realtime_log_file)) { - // PHP doesn't seem to like using constants in fopen() - $filename = NET_SSH2_LOG_REALTIME_FILENAME; - $fp = fopen($filename, 'w'); - $this->realtime_log_file = $fp; - } - if (!is_resource($this->realtime_log_file)) { - break; - } - $entry = $this->_format_log(array($message), array($message_number)); - if ($this->realtime_log_wrap) { - $temp = "<<< START >>>\r\n"; - $entry.= $temp; - fseek($this->realtime_log_file, ftell($this->realtime_log_file) - strlen($temp)); - } - $this->realtime_log_size+= strlen($entry); - if ($this->realtime_log_size > NET_SSH2_LOG_MAX_SIZE) { - fseek($this->realtime_log_file, 0); - $this->realtime_log_size = strlen($entry); - $this->realtime_log_wrap = true; - } - fputs($this->realtime_log_file, $entry); - } - } - - /** - * Sends channel data - * - * Spans multiple SSH_MSG_CHANNEL_DATAs if appropriate - * - * @param Integer $client_channel - * @param String $data - * @return Boolean - * @access private - */ - function _send_channel_packet($client_channel, $data) - { - while (strlen($data)) { - if (!$this->window_size_client_to_server[$client_channel]) { - $this->bitmap^= NET_SSH2_MASK_WINDOW_ADJUST; - // using an invalid channel will let the buffers be built up for the valid channels - $this->_get_channel_packet(-1); - $this->bitmap^= NET_SSH2_MASK_WINDOW_ADJUST; - } - - /* The maximum amount of data allowed is determined by the maximum - packet size for the channel, and the current window size, whichever - is smaller. - -- http://tools.ietf.org/html/rfc4254#section-5.2 */ - $max_size = min( - $this->packet_size_client_to_server[$client_channel], - $this->window_size_client_to_server[$client_channel] - ); - - $temp = $this->_string_shift($data, $max_size); - $packet = pack('CN2a*', - NET_SSH2_MSG_CHANNEL_DATA, - $this->server_channels[$client_channel], - strlen($temp), - $temp - ); - $this->window_size_client_to_server[$client_channel]-= strlen($temp); - if (!$this->_send_binary_packet($packet)) { - return false; - } - } - - return true; - } - - /** - * Closes and flushes a channel - * - * Net_SSH2 doesn't properly close most channels. For exec() channels are normally closed by the server - * and for SFTP channels are presumably closed when the client disconnects. This functions is intended - * for SCP more than anything. - * - * @param Integer $client_channel - * @param Boolean $want_reply - * @return Boolean - * @access private - */ - function _close_channel($client_channel, $want_reply = false) - { - // see http://tools.ietf.org/html/rfc4254#section-5.3 - - $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_EOF, $this->server_channels[$client_channel])); - - if (!$want_reply) { - $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$client_channel])); - } - - $this->channel_status[$client_channel] = NET_SSH2_MSG_CHANNEL_CLOSE; - - $this->curTimeout = 0; - - while (!is_bool($this->_get_channel_packet($client_channel))); - - if ($want_reply) { - $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$client_channel])); - } - - if ($this->bitmap & NET_SSH2_MASK_SHELL) { - $this->bitmap&= ~NET_SSH2_MASK_SHELL; - } - } - - /** - * Disconnect - * - * @param Integer $reason - * @return Boolean - * @access private - */ - function _disconnect($reason) - { - if ($this->bitmap & NET_SSH2_MASK_CONNECTED) { - $data = pack('CNNa*Na*', NET_SSH2_MSG_DISCONNECT, $reason, 0, '', 0, ''); - $this->_send_binary_packet($data); - $this->bitmap = 0; - fclose($this->fsock); - return false; - } - } - - /** - * String Shift - * - * Inspired by array_shift - * - * @param String $string - * @param optional Integer $index - * @return String - * @access private - */ - function _string_shift(&$string, $index = 1) - { - $substr = substr($string, 0, $index); - $string = substr($string, $index); - return $substr; - } - - /** - * Define Array - * - * Takes any number of arrays whose indices are integers and whose values are strings and defines a bunch of - * named constants from it, using the value as the name of the constant and the index as the value of the constant. - * If any of the constants that would be defined already exists, none of the constants will be defined. - * - * @param Array $array - * @access private - */ - function _define_array() - { - $args = func_get_args(); - foreach ($args as $arg) { - foreach ($arg as $key=>$value) { - if (!defined($value)) { - define($value, $key); - } else { - break 2; - } - } - } - } - - /** - * Returns a log of the packets that have been sent and received. - * - * Returns a string if NET_SSH2_LOGGING == NET_SSH2_LOG_COMPLEX, an array if NET_SSH2_LOGGING == NET_SSH2_LOG_SIMPLE and false if !defined('NET_SSH2_LOGGING') - * - * @access public - * @return String or Array - */ - function getLog() - { - if (!defined('NET_SSH2_LOGGING')) { - return false; - } - - switch (NET_SSH2_LOGGING) { - case NET_SSH2_LOG_SIMPLE: - return $this->message_number_log; - break; - case NET_SSH2_LOG_COMPLEX: - return $this->_format_log($this->message_log, $this->message_number_log); - break; - default: - return false; - } - } - - /** - * Formats a log for printing - * - * @param Array $message_log - * @param Array $message_number_log - * @access private - * @return String - */ - function _format_log($message_log, $message_number_log) - { - $output = ''; - for ($i = 0; $i < count($message_log); $i++) { - $output.= $message_number_log[$i] . "\r\n"; - $current_log = $message_log[$i]; - $j = 0; - do { - if (strlen($current_log)) { - $output.= str_pad(dechex($j), 7, '0', STR_PAD_LEFT) . '0 '; - } - $fragment = $this->_string_shift($current_log, $this->log_short_width); - $hex = substr(preg_replace_callback('#.#s', array($this, '_format_log_helper'), $fragment), strlen($this->log_boundary)); - // replace non ASCII printable characters with dots - // http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters - // also replace < with a . since < messes up the output on web browsers - $raw = preg_replace('#[^\x20-\x7E]|<#', '.', $fragment); - $output.= str_pad($hex, $this->log_long_width - $this->log_short_width, ' ') . $raw . "\r\n"; - $j++; - } while (strlen($current_log)); - $output.= "\r\n"; - } - - return $output; - } - - /** - * Helper function for _format_log - * - * For use with preg_replace_callback() - * - * @param Array $matches - * @access private - * @return String - */ - function _format_log_helper($matches) - { - return $this->log_boundary . str_pad(dechex(ord($matches[0])), 2, '0', STR_PAD_LEFT); - } - - /** - * Returns all errors - * - * @return String - * @access public - */ - function getErrors() - { - return $this->errors; - } - - /** - * Returns the last error - * - * @return String - * @access public - */ - function getLastError() - { - return $this->errors[count($this->errors) - 1]; - } - - /** - * Return the server identification. - * - * @return String - * @access public - */ - function getServerIdentification() - { - $this->_connect(); - - return $this->server_identifier; - } - - /** - * Return a list of the key exchange algorithms the server supports. - * - * @return Array - * @access public - */ - function getKexAlgorithms() - { - $this->_connect(); - - return $this->kex_algorithms; - } - - /** - * Return a list of the host key (public key) algorithms the server supports. - * - * @return Array - * @access public - */ - function getServerHostKeyAlgorithms() - { - $this->_connect(); - - return $this->server_host_key_algorithms; - } - - /** - * Return a list of the (symmetric key) encryption algorithms the server supports, when receiving stuff from the client. - * - * @return Array - * @access public - */ - function getEncryptionAlgorithmsClient2Server() - { - $this->_connect(); - - return $this->encryption_algorithms_client_to_server; - } - - /** - * Return a list of the (symmetric key) encryption algorithms the server supports, when sending stuff to the client. - * - * @return Array - * @access public - */ - function getEncryptionAlgorithmsServer2Client() - { - $this->_connect(); - - return $this->encryption_algorithms_server_to_client; - } - - /** - * Return a list of the MAC algorithms the server supports, when receiving stuff from the client. - * - * @return Array - * @access public - */ - function getMACAlgorithmsClient2Server() - { - $this->_connect(); - - return $this->mac_algorithms_client_to_server; - } - - /** - * Return a list of the MAC algorithms the server supports, when sending stuff to the client. - * - * @return Array - * @access public - */ - function getMACAlgorithmsServer2Client() - { - $this->_connect(); - - return $this->mac_algorithms_server_to_client; - } - - /** - * Return a list of the compression algorithms the server supports, when receiving stuff from the client. - * - * @return Array - * @access public - */ - function getCompressionAlgorithmsClient2Server() - { - $this->_connect(); - - return $this->compression_algorithms_client_to_server; - } - - /** - * Return a list of the compression algorithms the server supports, when sending stuff to the client. - * - * @return Array - * @access public - */ - function getCompressionAlgorithmsServer2Client() - { - $this->_connect(); - - return $this->compression_algorithms_server_to_client; - } - - /** - * Return a list of the languages the server supports, when sending stuff to the client. - * - * @return Array - * @access public - */ - function getLanguagesServer2Client() - { - $this->_connect(); - - return $this->languages_server_to_client; - } - - /** - * Return a list of the languages the server supports, when receiving stuff from the client. - * - * @return Array - * @access public - */ - function getLanguagesClient2Server() - { - $this->_connect(); - - return $this->languages_client_to_server; - } - - /** - * Returns the banner message. - * - * Quoting from the RFC, "in some jurisdictions, sending a warning message before - * authentication may be relevant for getting legal protection." - * - * @return String - * @access public - */ - function getBannerMessage() - { - return $this->banner_message; - } - - /** - * Returns the server public host key. - * - * Caching this the first time you connect to a server and checking the result on subsequent connections - * is recommended. Returns false if the server signature is not signed correctly with the public host key. - * - * @return Mixed - * @access public - */ - function getServerPublicHostKey() - { - if (!($this->bitmap & NET_SSH2_MASK_CONSTRUCTOR)) { - if (!$this->_connect()) { - return false; - } - } - - $signature = $this->signature; - $server_public_host_key = $this->server_public_host_key; - - extract(unpack('Nlength', $this->_string_shift($server_public_host_key, 4))); - $this->_string_shift($server_public_host_key, $length); - - if ($this->signature_validated) { - return $this->bitmap ? - $this->signature_format . ' ' . base64_encode($this->server_public_host_key) : - false; - } - - $this->signature_validated = true; - - switch ($this->signature_format) { - case 'ssh-dss': - $zero = new Math_BigInteger(); - - $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); - $p = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256); - - $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); - $q = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256); - - $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); - $g = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256); - - $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); - $y = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256); - - /* The value for 'dss_signature_blob' is encoded as a string containing - r, followed by s (which are 160-bit integers, without lengths or - padding, unsigned, and in network byte order). */ - $temp = unpack('Nlength', $this->_string_shift($signature, 4)); - if ($temp['length'] != 40) { - user_error('Invalid signature'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - - $r = new Math_BigInteger($this->_string_shift($signature, 20), 256); - $s = new Math_BigInteger($this->_string_shift($signature, 20), 256); - - switch (true) { - case $r->equals($zero): - case $r->compare($q) >= 0: - case $s->equals($zero): - case $s->compare($q) >= 0: - user_error('Invalid signature'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - - $w = $s->modInverse($q); - - $u1 = $w->multiply(new Math_BigInteger(sha1($this->exchange_hash), 16)); - list(, $u1) = $u1->divide($q); - - $u2 = $w->multiply($r); - list(, $u2) = $u2->divide($q); - - $g = $g->modPow($u1, $p); - $y = $y->modPow($u2, $p); - - $v = $g->multiply($y); - list(, $v) = $v->divide($p); - list(, $v) = $v->divide($q); - - if (!$v->equals($r)) { - user_error('Bad server signature'); - return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); - } - - break; - case 'ssh-rsa': - $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); - $e = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256); - - $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); - $rawN = $this->_string_shift($server_public_host_key, $temp['length']); - $n = new Math_BigInteger($rawN, -256); - $nLength = strlen(ltrim($rawN, "\0")); - - /* - $temp = unpack('Nlength', $this->_string_shift($signature, 4)); - $signature = $this->_string_shift($signature, $temp['length']); - - if (!class_exists('Crypt_RSA')) { - include_once 'Crypt/RSA.php'; - } - - $rsa = new Crypt_RSA(); - $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); - $rsa->loadKey(array('e' => $e, 'n' => $n), CRYPT_RSA_PUBLIC_FORMAT_RAW); - if (!$rsa->verify($this->exchange_hash, $signature)) { - user_error('Bad server signature'); - return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); - } - */ - - $temp = unpack('Nlength', $this->_string_shift($signature, 4)); - $s = new Math_BigInteger($this->_string_shift($signature, $temp['length']), 256); - - // validate an RSA signature per "8.2 RSASSA-PKCS1-v1_5", "5.2.2 RSAVP1", and "9.1 EMSA-PSS" in the - // following URL: - // ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1.pdf - - // also, see SSHRSA.c (rsa2_verifysig) in PuTTy's source. - - if ($s->compare(new Math_BigInteger()) < 0 || $s->compare($n->subtract(new Math_BigInteger(1))) > 0) { - user_error('Invalid signature'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - - $s = $s->modPow($e, $n); - $s = $s->toBytes(); - - $h = pack('N4H*', 0x00302130, 0x0906052B, 0x0E03021A, 0x05000414, sha1($this->exchange_hash)); - $h = chr(0x01) . str_repeat(chr(0xFF), $nLength - 2 - strlen($h)) . $h; - - if ($s != $h) { - user_error('Bad server signature'); - return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); - } - break; - default: - user_error('Unsupported signature format'); - return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); - } - - return $this->signature_format . ' ' . base64_encode($this->server_public_host_key); - } - - /** - * Returns the exit status of an SSH command or false. - * - * @return Integer or false - * @access public - */ - function getExitStatus() - { - if (is_null($this->exit_status)) { - return false; - } - return $this->exit_status; - } - - /** - * Returns the number of columns for the terminal window size. - * - * @return Integer - * @access public - */ - function getWindowColumns() - { - return $this->windowColumns; - } - - /** - * Returns the number of rows for the terminal window size. - * - * @return Integer - * @access public - */ - function getWindowRows() - { - return $this->windowRows; - } - - /** - * Sets the number of columns for the terminal window size. - * - * @param Integer $value - * @access public - */ - function setWindowColumns($value) - { - $this->windowColumns = $value; - } - - /** - * Sets the number of rows for the terminal window size. - * - * @param Integer $value - * @access public - */ - function setWindowRows($value) - { - $this->windowRows = $value; - } - - /** - * Sets the number of columns and rows for the terminal window size. - * - * @param Integer $columns - * @param Integer $rows - * @access public - */ - function setWindowSize($columns = 80, $rows = 24) - { - $this->windowColumns = $columns; - $this->windowRows = $rows; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/System/SSH/Agent.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/System/SSH/Agent.php deleted file mode 100755 index 4c0ef733..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/System/SSH/Agent.php +++ /dev/null @@ -1,313 +0,0 @@ - - * login('username', $agent)) { - * exit('Login Failed'); - * } - * - * echo $ssh->exec('pwd'); - * echo $ssh->exec('ls -la'); - * ?> - * - * - * LICENSE: 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. - * - * @category System - * @package System_SSH_Agent - * @author Jim Wigginton - * @copyright 2014 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - * @internal See http://api.libssh.org/rfc/PROTOCOL.agent - */ - -/**#@+ - * Message numbers - * - * @access private - */ -// to request SSH1 keys you have to use SSH_AGENTC_REQUEST_RSA_IDENTITIES (1) -define('SYSTEM_SSH_AGENTC_REQUEST_IDENTITIES', 11); -// this is the SSH2 response; the SSH1 response is SSH_AGENT_RSA_IDENTITIES_ANSWER (2). -define('SYSTEM_SSH_AGENT_IDENTITIES_ANSWER', 12); -define('SYSTEM_SSH_AGENT_FAILURE', 5); -// the SSH1 request is SSH_AGENTC_RSA_CHALLENGE (3) -define('SYSTEM_SSH_AGENTC_SIGN_REQUEST', 13); -// the SSH1 response is SSH_AGENT_RSA_RESPONSE (4) -define('SYSTEM_SSH_AGENT_SIGN_RESPONSE', 14); -/**#@-*/ - -/** - * Pure-PHP ssh-agent client identity object - * - * Instantiation should only be performed by System_SSH_Agent class. - * This could be thought of as implementing an interface that Crypt_RSA - * implements. ie. maybe a Net_SSH_Auth_PublicKey interface or something. - * The methods in this interface would be getPublicKey, setSignatureMode - * and sign since those are the methods phpseclib looks for to perform - * public key authentication. - * - * @package System_SSH_Agent - * @author Jim Wigginton - * @access internal - */ -class System_SSH_Agent_Identity -{ - /** - * Key Object - * - * @var Crypt_RSA - * @access private - * @see System_SSH_Agent_Identity::getPublicKey() - */ - var $key; - - /** - * Key Blob - * - * @var String - * @access private - * @see System_SSH_Agent_Identity::sign() - */ - var $key_blob; - - /** - * Socket Resource - * - * @var Resource - * @access private - * @see System_SSH_Agent_Identity::sign() - */ - var $fsock; - - /** - * Default Constructor. - * - * @param Resource $fsock - * @return System_SSH_Agent_Identity - * @access private - */ - function System_SSH_Agent_Identity($fsock) - { - $this->fsock = $fsock; - } - - /** - * Set Public Key - * - * Called by System_SSH_Agent::requestIdentities() - * - * @param Crypt_RSA $key - * @access private - */ - function setPublicKey($key) - { - $this->key = $key; - $this->key->setPublicKey(); - } - - /** - * Set Public Key - * - * Called by System_SSH_Agent::requestIdentities(). The key blob could be extracted from $this->key - * but this saves a small amount of computation. - * - * @param String $key_blob - * @access private - */ - function setPublicKeyBlob($key_blob) - { - $this->key_blob = $key_blob; - } - - /** - * Get Public Key - * - * Wrapper for $this->key->getPublicKey() - * - * @param Integer $format optional - * @return Mixed - * @access public - */ - function getPublicKey($format = null) - { - return !isset($format) ? $this->key->getPublicKey() : $this->key->getPublicKey($format); - } - - /** - * Set Signature Mode - * - * Doesn't do anything as ssh-agent doesn't let you pick and choose the signature mode. ie. - * ssh-agent's only supported mode is CRYPT_RSA_SIGNATURE_PKCS1 - * - * @param Integer $mode - * @access public - */ - function setSignatureMode($mode) - { - } - - /** - * Create a signature - * - * See "2.6.2 Protocol 2 private key signature request" - * - * @param String $message - * @return String - * @access public - */ - function sign($message) - { - // the last parameter (currently 0) is for flags and ssh-agent only defines one flag (for ssh-dss): SSH_AGENT_OLD_SIGNATURE - $packet = pack('CNa*Na*N', SYSTEM_SSH_AGENTC_SIGN_REQUEST, strlen($this->key_blob), $this->key_blob, strlen($message), $message, 0); - $packet = pack('Na*', strlen($packet), $packet); - if (strlen($packet) != fputs($this->fsock, $packet)) { - user_error('Connection closed during signing'); - } - - $length = current(unpack('N', fread($this->fsock, 4))); - $type = ord(fread($this->fsock, 1)); - if ($type != SYSTEM_SSH_AGENT_SIGN_RESPONSE) { - user_error('Unable to retreive signature'); - } - - $signature_blob = fread($this->fsock, $length - 1); - // the only other signature format defined - ssh-dss - is the same length as ssh-rsa - // the + 12 is for the other various SSH added length fields - return substr($signature_blob, strlen('ssh-rsa') + 12); - } -} - -/** - * Pure-PHP ssh-agent client identity factory - * - * requestIdentities() method pumps out System_SSH_Agent_Identity objects - * - * @package System_SSH_Agent - * @author Jim Wigginton - * @access internal - */ -class System_SSH_Agent -{ - /** - * Socket Resource - * - * @var Resource - * @access private - */ - var $fsock; - - /** - * Default Constructor - * - * @return System_SSH_Agent - * @access public - */ - function System_SSH_Agent() - { - switch (true) { - case isset($_SERVER['SSH_AUTH_SOCK']): - $address = $_SERVER['SSH_AUTH_SOCK']; - break; - case isset($_ENV['SSH_AUTH_SOCK']): - $address = $_ENV['SSH_AUTH_SOCK']; - break; - default: - user_error('SSH_AUTH_SOCK not found'); - return false; - } - - $this->fsock = fsockopen('unix://' . $address, 0, $errno, $errstr); - if (!$this->fsock) { - user_error("Unable to connect to ssh-agent (Error $errno: $errstr)"); - } - } - - /** - * Request Identities - * - * See "2.5.2 Requesting a list of protocol 2 keys" - * Returns an array containing zero or more System_SSH_Agent_Identity objects - * - * @return Array - * @access public - */ - function requestIdentities() - { - if (!$this->fsock) { - return array(); - } - - $packet = pack('NC', 1, SYSTEM_SSH_AGENTC_REQUEST_IDENTITIES); - if (strlen($packet) != fputs($this->fsock, $packet)) { - user_error('Connection closed while requesting identities'); - } - - $length = current(unpack('N', fread($this->fsock, 4))); - $type = ord(fread($this->fsock, 1)); - if ($type != SYSTEM_SSH_AGENT_IDENTITIES_ANSWER) { - user_error('Unable to request identities'); - } - - $identities = array(); - $keyCount = current(unpack('N', fread($this->fsock, 4))); - for ($i = 0; $i < $keyCount; $i++) { - $length = current(unpack('N', fread($this->fsock, 4))); - $key_blob = fread($this->fsock, $length); - $length = current(unpack('N', fread($this->fsock, 4))); - $key_comment = fread($this->fsock, $length); - $length = current(unpack('N', substr($key_blob, 0, 4))); - $key_type = substr($key_blob, 4, $length); - switch ($key_type) { - case 'ssh-rsa': - if (!class_exists('Crypt_RSA')) { - include_once 'Crypt/RSA.php'; - } - $key = new Crypt_RSA(); - $key->loadKey('ssh-rsa ' . base64_encode($key_blob) . ' ' . $key_comment); - break; - case 'ssh-dss': - // not currently supported - break; - } - // resources are passed by reference by default - if (isset($key)) { - $identity = new System_SSH_Agent_Identity($this->fsock); - $identity->setPublicKey($key); - $identity->setPublicKeyBlob($key_blob); - $identities[] = $identity; - unset($key); - } - } - - return $identities; - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/System/SSH_Agent.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/System/SSH_Agent.php deleted file mode 100755 index ea434b9c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/System/SSH_Agent.php +++ /dev/null @@ -1,39 +0,0 @@ - - * @copyright 2014 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - * @internal See http://api.libssh.org/rfc/PROTOCOL.agent - */ - -require_once 'SSH/Agent.php'; diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/openssl.cnf b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/openssl.cnf deleted file mode 100755 index 2b8b52f9..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/phpseclib/openssl.cnf +++ /dev/null @@ -1,6 +0,0 @@ -# minimalist openssl.cnf file for use with phpseclib - -HOME = . -RANDFILE = $ENV::HOME/.rnd - -[ v3_ca ] diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/COPYING b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/COPYING deleted file mode 100755 index 8e7ddbcf..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/COPYING +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License - -Copyright (c) 2011 Vladimir Andersen - -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. \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/README.md b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/README.md deleted file mode 100755 index f8fa8487..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/README.md +++ /dev/null @@ -1,30 +0,0 @@ -**Spyc** is a YAML loader/dumper written in pure PHP. Given a YAML document, Spyc will return an array that -you can use however you see fit. Given an array, Spyc will return a string which contains a YAML document -built from your data. - -**YAML** is an amazingly human friendly and strikingly versatile data serialization language which can be used -for log files, config files, custom protocols, the works. For more information, see http://www.yaml.org. - -Spyc supports YAML 1.0 specification. - -## Using Spyc - -Using Spyc is trivial: - -``` - - * @author Chris Wanstrath - * @link https://github.com/mustangostang/spyc/ - * @copyright Copyright 2005-2006 Chris Wanstrath, 2006-2011 Vlad Andersen - * @license http://www.opensource.org/licenses/mit-license.php MIT License - * @package Spyc - */ - -if (!function_exists('spyc_load')) { - /** - * Parses YAML to array. - * @param string $string YAML string. - * @return array - */ - function spyc_load ($string) { - return Spyc::YAMLLoadString($string); - } -} - -if (!function_exists('spyc_load_file')) { - /** - * Parses YAML to array. - * @param string $file Path to YAML file. - * @return array - */ - function spyc_load_file ($file) { - return Spyc::YAMLLoad($file); - } -} - -if (!function_exists('spyc_dump')) { - /** - * Dumps array to YAML. - * @param array $data Array. - * @return string - */ - function spyc_dump ($data) { - return Spyc::YAMLDump($data, false, false, true); - } -} - -/** - * The Simple PHP YAML Class. - * - * This class can be used to read a YAML file and convert its contents - * into a PHP array. It currently supports a very limited subsection of - * the YAML spec. - * - * Usage: - * - * $Spyc = new Spyc; - * $array = $Spyc->load($file); - * - * or: - * - * $array = Spyc::YAMLLoad($file); - * - * or: - * - * $array = spyc_load_file($file); - * - * @package Spyc - */ -class Spyc { - - // SETTINGS - - const REMPTY = "\0\0\0\0\0"; - - /** - * Setting this to true will force YAMLDump to enclose any string value in - * quotes. False by default. - * - * @var bool - */ - public $setting_dump_force_quotes = false; - - /** - * Setting this to true will forse YAMLLoad to use syck_load function when - * possible. False by default. - * @var bool - */ - public $setting_use_syck_is_possible = false; - - - - /**#@+ - * @access private - * @var mixed - */ - private $_dumpIndent; - private $_dumpWordWrap; - private $_containsGroupAnchor = false; - private $_containsGroupAlias = false; - private $path; - private $result; - private $LiteralPlaceHolder = '___YAML_Literal_Block___'; - private $SavedGroups = array(); - private $indent; - /** - * Path modifier that should be applied after adding current element. - * @var array - */ - private $delayedPath = array(); - - /**#@+ - * @access public - * @var mixed - */ - public $_nodeId; - -/** - * Load a valid YAML string to Spyc. - * @param string $input - * @return array - */ - public function load ($input) { - return $this->__loadString($input); - } - - /** - * Load a valid YAML file to Spyc. - * @param string $file - * @return array - */ - public function loadFile ($file) { - return $this->__load($file); - } - - /** - * Load YAML into a PHP array statically - * - * The load method, when supplied with a YAML stream (string or file), - * will do its best to convert YAML in a file into a PHP array. Pretty - * simple. - * Usage: - * - * $array = Spyc::YAMLLoad('lucky.yaml'); - * print_r($array); - * - * @access public - * @return array - * @param string $input Path of YAML file or string containing YAML - */ - public static function YAMLLoad($input) { - $Spyc = new Spyc; - return $Spyc->__load($input); - } - - /** - * Load a string of YAML into a PHP array statically - * - * The load method, when supplied with a YAML string, will do its best - * to convert YAML in a string into a PHP array. Pretty simple. - * - * Note: use this function if you don't want files from the file system - * loaded and processed as YAML. This is of interest to people concerned - * about security whose input is from a string. - * - * Usage: - * - * $array = Spyc::YAMLLoadString("---\n0: hello world\n"); - * print_r($array); - * - * @access public - * @return array - * @param string $input String containing YAML - */ - public static function YAMLLoadString($input) { - $Spyc = new Spyc; - return $Spyc->__loadString($input); - } - - /** - * Dump YAML from PHP array statically - * - * The dump method, when supplied with an array, will do its best - * to convert the array into friendly YAML. Pretty simple. Feel free to - * save the returned string as nothing.yaml and pass it around. - * - * Oh, and you can decide how big the indent is and what the wordwrap - * for folding is. Pretty cool -- just pass in 'false' for either if - * you want to use the default. - * - * Indent's default is 2 spaces, wordwrap's default is 40 characters. And - * you can turn off wordwrap by passing in 0. - * - * @access public - * @return string - * @param array $array PHP array - * @param int $indent Pass in false to use the default, which is 2 - * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) - * @param int $no_opening_dashes Do not start YAML file with "---\n" - */ - public static function YAMLDump($array, $indent = false, $wordwrap = false, $no_opening_dashes = false) { - $spyc = new Spyc; - return $spyc->dump($array, $indent, $wordwrap, $no_opening_dashes); - } - - - /** - * Dump PHP array to YAML - * - * The dump method, when supplied with an array, will do its best - * to convert the array into friendly YAML. Pretty simple. Feel free to - * save the returned string as tasteful.yaml and pass it around. - * - * Oh, and you can decide how big the indent is and what the wordwrap - * for folding is. Pretty cool -- just pass in 'false' for either if - * you want to use the default. - * - * Indent's default is 2 spaces, wordwrap's default is 40 characters. And - * you can turn off wordwrap by passing in 0. - * - * @access public - * @return string - * @param array $array PHP array - * @param int $indent Pass in false to use the default, which is 2 - * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) - */ - public function dump($array,$indent = false,$wordwrap = false, $no_opening_dashes = false) { - // Dumps to some very clean YAML. We'll have to add some more features - // and options soon. And better support for folding. - - // New features and options. - if ($indent === false or !is_numeric($indent)) { - $this->_dumpIndent = 2; - } else { - $this->_dumpIndent = $indent; - } - - if ($wordwrap === false or !is_numeric($wordwrap)) { - $this->_dumpWordWrap = 40; - } else { - $this->_dumpWordWrap = $wordwrap; - } - - // New YAML document - $string = ""; - if (!$no_opening_dashes) $string = "---\n"; - - // Start at the base of the array and move through it. - if ($array) { - $array = (array)$array; - $previous_key = -1; - foreach ($array as $key => $value) { - if (!isset($first_key)) $first_key = $key; - $string .= $this->_yamlize($key,$value,0,$previous_key, $first_key, $array); - $previous_key = $key; - } - } - return $string; - } - - /** - * Attempts to convert a key / value array item to YAML - * @access private - * @return string - * @param $key The name of the key - * @param $value The value of the item - * @param $indent The indent of the current node - */ - private function _yamlize($key,$value,$indent, $previous_key = -1, $first_key = 0, $source_array = null) { - if (is_array($value)) { - if (empty ($value)) - return $this->_dumpNode($key, array(), $indent, $previous_key, $first_key, $source_array); - // It has children. What to do? - // Make it the right kind of item - $string = $this->_dumpNode($key, self::REMPTY, $indent, $previous_key, $first_key, $source_array); - // Add the indent - $indent += $this->_dumpIndent; - // Yamlize the array - $string .= $this->_yamlizeArray($value,$indent); - } elseif (!is_array($value)) { - // It doesn't have children. Yip. - $string = $this->_dumpNode($key, $value, $indent, $previous_key, $first_key, $source_array); - } - return $string; - } - - /** - * Attempts to convert an array to YAML - * @access private - * @return string - * @param $array The array you want to convert - * @param $indent The indent of the current level - */ - private function _yamlizeArray($array,$indent) { - if (is_array($array)) { - $string = ''; - $previous_key = -1; - foreach ($array as $key => $value) { - if (!isset($first_key)) $first_key = $key; - $string .= $this->_yamlize($key, $value, $indent, $previous_key, $first_key, $array); - $previous_key = $key; - } - return $string; - } else { - return false; - } - } - - /** - * Returns YAML from a key and a value - * @access private - * @return string - * @param $key The name of the key - * @param $value The value of the item - * @param $indent The indent of the current node - */ - private function _dumpNode($key, $value, $indent, $previous_key = -1, $first_key = 0, $source_array = null) { - // do some folding here, for blocks - if (is_string ($value) && ((strpos($value,"\n") !== false || strpos($value,": ") !== false || strpos($value,"- ") !== false || - strpos($value,"*") !== false || strpos($value,"#") !== false || strpos($value,"<") !== false || strpos($value,">") !== false || strpos ($value, '%') !== false || strpos ($value, ' ') !== false || - strpos($value,"[") !== false || strpos($value,"]") !== false || strpos($value,"{") !== false || strpos($value,"}") !== false) || strpos($value,"&") !== false || strpos($value, "'") !== false || strpos($value, "!") === 0 || - substr ($value, -1, 1) == ':') - ) { - $value = $this->_doLiteralBlock($value,$indent); - } else { - $value = $this->_doFolding($value,$indent); - } - - if ($value === array()) $value = '[ ]'; - if ($value === "") $value = '""'; - if (self::isTranslationWord($value)) { - $value = $this->_doLiteralBlock($value, $indent); - } - if (trim ($value) != $value) - $value = $this->_doLiteralBlock($value,$indent); - - if (is_bool($value)) { - $value = $value ? "true" : "false"; - } - - if ($value === null) $value = 'null'; - if ($value === "'" . self::REMPTY . "'") $value = null; - - $spaces = str_repeat(' ',$indent); - - //if (is_int($key) && $key - 1 == $previous_key && $first_key===0) { - if (is_array ($source_array) && array_keys($source_array) === range(0, count($source_array) - 1)) { - // It's a sequence - $string = $spaces.'- '.$value."\n"; - } else { - // if ($first_key===0) throw new Exception('Keys are all screwy. The first one was zero, now it\'s "'. $key .'"'); - // It's mapped - if (strpos($key, ":") !== false || strpos($key, "#") !== false) { $key = '"' . $key . '"'; } - $string = rtrim ($spaces.$key.': '.$value)."\n"; - } - return $string; - } - - /** - * Creates a literal block for dumping - * @access private - * @return string - * @param $value - * @param $indent int The value of the indent - */ - private function _doLiteralBlock($value,$indent) { - if ($value === "\n") return '\n'; - if (strpos($value, "\n") === false && strpos($value, "'") === false) { - return sprintf ("'%s'", $value); - } - if (strpos($value, "\n") === false && strpos($value, '"') === false) { - return sprintf ('"%s"', $value); - } - $exploded = explode("\n",$value); - $newValue = '|'; - if (isset($exploded[0]) && ($exploded[0] == "|" || $exploded[0] == "|-" || $exploded[0] == ">")) { - $newValue = $exploded[0]; - unset($exploded[0]); - } - $indent += $this->_dumpIndent; - $spaces = str_repeat(' ',$indent); - foreach ($exploded as $line) { - $line = trim($line); - if (strpos($line, '"') === 0 && strrpos($line, '"') == (strlen($line)-1) || strpos($line, "'") === 0 && strrpos($line, "'") == (strlen($line)-1)) { - $line = substr($line, 1, -1); - } - $newValue .= "\n" . $spaces . ($line); - } - return $newValue; - } - - /** - * Folds a string of text, if necessary - * @access private - * @return string - * @param $value The string you wish to fold - */ - private function _doFolding($value,$indent) { - // Don't do anything if wordwrap is set to 0 - - if ($this->_dumpWordWrap !== 0 && is_string ($value) && strlen($value) > $this->_dumpWordWrap) { - $indent += $this->_dumpIndent; - $indent = str_repeat(' ',$indent); - $wrapped = wordwrap($value,$this->_dumpWordWrap,"\n$indent"); - $value = ">\n".$indent.$wrapped; - } else { - if ($this->setting_dump_force_quotes && is_string ($value) && $value !== self::REMPTY) - $value = '"' . $value . '"'; - if (is_numeric($value) && is_string($value)) - $value = '"' . $value . '"'; - } - - - return $value; - } - - private function isTrueWord($value) { - $words = self::getTranslations(array('true', 'on', 'yes', 'y')); - return in_array($value, $words, true); - } - - private function isFalseWord($value) { - $words = self::getTranslations(array('false', 'off', 'no', 'n')); - return in_array($value, $words, true); - } - - private function isNullWord($value) { - $words = self::getTranslations(array('null', '~')); - return in_array($value, $words, true); - } - - private function isTranslationWord($value) { - return ( - self::isTrueWord($value) || - self::isFalseWord($value) || - self::isNullWord($value) - ); - } - - /** - * Coerce a string into a native type - * Reference: http://yaml.org/type/bool.html - * TODO: Use only words from the YAML spec. - * @access private - * @param $value The value to coerce - */ - private function coerceValue(&$value) { - if (self::isTrueWord($value)) { - $value = true; - } else if (self::isFalseWord($value)) { - $value = false; - } else if (self::isNullWord($value)) { - $value = null; - } - } - - /** - * Given a set of words, perform the appropriate translations on them to - * match the YAML 1.1 specification for type coercing. - * @param $words The words to translate - * @access private - */ - private static function getTranslations(array $words) { - $result = array(); - foreach ($words as $i) { - $result = array_merge($result, array(ucfirst($i), strtoupper($i), strtolower($i))); - } - return $result; - } - -// LOADING FUNCTIONS - - private function __load($input) { - $Source = $this->loadFromSource($input); - return $this->loadWithSource($Source); - } - - private function __loadString($input) { - $Source = $this->loadFromString($input); - return $this->loadWithSource($Source); - } - - private function loadWithSource($Source) { - if (empty ($Source)) return array(); - if ($this->setting_use_syck_is_possible && function_exists ('syck_load')) { - $array = syck_load (implode ("\n", $Source)); - return is_array($array) ? $array : array(); - } - - $this->path = array(); - $this->result = array(); - - $cnt = count($Source); - for ($i = 0; $i < $cnt; $i++) { - $line = $Source[$i]; - - $this->indent = strlen($line) - strlen(ltrim($line)); - $tempPath = $this->getParentPathByIndent($this->indent); - $line = self::stripIndent($line, $this->indent); - if (self::isComment($line)) continue; - if (self::isEmpty($line)) continue; - $this->path = $tempPath; - - $literalBlockStyle = self::startsLiteralBlock($line); - if ($literalBlockStyle) { - $line = rtrim ($line, $literalBlockStyle . " \n"); - $literalBlock = ''; - $line .= ' '.$this->LiteralPlaceHolder; - $literal_block_indent = strlen($Source[$i+1]) - strlen(ltrim($Source[$i+1])); - while (++$i < $cnt && $this->literalBlockContinues($Source[$i], $this->indent)) { - $literalBlock = $this->addLiteralLine($literalBlock, $Source[$i], $literalBlockStyle, $literal_block_indent); - } - $i--; - } - - // Strip out comments - if (strpos ($line, '#')) { - $line = preg_replace('/\s*#([^"\']+)$/','',$line); - } - - while (++$i < $cnt && self::greedilyNeedNextLine($line)) { - $line = rtrim ($line, " \n\t\r") . ' ' . ltrim ($Source[$i], " \t"); - } - $i--; - - $lineArray = $this->_parseLine($line); - - if ($literalBlockStyle) - $lineArray = $this->revertLiteralPlaceHolder ($lineArray, $literalBlock); - - $this->addArray($lineArray, $this->indent); - - foreach ($this->delayedPath as $indent => $delayedPath) - $this->path[$indent] = $delayedPath; - - $this->delayedPath = array(); - - } - return $this->result; - } - - private function loadFromSource ($input) { - if (!empty($input) && strpos($input, "\n") === false && file_exists($input)) - $input = file_get_contents($input); - - return $this->loadFromString($input); - } - - private function loadFromString ($input) { - $lines = explode("\n",$input); - foreach ($lines as $k => $_) { - $lines[$k] = rtrim ($_, "\r"); - } - return $lines; - } - - /** - * Parses YAML code and returns an array for a node - * @access private - * @return array - * @param string $line A line from the YAML file - */ - private function _parseLine($line) { - if (!$line) return array(); - $line = trim($line); - if (!$line) return array(); - - $array = array(); - - $group = $this->nodeContainsGroup($line); - if ($group) { - $this->addGroup($line, $group); - $line = $this->stripGroup ($line, $group); - } - - if ($this->startsMappedSequence($line)) - return $this->returnMappedSequence($line); - - if ($this->startsMappedValue($line)) - return $this->returnMappedValue($line); - - if ($this->isArrayElement($line)) - return $this->returnArrayElement($line); - - if ($this->isPlainArray($line)) - return $this->returnPlainArray($line); - - - return $this->returnKeyValuePair($line); - - } - - /** - * Finds the type of the passed value, returns the value as the new type. - * @access private - * @param string $value - * @return mixed - */ - private function _toType($value) { - if ($value === '') return ""; - $first_character = $value[0]; - $last_character = substr($value, -1, 1); - - $is_quoted = false; - do { - if (!$value) break; - if ($first_character != '"' && $first_character != "'") break; - if ($last_character != '"' && $last_character != "'") break; - $is_quoted = true; - } while (0); - - if ($is_quoted) { - $value = str_replace('\n', "\n", $value); - return strtr(substr ($value, 1, -1), array ('\\"' => '"', '\'\'' => '\'', '\\\'' => '\'')); - } - - if (strpos($value, ' #') !== false && !$is_quoted) - $value = preg_replace('/\s+#(.+)$/','',$value); - - if ($first_character == '[' && $last_character == ']') { - // Take out strings sequences and mappings - $innerValue = trim(substr ($value, 1, -1)); - if ($innerValue === '') return array(); - $explode = $this->_inlineEscape($innerValue); - // Propagate value array - $value = array(); - foreach ($explode as $v) { - $value[] = $this->_toType($v); - } - return $value; - } - - if (strpos($value,': ')!==false && $first_character != '{') { - $array = explode(': ',$value); - $key = trim($array[0]); - array_shift($array); - $value = trim(implode(': ',$array)); - $value = $this->_toType($value); - return array($key => $value); - } - - if ($first_character == '{' && $last_character == '}') { - $innerValue = trim(substr ($value, 1, -1)); - if ($innerValue === '') return array(); - // Inline Mapping - // Take out strings sequences and mappings - $explode = $this->_inlineEscape($innerValue); - // Propagate value array - $array = array(); - foreach ($explode as $v) { - $SubArr = $this->_toType($v); - if (empty($SubArr)) continue; - if (is_array ($SubArr)) { - $array[key($SubArr)] = $SubArr[key($SubArr)]; continue; - } - $array[] = $SubArr; - } - return $array; - } - - if ($value == 'null' || $value == 'NULL' || $value == 'Null' || $value == '' || $value == '~') { - return null; - } - - if ( is_numeric($value) && preg_match ('/^(-|)[1-9]+[0-9]*$/', $value) ){ - $intvalue = (int)$value; - if ($intvalue != PHP_INT_MAX) - $value = $intvalue; - return $value; - } - - if (is_numeric($value) && preg_match('/^0[xX][0-9a-fA-F]+$/', $value)) { - // Hexadecimal value. - return hexdec($value); - } - - $this->coerceValue($value); - - if (is_numeric($value)) { - if ($value === '0') return 0; - if (rtrim ($value, 0) === $value) - $value = (float)$value; - return $value; - } - - return $value; - } - - /** - * Used in inlines to check for more inlines or quoted strings - * @access private - * @return array - */ - private function _inlineEscape($inline) { - // There's gotta be a cleaner way to do this... - // While pure sequences seem to be nesting just fine, - // pure mappings and mappings with sequences inside can't go very - // deep. This needs to be fixed. - - $seqs = array(); - $maps = array(); - $saved_strings = array(); - $saved_empties = array(); - - // Check for empty strings - $regex = '/("")|(\'\')/'; - if (preg_match_all($regex,$inline,$strings)) { - $saved_empties = $strings[0]; - $inline = preg_replace($regex,'YAMLEmpty',$inline); - } - unset($regex); - - // Check for strings - $regex = '/(?:(")|(?:\'))((?(1)[^"]+|[^\']+))(?(1)"|\')/'; - if (preg_match_all($regex,$inline,$strings)) { - $saved_strings = $strings[0]; - $inline = preg_replace($regex,'YAMLString',$inline); - } - unset($regex); - - // echo $inline; - - $i = 0; - do { - - // Check for sequences - while (preg_match('/\[([^{}\[\]]+)\]/U',$inline,$matchseqs)) { - $seqs[] = $matchseqs[0]; - $inline = preg_replace('/\[([^{}\[\]]+)\]/U', ('YAMLSeq' . (count($seqs) - 1) . 's'), $inline, 1); - } - - // Check for mappings - while (preg_match('/{([^\[\]{}]+)}/U',$inline,$matchmaps)) { - $maps[] = $matchmaps[0]; - $inline = preg_replace('/{([^\[\]{}]+)}/U', ('YAMLMap' . (count($maps) - 1) . 's'), $inline, 1); - } - - if ($i++ >= 10) break; - - } while (strpos ($inline, '[') !== false || strpos ($inline, '{') !== false); - - $explode = explode(',',$inline); - $explode = array_map('trim', $explode); - $stringi = 0; $i = 0; - - while (1) { - - // Re-add the sequences - if (!empty($seqs)) { - foreach ($explode as $key => $value) { - if (strpos($value,'YAMLSeq') !== false) { - foreach ($seqs as $seqk => $seq) { - $explode[$key] = str_replace(('YAMLSeq'.$seqk.'s'),$seq,$value); - $value = $explode[$key]; - } - } - } - } - - // Re-add the mappings - if (!empty($maps)) { - foreach ($explode as $key => $value) { - if (strpos($value,'YAMLMap') !== false) { - foreach ($maps as $mapk => $map) { - $explode[$key] = str_replace(('YAMLMap'.$mapk.'s'), $map, $value); - $value = $explode[$key]; - } - } - } - } - - - // Re-add the strings - if (!empty($saved_strings)) { - foreach ($explode as $key => $value) { - while (strpos($value,'YAMLString') !== false) { - $explode[$key] = preg_replace('/YAMLString/',$saved_strings[$stringi],$value, 1); - unset($saved_strings[$stringi]); - ++$stringi; - $value = $explode[$key]; - } - } - } - - - // Re-add the empties - if (!empty($saved_empties)) { - foreach ($explode as $key => $value) { - while (strpos($value,'YAMLEmpty') !== false) { - $explode[$key] = preg_replace('/YAMLEmpty/', '', $value, 1); - $value = $explode[$key]; - } - } - } - - $finished = true; - foreach ($explode as $key => $value) { - if (strpos($value,'YAMLSeq') !== false) { - $finished = false; break; - } - if (strpos($value,'YAMLMap') !== false) { - $finished = false; break; - } - if (strpos($value,'YAMLString') !== false) { - $finished = false; break; - } - if (strpos($value,'YAMLEmpty') !== false) { - $finished = false; break; - } - } - if ($finished) break; - - $i++; - if ($i > 10) - break; // Prevent infinite loops. - } - - - return $explode; - } - - private function literalBlockContinues ($line, $lineIndent) { - if (!trim($line)) return true; - if (strlen($line) - strlen(ltrim($line)) > $lineIndent) return true; - return false; - } - - private function referenceContentsByAlias ($alias) { - do { - if (!isset($this->SavedGroups[$alias])) { echo "Bad group name: $alias."; break; } - $groupPath = $this->SavedGroups[$alias]; - $value = $this->result; - foreach ($groupPath as $k) { - $value = $value[$k]; - } - } while (false); - return $value; - } - - private function addArrayInline ($array, $indent) { - $CommonGroupPath = $this->path; - if (empty ($array)) return false; - - foreach ($array as $k => $_) { - $this->addArray(array($k => $_), $indent); - $this->path = $CommonGroupPath; - } - return true; - } - - private function addArray ($incoming_data, $incoming_indent) { - - // print_r ($incoming_data); - - if (count ($incoming_data) > 1) - return $this->addArrayInline ($incoming_data, $incoming_indent); - - $key = key ($incoming_data); - $value = isset($incoming_data[$key]) ? $incoming_data[$key] : null; - if ($key === '__!YAMLZero') $key = '0'; - - if ($incoming_indent == 0 && !$this->_containsGroupAlias && !$this->_containsGroupAnchor) { // Shortcut for root-level values. - if ($key || $key === '' || $key === '0') { - $this->result[$key] = $value; - } else { - $this->result[] = $value; end ($this->result); $key = key ($this->result); - } - $this->path[$incoming_indent] = $key; - return; - } - - - - $history = array(); - // Unfolding inner array tree. - $history[] = $_arr = $this->result; - foreach ($this->path as $k) { - $history[] = $_arr = $_arr[$k]; - } - - if ($this->_containsGroupAlias) { - $value = $this->referenceContentsByAlias($this->_containsGroupAlias); - $this->_containsGroupAlias = false; - } - - - // Adding string or numeric key to the innermost level or $this->arr. - if (is_string($key) && $key == '<<') { - if (!is_array ($_arr)) { $_arr = array (); } - - $_arr = array_merge ($_arr, $value); - } else if ($key || $key === '' || $key === '0') { - if (!is_array ($_arr)) - $_arr = array ($key=>$value); - else - $_arr[$key] = $value; - } else { - if (!is_array ($_arr)) { $_arr = array ($value); $key = 0; } - else { $_arr[] = $value; end ($_arr); $key = key ($_arr); } - } - - $reverse_path = array_reverse($this->path); - $reverse_history = array_reverse ($history); - $reverse_history[0] = $_arr; - $cnt = count($reverse_history) - 1; - for ($i = 0; $i < $cnt; $i++) { - $reverse_history[$i+1][$reverse_path[$i]] = $reverse_history[$i]; - } - $this->result = $reverse_history[$cnt]; - - $this->path[$incoming_indent] = $key; - - if ($this->_containsGroupAnchor) { - $this->SavedGroups[$this->_containsGroupAnchor] = $this->path; - if (is_array ($value)) { - $k = key ($value); - if (!is_int ($k)) { - $this->SavedGroups[$this->_containsGroupAnchor][$incoming_indent + 2] = $k; - } - } - $this->_containsGroupAnchor = false; - } - - } - - private static function startsLiteralBlock ($line) { - $lastChar = substr (trim($line), -1); - if ($lastChar != '>' && $lastChar != '|') return false; - if ($lastChar == '|') return $lastChar; - // HTML tags should not be counted as literal blocks. - if (preg_match ('#<.*?>$#', $line)) return false; - return $lastChar; - } - - private static function greedilyNeedNextLine($line) { - $line = trim ($line); - if (!strlen($line)) return false; - if (substr ($line, -1, 1) == ']') return false; - if ($line[0] == '[') return true; - if (preg_match ('#^[^:]+?:\s*\[#', $line)) return true; - return false; - } - - private function addLiteralLine ($literalBlock, $line, $literalBlockStyle, $indent = -1) { - $line = self::stripIndent($line, $indent); - if ($literalBlockStyle !== '|') { - $line = self::stripIndent($line); - } - $line = rtrim ($line, "\r\n\t ") . "\n"; - if ($literalBlockStyle == '|') { - return $literalBlock . $line; - } - if (strlen($line) == 0) - return rtrim($literalBlock, ' ') . "\n"; - if ($line == "\n" && $literalBlockStyle == '>') { - return rtrim ($literalBlock, " \t") . "\n"; - } - if ($line != "\n") - $line = trim ($line, "\r\n ") . " "; - return $literalBlock . $line; - } - - function revertLiteralPlaceHolder ($lineArray, $literalBlock) { - foreach ($lineArray as $k => $_) { - if (is_array($_)) - $lineArray[$k] = $this->revertLiteralPlaceHolder ($_, $literalBlock); - else if (substr($_, -1 * strlen ($this->LiteralPlaceHolder)) == $this->LiteralPlaceHolder) - $lineArray[$k] = rtrim ($literalBlock, " \r\n"); - } - return $lineArray; - } - - private static function stripIndent ($line, $indent = -1) { - if ($indent == -1) $indent = strlen($line) - strlen(ltrim($line)); - return substr ($line, $indent); - } - - private function getParentPathByIndent ($indent) { - if ($indent == 0) return array(); - $linePath = $this->path; - do { - end($linePath); $lastIndentInParentPath = key($linePath); - if ($indent <= $lastIndentInParentPath) array_pop ($linePath); - } while ($indent <= $lastIndentInParentPath); - return $linePath; - } - - - private function clearBiggerPathValues ($indent) { - - - if ($indent == 0) $this->path = array(); - if (empty ($this->path)) return true; - - foreach ($this->path as $k => $_) { - if ($k > $indent) unset ($this->path[$k]); - } - - return true; - } - - - private static function isComment ($line) { - if (!$line) return false; - if ($line[0] == '#') return true; - if (trim($line, " \r\n\t") == '---') return true; - return false; - } - - private static function isEmpty ($line) { - return (trim ($line) === ''); - } - - - private function isArrayElement ($line) { - if (!$line || !is_scalar($line)) return false; - if (substr($line, 0, 2) != '- ') return false; - if (strlen ($line) > 3) - if (substr($line,0,3) == '---') return false; - - return true; - } - - private function isHashElement ($line) { - return strpos($line, ':'); - } - - private function isLiteral ($line) { - if ($this->isArrayElement($line)) return false; - if ($this->isHashElement($line)) return false; - return true; - } - - - private static function unquote ($value) { - if (!$value) return $value; - if (!is_string($value)) return $value; - if ($value[0] == '\'') return trim ($value, '\''); - if ($value[0] == '"') return trim ($value, '"'); - return $value; - } - - private function startsMappedSequence ($line) { - return (substr($line, 0, 2) == '- ' && substr ($line, -1, 1) == ':'); - } - - private function returnMappedSequence ($line) { - $array = array(); - $key = self::unquote(trim(substr($line,1,-1))); - $array[$key] = array(); - $this->delayedPath = array(strpos ($line, $key) + $this->indent => $key); - return array($array); - } - - private function checkKeysInValue($value) { - if (strchr('[{"\'', $value[0]) === false) { - if (strchr($value, ': ') !== false) { - throw new Exception('Too many keys: '.$value); - } - } - } - - private function returnMappedValue ($line) { - $this->checkKeysInValue($line); - $array = array(); - $key = self::unquote (trim(substr($line,0,-1))); - $array[$key] = ''; - return $array; - } - - private function startsMappedValue ($line) { - return (substr ($line, -1, 1) == ':'); - } - - private function isPlainArray ($line) { - return ($line[0] == '[' && substr ($line, -1, 1) == ']'); - } - - private function returnPlainArray ($line) { - return $this->_toType($line); - } - - private function returnKeyValuePair ($line) { - $array = array(); - $key = ''; - if (strpos ($line, ': ')) { - // It's a key/value pair most likely - // If the key is in double quotes pull it out - if (($line[0] == '"' || $line[0] == "'") && preg_match('/^(["\'](.*)["\'](\s)*:)/',$line,$matches)) { - $value = trim(str_replace($matches[1],'',$line)); - $key = $matches[2]; - } else { - // Do some guesswork as to the key and the value - $explode = explode(': ', $line); - $key = trim(array_shift($explode)); - $value = trim(implode(': ', $explode)); - $this->checkKeysInValue($value); - } - // Set the type of the value. Int, string, etc - $value = $this->_toType($value); - if ($key === '0') $key = '__!YAMLZero'; - $array[$key] = $value; - } else { - $array = array ($line); - } - return $array; - - } - - - private function returnArrayElement ($line) { - if (strlen($line) <= 1) return array(array()); // Weird %) - $array = array(); - $value = trim(substr($line,1)); - $value = $this->_toType($value); - if ($this->isArrayElement($value)) { - $value = $this->returnArrayElement($value); - } - $array[] = $value; - return $array; - } - - - private function nodeContainsGroup ($line) { - $symbolsForReference = 'A-z0-9_\-'; - if (strpos($line, '&') === false && strpos($line, '*') === false) return false; // Please die fast ;-) - if ($line[0] == '&' && preg_match('/^(&['.$symbolsForReference.']+)/', $line, $matches)) return $matches[1]; - if ($line[0] == '*' && preg_match('/^(\*['.$symbolsForReference.']+)/', $line, $matches)) return $matches[1]; - if (preg_match('/(&['.$symbolsForReference.']+)$/', $line, $matches)) return $matches[1]; - if (preg_match('/(\*['.$symbolsForReference.']+$)/', $line, $matches)) return $matches[1]; - if (preg_match ('#^\s*<<\s*:\s*(\*[^\s]+).*$#', $line, $matches)) return $matches[1]; - return false; - - } - - private function addGroup ($line, $group) { - if ($group[0] == '&') $this->_containsGroupAnchor = substr ($group, 1); - if ($group[0] == '*') $this->_containsGroupAlias = substr ($group, 1); - //print_r ($this->path); - } - - private function stripGroup ($line, $group) { - $line = trim(str_replace($group, '', $line)); - return $line; - } -} - -// Enable use of Spyc from command line -// The syntax is the following: php Spyc.php spyc.yaml - -do { - if (PHP_SAPI != 'cli') break; - if (empty ($_SERVER['argc']) || $_SERVER['argc'] < 2) break; - if (empty ($_SERVER['PHP_SELF']) || FALSE === strpos ($_SERVER['PHP_SELF'], 'Spyc.php') ) break; - $file = $argv[1]; - echo json_encode (spyc_load_file ($file)); -} while (0); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/composer.json b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/composer.json deleted file mode 100755 index e5ab7768..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/spyc/composer.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "mustangostang/spyc", - "description": "A simple YAML loader/dumper class for PHP", - "type": "library", - "keywords": [ - "spyc", - "yaml", - "yml" - ], - "homepage": "https://github.com/mustangostang/spyc/", - "authors" : [{ - "name": "mustangostang", - "email": "vlad.andersen@gmail.com" - }], - "license": "MIT", - "require": { - "php": ">=5.3.1" - }, - "autoload": { - "files": [ "Spyc.php" ] - }, - "require-dev": { - "phpunit/phpunit": "4.3.*@dev" - }, - "extra": { - "branch-alias": { - "dev-master": "0.5.x-dev" - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/LICENSE b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/LICENSE deleted file mode 100755 index d6456956..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/README.md b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/README.md deleted file mode 100755 index 7d45323c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/README.md +++ /dev/null @@ -1,211 +0,0 @@ -# tmhOAuth - -An OAuth 1.0A library written in PHP by @themattharris, specifically for use -with the Twitter API. - -**Disclaimer**: This project is a work in progress. Please use the issue tracker -to report any enhancements or issues you encounter. - -## Goals - -- Support OAuth 1.0A -- Use Authorisation headers instead of query string or POST parameters -- Allow uploading of images -- Provide enough information to assist with debugging - -## Dependencies - -The library has been tested with PHP 5.3+ and relies on CURL and hash_hmac. The -vast majority of hosting providers include these libraries and run with PHP 5.1+. - -The code makes use of hash_hmac, which was introduced in PHP 5.1.2. If your version -of PHP is lower than this you should ask your hosting provider for an update. - -## A note about security and SSL - -Version 0.60 hardened the security of the library and defaulted `curl_ssl_verifypeer` to `true`. -As some hosting providers do not provide the most current certificate root file -it is now included in this repository. If the version is out of date OR you prefer -to download the certificate roots yourself, you can get them -from: http://curl.haxx.se/ca/cacert.pem - -Before upgrading the version of tmhOAuth that you use, be sure to verify the SSL -handling works on your server by running the `examples/verify_ssl.php` script. - -## Usage - -This will be built out later but for the moment review the examples repository - for ways the library can be -used. Each example contains instructions on how to use it. - -## Notes for users of previous versions - -If you previously used version 0.4 be aware the utility functions -have now been broken into their own file. Before you use version 0.5+ in your app -test locally to ensure your code doesn't need tmhUtilities included. - -If you used custom HTTP request headers when they were defined as `'key: value'` strings -you should now define them as `'key' => 'value'` pairs. - -Versions prior to 0.7.3 collapsed headers with the same value into one -$tmhOAuth->response['headers'] key. Since 0.7.3 headers with the same key will use an array -to store their values. - -## Change History -### 0.7.5 - 20 Februrary 2013 -- tidying up of composer.json. (Issue #112) Props: ceeram - -### 0.7.4 - 19 Februrary 2013 -- corrections to composer.json to support packagists requirements. (Issue #110) - -### 0.7.3 - 18 Februrary 2013 -- add support for making requests with the host header being different to the request host. -- ensure headers with the same key do not overwrite each other in $tmhOAuth->response['headers']. -- removed examples submodule in favor of examples including tmhOAuth, rather than tmhOAuth including examples -- made it so that if param values are sent to $tmhOAuth->request as an array (key -> array()) then $tmhOAuth->prepare_params will now implode them using ',' -- fixed composer. (Issue #99). Props: rasa -- fixed PHPDoc. (Issue #47). Props: trante -- instead of void, $tmhOAuth->curlit now returns 0 if 'prevent_request' is set - -### 0.7.2 - 01 November 2012 -- use DIRECTORY_SEPARATOR for multi-environment support. (Issue #80) Props: whallz -- tidied up the curlHeader function to use explode instead of substr and store the keys in the format they are returned from the API -- removed content-length hack as it isn't needed if CURLOPT_POSTFIELDS is initialized on all POSTs -- removed the expects header hack as Twitter no longer requires it to be there -- introduce composer.json. (Issues #39, #77, #85) Props: akandels, conradkleinespel, dguyon, kud, philsturgeon, willdurand -- added support for specifying custom headers when using $tmhOAuth->request. (Issue #98) - -### 0.7.1 - 27 October 2012 -- set content-length to 0 explictly to avoid a bug between libcurl and Twitter. (Issue #94) -- allow initialization without a configuration array (default config to array()) -- prevent ->url allowing double slashes in paths - -### 0.7.0 - 04 September 2012 -- changed version numbers to x.y.z format -- stronger method scoping (public and private) -- Typo fix in depenencies. (Issue #42) Props: tantek -- Only lowercase the host and scheme, and not path, in prepare_url. (Issue #56) Props: uzyn -- Fixed a number of PHP warnings by changing some tmhUtilty methods to static. (Issue #52) Props: DrayChou -- Raw headers and response body are now available as `$tmhOAuth->response['raw']` -- Moved the examples to their own repository -- Removed the `noexamples` branch as master does not contain examples anymore -- Introduced `$tmhOAuth->config['timezone']` and set `date_default_timezone_set`. (Issue #70) Props: iamctodd - -### 0.621 - 12 March 2012 -- Ensure `$_SERVER['HTTPS']` isset before checking it's value. Props: kud - -### 0.62 - 01 March 2012 -- Fix array merging bug. Props: julien-c -- use is_callable instead of function_exists: Props: samwierema -- Allow options to be specified for the entify function. Props: davidcroda -- protocol was not inferred correctly for https when ['HTTPS'] == 'on'. Props: ospector -- Switched to https for twitter.com display URLs -- Improved the search results example - -### 0.61 - 16 January 2012 -- Removed trailing ?> from tmhOAuth.php and tmhUtilities.php to meet the Zend Framework's coding practices. Props: reedy -- Fixed bug where CURLOPT_SSL_VERIFYHOST was defaulted to true when it should have been defaulted to 2. Props: kevinsmcarthur - -### 0.60 - 29 December 2011 -- Changed any use of implode to the preferred format of implode($glue, $pieces). Props: reedy -- Moved oauth_verifier to the authorization header as shown in example of RFC 5849. Props: spacenick -- added curl error and error number values to the $tmhOAuth->response object -- added an example script for testing the SSL connection to twitter.com with the new SSL configuration of tmhOAuth -- added a function to generate the useragent depending on whether SSL is on or not -- defaulted CURLOPT_SSL_VERIFYPEER to true -- added CURLOPT_SSL_VERIFYHOST and defaulted it to true -- added the most current cacert.pem file from http://curl.haxx.se/ca/cacert.pem and configured curl to use it - -### 0.58 - 29 December 2011 -- Rearranged some configuration variables around to make commenting easier -- Standarised on lowercase booleans - -### 0.57 - 11 December 2011 -- Fixed prevent_request so OAuth Echo requests work again. -- Added a TwitPic OAuth Echo example - -### 0.56 - 29 September 2011 -- Fixed version reference in the UserAgent -- Updated tmhUtilities::entify with support for media -- Updated tmhUtilities::entify with support for multibyte characters. Props: andersonshatch - -### 0.55 - 29 September 2011 -- Added support for content encoding. Defaults to whatever localhost supports. Props: yusuke - -### 0.54 - 29 September 2011 -- User-Agent is now configurable and includes the current version number of the script -- Updated the Streaming examples to use SSL - -### 0.53 - 15 July 2011 -- Fixed issue where headers were being duplicated if the library was called more than once. -- Updated examples to fit the new location of access tokens and secrets on dev.twitter.com -- Added Photo Tweet example - -### 0.52 - 06 July 2011 -- Fixed issue where the preference for include_time in create_nonce was being ignored - -### 0.51 - 06 July 2011 -- Use isset instead of suppress errors. Props: funkatron -- Added example of using the Search API -- Added example of using friends/ids and users/lookup to get details of a users friends -- Added example of the authorize OAuth webflow - -### 0.5 - 29 March 2011 -- Moved utility functions out of the main class and into the tmhUtilities class. -- Added the ability to send OAuth parameters as part of the querystring or POST body. -- Section 3.4.1.2 says the url must be lowercase so prepare URL now does this. -- Added a convenience method for accessing the safe_encode/decode transforms. -- Updated the examples to use the new utilities library. -- Added examples for sitestreams and userstreams. -- Added a more advanced streaming API example. - -### 0.4 - 03 March 2011 -- Fixed handling of parameters when using DELETE. Thanks to yusuke for reporting -- Fixed php_self to handle port numbers other than 80/443. Props: yusuke -- Updated function pr to use pre only when not running in CLI mode -- Add support for proxy servers. Props juanchorossi -- Function request now returns the HTTP status code. Props: kronenthaler -- Documentation fixes for xAuth. Props: 140dev -- Some minor code formatting changes - -### 0.3 - 28 September 2010 -- Moved entities rendering into the library - -### 0.2 - 17 September 2010 -- Added support for the Streaming API - -### 0.14 - 17 September 2010 -- Fixed authorisation header for use with OAuth Echo - -### 0.13 - 17 September 2010 -- Added use_ssl configuration parameter -- Fixed config array typo -- Removed v from the config -- Remove protocol from the host (configured by use_ssl) -- Added include for easier debugging - -### 0.12 - 17 September 2010 - -- Moved curl options to config -- Added the ability for curl to follow redirects, default false - -### 0.11 - 17 September 2010 - -- Fixed a bug in the GET requests - -### 0.1 - 26 August 2010 - -- Initial beta version - -## Community - -License: Apache 2 (see [included LICENSE file](https://github.com/themattharris/tmhOAuth/blob/master/LICENSE)) - -Follow [@tmhOAuth](https://twitter.com/intent/follow?screen_name=tmhOAuth) to receive updates on releases, or ask for support -Follow me on Twitter: [@themattharris](https://twitter.com/intent/follow?screen_name=themattharris) -Check out the Twitter Developer Resources: - -## To Do - -- Add good behavior logic to the Streaming API handler - i.e. on disconnect back off -- Async Curl support \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/cacert.pem b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/cacert.pem deleted file mode 100755 index 334fb26a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/cacert.pem +++ /dev/null @@ -1,3376 +0,0 @@ -## -## ca-bundle.crt -- Bundle of CA Root Certificates -## -## Certificate data from Mozilla as of: Thu Nov 3 19:04:19 2011 -## -## This is a bundle of X.509 certificates of public Certificate Authorities -## (CA). These were automatically extracted from Mozilla's root certificates -## file (certdata.txt). This file can be found in the mozilla source tree: -## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 -## -## It contains the certificates in PEM format and therefore -## can be directly used with curl / libcurl / php_curl, or with -## an Apache+mod_ssl webserver for SSL client authentication. -## Just configure this file as the SSLCACertificateFile. -## - -# ***** BEGIN LICENSE BLOCK ***** -# Version: MPL 1.1/GPL 2.0/LGPL 2.1 -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Original Code is the Netscape security libraries. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1994-2000 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 2 or later (the "GPL"), or -# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -# in which case the provisions of the GPL or the LGPL are applicable instead -# of those above. If you wish to allow use of your version of this file only -# under the terms of either the GPL or the LGPL, and not to allow others to -# use your version of this file under the terms of the MPL, indicate your -# decision by deleting the provisions above and replace them with the notice -# and other provisions required by the GPL or the LGPL. If you do not delete -# the provisions above, a recipient may use your version of this file under -# the terms of any one of the MPL, the GPL or the LGPL. -# -# ***** END LICENSE BLOCK ***** -# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $ - -GTE CyberTrust Global Root -========================== ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg -Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG -A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz -MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL -Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 -IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u -sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql -HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID -AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW -M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF -NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -Thawte Server CA -================ ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE -AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j -b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV -BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u -c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG -A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 -ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl -/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 -1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR -MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J -GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ -GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -Thawte Premium Server CA -======================== ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE -AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl -ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT -AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU -VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 -aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ -cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 -aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh -Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ -qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm -SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf -8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t -UCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - -Equifax Secure CA -================= ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE -ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT -B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR -fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW -8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG -A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE -CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG -A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS -spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB -Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 -zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB -BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 -70+sB3c4 ------END CERTIFICATE----- - -Digital Signature Trust Co. Global CA 1 -======================================= ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE -ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy -MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs -IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE -NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i -o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo -BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 -dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw -IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY -MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM -BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB -ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq -kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4 -RbyhkwS7hp86W0N6w4pl ------END CERTIFICATE----- - -Digital Signature Trust Co. Global CA 3 -======================================= ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE -ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy -MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs -IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD -VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS -xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo -BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 -dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw -IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY -MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM -BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB -AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi -up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1 -mPnHfxsb1gYgAlihw6ID ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA -TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah -WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf -Tqj/ZA1k ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO -FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 -lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB -MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT -1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD -Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 ------END CERTIFICATE----- - -Verisign Class 4 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4 -xBewRNzjMHPVKmIquNDMHO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDH -qGKB3FtKqsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwIDAQAB -MA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwjcSGIL4LcY/oCRaxF -WdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0ycyfYaT5DdPauxYma51N86Xv2S/PB -ZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRPT8qAkbYp ------END CERTIFICATE----- - -GlobalSign Root CA -================== ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx -GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds -b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV -BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD -VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa -DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc -THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb -Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP -c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX -gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF -AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj -Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG -j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH -hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC -X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -GlobalSign Root CA - R2 -======================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 -ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp -s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN -S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL -TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C -ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i -YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN -BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp -9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu -01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 -9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -ValiCert Class 1 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy -MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi -GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm -DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG -lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX -icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP -Orf1LXLI ------END CERTIFICATE----- - -ValiCert Class 2 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC -CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf -ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ -SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV -UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 -W9ViH0Pd ------END CERTIFICATE----- - -RSA Root Certificate 1 -====================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td -3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H -BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs -3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF -V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r -on+jjBXu ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 -EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc -cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw -EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj -055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f -j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 -xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa -t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -Verisign Class 4 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS -tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM -8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW -Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX -Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt -mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm -fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd -RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG -UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- - -Entrust.net Secure Server CA -============================ ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV -BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg -cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl -ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG -A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi -eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p -dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ -aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 -gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw -ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw -CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l -dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw -NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow -HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA -BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN -Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 -n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - -Entrust.net Premium 2048 Secure Server CA -========================================= ------BEGIN CERTIFICATE----- -MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u -ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp -bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV -BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx -NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 -d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u -ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL -Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr -hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW -nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi -VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC -AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER -gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B -AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo -oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS -o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z -2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX -OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== ------END CERTIFICATE----- - -Baltimore CyberTrust Root -========================= ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE -ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li -ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC -SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs -dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME -uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB -UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C -G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 -XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr -l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI -VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB -BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh -cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 -hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa -Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H -RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -Equifax Secure Global eBusiness CA -================================== ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp -bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx -HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds -b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV -PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN -qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn -hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j -BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs -MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN -I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY -NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -Equifax Secure eBusiness CA 1 -============================= ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB -LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE -ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz -IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ -1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a -IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk -MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW -Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF -AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 -lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ -KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -Equifax Secure eBusiness CA 2 -============================= ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE -ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y -MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT -DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn -2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5 -BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG -A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx -JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG -A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e -uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB -Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1 -jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia -78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm -V+GRMOrN ------END CERTIFICATE----- - -AddTrust Low-Value Services Root -================================ ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU -cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw -CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO -ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 -54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr -oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 -Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui -GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w -HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw -HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt -ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph -iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr -mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj -ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- - -AddTrust External Root -====================== ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD -VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw -NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU -cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg -Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 -+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw -Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo -aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy -2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 -7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL -VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk -VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl -j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 -e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u -G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -AddTrust Public Services Root -============================= ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU -cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ -BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l -dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu -nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i -d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG -Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw -HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G -A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G -A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 -JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL -+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao -GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 -Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H -EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- - -AddTrust Qualified Certificates Root -==================================== ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU -cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx -CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ -IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx -64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 -KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o -L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR -wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU -MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE -BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y -azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG -GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X -dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze -RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB -iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= ------END CERTIFICATE----- - -Entrust Root Certification Authority -==================================== ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV -BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw -b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG -A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 -MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu -MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu -Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v -dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz -A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww -Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 -j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN -rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 -MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH -hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM -Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa -v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS -W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 -tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -RSA Security 2048 v3 -==================== ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK -ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy -MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb -BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 -Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb -WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH -KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP -+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E -FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY -v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj -0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj -VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 -nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA -pKnXwiJPZ9d37CAFYd4= ------END CERTIFICATE----- - -GeoTrust Global CA -================== ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw -MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo -BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet -8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc -T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU -vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk -DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q -zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 -d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 -mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p -XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm -Mw== ------END CERTIFICATE----- - -GeoTrust Global CA 2 -==================== ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw -MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ -NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k -LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA -Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b -HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH -K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 -srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh -ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL -OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC -x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF -H4z1Ir+rzoPz4iIprn2DQKi6bA== ------END CERTIFICATE----- - -GeoTrust Universal CA -===================== ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 -MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu -Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t -JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e -RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs -7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d -8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V -qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga -Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB -Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu -KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 -ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 -XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB -hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 -qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL -oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK -xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF -KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 -DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK -xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU -p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI -P/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -GeoTrust Universal CA 2 -======================= ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 -MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg -SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 -DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 -j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q -JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a -QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 -WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP -20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn -ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC -SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG -8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 -+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E -BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ -4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ -mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq -A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg -Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP -pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d -FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp -gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm -X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -America Online Root Certification Authority 1 -============================================= ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG -v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z -DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh -sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP -8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z -o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf -GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF -VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft -3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g -Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- - -America Online Root Certification Authority 2 -============================================= ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en -fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 -f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO -qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN -RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 -gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn -6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid -FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 -Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj -B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op -aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY -T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p -+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg -JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy -zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO -ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh -1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf -GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff -Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP -cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= ------END CERTIFICATE----- - -Visa eCommerce Root -=================== ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG -EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug -QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 -WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm -VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL -F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b -RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 -TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI -/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs -GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG -MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc -CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW -YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz -zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu -YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -TC TrustCenter, Germany, Class 2 CA -=================================== ------BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI -EwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig -U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD -bGFzcyAyIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05 -ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt -YnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy -aXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg -MiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI -hvcNAQEBBQADgY0AMIGJAoGBANo46O0yAClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLs -qh1R1z2zUbKDTl3LSbDwTFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5N -u6hLVxa8/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy -LmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBAIRS+yjf -/x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ2 -9ELw+HkuCkhcq8xRT3h2oNmsGb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/Ac -ASZ4smZHcFFk ------END CERTIFICATE----- - -TC TrustCenter, Germany, Class 3 CA -=================================== ------BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI -EwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig -U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD -bGFzcyAzIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05 -ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt -YnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy -aXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg -MyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI -hvcNAQEBBQADgY0AMIGJAoGBALa0wTUFLg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN -2U4CdhHBC/KNecoAtvGwDtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+7 -7uMMfTDWw1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy -LmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBABY9xs3B -u4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIETb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm -5gZOngylerpuw3yCGdHHsbHD2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQS -CdS7kjXvD9s0 ------END CERTIFICATE----- - -Certum Root CA -============== ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK -ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla -Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u -by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x -wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL -kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ -89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K -Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P -NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ -GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg -GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ -0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS -qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- - -Comodo AAA Services root -======================== ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw -MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl -c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV -BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG -C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs -i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW -Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH -Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK -Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f -BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl -cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz -LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm -7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z -8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C -12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -Comodo Secure Services root -=========================== ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw -MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu -Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi -BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP -9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc -rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC -oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V -p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E -FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w -gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj -YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm -aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm -4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL -DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw -pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H -RR3B7Hzs/Sk= ------END CERTIFICATE----- - -Comodo Trusted Services root -============================ ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw -MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h -bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw -IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 -3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y -/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 -juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS -ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud -DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp -ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl -cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw -uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA -BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l -R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O -9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- - -QuoVadis Root CA -================ ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE -ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz -MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp -cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD -EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk -J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL -F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL -YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen -AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w -PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y -ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 -MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj -YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs -ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW -Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu -BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw -FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 -tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo -fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul -LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x -gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi -5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi -5nrQNiOKSnQ2+Q== ------END CERTIFICATE----- - -QuoVadis Root CA 2 -================== ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT -EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx -ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 -XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk -lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB -lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy -lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt -66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn -wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh -D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy -BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie -J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud -DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU -a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv -Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 -UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm -VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK -+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW -IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 -WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X -f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II -4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 -VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -QuoVadis Root CA 3 -================== ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT -EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx -OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg -DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij -KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K -DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv -BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp -p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 -nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX -MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM -Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz -uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT -BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj -YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB -BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD -VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 -ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE -AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV -qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s -hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z -POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 -Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp -8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC -bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu -g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p -vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr -qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -Security Communication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw -8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM -DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX -5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd -DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 -JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g -0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a -mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ -s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ -6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi -FL39vmwLAw== ------END CERTIFICATE----- - -Sonera Class 2 Root CA -====================== ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG -U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw -NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh -IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 -/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT -dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG -f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P -tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH -nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT -XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt -0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI -cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph -Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx -EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH -llpwrN9M ------END CERTIFICATE----- - -Staat der Nederlanden Root CA -============================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE -ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g -Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w -HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh -bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt -vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P -jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca -C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth -vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 -22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV -HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v -dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN -BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR -EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw -MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y -nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR -iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== ------END CERTIFICATE----- - -TDC Internet Root CA -==================== ------BEGIN CERTIFICATE----- -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE -ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx -NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu -ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j -xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL -znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc -5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 -otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI -AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM -VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM -MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC -AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe -UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G -CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m -gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ -2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb -O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU -Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l ------END CERTIFICATE----- - -TDC OCES Root CA -================ ------BEGIN CERTIFICATE----- -MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE -ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5 -MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH -nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0 -zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV -iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde -dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO -3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB -5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k -ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm -cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp -Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x -LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM -MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm -aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy -MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647 -+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6 -NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4 -A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc -A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9 -AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1 -AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw== ------END CERTIFICATE----- - -UTN DATACorp SGC Root CA -======================== ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ -BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa -MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w -HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy -dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys -raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo -wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA -9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv -33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud -DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 -BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD -LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 -DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 -I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx -EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP -DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- - -UTN USERFirst Hardware Root CA -============================== ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd -BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx -OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 -eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz -ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI -wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd -tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 -i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf -Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw -gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF -lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF -UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF -BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW -XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 -lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn -iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 -nfhmqA== ------END CERTIFICATE----- - -Camerfirma Chambers of Commerce Root -==================================== ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx -NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp -cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn -MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC -AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU -xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH -NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW -DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV -d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud -EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v -cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P -AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh -bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD -VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi -fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD -L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN -UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n -ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 -erfutGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- - -Camerfirma Global Chambersign Root -================================== ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx -NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt -YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg -MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw -ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J -1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O -by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl -6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c -8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ -BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j -aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B -Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj -aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y -ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA -PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y -gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ -PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 -IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes -t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- - -NetLock Notary (Class A) Root -============================= ------BEGIN CERTIFICATE----- -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI -EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j -ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX -DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH -EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD -VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz -cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM -D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ -z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC -/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 -tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 -4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG -A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC -Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv -bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu -IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn -LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 -ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz -IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh -IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu -b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh -bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg -Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp -bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 -ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP -ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB -CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr -KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM -8CgHrTwXZoi1/baI ------END CERTIFICATE----- - -NetLock Business (Class B) Root -=============================== ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg -VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD -VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv -bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg -VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB -iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S -o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr -1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV -HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ -RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh -dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 -ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv -c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg -YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz -Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA -bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl -IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 -YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj -cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM -43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR -stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -NetLock Express (Class C) Root -============================== ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD -KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ -BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j -ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB -jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z -W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 -euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw -DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN -RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn -YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB -IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i -aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 -ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y -emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k -IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ -UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg -YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 -xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW -gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - -XRamp Global CA Root -==================== ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE -BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj -dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx -HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg -U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu -IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx -foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE -zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs -AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry -xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap -oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC -AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc -/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n -nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz -8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -Go Daddy Class 2 CA -=================== ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY -VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG -A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g -RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD -ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv -2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 -qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j -YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY -vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O -BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o -atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu -MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG -A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim -PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt -I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI -Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b -vZ8= ------END CERTIFICATE----- - -Starfield Class 2 CA -==================== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc -U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo -MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG -A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG -SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY -bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ -JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm -epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN -F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF -MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f -hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo -bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs -afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM -PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD -KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 -QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -StartCom Certification Authority -================================ ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu -ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 -NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk -LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg -U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y -o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ -Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d -eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt -2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z -6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ -osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ -untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc -UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT -37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj -YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH -AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw -Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg -U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 -LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh -cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT -dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC -AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh -3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm -vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk -fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 -fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ -EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl -1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ -lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro -g14= ------END CERTIFICATE----- - -Taiwan GRCA -=========== ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG -EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X -DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv -dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN -w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 -BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O -1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO -htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov -J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 -Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t -B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB -O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 -lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV -HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 -09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj -Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 -Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU -D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz -DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk -Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk -7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ -CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy -+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS ------END CERTIFICATE----- - -Firmaprofesional Root CA -======================== ------BEGIN CERTIFICATE----- -MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT -GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp -Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA -ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL -MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT -OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2 -ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V -j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH -lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf -3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8 -NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww -KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG -AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD -ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq -u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf -wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm -7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG -VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= ------END CERTIFICATE----- - -Wells Fargo Root CA -=================== ------BEGIN CERTIFICATE----- -MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV -BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN -MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl -bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv -MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX -x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3 -E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5 -OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j -sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj -YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF -BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD -ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv -m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R -OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx -x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023 -tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= ------END CERTIFICATE----- - -Swisscom Root CA 1 -================== ------BEGIN CERTIFICATE----- -MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG -EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy -dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4 -MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln -aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC -IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM -MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF -NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe -AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC -b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn -7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN -cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp -WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5 -haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY -MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw -HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j -BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9 -MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn -jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ -MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H -VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl -vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl -OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3 -1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq -nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy -x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW -NY6E0F/6MBr1mmz0DlP5OlvRHA== ------END CERTIFICATE----- - -DigiCert Assured ID Root CA -=========================== ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw -IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx -MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL -ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO -9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy -UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW -/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy -oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf -GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF -66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq -hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc -EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn -SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i -8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -DigiCert Global Root CA -======================= ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw -HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw -MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 -dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn -TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 -BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H -4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y -7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB -o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm -8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF -BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr -EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt -tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 -UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -DigiCert High Assurance EV Root CA -================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw -KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw -MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ -MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu -Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t -Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS -OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 -MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ -NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe -h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB -Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY -JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ -V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp -myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK -mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K ------END CERTIFICATE----- - -Certplus Class 2 Primary CA -=========================== ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE -BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN -OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy -dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR -5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ -Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO -YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e -e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME -CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ -YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t -L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD -P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R -TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ -7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW -//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -DST Root CA X3 -============== ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK -ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X -DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 -cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT -rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 -UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy -xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d -utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ -MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug -dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE -GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw -RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS -fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -DST ACES CA X6 -============== ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT -MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha -MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE -CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI -DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa -pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow -GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy -MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu -Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy -dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU -CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 -5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t -Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs -vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 -oKfN5XozNmr6mis= ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 1 -============================================== ------BEGIN CERTIFICATE----- -MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP -MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 -acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx -MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg -U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB -TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC -aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX -yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i -Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ -8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 -W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME -BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 -sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE -q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy -B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY -nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 2 -============================================== ------BEGIN CERTIFICATE----- -MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP -MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg -QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN -MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr -dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G -A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls -acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe -LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI -x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g -QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr -5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB -AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt -Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 -Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ -hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P -9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 -UrbnBEI= ------END CERTIFICATE----- - -SwissSign Gold CA - G2 -====================== ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw -EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN -MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp -c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq -t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C -jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg -vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF -ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR -AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend -jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO -peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR -7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi -GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 -OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov -L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm -5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr -44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf -Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m -Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp -mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk -vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf -KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br -NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj -viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ ------END CERTIFICATE----- - -SwissSign Silver CA - G2 -======================== ------BEGIN CERTIFICATE----- -MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT -BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X -DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 -aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG -9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 -N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm -+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH -6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu -MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h -qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 -FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs -ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc -celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X -CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB -tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 -cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P -4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F -kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L -3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx -/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa -DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP -e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu -WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ -DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub -DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority -======================================== ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx -CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ -cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN -b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 -nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge -RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt -tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI -hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K -Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN -NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa -Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG -1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -thawte Primary Root CA -====================== ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 -MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg -SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv -KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT -FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs -oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ -1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc -q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K -aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p -afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF -AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE -uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 -jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH -z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G5 -============================================================ ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh -dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz -j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD -Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ -Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r -fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ -BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv -Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG -SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ -X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE -KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC -Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE -ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -SecureTrust CA -============== ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy -dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe -BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX -OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t -DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH -GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b -01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH -ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj -aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu -SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf -mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ -nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -Secure Global CA -================ ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH -bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg -MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg -Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx -YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ -bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g -8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV -HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi -0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn -oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA -MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ -OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn -CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 -3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -COMODO Certification Authority -============================== ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE -BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG -A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb -MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD -T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH -+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww -xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV -4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA -1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI -rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k -b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC -AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP -OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc -IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN -+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== ------END CERTIFICATE----- - -Network Solutions Certificate Authority -======================================= ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG -EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr -IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx -MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx -jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT -aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT -crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc -/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB -AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv -bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA -A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q -4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ -GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD -ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -WellsSecure Public Root Certificate Authority -============================================= ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM -F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw -NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN -MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl -bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD -VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 -iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 -i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 -bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB -K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB -AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu -cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm -lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB -i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww -GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI -K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 -bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj -qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es -E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ -tylv2G0xffX8oRAHh84vWdw+WNs= ------END CERTIFICATE----- - -COMODO ECC Certification Authority -================================== ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC -R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE -ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix -GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X -4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni -wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG -FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA -U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -IGC/A -===== ------BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD -VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE -Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy -MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI -EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT -STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 -TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW -So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy -HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd -frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ -tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB -egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC -iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK -q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q -MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI -lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF -0mBWWg== ------END CERTIFICATE----- - -Security Communication EV RootCA1 -================================= ------BEGIN CERTIFICATE----- -MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE -BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl -Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO -/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX -WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z -ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 -bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK -9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG -SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm -iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG -Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW -mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW -T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 ------END CERTIFICATE----- - -OISTE WISeKey Global Root GA CA -=============================== ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE -BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG -A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH -bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD -VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw -IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 -IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 -Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg -Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD -d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ -/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R -LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm -MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 -+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY -okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= ------END CERTIFICATE----- - -Microsec e-Szigno Root CA -========================= ------BEGIN CERTIFICATE----- -MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE -BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL -EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 -MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz -dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT -GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG -d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N -oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc -QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ -PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb -MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG -IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD -VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 -LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A -dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn -AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA -4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg -AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA -egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 -Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO -PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv -c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h -cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw -IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT -WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV -MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER -MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp -Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal -HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT -nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE -aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a -86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK -yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB -S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= ------END CERTIFICATE----- - -Certigna -======== ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw -EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 -MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI -Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q -XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH -GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p -ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg -DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf -Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ -tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ -BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J -SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA -hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ -ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu -PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY -1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. -====================================== ------BEGIN CERTIFICATE----- -MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT -AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg -LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w -HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ -U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh -IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN -yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU -2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 -4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP -2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm -8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf -HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa -Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK -5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b -czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g -ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF -BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug -cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf -AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX -EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v -/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 -MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 -3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk -eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f -/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h -RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU -Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== ------END CERTIFICATE----- - -TC TrustCenter Class 2 CA II -============================ ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy -IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw -MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 -c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE -AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw -IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 -xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ -Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u -SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB -7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 -Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU -cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i -SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G -dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ -KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj -TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP -JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk -vQ== ------END CERTIFICATE----- - -TC TrustCenter Class 3 CA II -============================ ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy -IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw -MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 -c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE -AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W -yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo -6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ -uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk -2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB -7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 -Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU -cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i -SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE -O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 -yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 -IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal -092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc -5A== ------END CERTIFICATE----- - -TC TrustCenter Universal CA I -============================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy -IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN -MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg -VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw -JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC -qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv -xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw -ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O -gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j -BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG -1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy -vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 -ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT -ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a -7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY ------END CERTIFICATE----- - -Deutsche Telekom Root CA 2 -========================== ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT -RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG -A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 -MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G -A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS -b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 -bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI -KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY -AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK -Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV -jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV -HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr -E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy -zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 -rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G -dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -ComSign Secured CA -================== ------BEGIN CERTIFICATE----- -MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE -AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w -NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD -QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs -49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH -7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB -kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 -9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw -AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t -U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA -j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC -AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a -BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp -FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP -51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz -OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== ------END CERTIFICATE----- - -Cybertrust Global Root -====================== ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li -ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 -MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD -ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW -0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL -AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin -89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT -8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 -MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G -A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO -lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi -5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 -hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T -X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -ePKI Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG -EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx -MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq -MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs -IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi -lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv -qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX -12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O -WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ -ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao -lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ -vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi -Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi -MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 -1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq -KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV -xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP -NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r -GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE -xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx -gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy -sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD -BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 -============================================================================================================================= ------BEGIN CERTIFICATE----- -MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH -DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q -aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry -b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV -BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg -S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 -MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl -IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF -n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl -IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft -dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl -cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO -Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 -xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR -6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL -hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd -BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 -N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT -y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh -LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M -dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= ------END CERTIFICATE----- - -Buypass Class 2 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 -MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M -cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 -0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 -0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R -uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV -1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt -7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 -fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w -wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho ------END CERTIFICATE----- - -Buypass Class 3 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 -MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx -ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 -n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia -AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c -1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 -pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA -EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 -htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj -el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 ------END CERTIFICATE----- - -EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 -========================================================================== ------BEGIN CERTIFICATE----- -MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg -QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe -Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p -ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt -IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by -X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b -gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr -eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ -TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy -Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn -uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI -qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm -ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0 -Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB -/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW -Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t -FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm -zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k -XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT -bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU -RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK -1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt -2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ -Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9 -AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT ------END CERTIFICATE----- - -certSIGN ROOT CA -================ ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD -VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa -Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE -CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I -JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH -rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 -ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD -0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 -AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB -AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 -SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 -x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt -vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz -TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -CNNIC ROOT -========== ------BEGIN CERTIFICATE----- -MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE -ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw -OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD -o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz -VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT -VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or -czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK -y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC -wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S -lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 -Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM -O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 -BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 -G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m -mxE= ------END CERTIFICATE----- - -ApplicationCA - Japanese Government -=================================== ------BEGIN CERTIFICATE----- -MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT -SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw -MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl -cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 -fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN -wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE -jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu -nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU -WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV -BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD -vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs -o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g -/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD -io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW -dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL -rosot4LKGAfmt1t06SAZf7IbiVQ= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G3 -============================================= ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 -IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz -NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo -YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT -LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j -K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE -c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C -IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu -dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr -2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 -cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE -Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s -t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -thawte Primary Root CA - G2 -=========================== ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC -VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu -IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg -Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV -MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG -b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt -IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS -LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 -8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU -mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN -G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K -rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -thawte Primary Root CA - G3 -=========================== ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w -ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD -VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG -A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At -P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC -+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY -7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW -vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ -KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK -A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC -8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm -er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G2 -============================================= ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 -OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl -b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG -BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc -KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ -EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m -ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 -npaqBA+K ------END CERTIFICATE----- - -VeriSign Universal Root Certification Authority -=============================================== ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj -1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP -MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 -9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I -AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR -tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G -CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O -a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 -Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx -Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx -P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P -wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 -mJO37M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G4 -============================================================ ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC -VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 -b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz -ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo -b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 -Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz -rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw -HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u -Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD -A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx -AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -NetLock Arany (Class Gold) FÅ‘tanúsítvány -============================================ ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G -A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 -dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB -cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx -MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO -ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 -c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu -0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw -/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk -H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw -fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 -neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW -qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta -YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna -NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu -dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -Staat der Nederlanden Root CA - G2 -================================== ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE -CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g -Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC -TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l -ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ -5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn -vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj -CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil -e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR -OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI -CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 -48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi -trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 -qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB -AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC -ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA -A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz -+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj -f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN -kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk -CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF -URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb -CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h -oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV -IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm -66+KAQ== ------END CERTIFICATE----- - -CA Disig -======== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK -QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw -MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz -bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm -GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD -Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo -hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt -ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w -gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P -AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz -aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff -ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa -BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t -WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 -mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ -CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K -ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA -4Z7CRneC9VkGjCFMhwnN5ag= ------END CERTIFICATE----- - -Juur-SK -======= ------BEGIN CERTIFICATE----- -MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA -c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw -DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG -SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy -aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf -TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC -+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw -UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa -Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF -MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD -HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh -AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA -cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr -AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw -cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE -FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G -A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo -ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL -abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 -IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh -Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 -yyqcjg== ------END CERTIFICATE----- - -Hongkong Post Root CA 1 -======================= ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT -DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx -NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n -IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 -ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr -auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh -qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY -V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV -HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i -h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio -l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei -IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps -T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT -c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== ------END CERTIFICATE----- - -SecureSign RootCA11 -=================== ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi -SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS -b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw -KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 -cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL -TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO -wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq -g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP -O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA -bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX -t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh -OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r -bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ -Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 -y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 -lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -ACEDICOM Root -============= ------BEGIN CERTIFICATE----- -MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD -T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4 -MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG -A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk -WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD -YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew -MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb -m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk -HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT -xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2 -3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9 -2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq -TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz -4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU -9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv -bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg -aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP -eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk -zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1 -ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI -KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq -nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE -I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp -MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o -tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA== ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky -CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX -bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ -D/xwzoiQ ------END CERTIFICATE----- - -Microsec e-Szigno Root CA 2009 -============================== ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER -MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv -c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE -BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt -U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA -fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG -0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA -pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm -1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC -AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf -QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE -FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o -lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX -I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 -yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi -LXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi -=================================================== ------BEGIN CERTIFICATE----- -MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG -EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz -ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 -MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 -cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u -aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY -8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y -jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI -JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk -9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG -SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d -F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq -D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 -Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq -fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX ------END CERTIFICATE----- - -GlobalSign Root CA - R3 -======================= ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt -iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ -0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 -rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl -OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 -xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 -lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 -EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E -bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 -YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r -kpeDMdmztcpHWD9f ------END CERTIFICATE----- - -TC TrustCenter Universal CA III -=============================== ------BEGIN CERTIFICATE----- -MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy -IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe -Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU -QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex -KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt -QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO -juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut -CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1 -M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G -A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA -g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+ -KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK -BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV -CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq -woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== ------END CERTIFICATE----- - -Autoridad de Certificacion Firmaprofesional CIF A62634068 -========================================================= ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA -BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw -QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB -NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD -Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P -B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY -7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH -ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI -plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX -MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX -LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK -bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU -vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud -EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH -DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA -bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx -ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx -51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk -R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP -T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f -Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl -osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR -crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR -saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD -KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi -6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -Izenpe.com -========== ------BEGIN CERTIFICATE----- -MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG -EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz -MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu -QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ -03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK -ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU -+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC -PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT -OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK -F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK -0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ -0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB -leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID -AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ -SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG -NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx -MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O -BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l -Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga -kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q -hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs -g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 -aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 -nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC -ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo -Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z -WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== ------END CERTIFICATE----- - -Chambers of Commerce Root - 2008 -================================ ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy -Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl -ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF -EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl -cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA -XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj -h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ -ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk -NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g -D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 -lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ -0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 -EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI -G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ -BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh -bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh -bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC -CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH -AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 -wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH -3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU -RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 -M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 -YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF -9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK -zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG -nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ ------END CERTIFICATE----- - -Global Chambersign Root - 2008 -============================== ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx -NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg -Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ -QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf -VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf -XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 -ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB -/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA -TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M -H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe -Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF -HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB -AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT -BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE -BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm -aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm -aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp -1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 -dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG -/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 -ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s -dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg -9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH -foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du -qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr -P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq -c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -Go Daddy Root Certificate Authority - G2 -======================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu -MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G -A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq -9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD -+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd -fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl -NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 -BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac -vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r -5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV -N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 ------END CERTIFICATE----- - -Starfield Root Certificate Authority - G2 -========================================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 -eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw -DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg -VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB -dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv -W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs -bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk -N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf -ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU -JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol -TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx -4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw -F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ -c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -Starfield Services Root Certificate Authority - G2 -================================================== ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl -IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT -dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 -h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa -hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP -LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB -rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG -SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP -E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy -xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza -YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 ------END CERTIFICATE----- - -AffirmTrust Commercial -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw -MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb -DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV -C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 -BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww -MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV -HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG -hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi -qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv -0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh -sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -AffirmTrust Networking -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw -MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE -Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI -dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 -/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb -h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV -HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu -UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 -12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 -WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 -/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -AffirmTrust Premium -=================== ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy -OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy -dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn -BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV -5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs -+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd -GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R -p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI -S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 -6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 -/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo -+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv -MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC -6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S -L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK -+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV -BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg -IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 -g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb -zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== ------END CERTIFICATE----- - -AffirmTrust Premium ECC -======================= ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV -BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx -MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U -cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ -N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW -BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK -BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X -57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM -eQ== ------END CERTIFICATE----- - -Certum Trusted Network CA -========================= ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK -ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy -MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU -ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC -l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J -J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 -fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 -cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB -Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw -DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj -jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 -mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj -Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -Certinomis - Autorité Racine -============================= ------BEGIN CERTIFICATE----- -MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK -Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg -LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG -A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw -JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa -wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly -Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw -2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N -jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q -c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC -lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb -xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g -530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna -4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ -KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x -WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva -R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 -nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B -CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv -JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE -qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b -WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE -wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ -vgt2Fl43N+bYdJeimUV5 ------END CERTIFICATE----- - -Root CA Generalitat Valenciana -============================== ------BEGIN CERTIFICATE----- -MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE -ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 -IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 -WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE -CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 -F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B -ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ -D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte -JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB -AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n -dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB -ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl -AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA -YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy -AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA -aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt -AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA -YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu -AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA -OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 -dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV -BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G -A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S -b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh -TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz -Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 -NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH -iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt -+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= ------END CERTIFICATE----- - -A-Trust-nQual-03 -================ ------BEGIN CERTIFICATE----- -MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE -Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy -a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R -dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw -RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 -ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 -c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA -zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n -yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE -SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 -iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V -cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV -eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 -ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr -sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd -JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS -mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 -ahq97BvIxYSazQ== ------END CERTIFICATE----- - -TWCA Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ -VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG -EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB -IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx -QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC -oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP -4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r -y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG -9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC -mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW -QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY -T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny -Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/tmhOAuth.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/tmhOAuth.php deleted file mode 100755 index c4ad4e78..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/tmhOAuth.php +++ /dev/null @@ -1,724 +0,0 @@ -params = array(); - $this->headers = array(); - $this->auto_fixed_time = false; - $this->buffer = null; - - // default configuration options - $this->config = array_merge( - array( - // leave 'user_agent' blank for default, otherwise set this to - // something that clearly identifies your app - 'user_agent' => '', - // default timezone for requests - 'timezone' => 'UTC', - - 'use_ssl' => true, - 'host' => 'api.twitter.com', - - 'consumer_key' => '', - 'consumer_secret' => '', - 'user_token' => '', - 'user_secret' => '', - 'force_nonce' => false, - 'nonce' => false, // used for checking signatures. leave as false for auto - 'force_timestamp' => false, - 'timestamp' => false, // used for checking signatures. leave as false for auto - - // oauth signing variables that are not dynamic - 'oauth_version' => '1.0', - 'oauth_signature_method' => 'HMAC-SHA1', - - // you probably don't want to change any of these curl values - 'curl_connecttimeout' => 30, - 'curl_timeout' => 10, - - // for security this should always be set to 2. - 'curl_ssl_verifyhost' => 2, - // for security this should always be set to true. - 'curl_ssl_verifypeer' => true, - - // you can get the latest cacert.pem from here http://curl.haxx.se/ca/cacert.pem - 'curl_cainfo' => dirname(__FILE__) . DIRECTORY_SEPARATOR . 'cacert.pem', - 'curl_capath' => dirname(__FILE__), - - 'curl_followlocation' => false, // whether to follow redirects or not - - // support for proxy servers - 'curl_proxy' => false, // really you don't want to use this if you are using streaming - 'curl_proxyuserpwd' => false, // format username:password for proxy, if required - 'curl_encoding' => '', // leave blank for all supported formats, else use gzip, deflate, identity - - // streaming API - 'is_streaming' => false, - 'streaming_eol' => "\r\n", - 'streaming_metrics_interval' => 60, - - // header or querystring. You should always use header! - // this is just to help me debug other developers implementations - 'as_header' => true, - 'debug' => false, - ), - $config - ); - $this->set_user_agent(); - date_default_timezone_set($this->config['timezone']); - } - - /** - * Sets the useragent for PHP to use - * If '$this->config['user_agent']' already has a value it is used instead of one - * being generated. - * - * @return void value is stored to the config array class variable - */ - private function set_user_agent() { - if (!empty($this->config['user_agent'])) - return; - - if ($this->config['curl_ssl_verifyhost'] && $this->config['curl_ssl_verifypeer']) { - $ssl = '+SSL'; - } else { - $ssl = '-SSL'; - } - - $ua = 'tmhOAuth ' . self::VERSION . $ssl . ' - //github.com/themattharris/tmhOAuth'; - $this->config['user_agent'] = $ua; - } - - /** - * Generates a random OAuth nonce. - * If 'force_nonce' is true a nonce is not generated and the value in the configuration will be retained. - * - * @param string $length how many characters the nonce should be before MD5 hashing. default 12 - * @param string $include_time whether to include time at the beginning of the nonce. default true - * @return void value is stored to the config array class variable - */ - private function create_nonce($length=12, $include_time=true) { - if ($this->config['force_nonce'] == false) { - $sequence = array_merge(range(0,9), range('A','Z'), range('a','z')); - $length = $length > count($sequence) ? count($sequence) : $length; - shuffle($sequence); - - $prefix = $include_time ? microtime() : ''; - $this->config['nonce'] = md5(substr($prefix . implode('', $sequence), 0, $length)); - } - } - - /** - * Generates a timestamp. - * If 'force_timestamp' is true a nonce is not generated and the value in the configuration will be retained. - * - * @return void value is stored to the config array class variable - */ - private function create_timestamp() { - $this->config['timestamp'] = ($this->config['force_timestamp'] == false ? time() : $this->config['timestamp']); - } - - /** - * Encodes the string or array passed in a way compatible with OAuth. - * If an array is passed each array value will will be encoded. - * - * @param mixed $data the scalar or array to encode - * @return $data encoded in a way compatible with OAuth - */ - private function safe_encode($data) { - if (is_array($data)) { - return array_map(array($this, 'safe_encode'), $data); - } else if (is_scalar($data)) { - return str_ireplace( - array('+', '%7E'), - array(' ', '~'), - rawurlencode($data) - ); - } else { - return ''; - } - } - - /** - * Decodes the string or array from it's URL encoded form - * If an array is passed each array value will will be decoded. - * - * @param mixed $data the scalar or array to decode - * @return string $data decoded from the URL encoded form - */ - private function safe_decode($data) { - if (is_array($data)) { - return array_map(array($this, 'safe_decode'), $data); - } else if (is_scalar($data)) { - return rawurldecode($data); - } else { - return ''; - } - } - - /** - * Returns an array of the standard OAuth parameters. - * - * @return array all required OAuth parameters, safely encoded - */ - private function get_defaults() { - $defaults = array( - 'oauth_version' => $this->config['oauth_version'], - 'oauth_nonce' => $this->config['nonce'], - 'oauth_timestamp' => $this->config['timestamp'], - 'oauth_consumer_key' => $this->config['consumer_key'], - 'oauth_signature_method' => $this->config['oauth_signature_method'], - ); - - // include the user token if it exists - if ( $this->config['user_token'] ) - $defaults['oauth_token'] = $this->config['user_token']; - - // safely encode - foreach ($defaults as $k => $v) { - $_defaults[$this->safe_encode($k)] = $this->safe_encode($v); - } - - return $_defaults; - } - - /** - * Extracts and decodes OAuth parameters from the passed string - * - * @param string $body the response body from an OAuth flow method - * @return array the response body safely decoded to an array of key => values - */ - public function extract_params($body) { - $kvs = explode('&', $body); - $decoded = array(); - foreach ($kvs as $kv) { - $kv = explode('=', $kv, 2); - $kv[0] = $this->safe_decode($kv[0]); - $kv[1] = $this->safe_decode($kv[1]); - $decoded[$kv[0]] = $kv[1]; - } - return $decoded; - } - - /** - * Prepares the HTTP method for use in the base string by converting it to - * uppercase. - * - * @param string $method an HTTP method such as GET or POST - * @return void value is stored to the class variable 'method' - */ - private function prepare_method($method) { - $this->method = strtoupper($method); - } - - /** - * Prepares the URL for use in the base string by ripping it apart and - * reconstructing it. - * - * Ref: 3.4.1.2 - * - * @param string $url the request URL - * @return void value is stored to the class variable 'url' - */ - private function prepare_url($url) { - $parts = parse_url($url); - - $port = isset($parts['port']) ? $parts['port'] : false; - $scheme = $parts['scheme']; - $host = $parts['host']; - $path = isset($parts['path']) ? $parts['path'] : false; - - $port or $port = ($scheme == 'https') ? '443' : '80'; - - if (($scheme == 'https' && $port != '443') - || ($scheme == 'http' && $port != '80')) { - $host = "$host:$port"; - } - - // the scheme and host MUST be lowercase - $this->url = strtolower("$scheme://$host"); - // but not the path - $this->url .= $path; - } - - /** - * Prepares all parameters for the base string and request. - * Multipart parameters are ignored as they are not defined in the specification, - * all other types of parameter are encoded for compatibility with OAuth. - * - * @param array $params the parameters for the request - * @return void prepared values are stored in the class variable 'signing_params' - */ - private function prepare_params($params) { - // do not encode multipart parameters, leave them alone - if ($this->config['multipart']) { - $this->request_params = $params; - $params = array(); - } - - // signing parameters are request parameters + OAuth default parameters - $this->signing_params = array_merge($this->get_defaults(), (array)$params); - - // Remove oauth_signature if present - // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.") - if (isset($this->signing_params['oauth_signature'])) { - unset($this->signing_params['oauth_signature']); - } - - // Parameters are sorted by name, using lexicographical byte value ordering. - // Ref: Spec: 9.1.1 (1) - uksort($this->signing_params, 'strcmp'); - - // encode. Also sort the signed parameters from the POST parameters - foreach ($this->signing_params as $k => $v) { - $k = $this->safe_encode($k); - - if (is_array($v)) - $v = implode(',', $v); - - $v = $this->safe_encode($v); - $_signing_params[$k] = $v; - $kv[] = "{$k}={$v}"; - } - - // auth params = the default oauth params which are present in our collection of signing params - $this->auth_params = array_intersect_key($this->get_defaults(), $_signing_params); - if (isset($_signing_params['oauth_callback'])) { - $this->auth_params['oauth_callback'] = $_signing_params['oauth_callback']; - unset($_signing_params['oauth_callback']); - } - - if (isset($_signing_params['oauth_verifier'])) { - $this->auth_params['oauth_verifier'] = $_signing_params['oauth_verifier']; - unset($_signing_params['oauth_verifier']); - } - - // request_params is already set if we're doing multipart, if not we need to set them now - if ( ! $this->config['multipart']) - $this->request_params = array_diff_key($_signing_params, $this->get_defaults()); - - // create the parameter part of the base string - $this->signing_params = implode('&', $kv); - } - - /** - * Prepares the OAuth signing key - * - * @return void prepared signing key is stored in the class variable 'signing_key' - */ - private function prepare_signing_key() { - $this->signing_key = $this->safe_encode($this->config['consumer_secret']) . '&' . $this->safe_encode($this->config['user_secret']); - } - - /** - * Prepare the base string. - * Ref: Spec: 9.1.3 ("Concatenate Request Elements") - * - * @return void prepared base string is stored in the class variable 'base_string' - */ - private function prepare_base_string() { - $url = $this->url; - - # if the host header is set we need to rewrite the basestring to use - # that, instead of the request host. otherwise the signature won't match - # on the server side - if (!empty($this->custom_headers['Host'])) { - $url = str_ireplace( - $this->config['host'], - $this->custom_headers['Host'], - $url - ); - } - - $base = array( - $this->method, - $url, - $this->signing_params - ); - $this->base_string = implode('&', $this->safe_encode($base)); - } - - /** - * Prepares the Authorization header - * - * @return void prepared authorization header is stored in the class variable headers['Authorization'] - */ - private function prepare_auth_header() { - unset($this->headers['Authorization']); - - uksort($this->auth_params, 'strcmp'); - if (!$this->config['as_header']) : - $this->request_params = array_merge($this->request_params, $this->auth_params); - return; - endif; - - foreach ($this->auth_params as $k => $v) { - $kv[] = "{$k}=\"{$v}\""; - } - $this->auth_header = 'OAuth ' . implode(', ', $kv); - $this->headers['Authorization'] = $this->auth_header; - } - - /** - * Signs the request and adds the OAuth signature. This runs all the request - * parameter preparation methods. - * - * @param string $method the HTTP method being used. e.g. POST, GET, HEAD etc - * @param string $url the request URL without query string parameters - * @param array $params the request parameters as an array of key=value pairs - * @param string $useauth whether to use authentication when making the request. - * @return void - */ - private function sign($method, $url, $params, $useauth) { - $this->prepare_method($method); - $this->prepare_url($url); - $this->prepare_params($params); - - // we don't sign anything is we're not using auth - if ($useauth) { - $this->prepare_base_string(); - $this->prepare_signing_key(); - - $this->auth_params['oauth_signature'] = $this->safe_encode( - base64_encode( - hash_hmac( - 'sha1', $this->base_string, $this->signing_key, true - ))); - - $this->prepare_auth_header(); - } - } - - /** - * Make an HTTP request using this library. This method doesn't return anything. - * Instead the response should be inspected directly. - * - * @param string $method the HTTP method being used. e.g. POST, GET, HEAD etc - * @param string $url the request URL without query string parameters - * @param array $params the request parameters as an array of key=value pairs. Default empty array - * @param string $useauth whether to use authentication when making the request. Default true - * @param string $multipart whether this request contains multipart data. Default false - * @param array $headers any custom headers to send with the request. Default empty array - * @return int the http response code for the request. 0 is returned if a connection could not be made - */ - public function request($method, $url, $params=array(), $useauth=true, $multipart=false, $headers=array()) { - // reset the request headers (we don't want to reuse them) - $this->headers = array(); - $this->custom_headers = $headers; - - $this->config['multipart'] = $multipart; - - $this->create_nonce(); - $this->create_timestamp(); - - $this->sign($method, $url, $params, $useauth); - - if (!empty($this->custom_headers)) - $this->headers = array_merge((array)$this->headers, (array)$this->custom_headers); - - return $this->curlit(); - } - - /** - * Make a long poll HTTP request using this library. This method is - * different to the other request methods as it isn't supposed to disconnect - * - * Using this method expects a callback which will receive the streaming - * responses. - * - * @param string $method the HTTP method being used. e.g. POST, GET, HEAD etc - * @param string $url the request URL without query string parameters - * @param array $params the request parameters as an array of key=value pairs - * @param string $callback the callback function to stream the buffer to. - * @return void - */ - public function streaming_request($method, $url, $params=array(), $callback='') { - if ( ! empty($callback) ) { - if ( ! is_callable($callback) ) { - return false; - } - $this->config['streaming_callback'] = $callback; - } - $this->metrics['start'] = time(); - $this->metrics['interval_start'] = $this->metrics['start']; - $this->metrics['tweets'] = 0; - $this->metrics['last_tweets'] = 0; - $this->metrics['bytes'] = 0; - $this->metrics['last_bytes'] = 0; - $this->config['is_streaming'] = true; - $this->request($method, $url, $params); - } - - /** - * Handles the updating of the current Streaming API metrics. - * - * @return array the metrics for the streaming api connection - */ - private function update_metrics() { - $now = time(); - if (($this->metrics['interval_start'] + $this->config['streaming_metrics_interval']) > $now) - return false; - - $this->metrics['tps'] = round( ($this->metrics['tweets'] - $this->metrics['last_tweets']) / $this->config['streaming_metrics_interval'], 2); - $this->metrics['bps'] = round( ($this->metrics['bytes'] - $this->metrics['last_bytes']) / $this->config['streaming_metrics_interval'], 2); - - $this->metrics['last_bytes'] = $this->metrics['bytes']; - $this->metrics['last_tweets'] = $this->metrics['tweets']; - $this->metrics['interval_start'] = $now; - return $this->metrics; - } - - /** - * Utility function to create the request URL in the requested format - * - * @param string $request the API method without extension - * @param string $format the format of the response. Default json. Set to an empty string to exclude the format - * @return string the concatenation of the host, API version, API method and format - */ - public function url($request, $format='json') { - $format = strlen($format) > 0 ? ".$format" : ''; - $proto = $this->config['use_ssl'] ? 'https:/' : 'http:/'; - - // backwards compatibility with v0.1 - if (isset($this->config['v'])) - $this->config['host'] = $this->config['host'] . '/' . $this->config['v']; - - $request = ltrim($request, '/'); - - $pos = strlen($request) - strlen($format); - if (substr($request, $pos) === $format) - $request = substr_replace($request, '', $pos); - - return implode('/', array( - $proto, - $this->config['host'], - $request . $format - )); - } - - /** - * Public access to the private safe decode/encode methods - * - * @param string $text the text to transform - * @param string $mode the transformation mode. either encode or decode - * @return string $text transformed by the given $mode - */ - public function transformText($text, $mode='encode') { - return $this->{"safe_$mode"}($text); - } - - /** - * Utility function to parse the returned curl headers and store them in the - * class array variable. - * - * @param object $ch curl handle - * @param string $header the response headers - * @return string the length of the header - */ - private function curlHeader($ch, $header) { - $this->response['raw'] .= $header; - - list($key, $value) = array_pad(explode(':', $header, 2), 2, null); - - $key = trim($key); - $value = trim($value); - - if ( ! isset($this->response['headers'][$key])) { - $this->response['headers'][$key] = $value; - } else { - if (!is_array($this->response['headers'][$key])) { - $this->response['headers'][$key] = array($this->response['headers'][$key]); - } - $this->response['headers'][$key][] = $value; - } - - return strlen($header); - } - - /** - * Utility function to parse the returned curl buffer and store them until - * an EOL is found. The buffer for curl is an undefined size so we need - * to collect the content until an EOL is found. - * - * This function calls the previously defined streaming callback method. - * - * @param object $ch curl handle - * @param string $data the current curl buffer - * @return int the length of the data string processed in this function - */ - private function curlWrite($ch, $data) { - $l = strlen($data); - if (strpos($data, $this->config['streaming_eol']) === false) { - $this->buffer .= $data; - return $l; - } - - $buffered = explode($this->config['streaming_eol'], $data); - $content = $this->buffer . $buffered[0]; - - $this->metrics['tweets']++; - $this->metrics['bytes'] += strlen($content); - - if ( ! is_callable($this->config['streaming_callback'])) - return 0; - - $metrics = $this->update_metrics(); - $stop = call_user_func( - $this->config['streaming_callback'], - $content, - strlen($content), - $metrics - ); - $this->buffer = $buffered[1]; - if ($stop) - return 0; - - return $l; - } - - /** - * Makes a curl request. Takes no parameters as all should have been prepared - * by the request method - * - * the response data is stored in the class variable 'response' - * - * @return int the http response code for the request. 0 is returned if a connection could not be made - */ - private function curlit() { - $this->response['raw'] = ''; - - // method handling - switch ($this->method) { - case 'POST': - break; - default: - // GET, DELETE request so convert the parameters to a querystring - if ( ! empty($this->request_params)) { - foreach ($this->request_params as $k => $v) { - // Multipart params haven't been encoded yet. - // Not sure why you would do a multipart GET but anyway, here's the support for it - if ($this->config['multipart']) { - $params[] = $this->safe_encode($k) . '=' . $this->safe_encode($v); - } else { - $params[] = $k . '=' . $v; - } - } - $qs = implode('&', $params); - $this->url = strlen($qs) > 0 ? $this->url . '?' . $qs : $this->url; - $this->request_params = array(); - } - break; - } - - // configure curl - $c = curl_init(); - curl_setopt_array($c, array( - CURLOPT_USERAGENT => $this->config['user_agent'], - CURLOPT_CONNECTTIMEOUT => $this->config['curl_connecttimeout'], - CURLOPT_TIMEOUT => $this->config['curl_timeout'], - CURLOPT_RETURNTRANSFER => true, - CURLOPT_SSL_VERIFYPEER => $this->config['curl_ssl_verifypeer'], - CURLOPT_SSL_VERIFYHOST => $this->config['curl_ssl_verifyhost'], - - CURLOPT_FOLLOWLOCATION => $this->config['curl_followlocation'], - CURLOPT_PROXY => $this->config['curl_proxy'], - CURLOPT_ENCODING => $this->config['curl_encoding'], - CURLOPT_URL => $this->url, - // process the headers - CURLOPT_HEADERFUNCTION => array($this, 'curlHeader'), - CURLOPT_HEADER => false, - CURLINFO_HEADER_OUT => true, - )); - - if ($this->config['curl_cainfo'] !== false) - curl_setopt($c, CURLOPT_CAINFO, $this->config['curl_cainfo']); - - if ($this->config['curl_capath'] !== false) - curl_setopt($c, CURLOPT_CAPATH, $this->config['curl_capath']); - - if ($this->config['curl_proxyuserpwd'] !== false) - curl_setopt($c, CURLOPT_PROXYUSERPWD, $this->config['curl_proxyuserpwd']); - - if ($this->config['is_streaming']) { - // process the body - $this->response['content-length'] = 0; - curl_setopt($c, CURLOPT_TIMEOUT, 0); - curl_setopt($c, CURLOPT_WRITEFUNCTION, array($this, 'curlWrite')); - } - - switch ($this->method) { - case 'GET': - break; - case 'POST': - curl_setopt($c, CURLOPT_POST, true); - curl_setopt($c, CURLOPT_POSTFIELDS, $this->request_params); - break; - default: - curl_setopt($c, CURLOPT_CUSTOMREQUEST, $this->method); - } - - if ( ! empty($this->request_params) ) { - // if not doing multipart we need to implode the parameters - if ( ! $this->config['multipart'] ) { - foreach ($this->request_params as $k => $v) { - $ps[] = "{$k}={$v}"; - } - $this->request_params = implode('&', $ps); - } - curl_setopt($c, CURLOPT_POSTFIELDS, $this->request_params); - } - - if ( ! empty($this->headers)) { - foreach ($this->headers as $k => $v) { - $headers[] = trim($k . ': ' . $v); - } - curl_setopt($c, CURLOPT_HTTPHEADER, $headers); - } - - if (isset($this->config['prevent_request']) && (true == $this->config['prevent_request'])) - return 0; - - // do it! - $response = curl_exec($c); - $code = curl_getinfo($c, CURLINFO_HTTP_CODE); - $info = curl_getinfo($c); - $error = curl_error($c); - $errno = curl_errno($c); - curl_close($c); - - // store the response - $this->response['code'] = $code; - $this->response['response'] = $response; - $this->response['info'] = $info; - $this->response['error'] = $error; - $this->response['errno'] = $errno; - - if (!isset($this->response['raw'])) { - $this->response['raw'] = ''; - } - $this->response['raw'] .= $response; - - return $code; - } -} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/tmhUtilities.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/tmhUtilities.php deleted file mode 100755 index 22277df3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/libraries/tmhOAuth/tmhUtilities.php +++ /dev/null @@ -1,280 +0,0 @@ - 'UTF-8', - 'target' => '', - ); - - $opts = array_merge($default_opts, $options); - - $encoding = mb_internal_encoding(); - mb_internal_encoding($opts['encoding']); - - $keys = array(); - $is_retweet = false; - - if (isset($tweet['retweeted_status'])) { - $tweet = $tweet['retweeted_status']; - $is_retweet = true; - } - - if (!isset($tweet['entities'])) { - return $tweet['text']; - } - - $target = (!empty($opts['target'])) ? ' target="'.$opts['target'].'"' : ''; - - // prepare the entities - foreach ($tweet['entities'] as $type => $things) { - foreach ($things as $entity => $value) { - $tweet_link = "{$tweet['created_at']}"; - - switch ($type) { - case 'hashtags': - $href = "#{$value['text']}"; - break; - case 'user_mentions': - $href = "@{$value['screen_name']}"; - break; - case 'urls': - case 'media': - $url = empty($value['expanded_url']) ? $value['url'] : $value['expanded_url']; - $display = isset($value['display_url']) ? $value['display_url'] : str_replace('http://', '', $url); - // Not all pages are served in UTF-8 so you may need to do this ... - $display = urldecode(str_replace('%E2%80%A6', '…', urlencode($display))); - $href = "{$display}"; - break; - } - $keys[$value['indices']['0']] = mb_substr( - $tweet['text'], - $value['indices']['0'], - $value['indices']['1'] - $value['indices']['0'] - ); - $replacements[$value['indices']['0']] = $href; - } - } - - ksort($replacements); - $replacements = array_reverse($replacements, true); - $entified_tweet = $tweet['text']; - foreach ($replacements as $k => $v) { - $entified_tweet = mb_substr($entified_tweet, 0, $k).$v.mb_substr($entified_tweet, $k + strlen($keys[$k])); - } - $replacements = array( - 'replacements' => $replacements, - 'keys' => $keys - ); - - mb_internal_encoding($encoding); - return $entified_tweet; - } - - /** - * Returns the current URL. This is instead of PHP_SELF which is unsafe - * - * @param bool $dropqs whether to drop the querystring or not. Default true - * @return string the current URL - */ - public static function php_self($dropqs=true) { - $protocol = 'http'; - if (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') { - $protocol = 'https'; - } elseif (isset($_SERVER['SERVER_PORT']) && ($_SERVER['SERVER_PORT'] == '443')) { - $protocol = 'https'; - } - - $url = sprintf('%s://%s%s', - $protocol, - $_SERVER['SERVER_NAME'], - $_SERVER['REQUEST_URI'] - ); - - $parts = parse_url($url); - - $port = $_SERVER['SERVER_PORT']; - $scheme = $parts['scheme']; - $host = $parts['host']; - $path = @$parts['path']; - $qs = @$parts['query']; - - $port or $port = ($scheme == 'https') ? '443' : '80'; - - if (($scheme == 'https' && $port != '443') - || ($scheme == 'http' && $port != '80')) { - $host = "$host:$port"; - } - $url = "$scheme://$host$path"; - if ( ! $dropqs) - return "{$url}?{$qs}"; - else - return $url; - } - - public static function is_cli() { - return (PHP_SAPI == 'cli' && empty($_SERVER['REMOTE_ADDR'])); - } - - /** - * Debug function for printing the content of an object - * - * @param mixes $obj - */ - public static function pr($obj) { - - if (!self::is_cli()) - echo '
';
-    if ( is_object($obj) )
-      print_r($obj);
-    elseif ( is_array($obj) )
-      print_r($obj);
-    else
-      echo $obj;
-    if (!self::is_cli())
-      echo '
'; - } - - /** - * Make an HTTP request using this library. This method is different to 'request' - * because on a 401 error it will retry the request. - * - * When a 401 error is returned it is possible the timestamp of the client is - * too different to that of the API server. In this situation it is recommended - * the request is retried with the OAuth timestamp set to the same as the API - * server. This method will automatically try that technique. - * - * This method doesn't return anything. Instead the response should be - * inspected directly. - * - * @param string $method the HTTP method being used. e.g. POST, GET, HEAD etc - * @param string $url the request URL without query string parameters - * @param array $params the request parameters as an array of key=value pairs - * @param string $useauth whether to use authentication when making the request. Default true. - * @param string $multipart whether this request contains multipart data. Default false - */ - public static function auto_fix_time_request($tmhOAuth, $method, $url, $params=array(), $useauth=true, $multipart=false) { - $tmhOAuth->request($method, $url, $params, $useauth, $multipart); - - // if we're not doing auth the timestamp isn't important - if ( ! $useauth) - return; - - // some error that isn't a 401 - if ($tmhOAuth->response['code'] != 401) - return; - - // some error that is a 401 but isn't because the OAuth token and signature are incorrect - // TODO: this check is horrid but helps avoid requesting twice when the username and password are wrong - if (stripos($tmhOAuth->response['response'], 'password') !== false) - return; - - // force the timestamp to be the same as the Twitter servers, and re-request - $tmhOAuth->auto_fixed_time = true; - $tmhOAuth->config['force_timestamp'] = true; - $tmhOAuth->config['timestamp'] = strtotime($tmhOAuth->response['headers']['date']); - return $tmhOAuth->request($method, $url, $params, $useauth, $multipart); - } - - /** - * Asks the user for input and returns the line they enter - * - * @param string $prompt the text to display to the user - * @return the text entered by the user - */ - public static function read_input($prompt) { - echo $prompt; - $handle = fopen("php://stdin","r"); - $data = fgets($handle); - return trim($data); - } - - /** - * Get a password from the shell. - * - * This function works on *nix systems only and requires shell_exec and stty. - * - * @param boolean $stars Wether or not to output stars for given characters - * @return string - * @url http://www.dasprids.de/blog/2008/08/22/getting-a-password-hidden-from-stdin-with-php-cli - */ - public static function read_password($prompt, $stars=false) { - echo $prompt; - $style = shell_exec('stty -g'); - - if ($stars === false) { - shell_exec('stty -echo'); - $password = rtrim(fgets(STDIN), "\n"); - } else { - shell_exec('stty -icanon -echo min 1 time 0'); - $password = ''; - while (true) : - $char = fgetc(STDIN); - if ($char === "\n") : - break; - elseif (ord($char) === 127) : - if (strlen($password) > 0) { - fwrite(STDOUT, "\x08 \x08"); - $password = substr($password, 0, -1); - } - else - fwrite(STDOUT, "*"); - $password .= $char; - endif; - endwhile; - } - - // Reset - shell_exec('stty ' . $style); - echo PHP_EOL; - return $password; - } - - /** - * Check if one string ends with another - * - * @param string $haystack the string to check inside of - * @param string $needle the string to check $haystack ends with - * @return true if $haystack ends with $needle, false otherwise - */ - public static function endswith($haystack, $needle) { - $haylen = strlen($haystack); - $needlelen = strlen($needle); - if ($needlelen > $haylen) - return false; - - return substr_compare($haystack, $needle, -$needlelen) === 0; - } -} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/README b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/README deleted file mode 100755 index 7f2baf21..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/README +++ /dev/null @@ -1 +0,0 @@ -https://www.transifex.com/rainloop/rainloop-webmail/ \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/README b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/README deleted file mode 100755 index 7f2baf21..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/README +++ /dev/null @@ -1 +0,0 @@ -https://www.transifex.com/rainloop/rainloop-webmail/ \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/_source.en.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/_source.en.yml deleted file mode 100755 index ed6cbed2..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/_source.en.yml +++ /dev/null @@ -1,324 +0,0 @@ -en: - LOGIN: - LABEL_LOGIN: "Login" - LABEL_PASSWORD: "Password" - BUTTON_LOGIN: "Log into the admin panel" - TOP_PANEL: - LABEL_PREMIUM: "Premium" - LABEL_ADMIN_PANEL: "Admin Panel" - TABS_LABELS: - LABEL_GENERAL_NAME: "General" - LABEL_LOGIN_NAME: "Login" - LABEL_BRANDING_NAME: "Branding" - LABEL_CONTACTS_NAME: "Contacts" - LABEL_DOMAINS_NAME: "Domains" - LABEL_SECURITY_NAME: "Security" - LABEL_INTEGRATION_NAME: "Integrations" - LABEL_PLUGINS_NAME: "Plugins" - LABEL_PACKAGES_NAME: "Packages" - LABEL_LICENSING_NAME: "Licensing" - LABEL_ABOUT_NAME: "About" - TAB_GENERAL: - LEGEND_INTERFACE: "Interface" - LABEL_LANGUAGE: "Language" - LABEL_LANGUAGE_ADMIN: "Language (admin)" - LABEL_THEME: "Theme" - LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Allow language selection on settings screen" - LABEL_ALLOW_THEMES_ON_SETTINGS: "Allow theme selection on settings screen" - LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Allow background selection on settings screen" - LABEL_NEW_FOLDER_MOVE: "New \"move to folder\" button" - LABEL_SHOW_THUMBNAILS: "Show thumbnails (attachments)" - LABEL_ALLOW_GRAVATAR: "Allow Gravatar" - LEGEND_MAIN: "Main" - LABEL_ATTACHMENT_SIZE_LIMIT: "Attachment size limit" - LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Allow additional accounts" - LABEL_ALLOW_IDENTITIES: "Allow multiple identities" - LABEL_ALLOW_TEMPLATES: "Allow templates" - ALERT_DATA_ACCESS: "RainLoop data folder is accessible. Please configure your web server to hide the data folder from external access. Read more here:" - ALERT_WARNING: "Warning!" - HTML_ALERT_WEAK_PASSWORD: | - You are using the default admin password. -
- For security reasons please - change - password to something else now. - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "Login Screen" - LABEL_DEFAULT_DOMAIN: "Default Domain" - LABEL_DETERMINE_USER_DOMAIN: "Try to determine user domain" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Allow language selection on login screen" - LABEL_DETERMINE_USER_LANGUAGE: "Try to determine user language" - TAB_BRANDING: - LEGEND_BRANDING: "Branding" - LABEL_PAGE_TITLE: "Page Title" - LABEL_LOADING_DESCRIPTION: "Loading Description" - LABEL_FAVICON_URL: "Favicon" - LEGEND_LOGIN: "Login" - LABEL_LOGIN_LOGO: "Logo" - LABEL_LOGIN_DESCRIPTION: "Description" - LABEL_LOGIN_BACKGROUND: "Background" - LABEL_LOGIN_CUSTOM_CSS: "Custom CSS" - LABEL_LOGIN_SHOW_POWERED_LINK: "Show \"Powered by RainLoop\" link" - LEGEND_USER: "User" - LABEL_USER_LOGO: "Logo" - LABEL_USER_LOGO_TITLE: "Logo Title" - LABEL_USER_LOGO_MESSAGE: "Logo (Message View)" - LABEL_USER_CUSTOM_CSS: "Custom CSS" - LEGEND_WELCOME_PAGE: "Welcome page" - LABEL_WELCOME_PAGE_TITLE: "Title" - LABEL_WELCOME_PAGE_URL: "URL" - LABEL_WELCOME_PAGE_DISPLAY: "Display" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "None" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Once" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Always" - HTML_ALERT_PREMIUM: "This functionality is available for Premium subscribers." - TAB_CONTACTS: - LEGEND_CONTACTS: "Contacts" - LEGEND_STORAGE: "Storage (PDO)" - LABEL_ENABLE_CONTACTS: "Enable contacts" - LABEL_ALLOW_SYNC: "Allow contacts sync (with external CardDAV server)" - LABEL_STORAGE_TYPE: "Type" - LABEL_STORAGE_DSN: "Dsn" - LABEL_STORAGE_USER: "User" - LABEL_STORAGE_PASSWORD: "Password" - BUTTON_TEST: "Test" - ALERT_NOTICE: "Notice!" - HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Don't use this database type with a large number of active users." - HTML_ALERT_DOES_NOT_SUPPORTED: | - Your system doesn't support contacts. -
- You need to install or enable PDO (SQLite / MySQL / PostgreSQL) extension on your server. - TAB_DOMAINS: - LEGEND_DOMAINS: "Domains" - BUTTON_ADD_DOMAIN: "Add Domain" - BUTTON_ADD_ALIAS: "Add Alias" - DELETE_ARE_YOU_SURE: "Are you sure?" - HTML_DOMAINS_HELPER: | - List of domains webmail is allowed to access. -
- Click on the name to configure the domain. - TAB_SECURITY: - LEGEND_SECURITY: "Security" - LABEL_ALLOW_TWO_STEP: "Allow 2-Step Verification" - LABEL_FORCE_TWO_STEP: "Enforce 2-Step Verification" - LABEL_USE_IMAGE_PROXY: "Use local proxy for external images" - LABEL_ALLOW_OPEN_PGP: "Allow OpenPGP" - LABEL_SHOW_PHP_INFO: "Show PHP information" - LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Admin Panel Access Credentials" - LABEL_CURRENT_PASSWORD: "Current password" - LABEL_NEW_LOGIN: "New login" - LABEL_NEW_PASSWORD: "New password" - LABEL_REPEAT_PASSWORD: "Repeat" - BUTTON_UPDATE_PASSWORD: "Update Password" - LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: "Require verification of SSL certificate used (IMAP/SMTP)" - LABEL_ALLOW_SELF_SIGNED: "Allow self signed certificates" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "Google" - LABEL_ENABLE_GOOGLE: "Enable Google Integration" - LABEL_GOOGLE_AUTH: "Authorization" - LABEL_GOOGLE_DRIVE: "Google Drive Integration (Compose view)" - LABEL_GOOGLE_PREVIEW: "Google Viewer Integration (Preview for Microsoft Word, Excel and PowerPoint files)" - LABEL_GOOGLE_CLIENT_ID: "Client ID" - LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" - LABEL_GOOGLE_API_KEY: "Api Key" - HINT_GOOGLE_API_KEY: "Required for Google Drive File Picker" - LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "Enable Facebook Integration (Authorization)" - LABEL_FACEBOOK_APP_ID: "App ID" - LABEL_FACEBOOK_APP_SECRET: "App Secret" - LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "Enable Twitter Integration (Authorization)" - LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" - LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" - LEGEND_DROPBOX: "Dropbox" - LABEL_ENABLE_DROPBOX: "Enable Dropbox Integration" - LABEL_DROPBOX_API_KEY: "Api Key" - TOP_ALERT: "Detailed information on social integration is found at" - TAB_PLUGINS: - LEGEND_PLUGINS: "Plugins" - LABEL_ENABLE_PLUGINS: "Enable plugins" - ALERT_NO_PLUGINS: "No plugins have yet been installed." - LINK_INSTALL_NEW: "Click here to install new!" - HINT_CLICK_NAME: "Click on the name to configure the plugin." - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "Available for Update" - LEGEND_AVAILABLE_FOR_INSTALLATION: "Available for Installation" - LEGEND_INSTALLED_PACKAGES: "Installed Packages" - ALERT_CANNOT_ACCESS_REPOSITORY: "Cannot access the repository at the moment." - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "Your domain" - LABEL_VERSION: "Version" - LABEL_CHECKING: "Checking" - TYPE_BASIC_HINT: "This domain isn't licensed for commercial use (with additional features)." - TYPE_BASIC_HINT_2: "This domain can't be licensed." - HTML_ALERT_TOP_1: "RainLoop Webmail is licensed under" - HTML_ALERT_TOP_2: "You are free to use it for your personal projects." - HTML_ALERT_TOP_3: | - Commercial use (with additional features) of RainLoop Webmail requires getting a - subscription. - TYPE_PREMIUM_LIFETIME: "Lifetime" - LABEL_SUB_EXPIRES: "Subscription expires" - BUTTON_ACTIVATE: "Activate Subscription Key for this domain" - BUTTON_PURCHASE: "Purchase" - BUTTON_TRIAL: "Trial" - TAB_ABOUT: - LEGEND_ABOUT: "About" - LABEL_TAG_HINT: "Simple, modern & fast web-based email client" - LABEL_ALL_RIGHTS_RESERVED: "All Rights Reserved." - HINT_READ_CHANGE_LOG: "Please read the change log before updating." - HINT_IS_UP_TO_DATE: "RainLoop is up to date." - HTML_NEW_VERSION: "New %VERSION% version is available." - LABEL_UPDATING: "Updating" - LABEL_CHECKING: "Checking for updates" - BUTTON_UPDATE: "Update" - BUTTON_DOWNLOAD: "Download" - BUTTON_CHANGELOG: "Changelog" - POPUPS_ACTIVATE: - TITLE_ACTIVATE: "Activate Subscription Key?" - TITLE_ACTIVATION: "Activation..." - LABEL_DOMAIN: "Domain" - LABEL_SUB_KEY: "Subscription Key" - BUTTON_ACTIVATE: "Activate" - LABEL_ACTIVATED: "Activated" - ERROR_INVALID_SUBS_KEY: "Invalid Subscription Key" - SUBS_KEY_ACTIVATED: "Subscription Key Activated Successfully" - HTML_DESC: | - After activation, premium subscription for %DOMAIN% will be extended. -
- Note that subscription key can be activated for a single domain only. -

- Once started, the process of activation cannot be aborted or cancelled. - POPUPS_DOMAIN_ALIAS: - TITLE_ADD_DOMAIN_ALIAS: "Add Alias" - LABEL_ALIAS: "Alias" - LABEL_DOMAIN: "Domain" - BUTTON_CLOSE: "Close" - BUTTON_ADD: "Add" - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "Add Domain" - TITLE_ADD_DOMAIN_WITH_NAME: "Add Domain \"%NAME%\"" - TITLE_EDIT_DOMAIN: "Edit Domain \"%NAME%\"" - LABEL_NAME: "Name" - NAME_HELPER: "wildcard supported" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "Server" - LABEL_PORT: "Port" - LABEL_SECURE: "Secure" - LABEL_WHITE_LIST: "White List" - SECURE_OPTION_NONE: "None" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "STARTTLS" - LABEL_ALLOW_SIEVE_SCRIPTS: "Allow sieve scripts" - LABEL_ALLOW_USER_SCRIPT: "Allow custom user script" - LABEL_USE_SHORT_LOGIN: "Use short login" - LABEL_USE_AUTH: "Use authentication" - LABEL_USE_PHP_MAIL: "Use php mail() function" - BUTTON_TEST: "Test" - BUTTON_WHITE_LIST: "White List" - BUTTON_SIEVE_CONFIGURATION: "Sieve configuration" - BUTTON_BACK_TO_IMAP: "Back to IMAP settings" - BUTTON_BACK: "Back" - BUTTON_CLOSE: "Close" - BUTTON_ADD: "Add" - BUTTON_UPDATE: "Update" - NEW_DOMAIN_DESC: "This domain configuration will allow you to work
with %NAME% email addresses." - WHITE_LIST_ALERT: | - List of domain users webmail is allowed to access. - Use a space as delimiter. - POPUPS_PLUGIN: - TITLE_PLUGIN: "Plugin" - DESC_NOTHING_TO_CONFIGURE: "Nothing to configure" - BUTTON_CLOSE: "Close" - BUTTON_SAVE: "Save" - TOOLTIP_ABOUT_TITLE: "About" - POPUPS_ASK: - DESC_WANT_CLOSE_THIS_WINDOW: "Are you sure you want to close this window?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Choose your language" - HINTS: - BETA: "beta" - UNSTABLE: "unstable" - WARNING: "Warning!" - NOT_SUPPORTED: "not supported" - REQUIRES_PHP_54: "requires PHP 5.4 or greater" - ERRORS: - DOMAIN_ALREADY_EXISTS: "Domain already exists" - UNKNOWN_ERROR: "Unknown error" - NOTIFICATIONS: - INVALID_TOKEN: "Invalid token" - AUTH_ERROR: "Authentication failed" - ACCESS_ERROR: "Access error" - CONNECTION_ERROR: "Can't connect to server" - CAPTCHA_ERROR: "Incorrect CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - DOMAIN_NOT_ALLOWED: "Domain is not allowed" - ACCOUNT_NOT_ALLOWED: "Account is not allowed" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" - COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" - CURRENT_PASSWORD_INCORRECT: "Current password incorrect" - NEW_PASSWORD_SHORT: "Password is too short" - NEW_PASSWORD_WEAK: "Password is too easy" - NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" - CONTACTS_SYNC_ERROR: "Contacts synchronization error" - CANT_GET_MESSAGE_LIST: "Can't get message list" - CANT_GET_MESSAGE: "Can't get message" - CANT_DELETE_MESSAGE: "Can't delete message" - CANT_MOVE_MESSAGE: "Can't move message" - CANT_SAVE_MESSAGE: "Can't save message" - CANT_SEND_MESSAGE: "Can't send message" - INVALID_RECIPIENTS: "Invalid recipients" - CANT_SAVE_FILTERS: "Can't save filters" - CANT_GET_FILTERS: "Can't get filters" - FILTERS_ARE_NOT_CORRECT: "Filters are not correct" - CANT_CREATE_FOLDER: "Can't create folder" - CANT_RENAME_FOLDER: "Can't rename folder" - CANT_DELETE_FOLDER: "Can't delete folder" - CANT_DELETE_NON_EMPTY_FOLDER: "Can't delete non-empty directory" - CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" - CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" - CANT_SAVE_SETTINGS: "Can't save settings" - CANT_SAVE_PLUGIN_SETTINGS: "Can't save settings" - DOMAIN_ALREADY_EXISTS: "Domain already exists" - CANT_INSTALL_PACKAGE: "Failed to install package" - CANT_DELETE_PACKAGE: "Failed to remove package" - INVALID_PLUGIN_PACKAGE: "Invalid plugin package" - UNSUPPORTED_PLUGIN_PACKAGE: "Unsupported plugin package" - LICENSING_SERVER_IS_UNAVAILABLE: "Subscription server is unvailable" - LICENSING_DOMAIN_EXPIRED: "Subscription for this domain has expired." - LICENSING_DOMAIN_BANNED: "Subscription for this domain is banned." - DEMO_SEND_MESSAGE_ERROR: "For security purposes, this account is not allowed to send messages to external e-mail addresses!" - DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" - ACCOUNT_ALREADY_EXISTS: "Account already exists" - ACCOUNT_DOES_NOT_EXIST: "Account doesn't exist" - MAIL_SERVER_ERROR: "An error has occured while accessing mail server" - INVALID_INPUT_ARGUMENT: "Invalid input argument" - UNKNOWN_ERROR: "Unknown error" - STATIC: - BACK_LINK: "Reload" - DOMAIN_LIST_DESC: "List of domains webmail is allowed to access." - PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" - PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" - NO_SCRIPT_TITLE: "JavaScript is required for this application." - NO_SCRIPT_DESC: | - JavaScript support is not available in your browser. - Please enable JavaScript support in your browser settings and retry. - NO_COOKIE_TITLE: "Cookies support is required for this application." - NO_COOKIE_DESC: | - Cookies support is not available in your browser. - Please enable Cookie support in your browser settings and retry. - BAD_BROWSER_TITLE: "Your browser is outdated." - BAD_BROWSER_DESC: | - To use all the features of the application, - download and install one of these browsers: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/cs_CZ.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/cs_CZ.yml deleted file mode 100755 index ab8d3ccf..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/cs_CZ.yml +++ /dev/null @@ -1,316 +0,0 @@ -cs_CZ: - LOGIN: - LABEL_LOGIN: "Login" - LABEL_PASSWORD: "Heslo" - BUTTON_LOGIN: "Přihlásit do administrace" - TOP_PANEL: - LABEL_PREMIUM: "Prémium" - LABEL_ADMIN_PANEL: "Administrační panel" - TABS_LABELS: - LABEL_GENERAL_NAME: "Základní" - LABEL_LOGIN_NAME: "Login" - LABEL_BRANDING_NAME: "Branding" - LABEL_CONTACTS_NAME: "Kontakty" - LABEL_DOMAINS_NAME: "Domény" - LABEL_SECURITY_NAME: "Zabezpečení" - LABEL_INTEGRATION_NAME: "Integrace" - LABEL_PLUGINS_NAME: "Pluginy" - LABEL_PACKAGES_NAME: "Balíčky" - LABEL_LICENSING_NAME: "Licence" - LABEL_ABOUT_NAME: "Info" - TAB_GENERAL: - LEGEND_INTERFACE: "Rozhraní" - LABEL_LANGUAGE: "Jazyk" - LABEL_LANGUAGE_ADMIN: "Jazyk (administrace)" - LABEL_THEME: "Motiv" - LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Povolit výběr jazyka na přihlašovací obrazovce" - LABEL_ALLOW_THEMES_ON_SETTINGS: "Povolit výběr motivu na přihlašovací obrazovce" - LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Povolit výběr pozadí na přihlašovací obrazovce" - LABEL_SHOW_THUMBNAILS: "Zobrazovat miniatury (přílohy)" - LABEL_ALLOW_GRAVATAR: "Povolit nastavení avatara" - LEGEND_MAIN: "Hlavní" - LABEL_ATTACHMENT_SIZE_LIMIT: "Limit velikosti přílohy" - LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Povolit přidávat další účty" - LABEL_ALLOW_IDENTITIES: "Povolit další identity" - LABEL_ALLOW_TEMPLATES: "Povolit šablony" - ALERT_WARNING: "Upozornění!" - HTML_ALERT_WEAK_PASSWORD: | - Používáte výchozí administrátorské heslo. -
- Z bezpečnostních důvodů jeji prosím - změnte. - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "Přihlašovací obrazovka" - LABEL_DEFAULT_DOMAIN: "Výchozí doména" - LABEL_DETERMINE_USER_DOMAIN: "Zkoušet odvodit doménu z uživatelského jména" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Povolit výběr jazyka na přihlašovací obrazovce" - LABEL_DETERMINE_USER_LANGUAGE: "Zkoušet odvodit jazyk pro uživatele" - TAB_BRANDING: - LEGEND_BRANDING: "Branding" - LABEL_PAGE_TITLE: "Nadpis stránky" - LABEL_LOADING_DESCRIPTION: "Načítání popisu" - LABEL_FAVICON_URL: "Favicon" - LEGEND_LOGIN: "Login" - LABEL_LOGIN_LOGO: "Logo" - LABEL_LOGIN_DESCRIPTION: "Popis" - LABEL_LOGIN_BACKGROUND: "Pozadí" - LABEL_LOGIN_CUSTOM_CSS: "Vlastní CSS" - LABEL_LOGIN_SHOW_POWERED_LINK: "Zobrazovat \"Powered by RainLoop\" odkaz" - LEGEND_USER: "Uživatel" - LABEL_USER_LOGO: "Logo" - LABEL_USER_LOGO_TITLE: "Popis loga" - LABEL_USER_LOGO_MESSAGE: "Logo (detail zprávy)" - LABEL_USER_CUSTOM_CSS: "Vlastní CSS" - LEGEND_WELCOME_PAGE: "Uvítací stránka" - LABEL_WELCOME_PAGE_TITLE: "Nadpis" - LABEL_WELCOME_PAGE_URL: "URL" - LABEL_WELCOME_PAGE_DISPLAY: "Zobrazení" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "Nikdy" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Jednou" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Vždy" - HTML_ALERT_PREMIUM: "Tato funkce je dostupná pouze pro Prémiovou verzi." - TAB_CONTACTS: - LEGEND_CONTACTS: "Kontakty" - LEGEND_STORAGE: "Úložiště (PDO)" - LABEL_ENABLE_CONTACTS: "Povolit kontakty" - LABEL_ALLOW_SYNC: "Povolit synchronizaci kontaktů (přes externí CardDAV server)" - LABEL_STORAGE_TYPE: "Typ" - LABEL_STORAGE_DSN: "Dsn" - LABEL_STORAGE_USER: "Uživatel" - LABEL_STORAGE_PASSWORD: "Heslo" - BUTTON_TEST: "Test" - ALERT_NOTICE: "Upozornění!" - HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Nepoužívejte tento typ databáze při velkém počtu aktivních uživatelů." - HTML_ALERT_DOES_NOT_SUPPORTED: | - Váš systém nepodporuje kontakty. -
- Je potřeba nainstalovat nebo povolit PDO (SQLite / MySQL / PostgreSQL) - rozšíření na vašem serveru. - TAB_DOMAINS: - LEGEND_DOMAINS: "Domény" - BUTTON_ADD_DOMAIN: "Přidat Doménu" - DELETE_ARE_YOU_SURE: "Jste si jistí?" - HTML_DOMAINS_HELPER: | - Seznam domén, ke kterým je možné přistupovat přes webmail. -
- Klikněte na jméno domény pro její konfiguraci. - TAB_SECURITY: - LEGEND_SECURITY: "Zabezpečení" - LABEL_ALLOW_TWO_STEP: "Povolit dvoufázové ověření" - LABEL_FORCE_TWO_STEP: "Vynucovat dvoufázové ověření" - LABEL_USE_IMAGE_PROXY: "Použít lokální proxy pro externí obrázky" - LABEL_ALLOW_OPEN_PGP: "Povolit OpenPGP" - LABEL_SHOW_PHP_INFO: "Zobrazit PHP informace (php_info)" - LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Přístupové údaje administrace" - LABEL_CURRENT_PASSWORD: "Současné heslo" - LABEL_NEW_LOGIN: "Nový login" - LABEL_NEW_PASSWORD: "Nové heslo" - LABEL_REPEAT_PASSWORD: "Znovu" - BUTTON_UPDATE_PASSWORD: "Aktualizovat heslo" - LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: "Vyžadovat ověření SSL certifikátu (IMAP/SMTP)" - LABEL_ALLOW_SELF_SIGNED: "Povolit self-signed certifikáty" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "Google" - LABEL_ENABLE_GOOGLE: "Povolit Google integraci" - LABEL_GOOGLE_AUTH: "Authorizace" - LABEL_GOOGLE_DRIVE: "Google Drive integrace (Compose view)" - LABEL_GOOGLE_PREVIEW: "Google Viewer integrace (náhled pro Microsoft Word, Excel a PowerPoint soubory)" - LABEL_GOOGLE_CLIENT_ID: "Klient ID" - LABEL_GOOGLE_CLIENT_SECRET: "Klient Secret" - LABEL_GOOGLE_API_KEY: "Api klíč" - HINT_GOOGLE_API_KEY: "Vyžadováno pro Google Drive File Picker" - LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "Povolit Facebook integraci (Authorizaci)" - LABEL_FACEBOOK_APP_ID: "App ID" - LABEL_FACEBOOK_APP_SECRET: "App Secret" - LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "Povolit Twitter integraci (Authorizaci)" - LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" - LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" - LEGEND_DROPBOX: "Dropbox" - LABEL_ENABLE_DROPBOX: "Povolit Dropbox integraci" - LABEL_DROPBOX_API_KEY: "Api key" - TOP_ALERT: "Detailní informace o integraci sociálních sítí jsou dostupné na adrese" - TAB_PLUGINS: - LEGEND_PLUGINS: "Pluginy" - LABEL_ENABLE_PLUGINS: "Povolit pluginy" - ALERT_NO_PLUGINS: "Žádné pluginy zatím nebyly nainstalovány." - LINK_INSTALL_NEW: "Klikněte zde pro instalaci nových." - HINT_CLICK_NAME: "Klikněte na jméno pluginu pro jeho konfiguraci." - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "Dostupné pro aktualizaci" - LEGEND_AVAILABLE_FOR_INSTALLATION: "Dostupné pro instalaci" - LEGEND_INSTALLED_PACKAGES: "Nainstalované balíčky" - ALERT_CANNOT_ACCESS_REPOSITORY: "V tento moment se nelze připojit k repozitáři." - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "Vaše doména" - LABEL_VERSION: "Verze" - LABEL_CHECKING: "Kontrolování" - TYPE_BASIC_HINT: "Tato doména není licencována pro komerční užití." - TYPE_BASIC_HINT_2: "Tato doména nemůže být licencována." - HTML_ALERT_TOP_1: "RainLoop Webmail je licencován pod" - HTML_ALERT_TOP_2: "Můžete tento nástroj volně používat pro vaše osobní projekty." - HTML_ALERT_TOP_3: | - Komerční užívání (s přidanými doplňky) RainLoop Webmail vyžaduje získání - - licence. - TYPE_PREMIUM_LIFETIME: "Lifetime" - LABEL_SUB_EXPIRES: "Licence vyprší" - BUTTON_ACTIVATE: "Aktivační licenční klíč pro tuto doménu" - BUTTON_PURCHASE: "Koupit" - BUTTON_TRIAL: "Trial" - TAB_ABOUT: - LEGEND_ABOUT: "Info" - LABEL_TAG_HINT: "Jednoduchý, moderní a rychlý webový emailový klient" - LABEL_ALL_RIGHTS_RESERVED: "Všechna práva vyhrazena." - HINT_READ_CHANGE_LOG: "Přečtěte si prosím change log předtím, než budete chtít provést aktualizaci." - HINT_IS_UP_TO_DATE: "RainLoop je v aktuální verzi." - HTML_NEW_VERSION: "Nová verze %VERSION% je k dispozici." - LABEL_UPDATING: "Aktualizace" - LABEL_CHECKING: "Zjistit nové aktualizace" - BUTTON_UPDATE: "Aktualizace" - BUTTON_DOWNLOAD: "Stáhnout" - BUTTON_CHANGELOG: "Seznam změn" - POPUPS_ACTIVATE: - TITLE_ACTIVATE: "Aktivovat licenční klíč?" - TITLE_ACTIVATION: "Aktivace..." - LABEL_DOMAIN: "Doména" - LABEL_SUB_KEY: "Licenční klíč" - BUTTON_ACTIVATE: "Aktivovat" - LABEL_ACTIVATED: "Aktivováno" - ERROR_INVALID_SUBS_KEY: "Nevalidní licenční klíč" - SUBS_KEY_ACTIVATED: "Licenční klíč byl úspěšně aktivován" - HTML_DESC: | - Po aktivaci bude prémiové licence pro doménu %DOMAIN% prodloužena. -
- Aktivační klíč lze použít pouze pro jednu doménu. -

- Jakmile začnete proces aktivace, nelze ho přerušit nebo ukončit. - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "Přidat Doménu" - TITLE_ADD_DOMAIN_WITH_NAME: "Přidat Doménu \"%NAME%\"" - TITLE_EDIT_DOMAIN: "Editovat Doménu \"%NAME%\"" - LABEL_NAME: "Název" - NAME_HELPER: "wildcard podporovány" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "Server" - LABEL_PORT: "Port" - LABEL_SECURE: "Zabezpečení" - LABEL_WHITE_LIST: "White List" - SECURE_OPTION_NONE: "Žádné" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "STARTTLS" - LABEL_ALLOW_SIEVE_SCRIPTS: "Povolit SIEVE skripty" - LABEL_ALLOW_USER_SCRIPT: "Povolit vlastní uživatelské skripty" - LABEL_USE_SHORT_LOGIN: "Používat krátký login" - LABEL_USE_AUTH: "Používat authentikaci" - LABEL_USE_PHP_MAIL: "Používat php mail() funkci" - BUTTON_TEST: "Test" - BUTTON_WHITE_LIST: "White List" - BUTTON_SIEVE_CONFIGURATION: "SIEVE konfigurace" - BUTTON_BACK_TO_IMAP: "Zpět na IMAP nastavení" - BUTTON_BACK: "Zpět" - BUTTON_CLOSE: "Zavřít" - BUTTON_ADD: "Přidat" - BUTTON_UPDATE: "Aktualizovat" - NEW_DOMAIN_DESC: "Konfigurace této domény umožní používat %NAME% adresy." - WHITE_LIST_ALERT: | - Seznam domén s povoleným uživatelským přístupem - Použijte mezeru pro jejich oddělení. - POPUPS_PLUGIN: - TITLE_PLUGIN: "Plugin" - DESC_NOTHING_TO_CONFIGURE: "Není zde nic ke konfiguraci" - BUTTON_CLOSE: "Zavřít" - BUTTON_SAVE: "Uložit" - TOOLTIP_ABOUT_TITLE: "Info" - POPUPS_ASK: - DESC_WANT_CLOSE_THIS_WINDOW: "Jste si jistí, že opravdu chcete zavřit toto okno?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Vyberte váš jazyk" - HINTS: - BETA: "beta" - UNSTABLE: "unstable" - WARNING: "Varování!" - NOT_SUPPORTED: "není podporováno" - REQUIRES_PHP_54: "vyžaduje PHP 5.4 nebo vyšší" - ERRORS: - DOMAIN_ALREADY_EXISTS: "Doména již existuje" - UNKNOWN_ERROR: "Neznámá chyba" - NOTIFICATIONS: - INVALID_TOKEN: "Nevalidní token" - AUTH_ERROR: "Chyba authentikace" - ACCESS_ERROR: "Chyba v přístupu" - CONNECTION_ERROR: "Nelze se spojit se serverem" - CAPTCHA_ERROR: "Nesprávná CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Toto ID není přiřazeno k žádnému účtu. Přihlašte se pomocí vaší emailové adresy - a nastavte si tuto možnost. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Toto ID není přiřazeno k žádnému účtu. Přihlašte se pomocí vaší emailové adresy - a nastavte si tuto možnost. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Toto ID není přiřazeno k žádnému účtu. Přihlašte se pomocí vaší emailové adresy - a nastavte si tuto možnost. - DOMAIN_NOT_ALLOWED: "Doména není povolená" - ACCOUNT_NOT_ALLOWED: "Účet není povolený" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Je vyžadováno dvoufázové ověření" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Chyba dvoufázového ověření" - COULD_NOT_SAVE_NEW_PASSWORD: "Nelze uložit nové heslo" - CURRENT_PASSWORD_INCORRECT: "Současné heslo neodpovídá" - NEW_PASSWORD_SHORT: "Heslo je krátké" - NEW_PASSWORD_WEAK: "Heslo je moc jednoduché" - NEW_PASSWORD_FORBIDDENT: "Heslo obsahuje zakázané znaky" - CONTACTS_SYNC_ERROR: "Chyba při synchronizaci kontaktů" - CANT_GET_MESSAGE_LIST: "Nelze načíst seznam zpráv" - CANT_GET_MESSAGE: "Zprávu se nepodařilo načíst" - CANT_DELETE_MESSAGE: "Zprávu se nepodařilo odstranit" - CANT_MOVE_MESSAGE: "Zprávu se nepodařilo přesunout" - CANT_SAVE_MESSAGE: "Zprávu se nepodařilo uložit" - CANT_SEND_MESSAGE: "Zprávu se nepodařilo odeslat" - INVALID_RECIPIENTS: "Neplatní příjemci" - CANT_SAVE_FILTERS: "Nelze uložit filtry" - CANT_GET_FILTERS: "Nelze načíst filtry" - FILTERS_ARE_NOT_CORRECT: "Filtry nejsou validní" - CANT_CREATE_FOLDER: "Složku se nepodařilo vytvořit" - CANT_RENAME_FOLDER: "Složku se nepodařilo přejmenovat" - CANT_DELETE_FOLDER: "Složku se nepodařilo odstranit" - CANT_DELETE_NON_EMPTY_FOLDER: "Nelze odstranit neprázdnou složku" - CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" - CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" - CANT_SAVE_SETTINGS: "Nastavení se nepodařilo uložit" - CANT_SAVE_PLUGIN_SETTINGS: "Nastavení se nepodařilo uložit" - DOMAIN_ALREADY_EXISTS: "Táto doména již existuje" - CANT_INSTALL_PACKAGE: "Instalace balíčku se nezdařila" - CANT_DELETE_PACKAGE: "Odstranění balíčku se nezdařilo" - INVALID_PLUGIN_PACKAGE: "Nevalidní balíček" - UNSUPPORTED_PLUGIN_PACKAGE: "Nepodporovaný balíček rozšíření" - LICENSING_SERVER_IS_UNAVAILABLE: "Licenční server je nedostupný" - LICENSING_DOMAIN_EXPIRED: "Licence pro tuto doménu vypršela." - LICENSING_DOMAIN_BANNED: "Licence pro tuto doménu byla zablokována." - DEMO_SEND_MESSAGE_ERROR: "Z důvodu bezpečnosti tento demo účet není oprávněn posílat zprávy na externí emaily!" - DEMO_ACCOUNT_ERROR: "Z důvodu bezpečnosti tento účet nemá oprávnění toto provést!" - ACCOUNT_ALREADY_EXISTS: "Účet už existuje" - ACCOUNT_DOES_NOT_EXIST: "Účet neexistuje" - MAIL_SERVER_ERROR: "Nastala chyba během přístupu na poštovní server" - INVALID_INPUT_ARGUMENT: "Nevalidní vstupní argument" - UNKNOWN_ERROR: "Neznámá chyba" - STATIC: - BACK_LINK: "Obnovit" - DOMAIN_LIST_DESC: "Seznam domén, ke kterým je možné přistupovat přes webmail." - PHP_EXSTENSIONS_ERROR_DESC: "Potřebné rošíření PHP nejsou dostupné v konfiguraci PHP!" - PHP_VERSION_ERROR_DESC: "Vaše verze PHP (%VERSION%) je nižší než požadovaná 5.3.0!" - NO_SCRIPT_TITLE: "Tato aplikace vyžaduje JavaScript." - NO_SCRIPT_DESC: | - Váš internetový prohlížeč nepodporuje JavaScript. - Prosím povolte podporu JavaScriptu v nastavení vašeho internetového prohlížeče a zkuste to znovu. - NO_COOKIE_TITLE: "Tato aplikace vyžaduje podporu Cookies." - NO_COOKIE_DESC: | - Váš internetový prohlížeč nepodporuje Cookies. - Prosím povolte podporu Cookies v nastavení vašeho internetového prohlížeče a zkuste to znovu. - BAD_BROWSER_TITLE: "Používáte zastaralý internetový prohlížeč." - BAD_BROWSER_DESC: | - Abyste mohli využívat všechny funkcie této aplikace, - použijte některý z následujících internetových prohlížečů: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/da_DK.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/da_DK.yml deleted file mode 100755 index 1b9eddba..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/da_DK.yml +++ /dev/null @@ -1,323 +0,0 @@ -da_DK: - LOGIN: - LABEL_LOGIN: "Log ind" - LABEL_PASSWORD: "Adgangskode" - BUTTON_LOGIN: "Log ind i administrationspanelet" - TOP_PANEL: - LABEL_PREMIUM: "Premium" - LABEL_ADMIN_PANEL: "Admin Panel" - TABS_LABELS: - LABEL_GENERAL_NAME: "Generelt" - LABEL_LOGIN_NAME: "Log ind" - LABEL_BRANDING_NAME: "Branding" - LABEL_CONTACTS_NAME: "Kontakter" - LABEL_DOMAINS_NAME: "Domæner" - LABEL_SECURITY_NAME: "Sikkerhed" - LABEL_INTEGRATION_NAME: "Integrationer" - LABEL_PLUGINS_NAME: "Plugins" - LABEL_PACKAGES_NAME: "Pakker" - LABEL_LICENSING_NAME: "Licensering" - LABEL_ABOUT_NAME: "Om" - TAB_GENERAL: - LEGEND_INTERFACE: "Grænseflade" - LABEL_LANGUAGE: "Sprog" - LABEL_LANGUAGE_ADMIN: "Sprog (admin)" - LABEL_THEME: "Tema" - LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Tillad sprogvalg i indstillinger" - LABEL_ALLOW_THEMES_ON_SETTINGS: "Tillad temavalg i indstillinger" - LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Tillad baggrundsvalg i indstillinger" - LABEL_NEW_FOLDER_MOVE: "Ny \"flyt til mappe\" knap" - LABEL_SHOW_THUMBNAILS: "Vis miniaturer (vedhæftede filer)" - LABEL_ALLOW_GRAVATAR: "Tillad Gravatar" - LEGEND_MAIN: "Primære" - LABEL_ATTACHMENT_SIZE_LIMIT: "Vedhæftede filers størrelsesgrænse" - LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Tillad flere konti" - LABEL_ALLOW_IDENTITIES: "Tillad flere identiteter" - LABEL_ALLOW_TEMPLATES: "Tillad skabeloner" - ALERT_WARNING: "Advarsler!" - HTML_ALERT_WEAK_PASSWORD: | - Du bruger standard admin adgangskoden. -
- Af sikkerhedsmæssige hensyn bør du venligst - ændre - adgangskoden til noget andet snarest. - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "Log ind skærm" - LABEL_DEFAULT_DOMAIN: "Standard domæne" - LABEL_DETERMINE_USER_DOMAIN: "Forsøg at bestemme brugerens domæne" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Tillad sprogvalg ved log ind" - LABEL_DETERMINE_USER_LANGUAGE: "Forsøg at bestemme brugerens sprog" - TAB_BRANDING: - LEGEND_BRANDING: "Branding" - LABEL_PAGE_TITLE: "Sidetitel" - LABEL_LOADING_DESCRIPTION: "Indlæsningsbeskrivelse" - LABEL_FAVICON_URL: "Favicon" - LEGEND_LOGIN: "Log ind" - LABEL_LOGIN_LOGO: "Logo" - LABEL_LOGIN_DESCRIPTION: "Beskrivelse" - LABEL_LOGIN_BACKGROUND: "Baggrund" - LABEL_LOGIN_CUSTOM_CSS: "Brugerdefinerede CSS" - LABEL_LOGIN_SHOW_POWERED_LINK: "Vis \"Powered by RainLoop\" link" - LEGEND_USER: "Bruger" - LABEL_USER_LOGO: "Logo" - LABEL_USER_LOGO_TITLE: "Logotitel" - LABEL_USER_LOGO_MESSAGE: "Logo (meddelelsesvisning)" - LABEL_USER_CUSTOM_CSS: "Brugerdefinerede CSS" - LEGEND_WELCOME_PAGE: "Velkomstside" - LABEL_WELCOME_PAGE_TITLE: "Titel" - LABEL_WELCOME_PAGE_URL: "URL" - LABEL_WELCOME_PAGE_DISPLAY: "Visning" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "Ingen" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "én enkelt gang" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Altid" - HTML_ALERT_PREMIUM: "Denne funktionalitet er tilgængelig for Premium abonnenter." - TAB_CONTACTS: - LEGEND_CONTACTS: "Kontakter" - LEGEND_STORAGE: "Lagring (PDO)" - LABEL_ENABLE_CONTACTS: "Aktivér kontakter" - LABEL_ALLOW_SYNC: "Tillad kontaktsynkronisering (med ektern CardDAV server)" - LABEL_STORAGE_TYPE: "Type" - LABEL_STORAGE_DSN: "Dsn" - LABEL_STORAGE_USER: "Bruger" - LABEL_STORAGE_PASSWORD: "Adgangskode" - BUTTON_TEST: "Test" - ALERT_NOTICE: "Underretning!" - HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Brug ikke denne database type med større antal af aktive brugere." - HTML_ALERT_DOES_NOT_SUPPORTED: | - Dit system ser ikke ud til at understøtte kontakter. -
- Du skal installere og aktivere PDO (SQLite / MySQL / PostgreSQL) udvidelsen på din server. - TAB_DOMAINS: - LEGEND_DOMAINS: "Domæner" - BUTTON_ADD_DOMAIN: "Tilføj domæne" - BUTTON_ADD_ALIAS: "Tilføj alias" - DELETE_ARE_YOU_SURE: "Er du sikker?" - HTML_DOMAINS_HELPER: | - Liste over domæner webmail er tilladt adgang til. -
- Klik på navnet for at konfigurere domænet. - TAB_SECURITY: - LEGEND_SECURITY: "Sikkerhed" - LABEL_ALLOW_TWO_STEP: "Tillad 2-trins verifikation" - LABEL_FORCE_TWO_STEP: "Gennemtving 2-trins verifikation" - LABEL_USE_IMAGE_PROXY: "Brug lokal proxy til eksterne billeder" - LABEL_ALLOW_OPEN_PGP: "Tillad OpenPGP" - LABEL_SHOW_PHP_INFO: "Vis PHP informationer" - LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Admin Panel Adgangsoplysninger" - LABEL_CURRENT_PASSWORD: "Nuværende adgangskode" - LABEL_NEW_LOGIN: "Nyt log ind" - LABEL_NEW_PASSWORD: "Ny adgangskode" - LABEL_REPEAT_PASSWORD: "Gentag" - BUTTON_UPDATE_PASSWORD: "Opdater adgangskode" - LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: "Kræv verifikation af brugt SSL certifikat (IMAP/SMTP)" - LABEL_ALLOW_SELF_SIGNED: "Tillad selvsignerede certifikater" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "Google" - LABEL_ENABLE_GOOGLE: "Aktiver Google integration" - LABEL_GOOGLE_AUTH: "Autorisation" - LABEL_GOOGLE_DRIVE: "Google Drive integration (Komponerede visning)" - LABEL_GOOGLE_PREVIEW: "Google Viewer integration (Visning af Microsoft Word, Excel og PowerPoint filer)" - LABEL_GOOGLE_CLIENT_ID: "Klient ID" - LABEL_GOOGLE_CLIENT_SECRET: "Klient hemmelighed" - LABEL_GOOGLE_API_KEY: "API nøgle" - HINT_GOOGLE_API_KEY: "Krævet af Google Drive File Picker" - LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "Aktiver Facebook integration (Autorisation)" - LABEL_FACEBOOK_APP_ID: "App ID" - LABEL_FACEBOOK_APP_SECRET: "App hemmelighed" - LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "Aktiver Twitter integrering (Godkendelse)" - LABEL_TWITTER_CONSUMER_KEY: "Bruger nøgle" - LABEL_TWITTER_CONSUMER_SECRET: "Bruger hemmelighed" - LEGEND_DROPBOX: "Dropbox" - LABEL_ENABLE_DROPBOX: "Aktiver Dropbox integrering" - LABEL_DROPBOX_API_KEY: "API nøgle" - TOP_ALERT: "Mere information omkring integrring med sociale netværk kan finder på" - TAB_PLUGINS: - LEGEND_PLUGINS: "Plugins" - LABEL_ENABLE_PLUGINS: "Aktiver plugins" - ALERT_NO_PLUGINS: "Ingen tilføjelser er installeret endnu." - LINK_INSTALL_NEW: "Tryk her for at installere nyt!" - HINT_CLICK_NAME: "Tryk på navnet for at konfigurere tilføjelse." - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "Opdatering tilgængelig" - LEGEND_AVAILABLE_FOR_INSTALLATION: "Installation tilgængelig" - LEGEND_INSTALLED_PACKAGES: "Installerede pakker" - ALERT_CANNOT_ACCESS_REPOSITORY: "Kan ikke tilgå depotet lige nu." - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "Dit domæne" - LABEL_VERSION: "Version" - LABEL_CHECKING: "Tjekker" - TYPE_BASIC_HINT: "Dette domæne er ikke licenseret til kommercielt brug (med ekstra funktioner)." - TYPE_BASIC_HINT_2: "Dette domæne kan ikke licenseret." - HTML_ALERT_TOP_1: "RainLoop Webmail er licenseret under" - HTML_ALERT_TOP_2: "Du er velkommen til at bruge det til personlige projekter." - HTML_ALERT_TOP_3: | - Kommercielt brug (med ekstra funktioner) af RainLoop Webmail kræver et - abonnement. - TYPE_PREMIUM_LIFETIME: "Livstid" - LABEL_SUB_EXPIRES: "Abonnement udløber" - BUTTON_ACTIVATE: "Aktiver abonnements kode for dette domæne" - BUTTON_PURCHASE: "Køb" - BUTTON_TRIAL: "Prøv" - TAB_ABOUT: - LEGEND_ABOUT: "Om" - LABEL_TAG_HINT: "Simpel, moderne & hurtig web-baseret e-mail klient" - LABEL_ALL_RIGHTS_RESERVED: "alle rettigheder forbeholdes." - HINT_READ_CHANGE_LOG: "Læs ændrings listen før der opdateres." - HINT_IS_UP_TO_DATE: "RainLoop is up to date." - HTML_NEW_VERSION: "Ny %VERSION% version tilgængelig" - LABEL_UPDATING: "Opdatere" - LABEL_CHECKING: "Tjekker for opdateringer" - BUTTON_UPDATE: "Opdater" - BUTTON_DOWNLOAD: "Download" - BUTTON_CHANGELOG: "Ændrings liste" - POPUPS_ACTIVATE: - TITLE_ACTIVATE: "Aktiver abonnements kode?" - TITLE_ACTIVATION: "Aktivering..." - LABEL_DOMAIN: "Domæne" - LABEL_SUB_KEY: "Abonnements kode" - BUTTON_ACTIVATE: "Aktiver" - LABEL_ACTIVATED: "Aktiveret" - ERROR_INVALID_SUBS_KEY: "Ugyldig abonnements kode" - SUBS_KEY_ACTIVATED: "Abonnements kode aktivering var succesfuld" - HTML_DESC: | - Efter aktiveren, vil abonnementet for %DOMAIN% blive forlænget. -
- Bemærk at en abonnements kode kun kan blive aktiveret for et enkelt domæne. -

- Når aktiverings processen er startet kan den ikke afbrydes eller annulleres. - POPUPS_DOMAIN_ALIAS: - TITLE_ADD_DOMAIN_ALIAS: "Tilføj alias" - LABEL_ALIAS: "Alias" - LABEL_DOMAIN: "Domæne" - BUTTON_CLOSE: "Luk" - BUTTON_ADD: "Tilføj" - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "Tilføj domæne" - TITLE_ADD_DOMAIN_WITH_NAME: "Tilføj domæne \"%NAME%\"" - TITLE_EDIT_DOMAIN: "Rediger domæne \"%NAME%\"" - LABEL_NAME: "Navn" - NAME_HELPER: "specieltegn understøttet" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "Server" - LABEL_PORT: "Port" - LABEL_SECURE: "Sikker" - LABEL_WHITE_LIST: "Whitelist" - SECURE_OPTION_NONE: "Ingen" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "STARTTLS" - LABEL_ALLOW_SIEVE_SCRIPTS: "Tillad sieve skripts" - LABEL_ALLOW_USER_SCRIPT: "Tillad brugerdefinerede skripts" - LABEL_USE_SHORT_LOGIN: "Brug kort log ind" - LABEL_USE_AUTH: "Brug godkendelse" - LABEL_USE_PHP_MAIL: "Brug php mail()" - BUTTON_TEST: "Test" - BUTTON_WHITE_LIST: "Whitelist" - BUTTON_SIEVE_CONFIGURATION: "Sieve opsætning" - BUTTON_BACK_TO_IMAP: "Tilbage til IMAP indstillinger" - BUTTON_BACK: "Tilbage" - BUTTON_CLOSE: "Luk" - BUTTON_ADD: "Tilføj" - BUTTON_UPDATE: "Opdater" - NEW_DOMAIN_DESC: "Denne domæne konfiguration tillader %NAME% e-mail adresser." - WHITE_LIST_ALERT: | - Liste med godkendte domæne for webmail opsætning. - Brug mellemrum til at separere domæner. - POPUPS_PLUGIN: - TITLE_PLUGIN: "Tilføjelse" - DESC_NOTHING_TO_CONFIGURE: "Intet at opsætte" - BUTTON_CLOSE: "Luk" - BUTTON_SAVE: "Gem" - TOOLTIP_ABOUT_TITLE: "Om" - POPUPS_ASK: - DESC_WANT_CLOSE_THIS_WINDOW: "Vil du lukke vinduet?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Vælg sprog" - HINTS: - BETA: "beta" - UNSTABLE: "ustabil" - WARNING: "Advarsel!" - NOT_SUPPORTED: "ikke understøttet" - REQUIRES_PHP_54: "PHP 5.4 eller højere er et krav" - ERRORS: - DOMAIN_ALREADY_EXISTS: "Domæne eksisterer allerede" - UNKNOWN_ERROR: "Ukendt fejl" - NOTIFICATIONS: - INVALID_TOKEN: "Ugyldigt tegn" - AUTH_ERROR: "Godkendelse fejlede" - ACCESS_ERROR: "Adgangsfejl" - CONNECTION_ERROR: "Kan ikke kontakte server" - CAPTCHA_ERROR: "Forkert CAPTCHA" - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Dette sociale ID er ikke knyttet til en e-mail konto endnu. Log ind ved brug - af e-mail og tilføj ID'et under konto indstillinger. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Dette sociale ID er ikke knyttet til en e-mail konto endnu. Log ind ved brug - af e-mail og tilføj ID'et under konto indstillinger. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Dette sociale ID er ikke knyttet til en e-mail konto endnu. Log ind ved brug - af e-mail og tilføj ID'et under konto indstillinger. - DOMAIN_NOT_ALLOWED: "Domæne ikke tilladt" - ACCOUNT_NOT_ALLOWED: "Konto ikke tilladt" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2-faktor verifikation påbudt." - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2-faktor verifikationsfejl" - COULD_NOT_SAVE_NEW_PASSWORD: "Kunne ikke gemme ny adgangskode" - CURRENT_PASSWORD_INCORRECT: "Nuværende adgangskode forkert" - NEW_PASSWORD_SHORT: "Adgangskoden for kort" - NEW_PASSWORD_WEAK: "Adgangskoden for simpel" - NEW_PASSWORD_FORBIDDENT: "Adgangskode indeholder forbudte tegn" - CONTACTS_SYNC_ERROR: "Fejl ved synkronisering af kontakter" - CANT_GET_MESSAGE_LIST: "Kan ikke indlæse meddelelsesoversigt " - CANT_GET_MESSAGE: "Kan ikke indlæse meddelelse" - CANT_DELETE_MESSAGE: "Kan ikke slette meddelelse" - CANT_MOVE_MESSAGE: "Kan ikke flytte meddelelse" - CANT_SAVE_MESSAGE: "Kan ikke gemme meddelelse" - CANT_SEND_MESSAGE: "Kan ikke sende meddelelse" - INVALID_RECIPIENTS: "Ugyldige modtagere" - CANT_SAVE_FILTERS: "Kan ikke gemme filtre" - CANT_GET_FILTERS: "Kan ikke indlæse filtre" - FILTERS_ARE_NOT_CORRECT: "Fejl i filtre" - CANT_CREATE_FOLDER: "Kan ikke oprette mappe" - CANT_RENAME_FOLDER: "Kan ikke omdøbe mappe" - CANT_DELETE_FOLDER: "Kan ikke slette mappe" - CANT_DELETE_NON_EMPTY_FOLDER: "Kan ikke slette mappe som ikke er tom" - CANT_SUBSCRIBE_FOLDER: "Kan ikke abonnere på mappe" - CANT_UNSUBSCRIBE_FOLDER: "Kan ikke afmelde mappe" - CANT_SAVE_SETTINGS: "Kan ikke gemme instillinger" - CANT_SAVE_PLUGIN_SETTINGS: "Kan ikke gemme instillinger" - DOMAIN_ALREADY_EXISTS: "Domæne eksisterer allerede" - CANT_INSTALL_PACKAGE: "Installation af pakke mislykkedes" - CANT_DELETE_PACKAGE: "Fjernelse af pakke mislykkedes" - INVALID_PLUGIN_PACKAGE: "Ugyldig tilføjelsespakke" - UNSUPPORTED_PLUGIN_PACKAGE: "Tilføjelsespakke ikke understøttet" - LICENSING_SERVER_IS_UNAVAILABLE: "Abonnementsserver ikke tilgængelig" - LICENSING_DOMAIN_EXPIRED: "Abonnement på domæne udløbet." - LICENSING_DOMAIN_BANNED: "Abonnement på domæne forbudt." - DEMO_SEND_MESSAGE_ERROR: "Denne konto kan af sikkerheds hensyn ikke sende e-mails til eksterne adresser!" - DEMO_ACCOUNT_ERROR: "Denne konto kan af sikkerheds hensyn ikke udføre denne handling!" - ACCOUNT_ALREADY_EXISTS: "Kontoen eksisterer allerede" - ACCOUNT_DOES_NOT_EXIST: "Kontoen eksisterer ikke" - MAIL_SERVER_ERROR: "Der skete en fejl under adgang til e-mail serveren" - INVALID_INPUT_ARGUMENT: "Ugyldigt argument" - UNKNOWN_ERROR: "Ukendt fejl" - STATIC: - BACK_LINK: "Genindlæs" - DOMAIN_LIST_DESC: "Liste over domæner webmail er tilladt adgang til." - PHP_EXSTENSIONS_ERROR_DESC: "Nødvendige PHP udvidelser er ikke tilgængelige!" - PHP_VERSION_ERROR_DESC: "PHP versionen (%VERSION%) er for gammel. Minimum 5.3.0 er nødvendig!" - NO_SCRIPT_TITLE: "JavaScript er nødvendig for dette program." - NO_SCRIPT_DESC: | - JavaScript er slået fra i din browser. - Slå JavaScript til og prøv igen. - NO_COOKIE_TITLE: "Cookies er nødvendige for dette program." - NO_COOKIE_DESC: | - Cookies er slået fra i din browser. - Slå Cookies til og prøv igen. - BAD_BROWSER_TITLE: "Din browser er forældet." - BAD_BROWSER_DESC: | - Enkle funktioner fungere ikke med denne browser. - For at bruge alle funktioner, hent en af følgende: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/de_DE.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/de_DE.yml deleted file mode 100755 index f1660dae..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/de_DE.yml +++ /dev/null @@ -1,325 +0,0 @@ -de_DE: - LOGIN: - LABEL_LOGIN: "Benutzer" - LABEL_PASSWORD: "Passwort" - BUTTON_LOGIN: "Im Adminpanel anmelden" - TOP_PANEL: - LABEL_PREMIUM: "Premium" - LABEL_ADMIN_PANEL: "Adminpanel" - TABS_LABELS: - LABEL_GENERAL_NAME: "Allgemein" - LABEL_LOGIN_NAME: "Anmeldung" - LABEL_BRANDING_NAME: "Branding" - LABEL_CONTACTS_NAME: "Kontakte" - LABEL_DOMAINS_NAME: "Domains" - LABEL_SECURITY_NAME: "Sicherheit" - LABEL_INTEGRATION_NAME: "Integration" - LABEL_PLUGINS_NAME: "Plugins" - LABEL_PACKAGES_NAME: "Pakete" - LABEL_LICENSING_NAME: "Lizenzierung" - LABEL_ABOUT_NAME: "Über" - TAB_GENERAL: - LEGEND_INTERFACE: "Oberfläche" - LABEL_LANGUAGE: "Sprache" - LABEL_LANGUAGE_ADMIN: "Sprache (Admin)" - LABEL_THEME: "Thema" - LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Sprachauswahl in den Einstellungen zulassen" - LABEL_ALLOW_THEMES_ON_SETTINGS: "Themaauswahl in den Einstellungen zulassen" - LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Hintergrundauswahl in den Einstellungen zulassen" - LABEL_NEW_FOLDER_MOVE: "Neue \"Verschieben nach\"-Schaltfläche" - LABEL_SHOW_THUMBNAILS: "Vorschaubilder anzeigen (Anhänge)" - LABEL_ALLOW_GRAVATAR: "Gravatar erlauben" - LEGEND_MAIN: "Allgemein" - LABEL_ATTACHMENT_SIZE_LIMIT: "Größenlimit für Anhänge" - LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Zusätzliche Konten erlauben" - LABEL_ALLOW_IDENTITIES: "Mehrere Identitäten erlauben" - LABEL_ALLOW_TEMPLATES: "Vorlagen erlauben" - ALERT_WARNING: "Warnung!" - HTML_ALERT_WEAK_PASSWORD: | - Sie verwenden das Standard-Admin-Passwort. -
- Bitte ändern Sie - aus Sicherheitsgründen das Passwort jetzt. - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "Anmeldebildschirm" - LABEL_DEFAULT_DOMAIN: "Standarddomain" - LABEL_DETERMINE_USER_DOMAIN: "Versuche Domain des Benutzers zu ermitteln" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Sprachauswahl bei der Anmeldung zulassen" - LABEL_DETERMINE_USER_LANGUAGE: "Versuche Sprache des Benutzers zu ermitteln" - TAB_BRANDING: - LEGEND_BRANDING: "Branding" - LABEL_PAGE_TITLE: "Seitentitel" - LABEL_LOADING_DESCRIPTION: "Ladevorgang-Beschreibung" - LABEL_FAVICON_URL: "Favicon" - LEGEND_LOGIN: "Anmeldung" - LABEL_LOGIN_LOGO: "Logo" - LABEL_LOGIN_DESCRIPTION: "Beschreibung" - LABEL_LOGIN_BACKGROUND: "Hintergrund" - LABEL_LOGIN_CUSTOM_CSS: "Benutzerdefiniertes CSS" - LABEL_LOGIN_SHOW_POWERED_LINK: "\"Powered by RainLoop\"-Link anzeigen" - LEGEND_USER: "Benutzer" - LABEL_USER_LOGO: "Logo" - LABEL_USER_LOGO_TITLE: "Logo Titel" - LABEL_USER_LOGO_MESSAGE: "Logo (Nachrichten-Ansicht)" - LABEL_USER_CUSTOM_CSS: "Benutzerdefiniertes CSS" - LEGEND_WELCOME_PAGE: "Willkommensseite" - LABEL_WELCOME_PAGE_TITLE: "Titel" - LABEL_WELCOME_PAGE_URL: "URL" - LABEL_WELCOME_PAGE_DISPLAY: "Anzeigen" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "Nie" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Einmal" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Immer" - HTML_ALERT_PREMIUM: "Diese Funktionalität ist für Premium-Abonnenten verfügbar." - TAB_CONTACTS: - LEGEND_CONTACTS: "Kontakte" - LEGEND_STORAGE: "Speicher (PDO)" - LABEL_ENABLE_CONTACTS: "Kontakte akivieren" - LABEL_ALLOW_SYNC: "Kontakte-Synchronisierung erlauben (mit externem CardDAV-Server)" - LABEL_STORAGE_TYPE: "Typ" - LABEL_STORAGE_DSN: "DSN" - LABEL_STORAGE_USER: "Benutzer" - LABEL_STORAGE_PASSWORD: "Passwort" - BUTTON_TEST: "Testen" - ALERT_NOTICE: "Hinweis!" - HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Verwenden Sie diesen Datenbanktyp nicht bei einer hohen Anzahl aktiver Benutzer." - HTML_ALERT_DOES_NOT_SUPPORTED: | - Ihr System unterstützt keine Kontakte. -
- Sie müssen die PDO-Erweiterung (SQLite / MySQL / PostgreSQL) auf Ihrem Server installieren oder aktivieren. - TAB_DOMAINS: - LEGEND_DOMAINS: "Domains" - BUTTON_ADD_DOMAIN: "Domain hinzufügen" - BUTTON_ADD_ALIAS: "Alias hinzufügen" - DELETE_ARE_YOU_SURE: "Sind Sie sicher?" - HTML_DOMAINS_HELPER: | - Liste der Domains, die Webmail abrufen darf. -
- Klicken Sie auf den Namen, um die Domain zu konfigurieren. - TAB_SECURITY: - LEGEND_SECURITY: "Sicherheit" - LABEL_ALLOW_TWO_STEP: "Zwei-Faktor-Authentifizierung erlauben" - LABEL_FORCE_TWO_STEP: "Zwei-Faktor-Authentifizierung erzwingen" - LABEL_USE_IMAGE_PROXY: "Lokalen Proxy für externe Bilder verwenden" - LABEL_ALLOW_OPEN_PGP: "OpenPGP erlauben" - LABEL_SHOW_PHP_INFO: "PHP-Informationen anzeigen" - LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Adminpanel-Zugangsdaten" - LABEL_CURRENT_PASSWORD: "Aktuelles Passwort" - LABEL_NEW_LOGIN: "Neuer Benutzer" - LABEL_NEW_PASSWORD: "Neues Passwort" - LABEL_REPEAT_PASSWORD: "Wiederholen" - BUTTON_UPDATE_PASSWORD: "Passwort aktualisieren" - LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: "Verlangen, dass das verwendete SSL-Zertifikat beglaubigt ist (IMAP/SMTP)" - LABEL_ALLOW_SELF_SIGNED: "Selbst-signierte Zertifikate erlauben" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "Google" - LABEL_ENABLE_GOOGLE: "Google-Integration aktivieren" - LABEL_GOOGLE_AUTH: "Autorisierung" - LABEL_GOOGLE_DRIVE: "Google-Drive-Integration (Erstellen-Ansicht)" - LABEL_GOOGLE_PREVIEW: "Google-Viewer-Integration (Vorschau für Microsoft Word-, Excel- und PowerPoint-Dateien)" - LABEL_GOOGLE_CLIENT_ID: "Client-ID" - LABEL_GOOGLE_CLIENT_SECRET: "Client-Geheimnis" - LABEL_GOOGLE_API_KEY: "API-Schlüssel" - HINT_GOOGLE_API_KEY: "Wird für Google-Drive-Dateiauswahl benötigt" - LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "Facebook-Integration aktivieren (Autorisierung)" - LABEL_FACEBOOK_APP_ID: "App-ID" - LABEL_FACEBOOK_APP_SECRET: "App-Geheimnis" - LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "Twitter-Integration aktivieren (Autorisierung)" - LABEL_TWITTER_CONSUMER_KEY: "Consumer-Schlüssel" - LABEL_TWITTER_CONSUMER_SECRET: "Consumer-Geheimnis" - LEGEND_DROPBOX: "Dropbox" - LABEL_ENABLE_DROPBOX: "Dropbox-Integration aktivieren" - LABEL_DROPBOX_API_KEY: "API-Schlüssel" - TOP_ALERT: "Detaillierte Informationen zur Integration von Social-Diensten finden Sie unter" - TAB_PLUGINS: - LEGEND_PLUGINS: "Plugins" - LABEL_ENABLE_PLUGINS: "Plugins aktivieren" - ALERT_NO_PLUGINS: "Es wurden noch keine Plugins installiert." - LINK_INSTALL_NEW: "Hier klicken, um Plugins zu installieren!" - HINT_CLICK_NAME: "Klicken Sie auf den Namen, um das Plugin zu konfigurieren." - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "Zur Aktualisierung verfügbar" - LEGEND_AVAILABLE_FOR_INSTALLATION: "Zur Installation verfügbar" - LEGEND_INSTALLED_PACKAGES: "Installierte Pakete" - ALERT_CANNOT_ACCESS_REPOSITORY: "Auf das Plugin-Repository kann derzeit nicht zugegriffen werden." - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "Ihre Domain" - LABEL_VERSION: "Version" - LABEL_CHECKING: "Überprüfe" - TYPE_BASIC_HINT: "Diese Domain ist nicht für die kommerzielle Nutzung (mit zusätzlichen Funktionen) lizenziert." - TYPE_BASIC_HINT_2: "Diese Domain kann nicht lizenziert werden." - HTML_ALERT_TOP_1: "RainLoop Webmail steht unter folgender Lizenz:" - HTML_ALERT_TOP_2: "Sie dürfen es für persönliche Projekte nutzen." - HTML_ALERT_TOP_3: | - Kommerzielle Nutzung (mit zusätzlichen Funktionen) von RainLoop Webmail erfordert eine - Subscription. - TYPE_PREMIUM_LIFETIME: "Lebenszeit" - LABEL_SUB_EXPIRES: "Ablauf der Subscription" - BUTTON_ACTIVATE: "Subscription-Schlüssel für diese Domain aktivieren" - BUTTON_PURCHASE: "Erwerben" - BUTTON_TRIAL: "Testversion" - TAB_ABOUT: - LEGEND_ABOUT: "Über" - LABEL_TAG_HINT: "Einfacher, moderner und schneller webbasierter E-Mail-Client" - LABEL_ALL_RIGHTS_RESERVED: "Alle Rechte vorbehalten." - HINT_READ_CHANGE_LOG: "Bitte Lesen Sie das Änderungsprotokoll vor dem Update." - HINT_IS_UP_TO_DATE: "RainLoop ist auf dem neusten Stand." - HTML_NEW_VERSION: "Neue Version %VERSION% verfügbar." - LABEL_UPDATING: "Aktualisiere" - LABEL_CHECKING: "Prüfe auf Aktualisierungen" - BUTTON_UPDATE: "Aktualisieren" - BUTTON_DOWNLOAD: "Herunterladen" - BUTTON_CHANGELOG: "Änderungsprotokoll" - POPUPS_ACTIVATE: - TITLE_ACTIVATE: "Subscription-Schlüssel aktivieren?" - TITLE_ACTIVATION: "Aktiviere..." - LABEL_DOMAIN: "Domain" - LABEL_SUB_KEY: "Subscription-Schlüssel" - BUTTON_ACTIVATE: "Aktivieren" - LABEL_ACTIVATED: "Aktiviert" - ERROR_INVALID_SUBS_KEY: "Ungültiger Subscription-Schlüssel" - SUBS_KEY_ACTIVATED: "Subscription-Schlüssel erfolgreich aktiviert" - HTML_DESC: | - Nach der Aktivierung wird %DOMAIN% um die Premium-Subscription erweitert. -
- Beachten Sie, dass ein Subscription-Schlüssel nur für eine einzelne Domain aktiviert werden kann. -

- Nach dem Start kann der Aktivierungsprozess nicht unterbrochen oder abgebrochen werden. - POPUPS_DOMAIN_ALIAS: - TITLE_ADD_DOMAIN_ALIAS: "Alias hinzufügen" - LABEL_ALIAS: "Alias" - LABEL_DOMAIN: "Domain" - BUTTON_CLOSE: "Schließen" - BUTTON_ADD: "Hinzufügen" - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "Domain hinzufügen" - TITLE_ADD_DOMAIN_WITH_NAME: "Domain \"%NAME%\" hinzufügen" - TITLE_EDIT_DOMAIN: "Domain \"%NAME%\" bearbeiten" - LABEL_NAME: "Name" - NAME_HELPER: "Platzhalter unterstützt" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "Server" - LABEL_PORT: "Port" - LABEL_SECURE: "Sicherheit" - LABEL_WHITE_LIST: "Whitelist" - SECURE_OPTION_NONE: "Ohne" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "STARTTLS" - LABEL_ALLOW_SIEVE_SCRIPTS: "Sieve-Skripte erlauben" - LABEL_ALLOW_USER_SCRIPT: "Benutzerdefiniertes Skript erlauben" - LABEL_USE_SHORT_LOGIN: "Kurze Benutzernamen verwenden" - LABEL_USE_AUTH: "Authentifizierung verwenden" - LABEL_USE_PHP_MAIL: "PHPs mail()-Funktion verwenden" - BUTTON_TEST: "Testen" - BUTTON_WHITE_LIST: "Whitelist" - BUTTON_SIEVE_CONFIGURATION: "Sieve-Konfiguration" - BUTTON_BACK_TO_IMAP: "Zurück zu IMAP-Einstellungen" - BUTTON_BACK: "Zurück" - BUTTON_CLOSE: "Schließen" - BUTTON_ADD: "Hinzufügen" - BUTTON_UPDATE: "Aktualisieren" - NEW_DOMAIN_DESC: "Diese Domain Konfiguration wird es dir möglich machen
mit %NAME% Mailadressen zu arbeiten." - WHITE_LIST_ALERT: | - Liste der User, die Webmail abrufen darf. - Verwenden Sie Leerzeichen als Trenner. - POPUPS_PLUGIN: - TITLE_PLUGIN: "Plugin" - DESC_NOTHING_TO_CONFIGURE: "Nichts zu konfigurieren" - BUTTON_CLOSE: "Schließen" - BUTTON_SAVE: "Speichern" - TOOLTIP_ABOUT_TITLE: "Über" - POPUPS_ASK: - DESC_WANT_CLOSE_THIS_WINDOW: "Sind Sie sicher, dass Sie dieses Fenster schließen möchten?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Wählen Sie Ihre Sprache" - HINTS: - BETA: "Beta" - UNSTABLE: "Nicht stabil" - WARNING: "Warnung!" - NOT_SUPPORTED: "Nicht unterstützt" - REQUIRES_PHP_54: "PHP 5.4 oder höher ist erforderlich" - ERRORS: - DOMAIN_ALREADY_EXISTS: "Domain existiert bereits" - UNKNOWN_ERROR: "Unbekannter Fehler" - NOTIFICATIONS: - INVALID_TOKEN: "Ungültiger Token" - AUTH_ERROR: "Authentifizierung fehlgeschlagen" - ACCESS_ERROR: "Zugriffsfehler" - CONNECTION_ERROR: "Serververbindung kann nicht hergestellt werden" - CAPTCHA_ERROR: "Falsche CAPTCHA-Eingabe." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- - Diese Social-ID ist bisher mit keinem E-Mail-Konto verbunden. Melden Sie sich - mit Ihren E-Mail-Anmeldedaten an und aktivieren Sie diese Funktion in Ihren - Konteneinstellungen. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- - Diese Social-ID ist bisher mit keinem E-Mail-Konto verbunden. Melden Sie sich - mit Ihren E-Mail-Anmeldedaten an und aktivieren Sie diese Funktion in Ihren - Konteneinstellungen. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- - Diese Social-ID ist bisher mit keinem E-Mail-Konto verbunden. Melden Sie sich - mit Ihren E-Mail-Anmeldedaten an und aktivieren Sie diese Funktion in Ihren - Konteneinstellungen. - DOMAIN_NOT_ALLOWED: "Diese Domain ist nicht zugelassen." - ACCOUNT_NOT_ALLOWED: "Konto ist nicht zugelassen." - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Zwei-Faktor-Authentifizierung erforderlich" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Fehler bei Zwei-Faktor-Authentifizierung" - COULD_NOT_SAVE_NEW_PASSWORD: "Neues Passwort konnte nicht gespeichert werden" - CURRENT_PASSWORD_INCORRECT: "Aktuelles Passwort falsch" - NEW_PASSWORD_SHORT: "Passwort ist zu kurz" - NEW_PASSWORD_WEAK: "Passwort ist zu einfach" - NEW_PASSWORD_FORBIDDENT: "Passwort enthält unzulässige Zeichen" - CONTACTS_SYNC_ERROR: "Fehler bei Kontakte-Synchronisierung" - CANT_GET_MESSAGE_LIST: "Die Nachrichtenliste ist nicht verfügbar" - CANT_GET_MESSAGE: "Diese Nachricht ist nicht verfügbar" - CANT_DELETE_MESSAGE: "Diese Nachricht kann nicht gelöscht werden" - CANT_MOVE_MESSAGE: "Diese Nachricht kann nicht verschoben werden" - CANT_SAVE_MESSAGE: "Diese Nachricht kann nicht gespeichert werden" - CANT_SEND_MESSAGE: "Diese Nachricht kann nicht gesendet werden" - INVALID_RECIPIENTS: "Ungültige Empfängeradressen" - CANT_SAVE_FILTERS: "Die Filter können nicht gespeichert werden" - CANT_GET_FILTERS: "Die Filter sind nicht verfügbar" - FILTERS_ARE_NOT_CORRECT: "Die Filter sind fehlerhaft" - CANT_CREATE_FOLDER: "Dieser Ordner kann nicht angelegt werden" - CANT_RENAME_FOLDER: "Dieser Ordner kann nicht umbenannt werden" - CANT_DELETE_FOLDER: "Dieser Ordner kann nicht gelöscht werden" - CANT_DELETE_NON_EMPTY_FOLDER: "Der Ordner kann nicht gelöscht werden; er ist nicht leer" - CANT_SUBSCRIBE_FOLDER: "Dieser Ordner kann nicht abonniert werden" - CANT_UNSUBSCRIBE_FOLDER: "Das Abonnement dieses Ordners kann nicht gelöscht werden" - CANT_SAVE_SETTINGS: "Einstellungen können nicht gespeichert werden" - CANT_SAVE_PLUGIN_SETTINGS: "Einstellungen können nicht gespeichert werden" - DOMAIN_ALREADY_EXISTS: "Diese Domain existiert bereits" - CANT_INSTALL_PACKAGE: "Paket konnte nicht installiert werden" - CANT_DELETE_PACKAGE: "Paket konnte nicht entfernt werden" - INVALID_PLUGIN_PACKAGE: "Plugin-Paket ist ungültig" - UNSUPPORTED_PLUGIN_PACKAGE: "Plugin-Paket wird nicht unterstützt" - LICENSING_SERVER_IS_UNAVAILABLE: "Der Subscription-Server kann nicht erreicht werden" - LICENSING_DOMAIN_EXPIRED: "Die Subscription dieser Domain ist abgelaufen." - LICENSING_DOMAIN_BANNED: "Die Subscription dieser Domain ist gesperrt." - DEMO_SEND_MESSAGE_ERROR: "Dieses Demokonto darf aus Sicherheitsgründen keine Nachrichten an externe E-Mail-Adressen versenden!" - DEMO_ACCOUNT_ERROR: "Aus Sicherheitsgründen ist dieses Konto nicht zu dieser Aktion berechtigt!" - ACCOUNT_ALREADY_EXISTS: "Dieses Konto existiert bereits" - ACCOUNT_DOES_NOT_EXIST: "Dieser Account existiert nicht." - MAIL_SERVER_ERROR: "Beim Zugriff auf den E-Mail-Server trat ein Fehler auf." - INVALID_INPUT_ARGUMENT: "Ungültige Eingabe" - UNKNOWN_ERROR: "Unbekannter Fehler" - STATIC: - BACK_LINK: "Aktualisieren" - DOMAIN_LIST_DESC: "Liste der Domains, auf die zugegriffen werden darf" - PHP_EXSTENSIONS_ERROR_DESC: "Notwendige PHP-Erweiterungen sind in Ihrer PHP-Konfiguration nicht vorhanden!" - PHP_VERSION_ERROR_DESC: "Ihre PHP Version (%VERSION%) ist älter als die notwendige Version: 5.3.0!" - NO_SCRIPT_TITLE: "Diese Anwendung benötigt JavaScript." - NO_SCRIPT_DESC: | - Ihr Browser unterstützt JavaScript nicht. - Aktivieren Sie bitte die JavaScript-Unterstützung in Ihrem Browser und versuchen Sie es erneut. - NO_COOKIE_TITLE: "Diese Anwendung benötigt Cookies." - NO_COOKIE_DESC: | - Ihr Browser unterstützt Cookies nicht. - Aktivieren Sie bitte die Cookie-Unterstützung in Ihrem Browser und versuchen Sie es erneut. - BAD_BROWSER_TITLE: "Ihr Browser ist veraltet." - BAD_BROWSER_DESC: | - Um alle Funktionen dieser Anwendung nutzen zu können, - sollten Sie einen der folgenden Browser herunterladen und installieren diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/en_US.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/en_US.yml deleted file mode 100755 index 0b5bb0de..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/en_US.yml +++ /dev/null @@ -1,322 +0,0 @@ -en_US: - LOGIN: - LABEL_LOGIN: "Login" - LABEL_PASSWORD: "Password" - BUTTON_LOGIN: "Log into the admin panel" - TOP_PANEL: - LABEL_PREMIUM: "Premium" - LABEL_ADMIN_PANEL: "Admin Panel" - TABS_LABELS: - LABEL_GENERAL_NAME: "General" - LABEL_LOGIN_NAME: "Login" - LABEL_BRANDING_NAME: "Branding" - LABEL_CONTACTS_NAME: "Contacts" - LABEL_DOMAINS_NAME: "Domains" - LABEL_SECURITY_NAME: "Security" - LABEL_INTEGRATION_NAME: "Integrations" - LABEL_PLUGINS_NAME: "Plugins" - LABEL_PACKAGES_NAME: "Packages" - LABEL_LICENSING_NAME: "Licensing" - LABEL_ABOUT_NAME: "About" - TAB_GENERAL: - LEGEND_INTERFACE: "Interface" - LABEL_LANGUAGE: "Language" - LABEL_LANGUAGE_ADMIN: "Language (admin)" - LABEL_THEME: "Theme" - LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Allow language selection on settings screen" - LABEL_ALLOW_THEMES_ON_SETTINGS: "Allow theme selection on settings screen" - LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Allow background selection on settings screen" - LABEL_SHOW_THUMBNAILS: "Show thumbnails (attachments)" - LABEL_ALLOW_GRAVATAR: "Allow Gravatar" - LEGEND_MAIN: "Main" - LABEL_ATTACHMENT_SIZE_LIMIT: "Attachment size limit" - LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Allow additional accounts" - LABEL_ALLOW_IDENTITIES: "Allow multiple identities" - LABEL_ALLOW_TEMPLATES: "Allow templates" - ALERT_WARNING: "Warning!" - HTML_ALERT_WEAK_PASSWORD: | - You are using the default admin password. -
- For security reasons please - change - password to something else now. - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "Login Screen" - LABEL_DEFAULT_DOMAIN: "Default Domain" - LABEL_DETERMINE_USER_DOMAIN: "Try to determine user domain" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Allow language selection on login screen" - LABEL_DETERMINE_USER_LANGUAGE: "Try to determine user language" - TAB_BRANDING: - LEGEND_BRANDING: "Branding" - LABEL_PAGE_TITLE: "Page Title" - LABEL_LOADING_DESCRIPTION: "Loading Description" - LABEL_FAVICON_URL: "Favicon" - LEGEND_LOGIN: "Login" - LABEL_LOGIN_LOGO: "Logo" - LABEL_LOGIN_DESCRIPTION: "Description" - LABEL_LOGIN_BACKGROUND: "Background" - LABEL_LOGIN_CUSTOM_CSS: "Custom CSS" - LABEL_LOGIN_SHOW_POWERED_LINK: "Show \"Powered by RainLoop\" link" - LEGEND_USER: "User" - LABEL_USER_LOGO: "Logo" - LABEL_USER_LOGO_TITLE: "Logo Title" - LABEL_USER_LOGO_MESSAGE: "Logo (Message View)" - LABEL_USER_CUSTOM_CSS: "Custom CSS" - LEGEND_WELCOME_PAGE: "Welcome page" - LABEL_WELCOME_PAGE_TITLE: "Title" - LABEL_WELCOME_PAGE_URL: "URL" - LABEL_WELCOME_PAGE_DISPLAY: "Display" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "None" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Once" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Always" - HTML_ALERT_PREMIUM: "This functionality is available for Premium subscribers." - TAB_CONTACTS: - LEGEND_CONTACTS: "Contacts" - LEGEND_STORAGE: "Storage (PDO)" - LABEL_ENABLE_CONTACTS: "Enable contacts" - LABEL_ALLOW_SYNC: "Allow contacts sync (with external CardDAV server)" - LABEL_STORAGE_TYPE: "Type" - LABEL_STORAGE_DSN: "Dsn" - LABEL_STORAGE_USER: "User" - LABEL_STORAGE_PASSWORD: "Password" - BUTTON_TEST: "Test" - ALERT_NOTICE: "Notice!" - HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Don't use this database type with a large number of active users." - HTML_ALERT_DOES_NOT_SUPPORTED: | - Your system doesn't support contacts. -
- You need to install or enable PDO (SQLite / MySQL / PostgreSQL) extension on your server. - TAB_DOMAINS: - LEGEND_DOMAINS: "Domains" - BUTTON_ADD_DOMAIN: "Add Domain" - BUTTON_ADD_ALIAS: "Add Alias" - DELETE_ARE_YOU_SURE: "Are you sure?" - HTML_DOMAINS_HELPER: | - List of domains webmail is allowed to access. -
- Click on the name to configure the domain. - TAB_SECURITY: - LEGEND_SECURITY: "Security" - LABEL_ALLOW_TWO_STEP: "Allow 2-Step Verification" - LABEL_FORCE_TWO_STEP: "Enforce 2-Step Verification" - LABEL_USE_IMAGE_PROXY: "Use local proxy for external images" - LABEL_ALLOW_OPEN_PGP: "Allow OpenPGP" - LABEL_SHOW_PHP_INFO: "Show PHP information" - LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Admin Panel Access Credentials" - LABEL_CURRENT_PASSWORD: "Current password" - LABEL_NEW_LOGIN: "New login" - LABEL_NEW_PASSWORD: "New password" - LABEL_REPEAT_PASSWORD: "Repeat" - BUTTON_UPDATE_PASSWORD: "Update Password" - LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: "Require verification of SSL certificate used (IMAP/SMTP)" - LABEL_ALLOW_SELF_SIGNED: "Allow self signed certificates" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "Google" - LABEL_ENABLE_GOOGLE: "Enable Google Integration" - LABEL_GOOGLE_AUTH: "Authorization" - LABEL_GOOGLE_DRIVE: "Google Drive Integration (Compose view)" - LABEL_GOOGLE_PREVIEW: "Google Viewer Integration (Preview for Microsoft Word, Excel and PowerPoint files)" - LABEL_GOOGLE_CLIENT_ID: "Client ID" - LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" - LABEL_GOOGLE_API_KEY: "Api Key" - HINT_GOOGLE_API_KEY: "Required for Google Drive File Picker" - LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "Enable Facebook Integration (Authorization)" - LABEL_FACEBOOK_APP_ID: "App ID" - LABEL_FACEBOOK_APP_SECRET: "App Secret" - LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "Enable Twitter Integration (Authorization)" - LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" - LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" - LEGEND_DROPBOX: "Dropbox" - LABEL_ENABLE_DROPBOX: "Enable Dropbox Integration" - LABEL_DROPBOX_API_KEY: "Api Key" - TOP_ALERT: "Detailed information on social integration is found at" - TAB_PLUGINS: - LEGEND_PLUGINS: "Plugins" - LABEL_ENABLE_PLUGINS: "Enable plugins" - ALERT_NO_PLUGINS: "No plugins have yet been installed." - LINK_INSTALL_NEW: "Click here to install new!" - HINT_CLICK_NAME: "Click on the name to configure the plugin." - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "Available for Update" - LEGEND_AVAILABLE_FOR_INSTALLATION: "Available for Installation" - LEGEND_INSTALLED_PACKAGES: "Installed Packages" - ALERT_CANNOT_ACCESS_REPOSITORY: "Cannot access the repository at the moment." - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "Your domain" - LABEL_VERSION: "Version" - LABEL_CHECKING: "Checking" - TYPE_BASIC_HINT: "This domain isn't licensed for commercial use (with additional features)." - TYPE_BASIC_HINT_2: "This domain can't be licensed." - HTML_ALERT_TOP_1: "RainLoop Webmail is licensed under" - HTML_ALERT_TOP_2: "You are free to use it for your personal projects." - HTML_ALERT_TOP_3: | - Commercial use (with additional features) of RainLoop Webmail requires getting a - subscription. - TYPE_PREMIUM_LIFETIME: "Lifetime" - LABEL_SUB_EXPIRES: "Subscription expires" - BUTTON_ACTIVATE: "Activate Subscription Key for this domain" - BUTTON_PURCHASE: "Purchase" - BUTTON_TRIAL: "Trial" - TAB_ABOUT: - LEGEND_ABOUT: "About" - LABEL_TAG_HINT: "Simple, modern & fast web-based email client" - LABEL_ALL_RIGHTS_RESERVED: "All Rights Reserved." - HINT_READ_CHANGE_LOG: "Please read the change log before updating." - HINT_IS_UP_TO_DATE: "RainLoop is up to date." - HTML_NEW_VERSION: "New %VERSION% version is available." - LABEL_UPDATING: "Updating" - LABEL_CHECKING: "Checking for updates" - BUTTON_UPDATE: "Update" - BUTTON_DOWNLOAD: "Download" - BUTTON_CHANGELOG: "Changelog" - POPUPS_ACTIVATE: - TITLE_ACTIVATE: "Activate Subscription Key?" - TITLE_ACTIVATION: "Activation..." - LABEL_DOMAIN: "Domain" - LABEL_SUB_KEY: "Subscription Key" - BUTTON_ACTIVATE: "Activate" - LABEL_ACTIVATED: "Activated" - ERROR_INVALID_SUBS_KEY: "Invalid Subscription Key" - SUBS_KEY_ACTIVATED: "Subscription Key Activated Successfully" - HTML_DESC: | - After activation, premium subscription for %DOMAIN% will be extended. -
- Note that subscription key can be activated for a single domain only. -

- Once started, the process of activation cannot be aborted or cancelled. - POPUPS_DOMAIN_ALIAS: - TITLE_ADD_DOMAIN_ALIAS: "Add Alias" - LABEL_ALIAS: "Alias" - LABEL_DOMAIN: "Domain" - BUTTON_CLOSE: "Close" - BUTTON_ADD: "Add" - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "Add Domain" - TITLE_ADD_DOMAIN_WITH_NAME: "Add Domain \"%NAME%\"" - TITLE_EDIT_DOMAIN: "Edit Domain \"%NAME%\"" - LABEL_NAME: "Name" - NAME_HELPER: "wildcard supported" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "Server" - LABEL_PORT: "Port" - LABEL_SECURE: "Secure" - LABEL_WHITE_LIST: "White List" - SECURE_OPTION_NONE: "None" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "STARTTLS" - LABEL_ALLOW_SIEVE_SCRIPTS: "Allow sieve scripts" - LABEL_ALLOW_USER_SCRIPT: "Allow custom user script" - LABEL_USE_SHORT_LOGIN: "Use short login" - LABEL_USE_AUTH: "Use authentication" - LABEL_USE_PHP_MAIL: "Use php mail() function" - BUTTON_TEST: "Test" - BUTTON_WHITE_LIST: "White List" - BUTTON_SIEVE_CONFIGURATION: "Sieve configuration" - BUTTON_BACK_TO_IMAP: "Back to IMAP settings" - BUTTON_BACK: "Back" - BUTTON_CLOSE: "Close" - BUTTON_ADD: "Add" - BUTTON_UPDATE: "Update" - NEW_DOMAIN_DESC: "This domain configuration will allow you to work
with %NAME% email addresses." - WHITE_LIST_ALERT: | - List of domain users webmail is allowed to access. - Use a space as delimiter. - POPUPS_PLUGIN: - TITLE_PLUGIN: "Plugin" - DESC_NOTHING_TO_CONFIGURE: "Nothing to configure" - BUTTON_CLOSE: "Close" - BUTTON_SAVE: "Save" - TOOLTIP_ABOUT_TITLE: "About" - POPUPS_ASK: - DESC_WANT_CLOSE_THIS_WINDOW: "Are you sure you want to close this window?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Choose your language" - HINTS: - BETA: "beta" - UNSTABLE: "unstable" - WARNING: "Warning!" - NOT_SUPPORTED: "not supported" - REQUIRES_PHP_54: "requires PHP 5.4 or greater" - ERRORS: - DOMAIN_ALREADY_EXISTS: "Domain already exists" - UNKNOWN_ERROR: "Unknown error" - NOTIFICATIONS: - INVALID_TOKEN: "Invalid token" - AUTH_ERROR: "Authentication failed" - ACCESS_ERROR: "Access error" - CONNECTION_ERROR: "Can't connect to server" - CAPTCHA_ERROR: "Incorrect CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - DOMAIN_NOT_ALLOWED: "Domain is not allowed" - ACCOUNT_NOT_ALLOWED: "Account is not allowed" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" - COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" - CURRENT_PASSWORD_INCORRECT: "Current password incorrect" - NEW_PASSWORD_SHORT: "Password is too short" - NEW_PASSWORD_WEAK: "Password is too easy" - NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" - CONTACTS_SYNC_ERROR: "Contacts synchronization error" - CANT_GET_MESSAGE_LIST: "Can't get message list" - CANT_GET_MESSAGE: "Can't get message" - CANT_DELETE_MESSAGE: "Can't delete message" - CANT_MOVE_MESSAGE: "Can't move message" - CANT_SAVE_MESSAGE: "Can't save message" - CANT_SEND_MESSAGE: "Can't send message" - INVALID_RECIPIENTS: "Invalid recipients" - CANT_SAVE_FILTERS: "Can't save filters" - CANT_GET_FILTERS: "Can't get filters" - FILTERS_ARE_NOT_CORRECT: "Filters are not correct" - CANT_CREATE_FOLDER: "Can't create folder" - CANT_RENAME_FOLDER: "Can't rename folder" - CANT_DELETE_FOLDER: "Can't delete folder" - CANT_DELETE_NON_EMPTY_FOLDER: "Can't delete non-empty directory" - CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" - CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" - CANT_SAVE_SETTINGS: "Can't save settings" - CANT_SAVE_PLUGIN_SETTINGS: "Can't save settings" - DOMAIN_ALREADY_EXISTS: "Domain already exists" - CANT_INSTALL_PACKAGE: "Failed to install package" - CANT_DELETE_PACKAGE: "Failed to remove package" - INVALID_PLUGIN_PACKAGE: "Invalid plugin package" - UNSUPPORTED_PLUGIN_PACKAGE: "Unsupported plugin package" - LICENSING_SERVER_IS_UNAVAILABLE: "Subscription server is unvailable" - LICENSING_DOMAIN_EXPIRED: "Subscription for this domain has expired." - LICENSING_DOMAIN_BANNED: "Subscription for this domain is banned." - DEMO_SEND_MESSAGE_ERROR: "For security purposes, this account is not allowed to send messages to external e-mail addresses!" - DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" - ACCOUNT_ALREADY_EXISTS: "Account already exists" - ACCOUNT_DOES_NOT_EXIST: "Account doesn't exist" - MAIL_SERVER_ERROR: "An error has occured while accessing mail server" - INVALID_INPUT_ARGUMENT: "Invalid input argument" - UNKNOWN_ERROR: "Unknown error" - STATIC: - BACK_LINK: "Reload" - DOMAIN_LIST_DESC: "List of domains webmail is allowed to access." - PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" - PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" - NO_SCRIPT_TITLE: "JavaScript is required for this application." - NO_SCRIPT_DESC: | - JavaScript support is not available in your browser. - Please enable JavaScript support in your browser settings and retry. - NO_COOKIE_TITLE: "Cookies support is required for this application." - NO_COOKIE_DESC: | - Cookies support is not available in your browser. - Please enable Cookie support in your browser settings and retry. - BAD_BROWSER_TITLE: "Your browser is outdated." - BAD_BROWSER_DESC: | - To use all the features of the application, - download and install one of these browsers: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/es_ES.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/es_ES.yml deleted file mode 100755 index 2f3fc40a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/es_ES.yml +++ /dev/null @@ -1,321 +0,0 @@ -es_ES: - LOGIN: - LABEL_LOGIN: "Ingresar" - LABEL_PASSWORD: "Contraseña" - BUTTON_LOGIN: "Ingresar al panel de control" - TOP_PANEL: - LABEL_PREMIUM: "Premium" - LABEL_ADMIN_PANEL: "Panel de Control" - TABS_LABELS: - LABEL_GENERAL_NAME: "General" - LABEL_LOGIN_NAME: "Ingresar" - LABEL_BRANDING_NAME: "Personalización" - LABEL_CONTACTS_NAME: "Contactos" - LABEL_DOMAINS_NAME: "Dominios" - LABEL_SECURITY_NAME: "Seguridad" - LABEL_INTEGRATION_NAME: "Integración" - LABEL_PLUGINS_NAME: "Complementos" - LABEL_PACKAGES_NAME: "Paquetes" - LABEL_LICENSING_NAME: "Licencias" - LABEL_ABOUT_NAME: "Acerca" - TAB_GENERAL: - LEGEND_INTERFACE: "Interfaz" - LABEL_LANGUAGE: "Idioma" - LABEL_LANGUAGE_ADMIN: "Idioma (Panel de Control)" - LABEL_THEME: "Temas" - LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Permitir selección del idioma" - LABEL_ALLOW_THEMES_ON_SETTINGS: "Permitir personalización de la interfaz" - LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Permitir cambiar el fondo de pantalla" - LABEL_NEW_FOLDER_MOVE: "Nuevo botón \"mover a carpeta\"" - LABEL_SHOW_THUMBNAILS: "Mostrar previsualización (adjuntos)" - LABEL_ALLOW_GRAVATAR: "Usar Gravatar" - LEGEND_MAIN: "Principal" - LABEL_ATTACHMENT_SIZE_LIMIT: "Tamaño máximo para adjuntos" - LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Permitir cuentas adicionales" - LABEL_ALLOW_IDENTITIES: "Permitir múltiples identidades" - LABEL_ALLOW_TEMPLATES: "Permitir plantillas" - ALERT_WARNING: "¡Atención!" - HTML_ALERT_WEAK_PASSWORD: | - Estas utilizando la contraseña por defecto. -
- Debido a razones de seguridad, debes - cambiar - tu contraseña inmediatamente. - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "Pantalla de Ingreso" - LABEL_DEFAULT_DOMAIN: "Dominio por defecto" - LABEL_DETERMINE_USER_DOMAIN: "Intentar encontrar el dominio del usuario" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Permitir la selección de idioma en la pantalla de ingreso" - LABEL_DETERMINE_USER_LANGUAGE: "Intentar definir el idioma del usuari" - TAB_BRANDING: - LEGEND_BRANDING: "Personalización" - LABEL_PAGE_TITLE: "Título de la página" - LABEL_LOADING_DESCRIPTION: "Descripción" - LABEL_FAVICON_URL: "Favicon" - LEGEND_LOGIN: "Ingresar" - LABEL_LOGIN_LOGO: "Logo" - LABEL_LOGIN_DESCRIPTION: "Descripción" - LABEL_LOGIN_BACKGROUND: "Fondo" - LABEL_LOGIN_CUSTOM_CSS: "CSS Personalizado" - LABEL_LOGIN_SHOW_POWERED_LINK: "Mostrar el enlace \"Potenciado por RainLoop\" " - LEGEND_USER: "Usuario" - LABEL_USER_LOGO: "Logo" - LABEL_USER_LOGO_TITLE: "Título del Logo" - LABEL_USER_LOGO_MESSAGE: "Logo (Vista desde mensaje)" - LABEL_USER_CUSTOM_CSS: "CSS Personalizado" - LEGEND_WELCOME_PAGE: "Pantalla de bienvenida" - LABEL_WELCOME_PAGE_TITLE: "Título" - LABEL_WELCOME_PAGE_URL: "URL" - LABEL_WELCOME_PAGE_DISPLAY: "Mostrar" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "Ninguno" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Una vez" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Siempre" - HTML_ALERT_PREMIUM: "Esta función se encuentra disponible para Usuarios Premium." - TAB_CONTACTS: - LEGEND_CONTACTS: "Contactos" - LEGEND_STORAGE: "Almacenamiento (PDO)" - LABEL_ENABLE_CONTACTS: "Permitir contactos" - LABEL_ALLOW_SYNC: "Permitir sincronización de contactos (servidor externo de CardDAV)" - LABEL_STORAGE_TYPE: "Tip" - LABEL_STORAGE_DSN: "Dsn" - LABEL_STORAGE_USER: "Usuario" - LABEL_STORAGE_PASSWORD: "Contraseña" - BUTTON_TEST: "Probar" - ALERT_NOTICE: "¡Advertencia!" - HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "No utilices este tipo de Base de Datos para un número grande de usuarios." - HTML_ALERT_DOES_NOT_SUPPORTED: | - Tu sistema no soporta el uso de Contactos. -
- Debes instalar o habilitar el uso de PDO (SQLite / MySQL / PostgreSQL) en tu servidor. - TAB_DOMAINS: - LEGEND_DOMAINS: "Dominios" - BUTTON_ADD_DOMAIN: "Agregar dominio" - BUTTON_ADD_ALIAS: "Agregar alias" - DELETE_ARE_YOU_SURE: "¿Estás seguro?" - HTML_DOMAINS_HELPER: | - Lista de los dominios de correo al que se permite ingresar. -
- Haz click en el nombre de un dominio para modificarlo. - TAB_SECURITY: - LEGEND_SECURITY: "Seguridad" - LABEL_ALLOW_TWO_STEP: "Activar la verificación de 2 pasos" - LABEL_FORCE_TWO_STEP: "Forzar la Autenticación en 2 pasos" - LABEL_USE_IMAGE_PROXY: "Utilizar un proxy local para mostrar imágenes externas" - LABEL_ALLOW_OPEN_PGP: "Permitir OpenPGP" - LABEL_SHOW_PHP_INFO: "Mostrar información de PHP" - LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Credenciales de Acceso al panel de control" - LABEL_CURRENT_PASSWORD: "Contraseña actual" - LABEL_NEW_LOGIN: "Nuevo login" - LABEL_NEW_PASSWORD: "Nueva contraseña" - LABEL_REPEAT_PASSWORD: "Re-ingresar" - BUTTON_UPDATE_PASSWORD: "Actualizar contraseña" - LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: "Requerir verificación del certificado SSL (IMAP / SMTP)" - LABEL_ALLOW_SELF_SIGNED: "Permitir certificados auto-firmados" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "Google" - LABEL_ENABLE_GOOGLE: "Activar la integración con Google" - LABEL_GOOGLE_AUTH: "Autorización" - LABEL_GOOGLE_DRIVE: "Google Drive Integration (vista del editor)" - LABEL_GOOGLE_PREVIEW: "Google Viewer Integration (Previsualizar archivos de Microsoft Word, Excel y PowerPoint)" - LABEL_GOOGLE_CLIENT_ID: "ID del Cliente" - LABEL_GOOGLE_CLIENT_SECRET: "Clave secreta de Cliente" - LABEL_GOOGLE_API_KEY: "Llave API" - HINT_GOOGLE_API_KEY: "Requerido para seleccionar archivos con Google Drive" - LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "Activar la integración con Facebook (Ingreso)" - LABEL_FACEBOOK_APP_ID: "ID de la Aplicación" - LABEL_FACEBOOK_APP_SECRET: "Clave secreta de la Aplicación" - LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "Activar la integración con Twitter (Ingreso)" - LABEL_TWITTER_CONSUMER_KEY: "Llave del Cliente" - LABEL_TWITTER_CONSUMER_SECRET: "Llave secreta del Cliente" - LEGEND_DROPBOX: "Dropbox" - LABEL_ENABLE_DROPBOX: "Activar la integración con Dropbox" - LABEL_DROPBOX_API_KEY: "Llave API" - TOP_ALERT: "Puedes encontrar más información sobre integración de redes sociales en" - TAB_PLUGINS: - LEGEND_PLUGINS: "Complementos" - LABEL_ENABLE_PLUGINS: "Activar Plugins" - ALERT_NO_PLUGINS: "No hay plugins instalados." - LINK_INSTALL_NEW: "¡Haz click aquí para instalar uno nuevo!" - HINT_CLICK_NAME: "Haz click en el nombre para configurar el plugin." - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "Actualización disponible" - LEGEND_AVAILABLE_FOR_INSTALLATION: "Instalación disponible" - LEGEND_INSTALLED_PACKAGES: "Paquetes instalados" - ALERT_CANNOT_ACCESS_REPOSITORY: "No se puede acceder al repositorio en estos momentos." - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "Tu dominio" - LABEL_VERSION: "Versión" - LABEL_CHECKING: "Verificando" - TYPE_BASIC_HINT: "Este dominio no ha sido licenciado para uso comercial (algunas características no disponibles)." - TYPE_BASIC_HINT_2: "Este dominio no puede ser licenciado." - HTML_ALERT_TOP_1: "RainLoop Webmail está licenciado bajo" - HTML_ALERT_TOP_2: "Eres libre de usarlo para un uso personal." - HTML_ALERT_TOP_3: | - Para utilizar RainLoop Webmail de forma comercial (con características adicionales) debes adquirir una licencia - Premium. - TYPE_PREMIUM_LIFETIME: "De por vida" - LABEL_SUB_EXPIRES: "La suscripción finaliza" - BUTTON_ACTIVATE: "Activar clave de suscripción para este dominio" - BUTTON_PURCHASE: "Comprar" - BUTTON_TRIAL: "Versión de Prueba" - TAB_ABOUT: - LEGEND_ABOUT: "Acerca" - LABEL_TAG_HINT: "Moderno, simple y rápido cliente web de correo electrónico" - LABEL_ALL_RIGHTS_RESERVED: "Todos los Derechos Reservados." - HINT_READ_CHANGE_LOG: "Revisa la lista de cambios antes de actualizar." - HINT_IS_UP_TO_DATE: "RainLoop está actualizado." - HTML_NEW_VERSION: "Nueva versión ( %VERSION% ) está disponible." - LABEL_UPDATING: "Actualizando" - LABEL_CHECKING: "Buscando actualizaciones" - BUTTON_UPDATE: "Actualizar" - BUTTON_DOWNLOAD: "Descargar" - BUTTON_CHANGELOG: "Lista de Cambios" - POPUPS_ACTIVATE: - TITLE_ACTIVATE: "¿Activar la clave de suscripción?" - TITLE_ACTIVATION: "Activando..." - LABEL_DOMAIN: "Dominio" - LABEL_SUB_KEY: "Clave de Suscripción" - BUTTON_ACTIVATE: "Activar" - LABEL_ACTIVATED: "Activado" - ERROR_INVALID_SUBS_KEY: "Clave de Suscripción inválida" - SUBS_KEY_ACTIVATED: "Clave de Suscripción activada correctamente" - HTML_DESC: "Después de la activación, la suscripción para %DOMAIN% será extendida.\n
\nTome nota que esta llave de suscripci\tón podrá\ - \ ser activada solo para un dominio.\n

\nUna vez comenzado, el proceso de activación no puede ser abortado ni cancelado.\n" - POPUPS_DOMAIN_ALIAS: - TITLE_ADD_DOMAIN_ALIAS: "Agregar alias" - LABEL_ALIAS: "Alias" - LABEL_DOMAIN: "Dominio" - BUTTON_CLOSE: "Cerrar" - BUTTON_ADD: "Agregar" - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "Agregar dominio" - TITLE_ADD_DOMAIN_WITH_NAME: "Agregar \"%NAME%\" como dominio" - TITLE_EDIT_DOMAIN: "Editar \"&NAME&\"" - LABEL_NAME: "Nombre" - NAME_HELPER: "wildcards soportados" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "FILTRO" - LABEL_SERVER: "Servidor" - LABEL_PORT: "Puerto" - LABEL_SECURE: "Seguridad" - LABEL_WHITE_LIST: "Lista blanca" - SECURE_OPTION_NONE: "Ninguno" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "STARTTLS" - LABEL_ALLOW_SIEVE_SCRIPTS: "Permitir scripts de filtro" - LABEL_ALLOW_USER_SCRIPT: "Permitir scripts propios" - LABEL_USE_SHORT_LOGIN: "Inicio de Sesión corto" - LABEL_USE_AUTH: "Usar autenticación" - LABEL_USE_PHP_MAIL: "Utilizar la función mail() de PHP" - BUTTON_TEST: "Probar" - BUTTON_WHITE_LIST: "Lista blanca" - BUTTON_SIEVE_CONFIGURATION: "Configuraciones de Filtro" - BUTTON_BACK_TO_IMAP: "Volver a la configuración IMAP" - BUTTON_BACK: "Volver" - BUTTON_CLOSE: "Cerrar" - BUTTON_ADD: "Agregar" - BUTTON_UPDATE: "Actualizar" - NEW_DOMAIN_DESC: "Esta configuración de Dominio le permitirá trabajar
con direcciones de correo tipo @%NAME%." - WHITE_LIST_ALERT: | - Lista de dominios con que los usuarios pueden ingresar. - Use un espacio como delimitador. - POPUPS_PLUGIN: - TITLE_PLUGIN: "Plugin" - DESC_NOTHING_TO_CONFIGURE: "Nada para configurar" - BUTTON_CLOSE: "Cerrar" - BUTTON_SAVE: "Guardar" - TOOLTIP_ABOUT_TITLE: "Acerca" - POPUPS_ASK: - DESC_WANT_CLOSE_THIS_WINDOW: "¿Estás seguro de que deseas cerrar esta ventana?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Seleccionar idioma" - HINTS: - BETA: "beta" - UNSTABLE: "inestable" - WARNING: "¡Atención!" - NOT_SUPPORTED: "no soportado" - REQUIRES_PHP_54: "requiere PHP 5.4 o superior" - ERRORS: - DOMAIN_ALREADY_EXISTS: "El Dominio ya existe" - UNKNOWN_ERROR: "Error desconocido" - NOTIFICATIONS: - INVALID_TOKEN: "Token inválido" - AUTH_ERROR: "Autenticación fallida" - ACCESS_ERROR: "Error de acceso" - CONNECTION_ERROR: "No se puede conectar al servidor" - CAPTCHA_ERROR: "CAPTCHA Incorrecto." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - La cuenta social (ID) no está asignada a ninguna cuenta de correo todavía. - Inicie sesión con las credenciales de correo electrónico y habilite esta característica - en la configuración de cuenta. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - La cuenta social (ID) no está asignada a ninguna cuenta de correo todavía. - Inicie sesión con las credenciales de correo electrónico y habilite esta característica - en la configuración de cuenta. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >+ - La cuenta social (ID) no está asignada a ninguna cuenta de correo todavía. - Inicie sesión con las credenciales de correo electrónico y habilite esta característica - en la configuración de cuenta. - - DOMAIN_NOT_ALLOWED: "Dominio no permitido" - ACCOUNT_NOT_ALLOWED: "La cuenta no está permitida" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "La verificación en 2 pasos es obligatoria" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Error en la verificación de dos pasos" - COULD_NOT_SAVE_NEW_PASSWORD: "No se ha podido guardar la nueva contraseña" - CURRENT_PASSWORD_INCORRECT: "La contraseña actual es incorrecta" - NEW_PASSWORD_SHORT: "La contraseña es muy corta" - NEW_PASSWORD_WEAK: "La contraseña es muy fácil" - NEW_PASSWORD_FORBIDDENT: "La contraseña contiene caracteres prohibidos" - CONTACTS_SYNC_ERROR: "Error de sincronización de Contactos" - CANT_GET_MESSAGE_LIST: "No se puede obtener la lista de mensajes" - CANT_GET_MESSAGE: "No se puede obtener el mensaje" - CANT_DELETE_MESSAGE: "No se puede eliminar el mensaje" - CANT_MOVE_MESSAGE: "No se puede mover el mensaje" - CANT_SAVE_MESSAGE: "No se puede guardar el mensaje" - CANT_SEND_MESSAGE: "No se puede enviar el mensaje" - INVALID_RECIPIENTS: "Los destinatarios no son válidos" - CANT_SAVE_FILTERS: "No se han podido guardar los filtros" - CANT_GET_FILTERS: "No se pudieron obtener los filtros" - FILTERS_ARE_NOT_CORRECT: "Los filtros no son correctos" - CANT_CREATE_FOLDER: "No se puede crear la carpeta" - CANT_RENAME_FOLDER: "No se puede renombrar la carpeta" - CANT_DELETE_FOLDER: "No se puede eliminar la carpeta" - CANT_DELETE_NON_EMPTY_FOLDER: "No se puede eliminar una carpeta que no está vacía" - CANT_SUBSCRIBE_FOLDER: "No se pudo suscribir a la carpeta" - CANT_UNSUBSCRIBE_FOLDER: "No se pudo dessuscribir a la carpeta" - CANT_SAVE_SETTINGS: "No se pudieron guardar las configuraciones" - CANT_SAVE_PLUGIN_SETTINGS: "No se pudieron guardar las configuraciones" - DOMAIN_ALREADY_EXISTS: "El Dominio ya existe" - CANT_INSTALL_PACKAGE: "No se ha podido instalar el paquete" - CANT_DELETE_PACKAGE: "No se ha podido eliminar el paquete" - INVALID_PLUGIN_PACKAGE: "El paquete del plugin es inválido" - UNSUPPORTED_PLUGIN_PACKAGE: "El paquete del plugin es incompatible" - LICENSING_SERVER_IS_UNAVAILABLE: "El Servidor de Suscripción no está disponible" - LICENSING_DOMAIN_EXPIRED: "La suscripción para este dominio ha expirado." - LICENSING_DOMAIN_BANNED: "La suscripción para este dominio se ha bloqueado." - DEMO_SEND_MESSAGE_ERROR: "Por razones de seguridad, esta cuenta no permite enviar mensajes a direcciones de correo electrónico externas" - DEMO_ACCOUNT_ERROR: "Debido a razones de seguridad, esta cuenta no puede realizar esta acción" - ACCOUNT_ALREADY_EXISTS: "La cuenta ya existe" - ACCOUNT_DOES_NOT_EXIST: "La cuenta no existe" - MAIL_SERVER_ERROR: "Ocurrió un error mientras se accedía al servidor" - INVALID_INPUT_ARGUMENT: "Los datos ingresados son inválidos" - UNKNOWN_ERROR: "Error desconocido" - STATIC: - BACK_LINK: "Actualizar" - DOMAIN_LIST_DESC: "Lista de dominios de correo web que se le permite acceder." - PHP_EXSTENSIONS_ERROR_DESC: "¡La extensión de PHP requerida no está disponible en su configuración de PHP!" - PHP_VERSION_ERROR_DESC: "¡La versión de PHP (%VERSION%) es menor a la mínima requerida 5.3.0!" - NO_SCRIPT_TITLE: "JavaScript es requerido para esta aplicación." - NO_SCRIPT_DESC: | - JavaScript está desactivado. Por favor habilite JavaScript en la configuración de su navegador e inténtelo de nuevo. - NO_COOKIE_TITLE: "Las Cookies son requeridas para esta aplicación." - NO_COOKIE_DESC: | - Las Cookies están desactivadas. Por favor habilite las Cookies en la configuración de su navegador e inténtelo de nuevo. - BAD_BROWSER_TITLE: "El navegador no está actualizado" - BAD_BROWSER_DESC: | - Para usar todas las características de esta aplicación, - descargue e instale uno de estos navegadores: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fa_IR.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fa_IR.yml deleted file mode 100755 index 68f6c7a1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fa_IR.yml +++ /dev/null @@ -1,325 +0,0 @@ -fa_IR: - LOGIN: - LABEL_LOGIN: "ورود" - LABEL_PASSWORD: "گذرواژه" - BUTTON_LOGIN: "ورود به صفحه مدیریت" - TOP_PANEL: - LABEL_PREMIUM: "پریمیوم" - LABEL_ADMIN_PANEL: "صفحه مدیریت" - TABS_LABELS: - LABEL_GENERAL_NAME: "عمومی" - LABEL_LOGIN_NAME: "ورود" - LABEL_BRANDING_NAME: "برندسازی" - LABEL_CONTACTS_NAME: "تماس‌ها" - LABEL_DOMAINS_NAME: "دامنه‌ها" - LABEL_SECURITY_NAME: "امنیت" - LABEL_INTEGRATION_NAME: "یکپارچه‌سازی" - LABEL_PLUGINS_NAME: "افزونه‌ها" - LABEL_PACKAGES_NAME: "بسته‌ها" - LABEL_LICENSING_NAME: "مجوزها" - LABEL_ABOUT_NAME: "درباره" - TAB_GENERAL: - LEGEND_INTERFACE: "رابط" - LABEL_LANGUAGE: "زبان" - LABEL_LANGUAGE_ADMIN: "زبان (مدیر)" - LABEL_THEME: "پوسته" - LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "زبان در صفحه تنظیمات قابل انتخاب باشد" - LABEL_ALLOW_THEMES_ON_SETTINGS: "پوسته در صفحه تنظیمات قابل انتخاب باشد" - LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "تصویر پشت زمینه در صفحه تنظیمات قابل انتخاب باشد" - LABEL_SHOW_THUMBNAILS: "اندازه کوچک را نشان بده (پیوست‌ها)" - LABEL_ALLOW_GRAVATAR: "اجازه استفاده از آواتار" - LEGEND_MAIN: "اصلی" - LABEL_ATTACHMENT_SIZE_LIMIT: "محدودیت اندازه پیوست" - LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "مجوز استفاده از نام‌های کاربری دیگر" - LABEL_ALLOW_IDENTITIES: "اجازه استفاده از چندین شناسه" - LABEL_ALLOW_TEMPLATES: "اجازه استفاده از پوسته‌ها" - ALERT_WARNING: "اخطار!" - HTML_ALERT_WEAK_PASSWORD: |+ - شما در حال استفاده از گذرواژه پیش‌فرض کاربر مدیر هستید. -
- بدلیل رعایت مسائل امنیتی - گذرواژه - را به کلمه دیگری تغییر دهید. - - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "صفحه ورود" - LABEL_DEFAULT_DOMAIN: "دامنه پیش‌فرض" - LABEL_DETERMINE_USER_DOMAIN: "برای تشخیص دامنه کاربر تلاش شود" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "انتخاب زبان در صفحه ورود" - LABEL_DETERMINE_USER_LANGUAGE: "برای تشخیص زبان کاربر تلاش شود" - TAB_BRANDING: - LEGEND_BRANDING: "برندسازی" - LABEL_PAGE_TITLE: "عنوان صفحه" - LABEL_LOADING_DESCRIPTION: "بارگذاری توضیحات" - LABEL_FAVICON_URL: "Favicon" - LEGEND_LOGIN: "ورود" - LABEL_LOGIN_LOGO: "لوگو" - LABEL_LOGIN_DESCRIPTION: "توضیحات" - LABEL_LOGIN_BACKGROUND: "پشت‌زمینه" - LABEL_LOGIN_CUSTOM_CSS: "CSS سفارشی‌سازی" - LABEL_LOGIN_SHOW_POWERED_LINK: "نمایش لینک \"قدرت گرفته از RainLoop\"" - LEGEND_USER: "کاربر" - LABEL_USER_LOGO: "لوگو" - LABEL_USER_LOGO_TITLE: "عنوان لوگو" - LABEL_USER_LOGO_MESSAGE: "لوگو (مشاهده پیام)" - LABEL_USER_CUSTOM_CSS: "CSS سفارشی‌سازی" - LEGEND_WELCOME_PAGE: "صفحه خوش‌آمدگویی" - LABEL_WELCOME_PAGE_TITLE: "عنوان" - LABEL_WELCOME_PAGE_URL: "تارنما" - LABEL_WELCOME_PAGE_DISPLAY: "نمایش" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "هیچ‌کدام" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "یک‌بار" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "همیشه" - HTML_ALERT_PREMIUM: "این قابلیت برای نسخه Premium مشترکین در دسترس هست." - TAB_CONTACTS: - LEGEND_CONTACTS: "تماس‌ها" - LEGEND_STORAGE: "فضای‌ ذخیره‌سازی (pdo)" - LABEL_ENABLE_CONTACTS: "فعال‌سازی تماس‌ها" - LABEL_ALLOW_SYNC: "اجازه‌ همگام‌سازی تماس‌ها (با یک سرویس خارجی CardDAV)" - LABEL_STORAGE_TYPE: "نوع" - LABEL_STORAGE_DSN: "Dsn" - LABEL_STORAGE_USER: "کاربر" - LABEL_STORAGE_PASSWORD: "گذرواژه" - BUTTON_TEST: "تست" - ALERT_NOTICE: "توجه!" - HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "از این پایگاه داده برای کاربران زیاد استفاده نکنید." - HTML_ALERT_DOES_NOT_SUPPORTED: | - سیستم از تماس‌ها پشتیبانی نمی‌کند -
- شما باید افزونه PDO (SQLite / MySQL / PostgreSQL) را نصب کنید یا اینکه فعال کنید. - TAB_DOMAINS: - LEGEND_DOMAINS: "دامنه‌ها" - BUTTON_ADD_DOMAIN: "اضافه‌کردن دامنه" - BUTTON_ADD_ALIAS: "اضافه‌کردن نام مستعار" - DELETE_ARE_YOU_SURE: "آیا مطمئن هستید؟" - HTML_DOMAINS_HELPER: | - لیستی از دامنه‌هایی که وب‌میل اجازه دسترسی به آنها را دارد. -
- روی دامنه دامنه جهت پیکربندی کلیک کنید. - TAB_SECURITY: - LEGEND_SECURITY: "امنیت" - LABEL_ALLOW_TWO_STEP: "اعتبارسنجی دو مرحله‌ای" - LABEL_FORCE_TWO_STEP: "اعتبارسنجی دو مرحله‌ای اجباری" - LABEL_USE_IMAGE_PROXY: "از پروکسی محلی برای عکسهای خارج از سرور استفاده شود" - LABEL_ALLOW_OPEN_PGP: "فعال‌سازی OpenPGP" - LABEL_SHOW_PHP_INFO: "نمایش اطلاعات PHP" - LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "اعتبار مجوز دسترسی به صفحه مدیریت" - LABEL_CURRENT_PASSWORD: "گذرواژه فعلی" - LABEL_NEW_LOGIN: "نام کاربری جدید" - LABEL_NEW_PASSWORD: "گذرواژه جدید" - LABEL_REPEAT_PASSWORD: "تکرار" - BUTTON_UPDATE_PASSWORD: "بروز‌رسانی گذرواژه" - LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: "به بررسی گواهینامه SSL نیاز داشته باشد (IMAP/SMTP)" - LABEL_ALLOW_SELF_SIGNED: "به گواهی‌نامه‌هایی که توسط خودشان امضاء شده‌اند اجازه بده" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "گوگل" - LABEL_ENABLE_GOOGLE: "فعال‌سازی یکپارچگی با گوگل" - LABEL_GOOGLE_AUTH: "احراز مجوز" - LABEL_GOOGLE_DRIVE: "یکپارچگی با گوگل درایور (قسمت ایجاد پیام)" - LABEL_GOOGLE_PREVIEW: "یکپارچگی با نمایش فایلهای اداری گوگل (پیش نمایش برای Work, Excel, PowerPoint)" - LABEL_GOOGLE_CLIENT_ID: "شناسه کلاینت" - LABEL_GOOGLE_CLIENT_SECRET: "رمز کلاینت" - LABEL_GOOGLE_API_KEY: "کلید API" - HINT_GOOGLE_API_KEY: "اجباری برای دریافت کننده فایل گوگل درایو" - LEGEND_FACEBOOK: "فیس‌بوک" - LABEL_ENABLE_FACEBOOK: "فعال‌سازی یکپارچگی با فیس‌بوک (احراز هویت)" - LABEL_FACEBOOK_APP_ID: "شناسه برنامه" - LABEL_FACEBOOK_APP_SECRET: "رمز برنامه" - LEGEND_TWITTER: "توییتر" - LABEL_ENABLE_TWITTER: "فعال‌سازی یکپارچگی با توییتر (احراز هویت)" - LABEL_TWITTER_CONSUMER_KEY: "کلید مشتری" - LABEL_TWITTER_CONSUMER_SECRET: "رمز مشتری" - LEGEND_DROPBOX: "دارپ‌باکس" - LABEL_ENABLE_DROPBOX: "فعال‌سازی یکپارچگی با دراپ‌باکس" - LABEL_DROPBOX_API_KEY: "کلید API" - TOP_ALERT: "جزییات اطلاعات یکپارچگی با شبکه اجتماعی پیدا شد" - TAB_PLUGINS: - LEGEND_PLUGINS: "افزونه‌ها" - LABEL_ENABLE_PLUGINS: "فعال‌سازی افزونه‌ها" - ALERT_NO_PLUGINS: "هیچ افزونه‌ای نصب نشده است" - LINK_INSTALL_NEW: "اینجا برای نصب جدید کلیک کنید" - HINT_CLICK_NAME: "روی نام هر افزونه برای پیکربندی آن کلیک کنید" - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "برای بروزرسانی در دسترس هست" - LEGEND_AVAILABLE_FOR_INSTALLATION: "برای نصب در دسترس هست" - LEGEND_INSTALLED_PACKAGES: "بسته‌های نصب شده" - ALERT_CANNOT_ACCESS_REPOSITORY: "در این لحظه دسترسی به مخزن امکان‌پذیر نیست" - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "دامنه شما" - LABEL_VERSION: "نسخه" - LABEL_CHECKING: "در حال چک کردن" - TYPE_BASIC_HINT: "این دامنه مجوز استفاده تجاری را ندارد (با قابلیت‌های بیشتر)" - TYPE_BASIC_HINT_2: "به این دامنه مجوز داده نشده است." - HTML_ALERT_TOP_1: "وبمیل RainLoop تحت مجوز" - HTML_ALERT_TOP_2: " شما برای استفاده از آن آزاد personal projects. هستید" - HTML_ALERT_TOP_3: | - استفاده تجاری (با قابلیت‌های بیشتر) از RainLoop Webmail نیاز به پرداخت حق اشتراک دارد. - TYPE_PREMIUM_LIFETIME: "مادام العمر" - LABEL_SUB_EXPIRES: "انقضای حق اشتراک" - BUTTON_ACTIVATE: "فعال‌کردن حق اشتراک این دامنه" - BUTTON_PURCHASE: "خرید" - BUTTON_TRIAL: "آزمایشی" - TAB_ABOUT: - LEGEND_ABOUT: "درباره" - LABEL_TAG_HINT: "یک رابط کاربری پست الکترونیک ساده، پیشرفته و سریع" - LABEL_ALL_RIGHTS_RESERVED: "همه حقوق محفوظ هست" - HINT_READ_CHANGE_LOG: "فایل وقایع را قبل از بروزرسانی بخوانید." - HINT_IS_UP_TO_DATE: "RainLoop بروز هست" - HTML_NEW_VERSION: "نسخه %VERSION% در دسترس هست" - LABEL_UPDATING: "در حال بروزرسانی" - LABEL_CHECKING: "چک کردن برای بروزرسانی" - BUTTON_UPDATE: "بروزرسانی" - BUTTON_DOWNLOAD: "دریافت" - BUTTON_CHANGELOG: "تغییرات" - POPUPS_ACTIVATE: - TITLE_ACTIVATE: "حق اشتراک فعال شده است؟" - TITLE_ACTIVATION: "در حال فعال‌سازی..." - LABEL_DOMAIN: "دامن" - LABEL_SUB_KEY: "کلید حق اشتراک" - BUTTON_ACTIVATE: "فعال‌سازی" - LABEL_ACTIVATED: "فعال شده است" - ERROR_INVALID_SUBS_KEY: "کلید حق اشتراک نامعتبر" - SUBS_KEY_ACTIVATED: "کلید حق اشتراک با موفقیت فعال شد" - HTML_DESC: | - بعد از فعال‌سازی، سطح بالاتر اشتراک برای %DOMAIN% گسترش خواهد یافت. -
- توجه کنید که کلید اشتراک فقط برای یک دامنه می‌تواند فعال شود. -

- زمانی که شروع کردید، فرآیند فعال‌سازی قابل انصراف نیست. - POPUPS_DOMAIN_ALIAS: - TITLE_ADD_DOMAIN_ALIAS: "اضافه کردن نام مستعار" - LABEL_ALIAS: "مستعار" - LABEL_DOMAIN: "دامنه" - BUTTON_CLOSE: "بستن" - BUTTON_ADD: "اضافه‌کردن" - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "اضافه‌کردن دامنه" - TITLE_ADD_DOMAIN_WITH_NAME: "اضافه کردن دامنه \"%NAME%\"" - TITLE_EDIT_DOMAIN: "ویرایش دامنه \"%NAME%\"" - LABEL_NAME: "نام" - NAME_HELPER: "پشتیبانی از wildcard" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "سرور" - LABEL_PORT: "پورت" - LABEL_SECURE: "امن" - LABEL_WHITE_LIST: "لیست سفید" - SECURE_OPTION_NONE: "هیچ‌کدام" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "STARTTLS" - LABEL_ALLOW_SIEVE_SCRIPTS: "اجازه به اجرا‌شونده‌های sieve" - LABEL_ALLOW_USER_SCRIPT: "اجازه به اجرا‌شونده‌های سفارشی کاربر" - LABEL_USE_SHORT_LOGIN: "استفاده از ورود کوتاه بدون دامنه" - LABEL_USE_AUTH: "استفاده از احراز هویت" - LABEL_USE_PHP_MAIL: "استفاده از تابع mail() زبان PHP" - BUTTON_TEST: "تست" - BUTTON_WHITE_LIST: "لیست سفید" - BUTTON_SIEVE_CONFIGURATION: "پیکربندی Sieve" - BUTTON_BACK_TO_IMAP: "برگشت به تنظیمات IMAP" - BUTTON_BACK: "برگشت" - BUTTON_CLOSE: "بستن" - BUTTON_ADD: "اضافه‌کردن" - BUTTON_UPDATE: "بروزرسانی" - NEW_DOMAIN_DESC: "این تنظیمات دامنه به شما اجازه کار کردن
با پست الکترونیک %NAME% را می‌دهد." - WHITE_LIST_ALERT: | - لیستی از دامنه‌ها که کاربران وب‌میل می‌توانند به آنها دسترسی داشته باشند. - از فاصله جهت جدا کردن استفاده کنید. - POPUPS_PLUGIN: - TITLE_PLUGIN: "افزونه" - DESC_NOTHING_TO_CONFIGURE: "چیزی برای پیکربندی نیست" - BUTTON_CLOSE: "بستن" - BUTTON_SAVE: "ذخیره" - TOOLTIP_ABOUT_TITLE: "درباره" - POPUPS_ASK: - DESC_WANT_CLOSE_THIS_WINDOW: "آیا شما از بستن این پنجره اطمینان دارید؟" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "زبان خود را انتخاب کنید" - HINTS: - BETA: "آزمایشی" - UNSTABLE: "ناپایدار" - WARNING: "هشدار!" - NOT_SUPPORTED: "پشتیبانی نمی‌شود" - REQUIRES_PHP_54: "به نسخه PHP 5.4 و بالاتر نیاز دارید" - ERRORS: - DOMAIN_ALREADY_EXISTS: "دامنه وجود دارد" - UNKNOWN_ERROR: "خطای نامشخص" - NOTIFICATIONS: - INVALID_TOKEN: "توکن نامعتبر" - AUTH_ERROR: "احراز هویت انجام نشد" - ACCESS_ERROR: "خطا در دسترسی" - CONNECTION_ERROR: "عدم اتصال به سرور" - CAPTCHA_ERROR: "تصویر اشتباه وارد شده است" - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - این شناسه اجتماعی برای هیچ کاربر پست الکترونیکی تاکنون تخصیص داده نشده است. - با استفاده از اعتبار کاربر پست الکترونیک خود وارد شوید و سپس این ویژگی را - در تنظیمات کاربر خود فعال کنید. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - این شناسه اجتماعی برای هیچ کاربر پست الکترونیکی تاکنون تخصیص داده نشده است. - با استفاده از اعتبار کاربر پست الکترونیک خود وارد شوید و سپس این ویژگی را - در تنظیمات کاربر خود فعال کنید. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - این شناسه اجتماعی برای هیچ کاربر پست الکترونیکی تاکنون تخصیص داده نشده است. - با استفاده از اعتبار کاربر پست الکترونیک خود وارد شوید و سپس این ویژگی را - در تنظیمات کاربر خود فعال کنید. - DOMAIN_NOT_ALLOWED: "دامنه اجازه داده نشده است" - ACCOUNT_NOT_ALLOWED: "کاربر اجازه داده نشده است" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "اعتبارسنجی دو مرحله‌ای مورد نیاز است" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "خطا در اعتبارسنجی دو مرحله‌ای" - COULD_NOT_SAVE_NEW_PASSWORD: "گذرواژه جدید ذخیره نشد" - CURRENT_PASSWORD_INCORRECT: "گذرواژه فعلی اشتباه است" - NEW_PASSWORD_SHORT: "گذرواژه کوتاه است" - NEW_PASSWORD_WEAK: "گذرواژه بسیار ساده است" - NEW_PASSWORD_FORBIDDENT: "گذرواژه شامل کاراکترهای غیرمجاز است" - CONTACTS_SYNC_ERROR: "همگام‌سازی تماس‌ها با خطا همراه بود" - CANT_GET_MESSAGE_LIST: "امکان دریافت لیست پیام‌ها نیست" - CANT_GET_MESSAGE: "امکان دریافت پیام نیست" - CANT_DELETE_MESSAGE: "امکان حذف پیام نیست" - CANT_MOVE_MESSAGE: "امکان انتقال پیام نیست" - CANT_SAVE_MESSAGE: "امکان ذخیره پیام نیست" - CANT_SEND_MESSAGE: "امکان ارسال پیام نیست" - INVALID_RECIPIENTS: "گیرنده نامعتبر" - CANT_SAVE_FILTERS: "امکان ذخیره فیلترها نیست" - CANT_GET_FILTERS: "امکان دریافت فیلترها نیست" - FILTERS_ARE_NOT_CORRECT: "فیلترها صحیح نیستند" - CANT_CREATE_FOLDER: "امکان ایجاد شاخه وجود ندارد" - CANT_RENAME_FOLDER: "امکان تغییر نام شاخه نیست" - CANT_DELETE_FOLDER: "امکان حذف شاخه نیست" - CANT_DELETE_NON_EMPTY_FOLDER: "امکان حذف شاخه‌ای که خالی نیست وجود ندارد" - CANT_SUBSCRIBE_FOLDER: "امکان اشتراک شاخه نیست" - CANT_UNSUBSCRIBE_FOLDER: "امکان عدم اشتراک شاخه نیست" - CANT_SAVE_SETTINGS: "امکان ذخیره تنظیمات نیست" - CANT_SAVE_PLUGIN_SETTINGS: "امکان ذخیره تنظیمات نیست" - DOMAIN_ALREADY_EXISTS: "دامنه در حال حاضر موجود است" - CANT_INSTALL_PACKAGE: "نصب بسته با خطا همراه بود" - CANT_DELETE_PACKAGE: "حذف بسته با خطا همراه بو" - INVALID_PLUGIN_PACKAGE: "بسته افزونه نامعتبر است" - UNSUPPORTED_PLUGIN_PACKAGE: "بسته افزونه پشتیبانی نمی‌شود" - LICENSING_SERVER_IS_UNAVAILABLE: "سرور مشترک شدن در دسترس نیست" - LICENSING_DOMAIN_EXPIRED: "اشتراک برای این دامنه منقضی شده است" - LICENSING_DOMAIN_BANNED: "اشتراک برای این دامنه مسدود شده است" - DEMO_SEND_MESSAGE_ERROR: "بنابر اهداف امنیتی، این کاربر اجازه ارسال ایمیل به یک ایمیل خارج از دامنه را ندارد!" - DEMO_ACCOUNT_ERROR: "بنابر اهداف امنیتی، این کاربر اجازه انجام این عملیات را ندارد!" - ACCOUNT_ALREADY_EXISTS: "کاربر وجود دارد" - ACCOUNT_DOES_NOT_EXIST: "کاربر وجود ندارد" - MAIL_SERVER_ERROR: "یک خطا در زمان دسترسی به سرویس پست الکترونیک رخ داد" - INVALID_INPUT_ARGUMENT: "پارامترهای ورودی نامعتبر" - UNKNOWN_ERROR: "خطای نامشخص" - STATIC: - BACK_LINK: "بارگذاری مجدد" - DOMAIN_LIST_DESC: "لیستی از دامنه‌های وب‌میل که برای دسترسی مجاز است." - PHP_EXSTENSIONS_ERROR_DESC: "به یک افزونه PHP نیاز دارد که در تنظیمات مربوط به PHP شما وجود ندارد!" - PHP_VERSION_ERROR_DESC: "نسخه PHP شما (%VERSION%) کمتر از حداقل نسخه مورد انتظار 5.3.0 هست!" - NO_SCRIPT_TITLE: "جاوا‌اسکریپت برای این برنامه مورد نیاز است." - NO_SCRIPT_DESC: | - پشتیبانی از جاوااسکریپت در مرورگر شما وجود ندارد. - لطفا پشتیبانی از جاوا‌اسکریپت را در تنظیمات مرورگر خود فعال کنید و مجددا تلاش کنید. - NO_COOKIE_TITLE: "Cookie باید بر روی مرورگر شما جهت استفاده از برنامه فعال باشد." - NO_COOKIE_DESC: | - پشتیبانی از Cookie در مرورگر شما فعال نیست. - لطفا Cookie را در تنظیمات مرورگر خود فعال کنید و مجددا تلاش کنید. - BAD_BROWSER_TITLE: "نسخه مرورگر شما قدیمی است." - BAD_BROWSER_DESC: | - برای استفاده از تمام قابلیتهای برنامه، - یکی از مرورگرهای زیر را دریافت و نصب کنید. diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fi_FI.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fi_FI.yml deleted file mode 100755 index fe6852c8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fi_FI.yml +++ /dev/null @@ -1,322 +0,0 @@ -fi_FI: - LOGIN: - LABEL_LOGIN: "Tunnus" - LABEL_PASSWORD: "Salasana" - BUTTON_LOGIN: "Kirjaudu hallintapaneliin" - TOP_PANEL: - LABEL_PREMIUM: "Premium" - LABEL_ADMIN_PANEL: "Halintapaneli" - TABS_LABELS: - LABEL_GENERAL_NAME: "Yleiset" - LABEL_LOGIN_NAME: "Kirjautuminen" - LABEL_BRANDING_NAME: "Brändäys" - LABEL_CONTACTS_NAME: "Yhteystiedot" - LABEL_DOMAINS_NAME: "Verkkotunnutkset" - LABEL_SECURITY_NAME: "Turvallisuus" - LABEL_INTEGRATION_NAME: "Integroinnit" - LABEL_PLUGINS_NAME: "Pluginit" - LABEL_PACKAGES_NAME: "Paketit" - LABEL_LICENSING_NAME: "Lisensointi" - LABEL_ABOUT_NAME: "Tietoja" - TAB_GENERAL: - LEGEND_INTERFACE: "Käyttöliittymä" - LABEL_LANGUAGE: "Kieli" - LABEL_LANGUAGE_ADMIN: "Kieli (admin)" - LABEL_THEME: "Teema" - LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Salli kielivalinta asetuksissa" - LABEL_ALLOW_THEMES_ON_SETTINGS: "Salli teemavalinta asetuksissa" - LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Salli taustavalinta asetuksissa" - LABEL_SHOW_THUMBNAILS: "Näytä kuvakkeet (liitteet)" - LABEL_ALLOW_GRAVATAR: "Salli Gravatar" - LEGEND_MAIN: "Yleiset" - LABEL_ATTACHMENT_SIZE_LIMIT: "Liitetiedoston kokorajoitus" - LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Salli ylimääräiset tilit" - LABEL_ALLOW_IDENTITIES: "Salli useat identiteetit" - LABEL_ALLOW_TEMPLATES: "Salli mallipohjat" - ALERT_WARNING: "Varoitus!" - HTML_ALERT_WEAK_PASSWORD: | - Sinulla on käytössäsi hallintatunnuksen oletussalasana. -
- Tietoturvasyistä, ole ystävällinen ja - vaihda - salasanasi nyt. - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "Kirjautumissivu" - LABEL_DEFAULT_DOMAIN: "Oletus domain" - LABEL_DETERMINE_USER_DOMAIN: "Koita päätellä käyttäjän domain" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Salli kielivalinta kirjautumissivulla" - LABEL_DETERMINE_USER_LANGUAGE: "Koita päätellä käyttäjän kieli" - TAB_BRANDING: - LEGEND_BRANDING: "Brändäys" - LABEL_PAGE_TITLE: "Sivun otsikko" - LABEL_LOADING_DESCRIPTION: "Ladataan kuvausta" - LABEL_FAVICON_URL: "Favicon" - LEGEND_LOGIN: "Kirjaudu" - LABEL_LOGIN_LOGO: "Logo" - LABEL_LOGIN_DESCRIPTION: "Kuvaus" - LABEL_LOGIN_BACKGROUND: "Tausta" - LABEL_LOGIN_CUSTOM_CSS: "Muokattu CSS" - LABEL_LOGIN_SHOW_POWERED_LINK: "Näytä \"Powered by RainLoop\" linkki" - LEGEND_USER: "Käyttäjä" - LABEL_USER_LOGO: "Logo" - LABEL_USER_LOGO_TITLE: "Logo otsikko" - LABEL_USER_LOGO_MESSAGE: "Logo (Viestinäkymä)" - LABEL_USER_CUSTOM_CSS: "Muokattu CSS" - LEGEND_WELCOME_PAGE: "Tervetuloa sivu" - LABEL_WELCOME_PAGE_TITLE: "Otsikko" - LABEL_WELCOME_PAGE_URL: "URL" - LABEL_WELCOME_PAGE_DISPLAY: "Näytä" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "Ei mitään" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Kerran" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Aina" - HTML_ALERT_PREMIUM: "Tämä toiminto on saatavissa vain Premium tilaajille." - TAB_CONTACTS: - LEGEND_CONTACTS: "Yhteystiedot" - LEGEND_STORAGE: "Tallennus (PDO)" - LABEL_ENABLE_CONTACTS: "Salli yhteystiedot" - LABEL_ALLOW_SYNC: "Salli yhteystietojen synkronointi (ulkoisella CardDAV palvelimella)" - LABEL_STORAGE_TYPE: "Tyyppi" - LABEL_STORAGE_DSN: "Dsn" - LABEL_STORAGE_USER: "Käyttäjä" - LABEL_STORAGE_PASSWORD: "Salasana" - BUTTON_TEST: "Testi" - ALERT_NOTICE: "Huomio!" - HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Älä käytä tätä tietokantatyyppiä suurella määrällä aktiivisia käyttäjiä." - HTML_ALERT_DOES_NOT_SUPPORTED: | - Järjestelmäsi ei tue yhteystietoja. -
- Asenna tai aktivoi PDO (SQLite / MySQL / PostgreSQL) lisäosa palvelimellasi. - TAB_DOMAINS: - LEGEND_DOMAINS: "Domainit" - BUTTON_ADD_DOMAIN: "Lisää domain" - BUTTON_ADD_ALIAS: "Lisää alias" - DELETE_ARE_YOU_SURE: "Oletko varma?" - HTML_DOMAINS_HELPER: | - Lista domaineista joilla webmaililla on pääsy. -
- Klikkaa nimeä konfiguroidaksesi domain. - TAB_SECURITY: - LEGEND_SECURITY: "Tietoturva" - LABEL_ALLOW_TWO_STEP: "Salli 2 vaiheinen todentaminen" - LABEL_FORCE_TWO_STEP: "Pakota 2 vaiheinen todentaminen" - LABEL_USE_IMAGE_PROXY: "Käytä paikallista proxya ulkoisille kuville." - LABEL_ALLOW_OPEN_PGP: "Salli OpenPGP" - LABEL_SHOW_PHP_INFO: "Näytä PHP tiedot" - LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Hallintapaneeli kirjautumistiedot" - LABEL_CURRENT_PASSWORD: "Nykyinen salasana" - LABEL_NEW_LOGIN: "Uusi tunnus" - LABEL_NEW_PASSWORD: "Uusi salasana" - LABEL_REPEAT_PASSWORD: "Toista" - BUTTON_UPDATE_PASSWORD: "Päivitä salasana" - LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: "Vaadi SSL sertifikaatin varmistus (IMAP/SMTP)" - LABEL_ALLOW_SELF_SIGNED: "Salli itse-allekirjoitetut sertifikaatit" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "Google" - LABEL_ENABLE_GOOGLE: "Aktivoi Google integrointi" - LABEL_GOOGLE_AUTH: "Valtuutus" - LABEL_GOOGLE_DRIVE: "Google Drive integraatio" - LABEL_GOOGLE_PREVIEW: "Google esikatselun integrointi (MS Word, Excel ja PowerPoint)" - LABEL_GOOGLE_CLIENT_ID: "Asiakkaan ID" - LABEL_GOOGLE_CLIENT_SECRET: "Asiakkaan salasana" - LABEL_GOOGLE_API_KEY: "API avain" - HINT_GOOGLE_API_KEY: "Vaaditaan Google Drive File Picker:lle" - LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "Aktivoi Facebook integrointi (Tunnistus)" - LABEL_FACEBOOK_APP_ID: "App ID" - LABEL_FACEBOOK_APP_SECRET: "App secret" - LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "Aktivoi Twitter integrointi (Tunnistus)" - LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" - LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" - LEGEND_DROPBOX: "Dropbox" - LABEL_ENABLE_DROPBOX: "Aktivoi Dropbox integrointi" - LABEL_DROPBOX_API_KEY: "Api Key" - TOP_ALERT: "Yksityiskohtaiset tiedot some-integraatioista löytyy täältä" - TAB_PLUGINS: - LEGEND_PLUGINS: "Pluginit" - LABEL_ENABLE_PLUGINS: "Aktivoi pluginit" - ALERT_NO_PLUGINS: "Yhtään pluginia ei ole asennettu" - LINK_INSTALL_NEW: "Asenna tästä uusi!" - HINT_CLICK_NAME: "Klikkaa nimeä konfiguroidaksesi plugin" - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "Voidaan päivittää" - LEGEND_AVAILABLE_FOR_INSTALLATION: "Voidaan asentaa" - LEGEND_INSTALLED_PACKAGES: "Aennetut pakkaukset" - ALERT_CANNOT_ACCESS_REPOSITORY: "Pääsy varastoon ei toimi tällä hetkellä." - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "Sinun domain" - LABEL_VERSION: "Versio" - LABEL_CHECKING: "Tarkastaa" - TYPE_BASIC_HINT: "Tämä domain ei ole lisensoitu kaupalliseen käyttöön (lisäominaisuuksilla)." - TYPE_BASIC_HINT_2: "Tätä verkkotunnusta ei voi lisensoida." - HTML_ALERT_TOP_1: "RainLoop Webmail on lisensoitu" - HTML_ALERT_TOP_2: "Voit käyttää ilmaiseksi omissa projekteissasi. " - HTML_ALERT_TOP_3: | - RainLoop Webmailin kaupallinen käyttö (lisäominaisuuksilla) vaatii - tilauksen. - TYPE_PREMIUM_LIFETIME: "Kesto" - LABEL_SUB_EXPIRES: "Tilaus päättyy" - BUTTON_ACTIVATE: "Aktivoi Tilaus Avain tälle verkkotunnukselle" - BUTTON_PURCHASE: "Osta" - BUTTON_TRIAL: "Koeaika" - TAB_ABOUT: - LEGEND_ABOUT: "Tietoja" - LABEL_TAG_HINT: "Helppo, moderni ja nopea web-pohjainen sähköpostiohjelma" - LABEL_ALL_RIGHTS_RESERVED: "Kaikki oikeudet pidätetään." - HINT_READ_CHANGE_LOG: "Lue muutosloki ennen päivitystä." - HINT_IS_UP_TO_DATE: "RainLoop on ajan tasalla." - HTML_NEW_VERSION: "Uusi versio %VERSION% on saatavissa." - LABEL_UPDATING: "Päivitetään" - LABEL_CHECKING: "Tarkastetaan päivityksiä" - BUTTON_UPDATE: "Päivitä" - BUTTON_DOWNLOAD: "Lataa" - BUTTON_CHANGELOG: "Muutosloki" - POPUPS_ACTIVATE: - TITLE_ACTIVATE: "Aktivoi tilausavain?" - TITLE_ACTIVATION: "Aktivoidaan..." - LABEL_DOMAIN: "Verkkotunnus" - LABEL_SUB_KEY: "Tilaus avain" - BUTTON_ACTIVATE: "Aktivoi" - LABEL_ACTIVATED: "Aktivoitu" - ERROR_INVALID_SUBS_KEY: "Väärä tilausavain" - SUBS_KEY_ACTIVATED: "Tilausavain aktivoitu onnistuneesti" - HTML_DESC: | - Aktivoinninn jälkeen tilaus %DOMAIN% verkkotunnukselle jatkuu. -
- Huomioi että tilausavain voidaan aktivoida vain yhdelle verkkotunnukselle. -

- Aloituksen jälkeen aktivointia ei voi keskeyttää tai peruuttaa. - POPUPS_DOMAIN_ALIAS: - TITLE_ADD_DOMAIN_ALIAS: "Lisää Alias" - LABEL_ALIAS: "Alias" - LABEL_DOMAIN: "Verkkotunnus" - BUTTON_CLOSE: "Sulje" - BUTTON_ADD: "Lisää" - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "Lisää verkkotunnus" - TITLE_ADD_DOMAIN_WITH_NAME: "Lisää verkkotunnus \"%NAME%\"" - TITLE_EDIT_DOMAIN: "Muokkaa verkkotunnusta \"%NAME%\"" - LABEL_NAME: "Nimi" - NAME_HELPER: "wildcard tuettu" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "Palvelin" - LABEL_PORT: "Portti" - LABEL_SECURE: "Secure" - LABEL_WHITE_LIST: "Sallitut Lista" - SECURE_OPTION_NONE: "Ei mitään" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "STARTTLS" - LABEL_ALLOW_SIEVE_SCRIPTS: "Salli sieve skriptit" - LABEL_ALLOW_USER_SCRIPT: "Salli käyttäjän omat skriptit" - LABEL_USE_SHORT_LOGIN: "Käytä lyhyttä kirjautumista" - LABEL_USE_AUTH: "Käytä tunnistautumista" - LABEL_USE_PHP_MAIL: "Käytä php mail() funktiota" - BUTTON_TEST: "Test" - BUTTON_WHITE_LIST: "Sallitut Lista" - BUTTON_SIEVE_CONFIGURATION: "Sieve asetukset" - BUTTON_BACK_TO_IMAP: "Takaisin IMAP asetuksiin" - BUTTON_BACK: "Takaisin" - BUTTON_CLOSE: "Sulje" - BUTTON_ADD: "Lisää" - BUTTON_UPDATE: "Päivitä" - NEW_DOMAIN_DESC: "Tämän verkkotunnuksen asetukset sallivat käyttää
%NAME% säkhöpostiosoitteita." - WHITE_LIST_ALERT: | - Lista domain käyttäjistä joihin webmaililla on oikeus. - Erottele välilyönnillä. - POPUPS_PLUGIN: - TITLE_PLUGIN: "Lisäosa" - DESC_NOTHING_TO_CONFIGURE: "Ei mitään asetettavaa" - BUTTON_CLOSE: "Sulje" - BUTTON_SAVE: "Tallenna" - TOOLTIP_ABOUT_TITLE: "Tietoja" - POPUPS_ASK: - DESC_WANT_CLOSE_THIS_WINDOW: "Haluatko varmasti sulkea tämän ikkunan?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Valitse kieli" - HINTS: - BETA: "beta" - UNSTABLE: "epävakaa" - WARNING: "Varoitus!" - NOT_SUPPORTED: "ei tuettu" - REQUIRES_PHP_54: "Vaatii PHP version 5.4 tai uudemman" - ERRORS: - DOMAIN_ALREADY_EXISTS: "Verkkotunnus on jo olemassa" - UNKNOWN_ERROR: "Tuntematon virhe" - NOTIFICATIONS: - INVALID_TOKEN: "Väärä token" - AUTH_ERROR: "Tunnistautuminen epäonnistui" - ACCESS_ERROR: "Pääsyvirhe" - CONNECTION_ERROR: "Palvelimeen ei saa yhteyttä" - CAPTCHA_ERROR: "Väärä CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Tätä some ID:tä ei ole vielä liitetty mihinkään sähköpostitiliin. Kirjaudu - sähköpostitunnuksilla ja aktivoi tämä ominaisuus tilin asetuksissa. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Tätä some ID:tä ei ole vielä liitetty mihinkään sähköpostitiliin. Kirjaudu - sähköpostitunnuksilla ja aktivoi tämä ominaisuus tilin asetuksissa. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Tätä some ID:tä ei ole vielä liitetty mihinkään sähköpostitiliin. Kirjaudu - sähköpostitunnuksilla ja aktivoi tämä ominaisuus tilin asetuksissa. - DOMAIN_NOT_ALLOWED: "Verkkotunnue ei ole sallittu" - ACCOUNT_NOT_ALLOWED: "Tili ei ole sallittu" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Kaksiosainen tunnistus vaaditaan" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Kaksiosaisen tunnistuksen virhe" - COULD_NOT_SAVE_NEW_PASSWORD: "Uutta salasanaa ei voitu tallettaa" - CURRENT_PASSWORD_INCORRECT: "Nykyinen salasana on väärin" - NEW_PASSWORD_SHORT: "Salasana on liian lyhyt" - NEW_PASSWORD_WEAK: "Salasana on liian helppo" - NEW_PASSWORD_FORBIDDENT: "Salasana sisältää kielettyjä merkkejä" - CONTACTS_SYNC_ERROR: "Yhteystietojen syknronointivirhe" - CANT_GET_MESSAGE_LIST: "Viestilistaa ei voi ladata" - CANT_GET_MESSAGE: "Viestiä ei voi ladata" - CANT_DELETE_MESSAGE: "Viestiä ei voi poistaa" - CANT_MOVE_MESSAGE: "Viestiä ei voi siirtää" - CANT_SAVE_MESSAGE: "Viestiä ei voi tallentaa" - CANT_SEND_MESSAGE: "Viestiä ei voi lähettää" - INVALID_RECIPIENTS: "Virheelinen vastaanottaja" - CANT_SAVE_FILTERS: "Suodatinta ei voi tallentaa" - CANT_GET_FILTERS: "Suodattimia ei voi ladata" - FILTERS_ARE_NOT_CORRECT: "Suodattimissa on virhe" - CANT_CREATE_FOLDER: "Kansiota ei voi luoda" - CANT_RENAME_FOLDER: "Kansiota ei voi uudelleennimetä" - CANT_DELETE_FOLDER: "Kasiota ei voi poistaa" - CANT_DELETE_NON_EMPTY_FOLDER: "Kansio ei ole tyhjä, ei voida poistaa" - CANT_SUBSCRIBE_FOLDER: "Kansiota ei voi tilata" - CANT_UNSUBSCRIBE_FOLDER: "Kansion tilausta ei voi purkaa" - CANT_SAVE_SETTINGS: "Asetuksia ei voida tallentaa" - CANT_SAVE_PLUGIN_SETTINGS: "Asetuksia ei voida tallentaa" - DOMAIN_ALREADY_EXISTS: "Verkkotunnus on jo olemassa" - CANT_INSTALL_PACKAGE: "Paketin asennus epäonnistui" - CANT_DELETE_PACKAGE: "Paketin poisto epäonnistui" - INVALID_PLUGIN_PACKAGE: "Virheellinen lisäosa-paketti" - UNSUPPORTED_PLUGIN_PACKAGE: "Ei tuettu lisäosa-paketti" - LICENSING_SERVER_IS_UNAVAILABLE: "Tilauspalvelimeen ei saa yhteyttä" - LICENSING_DOMAIN_EXPIRED: "Tänä verkkotunnuksen tilaus on päättynyt." - LICENSING_DOMAIN_BANNED: "Tämän verkkotunnuksen tilaus on estetty." - DEMO_SEND_MESSAGE_ERROR: "Turvallisuus syistä tältä tililtä ei saa lähettää sähköposteja ulkoisiin osoitteisiin!" - DEMO_ACCOUNT_ERROR: "Turvallisuus syistä tämä toiminto on estettuy tälle tilille!" - ACCOUNT_ALREADY_EXISTS: "Tili on jo olemassa." - ACCOUNT_DOES_NOT_EXIST: "Tiliä ei ole olemassa" - MAIL_SERVER_ERROR: "Palvelin yhteydessä on tapahtunut virhe" - INVALID_INPUT_ARGUMENT: "Virheellinen syöte" - UNKNOWN_ERROR: "Tuntematon virhe" - STATIC: - BACK_LINK: "Päivitä" - DOMAIN_LIST_DESC: "Lista verkkotunnuksista joihin webmaililla on pääsy." - PHP_EXSTENSIONS_ERROR_DESC: "Vaadittavaa PHP lisäosaa ei ole saatavilla PHP määrittelyissäsi!" - PHP_VERSION_ERROR_DESC: "PHP versiosi (%VERSION%) on alle vaaditun 5.3.0!" - NO_SCRIPT_TITLE: "Javascript vaaditaan tälle sovellukselle." - NO_SCRIPT_DESC: | - Selaimesi ei tue JavaScriptiä. - Salli JavaScript selaimessasi ja yritä uudelleen. - NO_COOKIE_TITLE: "Esvästetuki vaaditaan tässä sovelluksessa." - NO_COOKIE_DESC: | - Selaimesi ei tue evästeitä. - Salli evästeet selaimessasi ja yritä uudelleen. - BAD_BROWSER_TITLE: "Selaimesi on vanhentunut." - BAD_BROWSER_DESC: | - Käyttääksesi kaikki ominaisuuksia - lataa ja asenna jokin näistä selaimista: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fr_FR.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fr_FR.yml deleted file mode 100755 index e4062d83..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/fr_FR.yml +++ /dev/null @@ -1,326 +0,0 @@ -fr_FR: - LOGIN: - LABEL_LOGIN: "Identifiant" - LABEL_PASSWORD: "Mot de passe" - BUTTON_LOGIN: "Se connecter au panneau d'administration" - TOP_PANEL: - LABEL_PREMIUM: "Premium" - LABEL_ADMIN_PANEL: "Panneau d'Administration" - TABS_LABELS: - LABEL_GENERAL_NAME: "Général" - LABEL_LOGIN_NAME: "Identifiant" - LABEL_BRANDING_NAME: "Logo & Marque" - LABEL_CONTACTS_NAME: "Contacts" - LABEL_DOMAINS_NAME: "Domaines" - LABEL_SECURITY_NAME: "Sécurité" - LABEL_INTEGRATION_NAME: "Intégrations" - LABEL_PLUGINS_NAME: "Plugins" - LABEL_PACKAGES_NAME: "Paquets" - LABEL_LICENSING_NAME: "Licences" - LABEL_ABOUT_NAME: "A propos" - TAB_GENERAL: - LEGEND_INTERFACE: "Interface" - LABEL_LANGUAGE: "Langue" - LABEL_LANGUAGE_ADMIN: "Langue (admin)" - LABEL_THEME: "Thème" - LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Permettre la sélection de la langue dans les paramètres" - LABEL_ALLOW_THEMES_ON_SETTINGS: "Permettre la sélection du thème dans les paramètres" - LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Permettre la sélection de l'arrière-plan dans les paramètres" - LABEL_NEW_FOLDER_MOVE: "Nouveau bouton \"déplacer vers le dossier\"" - LABEL_SHOW_THUMBNAILS: "Montrer les miniatures (pièces jointes)" - LABEL_ALLOW_GRAVATAR: "Autoriser Gravatar" - LEGEND_MAIN: "Principal" - LABEL_ATTACHMENT_SIZE_LIMIT: "Taille limite des pièces jointes" - LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Autoriser les comptes supplémentaires" - LABEL_ALLOW_IDENTITIES: "Autoriser les identités multiples" - LABEL_ALLOW_TEMPLATES: "Autoriser les modèles" - ALERT_WARNING: "ATTENTION !" - HTML_ALERT_WEAK_PASSWORD: | - Vous utilisez le mot de passe administrateur par défaut. -
- Pour des raisons de sécurité, veuillez - changer le mot de passe - dès maintenant. - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "Ecran de connexion" - LABEL_DEFAULT_DOMAIN: "Domaine par défaut" - LABEL_DETERMINE_USER_DOMAIN: "Deviner le domaine de l'utilisateur" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Permettre la sélection de la langue sur l'écran de connexion" - LABEL_DETERMINE_USER_LANGUAGE: "Deviner la langue de l'utilisateur" - TAB_BRANDING: - LEGEND_BRANDING: "Logo & Marque" - LABEL_PAGE_TITLE: "Titre de la page" - LABEL_LOADING_DESCRIPTION: "Description pendant le chargement" - LABEL_FAVICON_URL: "Favicon" - LEGEND_LOGIN: "Connexion" - LABEL_LOGIN_LOGO: "Logo" - LABEL_LOGIN_DESCRIPTION: "Description" - LABEL_LOGIN_BACKGROUND: "Arrière-plan" - LABEL_LOGIN_CUSTOM_CSS: "CSS personnalisés" - LABEL_LOGIN_SHOW_POWERED_LINK: "Afficher le lien \"Powered by RainLoop\"" - LEGEND_USER: "Utilisateur" - LABEL_USER_LOGO: "Logo" - LABEL_USER_LOGO_TITLE: "Titre du logo" - LABEL_USER_LOGO_MESSAGE: "Logo (vue message)" - LABEL_USER_CUSTOM_CSS: "CSS personnalisés" - LEGEND_WELCOME_PAGE: "Page d'accueil" - LABEL_WELCOME_PAGE_TITLE: "Titre" - LABEL_WELCOME_PAGE_URL: "URL" - LABEL_WELCOME_PAGE_DISPLAY: "Affichage" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "Aucun" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Une seule fois" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Toujours" - HTML_ALERT_PREMIUM: "Cette fonctionnalité est réservé aux utilisateurs Premium." - TAB_CONTACTS: - LEGEND_CONTACTS: "Contacts" - LEGEND_STORAGE: "Stockage (PDO)" - LABEL_ENABLE_CONTACTS: "Activer les contacts" - LABEL_ALLOW_SYNC: "Autoriser la synchronisation des contacts (avec un serveur CardDAV externe)" - LABEL_STORAGE_TYPE: "Type" - LABEL_STORAGE_DSN: "Dsn" - LABEL_STORAGE_USER: "Utilisateur" - LABEL_STORAGE_PASSWORD: "Mot de passe" - BUTTON_TEST: "Test" - ALERT_NOTICE: "Avis !" - HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "N'utilisez pas ce type de base de données avec un grand nombre d'utilisateurs actifs." - HTML_ALERT_DOES_NOT_SUPPORTED: | - Votre système ne supporte pas les contacts. -
- Vous devez installer ou autoriser l'extension PDO (SQLite / MySQL / PostgreSQL) sur votre serveur. - TAB_DOMAINS: - LEGEND_DOMAINS: "Domaines" - BUTTON_ADD_DOMAIN: "Ajouter un domaine" - BUTTON_ADD_ALIAS: "Ajouter un alias" - DELETE_ARE_YOU_SURE: "Êtes-vous sûr ?" - HTML_DOMAINS_HELPER: | - Liste des domaines autorisés. -
- Cliquez sur le nom pour configurer le domaine. - TAB_SECURITY: - LEGEND_SECURITY: "Sécurité" - LABEL_ALLOW_TWO_STEP: "Autoriser l'authentification en deux étapes" - LABEL_FORCE_TWO_STEP: "Forcer l'authentification en deux étapes" - LABEL_USE_IMAGE_PROXY: "Utiliser un proxy local pour les images externes" - LABEL_ALLOW_OPEN_PGP: "Autoriser OpenPGP" - LABEL_SHOW_PHP_INFO: "Voir les informations PHP" - LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Codes d'accès au panneau d'administration" - LABEL_CURRENT_PASSWORD: "Mot de passe actuel" - LABEL_NEW_LOGIN: "Nouvel identifiant" - LABEL_NEW_PASSWORD: "Nouveau mot de passe" - LABEL_REPEAT_PASSWORD: "Répéter" - BUTTON_UPDATE_PASSWORD: "Changer le mot de passe" - LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: "S'assurer qu'un certificat SSL (IMAP/SMTP) est utilisé" - LABEL_ALLOW_SELF_SIGNED: "Autoriser les certificats auto-signés" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "Google" - LABEL_ENABLE_GOOGLE: "Activer l'intégration Google" - LABEL_GOOGLE_AUTH: "Autorisation" - LABEL_GOOGLE_DRIVE: "Intégration de Google Drive (Panneau de rédaction)" - LABEL_GOOGLE_PREVIEW: "Intégration de Google Viewer (Prévisualisation pour les fichiers Microsoft Word, Excel and PowerPoint)" - LABEL_GOOGLE_CLIENT_ID: "Client ID" - LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" - LABEL_GOOGLE_API_KEY: "Clé API" - HINT_GOOGLE_API_KEY: "Nécessaire pour le sélecteur de fichier de Google Drive" - LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "Activer l'intégration Facebook (Autorisation)" - LABEL_FACEBOOK_APP_ID: "App ID" - LABEL_FACEBOOK_APP_SECRET: "App Secret" - LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "Activer l'intégration Twitter (Autorisation)" - LABEL_TWITTER_CONSUMER_KEY: "Clé client" - LABEL_TWITTER_CONSUMER_SECRET: "Secret client" - LEGEND_DROPBOX: "Dropbox" - LABEL_ENABLE_DROPBOX: "Activer l'intégration Dropbox" - LABEL_DROPBOX_API_KEY: "Clé API" - TOP_ALERT: "Les informations détaillées sur l'intégration des réseaux sociaux se trouve à" - TAB_PLUGINS: - LEGEND_PLUGINS: "Plugins" - LABEL_ENABLE_PLUGINS: "Activer les plugins" - ALERT_NO_PLUGINS: "Aucun plugin n'a été installé." - LINK_INSTALL_NEW: "Cliquez ici pour installer un nouveau plugin !" - HINT_CLICK_NAME: "Cliquez sur le nom pour configurer le plugin." - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "Disponible pour la mise à jour" - LEGEND_AVAILABLE_FOR_INSTALLATION: "Disponible pour l'installation" - LEGEND_INSTALLED_PACKAGES: "Paquets installés" - ALERT_CANNOT_ACCESS_REPOSITORY: "Impossible d'accéder au dépôt pour l'instant." - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "Votre domaine" - LABEL_VERSION: "Version" - LABEL_CHECKING: "Vérification" - TYPE_BASIC_HINT: "Ce domaine ne possède pas de licence pour un usage commercial (avec des fonctionnalités supplémentaires)." - TYPE_BASIC_HINT_2: "Ce domaine ne peut pas obtenir de licence." - HTML_ALERT_TOP_1: "La licence RainLoop Webmail appartient à" - HTML_ALERT_TOP_2: "Vous êtes libre de l'utiliser pour vos projets personnels" - HTML_ALERT_TOP_3: | - L'usage commercial (avec des fonctionnalités supplémentaires) de RainLoop Webmail nécessite une - souscription. - TYPE_PREMIUM_LIFETIME: "A vie" - LABEL_SUB_EXPIRES: "La souscription expire" - BUTTON_ACTIVATE: "Activer une clé de souscription pour ce domaine" - BUTTON_PURCHASE: "Acheter" - BUTTON_TRIAL: "Essai" - TAB_ABOUT: - LEGEND_ABOUT: "A propos" - LABEL_TAG_HINT: "Un client webmail simple, moderne et rapide " - LABEL_ALL_RIGHTS_RESERVED: "Tous droits réservés." - HINT_READ_CHANGE_LOG: "Veuillez lire le journal des modifications avant de faire la mise à jour." - HINT_IS_UP_TO_DATE: "Rainloop est à jour." - HTML_NEW_VERSION: "Une nouvelle version %VERSION% est disponible." - LABEL_UPDATING: "Mise à jour" - LABEL_CHECKING: "Vérification des mises à jour" - BUTTON_UPDATE: "Mettre à jour" - BUTTON_DOWNLOAD: "Télécharger" - BUTTON_CHANGELOG: "Journal des modifications" - POPUPS_ACTIVATE: - TITLE_ACTIVATE: "Activer une clé de souscription ?" - TITLE_ACTIVATION: "Activation..." - LABEL_DOMAIN: "Domaine" - LABEL_SUB_KEY: "Clé de souscription" - BUTTON_ACTIVATE: "Activer" - LABEL_ACTIVATED: "Activé" - ERROR_INVALID_SUBS_KEY: "Clé de souscription invalide" - SUBS_KEY_ACTIVATED: "Activation de la clé de souscription réussie" - HTML_DESC: | - Après l'activation, la souscription premium pour %DOMAIN% va être prolongée. -
- Notez que la clé de souscription ne peut être activée que pour un seul domaine. -

- Une fois lancé, le processus d'activation ne peut pas être annulé ou abandonné. - POPUPS_DOMAIN_ALIAS: - TITLE_ADD_DOMAIN_ALIAS: "Ajouter un alias" - LABEL_ALIAS: "Alias" - LABEL_DOMAIN: "Domaine" - BUTTON_CLOSE: "Fermer" - BUTTON_ADD: "Ajouter" - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "Ajouter un domaine" - TITLE_ADD_DOMAIN_WITH_NAME: "Ajouter le domaine \"%NAME%\"" - TITLE_EDIT_DOMAIN: "Modifier le domaine \"%NAME%\"" - LABEL_NAME: "Nom" - NAME_HELPER: "Jokers autorisés" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "Serveur" - LABEL_PORT: "Port" - LABEL_SECURE: "Sécurité" - LABEL_WHITE_LIST: "Liste Blanche" - SECURE_OPTION_NONE: "Aucun" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "STARTTLS" - LABEL_ALLOW_SIEVE_SCRIPTS: "Autoriser les scripts sieve" - LABEL_ALLOW_USER_SCRIPT: "Autoriser les scripts personnels" - LABEL_USE_SHORT_LOGIN: "Utiliser l'identifiant court" - LABEL_USE_AUTH: "Utiliser l'authentification" - LABEL_USE_PHP_MAIL: "Utiliser la fonction mail() de php" - BUTTON_TEST: "Test" - BUTTON_WHITE_LIST: "Liste Blanche" - BUTTON_SIEVE_CONFIGURATION: "Configuration sieve" - BUTTON_BACK_TO_IMAP: "Retour à la configuration IMAP" - BUTTON_BACK: "Retour" - BUTTON_CLOSE: "Fermer" - BUTTON_ADD: "Ajouter" - BUTTON_UPDATE: "Modifier" - NEW_DOMAIN_DESC: "Cette configuration de domaine vous permettra de travailler
avec %NAME% dans les adresses électroniques." - WHITE_LIST_ALERT: | - Liste des utilisateurs du domaine auxquels le webmail est autorisé à accéder. - Utilisez un espace comme séparateur. - POPUPS_PLUGIN: - TITLE_PLUGIN: "Plugin" - DESC_NOTHING_TO_CONFIGURE: "Rien à configurer" - BUTTON_CLOSE: "Fermer" - BUTTON_SAVE: "Enregistrer" - TOOLTIP_ABOUT_TITLE: "A propos" - POPUPS_ASK: - DESC_WANT_CLOSE_THIS_WINDOW: "Êtes-vous sûr de vouloir fermer cette fenêtre ?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Choisir la langue" - HINTS: - BETA: "bêta" - UNSTABLE: "instable" - WARNING: "ATTENTION !" - NOT_SUPPORTED: "non supporté" - REQUIRES_PHP_54: "nécessite PHP 5.4 ou supérieur" - ERRORS: - DOMAIN_ALREADY_EXISTS: "Le domaine existe déjà" - UNKNOWN_ERROR: "Erreur inconnue" - NOTIFICATIONS: - INVALID_TOKEN: "Jeton invalide" - AUTH_ERROR: "L'authentification a échoué" - ACCESS_ERROR: "Erreur d'accès" - CONNECTION_ERROR: "Serveur injoignable" - CAPTCHA_ERROR: "CAPTCHA incorrect." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Cet ID social n'est pas encore assigné à une adresse email. Connectez-vous - en utilisant les informations d'identification du courrier électronique et - activez cette fonctionnalité dans les paramètres de votre compte. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Cet ID social n'est pas encore assigné à une adresse email. Connectez-vous - en utilisant les informations d'identification du courrier électronique et - activez cette fonctionnalité dans les paramètres de votre compte. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Cet ID social n'est pas encore assigné à une adresse email. Connectez-vous - en utilisant les informations d'identification du courrier électronique et - activez cette fonctionnalité dans les paramètres de votre compte. - DOMAIN_NOT_ALLOWED: "Ce domaine n'est pas autorisé" - ACCOUNT_NOT_ALLOWED: "Ce compte n'est pas autorisé" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Double authentification requise" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Erreur lors de la double authentification" - COULD_NOT_SAVE_NEW_PASSWORD: "Impossible d'enregistrer le nouveau mot de passe" - CURRENT_PASSWORD_INCORRECT: "Le mot de passe actuel est incorrect" - NEW_PASSWORD_SHORT: "Le mot de passe est trop court" - NEW_PASSWORD_WEAK: "Le mot de passe n'est pas assez fort" - NEW_PASSWORD_FORBIDDENT: "Le mot de passe contient des caractères invalides" - CONTACTS_SYNC_ERROR: "Erreur de synchronisation des contacts" - CANT_GET_MESSAGE_LIST: "Impossible d'obtenir la liste des messages" - CANT_GET_MESSAGE: "Impossible d'obtenir le message" - CANT_DELETE_MESSAGE: "Impossible de supprimer le message" - CANT_MOVE_MESSAGE: "Impossible de déplacer le message" - CANT_SAVE_MESSAGE: "Impossible d'enregistrer le message" - CANT_SEND_MESSAGE: "Impossible d'envoyer le message" - INVALID_RECIPIENTS: "Destinataires invalides" - CANT_SAVE_FILTERS: "Impossible d'enregistrer les filtres" - CANT_GET_FILTERS: "Impossible d'obtenir les filtres" - FILTERS_ARE_NOT_CORRECT: "Les filtres ne sont pas corrects" - CANT_CREATE_FOLDER: "Impossible de créer le dossier" - CANT_RENAME_FOLDER: "Impossible de renommer le dossier" - CANT_DELETE_FOLDER: "Impossible de supprimer le dossier" - CANT_DELETE_NON_EMPTY_FOLDER: "Impossible de supprimer un dossier non vide" - CANT_SUBSCRIBE_FOLDER: "Impossible de s'abonner au dossier" - CANT_UNSUBSCRIBE_FOLDER: "Impossible de se désabonner du dossier" - CANT_SAVE_SETTINGS: "Vous ne pouvez pas enregistrer les paramètres" - CANT_SAVE_PLUGIN_SETTINGS: "Vous ne pouvez pas enregistrer les paramètres" - DOMAIN_ALREADY_EXISTS: "Le domaine existe déjà" - CANT_INSTALL_PACKAGE: "Impossible d'installer le paquet" - CANT_DELETE_PACKAGE: "Impossible de supprimer le paquet" - INVALID_PLUGIN_PACKAGE: "Ce plugin est invalide" - UNSUPPORTED_PLUGIN_PACKAGE: "Ce plugin n'est pas supporté" - LICENSING_SERVER_IS_UNAVAILABLE: "Le serveur d'abonnement est inaccessible" - LICENSING_DOMAIN_EXPIRED: "L'abonnement de ce domaine a expiré." - LICENSING_DOMAIN_BANNED: "L'abonnement pour ce domaine est interdit." - DEMO_SEND_MESSAGE_ERROR: "Pour des raisons de sécurité, ce compte de démonstration n'est pas autorisé à envoyer des messages à des adresses e-mail externes !" - DEMO_ACCOUNT_ERROR: "Pour des raisons de sécurité, ce compte n'est pas autorisé à faire cette action !" - ACCOUNT_ALREADY_EXISTS: "Ce compte existe déjà" - ACCOUNT_DOES_NOT_EXIST: "Ce compte n'existe pas" - MAIL_SERVER_ERROR: "Une erreur est survenue lors de l'accès au serveur de messagerie" - INVALID_INPUT_ARGUMENT: "Argument invalide" - UNKNOWN_ERROR: "Erreur inconnue" - STATIC: - BACK_LINK: "Recharger" - DOMAIN_LIST_DESC: "Liste des domaines autorisés." - PHP_EXSTENSIONS_ERROR_DESC: "Les extensions PHP nécessaires ne sont pas disponibles dans votre configuration de PHP !" - PHP_VERSION_ERROR_DESC: "Votre version de PHP (% VERSION%) est inférieure au minimum requis 5.3.0!" - NO_SCRIPT_TITLE: "JavaScript est nécessaire pour cette application." - NO_SCRIPT_DESC: | - Le support de JavaScript n'est pas disponible dans votre navigateur. - Veuillez activer le support de JavaScript dans les paramètres de votre navigateur et réessayer. - NO_COOKIE_TITLE: "Le support des cookies est nécessaire pour cette application." - NO_COOKIE_DESC: | - Le support des cookies n'est pas disponible dans votre navigateur. - Veuillez activer le support des cookies dans les paramètres de votre navigateur et réessayer. - BAD_BROWSER_TITLE: "Votre navigateur n'est pas à jour." - BAD_BROWSER_DESC: | - Pour utiliser toutes les fonctionnalités de l'application, - téléchargez et installez l'un de ces navigateurs : diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/hu_HU.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/hu_HU.yml deleted file mode 100755 index df08e6c5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/hu_HU.yml +++ /dev/null @@ -1,322 +0,0 @@ -hu_HU: - LOGIN: - LABEL_LOGIN: "Belépés" - LABEL_PASSWORD: "Jelszó" - BUTTON_LOGIN: "Bejelentkezés az admin felületre" - TOP_PANEL: - LABEL_PREMIUM: "Prémuim" - LABEL_ADMIN_PANEL: "Adminisztrációs felület" - TABS_LABELS: - LABEL_GENERAL_NAME: "Általános" - LABEL_LOGIN_NAME: "Belépés" - LABEL_BRANDING_NAME: "Arculat" - LABEL_CONTACTS_NAME: "Névjegyek" - LABEL_DOMAINS_NAME: "Domainek" - LABEL_SECURITY_NAME: "Biztonság" - LABEL_INTEGRATION_NAME: "Integrációk" - LABEL_PLUGINS_NAME: "Beépülők" - LABEL_PACKAGES_NAME: "Csomagok" - LABEL_LICENSING_NAME: "Licencelés" - LABEL_ABOUT_NAME: "Névjegy" - TAB_GENERAL: - LEGEND_INTERFACE: "Felület" - LABEL_LANGUAGE: "Nyelv" - LABEL_LANGUAGE_ADMIN: "Nyelv (admin)" - LABEL_THEME: "Téma" - LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Nyelv választás engedélyezés a beállításoknál" - LABEL_ALLOW_THEMES_ON_SETTINGS: "Téma választás engedélyezés a beállításoknál" - LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Háttér választás engedélyezés a beállításoknál" - LABEL_NEW_FOLDER_MOVE: "Új \"áthelyezés mappába\" gomb" - LABEL_SHOW_THUMBNAILS: "Előnézetek megjelenítése (mellékletek)" - LABEL_ALLOW_GRAVATAR: "Gravatar engedélyezés" - LEGEND_MAIN: "Fontos" - LABEL_ATTACHMENT_SIZE_LIMIT: "Melléklet méret korlát" - LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "További fiókok engedélyezése" - LABEL_ALLOW_IDENTITIES: "Több identitás engedélyezése" - LABEL_ALLOW_TEMPLATES: "Sablonok engedélyezése" - ALERT_WARNING: "Figyelmeztetés!" - HTML_ALERT_WEAK_PASSWORD: | - Az alapértelmezett admin jelszót használod -
- Biztonsági okokból kérlek - változtasd meg - a jelszót valami másra! - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "Bejelentkező képernyő" - LABEL_DEFAULT_DOMAIN: "Alapértelmezett domain" - LABEL_DETERMINE_USER_DOMAIN: "Próbálja megállapítani a felhasználó domainjét" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Nyel választás engedélyezése a bejelentkező képernyőn" - LABEL_DETERMINE_USER_LANGUAGE: "Próbálja megállapítani a felhasználó nyelvét" - TAB_BRANDING: - LEGEND_BRANDING: "Arculat" - LABEL_PAGE_TITLE: "Oldal címe" - LABEL_LOADING_DESCRIPTION: "Betöltés leírás" - LABEL_FAVICON_URL: "Favicon" - LEGEND_LOGIN: "Belépés" - LABEL_LOGIN_LOGO: "Logo" - LABEL_LOGIN_DESCRIPTION: "Leírás" - LABEL_LOGIN_BACKGROUND: "Háttér" - LABEL_LOGIN_CUSTOM_CSS: "Saját CSS" - LABEL_LOGIN_SHOW_POWERED_LINK: "\"Powered by RainLoop\" link megjelenítése" - LEGEND_USER: "Felhasználó" - LABEL_USER_LOGO: "Logo" - LABEL_USER_LOGO_TITLE: "Logo cím" - LABEL_USER_LOGO_MESSAGE: "Logo (üzenet nézet)" - LABEL_USER_CUSTOM_CSS: "Saját CSS" - LEGEND_WELCOME_PAGE: "Üdvözlő oldal" - LABEL_WELCOME_PAGE_TITLE: "Cím" - LABEL_WELCOME_PAGE_URL: "URL" - LABEL_WELCOME_PAGE_DISPLAY: "Megjelenítés" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "Semmi" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Egyszer" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Mindig" - HTML_ALERT_PREMIUM: "Ez a funkció csak a Prémium előfizetők számára érhető el." - TAB_CONTACTS: - LEGEND_CONTACTS: "Névjegyek" - LEGEND_STORAGE: "Tárhely (PDO)" - LABEL_ENABLE_CONTACTS: "Címtár engedélyezése" - LABEL_ALLOW_SYNC: "Címtár szinkronizálás engedélyezése (külső CardDAV szerverrel)" - LABEL_STORAGE_TYPE: "Típus" - LABEL_STORAGE_DSN: "DSN" - LABEL_STORAGE_USER: "Felhasználó" - LABEL_STORAGE_PASSWORD: "Jelszó" - BUTTON_TEST: "Teszt" - ALERT_NOTICE: "Megjegyzés!" - HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Ne használd ezt az adatbázis típust nagy számú aktív felhasználóval." - HTML_ALERT_DOES_NOT_SUPPORTED: | - A rendszer nem támogatja a címtárat. -
- Telepítened vagy engedélyezned kell egy PDO (SQLite / MySQL / PostgreSQL) kiterjesztést a szervereden. - TAB_DOMAINS: - LEGEND_DOMAINS: "Domainek" - BUTTON_ADD_DOMAIN: "Domain hozzáadás" - BUTTON_ADD_ALIAS: "Álnév hozzáadás" - DELETE_ARE_YOU_SURE: "Biztos vagy benne?" - HTML_DOMAINS_HELPER: | - Hozzáféréshez engedélyezett domainek listája: -
- A domain beállításához kattints a névre. - TAB_SECURITY: - LEGEND_SECURITY: "Biztonság" - LABEL_ALLOW_TWO_STEP: "2 lépcsős hitelesítés engedélyezése" - LABEL_FORCE_TWO_STEP: "2 lépcsős hitelesítés kényszerítése" - LABEL_USE_IMAGE_PROXY: "Helyi proxy használata a külső képekhez" - LABEL_ALLOW_OPEN_PGP: "OpenPGP engedélyezése" - LABEL_SHOW_PHP_INFO: "PHP információ megjelenítése" - LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Admin panel hozzáférés hitelesítés" - LABEL_CURRENT_PASSWORD: "Jelenlegi jelszó" - LABEL_NEW_LOGIN: "Új felhasználó" - LABEL_NEW_PASSWORD: "Új jelszó" - LABEL_REPEAT_PASSWORD: "Újra" - BUTTON_UPDATE_PASSWORD: "Jelszó frissítés" - LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: "A használt (IMAP/SMTP) tanúsítvány ellenőrzés megkövetelése" - LABEL_ALLOW_SELF_SIGNED: "Saját aláírt tanúsítványok engedélyezése" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "Google" - LABEL_ENABLE_GOOGLE: "Google integráció engedélyezése" - LABEL_GOOGLE_AUTH: "Hitelesítés" - LABEL_GOOGLE_DRIVE: "Google Drive integráció (levélírás nézet)" - LABEL_GOOGLE_PREVIEW: "Google Viewer integráció (Microsoft Word, Excel és PowerPoint fájlok előnézetéhez)" - LABEL_GOOGLE_CLIENT_ID: "Kliens ID" - LABEL_GOOGLE_CLIENT_SECRET: "Kliens titok" - LABEL_GOOGLE_API_KEY: "API kulcs" - HINT_GOOGLE_API_KEY: "Google Drive fájl választóhoz szükséges" - LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "Facebook integráció engedélyezése (hitelesítés)" - LABEL_FACEBOOK_APP_ID: "Alkalmazás ID" - LABEL_FACEBOOK_APP_SECRET: "Alkalmazás titok" - LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "Twitter integráció engedélyezése (hitelesítés)" - LABEL_TWITTER_CONSUMER_KEY: "Consumer kulcs" - LABEL_TWITTER_CONSUMER_SECRET: "Consumer titok" - LEGEND_DROPBOX: "Dropbox" - LABEL_ENABLE_DROPBOX: "Dropbox integráció engedélyezése" - LABEL_DROPBOX_API_KEY: "API kulcs" - TOP_ALERT: "A közösségi integrációról részletes információkat itt találsz:" - TAB_PLUGINS: - LEGEND_PLUGINS: "Beépülők" - LABEL_ENABLE_PLUGINS: "Beépülők engedélyezése" - ALERT_NO_PLUGINS: "Még nincsenek telepítve beépülők." - LINK_INSTALL_NEW: "Új telepítéséhez kattints ide!" - HINT_CLICK_NAME: "A beépülő beállításához kattints a nevére." - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "Frissíthető" - LEGEND_AVAILABLE_FOR_INSTALLATION: "Telepíthető" - LEGEND_INSTALLED_PACKAGES: "Telepített csomagok" - ALERT_CANNOT_ACCESS_REPOSITORY: "Jelenleg nem lehet csatlakozni a tárolóhoz" - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "Domained" - LABEL_VERSION: "Verzió" - LABEL_CHECKING: "Ellenőrzés" - TYPE_BASIC_HINT: "Ez a domain nem licencelt kereskedelmi használatra (hozzáadott funkciókkal)." - TYPE_BASIC_HINT_2: "Ez a domain nem licencelhető." - HTML_ALERT_TOP_1: "RainLoop Webmail licence:" - HTML_ALERT_TOP_2: "Szabadon felhasználható a személyes projektjeidhez." - HTML_ALERT_TOP_3: | - A RainLoop Webmail kereskedelmi használatához (további funkciókkal) előfizetés szükséges. - TYPE_PREMIUM_LIFETIME: "Örökös" - LABEL_SUB_EXPIRES: "Előfizetés lejár" - BUTTON_ACTIVATE: "Előfizetési kulcs aktiválása ehhez a domainhez" - BUTTON_PURCHASE: "Vásárlás" - BUTTON_TRIAL: "Próba" - TAB_ABOUT: - LEGEND_ABOUT: "Névjegy" - LABEL_TAG_HINT: "Egyszerű, modern és gyors webes email kliens" - LABEL_ALL_RIGHTS_RESERVED: "Minden jog fenntartva." - HINT_READ_CHANGE_LOG: "Frissítés előtt kérlek olvasd el a változások listáját." - HINT_IS_UP_TO_DATE: "A RainLoop naprakész." - HTML_NEW_VERSION: "Új verzió érhető el: %VERSION%" - LABEL_UPDATING: "Frissítés" - LABEL_CHECKING: "Frissítések ellenőrzése" - BUTTON_UPDATE: "Frissítés" - BUTTON_DOWNLOAD: "Letöltés" - BUTTON_CHANGELOG: "Változások listája" - POPUPS_ACTIVATE: - TITLE_ACTIVATE: "Előfizetési kulcs aktiválása?" - TITLE_ACTIVATION: "Aktiválás..." - LABEL_DOMAIN: "Domain" - LABEL_SUB_KEY: "Előfizetési kulcs" - BUTTON_ACTIVATE: "Aktivál" - LABEL_ACTIVATED: "Akitválva" - ERROR_INVALID_SUBS_KEY: "Érvénytelen előfizetési kulcs" - SUBS_KEY_ACTIVATED: "Előfizetési kulcs sikeresen aktiválva" - HTML_DESC: | - Aktiválás után a %DOMAIN% prémium előfizetése meg lesz hosszabbítva. -
- Egy előfizetési kulcs csak egy domainhez aktiválható. -

- Miután elindult, az aktiválási folyamat nem szakítható meg vagy vonható vissza. - POPUPS_DOMAIN_ALIAS: - TITLE_ADD_DOMAIN_ALIAS: "Álnév hozzáadás" - LABEL_ALIAS: "Álnév" - LABEL_DOMAIN: "Domain" - BUTTON_CLOSE: "Bezár" - BUTTON_ADD: "Hozzáad" - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "Domain hozzáadás" - TITLE_ADD_DOMAIN_WITH_NAME: "\"%NAME%\" domain hozzáadása" - TITLE_EDIT_DOMAIN: "\"%NAME%\" domain szerkesztése" - LABEL_NAME: "Név" - NAME_HELPER: "helyettesítő karakter használható" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "Szerver" - LABEL_PORT: "Port" - LABEL_SECURE: "Biztonság" - LABEL_WHITE_LIST: "Fehér lista" - SECURE_OPTION_NONE: "Semmi" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "STARTTLS" - LABEL_ALLOW_SIEVE_SCRIPTS: "SIEVE szkriptek engedélyezése" - LABEL_ALLOW_USER_SCRIPT: "Saját felhasználói szkript engedélyezése" - LABEL_USE_SHORT_LOGIN: "Rövid felhasználónév használata" - LABEL_USE_AUTH: "Hitelesítés használata" - LABEL_USE_PHP_MAIL: "A PHP mail() funkció használata" - BUTTON_TEST: "Teszt" - BUTTON_WHITE_LIST: "Fehér lista" - BUTTON_SIEVE_CONFIGURATION: "SIEVE beállítás" - BUTTON_BACK_TO_IMAP: "Vissza az IMAP beállításokhoz" - BUTTON_BACK: "Vissza" - BUTTON_CLOSE: "Bezár" - BUTTON_ADD: "Hozzáad" - BUTTON_UPDATE: "Frissítés" - NEW_DOMAIN_DESC: "Ez a domain konfiguráció lehetővé teszi
a %NAME% email címek használatát." - WHITE_LIST_ALERT: | - Hozzáféréshez engedélyezett domainek listája. - Elválasztáshoz használd a szóközt. - POPUPS_PLUGIN: - TITLE_PLUGIN: "Beépülő" - DESC_NOTHING_TO_CONFIGURE: "Nincs mit beállítani" - BUTTON_CLOSE: "Bezár" - BUTTON_SAVE: "Mentés" - TOOLTIP_ABOUT_TITLE: "Névjegy" - POPUPS_ASK: - DESC_WANT_CLOSE_THIS_WINDOW: "Biztos, hogy be akarod zárni ezt az ablakot?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Válaszd ki a nyelvet" - HINTS: - BETA: "béta" - UNSTABLE: "instabil" - WARNING: "Figyelmeztetés!" - NOT_SUPPORTED: "nem támogatott" - REQUIRES_PHP_54: "PHP 5.4 vagy újabb szükséges" - ERRORS: - DOMAIN_ALREADY_EXISTS: "A domain már létezik" - UNKNOWN_ERROR: "Ismeretlen hiba" - NOTIFICATIONS: - INVALID_TOKEN: "Érvénytelen token" - AUTH_ERROR: "Sikertelen hitelesítés" - ACCESS_ERROR: "Hozzáférési hiba" - CONNECTION_ERROR: "Nem lehet csatlakozni a szerverhez" - CAPTCHA_ERROR: "Helytelen CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Ez a közösségi azonosító még nincs összekapcsolva egy email fiókkal sem. Lépj - be az email fiókba és a beállításoknál engedélyezd ezt a funkciót. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Ez a közösségi azonosító még nincs összekapcsolva egy email fiókkal sem. Lépj - be az email fiókba és a beállításoknál engedélyezd ezt a funkciót. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Ez a közösségi azonosító még nincs összekapcsolva egy email fiókkal sem. Lépj - be az email fiókba és a beállításoknál engedélyezd ezt a funkciót. - DOMAIN_NOT_ALLOWED: "A domain nem engedélyezett" - ACCOUNT_NOT_ALLOWED: "A fiók nem engedélyezett" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Kétlépcsős hitelesítés szükséges" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Kétlépcsős hitelesítés hiba" - COULD_NOT_SAVE_NEW_PASSWORD: "Nem lehet menteni az új jelszót" - CURRENT_PASSWORD_INCORRECT: "A jelenlegi jelszó érvénytelen" - NEW_PASSWORD_SHORT: "A jelszó túl rövid" - NEW_PASSWORD_WEAK: "A jelszó túl könnyű" - NEW_PASSWORD_FORBIDDENT: "A jelszó tiltott karaktereket tartalmaz" - CONTACTS_SYNC_ERROR: "Hiba lépett fel a névjegyek szinkronizálása közben" - CANT_GET_MESSAGE_LIST: "Nem tudom letölteni az üzenetlistát" - CANT_GET_MESSAGE: "Nem tudom letölteni az üzenetet" - CANT_DELETE_MESSAGE: "Nem lehet törölni az üzenetet" - CANT_MOVE_MESSAGE: "Nem lehet áthelyezni az üzenetet" - CANT_SAVE_MESSAGE: "Nem lehet menteni az üzenetet" - CANT_SEND_MESSAGE: "Nem lehet elküldeni az üzenetet" - INVALID_RECIPIENTS: "Érvénytelent címzettek" - CANT_SAVE_FILTERS: "Nem lehet menteni a szűrőket" - CANT_GET_FILTERS: "Nem lehet letölteni a szűrőket" - FILTERS_ARE_NOT_CORRECT: "A szűrők nem megfelelőek" - CANT_CREATE_FOLDER: "Nem lehet létrehozni a mappát" - CANT_RENAME_FOLDER: "Nem lehet átnevezni a mappát" - CANT_DELETE_FOLDER: "Nem lehet törölni a mappát" - CANT_DELETE_NON_EMPTY_FOLDER: "Nem üres mappát nem lehet törölni" - CANT_SUBSCRIBE_FOLDER: "Nem lehet feliratkozni mappára" - CANT_UNSUBSCRIBE_FOLDER: "Nem lehet leiratkozni mappáról" - CANT_SAVE_SETTINGS: "Nem lehet menteni a beállításokat" - CANT_SAVE_PLUGIN_SETTINGS: "Nem lehet menteni a beállításokat" - DOMAIN_ALREADY_EXISTS: "A domain már létezik" - CANT_INSTALL_PACKAGE: "Nem sikerült telepíteni a csomagot" - CANT_DELETE_PACKAGE: "Nem sikerült eltávolítani a csomagot" - INVALID_PLUGIN_PACKAGE: "Érvénytelen beépülő csomag" - UNSUPPORTED_PLUGIN_PACKAGE: "Nem támogatott beépülő csomag" - LICENSING_SERVER_IS_UNAVAILABLE: "A előfizetési szerver nem érhető el" - LICENSING_DOMAIN_EXPIRED: "A domain előfizetése lejárt." - LICENSING_DOMAIN_BANNED: "A domain előfizetése letiltva." - DEMO_SEND_MESSAGE_ERROR: "Biztonsági okokból, ebből a demó fiókból nem lehet külső email címekre üzenetet küldeni." - DEMO_ACCOUNT_ERROR: "Biztonsági okokból, ebből a fiókból nem lehet elvégezni ezt a műveletet!" - ACCOUNT_ALREADY_EXISTS: "A fiók már létezik" - ACCOUNT_DOES_NOT_EXIST: "A fiók nem létezik" - MAIL_SERVER_ERROR: "Hiba történt a levelező szerverhez történő hozzáférés közben" - INVALID_INPUT_ARGUMENT: "Érvénytelen input argumentum" - UNKNOWN_ERROR: "Ismeretlen hiba" - STATIC: - BACK_LINK: "Újratöltés" - DOMAIN_LIST_DESC: "A webmailhez hozzáférhető domainek listája." - PHP_EXSTENSIONS_ERROR_DESC: "Szükséges PHP kiterjesztés nem érhető el a PHP konfigurációdban!" - PHP_VERSION_ERROR_DESC: "A PHP verziód (%VERSION%) kisebb mint a minimálisan szükséges 5.3.0!" - NO_SCRIPT_TITLE: "Az alkalmazáshoz JavaScript szükséges." - NO_SCRIPT_DESC: | - A JavaScript támogatás nem érhető el a böngésződben. - Kérlek engedélyezd böngésződben a JavaScript támogatást, majd próbáld újra. - NO_COOKIE_TITLE: "Az alkalmazáshoz Cookie támogatásra van szükség." - NO_COOKIE_DESC: | - A Cookie támogatás nem érhető el a böngésződben. - Kérlek engedélyezd böngésződben a Cookie támogatást, majd próbáld újra. - BAD_BROWSER_TITLE: "A böngésződ elavult." - BAD_BROWSER_DESC: | - Az alkalmazás összes funkciójának használatához - tölts le és telepítsd az alábbi böngészők egyikét: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/it_IT.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/it_IT.yml deleted file mode 100755 index e5b381f0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/it_IT.yml +++ /dev/null @@ -1,326 +0,0 @@ -it_IT: - LOGIN: - LABEL_LOGIN: "Nome utente" - LABEL_PASSWORD: "Password" - BUTTON_LOGIN: "Accedi all'amministrazione" - TOP_PANEL: - LABEL_PREMIUM: "Premium" - LABEL_ADMIN_PANEL: "Amministrazione" - TABS_LABELS: - LABEL_GENERAL_NAME: "Generali" - LABEL_LOGIN_NAME: "Accesso" - LABEL_BRANDING_NAME: "Personalizzazione" - LABEL_CONTACTS_NAME: "Contatti" - LABEL_DOMAINS_NAME: "Domini" - LABEL_SECURITY_NAME: "Sicurezza" - LABEL_INTEGRATION_NAME: "Integrazioni" - LABEL_PLUGINS_NAME: "Plugin" - LABEL_PACKAGES_NAME: "Pacchetti" - LABEL_LICENSING_NAME: "Licenze" - LABEL_ABOUT_NAME: "Informazioni" - TAB_GENERAL: - LEGEND_INTERFACE: "Interfaccia" - LABEL_LANGUAGE: "Lingua" - LABEL_LANGUAGE_ADMIN: "Lingua (amministrazione)" - LABEL_THEME: "Tema" - LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Permetti di cambiare lingua all'accesso" - LABEL_ALLOW_THEMES_ON_SETTINGS: "Permetti di cambiare tema dalle impostazioni" - LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Permetti di scegliere lo sfondo dalle impostazioni" - LABEL_NEW_FOLDER_MOVE: "Nuovo bottone \"Sposta in\"" - LABEL_SHOW_THUMBNAILS: "Visualizza anteprime degli allegati" - LABEL_ALLOW_GRAVATAR: "Abilita Gravatar" - LEGEND_MAIN: "Principale" - LABEL_ATTACHMENT_SIZE_LIMIT: "Limite di grandezza degli allegati" - LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Permetti di possedere più account" - LABEL_ALLOW_IDENTITIES: "Permetti di registrare identità multiple" - LABEL_ALLOW_TEMPLATES: "Permetti di creare template" - ALERT_WARNING: "Attenzione!" - HTML_ALERT_WEAK_PASSWORD: | - Stai usando la password di amministrazione predefinita. -
- Per ragioni di sicurezza, - cambiala - con una nuova password immediatamente. - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "Schermata di accesso" - LABEL_DEFAULT_DOMAIN: "Dominio predefinito" - LABEL_DETERMINE_USER_DOMAIN: "Prova a determinare il dominio dell'utente" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Permetti di cambiare lingua all'accesso" - LABEL_DETERMINE_USER_LANGUAGE: "Prova a determinare la lingua dell'utente" - TAB_BRANDING: - LEGEND_BRANDING: "Personalizzazione" - LABEL_PAGE_TITLE: "Titolo della pagina" - LABEL_LOADING_DESCRIPTION: "Messaggio di caricamento" - LABEL_FAVICON_URL: "Favicon" - LEGEND_LOGIN: "Pagina di accesso" - LABEL_LOGIN_LOGO: "Logo" - LABEL_LOGIN_DESCRIPTION: "Descrizione" - LABEL_LOGIN_BACKGROUND: "Sfondo" - LABEL_LOGIN_CUSTOM_CSS: "CSS personalizzato" - LABEL_LOGIN_SHOW_POWERED_LINK: "Visualizza il link \"Powered by RainLoop\"" - LEGEND_USER: "Vista utente" - LABEL_USER_LOGO: "Logo" - LABEL_USER_LOGO_TITLE: "Titolo del logo" - LABEL_USER_LOGO_MESSAGE: "Logo (vista del messaggio)" - LABEL_USER_CUSTOM_CSS: "CSS personalizzato" - LEGEND_WELCOME_PAGE: "Pagina di benvenuto" - LABEL_WELCOME_PAGE_TITLE: "Titolo" - LABEL_WELCOME_PAGE_URL: "Indirizzo" - LABEL_WELCOME_PAGE_DISPLAY: "Visualizza" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "Mai" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Solo una volta" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Sempre" - HTML_ALERT_PREMIUM: "Questa funzionalità è disponibile solo per coloro che hanno acquistato una licenza Premium.\n" - TAB_CONTACTS: - LEGEND_CONTACTS: "Contatti" - LEGEND_STORAGE: "Metodo di salvataggio (PDO)" - LABEL_ENABLE_CONTACTS: "Abilita contatti" - LABEL_ALLOW_SYNC: "Abilita la sincronizzazione dei contatti (con un server CardDAV esterno)" - LABEL_STORAGE_TYPE: "Tipo" - LABEL_STORAGE_DSN: "DSN" - LABEL_STORAGE_USER: "Nome utente" - LABEL_STORAGE_PASSWORD: "Password" - BUTTON_TEST: "Verifica dati" - ALERT_NOTICE: "Attenzione!" - HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Non usare questo tipo di database con un alto numero di utenti attivi." - HTML_ALERT_DOES_NOT_SUPPORTED: | - Il tuo server non supporta il salvataggio dei contatti. -
- Devi abilitare l'estensione PDO (SQLite / MySQL / PostgreSQL) sul tuo server. - TAB_DOMAINS: - LEGEND_DOMAINS: "Domini" - BUTTON_ADD_DOMAIN: "Aggiungi dominio" - BUTTON_ADD_ALIAS: "Aggiungi alias" - DELETE_ARE_YOU_SURE: "Ne sei sicuro?" - HTML_DOMAINS_HELPER: | - Lista di domini a cui la webmail è abilitata ad accedere. -
- Clicca su un nome per configurare quel dominio. - TAB_SECURITY: - LEGEND_SECURITY: "Security" - LABEL_ALLOW_TWO_STEP: "Abilita l'autenticazione a due fattori" - LABEL_FORCE_TWO_STEP: "Forza l'autenticazione a due fattori" - LABEL_USE_IMAGE_PROXY: "Usa un proxy locale per le immagini" - LABEL_ALLOW_OPEN_PGP: "Abilita OpenPGP" - LABEL_SHOW_PHP_INFO: "Visualizza informazioni su PHP" - LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Dati di accesso al pannello di controllo" - LABEL_CURRENT_PASSWORD: "Password corrente" - LABEL_NEW_LOGIN: "Nuovo nome utente" - LABEL_NEW_PASSWORD: "Nuova password" - LABEL_REPEAT_PASSWORD: "Ripeti nuova password" - BUTTON_UPDATE_PASSWORD: "Aggiorna password" - LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: "Richiedi verifica dei certificati SSL (IMAP/SMTP)" - LABEL_ALLOW_SELF_SIGNED: "Abilita certificati autofirmati" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "Google" - LABEL_ENABLE_GOOGLE: "Abilita integrazione con Google" - LABEL_GOOGLE_AUTH: "Autenticazione" - LABEL_GOOGLE_DRIVE: "Integrazione con Google Drive (finestra di scrittura)" - LABEL_GOOGLE_PREVIEW: "Integrazione con Google Docs (anteprima per i file di Microsoft Word, Excel e PowerPoint)" - LABEL_GOOGLE_CLIENT_ID: "Client ID" - LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" - LABEL_GOOGLE_API_KEY: "API Key" - HINT_GOOGLE_API_KEY: "Richiesta per la selezione dei file di Google Drive" - LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "Abilita l'integrazione con Facebook (autenticazione)" - LABEL_FACEBOOK_APP_ID: "App ID" - LABEL_FACEBOOK_APP_SECRET: "App Secret" - LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "Abilita l'integrazione con Twitter (autenticazione)" - LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" - LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" - LEGEND_DROPBOX: "Dropbox" - LABEL_ENABLE_DROPBOX: "Abilita l'integrazione con Dropbox" - LABEL_DROPBOX_API_KEY: "API Key" - TOP_ALERT: "Informazioni dettagliate circa l'integrazione con i social network è disponibile su" - TAB_PLUGINS: - LEGEND_PLUGINS: "Plugin" - LABEL_ENABLE_PLUGINS: "Abilita plugin" - ALERT_NO_PLUGINS: "Nessun plugin è stato installato." - LINK_INSTALL_NEW: "Clicca qui per installarne di nuovi!" - HINT_CLICK_NAME: "Clicca sul nome di un plugin per configurarlo." - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "Disponibili per l'aggiornamento" - LEGEND_AVAILABLE_FOR_INSTALLATION: "Disponibili per l'installazione" - LEGEND_INSTALLED_PACKAGES: "Pacchetti installati" - ALERT_CANNOT_ACCESS_REPOSITORY: "Impossibile accedere al repository in questo momento." - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "Il tuo dominio" - LABEL_VERSION: "Licenza" - LABEL_CHECKING: "Controllo in corso..." - TYPE_BASIC_HINT: "Questo dominio non possiede una licenza commerciale (con funzionalità aggiuntive)." - TYPE_BASIC_HINT_2: "Questo dominio non può possedere una licenza." - HTML_ALERT_TOP_1: "RainLoop Webmail è rilasciato sotto la licenza" - HTML_ALERT_TOP_2: "Sei libero di usarla per i tuoi progetti personali." - HTML_ALERT_TOP_3: | - L'uso commerciale (con funzionalità aggiuntive) di RainLoop Webmail richiede di ottenere una - licenza. - TYPE_PREMIUM_LIFETIME: "A vita" - LABEL_SUB_EXPIRES: "La licenza scade il" - BUTTON_ACTIVATE: "Attiva una chiave di licenza per questo dominio" - BUTTON_PURCHASE: "Compra una licenza" - BUTTON_TRIAL: "Versione di prova" - TAB_ABOUT: - LEGEND_ABOUT: "Informazioni" - LABEL_TAG_HINT: "Semplice, moderno e veloce client email online" - LABEL_ALL_RIGHTS_RESERVED: "Tutti i diritti riservati." - HINT_READ_CHANGE_LOG: "Leggere il changelog prima di effettuare l'aggiornamento." - HINT_IS_UP_TO_DATE: "RainLoop è aggiornato." - HTML_NEW_VERSION: "La nuova versione %VERSION% è disponibile." - LABEL_UPDATING: "Aggiornamento in corso..." - LABEL_CHECKING: "Controllo della presenza di aggiornamenti..." - BUTTON_UPDATE: "Aggiorna" - BUTTON_DOWNLOAD: "Scarica" - BUTTON_CHANGELOG: "Changelog" - POPUPS_ACTIVATE: - TITLE_ACTIVATE: "Attivare chiave di licenza?" - TITLE_ACTIVATION: "Attivazione..." - LABEL_DOMAIN: "Dominio" - LABEL_SUB_KEY: "Chiave di licenza" - BUTTON_ACTIVATE: "Attiva" - LABEL_ACTIVATED: "Attivata" - ERROR_INVALID_SUBS_KEY: "Chiave di licenza non valida" - SUBS_KEY_ACTIVATED: "Chiave di licenza attivata correttamente" - HTML_DESC: | - Dopo l'attivazione, la licenza Premium per %DOMAIN% sarà estesa. -
- Una chiave di licenza può essere attivata su un solo dominio. -

- Una volta iniziato, il processo di attivazione non potrà essere bloccato od annullato. - POPUPS_DOMAIN_ALIAS: - TITLE_ADD_DOMAIN_ALIAS: "Aggiungi alias" - LABEL_ALIAS: "Alias" - LABEL_DOMAIN: "Dominio" - BUTTON_CLOSE: "Chiudi" - BUTTON_ADD: "Aggiungi" - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "Aggiungi dominio" - TITLE_ADD_DOMAIN_WITH_NAME: "Aggiungi il dominio \"%NAME%\"" - TITLE_EDIT_DOMAIN: "Modifica il dominio \"%NAME%\"" - LABEL_NAME: "Nome dominio" - NAME_HELPER: "asterischi supportati" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "Server" - LABEL_PORT: "porta" - LABEL_SECURE: "Sicuro" - LABEL_WHITE_LIST: "Whitelist" - SECURE_OPTION_NONE: "Nessuna" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "STARTTLS" - LABEL_ALLOW_SIEVE_SCRIPTS: "Abilita script sieve" - LABEL_ALLOW_USER_SCRIPT: "Abilita script personalizzati" - LABEL_USE_SHORT_LOGIN: "Utilizza login corto" - LABEL_USE_AUTH: "Utilizza autenticazione" - LABEL_USE_PHP_MAIL: "Usa la funzione mail() di PHP" - BUTTON_TEST: "Verifica" - BUTTON_WHITE_LIST: "Whitelist" - BUTTON_SIEVE_CONFIGURATION: "Configurazione di Sieve" - BUTTON_BACK_TO_IMAP: "Torna alle impostazioni IMAP" - BUTTON_BACK: "Indietro" - BUTTON_CLOSE: "Chiudi" - BUTTON_ADD: "Aggiungi" - BUTTON_UPDATE: "Aggiorna" - NEW_DOMAIN_DESC: "La configurazione di questo dominio ti permette di lavorare
con %NAME% indirizzi email." - WHITE_LIST_ALERT: | - Lista di domini a cui gli utenti sono autorizzati ad accedere. - Utilizzare uno spazio come separatore. - POPUPS_PLUGIN: - TITLE_PLUGIN: "Plugin" - DESC_NOTHING_TO_CONFIGURE: "Niente da configurare" - BUTTON_CLOSE: "Chiudi" - BUTTON_SAVE: "Salva" - TOOLTIP_ABOUT_TITLE: "Informazioni" - POPUPS_ASK: - DESC_WANT_CLOSE_THIS_WINDOW: "Sei sicuro di voler chiudere questa finestra?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Scegli la tua lingua" - HINTS: - BETA: "beta" - UNSTABLE: "instabile" - WARNING: "Attenzione!" - NOT_SUPPORTED: "non supportato" - REQUIRES_PHP_54: "richiede PHP 5.4 o maggiori" - ERRORS: - DOMAIN_ALREADY_EXISTS: "Il dominio esiste già" - UNKNOWN_ERROR: "Errore sconosciuto" - NOTIFICATIONS: - INVALID_TOKEN: "Token invalido" - AUTH_ERROR: "Autenticazione fallita" - ACCESS_ERROR: "Errore di accesso" - CONNECTION_ERROR: "Impossibile connettersi al server" - CAPTCHA_ERROR: "CAPTCHA non corretto." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Questo account social non è assegnato ancora a nessun indirizzo email. Accedi - utilizzando le credenziali dell'indirizzo e abilita la funzionalità nelle - impostazioni. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Questo account social non è assegnato ancora a nessun indirizzo email. Accedi - utilizzando le credenziali dell'indirizzo e abilita la funzionalità nelle - impostazioni. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Questo account social non è assegnato ancora a nessun indirizzo email. Accedi - utilizzando le credenziali dell'indirizzo e abilita la funzionalità nelle - impostazioni. - DOMAIN_NOT_ALLOWED: "Dominio non autorizzato" - ACCOUNT_NOT_ALLOWED: "Account non autorizzato" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Autenticazione a due fattori richiesta" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Errore durante l'autenticazione a due fattori" - COULD_NOT_SAVE_NEW_PASSWORD: "Impossibile salvare la nuova password" - CURRENT_PASSWORD_INCORRECT: "Password corrente incorreta" - NEW_PASSWORD_SHORT: "Password troppo corta" - NEW_PASSWORD_WEAK: "Password troppo facile" - NEW_PASSWORD_FORBIDDENT: "Password vietata" - CONTACTS_SYNC_ERROR: "Errore durante la sincronizzazione dei contatti" - CANT_GET_MESSAGE_LIST: "Errore durante il caricamento della lista dei messaggi" - CANT_GET_MESSAGE: "Errore durante il caricamento del messaggio" - CANT_DELETE_MESSAGE: "Impossibile cancellare il messaggio" - CANT_MOVE_MESSAGE: "Impossibile spostare il messaggio" - CANT_SAVE_MESSAGE: "Impossibile salvare il messaggio" - CANT_SEND_MESSAGE: "Impossibile inviare il messaggio" - INVALID_RECIPIENTS: "Destinatari invalidi" - CANT_SAVE_FILTERS: "Impossibile salvare i filtri" - CANT_GET_FILTERS: "Impossibile caricare i filtri" - FILTERS_ARE_NOT_CORRECT: "I filtri non sono corretti" - CANT_CREATE_FOLDER: "Impossibile creare la cartella" - CANT_RENAME_FOLDER: "Impossibile rinominare la cartella" - CANT_DELETE_FOLDER: "Impossibile cancellare la cartella" - CANT_DELETE_NON_EMPTY_FOLDER: "Non è possibile cancellare cartelle piene" - CANT_SUBSCRIBE_FOLDER: "Impossibile sottoscriversi alla cartella" - CANT_UNSUBSCRIBE_FOLDER: "Impossibile rimuovere la sottoscrizione dalla cartella" - CANT_SAVE_SETTINGS: "Impossibile salvare le impostazioni" - CANT_SAVE_PLUGIN_SETTINGS: "Impossibile salvare le impostazioni" - DOMAIN_ALREADY_EXISTS: "Il dominio già esiste" - CANT_INSTALL_PACKAGE: "Impossibile installare il pacchetto" - CANT_DELETE_PACKAGE: "Impossibile rimuovere il pacchetto" - INVALID_PLUGIN_PACKAGE: "Pacchetto non valido" - UNSUPPORTED_PLUGIN_PACKAGE: "Pacchetto non supportato" - LICENSING_SERVER_IS_UNAVAILABLE: "Il server dlele licenze non è dispobibile" - LICENSING_DOMAIN_EXPIRED: "La licenza per questo dominio è scaduta" - LICENSING_DOMAIN_BANNED: "La licenza per questo dominio è stata revocata" - DEMO_SEND_MESSAGE_ERROR: "Per ragioni di sicurezza, questo account non è abilitato ad inviare email all'esterno." - DEMO_ACCOUNT_ERROR: "Per ragioni di sicurezza, questa funzionalità è bloccata." - ACCOUNT_ALREADY_EXISTS: "Questo account esiste già" - ACCOUNT_DOES_NOT_EXIST: "L'account non esiste" - MAIL_SERVER_ERROR: "Errore durante la connessione con il server mail" - INVALID_INPUT_ARGUMENT: "Argomento non valido" - UNKNOWN_ERROR: "Errore sconosciuto" - STATIC: - BACK_LINK: "Ricarica" - DOMAIN_LIST_DESC: "Lista di domini a cui la webmail è abilitata ad accedere" - PHP_EXSTENSIONS_ERROR_DESC: "Un estensione di PHP richiesta non è disponibile." - PHP_VERSION_ERROR_DESC: "La versione di PHP corrente (%VERSION%) è più vecchia di quella minima supportata (PHP 5.3.0)" - NO_SCRIPT_TITLE: "Questa applicazione richiede JacaScript" - NO_SCRIPT_DESC: | - Il supporto a JavaScript è disabilitato nel browser. - Abilita JavaScript e ricarica la pagina. - NO_COOKIE_TITLE: "Questa applicazione richiede i cookie" - NO_COOKIE_DESC: | - Il supporto ai cookie è disabilitato nel browser. - Abilita i cookie e ricarica la pagina. - BAD_BROWSER_TITLE: "Il tuo browser è troppo vecchio" - BAD_BROWSER_DESC: | - Per usare tutte le funzionalità dell'applicazione, - scarica ed installa uno dei seguenti browser: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/ja_JP.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/ja_JP.yml deleted file mode 100755 index 640e9285..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/ja_JP.yml +++ /dev/null @@ -1,321 +0,0 @@ -ja_JP: - LOGIN: - LABEL_LOGIN: "ログイン" - LABEL_PASSWORD: "パスワード" - BUTTON_LOGIN: "管理画面へログイン" - TOP_PANEL: - LABEL_PREMIUM: "プレミアム" - LABEL_ADMIN_PANEL: "管理画面" - TABS_LABELS: - LABEL_GENERAL_NAME: "全般" - LABEL_LOGIN_NAME: "ログイン" - LABEL_BRANDING_NAME: "ブランド化" - LABEL_CONTACTS_NAME: "連絡先" - LABEL_DOMAINS_NAME: "ドメイン" - LABEL_SECURITY_NAME: "セキュリティ" - LABEL_INTEGRATION_NAME: "連携" - LABEL_PLUGINS_NAME: "プラグイン" - LABEL_PACKAGES_NAME: "パッケージ" - LABEL_LICENSING_NAME: "ライセンス" - LABEL_ABOUT_NAME: "RainLoop について" - TAB_GENERAL: - LEGEND_INTERFACE: "インターフェース" - LABEL_LANGUAGE: "言語" - LABEL_LANGUAGE_ADMIN: "言語 (管理画面)" - LABEL_THEME: "テーマ" - LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "設定画面で言語選択を使用する" - LABEL_ALLOW_THEMES_ON_SETTINGS: "設定画面でテーマ選択を使用する" - LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "設定画面で背景選択を使用する" - LABEL_NEW_FOLDER_MOVE: "新しい \"フォルダへ移動\" ボタン" - LABEL_SHOW_THUMBNAILS: "サムネイルを表示 (添付ファイル)" - LABEL_ALLOW_GRAVATAR: "Gravatar を使用する" - LEGEND_MAIN: "メイン" - LABEL_ATTACHMENT_SIZE_LIMIT: "添付サイズ制限" - LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "追加のアカウントを使用する" - LABEL_ALLOW_IDENTITIES: "複数の表示名を使用する" - LABEL_ALLOW_TEMPLATES: "テンプレートを許可する" - ALERT_WARNING: "警告!" - HTML_ALERT_WEAK_PASSWORD: | - デフォルトの管理者パスワードを使用しています。 -
- セキュリティ上の理由から、いますぐパスワードを - 変更 - してください。 - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "ログイン画面" - LABEL_DEFAULT_DOMAIN: "デフォルトドメイン" - LABEL_DETERMINE_USER_DOMAIN: "ユーザードメインを自動で選ぶ" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "ログイン画面で言語選択を使用する" - LABEL_DETERMINE_USER_LANGUAGE: "ユーザー言語を自動で選ぶ" - TAB_BRANDING: - LEGEND_BRANDING: "ブランド化" - LABEL_PAGE_TITLE: "ページタイトル" - LABEL_LOADING_DESCRIPTION: "説明を読み込み中" - LABEL_FAVICON_URL: "Favicon" - LEGEND_LOGIN: "ログイン" - LABEL_LOGIN_LOGO: "ロゴ" - LABEL_LOGIN_DESCRIPTION: "説明" - LABEL_LOGIN_BACKGROUND: "背景" - LABEL_LOGIN_CUSTOM_CSS: "カスタム CSS" - LABEL_LOGIN_SHOW_POWERED_LINK: "\"Powered by RainLoop\" リンクを表示する" - LEGEND_USER: "ユーザー" - LABEL_USER_LOGO: "ロゴ" - LABEL_USER_LOGO_TITLE: "ページタイトル" - LABEL_USER_LOGO_MESSAGE: "ロゴ(メッセージ画面)" - LABEL_USER_CUSTOM_CSS: "カスタム CSS" - LEGEND_WELCOME_PAGE: "ようこそページ" - LABEL_WELCOME_PAGE_TITLE: "タイトル" - LABEL_WELCOME_PAGE_URL: "URL" - LABEL_WELCOME_PAGE_DISPLAY: "表示" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "なし" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "1回だけ" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "いつも" - HTML_ALERT_PREMIUM: "この機能にはプレミアムが必要です" - TAB_CONTACTS: - LEGEND_CONTACTS: "連絡先" - LEGEND_STORAGE: "ストレージ (PDO)" - LABEL_ENABLE_CONTACTS: "連絡先を有効化" - LABEL_ALLOW_SYNC: " (外部の CardDAV サーバーと) 連絡先の同期を使用する" - LABEL_STORAGE_TYPE: "タイプ" - LABEL_STORAGE_DSN: "Dsn" - LABEL_STORAGE_USER: "ユーザー" - LABEL_STORAGE_PASSWORD: "パスワード" - BUTTON_TEST: "テスト" - ALERT_NOTICE: "注意!" - HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "アクティブユーザーの数が多いとき、このデータベース・タイプを使用しないでください。" - HTML_ALERT_DOES_NOT_SUPPORTED: | - このシステムでは連絡先はサポートされていません。 -
- サーバーへPDO (SQLite / MySQL / PostgreSQL) - 拡張モジュールのインストールが必要です。 - TAB_DOMAINS: - LEGEND_DOMAINS: "ドメイン" - BUTTON_ADD_DOMAIN: "ドメインを追加" - BUTTON_ADD_ALIAS: "エイリアスを追加" - DELETE_ARE_YOU_SURE: "よろしいですか?" - HTML_DOMAINS_HELPER: | - ドメインの一覧は、Web メールのアクセスを許可されています。 -
- ドメインを設定するには、名前をクリックしてください。 - TAB_SECURITY: - LEGEND_SECURITY: "セキュリティ" - LABEL_ALLOW_TWO_STEP: "2段階認証を使用する" - LABEL_FORCE_TWO_STEP: "必ず 2段階認証 を使う" - LABEL_USE_IMAGE_PROXY: "外部イメージにローカル Proxy を使う" - LABEL_ALLOW_OPEN_PGP: "OpenPGP を使う" - LABEL_SHOW_PHP_INFO: "PHP 情報を表示" - LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "管理画面アクセス情報" - LABEL_CURRENT_PASSWORD: "現在のパスワード" - LABEL_NEW_LOGIN: "新しいログイン名" - LABEL_NEW_PASSWORD: "新しいパスワード" - LABEL_REPEAT_PASSWORD: "再入力" - BUTTON_UPDATE_PASSWORD: "パスワード更新" - LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: " (IMAP/SMTP) のSSL 証明書の検証を有効にする" - LABEL_ALLOW_SELF_SIGNED: "自己署名証明書を使う" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "Google" - LABEL_ENABLE_GOOGLE: "Google 連携を有効にする" - LABEL_GOOGLE_AUTH: "Authorization" - LABEL_GOOGLE_DRIVE: "Google ドライブ連携 (編集画面)" - LABEL_GOOGLE_PREVIEW: "Google ビューア連携 (Microsoft Word/Excel/PowerPoint ファイルのプレビュー)" - LABEL_GOOGLE_CLIENT_ID: "Client ID" - LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" - LABEL_GOOGLE_API_KEY: "Api Key" - HINT_GOOGLE_API_KEY: "Googleドライブのファイルピッカーの場合は必須" - LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "Facebook 連携を有効にする (Authorization)" - LABEL_FACEBOOK_APP_ID: "App ID" - LABEL_FACEBOOK_APP_SECRET: "App Secret" - LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "Twitter 連携を有効にする (Authorization)" - LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" - LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" - LEGEND_DROPBOX: "Dropbox" - LABEL_ENABLE_DROPBOX: "Dropbox 連携を有効にする" - LABEL_DROPBOX_API_KEY: "Api Key" - TOP_ALERT: "SNS 連携の詳細は情報は、" - TAB_PLUGINS: - LEGEND_PLUGINS: "プラグイン" - LABEL_ENABLE_PLUGINS: "プラグイン有効" - ALERT_NO_PLUGINS: "プラグインは、インストールされていません" - LINK_INSTALL_NEW: "ここをクリックしてインストール" - HINT_CLICK_NAME: "プラグインを設定するには名前をクリックします" - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "更新があります" - LEGEND_AVAILABLE_FOR_INSTALLATION: "インストール可能なパッケージ" - LEGEND_INSTALLED_PACKAGES: "インストールされたパッケージ" - ALERT_CANNOT_ACCESS_REPOSITORY: "現時点でリポジトリにアクセスすることはできません。" - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "ドメイン" - LABEL_VERSION: "バージョン" - LABEL_CHECKING: "チェック中" - TYPE_BASIC_HINT: "このドメインは、 (追加の機能を備えた)商業的使用のためにライセンスされていません。" - TYPE_BASIC_HINT_2: "このドメインはライセンスされていません" - HTML_ALERT_TOP_1: "RainLoop Webmail is licensed under" - HTML_ALERT_TOP_2: "You are free to use it for your personal projects." - HTML_ALERT_TOP_3: | - RainLoop Webmailの(付加的な機能を備えた)商業的使用は、 - サブスクリプションを取得する必要があります。 - TYPE_PREMIUM_LIFETIME: "ライフタイム" - LABEL_SUB_EXPIRES: "サブスクリプションの有効期限切れ" - BUTTON_ACTIVATE: "このドメインサブスクリプションキーをアクティベートする" - BUTTON_PURCHASE: "購入" - BUTTON_TRIAL: "試用" - TAB_ABOUT: - LEGEND_ABOUT: "RainLoop について" - LABEL_TAG_HINT: "シンプル・モダン・高速なウェブベースのメールクライアント" - LABEL_ALL_RIGHTS_RESERVED: "All Rights Reserved." - HINT_READ_CHANGE_LOG: "更新する前に変更ログをお読みください。" - HINT_IS_UP_TO_DATE: "RainLoopは最新のものです。" - HTML_NEW_VERSION: "新しいバージョン %VERSION% があります" - LABEL_UPDATING: "更新中" - LABEL_CHECKING: "アップデートの確認" - BUTTON_UPDATE: "更新" - BUTTON_DOWNLOAD: "ダウンロード" - BUTTON_CHANGELOG: "変更履歴" - POPUPS_ACTIVATE: - TITLE_ACTIVATE: "サブスクリプションキーをアクティベートしますか?" - TITLE_ACTIVATION: "アクティベーション ..." - LABEL_DOMAIN: "ドメイン" - LABEL_SUB_KEY: "サブスクリプションキー" - BUTTON_ACTIVATE: "アクティベート" - LABEL_ACTIVATED: "アクティベート済み" - ERROR_INVALID_SUBS_KEY: "無効なサブスクリプションキー" - SUBS_KEY_ACTIVATED: "サブスクリプションキーのアクティベートに成功しました" - HTML_DESC: | - %DOMAIN% のプレミアムサブスクリプションをアクティベートした後、拡張されます。 -
- そのサブスクリプションキーは、1つのドメインのみアクティベートできます。 -

- 一度アクティベーションの処理を開始すると、中止またはキャンセルすることはできません。 - POPUPS_DOMAIN_ALIAS: - TITLE_ADD_DOMAIN_ALIAS: "エイリアスを追加" - LABEL_ALIAS: "エイリアス" - LABEL_DOMAIN: "ドメイン" - BUTTON_CLOSE: "閉じる" - BUTTON_ADD: "追加" - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "ドメインを追加" - TITLE_ADD_DOMAIN_WITH_NAME: "ドメイン \"%NAME%\" を追加" - TITLE_EDIT_DOMAIN: "ドメイン \"%NAME%\" を編集" - LABEL_NAME: "名前" - NAME_HELPER: "ワイルドカード利用可" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "サーバー" - LABEL_PORT: "ポート" - LABEL_SECURE: "セキュリティ" - LABEL_WHITE_LIST: "ホワイトリスト" - SECURE_OPTION_NONE: "なし" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "STARTTLS" - LABEL_ALLOW_SIEVE_SCRIPTS: "SIEVE スクリプトを使用する" - LABEL_ALLOW_USER_SCRIPT: "カスタムユーザースクリプトを使用する" - LABEL_USE_SHORT_LOGIN: "短いログイン名を使う" - LABEL_USE_AUTH: "認証を使用する" - LABEL_USE_PHP_MAIL: "PHP mail() 関数を使用する" - BUTTON_TEST: "接続テスト" - BUTTON_WHITE_LIST: "ホワイトリスト" - BUTTON_SIEVE_CONFIGURATION: "SIEVE 設定" - BUTTON_BACK_TO_IMAP: "IMAP 設定に戻る" - BUTTON_BACK: "戻る" - BUTTON_CLOSE: "閉じる" - BUTTON_ADD: "追加" - BUTTON_UPDATE: "更新" - NEW_DOMAIN_DESC: "このドメイン設定を使用すると、 %NAME% メールアドレスで動作するようになります。" - WHITE_LIST_ALERT: | - ドメインの一覧は、Web メールのアクセスを許可されています。 - 区切り文字としてスペースを使用してください。 - POPUPS_PLUGIN: - TITLE_PLUGIN: "プラグイン" - DESC_NOTHING_TO_CONFIGURE: "何も設定されていません" - BUTTON_CLOSE: "閉じる" - BUTTON_SAVE: "保存" - TOOLTIP_ABOUT_TITLE: "RainLoop について" - POPUPS_ASK: - DESC_WANT_CLOSE_THIS_WINDOW: "このウィンドウを閉じてもよろしいですか?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "言語を選択してください" - HINTS: - BETA: "beta" - UNSTABLE: "unstable" - WARNING: "警告!" - NOT_SUPPORTED: "サポートされません" - REQUIRES_PHP_54: "PHP 5.4 以上が必要です" - ERRORS: - DOMAIN_ALREADY_EXISTS: "ドメインが既に存在しています" - UNKNOWN_ERROR: "不明なエラー" - NOTIFICATIONS: - INVALID_TOKEN: "無効なトークン" - AUTH_ERROR: "認証に失敗しました" - ACCESS_ERROR: "アクセスエラー" - CONNECTION_ERROR: "サーバーへ接続できません" - CAPTCHA_ERROR: "間違った CAPTCHA" - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - このSNSユーザーIDは、まだメールアカウント用に割り当てられていません。電子メールの資格情報を使用してログインし、アカウント設定でこの機能を有効にします。 - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - このSNSユーザーIDは、まだメールアカウント用に割り当てられていません。電子メールの資格情報を使用してログインし、アカウント設定でこの機能を有効にします。 - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - このSNSユーザーIDは、まだメールアカウント用に割り当てられていません。電子メールの資格情報を使用してログインし、アカウント設定でこの機能を有効にします。 - DOMAIN_NOT_ALLOWED: "ドメインは、許可されていません" - ACCOUNT_NOT_ALLOWED: "アカウントは、許可されていません" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2段階認証が必要です" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2段階認証エラー" - COULD_NOT_SAVE_NEW_PASSWORD: "新しいパスワードを保存できません。" - CURRENT_PASSWORD_INCORRECT: "現在のパスワードが間違っています" - NEW_PASSWORD_SHORT: "パスワードが短すぎます" - NEW_PASSWORD_WEAK: "パスワードが簡単すぎます" - NEW_PASSWORD_FORBIDDENT: "パスワードに、禁止された文字が含まれています" - CONTACTS_SYNC_ERROR: "連絡先 同期 エラー" - CANT_GET_MESSAGE_LIST: "メッセージ一覧が取得できません" - CANT_GET_MESSAGE: "メッセージが取得できません" - CANT_DELETE_MESSAGE: "メッセージが削除できません" - CANT_MOVE_MESSAGE: "メッセージが移動できません" - CANT_SAVE_MESSAGE: "メッセージが保存できません" - CANT_SEND_MESSAGE: "メッセージが送信できません" - INVALID_RECIPIENTS: "無効な受信者" - CANT_SAVE_FILTERS: "フィルターが保存できません" - CANT_GET_FILTERS: "フィルターを取得できません" - FILTERS_ARE_NOT_CORRECT: "フィルターが正しくありません" - CANT_CREATE_FOLDER: "フォルダーを作成できません" - CANT_RENAME_FOLDER: "フォルダの名前が変更できません" - CANT_DELETE_FOLDER: "フォルダを削除できません" - CANT_DELETE_NON_EMPTY_FOLDER: "空ではないディレクトリを削除できません" - CANT_SUBSCRIBE_FOLDER: "フォルダを購読できません" - CANT_UNSUBSCRIBE_FOLDER: "フォルダを購読解除できません" - CANT_SAVE_SETTINGS: "設定が保存できません" - CANT_SAVE_PLUGIN_SETTINGS: "設定が保存できません" - DOMAIN_ALREADY_EXISTS: "ドメインが既に存在しています" - CANT_INSTALL_PACKAGE: "パッケージのインストールに失敗しました" - CANT_DELETE_PACKAGE: "パッケージの削除に失敗しました" - INVALID_PLUGIN_PACKAGE: "無効なプラグインパッケージ" - UNSUPPORTED_PLUGIN_PACKAGE: "サポートされていないプラグインパッケージ" - LICENSING_SERVER_IS_UNAVAILABLE: "サブスクリプションサーバーが利用できません" - LICENSING_DOMAIN_EXPIRED: "このドメインのサブスクリプションの有効期限が切れました" - LICENSING_DOMAIN_BANNED: "このドメインのサブスクリプションが無効化されました" - DEMO_SEND_MESSAGE_ERROR: "セキュリティ上の理由から、アカウントは、外部の電子メールアドレスにメッセージを送信することを許可されていません!" - DEMO_ACCOUNT_ERROR: "セキュリティ上の理由から、アカウントには、このアクションが許可されていません!" - ACCOUNT_ALREADY_EXISTS: "アカウントがすでに存在します" - ACCOUNT_DOES_NOT_EXIST: "アカウントは存在しません" - MAIL_SERVER_ERROR: "メールサーバーへのアクセス中にエラーが発生しました" - INVALID_INPUT_ARGUMENT: "無効な入力引数" - UNKNOWN_ERROR: "不明なエラー" - STATIC: - BACK_LINK: "更新" - DOMAIN_LIST_DESC: "ドメインの一覧は、Web メールのアクセスを許可されています。" - PHP_EXSTENSIONS_ERROR_DESC: "必要な PHP 拡張モジュールが、有効になっていません。" - PHP_VERSION_ERROR_DESC: "PHP バージョン (%VERSION%) が、 最低バージョンの 5.3.0 よりも低いです!" - NO_SCRIPT_TITLE: "このアプリケーションでは JavaScript が必要です。" - NO_SCRIPT_DESC: | - ブラウザで JavaScript が、有効になっていません。 - JavaScript を有効にして、再度試してください。 - NO_COOKIE_TITLE: "このアプリケーションでは Cookie が必要です。" - NO_COOKIE_DESC: | - ブラウザで Cookie が、有効になっていません。 - Cookie を有効にして、再度試してください。 - BAD_BROWSER_TITLE: "お使いのブラウザが古いです。" - BAD_BROWSER_DESC: | - アプリケーションのすべての機能を使用するには、 - これらのブラウザの1つをダウンロードしてインストールします: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/lt_LT.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/lt_LT.yml deleted file mode 100755 index 7a7b2300..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/lt_LT.yml +++ /dev/null @@ -1,323 +0,0 @@ -lt_LT: - LOGIN: - LABEL_LOGIN: "Prisijungimo vardas" - LABEL_PASSWORD: "Slaptažodis" - BUTTON_LOGIN: "Prisijungti prie valdymo skydo" - TOP_PANEL: - LABEL_PREMIUM: "Premium" - LABEL_ADMIN_PANEL: "Administratoriaus valdymo skydas" - TABS_LABELS: - LABEL_GENERAL_NAME: "Pagrindiniai" - LABEL_LOGIN_NAME: "Prisijungimo vardas" - LABEL_BRANDING_NAME: "Įdaguoti" - LABEL_CONTACTS_NAME: "Kontaktai" - LABEL_DOMAINS_NAME: "Domenai" - LABEL_SECURITY_NAME: "Sauga" - LABEL_INTEGRATION_NAME: "Integracija" - LABEL_PLUGINS_NAME: "Įskiepiai" - LABEL_PACKAGES_NAME: "Paketai" - LABEL_LICENSING_NAME: "Licencijavimas" - LABEL_ABOUT_NAME: "Apie" - TAB_GENERAL: - LEGEND_INTERFACE: "Sąsaja" - LABEL_LANGUAGE: "Kalba" - LABEL_LANGUAGE_ADMIN: "Kalba (administravimo pulto)" - LABEL_THEME: "Tema" - LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Leisti kalbos keitimą nustatymuose" - LABEL_ALLOW_THEMES_ON_SETTINGS: "Leisti temos keitimą nustatymuose" - LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Leisti keisti foną nustatymuose" - LABEL_NEW_FOLDER_MOVE: "Naujas \"\"perkelti į katalogą\" mygtukas" - LABEL_SHOW_THUMBNAILS: "Rodyti miniatiūrą (prisegtuko)" - LABEL_ALLOW_GRAVATAR: "Leisti naudoti Gravatar'ą" - LEGEND_MAIN: "Pagrindinis" - LABEL_ATTACHMENT_SIZE_LIMIT: "Prisegtukų dydžio limitas" - LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Leisti papildomas paskyras" - LABEL_ALLOW_IDENTITIES: "Leisti daugiau tapatybių" - LABEL_ALLOW_TEMPLATES: "Leisti šablonus" - ALERT_WARNING: "Dėmesio!" - HTML_ALERT_WEAK_PASSWORD: |+ - Naudojate numatytąjį administratoriaus slaptažodį. -
- Dėl Jūsų saugumo prašome - pakeiskite - slaptažodį kitu. - - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "Prisijungimo langas" - LABEL_DEFAULT_DOMAIN: "Numatytasis Domenas" - LABEL_DETERMINE_USER_DOMAIN: "Bandyti nuspėti vartotojo domeną" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Leisti kalbų keitimą prisijungimo lange" - LABEL_DETERMINE_USER_LANGUAGE: "bandyti nuspėti vartotojo kalbą" - TAB_BRANDING: - LEGEND_BRANDING: "Prekės ženklo derinimas" - LABEL_PAGE_TITLE: "Puslapio pavadinimas" - LABEL_LOADING_DESCRIPTION: "Krovimosi aprašas" - LABEL_FAVICON_URL: "Favicon" - LEGEND_LOGIN: "Prisijungimo vardas" - LABEL_LOGIN_LOGO: "Logotipas" - LABEL_LOGIN_DESCRIPTION: "Aprašymas" - LABEL_LOGIN_BACKGROUND: "Fonas" - LABEL_LOGIN_CUSTOM_CSS: "Pritaikytas CSS" - LABEL_LOGIN_SHOW_POWERED_LINK: "Rodyti \"Powered by RainLoop\" nuorodą" - LEGEND_USER: "Vartotojas" - LABEL_USER_LOGO: "Logotipas" - LABEL_USER_LOGO_TITLE: "Logotipo pavadinimas" - LABEL_USER_LOGO_MESSAGE: "Logotipas (Laiško peržiūroje)" - LABEL_USER_CUSTOM_CSS: "Pritaikytas CSS" - LEGEND_WELCOME_PAGE: "Prisistatymo puslapis" - LABEL_WELCOME_PAGE_TITLE: "Pavadinimas" - LABEL_WELCOME_PAGE_URL: "Nuoroda" - LABEL_WELCOME_PAGE_DISPLAY: "Rodyti" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "Nieko" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Kartą" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Visada" - HTML_ALERT_PREMIUM: "Ši funkcija leidžiama tik Premium vartotojams." - TAB_CONTACTS: - LEGEND_CONTACTS: "Kontaktai" - LEGEND_STORAGE: "Saugykla (PDO)" - LABEL_ENABLE_CONTACTS: "Įjungti kontaktus" - LABEL_ALLOW_SYNC: "Leisti kontaktų sinchronizavimą (su išoriniu CardDAV serveriu)" - LABEL_STORAGE_TYPE: "Tipas" - LABEL_STORAGE_DSN: "Dsn" - LABEL_STORAGE_USER: "Vartotojas" - LABEL_STORAGE_PASSWORD: "Slaptažodis" - BUTTON_TEST: "Bandymas" - ALERT_NOTICE: "Pastaba!" - HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Nenaudokite šio duomenų bazės tipo, jei turite daug aktyvių vartotojų" - HTML_ALERT_DOES_NOT_SUPPORTED: | - Jūsų sistema nepalaiko kontaktų sąrašo. - Reikia įdiegti ar įjungti PDO (SĄLite / MySQL / PostgreSQL) plėtinius jūsų serveryje. - TAB_DOMAINS: - LEGEND_DOMAINS: "Domenai" - BUTTON_ADD_DOMAIN: "Pridėti Domeną" - BUTTON_ADD_ALIAS: "Pridėti Alias" - DELETE_ARE_YOU_SURE: "Ar jūs įsitikinę?" - HTML_DOMAINS_HELPER: | - Leidžiamų Domenų sąrašas -
- Spauskite ant pavadinimo norėdami redaguoti. - TAB_SECURITY: - LEGEND_SECURITY: "Sauga" - LABEL_ALLOW_TWO_STEP: "Leisti 2-jų žingsnių patikrinimą" - LABEL_FORCE_TWO_STEP: "Priverstinai naudoti 2-jų žingsnių patikrinimą" - LABEL_USE_IMAGE_PROXY: "naudoti vietinį šliuzą (proxy) išoriniams paveikslėliams" - LABEL_ALLOW_OPEN_PGP: "Leisti OpenPGP" - LABEL_SHOW_PHP_INFO: "Rodyti PHP informaciją" - LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Valdymo skydo prieigos rekvizitai" - LABEL_CURRENT_PASSWORD: "Dabartinis slaptažodis" - LABEL_NEW_LOGIN: "Naujas prisijungimo vardas" - LABEL_NEW_PASSWORD: "Naujas slaptažodis" - LABEL_REPEAT_PASSWORD: "Pakartokite" - BUTTON_UPDATE_PASSWORD: "Atnaujinti slaptažodį" - LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: "Reikalauti SSL sertifikato (IMAP/SMTP)" - LABEL_ALLOW_SELF_SIGNED: "Leisti pačių sukurtus sertifikatus" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "Google" - LABEL_ENABLE_GOOGLE: "Įjungti Google integraciją" - LABEL_GOOGLE_AUTH: "Authorization" - LABEL_GOOGLE_DRIVE: "Google Drive Integracija (Laiško kūrimo rodinys)" - LABEL_GOOGLE_PREVIEW: "Google peržiūros įrankių integracija (Galimybė peržiūrėti Microsoft Word, Excel ir Powerpoint failus)" - LABEL_GOOGLE_CLIENT_ID: "Kliento ID" - LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" - LABEL_GOOGLE_API_KEY: "Api Key" - HINT_GOOGLE_API_KEY: "Reikia dėl Google Drive Failų parinkimo" - LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "Įjungt Facebook Integraciją (Autorizavimui)" - LABEL_FACEBOOK_APP_ID: "App ID" - LABEL_FACEBOOK_APP_SECRET: "App Secret" - LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "jungt Twitter Integraciją (Autorizavimui)" - LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" - LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" - LEGEND_DROPBOX: "Dropbox" - LABEL_ENABLE_DROPBOX: "Įjungti Dropbox Integraciją" - LABEL_DROPBOX_API_KEY: "Api Key" - TOP_ALERT: "Detalią Informaciją apie socialinių tinklų integraciją rasite čia" - TAB_PLUGINS: - LEGEND_PLUGINS: "Įskiepiai" - LABEL_ENABLE_PLUGINS: "leisti įskiepius" - ALERT_NO_PLUGINS: "Nėra įdiegtų įskiepių." - LINK_INSTALL_NEW: "Spauskite čia norėdami įdiegti!" - HINT_CLICK_NAME: "Spauskite ant vardo norėdami redaguoti įskiepį." - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "Yra galimybė atnaujinti" - LEGEND_AVAILABLE_FOR_INSTALLATION: "Galima diegti" - LEGEND_INSTALLED_PACKAGES: "Įdiegti paketai" - ALERT_CANNOT_ACCESS_REPOSITORY: "Šiuo momentu negaliu prisijungti prie saugyklos." - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "Jūsų domenas" - LABEL_VERSION: "Versija" - LABEL_CHECKING: "Tikrinu" - TYPE_BASIC_HINT: "Šis domenas nelicencijuotas komerciniam naudojimui (su papildomomis galimybėmis)" - TYPE_BASIC_HINT_2: "Šis domenas negali būti licencijuotas." - HTML_ALERT_TOP_1: "RainLoop Webmail licencijuotas" - HTML_ALERT_TOP_2: "Jūs galite nemokamai naudoti savo asmeniniams projektams." - HTML_ALERT_TOP_3: | - Komerciniam RainLoop Webmail naudojimui (su papildomomis galimybėmis) turite įsigyti - prenumeratą. - TYPE_PREMIUM_LIFETIME: "Visam laikui" - LABEL_SUB_EXPIRES: "Prenumerata baigiasi" - BUTTON_ACTIVATE: "Aktyvuoti prenumeratos raktą šiam domenui" - BUTTON_PURCHASE: "Pirkti" - BUTTON_TRIAL: "Bandomasis" - TAB_ABOUT: - LEGEND_ABOUT: "Apie" - LABEL_TAG_HINT: "Paprastas, modernus ir greitas web pašto klientas" - LABEL_ALL_RIGHTS_RESERVED: "Visos teisės saugomos." - HINT_READ_CHANGE_LOG: "Prašom perskaityti pasikeitimų eigą prieš atnaujinant." - HINT_IS_UP_TO_DATE: "RainLoop naujausios laidos." - HTML_NEW_VERSION: "Nauja %VERSION% versija jau prieinama." - LABEL_UPDATING: "Atnaujinama" - LABEL_CHECKING: "Ieškau atnaujinimų" - BUTTON_UPDATE: "Atnaujinti" - BUTTON_DOWNLOAD: "Atsisiųsti" - BUTTON_CHANGELOG: "Pakeitimų žurnalas" - POPUPS_ACTIVATE: - TITLE_ACTIVATE: "Aktyvuoti prenumeratos raktą?" - TITLE_ACTIVATION: "Aktyvavimas..." - LABEL_DOMAIN: "Domenas" - LABEL_SUB_KEY: "Prenumeratos raktas" - BUTTON_ACTIVATE: "Aktyvuoti" - LABEL_ACTIVATED: "Aktyvuota" - ERROR_INVALID_SUBS_KEY: "Neteisingas prenumeratos raktas" - SUBS_KEY_ACTIVATED: "Prenumeratos raktas sėkmingai aktyvuotas" - HTML_DESC: | - Aktyvavus premium prenumeratą, papildomos galimybės domenui %DOMAIN% bus įjungtos. -
- Įsidėmėkite, kad prenumeratos raktas gali būti aktyvuotas tik vienam domenui. -

- Pradėjus aktyvavimo procesą jis nebegalės būti atšauktas. - POPUPS_DOMAIN_ALIAS: - TITLE_ADD_DOMAIN_ALIAS: "Pridėti Alias" - LABEL_ALIAS: "Alias" - LABEL_DOMAIN: "Domenas" - BUTTON_CLOSE: "Uždaryti" - BUTTON_ADD: "Pridėti" - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "Pridėti Domeną" - TITLE_ADD_DOMAIN_WITH_NAME: "Pridėti Domeną \"%NAME%\"" - TITLE_EDIT_DOMAIN: "Redaguoti Domeną \"%NAME%\"" - LABEL_NAME: "Pavadinimas" - NAME_HELPER: "wildcard palaikymas" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "Serveris" - LABEL_PORT: "Prievadas" - LABEL_SECURE: "Sauga" - LABEL_WHITE_LIST: "Baltas Sąrašas" - SECURE_OPTION_NONE: "Nėra" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "STARTTLS" - LABEL_ALLOW_SIEVE_SCRIPTS: "Leisti sieve programavimą" - LABEL_ALLOW_USER_SCRIPT: "Leisti vartotojo programavimą" - LABEL_USE_SHORT_LOGIN: "Naudoti trumpą prisijungimo vardą" - LABEL_USE_AUTH: "Naudoti autentifikavimą " - LABEL_USE_PHP_MAIL: "Naudoti php mail() funkciją" - BUTTON_TEST: "Bandyti" - BUTTON_WHITE_LIST: "Baltas sąrašas" - BUTTON_SIEVE_CONFIGURATION: "Sieve konfiguracija" - BUTTON_BACK_TO_IMAP: "Atgal į IMAP nustatymus" - BUTTON_BACK: "Atgal" - BUTTON_CLOSE: "Uždaryti" - BUTTON_ADD: "Pridėti" - BUTTON_UPDATE: "Atnaujinti" - NEW_DOMAIN_DESC: "Šie nustatymai leis jums dirbti
su %NAME% domeno pašto adresais." - WHITE_LIST_ALERT: | - Domeno vartotojų sąrašas, kuriems leista naudotis web paštu. - Naudokite tarpo simbolį kaip skyriklį. - POPUPS_PLUGIN: - TITLE_PLUGIN: "Įskiepis" - DESC_NOTHING_TO_CONFIGURE: "Nėra ką konfiguruoti" - BUTTON_CLOSE: "Uždaryti" - BUTTON_SAVE: "Saugoti" - TOOLTIP_ABOUT_TITLE: "Apie" - POPUPS_ASK: - DESC_WANT_CLOSE_THIS_WINDOW: "Ar tikrai norite uždaryti šį langą?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Pasirinkite kalbą" - HINTS: - BETA: "beta" - UNSTABLE: "nestabilus" - WARNING: "Dėmesio!" - NOT_SUPPORTED: "Nepalaikoma" - REQUIRES_PHP_54: "būtina PHP 5.4 ar aukštesnė versija" - ERRORS: - DOMAIN_ALREADY_EXISTS: "Toks domenas jau yra" - UNKNOWN_ERROR: "Nežinoma klaida" - NOTIFICATIONS: - INVALID_TOKEN: "Neteisingas raktas" - AUTH_ERROR: "Autorizacija nepavyko" - ACCESS_ERROR: "Prieigos klaida" - CONNECTION_ERROR: "Nepavyskta prisijungti prie serverio" - CAPTCHA_ERROR: "Neteisingas CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Šis socialinis ID nepriskirtas jokiai e-pašto paskyrai. Prisijunkite naudojant - elektroninio pašto rekvizitus ir įjunkite šią funkciją paskyros nustatymuose. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Šis socialinis ID nepriskirtas jokiai e-pašto paskyrai. Prisijunkite naudojant - elektroninio pašto rekvizitus ir įjunkite šią funkciją paskyros nustatymuose. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Šis socialinis ID nepriskirtas jokiai e-pašto paskyrai. Prisijunkite naudojant - elektroninio pašto rekvizitus ir įjunkite šią funkciją paskyros nustatymuose. - DOMAIN_NOT_ALLOWED: "Šis subdomenas neleidžiamas" - ACCOUNT_NOT_ALLOWED: "Paskyra neleidžiama" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Būtinas dviejų veiksnių patikrinimas" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Dviejų veiksnių patikrinimo klaida" - COULD_NOT_SAVE_NEW_PASSWORD: "Negaliu išsaugoti slaptažodžio" - CURRENT_PASSWORD_INCORRECT: "Dabartinis slaptažodis neteisingas" - NEW_PASSWORD_SHORT: "Slaptažodis per trumpas" - NEW_PASSWORD_WEAK: "Slaptažodis per lengvas" - NEW_PASSWORD_FORBIDDENT: "Slaptažodyte bandote naudoti neleistinus simbolius" - CONTACTS_SYNC_ERROR: "Kontaktų sinchronizavimo klaida" - CANT_GET_MESSAGE_LIST: "Nepavyksta gauti laiškų sąrašo" - CANT_GET_MESSAGE: "Nepavyksta gauti laiško" - CANT_DELETE_MESSAGE: "Nepavyko pašalinti laiško" - CANT_MOVE_MESSAGE: "Nepavyko perkelti laiško" - CANT_SAVE_MESSAGE: "Nepavyko išsaugoti laiško" - CANT_SEND_MESSAGE: "Nepavyko išsiųsti laiško" - INVALID_RECIPIENTS: "Netinkamas gavėjas" - CANT_SAVE_FILTERS: "Nepavyko išsaugoti filtrų" - CANT_GET_FILTERS: "Nepavyko gauti filtrų" - FILTERS_ARE_NOT_CORRECT: "Filtrai neteisingi" - CANT_CREATE_FOLDER: "Nepavyksta sukurti katalogo" - CANT_RENAME_FOLDER: "Nepavyksta pervadinti katalogo" - CANT_DELETE_FOLDER: "Nepavyksta pašalinti katalogo" - CANT_DELETE_NON_EMPTY_FOLDER: "Negalima pašalinti ne tuščio katalogo" - CANT_SUBSCRIBE_FOLDER: "Nepavyskta užprenumeruoti katalogo" - CANT_UNSUBSCRIBE_FOLDER: "Nepavyksta nutraukti katalogo prenumeratos" - CANT_SAVE_SETTINGS: "Nepavyksta išsaugoti nustatymų" - CANT_SAVE_PLUGIN_SETTINGS: "Nepavyksta išsaugoti nustatymų" - DOMAIN_ALREADY_EXISTS: "Toks domenas jau yra" - CANT_INSTALL_PACKAGE: "Nepavyksta įdiegti paketo" - CANT_DELETE_PACKAGE: "Nepavyksta pašalinti paketo" - INVALID_PLUGIN_PACKAGE: "Netinkamas įskiepio paketas" - UNSUPPORTED_PLUGIN_PACKAGE: "Nepalaikomas įskiepio paketas" - LICENSING_SERVER_IS_UNAVAILABLE: "Prenumeratos serveris nepasiekimas" - LICENSING_DOMAIN_EXPIRED: "Šio subdomeno prenumeratos laikas baigėsi." - LICENSING_DOMAIN_BANNED: "Šio subdomeno prenumerata uždrausta." - DEMO_SEND_MESSAGE_ERROR: "Saugumo sumetimais, ši demo paskyra neleidžia siųsti laiškų išoriniais e-pašto adresais!" - DEMO_ACCOUNT_ERROR: "Saugumo sumetimais, su šia paskyra negalima atlikti norimo veiksmo!" - ACCOUNT_ALREADY_EXISTS: "Paskyra jau egzistuoja" - ACCOUNT_DOES_NOT_EXIST: "Nėra tokios paskyros" - MAIL_SERVER_ERROR: "Klaida bandant pasiekti pašto serverį" - INVALID_INPUT_ARGUMENT: "Neteisingas įvesties argumentas" - UNKNOWN_ERROR: "Nežinoma klaida" - STATIC: - BACK_LINK: "Perkrauti" - DOMAIN_LIST_DESC: "Leidžiamų naudoti subdomenų sąrašas." - PHP_EXSTENSIONS_ERROR_DESC: "Trūksta būtinų PHP plėtinių!" - PHP_VERSION_ERROR_DESC: "Jūsų PHP versija (%VERSION%) žemesnė, nei reikalaujama 5.3.0!" - NO_SCRIPT_TITLE: "Šiai aplikacijai reikalinga JavaScript." - NO_SCRIPT_DESC: | - JavaScript nepalaikoma Jūsų naršyklėje. - Įjunkite JavaScript palaikymą naršyklėje ir bandykite vėl. - NO_COOKIE_TITLE: "Slapukų palaikymas būtinas šiai aplikacijai." - NO_COOKIE_DESC: | - Slapukų palaikymas negalimas jūsų naršyklėje. - Įjunkite slapukų palaikymą naršyklėje ir bandykite vėl. - BAD_BROWSER_TITLE: "Jūsų naršyklė pasenusi." - BAD_BROWSER_DESC: | - Norint naudotis visais šios aplikacijos privalumais, - parsisiųskite ir įsidiekite vieną iš šių naršyklių: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/nb_NO.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/nb_NO.yml deleted file mode 100755 index 1d4bf245..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/nb_NO.yml +++ /dev/null @@ -1,323 +0,0 @@ -nb_NO: - LOGIN: - LABEL_LOGIN: "Brukernavn" - LABEL_PASSWORD: "Passord" - BUTTON_LOGIN: "Logg inn på admin-panel" - TOP_PANEL: - LABEL_PREMIUM: "Premium" - LABEL_ADMIN_PANEL: "Admin-panel" - TABS_LABELS: - LABEL_GENERAL_NAME: "Generelt" - LABEL_LOGIN_NAME: "Brukernavn" - LABEL_BRANDING_NAME: "Utforming" - LABEL_CONTACTS_NAME: "Kontakter" - LABEL_DOMAINS_NAME: "Domener" - LABEL_SECURITY_NAME: "Sikkerhet" - LABEL_INTEGRATION_NAME: "Integrasjon" - LABEL_PLUGINS_NAME: "Tillegg" - LABEL_PACKAGES_NAME: "Pakker" - LABEL_LICENSING_NAME: "Lisens" - LABEL_ABOUT_NAME: "Om" - TAB_GENERAL: - LEGEND_INTERFACE: "Grensesnitt" - LABEL_LANGUAGE: "Språk" - LABEL_LANGUAGE_ADMIN: "Språk (admin)" - LABEL_THEME: "Tema" - LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "La brukere velge språk på oppsettsskjerm" - LABEL_ALLOW_THEMES_ON_SETTINGS: "La brukere velge tema på oppsettsskjerm" - LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "La brukere velge bakgrunn på oppsettsskjerm" - LABEL_NEW_FOLDER_MOVE: "Ny «flytt til mappe»-knapp" - LABEL_SHOW_THUMBNAILS: "Vis miniatyrer (vedlegg)" - LABEL_ALLOW_GRAVATAR: "Tillat Gravatar" - LEGEND_MAIN: "Hoved" - LABEL_ATTACHMENT_SIZE_LIMIT: "Maksimal størrelse på vedlegg" - LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Tillat bruk av flere kontoer" - LABEL_ALLOW_IDENTITIES: "Tillat bruk av flere identiteter" - LABEL_ALLOW_TEMPLATES: "Tillat bruk av maler" - ALERT_WARNING: "Advarsel!" - HTML_ALERT_WEAK_PASSWORD: | - Du bruker forvalgt admin-passord. -
- Av sikkerhetshensyn bør du - endre - passordet umiddelbart. - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "Innloggingsskjerm" - LABEL_DEFAULT_DOMAIN: "Standard-domene" - LABEL_DETERMINE_USER_DOMAIN: "Prøv å finne brukerens domene" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "La brukere velge språk på innloggingsskjerm" - LABEL_DETERMINE_USER_LANGUAGE: "Prøv å finne brukerens språk" - TAB_BRANDING: - LEGEND_BRANDING: "Utforming" - LABEL_PAGE_TITLE: "Sidetittel" - LABEL_LOADING_DESCRIPTION: "Tekst under innlasting" - LABEL_FAVICON_URL: "Favorittikon" - LEGEND_LOGIN: "Innlogging" - LABEL_LOGIN_LOGO: "Logo" - LABEL_LOGIN_DESCRIPTION: "Beskrivelse" - LABEL_LOGIN_BACKGROUND: "Bakgrunn" - LABEL_LOGIN_CUSTOM_CSS: "Selvvalgt CSS" - LABEL_LOGIN_SHOW_POWERED_LINK: "Vis «Powered by RainLoop»-lenke" - LEGEND_USER: "Bruker" - LABEL_USER_LOGO: "Logo" - LABEL_USER_LOGO_TITLE: "Logotittel" - LABEL_USER_LOGO_MESSAGE: "Logo (meldingsvisning)" - LABEL_USER_CUSTOM_CSS: "Selvvalgt CSS" - LEGEND_WELCOME_PAGE: "Velkomstside" - LABEL_WELCOME_PAGE_TITLE: "Tittel" - LABEL_WELCOME_PAGE_URL: "Nettadresse" - LABEL_WELCOME_PAGE_DISPLAY: "Vis" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "Ingen" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Én gang" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Alltid" - HTML_ALERT_PREMIUM: "Denne funksjonaliteten er bare tilgjengelig for Premium-brukere." - TAB_CONTACTS: - LEGEND_CONTACTS: "Kontakter" - LEGEND_STORAGE: "Lagring (PDO)" - LABEL_ENABLE_CONTACTS: "Slå på kontakter" - LABEL_ALLOW_SYNC: "Tillat synkronisering av kontakter (med ekstern CardDAV-tjener)" - LABEL_STORAGE_TYPE: "Type" - LABEL_STORAGE_DSN: "Dsn" - LABEL_STORAGE_USER: "Bruker" - LABEL_STORAGE_PASSWORD: "Passord" - BUTTON_TEST: "Test" - ALERT_NOTICE: "Varsel!" - HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Ikke bruk denne databasetypen hvis dette systemet har mange brukere." - HTML_ALERT_DOES_NOT_SUPPORTED: | - Dette systemet støtter ikke kontakter. -
- Du må installere eller slå på utvidelsen PDO (SQLite / MySQL / PostgreSQL) på tjeneren. - TAB_DOMAINS: - LEGEND_DOMAINS: "Domener" - BUTTON_ADD_DOMAIN: "Legg til domene" - BUTTON_ADD_ALIAS: "Legg til alias" - DELETE_ARE_YOU_SURE: "Er du sikker?" - HTML_DOMAINS_HELPER: | - Liste over domener som programmet kan få tilgang til. -
- Trykk på et navn for å sette opp domenet. - TAB_SECURITY: - LEGEND_SECURITY: "Sikkerhet" - LABEL_ALLOW_TWO_STEP: "Tillat tostegsbekreftelse" - LABEL_FORCE_TWO_STEP: "Krev tostegsbekreftelse" - LABEL_USE_IMAGE_PROXY: "Bruk lokal mellomtjener for eksterne bilder" - LABEL_ALLOW_OPEN_PGP: "Tillat OpenPGP" - LABEL_SHOW_PHP_INFO: "Vis PHP-informasjon" - LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Akkreditiver for admin-panel" - LABEL_CURRENT_PASSWORD: "Gjeldende passord" - LABEL_NEW_LOGIN: "Nytt brukernavn" - LABEL_NEW_PASSWORD: "Nytt passord" - LABEL_REPEAT_PASSWORD: "Gjenta" - BUTTON_UPDATE_PASSWORD: "Oppdater passord" - LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: "Krev bekreftelse av SSL-sertifikat (IMAP/SMTP)" - LABEL_ALLOW_SELF_SIGNED: "Tillat selvutstedt sertifikat" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "Google" - LABEL_ENABLE_GOOGLE: "Integrer med Google" - LABEL_GOOGLE_AUTH: "Autentisering" - LABEL_GOOGLE_DRIVE: "Google Drive-integrasjon (skrivevisning)" - LABEL_GOOGLE_PREVIEW: "Google Viewer-integrasjon (forhåndsvisning av Microsoft Word-, Excel- og PowerPoint-filer)" - LABEL_GOOGLE_CLIENT_ID: "Klient-ID" - LABEL_GOOGLE_CLIENT_SECRET: "Klientnøkkel" - LABEL_GOOGLE_API_KEY: "API-nøkkel" - HINT_GOOGLE_API_KEY: "Kreves av Google Drive File Picker" - LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "Integrer med Facebook (autentisering)" - LABEL_FACEBOOK_APP_ID: "Program-ID" - LABEL_FACEBOOK_APP_SECRET: "Programnøkkel" - LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "Integrer med Twitter (autentisering)" - LABEL_TWITTER_CONSUMER_KEY: "Brukernummer" - LABEL_TWITTER_CONSUMER_SECRET: "Brukernøkkel" - LEGEND_DROPBOX: "Dropbox" - LABEL_ENABLE_DROPBOX: "Integrer med Dropbox" - LABEL_DROPBOX_API_KEY: "API-nøkkel" - TOP_ALERT: "Detaljert informasjon om integrering med sosiale medier finnes på" - TAB_PLUGINS: - LEGEND_PLUGINS: "Tillegg" - LABEL_ENABLE_PLUGINS: "Slå på tillegg" - ALERT_NO_PLUGINS: "Ingen tillegg er installert." - LINK_INSTALL_NEW: "Trykk her for å installere." - HINT_CLICK_NAME: "Trykk på et programtillegg-navn for å sette det opp." - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "Tilgjengelig for oppdatering" - LEGEND_AVAILABLE_FOR_INSTALLATION: "Tilgjengelig for installasjon" - LEGEND_INSTALLED_PACKAGES: "Installerte pakker" - ALERT_CANNOT_ACCESS_REPOSITORY: "Fikk ikke tilgang til pakkelageret." - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "Domenenavn" - LABEL_VERSION: "Versjon" - LABEL_CHECKING: "Sjekker" - TYPE_BASIC_HINT: "Dette domenet har ikke lisens for kommersiell bruk (med ekstrafunksjoner)." - TYPE_BASIC_HINT_2: "Dette domenet kan ikke brukes med lisens for ekstrafunksjoner." - HTML_ALERT_TOP_1: "RainLoop Webmail er utgitt på betingelsene i" - HTML_ALERT_TOP_2: "Du står fritt til å bruke programmet til personlige formål." - HTML_ALERT_TOP_3: | - Hvis du vil bruke RainLoop Webmail kommersielt (med ekstrafunksjoner), må du kjøpe et - abonnement. - TYPE_PREMIUM_LIFETIME: "Livstid" - LABEL_SUB_EXPIRES: "Abonnement utgår" - BUTTON_ACTIVATE: "Ta i bruk abonnementsnøkkel for dette domenet" - BUTTON_PURCHASE: "Kjøp" - BUTTON_TRIAL: "Prøv" - TAB_ABOUT: - LEGEND_ABOUT: "Om" - LABEL_TAG_HINT: "Rask, enkel, moderne og web-basert e-postklient" - LABEL_ALL_RIGHTS_RESERVED: "All Rights Reserved." - HINT_READ_CHANGE_LOG: "Les endringslogg før du oppdaterer." - HINT_IS_UP_TO_DATE: "RainLoop er oppdatert." - HTML_NEW_VERSION: "Versjon %VERSION% er nå tilgjengelig." - LABEL_UPDATING: "Oppdaterer" - LABEL_CHECKING: "Ser etter oppdateringer" - BUTTON_UPDATE: "Oppdater" - BUTTON_DOWNLOAD: "Last ned" - BUTTON_CHANGELOG: "Endringslogg" - POPUPS_ACTIVATE: - TITLE_ACTIVATE: "Vil du ta abonnementsnøkkelen i bruk?" - TITLE_ACTIVATION: "Aktivering …" - LABEL_DOMAIN: "Domene" - LABEL_SUB_KEY: "Abonnementsnøkkel" - BUTTON_ACTIVATE: "Bruk" - LABEL_ACTIVATED: "I bruk" - ERROR_INVALID_SUBS_KEY: "Ugyldig abonnementsnøkkel" - SUBS_KEY_ACTIVATED: "Abonnementsnøkkelen er nå i bruk" - HTML_DESC: | - Premium-abonnement for %DOMAIN% fonyes. -
- Nøkkelen kan bare tas i bruk for ett domene. -

- Du kan ikke angre på å ta en nøkkel i bruk. - POPUPS_DOMAIN_ALIAS: - TITLE_ADD_DOMAIN_ALIAS: "Legg til alias" - LABEL_ALIAS: "Alias" - LABEL_DOMAIN: "Domene" - BUTTON_CLOSE: "Lukk" - BUTTON_ADD: "Legg til" - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "Legg til domene" - TITLE_ADD_DOMAIN_WITH_NAME: "Legg til «%NAME%»" - TITLE_EDIT_DOMAIN: "Rediger «%NAME%»" - LABEL_NAME: "Navn" - NAME_HELPER: "jokertegn støttes" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "Tjener" - LABEL_PORT: "Port" - LABEL_SECURE: "Sikker" - LABEL_WHITE_LIST: "Hvitliste" - SECURE_OPTION_NONE: "None" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "STARTTLS" - LABEL_ALLOW_SIEVE_SCRIPTS: "Tillat sieve-skript" - LABEL_ALLOW_USER_SCRIPT: "Tillat selvvalgt brukerskript" - LABEL_USE_SHORT_LOGIN: "Bruk forkortet brukernavn" - LABEL_USE_AUTH: "Bruk autentisering" - LABEL_USE_PHP_MAIL: "Bruk php-funksjonen «mail()»" - BUTTON_TEST: "Test" - BUTTON_WHITE_LIST: "Hvitliste" - BUTTON_SIEVE_CONFIGURATION: "Sieve-oppsett" - BUTTON_BACK_TO_IMAP: "Tilbake til IMAP-innstillinger" - BUTTON_BACK: "Tilbake" - BUTTON_CLOSE: "Lukk" - BUTTON_ADD: "Legg til" - BUTTON_UPDATE: "Oppdater" - NEW_DOMAIN_DESC: "Dette domeneoppsettet lar deg jobbe
med e-postadresser ved %NAME%." - WHITE_LIST_ALERT: | - Liste over domenebrukere som programmet skal ha tilgang til. - Hold verdier adskilt med mellomrom. - POPUPS_PLUGIN: - TITLE_PLUGIN: "Tillegg" - DESC_NOTHING_TO_CONFIGURE: "Ingenting å sette opp" - BUTTON_CLOSE: "Lukk" - BUTTON_SAVE: "Lagre" - TOOLTIP_ABOUT_TITLE: "Om" - POPUPS_ASK: - DESC_WANT_CLOSE_THIS_WINDOW: "Er du sikker på at du vil lukke dette vinduet?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Velg språk" - HINTS: - BETA: "beta" - UNSTABLE: "ustabil" - WARNING: "Advarsel!" - NOT_SUPPORTED: "støttes ikke" - REQUIRES_PHP_54: "krever PHP versjon 5.4 eller nyere" - ERRORS: - DOMAIN_ALREADY_EXISTS: "Domenet finnes allerede" - UNKNOWN_ERROR: "Ukjent feil" - NOTIFICATIONS: - INVALID_TOKEN: "Ugyldig symbol" - AUTH_ERROR: "Autentisering mislyktes" - ACCESS_ERROR: "Tilgangsfeil" - CONNECTION_ERROR: "Klarte ikke å koble til tjener" - CAPTCHA_ERROR: "Feil CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- - Denne sosiale ID-en er ikke knyttet til en e-postkonto enda. Logg inn med - e-post-akkreditiver og slå på denne funksjonen i kontooppsettet. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- - Denne sosiale ID-en er ikke knyttet til en e-postkonto enda. Logg inn med - e-post-akkreditiver og slå på denne funksjonen i kontooppsettet. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- - Denne sosiale ID-en er ikke knyttet til en e-postkonto enda. Logg inn med - e-post-akkreditiver og slå på denne funksjonen i kontooppsettet. - DOMAIN_NOT_ALLOWED: "Domenet tillates ikke" - ACCOUNT_NOT_ALLOWED: "Kontoen tillates ikke" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "To-stegsbekreftelse kreves" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Feil under to-stegsbekreftelse" - COULD_NOT_SAVE_NEW_PASSWORD: "Klarte ikke å lagre nytt passord" - CURRENT_PASSWORD_INCORRECT: "Gjeldende passord er feil" - NEW_PASSWORD_SHORT: "Passordet er for kort" - NEW_PASSWORD_WEAK: "Passordet er for enkelt" - NEW_PASSWORD_FORBIDDENT: "Passordet inneholder forbudte tegn" - CONTACTS_SYNC_ERROR: "Feil under synkronisering av kontakter" - CANT_GET_MESSAGE_LIST: "Klarte ikke å hente meldingsliste" - CANT_GET_MESSAGE: "Klarte ikke å hente melding" - CANT_DELETE_MESSAGE: "Klarte ikke å slette melding" - CANT_MOVE_MESSAGE: "Klarte ikke å flytte melding" - CANT_SAVE_MESSAGE: "Klarte ikke å lagre melding" - CANT_SEND_MESSAGE: "Klarte ikke å sende melding" - INVALID_RECIPIENTS: "Ugyldige mottakere" - CANT_SAVE_FILTERS: "Klarte ikke å lagre filtre" - CANT_GET_FILTERS: "Klarte ikke å hente filtre" - FILTERS_ARE_NOT_CORRECT: "Ugyldige filtre" - CANT_CREATE_FOLDER: "Klarte ikke å lage mappe" - CANT_RENAME_FOLDER: "Klarte ikke å gi nytt navn til mappe" - CANT_DELETE_FOLDER: "Klarte ikke å slette mappe" - CANT_DELETE_NON_EMPTY_FOLDER: "Mappa er ikke tom, og kan derfor ikke slettes" - CANT_SUBSCRIBE_FOLDER: "Klarte ikke å abonnere på mappe" - CANT_UNSUBSCRIBE_FOLDER: "Klarte ikke å avslutte abonnement på mappe" - CANT_SAVE_SETTINGS: "Klarte ikke å lagre innstillinger" - CANT_SAVE_PLUGIN_SETTINGS: "Klarte ikke å lagre innstillinger" - DOMAIN_ALREADY_EXISTS: "Domenet finnes allerede" - CANT_INSTALL_PACKAGE: "Klarte ikke å installere pakke" - CANT_DELETE_PACKAGE: "Klarte ikke å fjerne pakke" - INVALID_PLUGIN_PACKAGE: "Ugyldig tilleggspakke" - UNSUPPORTED_PLUGIN_PACKAGE: "Tilleggspakke støttes ikke" - LICENSING_SERVER_IS_UNAVAILABLE: "Abonnementstjener er utilgjengelig" - LICENSING_DOMAIN_EXPIRED: "Abonnementet for dette domenet er utgått." - LICENSING_DOMAIN_BANNED: "Abonnementet for dette domenet er blokkert." - DEMO_SEND_MESSAGE_ERROR: "Av sikkerhetshensyn er denne demo-kontoen blokkert fra å sende meldinger til eksterne e-postadresser." - DEMO_ACCOUNT_ERROR: "Av sikkerhetshensyn er denne demo-kontoen blokkert fra å utføre denne handlinga" - ACCOUNT_ALREADY_EXISTS: "Kontoen finnes allerede" - ACCOUNT_DOES_NOT_EXIST: "Kontoen finnes ikke" - MAIL_SERVER_ERROR: "Det oppstod en feil under tilkobling til e-posttjener" - INVALID_INPUT_ARGUMENT: "Ugyldig inndata-argument" - UNKNOWN_ERROR: "Ukjent feil" - STATIC: - BACK_LINK: "Last inn på nytt" - DOMAIN_LIST_DESC: "Liste over domener som programmet skal ha tilgang til." - PHP_EXSTENSIONS_ERROR_DESC: "PHP-oppsettet ditt mangler en påkrevet utvidelse." - PHP_VERSION_ERROR_DESC: "PHP-installasjonen din (%VERSION%) er eldre enn versjon 5.3.0" - NO_SCRIPT_TITLE: "Dette programmet krever Javascript." - NO_SCRIPT_DESC: | - Nettleseren din støtter ikke Javascript. - Slå på Javascript-støtte i nettleserens innstillinger, og prøv på nytt. - NO_COOKIE_TITLE: "Dette programmet krever støtte for informasjonskapsler («cookies»)." - NO_COOKIE_DESC: | - Nettleseren din støtter ikke bruk av informasjonskapsler («cookies»). - Slå på cookie-støtte i nettleserens innstillinger, og prøv på nytt. - BAD_BROWSER_TITLE: "Nettleseren din er utdatert." - BAD_BROWSER_DESC: | - Hvis du vil bruke alle funksjonene i programmet, - må du laste ned og installere en av disse nettleserne: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/nl_NL.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/nl_NL.yml deleted file mode 100755 index 998a7e41..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/nl_NL.yml +++ /dev/null @@ -1,321 +0,0 @@ -nl_NL: - LOGIN: - LABEL_LOGIN: "Inlognaam" - LABEL_PASSWORD: "Wachtwoord" - BUTTON_LOGIN: "Aanmelden in het beheer paneel" - TOP_PANEL: - LABEL_PREMIUM: "Premium" - LABEL_ADMIN_PANEL: "Beheer paneel" - TABS_LABELS: - LABEL_GENERAL_NAME: "Algemeen" - LABEL_LOGIN_NAME: "Inlognaam" - LABEL_BRANDING_NAME: "Huisstijl" - LABEL_CONTACTS_NAME: "Contactpersonen" - LABEL_DOMAINS_NAME: "Domeinen" - LABEL_SECURITY_NAME: "Beveiliging" - LABEL_INTEGRATION_NAME: "Integratie" - LABEL_PLUGINS_NAME: "Invoegtoepassingen" - LABEL_PACKAGES_NAME: "Paketten" - LABEL_LICENSING_NAME: "Licentieovereenkomst" - LABEL_ABOUT_NAME: "Over" - TAB_GENERAL: - LEGEND_INTERFACE: "Interface" - LABEL_LANGUAGE: "Taal" - LABEL_LANGUAGE_ADMIN: "Taal (admin)" - LABEL_THEME: "Thema" - LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Sta taalselectie toe in het instellingen scherm" - LABEL_ALLOW_THEMES_ON_SETTINGS: "Sta thema selectie toe in het instellingen scherm" - LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Sta achtergrond selectie toe in het instellingen scherm" - LABEL_NEW_FOLDER_MOVE: "Nieuwe \"verplaats naar map\" knop" - LABEL_SHOW_THUMBNAILS: "Toon miniaturen (bijlage)" - LABEL_ALLOW_GRAVATAR: "Toon Gravatar" - LEGEND_MAIN: "Diverse" - LABEL_ATTACHMENT_SIZE_LIMIT: "Maximale bijlage grootte" - LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Sta extra accounts toe" - LABEL_ALLOW_IDENTITIES: "Meerdere identiteiten toestaan" - LABEL_ALLOW_TEMPLATES: "Sta templates toe" - ALERT_WARNING: "Waarschuwing!" - HTML_ALERT_WEAK_PASSWORD: | - U gebruikt het standaard beheer wachtwoord. -
- Wijzig - a.u.b. voor uw veiligheid direct het wachtwoord. - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "Inlogscherm" - LABEL_DEFAULT_DOMAIN: "Standaard domein" - LABEL_DETERMINE_USER_DOMAIN: "Probeer gebruikersdomein te bepalen" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Sta taal selectie toe in het login scherm" - LABEL_DETERMINE_USER_LANGUAGE: "Probeer gebruiker taal te bepalen" - TAB_BRANDING: - LEGEND_BRANDING: "Huisstijl" - LABEL_PAGE_TITLE: "Pagina titel" - LABEL_LOADING_DESCRIPTION: "Beschrijving tijdens laden" - LABEL_FAVICON_URL: "Favicon" - LEGEND_LOGIN: "Login scherm" - LABEL_LOGIN_LOGO: "Logo" - LABEL_LOGIN_DESCRIPTION: "Beschrijving" - LABEL_LOGIN_BACKGROUND: "Achtergrond" - LABEL_LOGIN_CUSTOM_CSS: "Aangepaste CSS" - LABEL_LOGIN_SHOW_POWERED_LINK: "Toon \"Powered by RainLoop\" link" - LEGEND_USER: "Gebruiker" - LABEL_USER_LOGO: "Logo" - LABEL_USER_LOGO_TITLE: "Logo titel" - LABEL_USER_LOGO_MESSAGE: "Logo (berichtweergave)" - LABEL_USER_CUSTOM_CSS: "Aangepaste CSS" - LEGEND_WELCOME_PAGE: "Welkom pagina" - LABEL_WELCOME_PAGE_TITLE: "Titel" - LABEL_WELCOME_PAGE_URL: "URL" - LABEL_WELCOME_PAGE_DISPLAY: "Weergave" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "Nooit" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Eenmalig" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Altijd" - HTML_ALERT_PREMIUM: "Deze functionaliteit is alleen beschikbaar voor Premium abonnees.\n" - TAB_CONTACTS: - LEGEND_CONTACTS: "Contactpersonen" - LEGEND_STORAGE: "Opslag (PDO)" - LABEL_ENABLE_CONTACTS: "Contactpersonen inschakelen" - LABEL_ALLOW_SYNC: "Contactpersoon synchronisatie (met externe CardDAV server) inschakelen" - LABEL_STORAGE_TYPE: "Soort" - LABEL_STORAGE_DSN: "Dsn" - LABEL_STORAGE_USER: "Gebruikersnaam" - LABEL_STORAGE_PASSWORD: "Wachtwoord" - BUTTON_TEST: "Test" - ALERT_NOTICE: "Aandacht!" - HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Gegruik deze database soort niet met een groot aantal actieve gebrukers." - HTML_ALERT_DOES_NOT_SUPPORTED: | - Uw systeem ondersteund geen contactpersonen. -
- U moet een PDO (SQLite / MySQL / PostgreSQL) extentie op uw server installeren of activeren. - TAB_DOMAINS: - LEGEND_DOMAINS: "Domeinen" - BUTTON_ADD_DOMAIN: "Domein toevoegen" - BUTTON_ADD_ALIAS: "Voeg alias toe" - DELETE_ARE_YOU_SURE: "Weet u het zeker?" - HTML_DOMAINS_HELPER: | - Lijst van toegestane domeinen. -
- Klik op de domeinnaam om deze te configureren. - TAB_SECURITY: - LEGEND_SECURITY: "Beveiliging" - LABEL_ALLOW_TWO_STEP: "2-Stap verificatie toestaan" - LABEL_FORCE_TWO_STEP: "2-Stap verificatie afdwingen" - LABEL_USE_IMAGE_PROXY: "Gebruik de server als proxy voor externe afbeeldingen" - LABEL_ALLOW_OPEN_PGP: "OpenPGP toestaan" - LABEL_SHOW_PHP_INFO: "PHP informatie tonen" - LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Toegangsgegevens beheer paneel" - LABEL_CURRENT_PASSWORD: "Huidig wachtwoord" - LABEL_NEW_LOGIN: "Nieuwe gebruikersnaam" - LABEL_NEW_PASSWORD: "Nieuw wachtwoord" - LABEL_REPEAT_PASSWORD: "Herhaal nieuw wachtwoord" - BUTTON_UPDATE_PASSWORD: "Gegevens bijwerken" - LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: "Verificatie van SSL certificaten (IMAP/SMTP)" - LABEL_ALLOW_SELF_SIGNED: "Sta zelf ondertekende certificaten toe" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "Google" - LABEL_ENABLE_GOOGLE: "Google integratie inschakelen" - LABEL_GOOGLE_AUTH: "Autorisatie" - LABEL_GOOGLE_DRIVE: "Google Drive integratie (tijdens bericht opstellen)" - LABEL_GOOGLE_PREVIEW: "Google Viewer integratie (Microsoft Word, Excel en PowerPoint voorbeelweergave)" - LABEL_GOOGLE_CLIENT_ID: "Client ID" - LABEL_GOOGLE_CLIENT_SECRET: "Geheime sleutel" - LABEL_GOOGLE_API_KEY: "API sleutel" - HINT_GOOGLE_API_KEY: "Vereist voor Google Drive bestand verkenner" - LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "Facebook integratie (autorisatie) inschakelen" - LABEL_FACEBOOK_APP_ID: "App ID" - LABEL_FACEBOOK_APP_SECRET: "App sleutel" - LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "Twitter integratie (autorisatie) inschakelen" - LABEL_TWITTER_CONSUMER_KEY: "Consumer sleutel" - LABEL_TWITTER_CONSUMER_SECRET: "Consumer geheime sleutel" - LEGEND_DROPBOX: "Dropbox" - LABEL_ENABLE_DROPBOX: "Dropbox integratie" - LABEL_DROPBOX_API_KEY: "API sleutel" - TOP_ALERT: "Gedetaileerde informatie over integraties is te vinden op" - TAB_PLUGINS: - LEGEND_PLUGINS: "Invoegtoepassingen" - LABEL_ENABLE_PLUGINS: "Invoegtoepassingen inschakelen" - ALERT_NO_PLUGINS: "Er zijn nog geen invoegtoepassingen geïnstalleerd" - LINK_INSTALL_NEW: "Klik hier om een invoegtoepassing te installeren!" - HINT_CLICK_NAME: "Klik op de naam om de invoegtoepassing te configuren." - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "Update beschikbaar" - LEGEND_AVAILABLE_FOR_INSTALLATION: "Gereed voor installatie" - LEGEND_INSTALLED_PACKAGES: "Geïnstalleerde pakketten" - ALERT_CANNOT_ACCESS_REPOSITORY: "De installatie bron is op het moment niet beschikbaar." - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "Uw domein" - LABEL_VERSION: "Versie" - LABEL_CHECKING: "Controleren" - TYPE_BASIC_HINT: "Dit domein is niet gelicentieerd voor commercieel gebruik (met aditionele functies)." - TYPE_BASIC_HINT_2: "Dit domein kan niet worden gelicentieerd." - HTML_ALERT_TOP_1: "RainLoop Webmail is gelicentieerd onder de" - HTML_ALERT_TOP_2: "U staat u vrij om dit voor uw persoonlijk project te gebruiken." - HTML_ALERT_TOP_3: | - Voor commercieel gebruik (met additionele functies) van RainLoop Webmail moet u een activatie code. - TYPE_PREMIUM_LIFETIME: "Levenslang" - LABEL_SUB_EXPIRES: "Activatie verloopt" - BUTTON_ACTIVATE: "Activeer de activatie code voor dit domein." - BUTTON_PURCHASE: "Aanschaffen" - BUTTON_TRIAL: "Proefperiode" - TAB_ABOUT: - LEGEND_ABOUT: "Over" - LABEL_TAG_HINT: "Simpel, modern en snelle web-based e-mail client" - LABEL_ALL_RIGHTS_RESERVED: "Alle rechten gereserveerd." - HINT_READ_CHANGE_LOG: "Lees a.u.b. het veranderingen logboek alvorens te updaten." - HINT_IS_UP_TO_DATE: "De laatste versie van RainLoop is geïnstalleerd." - HTML_NEW_VERSION: "Een nieuwe versie %VERSION% is beschikbaar." - LABEL_UPDATING: "Bezig met updaten" - LABEL_CHECKING: "Controleren op updates" - BUTTON_UPDATE: "Bijwerken" - BUTTON_DOWNLOAD: "Download" - BUTTON_CHANGELOG: "Veranderingen logboek" - POPUPS_ACTIVATE: - TITLE_ACTIVATE: "Activatie code activeren?" - TITLE_ACTIVATION: "Activeren..." - LABEL_DOMAIN: "Domein" - LABEL_SUB_KEY: "Activatie code" - BUTTON_ACTIVATE: "Activeer" - LABEL_ACTIVATED: "Geactiveerd" - ERROR_INVALID_SUBS_KEY: "Onjuiste activatie code" - SUBS_KEY_ACTIVATED: "Activatie code is al succesvol geactiveerd" - HTML_DESC: | - Na activatie wordt het premium abonnement voor %DOMAIN% verlengd. -
- Let op: een activatie code kan slechts voor één domein worden gebruikt. -

- Het activatieproces kan niet meer worden afgebroken of geannuleerd nadat het is gestart. - POPUPS_DOMAIN_ALIAS: - TITLE_ADD_DOMAIN_ALIAS: "Voeg alias toe" - LABEL_ALIAS: "Alias" - LABEL_DOMAIN: "Domein" - BUTTON_CLOSE: "Sluiten" - BUTTON_ADD: "Toevoegen" - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "Voeg domein toe" - TITLE_ADD_DOMAIN_WITH_NAME: "Voeg domein \"%NAME%\" toe" - TITLE_EDIT_DOMAIN: "Pas domein \"%NAME%\" aan" - LABEL_NAME: "Naam" - NAME_HELPER: "ondersteunt joker tekens" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "Server" - LABEL_PORT: "Poort" - LABEL_SECURE: "Encryptie" - LABEL_WHITE_LIST: "Witte lijst" - SECURE_OPTION_NONE: "Geen" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "STARTTLS" - LABEL_ALLOW_SIEVE_SCRIPTS: "Sta Sieve scripts toe" - LABEL_ALLOW_USER_SCRIPT: "Sta gebruiker scripts toe" - LABEL_USE_SHORT_LOGIN: "Gebruik verkorte login" - LABEL_USE_AUTH: "Gebruik authenticatie" - LABEL_USE_PHP_MAIL: "Gebruik php mail() functie" - BUTTON_TEST: "Test" - BUTTON_WHITE_LIST: "Witte lijst" - BUTTON_SIEVE_CONFIGURATION: "Sieve configuratie" - BUTTON_BACK_TO_IMAP: "Terug naar IMAP instellingen" - BUTTON_BACK: "Terug" - BUTTON_CLOSE: "Annuleer" - BUTTON_ADD: "Toevoegen" - BUTTON_UPDATE: "Update" - NEW_DOMAIN_DESC: "Dit domein stelt u in staat om
met %NAME% e-mail adressen te werken." - WHITE_LIST_ALERT: | - Lijst van gebruikers die dit domein mogen gebruiken. - Gebruik een spatie als scheidingsteken. - POPUPS_PLUGIN: - TITLE_PLUGIN: "Invoegtoepassing" - DESC_NOTHING_TO_CONFIGURE: "Niets om te configureren" - BUTTON_CLOSE: "Annuleer" - BUTTON_SAVE: "Opslaan" - TOOLTIP_ABOUT_TITLE: "Over" - POPUPS_ASK: - DESC_WANT_CLOSE_THIS_WINDOW: "Weet u zeker dat u dit venster wilt stuiten?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Kies uw taal" - HINTS: - BETA: "bèta" - UNSTABLE: "onstabiel" - WARNING: "Waarschuwing!" - NOT_SUPPORTED: "niet ondersteund" - REQUIRES_PHP_54: "vereist PHP 5.4 of hoger" - ERRORS: - DOMAIN_ALREADY_EXISTS: "Domein bestaat al" - UNKNOWN_ERROR: "Onbekende fout" - NOTIFICATIONS: - INVALID_TOKEN: "Onjuiste token" - AUTH_ERROR: "Authenticatie mislukt" - ACCESS_ERROR: "Fout bij toegang" - CONNECTION_ERROR: "Verbinding met Server mislukt" - CAPTCHA_ERROR: "Onjuiste CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Deze integratie ID is nog niet gekoppeld aan een e-mail adres. Log in met - uw e-mail aanmeldingsgegevens en activeer deze functie in de instellingen. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Deze integratie ID is nog niet gekoppeld aan een e-mail adres. Log in met - uw e-mail aanmeldingsgegevens en activeer deze functie in de instellingen. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Deze integratie ID is nog niet gekoppeld aan een e-mail adres. Log in met - uw e-mail aanmeldingsgegevens en activeer deze functie in de instellingen. - DOMAIN_NOT_ALLOWED: "Domein is niet toegestaan" - ACCOUNT_NOT_ALLOWED: "Account is niet toegestaan" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2-Stap verificatie is vereist" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2-Stap verificatie fout" - COULD_NOT_SAVE_NEW_PASSWORD: "Kan het nieuwe wachtwoord niet opslaan" - CURRENT_PASSWORD_INCORRECT: "Huidig wachtwoord is onjuist" - NEW_PASSWORD_SHORT: "Wachtwoord is te kort" - NEW_PASSWORD_WEAK: "Wachtwoord is te gemakkelijk" - NEW_PASSWORD_FORBIDDENT: "Wachtwoord bevat verboden karakters" - CONTACTS_SYNC_ERROR: "Contactpersonen synchronisatie fout" - CANT_GET_MESSAGE_LIST: "Kan berichtenlijst niet ophalen" - CANT_GET_MESSAGE: "Kan bericht niet ophalen" - CANT_DELETE_MESSAGE: "Kan bericht niet verwijderen" - CANT_MOVE_MESSAGE: "Kan bericht niet verplaatsen" - CANT_SAVE_MESSAGE: "Kan bericht niet opslaan" - CANT_SEND_MESSAGE: "Kan bericht niet verzenden" - INVALID_RECIPIENTS: "ongeldige ontvanger(s)" - CANT_SAVE_FILTERS: "Kan filters niet opslaan" - CANT_GET_FILTERS: "Kan filters niet ophalen" - FILTERS_ARE_NOT_CORRECT: "Filters zijn niet correct" - CANT_CREATE_FOLDER: "Kan map niet maken" - CANT_RENAME_FOLDER: "Kan map geen andere naam geven" - CANT_DELETE_FOLDER: "Kan map niet verwijderen" - CANT_DELETE_NON_EMPTY_FOLDER: "Kan folder die niet leeg is niet verwijderen" - CANT_SUBSCRIBE_FOLDER: "Kan niet abonneren op map" - CANT_UNSUBSCRIBE_FOLDER: "Kan abonnement op map niet opheffen" - CANT_SAVE_SETTINGS: "Kan instellingen niet opslaan" - CANT_SAVE_PLUGIN_SETTINGS: "Kan instellingen niet opslaan" - DOMAIN_ALREADY_EXISTS: "Domein bestaat al" - CANT_INSTALL_PACKAGE: "Kan pakket niet installeren" - CANT_DELETE_PACKAGE: "Kan pakket niet de-installeren" - INVALID_PLUGIN_PACKAGE: "Onjuist invoegtoepassing pakket" - UNSUPPORTED_PLUGIN_PACKAGE: "niet ondersteund invoegtoepassing pakket" - LICENSING_SERVER_IS_UNAVAILABLE: "Activatie server is niet beschikbaar" - LICENSING_DOMAIN_EXPIRED: "Activatie voor dit domein is verlopen." - LICENSING_DOMAIN_BANNED: "Activatie voor dit domein niet mogelijk." - DEMO_SEND_MESSAGE_ERROR: "Vanwege beveiliging is het deze account niet toegestaan om e-mail naar externe adressen te versturen!" - DEMO_ACCOUNT_ERROR: "Vanwege beveiliging is het deze account niet toegestaan om deze actie uit te voeren!" - ACCOUNT_ALREADY_EXISTS: "Account bestaat al" - ACCOUNT_DOES_NOT_EXIST: "Account bestaat niet." - MAIL_SERVER_ERROR: "Fout bij toegang tot de mail Server" - INVALID_INPUT_ARGUMENT: "Invalid input argument" - UNKNOWN_ERROR: "Unknown error" - STATIC: - BACK_LINK: "Reload" - DOMAIN_LIST_DESC: "List of domains webmail is allowed to access." - PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" - PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" - NO_SCRIPT_TITLE: "JavaScript is required for this application." - NO_SCRIPT_DESC: | - JavaScript support is not available in your browser. - Please enable JavaScript support in your browser settings and retry. - NO_COOKIE_TITLE: "Cookies support is required for this application." - NO_COOKIE_DESC: | - Cookies support is not available in your browser. - Please enable Cookie support in your browser settings and retry. - BAD_BROWSER_TITLE: "Your browser is outdated." - BAD_BROWSER_DESC: | - Om alle functies van deze applicatie te gebruiken, - download en installeer een van de volgende browsers: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/pl_PL.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/pl_PL.yml deleted file mode 100755 index 3925ff5d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/pl_PL.yml +++ /dev/null @@ -1,326 +0,0 @@ -pl_PL: - LOGIN: - LABEL_LOGIN: "Login" - LABEL_PASSWORD: "Hasło" - BUTTON_LOGIN: "Zaloguj" - TOP_PANEL: - LABEL_PREMIUM: "Premium" - LABEL_ADMIN_PANEL: "Panel administracyjny" - TABS_LABELS: - LABEL_GENERAL_NAME: "Ogólne" - LABEL_LOGIN_NAME: "Login" - LABEL_BRANDING_NAME: "Personalizacja" - LABEL_CONTACTS_NAME: "Kontakty" - LABEL_DOMAINS_NAME: "Domeny" - LABEL_SECURITY_NAME: "Bezpieczeństwo" - LABEL_INTEGRATION_NAME: "Integracja" - LABEL_PLUGINS_NAME: "Wtyczki" - LABEL_PACKAGES_NAME: "Zarządzanie wtyczkami" - LABEL_LICENSING_NAME: "Licencjonowanie" - LABEL_ABOUT_NAME: "O skrypcie" - TAB_GENERAL: - LEGEND_INTERFACE: "Interfejs" - LABEL_LANGUAGE: "Język:" - LABEL_LANGUAGE_ADMIN: "Język (admin):" - LABEL_THEME: "Motyw:" - LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Zezwól użytkownikowi na wybór języka" - LABEL_ALLOW_THEMES_ON_SETTINGS: "Zezwól użytkownikowi na zmianę motywu" - LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Zezwól użytkownikowi na użycie własnego tła" - LABEL_NEW_FOLDER_MOVE: "Nowy przycisk \"przenieś do folderu\"" - LABEL_SHOW_THUMBNAILS: "Pokaż miniatury (załączniki)" - LABEL_ALLOW_GRAVATAR: "Zezwól na używanie gravatarów" - LEGEND_MAIN: "Główne" - LABEL_ATTACHMENT_SIZE_LIMIT: "Maks. rozmiar zał.:" - LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Zezwól na dodatkowe konta" - LABEL_ALLOW_IDENTITIES: "Zezwól na posiadanie wielu tożsamości" - LABEL_ALLOW_TEMPLATES: "Zezwól na używanie szablonów" - ALERT_WARNING: "Ostrzeżenie!" - HTML_ALERT_WEAK_PASSWORD: | - Korzystasz z domyślnego hasła administratora. -
- Ze względów bezpieczeństwa, proszę - zmienić hasło - na inne. - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "Logowanie" - LABEL_DEFAULT_DOMAIN: "Domyślna domena:" - LABEL_DETERMINE_USER_DOMAIN: "Spróbuj określić domenę użytkownika" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Zezwól na zmianę języka podczas logowania" - LABEL_DETERMINE_USER_LANGUAGE: "Spróbuj określić język użytkownika" - TAB_BRANDING: - LEGEND_BRANDING: "Personalizacja" - LABEL_PAGE_TITLE: "Tytuł strony:" - LABEL_LOADING_DESCRIPTION: "Komunikat ład. strony:" - LABEL_FAVICON_URL: "Favicon:" - LEGEND_LOGIN: "Login" - LABEL_LOGIN_LOGO: "Logo:" - LABEL_LOGIN_DESCRIPTION: "Opis:" - LABEL_LOGIN_BACKGROUND: "Tło:" - LABEL_LOGIN_CUSTOM_CSS: "Własny arkusz stylów:" - LABEL_LOGIN_SHOW_POWERED_LINK: "Pokaż link: \"Powered by RainLoop\"" - LEGEND_USER: "Użytkownik" - LABEL_USER_LOGO: "Logo:" - LABEL_USER_LOGO_TITLE: "Tytuł loga:" - LABEL_USER_LOGO_MESSAGE: "Logo (widok wiad.)" - LABEL_USER_CUSTOM_CSS: "Własny arkusz stylów:" - LEGEND_WELCOME_PAGE: "Str. główna" - LABEL_WELCOME_PAGE_TITLE: "Tytuł:" - LABEL_WELCOME_PAGE_URL: "Adres URL:" - LABEL_WELCOME_PAGE_DISPLAY: "Wyświetl:" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "nigdy" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "raz" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "zawsze" - HTML_ALERT_PREMIUM: "Ta opcja jest dostępna tylko dla licencji - Musisz zainstalować lub uruchomić na serwerze jedno z rozszerzeń PDO (SQLite / MySQL / PostgreSQL). - TAB_DOMAINS: - LEGEND_DOMAINS: "Domeny" - BUTTON_ADD_DOMAIN: "Dodaj domenę" - BUTTON_ADD_ALIAS: "Dodaj Alias" - DELETE_ARE_YOU_SURE: "Czy na pewno?" - HTML_DOMAINS_HELPER: | - Lista domen, do których można uzyskać dostęp poprzez tego klienta. -
- Kliknij na nazwę, aby skonfigurować domenę. - TAB_SECURITY: - LEGEND_SECURITY: "Bezpieczeństwo" - LABEL_ALLOW_TWO_STEP: "Zezwól na dwuskładnikową autoryzację" - LABEL_FORCE_TWO_STEP: "Wymuś dwuskładnikową autoryzację" - LABEL_USE_IMAGE_PROXY: "Użyj lokalnego serwera proxy dla zewnętrznych obrazów" - LABEL_ALLOW_OPEN_PGP: "Zezwól na użycie OpenPGP" - LABEL_SHOW_PHP_INFO: "Pokaż informacje o wersji PHP" - LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Dane dostępowe panelu administracyjnego" - LABEL_CURRENT_PASSWORD: "Bieżące hasło:" - LABEL_NEW_LOGIN: "Nowy login:" - LABEL_NEW_PASSWORD: "Nowe hasło:" - LABEL_REPEAT_PASSWORD: "Powtórz hasło:" - BUTTON_UPDATE_PASSWORD: "Zaktualizuj hasło" - LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: "Wymagaj sprawdzania poprawności certyfikatów SSL (IMAP/SMTP)" - LABEL_ALLOW_SELF_SIGNED: "Zezwól na używanie certyfikatów podpisanych przez siebie" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "Google" - LABEL_ENABLE_GOOGLE: "Włącz obsługę platformy Google" - LABEL_GOOGLE_AUTH: "Autoryzacja" - LABEL_GOOGLE_DRIVE: "Obsługa dysku Google (widok tworz. wiadomości)" - LABEL_GOOGLE_PREVIEW: "Obsługa przeglądarki Google (podgląd dla plików: Microsoft Word, Excel i PowerPoint)" - LABEL_GOOGLE_CLIENT_ID: "Identyfikator:" - LABEL_GOOGLE_CLIENT_SECRET: "Hasło:" - LABEL_GOOGLE_API_KEY: "Klucz API:" - HINT_GOOGLE_API_KEY: "Wymagane dla obsługi interfejsu usługi: 'Dysk Google'" - LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "Włącz obsługę platformy Facebook (autoryzacja)" - LABEL_FACEBOOK_APP_ID: "Identyfikator aplikacji:" - LABEL_FACEBOOK_APP_SECRET: "Hasło aplikacji:" - LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "Włącz obsługę platformy Twitter (autoryzacja)" - LABEL_TWITTER_CONSUMER_KEY: "Klucz użytkownika:" - LABEL_TWITTER_CONSUMER_SECRET: "Hasło użytkownika:" - LEGEND_DROPBOX: "Dropbox" - LABEL_ENABLE_DROPBOX: "Włącz obsługę platformy Dropbox" - LABEL_DROPBOX_API_KEY: "Klucz API:" - TOP_ALERT: "Szczegółowe informacje na temat obsługi platform, można znaleźść pod adresem: " - TAB_PLUGINS: - LEGEND_PLUGINS: "Wtyczki" - LABEL_ENABLE_PLUGINS: "Włącz obsługę wtyczek" - ALERT_NO_PLUGINS: "Nie zainstalowano żadnych wtyczek." - LINK_INSTALL_NEW: "Kliknij tutaj, aby zainstalować nowe wtyczki!" - HINT_CLICK_NAME: "Kliknij na nazwę, aby skonfigurować wtyczkę." - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "Aktualizacja" - LEGEND_AVAILABLE_FOR_INSTALLATION: "Do zainstalowania" - LEGEND_INSTALLED_PACKAGES: "Zainstalowane" - ALERT_CANNOT_ACCESS_REPOSITORY: "Nie można uzyskać dostępu do repozytorium." - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "Domena:" - LABEL_VERSION: "Wersja:" - LABEL_CHECKING: "sprawdzanie..." - TYPE_BASIC_HINT: "Ta domena nie jest licencjonowana do użytku komercyjnego." - TYPE_BASIC_HINT_2: "Nie można dodać licencji dla tej domeny." - HTML_ALERT_TOP_1: "RainLoop Webmail korzysta z licencji:" - HTML_ALERT_TOP_2: "Możesz używać tego klienta za darmo, tylko dla prywatnych (własnych) projektów." - HTML_ALERT_TOP_3: | - Do komercyjnego użytku (używania dodatkowych opcji) RainLoop Webmail, wymagane jest posiadanie -
ważnej subskrypcji. - TYPE_PREMIUM_LIFETIME: "Dożywotnia" - LABEL_SUB_EXPIRES: "Subskrypcja wygasa:" - BUTTON_ACTIVATE: "Aktywuj klucz" - BUTTON_PURCHASE: "Kup klucz" - BUTTON_TRIAL: "Wersja testowa" - TAB_ABOUT: - LEGEND_ABOUT: "O skrypcie" - LABEL_TAG_HINT: "Prosty, nowoczesny i szybki klient pocztowy" - LABEL_ALL_RIGHTS_RESERVED: "Wszystkie prawa zastrzeżone." - HINT_READ_CHANGE_LOG: "Przed aktualizacją, proszę przeczytać listę zmian." - HINT_IS_UP_TO_DATE: "Klient RainLoop jest aktualny." - HTML_NEW_VERSION: "Dostępna jest nowa wersja: %VERSION%." - LABEL_UPDATING: "Aktualizowanie..." - LABEL_CHECKING: "Szukanie aktualizacji..." - BUTTON_UPDATE: "Zaktualizuj" - BUTTON_DOWNLOAD: "Pobierz" - BUTTON_CHANGELOG: "Lista zmian" - POPUPS_ACTIVATE: - TITLE_ACTIVATE: "Aktywacja klucza subskrypcji" - TITLE_ACTIVATION: "Aktywowanie..." - LABEL_DOMAIN: "Domena:" - LABEL_SUB_KEY: "Klucz subskrypcji:" - BUTTON_ACTIVATE: "Aktywuj" - LABEL_ACTIVATED: "Aktywowano" - ERROR_INVALID_SUBS_KEY: "Niepoprawny klucz subskrypcji" - SUBS_KEY_ACTIVATED: "Aktywowano klucz subskrypcji" - HTML_DESC: | - Subskrypcja premium dla domeny: %DOMAIN%, zostanie przedłużona po aktywacji. -
- Zwróc uwagę, że klucz subskrypcji może być aktywowany tylko dla jednej domeny. -

- Po uruchomieniu aktywacji, nie można jej przerwac lub anulować. - POPUPS_DOMAIN_ALIAS: - TITLE_ADD_DOMAIN_ALIAS: "Dodaj Alias" - LABEL_ALIAS: "Alias" - LABEL_DOMAIN: "Domena" - BUTTON_CLOSE: "Zamknij" - BUTTON_ADD: "Dodaj" - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "Dodawanie domeny" - TITLE_ADD_DOMAIN_WITH_NAME: "Dodawanie domeny: \"%NAME%\"" - TITLE_EDIT_DOMAIN: "Edycja domeny: \"%NAME%\"" - LABEL_NAME: "Nazwa" - NAME_HELPER: "obsługiwany znak wieloznaczności - *" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "Serwer:" - LABEL_PORT: "Port:" - LABEL_SECURE: "Rodzaj połączenia:" - LABEL_WHITE_LIST: "Biała lista" - SECURE_OPTION_NONE: "Bez zabezpieczeń" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "STARTTLS" - LABEL_ALLOW_SIEVE_SCRIPTS: "Zezwól na skrypty sieve" - LABEL_ALLOW_USER_SCRIPT: "Zezwól na spersonalizowany skrypt użytkownika" - LABEL_USE_SHORT_LOGIN: "Użyj krótkiego loginu" - LABEL_USE_AUTH: "Użyj autoryzacji" - LABEL_USE_PHP_MAIL: "Użyj funkcji php: 'mail()'" - BUTTON_TEST: "Test" - BUTTON_WHITE_LIST: "Biała lista" - BUTTON_SIEVE_CONFIGURATION: "Konfiguracja sieve" - BUTTON_BACK_TO_IMAP: "Powrót do ustawień serwera IMAP" - BUTTON_BACK: "Wstecz" - BUTTON_CLOSE: "Zamknij" - BUTTON_ADD: "Dodaj" - BUTTON_UPDATE: "Zaktualizuj" - NEW_DOMAIN_DESC: "Konfiguracja tej domeny pozwala na pracę
z adresami email: %NAME%" - WHITE_LIST_ALERT: | - Lista użytkowników domeny, którzy mogą uzyskać dostęp poprzez tego klienta. - Użyj spacji do rozdzielenia. - POPUPS_PLUGIN: - TITLE_PLUGIN: "Wtyczka: " - DESC_NOTHING_TO_CONFIGURE: "Brak opcji do skonfigurowania" - BUTTON_CLOSE: "Zamknij" - BUTTON_SAVE: "Zapisz" - TOOLTIP_ABOUT_TITLE: "O wtyczce" - POPUPS_ASK: - DESC_WANT_CLOSE_THIS_WINDOW: "Czy na pewno chcesz zamknąć to okno?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Wybierz swój język" - HINTS: - BETA: "Beta" - UNSTABLE: "Niestabilna" - WARNING: "Ostrzeżenie!" - NOT_SUPPORTED: "nieobsługiwana" - REQUIRES_PHP_54: "Wymaga PHP w wersji 5.4 lub wyższej" - ERRORS: - DOMAIN_ALREADY_EXISTS: "Ta domena już istnieje" - UNKNOWN_ERROR: "Nieznany błąd" - NOTIFICATIONS: - INVALID_TOKEN: "Nieważny token" - AUTH_ERROR: "Autoryzacja zakończona niepowodzeniem" - ACCESS_ERROR: "Błąd dostępu" - CONNECTION_ERROR: "Nie można połączyć się z serwerem" - CAPTCHA_ERROR: "Niepoprawny kod CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- - Logowanie poprzez tą platformę, nie zostało jeszcze aktywowane dla żadnego - z kont e-mail. Zaloguj się używając loginu i hasła, a następnie włącz tą funkcję - w ustawieniach konta. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- - Logowanie poprzez tą platformę, nie zostało jeszcze aktywowane dla żadnego - z kont e-mail. Zaloguj się używając loginu i hasła, a następnie włącz tą funkcję - w ustawieniach konta. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- - Logowanie poprzez tą platformę, nie zostało jeszcze aktywowane dla żadnego - z kont e-mail. Zaloguj się używając loginu i hasła, a następnie włącz tą funkcję - w ustawieniach konta. - DOMAIN_NOT_ALLOWED: "Brak zezwolenia na użycie tej domeny" - ACCOUNT_NOT_ALLOWED: "Brak zezwolenia dla tego konta" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Wymagana dwuskładnikowa autoryzacja" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Błąd autoryzacji dwuskładnikowej" - COULD_NOT_SAVE_NEW_PASSWORD: "Nie można było zapisać nowego hasła" - CURRENT_PASSWORD_INCORRECT: "Bieżące hasło jest niepoprawne" - NEW_PASSWORD_SHORT: "Wybrane hasło jest za krótkie" - NEW_PASSWORD_WEAK: "Wybrane hasło jest zbyt proste" - NEW_PASSWORD_FORBIDDENT: "Wybrane hasło zawiera zakazane znaki" - CONTACTS_SYNC_ERROR: "Błąd synchronizacji kontaktów" - CANT_GET_MESSAGE_LIST: "Nie można pobrać listy wiadomości" - CANT_GET_MESSAGE: "Nie można pobrać wiadomości" - CANT_DELETE_MESSAGE: "Nie można usunąć wiadomości" - CANT_MOVE_MESSAGE: "Nie można przenieść wiadomości" - CANT_SAVE_MESSAGE: "Nie można zapisać wiadomości" - CANT_SEND_MESSAGE: "Nie można wysłać wiadomości" - INVALID_RECIPIENTS: "Niepoprawny adres odbiorcy" - CANT_SAVE_FILTERS: "Nie można zapisać filtrów" - CANT_GET_FILTERS: "Nie można pobrać filtrów" - FILTERS_ARE_NOT_CORRECT: "Brak poprawności filtrów" - CANT_CREATE_FOLDER: "Nie można utworzyć folderu" - CANT_RENAME_FOLDER: "Nie można zmienić nazwy folderu" - CANT_DELETE_FOLDER: "Nie można usunąć folderu" - CANT_DELETE_NON_EMPTY_FOLDER: "Nie można usunąć folderu, w którym znajduje się zawartość" - CANT_SUBSCRIBE_FOLDER: "Nie można zasubskrybować folderu" - CANT_UNSUBSCRIBE_FOLDER: "Nie można usunąć subskrypcji folderu" - CANT_SAVE_SETTINGS: "Nie można zapisać ustawień" - CANT_SAVE_PLUGIN_SETTINGS: "Nie można zapisać ustawień wtyczki" - DOMAIN_ALREADY_EXISTS: "Ta domena już istnieje" - CANT_INSTALL_PACKAGE: "Instalacja wtyczki zakończona niepowodzeniem" - CANT_DELETE_PACKAGE: "Usunięcie wtyczki zakończone niepowodzeniem" - INVALID_PLUGIN_PACKAGE: "Niepoprawna wtyczka" - UNSUPPORTED_PLUGIN_PACKAGE: "Nieobsługiwana wtyczka" - LICENSING_SERVER_IS_UNAVAILABLE: "Serwer aktywacji subskrypcji jest niedostępny" - LICENSING_DOMAIN_EXPIRED: "Subskrypcja dla tej domeny wygasła." - LICENSING_DOMAIN_BANNED: "Subskrypcja dla tej domeny została zawieszona." - DEMO_SEND_MESSAGE_ERROR: "Ze względów bezpieczeństwa, to konto nie posiada zezwolenia na wysyłanie wiadomości na zewnętrzne adresy e-mail!" - DEMO_ACCOUNT_ERROR: "Ze względów bezpieczeństwa, to konto nie posiada uprawnień do wykonania tego zadania!" - ACCOUNT_ALREADY_EXISTS: "To konto już istnieje" - ACCOUNT_DOES_NOT_EXIST: "Konto nie istnieje" - MAIL_SERVER_ERROR: "Wystąpił błąd podczas dostępu do serwera" - INVALID_INPUT_ARGUMENT: "Niepoprawny argument wejścia" - UNKNOWN_ERROR: "Nieznany błąd" - STATIC: - BACK_LINK: "Odśwież" - DOMAIN_LIST_DESC: "Lista domen, do których można uzyskać dostęp za pomocą tego klienta." - PHP_EXSTENSIONS_ERROR_DESC: "Brak wymaganych rozszerzeń w konfiguracji PHP!" - PHP_VERSION_ERROR_DESC: "Twoja wersja PHP: (%VERSION%), jest niższa niż minimalna: 5.3.0!" - NO_SCRIPT_TITLE: "Ta aplikacja do poprawnej pracy wymaga javascript-u." - NO_SCRIPT_DESC: | - Twoja przeglądarka nie obsługuje javascript-u. - Proszę o jego włączenie i ponowną próbę. - NO_COOKIE_TITLE: "Obsługa plików cookies jest wymagana dla poprawnego działania skryptu." - NO_COOKIE_DESC: | - Twoja przeglądarka nie obsługuje plików cookies. - Proszę o ich włączenie i ponowną próbę. - BAD_BROWSER_TITLE: "Posiadasz nieaktualną wersję przeglądarki." - BAD_BROWSER_DESC: | - W celu wykorzystania wszystkich funkcji tej aplikacji, - zaktualizuj aktualnie używaną lub pobierz i zainstaluj jedną z poniższych przeglądarek: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/pt_BR.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/pt_BR.yml deleted file mode 100755 index 0179fb8f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/pt_BR.yml +++ /dev/null @@ -1,323 +0,0 @@ -pt_BR: - LOGIN: - LABEL_LOGIN: "Usuário" - LABEL_PASSWORD: "Senha" - BUTTON_LOGIN: "Entrar no painel administrativo" - TOP_PANEL: - LABEL_PREMIUM: "Premium" - LABEL_ADMIN_PANEL: "Painel Administrativo" - TABS_LABELS: - LABEL_GENERAL_NAME: "Geral" - LABEL_LOGIN_NAME: "Login" - LABEL_BRANDING_NAME: "Personalizar" - LABEL_CONTACTS_NAME: "Contatos" - LABEL_DOMAINS_NAME: "Domínios" - LABEL_SECURITY_NAME: "Segurança" - LABEL_INTEGRATION_NAME: "Integrações" - LABEL_PLUGINS_NAME: "Plugins" - LABEL_PACKAGES_NAME: "Pacotes" - LABEL_LICENSING_NAME: "Licença" - LABEL_ABOUT_NAME: "Sobre" - TAB_GENERAL: - LEGEND_INTERFACE: "Interface" - LABEL_LANGUAGE: "Idioma" - LABEL_LANGUAGE_ADMIN: "Idioma (admin)" - LABEL_THEME: "Tema Padrão" - LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Permitir escolha do idioma na tela de configurações" - LABEL_ALLOW_THEMES_ON_SETTINGS: "Permitir escolha do tema na tela de configurações" - LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Permitir escolha de Imagem de Fundo na tela de configurações" - LABEL_NEW_FOLDER_MOVE: "Novo botão \"Mover para pasta\"" - LABEL_SHOW_THUMBNAILS: "Mostrar imagem miniatura (Anexos)" - LABEL_ALLOW_GRAVATAR: "Permitir Gravatar" - LEGEND_MAIN: "Principal" - LABEL_ATTACHMENT_SIZE_LIMIT: "Tamanho limite de anexo" - LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Permitir contas adicionais" - LABEL_ALLOW_IDENTITIES: "Permitir identidades multiplas" - LABEL_ALLOW_TEMPLATES: "Permitir templates" - ALERT_WARNING: "Aviso!" - HTML_ALERT_WEAK_PASSWORD: | - Você está usando a senha administrativa padrão. -
- Por motivo de segurança por favor - troque a senha - agora. - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "Tela de entrada" - LABEL_DEFAULT_DOMAIN: "Domínio padrão" - LABEL_DETERMINE_USER_DOMAIN: "Tentar determinar o domínio do usuário" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Permitir escolha do idioma na tela de entrada" - LABEL_DETERMINE_USER_LANGUAGE: "Tentar determinar o idioma do usuário" - TAB_BRANDING: - LEGEND_BRANDING: "Personalização" - LABEL_PAGE_TITLE: "Título da página" - LABEL_LOADING_DESCRIPTION: "Descrição do 'carregando'" - LABEL_FAVICON_URL: "Favicon" - LEGEND_LOGIN: "Tela de Entrada" - LABEL_LOGIN_LOGO: "Logo" - LABEL_LOGIN_DESCRIPTION: "Descrição" - LABEL_LOGIN_BACKGROUND: "Imagem de fundo" - LABEL_LOGIN_CUSTOM_CSS: "CSS personalizado" - LABEL_LOGIN_SHOW_POWERED_LINK: "Mostrar link \"Powered by RainLoop\"" - LEGEND_USER: "Internas" - LABEL_USER_LOGO: "Logo" - LABEL_USER_LOGO_TITLE: "Título do logo" - LABEL_USER_LOGO_MESSAGE: "Logo (Visualização de Mensagens)" - LABEL_USER_CUSTOM_CSS: "CSS personalizado" - LEGEND_WELCOME_PAGE: "Página de boas-vindas" - LABEL_WELCOME_PAGE_TITLE: "Título" - LABEL_WELCOME_PAGE_URL: "URL" - LABEL_WELCOME_PAGE_DISPLAY: "Mostrar" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "Nunca" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Única vez" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Sempre" - HTML_ALERT_PREMIUM: "Essa funcionalidade está disponível apenas para usuários Premium." - TAB_CONTACTS: - LEGEND_CONTACTS: "Contatos" - LEGEND_STORAGE: "Armazenamento (PDO)" - LABEL_ENABLE_CONTACTS: "Habilitar contatos" - LABEL_ALLOW_SYNC: "Permitir sincronização de contatos (com servidor externo CardDAV)" - LABEL_STORAGE_TYPE: "Tipo" - LABEL_STORAGE_DSN: "Dsn" - LABEL_STORAGE_USER: "Usuário" - LABEL_STORAGE_PASSWORD: "Senha" - BUTTON_TEST: "Testar" - ALERT_NOTICE: "Aviso!" - HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Não use este tipo de banco de dados com um grande número de usuários ativos." - HTML_ALERT_DOES_NOT_SUPPORTED: | - O seu sistema não suporta o uso dos contatos. -
- Você precisa instalar ou habilitar a extensão PDO (SQLite / MySQL / PostgreSQL) em seu servidor. - TAB_DOMAINS: - LEGEND_DOMAINS: "Domínios" - BUTTON_ADD_DOMAIN: "Adicionar Domínio" - BUTTON_ADD_ALIAS: "Adicionar apelido (Alias)" - DELETE_ARE_YOU_SURE: "Você tem certeza?" - HTML_DOMAINS_HELPER: | - Lista dos domínios com acesso permitido ao webmail. -
- Clique no domínio para configurá-lo. - TAB_SECURITY: - LEGEND_SECURITY: "Segurança" - LABEL_ALLOW_TWO_STEP: "Permitir verificação em duas etapas (Login 2-Step)" - LABEL_FORCE_TWO_STEP: "Obrigar o uso da verificação em duas etapas" - LABEL_USE_IMAGE_PROXY: "Usar proxy local para imagens externas" - LABEL_ALLOW_OPEN_PGP: "Permitir OpenPGP" - LABEL_SHOW_PHP_INFO: "Mostar informações PHP" - LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Credenciais de acesso ao Painel Administrativo" - LABEL_CURRENT_PASSWORD: "Senha atual" - LABEL_NEW_LOGIN: "Usuário" - LABEL_NEW_PASSWORD: "Nova senha" - LABEL_REPEAT_PASSWORD: "Confirmar nova senha" - BUTTON_UPDATE_PASSWORD: "Atualizar" - LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: "Exigir verificação do certificado SSL (IMAP/SMTP)" - LABEL_ALLOW_SELF_SIGNED: "Permitir certificados auto-assinados" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "Google" - LABEL_ENABLE_GOOGLE: "Habilitar integração com o Google" - LABEL_GOOGLE_AUTH: "Autenticação" - LABEL_GOOGLE_DRIVE: "Integração com Google Drive (Anexos)" - LABEL_GOOGLE_PREVIEW: "Integração com Leitor Google (Pré-visualização para Microsoft Word, Excel e PowerPoint)" - LABEL_GOOGLE_CLIENT_ID: "Client ID" - LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" - LABEL_GOOGLE_API_KEY: "Api Key" - HINT_GOOGLE_API_KEY: "Requerido para o uso da seleção de arquivos do Google Drive" - LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "Habilitar integração com o Facebook (Autenticação)" - LABEL_FACEBOOK_APP_ID: "App ID" - LABEL_FACEBOOK_APP_SECRET: "App Secret" - LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "Habilitar integração com o Twitter (Autenticação)" - LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" - LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" - LEGEND_DROPBOX: "Dropbox" - LABEL_ENABLE_DROPBOX: "Habilitar integração com o Dropbox" - LABEL_DROPBOX_API_KEY: "Api Key" - TOP_ALERT: "Informações detalhadas sobre as integrações em" - TAB_PLUGINS: - LEGEND_PLUGINS: "Plugins" - LABEL_ENABLE_PLUGINS: "Habilitar uso de plugins" - ALERT_NO_PLUGINS: "Nenhum plugin instalado." - LINK_INSTALL_NEW: "Clique aqui para instalar!" - HINT_CLICK_NAME: "Clique no nome para configurar o plugin." - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "Atualização disponível" - LEGEND_AVAILABLE_FOR_INSTALLATION: "Disponíveis para instalação" - LEGEND_INSTALLED_PACKAGES: "Pacotes já instalados" - ALERT_CANNOT_ACCESS_REPOSITORY: "Não foi possível acessar o repositório no momento." - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "Seu domínio" - LABEL_VERSION: "Versão" - LABEL_CHECKING: "Checando" - TYPE_BASIC_HINT: "Esse domínio não está licenciado para uso comercial (com recursos adicionais)." - TYPE_BASIC_HINT_2: "Esse domínio não pode ser licenciado." - HTML_ALERT_TOP_1: "RainLoop Webmail é licenciado sob" - HTML_ALERT_TOP_2: "Você é livre para usá-lo em seus projetos pessoais." - HTML_ALERT_TOP_3: | - Uso comercial (com recursos adicionais) do RainLoop Webmail - requer uma assinatura. - TYPE_PREMIUM_LIFETIME: "Lifetime" - LABEL_SUB_EXPIRES: "A assinatura expira em" - BUTTON_ACTIVATE: "Ative a chave de assinatura para este domínio" - BUTTON_PURCHASE: "Comprar assinatura" - BUTTON_TRIAL: "Trial" - TAB_ABOUT: - LEGEND_ABOUT: "Sobre" - LABEL_TAG_HINT: "Leitor de email web simples, moderno & rápido." - LABEL_ALL_RIGHTS_RESERVED: "Todos os direitos reservados." - HINT_READ_CHANGE_LOG: "Por favor, leia o registro de alterações antes de atualizar." - HINT_IS_UP_TO_DATE: "RainLoop está atualizado." - HTML_NEW_VERSION: "Está disponível uma nova versão: %VERSION%." - LABEL_UPDATING: "Atualizando" - LABEL_CHECKING: "Checar por atualizações" - BUTTON_UPDATE: "Atualizar" - BUTTON_DOWNLOAD: "Baixar" - BUTTON_CHANGELOG: "Registro de alterações" - POPUPS_ACTIVATE: - TITLE_ACTIVATE: "Ativar chave de assinatura?" - TITLE_ACTIVATION: "Ativação..." - LABEL_DOMAIN: "Domínio" - LABEL_SUB_KEY: "Chave de assinatura" - BUTTON_ACTIVATE: "Ativar" - LABEL_ACTIVATED: "Ativado" - ERROR_INVALID_SUBS_KEY: "Chave de assinatura inválida" - SUBS_KEY_ACTIVATED: "Chave de assinatura ativada com sucesso" - HTML_DESC: | - Após a ativação, a assinatura premium para %DOMAIN% será extendida. -
- Note que chave de assinatura é ativada apenas para um único domínio. -

- Uma vez iniciado, o processo de ativação não poderá ser interrompido ou cancelado. - POPUPS_DOMAIN_ALIAS: - TITLE_ADD_DOMAIN_ALIAS: "Adicionar apelido (Alias)" - LABEL_ALIAS: "Apelido (Alias)" - LABEL_DOMAIN: "Domínio" - BUTTON_CLOSE: "Fechar" - BUTTON_ADD: "Adicionar" - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "Adicionar Domínio" - TITLE_ADD_DOMAIN_WITH_NAME: "Adicionar Domínio \"%NAME%\"" - TITLE_EDIT_DOMAIN: "Editar Domínio \"%NAME%\"" - LABEL_NAME: "Domínio" - NAME_HELPER: "curinga (wildcard) suportado" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "Servidor" - LABEL_PORT: "Porta" - LABEL_SECURE: "Criptografia" - LABEL_WHITE_LIST: "Lista branca" - SECURE_OPTION_NONE: "Nenhuma" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "STARTTLS" - LABEL_ALLOW_SIEVE_SCRIPTS: "Permitir scripts sieve" - LABEL_ALLOW_USER_SCRIPT: "Permitir scripts personalizados por usuários" - LABEL_USE_SHORT_LOGIN: "Usar login curto" - LABEL_USE_AUTH: "Usar autenticação" - LABEL_USE_PHP_MAIL: "Usar função php mail()" - BUTTON_TEST: "Testar" - BUTTON_WHITE_LIST: "Lista branca" - BUTTON_SIEVE_CONFIGURATION: "Configurações Sieve" - BUTTON_BACK_TO_IMAP: "Voltar para as configurações IMAP" - BUTTON_BACK: "Voltar" - BUTTON_CLOSE: "Fechar" - BUTTON_ADD: "Adicionar" - BUTTON_UPDATE: "Atualizar" - NEW_DOMAIN_DESC: "Esta configuração de domínio lhe permitirá trabalhar
com endereços de e-mail do %NAME%." - WHITE_LIST_ALERT: | - Filtrar com lista dos únicos usuários do domínio que terão acesso ao webmail. - Use um espaço como delimitador. - POPUPS_PLUGIN: - TITLE_PLUGIN: "Plugin" - DESC_NOTHING_TO_CONFIGURE: "Nada para configurar" - BUTTON_CLOSE: "Fechar" - BUTTON_SAVE: "Salvar" - TOOLTIP_ABOUT_TITLE: "Sobre" - POPUPS_ASK: - DESC_WANT_CLOSE_THIS_WINDOW: "Você tem certeza que deseja fechar esta janela?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Selecionar idioma" - HINTS: - BETA: "beta" - UNSTABLE: "instável" - WARNING: "Aviso!" - NOT_SUPPORTED: "não suportado" - REQUIRES_PHP_54: "requer PHP 5.4 ou superior" - ERRORS: - DOMAIN_ALREADY_EXISTS: "Domínio já existente" - UNKNOWN_ERROR: "Erro desconhecido" - NOTIFICATIONS: - INVALID_TOKEN: "Senha inválida" - AUTH_ERROR: "Falha na autenticação" - ACCESS_ERROR: "Erro ao acessar" - CONNECTION_ERROR: "Não foi possível conectar ao servidor" - CAPTCHA_ERROR: "Verificação CAPTCHA inválido." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- - Esse usuário Facebook não está associado a nenhuma conta de email ainda. Entre - utilizando seu email e senha e habilite essa função em configurações de conta. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- - Esse usuário Twitter não está associado a nenhuma conta de email ainda. Entre - utilizando seu email e senha e habilite essa função em configurações de conta. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- - Esse usuário Google não está associado a nenhuma conta de email ainda. Entre - utilizando seu email e senha e habilite essa função em configurações de conta. - DOMAIN_NOT_ALLOWED: "Este domínio não é permitido" - ACCOUNT_NOT_ALLOWED: "Conta não permitida" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Verificação de duas etapas requerida" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Erro na verificação de duas etapas" - COULD_NOT_SAVE_NEW_PASSWORD: "Não foi possível salvar a nova senha" - CURRENT_PASSWORD_INCORRECT: "Senha atual incorreta" - NEW_PASSWORD_SHORT: "A senha é muito curta" - NEW_PASSWORD_WEAK: "A senha é muito fácil" - NEW_PASSWORD_FORBIDDENT: "A senha contém caracteres não permitidos" - CONTACTS_SYNC_ERROR: "Erro na sincronização dos contatos" - CANT_GET_MESSAGE_LIST: "Não foi possível obter a lista de mensagens" - CANT_GET_MESSAGE: "Não foi possível obter a mensagem" - CANT_DELETE_MESSAGE: "Não foi possível excluir a mensagem" - CANT_MOVE_MESSAGE: "Não foi possível mover a mensagem" - CANT_SAVE_MESSAGE: "Não foi possível salvar a mensagem" - CANT_SEND_MESSAGE: "Não foi possível enviar a mensagem" - INVALID_RECIPIENTS: "Destinatário inválido" - CANT_SAVE_FILTERS: "Não é possível salvar os filtros" - CANT_GET_FILTERS: "Não é possível obter os filtros" - FILTERS_ARE_NOT_CORRECT: "Os filtros não estão corretos" - CANT_CREATE_FOLDER: "Não foi possível criar a pasta" - CANT_RENAME_FOLDER: "Não foi possível renomear a pasta" - CANT_DELETE_FOLDER: "Não foi possível exluir a pasta" - CANT_DELETE_NON_EMPTY_FOLDER: "Não é possível excluir diretório não vazio" - CANT_SUBSCRIBE_FOLDER: "Não foi possível inscrever esta pasta" - CANT_UNSUBSCRIBE_FOLDER: "Não foi possível desinscrever esta pasta" - CANT_SAVE_SETTINGS: "Não foi possível salvar as configurações" - CANT_SAVE_PLUGIN_SETTINGS: "Não foi possível salvar as configurações" - DOMAIN_ALREADY_EXISTS: "O domínio já existe" - CANT_INSTALL_PACKAGE: "Erro ao instalar pacote de plugin" - CANT_DELETE_PACKAGE: "Erro ao remover pacote de plugin" - INVALID_PLUGIN_PACKAGE: "Pacote de plugins inválido" - UNSUPPORTED_PLUGIN_PACKAGE: "Pacote de plugins insuportados" - LICENSING_SERVER_IS_UNAVAILABLE: "A assinatura do servidor está indisponível" - LICENSING_DOMAIN_EXPIRED: "A assinatura para este domínio expirou." - LICENSING_DOMAIN_BANNED: "A assinatura para este domínio é proibida." - DEMO_SEND_MESSAGE_ERROR: "Por motivos de segurança, esta conta demo não tem permissão para enviar mensagens para endereços de e-mail externo!" - DEMO_ACCOUNT_ERROR: "Por motivos de segurança, esta conta não tem permição para esta ação!" - ACCOUNT_ALREADY_EXISTS: "Esta conta já existe" - ACCOUNT_DOES_NOT_EXIST: "Conta não existente" - MAIL_SERVER_ERROR: "Ocorreu um erro ao acessar o servidor de e-mail" - INVALID_INPUT_ARGUMENT: "Argumento de entrada inválido" - UNKNOWN_ERROR: "Erro desconhecido" - STATIC: - BACK_LINK: "Recarregar" - DOMAIN_LIST_DESC: "A lista de domínios de webmail tem permissão para acessar." - PHP_EXSTENSIONS_ERROR_DESC: "Extensões necessárias PHP não estão disponíveis na sua configuração do PHP!" - PHP_VERSION_ERROR_DESC: "Sua versão PHP (%VERSION%) é menor do que o mínimo exigido 5.3.0!" - NO_SCRIPT_TITLE: "JavaScript é necessário para esta aplicação." - NO_SCRIPT_DESC: | - O JavaScript não está disponível em seu navegador. - Por favor ative o suporte a JavaScript nas configurações do seu navegador e tente novamente. - NO_COOKIE_TITLE: "É necessário suporte a cookies para esta aplicação." - NO_COOKIE_DESC: | - Os Cookies não estão disponíveis em seu navegador. - Por favor ative o suporte a Cookies nas configurações do seu navegador e tente novamente. - BAD_BROWSER_TITLE: "Seu navegador está desatualizado." - BAD_BROWSER_DESC: | - Para usar todos os recursos do aplicativo, - baixe e instale um desses navegadores: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/ru_RU.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/ru_RU.yml deleted file mode 100755 index 17bfde0f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/ru_RU.yml +++ /dev/null @@ -1,323 +0,0 @@ -ru_RU: - LOGIN: - LABEL_LOGIN: "Логин" - LABEL_PASSWORD: "Пароль" - BUTTON_LOGIN: "Войти в админ панель" - TOP_PANEL: - LABEL_PREMIUM: "Премиум" - LABEL_ADMIN_PANEL: "Админка" - TABS_LABELS: - LABEL_GENERAL_NAME: "Основные" - LABEL_LOGIN_NAME: "Логин" - LABEL_BRANDING_NAME: "Брендинг" - LABEL_CONTACTS_NAME: "Контакты" - LABEL_DOMAINS_NAME: "Домены" - LABEL_SECURITY_NAME: "Безопасность" - LABEL_INTEGRATION_NAME: "Интеграция" - LABEL_PLUGINS_NAME: "Плагины" - LABEL_PACKAGES_NAME: "Пакеты" - LABEL_LICENSING_NAME: "Лицензия" - LABEL_ABOUT_NAME: "О Программе" - TAB_GENERAL: - LEGEND_INTERFACE: "Интерфейс" - LABEL_LANGUAGE: "Язык" - LABEL_LANGUAGE_ADMIN: "Язык (Админ)" - LABEL_THEME: "Тема" - LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Разрешить выбор языка на экране настроек" - LABEL_ALLOW_THEMES_ON_SETTINGS: "Разрешить выбор темы на экране настроек" - LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Allow background selection on settings screen" - LABEL_NEW_FOLDER_MOVE: "Новая кнопка \"переместить в папку\"" - LABEL_SHOW_THUMBNAILS: "Показывать миниатюры (для вложений)" - LABEL_ALLOW_GRAVATAR: "Разрешить граватары" - LEGEND_MAIN: "Основное" - LABEL_ATTACHMENT_SIZE_LIMIT: "Предельный размер вложений" - LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Разрешить дополнительные аккаунты" - LABEL_ALLOW_IDENTITIES: "Разрешить множественные профили" - LABEL_ALLOW_TEMPLATES: "Разрешить шаблоны" - ALERT_DATA_ACCESS: "Папка данных RainLoop доступна. Пожалуйста, настройте свой веб-сервер так, чтобы скрыть папку данных с внешнего доступа. Подробнее здесь:" - ALERT_WARNING: "Внимание!" - HTML_ALERT_WEAK_PASSWORD: | - Вы используете пароль администратора по умолчанию. -
- По соображениям безопасности, пожалуйста, - измените пароль прямо сейчас. - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "Cтраница Входа" - LABEL_DEFAULT_DOMAIN: "Основной домен" - LABEL_DETERMINE_USER_DOMAIN: "Пытаться определить домен пользователя" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Разрешить выбор языка на странице входа" - LABEL_DETERMINE_USER_LANGUAGE: "Пытаться определить язык пользователя" - TAB_BRANDING: - LEGEND_BRANDING: "Брендинг" - LABEL_PAGE_TITLE: "Название страницы" - LABEL_LOADING_DESCRIPTION: "Описание при загрузке" - LABEL_FAVICON_URL: "Иконка (favicon)" - LEGEND_LOGIN: "Экран входа" - LABEL_LOGIN_LOGO: "Логотип" - LABEL_LOGIN_DESCRIPTION: "Описание" - LABEL_LOGIN_BACKGROUND: "Фоновая картинка" - LABEL_LOGIN_CUSTOM_CSS: "Кастомный CSS" - LABEL_LOGIN_SHOW_POWERED_LINK: "Показывать ссылку \"Powered by RainLoop\"" - LEGEND_USER: "Экран пользователя" - LABEL_USER_LOGO: "Логотип" - LABEL_USER_LOGO_TITLE: "Название логотипа" - LABEL_USER_LOGO_MESSAGE: "Логотип (Message View)" - LABEL_USER_CUSTOM_CSS: "Кастомный CSS" - LEGEND_WELCOME_PAGE: "Приветствие" - LABEL_WELCOME_PAGE_TITLE: "Название" - LABEL_WELCOME_PAGE_URL: "URL" - LABEL_WELCOME_PAGE_DISPLAY: "Показывать" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "Никогда" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Один раз" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Всегда" - HTML_ALERT_PREMIUM: "Эти функции доступны для премиум подписчиков." - TAB_CONTACTS: - LEGEND_CONTACTS: "Контакты" - LEGEND_STORAGE: "Хранилище (PDO)" - LABEL_ENABLE_CONTACTS: "Включить контакты" - LABEL_ALLOW_SYNC: "Разрешить синхронизацию контактов (с внешним CardDAV сервером)" - LABEL_STORAGE_TYPE: "Тип" - LABEL_STORAGE_DSN: "Dsn" - LABEL_STORAGE_USER: "Пользователь" - LABEL_STORAGE_PASSWORD: "Пароль" - BUTTON_TEST: "Тест" - ALERT_NOTICE: "Внимание!" - HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Не используйте этот тип базы данных с большим числом активных пользователей." - HTML_ALERT_DOES_NOT_SUPPORTED: | - Ваша система не поддерживает контакты. -
- Вам необходимо установить или включить PDO (SQLite / MySQL / PostgreSQL) расширения на вашем сервере. - TAB_DOMAINS: - LEGEND_DOMAINS: "Домены" - BUTTON_ADD_DOMAIN: "Добавить домен" - BUTTON_ADD_ALIAS: "Добавить Алиас" - DELETE_ARE_YOU_SURE: "Вы уверены?" - HTML_DOMAINS_HELPER: | - Список доменов к которым разрешен доступ. -
- Нажмите на имя, чтобы настроить домен. - TAB_SECURITY: - LEGEND_SECURITY: "Безопасность" - LABEL_ALLOW_TWO_STEP: "Разрешить 2-шаговую проверку" - LABEL_FORCE_TWO_STEP: "Форсировать 2-шаговую проверку" - LABEL_USE_IMAGE_PROXY: "Использовать локальный прокси для внешних изображений" - LABEL_ALLOW_OPEN_PGP: "Разрешить OpenPGP" - LABEL_SHOW_PHP_INFO: "Показать PHP информацию" - LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Admin Panel Access Credentials" - LABEL_CURRENT_PASSWORD: "Текущий пароль" - LABEL_NEW_LOGIN: "Новый логин" - LABEL_NEW_PASSWORD: "Новый пароль" - LABEL_REPEAT_PASSWORD: "Повторить пароль" - BUTTON_UPDATE_PASSWORD: "Обновить пароль" - LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: "Требовать проверку SSL сертификата для IMAP и SMTP" - LABEL_ALLOW_SELF_SIGNED: "Разрешить cамоподписанные сертификаты" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "Google" - LABEL_ENABLE_GOOGLE: "Включить Google интеграцию" - LABEL_GOOGLE_AUTH: "Авторизация" - LABEL_GOOGLE_DRIVE: "Google диск интеграция (Экран нового сообщения)" - LABEL_GOOGLE_PREVIEW: "Google просмотрщик интеграция (Превью для Microsoft Word, Excel и PowerPoint файлов)" - LABEL_GOOGLE_CLIENT_ID: "Client ID" - LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" - LABEL_GOOGLE_API_KEY: "Api Key" - HINT_GOOGLE_API_KEY: "Требуется для Google Drive File Picker" - LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "Включить Facebook интеграцию (Авторизация)" - LABEL_FACEBOOK_APP_ID: "App ID" - LABEL_FACEBOOK_APP_SECRET: "App Secret" - LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "Включить Twitter интеграцию (Авторизация)" - LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" - LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" - LEGEND_DROPBOX: "Dropbox" - LABEL_ENABLE_DROPBOX: "Включить Dropbox интеграцию" - LABEL_DROPBOX_API_KEY: "Api Key" - TOP_ALERT: "Подробная информация о социальной интеграции находится на" - TAB_PLUGINS: - LEGEND_PLUGINS: "Плагины" - LABEL_ENABLE_PLUGINS: "Включить плагины" - ALERT_NO_PLUGINS: "Плагины пока не установлены." - LINK_INSTALL_NEW: "Нажмите здесь, чтобы установить плагин" - HINT_CLICK_NAME: "Нажмите на имя, чтобы настроить плагин." - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "Доступно для обновления" - LEGEND_AVAILABLE_FOR_INSTALLATION: "Доступно для установки" - LEGEND_INSTALLED_PACKAGES: "Установленные пакеты" - ALERT_CANNOT_ACCESS_REPOSITORY: "Не удается получить доступ к хранилищу пакетов в данный момент." - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "Ваш домен" - LABEL_VERSION: "Версия" - LABEL_CHECKING: "Проверка" - TYPE_BASIC_HINT: "Этот домен не имеет лицензию для коммерческого использования (с дополнительными функциями)." - TYPE_BASIC_HINT_2: "Этот домен не может быть лицензирован." - HTML_ALERT_TOP_1: "Код RainLoop Webmail лицензирован под" - HTML_ALERT_TOP_2: "Вы можете свободно использовать его в своих личных проектах." - HTML_ALERT_TOP_3: | - Коммерческое использование (с дополнительными функциями) RainLoop Webmail требует получение - лицензии. - TYPE_PREMIUM_LIFETIME: "бесконечная" - LABEL_SUB_EXPIRES: "Подписка истекает" - BUTTON_ACTIVATE: "Активировать ключ для этого домена" - BUTTON_PURCHASE: "Купить" - BUTTON_TRIAL: "Пробная лицензия" - TAB_ABOUT: - LEGEND_ABOUT: "О программе" - LABEL_TAG_HINT: "Простой, современный и быстрый веб-клиент электронной почты\n" - LABEL_ALL_RIGHTS_RESERVED: "Все права защищены." - HINT_READ_CHANGE_LOG: "Пожалуйста, ознакомьтесь с изменениями перед обновлением.\n" - HINT_IS_UP_TO_DATE: "Версия RainLoop актуальна." - HTML_NEW_VERSION: "Новая %VERSION% версия доступна." - LABEL_UPDATING: "Обновление" - LABEL_CHECKING: "Проверка" - BUTTON_UPDATE: "Обновить" - BUTTON_DOWNLOAD: "Скачать" - BUTTON_CHANGELOG: "Изменения" - POPUPS_ACTIVATE: - TITLE_ACTIVATE: "Активировать ключ подписки?" - TITLE_ACTIVATION: "Активация..." - LABEL_DOMAIN: "Домен" - LABEL_SUB_KEY: "Ключ подписки" - BUTTON_ACTIVATE: "Активировать" - LABEL_ACTIVATED: "Активировано" - ERROR_INVALID_SUBS_KEY: "Неверный ключ подписки" - SUBS_KEY_ACTIVATED: "Ключ подписки активирован удачно" - HTML_DESC: | - После активации премиум подписка для %DOMAIN% будет продлена. -
- Обратите внимание, что ключ может быть активирован только один раз. -

- После запуска процесс активации не может быть прерван или отменен. - POPUPS_DOMAIN_ALIAS: - TITLE_ADD_DOMAIN_ALIAS: "Добавить Алиас" - LABEL_ALIAS: "Алиас" - LABEL_DOMAIN: "Домен" - BUTTON_CLOSE: "Закрыть" - BUTTON_ADD: "Добавить" - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "Добавить домен" - TITLE_ADD_DOMAIN_WITH_NAME: "Добавить домен \"%NAME%\"" - TITLE_EDIT_DOMAIN: "Редактировать домен \"%NAME%\"" - LABEL_NAME: "Имя" - NAME_HELPER: "wildcard supported" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "Сервер" - LABEL_PORT: "Порт" - LABEL_SECURE: "Безопасность" - LABEL_WHITE_LIST: "Белый список" - SECURE_OPTION_NONE: "Нет" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "STARTTLS" - LABEL_ALLOW_SIEVE_SCRIPTS: "Разрешить sieve скрипты" - LABEL_ALLOW_USER_SCRIPT: "Разрешить использовать пользовательский sieve скрипт" - LABEL_USE_SHORT_LOGIN: "Использовать короткий логин" - LABEL_USE_AUTH: "Использовать аутентификацию" - LABEL_USE_PHP_MAIL: "Использовать mail() функцию" - BUTTON_TEST: "Тест" - BUTTON_WHITE_LIST: "Белый список" - BUTTON_SIEVE_CONFIGURATION: "настройки Sieve" - BUTTON_BACK_TO_IMAP: "Назад к IMAP настройкам" - BUTTON_BACK: "Назад" - BUTTON_CLOSE: "Закрыть" - BUTTON_ADD: "Добавить" - BUTTON_UPDATE: "Обновить" - NEW_DOMAIN_DESC: "Эта конфигурация позволит вам работать
с %NAME% адресами." - WHITE_LIST_ALERT: | - Список пользователей домена к которым разрешен доступ. - Используйте пробел в качестве разделителя. - POPUPS_PLUGIN: - TITLE_PLUGIN: "Плагин" - DESC_NOTHING_TO_CONFIGURE: "Без настроек" - BUTTON_CLOSE: "Закрыть" - BUTTON_SAVE: "Сохранить" - TOOLTIP_ABOUT_TITLE: "О плагине" - POPUPS_ASK: - DESC_WANT_CLOSE_THIS_WINDOW: "Вы уверены, что хотите закрыть это окно?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Выберите язык" - HINTS: - BETA: "beta" - UNSTABLE: "unstable" - WARNING: "Внимание!" - NOT_SUPPORTED: "не поддерживается" - REQUIRES_PHP_54: "требует PHP 5.4 или выше" - ERRORS: - DOMAIN_ALREADY_EXISTS: "Домен уже существует" - UNKNOWN_ERROR: "Неизвестная ошибка" - NOTIFICATIONS: - INVALID_TOKEN: "Неверный токен запроса" - AUTH_ERROR: "Не удалось авторизоваться" - ACCESS_ERROR: "Ошибка доступа" - CONNECTION_ERROR: "Ошибка соединения с сервером." - CAPTCHA_ERROR: "Неправильное проверочное слово." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - К данному социальному пользователю еще не прикреплен почтовый аккаунт. Войдите - в систему под своим почтовым аккаунтом и включите эту возможность в настройках. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - К данному социальному пользователю еще не прикреплен почтовый аккаунт. Войдите - в систему под своим почтовым аккаунтом и включите эту возможность в настройках. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - К данному социальному пользователю еще не прикреплен почтовый аккаунт. Войдите - в систему под своим почтовым аккаунтом и включите эту возможность в настройках. - DOMAIN_NOT_ALLOWED: "Данный домен не разрешен" - ACCOUNT_NOT_ALLOWED: "Данный аккаунт не разрешен" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Необходима двухфакторная верификация" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Ошибка двухфакторной верификации" - COULD_NOT_SAVE_NEW_PASSWORD: "Не удалось сохранить новый пароль" - CURRENT_PASSWORD_INCORRECT: "Текущий пароль неверный" - NEW_PASSWORD_SHORT: "Пароль слишком короткий" - NEW_PASSWORD_WEAK: "Пароль слишком простой" - NEW_PASSWORD_FORBIDDENT: "Пароль содержит запрещенные символы" - CONTACTS_SYNC_ERROR: "Ошибка синхронизации контактов" - CANT_GET_MESSAGE_LIST: "Не могу получить список писем" - CANT_GET_MESSAGE: "Не могу получить письмо" - CANT_DELETE_MESSAGE: "Не могу удалить письмо" - CANT_MOVE_MESSAGE: "Не могу переместить письмо" - CANT_SAVE_MESSAGE: "Не могу сохранить письмо" - CANT_SEND_MESSAGE: "Не могу отправить письмо" - INVALID_RECIPIENTS: "Проверьте правильность ввода всех адресов." - CANT_SAVE_FILTERS: "Не могу сохранить фильтры" - CANT_GET_FILTERS: "Не могу загрузить фильтры" - FILTERS_ARE_NOT_CORRECT: "Фильтры неправильны" - CANT_CREATE_FOLDER: "Не могу создать папку" - CANT_RENAME_FOLDER: "Не могу переименовать папку" - CANT_DELETE_FOLDER: "Не могу удалить папку" - CANT_DELETE_NON_EMPTY_FOLDER: "Не могу удалить непустую папку" - CANT_SUBSCRIBE_FOLDER: "Не могу подписать папку" - CANT_UNSUBSCRIBE_FOLDER: "Не могу отписать папку" - CANT_SAVE_SETTINGS: "Не могу сохранить настройки" - CANT_SAVE_PLUGIN_SETTINGS: "Не могу сохранить настройки" - DOMAIN_ALREADY_EXISTS: "Домен уже существует" - CANT_INSTALL_PACKAGE: "Ошибка установки пакета" - CANT_DELETE_PACKAGE: "Ошибка удаления пакета" - INVALID_PLUGIN_PACKAGE: "Ошибка пакета плагина" - UNSUPPORTED_PLUGIN_PACKAGE: "Для работы плагина необходима полная поддержка сервера" - LICENSING_SERVER_IS_UNAVAILABLE: "Сервер подписок временно не доступен." - LICENSING_DOMAIN_EXPIRED: "Подписка на данный домен устарела." - LICENSING_DOMAIN_BANNED: "Подписка на данный домен заблокирована." - DEMO_SEND_MESSAGE_ERROR: "Демо аккаунту отправка писем на внешние почтовые адреса запрещена!" - DEMO_ACCOUNT_ERROR: "По соображениям безопасности данный аккаунт не может выполнить это действие." - ACCOUNT_ALREADY_EXISTS: "Аккаунт уже добавлен" - ACCOUNT_DOES_NOT_EXIST: "Аккаунт не существует" - MAIL_SERVER_ERROR: "Ошибка доступа к почтовому серверу" - INVALID_INPUT_ARGUMENT: "Неверный параметр" - UNKNOWN_ERROR: "Неизвестная ошибка" - STATIC: - BACK_LINK: "Обновить" - DOMAIN_LIST_DESC: "Список доменов, к которым разрешен доступ через веб почту." - PHP_EXSTENSIONS_ERROR_DESC: "Необходимые расширения PHP не установлены на вашем сервере!" - PHP_VERSION_ERROR_DESC: "Ваша версия PHP (%VERSION%) ниже требуемой 5.3.0!" - NO_SCRIPT_TITLE: "Для работы приложения необходим JavaScript." - NO_SCRIPT_DESC: | - По-видимому, JavaScript либо не поддерживается вашим браузером, либо отключен. - Включите JavaScript, изменив настройки браузера, затем повторите попытку. - NO_COOKIE_TITLE: "Для работы приложения необходимы Cookie." - NO_COOKIE_DESC: | - По-видимому, Cookie либо не поддерживаются вашим браузером, либо отключены. - Включите Cookie, изменив настройки браузера, затем повторите попытку. - BAD_BROWSER_TITLE: "Ваш браузер устарел." - BAD_BROWSER_DESC: | - Чтобы использовать все возможности приложения, - загрузите и установите один из этих браузеров diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sk_SK.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sk_SK.yml deleted file mode 100755 index dfe63b1a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sk_SK.yml +++ /dev/null @@ -1,204 +0,0 @@ -sk_SK: - LOGIN: - LABEL_LOGIN: "Používateľské meno" - LABEL_PASSWORD: "Heslo" - BUTTON_LOGIN: "Prihlásiť sa do admin panelu" - TOP_PANEL: - LABEL_ADMIN_PANEL: "Admin Panel" - TABS_LABELS: - LABEL_GENERAL_NAME: "Všeobecné" - LABEL_LOGIN_NAME: "Používateľské meno" - LABEL_BRANDING_NAME: "Branding" - LABEL_CONTACTS_NAME: "Kontakty" - LABEL_DOMAINS_NAME: "Domény" - LABEL_SECURITY_NAME: "Zabezpečenie" - LABEL_INTEGRATION_NAME: "Integrácie" - LABEL_PACKAGES_NAME: "Balíčky" - LABEL_LICENSING_NAME: "Licencovanie" - LABEL_ABOUT_NAME: "O programe" - TAB_GENERAL: - LEGEND_INTERFACE: "Rozhranie" - LABEL_LANGUAGE: "Jazyk" - LABEL_LANGUAGE_ADMIN: "Jazyk (admin)" - LABEL_THEME: "Téma" - LEGEND_MAIN: "Všeobecné" - LABEL_ALLOW_TEMPLATES: "Povoliť šablóny" - ALERT_WARNING: "Upozornenie!" - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "Prihlasovacia obrazovka" - LABEL_DEFAULT_DOMAIN: "Predvolená doména" - TAB_BRANDING: - LABEL_FAVICON_URL: "Favicon" - LEGEND_LOGIN: "Používateľské meno" - LABEL_LOGIN_LOGO: "Logo" - LABEL_LOGIN_DESCRIPTION: "Popis" - LABEL_LOGIN_BACKGROUND: "Pozadie" - LABEL_LOGIN_CUSTOM_CSS: "Vlastné CSS" - LABEL_LOGIN_SHOW_POWERED_LINK: "Zobraziť link \"Powered by RainLoop\"" - LEGEND_USER: "Užívateľ" - LABEL_USER_LOGO: "Logo" - LABEL_USER_CUSTOM_CSS: "Vlastné CSS" - LEGEND_WELCOME_PAGE: "Uvítacia stránka" - LABEL_WELCOME_PAGE_TITLE: "Nadpis" - LABEL_WELCOME_PAGE_URL: "URL" - LABEL_WELCOME_PAGE_DISPLAY: "Zobraziť" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "Žiadne" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Jednorázovo" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Vždy" - TAB_CONTACTS: - LEGEND_CONTACTS: "Kontakty" - LABEL_ENABLE_CONTACTS: "Zapnúť kontakty" - LABEL_STORAGE_TYPE: "Typ" - LABEL_STORAGE_DSN: "Dsn" - LABEL_STORAGE_USER: "Užívateľ" - LABEL_STORAGE_PASSWORD: "Heslo" - BUTTON_TEST: "Test" - TAB_DOMAINS: - LEGEND_DOMAINS: "Domény" - BUTTON_ADD_DOMAIN: "Pridať doménu" - BUTTON_ADD_ALIAS: "Pridať alias" - DELETE_ARE_YOU_SURE: "Ste si istí?" - TAB_SECURITY: - LEGEND_SECURITY: "Bezpečnosť" - LABEL_CURRENT_PASSWORD: "Súčasné heslo" - LABEL_NEW_PASSWORD: "Nové heslo" - LABEL_REPEAT_PASSWORD: "Opakovať" - LEGEND_SSL: "SSL" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "Google" - LABEL_GOOGLE_AUTH: "Overenie" - LABEL_GOOGLE_CLIENT_ID: "ID klienta" - LABEL_GOOGLE_API_KEY: "Api kľúč" - LEGEND_FACEBOOK: "Facebook" - LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "Povoliť Twitter intergáciu (overenie)" - LEGEND_DROPBOX: "Dropbox" - LABEL_DROPBOX_API_KEY: "Api kľúč" - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "Dostupné na aktualizáciu" - LEGEND_AVAILABLE_FOR_INSTALLATION: "Dostupné na inštaláciu" - LEGEND_INSTALLED_PACKAGES: "Nainštalované balíčky" - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "Vaša doména" - LABEL_VERSION: "Verzia" - LABEL_CHECKING: "Kontrolujem" - TYPE_BASIC_HINT_2: "Táto doména nemôže byť licencovaná" - HTML_ALERT_TOP_1: "RainLoop Webmail je licencovaný pod" - TYPE_PREMIUM_LIFETIME: "Doživotná" - BUTTON_PURCHASE: "Kúpiť" - BUTTON_TRIAL: "Skúšobná verzia" - TAB_ABOUT: - LABEL_TAG_HINT: "Jednoduchý, moderný a rýchly webmail klient" - LABEL_ALL_RIGHTS_RESERVED: "Všetky práva vyhradené." - HINT_READ_CHANGE_LOG: "Prosím prečítajte si zoznam zmien pred aktualizáciou." - HINT_IS_UP_TO_DATE: "RainLoop je aktuálny." - HTML_NEW_VERSION: "Dostupná nová %VERSION% verzia." - LABEL_UPDATING: "Aktualizujem" - LABEL_CHECKING: "Kontrolujem aktualizácie" - BUTTON_UPDATE: "Aktualizovať" - BUTTON_DOWNLOAD: "Stiahnuť" - BUTTON_CHANGELOG: "Zoznam zmien" - POPUPS_ACTIVATE: - TITLE_ACTIVATION: "Aktivácia..." - LABEL_DOMAIN: "Doména" - BUTTON_ACTIVATE: "Aktivovať" - LABEL_ACTIVATED: "Aktivované" - POPUPS_DOMAIN_ALIAS: - TITLE_ADD_DOMAIN_ALIAS: "Pridať alias" - LABEL_ALIAS: "Alias" - LABEL_DOMAIN: "Doména" - BUTTON_CLOSE: "Zatvoriť" - BUTTON_ADD: "Pridať" - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "Pridať doménu" - TITLE_ADD_DOMAIN_WITH_NAME: "Pridať doménu \"%NAME%\"" - TITLE_EDIT_DOMAIN: "Upraviť doménu \"%NAME%\"" - LABEL_NAME: "Meno" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "Server" - LABEL_PORT: "Port" - LABEL_SECURE: "Bezpečné" - SECURE_OPTION_NONE: "Žiadne" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "STARTTLS" - LABEL_USE_SHORT_LOGIN: "Použiť skrátené prihlásenie" - LABEL_USE_AUTH: "Použiť overenie" - LABEL_USE_PHP_MAIL: "Použiť php mail() funkciu" - BUTTON_TEST: "Test" - BUTTON_SIEVE_CONFIGURATION: "Uložiť nastavenia" - BUTTON_BACK_TO_IMAP: "Späť do IMAP nastavení" - BUTTON_BACK: "Späť" - BUTTON_CLOSE: "Zatvoriť" - BUTTON_ADD: "Pridať" - BUTTON_UPDATE: "Aktualizovať" - POPUPS_PLUGIN: - BUTTON_CLOSE: "Zatvoriť" - BUTTON_SAVE: "Uložiť" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Zvoľte jazyk" - HINTS: - BETA: "beta" - UNSTABLE: "nestabilné" - WARNING: "Upozornenie!" - NOT_SUPPORTED: "nie je podporované" - REQUIRES_PHP_54: "vyžaduje PHP 5.4 alebo vyššie" - ERRORS: - DOMAIN_ALREADY_EXISTS: "Táto Doména už existuje" - UNKNOWN_ERROR: "Neznáma chyba" - NOTIFICATIONS: - INVALID_TOKEN: "Neplatný token" - AUTH_ERROR: "Overenie zlyhalo" - ACCESS_ERROR: "Chyba prístupu" - CONNECTION_ERROR: "Nepodarilo sa pripojiť k serveru" - CAPTCHA_ERROR: "Nesprávne CAPTCHA." - DOMAIN_NOT_ALLOWED: "Doména nie je povolená" - ACCOUNT_NOT_ALLOWED: "Účet nie je povolený" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Dvojfaktorové overenie vyžadované" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Chyba dvojfaktorového overenia" - COULD_NOT_SAVE_NEW_PASSWORD: "Nepodarilo sa uložiť nové heslo" - CURRENT_PASSWORD_INCORRECT: "Chybné aktuálne heslo" - NEW_PASSWORD_SHORT: "Heslo je príliš krátke" - NEW_PASSWORD_WEAK: "Heslo je príliš jednoduché" - NEW_PASSWORD_FORBIDDENT: "Heslo obsahuje nepovolené znaky" - CONTACTS_SYNC_ERROR: "Chyba synchronizovania kontaktov" - CANT_GET_MESSAGE_LIST: "Chyba pri vytváraní zoznamu správ." - CANT_GET_MESSAGE: "Správu sa nepodarilo načítať" - CANT_DELETE_MESSAGE: "Správu sa nepodarilo odstrániť" - CANT_MOVE_MESSAGE: "Správu sa nepodarilo presunúť" - CANT_SAVE_MESSAGE: "Správu sa nepodarilo uložiť" - CANT_SEND_MESSAGE: "Správu sa nepodarilo odoslať" - INVALID_RECIPIENTS: "Neplatný príjemcovia" - CANT_SAVE_FILTERS: "Nepodarilo sa uložiť filtre" - CANT_GET_FILTERS: "Nepodarilo sa načítať filtre" - FILTERS_ARE_NOT_CORRECT: "Filtre nie sú správne" - CANT_CREATE_FOLDER: "Priečinok sa nepodarilo vytvoriť" - CANT_RENAME_FOLDER: "Priečinok sa nepodarilo premenovať" - CANT_DELETE_FOLDER: "Priečinok sa nepodarilo odstrániť" - CANT_DELETE_NON_EMPTY_FOLDER: "Nemôžem odstrániť neprázdny priečinok" - CANT_SAVE_SETTINGS: "Nastavenia sa nepodarilo uložiť" - CANT_SAVE_PLUGIN_SETTINGS: "Nastavenia sa nepodarilo uložiť" - DOMAIN_ALREADY_EXISTS: "Táto Doména už existuje" - CANT_INSTALL_PACKAGE: "Inštalácia balíčka zlyhala" - CANT_DELETE_PACKAGE: "Odstránenie balíčka zlyhalo" - LICENSING_DOMAIN_EXPIRED: "Prihlásenie pre túto doménu vypršalo." - LICENSING_DOMAIN_BANNED: "Prihlásenie pre túto doménu je zablokované." - ACCOUNT_ALREADY_EXISTS: "Účet už existuje" - ACCOUNT_DOES_NOT_EXIST: "Účet neexistuje" - MAIL_SERVER_ERROR: "Nastala chyba počas prístupu na poštový server" - UNKNOWN_ERROR: "Neznáma chyba" - STATIC: - BACK_LINK: "Obnoviť" - DOMAIN_LIST_DESC: "Zoznam domén ku ktorým je povolené pristupovať cez webmail." - PHP_EXSTENSIONS_ERROR_DESC: "Vyžadované PHP rozšírenia nie sú dostupné vo vašej PHP konfigurácii!" - PHP_VERSION_ERROR_DESC: "Vaša PHP verzia (%VERSION%) je nižšia ako minimálne vyžadovaná 5.3.0!" - NO_SCRIPT_TITLE: "Táto aplikácia vyžaduje JavaScript." - NO_SCRIPT_DESC: | - Váš internetový prehliadač nepodporuje JavaScript. - Prosím povoľte podporu JavaScriptu v nastaveniach vášho internetového prehliadača a skúste to znova. - NO_COOKIE_TITLE: "Táto aplikácia vyžaduje podporu Cookies." - NO_COOKIE_DESC: | - Váš internetový prehliadač nepodporuje Cookies. - Prosím povoľte podporu Cookies v nastaveniach vášho internetového prehliadača a skúste to znova. - BAD_BROWSER_TITLE: "Používate zastaralý internetový prehliadač." diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sl_SI.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sl_SI.yml deleted file mode 100755 index 13ef86af..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sl_SI.yml +++ /dev/null @@ -1,323 +0,0 @@ -sl_SI: - LOGIN: - LABEL_LOGIN: "Prijava" - LABEL_PASSWORD: "Geslo" - BUTTON_LOGIN: "Prijava v administracijsko ploščo" - TOP_PANEL: - LABEL_PREMIUM: "Premium" - LABEL_ADMIN_PANEL: "Administracijska plošča" - TABS_LABELS: - LABEL_GENERAL_NAME: "Splošno" - LABEL_LOGIN_NAME: "Prijava" - LABEL_BRANDING_NAME: "Prilagoditev" - LABEL_CONTACTS_NAME: "Stiki" - LABEL_DOMAINS_NAME: "Domene" - LABEL_SECURITY_NAME: "Varnost" - LABEL_INTEGRATION_NAME: "Integracije" - LABEL_PLUGINS_NAME: "Vtičniki" - LABEL_PACKAGES_NAME: "Paketi" - LABEL_LICENSING_NAME: "Licence" - LABEL_ABOUT_NAME: "Več o" - TAB_GENERAL: - LEGEND_INTERFACE: "Vmesnik" - LABEL_LANGUAGE: "Jezik" - LABEL_LANGUAGE_ADMIN: "Jezik (administrator)" - LABEL_THEME: "Tema" - LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Dovoli izbor jezika v nastavitvah" - LABEL_ALLOW_THEMES_ON_SETTINGS: "Dovoli izbor teme v nastavitvah" - LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Dovoli izbor ozadja v nastavitvah" - LABEL_NEW_FOLDER_MOVE: "Novi gumb \"Premakni v mapo\"" - LABEL_SHOW_THUMBNAILS: "Pokaži predoglede (priloge)" - LABEL_ALLOW_GRAVATAR: "Dovoli Gravatar" - LEGEND_MAIN: "Glavno" - LABEL_ATTACHMENT_SIZE_LIMIT: "Omejitev velikosti prilog" - LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Dovoli dodatne račune" - LABEL_ALLOW_IDENTITIES: "Dovoli več identitet" - LABEL_ALLOW_TEMPLATES: "Dovoli predloge" - ALERT_WARNING: "Pozor!" - HTML_ALERT_WEAK_PASSWORD: | - V uporabi je privzeto geslo administratorja -
- Iz varnostnih razlogov - spremenite - geslo v nekaj drugega. - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "Prijavni zaslon" - LABEL_DEFAULT_DOMAIN: "Privzeta domena" - LABEL_DETERMINE_USER_DOMAIN: "Poskusi ugotoviti domeno uporabnika" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Dovoli izbor jezika na prijavnem zaslonu" - LABEL_DETERMINE_USER_LANGUAGE: "Poskusi ugotoviti jezik uporabnika" - TAB_BRANDING: - LEGEND_BRANDING: "Prilagoditev" - LABEL_PAGE_TITLE: "Naslov strani" - LABEL_LOADING_DESCRIPTION: "Opis med nalaganjem" - LABEL_FAVICON_URL: "Favicon" - LEGEND_LOGIN: "Prijava" - LABEL_LOGIN_LOGO: "Logo" - LABEL_LOGIN_DESCRIPTION: "Opis" - LABEL_LOGIN_BACKGROUND: "Ozadje" - LABEL_LOGIN_CUSTOM_CSS: "CSS po meri" - LABEL_LOGIN_SHOW_POWERED_LINK: "Pokaži povezavo \"Powered by RainLoop\"" - LEGEND_USER: "Uporabnik" - LABEL_USER_LOGO: "Logo" - LABEL_USER_LOGO_TITLE: "Naziv loga" - LABEL_USER_LOGO_MESSAGE: "Logo (pogled sporočil)" - LABEL_USER_CUSTOM_CSS: "CSS po meri" - LEGEND_WELCOME_PAGE: "Pozdravna stran" - LABEL_WELCOME_PAGE_TITLE: "Naslov" - LABEL_WELCOME_PAGE_URL: "URL" - LABEL_WELCOME_PAGE_DISPLAY: "Prikaz" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "Brez" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Enkrat" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Vedno" - HTML_ALERT_PREMIUM: "Ta funkcija je na voljo samo za Premium uporabnike." - TAB_CONTACTS: - LEGEND_CONTACTS: "Stiki" - LEGEND_STORAGE: "Shramba (PDO)" - LABEL_ENABLE_CONTACTS: "Omogoči stike" - LABEL_ALLOW_SYNC: "Dovoli sinhronizacijo stikov (zunanji CardDAV strežnik)" - LABEL_STORAGE_TYPE: "Tip" - LABEL_STORAGE_DSN: "Ime podatkovnega vira (DSN)" - LABEL_STORAGE_USER: "Uporabnik" - LABEL_STORAGE_PASSWORD: "Geslo" - BUTTON_TEST: "Preizkus" - ALERT_NOTICE: "Obvestilo!" - HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Ta tip podatkovne baze ni priporočljiv za večje število uporabnikov." - HTML_ALERT_DOES_NOT_SUPPORTED: | - Sistem ne podpira stikov. -
- Namestite ali omogočite PDO (SQLite / MySQL / PostgreSQL) razširitev na strežniku. - TAB_DOMAINS: - LEGEND_DOMAINS: "Domene" - BUTTON_ADD_DOMAIN: "Dodaj domeno" - BUTTON_ADD_ALIAS: "Dodaj vzdevek" - DELETE_ARE_YOU_SURE: "Ste prepričani?" - HTML_DOMAINS_HELPER: | - Seznam domen, do katerih je omogočen dostop. -
- Kliknite ime za konfiguracijo domene. - TAB_SECURITY: - LEGEND_SECURITY: "Varnost" - LABEL_ALLOW_TWO_STEP: "Dovoli 2-stopenjsko overjanje" - LABEL_FORCE_TWO_STEP: "Prisili 2-stopenjsko overjanje" - LABEL_USE_IMAGE_PROXY: "Uporabni lokalni posredniški strežnik za zunanje slike" - LABEL_ALLOW_OPEN_PGP: "Dovoli OpenPGP" - LABEL_SHOW_PHP_INFO: "Prikaz PHP informacij" - LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Prijavni podatki za administracijsko ploščo" - LABEL_CURRENT_PASSWORD: "Trenutno geslo" - LABEL_NEW_LOGIN: "Novo uporabniško ime" - LABEL_NEW_PASSWORD: "Novo geslo" - LABEL_REPEAT_PASSWORD: "Ponovno" - BUTTON_UPDATE_PASSWORD: "Posodobi geslo" - LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: "Obvezno overjanje uporabljenega SSL certifikata (IMAP/SMTP)" - LABEL_ALLOW_SELF_SIGNED: "Dovoli samopodpisane certifikate" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "Google" - LABEL_ENABLE_GOOGLE: "Omogoči integracijo z Google računom" - LABEL_GOOGLE_AUTH: "Pooblastilo" - LABEL_GOOGLE_DRIVE: "Integracija Google Drive (pogled sestavljanja)" - LABEL_GOOGLE_PREVIEW: "Integracija Google Viewer (Predogled za datoteke Microsoft Word, Excel in PowerPoint)" - LABEL_GOOGLE_CLIENT_ID: "ID odjemalca" - LABEL_GOOGLE_CLIENT_SECRET: "Skrivnost odjemalca" - LABEL_GOOGLE_API_KEY: "API ključ" - HINT_GOOGLE_API_KEY: "Potrebno za Google Drive izbirnik datotek" - LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "Omogoči Facebook integracijo (Pooblastilo)" - LABEL_FACEBOOK_APP_ID: "ID aplikacije" - LABEL_FACEBOOK_APP_SECRET: "Skrivnost aplikacije" - LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "Omogoči Twitter integracijo (Pooblastilo)" - LABEL_TWITTER_CONSUMER_KEY: "Ključ porabnika" - LABEL_TWITTER_CONSUMER_SECRET: "Skrivnost porabnika" - LEGEND_DROPBOX: "Dropbox" - LABEL_ENABLE_DROPBOX: "Omogoči Dropbox integracijo" - LABEL_DROPBOX_API_KEY: "API ključ" - TOP_ALERT: "Podrobne informacije o integraciji z družabnimi omrežji so dostopne na" - TAB_PLUGINS: - LEGEND_PLUGINS: "Vtičniki" - LABEL_ENABLE_PLUGINS: "Omogoči vtičnike" - ALERT_NO_PLUGINS: "Ni nameščenih vtičnikov." - LINK_INSTALL_NEW: "Kliknite sem za namestitev novih!" - HINT_CLICK_NAME: "Kliknite na ime, da konfigurirate vtičnik." - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "Na voljo za posodobitev" - LEGEND_AVAILABLE_FOR_INSTALLATION: "Na voljo za namestitev" - LEGEND_INSTALLED_PACKAGES: "Nameščeni paketi" - ALERT_CANNOT_ACCESS_REPOSITORY: "Trenutno ni možen dostop do repozitorija" - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "Vaša domena" - LABEL_VERSION: "Verzija" - LABEL_CHECKING: "Preverjanje" - TYPE_BASIC_HINT: "Ta domena nima licence za komercialno uporabo (z dodatnimi funkcijami)." - TYPE_BASIC_HINT_2: "Ni mogoče pridobiti licence za to domeno." - HTML_ALERT_TOP_1: "RainLoop Webmail izdana pod licenco" - HTML_ALERT_TOP_2: "Smete jo prosto in zastonj uporabljati za osebne projekte." - HTML_ALERT_TOP_3: | - Za komercialno uporabo (z dodatnimi funkcijami) RainLoop Webmail je potrebno pridobiti - naročnino. - TYPE_PREMIUM_LIFETIME: "Obdobje" - LABEL_SUB_EXPIRES: "Naročnina poteče" - BUTTON_ACTIVATE: "Aktiviraj naročniški ključ za to domeno" - BUTTON_PURCHASE: "Kupi" - BUTTON_TRIAL: "Preizkusi" - TAB_ABOUT: - LEGEND_ABOUT: "Več o" - LABEL_TAG_HINT: "Preprost, sodoben, in hiter spletni e-poštni odjemalec" - LABEL_ALL_RIGHTS_RESERVED: "Vse pravice pridržane." - HINT_READ_CHANGE_LOG: "Preberite dnevnik sprememb pred posodobitvijo." - HINT_IS_UP_TO_DATE: "Ni novih posodobitev." - HTML_NEW_VERSION: "Na voljo je nova verzija %VERSION%." - LABEL_UPDATING: "Posodabljanje" - LABEL_CHECKING: "Preverjanje za posdodobitve" - BUTTON_UPDATE: "Posodobi" - BUTTON_DOWNLOAD: "Prenesi" - BUTTON_CHANGELOG: "Dnevnik sprememb" - POPUPS_ACTIVATE: - TITLE_ACTIVATE: "Aktiviram naročniški ključ?" - TITLE_ACTIVATION: "Aktiviranje..." - LABEL_DOMAIN: "Domena" - LABEL_SUB_KEY: "Naročniški ključ" - BUTTON_ACTIVATE: "Aktiviraj" - LABEL_ACTIVATED: "Aktivirano" - ERROR_INVALID_SUBS_KEY: "Neveljaven naročniški ključ" - SUBS_KEY_ACTIVATED: "Naročniški ključ je bil uspešno aktiviran" - HTML_DESC: | - Po aktivaciji bo premium naročnina za %DOMAIN% podaljšana. -
- Naročniški ključ je lahko uporabljen zgolj za eno domeno. -

- Po začetku procesa aktivacije ni mogoče prekiniti ali preklicati. - POPUPS_DOMAIN_ALIAS: - TITLE_ADD_DOMAIN_ALIAS: "Dodajanje domene" - LABEL_ALIAS: "Vzdevek" - LABEL_DOMAIN: "Domena" - BUTTON_CLOSE: "Zapri" - BUTTON_ADD: "Dodaj" - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "Dodajanje domene" - TITLE_ADD_DOMAIN_WITH_NAME: "Dodajanje domene \"%NAME%\"" - TITLE_EDIT_DOMAIN: "Urejanje domene \"%NAME%\"" - LABEL_NAME: "Ime" - NAME_HELPER: "podpora za nadomestne znake" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "Strežnik" - LABEL_PORT: "Vrata" - LABEL_SECURE: "Varno" - LABEL_WHITE_LIST: "Bela lista" - SECURE_OPTION_NONE: "Nobeno" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "STARTTLS" - LABEL_ALLOW_SIEVE_SCRIPTS: "Dovoljene sieve skripte" - LABEL_ALLOW_USER_SCRIPT: "Dovoljene uporabniške skripte po meri" - LABEL_USE_SHORT_LOGIN: "Uporaba uporabniškega imena brez domene" - LABEL_USE_AUTH: "Uporaba overjanja" - LABEL_USE_PHP_MAIL: "Uporaba php mail() funkcije" - BUTTON_TEST: "Preizkus" - BUTTON_WHITE_LIST: "Dodaj na belo listo" - BUTTON_SIEVE_CONFIGURATION: "Konfiguriraj Sieve" - BUTTON_BACK_TO_IMAP: "Nazaj na nastavitve IMAP" - BUTTON_BACK: "Nazaj" - BUTTON_CLOSE: "Zapri" - BUTTON_ADD: "Dodaj" - BUTTON_UPDATE: "Posodobi" - NEW_DOMAIN_DESC: "Ta konfiguiracija domene bo omogočala delo
z %NAME% e-naslovi." - WHITE_LIST_ALERT: | - Seznam uporabnikov domene, do katerih je omogočen dostop. - Uporabnike ločite s presledkom. - POPUPS_PLUGIN: - TITLE_PLUGIN: "Vtičnik" - DESC_NOTHING_TO_CONFIGURE: "Ni nastavitev za spreminjati" - BUTTON_CLOSE: "Zapri" - BUTTON_SAVE: "Shrani" - TOOLTIP_ABOUT_TITLE: "Več o" - POPUPS_ASK: - DESC_WANT_CLOSE_THIS_WINDOW: "Želite zapreti to okno?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Izberite jezik" - HINTS: - BETA: "beta" - UNSTABLE: "nestabilno" - WARNING: "Pozor!" - NOT_SUPPORTED: "ni podprto" - REQUIRES_PHP_54: "zahteva PHP 5.4 ali več" - ERRORS: - DOMAIN_ALREADY_EXISTS: "Domena že obstaja" - UNKNOWN_ERROR: "Neznana napaka" - NOTIFICATIONS: - INVALID_TOKEN: "Neveljaven žeton" - AUTH_ERROR: "Spodletelo overjanje" - ACCESS_ERROR: "Napaka dostopa" - CONNECTION_ERROR: "Neuspešna povezava s strežnikom" - CAPTCHA_ERROR: "Napačen CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Ta družabni ID ni še določen nobenemu E-poštnemu računu. Prijavite se z podatki - za E-pošto in omogočite to v nastavitvah računa. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Ta družabni ID ni še določen nobenemu E-poštnemu računu. Prijavite se z podatki - za E-pošto in omogočite to v nastavitvah računa. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Ta družabni ID ni še določen nobenemu E-poštnemu računu. Prijavite se z podatki - za E-pošto in omogočite to v nastavitvah računa. - DOMAIN_NOT_ALLOWED: "Domena ni dovoljena" - ACCOUNT_NOT_ALLOWED: "Račun ni dovoljen" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Obvezno 2-stopenjsko overjanje" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Napaka 2-stopenjskega overjanja" - COULD_NOT_SAVE_NEW_PASSWORD: "Ni bilo mogoče shraniti novega gesla" - CURRENT_PASSWORD_INCORRECT: "Napačno trenutno geslo" - NEW_PASSWORD_SHORT: "Prekratko geslo" - NEW_PASSWORD_WEAK: "Preveč enostavno geslo" - NEW_PASSWORD_FORBIDDENT: "Geslo vsebuje nedovoljene znake" - CONTACTS_SYNC_ERROR: "Napaka sinhronizacije stikov" - CANT_GET_MESSAGE_LIST: "Ni bilo mogoče pridobiti seznama sporočil" - CANT_GET_MESSAGE: "Ni bilo mogoče pridobiti sporočila" - CANT_DELETE_MESSAGE: "Ni bilo mogoče izbrisati sporočila" - CANT_MOVE_MESSAGE: "Ni mogoče premakniti sporočila" - CANT_SAVE_MESSAGE: "Ni mogoče shraniti sporočila" - CANT_SEND_MESSAGE: "Ni mogoče poslati sporočila" - INVALID_RECIPIENTS: "Neveljavni prejemniki" - CANT_SAVE_FILTERS: "Ni mogoče shraniti filtrov" - CANT_GET_FILTERS: "Ni mogoče pridobiti filtrov" - FILTERS_ARE_NOT_CORRECT: "Filtri so nepravilni" - CANT_CREATE_FOLDER: "Ni mogoče ustvariti mape" - CANT_RENAME_FOLDER: "Ni mogoče preimenovati mape" - CANT_DELETE_FOLDER: "Ni mogoče izbrisati mape" - CANT_DELETE_NON_EMPTY_FOLDER: "Ni mogoče izbrisati neprazne mape" - CANT_SUBSCRIBE_FOLDER: "Ni mogoče slediti mapi" - CANT_UNSUBSCRIBE_FOLDER: "Ni mogoče prenehati slediti mapi" - CANT_SAVE_SETTINGS: "Ni mogoče shraniti nastavitev" - CANT_SAVE_PLUGIN_SETTINGS: "Ni mogoče shraniti nastavitev" - DOMAIN_ALREADY_EXISTS: "Domena že obstaja" - CANT_INSTALL_PACKAGE: "Neuspešna namestitev paketa" - CANT_DELETE_PACKAGE: "Neuspešno odstranjevanje paketa" - INVALID_PLUGIN_PACKAGE: "Neveljaven paket vtičnika" - UNSUPPORTED_PLUGIN_PACKAGE: "Nepodprt paket vtičnika" - LICENSING_SERVER_IS_UNAVAILABLE: "Naročniški strežnik ni dosegljiv" - LICENSING_DOMAIN_EXPIRED: "Naročnina na to domeno je potekla." - LICENSING_DOMAIN_BANNED: "Naročnina na to domeno ni dovoljena" - DEMO_SEND_MESSAGE_ERROR: "Iz varnostnih razlogov ta račun ne sme pošiljati pošte na zunanje e-naslove!" - DEMO_ACCOUNT_ERROR: "Iz varnostnih razlogov ta račun ne sme izvršiti tega dejanja!" - ACCOUNT_ALREADY_EXISTS: "Račun že obstaja" - ACCOUNT_DOES_NOT_EXIST: "Račun ne obstaja" - MAIL_SERVER_ERROR: "Napaka pri dostopu do poštnega strežnika" - INVALID_INPUT_ARGUMENT: "Neveljaven vhodni argument" - UNKNOWN_ERROR: "Neznana napaka" - STATIC: - BACK_LINK: "Ponovno naloži" - DOMAIN_LIST_DESC: "Seznam domen, na katere je dovoljen dostop" - PHP_EXSTENSIONS_ERROR_DESC: "Potrebne PHP razširitve niso omogočene v vaši PHP nastavitveni datoteki!" - PHP_VERSION_ERROR_DESC: "Vaša PHP verzija (%VERSION%) je manjša kot potrebna 5.3.0!" - NO_SCRIPT_TITLE: "Ta aplikacija potrebuje omogočen JavaScript." - NO_SCRIPT_DESC: | - Brskalnik nima podpore za JavaScript. - Omogočite JavaScript v brskalniku in poskusite znova. - NO_COOKIE_TITLE: "Ta aplikacije potrebuje omogočene piškotke." - NO_COOKIE_DESC: | - Brskalnik nima omogočenih piškotkov. - Omogočite piškotke v brskalniku in poskusite znova. - BAD_BROWSER_TITLE: "Brskalnik je zastarel." - BAD_BROWSER_DESC: | - Za uporabo vseh funkcij te aplikacije - prenesite in namestite enega od teh brskalnikov: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sv_SE.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sv_SE.yml deleted file mode 100755 index fd9912cb..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/sv_SE.yml +++ /dev/null @@ -1,324 +0,0 @@ -sv_SE: - LOGIN: - LABEL_LOGIN: "Logga in" - LABEL_PASSWORD: "Lösenord" - BUTTON_LOGIN: "Logga in till admin-panelen" - TOP_PANEL: - LABEL_PREMIUM: "Premium" - LABEL_ADMIN_PANEL: "Adminpanel" - TABS_LABELS: - LABEL_GENERAL_NAME: "Allmän" - LABEL_LOGIN_NAME: "Logga in" - LABEL_BRANDING_NAME: "Branding" - LABEL_CONTACTS_NAME: "Kontakter" - LABEL_DOMAINS_NAME: "Domäner" - LABEL_SECURITY_NAME: "Säkerhet" - LABEL_INTEGRATION_NAME: "integrationer" - LABEL_PLUGINS_NAME: "Plugins" - LABEL_PACKAGES_NAME: "Paket" - LABEL_LICENSING_NAME: "Licensiering" - LABEL_ABOUT_NAME: "Om" - TAB_GENERAL: - LEGEND_INTERFACE: "Gränssnitt" - LABEL_LANGUAGE: "Språk" - LABEL_LANGUAGE_ADMIN: "Språk (administratör)" - LABEL_THEME: "Tema" - LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Tillåt språkändringar på konfigurationspanelen " - LABEL_ALLOW_THEMES_ON_SETTINGS: "Tillåt tema val på konfigurationspanelen" - LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Tillåt bakgrundsändringar på konfigurationspanelen" - LABEL_NEW_FOLDER_MOVE: "Ny \"Flytta mapp\" knapp" - LABEL_SHOW_THUMBNAILS: "Visa miniatyrer (bilagor)" - LABEL_ALLOW_GRAVATAR: "Tillåt Gravatar" - LEGEND_MAIN: "Huvud" - LABEL_ATTACHMENT_SIZE_LIMIT: "Bilagor storlek" - LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Tillåt ytterligare konton" - LABEL_ALLOW_IDENTITIES: "Tillåt multiidentiteter" - LABEL_ALLOW_TEMPLATES: "Tillåt mallar" - ALERT_WARNING: "Advarsel!" - HTML_ALERT_WEAK_PASSWORD: | - Du använder standardlösenord. -
- För säkerhetsskäl - ändra - lösenord till något annat - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "Inloggningsskärm" - LABEL_DEFAULT_DOMAIN: "Standarddomän" - LABEL_DETERMINE_USER_DOMAIN: "Försök att bestämma användardomän" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Tillåt språkändringar på inloggningsskärmen" - LABEL_DETERMINE_USER_LANGUAGE: "Försök att bestämma användarens språk" - TAB_BRANDING: - LEGEND_BRANDING: "Branding" - LABEL_PAGE_TITLE: "Namn på sidan" - LABEL_LOADING_DESCRIPTION: "Laddar beskrivning" - LABEL_FAVICON_URL: "Favicon" - LEGEND_LOGIN: "Logga in" - LABEL_LOGIN_LOGO: "Logotyp" - LABEL_LOGIN_DESCRIPTION: "Beskrivning" - LABEL_LOGIN_BACKGROUND: "Bakgrund" - LABEL_LOGIN_CUSTOM_CSS: "Anpassad CSS" - LABEL_LOGIN_SHOW_POWERED_LINK: "Visa \"Powered by RainLoop\" länk" - LEGEND_USER: "Användare" - LABEL_USER_LOGO: "Logotyp" - LABEL_USER_LOGO_TITLE: "Logotyp namn" - LABEL_USER_LOGO_MESSAGE: "Logo (Visa meddelande)" - LABEL_USER_CUSTOM_CSS: "Anpassad CSS" - LEGEND_WELCOME_PAGE: "Välkomstsida" - LABEL_WELCOME_PAGE_TITLE: "Titel" - LABEL_WELCOME_PAGE_URL: "URL" - LABEL_WELCOME_PAGE_DISPLAY: "Visa" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "Ingen" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "En gång" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Alltid" - HTML_ALERT_PREMIUM: "Denna funktion är tillgänglig för Premium abonnenter." - TAB_CONTACTS: - LEGEND_CONTACTS: "Kontakter" - LEGEND_STORAGE: "Storage (PDO)" - LABEL_ENABLE_CONTACTS: "göra det möjligt för kontakterna" - LABEL_ALLOW_SYNC: "Tillåt kontakter synkronisering (med extern CardDAV server)" - LABEL_STORAGE_TYPE: "Typ" - LABEL_STORAGE_DSN: "Dsn" - LABEL_STORAGE_USER: "Användare" - LABEL_STORAGE_PASSWORD: "Lösenord" - BUTTON_TEST: "Test" - ALERT_NOTICE: "Notis" - HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Använd inte denna typ av databas med ett stort antal aktiva användare." - HTML_ALERT_DOES_NOT_SUPPORTED: | - Systemet stöder inte kontakter -
- Du behöver installera eller aktivera SUB (SQLite/MySQL/PostgreSQL) förlängning på server. - TAB_DOMAINS: - LEGEND_DOMAINS: "Domäner" - BUTTON_ADD_DOMAIN: "Lägg till domän" - BUTTON_ADD_ALIAS: "Lägg till Alias" - DELETE_ARE_YOU_SURE: "Är du säker?" - HTML_DOMAINS_HELPER: | - Lista med domäner webmail tillåts access. -
- Klicka på namnet för att konfigurera domain. - TAB_SECURITY: - LEGEND_SECURITY: "Säkerhet" - LABEL_ALLOW_TWO_STEP: "Låt 2-tvåstegsverifiering" - LABEL_FORCE_TWO_STEP: "Driva 2-tvåstegsverifiering" - LABEL_USE_IMAGE_PROXY: "Använd lokal proxy för externa bilder" - LABEL_ALLOW_OPEN_PGP: "Tillåt OpenPGP" - LABEL_SHOW_PHP_INFO: "Visa PHP-information" - LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Administrativsuppgifter" - LABEL_CURRENT_PASSWORD: "Nuvarande lösenord" - LABEL_NEW_LOGIN: "Ny inloggning" - LABEL_NEW_PASSWORD: "Nytt lösenord" - LABEL_REPEAT_PASSWORD: "Upprepa" - BUTTON_UPDATE_PASSWORD: "Uppdatera lösenord" - LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: "Kräver verifiering av SSL-certifikat som används (IMAP/SMTP)" - LABEL_ALLOW_SELF_SIGNED: "Låt självsignerade certifikat" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "Google" - LABEL_ENABLE_GOOGLE: "Aktivera Google Integration" - LABEL_GOOGLE_AUTH: "Tillstånd" - LABEL_GOOGLE_DRIVE: "Google Drive Integration (Compose view)" - LABEL_GOOGLE_PREVIEW: "Google Viewer Integration (Preview för Microsoft Word, Excel och PowerPoint-filer)" - LABEL_GOOGLE_CLIENT_ID: "Client ID" - LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" - LABEL_GOOGLE_API_KEY: "Api Nyckel" - HINT_GOOGLE_API_KEY: "Nödvändigt för Google Drive File Picker" - LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "Aktivera Facebook Integration (Tillstånd)" - LABEL_FACEBOOK_APP_ID: "App ID" - LABEL_FACEBOOK_APP_SECRET: "App Secret" - LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "Aktivera Twitter Integration (Tillstånd)" - LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" - LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" - LEGEND_DROPBOX: "Dropbox" - LABEL_ENABLE_DROPBOX: "Aktivera Dropbok Integration" - LABEL_DROPBOX_API_KEY: "Api Key" - TOP_ALERT: "Detaljerad information om social integration återfinns på" - TAB_PLUGINS: - LEGEND_PLUGINS: "Plugin" - LABEL_ENABLE_PLUGINS: "Aktivera Plugin" - ALERT_NO_PLUGINS: "Inga plugin har ännu blivit installerade" - LINK_INSTALL_NEW: "Klicka här för att installera nya" - HINT_CLICK_NAME: "Klicka på namnet för att konfigurera pluginet" - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "Tillåt uppdateringar" - LEGEND_AVAILABLE_FOR_INSTALLATION: "Tillåt installation" - LEGEND_INSTALLED_PACKAGES: "installerade paket" - ALERT_CANNOT_ACCESS_REPOSITORY: "Det går inte att komma åt arkivet för tillfället." - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "Din domän" - LABEL_VERSION: "Version" - LABEL_CHECKING: "Kontroll" - TYPE_BASIC_HINT: "Denna domän är inte godkänt för kommersiellt bruk (med ytterligare funktioner)." - TYPE_BASIC_HINT_2: "Denna domän kan inte licensieras." - HTML_ALERT_TOP_1: "RainLoop Webmail är licensierat under" - HTML_ALERT_TOP_2: "Du är gratis för att använda den för dina personliga projekt." - HTML_ALERT_TOP_3: | - Kommersiellt bruk (med ytterligare funktioner) av RainLoop Webmail kräver att få - prenumerations. - TYPE_PREMIUM_LIFETIME: "Livstid" - LABEL_SUB_EXPIRES: "Abonnemang löper ut" - BUTTON_ACTIVATE: "Aktivera prenumerationsnyckel för den här domänen" - BUTTON_PURCHASE: "Inköp" - BUTTON_TRIAL: "Rättegång" - TAB_ABOUT: - LEGEND_ABOUT: "Om" - LABEL_TAG_HINT: "Enkel, modern & snabb e-postklient" - LABEL_ALL_RIGHTS_RESERVED: "Alla rättigheter förbehållna." - HINT_READ_CHANGE_LOG: "Vänligen läs ändringsloggen innan du uppdaterar." - HINT_IS_UP_TO_DATE: "RainLoop är aktuell." - HTML_NEW_VERSION: "Ny %VERSION% version är tillgänglig" - LABEL_UPDATING: "Uppdaterar" - LABEL_CHECKING: "Letar efter uppdaterar" - BUTTON_UPDATE: "Uppdatera" - BUTTON_DOWNLOAD: "Ladda ner" - BUTTON_CHANGELOG: "Ändringslogg" - POPUPS_ACTIVATE: - TITLE_ACTIVATE: "Aktivera prenumerationsnyckel?" - TITLE_ACTIVATION: "Aktivering..." - LABEL_DOMAIN: "Domän" - LABEL_SUB_KEY: "Prenumerationsnyckel" - BUTTON_ACTIVATE: "Aktivera" - LABEL_ACTIVATED: "Aktiverad" - ERROR_INVALID_SUBS_KEY: "Ogiltig prenumerationsnyckel" - SUBS_KEY_ACTIVATED: "Lyckades aktivera prenumerationsnyckel" - HTML_DESC: | - Efter aktivering, premium prenumeration för %DOMAIN% kommer att förängas. -
- Observera att prenumerationsnyckel kan aktiveras för en enda domän. -

- När processen för aktivering har påbörjats så kan den inte avbrytas. - POPUPS_DOMAIN_ALIAS: - TITLE_ADD_DOMAIN_ALIAS: "Lägg till Alias" - LABEL_ALIAS: "Alias" - LABEL_DOMAIN: "Domän" - BUTTON_CLOSE: "Stäng" - BUTTON_ADD: "Lägg till" - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "Lägg till domän" - TITLE_ADD_DOMAIN_WITH_NAME: "Lägg till domän \"%NAME%\"" - TITLE_EDIT_DOMAIN: "Ändra domän \"%NAME%\"" - LABEL_NAME: "Namn" - NAME_HELPER: "jokertecken stöds" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "Server" - LABEL_PORT: "Port" - LABEL_SECURE: "Säkerhet" - LABEL_WHITE_LIST: "Vitlista" - SECURE_OPTION_NONE: "Ingen" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "StartTLS" - LABEL_ALLOW_SIEVE_SCRIPTS: "Tillåta sikt skript" - LABEL_ALLOW_USER_SCRIPT: "Tillåt anpassade användarskript" - LABEL_USE_SHORT_LOGIN: "Använda korta inloggning" - LABEL_USE_AUTH: "Använd autentisering" - LABEL_USE_PHP_MAIL: "Använd php mail() funktionen" - BUTTON_TEST: "Test" - BUTTON_WHITE_LIST: "Vitlista" - BUTTON_SIEVE_CONFIGURATION: "sil-konfiguration" - BUTTON_BACK_TO_IMAP: "Tillbaka till IMAP inställningar" - BUTTON_BACK: "Tillbaka" - BUTTON_CLOSE: "Stäng" - BUTTON_ADD: "Lägg till" - BUTTON_UPDATE: "Uppdatera" - NEW_DOMAIN_DESC: "Denna domän konfiguration gör att du kan arbeta
med %NAME% e-postadresser." - WHITE_LIST_ALERT: | - Lista över domänanvändare som tillåts. - Använda ett utrymme som avgränsare. - POPUPS_PLUGIN: - TITLE_PLUGIN: "Plugin" - DESC_NOTHING_TO_CONFIGURE: "Inget att konfigurera" - BUTTON_CLOSE: "Stäng" - BUTTON_SAVE: "Spara" - TOOLTIP_ABOUT_TITLE: "Om" - POPUPS_ASK: - DESC_WANT_CLOSE_THIS_WINDOW: "Är du säker på att du vill stänga sidan?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Välj ditt språk" - HINTS: - BETA: "beta" - UNSTABLE: "instabil" - WARNING: "Varning!" - NOT_SUPPORTED: "stöds inte" - REQUIRES_PHP_54: "kräver PHP 5.4 eller högre" - ERRORS: - DOMAIN_ALREADY_EXISTS: "Domänen finns redan" - UNKNOWN_ERROR: "Okänt fel" - NOTIFICATIONS: - INVALID_TOKEN: "ogiltiga symboler" - AUTH_ERROR: "Autentisering misslyckades" - ACCESS_ERROR: "Åtkomstfel" - CONNECTION_ERROR: "Kan inte ansluta till servern" - CAPTCHA_ERROR: "Felaktigt CAPTCHA" - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Denna sociala ID inte tilldelas någon e-postkonto ännu. Logga in med e-referenser - och aktivera den här funktionen på kontots inställningar. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >+ - Denna sociala ID inte tilldelas någon e-postkonto ännu. Logga in med e-referenser - och aktivera den här funktionen på kontots inställningar. - - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Denna sociala ID inte tilldelas någon e-postkonto ännu. Logga in med e-referenser - och aktivera denna funktion i kontoinställningarna. - DOMAIN_NOT_ALLOWED: "Domänen är inte tillåten" - ACCOUNT_NOT_ALLOWED: "Kontot är inte tillåtet" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Två faktor kontroll som krävs" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Två faktor verifiering fel" - COULD_NOT_SAVE_NEW_PASSWORD: "Kan inte spara ditt nya lösenord" - CURRENT_PASSWORD_INCORRECT: "Nuvarande lösenord är fel" - NEW_PASSWORD_SHORT: "Lösenordet är för kort" - NEW_PASSWORD_WEAK: "Lösenordet är för lätt" - NEW_PASSWORD_FORBIDDENT: "Lösenordet innehåller otillåtna tecken" - CONTACTS_SYNC_ERROR: "Kontaktsynkroniseringsfel" - CANT_GET_MESSAGE_LIST: "Kan inte få tag i dina meddelanden" - CANT_GET_MESSAGE: "Det går inte att få tag i meddelanden" - CANT_DELETE_MESSAGE: "Kan inte ta bort meddelande" - CANT_MOVE_MESSAGE: "Kan inte flytta meddelande" - CANT_SAVE_MESSAGE: "Kan inte spara meddelande" - CANT_SEND_MESSAGE: "Kan inte skicka meddelande" - INVALID_RECIPIENTS: "Ogiltiga mottagare" - CANT_SAVE_FILTERS: "Kan inte spara filter" - CANT_GET_FILTERS: "Det går inte att få filter" - FILTERS_ARE_NOT_CORRECT: "Filter är inte korrekt" - CANT_CREATE_FOLDER: "Kan inte skapa mapp" - CANT_RENAME_FOLDER: "Kan inte ändra namn på mappen" - CANT_DELETE_FOLDER: "Kan inte ta bort mappen" - CANT_DELETE_NON_EMPTY_FOLDER: "Kan inte ta bort mappar som innehåller meddelanden" - CANT_SUBSCRIBE_FOLDER: "Kan inte prenumerera på mapp" - CANT_UNSUBSCRIBE_FOLDER: "Kan inte avprenumerera på mapp" - CANT_SAVE_SETTINGS: "Kan inte spara inställningarna" - CANT_SAVE_PLUGIN_SETTINGS: "Kan inte spara inställningarna" - DOMAIN_ALREADY_EXISTS: "Domänen finns redan" - CANT_INSTALL_PACKAGE: "Det gick inte att installera paketet" - CANT_DELETE_PACKAGE: "Det gick inte att ta bort paket" - INVALID_PLUGIN_PACKAGE: "Ogiltig plugin" - UNSUPPORTED_PLUGIN_PACKAGE: "Pluginet stöds inte" - LICENSING_SERVER_IS_UNAVAILABLE: "Prenumerations servern inte är tillgänglig" - LICENSING_DOMAIN_EXPIRED: "Abonnemang för den här domänen har gått ut." - LICENSING_DOMAIN_BANNED: "Abonnemang för den här domänen är förbjudet." - DEMO_SEND_MESSAGE_ERROR: "Av säkerhetsskäl är det här kontot inte tillåtet att skicka meddelanden till externa e-postadresser!" - DEMO_ACCOUNT_ERROR: "Av säkerhetsskäl är det här kontot inte tillåtet för denna åtgärd!" - ACCOUNT_ALREADY_EXISTS: "Kontot finns redan" - ACCOUNT_DOES_NOT_EXIST: "Kontot finns inte" - MAIL_SERVER_ERROR: "Kunde ansluta till mailservern" - INVALID_INPUT_ARGUMENT: "Ogiltig inmatning argument" - UNKNOWN_ERROR: "Okänt fel" - STATIC: - BACK_LINK: "Ladda om" - DOMAIN_LIST_DESC: "Lista av domäner som tillåsts" - PHP_EXSTENSIONS_ERROR_DESC: "Krävs PHP förlängning inte är tillgängliga i din PHP-konfiguration!" - PHP_VERSION_ERROR_DESC: "Din PHP version (%VERSION%) är lägre än den minimala som krävs 5.3.0!" - NO_SCRIPT_TITLE: "JavaScript krävs för denna applikation." - NO_SCRIPT_DESC: | - JavaScript stöd är inte tillgängligt i din webläsare. - Vänligen aktivera JavaScript stöd i din webbläsares inställningar och försök igen. - NO_COOKIE_TITLE: "Cookies stöd krävs för denna applikation." - NO_COOKIE_DESC: | - Cookies stöd är inte tillgängligt i din webbläsare. - Vänligen aktivera Cookie stöd i webbläsarens inställningar och försök igen. - BAD_BROWSER_TITLE: "Din webbläsare är föråldrad." - BAD_BROWSER_DESC: | - För att kunna använda alla funktioner i ansökan, - hämta och installera en av dessa webbläsare: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/zh_CN.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/zh_CN.yml deleted file mode 100755 index a43c67df..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/admin/zh_CN.yml +++ /dev/null @@ -1,317 +0,0 @@ -zh_CN: - LOGIN: - LABEL_LOGIN: "登陆" - LABEL_PASSWORD: "密码" - BUTTON_LOGIN: "登录到控制面板" - TOP_PANEL: - LABEL_PREMIUM: "高级" - LABEL_ADMIN_PANEL: "控制面板" - TABS_LABELS: - LABEL_GENERAL_NAME: "常规" - LABEL_LOGIN_NAME: "登陆" - LABEL_BRANDING_NAME: "Logo" - LABEL_CONTACTS_NAME: "联系人" - LABEL_DOMAINS_NAME: "域名" - LABEL_SECURITY_NAME: "安全" - LABEL_INTEGRATION_NAME: "整合" - LABEL_PLUGINS_NAME: "插件" - LABEL_PACKAGES_NAME: "插件包" - LABEL_LICENSING_NAME: "许可证" - LABEL_ABOUT_NAME: "关于" - TAB_GENERAL: - LEGEND_INTERFACE: "界面" - LABEL_LANGUAGE: "语言" - LABEL_LANGUAGE_ADMIN: "语言(后台)" - LABEL_THEME: "主题" - LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "允许在设置界面中选择语言" - LABEL_ALLOW_THEMES_ON_SETTINGS: "允许在设置界面中选择主题" - LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "允许在设置界面中选择背景" - LABEL_SHOW_THUMBNAILS: "显示缩略图(附件)" - LABEL_ALLOW_GRAVATAR: "允许使用头像" - LEGEND_MAIN: "主" - LABEL_ATTACHMENT_SIZE_LIMIT: "附件大小限制" - LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "允许额外的账户" - LABEL_ALLOW_IDENTITIES: "允许多重身份" - LABEL_ALLOW_TEMPLATES: "允许使用模板" - ALERT_WARNING: "警告" - HTML_ALERT_WEAK_PASSWORD: | - 您正在使用默认的管理员密码 -
- 安全起见,请立即将密码 - 更改 - 为其他的字符串。 - TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "登陆界面" - LABEL_DEFAULT_DOMAIN: "默认域名" - LABEL_DETERMINE_USER_DOMAIN: "尝试确定用户域名" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "允许在登陆界面选择语言" - LABEL_DETERMINE_USER_LANGUAGE: "尝试确定用户语言" - TAB_BRANDING: - LEGEND_BRANDING: "Logo" - LABEL_PAGE_TITLE: "页面标题" - LABEL_LOADING_DESCRIPTION: "正在加载介绍" - LABEL_FAVICON_URL: "图标" - LEGEND_LOGIN: "登陆" - LABEL_LOGIN_LOGO: "Logo" - LABEL_LOGIN_DESCRIPTION: "介绍" - LABEL_LOGIN_BACKGROUND: "背景" - LABEL_LOGIN_CUSTOM_CSS: "自定义CSS样式" - LABEL_LOGIN_SHOW_POWERED_LINK: "显示\"Powered by RainLoop\"链接" - LEGEND_USER: "用户" - LABEL_USER_LOGO: "Logo" - LABEL_USER_LOGO_TITLE: "Logo标题" - LABEL_USER_LOGO_MESSAGE: "Logo(邮件界面)" - LABEL_USER_CUSTOM_CSS: "自定义CSS样式" - LEGEND_WELCOME_PAGE: "欢迎页面" - LABEL_WELCOME_PAGE_TITLE: "标题" - LABEL_WELCOME_PAGE_URL: "URL地址" - LABEL_WELCOME_PAGE_DISPLAY: "显示" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "无" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "一次" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "永远" - HTML_ALERT_PREMIUM: "此功能仅限于高级 订阅者." - TAB_CONTACTS: - LEGEND_CONTACTS: "联系人" - LEGEND_STORAGE: "存储(PDO)" - LABEL_ENABLE_CONTACTS: "启用联系人" - LABEL_ALLOW_SYNC: "允许同步联系人(依靠外部CardDAV服务器)" - LABEL_STORAGE_TYPE: "类型" - LABEL_STORAGE_DSN: "Dsn" - LABEL_STORAGE_USER: "用户" - LABEL_STORAGE_PASSWORD: "密码" - BUTTON_TEST: "测试" - ALERT_NOTICE: "提示!" - HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "如果有大量的活跃用户,请不要选择此数据库类型." - HTML_ALERT_DOES_NOT_SUPPORTED: | - 你的系统不支持联系人 -
- 你需要在你的服务器上安装或启用PDO (SQLite / MySQL / PostgreSQL) 组件. - TAB_DOMAINS: - LEGEND_DOMAINS: "域名" - BUTTON_ADD_DOMAIN: "添加域名" - BUTTON_ADD_ALIAS: "添加别名" - DELETE_ARE_YOU_SURE: "你确定吗?" - HTML_DOMAINS_HELPER: | - 允许访问的域。 -
- 点击域名进行设置。 - TAB_SECURITY: - LEGEND_SECURITY: "安全" - LABEL_ALLOW_TWO_STEP: "允许2步验证" - LABEL_FORCE_TWO_STEP: "强制使用2步验证" - LABEL_USE_IMAGE_PROXY: "对外部图片使用本地代理" - LABEL_ALLOW_OPEN_PGP: "允许使用OpenPGP" - LABEL_SHOW_PHP_INFO: "显示PHP信息" - LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "管理员面板访问凭据" - LABEL_CURRENT_PASSWORD: "当前密码" - LABEL_NEW_LOGIN: "新的登陆用户名" - LABEL_NEW_PASSWORD: "新密码" - LABEL_REPEAT_PASSWORD: "重复" - BUTTON_UPDATE_PASSWORD: "更新密码" - LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: "要求验证SSL证书(IMAP/SMTP)" - LABEL_ALLOW_SELF_SIGNED: "允许自签署的证书" - TAB_INTEGRATIONS: - LEGEND_GOOGLE: "Google" - LABEL_ENABLE_GOOGLE: "启用Google整合" - LABEL_GOOGLE_AUTH: "认证" - LABEL_GOOGLE_DRIVE: "Google Drive 整合(撰写视图)" - LABEL_GOOGLE_PREVIEW: "Google Viewer 整合(预览Microsoft Word,Excel,和Powerpoint文档)" - LABEL_GOOGLE_CLIENT_ID: "用户ID" - LABEL_GOOGLE_CLIENT_SECRET: "用户密码" - LABEL_GOOGLE_API_KEY: "Api密钥" - HINT_GOOGLE_API_KEY: "要求使用Google Drive文件选择器" - LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "启用Facebook整合(认证)" - LABEL_FACEBOOK_APP_ID: "应用ID" - LABEL_FACEBOOK_APP_SECRET: "应用密钥" - LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "启用Twitter整合(认证)" - LABEL_TWITTER_CONSUMER_KEY: "用户Key" - LABEL_TWITTER_CONSUMER_SECRET: "用户Secret" - LEGEND_DROPBOX: "Dropbox" - LABEL_ENABLE_DROPBOX: "启用Dropbox整合" - LABEL_DROPBOX_API_KEY: "Api密钥" - TOP_ALERT: "社交媒体整合的详细信息找到于" - TAB_PLUGINS: - LEGEND_PLUGINS: "插件" - LABEL_ENABLE_PLUGINS: "启用插件" - ALERT_NO_PLUGINS: "当前还未安装插件." - LINK_INSTALL_NEW: "点击此处安装新插件!" - HINT_CLICK_NAME: "点击名称来配置插件." - TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "有更新可用" - LEGEND_AVAILABLE_FOR_INSTALLATION: "可用于安装" - LEGEND_INSTALLED_PACKAGES: "已安装的插件包" - ALERT_CANNOT_ACCESS_REPOSITORY: "目前无法使用仓库" - TAB_LICENSING: - LABEL_YOUR_DOMAIN: "你的域名" - LABEL_VERSION: "版本" - LABEL_CHECKING: "检查中" - TYPE_BASIC_HINT: "此域名不被许可用于商业用途(包括额外功能)." - TYPE_BASIC_HINT_2: "此域名无法被许可" - HTML_ALERT_TOP_1: "RainLoop Webmail位于的许可证下" - HTML_ALERT_TOP_2: "你可以自由地将它用于你的 私人 项目." - HTML_ALERT_TOP_3: | - 商业版的RainLoop Webmail自带更多功能,需要订阅。 - TYPE_PREMIUM_LIFETIME: "永久" - LABEL_SUB_EXPIRES: "订阅失效" - BUTTON_ACTIVATE: "为此域名启用订阅密钥" - BUTTON_PURCHASE: "订购" - BUTTON_TRIAL: "试用" - TAB_ABOUT: - LEGEND_ABOUT: "关于" - LABEL_TAG_HINT: "简洁,现代化&快捷的基于网络的邮件客户端" - LABEL_ALL_RIGHTS_RESERVED: "保留所有权利" - HINT_READ_CHANGE_LOG: "请在更新前阅读更新日志" - HINT_IS_UP_TO_DATE: "RainLoop已经是最新版本的" - HTML_NEW_VERSION: "有新的%VERSION% 版本可用." - LABEL_UPDATING: "更新中" - LABEL_CHECKING: "检查更新" - BUTTON_UPDATE: "更新" - BUTTON_DOWNLOAD: "下载" - BUTTON_CHANGELOG: "更新日志" - POPUPS_ACTIVATE: - TITLE_ACTIVATE: "启用订阅密钥?" - TITLE_ACTIVATION: "激活中..." - LABEL_DOMAIN: "域名" - LABEL_SUB_KEY: "订阅密钥" - BUTTON_ACTIVATE: "激活" - LABEL_ACTIVATED: "已激活" - ERROR_INVALID_SUBS_KEY: "无效的订阅密钥" - SUBS_KEY_ACTIVATED: "订阅密钥成功启用" - HTML_DESC: | - 激活后,域%DOMAIN%的订阅时间将会续展。 - 请注意,订阅密匙只可用于一个域。 -

- 激活开始后,激活过程中不可被中断或取消。 - POPUPS_DOMAIN_ALIAS: - TITLE_ADD_DOMAIN_ALIAS: "添加别名" - LABEL_ALIAS: "别名" - LABEL_DOMAIN: "域名" - BUTTON_CLOSE: "关闭" - BUTTON_ADD: "添加" - POPUPS_DOMAIN: - TITLE_ADD_DOMAIN: "添加域名" - TITLE_ADD_DOMAIN_WITH_NAME: "添加域名 \"%NAME%\"" - TITLE_EDIT_DOMAIN: "编辑域名 \"%NAME%\"" - LABEL_NAME: "名字" - NAME_HELPER: "可使用通配符" - LABEL_IMAP: "IMAP" - LABEL_SMTP: "SMTP" - LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "服务器" - LABEL_PORT: "端口" - LABEL_SECURE: "加密" - LABEL_WHITE_LIST: "白名单" - SECURE_OPTION_NONE: "无" - SECURE_OPTION_SSL: "SSL/TLS" - SECURE_OPTION_STARTTLS: "STARTTLS" - LABEL_ALLOW_SIEVE_SCRIPTS: "可使用筛选脚本" - LABEL_ALLOW_USER_SCRIPT: "允许用户自定义脚本" - LABEL_USE_SHORT_LOGIN: "使用短用户名登录" - LABEL_USE_AUTH: "使用认证" - LABEL_USE_PHP_MAIL: "使用 php mail() 函数" - BUTTON_TEST: "测试" - BUTTON_WHITE_LIST: "白名单" - BUTTON_SIEVE_CONFIGURATION: "筛选设置" - BUTTON_BACK_TO_IMAP: "回到IMAP设置" - BUTTON_BACK: "返回" - BUTTON_CLOSE: "关闭" - BUTTON_ADD: "添加" - BUTTON_UPDATE: "更新" - NEW_DOMAIN_DESC: "此域名配置将允许你
%NAME%电子邮件地址一起工作." - WHITE_LIST_ALERT: | - 允许访问的域用户。 - 使用空格分隔。 - POPUPS_PLUGIN: - TITLE_PLUGIN: "插件" - DESC_NOTHING_TO_CONFIGURE: "无可用配置" - BUTTON_CLOSE: "关闭" - BUTTON_SAVE: "保存" - TOOLTIP_ABOUT_TITLE: "关于" - POPUPS_ASK: - DESC_WANT_CLOSE_THIS_WINDOW: "你确定要关闭此窗口吗?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "选择您的语言" - HINTS: - BETA: "测试版本" - UNSTABLE: "不稳定版本" - WARNING: "警告" - NOT_SUPPORTED: "不支持" - REQUIRES_PHP_54: "要求PHP 5.4或更高版本" - ERRORS: - DOMAIN_ALREADY_EXISTS: "域名已经存在" - UNKNOWN_ERROR: "未知错误" - NOTIFICATIONS: - INVALID_TOKEN: "无效标记" - AUTH_ERROR: "认证失败" - ACCESS_ERROR: "访问错误" - CONNECTION_ERROR: "无法连接到服务器" - CAPTCHA_ERROR: "验证码不正确。" - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - 这个社交媒体ID并未与任何电邮账户关联。请使用电邮登录然后再在账户设置用启用此功能。 - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - 这个社交媒体ID并未与任何电邮账户关联。请使用电邮登录然后再在账户设置用启用此功能。 - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - 这个社交媒体ID并未与任何电邮账户关联。请使用电邮登录然后再在账户设置用启用此功能。 - DOMAIN_NOT_ALLOWED: "域名不被允许。" - ACCOUNT_NOT_ALLOWED: "账户不允许" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "需要两步验证" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "两步验证错误" - COULD_NOT_SAVE_NEW_PASSWORD: "无法保存新密码" - CURRENT_PASSWORD_INCORRECT: "当前密码不正确" - NEW_PASSWORD_SHORT: "密码太短" - NEW_PASSWORD_WEAK: "密码过于简单" - NEW_PASSWORD_FORBIDDENT: "密码包含禁止字符" - CONTACTS_SYNC_ERROR: "联系人同步错误" - CANT_GET_MESSAGE_LIST: "无法获取邮件列表" - CANT_GET_MESSAGE: "无法获取邮件" - CANT_DELETE_MESSAGE: "无法删除邮件" - CANT_MOVE_MESSAGE: "无法移动邮件" - CANT_SAVE_MESSAGE: "无法保存邮件" - CANT_SEND_MESSAGE: "无法发送邮件" - INVALID_RECIPIENTS: "无效接收者" - CANT_SAVE_FILTERS: "无法保存过滤器" - CANT_GET_FILTERS: "无法获取过滤器" - FILTERS_ARE_NOT_CORRECT: "过滤器不正确" - CANT_CREATE_FOLDER: "无法创建文件夹" - CANT_RENAME_FOLDER: "无法重命名文件夹" - CANT_DELETE_FOLDER: "无法删除文件夹" - CANT_DELETE_NON_EMPTY_FOLDER: "无法删除非空文件夹" - CANT_SUBSCRIBE_FOLDER: "无法订阅文件夹" - CANT_UNSUBSCRIBE_FOLDER: "无法取消订阅文件夹" - CANT_SAVE_SETTINGS: "无法保存设置" - CANT_SAVE_PLUGIN_SETTINGS: "无法保存设置" - DOMAIN_ALREADY_EXISTS: "域名已经存在" - CANT_INSTALL_PACKAGE: "安装插件包失败" - CANT_DELETE_PACKAGE: "移除插件包失败" - INVALID_PLUGIN_PACKAGE: "无效插件包" - UNSUPPORTED_PLUGIN_PACKAGE: "不支持的插件包" - LICENSING_SERVER_IS_UNAVAILABLE: "订阅服务器不可用" - LICENSING_DOMAIN_EXPIRED: "此域名的订阅服务已过期。" - LICENSING_DOMAIN_BANNED: "此域名的订阅服务已被禁止。" - DEMO_SEND_MESSAGE_ERROR: "出于安全考虑,此账号无法发送外部邮件!" - DEMO_ACCOUNT_ERROR: "出于安全考虑,此账户不允许进行此操作。" - ACCOUNT_ALREADY_EXISTS: "账户已存在" - ACCOUNT_DOES_NOT_EXIST: "账户不存在" - MAIL_SERVER_ERROR: "访问邮件服务器时遇到错误。" - INVALID_INPUT_ARGUMENT: "无效输入参数" - UNKNOWN_ERROR: "未知错误" - STATIC: - BACK_LINK: "重新加载" - DOMAIN_LIST_DESC: "可允许通过webmail访问的域名列表" - PHP_EXSTENSIONS_ERROR_DESC: "需要的PHP扩展在你的PHP配置中不可用!" - PHP_VERSION_ERROR_DESC: "您的PHP版本 (%VERSION%) 低于最低所需的 5.3.0!" - NO_SCRIPT_TITLE: "此应用需要JavaScript支持!" - NO_SCRIPT_DESC: | - 您的浏览器不支持JavaScript。 - 请启用浏览器的JavaScript支持并重试。 - NO_COOKIE_TITLE: "此应用需要Cookies支持!" - NO_COOKIE_DESC: | - 您的浏览器不支持Cookies。 - 请启用浏览器的Cookies支持并重试。 - BAD_BROWSER_TITLE: "您的浏览器过时了。" - BAD_BROWSER_DESC: | - 为了使用所有特性, - 下载并安装其中一款浏览器: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/langs.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/langs.yml deleted file mode 100755 index 620c5527..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/langs.yml +++ /dev/null @@ -1,91 +0,0 @@ - -Common: - LANGS_NAMES: - LANG_EN: English - LANG_EN_US: English - LANG_EN_GB: English (UK) - LANG_EN_UK: English (UK) - LANG_EN_CA: English (Canadian) - - LANG_TH_TH: ภาษาไทย - LANG_EL_GR: Ελληνικά - LANG_NL_NL: Nederlands - LANG_NB_NO: Norsk (bokmål) - LANG_PL_PL: Polski - LANG_RU_RU: Русский - LANG_RO_RO: Română - LANG_UK_UA: Українська - LANG_DE_DE: Deutsch - LANG_FI_FI: Suomi - LANG_FR_FR: Français (France) - LANG_FR_CA: Français (Canada) - LANG_PT_PT: Português (Portugal) - LANG_PT_BR: Português (Brasil) - LANG_ES_ES: Español (España) - LANG_ES_LA: Español - LANG_ET_EE: Eesti - LANG_FA_IR: ‏فارسی‏ - LANG_IT_IT: Italiano - LANG_LT_LT: Lietuvių - LANG_LV_LV: Latviešu - LANG_IS_IS: Íslenska - LANG_HU_HU: Magyar - LANG_TR_TR: Türkçe - LANG_SK_SK: Slovenčina - LANG_SV_SE: Svenska - LANG_SL_SI: Slovenščina - LANG_JA_JP: 日本語 - LANG_ZH_TW: 中文(台灣) - LANG_ZH_CN: 中文(简体) - LANG_ZH_HK: 中文(香港) - LANG_KO_KR: 한국어 - LANG_BG_BG: Български - LANG_CS_CZ: Čeština - LANG_AR_SA: ‏العربية‏ - LANG_DA_DK: Dansk - LANG_ID_ID: Bahasa Indonesia - - LANGS_NAMES_EN: - LANG_EN: English - LANG_EN_US: English (US) - LANG_EN_GB: English (UK) - LANG_EN_UK: English (UK) - LANG_EN_CA: English (Canadian) - - LANG_TH_TH: Thai - LANG_EL_GR: Greek - LANG_NL_NL: Dutch - LANG_NB_NO: Norwegian (bokmal) - LANG_PL_PL: Polish - LANG_RU_RU: Russian - LANG_RO_RO: Romanian - LANG_UK_UA: Ukrainian - LANG_DE_DE: German - LANG_FI_FI: Finnish - LANG_FR_FR: French (France) - LANG_FR_CA: France (Canada) - LANG_PT_PT: Portuguese (Portugal) - LANG_PT_BR: Portuguese (Brazil) - LANG_ES_ES: Spanish - LANG_ES_LA: Spanish - LANG_ET_EE: Estonian - LANG_FA_IR: Persian - LANG_IT_IT: Italian - LANG_LT_LT: Lithuanian - LANG_LV_LV: Latvian - LANG_IS_IS: Icelandic - LANG_HU_HU: Hungarian - LANG_TR_TR: Turkish - LANG_SK_SK: Slovak - LANG_SL_SI: Slovenian - LANG_SV_SE: Swedish - LANG_JA_JP: Japanese - LANG_ZH_TW: Traditional Chinese (Taiwan) - LANG_ZH_CN: Simplified Chinese (China) - LANG_ZH_HK: Traditional Chinese (Hong Kong) - LANG_KO_KR: Korean - LANG_BG_BG: Bulgarian - LANG_CS_CZ: Czech - LANG_AR_SA: Arabic - LANG_DA_DK: Danish - LANG_ID_ID: Indonesian diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/af.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/af.js deleted file mode 100755 index 0b2bb26e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/af.js +++ /dev/null @@ -1,72 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var af = moment.defineLocale('af', { - months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'), - monthsShort : 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'), - weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'), - weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'), - weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'), - meridiemParse: /vm|nm/i, - isPM : function (input) { - return /^nm$/i.test(input); - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 12) { - return isLower ? 'vm' : 'VM'; - } else { - return isLower ? 'nm' : 'NM'; - } - }, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Vandag om] LT', - nextDay : '[Môre om] LT', - nextWeek : 'dddd [om] LT', - lastDay : '[Gister om] LT', - lastWeek : '[Laas] dddd [om] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'oor %s', - past : '%s gelede', - s : '\'n paar sekondes', - ss : '%d sekondes', - m : '\'n minuut', - mm : '%d minute', - h : '\'n uur', - hh : '%d ure', - d : '\'n dag', - dd : '%d dae', - M : '\'n maand', - MM : '%d maande', - y : '\'n jaar', - yy : '%d jaar' - }, - dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter - }, - week : { - dow : 1, // Maandag is die eerste dag van die week. - doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. - } - }); - - return af; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-dz.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-dz.js deleted file mode 100755 index 26a7ccb2..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-dz.js +++ /dev/null @@ -1,58 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var arDz = moment.defineLocale('ar-dz', { - months : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - monthsShort : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'أح_إث_ثلا_أر_خم_جم_سب'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'في %s', - past : 'منذ %s', - s : 'ثوان', - ss : '%d ثانية', - m : 'دقيقة', - mm : '%d دقائق', - h : 'ساعة', - hh : '%d ساعات', - d : 'يوم', - dd : '%d أيام', - M : 'شهر', - MM : '%d أشهر', - y : 'سنة', - yy : '%d سنوات' - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 4 // The week that contains Jan 1st is the first week of the year. - } - }); - - return arDz; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-kw.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-kw.js deleted file mode 100755 index 10092ba3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-kw.js +++ /dev/null @@ -1,58 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var arKw = moment.defineLocale('ar-kw', { - months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), - monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), - weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'في %s', - past : 'منذ %s', - s : 'ثوان', - ss : '%d ثانية', - m : 'دقيقة', - mm : '%d دقائق', - h : 'ساعة', - hh : '%d ساعات', - d : 'يوم', - dd : '%d أيام', - M : 'شهر', - MM : '%d أشهر', - y : 'سنة', - yy : '%d سنوات' - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); - - return arKw; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-ly.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-ly.js deleted file mode 100755 index 2e3cb1a7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-ly.js +++ /dev/null @@ -1,121 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var symbolMap = { - '1': '1', - '2': '2', - '3': '3', - '4': '4', - '5': '5', - '6': '6', - '7': '7', - '8': '8', - '9': '9', - '0': '0' - }, pluralForm = function (n) { - return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; - }, plurals = { - s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], - m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], - h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], - d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], - M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], - y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] - }, pluralize = function (u) { - return function (number, withoutSuffix, string, isFuture) { - var f = pluralForm(number), - str = plurals[u][pluralForm(number)]; - if (f === 2) { - str = str[withoutSuffix ? 0 : 1]; - } - return str.replace(/%d/i, number); - }; - }, months = [ - 'يناير', - 'فبراير', - 'مارس', - 'أبريل', - 'مايو', - 'يونيو', - 'يوليو', - 'أغسطس', - 'سبتمبر', - 'أكتوبر', - 'نوفمبر', - 'ديسمبر' - ]; - - var arLy = moment.defineLocale('ar-ly', { - months : months, - monthsShort : months, - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'D/\u200FM/\u200FYYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - meridiemParse: /ص|م/, - isPM : function (input) { - return 'م' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ص'; - } else { - return 'م'; - } - }, - calendar : { - sameDay: '[اليوم عند الساعة] LT', - nextDay: '[غدًا عند الساعة] LT', - nextWeek: 'dddd [عند الساعة] LT', - lastDay: '[أمس عند الساعة] LT', - lastWeek: 'dddd [عند الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'بعد %s', - past : 'منذ %s', - s : pluralize('s'), - ss : pluralize('s'), - m : pluralize('m'), - mm : pluralize('m'), - h : pluralize('h'), - hh : pluralize('h'), - d : pluralize('d'), - dd : pluralize('d'), - M : pluralize('M'), - MM : pluralize('M'), - y : pluralize('y'), - yy : pluralize('y') - }, - preparse: function (string) { - return string.replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, '،'); - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); - - return arLy; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-ma.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-ma.js deleted file mode 100755 index 3d8503d1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-ma.js +++ /dev/null @@ -1,58 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var arMa = moment.defineLocale('ar-ma', { - months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), - monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), - weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'في %s', - past : 'منذ %s', - s : 'ثوان', - ss : '%d ثانية', - m : 'دقيقة', - mm : '%d دقائق', - h : 'ساعة', - hh : '%d ساعات', - d : 'يوم', - dd : '%d أيام', - M : 'شهر', - MM : '%d أشهر', - y : 'سنة', - yy : '%d سنوات' - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); - - return arMa; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-sa.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-sa.js deleted file mode 100755 index a62f8da4..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-sa.js +++ /dev/null @@ -1,103 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var symbolMap = { - '1': '١', - '2': '٢', - '3': '٣', - '4': '٤', - '5': '٥', - '6': '٦', - '7': '٧', - '8': '٨', - '9': '٩', - '0': '٠' - }, numberMap = { - '١': '1', - '٢': '2', - '٣': '3', - '٤': '4', - '٥': '5', - '٦': '6', - '٧': '7', - '٨': '8', - '٩': '9', - '٠': '0' - }; - - var arSa = moment.defineLocale('ar-sa', { - months : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - monthsShort : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - meridiemParse: /ص|م/, - isPM : function (input) { - return 'م' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ص'; - } else { - return 'م'; - } - }, - calendar : { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'في %s', - past : 'منذ %s', - s : 'ثوان', - ss : '%d ثانية', - m : 'دقيقة', - mm : '%d دقائق', - h : 'ساعة', - hh : '%d ساعات', - d : 'يوم', - dd : '%d أيام', - M : 'شهر', - MM : '%d أشهر', - y : 'سنة', - yy : '%d سنوات' - }, - preparse: function (string) { - return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { - return numberMap[match]; - }).replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, '،'); - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); - - return arSa; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-tn.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-tn.js deleted file mode 100755 index 8437717b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar-tn.js +++ /dev/null @@ -1,58 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var arTn = moment.defineLocale('ar-tn', { - months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, - longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY HH:mm', - LLLL: 'dddd D MMMM YYYY HH:mm' - }, - calendar: { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' - }, - relativeTime: { - future: 'في %s', - past: 'منذ %s', - s: 'ثوان', - ss : '%d ثانية', - m: 'دقيقة', - mm: '%d دقائق', - h: 'ساعة', - hh: '%d ساعات', - d: 'يوم', - dd: '%d أيام', - M: 'شهر', - MM: '%d أشهر', - y: 'سنة', - yy: '%d سنوات' - }, - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return arTn; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar.js deleted file mode 100755 index 3c6506b3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ar.js +++ /dev/null @@ -1,134 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var symbolMap = { - '1': '١', - '2': '٢', - '3': '٣', - '4': '٤', - '5': '٥', - '6': '٦', - '7': '٧', - '8': '٨', - '9': '٩', - '0': '٠' - }, numberMap = { - '١': '1', - '٢': '2', - '٣': '3', - '٤': '4', - '٥': '5', - '٦': '6', - '٧': '7', - '٨': '8', - '٩': '9', - '٠': '0' - }, pluralForm = function (n) { - return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; - }, plurals = { - s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], - m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], - h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], - d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], - M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], - y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] - }, pluralize = function (u) { - return function (number, withoutSuffix, string, isFuture) { - var f = pluralForm(number), - str = plurals[u][pluralForm(number)]; - if (f === 2) { - str = str[withoutSuffix ? 0 : 1]; - } - return str.replace(/%d/i, number); - }; - }, months = [ - 'يناير', - 'فبراير', - 'مارس', - 'أبريل', - 'مايو', - 'يونيو', - 'يوليو', - 'أغسطس', - 'سبتمبر', - 'أكتوبر', - 'نوفمبر', - 'ديسمبر' - ]; - - var ar = moment.defineLocale('ar', { - months : months, - monthsShort : months, - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'D/\u200FM/\u200FYYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - meridiemParse: /ص|م/, - isPM : function (input) { - return 'م' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ص'; - } else { - return 'م'; - } - }, - calendar : { - sameDay: '[اليوم عند الساعة] LT', - nextDay: '[غدًا عند الساعة] LT', - nextWeek: 'dddd [عند الساعة] LT', - lastDay: '[أمس عند الساعة] LT', - lastWeek: 'dddd [عند الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'بعد %s', - past : 'منذ %s', - s : pluralize('s'), - ss : pluralize('s'), - m : pluralize('m'), - mm : pluralize('m'), - h : pluralize('h'), - hh : pluralize('h'), - d : pluralize('d'), - dd : pluralize('d'), - M : pluralize('M'), - MM : pluralize('M'), - y : pluralize('y'), - yy : pluralize('y') - }, - preparse: function (string) { - return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { - return numberMap[match]; - }).replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, '،'); - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); - - return ar; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/az.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/az.js deleted file mode 100755 index 04930726..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/az.js +++ /dev/null @@ -1,104 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var suffixes = { - 1: '-inci', - 5: '-inci', - 8: '-inci', - 70: '-inci', - 80: '-inci', - 2: '-nci', - 7: '-nci', - 20: '-nci', - 50: '-nci', - 3: '-üncü', - 4: '-üncü', - 100: '-üncü', - 6: '-ncı', - 9: '-uncu', - 10: '-uncu', - 30: '-uncu', - 60: '-ıncı', - 90: '-ıncı' - }; - - var az = moment.defineLocale('az', { - months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'), - monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'), - weekdays : 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'), - weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'), - weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[bugün saat] LT', - nextDay : '[sabah saat] LT', - nextWeek : '[gələn həftə] dddd [saat] LT', - lastDay : '[dünən] LT', - lastWeek : '[keçən həftə] dddd [saat] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s sonra', - past : '%s əvvəl', - s : 'birneçə saniyyə', - ss : '%d saniyə', - m : 'bir dəqiqə', - mm : '%d dəqiqə', - h : 'bir saat', - hh : '%d saat', - d : 'bir gün', - dd : '%d gün', - M : 'bir ay', - MM : '%d ay', - y : 'bir il', - yy : '%d il' - }, - meridiemParse: /gecə|səhər|gündüz|axşam/, - isPM : function (input) { - return /^(gündüz|axşam)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'gecə'; - } else if (hour < 12) { - return 'səhər'; - } else if (hour < 17) { - return 'gündüz'; - } else { - return 'axşam'; - } - }, - dayOfMonthOrdinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/, - ordinal : function (number) { - if (number === 0) { // special case for zero - return number + '-ıncı'; - } - var a = number % 10, - b = number % 100 - a, - c = number >= 100 ? 100 : null; - return number + (suffixes[a] || suffixes[b] || suffixes[c]); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return az; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/be.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/be.js deleted file mode 100755 index 46a2a11f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/be.js +++ /dev/null @@ -1,131 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - function plural(word, num) { - var forms = word.split('_'); - return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); - } - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'ss': withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд', - 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін', - 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін', - 'dd': 'дзень_дні_дзён', - 'MM': 'месяц_месяцы_месяцаў', - 'yy': 'год_гады_гадоў' - }; - if (key === 'm') { - return withoutSuffix ? 'хвіліна' : 'хвіліну'; - } - else if (key === 'h') { - return withoutSuffix ? 'гадзіна' : 'гадзіну'; - } - else { - return number + ' ' + plural(format[key], +number); - } - } - - var be = moment.defineLocale('be', { - months : { - format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_'), - standalone: 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_') - }, - monthsShort : 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'), - weekdays : { - format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_'), - standalone: 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'), - isFormat: /\[ ?[Вв] ?(?:мінулую|наступную)? ?\] ?dddd/ - }, - weekdaysShort : 'нд_пн_ат_ср_чц_пт_сб'.split('_'), - weekdaysMin : 'нд_пн_ат_ср_чц_пт_сб'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY г.', - LLL : 'D MMMM YYYY г., HH:mm', - LLLL : 'dddd, D MMMM YYYY г., HH:mm' - }, - calendar : { - sameDay: '[Сёння ў] LT', - nextDay: '[Заўтра ў] LT', - lastDay: '[Учора ў] LT', - nextWeek: function () { - return '[У] dddd [ў] LT'; - }, - lastWeek: function () { - switch (this.day()) { - case 0: - case 3: - case 5: - case 6: - return '[У мінулую] dddd [ў] LT'; - case 1: - case 2: - case 4: - return '[У мінулы] dddd [ў] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'праз %s', - past : '%s таму', - s : 'некалькі секунд', - m : relativeTimeWithPlural, - mm : relativeTimeWithPlural, - h : relativeTimeWithPlural, - hh : relativeTimeWithPlural, - d : 'дзень', - dd : relativeTimeWithPlural, - M : 'месяц', - MM : relativeTimeWithPlural, - y : 'год', - yy : relativeTimeWithPlural - }, - meridiemParse: /ночы|раніцы|дня|вечара/, - isPM : function (input) { - return /^(дня|вечара)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ночы'; - } else if (hour < 12) { - return 'раніцы'; - } else if (hour < 17) { - return 'дня'; - } else { - return 'вечара'; - } - }, - dayOfMonthOrdinalParse: /\d{1,2}-(і|ы|га)/, - ordinal: function (number, period) { - switch (period) { - case 'M': - case 'd': - case 'DDD': - case 'w': - case 'W': - return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы'; - case 'D': - return number + '-га'; - default: - return number; - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return be; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bg.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bg.js deleted file mode 100755 index f8528a2a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bg.js +++ /dev/null @@ -1,89 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var bg = moment.defineLocale('bg', { - months : 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'), - monthsShort : 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'), - weekdays : 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'), - weekdaysShort : 'нед_пон_вто_сря_чет_пет_съб'.split('_'), - weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'D.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY H:mm', - LLLL : 'dddd, D MMMM YYYY H:mm' - }, - calendar : { - sameDay : '[Днес в] LT', - nextDay : '[Утре в] LT', - nextWeek : 'dddd [в] LT', - lastDay : '[Вчера в] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - case 6: - return '[В изминалата] dddd [в] LT'; - case 1: - case 2: - case 4: - case 5: - return '[В изминалия] dddd [в] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'след %s', - past : 'преди %s', - s : 'няколко секунди', - ss : '%d секунди', - m : 'минута', - mm : '%d минути', - h : 'час', - hh : '%d часа', - d : 'ден', - dd : '%d дни', - M : 'месец', - MM : '%d месеца', - y : 'година', - yy : '%d години' - }, - dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, - ordinal : function (number) { - var lastDigit = number % 10, - last2Digits = number % 100; - if (number === 0) { - return number + '-ев'; - } else if (last2Digits === 0) { - return number + '-ен'; - } else if (last2Digits > 10 && last2Digits < 20) { - return number + '-ти'; - } else if (lastDigit === 1) { - return number + '-ви'; - } else if (lastDigit === 2) { - return number + '-ри'; - } else if (lastDigit === 7 || lastDigit === 8) { - return number + '-ми'; - } else { - return number + '-ти'; - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return bg; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bm.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bm.js deleted file mode 100755 index 2bb50f51..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bm.js +++ /dev/null @@ -1,57 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var bm = moment.defineLocale('bm', { - months : 'Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo'.split('_'), - monthsShort : 'Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des'.split('_'), - weekdays : 'Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri'.split('_'), - weekdaysShort : 'Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib'.split('_'), - weekdaysMin : 'Ka_Nt_Ta_Ar_Al_Ju_Si'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'MMMM [tile] D [san] YYYY', - LLL : 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm', - LLLL : 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm' - }, - calendar : { - sameDay : '[Bi lɛrɛ] LT', - nextDay : '[Sini lɛrɛ] LT', - nextWeek : 'dddd [don lɛrɛ] LT', - lastDay : '[Kunu lɛrɛ] LT', - lastWeek : 'dddd [tɛmɛnen lɛrɛ] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s kɔnɔ', - past : 'a bɛ %s bɔ', - s : 'sanga dama dama', - ss : 'sekondi %d', - m : 'miniti kelen', - mm : 'miniti %d', - h : 'lɛrɛ kelen', - hh : 'lɛrɛ %d', - d : 'tile kelen', - dd : 'tile %d', - M : 'kalo kelen', - MM : 'kalo %d', - y : 'san kelen', - yy : 'san %d' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return bm; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bn.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bn.js deleted file mode 100755 index d7d33f53..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bn.js +++ /dev/null @@ -1,118 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var symbolMap = { - '1': '১', - '2': '২', - '3': '৩', - '4': '৪', - '5': '৫', - '6': '৬', - '7': '৭', - '8': '৮', - '9': '৯', - '0': '০' - }, - numberMap = { - '১': '1', - '২': '2', - '৩': '3', - '৪': '4', - '৫': '5', - '৬': '6', - '৭': '7', - '৮': '8', - '৯': '9', - '০': '0' - }; - - var bn = moment.defineLocale('bn', { - months : 'জানুয়ারী_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'), - monthsShort : 'জানু_ফেব_মার্চ_এপ্র_মে_জুন_জুল_আগ_সেপ্ট_অক্টো_নভে_ডিসে'.split('_'), - weekdays : 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split('_'), - weekdaysShort : 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'), - weekdaysMin : 'রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি'.split('_'), - longDateFormat : { - LT : 'A h:mm সময়', - LTS : 'A h:mm:ss সময়', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm সময়', - LLLL : 'dddd, D MMMM YYYY, A h:mm সময়' - }, - calendar : { - sameDay : '[আজ] LT', - nextDay : '[আগামীকাল] LT', - nextWeek : 'dddd, LT', - lastDay : '[গতকাল] LT', - lastWeek : '[গত] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s পরে', - past : '%s আগে', - s : 'কয়েক সেকেন্ড', - ss : '%d সেকেন্ড', - m : 'এক মিনিট', - mm : '%d মিনিট', - h : 'এক ঘন্টা', - hh : '%d ঘন্টা', - d : 'এক দিন', - dd : '%d দিন', - M : 'এক মাস', - MM : '%d মাস', - y : 'এক বছর', - yy : '%d বছর' - }, - preparse: function (string) { - return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if ((meridiem === 'রাত' && hour >= 4) || - (meridiem === 'দুপুর' && hour < 5) || - meridiem === 'বিকাল') { - return hour + 12; - } else { - return hour; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'রাত'; - } else if (hour < 10) { - return 'সকাল'; - } else if (hour < 17) { - return 'দুপুর'; - } else if (hour < 20) { - return 'বিকাল'; - } else { - return 'রাত'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); - - return bn; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bo.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bo.js deleted file mode 100755 index ff0dcbec..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bo.js +++ /dev/null @@ -1,118 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var symbolMap = { - '1': '༡', - '2': '༢', - '3': '༣', - '4': '༤', - '5': '༥', - '6': '༦', - '7': '༧', - '8': '༨', - '9': '༩', - '0': '༠' - }, - numberMap = { - '༡': '1', - '༢': '2', - '༣': '3', - '༤': '4', - '༥': '5', - '༦': '6', - '༧': '7', - '༨': '8', - '༩': '9', - '༠': '0' - }; - - var bo = moment.defineLocale('bo', { - months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), - monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), - weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'), - weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), - weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), - longDateFormat : { - LT : 'A h:mm', - LTS : 'A h:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm', - LLLL : 'dddd, D MMMM YYYY, A h:mm' - }, - calendar : { - sameDay : '[དི་རིང] LT', - nextDay : '[སང་ཉིན] LT', - nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT', - lastDay : '[ཁ་སང] LT', - lastWeek : '[བདུན་ཕྲག་མཐའ་མ] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s ལ་', - past : '%s སྔན་ལ', - s : 'ལམ་སང', - ss : '%d སྐར་ཆ།', - m : 'སྐར་མ་གཅིག', - mm : '%d སྐར་མ', - h : 'ཆུ་ཚོད་གཅིག', - hh : '%d ཆུ་ཚོད', - d : 'ཉིན་གཅིག', - dd : '%d ཉིན་', - M : 'ཟླ་བ་གཅིག', - MM : '%d ཟླ་བ', - y : 'ལོ་གཅིག', - yy : '%d ལོ' - }, - preparse: function (string) { - return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if ((meridiem === 'མཚན་མོ' && hour >= 4) || - (meridiem === 'ཉིན་གུང' && hour < 5) || - meridiem === 'དགོང་དག') { - return hour + 12; - } else { - return hour; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'མཚན་མོ'; - } else if (hour < 10) { - return 'ཞོགས་ཀས'; - } else if (hour < 17) { - return 'ཉིན་གུང'; - } else if (hour < 20) { - return 'དགོང་དག'; - } else { - return 'མཚན་མོ'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); - - return bo; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/br.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/br.js deleted file mode 100755 index 42994ca6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/br.js +++ /dev/null @@ -1,107 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - function relativeTimeWithMutation(number, withoutSuffix, key) { - var format = { - 'mm': 'munutenn', - 'MM': 'miz', - 'dd': 'devezh' - }; - return number + ' ' + mutation(format[key], number); - } - function specialMutationForYears(number) { - switch (lastNumber(number)) { - case 1: - case 3: - case 4: - case 5: - case 9: - return number + ' bloaz'; - default: - return number + ' vloaz'; - } - } - function lastNumber(number) { - if (number > 9) { - return lastNumber(number % 10); - } - return number; - } - function mutation(text, number) { - if (number === 2) { - return softMutation(text); - } - return text; - } - function softMutation(text) { - var mutationTable = { - 'm': 'v', - 'b': 'v', - 'd': 'z' - }; - if (mutationTable[text.charAt(0)] === undefined) { - return text; - } - return mutationTable[text.charAt(0)] + text.substring(1); - } - - var br = moment.defineLocale('br', { - months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'), - monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'), - weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'), - weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'), - weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'h[e]mm A', - LTS : 'h[e]mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D [a viz] MMMM YYYY', - LLL : 'D [a viz] MMMM YYYY h[e]mm A', - LLLL : 'dddd, D [a viz] MMMM YYYY h[e]mm A' - }, - calendar : { - sameDay : '[Hiziv da] LT', - nextDay : '[Warc\'hoazh da] LT', - nextWeek : 'dddd [da] LT', - lastDay : '[Dec\'h da] LT', - lastWeek : 'dddd [paset da] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'a-benn %s', - past : '%s \'zo', - s : 'un nebeud segondennoù', - ss : '%d eilenn', - m : 'ur vunutenn', - mm : relativeTimeWithMutation, - h : 'un eur', - hh : '%d eur', - d : 'un devezh', - dd : relativeTimeWithMutation, - M : 'ur miz', - MM : relativeTimeWithMutation, - y : 'ur bloaz', - yy : specialMutationForYears - }, - dayOfMonthOrdinalParse: /\d{1,2}(añ|vet)/, - ordinal : function (number) { - var output = (number === 1) ? 'añ' : 'vet'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return br; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bs.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bs.js deleted file mode 100755 index 0aaf0e14..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/bs.js +++ /dev/null @@ -1,150 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'ss': - if (number === 1) { - result += 'sekunda'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'sekunde'; - } else { - result += 'sekundi'; - } - return result; - case 'm': - return withoutSuffix ? 'jedna minuta' : 'jedne minute'; - case 'mm': - if (number === 1) { - result += 'minuta'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'minute'; - } else { - result += 'minuta'; - } - return result; - case 'h': - return withoutSuffix ? 'jedan sat' : 'jednog sata'; - case 'hh': - if (number === 1) { - result += 'sat'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'sata'; - } else { - result += 'sati'; - } - return result; - case 'dd': - if (number === 1) { - result += 'dan'; - } else { - result += 'dana'; - } - return result; - case 'MM': - if (number === 1) { - result += 'mjesec'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'mjeseca'; - } else { - result += 'mjeseci'; - } - return result; - case 'yy': - if (number === 1) { - result += 'godina'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'godine'; - } else { - result += 'godina'; - } - return result; - } - } - - var bs = moment.defineLocale('bs', { - months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'), - monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'), - monthsParseExact: true, - weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), - weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), - weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd, D. MMMM YYYY H:mm' - }, - calendar : { - sameDay : '[danas u] LT', - nextDay : '[sutra u] LT', - nextWeek : function () { - switch (this.day()) { - case 0: - return '[u] [nedjelju] [u] LT'; - case 3: - return '[u] [srijedu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[jučer u] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - return '[prošlu] dddd [u] LT'; - case 6: - return '[prošle] [subote] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[prošli] dddd [u] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'za %s', - past : 'prije %s', - s : 'par sekundi', - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : 'dan', - dd : translate, - M : 'mjesec', - MM : translate, - y : 'godinu', - yy : translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return bs; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ca.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ca.js deleted file mode 100755 index 9a823b93..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ca.js +++ /dev/null @@ -1,87 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var ca = moment.defineLocale('ca', { - months : { - standalone: 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'), - format: 'de gener_de febrer_de març_d\'abril_de maig_de juny_de juliol_d\'agost_de setembre_d\'octubre_de novembre_de desembre'.split('_'), - isFormat: /D[oD]?(\s)+MMMM/ - }, - monthsShort : 'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split('_'), - monthsParseExact : true, - weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'), - weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), - weekdaysMin : 'dg_dl_dt_dc_dj_dv_ds'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM [de] YYYY', - ll : 'D MMM YYYY', - LLL : 'D MMMM [de] YYYY [a les] H:mm', - lll : 'D MMM YYYY, H:mm', - LLLL : 'dddd D MMMM [de] YYYY [a les] H:mm', - llll : 'ddd D MMM YYYY, H:mm' - }, - calendar : { - sameDay : function () { - return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - nextDay : function () { - return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - nextWeek : function () { - return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - lastDay : function () { - return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - lastWeek : function () { - return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'd\'aquí %s', - past : 'fa %s', - s : 'uns segons', - ss : '%d segons', - m : 'un minut', - mm : '%d minuts', - h : 'una hora', - hh : '%d hores', - d : 'un dia', - dd : '%d dies', - M : 'un mes', - MM : '%d mesos', - y : 'un any', - yy : '%d anys' - }, - dayOfMonthOrdinalParse: /\d{1,2}(r|n|t|è|a)/, - ordinal : function (number, period) { - var output = (number === 1) ? 'r' : - (number === 2) ? 'n' : - (number === 3) ? 'r' : - (number === 4) ? 't' : 'è'; - if (period === 'w' || period === 'W') { - output = 'a'; - } - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return ca; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cs.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cs.js deleted file mode 100755 index 5ae9b627..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cs.js +++ /dev/null @@ -1,178 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var months = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_'), - monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_'); - function plural(n) { - return (n > 1) && (n < 5) && (~~(n / 10) !== 1); - } - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': // a few seconds / in a few seconds / a few seconds ago - return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami'; - case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'sekundy' : 'sekund'); - } else { - return result + 'sekundami'; - } - break; - case 'm': // a minute / in a minute / a minute ago - return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); - case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'minuty' : 'minut'); - } else { - return result + 'minutami'; - } - break; - case 'h': // an hour / in an hour / an hour ago - return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); - case 'hh': // 9 hours / in 9 hours / 9 hours ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'hodiny' : 'hodin'); - } else { - return result + 'hodinami'; - } - break; - case 'd': // a day / in a day / a day ago - return (withoutSuffix || isFuture) ? 'den' : 'dnem'; - case 'dd': // 9 days / in 9 days / 9 days ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'dny' : 'dní'); - } else { - return result + 'dny'; - } - break; - case 'M': // a month / in a month / a month ago - return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem'; - case 'MM': // 9 months / in 9 months / 9 months ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'měsíce' : 'měsíců'); - } else { - return result + 'měsíci'; - } - break; - case 'y': // a year / in a year / a year ago - return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; - case 'yy': // 9 years / in 9 years / 9 years ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'roky' : 'let'); - } else { - return result + 'lety'; - } - break; - } - } - - var cs = moment.defineLocale('cs', { - months : months, - monthsShort : monthsShort, - monthsParse : (function (months, monthsShort) { - var i, _monthsParse = []; - for (i = 0; i < 12; i++) { - // use custom parser to solve problem with July (červenec) - _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); - } - return _monthsParse; - }(months, monthsShort)), - shortMonthsParse : (function (monthsShort) { - var i, _shortMonthsParse = []; - for (i = 0; i < 12; i++) { - _shortMonthsParse[i] = new RegExp('^' + monthsShort[i] + '$', 'i'); - } - return _shortMonthsParse; - }(monthsShort)), - longMonthsParse : (function (months) { - var i, _longMonthsParse = []; - for (i = 0; i < 12; i++) { - _longMonthsParse[i] = new RegExp('^' + months[i] + '$', 'i'); - } - return _longMonthsParse; - }(months)), - weekdays : 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'), - weekdaysShort : 'ne_po_út_st_čt_pá_so'.split('_'), - weekdaysMin : 'ne_po_út_st_čt_pá_so'.split('_'), - longDateFormat : { - LT: 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd D. MMMM YYYY H:mm', - l : 'D. M. YYYY' - }, - calendar : { - sameDay: '[dnes v] LT', - nextDay: '[zítra v] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[v neděli v] LT'; - case 1: - case 2: - return '[v] dddd [v] LT'; - case 3: - return '[ve středu v] LT'; - case 4: - return '[ve čtvrtek v] LT'; - case 5: - return '[v pátek v] LT'; - case 6: - return '[v sobotu v] LT'; - } - }, - lastDay: '[včera v] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[minulou neděli v] LT'; - case 1: - case 2: - return '[minulé] dddd [v] LT'; - case 3: - return '[minulou středu v] LT'; - case 4: - case 5: - return '[minulý] dddd [v] LT'; - case 6: - return '[minulou sobotu v] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'za %s', - past : 'před %s', - s : translate, - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - dayOfMonthOrdinalParse : /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return cs; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cv.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cv.js deleted file mode 100755 index 9b99c3c4..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cv.js +++ /dev/null @@ -1,62 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var cv = moment.defineLocale('cv', { - months : 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split('_'), - monthsShort : 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'), - weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split('_'), - weekdaysShort : 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'), - weekdaysMin : 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD-MM-YYYY', - LL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]', - LLL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm', - LLLL : 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm' - }, - calendar : { - sameDay: '[Паян] LT [сехетре]', - nextDay: '[Ыран] LT [сехетре]', - lastDay: '[Ӗнер] LT [сехетре]', - nextWeek: '[Ҫитес] dddd LT [сехетре]', - lastWeek: '[Иртнӗ] dddd LT [сехетре]', - sameElse: 'L' - }, - relativeTime : { - future : function (output) { - var affix = /сехет$/i.exec(output) ? 'рен' : /ҫул$/i.exec(output) ? 'тан' : 'ран'; - return output + affix; - }, - past : '%s каялла', - s : 'пӗр-ик ҫеккунт', - ss : '%d ҫеккунт', - m : 'пӗр минут', - mm : '%d минут', - h : 'пӗр сехет', - hh : '%d сехет', - d : 'пӗр кун', - dd : '%d кун', - M : 'пӗр уйӑх', - MM : '%d уйӑх', - y : 'пӗр ҫул', - yy : '%d ҫул' - }, - dayOfMonthOrdinalParse: /\d{1,2}-мӗш/, - ordinal : '%d-мӗш', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return cv; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cy.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cy.js deleted file mode 100755 index 84cbd463..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/cy.js +++ /dev/null @@ -1,79 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var cy = moment.defineLocale('cy', { - months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'), - monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'), - weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'), - weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'), - weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'), - weekdaysParseExact : true, - // time formats are the same as en-gb - longDateFormat: { - LT: 'HH:mm', - LTS : 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY HH:mm', - LLLL: 'dddd, D MMMM YYYY HH:mm' - }, - calendar: { - sameDay: '[Heddiw am] LT', - nextDay: '[Yfory am] LT', - nextWeek: 'dddd [am] LT', - lastDay: '[Ddoe am] LT', - lastWeek: 'dddd [diwethaf am] LT', - sameElse: 'L' - }, - relativeTime: { - future: 'mewn %s', - past: '%s yn ôl', - s: 'ychydig eiliadau', - ss: '%d eiliad', - m: 'munud', - mm: '%d munud', - h: 'awr', - hh: '%d awr', - d: 'diwrnod', - dd: '%d diwrnod', - M: 'mis', - MM: '%d mis', - y: 'blwyddyn', - yy: '%d flynedd' - }, - dayOfMonthOrdinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/, - // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh - ordinal: function (number) { - var b = number, - output = '', - lookup = [ - '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed - 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed - ]; - if (b > 20) { - if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) { - output = 'fed'; // not 30ain, 70ain or 90ain - } else { - output = 'ain'; - } - } else if (b > 0) { - output = lookup[b]; - } - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return cy; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/da.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/da.js deleted file mode 100755 index 22a1a5b9..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/da.js +++ /dev/null @@ -1,59 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var da = moment.defineLocale('da', { - months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'), - monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), - weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), - weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'), - weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY HH:mm', - LLLL : 'dddd [d.] D. MMMM YYYY [kl.] HH:mm' - }, - calendar : { - sameDay : '[i dag kl.] LT', - nextDay : '[i morgen kl.] LT', - nextWeek : 'på dddd [kl.] LT', - lastDay : '[i går kl.] LT', - lastWeek : '[i] dddd[s kl.] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'om %s', - past : '%s siden', - s : 'få sekunder', - ss : '%d sekunder', - m : 'et minut', - mm : '%d minutter', - h : 'en time', - hh : '%d timer', - d : 'en dag', - dd : '%d dage', - M : 'en måned', - MM : '%d måneder', - y : 'et år', - yy : '%d år' - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return da; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de-at.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de-at.js deleted file mode 100755 index e3ac47b4..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de-at.js +++ /dev/null @@ -1,75 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eine Minute', 'einer Minute'], - 'h': ['eine Stunde', 'einer Stunde'], - 'd': ['ein Tag', 'einem Tag'], - 'dd': [number + ' Tage', number + ' Tagen'], - 'M': ['ein Monat', 'einem Monat'], - 'MM': [number + ' Monate', number + ' Monaten'], - 'y': ['ein Jahr', 'einem Jahr'], - 'yy': [number + ' Jahre', number + ' Jahren'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - - var deAt = moment.defineLocale('de-at', { - months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort : 'Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), - monthsParseExact : true, - weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), - weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), - weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY HH:mm', - LLLL : 'dddd, D. MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[heute um] LT [Uhr]', - sameElse: 'L', - nextDay: '[morgen um] LT [Uhr]', - nextWeek: 'dddd [um] LT [Uhr]', - lastDay: '[gestern um] LT [Uhr]', - lastWeek: '[letzten] dddd [um] LT [Uhr]' - }, - relativeTime : { - future : 'in %s', - past : 'vor %s', - s : 'ein paar Sekunden', - ss : '%d Sekunden', - m : processRelativeTime, - mm : '%d Minuten', - h : processRelativeTime, - hh : '%d Stunden', - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return deAt; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de-ch.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de-ch.js deleted file mode 100755 index 2676afbc..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de-ch.js +++ /dev/null @@ -1,75 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eine Minute', 'einer Minute'], - 'h': ['eine Stunde', 'einer Stunde'], - 'd': ['ein Tag', 'einem Tag'], - 'dd': [number + ' Tage', number + ' Tagen'], - 'M': ['ein Monat', 'einem Monat'], - 'MM': [number + ' Monate', number + ' Monaten'], - 'y': ['ein Jahr', 'einem Jahr'], - 'yy': [number + ' Jahre', number + ' Jahren'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - - var deCh = moment.defineLocale('de-ch', { - months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), - monthsParseExact : true, - weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), - weekdaysShort : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), - weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY HH:mm', - LLLL : 'dddd, D. MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[heute um] LT [Uhr]', - sameElse: 'L', - nextDay: '[morgen um] LT [Uhr]', - nextWeek: 'dddd [um] LT [Uhr]', - lastDay: '[gestern um] LT [Uhr]', - lastWeek: '[letzten] dddd [um] LT [Uhr]' - }, - relativeTime : { - future : 'in %s', - past : 'vor %s', - s : 'ein paar Sekunden', - ss : '%d Sekunden', - m : processRelativeTime, - mm : '%d Minuten', - h : processRelativeTime, - hh : '%d Stunden', - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return deCh; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de.js deleted file mode 100755 index d5c084a2..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/de.js +++ /dev/null @@ -1,75 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eine Minute', 'einer Minute'], - 'h': ['eine Stunde', 'einer Stunde'], - 'd': ['ein Tag', 'einem Tag'], - 'dd': [number + ' Tage', number + ' Tagen'], - 'M': ['ein Monat', 'einem Monat'], - 'MM': [number + ' Monate', number + ' Monaten'], - 'y': ['ein Jahr', 'einem Jahr'], - 'yy': [number + ' Jahre', number + ' Jahren'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - - var de = moment.defineLocale('de', { - months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), - monthsParseExact : true, - weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), - weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), - weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY HH:mm', - LLLL : 'dddd, D. MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[heute um] LT [Uhr]', - sameElse: 'L', - nextDay: '[morgen um] LT [Uhr]', - nextWeek: 'dddd [um] LT [Uhr]', - lastDay: '[gestern um] LT [Uhr]', - lastWeek: '[letzten] dddd [um] LT [Uhr]' - }, - relativeTime : { - future : 'in %s', - past : 'vor %s', - s : 'ein paar Sekunden', - ss : '%d Sekunden', - m : processRelativeTime, - mm : '%d Minuten', - h : processRelativeTime, - hh : '%d Stunden', - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return de; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/dv.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/dv.js deleted file mode 100755 index 6f057ca1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/dv.js +++ /dev/null @@ -1,98 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var months = [ - 'ޖެނުއަރީ', - 'ފެބްރުއަރީ', - 'މާރިޗު', - 'އޭޕްރީލު', - 'މޭ', - 'ޖޫން', - 'ޖުލައި', - 'އޯގަސްޓު', - 'ސެޕްޓެމްބަރު', - 'އޮކްޓޯބަރު', - 'ނޮވެމްބަރު', - 'ޑިސެމްބަރު' - ], weekdays = [ - 'އާދިއްތަ', - 'ހޯމަ', - 'އަންގާރަ', - 'ބުދަ', - 'ބުރާސްފަތި', - 'ހުކުރު', - 'ހޮނިހިރު' - ]; - - var dv = moment.defineLocale('dv', { - months : months, - monthsShort : months, - weekdays : weekdays, - weekdaysShort : weekdays, - weekdaysMin : 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'), - longDateFormat : { - - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'D/M/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - meridiemParse: /މކ|މފ/, - isPM : function (input) { - return 'މފ' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'މކ'; - } else { - return 'މފ'; - } - }, - calendar : { - sameDay : '[މިއަދު] LT', - nextDay : '[މާދަމާ] LT', - nextWeek : 'dddd LT', - lastDay : '[އިއްޔެ] LT', - lastWeek : '[ފާއިތުވި] dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : 'ތެރޭގައި %s', - past : 'ކުރިން %s', - s : 'ސިކުންތުކޮޅެއް', - ss : 'd% ސިކުންތު', - m : 'މިނިޓެއް', - mm : 'މިނިޓު %d', - h : 'ގަޑިއިރެއް', - hh : 'ގަޑިއިރު %d', - d : 'ދުވަހެއް', - dd : 'ދުވަސް %d', - M : 'މަހެއް', - MM : 'މަސް %d', - y : 'އަހަރެއް', - yy : 'އަހަރު %d' - }, - preparse: function (string) { - return string.replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/,/g, '،'); - }, - week : { - dow : 7, // Sunday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); - - return dv; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/el.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/el.js deleted file mode 100755 index f01fa772..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/el.js +++ /dev/null @@ -1,99 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - function isFunction(input) { - return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; - } - - - var el = moment.defineLocale('el', { - monthsNominativeEl : 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'), - monthsGenitiveEl : 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split('_'), - months : function (momentToFormat, format) { - if (!momentToFormat) { - return this._monthsNominativeEl; - } else if (typeof format === 'string' && /D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM' - return this._monthsGenitiveEl[momentToFormat.month()]; - } else { - return this._monthsNominativeEl[momentToFormat.month()]; - } - }, - monthsShort : 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'), - weekdays : 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split('_'), - weekdaysShort : 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'), - weekdaysMin : 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'), - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'μμ' : 'ΜΜ'; - } else { - return isLower ? 'πμ' : 'ΠΜ'; - } - }, - isPM : function (input) { - return ((input + '').toLowerCase()[0] === 'μ'); - }, - meridiemParse : /[ΠΜ]\.?Μ?\.?/i, - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' - }, - calendarEl : { - sameDay : '[Σήμερα {}] LT', - nextDay : '[Αύριο {}] LT', - nextWeek : 'dddd [{}] LT', - lastDay : '[Χθες {}] LT', - lastWeek : function () { - switch (this.day()) { - case 6: - return '[το προηγούμενο] dddd [{}] LT'; - default: - return '[την προηγούμενη] dddd [{}] LT'; - } - }, - sameElse : 'L' - }, - calendar : function (key, mom) { - var output = this._calendarEl[key], - hours = mom && mom.hours(); - if (isFunction(output)) { - output = output.apply(mom); - } - return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις')); - }, - relativeTime : { - future : 'σε %s', - past : '%s πριν', - s : 'λίγα δευτερόλεπτα', - ss : '%d δευτερόλεπτα', - m : 'ένα λεπτό', - mm : '%d λεπτά', - h : 'μία ώρα', - hh : '%d ώρες', - d : 'μία μέρα', - dd : '%d μέρες', - M : 'ένας μήνας', - MM : '%d μήνες', - y : 'ένας χρόνος', - yy : '%d χρόνια' - }, - dayOfMonthOrdinalParse: /\d{1,2}η/, - ordinal: '%dη', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4st is the first week of the year. - } - }); - - return el; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-au.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-au.js deleted file mode 100755 index 37202378..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-au.js +++ /dev/null @@ -1,66 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var enAu = moment.defineLocale('en-au', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return enAu; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-ca.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-ca.js deleted file mode 100755 index 5d0dab08..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-ca.js +++ /dev/null @@ -1,62 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var enCa = moment.defineLocale('en-ca', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'YYYY-MM-DD', - LL : 'MMMM D, YYYY', - LLL : 'MMMM D, YYYY h:mm A', - LLLL : 'dddd, MMMM D, YYYY h:mm A' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - } - }); - - return enCa; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-gb.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-gb.js deleted file mode 100755 index 85302e5d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-gb.js +++ /dev/null @@ -1,66 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var enGb = moment.defineLocale('en-gb', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return enGb; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-ie.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-ie.js deleted file mode 100755 index ede6c671..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-ie.js +++ /dev/null @@ -1,66 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var enIe = moment.defineLocale('en-ie', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD-MM-YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return enIe; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-il.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-il.js deleted file mode 100755 index b18eab86..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-il.js +++ /dev/null @@ -1,61 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var enIl = moment.defineLocale('en-il', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - } - }); - - return enIl; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-nz.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-nz.js deleted file mode 100755 index f4325d4c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/en-nz.js +++ /dev/null @@ -1,66 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var enNz = moment.defineLocale('en-nz', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return enNz; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/eo.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/eo.js deleted file mode 100755 index 40eaee2f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/eo.js +++ /dev/null @@ -1,70 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var eo = moment.defineLocale('eo', { - months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'), - monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec'.split('_'), - weekdays : 'dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato'.split('_'), - weekdaysShort : 'dim_lun_mard_merk_ĵaŭ_ven_sab'.split('_'), - weekdaysMin : 'di_lu_ma_me_ĵa_ve_sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'D[-a de] MMMM, YYYY', - LLL : 'D[-a de] MMMM, YYYY HH:mm', - LLLL : 'dddd, [la] D[-a de] MMMM, YYYY HH:mm' - }, - meridiemParse: /[ap]\.t\.m/i, - isPM: function (input) { - return input.charAt(0).toLowerCase() === 'p'; - }, - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'p.t.m.' : 'P.T.M.'; - } else { - return isLower ? 'a.t.m.' : 'A.T.M.'; - } - }, - calendar : { - sameDay : '[Hodiaŭ je] LT', - nextDay : '[Morgaŭ je] LT', - nextWeek : 'dddd [je] LT', - lastDay : '[Hieraŭ je] LT', - lastWeek : '[pasinta] dddd [je] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'post %s', - past : 'antaŭ %s', - s : 'sekundoj', - ss : '%d sekundoj', - m : 'minuto', - mm : '%d minutoj', - h : 'horo', - hh : '%d horoj', - d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo - dd : '%d tagoj', - M : 'monato', - MM : '%d monatoj', - y : 'jaro', - yy : '%d jaroj' - }, - dayOfMonthOrdinalParse: /\d{1,2}a/, - ordinal : '%da', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return eo; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es-do.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es-do.js deleted file mode 100755 index 829c2de8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es-do.js +++ /dev/null @@ -1,91 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), - monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); - - var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i]; - var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; - - var esDo = moment.defineLocale('es-do', { - months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), - monthsShort : function (m, format) { - if (!m) { - return monthsShortDot; - } else if (/-MMM-/.test(format)) { - return monthsShort[m.month()]; - } else { - return monthsShortDot[m.month()]; - } - }, - monthsRegex: monthsRegex, - monthsShortRegex: monthsRegex, - monthsStrictRegex: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, - monthsShortStrictRegex: /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, - monthsParse: monthsParse, - longMonthsParse: monthsParse, - shortMonthsParse: monthsParse, - weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), - weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), - weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY h:mm A', - LLLL : 'dddd, D [de] MMMM [de] YYYY h:mm A' - }, - calendar : { - sameDay : function () { - return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextDay : function () { - return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextWeek : function () { - return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastDay : function () { - return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastWeek : function () { - return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'en %s', - past : 'hace %s', - s : 'unos segundos', - ss : '%d segundos', - m : 'un minuto', - mm : '%d minutos', - h : 'una hora', - hh : '%d horas', - d : 'un día', - dd : '%d días', - M : 'un mes', - MM : '%d meses', - y : 'un año', - yy : '%d años' - }, - dayOfMonthOrdinalParse : /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return esDo; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es-us.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es-us.js deleted file mode 100755 index c12b5326..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es-us.js +++ /dev/null @@ -1,82 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), - monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); - - var esUs = moment.defineLocale('es-us', { - months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), - monthsShort : function (m, format) { - if (!m) { - return monthsShortDot; - } else if (/-MMM-/.test(format)) { - return monthsShort[m.month()]; - } else { - return monthsShortDot[m.month()]; - } - }, - monthsParseExact : true, - weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), - weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), - weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'MM/DD/YYYY', - LL : 'MMMM [de] D [de] YYYY', - LLL : 'MMMM [de] D [de] YYYY h:mm A', - LLLL : 'dddd, MMMM [de] D [de] YYYY h:mm A' - }, - calendar : { - sameDay : function () { - return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextDay : function () { - return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextWeek : function () { - return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastDay : function () { - return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastWeek : function () { - return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'en %s', - past : 'hace %s', - s : 'unos segundos', - ss : '%d segundos', - m : 'un minuto', - mm : '%d minutos', - h : 'una hora', - hh : '%d horas', - d : 'un día', - dd : '%d días', - M : 'un mes', - MM : '%d meses', - y : 'un año', - yy : '%d años' - }, - dayOfMonthOrdinalParse : /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); - - return esUs; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es.js deleted file mode 100755 index aed68026..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/es.js +++ /dev/null @@ -1,91 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), - monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); - - var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i]; - var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; - - var es = moment.defineLocale('es', { - months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), - monthsShort : function (m, format) { - if (!m) { - return monthsShortDot; - } else if (/-MMM-/.test(format)) { - return monthsShort[m.month()]; - } else { - return monthsShortDot[m.month()]; - } - }, - monthsRegex : monthsRegex, - monthsShortRegex : monthsRegex, - monthsStrictRegex : /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, - monthsShortStrictRegex : /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, - monthsParse : monthsParse, - longMonthsParse : monthsParse, - shortMonthsParse : monthsParse, - weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), - weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), - weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY H:mm', - LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm' - }, - calendar : { - sameDay : function () { - return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextDay : function () { - return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextWeek : function () { - return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastDay : function () { - return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastWeek : function () { - return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'en %s', - past : 'hace %s', - s : 'unos segundos', - ss : '%d segundos', - m : 'un minuto', - mm : '%d minutos', - h : 'una hora', - hh : '%d horas', - d : 'un día', - dd : '%d días', - M : 'un mes', - MM : '%d meses', - y : 'un año', - yy : '%d años' - }, - dayOfMonthOrdinalParse : /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return es; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/et.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/et.js deleted file mode 100755 index 8a81b040..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/et.js +++ /dev/null @@ -1,79 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], - 'ss': [number + 'sekundi', number + 'sekundit'], - 'm' : ['ühe minuti', 'üks minut'], - 'mm': [number + ' minuti', number + ' minutit'], - 'h' : ['ühe tunni', 'tund aega', 'üks tund'], - 'hh': [number + ' tunni', number + ' tundi'], - 'd' : ['ühe päeva', 'üks päev'], - 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], - 'MM': [number + ' kuu', number + ' kuud'], - 'y' : ['ühe aasta', 'aasta', 'üks aasta'], - 'yy': [number + ' aasta', number + ' aastat'] - }; - if (withoutSuffix) { - return format[key][2] ? format[key][2] : format[key][1]; - } - return isFuture ? format[key][0] : format[key][1]; - } - - var et = moment.defineLocale('et', { - months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), - monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), - weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), - weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), - weekdaysMin : 'P_E_T_K_N_R_L'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd, D. MMMM YYYY H:mm' - }, - calendar : { - sameDay : '[Täna,] LT', - nextDay : '[Homme,] LT', - nextWeek : '[Järgmine] dddd LT', - lastDay : '[Eile,] LT', - lastWeek : '[Eelmine] dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s pärast', - past : '%s tagasi', - s : processRelativeTime, - ss : processRelativeTime, - m : processRelativeTime, - mm : processRelativeTime, - h : processRelativeTime, - hh : processRelativeTime, - d : processRelativeTime, - dd : '%d päeva', - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return et; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/eu.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/eu.js deleted file mode 100755 index afe919fd..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/eu.js +++ /dev/null @@ -1,65 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var eu = moment.defineLocale('eu', { - months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), - monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), - monthsParseExact : true, - weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), - weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), - weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'YYYY[ko] MMMM[ren] D[a]', - LLL : 'YYYY[ko] MMMM[ren] D[a] HH:mm', - LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm', - l : 'YYYY-M-D', - ll : 'YYYY[ko] MMM D[a]', - lll : 'YYYY[ko] MMM D[a] HH:mm', - llll : 'ddd, YYYY[ko] MMM D[a] HH:mm' - }, - calendar : { - sameDay : '[gaur] LT[etan]', - nextDay : '[bihar] LT[etan]', - nextWeek : 'dddd LT[etan]', - lastDay : '[atzo] LT[etan]', - lastWeek : '[aurreko] dddd LT[etan]', - sameElse : 'L' - }, - relativeTime : { - future : '%s barru', - past : 'duela %s', - s : 'segundo batzuk', - ss : '%d segundo', - m : 'minutu bat', - mm : '%d minutu', - h : 'ordu bat', - hh : '%d ordu', - d : 'egun bat', - dd : '%d egun', - M : 'hilabete bat', - MM : '%d hilabete', - y : 'urte bat', - yy : '%d urte' - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return eu; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fa.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fa.js deleted file mode 100755 index c042e315..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fa.js +++ /dev/null @@ -1,105 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var symbolMap = { - '1': '۱', - '2': '۲', - '3': '۳', - '4': '۴', - '5': '۵', - '6': '۶', - '7': '۷', - '8': '۸', - '9': '۹', - '0': '۰' - }, numberMap = { - '۱': '1', - '۲': '2', - '۳': '3', - '۴': '4', - '۵': '5', - '۶': '6', - '۷': '7', - '۸': '8', - '۹': '9', - '۰': '0' - }; - - var fa = moment.defineLocale('fa', { - months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), - monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), - weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), - weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), - weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - meridiemParse: /قبل از ظهر|بعد از ظهر/, - isPM: function (input) { - return /بعد از ظهر/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'قبل از ظهر'; - } else { - return 'بعد از ظهر'; - } - }, - calendar : { - sameDay : '[امروز ساعت] LT', - nextDay : '[فردا ساعت] LT', - nextWeek : 'dddd [ساعت] LT', - lastDay : '[دیروز ساعت] LT', - lastWeek : 'dddd [پیش] [ساعت] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'در %s', - past : '%s پیش', - s : 'چند ثانیه', - ss : 'ثانیه d%', - m : 'یک دقیقه', - mm : '%d دقیقه', - h : 'یک ساعت', - hh : '%d ساعت', - d : 'یک روز', - dd : '%d روز', - M : 'یک ماه', - MM : '%d ماه', - y : 'یک سال', - yy : '%d سال' - }, - preparse: function (string) { - return string.replace(/[۰-۹]/g, function (match) { - return numberMap[match]; - }).replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, '،'); - }, - dayOfMonthOrdinalParse: /\d{1,2}م/, - ordinal : '%dم', - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); - - return fa; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fi.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fi.js deleted file mode 100755 index b0115993..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fi.js +++ /dev/null @@ -1,108 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), - numbersFuture = [ - 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', - numbersPast[7], numbersPast[8], numbersPast[9] - ]; - function translate(number, withoutSuffix, key, isFuture) { - var result = ''; - switch (key) { - case 's': - return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; - case 'ss': - return isFuture ? 'sekunnin' : 'sekuntia'; - case 'm': - return isFuture ? 'minuutin' : 'minuutti'; - case 'mm': - result = isFuture ? 'minuutin' : 'minuuttia'; - break; - case 'h': - return isFuture ? 'tunnin' : 'tunti'; - case 'hh': - result = isFuture ? 'tunnin' : 'tuntia'; - break; - case 'd': - return isFuture ? 'päivän' : 'päivä'; - case 'dd': - result = isFuture ? 'päivän' : 'päivää'; - break; - case 'M': - return isFuture ? 'kuukauden' : 'kuukausi'; - case 'MM': - result = isFuture ? 'kuukauden' : 'kuukautta'; - break; - case 'y': - return isFuture ? 'vuoden' : 'vuosi'; - case 'yy': - result = isFuture ? 'vuoden' : 'vuotta'; - break; - } - result = verbalNumber(number, isFuture) + ' ' + result; - return result; - } - function verbalNumber(number, isFuture) { - return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; - } - - var fi = moment.defineLocale('fi', { - months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), - monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), - weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), - weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), - weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD.MM.YYYY', - LL : 'Do MMMM[ta] YYYY', - LLL : 'Do MMMM[ta] YYYY, [klo] HH.mm', - LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm', - l : 'D.M.YYYY', - ll : 'Do MMM YYYY', - lll : 'Do MMM YYYY, [klo] HH.mm', - llll : 'ddd, Do MMM YYYY, [klo] HH.mm' - }, - calendar : { - sameDay : '[tänään] [klo] LT', - nextDay : '[huomenna] [klo] LT', - nextWeek : 'dddd [klo] LT', - lastDay : '[eilen] [klo] LT', - lastWeek : '[viime] dddd[na] [klo] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s päästä', - past : '%s sitten', - s : translate, - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return fi; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fo.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fo.js deleted file mode 100755 index eac46d2b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fo.js +++ /dev/null @@ -1,59 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var fo = moment.defineLocale('fo', { - months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), - weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), - weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), - weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D. MMMM, YYYY HH:mm' - }, - calendar : { - sameDay : '[Í dag kl.] LT', - nextDay : '[Í morgin kl.] LT', - nextWeek : 'dddd [kl.] LT', - lastDay : '[Í gjár kl.] LT', - lastWeek : '[síðstu] dddd [kl] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'um %s', - past : '%s síðani', - s : 'fá sekund', - ss : '%d sekundir', - m : 'ein minutt', - mm : '%d minuttir', - h : 'ein tími', - hh : '%d tímar', - d : 'ein dagur', - dd : '%d dagar', - M : 'ein mánaði', - MM : '%d mánaðir', - y : 'eitt ár', - yy : '%d ár' - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return fo; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr-ca.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr-ca.js deleted file mode 100755 index ad1f77d5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr-ca.js +++ /dev/null @@ -1,73 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var frCa = moment.defineLocale('fr-ca', { - months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), - monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), - monthsParseExact : true, - weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), - weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), - weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Aujourd’hui à] LT', - nextDay : '[Demain à] LT', - nextWeek : 'dddd [à] LT', - lastDay : '[Hier à] LT', - lastWeek : 'dddd [dernier à] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'dans %s', - past : 'il y a %s', - s : 'quelques secondes', - ss : '%d secondes', - m : 'une minute', - mm : '%d minutes', - h : 'une heure', - hh : '%d heures', - d : 'un jour', - dd : '%d jours', - M : 'un mois', - MM : '%d mois', - y : 'un an', - yy : '%d ans' - }, - dayOfMonthOrdinalParse: /\d{1,2}(er|e)/, - ordinal : function (number, period) { - switch (period) { - // Words with masculine grammatical gender: mois, trimestre, jour - default: - case 'M': - case 'Q': - case 'D': - case 'DDD': - case 'd': - return number + (number === 1 ? 'er' : 'e'); - - // Words with feminine grammatical gender: semaine - case 'w': - case 'W': - return number + (number === 1 ? 're' : 'e'); - } - } - }); - - return frCa; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr-ch.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr-ch.js deleted file mode 100755 index 54033d14..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr-ch.js +++ /dev/null @@ -1,77 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var frCh = moment.defineLocale('fr-ch', { - months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), - monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), - monthsParseExact : true, - weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), - weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), - weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Aujourd’hui à] LT', - nextDay : '[Demain à] LT', - nextWeek : 'dddd [à] LT', - lastDay : '[Hier à] LT', - lastWeek : 'dddd [dernier à] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'dans %s', - past : 'il y a %s', - s : 'quelques secondes', - ss : '%d secondes', - m : 'une minute', - mm : '%d minutes', - h : 'une heure', - hh : '%d heures', - d : 'un jour', - dd : '%d jours', - M : 'un mois', - MM : '%d mois', - y : 'un an', - yy : '%d ans' - }, - dayOfMonthOrdinalParse: /\d{1,2}(er|e)/, - ordinal : function (number, period) { - switch (period) { - // Words with masculine grammatical gender: mois, trimestre, jour - default: - case 'M': - case 'Q': - case 'D': - case 'DDD': - case 'd': - return number + (number === 1 ? 'er' : 'e'); - - // Words with feminine grammatical gender: semaine - case 'w': - case 'W': - return number + (number === 1 ? 're' : 'e'); - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return frCh; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr.js deleted file mode 100755 index 92867073..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fr.js +++ /dev/null @@ -1,82 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var fr = moment.defineLocale('fr', { - months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), - monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), - monthsParseExact : true, - weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), - weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), - weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Aujourd’hui à] LT', - nextDay : '[Demain à] LT', - nextWeek : 'dddd [à] LT', - lastDay : '[Hier à] LT', - lastWeek : 'dddd [dernier à] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'dans %s', - past : 'il y a %s', - s : 'quelques secondes', - ss : '%d secondes', - m : 'une minute', - mm : '%d minutes', - h : 'une heure', - hh : '%d heures', - d : 'un jour', - dd : '%d jours', - M : 'un mois', - MM : '%d mois', - y : 'un an', - yy : '%d ans' - }, - dayOfMonthOrdinalParse: /\d{1,2}(er|)/, - ordinal : function (number, period) { - switch (period) { - // TODO: Return 'e' when day of month > 1. Move this case inside - // block for masculine words below. - // See https://github.com/moment/moment/issues/3375 - case 'D': - return number + (number === 1 ? 'er' : ''); - - // Words with masculine grammatical gender: mois, trimestre, jour - default: - case 'M': - case 'Q': - case 'DDD': - case 'd': - return number + (number === 1 ? 'er' : 'e'); - - // Words with feminine grammatical gender: semaine - case 'w': - case 'W': - return number + (number === 1 ? 're' : 'e'); - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return fr; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fy.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fy.js deleted file mode 100755 index 9a672bf4..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/fy.js +++ /dev/null @@ -1,74 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'), - monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); - - var fy = moment.defineLocale('fy', { - months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), - monthsShort : function (m, format) { - if (!m) { - return monthsShortWithDots; - } else if (/-MMM-/.test(format)) { - return monthsShortWithoutDots[m.month()]; - } else { - return monthsShortWithDots[m.month()]; - } - }, - monthsParseExact : true, - weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), - weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), - weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD-MM-YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[hjoed om] LT', - nextDay: '[moarn om] LT', - nextWeek: 'dddd [om] LT', - lastDay: '[juster om] LT', - lastWeek: '[ôfrûne] dddd [om] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'oer %s', - past : '%s lyn', - s : 'in pear sekonden', - ss : '%d sekonden', - m : 'ien minút', - mm : '%d minuten', - h : 'ien oere', - hh : '%d oeren', - d : 'ien dei', - dd : '%d dagen', - M : 'ien moanne', - MM : '%d moannen', - y : 'ien jier', - yy : '%d jierren' - }, - dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return fy; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gd.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gd.js deleted file mode 100755 index 4d0d88a7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gd.js +++ /dev/null @@ -1,75 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var months = [ - 'Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd' - ]; - - var monthsShort = ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh']; - - var weekdays = ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne']; - - var weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis']; - - var weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa']; - - var gd = moment.defineLocale('gd', { - months : months, - monthsShort : monthsShort, - monthsParseExact : true, - weekdays : weekdays, - weekdaysShort : weekdaysShort, - weekdaysMin : weekdaysMin, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[An-diugh aig] LT', - nextDay : '[A-màireach aig] LT', - nextWeek : 'dddd [aig] LT', - lastDay : '[An-dè aig] LT', - lastWeek : 'dddd [seo chaidh] [aig] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'ann an %s', - past : 'bho chionn %s', - s : 'beagan diogan', - ss : '%d diogan', - m : 'mionaid', - mm : '%d mionaidean', - h : 'uair', - hh : '%d uairean', - d : 'latha', - dd : '%d latha', - M : 'mìos', - MM : '%d mìosan', - y : 'bliadhna', - yy : '%d bliadhna' - }, - dayOfMonthOrdinalParse : /\d{1,2}(d|na|mh)/, - ordinal : function (number) { - var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return gd; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gl.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gl.js deleted file mode 100755 index 1cc4177c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gl.js +++ /dev/null @@ -1,76 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var gl = moment.defineLocale('gl', { - months : 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split('_'), - monthsShort : 'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split('_'), - monthsParseExact: true, - weekdays : 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'), - weekdaysShort : 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'), - weekdaysMin : 'do_lu_ma_mé_xo_ve_sá'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY H:mm', - LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm' - }, - calendar : { - sameDay : function () { - return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; - }, - nextDay : function () { - return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; - }, - nextWeek : function () { - return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; - }, - lastDay : function () { - return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; - }, - lastWeek : function () { - return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; - }, - sameElse : 'L' - }, - relativeTime : { - future : function (str) { - if (str.indexOf('un') === 0) { - return 'n' + str; - } - return 'en ' + str; - }, - past : 'hai %s', - s : 'uns segundos', - ss : '%d segundos', - m : 'un minuto', - mm : '%d minutos', - h : 'unha hora', - hh : '%d horas', - d : 'un día', - dd : '%d días', - M : 'un mes', - MM : '%d meses', - y : 'un ano', - yy : '%d anos' - }, - dayOfMonthOrdinalParse : /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return gl; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gom-latn.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gom-latn.js deleted file mode 100755 index f26f8f9c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gom-latn.js +++ /dev/null @@ -1,122 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 's': ['thodde secondanim', 'thodde second'], - 'ss': [number + ' secondanim', number + ' second'], - 'm': ['eka mintan', 'ek minute'], - 'mm': [number + ' mintanim', number + ' mintam'], - 'h': ['eka horan', 'ek hor'], - 'hh': [number + ' horanim', number + ' horam'], - 'd': ['eka disan', 'ek dis'], - 'dd': [number + ' disanim', number + ' dis'], - 'M': ['eka mhoinean', 'ek mhoino'], - 'MM': [number + ' mhoineanim', number + ' mhoine'], - 'y': ['eka vorsan', 'ek voros'], - 'yy': [number + ' vorsanim', number + ' vorsam'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - - var gomLatn = moment.defineLocale('gom-latn', { - months : 'Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr'.split('_'), - monthsShort : 'Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.'.split('_'), - monthsParseExact : true, - weekdays : 'Aitar_Somar_Mongllar_Budvar_Brestar_Sukrar_Son\'var'.split('_'), - weekdaysShort : 'Ait._Som._Mon._Bud._Bre._Suk._Son.'.split('_'), - weekdaysMin : 'Ai_Sm_Mo_Bu_Br_Su_Sn'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'A h:mm [vazta]', - LTS : 'A h:mm:ss [vazta]', - L : 'DD-MM-YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY A h:mm [vazta]', - LLLL : 'dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]', - llll: 'ddd, D MMM YYYY, A h:mm [vazta]' - }, - calendar : { - sameDay: '[Aiz] LT', - nextDay: '[Faleam] LT', - nextWeek: '[Ieta to] dddd[,] LT', - lastDay: '[Kal] LT', - lastWeek: '[Fatlo] dddd[,] LT', - sameElse: 'L' - }, - relativeTime : { - future : '%s', - past : '%s adim', - s : processRelativeTime, - ss : processRelativeTime, - m : processRelativeTime, - mm : processRelativeTime, - h : processRelativeTime, - hh : processRelativeTime, - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime - }, - dayOfMonthOrdinalParse : /\d{1,2}(er)/, - ordinal : function (number, period) { - switch (period) { - // the ordinal 'er' only applies to day of the month - case 'D': - return number + 'er'; - default: - case 'M': - case 'Q': - case 'DDD': - case 'd': - case 'w': - case 'W': - return number; - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - }, - meridiemParse: /rati|sokalli|donparam|sanje/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'rati') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'sokalli') { - return hour; - } else if (meridiem === 'donparam') { - return hour > 12 ? hour : hour + 12; - } else if (meridiem === 'sanje') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'rati'; - } else if (hour < 12) { - return 'sokalli'; - } else if (hour < 16) { - return 'donparam'; - } else if (hour < 20) { - return 'sanje'; - } else { - return 'rati'; - } - } - }); - - return gomLatn; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gu.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gu.js deleted file mode 100755 index c025aacd..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/gu.js +++ /dev/null @@ -1,123 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var symbolMap = { - '1': '૧', - '2': '૨', - '3': '૩', - '4': '૪', - '5': '૫', - '6': '૬', - '7': '૭', - '8': '૮', - '9': '૯', - '0': '૦' - }, - numberMap = { - '૧': '1', - '૨': '2', - '૩': '3', - '૪': '4', - '૫': '5', - '૬': '6', - '૭': '7', - '૮': '8', - '૯': '9', - '૦': '0' - }; - - var gu = moment.defineLocale('gu', { - months: 'જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર'.split('_'), - monthsShort: 'જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.'.split('_'), - monthsParseExact: true, - weekdays: 'રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર'.split('_'), - weekdaysShort: 'રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ'.split('_'), - weekdaysMin: 'ર_સો_મં_બુ_ગુ_શુ_શ'.split('_'), - longDateFormat: { - LT: 'A h:mm વાગ્યે', - LTS: 'A h:mm:ss વાગ્યે', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY, A h:mm વાગ્યે', - LLLL: 'dddd, D MMMM YYYY, A h:mm વાગ્યે' - }, - calendar: { - sameDay: '[આજ] LT', - nextDay: '[કાલે] LT', - nextWeek: 'dddd, LT', - lastDay: '[ગઇકાલે] LT', - lastWeek: '[પાછલા] dddd, LT', - sameElse: 'L' - }, - relativeTime: { - future: '%s મા', - past: '%s પેહલા', - s: 'અમુક પળો', - ss: '%d સેકંડ', - m: 'એક મિનિટ', - mm: '%d મિનિટ', - h: 'એક કલાક', - hh: '%d કલાક', - d: 'એક દિવસ', - dd: '%d દિવસ', - M: 'એક મહિનો', - MM: '%d મહિનો', - y: 'એક વર્ષ', - yy: '%d વર્ષ' - }, - preparse: function (string) { - return string.replace(/[૧૨૩૪૫૬૭૮૯૦]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - // Gujarati notation for meridiems are quite fuzzy in practice. While there exists - // a rigid notion of a 'Pahar' it is not used as rigidly in modern Gujarati. - meridiemParse: /રાત|બપોર|સવાર|સાંજ/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'રાત') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'સવાર') { - return hour; - } else if (meridiem === 'બપોર') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'સાંજ') { - return hour + 12; - } - }, - meridiem: function (hour, minute, isLower) { - if (hour < 4) { - return 'રાત'; - } else if (hour < 10) { - return 'સવાર'; - } else if (hour < 17) { - return 'બપોર'; - } else if (hour < 20) { - return 'સાંજ'; - } else { - return 'રાત'; - } - }, - week: { - dow: 0, // Sunday is the first day of the week. - doy: 6 // The week that contains Jan 1st is the first week of the year. - } - }); - - return gu; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/he.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/he.js deleted file mode 100755 index 7a22e8d7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/he.js +++ /dev/null @@ -1,96 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var he = moment.defineLocale('he', { - months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'), - monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'), - weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), - weekdaysShort : 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'), - weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D [ב]MMMM YYYY', - LLL : 'D [ב]MMMM YYYY HH:mm', - LLLL : 'dddd, D [ב]MMMM YYYY HH:mm', - l : 'D/M/YYYY', - ll : 'D MMM YYYY', - lll : 'D MMM YYYY HH:mm', - llll : 'ddd, D MMM YYYY HH:mm' - }, - calendar : { - sameDay : '[היום ב־]LT', - nextDay : '[מחר ב־]LT', - nextWeek : 'dddd [בשעה] LT', - lastDay : '[אתמול ב־]LT', - lastWeek : '[ביום] dddd [האחרון בשעה] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'בעוד %s', - past : 'לפני %s', - s : 'מספר שניות', - ss : '%d שניות', - m : 'דקה', - mm : '%d דקות', - h : 'שעה', - hh : function (number) { - if (number === 2) { - return 'שעתיים'; - } - return number + ' שעות'; - }, - d : 'יום', - dd : function (number) { - if (number === 2) { - return 'יומיים'; - } - return number + ' ימים'; - }, - M : 'חודש', - MM : function (number) { - if (number === 2) { - return 'חודשיים'; - } - return number + ' חודשים'; - }, - y : 'שנה', - yy : function (number) { - if (number === 2) { - return 'שנתיים'; - } else if (number % 10 === 0 && number !== 10) { - return number + ' שנה'; - } - return number + ' שנים'; - } - }, - meridiemParse: /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i, - isPM : function (input) { - return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 5) { - return 'לפנות בוקר'; - } else if (hour < 10) { - return 'בבוקר'; - } else if (hour < 12) { - return isLower ? 'לפנה"צ' : 'לפני הצהריים'; - } else if (hour < 18) { - return isLower ? 'אחה"צ' : 'אחרי הצהריים'; - } else { - return 'בערב'; - } - } - }); - - return he; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hi.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hi.js deleted file mode 100755 index 5145c31e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hi.js +++ /dev/null @@ -1,123 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var symbolMap = { - '1': '१', - '2': '२', - '3': '३', - '4': '४', - '5': '५', - '6': '६', - '7': '७', - '8': '८', - '9': '९', - '0': '०' - }, - numberMap = { - '१': '1', - '२': '2', - '३': '3', - '४': '4', - '५': '5', - '६': '6', - '७': '7', - '८': '8', - '९': '9', - '०': '0' - }; - - var hi = moment.defineLocale('hi', { - months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'), - monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'), - monthsParseExact: true, - weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'), - weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'), - weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'), - longDateFormat : { - LT : 'A h:mm बजे', - LTS : 'A h:mm:ss बजे', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm बजे', - LLLL : 'dddd, D MMMM YYYY, A h:mm बजे' - }, - calendar : { - sameDay : '[आज] LT', - nextDay : '[कल] LT', - nextWeek : 'dddd, LT', - lastDay : '[कल] LT', - lastWeek : '[पिछले] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s में', - past : '%s पहले', - s : 'कुछ ही क्षण', - ss : '%d सेकंड', - m : 'एक मिनट', - mm : '%d मिनट', - h : 'एक घंटा', - hh : '%d घंटे', - d : 'एक दिन', - dd : '%d दिन', - M : 'एक महीने', - MM : '%d महीने', - y : 'एक वर्ष', - yy : '%d वर्ष' - }, - preparse: function (string) { - return string.replace(/[१२३४५६७८९०]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - // Hindi notation for meridiems are quite fuzzy in practice. While there exists - // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. - meridiemParse: /रात|सुबह|दोपहर|शाम/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'रात') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'सुबह') { - return hour; - } else if (meridiem === 'दोपहर') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'शाम') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'रात'; - } else if (hour < 10) { - return 'सुबह'; - } else if (hour < 17) { - return 'दोपहर'; - } else if (hour < 20) { - return 'शाम'; - } else { - return 'रात'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); - - return hi; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hr.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hr.js deleted file mode 100755 index 07ce5279..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hr.js +++ /dev/null @@ -1,153 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'ss': - if (number === 1) { - result += 'sekunda'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'sekunde'; - } else { - result += 'sekundi'; - } - return result; - case 'm': - return withoutSuffix ? 'jedna minuta' : 'jedne minute'; - case 'mm': - if (number === 1) { - result += 'minuta'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'minute'; - } else { - result += 'minuta'; - } - return result; - case 'h': - return withoutSuffix ? 'jedan sat' : 'jednog sata'; - case 'hh': - if (number === 1) { - result += 'sat'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'sata'; - } else { - result += 'sati'; - } - return result; - case 'dd': - if (number === 1) { - result += 'dan'; - } else { - result += 'dana'; - } - return result; - case 'MM': - if (number === 1) { - result += 'mjesec'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'mjeseca'; - } else { - result += 'mjeseci'; - } - return result; - case 'yy': - if (number === 1) { - result += 'godina'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'godine'; - } else { - result += 'godina'; - } - return result; - } - } - - var hr = moment.defineLocale('hr', { - months : { - format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split('_'), - standalone: 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_') - }, - monthsShort : 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'), - monthsParseExact: true, - weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), - weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), - weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd, D. MMMM YYYY H:mm' - }, - calendar : { - sameDay : '[danas u] LT', - nextDay : '[sutra u] LT', - nextWeek : function () { - switch (this.day()) { - case 0: - return '[u] [nedjelju] [u] LT'; - case 3: - return '[u] [srijedu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[jučer u] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - return '[prošlu] dddd [u] LT'; - case 6: - return '[prošle] [subote] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[prošli] dddd [u] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'za %s', - past : 'prije %s', - s : 'par sekundi', - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : 'dan', - dd : translate, - M : 'mjesec', - MM : translate, - y : 'godinu', - yy : translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return hr; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hu.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hu.js deleted file mode 100755 index 53e9bb6e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hu.js +++ /dev/null @@ -1,109 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' '); - function translate(number, withoutSuffix, key, isFuture) { - var num = number; - switch (key) { - case 's': - return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; - case 'ss': - return num + (isFuture || withoutSuffix) ? ' másodperc' : ' másodperce'; - case 'm': - return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); - case 'mm': - return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); - case 'h': - return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); - case 'hh': - return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); - case 'd': - return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); - case 'dd': - return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); - case 'M': - return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); - case 'MM': - return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); - case 'y': - return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); - case 'yy': - return num + (isFuture || withoutSuffix ? ' év' : ' éve'); - } - return ''; - } - function week(isFuture) { - return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; - } - - var hu = moment.defineLocale('hu', { - months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), - monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), - weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'), - weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), - weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'YYYY.MM.DD.', - LL : 'YYYY. MMMM D.', - LLL : 'YYYY. MMMM D. H:mm', - LLLL : 'YYYY. MMMM D., dddd H:mm' - }, - meridiemParse: /de|du/i, - isPM: function (input) { - return input.charAt(1).toLowerCase() === 'u'; - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 12) { - return isLower === true ? 'de' : 'DE'; - } else { - return isLower === true ? 'du' : 'DU'; - } - }, - calendar : { - sameDay : '[ma] LT[-kor]', - nextDay : '[holnap] LT[-kor]', - nextWeek : function () { - return week.call(this, true); - }, - lastDay : '[tegnap] LT[-kor]', - lastWeek : function () { - return week.call(this, false); - }, - sameElse : 'L' - }, - relativeTime : { - future : '%s múlva', - past : '%s', - s : translate, - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return hu; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hy-am.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hy-am.js deleted file mode 100755 index d709d3bd..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/hy-am.js +++ /dev/null @@ -1,94 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var hyAm = moment.defineLocale('hy-am', { - months : { - format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_'), - standalone: 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_') - }, - monthsShort : 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'), - weekdays : 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_'), - weekdaysShort : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'), - weekdaysMin : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY թ.', - LLL : 'D MMMM YYYY թ., HH:mm', - LLLL : 'dddd, D MMMM YYYY թ., HH:mm' - }, - calendar : { - sameDay: '[այսօր] LT', - nextDay: '[վաղը] LT', - lastDay: '[երեկ] LT', - nextWeek: function () { - return 'dddd [օրը ժամը] LT'; - }, - lastWeek: function () { - return '[անցած] dddd [օրը ժամը] LT'; - }, - sameElse: 'L' - }, - relativeTime : { - future : '%s հետո', - past : '%s առաջ', - s : 'մի քանի վայրկյան', - ss : '%d վայրկյան', - m : 'րոպե', - mm : '%d րոպե', - h : 'ժամ', - hh : '%d ժամ', - d : 'օր', - dd : '%d օր', - M : 'ամիս', - MM : '%d ամիս', - y : 'տարի', - yy : '%d տարի' - }, - meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/, - isPM: function (input) { - return /^(ցերեկվա|երեկոյան)$/.test(input); - }, - meridiem : function (hour) { - if (hour < 4) { - return 'գիշերվա'; - } else if (hour < 12) { - return 'առավոտվա'; - } else if (hour < 17) { - return 'ցերեկվա'; - } else { - return 'երեկոյան'; - } - }, - dayOfMonthOrdinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/, - ordinal: function (number, period) { - switch (period) { - case 'DDD': - case 'w': - case 'W': - case 'DDDo': - if (number === 1) { - return number + '-ին'; - } - return number + '-րդ'; - default: - return number; - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return hyAm; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/id.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/id.js deleted file mode 100755 index 63eb080d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/id.js +++ /dev/null @@ -1,81 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var id = moment.defineLocale('id', { - months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des'.split('_'), - weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), - weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), - weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] HH.mm', - LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' - }, - meridiemParse: /pagi|siang|sore|malam/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'pagi') { - return hour; - } else if (meridiem === 'siang') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'sore' || meridiem === 'malam') { - return hour + 12; - } - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'pagi'; - } else if (hours < 15) { - return 'siang'; - } else if (hours < 19) { - return 'sore'; - } else { - return 'malam'; - } - }, - calendar : { - sameDay : '[Hari ini pukul] LT', - nextDay : '[Besok pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kemarin pukul] LT', - lastWeek : 'dddd [lalu pukul] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'dalam %s', - past : '%s yang lalu', - s : 'beberapa detik', - ss : '%d detik', - m : 'semenit', - mm : '%d menit', - h : 'sejam', - hh : '%d jam', - d : 'sehari', - dd : '%d hari', - M : 'sebulan', - MM : '%d bulan', - y : 'setahun', - yy : '%d tahun' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return id; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/is.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/is.js deleted file mode 100755 index 9856e927..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/is.js +++ /dev/null @@ -1,131 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - function plural(n) { - if (n % 100 === 11) { - return true; - } else if (n % 10 === 1) { - return false; - } - return true; - } - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': - return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; - case 'ss': - if (plural(number)) { - return result + (withoutSuffix || isFuture ? 'sekúndur' : 'sekúndum'); - } - return result + 'sekúnda'; - case 'm': - return withoutSuffix ? 'mínúta' : 'mínútu'; - case 'mm': - if (plural(number)) { - return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); - } else if (withoutSuffix) { - return result + 'mínúta'; - } - return result + 'mínútu'; - case 'hh': - if (plural(number)) { - return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); - } - return result + 'klukkustund'; - case 'd': - if (withoutSuffix) { - return 'dagur'; - } - return isFuture ? 'dag' : 'degi'; - case 'dd': - if (plural(number)) { - if (withoutSuffix) { - return result + 'dagar'; - } - return result + (isFuture ? 'daga' : 'dögum'); - } else if (withoutSuffix) { - return result + 'dagur'; - } - return result + (isFuture ? 'dag' : 'degi'); - case 'M': - if (withoutSuffix) { - return 'mánuður'; - } - return isFuture ? 'mánuð' : 'mánuði'; - case 'MM': - if (plural(number)) { - if (withoutSuffix) { - return result + 'mánuðir'; - } - return result + (isFuture ? 'mánuði' : 'mánuðum'); - } else if (withoutSuffix) { - return result + 'mánuður'; - } - return result + (isFuture ? 'mánuð' : 'mánuði'); - case 'y': - return withoutSuffix || isFuture ? 'ár' : 'ári'; - case 'yy': - if (plural(number)) { - return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); - } - return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); - } - } - - var is = moment.defineLocale('is', { - months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), - weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), - weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), - weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY [kl.] H:mm', - LLLL : 'dddd, D. MMMM YYYY [kl.] H:mm' - }, - calendar : { - sameDay : '[í dag kl.] LT', - nextDay : '[á morgun kl.] LT', - nextWeek : 'dddd [kl.] LT', - lastDay : '[í gær kl.] LT', - lastWeek : '[síðasta] dddd [kl.] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'eftir %s', - past : 'fyrir %s síðan', - s : translate, - ss : translate, - m : translate, - mm : translate, - h : 'klukkustund', - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return is; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/it.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/it.js deleted file mode 100755 index f42ff8fa..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/it.js +++ /dev/null @@ -1,68 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var it = moment.defineLocale('it', { - months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), - monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), - weekdays : 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split('_'), - weekdaysShort : 'dom_lun_mar_mer_gio_ven_sab'.split('_'), - weekdaysMin : 'do_lu_ma_me_gi_ve_sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[Oggi alle] LT', - nextDay: '[Domani alle] LT', - nextWeek: 'dddd [alle] LT', - lastDay: '[Ieri alle] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[la scorsa] dddd [alle] LT'; - default: - return '[lo scorso] dddd [alle] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : function (s) { - return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; - }, - past : '%s fa', - s : 'alcuni secondi', - ss : '%d secondi', - m : 'un minuto', - mm : '%d minuti', - h : 'un\'ora', - hh : '%d ore', - d : 'un giorno', - dd : '%d giorni', - M : 'un mese', - MM : '%d mesi', - y : 'un anno', - yy : '%d anni' - }, - dayOfMonthOrdinalParse : /\d{1,2}º/, - ordinal: '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return it; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ja.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ja.js deleted file mode 100755 index 5ec1be53..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ja.js +++ /dev/null @@ -1,91 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var ja = moment.defineLocale('ja', { - months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'), - weekdaysShort : '日_月_火_水_木_金_土'.split('_'), - weekdaysMin : '日_月_火_水_木_金_土'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY/MM/DD', - LL : 'YYYY年M月D日', - LLL : 'YYYY年M月D日 HH:mm', - LLLL : 'YYYY年M月D日 dddd HH:mm', - l : 'YYYY/MM/DD', - ll : 'YYYY年M月D日', - lll : 'YYYY年M月D日 HH:mm', - llll : 'YYYY年M月D日(ddd) HH:mm' - }, - meridiemParse: /午前|午後/i, - isPM : function (input) { - return input === '午後'; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return '午前'; - } else { - return '午後'; - } - }, - calendar : { - sameDay : '[今日] LT', - nextDay : '[明日] LT', - nextWeek : function (now) { - if (now.week() < this.week()) { - return '[来週]dddd LT'; - } else { - return 'dddd LT'; - } - }, - lastDay : '[昨日] LT', - lastWeek : function (now) { - if (this.week() < now.week()) { - return '[先週]dddd LT'; - } else { - return 'dddd LT'; - } - }, - sameElse : 'L' - }, - dayOfMonthOrdinalParse : /\d{1,2}日/, - ordinal : function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'DDD': - return number + '日'; - default: - return number; - } - }, - relativeTime : { - future : '%s後', - past : '%s前', - s : '数秒', - ss : '%d秒', - m : '1分', - mm : '%d分', - h : '1時間', - hh : '%d時間', - d : '1日', - dd : '%d日', - M : '1ヶ月', - MM : '%dヶ月', - y : '1年', - yy : '%d年' - } - }); - - return ja; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/jv.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/jv.js deleted file mode 100755 index f4544a25..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/jv.js +++ /dev/null @@ -1,81 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var jv = moment.defineLocale('jv', { - months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'), - weekdays : 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'), - weekdaysShort : 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'), - weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] HH.mm', - LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' - }, - meridiemParse: /enjing|siyang|sonten|ndalu/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'enjing') { - return hour; - } else if (meridiem === 'siyang') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'sonten' || meridiem === 'ndalu') { - return hour + 12; - } - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'enjing'; - } else if (hours < 15) { - return 'siyang'; - } else if (hours < 19) { - return 'sonten'; - } else { - return 'ndalu'; - } - }, - calendar : { - sameDay : '[Dinten puniko pukul] LT', - nextDay : '[Mbenjang pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kala wingi pukul] LT', - lastWeek : 'dddd [kepengker pukul] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'wonten ing %s', - past : '%s ingkang kepengker', - s : 'sawetawis detik', - ss : '%d detik', - m : 'setunggal menit', - mm : '%d menit', - h : 'setunggal jam', - hh : '%d jam', - d : 'sedinten', - dd : '%d dinten', - M : 'sewulan', - MM : '%d wulan', - y : 'setaun', - yy : '%d taun' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return jv; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ka.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ka.js deleted file mode 100755 index 0ec5eb24..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ka.js +++ /dev/null @@ -1,88 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var ka = moment.defineLocale('ka', { - months : { - standalone: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'), - format: 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_') - }, - monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'), - weekdays : { - standalone: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'), - format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_'), - isFormat: /(წინა|შემდეგ)/ - }, - weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'), - weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' - }, - calendar : { - sameDay : '[დღეს] LT[-ზე]', - nextDay : '[ხვალ] LT[-ზე]', - lastDay : '[გუშინ] LT[-ზე]', - nextWeek : '[შემდეგ] dddd LT[-ზე]', - lastWeek : '[წინა] dddd LT-ზე', - sameElse : 'L' - }, - relativeTime : { - future : function (s) { - return (/(წამი|წუთი|საათი|წელი)/).test(s) ? - s.replace(/ი$/, 'ში') : - s + 'ში'; - }, - past : function (s) { - if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) { - return s.replace(/(ი|ე)$/, 'ის წინ'); - } - if ((/წელი/).test(s)) { - return s.replace(/წელი$/, 'წლის წინ'); - } - }, - s : 'რამდენიმე წამი', - ss : '%d წამი', - m : 'წუთი', - mm : '%d წუთი', - h : 'საათი', - hh : '%d საათი', - d : 'დღე', - dd : '%d დღე', - M : 'თვე', - MM : '%d თვე', - y : 'წელი', - yy : '%d წელი' - }, - dayOfMonthOrdinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, - ordinal : function (number) { - if (number === 0) { - return number; - } - if (number === 1) { - return number + '-ლი'; - } - if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { - return 'მე-' + number; - } - return number + '-ე'; - }, - week : { - dow : 1, - doy : 7 - } - }); - - return ka; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/kk.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/kk.js deleted file mode 100755 index db9d7519..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/kk.js +++ /dev/null @@ -1,86 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var suffixes = { - 0: '-ші', - 1: '-ші', - 2: '-ші', - 3: '-ші', - 4: '-ші', - 5: '-ші', - 6: '-шы', - 7: '-ші', - 8: '-ші', - 9: '-шы', - 10: '-шы', - 20: '-шы', - 30: '-шы', - 40: '-шы', - 50: '-ші', - 60: '-шы', - 70: '-ші', - 80: '-ші', - 90: '-шы', - 100: '-ші' - }; - - var kk = moment.defineLocale('kk', { - months : 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split('_'), - monthsShort : 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'), - weekdays : 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split('_'), - weekdaysShort : 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'), - weekdaysMin : 'жк_дй_сй_ср_бй_жм_сн'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Бүгін сағат] LT', - nextDay : '[Ертең сағат] LT', - nextWeek : 'dddd [сағат] LT', - lastDay : '[Кеше сағат] LT', - lastWeek : '[Өткен аптаның] dddd [сағат] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s ішінде', - past : '%s бұрын', - s : 'бірнеше секунд', - ss : '%d секунд', - m : 'бір минут', - mm : '%d минут', - h : 'бір сағат', - hh : '%d сағат', - d : 'бір күн', - dd : '%d күн', - M : 'бір ай', - MM : '%d ай', - y : 'бір жыл', - yy : '%d жыл' - }, - dayOfMonthOrdinalParse: /\d{1,2}-(ші|шы)/, - ordinal : function (number) { - var a = number % 10, - b = number >= 100 ? 100 : null; - return number + (suffixes[number] || suffixes[a] || suffixes[b]); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return kk; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/km.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/km.js deleted file mode 100755 index fee36238..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/km.js +++ /dev/null @@ -1,109 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var symbolMap = { - '1': '១', - '2': '២', - '3': '៣', - '4': '៤', - '5': '៥', - '6': '៦', - '7': '៧', - '8': '៨', - '9': '៩', - '0': '០' - }, numberMap = { - '១': '1', - '២': '2', - '៣': '3', - '៤': '4', - '៥': '5', - '៦': '6', - '៧': '7', - '៨': '8', - '៩': '9', - '០': '0' - }; - - var km = moment.defineLocale('km', { - months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split( - '_' - ), - monthsShort: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split( - '_' - ), - weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'), - weekdaysShort: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'), - weekdaysMin: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'), - weekdaysParseExact: true, - longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY HH:mm', - LLLL: 'dddd, D MMMM YYYY HH:mm' - }, - meridiemParse: /ព្រឹក|ល្ងាច/, - isPM: function (input) { - return input === 'ល្ងាច'; - }, - meridiem: function (hour, minute, isLower) { - if (hour < 12) { - return 'ព្រឹក'; - } else { - return 'ល្ងាច'; - } - }, - calendar: { - sameDay: '[ថ្ងៃនេះ ម៉ោង] LT', - nextDay: '[ស្អែក ម៉ោង] LT', - nextWeek: 'dddd [ម៉ោង] LT', - lastDay: '[ម្សិលមិញ ម៉ោង] LT', - lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT', - sameElse: 'L' - }, - relativeTime: { - future: '%sទៀត', - past: '%sមុន', - s: 'ប៉ុន្មានវិនាទី', - ss: '%d វិនាទី', - m: 'មួយនាទី', - mm: '%d នាទី', - h: 'មួយម៉ោង', - hh: '%d ម៉ោង', - d: 'មួយថ្ងៃ', - dd: '%d ថ្ងៃ', - M: 'មួយខែ', - MM: '%d ខែ', - y: 'មួយឆ្នាំ', - yy: '%d ឆ្នាំ' - }, - dayOfMonthOrdinalParse : /ទី\d{1,2}/, - ordinal : 'ទី%d', - preparse: function (string) { - return string.replace(/[១២៣៤៥៦៧៨៩០]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return km; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/kn.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/kn.js deleted file mode 100755 index 85b35cf7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/kn.js +++ /dev/null @@ -1,125 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var symbolMap = { - '1': '೧', - '2': '೨', - '3': '೩', - '4': '೪', - '5': '೫', - '6': '೬', - '7': '೭', - '8': '೮', - '9': '೯', - '0': '೦' - }, - numberMap = { - '೧': '1', - '೨': '2', - '೩': '3', - '೪': '4', - '೫': '5', - '೬': '6', - '೭': '7', - '೮': '8', - '೯': '9', - '೦': '0' - }; - - var kn = moment.defineLocale('kn', { - months : 'ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್'.split('_'), - monthsShort : 'ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ'.split('_'), - monthsParseExact: true, - weekdays : 'ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ'.split('_'), - weekdaysShort : 'ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ'.split('_'), - weekdaysMin : 'ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ'.split('_'), - longDateFormat : { - LT : 'A h:mm', - LTS : 'A h:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm', - LLLL : 'dddd, D MMMM YYYY, A h:mm' - }, - calendar : { - sameDay : '[ಇಂದು] LT', - nextDay : '[ನಾಳೆ] LT', - nextWeek : 'dddd, LT', - lastDay : '[ನಿನ್ನೆ] LT', - lastWeek : '[ಕೊನೆಯ] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s ನಂತರ', - past : '%s ಹಿಂದೆ', - s : 'ಕೆಲವು ಕ್ಷಣಗಳು', - ss : '%d ಸೆಕೆಂಡುಗಳು', - m : 'ಒಂದು ನಿಮಿಷ', - mm : '%d ನಿಮಿಷ', - h : 'ಒಂದು ಗಂಟೆ', - hh : '%d ಗಂಟೆ', - d : 'ಒಂದು ದಿನ', - dd : '%d ದಿನ', - M : 'ಒಂದು ತಿಂಗಳು', - MM : '%d ತಿಂಗಳು', - y : 'ಒಂದು ವರ್ಷ', - yy : '%d ವರ್ಷ' - }, - preparse: function (string) { - return string.replace(/[೧೨೩೪೫೬೭೮೯೦]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'ರಾತ್ರಿ') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'ಬೆಳಿಗ್ಗೆ') { - return hour; - } else if (meridiem === 'ಮಧ್ಯಾಹ್ನ') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'ಸಂಜೆ') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ರಾತ್ರಿ'; - } else if (hour < 10) { - return 'ಬೆಳಿಗ್ಗೆ'; - } else if (hour < 17) { - return 'ಮಧ್ಯಾಹ್ನ'; - } else if (hour < 20) { - return 'ಸಂಜೆ'; - } else { - return 'ರಾತ್ರಿ'; - } - }, - dayOfMonthOrdinalParse: /\d{1,2}(ನೇ)/, - ordinal : function (number) { - return number + 'ನೇ'; - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); - - return kn; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ko.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ko.js deleted file mode 100755 index 40f1bb5d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ko.js +++ /dev/null @@ -1,80 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var ko = moment.defineLocale('ko', { - months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), - monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), - weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'), - weekdaysShort : '일_월_화_수_목_금_토'.split('_'), - weekdaysMin : '일_월_화_수_목_금_토'.split('_'), - longDateFormat : { - LT : 'A h:mm', - LTS : 'A h:mm:ss', - L : 'YYYY.MM.DD.', - LL : 'YYYY년 MMMM D일', - LLL : 'YYYY년 MMMM D일 A h:mm', - LLLL : 'YYYY년 MMMM D일 dddd A h:mm', - l : 'YYYY.MM.DD.', - ll : 'YYYY년 MMMM D일', - lll : 'YYYY년 MMMM D일 A h:mm', - llll : 'YYYY년 MMMM D일 dddd A h:mm' - }, - calendar : { - sameDay : '오늘 LT', - nextDay : '내일 LT', - nextWeek : 'dddd LT', - lastDay : '어제 LT', - lastWeek : '지난주 dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s 후', - past : '%s 전', - s : '몇 초', - ss : '%d초', - m : '1분', - mm : '%d분', - h : '한 시간', - hh : '%d시간', - d : '하루', - dd : '%d일', - M : '한 달', - MM : '%d달', - y : '일 년', - yy : '%d년' - }, - dayOfMonthOrdinalParse : /\d{1,2}(일|월|주)/, - ordinal : function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'DDD': - return number + '일'; - case 'M': - return number + '월'; - case 'w': - case 'W': - return number + '주'; - default: - return number; - } - }, - meridiemParse : /오전|오후/, - isPM : function (token) { - return token === '오후'; - }, - meridiem : function (hour, minute, isUpper) { - return hour < 12 ? '오전' : '오후'; - } - }); - - return ko; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ky.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ky.js deleted file mode 100755 index 7b0c9f39..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ky.js +++ /dev/null @@ -1,86 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var suffixes = { - 0: '-чү', - 1: '-чи', - 2: '-чи', - 3: '-чү', - 4: '-чү', - 5: '-чи', - 6: '-чы', - 7: '-чи', - 8: '-чи', - 9: '-чу', - 10: '-чу', - 20: '-чы', - 30: '-чу', - 40: '-чы', - 50: '-чү', - 60: '-чы', - 70: '-чи', - 80: '-чи', - 90: '-чу', - 100: '-чү' - }; - - var ky = moment.defineLocale('ky', { - months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'), - monthsShort : 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'), - weekdays : 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split('_'), - weekdaysShort : 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'), - weekdaysMin : 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Бүгүн саат] LT', - nextDay : '[Эртең саат] LT', - nextWeek : 'dddd [саат] LT', - lastDay : '[Кече саат] LT', - lastWeek : '[Өткен аптанын] dddd [күнү] [саат] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s ичинде', - past : '%s мурун', - s : 'бирнече секунд', - ss : '%d секунд', - m : 'бир мүнөт', - mm : '%d мүнөт', - h : 'бир саат', - hh : '%d саат', - d : 'бир күн', - dd : '%d күн', - M : 'бир ай', - MM : '%d ай', - y : 'бир жыл', - yy : '%d жыл' - }, - dayOfMonthOrdinalParse: /\d{1,2}-(чи|чы|чү|чу)/, - ordinal : function (number) { - var a = number % 10, - b = number >= 100 ? 100 : null; - return number + (suffixes[number] || suffixes[a] || suffixes[b]); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return ky; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lb.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lb.js deleted file mode 100755 index 599a6e58..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lb.js +++ /dev/null @@ -1,135 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eng Minutt', 'enger Minutt'], - 'h': ['eng Stonn', 'enger Stonn'], - 'd': ['een Dag', 'engem Dag'], - 'M': ['ee Mount', 'engem Mount'], - 'y': ['ee Joer', 'engem Joer'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - function processFutureTime(string) { - var number = string.substr(0, string.indexOf(' ')); - if (eifelerRegelAppliesToNumber(number)) { - return 'a ' + string; - } - return 'an ' + string; - } - function processPastTime(string) { - var number = string.substr(0, string.indexOf(' ')); - if (eifelerRegelAppliesToNumber(number)) { - return 'viru ' + string; - } - return 'virun ' + string; - } - /** - * Returns true if the word before the given number loses the '-n' ending. - * e.g. 'an 10 Deeg' but 'a 5 Deeg' - * - * @param number {integer} - * @returns {boolean} - */ - function eifelerRegelAppliesToNumber(number) { - number = parseInt(number, 10); - if (isNaN(number)) { - return false; - } - if (number < 0) { - // Negative Number --> always true - return true; - } else if (number < 10) { - // Only 1 digit - if (4 <= number && number <= 7) { - return true; - } - return false; - } else if (number < 100) { - // 2 digits - var lastDigit = number % 10, firstDigit = number / 10; - if (lastDigit === 0) { - return eifelerRegelAppliesToNumber(firstDigit); - } - return eifelerRegelAppliesToNumber(lastDigit); - } else if (number < 10000) { - // 3 or 4 digits --> recursively check first digit - while (number >= 10) { - number = number / 10; - } - return eifelerRegelAppliesToNumber(number); - } else { - // Anything larger than 4 digits: recursively check first n-3 digits - number = number / 1000; - return eifelerRegelAppliesToNumber(number); - } - } - - var lb = moment.defineLocale('lb', { - months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), - monthsParseExact : true, - weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), - weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), - weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), - weekdaysParseExact : true, - longDateFormat: { - LT: 'H:mm [Auer]', - LTS: 'H:mm:ss [Auer]', - L: 'DD.MM.YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY H:mm [Auer]', - LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]' - }, - calendar: { - sameDay: '[Haut um] LT', - sameElse: 'L', - nextDay: '[Muer um] LT', - nextWeek: 'dddd [um] LT', - lastDay: '[Gëschter um] LT', - lastWeek: function () { - // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule - switch (this.day()) { - case 2: - case 4: - return '[Leschten] dddd [um] LT'; - default: - return '[Leschte] dddd [um] LT'; - } - } - }, - relativeTime : { - future : processFutureTime, - past : processPastTime, - s : 'e puer Sekonnen', - ss : '%d Sekonnen', - m : processRelativeTime, - mm : '%d Minutten', - h : processRelativeTime, - hh : '%d Stonnen', - d : processRelativeTime, - dd : '%d Deeg', - M : processRelativeTime, - MM : '%d Méint', - y : processRelativeTime, - yy : '%d Joer' - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal: '%d.', - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return lb; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lo.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lo.js deleted file mode 100755 index 7cd6cfc8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lo.js +++ /dev/null @@ -1,69 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var lo = moment.defineLocale('lo', { - months : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'), - monthsShort : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'), - weekdays : 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'), - weekdaysShort : 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'), - weekdaysMin : 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'ວັນdddd D MMMM YYYY HH:mm' - }, - meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/, - isPM: function (input) { - return input === 'ຕອນແລງ'; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ຕອນເຊົ້າ'; - } else { - return 'ຕອນແລງ'; - } - }, - calendar : { - sameDay : '[ມື້ນີ້ເວລາ] LT', - nextDay : '[ມື້ອື່ນເວລາ] LT', - nextWeek : '[ວັນ]dddd[ໜ້າເວລາ] LT', - lastDay : '[ມື້ວານນີ້ເວລາ] LT', - lastWeek : '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'ອີກ %s', - past : '%sຜ່ານມາ', - s : 'ບໍ່ເທົ່າໃດວິນາທີ', - ss : '%d ວິນາທີ' , - m : '1 ນາທີ', - mm : '%d ນາທີ', - h : '1 ຊົ່ວໂມງ', - hh : '%d ຊົ່ວໂມງ', - d : '1 ມື້', - dd : '%d ມື້', - M : '1 ເດືອນ', - MM : '%d ເດືອນ', - y : '1 ປີ', - yy : '%d ປີ' - }, - dayOfMonthOrdinalParse: /(ທີ່)\d{1,2}/, - ordinal : function (number) { - return 'ທີ່' + number; - } - }); - - return lo; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lt.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lt.js deleted file mode 100755 index bc7d7e7a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lt.js +++ /dev/null @@ -1,117 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var units = { - 'ss' : 'sekundė_sekundžių_sekundes', - 'm' : 'minutė_minutės_minutę', - 'mm': 'minutės_minučių_minutes', - 'h' : 'valanda_valandos_valandą', - 'hh': 'valandos_valandų_valandas', - 'd' : 'diena_dienos_dieną', - 'dd': 'dienos_dienų_dienas', - 'M' : 'mėnuo_mėnesio_mėnesį', - 'MM': 'mėnesiai_mėnesių_mėnesius', - 'y' : 'metai_metų_metus', - 'yy': 'metai_metų_metus' - }; - function translateSeconds(number, withoutSuffix, key, isFuture) { - if (withoutSuffix) { - return 'kelios sekundės'; - } else { - return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; - } - } - function translateSingular(number, withoutSuffix, key, isFuture) { - return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); - } - function special(number) { - return number % 10 === 0 || (number > 10 && number < 20); - } - function forms(key) { - return units[key].split('_'); - } - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - if (number === 1) { - return result + translateSingular(number, withoutSuffix, key[0], isFuture); - } else if (withoutSuffix) { - return result + (special(number) ? forms(key)[1] : forms(key)[0]); - } else { - if (isFuture) { - return result + forms(key)[1]; - } else { - return result + (special(number) ? forms(key)[1] : forms(key)[2]); - } - } - } - var lt = moment.defineLocale('lt', { - months : { - format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'), - standalone: 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_'), - isFormat: /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/ - }, - monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), - weekdays : { - format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split('_'), - standalone: 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_'), - isFormat: /dddd HH:mm/ - }, - weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'), - weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'YYYY [m.] MMMM D [d.]', - LLL : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', - LLLL : 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]', - l : 'YYYY-MM-DD', - ll : 'YYYY [m.] MMMM D [d.]', - lll : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', - llll : 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]' - }, - calendar : { - sameDay : '[Šiandien] LT', - nextDay : '[Rytoj] LT', - nextWeek : 'dddd LT', - lastDay : '[Vakar] LT', - lastWeek : '[Praėjusį] dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : 'po %s', - past : 'prieš %s', - s : translateSeconds, - ss : translate, - m : translateSingular, - mm : translate, - h : translateSingular, - hh : translate, - d : translateSingular, - dd : translate, - M : translateSingular, - MM : translate, - y : translateSingular, - yy : translate - }, - dayOfMonthOrdinalParse: /\d{1,2}-oji/, - ordinal : function (number) { - return number + '-oji'; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return lt; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lv.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lv.js deleted file mode 100755 index b5b8ea84..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/lv.js +++ /dev/null @@ -1,96 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var units = { - 'ss': 'sekundes_sekundēm_sekunde_sekundes'.split('_'), - 'm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), - 'mm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), - 'h': 'stundas_stundām_stunda_stundas'.split('_'), - 'hh': 'stundas_stundām_stunda_stundas'.split('_'), - 'd': 'dienas_dienām_diena_dienas'.split('_'), - 'dd': 'dienas_dienām_diena_dienas'.split('_'), - 'M': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), - 'MM': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), - 'y': 'gada_gadiem_gads_gadi'.split('_'), - 'yy': 'gada_gadiem_gads_gadi'.split('_') - }; - /** - * @param withoutSuffix boolean true = a length of time; false = before/after a period of time. - */ - function format(forms, number, withoutSuffix) { - if (withoutSuffix) { - // E.g. "21 minūte", "3 minūtes". - return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3]; - } else { - // E.g. "21 minūtes" as in "pēc 21 minūtes". - // E.g. "3 minūtēm" as in "pēc 3 minūtēm". - return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1]; - } - } - function relativeTimeWithPlural(number, withoutSuffix, key) { - return number + ' ' + format(units[key], number, withoutSuffix); - } - function relativeTimeWithSingular(number, withoutSuffix, key) { - return format(units[key], number, withoutSuffix); - } - function relativeSeconds(number, withoutSuffix) { - return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm'; - } - - var lv = moment.defineLocale('lv', { - months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'), - weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'), - weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), - weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY.', - LL : 'YYYY. [gada] D. MMMM', - LLL : 'YYYY. [gada] D. MMMM, HH:mm', - LLLL : 'YYYY. [gada] D. MMMM, dddd, HH:mm' - }, - calendar : { - sameDay : '[Šodien pulksten] LT', - nextDay : '[Rīt pulksten] LT', - nextWeek : 'dddd [pulksten] LT', - lastDay : '[Vakar pulksten] LT', - lastWeek : '[Pagājušā] dddd [pulksten] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'pēc %s', - past : 'pirms %s', - s : relativeSeconds, - ss : relativeTimeWithPlural, - m : relativeTimeWithSingular, - mm : relativeTimeWithPlural, - h : relativeTimeWithSingular, - hh : relativeTimeWithPlural, - d : relativeTimeWithSingular, - dd : relativeTimeWithPlural, - M : relativeTimeWithSingular, - MM : relativeTimeWithPlural, - y : relativeTimeWithSingular, - yy : relativeTimeWithPlural - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return lv; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/me.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/me.js deleted file mode 100755 index ee7bd396..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/me.js +++ /dev/null @@ -1,111 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var translator = { - words: { //Different grammatical cases - ss: ['sekund', 'sekunda', 'sekundi'], - m: ['jedan minut', 'jednog minuta'], - mm: ['minut', 'minuta', 'minuta'], - h: ['jedan sat', 'jednog sata'], - hh: ['sat', 'sata', 'sati'], - dd: ['dan', 'dana', 'dana'], - MM: ['mjesec', 'mjeseca', 'mjeseci'], - yy: ['godina', 'godine', 'godina'] - }, - correctGrammaticalCase: function (number, wordKey) { - return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); - }, - translate: function (number, withoutSuffix, key) { - var wordKey = translator.words[key]; - if (key.length === 1) { - return withoutSuffix ? wordKey[0] : wordKey[1]; - } else { - return number + ' ' + translator.correctGrammaticalCase(number, wordKey); - } - } - }; - - var me = moment.defineLocale('me', { - months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'), - monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'), - monthsParseExact : true, - weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), - weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), - weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'), - weekdaysParseExact : true, - longDateFormat: { - LT: 'H:mm', - LTS : 'H:mm:ss', - L: 'DD.MM.YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY H:mm', - LLLL: 'dddd, D. MMMM YYYY H:mm' - }, - calendar: { - sameDay: '[danas u] LT', - nextDay: '[sjutra u] LT', - - nextWeek: function () { - switch (this.day()) { - case 0: - return '[u] [nedjelju] [u] LT'; - case 3: - return '[u] [srijedu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[juče u] LT', - lastWeek : function () { - var lastWeekDays = [ - '[prošle] [nedjelje] [u] LT', - '[prošlog] [ponedjeljka] [u] LT', - '[prošlog] [utorka] [u] LT', - '[prošle] [srijede] [u] LT', - '[prošlog] [četvrtka] [u] LT', - '[prošlog] [petka] [u] LT', - '[prošle] [subote] [u] LT' - ]; - return lastWeekDays[this.day()]; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'za %s', - past : 'prije %s', - s : 'nekoliko sekundi', - ss : translator.translate, - m : translator.translate, - mm : translator.translate, - h : translator.translate, - hh : translator.translate, - d : 'dan', - dd : translator.translate, - M : 'mjesec', - MM : translator.translate, - y : 'godinu', - yy : translator.translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return me; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mi.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mi.js deleted file mode 100755 index 29f1c7a3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mi.js +++ /dev/null @@ -1,63 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var mi = moment.defineLocale('mi', { - months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split('_'), - monthsShort: 'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split('_'), - monthsRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, - monthsStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, - monthsShortRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, - monthsShortStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i, - weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'), - weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'), - weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'), - longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY [i] HH:mm', - LLLL: 'dddd, D MMMM YYYY [i] HH:mm' - }, - calendar: { - sameDay: '[i teie mahana, i] LT', - nextDay: '[apopo i] LT', - nextWeek: 'dddd [i] LT', - lastDay: '[inanahi i] LT', - lastWeek: 'dddd [whakamutunga i] LT', - sameElse: 'L' - }, - relativeTime: { - future: 'i roto i %s', - past: '%s i mua', - s: 'te hēkona ruarua', - ss: '%d hēkona', - m: 'he meneti', - mm: '%d meneti', - h: 'te haora', - hh: '%d haora', - d: 'he ra', - dd: '%d ra', - M: 'he marama', - MM: '%d marama', - y: 'he tau', - yy: '%d tau' - }, - dayOfMonthOrdinalParse: /\d{1,2}º/, - ordinal: '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return mi; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mk.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mk.js deleted file mode 100755 index e2d44989..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mk.js +++ /dev/null @@ -1,89 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var mk = moment.defineLocale('mk', { - months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'), - monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'), - weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'), - weekdaysShort : 'нед_пон_вто_сре_чет_пет_саб'.split('_'), - weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'D.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY H:mm', - LLLL : 'dddd, D MMMM YYYY H:mm' - }, - calendar : { - sameDay : '[Денес во] LT', - nextDay : '[Утре во] LT', - nextWeek : '[Во] dddd [во] LT', - lastDay : '[Вчера во] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - case 6: - return '[Изминатата] dddd [во] LT'; - case 1: - case 2: - case 4: - case 5: - return '[Изминатиот] dddd [во] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'после %s', - past : 'пред %s', - s : 'неколку секунди', - ss : '%d секунди', - m : 'минута', - mm : '%d минути', - h : 'час', - hh : '%d часа', - d : 'ден', - dd : '%d дена', - M : 'месец', - MM : '%d месеци', - y : 'година', - yy : '%d години' - }, - dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, - ordinal : function (number) { - var lastDigit = number % 10, - last2Digits = number % 100; - if (number === 0) { - return number + '-ев'; - } else if (last2Digits === 0) { - return number + '-ен'; - } else if (last2Digits > 10 && last2Digits < 20) { - return number + '-ти'; - } else if (lastDigit === 1) { - return number + '-ви'; - } else if (lastDigit === 2) { - return number + '-ри'; - } else if (lastDigit === 7 || lastDigit === 8) { - return number + '-ми'; - } else { - return number + '-ти'; - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return mk; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ml.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ml.js deleted file mode 100755 index 806db47b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ml.js +++ /dev/null @@ -1,80 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var ml = moment.defineLocale('ml', { - months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'), - monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'), - monthsParseExact : true, - weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'), - weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'), - weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'), - longDateFormat : { - LT : 'A h:mm -നു', - LTS : 'A h:mm:ss -നു', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm -നു', - LLLL : 'dddd, D MMMM YYYY, A h:mm -നു' - }, - calendar : { - sameDay : '[ഇന്ന്] LT', - nextDay : '[നാളെ] LT', - nextWeek : 'dddd, LT', - lastDay : '[ഇന്നലെ] LT', - lastWeek : '[കഴിഞ്ഞ] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s കഴിഞ്ഞ്', - past : '%s മുൻപ്', - s : 'അൽപ നിമിഷങ്ങൾ', - ss : '%d സെക്കൻഡ്', - m : 'ഒരു മിനിറ്റ്', - mm : '%d മിനിറ്റ്', - h : 'ഒരു മണിക്കൂർ', - hh : '%d മണിക്കൂർ', - d : 'ഒരു ദിവസം', - dd : '%d ദിവസം', - M : 'ഒരു മാസം', - MM : '%d മാസം', - y : 'ഒരു വർഷം', - yy : '%d വർഷം' - }, - meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if ((meridiem === 'രാത്രി' && hour >= 4) || - meridiem === 'ഉച്ച കഴിഞ്ഞ്' || - meridiem === 'വൈകുന്നേരം') { - return hour + 12; - } else { - return hour; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'രാത്രി'; - } else if (hour < 12) { - return 'രാവിലെ'; - } else if (hour < 17) { - return 'ഉച്ച കഴിഞ്ഞ്'; - } else if (hour < 20) { - return 'വൈകുന്നേരം'; - } else { - return 'രാത്രി'; - } - } - }); - - return ml; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mn.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mn.js deleted file mode 100755 index f4b95c81..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mn.js +++ /dev/null @@ -1,103 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - function translate(number, withoutSuffix, key, isFuture) { - switch (key) { - case 's': - return withoutSuffix ? 'хэдхэн секунд' : 'хэдхэн секундын'; - case 'ss': - return number + (withoutSuffix ? ' секунд' : ' секундын'); - case 'm': - case 'mm': - return number + (withoutSuffix ? ' минут' : ' минутын'); - case 'h': - case 'hh': - return number + (withoutSuffix ? ' цаг' : ' цагийн'); - case 'd': - case 'dd': - return number + (withoutSuffix ? ' өдөр' : ' өдрийн'); - case 'M': - case 'MM': - return number + (withoutSuffix ? ' сар' : ' сарын'); - case 'y': - case 'yy': - return number + (withoutSuffix ? ' жил' : ' жилийн'); - default: - return number; - } - } - - var mn = moment.defineLocale('mn', { - months : 'Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар'.split('_'), - monthsShort : '1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар'.split('_'), - monthsParseExact : true, - weekdays : 'Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба'.split('_'), - weekdaysShort : 'Ням_Дав_Мяг_Лха_Пүр_Баа_Бям'.split('_'), - weekdaysMin : 'Ня_Да_Мя_Лх_Пү_Ба_Бя'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'YYYY оны MMMMын D', - LLL : 'YYYY оны MMMMын D HH:mm', - LLLL : 'dddd, YYYY оны MMMMын D HH:mm' - }, - meridiemParse: /ҮӨ|ҮХ/i, - isPM : function (input) { - return input === 'ҮХ'; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ҮӨ'; - } else { - return 'ҮХ'; - } - }, - calendar : { - sameDay : '[Өнөөдөр] LT', - nextDay : '[Маргааш] LT', - nextWeek : '[Ирэх] dddd LT', - lastDay : '[Өчигдөр] LT', - lastWeek : '[Өнгөрсөн] dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s дараа', - past : '%s өмнө', - s : translate, - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - dayOfMonthOrdinalParse: /\d{1,2} өдөр/, - ordinal : function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'DDD': - return number + ' өдөр'; - default: - return number; - } - } - }); - - return mn; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mr.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mr.js deleted file mode 100755 index fdeaa3d9..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mr.js +++ /dev/null @@ -1,159 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var symbolMap = { - '1': '१', - '2': '२', - '3': '३', - '4': '४', - '5': '५', - '6': '६', - '7': '७', - '8': '८', - '9': '९', - '0': '०' - }, - numberMap = { - '१': '1', - '२': '2', - '३': '3', - '४': '4', - '५': '5', - '६': '6', - '७': '7', - '८': '8', - '९': '9', - '०': '0' - }; - - function relativeTimeMr(number, withoutSuffix, string, isFuture) - { - var output = ''; - if (withoutSuffix) { - switch (string) { - case 's': output = 'काही सेकंद'; break; - case 'ss': output = '%d सेकंद'; break; - case 'm': output = 'एक मिनिट'; break; - case 'mm': output = '%d मिनिटे'; break; - case 'h': output = 'एक तास'; break; - case 'hh': output = '%d तास'; break; - case 'd': output = 'एक दिवस'; break; - case 'dd': output = '%d दिवस'; break; - case 'M': output = 'एक महिना'; break; - case 'MM': output = '%d महिने'; break; - case 'y': output = 'एक वर्ष'; break; - case 'yy': output = '%d वर्षे'; break; - } - } - else { - switch (string) { - case 's': output = 'काही सेकंदां'; break; - case 'ss': output = '%d सेकंदां'; break; - case 'm': output = 'एका मिनिटा'; break; - case 'mm': output = '%d मिनिटां'; break; - case 'h': output = 'एका तासा'; break; - case 'hh': output = '%d तासां'; break; - case 'd': output = 'एका दिवसा'; break; - case 'dd': output = '%d दिवसां'; break; - case 'M': output = 'एका महिन्या'; break; - case 'MM': output = '%d महिन्यां'; break; - case 'y': output = 'एका वर्षा'; break; - case 'yy': output = '%d वर्षां'; break; - } - } - return output.replace(/%d/i, number); - } - - var mr = moment.defineLocale('mr', { - months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'), - monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'), - monthsParseExact : true, - weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'), - weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'), - weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'), - longDateFormat : { - LT : 'A h:mm वाजता', - LTS : 'A h:mm:ss वाजता', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm वाजता', - LLLL : 'dddd, D MMMM YYYY, A h:mm वाजता' - }, - calendar : { - sameDay : '[आज] LT', - nextDay : '[उद्या] LT', - nextWeek : 'dddd, LT', - lastDay : '[काल] LT', - lastWeek: '[मागील] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future: '%sमध्ये', - past: '%sपूर्वी', - s: relativeTimeMr, - ss: relativeTimeMr, - m: relativeTimeMr, - mm: relativeTimeMr, - h: relativeTimeMr, - hh: relativeTimeMr, - d: relativeTimeMr, - dd: relativeTimeMr, - M: relativeTimeMr, - MM: relativeTimeMr, - y: relativeTimeMr, - yy: relativeTimeMr - }, - preparse: function (string) { - return string.replace(/[१२३४५६७८९०]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /रात्री|सकाळी|दुपारी|सायंकाळी/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'रात्री') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'सकाळी') { - return hour; - } else if (meridiem === 'दुपारी') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'सायंकाळी') { - return hour + 12; - } - }, - meridiem: function (hour, minute, isLower) { - if (hour < 4) { - return 'रात्री'; - } else if (hour < 10) { - return 'सकाळी'; - } else if (hour < 17) { - return 'दुपारी'; - } else if (hour < 20) { - return 'सायंकाळी'; - } else { - return 'रात्री'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); - - return mr; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ms-my.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ms-my.js deleted file mode 100755 index 72188205..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ms-my.js +++ /dev/null @@ -1,81 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var msMy = moment.defineLocale('ms-my', { - months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), - monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), - weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), - weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), - weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] HH.mm', - LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' - }, - meridiemParse: /pagi|tengahari|petang|malam/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'pagi') { - return hour; - } else if (meridiem === 'tengahari') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'petang' || meridiem === 'malam') { - return hour + 12; - } - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'pagi'; - } else if (hours < 15) { - return 'tengahari'; - } else if (hours < 19) { - return 'petang'; - } else { - return 'malam'; - } - }, - calendar : { - sameDay : '[Hari ini pukul] LT', - nextDay : '[Esok pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kelmarin pukul] LT', - lastWeek : 'dddd [lepas pukul] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'dalam %s', - past : '%s yang lepas', - s : 'beberapa saat', - ss : '%d saat', - m : 'seminit', - mm : '%d minit', - h : 'sejam', - hh : '%d jam', - d : 'sehari', - dd : '%d hari', - M : 'sebulan', - MM : '%d bulan', - y : 'setahun', - yy : '%d tahun' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return msMy; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ms.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ms.js deleted file mode 100755 index 1fe21443..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ms.js +++ /dev/null @@ -1,81 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var ms = moment.defineLocale('ms', { - months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), - monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), - weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), - weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), - weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] HH.mm', - LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' - }, - meridiemParse: /pagi|tengahari|petang|malam/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'pagi') { - return hour; - } else if (meridiem === 'tengahari') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'petang' || meridiem === 'malam') { - return hour + 12; - } - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'pagi'; - } else if (hours < 15) { - return 'tengahari'; - } else if (hours < 19) { - return 'petang'; - } else { - return 'malam'; - } - }, - calendar : { - sameDay : '[Hari ini pukul] LT', - nextDay : '[Esok pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kelmarin pukul] LT', - lastWeek : 'dddd [lepas pukul] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'dalam %s', - past : '%s yang lepas', - s : 'beberapa saat', - ss : '%d saat', - m : 'seminit', - mm : '%d minit', - h : 'sejam', - hh : '%d jam', - d : 'sehari', - dd : '%d hari', - M : 'sebulan', - MM : '%d bulan', - y : 'setahun', - yy : '%d tahun' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return ms; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mt.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mt.js deleted file mode 100755 index 4a34c5de..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/mt.js +++ /dev/null @@ -1,59 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var mt = moment.defineLocale('mt', { - months : 'Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru'.split('_'), - monthsShort : 'Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ'.split('_'), - weekdays : 'Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt'.split('_'), - weekdaysShort : 'Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib'.split('_'), - weekdaysMin : 'Ħa_Tn_Tl_Er_Ħa_Ġi_Si'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Illum fil-]LT', - nextDay : '[Għada fil-]LT', - nextWeek : 'dddd [fil-]LT', - lastDay : '[Il-bieraħ fil-]LT', - lastWeek : 'dddd [li għadda] [fil-]LT', - sameElse : 'L' - }, - relativeTime : { - future : 'f’ %s', - past : '%s ilu', - s : 'ftit sekondi', - ss : '%d sekondi', - m : 'minuta', - mm : '%d minuti', - h : 'siegħa', - hh : '%d siegħat', - d : 'ġurnata', - dd : '%d ġranet', - M : 'xahar', - MM : '%d xhur', - y : 'sena', - yy : '%d sni' - }, - dayOfMonthOrdinalParse : /\d{1,2}º/, - ordinal: '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return mt; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/my.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/my.js deleted file mode 100755 index bc87c7f7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/my.js +++ /dev/null @@ -1,92 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var symbolMap = { - '1': '၁', - '2': '၂', - '3': '၃', - '4': '၄', - '5': '၅', - '6': '၆', - '7': '၇', - '8': '၈', - '9': '၉', - '0': '၀' - }, numberMap = { - '၁': '1', - '၂': '2', - '၃': '3', - '၄': '4', - '၅': '5', - '၆': '6', - '၇': '7', - '၈': '8', - '၉': '9', - '၀': '0' - }; - - var my = moment.defineLocale('my', { - months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'), - monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), - weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'), - weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), - weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), - - longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY HH:mm', - LLLL: 'dddd D MMMM YYYY HH:mm' - }, - calendar: { - sameDay: '[ယနေ.] LT [မှာ]', - nextDay: '[မနက်ဖြန်] LT [မှာ]', - nextWeek: 'dddd LT [မှာ]', - lastDay: '[မနေ.က] LT [မှာ]', - lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]', - sameElse: 'L' - }, - relativeTime: { - future: 'လာမည့် %s မှာ', - past: 'လွန်ခဲ့သော %s က', - s: 'စက္ကန်.အနည်းငယ်', - ss : '%d စက္ကန့်', - m: 'တစ်မိနစ်', - mm: '%d မိနစ်', - h: 'တစ်နာရီ', - hh: '%d နာရီ', - d: 'တစ်ရက်', - dd: '%d ရက်', - M: 'တစ်လ', - MM: '%d လ', - y: 'တစ်နှစ်', - yy: '%d နှစ်' - }, - preparse: function (string) { - return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 1st is the first week of the year. - } - }); - - return my; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nb.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nb.js deleted file mode 100755 index f2298104..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nb.js +++ /dev/null @@ -1,61 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var nb = moment.defineLocale('nb', { - months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), - monthsShort : 'jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.'.split('_'), - monthsParseExact : true, - weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), - weekdaysShort : 'sø._ma._ti._on._to._fr._lø.'.split('_'), - weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY [kl.] HH:mm', - LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' - }, - calendar : { - sameDay: '[i dag kl.] LT', - nextDay: '[i morgen kl.] LT', - nextWeek: 'dddd [kl.] LT', - lastDay: '[i går kl.] LT', - lastWeek: '[forrige] dddd [kl.] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'om %s', - past : '%s siden', - s : 'noen sekunder', - ss : '%d sekunder', - m : 'ett minutt', - mm : '%d minutter', - h : 'en time', - hh : '%d timer', - d : 'en dag', - dd : '%d dager', - M : 'en måned', - MM : '%d måneder', - y : 'ett år', - yy : '%d år' - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return nb; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ne.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ne.js deleted file mode 100755 index 2ec063ee..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ne.js +++ /dev/null @@ -1,122 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var symbolMap = { - '1': '१', - '2': '२', - '3': '३', - '4': '४', - '5': '५', - '6': '६', - '7': '७', - '8': '८', - '9': '९', - '0': '०' - }, - numberMap = { - '१': '1', - '२': '2', - '३': '3', - '४': '4', - '५': '5', - '६': '6', - '७': '7', - '८': '8', - '९': '9', - '०': '0' - }; - - var ne = moment.defineLocale('ne', { - months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'), - monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'), - monthsParseExact : true, - weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'), - weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'), - weekdaysMin : 'आ._सो._मं._बु._बि._शु._श.'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'Aको h:mm बजे', - LTS : 'Aको h:mm:ss बजे', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, Aको h:mm बजे', - LLLL : 'dddd, D MMMM YYYY, Aको h:mm बजे' - }, - preparse: function (string) { - return string.replace(/[१२३४५६७८९०]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /राति|बिहान|दिउँसो|साँझ/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'राति') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'बिहान') { - return hour; - } else if (meridiem === 'दिउँसो') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'साँझ') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 3) { - return 'राति'; - } else if (hour < 12) { - return 'बिहान'; - } else if (hour < 16) { - return 'दिउँसो'; - } else if (hour < 20) { - return 'साँझ'; - } else { - return 'राति'; - } - }, - calendar : { - sameDay : '[आज] LT', - nextDay : '[भोलि] LT', - nextWeek : '[आउँदो] dddd[,] LT', - lastDay : '[हिजो] LT', - lastWeek : '[गएको] dddd[,] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%sमा', - past : '%s अगाडि', - s : 'केही क्षण', - ss : '%d सेकेण्ड', - m : 'एक मिनेट', - mm : '%d मिनेट', - h : 'एक घण्टा', - hh : '%d घण्टा', - d : 'एक दिन', - dd : '%d दिन', - M : 'एक महिना', - MM : '%d महिना', - y : 'एक बर्ष', - yy : '%d बर्ष' - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); - - return ne; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nl-be.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nl-be.js deleted file mode 100755 index 0e5bdc96..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nl-be.js +++ /dev/null @@ -1,86 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), - monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); - - var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i]; - var monthsRegex = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; - - var nlBe = moment.defineLocale('nl-be', { - months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), - monthsShort : function (m, format) { - if (!m) { - return monthsShortWithDots; - } else if (/-MMM-/.test(format)) { - return monthsShortWithoutDots[m.month()]; - } else { - return monthsShortWithDots[m.month()]; - } - }, - - monthsRegex: monthsRegex, - monthsShortRegex: monthsRegex, - monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i, - monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, - - monthsParse : monthsParse, - longMonthsParse : monthsParse, - shortMonthsParse : monthsParse, - - weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), - weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), - weekdaysMin : 'zo_ma_di_wo_do_vr_za'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[vandaag om] LT', - nextDay: '[morgen om] LT', - nextWeek: 'dddd [om] LT', - lastDay: '[gisteren om] LT', - lastWeek: '[afgelopen] dddd [om] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'over %s', - past : '%s geleden', - s : 'een paar seconden', - ss : '%d seconden', - m : 'één minuut', - mm : '%d minuten', - h : 'één uur', - hh : '%d uur', - d : 'één dag', - dd : '%d dagen', - M : 'één maand', - MM : '%d maanden', - y : 'één jaar', - yy : '%d jaar' - }, - dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return nlBe; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nl.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nl.js deleted file mode 100755 index 842f4fe1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nl.js +++ /dev/null @@ -1,86 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), - monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); - - var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i]; - var monthsRegex = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; - - var nl = moment.defineLocale('nl', { - months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), - monthsShort : function (m, format) { - if (!m) { - return monthsShortWithDots; - } else if (/-MMM-/.test(format)) { - return monthsShortWithoutDots[m.month()]; - } else { - return monthsShortWithDots[m.month()]; - } - }, - - monthsRegex: monthsRegex, - monthsShortRegex: monthsRegex, - monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i, - monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, - - monthsParse : monthsParse, - longMonthsParse : monthsParse, - shortMonthsParse : monthsParse, - - weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), - weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), - weekdaysMin : 'zo_ma_di_wo_do_vr_za'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD-MM-YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[vandaag om] LT', - nextDay: '[morgen om] LT', - nextWeek: 'dddd [om] LT', - lastDay: '[gisteren om] LT', - lastWeek: '[afgelopen] dddd [om] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'over %s', - past : '%s geleden', - s : 'een paar seconden', - ss : '%d seconden', - m : 'één minuut', - mm : '%d minuten', - h : 'één uur', - hh : '%d uur', - d : 'één dag', - dd : '%d dagen', - M : 'één maand', - MM : '%d maanden', - y : 'één jaar', - yy : '%d jaar' - }, - dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return nl; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nn.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nn.js deleted file mode 100755 index 5fa35504..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/nn.js +++ /dev/null @@ -1,59 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var nn = moment.defineLocale('nn', { - months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), - weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), - weekdaysShort : 'sun_mån_tys_ons_tor_fre_lau'.split('_'), - weekdaysMin : 'su_må_ty_on_to_fr_lø'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY [kl.] H:mm', - LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' - }, - calendar : { - sameDay: '[I dag klokka] LT', - nextDay: '[I morgon klokka] LT', - nextWeek: 'dddd [klokka] LT', - lastDay: '[I går klokka] LT', - lastWeek: '[Føregåande] dddd [klokka] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'om %s', - past : '%s sidan', - s : 'nokre sekund', - ss : '%d sekund', - m : 'eit minutt', - mm : '%d minutt', - h : 'ein time', - hh : '%d timar', - d : 'ein dag', - dd : '%d dagar', - M : 'ein månad', - MM : '%d månader', - y : 'eit år', - yy : '%d år' - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return nn; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pa-in.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pa-in.js deleted file mode 100755 index f17b8dd9..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pa-in.js +++ /dev/null @@ -1,123 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var symbolMap = { - '1': '੧', - '2': '੨', - '3': '੩', - '4': '੪', - '5': '੫', - '6': '੬', - '7': '੭', - '8': '੮', - '9': '੯', - '0': '੦' - }, - numberMap = { - '੧': '1', - '੨': '2', - '੩': '3', - '੪': '4', - '੫': '5', - '੬': '6', - '੭': '7', - '੮': '8', - '੯': '9', - '੦': '0' - }; - - var paIn = moment.defineLocale('pa-in', { - // There are months name as per Nanakshahi Calender but they are not used as rigidly in modern Punjabi. - months : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'), - monthsShort : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'), - weekdays : 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split('_'), - weekdaysShort : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'), - weekdaysMin : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'), - longDateFormat : { - LT : 'A h:mm ਵਜੇ', - LTS : 'A h:mm:ss ਵਜੇ', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm ਵਜੇ', - LLLL : 'dddd, D MMMM YYYY, A h:mm ਵਜੇ' - }, - calendar : { - sameDay : '[ਅਜ] LT', - nextDay : '[ਕਲ] LT', - nextWeek : 'dddd, LT', - lastDay : '[ਕਲ] LT', - lastWeek : '[ਪਿਛਲੇ] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s ਵਿੱਚ', - past : '%s ਪਿਛਲੇ', - s : 'ਕੁਝ ਸਕਿੰਟ', - ss : '%d ਸਕਿੰਟ', - m : 'ਇਕ ਮਿੰਟ', - mm : '%d ਮਿੰਟ', - h : 'ਇੱਕ ਘੰਟਾ', - hh : '%d ਘੰਟੇ', - d : 'ਇੱਕ ਦਿਨ', - dd : '%d ਦਿਨ', - M : 'ਇੱਕ ਮਹੀਨਾ', - MM : '%d ਮਹੀਨੇ', - y : 'ਇੱਕ ਸਾਲ', - yy : '%d ਸਾਲ' - }, - preparse: function (string) { - return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - // Punjabi notation for meridiems are quite fuzzy in practice. While there exists - // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi. - meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'ਰਾਤ') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'ਸਵੇਰ') { - return hour; - } else if (meridiem === 'ਦੁਪਹਿਰ') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'ਸ਼ਾਮ') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ਰਾਤ'; - } else if (hour < 10) { - return 'ਸਵੇਰ'; - } else if (hour < 17) { - return 'ਦੁਪਹਿਰ'; - } else if (hour < 20) { - return 'ਸ਼ਾਮ'; - } else { - return 'ਰਾਤ'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); - - return paIn; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pl.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pl.js deleted file mode 100755 index 4c9c71a0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pl.js +++ /dev/null @@ -1,125 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_'), - monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_'); - function plural(n) { - return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); - } - function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'ss': - return result + (plural(number) ? 'sekundy' : 'sekund'); - case 'm': - return withoutSuffix ? 'minuta' : 'minutę'; - case 'mm': - return result + (plural(number) ? 'minuty' : 'minut'); - case 'h': - return withoutSuffix ? 'godzina' : 'godzinę'; - case 'hh': - return result + (plural(number) ? 'godziny' : 'godzin'); - case 'MM': - return result + (plural(number) ? 'miesiące' : 'miesięcy'); - case 'yy': - return result + (plural(number) ? 'lata' : 'lat'); - } - } - - var pl = moment.defineLocale('pl', { - months : function (momentToFormat, format) { - if (!momentToFormat) { - return monthsNominative; - } else if (format === '') { - // Hack: if format empty we know this is used to generate - // RegExp by moment. Give then back both valid forms of months - // in RegExp ready format. - return '(' + monthsSubjective[momentToFormat.month()] + '|' + monthsNominative[momentToFormat.month()] + ')'; - } else if (/D MMMM/.test(format)) { - return monthsSubjective[momentToFormat.month()]; - } else { - return monthsNominative[momentToFormat.month()]; - } - }, - monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), - weekdays : 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'), - weekdaysShort : 'ndz_pon_wt_śr_czw_pt_sob'.split('_'), - weekdaysMin : 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[Dziś o] LT', - nextDay: '[Jutro o] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[W niedzielę o] LT'; - - case 2: - return '[We wtorek o] LT'; - - case 3: - return '[W środę o] LT'; - - case 6: - return '[W sobotę o] LT'; - - default: - return '[W] dddd [o] LT'; - } - }, - lastDay: '[Wczoraj o] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[W zeszłą niedzielę o] LT'; - case 3: - return '[W zeszłą środę o] LT'; - case 6: - return '[W zeszłą sobotę o] LT'; - default: - return '[W zeszły] dddd [o] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'za %s', - past : '%s temu', - s : 'kilka sekund', - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : '1 dzień', - dd : '%d dni', - M : 'miesiąc', - MM : translate, - y : 'rok', - yy : translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return pl; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pt-br.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pt-br.js deleted file mode 100755 index 64e0d01e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pt-br.js +++ /dev/null @@ -1,60 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var ptBr = moment.defineLocale('pt-br', { - months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), - monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), - weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'), - weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), - weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY [às] HH:mm', - LLLL : 'dddd, D [de] MMMM [de] YYYY [às] HH:mm' - }, - calendar : { - sameDay: '[Hoje às] LT', - nextDay: '[Amanhã às] LT', - nextWeek: 'dddd [às] LT', - lastDay: '[Ontem às] LT', - lastWeek: function () { - return (this.day() === 0 || this.day() === 6) ? - '[Último] dddd [às] LT' : // Saturday + Sunday - '[Última] dddd [às] LT'; // Monday - Friday - }, - sameElse: 'L' - }, - relativeTime : { - future : 'em %s', - past : 'há %s', - s : 'poucos segundos', - ss : '%d segundos', - m : 'um minuto', - mm : '%d minutos', - h : 'uma hora', - hh : '%d horas', - d : 'um dia', - dd : '%d dias', - M : 'um mês', - MM : '%d meses', - y : 'um ano', - yy : '%d anos' - }, - dayOfMonthOrdinalParse: /\d{1,2}º/, - ordinal : '%dº' - }); - - return ptBr; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pt.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pt.js deleted file mode 100755 index b21ac45b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/pt.js +++ /dev/null @@ -1,64 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var pt = moment.defineLocale('pt', { - months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), - monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), - weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'), - weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), - weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY HH:mm', - LLLL : 'dddd, D [de] MMMM [de] YYYY HH:mm' - }, - calendar : { - sameDay: '[Hoje às] LT', - nextDay: '[Amanhã às] LT', - nextWeek: 'dddd [às] LT', - lastDay: '[Ontem às] LT', - lastWeek: function () { - return (this.day() === 0 || this.day() === 6) ? - '[Último] dddd [às] LT' : // Saturday + Sunday - '[Última] dddd [às] LT'; // Monday - Friday - }, - sameElse: 'L' - }, - relativeTime : { - future : 'em %s', - past : 'há %s', - s : 'segundos', - ss : '%d segundos', - m : 'um minuto', - mm : '%d minutos', - h : 'uma hora', - hh : '%d horas', - d : 'um dia', - dd : '%d dias', - M : 'um mês', - MM : '%d meses', - y : 'um ano', - yy : '%d anos' - }, - dayOfMonthOrdinalParse: /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return pt; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ro.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ro.js deleted file mode 100755 index 47ec3d60..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ro.js +++ /dev/null @@ -1,74 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'ss': 'secunde', - 'mm': 'minute', - 'hh': 'ore', - 'dd': 'zile', - 'MM': 'luni', - 'yy': 'ani' - }, - separator = ' '; - if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { - separator = ' de '; - } - return number + separator + format[key]; - } - - var ro = moment.defineLocale('ro', { - months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), - monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), - monthsParseExact: true, - weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'), - weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), - weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY H:mm', - LLLL : 'dddd, D MMMM YYYY H:mm' - }, - calendar : { - sameDay: '[azi la] LT', - nextDay: '[mâine la] LT', - nextWeek: 'dddd [la] LT', - lastDay: '[ieri la] LT', - lastWeek: '[fosta] dddd [la] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'peste %s', - past : '%s în urmă', - s : 'câteva secunde', - ss : relativeTimeWithPlural, - m : 'un minut', - mm : relativeTimeWithPlural, - h : 'o oră', - hh : relativeTimeWithPlural, - d : 'o zi', - dd : relativeTimeWithPlural, - M : 'o lună', - MM : relativeTimeWithPlural, - y : 'un an', - yy : relativeTimeWithPlural - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return ro; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ru.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ru.js deleted file mode 100755 index 7afb7b5d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ru.js +++ /dev/null @@ -1,181 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - function plural(word, num) { - var forms = word.split('_'); - return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); - } - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'ss': withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд', - 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', - 'hh': 'час_часа_часов', - 'dd': 'день_дня_дней', - 'MM': 'месяц_месяца_месяцев', - 'yy': 'год_года_лет' - }; - if (key === 'm') { - return withoutSuffix ? 'минута' : 'минуту'; - } - else { - return number + ' ' + plural(format[key], +number); - } - } - var monthsParse = [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[йя]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i]; - - // http://new.gramota.ru/spravka/rules/139-prop : § 103 - // Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637 - // CLDR data: http://www.unicode.org/cldr/charts/28/summary/ru.html#1753 - var ru = moment.defineLocale('ru', { - months : { - format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_'), - standalone: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_') - }, - monthsShort : { - // по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку ? - format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_'), - standalone: 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_') - }, - weekdays : { - standalone: 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'), - format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_'), - isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/ - }, - weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), - weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), - monthsParse : monthsParse, - longMonthsParse : monthsParse, - shortMonthsParse : monthsParse, - - // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки - monthsRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i, - - // копия предыдущего - monthsShortRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i, - - // полные названия с падежами - monthsStrictRegex: /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i, - - // Выражение, которое соотвествует только сокращённым формам - monthsShortStrictRegex: /^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY г.', - LLL : 'D MMMM YYYY г., H:mm', - LLLL : 'dddd, D MMMM YYYY г., H:mm' - }, - calendar : { - sameDay: '[Сегодня, в] LT', - nextDay: '[Завтра, в] LT', - lastDay: '[Вчера, в] LT', - nextWeek: function (now) { - if (now.week() !== this.week()) { - switch (this.day()) { - case 0: - return '[В следующее] dddd, [в] LT'; - case 1: - case 2: - case 4: - return '[В следующий] dddd, [в] LT'; - case 3: - case 5: - case 6: - return '[В следующую] dddd, [в] LT'; - } - } else { - if (this.day() === 2) { - return '[Во] dddd, [в] LT'; - } else { - return '[В] dddd, [в] LT'; - } - } - }, - lastWeek: function (now) { - if (now.week() !== this.week()) { - switch (this.day()) { - case 0: - return '[В прошлое] dddd, [в] LT'; - case 1: - case 2: - case 4: - return '[В прошлый] dddd, [в] LT'; - case 3: - case 5: - case 6: - return '[В прошлую] dddd, [в] LT'; - } - } else { - if (this.day() === 2) { - return '[Во] dddd, [в] LT'; - } else { - return '[В] dddd, [в] LT'; - } - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'через %s', - past : '%s назад', - s : 'несколько секунд', - ss : relativeTimeWithPlural, - m : relativeTimeWithPlural, - mm : relativeTimeWithPlural, - h : 'час', - hh : relativeTimeWithPlural, - d : 'день', - dd : relativeTimeWithPlural, - M : 'месяц', - MM : relativeTimeWithPlural, - y : 'год', - yy : relativeTimeWithPlural - }, - meridiemParse: /ночи|утра|дня|вечера/i, - isPM : function (input) { - return /^(дня|вечера)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ночи'; - } else if (hour < 12) { - return 'утра'; - } else if (hour < 17) { - return 'дня'; - } else { - return 'вечера'; - } - }, - dayOfMonthOrdinalParse: /\d{1,2}-(й|го|я)/, - ordinal: function (number, period) { - switch (period) { - case 'M': - case 'd': - case 'DDD': - return number + '-й'; - case 'D': - return number + '-го'; - case 'w': - case 'W': - return number + '-я'; - default: - return number; - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return ru; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sd.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sd.js deleted file mode 100755 index 12992382..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sd.js +++ /dev/null @@ -1,97 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var months = [ - 'جنوري', - 'فيبروري', - 'مارچ', - 'اپريل', - 'مئي', - 'جون', - 'جولاءِ', - 'آگسٽ', - 'سيپٽمبر', - 'آڪٽوبر', - 'نومبر', - 'ڊسمبر' - ]; - var days = [ - 'آچر', - 'سومر', - 'اڱارو', - 'اربع', - 'خميس', - 'جمع', - 'ڇنڇر' - ]; - - var sd = moment.defineLocale('sd', { - months : months, - monthsShort : months, - weekdays : days, - weekdaysShort : days, - weekdaysMin : days, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd، D MMMM YYYY HH:mm' - }, - meridiemParse: /صبح|شام/, - isPM : function (input) { - return 'شام' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'صبح'; - } - return 'شام'; - }, - calendar : { - sameDay : '[اڄ] LT', - nextDay : '[سڀاڻي] LT', - nextWeek : 'dddd [اڳين هفتي تي] LT', - lastDay : '[ڪالهه] LT', - lastWeek : '[گزريل هفتي] dddd [تي] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s پوء', - past : '%s اڳ', - s : 'چند سيڪنڊ', - ss : '%d سيڪنڊ', - m : 'هڪ منٽ', - mm : '%d منٽ', - h : 'هڪ ڪلاڪ', - hh : '%d ڪلاڪ', - d : 'هڪ ڏينهن', - dd : '%d ڏينهن', - M : 'هڪ مهينو', - MM : '%d مهينا', - y : 'هڪ سال', - yy : '%d سال' - }, - preparse: function (string) { - return string.replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/,/g, '،'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return sd; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/se.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/se.js deleted file mode 100755 index 4b046780..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/se.js +++ /dev/null @@ -1,59 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var se = moment.defineLocale('se', { - months : 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split('_'), - monthsShort : 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'), - weekdays : 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split('_'), - weekdaysShort : 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'), - weekdaysMin : 's_v_m_g_d_b_L'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'MMMM D. [b.] YYYY', - LLL : 'MMMM D. [b.] YYYY [ti.] HH:mm', - LLLL : 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm' - }, - calendar : { - sameDay: '[otne ti] LT', - nextDay: '[ihttin ti] LT', - nextWeek: 'dddd [ti] LT', - lastDay: '[ikte ti] LT', - lastWeek: '[ovddit] dddd [ti] LT', - sameElse: 'L' - }, - relativeTime : { - future : '%s geažes', - past : 'maŋit %s', - s : 'moadde sekunddat', - ss: '%d sekunddat', - m : 'okta minuhta', - mm : '%d minuhtat', - h : 'okta diimmu', - hh : '%d diimmut', - d : 'okta beaivi', - dd : '%d beaivvit', - M : 'okta mánnu', - MM : '%d mánut', - y : 'okta jahki', - yy : '%d jagit' - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return se; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/si.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/si.js deleted file mode 100755 index 52dc6080..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/si.js +++ /dev/null @@ -1,70 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - /*jshint -W100*/ - var si = moment.defineLocale('si', { - months : 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split('_'), - monthsShort : 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split('_'), - weekdays : 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'), - weekdaysShort : 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'), - weekdaysMin : 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'a h:mm', - LTS : 'a h:mm:ss', - L : 'YYYY/MM/DD', - LL : 'YYYY MMMM D', - LLL : 'YYYY MMMM D, a h:mm', - LLLL : 'YYYY MMMM D [වැනි] dddd, a h:mm:ss' - }, - calendar : { - sameDay : '[අද] LT[ට]', - nextDay : '[හෙට] LT[ට]', - nextWeek : 'dddd LT[ට]', - lastDay : '[ඊයේ] LT[ට]', - lastWeek : '[පසුගිය] dddd LT[ට]', - sameElse : 'L' - }, - relativeTime : { - future : '%sකින්', - past : '%sකට පෙර', - s : 'තත්පර කිහිපය', - ss : 'තත්පර %d', - m : 'මිනිත්තුව', - mm : 'මිනිත්තු %d', - h : 'පැය', - hh : 'පැය %d', - d : 'දිනය', - dd : 'දින %d', - M : 'මාසය', - MM : 'මාස %d', - y : 'වසර', - yy : 'වසර %d' - }, - dayOfMonthOrdinalParse: /\d{1,2} වැනි/, - ordinal : function (number) { - return number + ' වැනි'; - }, - meridiemParse : /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./, - isPM : function (input) { - return input === 'ප.ව.' || input === 'පස් වරු'; - }, - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'ප.ව.' : 'පස් වරු'; - } else { - return isLower ? 'පෙ.ව.' : 'පෙර වරු'; - } - } - }); - - return si; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sk.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sk.js deleted file mode 100755 index 6938f95e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sk.js +++ /dev/null @@ -1,155 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'), - monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); - function plural(n) { - return (n > 1) && (n < 5); - } - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': // a few seconds / in a few seconds / a few seconds ago - return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; - case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'sekundy' : 'sekúnd'); - } else { - return result + 'sekundami'; - } - break; - case 'm': // a minute / in a minute / a minute ago - return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); - case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'minúty' : 'minút'); - } else { - return result + 'minútami'; - } - break; - case 'h': // an hour / in an hour / an hour ago - return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); - case 'hh': // 9 hours / in 9 hours / 9 hours ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'hodiny' : 'hodín'); - } else { - return result + 'hodinami'; - } - break; - case 'd': // a day / in a day / a day ago - return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; - case 'dd': // 9 days / in 9 days / 9 days ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'dni' : 'dní'); - } else { - return result + 'dňami'; - } - break; - case 'M': // a month / in a month / a month ago - return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; - case 'MM': // 9 months / in 9 months / 9 months ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'mesiace' : 'mesiacov'); - } else { - return result + 'mesiacmi'; - } - break; - case 'y': // a year / in a year / a year ago - return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; - case 'yy': // 9 years / in 9 years / 9 years ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'roky' : 'rokov'); - } else { - return result + 'rokmi'; - } - break; - } - } - - var sk = moment.defineLocale('sk', { - months : months, - monthsShort : monthsShort, - weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'), - weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'), - weekdaysMin : 'ne_po_ut_st_št_pi_so'.split('_'), - longDateFormat : { - LT: 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd D. MMMM YYYY H:mm' - }, - calendar : { - sameDay: '[dnes o] LT', - nextDay: '[zajtra o] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[v nedeľu o] LT'; - case 1: - case 2: - return '[v] dddd [o] LT'; - case 3: - return '[v stredu o] LT'; - case 4: - return '[vo štvrtok o] LT'; - case 5: - return '[v piatok o] LT'; - case 6: - return '[v sobotu o] LT'; - } - }, - lastDay: '[včera o] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[minulú nedeľu o] LT'; - case 1: - case 2: - return '[minulý] dddd [o] LT'; - case 3: - return '[minulú stredu o] LT'; - case 4: - case 5: - return '[minulý] dddd [o] LT'; - case 6: - return '[minulú sobotu o] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'za %s', - past : 'pred %s', - s : translate, - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return sk; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sl.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sl.js deleted file mode 100755 index 8dec7813..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sl.js +++ /dev/null @@ -1,172 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': - return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami'; - case 'ss': - if (number === 1) { - result += withoutSuffix ? 'sekundo' : 'sekundi'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'sekundi' : 'sekundah'; - } else if (number < 5) { - result += withoutSuffix || isFuture ? 'sekunde' : 'sekundah'; - } else { - result += withoutSuffix || isFuture ? 'sekund' : 'sekund'; - } - return result; - case 'm': - return withoutSuffix ? 'ena minuta' : 'eno minuto'; - case 'mm': - if (number === 1) { - result += withoutSuffix ? 'minuta' : 'minuto'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'minuti' : 'minutama'; - } else if (number < 5) { - result += withoutSuffix || isFuture ? 'minute' : 'minutami'; - } else { - result += withoutSuffix || isFuture ? 'minut' : 'minutami'; - } - return result; - case 'h': - return withoutSuffix ? 'ena ura' : 'eno uro'; - case 'hh': - if (number === 1) { - result += withoutSuffix ? 'ura' : 'uro'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'uri' : 'urama'; - } else if (number < 5) { - result += withoutSuffix || isFuture ? 'ure' : 'urami'; - } else { - result += withoutSuffix || isFuture ? 'ur' : 'urami'; - } - return result; - case 'd': - return withoutSuffix || isFuture ? 'en dan' : 'enim dnem'; - case 'dd': - if (number === 1) { - result += withoutSuffix || isFuture ? 'dan' : 'dnem'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'dni' : 'dnevoma'; - } else { - result += withoutSuffix || isFuture ? 'dni' : 'dnevi'; - } - return result; - case 'M': - return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem'; - case 'MM': - if (number === 1) { - result += withoutSuffix || isFuture ? 'mesec' : 'mesecem'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'meseca' : 'mesecema'; - } else if (number < 5) { - result += withoutSuffix || isFuture ? 'mesece' : 'meseci'; - } else { - result += withoutSuffix || isFuture ? 'mesecev' : 'meseci'; - } - return result; - case 'y': - return withoutSuffix || isFuture ? 'eno leto' : 'enim letom'; - case 'yy': - if (number === 1) { - result += withoutSuffix || isFuture ? 'leto' : 'letom'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'leti' : 'letoma'; - } else if (number < 5) { - result += withoutSuffix || isFuture ? 'leta' : 'leti'; - } else { - result += withoutSuffix || isFuture ? 'let' : 'leti'; - } - return result; - } - } - - var sl = moment.defineLocale('sl', { - months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), - monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), - monthsParseExact: true, - weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'), - weekdaysShort : 'ned._pon._tor._sre._čet._pet._sob.'.split('_'), - weekdaysMin : 'ne_po_to_sr_če_pe_so'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd, D. MMMM YYYY H:mm' - }, - calendar : { - sameDay : '[danes ob] LT', - nextDay : '[jutri ob] LT', - - nextWeek : function () { - switch (this.day()) { - case 0: - return '[v] [nedeljo] [ob] LT'; - case 3: - return '[v] [sredo] [ob] LT'; - case 6: - return '[v] [soboto] [ob] LT'; - case 1: - case 2: - case 4: - case 5: - return '[v] dddd [ob] LT'; - } - }, - lastDay : '[včeraj ob] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - return '[prejšnjo] [nedeljo] [ob] LT'; - case 3: - return '[prejšnjo] [sredo] [ob] LT'; - case 6: - return '[prejšnjo] [soboto] [ob] LT'; - case 1: - case 2: - case 4: - case 5: - return '[prejšnji] dddd [ob] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'čez %s', - past : 'pred %s', - s : processRelativeTime, - ss : processRelativeTime, - m : processRelativeTime, - mm : processRelativeTime, - h : processRelativeTime, - hh : processRelativeTime, - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return sl; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sq.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sq.js deleted file mode 100755 index eb081df0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sq.js +++ /dev/null @@ -1,67 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var sq = moment.defineLocale('sq', { - months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), - monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), - weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), - weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), - weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), - weekdaysParseExact : true, - meridiemParse: /PD|MD/, - isPM: function (input) { - return input.charAt(0) === 'M'; - }, - meridiem : function (hours, minutes, isLower) { - return hours < 12 ? 'PD' : 'MD'; - }, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Sot në] LT', - nextDay : '[Nesër në] LT', - nextWeek : 'dddd [në] LT', - lastDay : '[Dje në] LT', - lastWeek : 'dddd [e kaluar në] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'në %s', - past : '%s më parë', - s : 'disa sekonda', - ss : '%d sekonda', - m : 'një minutë', - mm : '%d minuta', - h : 'një orë', - hh : '%d orë', - d : 'një ditë', - dd : '%d ditë', - M : 'një muaj', - MM : '%d muaj', - y : 'një vit', - yy : '%d vite' - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return sq; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sr-cyrl.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sr-cyrl.js deleted file mode 100755 index ccd92b95..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sr-cyrl.js +++ /dev/null @@ -1,110 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var translator = { - words: { //Different grammatical cases - ss: ['секунда', 'секунде', 'секунди'], - m: ['један минут', 'једне минуте'], - mm: ['минут', 'минуте', 'минута'], - h: ['један сат', 'једног сата'], - hh: ['сат', 'сата', 'сати'], - dd: ['дан', 'дана', 'дана'], - MM: ['месец', 'месеца', 'месеци'], - yy: ['година', 'године', 'година'] - }, - correctGrammaticalCase: function (number, wordKey) { - return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); - }, - translate: function (number, withoutSuffix, key) { - var wordKey = translator.words[key]; - if (key.length === 1) { - return withoutSuffix ? wordKey[0] : wordKey[1]; - } else { - return number + ' ' + translator.correctGrammaticalCase(number, wordKey); - } - } - }; - - var srCyrl = moment.defineLocale('sr-cyrl', { - months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split('_'), - monthsShort: 'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'), - monthsParseExact: true, - weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'), - weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'), - weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'), - weekdaysParseExact : true, - longDateFormat: { - LT: 'H:mm', - LTS : 'H:mm:ss', - L: 'DD.MM.YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY H:mm', - LLLL: 'dddd, D. MMMM YYYY H:mm' - }, - calendar: { - sameDay: '[данас у] LT', - nextDay: '[сутра у] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[у] [недељу] [у] LT'; - case 3: - return '[у] [среду] [у] LT'; - case 6: - return '[у] [суботу] [у] LT'; - case 1: - case 2: - case 4: - case 5: - return '[у] dddd [у] LT'; - } - }, - lastDay : '[јуче у] LT', - lastWeek : function () { - var lastWeekDays = [ - '[прошле] [недеље] [у] LT', - '[прошлог] [понедељка] [у] LT', - '[прошлог] [уторка] [у] LT', - '[прошле] [среде] [у] LT', - '[прошлог] [четвртка] [у] LT', - '[прошлог] [петка] [у] LT', - '[прошле] [суботе] [у] LT' - ]; - return lastWeekDays[this.day()]; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'за %s', - past : 'пре %s', - s : 'неколико секунди', - ss : translator.translate, - m : translator.translate, - mm : translator.translate, - h : translator.translate, - hh : translator.translate, - d : 'дан', - dd : translator.translate, - M : 'месец', - MM : translator.translate, - y : 'годину', - yy : translator.translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return srCyrl; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sr.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sr.js deleted file mode 100755 index 9e1f4a3a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sr.js +++ /dev/null @@ -1,110 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var translator = { - words: { //Different grammatical cases - ss: ['sekunda', 'sekunde', 'sekundi'], - m: ['jedan minut', 'jedne minute'], - mm: ['minut', 'minute', 'minuta'], - h: ['jedan sat', 'jednog sata'], - hh: ['sat', 'sata', 'sati'], - dd: ['dan', 'dana', 'dana'], - MM: ['mesec', 'meseca', 'meseci'], - yy: ['godina', 'godine', 'godina'] - }, - correctGrammaticalCase: function (number, wordKey) { - return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); - }, - translate: function (number, withoutSuffix, key) { - var wordKey = translator.words[key]; - if (key.length === 1) { - return withoutSuffix ? wordKey[0] : wordKey[1]; - } else { - return number + ' ' + translator.correctGrammaticalCase(number, wordKey); - } - } - }; - - var sr = moment.defineLocale('sr', { - months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'), - monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'), - monthsParseExact: true, - weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split('_'), - weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'), - weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'), - weekdaysParseExact : true, - longDateFormat: { - LT: 'H:mm', - LTS : 'H:mm:ss', - L: 'DD.MM.YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY H:mm', - LLLL: 'dddd, D. MMMM YYYY H:mm' - }, - calendar: { - sameDay: '[danas u] LT', - nextDay: '[sutra u] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[u] [nedelju] [u] LT'; - case 3: - return '[u] [sredu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[juče u] LT', - lastWeek : function () { - var lastWeekDays = [ - '[prošle] [nedelje] [u] LT', - '[prošlog] [ponedeljka] [u] LT', - '[prošlog] [utorka] [u] LT', - '[prošle] [srede] [u] LT', - '[prošlog] [četvrtka] [u] LT', - '[prošlog] [petka] [u] LT', - '[prošle] [subote] [u] LT' - ]; - return lastWeekDays[this.day()]; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'za %s', - past : 'pre %s', - s : 'nekoliko sekundi', - ss : translator.translate, - m : translator.translate, - mm : translator.translate, - h : translator.translate, - hh : translator.translate, - d : 'dan', - dd : translator.translate, - M : 'mesec', - MM : translator.translate, - y : 'godinu', - yy : translator.translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return sr; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ss.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ss.js deleted file mode 100755 index a401149c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ss.js +++ /dev/null @@ -1,87 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var ss = moment.defineLocale('ss', { - months : "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split('_'), - monthsShort : 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'), - weekdays : 'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split('_'), - weekdaysShort : 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'), - weekdaysMin : 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' - }, - calendar : { - sameDay : '[Namuhla nga] LT', - nextDay : '[Kusasa nga] LT', - nextWeek : 'dddd [nga] LT', - lastDay : '[Itolo nga] LT', - lastWeek : 'dddd [leliphelile] [nga] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'nga %s', - past : 'wenteka nga %s', - s : 'emizuzwana lomcane', - ss : '%d mzuzwana', - m : 'umzuzu', - mm : '%d emizuzu', - h : 'lihora', - hh : '%d emahora', - d : 'lilanga', - dd : '%d emalanga', - M : 'inyanga', - MM : '%d tinyanga', - y : 'umnyaka', - yy : '%d iminyaka' - }, - meridiemParse: /ekuseni|emini|entsambama|ebusuku/, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'ekuseni'; - } else if (hours < 15) { - return 'emini'; - } else if (hours < 19) { - return 'entsambama'; - } else { - return 'ebusuku'; - } - }, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'ekuseni') { - return hour; - } else if (meridiem === 'emini') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') { - if (hour === 0) { - return 0; - } - return hour + 12; - } - }, - dayOfMonthOrdinalParse: /\d{1,2}/, - ordinal : '%d', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return ss; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sv.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sv.js deleted file mode 100755 index 494fedba..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sv.js +++ /dev/null @@ -1,68 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var sv = moment.defineLocale('sv', { - months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), - monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), - weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), - weekdaysShort : 'sön_mån_tis_ons_tor_fre_lör'.split('_'), - weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [kl.] HH:mm', - LLLL : 'dddd D MMMM YYYY [kl.] HH:mm', - lll : 'D MMM YYYY HH:mm', - llll : 'ddd D MMM YYYY HH:mm' - }, - calendar : { - sameDay: '[Idag] LT', - nextDay: '[Imorgon] LT', - lastDay: '[Igår] LT', - nextWeek: '[På] dddd LT', - lastWeek: '[I] dddd[s] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'om %s', - past : 'för %s sedan', - s : 'några sekunder', - ss : '%d sekunder', - m : 'en minut', - mm : '%d minuter', - h : 'en timme', - hh : '%d timmar', - d : 'en dag', - dd : '%d dagar', - M : 'en månad', - MM : '%d månader', - y : 'ett år', - yy : '%d år' - }, - dayOfMonthOrdinalParse: /\d{1,2}(e|a)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'e' : - (b === 1) ? 'a' : - (b === 2) ? 'a' : - (b === 3) ? 'e' : 'e'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return sv; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sw.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sw.js deleted file mode 100755 index 1f564e09..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/sw.js +++ /dev/null @@ -1,58 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var sw = moment.defineLocale('sw', { - months : 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split('_'), - monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'), - weekdays : 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split('_'), - weekdaysShort : 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'), - weekdaysMin : 'J2_J3_J4_J5_Al_Ij_J1'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[leo saa] LT', - nextDay : '[kesho saa] LT', - nextWeek : '[wiki ijayo] dddd [saat] LT', - lastDay : '[jana] LT', - lastWeek : '[wiki iliyopita] dddd [saat] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s baadaye', - past : 'tokea %s', - s : 'hivi punde', - ss : 'sekunde %d', - m : 'dakika moja', - mm : 'dakika %d', - h : 'saa limoja', - hh : 'masaa %d', - d : 'siku moja', - dd : 'masiku %d', - M : 'mwezi mmoja', - MM : 'miezi %d', - y : 'mwaka mmoja', - yy : 'miaka %d' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return sw; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ta.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ta.js deleted file mode 100755 index 92142c92..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ta.js +++ /dev/null @@ -1,128 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var symbolMap = { - '1': '௧', - '2': '௨', - '3': '௩', - '4': '௪', - '5': '௫', - '6': '௬', - '7': '௭', - '8': '௮', - '9': '௯', - '0': '௦' - }, numberMap = { - '௧': '1', - '௨': '2', - '௩': '3', - '௪': '4', - '௫': '5', - '௬': '6', - '௭': '7', - '௮': '8', - '௯': '9', - '௦': '0' - }; - - var ta = moment.defineLocale('ta', { - months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), - monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), - weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'), - weekdaysShort : 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split('_'), - weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, HH:mm', - LLLL : 'dddd, D MMMM YYYY, HH:mm' - }, - calendar : { - sameDay : '[இன்று] LT', - nextDay : '[நாளை] LT', - nextWeek : 'dddd, LT', - lastDay : '[நேற்று] LT', - lastWeek : '[கடந்த வாரம்] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s இல்', - past : '%s முன்', - s : 'ஒரு சில விநாடிகள்', - ss : '%d விநாடிகள்', - m : 'ஒரு நிமிடம்', - mm : '%d நிமிடங்கள்', - h : 'ஒரு மணி நேரம்', - hh : '%d மணி நேரம்', - d : 'ஒரு நாள்', - dd : '%d நாட்கள்', - M : 'ஒரு மாதம்', - MM : '%d மாதங்கள்', - y : 'ஒரு வருடம்', - yy : '%d ஆண்டுகள்' - }, - dayOfMonthOrdinalParse: /\d{1,2}வது/, - ordinal : function (number) { - return number + 'வது'; - }, - preparse: function (string) { - return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - // refer http://ta.wikipedia.org/s/1er1 - meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/, - meridiem : function (hour, minute, isLower) { - if (hour < 2) { - return ' யாமம்'; - } else if (hour < 6) { - return ' வைகறை'; // வைகறை - } else if (hour < 10) { - return ' காலை'; // காலை - } else if (hour < 14) { - return ' நண்பகல்'; // நண்பகல் - } else if (hour < 18) { - return ' எற்பாடு'; // எற்பாடு - } else if (hour < 22) { - return ' மாலை'; // மாலை - } else { - return ' யாமம்'; - } - }, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'யாமம்') { - return hour < 2 ? hour : hour + 12; - } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { - return hour; - } else if (meridiem === 'நண்பகல்') { - return hour >= 10 ? hour : hour + 12; - } else { - return hour + 12; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); - - return ta; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/te.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/te.js deleted file mode 100755 index fe9ec2b3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/te.js +++ /dev/null @@ -1,88 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var te = moment.defineLocale('te', { - months : 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జూలై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split('_'), - monthsShort : 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జూలై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split('_'), - monthsParseExact : true, - weekdays : 'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split('_'), - weekdaysShort : 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'), - weekdaysMin : 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'), - longDateFormat : { - LT : 'A h:mm', - LTS : 'A h:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm', - LLLL : 'dddd, D MMMM YYYY, A h:mm' - }, - calendar : { - sameDay : '[నేడు] LT', - nextDay : '[రేపు] LT', - nextWeek : 'dddd, LT', - lastDay : '[నిన్న] LT', - lastWeek : '[గత] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s లో', - past : '%s క్రితం', - s : 'కొన్ని క్షణాలు', - ss : '%d సెకన్లు', - m : 'ఒక నిమిషం', - mm : '%d నిమిషాలు', - h : 'ఒక గంట', - hh : '%d గంటలు', - d : 'ఒక రోజు', - dd : '%d రోజులు', - M : 'ఒక నెల', - MM : '%d నెలలు', - y : 'ఒక సంవత్సరం', - yy : '%d సంవత్సరాలు' - }, - dayOfMonthOrdinalParse : /\d{1,2}వ/, - ordinal : '%dవ', - meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'రాత్రి') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'ఉదయం') { - return hour; - } else if (meridiem === 'మధ్యాహ్నం') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'సాయంత్రం') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'రాత్రి'; - } else if (hour < 10) { - return 'ఉదయం'; - } else if (hour < 17) { - return 'మధ్యాహ్నం'; - } else if (hour < 20) { - return 'సాయంత్రం'; - } else { - return 'రాత్రి'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); - - return te; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tet.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tet.js deleted file mode 100755 index efa53da1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tet.js +++ /dev/null @@ -1,66 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var tet = moment.defineLocale('tet', { - months : 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru'.split('_'), - monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'), - weekdays : 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu'.split('_'), - weekdaysShort : 'Dom_Seg_Ters_Kua_Kint_Sest_Sab'.split('_'), - weekdaysMin : 'Do_Seg_Te_Ku_Ki_Ses_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[Ohin iha] LT', - nextDay: '[Aban iha] LT', - nextWeek: 'dddd [iha] LT', - lastDay: '[Horiseik iha] LT', - lastWeek: 'dddd [semana kotuk] [iha] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'iha %s', - past : '%s liuba', - s : 'minutu balun', - ss : 'minutu %d', - m : 'minutu ida', - mm : 'minutu %d', - h : 'oras ida', - hh : 'oras %d', - d : 'loron ida', - dd : 'loron %d', - M : 'fulan ida', - MM : 'fulan %d', - y : 'tinan ida', - yy : 'tinan %d' - }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return tet; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tg.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tg.js deleted file mode 100755 index c2833680..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tg.js +++ /dev/null @@ -1,115 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var suffixes = { - 0: '-ум', - 1: '-ум', - 2: '-юм', - 3: '-юм', - 4: '-ум', - 5: '-ум', - 6: '-ум', - 7: '-ум', - 8: '-ум', - 9: '-ум', - 10: '-ум', - 12: '-ум', - 13: '-ум', - 20: '-ум', - 30: '-юм', - 40: '-ум', - 50: '-ум', - 60: '-ум', - 70: '-ум', - 80: '-ум', - 90: '-ум', - 100: '-ум' - }; - - var tg = moment.defineLocale('tg', { - months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'), - monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'), - weekdays : 'якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе'.split('_'), - weekdaysShort : 'яшб_дшб_сшб_чшб_пшб_ҷум_шнб'.split('_'), - weekdaysMin : 'яш_дш_сш_чш_пш_ҷм_шб'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Имрӯз соати] LT', - nextDay : '[Пагоҳ соати] LT', - lastDay : '[Дирӯз соати] LT', - nextWeek : 'dddd[и] [ҳафтаи оянда соати] LT', - lastWeek : 'dddd[и] [ҳафтаи гузашта соати] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'баъди %s', - past : '%s пеш', - s : 'якчанд сония', - m : 'як дақиқа', - mm : '%d дақиқа', - h : 'як соат', - hh : '%d соат', - d : 'як рӯз', - dd : '%d рӯз', - M : 'як моҳ', - MM : '%d моҳ', - y : 'як сол', - yy : '%d сол' - }, - meridiemParse: /шаб|субҳ|рӯз|бегоҳ/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'шаб') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'субҳ') { - return hour; - } else if (meridiem === 'рӯз') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'бегоҳ') { - return hour + 12; - } - }, - meridiem: function (hour, minute, isLower) { - if (hour < 4) { - return 'шаб'; - } else if (hour < 11) { - return 'субҳ'; - } else if (hour < 16) { - return 'рӯз'; - } else if (hour < 19) { - return 'бегоҳ'; - } else { - return 'шаб'; - } - }, - dayOfMonthOrdinalParse: /\d{1,2}-(ум|юм)/, - ordinal: function (number) { - var a = number % 10, - b = number >= 100 ? 100 : null; - return number + (suffixes[number] || suffixes[a] || suffixes[b]); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1th is the first week of the year. - } - }); - - return tg; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/th.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/th.js deleted file mode 100755 index 87489a4e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/th.js +++ /dev/null @@ -1,66 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var th = moment.defineLocale('th', { - months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'), - monthsShort : 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split('_'), - monthsParseExact: true, - weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'), - weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference - weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY เวลา H:mm', - LLLL : 'วันddddที่ D MMMM YYYY เวลา H:mm' - }, - meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/, - isPM: function (input) { - return input === 'หลังเที่ยง'; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ก่อนเที่ยง'; - } else { - return 'หลังเที่ยง'; - } - }, - calendar : { - sameDay : '[วันนี้ เวลา] LT', - nextDay : '[พรุ่งนี้ เวลา] LT', - nextWeek : 'dddd[หน้า เวลา] LT', - lastDay : '[เมื่อวานนี้ เวลา] LT', - lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'อีก %s', - past : '%sที่แล้ว', - s : 'ไม่กี่วินาที', - ss : '%d วินาที', - m : '1 นาที', - mm : '%d นาที', - h : '1 ชั่วโมง', - hh : '%d ชั่วโมง', - d : '1 วัน', - dd : '%d วัน', - M : '1 เดือน', - MM : '%d เดือน', - y : '1 ปี', - yy : '%d ปี' - } - }); - - return th; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tl-ph.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tl-ph.js deleted file mode 100755 index 3f7e45ee..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tl-ph.js +++ /dev/null @@ -1,61 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var tlPh = moment.defineLocale('tl-ph', { - months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), - monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), - weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), - weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), - weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'MM/D/YYYY', - LL : 'MMMM D, YYYY', - LLL : 'MMMM D, YYYY HH:mm', - LLLL : 'dddd, MMMM DD, YYYY HH:mm' - }, - calendar : { - sameDay: 'LT [ngayong araw]', - nextDay: '[Bukas ng] LT', - nextWeek: 'LT [sa susunod na] dddd', - lastDay: 'LT [kahapon]', - lastWeek: 'LT [noong nakaraang] dddd', - sameElse: 'L' - }, - relativeTime : { - future : 'sa loob ng %s', - past : '%s ang nakalipas', - s : 'ilang segundo', - ss : '%d segundo', - m : 'isang minuto', - mm : '%d minuto', - h : 'isang oras', - hh : '%d oras', - d : 'isang araw', - dd : '%d araw', - M : 'isang buwan', - MM : '%d buwan', - y : 'isang taon', - yy : '%d taon' - }, - dayOfMonthOrdinalParse: /\d{1,2}/, - ordinal : function (number) { - return number; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return tlPh; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tlh.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tlh.js deleted file mode 100755 index 7ea953b8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tlh.js +++ /dev/null @@ -1,121 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_'); - - function translateFuture(output) { - var time = output; - time = (output.indexOf('jaj') !== -1) ? - time.slice(0, -3) + 'leS' : - (output.indexOf('jar') !== -1) ? - time.slice(0, -3) + 'waQ' : - (output.indexOf('DIS') !== -1) ? - time.slice(0, -3) + 'nem' : - time + ' pIq'; - return time; - } - - function translatePast(output) { - var time = output; - time = (output.indexOf('jaj') !== -1) ? - time.slice(0, -3) + 'Hu’' : - (output.indexOf('jar') !== -1) ? - time.slice(0, -3) + 'wen' : - (output.indexOf('DIS') !== -1) ? - time.slice(0, -3) + 'ben' : - time + ' ret'; - return time; - } - - function translate(number, withoutSuffix, string, isFuture) { - var numberNoun = numberAsNoun(number); - switch (string) { - case 'ss': - return numberNoun + ' lup'; - case 'mm': - return numberNoun + ' tup'; - case 'hh': - return numberNoun + ' rep'; - case 'dd': - return numberNoun + ' jaj'; - case 'MM': - return numberNoun + ' jar'; - case 'yy': - return numberNoun + ' DIS'; - } - } - - function numberAsNoun(number) { - var hundred = Math.floor((number % 1000) / 100), - ten = Math.floor((number % 100) / 10), - one = number % 10, - word = ''; - if (hundred > 0) { - word += numbersNouns[hundred] + 'vatlh'; - } - if (ten > 0) { - word += ((word !== '') ? ' ' : '') + numbersNouns[ten] + 'maH'; - } - if (one > 0) { - word += ((word !== '') ? ' ' : '') + numbersNouns[one]; - } - return (word === '') ? 'pagh' : word; - } - - var tlh = moment.defineLocale('tlh', { - months : 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split('_'), - monthsShort : 'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split('_'), - monthsParseExact : true, - weekdays : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), - weekdaysShort : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), - weekdaysMin : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[DaHjaj] LT', - nextDay: '[wa’leS] LT', - nextWeek: 'LLL', - lastDay: '[wa’Hu’] LT', - lastWeek: 'LLL', - sameElse: 'L' - }, - relativeTime : { - future : translateFuture, - past : translatePast, - s : 'puS lup', - ss : translate, - m : 'wa’ tup', - mm : translate, - h : 'wa’ rep', - hh : translate, - d : 'wa’ jaj', - dd : translate, - M : 'wa’ jar', - MM : translate, - y : 'wa’ DIS', - yy : translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return tlh; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tr.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tr.js deleted file mode 100755 index 2e1dd730..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tr.js +++ /dev/null @@ -1,93 +0,0 @@ - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - var suffixes = { - 1: '\'inci', - 5: '\'inci', - 8: '\'inci', - 70: '\'inci', - 80: '\'inci', - 2: '\'nci', - 7: '\'nci', - 20: '\'nci', - 50: '\'nci', - 3: '\'üncü', - 4: '\'üncü', - 100: '\'üncü', - 6: '\'ncı', - 9: '\'uncu', - 10: '\'uncu', - 30: '\'uncu', - 60: '\'ıncı', - 90: '\'ıncı' - }; - - var tr = moment.defineLocale('tr', { - months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'), - monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'), - weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'), - weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), - weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[bugün saat] LT', - nextDay : '[yarın saat] LT', - nextWeek : '[gelecek] dddd [saat] LT', - lastDay : '[dün] LT', - lastWeek : '[geçen] dddd [saat] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s sonra', - past : '%s önce', - s : 'birkaç saniye', - ss : '%d saniye', - m : 'bir dakika', - mm : '%d dakika', - h : 'bir saat', - hh : '%d saat', - d : 'bir gün', - dd : '%d gün', - M : 'bir ay', - MM : '%d ay', - y : 'bir yıl', - yy : '%d yıl' - }, - ordinal: function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'Do': - case 'DD': - return number; - default: - if (number === 0) { // special case for zero - return number + '\'ıncı'; - } - var a = number % 10, - b = number % 100 - a, - c = number >= 100 ? 100 : null; - return number + (suffixes[a] || suffixes[b] || suffixes[c]); - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return tr; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzl.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzl.js deleted file mode 100755 index d32601bc..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzl.js +++ /dev/null @@ -1,90 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - // After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals. - // This is currently too difficult (maybe even impossible) to add. - var tzl = moment.defineLocale('tzl', { - months : 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split('_'), - monthsShort : 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'), - weekdays : 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'), - weekdaysShort : 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'), - weekdaysMin : 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM [dallas] YYYY', - LLL : 'D. MMMM [dallas] YYYY HH.mm', - LLLL : 'dddd, [li] D. MMMM [dallas] YYYY HH.mm' - }, - meridiemParse: /d\'o|d\'a/i, - isPM : function (input) { - return 'd\'o' === input.toLowerCase(); - }, - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'd\'o' : 'D\'O'; - } else { - return isLower ? 'd\'a' : 'D\'A'; - } - }, - calendar : { - sameDay : '[oxhi à] LT', - nextDay : '[demà à] LT', - nextWeek : 'dddd [à] LT', - lastDay : '[ieiri à] LT', - lastWeek : '[sür el] dddd [lasteu à] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'osprei %s', - past : 'ja%s', - s : processRelativeTime, - ss : processRelativeTime, - m : processRelativeTime, - mm : processRelativeTime, - h : processRelativeTime, - hh : processRelativeTime, - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 's': ['viensas secunds', '\'iensas secunds'], - 'ss': [number + ' secunds', '' + number + ' secunds'], - 'm': ['\'n míut', '\'iens míut'], - 'mm': [number + ' míuts', '' + number + ' míuts'], - 'h': ['\'n þora', '\'iensa þora'], - 'hh': [number + ' þoras', '' + number + ' þoras'], - 'd': ['\'n ziua', '\'iensa ziua'], - 'dd': [number + ' ziuas', '' + number + ' ziuas'], - 'M': ['\'n mes', '\'iens mes'], - 'MM': [number + ' mesen', '' + number + ' mesen'], - 'y': ['\'n ar', '\'iens ar'], - 'yy': [number + ' ars', '' + number + ' ars'] - }; - return isFuture ? format[key][0] : (withoutSuffix ? format[key][0] : format[key][1]); - } - - return tzl; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzm-latn.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzm-latn.js deleted file mode 100755 index 2f6a6f19..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzm-latn.js +++ /dev/null @@ -1,57 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var tzmLatn = moment.defineLocale('tzm-latn', { - months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), - monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), - weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), - weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), - weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[asdkh g] LT', - nextDay: '[aska g] LT', - nextWeek: 'dddd [g] LT', - lastDay: '[assant g] LT', - lastWeek: 'dddd [g] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'dadkh s yan %s', - past : 'yan %s', - s : 'imik', - ss : '%d imik', - m : 'minuḍ', - mm : '%d minuḍ', - h : 'saɛa', - hh : '%d tassaɛin', - d : 'ass', - dd : '%d ossan', - M : 'ayowr', - MM : '%d iyyirn', - y : 'asgas', - yy : '%d isgasn' - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); - - return tzmLatn; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzm.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzm.js deleted file mode 100755 index 1badf81b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/tzm.js +++ /dev/null @@ -1,57 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var tzm = moment.defineLocale('tzm', { - months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), - monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), - weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), - weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), - weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS: 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[ⴰⵙⴷⵅ ⴴ] LT', - nextDay: '[ⴰⵙⴽⴰ ⴴ] LT', - nextWeek: 'dddd [ⴴ] LT', - lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT', - lastWeek: 'dddd [ⴴ] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s', - past : 'ⵢⴰⵏ %s', - s : 'ⵉⵎⵉⴽ', - ss : '%d ⵉⵎⵉⴽ', - m : 'ⵎⵉⵏⵓⴺ', - mm : '%d ⵎⵉⵏⵓⴺ', - h : 'ⵙⴰⵄⴰ', - hh : '%d ⵜⴰⵙⵙⴰⵄⵉⵏ', - d : 'ⴰⵙⵙ', - dd : '%d oⵙⵙⴰⵏ', - M : 'ⴰⵢoⵓⵔ', - MM : '%d ⵉⵢⵢⵉⵔⵏ', - y : 'ⴰⵙⴳⴰⵙ', - yy : '%d ⵉⵙⴳⴰⵙⵏ' - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); - - return tzm; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ug-cn.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ug-cn.js deleted file mode 100755 index d6c9d654..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ug-cn.js +++ /dev/null @@ -1,118 +0,0 @@ -//! moment.js language configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var ugCn = moment.defineLocale('ug-cn', { - months: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split( - '_' - ), - monthsShort: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split( - '_' - ), - weekdays: 'يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە'.split( - '_' - ), - weekdaysShort: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'), - weekdaysMin: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'), - longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'YYYY-MM-DD', - LL: 'YYYY-يىلىM-ئاينىڭD-كۈنى', - LLL: 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm', - LLLL: 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm' - }, - meridiemParse: /يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if ( - meridiem === 'يېرىم كېچە' || - meridiem === 'سەھەر' || - meridiem === 'چۈشتىن بۇرۇن' - ) { - return hour; - } else if (meridiem === 'چۈشتىن كېيىن' || meridiem === 'كەچ') { - return hour + 12; - } else { - return hour >= 11 ? hour : hour + 12; - } - }, - meridiem: function (hour, minute, isLower) { - var hm = hour * 100 + minute; - if (hm < 600) { - return 'يېرىم كېچە'; - } else if (hm < 900) { - return 'سەھەر'; - } else if (hm < 1130) { - return 'چۈشتىن بۇرۇن'; - } else if (hm < 1230) { - return 'چۈش'; - } else if (hm < 1800) { - return 'چۈشتىن كېيىن'; - } else { - return 'كەچ'; - } - }, - calendar: { - sameDay: '[بۈگۈن سائەت] LT', - nextDay: '[ئەتە سائەت] LT', - nextWeek: '[كېلەركى] dddd [سائەت] LT', - lastDay: '[تۆنۈگۈن] LT', - lastWeek: '[ئالدىنقى] dddd [سائەت] LT', - sameElse: 'L' - }, - relativeTime: { - future: '%s كېيىن', - past: '%s بۇرۇن', - s: 'نەچچە سېكونت', - ss: '%d سېكونت', - m: 'بىر مىنۇت', - mm: '%d مىنۇت', - h: 'بىر سائەت', - hh: '%d سائەت', - d: 'بىر كۈن', - dd: '%d كۈن', - M: 'بىر ئاي', - MM: '%d ئاي', - y: 'بىر يىل', - yy: '%d يىل' - }, - - dayOfMonthOrdinalParse: /\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/, - ordinal: function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'DDD': - return number + '-كۈنى'; - case 'w': - case 'W': - return number + '-ھەپتە'; - default: - return number; - } - }, - preparse: function (string) { - return string.replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/,/g, '،'); - }, - week: { - // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 - dow: 1, // Monday is the first day of the week. - doy: 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return ugCn; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uk.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uk.js deleted file mode 100755 index a8e7eddd..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uk.js +++ /dev/null @@ -1,150 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - function plural(word, num) { - var forms = word.split('_'); - return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); - } - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'ss': withoutSuffix ? 'секунда_секунди_секунд' : 'секунду_секунди_секунд', - 'mm': withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин', - 'hh': withoutSuffix ? 'година_години_годин' : 'годину_години_годин', - 'dd': 'день_дні_днів', - 'MM': 'місяць_місяці_місяців', - 'yy': 'рік_роки_років' - }; - if (key === 'm') { - return withoutSuffix ? 'хвилина' : 'хвилину'; - } - else if (key === 'h') { - return withoutSuffix ? 'година' : 'годину'; - } - else { - return number + ' ' + plural(format[key], +number); - } - } - function weekdaysCaseReplace(m, format) { - var weekdays = { - 'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'), - 'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'), - 'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_') - }; - - if (!m) { - return weekdays['nominative']; - } - - var nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? - 'accusative' : - ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ? - 'genitive' : - 'nominative'); - return weekdays[nounCase][m.day()]; - } - function processHoursFunction(str) { - return function () { - return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; - }; - } - - var uk = moment.defineLocale('uk', { - months : { - 'format': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_'), - 'standalone': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_') - }, - monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'), - weekdays : weekdaysCaseReplace, - weekdaysShort : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), - weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY р.', - LLL : 'D MMMM YYYY р., HH:mm', - LLLL : 'dddd, D MMMM YYYY р., HH:mm' - }, - calendar : { - sameDay: processHoursFunction('[Сьогодні '), - nextDay: processHoursFunction('[Завтра '), - lastDay: processHoursFunction('[Вчора '), - nextWeek: processHoursFunction('[У] dddd ['), - lastWeek: function () { - switch (this.day()) { - case 0: - case 3: - case 5: - case 6: - return processHoursFunction('[Минулої] dddd [').call(this); - case 1: - case 2: - case 4: - return processHoursFunction('[Минулого] dddd [').call(this); - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'за %s', - past : '%s тому', - s : 'декілька секунд', - ss : relativeTimeWithPlural, - m : relativeTimeWithPlural, - mm : relativeTimeWithPlural, - h : 'годину', - hh : relativeTimeWithPlural, - d : 'день', - dd : relativeTimeWithPlural, - M : 'місяць', - MM : relativeTimeWithPlural, - y : 'рік', - yy : relativeTimeWithPlural - }, - // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason - meridiemParse: /ночі|ранку|дня|вечора/, - isPM: function (input) { - return /^(дня|вечора)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ночі'; - } else if (hour < 12) { - return 'ранку'; - } else if (hour < 17) { - return 'дня'; - } else { - return 'вечора'; - } - }, - dayOfMonthOrdinalParse: /\d{1,2}-(й|го)/, - ordinal: function (number, period) { - switch (period) { - case 'M': - case 'd': - case 'DDD': - case 'w': - case 'W': - return number + '-й'; - case 'D': - return number + '-го'; - default: - return number; - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return uk; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ur.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ur.js deleted file mode 100755 index 16093125..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/ur.js +++ /dev/null @@ -1,97 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var months = [ - 'جنوری', - 'فروری', - 'مارچ', - 'اپریل', - 'مئی', - 'جون', - 'جولائی', - 'اگست', - 'ستمبر', - 'اکتوبر', - 'نومبر', - 'دسمبر' - ]; - var days = [ - 'اتوار', - 'پیر', - 'منگل', - 'بدھ', - 'جمعرات', - 'جمعہ', - 'ہفتہ' - ]; - - var ur = moment.defineLocale('ur', { - months : months, - monthsShort : months, - weekdays : days, - weekdaysShort : days, - weekdaysMin : days, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd، D MMMM YYYY HH:mm' - }, - meridiemParse: /صبح|شام/, - isPM : function (input) { - return 'شام' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'صبح'; - } - return 'شام'; - }, - calendar : { - sameDay : '[آج بوقت] LT', - nextDay : '[کل بوقت] LT', - nextWeek : 'dddd [بوقت] LT', - lastDay : '[گذشتہ روز بوقت] LT', - lastWeek : '[گذشتہ] dddd [بوقت] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s بعد', - past : '%s قبل', - s : 'چند سیکنڈ', - ss : '%d سیکنڈ', - m : 'ایک منٹ', - mm : '%d منٹ', - h : 'ایک گھنٹہ', - hh : '%d گھنٹے', - d : 'ایک دن', - dd : '%d دن', - M : 'ایک ماہ', - MM : '%d ماہ', - y : 'ایک سال', - yy : '%d سال' - }, - preparse: function (string) { - return string.replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/,/g, '،'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return ur; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uz-latn.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uz-latn.js deleted file mode 100755 index cb32115b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uz-latn.js +++ /dev/null @@ -1,57 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var uzLatn = moment.defineLocale('uz-latn', { - months : 'Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr'.split('_'), - monthsShort : 'Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek'.split('_'), - weekdays : 'Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba'.split('_'), - weekdaysShort : 'Yak_Dush_Sesh_Chor_Pay_Jum_Shan'.split('_'), - weekdaysMin : 'Ya_Du_Se_Cho_Pa_Ju_Sha'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'D MMMM YYYY, dddd HH:mm' - }, - calendar : { - sameDay : '[Bugun soat] LT [da]', - nextDay : '[Ertaga] LT [da]', - nextWeek : 'dddd [kuni soat] LT [da]', - lastDay : '[Kecha soat] LT [da]', - lastWeek : '[O\'tgan] dddd [kuni soat] LT [da]', - sameElse : 'L' - }, - relativeTime : { - future : 'Yaqin %s ichida', - past : 'Bir necha %s oldin', - s : 'soniya', - ss : '%d soniya', - m : 'bir daqiqa', - mm : '%d daqiqa', - h : 'bir soat', - hh : '%d soat', - d : 'bir kun', - dd : '%d kun', - M : 'bir oy', - MM : '%d oy', - y : 'bir yil', - yy : '%d yil' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); - - return uzLatn; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uz.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uz.js deleted file mode 100755 index 0e4ad22d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/uz.js +++ /dev/null @@ -1,57 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var uz = moment.defineLocale('uz', { - months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'), - monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'), - weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), - weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'), - weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'D MMMM YYYY, dddd HH:mm' - }, - calendar : { - sameDay : '[Бугун соат] LT [да]', - nextDay : '[Эртага] LT [да]', - nextWeek : 'dddd [куни соат] LT [да]', - lastDay : '[Кеча соат] LT [да]', - lastWeek : '[Утган] dddd [куни соат] LT [да]', - sameElse : 'L' - }, - relativeTime : { - future : 'Якин %s ичида', - past : 'Бир неча %s олдин', - s : 'фурсат', - ss : '%d фурсат', - m : 'бир дакика', - mm : '%d дакика', - h : 'бир соат', - hh : '%d соат', - d : 'бир кун', - dd : '%d кун', - M : 'бир ой', - MM : '%d ой', - y : 'бир йил', - yy : '%d йил' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 4th is the first week of the year. - } - }); - - return uz; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/vi.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/vi.js deleted file mode 100755 index 6fcbeafc..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/vi.js +++ /dev/null @@ -1,78 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var vi = moment.defineLocale('vi', { - months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), - monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), - monthsParseExact : true, - weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'), - weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), - weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), - weekdaysParseExact : true, - meridiemParse: /sa|ch/i, - isPM : function (input) { - return /^ch$/i.test(input); - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 12) { - return isLower ? 'sa' : 'SA'; - } else { - return isLower ? 'ch' : 'CH'; - } - }, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM [năm] YYYY', - LLL : 'D MMMM [năm] YYYY HH:mm', - LLLL : 'dddd, D MMMM [năm] YYYY HH:mm', - l : 'DD/M/YYYY', - ll : 'D MMM YYYY', - lll : 'D MMM YYYY HH:mm', - llll : 'ddd, D MMM YYYY HH:mm' - }, - calendar : { - sameDay: '[Hôm nay lúc] LT', - nextDay: '[Ngày mai lúc] LT', - nextWeek: 'dddd [tuần tới lúc] LT', - lastDay: '[Hôm qua lúc] LT', - lastWeek: 'dddd [tuần rồi lúc] LT', - sameElse: 'L' - }, - relativeTime : { - future : '%s tới', - past : '%s trước', - s : 'vài giây', - ss : '%d giây' , - m : 'một phút', - mm : '%d phút', - h : 'một giờ', - hh : '%d giờ', - d : 'một ngày', - dd : '%d ngày', - M : 'một tháng', - MM : '%d tháng', - y : 'một năm', - yy : '%d năm' - }, - dayOfMonthOrdinalParse: /\d{1,2}/, - ordinal : function (number) { - return number; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return vi; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/x-pseudo.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/x-pseudo.js deleted file mode 100755 index 9723c7ba..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/x-pseudo.js +++ /dev/null @@ -1,67 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var xPseudo = moment.defineLocale('x-pseudo', { - months : 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split('_'), - monthsShort : 'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split('_'), - monthsParseExact : true, - weekdays : 'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split('_'), - weekdaysShort : 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'), - weekdaysMin : 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[T~ódá~ý át] LT', - nextDay : '[T~ómó~rró~w át] LT', - nextWeek : 'dddd [át] LT', - lastDay : '[Ý~ést~érdá~ý át] LT', - lastWeek : '[L~ást] dddd [át] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'í~ñ %s', - past : '%s á~gó', - s : 'á ~féw ~sécó~ñds', - ss : '%d s~écóñ~ds', - m : 'á ~míñ~úté', - mm : '%d m~íñú~tés', - h : 'á~ñ hó~úr', - hh : '%d h~óúrs', - d : 'á ~dáý', - dd : '%d d~áýs', - M : 'á ~móñ~th', - MM : '%d m~óñt~hs', - y : 'á ~ýéár', - yy : '%d ý~éárs' - }, - dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return xPseudo; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/yo.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/yo.js deleted file mode 100755 index 1a356dca..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/yo.js +++ /dev/null @@ -1,59 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var yo = moment.defineLocale('yo', { - months : 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split('_'), - monthsShort : 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'), - weekdays : 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'), - weekdaysShort : 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'), - weekdaysMin : 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' - }, - calendar : { - sameDay : '[Ònì ni] LT', - nextDay : '[Ọ̀la ni] LT', - nextWeek : 'dddd [Ọsẹ̀ tón\'bọ] [ni] LT', - lastDay : '[Àna ni] LT', - lastWeek : 'dddd [Ọsẹ̀ tólọ́] [ni] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'ní %s', - past : '%s kọjá', - s : 'ìsẹjú aayá die', - ss :'aayá %d', - m : 'ìsẹjú kan', - mm : 'ìsẹjú %d', - h : 'wákati kan', - hh : 'wákati %d', - d : 'ọjọ́ kan', - dd : 'ọjọ́ %d', - M : 'osù kan', - MM : 'osù %d', - y : 'ọdún kan', - yy : 'ọdún %d' - }, - dayOfMonthOrdinalParse : /ọjọ́\s\d{1,2}/, - ordinal : 'ọjọ́ %d', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return yo; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-cn.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-cn.js deleted file mode 100755 index b051f33c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-cn.js +++ /dev/null @@ -1,109 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var zhCn = moment.defineLocale('zh-cn', { - months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), - weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), - weekdaysMin : '日_一_二_三_四_五_六'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY/MM/DD', - LL : 'YYYY年M月D日', - LLL : 'YYYY年M月D日Ah点mm分', - LLLL : 'YYYY年M月D日ddddAh点mm分', - l : 'YYYY/M/D', - ll : 'YYYY年M月D日', - lll : 'YYYY年M月D日 HH:mm', - llll : 'YYYY年M月D日dddd HH:mm' - }, - meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === '凌晨' || meridiem === '早上' || - meridiem === '上午') { - return hour; - } else if (meridiem === '下午' || meridiem === '晚上') { - return hour + 12; - } else { - // '中午' - return hour >= 11 ? hour : hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - var hm = hour * 100 + minute; - if (hm < 600) { - return '凌晨'; - } else if (hm < 900) { - return '早上'; - } else if (hm < 1130) { - return '上午'; - } else if (hm < 1230) { - return '中午'; - } else if (hm < 1800) { - return '下午'; - } else { - return '晚上'; - } - }, - calendar : { - sameDay : '[今天]LT', - nextDay : '[明天]LT', - nextWeek : '[下]ddddLT', - lastDay : '[昨天]LT', - lastWeek : '[上]ddddLT', - sameElse : 'L' - }, - dayOfMonthOrdinalParse: /\d{1,2}(日|月|周)/, - ordinal : function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'DDD': - return number + '日'; - case 'M': - return number + '月'; - case 'w': - case 'W': - return number + '周'; - default: - return number; - } - }, - relativeTime : { - future : '%s内', - past : '%s前', - s : '几秒', - ss : '%d 秒', - m : '1 分钟', - mm : '%d 分钟', - h : '1 小时', - hh : '%d 小时', - d : '1 天', - dd : '%d 天', - M : '1 个月', - MM : '%d 个月', - y : '1 年', - yy : '%d 年' - }, - week : { - // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return zhCn; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-hk.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-hk.js deleted file mode 100755 index 0ad0ae31..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-hk.js +++ /dev/null @@ -1,102 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var zhHk = moment.defineLocale('zh-hk', { - months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), - weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), - weekdaysMin : '日_一_二_三_四_五_六'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY/MM/DD', - LL : 'YYYY年M月D日', - LLL : 'YYYY年M月D日 HH:mm', - LLLL : 'YYYY年M月D日dddd HH:mm', - l : 'YYYY/M/D', - ll : 'YYYY年M月D日', - lll : 'YYYY年M月D日 HH:mm', - llll : 'YYYY年M月D日dddd HH:mm' - }, - meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') { - return hour; - } else if (meridiem === '中午') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === '下午' || meridiem === '晚上') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - var hm = hour * 100 + minute; - if (hm < 600) { - return '凌晨'; - } else if (hm < 900) { - return '早上'; - } else if (hm < 1130) { - return '上午'; - } else if (hm < 1230) { - return '中午'; - } else if (hm < 1800) { - return '下午'; - } else { - return '晚上'; - } - }, - calendar : { - sameDay : '[今天]LT', - nextDay : '[明天]LT', - nextWeek : '[下]ddddLT', - lastDay : '[昨天]LT', - lastWeek : '[上]ddddLT', - sameElse : 'L' - }, - dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/, - ordinal : function (number, period) { - switch (period) { - case 'd' : - case 'D' : - case 'DDD' : - return number + '日'; - case 'M' : - return number + '月'; - case 'w' : - case 'W' : - return number + '週'; - default : - return number; - } - }, - relativeTime : { - future : '%s內', - past : '%s前', - s : '幾秒', - ss : '%d 秒', - m : '1 分鐘', - mm : '%d 分鐘', - h : '1 小時', - hh : '%d 小時', - d : '1 天', - dd : '%d 天', - M : '1 個月', - MM : '%d 個月', - y : '1 年', - yy : '%d 年' - } - }); - - return zhHk; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-tw.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-tw.js deleted file mode 100755 index 6875cfed..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/moment/zh-tw.js +++ /dev/null @@ -1,102 +0,0 @@ -//! moment.js locale configuration - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - && typeof require === 'function' ? factory(require('../moment')) : - typeof define === 'function' && define.amd ? define(['../moment'], factory) : - factory(global.moment) -}(this, (function (moment) { 'use strict'; - - - var zhTw = moment.defineLocale('zh-tw', { - months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), - weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), - weekdaysMin : '日_一_二_三_四_五_六'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY/MM/DD', - LL : 'YYYY年M月D日', - LLL : 'YYYY年M月D日 HH:mm', - LLLL : 'YYYY年M月D日dddd HH:mm', - l : 'YYYY/M/D', - ll : 'YYYY年M月D日', - lll : 'YYYY年M月D日 HH:mm', - llll : 'YYYY年M月D日dddd HH:mm' - }, - meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') { - return hour; - } else if (meridiem === '中午') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === '下午' || meridiem === '晚上') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - var hm = hour * 100 + minute; - if (hm < 600) { - return '凌晨'; - } else if (hm < 900) { - return '早上'; - } else if (hm < 1130) { - return '上午'; - } else if (hm < 1230) { - return '中午'; - } else if (hm < 1800) { - return '下午'; - } else { - return '晚上'; - } - }, - calendar : { - sameDay : '[今天] LT', - nextDay : '[明天] LT', - nextWeek : '[下]dddd LT', - lastDay : '[昨天] LT', - lastWeek : '[上]dddd LT', - sameElse : 'L' - }, - dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/, - ordinal : function (number, period) { - switch (period) { - case 'd' : - case 'D' : - case 'DDD' : - return number + '日'; - case 'M' : - return number + '月'; - case 'w' : - case 'W' : - return number + '週'; - default : - return number; - } - }, - relativeTime : { - future : '%s內', - past : '%s前', - s : '幾秒', - ss : '%d 秒', - m : '1 分鐘', - mm : '%d 分鐘', - h : '1 小時', - hh : '%d 小時', - d : '1 天', - dd : '%d 天', - M : '1 個月', - MM : '%d 個月', - y : '1 年', - yy : '%d 年' - } - }); - - return zhTw; - -}))); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/README b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/README deleted file mode 100755 index 7f2baf21..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/README +++ /dev/null @@ -1 +0,0 @@ -https://www.transifex.com/rainloop/rainloop-webmail/ \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/_source.en.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/_source.en.yml deleted file mode 100755 index f4f17c60..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/_source.en.yml +++ /dev/null @@ -1,713 +0,0 @@ -en: - LOGIN: - LABEL_EMAIL: "Email" - LABEL_LOGIN: "Login" - LABEL_PASSWORD: "Password" - LABEL_SIGN_ME: "Remember Me" - LABEL_VERIFICATION_CODE: "Verification Code" - LABEL_DONT_ASK_VERIFICATION_CODE: "Don't ask for the code for 2 weeks" - BUTTON_SIGN_IN: "Sign In" - TITLE_SIGN_IN_GOOGLE: "Sign In using Google" - TITLE_SIGN_IN_FACEBOOK: "Sign In using Facebook" - TITLE_SIGN_IN_TWITTER: "Sign In using Twitter" - LABEL_FORGOT_PASSWORD: "Forgot password" - LABEL_REGISTRATION: "Registration" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Add Account" - BUTTON_SETTINGS: "Settings" - BUTTON_HELP: "Help" - BUTTON_LOGOUT: "Logout" - MOBILE: - BUTTON_MOBILE_VERSION: "Mobile version" - BUTTON_DESKTOP_VERSION: "Desktop version" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Search" - TITLE_ADV: "Advanced Search" - LABEL_ADV_FROM: "From" - LABEL_ADV_TO: "To" - LABEL_ADV_SUBJECT: "Subject" - LABEL_ADV_TEXT: "Text" - LABEL_ADV_HAS_ATTACHMENT: "Has attachment" - LABEL_ADV_HAS_ATTACHMENTS: "Has attachments" - LABEL_ADV_FLAGGED: "Flagged" - LABEL_ADV_UNSEEN: "Unseen" - LABEL_ADV_DATE: "Date" - LABEL_ADV_DATE_ALL: "All" - LABEL_ADV_DATE_3_DAYS: "Up to 3 days old" - LABEL_ADV_DATE_7_DAYS: "Up to 1 week old" - LABEL_ADV_DATE_MONTH: "Up to 1 month old" - LABEL_ADV_DATE_3_MONTHS: "Up to 3 months old" - LABEL_ADV_DATE_6_MONTHS: "Up to 6 months old" - LABEL_ADV_DATE_YEAR: "Up to 1 year old" - BUTTON_ADV_SEARCH: "Search" - PREVIEW_POPUP: - FULLSCREEN: "Toggle fullscreen" - ZOOM: "Zoom in/out" - CLOSE: "Close (Esc)" - LOADING: "Loading..." - GALLERY_PREV: "Previous (arrow left)" - GALLERY_NEXT: "Next (arrow right)" - GALLERY_COUNTER: "%curr% of %total%" - IMAGE_ERROR: "The image could not be loaded." - AJAX_ERROR: "The content could not be loaded." - FOLDER_LIST: - BUTTON_COMPOSE: "Compose" - BUTTON_CONTACTS: "Contacts" - BUTTON_NEW_MESSAGE: "New message" - INBOX_NAME: "Inbox" - SENT_NAME: "Sent" - DRAFTS_NAME: "Drafts" - SPAM_NAME: "Spam" - TRASH_NAME: "Trash" - ARCHIVE_NAME: "Archive" - QUOTA: - TITLE: "Quota usage" - MESSAGE_LIST: - BUTTON_RELOAD: "Reload Message List" - BUTTON_MOVE_TO: "Move To" - BUTTON_DELETE: "Delete" - BUTTON_ARCHIVE: "Archive" - BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Not Spam" - BUTTON_EMPTY_FOLDER: "Clear Folder" - BUTTON_MULTY_FORWARD: "Forward as attachment(s)" - BUTTON_DELETE_WITHOUT_MOVE: "Delete permanently" - BUTTON_MORE: "More" - MENU_SET_SEEN: "Mark as read" - MENU_SET_ALL_SEEN: "Mark all as read" - MENU_UNSET_SEEN: "Mark as unread" - MENU_SET_FLAG: "Flag" - MENU_UNSET_FLAG: "Unflag" - MENU_SELECT_ALL: "All" - MENU_SELECT_NONE: "None" - MENU_SELECT_INVERT: "Invert" - MENU_SELECT_UNSEEN: "Unread" - MENU_SELECT_SEEN: "Read" - MENU_SELECT_FLAGGED: "Flagged" - MENU_SELECT_UNFLAGGED: "Unflagged" - EMPTY_LIST: "Empty list." - EMPTY_SEARCH_LIST: "No messages matched your search." - SEARCH_RESULT_FOR: "Search results for \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "back to message list" - LIST_LOADING: "Loading" - EMPTY_SUBJECT_TEXT: "(No subject)" - PUT_MESSAGE_HERE: "Drop message here to view it in the list" - TODAY_AT: "today at %TIME%" - YESTERDAY_AT: "yesterday at %TIME%" - SEARCH_PLACEHOLDER: "Search" - NEW_MESSAGE_NOTIFICATION: "You have %COUNT% new messages!" - QUOTA_SIZE: "Using %SIZE% (%PROC%%) of your %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Edit" - BUTTON_BACK: "Back" - BUTTON_CLOSE: "Close" - BUTTON_DELETE: "Delete" - BUTTON_UNSUBSCRIBE: "Unsubscribe from this list" - BUTTON_ARCHIVE: "Archive" - BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Not Spam" - BUTTON_MOVE_TO: "Move To" - BUTTON_MORE: "More" - BUTTON_REPLY: "Reply" - BUTTON_REPLY_ALL: "Reply All" - BUTTON_FORWARD: "Forward" - BUTTON_FORWARD_AS_ATTACHMENT: "Forward as attachment" - BUTTON_EDIT_AS_NEW: "Edit as New" - BUTTON_SHOW_IMAGES: "Display external images" - BUTTON_NOTIFY_READ_RECEIPT: "The sender has asked to be notified when you read this message." - BUTTON_IN_NEW_WINDOW: "View in separate window" - BUTTON_THREAD_LIST: "Thread list" - BUTTON_THREAD_PREV: "Previous" - BUTTON_THREAD_NEXT: "Next" - BUTTON_THREAD_MORE: "More messages" - MENU_HEADERS: "Show message headers" - MENU_VIEW_ORIGINAL: "Show Source" - MENU_DOWNLOAD_ORIGINAL: "Download as .eml file" - MENU_FILTER_SIMILAR: "Filter messages like this" - MENU_PRINT: "Print" - EMPTY_SUBJECT_TEXT: "(No subject)" - LABEL_SUBJECT: "Subject" - LABEL_DATE: "Date" - LABEL_FROM: "From" - LABEL_FROM_SHORT: "from" - LABEL_TO: "To" - LABEL_TO_SHORT: "to" - LABEL_CC: "CC" - LABEL_BCC: "BCC" - LABEL_REPLY_TO: "Reply-To" - PRINT_LABEL_FROM: "From" - PRINT_LABEL_TO: "To" - PRINT_LABEL_CC: "CC" - PRINT_LABEL_BCC: "BCC" - PRINT_LABEL_REPLY_TO: "Reply-To" - PRINT_LABEL_DATE: "Date" - PRINT_LABEL_SUBJECT: "Subject" - PRINT_LABEL_ATTACHMENTS: "Attachments" - MESSAGE_LOADING: "Loading" - MESSAGE_VIEW_DESC: "Select any message in the list to view it here." - MESSAGE_VIEW_MOVE_DESC: "Click folder name in the left panel to select the destination." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" - LINK_DOWNLOAD_AS_ZIP: "Download as zip" - LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" - LINK_SAVE_TO_CLOUD: "Save to Cloud" - LINK_SAVE_TO_DROPBOX: "Save to Dropbox" - READ_RECEIPT: - SUBJECT: "Return Receipt (displayed) - %SUBJECT%" - BODY: | - This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. - - Note: "This Return Receipt only acknowledges that the message was displayed on the recipient's computer." - There is no guarantee that the recipient has read or understood the message contents. - SUGGESTIONS: - SEARCHING_DESC: "Searching..." - CONTACTS: - LEGEND_CONTACTS: "Contacts" - SEARCH_INPUT_PLACEHOLDER: "Search" - BUTTON_ADD_CONTACT: "Add Contact" - BUTTON_CREATE_CONTACT: "Create" - BUTTON_UPDATE_CONTACT: "Update" - BUTTON_IMPORT: "Import (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" - BUTTON_EXPORT_CSV: "Export (csv)" - ERROR_IMPORT_FILE: "Import error (invalid file format)" - LIST_LOADING: "Loading" - EMPTY_LIST: "No contacts here" - EMPTY_SEARCH: "No contacts found" - CLEAR_SEARCH: "Clear search" - CONTACT_VIEW_DESC: "Select contact in the list to view it here." - LABEL_DISPLAY_NAME: "Display name" - LABEL_EMAIL: "Email" - LABEL_PHONE: "Phone" - LABEL_WEB: "Web" - LABEL_BIRTHDAY: "Birthday" - LINK_ADD_EMAIL: "Add an email address" - LINK_ADD_PHONE: "Add a phone" - LINK_BIRTHDAY: "Birthday" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Enter display name" - PLACEHOLDER_ENTER_LAST_NAME: "Enter last name" - PLACEHOLDER_ENTER_FIRST_NAME: "Enter first name" - PLACEHOLDER_ENTER_NICK_NAME: "Enter nickname" - LABEL_READ_ONLY: "Read only" - LABEL_SHARE: "Share" - ADD_MENU_LABEL: "Add" - ADD_MENU_NICKNAME: "Nickname" - ADD_MENU_NOTES: "Notes" - ADD_MENU_EMAIL: "Email" - ADD_MENU_PHONE: "Phone" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Address" - ADD_MENU_BIRTHDAY: "Birthday" - ADD_MENU_TAGS: "Tags" - BUTTON_SHARE_NONE: "None" - BUTTON_SHARE_ALL: "Everyone" - BUTTON_SYNC: "Synchronization (CardDAV)" - COMPOSE: - TITLE_FROM: "From" - TITLE_TO: "To" - TITLE_CC: "CC" - TITLE_BCC: "BCC" - TITLE_REPLY_TO: "Reply-To" - TITLE_SUBJECT: "Subject" - LINK_SHOW_INPUTS: "show all fields" - BUTTON_SEND: "Send" - BUTTON_SAVE: "Save" - BUTTON_DELETE: "Delete" - BUTTON_CANCEL: "Cancel" - BUTTON_MINIMIZE: "Minimize" - SAVED_TIME: "Saved at %TIME%" - SAVED_ERROR_ON_SEND: "Message was sent but not saved to sent items folder" - DISCARD_UNSAVED_DATA: "Discard unsaved data?" - ATTACH_FILES: "Attach files" - ATTACH_DROP_FILES_DESC: "Drop files here" - ATTACH_ITEM_CANCEL: "Cancel" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" - FORWARD_MESSAGE_TOP_TITLE: "-------- Forwarded message -------" - FORWARD_MESSAGE_TOP_FROM: "From" - FORWARD_MESSAGE_TOP_TO: "To" - FORWARD_MESSAGE_TOP_CC: "CC" - FORWARD_MESSAGE_TOP_SENT: "Sent" - FORWARD_MESSAGE_TOP_SUBJECT: "Subject" - EMPTY_TO_ERROR_DESC: "Please specify at least one recipient" - NO_ATTACHMENTS_HERE_DESC: "No attachments here." - ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet." - BUTTON_REQUEST_READ_RECEIPT: "Request a read receipt" - BUTTON_MARK_AS_IMPORTANT: "Mark as important" - BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" - BUTTON_REQUEST_DSN: "Request a delivery receipt" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Close" - POPUPS_ASK: - BUTTON_YES: "Yes" - BUTTON_NO: "No" - DESC_WANT_CLOSE_THIS_WINDOW: "Are you sure you want to close this window?" - DESC_WANT_DELETE_MESSAGES: "Are you sure you want to delete the message(s)?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Choose your language" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Add Account?" - BUTTON_ADD_ACCOUNT: "Add" - TITLE_UPDATE_ACCOUNT: "Update Account?" - BUTTON_UPDATE_ACCOUNT: "Update" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Add Identity?" - TITLE_UPDATE_IDENTITY: "Update Identity?" - BUTTON_ADD_IDENTITY: "Add" - BUTTON_UPDATE_IDENTITY: "Update" - LABEL_EMAIL: "Email" - LABEL_NAME: "Name" - LABEL_REPLY_TO: "Reply-To" - LABEL_SIGNATURE: "Signature" - LABEL_CC: "Cc" - LABEL_BCC: "Bcc" - LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Create a folder?" - LABEL_NAME: "Folder name" - LABEL_PARENT: "Parent folder" - BUTTON_CREATE: "Create" - BUTTON_CANCEL: "Cancel" - BUTTON_CLOSE: "Close" - TITLE_CREATING_PROCESS: "Creating a folder" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Purge all messages from the folder?" - BUTTON_CLEAR: "Clear" - BUTTON_CANCEL: "Cancel" - BUTTON_CLOSE: "Close" - DANGER_DESC_WARNING: "Warning!" - DANGER_DESC_HTML_1: "This action will result in removing all mails from %FOLDER% folder completely." - DANGER_DESC_HTML_2: "Once started, the process cannot be aborted or cancelled." - TITLE_CLEARING_PROCESS: "Purging the folder..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Import OpenPGP key" - BUTTON_IMPORT_OPEN_PGP_KEY: "Import" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "View OpenPGP key" - BUTTON_SELECT: "Select" - BUTTON_CLOSE: "Close" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP keys" - LABEL_EMAIL: "Email" - LABEL_NAME: "Name" - LABEL_PASSWORD: "Password" - LABEL_KEY_BIT_LENGTH: "Key length" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" - LABEL_SIGN: "Sign" - LABEL_ENCRYPT: "Encrypt" - LABEL_PASSWORD: "Password" - BUTTON_SIGN: "Sign" - BUTTON_ENCRYPT: "Encrypt" - BUTTON_SIGN_AND_ENCRYPT: "Sign and encrypt" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" - LABEL_KEY: "Private Key" - LABEL_PASSWORD: "Password" - BUTTON_DECRYPT: "Decrypt" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "2-Step verification test" - LABEL_CODE: "Code" - BUTTON_TEST: "Test" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Create a filter?" - TITLE_EDIT_FILTER: "Update filter?" - FILTER_NAME: "Name" - LEGEND_CONDITIONS: "Conditions" - LEGEND_ACTIONS: "Actions" - BUTTON_DONE: "Done" - BUTTON_ADD_CONDITION: "Add a Condition" - SELECT_ACTION_NONE: "None" - SELECT_ACTION_MOVE_TO: "Move to" - SELECT_ACTION_FORWARD_TO: "Forward to" - SELECT_ACTION_REJECT: "Reject" - SELECT_ACTION_VACATION_MESSAGE: "Vacation message" - SELECT_ACTION_DISCARD: "Discard" - SELECT_FIELD_FROM: "From" - SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" - SELECT_FIELD_SUBJECT: "Subject" - SELECT_FIELD_HEADER: "Header" - SELECT_FIELD_SIZE: "Size" - SELECT_TYPE_CONTAINS: "Contains" - SELECT_TYPE_NOT_CONTAINS: "Not Contains" - SELECT_TYPE_MATCHES: "Matches (* and ? supported)" - SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" - SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Not Regexp" - SELECT_TYPE_EQUAL_TO: "Equal To" - SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" - SELECT_TYPE_OVER: "Over" - SELECT_TYPE_UNDER: "Under" - SELECT_MATCH_ANY: "Matching ANY of the following rules" - SELECT_MATCH_ALL: "Matching ALL of the following rules" - MARK_AS_READ_LABEL: "Mark as read" - REPLY_INTERVAL_LABEL: "Reply interval (days)" - KEEP_LABEL: "Keep" - STOP_LABEL: "Don't stop processing rules" - EMAIL_LABEL: "Email" - VACATION_SUBJECT_LABEL: "Subject (optional)" - VACATION_MESSAGE_LABEL: "Message" - VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" - REJECT_MESSAGE_LABEL: "Reject message" - ALL_INCOMING_MESSAGES_DESC: "All incoming messages" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Select system folders" - SELECT_CHOOSE_ONE: "Choose one" - SELECT_UNUSE_NAME: "Do not use" - LABEL_SENT: "Sent" - LABEL_DRAFTS: "Drafts" - LABEL_SPAM: "Spam" - LABEL_TRASH: "Trash" - LABEL_ARCHIVE: "Archive" - BUTTON_CANCEL: "Cancel" - BUTTON_CLOSE: "Close" - NOTIFICATION_SENT: | - You haven't selected "Sent" system folder messages are put to after sending. - If you don't want to save sent message, please select "Do not use" option. - NOTIFICATION_DRAFTS: "You haven't selected \"Drafts\" system folder messages are saved to while composing." - NOTIFICATION_SPAM: | - You haven't selected "Spam" system folder spamed messages are placed to. - If you wish to remove messages permanently, please select "Do not use" option. - NOTIFICATION_TRASH: | - You haven't selected "Trash" system folder deleted messages are placed to. - If you wish to remove messages permanently, please select "Do not use" option. - NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "2-Step Verification (TOTP)" - LABEL_ENABLE_TWO_FACTOR: "Enable 2-Step verification" - LABEL_TWO_FACTOR_USER: "User" - LABEL_TWO_FACTOR_STATUS: "Status" - LABEL_TWO_FACTOR_SECRET: "Secret" - LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" - BUTTON_CREATE: "Create a secret" - BUTTON_ACTIVATE: "Activate" - BUTTON_CLEAR: "Clear" - BUTTON_LOGOUT: "Logout" - BUTTON_DONE: "Done" - BUTTON_TEST: "Test" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Show Secret" - BUTTON_HIDE_SECRET: "Hide Secret" - TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" - TWO_FACTOR_SECRET_DESC: > - Import this info into your Google Authenticator client (or other TOTP client) - using the provided QR code below or by entering the code manually. - TWO_FACTOR_BACKUP_CODES_DESC: > - If you can't receive codes via Google Authenticator (or other TOTP client), - you can use backup codes to sign in. After you’ve used a backup code to sign - in, it will become inactive. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." - TITLES: - LOADING: "Loading" - LOGIN: "Login" - MAILBOX: "MailBox" - SETTINGS: "Settings" - COMPOSE: "Compose" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "File is too big" - ERROR_FILE_PARTIALLY_UPLOADED: "File was partially uploaded due to unknown error" - ERROR_NO_FILE_UPLOADED: "No file uploaded" - ERROR_MISSING_TEMP_FOLDER: "The temporary file is missing" - ERROR_ON_SAVING_FILE: "An unknown file upload error occurred" - ERROR_FILE_TYPE: "Invalid file type" - ERROR_UNKNOWN: "An unknown file upload error occurred" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" - TEXT_SWITCHER_RICH_FORMATTING: "Rich formatting" - TEXT_SWITCHER_CONFIRM: "Text formatting and images will be lost. Are you sure you want to continue?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Personal" - LABEL_GENERAL_NAME: "General" - LABEL_CONTACTS_NAME: "Contacts" - LABEL_FOLDERS_NAME: "Folders" - LABEL_ACCOUNTS_NAME: "Accounts" - LABEL_IDENTITY_NAME: "Identity" - LABEL_IDENTITIES_NAME: "Identities" - LABEL_FILTERS_NAME: "Filters" - LABEL_TEMPLATES_NAME: "Templates" - LABEL_SECURITY_NAME: "Security" - LABEL_SOCIAL_NAME: "Social" - LABEL_THEMES_NAME: "Themes" - LABEL_CHANGE_PASSWORD_NAME: "Password" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Back" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filters" - BUTTON_SAVE: "Save" - BUTTON_ADD_FILTER: "Add a Filter" - BUTTON_DELETE: "Delete" - BUTTON_RAW_SCRIPT: "Use Custom User Script" - SUBNAME_NONE: "None" - SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" - SUBNAME_REJECT: "Reject" - SUBNAME_VACATION_MESSAGE: "Vacation message" - SUBNAME_DISCARD: "Discard" - CAPABILITY_LABEL: "Capability" - LOADING_PROCESS: "Updating filter list" - DELETING_ASK: "Are you sure?" - CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identity" - LABEL_DISPLAY_NAME: "Name" - LABEL_REPLY_TO: "Reply-To" - LABEL_SIGNATURE: "Signature" - LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Security" - LABEL_CONFIGURE_TWO_FACTOR: "Configure 2-Step verification" - LABEL_AUTOLOGOUT: "Auto Logout" - AUTOLOGIN_NEVER_OPTION_NAME: "Never" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hour(s)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "General" - LABEL_LANGUAGE: "Language" - LABEL_IDENTITY: "Identity" - LABEL_LAYOUT: "Layout" - LABEL_LAYOUT_NO_SPLIT: "No Split" - LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" - LABEL_EDITOR: "Default text editor" - LABEL_EDITOR_HTML: "Html" - LABEL_EDITOR_PLAIN: "Plain" - LABEL_EDITOR_HTML_FORCED: "Html (forced)" - LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" - LABEL_ANIMATION: "Interface animation" - LABEL_ANIMATION_FULL: "Full" - LABEL_ANIMATION_NORMAL: "Normal" - LABEL_ANIMATION_NONE: "None" - LABEL_VIEW_OPTIONS: "View options" - LABEL_USE_PREVIEW_PANE: "Use preview pane" - LABEL_USE_CHECKBOXES_IN_LIST: "Display checkboxes in list" - LABEL_USE_THREADS: "Use threads" - LABEL_REPLY_SAME_FOLDER: "Place replies in the folder of the message being replied to" - LABEL_SHOW_IMAGES: "Always display external images in message body" - LABEL_SHOW_ANIMATION: "Show animation" - LABEL_MESSAGE_PER_PAGE: "Messages on page" - LABEL_NOTIFICATIONS: "Notifications" - LABEL_SOUND_NOTIFICATION: "Sound notification" - LABEL_CHROME_NOTIFICATION_DESC: "Show new messages notification popups" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Blocked by the browser)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Contacts" - LABEL_CONTACTS_AUTOSAVE: "Automatically add recipients to your address book" - LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" - LABEL_CONTACTS_SYNC_SERVER: "Server" - LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" - LABEL_CONTACTS_SYNC_USER: "User" - LABEL_CONTACTS_SYNC_PASSWORD: "Password" - SETTINGS_THEMES: - LEGEND_THEMES: "Themes" - LEGEND_THEMES_CUSTOM: "Custom Theme Configuration" - LABEL_CUSTOM_TYPE: "Type" - LABEL_CUSTOM_TYPE_LIGHT: "Light" - LABEL_CUSTOM_TYPE_DARK: "Dark" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Background" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Upload background image (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "File is too big" - ERROR_FILE_TYPE_ERROR: "Invalid file type (JPG and PNG only)" - ERROR_UNKNOWN: "An unknown file upload error occurred" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Connect Google" - BUTTON_GOOGLE_DISCONNECT: "Disconnect Google" - MAIN_GOOGLE_DESC: "After enabling login via Google, you can log into this account using Google button on the login screen." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Connect Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Disconnect Facebook" - MAIN_FACEBOOK_DESC: "After enabling login via Facebook, you can log into this account using Facebook button on the login screen." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Connect Twitter" - BUTTON_TWITTER_DISCONNECT: "Disconnect Twitter" - MAIN_TWITTER_DESC: "After enabling login via Twitter, you can log into this account using Twitter button on the login screen." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Folder List" - BUTTON_CREATE: "Create Folder" - BUTTON_SYSTEM: "System Folders" - BUTTON_DELETE: "Delete" - BUTTON_SUBSCRIBE: "Subscribe" - BUTTON_UNSUBSCRIBE: "Unsubscribe" - LOADING_PROCESS: "Updating folder list" - CREATING_PROCESS: "Creating a folder" - DELETING_PROCESS: "Deleting a folder" - RENAMING_PROCESS: "Renaming a folder" - DELETING_ASK: "Are you sure?" - TO_MANY_FOLDERS_DESC_1: "You have too many folders!" - TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." - HELP_DELETE_FOLDER: "Delete folder" - HELP_SHOW_HIDE_FOLDER: "Show/hide folder" - HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Accounts" - LEGEND_IDENTITIES: "Identities" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" - BUTTON_ADD_ACCOUNT: "Add an Account" - BUTTON_ADD_IDENTITY: "Add an Identity" - BUTTON_DELETE: "Delete" - LOADING_PROCESS: "Updating..." - DELETING_ASK: "Are you sure?" - DEFAULT_IDENTITY_LABEL: "default" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identity" - LEGEND_IDENTITIES: "Additional Identities" - LABEL_DEFAULT: "Default" - LABEL_DISPLAY_NAME: "Name" - LABEL_REPLY_TO: "Reply-To" - LABEL_SIGNATURE: "Signature" - LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" - BUTTON_ADD_IDENTITY: "Add Identity" - BUTTON_DELETE: "Delete" - LOADING_PROCESS: "Updating identity list" - DELETING_ASK: "Are you sure?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Change Password" - LABEL_CURRENT_PASSWORD: "Current password" - LABEL_NEW_PASSWORD: "New password" - LABEL_REPEAT_PASSWORD: "Confirm New Password" - BUTTON_UPDATE_PASSWORD: "Set New Password" - ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" - TITLE_PRIVATE: "Private" - TITLE_PUBLIC: "Public" - DELETING_ASK: "Are you sure?" - GENERATE_ONLY_HTTPS: "HTTPS only" - LABEL_ALLOW_DRAFT_AUTOSAVE: "Automatically save draft" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" - TAB_MAILBOX: "Mailbox" - TAB_MESSAGE_LIST: "Message list" - TAB_MESSAGE_VIEW: "Message view" - TAB_COMPOSE: "Compose" - LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" - LABEL_REPLY: "Reply" - LABEL_REPLY_ALL: "Reply All" - LABEL_FORWARD: "Forward" - LABEL_FORWARD_MULTIPLY: "Forward as attachment(s)" - LABEL_HELP: "Help" - LABEL_CHECK_ALL: "Select all messages" - LABEL_ARCHIVE: "Archive" - LABEL_DELETE: "Delete" - LABEL_OPEN_THREAD: "Open selected thread" - LABEL_MOVE: "Move" - LABEL_READ: "Read selected messages" - LABEL_UNREAD: "Unread selected messages" - LABEL_IMPORTANT: "Important, flag selected messages" - LABEL_SEARCH: "Search" - LABEL_CANCEL_SEARCH: "Cancel search" - LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" - LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" - LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" - LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" - LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" - LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" - LABEL_THREAD_NEXT: "Next message in thread" - LABEL_THREAD_PREV: "Previous message in thread" - LABEL_PRINT: "Print" - LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" - LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" - LABEL_SWITCH_TO_LIST: "Switch focus back to message list" - LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" - LABEL_SAVE_MESSAGE: "Save message" - LABEL_SEND_MESSAGE: "Send message" - LABEL_CLOSE_COMPOSE: "Close compose" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "No public keys found" - NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" - NO_PRIVATE_KEY_FOUND: "No private key found" - NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" - ADD_A_PUBLICK_KEY: "Add a public key" - SELECT_A_PRIVATE_KEY: "Select a private key" - UNVERIFIRED_SIGNATURE: "Unverified signature" - DECRYPTION_ERROR: "OpenPGP decryption error" - GOOD_SIGNATURE: "Good signature from %USER%" - PGP_ERROR: "OpenPGP error: %ERROR%" - SPECIFY_FROM_EMAIL: "Please specify FROM email address" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" - NOTIFICATIONS: - INVALID_TOKEN: "Invalid token" - AUTH_ERROR: "Authentication failed" - ACCESS_ERROR: "Access error" - CONNECTION_ERROR: "Can't connect to server" - CAPTCHA_ERROR: "Incorrect CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - DOMAIN_NOT_ALLOWED: "Domain is not allowed" - ACCOUNT_NOT_ALLOWED: "Account is not allowed" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" - COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" - CURRENT_PASSWORD_INCORRECT: "Current password incorrect" - NEW_PASSWORD_SHORT: "Password is too short" - NEW_PASSWORD_WEAK: "Password is too easy" - NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" - CONTACTS_SYNC_ERROR: "Contacts synchronization error" - CANT_GET_MESSAGE_LIST: "Can't get message list" - CANT_GET_MESSAGE: "Can't get message" - CANT_DELETE_MESSAGE: "Can't delete message" - CANT_MOVE_MESSAGE: "Can't move message" - CANT_SAVE_MESSAGE: "Can't save message" - CANT_SEND_MESSAGE: "Can't send message" - INVALID_RECIPIENTS: "Invalid recipients" - CANT_SAVE_FILTERS: "Can't save filters" - CANT_GET_FILTERS: "Can't get filters" - FILTERS_ARE_NOT_CORRECT: "Filters are not correct" - CANT_CREATE_FOLDER: "Can't create folder" - CANT_RENAME_FOLDER: "Can't rename folder" - CANT_DELETE_FOLDER: "Can't delete folder" - CANT_DELETE_NON_EMPTY_FOLDER: "Can't delete non-empty directory" - CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" - CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" - CANT_SAVE_SETTINGS: "Can't save settings" - CANT_SAVE_PLUGIN_SETTINGS: "Can't save settings" - DOMAIN_ALREADY_EXISTS: "Domain already exists" - CANT_INSTALL_PACKAGE: "Failed to install package" - CANT_DELETE_PACKAGE: "Failed to remove package" - INVALID_PLUGIN_PACKAGE: "Invalid plugin package" - UNSUPPORTED_PLUGIN_PACKAGE: "Unsupported plugin package" - LICENSING_SERVER_IS_UNAVAILABLE: "Subscription server is unvailable" - LICENSING_DOMAIN_EXPIRED: "Subscription for this domain has expired." - LICENSING_DOMAIN_BANNED: "Subscription for this domain is banned." - DEMO_SEND_MESSAGE_ERROR: "For security purposes, this account is not allowed to send messages to external e-mail addresses!" - DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" - ACCOUNT_ALREADY_EXISTS: "Account already exists" - ACCOUNT_DOES_NOT_EXIST: "Account doesn't exist" - MAIL_SERVER_ERROR: "An error has occured while accessing mail server" - INVALID_INPUT_ARGUMENT: "Invalid input argument" - UNKNOWN_ERROR: "Unknown error" - STATIC: - BACK_LINK: "Reload" - DOMAIN_LIST_DESC: "List of domains webmail is allowed to access." - PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" - PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" - NO_SCRIPT_TITLE: "JavaScript is required for this application." - NO_SCRIPT_DESC: | - JavaScript support is not available in your browser. - Please enable JavaScript support in your browser settings and retry. - NO_COOKIE_TITLE: "Cookies support is required for this application." - NO_COOKIE_DESC: | - Cookies support is not available in your browser. - Please enable Cookie support in your browser settings and retry. - BAD_BROWSER_TITLE: "Your browser is outdated." - BAD_BROWSER_DESC: | - To use all the features of the application, - download and install one of these browsers: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ar_SA.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ar_SA.yml deleted file mode 100755 index 9741c660..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ar_SA.yml +++ /dev/null @@ -1,695 +0,0 @@ -ar_SA: - LOGIN: - LABEL_EMAIL: "إيميل" - LABEL_LOGIN: "تسيجيل الدخول" - LABEL_PASSWORD: "كلمة السر" - LABEL_SIGN_ME: "تذكرني" - LABEL_VERIFICATION_CODE: "كود التحقق" - LABEL_DONT_ASK_VERIFICATION_CODE: "لاتسألني عن الكود الا بعد مرور اسبوعين" - BUTTON_SIGN_IN: "الدخول" - TITLE_SIGN_IN_GOOGLE: "Google+ الدخول باستخدام" - TITLE_SIGN_IN_FACEBOOK: "Facebook الدخول باستخدام" - TITLE_SIGN_IN_TWITTER: "Twitter الدخول باستخدام" - LABEL_FORGOT_PASSWORD: "نسيت كلمة السر" - LABEL_REGISTRATION: "التسجيل" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "ضفّ حساب" - BUTTON_SETTINGS: "الإعدادات" - BUTTON_HELP: "المساعدة" - BUTTON_LOGOUT: "تسجيل الخروج" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "بحث" - TITLE_ADV: "البحث المطور" - LABEL_ADV_FROM: "من" - LABEL_ADV_TO: "الى" - LABEL_ADV_SUBJECT: "الموضوع" - LABEL_ADV_TEXT: "النص" - LABEL_ADV_HAS_ATTACHMENT: "يحتوي على مرفق" - LABEL_ADV_HAS_ATTACHMENTS: "يحتوي مرفقات" - LABEL_ADV_FLAGGED: "عليه علم" - LABEL_ADV_UNSEEN: "لم يقرأ" - LABEL_ADV_DATE: "التاريخ" - LABEL_ADV_DATE_ALL: "الكل" - LABEL_ADV_DATE_3_DAYS: "منذ 3 أيام" - LABEL_ADV_DATE_7_DAYS: "منذ أسبوع" - LABEL_ADV_DATE_MONTH: "منذ شهر" - LABEL_ADV_DATE_3_MONTHS: "منذ 3 أشهر" - LABEL_ADV_DATE_6_MONTHS: "منذ 6 أشهر" - LABEL_ADV_DATE_YEAR: "منذ سنة" - BUTTON_ADV_SEARCH: "إبحث" - PREVIEW_POPUP: - FULLSCREEN: "إعداد افتراضي لوضع ملء الشاشة" - ZOOM: "Zoom in/out" - CLOSE: "أغلق (Esc)" - LOADING: "..جاري التحميل" - GALLERY_PREV: "السابق( السهم اليسار)" - GALLERY_NEXT: "اليمين(السهم اليميني)" - GALLERY_COUNTER: "%curr% of %total%" - IMAGE_ERROR: "الصورة لم نتمكن من عرض." - AJAX_ERROR: "المحتوى لم نتمكن من عرض." - FOLDER_LIST: - BUTTON_COMPOSE: "إنشاء" - BUTTON_CONTACTS: "جهات الإتصال" - INBOX_NAME: "البريد الوارد" - SENT_NAME: "البريد المرسل" - DRAFTS_NAME: "المسودات" - SPAM_NAME: "الرسائل غير المرغوب فيها" - TRASH_NAME: "المهملات" - ARCHIVE_NAME: "الأرشيف" - QUOTA: - TITLE: "Quota usage" - MESSAGE_LIST: - BUTTON_RELOAD: "أعد تحميل قائمة الرسائل" - BUTTON_MOVE_TO: "..انقل الى" - BUTTON_DELETE: "حذف" - BUTTON_ARCHIVE: "وضع في الأرشيف" - BUTTON_SPAM: "الإبلاغ عن الرسائل غير المرغوب فيها" - BUTTON_NOT_SPAM: "ليست رسائل غير مرغوب فيها" - BUTTON_EMPTY_FOLDER: "افرغ محتويات المجلد" - BUTTON_MULTY_FORWARD: "إعادة توجيه كملحقات" - BUTTON_DELETE_WITHOUT_MOVE: "الحذف نهائياً" - BUTTON_MORE: "المزيد" - MENU_SET_SEEN: "تعليمها بـ مقروءة" - MENU_SET_ALL_SEEN: "تعليم جميع الرسائل كـ مقروءة" - MENU_UNSET_SEEN: "تعليمها بـ غير مقروءة" - MENU_SET_FLAG: "مهمة" - MENU_UNSET_FLAG: "إزالة الأهمية" - MENU_SELECT_ALL: "الكل" - MENU_SELECT_NONE: "بدون" - MENU_SELECT_INVERT: "Invert" - MENU_SELECT_UNSEEN: "غير مقروء" - MENU_SELECT_SEEN: "مقروء" - MENU_SELECT_FLAGGED: "محدد كـ مهم" - MENU_SELECT_UNFLAGGED: "إزالة الأهمية" - EMPTY_LIST: "إفراغ القائمة" - EMPTY_SEARCH_LIST: "ليست هناك أية رسائل تطابق بحثك." - SEARCH_RESULT_FOR: "نتيجة البحث لـ \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "العودة الى قائمة الرسائل" - LIST_LOADING: "..جاري التحميل" - EMPTY_SUBJECT_TEXT: "(لايوجدموضوع)" - PUT_MESSAGE_HERE: "حرك الرسالة الى هنا.. لكي تراها في قائمة الرسائل" - TODAY_AT: "اليوم عند %TIME%" - YESTERDAY_AT: "البارحة عند %TIME%" - SEARCH_PLACEHOLDER: "البحث" - NEW_MESSAGE_NOTIFICATION: "يوجد لديك %COUNT% رسالة جديدة!" - QUOTA_SIZE: "Using %SIZE% (%PROC%%) of your %LIMIT%" - MESSAGE: - BUTTON_EDIT: "تعديل" - BUTTON_BACK: "العودة" - BUTTON_CLOSE: "إغلاق" - BUTTON_DELETE: "حذف" - BUTTON_ARCHIVE: "أرشيف" - BUTTON_SPAM: "رسالة غير مرغوبة" - BUTTON_NOT_SPAM: "ليست رسالة غير مرغوبة" - BUTTON_MOVE_TO: "انقل الى" - BUTTON_MORE: "المزيد" - BUTTON_REPLY: "الرد" - BUTTON_REPLY_ALL: "الرد على الجميع" - BUTTON_FORWARD: "إعادة توجيه" - BUTTON_FORWARD_AS_ATTACHMENT: "إعادة توجيه كملحقات" - BUTTON_EDIT_AS_NEW: "التعديل كـ جديد" - BUTTON_SHOW_IMAGES: "عرض الصور الخارجية" - BUTTON_NOTIFY_READ_RECEIPT: "لقد طلب المرسل أن يتم إعلامه في حال قراءة الرسالة" - BUTTON_IN_NEW_WINDOW: "العرض في نافذة منفصلة" - BUTTON_THREAD_LIST: "قائمة المواضيع" - BUTTON_THREAD_PREV: "السابق" - BUTTON_THREAD_NEXT: "التالي" - BUTTON_THREAD_MORE: "المزيد من الرسائل" - MENU_HEADERS: "Show message headers" - MENU_VIEW_ORIGINAL: "إظهار المصدر" - MENU_DOWNLOAD_ORIGINAL: ".eml التنزيل كملف" - MENU_FILTER_SIMILAR: "تصفية رسائل مثل هذه" - MENU_PRINT: "طباعة" - EMPTY_SUBJECT_TEXT: "(لايوجد موضوع)" - LABEL_SUBJECT: "الموضوع" - LABEL_DATE: "التاريخ" - LABEL_FROM: "من" - LABEL_FROM_SHORT: "من" - LABEL_TO: "الى" - LABEL_TO_SHORT: "الى" - LABEL_CC: "نسخة الى" - LABEL_BCC: "نسخة مخفية الوجهة" - LABEL_REPLY_TO: "الرد-الى" - PRINT_LABEL_FROM: "من" - PRINT_LABEL_TO: "الى" - PRINT_LABEL_CC: "نسخة الى" - PRINT_LABEL_BCC: "نسخة مخفية الوجهة" - PRINT_LABEL_REPLY_TO: "الرد-الى" - PRINT_LABEL_DATE: "التاريخ" - PRINT_LABEL_SUBJECT: "الموضوع" - PRINT_LABEL_ATTACHMENTS: "الملحقات" - MESSAGE_LOADING: "..جاري التحميل" - MESSAGE_VIEW_DESC: "حدد رسالة من القائمة ليتم عرضها هنا" - PGP_PASSWORD_INPUT_PLACEHOLDER: "كلمة السر" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" - LINK_DOWNLOAD_AS_ZIP: "zip تنزيل كـ" - LINK_SAVE_TO_OWNCLOUD: "ownCloud الحفظ الى" - LINK_SAVE_TO_DROPBOX: "Dropbox الحفظ الى" - READ_RECEIPT: - SUBJECT: "إعلام بالقراءة (تم عرضها) - %SUBJECT%" - BODY: |- - هذا إعلام بأن الرسالة المرسلة قد تمت قرائتها %READ-RECEIPT%. - SUGGESTIONS: - SEARCHING_DESC: "يتم البحث..." - CONTACTS: - LEGEND_CONTACTS: "جهات الإتصال" - SEARCH_INPUT_PLACEHOLDER: "بحث" - BUTTON_ADD_CONTACT: "إضافة جهة إتصال" - BUTTON_CREATE_CONTACT: "إنشاء" - BUTTON_UPDATE_CONTACT: "تحديث" - BUTTON_IMPORT: "إستيراد (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "تصدير كـ (vcf, vCard)" - BUTTON_EXPORT_CSV: "تصدير كـ (csv)" - ERROR_IMPORT_FILE: "خطأ في الإستيراد(نوع ملف غير صحيح)" - LIST_LOADING: "جاري التحميل" - EMPTY_LIST: "لايوجد جهات إتصال" - EMPTY_SEARCH: "لم يتم ايجاد جهة الإتصال" - CLEAR_SEARCH: "إزالة البحث" - CONTACT_VIEW_DESC: "حدد جهة إتصال من القائمة لكي يتم عرضها هنا" - LABEL_DISPLAY_NAME: "الإسم المعروض" - LABEL_EMAIL: "البريد الإلكتروني" - LABEL_PHONE: "رقم الهاتف" - LABEL_WEB: "الموقع" - LABEL_BIRTHDAY: "تاريخ الميلاد" - LINK_ADD_EMAIL: "قم باضافة البريد الالكتروني" - LINK_ADD_PHONE: "قم باضافة رقم الهاتف" - LINK_BIRTHDAY: "تاريخ الميلاد" - PLACEHOLDER_ENTER_DISPLAY_NAME: "ادخل الاسم المعروض" - PLACEHOLDER_ENTER_LAST_NAME: "ادخل اسم العائلة" - PLACEHOLDER_ENTER_FIRST_NAME: "ادخل الاسم" - PLACEHOLDER_ENTER_NICK_NAME: "ادخل اللقب" - LABEL_READ_ONLY: "قراءة فقط" - LABEL_SHARE: "مشاركة" - ADD_MENU_LABEL: "اضافة" - ADD_MENU_NICKNAME: "اللقب" - ADD_MENU_NOTES: "الملاحظات" - ADD_MENU_EMAIL: "البريد الإلكتروني" - ADD_MENU_PHONE: "الهاتف" - ADD_MENU_URL: "الرابط" - ADD_MENU_ADDRESS: "العنوان" - ADD_MENU_BIRTHDAY: "تاريخ الميلاد" - ADD_MENU_TAGS: "Tags" - BUTTON_SHARE_NONE: "لاأحد" - BUTTON_SHARE_ALL: "الجميع" - BUTTON_SYNC: "المزامنة (CardDAV)" - COMPOSE: - TITLE_FROM: "من" - TITLE_TO: "الى" - TITLE_CC: "نسخة الى" - TITLE_BCC: "نسخة مخفية الوجهة" - TITLE_REPLY_TO: "الرد-الى" - TITLE_SUBJECT: "الموضوع" - LINK_SHOW_INPUTS: "إظهار جميع الحقول" - BUTTON_SEND: "إرسال" - BUTTON_SAVE: "حفظ" - BUTTON_DELETE: "حذف" - BUTTON_CANCEL: "إلغاء" - BUTTON_MINIMIZE: "تصغير" - SAVED_TIME: "تم الحفظ عند %TIME%" - SAVED_ERROR_ON_SEND: "تم إرسال الرسالة.. ولكن لم يتم حفظها في مجلد المرسلات" - DISCARD_UNSAVED_DATA: "تجاهل البيانات الغير محفوظة؟" - ATTACH_FILES: "ارفاق الملفات" - ATTACH_DROP_FILES_DESC: "حرك الملفات الى هنا" - ATTACH_ITEM_CANCEL: "الغاء" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" - FORWARD_MESSAGE_TOP_TITLE: "-------- رسالة معاد توجيهها -------" - FORWARD_MESSAGE_TOP_FROM: "من" - FORWARD_MESSAGE_TOP_TO: "الى" - FORWARD_MESSAGE_TOP_CC: "نسخة الى" - FORWARD_MESSAGE_TOP_SENT: "تم الإرسال" - FORWARD_MESSAGE_TOP_SUBJECT: "الموضوع" - EMPTY_TO_ERROR_DESC: "رجاءً حدد مستلم واحد على الأقل." - NO_ATTACHMENTS_HERE_DESC: "لايوجد مرفقات" - ATTACHMENTS_ERROR_DESC: "تحذير! لم يتم إرفاق جميع المرفقات" - ATTACHMENTS_UPLOAD_ERROR_DESC: "لم تنتهي عملية الإرفاق بعد" - BUTTON_REQUEST_READ_RECEIPT: "اطلب اعلاماً بالقراءة" - BUTTON_MARK_AS_IMPORTANT: "تحديده كـ هام" - BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" - BUTTON_REQUEST_DSN: "اطلب اعلاماً بايصال البريد" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "إغلاق" - POPUPS_ASK: - BUTTON_YES: "نعم" - BUTTON_NO: "لا" - DESC_WANT_CLOSE_THIS_WINDOW: "هل أنت متأكد من رغبتك باغلاق هذه النافذة؟" - DESC_WANT_DELETE_MESSAGES: "هل أنت متأكد من رغبتك بحذف هذه الرسائل؟" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "حدّد لغتك" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "قم باضافة حساب؟" - BUTTON_ADD_ACCOUNT: "إضافة" - TITLE_UPDATE_ACCOUNT: "تحديث الحساب؟" - BUTTON_UPDATE_ACCOUNT: "تحديث" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "إضافة هوية؟" - TITLE_UPDATE_IDENTITY: "تحديث الهوية؟" - BUTTON_ADD_IDENTITY: "إضافة" - BUTTON_UPDATE_IDENTITY: "تحديث" - LABEL_EMAIL: "البريد الإلكتروني" - LABEL_NAME: "الإسم" - LABEL_REPLY_TO: "الرد-الى" - LABEL_SIGNATURE: "التوقيع" - LABEL_CC: "نسخة الى" - LABEL_BCC: "نسخة مخفية الوجهة" - LABEL_SIGNATURE_INSERT_BEFORE: "قم بوضع التوقيع قبل النص المأخوذ من الرسائل في عملية الرد" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "إنشاء مجلد؟" - LABEL_NAME: "إسم المجلد" - LABEL_PARENT: "المجلد الأساسي" - BUTTON_CREATE: "إنشاء" - BUTTON_CANCEL: "إلغاء" - BUTTON_CLOSE: "إغلاق" - TITLE_CREATING_PROCESS: "يتم إنشاء المجلد" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "دمج جميع الرسائل من المجلد؟" - BUTTON_CLEAR: "Clear" - BUTTON_CANCEL: "إلغاء" - BUTTON_CLOSE: "إغلاق" - DANGER_DESC_WARNING: "تحذير!" - DANGER_DESC_HTML_1: "هذا الإجراء سينجم عنه إزالة جميع محتويات المجلد %FOLDER% بشكل كامل" - DANGER_DESC_HTML_2: "في حال بدء العملية , فلا يمكن ايقافها او الغائها" - TITLE_CLEARING_PROCESS: "...يتم دمج المجلد" - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "OpenPGP استيراد مفتاح" - BUTTON_IMPORT_OPEN_PGP_KEY: "استيراد" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "عرض OpenPGP key" - BUTTON_SELECT: "تحديد" - BUTTON_CLOSE: "إغلاق" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "OpenPGP توليد مفتاح" - LABEL_EMAIL: "البريد الإلكتروني" - LABEL_NAME: "الإسم" - LABEL_PASSWORD: "كلمة السر" - LABEL_KEY_BIT_LENGTH: "طول المفتاح" - BUTTON_GENERATE_OPEN_PGP_KEYS: "قم بالتوليد" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" - LABEL_SIGN: "تسجيل" - LABEL_ENCRYPT: "تشفير" - LABEL_PASSWORD: "كلمة السر" - BUTTON_SIGN: "تسجيل" - BUTTON_ENCRYPT: "تشفير" - BUTTON_SIGN_AND_ENCRYPT: "سجل و قم بالتشفير" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP فك تشفير" - LABEL_KEY: "مفتاح خاص" - LABEL_PASSWORD: "كلمة السر" - BUTTON_DECRYPT: "فك تشفير" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "التأكد من الهوية على مرحلتين" - LABEL_CODE: "الكود" - BUTTON_TEST: "تجريب" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "إنشاء عامل تصفية؟" - TITLE_EDIT_FILTER: "تحديث عامل التصفية؟" - FILTER_NAME: "الإسم" - LEGEND_CONDITIONS: "الشروط" - LEGEND_ACTIONS: "التطبيقات" - BUTTON_DONE: "إنتهاء" - BUTTON_ADD_CONDITION: "إضافة تطبيق" - SELECT_ACTION_NONE: "None" - SELECT_ACTION_MOVE_TO: "إنقل الى" - SELECT_ACTION_FORWARD_TO: "أعد التوجيه الى" - SELECT_ACTION_REJECT: "الرفض" - SELECT_ACTION_VACATION_MESSAGE: "رسالة العطلة" - SELECT_ACTION_DISCARD: "تجاهل" - SELECT_FIELD_FROM: "من" - SELECT_FIELD_RECIPIENTS: "المستلمين (الى أو نسخة الى)" - SELECT_FIELD_SUBJECT: "الموضوع" - SELECT_FIELD_HEADER: "Header" - SELECT_FIELD_SIZE: "الحجم" - SELECT_TYPE_CONTAINS: "يحتوي" - SELECT_TYPE_NOT_CONTAINS: "لايحتوي" - SELECT_TYPE_MATCHES: "يطابق (* و ? مدعوم)" - SELECT_TYPE_NOT_MATCHES: "لايطابق (* و ? مدعوم)" - SELECT_TYPE_REGEXP: "ممنهج" - SELECT_TYPE_NOT_REGEXP: "غير ممنهج" - SELECT_TYPE_EQUAL_TO: "مساوي الى" - SELECT_TYPE_NOT_EQUAL_TO: "غير مساوي الى" - SELECT_TYPE_OVER: "فوق" - SELECT_TYPE_UNDER: "تحت" - SELECT_MATCH_ANY: "مطابق لإحدى الشروط" - SELECT_MATCH_ALL: "مطابق لجميع الشروط" - MARK_AS_READ_LABEL: "تعليمها بـ مقروءة" - REPLY_INTERVAL_LABEL: "فترة الرد (بلأيام)" - KEEP_LABEL: "الإحتفاظ بها" - STOP_LABEL: "لاتتوقف عن المعالجة بالشروط" - EMAIL_LABEL: "البريد الإلكتروني" - VACATION_SUBJECT_LABEL: "الموضوع (خياري)" - VACATION_MESSAGE_LABEL: "الرسالة" - VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" - REJECT_MESSAGE_LABEL: "رفض الرسالة" - ALL_INCOMING_MESSAGES_DESC: "جميع الرسائل الواردة" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "حدد مجلدات النظام" - SELECT_CHOOSE_ONE: "إختر واحد" - SELECT_UNUSE_NAME: "لاتستخدم" - LABEL_SENT: "أرسلت" - LABEL_DRAFTS: "المسودات" - LABEL_SPAM: "الرسائل غير المرغوب فيها" - LABEL_TRASH: "المهملات" - LABEL_ARCHIVE: "الأرشيف" - BUTTON_CANCEL: "إلغاء" - BUTTON_CLOSE: "إغلاق" - NOTIFICATION_SENT: | - You haven't selected "Sent" system folder messages are put to after sending. - If you don't want to save sent message, please select "Do not use" option. - NOTIFICATION_DRAFTS: "You haven't selected \"Drafts\" system folder messages are saved to while composing.\n" - NOTIFICATION_SPAM: | - You haven't selected "Spam" system folder spamed messages are placed to. - If you wish to remove messages permanently, please select "Do not use" option. - NOTIFICATION_TRASH: | - You haven't selected "Trash" system folder deleted messages are placed to. - If you wish to remove messages permanently, please select "Do not use" option. - NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "التحقق الثنائي (TOTP)" - LABEL_ENABLE_TWO_FACTOR: "تفعيل عملية التحقق الثنائي" - LABEL_TWO_FACTOR_USER: "المستخدم" - LABEL_TWO_FACTOR_STATUS: "الحالة" - LABEL_TWO_FACTOR_SECRET: "السر" - LABEL_TWO_FACTOR_BACKUP_CODES: "كود التحقق الإحتياطي" - BUTTON_CREATE: "قم بإنشاء سر" - BUTTON_ACTIVATE: "فعل" - BUTTON_CLEAR: "Clear" - BUTTON_LOGOUT: "تسجيل خروج" - BUTTON_DONE: "إنتهى" - BUTTON_TEST: "تجريب" - LINK_TEST: "تجريب" - BUTTON_SHOW_SECRET: "إظهار السر" - BUTTON_HIDE_SECRET: "إخفاء السر" - TWO_FACTOR_REQUIRE_DESC: "حسابك بحاجة الى إعداد مراحل التحقق الثنائية" - TWO_FACTOR_SECRET_CONFIGURED_DESC: "تم التكوين" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "لم يتم التكوين" - TWO_FACTOR_SECRET_DESC: >- - قم باستيراد هذه المعلومات لمركز توثيق غوغل باستخدام رمز الكيو-اّر او بنسخ - الكود يدوياً (or other TOTP client) - TWO_FACTOR_BACKUP_CODES_DESC: >- - إذا لم تتمكن من الحصول على الكود من مركز التوثيق في غوغل يمكنك إستخدام الكود - الإحتياطي لتسجيل الدخول,ولكن سيصبح كود الإحتياط غير فعال بعد ذلك - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "لايمكنك تغيير هذه الإعدادات بدون تجريب." - TITLES: - LOADING: "..جاري التحميل" - LOGIN: "تسجيل الدخول" - MAILBOX: "صندوق البريد" - SETTINGS: "الإعدادات" - COMPOSE: "إنشاء" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "حجم الملف كبير جداً" - ERROR_FILE_PARTIALLY_UPLOADED: "لقد تم إضافة الملف بشكل جزئي ..بسبب خطأ غير معروف" - ERROR_NO_FILE_UPLOADED: "لم تتم عملية إضافة الملفات" - ERROR_MISSING_TEMP_FOLDER: "الملف المؤقت مفقود" - ERROR_ON_SAVING_FILE: "حدث خطأ نتيجة إضافة ملف غير معروف النوع" - ERROR_FILE_TYPE: "نوع الملف مرفوض" - ERROR_UNKNOWN: "حدث خطأ نتيجة إضافة ملف غير معروف النوع" - EDITOR: - TEXT_SWITCHER_RICH_FORMATTING: "غني بالتنسيقات" - TEXT_SWITCHER_CONFIRM: "التنسيقات و الصور المضافة ستزال.. هل أنت متأكد من الإستمرار" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "الشخصي" - LABEL_GENERAL_NAME: "العام" - LABEL_CONTACTS_NAME: "جهات الإتصال" - LABEL_FOLDERS_NAME: "المجلدات" - LABEL_ACCOUNTS_NAME: "الحسابات" - LABEL_IDENTITY_NAME: "الهوية" - LABEL_IDENTITIES_NAME: "الهويات" - LABEL_FILTERS_NAME: "عوامل التصفية" - LABEL_TEMPLATES_NAME: "القوالب" - LABEL_SECURITY_NAME: "الأمان" - LABEL_SOCIAL_NAME: "الشبكات الإجتماعية" - LABEL_THEMES_NAME: "المظاهر العامة" - LABEL_CHANGE_PASSWORD_NAME: "كلمة السر" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "العودة" - SETTINGS_FILTERS: - LEGEND_FILTERS: "عوامل التصفية" - BUTTON_SAVE: "حفظ" - BUTTON_ADD_FILTER: "إضافة عامل تصفية" - BUTTON_DELETE: "حذف" - BUTTON_RAW_SCRIPT: "إستخدام سكربت مخصصة للمستخدم" - SUBNAME_NONE: "None" - SUBNAME_MOVE_TO: "\"%FOLDER%\" نقل الى" - SUBNAME_FORWARD_TO: "\"%EMAIL%\" إعادة توجيه الى" - SUBNAME_REJECT: "رفض" - SUBNAME_VACATION_MESSAGE: "رسالة العطلة" - SUBNAME_DISCARD: "تجاهل" - CAPABILITY_LABEL: "القدرة" - LOADING_PROCESS: "تحديث قائمة عوامل التصفية" - DELETING_ASK: "هل أنت متأكد؟" - CHACHES_NEED_TO_BE_SAVED_DESC: "هذه التغييرات بحاجة الى أن يتم حفظها على المخدم." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "الهوية" - LABEL_DISPLAY_NAME: "الإسم" - LABEL_REPLY_TO: "الرد-الى" - LABEL_SIGNATURE: "التوقيع" - LABEL_ADD_SIGNATURE_TO_ALL: "قم بإضافة توقيعك على جميع الرسائل الصادرة" - SETTINGS_SECURITY: - LEGEND_SECURITY: "الأمان" - LABEL_CONFIGURE_TWO_FACTOR: "تكوين عملية التأكد ثنائية المراحل" - LABEL_AUTOLOGOUT: "تسجيل الخروج التلقائي" - AUTOLOGIN_NEVER_OPTION_NAME: "أبداَ" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% دقيقة" - SETTINGS_GENERAL: - LEGEND_GENERAL: "عام" - LABEL_LANGUAGE: "اللغة" - LABEL_IDENTITY: "الهوية" - LABEL_LAYOUT: "التصميم" - LABEL_LAYOUT_NO_SPLIT: "بدون إنقسام" - LABEL_LAYOUT_VERTICAL_SPLIT: "إنقسام عمودي" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "إنقسام أفقي" - LABEL_EDITOR: "المحرر النصي الأساسي" - LABEL_EDITOR_HTML: "Html" - LABEL_EDITOR_PLAIN: "عادي" - LABEL_EDITOR_HTML_FORCED: "Html (إجباري)" - LABEL_EDITOR_PLAIN_FORCED: "عادي (إجباري)" - LABEL_ANIMATION: "مؤثرات الواجهة الحية" - LABEL_ANIMATION_FULL: "كامل" - LABEL_ANIMATION_NORMAL: "عادي" - LABEL_ANIMATION_NONE: "بدون" - LABEL_VIEW_OPTIONS: "إظهار الخيارات" - LABEL_USE_PREVIEW_PANE: "استخدام جزئية العرض الجانبي" - LABEL_USE_CHECKBOXES_IN_LIST: "عرض مربعات التحديد في القائمة" - LABEL_USE_THREADS: "إستخدام المواضيع" - LABEL_REPLY_SAME_FOLDER: "ضع الردود في مجلد الرسالة التي يتم الرد عليها" - LABEL_SHOW_IMAGES: "قم دائماَ بعرض الصور القادمة في الرسالة" - LABEL_SHOW_ANIMATION: "أظهر التأثيرات الخاصة" - LABEL_MESSAGE_PER_PAGE: "الرسائل في الصفحة" - LABEL_NOTIFICATIONS: "التنبيهات" - LABEL_SOUND_NOTIFICATION: "صوت التنبيهات" - LABEL_CHROME_NOTIFICATION_DESC: "إظهار نافذة منبثقة في حالة قدوم ايميل جديد" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(تم إعتراضها من قبل المتصفح)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "جهات الإتصال" - LABEL_CONTACTS_AUTOSAVE: "قم باضافة المستلمين تلقائيا الى دفتر العناوين" - LEGEND_CONTACTS_SYNC: "(CardDAV)التزامن عن بعد" - LABEL_CONTACTS_SYNC_ENABLE: "تفعيل التزامن عن بعد" - LABEL_CONTACTS_SYNC_SERVER: "المخدم" - LABEL_CONTACTS_SYNC_AB_URL: "وصلة دفتر العناوين" - LABEL_CONTACTS_SYNC_USER: "المستخدم" - LABEL_CONTACTS_SYNC_PASSWORD: "كلمة السر" - SETTINGS_THEMES: - LEGEND_THEMES: "المظاهر العامة" - LEGEND_THEMES_CUSTOM: "تجهيز المظهر المخصص" - LABEL_CUSTOM_TYPE: "النوع" - LABEL_CUSTOM_TYPE_LIGHT: "فاتح" - LABEL_CUSTOM_TYPE_DARK: "غامق" - LABEL_CUSTOM_BACKGROUND_IMAGE: "الخلفية" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "(JPG, PNG)حمل صورة الخلفية" - ERROR_FILE_IS_TOO_BIG: "حجم الملف كبير جداً" - ERROR_FILE_TYPE_ERROR: "مسموحة فقط(JPG,PNG)نوع الملف خطأ" - ERROR_UNKNOWN: "حدث خطأ أثناء رفع الملف" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "غوغل" - BUTTON_GOOGLE_CONNECT: "إتصل بغوغل" - BUTTON_GOOGLE_DISCONNECT: "إفصل الإتصال مع غوغل" - MAIN_GOOGLE_DESC: "بعد تفعيل الإتصال مع غوغل.. يمكنك تسجيل الدخول الى حسابك باستخدام زر غوغل على صفحة تسجيل الدخول" - LEGEND_FACEBOOK: "فيسبوك" - BUTTON_FACEBOOK_CONNECT: "إتصل بفيسبوك" - BUTTON_FACEBOOK_DISCONNECT: "إفصل الإتصال مع فيسبوك" - MAIN_FACEBOOK_DESC: "بعد تفعيل الإتصال مع فيسبوك.. يمكنك تسجيل الدخول الى حسابك باستخدام زر فيسبوك على صفحة تسجيل الدخول" - LEGEND_TWITTER: "تويتر" - BUTTON_TWITTER_CONNECT: "إتصل بتويتر" - BUTTON_TWITTER_DISCONNECT: "إفصل الإتصال بتويتر" - MAIN_TWITTER_DESC: "بعد تفعيل الإتصال مع تويتر.. يمكنك تسجيل الدخول الى حسابك باستخدام زر تويتر على صفحة تسجيل الدخول" - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "قائمة المجلدات" - BUTTON_CREATE: "أنشأ مجلد" - BUTTON_DELETE: "حذف" - BUTTON_SUBSCRIBE: "الإشتراك" - BUTTON_UNSUBSCRIBE: "الغاء الإشتراك" - LOADING_PROCESS: "جاري تحديث قائمة المجلدات" - CREATING_PROCESS: "جاري إنشاء المجلد" - DELETING_PROCESS: "جاري حذف المجلد" - RENAMING_PROCESS: "جاري إعادة تسمية المجلد" - DELETING_ASK: "هل أنت متأكد؟" - TO_MANY_FOLDERS_DESC_1: "لديك الكثير من المجلدات!" - TO_MANY_FOLDERS_DESC_2: "لقد قمنا بإظهار جزء منهم تفادياَ لضعف الأداء" - HELP_DELETE_FOLDER: "إحذف المجلد" - HELP_SHOW_HIDE_FOLDER: "إخفاء\\إظهار المجلد" - HELP_CHECK_FOR_NEW_MESSAGES: "تأكد\\لاتتأكد من وصول ايميلات جديدة" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "الحسابات" - LEGEND_IDENTITIES: "الهويات" - LEGEND_ACCOUNTS_AND_IDENTITIES: "الحسابات و الهويات" - BUTTON_ADD_ACCOUNT: "قم باضافة حساب" - BUTTON_ADD_IDENTITY: "قم باضافة هوية" - BUTTON_DELETE: "إحذف" - LOADING_PROCESS: "..جاري التحميل" - DELETING_ASK: "هل أنت متأكد؟" - DEFAULT_IDENTITY_LABEL: "الافتراضي" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "الهوية" - LEGEND_IDENTITIES: "الهويات الإضافية" - LABEL_DEFAULT: "الافتراضي" - LABEL_DISPLAY_NAME: "الإسم" - LABEL_REPLY_TO: "الرد-الى" - LABEL_SIGNATURE: "التوفيع" - LABEL_ADD_SIGNATURE_TO_ALL: "قم باضافة التوقيع الى جميع الرسائل الصادرة" - BUTTON_ADD_IDENTITY: "قم بإضافة هوية" - BUTTON_DELETE: "حذف" - LOADING_PROCESS: "جاري تحديث قائمة الهويات" - DELETING_ASK: "هل أنت متأكد؟" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "غيّر كلمة السر" - LABEL_CURRENT_PASSWORD: "كلمة السر الحالية" - LABEL_NEW_PASSWORD: "كلمة السر الجديدة" - LABEL_REPEAT_PASSWORD: "تأكيد كلمة السر الجديدة" - BUTTON_UPDATE_PASSWORD: "تعيين كلمة السر الجديدة" - ERROR_PASSWORD_MISMATCH: "كلمات السر غير متطابقة,لطفاَ أعد كتابتها" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "OpenPGP إستيراد مفتاح" - BUTTON_GENERATE_OPEN_PGP_KEYS: "OpenPGP توليد مفتاح" - TITLE_PRIVATE: "خاص" - TITLE_PUBLIC: "عام" - DELETING_ASK: "هل أنت متأكد؟" - GENERATE_ONLY_HTTPS: "HTTPS فقط" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "مساعدة في إختصارات لوحة المفاتيح" - TAB_MAILBOX: "صندوق البريد" - TAB_MESSAGE_LIST: "قائمة الرسائل" - TAB_MESSAGE_VIEW: "عرض الرسائل" - TAB_COMPOSE: "إنشاء" - LABEL_OPEN_USER_DROPDOWN: "فتح نافذة الأعضاء المنبثقة" - LABEL_REPLY: "الرد" - LABEL_REPLY_ALL: "الرد للجميع" - LABEL_FORWARD: "إعادة التوجيه" - LABEL_FORWARD_MULTIPLY: "إعادة التوجيه كملف مرفق" - LABEL_HELP: "المساعدة" - LABEL_CHECK_ALL: "تحديد جميع الرسائل" - LABEL_ARCHIVE: "أرشيف" - LABEL_DELETE: "حذف" - LABEL_OPEN_THREAD: "فتح المواضيع المحددة" - LABEL_MOVE: "نقل" - LABEL_READ: "إقرأ الرسائل المحددة" - LABEL_UNREAD: "لاتقم بقراءة الرسائل المحددة" - LABEL_IMPORTANT: "هام, النجمة/العلم الرسائل المحددة" - LABEL_SEARCH: "بحث" - LABEL_CANCEL_SEARCH: "إلغاء البحث" - LABEL_FULLSCREEN_ENTER: "وضع ملء الشاشة" - LABEL_VIEW_MESSAGE_ENTER: "مشاهدة الرسائل (بدون نافذة المشاهدة)" - LABEL_SWITCH_TO_MESSAGE: "تحويل التركيز الى الرسائل المحددة" - LABEL_SWITCH_TO_FOLDER_LIST: "تحويل التركيز الى قائمة المجلدات" - LABEL_FULLSCREEN_TOGGLE: "تفعيل وضعية ملء الشاشة" - LABEL_BLOCKQUOTES_TOGGLE: "إقتباس الرسائل" - LABEL_THREAD_NEXT: "الرسالة التالية في الموضوع" - LABEL_THREAD_PREV: "الرسالة السابقة من الموضوع" - LABEL_PRINT: "طباعة" - LABEL_EXIT_FULLSCREEN: "الخروج من وضع ملء الشاشة" - LABEL_CLOSE_MESSAGE: "إغلاق الرسالة (بدون نافذة العرض)" - LABEL_SWITCH_TO_LIST: "تحويل التركيز الى قائمة الرسائل" - LABEL_OPEN_COMPOSE_POPUP: "إفتح نافذة خاصة لإنشاء الرسائل" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "فتح قائمة الهويات" - LABEL_SAVE_MESSAGE: "حفظ الرسالة" - LABEL_SEND_MESSAGE: "إرسال الرسالة" - LABEL_CLOSE_COMPOSE: "إغلاق الرسالة" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "لم يتم إيجاد المفتاح العام" - NO_PUBLIC_KEYS_FOUND_FOR: "لم يتم إيجاد مفتاح عام\"%EMAIL%\" email" - NO_PRIVATE_KEY_FOUND: "لم يتم إيجاد مفتاح خاص" - NO_PRIVATE_KEY_FOUND_FOR: "لم يتم إيجاد المفتاح الخاص لـ \"%EMAIL%\" email" - ADD_A_PUBLICK_KEY: "Add a public key" - UNVERIFIRED_SIGNATURE: "توقيع غير موثق" - DECRYPTION_ERROR: "OpenPGP خطأ فك تشفير" - GOOD_SIGNATURE: "توقيع جيد من %USER%" - PGP_ERROR: "OpenPGP error: %ERROR%" - SPECIFY_FROM_EMAIL: "يرجى التأكد من الإيميل" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "يرجى تحديد مستلم واحد على الأقل" - NOTIFICATIONS: - INVALID_TOKEN: "خاطىء token" - AUTH_ERROR: "خطأ في كلمة السر \\اسم المستخدم" - ACCESS_ERROR: "خطأ في الوصول" - CONNECTION_ERROR: "لايمكن الإتصال بالمخدم" - CAPTCHA_ERROR: "رمز تحقق خاطىء." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- - إن المعرف الإجتماعي غير مرتبط بـ أي حساب حالياَ. سجل الدخول الى مركز التوثيق - في بريدك الإلكتروني وفعل هذه الخاصية في إعدادات حسابك - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- - إن المعرف الإجتماعي غير مرتبط بـ أي حساب حالياَ. سجل الدخول الى مركز التوثيق - في بريدك الإلكتروني وفعل هذه الخاصية في إعدادات حسابك - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- - إن المعرف الإجتماعي غير مرتبط بـ أي حساب حالياَ. سجل الدخول الى مركز التوثيق - في بريدك الإلكتروني وفعل هذه الخاصية في إعدادات حسابك - DOMAIN_NOT_ALLOWED: "غير مسموح لهذا الموقع" - ACCOUNT_NOT_ALLOWED: "الحساب غير مسموح له" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "عامل التحقق الثنائي من الهوية مطلوب" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "خطأ في عملية التحقق الثنائية" - COULD_NOT_SAVE_NEW_PASSWORD: "لم نتمكن من حفظ كلمة السر الجديدة" - CURRENT_PASSWORD_INCORRECT: "كلمة السر الحالية خاطئة" - NEW_PASSWORD_SHORT: "كلمة السر قصيرة جداً" - NEW_PASSWORD_WEAK: "كلمة السر سهلة جداً" - NEW_PASSWORD_FORBIDDENT: "كلمة السر تحتوي على محارف غير مسموح بها" - CONTACTS_SYNC_ERROR: "خطأ في مزامنة جهات الإتصال" - CANT_GET_MESSAGE_LIST: "لايمكن الوصول الى قائمة الرسائل" - CANT_GET_MESSAGE: "لايمكن الوصول الى الرسالة" - CANT_DELETE_MESSAGE: "لايمكن حذف الرسالة" - CANT_MOVE_MESSAGE: "لايمكن نقل الرسالة" - CANT_SAVE_MESSAGE: "لايمكن حفظ الرسالة" - CANT_SEND_MESSAGE: "لايمكن إرسال الرسالة" - INVALID_RECIPIENTS: "يرجى التأكد من عناوين المرسل اليهم" - CANT_SAVE_FILTERS: "لايمكن حفظ عامل التصفية" - CANT_GET_FILTERS: "لايمكن الوصول الى عوامل التصفية" - FILTERS_ARE_NOT_CORRECT: "عوامل التصفية خطأ" - CANT_CREATE_FOLDER: "لايمكن إنشاء مجلد" - CANT_RENAME_FOLDER: "لايمكن إعادة تسمية المجلد" - CANT_DELETE_FOLDER: "لايمكن حذف المجلد" - CANT_DELETE_NON_EMPTY_FOLDER: "لايمكن حذف مجلد ممتلأ" - CANT_SUBSCRIBE_FOLDER: "لايمكن الإشتراك بالمجلد" - CANT_UNSUBSCRIBE_FOLDER: "لايمكن حذف الإشتراك من المجلد" - CANT_SAVE_SETTINGS: "لايمكن حفظ الإعدادات" - CANT_SAVE_PLUGIN_SETTINGS: "لايمكن حفظ الإعدادات" - DOMAIN_ALREADY_EXISTS: "الموقع موجود مسبقاَ" - CANT_INSTALL_PACKAGE: "فشل في تنزيل الحزمة" - CANT_DELETE_PACKAGE: "فشل في إزالة الحزمة" - INVALID_PLUGIN_PACKAGE: "خطأ في الحزمة المراد تنزيلها" - UNSUPPORTED_PLUGIN_PACKAGE: "حزمة غير مدعومة" - LICENSING_SERVER_IS_UNAVAILABLE: "مخدم الإشتراكات غير متوفر" - LICENSING_DOMAIN_EXPIRED: "الإشتراك لهذا الموقع قد انتهى" - LICENSING_DOMAIN_BANNED: "الإشتراك لهذا الموقع قد تم حجبه" - DEMO_SEND_MESSAGE_ERROR: "لأسباب أمنية, هذا الحساب غير مسموح له إرسال رسائل" - DEMO_ACCOUNT_ERROR: "لأسباب أمنية , هذا الحساب قد منع من هذا الإجراء" - ACCOUNT_ALREADY_EXISTS: "الحساب موجود مسبقاَ" - ACCOUNT_DOES_NOT_EXIST: "الحساب المطلوب غير موجود" - MAIL_SERVER_ERROR: "حدث خطأ أثناء محاولة الوصول الى المخدم البريدي" - INVALID_INPUT_ARGUMENT: "Invalid input argument" - UNKNOWN_ERROR: "خطأ غير معروف" - STATIC: - BACK_LINK: "إعادة التحميل" - DOMAIN_LIST_DESC: "قائمة المواقع البريدية المسموح فيها لهذا البريد بالوصول" - PHP_EXSTENSIONS_ERROR_DESC: "!إضافات الـ بي إتش بي المطلوبة,غير متوافرة في إعدادات الـ بي إتش بي لديك" - PHP_VERSION_ERROR_DESC: "أقل من الإصدار المطلوب 5.3.0!(%VERSION%) PHP إصدار" - NO_SCRIPT_TITLE: "الجافا سكريبت مطلوبة لهذا البرنامج" - NO_SCRIPT_DESC: |- - إن متصفحك لايدعم الجافا سكريبت . يرجى تفعيل الدعم أو تجريب متصفح أخر - NO_COOKIE_TITLE: "Cookies support is required for this application." - NO_COOKIE_DESC: | - Cookies support is not available in your browser. - Please enable Cookie support in your browser settings and retry. - BAD_BROWSER_TITLE: "متصفحك بحاجة الى تحديث" - BAD_BROWSER_DESC: |- - لإصتخدام جميع ميزات هذا البرنامج يرجى تنزيل أحد المتصفحات التالية الداعمة: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/bg_BG.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/bg_BG.yml deleted file mode 100755 index 53bbc3df..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/bg_BG.yml +++ /dev/null @@ -1,713 +0,0 @@ -bg_BG: - LOGIN: - LABEL_EMAIL: "Акаунт" - LABEL_LOGIN: "Логин" - LABEL_PASSWORD: "Парола" - LABEL_SIGN_ME: "Впиши ме" - LABEL_VERIFICATION_CODE: "Код за потвърждение" - LABEL_DONT_ASK_VERIFICATION_CODE: "Не питай за код в продължение на 2 седмици" - BUTTON_SIGN_IN: "Вход" - TITLE_SIGN_IN_GOOGLE: "Вход с Google" - TITLE_SIGN_IN_FACEBOOK: "Вход с Facebook" - TITLE_SIGN_IN_TWITTER: "Вход с Twitter" - LABEL_FORGOT_PASSWORD: "Забравена парола" - LABEL_REGISTRATION: "Регистрация" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Добави акаунт" - BUTTON_SETTINGS: "Настройки" - BUTTON_HELP: "Помощ" - BUTTON_LOGOUT: "Изход" - MOBILE: - BUTTON_MOBILE_VERSION: "Мобилна версия" - BUTTON_DESKTOP_VERSION: "Десктоп версия" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Търсене" - TITLE_ADV: "Разширено търсене" - LABEL_ADV_FROM: "От" - LABEL_ADV_TO: "За" - LABEL_ADV_SUBJECT: "Заглавие" - LABEL_ADV_TEXT: "Текст" - LABEL_ADV_HAS_ATTACHMENT: "Има приложен файл" - LABEL_ADV_HAS_ATTACHMENTS: "Има приложени файлове" - LABEL_ADV_FLAGGED: "Отбелязано с флаг" - LABEL_ADV_UNSEEN: "Невидяно" - LABEL_ADV_DATE: "Дата" - LABEL_ADV_DATE_ALL: "Всички" - LABEL_ADV_DATE_3_DAYS: "До 3 дена" - LABEL_ADV_DATE_7_DAYS: "До 1 седмица" - LABEL_ADV_DATE_MONTH: "До 1 месец" - LABEL_ADV_DATE_3_MONTHS: "До 3 месеца" - LABEL_ADV_DATE_6_MONTHS: "До 6 месеца" - LABEL_ADV_DATE_YEAR: "До 1 година" - BUTTON_ADV_SEARCH: "Търси" - PREVIEW_POPUP: - FULLSCREEN: "На цял екран" - ZOOM: "Приближи/отдалечи" - CLOSE: "Затваряне (Esc)" - LOADING: "Зареждане..." - GALLERY_PREV: "Предишно (Бутон лява стрелка)" - GALLERY_NEXT: "Следващо (Бутон дясна стрелка)" - GALLERY_COUNTER: "%curr% от %total%" - IMAGE_ERROR: "Изображението не беше заредено." - AJAX_ERROR: "Съдържанието не беше заредено." - FOLDER_LIST: - BUTTON_COMPOSE: "Създай" - BUTTON_CONTACTS: "Контакти" - BUTTON_NEW_MESSAGE: "Ново съобщение" - INBOX_NAME: "Вх. кутия" - SENT_NAME: "Изпратени" - DRAFTS_NAME: "Чернови" - SPAM_NAME: "Спам" - TRASH_NAME: "Кошче" - ARCHIVE_NAME: "Архив" - QUOTA: - TITLE: "Използване по дялове" - MESSAGE_LIST: - BUTTON_RELOAD: "Презареди списъка със съобщения" - BUTTON_MOVE_TO: "Премести в" - BUTTON_DELETE: "Изтрий" - BUTTON_ARCHIVE: "Архивирай" - BUTTON_SPAM: "Спам" - BUTTON_NOT_SPAM: "Не е спам" - BUTTON_EMPTY_FOLDER: "Изчисти папката" - BUTTON_MULTY_FORWARD: "Препрати като прикачен/и файл/ове" - BUTTON_DELETE_WITHOUT_MOVE: "Изтриване завинаги" - BUTTON_MORE: "Още" - MENU_SET_SEEN: "Маркирай като прочетено" - MENU_SET_ALL_SEEN: "Маркирай всички като прочетени" - MENU_UNSET_SEEN: "Маркиране като непрочетено" - MENU_SET_FLAG: "Отбележи с флаг" - MENU_UNSET_FLAG: "Премахни флага" - MENU_SELECT_ALL: "Всичко" - MENU_SELECT_NONE: "Нито едно" - MENU_SELECT_INVERT: "Размени" - MENU_SELECT_UNSEEN: "Непрочетени" - MENU_SELECT_SEEN: "Прочетени" - MENU_SELECT_FLAGGED: "Маркирани с флаг" - MENU_SELECT_UNFLAGGED: "С премахнат флаг" - EMPTY_LIST: "Празен списък." - EMPTY_SEARCH_LIST: "Няма съобщения, които да отговарят на търсенето." - SEARCH_RESULT_FOR: "Резултати от търсенето за \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "Обратно при съобщенията" - LIST_LOADING: "Зареждане" - EMPTY_SUBJECT_TEXT: "(Няма заглавие)" - PUT_MESSAGE_HERE: "Пуснете съобщението тук, за да го видите в списъка" - TODAY_AT: "днес в %TIME%" - YESTERDAY_AT: "вчера в %TIME%" - SEARCH_PLACEHOLDER: "Търсене" - NEW_MESSAGE_NOTIFICATION: "Имате %COUNT% нови съобщения!" - QUOTA_SIZE: "Използване на %SIZE% (%PROC%%) от вашите %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Редактирай" - BUTTON_BACK: "Назад" - BUTTON_CLOSE: "Затвори" - BUTTON_DELETE: "Изтрий" - BUTTON_UNSUBSCRIBE: "Отписване от този лист" - BUTTON_ARCHIVE: "Архивирай" - BUTTON_SPAM: "Спам" - BUTTON_NOT_SPAM: "Не е спам" - BUTTON_MOVE_TO: "Премести в" - BUTTON_MORE: "Още" - BUTTON_REPLY: "Отговори" - BUTTON_REPLY_ALL: "Отговори на всички" - BUTTON_FORWARD: "Препрати" - BUTTON_FORWARD_AS_ATTACHMENT: "Препрати като прикрепен файл" - BUTTON_EDIT_AS_NEW: "Редактирай като ново" - BUTTON_SHOW_IMAGES: "Показване на външните изображения" - BUTTON_NOTIFY_READ_RECEIPT: "Изпращачът е помолил да бъде уведомен, когато прочетете това съобщение." - BUTTON_IN_NEW_WINDOW: "Прегледай в отделен прозорец" - BUTTON_THREAD_LIST: "Списък с разговори" - BUTTON_THREAD_PREV: "Предишно" - BUTTON_THREAD_NEXT: "Следващо" - BUTTON_THREAD_MORE: "Още съобщения" - MENU_HEADERS: "Покажи хедъра на съобщението" - MENU_VIEW_ORIGINAL: "Покажи източника" - MENU_DOWNLOAD_ORIGINAL: "Изтегли като .eml файл" - MENU_FILTER_SIMILAR: "Филтрирай съобщения като това" - MENU_PRINT: "Принтирай" - EMPTY_SUBJECT_TEXT: "(Няма заглавие)" - LABEL_SUBJECT: "Заглавие" - LABEL_DATE: "Дата" - LABEL_FROM: "От" - LABEL_FROM_SHORT: "от" - LABEL_TO: "До" - LABEL_TO_SHORT: "до" - LABEL_CC: "Копие до" - LABEL_BCC: "Скрито копие до" - LABEL_REPLY_TO: "Отговори на" - PRINT_LABEL_FROM: "От" - PRINT_LABEL_TO: "До" - PRINT_LABEL_CC: "Копие до" - PRINT_LABEL_BCC: "Скрито копие до" - PRINT_LABEL_REPLY_TO: "Отговори на" - PRINT_LABEL_DATE: "Дата" - PRINT_LABEL_SUBJECT: "Заглавие" - PRINT_LABEL_ATTACHMENTS: "Прикрепени файлове" - MESSAGE_LOADING: "Зареждане" - MESSAGE_VIEW_DESC: "Изберете съобщение, за да го видите тук." - MESSAGE_VIEW_MOVE_DESC: "Изберете цел от папките в лявото поле" - PGP_PASSWORD_INPUT_PLACEHOLDER: "Парола" - PGP_SIGNED_MESSAGE_DESC: "Подписано с OpenPGP (кликни за проверка)" - PGP_ENCRYPTED_MESSAGE_DESC: "Шифровано с OpenPGP (кликни за проверка)" - LINK_DOWNLOAD_AS_ZIP: "Свали като ZIP файл" - LINK_SAVE_TO_OWNCLOUD: "Запази в ownCloud" - LINK_SAVE_TO_CLOUD: "Запазване в облака" - LINK_SAVE_TO_DROPBOX: "Запази в Dropbox" - READ_RECEIPT: - SUBJECT: "Обратна разписка (видяно) - %SUBJECT%" - BODY: | - Това е обратна разписка за съобщението, което изпратихте до %READ-RECEIPT%. - - Note: Тази обратна разписка само указва, че съобщението е показано на компютъра на получателя. - Няма гаранция, че получателят е прочел или разбрал съдържанието на съобщението. - SUGGESTIONS: - SEARCHING_DESC: "Търсене..." - CONTACTS: - LEGEND_CONTACTS: "Контакти" - SEARCH_INPUT_PLACEHOLDER: "Търсене" - BUTTON_ADD_CONTACT: "Добави контакт" - BUTTON_CREATE_CONTACT: "Създай" - BUTTON_UPDATE_CONTACT: "Обнови" - BUTTON_IMPORT: "Импортирай (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Експортирай (vcf, vCard)" - BUTTON_EXPORT_CSV: "Експортирай (csv)" - ERROR_IMPORT_FILE: "Грешка при импортирането (невалиден формат на файла)" - LIST_LOADING: "Зареждане" - EMPTY_LIST: "Тук няма контакти" - EMPTY_SEARCH: "Не са намерени контакти" - CLEAR_SEARCH: "Изчистване на търсенето" - CONTACT_VIEW_DESC: "Изберете контакт от списъка, за да го видите тук." - LABEL_DISPLAY_NAME: "Показване на име" - LABEL_EMAIL: "Имейл" - LABEL_PHONE: "Телефон" - LABEL_WEB: "Страница" - LABEL_BIRTHDAY: "Рожден ден" - LINK_ADD_EMAIL: "Добави имейл адрес" - LINK_ADD_PHONE: "Добави телефон" - LINK_BIRTHDAY: "Рожден ден" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Въвеждете името, което ще се показва" - PLACEHOLDER_ENTER_LAST_NAME: "Въведете фамилия" - PLACEHOLDER_ENTER_FIRST_NAME: "Въведете име" - PLACEHOLDER_ENTER_NICK_NAME: "Въведете прякор" - LABEL_READ_ONLY: "Само за четене" - LABEL_SHARE: "Сподели" - ADD_MENU_LABEL: "Добави" - ADD_MENU_NICKNAME: "Прякор" - ADD_MENU_NOTES: "Бележки" - ADD_MENU_EMAIL: "Имейл" - ADD_MENU_PHONE: "Телефон" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Адрес" - ADD_MENU_BIRTHDAY: "Рожден ден" - ADD_MENU_TAGS: "Етикети" - BUTTON_SHARE_NONE: "Няма" - BUTTON_SHARE_ALL: "Всички" - BUTTON_SYNC: "Синхронизация (CardDAV)" - COMPOSE: - TITLE_FROM: "От" - TITLE_TO: "За" - TITLE_CC: "Копие до" - TITLE_BCC: "Скрито копие до" - TITLE_REPLY_TO: "Отговори на" - TITLE_SUBJECT: "Заглавие" - LINK_SHOW_INPUTS: "покажи всички полета" - BUTTON_SEND: "Изпрати" - BUTTON_SAVE: "Запази" - BUTTON_DELETE: "Изтрий" - BUTTON_CANCEL: "Отказ" - BUTTON_MINIMIZE: "Свий прозореца" - SAVED_TIME: "Запазено в %TIME%" - SAVED_ERROR_ON_SEND: "Съобщението беше изпратено, но не беше запазено в папката с изпратени съобщения" - DISCARD_UNSAVED_DATA: "Изтрий незапаметеното?" - ATTACH_FILES: "Прикрепете файлове" - ATTACH_DROP_FILES_DESC: "Пуснете файловете тук" - ATTACH_ITEM_CANCEL: "Отказ" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% написа" - FORWARD_MESSAGE_TOP_TITLE: "-------- Препратено съобщение -------" - FORWARD_MESSAGE_TOP_FROM: "От" - FORWARD_MESSAGE_TOP_TO: "За" - FORWARD_MESSAGE_TOP_CC: "Копие до" - FORWARD_MESSAGE_TOP_SENT: "Изпратено" - FORWARD_MESSAGE_TOP_SUBJECT: "Заглавие" - EMPTY_TO_ERROR_DESC: "Моля, изберте поне един получател" - NO_ATTACHMENTS_HERE_DESC: "Няма прикрепени файлове." - ATTACHMENTS_ERROR_DESC: "Внимание! Не всички прикачени файлове са качени." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Все още не са качени всички прикрепени файлове" - BUTTON_REQUEST_READ_RECEIPT: "Поискайте разписка за прочитане на съобщението" - BUTTON_MARK_AS_IMPORTANT: "Отбележи като важно" - BUTTON_OPEN_PGP: "OpenPGP (Чист текст)" - BUTTON_REQUEST_DSN: "Уведомяване при доставка" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Затвори" - POPUPS_ASK: - BUTTON_YES: "Да" - BUTTON_NO: "Не" - DESC_WANT_CLOSE_THIS_WINDOW: "Сигурни ли сте, че желаете да затворите този прозорец?" - DESC_WANT_DELETE_MESSAGES: "Сигурни ли сте, че желаете да изтриете съобщението/съобщенията?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Избери език" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Добавяне на акаунт?" - BUTTON_ADD_ACCOUNT: "Добави" - TITLE_UPDATE_ACCOUNT: "Обнови акаунта?" - BUTTON_UPDATE_ACCOUNT: "Обнови" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Добавяне на идентичност?" - TITLE_UPDATE_IDENTITY: "Обновяване на идентичност?" - BUTTON_ADD_IDENTITY: "Добавяне" - BUTTON_UPDATE_IDENTITY: "Обновяване" - LABEL_EMAIL: "Имейл" - LABEL_NAME: "Име" - LABEL_REPLY_TO: "Отговорете на" - LABEL_SIGNATURE: "Подпис" - LABEL_CC: "Копие до" - LABEL_BCC: "Скрито копие до" - LABEL_SIGNATURE_INSERT_BEFORE: "Подписа да се поставя преди цитирания текст при отговор" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Създаване на папка?" - LABEL_NAME: "Име на папка" - LABEL_PARENT: "Родителска папка" - BUTTON_CREATE: "Създай" - BUTTON_CANCEL: "Отказ" - BUTTON_CLOSE: "Затвори" - TITLE_CREATING_PROCESS: "Създаване на папка" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Прочистване на всички съобщения от папката?" - BUTTON_CLEAR: "Изчисти" - BUTTON_CANCEL: "Отказ" - BUTTON_CLOSE: "Затвори" - DANGER_DESC_WARNING: "Внимание!" - DANGER_DESC_HTML_1: "Това действие ще доведе до премахването на всички мейли от папката %FOLDER%." - DANGER_DESC_HTML_2: "Веднъж започнат, този процес не може да бъде прекратен или отказан." - TITLE_CLEARING_PROCESS: "Прочистване на папката..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Внасяне на OpenPGP ключ" - BUTTON_IMPORT_OPEN_PGP_KEY: "Внеси" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Виж OpenPGP ключа" - BUTTON_SELECT: "Избери" - BUTTON_CLOSE: "Затвори" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Създаване на OpenPGP ключове" - LABEL_EMAIL: "Email" - LABEL_NAME: "Име" - LABEL_PASSWORD: "Парола" - LABEL_KEY_BIT_LENGTH: "Дължина на ключа" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Създай" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "Подпиши/шифровай с OpenPGP" - LABEL_SIGN: "Подпиши" - LABEL_ENCRYPT: "Шифровай" - LABEL_PASSWORD: "Парола" - BUTTON_SIGN: "Подпиши" - BUTTON_ENCRYPT: "Шифровай" - BUTTON_SIGN_AND_ENCRYPT: "Подпиши и шифровай" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "Дешифриране с OpenPGP" - LABEL_KEY: "Частен ключ" - LABEL_PASSWORD: "Парола" - BUTTON_DECRYPT: "Дешифрирай" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "Двустъпков тест за удостоверяване" - LABEL_CODE: "Код" - BUTTON_TEST: "Тест" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Въздай филтър?" - TITLE_EDIT_FILTER: "Обнови филтъра?" - FILTER_NAME: "Име" - LEGEND_CONDITIONS: "Условия" - LEGEND_ACTIONS: "Действия" - BUTTON_DONE: "Готово" - BUTTON_ADD_CONDITION: "Добави условие" - SELECT_ACTION_NONE: "Няма" - SELECT_ACTION_MOVE_TO: "Премести в" - SELECT_ACTION_FORWARD_TO: "Препрати към" - SELECT_ACTION_REJECT: "Отхвърли" - SELECT_ACTION_VACATION_MESSAGE: "Съобщение в отпуска" - SELECT_ACTION_DISCARD: "Отхвърли" - SELECT_FIELD_FROM: "От" - SELECT_FIELD_RECIPIENTS: "Получатели (\"До\" и \"Копие до\")" - SELECT_FIELD_SUBJECT: "Тема" - SELECT_FIELD_HEADER: "Заглавие" - SELECT_FIELD_SIZE: "Размер" - SELECT_TYPE_CONTAINS: "Съдържа" - SELECT_TYPE_NOT_CONTAINS: "Не съдържа" - SELECT_TYPE_MATCHES: "Съвпада с (поддържат се ? и *)" - SELECT_TYPE_NOT_MATCHES: "Не съвпада с (поддържат се ? и *)" - SELECT_TYPE_REGEXP: "Регулярен израз" - SELECT_TYPE_NOT_REGEXP: "Не регулярен израз" - SELECT_TYPE_EQUAL_TO: "Равно на" - SELECT_TYPE_NOT_EQUAL_TO: "Не е равно на" - SELECT_TYPE_OVER: "Над" - SELECT_TYPE_UNDER: "Под" - SELECT_MATCH_ANY: "Съвпада с КОЕТО И ДА Е правило от" - SELECT_MATCH_ALL: "Съвпада с ВСИЧКИ правила от" - MARK_AS_READ_LABEL: "Отбележи като прочетено" - REPLY_INTERVAL_LABEL: "За колко време (дни)" - KEEP_LABEL: "Запази" - STOP_LABEL: "Да не спира да обработва правилата" - EMAIL_LABEL: "Email" - VACATION_SUBJECT_LABEL: "Тема (незадължително)" - VACATION_MESSAGE_LABEL: "Съобщение" - VACATION_RECIPIENTS_LABEL: "Получатели (разделени със запетая)" - REJECT_MESSAGE_LABEL: "Отхвърли съобщението" - ALL_INCOMING_MESSAGES_DESC: "Всички пристигащи съобщения" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Избери системни папки" - SELECT_CHOOSE_ONE: "Избери един" - SELECT_UNUSE_NAME: "Не използвай" - LABEL_SENT: "Изпратени" - LABEL_DRAFTS: "Чернови" - LABEL_SPAM: "Спам" - LABEL_TRASH: "Кошче" - LABEL_ARCHIVE: "Архив" - BUTTON_CANCEL: "Отказ" - BUTTON_CLOSE: "Затвори" - NOTIFICATION_SENT: | - Не сте избрали системна папка, в която изпратените съобщения "Изпратени" да бъдат съхранявани след изпращането им. - Ако нежелаете да запазвате изпратено съобщение, моля, изберете опцията "Не използвай". - NOTIFICATION_DRAFTS: "Не сте избрали системна папка, в която съобщенията \"Чернови\" да бъдат съхранявани по време на съставянето на имейл." - NOTIFICATION_SPAM: | - Не сте избрали системна папка, в която съобщенията "Спам" да бъдат поставяни. - Ако желаете да премахнете съобщенията окончателно, моля, изберете опцята "Не използвай". - NOTIFICATION_TRASH: | - Не сте избрали системна папка, в която изтритите съобщения "Отпадък" да бъдат поставяни. - Ако желаете да премахнете съобщенията окончателно, моля изберете опцията "Не използвай". - NOTIFICATION_ARCHIVE: "Не сте избрали истемна папка, в която архивираните съобщения \"Архив\" да бъдат поставяни." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "Двустъпкова проверка" - LABEL_ENABLE_TWO_FACTOR: "Включи двустъпковата проверка" - LABEL_TWO_FACTOR_USER: "Потребител" - LABEL_TWO_FACTOR_STATUS: "Състояние" - LABEL_TWO_FACTOR_SECRET: "Тайна" - LABEL_TWO_FACTOR_BACKUP_CODES: "Резервни кодове" - BUTTON_CREATE: "Създай нова тайна" - BUTTON_ACTIVATE: "Активирай" - BUTTON_CLEAR: "Изчисти" - BUTTON_LOGOUT: "Излез" - BUTTON_DONE: "Готово" - BUTTON_TEST: "Тест" - LINK_TEST: "тест" - BUTTON_SHOW_SECRET: "Покажи тайната" - BUTTON_HIDE_SECRET: "Скрий тайната" - TWO_FACTOR_REQUIRE_DESC: "Вашият акаунт изисква двустъпкова проверка." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Настроена" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Не е настроена" - TWO_FACTOR_SECRET_DESC: > - Внесете тази информация във вашият Google Authenticator клиент (или друг TOTP - клиент) чрез предоставения QR код или чрез въвеждане на кода ръчно. - TWO_FACTOR_BACKUP_CODES_DESC: > - Ако не можете да получавате кодове от Google Authenticator (или друг TOTP - клиент), можете да използвате резервни кодове за влизане. След като използвате - някой, той става невалиден. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Не можете да промените настройките, преди да ги тествате." - TITLES: - LOADING: "Зареждане" - LOGIN: "Вписване" - MAILBOX: "Пощенска кутия" - SETTINGS: "Настройки" - COMPOSE: "Ново съобщение" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Файлът е твърде голям" - ERROR_FILE_PARTIALLY_UPLOADED: "Файлът е частично качен поради неизвестна грешка" - ERROR_NO_FILE_UPLOADED: "Няма качен файл" - ERROR_MISSING_TEMP_FOLDER: "Временният файл липсва" - ERROR_ON_SAVING_FILE: "Възникна неизвестна грешка при записването на файла" - ERROR_FILE_TYPE: "Невалиден тип на файла" - ERROR_UNKNOWN: "Възникна неизвестна грешка при качването на файла" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> ТЕКСТ" - TEXT_SWITCHER_RICH_FORMATTING: "Форматиран текст" - TEXT_SWITCHER_CONFIRM: "Форматирането и изображенията ще бъдат изгубени. Сигурни ли сте, че желаете да продължите?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Лични" - LABEL_GENERAL_NAME: "Общи" - LABEL_CONTACTS_NAME: "Контакти" - LABEL_FOLDERS_NAME: "Папки" - LABEL_ACCOUNTS_NAME: "Акаунти" - LABEL_IDENTITY_NAME: "Идентичност" - LABEL_IDENTITIES_NAME: "Идентичности" - LABEL_FILTERS_NAME: "Филтри" - LABEL_TEMPLATES_NAME: "Шаблони" - LABEL_SECURITY_NAME: "Сигурност" - LABEL_SOCIAL_NAME: "Социални" - LABEL_THEMES_NAME: "Теми" - LABEL_CHANGE_PASSWORD_NAME: "Парола" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Назад" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Филтри" - BUTTON_SAVE: "Запази" - BUTTON_ADD_FILTER: "Добави филтър" - BUTTON_DELETE: "Изтрий" - BUTTON_RAW_SCRIPT: "Използвай специфичен потребителски скрипт" - SUBNAME_NONE: "Няма" - SUBNAME_MOVE_TO: "Премести в \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Препрати към \"%EMAIL%\"" - SUBNAME_REJECT: "Откажи" - SUBNAME_VACATION_MESSAGE: "Съобщение в отпуска" - SUBNAME_DISCARD: "Отхвърли" - CAPABILITY_LABEL: "Способности" - LOADING_PROCESS: "Обнови списъка с филтри" - DELETING_ASK: "Сигурни ли си?" - CHACHES_NEED_TO_BE_SAVED_DESC: "Промените трябва да се запаметят на сървъра." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Идентичност" - LABEL_DISPLAY_NAME: "Име" - LABEL_REPLY_TO: "Отговори на" - LABEL_SIGNATURE: "Подпис" - LABEL_ADD_SIGNATURE_TO_ALL: "Добави подпис към всички изходящи съобщения" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Сигурност" - LABEL_CONFIGURE_TWO_FACTOR: "Конфигурирай двустъпкова проверка" - LABEL_AUTOLOGOUT: "Автоматично излизане" - AUTOLOGIN_NEVER_OPTION_NAME: "Никога" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% минута(и)" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% час(а)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Общи" - LABEL_LANGUAGE: "Език" - LABEL_IDENTITY: "Идентичност" - LABEL_LAYOUT: "Стил" - LABEL_LAYOUT_NO_SPLIT: "Не разделяй" - LABEL_LAYOUT_VERTICAL_SPLIT: "Вертикално разделяне" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Хоризонтално разделяне" - LABEL_EDITOR: "Текстов редактор по подразбиране" - LABEL_EDITOR_HTML: "HTML" - LABEL_EDITOR_PLAIN: "Чист текст" - LABEL_EDITOR_HTML_FORCED: "HTML (задължително)" - LABEL_EDITOR_PLAIN_FORCED: "Чист текст (задължително)" - LABEL_ANIMATION: "Анимация в интерфейса" - LABEL_ANIMATION_FULL: "Пълна" - LABEL_ANIMATION_NORMAL: "Нормална" - LABEL_ANIMATION_NONE: "Никаква" - LABEL_VIEW_OPTIONS: "Настройки на изгледа" - LABEL_USE_PREVIEW_PANE: "Използвай поле за преглед" - LABEL_USE_CHECKBOXES_IN_LIST: "Показавай отметките в списъка" - LABEL_USE_THREADS: "Използвай групиране на съобщенията" - LABEL_REPLY_SAME_FOLDER: "Постави отговорите с папката на отговаряното съобщение" - LABEL_SHOW_IMAGES: "Винаги показвай външни картинки в текста на съобщението" - LABEL_SHOW_ANIMATION: "Покажи анимация" - LABEL_MESSAGE_PER_PAGE: "Съобщения на страница" - LABEL_NOTIFICATIONS: "Известия" - LABEL_SOUND_NOTIFICATION: "Звуково известяване" - LABEL_CHROME_NOTIFICATION_DESC: "Покажи известие при ново съобщение" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Блокирано от браузъра)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Контакти" - LABEL_CONTACTS_AUTOSAVE: "Автоматично добавяне на получателите към адресната ви книга" - LEGEND_CONTACTS_SYNC: "Отдалечено синхронизиране (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Разрешаване на отдалечено синхронизиране" - LABEL_CONTACTS_SYNC_SERVER: "Сървър" - LABEL_CONTACTS_SYNC_AB_URL: "URL на адресната книга" - LABEL_CONTACTS_SYNC_USER: "Потребител" - LABEL_CONTACTS_SYNC_PASSWORD: "Парола" - SETTINGS_THEMES: - LEGEND_THEMES: "Теми" - LEGEND_THEMES_CUSTOM: "Специфична настройка на темата" - LABEL_CUSTOM_TYPE: "Тип" - LABEL_CUSTOM_TYPE_LIGHT: "Светла" - LABEL_CUSTOM_TYPE_DARK: "Тъмна" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Фон" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Качи снимка за фон (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "Файла е прекалено голям" - ERROR_FILE_TYPE_ERROR: "Невалиден тип (Само JPG или PNG)" - ERROR_UNKNOWN: "Възникна неизвестна грешка при качването на файла" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Свържи Google" - BUTTON_GOOGLE_DISCONNECT: "Разкачи Google" - MAIN_GOOGLE_DESC: "След включването на влизане чрез Google, можете да влизате в този акаунт чрез бутона Google на началния екран." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Свържи Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Рзкачи Facebook" - MAIN_FACEBOOK_DESC: "След включването на влизане чрез Facebook, можете да влизате в този акаунт чрез бутона Facebook на началния екран." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Свържи Twitter" - BUTTON_TWITTER_DISCONNECT: "Разкачи Twitter" - MAIN_TWITTER_DESC: "След включването на влизане чрез Twitter, можете да влизате в този акаунт чрез бутона Twitter на началния екран." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Списък с папки" - BUTTON_CREATE: "Създай папка" - BUTTON_SYSTEM: "Системни папки" - BUTTON_DELETE: "Изтриване" - BUTTON_SUBSCRIBE: "Абонирай се" - BUTTON_UNSUBSCRIBE: "Отписване" - LOADING_PROCESS: "Обнови списъка с папки" - CREATING_PROCESS: "Създаване на папка" - DELETING_PROCESS: "Изтриване на папка" - RENAMING_PROCESS: "Преименуване на папка" - DELETING_ASK: "Сигурни ли сте?" - TO_MANY_FOLDERS_DESC_1: "Имате прекалено много папки!" - TO_MANY_FOLDERS_DESC_2: "Ще се показват само част от тях, за да се избегнат проблеми с производителността." - HELP_DELETE_FOLDER: "Изтрий папка" - HELP_SHOW_HIDE_FOLDER: "Покажи/скрий папка" - HELP_CHECK_FOR_NEW_MESSAGES: "Провери/не проверявай за нови съобщения" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Списък с акаунти" - LEGEND_IDENTITIES: "Идентичности" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Акаунти и идентичности" - BUTTON_ADD_ACCOUNT: "Добавяне на акаунт" - BUTTON_ADD_IDENTITY: "Добавяне на идентичност" - BUTTON_DELETE: "Изтрий" - LOADING_PROCESS: "Обновяване на списъка с акаунти" - DELETING_ASK: "Сигурни ли сте?" - DEFAULT_IDENTITY_LABEL: "по подразбиране" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Идентичност" - LEGEND_IDENTITIES: "Допълнителни идентичности" - LABEL_DEFAULT: "По подразбиране" - LABEL_DISPLAY_NAME: "Име" - LABEL_REPLY_TO: "Отговори на" - LABEL_SIGNATURE: "Подпис" - LABEL_ADD_SIGNATURE_TO_ALL: "Добавяне на вашия подпис към всички изходящи съобщения" - BUTTON_ADD_IDENTITY: "Добавяне на идентичност" - BUTTON_DELETE: "Изтрий" - LOADING_PROCESS: "Обновяване на списъка с идентичности" - DELETING_ASK: "Сигурни ли сте?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Промяна на парола" - LABEL_CURRENT_PASSWORD: "Настояща парола" - LABEL_NEW_PASSWORD: "Нова парола" - LABEL_REPEAT_PASSWORD: "Потвърдете новата парола" - BUTTON_UPDATE_PASSWORD: "Задайте нова парола" - ERROR_PASSWORD_MISMATCH: "Паролите не съвпадат, моля, опитайте отново" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Внеси OpenPGP ключ" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Генерирай OpenPGP ключ" - TITLE_PRIVATE: "Частен" - TITLE_PUBLIC: "Публичен" - DELETING_ASK: "Сигурни ли сте?" - GENERATE_ONLY_HTTPS: "Само през HTTPS" - LABEL_ALLOW_DRAFT_AUTOSAVE: "Автоматично запазване на чернова" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Помощ за клавишните комбинации" - TAB_MAILBOX: "Пощенска кутия" - TAB_MESSAGE_LIST: "Списък със съобщения" - TAB_MESSAGE_VIEW: "Изглед на съобщение" - TAB_COMPOSE: "Писане" - LABEL_OPEN_USER_DROPDOWN: "Отваряне на падащото меню за потребители" - LABEL_REPLY: "Отговори" - LABEL_REPLY_ALL: "Отговори до всички" - LABEL_FORWARD: "Препрати" - LABEL_FORWARD_MULTIPLY: "Препрати като прикачен файл" - LABEL_HELP: "Помощ" - LABEL_CHECK_ALL: "Провери всички съобщения" - LABEL_ARCHIVE: "Архивирай" - LABEL_DELETE: "Изтрий" - LABEL_OPEN_THREAD: "Отвори избраната нишка" - LABEL_MOVE: "Премести" - LABEL_READ: "Прочети избраните съобщения" - LABEL_UNREAD: "Маркирай като непрочетени избраните съобщения" - LABEL_IMPORTANT: "Важно, отбележи със флаг избраните съобщения" - LABEL_SEARCH: "Търсене" - LABEL_CANCEL_SEARCH: "Отказ от търсенето" - LABEL_FULLSCREEN_ENTER: "Цял екран (Изглед за преглед)" - LABEL_VIEW_MESSAGE_ENTER: "Преглед на съобщението (без изглед за преглед)" - LABEL_SWITCH_TO_MESSAGE: "Превключи фокуса върху избраното съобщение" - LABEL_SWITCH_TO_FOLDER_LIST: "Превключи фокуса върху списъка с папки" - LABEL_FULLSCREEN_TOGGLE: "Превключи на режим на цял екран" - LABEL_BLOCKQUOTES_TOGGLE: "Включи цитатите в съобщението" - LABEL_THREAD_NEXT: "Следващо съобщение в групираните" - LABEL_THREAD_PREV: "Предно съобщение в групираните" - LABEL_PRINT: "Принтиране" - LABEL_EXIT_FULLSCREEN: "Излез от режим на цял екран" - LABEL_CLOSE_MESSAGE: "Затвори съобщението (Няма изглед за преглед)" - LABEL_SWITCH_TO_LIST: "Превключи фокуса обратно към списъка със съобщения" - LABEL_OPEN_COMPOSE_POPUP: "Отвори прозорец за писане" - LABEL_MINIMIZE_COMPOSE_POPUP: "Намали прозореца за писане" - LABEL_OPEN_IDENTITIES_DROPDOWN: "отвори падащото меню с идентичности" - LABEL_SAVE_MESSAGE: "Запази съобщението" - LABEL_SEND_MESSAGE: "Изпрати съобщението" - LABEL_CLOSE_COMPOSE: "Затвори създаването" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "Няма публични ключове" - NO_PUBLIC_KEYS_FOUND_FOR: "Няма публичен ключ за \"%EMAIL%\"" - NO_PRIVATE_KEY_FOUND: "Няма частен ключ" - NO_PRIVATE_KEY_FOUND_FOR: "Няма частен ключ за \"%EMAIL%\"" - ADD_A_PUBLICK_KEY: "Добави публичен ключ" - SELECT_A_PRIVATE_KEY: "Избери частен ключ" - UNVERIFIRED_SIGNATURE: "Непроверен подпис" - DECRYPTION_ERROR: "Грешка при дешифрирането" - GOOD_SIGNATURE: "Валиден подпис за %USER%" - PGP_ERROR: "OpenPGP грешка: %ERROR%" - SPECIFY_FROM_EMAIL: "Моля въведете email адрес От" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Моля въведете поне един получател" - NOTIFICATIONS: - INVALID_TOKEN: "Невалиден токен" - AUTH_ERROR: "Неуспешно удостоверяване" - ACCESS_ERROR: "Грешка при опит за достъп" - CONNECTION_ERROR: "Не може да се свърже със сървъра" - CAPTCHA_ERROR: "Некорекно въведена CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Това социално ID не е присвоено към никой email акаунт. Влезте чрез email-а - и пуснете тази опция чрез Настройки. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Това социално ID не е присвоено към никой email акаунт. Влезте чрез email-а - и пуснете тази опция чрез Настройки. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Това социално ID не е присвоено към никой email акаунт. Влезте чрез email-а - и пуснете тази опция чрез Настройки. - DOMAIN_NOT_ALLOWED: "Този домейн не е разрешен" - ACCOUNT_NOT_ALLOWED: "Този акаунт не е разрешен" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Задължителна е двустъпкова проверка" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Грешка при двустъпковата проверка" - COULD_NOT_SAVE_NEW_PASSWORD: "Неуспешно запазване на новата парола" - CURRENT_PASSWORD_INCORRECT: "Текущата парола не е правилна" - NEW_PASSWORD_SHORT: "Паролата е твърде къса" - NEW_PASSWORD_WEAK: "Паролата е твърде лесна" - NEW_PASSWORD_FORBIDDENT: "Паролата съдържа забранени символи" - CONTACTS_SYNC_ERROR: "Грешка при синхронизацията" - CANT_GET_MESSAGE_LIST: "Не може да се изтегли списъка със съобщения" - CANT_GET_MESSAGE: "Не може да се изтегли съобщението" - CANT_DELETE_MESSAGE: "Не може да се изтрие съобщението" - CANT_MOVE_MESSAGE: "Не може да се премести съобщението" - CANT_SAVE_MESSAGE: "Не може да се запамети съобщението" - CANT_SEND_MESSAGE: "Не може да се изпрати съобщението" - INVALID_RECIPIENTS: "Невалидни получатели" - CANT_SAVE_FILTERS: "Не може да се запаметят филтрите" - CANT_GET_FILTERS: "Не могат да се изтеглят филтрите" - FILTERS_ARE_NOT_CORRECT: "Грешни филтри" - CANT_CREATE_FOLDER: "Не може да се създаде папка" - CANT_RENAME_FOLDER: "Не може да се преименува папка" - CANT_DELETE_FOLDER: "Не може да се изтрие папка" - CANT_DELETE_NON_EMPTY_FOLDER: "Не може да се изтрие папка, която не е празна" - CANT_SUBSCRIBE_FOLDER: "Не може да се абонира за папка" - CANT_UNSUBSCRIBE_FOLDER: "Не може да се махне абонамента за папка" - CANT_SAVE_SETTINGS: "Не могат да се запаметят настройките" - CANT_SAVE_PLUGIN_SETTINGS: "Не могат да се запаметят настройките" - DOMAIN_ALREADY_EXISTS: "Домейна вече съществува" - CANT_INSTALL_PACKAGE: "Не е възможно да се инсталира пакета" - CANT_DELETE_PACKAGE: "Не е възможно да се премахне пакета" - INVALID_PLUGIN_PACKAGE: "Невалиден пакет с приставка" - UNSUPPORTED_PLUGIN_PACKAGE: "Неподдържан пакет с приставка" - LICENSING_SERVER_IS_UNAVAILABLE: "Сървъра за абонамент е недостъпен" - LICENSING_DOMAIN_EXPIRED: "Абонаментът за този домейн е изтекъл." - LICENSING_DOMAIN_BANNED: "Абонаментът за този домейн е забранен." - DEMO_SEND_MESSAGE_ERROR: "С цел сугурност, на този акаунт е забранено да изпраща съобщения до външни email адреси!" - DEMO_ACCOUNT_ERROR: "С цел сигурност, това действие не е разрешено за този акаунт!" - ACCOUNT_ALREADY_EXISTS: "Акаунта вече съществува" - ACCOUNT_DOES_NOT_EXIST: "Акаунта не съществува" - MAIL_SERVER_ERROR: "Възникна грешка при комуникацията с пощенския сървър" - INVALID_INPUT_ARGUMENT: "Невалидни входни аргументи" - UNKNOWN_ERROR: "Неизвестна грешка" - STATIC: - BACK_LINK: "Презареди" - DOMAIN_LIST_DESC: "Списък то домейни, достъпни за тази поща" - PHP_EXSTENSIONS_ERROR_DESC: "Задължително PHP разширение не е налично във вашата PHP конфигурация!" - PHP_VERSION_ERROR_DESC: "Вашата персия на PHP (%VERSION%) е по-стара от минималната 5.3.0!" - NO_SCRIPT_TITLE: "За това приложение е необходим JavaScript." - NO_SCRIPT_DESC: | - Поддръжката на JavaScript не е налична във вашия браузър. - Моля, разрешете поддръжката на JavaScript в настройките на вашия браузър и опитайте отново. - NO_COOKIE_TITLE: "За това приложение е необходимо да се поддъжат Бисквитки." - NO_COOKIE_DESC: | - Поддръжката на Бисквитки не е налична във вашия браузър. - Моля, разрешете поддръжката на Бисквитки в настройките на вашия браузър и опитайте отново. - BAD_BROWSER_TITLE: "Вашият браузър е остарял." - BAD_BROWSER_DESC: | - За да използвате всички функции на приложението, - изтеглете и инсталирайте един от тези браузъри: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/cs_CZ.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/cs_CZ.yml deleted file mode 100755 index 970aa02e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/cs_CZ.yml +++ /dev/null @@ -1,704 +0,0 @@ -cs_CZ: - LOGIN: - LABEL_EMAIL: "Email" - LABEL_LOGIN: "Uživatelské jméno" - LABEL_PASSWORD: "Heslo" - LABEL_SIGN_ME: "Zapamatovat" - LABEL_VERIFICATION_CODE: "Ověřovací kód" - LABEL_DONT_ASK_VERIFICATION_CODE: "Nepožadovat ověřovací kód 2 týdny." - BUTTON_SIGN_IN: "Přihlásit" - TITLE_SIGN_IN_GOOGLE: "Přihlásit pomocí Google" - TITLE_SIGN_IN_FACEBOOK: "Přihlásit pomocí Facebook" - TITLE_SIGN_IN_TWITTER: "Přihlásit pomocí Twitter" - LABEL_FORGOT_PASSWORD: "Zapomenout heslo" - LABEL_REGISTRATION: "Registrace" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Přidat účet" - BUTTON_SETTINGS: "Nastavení" - BUTTON_HELP: "Nápověda" - BUTTON_LOGOUT: "Odhlásit" - MOBILE: - BUTTON_MOBILE_VERSION: "Mobilní verze" - BUTTON_DESKTOP_VERSION: "Desktop verze" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Hledat" - TITLE_ADV: "Rozšířené hledání" - LABEL_ADV_FROM: "Odesílatel" - LABEL_ADV_TO: "Příjemce" - LABEL_ADV_SUBJECT: "Předmět" - LABEL_ADV_TEXT: "Text" - LABEL_ADV_HAS_ATTACHMENT: "S přílohu" - LABEL_ADV_HAS_ATTACHMENTS: "S přílohami" - LABEL_ADV_FLAGGED: "Označené hvězdičkou" - LABEL_ADV_UNSEEN: "Nepřečtené" - LABEL_ADV_DATE: "Datum" - LABEL_ADV_DATE_ALL: "Kdykoliv" - LABEL_ADV_DATE_3_DAYS: "Ne starší než 3 dny" - LABEL_ADV_DATE_7_DAYS: "Ne starší než týden" - LABEL_ADV_DATE_MONTH: "Ne starší než měsíc" - LABEL_ADV_DATE_3_MONTHS: "Ne starší než 3 měsíce" - LABEL_ADV_DATE_6_MONTHS: "Ne starší než 6 měsíců" - LABEL_ADV_DATE_YEAR: "Ne starší než 1 rok" - BUTTON_ADV_SEARCH: "Hledat" - PREVIEW_POPUP: - FULLSCREEN: "Celá obrazovka" - ZOOM: "Zvětšit/zmenšit" - CLOSE: "Zavřít (Esc)" - LOADING: "Načítám..." - GALLERY_PREV: "Předchozí" - GALLERY_NEXT: "Další" - GALLERY_COUNTER: "%curr% z %total%" - IMAGE_ERROR: "Obrázek se nepodařilo načíst." - AJAX_ERROR: "Obsah sa nepodařilo načíst." - FOLDER_LIST: - BUTTON_COMPOSE: "Vytvořit" - BUTTON_CONTACTS: "Adresář" - BUTTON_NEW_MESSAGE: "Nová zpráva" - INBOX_NAME: "Přijaté" - SENT_NAME: "Odeslané" - DRAFTS_NAME: "Koncepty" - SPAM_NAME: "Spam" - TRASH_NAME: "Koš" - ARCHIVE_NAME: "Archiv" - QUOTA: - TITLE: "Využití kvóty" - MESSAGE_LIST: - BUTTON_RELOAD: "Obnovit seznam zpráv" - BUTTON_MOVE_TO: "Přesunout do" - BUTTON_DELETE: "Odstranit" - BUTTON_ARCHIVE: "Archivovat" - BUTTON_SPAM: "Je to spam" - BUTTON_NOT_SPAM: "Není to spam" - BUTTON_EMPTY_FOLDER: "Vyprázdnit složku" - BUTTON_MULTY_FORWARD: "Přeposlat zprávy" - BUTTON_DELETE_WITHOUT_MOVE: "Navždy odstranit" - BUTTON_MORE: "Více" - MENU_SET_SEEN: "Označit jako přečtené" - MENU_SET_ALL_SEEN: "Označit vše jako přečtené" - MENU_UNSET_SEEN: "Označit jako neprečtené" - MENU_SET_FLAG: "Označit hvězdičkou" - MENU_UNSET_FLAG: "Zrušit označení hvězdičkou" - MENU_SELECT_ALL: "Vše" - MENU_SELECT_NONE: "Žádné" - MENU_SELECT_INVERT: "Invertovat" - MENU_SELECT_UNSEEN: "Nepřečtené" - MENU_SELECT_SEEN: "Přečtené" - MENU_SELECT_FLAGGED: "Označené" - MENU_SELECT_UNFLAGGED: "Neoznačené" - EMPTY_LIST: "Seznam je prázdný" - EMPTY_SEARCH_LIST: "Vašemu vyhledávání neodpovídají žádné zprávy." - SEARCH_RESULT_FOR: "Výsledky vyhledávání pro \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "Zpět na seznam zpráv" - LIST_LOADING: "Načítám" - EMPTY_SUBJECT_TEXT: "(Bez předmětu)" - PUT_MESSAGE_HERE: "Přesuňte zprávu sem pro její zobrazení v seznamu" - TODAY_AT: "Dnes v %TIME%" - YESTERDAY_AT: "Včera v %TIME%" - SEARCH_PLACEHOLDER: "Hledat" - NEW_MESSAGE_NOTIFICATION: "Máte %COUNT% nových zpráv!" - QUOTA_SIZE: "Používáte %SIZE% (%PROC%%) z vašich %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Editovat" - BUTTON_BACK: "Zpět" - BUTTON_CLOSE: "Zavřít" - BUTTON_DELETE: "Odstranit" - BUTTON_ARCHIVE: "Archivovat" - BUTTON_SPAM: "Je to SPAM" - BUTTON_NOT_SPAM: "Není to SPAM" - BUTTON_MOVE_TO: "Přesunout do" - BUTTON_MORE: "Více" - BUTTON_REPLY: "Odpovědět" - BUTTON_REPLY_ALL: "Odpovědaě všem" - BUTTON_FORWARD: "Přeposlat" - BUTTON_FORWARD_AS_ATTACHMENT: "Přeposlat jako přílohu" - BUTTON_EDIT_AS_NEW: "Použit jako šablonu" - BUTTON_SHOW_IMAGES: "Zobrazit externí obrázky" - BUTTON_NOTIFY_READ_RECEIPT: "Odesílatel požádal o potvrzení přečtení této zprávy." - BUTTON_IN_NEW_WINDOW: "Zobrazit v novém okně" - BUTTON_THREAD_LIST: "Konverzace" - BUTTON_THREAD_PREV: "Předchozí" - BUTTON_THREAD_NEXT: "Další" - BUTTON_THREAD_MORE: "Více zpráv" - MENU_HEADERS: "Zobrazit hlavičku zprávy" - MENU_VIEW_ORIGINAL: "Zobrazit zdroj" - MENU_DOWNLOAD_ORIGINAL: "Stáhnout jako soubor .eml" - MENU_FILTER_SIMILAR: "Filtrovat zprávy jako tato" - MENU_PRINT: "Tisknout" - EMPTY_SUBJECT_TEXT: "(Bez předmětu)" - LABEL_SUBJECT: "Předmět" - LABEL_DATE: "Datum" - LABEL_FROM: "Odesílatel" - LABEL_FROM_SHORT: "Od" - LABEL_TO: "Příjemce" - LABEL_TO_SHORT: "Komu" - LABEL_CC: "Kopie" - LABEL_BCC: "Skrytá kopie" - LABEL_REPLY_TO: "Adresa odpovědi" - PRINT_LABEL_FROM: "Odesílatel" - PRINT_LABEL_TO: "Příjemce" - PRINT_LABEL_CC: "Kopie" - PRINT_LABEL_BCC: "Skrytá kopie" - PRINT_LABEL_REPLY_TO: "Adresa odpovědi" - PRINT_LABEL_DATE: "Datum" - PRINT_LABEL_SUBJECT: "Předmět" - PRINT_LABEL_ATTACHMENTS: "Přílohy" - MESSAGE_LOADING: "Načítám" - MESSAGE_VIEW_DESC: "Vyberte zprávu ze seznamu pro její zobrazení zde." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Heslo" - PGP_SIGNED_MESSAGE_DESC: "Zpráva podepsaná OpenPGP (klikněte pro ověření)" - PGP_ENCRYPTED_MESSAGE_DESC: "Zpráva šifrovaná OpenPGP (klikněte pro dešifraci)" - LINK_DOWNLOAD_AS_ZIP: "Stáhnout jako zip" - LINK_SAVE_TO_OWNCLOUD: "Uložit do ownCloud" - LINK_SAVE_TO_DROPBOX: "Uložit do Dropbox" - READ_RECEIPT: - SUBJECT: "Potvrzení o zobrazení zprávy - %SUBJECT%" - BODY: | - Toto je potrvzení o zaslání emailu na adresu %READ-RECEIPT%. - - Poznámka: Toto potvrzení zajištujě, že zpráva byla zobrazena v poštovní schrnánce příjemce. Nezajišťuje, že ji příjemce čelt a rozuměl jí. - SUGGESTIONS: - SEARCHING_DESC: "Hledám..." - CONTACTS: - LEGEND_CONTACTS: "Adresář" - SEARCH_INPUT_PLACEHOLDER: "Hledat" - BUTTON_ADD_CONTACT: "Přidat kontakt" - BUTTON_CREATE_CONTACT: "Vytvořit" - BUTTON_UPDATE_CONTACT: "Aktualizovat" - BUTTON_IMPORT: "Importovat (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Exportovat (vcf, vCard)" - BUTTON_EXPORT_CSV: "Exportovat (csv)" - ERROR_IMPORT_FILE: "Chyba importu (nesprávny formát souboru)" - LIST_LOADING: "Načítám" - EMPTY_LIST: "Nemáte žádné kontakty" - EMPTY_SEARCH: "Nebyly nalezeny žádné kontakty" - CLEAR_SEARCH: "Smazat vyhledávání" - CONTACT_VIEW_DESC: "Vyberte kontakt ze seznamu pro zobrazení zde." - LABEL_DISPLAY_NAME: "Zobrazit jako" - LABEL_EMAIL: "Email" - LABEL_PHONE: "Telefon" - LABEL_WEB: "Web" - LABEL_BIRTHDAY: "Narozeniny" - LINK_ADD_EMAIL: "Přidat email" - LINK_ADD_PHONE: "Přidat telefon" - LINK_BIRTHDAY: "Narozeniny" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Zadejte zobrazované jméno" - PLACEHOLDER_ENTER_LAST_NAME: "Zadejte příjmení" - PLACEHOLDER_ENTER_FIRST_NAME: "Zadejte jméno" - PLACEHOLDER_ENTER_NICK_NAME: "Zadejte přezdívku" - LABEL_READ_ONLY: "Jen pro čtění" - LABEL_SHARE: "Sdílet" - ADD_MENU_LABEL: "Přidat" - ADD_MENU_NICKNAME: "Přezdívka" - ADD_MENU_NOTES: "Poznámka" - ADD_MENU_EMAIL: "Email" - ADD_MENU_PHONE: "Telefon" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Adresa" - ADD_MENU_BIRTHDAY: "Narozeniny" - ADD_MENU_TAGS: "Tagy" - BUTTON_SHARE_NONE: "Žádné" - BUTTON_SHARE_ALL: "Vše" - BUTTON_SYNC: "Synchronizace (CardDAV)" - COMPOSE: - TITLE_FROM: "Odesílatel" - TITLE_TO: "Příjemce" - TITLE_CC: "Kopie" - TITLE_BCC: "Skrytá kopie" - TITLE_REPLY_TO: "Odpovědět" - TITLE_SUBJECT: "Předmět" - LINK_SHOW_INPUTS: "zobrazit všechna pole" - BUTTON_SEND: "Odeslat" - BUTTON_SAVE: "Uložit" - BUTTON_DELETE: "Odstranit" - BUTTON_CANCEL: "Zrušit" - BUTTON_MINIMIZE: "Minimalizovat" - SAVED_TIME: "Uložené v %TIME%" - SAVED_ERROR_ON_SEND: "Zpráva byla odesláná, ale nebyla uložená do složky odeslaných zpráv." - DISCARD_UNSAVED_DATA: "Neuložit změny?" - ATTACH_FILES: "Připojit soubory" - ATTACH_DROP_FILES_DESC: "Soubory přetáhněte sem" - ATTACH_ITEM_CANCEL: "Zrušit" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" - FORWARD_MESSAGE_TOP_TITLE: "-------- Forwarded message -------" - FORWARD_MESSAGE_TOP_FROM: "Odesílatel" - FORWARD_MESSAGE_TOP_TO: "Příjemce" - FORWARD_MESSAGE_TOP_CC: "Kopie" - FORWARD_MESSAGE_TOP_SENT: "Odeslat" - FORWARD_MESSAGE_TOP_SUBJECT: "Předmět" - EMPTY_TO_ERROR_DESC: "Zadejte prosím alespoň jednoho příjemce" - NO_ATTACHMENTS_HERE_DESC: "Žádné přílohy." - ATTACHMENTS_ERROR_DESC: "Upozornění! Některé přílohy nebyly nahrány." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Některé přílohy ještě nebyly nahrány" - BUTTON_REQUEST_READ_RECEIPT: "Vyžádat si potvrzení o příjetí" - BUTTON_MARK_AS_IMPORTANT: "Označit jako důležité" - BUTTON_OPEN_PGP: "OpenPGP (jen Plain Text)" - BUTTON_REQUEST_DSN: "Request a delivery receipt" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Zavřít" - POPUPS_ASK: - BUTTON_YES: "Ano" - BUTTON_NO: "Ne" - DESC_WANT_CLOSE_THIS_WINDOW: "Opravdu chcete zavřít toto okno?" - DESC_WANT_DELETE_MESSAGES: "Opravdu chcete odstranit tyto zprávy?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Zvolte jazyk" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Přidat účet?" - BUTTON_ADD_ACCOUNT: "Přidat" - TITLE_UPDATE_ACCOUNT: "Upravit účet?" - BUTTON_UPDATE_ACCOUNT: "Upravit" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Opravdu přidat?" - TITLE_UPDATE_IDENTITY: "Uložit změny?" - BUTTON_ADD_IDENTITY: "Přidat" - BUTTON_UPDATE_IDENTITY: "Uložit" - LABEL_EMAIL: "Email" - LABEL_NAME: "Jméno" - LABEL_REPLY_TO: "Adresa odpovědi" - LABEL_SIGNATURE: "Podpis" - LABEL_CC: "Kopie" - LABEL_BCC: "Skrytá" - LABEL_SIGNATURE_INSERT_BEFORE: "V odpovědích vložit podpis před citovaný text." - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Vytvořit složku?" - LABEL_NAME: "Název složky" - LABEL_PARENT: "Nadřazená složka" - BUTTON_CREATE: "Vytvořit" - BUTTON_CANCEL: "Zrušit" - BUTTON_CLOSE: "Zavřít" - TITLE_CREATING_PROCESS: "Vytvářím složku" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Odstranit všechny zprávy ve složce?" - BUTTON_CLEAR: "Vyčistit" - BUTTON_CANCEL: "Zrušit" - BUTTON_CLOSE: "Zavřít" - DANGER_DESC_WARNING: "Upozornění!" - DANGER_DESC_HTML_1: "Chystáte se nenávratně odstranit všechny zprávy ze složky %FOLDER%." - DANGER_DESC_HTML_2: "Tento proces není možné přerušit." - TITLE_CLEARING_PROCESS: "Odstraňuje se složka..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Import OpenPGP klíče" - BUTTON_IMPORT_OPEN_PGP_KEY: "Import" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Zobrazit OpenPGP klíč" - BUTTON_SELECT: "Vybart" - BUTTON_CLOSE: "Zavřít" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Generovat OpenPGP klíče" - LABEL_EMAIL: "Email" - LABEL_NAME: "Jméno" - LABEL_PASSWORD: "Heslo" - LABEL_KEY_BIT_LENGTH: "Délka klíče" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generovat" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP Podpis/Šifrování" - LABEL_SIGN: "Podpis" - LABEL_ENCRYPT: "Šifrování" - LABEL_PASSWORD: "Heslo" - BUTTON_SIGN: "Podepsat" - BUTTON_ENCRYPT: "Šifrovat" - BUTTON_SIGN_AND_ENCRYPT: "Podepsat a šifrovat" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Dešifrování" - LABEL_KEY: "Soukromý klíč" - LABEL_PASSWORD: "Heslo" - BUTTON_DECRYPT: "Dešifrovat" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "Dvoufázové ověření" - LABEL_CODE: "Kód" - BUTTON_TEST: "Test" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Vytvořit filtr?" - TITLE_EDIT_FILTER: "Změnit filtr?" - FILTER_NAME: "Jméno" - LEGEND_CONDITIONS: "Podmínka" - LEGEND_ACTIONS: "Akce" - BUTTON_DONE: "Dokončit" - BUTTON_ADD_CONDITION: "Přidat podmínku" - SELECT_ACTION_NONE: "Nic" - SELECT_ACTION_MOVE_TO: "Přesunout do" - SELECT_ACTION_FORWARD_TO: "Přesměrovat do" - SELECT_ACTION_REJECT: "Odmítnout" - SELECT_ACTION_VACATION_MESSAGE: "Odpověď v nepřítomnosti" - SELECT_ACTION_DISCARD: "Zahodit" - SELECT_FIELD_FROM: "Od" - SELECT_FIELD_RECIPIENTS: "Přijemci (Komu nebo Kopie)" - SELECT_FIELD_SUBJECT: "Předmět" - SELECT_FIELD_HEADER: "Hlavička" - SELECT_FIELD_SIZE: "Velikost" - SELECT_TYPE_CONTAINS: "Obsahuje" - SELECT_TYPE_NOT_CONTAINS: "Neobsahuje" - SELECT_TYPE_MATCHES: "Odpovídá (můžete použit * a ? )" - SELECT_TYPE_NOT_MATCHES: "Neodpovídá (můžete použit * a ? )" - SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Not Regexp" - SELECT_TYPE_EQUAL_TO: "Rovná se" - SELECT_TYPE_NOT_EQUAL_TO: "Nerovná se" - SELECT_TYPE_OVER: "Over" - SELECT_TYPE_UNDER: "Under" - SELECT_MATCH_ANY: "Vyhovuje alespoň jednomu pravidlu" - SELECT_MATCH_ALL: "Vyhovuje všem pravidlům" - MARK_AS_READ_LABEL: "Odznačit jako přečtené" - REPLY_INTERVAL_LABEL: "Interval odpovědi (dny)" - KEEP_LABEL: "Zachovat" - STOP_LABEL: "Neukončovat zpracování pravidel" - EMAIL_LABEL: "Email" - VACATION_SUBJECT_LABEL: "Předmět (volitelný)" - VACATION_MESSAGE_LABEL: "Zpráva" - VACATION_RECIPIENTS_LABEL: "Příjemci (odděleni čárkou)" - REJECT_MESSAGE_LABEL: "Odmítnout zprávu" - ALL_INCOMING_MESSAGES_DESC: "Všechny příchozí zprávy" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Spravovat systémové složky" - SELECT_CHOOSE_ONE: "Vybrat" - SELECT_UNUSE_NAME: "Nepoužívat" - LABEL_SENT: "Odeslané" - LABEL_DRAFTS: "Koncepty" - LABEL_SPAM: "Spam" - LABEL_TRASH: "Koš" - LABEL_ARCHIVE: "Archiv" - BUTTON_CANCEL: "Zrušit" - BUTTON_CLOSE: "Zavřít" - NOTIFICATION_SENT: | - Nevybrali jste systémovou složku "Odeslané" kam budou uložené zprávy po jejich odeslání. - Pokud nechcete ukládat odeslané zprávy, vyberete možnost "Nepoužívat". - NOTIFICATION_DRAFTS: "Nevybrali jste systémovou složku pro \"Koncepty\" kam jsou ukládány zprávy během jejich psaní." - NOTIFICATION_SPAM: | - Nevybrali jste systémovou složku pro "Spam" kam je ukládána nevyžádaná pošta. - Pokud chcete tyto zprávy odstranit natrvalo, vyberte prosím možnost "Nepoužívat". - NOTIFICATION_TRASH: | - Nevybrali jste systémovou složku pro "Koš" kam jsou zprávy přesunuté pro jejich odstranění. - Pokud chcete zprávy odstranit natrvalo, vyberte prosím možnost "Nepoužívat". - NOTIFICATION_ARCHIVE: "Nevybrali jste systémovou složku \"Archiv\", kam se ukládají archivované zprávy." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "Dvoufázové ověření" - LABEL_ENABLE_TWO_FACTOR: "Povlit dvoufázové ověření" - LABEL_TWO_FACTOR_USER: "Uživatel" - LABEL_TWO_FACTOR_STATUS: "Status" - LABEL_TWO_FACTOR_SECRET: "Secret" - LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" - BUTTON_CREATE: "Create New Secret" - BUTTON_ACTIVATE: "Aktivovat" - BUTTON_CLEAR: "Clear" - BUTTON_LOGOUT: "Odhlásit" - BUTTON_DONE: "Hotovo" - BUTTON_TEST: "Test" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Show Secret" - BUTTON_HIDE_SECRET: "Hide Secret" - TWO_FACTOR_REQUIRE_DESC: "Váš účet vyžaduje nastavení dvoufázového ověření" - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Nastaveno" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Nenastaveno" - TWO_FACTOR_SECRET_DESC: >- - Import this info into your Google Authenticator client (or other TOTP client) - using the provided QR code below or by entering the code manually. - TWO_FACTOR_BACKUP_CODES_DESC: >- - If you can't receive codes via Google Authenticator, you can use backup codes - to sign in. After you’ve used a backup code to sign in, it will become inactive. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." - TITLES: - LOADING: "Načítám" - LOGIN: "Uživatelské jméno" - MAILBOX: "Schránka zpráv" - SETTINGS: "Nastavení" - COMPOSE: "Napsat" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Soubor je příliš velký." - ERROR_FILE_PARTIALLY_UPLOADED: "Z důvodu neznámé chyby byl soubor nahrán jen částečně" - ERROR_NO_FILE_UPLOADED: "Soubor nebyl nahrán" - ERROR_MISSING_TEMP_FOLDER: "Chybí dočasný soubor" - ERROR_ON_SAVING_FILE: "Nastala neznámá chyba při ukládání" - ERROR_FILE_TYPE: "Nesprávny typ souboru" - ERROR_UNKNOWN: "Nastala neznámá chyba při nahrávaní" - EDITOR: - TEXT_SWITCHER_RICH_FORMATTING: "Formátovaný text" - TEXT_SWITCHER_CONFIRM: "Formátování textu a obrázky budou odstraněné. Chcete pokračovat?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Osobní" - LABEL_GENERAL_NAME: "Všeobecné" - LABEL_CONTACTS_NAME: "Kontakty" - LABEL_FOLDERS_NAME: "Složky" - LABEL_ACCOUNTS_NAME: "Účty" - LABEL_IDENTITY_NAME: "Identita" - LABEL_IDENTITIES_NAME: "Identity" - LABEL_FILTERS_NAME: "Filtry" - LABEL_TEMPLATES_NAME: "Šablony" - LABEL_SECURITY_NAME: "Zabezpečení" - LABEL_SOCIAL_NAME: "Sociální" - LABEL_THEMES_NAME: "Motivy" - LABEL_CHANGE_PASSWORD_NAME: "Heslo" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Zpět" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filtry" - BUTTON_SAVE: "Uložit" - BUTTON_ADD_FILTER: "Přidat filtr" - BUTTON_DELETE: "Smazat" - BUTTON_RAW_SCRIPT: "Použít uživatelský skript" - SUBNAME_NONE: "Žádný" - SUBNAME_MOVE_TO: "Přesunout do \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Přeposlat to \"%EMAIL%\"" - SUBNAME_REJECT: "Odmítnout" - SUBNAME_VACATION_MESSAGE: "Odpověď v nepřítomnosti" - SUBNAME_DISCARD: "Zahodit" - CAPABILITY_LABEL: "Capability" - LOADING_PROCESS: "Aktualizovat seznam filtrů" - DELETING_ASK: "Opravdu to chcete?" - CHACHES_NEED_TO_BE_SAVED_DESC: "Změny musí být uloženy na serveru." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identita" - LABEL_DISPLAY_NAME: "Jméno" - LABEL_REPLY_TO: "Adresa pro odpovědi" - LABEL_SIGNATURE: "Podpis" - LABEL_ADD_SIGNATURE_TO_ALL: "Připojit podpis ke všem odchozím zprávám" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Zapezpečení" - LABEL_CONFIGURE_TWO_FACTOR: "Nastavení dvoufázového ověření" - LABEL_AUTOLOGOUT: "Automatické odhlášení" - AUTOLOGIN_NEVER_OPTION_NAME: "Nikdy" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minut" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Všeobecné" - LABEL_LANGUAGE: "Jazyk" - LABEL_IDENTITY: "Identity" - LABEL_LAYOUT: "Layout" - LABEL_LAYOUT_NO_SPLIT: "Nerozdělovat" - LABEL_LAYOUT_VERTICAL_SPLIT: "Vertikální rozdělení" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontální rozdělění" - LABEL_EDITOR: "Přednastavený editor zpráv" - LABEL_EDITOR_HTML: "Html" - LABEL_EDITOR_PLAIN: "Text" - LABEL_EDITOR_HTML_FORCED: "Html (vynucený)" - LABEL_EDITOR_PLAIN_FORCED: "Plain (vynucený)" - LABEL_ANIMATION: "Animace prostředí" - LABEL_ANIMATION_FULL: "Všechny" - LABEL_ANIMATION_NORMAL: "Normální" - LABEL_ANIMATION_NONE: "Žádné" - LABEL_VIEW_OPTIONS: "Možnosti zobrazení" - LABEL_USE_PREVIEW_PANE: "Používate panel rychlého zobrazení" - LABEL_USE_CHECKBOXES_IN_LIST: "Zobrazení zaškrtávacích políček v seznamu" - LABEL_USE_THREADS: "Zobrazit jako konverzace" - LABEL_REPLY_SAME_FOLDER: "Ukládat odpovědi do složky se zprávou, které se týkají" - LABEL_SHOW_IMAGES: "Vždy zobrazovat obrázky v těle správy" - LABEL_SHOW_ANIMATION: "Animovat" - LABEL_MESSAGE_PER_PAGE: "Zpráv na stranu" - LABEL_NOTIFICATIONS: "Notifikace" - LABEL_SOUND_NOTIFICATION: "Zvukové notifikace" - LABEL_CHROME_NOTIFICATION_DESC: "Zobrazovat upozornění na nové zprávy" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Zablokované prohlížečem)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Kontakty" - LABEL_CONTACTS_AUTOSAVE: "Automaticky přidávat adresy příjemců do Adresáře" - LEGEND_CONTACTS_SYNC: "Vzdálená synchronizace (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Povolit vzdálenou synchronizaci" - LABEL_CONTACTS_SYNC_SERVER: "Server" - LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" - LABEL_CONTACTS_SYNC_USER: "Uživatel" - LABEL_CONTACTS_SYNC_PASSWORD: "Heslo" - SETTINGS_THEMES: - LEGEND_THEMES: "Motivy" - LEGEND_THEMES_CUSTOM: "Správa vlastního motivu" - LABEL_CUSTOM_TYPE: "Typ" - LABEL_CUSTOM_TYPE_LIGHT: "Světlý" - LABEL_CUSTOM_TYPE_DARK: "Tmavý" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Pozadí" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Nahrát obrázek pozadí (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "Soubor je příliš velký" - ERROR_FILE_TYPE_ERROR: "Nesprávný typ souboru (povolené jsou pouze JPG a PNG)" - ERROR_UNKNOWN: "Nastala neznámá chyba při nahrávání souboru" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Propojit Google" - BUTTON_GOOGLE_DISCONNECT: "Odpojit Google" - MAIN_GOOGLE_DESC: "Po povolení přihlášení přes Google se můžete na úvodní stránce přihlásit přes tlačítko Google." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Propojit Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Odpojit Facebook" - MAIN_FACEBOOK_DESC: "Po povolení přihlášení přes Facebook se můžete na úvodní stránce přihlásit přes tlačítko Facebook." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Propojit Twitter" - BUTTON_TWITTER_DISCONNECT: "Odpojit Twitter" - MAIN_TWITTER_DESC: "Po povolení přihlášení přes Twitter se můžete na úvodní stránce přihlásit přes tlačítko Twitter." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Seznam složek" - BUTTON_CREATE: "Vytvořit složku" - BUTTON_DELETE: "Odstranit" - BUTTON_SUBSCRIBE: "Přihlásit se" - BUTTON_UNSUBSCRIBE: "Odhlásit se" - LOADING_PROCESS: "Aktualizuji seznam složek" - CREATING_PROCESS: "Vytvářím složku" - DELETING_PROCESS: "Odstraňuji složku" - RENAMING_PROCESS: "Přejmenovávám složku" - DELETING_ASK: "Opravdu to chcete?" - TO_MANY_FOLDERS_DESC_1: "Máte moc složek!" - TO_MANY_FOLDERS_DESC_2: "Můžeme zobrazit jen část z nich, abychom zabránili problémům s výkonem." - HELP_DELETE_FOLDER: "Smazat složku" - HELP_SHOW_HIDE_FOLDER: "Zobrazit/skrýt složku" - HELP_CHECK_FOR_NEW_MESSAGES: "Kontrovat/nekontrolovat nové příchozí zprávy" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Seznam účtů" - LEGEND_IDENTITIES: "Identity" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Účty a identity" - BUTTON_ADD_ACCOUNT: "Přidat účet" - BUTTON_ADD_IDENTITY: "Přidat identitu" - BUTTON_DELETE: "Odstranit" - LOADING_PROCESS: "Aktualizace seznamu účtů" - DELETING_ASK: "Opravdu to chcete?" - DEFAULT_IDENTITY_LABEL: "výchozí" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identita" - LEGEND_IDENTITIES: "Další identity" - LABEL_DEFAULT: "Výchozí" - LABEL_DISPLAY_NAME: "Jméno" - LABEL_REPLY_TO: "Adresa pro odpověď" - LABEL_SIGNATURE: "Podpis" - LABEL_ADD_SIGNATURE_TO_ALL: "Připojit ke všem odeslaným zprávám" - BUTTON_ADD_IDENTITY: "Přidat Identitu" - BUTTON_DELETE: "Odstranit" - LOADING_PROCESS: "Aktualizace seznamu identit" - DELETING_ASK: "Opravdu to chcete?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Změnit heslo" - LABEL_CURRENT_PASSWORD: "Současné heslo" - LABEL_NEW_PASSWORD: "Nové heslo" - LABEL_REPEAT_PASSWORD: "Nové heslo znovu" - BUTTON_UPDATE_PASSWORD: "Nastavit nové heslo" - ERROR_PASSWORD_MISMATCH: "Hesla nejsou stejná, zkuste to znovu" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Importovat OpenPGP klíč" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generovat OpenPGP klíče" - TITLE_PRIVATE: "Soukromý" - TITLE_PUBLIC: "Veřejný" - DELETING_ASK: "Opravdu to chcete?" - GENERATE_ONLY_HTTPS: "Pouze HTTPS" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Klávesové zkratky" - TAB_MAILBOX: "Schránka" - TAB_MESSAGE_LIST: "Seznam zpráv" - TAB_MESSAGE_VIEW: "Detail zprávy" - TAB_COMPOSE: "Napsat" - LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" - LABEL_REPLY: "Odpovědět" - LABEL_REPLY_ALL: "Odpovědět všem" - LABEL_FORWARD: "Přeposlat" - LABEL_FORWARD_MULTIPLY: "Přeposlat jako přílohu" - LABEL_HELP: "Nápověda" - LABEL_CHECK_ALL: "Zjistit nové zprávy" - LABEL_ARCHIVE: "Archivovat" - LABEL_DELETE: "Smazat" - LABEL_OPEN_THREAD: "Otevřít označenou konverzaci" - LABEL_MOVE: "Přesunout" - LABEL_READ: "Označit vybrané zprávy jako přečtené" - LABEL_UNREAD: "Označit vybrané zprávy jako nepřečtené" - LABEL_IMPORTANT: "Označit vybrané zprávy jako důležité" - LABEL_SEARCH: "Hledat" - LABEL_CANCEL_SEARCH: "Zrušit hledání" - LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" - LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" - LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" - LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" - LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" - LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" - LABEL_THREAD_NEXT: "Next message in thread" - LABEL_THREAD_PREV: "Previous message in thread" - LABEL_PRINT: "Tisk" - LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" - LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" - LABEL_SWITCH_TO_LIST: "Switch focus back to message list" - LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" - LABEL_SAVE_MESSAGE: "Save message" - LABEL_SEND_MESSAGE: "Send message" - LABEL_CLOSE_COMPOSE: "Close compose" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "No public keys found" - NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" - NO_PRIVATE_KEY_FOUND: "No private key found" - NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" - ADD_A_PUBLICK_KEY: "Add a public key" - SELECT_A_PRIVATE_KEY: "Vyberte soukromý klíč" - UNVERIFIRED_SIGNATURE: "Unverified signature" - DECRYPTION_ERROR: "OpenPGP decryption error" - GOOD_SIGNATURE: "Good signature from %USER%" - PGP_ERROR: "OpenPGP error: %ERROR%" - SPECIFY_FROM_EMAIL: "Please specify FROM email address" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" - NOTIFICATIONS: - INVALID_TOKEN: "Neplatný token" - AUTH_ERROR: "Ověření selhalo" - ACCESS_ERROR: "Chyba přístupu" - CONNECTION_ERROR: "Nepodařilo se připojit k serveru" - CAPTCHA_ERROR: "Nesprávná CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- - Toto ID není přiřazeno k žádnému účtu. Přihlašte se pomocí vaší emailové adresy - a nastavte si tuto možnost. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- - Toto ID není přiřazeno k žádnému účtu. Přihlašte se pomocí vaší emailové adresy - a nastavte si tuto možnost. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- - Toto ID není přiřazeno k žádnému účtu. Přihlašte se pomocí vaší emailové adresy - a nastavte si tuto možnost. - DOMAIN_NOT_ALLOWED: "Doména není povolená" - ACCOUNT_NOT_ALLOWED: "Účet není povolený" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Je vyžadováno dvoufázové ověření" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Chyba dvoufázového ověření" - COULD_NOT_SAVE_NEW_PASSWORD: "Nelze uložit nové heslo" - CURRENT_PASSWORD_INCORRECT: "Současné heslo neodpovídá" - NEW_PASSWORD_SHORT: "Heslo je krátké" - NEW_PASSWORD_WEAK: "Heslo je moc jednoduché" - NEW_PASSWORD_FORBIDDENT: "Heslo obsahuje zakázané znaky" - CONTACTS_SYNC_ERROR: "Chyba při synchronizaci kontaktů" - CANT_GET_MESSAGE_LIST: "Chyba při vytváření seznamu zpráv" - CANT_GET_MESSAGE: "Zprávu se nepodařilo načíst" - CANT_DELETE_MESSAGE: "Zprávu se nepodařilo odstranit" - CANT_MOVE_MESSAGE: "Zprávu se nepodařilo přesunout" - CANT_SAVE_MESSAGE: "Zprávu se nepodařilo uložit" - CANT_SEND_MESSAGE: "Zprávu se nepodařilo odeslat" - INVALID_RECIPIENTS: "Neplatný příjemci" - CANT_SAVE_FILTERS: "Nelze uložit filtry" - CANT_GET_FILTERS: "Nelze načíst filtry" - FILTERS_ARE_NOT_CORRECT: "Filtry nejsou validní" - CANT_CREATE_FOLDER: "Složku se nepodařilo vytvořit" - CANT_RENAME_FOLDER: "Složku se nepodařilo přejmenovat" - CANT_DELETE_FOLDER: "Složku se nepodařilo odstranit" - CANT_DELETE_NON_EMPTY_FOLDER: "Nelze odstranit neprázdnou složku" - CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" - CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" - CANT_SAVE_SETTINGS: "Nastavení se nepodařilo uložit" - CANT_SAVE_PLUGIN_SETTINGS: "Nastavení se nepodařilo uložit" - DOMAIN_ALREADY_EXISTS: "Táto doména již existuje" - CANT_INSTALL_PACKAGE: "Instalace balíčku se nezdařila" - CANT_DELETE_PACKAGE: "Odstranění balíčku se nezdařilo" - INVALID_PLUGIN_PACKAGE: "Nevalidní balíček" - UNSUPPORTED_PLUGIN_PACKAGE: "Nepodporovaný balíček rozšíření" - LICENSING_SERVER_IS_UNAVAILABLE: "Licenční server je nedostupný" - LICENSING_DOMAIN_EXPIRED: "Licence pro tuto doménu vypršela." - LICENSING_DOMAIN_BANNED: "Licence pro tuto doménu byla zablokována." - DEMO_SEND_MESSAGE_ERROR: "Z důvodu bezpečnosti tento demo účet není oprávněn posílat zprávy na externí emaily!" - DEMO_ACCOUNT_ERROR: "Z důvodu bezpečnosti tento účet nemá oprávnění toto provést!" - ACCOUNT_ALREADY_EXISTS: "Účet už existuje" - ACCOUNT_DOES_NOT_EXIST: "Účet neexistuje" - MAIL_SERVER_ERROR: "Nastala chyba během přístupu na poštovní server" - INVALID_INPUT_ARGUMENT: "Nevalidní vstupní argument" - UNKNOWN_ERROR: "Neznámá chyba" - STATIC: - BACK_LINK: "Obnovit" - DOMAIN_LIST_DESC: "Seznam domén, ke kterým je možné přistupovat přes webmail." - PHP_EXSTENSIONS_ERROR_DESC: "Potřebné rošíření PHP nejsou dostupné v konfiguraci PHP!" - PHP_VERSION_ERROR_DESC: "Vaše verze PHP (%VERSION%) je nižší než požadovaná 5.3.0!" - NO_SCRIPT_TITLE: "Tato aplikace vyžaduje JavaScript." - NO_SCRIPT_DESC: | - Váš internetový prohlížeč nepodporuje JavaScript. - Prosím povolte podporu JavaScriptu v nastavení vašeho internetového prohlížeče a zkuste to znovu. - NO_COOKIE_TITLE: "Tato aplikace vyžaduje podporu Cookies." - NO_COOKIE_DESC: | - Váš internetový prohlížeč nepodporuje Cookies. - Prosím povolte podporu Cookies v nastavení vašeho internetového prohlížeče a zkuste to znovu. - BAD_BROWSER_TITLE: "Používáte zastaralý internetový prohlížeč." - BAD_BROWSER_DESC: | - Abyste mohli využívat všechny funkcie této aplikace, - použijte některý z následujících internetových prohlížečů: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/da_DK.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/da_DK.yml deleted file mode 100755 index 25afb6f6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/da_DK.yml +++ /dev/null @@ -1,710 +0,0 @@ -da_DK: - LOGIN: - LABEL_EMAIL: "E-mail" - LABEL_LOGIN: "Brugernavn" - LABEL_PASSWORD: "Adgangskode" - LABEL_SIGN_ME: "Husk mig" - LABEL_VERIFICATION_CODE: "Verifikationskode" - LABEL_DONT_ASK_VERIFICATION_CODE: "Husk kode i 2 uger" - BUTTON_SIGN_IN: "Log ind" - TITLE_SIGN_IN_GOOGLE: "Log ind med Google" - TITLE_SIGN_IN_FACEBOOK: "Log ind med Facebook" - TITLE_SIGN_IN_TWITTER: "Log ind med Twitter" - LABEL_FORGOT_PASSWORD: "Glemt adgangskode" - LABEL_REGISTRATION: "Registrering" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Tilføj konto" - BUTTON_SETTINGS: "Indstillinger" - BUTTON_HELP: "Hjælp" - BUTTON_LOGOUT: "Log ud" - MOBILE: - BUTTON_MOBILE_VERSION: "Mobil udgave" - BUTTON_DESKTOP_VERSION: "Desktop udgave" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Søg" - TITLE_ADV: "Avanceret søgning" - LABEL_ADV_FROM: "Fra" - LABEL_ADV_TO: "Til" - LABEL_ADV_SUBJECT: "Emne" - LABEL_ADV_TEXT: "Tekst" - LABEL_ADV_HAS_ATTACHMENT: "Har vedhæftet fil" - LABEL_ADV_HAS_ATTACHMENTS: "Har vedhæftede filer" - LABEL_ADV_FLAGGED: "Markeret med flag" - LABEL_ADV_UNSEEN: "Ulæst" - LABEL_ADV_DATE: "Dato" - LABEL_ADV_DATE_ALL: "Alle" - LABEL_ADV_DATE_3_DAYS: "Nyere end 3 dage" - LABEL_ADV_DATE_7_DAYS: "Nyere end 1 uge" - LABEL_ADV_DATE_MONTH: "Nyere end 1 måned" - LABEL_ADV_DATE_3_MONTHS: "Nyere end 3 måneder" - LABEL_ADV_DATE_6_MONTHS: "Nyere end 6 måneder" - LABEL_ADV_DATE_YEAR: "Nyere end 1 år" - BUTTON_ADV_SEARCH: "Søg" - PREVIEW_POPUP: - FULLSCREEN: "Fuld skærm" - ZOOM: "Zoom ind/ud" - CLOSE: "Luk (Esc)" - LOADING: "Indlæser..." - GALLERY_PREV: "Forrige (venstrepil)" - GALLERY_NEXT: "Næste (højrepil)" - GALLERY_COUNTER: "%curr% af %total%" - IMAGE_ERROR: "Billedet kunne ikke indlæses." - AJAX_ERROR: "Indholdet kunne ikke indlæses." - FOLDER_LIST: - BUTTON_COMPOSE: "Forfat" - BUTTON_CONTACTS: "Kontakter" - BUTTON_NEW_MESSAGE: "Ny meddelelse" - INBOX_NAME: "Indbakke" - SENT_NAME: "Sendte meddelelser" - DRAFTS_NAME: "Kladder" - SPAM_NAME: "Uønskede meddelelser" - TRASH_NAME: "Slettede meddelelser" - ARCHIVE_NAME: "Arkiverede meddelelser" - QUOTA: - TITLE: "Forbrug" - MESSAGE_LIST: - BUTTON_RELOAD: "Genindlæs meddelelser" - BUTTON_MOVE_TO: "Flyt til" - BUTTON_DELETE: "Slet" - BUTTON_ARCHIVE: "Arkivér" - BUTTON_SPAM: "Uønsket" - BUTTON_NOT_SPAM: "Ikke uønsket" - BUTTON_EMPTY_FOLDER: "Tøm mappe" - BUTTON_MULTY_FORWARD: "Videresend som vedhæftning(er)" - BUTTON_DELETE_WITHOUT_MOVE: "Slet permanent" - BUTTON_MORE: "Mere" - MENU_SET_SEEN: "Markér som læst" - MENU_SET_ALL_SEEN: "Markér alle som læst" - MENU_UNSET_SEEN: "Markér som ulæst" - MENU_SET_FLAG: "Markér med flag" - MENU_UNSET_FLAG: "Fjern flag" - MENU_SELECT_ALL: "Alle" - MENU_SELECT_NONE: "Ingen" - MENU_SELECT_INVERT: "Vend valg" - MENU_SELECT_UNSEEN: "Ulæst" - MENU_SELECT_SEEN: "Læst" - MENU_SELECT_FLAGGED: "Markeret med flag" - MENU_SELECT_UNFLAGGED: "Ikke markeret med flag" - EMPTY_LIST: "Ingen meddelelser." - EMPTY_SEARCH_LIST: "Ingen meddelelser passede på søgningen." - SEARCH_RESULT_FOR: "Resultat for søgningen på \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "Tilbage til meddelelsesoversigt" - LIST_LOADING: "Indlæser" - EMPTY_SUBJECT_TEXT: "(Intet emne)" - PUT_MESSAGE_HERE: "Slip meddelelse her for visning i oversigten" - TODAY_AT: "i dag klokken %TIME%" - YESTERDAY_AT: "i går klokken %TIME%" - SEARCH_PLACEHOLDER: "Søg" - NEW_MESSAGE_NOTIFICATION: "%COUNT% nye meddelelser!" - QUOTA_SIZE: "Du bruger %SIZE% (%PROC%%) af %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Rediger" - BUTTON_BACK: "Tilbage" - BUTTON_CLOSE: "Luk" - BUTTON_DELETE: "Slet" - BUTTON_UNSUBSCRIBE: "Frameld liste" - BUTTON_ARCHIVE: "Arkivér" - BUTTON_SPAM: "Uønsket" - BUTTON_NOT_SPAM: "Ikke uønsket" - BUTTON_MOVE_TO: "Flyt til" - BUTTON_MORE: "Mere" - BUTTON_REPLY: "Svar" - BUTTON_REPLY_ALL: "Svar alle" - BUTTON_FORWARD: "Videresend" - BUTTON_FORWARD_AS_ATTACHMENT: "Videresend som vedhæftning" - BUTTON_EDIT_AS_NEW: "Rediger som ny" - BUTTON_SHOW_IMAGES: "Vis eksterne billeder" - BUTTON_NOTIFY_READ_RECEIPT: "Afsender har bedt om modtagelseskvittering." - BUTTON_IN_NEW_WINDOW: "Vis i separat vindue" - BUTTON_THREAD_LIST: "Samtaleoversigt" - BUTTON_THREAD_PREV: "Forrige" - BUTTON_THREAD_NEXT: "Næste" - BUTTON_THREAD_MORE: "Flere meddelelser" - MENU_HEADERS: "Vis meddelelseoplysninger" - MENU_VIEW_ORIGINAL: "Vis kilder" - MENU_DOWNLOAD_ORIGINAL: "Hent som .eml fil" - MENU_FILTER_SIMILAR: "Find lignende meddelelser" - MENU_PRINT: "Udskriv" - EMPTY_SUBJECT_TEXT: "(Intet emne)" - LABEL_SUBJECT: "Emne" - LABEL_DATE: "Dato" - LABEL_FROM: "Fra" - LABEL_FROM_SHORT: "fra" - LABEL_TO: "Til" - LABEL_TO_SHORT: "til" - LABEL_CC: "CC" - LABEL_BCC: "BCC" - LABEL_REPLY_TO: "Svar til" - PRINT_LABEL_FROM: "Fra" - PRINT_LABEL_TO: "Til" - PRINT_LABEL_CC: "CC" - PRINT_LABEL_BCC: "BCC" - PRINT_LABEL_REPLY_TO: "Svar til" - PRINT_LABEL_DATE: "Dato" - PRINT_LABEL_SUBJECT: "Emne" - PRINT_LABEL_ATTACHMENTS: "Vedhæftninger" - MESSAGE_LOADING: "Indlæser" - MESSAGE_VIEW_DESC: "Vælg meddelelse i oversigten for visning." - MESSAGE_VIEW_MOVE_DESC: "Vælg modtagemappe i panelet til venstre." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Adgangskode" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP signeret meddelelse (tryk for at verificere)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP krypteret meddelelse (tryk for at dekryptere)" - LINK_DOWNLOAD_AS_ZIP: "Hent som zip-fil" - LINK_SAVE_TO_OWNCLOUD: "Gem til ownCloud" - LINK_SAVE_TO_DROPBOX: "Gem til Dropbox" - READ_RECEIPT: - SUBJECT: "Kvittering for læsning af - %SUBJECT%" - BODY: | - Kvittering for læsning af %READ-RECEIPT%. - - Bemærk: "Dette bekræfter bare at meddelelsen er blevet vist på modtagerens computer." - Der er ingen garanti for at modtager har læst meddelelsen. - SUGGESTIONS: - SEARCHING_DESC: "Søger..." - CONTACTS: - LEGEND_CONTACTS: "Kontakter" - SEARCH_INPUT_PLACEHOLDER: "Søg" - BUTTON_ADD_CONTACT: "Tilføj kontakt" - BUTTON_CREATE_CONTACT: "Ny kontakt" - BUTTON_UPDATE_CONTACT: "Opdater kontakt" - BUTTON_IMPORT: "Importer kontakter (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Eksporter kontakter (vcf, vCard)" - BUTTON_EXPORT_CSV: "Eksporter kontakter (csv)" - ERROR_IMPORT_FILE: "Importfejl (forkert fil type)" - LIST_LOADING: "Indlæser" - EMPTY_LIST: "Ingen kontakter" - EMPTY_SEARCH: "Ingen kontakter fundet" - CLEAR_SEARCH: "Fjern søgning" - CONTACT_VIEW_DESC: "Vælg kontakt i oversigten for visning." - LABEL_DISPLAY_NAME: "Visningsnavn" - LABEL_EMAIL: "E-mail" - LABEL_PHONE: "Telefon" - LABEL_WEB: "Hjemmeside" - LABEL_BIRTHDAY: "Fødselsdag" - LINK_ADD_EMAIL: "Tilføj e-mail adresse" - LINK_ADD_PHONE: "Tilføj telefonnummer" - LINK_BIRTHDAY: "Fødselsdag" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Indtast kaldenavn" - PLACEHOLDER_ENTER_LAST_NAME: "Indtast efternavn" - PLACEHOLDER_ENTER_FIRST_NAME: "Indtast fornavn(e)" - PLACEHOLDER_ENTER_NICK_NAME: "Indtast kaldenavn" - LABEL_READ_ONLY: "Skrivebeskyttet" - LABEL_SHARE: "Del" - ADD_MENU_LABEL: "Tilføj" - ADD_MENU_NICKNAME: "Kaldenavn" - ADD_MENU_NOTES: "Noter" - ADD_MENU_EMAIL: "E-mail" - ADD_MENU_PHONE: "Telefon" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Adresse" - ADD_MENU_BIRTHDAY: "Fødselsdag" - ADD_MENU_TAGS: "Mærkater" - BUTTON_SHARE_NONE: "Ingen" - BUTTON_SHARE_ALL: "Alle" - BUTTON_SYNC: "Synkronisering (CardDAV)" - COMPOSE: - TITLE_FROM: "Fra" - TITLE_TO: "Til" - TITLE_CC: "CC" - TITLE_BCC: "BCC" - TITLE_REPLY_TO: "Svar til" - TITLE_SUBJECT: "Emne" - LINK_SHOW_INPUTS: "Vis alle felter" - BUTTON_SEND: "Send" - BUTTON_SAVE: "Gem" - BUTTON_DELETE: "Slet" - BUTTON_CANCEL: "Annuller" - BUTTON_MINIMIZE: "Minimer" - SAVED_TIME: "Gemt klokken %TIME%" - SAVED_ERROR_ON_SEND: "Meddelelse blev afsendt, men ikke gemt i mappen for sendte meddelelser" - DISCARD_UNSAVED_DATA: "Slet ikke gemt data?" - ATTACH_FILES: "Vedhæft filer" - ATTACH_DROP_FILES_DESC: "Slip filer her" - ATTACH_ITEM_CANCEL: "Annuller" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drev" - REPLY_MESSAGE_TITLE: "Den %DATE% klokken %TIME%, skrev %EMAIL%:" - FORWARD_MESSAGE_TOP_TITLE: "-------- Videresendt meddelelse -------" - FORWARD_MESSAGE_TOP_FROM: "Fra" - FORWARD_MESSAGE_TOP_TO: "Til" - FORWARD_MESSAGE_TOP_CC: "CC" - FORWARD_MESSAGE_TOP_SENT: "Sendt" - FORWARD_MESSAGE_TOP_SUBJECT: "Emne" - EMPTY_TO_ERROR_DESC: "Tilføj minimum en modtager" - NO_ATTACHMENTS_HERE_DESC: "Ingen vedhæftninger." - ATTACHMENTS_ERROR_DESC: "Advarsels! Ikke alle vedhæftninger er overført." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Overførsel af vedhæftninger igang." - BUTTON_REQUEST_READ_RECEIPT: "Bed om kvittering for læsning" - BUTTON_MARK_AS_IMPORTANT: "Markér som vigtig" - BUTTON_OPEN_PGP: "OpenPGP (kun plain tekst)" - BUTTON_REQUEST_DSN: "Bed om kvittering for modtagelse" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Luk" - POPUPS_ASK: - BUTTON_YES: "Ja" - BUTTON_NO: "Nej" - DESC_WANT_CLOSE_THIS_WINDOW: "Vil du lukke vinduet?" - DESC_WANT_DELETE_MESSAGES: "Vil du slette denne/disse meddelelse(r)?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Vælg sprog" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Tilføj konto?" - BUTTON_ADD_ACCOUNT: "Tilføj" - TITLE_UPDATE_ACCOUNT: "Opdater konto?" - BUTTON_UPDATE_ACCOUNT: "Opdater" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Tilføj identitet?" - TITLE_UPDATE_IDENTITY: "Opdater identitet?" - BUTTON_ADD_IDENTITY: "Tilføj" - BUTTON_UPDATE_IDENTITY: "Opdater" - LABEL_EMAIL: "E-mail" - LABEL_NAME: "Navn" - LABEL_REPLY_TO: "Svar til" - LABEL_SIGNATURE: "Signatur" - LABEL_CC: "Cc" - LABEL_BCC: "Bcc" - LABEL_SIGNATURE_INSERT_BEFORE: "Indsæt signatur før citeret tekst" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Opret ny mappe?" - LABEL_NAME: "Mappenavn" - LABEL_PARENT: "Hovedmappe" - BUTTON_CREATE: "Opret ny mappe" - BUTTON_CANCEL: "Annuller" - BUTTON_CLOSE: "Luk" - TITLE_CREATING_PROCESS: "Opretter mappe" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Tøm mappe?" - BUTTON_CLEAR: "Tøm mappe" - BUTTON_CANCEL: "Annuller" - BUTTON_CLOSE: "Luk" - DANGER_DESC_WARNING: "Advarsel!" - DANGER_DESC_HTML_1: "Dette vil slette alle e-mails i %FOLDER%." - DANGER_DESC_HTML_2: "Handlingen kan ikke afbrydes når den er startet." - TITLE_CLEARING_PROCESS: "Tømmer mappe..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Importer OpenPGP nøgle" - BUTTON_IMPORT_OPEN_PGP_KEY: "Importer" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Vis OpenPGP nøgle" - BUTTON_SELECT: "Vælg" - BUTTON_CLOSE: "Luk" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Generér OpenPGP nøgler" - LABEL_EMAIL: "E-mail" - LABEL_NAME: "Navn" - LABEL_PASSWORD: "Adgangskode" - LABEL_KEY_BIT_LENGTH: "Nøglelængde" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generér" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP signér/krypter" - LABEL_SIGN: "Signér" - LABEL_ENCRYPT: "Krypter" - LABEL_PASSWORD: "Adgangskode" - BUTTON_SIGN: "Signér" - BUTTON_ENCRYPT: "Krypter" - BUTTON_SIGN_AND_ENCRYPT: "Signér og krypter" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP dekrypter" - LABEL_KEY: "Privat nøgle" - LABEL_PASSWORD: "Adgangskode" - BUTTON_DECRYPT: "Dekrypter" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "2-trins verifikationstest" - LABEL_CODE: "Kode" - BUTTON_TEST: "Test" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Opret filter?" - TITLE_EDIT_FILTER: "Opdater filter?" - FILTER_NAME: "Navn" - LEGEND_CONDITIONS: "Betingelser" - LEGEND_ACTIONS: "Handlinger" - BUTTON_DONE: "Færdig" - BUTTON_ADD_CONDITION: "Tilføj betingelse" - SELECT_ACTION_NONE: "Ingen" - SELECT_ACTION_MOVE_TO: "Flyt til" - SELECT_ACTION_FORWARD_TO: "Videresend til" - SELECT_ACTION_REJECT: "Afvis" - SELECT_ACTION_VACATION_MESSAGE: "Feriemeddelelse" - SELECT_ACTION_DISCARD: "Kassér" - SELECT_FIELD_FROM: "Fra" - SELECT_FIELD_RECIPIENTS: "Modtagere (Til eller CC)" - SELECT_FIELD_SUBJECT: "Emne" - SELECT_FIELD_HEADER: "Meddelelsesoplysninger" - SELECT_FIELD_SIZE: "Størrelse" - SELECT_TYPE_CONTAINS: "Indeholder" - SELECT_TYPE_NOT_CONTAINS: "Indeholder ikke" - SELECT_TYPE_MATCHES: "Svarer til (* og ? kan bruges)" - SELECT_TYPE_NOT_MATCHES: "Svarer ikke til (* og ? kan bruges)" - SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Ikke regexp" - SELECT_TYPE_EQUAL_TO: "Lig med" - SELECT_TYPE_NOT_EQUAL_TO: "Ikke lige med" - SELECT_TYPE_OVER: "Over" - SELECT_TYPE_UNDER: "Under" - SELECT_MATCH_ANY: "Passer til en af følgende regler" - SELECT_MATCH_ALL: "Passer til alle følgende regler" - MARK_AS_READ_LABEL: "Markér som læst" - REPLY_INTERVAL_LABEL: "Svarinterval (dage)" - KEEP_LABEL: "Behold" - STOP_LABEL: "Forsæt med at tjekke regler" - EMAIL_LABEL: "E-mail" - VACATION_SUBJECT_LABEL: "Emne (valgfrit)" - VACATION_MESSAGE_LABEL: "Meddelelse" - VACATION_RECIPIENTS_LABEL: "Modtagere (kommaseparerede)" - REJECT_MESSAGE_LABEL: "Afvis meddelelse" - ALL_INCOMING_MESSAGES_DESC: "Alle modtagne meddelelser" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Vælg systemmapper" - SELECT_CHOOSE_ONE: "Vælg en" - SELECT_UNUSE_NAME: "Brug ikke" - LABEL_SENT: "Sendte meddelelser" - LABEL_DRAFTS: "Kladder" - LABEL_SPAM: "Uønskede meddelelser" - LABEL_TRASH: "Slettede meddelelser" - LABEL_ARCHIVE: "Arkiverede meddelelser" - BUTTON_CANCEL: "Annuller" - BUTTON_CLOSE: "Luk" - NOTIFICATION_SENT: | - Du har ikke valgt en systemmappe til sendte meddelelser. - NOTIFICATION_DRAFTS: "Du har ikke valgt en systemmappe til kladder." - NOTIFICATION_SPAM: | - Du har ikke valgt en systemmappe til uønskede meddelelser. - NOTIFICATION_TRASH: | - Du har ikke valgt en systemmappe til slettede meddelelser. - Hvis du vil slette meddelelser permanent, vælg "Brug ikke". - NOTIFICATION_ARCHIVE: "Du har ikke valgt en systemmappe til arkiverede meddelelser." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "2-trins verifikation (TOTP)" - LABEL_ENABLE_TWO_FACTOR: "Aktivér 2-trins verifikation" - LABEL_TWO_FACTOR_USER: "Bruger" - LABEL_TWO_FACTOR_STATUS: "Status" - LABEL_TWO_FACTOR_SECRET: "2-trins verificeringshemmelighed" - LABEL_TWO_FACTOR_BACKUP_CODES: "Tag backup af 2-trins verificeringshemmeligheder" - BUTTON_CREATE: "Opret en hemmelighed" - BUTTON_ACTIVATE: "Aktivér" - BUTTON_CLEAR: "Slet" - BUTTON_LOGOUT: "Log ud" - BUTTON_DONE: "Færdig" - BUTTON_TEST: "Test" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Vis hemmelighed" - BUTTON_HIDE_SECRET: "Skjul hemmelighed" - TWO_FACTOR_REQUIRE_DESC: "Din konto kræver 2-trins verifikation." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Konfigureret" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Ikke konfigureret" - TWO_FACTOR_SECRET_DESC: > - Importer denne information til din Google Autentificering app (eller en anden - TOTP klient) ved hjælp af QR koden herunder eller ved at indtaste koden manuelt. - TWO_FACTOR_BACKUP_CODES_DESC: > - Hvis du ikke kan modtage koder ved hjælp af Google Autentificering appen (eller - en anden TOTP klient), kan du bruge backup koder til at logge ind med. Når - en backup kode er brugt en gang bliver den inaktiv. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Indstillingen kan ikke ændres før den er testet." - TITLES: - LOADING: "Indlæser" - LOGIN: "Log ind" - MAILBOX: "Postkasse" - SETTINGS: "Indstillinger" - COMPOSE: "Forfat" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Filen er for stor" - ERROR_FILE_PARTIALLY_UPLOADED: "Upload ufuldent, ukendt fejl." - ERROR_NO_FILE_UPLOADED: "Ingen fil uploaded" - ERROR_MISSING_TEMP_FOLDER: "Midlertidig fil findes ikke" - ERROR_ON_SAVING_FILE: "Ukendt upload fejl" - ERROR_FILE_TYPE: "Forkert filtype" - ERROR_UNKNOWN: "Ukendt upload fejl" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" - TEXT_SWITCHER_RICH_FORMATTING: "Rig formatering" - TEXT_SWITCHER_CONFIRM: "Formatering og billeder vil gå tabt. Forsæt?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Personlig" - LABEL_GENERAL_NAME: "Generelt" - LABEL_CONTACTS_NAME: "Kontakter" - LABEL_FOLDERS_NAME: "Mapper" - LABEL_ACCOUNTS_NAME: "Kontoer" - LABEL_IDENTITY_NAME: "Identitet" - LABEL_IDENTITIES_NAME: "Identiteter" - LABEL_FILTERS_NAME: "Filtre" - LABEL_TEMPLATES_NAME: "Skabeloner" - LABEL_SECURITY_NAME: "Sikkerhed" - LABEL_SOCIAL_NAME: "Social" - LABEL_THEMES_NAME: "Temaer" - LABEL_CHANGE_PASSWORD_NAME: "Adgangskode" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Tilbage" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filtre" - BUTTON_SAVE: "Gem" - BUTTON_ADD_FILTER: "Tilføj filter" - BUTTON_DELETE: "Slet" - BUTTON_RAW_SCRIPT: "Anvend brugerdefineret script" - SUBNAME_NONE: "Ingen" - SUBNAME_MOVE_TO: "Flyt til \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Videresend til \"%EMAIL%\"" - SUBNAME_REJECT: "Afvis" - SUBNAME_VACATION_MESSAGE: "Feriemeddelelse" - SUBNAME_DISCARD: "Kassér" - CAPABILITY_LABEL: "Evner" - LOADING_PROCESS: "Opdater oversigten over filtre" - DELETING_ASK: "Er du sikker?" - CHACHES_NEED_TO_BE_SAVED_DESC: "Ændringerne skal gemmes til serveren." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identitet" - LABEL_DISPLAY_NAME: "Navn" - LABEL_REPLY_TO: "Svar til" - LABEL_SIGNATURE: "Signatur" - LABEL_ADD_SIGNATURE_TO_ALL: "Tilføj din signatur til alle meddelelser" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Sikkerhed" - LABEL_CONFIGURE_TWO_FACTOR: "Opsæt 2-trins verifikation" - LABEL_AUTOLOGOUT: "Automatisk log ud" - AUTOLOGIN_NEVER_OPTION_NAME: "Aldrig" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minut(ter)" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% time(r)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Generelt" - LABEL_LANGUAGE: "Sprog" - LABEL_IDENTITY: "Identitet" - LABEL_LAYOUT: "Layout" - LABEL_LAYOUT_NO_SPLIT: "Del ikke" - LABEL_LAYOUT_VERTICAL_SPLIT: "Del lodret" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Del vandret" - LABEL_EDITOR: "Standard tekst program" - LABEL_EDITOR_HTML: "Html" - LABEL_EDITOR_PLAIN: "Plain" - LABEL_EDITOR_HTML_FORCED: "Html (gennemtvunget)" - LABEL_EDITOR_PLAIN_FORCED: "Plain (gennemtvunget)" - LABEL_ANIMATION: "Grænsefladeanimation" - LABEL_ANIMATION_FULL: "Fuld" - LABEL_ANIMATION_NORMAL: "Normal" - LABEL_ANIMATION_NONE: "Ingen" - LABEL_VIEW_OPTIONS: "Visningsindstillinger" - LABEL_USE_PREVIEW_PANE: "Brug preview panel" - LABEL_USE_CHECKBOXES_IN_LIST: "Vis afkrydsningsfelt i oversigten" - LABEL_USE_THREADS: "Brug samtaler" - LABEL_REPLY_SAME_FOLDER: "Placer svar i samme mappe som oprindelig meddelelse" - LABEL_SHOW_IMAGES: "Vis altid eksterne billeder" - LABEL_SHOW_ANIMATION: "Vis animationer" - LABEL_MESSAGE_PER_PAGE: "Meddelelser per side" - LABEL_NOTIFICATIONS: "Notifikationer" - LABEL_SOUND_NOTIFICATION: "Lyd notifikationer" - LABEL_CHROME_NOTIFICATION_DESC: "Vis ny meddelelses notifikations popup" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Blokeret af browseren)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Kontakter" - LABEL_CONTACTS_AUTOSAVE: "Tilføj automatisk modtager til adressebog" - LEGEND_CONTACTS_SYNC: "Synkronisering (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Aktivér synkronisering" - LABEL_CONTACTS_SYNC_SERVER: "Server" - LABEL_CONTACTS_SYNC_AB_URL: "Adressebogs URL" - LABEL_CONTACTS_SYNC_USER: "Bruger" - LABEL_CONTACTS_SYNC_PASSWORD: "Adgangskode" - SETTINGS_THEMES: - LEGEND_THEMES: "Temaer" - LEGEND_THEMES_CUSTOM: "Brugerdefineret temakonfiguration" - LABEL_CUSTOM_TYPE: "Type" - LABEL_CUSTOM_TYPE_LIGHT: "Lys" - LABEL_CUSTOM_TYPE_DARK: "Mørk" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Baggrund" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Upload baggrundsbillede (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "Fil for stor" - ERROR_FILE_TYPE_ERROR: "Forkert filtype (kun JPG og PNG )" - ERROR_UNKNOWN: "Ukendt upload fejl" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Forbind til Google" - BUTTON_GOOGLE_DISCONNECT: "Afbryd forbindelse til Google" - MAIN_GOOGLE_DESC: "Ved aktivering af log ind via Google, kan der logges ind ved hjælp af Google knappen på log ind skærmen." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Forbind til Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Afbryd forbindelse til Facebook" - MAIN_FACEBOOK_DESC: "Ved aktivering af log ind via Facebook, kan der logges ind ved hjælp af Facebook knappen på log ind skærmen." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Forbind til Twitter" - BUTTON_TWITTER_DISCONNECT: "Afbryd forbindelse til Twitter" - MAIN_TWITTER_DESC: "Ved aktivering af log ind via Twitter, kan der logges ind ved hjælp af Twitter knappen på log ind skærmen." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Mappeoversigt" - BUTTON_CREATE: "Opret ny mappe" - BUTTON_SYSTEM: "Systemmapper" - BUTTON_DELETE: "Slet" - BUTTON_SUBSCRIBE: "Tilmeld" - BUTTON_UNSUBSCRIBE: "Afmeld" - LOADING_PROCESS: "Opdaterer mappeoversigt" - CREATING_PROCESS: "Opretter mappe" - DELETING_PROCESS: "Sletter mappe" - RENAMING_PROCESS: "Omdøber mappe" - DELETING_ASK: "Er du sikker?" - TO_MANY_FOLDERS_DESC_1: "For mange mapper!" - TO_MANY_FOLDERS_DESC_2: "Kun nogle mapper vises for at undgå problemer." - HELP_DELETE_FOLDER: "Slet mappe" - HELP_SHOW_HIDE_FOLDER: "Vis/skjul mappe" - HELP_CHECK_FOR_NEW_MESSAGES: "Markér/fjern markering for nye meddelelser" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Kontoer" - LEGEND_IDENTITIES: "Identiteter" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Kontoer og identiteter" - BUTTON_ADD_ACCOUNT: "Tilføj konto" - BUTTON_ADD_IDENTITY: "Tilføj identitet?" - BUTTON_DELETE: "Slet" - LOADING_PROCESS: "Opdaterer..." - DELETING_ASK: "Er du sikker?" - DEFAULT_IDENTITY_LABEL: "standard" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identitet" - LEGEND_IDENTITIES: "Ekstra identiteter" - LABEL_DEFAULT: "Standard" - LABEL_DISPLAY_NAME: "Navn" - LABEL_REPLY_TO: "Svar til" - LABEL_SIGNATURE: "Signatur" - LABEL_ADD_SIGNATURE_TO_ALL: "Tilføj din signatur til alle meddelelser" - BUTTON_ADD_IDENTITY: "Tilføj identitet" - BUTTON_DELETE: "Slet" - LOADING_PROCESS: "Opdaterer identitetsoversigt" - DELETING_ASK: "Er du sikker?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Skift adgangskode" - LABEL_CURRENT_PASSWORD: "Nuværende adgangskode" - LABEL_NEW_PASSWORD: "Ny adgangskode" - LABEL_REPEAT_PASSWORD: "Bekræft ny adgangskode" - BUTTON_UPDATE_PASSWORD: "Ny adgangskode" - ERROR_PASSWORD_MISMATCH: "Adgangskoder er ikke ens, prøv igen" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Importer OpenPGP nøgle" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generer OpenPGP nøgler" - TITLE_PRIVATE: "Privat" - TITLE_PUBLIC: "Offentlig" - DELETING_ASK: "Er du sikker?" - GENERATE_ONLY_HTTPS: "Kun HTTPS" - LABEL_ALLOW_DRAFT_AUTOSAVE: "Gem kladde automatisk" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Hjælp til tasteturgenveje" - TAB_MAILBOX: "Postkasse" - TAB_MESSAGE_LIST: "Meddelelsesoversigt" - TAB_MESSAGE_VIEW: "Meddelelsesvisning" - TAB_COMPOSE: "Forfat" - LABEL_OPEN_USER_DROPDOWN: "Åben brugermenu" - LABEL_REPLY: "Svar" - LABEL_REPLY_ALL: "Svar alle" - LABEL_FORWARD: "Videresend" - LABEL_FORWARD_MULTIPLY: "Videresend som vedhæftning(er)" - LABEL_HELP: "Hjælp" - LABEL_CHECK_ALL: "Vælg alle meddelelser" - LABEL_ARCHIVE: "Arkivér" - LABEL_DELETE: "Slet" - LABEL_OPEN_THREAD: "Åben valgte samtale" - LABEL_MOVE: "Flyt" - LABEL_READ: "Markér valgte meddelelser som læste" - LABEL_UNREAD: "Markér valgte meddelelser som ulæste" - LABEL_IMPORTANT: "Markér valgte meddelelser som vigtige" - LABEL_SEARCH: "Søg" - LABEL_CANCEL_SEARCH: "Annuller søgning" - LABEL_FULLSCREEN_ENTER: "Fuld skærm (Preview panel layout)" - LABEL_VIEW_MESSAGE_ENTER: "Vis meddelelser (Uden preview panel layout)" - LABEL_SWITCH_TO_MESSAGE: "Fokuser på valgte meddelelser" - LABEL_SWITCH_TO_FOLDER_LIST: "Fokuser på mappeoversigt" - LABEL_FULLSCREEN_TOGGLE: "Fuld skærm" - LABEL_BLOCKQUOTES_TOGGLE: "Slå blokcitater til/fra i meddelelser" - LABEL_THREAD_NEXT: "Næste besked i samtale" - LABEL_THREAD_PREV: "Forrige besked i samtale" - LABEL_PRINT: "Udskriv" - LABEL_EXIT_FULLSCREEN: "Luk fuld skærm" - LABEL_CLOSE_MESSAGE: "Luk meddelelse (Uden preview panel layout)" - LABEL_SWITCH_TO_LIST: "Fokuser på meddelelsesoversigt" - LABEL_OPEN_COMPOSE_POPUP: "Åben forfatter popup" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimer forfatter popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Åben identitetsmenu" - LABEL_SAVE_MESSAGE: "Gem meddelelse" - LABEL_SEND_MESSAGE: "Send meddelelse" - LABEL_CLOSE_COMPOSE: "Luk forfatter mode" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "Ingen offentlige nøgler fundet" - NO_PUBLIC_KEYS_FOUND_FOR: "Ingen offentlige nøgler fundet tilhørende \"%EMAIL%\"" - NO_PRIVATE_KEY_FOUND: "Ingen privat nøgle fundet" - NO_PRIVATE_KEY_FOUND_FOR: "Ingen privat nøgle fundet tilhørende \"%EMAIL%\"" - ADD_A_PUBLICK_KEY: "Tilføj privat nøgle" - SELECT_A_PRIVATE_KEY: "Vælg privat nøgle" - UNVERIFIRED_SIGNATURE: "Ikke verificeret signatur" - DECRYPTION_ERROR: "OpenPGP dekrypteringsfejl" - GOOD_SIGNATURE: "Accepteret signatur for %USER\"" - PGP_ERROR: "OpenPGP fejl: %ERROR%" - SPECIFY_FROM_EMAIL: "Udfyld afsenderadresse" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Angiv mindst en modtager" - NOTIFICATIONS: - INVALID_TOKEN: "Ugyldigt tegn" - AUTH_ERROR: "Godkendelse fejlede" - ACCESS_ERROR: "Adgangsfejl" - CONNECTION_ERROR: "Kan ikke kontakte server" - CAPTCHA_ERROR: "Forkert CAPTCHA" - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Dette sociale ID er ikke knyttet til en e-mail konto endnu. Log ind ved brug - af e-mail og tilføj ID'et under kontoindstillinger. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Dette sociale ID er ikke knyttet til en e-mail konto endnu. Log ind ved brug - af e-mail og tilføj ID'et under kontoindstillinger. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Dette sociale ID er ikke knyttet til en e-mail konto endnu. Log ind ved brug - af e-mail og tilføj ID'et under kontoindstillinger. - DOMAIN_NOT_ALLOWED: "Domæne ikke tilladt" - ACCOUNT_NOT_ALLOWED: "Konto ikke tilladt" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2-faktor verifikation påbudt." - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2-faktor verifikationsfejl" - COULD_NOT_SAVE_NEW_PASSWORD: "Kunne ikke gemme ny adgangskode" - CURRENT_PASSWORD_INCORRECT: "Nuværende adgangskode forkert" - NEW_PASSWORD_SHORT: "Adgangskoden for kort" - NEW_PASSWORD_WEAK: "Adgangskoden for simpel" - NEW_PASSWORD_FORBIDDENT: "Adgangskode indeholder forbudte tegn" - CONTACTS_SYNC_ERROR: "Fejl ved synkronisering af kontakter" - CANT_GET_MESSAGE_LIST: "Kan ikke indlæse meddelelsesoversigt " - CANT_GET_MESSAGE: "Kan ikke indlæse meddelelse" - CANT_DELETE_MESSAGE: "Kan ikke slette meddelelse" - CANT_MOVE_MESSAGE: "Kan ikke flytte meddelelse" - CANT_SAVE_MESSAGE: "Kan ikke gemme meddelelse" - CANT_SEND_MESSAGE: "Kan ikke sende meddelelse" - INVALID_RECIPIENTS: "Ugyldige modtagere" - CANT_SAVE_FILTERS: "Kan ikke gemme filtre" - CANT_GET_FILTERS: "Kan ikke indlæse filtre" - FILTERS_ARE_NOT_CORRECT: "Fejl i filtre" - CANT_CREATE_FOLDER: "Kan ikke oprette mappe" - CANT_RENAME_FOLDER: "Kan ikke omdøbe mappe" - CANT_DELETE_FOLDER: "Kan ikke slette mappe" - CANT_DELETE_NON_EMPTY_FOLDER: "Kan ikke slette mappe som ikke er tom" - CANT_SUBSCRIBE_FOLDER: "Kan ikke abonnere på mappe" - CANT_UNSUBSCRIBE_FOLDER: "Kan ikke afmelde mappe" - CANT_SAVE_SETTINGS: "Kan ikke gemme instillinger" - CANT_SAVE_PLUGIN_SETTINGS: "Kan ikke gemme instillinger" - DOMAIN_ALREADY_EXISTS: "Domæne eksisterer allerede" - CANT_INSTALL_PACKAGE: "Installation af pakke mislykkedes" - CANT_DELETE_PACKAGE: "Fjernelse af pakke mislykkedes" - INVALID_PLUGIN_PACKAGE: "Ugyldig tilføjelsespakke" - UNSUPPORTED_PLUGIN_PACKAGE: "Tilføjelsespakke ikke understøttet" - LICENSING_SERVER_IS_UNAVAILABLE: "Abonnementsserver ikke tilgængelig" - LICENSING_DOMAIN_EXPIRED: "Abonnement på domæne udløbet." - LICENSING_DOMAIN_BANNED: "Abonnement på domæne forbudt." - DEMO_SEND_MESSAGE_ERROR: "Denne konto kan af sikkerhedshensyn ikke sende e-mails til eksterne adresser!" - DEMO_ACCOUNT_ERROR: "Denne konto kan af sikkerhedshensyn ikke udføre denne handling!" - ACCOUNT_ALREADY_EXISTS: "Kontoen eksisterer allerede" - ACCOUNT_DOES_NOT_EXIST: "Kontoen eksisterer ikke" - MAIL_SERVER_ERROR: "Der skete en fejl under adgang til e-mail serveren" - INVALID_INPUT_ARGUMENT: "Ugyldigt argument" - UNKNOWN_ERROR: "Ukendt fejl" - STATIC: - BACK_LINK: "Genindlæs" - DOMAIN_LIST_DESC: "Liste over domæner webmail er tilladt adgang til." - PHP_EXSTENSIONS_ERROR_DESC: "Nødvendige PHP udvidelser er ikke tilgængelige!" - PHP_VERSION_ERROR_DESC: "PHP versionen (%VERSION%) er for gammel. Minimum 5.3.0 er nødvendig!" - NO_SCRIPT_TITLE: "JavaScript er nødvendigt for dette program." - NO_SCRIPT_DESC: | - JavaScript er slået fra i din browser. - Slå JavaScript til og prøv igen. - NO_COOKIE_TITLE: "Cookies er nødvendige for dette program." - NO_COOKIE_DESC: | - Cookies er slået fra i din browser. - Slå Cookies til og prøv igen. - BAD_BROWSER_TITLE: "Din browser er forældet." - BAD_BROWSER_DESC: | - Enkelte funktioner fungerer ikke med denne browser. - For at bruge alle funktioner, hent en af følgende: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/de_DE.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/de_DE.yml deleted file mode 100755 index 2ca96aa3..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/de_DE.yml +++ /dev/null @@ -1,715 +0,0 @@ -de_DE: - LOGIN: - LABEL_EMAIL: "E-Mail" - LABEL_LOGIN: "Login" - LABEL_PASSWORD: "Passwort" - LABEL_SIGN_ME: "Anmeldung merken" - LABEL_VERIFICATION_CODE: "Verifizierungscode" - LABEL_DONT_ASK_VERIFICATION_CODE: "Für zwei Wochen nicht nach dem Code fragen" - BUTTON_SIGN_IN: "Anmelden" - TITLE_SIGN_IN_GOOGLE: "Mit Google anmelden" - TITLE_SIGN_IN_FACEBOOK: "Mit Facebook anmelden" - TITLE_SIGN_IN_TWITTER: "Mit Twitter anmelden" - LABEL_FORGOT_PASSWORD: "Passwort vergessen" - LABEL_REGISTRATION: "Registrierung" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Konto hinzufügen" - BUTTON_SETTINGS: "Einstellungen" - BUTTON_HELP: "Hilfe" - BUTTON_LOGOUT: "Abmelden" - MOBILE: - BUTTON_MOBILE_VERSION: "mobile Version" - BUTTON_DESKTOP_VERSION: "Desktop Version" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Suche" - TITLE_ADV: "Erweiterte Suche" - LABEL_ADV_FROM: "Von" - LABEL_ADV_TO: "An" - LABEL_ADV_SUBJECT: "Betreff" - LABEL_ADV_TEXT: "Text" - LABEL_ADV_HAS_ATTACHMENT: "Anhang vorhanden" - LABEL_ADV_HAS_ATTACHMENTS: "Anhänge vorhanden" - LABEL_ADV_FLAGGED: "Markiert" - LABEL_ADV_UNSEEN: "Ungelesen" - LABEL_ADV_DATE: "Datum" - LABEL_ADV_DATE_ALL: "Alle" - LABEL_ADV_DATE_3_DAYS: "Nicht älter als 3 Tage" - LABEL_ADV_DATE_7_DAYS: "Nicht älter als 1 Woche" - LABEL_ADV_DATE_MONTH: "Nicht älter als 1 Monat" - LABEL_ADV_DATE_3_MONTHS: "Nicht älter als 3 Monate" - LABEL_ADV_DATE_6_MONTHS: "Nicht älter als 6 Monate" - LABEL_ADV_DATE_YEAR: "Nicht älter als 1 Jahr" - BUTTON_ADV_SEARCH: "Suchen" - PREVIEW_POPUP: - FULLSCREEN: "Vollbild umschalten" - ZOOM: "Herein-/Herauszoomen" - CLOSE: "Schließen (Esc)" - LOADING: "Wird geladen ..." - GALLERY_PREV: "Zurück (Linke Pfeil-Taste)" - GALLERY_NEXT: "Weiter (Rechte Pfeil-Taste)" - GALLERY_COUNTER: "%curr% von %total%" - IMAGE_ERROR: "Die Grafikdatei konnte nicht geladen werden." - AJAX_ERROR: "Der Inhalt konnte nicht geladen werden." - FOLDER_LIST: - BUTTON_COMPOSE: "Erstellen" - BUTTON_CONTACTS: "Kontakte" - BUTTON_NEW_MESSAGE: "Neue Nachricht" - INBOX_NAME: "Posteingang" - SENT_NAME: "Gesendet" - DRAFTS_NAME: "Entwürfe" - SPAM_NAME: "Spam" - TRASH_NAME: "Papierkorb" - ARCHIVE_NAME: "Archiv" - QUOTA: - TITLE: "Speicherplatz-Nutzung" - MESSAGE_LIST: - BUTTON_RELOAD: "Nachrichtenliste neu laden" - BUTTON_MOVE_TO: "Verschieben nach" - BUTTON_DELETE: "Löschen" - BUTTON_ARCHIVE: "Archiv" - BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Kein Spam" - BUTTON_EMPTY_FOLDER: "Ordner leeren" - BUTTON_MULTY_FORWARD: "Nachrichten weiterleiten" - BUTTON_DELETE_WITHOUT_MOVE: "Endgültig löschen" - BUTTON_MORE: "Mehr" - MENU_SET_SEEN: "Als gelesen markieren" - MENU_SET_ALL_SEEN: "Alle als gelesen markieren" - MENU_UNSET_SEEN: "Als ungelesen markieren" - MENU_SET_FLAG: "Markieren" - MENU_UNSET_FLAG: "Markierung entfernen" - MENU_SELECT_ALL: "Alle" - MENU_SELECT_NONE: "Keine" - MENU_SELECT_INVERT: "Umkehren" - MENU_SELECT_UNSEEN: "Ungelesen" - MENU_SELECT_SEEN: "Gelesen" - MENU_SELECT_FLAGGED: "Markiert" - MENU_SELECT_UNFLAGGED: "Nicht markiert" - EMPTY_LIST: "Liste ist leer." - EMPTY_SEARCH_LIST: "Keine Treffer für Ihre Suche." - SEARCH_RESULT_FOR: "Suchergebnisse für \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "Zurück zur Nachrichtenliste" - LIST_LOADING: "Die Liste wird geladen" - EMPTY_SUBJECT_TEXT: "(Kein Betreff)" - PUT_MESSAGE_HERE: "Ziehen Sie die Nachricht hierhin, um sie in der Liste anzuzeigen" - TODAY_AT: "Heute um %TIME%" - YESTERDAY_AT: "Gestern um %TIME%" - SEARCH_PLACEHOLDER: "Suche" - NEW_MESSAGE_NOTIFICATION: "Sie haben %COUNT% neue Nachrichten!" - QUOTA_SIZE: "Sie nutzen %SIZE% (%PROC%%) von %LIMIT%." - MESSAGE: - BUTTON_EDIT: "Bearbeiten" - BUTTON_BACK: "Zurück" - BUTTON_CLOSE: "Schließen" - BUTTON_DELETE: "Löschen" - BUTTON_UNSUBSCRIBE: "Diese Liste abbestellen" - BUTTON_ARCHIVE: "Archiv" - BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Kein Spam" - BUTTON_MOVE_TO: "Verschieben nach" - BUTTON_MORE: "Mehr" - BUTTON_REPLY: "Antworten" - BUTTON_REPLY_ALL: "Allen antworten" - BUTTON_FORWARD: "Weiterleiten" - BUTTON_FORWARD_AS_ATTACHMENT: "Als Anhang weiterleiten" - BUTTON_EDIT_AS_NEW: "Als neue Nachricht öffnen" - BUTTON_SHOW_IMAGES: "Bilder anzeigen" - BUTTON_NOTIFY_READ_RECEIPT: "Der Absender hat darum gebeten, benachrichtigt zu werden, wenn Sie diese Nachricht lesen." - BUTTON_IN_NEW_WINDOW: "In neuem Fenster anzeigen" - BUTTON_THREAD_LIST: "Unterhaltungsliste" - BUTTON_THREAD_PREV: "Zurück" - BUTTON_THREAD_NEXT: "Weiter" - BUTTON_THREAD_MORE: "Mehr Nachrichten" - MENU_HEADERS: "Kopfzeilen anzeigen" - MENU_VIEW_ORIGINAL: "Original anzeigen" - MENU_DOWNLOAD_ORIGINAL: "Als .eml-Datei herunterladen" - MENU_FILTER_SIMILAR: "Ähnliche Nachrichten" - MENU_PRINT: "Drucken" - EMPTY_SUBJECT_TEXT: "(Kein Betreff)" - LABEL_SUBJECT: "Betreff" - LABEL_DATE: "Datum" - LABEL_FROM: "Von" - LABEL_FROM_SHORT: "von" - LABEL_TO: "An" - LABEL_TO_SHORT: "an" - LABEL_CC: "CC" - LABEL_BCC: "BCC" - LABEL_REPLY_TO: "Antwort an" - PRINT_LABEL_FROM: "Von" - PRINT_LABEL_TO: "An" - PRINT_LABEL_CC: "CC" - PRINT_LABEL_BCC: "BCC" - PRINT_LABEL_REPLY_TO: "Antwort an" - PRINT_LABEL_DATE: "Datum" - PRINT_LABEL_SUBJECT: "Betreff" - PRINT_LABEL_ATTACHMENTS: "Anhänge" - MESSAGE_LOADING: "Nachricht wird geladen" - MESSAGE_VIEW_DESC: "Wählen Sie eine Nachricht aus der Liste aus, um sie anzuzeigen." - MESSAGE_VIEW_MOVE_DESC: "Klicke auf den Ordnernamen auf der linken Seite, um die Nachricht zu verschieben." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Passwort" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP-signierte Nachricht (klicken, um zu überprüfen)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP-verschlüsselte Nachricht (klicken, um zu entschlüsseln)" - LINK_DOWNLOAD_AS_ZIP: "Als ZIP-Datei herunterladen" - LINK_SAVE_TO_OWNCLOUD: "In ownCloud speichern" - LINK_SAVE_TO_DROPBOX: "In Dropbox speichern" - READ_RECEIPT: - SUBJECT: "Empfangsbestätigung (angezeigt) - %SUBJECT%" - BODY: | - Dies ist eine Empfangsbestätigung für die Nachricht, die Sie an %READ-RECEIPT% gesendet haben. - - Hinweis: Diese Empfangsbestätigung bestätigt nur, dass die Nachricht auf dem Computer des Empfängers angezeigt wurde. - Es besteht keine Garantie, dass der Empfänger den Inhalt der Nachricht gelesen oder verstanden hat. - SUGGESTIONS: - SEARCHING_DESC: "Suche läuft..." - CONTACTS: - LEGEND_CONTACTS: "Kontakte" - SEARCH_INPUT_PLACEHOLDER: "Suche" - BUTTON_ADD_CONTACT: "Kontakt hinzufügen" - BUTTON_CREATE_CONTACT: "Kontakt anlegen" - BUTTON_UPDATE_CONTACT: "Kontakt aktualisieren" - BUTTON_IMPORT: "Import (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" - BUTTON_EXPORT_CSV: "Export (csv)" - ERROR_IMPORT_FILE: "Importfehler (ungültiges Dateiformat)" - LIST_LOADING: "Kontakte werden geladen" - EMPTY_LIST: "Keine Kontakte" - EMPTY_SEARCH: "Keine Kontakte gefunden" - CLEAR_SEARCH: "Suche leeren" - CONTACT_VIEW_DESC: "Kontakt aus der Liste wählen, um ihn anzuzeigen." - LABEL_DISPLAY_NAME: "Anzeigename" - LABEL_EMAIL: "E-Mail" - LABEL_PHONE: "Telefon" - LABEL_WEB: "Web" - LABEL_BIRTHDAY: "Geburtstag" - LINK_ADD_EMAIL: "E-Mail-Adresse hinzufügen" - LINK_ADD_PHONE: "Nummer hinzufügen" - LINK_BIRTHDAY: "Geburtstag" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Anzeigename eingeben" - PLACEHOLDER_ENTER_LAST_NAME: "Nachnamen eingeben" - PLACEHOLDER_ENTER_FIRST_NAME: "Vornamen eingeben" - PLACEHOLDER_ENTER_NICK_NAME: "Spitzname eingeben" - LABEL_READ_ONLY: "Schreibgeschützt" - LABEL_SHARE: "Teilen" - ADD_MENU_LABEL: "Hinzufügen" - ADD_MENU_NICKNAME: "Spitzname" - ADD_MENU_NOTES: "Anmerkung" - ADD_MENU_EMAIL: "E-Mail" - ADD_MENU_PHONE: "Telefon" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Adresse" - ADD_MENU_BIRTHDAY: "Geburtstag" - ADD_MENU_TAGS: "Tags" - BUTTON_SHARE_NONE: "Niemand" - BUTTON_SHARE_ALL: "Jeder" - BUTTON_SYNC: "Synchronisierung (CardDAV)" - COMPOSE: - TITLE_FROM: "Von" - TITLE_TO: "An" - TITLE_CC: "CC" - TITLE_BCC: "BCC" - TITLE_REPLY_TO: "Antwort an" - TITLE_SUBJECT: "Betreff" - LINK_SHOW_INPUTS: "alle Felder anzeigen" - BUTTON_SEND: "Senden" - BUTTON_SAVE: "Speichern" - BUTTON_DELETE: "Löschen" - BUTTON_CANCEL: "Abbrechen" - BUTTON_MINIMIZE: "Minimieren" - SAVED_TIME: "Gespeichert um %TIME%" - SAVED_ERROR_ON_SEND: "Die Nachricht wurde gesendet, konnte aber nicht im Gesendet-Ordner gespeichert werden." - DISCARD_UNSAVED_DATA: "Nicht gespeicherte Daten löschen?" - ATTACH_FILES: "Dateien anhängen" - ATTACH_DROP_FILES_DESC: "Fügen Sie hier Dateien ein" - ATTACH_ITEM_CANCEL: "Abbrechen" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% schrieb" - FORWARD_MESSAGE_TOP_TITLE: "-------- Weitergeleitete Nachricht -------" - FORWARD_MESSAGE_TOP_FROM: "Von" - FORWARD_MESSAGE_TOP_TO: "An" - FORWARD_MESSAGE_TOP_CC: "CC" - FORWARD_MESSAGE_TOP_SENT: "Gesendet" - FORWARD_MESSAGE_TOP_SUBJECT: "Betreff" - EMPTY_TO_ERROR_DESC: "Geben Sie bitte mindestens einen Empfänger an" - NO_ATTACHMENTS_HERE_DESC: "Keine Anhänge vorhanden." - ATTACHMENTS_ERROR_DESC: "Warnung! Nicht alle Anhänge wurden hochgeladen." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Es wurden noch nicht alle Anhänge hochgeladen." - BUTTON_REQUEST_READ_RECEIPT: "Empfangsbestätigung anfordern" - BUTTON_MARK_AS_IMPORTANT: "Als Wichtig markieren" - BUTTON_OPEN_PGP: "OpenPGP (nur bei unformatiertem Text)" - BUTTON_REQUEST_DSN: "Übermittlungsstatus anfordern" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Schließen" - POPUPS_ASK: - BUTTON_YES: "Ja" - BUTTON_NO: "Nein" - DESC_WANT_CLOSE_THIS_WINDOW: "Sind Sie sicher, dass Sie dieses Fenster schließen möchten?" - DESC_WANT_DELETE_MESSAGES: "Sind Sie sicher, dass Sie diese Nachricht(en) löschen möchten?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Sprache auswählen" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Konto hinzufügen?" - BUTTON_ADD_ACCOUNT: "Hinzufügen" - TITLE_UPDATE_ACCOUNT: "Konto aktualisieren?" - BUTTON_UPDATE_ACCOUNT: "Aktualisieren" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Identität hinzufügen?" - TITLE_UPDATE_IDENTITY: "Identität aktualisieren?" - BUTTON_ADD_IDENTITY: "Hinzufügen" - BUTTON_UPDATE_IDENTITY: "Aktualisieren" - LABEL_EMAIL: "E-Mail" - LABEL_NAME: "Name" - LABEL_REPLY_TO: "Antwort an" - LABEL_SIGNATURE: "Signatur" - LABEL_CC: "CC" - LABEL_BCC: "BCC" - LABEL_SIGNATURE_INSERT_BEFORE: "Diese Signatur in Antworten vor dem zitierten Text einfügen" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Ordner anlegen?" - LABEL_NAME: "Ordnername" - LABEL_PARENT: "Übergeordneter Ordner" - BUTTON_CREATE: "Anlegen" - BUTTON_CANCEL: "Abbrechen" - BUTTON_CLOSE: "Schließen" - TITLE_CREATING_PROCESS: "Ordner wird angelegt" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Alle Nachrichten in diesem Ordner löschen?" - BUTTON_CLEAR: "Bereinigen" - BUTTON_CANCEL: "Abbrechen" - BUTTON_CLOSE: "Schließen" - DANGER_DESC_WARNING: "Achtung!" - DANGER_DESC_HTML_1: "Dieser Schritt wird alle Nachrichten im Ordner %FOLDER% endgültig löschen." - DANGER_DESC_HTML_2: "Einmal begonnen, kann dieser Vorgang nicht mehr abgebrochen oder beendet werden." - TITLE_CLEARING_PROCESS: "Ordner wird gelöscht ..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "OpenPGP-Schlüssel importieren" - BUTTON_IMPORT_OPEN_PGP_KEY: "Importieren" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "OpenPGP-Schlüssel anzeigen" - BUTTON_SELECT: "Auswählen" - BUTTON_CLOSE: "Schließen" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "OpenPGP-Schlüssel generieren" - LABEL_EMAIL: "E-Mail" - LABEL_NAME: "Name" - LABEL_PASSWORD: "Passwort" - LABEL_KEY_BIT_LENGTH: "Schlüssellänge" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generieren" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP unterschreiben/verschlüsseln" - LABEL_SIGN: "Unterschrift" - LABEL_ENCRYPT: "Verschlüsselung" - LABEL_PASSWORD: "Passwort" - BUTTON_SIGN: "Unterschreiben" - BUTTON_ENCRYPT: "Verschlüsseln" - BUTTON_SIGN_AND_ENCRYPT: "Unterschreiben und verschlüsseln" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" - LABEL_KEY: "Private Key" - LABEL_PASSWORD: "Password" - BUTTON_DECRYPT: "Decrypt" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "Zwei-Faktor-Authentifizierung" - LABEL_CODE: "Code" - BUTTON_TEST: "Testen" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Filter erstellen?" - TITLE_EDIT_FILTER: "Filter bearbeiten?" - FILTER_NAME: "Name" - LEGEND_CONDITIONS: "Bedingungen" - LEGEND_ACTIONS: "Aktionen" - BUTTON_DONE: "Erledigt" - BUTTON_ADD_CONDITION: "Bedingung hinzufügen" - SELECT_ACTION_NONE: "Keine" - SELECT_ACTION_MOVE_TO: "Verschieben nach" - SELECT_ACTION_FORWARD_TO: "Weiterleiten nach" - SELECT_ACTION_REJECT: "Ablehnen" - SELECT_ACTION_VACATION_MESSAGE: "Urlaubsbenachrichtigung" - SELECT_ACTION_DISCARD: "Verwerfen" - SELECT_FIELD_FROM: "Von" - SELECT_FIELD_RECIPIENTS: "Empfänger (An oder CC)" - SELECT_FIELD_SUBJECT: "Betreff" - SELECT_FIELD_HEADER: "Nachrichtenkopf" - SELECT_FIELD_SIZE: "Größe" - SELECT_TYPE_CONTAINS: "Enthält" - SELECT_TYPE_NOT_CONTAINS: "Enthält nicht" - SELECT_TYPE_MATCHES: "Übereinstimmung (* und ? unterstützt)" - SELECT_TYPE_NOT_MATCHES: "Keine Übereinstimmung (* und ? unterstützt)" - SELECT_TYPE_REGEXP: "Regulärer Ausdruck" - SELECT_TYPE_NOT_REGEXP: "Regulärer Ausdruck (negiert)" - SELECT_TYPE_EQUAL_TO: "Gleich" - SELECT_TYPE_NOT_EQUAL_TO: "Ungleich" - SELECT_TYPE_OVER: "Über" - SELECT_TYPE_UNDER: "Unter" - SELECT_MATCH_ANY: "Eine der folgenden Regeln trifft zu" - SELECT_MATCH_ALL: "Alle folgenden Regeln treffen zu" - MARK_AS_READ_LABEL: "Als Gelesen markieren" - REPLY_INTERVAL_LABEL: "Antwortintervall (Tage)" - KEEP_LABEL: "Behalten" - STOP_LABEL: "Weiterverarbeitung der Regeln nicht verhindern" - EMAIL_LABEL: "E-Mail" - VACATION_SUBJECT_LABEL: "Betreff (optional)" - VACATION_MESSAGE_LABEL: "Nachricht" - VACATION_RECIPIENTS_LABEL: "Empfänger (durch Komma getrennt)" - REJECT_MESSAGE_LABEL: "Ablehnnachricht" - ALL_INCOMING_MESSAGES_DESC: "Alle eingehenden Nachrichten" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Wählen Sie die Systemordner aus" - SELECT_CHOOSE_ONE: "Wählen Sie einen aus" - SELECT_UNUSE_NAME: "Nicht anwenden" - LABEL_SENT: "Gesendet" - LABEL_DRAFTS: "Entwürfe" - LABEL_SPAM: "Spam" - LABEL_TRASH: "Papierkorb" - LABEL_ARCHIVE: "Archiv" - BUTTON_CANCEL: "Abbrechen" - BUTTON_CLOSE: "Schließen" - NOTIFICATION_SENT: | - Sie haben keinen "Gesendet"-Systemordner gewählt, in dem Nachrichten nach dem Versenden gespeichert werden. - Falls Sie versandte Nachrichten nicht speichern möchten, wählen Sie die Option "Nicht anwenden". - NOTIFICATION_DRAFTS: "Sie haben keinen \"Entwürfe\"-Systemordner gewählt, in dem Nachrichten beim Erstellen gespeichert werden." - NOTIFICATION_SPAM: | - Sie haben keinen "Spam"-Systemordner gewählt, in dem die Spam-Nachrichten abgelegt werden. - Falls Sie Spam-Nachrichten endgültig löschen möchten, wählen Sie die Option "Nicht anwenden". - NOTIFICATION_TRASH: | - Sie haben keinen "Papierkorb"-Systemordner gewählt, in dem die gelöschten Nachrichten abgelegt werden. - Falls Sie gelöschte Nachrichten endgültig löschen möchten, wählen Sie die Option "Nicht anwenden". - NOTIFICATION_ARCHIVE: "Sie haben keinen \"Archiv\"-Systemordner gewählt, in dem die archivierten Nachrichten abgelegt werden." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "Zwei-Faktor-Authentifizierung" - LABEL_ENABLE_TWO_FACTOR: "Zwei-Faktor-Authentifizierung aktivieren" - LABEL_TWO_FACTOR_USER: "Benutzer" - LABEL_TWO_FACTOR_STATUS: "Status" - LABEL_TWO_FACTOR_SECRET: "Geheimnis" - LABEL_TWO_FACTOR_BACKUP_CODES: "Sicherungscodes" - BUTTON_CREATE: "Neues Geheimnis erstellen" - BUTTON_ACTIVATE: "Aktivieren" - BUTTON_CLEAR: "Löschen" - BUTTON_LOGOUT: "Abmelden" - BUTTON_DONE: "Erledigt" - BUTTON_TEST: "Test" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Geheimnis einblenden" - BUTTON_HIDE_SECRET: "Geheminis ausblenden" - TWO_FACTOR_REQUIRE_DESC: "Ihr Benutzerkonto erfordert die Einrichtung der Zwei-Faktor-Authentifizierung." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Konfiguriert" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Nicht konfiguriert" - TWO_FACTOR_SECRET_DESC: >- - Importieren Sie diese Information in Ihre Google-Authenticator-Anwendung (oder - andere TOTP-Anwendung), indem Sie den unten bereitgestellten QR-Code verwenden - oder den Code manuell eingeben. - TWO_FACTOR_BACKUP_CODES_DESC: >- - Sollten Sie keine Codes über den Google Authenticator erhalten, können Sie - einen Sicherungscode zur Anmeldung verwenden. Der Sicherungscode wird inaktiv, - sobald Sie ihn zur Anmeldung verwendet haben. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Sie können diese Einstellung nicht ohne vorherigen Test verändern." - TITLES: - LOADING: "Wird geladen" - LOGIN: "Anmeldung" - MAILBOX: "Postfach" - SETTINGS: "Einstellungen" - COMPOSE: "Erstellen" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Datei ist zu groß" - ERROR_FILE_PARTIALLY_UPLOADED: "Die Datei wurde aus einem unbekannten Grund unvollständig hochgeladen." - ERROR_NO_FILE_UPLOADED: "Keine Datei hochgeladen" - ERROR_MISSING_TEMP_FOLDER: "Die temporäre Datei fehlt" - ERROR_ON_SAVING_FILE: "Ein unbekannter Fehler trat beim Hochladen auf" - ERROR_FILE_TYPE: "Ungültiger Dateityp" - ERROR_UNKNOWN: "Ein unbekannter Fehler trat beim Hochladen auf" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" - TEXT_SWITCHER_RICH_FORMATTING: "Formatierter Text (Rich Text)" - TEXT_SWITCHER_CONFIRM: "Alle Textformatierungen und Grafiken gehen verloren. Wollen Sie wirklich fortfahren?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Persönlich" - LABEL_GENERAL_NAME: "Allgemein" - LABEL_CONTACTS_NAME: "Kontakte" - LABEL_FOLDERS_NAME: "Ordner" - LABEL_ACCOUNTS_NAME: "Konten" - LABEL_IDENTITY_NAME: "Identität" - LABEL_IDENTITIES_NAME: "Identitäten" - LABEL_FILTERS_NAME: "Filter" - LABEL_TEMPLATES_NAME: "Vorlagen" - LABEL_SECURITY_NAME: "Sicherheit" - LABEL_SOCIAL_NAME: "Social" - LABEL_THEMES_NAME: "Themen" - LABEL_CHANGE_PASSWORD_NAME: "Passwort" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Zurück" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filter" - BUTTON_SAVE: "Speichern" - BUTTON_ADD_FILTER: "Filter hinzufügen" - BUTTON_DELETE: "Löschen" - BUTTON_RAW_SCRIPT: "Benutzerdefiniertes Skript verwenden" - SUBNAME_NONE: "Keine" - SUBNAME_MOVE_TO: "Verschieben nach \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Weiterleiten nach \"%EMAIL%\"" - SUBNAME_REJECT: "Ablehnen" - SUBNAME_VACATION_MESSAGE: "Urlaubsbenachrichtigung" - SUBNAME_DISCARD: "Verwerfen" - CAPABILITY_LABEL: "Unterstützte Module" - LOADING_PROCESS: "Aktualisiere Filterliste" - DELETING_ASK: "Sind Sie sicher?" - CHACHES_NEED_TO_BE_SAVED_DESC: "Die Änderungen müssen auf dem Server gespeichert werden." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identität" - LABEL_DISPLAY_NAME: "Name" - LABEL_REPLY_TO: "Antwort an" - LABEL_SIGNATURE: "Signatur" - LABEL_ADD_SIGNATURE_TO_ALL: "Signatur zu allen ausgehenden Nachrichten hinzufügen" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Sicherheit" - LABEL_CONFIGURE_TWO_FACTOR: "Zwei-Faktor-Authentifizierung konfigurieren" - LABEL_AUTOLOGOUT: "Automatische Abmeldung" - AUTOLOGIN_NEVER_OPTION_NAME: "Nie" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% Minute(n)" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% Stunde(n)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Allgemein" - LABEL_LANGUAGE: "Sprache" - LABEL_IDENTITY: "Identity" - LABEL_LAYOUT: "Layout" - LABEL_LAYOUT_NO_SPLIT: "Keine Aufteilung" - LABEL_LAYOUT_VERTICAL_SPLIT: "Vertikale Aufteilung" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontale Aufteilung" - LABEL_EDITOR: "Standard-Texteditor" - LABEL_EDITOR_HTML: "HTML" - LABEL_EDITOR_PLAIN: "Unformatierter Text" - LABEL_EDITOR_HTML_FORCED: "HTML (erzwungen)" - LABEL_EDITOR_PLAIN_FORCED: "Unformatierter Text (erzwungen)" - LABEL_ANIMATION: "Interface-Animation" - LABEL_ANIMATION_FULL: "Komplett" - LABEL_ANIMATION_NORMAL: "Normal" - LABEL_ANIMATION_NONE: "Keine" - LABEL_VIEW_OPTIONS: "Optionen anzeigen" - LABEL_USE_PREVIEW_PANE: "Vorschaufenster nutzen" - LABEL_USE_CHECKBOXES_IN_LIST: "Kontrollkästchen in der Liste anzeigen" - LABEL_USE_THREADS: "Als Unterhaltungen anzeigen" - LABEL_REPLY_SAME_FOLDER: "Antworten im gleichen Ordner wie die Nachricht, auf die geantwortet wurde, abspeichern" - LABEL_SHOW_IMAGES: "In der Nachricht enthaltene Bilder immer anzeigen" - LABEL_SHOW_ANIMATION: "Animation anzeigen" - LABEL_MESSAGE_PER_PAGE: "Nachrichten pro Seite" - LABEL_NOTIFICATIONS: "Benachrichtigungen" - LABEL_SOUND_NOTIFICATION: "Benachrichtigungston" - LABEL_CHROME_NOTIFICATION_DESC: "Popups einblenden, wenn neue Nachrichten vorhanden sind" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Vom Browser blockiert.)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Kontakte" - LABEL_CONTACTS_AUTOSAVE: "Empfänger automatisch zu Ihrem Adressbuch hinzuzufügen" - LEGEND_CONTACTS_SYNC: "Remote-Synchronisierung (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Remote-Synchronisierung aktivieren" - LABEL_CONTACTS_SYNC_SERVER: "Server" - LABEL_CONTACTS_SYNC_AB_URL: "Adressbuch-URL" - LABEL_CONTACTS_SYNC_USER: "Benutzer" - LABEL_CONTACTS_SYNC_PASSWORD: "Passwort" - SETTINGS_THEMES: - LEGEND_THEMES: "Themen" - LEGEND_THEMES_CUSTOM: "Konfiguration der selbsterstellten Themen" - LABEL_CUSTOM_TYPE: "Typ" - LABEL_CUSTOM_TYPE_LIGHT: "Hell" - LABEL_CUSTOM_TYPE_DARK: "Dunkel" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Hintergrund" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Hintergrundbild hochladen (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "Datei ist zu groß" - ERROR_FILE_TYPE_ERROR: "Ungültiger Dateityp (nur JPG und PNG)" - ERROR_UNKNOWN: "Ein unbekannter Fehler trat beim Hochladen auf" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Mit Google verbinden" - BUTTON_GOOGLE_DISCONNECT: "Von Google abmelden" - MAIN_GOOGLE_DESC: "Nach der Aktivierung der Anmeldung per Google können Sie sich hier mit dem Google-Button im Anmeldedialog anmelden." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Mit Facebook verbinden" - BUTTON_FACEBOOK_DISCONNECT: "Von Facebook abmelden" - MAIN_FACEBOOK_DESC: "Nach der Aktivierung der Anmeldung per Facebook können Sie sich hier mit dem Facebook-Button im Anmeldedialog anmelden." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Mit Twitter verbinden" - BUTTON_TWITTER_DISCONNECT: "Von Twitter abmelden" - MAIN_TWITTER_DESC: "Nach der Aktivierung der Anmeldung per Twitter können Sie sich hier mit dem Twitter-Button im Anmeldedialog anmelden." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Ordnerliste" - BUTTON_CREATE: "Ordner anlegen" - BUTTON_SYSTEM: "Systemordner" - BUTTON_DELETE: "Löschen" - BUTTON_SUBSCRIBE: "Abonnieren" - BUTTON_UNSUBSCRIBE: "Abonnement beenden" - LOADING_PROCESS: "Ordnerliste wird geladen" - CREATING_PROCESS: "Ordner wird angelegt" - DELETING_PROCESS: "Ordner wird gelöscht" - RENAMING_PROCESS: "Ordner wird umbenannt" - DELETING_ASK: "Sind Sie sicher?" - TO_MANY_FOLDERS_DESC_1: "Sie haben zu viele Ordner!" - TO_MANY_FOLDERS_DESC_2: "Aus Leistungsgründen zeigen wir nur einen Teil davon an." - HELP_DELETE_FOLDER: "Ordner löschen" - HELP_SHOW_HIDE_FOLDER: "Ordner ein-/ausblenden" - HELP_CHECK_FOR_NEW_MESSAGES: "Auf neue Nachrichten prüfen/nicht prüfen" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Konten" - LEGEND_IDENTITIES: "Identitäten" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Konten und Identitäten" - BUTTON_ADD_ACCOUNT: "Konto hinzufügen" - BUTTON_ADD_IDENTITY: "Identität hinzufügen" - BUTTON_DELETE: "Löschen" - LOADING_PROCESS: "Aktualisiere Kontenliste" - DELETING_ASK: "Sind Sie sicher?" - DEFAULT_IDENTITY_LABEL: "Standard" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identität" - LEGEND_IDENTITIES: "Zusätzliche Identitäten" - LABEL_DEFAULT: "Standard" - LABEL_DISPLAY_NAME: "Name" - LABEL_REPLY_TO: "Antwort an" - LABEL_SIGNATURE: "Signatur" - LABEL_ADD_SIGNATURE_TO_ALL: "Signatur zu allen ausgehenden Nachrichten hinzufügen" - BUTTON_ADD_IDENTITY: "Identität hinzufügen" - BUTTON_DELETE: "Löschen" - LOADING_PROCESS: "Aktualisiere Identitätsliste" - DELETING_ASK: "Sind Sie sicher?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Passwort ändern" - LABEL_CURRENT_PASSWORD: "Aktuelles Passwort" - LABEL_NEW_PASSWORD: "Neues Passwort" - LABEL_REPEAT_PASSWORD: "Neues Passwort bestätigen" - BUTTON_UPDATE_PASSWORD: "Neues Passwort setzen" - ERROR_PASSWORD_MISMATCH: "Passwörter stimmen nicht überein; versuchen Sie es bitte erneut" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "OpenPGP-Schlüssel importieren" - BUTTON_GENERATE_OPEN_PGP_KEYS: "OpenPGP-Schlüssel generieren" - TITLE_PRIVATE: "Privat" - TITLE_PUBLIC: "Öffentlich" - DELETING_ASK: "Sind Sie sicher?" - GENERATE_ONLY_HTTPS: "Nur HTTPS" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Tastaturkürzel-Hilfe" - TAB_MAILBOX: "Postfach" - TAB_MESSAGE_LIST: "Nachrichtenliste" - TAB_MESSAGE_VIEW: "Nachrichtenansicht" - TAB_COMPOSE: "Nachricht schreiben" - LABEL_OPEN_USER_DROPDOWN: "Benutzerauswahl öffnen" - LABEL_REPLY: "Antworten" - LABEL_REPLY_ALL: "Allen Antworten" - LABEL_FORWARD: "Weiterleiten" - LABEL_FORWARD_MULTIPLY: "Als Anhang/Anhänge weiterleiten" - LABEL_HELP: "Hilfe" - LABEL_CHECK_ALL: "Alle Nachrichten auswählen" - LABEL_ARCHIVE: "Archivieren" - LABEL_DELETE: "Löschen" - LABEL_OPEN_THREAD: "Ausgewählte Unterhaltung öffnen" - LABEL_MOVE: "Verschieben" - LABEL_READ: "Ausgewählte Nachrichten als gelesen markieren" - LABEL_UNREAD: "Ausgewählte Nachrichten als ungelesen markieren" - LABEL_IMPORTANT: "Wichtig, ausgewählte Nachrichten markieren" - LABEL_SEARCH: "Suchen" - LABEL_CANCEL_SEARCH: "Suche abbrechen" - LABEL_FULLSCREEN_ENTER: "Vollbild (Vorschaubereich-Layout)" - LABEL_VIEW_MESSAGE_ENTER: "Nachricht anzeigen (kein Vorschaubereich-Layout)" - LABEL_SWITCH_TO_MESSAGE: "Fokus auf ausgewählte Nachricht schalten" - LABEL_SWITCH_TO_FOLDER_LIST: "Fokus auf Ordnerliste schalten" - LABEL_FULLSCREEN_TOGGLE: "Vollbildmodus umschalten" - LABEL_BLOCKQUOTES_TOGGLE: "Nachrichten-Blockzitate umschalten" - LABEL_THREAD_NEXT: "Nächste Nachricht in Unterhaltung" - LABEL_THREAD_PREV: "Vorherige Nachricht in Unterhaltung" - LABEL_PRINT: "Drucken" - LABEL_EXIT_FULLSCREEN: "Vollbildmodus verlassen" - LABEL_CLOSE_MESSAGE: "Nachricht schließen (kein Vorschaubereich-Layout)" - LABEL_SWITCH_TO_LIST: "Fokus auf Nachrichtenliste zurückschalten" - LABEL_OPEN_COMPOSE_POPUP: "Erstellen-Popup öffnen" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Identitätsauswahl öffnen" - LABEL_SAVE_MESSAGE: "Nachricht speichern" - LABEL_SEND_MESSAGE: "Nachricht senden" - LABEL_CLOSE_COMPOSE: "Popup schließen" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "Keine öffentlichen Schlüssel gefunden" - NO_PUBLIC_KEYS_FOUND_FOR: "Keine öffentlichen Schlüssel für die E-Mail \"%EMAIL%\" gefunden" - NO_PRIVATE_KEY_FOUND: "Keine privaten Schlüssel gefunden" - NO_PRIVATE_KEY_FOUND_FOR: "Keine privaten Schlüssel für die E-Mail \"%EMAIL%\" gefunden" - ADD_A_PUBLICK_KEY: "Öffentlicher Schlüssel hinzufügen" - SELECT_A_PRIVATE_KEY: "Privaten Schlüssel auswählen" - UNVERIFIRED_SIGNATURE: "Nich verifizierte Unterschrift" - DECRYPTION_ERROR: "OpenPGP-Entschlüsselungsfehler" - GOOD_SIGNATURE: "Gültige Unterschrift von %USER%" - PGP_ERROR: "OpenPGP-Fehler: %ERROR%" - SPECIFY_FROM_EMAIL: "Bitte die VON-E-Mail-Adresse angeben" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Bitte geben Sie mindestens einen Empfänger an" - NOTIFICATIONS: - INVALID_TOKEN: "Ungültiger Token" - AUTH_ERROR: "Authentifizierung fehlgeschlagen" - ACCESS_ERROR: "Zugriffsfehler" - CONNECTION_ERROR: "Serververbindung kann nicht hergestellt werden" - CAPTCHA_ERROR: "Falsche CAPTCHA-Eingabe." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Diese Social-ID ist bisher mit keinem E-Mail-Konto verbunden. Melden Sie sich - mit Ihren E-Mail-Anmeldedaten an und aktivieren Sie diese Funktion in Ihren - Konteneinstellungen. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Diese Social-ID ist bisher mit keinem E-Mail-Konto verbunden. Melden Sie sich - mit Ihren E-Mail-Anmeldedaten an und aktivieren Sie diese Funktion in Ihren - Konteneinstellungen. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Diese Social-ID ist bisher mit keinem E-Mail-Konto verbunden. Melden Sie sich - mit Ihren E-Mail-Anmeldedaten an und aktivieren Sie diese Funktion in Ihren - Konteneinstellungen. - DOMAIN_NOT_ALLOWED: "Diese Domain ist nicht zugelassen." - ACCOUNT_NOT_ALLOWED: "Konto ist nicht zugelassen." - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Zwei-Faktor-Authentifizierung erforderlich" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Fehler bei Zwei-Faktor-Authentifizierung" - COULD_NOT_SAVE_NEW_PASSWORD: "Neues Passwort konnte nicht gespeichert werden" - CURRENT_PASSWORD_INCORRECT: "Aktuelles Passwort falsch" - NEW_PASSWORD_SHORT: "Passwort ist zu kurz" - NEW_PASSWORD_WEAK: "Passwort ist zu einfach" - NEW_PASSWORD_FORBIDDENT: "Passwort enthält unzulässige Zeichen" - CONTACTS_SYNC_ERROR: "Fehler bei Kontakte-Synchronisierung" - CANT_GET_MESSAGE_LIST: "Die Nachrichtenliste ist nicht verfügbar" - CANT_GET_MESSAGE: "Diese Nachricht ist nicht verfügbar" - CANT_DELETE_MESSAGE: "Diese Nachricht kann nicht gelöscht werden" - CANT_MOVE_MESSAGE: "Diese Nachricht kann nicht verschoben werden" - CANT_SAVE_MESSAGE: "Diese Nachricht kann nicht gespeichert werden" - CANT_SEND_MESSAGE: "Diese Nachricht kann nicht gesendet werden" - INVALID_RECIPIENTS: "Ungültige Empfängeradressen" - CANT_SAVE_FILTERS: "Die Filter können nicht gespeichert werden" - CANT_GET_FILTERS: "Die Filter sind nicht verfügbar" - FILTERS_ARE_NOT_CORRECT: "Die Filter sind fehlerhaft" - CANT_CREATE_FOLDER: "Dieser Ordner kann nicht angelegt werden" - CANT_RENAME_FOLDER: "Dieser Ordner kann nicht umbenannt werden" - CANT_DELETE_FOLDER: "Dieser Ordner kann nicht gelöscht werden" - CANT_DELETE_NON_EMPTY_FOLDER: "Der Ordner kann nicht gelöscht werden; er ist nicht leer" - CANT_SUBSCRIBE_FOLDER: "Dieser Ordner kann nicht abonniert werden" - CANT_UNSUBSCRIBE_FOLDER: "Das Abonnement dieses Ordners kann nicht gelöscht werden" - CANT_SAVE_SETTINGS: "Einstellungen können nicht gespeichert werden" - CANT_SAVE_PLUGIN_SETTINGS: "Einstellungen können nicht gespeichert werden" - DOMAIN_ALREADY_EXISTS: "Diese Domain existiert bereits" - CANT_INSTALL_PACKAGE: "Paket konnte nicht installiert werden" - CANT_DELETE_PACKAGE: "Paket konnte nicht entfernt werden" - INVALID_PLUGIN_PACKAGE: "Plugin-Paket ist ungültig" - UNSUPPORTED_PLUGIN_PACKAGE: "Plugin-Paket wird nicht unterstützt" - LICENSING_SERVER_IS_UNAVAILABLE: "Der Subscription-Server kann nicht erreicht werden" - LICENSING_DOMAIN_EXPIRED: "Die Subscription dieser Domain ist abgelaufen." - LICENSING_DOMAIN_BANNED: "Die Subscription dieser Domain ist gesperrt." - DEMO_SEND_MESSAGE_ERROR: "Dieses Demokonto darf aus Sicherheitsgründen keine Nachrichten an externe E-Mail-Adressen versenden!" - DEMO_ACCOUNT_ERROR: "Aus Sicherheitsgründen ist dieses Konto nicht zu dieser Aktion berechtigt!" - ACCOUNT_ALREADY_EXISTS: "Dieses Konto existiert bereits" - ACCOUNT_DOES_NOT_EXIST: "Dieser Account existiert nicht." - MAIL_SERVER_ERROR: "Beim Zugriff auf den E-Mail-Server trat ein Fehler auf." - INVALID_INPUT_ARGUMENT: "Ungültige Eingabe" - UNKNOWN_ERROR: "Unbekannter Fehler" - STATIC: - BACK_LINK: "Aktualisieren" - DOMAIN_LIST_DESC: "Liste der Domains, auf die zugegriffen werden darf" - PHP_EXSTENSIONS_ERROR_DESC: "Notwendige PHP-Erweiterungen sind in Ihrer PHP-Konfiguration nicht vorhanden!" - PHP_VERSION_ERROR_DESC: "Ihre PHP Version (%VERSION%) ist älter als die notwendige Version: 5.3.0!" - NO_SCRIPT_TITLE: "Diese Anwendung benötigt JavaScript." - NO_SCRIPT_DESC: | - Ihr Browser unterstützt JavaScript nicht. - Aktivieren Sie bitte die JavaScript-Unterstützung in Ihrem Browser und versuchen Sie es erneut. - NO_COOKIE_TITLE: "Diese Anwendung benötigt Cookies." - NO_COOKIE_DESC: | - Ihr Browser unterstützt Cookies nicht. - Aktivieren Sie bitte die Cookie-Unterstützung in Ihrem Browser und versuchen Sie es erneut. - BAD_BROWSER_TITLE: "Ihr Browser ist veraltet." - BAD_BROWSER_DESC: | - Um alle Funktionen dieser Anwendung nutzen zu können, - sollten Sie einen der folgenden Browser herunterladen und installieren diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/el_GR.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/el_GR.yml deleted file mode 100755 index 1a190bc8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/el_GR.yml +++ /dev/null @@ -1,547 +0,0 @@ -el_GR: - LOGIN: - LABEL_EMAIL: "Διεύθυνση ηλεκτρονικού ταχυδρομείου" - LABEL_LOGIN: "Είσοδος" - LABEL_PASSWORD: "Κωδικός πρόσβασης" - LABEL_SIGN_ME: "Μείνετε συνδεδεμένοι" - LABEL_VERIFICATION_CODE: "Κωδικός επαλήθευσης" - LABEL_DONT_ASK_VERIFICATION_CODE: "Να μην ζητηθεί κωδικός για 2 εβδομάδες" - BUTTON_SIGN_IN: "Σύνδεση" - TITLE_SIGN_IN_GOOGLE: "Σύνδεση με χρήση του Google" - TITLE_SIGN_IN_FACEBOOK: "Σύνδεση με χρήση του Facebook" - TITLE_SIGN_IN_TWITTER: "Σύνδεση με χρήση του Twitter" - LABEL_FORGOT_PASSWORD: "Ξέχασα τον κωδικό μου" - LABEL_REGISTRATION: "Εγγραφή" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Προσθήκη λογαριασμού" - BUTTON_SETTINGS: "Ρυθμίσεις" - BUTTON_HELP: "Βοήθεια" - BUTTON_LOGOUT: "Έξοδος" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Αναζήτηση" - TITLE_ADV: "Προχωρημένη αναζήτηση" - LABEL_ADV_FROM: "Από" - LABEL_ADV_TO: "Προς" - LABEL_ADV_SUBJECT: "Θέμα" - LABEL_ADV_TEXT: "Κείμενο" - LABEL_ADV_HAS_ATTACHMENT: "Έχει συνημμένο" - LABEL_ADV_HAS_ATTACHMENTS: "Έχει συνημμένα" - LABEL_ADV_FLAGGED: "Με σημαία" - LABEL_ADV_UNSEEN: "Δεν έχουν διαβαστεί" - LABEL_ADV_DATE: "Ημερομηνία" - LABEL_ADV_DATE_ALL: "Όλα" - LABEL_ADV_DATE_3_DAYS: "Έως 3 ημέρες πρίν" - LABEL_ADV_DATE_7_DAYS: "Έως 1 εβδομάδα πριν" - LABEL_ADV_DATE_MONTH: "Έως 1 μήνα πριν" - LABEL_ADV_DATE_3_MONTHS: "Έως 3 μήνες πριν" - LABEL_ADV_DATE_6_MONTHS: "Έως 6 μήνες πριν" - LABEL_ADV_DATE_YEAR: "Έως 1 χρόνο πριν" - BUTTON_ADV_SEARCH: "Αναζήτηση" - PREVIEW_POPUP: - FULLSCREEN: "Ενναλαγή πλήρους οθόνης" - ZOOM: "Μεγέθυνση/Σμίκρυνση" - CLOSE: "Κλείσιμο (Esc)" - LOADING: "Φορτώνει..." - GALLERY_PREV: "Προηγούμενο (αριστερό βέλος)" - GALLERY_NEXT: "Επόμενο (δεξί βέλος)" - GALLERY_COUNTER: "%curr% από %total%" - IMAGE_ERROR: "Η εικόνα δεν μπόρεσε να φορτωθεί." - AJAX_ERROR: "Το περιεχόμενο δεν μπόρεσε να φορτωθεί." - FOLDER_LIST: - BUTTON_COMPOSE: "Νέο μήνυμα" - BUTTON_CONTACTS: "Επαφές" - INBOX_NAME: "Εισερχόμενα" - SENT_NAME: "Απεσταλμένα" - DRAFTS_NAME: "Πρόχειρα" - SPAM_NAME: "Ανεπιθύμητα" - TRASH_NAME: "Άχρηστα" - ARCHIVE_NAME: "Αρχείο" - QUOTA: - TITLE: "Χρήση αποθηκευτικού χώρου" - MESSAGE_LIST: - BUTTON_RELOAD: "Φόρτωσε ξανά τη λίστα των μηνυμάτων" - BUTTON_MOVE_TO: "Μετακίνησε σε" - BUTTON_DELETE: "Διαγραφή" - BUTTON_ARCHIVE: "Αρχειοθέτηση" - BUTTON_SPAM: "Ανεπιθύμητο" - BUTTON_NOT_SPAM: "Όχι ανεπιθύμητο" - BUTTON_EMPTY_FOLDER: "Καθάρισε το φάκελο" - BUTTON_MULTY_FORWARD: "Προώθησε σαν συνημμένο(α)" - BUTTON_DELETE_WITHOUT_MOVE: "Διέγραψε μόνιμα" - BUTTON_MORE: "Περισσότερα" - MENU_SET_SEEN: "Σήμανε σαν διαβασμένο" - MENU_SET_ALL_SEEN: "Σήμανση όλων σαν διαβασμένα" - MENU_UNSET_SEEN: "Σήμανση σαν μη διαβασμένο" - MENU_SET_FLAG: "Σήμανση" - MENU_UNSET_FLAG: "Διαγραφή σήμανσης" - MENU_SELECT_ALL: "Όλα" - MENU_SELECT_NONE: "Κανένα" - MENU_SELECT_INVERT: "Αντέστρεψε" - MENU_SELECT_UNSEEN: "Μη διαβασμένο" - MENU_SELECT_SEEN: "Διαβασμένο" - MENU_SELECT_FLAGGED: "Σημαδεμένο" - MENU_SELECT_UNFLAGGED: "Μη σημαδεμένο" - EMPTY_LIST: "Άδεια λίστα." - EMPTY_SEARCH_LIST: "Δεν υπάρχουν μηνύματα που να ταιριάζουν στην αναζήτηση." - SEARCH_RESULT_FOR: "Αποτελέσματα αναζήτησης για \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "πίσω στη λίστα των μηνυμάτων" - LIST_LOADING: "Φορτώνει" - EMPTY_SUBJECT_TEXT: "(Κανένα θέμα)" - PUT_MESSAGE_HERE: "Σύρετε εδώ το μήνυμα για να φανεί στη λίστα" - TODAY_AT: "σήμερα στις %TIME%" - YESTERDAY_AT: "εχθές στις %TIME% " - SEARCH_PLACEHOLDER: "Αναζήτηση" - NEW_MESSAGE_NOTIFICATION: "Έχετε %COUNT% νέα μηνύματα!" - QUOTA_SIZE: "Χρησιμοποιούνται %SIZE% (%PROC%%) από %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Σύνταξη" - BUTTON_BACK: "Πίσω" - BUTTON_CLOSE: "Κλείσιμο" - BUTTON_DELETE: "Διαγραφή" - BUTTON_ARCHIVE: "Αρχειοθέτηση" - BUTTON_SPAM: "Ανεπιθύμητο" - BUTTON_NOT_SPAM: "Όχι ανεπιθύμητο" - BUTTON_MOVE_TO: "Μετακίνησε σε" - BUTTON_MORE: "Περισσότερα" - BUTTON_REPLY: "Απάντηση" - BUTTON_REPLY_ALL: "Απάντηση σε όλους" - BUTTON_FORWARD: "Προώθηση" - BUTTON_FORWARD_AS_ATTACHMENT: "Προώθηση ως συνημμένο" - BUTTON_EDIT_AS_NEW: "Σύνταξη σαν νέο" - BUTTON_SHOW_IMAGES: "Εμφάνιση εξωτερικών εικόνων" - BUTTON_NOTIFY_READ_RECEIPT: "Ο αποστολέας ζήτησε να ειδοποιηθεί όταν διαβάσετε αυτό το μήνυμα." - BUTTON_IN_NEW_WINDOW: "Άνοιγμα σε ξεχωριστό παράθυρο" - BUTTON_THREAD_LIST: "Λίστα νημάτων" - BUTTON_THREAD_PREV: "Προηγούμενο" - BUTTON_THREAD_NEXT: "Επόμενο" - BUTTON_THREAD_MORE: "Περισσότερα μηνύματα" - MENU_HEADERS: "Εμφάνιση των επικεφαλίδων του μηνύματος" - MENU_VIEW_ORIGINAL: "Εμφάνιση πηγαίου μηνύματος" - MENU_DOWNLOAD_ORIGINAL: "Μεταφόρτωση σαν αρχείο .eml" - MENU_FILTER_SIMILAR: "Φιλτράρισμα μηνυμάτων όπως αυτό" - MENU_PRINT: "Εκτύπωση" - EMPTY_SUBJECT_TEXT: "(Κανένα θέμα)" - LABEL_SUBJECT: "Θέμα" - LABEL_DATE: "Ημερομηνία" - LABEL_FROM: "Από" - LABEL_FROM_SHORT: "από" - LABEL_TO: "Προς" - LABEL_TO_SHORT: "προς" - LABEL_CC: "Κοινοποίηση" - LABEL_BCC: "Τυφλή κοινοποίηση" - LABEL_REPLY_TO: "Απάντηση στον" - PRINT_LABEL_FROM: "Από" - PRINT_LABEL_TO: "Προς" - PRINT_LABEL_CC: "Κοινοποίηση" - PRINT_LABEL_BCC: "Τυφλή κοινοποίηση" - PRINT_LABEL_REPLY_TO: "Απάντηση στον" - PRINT_LABEL_DATE: "Ημερομηνία" - PRINT_LABEL_SUBJECT: "Θέμα" - PRINT_LABEL_ATTACHMENTS: "Συνημμένα" - MESSAGE_LOADING: "Φορτώνει" - MESSAGE_VIEW_DESC: "Επιλέξτε ένα μήνυμα από τη λίστα για να εμφανιστεί εδώ." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Κωδικός" - PGP_SIGNED_MESSAGE_DESC: "Μήνυμα υπογεγραμμένο με OpenPGP (κάντε κλικ για έλεγχο)" - PGP_ENCRYPTED_MESSAGE_DESC: "Μήνυμα κωδικοποιημένο με OpenPGP (κάντε κλίκ για αποκωδικοποίηση)" - LINK_DOWNLOAD_AS_ZIP: "Μεταφόρτωση σαν zip" - LINK_SAVE_TO_OWNCLOUD: "Αποθήκευση στο ownCloud" - LINK_SAVE_TO_DROPBOX: "Αποθήκευση στο Dropbox" - READ_RECEIPT: - SUBJECT: "Αποδεικτικό Ανάγνωσης (παρουσιάστηκε) - %SUBJECT%" - BODY: | - Αυτή είναι ένα αποδεικτικό ανάγωσης από το μήνυμα που στείλατε προς %READ-RECEIPT%. - - Παρατήρηση: "Αυτή το αποδεικτικό ανάγνωσης είναι απλώς μια ένδειξη ότι το μήνυμα παρουσιάστηκε στον υπολογιστή του παραλήπτη." - Δεν υπάρχει καμία εγγύηση πως ο παραλήπτης διάβασε ή κατανόησε το περιεχόμενο του μηνύματος. - SUGGESTIONS: - SEARCHING_DESC: "Αναζήτηση..." - CONTACTS: - LEGEND_CONTACTS: "Επαφές" - SEARCH_INPUT_PLACEHOLDER: "Αναζήτηση" - BUTTON_ADD_CONTACT: "Προσθήκη επαφής" - BUTTON_CREATE_CONTACT: "Δημιουργία" - BUTTON_UPDATE_CONTACT: "Ενημέρωση" - BUTTON_IMPORT: "Εισαγωγή (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Εξαγωγή (csv, vcf, vCard)" - BUTTON_EXPORT_CSV: "Εξαγωγή (csv)" - ERROR_IMPORT_FILE: "Λάθος εισαγωγής (άκυρη μορφοποίηση αρχείου)" - LIST_LOADING: "Φορτώνει" - EMPTY_LIST: "Δεν υπάρχουν επαφές εδώ" - EMPTY_SEARCH: "Δεν βρέθηκαν επαφές" - CLEAR_SEARCH: "Καθαρισμός αναζήτησης" - CONTACT_VIEW_DESC: "Επιλέξτε μια επαφή από τη λίστα για να εμφανιστεί εδώ." - LABEL_DISPLAY_NAME: "Εμφάνιση ονόματος" - LABEL_EMAIL: "Ηλεκτρονική αλληλογραφία" - LABEL_PHONE: "Τηλέφωνο" - LABEL_WEB: "Ιστός" - LABEL_BIRTHDAY: "Γενέθλια" - LINK_ADD_EMAIL: "Προσθήκη ηλεκτρονικής διεύθυνσης αλληλογραφίας" - LINK_ADD_PHONE: "Προσθήκη τηλεφώνου" - LINK_BIRTHDAY: "Γενέθλια" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Εισαγωγή ονόματος εμφάνισης" - PLACEHOLDER_ENTER_LAST_NAME: "Εισαγωγή επωνύμου" - PLACEHOLDER_ENTER_FIRST_NAME: "Εισαγωγή ονόματος" - PLACEHOLDER_ENTER_NICK_NAME: "Εισαγωγή πρόσθετου ονόματος" - LABEL_READ_ONLY: "Μόνο για ανάγνωση" - LABEL_SHARE: "Διαμοιρασμός " - ADD_MENU_LABEL: "Προσθήκη" - ADD_MENU_NICKNAME: "Πρόσθετο όνομα" - ADD_MENU_NOTES: "Σημειώσεις" - ADD_MENU_EMAIL: "Ηλεκτρονική αλληλογραφία" - ADD_MENU_PHONE: "Τηλέφωνο" - ADD_MENU_URL: "Τοποθεσία ιστού" - ADD_MENU_ADDRESS: "Διεύθυνση" - ADD_MENU_BIRTHDAY: "Γενέθλια" - ADD_MENU_TAGS: "Ετικέτες" - BUTTON_SHARE_NONE: "Κανένα" - BUTTON_SHARE_ALL: "Όλοι" - BUTTON_SYNC: "Συγχρονισμός (CardDAV)" - COMPOSE: - TITLE_FROM: "Από" - TITLE_TO: "Προς" - TITLE_CC: "Κοινοποίηση" - TITLE_BCC: "Τυφλή κοινοποίηση" - TITLE_REPLY_TO: "Απάντηση στον" - TITLE_SUBJECT: "Θέμα" - LINK_SHOW_INPUTS: "Εμφάνισε όλα τα πεδία" - BUTTON_SEND: "Αποστολή" - BUTTON_SAVE: "Αποθήκευση" - BUTTON_DELETE: "Διαγραφή" - BUTTON_CANCEL: "Ακύρωση" - BUTTON_MINIMIZE: "Ελαχιστοποίηση" - SAVED_TIME: "Αποθηκεύτηκε στις %TIME%" - SAVED_ERROR_ON_SEND: "Το μήνυμα απεστάλη αλλά δεν αποθηκεύτηκε στο φάκελο απεσταλμένων " - DISCARD_UNSAVED_DATA: "Να απορριφθούν τα μη αποθηκευμένα δεδομένα;" - ATTACH_FILES: "Επισύναψη αρχείων" - ATTACH_DROP_FILES_DESC: "Σύρετε εδώ αρχεία" - ATTACH_ITEM_CANCEL: "Ακύρωση" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% έγραψε" - FORWARD_MESSAGE_TOP_TITLE: "-------- Προωθημένο μήνυμα -------" - FORWARD_MESSAGE_TOP_FROM: "Από" - FORWARD_MESSAGE_TOP_TO: "Προς" - FORWARD_MESSAGE_TOP_CC: "Κοινοποίηση" - FORWARD_MESSAGE_TOP_SENT: "Απεσταλμένα" - FORWARD_MESSAGE_TOP_SUBJECT: "Θέμα" - EMPTY_TO_ERROR_DESC: "Παρακαλώ ορίστε τουλάχιστον ένα παραλήπτη" - NO_ATTACHMENTS_HERE_DESC: "Δεν υπάρχουν συνημμένα εδώ." - ATTACHMENTS_ERROR_DESC: "Προειδοποίηση! Δεν έχουν μεταφορτωθεί όλα τα συνημμένα." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Δεν έχουν μεταφορτωθεί ακόμη όλα τα συνημμένα." - BUTTON_REQUEST_READ_RECEIPT: "Ζητήστε αποδεικτικό ανάγνωσης" - BUTTON_MARK_AS_IMPORTANT: "Σημειώστε το σαν σημαντικό" - BUTTON_OPEN_PGP: "OpenPGP (Απλό κείμενο μόνο)" - BUTTON_REQUEST_DSN: "Ζητήστε αποδεικτικό παράδοσης" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Κλείσιμο" - POPUPS_ASK: - BUTTON_YES: "Ναι" - BUTTON_NO: "Όχι" - DESC_WANT_CLOSE_THIS_WINDOW: "Είστε σίγουροι πως θέλετε να κλείσετε αυτό το παράθυρο;" - DESC_WANT_DELETE_MESSAGES: "Είστε σίγουροι πως θέλετε να διαγράψετε το (τα) μήνυμα(τα);" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Επιλέξτε τη γλώσσα σας" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Προσθήκη λογαριασμού;" - BUTTON_ADD_ACCOUNT: "Προσθήκη" - TITLE_UPDATE_ACCOUNT: "Ενημέρωση λογαριασμού;" - BUTTON_UPDATE_ACCOUNT: "Ενημέρωση" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Προσθήκη ταυτότητας;" - TITLE_UPDATE_IDENTITY: "Ενημέρωση ταυτότητας;" - BUTTON_ADD_IDENTITY: "Προσθήκη" - BUTTON_UPDATE_IDENTITY: "Ενημέρωση" - LABEL_EMAIL: "Ηλεκτρονική αλληλογραφία" - LABEL_NAME: "Όνομα" - LABEL_REPLY_TO: "Απάντηση στον" - LABEL_SIGNATURE: "Υπογραφή" - LABEL_CC: "Cc" - LABEL_BCC: "Bcc" - LABEL_SIGNATURE_INSERT_BEFORE: "Προσθήκη της υπογραφής πριν το προτότυπο κείμενο στις απαντήσεις" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Δημιουργία φακέλου;" - LABEL_NAME: "Όνομα φακέλου" - LABEL_PARENT: "Φάκελος γονέας" - BUTTON_CREATE: "Δημιουργία" - BUTTON_CANCEL: "Ακύρωση" - BUTTON_CLOSE: "Κλείσιμο" - TITLE_CREATING_PROCESS: "Δημιουργία φακέλου" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Διαγραφή όλων των μηνυμάτων στο φάκελο;" - BUTTON_CLEAR: "Καθαρισμός" - BUTTON_CANCEL: "Ακύρωση" - BUTTON_CLOSE: "Κλείσιμο" - DANGER_DESC_WARNING: "Προειδοποίηση!" - DANGER_DESC_HTML_1: "Το αποτέλεσμα της ενέργειας θα είναι η πλήρης μετακίνηση των μηνυμάτων από το φάκελο %FOLDER%." - DANGER_DESC_HTML_2: "Αφού ξεκινήσει, η διαδικασία δεν σταματά ή ακυρώνεται." - TITLE_CLEARING_PROCESS: "Διαγραφή όλων των μηνυμάτων στο φάκελο..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Εισαγωγή κλειδιού OpenPGP" - BUTTON_IMPORT_OPEN_PGP_KEY: "Εισαγωγή" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Προβολή κλειδιού OpenPGP" - BUTTON_SELECT: "Επιλογή" - BUTTON_CLOSE: "Κλείσιμο" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Δημιουργία κλειδιών OpenPGP" - LABEL_EMAIL: "Διεύθυνση ηλεκτρονικής αλληλογραφίας" - LABEL_NAME: "Όνομα" - LABEL_PASSWORD: "Κωδικός" - LABEL_KEY_BIT_LENGTH: "Μήκος κλειδιού" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Δημιουργία" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP Υπογραφή/Κρυπρογράφηση" - LABEL_SIGN: "Υπογραφή" - LABEL_ENCRYPT: "Κρυπτογράφηση" - LABEL_PASSWORD: "Κωδικός" - BUTTON_SIGN: "Υπογραφή" - BUTTON_ENCRYPT: "Κρυπτογράφηση" - BUTTON_SIGN_AND_ENCRYPT: "Υπογραφή και κρυπτογράφηση" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "Αποκρυπτογράφηση OpenPGP" - LABEL_KEY: "Προσωπικό κλειδί" - LABEL_PASSWORD: "Κωδικός" - BUTTON_DECRYPT: "Αποκρυπτογράφηση" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "Τεστ ελέγχου 2 βημάτων" - LABEL_CODE: "Κώδικας" - BUTTON_TEST: "Τεστ" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Δημιουργία φίλτρου;" - TITLE_EDIT_FILTER: "Ενημέρωση φίλτρου;" - FILTER_NAME: "Όνομα" - LEGEND_CONDITIONS: "Συνθήκες" - LEGEND_ACTIONS: "Ενέργειες" - BUTTON_DONE: "Έγινε" - BUTTON_ADD_CONDITION: "Προσθήκη συνθήκης" - SELECT_ACTION_NONE: "Κανένα" - SELECT_ACTION_MOVE_TO: "Μετακίνηση σε" - SELECT_ACTION_FORWARD_TO: "Προώθηση σε" - SELECT_ACTION_REJECT: "Απόρριψη" - SELECT_ACTION_VACATION_MESSAGE: "Μήνυμα διακοπών" - SELECT_ACTION_DISCARD: "Απόρριψη" - SELECT_FIELD_FROM: "Από" - SELECT_FIELD_RECIPIENTS: "Παραλήπτες (Προς ή κοινοποίηση)" - SELECT_FIELD_SUBJECT: "Θέμα" - SELECT_FIELD_HEADER: "Επικεφαλίδα" - SELECT_FIELD_SIZE: "Μέγεθος" - SELECT_TYPE_CONTAINS: "Περιέχει" - SELECT_TYPE_NOT_CONTAINS: "Δεν περιέχει" - SELECT_TYPE_MATCHES: "Ταιριάζει (* και ? υποστηρίζονται)" - SELECT_TYPE_NOT_MATCHES: "Δεν ταιριάζει (* και ? υποστηρίζονται)" - SELECT_TYPE_REGEXP: "Κανονική έκφραση" - SELECT_TYPE_NOT_REGEXP: "Μη κανονική έκφραση" - SELECT_TYPE_EQUAL_TO: "Ίσο με" - SELECT_TYPE_NOT_EQUAL_TO: "Δεν είναι ίσο με" - SELECT_TYPE_OVER: "Πάνω" - SELECT_TYPE_UNDER: "Κάτω" - SELECT_MATCH_ANY: "Ταιριάζει ΜΕ ΟΠΟΙΟΝΔΗΠΟΤΕ από τους επόμενους κανόνες" - SELECT_MATCH_ALL: "Ταιριάζει ΜΕ ΟΛΟΥΣ τους επόμενους κανόνες" - MARK_AS_READ_LABEL: "Σήμανε σαν διαβασμένο" - REPLY_INTERVAL_LABEL: "Μεσοδιάστημα απαντήσεων (σε ημέρες)" - KEEP_LABEL: "Κράτησε" - STOP_LABEL: "Μην σταματάς να επεξεργάζεσαι κανόνες" - EMAIL_LABEL: "Ηλεκτρονική αλληλογραφία" - VACATION_SUBJECT_LABEL: "Θέμα (προαιρετικό)" - VACATION_MESSAGE_LABEL: "Μήνυμα" - VACATION_RECIPIENTS_LABEL: "Παραλήπτες (χωρισμένοι με κόμμα)" - REJECT_MESSAGE_LABEL: "Απόρριψη μηνύματος" - ALL_INCOMING_MESSAGES_DESC: "Όλα τα εισερχόμενα μηνύματα" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Επιλογή φακέλων συστήματος" - SELECT_CHOOSE_ONE: "Επέλεξε ένα" - SELECT_UNUSE_NAME: "Μην χρησιμοποιείς" - LABEL_SENT: "Απεσταλμένα" - LABEL_DRAFTS: "Πρόχειρα" - LABEL_SPAM: "Ανεπιθύμητα" - LABEL_TRASH: "Άχρηστα" - LABEL_ARCHIVE: "Αρχείο" - BUTTON_CANCEL: "Ακύρωση" - BUTTON_CLOSE: "Κλείσιμο" - NOTIFICATION_SENT: | - Δεν έχετε επιλέξει το φάκελο συστήματος "Απεσταλμένα" όπου θα τοποθετούνται τα μηνύματα μετά την αποστολή. - Αν δεν θέλετε να σώσετε τα απεσταλμένα μηνύματα, παρακαλώ επιλέξτε "Μην το χρησιμοποιείς". - NOTIFICATION_DRAFTS: "Δεν έχετε επιλέξει το φάκελο συστήματος \"Πρόχειρα\" όπου θα σώζονται τα μηνύματα κατά τη σύνθεσή τους." - NOTIFICATION_SPAM: | - Δεν έχετε επιλέξει το φάκελο συστήματος "Ανεπιθύμητα" όπου θα τοποθετούνται τα ανεπιθύμητα μηνύματα. - Αν θέλετε να απορρίπτονται τα μηνύματα οριστικά, παρακαλώ επιλέξτε "Μην τον χρησιμοποιείς". - NOTIFICATION_TRASH: | - Δεν έχετε επιλέξει τα φάκελο συστήματος "Απορρίμματα" όπου θα τοποθετούνται τα διαγραμμένα μηνύματα. - Αν επιθυμείτε να απορρίπτονται τα μηνύματα οριστικά, παρακαλώ επιλέξτε "Μην το χρησιμοποιείς". - NOTIFICATION_ARCHIVE: "Δεν έχετε επιλέξει το φάκελο συστήματος \"Αρχείο\" όπου θα τοποθετούνται τα αρχειοθετημένα μηνύματα." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "Επαλήθευση 2 επιπέδων (TOTP)" - LABEL_ENABLE_TWO_FACTOR: "Ενεργοποίηση επαλήθευσης 2 επιπέδων" - LABEL_TWO_FACTOR_USER: "Χρήστης" - LABEL_TWO_FACTOR_STATUS: "Κατάσταση" - LABEL_TWO_FACTOR_SECRET: "Μυστικό" - LABEL_TWO_FACTOR_BACKUP_CODES: "Εφεδρικοί κωδικοί" - BUTTON_CREATE: "Δημιουργία μυστικού" - BUTTON_ACTIVATE: "Ενεργοποίηση" - BUTTON_CLEAR: "Καθαρισμός" - BUTTON_LOGOUT: "Έξοδος" - BUTTON_DONE: "Έγινε" - BUTTON_TEST: "Τεστ" - LINK_TEST: "τέστ" - BUTTON_SHOW_SECRET: "Δείξε το μυστικό" - BUTTON_HIDE_SECRET: "Κρύψε το μυστικό" - TWO_FACTOR_REQUIRE_DESC: "Ο λογαριασμός σας απαιτεί να διαμορφώσετε την επαλήθευση 2 επιπέδων" - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Διαμορφωμένος" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Μη διαμορφωμένος" - TWO_FACTOR_SECRET_DESC: > - Εισάγετε την πληροφορία στον πελάτη Google Authenticator (ή οποιοδήποτε άλλο - πελάτη TOTP) χρησιμοποιώντας τον κωδικό QR που φαίνεται παρακάτω ή πληκτρολογήστε - τον κωδικό χειροκίνητα. - TWO_FACTOR_BACKUP_CODES_DESC: > - Αν δεν μπορείτε να παραλάβετε κωδικούς μέσω του Google Authenticator (ή οποιουδήποτε - άλλου πελάτη TOTP), μπορείτε να χρησιμοποιήσετε εφεδρικούς κωδικούς για την - είσοδό σας. Μετά τη χρήση ενός εφεδρικού κωδικού για είσοδο, αυτός γίνεται - ανενεργός. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Δεν μπορείτε να αλλάξετε αυτή τη ρύθμιση πριν τον έλεγχο." - TITLES: - LOADING: "Φορτώνει" - LOGIN: "Είσοδος" - MAILBOX: "Γραμματοθυρίδα" - SETTINGS: "Ρυθμίσεις" - COMPOSE: "Νέο μήνυμα" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Το αρχείο είναι πολύ μεγάλο" - ERROR_FILE_PARTIALLY_UPLOADED: "Το αρχείο μεταφορτώθηκε μερικώς λόγω αγνώστου σφάλματος" - ERROR_NO_FILE_UPLOADED: "Δεν μεταφορτώθηκε αρχείο" - ERROR_MISSING_TEMP_FOLDER: "Το προσωρινό αρχείο δεν υπάρχει" - ERROR_ON_SAVING_FILE: "Υπήρξε άγνωστο λάθος κατα τη διαδικασία μεταφόρτωσης του αρχείου" - ERROR_FILE_TYPE: "Άκυρος τύπος αρχείου" - ERROR_UNKNOWN: "Υπήρξε άγνωστο λάθος κατα τη διαδικασία μεταφόρτωσης του αρχείου" - EDITOR: - TEXT_SWITCHER_RICH_FORMATTING: "Πλούσια μορφοποίηση" - TEXT_SWITCHER_CONFIRM: "Η μορφοποίηση του κειμένου και οι εικόνες θα χαθούν. Είστε σίγουροι πως θέλετε να συνεχίσετε;" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Προσωπικό" - LABEL_GENERAL_NAME: "Γενικό" - LABEL_CONTACTS_NAME: "Επαφές" - LABEL_FOLDERS_NAME: "Φάκελοι" - LABEL_ACCOUNTS_NAME: "Λογαρισμοί" - LABEL_IDENTITY_NAME: "Ταυτότητα" - LABEL_IDENTITIES_NAME: "Ταυτότητες" - LABEL_FILTERS_NAME: "Φίλτρα" - LABEL_TEMPLATES_NAME: "Πρότυπα" - LABEL_SECURITY_NAME: "Ασφάλεια" - LABEL_SOCIAL_NAME: "Κοινωνικά" - LABEL_THEMES_NAME: "Θέματα" - LABEL_CHANGE_PASSWORD_NAME: "Κωδικός" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Πίσω" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Φίλτρα" - BUTTON_SAVE: "Αποθήκευση" - BUTTON_ADD_FILTER: "Προσθήκη φίλτρου" - BUTTON_DELETE: "Διαγραφή" - BUTTON_RAW_SCRIPT: "Χρησιμοποίησε ένα προσαρμοσμένο σενάριο χρήστη" - SUBNAME_NONE: "Κανένα" - SUBNAME_MOVE_TO: "Μετακίνηση στο \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Προώθηση στο \"%EMAIL%\"" - SUBNAME_REJECT: "Απόρριψη" - SUBNAME_VACATION_MESSAGE: "Μήνυμα διακοπών" - SUBNAME_DISCARD: "Απόρριψη" - CAPABILITY_LABEL: "Ικανότητα" - LOADING_PROCESS: "Ενημέρωση λίστας φίλτρων" - DELETING_ASK: "Είστε σίγουροι;" - CHACHES_NEED_TO_BE_SAVED_DESC: "Αυτές οι αλλαγές πρέπει να αποθηκευτούν στον εξυπηρετητή." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Ταυτότητα" - LABEL_DISPLAY_NAME: "Όνομα" - LABEL_REPLY_TO: "Απάντηση στον" - LABEL_SIGNATURE: "Υπογραφή" - LABEL_ADD_SIGNATURE_TO_ALL: "Προσθήκη της υπογραφής σας σε όλα τα εξερχόμενα μηνύματα" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Ασφάλεια" - LABEL_CONFIGURE_TWO_FACTOR: "Διαμόρφωση της επαλήθευσης 2 επιπέδων" - LABEL_AUTOLOGOUT: "Αυτόματη αποσύνδεση" - AUTOLOGIN_NEVER_OPTION_NAME: "Ποτέ" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% λεπτό(α)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Γενικό" - LABEL_LANGUAGE: "Γλώσσα" - LABEL_IDENTITY: "Ταυτότητα" - LABEL_LAYOUT: "Σχέδιο" - LABEL_LAYOUT_NO_SPLIT: "Χωρίς χώρισμα" - LABEL_LAYOUT_VERTICAL_SPLIT: "Κάθετο χώρισμα" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Οριζόντιο χώρισμα" - LABEL_EDITOR: "Προεπιλεγμένος συντάκτης κειμένου" - LABEL_EDITOR_HTML: "Html" - LABEL_EDITOR_PLAIN: "Απλό" - LABEL_EDITOR_HTML_FORCED: "Html (επιβολή)" - LABEL_EDITOR_PLAIN_FORCED: "Απλό (επιβολή)" - LABEL_ANIMATION: "Εμψύχωση διεπαφής" - LABEL_ANIMATION_FULL: "Γεμάτο" - LABEL_ANIMATION_NORMAL: "Φυσιολογικό" - LABEL_ANIMATION_NONE: "Κανένα" - LABEL_VIEW_OPTIONS: "Επιλογές προβολής" - LABEL_USE_PREVIEW_PANE: "Χρήση προεπισκόπησης " - LABEL_USE_CHECKBOXES_IN_LIST: "Εμφάνιση των κουτιών επιλογής σε λίστα" - LABEL_USE_THREADS: "Χρήση νημάτων" - LABEL_REPLY_SAME_FOLDER: "Τοποθέτηση απαντήσεων στο φάκελο που ανήκει το μήνυμα που απαντάται" - LABEL_SHOW_IMAGES: "Να εμφανίζονται πάντα οι εξωτερικές εικόνες στο σώμα του μηνύματος" - LABEL_SHOW_ANIMATION: "Επίδειξη εμψύχωσης" - LABEL_MESSAGE_PER_PAGE: "Μηνύματα στη σελίδα" - LABEL_NOTIFICATIONS: "Επισημάνσεις" - LABEL_SOUND_NOTIFICATION: "Ηχητική επισήμανση" - LABEL_CHROME_NOTIFICATION_DESC: "Να εμφανίζονται τα νέα μηνύματα σε αναδυόμενες επισημάνσεις" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Αποκλείστηκε από το φυλλομετρητή)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Επαφές" - LABEL_CONTACTS_AUTOSAVE: "Αυτόματη προσθήκη επαφών στον κατάλογο διευθύνσεων" - LEGEND_CONTACTS_SYNC: "Απομακρυσμένος συγχρονισμός (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Ενεργοποίηση απομακρυσμένου συγχρονισμού" - LABEL_CONTACTS_SYNC_SERVER: "Εξυπηρετητής" - LABEL_CONTACTS_SYNC_AB_URL: "URL του καταλόγου διεθύνσεων" - LABEL_CONTACTS_SYNC_USER: "Χρήστης" - LABEL_CONTACTS_SYNC_PASSWORD: "Κωδικός" - SETTINGS_THEMES: - LEGEND_THEMES: "Θέματα" - LEGEND_THEMES_CUSTOM: "Διαμόρφωση προσαρμοσμένου θέματος" - LABEL_CUSTOM_TYPE: "Τύπος" - LABEL_CUSTOM_TYPE_LIGHT: "Ανοικτόχρωμο" - LABEL_CUSTOM_TYPE_DARK: "Σκουρόχρωμο" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Υπόβαθρο" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Μεταφόρτωση εικόνας υποβάθρου (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "Το αρχείο είναι πολύ μεγάλο" - ERROR_FILE_TYPE_ERROR: "Άκυρος τύπος αρχείου (μόνο JPG και PNG)" - ERROR_UNKNOWN: "Υπήρξε άγνωστο λάθος κατα τη διαδικασία μεταφόρτωσης του αρχείου" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Σύνδεση του Google" - BUTTON_GOOGLE_DISCONNECT: "Αποσύνδεση του Google" - SETTINGS_FOLDERS: - BUTTON_DELETE: "Διαγραφή" - CREATING_PROCESS: "Δημιουργία φακέλου" - DELETING_ASK: "Είστε σίγουροι;" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Λογαρισμοί" - LEGEND_IDENTITIES: "Ταυτότητες" - BUTTON_DELETE: "Διαγραφή" - DELETING_ASK: "Είστε σίγουροι;" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Ταυτότητα" - LABEL_DISPLAY_NAME: "Όνομα" - LABEL_REPLY_TO: "Απάντηση στον" - LABEL_SIGNATURE: "Υπογραφή" - LABEL_ADD_SIGNATURE_TO_ALL: "Προσθήκη της υπογραφής σας σε όλα τα εξερχόμενα μηνύματα" - BUTTON_DELETE: "Διαγραφή" - DELETING_ASK: "Είστε σίγουροι;" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - DELETING_ASK: "Είστε σίγουροι;" - SHORTCUTS_HELP: - TAB_COMPOSE: "Νέο μήνυμα" - LABEL_REPLY: "Απάντηση" - LABEL_REPLY_ALL: "Απάντηση σε όλους" - LABEL_FORWARD: "Προώθηση" - LABEL_FORWARD_MULTIPLY: "Προώθησε σαν συνημμένο(α)" - LABEL_HELP: "Βοήθεια" - LABEL_ARCHIVE: "Αρχείο" - LABEL_DELETE: "Διέγραψε" - LABEL_SEARCH: "Αναζήτηση" - LABEL_PRINT: "Εκτύπωση" - PGP_NOTIFICATIONS: - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Παρακαλώ ορίστε τουλάχιστον ένα παραλήπτη" diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/en_GB.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/en_GB.yml deleted file mode 100755 index fb777f9d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/en_GB.yml +++ /dev/null @@ -1,713 +0,0 @@ -en_GB: - LOGIN: - LABEL_EMAIL: "Email" - LABEL_LOGIN: "Login" - LABEL_PASSWORD: "Password" - LABEL_SIGN_ME: "Remember Me" - LABEL_VERIFICATION_CODE: "Verification Code" - LABEL_DONT_ASK_VERIFICATION_CODE: "Don't ask for the code for 2 weeks" - BUTTON_SIGN_IN: "Sign In" - TITLE_SIGN_IN_GOOGLE: "Sign In using Google" - TITLE_SIGN_IN_FACEBOOK: "Sign In using Facebook" - TITLE_SIGN_IN_TWITTER: "Sign In using Twitter" - LABEL_FORGOT_PASSWORD: "Forgot password" - LABEL_REGISTRATION: "Registration" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Add Account" - BUTTON_SETTINGS: "Settings" - BUTTON_HELP: "Help" - BUTTON_LOGOUT: "Logout" - MOBILE: - BUTTON_MOBILE_VERSION: "Mobile version" - BUTTON_DESKTOP_VERSION: "Desktop version" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Search" - TITLE_ADV: "Advanced Search" - LABEL_ADV_FROM: "From" - LABEL_ADV_TO: "To" - LABEL_ADV_SUBJECT: "Subject" - LABEL_ADV_TEXT: "Text" - LABEL_ADV_HAS_ATTACHMENT: "Has attachment" - LABEL_ADV_HAS_ATTACHMENTS: "Has attachments" - LABEL_ADV_FLAGGED: "Flagged" - LABEL_ADV_UNSEEN: "Unseen" - LABEL_ADV_DATE: "Date" - LABEL_ADV_DATE_ALL: "All" - LABEL_ADV_DATE_3_DAYS: "Up to 3 days old" - LABEL_ADV_DATE_7_DAYS: "Up to 1 week old" - LABEL_ADV_DATE_MONTH: "Up to 1 month old" - LABEL_ADV_DATE_3_MONTHS: "Up to 3 months old" - LABEL_ADV_DATE_6_MONTHS: "Up to 6 months old" - LABEL_ADV_DATE_YEAR: "Up to 1 year old" - BUTTON_ADV_SEARCH: "Search" - PREVIEW_POPUP: - FULLSCREEN: "Toggle fullscreen" - ZOOM: "Zoom in/out" - CLOSE: "Close (Esc)" - LOADING: "Loading..." - GALLERY_PREV: "Previous (arrow left)" - GALLERY_NEXT: "Next (arrow right)" - GALLERY_COUNTER: "%curr% of %total%" - IMAGE_ERROR: "The image could not be loaded." - AJAX_ERROR: "The content could not be loaded." - FOLDER_LIST: - BUTTON_COMPOSE: "Compose" - BUTTON_CONTACTS: "Contacts" - BUTTON_NEW_MESSAGE: "New message" - INBOX_NAME: "Inbox" - SENT_NAME: "Sent" - DRAFTS_NAME: "Drafts" - SPAM_NAME: "Spam" - TRASH_NAME: "Trash" - ARCHIVE_NAME: "Archive" - QUOTA: - TITLE: "Quota usage" - MESSAGE_LIST: - BUTTON_RELOAD: "Reload Message List" - BUTTON_MOVE_TO: "Move To" - BUTTON_DELETE: "Delete" - BUTTON_ARCHIVE: "Archive" - BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Not Spam" - BUTTON_EMPTY_FOLDER: "Clear Folder" - BUTTON_MULTY_FORWARD: "Forward as attachment(s)" - BUTTON_DELETE_WITHOUT_MOVE: "Delete permanently" - BUTTON_MORE: "More" - MENU_SET_SEEN: "Mark as read" - MENU_SET_ALL_SEEN: "Mark all as read" - MENU_UNSET_SEEN: "Mark as unread" - MENU_SET_FLAG: "Flag" - MENU_UNSET_FLAG: "Unflag" - MENU_SELECT_ALL: "All" - MENU_SELECT_NONE: "None" - MENU_SELECT_INVERT: "Invert" - MENU_SELECT_UNSEEN: "Unread" - MENU_SELECT_SEEN: "Read" - MENU_SELECT_FLAGGED: "Flagged" - MENU_SELECT_UNFLAGGED: "Unflagged" - EMPTY_LIST: "Empty list." - EMPTY_SEARCH_LIST: "No messages matched your search." - SEARCH_RESULT_FOR: "Search results for \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "back to message list" - LIST_LOADING: "Loading" - EMPTY_SUBJECT_TEXT: "(No subject)" - PUT_MESSAGE_HERE: "Drop message here to view it in the list" - TODAY_AT: "today at %TIME%" - YESTERDAY_AT: "yesterday at %TIME%" - SEARCH_PLACEHOLDER: "Search" - NEW_MESSAGE_NOTIFICATION: "You have %COUNT% new messages!" - QUOTA_SIZE: "Using %SIZE% (%PROC%%) of your %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Edit" - BUTTON_BACK: "Back" - BUTTON_CLOSE: "Close" - BUTTON_DELETE: "Delete" - BUTTON_UNSUBSCRIBE: "Unsubscribe from this list" - BUTTON_ARCHIVE: "Archive" - BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Not Spam" - BUTTON_MOVE_TO: "Move To" - BUTTON_MORE: "More" - BUTTON_REPLY: "Reply" - BUTTON_REPLY_ALL: "Reply All" - BUTTON_FORWARD: "Forward" - BUTTON_FORWARD_AS_ATTACHMENT: "Forward as attachment" - BUTTON_EDIT_AS_NEW: "Edit as New" - BUTTON_SHOW_IMAGES: "Display external images" - BUTTON_NOTIFY_READ_RECEIPT: "The sender has asked to be notified when you read this message." - BUTTON_IN_NEW_WINDOW: "View in separate window" - BUTTON_THREAD_LIST: "Thread list" - BUTTON_THREAD_PREV: "Previous" - BUTTON_THREAD_NEXT: "Next" - BUTTON_THREAD_MORE: "More messages" - MENU_HEADERS: "Show message headers" - MENU_VIEW_ORIGINAL: "Show Source" - MENU_DOWNLOAD_ORIGINAL: "Download as .eml file" - MENU_FILTER_SIMILAR: "Filter messages like this" - MENU_PRINT: "Print" - EMPTY_SUBJECT_TEXT: "(No subject)" - LABEL_SUBJECT: "Subject" - LABEL_DATE: "Date" - LABEL_FROM: "From" - LABEL_FROM_SHORT: "from" - LABEL_TO: "To" - LABEL_TO_SHORT: "to" - LABEL_CC: "CC" - LABEL_BCC: "BCC" - LABEL_REPLY_TO: "Reply-To" - PRINT_LABEL_FROM: "From" - PRINT_LABEL_TO: "To" - PRINT_LABEL_CC: "CC" - PRINT_LABEL_BCC: "BCC" - PRINT_LABEL_REPLY_TO: "Reply-To" - PRINT_LABEL_DATE: "Date" - PRINT_LABEL_SUBJECT: "Subject" - PRINT_LABEL_ATTACHMENTS: "Attachments" - MESSAGE_LOADING: "Loading" - MESSAGE_VIEW_DESC: "Select any message in the list to view it here." - MESSAGE_VIEW_MOVE_DESC: "Click folder name in the left panel to select the destination." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" - LINK_DOWNLOAD_AS_ZIP: "Download as zip" - LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" - LINK_SAVE_TO_CLOUD: "Save to Cloud" - LINK_SAVE_TO_DROPBOX: "Save to Dropbox" - READ_RECEIPT: - SUBJECT: "Return Receipt (displayed) - %SUBJECT%" - BODY: | - This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. - - Note: "This Return Receipt only acknowledges that the message was displayed on the recipient's computer." - There is no guarantee that the recipient has read or understood the message contents. - SUGGESTIONS: - SEARCHING_DESC: "Searching..." - CONTACTS: - LEGEND_CONTACTS: "Contacts" - SEARCH_INPUT_PLACEHOLDER: "Search" - BUTTON_ADD_CONTACT: "Add Contact" - BUTTON_CREATE_CONTACT: "Create" - BUTTON_UPDATE_CONTACT: "Update" - BUTTON_IMPORT: "Import (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" - BUTTON_EXPORT_CSV: "Export (csv)" - ERROR_IMPORT_FILE: "Import error (invalid file format)" - LIST_LOADING: "Loading" - EMPTY_LIST: "No contacts here" - EMPTY_SEARCH: "No contacts found" - CLEAR_SEARCH: "Clear search" - CONTACT_VIEW_DESC: "Select contact in the list to view it here." - LABEL_DISPLAY_NAME: "Display name" - LABEL_EMAIL: "Email" - LABEL_PHONE: "Phone" - LABEL_WEB: "Web" - LABEL_BIRTHDAY: "Birthday" - LINK_ADD_EMAIL: "Add an email address" - LINK_ADD_PHONE: "Add a phone" - LINK_BIRTHDAY: "Birthday" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Enter display name" - PLACEHOLDER_ENTER_LAST_NAME: "Enter last name" - PLACEHOLDER_ENTER_FIRST_NAME: "Enter first name" - PLACEHOLDER_ENTER_NICK_NAME: "Enter nickname" - LABEL_READ_ONLY: "Read only" - LABEL_SHARE: "Share" - ADD_MENU_LABEL: "Add" - ADD_MENU_NICKNAME: "Nickname" - ADD_MENU_NOTES: "Notes" - ADD_MENU_EMAIL: "Email" - ADD_MENU_PHONE: "Phone" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Address" - ADD_MENU_BIRTHDAY: "Birthday" - ADD_MENU_TAGS: "Tags" - BUTTON_SHARE_NONE: "None" - BUTTON_SHARE_ALL: "Everyone" - BUTTON_SYNC: "Synchronization (CardDAV)" - COMPOSE: - TITLE_FROM: "From" - TITLE_TO: "To" - TITLE_CC: "CC" - TITLE_BCC: "BCC" - TITLE_REPLY_TO: "Reply-To" - TITLE_SUBJECT: "Subject" - LINK_SHOW_INPUTS: "show all fields" - BUTTON_SEND: "Send" - BUTTON_SAVE: "Save" - BUTTON_DELETE: "Delete" - BUTTON_CANCEL: "Cancel" - BUTTON_MINIMIZE: "Minimize" - SAVED_TIME: "Saved at %TIME%" - SAVED_ERROR_ON_SEND: "Message was sent but not saved to sent items folder" - DISCARD_UNSAVED_DATA: "Discard unsaved data?" - ATTACH_FILES: "Attach files" - ATTACH_DROP_FILES_DESC: "Drop files here" - ATTACH_ITEM_CANCEL: "Cancel" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" - FORWARD_MESSAGE_TOP_TITLE: "-------- Forwarded message -------" - FORWARD_MESSAGE_TOP_FROM: "From" - FORWARD_MESSAGE_TOP_TO: "To" - FORWARD_MESSAGE_TOP_CC: "CC" - FORWARD_MESSAGE_TOP_SENT: "Sent" - FORWARD_MESSAGE_TOP_SUBJECT: "Subject" - EMPTY_TO_ERROR_DESC: "Please specify at least one recipient" - NO_ATTACHMENTS_HERE_DESC: "No attachments here." - ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet." - BUTTON_REQUEST_READ_RECEIPT: "Request a read receipt" - BUTTON_MARK_AS_IMPORTANT: "Mark as important" - BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" - BUTTON_REQUEST_DSN: "Request a delivery receipt" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Close" - POPUPS_ASK: - BUTTON_YES: "Yes" - BUTTON_NO: "No" - DESC_WANT_CLOSE_THIS_WINDOW: "Are you sure you want to close this window?" - DESC_WANT_DELETE_MESSAGES: "Are you sure you want to delete the message(s)?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Choose your language" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Add Account?" - BUTTON_ADD_ACCOUNT: "Add" - TITLE_UPDATE_ACCOUNT: "Update Account?" - BUTTON_UPDATE_ACCOUNT: "Update" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Add Identity?" - TITLE_UPDATE_IDENTITY: "Update Identity?" - BUTTON_ADD_IDENTITY: "Add" - BUTTON_UPDATE_IDENTITY: "Update" - LABEL_EMAIL: "Email" - LABEL_NAME: "Name" - LABEL_REPLY_TO: "Reply-To" - LABEL_SIGNATURE: "Signature" - LABEL_CC: "Cc" - LABEL_BCC: "Bcc" - LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Create a folder?" - LABEL_NAME: "Folder name" - LABEL_PARENT: "Parent folder" - BUTTON_CREATE: "Create" - BUTTON_CANCEL: "Cancel" - BUTTON_CLOSE: "Close" - TITLE_CREATING_PROCESS: "Creating a folder" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Purge all messages from the folder?" - BUTTON_CLEAR: "Clear" - BUTTON_CANCEL: "Cancel" - BUTTON_CLOSE: "Close" - DANGER_DESC_WARNING: "Warning!" - DANGER_DESC_HTML_1: "This action will result in removing all mails from %FOLDER% folder completely." - DANGER_DESC_HTML_2: "Once started, the process cannot be aborted or cancelled." - TITLE_CLEARING_PROCESS: "Purging the folder..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Import OpenPGP key" - BUTTON_IMPORT_OPEN_PGP_KEY: "Import" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "View OpenPGP key" - BUTTON_SELECT: "Select" - BUTTON_CLOSE: "Close" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP keys" - LABEL_EMAIL: "Email" - LABEL_NAME: "Name" - LABEL_PASSWORD: "Password" - LABEL_KEY_BIT_LENGTH: "Key length" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" - LABEL_SIGN: "Sign" - LABEL_ENCRYPT: "Encrypt" - LABEL_PASSWORD: "Password" - BUTTON_SIGN: "Sign" - BUTTON_ENCRYPT: "Encrypt" - BUTTON_SIGN_AND_ENCRYPT: "Sign and encrypt" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" - LABEL_KEY: "Private Key" - LABEL_PASSWORD: "Password" - BUTTON_DECRYPT: "Decrypt" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "2-Step verification test" - LABEL_CODE: "Code" - BUTTON_TEST: "Test" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Create a filter?" - TITLE_EDIT_FILTER: "Update filter?" - FILTER_NAME: "Name" - LEGEND_CONDITIONS: "Conditions" - LEGEND_ACTIONS: "Actions" - BUTTON_DONE: "Done" - BUTTON_ADD_CONDITION: "Add a Condition" - SELECT_ACTION_NONE: "None" - SELECT_ACTION_MOVE_TO: "Move to" - SELECT_ACTION_FORWARD_TO: "Forward to" - SELECT_ACTION_REJECT: "Reject" - SELECT_ACTION_VACATION_MESSAGE: "Vacation message" - SELECT_ACTION_DISCARD: "Discard" - SELECT_FIELD_FROM: "From" - SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" - SELECT_FIELD_SUBJECT: "Subject" - SELECT_FIELD_HEADER: "Header" - SELECT_FIELD_SIZE: "Size" - SELECT_TYPE_CONTAINS: "Contains" - SELECT_TYPE_NOT_CONTAINS: "Not Contains" - SELECT_TYPE_MATCHES: "Matches (* and ? supported)" - SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" - SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Not Regexp" - SELECT_TYPE_EQUAL_TO: "Equal To" - SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" - SELECT_TYPE_OVER: "Over" - SELECT_TYPE_UNDER: "Under" - SELECT_MATCH_ANY: "Matching ANY of the following rules" - SELECT_MATCH_ALL: "Matching ALL of the following rules" - MARK_AS_READ_LABEL: "Mark as read" - REPLY_INTERVAL_LABEL: "Reply interval (days)" - KEEP_LABEL: "Keep" - STOP_LABEL: "Don't stop processing rules" - EMAIL_LABEL: "Email" - VACATION_SUBJECT_LABEL: "Subject (optional)" - VACATION_MESSAGE_LABEL: "Message" - VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" - REJECT_MESSAGE_LABEL: "Reject message" - ALL_INCOMING_MESSAGES_DESC: "All incoming messages" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Select system folders" - SELECT_CHOOSE_ONE: "Choose one" - SELECT_UNUSE_NAME: "Do not use" - LABEL_SENT: "Sent" - LABEL_DRAFTS: "Drafts" - LABEL_SPAM: "Spam" - LABEL_TRASH: "Trash" - LABEL_ARCHIVE: "Archive" - BUTTON_CANCEL: "Cancel" - BUTTON_CLOSE: "Close" - NOTIFICATION_SENT: | - You haven't selected "Sent" system folder messages are put to after sending. - If you don't want to save sent message, please select "Do not use" option. - NOTIFICATION_DRAFTS: "You haven't selected \"Drafts\" system folder messages are saved to while composing." - NOTIFICATION_SPAM: | - You haven't selected "Spam" system folder spamed messages are placed to. - If you wish to remove messages permanently, please select "Do not use" option. - NOTIFICATION_TRASH: | - You haven't selected "Trash" system folder deleted messages are placed to. - If you wish to remove messages permanently, please select "Do not use" option. - NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "2-Step Verification (TOTP)" - LABEL_ENABLE_TWO_FACTOR: "Enable 2-Step verification" - LABEL_TWO_FACTOR_USER: "User" - LABEL_TWO_FACTOR_STATUS: "Status" - LABEL_TWO_FACTOR_SECRET: "Secret" - LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" - BUTTON_CREATE: "Create a secret" - BUTTON_ACTIVATE: "Activate" - BUTTON_CLEAR: "Clear" - BUTTON_LOGOUT: "Logout" - BUTTON_DONE: "Done" - BUTTON_TEST: "Test" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Show Secret" - BUTTON_HIDE_SECRET: "Hide Secret" - TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" - TWO_FACTOR_SECRET_DESC: > - Import this info into your Google Authenticator client (or other TOTP client) - using the provided QR code below or by entering the code manually. - TWO_FACTOR_BACKUP_CODES_DESC: > - If you can't receive codes via Google Authenticator (or other TOTP client), - you can use backup codes to sign in. After you’ve used a backup code to sign - in, it will become inactive. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." - TITLES: - LOADING: "Loading" - LOGIN: "Login" - MAILBOX: "MailBox" - SETTINGS: "Settings" - COMPOSE: "Compose" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "File is too big" - ERROR_FILE_PARTIALLY_UPLOADED: "File was partially uploaded due to unknown error" - ERROR_NO_FILE_UPLOADED: "No file uploaded" - ERROR_MISSING_TEMP_FOLDER: "The temporary file is missing" - ERROR_ON_SAVING_FILE: "An unknown file upload error occurred" - ERROR_FILE_TYPE: "Invalid file type" - ERROR_UNKNOWN: "An unknown file upload error occurred" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" - TEXT_SWITCHER_RICH_FORMATTING: "Rich formatting" - TEXT_SWITCHER_CONFIRM: "Text formatting and images will be lost. Are you sure you want to continue?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Personal" - LABEL_GENERAL_NAME: "General" - LABEL_CONTACTS_NAME: "Contacts" - LABEL_FOLDERS_NAME: "Folders" - LABEL_ACCOUNTS_NAME: "Accounts" - LABEL_IDENTITY_NAME: "Identity" - LABEL_IDENTITIES_NAME: "Identities" - LABEL_FILTERS_NAME: "Filters" - LABEL_TEMPLATES_NAME: "Templates" - LABEL_SECURITY_NAME: "Security" - LABEL_SOCIAL_NAME: "Social" - LABEL_THEMES_NAME: "Themes" - LABEL_CHANGE_PASSWORD_NAME: "Password" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Back" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filters" - BUTTON_SAVE: "Save" - BUTTON_ADD_FILTER: "Add a Filter" - BUTTON_DELETE: "Delete" - BUTTON_RAW_SCRIPT: "Use Custom User Script" - SUBNAME_NONE: "None" - SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" - SUBNAME_REJECT: "Reject" - SUBNAME_VACATION_MESSAGE: "Vacation message" - SUBNAME_DISCARD: "Discard" - CAPABILITY_LABEL: "Capability" - LOADING_PROCESS: "Updating filter list" - DELETING_ASK: "Are you sure?" - CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identity" - LABEL_DISPLAY_NAME: "Name" - LABEL_REPLY_TO: "Reply-To" - LABEL_SIGNATURE: "Signature" - LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Security" - LABEL_CONFIGURE_TWO_FACTOR: "Configure 2-Step verification" - LABEL_AUTOLOGOUT: "Auto Logout" - AUTOLOGIN_NEVER_OPTION_NAME: "Never" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hour(s)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "General" - LABEL_LANGUAGE: "Language" - LABEL_IDENTITY: "Identity" - LABEL_LAYOUT: "Layout" - LABEL_LAYOUT_NO_SPLIT: "No Split" - LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" - LABEL_EDITOR: "Default text editor" - LABEL_EDITOR_HTML: "Html" - LABEL_EDITOR_PLAIN: "Plain" - LABEL_EDITOR_HTML_FORCED: "Html (forced)" - LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" - LABEL_ANIMATION: "Interface animation" - LABEL_ANIMATION_FULL: "Full" - LABEL_ANIMATION_NORMAL: "Normal" - LABEL_ANIMATION_NONE: "None" - LABEL_VIEW_OPTIONS: "View options" - LABEL_USE_PREVIEW_PANE: "Use preview pane" - LABEL_USE_CHECKBOXES_IN_LIST: "Display checkboxes in list" - LABEL_USE_THREADS: "Use threads" - LABEL_REPLY_SAME_FOLDER: "Place replies in the folder of the message being replied to" - LABEL_SHOW_IMAGES: "Always display external images in message body" - LABEL_SHOW_ANIMATION: "Show animation" - LABEL_MESSAGE_PER_PAGE: "Messages on page" - LABEL_NOTIFICATIONS: "Notifications" - LABEL_SOUND_NOTIFICATION: "Sound notification" - LABEL_CHROME_NOTIFICATION_DESC: "Show new messages notification popups" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Blocked by the browser)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Contacts" - LABEL_CONTACTS_AUTOSAVE: "Automatically add recipients to your address book" - LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" - LABEL_CONTACTS_SYNC_SERVER: "Server" - LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" - LABEL_CONTACTS_SYNC_USER: "User" - LABEL_CONTACTS_SYNC_PASSWORD: "Password" - SETTINGS_THEMES: - LEGEND_THEMES: "Themes" - LEGEND_THEMES_CUSTOM: "Custom Theme Configuration" - LABEL_CUSTOM_TYPE: "Type" - LABEL_CUSTOM_TYPE_LIGHT: "Light" - LABEL_CUSTOM_TYPE_DARK: "Dark" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Background" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Upload background image (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "File is too big" - ERROR_FILE_TYPE_ERROR: "Invalid file type (JPG and PNG only)" - ERROR_UNKNOWN: "An unknown file upload error occurred" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Connect Google" - BUTTON_GOOGLE_DISCONNECT: "Disconnect Google" - MAIN_GOOGLE_DESC: "After enabling login via Google, you can log into this account using Google button on the login screen." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Connect Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Disconnect Facebook" - MAIN_FACEBOOK_DESC: "After enabling login via Facebook, you can log into this account using Facebook button on the login screen." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Connect Twitter" - BUTTON_TWITTER_DISCONNECT: "Disconnect Twitter" - MAIN_TWITTER_DESC: "After enabling login via Twitter, you can log into this account using Twitter button on the login screen." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Folder List" - BUTTON_CREATE: "Create Folder" - BUTTON_SYSTEM: "System Folders" - BUTTON_DELETE: "Delete" - BUTTON_SUBSCRIBE: "Subscribe" - BUTTON_UNSUBSCRIBE: "Unsubscribe" - LOADING_PROCESS: "Updating folder list" - CREATING_PROCESS: "Creating a folder" - DELETING_PROCESS: "Deleting a folder" - RENAMING_PROCESS: "Renaming a folder" - DELETING_ASK: "Are you sure?" - TO_MANY_FOLDERS_DESC_1: "You have too many folders!" - TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." - HELP_DELETE_FOLDER: "Delete folder" - HELP_SHOW_HIDE_FOLDER: "Show/hide folder" - HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Accounts" - LEGEND_IDENTITIES: "Identities" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" - BUTTON_ADD_ACCOUNT: "Add an Account" - BUTTON_ADD_IDENTITY: "Add an Identity" - BUTTON_DELETE: "Delete" - LOADING_PROCESS: "Updating..." - DELETING_ASK: "Are you sure?" - DEFAULT_IDENTITY_LABEL: "default" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identity" - LEGEND_IDENTITIES: "Additional Identities" - LABEL_DEFAULT: "Default" - LABEL_DISPLAY_NAME: "Name" - LABEL_REPLY_TO: "Reply-To" - LABEL_SIGNATURE: "Signature" - LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" - BUTTON_ADD_IDENTITY: "Add Identity" - BUTTON_DELETE: "Delete" - LOADING_PROCESS: "Updating identity list" - DELETING_ASK: "Are you sure?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Change Password" - LABEL_CURRENT_PASSWORD: "Current password" - LABEL_NEW_PASSWORD: "New password" - LABEL_REPEAT_PASSWORD: "Confirm New Password" - BUTTON_UPDATE_PASSWORD: "Set New Password" - ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" - TITLE_PRIVATE: "Private" - TITLE_PUBLIC: "Public" - DELETING_ASK: "Are you sure?" - GENERATE_ONLY_HTTPS: "HTTPS only" - LABEL_ALLOW_DRAFT_AUTOSAVE: "Automatically save draft" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" - TAB_MAILBOX: "Mailbox" - TAB_MESSAGE_LIST: "Message list" - TAB_MESSAGE_VIEW: "Message view" - TAB_COMPOSE: "Compose" - LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" - LABEL_REPLY: "Reply" - LABEL_REPLY_ALL: "Reply All" - LABEL_FORWARD: "Forward" - LABEL_FORWARD_MULTIPLY: "Forward as attachment(s)" - LABEL_HELP: "Help" - LABEL_CHECK_ALL: "Select all messages" - LABEL_ARCHIVE: "Archive" - LABEL_DELETE: "Delete" - LABEL_OPEN_THREAD: "Open selected thread" - LABEL_MOVE: "Move" - LABEL_READ: "Read selected messages" - LABEL_UNREAD: "Unread selected messages" - LABEL_IMPORTANT: "Important, flag selected messages" - LABEL_SEARCH: "Search" - LABEL_CANCEL_SEARCH: "Cancel search" - LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" - LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" - LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" - LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" - LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" - LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" - LABEL_THREAD_NEXT: "Next message in thread" - LABEL_THREAD_PREV: "Previous message in thread" - LABEL_PRINT: "Print" - LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" - LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" - LABEL_SWITCH_TO_LIST: "Switch focus back to message list" - LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" - LABEL_SAVE_MESSAGE: "Save message" - LABEL_SEND_MESSAGE: "Send message" - LABEL_CLOSE_COMPOSE: "Close compose" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "No public keys found" - NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" - NO_PRIVATE_KEY_FOUND: "No private key found" - NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" - ADD_A_PUBLICK_KEY: "Add a public key" - SELECT_A_PRIVATE_KEY: "Select a private key" - UNVERIFIRED_SIGNATURE: "Unverified signature" - DECRYPTION_ERROR: "OpenPGP decryption error" - GOOD_SIGNATURE: "Good signature from %USER%" - PGP_ERROR: "OpenPGP error: %ERROR%" - SPECIFY_FROM_EMAIL: "Please specify FROM email address" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" - NOTIFICATIONS: - INVALID_TOKEN: "Invalid token" - AUTH_ERROR: "Authentication failed" - ACCESS_ERROR: "Access error" - CONNECTION_ERROR: "Can't connect to server" - CAPTCHA_ERROR: "Incorrect CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - DOMAIN_NOT_ALLOWED: "Domain is not allowed" - ACCOUNT_NOT_ALLOWED: "Account is not allowed" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" - COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" - CURRENT_PASSWORD_INCORRECT: "Current password incorrect" - NEW_PASSWORD_SHORT: "Password is too short" - NEW_PASSWORD_WEAK: "Password is too easy" - NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" - CONTACTS_SYNC_ERROR: "Contacts synchronization error" - CANT_GET_MESSAGE_LIST: "Can't get message list" - CANT_GET_MESSAGE: "Can't get message" - CANT_DELETE_MESSAGE: "Can't delete message" - CANT_MOVE_MESSAGE: "Can't move message" - CANT_SAVE_MESSAGE: "Can't save message" - CANT_SEND_MESSAGE: "Can't send message" - INVALID_RECIPIENTS: "Invalid recipients" - CANT_SAVE_FILTERS: "Can't save filters" - CANT_GET_FILTERS: "Can't get filters" - FILTERS_ARE_NOT_CORRECT: "Filters are not correct" - CANT_CREATE_FOLDER: "Can't create folder" - CANT_RENAME_FOLDER: "Can't rename folder" - CANT_DELETE_FOLDER: "Can't delete folder" - CANT_DELETE_NON_EMPTY_FOLDER: "Can't delete non-empty directory" - CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" - CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" - CANT_SAVE_SETTINGS: "Can't save settings" - CANT_SAVE_PLUGIN_SETTINGS: "Can't save settings" - DOMAIN_ALREADY_EXISTS: "Domain already exists" - CANT_INSTALL_PACKAGE: "Failed to install package" - CANT_DELETE_PACKAGE: "Failed to remove package" - INVALID_PLUGIN_PACKAGE: "Invalid plugin package" - UNSUPPORTED_PLUGIN_PACKAGE: "Unsupported plugin package" - LICENSING_SERVER_IS_UNAVAILABLE: "Subscription server is unvailable" - LICENSING_DOMAIN_EXPIRED: "Subscription for this domain has expired." - LICENSING_DOMAIN_BANNED: "Subscription for this domain is banned." - DEMO_SEND_MESSAGE_ERROR: "For security purposes, this account is not allowed to send messages to external e-mail addresses!" - DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" - ACCOUNT_ALREADY_EXISTS: "Account already exists" - ACCOUNT_DOES_NOT_EXIST: "Account doesn't exist" - MAIL_SERVER_ERROR: "An error has occured while accessing mail server" - INVALID_INPUT_ARGUMENT: "Invalid input argument" - UNKNOWN_ERROR: "Unknown error" - STATIC: - BACK_LINK: "Reload" - DOMAIN_LIST_DESC: "List of domains webmail is allowed to access." - PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" - PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" - NO_SCRIPT_TITLE: "JavaScript is required for this application." - NO_SCRIPT_DESC: | - JavaScript support is not available in your browser. - Please enable JavaScript support in your browser settings and retry. - NO_COOKIE_TITLE: "Cookies support is required for this application." - NO_COOKIE_DESC: | - Cookies support is not available in your browser. - Please enable Cookie support in your browser settings and retry. - BAD_BROWSER_TITLE: "Your browser is outdated." - BAD_BROWSER_DESC: | - To use all the features of the application, - download and install one of these browsers: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/en_US.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/en_US.yml deleted file mode 100755 index 1ded9fc4..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/en_US.yml +++ /dev/null @@ -1,713 +0,0 @@ -en_US: - LOGIN: - LABEL_EMAIL: "Email" - LABEL_LOGIN: "Login" - LABEL_PASSWORD: "Password" - LABEL_SIGN_ME: "Remember Me" - LABEL_VERIFICATION_CODE: "Verification Code" - LABEL_DONT_ASK_VERIFICATION_CODE: "Don't ask for the code for 2 weeks" - BUTTON_SIGN_IN: "Sign In" - TITLE_SIGN_IN_GOOGLE: "Sign In using Google" - TITLE_SIGN_IN_FACEBOOK: "Sign In using Facebook" - TITLE_SIGN_IN_TWITTER: "Sign In using Twitter" - LABEL_FORGOT_PASSWORD: "Forgot password" - LABEL_REGISTRATION: "Registration" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Add Account" - BUTTON_SETTINGS: "Settings" - BUTTON_HELP: "Help" - BUTTON_LOGOUT: "Logout" - MOBILE: - BUTTON_MOBILE_VERSION: "Mobile version" - BUTTON_DESKTOP_VERSION: "Desktop version" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Search" - TITLE_ADV: "Advanced Search" - LABEL_ADV_FROM: "From" - LABEL_ADV_TO: "To" - LABEL_ADV_SUBJECT: "Subject" - LABEL_ADV_TEXT: "Text" - LABEL_ADV_HAS_ATTACHMENT: "Has attachment" - LABEL_ADV_HAS_ATTACHMENTS: "Has attachments" - LABEL_ADV_FLAGGED: "Flagged" - LABEL_ADV_UNSEEN: "Unseen" - LABEL_ADV_DATE: "Date" - LABEL_ADV_DATE_ALL: "All" - LABEL_ADV_DATE_3_DAYS: "Up to 3 days old" - LABEL_ADV_DATE_7_DAYS: "Up to 1 week old" - LABEL_ADV_DATE_MONTH: "Up to 1 month old" - LABEL_ADV_DATE_3_MONTHS: "Up to 3 months old" - LABEL_ADV_DATE_6_MONTHS: "Up to 6 months old" - LABEL_ADV_DATE_YEAR: "Up to 1 year old" - BUTTON_ADV_SEARCH: "Search" - PREVIEW_POPUP: - FULLSCREEN: "Toggle fullscreen" - ZOOM: "Zoom in/out" - CLOSE: "Close (Esc)" - LOADING: "Loading..." - GALLERY_PREV: "Previous (arrow left)" - GALLERY_NEXT: "Next (arrow right)" - GALLERY_COUNTER: "%curr% of %total%" - IMAGE_ERROR: "The image could not be loaded." - AJAX_ERROR: "The content could not be loaded." - FOLDER_LIST: - BUTTON_COMPOSE: "Compose" - BUTTON_CONTACTS: "Contacts" - BUTTON_NEW_MESSAGE: "New message" - INBOX_NAME: "Inbox" - SENT_NAME: "Sent" - DRAFTS_NAME: "Drafts" - SPAM_NAME: "Spam" - TRASH_NAME: "Trash" - ARCHIVE_NAME: "Archive" - QUOTA: - TITLE: "Quota usage" - MESSAGE_LIST: - BUTTON_RELOAD: "Reload Message List" - BUTTON_MOVE_TO: "Move To" - BUTTON_DELETE: "Delete" - BUTTON_ARCHIVE: "Archive" - BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Not Spam" - BUTTON_EMPTY_FOLDER: "Clear Folder" - BUTTON_MULTY_FORWARD: "Forward as attachment(s)" - BUTTON_DELETE_WITHOUT_MOVE: "Delete permanently" - BUTTON_MORE: "More" - MENU_SET_SEEN: "Mark as read" - MENU_SET_ALL_SEEN: "Mark all as read" - MENU_UNSET_SEEN: "Mark as unread" - MENU_SET_FLAG: "Flag" - MENU_UNSET_FLAG: "Unflag" - MENU_SELECT_ALL: "All" - MENU_SELECT_NONE: "None" - MENU_SELECT_INVERT: "Invert" - MENU_SELECT_UNSEEN: "Unread" - MENU_SELECT_SEEN: "Read" - MENU_SELECT_FLAGGED: "Flagged" - MENU_SELECT_UNFLAGGED: "Unflagged" - EMPTY_LIST: "Empty list." - EMPTY_SEARCH_LIST: "No messages matched your search." - SEARCH_RESULT_FOR: "Search results for \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "back to message list" - LIST_LOADING: "Loading" - EMPTY_SUBJECT_TEXT: "(No subject)" - PUT_MESSAGE_HERE: "Drop message here to view it in the list" - TODAY_AT: "today at %TIME%" - YESTERDAY_AT: "yesterday at %TIME%" - SEARCH_PLACEHOLDER: "Search" - NEW_MESSAGE_NOTIFICATION: "You have %COUNT% new messages!" - QUOTA_SIZE: "Using %SIZE% (%PROC%%) of your %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Edit" - BUTTON_BACK: "Back" - BUTTON_CLOSE: "Close" - BUTTON_DELETE: "Delete" - BUTTON_UNSUBSCRIBE: "Unsubscribe from this list" - BUTTON_ARCHIVE: "Archive" - BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Not Spam" - BUTTON_MOVE_TO: "Move To" - BUTTON_MORE: "More" - BUTTON_REPLY: "Reply" - BUTTON_REPLY_ALL: "Reply All" - BUTTON_FORWARD: "Forward" - BUTTON_FORWARD_AS_ATTACHMENT: "Forward as attachment" - BUTTON_EDIT_AS_NEW: "Edit as New" - BUTTON_SHOW_IMAGES: "Display external images" - BUTTON_NOTIFY_READ_RECEIPT: "The sender has asked to be notified when you read this message." - BUTTON_IN_NEW_WINDOW: "View in separate window" - BUTTON_THREAD_LIST: "Thread list" - BUTTON_THREAD_PREV: "Previous" - BUTTON_THREAD_NEXT: "Next" - BUTTON_THREAD_MORE: "More messages" - MENU_HEADERS: "Show message headers" - MENU_VIEW_ORIGINAL: "Show Source" - MENU_DOWNLOAD_ORIGINAL: "Download as .eml file" - MENU_FILTER_SIMILAR: "Filter messages like this" - MENU_PRINT: "Print" - EMPTY_SUBJECT_TEXT: "(No subject)" - LABEL_SUBJECT: "Subject" - LABEL_DATE: "Date" - LABEL_FROM: "From" - LABEL_FROM_SHORT: "from" - LABEL_TO: "To" - LABEL_TO_SHORT: "to" - LABEL_CC: "CC" - LABEL_BCC: "BCC" - LABEL_REPLY_TO: "Reply-To" - PRINT_LABEL_FROM: "From" - PRINT_LABEL_TO: "To" - PRINT_LABEL_CC: "CC" - PRINT_LABEL_BCC: "BCC" - PRINT_LABEL_REPLY_TO: "Reply-To" - PRINT_LABEL_DATE: "Date" - PRINT_LABEL_SUBJECT: "Subject" - PRINT_LABEL_ATTACHMENTS: "Attachments" - MESSAGE_LOADING: "Loading" - MESSAGE_VIEW_DESC: "Select any message in the list to view it here." - MESSAGE_VIEW_MOVE_DESC: "Click folder name in the left panel to select the destination." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" - LINK_DOWNLOAD_AS_ZIP: "Download as zip" - LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" - LINK_SAVE_TO_CLOUD: "Save to Cloud" - LINK_SAVE_TO_DROPBOX: "Save to Dropbox" - READ_RECEIPT: - SUBJECT: "Return Receipt (displayed) - %SUBJECT%" - BODY: | - This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. - - Note: "This Return Receipt only acknowledges that the message was displayed on the recipient's computer." - There is no guarantee that the recipient has read or understood the message contents. - SUGGESTIONS: - SEARCHING_DESC: "Searching..." - CONTACTS: - LEGEND_CONTACTS: "Contacts" - SEARCH_INPUT_PLACEHOLDER: "Search" - BUTTON_ADD_CONTACT: "Add Contact" - BUTTON_CREATE_CONTACT: "Create" - BUTTON_UPDATE_CONTACT: "Update" - BUTTON_IMPORT: "Import (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" - BUTTON_EXPORT_CSV: "Export (csv)" - ERROR_IMPORT_FILE: "Import error (invalid file format)" - LIST_LOADING: "Loading" - EMPTY_LIST: "No contacts here" - EMPTY_SEARCH: "No contacts found" - CLEAR_SEARCH: "Clear search" - CONTACT_VIEW_DESC: "Select contact in the list to view it here." - LABEL_DISPLAY_NAME: "Display name" - LABEL_EMAIL: "Email" - LABEL_PHONE: "Phone" - LABEL_WEB: "Web" - LABEL_BIRTHDAY: "Birthday" - LINK_ADD_EMAIL: "Add an email address" - LINK_ADD_PHONE: "Add a phone" - LINK_BIRTHDAY: "Birthday" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Enter display name" - PLACEHOLDER_ENTER_LAST_NAME: "Enter last name" - PLACEHOLDER_ENTER_FIRST_NAME: "Enter first name" - PLACEHOLDER_ENTER_NICK_NAME: "Enter nickname" - LABEL_READ_ONLY: "Read only" - LABEL_SHARE: "Share" - ADD_MENU_LABEL: "Add" - ADD_MENU_NICKNAME: "Nickname" - ADD_MENU_NOTES: "Notes" - ADD_MENU_EMAIL: "Email" - ADD_MENU_PHONE: "Phone" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Address" - ADD_MENU_BIRTHDAY: "Birthday" - ADD_MENU_TAGS: "Tags" - BUTTON_SHARE_NONE: "None" - BUTTON_SHARE_ALL: "Everyone" - BUTTON_SYNC: "Synchronization (CardDAV)" - COMPOSE: - TITLE_FROM: "From" - TITLE_TO: "To" - TITLE_CC: "CC" - TITLE_BCC: "BCC" - TITLE_REPLY_TO: "Reply-To" - TITLE_SUBJECT: "Subject" - LINK_SHOW_INPUTS: "show all fields" - BUTTON_SEND: "Send" - BUTTON_SAVE: "Save" - BUTTON_DELETE: "Delete" - BUTTON_CANCEL: "Cancel" - BUTTON_MINIMIZE: "Minimize" - SAVED_TIME: "Saved at %TIME%" - SAVED_ERROR_ON_SEND: "Message was sent but not saved to sent items folder" - DISCARD_UNSAVED_DATA: "Discard unsaved data?" - ATTACH_FILES: "Attach files" - ATTACH_DROP_FILES_DESC: "Drop files here" - ATTACH_ITEM_CANCEL: "Cancel" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" - FORWARD_MESSAGE_TOP_TITLE: "-------- Forwarded message -------" - FORWARD_MESSAGE_TOP_FROM: "From" - FORWARD_MESSAGE_TOP_TO: "To" - FORWARD_MESSAGE_TOP_CC: "CC" - FORWARD_MESSAGE_TOP_SENT: "Sent" - FORWARD_MESSAGE_TOP_SUBJECT: "Subject" - EMPTY_TO_ERROR_DESC: "Please specify at least one recipient" - NO_ATTACHMENTS_HERE_DESC: "No attachments here." - ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet." - BUTTON_REQUEST_READ_RECEIPT: "Request a read receipt" - BUTTON_MARK_AS_IMPORTANT: "Mark as important" - BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" - BUTTON_REQUEST_DSN: "Request a delivery receipt" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Close" - POPUPS_ASK: - BUTTON_YES: "Yes" - BUTTON_NO: "No" - DESC_WANT_CLOSE_THIS_WINDOW: "Are you sure you want to close this window?" - DESC_WANT_DELETE_MESSAGES: "Are you sure you want to delete the message(s)?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Choose your language" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Add Account?" - BUTTON_ADD_ACCOUNT: "Add" - TITLE_UPDATE_ACCOUNT: "Update Account?" - BUTTON_UPDATE_ACCOUNT: "Update" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Add Identity?" - TITLE_UPDATE_IDENTITY: "Update Identity?" - BUTTON_ADD_IDENTITY: "Add" - BUTTON_UPDATE_IDENTITY: "Update" - LABEL_EMAIL: "Email" - LABEL_NAME: "Name" - LABEL_REPLY_TO: "Reply-To" - LABEL_SIGNATURE: "Signature" - LABEL_CC: "Cc" - LABEL_BCC: "Bcc" - LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Create a folder?" - LABEL_NAME: "Folder name" - LABEL_PARENT: "Parent folder" - BUTTON_CREATE: "Create" - BUTTON_CANCEL: "Cancel" - BUTTON_CLOSE: "Close" - TITLE_CREATING_PROCESS: "Creating a folder" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Purge all messages from the folder?" - BUTTON_CLEAR: "Clear" - BUTTON_CANCEL: "Cancel" - BUTTON_CLOSE: "Close" - DANGER_DESC_WARNING: "Warning!" - DANGER_DESC_HTML_1: "This action will result in removing all mails from %FOLDER% folder completely." - DANGER_DESC_HTML_2: "Once started, the process cannot be aborted or cancelled." - TITLE_CLEARING_PROCESS: "Purging the folder..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Import OpenPGP key" - BUTTON_IMPORT_OPEN_PGP_KEY: "Import" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "View OpenPGP key" - BUTTON_SELECT: "Select" - BUTTON_CLOSE: "Close" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP keys" - LABEL_EMAIL: "Email" - LABEL_NAME: "Name" - LABEL_PASSWORD: "Password" - LABEL_KEY_BIT_LENGTH: "Key length" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" - LABEL_SIGN: "Sign" - LABEL_ENCRYPT: "Encrypt" - LABEL_PASSWORD: "Password" - BUTTON_SIGN: "Sign" - BUTTON_ENCRYPT: "Encrypt" - BUTTON_SIGN_AND_ENCRYPT: "Sign and encrypt" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" - LABEL_KEY: "Private Key" - LABEL_PASSWORD: "Password" - BUTTON_DECRYPT: "Decrypt" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "2-Step verification test" - LABEL_CODE: "Code" - BUTTON_TEST: "Test" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Create a filter?" - TITLE_EDIT_FILTER: "Update filter?" - FILTER_NAME: "Name" - LEGEND_CONDITIONS: "Conditions" - LEGEND_ACTIONS: "Actions" - BUTTON_DONE: "Done" - BUTTON_ADD_CONDITION: "Add a Condition" - SELECT_ACTION_NONE: "None" - SELECT_ACTION_MOVE_TO: "Move to" - SELECT_ACTION_FORWARD_TO: "Forward to" - SELECT_ACTION_REJECT: "Reject" - SELECT_ACTION_VACATION_MESSAGE: "Vacation message" - SELECT_ACTION_DISCARD: "Discard" - SELECT_FIELD_FROM: "From" - SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" - SELECT_FIELD_SUBJECT: "Subject" - SELECT_FIELD_HEADER: "Header" - SELECT_FIELD_SIZE: "Size" - SELECT_TYPE_CONTAINS: "Contains" - SELECT_TYPE_NOT_CONTAINS: "Not Contains" - SELECT_TYPE_MATCHES: "Matches (* and ? supported)" - SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" - SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Not Regexp" - SELECT_TYPE_EQUAL_TO: "Equal To" - SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" - SELECT_TYPE_OVER: "Over" - SELECT_TYPE_UNDER: "Under" - SELECT_MATCH_ANY: "Matching ANY of the following rules" - SELECT_MATCH_ALL: "Matching ALL of the following rules" - MARK_AS_READ_LABEL: "Mark as read" - REPLY_INTERVAL_LABEL: "Reply interval (days)" - KEEP_LABEL: "Keep" - STOP_LABEL: "Don't stop processing rules" - EMAIL_LABEL: "Email" - VACATION_SUBJECT_LABEL: "Subject (optional)" - VACATION_MESSAGE_LABEL: "Message" - VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" - REJECT_MESSAGE_LABEL: "Reject message" - ALL_INCOMING_MESSAGES_DESC: "All incoming messages" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Select system folders" - SELECT_CHOOSE_ONE: "Choose one" - SELECT_UNUSE_NAME: "Do not use" - LABEL_SENT: "Sent" - LABEL_DRAFTS: "Drafts" - LABEL_SPAM: "Spam" - LABEL_TRASH: "Trash" - LABEL_ARCHIVE: "Archive" - BUTTON_CANCEL: "Cancel" - BUTTON_CLOSE: "Close" - NOTIFICATION_SENT: | - You haven't selected "Sent" system folder messages are put to after sending. - If you don't want to save sent message, please select "Do not use" option. - NOTIFICATION_DRAFTS: "You haven't selected \"Drafts\" system folder messages are saved to while composing." - NOTIFICATION_SPAM: | - You haven't selected "Spam" system folder spamed messages are placed to. - If you wish to remove messages permanently, please select "Do not use" option. - NOTIFICATION_TRASH: | - You haven't selected "Trash" system folder deleted messages are placed to. - If you wish to remove messages permanently, please select "Do not use" option. - NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "2-Step Verification (TOTP)" - LABEL_ENABLE_TWO_FACTOR: "Enable 2-Step verification" - LABEL_TWO_FACTOR_USER: "User" - LABEL_TWO_FACTOR_STATUS: "Status" - LABEL_TWO_FACTOR_SECRET: "Secret" - LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" - BUTTON_CREATE: "Create a secret" - BUTTON_ACTIVATE: "Activate" - BUTTON_CLEAR: "Clear" - BUTTON_LOGOUT: "Logout" - BUTTON_DONE: "Done" - BUTTON_TEST: "Test" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Show Secret" - BUTTON_HIDE_SECRET: "Hide Secret" - TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" - TWO_FACTOR_SECRET_DESC: > - Import this info into your Google Authenticator client (or other TOTP client) - using the provided QR code below or by entering the code manually. - TWO_FACTOR_BACKUP_CODES_DESC: > - If you can't receive codes via Google Authenticator (or other TOTP client), - you can use backup codes to sign in. After you’ve used a backup code to sign - in, it will become inactive. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." - TITLES: - LOADING: "Loading" - LOGIN: "Login" - MAILBOX: "MailBox" - SETTINGS: "Settings" - COMPOSE: "Compose" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "File is too big" - ERROR_FILE_PARTIALLY_UPLOADED: "File was partially uploaded due to unknown error" - ERROR_NO_FILE_UPLOADED: "No file uploaded" - ERROR_MISSING_TEMP_FOLDER: "The temporary file is missing" - ERROR_ON_SAVING_FILE: "An unknown file upload error occurred" - ERROR_FILE_TYPE: "Invalid file type" - ERROR_UNKNOWN: "An unknown file upload error occurred" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" - TEXT_SWITCHER_RICH_FORMATTING: "Rich formatting" - TEXT_SWITCHER_CONFIRM: "Text formatting and images will be lost. Are you sure you want to continue?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Personal" - LABEL_GENERAL_NAME: "General" - LABEL_CONTACTS_NAME: "Contacts" - LABEL_FOLDERS_NAME: "Folders" - LABEL_ACCOUNTS_NAME: "Accounts" - LABEL_IDENTITY_NAME: "Identity" - LABEL_IDENTITIES_NAME: "Identities" - LABEL_FILTERS_NAME: "Filters" - LABEL_TEMPLATES_NAME: "Templates" - LABEL_SECURITY_NAME: "Security" - LABEL_SOCIAL_NAME: "Social" - LABEL_THEMES_NAME: "Themes" - LABEL_CHANGE_PASSWORD_NAME: "Password" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Back" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filters" - BUTTON_SAVE: "Save" - BUTTON_ADD_FILTER: "Add a Filter" - BUTTON_DELETE: "Delete" - BUTTON_RAW_SCRIPT: "Use Custom User Script" - SUBNAME_NONE: "None" - SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" - SUBNAME_REJECT: "Reject" - SUBNAME_VACATION_MESSAGE: "Vacation message" - SUBNAME_DISCARD: "Discard" - CAPABILITY_LABEL: "Capability" - LOADING_PROCESS: "Updating filter list" - DELETING_ASK: "Are you sure?" - CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identity" - LABEL_DISPLAY_NAME: "Name" - LABEL_REPLY_TO: "Reply-To" - LABEL_SIGNATURE: "Signature" - LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Security" - LABEL_CONFIGURE_TWO_FACTOR: "Configure 2-Step verification" - LABEL_AUTOLOGOUT: "Auto Logout" - AUTOLOGIN_NEVER_OPTION_NAME: "Never" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hour(s)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "General" - LABEL_LANGUAGE: "Language" - LABEL_IDENTITY: "Identity" - LABEL_LAYOUT: "Layout" - LABEL_LAYOUT_NO_SPLIT: "No Split" - LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" - LABEL_EDITOR: "Default text editor" - LABEL_EDITOR_HTML: "Html" - LABEL_EDITOR_PLAIN: "Plain" - LABEL_EDITOR_HTML_FORCED: "Html (forced)" - LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" - LABEL_ANIMATION: "Interface animation" - LABEL_ANIMATION_FULL: "Full" - LABEL_ANIMATION_NORMAL: "Normal" - LABEL_ANIMATION_NONE: "None" - LABEL_VIEW_OPTIONS: "View options" - LABEL_USE_PREVIEW_PANE: "Use preview pane" - LABEL_USE_CHECKBOXES_IN_LIST: "Display checkboxes in list" - LABEL_USE_THREADS: "Use threads" - LABEL_REPLY_SAME_FOLDER: "Place replies in the folder of the message being replied to" - LABEL_SHOW_IMAGES: "Always display external images in message body" - LABEL_SHOW_ANIMATION: "Show animation" - LABEL_MESSAGE_PER_PAGE: "Messages on page" - LABEL_NOTIFICATIONS: "Notifications" - LABEL_SOUND_NOTIFICATION: "Sound notification" - LABEL_CHROME_NOTIFICATION_DESC: "Show new messages notification popups" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Blocked by the browser)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Contacts" - LABEL_CONTACTS_AUTOSAVE: "Automatically add recipients to your address book" - LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" - LABEL_CONTACTS_SYNC_SERVER: "Server" - LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" - LABEL_CONTACTS_SYNC_USER: "User" - LABEL_CONTACTS_SYNC_PASSWORD: "Password" - SETTINGS_THEMES: - LEGEND_THEMES: "Themes" - LEGEND_THEMES_CUSTOM: "Custom Theme Configuration" - LABEL_CUSTOM_TYPE: "Type" - LABEL_CUSTOM_TYPE_LIGHT: "Light" - LABEL_CUSTOM_TYPE_DARK: "Dark" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Background" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Upload background image (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "File is too big" - ERROR_FILE_TYPE_ERROR: "Invalid file type (JPG and PNG only)" - ERROR_UNKNOWN: "An unknown file upload error occurred" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Connect Google" - BUTTON_GOOGLE_DISCONNECT: "Disconnect Google" - MAIN_GOOGLE_DESC: "After enabling login via Google, you can log into this account using Google button on the login screen." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Connect Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Disconnect Facebook" - MAIN_FACEBOOK_DESC: "After enabling login via Facebook, you can log into this account using Facebook button on the login screen." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Connect Twitter" - BUTTON_TWITTER_DISCONNECT: "Disconnect Twitter" - MAIN_TWITTER_DESC: "After enabling login via Twitter, you can log into this account using Twitter button on the login screen." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Folder List" - BUTTON_CREATE: "Create Folder" - BUTTON_SYSTEM: "System Folders" - BUTTON_DELETE: "Delete" - BUTTON_SUBSCRIBE: "Subscribe" - BUTTON_UNSUBSCRIBE: "Unsubscribe" - LOADING_PROCESS: "Updating folder list" - CREATING_PROCESS: "Creating a folder" - DELETING_PROCESS: "Deleting a folder" - RENAMING_PROCESS: "Renaming a folder" - DELETING_ASK: "Are you sure?" - TO_MANY_FOLDERS_DESC_1: "You have too many folders!" - TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." - HELP_DELETE_FOLDER: "Delete folder" - HELP_SHOW_HIDE_FOLDER: "Show/hide folder" - HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Accounts" - LEGEND_IDENTITIES: "Identities" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" - BUTTON_ADD_ACCOUNT: "Add an Account" - BUTTON_ADD_IDENTITY: "Add an Identity" - BUTTON_DELETE: "Delete" - LOADING_PROCESS: "Updating..." - DELETING_ASK: "Are you sure?" - DEFAULT_IDENTITY_LABEL: "default" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identity" - LEGEND_IDENTITIES: "Additional Identities" - LABEL_DEFAULT: "Default" - LABEL_DISPLAY_NAME: "Name" - LABEL_REPLY_TO: "Reply-To" - LABEL_SIGNATURE: "Signature" - LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" - BUTTON_ADD_IDENTITY: "Add Identity" - BUTTON_DELETE: "Delete" - LOADING_PROCESS: "Updating identity list" - DELETING_ASK: "Are you sure?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Change Password" - LABEL_CURRENT_PASSWORD: "Current password" - LABEL_NEW_PASSWORD: "New password" - LABEL_REPEAT_PASSWORD: "Confirm New Password" - BUTTON_UPDATE_PASSWORD: "Set New Password" - ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" - TITLE_PRIVATE: "Private" - TITLE_PUBLIC: "Public" - DELETING_ASK: "Are you sure?" - GENERATE_ONLY_HTTPS: "HTTPS only" - LABEL_ALLOW_DRAFT_AUTOSAVE: "Automatically save draft" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" - TAB_MAILBOX: "Mailbox" - TAB_MESSAGE_LIST: "Message list" - TAB_MESSAGE_VIEW: "Message view" - TAB_COMPOSE: "Compose" - LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" - LABEL_REPLY: "Reply" - LABEL_REPLY_ALL: "Reply All" - LABEL_FORWARD: "Forward" - LABEL_FORWARD_MULTIPLY: "Forward as attachment(s)" - LABEL_HELP: "Help" - LABEL_CHECK_ALL: "Select all messages" - LABEL_ARCHIVE: "Archive" - LABEL_DELETE: "Delete" - LABEL_OPEN_THREAD: "Open selected thread" - LABEL_MOVE: "Move" - LABEL_READ: "Read selected messages" - LABEL_UNREAD: "Unread selected messages" - LABEL_IMPORTANT: "Important, flag selected messages" - LABEL_SEARCH: "Search" - LABEL_CANCEL_SEARCH: "Cancel search" - LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" - LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" - LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" - LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" - LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" - LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" - LABEL_THREAD_NEXT: "Next message in thread" - LABEL_THREAD_PREV: "Previous message in thread" - LABEL_PRINT: "Print" - LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" - LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" - LABEL_SWITCH_TO_LIST: "Switch focus back to message list" - LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" - LABEL_SAVE_MESSAGE: "Save message" - LABEL_SEND_MESSAGE: "Send message" - LABEL_CLOSE_COMPOSE: "Close compose" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "No public keys found" - NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" - NO_PRIVATE_KEY_FOUND: "No private key found" - NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" - ADD_A_PUBLICK_KEY: "Add a public key" - SELECT_A_PRIVATE_KEY: "Select a private key" - UNVERIFIRED_SIGNATURE: "Unverified signature" - DECRYPTION_ERROR: "OpenPGP decryption error" - GOOD_SIGNATURE: "Good signature from %USER%" - PGP_ERROR: "OpenPGP error: %ERROR%" - SPECIFY_FROM_EMAIL: "Please specify FROM email address" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" - NOTIFICATIONS: - INVALID_TOKEN: "Invalid token" - AUTH_ERROR: "Authentication failed" - ACCESS_ERROR: "Access error" - CONNECTION_ERROR: "Can't connect to server" - CAPTCHA_ERROR: "Incorrect CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - DOMAIN_NOT_ALLOWED: "Domain is not allowed" - ACCOUNT_NOT_ALLOWED: "Account is not allowed" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" - COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" - CURRENT_PASSWORD_INCORRECT: "Current password incorrect" - NEW_PASSWORD_SHORT: "Password is too short" - NEW_PASSWORD_WEAK: "Password is too easy" - NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" - CONTACTS_SYNC_ERROR: "Contacts synchronization error" - CANT_GET_MESSAGE_LIST: "Can't get message list" - CANT_GET_MESSAGE: "Can't get message" - CANT_DELETE_MESSAGE: "Can't delete message" - CANT_MOVE_MESSAGE: "Can't move message" - CANT_SAVE_MESSAGE: "Can't save message" - CANT_SEND_MESSAGE: "Can't send message" - INVALID_RECIPIENTS: "Invalid recipients" - CANT_SAVE_FILTERS: "Can't save filters" - CANT_GET_FILTERS: "Can't get filters" - FILTERS_ARE_NOT_CORRECT: "Filters are not correct" - CANT_CREATE_FOLDER: "Can't create folder" - CANT_RENAME_FOLDER: "Can't rename folder" - CANT_DELETE_FOLDER: "Can't delete folder" - CANT_DELETE_NON_EMPTY_FOLDER: "Can't delete non-empty directory" - CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" - CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" - CANT_SAVE_SETTINGS: "Can't save settings" - CANT_SAVE_PLUGIN_SETTINGS: "Can't save settings" - DOMAIN_ALREADY_EXISTS: "Domain already exists" - CANT_INSTALL_PACKAGE: "Failed to install package" - CANT_DELETE_PACKAGE: "Failed to remove package" - INVALID_PLUGIN_PACKAGE: "Invalid plugin package" - UNSUPPORTED_PLUGIN_PACKAGE: "Unsupported plugin package" - LICENSING_SERVER_IS_UNAVAILABLE: "Subscription server is unvailable" - LICENSING_DOMAIN_EXPIRED: "Subscription for this domain has expired." - LICENSING_DOMAIN_BANNED: "Subscription for this domain is banned." - DEMO_SEND_MESSAGE_ERROR: "For security purposes, this account is not allowed to send messages to external e-mail addresses!" - DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" - ACCOUNT_ALREADY_EXISTS: "Account already exists" - ACCOUNT_DOES_NOT_EXIST: "Account doesn't exist" - MAIL_SERVER_ERROR: "An error has occured while accessing mail server" - INVALID_INPUT_ARGUMENT: "Invalid input argument" - UNKNOWN_ERROR: "Unknown error" - STATIC: - BACK_LINK: "Reload" - DOMAIN_LIST_DESC: "List of domains webmail is allowed to access." - PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" - PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" - NO_SCRIPT_TITLE: "JavaScript is required for this application." - NO_SCRIPT_DESC: | - JavaScript support is not available in your browser. - Please enable JavaScript support in your browser settings and retry. - NO_COOKIE_TITLE: "Cookies support is required for this application." - NO_COOKIE_DESC: | - Cookies support is not available in your browser. - Please enable Cookie support in your browser settings and retry. - BAD_BROWSER_TITLE: "Your browser is outdated." - BAD_BROWSER_DESC: | - To use all the features of the application, - download and install one of these browsers: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/es_ES.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/es_ES.yml deleted file mode 100755 index 2dd795bb..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/es_ES.yml +++ /dev/null @@ -1,716 +0,0 @@ -es_ES: - LOGIN: - LABEL_EMAIL: "Email" - LABEL_LOGIN: "Login" - LABEL_PASSWORD: "Contraseña" - LABEL_SIGN_ME: "Recuérdame" - LABEL_VERIFICATION_CODE: "Código de verificación" - LABEL_DONT_ASK_VERIFICATION_CODE: "No solicitar el código de verificación durante 2 semanas" - BUTTON_SIGN_IN: "Acceder" - TITLE_SIGN_IN_GOOGLE: "Acceder usando Google" - TITLE_SIGN_IN_FACEBOOK: "Acceder usando Facebook" - TITLE_SIGN_IN_TWITTER: "Acceder usando Twitter" - LABEL_FORGOT_PASSWORD: "Olvidé mi contraseña" - LABEL_REGISTRATION: "Registro" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Agregar cuenta" - BUTTON_SETTINGS: "Configuración" - BUTTON_HELP: "Ayuda" - BUTTON_LOGOUT: "Cerrar sesión" - MOBILE: - BUTTON_MOBILE_VERSION: "Versión móvil" - BUTTON_DESKTOP_VERSION: "Versión escritorio" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Buscar" - TITLE_ADV: "Búsqueda avanzada" - LABEL_ADV_FROM: "De" - LABEL_ADV_TO: "Para" - LABEL_ADV_SUBJECT: "Asunto" - LABEL_ADV_TEXT: "Texto" - LABEL_ADV_HAS_ATTACHMENT: "Tiene adjunto" - LABEL_ADV_HAS_ATTACHMENTS: "Tiene adjuntos" - LABEL_ADV_FLAGGED: "Seleccionado" - LABEL_ADV_UNSEEN: "No leído" - LABEL_ADV_DATE: "Fecha" - LABEL_ADV_DATE_ALL: "Todo" - LABEL_ADV_DATE_3_DAYS: "Hasta 3 días de antigüedad" - LABEL_ADV_DATE_7_DAYS: "Hasta una semana de antigüedad" - LABEL_ADV_DATE_MONTH: "Hasta 1 mes de antigüedad" - LABEL_ADV_DATE_3_MONTHS: "Hasta 3 meses de antigüedad" - LABEL_ADV_DATE_6_MONTHS: "Hasta 6 meses de antigüedad" - LABEL_ADV_DATE_YEAR: "Hasta 1 año de antigüedad" - BUTTON_ADV_SEARCH: "Buscar" - PREVIEW_POPUP: - FULLSCREEN: "Cambiar a pantalla completa" - ZOOM: "Acercar / Alejar" - CLOSE: "Cerrar (Esc)" - LOADING: "Cargando..." - GALLERY_PREV: "Anterior (Flecha Izquierda)" - GALLERY_NEXT: "Siguiente (Flecha Derecha)" - GALLERY_COUNTER: "%curr% de %total%" - IMAGE_ERROR: "La imagen no se pudo cargar." - AJAX_ERROR: "El contenido no se pudo cargar." - FOLDER_LIST: - BUTTON_COMPOSE: "Redactar" - BUTTON_CONTACTS: "Contactos" - BUTTON_NEW_MESSAGE: "Nuevo mensaje" - INBOX_NAME: "Bandeja de Entrada" - SENT_NAME: "Enviados" - DRAFTS_NAME: "Borradores" - SPAM_NAME: "Correo electrónico no deseado" - TRASH_NAME: "Papelera" - ARCHIVE_NAME: "Archivo" - QUOTA: - TITLE: "Cuota" - MESSAGE_LIST: - BUTTON_RELOAD: "Actualizar lista de mensajes" - BUTTON_MOVE_TO: "Mover" - BUTTON_DELETE: "Eliminar" - BUTTON_ARCHIVE: "Archivar" - BUTTON_SPAM: "Correo no deseado" - BUTTON_NOT_SPAM: "Es correo deseado" - BUTTON_EMPTY_FOLDER: "Vaciar carpeta" - BUTTON_MULTY_FORWARD: "Reenviar como adjunto(s)" - BUTTON_DELETE_WITHOUT_MOVE: "Eliminar permanentemente" - BUTTON_MORE: "Más" - MENU_SET_SEEN: "Marcar como leído" - MENU_SET_ALL_SEEN: "Marcar todo como leído" - MENU_UNSET_SEEN: "Marcar como no leído" - MENU_SET_FLAG: "Marcar" - MENU_UNSET_FLAG: "Desmarcar" - MENU_SELECT_ALL: "Todos" - MENU_SELECT_NONE: "Ninguno" - MENU_SELECT_INVERT: "Invertir" - MENU_SELECT_UNSEEN: "No leído" - MENU_SELECT_SEEN: "Leído" - MENU_SELECT_FLAGGED: "Destacado" - MENU_SELECT_UNFLAGGED: "No Destacado" - EMPTY_LIST: "No hay mensajes." - EMPTY_SEARCH_LIST: "La búsqueda no ha producido resultados." - SEARCH_RESULT_FOR: "Resultados de búsqueda para \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "volver a la lista de mensajes" - LIST_LOADING: "Cargando" - EMPTY_SUBJECT_TEXT: "(Sin asunto)" - PUT_MESSAGE_HERE: "Arrastre su mensaje aquí para verlo en la lista" - TODAY_AT: "hoy a las %TIME%" - YESTERDAY_AT: "ayer a las %TIME%" - SEARCH_PLACEHOLDER: "Buscar" - NEW_MESSAGE_NOTIFICATION: "Tiene %COUNT% nuevos mensajes." - QUOTA_SIZE: "Usando %SIZE% (%PROC%%) de sus %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Editar" - BUTTON_BACK: "Atrás" - BUTTON_CLOSE: "Cerrar" - BUTTON_DELETE: "Eliminar" - BUTTON_UNSUBSCRIBE: "Eliminar suscripción de esta lista" - BUTTON_ARCHIVE: "Archivar" - BUTTON_SPAM: "Correo electrónico no deseado" - BUTTON_NOT_SPAM: "Es correo deseado" - BUTTON_MOVE_TO: "Mover" - BUTTON_MORE: "Más" - BUTTON_REPLY: "Responder" - BUTTON_REPLY_ALL: "Responder a todos" - BUTTON_FORWARD: "Reenviar" - BUTTON_FORWARD_AS_ATTACHMENT: "Reenviar como adjunto" - BUTTON_EDIT_AS_NEW: "Editar como Nuevo" - BUTTON_SHOW_IMAGES: "Mostrar imágenes externas" - BUTTON_NOTIFY_READ_RECEIPT: "El remitente ha pedido que se le notifique cuando lea este mensaje." - BUTTON_IN_NEW_WINDOW: "Ver en una ventana nueva" - BUTTON_THREAD_LIST: "Hilo" - BUTTON_THREAD_PREV: "Anterior" - BUTTON_THREAD_NEXT: "Siguiente" - BUTTON_THREAD_MORE: "Más mensajes" - MENU_HEADERS: "Mostrar los encabezados del mensaje" - MENU_VIEW_ORIGINAL: "Mostrar original" - MENU_DOWNLOAD_ORIGINAL: "Descargar como archivo .eml" - MENU_FILTER_SIMILAR: "Filtrar mensajes como este" - MENU_PRINT: "Imprimir" - EMPTY_SUBJECT_TEXT: "(Sin asunto)" - LABEL_SUBJECT: "Asunto" - LABEL_DATE: "Fecha" - LABEL_FROM: "De" - LABEL_FROM_SHORT: "de" - LABEL_TO: "Para" - LABEL_TO_SHORT: "para" - LABEL_CC: "CC" - LABEL_BCC: "CCO (BCC)" - LABEL_REPLY_TO: "Responder" - PRINT_LABEL_FROM: "De" - PRINT_LABEL_TO: "Para" - PRINT_LABEL_CC: "CC" - PRINT_LABEL_BCC: "CCO (BCC)" - PRINT_LABEL_REPLY_TO: "Responder" - PRINT_LABEL_DATE: "Fecha" - PRINT_LABEL_SUBJECT: "Asunto" - PRINT_LABEL_ATTACHMENTS: "Adjuntos" - MESSAGE_LOADING: "Cargando" - MESSAGE_VIEW_DESC: "Seleccione un mensaje de la lista para verlo aquí." - MESSAGE_VIEW_MOVE_DESC: "Haga clic en el nombre de la carpeta del panel izquierdo para seleccionar el destino." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Contraseña" - PGP_SIGNED_MESSAGE_DESC: "Mensaje firmado mediante OpenPGP (click para verificar)" - PGP_ENCRYPTED_MESSAGE_DESC: "Mensaje cifrado mediante OpenPGP (click para desencriptar)" - LINK_DOWNLOAD_AS_ZIP: "Descargar todo (archivo ZIP)" - LINK_SAVE_TO_OWNCLOUD: "Guardar en ownCloud" - LINK_SAVE_TO_DROPBOX: "Guardar en Dropbox" - READ_RECEIPT: - SUBJECT: "Acuse de recibo (se visualiza) - %SUBJECT%" - BODY: | - Esta es una confirmación del correo que usted envió a %READ-RECEIPT%. - - Nota: Este acuse de recibo sólo reconoce que el mensaje se muestra en el ordenador del receptor. - No hay garantía de que el destinatario ha leído o entendido el contenido del mensaje. - SUGGESTIONS: - SEARCHING_DESC: "Buscando..." - CONTACTS: - LEGEND_CONTACTS: "Contactos" - SEARCH_INPUT_PLACEHOLDER: "Buscar" - BUTTON_ADD_CONTACT: "Añadir Contacto" - BUTTON_CREATE_CONTACT: "Crear" - BUTTON_UPDATE_CONTACT: "Actualizar" - BUTTON_IMPORT: "Importar (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Exportar (vcf, vCard)" - BUTTON_EXPORT_CSV: "Exportar (csv)" - ERROR_IMPORT_FILE: "Error de importación (formato de archivo no válido)" - LIST_LOADING: "Cargando" - EMPTY_LIST: "No hay contactos aquí" - EMPTY_SEARCH: "No se encontraron contactos" - CLEAR_SEARCH: "Limpiar búsqueda" - CONTACT_VIEW_DESC: "Seleccionar un contacto de la lista para verlo aquí." - LABEL_DISPLAY_NAME: "Nombre a visualizar" - LABEL_EMAIL: "Correo Electrónico" - LABEL_PHONE: "Teléfono" - LABEL_WEB: "Web" - LABEL_BIRTHDAY: "Cumpleaños" - LINK_ADD_EMAIL: "Agregar una dirección de correo electrónico" - LINK_ADD_PHONE: "Agregar un teléfono" - LINK_BIRTHDAY: "Cumpleaños" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Introduzca el nombre a visualizar" - PLACEHOLDER_ENTER_LAST_NAME: "Introduzca los apellidos" - PLACEHOLDER_ENTER_FIRST_NAME: "Introduzca el nombre" - PLACEHOLDER_ENTER_NICK_NAME: "Introduzca un alias" - LABEL_READ_ONLY: "Solo lectura" - LABEL_SHARE: "Compartir" - ADD_MENU_LABEL: "Añadir" - ADD_MENU_NICKNAME: "Alias" - ADD_MENU_NOTES: "Notas" - ADD_MENU_EMAIL: "Correo electrónico" - ADD_MENU_PHONE: "Teléfono" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Dirección" - ADD_MENU_BIRTHDAY: "Cumpleaños" - ADD_MENU_TAGS: "Etiquetas" - BUTTON_SHARE_NONE: "Ninguno" - BUTTON_SHARE_ALL: "Todos" - BUTTON_SYNC: "Sincronización (CardDAV)" - COMPOSE: - TITLE_FROM: "De" - TITLE_TO: "Para" - TITLE_CC: "CC" - TITLE_BCC: "CCO (BCC)" - TITLE_REPLY_TO: "Responder" - TITLE_SUBJECT: "Asunto" - LINK_SHOW_INPUTS: "mostrar todos los campos" - BUTTON_SEND: "Enviar" - BUTTON_SAVE: "Guardar" - BUTTON_DELETE: "Eliminar" - BUTTON_CANCEL: "Cancelar" - BUTTON_MINIMIZE: "Minimizar" - SAVED_TIME: "Guardado a las %TIME%" - SAVED_ERROR_ON_SEND: "El mensaje se envió, pero no se guardó en la carpeta de enviados" - DISCARD_UNSAVED_DATA: "¿Descartar cambios?" - ATTACH_FILES: "Añadir archivos" - ATTACH_DROP_FILES_DESC: "Arrastre los archivos aquí" - ATTACH_ITEM_CANCEL: "Cancelar" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% escribió" - FORWARD_MESSAGE_TOP_TITLE: "-------- Mensaje reenviado -------" - FORWARD_MESSAGE_TOP_FROM: "De" - FORWARD_MESSAGE_TOP_TO: "Para" - FORWARD_MESSAGE_TOP_CC: "CC" - FORWARD_MESSAGE_TOP_SENT: "Enviado" - FORWARD_MESSAGE_TOP_SUBJECT: "Asunto" - EMPTY_TO_ERROR_DESC: "Por favor, especifique al menos un destinatario" - NO_ATTACHMENTS_HERE_DESC: "No hay adjuntos aquí." - ATTACHMENTS_ERROR_DESC: "¡Atención! No se han subido todos los archivos adjuntos." - ATTACHMENTS_UPLOAD_ERROR_DESC: "No se han subido todos los archivos adjuntos." - BUTTON_REQUEST_READ_RECEIPT: "Solicitar confirmación de lectura" - BUTTON_MARK_AS_IMPORTANT: "Marcar como importante" - BUTTON_OPEN_PGP: "OpenPGP (solo texto plano)" - BUTTON_REQUEST_DSN: "Solicitar una confirmación de entrega" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Cerrar" - POPUPS_ASK: - BUTTON_YES: "Sí" - BUTTON_NO: "No" - DESC_WANT_CLOSE_THIS_WINDOW: "¿Está seguro de que desea cerrar esta ventana?" - DESC_WANT_DELETE_MESSAGES: "¿Está seguro de que desea eliminar los mensajes?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Seleccionar idioma" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Añadir cuenta" - BUTTON_ADD_ACCOUNT: "Añadir" - TITLE_UPDATE_ACCOUNT: "¿Actualizar cuenta?" - BUTTON_UPDATE_ACCOUNT: "Actualizar" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "¿Añadir Identidad?" - TITLE_UPDATE_IDENTITY: "¿Actualizar identidad?" - BUTTON_ADD_IDENTITY: "Añadir" - BUTTON_UPDATE_IDENTITY: "Actualizar" - LABEL_EMAIL: "Correo electrónico" - LABEL_NAME: "Nombre" - LABEL_REPLY_TO: "Responder" - LABEL_SIGNATURE: "Firma" - LABEL_CC: "CC" - LABEL_BCC: "CCO" - LABEL_SIGNATURE_INSERT_BEFORE: "Insertar esta firma antes de el texto entre comillas en las respuestas" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Crear una carpeta" - LABEL_NAME: "Nombre de la carpeta" - LABEL_PARENT: "Carpeta superior" - BUTTON_CREATE: "Crear" - BUTTON_CANCEL: "Cancelar" - BUTTON_CLOSE: "Cerrar" - TITLE_CREATING_PROCESS: "Creando carpeta" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "¿Purgar todos los mensajes de la carpeta?" - BUTTON_CLEAR: "Limpiar" - BUTTON_CANCEL: "Cancelar" - BUTTON_CLOSE: "Cerrar" - DANGER_DESC_WARNING: "¡Atención!" - DANGER_DESC_HTML_1: "Con esta acción usted puede borrar todos los emails de la carpeta %FOLDER% completamente." - DANGER_DESC_HTML_2: "Una vez comenzado el proceso no se puede abortar ni cancelar." - TITLE_CLEARING_PROCESS: "Purgando carpeta..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Importar clave OpenPGP" - BUTTON_IMPORT_OPEN_PGP_KEY: "Importar" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Ver clave OpenPGP" - BUTTON_SELECT: "Seleccionar" - BUTTON_CLOSE: "Cerrar" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Generar clave OpenPGP" - LABEL_EMAIL: "Correo electrónico" - LABEL_NAME: "Nombre" - LABEL_PASSWORD: "Contraseña" - LABEL_KEY_BIT_LENGTH: "Longitud de la clave" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generar" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "Firmar/Cifrar con OpenPGP" - LABEL_SIGN: "Firmar" - LABEL_ENCRYPT: "Encriptar" - LABEL_PASSWORD: "Contraseña" - BUTTON_SIGN: "Firmar" - BUTTON_ENCRYPT: "Encriptar" - BUTTON_SIGN_AND_ENCRYPT: "Firmar y encriptar" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "Descifrar OpenPGP" - LABEL_KEY: "Clave privada" - LABEL_PASSWORD: "Contraseña" - BUTTON_DECRYPT: "Descifrar" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "Prueba de verificación de 2 pasos" - LABEL_CODE: "Código" - BUTTON_TEST: "Probar" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "¿Crear un filtro?" - TITLE_EDIT_FILTER: "¿Actualizar un filtro?" - FILTER_NAME: "Nombre" - LEGEND_CONDITIONS: "Condiciones" - LEGEND_ACTIONS: "Acciones" - BUTTON_DONE: "Hecho" - BUTTON_ADD_CONDITION: "Añadir condición" - SELECT_ACTION_NONE: "Ninguna" - SELECT_ACTION_MOVE_TO: "Mover" - SELECT_ACTION_FORWARD_TO: "Reenviar" - SELECT_ACTION_REJECT: "Rechazar" - SELECT_ACTION_VACATION_MESSAGE: "Mensaje fuera de línea" - SELECT_ACTION_DISCARD: "Descartar" - SELECT_FIELD_FROM: "De" - SELECT_FIELD_RECIPIENTS: "Destinatarios (A o CC)" - SELECT_FIELD_SUBJECT: "Asunto" - SELECT_FIELD_HEADER: "Encabezado" - SELECT_FIELD_SIZE: "Tamaño" - SELECT_TYPE_CONTAINS: "Contiene" - SELECT_TYPE_NOT_CONTAINS: "No Contiene" - SELECT_TYPE_MATCHES: "Coincide (* and ? supported)" - SELECT_TYPE_NOT_MATCHES: "No Coindide (* and ? supported)" - SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Not Regexp" - SELECT_TYPE_EQUAL_TO: "Igual A" - SELECT_TYPE_NOT_EQUAL_TO: "Distinto De" - SELECT_TYPE_OVER: "Por Encima" - SELECT_TYPE_UNDER: "Por Debajo" - SELECT_MATCH_ANY: "Si coincide alguna de estas reglas" - SELECT_MATCH_ALL: "Si coinciden todas las reglas" - MARK_AS_READ_LABEL: "Marcar como leído" - REPLY_INTERVAL_LABEL: "Intervalo de respuesta (días)" - KEEP_LABEL: "Mantener" - STOP_LABEL: "Don't stop processing rules" - EMAIL_LABEL: "Email" - VACATION_SUBJECT_LABEL: "Asunto (opcional)" - VACATION_MESSAGE_LABEL: "Mensaje" - VACATION_RECIPIENTS_LABEL: "Destinatarios (separados por coma)" - REJECT_MESSAGE_LABEL: "Rechazar mensaje" - ALL_INCOMING_MESSAGES_DESC: "Todos los mensajes entrantes" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Seleccione las carpetas del sistema" - SELECT_CHOOSE_ONE: "Elija una" - SELECT_UNUSE_NAME: "No usar" - LABEL_SENT: "Enviados" - LABEL_DRAFTS: "Borradores" - LABEL_SPAM: "Correo no deseado" - LABEL_TRASH: "Papelera" - LABEL_ARCHIVE: "Archivo" - BUTTON_CANCEL: "Cancelar" - BUTTON_CLOSE: "Cerrar" - NOTIFICATION_SENT: | - Usted no ha seleccionado la carpeta del sistema para guardar los "Enviados". - Si no desea guardar los mensajes enviados, por favor seleccione la opción "No usar". - NOTIFICATION_DRAFTS: "Usted no ha seleccionado la carpeta del sistema para guardar los \"Borradores\"." - NOTIFICATION_SPAM: | - Usted no ha seleccionado la carpeta del sistema para alojar los mensajes marcados como "Spam". - Si desea eliminar los mensajes permanentemente, por favor seleccione la opción "No usar". - NOTIFICATION_TRASH: | - Usted no ha seleccionado la carpeta del sistema para alojar los mensajes enviados a la "Papelera" . - Si desea eliminar los mensajes permanentemente, por favor seleccione la opción "No usar". - NOTIFICATION_ARCHIVE: "Usted no ha seleccionado la carpeta del sistema para alojar los mensajes enviados al \"Archivo\"." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "Verificación de 2 Pasos" - LABEL_ENABLE_TWO_FACTOR: "Activar la verificación de 2 pasos" - LABEL_TWO_FACTOR_USER: "Usuario" - LABEL_TWO_FACTOR_STATUS: "Estado" - LABEL_TWO_FACTOR_SECRET: "Clave secreta" - LABEL_TWO_FACTOR_BACKUP_CODES: "Códigos de copia de seguridad" - BUTTON_CREATE: "Crear nueva clave secreta" - BUTTON_ACTIVATE: "Activate" - BUTTON_CLEAR: "Borrar" - BUTTON_LOGOUT: "Logout" - BUTTON_DONE: "Hecho" - BUTTON_TEST: "Probar" - LINK_TEST: "probar" - BUTTON_SHOW_SECRET: "Mostrar clave secreta" - BUTTON_HIDE_SECRET: "Ocultar clave secreta" - TWO_FACTOR_REQUIRE_DESC: "Se requiere que configure la verificación de 2-pasos." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configurado" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "No configurado" - TWO_FACTOR_SECRET_DESC: >- - Importar esta información en su cliente Google Authenticator (u otro cliente - TOTP) utilizando el código QR ​​se indica debajo o introduciendo el código - manualmente. - TWO_FACTOR_BACKUP_CODES_DESC: >- - Si usted no puede recibir los códigos a través de Google Authenticator, puede - utilizar códigos de copia de seguridad para firmar pulg Después de que usted - ha utilizado un código de copia de seguridad para iniciar sesión, se convertirá - en inactiva. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." - TITLES: - LOADING: "Cargando" - LOGIN: "Ingresar" - MAILBOX: "Buzón" - SETTINGS: "Configuraciones" - COMPOSE: "Redactar" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "El archivo es muy grande" - ERROR_FILE_PARTIALLY_UPLOADED: "El archivo fue subido parcialmente debido a un error desconocido" - ERROR_NO_FILE_UPLOADED: "Ningún archivo subido" - ERROR_MISSING_TEMP_FOLDER: "El archivo temporal no se encuentra" - ERROR_ON_SAVING_FILE: "Se ha producido un error de carga de archivo desconocido" - ERROR_FILE_TYPE: "Tipo de archivo inválido" - ERROR_UNKNOWN: "Se ha producido un error de carga de archivo desconocido" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXTO" - TEXT_SWITCHER_RICH_FORMATTING: "Texto enriquecido" - TEXT_SWITCHER_CONFIRM: "Se perderá el formato de texto e imágenes. ¿Está seguro que desea continuar?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Personal" - LABEL_GENERAL_NAME: "General" - LABEL_CONTACTS_NAME: "Contactos" - LABEL_FOLDERS_NAME: "Carpetas" - LABEL_ACCOUNTS_NAME: "Cuentas" - LABEL_IDENTITY_NAME: "Identidad" - LABEL_IDENTITIES_NAME: "Identidades" - LABEL_FILTERS_NAME: "Filtros" - LABEL_TEMPLATES_NAME: "Plantillas" - LABEL_SECURITY_NAME: "Seguridad" - LABEL_SOCIAL_NAME: "Social" - LABEL_THEMES_NAME: "Temas" - LABEL_CHANGE_PASSWORD_NAME: "Contraseña" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Atrás" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filtros" - BUTTON_SAVE: "Guardar" - BUTTON_ADD_FILTER: "Añadir un Filtro" - BUTTON_DELETE: "Borrar" - BUTTON_RAW_SCRIPT: "Usar Script Personalizado" - SUBNAME_NONE: "Ninguno" - SUBNAME_MOVE_TO: "Mover a \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Reenviar a \"%EMAIL%\"" - SUBNAME_REJECT: "Rechazar" - SUBNAME_VACATION_MESSAGE: "Mensaje de vacaciones" - SUBNAME_DISCARD: "Descartar" - CAPABILITY_LABEL: "Capability" - LOADING_PROCESS: "Actualizando lista de filtros" - DELETING_ASK: "¿Está seguro?" - CHACHES_NEED_TO_BE_SAVED_DESC: "Estos cambios deben ser cambiados en el servidor." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identidad" - LABEL_DISPLAY_NAME: "Nombre" - LABEL_REPLY_TO: "Responder a" - LABEL_SIGNATURE: "Firma" - LABEL_ADD_SIGNATURE_TO_ALL: "Agregar su firma a todos los mensajes salientes" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Seguridad" - LABEL_CONFIGURE_TWO_FACTOR: "Configurar verificación de 2-Pasos" - LABEL_AUTOLOGOUT: "Salir Automáticamente" - AUTOLOGIN_NEVER_OPTION_NAME: "Nunca" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minuto(s)" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hora(s)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "General" - LABEL_LANGUAGE: "Idioma" - LABEL_IDENTITY: "Identidad" - LABEL_LAYOUT: "Layout" - LABEL_LAYOUT_NO_SPLIT: "Sin División" - LABEL_LAYOUT_VERTICAL_SPLIT: "División Vertical" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "División Horizontal" - LABEL_EDITOR: "Editor de texto predeterminado" - LABEL_EDITOR_HTML: "HTML" - LABEL_EDITOR_PLAIN: "Texto plano" - LABEL_EDITOR_HTML_FORCED: "Html (forzado)" - LABEL_EDITOR_PLAIN_FORCED: "Texto plano (forzado)" - LABEL_ANIMATION: "Interface animation" - LABEL_ANIMATION_FULL: "Todo" - LABEL_ANIMATION_NORMAL: "Normal" - LABEL_ANIMATION_NONE: "Ninguno" - LABEL_VIEW_OPTIONS: "Ver opciones" - LABEL_USE_PREVIEW_PANE: "Utilice el panel de vista previa" - LABEL_USE_CHECKBOXES_IN_LIST: "Mostrar casillas de verificación en la lista" - LABEL_USE_THREADS: "Usar hilos de conversación" - LABEL_REPLY_SAME_FOLDER: "Coloque las respuestas en la carpeta del mensaje que esta respondiendo." - LABEL_SHOW_IMAGES: "Mostrar siempre las imágenes en el cuerpo del mensaje" - LABEL_SHOW_ANIMATION: "Mostrar animación" - LABEL_MESSAGE_PER_PAGE: "Mensajes en página" - LABEL_NOTIFICATIONS: "Notificaciones" - LABEL_SOUND_NOTIFICATION: "Sonido de la notificación" - LABEL_CHROME_NOTIFICATION_DESC: "Mostrar notificación de nuevos mensajes en Popup" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Bloqueado por el explorador)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Contactos" - LABEL_CONTACTS_AUTOSAVE: "Agregar automáticamente destinatarios a la libreta de direcciones" - LEGEND_CONTACTS_SYNC: "Sincronización remota (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Activar la sincronización remota" - LABEL_CONTACTS_SYNC_SERVER: "Servidor" - LABEL_CONTACTS_SYNC_AB_URL: "Libreta de direcciones URL" - LABEL_CONTACTS_SYNC_USER: "Usuario" - LABEL_CONTACTS_SYNC_PASSWORD: "Contraseña" - SETTINGS_THEMES: - LEGEND_THEMES: "Temas" - LEGEND_THEMES_CUSTOM: "Configuración de tema personalizado" - LABEL_CUSTOM_TYPE: "Tipo" - LABEL_CUSTOM_TYPE_LIGHT: "Claro" - LABEL_CUSTOM_TYPE_DARK: "Oscuro" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Fondo" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Suba una imagen de fondo (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "La imagen es muy grande" - ERROR_FILE_TYPE_ERROR: "Tipo de archivo inválido (Solo permitido: JPG y PNG)" - ERROR_UNKNOWN: "Se ha producido un error de carga de archivo desconocido" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Conectar con Google" - BUTTON_GOOGLE_DISCONNECT: "Desconectar de Google" - MAIN_GOOGLE_DESC: "Despues de habilitar el ingreso via Google, usted puede iniciar sesión en la cuenta usando el botón de Google que aparece en la pantalla de ingreso." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Conectar con Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Desconectar Facebook" - MAIN_FACEBOOK_DESC: "Despues de habilitar el ingreso via Facebook, usted puede iniciar sesión en la cuenta usando el botón de Facebook que aparece en la pantalla de ingreso." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Conectar con Twitter" - BUTTON_TWITTER_DISCONNECT: "Desconectar Twitter" - MAIN_TWITTER_DESC: "Despues de habilitar el ingreso via Twitter, usted puede iniciar sesión en la cuenta usando el botón de Twitter que aparece en la pantalla de ingreso." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Lista de Carpetas" - BUTTON_CREATE: "Crear carpeta" - BUTTON_SYSTEM: "Carpetas del sistema" - BUTTON_DELETE: "Eliminar" - BUTTON_SUBSCRIBE: "Suscribir" - BUTTON_UNSUBSCRIBE: "Darse de baja" - LOADING_PROCESS: "Actualizando lista de carpetas" - CREATING_PROCESS: "Creando carpeta" - DELETING_PROCESS: "Eliminado carpeta" - RENAMING_PROCESS: "Renombrando carpeta" - DELETING_ASK: "¿Está usted seguro?" - TO_MANY_FOLDERS_DESC_1: "Tiene muchas carpetas!" - TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." - HELP_DELETE_FOLDER: "Eliminar carpeta" - HELP_SHOW_HIDE_FOLDER: "Mostrar/ocultar carpeta" - HELP_CHECK_FOR_NEW_MESSAGES: "Chequear/no chequear nuevos mensajes" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Lista de cuentas" - LEGEND_IDENTITIES: "Identidades" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Cuentas e identidades" - BUTTON_ADD_ACCOUNT: "Añadir cuenta" - BUTTON_ADD_IDENTITY: "Añadir identidad" - BUTTON_DELETE: "Eliminar" - LOADING_PROCESS: "Actualizando lista de cuentas" - DELETING_ASK: "¿Está usted seguro?" - DEFAULT_IDENTITY_LABEL: "predeterminado" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identidad" - LEGEND_IDENTITIES: "Identidades adicionales" - LABEL_DEFAULT: "Predeterminado" - LABEL_DISPLAY_NAME: "Nombre" - LABEL_REPLY_TO: "Responder a" - LABEL_SIGNATURE: "Firma" - LABEL_ADD_SIGNATURE_TO_ALL: "Agregar firma a todos los mensajes salientes" - BUTTON_ADD_IDENTITY: "Añadir Identidad" - BUTTON_DELETE: "Eliminar" - LOADING_PROCESS: "Actualización de la lista de la identidad" - DELETING_ASK: "¿Está usted seguro?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Cambiar contraseña" - LABEL_CURRENT_PASSWORD: "Contraseña actual" - LABEL_NEW_PASSWORD: "Nueva contraseña" - LABEL_REPEAT_PASSWORD: "Confirmar nueva contraseña" - BUTTON_UPDATE_PASSWORD: "Establecer nueva contraseña" - ERROR_PASSWORD_MISMATCH: "Las contraseñas no coinciden, por favor intente de nuevo" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Importar llave OpenPGP" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generar llaves OpenPGP" - TITLE_PRIVATE: "Privado" - TITLE_PUBLIC: "Público" - DELETING_ASK: "¿Está usted seguro?" - GENERATE_ONLY_HTTPS: "Solo HTTPS" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Ayuda de atajos de teclado" - TAB_MAILBOX: "Buzón" - TAB_MESSAGE_LIST: "Lista de mensajes" - TAB_MESSAGE_VIEW: "Vista de avisos" - TAB_COMPOSE: "Redactar" - LABEL_OPEN_USER_DROPDOWN: "Desplegar lista de usuarios" - LABEL_REPLY: "Responder" - LABEL_REPLY_ALL: "Responder a todos" - LABEL_FORWARD: "Adelante" - LABEL_FORWARD_MULTIPLY: "Reenviar (multiplicar)" - LABEL_HELP: "Ayuda" - LABEL_CHECK_ALL: "Comprobar todos los mensajes" - LABEL_ARCHIVE: "Archivo" - LABEL_DELETE: "Eliminar" - LABEL_OPEN_THREAD: "Abrir hilo seleccionado" - LABEL_MOVE: "Mover" - LABEL_READ: "Marcar los mensajes seleccionados como leídos" - LABEL_UNREAD: "Marcar los mensajes seleccionados como no leídos" - LABEL_IMPORTANT: "Importante, marcar mensajes seleccionados" - LABEL_SEARCH: "Buscar" - LABEL_CANCEL_SEARCH: "Cancelar la búsqueda" - LABEL_FULLSCREEN_ENTER: "Pantalla completa (panel de vista previa)" - LABEL_VIEW_MESSAGE_ENTER: "Ver mensaje (No hay diseño panel de vista previa)" - LABEL_SWITCH_TO_MESSAGE: "Cambiar foco a mensaje seleccionado" - LABEL_SWITCH_TO_FOLDER_LIST: "Cambiar foco a la lista de carpetas" - LABEL_FULLSCREEN_TOGGLE: "Cambiar a modo de pantalla completa" - LABEL_BLOCKQUOTES_TOGGLE: "Cambiar blockquotes de mensaje" - LABEL_THREAD_NEXT: "Próximo mensaje del hilo" - LABEL_THREAD_PREV: "Mensaje anterior del hilo" - LABEL_PRINT: "Imprimir" - LABEL_EXIT_FULLSCREEN: "Salir del modo de pantalla completa" - LABEL_CLOSE_MESSAGE: "Cerrar el mensaje (No hay diseño panel de vista previa)" - LABEL_SWITCH_TO_LIST: "Cambiar foco de nuevo a la lista de mensajes" - LABEL_OPEN_COMPOSE_POPUP: "Abrir ventana de redacción" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimizar componer" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Abrir ventana de identidades" - LABEL_SAVE_MESSAGE: "Guardar aviso" - LABEL_SEND_MESSAGE: "Enviar mensaje" - LABEL_CLOSE_COMPOSE: "Cerrar componer" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "No se encontraron claves públicas" - NO_PUBLIC_KEYS_FOUND_FOR: "No hay claves públicas encontrados para el email %MAIL%" - NO_PRIVATE_KEY_FOUND: "No se encontró la clave privada" - NO_PRIVATE_KEY_FOUND_FOR: "No hay una clave privada para el email %EMAIL%" - ADD_A_PUBLICK_KEY: "Añadir llave pública" - SELECT_A_PRIVATE_KEY: "Seleccionar una clave privada" - UNVERIFIRED_SIGNATURE: "Firma no verificada" - DECRYPTION_ERROR: "Error de descifrado OpenPGP" - GOOD_SIGNATURE: "Buena firma de %USER%" - PGP_ERROR: "Error OpenPGP: %ERROR%" - SPECIFY_FROM_EMAIL: "Por favor, especifique dirección de correo electrónico PARA" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Por favor, especifique al menos un destinatario" - NOTIFICATIONS: - INVALID_TOKEN: "Elemento no válido" - AUTH_ERROR: "Autentificación fallida" - ACCESS_ERROR: "Error de acceso" - CONNECTION_ERROR: "No se puede conectar al servidor" - CAPTCHA_ERROR: "CAPTCHA Incorrecto." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- - Este ID no está asignado a ninguna cuenta de Email todavía. Inicie sesión - con las credenciales de correo electrónico y habilite esta característica - en la configuración de cuenta. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- - Este ID no está asignado a ninguna cuenta de Email todavía. Inicie sesión - con las credenciales de correo electrónico y habilite esta característica - en la configuración de cuenta. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- - Este ID no está asignado a ninguna cuenta de Email todavía. Inicie sesión - con las credenciales de correo electrónico y habilite esta característica - en la configuración de cuenta. - DOMAIN_NOT_ALLOWED: "Dominio no permitido" - ACCOUNT_NOT_ALLOWED: "La cuenta no está permitida" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Factor de verificación en dos pasos requerido" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Error de verificación en dos pasos" - COULD_NOT_SAVE_NEW_PASSWORD: "No se puede guardar la nueva contraseña" - CURRENT_PASSWORD_INCORRECT: "La contraseña actual es incorrecta" - NEW_PASSWORD_SHORT: "La contraseña es muy corta" - NEW_PASSWORD_WEAK: "La contraseña es muy fácil" - NEW_PASSWORD_FORBIDDENT: "La contraseña contiene caracteres prohibidos" - CONTACTS_SYNC_ERROR: "Error de sincronización de Contactos" - CANT_GET_MESSAGE_LIST: "No se puede obtener la lista de mensajes" - CANT_GET_MESSAGE: "No se puede obtener el mensaje" - CANT_DELETE_MESSAGE: "No se puede eliminar el mensaje" - CANT_MOVE_MESSAGE: "No se puede mover el mensaje" - CANT_SAVE_MESSAGE: "No se puede guardar el mensaje" - CANT_SEND_MESSAGE: "No se puede enviar el mensaje" - INVALID_RECIPIENTS: "Los destinatarios no son válidos" - CANT_SAVE_FILTERS: "No se pueden guardar los filtros" - CANT_GET_FILTERS: "No se pueden obtener los filtros" - FILTERS_ARE_NOT_CORRECT: "Filtros incorrectos" - CANT_CREATE_FOLDER: "No se puede crear la carpeta" - CANT_RENAME_FOLDER: "No se puede renombrar la carpeta" - CANT_DELETE_FOLDER: "No se puede eliminar la carpeta" - CANT_DELETE_NON_EMPTY_FOLDER: "No se puede eliminar un directorio que no está vacío" - CANT_SUBSCRIBE_FOLDER: "No se puede suscribir carpeta" - CANT_UNSUBSCRIBE_FOLDER: "No puede darse de baja de la carpeta" - CANT_SAVE_SETTINGS: "No puede guardar la configuración" - CANT_SAVE_PLUGIN_SETTINGS: "No puede guardar la configuración" - DOMAIN_ALREADY_EXISTS: "El Dominio ya existe" - CANT_INSTALL_PACKAGE: "No se pudo instalar el paquete" - CANT_DELETE_PACKAGE: "No se pudo eliminar el paquete" - INVALID_PLUGIN_PACKAGE: "Paquete de plugins no válido" - UNSUPPORTED_PLUGIN_PACKAGE: "Paquete de plugins incompatible" - LICENSING_SERVER_IS_UNAVAILABLE: "El Servidor de Suscripción no está disponible" - LICENSING_DOMAIN_EXPIRED: "La suscripción para este dominio ha expirado." - LICENSING_DOMAIN_BANNED: "La suscripción para este dominio se prohibió." - DEMO_SEND_MESSAGE_ERROR: "Por razones de seguridad, esta cuenta demo no permite enviar mensajes a direcciones de correo electrónico externas!" - DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" - ACCOUNT_ALREADY_EXISTS: "La cuenta ya existe" - ACCOUNT_DOES_NOT_EXIST: "La cuenta no existe" - MAIL_SERVER_ERROR: "Ocurrió un error mientras se accedía al servidor" - INVALID_INPUT_ARGUMENT: "Argumento no válido" - UNKNOWN_ERROR: "Error desconocido" - STATIC: - BACK_LINK: "Recargar" - DOMAIN_LIST_DESC: "Lista de dominios de correo web que se le permite acceder." - PHP_EXSTENSIONS_ERROR_DESC: "La extensión de PHP requerida no está disponible en su configuración de PHP!" - PHP_VERSION_ERROR_DESC: "Su versión de PHP (%VERSION%) es menor a la mínima requerida 5.3.0!" - NO_SCRIPT_TITLE: "Esta aplicación requiere de JavaScript." - NO_SCRIPT_DESC: | - JavaScript no está disponible en su navegador. - Por favor habilite el soporte JavaScript en la configuración de su navegador e inténtelo de nuevo. - NO_COOKIE_TITLE: "Esta aplicación requiere de Cookies." - NO_COOKIE_DESC: | - Su navegador no soporta Cookies. - Por favor habilite los Cookie en la configuración de su navegador e inténtelo de nuevo. - BAD_BROWSER_TITLE: "Su navegador no está actualizado." - BAD_BROWSER_DESC: | - Para usar todas las características de esta aplicación, - descargue e instale uno de estos navegadores: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/et_EE.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/et_EE.yml deleted file mode 100755 index 21ec9bab..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/et_EE.yml +++ /dev/null @@ -1,710 +0,0 @@ -et_EE: - LOGIN: - LABEL_EMAIL: "E-post" - LABEL_LOGIN: "Logi sisse" - LABEL_PASSWORD: "Salasõna" - LABEL_SIGN_ME: "Pea mind meeles" - LABEL_VERIFICATION_CODE: "Kontrollkood" - LABEL_DONT_ASK_VERIFICATION_CODE: "Ära küsi koodi järgmised 2 nädalat" - BUTTON_SIGN_IN: "Sisene" - TITLE_SIGN_IN_GOOGLE: "Sisene Google'i abil" - TITLE_SIGN_IN_FACEBOOK: "Sisene Facebooki abil" - TITLE_SIGN_IN_TWITTER: "Sisene Twitteri abil" - LABEL_FORGOT_PASSWORD: "Unustasin salasõna" - LABEL_REGISTRATION: "Registreerimine" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Lisa konto" - BUTTON_SETTINGS: "Sätted" - BUTTON_HELP: "Abi" - BUTTON_LOGOUT: "Logi välja" - MOBILE: - BUTTON_MOBILE_VERSION: "Mobiiliversioon" - BUTTON_DESKTOP_VERSION: "Töölauaversioon" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Otsing" - TITLE_ADV: "Täpsem otsing" - LABEL_ADV_FROM: "Saatja" - LABEL_ADV_TO: "Saaja" - LABEL_ADV_SUBJECT: "Pealkiri" - LABEL_ADV_TEXT: "Tekst" - LABEL_ADV_HAS_ATTACHMENT: "Manusega" - LABEL_ADV_HAS_ATTACHMENTS: "Manustega" - LABEL_ADV_FLAGGED: "Lipuga tähistatud" - LABEL_ADV_UNSEEN: "Lugemata" - LABEL_ADV_DATE: "Kuupäev" - LABEL_ADV_DATE_ALL: "Kõik" - LABEL_ADV_DATE_3_DAYS: "Kuni 3 päeva vanune" - LABEL_ADV_DATE_7_DAYS: "Kuni 1 nädal vanune" - LABEL_ADV_DATE_MONTH: "Kuni 1 kuu vanune" - LABEL_ADV_DATE_3_MONTHS: "Kuni 3 kuu vanune " - LABEL_ADV_DATE_6_MONTHS: "Kuni 6 kuu vanune" - LABEL_ADV_DATE_YEAR: "Kuni 1 aasta vanune" - BUTTON_ADV_SEARCH: "Otsi" - PREVIEW_POPUP: - FULLSCREEN: "Täisekraan sisse/välja" - ZOOM: "Suurenda/vähenda" - CLOSE: "Sulge (Esc)" - LOADING: "Laadin..." - GALLERY_PREV: "Eelmine (nool vasakule)" - GALLERY_NEXT: "Järgmine (nool paremale)" - GALLERY_COUNTER: "%curr%. %total%-st" - IMAGE_ERROR: "Pilti ei olnud võimalik laadida." - AJAX_ERROR: "Sisu ei olnud võimalik laadida." - FOLDER_LIST: - BUTTON_COMPOSE: "Koosta uus kiri" - BUTTON_CONTACTS: "Kontaktid" - BUTTON_NEW_MESSAGE: "Uus kiri" - INBOX_NAME: "Saabunud kirjad" - SENT_NAME: "Saadetud kirjad" - DRAFTS_NAME: "Mustandid" - SPAM_NAME: "Rämpspost" - TRASH_NAME: "Prügikast" - ARCHIVE_NAME: "Arhiiv" - QUOTA: - TITLE: "Andmemaht" - MESSAGE_LIST: - BUTTON_RELOAD: "Laadi kirjade nimekiri uuesti" - BUTTON_MOVE_TO: "Liiguta kausta" - BUTTON_DELETE: "Kustuta" - BUTTON_ARCHIVE: "Arhiveeri" - BUTTON_SPAM: "Märgi rämpspostiks" - BUTTON_NOT_SPAM: "Ei ole rämpspost" - BUTTON_EMPTY_FOLDER: "Tühjenda kaust" - BUTTON_MULTY_FORWARD: "Edasta manus(t)ena" - BUTTON_DELETE_WITHOUT_MOVE: "Kustuta lõplikult" - BUTTON_MORE: "Näita rohkem" - MENU_SET_SEEN: "Märgi loetuks" - MENU_SET_ALL_SEEN: "Märgi kõik loetuks" - MENU_UNSET_SEEN: "Märgi lugemata kirjaks" - MENU_SET_FLAG: "Tähista lipuga" - MENU_UNSET_FLAG: "Eemalda lipp" - MENU_SELECT_ALL: "Kõik" - MENU_SELECT_NONE: "Ühtegi" - MENU_SELECT_INVERT: "Pööra valik ümber" - MENU_SELECT_UNSEEN: "Lugemata" - MENU_SELECT_SEEN: "Loetud" - MENU_SELECT_FLAGGED: "Lipuga märgitud" - MENU_SELECT_UNFLAGGED: "Lipuga märkimata" - EMPTY_LIST: "Tühi nimekiri" - EMPTY_SEARCH_LIST: "Otsingule ei vastanud ühtegi kirja" - SEARCH_RESULT_FOR: "Vasted otsingule \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "tagasi kirjade nimekirja" - LIST_LOADING: "Laadimine" - EMPTY_SUBJECT_TEXT: "(Pealkiri puudub)" - PUT_MESSAGE_HERE: "Sikuta siia kiri, mida soovid nimekirjas näha" - TODAY_AT: "täna kell %TIME%" - YESTERDAY_AT: "eile kell %TIME%" - SEARCH_PLACEHOLDER: "Otsi" - NEW_MESSAGE_NOTIFICATION: "Sulle on %COUNT% uut kirja!" - QUOTA_SIZE: "Kasutad %SIZE% (%PROC%%) lubatud kettamahust %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Muuda" - BUTTON_BACK: "Tagasi" - BUTTON_CLOSE: "Sulge" - BUTTON_DELETE: "Kustuta" - BUTTON_ARCHIVE: "Arhiveeri" - BUTTON_SPAM: "Märgi rämpspostiks" - BUTTON_NOT_SPAM: "Ei ole rämpspost" - BUTTON_MOVE_TO: "Liiguta kausta" - BUTTON_MORE: "Näita rohkem" - BUTTON_REPLY: "Vasta" - BUTTON_REPLY_ALL: "Vasta kõigile" - BUTTON_FORWARD: "Edasta" - BUTTON_FORWARD_AS_ATTACHMENT: "Edasta manusena" - BUTTON_EDIT_AS_NEW: "Kasuta uue kirja põhjana" - BUTTON_SHOW_IMAGES: "Näita väljast lingitud pilte" - BUTTON_NOTIFY_READ_RECEIPT: "Saatja palub end teavitada kirja kättesaamisest." - BUTTON_IN_NEW_WINDOW: "Näita eraldi aknas" - BUTTON_THREAD_LIST: "Vestluse lõimede nimekiri" - BUTTON_THREAD_PREV: "Eelmine" - BUTTON_THREAD_NEXT: "Järgmine" - BUTTON_THREAD_MORE: "Rohkem kirju" - MENU_HEADERS: "Näita kirja päised" - MENU_VIEW_ORIGINAL: "Näita lähteteksti" - MENU_DOWNLOAD_ORIGINAL: "Laadi alla .eml failina" - MENU_FILTER_SIMILAR: "Filtreeri sarnased kirjad" - MENU_PRINT: "Prindi" - EMPTY_SUBJECT_TEXT: "(Pealkiri puudub)" - LABEL_SUBJECT: "Pealkiri" - LABEL_DATE: "Kuupäev" - LABEL_FROM: "Saatja" - LABEL_FROM_SHORT: "saatja" - LABEL_TO: "Saaja" - LABEL_TO_SHORT: "saaja" - LABEL_CC: "Koopia" - LABEL_BCC: "Pimekoopia" - LABEL_REPLY_TO: "Vastuse saaja" - PRINT_LABEL_FROM: "Saatja" - PRINT_LABEL_TO: "Saaja" - PRINT_LABEL_CC: "Koopia" - PRINT_LABEL_BCC: "Pimekoopia" - PRINT_LABEL_REPLY_TO: "Vastuse saaja " - PRINT_LABEL_DATE: "Kuupäev" - PRINT_LABEL_SUBJECT: "Pealkiri" - PRINT_LABEL_ATTACHMENTS: "Manused" - MESSAGE_LOADING: "Laadimine" - MESSAGE_VIEW_DESC: "Vali nimekirjast kiri, mida siin näidata" - PGP_PASSWORD_INPUT_PLACEHOLDER: "Salasõna" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP abil signeeritud kiri (kliki verifitseerimiseks)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP abil krüpteeritud kiri (kliki dekrüpteerimiseks)" - LINK_DOWNLOAD_AS_ZIP: "Laadi alla .zip failina" - LINK_SAVE_TO_OWNCLOUD: "Salvesta ownCloudi" - LINK_SAVE_TO_DROPBOX: "Salvesta Dropboxi" - READ_RECEIPT: - SUBJECT: "Kohaletoimetamise kinnitus - %SUBJECT%" - BODY: | - See on kohaletoimetamise kinnitus kirjale, mille saatsid aadressile %READ-RECEIPT%. - - Tähelepanu: Kinnitus tähendab vaid seda, et kirja kuvati saaja arvutis. - Kirja sisu lugemise või mõistmise kohta see teavitus granatiisid ei anna. - SUGGESTIONS: - SEARCHING_DESC: "Otsin..." - CONTACTS: - LEGEND_CONTACTS: "Kontaktid" - SEARCH_INPUT_PLACEHOLDER: "Otsi" - BUTTON_ADD_CONTACT: "Lisa kontakt" - BUTTON_CREATE_CONTACT: "Lisa" - BUTTON_UPDATE_CONTACT: "Salvesta" - BUTTON_IMPORT: "Impordi (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Ekspordi (vcf, vCard)" - BUTTON_EXPORT_CSV: "Ekspordi (csv)" - ERROR_IMPORT_FILE: "Viga importimisel (puudulik faili formaat)" - LIST_LOADING: "Laadimine" - EMPTY_LIST: "Kontaktid puuduvad" - EMPTY_SEARCH: "Kontakte ei leitud" - CLEAR_SEARCH: "Puhasta otsinguväli" - CONTACT_VIEW_DESC: "Vali nimekirjast kontakt, mida siin näidata" - LABEL_DISPLAY_NAME: "Kuvatav nimi" - LABEL_EMAIL: "E-post" - LABEL_PHONE: "Telefon" - LABEL_WEB: "Veebileht" - LABEL_BIRTHDAY: "Sünnipäev" - LINK_ADD_EMAIL: "Lisa e-posti aadress" - LINK_ADD_PHONE: "Lisa telefon" - LINK_BIRTHDAY: "Sünnipäev" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Sisesta kuvatav nimi" - PLACEHOLDER_ENTER_LAST_NAME: "Sisesta perenimi" - PLACEHOLDER_ENTER_FIRST_NAME: "Sisesta eesnimi" - PLACEHOLDER_ENTER_NICK_NAME: "Sisesta hüüdnimi" - LABEL_READ_ONLY: "Ainult lugemisõigus" - LABEL_SHARE: "Jaga" - ADD_MENU_LABEL: "Lisa" - ADD_MENU_NICKNAME: "Hüüdnimi" - ADD_MENU_NOTES: "Märkmed" - ADD_MENU_EMAIL: "E-post" - ADD_MENU_PHONE: "Telefon" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Aadress" - ADD_MENU_BIRTHDAY: "Sünnipäev" - ADD_MENU_TAGS: "Sildid" - BUTTON_SHARE_NONE: "Puudub" - BUTTON_SHARE_ALL: "Kõigiga" - BUTTON_SYNC: "Sünkroniseerimine (CardDAV)" - COMPOSE: - TITLE_FROM: "Saatja" - TITLE_TO: "Saaja" - TITLE_CC: "Koopia" - TITLE_BCC: "Pimekoopia" - TITLE_REPLY_TO: "Vastuse saaja " - TITLE_SUBJECT: "Pealkiri" - LINK_SHOW_INPUTS: "näita kõiki väljasid" - BUTTON_SEND: "Saada" - BUTTON_SAVE: "Salvesta" - BUTTON_DELETE: "Kustuta" - BUTTON_CANCEL: "Tühista" - BUTTON_MINIMIZE: "Vähenda miinimumini" - SAVED_TIME: "Salvestati %TIME%" - SAVED_ERROR_ON_SEND: "Kiri saadeti, aga seda ei salvestatud saadetud kirjade kausta" - DISCARD_UNSAVED_DATA: "Kustutan salvestamata andmed?" - ATTACH_FILES: "Lisa faile" - ATTACH_DROP_FILES_DESC: "Sikuta failid siia" - ATTACH_ITEM_CANCEL: "Tühista" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% kirjutas" - FORWARD_MESSAGE_TOP_TITLE: "-------- Edastatud kiri -------" - FORWARD_MESSAGE_TOP_FROM: "Saatja" - FORWARD_MESSAGE_TOP_TO: "Saaja" - FORWARD_MESSAGE_TOP_CC: "Koopia" - FORWARD_MESSAGE_TOP_SENT: "Saadetud" - FORWARD_MESSAGE_TOP_SUBJECT: "Pealkiri" - EMPTY_TO_ERROR_DESC: "Lisa vähemalt üks adressaat" - NO_ATTACHMENTS_HERE_DESC: "Manused puuduvad." - ATTACHMENTS_ERROR_DESC: "Tähelepanu! Kõiki manuseid ei ole üles laetud." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Kõiki manuseid ei ole veel üles laetud." - BUTTON_REQUEST_READ_RECEIPT: "Palu lugemise kohta kinnitust" - BUTTON_MARK_AS_IMPORTANT: "Tähista olulisena" - BUTTON_OPEN_PGP: "OpenPGP (Vaid lihttekstina)" - BUTTON_REQUEST_DSN: "Palu kättesaamise kohta kinnitust" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Sulge" - POPUPS_ASK: - BUTTON_YES: "Jah" - BUTTON_NO: "Ei" - DESC_WANT_CLOSE_THIS_WINDOW: "Kas oled kindel, et soovid akna sulgeda?" - DESC_WANT_DELETE_MESSAGES: "Kas oled kindel, et soovid sõnumi(d) kustutada?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Vali oma keel" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Lisan konto?" - BUTTON_ADD_ACCOUNT: "Lisa" - TITLE_UPDATE_ACCOUNT: "Muudan kontot?" - BUTTON_UPDATE_ACCOUNT: "Muuda" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Lisan identiteedi?" - TITLE_UPDATE_IDENTITY: "Muudan identiteeti?" - BUTTON_ADD_IDENTITY: "Lisa" - BUTTON_UPDATE_IDENTITY: "Muuda" - LABEL_EMAIL: "E-post" - LABEL_NAME: "Nimi" - LABEL_REPLY_TO: "Vastuse saaja " - LABEL_SIGNATURE: "Signatuur" - LABEL_CC: "Koopia" - LABEL_BCC: "Pimekoopia" - LABEL_SIGNATURE_INSERT_BEFORE: "Sisesta see signatuur kirjades enne tsiteeritud teksti" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Loon kausta?" - LABEL_NAME: "Kausta nimi" - LABEL_PARENT: "Ülemkaust" - BUTTON_CREATE: "Loo" - BUTTON_CANCEL: "Tühista" - BUTTON_CLOSE: "Sulge" - TITLE_CREATING_PROCESS: "Loon kausta" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Tühjendan kausta kirjadest?" - BUTTON_CLEAR: "Tühjenda" - BUTTON_CANCEL: "Tühista" - BUTTON_CLOSE: "Sulge" - DANGER_DESC_WARNING: "Tähelepanu!" - DANGER_DESC_HTML_1: "See tegevus kustutab täielikult kõik kirjad kaustast %FOLDER%." - DANGER_DESC_HTML_2: "Juba alustatud protsessi ei saa tühistada või katkestada." - TITLE_CLEARING_PROCESS: "Tühjendan kausta..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Impordi OpenPGP võti" - BUTTON_IMPORT_OPEN_PGP_KEY: "Impordi" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Vaata OpenPGP võtit" - BUTTON_SELECT: "Vali" - BUTTON_CLOSE: "Sulge" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Genereeri OpenPGP võtmed" - LABEL_EMAIL: "E-post" - LABEL_NAME: "Nimi" - LABEL_PASSWORD: "Salasõna" - LABEL_KEY_BIT_LENGTH: "Võtme pikkus" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Genereeri" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP allkirjastamine/krüpteerimine" - LABEL_SIGN: "Allkirjasta" - LABEL_ENCRYPT: "Krüpteeri" - LABEL_PASSWORD: "Salasõna" - BUTTON_SIGN: "Allkirjasta" - BUTTON_ENCRYPT: "Krüpteeri" - BUTTON_SIGN_AND_ENCRYPT: "Allkirjasta ja krüpteeri" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP dekrüpteerimine" - LABEL_KEY: "Privaatne võti " - LABEL_PASSWORD: "Salasõna" - BUTTON_DECRYPT: "Dekrüpteeri" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "2. faktori kontroll" - LABEL_CODE: "Kood" - BUTTON_TEST: "Kontrolli" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Filtri loomine" - TITLE_EDIT_FILTER: "Filtri muutmine" - FILTER_NAME: "Nimi" - LEGEND_CONDITIONS: "Tingimused" - LEGEND_ACTIONS: "Tegevused" - BUTTON_DONE: "Valmis" - BUTTON_ADD_CONDITION: "Lisa tingimus" - SELECT_ACTION_NONE: "Puudub" - SELECT_ACTION_MOVE_TO: "Liiguta kausta" - SELECT_ACTION_FORWARD_TO: "Edasta saajale" - SELECT_ACTION_REJECT: "Lükka tagasi" - SELECT_ACTION_VACATION_MESSAGE: "Puhkuse teade" - SELECT_ACTION_DISCARD: "Hülga" - SELECT_FIELD_FROM: "Saatja" - SELECT_FIELD_RECIPIENTS: "Saaja" - SELECT_FIELD_SUBJECT: "Pealkiri" - SELECT_FIELD_HEADER: "Päis" - SELECT_FIELD_SIZE: "Suurus" - SELECT_TYPE_CONTAINS: "Sisaldab" - SELECT_TYPE_NOT_CONTAINS: "Ei sisalda" - SELECT_TYPE_MATCHES: "On vaste päringule (* ja ? on toetatud)" - SELECT_TYPE_NOT_MATCHES: "Ei ole vaste päringule (* ja ? on toetatud)" - SELECT_TYPE_REGEXP: "Vastab regulaaravaldisele" - SELECT_TYPE_NOT_REGEXP: "Ei vasta regulaaravaldisele" - SELECT_TYPE_EQUAL_TO: "Võrdub" - SELECT_TYPE_NOT_EQUAL_TO: "Ei võrdu" - SELECT_TYPE_OVER: "Üle" - SELECT_TYPE_UNDER: "Alla" - SELECT_MATCH_ANY: "Vastab ÜHELE järgmistest reeglitest" - SELECT_MATCH_ALL: "Vastab KÕIGILE järgmistest reeglitest" - MARK_AS_READ_LABEL: "Märgi loetuks" - REPLY_INTERVAL_LABEL: "Vastuse intervall (päevades)" - KEEP_LABEL: "Salvesta" - STOP_LABEL: "Ära peata reeglite protsessimist" - EMAIL_LABEL: "E-post" - VACATION_SUBJECT_LABEL: "Pealkiri (valikuline)" - VACATION_MESSAGE_LABEL: "Sõnum" - VACATION_RECIPIENTS_LABEL: "Saajad (eraldatud komaga)" - REJECT_MESSAGE_LABEL: "Tagasilükkamise sõnum" - ALL_INCOMING_MESSAGES_DESC: "Kõik sisenevad kirjad" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Vali süsteemsed kaustad" - SELECT_CHOOSE_ONE: "Vali üks" - SELECT_UNUSE_NAME: "Ära kasuta" - LABEL_SENT: "Saadetud" - LABEL_DRAFTS: "Mustandid" - LABEL_SPAM: "Rämpspost" - LABEL_TRASH: "Prügikast" - LABEL_ARCHIVE: "Arhiiv" - BUTTON_CANCEL: "Tühista" - BUTTON_CLOSE: "Sulge" - NOTIFICATION_SENT: | - Sa pole valinud süsteemset kausta saadetud kirjadele. - Kui sa ei soovi saadetud kirju salvestada, vali "Ära kasuta". - NOTIFICATION_DRAFTS: "Sa pole valinud kausta, kuhu mustandid kirjutamise ajal salvestatakse." - NOTIFICATION_SPAM: | - Sa pole valinud süsteemset kausta rämpspostiks märgitud kirjadele. - Kui sa ei soovi rämpspostiks märgitud kirju salvestada, vali "Ära kasuta". - NOTIFICATION_TRASH: | - Sa pole valinud süsteemset kausta kustutatud kirjadele. - Kui sa ei soovi kustutatud kirju salvestada, vali "Ära kasuta". - NOTIFICATION_ARCHIVE: "Sa pole valinud kausta, kuhu arhiveeritud kirjad salvestatakse." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "2. faktoriga autentimine (TOTP)" - LABEL_ENABLE_TWO_FACTOR: "Luba 2. faktoriga autentimine" - LABEL_TWO_FACTOR_USER: "Kasutaja" - LABEL_TWO_FACTOR_STATUS: "Staatus" - LABEL_TWO_FACTOR_SECRET: "Kood" - LABEL_TWO_FACTOR_BACKUP_CODES: "Tagavarakoodid" - BUTTON_CREATE: "Loo kood" - BUTTON_ACTIVATE: "Aktiveeri" - BUTTON_CLEAR: "Puhasta" - BUTTON_LOGOUT: "Logi välja" - BUTTON_DONE: "Valmis" - BUTTON_TEST: "Test" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Näita koodi" - BUTTON_HIDE_SECRET: "Peida kood" - TWO_FACTOR_REQUIRE_DESC: "Sinu konto nõuab 2. faktoriga autentimist." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Seadistatud" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Seadistamata" - TWO_FACTOR_SECRET_DESC: > - Impordi see info oma Google Authenticator klienti (või mõnesse teise TOTP - klienti) kasutades juuresolevat QR koodi või käsitsi sisestades. - TWO_FACTOR_BACKUP_CODES_DESC: > - Kui sul ei õnnestu Google Authenticatori (või muu TOTP kliendi) abil siseneda, - võid kasutada sisenemiseks varukoode. Kui oled varukoodi korra kasutanud, - lõpetab see töö. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Seda sätet ei saa enne testimist muuta." - TITLES: - LOADING: "Laadin" - LOGIN: "Sisenemine" - MAILBOX: "Postkast" - SETTINGS: "Sätted" - COMPOSE: "Koosta uus kiri" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Fail on liiga suur" - ERROR_FILE_PARTIALLY_UPLOADED: "Tundmatu vea tõttu laaditi fail üles osaliselt" - ERROR_NO_FILE_UPLOADED: "Faili pole üles laetud" - ERROR_MISSING_TEMP_FOLDER: "Ajutine fail puudub" - ERROR_ON_SAVING_FILE: "Faili üleslaadimisel tekkis tundmatu iseloomuga viga" - ERROR_FILE_TYPE: "Puudulik faili tüüp" - ERROR_UNKNOWN: "Faili üleslaadimisel tekkis tundmatu iseloomuga viga" - EDITOR: - TEXT_SWITCHER_RICH_FORMATTING: "Rikastekst" - TEXT_SWITCHER_CONFIRM: "Teksti vorming ja sellesse sisestatud pildid lähevad kaduma. Kas oled kindel, et soovid jätkata?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Isiklik" - LABEL_GENERAL_NAME: "Üldine" - LABEL_CONTACTS_NAME: "Kontaktid" - LABEL_FOLDERS_NAME: "Kaustad" - LABEL_ACCOUNTS_NAME: "Kontod" - LABEL_IDENTITY_NAME: "Identiteet" - LABEL_IDENTITIES_NAME: "Identiteedid" - LABEL_FILTERS_NAME: "Filtrid" - LABEL_TEMPLATES_NAME: "Põhjad" - LABEL_SECURITY_NAME: "Turvalisus" - LABEL_SOCIAL_NAME: "Sotsiaalne" - LABEL_THEMES_NAME: "Teemad" - LABEL_CHANGE_PASSWORD_NAME: "Salasõna" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Tagasi" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filtrid" - BUTTON_SAVE: "Salvesta" - BUTTON_ADD_FILTER: "Lisa filter" - BUTTON_DELETE: "Kustuta" - BUTTON_RAW_SCRIPT: "Kasuta oma skripti" - SUBNAME_NONE: "Puuduvad" - SUBNAME_MOVE_TO: "Liiguta kausta \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Edasta aadressile \"%EMAIL%\"" - SUBNAME_REJECT: "Lükka tagasi" - SUBNAME_VACATION_MESSAGE: "Puhkuse teade" - SUBNAME_DISCARD: "Hülga" - CAPABILITY_LABEL: "Võimekus" - LOADING_PROCESS: "Värskendan filtrite nimekirja" - DELETING_ASK: "Kas oled kindel?" - CHACHES_NEED_TO_BE_SAVED_DESC: "Need muudatused tuleb salvestada serverisse." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identiteet" - LABEL_DISPLAY_NAME: "Nimi" - LABEL_REPLY_TO: "Vastuse saaja" - LABEL_SIGNATURE: "Signatuur" - LABEL_ADD_SIGNATURE_TO_ALL: "Lisa oma signatuur kõikidele väljuvatele kirjadele" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Turvalisus" - LABEL_CONFIGURE_TWO_FACTOR: "Seadista 2. faktoriga autentimine" - LABEL_AUTOLOGOUT: "Automaatne välja logimine" - AUTOLOGIN_NEVER_OPTION_NAME: "Mitte kunagi" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minutit" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% tund(i)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Üldine" - LABEL_LANGUAGE: "Keel" - LABEL_IDENTITY: "Identiteet" - LABEL_LAYOUT: "Vaade" - LABEL_LAYOUT_NO_SPLIT: "Jaotuseta" - LABEL_LAYOUT_VERTICAL_SPLIT: "Vertikaalse jaotusega" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horisontaalse jaotusega" - LABEL_EDITOR: "Vaikimisi tekstiredaktor" - LABEL_EDITOR_HTML: "HTML" - LABEL_EDITOR_PLAIN: "Lihttekst" - LABEL_EDITOR_HTML_FORCED: "HTML (kohustuslik)" - LABEL_EDITOR_PLAIN_FORCED: "Lihttekst (kohustuslik)" - LABEL_ANIMATION: "Kasutajaliidese animatsioonid" - LABEL_ANIMATION_FULL: "Kõik" - LABEL_ANIMATION_NORMAL: "Normaalne" - LABEL_ANIMATION_NONE: "Puuduvad" - LABEL_VIEW_OPTIONS: "Vaate seaded" - LABEL_USE_PREVIEW_PANE: "Kasuta eelvaadet" - LABEL_USE_CHECKBOXES_IN_LIST: "Kuva nimekirjas valikukastikesi" - LABEL_USE_THREADS: "Kasuta vestluse lõimesid" - LABEL_REPLY_SAME_FOLDER: "Pane vastused samasse kausta, kus asub vastatud kiri" - LABEL_SHOW_IMAGES: "Näita alati kirja sisus viidatud väliseid pilte" - LABEL_SHOW_ANIMATION: "Näita anomatsioone" - LABEL_MESSAGE_PER_PAGE: "Lehel kuvatavate kirjade arv" - LABEL_NOTIFICATIONS: "Teavitused" - LABEL_SOUND_NOTIFICATION: "Teavitused heliga" - LABEL_CHROME_NOTIFICATION_DESC: "Näita uute kirjade teavitust hüpikaknaga" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Veebilehitseja poolt blokeeritud)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Kontaktid" - LABEL_CONTACTS_AUTOSAVE: "Lisa saajad automaatselt aadressiraamatusse" - LEGEND_CONTACTS_SYNC: "Väline sünkroniseerimine (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Luba väline sünkroniseerimine" - LABEL_CONTACTS_SYNC_SERVER: "Server" - LABEL_CONTACTS_SYNC_AB_URL: "Aadressiraamatu URL" - LABEL_CONTACTS_SYNC_USER: "Kasutaja" - LABEL_CONTACTS_SYNC_PASSWORD: "Salasõna" - SETTINGS_THEMES: - LEGEND_THEMES: "Teemad" - LEGEND_THEMES_CUSTOM: "Teema kohandamine" - LABEL_CUSTOM_TYPE: "Tüüp" - LABEL_CUSTOM_TYPE_LIGHT: "Hele" - LABEL_CUSTOM_TYPE_DARK: "Tume" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Taust" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Laadi üles taustapilt (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "Fail on liiga suur" - ERROR_FILE_TYPE_ERROR: "Faili tüüp ei sobi (lubatud on ainult JPG ja PNG)" - ERROR_UNKNOWN: "Leidis aset tundmatu faili üleslaadimise viga" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Ühenda Google" - BUTTON_GOOGLE_DISCONNECT: "Ühenda Google lahti" - MAIN_GOOGLE_DESC: "Peale Google abil sisselogimise võimaldamist, saad sellele kontole siseneda klikkides Google nupule sisselogimise lehel" - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Ühenda Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Ühenda Facebook lahti" - MAIN_FACEBOOK_DESC: "Peale Facebooki abil sisselogimise võimaldamist, saad sellele kontole siseneda klikkides Facebook nupule sisselogimise lehel" - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Ühenda Twitter" - BUTTON_TWITTER_DISCONNECT: "Ühenda Twitter lahti" - MAIN_TWITTER_DESC: "Peale Twitteri abil sisselogimise võimaldamist, saad sellele kontole siseneda klikkides Twitter nupule sisselogimise lehel" - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Kaustade nimekiri" - BUTTON_CREATE: "Loo kaust" - BUTTON_DELETE: "Kustuta" - BUTTON_SUBSCRIBE: "Telli" - BUTTON_UNSUBSCRIBE: "Loobu tellimusest" - LOADING_PROCESS: "Värskendan kaustada nimekirja" - CREATING_PROCESS: "Loon kasuta" - DELETING_PROCESS: "Kustutan kausta" - RENAMING_PROCESS: "Nimetan kausta ümber" - DELETING_ASK: "Oled kindel?" - TO_MANY_FOLDERS_DESC_1: "Sul on liiga palju kaustu!" - TO_MANY_FOLDERS_DESC_2: "Näitame sulle neist vaid osa, et vältida jõudlusprobleeme." - HELP_DELETE_FOLDER: "Kustuta kaust" - HELP_SHOW_HIDE_FOLDER: "Näita/peida kaust" - HELP_CHECK_FOR_NEW_MESSAGES: "Kontrolli/ära kontrolli uusi kirju" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Kontod" - LEGEND_IDENTITIES: "Identiteedid" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Kontod ja identiteedid" - BUTTON_ADD_ACCOUNT: "Lisa konto" - BUTTON_ADD_IDENTITY: "Lisa identiteet" - BUTTON_DELETE: "Kustuta" - LOADING_PROCESS: "Värskendan..." - DELETING_ASK: "Kas oled kindel?" - DEFAULT_IDENTITY_LABEL: "vaikimisi" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identiteet" - LEGEND_IDENTITIES: "Täiendavad identiteedid" - LABEL_DEFAULT: "Vaikimisi" - LABEL_DISPLAY_NAME: "Nimi" - LABEL_REPLY_TO: "Vastuse saaja " - LABEL_SIGNATURE: "Signatuur" - LABEL_ADD_SIGNATURE_TO_ALL: "Lisa oma signatuur väljuvatele kirjadele" - BUTTON_ADD_IDENTITY: "Lisa identiteet" - BUTTON_DELETE: "Kustuta" - LOADING_PROCESS: "Värskendan identiteetide nimekirja" - DELETING_ASK: "Kas oled kindel?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Muuda salasõna" - LABEL_CURRENT_PASSWORD: "Kehtiv salasõna" - LABEL_NEW_PASSWORD: "Uus salasõna" - LABEL_REPEAT_PASSWORD: "Kinnita uus salasõna" - BUTTON_UPDATE_PASSWORD: "Määra uus salasõna" - ERROR_PASSWORD_MISMATCH: "Salasõnad ei kattu, palun proovi uuesti" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Impordi OpenPGP võti" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Genereeri OpenPGP võti" - TITLE_PRIVATE: "Privaatne" - TITLE_PUBLIC: "Avalik" - DELETING_ASK: "Oled kindel?" - GENERATE_ONLY_HTTPS: "Ainult HTTPS" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Klaviatuuri kombinatsioonide abi" - TAB_MAILBOX: "Postkast" - TAB_MESSAGE_LIST: "Kirjade nimekiri" - TAB_MESSAGE_VIEW: "Kirja vaade" - TAB_COMPOSE: "Kirja koostamine" - LABEL_OPEN_USER_DROPDOWN: "Ava kasutaja sätted" - LABEL_REPLY: "Vasta" - LABEL_REPLY_ALL: "Vasta kõigile" - LABEL_FORWARD: "Edasta" - LABEL_FORWARD_MULTIPLY: "Edasta manusena" - LABEL_HELP: "Abi" - LABEL_CHECK_ALL: "Vali kõik kirjad" - LABEL_ARCHIVE: "Arhiveeri" - LABEL_DELETE: "Kustuta" - LABEL_OPEN_THREAD: "Ava valitud lõim" - LABEL_MOVE: "Liiguta" - LABEL_READ: "Märgi valitud kiri loetuks" - LABEL_UNREAD: "Märgi valitud kiri kui lugemata" - LABEL_IMPORTANT: "Märgi kiri lipuga" - LABEL_SEARCH: "Otsi" - LABEL_CANCEL_SEARCH: "Tühista otsing" - LABEL_FULLSCREEN_ENTER: "Täisekraan (eelvaatega)" - LABEL_VIEW_MESSAGE_ENTER: "Näita kirja (ilma eelvaateta)" - LABEL_SWITCH_TO_MESSAGE: "Vii fookus valitud kirjale" - LABEL_SWITCH_TO_FOLDER_LIST: "Vii fookus kirjade nimekirjale" - LABEL_FULLSCREEN_TOGGLE: "Täisekraani vaate lülitamine" - LABEL_BLOCKQUOTES_TOGGLE: "Tsitaatide lülitamine" - LABEL_THREAD_NEXT: "Järgmine kiri lõimes" - LABEL_THREAD_PREV: "Eelmine kiri lõimes" - LABEL_PRINT: "Prindi" - LABEL_EXIT_FULLSCREEN: "Välju täisekraani vaatest" - LABEL_CLOSE_MESSAGE: "Sulge kiri (ilma eelvaateta)" - LABEL_SWITCH_TO_LIST: "Vii fookus tagasi kirjade nimekirjale" - LABEL_OPEN_COMPOSE_POPUP: "Ava uue kirja hüpikaken" - LABEL_MINIMIZE_COMPOSE_POPUP: "Tee uue kirja aken väikseks" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Ava identiteetide valik" - LABEL_SAVE_MESSAGE: "Salvesta kiri" - LABEL_SEND_MESSAGE: "Saada kiri" - LABEL_CLOSE_COMPOSE: "Sulge kirja koostamise aken" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "Avalikke võtmeid ei leitud" - NO_PUBLIC_KEYS_FOUND_FOR: "Avalikke võtmeid aadressile \"%EMAIL%\" ei leitud" - NO_PRIVATE_KEY_FOUND: "Salajasi võtmeid ei leitud" - NO_PRIVATE_KEY_FOUND_FOR: "Salajast võtit aadressile \"%EMAIL%\" ei leitud" - ADD_A_PUBLICK_KEY: "Lisa avalik võti" - SELECT_A_PRIVATE_KEY: "Lisa privaatne võti" - UNVERIFIRED_SIGNATURE: "Verifitseerimata allkiri" - DECRYPTION_ERROR: "OpenPGP dekrüpteerimise viga" - GOOD_SIGNATURE: "Korralik signatuur kasutajalt %USER%" - PGP_ERROR: "OpenPGP viga: %ERROR%" - SPECIFY_FROM_EMAIL: "Palun määra KELLELT e-posti aadress" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Palun määra vähemalt üks saaja" - NOTIFICATIONS: - INVALID_TOKEN: "Puudulik tõend" - AUTH_ERROR: "Autentimine ebaõnnestus" - ACCESS_ERROR: "Ligipääsu viga" - CONNECTION_ERROR: "Serveriga ühendumine ebaõnnestus" - CAPTCHA_ERROR: "Puudulik CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - See sotsiaalvõrgustiku kasutaja ei ole seotud ühegi e-posti kontoga. Sisene - esmalt e-posti konto andmetega ja seo sotsiaalvõrgustiku konto sellega konto - sätete all. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - See sotsiaalvõrgustiku kasutaja ei ole seotud ühegi e-posti kontoga. Sisene - esmalt e-posti konto andmetega ja seo sotsiaalvõrgustiku konto sellega konto - sätete all. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - See sotsiaalvõrgustiku kasutaja ei ole seotud ühegi e-posti kontoga. Sisene - esmalt e-posti konto andmetega ja seo sotsiaalvõrgustiku konto sellega konto - sätete all. - DOMAIN_NOT_ALLOWED: "Domeenil ei ole lubatud siseneda" - ACCOUNT_NOT_ALLOWED: "Kasutajakontol ei ole lubatud siseneda" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Kahe faktoriga autentimine on kohustuslik" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Kahe faktoriga autentimise viga" - COULD_NOT_SAVE_NEW_PASSWORD: "Uut salasõna ei suudetud salvestada" - CURRENT_PASSWORD_INCORRECT: "Sisestatud kehtiv salasõna oli vale" - NEW_PASSWORD_SHORT: "Salasõna on liiga lühikene" - NEW_PASSWORD_WEAK: "Salasõna on liiga lihtne" - NEW_PASSWORD_FORBIDDENT: "Salasõna sisaldab keelatud märke" - CONTACTS_SYNC_ERROR: "Kontaktide sünkroniseerimise viga" - CANT_GET_MESSAGE_LIST: "Kirjade nimekirja laadimine ebaõnnestus" - CANT_GET_MESSAGE: "Kirja laadimine ebaõnnestus" - CANT_DELETE_MESSAGE: "Kirja kustutamine ebaõnnestus" - CANT_MOVE_MESSAGE: "Kirja liigutamine ebaõnnestus" - CANT_SAVE_MESSAGE: "Kirja salvestamine ebaõnnestus" - CANT_SEND_MESSAGE: "Kirja saatmine ebaõnnestus" - INVALID_RECIPIENTS: "Puudulikud saajad" - CANT_SAVE_FILTERS: "Filtri salvestamine ebaõnnestus" - CANT_GET_FILTERS: "Filtrite laadimine ebaõnnestus" - FILTERS_ARE_NOT_CORRECT: "Filtrid on puudulikud" - CANT_CREATE_FOLDER: "Kausta loomine ebaõnnestus" - CANT_RENAME_FOLDER: "Kausta ümbernimetamine ebaõnnestus" - CANT_DELETE_FOLDER: "Kausta kustutamine ebaõnnestus" - CANT_DELETE_NON_EMPTY_FOLDER: "Kirju sisaldavat kausta pole võimalik kustutada" - CANT_SUBSCRIBE_FOLDER: "Kausta tellimine ebaõnnestus." - CANT_UNSUBSCRIBE_FOLDER: "Kausta tellimisest loobumine ebaõnnestus." - CANT_SAVE_SETTINGS: "Sätete salvestamine ebaõnnestus" - CANT_SAVE_PLUGIN_SETTINGS: "Sätete salvestamine ebaõnnestus" - DOMAIN_ALREADY_EXISTS: "Domeen juba eksisteerib" - CANT_INSTALL_PACKAGE: "Laienduse paigaldamine ebaõnnestus" - CANT_DELETE_PACKAGE: "Laienduse eemaldamine ebaõnnestus" - INVALID_PLUGIN_PACKAGE: "Puudulik laienduse pakk" - UNSUPPORTED_PLUGIN_PACKAGE: "Laienduse pakk pole toetatud" - LICENSING_SERVER_IS_UNAVAILABLE: "Litsentsiserver ei olnud saadaval" - LICENSING_DOMAIN_EXPIRED: "Selle domeeni litents on aegunud" - LICENSING_DOMAIN_BANNED: "Selle domeeni litents on kehtetu" - DEMO_SEND_MESSAGE_ERROR: "Turvalisusega seotud põhjustel ei ole sellel kontol lubatud saata kirju välistele aadressidele!" - DEMO_ACCOUNT_ERROR: "Turvalisusega seotud põhjustel ei ole sellel kontol lubatud soovitud toimingut teostada!" - ACCOUNT_ALREADY_EXISTS: "Konto juba eksisteerib" - ACCOUNT_DOES_NOT_EXIST: "Kontot veel ei eksisteeri" - MAIL_SERVER_ERROR: "E-posti serveri poole pöördumisel tekkis viga" - INVALID_INPUT_ARGUMENT: "Puudulik sisendi arument" - UNKNOWN_ERROR: "Tundmatu viga" - STATIC: - BACK_LINK: "Taaslae" - DOMAIN_LIST_DESC: "Nimekiri domeenidest, mille poole veebipõhisel e-posti kliendil on lubatud pöörduda" - PHP_EXSTENSIONS_ERROR_DESC: "Sinu PHP konfiguratsioon ei sisalda nõutud PHP laiendusi." - PHP_VERSION_ERROR_DESC: "Sinu PHP versioon (%VERSION%) on väiksem, kui minimaalselt nõutud 5.3.0!" - NO_SCRIPT_TITLE: "See rakendus vajab tööks JavaScripti" - NO_SCRIPT_DESC: | - Sinu veebilehitseja ei toeta JavaScripti. - Luba selle kasutus veebilehitseja sätetes ja proovi uuesti. - NO_COOKIE_TITLE: "See rakendus vajab oma tööks veebiküpsiste tuge" - NO_COOKIE_DESC: | - Sinu veebilehitseja ei toeta veebiküpsiseid. - Luba nende kasutus veebilehitseja sätetes ja proovi uuesti. - BAD_BROWSER_TITLE: "Sinu veebilehitseja on aegunud" - BAD_BROWSER_DESC: | - Rakenduse kõikide võimaluste kasutamiseks, - lae alla ja paigalda mõni nendest veebilehitsejatest: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fa_IR.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fa_IR.yml deleted file mode 100755 index 76c95e25..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fa_IR.yml +++ /dev/null @@ -1,713 +0,0 @@ -fa_IR: - LOGIN: - LABEL_EMAIL: "پست الکترونیک" - LABEL_LOGIN: "ورود" - LABEL_PASSWORD: "گذرواژه" - LABEL_SIGN_ME: "مرا به خاطر بسپار" - LABEL_VERIFICATION_CODE: "کد تایید" - LABEL_DONT_ASK_VERIFICATION_CODE: "کد را برای 2 هفته سوال نکن" - BUTTON_SIGN_IN: "ورود" - TITLE_SIGN_IN_GOOGLE: "ورود با گوگل" - TITLE_SIGN_IN_FACEBOOK: "ورود با فیس‌بوک" - TITLE_SIGN_IN_TWITTER: "ورود با توییتر" - LABEL_FORGOT_PASSWORD: "فراموشی گذرواژه" - LABEL_REGISTRATION: "ثبت‌نام" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "ساخت کاربر" - BUTTON_SETTINGS: "تنظیمات" - BUTTON_HELP: "راهنما" - BUTTON_LOGOUT: "خروج" - MOBILE: - BUTTON_MOBILE_VERSION: "نسخه موبایل" - BUTTON_DESKTOP_VERSION: "نسخه رومیزی" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "جستجو" - TITLE_ADV: "جستجوی پیشرفته" - LABEL_ADV_FROM: "از" - LABEL_ADV_TO: "به" - LABEL_ADV_SUBJECT: "موضوع" - LABEL_ADV_TEXT: "متن" - LABEL_ADV_HAS_ATTACHMENT: "داشتن پیوست" - LABEL_ADV_HAS_ATTACHMENTS: "داشتن پیوست‌ها" - LABEL_ADV_FLAGGED: "پرچم" - LABEL_ADV_UNSEEN: "خوانده نشده" - LABEL_ADV_DATE: "تاریخ" - LABEL_ADV_DATE_ALL: "همه" - LABEL_ADV_DATE_3_DAYS: "تا 3 روز گذشته" - LABEL_ADV_DATE_7_DAYS: "تا 1 هفته گذشته" - LABEL_ADV_DATE_MONTH: "تا 1 ماه گذشته" - LABEL_ADV_DATE_3_MONTHS: "تا 3 ماه گذشته" - LABEL_ADV_DATE_6_MONTHS: "تا 6 ماه گذشته" - LABEL_ADV_DATE_YEAR: "تا 1 سال گذشته" - BUTTON_ADV_SEARCH: "جستجو" - PREVIEW_POPUP: - FULLSCREEN: "ضامن تمام صفحه" - ZOOM: "بزرگنمایی داخل/بیرون" - CLOSE: "بستن (Esc)" - LOADING: "در حال بارگذاری" - GALLERY_PREV: "قبلی (جهت چپ)" - GALLERY_NEXT: "بعدی (جهت راست)" - GALLERY_COUNTER: "%curr% از %total%" - IMAGE_ERROR: "تصویر مورد نظر قابل بارگذاری نیست." - AJAX_ERROR: "محتویات مورد نظر قابل بارگذاری نیست." - FOLDER_LIST: - BUTTON_COMPOSE: "ایجاد" - BUTTON_CONTACTS: "تماس‌ها" - BUTTON_NEW_MESSAGE: "پیام جدید" - INBOX_NAME: "صندوق ورودی" - SENT_NAME: "ارسالی‌" - DRAFTS_NAME: "پیش نویس" - SPAM_NAME: "هرزنامه" - TRASH_NAME: "سطل آشغال" - ARCHIVE_NAME: "بایگانی" - QUOTA: - TITLE: "سهمیه استفاده شده" - MESSAGE_LIST: - BUTTON_RELOAD: "بازنگری لیست پیام‌ها" - BUTTON_MOVE_TO: "انتقال به" - BUTTON_DELETE: "حذف" - BUTTON_ARCHIVE: "بایگانی" - BUTTON_SPAM: "هرزنامه" - BUTTON_NOT_SPAM: "هرزنامه نیست" - BUTTON_EMPTY_FOLDER: "پاک کردن شاخه" - BUTTON_MULTY_FORWARD: "ارسال بهمراه پیوست(ها)" - BUTTON_DELETE_WITHOUT_MOVE: "حذف همیشگی" - BUTTON_MORE: "بیشتر" - MENU_SET_SEEN: "علامت‌گذاری به عنوان خوانده شده" - MENU_SET_ALL_SEEN: "علامت‌گذاری همه بعنوان خوانده شده" - MENU_UNSET_SEEN: "علامت‌گذاری به عنوان خوانده نشده" - MENU_SET_FLAG: "پرچم زدن" - MENU_UNSET_FLAG: "حذف پرچم" - MENU_SELECT_ALL: "همه" - MENU_SELECT_NONE: "هیچ‌کدام" - MENU_SELECT_INVERT: "برعکس" - MENU_SELECT_UNSEEN: "نخوانده" - MENU_SELECT_SEEN: "خوانده" - MENU_SELECT_FLAGGED: "پرچم‌دار کردن" - MENU_SELECT_UNFLAGGED: "پرچم‌دار نشده" - EMPTY_LIST: "فهرست خالی" - EMPTY_SEARCH_LIST: "پیامی مطابق جستجوی شما پیدا نشد" - SEARCH_RESULT_FOR: "نتایج جستجو مطابق \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "برگشت به لیست پیام‌ها" - LIST_LOADING: "در حال بارگذاری" - EMPTY_SUBJECT_TEXT: "(بدون موضوع)" - PUT_MESSAGE_HERE: "برای دیدن پیام در این لیست آن را به اینجا بکشید" - TODAY_AT: "امروز در %TIME%" - YESTERDAY_AT: " دیروز در %TIME%" - SEARCH_PLACEHOLDER: "جستجو" - NEW_MESSAGE_NOTIFICATION: "شما تعداد %COUNT% پیام جدید دارید!" - QUOTA_SIZE: "استفاده %SIZE% (%PROC%%) از%LIMIT% برای شما" - MESSAGE: - BUTTON_EDIT: "ویرایش" - BUTTON_BACK: "برگشتن" - BUTTON_CLOSE: "بستن" - BUTTON_DELETE: "حذف" - BUTTON_UNSUBSCRIBE: "خروج از این لیست" - BUTTON_ARCHIVE: "بایگانی" - BUTTON_SPAM: "هرزنامه" - BUTTON_NOT_SPAM: "عدم هرزنامه" - BUTTON_MOVE_TO: "انتقال به" - BUTTON_MORE: "انتقال" - BUTTON_REPLY: "پاسخ" - BUTTON_REPLY_ALL: "پاسخ به همه" - BUTTON_FORWARD: "ارسال به دیگران" - BUTTON_FORWARD_AS_ATTACHMENT: "ارسال بهمراه پیوست" - BUTTON_EDIT_AS_NEW: "ویرایش بعنوان جدید" - BUTTON_SHOW_IMAGES: "نمایش تصاویر خارجی" - BUTTON_NOTIFY_READ_RECEIPT: "فرستنده از خواندن نامه توسط شما مطلع خواهد شد" - BUTTON_IN_NEW_WINDOW: "مشاهده در پنجره جداگانه" - BUTTON_THREAD_LIST: "لیست نخ‌ها" - BUTTON_THREAD_PREV: "قبلی" - BUTTON_THREAD_NEXT: "بعدی" - BUTTON_THREAD_MORE: "پیام‌های بیشتر" - MENU_HEADERS: "نمایش سرصفحه پیام" - MENU_VIEW_ORIGINAL: "نمایش منبع" - MENU_DOWNLOAD_ORIGINAL: "دریافت با پسوند eml." - MENU_FILTER_SIMILAR: " فیلتر کردن پیام‌های مشابه" - MENU_PRINT: "چاپ" - EMPTY_SUBJECT_TEXT: "(بدون موضوع)" - LABEL_SUBJECT: "موضوع" - LABEL_DATE: "تاریخ" - LABEL_FROM: "از" - LABEL_FROM_SHORT: "از" - LABEL_TO: "به" - LABEL_TO_SHORT: "به" - LABEL_CC: "رونوشت" - LABEL_BCC: "رونوشت پنهان" - LABEL_REPLY_TO: "پاسخ به" - PRINT_LABEL_FROM: "از" - PRINT_LABEL_TO: "به" - PRINT_LABEL_CC: "رونوشت" - PRINT_LABEL_BCC: "رونوشت پنهان" - PRINT_LABEL_REPLY_TO: "پاسخ به" - PRINT_LABEL_DATE: "تاریخ" - PRINT_LABEL_SUBJECT: "موضوع" - PRINT_LABEL_ATTACHMENTS: "پیوست‌ها" - MESSAGE_LOADING: "در حال بارگذاری" - MESSAGE_VIEW_DESC: "پیام را در لیست جهت مشاهده انتخاب کنید" - PGP_PASSWORD_INPUT_PLACEHOLDER: "گذرواژه" - PGP_SIGNED_MESSAGE_DESC: "پیام توسط OpenPGP امضاء شد (برای بررسی کلیک کنید)" - PGP_ENCRYPTED_MESSAGE_DESC: "پیام توسط OpenPGP رمزنگاری شد (برای خارج شدن از حالت رمز کلیک کنید)" - LINK_DOWNLOAD_AS_ZIP: "دریافت با پسوند zip" - LINK_SAVE_TO_OWNCLOUD: "ذخیره در OwnCloud" - LINK_SAVE_TO_DROPBOX: "ذخیره در Dropbox" - READ_RECEIPT: - SUBJECT: "برگرداندن گیرنده (نمایش داده شد) - %SUBJECT%" - BODY: | - این پیام برگشت برای نامه‌ای است که شما برای %READ-RECEIPT% ارسال کرده‌اید. - - نکته: این پیام تنها اطلاع‌رسانی در مورد این هست که پیام شما بر روی کامپیوتر گیرنده نمایش داده شده است. - هیچ تضمینی بابت اینکه گیرنده این پیام را خوانده باشد یا درست متوجه شده باشد وجود ندارد. - SUGGESTIONS: - SEARCHING_DESC: "در حال جستجو..." - CONTACTS: - LEGEND_CONTACTS: "تماس‌ها" - SEARCH_INPUT_PLACEHOLDER: "جستجو" - BUTTON_ADD_CONTACT: "اضافه‌کردن تماس" - BUTTON_CREATE_CONTACT: "ایجاد" - BUTTON_UPDATE_CONTACT: "بروزرسانی" - BUTTON_IMPORT: "وارد کردن(csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "صدور (csv, vcf, vCard)" - BUTTON_EXPORT_CSV: "صدور (csv)" - ERROR_IMPORT_FILE: "خطا در وارد کردن (فرمت فایل معتبر نیست)" - LIST_LOADING: "در حال بارگذاری" - EMPTY_LIST: "هیچ تماسی وجود ندارد" - EMPTY_SEARCH: "هیچ تماسی پیدا نشد" - CLEAR_SEARCH: "پاک‌کردن جستجو" - CONTACT_VIEW_DESC: "تماس مورد نظر در لیست را جهت مشاهده، انتخاب کنید." - LABEL_DISPLAY_NAME: "نمایش نام" - LABEL_EMAIL: "آدرس پست الکترونیک" - LABEL_PHONE: "تلفن" - LABEL_WEB: "تارنما" - LABEL_BIRTHDAY: "تاریخ تولد" - LINK_ADD_EMAIL: "اضافه کردن آدرس پست الکترونیک" - LINK_ADD_PHONE: "اضافه کردن تلفن" - LINK_BIRTHDAY: "تاریخ تولد" - PLACEHOLDER_ENTER_DISPLAY_NAME: "ورود نام" - PLACEHOLDER_ENTER_LAST_NAME: "ورود نام خانوادگی" - PLACEHOLDER_ENTER_FIRST_NAME: "ورود نام" - PLACEHOLDER_ENTER_NICK_NAME: "ورود نام مستعار" - LABEL_READ_ONLY: "فقط خواندنی" - LABEL_SHARE: "اشتراک‌گذاری" - ADD_MENU_LABEL: "اضافه‌کردن" - ADD_MENU_NICKNAME: "نام مستعار" - ADD_MENU_NOTES: "یادداشت‌ها" - ADD_MENU_EMAIL: "آدرس پست الکترونیک" - ADD_MENU_PHONE: "تلفن" - ADD_MENU_URL: "تارنما" - ADD_MENU_ADDRESS: "آدرس" - ADD_MENU_BIRTHDAY: "تاریخ تولد" - ADD_MENU_TAGS: "برچسب" - BUTTON_SHARE_NONE: "هیچ‌کدام" - BUTTON_SHARE_ALL: "هرکسی" - BUTTON_SYNC: "همگام‌سازی (CardDAV)" - COMPOSE: - TITLE_FROM: "از" - TITLE_TO: "به" - TITLE_CC: "رونوشت" - TITLE_BCC: "رونوشت پنهان" - TITLE_REPLY_TO: "پاسخ به" - TITLE_SUBJECT: "موضوع" - LINK_SHOW_INPUTS: "نمایش همه فیلدها" - BUTTON_SEND: "فرستادن" - BUTTON_SAVE: "ذخیره کن" - BUTTON_DELETE: "حذف" - BUTTON_CANCEL: "انصراف" - BUTTON_MINIMIZE: "کوچک‌کردن" - SAVED_TIME: "ذخیره شده در %TIME%" - SAVED_ERROR_ON_SEND: "پیام فرستاده شد اما در شاخه ارسالی‌ها ذخیره نشد" - DISCARD_UNSAVED_DATA: "اطلاعات ذخیره نشده از بین برود؟" - ATTACH_FILES: "پیوست کردن فایلها" - ATTACH_DROP_FILES_DESC: "فایل‌ها را اینجا بیاندازید" - ATTACH_ITEM_CANCEL: "انصراف" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "گوگل درایو" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% نوشت" - FORWARD_MESSAGE_TOP_TITLE: "-------- پیام ارسال شده -------" - FORWARD_MESSAGE_TOP_FROM: "از" - FORWARD_MESSAGE_TOP_TO: "به" - FORWARD_MESSAGE_TOP_CC: "رونوشت" - FORWARD_MESSAGE_TOP_SENT: "ارسال" - FORWARD_MESSAGE_TOP_SUBJECT: "موضوع" - EMPTY_TO_ERROR_DESC: "لطفا حداقل یک گیرنده را مشخص نمایید" - NO_ATTACHMENTS_HERE_DESC: "هیچ پیوستی اینجا وجود ندارد." - ATTACHMENTS_ERROR_DESC: "اخطار! همه پیوست‌ها هنوز بارگذاری نشده است." - ATTACHMENTS_UPLOAD_ERROR_DESC: "همه پیوست‌ها هنوز بارگذاری نشده است." - BUTTON_REQUEST_READ_RECEIPT: "درخواست دریافت رسید خواندن" - BUTTON_MARK_AS_IMPORTANT: "علامت زدن به عنوان مهم" - BUTTON_OPEN_PGP: "OpenPGP (فقط متن ساده)" - BUTTON_REQUEST_DSN: "درخواست دریافت رسید تحویل درمقصد" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "بستن" - POPUPS_ASK: - BUTTON_YES: "بلی" - BUTTON_NO: "خیر" - DESC_WANT_CLOSE_THIS_WINDOW: "آیا از بستن این پنجره مطمئن هستید؟" - DESC_WANT_DELETE_MESSAGES: "آیا از حذف این پیام(ها) اطمینان دارید؟" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "زبان خود را انتخاب کنید" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "اضافه کردن کاربر؟" - BUTTON_ADD_ACCOUNT: "اضافه کردن" - TITLE_UPDATE_ACCOUNT: "بروزرسانی کاربر؟" - BUTTON_UPDATE_ACCOUNT: "بروزرسانی" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "اضافه کردن هویت؟" - TITLE_UPDATE_IDENTITY: "بروزرسانی هویت؟" - BUTTON_ADD_IDENTITY: "اضافه‌کردن" - BUTTON_UPDATE_IDENTITY: "بروزرسانی" - LABEL_EMAIL: "پست الکترونیک" - LABEL_NAME: "نام" - LABEL_REPLY_TO: "پاسخ به" - LABEL_SIGNATURE: "امضاء" - LABEL_CC: "رونوشت" - LABEL_BCC: "رونوشت پنهان" - LABEL_SIGNATURE_INSERT_BEFORE: "قراردادن امضاء‌ قبل از متن مشخص شده در جواب" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "یک شاخه ایجاد شود؟" - LABEL_NAME: "نام شاخه" - LABEL_PARENT: "شاخه بالایی" - BUTTON_CREATE: "ایجاد" - BUTTON_CANCEL: "انصراف" - BUTTON_CLOSE: "بستن" - TITLE_CREATING_PROCESS: "ایجاد کردن یک شاخه" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "خالی‌کردن همه پیام‌ها از این شاخه؟" - BUTTON_CLEAR: "پاک کردن" - BUTTON_CANCEL: "انصراف" - BUTTON_CLOSE: "بستن" - DANGER_DESC_WARNING: "اخطار!" - DANGER_DESC_HTML_1: "نتیجه این عمل پاک شدن همه نامه‌ها از شاخه %FOLDER% بطور کامل خواهد بود." - DANGER_DESC_HTML_2: "زمانی که این عملیات شروع شود قابل لغو یا انصراف نیست." - TITLE_CLEARING_PROCESS: "خالی کردن شاخه..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "واردکردن کلید OpenPGP" - BUTTON_IMPORT_OPEN_PGP_KEY: "وارد‌کردن" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "مشاهده کلید OpenGPG" - BUTTON_SELECT: "انتخاب" - BUTTON_CLOSE: "بستن" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "تولید کلید‌های OpenPGP" - LABEL_EMAIL: "پست الکترونیک" - LABEL_NAME: "نام" - LABEL_PASSWORD: "گذرواژه" - LABEL_KEY_BIT_LENGTH: "طول کلید" - BUTTON_GENERATE_OPEN_PGP_KEYS: "تولید" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "امضاء/رمزنگاری OpenPGP" - LABEL_SIGN: "امضاء" - LABEL_ENCRYPT: "رمزنگاری" - LABEL_PASSWORD: "گذرواژه" - BUTTON_SIGN: "امضاء" - BUTTON_ENCRYPT: "رمزنگاری" - BUTTON_SIGN_AND_ENCRYPT: "امضاء و رمزنگاری" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "رمزگشایی OpenPGP" - LABEL_KEY: "کلید خصوصی" - LABEL_PASSWORD: "گذرواژه" - BUTTON_DECRYPT: "رمزگشایی" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "تست اعتبارسنجی دو مرحله‌ای" - LABEL_CODE: "سورس" - BUTTON_TEST: "تست" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "یک فیلتر ایجاد شود؟" - TITLE_EDIT_FILTER: "بروزرسانی فیلتر؟" - FILTER_NAME: "نام" - LEGEND_CONDITIONS: "شرایط" - LEGEND_ACTIONS: "عملیات" - BUTTON_DONE: "انجام شد" - BUTTON_ADD_CONDITION: "اضافه کردن یک شرط" - SELECT_ACTION_NONE: "هیچ‌کدام" - SELECT_ACTION_MOVE_TO: "انتقال به" - SELECT_ACTION_FORWARD_TO: "ارسال به" - SELECT_ACTION_REJECT: "رد کردن" - SELECT_ACTION_VACATION_MESSAGE: "پیام تعطیلات" - SELECT_ACTION_DISCARD: "دور انداختن" - SELECT_FIELD_FROM: "از" - SELECT_FIELD_RECIPIENTS: "گیرندگان (به یا رونوشت)" - SELECT_FIELD_SUBJECT: "موضوع" - SELECT_FIELD_HEADER: "سرصفحه" - SELECT_FIELD_SIZE: "اندازه" - SELECT_TYPE_CONTAINS: "شامل" - SELECT_TYPE_NOT_CONTAINS: "شامل نبودن" - SELECT_TYPE_MATCHES: "تطابق (* و ? پشتیبانی می‌شود)" - SELECT_TYPE_NOT_MATCHES: "عدم تطابق (* و ? پشتیبانی می‌شود)" - SELECT_TYPE_REGEXP: "عبارت منظم" - SELECT_TYPE_NOT_REGEXP: "عدم عبارت منظم" - SELECT_TYPE_EQUAL_TO: "برابر" - SELECT_TYPE_NOT_EQUAL_TO: "برابر نیست" - SELECT_TYPE_OVER: "بالاتر" - SELECT_TYPE_UNDER: "پایینتر" - SELECT_MATCH_ANY: "مطابقت با هر یک از قوانین روبرو" - SELECT_MATCH_ALL: "مطابق با همه قوانین روبرو" - MARK_AS_READ_LABEL: "علامت بعنوان خوانده شده" - REPLY_INTERVAL_LABEL: "دوره جواب (بر پایه روز)" - KEEP_LABEL: "نگه‌داشتن" - STOP_LABEL: "پردازش قوانین را متوقف نکن" - EMAIL_LABEL: "پست الکترونیک" - VACATION_SUBJECT_LABEL: "موضوع (اختیاری)" - VACATION_MESSAGE_LABEL: "پیام" - VACATION_RECIPIENTS_LABEL: "گیرندگان (جداسازی با , )" - REJECT_MESSAGE_LABEL: "برگشت زدن پیام" - ALL_INCOMING_MESSAGES_DESC: "همه پیام‌های ورودی" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "انتخاب شاخه سیستمی" - SELECT_CHOOSE_ONE: "یکی را انتخاب کنید" - SELECT_UNUSE_NAME: "استفاده نکنید" - LABEL_SENT: "ارسالی" - LABEL_DRAFTS: "پیش‌نویس‌ها" - LABEL_SPAM: "هرزنامه" - LABEL_TRASH: "سطل آشغال" - LABEL_ARCHIVE: "بایگانی" - BUTTON_CANCEL: "انصراف" - BUTTON_CLOSE: "بستن" - NOTIFICATION_SENT: | - شما پوشه سیستمی "ارسالی" را برای قرار گرفتن پیام‌ها در داخل آن، پس از ارسال را انتخاب نکرده‌اید. - اگر شما نمی‌خواهید که پیام‌های ارسالی شما ذخیره شود، لطفا گزینه "استفاده نکن" را انتخاب کنید. - NOTIFICATION_DRAFTS: "شما پوشه سیستمی \"پیش‌نویس‌ها\" را برای ذخیره پیام در زمانی که در حال ایجاد ایمیل جدید هستید را انتخاب نکرده‌اید." - NOTIFICATION_SPAM: | - شما پوشه سیستمی "هرزنامه‌" را جهت قرارگرفتن پیام‌های هرزنامه‌ای انتخاب نکرده‌اید. - اگر شما می‌خواهید که پیام‌ها بصورت همیشگی حذف شوند، لطفا گزینه "استفاده نکن" را انتخاب کنید. - NOTIFICATION_TRASH: | - شما پوشه سیستمی "سطل آشغال" را برای قرارگرفتن پیام‌های حذف شده انتخاب نکرده‌اید. - اگر شما می‌خواهید پیام‌ها بصورت همیشگی حذف شوند، لطفا گزینه "استفاده نکن" را انتخاب کنید. - NOTIFICATION_ARCHIVE: "شما پوشه سیستمی \"بایگانی\" را جهت قرارگرفتن پیام‌های بایگانی‌شده انتخاب نکرده‌اید." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "اعتبارسنجی 2 مرحله‌ای (TOTP)" - LABEL_ENABLE_TWO_FACTOR: "فعال‌سازی اعتبار‌سنجی دو مرحله‌ای" - LABEL_TWO_FACTOR_USER: "کاربر" - LABEL_TWO_FACTOR_STATUS: "وضعیت" - LABEL_TWO_FACTOR_SECRET: "رمز" - LABEL_TWO_FACTOR_BACKUP_CODES: "پشتیبان‌گیری از سورس" - BUTTON_CREATE: "ایجاد یک رمز" - BUTTON_ACTIVATE: "فعال‌کردن" - BUTTON_CLEAR: "پاک‌کردن" - BUTTON_LOGOUT: "خروج" - BUTTON_DONE: "انجام شد" - BUTTON_TEST: "تست" - LINK_TEST: "تست" - BUTTON_SHOW_SECRET: "نمایش رمز" - BUTTON_HIDE_SECRET: "مخفی کردن رمز" - TWO_FACTOR_REQUIRE_DESC: "کاربر شما به پیکربندی اعتبار‌سنجی دو مرحله‌ای نیاز دارد." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "پیکربندی شده" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "عدم پیکربندی" - TWO_FACTOR_SECRET_DESC: > - این اطلاعات را به کلاینت احراز هویت کننده گوگل (یا کلاینتهای TOTP دیگر) توسط - کد QR یا با وارد کردن دستی کد، وارد کنید. - TWO_FACTOR_BACKUP_CODES_DESC: > - اگر شما نمی‌توانید کد‌ها را توسط احرازهویت کننده گوگل (یا کلاینت‌های TOTP - دیگر) دریافت کنید، شما می‌تونید از کد‌های پشتیبان برای ورود استفاده کنید. - بعد از اینکه شما از کد‌ پشتیبان جهت ورود استفاده کردید، غیر فعال خواهد شد. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "شما نمی‌توانید قبل از تست این تنظیمات را تغییر دهید." - TITLES: - LOADING: "در حال بارگذاری" - LOGIN: "ورود" - MAILBOX: "صندوق پست الکترونیک" - SETTINGS: "تنظیمات" - COMPOSE: "ایجاد" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "اندازه فایل بیش از حد بزرگ است" - ERROR_FILE_PARTIALLY_UPLOADED: "قسمتی از فایل به دلیل خطای مشخص فقط بارگذاری شد" - ERROR_NO_FILE_UPLOADED: "هیچ فایل بارگذاری نشده است" - ERROR_MISSING_TEMP_FOLDER: "فایل موقتی از دست رفته است" - ERROR_ON_SAVING_FILE: "یک خطای نامشخص در بارگذاری فایل روی داده است" - ERROR_FILE_TYPE: "نوع فایل نامعتبر است" - ERROR_UNKNOWN: "یک خطای نامشخص در بارگذاری فایل روی داده است" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" - TEXT_SWITCHER_RICH_FORMATTING: "قالب‌بندی پیشرفته" - TEXT_SWITCHER_CONFIRM: "قالب‌بندی متن و تصاویر از بین خواهد رفت. آیا برای ادامه دادن اطمینان دارید؟" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "شخصی" - LABEL_GENERAL_NAME: "عمومی" - LABEL_CONTACTS_NAME: "تماس‌ها" - LABEL_FOLDERS_NAME: "پوشه‌ها" - LABEL_ACCOUNTS_NAME: "حساب‌های کاربری" - LABEL_IDENTITY_NAME: "شناسه" - LABEL_IDENTITIES_NAME: "شناسه‌ها" - LABEL_FILTERS_NAME: "فیلترها" - LABEL_TEMPLATES_NAME: "قالب‌ها" - LABEL_SECURITY_NAME: "امنیت" - LABEL_SOCIAL_NAME: "اجتماعی" - LABEL_THEMES_NAME: "پوسته‌ها" - LABEL_CHANGE_PASSWORD_NAME: "گذرواژه" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "برگشت" - SETTINGS_FILTERS: - LEGEND_FILTERS: "فیلترها" - BUTTON_SAVE: "ذخیره" - BUTTON_ADD_FILTER: "اضافه کردن یک فیلتر" - BUTTON_DELETE: "حذف" - BUTTON_RAW_SCRIPT: "استفاده از اسکریپت سفارشی‌سازی شده کاربر" - SUBNAME_NONE: "هیچ‌کدام" - SUBNAME_MOVE_TO: "انتقال به \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "ارسال به \"%EMAIL%\"" - SUBNAME_REJECT: "برگشت‌زدن" - SUBNAME_VACATION_MESSAGE: "پیام تعطیلات" - SUBNAME_DISCARD: "دور انداختن" - CAPABILITY_LABEL: "قابلیت" - LOADING_PROCESS: "بروزرسانی لیست فیلتر" - DELETING_ASK: "اطمینان دارید؟" - CHACHES_NEED_TO_BE_SAVED_DESC: "این تغییرات نیازمند ذخیره شدن بر روی سرور هستند." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "شناسه" - LABEL_DISPLAY_NAME: "نام" - LABEL_REPLY_TO: "پاسخ به" - LABEL_SIGNATURE: "امضاء" - LABEL_ADD_SIGNATURE_TO_ALL: "اضافه کردن امضاء شما به تمام پیام‌های خروجی" - SETTINGS_SECURITY: - LEGEND_SECURITY: "امنیت" - LABEL_CONFIGURE_TWO_FACTOR: "تنظیم اعتبار‌سنجی دو مرحله‌ای" - LABEL_AUTOLOGOUT: "خروج خودکار" - AUTOLOGIN_NEVER_OPTION_NAME: "هرگز" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% دقیقه(ها)" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% ساعت‌(ها)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "عمومی" - LABEL_LANGUAGE: "زبان" - LABEL_IDENTITY: "شناسه" - LABEL_LAYOUT: "لایه" - LABEL_LAYOUT_NO_SPLIT: "بدون تقسیم" - LABEL_LAYOUT_VERTICAL_SPLIT: "تقسیم عمودی" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "تقسیم افقی" - LABEL_EDITOR: "ویرایشگر پیش‌فرض" - LABEL_EDITOR_HTML: "تحت فرمت Html" - LABEL_EDITOR_PLAIN: "ساده" - LABEL_EDITOR_HTML_FORCED: "Html (اجباری)" - LABEL_EDITOR_PLAIN_FORCED: "Plain (اجباری)" - LABEL_ANIMATION: "انیمیشن رابط کاربری" - LABEL_ANIMATION_FULL: "تمام" - LABEL_ANIMATION_NORMAL: "عادی" - LABEL_ANIMATION_NONE: "هیچ‌کدام" - LABEL_VIEW_OPTIONS: "مشاهده گزینه‌ها" - LABEL_USE_PREVIEW_PANE: "استفاده از پنجره پیش‌نمایش" - LABEL_USE_CHECKBOXES_IN_LIST: "نمایش چک‌باکس در لیست" - LABEL_USE_THREADS: "استفاده از حالت موضوعی" - LABEL_REPLY_SAME_FOLDER: " جوابها را در پوشه‌ای که پیامها در آن جواب داده شده است قراردهید" - LABEL_SHOW_IMAGES: "همیشه تصاویر بیرونی را در بدنه پیام‌ها نشان بده" - LABEL_SHOW_ANIMATION: "نمایش انیمیشن" - LABEL_MESSAGE_PER_PAGE: "پیام‌ها در صفحه" - LABEL_NOTIFICATIONS: "اطلاعیه‌ها" - LABEL_SOUND_NOTIFICATION: "آگاه‌سازی با صدا" - LABEL_CHROME_NOTIFICATION_DESC: "پنجره اعلان دریافت پیام جدید را نمایش بده" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(مسدود شده توسط مرورگر)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "تماس‌ها" - LABEL_CONTACTS_AUTOSAVE: "اطلاعات تماس گیرندگان را بصورت خودکار در آدرس‌بوک ذخیره کن" - LEGEND_CONTACTS_SYNC: "همگام‌سازی از راه دور (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "فعال‌سازی همگام‌سازی از راه دور" - LABEL_CONTACTS_SYNC_SERVER: "سرور" - LABEL_CONTACTS_SYNC_AB_URL: "تارنمای آدرس‌بوک" - LABEL_CONTACTS_SYNC_USER: "کاربر" - LABEL_CONTACTS_SYNC_PASSWORD: "گذرواژه" - SETTINGS_THEMES: - LEGEND_THEMES: "پوسته‌ها" - LEGEND_THEMES_CUSTOM: "پیکربندی سفارشی پوسته" - LABEL_CUSTOM_TYPE: "نوع" - LABEL_CUSTOM_TYPE_LIGHT: "روشن" - LABEL_CUSTOM_TYPE_DARK: "تیره" - LABEL_CUSTOM_BACKGROUND_IMAGE: "پشت زمینه" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "بارگذاری تصاویر پشت زمینه (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "اندازه فایل بیش از حد بزرگ است" - ERROR_FILE_TYPE_ERROR: "نوع فایل نامعتبر (فقط PNG و JPG)" - ERROR_UNKNOWN: "یک خطای نامشخص در بارگذاری فایل روی داده است" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "گوگل" - BUTTON_GOOGLE_CONNECT: "اتصال به گوگل" - BUTTON_GOOGLE_DISCONNECT: "قطع اتصال از گوگل" - MAIN_GOOGLE_DESC: "بعد از فعال‌سازی ورود با گوگل، شما می‌توانید به این حساب کاربری توسط دکمه Google بر روی صفحه ورود متصل شوید." - LEGEND_FACEBOOK: "فیس‌بوک" - BUTTON_FACEBOOK_CONNECT: "اتصال به فیس‌بوک" - BUTTON_FACEBOOK_DISCONNECT: "قطع اتصال از فیس‌بوک" - MAIN_FACEBOOK_DESC: "بعد از فعال‌سازی ورود با فیس‌بوک، شما می‌توانید به این حساب کاربری توسط دکمه Facebook بر روی صفحه ورود متصل شوید." - LEGEND_TWITTER: "توییتر" - BUTTON_TWITTER_CONNECT: "اتصال به توییتر" - BUTTON_TWITTER_DISCONNECT: "قطع اتصال از توییتر" - MAIN_TWITTER_DESC: "بعد از فعال‌سازی ورود با توییتر، شما می‌توانید به این حساب کاربری توسط دکمه Twitter بر روی صفحه ورود متصل شوید." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "لیست پوشه‌ها" - BUTTON_CREATE: "ایجاد پوشه" - BUTTON_SYSTEM: "پوشه‌های سیستم" - BUTTON_DELETE: "حذف" - BUTTON_SUBSCRIBE: "اشتراک" - BUTTON_UNSUBSCRIBE: "قطع اشتراک" - LOADING_PROCESS: "بروزرسانی لیست پوشه‌ها" - CREATING_PROCESS: "در حال ایجاد یک پوشه" - DELETING_PROCESS: "در حال حذف یک پوشه" - RENAMING_PROCESS: "تغییر نام یک پوشه" - DELETING_ASK: "اطمینان دارید؟" - TO_MANY_FOLDERS_DESC_1: "شما پوشه‌های خیلی زیادی دارید!" - TO_MANY_FOLDERS_DESC_2: "جهت جلوگیری از کاهش کارایی سیستم، ما فقط قسمتی از آنها را به شما نشان می‌دهیم." - HELP_DELETE_FOLDER: "حذف پوشه" - HELP_SHOW_HIDE_FOLDER: "نمایش/مخفی‌بودن پوشه" - HELP_CHECK_FOR_NEW_MESSAGES: "بررسی/عدم‌بررسی برای پیام جدید" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "حساب‌های کاربری" - LEGEND_IDENTITIES: "شناسه‌ها" - LEGEND_ACCOUNTS_AND_IDENTITIES: "حساب‌های کاربری و شناسه‌ها" - BUTTON_ADD_ACCOUNT: "اضافه کردن یک حساب کاربری" - BUTTON_ADD_IDENTITY: "اضافه کردن یک شناسه" - BUTTON_DELETE: "حذف" - LOADING_PROCESS: "بروزرسانی..." - DELETING_ASK: "اطمینان دارید؟" - DEFAULT_IDENTITY_LABEL: "پیش‌فرض" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "شناسه" - LEGEND_IDENTITIES: "شناسه‌های اضافی‌" - LABEL_DEFAULT: "پیش‌فرض" - LABEL_DISPLAY_NAME: "نام" - LABEL_REPLY_TO: "پاسخ به" - LABEL_SIGNATURE: "امضاء" - LABEL_ADD_SIGNATURE_TO_ALL: "اضافه کردن امضاء شما به تمام پیام‌های خروجی" - BUTTON_ADD_IDENTITY: "اضافه کردن شناسه" - BUTTON_DELETE: "حذف" - LOADING_PROCESS: "بروزرسانی لیست شناسه‌ها" - DELETING_ASK: "اطمینان دارید؟" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "تغییر گذرواژه" - LABEL_CURRENT_PASSWORD: "گذرواژه فعلی" - LABEL_NEW_PASSWORD: "گذرواژه جدید" - LABEL_REPEAT_PASSWORD: "تکرار گذرواژه جدید" - BUTTON_UPDATE_PASSWORD: "ثبت گذرواژه جدید" - ERROR_PASSWORD_MISMATCH: "گذرواژه‌های وارد شده یکسان نیست، مجددا تلاش کنید." - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "وارد کردن کلید OpenPGP" - BUTTON_GENERATE_OPEN_PGP_KEYS: "تولید کلیدهای OpenPGP" - TITLE_PRIVATE: "خصوصی" - TITLE_PUBLIC: "عمومی" - DELETING_ASK: "اطمینان دارید؟" - GENERATE_ONLY_HTTPS: "تنها HTTPS" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "راهنمای میانبر‌های کیبرد" - TAB_MAILBOX: "صندوق پستی" - TAB_MESSAGE_LIST: "لیست پیام" - TAB_MESSAGE_VIEW: "مشاهده پیام" - TAB_COMPOSE: "ایجاد" - LABEL_OPEN_USER_DROPDOWN: "قسمت کرکره‌ای کاربر را باز کنید" - LABEL_REPLY: "پاسخ" - LABEL_REPLY_ALL: "پاسخ به همه" - LABEL_FORWARD: "ارسال به دیگران" - LABEL_FORWARD_MULTIPLY: "ارسال بصورت پیوست(ها)" - LABEL_HELP: "راهنما" - LABEL_CHECK_ALL: "انتخاب همه پیام‌ها" - LABEL_ARCHIVE: "بایگانی" - LABEL_DELETE: "حذف" - LABEL_OPEN_THREAD: "باز کردن موضوع انتخاب شده" - LABEL_MOVE: "انتقال" - LABEL_READ: "خواندن پیام‌های انتخاب شده" - LABEL_UNREAD: "عدم خواندن پیام‌های انتخاب شده" - LABEL_IMPORTANT: "مهم، پرچم‌دار شدن پیام‌های انتخاب شده" - LABEL_SEARCH: "جستجو" - LABEL_CANCEL_SEARCH: "لغو جستجو" - LABEL_FULLSCREEN_ENTER: "تمام صفحه (لایه پنجره پیش‌نمایش)" - LABEL_VIEW_MESSAGE_ENTER: "مشاهده پیام (بدون پنجره پیش‌نمایش)" - LABEL_SWITCH_TO_MESSAGE: "تغییر تمرکز به پیام انتخاب شده" - LABEL_SWITCH_TO_FOLDER_LIST: "تغییر تمرکز به لیست پوشه‌ها" - LABEL_FULLSCREEN_TOGGLE: "ضامن حالت تمام صفحه" - LABEL_BLOCKQUOTES_TOGGLE: "ضامن نقل‌قولهای پیام" - LABEL_THREAD_NEXT: "پیام بعدی در موضوع" - LABEL_THREAD_PREV: "پیام قبلی در موضوع" - LABEL_PRINT: "چاپ" - LABEL_EXIT_FULLSCREEN: "خروج از حالت تمام صفحه" - LABEL_CLOSE_MESSAGE: "بستن پیام (بدون لایه پنجره پیش‌نمایش)" - LABEL_SWITCH_TO_LIST: "برگشت به لیست پیام‌ها" - LABEL_OPEN_COMPOSE_POPUP: "بازکردن صفحه ایجاد" - LABEL_MINIMIZE_COMPOSE_POPUP: "کوچک‌سازی پنجره ایجاد" - LABEL_OPEN_IDENTITIES_DROPDOWN: "لیست کرکره‌ای شناسه‌ها را باز کنید" - LABEL_SAVE_MESSAGE: "ذخیره پیام" - LABEL_SEND_MESSAGE: "فرستادن پیام" - LABEL_CLOSE_COMPOSE: "بستن صفحه ایجاد" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "کلید عمومی پیدا نشد" - NO_PUBLIC_KEYS_FOUND_FOR: "هیچ کلید عمومی برای آدرس پست الکترونیک \"%EMAIL%\" پیدا نشد" - NO_PRIVATE_KEY_FOUND: "هیچ کلید خصوصی پیدا نشد" - NO_PRIVATE_KEY_FOUND_FOR: "هیچ کلید خصوصی برای آدرس پست الکترونیک \"%EMAIL%\" پیدا نشد" - ADD_A_PUBLICK_KEY: "اضافه کردن کلید عمومی" - SELECT_A_PRIVATE_KEY: "انتخاب کلید خصوصی" - UNVERIFIRED_SIGNATURE: "امضای تایید نشده" - DECRYPTION_ERROR: "خطای رمزگشایی در OpenPGP" - GOOD_SIGNATURE: "امضای صحیح از %USER%" - PGP_ERROR: "خطای OpenPGP: %ERROR%" - SPECIFY_FROM_EMAIL: "لطفا قسمت FROM را مشخص نمایید" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "لطفا حداقل یک گیرنده را مشخص نمایید" - NOTIFICATIONS: - INVALID_TOKEN: "توکن نامعتبر" - AUTH_ERROR: "احراز هویت با موفقیت همراه نبود" - ACCESS_ERROR: "خطای دسترسی" - CONNECTION_ERROR: "عدم اتصال به سرور" - CAPTCHA_ERROR: "تصویر امنیتی اشتباه هست" - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - این شناسه اجتماعی برای هیچ کاربر پست الکترونیکی تاکنون تخصیص داده نشده است. - با استفاده از اعتبار کاربر پست الکترونیک خود وارد شوید و سپس این ویژگی را - در تنظیمات کاربر خود فعال کنید. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - این شناسه اجتماعی برای هیچ کاربر پست الکترونیکی تاکنون تخصیص داده نشده است. - با استفاده از اعتبار کاربر پست الکترونیک خود وارد شوید و سپس این ویژگی را - در تنظیمات کاربر خود فعال کنید. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - این شناسه اجتماعی برای هیچ کاربر پست الکترونیکی تاکنون تخصیص داده نشده است. - با استفاده از اعتبار کاربر پست الکترونیک خود وارد شوید و سپس این ویژگی را - در تنظیمات کاربر خود فعال کنید. - DOMAIN_NOT_ALLOWED: "به دامنه اجازه داده نشده است" - ACCOUNT_NOT_ALLOWED: "به حساب کاربری اجازه داده نشده است" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "اعتبار‌سنجی دو مرحله‌ای مورد نیاز است" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "خطای تایید اعتبار سنجی دو مرحله‌ای" - COULD_NOT_SAVE_NEW_PASSWORD: "عدم امکان ذخیره گذرواژه جدید" - CURRENT_PASSWORD_INCORRECT: "گذرواژه فعلی شما اشتباه است" - NEW_PASSWORD_SHORT: "گذرواژه شما بسیار کوتاه است" - NEW_PASSWORD_WEAK: "گذرواژه بسیار ساده است" - NEW_PASSWORD_FORBIDDENT: "گذرواژه شامل کاراکترهای غیرمجاز است" - CONTACTS_SYNC_ERROR: "همگام‌سازی تماس‌ها با خطا همراه بود" - CANT_GET_MESSAGE_LIST: "امکان دریافت لیست پیام‌ها نیست" - CANT_GET_MESSAGE: "امکان دریافت پیام نیست" - CANT_DELETE_MESSAGE: "امکان حذف پیام نیست" - CANT_MOVE_MESSAGE: "امکان انتقال پیام نیست" - CANT_SAVE_MESSAGE: "امکان ذخیره پیام نیست" - CANT_SEND_MESSAGE: "امکان ارسال پیام نیست" - INVALID_RECIPIENTS: "گیرنده نامعتبر" - CANT_SAVE_FILTERS: "امکان ذخیره فیلترها نیست" - CANT_GET_FILTERS: "امکان دریافت فیلترها نیست" - FILTERS_ARE_NOT_CORRECT: "فیلترها صحیح نیستند" - CANT_CREATE_FOLDER: "امکان ایجاد شاخه وجود ندارد" - CANT_RENAME_FOLDER: "امکان تغییر نام شاخه نیست" - CANT_DELETE_FOLDER: "امکان حذف شاخه نیست" - CANT_DELETE_NON_EMPTY_FOLDER: "امکان حذف شاخه‌ای که خالی نیست وجود ندارد" - CANT_SUBSCRIBE_FOLDER: "امکان اشتراک شاخه نیست" - CANT_UNSUBSCRIBE_FOLDER: "امکان عدم اشتراک شاخه نیست" - CANT_SAVE_SETTINGS: "امکان ذخیره تنظیمات نیست" - CANT_SAVE_PLUGIN_SETTINGS: "امکان ذخیره تنظیمات نیست" - DOMAIN_ALREADY_EXISTS: "دامنه در حال حاضر موجود است" - CANT_INSTALL_PACKAGE: "نصب بسته با خطا همراه بود" - CANT_DELETE_PACKAGE: "حذف بسته با خطا همراه بو" - INVALID_PLUGIN_PACKAGE: "بسته افزونه نامعتبر است" - UNSUPPORTED_PLUGIN_PACKAGE: "بسته افزونه پشتیبانی نمی‌شود" - LICENSING_SERVER_IS_UNAVAILABLE: "سرور مشترک شدن در دسترس نیست" - LICENSING_DOMAIN_EXPIRED: "اشتراک برای این دامنه منقضی شده است" - LICENSING_DOMAIN_BANNED: "اشتراک برای این دامنه مسدود شده است" - DEMO_SEND_MESSAGE_ERROR: "بنابر اهداف امنیتی، این کاربر اجازه ارسال ایمیل به یک ایمیل خارج از دامنه را ندارد!" - DEMO_ACCOUNT_ERROR: "بنابر اهداف امنیتی، این کاربر اجازه انجام این عملیات را ندارد!" - ACCOUNT_ALREADY_EXISTS: "کاربر وجود دارد" - ACCOUNT_DOES_NOT_EXIST: "کاربر وجود ندارد" - MAIL_SERVER_ERROR: "یک خطا در زمان دسترسی به سرویس پست الکترونیک رخ داد" - INVALID_INPUT_ARGUMENT: "پارامترهای ورودی نامعتبر" - UNKNOWN_ERROR: "خطای نامشخص" - STATIC: - BACK_LINK: "بارگذاری مجدد" - DOMAIN_LIST_DESC: "لیستی از دامنه‌های وب‌میل که برای دسترسی مجاز است." - PHP_EXSTENSIONS_ERROR_DESC: "به یک افزونه PHP نیاز دارد که در تنظیمات مربوط به PHP شما وجود ندارد!" - PHP_VERSION_ERROR_DESC: "نسخه PHP شما (%VERSION%) کمتر از حداقل نسخه مورد انتظار 5.3.0 هست!" - NO_SCRIPT_TITLE: "جاوا‌اسکریپت برای این برنامه مورد نیاز است." - NO_SCRIPT_DESC: | - پشتیبانی از جاوااسکریپت در مرورگر شما وجود ندارد. - لطفا پشتیبانی از جاوا‌اسکریپت را در تنظیمات مرورگر خود فعال کنید و مجددا تلاش کنید. - NO_COOKIE_TITLE: "Cookie باید بر روی مرورگر شما جهت استفاده از برنامه فعال باشد." - NO_COOKIE_DESC: | - پشتیبانی از Cookie در مرورگر شما فعال نیست. - لطفا Cookie را در تنظیمات مرورگر خود فعال کنید و مجددا تلاش کنید. - BAD_BROWSER_TITLE: "نسخه مرورگر شما قدیمی است." - BAD_BROWSER_DESC: | - برای استفاده از تمام قابلیتهای برنامه، - یکی از مرورگرهای زیر را دریافت و نصب کنید. diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fi_FI.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fi_FI.yml deleted file mode 100755 index 02abf710..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fi_FI.yml +++ /dev/null @@ -1,708 +0,0 @@ -fi_FI: - LOGIN: - LABEL_EMAIL: "Sähköpostisi" - LABEL_LOGIN: "Tunnus" - LABEL_PASSWORD: "Salasana" - LABEL_SIGN_ME: "Muista minut" - LABEL_VERIFICATION_CODE: "Vahvistuskoodi" - LABEL_DONT_ASK_VERIFICATION_CODE: "Älä kysy koodia 2 viikkoon" - BUTTON_SIGN_IN: "Kirjaudu" - TITLE_SIGN_IN_GOOGLE: "Kirjaudu käyttäen Googlea" - TITLE_SIGN_IN_FACEBOOK: "Kirjaudu käyttäen Facebookia" - TITLE_SIGN_IN_TWITTER: "Kirjaudu käyttäen Twitteriä" - LABEL_FORGOT_PASSWORD: "Unohdin salasanani" - LABEL_REGISTRATION: "Rekisteröidy" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Lisää tili" - BUTTON_SETTINGS: "Asetukset" - BUTTON_HELP: "Ohje" - BUTTON_LOGOUT: "Kirjaudu ulos" - MOBILE: - BUTTON_MOBILE_VERSION: "Mobiiliversio" - BUTTON_DESKTOP_VERSION: "Työpöytäversio" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Haku" - TITLE_ADV: "Tarkka haku" - LABEL_ADV_FROM: "Läh." - LABEL_ADV_TO: "Vast. ott." - LABEL_ADV_SUBJECT: "Aihe" - LABEL_ADV_TEXT: "Teksti" - LABEL_ADV_HAS_ATTACHMENT: "Sisältää liitteen" - LABEL_ADV_HAS_ATTACHMENTS: "Sisältää liitteitä" - LABEL_ADV_FLAGGED: "Merkitty" - LABEL_ADV_UNSEEN: "Ei luettu" - LABEL_ADV_DATE: "Pvm" - LABEL_ADV_DATE_ALL: "Kaikki" - LABEL_ADV_DATE_3_DAYS: "3 päivän ajalta" - LABEL_ADV_DATE_7_DAYS: "1 viikon ajalta" - LABEL_ADV_DATE_MONTH: "1 kk ajalta" - LABEL_ADV_DATE_3_MONTHS: "3 kk ajalta" - LABEL_ADV_DATE_6_MONTHS: "6 kk ajalta" - LABEL_ADV_DATE_YEAR: "1 vuoden ajalta" - BUTTON_ADV_SEARCH: "Hae" - PREVIEW_POPUP: - FULLSCREEN: "Koko ruutu" - ZOOM: "Zoomaa" - CLOSE: "Sulje (Esc)" - LOADING: "Lataa..." - GALLERY_PREV: "Edellinen (nuoli vasemmalle)" - GALLERY_NEXT: "Seuraava (nuoli oikealle)" - GALLERY_COUNTER: "%curr% %total% sta" - IMAGE_ERROR: "Kuvaa ei voitu ladata." - AJAX_ERROR: "Sisältöä ei voitu ladata." - FOLDER_LIST: - BUTTON_COMPOSE: "Luo" - BUTTON_CONTACTS: "Yhteystiedot" - BUTTON_NEW_MESSAGE: "Uusi viesti" - INBOX_NAME: "Postilaatikko" - SENT_NAME: "Lähetetyt" - DRAFTS_NAME: "Luonnokset" - SPAM_NAME: "Roskaposti" - TRASH_NAME: "Roskakori" - ARCHIVE_NAME: "Arkisto" - QUOTA: - TITLE: "Kiintiö" - MESSAGE_LIST: - BUTTON_RELOAD: "Päivitä viestit" - BUTTON_MOVE_TO: "Siirrä" - BUTTON_DELETE: "Poista" - BUTTON_ARCHIVE: "Arkistoi" - BUTTON_SPAM: "Merkitse roskapostiksi" - BUTTON_NOT_SPAM: "Ei roskapostia" - BUTTON_EMPTY_FOLDER: "Tyhjennä kansio" - BUTTON_MULTY_FORWARD: "Välitä liitteenä" - BUTTON_DELETE_WITHOUT_MOVE: "Poista lopullisesti" - BUTTON_MORE: "Lisää" - MENU_SET_SEEN: "Merkitse luetuksi" - MENU_SET_ALL_SEEN: "Merkitse kaikki luetuksi" - MENU_UNSET_SEEN: "Merkitse lukemattomaksi" - MENU_SET_FLAG: "Merkkaa" - MENU_UNSET_FLAG: "Poista merkki" - MENU_SELECT_ALL: "Kaikki" - MENU_SELECT_NONE: "Ei mitään" - MENU_SELECT_INVERT: "Vaihda valinta" - MENU_SELECT_UNSEEN: "Lukemattomat" - MENU_SELECT_SEEN: "Luetut" - MENU_SELECT_FLAGGED: "Merkityt" - MENU_SELECT_UNFLAGGED: "Merkkaamattomat" - EMPTY_LIST: "Tyhjennä lista" - EMPTY_SEARCH_LIST: "Yhtään viestiä ei löytynyt ehdoillasi." - SEARCH_RESULT_FOR: "Hakutulokset haulle \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "Takaisin viestilistaan" - LIST_LOADING: "Lataa" - EMPTY_SUBJECT_TEXT: "(Ei aihetta)" - PUT_MESSAGE_HERE: "Pudota viesti tähän nähdäksesi sen listassa" - TODAY_AT: "tänään klo %TIME%" - YESTERDAY_AT: "eilen klo %TIME%" - SEARCH_PLACEHOLDER: "Hae" - NEW_MESSAGE_NOTIFICATION: "Sinulle on %COUNT% uutta viestiä!" - QUOTA_SIZE: "Käytät %SIZE% (%PROC%%) sinulle varatusta %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Muokkaa" - BUTTON_BACK: "Takaisin" - BUTTON_CLOSE: "Sulje" - BUTTON_DELETE: "Poista" - BUTTON_UNSUBSCRIBE: "Peruuta tilaus" - BUTTON_ARCHIVE: "Arkistoi" - BUTTON_SPAM: "Roskapostia" - BUTTON_NOT_SPAM: "Ei roskapostia" - BUTTON_MOVE_TO: "Siirrä" - BUTTON_MORE: "Lisää" - BUTTON_REPLY: "Vastaa" - BUTTON_REPLY_ALL: "Vastaa kaikille" - BUTTON_FORWARD: "Välitä" - BUTTON_FORWARD_AS_ATTACHMENT: "Välitä liitteenä" - BUTTON_EDIT_AS_NEW: "Muokkaa uutena" - BUTTON_SHOW_IMAGES: "Näytä ulkopuoliset kuvat" - BUTTON_NOTIFY_READ_RECEIPT: "Lähettäjä on pyytänyt kuittausta kun olet lukenut tämän viestin" - BUTTON_IN_NEW_WINDOW: "Avaa uudessa ikkunassa" - BUTTON_THREAD_LIST: "Viestiketjunäkymä" - BUTTON_THREAD_PREV: "Edellinen" - BUTTON_THREAD_NEXT: "Seuraava" - BUTTON_THREAD_MORE: "Lisää viestejä" - MENU_HEADERS: "Näytä viestin tiedot" - MENU_VIEW_ORIGINAL: "Näytä lähdekoodi" - MENU_DOWNLOAD_ORIGINAL: "Lataa .eml tiedostona" - MENU_FILTER_SIMILAR: "Suodata samankaltaiset" - MENU_PRINT: "Tulosta" - EMPTY_SUBJECT_TEXT: "(Ei aihetta)" - LABEL_SUBJECT: "Aihe" - LABEL_DATE: "Pvm" - LABEL_FROM: "Lähettäjä" - LABEL_FROM_SHORT: "läh" - LABEL_TO: "Vastaanottaja" - LABEL_TO_SHORT: "vast. ott." - LABEL_CC: "CC" - LABEL_BCC: "BCC" - LABEL_REPLY_TO: "Vastaa" - PRINT_LABEL_FROM: "Lähettäjä" - PRINT_LABEL_TO: "Vastaanottaja" - PRINT_LABEL_CC: "CC" - PRINT_LABEL_BCC: "BCC" - PRINT_LABEL_REPLY_TO: "Vastaa" - PRINT_LABEL_DATE: "Pvm" - PRINT_LABEL_SUBJECT: "Aihe" - PRINT_LABEL_ATTACHMENTS: "Liite" - MESSAGE_LOADING: "Lataa" - MESSAGE_VIEW_DESC: "Valitse viesti listasta nähdäksesi sen tässä" - PGP_PASSWORD_INPUT_PLACEHOLDER: "Salasana" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP allekirjoitettu viesti (klikkaa verifioidaksesi)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP salattu visti (klikkaa avataksesi salaus)" - LINK_DOWNLOAD_AS_ZIP: "Lataa zip-tiedostona" - LINK_SAVE_TO_OWNCLOUD: "Tallenna ownCloudiin" - LINK_SAVE_TO_DROPBOX: "Tallenna Dropboxiin" - READ_RECEIPT: - SUBJECT: "Kuitattu luetuksi - %SUBJECT%" - BODY: | - Tämä on Kuitattu luetuksi viestille jonka lähetit %READ-RECEIPT%lle. - - Huom: Tämä viesti kertoo vain että lähetetty viesti on näytetty vastaanottajan koneella. - SUGGESTIONS: - SEARCHING_DESC: "Hakee..." - CONTACTS: - LEGEND_CONTACTS: "Yhteystiedot" - SEARCH_INPUT_PLACEHOLDER: "Hae" - BUTTON_ADD_CONTACT: "Lisää yhteystieto" - BUTTON_CREATE_CONTACT: "Luo" - BUTTON_UPDATE_CONTACT: "Päivitä" - BUTTON_IMPORT: "Tuo (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Vie (vcf, vCard)" - BUTTON_EXPORT_CSV: "Vie (csv)" - ERROR_IMPORT_FILE: "Tuonti virhe (väärä tiedostomuoto)" - LIST_LOADING: "Lataa" - EMPTY_LIST: "Ei yhteystietoja" - EMPTY_SEARCH: "Yhtään yhteystietoa ei löytynyt" - CLEAR_SEARCH: "Poista haku" - CONTACT_VIEW_DESC: "Valitse yhteystieto nähdäksesi sen tässä." - LABEL_DISPLAY_NAME: "Nimi" - LABEL_EMAIL: "Sähköposti" - LABEL_PHONE: "Puhelin" - LABEL_WEB: "Web" - LABEL_BIRTHDAY: "Syntymäpäivä" - LINK_ADD_EMAIL: "Lisää sähköpostiosoite" - LINK_ADD_PHONE: "Lisää puhelinnumero" - LINK_BIRTHDAY: "Syntymäpäivä" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Lisää näytettävä nimi" - PLACEHOLDER_ENTER_LAST_NAME: "Lisää sukunimi" - PLACEHOLDER_ENTER_FIRST_NAME: "Lisää etunimi" - PLACEHOLDER_ENTER_NICK_NAME: "Lisää lempinimi" - LABEL_READ_ONLY: "Vain luku" - LABEL_SHARE: "Jaa" - ADD_MENU_LABEL: "Lisää" - ADD_MENU_NICKNAME: "Lempinimi" - ADD_MENU_NOTES: "Muistiinpanot" - ADD_MENU_EMAIL: "Sähköposti" - ADD_MENU_PHONE: "Puhelin" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Osoite" - ADD_MENU_BIRTHDAY: "Syntymäpäivä" - ADD_MENU_TAGS: "Tagit" - BUTTON_SHARE_NONE: "Ei kenellekään" - BUTTON_SHARE_ALL: "Kaikille" - BUTTON_SYNC: "Synkronoi (CardDAV)" - COMPOSE: - TITLE_FROM: "Lähettäjä" - TITLE_TO: "Vastaanottaja" - TITLE_CC: "CC" - TITLE_BCC: "BCC" - TITLE_REPLY_TO: "Vastaa" - TITLE_SUBJECT: "Aihe" - LINK_SHOW_INPUTS: "näytä kaikki kentät" - BUTTON_SEND: "Lähetä" - BUTTON_SAVE: "Tallenna" - BUTTON_DELETE: "Poista" - BUTTON_CANCEL: "Peruuta" - BUTTON_MINIMIZE: "Pienennä" - SAVED_TIME: "Tallennettu klo %TIME%" - SAVED_ERROR_ON_SEND: "Viesti lähetettiin mutta ei tallennettu lähetetyt kanisoon" - DISCARD_UNSAVED_DATA: "Poista tallentamaton tieto?" - ATTACH_FILES: "Liitä tiedostoja" - ATTACH_DROP_FILES_DESC: "Pudota tiedostot tähän" - ATTACH_ITEM_CANCEL: "Peruuta" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% kirjoitti" - FORWARD_MESSAGE_TOP_TITLE: "-------- Välitetty viesti -------" - FORWARD_MESSAGE_TOP_FROM: "Lähettäjä" - FORWARD_MESSAGE_TOP_TO: "Vastaanottaja" - FORWARD_MESSAGE_TOP_CC: "CC" - FORWARD_MESSAGE_TOP_SENT: "Lähetetty" - FORWARD_MESSAGE_TOP_SUBJECT: "Aihe" - EMPTY_TO_ERROR_DESC: "Lisää ainakin yksi vastaanottaja" - NO_ATTACHMENTS_HERE_DESC: "Ei liitteitä" - ATTACHMENTS_ERROR_DESC: "Huom! Yhtään liitetiedostoa ei ole ladattu." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Kaikkia liitetiedostoja ei ole vielä ladattu." - BUTTON_REQUEST_READ_RECEIPT: "Pyydä kuittaus" - BUTTON_MARK_AS_IMPORTANT: "Merkitse tärkeäksi" - BUTTON_OPEN_PGP: "OpenPGP (pelkkä teksti)" - BUTTON_REQUEST_DSN: "Pyydä toimituskuittaus" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Sulje" - POPUPS_ASK: - BUTTON_YES: "Kyllä" - BUTTON_NO: "Ei" - DESC_WANT_CLOSE_THIS_WINDOW: "Haluatko varmasti sulkea tämän ikkunan?" - DESC_WANT_DELETE_MESSAGES: "Haluatko varmasti poistaa viestin/viestit?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Valitse kieli" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Lisää tili?" - BUTTON_ADD_ACCOUNT: "Lisää" - TITLE_UPDATE_ACCOUNT: "Päivitä tili?" - BUTTON_UPDATE_ACCOUNT: "Päivitä" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Lisää identiteetti?" - TITLE_UPDATE_IDENTITY: "Päivitä identiteetti?" - BUTTON_ADD_IDENTITY: "Lisää" - BUTTON_UPDATE_IDENTITY: "Päivitä" - LABEL_EMAIL: "Sähköposti" - LABEL_NAME: "Nimi" - LABEL_REPLY_TO: "Vastaa" - LABEL_SIGNATURE: "Allekirjoitus" - LABEL_CC: "Cc" - LABEL_BCC: "Bcc" - LABEL_SIGNATURE_INSERT_BEFORE: "Lisää tämä allekirjoitus ennen lainattua tekstiä vastauksissa" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Luo kansio?" - LABEL_NAME: "Kansion nimi" - LABEL_PARENT: "Emo-kansio" - BUTTON_CREATE: "Luo" - BUTTON_CANCEL: "Peruuta" - BUTTON_CLOSE: "Sulje" - TITLE_CREATING_PROCESS: "Luodaan kansiota" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Poista kaikki viestit tästä kansiosta?" - BUTTON_CLEAR: "Poista" - BUTTON_CANCEL: "Peruuta" - BUTTON_CLOSE: "Sulje" - DANGER_DESC_WARNING: "Huom!" - DANGER_DESC_HTML_1: "Tämä toiminto poistaa kaikki viestit kansiosta %FOLDER% lopullisesti." - DANGER_DESC_HTML_2: "Tätä toimintoa ei voi peruuttaa." - TITLE_CLEARING_PROCESS: "Tyhjennetään kansiota..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Tuo OpenPGP avain" - BUTTON_IMPORT_OPEN_PGP_KEY: "Tuo" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Näytä OpenPGP avain" - BUTTON_SELECT: "Valitse" - BUTTON_CLOSE: "Sulje" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Luo OpenPGP avain" - LABEL_EMAIL: "Sähköposti" - LABEL_NAME: "Nimi" - LABEL_PASSWORD: "Salasana" - LABEL_KEY_BIT_LENGTH: "Avaimen pituus" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generoi" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP Allekirjoitus/Salaus" - LABEL_SIGN: "Allekirjoita" - LABEL_ENCRYPT: "Salaa" - LABEL_PASSWORD: "Salasana" - BUTTON_SIGN: "Allekirjoita" - BUTTON_ENCRYPT: "Salaa" - BUTTON_SIGN_AND_ENCRYPT: "Allekirjoita ja salaa" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "Pura OpenPGP" - LABEL_KEY: "Yksityinen avain" - LABEL_PASSWORD: "Salasana" - BUTTON_DECRYPT: "Pura" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "2-vaiheisen tunnistautumisen testi" - LABEL_CODE: "Koodi" - BUTTON_TEST: "Testaa" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Luo suodatin?" - TITLE_EDIT_FILTER: "Päivitä suodatin?" - FILTER_NAME: "Nimi" - LEGEND_CONDITIONS: "Ehdot" - LEGEND_ACTIONS: "Toimenpiteet" - BUTTON_DONE: "Valmis" - BUTTON_ADD_CONDITION: "Lisää ehto" - SELECT_ACTION_NONE: "Ei mitään" - SELECT_ACTION_MOVE_TO: "Siirrä" - SELECT_ACTION_FORWARD_TO: "Välitä" - SELECT_ACTION_REJECT: "Hylkää" - SELECT_ACTION_VACATION_MESSAGE: "Lomaviesti" - SELECT_ACTION_DISCARD: "Poista" - SELECT_FIELD_FROM: "Lähettäjä" - SELECT_FIELD_RECIPIENTS: "Vastaanottajat (Vast. ott. tai CC)" - SELECT_FIELD_SUBJECT: "Aihe" - SELECT_FIELD_HEADER: "Header" - SELECT_FIELD_SIZE: "Koko" - SELECT_TYPE_CONTAINS: "Sisältää" - SELECT_TYPE_NOT_CONTAINS: "Ei sisällä" - SELECT_TYPE_MATCHES: "Vastaa hakukyselyä (* ja ? tuettu)" - SELECT_TYPE_NOT_MATCHES: "Ei vastaa hakukyselyä (* ja ? tuettu)" - SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Not Regexp" - SELECT_TYPE_EQUAL_TO: "Yhtä kuin" - SELECT_TYPE_NOT_EQUAL_TO: "Ei yhtä kuin" - SELECT_TYPE_OVER: "Yli" - SELECT_TYPE_UNDER: "Alle" - SELECT_MATCH_ANY: "Vastaa mitä tahansa säännöistä" - SELECT_MATCH_ALL: "Vastaa kaikkia sääntöjä" - MARK_AS_READ_LABEL: "Merkitse luetuksi" - REPLY_INTERVAL_LABEL: "Vastaus intervalli (päivissä)" - KEEP_LABEL: "Säästä" - STOP_LABEL: "Älä lopeta sääntöjen prosessointia" - EMAIL_LABEL: "Sähköposti" - VACATION_SUBJECT_LABEL: "Aihe (valinnainen)" - VACATION_MESSAGE_LABEL: "Viesti" - VACATION_RECIPIENTS_LABEL: "Vastaanottajat (erotettu pilkulla)" - REJECT_MESSAGE_LABEL: "Hylkää viesti" - ALL_INCOMING_MESSAGES_DESC: "Kaikki saapuvat viestit" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Valitse järjestelmäkansiot" - SELECT_CHOOSE_ONE: "Valitse yksi" - SELECT_UNUSE_NAME: "Älä käytä" - LABEL_SENT: "Lähetetyt" - LABEL_DRAFTS: "Luonnokset" - LABEL_SPAM: "Roskaposti" - LABEL_TRASH: "Roskakori" - LABEL_ARCHIVE: "Arkisto" - BUTTON_CANCEL: "Peruuta" - BUTTON_CLOSE: "Sulje" - NOTIFICATION_SENT: | - Et ole valinnut "Lähetetyt" järjestelmäkansiota jonne viestit laitetaan lähetyksen jälkeen. - Jos et halua tallentaa lähetettyjä viestejä, valitse "Älä käytä". - NOTIFICATION_DRAFTS: "Et ole valinnut \"Luonnokset\" kansiota minne tallennetaan viestit kirjoitettaessa." - NOTIFICATION_SPAM: | - Et ole valinnut "Roskaposti" kansiota mihin roskapostiksi merkityt viestit siirretään. - Jos haluat positaa viestit lopullisesti, valitse "Älä käytä". - NOTIFICATION_TRASH: | - Et ole valinnut "Roskakori" järjestelmäkansiota mihin poistetut viestit laitetaan. - Jos haluat positaa viestit lopullisesti, valitse "Älä käytä". - NOTIFICATION_ARCHIVE: "Et ole valinnut \"Arkisto\" järjestelmäkansiota." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "2-osainen todentaminen" - LABEL_ENABLE_TWO_FACTOR: "Aktivoi 2-osainen todentaminen" - LABEL_TWO_FACTOR_USER: "Käyttäjä" - LABEL_TWO_FACTOR_STATUS: "Tila" - LABEL_TWO_FACTOR_SECRET: "Salasana" - LABEL_TWO_FACTOR_BACKUP_CODES: "Varmuuskoodi" - BUTTON_CREATE: "Luo salasana" - BUTTON_ACTIVATE: "Aktivoi" - BUTTON_CLEAR: "Poista" - BUTTON_LOGOUT: "Kirjaudu ulos" - BUTTON_DONE: "Valmis" - BUTTON_TEST: "Testaa" - LINK_TEST: "testi" - BUTTON_SHOW_SECRET: "Näytä salasana" - BUTTON_HIDE_SECRET: "Piilota salasana" - TWO_FACTOR_REQUIRE_DESC: "Tilisi vaatii 2-osasisen tunnistuksen" - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Konfiguroitu" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Ei konfiguroitu" - TWO_FACTOR_SECRET_DESC: > - Vie tämä tieto Google Authenticator (tai toiseen )asiakasohjelmaan käyttämällä - QR koodia tai syöttämällä koodi manuaalisesti. - TWO_FACTOR_BACKUP_CODES_DESC: > - Jos et voi vastaanottaa koodeja Google Authenticator:lla, voit käyttää varmuus - koodeja kirjautumiseen. Käytettyäsi varmuuskoodin se poistuu käytötstä. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Et voi muuttaa asetusta ennen testiä." - TITLES: - LOADING: "Lataa" - LOGIN: "Kirjaudu" - MAILBOX: "Postilaatikko" - SETTINGS: "Asetukset" - COMPOSE: "Luo viesti" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Tiedosto on liian iso" - ERROR_FILE_PARTIALLY_UPLOADED: "Tiedostoa ei voitu ladata kokonaan tuntemattoman vierheen vuoksi" - ERROR_NO_FILE_UPLOADED: "Tiedostoa ei ladattu" - ERROR_MISSING_TEMP_FOLDER: "Väliaikainen tiedosto puuttuu" - ERROR_ON_SAVING_FILE: "Tuntematon virhe ladattaessa" - ERROR_FILE_TYPE: "Väärä tiedostotyyppi" - ERROR_UNKNOWN: "Tuntematon virhe ladattaessa" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEKSTI" - TEXT_SWITCHER_RICH_FORMATTING: "Muotoiluilla" - TEXT_SWITCHER_CONFIRM: "Muotoilu ja kuvat häviävät. Haluatko varmasti jatkaa?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Henkilökohtainen" - LABEL_GENERAL_NAME: "Yleinen" - LABEL_CONTACTS_NAME: "Yhteystiedot" - LABEL_FOLDERS_NAME: "kansiot" - LABEL_ACCOUNTS_NAME: "Tilit" - LABEL_IDENTITY_NAME: "Identiteetti" - LABEL_IDENTITIES_NAME: "Identiteetit" - LABEL_FILTERS_NAME: "Suodattimet" - LABEL_TEMPLATES_NAME: "Mallipohjat" - LABEL_SECURITY_NAME: "Turvallisuus" - LABEL_SOCIAL_NAME: "Sosiaalinen" - LABEL_THEMES_NAME: "emat" - LABEL_CHANGE_PASSWORD_NAME: "Salasana" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Takaisin" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Suodattimet" - BUTTON_SAVE: "Tallenna" - BUTTON_ADD_FILTER: "Lisää suodatin" - BUTTON_DELETE: "Poista" - BUTTON_RAW_SCRIPT: "Käytä muokattua skriptiä" - SUBNAME_NONE: "Ei mitään" - SUBNAME_MOVE_TO: "Siirrä kansioon \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Välitä osoitteeseen \"%EMAIL%\"" - SUBNAME_REJECT: "Hylkää" - SUBNAME_VACATION_MESSAGE: "Lomaviesti" - SUBNAME_DISCARD: "Poista" - CAPABILITY_LABEL: "Valmius" - LOADING_PROCESS: "Asetetaan suodattimet" - DELETING_ASK: "Oletko varma?" - CHACHES_NEED_TO_BE_SAVED_DESC: "Nämä asetukset on tallennettava palvelimelle." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identiteetti" - LABEL_DISPLAY_NAME: "nimi" - LABEL_REPLY_TO: "Vastaa-osoite" - LABEL_SIGNATURE: "Allekirjoitus" - LABEL_ADD_SIGNATURE_TO_ALL: "Lisää allekirjoitus kaikkiin lähteviin viesteihin" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Turvallisuus" - LABEL_CONFIGURE_TWO_FACTOR: "Aseta 2-osainen tunnistus" - LABEL_AUTOLOGOUT: "Automaattinen uloskirjautuminen" - AUTOLOGIN_NEVER_OPTION_NAME: "Ei koskaan" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minuuttia" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% tuntia" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Yleiset" - LABEL_LANGUAGE: "Kieli" - LABEL_IDENTITY: "Identiteetti" - LABEL_LAYOUT: "Asettelu" - LABEL_LAYOUT_NO_SPLIT: "Ei jakoa" - LABEL_LAYOUT_VERTICAL_SPLIT: "Pystysuora jako" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Vaakataso jako" - LABEL_EDITOR: "Oletus tekstieditori" - LABEL_EDITOR_HTML: "Html" - LABEL_EDITOR_PLAIN: "Pelkkä teksti" - LABEL_EDITOR_HTML_FORCED: "Html (pakotettu)" - LABEL_EDITOR_PLAIN_FORCED: "Pelkkä teksti (pakotettu)" - LABEL_ANIMATION: "Käyttöliittymän animointi" - LABEL_ANIMATION_FULL: "Täysi" - LABEL_ANIMATION_NORMAL: "Normaali" - LABEL_ANIMATION_NONE: "Ei mitään" - LABEL_VIEW_OPTIONS: "Näyttö-valinnat" - LABEL_USE_PREVIEW_PANE: "Käytä esikatselua" - LABEL_USE_CHECKBOXES_IN_LIST: "Näytä valintaruudut listassa" - LABEL_USE_THREADS: "Käytä keskustelunäkymää" - LABEL_REPLY_SAME_FOLDER: "Siirrä vastaukset samaan kansioon vastattavien kanssa" - LABEL_SHOW_IMAGES: "Näytä aina ulkopuoliset kuvat viestissä" - LABEL_SHOW_ANIMATION: "Näytä animaatio" - LABEL_MESSAGE_PER_PAGE: "Viestiä sivulla" - LABEL_NOTIFICATIONS: "Ilmoitukset" - LABEL_SOUND_NOTIFICATION: "Äänimerkit" - LABEL_CHROME_NOTIFICATION_DESC: "Näytä uusien viestien ponnahdusikkuna" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Estetty selaimessa)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Yhteystiedot" - LABEL_CONTACTS_AUTOSAVE: "Lisää yhetystieto automaattisesti osoitekirjaan" - LEGEND_CONTACTS_SYNC: "Etä-synkronointi (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Aktivoi etä-synkronointi" - LABEL_CONTACTS_SYNC_SERVER: "Palvelin" - LABEL_CONTACTS_SYNC_AB_URL: "Osoitekirjan URL" - LABEL_CONTACTS_SYNC_USER: "Käyttäjä" - LABEL_CONTACTS_SYNC_PASSWORD: "Salasana" - SETTINGS_THEMES: - LEGEND_THEMES: "Teemat" - LEGEND_THEMES_CUSTOM: "Muokatun teeman asetukset" - LABEL_CUSTOM_TYPE: "Tyyppi" - LABEL_CUSTOM_TYPE_LIGHT: "Vaalea" - LABEL_CUSTOM_TYPE_DARK: "Tumma" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Tausta" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Lataa taustakuva (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "Tiedosto on liian iso" - ERROR_FILE_TYPE_ERROR: "Väärä tiedostotyyppi (ainoastaan JPG ja PNG)" - ERROR_UNKNOWN: "Tuntematon virhe ladattaessa" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Liitä Google" - BUTTON_GOOGLE_DISCONNECT: "Katkaise yhteys Googleen" - MAIN_GOOGLE_DESC: "Aktivoituasi Google kirjautumisen, voit kirjautua tälle tilille käyttämällä Google nappia kirjautumissivulla" - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Liitä Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Katkaise yhteys Facebookiin" - MAIN_FACEBOOK_DESC: "Aktivoituasi facebook kirjautumisen, voit kirjautua tälle tilille käyttämällä facebook nappia kirjautumissivulla" - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Yhdistä Twitter" - BUTTON_TWITTER_DISCONNECT: "Katkaise yhteys Twitteriin" - MAIN_TWITTER_DESC: "Aktivoituasi Twitter kirjautumisen, voit kirjautua tälle tilille käyttämällä Twitter nappia kirjautumissivulla" - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Kansiolista" - BUTTON_CREATE: "Luo Kansio" - BUTTON_SYSTEM: "Järjestelmäkansiot" - BUTTON_DELETE: "Poista" - BUTTON_SUBSCRIBE: "Tilaa" - BUTTON_UNSUBSCRIBE: "Peruuta tilaus" - LOADING_PROCESS: "Päivitetään listaa" - CREATING_PROCESS: "Luodaan kansiota" - DELETING_PROCESS: "Poistetaan kansiota" - RENAMING_PROCESS: "Uudelleennimetään kansiota" - DELETING_ASK: "Oletko varma?" - TO_MANY_FOLDERS_DESC_1: "Sinulla on liikaa kansioita!" - TO_MANY_FOLDERS_DESC_2: "Näytetään vain osa." - HELP_DELETE_FOLDER: "Poista kansio" - HELP_SHOW_HIDE_FOLDER: "Näytä/Piilota kansio" - HELP_CHECK_FOR_NEW_MESSAGES: "Tarkista/Älä tarkista uudet viestit" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Tilit" - LEGEND_IDENTITIES: "Identiteetit" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Tilit ja Identiteetit" - BUTTON_ADD_ACCOUNT: "Lisää Tili" - BUTTON_ADD_IDENTITY: "Lisää identiteetti" - BUTTON_DELETE: "Poista" - LOADING_PROCESS: "Päivitetään..." - DELETING_ASK: "Oletko varma?" - DEFAULT_IDENTITY_LABEL: "oletus" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identiteetti" - LEGEND_IDENTITIES: "Lisä identiteetit" - LABEL_DEFAULT: "Oletus" - LABEL_DISPLAY_NAME: "Nimi" - LABEL_REPLY_TO: "Vastaa osoite" - LABEL_SIGNATURE: "Allekirjoitus" - LABEL_ADD_SIGNATURE_TO_ALL: "Lisää allekirjoitus kaikkiin ulosmeneviin viesteihin" - BUTTON_ADD_IDENTITY: "Lisää identiteetti" - BUTTON_DELETE: "Poista" - LOADING_PROCESS: "Päivitetään identiteettilistaa" - DELETING_ASK: "Oletko varma?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Vaihda salasana" - LABEL_CURRENT_PASSWORD: "Nykyinen salasana" - LABEL_NEW_PASSWORD: "Uusi salasana" - LABEL_REPEAT_PASSWORD: "Vahvista uusi salasana" - BUTTON_UPDATE_PASSWORD: "Aseta uusi salasana" - ERROR_PASSWORD_MISMATCH: "Salasanat eivät täsmää, yritä uudelleen" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Tuo OpenPGP avain" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Luo OpenPGP avain" - TITLE_PRIVATE: "Yksityinen" - TITLE_PUBLIC: "Julkinen" - DELETING_ASK: "Oletko varma?" - GENERATE_ONLY_HTTPS: "Vain HTTPS" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Näppäimistö oikotie apu" - TAB_MAILBOX: "Postilaatikko" - TAB_MESSAGE_LIST: "Viestilista" - TAB_MESSAGE_VIEW: "Viestinäkymä" - TAB_COMPOSE: "Luo" - LABEL_OPEN_USER_DROPDOWN: "Avaa käyttäjävalikko" - LABEL_REPLY: "Vastaa" - LABEL_REPLY_ALL: "Vastaa kaikille" - LABEL_FORWARD: "Lähetä edelleen" - LABEL_FORWARD_MULTIPLY: "Lähetä edelleen liitteenä" - LABEL_HELP: "Ohje" - LABEL_CHECK_ALL: "Valitse kaikki viestit" - LABEL_ARCHIVE: "Arkisto" - LABEL_DELETE: "Poista" - LABEL_OPEN_THREAD: "Avaa valittu ketju" - LABEL_MOVE: "Siirrä" - LABEL_READ: "Lue valitut viestit" - LABEL_UNREAD: "Lukemattomat valitut viestit" - LABEL_IMPORTANT: "Tärkeät, merkitse valitut" - LABEL_SEARCH: "Etsi" - LABEL_CANCEL_SEARCH: "Peruuta etsi" - LABEL_FULLSCREEN_ENTER: "Koko näyttö (Esikatselu näkymä)" - LABEL_VIEW_MESSAGE_ENTER: "Katso viesti (Ei esikatselu näkymää)" - LABEL_SWITCH_TO_MESSAGE: "Fokusoi valittuu viestiin" - LABEL_SWITCH_TO_FOLDER_LIST: "Fokusoi viestilistaan" - LABEL_FULLSCREEN_TOGGLE: "Aseta täyden ruudun näkymä" - LABEL_BLOCKQUOTES_TOGGLE: "Aseta lainaus" - LABEL_THREAD_NEXT: "Seuraava viesti ketjussa" - LABEL_THREAD_PREV: "Edellinen viesti ketjussa" - LABEL_PRINT: "Tulosta" - LABEL_EXIT_FULLSCREEN: "Poistu täyden ruudun näkymästä" - LABEL_CLOSE_MESSAGE: "Sulje viesti" - LABEL_SWITCH_TO_LIST: "Fokusoi viestilistaan" - LABEL_OPEN_COMPOSE_POPUP: "Avaa luo viesti popup" - LABEL_MINIMIZE_COMPOSE_POPUP: "Sulje luo viesti popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Avaa idetiteetit valikko" - LABEL_SAVE_MESSAGE: "Tallenna viesti" - LABEL_SEND_MESSAGE: "Lähetä viesti" - LABEL_CLOSE_COMPOSE: "Sule luo viesti" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "Julkisia avaimia ei löytynyt" - NO_PUBLIC_KEYS_FOUND_FOR: "%EMAIL% lle ei löytynyt julkisia avaimia" - NO_PRIVATE_KEY_FOUND: "Ykrityistä avainta ei löytynyt" - NO_PRIVATE_KEY_FOUND_FOR: "%EMAIL% lle ei löytynyt yksityistä avainta" - ADD_A_PUBLICK_KEY: "Lisää julkinen avain" - SELECT_A_PRIVATE_KEY: "Valitse yksityinen avain" - UNVERIFIRED_SIGNATURE: "Tarkistamaton allekirjoitus" - DECRYPTION_ERROR: "OpenPGP avausvierhe" - GOOD_SIGNATURE: "Oikea allekirjoitus %USER% lle" - PGP_ERROR: "OpenPGP virhe: %ERROR%" - SPECIFY_FROM_EMAIL: "Aseta lähettäjän osoite" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Aseta vähintään yksi vastaanottaja" - NOTIFICATIONS: - INVALID_TOKEN: "Väärä suojaustunnus" - AUTH_ERROR: "Tunnistusvirhe" - ACCESS_ERROR: "Kirjautumisvirhe" - CONNECTION_ERROR: "Ei voi yhdistää palvelimeen" - CAPTCHA_ERROR: "Väärä CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Tätä some ID:tä ei ole liitetty mihinkään tiliin. Kirjaudu sähköpostiosoitteella - ja aktivoi tämä ominaisuus tilin asetuksissa. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Tätä some ID:tä ei ole liitetty mihinkään tiliin. Kirjaudu sähköpostiosoitteella - ja aktivoi tämä ominaisuus tilin asetuksissa. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Tätä some ID:tä ei ole liitetty mihinkään tiliin. Kirjaudu sähköpostiosoitteella - ja aktivoi tämä ominaisuus tilin asetuksissa. - DOMAIN_NOT_ALLOWED: "Verkkotunnus ei ole sallittu" - ACCOUNT_NOT_ALLOWED: "Tili ei ole sallittu" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2-osainen tunnistus vaaditaan" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2-osainen tunnistusvirhe" - COULD_NOT_SAVE_NEW_PASSWORD: "Salasanan tallennus ei onnistunut" - CURRENT_PASSWORD_INCORRECT: "Nykyinen salasana väärin" - NEW_PASSWORD_SHORT: "Salasana liian lyhyt" - NEW_PASSWORD_WEAK: "Salasana liian helppo" - NEW_PASSWORD_FORBIDDENT: "Salasana sisältää kiellettyjä merkkejä" - CONTACTS_SYNC_ERROR: "Yhteystietojen synkronointivirhe" - CANT_GET_MESSAGE_LIST: "Viestilistaa ei voi näyttää" - CANT_GET_MESSAGE: "Viestiä ei voi näyttää" - CANT_DELETE_MESSAGE: "Viestiä ei voi poistaa" - CANT_MOVE_MESSAGE: "Viestiä ei voi siirtää" - CANT_SAVE_MESSAGE: "Viestiä ei voi tallentaa" - CANT_SEND_MESSAGE: "Viestiä ei voi lähettää" - INVALID_RECIPIENTS: "Vastaanottajassa virhe" - CANT_SAVE_FILTERS: "Suodattimia ei voi tallentaa" - CANT_GET_FILTERS: "Suodattimia ei voi ladata" - FILTERS_ARE_NOT_CORRECT: "Suodattimet väärin" - CANT_CREATE_FOLDER: "Kansiota ei voi luoda" - CANT_RENAME_FOLDER: "Kansiota ei voi uudelleennimetä" - CANT_DELETE_FOLDER: "Kansiota ei voi poistaa" - CANT_DELETE_NON_EMPTY_FOLDER: "Kansiossa on viestejä, ei voi poistaa" - CANT_SUBSCRIBE_FOLDER: "Kansiota ei voi tilata" - CANT_UNSUBSCRIBE_FOLDER: "Kansiotilausta ei voi peruuttaa" - CANT_SAVE_SETTINGS: "Asetuksia ei voi tallentaa" - CANT_SAVE_PLUGIN_SETTINGS: "Asetuksia ei voi tallentaa" - DOMAIN_ALREADY_EXISTS: "Verkkotunnus on jo olemassa" - CANT_INSTALL_PACKAGE: "Pakkauksen asennus epäonnistui" - CANT_DELETE_PACKAGE: "Pakkauksen poisto epäonnistui" - INVALID_PLUGIN_PACKAGE: "Viallinen paketti" - UNSUPPORTED_PLUGIN_PACKAGE: "Ei-tuettu plugin paketti" - LICENSING_SERVER_IS_UNAVAILABLE: "Tilauspalvelin ei ole saatavilla" - LICENSING_DOMAIN_EXPIRED: "Tämän verkkotunnuksen tilaus on päättynyt." - LICENSING_DOMAIN_BANNED: "Tämän verkkotunnuksen tilaus on estetty." - DEMO_SEND_MESSAGE_ERROR: "Turvallisuus syistä tältä tililtä ei voi lähettää viestejä ulkopuolisiin osoitteisiin!" - DEMO_ACCOUNT_ERROR: "Turvallisuus syistä tämä ei ole sallittua!" - ACCOUNT_ALREADY_EXISTS: "Tili on jo olemassa." - ACCOUNT_DOES_NOT_EXIST: "Tiliä ei ole olemassa" - MAIL_SERVER_ERROR: "Palvelinyhteydessä tapahtui virhe" - INVALID_INPUT_ARGUMENT: "Virheelinen komento" - UNKNOWN_ERROR: "Tuntematon virhe" - STATIC: - BACK_LINK: "Lataa uudelleen" - DOMAIN_LIST_DESC: "Lista sallituista verkkotunnuksista" - PHP_EXSTENSIONS_ERROR_DESC: "Vaadittava PHP lisäosa ei ole saatavilla PHP konfiguraatiossa!" - PHP_VERSION_ERROR_DESC: "PHP versiosi (%VERSION%) on alle vaaditun 5.3.0!" - NO_SCRIPT_TITLE: "JavaScript vaaditaan." - NO_SCRIPT_DESC: | - JavaScript tuki ei ole saatavilla selaimessasi. - Aktivoi JavaScript selaimessasi ja yritä uudelleen. - NO_COOKIE_TITLE: "Eväste-tuki vaaditaan." - NO_COOKIE_DESC: | - Eväste (cookie) tuki ei ole saatavilla selaimessasi. - Aktivoi evästeet (cookiet) selaimessasi ja yritä uudelleen. - BAD_BROWSER_TITLE: "Selaimesi on vanhentunut." - BAD_BROWSER_DESC: | - Käyttääksesi kaikkia ominaisuuksia, - lataa ja asenna jokin näistä selaimista: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fr_FR.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fr_FR.yml deleted file mode 100755 index 84a9671b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/fr_FR.yml +++ /dev/null @@ -1,717 +0,0 @@ -fr_FR: - LOGIN: - LABEL_EMAIL: "Email" - LABEL_LOGIN: "Identifiant" - LABEL_PASSWORD: "Mot de passe" - LABEL_SIGN_ME: "Se souvenir de moi" - LABEL_VERIFICATION_CODE: "Code de vérification" - LABEL_DONT_ASK_VERIFICATION_CODE: "Ne plus demander le code pendant 2 semaines" - BUTTON_SIGN_IN: "Se connecter" - TITLE_SIGN_IN_GOOGLE: "Se connecter avec Google" - TITLE_SIGN_IN_FACEBOOK: "Se connecter avec Facebook" - TITLE_SIGN_IN_TWITTER: "Se connecter avec Twitter" - LABEL_FORGOT_PASSWORD: "Mot de passe oublié" - LABEL_REGISTRATION: "S'enregistrer" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Ajouter un compte" - BUTTON_SETTINGS: "Paramètres" - BUTTON_HELP: "Aide" - BUTTON_LOGOUT: "Déconnexion" - MOBILE: - BUTTON_MOBILE_VERSION: "Version mobile" - BUTTON_DESKTOP_VERSION: "Version grand écran" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Recherche" - TITLE_ADV: "Recherche avancée" - LABEL_ADV_FROM: "De" - LABEL_ADV_TO: "À" - LABEL_ADV_SUBJECT: "Objet" - LABEL_ADV_TEXT: "Texte" - LABEL_ADV_HAS_ATTACHMENT: "Pièce jointe" - LABEL_ADV_HAS_ATTACHMENTS: "Pièces jointes" - LABEL_ADV_FLAGGED: "Signalé" - LABEL_ADV_UNSEEN: "Non lu" - LABEL_ADV_DATE: "Date" - LABEL_ADV_DATE_ALL: "Tous" - LABEL_ADV_DATE_3_DAYS: "Jusqu'à 3 jours" - LABEL_ADV_DATE_7_DAYS: "Jusqu'à 1 semaine" - LABEL_ADV_DATE_MONTH: "Jusqu'à 1 mois" - LABEL_ADV_DATE_3_MONTHS: "Jusqu'à 3 mois" - LABEL_ADV_DATE_6_MONTHS: "Jusqu'à 6 mois" - LABEL_ADV_DATE_YEAR: "Jusqu'à 1 an" - BUTTON_ADV_SEARCH: "Rechercher" - PREVIEW_POPUP: - FULLSCREEN: "Basculer en plein écran" - ZOOM: "Zoom Avant/Arrière" - CLOSE: "Fermer (Esc)" - LOADING: "Chargement..." - GALLERY_PREV: "Précédent (flèche gauche)" - GALLERY_NEXT: "Suivant (flèche droite)" - GALLERY_COUNTER: "%curr% de %total%" - IMAGE_ERROR: "L'image ne peut être chargée." - AJAX_ERROR: "Le contenu ne peut être chargé." - FOLDER_LIST: - BUTTON_COMPOSE: "Nouveau message" - BUTTON_CONTACTS: "Contacts" - BUTTON_NEW_MESSAGE: "Nouveau message" - INBOX_NAME: "Boîte de réception" - SENT_NAME: "Envoyés" - DRAFTS_NAME: "Brouillons" - SPAM_NAME: "Indésirables" - TRASH_NAME: "Corbeille" - ARCHIVE_NAME: "Archive" - QUOTA: - TITLE: "Quota" - MESSAGE_LIST: - BUTTON_RELOAD: "Recharger la liste des messages" - BUTTON_MOVE_TO: "Déplacer vers" - BUTTON_DELETE: "Supprimer" - BUTTON_ARCHIVE: "Archiver" - BUTTON_SPAM: "Indésirable" - BUTTON_NOT_SPAM: "Acceptable" - BUTTON_EMPTY_FOLDER: "Vider le dossier" - BUTTON_MULTY_FORWARD: "Transmettre les messages" - BUTTON_DELETE_WITHOUT_MOVE: "Supprimer définitivement" - BUTTON_MORE: "Plus" - MENU_SET_SEEN: "Marquer comme lu" - MENU_SET_ALL_SEEN: "Marquer tous comme lus" - MENU_UNSET_SEEN: "Marquer comme non-lu" - MENU_SET_FLAG: "Signaler" - MENU_UNSET_FLAG: "Enlever le signal" - MENU_SELECT_ALL: "Tous" - MENU_SELECT_NONE: "Aucun" - MENU_SELECT_INVERT: "Inverser" - MENU_SELECT_UNSEEN: "Non-lu" - MENU_SELECT_SEEN: "Lu" - MENU_SELECT_FLAGGED: "Signalés" - MENU_SELECT_UNFLAGGED: "Non signalés" - EMPTY_LIST: "Liste vide." - EMPTY_SEARCH_LIST: "Aucun message ne correspond à votre recherche." - SEARCH_RESULT_FOR: "Résultats de recherche pour \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "retour à la liste des messages" - LIST_LOADING: "Chargement" - EMPTY_SUBJECT_TEXT: "(Pas d'objet)" - PUT_MESSAGE_HERE: "Glisser un message ici pour l'afficher dans la liste" - TODAY_AT: "aujourd'hui à %TIME%" - YESTERDAY_AT: "hier à %TIME%" - SEARCH_PLACEHOLDER: "Recherche" - NEW_MESSAGE_NOTIFICATION: "Vous avez %COUNT% nouveaux messages !" - QUOTA_SIZE: "Vous utilisez %SIZE% (%PROC%%) sur %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Modifier" - BUTTON_BACK: "Retour" - BUTTON_CLOSE: "Fermer" - BUTTON_DELETE: "Supprimer" - BUTTON_UNSUBSCRIBE: "Se désinscrire de cette liste" - BUTTON_ARCHIVE: "Archive" - BUTTON_SPAM: "Indésirable" - BUTTON_NOT_SPAM: "Acceptable" - BUTTON_MOVE_TO: "Déplacer vers" - BUTTON_MORE: "Plus" - BUTTON_REPLY: "Répondre" - BUTTON_REPLY_ALL: "Répondre à tous" - BUTTON_FORWARD: "Transférer" - BUTTON_FORWARD_AS_ATTACHMENT: "Transférer comme pièce-jointe" - BUTTON_EDIT_AS_NEW: "Éditer comme nouveau" - BUTTON_SHOW_IMAGES: "Afficher les images" - BUTTON_NOTIFY_READ_RECEIPT: "L'expéditeur a demandé à être prévenu lorsque vous lirez ce message." - BUTTON_IN_NEW_WINDOW: "Voir dans une nouvelle fenêtre" - BUTTON_THREAD_LIST: "Liste des discussions" - BUTTON_THREAD_PREV: "Précédent" - BUTTON_THREAD_NEXT: "Suivant" - BUTTON_THREAD_MORE: "Plus de messages" - MENU_HEADERS: "Voir les en-têtes du message" - MENU_VIEW_ORIGINAL: "Voir la source" - MENU_DOWNLOAD_ORIGINAL: "Télécharger comme fichier .eml" - MENU_FILTER_SIMILAR: "Filtrer les messages similaires" - MENU_PRINT: "Imprimer" - EMPTY_SUBJECT_TEXT: "(Pas d'objet)" - LABEL_SUBJECT: "Objet" - LABEL_DATE: "Date" - LABEL_FROM: "De" - LABEL_FROM_SHORT: "de" - LABEL_TO: "À" - LABEL_TO_SHORT: "à" - LABEL_CC: "CC" - LABEL_BCC: "CCI" - LABEL_REPLY_TO: "Répondre à" - PRINT_LABEL_FROM: "De" - PRINT_LABEL_TO: "À" - PRINT_LABEL_CC: "CC" - PRINT_LABEL_BCC: "CCI" - PRINT_LABEL_REPLY_TO: "Répondre à" - PRINT_LABEL_DATE: "Date" - PRINT_LABEL_SUBJECT: "Objet" - PRINT_LABEL_ATTACHMENTS: "Pièces jointes" - MESSAGE_LOADING: "Chargement" - MESSAGE_VIEW_DESC: "Sélectionner un message dans la liste pour l'afficher ici." - MESSAGE_VIEW_MOVE_DESC: "Cliquez sur le nom du dossier dans le panneau de gauche pour sélectionner la destination." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Mot de passe" - PGP_SIGNED_MESSAGE_DESC: "Message signé par OpenPGP (cliquer pour vérifier)" - PGP_ENCRYPTED_MESSAGE_DESC: "Message chiffré par OpenPGP (cliquer pour déchiffrer)" - LINK_DOWNLOAD_AS_ZIP: "Télécharger le zip" - LINK_SAVE_TO_OWNCLOUD: "Enregistrer sur ownCloud" - LINK_SAVE_TO_CLOUD: "Enregistrer sur le cloud" - LINK_SAVE_TO_DROPBOX: "Enregistrer sur Dropbox" - READ_RECEIPT: - SUBJECT: "Accusé de réception (affiché) - %SUBJECT%" - BODY: | - Il s'agit d'un accusé de réception pour le courrier que vous avez envoyé à %READ-RECEIPT%. - - Note: Cet accusé de réception reconnaît que le message a été affiché sur l'ordinateur du destinataire. - Il n'y a aucune garantie que le destinataire ait lu ou compris le contenu du message. - SUGGESTIONS: - SEARCHING_DESC: "Recherche..." - CONTACTS: - LEGEND_CONTACTS: "Carnet d'adresses" - SEARCH_INPUT_PLACEHOLDER: "Recherche" - BUTTON_ADD_CONTACT: "Ajouter un contact" - BUTTON_CREATE_CONTACT: "Créer" - BUTTON_UPDATE_CONTACT: "Modifier" - BUTTON_IMPORT: "Importer (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Exporter (vcf, vCard)" - BUTTON_EXPORT_CSV: "Exporter (csv)" - ERROR_IMPORT_FILE: "Erreur d'importation (format de fichier invalide)" - LIST_LOADING: "Chargement" - EMPTY_LIST: "Aucun contact" - EMPTY_SEARCH: "Aucun contact trouvé" - CLEAR_SEARCH: "Effacer la recherche" - CONTACT_VIEW_DESC: "Sélectionner un contact dans la liste pour l'afficher ici." - LABEL_DISPLAY_NAME: "Nom affiché" - LABEL_EMAIL: "Email" - LABEL_PHONE: "Téléphone" - LABEL_WEB: "Web" - LABEL_BIRTHDAY: "Anniversaire" - LINK_ADD_EMAIL: "Ajouter une adresse email" - LINK_ADD_PHONE: "Ajouter un numéro de téléphone" - LINK_BIRTHDAY: "Anniversaire" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Entrez le nom à afficher" - PLACEHOLDER_ENTER_LAST_NAME: "Entrez votre nom" - PLACEHOLDER_ENTER_FIRST_NAME: "Entrez votre prénom" - PLACEHOLDER_ENTER_NICK_NAME: "Enter le pseudonyme" - LABEL_READ_ONLY: "Lecture seule" - LABEL_SHARE: "Partager" - ADD_MENU_LABEL: "Ajouter" - ADD_MENU_NICKNAME: "Pseudonyme" - ADD_MENU_NOTES: "Notes" - ADD_MENU_EMAIL: "Email" - ADD_MENU_PHONE: "Téléphone" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Adresse" - ADD_MENU_BIRTHDAY: "Anniversaire" - ADD_MENU_TAGS: "Tags" - BUTTON_SHARE_NONE: "Personne" - BUTTON_SHARE_ALL: "Tout le monde" - BUTTON_SYNC: "Synchronisation (CardDAV)" - COMPOSE: - TITLE_FROM: "De" - TITLE_TO: "À" - TITLE_CC: "CC" - TITLE_BCC: "CCI" - TITLE_REPLY_TO: "Répondre à" - TITLE_SUBJECT: "Sujet" - LINK_SHOW_INPUTS: "voir tous les champs" - BUTTON_SEND: "Envoyer" - BUTTON_SAVE: "Enregistrer" - BUTTON_DELETE: "Supprimer" - BUTTON_CANCEL: "Annuler" - BUTTON_MINIMIZE: "Réduire" - SAVED_TIME: "Enregistré à %TIME%" - SAVED_ERROR_ON_SEND: "Le message a été envoyé mais n'a pas été enregistré dans le dossier des messages envoyés" - DISCARD_UNSAVED_DATA: "Abandonner les données non enregistrées ?" - ATTACH_FILES: "Joindre des fichiers" - ATTACH_DROP_FILES_DESC: "Glisser les fichiers ici" - ATTACH_ITEM_CANCEL: "Annuler" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME% %EMAIL% a écrit" - FORWARD_MESSAGE_TOP_TITLE: "-------- Message transféré -------" - FORWARD_MESSAGE_TOP_FROM: "De" - FORWARD_MESSAGE_TOP_TO: "À" - FORWARD_MESSAGE_TOP_CC: "CC" - FORWARD_MESSAGE_TOP_SENT: "Envoyé" - FORWARD_MESSAGE_TOP_SUBJECT: "Objet" - EMPTY_TO_ERROR_DESC: "Merci de spécifier au moins un destinataire" - NO_ATTACHMENTS_HERE_DESC: "Aucune pièce jointe." - ATTACHMENTS_ERROR_DESC: "Attention ! Toutes les pièces jointes n'ont pas été téléchargées." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Toutes les pièces jointes n'ont pas encore été téléchargées" - BUTTON_REQUEST_READ_RECEIPT: "Demander une confirmation de lecture" - BUTTON_MARK_AS_IMPORTANT: "Marquer comme important" - BUTTON_OPEN_PGP: "OpenPGP (Texte non formaté uniquement)" - BUTTON_REQUEST_DSN: "Demander un accusé de réception" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Fermer" - POPUPS_ASK: - BUTTON_YES: "Oui" - BUTTON_NO: "Non" - DESC_WANT_CLOSE_THIS_WINDOW: "Êtes-vous sûr de vouloir fermer cette fenêtre ?" - DESC_WANT_DELETE_MESSAGES: "Êtes-vous sûr de vouloir supprimer ce(s) message(s) ?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Choisir la langue" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Ajouter un compte ?" - BUTTON_ADD_ACCOUNT: "Ajouter" - TITLE_UPDATE_ACCOUNT: "Mettre à jour le compte ?" - BUTTON_UPDATE_ACCOUNT: "Mettre à jour" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Ajouter une identité ?" - TITLE_UPDATE_IDENTITY: "Mettre à jour l'identité ?" - BUTTON_ADD_IDENTITY: "Ajouter" - BUTTON_UPDATE_IDENTITY: "Mettre à jour" - LABEL_EMAIL: "Adresse email" - LABEL_NAME: "Nom" - LABEL_REPLY_TO: "Répondre à" - LABEL_SIGNATURE: "Signature" - LABEL_CC: "Cc" - LABEL_BCC: "Cci" - LABEL_SIGNATURE_INSERT_BEFORE: "Insérer la signature avant le texte cité dans les réponses" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Créer un dossier ?" - LABEL_NAME: "Nom du dossier" - LABEL_PARENT: "Dossier parent" - BUTTON_CREATE: "Créer" - BUTTON_CANCEL: "Annuler" - BUTTON_CLOSE: "Fermer" - TITLE_CREATING_PROCESS: "Création du dossier" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Purger tous les messages du dossier ?" - BUTTON_CLEAR: "Vider" - BUTTON_CANCEL: "Annuler" - BUTTON_CLOSE: "Fermer" - DANGER_DESC_WARNING: "ATTENTION !" - DANGER_DESC_HTML_1: "Cette action effacera tous les emails du dossier %FOLDER% de manière définitive." - DANGER_DESC_HTML_2: "Une fois lancé, le processus ne peut pas être interrompu ou annulé." - TITLE_CLEARING_PROCESS: "Purge du dossier..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Importer la clef OpenPGP" - BUTTON_IMPORT_OPEN_PGP_KEY: "Importer" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Voir la clef OpenPGP" - BUTTON_SELECT: "Sélectionner" - BUTTON_CLOSE: "Fermer" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Générer les clés OpenPGP" - LABEL_EMAIL: "Email" - LABEL_NAME: "Nom" - LABEL_PASSWORD: "Mot de passe" - LABEL_KEY_BIT_LENGTH: "Longueur de la clé" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Générer" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "Signer/chiffrer avec OpenPGP" - LABEL_SIGN: "Signer" - LABEL_ENCRYPT: "Chiffer" - LABEL_PASSWORD: "Mot de passe" - BUTTON_SIGN: "Signer" - BUTTON_ENCRYPT: "Chiffrer" - BUTTON_SIGN_AND_ENCRYPT: "Signer et chiffrer" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" - LABEL_KEY: "Clé Privée" - LABEL_PASSWORD: "Mot de passe" - BUTTON_DECRYPT: "Déchiffrer" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "Test d'authentification en deux étapes" - LABEL_CODE: "Code" - BUTTON_TEST: "Test" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Créer un filtre ?" - TITLE_EDIT_FILTER: "Mettre à jour le filtre ?" - FILTER_NAME: "Nom" - LEGEND_CONDITIONS: "Conditions" - LEGEND_ACTIONS: "Actions" - BUTTON_DONE: "Fait" - BUTTON_ADD_CONDITION: "Ajouter une condition" - SELECT_ACTION_NONE: "Aucune" - SELECT_ACTION_MOVE_TO: "Déplacer vers" - SELECT_ACTION_FORWARD_TO: "Faire suivre à" - SELECT_ACTION_REJECT: "Rejeter" - SELECT_ACTION_VACATION_MESSAGE: "Message d'absence" - SELECT_ACTION_DISCARD: "Exclure" - SELECT_FIELD_FROM: "De" - SELECT_FIELD_RECIPIENTS: "Destinataires (A ou CC)" - SELECT_FIELD_SUBJECT: "Sujet" - SELECT_FIELD_HEADER: "En-tête" - SELECT_FIELD_SIZE: "Taille" - SELECT_TYPE_CONTAINS: "Contient" - SELECT_TYPE_NOT_CONTAINS: "Ne contient pas" - SELECT_TYPE_MATCHES: "Substitutions (* et ? supportés)" - SELECT_TYPE_NOT_MATCHES: "Pas de substitutions (* et ? supportés)" - SELECT_TYPE_REGEXP: "Expression régulière" - SELECT_TYPE_NOT_REGEXP: "Pas d'expression régulière" - SELECT_TYPE_EQUAL_TO: "Égal à" - SELECT_TYPE_NOT_EQUAL_TO: "Différent de" - SELECT_TYPE_OVER: "Au-dessus de" - SELECT_TYPE_UNDER: "Au-dessous de" - SELECT_MATCH_ANY: "Correspondant à l'une des règles suivantes" - SELECT_MATCH_ALL: "Correspondant à toutes les règles suivantes" - MARK_AS_READ_LABEL: "Marquer comme lu" - REPLY_INTERVAL_LABEL: "Délai de réponse (jours)" - KEEP_LABEL: "Garder" - STOP_LABEL: "Ne pas arrêter le traitement des règles" - EMAIL_LABEL: "Email" - VACATION_SUBJECT_LABEL: "Sujet (optionnel)" - VACATION_MESSAGE_LABEL: "Message" - VACATION_RECIPIENTS_LABEL: "Destinataires (séparés par des virgules)" - REJECT_MESSAGE_LABEL: "Message rejeté" - ALL_INCOMING_MESSAGES_DESC: "Tous les messages entrants" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Sélectionner les dossiers systèmes" - SELECT_CHOOSE_ONE: "Faites un choix" - SELECT_UNUSE_NAME: "Ne pas utiliser" - LABEL_SENT: "Envoyés" - LABEL_DRAFTS: "Brouillons" - LABEL_SPAM: "Indésirables" - LABEL_TRASH: "Corbeille" - LABEL_ARCHIVE: "Archiver" - BUTTON_CANCEL: "Annuler" - BUTTON_CLOSE: "Fermer" - NOTIFICATION_SENT: | - Vous n'avez pas sélectionné de dossier "Envoyés" où copier les messages après envoi. - Si vous ne souhaitez pas enregistrer une copie des messages envoyés, sélectionnez l'option "Ne pas utiliser". - NOTIFICATION_DRAFTS: "Vous n'avez pas sélectionné de dossier \"Brouillons\" où enregistrer les messages en cours de rédaction." - NOTIFICATION_SPAM: | - Vous n'avez pas sélectionné de dossier "Spam" où placer les indésirables. - Si vous ne souhaitez pas supprimer définitivement les messages, sélectionnez l'option "Ne pas utiliser". - NOTIFICATION_TRASH: | - Vous n'avez pas sélectionné de dossier "Corbeille" où placer les messages supprimés. - Si vous ne souhaitez pas supprimer définitivement les messages, sélectionnez l'option "Ne pas utiliser". - NOTIFICATION_ARCHIVE: "Vous n'avez pas sélectionné de dossier \"Archive\" où placer les messages archivés.\n" - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "Authentification en deux étapes" - LABEL_ENABLE_TWO_FACTOR: "Activer l'authentification en deux étapes" - LABEL_TWO_FACTOR_USER: "Utilisateur" - LABEL_TWO_FACTOR_STATUS: "Statut" - LABEL_TWO_FACTOR_SECRET: "Secret" - LABEL_TWO_FACTOR_BACKUP_CODES: "Code de sauvegarde" - BUTTON_CREATE: "Créer une nouvelle clé secrète" - BUTTON_ACTIVATE: "Activer" - BUTTON_CLEAR: "Effacer" - BUTTON_LOGOUT: "Déconnexion" - BUTTON_DONE: "Fait" - BUTTON_TEST: "Tester" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Montrer la clé secrète" - BUTTON_HIDE_SECRET: "Masquer la clé secrète" - TWO_FACTOR_REQUIRE_DESC: "Votre compte requiert la configuration d'une vérification en deux étapes." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configuré" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Non configuré" - TWO_FACTOR_SECRET_DESC: >- - Importez ces informations dans votre client Google Authenticator (ou un autre - client TOTP) en utilisant le code QR fourni ci-dessous ou en entrant les valeurs - manuellement. - TWO_FACTOR_BACKUP_CODES_DESC: >- - Si vous ne pouvez pas recevoir les codes par Google Authenticator, vous pouvez - utiliser les codes de sauvegarde pour vous connecter. Après avoir fait cela, - il deviendra inactif. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Vous ne pouvez pas modifier ce paramètre avant de l'avoir essayé." - TITLES: - LOADING: "Chargement" - LOGIN: "Identifiant" - MAILBOX: "Boîte mail" - SETTINGS: "Paramètres" - COMPOSE: "Nouveau message" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Le fichier est trop volumineux" - ERROR_FILE_PARTIALLY_UPLOADED: "Le fichier a été envoyé partiellement à cause d'une erreur inconnue" - ERROR_NO_FILE_UPLOADED: "Aucun fichier téléversé" - ERROR_MISSING_TEMP_FOLDER: "Le fichier temporaire est manquant" - ERROR_ON_SAVING_FILE: "Une erreur inconnue s'est produite" - ERROR_FILE_TYPE: "Type de fichier invalide" - ERROR_UNKNOWN: "Une erreur inconnue de téléversement de fichier s'est produite" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> Non-formaté" - TEXT_SWITCHER_RICH_FORMATTING: "Format riche" - TEXT_SWITCHER_CONFIRM: "Le formatage du texte et les images seront perdus. Êtes-vous sûr de vouloir continuer ?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Personnel" - LABEL_GENERAL_NAME: "Général" - LABEL_CONTACTS_NAME: "Contacts" - LABEL_FOLDERS_NAME: "Dossiers" - LABEL_ACCOUNTS_NAME: "Comptes" - LABEL_IDENTITY_NAME: "Identité" - LABEL_IDENTITIES_NAME: "Identités" - LABEL_FILTERS_NAME: "Filtres" - LABEL_TEMPLATES_NAME: "Modèles" - LABEL_SECURITY_NAME: "Sécurité" - LABEL_SOCIAL_NAME: "Social" - LABEL_THEMES_NAME: "Thèmes" - LABEL_CHANGE_PASSWORD_NAME: "Mot de passe" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Retour" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filtres" - BUTTON_SAVE: "Enregistrer" - BUTTON_ADD_FILTER: "Ajouter un filtre" - BUTTON_DELETE: "Effacer" - BUTTON_RAW_SCRIPT: "Utiliser le script d'un utilisateur" - SUBNAME_NONE: "Aucun" - SUBNAME_MOVE_TO: "Déplacer vers \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Faire suivre à \"%EMAIL%\"" - SUBNAME_REJECT: "Rejeter" - SUBNAME_VACATION_MESSAGE: "Message d'absence" - SUBNAME_DISCARD: "Exclure" - CAPABILITY_LABEL: "Capacité" - LOADING_PROCESS: "Mise à jour de la liste de filtres" - DELETING_ASK: "Êtes-vous sûr ?" - CHACHES_NEED_TO_BE_SAVED_DESC: "Ces changements doivent être enregistrés sur le serveur." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identité" - LABEL_DISPLAY_NAME: "Nom" - LABEL_REPLY_TO: "Répondre à" - LABEL_SIGNATURE: "Signature" - LABEL_ADD_SIGNATURE_TO_ALL: "Ajouter votre signature à tous les messages sortants" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Sécurité" - LABEL_CONFIGURE_TWO_FACTOR: "Configurer l'authentification en deux étapes" - LABEL_AUTOLOGOUT: "Déconnexion automatique" - AUTOLOGIN_NEVER_OPTION_NAME: "Jamais" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% heure(s)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Général" - LABEL_LANGUAGE: "Langue" - LABEL_IDENTITY: "Identité" - LABEL_LAYOUT: "Disposition" - LABEL_LAYOUT_NO_SPLIT: "Pas de séparation" - LABEL_LAYOUT_VERTICAL_SPLIT: "Séparation verticale" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Séparation horizontale" - LABEL_EDITOR: "Éditeur de texte par défaut" - LABEL_EDITOR_HTML: "HTML" - LABEL_EDITOR_PLAIN: "Non-formaté" - LABEL_EDITOR_HTML_FORCED: "HTML (forcé)" - LABEL_EDITOR_PLAIN_FORCED: "Non-formaté (forcé)" - LABEL_ANIMATION: "Animation de l'interface" - LABEL_ANIMATION_FULL: "Plein" - LABEL_ANIMATION_NORMAL: "Normal" - LABEL_ANIMATION_NONE: "Aucune" - LABEL_VIEW_OPTIONS: "Voir les options" - LABEL_USE_PREVIEW_PANE: "Utiliser le panneau de prévisualisation" - LABEL_USE_CHECKBOXES_IN_LIST: "Afficher des cases à cocher dans la liste" - LABEL_USE_THREADS: "Regrouper en conversations" - LABEL_REPLY_SAME_FOLDER: "Placer les réponses dans le dossier du message" - LABEL_SHOW_IMAGES: "Toujours afficher les images dans le mail" - LABEL_SHOW_ANIMATION: "Voir les animations" - LABEL_MESSAGE_PER_PAGE: "Messages par page" - LABEL_NOTIFICATIONS: "Notifications" - LABEL_SOUND_NOTIFICATION: "Son de notification" - LABEL_CHROME_NOTIFICATION_DESC: "Afficher un pop-up de notification pour les nouveaux messages" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Bloqué par le navigateur)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Contacts" - LABEL_CONTACTS_AUTOSAVE: "Ajouter automatiquement les destinataires à votre carnet d'adresses" - LEGEND_CONTACTS_SYNC: "Synchronisation à distance (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Activer la synchronisation à distance" - LABEL_CONTACTS_SYNC_SERVER: "Serveur" - LABEL_CONTACTS_SYNC_AB_URL: "URL du carnet d'adresses" - LABEL_CONTACTS_SYNC_USER: "Utilisateur" - LABEL_CONTACTS_SYNC_PASSWORD: "Mot de passe" - SETTINGS_THEMES: - LEGEND_THEMES: "Thèmes" - LEGEND_THEMES_CUSTOM: "Configuration du thème personnel" - LABEL_CUSTOM_TYPE: "Type" - LABEL_CUSTOM_TYPE_LIGHT: "Lumineux" - LABEL_CUSTOM_TYPE_DARK: "Sombre" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Image de fond" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Envoyer une image de fond (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "Fichier trop volumineux" - ERROR_FILE_TYPE_ERROR: "Type de fichier invalide (JPG et PNG seulement)" - ERROR_UNKNOWN: "Une erreur inconnue de téléversement de fichier s'est produite" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Se connecter à Google" - BUTTON_GOOGLE_DISCONNECT: "Se déconnecter de Google" - MAIN_GOOGLE_DESC: "Après l'activation de la connexion via Google, vous pouvez vous connecter à ce compte en utilisant le bouton Google sur l'écran de connexion." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Se connecter à Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Se déconnecter de Facebook" - MAIN_FACEBOOK_DESC: "Après l'activation de la connexion via Facebook, vous pouvez vous connecter à ce compte en utilisant le bouton Facebook sur l'écran de connexion." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Se connecter à Twitter" - BUTTON_TWITTER_DISCONNECT: "Se déconnecter de Twitter" - MAIN_TWITTER_DESC: "Après l'activation de la connexion via Twitter, vous pouvez vous connecter à ce compte en utilisant le bouton Twitter sur l'écran de connexion." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Liste des dossiers" - BUTTON_CREATE: "Créer un dossier" - BUTTON_SYSTEM: "Dossiers systèmes" - BUTTON_DELETE: "Supprimer" - BUTTON_SUBSCRIBE: "S'abonner" - BUTTON_UNSUBSCRIBE: "Se désabonner" - LOADING_PROCESS: "Mise à jour de la liste des dossiers" - CREATING_PROCESS: "Création d'un dossier" - DELETING_PROCESS: "Suppression d'un dossier" - RENAMING_PROCESS: "Renommer un dossier" - DELETING_ASK: "Êtes-vous sûr ?" - TO_MANY_FOLDERS_DESC_1: "Vous avez trop de dossiers !" - TO_MANY_FOLDERS_DESC_2: "Seulement une partie d'entre eux ont été affichés afin de limiter les problèmes de performance." - HELP_DELETE_FOLDER: "Supprimer le dossier" - HELP_SHOW_HIDE_FOLDER: "Afficher/masquer le dossier" - HELP_CHECK_FOR_NEW_MESSAGES: "Cocher/Décocher pour les nouveaux messages" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Liste des comptes" - LEGEND_IDENTITIES: "Identités" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Comptes et Identités" - BUTTON_ADD_ACCOUNT: "Ajouter un compte" - BUTTON_ADD_IDENTITY: "Ajouter une identité" - BUTTON_DELETE: "Supprimer" - LOADING_PROCESS: "Mise à jour de la liste des comptes" - DELETING_ASK: "Êtes-vous sûr ?" - DEFAULT_IDENTITY_LABEL: "défaut" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identité" - LEGEND_IDENTITIES: "Identités supplémentaires" - LABEL_DEFAULT: "Défaut" - LABEL_DISPLAY_NAME: "Nom" - LABEL_REPLY_TO: "Répondre à" - LABEL_SIGNATURE: "Signature" - LABEL_ADD_SIGNATURE_TO_ALL: "Ajouter votre signature à tous les messages sortants" - BUTTON_ADD_IDENTITY: "Ajouter une identitié" - BUTTON_DELETE: "Supprimer" - LOADING_PROCESS: "Met à jour la liste d'identités" - DELETING_ASK: "Êtes-vous sûr ?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Modifier le mot de passe" - LABEL_CURRENT_PASSWORD: "Mot de passe actuel" - LABEL_NEW_PASSWORD: "Nouveau mot de passe" - LABEL_REPEAT_PASSWORD: "Confirmation du nouveau mot de passe" - BUTTON_UPDATE_PASSWORD: "Enregistrer le nouveau mot de passe" - ERROR_PASSWORD_MISMATCH: "Les mots de passe ne correspondent pas, merci de réessayer" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Importer la clé OpenPGP" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Générer les clés OpenPGP" - TITLE_PRIVATE: "Privée" - TITLE_PUBLIC: "Publique" - DELETING_ASK: "Êtes-vous sûr ?" - GENERATE_ONLY_HTTPS: "HTTPS seulement" - LABEL_ALLOW_DRAFT_AUTOSAVE: "Brouillon sauvegardé automatiquement" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Aide pour les raccourcis clavier" - TAB_MAILBOX: "Boîte aux lettres" - TAB_MESSAGE_LIST: "Liste des messages" - TAB_MESSAGE_VIEW: "Message" - TAB_COMPOSE: "Écrire" - LABEL_OPEN_USER_DROPDOWN: "Ouvrir la liste déroulante des utilisateurs" - LABEL_REPLY: "Répondre" - LABEL_REPLY_ALL: "Répondre à tous" - LABEL_FORWARD: "Transférer" - LABEL_FORWARD_MULTIPLY: "Transférer comme pièce(s) jointe(s)" - LABEL_HELP: "Aide" - LABEL_CHECK_ALL: "Sélectionner tous les messages" - LABEL_ARCHIVE: "Archiver" - LABEL_DELETE: "Supprimer" - LABEL_OPEN_THREAD: "Ouvrir le message selectionné" - LABEL_MOVE: "Déplacer" - LABEL_READ: "Marquer les messages sélectionnés comme lus" - LABEL_UNREAD: "Marquer les messages sélectionnés comme non-lus" - LABEL_IMPORTANT: "Important, drapeau sélectionnés" - LABEL_SEARCH: "Rechercher" - LABEL_CANCEL_SEARCH: "Annuler la recherche" - LABEL_FULLSCREEN_ENTER: "Plein écran (Mise en page avec aperçu)" - LABEL_VIEW_MESSAGE_ENTER: "Voir le message (Mise en page sans aperçu)" - LABEL_SWITCH_TO_MESSAGE: "Aller au message sélectionné" - LABEL_SWITCH_TO_FOLDER_LIST: "Aller à la liste des dossiers" - LABEL_FULLSCREEN_TOGGLE: "Basculer en mode plein écran" - LABEL_BLOCKQUOTES_TOGGLE: "Basculer les citations en bloc" - LABEL_THREAD_NEXT: "Message précédent de la liste" - LABEL_THREAD_PREV: "Message suivant de la liste" - LABEL_PRINT: "Imprimer" - LABEL_EXIT_FULLSCREEN: "Quitter le mode plein écran" - LABEL_CLOSE_MESSAGE: "Fermer le message (Mise en page sans aperçu)" - LABEL_SWITCH_TO_LIST: "Retourner à la liste des messages" - LABEL_OPEN_COMPOSE_POPUP: "Ouvrir la fenêtre d'édition" - LABEL_MINIMIZE_COMPOSE_POPUP: "Réduire la fenêtre d'édition" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Liste de sélection des identités" - LABEL_SAVE_MESSAGE: "Enregistrer le message" - LABEL_SEND_MESSAGE: "Envoyer le message" - LABEL_CLOSE_COMPOSE: "Fermer la fenêtre d'édition" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "Aucune clé publique n'a pu être trouvée" - NO_PUBLIC_KEYS_FOUND_FOR: "Aucune clé publique n'a pu être trouvée pour \"%EMAIL%\"" - NO_PRIVATE_KEY_FOUND: "Aucune clé privée n'a pu être trouvée" - NO_PRIVATE_KEY_FOUND_FOR: "Aucune clé privée n'a pu être trouvée pour \"%EMAIL%\"" - ADD_A_PUBLICK_KEY: "Ajouter une clé publique" - SELECT_A_PRIVATE_KEY: "Choisir une clé privée" - UNVERIFIRED_SIGNATURE: "Signature non vérifiée" - DECRYPTION_ERROR: "Erreur lors du déchiffrement OpenPGP" - GOOD_SIGNATURE: "Signature valide pour %USER%" - PGP_ERROR: "Erreur OpenPGP: %ERROR%" - SPECIFY_FROM_EMAIL: "Merci de spécifier une adresse email pour DE" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Merci de spécifier au moins un destinataire" - NOTIFICATIONS: - INVALID_TOKEN: "Jeton invalide" - AUTH_ERROR: "L'authentification a échoué" - ACCESS_ERROR: "Erreur d'accès" - CONNECTION_ERROR: "Serveur injoignable" - CAPTCHA_ERROR: "CAPTCHA incorrect." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Cet ID social n'est pas encore assigné à une adresse email. Connectez-vous - en utilisant les informations d'identification du courrier électronique et - activez cette fonctionnalité dans les paramètres de votre compte. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Cet ID social n'est pas encore assigné à une adresse email. Connectez-vous - en utilisant les informations d'identification du courrier électronique et - activez cette fonctionnalité dans les paramètres de votre compte. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Cet ID social n'est pas encore assigné à une adresse email. Connectez-vous - en utilisant les informations d'identification du courrier électronique et - activez cette fonctionnalité dans les paramètres de votre compte. - DOMAIN_NOT_ALLOWED: "Ce domaine n'est pas autorisé" - ACCOUNT_NOT_ALLOWED: "Ce compte n'est pas autorisé" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Double authentification requise" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Erreur lors de la double authentification" - COULD_NOT_SAVE_NEW_PASSWORD: "Impossible d'enregistrer le nouveau mot de passe" - CURRENT_PASSWORD_INCORRECT: "Le mot de passe actuel est incorrect" - NEW_PASSWORD_SHORT: "Le mot de passe est trop court" - NEW_PASSWORD_WEAK: "Le mot de passe n'est pas assez fort" - NEW_PASSWORD_FORBIDDENT: "Le mot de passe contient des caractères invalides" - CONTACTS_SYNC_ERROR: "Erreur de synchronisation des contacts" - CANT_GET_MESSAGE_LIST: "Impossible d'obtenir la liste des messages" - CANT_GET_MESSAGE: "Impossible d'obtenir le message" - CANT_DELETE_MESSAGE: "Impossible de supprimer le message" - CANT_MOVE_MESSAGE: "Impossible de déplacer le message" - CANT_SAVE_MESSAGE: "Impossible d'enregistrer le message" - CANT_SEND_MESSAGE: "Impossible d'envoyer le message" - INVALID_RECIPIENTS: "Destinataires invalides" - CANT_SAVE_FILTERS: "Impossible d'enregistrer les filtres" - CANT_GET_FILTERS: "Impossible d'obtenir les filtres" - FILTERS_ARE_NOT_CORRECT: "Les filtres ne sont pas corrects" - CANT_CREATE_FOLDER: "Impossible de créer le dossier" - CANT_RENAME_FOLDER: "Impossible de renommer le dossier" - CANT_DELETE_FOLDER: "Impossible de supprimer le dossier" - CANT_DELETE_NON_EMPTY_FOLDER: "Impossible de supprimer un dossier non vide" - CANT_SUBSCRIBE_FOLDER: "Impossible de s'abonner au dossier" - CANT_UNSUBSCRIBE_FOLDER: "Impossible de se désabonner du dossier" - CANT_SAVE_SETTINGS: "Impossible d'enregistrer les paramètres" - CANT_SAVE_PLUGIN_SETTINGS: "Impossible d'enregistrer les paramètres" - DOMAIN_ALREADY_EXISTS: "Le domaine existe déjà" - CANT_INSTALL_PACKAGE: "Impossible d'installer le paquet" - CANT_DELETE_PACKAGE: "Impossible de supprimer le paquet" - INVALID_PLUGIN_PACKAGE: "Ce plug-in est invalide" - UNSUPPORTED_PLUGIN_PACKAGE: "Ce plug-in n'est pas supporté" - LICENSING_SERVER_IS_UNAVAILABLE: "Le serveur d'abonnement est inaccessible" - LICENSING_DOMAIN_EXPIRED: "L'abonnement pour ce domaine a expiré." - LICENSING_DOMAIN_BANNED: "L'abonnement pour ce domaine est interdit." - DEMO_SEND_MESSAGE_ERROR: "Pour des raisons de sécurité, ce compte de démonstration n'est pas autorisé à envoyer des messages à des adresses e-mail externes !" - DEMO_ACCOUNT_ERROR: "Pour des raisons de sécurité, ce compte n'est pas autorisé à faire cette action !" - ACCOUNT_ALREADY_EXISTS: "Ce compte existe déjà" - ACCOUNT_DOES_NOT_EXIST: "Ce compte n'existe pas" - MAIL_SERVER_ERROR: "Une erreur est survenue lors de l'accès au serveur mail" - INVALID_INPUT_ARGUMENT: "Argument invalide" - UNKNOWN_ERROR: "Erreur inconnue" - STATIC: - BACK_LINK: "Recharger" - DOMAIN_LIST_DESC: "Liste des domaines auxquels le webmail est autorisé à accéder." - PHP_EXSTENSIONS_ERROR_DESC: "Les extensions PHP nécessaires ne sont pas disponibles dans votre configuration de PHP !" - PHP_VERSION_ERROR_DESC: "Votre version de PHP (% VERSION%) est inférieure à la minimale requise 5.3.0 !" - NO_SCRIPT_TITLE: "JavaScript est nécessaire pour cette application." - NO_SCRIPT_DESC: | - Le support de JavaScript n'est pas disponible dans votre navigateur. - S'il vous plaît activez le support de JavaScript dans les paramètres de votre navigateur et réessayez. - NO_COOKIE_TITLE: "Le support des cookies est nécessaire pour cette application." - NO_COOKIE_DESC: | - Le support des cookies n'est pas disponible dans votre navigateur. - S'il vous plaît activez le support des cookies dans les paramètres de votre navigateur et réessayez. - BAD_BROWSER_TITLE: "Votre navigateur est obsolète." - BAD_BROWSER_DESC: | - Pour utiliser toutes les fonctionnalités de l'application, - téléchargez et installez l'un de ces navigateurs : diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/hu_HU.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/hu_HU.yml deleted file mode 100755 index 86b72272..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/hu_HU.yml +++ /dev/null @@ -1,717 +0,0 @@ -hu_HU: - LOGIN: - LABEL_EMAIL: "E-mail" - LABEL_LOGIN: "Bejelentkezés" - LABEL_PASSWORD: "Jelszó" - LABEL_SIGN_ME: "Megjegyzés" - LABEL_VERIFICATION_CODE: "Megerősítő kód" - LABEL_DONT_ASK_VERIFICATION_CODE: "Két hétig ne kérje a kódot" - BUTTON_SIGN_IN: "Belépés" - TITLE_SIGN_IN_GOOGLE: "Belépés Google használatával" - TITLE_SIGN_IN_FACEBOOK: "Belépés Facebook használatával" - TITLE_SIGN_IN_TWITTER: "Belépés Twitter használatával" - LABEL_FORGOT_PASSWORD: "Elfelejtett jelszó" - LABEL_REGISTRATION: "Regisztráció" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Fiók hozzáadás" - BUTTON_SETTINGS: "Beállítások" - BUTTON_HELP: "Súgó" - BUTTON_LOGOUT: "Kilépés" - MOBILE: - BUTTON_MOBILE_VERSION: "Mobil verzió" - BUTTON_DESKTOP_VERSION: "Asztali verzió" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Keresés" - TITLE_ADV: "Részletes keresés" - LABEL_ADV_FROM: "Feladó" - LABEL_ADV_TO: "Címzett" - LABEL_ADV_SUBJECT: "Tárgy" - LABEL_ADV_TEXT: "Szöveg" - LABEL_ADV_HAS_ATTACHMENT: "Van melléklete" - LABEL_ADV_HAS_ATTACHMENTS: "Vannak mellékletei" - LABEL_ADV_FLAGGED: "Megjelölve" - LABEL_ADV_UNSEEN: "Észrevétlen" - LABEL_ADV_DATE: "Dátum" - LABEL_ADV_DATE_ALL: "Összes" - LABEL_ADV_DATE_3_DAYS: "Legfeljebb 3 napos" - LABEL_ADV_DATE_7_DAYS: "Legfeljebb 1 hetes" - LABEL_ADV_DATE_MONTH: "Legfeljebb 1 hónapos" - LABEL_ADV_DATE_3_MONTHS: "Legfeljebb 3 hónapos" - LABEL_ADV_DATE_6_MONTHS: "Legfeljebb 6 hónapos" - LABEL_ADV_DATE_YEAR: "Legfeljebb 1 éves" - BUTTON_ADV_SEARCH: "Keresés" - PREVIEW_POPUP: - FULLSCREEN: "Teljes képernyő váltása" - ZOOM: "Nagyítás ki/be" - CLOSE: "Bezárás (Esc)" - LOADING: "Betöltés..." - GALLERY_PREV: "Előző (Bal nyíl gomb)" - GALLERY_NEXT: "Következő (Jobb nyíl gomb)" - GALLERY_COUNTER: "%curr% / %total%" - IMAGE_ERROR: "A képet nem sikerült betölteni." - AJAX_ERROR: "A tartalmat nem sikerült betölteni." - FOLDER_LIST: - BUTTON_COMPOSE: "Levélírás" - BUTTON_CONTACTS: "Névjegyek" - BUTTON_NEW_MESSAGE: "Új üzenet" - INBOX_NAME: "Beérkező levelek" - SENT_NAME: "Elküldött levelek" - DRAFTS_NAME: "Piszkozatok" - SPAM_NAME: "Levélszemét" - TRASH_NAME: "Lomtár" - ARCHIVE_NAME: "Archívum" - QUOTA: - TITLE: "Helyfoglalás" - MESSAGE_LIST: - BUTTON_RELOAD: "Üzenetlista újratöltés" - BUTTON_MOVE_TO: "Áthelyezés ide" - BUTTON_DELETE: "Törlés" - BUTTON_ARCHIVE: "Archívum" - BUTTON_SPAM: "Levélszemét" - BUTTON_NOT_SPAM: "Nem szemét" - BUTTON_EMPTY_FOLDER: "Mappa ürítés" - BUTTON_MULTY_FORWARD: "Továbbítás melléklet(en)ként" - BUTTON_DELETE_WITHOUT_MOVE: "Törlés véglegesen" - BUTTON_MORE: "Tovább" - MENU_SET_SEEN: "Megjelölés olvasottként" - MENU_SET_ALL_SEEN: "Összes megjelölése olvasottként" - MENU_UNSET_SEEN: "Megjelölés olvasatlanként" - MENU_SET_FLAG: "Megjelölés" - MENU_UNSET_FLAG: "Jelöletlen" - MENU_SELECT_ALL: "Összes" - MENU_SELECT_NONE: "Nincs" - MENU_SELECT_INVERT: "Invertálás" - MENU_SELECT_UNSEEN: "Olvasatlan" - MENU_SELECT_SEEN: "Olvasott" - MENU_SELECT_FLAGGED: "Megjelölt" - MENU_SELECT_UNFLAGGED: "Jelöletlen" - EMPTY_LIST: "Lista üres." - EMPTY_SEARCH_LIST: "Nincs a keresésnek megfelelő levél." - SEARCH_RESULT_FOR: "Keresési eredmények ehhez: \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "vissza az üzenetlistához" - LIST_LOADING: "Betöltés" - EMPTY_SUBJECT_TEXT: "(Nincs tárgy)" - PUT_MESSAGE_HERE: "Húzz ide egy üzenetet, hogy megjelenjen a listában" - TODAY_AT: "ma ekkor: %TIME%" - YESTERDAY_AT: "tegnap ekkor: %TIME%" - SEARCH_PLACEHOLDER: "Keresés" - NEW_MESSAGE_NOTIFICATION: "%COUNT% olvasatlan üzeneted van!" - QUOTA_SIZE: "Felhasználva %SIZE% (%PROC%%) ebből: %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Szerkesztés" - BUTTON_BACK: "Vissza" - BUTTON_CLOSE: "Bezárás" - BUTTON_DELETE: "Tőrlés" - BUTTON_UNSUBSCRIBE: "Leiratkozás erről a listáról" - BUTTON_ARCHIVE: "Archívum" - BUTTON_SPAM: "Levélszemét" - BUTTON_NOT_SPAM: "Nem levélszemét" - BUTTON_MOVE_TO: "Áthelyezés" - BUTTON_MORE: "Tovább" - BUTTON_REPLY: "Válasz" - BUTTON_REPLY_ALL: "Válasz mindenkinek" - BUTTON_FORWARD: "Továbbítás" - BUTTON_FORWARD_AS_ATTACHMENT: "Továbbítás mellékletként" - BUTTON_EDIT_AS_NEW: "Szerkesztés újként" - BUTTON_SHOW_IMAGES: "Külső képek megjelenítése" - BUTTON_NOTIFY_READ_RECEIPT: "A feladó értesítést kért a levél elolvasása után." - BUTTON_IN_NEW_WINDOW: "Megtekintés új ablakban" - BUTTON_THREAD_LIST: "Szál lista" - BUTTON_THREAD_PREV: "Előző" - BUTTON_THREAD_NEXT: "Következő" - BUTTON_THREAD_MORE: "További üzenetek" - MENU_HEADERS: "Üzenet fejléc megjelenítése" - MENU_VIEW_ORIGINAL: "Eredeti megjelenítése" - MENU_DOWNLOAD_ORIGINAL: ".eml fájl letöltés" - MENU_FILTER_SIMILAR: "Hasonló üzenetek szűrése" - MENU_PRINT: "Nyomtatás" - EMPTY_SUBJECT_TEXT: "(Nincs tárgy)" - LABEL_SUBJECT: "Tárgy" - LABEL_DATE: "Dátum" - LABEL_FROM: "Feladó" - LABEL_FROM_SHORT: "feladó" - LABEL_TO: "Címzett" - LABEL_TO_SHORT: "címzett" - LABEL_CC: "Másolat" - LABEL_BCC: "Titkos másolat" - LABEL_REPLY_TO: "Válaszcím" - PRINT_LABEL_FROM: "Feladó" - PRINT_LABEL_TO: "Címzett" - PRINT_LABEL_CC: "Másolat" - PRINT_LABEL_BCC: "Titkos másolat" - PRINT_LABEL_REPLY_TO: "Válaszcím" - PRINT_LABEL_DATE: "Dátum" - PRINT_LABEL_SUBJECT: "Tárgy" - PRINT_LABEL_ATTACHMENTS: "Mellékletek" - MESSAGE_LOADING: "Betöltés" - MESSAGE_VIEW_DESC: "Válassz egy üzenetet a listából, hogy megjelenjen itt." - MESSAGE_VIEW_MOVE_DESC: "A cél kiválasztásához a bal oldali panelen kattints a mappa nevére." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Jelszó" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP aláírt üzenet (kattints az ellenőrzéshez)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP kódolt üzenet (kattints a visszafejtéshez)" - LINK_DOWNLOAD_AS_ZIP: "Letöltés zip fájlként" - LINK_SAVE_TO_OWNCLOUD: "Mentés ownCloud-ra" - LINK_SAVE_TO_CLOUD: "Mentés a felhőbe" - LINK_SAVE_TO_DROPBOX: "Mentés Dropbox-ra" - READ_RECEIPT: - SUBJECT: "Visszaigazolás (megjelenítve) - %SUBJECT%" - BODY: | - Ez egy ide küldött üzenet olvasási visszaigazolása: %READ-RECEIPT%. - - Megjegyzés: Ez az olvasási visszaigazolás csak azt igazolja, hogy az üzenet megjelenítésre került a címzett számítógépén. - Nincs rá garancia, hogy a címzett elolvasta volna az üzenetet illetve megértette volna annak tartalmát. - SUGGESTIONS: - SEARCHING_DESC: "Keresés..." - CONTACTS: - LEGEND_CONTACTS: "Névjegyek" - SEARCH_INPUT_PLACEHOLDER: "Keresés" - BUTTON_ADD_CONTACT: "Névjegy hozzáadás" - BUTTON_CREATE_CONTACT: "Létrehozás" - BUTTON_UPDATE_CONTACT: "Frissítés" - BUTTON_IMPORT: "Importálás (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" - BUTTON_EXPORT_CSV: "Export (csv)" - ERROR_IMPORT_FILE: "Importálás hiba (érvénytelen fájl formátum)" - LIST_LOADING: "Betöltés" - EMPTY_LIST: "Nincsenek névjegyek" - EMPTY_SEARCH: "Nem találtam névjegyeket" - CLEAR_SEARCH: "Keresés törlése" - CONTACT_VIEW_DESC: "Válassz egy névjegyet a listából, hogy itt megjelenjen." - LABEL_DISPLAY_NAME: "Megjelenítendő név" - LABEL_EMAIL: "E-mail" - LABEL_PHONE: "Telefonszám" - LABEL_WEB: "Web" - LABEL_BIRTHDAY: "Születésnap" - LINK_ADD_EMAIL: "Adj meg egy e-mail címet" - LINK_ADD_PHONE: "Adj meg egy telefonszámot" - LINK_BIRTHDAY: "Születésnap" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Add meg a megjelenítendő nevet" - PLACEHOLDER_ENTER_LAST_NAME: "Add meg a vezetéknevet" - PLACEHOLDER_ENTER_FIRST_NAME: "Add meg a keresztnevet" - PLACEHOLDER_ENTER_NICK_NAME: "Add meg a felhasználónevet" - LABEL_READ_ONLY: "Csak olvasás" - LABEL_SHARE: "Megosztás" - ADD_MENU_LABEL: "Hozzáadás" - ADD_MENU_NICKNAME: "Felhasználónév" - ADD_MENU_NOTES: "Jegyzetek" - ADD_MENU_EMAIL: "E-mail" - ADD_MENU_PHONE: "Telefonszám" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Cím" - ADD_MENU_BIRTHDAY: "Születésnap" - ADD_MENU_TAGS: "Címkék" - BUTTON_SHARE_NONE: "Semmi" - BUTTON_SHARE_ALL: "Mindenki" - BUTTON_SYNC: "Szinkronizálás (CardDAV)" - COMPOSE: - TITLE_FROM: "Feladó" - TITLE_TO: "Címzett" - TITLE_CC: "Másolat" - TITLE_BCC: "Titkos másolat" - TITLE_REPLY_TO: "Válaszcím" - TITLE_SUBJECT: "Tárgy" - LINK_SHOW_INPUTS: "összes mező" - BUTTON_SEND: "Küldés" - BUTTON_SAVE: "Mentés" - BUTTON_DELETE: "Törlés" - BUTTON_CANCEL: "Mégse" - BUTTON_MINIMIZE: "Kis méret" - SAVED_TIME: "Mentve ekkor: %TIME%" - SAVED_ERROR_ON_SEND: "Üzenet elküldve, de nem lett mentve az elküldött elemek mappájába" - DISCARD_UNSAVED_DATA: "Nem mentett adatok elvetése?" - ATTACH_FILES: "Melléklet" - ATTACH_DROP_FILES_DESC: "Húzd ide a fájlokat" - ATTACH_ITEM_CANCEL: "Mégse" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% írta" - FORWARD_MESSAGE_TOP_TITLE: "-------- Továbbított üzenet -------" - FORWARD_MESSAGE_TOP_FROM: "Feladó" - FORWARD_MESSAGE_TOP_TO: "Címzett" - FORWARD_MESSAGE_TOP_CC: "Másolat" - FORWARD_MESSAGE_TOP_SENT: "Elküldött levelek" - FORWARD_MESSAGE_TOP_SUBJECT: "Tárgy" - EMPTY_TO_ERROR_DESC: "Legalább egy címzettet meg kell adni" - NO_ATTACHMENTS_HERE_DESC: "Nincsenek mellékletek." - ATTACHMENTS_ERROR_DESC: "Figyelem! Még nem lett feltöltve minden melléklet." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Még nem lett feltöltve minden melléklet." - BUTTON_REQUEST_READ_RECEIPT: "Olvasási visszaigazolás kérése" - BUTTON_MARK_AS_IMPORTANT: "Megjelölés fontosként" - BUTTON_OPEN_PGP: "OpenPGP (csak egyszerű szöveg)" - BUTTON_REQUEST_DSN: "Továbbítási visszaigazolás kérés" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Bezár" - POPUPS_ASK: - BUTTON_YES: "Igen" - BUTTON_NO: "Nem" - DESC_WANT_CLOSE_THIS_WINDOW: "Biztos, hogy be akarod zárni ezt az ablakot?" - DESC_WANT_DELETE_MESSAGES: "Biztos, hogy törölni akarod az üzenete(ke)t?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Nyelv kiválasztás" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Új fiók?" - BUTTON_ADD_ACCOUNT: "Hozzáadás" - TITLE_UPDATE_ACCOUNT: "Fiók frissítése?" - BUTTON_UPDATE_ACCOUNT: "Frissítés" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Identitás hozzáadás?" - TITLE_UPDATE_IDENTITY: "Frissítsük az identitást?" - BUTTON_ADD_IDENTITY: "Hozzáadás" - BUTTON_UPDATE_IDENTITY: "Frissítés" - LABEL_EMAIL: "E-mail" - LABEL_NAME: "Név" - LABEL_REPLY_TO: "Válaszcím" - LABEL_SIGNATURE: "Aláírás" - LABEL_CC: "Másolat" - LABEL_BCC: "Titkos másolat" - LABEL_SIGNATURE_INSERT_BEFORE: "Szúrja be ezt az aláírást az idézett szöveg elé a válaszokban" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Létrehozzuk a mappát?" - LABEL_NAME: "Mappa név" - LABEL_PARENT: "Szülő mappa" - BUTTON_CREATE: "Létrehozás" - BUTTON_CANCEL: "Mégse" - BUTTON_CLOSE: "Bezárás" - TITLE_CREATING_PROCESS: "Mappa létrehozás" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Töröljük az összes üzenetet a mappából?" - BUTTON_CLEAR: "Törlés" - BUTTON_CANCEL: "Mégse" - BUTTON_CLOSE: "Bezárás" - DANGER_DESC_WARNING: "Figyelem!" - DANGER_DESC_HTML_1: "Ez a művelet az összes %FOLDER% mappában lévő üzenet teljes törlését eredményezi." - DANGER_DESC_HTML_2: "Ha egyszer elindult, a folyamatot nem lehet megszakítani." - TITLE_CLEARING_PROCESS: "Mappa ürítés..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "OpenPGP kulcs importálás" - BUTTON_IMPORT_OPEN_PGP_KEY: "Importálás" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "OpenPGP kulcs megtekintés" - BUTTON_SELECT: "Kiválasztás" - BUTTON_CLOSE: "Bezárás" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "OpenPGP kulcs generálás" - LABEL_EMAIL: "E-mail" - LABEL_NAME: "Név" - LABEL_PASSWORD: "Jelszó" - LABEL_KEY_BIT_LENGTH: "Kulcs hossz" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generálás" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP aláírás/titkosítás" - LABEL_SIGN: "Aláírás" - LABEL_ENCRYPT: "Titkosítás" - LABEL_PASSWORD: "Jelszó" - BUTTON_SIGN: "Aláírás" - BUTTON_ENCRYPT: "Titkosítás" - BUTTON_SIGN_AND_ENCRYPT: "Aláírás és titkosítás" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP visszafejtés" - LABEL_KEY: "Privát kulcs" - LABEL_PASSWORD: "Jelszó" - BUTTON_DECRYPT: "Visszafejtés" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "2-lépéses hitelesítés teszt" - LABEL_CODE: "Kód" - BUTTON_TEST: "Tesztelés" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Szűrő létrehozás?" - TITLE_EDIT_FILTER: "Szűrő frissítés?" - FILTER_NAME: "Név" - LEGEND_CONDITIONS: "Feltételek" - LEGEND_ACTIONS: "Műveletek" - BUTTON_DONE: "Kész" - BUTTON_ADD_CONDITION: "Feltétel hozzáadás" - SELECT_ACTION_NONE: "Semmi" - SELECT_ACTION_MOVE_TO: "Áthelyezés ide" - SELECT_ACTION_FORWARD_TO: "Továbbítás ide" - SELECT_ACTION_REJECT: "Visszautasít" - SELECT_ACTION_VACATION_MESSAGE: "Vakáció üzenet" - SELECT_ACTION_DISCARD: "Elvetés" - SELECT_FIELD_FROM: "Feladó" - SELECT_FIELD_RECIPIENTS: "Címzettek (címzett vagy másolat)" - SELECT_FIELD_SUBJECT: "Tárgy" - SELECT_FIELD_HEADER: "Fejléc" - SELECT_FIELD_SIZE: "Méret" - SELECT_TYPE_CONTAINS: "Tartalmazza" - SELECT_TYPE_NOT_CONTAINS: "Nem tartalmazza" - SELECT_TYPE_MATCHES: "Hasonló (* és ? támogatott)" - SELECT_TYPE_NOT_MATCHES: "Nem hasonló (* és ? támogatott)" - SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Not Regexp" - SELECT_TYPE_EQUAL_TO: "Egyezik" - SELECT_TYPE_NOT_EQUAL_TO: "Nem egyezik" - SELECT_TYPE_OVER: "Fölött" - SELECT_TYPE_UNDER: "Alatt" - SELECT_MATCH_ANY: "Egyezzen VALAMELYIK következő szabállyal" - SELECT_MATCH_ALL: "Egyezzen MINDEN következő szabállyal" - MARK_AS_READ_LABEL: "Megjelölés olvasottként" - REPLY_INTERVAL_LABEL: "Válasz időköz (nap)" - KEEP_LABEL: "Megtart" - STOP_LABEL: "Ne hagyja abba a szabályok feldolgozását" - EMAIL_LABEL: "E-mail" - VACATION_SUBJECT_LABEL: "Tárgy (nem kötelező)" - VACATION_MESSAGE_LABEL: "Üzenet" - VACATION_RECIPIENTS_LABEL: "Címzettek (vesszővel elválasztva)" - REJECT_MESSAGE_LABEL: "Üzenet visszautasítása" - ALL_INCOMING_MESSAGES_DESC: "Minden bejövő üzenet" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Rendszermappák kiválasztása" - SELECT_CHOOSE_ONE: "Válassz egyet" - SELECT_UNUSE_NAME: "Ne használd" - LABEL_SENT: "Elküldött levelek" - LABEL_DRAFTS: "Piszkozatok" - LABEL_SPAM: "Levélszemét" - LABEL_TRASH: "Lomtár" - LABEL_ARCHIVE: "Archívum" - BUTTON_CANCEL: "Mégse" - BUTTON_CLOSE: "Bezárás" - NOTIFICATION_SENT: | - Nem választottál "Elküldött" rendszermappát a törölt levelek tárolásához. - Ha nem szeretnéd tárolni az elküldött leveleket, akkor válaszd a "Ne használd" lehetőséget. - NOTIFICATION_DRAFTS: "Nem választottál \"Piszkozatok\" rendszermappát a szerkesztett üzenetek tárolásához." - NOTIFICATION_SPAM: |+ - Nem választottál "Levélszemét" rendszermappát a kéretlen üzenetek tárolásához. - Az üzenetek végleges törléséhez válaszd a "Ne használd" lehetőséget. - - NOTIFICATION_TRASH: | - Nem választottál "Lomtár" rendszermappát a törölt levelek tárolásához. - Az üzenetek végleges törléséhez válaszd a "Ne használd" lehetőséget. - NOTIFICATION_ARCHIVE: "Nem választottál \"Archívum\" rendszermappát az archivált üzenetek tárolásához." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "2 lépcsős hitelesítés" - LABEL_ENABLE_TWO_FACTOR: "2 lépcsős hitelesítés engedélyezése" - LABEL_TWO_FACTOR_USER: "Felhasználó" - LABEL_TWO_FACTOR_STATUS: "Állapot" - LABEL_TWO_FACTOR_SECRET: "Titok" - LABEL_TWO_FACTOR_BACKUP_CODES: "Biztonsági kódok" - BUTTON_CREATE: "Új titok létrehozás" - BUTTON_ACTIVATE: "Aktivál" - BUTTON_CLEAR: "Töröl" - BUTTON_LOGOUT: "Kijelentkezés" - BUTTON_DONE: "Kész" - BUTTON_TEST: "Teszt" - LINK_TEST: "teszt" - BUTTON_SHOW_SECRET: "Titok megjelenítése" - BUTTON_HIDE_SECRET: "Titok elrejtése" - TWO_FACTOR_REQUIRE_DESC: "A fiókhoz 2 lépcsős hitelesítés szükséges." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Beállítva" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Nincs beállítva" - TWO_FACTOR_SECRET_DESC: > - Importáld ezt az infót a Google Authenticator kliensedbe (vagy más TOTP kliensbe) - az alábbi QR kód használatával vagy a kód manuális megadatásával. - TWO_FACTOR_BACKUP_CODES_DESC: > - Ha nem kapod meg a kódokat a Google Authenticator kliensből (vagy más TOTP - kliensből), akkor a bejelentkezéshez használhatod a biztonsági kódot. A biztonsági - kód használata után inaktívvá válik. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Tesztelés nélkül nem lehet megváltoztatni ezt a beállítást." - TITLES: - LOADING: "Betöltés" - LOGIN: "Bejelentkezés" - MAILBOX: "Postaláda" - SETTINGS: "Beállítások" - COMPOSE: "Levélírás" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "A fájl túl nagy" - ERROR_FILE_PARTIALLY_UPLOADED: "A fájl egy ismeretlen hiba miatt csak részben lett feltöltve" - ERROR_NO_FILE_UPLOADED: "Nem lett fájl feltöltve" - ERROR_MISSING_TEMP_FOLDER: "Hiányzik az ideiglenes fájl" - ERROR_ON_SAVING_FILE: "Ismeretlen fájl feltöltési hiba történt" - ERROR_FILE_TYPE: "Érvénytelen fájltípus" - ERROR_UNKNOWN: "Ismeretlen fájl feltöltési hiba történt" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" - TEXT_SWITCHER_RICH_FORMATTING: "Formázott szöveg" - TEXT_SWITCHER_CONFIRM: "A szövegformázás és a képek el fognak veszni. Biztos, hogy folytatni akarod?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Személyes" - LABEL_GENERAL_NAME: "Általános" - LABEL_CONTACTS_NAME: "Névjegyek" - LABEL_FOLDERS_NAME: "Mappák" - LABEL_ACCOUNTS_NAME: "Fiókok" - LABEL_IDENTITY_NAME: "Identitás" - LABEL_IDENTITIES_NAME: "Identitások" - LABEL_FILTERS_NAME: "Szűrők" - LABEL_TEMPLATES_NAME: "Sablonok" - LABEL_SECURITY_NAME: "Biztonság" - LABEL_SOCIAL_NAME: "Közösség" - LABEL_THEMES_NAME: "Témák" - LABEL_CHANGE_PASSWORD_NAME: "Jelszó" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Vissza" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Szűrők" - BUTTON_SAVE: "Mentés" - BUTTON_ADD_FILTER: "Szűrő hozzáadás" - BUTTON_DELETE: "Törlés" - BUTTON_RAW_SCRIPT: "Saját felhasználói szkript használata" - SUBNAME_NONE: "Semmi" - SUBNAME_MOVE_TO: "Áthelyezés ide \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Továbbítás ide: \"%EMAIL%\"" - SUBNAME_REJECT: "Visszautasít" - SUBNAME_VACATION_MESSAGE: "Vakáció üzenet" - SUBNAME_DISCARD: "Elvetés" - CAPABILITY_LABEL: "Képesség" - LOADING_PROCESS: "Szűrő lista frissítése" - DELETING_ASK: "Biztos vagy benne?" - CHACHES_NEED_TO_BE_SAVED_DESC: "Ezeket a módosításokat el kell menteni a szerverre." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identitás" - LABEL_DISPLAY_NAME: "Név" - LABEL_REPLY_TO: "Válaszcím" - LABEL_SIGNATURE: "Aláírás" - LABEL_ADD_SIGNATURE_TO_ALL: "Az aláírásod hozzáadása a kimenő üzenetekhez" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Biztonság" - LABEL_CONFIGURE_TWO_FACTOR: "2 lépcsős hitelesítés beállítása" - LABEL_AUTOLOGOUT: "Automatikus kijelentkezés" - AUTOLOGIN_NEVER_OPTION_NAME: "Soha" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% perc" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% óra" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Általános" - LABEL_LANGUAGE: "Nyelv" - LABEL_IDENTITY: "Identitás" - LABEL_LAYOUT: "Elrendezés" - LABEL_LAYOUT_NO_SPLIT: "Felosztás nélkül" - LABEL_LAYOUT_VERTICAL_SPLIT: "Függőleges felosztás" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Vízszintes felosztás" - LABEL_EDITOR: "Alapértelmezett szövegszerkesztő" - LABEL_EDITOR_HTML: "HTML" - LABEL_EDITOR_PLAIN: "Egyszerű" - LABEL_EDITOR_HTML_FORCED: "HTML (kényszerített)" - LABEL_EDITOR_PLAIN_FORCED: "Egyszerű (kényszerített)" - LABEL_ANIMATION: "Felület animáció" - LABEL_ANIMATION_FULL: "Teljes" - LABEL_ANIMATION_NORMAL: "Normál" - LABEL_ANIMATION_NONE: "Semmi" - LABEL_VIEW_OPTIONS: "Nézet beállítások" - LABEL_USE_PREVIEW_PANE: "Előnézeti ablak használata" - LABEL_USE_CHECKBOXES_IN_LIST: "Jelölőnégyzetek megjelenítése a listában" - LABEL_USE_THREADS: "Szálak használata" - LABEL_REPLY_SAME_FOLDER: "Válaszüzenetek elhelyezése az eredeti üzenet mappájában" - LABEL_SHOW_IMAGES: "Mindig jelenítse meg a külső képeket az üzenet törzsében" - LABEL_SHOW_ANIMATION: "Animáció megjelenítés" - LABEL_MESSAGE_PER_PAGE: "Üzenetek egy oldalon" - LABEL_NOTIFICATIONS: "Értesítések" - LABEL_SOUND_NOTIFICATION: "Hangos értesítés" - LABEL_CHROME_NOTIFICATION_DESC: "Új üzenetek értesítő ablakainak megjelenítése" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(a böngésző blokkolta)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Névjegyek" - LABEL_CONTACTS_AUTOSAVE: "Címzettek automatikus hozzáadása a címtárhoz" - LEGEND_CONTACTS_SYNC: "Távoli szinkronizálás (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Távoli szinkronizálás engedélyezése" - LABEL_CONTACTS_SYNC_SERVER: "Szerver" - LABEL_CONTACTS_SYNC_AB_URL: "Címtár URL" - LABEL_CONTACTS_SYNC_USER: "Felhasználó" - LABEL_CONTACTS_SYNC_PASSWORD: "Jelszó" - SETTINGS_THEMES: - LEGEND_THEMES: "Témák" - LEGEND_THEMES_CUSTOM: "Saját téma beállítások" - LABEL_CUSTOM_TYPE: "Típus" - LABEL_CUSTOM_TYPE_LIGHT: "Világos" - LABEL_CUSTOM_TYPE_DARK: "Sötét" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Háttér" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Háttérkép feltöltés (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "A fájl túl nagy" - ERROR_FILE_TYPE_ERROR: "Érvénytelen fájl típus (csak JPG és PNG lehet)" - ERROR_UNKNOWN: "Ismeretlen fájl feltöltési hiba történt" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Google kapcsolódás" - BUTTON_GOOGLE_DISCONNECT: "Google szétkapcsolás" - MAIN_GOOGLE_DESC: "A Google bejelentkezés engedélyezése után, ebbe a fiókba is be lehet lépni a Google gombbal a bejelentkező képernyőn." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Facebook kapcsolódás" - BUTTON_FACEBOOK_DISCONNECT: "Facebook szétkapcsolás" - MAIN_FACEBOOK_DESC: "A Facebook bejelentkezés engedélyezése után, ebbe a fiókba is be lehet lépni a Facebook gombbal a bejelentkező képernyőn." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Twitter kapcsolódás" - BUTTON_TWITTER_DISCONNECT: "Twitter szétkapcsolás" - MAIN_TWITTER_DESC: "A Twitter bejelentkezés engedélyezése után, ebbe a fiókba is be lehet lépni a Twitter gombbal a bejelentkező képernyőn." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Mappa lista" - BUTTON_CREATE: "Mappa létrehozás" - BUTTON_SYSTEM: "Rendszermappák" - BUTTON_DELETE: "Törlés" - BUTTON_SUBSCRIBE: "Feliratkozás" - BUTTON_UNSUBSCRIBE: "Leiratkozás" - LOADING_PROCESS: "Mappa lista frissítése" - CREATING_PROCESS: "Mappa létrehozás" - DELETING_PROCESS: "Mappa törlés" - RENAMING_PROCESS: "Mappa átnevezés" - DELETING_ASK: "Biztos vagy benne?" - TO_MANY_FOLDERS_DESC_1: "Túl sok mappád van!" - TO_MANY_FOLDERS_DESC_2: "Teljesítény problémák elkerülése miatt, csak egy részét jelenítjük meg." - HELP_DELETE_FOLDER: "Mappa törlés" - HELP_SHOW_HIDE_FOLDER: "Mappa mutatás/elrejtés" - HELP_CHECK_FOR_NEW_MESSAGES: "Ellenőrizze/ne ellenőrizze az új üzeneteket" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Fiók lista" - LEGEND_IDENTITIES: "Identitások" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Fiókok és identitások" - BUTTON_ADD_ACCOUNT: "Fiók hozzáadás" - BUTTON_ADD_IDENTITY: "Identitás hozzáadás" - BUTTON_DELETE: "Tőrlés" - LOADING_PROCESS: "Fiók lista frissítés" - DELETING_ASK: "Biztos vagy benne?" - DEFAULT_IDENTITY_LABEL: "default" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identitás" - LEGEND_IDENTITIES: "További identitások" - LABEL_DEFAULT: "Alapértelmezett" - LABEL_DISPLAY_NAME: "Név" - LABEL_REPLY_TO: "Válaszcím" - LABEL_SIGNATURE: "Aláírás" - LABEL_ADD_SIGNATURE_TO_ALL: "Az aláírásod hozzáadása az összes kimenő üzenetekhez" - BUTTON_ADD_IDENTITY: "Identitás hozzáadás" - BUTTON_DELETE: "Törlés" - LOADING_PROCESS: "Identitás lista frissítése" - DELETING_ASK: "Biztos vagy benne?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Jelszó változtatás" - LABEL_CURRENT_PASSWORD: "Jelenlegi jelszó" - LABEL_NEW_PASSWORD: "Új jelszó" - LABEL_REPEAT_PASSWORD: "Új jelszó újra" - BUTTON_UPDATE_PASSWORD: "Új jelszó beállítás" - ERROR_PASSWORD_MISMATCH: "A jelszavak nem egyeznek, próbáld újra" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "OpenPGP kulcs importálás" - BUTTON_GENERATE_OPEN_PGP_KEYS: "OpenPGP kulcs generálás" - TITLE_PRIVATE: "Privát" - TITLE_PUBLIC: "Publikus" - DELETING_ASK: "Biztos vagy benne?" - GENERATE_ONLY_HTTPS: "csak HTTPS" - LABEL_ALLOW_DRAFT_AUTOSAVE: "Piszkozat automatikus mentése" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Billentyű kombináció súgó" - TAB_MAILBOX: "Postaláda" - TAB_MESSAGE_LIST: "Üzenetlista" - TAB_MESSAGE_VIEW: "Üzenet nézet" - TAB_COMPOSE: "Levélírás" - LABEL_OPEN_USER_DROPDOWN: "Felhasználó legördülő megnyitása" - LABEL_REPLY: "Válasz" - LABEL_REPLY_ALL: "Válasz mindenkinek" - LABEL_FORWARD: "Továbbítás" - LABEL_FORWARD_MULTIPLY: "Továbbítás melléklet(en)ként" - LABEL_HELP: "Súgó" - LABEL_CHECK_ALL: "Minden üzenet kijelölése" - LABEL_ARCHIVE: "Archívum" - LABEL_DELETE: "Törlés" - LABEL_OPEN_THREAD: "Kijelölt szál megnyitása" - LABEL_MOVE: "Áthelyez" - LABEL_READ: "Kijelölt üzenetek megjelölése olvasottként" - LABEL_UNREAD: "Kijelölt üzenetek megjelölése olvasatlanként" - LABEL_IMPORTANT: "Kijelölt üzenetek megjelölése fontosként zászlóval" - LABEL_SEARCH: "Keresés" - LABEL_CANCEL_SEARCH: "Keresés megszakítása" - LABEL_FULLSCREEN_ENTER: "Teljes képernyő (előnézeti panales elrendezés)" - LABEL_VIEW_MESSAGE_ENTER: "Üzenet megtekintése (előnézeti panel nélküli elrendezés)" - LABEL_SWITCH_TO_MESSAGE: "Fókusz váltás a kijelölt üzenetre" - LABEL_SWITCH_TO_FOLDER_LIST: "Fókusz váltás a mappa listára" - LABEL_FULLSCREEN_TOGGLE: "Teljes képernyős mód váltása" - LABEL_BLOCKQUOTES_TOGGLE: "Idézetek váltása az üzenetben" - LABEL_THREAD_NEXT: "Következő üzenet a szálban" - LABEL_THREAD_PREV: "Előző üzenet a szálban" - LABEL_PRINT: "Nyomtatás" - LABEL_EXIT_FULLSCREEN: "Kilépés a teljes képernyős módból" - LABEL_CLOSE_MESSAGE: "Üzenet bezárás (előnézeti panel nélküli elrendezés)" - LABEL_SWITCH_TO_LIST: "Fókusz váltása vissza az üzenetlistára" - LABEL_OPEN_COMPOSE_POPUP: "Levélírás ablak megnyitás" - LABEL_MINIMIZE_COMPOSE_POPUP: "Levélírás ablak minimalizálás" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Identitások legördülő megnyitása" - LABEL_SAVE_MESSAGE: "Üzenet mentés" - LABEL_SEND_MESSAGE: "Üzenet küldés" - LABEL_CLOSE_COMPOSE: "Levélírás bezárása" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "Nem találtam publikus kulcsokat" - NO_PUBLIC_KEYS_FOUND_FOR: "Nem találtam publikus kulcsokat ehhez az e-mailhez: \"%EMAIL%\"" - NO_PRIVATE_KEY_FOUND: "Nem találtam privát kulcsot" - NO_PRIVATE_KEY_FOUND_FOR: "Nem találtam privát kulcsot ehhez az e-mailhez: \"%EMAIL%\"" - ADD_A_PUBLICK_KEY: "Publikus kulcs hozzáadás" - SELECT_A_PRIVATE_KEY: "Privát kulcs választás" - UNVERIFIRED_SIGNATURE: "Nem ellenőrzött aláírás" - DECRYPTION_ERROR: "OpenPGP visszafejtési hiba" - GOOD_SIGNATURE: "Jó aláírás tőle: %USER%" - PGP_ERROR: "OpenPGP hiba: %ERROR%" - SPECIFY_FROM_EMAIL: "Kérlek add meg a Feladó e-mail címét" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Legalább egy címzettet meg kell adni" - NOTIFICATIONS: - INVALID_TOKEN: "Érvénytelen kulcs" - AUTH_ERROR: "Érvénytelen hitelesítés" - ACCESS_ERROR: "Érvénytelen hozzáférés" - CONNECTION_ERROR: "Nem lehet kapcsolódni a szerverhez" - CAPTCHA_ERROR: "Érvénytelen CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Ez a közösségi azonosító még egyetlen e-mail fiókhoz sincs hozzárendelve. - Lépj be az e-mail fiókod hitelesítő adataival majd engedélyezd ezt a lehetőséget - a fiók beállításoknál. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Ez a közösségi azonosító még egyetlen e-mail fiókhoz sincs hozzárendelve. - Lépj be az e-mail fiókod hitelesítő adataival majd engedélyezd ezt a lehetőséget - a fiók beállításoknál. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Ez a közösségi azonosító még egyetlen e-mail fiókhoz sincs hozzárendelve. - Lépj be az e-mail fiókod hitelesítő adataival majd engedélyezd ezt a lehetőséget - a fiók beállításoknál. - DOMAIN_NOT_ALLOWED: "A domain nem engedélyezett" - ACCOUNT_NOT_ALLOWED: "A fiók nem engedélyezett" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Kétlépcsős azonosítás kötelező" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Kétlépcsős azonosítás hiba" - COULD_NOT_SAVE_NEW_PASSWORD: "Az új jelszó nem került törlésre" - CURRENT_PASSWORD_INCORRECT: "Érvénytelen jelszó" - NEW_PASSWORD_SHORT: "A jelszó túl rövid" - NEW_PASSWORD_WEAK: "A jelszó túl egyszerű" - NEW_PASSWORD_FORBIDDENT: "A jelszó tíltott karaktereket tartalmaz" - CONTACTS_SYNC_ERROR: "Hiba lépett fel a névjegyek szinkronizálása közben" - CANT_GET_MESSAGE_LIST: "Nem tudom letölteni az üzenetlistát" - CANT_GET_MESSAGE: "Nem tudom letölteni az üzenetet" - CANT_DELETE_MESSAGE: "Nem lehet törölni az üzenetet" - CANT_MOVE_MESSAGE: "Nem lehet áthelyezni az üzenetet" - CANT_SAVE_MESSAGE: "Nem lehet menteni az üzenetet" - CANT_SEND_MESSAGE: "Nem lehet elküldeni az üzenetet" - INVALID_RECIPIENTS: "Érvénytelent címzettek" - CANT_SAVE_FILTERS: "Nem lehet menteni a szűrőket" - CANT_GET_FILTERS: "Nem lehet letölteni a szűrőket" - FILTERS_ARE_NOT_CORRECT: "A szűrők nem megfelelőek" - CANT_CREATE_FOLDER: "Nem lehet létrehozni a mappát" - CANT_RENAME_FOLDER: "Nem lehet átnevezni a mappát" - CANT_DELETE_FOLDER: "Nem lehet törölni a mappát" - CANT_DELETE_NON_EMPTY_FOLDER: "Nem üres mappát nem lehet törölni" - CANT_SUBSCRIBE_FOLDER: "Nem lehet feliratkozni mappára" - CANT_UNSUBSCRIBE_FOLDER: "Nem lehet leiratkozni mappáról" - CANT_SAVE_SETTINGS: "Nem lehet menteni a beállításokat" - CANT_SAVE_PLUGIN_SETTINGS: "Nem lehet menteni a beállításokat" - DOMAIN_ALREADY_EXISTS: "A domain már létezik" - CANT_INSTALL_PACKAGE: "Nem sikerült telepíteni a csomagot" - CANT_DELETE_PACKAGE: "Nem sikerült eltávolítani a csomagot" - INVALID_PLUGIN_PACKAGE: "Érvénytelen beépülő csomag" - UNSUPPORTED_PLUGIN_PACKAGE: "Nem támogatott beépülő csomag" - LICENSING_SERVER_IS_UNAVAILABLE: "A előfizetési szerver nem érhető el" - LICENSING_DOMAIN_EXPIRED: "A domain előfizetése lejárt." - LICENSING_DOMAIN_BANNED: "A domain előfizetése letiltva." - DEMO_SEND_MESSAGE_ERROR: "Biztonsági okokból, ebből a demó fiókból nem lehet külső e-mail címekre üzenetet küldeni." - DEMO_ACCOUNT_ERROR: "Biztonsági okokból, ebből a fiókból nem lehet elvégezni ezt a műveletet!" - ACCOUNT_ALREADY_EXISTS: "A fiók már létezik" - ACCOUNT_DOES_NOT_EXIST: "A fiók nem létezik" - MAIL_SERVER_ERROR: "Hiba történt a levelező szerverhez történő hozzáférés közben" - INVALID_INPUT_ARGUMENT: "Érvénytelen input argumentum" - UNKNOWN_ERROR: "Ismeretlen hiba" - STATIC: - BACK_LINK: "Újratöltés" - DOMAIN_LIST_DESC: "A webmailhez hozzáférhető domainek listája." - PHP_EXSTENSIONS_ERROR_DESC: "Szükséges PHP kiterjesztés nem érhető el a PHP konfigurációdban!" - PHP_VERSION_ERROR_DESC: "A PHP verziód (%VERSION%) kisebb mint a minimálisan szükséges 5.3.0!" - NO_SCRIPT_TITLE: "Az alkalmazáshoz JavaScript szükséges." - NO_SCRIPT_DESC: | - A JavaScript támogatás nem érhető el a böngésződben. - Kérlek engedélyezd böngésződben a JavaScript támogatást, majd próbáld újra. - NO_COOKIE_TITLE: "Az alkalmazáshoz Cookie támogatásra van szükség." - NO_COOKIE_DESC: | - A Cookie támogatás nem érhető el a böngésződben. - Kérlek engedélyezd böngésződben a Cookie támogatást, majd próbáld újra. - BAD_BROWSER_TITLE: "A böngésződ elavult." - BAD_BROWSER_DESC: | - Az alkalmazás összes funkciójának használatához - tölts le és telepítsd az alábbi böngészők egyikét: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/id_ID.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/id_ID.yml deleted file mode 100755 index 2b4c3188..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/id_ID.yml +++ /dev/null @@ -1,713 +0,0 @@ -id_ID: - LOGIN: - LABEL_EMAIL: "Email" - LABEL_LOGIN: "Login" - LABEL_PASSWORD: "Sandi" - LABEL_SIGN_ME: "Ingat Saya" - LABEL_VERIFICATION_CODE: "Kode Verifikasi" - LABEL_DONT_ASK_VERIFICATION_CODE: "Jangan tanya kode untuk 2 minggu" - BUTTON_SIGN_IN: "Masuk" - TITLE_SIGN_IN_GOOGLE: "Masuk dengan akun Google" - TITLE_SIGN_IN_FACEBOOK: "Masuk dengan akun Facebook" - TITLE_SIGN_IN_TWITTER: "Masuk dengan akun Twitter" - LABEL_FORGOT_PASSWORD: "Lupa Sandi" - LABEL_REGISTRATION: "Registrasi" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Tambah Akun" - BUTTON_SETTINGS: "Pengaturan" - BUTTON_HELP: "Bantuan" - BUTTON_LOGOUT: "Keluar" - MOBILE: - BUTTON_MOBILE_VERSION: "Versi Mobile" - BUTTON_DESKTOP_VERSION: "Versi Desktop" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Cari" - TITLE_ADV: "Pencarian lanjutan" - LABEL_ADV_FROM: "Dari" - LABEL_ADV_TO: "Kepada" - LABEL_ADV_SUBJECT: "Judul" - LABEL_ADV_TEXT: "Teks" - LABEL_ADV_HAS_ATTACHMENT: "Memiliki lampiran" - LABEL_ADV_HAS_ATTACHMENTS: "Memiliki lampiran" - LABEL_ADV_FLAGGED: "Ditandai" - LABEL_ADV_UNSEEN: "Belum dilihat" - LABEL_ADV_DATE: "Tanggal" - LABEL_ADV_DATE_ALL: "Semua" - LABEL_ADV_DATE_3_DAYS: "Sudah 3 hari lalu" - LABEL_ADV_DATE_7_DAYS: "Sudah 1 bulan lalu" - LABEL_ADV_DATE_MONTH: "Lebih dari 1 bulan lalu" - LABEL_ADV_DATE_3_MONTHS: "Lebih dari 3 bulan lalu" - LABEL_ADV_DATE_6_MONTHS: "Lebih dari 6 bulan lalu" - LABEL_ADV_DATE_YEAR: "Lebih dari 1 tahun lalu" - BUTTON_ADV_SEARCH: "Cari" - PREVIEW_POPUP: - FULLSCREEN: "Beralih ke layar penuh" - ZOOM: "Perbesar/perkecil" - CLOSE: "Tutup (esc)" - LOADING: "Memuat" - GALLERY_PREV: "Sebelumnya (panah kiri)" - GALLERY_NEXT: "Selanjutnya (panah kanan)" - GALLERY_COUNTER: "%curr% dari %total%" - IMAGE_ERROR: "The image tidak dapat dimuat." - AJAX_ERROR: "The content tidak dapat dimuat." - FOLDER_LIST: - BUTTON_COMPOSE: "Tulis baru" - BUTTON_CONTACTS: "Kontak" - BUTTON_NEW_MESSAGE: "Pesan Baru" - INBOX_NAME: "Kotak Masuk" - SENT_NAME: "Terkirim" - DRAFTS_NAME: "Konsep" - SPAM_NAME: "Spam" - TRASH_NAME: "Sampah" - ARCHIVE_NAME: "Arsip" - QUOTA: - TITLE: "Jatah digunakan" - MESSAGE_LIST: - BUTTON_RELOAD: "Muat Ulang Daftar Pesan" - BUTTON_MOVE_TO: "Pindahkan Ke" - BUTTON_DELETE: "Hapus" - BUTTON_ARCHIVE: "Arsipkan" - BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Bukan Spam" - BUTTON_EMPTY_FOLDER: "Buat Folder" - BUTTON_MULTY_FORWARD: "Teruskan sebagai lampiran" - BUTTON_DELETE_WITHOUT_MOVE: "Hapus permanen" - BUTTON_MORE: "Lagi" - MENU_SET_SEEN: "Tandai sudah dibaca" - MENU_SET_ALL_SEEN: "Tandai semua sudah dibaca" - MENU_UNSET_SEEN: "Tandai belum dibaca" - MENU_SET_FLAG: "Tandai" - MENU_UNSET_FLAG: "Hapus tanda" - MENU_SELECT_ALL: "Semua" - MENU_SELECT_NONE: "Tak satupun" - MENU_SELECT_INVERT: "Balikkan" - MENU_SELECT_UNSEEN: "Belum dibaca" - MENU_SELECT_SEEN: "Dibaca" - MENU_SELECT_FLAGGED: "Ditandai" - MENU_SELECT_UNFLAGGED: "Jangan tandai" - EMPTY_LIST: "Daftar kosong" - EMPTY_SEARCH_LIST: "Tidak ada pesan yang sesuai dengan pencarian" - SEARCH_RESULT_FOR: "Hasil pencarian untuk \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "Kembali ke daftar pesan" - LIST_LOADING: "Memuat" - EMPTY_SUBJECT_TEXT: "(Tanpa Judul)" - PUT_MESSAGE_HERE: "Taruh pesan di sini untuk melihatnya dalam daftar" - TODAY_AT: "hari ini pada %TIME%" - YESTERDAY_AT: "Kemarin pada %TIME%" - SEARCH_PLACEHOLDER: "Pencarian" - NEW_MESSAGE_NOTIFICATION: "Anda memiliki %COUNT% pesan baru!" - QUOTA_SIZE: "Menggunakan %SIZE% (%PROC%%) dari %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Ubah" - BUTTON_BACK: "Kembali" - BUTTON_CLOSE: "Tutup" - BUTTON_DELETE: "Hapus" - BUTTON_UNSUBSCRIBE: "Berhenti berlangganan dari daftar ini" - BUTTON_ARCHIVE: "Arsip" - BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Bukan Spam" - BUTTON_MOVE_TO: "Pindahkan Ke" - BUTTON_MORE: "Lagi" - BUTTON_REPLY: "Balas" - BUTTON_REPLY_ALL: "Balas Semua" - BUTTON_FORWARD: "Teruskan Pesan" - BUTTON_FORWARD_AS_ATTACHMENT: "Teruskan sebagai lampiran" - BUTTON_EDIT_AS_NEW: "Ubah sebagai Pesan Baru" - BUTTON_SHOW_IMAGES: "Tampilkan gambar eksternal" - BUTTON_NOTIFY_READ_RECEIPT: "Pengirim meminta diberitahu saat anda membaca pesan ini." - BUTTON_IN_NEW_WINDOW: "Tampilkan di jendela terpisah" - BUTTON_THREAD_LIST: "Daftar kegiatan" - BUTTON_THREAD_PREV: "Sebelumnya" - BUTTON_THREAD_NEXT: "Selanjutnya" - BUTTON_THREAD_MORE: "Pesan lainnya" - MENU_HEADERS: "Tampilkan header pesan" - MENU_VIEW_ORIGINAL: "Tampilkan kode sumber" - MENU_DOWNLOAD_ORIGINAL: "Unduh sebagai berkas .eml" - MENU_FILTER_SIMILAR: "Saring pesan seperti ini" - MENU_PRINT: "Cetak" - EMPTY_SUBJECT_TEXT: "(Tanpa Judul)" - LABEL_SUBJECT: "Judul" - LABEL_DATE: "Tanggal" - LABEL_FROM: "Dari" - LABEL_FROM_SHORT: "dari" - LABEL_TO: "Kepada" - LABEL_TO_SHORT: "kepada" - LABEL_CC: "CC" - LABEL_BCC: "BCC" - LABEL_REPLY_TO: "Balas-Ke" - PRINT_LABEL_FROM: "Dari" - PRINT_LABEL_TO: "Kepada" - PRINT_LABEL_CC: "CC" - PRINT_LABEL_BCC: "BCC" - PRINT_LABEL_REPLY_TO: "Balas-Ke" - PRINT_LABEL_DATE: "Tanggal" - PRINT_LABEL_SUBJECT: "Judul" - PRINT_LABEL_ATTACHMENTS: "Lampiran" - MESSAGE_LOADING: "Memuat" - MESSAGE_VIEW_DESC: "Pilih pesan pada daftar untuk menampilkannya di sini." - MESSAGE_VIEW_MOVE_DESC: "Klik pada nama folder pada panel kiri untuk memilih tujuan." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Sandi" - PGP_SIGNED_MESSAGE_DESC: "Pesan bertanda-tangan OpenPGP (klik untuk verifikasi)" - PGP_ENCRYPTED_MESSAGE_DESC: "Pesan terenkripsi OpenPGP (klik untuk mendekripsi)" - LINK_DOWNLOAD_AS_ZIP: "Unduh sebagai berkas zip" - LINK_SAVE_TO_OWNCLOUD: "Simpan ke ownCloud" - LINK_SAVE_TO_CLOUD: "Simpan ke Cloud" - LINK_SAVE_TO_DROPBOX: "Simpan ke Dropbox" - READ_RECEIPT: - SUBJECT: "Tanda terima (ditampilkan) - %SUBJECT%" - BODY: | - Ini adalah Tanda terima untuk surat yang anda kirim kepada %READ-RECEIPT%. - - Catatan: "Tanda terima ini hanya pernyataan bahwa pesan telah ditampilkan pada komputer penerima ." - Tidak ada jaminan apapun bahwa penerima telah membaca atau memahami isi pesan tersebut. - SUGGESTIONS: - SEARCHING_DESC: "Pencarian..." - CONTACTS: - LEGEND_CONTACTS: "Kontak" - SEARCH_INPUT_PLACEHOLDER: "Cari" - BUTTON_ADD_CONTACT: "Tambah Kontak" - BUTTON_CREATE_CONTACT: "Simpan" - BUTTON_UPDATE_CONTACT: "Perbarui" - BUTTON_IMPORT: "Impor (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Expor (vcf, vCard)" - BUTTON_EXPORT_CSV: "Expor (csv)" - ERROR_IMPORT_FILE: "Impor gagal (format berkas tidak sah)" - LIST_LOADING: "Memuat" - EMPTY_LIST: "Tidak ada kontak di sini" - EMPTY_SEARCH: "Tidak ditemukan kontak" - CLEAR_SEARCH: "Bersihkan pencarian" - CONTACT_VIEW_DESC: "Pilih kontak pada daftar untuk ditampilkan di sini." - LABEL_DISPLAY_NAME: "Nama tampilan" - LABEL_EMAIL: "Email" - LABEL_PHONE: "Telepon" - LABEL_WEB: "Web" - LABEL_BIRTHDAY: "Ultah" - LINK_ADD_EMAIL: "Tambah alamat email" - LINK_ADD_PHONE: "Tambah telepon" - LINK_BIRTHDAY: "Ultah" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Isi nama tampilan" - PLACEHOLDER_ENTER_LAST_NAME: "Isi nama belakang " - PLACEHOLDER_ENTER_FIRST_NAME: "Isi nama depan" - PLACEHOLDER_ENTER_NICK_NAME: "Isi nama panggilan" - LABEL_READ_ONLY: "Hanya bisa dibaca" - LABEL_SHARE: "Bagikan" - ADD_MENU_LABEL: "Tambah" - ADD_MENU_NICKNAME: "Nama panggilan" - ADD_MENU_NOTES: "Catatan" - ADD_MENU_EMAIL: "Email" - ADD_MENU_PHONE: "Telepon" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Alamat" - ADD_MENU_BIRTHDAY: "Ultah" - ADD_MENU_TAGS: "Penanda" - BUTTON_SHARE_NONE: "Kosongkan" - BUTTON_SHARE_ALL: "Semuanya" - BUTTON_SYNC: "Sinkronisasi (CardDAV)" - COMPOSE: - TITLE_FROM: "Dari" - TITLE_TO: "Kepada" - TITLE_CC: "CC" - TITLE_BCC: "BCC" - TITLE_REPLY_TO: "Balas-Ke" - TITLE_SUBJECT: "Judul" - LINK_SHOW_INPUTS: "tampikan semua isian" - BUTTON_SEND: "Kirim" - BUTTON_SAVE: "Simpan" - BUTTON_DELETE: "Hapus" - BUTTON_CANCEL: "Batal" - BUTTON_MINIMIZE: "Kecilkan layar" - SAVED_TIME: "Disimpan pada %TIME%" - SAVED_ERROR_ON_SEND: "Pesan telah dikirim namun tidak disimpan pada folder terkirim" - DISCARD_UNSAVED_DATA: "Buang data tanpa menyimpan?" - ATTACH_FILES: "Lampirkan berkas" - ATTACH_DROP_FILES_DESC: "Taruh file di sini" - ATTACH_ITEM_CANCEL: "Batal" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% ditulis" - FORWARD_MESSAGE_TOP_TITLE: "-------- Pesan terusan -------" - FORWARD_MESSAGE_TOP_FROM: "Dari" - FORWARD_MESSAGE_TOP_TO: "Kepada" - FORWARD_MESSAGE_TOP_CC: "CC" - FORWARD_MESSAGE_TOP_SENT: "Dikirim" - FORWARD_MESSAGE_TOP_SUBJECT: "Judul" - EMPTY_TO_ERROR_DESC: "Mohon sertakan setidaknya satu penerima" - NO_ATTACHMENTS_HERE_DESC: "Tidak ada lampiran" - ATTACHMENTS_ERROR_DESC: "Peringatan! belum semua lampiran terunggah." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Belum semua lampiran terunggah." - BUTTON_REQUEST_READ_RECEIPT: "Minta pemberitahuan telah dibaca" - BUTTON_MARK_AS_IMPORTANT: "Tandai sebagai penting" - BUTTON_OPEN_PGP: "OpenPGP (Teks Biasa)" - BUTTON_REQUEST_DSN: "Minta pemberitahuan berhasil kirim" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Tutup" - POPUPS_ASK: - BUTTON_YES: "Ya" - BUTTON_NO: "Tidak" - DESC_WANT_CLOSE_THIS_WINDOW: "Anda yakin untuk menutup jendela ini?" - DESC_WANT_DELETE_MESSAGES: "Anda yakin untuk menutup semua jendela ini?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Pilih bahasa" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Tambah Akun?" - BUTTON_ADD_ACCOUNT: "Tambah" - TITLE_UPDATE_ACCOUNT: "Perbarui Akun?" - BUTTON_UPDATE_ACCOUNT: "Perbarui" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Tambah Identitas?" - TITLE_UPDATE_IDENTITY: "Perbarui Identitas?" - BUTTON_ADD_IDENTITY: "Tambah" - BUTTON_UPDATE_IDENTITY: "Perbarui" - LABEL_EMAIL: "Email" - LABEL_NAME: "Nama" - LABEL_REPLY_TO: "Balas-Ke" - LABEL_SIGNATURE: "Tanda tangan" - LABEL_CC: "Cc" - LABEL_BCC: "Bcc" - LABEL_SIGNATURE_INSERT_BEFORE: "Sisipkan tanda tangan ini sebelum teks kutipan pada balasan" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Buat folder?" - LABEL_NAME: "Nama folder" - LABEL_PARENT: "Folder induk" - BUTTON_CREATE: "Buat" - BUTTON_CANCEL: "Batal" - BUTTON_CLOSE: "Tutup" - TITLE_CREATING_PROCESS: "Membuat folder" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Singkirkan semua pesan dari folder ini?" - BUTTON_CLEAR: "Bersihkan" - BUTTON_CANCEL: "Batal" - BUTTON_CLOSE: "Tutup" - DANGER_DESC_WARNING: "Peringatan!" - DANGER_DESC_HTML_1: "Aksi ini akan menyebabkan dibuangnya surat dari folder%FOLDER% secara menyeluruh." - DANGER_DESC_HTML_2: "Begitu dimulai, proses tidak dapat dibatalkan atau ditunda." - TITLE_CLEARING_PROCESS: "Membersihkan folder..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Impor kunci OpenPGP" - BUTTON_IMPORT_OPEN_PGP_KEY: "Impor" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Tampikan kunci OpenPGP" - BUTTON_SELECT: "Pilih" - BUTTON_CLOSE: "Tutup" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Buat kunci OpenPGP" - LABEL_EMAIL: "Email" - LABEL_NAME: "Nama" - LABEL_PASSWORD: "Sandi" - LABEL_KEY_BIT_LENGTH: "Panjang kunci" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Buat" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP Tandatangan/Enkripsi" - LABEL_SIGN: "Tandatangan" - LABEL_ENCRYPT: "Enkripsi" - LABEL_PASSWORD: "Sandi" - BUTTON_SIGN: "Tandatangani" - BUTTON_ENCRYPT: "Enkripsi" - BUTTON_SIGN_AND_ENCRYPT: "Tandatangani dan Enkripsi" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Deksipsi" - LABEL_KEY: "Private Key" - LABEL_PASSWORD: "Sandi" - BUTTON_DECRYPT: "Deskripsi" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "Uji verifikasi 2-Langkah" - LABEL_CODE: "Kode" - BUTTON_TEST: "Uji" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Buat filter?" - TITLE_EDIT_FILTER: "Perbarui filter?" - FILTER_NAME: "Nama" - LEGEND_CONDITIONS: "Kondisi" - LEGEND_ACTIONS: "Aksi" - BUTTON_DONE: "Selesai" - BUTTON_ADD_CONDITION: "Tambah kondisi" - SELECT_ACTION_NONE: "Tidak ada" - SELECT_ACTION_MOVE_TO: "Pindahkan ke" - SELECT_ACTION_FORWARD_TO: "Teruskan ke" - SELECT_ACTION_REJECT: "Tolak" - SELECT_ACTION_VACATION_MESSAGE: "Pesan liburan" - SELECT_ACTION_DISCARD: "Buang" - SELECT_FIELD_FROM: "Dari" - SELECT_FIELD_RECIPIENTS: "Penerima (Kepada atau tembusan)" - SELECT_FIELD_SUBJECT: "Subjek" - SELECT_FIELD_HEADER: "Header" - SELECT_FIELD_SIZE: "Ukuran" - SELECT_TYPE_CONTAINS: "Berisi" - SELECT_TYPE_NOT_CONTAINS: "Tidak berisi" - SELECT_TYPE_MATCHES: "Cocok (mendukung * dan ?)" - SELECT_TYPE_NOT_MATCHES: "Tidak Cocok (mendukung * dan ?)" - SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Bukan Regexp" - SELECT_TYPE_EQUAL_TO: "Sama Dengan" - SELECT_TYPE_NOT_EQUAL_TO: "Tidak sama Dengan" - SELECT_TYPE_OVER: "Di atas" - SELECT_TYPE_UNDER: "Di bawah" - SELECT_MATCH_ANY: "Cocokkan dengan Salah satu pengaturan berikut" - SELECT_MATCH_ALL: "Cocokkan dengan semua pengaturan berikut" - MARK_AS_READ_LABEL: "Tandai sudah dibaca" - REPLY_INTERVAL_LABEL: "Selang waktu balasan (hari)" - KEEP_LABEL: "Tahan" - STOP_LABEL: "Jangan hentikan peraturan proses" - EMAIL_LABEL: "Email" - VACATION_SUBJECT_LABEL: "Subjek (opsional)" - VACATION_MESSAGE_LABEL: "Pesan" - VACATION_RECIPIENTS_LABEL: "Penerima (dipisahkan koma)" - REJECT_MESSAGE_LABEL: "Pesan terakhir" - ALL_INCOMING_MESSAGES_DESC: "Semua pesan masuk" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Piih folder sistem" - SELECT_CHOOSE_ONE: "Pilih satu" - SELECT_UNUSE_NAME: "Jangan gunakan" - LABEL_SENT: "Kirim" - LABEL_DRAFTS: "Konsep" - LABEL_SPAM: "Spam" - LABEL_TRASH: "Sampah" - LABEL_ARCHIVE: "Arsip" - BUTTON_CANCEL: "Batal" - BUTTON_CLOSE: "Tutup" - NOTIFICATION_SENT: | - Anda belum memilih folder sistem "Kirim" untuk menyimpan pesan setelah dikirim. - Jika anda tidak ingin meyimpan pesan terkirim, silahkan gunakan opsi "Jangan gunakan". - NOTIFICATION_DRAFTS: "Anda belum memilih folder sistem untuk \"Konsep\", tempat pesan yang sedang dibuat." - NOTIFICATION_SPAM: | - Anda belum memilih folder "Spam" tempat pesan spam disimpan. - Jika anda ingin membuang pesan secara permanen, gunakan opsi "Jangan Gunakan". - NOTIFICATION_TRASH: | - Anda belum memilih folder "Sampah" tempat pesan buangan ditempatkan. - Jika anda ingin membuang pesan secara permanen, gunakan opsi "Jangan gunakan". - NOTIFICATION_ARCHIVE: "Anda belum memilih folder \"Arsip\" untuk menempatkan pesan arsip." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "Verifikasi 2-Langkah (OTP)" - LABEL_ENABLE_TWO_FACTOR: "Nyalakan verifikasi 2-Langkah" - LABEL_TWO_FACTOR_USER: "User" - LABEL_TWO_FACTOR_STATUS: "Status" - LABEL_TWO_FACTOR_SECRET: "Kode Rahasia" - LABEL_TWO_FACTOR_BACKUP_CODES: "Kode cadangan" - BUTTON_CREATE: "Buah kode rahasia" - BUTTON_ACTIVATE: "Aktivasi" - BUTTON_CLEAR: "Bersihkan" - BUTTON_LOGOUT: "Logout" - BUTTON_DONE: "Selesai" - BUTTON_TEST: "Ujicoba" - LINK_TEST: "ujicoba" - BUTTON_SHOW_SECRET: "Tampilkan kode rahasia" - BUTTON_HIDE_SECRET: "Lenyapkan kode rahasia" - TWO_FACTOR_REQUIRE_DESC: "Akun anda butuh konfigurasi verifikasi 2-Langkah" - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Telah dikonfigurasi" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Belum dikonfigurasi" - TWO_FACTOR_SECRET_DESC: > - Impor info ini ke Google Authenticator client (atau TOTP client lain) menggunakan - QR Code yang disediakan di bawah atau dengan menginput kode secara manual. - TWO_FACTOR_BACKUP_CODES_DESC: > - Jika anda tidak mendapatkan kode melalui Google Authenticator (or other TOTP - client), anda bisa menggunakan kode cadangan untuk masuk. Setelah anda gunakan - kode cadangan, maka kode tersebut akan kadaluarsa. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Anda tidak bisa mengubah pengaturan ini sebelum diujicoba." - TITLES: - LOADING: "Memuat" - LOGIN: "Login" - MAILBOX: "Kotak surat" - SETTINGS: "Pengaturan" - COMPOSE: "Buat pesan" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "File terlalu besar" - ERROR_FILE_PARTIALLY_UPLOADED: "File terunggah separuh disebabkan sesuatu kesalahan" - ERROR_NO_FILE_UPLOADED: "Tidak ada file yang diunggah" - ERROR_MISSING_TEMP_FOLDER: "File temporer hilang" - ERROR_ON_SAVING_FILE: "Kesalahan tidak diketahui terkait unggahan file" - ERROR_FILE_TYPE: "Tipe file tidak sah" - ERROR_UNKNOWN: "Kesalahan tidak diketahui saat unggah file" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" - TEXT_SWITCHER_RICH_FORMATTING: "Rich formatting" - TEXT_SWITCHER_CONFIRM: "Format teks dan gambar akan lenyap. Anda yakin untuk melanjutkan?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Pribadi" - LABEL_GENERAL_NAME: "Umum" - LABEL_CONTACTS_NAME: "Kontak" - LABEL_FOLDERS_NAME: "Folder" - LABEL_ACCOUNTS_NAME: "Akun" - LABEL_IDENTITY_NAME: "Identitas" - LABEL_IDENTITIES_NAME: "Identitas" - LABEL_FILTERS_NAME: "Filter" - LABEL_TEMPLATES_NAME: "Template" - LABEL_SECURITY_NAME: "Keamanan" - LABEL_SOCIAL_NAME: "Sosial" - LABEL_THEMES_NAME: "Tema" - LABEL_CHANGE_PASSWORD_NAME: "Sandi" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Kembali" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filter" - BUTTON_SAVE: "Simpan" - BUTTON_ADD_FILTER: "Tambah Filter" - BUTTON_DELETE: "Hapus" - BUTTON_RAW_SCRIPT: "Gunakan User Script khusus" - SUBNAME_NONE: "Tidak ada" - SUBNAME_MOVE_TO: "Pindahkan ke \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Teruskan ke \"%EMAIL%\"" - SUBNAME_REJECT: "Tolak" - SUBNAME_VACATION_MESSAGE: "Pesan liburan" - SUBNAME_DISCARD: "Buang" - CAPABILITY_LABEL: "Kapabilitas" - LOADING_PROCESS: "Perbarui daftar filter" - DELETING_ASK: "Anda yakin?" - CHACHES_NEED_TO_BE_SAVED_DESC: "Perubahan ini perlu disimpan di server." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identitas" - LABEL_DISPLAY_NAME: "Nama" - LABEL_REPLY_TO: "Balas-Ke" - LABEL_SIGNATURE: "Tandatangan" - LABEL_ADD_SIGNATURE_TO_ALL: "Tambah tandatangan anda ke semua pesan keluar" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Keamanan" - LABEL_CONFIGURE_TWO_FACTOR: "Atur verifikasi 2-Langkah" - LABEL_AUTOLOGOUT: "Logout otomatis" - AUTOLOGIN_NEVER_OPTION_NAME: "Tidak pernah" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% menit" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% jam" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Umum" - LABEL_LANGUAGE: "Bahasa" - LABEL_IDENTITY: "Identitas" - LABEL_LAYOUT: "Tampilan" - LABEL_LAYOUT_NO_SPLIT: "Tanpa pemisah" - LABEL_LAYOUT_VERTICAL_SPLIT: "Pemisah vertikal" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Pemisah horizontal" - LABEL_EDITOR: "Editor teks bawaan" - LABEL_EDITOR_HTML: "Html" - LABEL_EDITOR_PLAIN: "Polos" - LABEL_EDITOR_HTML_FORCED: "Html (paksa)" - LABEL_EDITOR_PLAIN_FORCED: "Polos (paksa)" - LABEL_ANIMATION: "Animasi tampilan" - LABEL_ANIMATION_FULL: "Penuh" - LABEL_ANIMATION_NORMAL: "Normal" - LABEL_ANIMATION_NONE: "Tidak ada" - LABEL_VIEW_OPTIONS: "Tampilkan Opsi" - LABEL_USE_PREVIEW_PANE: "Gunakan panel pratinjau" - LABEL_USE_CHECKBOXES_IN_LIST: "Tampilkan centang dalam daftar" - LABEL_USE_THREADS: "Gunakan tread" - LABEL_REPLY_SAME_FOLDER: "Tempatkan pesan balasan di folder pesan yang dibalas" - LABEL_SHOW_IMAGES: "Selalu tampilkan gambar eksternal di dalam pesan" - LABEL_SHOW_ANIMATION: "Tampikan animasi" - LABEL_MESSAGE_PER_PAGE: "Pesan di halaman" - LABEL_NOTIFICATIONS: "Notifikasi" - LABEL_SOUND_NOTIFICATION: "Notifikasi suara" - LABEL_CHROME_NOTIFICATION_DESC: "Tampilkan jendela sembul notifikasi pesan" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(diblokir oleh browser)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Kontak" - LABEL_CONTACTS_AUTOSAVE: "Tambah penerima ke daftar alamat secara otomatis" - LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Nyalakan sinkronisasi remote" - LABEL_CONTACTS_SYNC_SERVER: "Server" - LABEL_CONTACTS_SYNC_AB_URL: "URL Buku alamat" - LABEL_CONTACTS_SYNC_USER: "User" - LABEL_CONTACTS_SYNC_PASSWORD: "Sandi" - SETTINGS_THEMES: - LEGEND_THEMES: "Tema" - LEGEND_THEMES_CUSTOM: "Konfigurasi tema khusus" - LABEL_CUSTOM_TYPE: "Tipe" - LABEL_CUSTOM_TYPE_LIGHT: "Terang" - LABEL_CUSTOM_TYPE_DARK: "Gelap" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Latar" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Unggah gambar latar (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "File terlalu besar" - ERROR_FILE_TYPE_ERROR: "Tipe file tidak sah (JPG dan PNG saja)" - ERROR_UNKNOWN: "Kesalahan tidak diketahui saat unggah file" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Hubungkan ke Google" - BUTTON_GOOGLE_DISCONNECT: "Putuskan dari Google" - MAIN_GOOGLE_DESC: "Setelah menyalakan login via Google, Anda bisa login ke akun ini menggunakan tombol Google pada halaman login." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Hubungkan Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Putuskan dari Facebook" - MAIN_FACEBOOK_DESC: "Setelah menyalakan login via Facebook, Anda bisa login ke akun ini menggunakan tombol Facebook pada halaman login." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Hubungkan Twitter" - BUTTON_TWITTER_DISCONNECT: "Putuskan Twitter" - MAIN_TWITTER_DESC: "Setelah menyalakan login via Twitter, Anda bisa login ke akun ini menggunakan tombol Twitter pada halaman login." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Daftar folder" - BUTTON_CREATE: "Buat folder" - BUTTON_SYSTEM: "Folder sistem" - BUTTON_DELETE: "Hapus" - BUTTON_SUBSCRIBE: "Langganan" - BUTTON_UNSUBSCRIBE: "Batal langganan" - LOADING_PROCESS: "Perbarui daftar folder" - CREATING_PROCESS: "Buat folder" - DELETING_PROCESS: "Hapus folder" - RENAMING_PROCESS: "Ubah nama folder" - DELETING_ASK: "Anda yakin?" - TO_MANY_FOLDERS_DESC_1: "Anda punya terlalu banyak folder!" - TO_MANY_FOLDERS_DESC_2: "Kami hanya menampilkan sebagian, untuk mencegah turunnya performa." - HELP_DELETE_FOLDER: "Hapus folder" - HELP_SHOW_HIDE_FOLDER: "Tampil/lenyapkan folder" - HELP_CHECK_FOR_NEW_MESSAGES: "Cek/jangan cek pesan baru" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Akun" - LEGEND_IDENTITIES: "Identitas" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Akun dan identitas" - BUTTON_ADD_ACCOUNT: "Tambahkan akun" - BUTTON_ADD_IDENTITY: "Tambahkan identitas" - BUTTON_DELETE: "Hapus" - LOADING_PROCESS: "Memperbarui..." - DELETING_ASK: "Anda yakin?" - DEFAULT_IDENTITY_LABEL: "Bawaan" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identitas" - LEGEND_IDENTITIES: "Identitas tambahan" - LABEL_DEFAULT: "Bawaan" - LABEL_DISPLAY_NAME: "Nama" - LABEL_REPLY_TO: "Balas-ke" - LABEL_SIGNATURE: "Tandatangan" - LABEL_ADD_SIGNATURE_TO_ALL: "Tambah tandatangan anda ke pesan keluar" - BUTTON_ADD_IDENTITY: "Tambah identitas" - BUTTON_DELETE: "Hapus" - LOADING_PROCESS: "Perbarui daftar identitas" - DELETING_ASK: "Anda yakin?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Ubah sandi" - LABEL_CURRENT_PASSWORD: "Sandi saat ini" - LABEL_NEW_PASSWORD: "Sandi Baru" - LABEL_REPEAT_PASSWORD: "Konfirmasi Sandi Baru" - BUTTON_UPDATE_PASSWORD: "Tetapkan Sandi Baru" - ERROR_PASSWORD_MISMATCH: "Sandi tidak sama, coba lagi" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Impor kunci OpenPGP" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Buat kunci OpenPGP" - TITLE_PRIVATE: "Pribadi" - TITLE_PUBLIC: "Publik" - DELETING_ASK: "Anda yakin?" - GENERATE_ONLY_HTTPS: "Hanya HTTPS" - LABEL_ALLOW_DRAFT_AUTOSAVE: "Simpan konsep otomatis" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Bantuan pintasan keyboard" - TAB_MAILBOX: "Kotak surat" - TAB_MESSAGE_LIST: "Daftar pesan" - TAB_MESSAGE_VIEW: "Tampilan pesan" - TAB_COMPOSE: "Buat pesan" - LABEL_OPEN_USER_DROPDOWN: "Buka dropdown user" - LABEL_REPLY: "Balas" - LABEL_REPLY_ALL: "Balas semua" - LABEL_FORWARD: "Teruskan" - LABEL_FORWARD_MULTIPLY: "Teruskan sebagai berkas" - LABEL_HELP: "Bantuan" - LABEL_CHECK_ALL: "Pilih semua pesan" - LABEL_ARCHIVE: "Arsip" - LABEL_DELETE: "Hapus" - LABEL_OPEN_THREAD: "Buka pekerjaan terpilih" - LABEL_MOVE: "Pindahkan" - LABEL_READ: "Tandai sudah baca pesan terpilih" - LABEL_UNREAD: "Tandai belum baca pesan terpilih" - LABEL_IMPORTANT: "Penting, tandai pesan terplilih" - LABEL_SEARCH: "Pencarian" - LABEL_CANCEL_SEARCH: "Batalkan pencarian" - LABEL_FULLSCREEN_ENTER: "Layar penuh (panel pratinjau)" - LABEL_VIEW_MESSAGE_ENTER: "Tampilkan pesan (Tanpa pratinjau)" - LABEL_SWITCH_TO_MESSAGE: "Pindahkan fokus ke pesan terpilih" - LABEL_SWITCH_TO_FOLDER_LIST: "Pindahkan fokuske daftar folder" - LABEL_FULLSCREEN_TOGGLE: "Tetapkan mode layar penuh" - LABEL_BLOCKQUOTES_TOGGLE: "Tetapkan kutip pesan" - LABEL_THREAD_NEXT: "Pesan berikutnya dalam rentang" - LABEL_THREAD_PREV: "Pesan sebelumnya dalam rentang" - LABEL_PRINT: "Cetak" - LABEL_EXIT_FULLSCREEN: "Keluar dari mode Layar penuh" - LABEL_CLOSE_MESSAGE: "Tutup pesan (Tanpa panel pratinjau)" - LABEL_SWITCH_TO_LIST: "Pindahkan fokus kembali ke daftar pesan" - LABEL_OPEN_COMPOSE_POPUP: "Buka popup buat pesan" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimalkan popup buat pesan" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Buka dropdown identitas" - LABEL_SAVE_MESSAGE: "Simpan pesan" - LABEL_SEND_MESSAGE: "Kirim pesan" - LABEL_CLOSE_COMPOSE: "Tutup buat pesan" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "Tidak ada kunci publik" - NO_PUBLIC_KEYS_FOUND_FOR: "Tidak ada kunci publik untuk \"%EMAIL%\" email" - NO_PRIVATE_KEY_FOUND: "Tidak ada kunci privat" - NO_PRIVATE_KEY_FOUND_FOR: "Tidak ada kunci privat untuk \"%EMAIL%\" email" - ADD_A_PUBLICK_KEY: "Tambah kunci publik" - SELECT_A_PRIVATE_KEY: "Pilih sebuah kunci privat" - UNVERIFIRED_SIGNATURE: "Tandatangan belum diverifikasi" - DECRYPTION_ERROR: "Kesalahan dekripsi OpenPGP" - GOOD_SIGNATURE: "Tandatangan sah dari user %USER%" - PGP_ERROR: "Kesalahan OpenPGP: %ERROR%" - SPECIFY_FROM_EMAIL: "Silahkan tentukan alamat ASAL email" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Silahkan tentukan setidaknya satu penerima" - NOTIFICATIONS: - INVALID_TOKEN: "Token tidak sah" - AUTH_ERROR: "Otentikasi gagal" - ACCESS_ERROR: "Kesalahan akses" - CONNECTION_ERROR: "Tidak terhubung ke server" - CAPTCHA_ERROR: "CAPTCHA salah." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Sosial ID ini tidak terkait dengan akun email manapun. Login dengan akses - email dan aktifkan fitur ini dari pengaturan akun. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Sosial ID ini tidak terkait dengan akun email manapun. Login dengan akses - email dan aktifkan fitur ini dari pengaturan akun. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Sosial ID ini tidak terkait dengan akun email manapun. Login dengan akses - email dan aktifkan fitur ini dari pengaturan akun. - DOMAIN_NOT_ALLOWED: "Domain tidak diizinkan" - ACCOUNT_NOT_ALLOWED: "Akun ini tidak diizinkan" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Diperlukan verifikasi 2 faktor" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Kesalahan verifikasi 2 faktor" - COULD_NOT_SAVE_NEW_PASSWORD: "Tidak bisa menyimpan password baru" - CURRENT_PASSWORD_INCORRECT: "Password sekarang tidak benar" - NEW_PASSWORD_SHORT: "Password terlalu pendek" - NEW_PASSWORD_WEAK: "Password terlalu mudah" - NEW_PASSWORD_FORBIDDENT: "Password mengandung karakter terlarang" - CONTACTS_SYNC_ERROR: "Kesalahan sinkronisasi kontak" - CANT_GET_MESSAGE_LIST: "Gagal memperoleh daftar pesan" - CANT_GET_MESSAGE: "Gagal memperoleh pesan" - CANT_DELETE_MESSAGE: "Gagal menghapus pesan" - CANT_MOVE_MESSAGE: "Gagal memindahkan pesan" - CANT_SAVE_MESSAGE: "Gagal menyimpan pesan" - CANT_SEND_MESSAGE: "Gagal mengirim pesan" - INVALID_RECIPIENTS: "Penerima tidak valid" - CANT_SAVE_FILTERS: "Gagal menyimpan filter" - CANT_GET_FILTERS: "Gagal memperoleh filter" - FILTERS_ARE_NOT_CORRECT: "Filter tidak benar" - CANT_CREATE_FOLDER: "Gagal membuat folder" - CANT_RENAME_FOLDER: "Gagal mengubah nama folder" - CANT_DELETE_FOLDER: "Gagal menghapus folder" - CANT_DELETE_NON_EMPTY_FOLDER: "Gagal menghapus direkori yang berisi" - CANT_SUBSCRIBE_FOLDER: "Gagal mengkaitkan folder" - CANT_UNSUBSCRIBE_FOLDER: "Tidak bisa memutus folder" - CANT_SAVE_SETTINGS: "Gagal menyimpan pengaturan" - CANT_SAVE_PLUGIN_SETTINGS: "Gagal menyimpan pengaturan" - DOMAIN_ALREADY_EXISTS: "Domain telah ada" - CANT_INSTALL_PACKAGE: "Gagal menginstall paket" - CANT_DELETE_PACKAGE: "Gagal membuang paket" - INVALID_PLUGIN_PACKAGE: "Paket plugin tidak sah" - UNSUPPORTED_PLUGIN_PACKAGE: "Paket plugin tidak didukung" - LICENSING_SERVER_IS_UNAVAILABLE: "Server langganan tidak tersedia." - LICENSING_DOMAIN_EXPIRED: "Langganan domain ini telah kadaluarsa." - LICENSING_DOMAIN_BANNED: "Langganan untuk domain ini dilarang." - DEMO_SEND_MESSAGE_ERROR: "Atas alasan keamanan, akun ini tidak diizinkan mengirim pesan ke alamat luar!" - DEMO_ACCOUNT_ERROR: "Atas alasan keamanan, akun ini tidak diizinkan melakukan aksi ini!" - ACCOUNT_ALREADY_EXISTS: "Akun sudah ada" - ACCOUNT_DOES_NOT_EXIST: "Akun tidak ada" - MAIL_SERVER_ERROR: "Terjadi kesalahan saat mengakses server mail" - INVALID_INPUT_ARGUMENT: "Uraian input tidak sah" - UNKNOWN_ERROR: "Kesalahan tidak diketahui" - STATIC: - BACK_LINK: "Muat ulang" - DOMAIN_LIST_DESC: "Daftar domain webmail yang boleh diakses." - PHP_EXSTENSIONS_ERROR_DESC: "Extensi PHP yang disyaratkan tidak tersedia dalam konfigurasi PHP anda!" - PHP_VERSION_ERROR_DESC: "Versi PHP anda (%VERSION%) lebih rendah dari syarat minimal yaitu 5.3.0!" - NO_SCRIPT_TITLE: "JavaScript diperlukan oleh aplikasi ini." - NO_SCRIPT_DESC: | - Dukungan Javascript tidak tersedia di peramban anda - Silahkan aktifkan dukungan Javascript di pengaturan peramban anda dan coba lagi. - NO_COOKIE_TITLE: "Dukurangan Cookies diperlukan oleh aplikasi ini." - NO_COOKIE_DESC: | - Dukungan cookies tidak tersedia di peramban anda. - Silahkan aktifkan dukungan Cookies di pengaturan peramban dan coba lagi. - BAD_BROWSER_TITLE: "Peramban anda kadaluarsa." - BAD_BROWSER_DESC: | - Untuk bisa menggunakan semua fitur aplikasi, - unduh dan pasang salah satu peramban berikut: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/is_IS.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/is_IS.yml deleted file mode 100755 index ce8e24f5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/is_IS.yml +++ /dev/null @@ -1,706 +0,0 @@ -is_IS: - LOGIN: - LABEL_EMAIL: "Netfang" - LABEL_LOGIN: "Innskrá" - LABEL_PASSWORD: "Lykilorð" - LABEL_SIGN_ME: "Muna" - LABEL_VERIFICATION_CODE: "Sannvottunarkóði" - LABEL_DONT_ASK_VERIFICATION_CODE: "Ekki spyrja um kóðann næstu 2 vikur" - BUTTON_SIGN_IN: "Innskrá" - TITLE_SIGN_IN_GOOGLE: "Innskráning með Google" - TITLE_SIGN_IN_FACEBOOK: "Innskráning með Facebook" - TITLE_SIGN_IN_TWITTER: "Innskráning með Twitter" - LABEL_FORGOT_PASSWORD: "Gleymdi lykilorði" - LABEL_REGISTRATION: "Nýskráning" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Bæta við aðgangi" - BUTTON_SETTINGS: "Stillingar" - BUTTON_HELP: "Hjálp" - BUTTON_LOGOUT: "Útskrá" - MOBILE: - BUTTON_MOBILE_VERSION: "Farsímaútgáfa" - BUTTON_DESKTOP_VERSION: "Skjáborðsútgáfa" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Leita" - TITLE_ADV: "Ítarleg leit" - LABEL_ADV_FROM: "Frá" - LABEL_ADV_TO: "Til" - LABEL_ADV_SUBJECT: "Viðfangsefni" - LABEL_ADV_TEXT: "Texti" - LABEL_ADV_HAS_ATTACHMENT: "Er með viðhengi" - LABEL_ADV_HAS_ATTACHMENTS: "Er með viðhengi" - LABEL_ADV_FLAGGED: "Flaggað" - LABEL_ADV_UNSEEN: "Ólesið" - LABEL_ADV_DATE: "Dagsetning" - LABEL_ADV_DATE_ALL: "Allt" - LABEL_ADV_DATE_3_DAYS: "Allt að 3 daga gömlu" - LABEL_ADV_DATE_7_DAYS: "Allt að viku gömlu" - LABEL_ADV_DATE_MONTH: "Allt að mánaðar gömlu" - LABEL_ADV_DATE_3_MONTHS: "Allt að 3 mánaða gömlu" - LABEL_ADV_DATE_6_MONTHS: "Allt að 6 mánaða gömlu" - LABEL_ADV_DATE_YEAR: "Allt að 1 árs gömlu" - BUTTON_ADV_SEARCH: "Leita" - PREVIEW_POPUP: - FULLSCREEN: "Víxla heilskjá af/á" - ZOOM: "Aðdráttir að/frá" - CLOSE: "Loka (Esc)" - LOADING: "Hleð..." - GALLERY_PREV: "Fyrra (vinstri örvarhnappur)" - GALLERY_NEXT: "Næsta (hægri örvarhnappur)" - GALLERY_COUNTER: "%curr% af %total%" - IMAGE_ERROR: "Myndina var ekki hægt að birta." - AJAX_ERROR: "Efnið var ekki hægt að birta." - FOLDER_LIST: - BUTTON_COMPOSE: "Semja" - BUTTON_CONTACTS: "Tengiliðir" - BUTTON_NEW_MESSAGE: "Ný skilaboð" - INBOX_NAME: "Innhólf" - SENT_NAME: "Sent" - DRAFTS_NAME: "Drög" - SPAM_NAME: "Ruslpóstur" - TRASH_NAME: "Ruslafata" - ARCHIVE_NAME: "Safnskrá" - QUOTA: - TITLE: "Disknotkun" - MESSAGE_LIST: - BUTTON_RELOAD: "Endurhlaða skilaboðalista" - BUTTON_MOVE_TO: "Færa í" - BUTTON_DELETE: "Eyða" - BUTTON_ARCHIVE: "Safnskrá" - BUTTON_SPAM: "Ruslpóstur" - BUTTON_NOT_SPAM: "Ekki ruslpóstur" - BUTTON_EMPTY_FOLDER: "Hreinsa möppu" - BUTTON_MULTY_FORWARD: "Áframsenda skilaboð" - BUTTON_DELETE_WITHOUT_MOVE: "Eyða endanlega" - BUTTON_MORE: "Meira" - MENU_SET_SEEN: "Merkja lesið" - MENU_SET_ALL_SEEN: "Merkja allt lesið" - MENU_UNSET_SEEN: "Merkja ólesið" - MENU_SET_FLAG: "Merkja" - MENU_UNSET_FLAG: "Afmerkja" - MENU_SELECT_ALL: "Allt" - MENU_SELECT_NONE: "Ekkert" - MENU_SELECT_INVERT: "Snúa við" - MENU_SELECT_UNSEEN: "Ólesið" - MENU_SELECT_SEEN: "Lesið" - MENU_SELECT_FLAGGED: "Flaggað" - MENU_SELECT_UNFLAGGED: "Afflaggað" - EMPTY_LIST: "Tómur listi." - EMPTY_SEARCH_LIST: "Engin skilaboð stemmdu við leitina þína." - SEARCH_RESULT_FOR: "Leitarniðurstöður fyrir \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "til baka í skilaboðalista" - LIST_LOADING: "Hleð" - EMPTY_SUBJECT_TEXT: "(Ekkert viðfangsefni)" - PUT_MESSAGE_HERE: "Slepptu skilaboðum hér til að skoða það í listanum" - TODAY_AT: "í dag kl. %TIME%" - YESTERDAY_AT: "í gær kl. %TIME%" - SEARCH_PLACEHOLDER: "Leita" - NEW_MESSAGE_NOTIFICATION: "Þú átt %COUNT% ný bréf!" - QUOTA_SIZE: "Notar %SIZE% (%PROC%%) af %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Breyta" - BUTTON_BACK: "Til baka" - BUTTON_CLOSE: "Loka" - BUTTON_DELETE: "Eyða" - BUTTON_UNSUBSCRIBE: "Hætta í áskrift að þessum lista" - BUTTON_ARCHIVE: "Safnskrá" - BUTTON_SPAM: "Ruslpóstur" - BUTTON_NOT_SPAM: "Ekki ruslpóstur" - BUTTON_MOVE_TO: "Færa í" - BUTTON_MORE: "Meira" - BUTTON_REPLY: "Svara" - BUTTON_REPLY_ALL: "Svara öllum" - BUTTON_FORWARD: "Áframsenda" - BUTTON_FORWARD_AS_ATTACHMENT: "Áframsenda sem viðhengi" - BUTTON_EDIT_AS_NEW: "Breyta sem nýju" - BUTTON_SHOW_IMAGES: "Sýna myndir" - BUTTON_NOTIFY_READ_RECEIPT: "Sendandinn hefur beðið um að vera látinn vita þegar þú lest þessi skilaboð." - BUTTON_IN_NEW_WINDOW: "Skoða í öðrum glugga" - BUTTON_THREAD_LIST: "Listi yfir samræður" - BUTTON_THREAD_PREV: "Fyrra" - BUTTON_THREAD_NEXT: "Næsta" - BUTTON_THREAD_MORE: "Fleiri skilaboð" - MENU_HEADERS: "Sýna bréfahausa" - MENU_VIEW_ORIGINAL: "Sýna upprunalegt" - MENU_DOWNLOAD_ORIGINAL: "Niðurhala sem .eml skrá" - MENU_FILTER_SIMILAR: "Sía skilaboð eins og þetta" - MENU_PRINT: "Prenta" - EMPTY_SUBJECT_TEXT: "(Ekkert viðhengi)" - LABEL_SUBJECT: "Viðhengi" - LABEL_DATE: "Dagsetning" - LABEL_FROM: "Frá" - LABEL_FROM_SHORT: "frá" - LABEL_TO: "Til" - LABEL_TO_SHORT: "til" - LABEL_CC: "CC" - LABEL_BCC: "BCC" - LABEL_REPLY_TO: "Svara á" - PRINT_LABEL_FROM: "Frá" - PRINT_LABEL_TO: "Til" - PRINT_LABEL_CC: "CC" - PRINT_LABEL_BCC: "BCC" - PRINT_LABEL_REPLY_TO: "Svara á" - PRINT_LABEL_DATE: "Dagsetning" - PRINT_LABEL_SUBJECT: "Viðhengi" - PRINT_LABEL_ATTACHMENTS: "Viðhengi" - MESSAGE_LOADING: "Hleð" - MESSAGE_VIEW_DESC: "Veldu bréf úr listanum til að skoða hér." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Lykilorð" - PGP_SIGNED_MESSAGE_DESC: "Skeyti undirritað með OpenPGP (smelltu til að sannvotta)" - PGP_ENCRYPTED_MESSAGE_DESC: "Skeyti dulritað með OpenPGP (smelltu til að afkóða)" - LINK_DOWNLOAD_AS_ZIP: "Sækja sem .zip skrá" - LINK_SAVE_TO_OWNCLOUD: "Vista í ownCloud" - LINK_SAVE_TO_DROPBOX: "Vista í Dropbox" - READ_RECEIPT: - SUBJECT: "Móttökukvittun (birt) - %SUBJECT%" - BODY: | - Þetta er kvittun fyrir móttöku á pósti sem þú sendir %READ-RECEIPT%. - - Athugaðu: Þessi móttökukvittun er aðeins staðfesting á því að skeytið var birt á skjá viðtakandans. - Ekkert getur ábyrgst að viðtakandinn hafi lesið eða skilið efni skilaboðanna. - SUGGESTIONS: - SEARCHING_DESC: "Leita..." - CONTACTS: - LEGEND_CONTACTS: "Tengiliðir" - SEARCH_INPUT_PLACEHOLDER: "Leita" - BUTTON_ADD_CONTACT: "Bæta við tengilið" - BUTTON_CREATE_CONTACT: "Búa til" - BUTTON_UPDATE_CONTACT: "Uppfæra" - BUTTON_IMPORT: "Flytja inn (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Flytja út (csv, vcf, vCard)" - BUTTON_EXPORT_CSV: "Flytja út (csv)" - ERROR_IMPORT_FILE: "Villa í innflutningi (ógilt skráasnið)" - LIST_LOADING: "Hleð" - EMPTY_LIST: "Engir tengiliðir hér" - EMPTY_SEARCH: "Engir tengiliðir fundust" - CLEAR_SEARCH: "Hreinsa leit" - CONTACT_VIEW_DESC: "Veldu tengilið í listanum til að skoða hér." - LABEL_DISPLAY_NAME: "Birtingarnafn" - LABEL_EMAIL: "Tölvupóstfang" - LABEL_PHONE: "Sími" - LABEL_WEB: "Vefsíða" - LABEL_BIRTHDAY: "Afmælisdagur" - LINK_ADD_EMAIL: "Bæta við tölvupóstfangi" - LINK_ADD_PHONE: "Bæta við síma" - LINK_BIRTHDAY: "Afmælisdagur" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Settu inn birtingarnafn" - PLACEHOLDER_ENTER_LAST_NAME: "Settu inn kenninafn" - PLACEHOLDER_ENTER_FIRST_NAME: "Settu inn eiginnafn" - PLACEHOLDER_ENTER_NICK_NAME: "Enter nickname" - LABEL_READ_ONLY: "Aðeins lesanlegt" - LABEL_SHARE: "Deila" - ADD_MENU_LABEL: "Bæta við" - ADD_MENU_NICKNAME: "Stuttnefni" - ADD_MENU_NOTES: "Minnispunktar" - ADD_MENU_EMAIL: "Tölvupóstfang" - ADD_MENU_PHONE: "Sími" - ADD_MENU_URL: "URL-slóð" - ADD_MENU_ADDRESS: "Heimilisfang" - ADD_MENU_BIRTHDAY: "Afmælisdagur" - ADD_MENU_TAGS: "Merki" - BUTTON_SHARE_NONE: "Ekkert" - BUTTON_SHARE_ALL: "Allir" - BUTTON_SYNC: "Samstilling (CardDAV)" - COMPOSE: - TITLE_FROM: "Frá" - TITLE_TO: "Til" - TITLE_CC: "CC" - TITLE_BCC: "BCC" - TITLE_REPLY_TO: "Svara á" - TITLE_SUBJECT: "Viðhengi" - LINK_SHOW_INPUTS: "sýna alla reiti" - BUTTON_SEND: "Senda" - BUTTON_SAVE: "Vista" - BUTTON_DELETE: "Eyða" - BUTTON_CANCEL: "Hætta við" - BUTTON_MINIMIZE: "Lágmarka" - SAVED_TIME: "Vistað kl. %TIME%" - SAVED_ERROR_ON_SEND: "Skeyti var sent en ekki vistað í sendingamöppu" - DISCARD_UNSAVED_DATA: "Henda óvistuðum gögnum?" - ATTACH_FILES: "Hengja við skrár" - ATTACH_DROP_FILES_DESC: "Setja skrár hér" - ATTACH_ITEM_CANCEL: "Hætta við" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, skrifaði %EMAIL%" - FORWARD_MESSAGE_TOP_TITLE: "-------- Áframsend skilaboð -------" - FORWARD_MESSAGE_TOP_FROM: "Frá" - FORWARD_MESSAGE_TOP_TO: "Til" - FORWARD_MESSAGE_TOP_CC: "CC" - FORWARD_MESSAGE_TOP_SENT: "Sent" - FORWARD_MESSAGE_TOP_SUBJECT: "Viðfangsefni" - EMPTY_TO_ERROR_DESC: "Vinsamlegast tiltaktu að minnsta kosti einn viðtakanda" - NO_ATTACHMENTS_HERE_DESC: "Engin viðhengi hér." - ATTACHMENTS_ERROR_DESC: "Aðvörun! Ekki er búið að senda inn öll viðhengi." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Ekki er búið að senda inn öll viðhengi." - BUTTON_REQUEST_READ_RECEIPT: "Biðja um staðfestingu á lestri" - BUTTON_MARK_AS_IMPORTANT: "Merkja sem mikilvægt" - BUTTON_OPEN_PGP: "OpenPGP (einungis hreinn texti)" - BUTTON_REQUEST_DSN: "Biðja um staðfestingu á afhendingu" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Loka" - POPUPS_ASK: - BUTTON_YES: "Já" - BUTTON_NO: "Nei" - DESC_WANT_CLOSE_THIS_WINDOW: "Ertu viss um að þú viljir loka þessum glugga?" - DESC_WANT_DELETE_MESSAGES: "Ertu viss um að þú viljir eyða skeytunum?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Veldu tungumálið þitt" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Bæta við aðgangi?" - BUTTON_ADD_ACCOUNT: "Bæta við" - TITLE_UPDATE_ACCOUNT: "Uppfæra aðgang?" - BUTTON_UPDATE_ACCOUNT: "Uppfæra" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Bæta við auðkenni?" - TITLE_UPDATE_IDENTITY: "Uppfæra auðkenni?" - BUTTON_ADD_IDENTITY: "Bæta við" - BUTTON_UPDATE_IDENTITY: "Uppfæra" - LABEL_EMAIL: "Tölvupóstfang" - LABEL_NAME: "Nafn" - LABEL_REPLY_TO: "Svara á" - LABEL_SIGNATURE: "Undirskrift" - LABEL_CC: "Cc" - LABEL_BCC: "Bcc" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Búa til möppu?" - LABEL_NAME: "Nafn á möppu" - LABEL_PARENT: "Undirmappa" - BUTTON_CREATE: "Búa til" - BUTTON_CANCEL: "Hætta við" - BUTTON_CLOSE: "Loka" - TITLE_CREATING_PROCESS: "Bý til möppu" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Fjarlægja öll bréf úr þessari möppu?" - BUTTON_CLEAR: "Hreinsa" - BUTTON_CANCEL: "Hætta við" - BUTTON_CLOSE: "Loka" - DANGER_DESC_WARNING: "Aðvörun!" - DANGER_DESC_HTML_1: "Þessi aðgerð veldur því að öll bréf úr %FOLDER% möppunni." - DANGER_DESC_HTML_2: "Það er ekki hægt að hætta við aðgerðina eftir að búið er að keyra hana." - TITLE_CLEARING_PROCESS: "Tæmi möppu..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Flytja inn OpenPGP-lykil" - BUTTON_IMPORT_OPEN_PGP_KEY: "Flytja inn" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Skoða OpenPGP-lykil" - BUTTON_SELECT: "Velja" - BUTTON_CLOSE: "Loka" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Búa til OpenPGP-lykla" - LABEL_EMAIL: "Tölvupóstfang" - LABEL_NAME: "Nafn" - LABEL_PASSWORD: "Lykilorð" - LABEL_KEY_BIT_LENGTH: "Lengd lykils" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Útbúa" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "Undirrita/Dulrita OpenPGP" - LABEL_SIGN: "Undirrita" - LABEL_ENCRYPT: "Dulrita" - LABEL_PASSWORD: "Lykilorð" - BUTTON_SIGN: "Undirrita" - BUTTON_ENCRYPT: "Dulrita" - BUTTON_SIGN_AND_ENCRYPT: "Undirrita og dulrita" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "Afkóða OpenPGP" - LABEL_KEY: "Einkalykill" - LABEL_PASSWORD: "Lykilorð" - BUTTON_DECRYPT: "Afkóða" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "Prófun á 2-þrepa sannvottun" - LABEL_CODE: "Kóði" - BUTTON_TEST: "Prófa" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Búa til síu?" - TITLE_EDIT_FILTER: "Uppfæra síu?" - FILTER_NAME: "Heiti" - LEGEND_CONDITIONS: "Skilyrði" - LEGEND_ACTIONS: "Aðgerðir" - BUTTON_DONE: "Lokið" - BUTTON_ADD_CONDITION: "Bæta við skilyrði" - SELECT_ACTION_NONE: "Ekkert" - SELECT_ACTION_MOVE_TO: "Færa í" - SELECT_ACTION_FORWARD_TO: "Áframsenda til" - SELECT_ACTION_REJECT: "Hafna" - SELECT_ACTION_VACATION_MESSAGE: "Skilaboð vegna frís" - SELECT_ACTION_DISCARD: "Henda" - SELECT_FIELD_FROM: "Frá" - SELECT_FIELD_RECIPIENTS: "Viðtakendur (Til eða CC)" - SELECT_FIELD_SUBJECT: "Viðfangsefni" - SELECT_FIELD_HEADER: "Haus" - SELECT_FIELD_SIZE: "Size" - SELECT_TYPE_CONTAINS: "Inniheldur" - SELECT_TYPE_NOT_CONTAINS: "Inniheldur ekki" - SELECT_TYPE_MATCHES: "Samsvaranir (stuðningur við * og ?)" - SELECT_TYPE_NOT_MATCHES: "Ekki-samsvaranir (stuðningur við * og ?)" - SELECT_TYPE_REGEXP: "Regluleg segð" - SELECT_TYPE_NOT_REGEXP: "Ekki regluleg segð" - SELECT_TYPE_EQUAL_TO: "Jafnt og" - SELECT_TYPE_NOT_EQUAL_TO: "Ekki jafnt og" - SELECT_TYPE_OVER: "Yfir" - SELECT_TYPE_UNDER: "Undir" - SELECT_MATCH_ANY: "Samsvarar EINHVERRI af eftirfarandi reglum" - SELECT_MATCH_ALL: "Samsvarar ÖLLUM eftirfarandi reglum" - MARK_AS_READ_LABEL: "Merkja sem lesið" - KEEP_LABEL: "Halda" - STOP_LABEL: "Ekki hætta að vinna með reglur" - EMAIL_LABEL: "Tölvupóstfang" - VACATION_SUBJECT_LABEL: "Viðfangsefni (valkvætt)" - VACATION_MESSAGE_LABEL: "Skilaboð" - VACATION_RECIPIENTS_LABEL: "Viðtakendur (aðgreindir með kommu)" - REJECT_MESSAGE_LABEL: "Hafna skilaboðum" - ALL_INCOMING_MESSAGES_DESC: "Öll innsend skeyti" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Veldu kerfismöppur" - SELECT_CHOOSE_ONE: "Veldu eitt" - SELECT_UNUSE_NAME: "Ekki nota" - LABEL_SENT: "Sent" - LABEL_DRAFTS: "Drög" - LABEL_SPAM: "Ruslpóstur" - LABEL_TRASH: "Ruslafata" - LABEL_ARCHIVE: "Safnskrá" - BUTTON_CANCEL: "Hætta við" - BUTTON_CLOSE: "Loka" - NOTIFICATION_SENT: | - Þú hefur ekki valið kerfismöppuna "Sent" fyrir bréf eftir sendingu. - Ef þú vilt fjarlægja bréfið endanlega, veldu þá valkostinn "Ekki nota". - NOTIFICATION_DRAFTS: "Þú hefur ekki valið kerfismöppuna \"Drög\" þar sem bréf sem eru vistuð í á meðan þú skrifar." - NOTIFICATION_SPAM: | - Þú hefur ekki valið kerfismöppuna "Ruslpóstur" sem ruslsendingar eru settar í. - Ef þú vilt fjarlægja bréfið endanlega, veldu þá valkostinn "Ekki nota". - NOTIFICATION_TRASH: | - Þú hefur ekki valið kerfismöppuna "Ruslafata" sem eydd bréf eru sett í. - Ef þú vilt fjarlægja bréfið endanlega, veldu þá valkostinn "Ekki nota". - NOTIFICATION_ARCHIVE: "Þú hefur ekki valið kerfismöppuna \"Safnskrá\" undir bréf sem á að geyma til langs tíma." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "2-þrepa sannvottun (TOTP)" - LABEL_ENABLE_TWO_FACTOR: "Virkja 2-þrepa sannvottun" - LABEL_TWO_FACTOR_USER: "Notandi" - LABEL_TWO_FACTOR_STATUS: "Staða" - LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" - BUTTON_CREATE: "Create New Secret" - BUTTON_ACTIVATE: "Activate" - BUTTON_CLEAR: "Clear" - BUTTON_LOGOUT: "Logout" - BUTTON_DONE: "Done" - BUTTON_TEST: "Test" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Show Secret" - BUTTON_HIDE_SECRET: "Hide Secret" - TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" - TWO_FACTOR_SECRET_DESC: >- - Import this info into your Google Authenticator client (or other TOTP client) - using the provided QR code below or by entering the code manually. - TWO_FACTOR_BACKUP_CODES_DESC: >- - If you can't receive codes via Google Authenticator, you can use backup codes - to sign in. After you’ve used a backup code to sign in, it will become inactive. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." - TITLES: - LOADING: "Hleð" - LOGIN: "Innskrá" - MAILBOX: "Pósthólf" - SETTINGS: "Stillingar" - COMPOSE: "Semja" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Skráin er of stór" - ERROR_FILE_PARTIALLY_UPLOADED: "Innsending á skrá heppnaðist ekki vegna óþekktrar villu" - ERROR_NO_FILE_UPLOADED: "Engin skrá send inn" - ERROR_MISSING_TEMP_FOLDER: "Tímabundna skráin er ekki til staðar" - ERROR_ON_SAVING_FILE: "Óþekkt innsendingar villa kom upp" - ERROR_FILE_TYPE: "Röng skráar tegund" - ERROR_UNKNOWN: "Óþekkt innsendingar villa kom upp" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXTI" - TEXT_SWITCHER_RICH_FORMATTING: "Rich forsnið" - TEXT_SWITCHER_CONFIRM: "Texta forsnið og myndir munu týnast. Ertu viss um að þú viljir halda áfram?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Persónulegt" - LABEL_GENERAL_NAME: "Almennt" - LABEL_CONTACTS_NAME: "Contacts" - LABEL_FOLDERS_NAME: "Möppur" - LABEL_ACCOUNTS_NAME: "Aðgangar" - LABEL_IDENTITY_NAME: "Identity" - LABEL_IDENTITIES_NAME: "Identities" - LABEL_FILTERS_NAME: "Filters" - LABEL_TEMPLATES_NAME: "Templates" - LABEL_SECURITY_NAME: "Security" - LABEL_SOCIAL_NAME: "Social" - LABEL_THEMES_NAME: "Þemur" - LABEL_CHANGE_PASSWORD_NAME: "Lykilorð" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Til baka" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filters" - BUTTON_SAVE: "Save" - BUTTON_ADD_FILTER: "Add a Filter" - BUTTON_DELETE: "Delete" - BUTTON_RAW_SCRIPT: "Use Custom User Script" - SUBNAME_NONE: "None" - SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" - SUBNAME_REJECT: "Reject" - SUBNAME_VACATION_MESSAGE: "Vacation message" - SUBNAME_DISCARD: "Discard" - CAPABILITY_LABEL: "Capability" - LOADING_PROCESS: "Updating filter list" - DELETING_ASK: "Are you sure?" - CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identity" - LABEL_DISPLAY_NAME: "Nafn" - LABEL_REPLY_TO: "Svara" - LABEL_SIGNATURE: "Undirskrift" - LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Security" - LABEL_CONFIGURE_TWO_FACTOR: "Stilla 2-þrepa sannvottun" - LABEL_AUTOLOGOUT: "Auto Logout" - AUTOLOGIN_NEVER_OPTION_NAME: "Never" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% klukkustund(ir)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Almennt" - LABEL_LANGUAGE: "Tungumál" - LABEL_IDENTITY: "Identity" - LABEL_LAYOUT: "Layout" - LABEL_LAYOUT_NO_SPLIT: "No Split" - LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" - LABEL_EDITOR: "Sjálfgefinn textaritill" - LABEL_EDITOR_HTML: "Html" - LABEL_EDITOR_PLAIN: "Venjulegur" - LABEL_EDITOR_HTML_FORCED: "Html (forced)" - LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" - LABEL_ANIMATION: "Interface animation" - LABEL_ANIMATION_FULL: "Full" - LABEL_ANIMATION_NORMAL: "Normal" - LABEL_ANIMATION_NONE: "None" - LABEL_VIEW_OPTIONS: "Sýni valmöguleikar" - LABEL_USE_PREVIEW_PANE: "Nota forskoðunarham" - LABEL_USE_CHECKBOXES_IN_LIST: "Sýna valkassa í listanum" - LABEL_USE_THREADS: "Nota þræði" - LABEL_REPLY_SAME_FOLDER: "Setja svör í möppu þar sem bréfið sem er verið að svara" - LABEL_SHOW_IMAGES: "Sýna ávallt myndir í bréfum" - LABEL_SHOW_ANIMATION: "Sýna hreyfingar" - LABEL_MESSAGE_PER_PAGE: "Bréf á síðu" - LABEL_NOTIFICATIONS: "Tilkynningar" - LABEL_SOUND_NOTIFICATION: "Sound notification" - LABEL_CHROME_NOTIFICATION_DESC: "Sýna tilkynningarglugga fyrir ný bréf" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Lokað af vafra)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Contacts" - LABEL_CONTACTS_AUTOSAVE: "Automatically add recipients to your address book" - LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" - LABEL_CONTACTS_SYNC_SERVER: "Server" - LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" - LABEL_CONTACTS_SYNC_USER: "User" - LABEL_CONTACTS_SYNC_PASSWORD: "Password" - SETTINGS_THEMES: - LEGEND_THEMES: "Þemur" - LEGEND_THEMES_CUSTOM: "Sérsniðin þemu stilling" - LABEL_CUSTOM_TYPE: "Tegund" - LABEL_CUSTOM_TYPE_LIGHT: "Ljós" - LABEL_CUSTOM_TYPE_DARK: "Dökk" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Bakgrunnur" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Senda inn bakgrunnsmynd (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "Skrá er of stór" - ERROR_FILE_TYPE_ERROR: "Röng skráartegund (aðeins JPG and PNG)" - ERROR_UNKNOWN: "Óþekkt innsendingarvilla kom upp" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Tengja Google" - BUTTON_GOOGLE_DISCONNECT: "Aftengja Google" - MAIN_GOOGLE_DESC: "Eftir að Google innskráing hefur verið gerð virk, þá getur þú skráð þig inná þennan aðgang með Google takkanum á innskráningarsíðu." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Tengja Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Aftengja Facebook" - MAIN_FACEBOOK_DESC: "Eftir að Facebook innskráing hefur verið gerð virk, þá getur þú skráð þig inná þennan aðgang með Facebook takkanum á innskráningarsíðu." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Tengja Twitter" - BUTTON_TWITTER_DISCONNECT: "Aftengja Twitter" - MAIN_TWITTER_DESC: "Eftir að Twitter innskráing hefur verið gerð virk, þá getur þú skráð þig inná þennan aðgang með Twitter takkanum á innskráningarsíðu.." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Möppulisti" - BUTTON_CREATE: "Búa til möppu" - BUTTON_SYSTEM: "Kerfismöppur" - BUTTON_DELETE: "Eyða" - BUTTON_SUBSCRIBE: "Áskrift" - BUTTON_UNSUBSCRIBE: "Afskrá" - LOADING_PROCESS: "Uppfæri möppu lista" - CREATING_PROCESS: "Bý til möppu" - DELETING_PROCESS: "Eyði möppu" - RENAMING_PROCESS: "Endurnefna möppu" - DELETING_ASK: "Ertu viss?" - TO_MANY_FOLDERS_DESC_1: "You have too many folders!" - TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." - HELP_DELETE_FOLDER: "Delete folder" - HELP_SHOW_HIDE_FOLDER: "Show/hide folder" - HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Aðgangslisti" - LEGEND_IDENTITIES: "Identities" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" - BUTTON_ADD_ACCOUNT: "Bæta við aðgangi" - BUTTON_ADD_IDENTITY: "Add an Identity" - BUTTON_DELETE: "Eyða" - LOADING_PROCESS: "Uppfæri aðgangslista" - DELETING_ASK: "Ertu viss?" - DEFAULT_IDENTITY_LABEL: "default" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identity" - LEGEND_IDENTITIES: "Additional Identities" - LABEL_DEFAULT: "Default" - LABEL_DISPLAY_NAME: "Nafn" - LABEL_REPLY_TO: "Svara" - LABEL_SIGNATURE: "Undirskrift" - LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" - BUTTON_ADD_IDENTITY: "Add Identity" - BUTTON_DELETE: "Delete" - LOADING_PROCESS: "Updating identity list" - DELETING_ASK: "Are you sure?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Breyta lykilorði" - LABEL_CURRENT_PASSWORD: "Núverandi lykilorð" - LABEL_NEW_PASSWORD: "Nýtt lykilorð" - LABEL_REPEAT_PASSWORD: "Nýtt lykilorð aftur" - BUTTON_UPDATE_PASSWORD: "Setja nýtt lykilorð" - ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" - TITLE_PRIVATE: "Private" - TITLE_PUBLIC: "Public" - DELETING_ASK: "Are you sure?" - GENERATE_ONLY_HTTPS: "HTTPS only" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" - TAB_MAILBOX: "Mailbox" - TAB_MESSAGE_LIST: "Message list" - TAB_MESSAGE_VIEW: "Message view" - TAB_COMPOSE: "Compose" - LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" - LABEL_REPLY: "Reply" - LABEL_REPLY_ALL: "Reply All" - LABEL_FORWARD: "Forward" - LABEL_FORWARD_MULTIPLY: "Forward (multiply)" - LABEL_HELP: "Help" - LABEL_CHECK_ALL: "Select all messages" - LABEL_ARCHIVE: "Archive" - LABEL_DELETE: "Delete" - LABEL_OPEN_THREAD: "Open selected thread" - LABEL_MOVE: "Move" - LABEL_READ: "Read selected messages" - LABEL_UNREAD: "Unread selected messages" - LABEL_IMPORTANT: "Mikilvægt, flagga valin skeyti" - LABEL_SEARCH: "Search" - LABEL_CANCEL_SEARCH: "Cancel search" - LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" - LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" - LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" - LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" - LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" - LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" - LABEL_THREAD_NEXT: "Next message in thread" - LABEL_THREAD_PREV: "Previous message in thread" - LABEL_PRINT: "Print" - LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" - LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" - LABEL_SWITCH_TO_LIST: "Switch focus back to message list" - LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" - LABEL_SAVE_MESSAGE: "Save message" - LABEL_SEND_MESSAGE: "Send message" - LABEL_CLOSE_COMPOSE: "Close compose" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "No public keys found" - NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" - NO_PRIVATE_KEY_FOUND: "No private key found" - NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" - ADD_A_PUBLICK_KEY: "Add a public key" - SELECT_A_PRIVATE_KEY: "Veldu einkalykil" - UNVERIFIRED_SIGNATURE: "Unverified signature" - DECRYPTION_ERROR: "OpenPGP decryption error" - GOOD_SIGNATURE: "Good signature from %USER%" - PGP_ERROR: "OpenPGP error: %ERROR%" - SPECIFY_FROM_EMAIL: "Please specify FROM email address" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" - NOTIFICATIONS: - INVALID_TOKEN: "Rangt tákn" - AUTH_ERROR: "Auðkenning mistókst" - ACCESS_ERROR: "Aðgangsvilla" - CONNECTION_ERROR: "Get ekki tengst á netþjón" - CAPTCHA_ERROR: "Rangt CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- - Þetta samfélags ID er ekki úthlutað á neitt netfang ennþá. Skráðu þig inn - með netfangs upplýsingum og bættu þessum valmöguleika við í aðgangsstillingum. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- - Þetta samfélags ID er ekki úthlutað á neitt netfang ennþá. Skráðu þig inn - með netfangs upplýsingum og bættu þessum valmöguleika við í aðgangsstillingum. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- - Þetta samfélags ID er ekki úthlutað á neitt netfang ennþá. Skráðu þig inn - með netfangs upplýsingum og bættu þessum valmöguleika við í aðgangsstillingum. - DOMAIN_NOT_ALLOWED: "Lén ekki leyft" - ACCOUNT_NOT_ALLOWED: "Account is not allowed" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" - COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" - CURRENT_PASSWORD_INCORRECT: "Current password incorrect" - NEW_PASSWORD_SHORT: "Password is too short" - NEW_PASSWORD_WEAK: "Password is too easy" - NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" - CONTACTS_SYNC_ERROR: "Contacts synchronization error" - CANT_GET_MESSAGE_LIST: "Get ekki sótt bréfa lista" - CANT_GET_MESSAGE: "Get ekki sótt bréf" - CANT_DELETE_MESSAGE: "Get ekki eytt bréfi" - CANT_MOVE_MESSAGE: "Get ekki fært bréf" - CANT_SAVE_MESSAGE: "Get ekki vistað bréf" - CANT_SEND_MESSAGE: "Get ekki sent bréf" - INVALID_RECIPIENTS: "Rangir viðtakendur" - CANT_SAVE_FILTERS: "Can't save filters" - CANT_GET_FILTERS: "Can't get filters" - FILTERS_ARE_NOT_CORRECT: "Filters are not correct" - CANT_CREATE_FOLDER: "Get ekki búið til möppu" - CANT_RENAME_FOLDER: "Get ekki endurnefnt möppu" - CANT_DELETE_FOLDER: "Get ekki eytt möppu" - CANT_DELETE_NON_EMPTY_FOLDER: "Get ekki eytt möppu í notkun" - CANT_SUBSCRIBE_FOLDER: "Get ekki gerst áskrifandi á möppu" - CANT_UNSUBSCRIBE_FOLDER: "Get ekki hætt áskrift á möppu" - CANT_SAVE_SETTINGS: "Get ekki vistað stillingar" - CANT_SAVE_PLUGIN_SETTINGS: "Get ekki stillingar" - DOMAIN_ALREADY_EXISTS: "Lén tilstaðar núþegar" - CANT_INSTALL_PACKAGE: "Mistókst að setja inn pakka" - CANT_DELETE_PACKAGE: "Mistókst að fjarlægja pakka" - INVALID_PLUGIN_PACKAGE: "Rangur forrita pakki" - UNSUPPORTED_PLUGIN_PACKAGE: "Óstuddur forrita pakki" - LICENSING_SERVER_IS_UNAVAILABLE: "Áskriftar netþjónn er ekki aðgengilegur" - LICENSING_DOMAIN_EXPIRED: "Áskrift furir þetta lén hefur runnið út." - LICENSING_DOMAIN_BANNED: "Áskrift fyrir þetta lén er bönnuð." - DEMO_SEND_MESSAGE_ERROR: "Vegna öryggissjónarmiða, þá hefur þessi sýni aðgangur ekki leyfi til að senda bréf á utanaðkomandi netföng!" - DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" - ACCOUNT_ALREADY_EXISTS: "Aðgangur er til núþegar" - ACCOUNT_DOES_NOT_EXIST: "Aðgangur er ekki til" - MAIL_SERVER_ERROR: "Villa kom upp við tilraun til að tengjast netþjóni" - INVALID_INPUT_ARGUMENT: "Invalid input argument" - UNKNOWN_ERROR: "Óþekkt villa" - STATIC: - BACK_LINK: "Endurhlaða" - DOMAIN_LIST_DESC: "Listi yfir lén sem vefpóstur má tengjast." - PHP_EXSTENSIONS_ERROR_DESC: "Nauðsynlegar PHP framlenginar eru ekki til staðar í PHP uppsetningunni þinni!" - PHP_VERSION_ERROR_DESC: "PHP útgáfan þín (%VERSION%) er eldri en lágmarks útgáfa sem krafist er (5.3.0)!" - NO_SCRIPT_TITLE: "JavaScript er nauðsynlegt fyrir þetta forrit." - NO_SCRIPT_DESC: | - JavaScript stuðningur er ekki til staðar fyrir vafrann þinn. - Vinsamlegast gerðu JavaScript virkt í vafranum þínum og reyndu aftur. - NO_COOKIE_TITLE: "Köku stuðningur er nauðsynlegur fyrir þetta forrit." - NO_COOKIE_DESC: | - Köku stuðningur er ekki til staðar í vafranum þínum. - Vinsamlegast gerðu JavaScript virkt í vafranum þínum og reyndu aftur. - BAD_BROWSER_TITLE: "Vafrinn þinn er úreltur." - BAD_BROWSER_DESC: | - Til að geta notað alla valmöguleika í þessu forriti, - niðurhalaðu og settu upp einn af þessum vöfrum: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/it_IT.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/it_IT.yml deleted file mode 100755 index 0468eaa6..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/it_IT.yml +++ /dev/null @@ -1,713 +0,0 @@ -it_IT: - LOGIN: - LABEL_EMAIL: "Email" - LABEL_LOGIN: "Login" - LABEL_PASSWORD: "Password" - LABEL_SIGN_ME: "Ricordami" - LABEL_VERIFICATION_CODE: "Codice di verifica" - LABEL_DONT_ASK_VERIFICATION_CODE: "Non chiedere il codice per 2 settimane" - BUTTON_SIGN_IN: "Accedi" - TITLE_SIGN_IN_GOOGLE: "Accedi usando Google" - TITLE_SIGN_IN_FACEBOOK: "Accedi usando Facebook" - TITLE_SIGN_IN_TWITTER: "Accedi usando Twitter" - LABEL_FORGOT_PASSWORD: "Ho dimenticato la password" - LABEL_REGISTRATION: "Registrazione" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Aggiungi account" - BUTTON_SETTINGS: "Impostazioni" - BUTTON_HELP: "Aiuto" - BUTTON_LOGOUT: "Esci" - MOBILE: - BUTTON_MOBILE_VERSION: "Versione mobile" - BUTTON_DESKTOP_VERSION: "Versione desktop" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Cerca" - TITLE_ADV: "Ricerca avanzata" - LABEL_ADV_FROM: "Da" - LABEL_ADV_TO: "A" - LABEL_ADV_SUBJECT: "Oggetto" - LABEL_ADV_TEXT: "Messaggio" - LABEL_ADV_HAS_ATTACHMENT: "Ha un allegato" - LABEL_ADV_HAS_ATTACHMENTS: "Ha più allegati" - LABEL_ADV_FLAGGED: "Preferiti" - LABEL_ADV_UNSEEN: "Non letti" - LABEL_ADV_DATE: "Data" - LABEL_ADV_DATE_ALL: "Tutte" - LABEL_ADV_DATE_3_DAYS: "Meno di 3 giorni fa" - LABEL_ADV_DATE_7_DAYS: "Meno di una settimana fa" - LABEL_ADV_DATE_MONTH: "Meno di un mese fa" - LABEL_ADV_DATE_3_MONTHS: "Meno di 3 mesi fa" - LABEL_ADV_DATE_6_MONTHS: "Meno di 6 mesi fa" - LABEL_ADV_DATE_YEAR: "Meno di un anno fa" - BUTTON_ADV_SEARCH: "Cerca" - PREVIEW_POPUP: - FULLSCREEN: "Passa a schermo intero" - ZOOM: "Ingrandisci +/-" - CLOSE: "Chiudi (Esc)" - LOADING: "Caricamento..." - GALLERY_PREV: "Precedente (Freccia sinistra)" - GALLERY_NEXT: "Successivo (Freccia destra)" - GALLERY_COUNTER: "%curr% di %total%" - IMAGE_ERROR: "L'immagine non può essere caricata." - AJAX_ERROR: "Il contenuto non può essere caricato." - FOLDER_LIST: - BUTTON_COMPOSE: "Scrivi messaggio" - BUTTON_CONTACTS: "Contatti" - BUTTON_NEW_MESSAGE: "Nuovo messaggio" - INBOX_NAME: "Posta in arrivo" - SENT_NAME: "Posta inviata" - DRAFTS_NAME: "Bozze" - SPAM_NAME: "Spam" - TRASH_NAME: "Cestino" - ARCHIVE_NAME: "Archivio" - QUOTA: - TITLE: "Uso della quota" - MESSAGE_LIST: - BUTTON_RELOAD: "Aggiorna" - BUTTON_MOVE_TO: "Sposta in" - BUTTON_DELETE: "Elimina" - BUTTON_ARCHIVE: "Archivia" - BUTTON_SPAM: "Segnala come spam" - BUTTON_NOT_SPAM: "Segnala come non spam" - BUTTON_EMPTY_FOLDER: "Svuota cartella" - BUTTON_MULTY_FORWARD: "Inoltra messaggi" - BUTTON_DELETE_WITHOUT_MOVE: "Elimina definitivamente" - BUTTON_MORE: "Altro" - MENU_SET_SEEN: "Marca come letto" - MENU_SET_ALL_SEEN: "Marca tutti come letti" - MENU_UNSET_SEEN: "Marca come non letto" - MENU_SET_FLAG: "Marca come preferito" - MENU_UNSET_FLAG: "Marca come non preferito" - MENU_SELECT_ALL: "Tutti" - MENU_SELECT_NONE: "Nessuno" - MENU_SELECT_INVERT: "Inverti" - MENU_SELECT_UNSEEN: "Non letti" - MENU_SELECT_SEEN: "Letti" - MENU_SELECT_FLAGGED: "Preferiti" - MENU_SELECT_UNFLAGGED: "Non preferiti" - EMPTY_LIST: "Lista vuota" - EMPTY_SEARCH_LIST: "Nessun messaggio corrisponde alla tua ricerca" - SEARCH_RESULT_FOR: "Risultati di ricerca per \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "ritorna alla lista dei messaggi" - LIST_LOADING: "Caricamento..." - EMPTY_SUBJECT_TEXT: "(Nessun oggetto)" - PUT_MESSAGE_HERE: "Trascina il messaggio qui per vederlo nella lista" - TODAY_AT: "oggi alle %TIME%" - YESTERDAY_AT: "ieri alle %TIME%" - SEARCH_PLACEHOLDER: "Cerca" - NEW_MESSAGE_NOTIFICATION: "Hai %COUNT% nuovi messaggi!" - QUOTA_SIZE: "Stai usando %SIZE% (%PROC%%) su %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Modifica" - BUTTON_BACK: "Indietro" - BUTTON_CLOSE: "Chiudi" - BUTTON_DELETE: "Elimina" - BUTTON_UNSUBSCRIBE: "Disiscriviti da questa lista" - BUTTON_ARCHIVE: "Archivia" - BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Non spam" - BUTTON_MOVE_TO: "Sposta in" - BUTTON_MORE: "Altro" - BUTTON_REPLY: "Rispondi" - BUTTON_REPLY_ALL: "Rispondi a tutti" - BUTTON_FORWARD: "Inoltra" - BUTTON_FORWARD_AS_ATTACHMENT: "Inoltra come allegato" - BUTTON_EDIT_AS_NEW: "Modifica come nuovo" - BUTTON_SHOW_IMAGES: "Mostra immagini esterne" - BUTTON_NOTIFY_READ_RECEIPT: "Chi ha inviato il messaggio ha richiesto di essere avvisato quando lo leggi." - BUTTON_IN_NEW_WINDOW: "Leggi in una finestra separata" - BUTTON_THREAD_LIST: "Messaggi in questa conversazione" - BUTTON_THREAD_PREV: "Messaggio precedente" - BUTTON_THREAD_NEXT: "Prossimo messaggio" - BUTTON_THREAD_MORE: "Più messaggi" - MENU_HEADERS: "Mostra le intestazioni del messaggio" - MENU_VIEW_ORIGINAL: "Visualizza sorgente" - MENU_DOWNLOAD_ORIGINAL: "Scarica come file .eml" - MENU_FILTER_SIMILAR: "Mostra messaggi come questo" - MENU_PRINT: "Stampa" - EMPTY_SUBJECT_TEXT: "(Nessun oggetto)" - LABEL_SUBJECT: "Oggetto" - LABEL_DATE: "Data" - LABEL_FROM: "Da" - LABEL_FROM_SHORT: "da" - LABEL_TO: "A" - LABEL_TO_SHORT: "a" - LABEL_CC: "CC" - LABEL_BCC: "CCN" - LABEL_REPLY_TO: "Rispondi a" - PRINT_LABEL_FROM: "Da" - PRINT_LABEL_TO: "A" - PRINT_LABEL_CC: "CC" - PRINT_LABEL_BCC: "CCN" - PRINT_LABEL_REPLY_TO: "Rispondi a" - PRINT_LABEL_DATE: "Data" - PRINT_LABEL_SUBJECT: "Oggetto" - PRINT_LABEL_ATTACHMENTS: "Allegati" - MESSAGE_LOADING: "Caricamento..." - MESSAGE_VIEW_DESC: "Seleziona un messaggio dalla lista per visualizzarlo qui" - MESSAGE_VIEW_MOVE_DESC: "Clicca sul nome della cartella nel pannello sinistro per selezionare la destinazione." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" - PGP_SIGNED_MESSAGE_DESC: "Messaggio firmato con OpenPGP (clicca qui per verificarlo)" - PGP_ENCRYPTED_MESSAGE_DESC: "Messaggio cifrato con OpenPGP (clicca qui per decifrarlo)" - LINK_DOWNLOAD_AS_ZIP: "Scarica come archivio ZIP" - LINK_SAVE_TO_OWNCLOUD: "Salva su OwnCloud" - LINK_SAVE_TO_CLOUD: "Salva nel cloud" - LINK_SAVE_TO_DROPBOX: "Salva su DropBox" - READ_RECEIPT: - SUBJECT: "Avviso di lettura - %SUBJECT%" - BODY: | - Questo è un avviso di lettura per la mail che hai inviato a %READ-RECEIPT%. - - Attenzione: questa notifica di lettura significa solo che il messaggio è stato visualizzato nel computer del destinatario. - Non c'è alcuna garanzia che il destinatario abbia letto o capito il contenuto del messaggio. - SUGGESTIONS: - SEARCHING_DESC: "Cerca..." - CONTACTS: - LEGEND_CONTACTS: "Contatti" - SEARCH_INPUT_PLACEHOLDER: "Cerca" - BUTTON_ADD_CONTACT: "Aggiungi contatto" - BUTTON_CREATE_CONTACT: "Crea" - BUTTON_UPDATE_CONTACT: "Aggiorna" - BUTTON_IMPORT: "Importa (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Esporta (vcf, vCard)" - BUTTON_EXPORT_CSV: "Esporta (csv)" - ERROR_IMPORT_FILE: "Errore di importazione (formato del file non valido)" - LIST_LOADING: "Caricamento..." - EMPTY_LIST: "Nessun contatto qui" - EMPTY_SEARCH: "Nessun contatto trovato" - CLEAR_SEARCH: "Pulisci ricerca" - CONTACT_VIEW_DESC: "Seleziona un contatto dalla lista per visualizzarlo qui" - LABEL_DISPLAY_NAME: "Nome visualizzato" - LABEL_EMAIL: "Email" - LABEL_PHONE: "Telefono" - LABEL_WEB: "Sito web" - LABEL_BIRTHDAY: "Compleanno" - LINK_ADD_EMAIL: "Aggiungi un'indirizzo email" - LINK_ADD_PHONE: "Aggiungi un numero di telefono" - LINK_BIRTHDAY: "Compleanno" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Inserisci il nome visualizzato" - PLACEHOLDER_ENTER_LAST_NAME: "Inserisci il cognome" - PLACEHOLDER_ENTER_FIRST_NAME: "Inserisci il nome" - PLACEHOLDER_ENTER_NICK_NAME: "Inserisci il nickname" - LABEL_READ_ONLY: "Sola lettura" - LABEL_SHARE: "Condividi" - ADD_MENU_LABEL: "Aggiungi" - ADD_MENU_NICKNAME: "Nickname" - ADD_MENU_NOTES: "Note" - ADD_MENU_EMAIL: "Indirizzo email" - ADD_MENU_PHONE: "Telefono" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Indirizzo" - ADD_MENU_BIRTHDAY: "Compleanno" - ADD_MENU_TAGS: "Tag" - BUTTON_SHARE_NONE: "Nessuno" - BUTTON_SHARE_ALL: "Tutti" - BUTTON_SYNC: "Sincronizzazione (CardDAV)" - COMPOSE: - TITLE_FROM: "Da" - TITLE_TO: "A" - TITLE_CC: "CC" - TITLE_BCC: "CCN" - TITLE_REPLY_TO: "Rispondi a" - TITLE_SUBJECT: "Oggetto" - LINK_SHOW_INPUTS: "Visualizza tutti i campi" - BUTTON_SEND: "Invia" - BUTTON_SAVE: "Salva" - BUTTON_DELETE: "Elimina" - BUTTON_CANCEL: "Annulla" - BUTTON_MINIMIZE: "Minimizza" - SAVED_TIME: "Salvata il %TIME%" - SAVED_ERROR_ON_SEND: "Il messaggio è stato inviato ma non è stato salvato nella cartella \"Posta inviata\"" - DISCARD_UNSAVED_DATA: "Elimino i dati non salvati?" - ATTACH_FILES: "Allega file" - ATTACH_DROP_FILES_DESC: "Trascina i file qui" - ATTACH_ITEM_CANCEL: "Annulla" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" - FORWARD_MESSAGE_TOP_TITLE: "------- Messaggio inoltrato -------" - FORWARD_MESSAGE_TOP_FROM: "Da" - FORWARD_MESSAGE_TOP_TO: "A" - FORWARD_MESSAGE_TOP_CC: "CC" - FORWARD_MESSAGE_TOP_SENT: "Inviato il" - FORWARD_MESSAGE_TOP_SUBJECT: "Oggetto" - EMPTY_TO_ERROR_DESC: "Specifica almeno un destinatario" - NO_ATTACHMENTS_HERE_DESC: "Nessun allegato." - ATTACHMENTS_ERROR_DESC: "Attenzione! Non tutti gli allegati sono stati caricati." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Non tutti gli allegati sono stati caricati al momento." - BUTTON_REQUEST_READ_RECEIPT: "Richiedi conferma di lettura" - BUTTON_MARK_AS_IMPORTANT: "Marca come importante" - BUTTON_OPEN_PGP: "OpenPGP (Solo testo semplice)" - BUTTON_REQUEST_DSN: "Richiedi conferma del ricevimento" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Chiudi" - POPUPS_ASK: - BUTTON_YES: "Si" - BUTTON_NO: "No" - DESC_WANT_CLOSE_THIS_WINDOW: "Sei sicuro di voler chiudere questa finestra?" - DESC_WANT_DELETE_MESSAGES: "Sei sicuro di voler eliminare il messaggio?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Seleziona lingua" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Aggiungo un account?" - BUTTON_ADD_ACCOUNT: "Aggiungi" - TITLE_UPDATE_ACCOUNT: "Aggiorno account?" - BUTTON_UPDATE_ACCOUNT: "Aggiorna" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Aggiungo un'identità?" - TITLE_UPDATE_IDENTITY: "Aggiorno identità?" - BUTTON_ADD_IDENTITY: "Aggiungi" - BUTTON_UPDATE_IDENTITY: "Aggiorna" - LABEL_EMAIL: "Email" - LABEL_NAME: "Nome" - LABEL_REPLY_TO: "Rispondi a" - LABEL_SIGNATURE: "Firma" - LABEL_CC: "CC" - LABEL_BCC: "CCN" - LABEL_SIGNATURE_INSERT_BEFORE: "Inserisci questa firma prima del messaggio citato nelle risposte" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Creo una cartella?" - LABEL_NAME: "Nome cartella" - LABEL_PARENT: "Genitore" - BUTTON_CREATE: "Crea" - BUTTON_CANCEL: "Annulla" - BUTTON_CLOSE: "Chiudi" - TITLE_CREATING_PROCESS: "Creazione cartella..." - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Elimino tutti i messaggi dalla cartella?" - BUTTON_CLEAR: "Elimina" - BUTTON_CANCEL: "Annulla" - BUTTON_CLOSE: "Chiudi" - DANGER_DESC_WARNING: "Attenzione!" - DANGER_DESC_HTML_1: "Questa azione eliminerà tutti i messaggi presenti nella cartella %FOLDER%." - DANGER_DESC_HTML_2: "Una volta iniziato, il processo non può più essere annullato." - TITLE_CLEARING_PROCESS: "Eliminazione cartella..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Importa chiave OpenPGP" - BUTTON_IMPORT_OPEN_PGP_KEY: "Importa" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Visualizza chiave OpenPGP" - BUTTON_SELECT: "Seleziona tutto" - BUTTON_CLOSE: "Chiudi" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Genera chiavi OpenPGP" - LABEL_EMAIL: "Indirizzo email" - LABEL_NAME: "Nome" - LABEL_PASSWORD: "Password" - LABEL_KEY_BIT_LENGTH: "Lunghezza della chiave" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Genera" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "Firma/Cifra con OpenPGP" - LABEL_SIGN: "Firma" - LABEL_ENCRYPT: "Cifra" - LABEL_PASSWORD: "Password" - BUTTON_SIGN: "Firma" - BUTTON_ENCRYPT: "Cifra" - BUTTON_SIGN_AND_ENCRYPT: "Firma e cifra" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" - LABEL_KEY: "Private Key" - LABEL_PASSWORD: "Password" - BUTTON_DECRYPT: "Decrypt" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "Verifica a 2 fattori" - LABEL_CODE: "Codice" - BUTTON_TEST: "Esegui test" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Creo un filtro?" - TITLE_EDIT_FILTER: "Aggiorno il filtro?" - FILTER_NAME: "Nome" - LEGEND_CONDITIONS: "Condizioni" - LEGEND_ACTIONS: "Azioni" - BUTTON_DONE: "Fatto" - BUTTON_ADD_CONDITION: "Aggiungi una condizione" - SELECT_ACTION_NONE: "Nessuna" - SELECT_ACTION_MOVE_TO: "Sposta in" - SELECT_ACTION_FORWARD_TO: "Inoltra a" - SELECT_ACTION_REJECT: "Rifiuta" - SELECT_ACTION_VACATION_MESSAGE: "Messaggio fuori-ufficio" - SELECT_ACTION_DISCARD: "Scarta" - SELECT_FIELD_FROM: "Da" - SELECT_FIELD_RECIPIENTS: "Destinatari (A oppure CC)" - SELECT_FIELD_SUBJECT: "Oggetto" - SELECT_FIELD_HEADER: "Intestazione" - SELECT_FIELD_SIZE: "Dimensione" - SELECT_TYPE_CONTAINS: "Contiene" - SELECT_TYPE_NOT_CONTAINS: "Non contiene" - SELECT_TYPE_MATCHES: "Corrisponde (* e ? supportati)" - SELECT_TYPE_NOT_MATCHES: "Non corrisponde (* e ? supportati)" - SELECT_TYPE_REGEXP: "Corrisponde Regexp" - SELECT_TYPE_NOT_REGEXP: "Non corrisponde regexp" - SELECT_TYPE_EQUAL_TO: "Uguale a" - SELECT_TYPE_NOT_EQUAL_TO: "Non uguale a" - SELECT_TYPE_OVER: "Maggiore di" - SELECT_TYPE_UNDER: "Minore di" - SELECT_MATCH_ANY: "Corrisponde ad una delle seguenti regole" - SELECT_MATCH_ALL: "Corrisponde a tutte le seguenti regole" - MARK_AS_READ_LABEL: "Marca come letto" - REPLY_INTERVAL_LABEL: "Intervallo di risposta (giorni)" - KEEP_LABEL: "Mantieni" - STOP_LABEL: "Non interrompere l'elaborazione delle regole" - EMAIL_LABEL: "Email" - VACATION_SUBJECT_LABEL: "Oggetto (opzionale)" - VACATION_MESSAGE_LABEL: "Messaggio" - VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" - REJECT_MESSAGE_LABEL: "Rifiuta messagio" - ALL_INCOMING_MESSAGES_DESC: "Tutti i messaggi in ingresso" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Seleziona le cartelle di sistema" - SELECT_CHOOSE_ONE: "Selezionane una" - SELECT_UNUSE_NAME: "Non usarla" - LABEL_SENT: "Posta inviata" - LABEL_DRAFTS: "Bozze" - LABEL_SPAM: "Spam" - LABEL_TRASH: "Cestino" - LABEL_ARCHIVE: "Archivio" - BUTTON_CANCEL: "Annulla" - BUTTON_CLOSE: "Chiudi" - NOTIFICATION_SENT: | - Non hai selezionato una cartella di sistema per la posta inviata. - Se non vuoi salvare i messaggi inviati seleziona "Non usarla". - NOTIFICATION_DRAFTS: "Non hai selezionato una cartella di sistema per le bozze." - NOTIFICATION_SPAM: | - Non hai selezionato una cartella di sistema per i messaggi spam. - Se li vuoi eliminare permanentemente seleziona "Non usarla". - NOTIFICATION_TRASH: | - Non hai selezionato una cartella di sistema per il cestino. - Se non lo vuoi usare (e quindi eliminare i messaggi permanentemente) seleziona "Non usarla". - NOTIFICATION_ARCHIVE: "Non hai selezionato una cartella di sistema per i messaggi archiviati." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "Autenticazione a due fattori" - LABEL_ENABLE_TWO_FACTOR: "Abilita autenticazione a due fattori" - LABEL_TWO_FACTOR_USER: "Utente" - LABEL_TWO_FACTOR_STATUS: "Stato" - LABEL_TWO_FACTOR_SECRET: "Codice segreto" - LABEL_TWO_FACTOR_BACKUP_CODES: "Codici di riserva" - BUTTON_CREATE: "Crea un nuovo codice segreto" - BUTTON_ACTIVATE: "Attiva" - BUTTON_CLEAR: "Disattiva" - BUTTON_LOGOUT: "Esci" - BUTTON_DONE: "Fatto" - BUTTON_TEST: "Esegui verifica" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Mostra codice segreto" - BUTTON_HIDE_SECRET: "Nascondi codice segreto" - TWO_FACTOR_REQUIRE_DESC: "Il tuo account richiede l'autenticazione a due fattori." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configurato" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Non configurato" - TWO_FACTOR_SECRET_DESC: >- - Importa questo codice nel tuo client di Google Authenticator (o un altro client - TOTP) usando il codice QR presente sotto o inserendo il codice manualmente. - TWO_FACTOR_BACKUP_CODES_DESC: >- - Se non puoi ricevere codici da Google Authenticator, puoi usare i codici di - riserva per entrare. Dopo aver usato un codice di riserva per entrare, esso - si disattiverà. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Non puoi salvare quest'impostazione senza prima verificarne il funzionamento." - TITLES: - LOADING: "Caricamento..." - LOGIN: "Accedi" - MAILBOX: "Casella di posta" - SETTINGS: "Impostazioni" - COMPOSE: "Scrivi messaggio" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Il file è troppo grande" - ERROR_FILE_PARTIALLY_UPLOADED: "Il file è stato caricato solo parzialmente per un motivo sconosciuto" - ERROR_NO_FILE_UPLOADED: "Nessun file è stato caricato" - ERROR_MISSING_TEMP_FOLDER: "Il file temporaneo non è presente" - ERROR_ON_SAVING_FILE: "Si è verificato un errore sconosciuto durante il caricamento del file" - ERROR_FILE_TYPE: "Il tipo di file non è valido" - ERROR_UNKNOWN: "Si è verificato un errore sconosciuto durante il caricamento del file" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> Testo semplice" - TEXT_SWITCHER_RICH_FORMATTING: "Testo formattato" - TEXT_SWITCHER_CONFIRM: "La formattazione del testo e le immagini andranno perse. Sei sicuro di voler continuare?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Personali" - LABEL_GENERAL_NAME: "Generali" - LABEL_CONTACTS_NAME: "Contatti" - LABEL_FOLDERS_NAME: "Cartelle" - LABEL_ACCOUNTS_NAME: "Account" - LABEL_IDENTITY_NAME: "Identità" - LABEL_IDENTITIES_NAME: "Identità" - LABEL_FILTERS_NAME: "Filtri" - LABEL_TEMPLATES_NAME: "Modelli" - LABEL_SECURITY_NAME: "Sicurezza" - LABEL_SOCIAL_NAME: "Social" - LABEL_THEMES_NAME: "Temi" - LABEL_CHANGE_PASSWORD_NAME: "Password" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Indietro" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filtri" - BUTTON_SAVE: "Salva" - BUTTON_ADD_FILTER: "Aggiungi filtro" - BUTTON_DELETE: "Elimina" - BUTTON_RAW_SCRIPT: "Usa script personalizzato" - SUBNAME_NONE: "Nessuno" - SUBNAME_MOVE_TO: "Sposta in \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Inoltra a \"%EMAIL%\"" - SUBNAME_REJECT: "Rifiuta" - SUBNAME_VACATION_MESSAGE: "Messaggio fuori-ufficio" - SUBNAME_DISCARD: "Scarta" - CAPABILITY_LABEL: "Caratteristiche" - LOADING_PROCESS: "Aggiornamento lista filtri" - DELETING_ASK: "Sei sicuro?" - CHACHES_NEED_TO_BE_SAVED_DESC: "Queste modifiche devono essere salvate nel server." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identità" - LABEL_DISPLAY_NAME: "Nome" - LABEL_REPLY_TO: "Rispondi a" - LABEL_SIGNATURE: "Firma" - LABEL_ADD_SIGNATURE_TO_ALL: "Aggiungi la firma a tutti i messaggi in uscita" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Sicurezza" - LABEL_CONFIGURE_TWO_FACTOR: "Configura autenticazione a due fattori" - LABEL_AUTOLOGOUT: "Disconnessione automatica" - AUTOLOGIN_NEVER_OPTION_NAME: "Mai" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minuti" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% ore" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Generali" - LABEL_LANGUAGE: "Lingua" - LABEL_IDENTITY: "Identità" - LABEL_LAYOUT: "Struttura" - LABEL_LAYOUT_NO_SPLIT: "A pagina intera" - LABEL_LAYOUT_VERTICAL_SPLIT: "Divisione verticale" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Divisione orizzontale" - LABEL_EDITOR: "Editor di testo predefinito" - LABEL_EDITOR_HTML: "HTML" - LABEL_EDITOR_PLAIN: "Testo semplice" - LABEL_EDITOR_HTML_FORCED: "Html (forzato)" - LABEL_EDITOR_PLAIN_FORCED: "Testo semplice (forzato)" - LABEL_ANIMATION: "Animazioni dell'interfaccia" - LABEL_ANIMATION_FULL: "Tutte" - LABEL_ANIMATION_NORMAL: "Normali" - LABEL_ANIMATION_NONE: "Nessuna" - LABEL_VIEW_OPTIONS: "Impostazioni di visualizzazione" - LABEL_USE_PREVIEW_PANE: "Mosta l'anteprima del messaggio" - LABEL_USE_CHECKBOXES_IN_LIST: "Mostra le caselle di spunta nella lista" - LABEL_USE_THREADS: "Usa le conversazioni" - LABEL_REPLY_SAME_FOLDER: "Posiziona le risposte nella cartella del messaggio a cui si è risposto" - LABEL_SHOW_IMAGES: "Visualizza sempre le immagini esterne nel messaggio" - LABEL_SHOW_ANIMATION: "Mostra le animazioni" - LABEL_MESSAGE_PER_PAGE: "Messaggi per pagina" - LABEL_NOTIFICATIONS: "Notifiche" - LABEL_SOUND_NOTIFICATION: "Notifica sonora" - LABEL_CHROME_NOTIFICATION_DESC: "Mostra le notifiche in caso di nuovi messaggi" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Bloccate dal browser)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Contatti" - LABEL_CONTACTS_AUTOSAVE: "Aggiungi automaticamente le persone che ti inviano mail alla rubrica" - LEGEND_CONTACTS_SYNC: "Sincronizzazione remota (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Abilita sincronizzazione remota" - LABEL_CONTACTS_SYNC_SERVER: "Server" - LABEL_CONTACTS_SYNC_AB_URL: "Indirizzo della rubrica" - LABEL_CONTACTS_SYNC_USER: "Utente" - LABEL_CONTACTS_SYNC_PASSWORD: "Password" - SETTINGS_THEMES: - LEGEND_THEMES: "Temi" - LEGEND_THEMES_CUSTOM: "Configurazione del tema personalizzato" - LABEL_CUSTOM_TYPE: "Tipo" - LABEL_CUSTOM_TYPE_LIGHT: "Chiaro" - LABEL_CUSTOM_TYPE_DARK: "Scuro" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Sfondo" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Carica immagine di sfondo (.jpg o .png)" - ERROR_FILE_IS_TOO_BIG: "Il file è più grande di 1MB" - ERROR_FILE_TYPE_ERROR: "Tipo di file invalido (solo .jpg o .png)" - ERROR_UNKNOWN: "Si è verificato un errore sconosciuto durante il caricamento del file" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Connetti a Google" - BUTTON_GOOGLE_DISCONNECT: "Disconnetti da Google" - MAIN_GOOGLE_DESC: "Dopo aver abilitato il login tramite Google, puoi accedere a questo account utilizzando il bottone \"Google\" nella schermata di login.\n" - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Connettiti a Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Disconnetti da Facebook" - MAIN_FACEBOOK_DESC: "Dopo aver abilitato il login tramite Facebook, puoi accedere a questo account utilizzando il bottone \"Facebook\" nella schermata di login.\n" - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Connettiti a Twitter" - BUTTON_TWITTER_DISCONNECT: "Disconnetti da Twitter" - MAIN_TWITTER_DESC: "Dopo aver abilitato il login tramite Twitter, puoi accedere a questo account utilizzando il bottone \"Twitter\" nella schermata di login.\n" - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Lista delle cartelle" - BUTTON_CREATE: "Crea una cartella" - BUTTON_SYSTEM: "Cartelle di sistema" - BUTTON_DELETE: "Elimina" - BUTTON_SUBSCRIBE: "Sottoscrivi" - BUTTON_UNSUBSCRIBE: "Rimuovi sottoscrizione" - LOADING_PROCESS: "Aggiornamento della lista delle cartelle..." - CREATING_PROCESS: "Creazione cartella..." - DELETING_PROCESS: "Eliminazione cartella..." - RENAMING_PROCESS: "Rinomina cartella..." - DELETING_ASK: "Sei sicuro?" - TO_MANY_FOLDERS_DESC_1: "Ci sono troppe cartelle!" - TO_MANY_FOLDERS_DESC_2: "Vengono visualizzate solo una parte per evitare problemi di performance." - HELP_DELETE_FOLDER: "Cancella cartella" - HELP_SHOW_HIDE_FOLDER: "Mostra/nascondi cartella" - HELP_CHECK_FOR_NEW_MESSAGES: "Controlla/non controlla la presenza di nuovi messaggi" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Lista degli account" - LEGEND_IDENTITIES: "Identità" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Account ed identità" - BUTTON_ADD_ACCOUNT: "Aggiungi account" - BUTTON_ADD_IDENTITY: "Aggiungi identità" - BUTTON_DELETE: "Elimina" - LOADING_PROCESS: "Aggiornamento della lista degli account..." - DELETING_ASK: "Sei sicuro?" - DEFAULT_IDENTITY_LABEL: "predefinito" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identità" - LEGEND_IDENTITIES: "Identità aggiuntive" - LABEL_DEFAULT: "Predefinita" - LABEL_DISPLAY_NAME: "Nome" - LABEL_REPLY_TO: "Rispondi a" - LABEL_SIGNATURE: "Firma" - LABEL_ADD_SIGNATURE_TO_ALL: "Aggiungi la firma a tutti i messaggi in uscita" - BUTTON_ADD_IDENTITY: "Aggiungi identità" - BUTTON_DELETE: "Elimina" - LOADING_PROCESS: "Aggiornamento lista delle identità" - DELETING_ASK: "Sei sicuro?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Cambia password" - LABEL_CURRENT_PASSWORD: "Password attuale" - LABEL_NEW_PASSWORD: "Nuova password" - LABEL_REPEAT_PASSWORD: "Ripeti nuova password" - BUTTON_UPDATE_PASSWORD: "Cambia password" - ERROR_PASSWORD_MISMATCH: "Le password non corrispondono, riprova" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Importa chiave OpenPGP" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Genera chiave OpenPGP" - TITLE_PRIVATE: "Privata" - TITLE_PUBLIC: "Pubblica" - DELETING_ASK: "Sei sicuro?" - GENERATE_ONLY_HTTPS: "solo tramite HTTPS" - LABEL_ALLOW_DRAFT_AUTOSAVE: "Salva automaticamente la bozza" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Aiuto sulle scorciatoie da tastiera" - TAB_MAILBOX: "Casella di posta" - TAB_MESSAGE_LIST: "Lista messaggi" - TAB_MESSAGE_VIEW: "Lettura messaggio" - TAB_COMPOSE: "Scrittura messaggio" - LABEL_OPEN_USER_DROPDOWN: "Apri menu utente" - LABEL_REPLY: "Rispondi" - LABEL_REPLY_ALL: "Rispondi a tutti" - LABEL_FORWARD: "Inoltra" - LABEL_FORWARD_MULTIPLY: "Inoltro multiplo" - LABEL_HELP: "Aiuto" - LABEL_CHECK_ALL: "Seleziona tutti i messaggi" - LABEL_ARCHIVE: "Archivia messaggio" - LABEL_DELETE: "Elimina messaggio" - LABEL_OPEN_THREAD: "Apri la conversazione selezionata" - LABEL_MOVE: "Sposta messaggio" - LABEL_READ: "Marca come letti i messaggi selezionati" - LABEL_UNREAD: "Marca come non letti i messaggi selezionati" - LABEL_IMPORTANT: "Marca importanti o preferiti/non preferiti i messaggi selezionati" - LABEL_SEARCH: "Cerca" - LABEL_CANCEL_SEARCH: "Annulla ricerca" - LABEL_FULLSCREEN_ENTER: "Schermo intero (con anteprima messaggi)" - LABEL_VIEW_MESSAGE_ENTER: "Visualizza messaggio (senza anteprima messaggi)" - LABEL_SWITCH_TO_MESSAGE: "Sposta la selezione sul messaggio corrente" - LABEL_SWITCH_TO_FOLDER_LIST: "Sposta la selezione sulla lista delle cartelle" - LABEL_FULLSCREEN_TOGGLE: "Attiva/disattiva la modalità a schermo intero" - LABEL_BLOCKQUOTES_TOGGLE: "Mostra/nascondi le citazioni" - LABEL_THREAD_NEXT: "Prossimo messaggio nella conversazione" - LABEL_THREAD_PREV: "Messaggio precedente nella conversazione" - LABEL_PRINT: "Stampa" - LABEL_EXIT_FULLSCREEN: "Esci dalla modalità a schermo intero" - LABEL_CLOSE_MESSAGE: "Chiudi messaggio (senza anteprima messaggi)" - LABEL_SWITCH_TO_LIST: "Sposta la selezione sulla lista messaggi" - LABEL_OPEN_COMPOSE_POPUP: "Apri finestra di scrittura" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Apri il menu di selezione delle identità" - LABEL_SAVE_MESSAGE: "Salva messaggio" - LABEL_SEND_MESSAGE: "Invia messaggio" - LABEL_CLOSE_COMPOSE: "Chiudi finestra di scrittura" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "Nessuna chiave pubblica trovata" - NO_PUBLIC_KEYS_FOUND_FOR: "Nessuna chiave pubblica trovata per l'indirizzo email \"%EMAIL%\"\n" - NO_PRIVATE_KEY_FOUND: "Nessuna chiave privata trovata" - NO_PRIVATE_KEY_FOUND_FOR: "Nessuna chiave privata trovata per l'indirizzo email \"%EMAIL%\"\n" - ADD_A_PUBLICK_KEY: "Add a public key" - SELECT_A_PRIVATE_KEY: "Seleziona una chiave privata" - UNVERIFIRED_SIGNATURE: "Firma non verificata" - DECRYPTION_ERROR: "Decriptazione con OpenPGP fallita" - GOOD_SIGNATURE: "Firma valida da %USER%" - PGP_ERROR: "Errore di OpenPGP: %ERROR%" - SPECIFY_FROM_EMAIL: "Specificare il mittente" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Specificare almeno un destinatario" - NOTIFICATIONS: - INVALID_TOKEN: "Token invalido" - AUTH_ERROR: "Autenticazione fallita" - ACCESS_ERROR: "Errore di accesso" - CONNECTION_ERROR: "Impossibile connettersi al server" - CAPTCHA_ERROR: "CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Questo ID sociale non è collegato ad alcun indirizzo email. Entra utilizzando - le credenziali delle email e abilita questa funzionalità nelle impostazioni. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Questo ID sociale non è collegato ad alcun indirizzo email. Entra utilizzando - le credenziali delle email e abilita questa funzionalità nelle impostazioni. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Questo ID sociale non è collegato ad alcun indirizzo email. Entra utilizzando - le credenziali delle email e abilita questa funzionalità nelle impostazioni. - DOMAIN_NOT_ALLOWED: "Il dominio non è autorizzato" - ACCOUNT_NOT_ALLOWED: "L'account non è autorizzato" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "La verifica a due fattori è richiesta" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "La verifica a due fattori è fallita" - COULD_NOT_SAVE_NEW_PASSWORD: "Impossibile salvare la nuova password" - CURRENT_PASSWORD_INCORRECT: "La password attuale è scorretta" - NEW_PASSWORD_SHORT: "La password è troppo corta" - NEW_PASSWORD_WEAK: "La password è troppo facile" - NEW_PASSWORD_FORBIDDENT: "La password contiene caratteri non consentiti" - CONTACTS_SYNC_ERROR: "Errore durante la sincronizzazione dei contatti" - CANT_GET_MESSAGE_LIST: "Impossibile ottenere la lista dei messaggi" - CANT_GET_MESSAGE: "Impossibile caricare il messaggio" - CANT_DELETE_MESSAGE: "Impossibile eliminare il messaggio" - CANT_MOVE_MESSAGE: "Impossibile spostare il messaggio" - CANT_SAVE_MESSAGE: "Impossibile salvare il messaggio" - CANT_SEND_MESSAGE: "Impossibile inviare il messaggio" - INVALID_RECIPIENTS: "Destinatario non valido" - CANT_SAVE_FILTERS: "Impossibile salvare i filtri" - CANT_GET_FILTERS: "Impossibile caricare i filtri" - FILTERS_ARE_NOT_CORRECT: "I filtri non sono corretti" - CANT_CREATE_FOLDER: "Impossibile creare la cartella" - CANT_RENAME_FOLDER: "Impossibile rinominare la cartella" - CANT_DELETE_FOLDER: "Impossibile eliminare la cartella" - CANT_DELETE_NON_EMPTY_FOLDER: "Impossibile eliminare una cartella non vuota" - CANT_SUBSCRIBE_FOLDER: "Impossibile sottoscrivere la cartella" - CANT_UNSUBSCRIBE_FOLDER: "Impossibile rimuovere la sottoscrizione alla cartella" - CANT_SAVE_SETTINGS: "Impossibile salvare le impostazioni" - CANT_SAVE_PLUGIN_SETTINGS: "Impossibile salvare le impostazioni delle estensioni" - DOMAIN_ALREADY_EXISTS: "Il dominio esiste già" - CANT_INSTALL_PACKAGE: "Impossibile installare il pacchetto" - CANT_DELETE_PACKAGE: "Impossibile rimuovere il pacchetto" - INVALID_PLUGIN_PACKAGE: "Estensione non valida" - UNSUPPORTED_PLUGIN_PACKAGE: "Estensione non supportata" - LICENSING_SERVER_IS_UNAVAILABLE: "Il server delle licenze non è raggiungibile" - LICENSING_DOMAIN_EXPIRED: "La licenza per questo dominio è scaduta" - LICENSING_DOMAIN_BANNED: "Questo dominio è stato bannato" - DEMO_SEND_MESSAGE_ERROR: "Per ragioni di sicurezza, questa demo non è abilitata ad inviare email ad inidirizzi esterni" - DEMO_ACCOUNT_ERROR: "Per ragioni di sicurezza, questo account non è autorizzato ad effettuare questa operazione!" - ACCOUNT_ALREADY_EXISTS: "L'account esiste già" - ACCOUNT_DOES_NOT_EXIST: "L'account non esiste" - MAIL_SERVER_ERROR: "Si è verificato un errore nel server mail" - INVALID_INPUT_ARGUMENT: "Argomento non valido" - UNKNOWN_ERROR: "Errore sconosciuto" - STATIC: - BACK_LINK: "Ricarica" - DOMAIN_LIST_DESC: "Lista dei domini abilitati ad accedere" - PHP_EXSTENSIONS_ERROR_DESC: "È richiesta un'estensione di PHP non installata!" - PHP_VERSION_ERROR_DESC: "La tua versione di PHP (%VERSION%) è meno recente della 5.3.0!" - NO_SCRIPT_TITLE: "È richiesto JavaScript per questa applicazione." - NO_SCRIPT_DESC: | - Il supporto a JavaScript è disabilitato. - Abilitare il supporto a JavaScript e riprovare. - NO_COOKIE_TITLE: "Sono richiesti i Cookie per questa applicazione." - NO_COOKIE_DESC: | - Il supporto ai Cookie è disabilitato. - Abilitare il supporto ai Cookie e riprovare. - BAD_BROWSER_TITLE: "Il tuo browser è troppo vecchio" - BAD_BROWSER_DESC: | - Per usare tutte le funzionalità dell'applicazione, - scarica ed installa uno dei seguenti browser: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ja_JP.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ja_JP.yml deleted file mode 100755 index 1f2bf114..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ja_JP.yml +++ /dev/null @@ -1,709 +0,0 @@ -ja_JP: - LOGIN: - LABEL_EMAIL: "メールアドレス" - LABEL_LOGIN: "ログイン" - LABEL_PASSWORD: "パスワード" - LABEL_SIGN_ME: "サインイン状態を保持する" - LABEL_VERIFICATION_CODE: "確認コード" - LABEL_DONT_ASK_VERIFICATION_CODE: "2週間、コードを確認しない" - BUTTON_SIGN_IN: "サインイン" - TITLE_SIGN_IN_GOOGLE: "Googleアカウントでログイン" - TITLE_SIGN_IN_FACEBOOK: "Facebookアカウントでログイン" - TITLE_SIGN_IN_TWITTER: "Twitterアカウントでログイン" - LABEL_FORGOT_PASSWORD: "パスワードを忘れた" - LABEL_REGISTRATION: "初回登録" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "アカウントを追加" - BUTTON_SETTINGS: "設定" - BUTTON_HELP: "ヘルプ" - BUTTON_LOGOUT: "ログアウト" - MOBILE: - BUTTON_MOBILE_VERSION: "モバイル版" - BUTTON_DESKTOP_VERSION: "デスクトップ版" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "検索" - TITLE_ADV: "高度な検索" - LABEL_ADV_FROM: "差出人" - LABEL_ADV_TO: "宛先" - LABEL_ADV_SUBJECT: "件名" - LABEL_ADV_TEXT: "キーワード" - LABEL_ADV_HAS_ATTACHMENT: "添付ファイルあり" - LABEL_ADV_HAS_ATTACHMENTS: "添付ファイルあり" - LABEL_ADV_FLAGGED: "スター付き" - LABEL_ADV_UNSEEN: "未読メール" - LABEL_ADV_DATE: "日付" - LABEL_ADV_DATE_ALL: "全て" - LABEL_ADV_DATE_3_DAYS: "3日前まで" - LABEL_ADV_DATE_7_DAYS: "1週間前まで" - LABEL_ADV_DATE_MONTH: "1ヶ月前まで" - LABEL_ADV_DATE_3_MONTHS: "3ヶ月前まで" - LABEL_ADV_DATE_6_MONTHS: "6ヶ月前まで" - LABEL_ADV_DATE_YEAR: "1年前まで" - BUTTON_ADV_SEARCH: "検索" - PREVIEW_POPUP: - FULLSCREEN: "フルスクリーン" - ZOOM: "拡大/縮小" - CLOSE: "閉じる (Esc)" - LOADING: "読み込み中..." - GALLERY_PREV: "前 (←)" - GALLERY_NEXT: "次 (→)" - GALLERY_COUNTER: "%curr% / %total%" - IMAGE_ERROR: "画像 が読み込めませんでした" - AJAX_ERROR: "コンテンツ が読み込めませんでした" - FOLDER_LIST: - BUTTON_COMPOSE: "作成" - BUTTON_CONTACTS: "連絡先" - BUTTON_NEW_MESSAGE: "新規作成" - INBOX_NAME: "受信トレイ" - SENT_NAME: "送信済み" - DRAFTS_NAME: "下書き" - SPAM_NAME: "迷惑メール" - TRASH_NAME: "ごみ箱" - ARCHIVE_NAME: "アーカイブ" - QUOTA: - TITLE: "クォータ使用量" - MESSAGE_LIST: - BUTTON_RELOAD: "リスト更新" - BUTTON_MOVE_TO: "移動" - BUTTON_DELETE: "削除" - BUTTON_ARCHIVE: "アーカイブ" - BUTTON_SPAM: "迷惑メールにする" - BUTTON_NOT_SPAM: "迷惑メールを解除" - BUTTON_EMPTY_FOLDER: "フォルダを空にする" - BUTTON_MULTY_FORWARD: "転送 (元のメッセージを添付)" - BUTTON_DELETE_WITHOUT_MOVE: "完全に削除" - BUTTON_MORE: "その他" - MENU_SET_SEEN: "既読にする" - MENU_SET_ALL_SEEN: "すべて既読にする" - MENU_UNSET_SEEN: "未読にする" - MENU_SET_FLAG: "スターをつける" - MENU_UNSET_FLAG: "スターをはずす" - MENU_SELECT_ALL: "全て" - MENU_SELECT_NONE: "選択解除" - MENU_SELECT_INVERT: "反転" - MENU_SELECT_UNSEEN: "未読" - MENU_SELECT_SEEN: "既読" - MENU_SELECT_FLAGGED: "フラグ付き" - MENU_SELECT_UNFLAGGED: "フラグなし" - EMPTY_LIST: "メッセージはありません" - EMPTY_SEARCH_LIST: "検索条件に一致するメールは見つかりませんでした。高度な検索を試してみてください。" - SEARCH_RESULT_FOR: "\"%SEARCH%\"の検索結果" - BACK_TO_MESSAGE_LIST: "メッセージ一覧に戻る" - LIST_LOADING: "読み込み中" - EMPTY_SUBJECT_TEXT: "(件名なし)" - PUT_MESSAGE_HERE: "ここにメッセージをドロップ" - TODAY_AT: "今日 %TIME%" - YESTERDAY_AT: "昨日 %TIME%" - SEARCH_PLACEHOLDER: "検索" - NEW_MESSAGE_NOTIFICATION: "%COUNT% の新しいメッセージ!" - QUOTA_SIZE: "%SIZE% (%PROC%%) / %LIMIT%を使用中" - MESSAGE: - BUTTON_EDIT: "編集" - BUTTON_BACK: "戻る" - BUTTON_CLOSE: "閉じる" - BUTTON_DELETE: "削除" - BUTTON_UNSUBSCRIBE: "このリストから登録解除" - BUTTON_ARCHIVE: "アーカイブ" - BUTTON_SPAM: "迷惑メール" - BUTTON_NOT_SPAM: "非スパム" - BUTTON_MOVE_TO: "移動" - BUTTON_MORE: "その他" - BUTTON_REPLY: "返信" - BUTTON_REPLY_ALL: "全員に返信" - BUTTON_FORWARD: "転送" - BUTTON_FORWARD_AS_ATTACHMENT: "添付ファイルとして転送" - BUTTON_EDIT_AS_NEW: "新しいメールとして編集" - BUTTON_SHOW_IMAGES: "外部画像を表示する" - BUTTON_NOTIFY_READ_RECEIPT: "差出人がメールの開封確認メッセージを求めています。" - BUTTON_IN_NEW_WINDOW: "新しいウインドウで開く" - BUTTON_THREAD_LIST: "スレッド一覧" - BUTTON_THREAD_PREV: "前へ" - BUTTON_THREAD_NEXT: "次へ" - BUTTON_THREAD_MORE: "さらに読み込む" - MENU_HEADERS: "メールのヘッダーを表示" - MENU_VIEW_ORIGINAL: "メールのソースを表示" - MENU_DOWNLOAD_ORIGINAL: ".emlファイルでダウンロード" - MENU_FILTER_SIMILAR: "このようなメッセージをフィルタ" - MENU_PRINT: "印刷" - EMPTY_SUBJECT_TEXT: "(件名なし)" - LABEL_SUBJECT: "件名" - LABEL_DATE: "日付" - LABEL_FROM: "差出人" - LABEL_FROM_SHORT: "差出人" - LABEL_TO: "宛先" - LABEL_TO_SHORT: "宛先" - LABEL_CC: "CC" - LABEL_BCC: "BCC" - LABEL_REPLY_TO: "Reply-To" - PRINT_LABEL_FROM: "差出人" - PRINT_LABEL_TO: "宛先" - PRINT_LABEL_CC: "CC" - PRINT_LABEL_BCC: "BCC" - PRINT_LABEL_REPLY_TO: "Reply-To" - PRINT_LABEL_DATE: "日付" - PRINT_LABEL_SUBJECT: "件名" - PRINT_LABEL_ATTACHMENTS: "添付ファイル" - MESSAGE_LOADING: "読み込み中" - MESSAGE_VIEW_DESC: "選択したメールがここに表示されます。" - MESSAGE_VIEW_MOVE_DESC: "左側のパネルでフォルダ名をクリックして移動先を選択します。" - PGP_PASSWORD_INPUT_PLACEHOLDER: "パスワード" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP 署名済みメッセージ (クリックして検証)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP 暗号化メッセージ (クリックして復号化)" - LINK_DOWNLOAD_AS_ZIP: "Zip としてダウンロード" - LINK_SAVE_TO_OWNCLOUD: "ownCloud へ保存" - LINK_SAVE_TO_CLOUD: "クラウドに保存する" - LINK_SAVE_TO_DROPBOX: "Dropbox へ保存" - READ_RECEIPT: - SUBJECT: "開封確認メッセージ - %SUBJECT%" - BODY: | - これは %READ-RECEIPT% に送信されたメールの開封確認です。 - - 注: 「この開封確認は、メッセージが受信者のコンピュータ上に表示されたことだけを意味しています。 」 - 受信者が読んだり、メッセージの内容を理解しているという保証はありません。 - SUGGESTIONS: - SEARCHING_DESC: "検索中..." - CONTACTS: - LEGEND_CONTACTS: "連絡先" - SEARCH_INPUT_PLACEHOLDER: "検索" - BUTTON_ADD_CONTACT: "連絡先を追加" - BUTTON_CREATE_CONTACT: "作成" - BUTTON_UPDATE_CONTACT: "更新" - BUTTON_IMPORT: "インポート (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "エクスポート (vcf, vCard)" - BUTTON_EXPORT_CSV: "エクスポート (csv)" - ERROR_IMPORT_FILE: "インポートエラー (ファイルフォーマットが不正です)" - LIST_LOADING: "読み込み中" - EMPTY_LIST: "連絡先がありません" - EMPTY_SEARCH: "連絡先が見つかりません" - CLEAR_SEARCH: "検索をクリア" - CONTACT_VIEW_DESC: "選択した連絡先がここに表示されます。" - LABEL_DISPLAY_NAME: "表示名" - LABEL_EMAIL: "メールアドレス" - LABEL_PHONE: "電話番号" - LABEL_WEB: "Web" - LABEL_BIRTHDAY: "誕生日" - LINK_ADD_EMAIL: "メールアドレスを追加" - LINK_ADD_PHONE: "電話番号を追加" - LINK_BIRTHDAY: "誕生日を追加" - PLACEHOLDER_ENTER_DISPLAY_NAME: "表示名を入力してください" - PLACEHOLDER_ENTER_LAST_NAME: "姓を入力してください" - PLACEHOLDER_ENTER_FIRST_NAME: "名を入力してください" - PLACEHOLDER_ENTER_NICK_NAME: "ニックネームを入力してください" - LABEL_READ_ONLY: "読み取り専用" - LABEL_SHARE: "共有" - ADD_MENU_LABEL: "追加" - ADD_MENU_NICKNAME: "ニックネーム" - ADD_MENU_NOTES: "注釈" - ADD_MENU_EMAIL: "メールアドレス" - ADD_MENU_PHONE: "電話番号" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "住所" - ADD_MENU_BIRTHDAY: "誕生日" - ADD_MENU_TAGS: "タグ" - BUTTON_SHARE_NONE: "なし" - BUTTON_SHARE_ALL: "すべて" - BUTTON_SYNC: "同期 (CardDAV)" - COMPOSE: - TITLE_FROM: "差出人" - TITLE_TO: "宛先" - TITLE_CC: "CC" - TITLE_BCC: "BCC" - TITLE_REPLY_TO: "返信先" - TITLE_SUBJECT: "件名" - LINK_SHOW_INPUTS: "すべて表示" - BUTTON_SEND: "送信" - BUTTON_SAVE: "保存" - BUTTON_DELETE: "削除" - BUTTON_CANCEL: "キャンセル" - BUTTON_MINIMIZE: "最小化" - SAVED_TIME: "%TIME% に保存しました" - SAVED_ERROR_ON_SEND: "メールは送信できましたが、送信済みに保存できませんでした" - DISCARD_UNSAVED_DATA: "保存していないデータを破棄しますか?" - ATTACH_FILES: "ファイルを添付" - ATTACH_DROP_FILES_DESC: "ここにファイルをドロップ" - ATTACH_ITEM_CANCEL: "キャンセル" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" - FORWARD_MESSAGE_TOP_TITLE: "-------- Forwarded message -------" - FORWARD_MESSAGE_TOP_FROM: "From" - FORWARD_MESSAGE_TOP_TO: "To" - FORWARD_MESSAGE_TOP_CC: "CC" - FORWARD_MESSAGE_TOP_SENT: "送信済み" - FORWARD_MESSAGE_TOP_SUBJECT: "件名" - EMPTY_TO_ERROR_DESC: "少なくとも一つの受信者を指定してください" - NO_ATTACHMENTS_HERE_DESC: "添付ファイルがありません" - ATTACHMENTS_ERROR_DESC: "警告!すべての添付ファイルがアップロードされているわけではありません。" - ATTACHMENTS_UPLOAD_ERROR_DESC: "すべての添付ファイルがアップロードされているわけではありません。" - BUTTON_REQUEST_READ_RECEIPT: "開封確認を要求する" - BUTTON_MARK_AS_IMPORTANT: "重要フラグをつける" - BUTTON_OPEN_PGP: "OpenPGP (プレーンテキストのみ)" - BUTTON_REQUEST_DSN: "配信確認を要求する" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "閉じる" - POPUPS_ASK: - BUTTON_YES: "はい" - BUTTON_NO: "いいえ" - DESC_WANT_CLOSE_THIS_WINDOW: "このウインドウを閉じていいですか?" - DESC_WANT_DELETE_MESSAGES: "メッセージを削除していいですか?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "言語を選択" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "アカウントを追加しますか?" - BUTTON_ADD_ACCOUNT: "追加" - TITLE_UPDATE_ACCOUNT: "アカウント更新しますか?" - BUTTON_UPDATE_ACCOUNT: "更新" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "メールの表示名を追加しますか?" - TITLE_UPDATE_IDENTITY: "メールの表示名を更新しますか?" - BUTTON_ADD_IDENTITY: "追加" - BUTTON_UPDATE_IDENTITY: "更新" - LABEL_EMAIL: "メールアドレス" - LABEL_NAME: "表示名" - LABEL_REPLY_TO: "返信先" - LABEL_SIGNATURE: "署名" - LABEL_CC: "Cc" - LABEL_BCC: "Bcc" - LABEL_SIGNATURE_INSERT_BEFORE: "返信の引用テキストの前に署名を挿入する" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "フォルダを作成しますか?" - LABEL_NAME: "フォルダ名" - LABEL_PARENT: "親フォルダ" - BUTTON_CREATE: "作成" - BUTTON_CANCEL: "キャンセル" - BUTTON_CLOSE: "閉じる" - TITLE_CREATING_PROCESS: "フォルダを作成中" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "フォルダ内のすべてのメールを消去しますか?" - BUTTON_CLEAR: "消去" - BUTTON_CANCEL: "キャンセル" - BUTTON_CLOSE: "閉じる" - DANGER_DESC_WARNING: "警告!" - DANGER_DESC_HTML_1: "この操作をすると、%FOLDER%フォルダからすべてのメールを完全に消去してしまいます。" - DANGER_DESC_HTML_2: "一度始めると、中止やキャンセルができません。" - TITLE_CLEARING_PROCESS: "フォルダを消去しています..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "OpenPGP キーをインポート" - BUTTON_IMPORT_OPEN_PGP_KEY: "インポート" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "OpenPGP キーを表示" - BUTTON_SELECT: "選択" - BUTTON_CLOSE: "閉じる" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "OpenPGP キーを生成" - LABEL_EMAIL: "メールアドレス" - LABEL_NAME: "名前" - LABEL_PASSWORD: "パスワード" - LABEL_KEY_BIT_LENGTH: "キーの長さ" - BUTTON_GENERATE_OPEN_PGP_KEYS: "生成" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP 署名/暗号化" - LABEL_SIGN: "署名" - LABEL_ENCRYPT: "暗号化" - LABEL_PASSWORD: "パスワード" - BUTTON_SIGN: "署名" - BUTTON_ENCRYPT: "暗号化" - BUTTON_SIGN_AND_ENCRYPT: "署名と暗号化" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP 復号化" - LABEL_KEY: "秘密鍵" - LABEL_PASSWORD: "パスワード" - BUTTON_DECRYPT: "復号化" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "2段階認証テスト" - LABEL_CODE: "コード" - BUTTON_TEST: "テスト" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "フィルターを作成しますか?" - TITLE_EDIT_FILTER: "フィルターを更新しますか?" - FILTER_NAME: "名前" - LEGEND_CONDITIONS: "条件" - LEGEND_ACTIONS: "アクション" - BUTTON_DONE: "完了" - BUTTON_ADD_CONDITION: "条件の追加" - SELECT_ACTION_NONE: "なし" - SELECT_ACTION_MOVE_TO: "移動" - SELECT_ACTION_FORWARD_TO: "転送" - SELECT_ACTION_REJECT: "拒否" - SELECT_ACTION_VACATION_MESSAGE: "バケーションメッセージ" - SELECT_ACTION_DISCARD: "破棄" - SELECT_FIELD_FROM: "送信者 (From)" - SELECT_FIELD_RECIPIENTS: "受信者 (To or CC)" - SELECT_FIELD_SUBJECT: "件名" - SELECT_FIELD_HEADER: "ヘッダー" - SELECT_FIELD_SIZE: "サイズ" - SELECT_TYPE_CONTAINS: "含む" - SELECT_TYPE_NOT_CONTAINS: "含まない" - SELECT_TYPE_MATCHES: "マッチする (* と ? が使用可)" - SELECT_TYPE_NOT_MATCHES: "マッチしない (* と ? が使用可)" - SELECT_TYPE_REGEXP: "正規表現" - SELECT_TYPE_NOT_REGEXP: "正規表現を使わない" - SELECT_TYPE_EQUAL_TO: "一致" - SELECT_TYPE_NOT_EQUAL_TO: "一致しない" - SELECT_TYPE_OVER: "Over" - SELECT_TYPE_UNDER: "Under" - SELECT_MATCH_ANY: "以下のルールのいずれかにマッチ" - SELECT_MATCH_ALL: "以下のルールのすべてにマッチ" - MARK_AS_READ_LABEL: "既読にする" - REPLY_INTERVAL_LABEL: "返信間隔 (日)" - KEEP_LABEL: "保持" - STOP_LABEL: "ルールの処理を止めない" - EMAIL_LABEL: "メールアドレス" - VACATION_SUBJECT_LABEL: "件名 (オプション)" - VACATION_MESSAGE_LABEL: "メッセージ" - VACATION_RECIPIENTS_LABEL: "受信者 (カンマ区切り)" - REJECT_MESSAGE_LABEL: "拒否メッセージ" - ALL_INCOMING_MESSAGES_DESC: "すべての受信メッセージ" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "システムフォルダーを選択" - SELECT_CHOOSE_ONE: "1つ選択" - SELECT_UNUSE_NAME: "使用しない" - LABEL_SENT: "送信済み" - LABEL_DRAFTS: "下書き" - LABEL_SPAM: "迷惑メール" - LABEL_TRASH: "ゴミ箱" - LABEL_ARCHIVE: "アーカイブ" - BUTTON_CANCEL: "キャンセル" - BUTTON_CLOSE: "閉じる" - NOTIFICATION_SENT: | - 送信済みメッセージを置くための ”Sent” システムフォルダが選択されていません。 - 送信済みメッセージを保存する必要がないのなら、"使用しない"オプションを選択してください。 - NOTIFICATION_DRAFTS: "下書きメッセージを置くための ”Sent” システムフォルダが選択されていません。" - NOTIFICATION_SPAM: | - 迷惑メールを置くための ”Spam” システムフォルダが選択されていません。 - 迷惑メールが完全に削除されるのを望むのなら、"使用しない"オプションを選択してください。 - NOTIFICATION_TRASH: | - 削除されたメッセージを置くための ”Trash” システムフォルダが選択されていません。 - 削除されたメッセージが完全に削除されるのを望むのなら、"使用しない"オプションを選択してください。 - NOTIFICATION_ARCHIVE: "アーカイブされたメッセージを置くための ”Archive” システムフォルダが選択されていません。" - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "2段階認証 (TOTP)" - LABEL_ENABLE_TWO_FACTOR: "2段階認証を有効にする" - LABEL_TWO_FACTOR_USER: "ユーザー" - LABEL_TWO_FACTOR_STATUS: "ステータス" - LABEL_TWO_FACTOR_SECRET: "シークレット" - LABEL_TWO_FACTOR_BACKUP_CODES: "バックアップコード" - BUTTON_CREATE: "新しいシークレットを作成" - BUTTON_ACTIVATE: "アクティベート" - BUTTON_CLEAR: "クリア" - BUTTON_LOGOUT: "ログアウト" - BUTTON_DONE: "完了" - BUTTON_TEST: "テスト" - LINK_TEST: "テスト" - BUTTON_SHOW_SECRET: "シークレットを表示" - BUTTON_HIDE_SECRET: "シークレットを非表示" - TWO_FACTOR_REQUIRE_DESC: "あなたのアカウントは、2段階認証の設定を必要としています" - TWO_FACTOR_SECRET_CONFIGURED_DESC: "設定済み" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "未設定" - TWO_FACTOR_SECRET_DESC: > - 提供された QR コードを使用するか、もしくは、手動でコードを入力することによって、Google 認証システム(もしくは、他の TOTP クライアント)へインポートします。 - TWO_FACTOR_BACKUP_CODES_DESC: > - Google認証システム(もしくは、他のTOTPクライアント)でコードを受け取ることができない場合は、バックアップコードを使用してサインインすることができます。 - - バックアップコードを使用してサインインすると、2段階認証は非アクティブになります。 - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "テストをしなければ設定を変更できません" - TITLES: - LOADING: "読み込み中" - LOGIN: "ログイン" - MAILBOX: "メールボックス" - SETTINGS: "設定" - COMPOSE: "作成" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "ファイルが大きすぎます" - ERROR_FILE_PARTIALLY_UPLOADED: "ファイルは、不明なエラーのため一部しかアップロードされませんでした" - ERROR_NO_FILE_UPLOADED: "ファイルはアップロードされていません" - ERROR_MISSING_TEMP_FOLDER: "一時ファイルが見つかりません" - ERROR_ON_SAVING_FILE: "不明なファイルアップロードエラーが発生しました" - ERROR_FILE_TYPE: "無効なファイル種類" - ERROR_UNKNOWN: "不明なファイルアップロードエラーが発生しました" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" - TEXT_SWITCHER_RICH_FORMATTING: "書式付きテキスト" - TEXT_SWITCHER_CONFIRM: "テキスト書式と画像は、失われます。続けてもよろしいですか?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "個人" - LABEL_GENERAL_NAME: "全般" - LABEL_CONTACTS_NAME: "連絡先" - LABEL_FOLDERS_NAME: "フォルダー" - LABEL_ACCOUNTS_NAME: "アカウント" - LABEL_IDENTITY_NAME: "表示名" - LABEL_IDENTITIES_NAME: "表示名" - LABEL_FILTERS_NAME: "フィルター" - LABEL_TEMPLATES_NAME: "テンプレート" - LABEL_SECURITY_NAME: "セキュリティ" - LABEL_SOCIAL_NAME: "SNS" - LABEL_THEMES_NAME: "テーマ" - LABEL_CHANGE_PASSWORD_NAME: "パスワード" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "戻る" - SETTINGS_FILTERS: - LEGEND_FILTERS: "フィルター" - BUTTON_SAVE: "保存" - BUTTON_ADD_FILTER: "フィルターを追加" - BUTTON_DELETE: "削除" - BUTTON_RAW_SCRIPT: "カスタムユーザースクリプトを使用する" - SUBNAME_NONE: "なし" - SUBNAME_MOVE_TO: "\"%FOLDER%\" へ移動" - SUBNAME_FORWARD_TO: "\"%EMAIL%\" へ転送" - SUBNAME_REJECT: "拒否" - SUBNAME_VACATION_MESSAGE: "バケーションメッセージ" - SUBNAME_DISCARD: "破棄" - CAPABILITY_LABEL: "Capability" - LOADING_PROCESS: "フィルターリストの更新中" - DELETING_ASK: "よろしいですか?" - CHACHES_NEED_TO_BE_SAVED_DESC: "これらの変更は、サーバーへ保存する必要があります。" - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "表示名" - LABEL_DISPLAY_NAME: "名前" - LABEL_REPLY_TO: "Reply-To" - LABEL_SIGNATURE: "署名" - LABEL_ADD_SIGNATURE_TO_ALL: "すべての送信メッセージに署名を追加する" - SETTINGS_SECURITY: - LEGEND_SECURITY: "セキュリティ" - LABEL_CONFIGURE_TWO_FACTOR: "2段階認証の設定" - LABEL_AUTOLOGOUT: "自動ログアウト" - AUTOLOGIN_NEVER_OPTION_NAME: "しない" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% 分" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% 時間" - SETTINGS_GENERAL: - LEGEND_GENERAL: "全般" - LABEL_LANGUAGE: "言語" - LABEL_IDENTITY: "表示名" - LABEL_LAYOUT: "レイアウト" - LABEL_LAYOUT_NO_SPLIT: "分割しない" - LABEL_LAYOUT_VERTICAL_SPLIT: "縦に分割" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "横に分割" - LABEL_EDITOR: "メール形式" - LABEL_EDITOR_HTML: "Html" - LABEL_EDITOR_PLAIN: "プレーンテキスト" - LABEL_EDITOR_HTML_FORCED: "Html (強制)" - LABEL_EDITOR_PLAIN_FORCED: "プレーンテキスト (強制)" - LABEL_ANIMATION: "インターフェース アニメーション" - LABEL_ANIMATION_FULL: "フル" - LABEL_ANIMATION_NORMAL: "標準" - LABEL_ANIMATION_NONE: "なし" - LABEL_VIEW_OPTIONS: "表示" - LABEL_USE_PREVIEW_PANE: "プレビューペインを使用する" - LABEL_USE_CHECKBOXES_IN_LIST: "リストにチェックボックスを表示" - LABEL_USE_THREADS: "スレッドを使う" - LABEL_REPLY_SAME_FOLDER: "返信したメッセージのフォルダに送信メールを置く" - LABEL_SHOW_IMAGES: "外部画像を常に表示する" - LABEL_SHOW_ANIMATION: "アニメーションを表示" - LABEL_MESSAGE_PER_PAGE: "1ページに表示する件数" - LABEL_NOTIFICATIONS: "通知設定" - LABEL_SOUND_NOTIFICATION: "サウンド通知" - LABEL_CHROME_NOTIFICATION_DESC: "新しいメッセージを受信したらポップアップで知らせる" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(ブラウザでブロックされています)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "連絡先" - LABEL_CONTACTS_AUTOSAVE: "返信したアドレスをアドレス帳へ自動的に追加する" - LEGEND_CONTACTS_SYNC: "リモート同期 (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "リモート同期を有効化" - LABEL_CONTACTS_SYNC_SERVER: "サーバー" - LABEL_CONTACTS_SYNC_AB_URL: "アドレス帳 URL" - LABEL_CONTACTS_SYNC_USER: "ユーザー" - LABEL_CONTACTS_SYNC_PASSWORD: "パスワード" - SETTINGS_THEMES: - LEGEND_THEMES: "テーマ" - LEGEND_THEMES_CUSTOM: "カスタムテーマ設定" - LABEL_CUSTOM_TYPE: "種類" - LABEL_CUSTOM_TYPE_LIGHT: "ライト" - LABEL_CUSTOM_TYPE_DARK: "ダーク" - LABEL_CUSTOM_BACKGROUND_IMAGE: "背景" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "背景画像をアップロード (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "ファイルが大きすぎます" - ERROR_FILE_TYPE_ERROR: "無効なファイル種類 (JPG/PNG のみ)" - ERROR_UNKNOWN: "不明なファイルアップロードエラーが発生しました" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Google に接続" - BUTTON_GOOGLE_DISCONNECT: "Google から切断" - MAIN_GOOGLE_DESC: "Google 経由のログインを有効にしたら、ログイン画面の Google ボタンを使ってこのアカウントにログインすることができます。" - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Facebook に接続" - BUTTON_FACEBOOK_DISCONNECT: "Facebook から切断" - MAIN_FACEBOOK_DESC: "Facebook 経由のログインを有効にしたら、ログイン画面の Facebook ボタンを使ってこのアカウントにログインすることができます。" - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Twitter に接続" - BUTTON_TWITTER_DISCONNECT: "Twitter から切断" - MAIN_TWITTER_DESC: "Twitter 経由のログインを有効にしたら、ログイン画面の Twitter ボタンを使ってこのアカウントにログインすることができます。" - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "フォルダー一覧" - BUTTON_CREATE: "フォルダを作成" - BUTTON_SYSTEM: "システムフォルダー" - BUTTON_DELETE: "削除" - BUTTON_SUBSCRIBE: "購読" - BUTTON_UNSUBSCRIBE: "購読解除" - LOADING_PROCESS: "フォルダーリストの更新" - CREATING_PROCESS: "フォルダーの作成" - DELETING_PROCESS: "フォルダーの削除" - RENAMING_PROCESS: "フォルダーの名前を変更" - DELETING_ASK: "よろしいですか?" - TO_MANY_FOLDERS_DESC_1: "フォルダーが多すぎます" - TO_MANY_FOLDERS_DESC_2: "パフォーマンスの問題を回避するために、それらの一部のみを示しています。" - HELP_DELETE_FOLDER: "フォルダーを削除" - HELP_SHOW_HIDE_FOLDER: "フォルダーの表示/非表示" - HELP_CHECK_FOR_NEW_MESSAGES: "新しいメッセージをチェックする/しない" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "アカウント一覧" - LEGEND_IDENTITIES: "表示名" - LEGEND_ACCOUNTS_AND_IDENTITIES: "アカウトと表示名" - BUTTON_ADD_ACCOUNT: "アカウントを追加" - BUTTON_ADD_IDENTITY: "表示名を追加" - BUTTON_DELETE: "削除" - LOADING_PROCESS: "更新中" - DELETING_ASK: "よろしいですか?" - DEFAULT_IDENTITY_LABEL: "デフォルト" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "表示名" - LEGEND_IDENTITIES: "追加の表示名" - LABEL_DEFAULT: "デフォルト" - LABEL_DISPLAY_NAME: "名前" - LABEL_REPLY_TO: "Reply-To" - LABEL_SIGNATURE: "署名" - LABEL_ADD_SIGNATURE_TO_ALL: "すべての送信メッセージに署名を追加する" - BUTTON_ADD_IDENTITY: "表示名の追加" - BUTTON_DELETE: "削除" - LOADING_PROCESS: "表示名の一覧の更新中" - DELETING_ASK: "よろしいですか?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "パスワードを変更" - LABEL_CURRENT_PASSWORD: "現在のパスワード" - LABEL_NEW_PASSWORD: "新しいパスワード" - LABEL_REPEAT_PASSWORD: "新しいパスワードの確認" - BUTTON_UPDATE_PASSWORD: "パスワードを変更" - ERROR_PASSWORD_MISMATCH: "パスワードが一致しません。もう一度やり直してください。" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "OpenPGP キーをインポート" - BUTTON_GENERATE_OPEN_PGP_KEYS: "OpenPGP キーを生成" - TITLE_PRIVATE: "プライベート" - TITLE_PUBLIC: "パブリック" - DELETING_ASK: "よろしいですか?" - GENERATE_ONLY_HTTPS: "HTTPS only" - LABEL_ALLOW_DRAFT_AUTOSAVE: "下書きを自動的に保存する" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "キーボード ショートカット ヘルプ" - TAB_MAILBOX: "メールボックス" - TAB_MESSAGE_LIST: "メッセージ一覧" - TAB_MESSAGE_VIEW: "メッセージ表示画面" - TAB_COMPOSE: "作成画面" - LABEL_OPEN_USER_DROPDOWN: "ユーザーメニューを開く" - LABEL_REPLY: "返信" - LABEL_REPLY_ALL: "全員に返信" - LABEL_FORWARD: "転送" - LABEL_FORWARD_MULTIPLY: "転送 (元のメッセージを添付)" - LABEL_HELP: "ヘルプ" - LABEL_CHECK_ALL: "すべてのメッセージを選択" - LABEL_ARCHIVE: "アーカイブ" - LABEL_DELETE: "削除" - LABEL_OPEN_THREAD: "選択したスレッドを開く" - LABEL_MOVE: "移動" - LABEL_READ: "選択したメッセージを既読にする" - LABEL_UNREAD: "選択したメッセージを未読にする" - LABEL_IMPORTANT: "選択したメッセージに重要フラグをつける" - LABEL_SEARCH: "検索" - LABEL_CANCEL_SEARCH: "検索を取り消す" - LABEL_FULLSCREEN_ENTER: "全画面 (プレビューペインレイアウト)" - LABEL_VIEW_MESSAGE_ENTER: "メッセージの表示 (非プレビューペインレイアウト)" - LABEL_SWITCH_TO_MESSAGE: "選択されたメッセージへ切り替える" - LABEL_SWITCH_TO_FOLDER_LIST: "フォルダー一覧へ切り替える" - LABEL_FULLSCREEN_TOGGLE: "フルスクリーンモードへの切り替え" - LABEL_BLOCKQUOTES_TOGGLE: "メッセージ引用の切り替え" - LABEL_THREAD_NEXT: "スレッドの次のメーッセージ" - LABEL_THREAD_PREV: "スレッドの前のメーッセージ" - LABEL_PRINT: "印刷" - LABEL_EXIT_FULLSCREEN: "フルスクリーンモードの終了" - LABEL_CLOSE_MESSAGE: "メッセージを閉じる (非プレビューペインレイアウト)" - LABEL_SWITCH_TO_LIST: "メッセージ一覧へ切り替える" - LABEL_OPEN_COMPOSE_POPUP: "作成画面を開く" - LABEL_MINIMIZE_COMPOSE_POPUP: "作成画面を最小化" - LABEL_OPEN_IDENTITIES_DROPDOWN: "表示名メニューを開く" - LABEL_SAVE_MESSAGE: "メッセージを保存" - LABEL_SEND_MESSAGE: "メッセージを送信" - LABEL_CLOSE_COMPOSE: "作成画面を閉じる" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "公開鍵が見つかりません" - NO_PUBLIC_KEYS_FOUND_FOR: "メールアドレス \"%EMAIL%\" の公開鍵が見つかりません" - NO_PRIVATE_KEY_FOUND: "秘密鍵が見つかりません" - NO_PRIVATE_KEY_FOUND_FOR: "メールアドレス \"%EMAIL%\" の秘密鍵が見つかりません" - ADD_A_PUBLICK_KEY: "公開鍵の追加" - SELECT_A_PRIVATE_KEY: "秘密鍵を選択してください" - UNVERIFIRED_SIGNATURE: "未確認の署名" - DECRYPTION_ERROR: "OpenPGP 復号化エラー" - GOOD_SIGNATURE: "%USER% からの正しい署名" - PGP_ERROR: "OpenPGP エラー: %ERROR%" - SPECIFY_FROM_EMAIL: "FROMのメールアドレスを指定してください" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "少なくても1つの受信者を指定してください" - NOTIFICATIONS: - INVALID_TOKEN: "無効なトークン" - AUTH_ERROR: "認証に失敗しました" - ACCESS_ERROR: "アクセスエラー" - CONNECTION_ERROR: "サーバーへ接続できません" - CAPTCHA_ERROR: "間違った CAPTCHA" - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - このSNSユーザーIDは、まだメールアカウント用に割り当てられていません。電子メールの資格情報を使用してログインし、アカウント設定でこの機能を有効にします。 - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - このSNSユーザーIDは、まだメールアカウント用に割り当てられていません。電子メールの資格情報を使用してログインし、アカウント設定でこの機能を有効にします。 - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - このSNSユーザーIDは、まだメールアカウント用に割り当てられていません。電子メールの資格情報を使用してログインし、アカウント設定でこの機能を有効にします。 - DOMAIN_NOT_ALLOWED: "ドメインは、許可されていません" - ACCOUNT_NOT_ALLOWED: "アカウントは、許可されていません" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2要素認証が必要です" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2要素認証エラー" - COULD_NOT_SAVE_NEW_PASSWORD: "新しいパスワードを保存できません。" - CURRENT_PASSWORD_INCORRECT: "現在のパスワードが間違っています" - NEW_PASSWORD_SHORT: "パスワードが短すぎます" - NEW_PASSWORD_WEAK: "パスワードが簡単すぎます" - NEW_PASSWORD_FORBIDDENT: "パスワードに、禁止された文字が含まれています" - CONTACTS_SYNC_ERROR: "連絡先 同期 エラー" - CANT_GET_MESSAGE_LIST: "メッセージ一覧が取得できません" - CANT_GET_MESSAGE: "メッセージを取得できません" - CANT_DELETE_MESSAGE: "メッセージを削除できません" - CANT_MOVE_MESSAGE: "メッセージを移動できません" - CANT_SAVE_MESSAGE: "メッセージを保存できません" - CANT_SEND_MESSAGE: "メッセージ送信できません" - INVALID_RECIPIENTS: "無効な受信者" - CANT_SAVE_FILTERS: "フィルターを保存できません" - CANT_GET_FILTERS: "フィルターを取得できません" - FILTERS_ARE_NOT_CORRECT: "フィルターが正しくありません" - CANT_CREATE_FOLDER: "フォルダを作成できません" - CANT_RENAME_FOLDER: "フォルダの名前を変更できません" - CANT_DELETE_FOLDER: "フォルダを削除できません" - CANT_DELETE_NON_EMPTY_FOLDER: "空ではないディレクトリを削除できません" - CANT_SUBSCRIBE_FOLDER: "フォルダを購読できません" - CANT_UNSUBSCRIBE_FOLDER: "フォルダを購読解除できません" - CANT_SAVE_SETTINGS: "設定が保存できません" - CANT_SAVE_PLUGIN_SETTINGS: "設定が保存できません" - DOMAIN_ALREADY_EXISTS: "ドメインが既に存在しています" - CANT_INSTALL_PACKAGE: "パッケージのインストールに失敗しました" - CANT_DELETE_PACKAGE: "パッケージの削除に失敗しました" - INVALID_PLUGIN_PACKAGE: "プラグインパッケージが不正です" - UNSUPPORTED_PLUGIN_PACKAGE: "プラグインパッケージがサポートされていません" - LICENSING_SERVER_IS_UNAVAILABLE: "サブスクリプションサーバーが利用できません" - LICENSING_DOMAIN_EXPIRED: "このドメインのサブスクリプションの有効期限が切れました" - LICENSING_DOMAIN_BANNED: "このドメインのサブスクリプションが無効化されました" - DEMO_SEND_MESSAGE_ERROR: "セキュリティ上の理由から、アカウントは、外部の電子メールアドレスにメッセージを送信することを許可されていません!" - DEMO_ACCOUNT_ERROR: "セキュリティ上の理由から、アカウントには、このアクションが許可されていません!" - ACCOUNT_ALREADY_EXISTS: "アカウントがすでに存在します" - ACCOUNT_DOES_NOT_EXIST: "アカウントは存在しません" - MAIL_SERVER_ERROR: "メールサーバーへのアクセス中にエラーが発生しました" - INVALID_INPUT_ARGUMENT: "無効な入力引数" - UNKNOWN_ERROR: "不明なエラー" - STATIC: - BACK_LINK: "更新" - DOMAIN_LIST_DESC: "ドメインの一覧は、Web メールのアクセスを許可されています。" - PHP_EXSTENSIONS_ERROR_DESC: "必要な PHP 拡張モジュールが、有効になっていません。" - PHP_VERSION_ERROR_DESC: "PHP バージョン (%VERSION%) が、 最低バージョンの 5.3.0 よりも低いです!" - NO_SCRIPT_TITLE: "このアプリケーションでは JavaScript が必要です。" - NO_SCRIPT_DESC: | - ブラウザで JavaScript が、有効になっていません。 - JavaScript を有効にして、再度試してください。 - NO_COOKIE_TITLE: "このアプリケーションでは Cookie が必要です。" - NO_COOKIE_DESC: | - ブラウザで Cookie が、有効になっていません。 - Cookie を有効にして、再度試してください。 - BAD_BROWSER_TITLE: "ブラウザが古いです。" - BAD_BROWSER_DESC: | - アプリケーションのすべての機能を使用するには、 - これらのブラウザの1つをダウンロードしてインストールします: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ko_KR.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ko_KR.yml deleted file mode 100755 index 8ea7948d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ko_KR.yml +++ /dev/null @@ -1,685 +0,0 @@ -ko_KR: - LOGIN: - LABEL_EMAIL: "이메일 주소" - LABEL_LOGIN: "아이디" - LABEL_PASSWORD: "비밀번호" - LABEL_SIGN_ME: "아이디 기억" - LABEL_DONT_ASK_VERIFICATION_CODE: "2주 동안 코드를 물어보지 않기" - BUTTON_SIGN_IN: "로그인" - TITLE_SIGN_IN_GOOGLE: "구글 계정으로 로그인" - TITLE_SIGN_IN_FACEBOOK: "페이스북 계정으로 로그인" - TITLE_SIGN_IN_TWITTER: "트위터 계정으로 로그인" - LABEL_FORGOT_PASSWORD: "비밀번호 분실" - LABEL_REGISTRATION: "회원가입" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "계정 추가" - BUTTON_SETTINGS: "설정" - BUTTON_HELP: "도움말" - BUTTON_LOGOUT: "로그아웃" - MOBILE: - BUTTON_MOBILE_VERSION: "모바일 버전" - BUTTON_DESKTOP_VERSION: "데스크탑 버전" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "검색" - TITLE_ADV: "고급 검색" - LABEL_ADV_FROM: "보낸 이" - LABEL_ADV_TO: "받는 이" - LABEL_ADV_SUBJECT: "제목" - LABEL_ADV_TEXT: "본문" - LABEL_ADV_HAS_ATTACHMENT: "첨부파일이 있는 메시지" - LABEL_ADV_HAS_ATTACHMENTS: "첨부파일이 있는 메시지" - LABEL_ADV_FLAGGED: "즐겨찾기" - LABEL_ADV_UNSEEN: "Unseen" - LABEL_ADV_DATE: "수신일" - LABEL_ADV_DATE_ALL: "모두" - LABEL_ADV_DATE_3_DAYS: "3일 이내" - LABEL_ADV_DATE_7_DAYS: "1주일 이내" - LABEL_ADV_DATE_MONTH: "1개월 이내" - LABEL_ADV_DATE_3_MONTHS: "3개월 이내" - LABEL_ADV_DATE_6_MONTHS: "6개월 이내" - LABEL_ADV_DATE_YEAR: "1년 이내" - BUTTON_ADV_SEARCH: "찾기" - PREVIEW_POPUP: - FULLSCREEN: "전체화면" - ZOOM: "확대/축소" - CLOSE: "닫기 (Esc)" - LOADING: "로딩 중..." - GALLERY_PREV: "이전 (왼쪽 방향키)" - GALLERY_NEXT: "다음 (오른쪽 방향키)" - GALLERY_COUNTER: "%total% 중 %curr%" - IMAGE_ERROR: "이미지를 불러오지 못했습니다." - AJAX_ERROR: "내용을 불러오지 못했습니다." - FOLDER_LIST: - BUTTON_COMPOSE: "메일 쓰기" - BUTTON_CONTACTS: "연락처" - BUTTON_NEW_MESSAGE: "새로운 메일" - INBOX_NAME: "받은 편지함" - SENT_NAME: "보낸 편지함" - DRAFTS_NAME: "임시 보관함" - SPAM_NAME: "스팸함" - TRASH_NAME: "휴지통" - ARCHIVE_NAME: "어카이브" - QUOTA: - TITLE: "사용량" - MESSAGE_LIST: - BUTTON_RELOAD: "메일 목록 새로고침" - BUTTON_MOVE_TO: "이동" - BUTTON_DELETE: "삭제" - BUTTON_ARCHIVE: "어카이브" - BUTTON_SPAM: "스팸" - BUTTON_NOT_SPAM: "스팸이 아님" - BUTTON_EMPTY_FOLDER: "폴더 비우기" - BUTTON_MULTY_FORWARD: "전달" - BUTTON_DELETE_WITHOUT_MOVE: "완전히 삭제" - BUTTON_MORE: "더 보기" - MENU_SET_SEEN: "읽음으로 표시" - MENU_SET_ALL_SEEN: "모두 읽음으로 표시" - MENU_UNSET_SEEN: "읽지않음으로 표시" - MENU_SET_FLAG: "즐겨찾기로 표시" - MENU_UNSET_FLAG: "즐겨찾기 해제" - MENU_SELECT_ALL: "모두" - MENU_SELECT_NONE: "없음" - MENU_SELECT_INVERT: "반전" - MENU_SELECT_UNSEEN: "읽지 않음" - MENU_SELECT_SEEN: "읽음" - MENU_SELECT_FLAGGED: "즐겨찾기" - MENU_SELECT_UNFLAGGED: "일반" - EMPTY_LIST: "메일함이 비어있습니다." - EMPTY_SEARCH_LIST: "검색 조건에 맞는 결과가 없습니다.." - SEARCH_RESULT_FOR: "\"%SEARCH%\"에 대한 검색결과" - BACK_TO_MESSAGE_LIST: "메일 목록으로 돌아가기" - LIST_LOADING: "로딩 중" - EMPTY_SUBJECT_TEXT: "(제목 없음)" - PUT_MESSAGE_HERE: "목록에서 표시할 메시지를 여기로 끌어 넣으세요." - TODAY_AT: "오늘 %TIME%" - YESTERDAY_AT: "어제 %TIME%" - SEARCH_PLACEHOLDER: "검색" - NEW_MESSAGE_NOTIFICATION: "새 메시지가 %COUNT% 건 있습니다." - QUOTA_SIZE: "총 %LIMIT%%PROC%%를 사용중입니다." - MESSAGE: - BUTTON_EDIT: "수정" - BUTTON_BACK: "뒤로" - BUTTON_CLOSE: "닫기" - BUTTON_DELETE: "삭제" - BUTTON_UNSUBSCRIBE: "이 메일링 리스트를 수신거부" - BUTTON_ARCHIVE: "어카이브" - BUTTON_SPAM: "스팸" - BUTTON_NOT_SPAM: "스팸이 아님" - BUTTON_MOVE_TO: "이동" - BUTTON_MORE: "더보기" - BUTTON_REPLY: "답장" - BUTTON_REPLY_ALL: "모두 답장" - BUTTON_FORWARD: "전달" - BUTTON_FORWARD_AS_ATTACHMENT: "첨부파일로 전달" - BUTTON_EDIT_AS_NEW: "새로 편집하기" - BUTTON_SHOW_IMAGES: "외부이미지 표시" - BUTTON_NOTIFY_READ_RECEIPT: "수신자가 메일을 확인하면 알람을 표시합니다." - BUTTON_IN_NEW_WINDOW: "분할화면에서 보기" - BUTTON_THREAD_LIST: "Thread list" - BUTTON_THREAD_PREV: "Previous" - BUTTON_THREAD_NEXT: "다음" - BUTTON_THREAD_MORE: "더보기" - MENU_HEADERS: "메시지 헤더 보기" - MENU_VIEW_ORIGINAL: "원본 보기" - MENU_DOWNLOAD_ORIGINAL: ".eml 파일로 다운로드" - MENU_FILTER_SIMILAR: "이러한 메시지를 필터링합니다" - MENU_PRINT: "인쇄" - EMPTY_SUBJECT_TEXT: "(제목없음)" - LABEL_SUBJECT: "제목" - LABEL_DATE: "날짜" - LABEL_FROM: "보낸이" - LABEL_FROM_SHORT: "보낸이" - LABEL_TO: "받는이" - LABEL_TO_SHORT: "받는이" - LABEL_CC: "참조" - LABEL_BCC: "숨은 참조" - LABEL_REPLY_TO: "답장" - PRINT_LABEL_FROM: "보낸 이" - PRINT_LABEL_TO: "받는 이" - PRINT_LABEL_CC: "참조" - PRINT_LABEL_BCC: "숨은 참조" - PRINT_LABEL_REPLY_TO: "답장하기" - PRINT_LABEL_DATE: "날짜" - PRINT_LABEL_SUBJECT: "제목" - PRINT_LABEL_ATTACHMENTS: "첨부파일" - MESSAGE_LOADING: "여는 중..." - MESSAGE_VIEW_DESC: "목록에서 선택한 메시지가 여기에 표시됩니다." - PGP_PASSWORD_INPUT_PLACEHOLDER: "비밀번호" - PGP_SIGNED_MESSAGE_DESC: "암호화로 서명된 메세지입니다. (클릭하여 확인하십시오)" - PGP_ENCRYPTED_MESSAGE_DESC: "암호화로 서명된 메세지입니다. (클릭하여 복호화 합니다)" - LINK_DOWNLOAD_AS_ZIP: "압축파일로 다운로드" - LINK_SAVE_TO_OWNCLOUD: "ownCloud에 저장하기" - LINK_SAVE_TO_DROPBOX: "Dropbox에 저장하기" - SUGGESTIONS: - SEARCHING_DESC: "검색중..." - CONTACTS: - LEGEND_CONTACTS: "연락처" - SEARCH_INPUT_PLACEHOLDER: "검색" - BUTTON_ADD_CONTACT: "연락처 추가" - BUTTON_CREATE_CONTACT: "연락처 추가" - BUTTON_UPDATE_CONTACT: "연락처 갱신" - BUTTON_IMPORT: "파일 첨부 (확장자 csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "내보내기 (확장자 vcf, vCard)" - BUTTON_EXPORT_CSV: "내보내기 (확장자 csv)" - ERROR_IMPORT_FILE: "지원하지 않는 형식의 포맷입니다." - LIST_LOADING: "여는중" - EMPTY_LIST: "연락처가 없습니다." - EMPTY_SEARCH: "연락처를 찾을 수 없습니다." - CLEAR_SEARCH: "검색 초기화" - CONTACT_VIEW_DESC: "선택한 연락처가 이 곳에 표시됩니다" - LABEL_DISPLAY_NAME: "이름 표시" - LABEL_EMAIL: "이메일" - LABEL_PHONE: "연락처" - LABEL_WEB: "홈페이지" - LABEL_BIRTHDAY: "생일" - LINK_ADD_EMAIL: "새 주소록 등록" - LINK_ADD_PHONE: "새 연락처 등록" - LINK_BIRTHDAY: "생일" - PLACEHOLDER_ENTER_DISPLAY_NAME: "표시할 이름을 입력해주세요." - PLACEHOLDER_ENTER_LAST_NAME: "성" - PLACEHOLDER_ENTER_FIRST_NAME: "이름" - PLACEHOLDER_ENTER_NICK_NAME: "별칭" - LABEL_READ_ONLY: "읽기 전용" - LABEL_SHARE: "공유하기" - ADD_MENU_LABEL: "추가" - ADD_MENU_NICKNAME: "별칭" - ADD_MENU_NOTES: "메모" - ADD_MENU_EMAIL: "이메일" - ADD_MENU_PHONE: "연락처" - ADD_MENU_URL: "웹 주소" - ADD_MENU_ADDRESS: "주소" - ADD_MENU_BIRTHDAY: "생일" - ADD_MENU_TAGS: "태그" - BUTTON_SHARE_NONE: "비어 있음" - BUTTON_SYNC: "동기화 (서비스 CardDAV)" - COMPOSE: - TITLE_FROM: "보낸 이" - TITLE_TO: "받는 이" - TITLE_CC: "참조" - TITLE_BCC: "숨은 참조" - TITLE_REPLY_TO: "답장하기" - TITLE_SUBJECT: "제목" - LINK_SHOW_INPUTS: "모든 입력창 보기" - BUTTON_SEND: "보내기" - BUTTON_SAVE: "저장" - BUTTON_DELETE: "삭제" - BUTTON_CANCEL: "취소" - BUTTON_MINIMIZE: "최소화" - SAVED_TIME: "%TIME% 에 저장됨" - SAVED_ERROR_ON_SEND: "메시지는 전송되었지만, 보낸 보관함에 저장되지 않았습니다." - DISCARD_UNSAVED_DATA: "저장되지 않은 데이터를 삭제하시겠습니까 ?" - ATTACH_FILES: "첨부파일" - ATTACH_DROP_FILES_DESC: "파일을 드래그해 넣으세요" - ATTACH_ITEM_CANCEL: "취소" - DROPBOX: "드롭박스" - GOOGLE_DRIVE: "구글 드라이브" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" - FORWARD_MESSAGE_TOP_TITLE: "-------- 전달된 메시지 -------" - FORWARD_MESSAGE_TOP_FROM: "보낸 이" - FORWARD_MESSAGE_TOP_TO: "받는 이" - FORWARD_MESSAGE_TOP_CC: "참조" - FORWARD_MESSAGE_TOP_SENT: "보냄" - FORWARD_MESSAGE_TOP_SUBJECT: "제목" - EMPTY_TO_ERROR_DESC: "수신인을 한 명 이상 선택하세요" - NO_ATTACHMENTS_HERE_DESC: "첨부된 파일이 없습니다." - ATTACHMENTS_ERROR_DESC: "경고 ! 모든 첨부파일이 업로드 되지 않습니다." - ATTACHMENTS_UPLOAD_ERROR_DESC: "첨부파일이 아직 업로드되지 않았습니다." - BUTTON_REQUEST_READ_RECEIPT: "수신확인 메일 요청" - BUTTON_MARK_AS_IMPORTANT: "중요메일 표시" - BUTTON_OPEN_PGP: "OpenPGP (글씨만)" - BUTTON_REQUEST_DSN: "영수증 요청" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "닫기" - POPUPS_ASK: - BUTTON_YES: "네" - BUTTON_NO: "아니요" - DESC_WANT_CLOSE_THIS_WINDOW: "정말 이 페이지를 닫으시겠습니까 ?" - DESC_WANT_DELETE_MESSAGES: "정말 이 메세지들을 삭제하시겠습니까 ?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "사용할 언어를 선택하세요" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "새 사용자 추가?" - BUTTON_ADD_ACCOUNT: "추가" - TITLE_UPDATE_ACCOUNT: "사용자 적용" - BUTTON_UPDATE_ACCOUNT: "적용" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "새 서명 추가?" - TITLE_UPDATE_IDENTITY: "서명을 수정하시겠습니까?" - BUTTON_ADD_IDENTITY: "추가" - BUTTON_UPDATE_IDENTITY: "수정" - LABEL_EMAIL: "이메일" - LABEL_NAME: "이름" - LABEL_REPLY_TO: "답장" - LABEL_SIGNATURE: "서명" - LABEL_CC: "Cc" - LABEL_BCC: "숨은 참조" - LABEL_SIGNATURE_INSERT_BEFORE: "답장에 이 서명을 사용합니다." - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "새 폴더 생성?" - LABEL_NAME: "폴더명" - LABEL_PARENT: "상위 폴더" - BUTTON_CREATE: "생성" - BUTTON_CANCEL: "취소" - BUTTON_CLOSE: "닫기" - TITLE_CREATING_PROCESS: "폴더 생성 중" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "이 폴더의 모든 메시지를 완전 삭제하시겠습니까?" - BUTTON_CLEAR: "초기화" - BUTTON_CANCEL: "취소" - BUTTON_CLOSE: "닫기" - DANGER_DESC_WARNING: "경고!" - DANGER_DESC_HTML_1: "이 동작은 %FOLDER% 폴더의 메시지를 모두 삭제할 것입니다." - DANGER_DESC_HTML_2: "작업이 시작되면 중지하거나 취소할 수 없습니다." - TITLE_CLEARING_PROCESS: "폴더 비우는 중..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "OpenPGP키를 입력합니다." - BUTTON_IMPORT_OPEN_PGP_KEY: "입력" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "OpenPGP키 보기" - BUTTON_SELECT: "선택" - BUTTON_CLOSE: "닫기" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "OpenPGP키 생성" - LABEL_EMAIL: "이메일" - LABEL_NAME: "이름" - LABEL_PASSWORD: "비밀번호" - LABEL_KEY_BIT_LENGTH: "키 길이" - BUTTON_GENERATE_OPEN_PGP_KEYS: "생성" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP 로그인/암호화" - LABEL_SIGN: "로그인" - LABEL_ENCRYPT: "암호화" - LABEL_PASSWORD: "비밀번호" - BUTTON_SIGN: "로그인" - BUTTON_ENCRYPT: "암호화" - BUTTON_SIGN_AND_ENCRYPT: "서명과 암호화" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP 복호화" - LABEL_KEY: "비공개 키" - LABEL_PASSWORD: "비밀번호" - BUTTON_DECRYPT: "복호화" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "2단계 인증" - LABEL_CODE: "번호" - BUTTON_TEST: "테스트" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "필터를 생성 하시겠습니까 ?" - TITLE_EDIT_FILTER: "필터를 적용 하시겠습니까 ?" - FILTER_NAME: "Name" - LEGEND_CONDITIONS: "Conditions" - LEGEND_ACTIONS: "Actions" - BUTTON_DONE: "Done" - BUTTON_ADD_CONDITION: "Add a Condition" - SELECT_ACTION_NONE: "None" - SELECT_ACTION_MOVE_TO: "Move to" - SELECT_ACTION_FORWARD_TO: "Forward to" - SELECT_ACTION_REJECT: "Reject" - SELECT_ACTION_VACATION_MESSAGE: "Vacation message" - SELECT_ACTION_DISCARD: "Discard" - SELECT_FIELD_FROM: "From" - SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" - SELECT_FIELD_SUBJECT: "Subject" - SELECT_FIELD_HEADER: "Header" - SELECT_FIELD_SIZE: "Size" - SELECT_TYPE_CONTAINS: "Contains" - SELECT_TYPE_NOT_CONTAINS: "Not Contains" - SELECT_TYPE_MATCHES: "Matches (* and ? supported)" - SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" - SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Not Regexp" - SELECT_TYPE_EQUAL_TO: "Equal To" - SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" - SELECT_TYPE_OVER: "Over" - SELECT_TYPE_UNDER: "Under" - SELECT_MATCH_ANY: "Matching any of the following rules" - SELECT_MATCH_ALL: "Matching all of the following rules" - MARK_AS_READ_LABEL: "Mark as read" - REPLY_INTERVAL_LABEL: "Reply interval (days)" - KEEP_LABEL: "Keep" - STOP_LABEL: "Don't stop processing rules" - EMAIL_LABEL: "Email" - VACATION_SUBJECT_LABEL: "Subject (optional)" - VACATION_MESSAGE_LABEL: "Message" - VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" - REJECT_MESSAGE_LABEL: "Reject message" - ALL_INCOMING_MESSAGES_DESC: "All incoming messages" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "메일함을 지정해주세요" - SELECT_CHOOSE_ONE: "선택해주세요" - SELECT_UNUSE_NAME: "사용하지 않음" - LABEL_SENT: "보낸 편지함" - LABEL_DRAFTS: "임시 보관함" - LABEL_SPAM: "스팸함" - LABEL_TRASH: "휴지통" - LABEL_ARCHIVE: "Archive" - BUTTON_CANCEL: "취소" - BUTTON_CLOSE: "닫기" - NOTIFICATION_SENT: |- - 보낸 편지함 폴더가 지정되지 않았습니다. 보낸 메시지를 보관하지 않고 삭제하려면 "사용하지 않음" 옵션을 선택해주세요. - NOTIFICATION_DRAFTS: "임시 보관함 폴더가 지정되지 않았습니다." - NOTIFICATION_SPAM: |- - 스팸함 폴더가 지정되지 않았습니다. 스팸처리한 메시지를 보관하지 않고 바로 삭제하려면 "사용하지 않음" 옵션을 선택해주세요. - NOTIFICATION_TRASH: |- - 휴지통 폴더가 지정되지 않았습니다. 삭제한 메시지를 휴지통에 보관하지 않고 바로 삭제하려면 "사용하지 않음" 옵션을 선택해주세요. - NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "2-Step Verification" - LABEL_ENABLE_TWO_FACTOR: "Enable 2-Step verification" - LABEL_TWO_FACTOR_USER: "User" - LABEL_TWO_FACTOR_STATUS: "Status" - LABEL_TWO_FACTOR_SECRET: "Secret" - LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" - BUTTON_CREATE: "Create New Secret" - BUTTON_ACTIVATE: "Activate" - BUTTON_CLEAR: "Clear" - BUTTON_LOGOUT: "Logout" - BUTTON_DONE: "Done" - BUTTON_TEST: "Test" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Show Secret" - BUTTON_HIDE_SECRET: "Hide Secret" - TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" - TWO_FACTOR_SECRET_DESC: >- - Import this info into your Google Authenticator client (or other TOTP client) - using the provided QR code below or by entering the code manually. - TWO_FACTOR_BACKUP_CODES_DESC: >- - If you can't receive codes via Google Authenticator, you can use backup codes - to sign in. After you’ve used a backup code to sign in, it will become inactive. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." - TITLES: - LOADING: "로딩 중" - LOGIN: "로그인" - MAILBOX: "메일함" - SETTINGS: "설정" - COMPOSE: "편지쓰기" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "파일이 너무 큽니다." - ERROR_FILE_PARTIALLY_UPLOADED: "알 수 없는 오류로 인해 파일이 부분적으로만 업로드 되었습니다." - ERROR_NO_FILE_UPLOADED: "파일이 업로드되지 않았습니다." - ERROR_MISSING_TEMP_FOLDER: "업로드한 임시 파일을 찾을 수 없습니다." - ERROR_ON_SAVING_FILE: "알 수 없는 오류가 발생했습니다." - ERROR_FILE_TYPE: "정상적인 파일 형식이 아닙니다." - ERROR_UNKNOWN: "알 수 없는 오류가 발생했습니다." - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" - TEXT_SWITCHER_RICH_FORMATTING: "위지윅 모드" - TEXT_SWITCHER_CONFIRM: "본문 형식과 이미지가 삭제됩니다. 정말 진행하시겠습니까?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "개인" - LABEL_GENERAL_NAME: "일반" - LABEL_CONTACTS_NAME: "Contacts" - LABEL_FOLDERS_NAME: "메일함" - LABEL_ACCOUNTS_NAME: "계정" - LABEL_IDENTITY_NAME: "신원" - LABEL_IDENTITIES_NAME: "신원" - LABEL_FILTERS_NAME: "Filters" - LABEL_TEMPLATES_NAME: "Templates" - LABEL_SECURITY_NAME: "Security" - LABEL_SOCIAL_NAME: "소셜" - LABEL_THEMES_NAME: "테마" - LABEL_CHANGE_PASSWORD_NAME: "비밀번호" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "뒤로" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filters" - BUTTON_SAVE: "Save" - BUTTON_ADD_FILTER: "Add a Filter" - BUTTON_DELETE: "Delete" - BUTTON_RAW_SCRIPT: "Use Custom User Script" - SUBNAME_NONE: "None" - SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" - SUBNAME_REJECT: "Reject" - SUBNAME_VACATION_MESSAGE: "Vacation message" - SUBNAME_DISCARD: "Discard" - CAPABILITY_LABEL: "Capability" - LOADING_PROCESS: "Updating filter list" - DELETING_ASK: "Are you sure?" - CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "신원" - LABEL_DISPLAY_NAME: "이름" - LABEL_REPLY_TO: "답장" - LABEL_SIGNATURE: "서명" - LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Security" - LABEL_AUTOLOGOUT: "Auto Logout" - AUTOLOGIN_NEVER_OPTION_NAME: "Never" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "일반" - LABEL_LANGUAGE: "언어" - LABEL_IDENTITY: "Identity" - LABEL_LAYOUT: "Layout" - LABEL_LAYOUT_NO_SPLIT: "No Split" - LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" - LABEL_EDITOR: "기본 본문 편집 도구" - LABEL_EDITOR_HTML: "Html 편집기" - LABEL_EDITOR_PLAIN: "텍스트 편집기" - LABEL_EDITOR_HTML_FORCED: "Html (forced)" - LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" - LABEL_ANIMATION: "인터페이스 애니메이션" - LABEL_ANIMATION_FULL: "최대 애니메이션" - LABEL_ANIMATION_NORMAL: "보통 애니메이션" - LABEL_ANIMATION_NONE: "없음" - LABEL_VIEW_OPTIONS: "화면 보기 설정" - LABEL_USE_PREVIEW_PANE: "미리보기 창 사용" - LABEL_USE_CHECKBOXES_IN_LIST: "목록에서 체크박스 보이기" - LABEL_USE_THREADS: "대화형식 사용" - LABEL_REPLY_SAME_FOLDER: "답장 메시지를 같은 폴더에 위치시킵니다." - LABEL_SHOW_IMAGES: "본문 내 외부 이미지를 항상 표시합니다." - LABEL_SHOW_ANIMATION: "애니메이션 보기" - LABEL_MESSAGE_PER_PAGE: "페이지 당 메시지 수" - LABEL_NOTIFICATIONS: "알림" - LABEL_SOUND_NOTIFICATION: "Sound notification" - LABEL_CHROME_NOTIFICATION_DESC: "새 메시지 알림 팝업 사용" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(브라우저에 의해 차단됨)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Contacts" - LABEL_CONTACTS_AUTOSAVE: "Automatically add recipients to your address book" - LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" - LABEL_CONTACTS_SYNC_SERVER: "Server" - LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" - LABEL_CONTACTS_SYNC_USER: "User" - LABEL_CONTACTS_SYNC_PASSWORD: "Password" - SETTINGS_THEMES: - LEGEND_THEMES: "테마" - LEGEND_THEMES_CUSTOM: "사용자 테마 설정" - LABEL_CUSTOM_TYPE: "종류" - LABEL_CUSTOM_TYPE_LIGHT: "밝음" - LABEL_CUSTOM_TYPE_DARK: "어두움" - LABEL_CUSTOM_BACKGROUND_IMAGE: "배경" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "배경 이미지 업로드 (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "파일이 너무 큽니다 (1MB 초과)" - ERROR_FILE_TYPE_ERROR: "파일 형식이 잘못 되었습니다. (JPG 또는 PNG만 가능)" - ERROR_UNKNOWN: "파일 업로드 중 알 수 없는 오류가 발생했습니다." - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "구글" - BUTTON_GOOGLE_CONNECT: "구글 계정에 연결" - BUTTON_GOOGLE_DISCONNECT: "구글 계정 연결 끊기" - MAIN_GOOGLE_DESC: "구글 계정에 연결을 활성화하면, 로그인 화면에서 구글 로그인 버튼을 통해 이 메일 계정에 로그인 할 수 있습니다." - LEGEND_FACEBOOK: "페이스북" - BUTTON_FACEBOOK_CONNECT: "페이스북 계정에 연결" - BUTTON_FACEBOOK_DISCONNECT: "페이스북 계정 연결 끊기" - MAIN_FACEBOOK_DESC: "페이스북 계정에 연결을 활성화하면, 로그인 화면에서 페이스북 로그인 버튼을 통해 이 메일 계정에 로그인 할 수 있습니다." - LEGEND_TWITTER: "트위터" - BUTTON_TWITTER_CONNECT: "트위터 계정에 연결" - BUTTON_TWITTER_DISCONNECT: "트위터 계정 연결 끊기" - MAIN_TWITTER_DESC: "트위터 계정에 연결을 활성화하면, 로그인 화면에서 트위터 로그인 버튼을 통해 이 메일 계정에 로그인 할 수 있습니다." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "폴더 목록" - BUTTON_CREATE: "새 폴더 만들기" - BUTTON_DELETE: "삭제" - BUTTON_SUBSCRIBE: "보기" - BUTTON_UNSUBSCRIBE: "보이지 않기" - LOADING_PROCESS: "폴더 목록을 업데이트하고 있습니다." - CREATING_PROCESS: "폴더를 생성하고 있습니다." - DELETING_PROCESS: "폴더를 삭제하고 있습니다." - RENAMING_PROCESS: "폴더명을 변경하고 있습니다." - DELETING_ASK: "정말로 삭제하시겠습니까?" - TO_MANY_FOLDERS_DESC_1: "You have too many folders!" - TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." - HELP_DELETE_FOLDER: "Delete folder" - HELP_SHOW_HIDE_FOLDER: "Show/hide folder" - HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "계정 목록" - LEGEND_IDENTITIES: "Identities" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" - BUTTON_ADD_ACCOUNT: "계정 추가" - BUTTON_ADD_IDENTITY: "Add an Identity" - BUTTON_DELETE: "삭제" - LOADING_PROCESS: "계정 목록을 업데이트하고 있습니다." - DELETING_ASK: "정말로 삭제하시겠습니까?" - DEFAULT_IDENTITY_LABEL: "default" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "신원" - LEGEND_IDENTITIES: "새 신원 추가" - LABEL_DEFAULT: "Default" - LABEL_DISPLAY_NAME: "이름" - LABEL_REPLY_TO: "답장" - LABEL_SIGNATURE: "서명" - LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" - BUTTON_ADD_IDENTITY: "신원 추가" - BUTTON_DELETE: "삭제" - LOADING_PROCESS: "신원 목록을 업데이트하고 있습니다." - DELETING_ASK: "정말로 삭제하시겠습니까?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "비밀번호 변경" - LABEL_CURRENT_PASSWORD: "현재 비밀번호" - LABEL_NEW_PASSWORD: "새 비밀번호" - LABEL_REPEAT_PASSWORD: "비밀번호 재입력" - BUTTON_UPDATE_PASSWORD: "비밀번호 변경" - ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" - TITLE_PRIVATE: "Private" - TITLE_PUBLIC: "Public" - DELETING_ASK: "Are you sure?" - GENERATE_ONLY_HTTPS: "HTTPS only" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" - TAB_MAILBOX: "Mailbox" - TAB_MESSAGE_LIST: "Message list" - TAB_MESSAGE_VIEW: "Message view" - TAB_COMPOSE: "Compose" - LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" - LABEL_REPLY: "Reply" - LABEL_REPLY_ALL: "Reply All" - LABEL_FORWARD: "Forward" - LABEL_FORWARD_MULTIPLY: "Forward (multiply)" - LABEL_HELP: "Help" - LABEL_CHECK_ALL: "Select all messages" - LABEL_ARCHIVE: "Archive" - LABEL_DELETE: "Delete" - LABEL_OPEN_THREAD: "Open selected thread" - LABEL_MOVE: "Move" - LABEL_READ: "Read selected messages" - LABEL_UNREAD: "Unread selected messages" - LABEL_SEARCH: "Search" - LABEL_CANCEL_SEARCH: "Cancel search" - LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" - LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" - LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" - LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" - LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" - LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" - LABEL_THREAD_NEXT: "Next message in thread" - LABEL_THREAD_PREV: "Previous message in thread" - LABEL_PRINT: "Print" - LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" - LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" - LABEL_SWITCH_TO_LIST: "Switch focus back to message list" - LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" - LABEL_SAVE_MESSAGE: "Save message" - LABEL_SEND_MESSAGE: "Send message" - LABEL_CLOSE_COMPOSE: "Close compose" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "No public keys found" - NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" - NO_PRIVATE_KEY_FOUND: "No private key found" - NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" - ADD_A_PUBLICK_KEY: "Add a public key" - UNVERIFIRED_SIGNATURE: "Unverified signature" - DECRYPTION_ERROR: "OpenPGP decryption error" - GOOD_SIGNATURE: "Good signature from %USER%" - PGP_ERROR: "OpenPGP error: %ERROR%" - SPECIFY_FROM_EMAIL: "Please specify FROM email address" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" - NOTIFICATIONS: - INVALID_TOKEN: "잘못된 토큰입니다." - AUTH_ERROR: "인증 실패" - ACCESS_ERROR: "접근 오류" - CONNECTION_ERROR: "서버에 연결할 수 없습니다." - CAPTCHA_ERROR: "보안문자를 잘못 입력하였습니다." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- - 이 페이스북 아이디는 아직 어떠한 이메일 계정에도 연결되지 않았습니다. 이메일 계정으로 로그인 하신 후 소셜 설정에서 소셜 계정에 연결해주세요. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- - 이 트위터 아이디는 아직 어떠한 이메일 계정에도 연결되지 않았습니다. 이메일 계정으로 로그인 하신 후 소셜 설정에서 소셜 계정에 연결해주세요. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- - 이 구글 아이디는 아직 어떠한 이메일 계정에도 연결되지 않았습니다. 이메일 계정으로 로그인 하신 후 소셜 설정에서 소셜 계정에 연결해주세요. - DOMAIN_NOT_ALLOWED: "허용된 도메인이 아닙니다." - ACCOUNT_NOT_ALLOWED: "허용된 계정이 아닙니다." - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" - COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" - CURRENT_PASSWORD_INCORRECT: "Current password incorrect" - NEW_PASSWORD_SHORT: "Password is too short" - NEW_PASSWORD_WEAK: "Password is too easy" - NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" - CONTACTS_SYNC_ERROR: "Contacts synchronization error" - CANT_GET_MESSAGE_LIST: "메시지 목록을 불러 올 수 없습니다." - CANT_GET_MESSAGE: "메시지를 가져올 수 없습니다." - CANT_DELETE_MESSAGE: "메시지를 삭제할 수 없습니다." - CANT_MOVE_MESSAGE: "메시지를 이동할 수 없습니다." - CANT_SAVE_MESSAGE: "메시지를 저장할 수 없습니다." - CANT_SEND_MESSAGE: "메시지를 보낼 수 없습니다." - INVALID_RECIPIENTS: "수신인 오류" - CANT_SAVE_FILTERS: "Can't save filters" - CANT_GET_FILTERS: "Can't get filters" - FILTERS_ARE_NOT_CORRECT: "Filters are not correct" - CANT_CREATE_FOLDER: "폴더를 생성할 수 없습니다." - CANT_RENAME_FOLDER: "폴더명을 변경할 수 없습니다." - CANT_DELETE_FOLDER: "폴더를 삭제할 수 없습니다." - CANT_DELETE_NON_EMPTY_FOLDER: "비어있지 않은 디렉터리를 삭제할 수 없습니다." - CANT_SUBSCRIBE_FOLDER: "폴더를 볼 수 없습니다." - CANT_UNSUBSCRIBE_FOLDER: "폴더를 보이지 않게 할 수 없습니다." - CANT_SAVE_SETTINGS: "설정을 저장할 수 없습니다." - CANT_SAVE_PLUGIN_SETTINGS: "설정을 저장할 수 없습니다." - DOMAIN_ALREADY_EXISTS: "이미 존재하는 도메인입니다." - CANT_INSTALL_PACKAGE: "패키지 설치에 실패했습니다." - CANT_DELETE_PACKAGE: "패키지 제거에 실패했습니다." - INVALID_PLUGIN_PACKAGE: "정상적인 플러그인 패키지가 아닙니다." - UNSUPPORTED_PLUGIN_PACKAGE: "지원되지 않는 플러그인 패키지입니다." - LICENSING_SERVER_IS_UNAVAILABLE: "서버가 사용가능 상태가 아닙니다." - LICENSING_DOMAIN_EXPIRED: "이 도메인의 라이센스가 만료되었습니다." - LICENSING_DOMAIN_BANNED: "사용 금지된 도메인입니다." - DEMO_SEND_MESSAGE_ERROR: "이 테스트 계정은 외부 메일 발송이 금지되어있습니다." - DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" - ACCOUNT_ALREADY_EXISTS: "이미 존재하는 계정입니다." - MAIL_SERVER_ERROR: "메일 서버에 연결하는 중 오류가 발생했습니다." - INVALID_INPUT_ARGUMENT: "Invalid input argument" - UNKNOWN_ERROR: "알 수 없는 오류" - STATIC: - BACK_LINK: "새로고침" - DOMAIN_LIST_DESC: "접근이 허가된 도메인 목록입니다." - PHP_EXSTENSIONS_ERROR_DESC: "필요한 PHP 확장이 구성되지 않았습니다!" - PHP_VERSION_ERROR_DESC: "현재 사용 중인 PHP 버전 (%VERSION%)이 너무 낮습니다. 최소 5.3.0 이상을 설치해주세요!" - NO_SCRIPT_TITLE: "자바스크립트 필요" - NO_SCRIPT_DESC: |- - 사용 중인 브라우저가 자바스크립트를 지원하지 않습니다. 브라우저 설정을 확인하여 자바스크립트 사용을 활성화하고 다시 시도해주세요. - NO_COOKIE_TITLE: "이 어플리케이션을 사용하려면 쿠키 사용이 지원되야 합니다." - NO_COOKIE_DESC: |- - 사용 중인 브라우저가 쿠키를 지원하지 않습니다. 브라우저 설정을 확인하여 쿠키 사용을 활성화하고 다시 시도해주세요. - BAD_BROWSER_TITLE: "사용 중인 브라우저가 구버전입니다." - BAD_BROWSER_DESC: |- - 이 어플리케이션을 정상적으로 사용하시려면 아래의 브라우저들 중 하나를 설치해주세요: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/lt_LT.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/lt_LT.yml deleted file mode 100755 index 3ff7d4cd..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/lt_LT.yml +++ /dev/null @@ -1,711 +0,0 @@ -lt_LT: - LOGIN: - LABEL_EMAIL: "E-paštas" - LABEL_LOGIN: "Prisijungimo vardas" - LABEL_PASSWORD: "Slaptažodis" - LABEL_SIGN_ME: "Prisimink mane" - LABEL_VERIFICATION_CODE: "Saugos kodas" - LABEL_DONT_ASK_VERIFICATION_CODE: "Neklausk saugos kodo kitas 2 savaites" - BUTTON_SIGN_IN: "Prisijungti" - TITLE_SIGN_IN_GOOGLE: "Prisijungti naudojant Google paskyrą" - TITLE_SIGN_IN_FACEBOOK: "Prisijungti naudojant Facebook paskyrą" - TITLE_SIGN_IN_TWITTER: "Prisijungti naudojant Twitter paskyrą" - LABEL_FORGOT_PASSWORD: "Pamiršau slaptažodį" - LABEL_REGISTRATION: "Registracija" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Pridėti paskyrą" - BUTTON_SETTINGS: "Nustatymai" - BUTTON_HELP: "Pagalba" - BUTTON_LOGOUT: "Atsijungti" - MOBILE: - BUTTON_MOBILE_VERSION: "Mobili versija" - BUTTON_DESKTOP_VERSION: "Standartinė versija" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Paieška" - TITLE_ADV: "Detali paieška" - LABEL_ADV_FROM: "Nuo" - LABEL_ADV_TO: "Kam" - LABEL_ADV_SUBJECT: "Tema" - LABEL_ADV_TEXT: "Laiško Tekstas" - LABEL_ADV_HAS_ATTACHMENT: "Turi priedą" - LABEL_ADV_HAS_ATTACHMENTS: "Turi priedą" - LABEL_ADV_FLAGGED: "Pažymėtas" - LABEL_ADV_UNSEEN: "Neskaitytas" - LABEL_ADV_DATE: "Data" - LABEL_ADV_DATE_ALL: "Visi" - LABEL_ADV_DATE_3_DAYS: "Nesenesni kaip 3 dienų" - LABEL_ADV_DATE_7_DAYS: "Nesenesni kaip 1 savaitės" - LABEL_ADV_DATE_MONTH: "Nesenesni kaip 1 mėnesio" - LABEL_ADV_DATE_3_MONTHS: "Nesenesni kaip 3 mėnesių" - LABEL_ADV_DATE_6_MONTHS: "Nesenesni kaip 6 mėnesių" - LABEL_ADV_DATE_YEAR: "Nesenesni kaip 1 metų" - BUTTON_ADV_SEARCH: "Ieškoti" - PREVIEW_POPUP: - FULLSCREEN: "Perjungti viso ekrano režimą" - ZOOM: "Didinti / mažinti" - CLOSE: "Uždaryti (Esc)" - LOADING: "Kraunasi..." - GALLERY_PREV: "Ankstesnis (Rodyklė kairėn)" - GALLERY_NEXT: "Kitas (Rodyklė dešinėn)" - GALLERY_COUNTER: "%curr% iš %total%" - IMAGE_ERROR: "Paveikslėlis negali būti įkeltas." - AJAX_ERROR: "Turinys negalėji būti įkeltas." - FOLDER_LIST: - BUTTON_COMPOSE: "Sukurti" - BUTTON_CONTACTS: "Kontaktai" - BUTTON_NEW_MESSAGE: "Rašyti naują" - INBOX_NAME: "Gautieji" - SENT_NAME: "Išsiųsti" - DRAFTS_NAME: "Juodraščiai" - SPAM_NAME: "Šlamštas" - TRASH_NAME: "Šiukšlynas" - ARCHIVE_NAME: "Archyvas" - QUOTA: - TITLE: "Kvotos naudojimas" - MESSAGE_LIST: - BUTTON_RELOAD: "Atnaujinti žinučių sąrašą" - BUTTON_MOVE_TO: "Perkelti į" - BUTTON_DELETE: "Naikinti" - BUTTON_ARCHIVE: "Archyvuoti" - BUTTON_SPAM: "Žymėti kaip šlamštas" - BUTTON_NOT_SPAM: "Ne šlamštas" - BUTTON_EMPTY_FOLDER: "Valyti katalogą" - BUTTON_MULTY_FORWARD: "Persiųsti kaip priedą(us)" - BUTTON_DELETE_WITHOUT_MOVE: "Naikinti visam laikui" - BUTTON_MORE: "Daugiau" - MENU_SET_SEEN: "Pažymėti kaip skaitytą" - MENU_SET_ALL_SEEN: "Pažymėti visus kaip skaitytus" - MENU_UNSET_SEEN: "Pažymėti kaip neskaitytą" - MENU_SET_FLAG: "Pažymėti žvaigždute" - MENU_UNSET_FLAG: "Panaikinti žymėjimą" - MENU_SELECT_ALL: "Visi" - MENU_SELECT_NONE: "Nieko" - MENU_SELECT_INVERT: "Apversti" - MENU_SELECT_UNSEEN: "Neskaityta" - MENU_SELECT_SEEN: "Skaityta" - MENU_SELECT_FLAGGED: "Pažymėta" - MENU_SELECT_UNFLAGGED: "Nepažymėta" - EMPTY_LIST: "Tuščias sąrašas." - EMPTY_SEARCH_LIST: "Nėra pranešimų, atitinkančių jūsų paiešką." - SEARCH_RESULT_FOR: "Ieškoti \"%SEARCH%\" rezultatuose" - BACK_TO_MESSAGE_LIST: "grįžti į sąrašą" - LIST_LOADING: "Kraunasi" - EMPTY_SUBJECT_TEXT: "(Be temos)" - PUT_MESSAGE_HERE: "Įkelkite žinutę čia, kad matytumėte ją sąraše" - TODAY_AT: "šiandien %TIME%" - YESTERDAY_AT: "vakar %TIME%" - SEARCH_PLACEHOLDER: "Ieškoti" - NEW_MESSAGE_NOTIFICATION: "Jūs turite %COUNT% naujų laiškų!" - QUOTA_SIZE: "Naudojate %SIZE% (%PROC%%) iš savo turimų %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Taisyti" - BUTTON_BACK: "Atgal" - BUTTON_CLOSE: "Uždaryti" - BUTTON_DELETE: "Naikinti" - BUTTON_UNSUBSCRIBE: "Atsisakyti šios prenumeratos" - BUTTON_ARCHIVE: "Archyvas" - BUTTON_SPAM: "Šlamštas" - BUTTON_NOT_SPAM: "Ne šlamštas" - BUTTON_MOVE_TO: "Perkelti į" - BUTTON_MORE: "Daugiau" - BUTTON_REPLY: "Atsakyti" - BUTTON_REPLY_ALL: "Atsakyti visiems" - BUTTON_FORWARD: "Persiųsti" - BUTTON_FORWARD_AS_ATTACHMENT: "Persiųsti kaip priedą" - BUTTON_EDIT_AS_NEW: "Redaguoti kaip naują" - BUTTON_SHOW_IMAGES: "Rodyti išorinius paveikslėlius" - BUTTON_NOTIFY_READ_RECEIPT: "Siuntėjas pageidavo būti informuotas, kai jūs perskaitysite šį pranešimą." - BUTTON_IN_NEW_WINDOW: "Peržiūrėti atskirame lange" - BUTTON_THREAD_LIST: "Temų sąrašas" - BUTTON_THREAD_PREV: "Ankstesnis" - BUTTON_THREAD_NEXT: "Kitas" - BUTTON_THREAD_MORE: "Daugiau žinučių" - MENU_HEADERS: "Rodyti pranešimų antraštės" - MENU_VIEW_ORIGINAL: "Rodyti šaltinį" - MENU_DOWNLOAD_ORIGINAL: "Atsisiųsti .eml failą" - MENU_FILTER_SIMILAR: "Filtruoti laiškus, kaip šis" - MENU_PRINT: "Spausdinti" - EMPTY_SUBJECT_TEXT: "(Be temos)" - LABEL_SUBJECT: "Tema" - LABEL_DATE: "Data" - LABEL_FROM: "Nuo" - LABEL_FROM_SHORT: "nuo" - LABEL_TO: "Kam" - LABEL_TO_SHORT: "kam" - LABEL_CC: "Kopija" - LABEL_BCC: "Nematoma kopija" - LABEL_REPLY_TO: "Kam atsakyti" - PRINT_LABEL_FROM: "Nuo" - PRINT_LABEL_TO: "Kam" - PRINT_LABEL_CC: "Kopija" - PRINT_LABEL_BCC: "Nematoma kopija" - PRINT_LABEL_REPLY_TO: "Kam atsakyti" - PRINT_LABEL_DATE: "Data" - PRINT_LABEL_SUBJECT: "Tema" - PRINT_LABEL_ATTACHMENTS: "Priedai" - MESSAGE_LOADING: "Kraunasi" - MESSAGE_VIEW_DESC: "Pasirinkite žinutę sąraše, kad matytumėte jos turinį čia." - MESSAGE_VIEW_MOVE_DESC: "Kairėje pasirinkite katalogą, į kurį norite perkelti." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Slaptažodis" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP pasirašytas pranešimas (spustelkite patikrinimui)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP šifruotas pranešimas (spustelkite iššifravimui)" - LINK_DOWNLOAD_AS_ZIP: "Atsisiųsti zip archyvą" - LINK_SAVE_TO_OWNCLOUD: "Išsaugoti į ownCloud" - LINK_SAVE_TO_DROPBOX: "Išsaugoti į Dropbox" - READ_RECEIPT: - SUBJECT: "Pristatymo patvirtinimas (laiškas parodytas) - %SUBJECT%" - BODY: | - Tai yra laiško pristatymo patvirtinimas, kurį Jūs siuntėte gavėjui %READ-RECEIPT%. - - Pastaba: Šis pranešimas įrodo, kad laiškas buvo rodomas gavėjo kompiuteryje. - Nėra jokios garantijos, kad gavėjas perskaitė ar suprato laiško turinį. - SUGGESTIONS: - SEARCHING_DESC: "Ieškome..." - CONTACTS: - LEGEND_CONTACTS: "Kontaktai" - SEARCH_INPUT_PLACEHOLDER: "Ieškoti" - BUTTON_ADD_CONTACT: "Pridėti kontaktą" - BUTTON_CREATE_CONTACT: "Sukurti" - BUTTON_UPDATE_CONTACT: "Atnaujinti" - BUTTON_IMPORT: "Importuoti (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Eksportuoti (vcf, vCard)" - BUTTON_EXPORT_CSV: "Eksportuoti (csv)" - ERROR_IMPORT_FILE: "Importavimo klaida (neteisingas failo formatas)" - LIST_LOADING: "Kraunasi" - EMPTY_LIST: "Tuščias sąrašas" - EMPTY_SEARCH: "Kontaktų nerasta" - CLEAR_SEARCH: "Išvalyti paiešką" - CONTACT_VIEW_DESC: "Pasirinkite kontaktą sąraše, kad matytumėte informaciją čia." - LABEL_DISPLAY_NAME: "Rodomas vardas" - LABEL_EMAIL: "E-paštas" - LABEL_PHONE: "Telefonas" - LABEL_WEB: "Tinklapis" - LABEL_BIRTHDAY: "Gimtadienis" - LINK_ADD_EMAIL: "Pridėti elektroninio pašto adresą" - LINK_ADD_PHONE: "Pridėti telefono Nr." - LINK_BIRTHDAY: "Gimtadienis" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Įveskite rodomą vardą" - PLACEHOLDER_ENTER_LAST_NAME: "Įveskite pavardę" - PLACEHOLDER_ENTER_FIRST_NAME: "Įveskite vardą" - PLACEHOLDER_ENTER_NICK_NAME: "Įveskite slapyvardį" - LABEL_READ_ONLY: "Tik skaitymui" - LABEL_SHARE: "Dalintis" - ADD_MENU_LABEL: "Pridėti" - ADD_MENU_NICKNAME: "Slapyvardis" - ADD_MENU_NOTES: "Pastabos" - ADD_MENU_EMAIL: "E-paštas" - ADD_MENU_PHONE: "Telefono Nr." - ADD_MENU_URL: "URL nuoroda" - ADD_MENU_ADDRESS: "Adresas" - ADD_MENU_BIRTHDAY: "Gimtadienis" - ADD_MENU_TAGS: "Žymos" - BUTTON_SHARE_NONE: "Nesidalinti" - BUTTON_SHARE_ALL: "Visiems" - BUTTON_SYNC: "Sinchronizavimas (CardDAV)" - COMPOSE: - TITLE_FROM: "Nuo" - TITLE_TO: "Kam" - TITLE_CC: "Kopija" - TITLE_BCC: "Nematoma kopija BCC" - TITLE_REPLY_TO: "Atsakyti" - TITLE_SUBJECT: "Tema" - LINK_SHOW_INPUTS: "rodyti visus laukus" - BUTTON_SEND: "Siųsti" - BUTTON_SAVE: "Išsaugoti" - BUTTON_DELETE: "Naikinti" - BUTTON_CANCEL: "Atšaukti" - BUTTON_MINIMIZE: "Minimizuoti" - SAVED_TIME: "Išsaugota %TIME%" - SAVED_ERROR_ON_SEND: "Pranešimas buvo išsiųstas, bet neišsaugotas išsiųstų kataloge" - DISCARD_UNSAVED_DATA: "Atmesti neišsaugotus duomenis?" - ATTACH_FILES: "Prisegti failų" - ATTACH_DROP_FILES_DESC: "Įkelkite failus čia" - ATTACH_ITEM_CANCEL: "Atšaukti" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Diskas" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% parašė" - FORWARD_MESSAGE_TOP_TITLE: "-------- Persiųstas pranešimas -------" - FORWARD_MESSAGE_TOP_FROM: "Nuo" - FORWARD_MESSAGE_TOP_TO: "Kam" - FORWARD_MESSAGE_TOP_CC: "Kopija CC" - FORWARD_MESSAGE_TOP_SENT: "Išsiųstas" - FORWARD_MESSAGE_TOP_SUBJECT: "Tema" - EMPTY_TO_ERROR_DESC: "Prašome nurodyti bent vieną gavėją" - NO_ATTACHMENTS_HERE_DESC: "Nėra priedų." - ATTACHMENTS_ERROR_DESC: "Dėmesio! Ne visi priedai buvo įkelti." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Dar ne visi priedai buvo įkelti" - BUTTON_REQUEST_READ_RECEIPT: "Prašyti pranešti kada bus perskaitytas" - BUTTON_MARK_AS_IMPORTANT: "Žymėti svarbiu" - BUTTON_OPEN_PGP: "OpenPGP (Tik paprastas tekstas)" - BUTTON_REQUEST_DSN: "Prašyti laiško gavimo pažymos" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Uždaryti" - POPUPS_ASK: - BUTTON_YES: "Taip" - BUTTON_NO: "Ne" - DESC_WANT_CLOSE_THIS_WINDOW: "Ar tikrai norite uždaryti šį langą??" - DESC_WANT_DELETE_MESSAGES: "Ar tikrai norite ištrinti pranešimą(us)?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Pasirinkite kalbą" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Pridėti paskyrą?" - BUTTON_ADD_ACCOUNT: "Pridėti" - TITLE_UPDATE_ACCOUNT: "Atnaujinti paskyrą?" - BUTTON_UPDATE_ACCOUNT: "Atnaujinti" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Pridėti tapatybę?" - TITLE_UPDATE_IDENTITY: "Atnaujinti tapatybę?" - BUTTON_ADD_IDENTITY: "Pridėti" - BUTTON_UPDATE_IDENTITY: "Atnaujinti" - LABEL_EMAIL: "E-paštas" - LABEL_NAME: "Vardas" - LABEL_REPLY_TO: "Atsakyti" - LABEL_SIGNATURE: "Parašas" - LABEL_CC: "Cc" - LABEL_BCC: "Nematoma kopija" - LABEL_SIGNATURE_INSERT_BEFORE: "Įterpti šį parašą prieš citatą rašant atsakymą" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Sukurti aplanką?" - LABEL_NAME: "Aplanko pavadinimas" - LABEL_PARENT: "Pirminis katalogas" - BUTTON_CREATE: "Sukurti" - BUTTON_CANCEL: "Atšaukti" - BUTTON_CLOSE: "Uždaryti" - TITLE_CREATING_PROCESS: "Kuriamas katalogas" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Pašalinti visus pranešimus iš aplanko?" - BUTTON_CLEAR: "Išvalyti" - BUTTON_CANCEL: "Atšaukti" - BUTTON_CLOSE: "Uždaryti" - DANGER_DESC_WARNING: "Dėmesio!" - DANGER_DESC_HTML_1: "Šiuo veiksmu Jūs panaikinsite viską iš katalogo %FOLDER%." - DANGER_DESC_HTML_2: "Pradėjus veiksmą, jis nebesustabdomas." - TITLE_CLEARING_PROCESS: "Valomas katalogas..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Importuoti OpenPGP raktą" - BUTTON_IMPORT_OPEN_PGP_KEY: "Importuoti" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Peržiūrėti OpenPGP raktą" - BUTTON_SELECT: "Pasirinkti" - BUTTON_CLOSE: "Uždaryti" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Sukurti OpenPGP raktą" - LABEL_EMAIL: "E-paštas" - LABEL_NAME: "Vardas" - LABEL_PASSWORD: "Slaptažodis" - LABEL_KEY_BIT_LENGTH: "Rakto ilgis" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Sukurti" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP Parašas/Šifravimas" - LABEL_SIGN: "Parašas" - LABEL_ENCRYPT: "Šifravimas" - LABEL_PASSWORD: "Slaptažodis" - BUTTON_SIGN: "Pasirašyti" - BUTTON_ENCRYPT: "Šifruoti" - BUTTON_SIGN_AND_ENCRYPT: "Pasirašyti ir šifruoti" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" - LABEL_KEY: "Private Key" - LABEL_PASSWORD: "Password" - BUTTON_DECRYPT: "Decrypt" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "2-jų žingsnių patikrinimo bandymas" - LABEL_CODE: "Kodas" - BUTTON_TEST: "Bandyti" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Sukurti filtrą?" - TITLE_EDIT_FILTER: "Atnaujinti filtrą?" - FILTER_NAME: "Pavadinimas" - LEGEND_CONDITIONS: "Sąlygos" - LEGEND_ACTIONS: "Veiksmai" - BUTTON_DONE: "Atlikta" - BUTTON_ADD_CONDITION: "Pridėti sąlygą" - SELECT_ACTION_NONE: "Nieko" - SELECT_ACTION_MOVE_TO: "Perkelti į" - SELECT_ACTION_FORWARD_TO: "Persiūsti" - SELECT_ACTION_REJECT: "Atmesti" - SELECT_ACTION_VACATION_MESSAGE: "Atostogų atsakiklis" - SELECT_ACTION_DISCARD: "Nepaisyti" - SELECT_FIELD_FROM: "Nuo" - SELECT_FIELD_RECIPIENTS: "Gavėjai (Kam ar CC)" - SELECT_FIELD_SUBJECT: "Tema" - SELECT_FIELD_HEADER: "Antraštė" - SELECT_FIELD_SIZE: "Dydis" - SELECT_TYPE_CONTAINS: "Turi" - SELECT_TYPE_NOT_CONTAINS: "Neturi" - SELECT_TYPE_MATCHES: "Atitinka (* ir ? galioja)" - SELECT_TYPE_NOT_MATCHES: "Neatitinka (* ir ? galioja)" - SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Ne Regexp" - SELECT_TYPE_EQUAL_TO: "Tiksliai atitinka" - SELECT_TYPE_NOT_EQUAL_TO: "Ne tiksliai" - SELECT_TYPE_OVER: "Daugiau kaip" - SELECT_TYPE_UNDER: "Mažiau nei" - SELECT_MATCH_ANY: "Atitinka bet kurią iš šių taisyklių" - SELECT_MATCH_ALL: "Atitinka visas šias taisykles" - MARK_AS_READ_LABEL: "Žymėti skaitytu" - REPLY_INTERVAL_LABEL: "Atsakymų intervalai (dienomis)" - KEEP_LABEL: "laikyti" - STOP_LABEL: "Nesustoti vykdyti taisykles" - EMAIL_LABEL: "E-paštas" - VACATION_SUBJECT_LABEL: "Tema (nebūtina)" - VACATION_MESSAGE_LABEL: "Žinutė" - VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" - REJECT_MESSAGE_LABEL: "Atmesti žinutę" - ALL_INCOMING_MESSAGES_DESC: "Visi ateinantys laiškai" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Pasirinkti sisteminius katalogus" - SELECT_CHOOSE_ONE: "Pasirinkite vieną" - SELECT_UNUSE_NAME: "Nenaudoti" - LABEL_SENT: "Siųsti" - LABEL_DRAFTS: "Juodraščiai" - LABEL_SPAM: "Šlamštas" - LABEL_TRASH: "Šiukšliadėžė" - LABEL_ARCHIVE: "Archyvas" - BUTTON_CANCEL: "Atšaukti" - BUTTON_CLOSE: "Uždaryti" - NOTIFICATION_SENT: | - Nepasirinkote "Išsiųstieji" katalogo išsiųstiems laiškams saugoti. - Jei nenorite saugoti laiškų po išsiuntimo, pasirinkite "Nenaudoti" variantą. - NOTIFICATION_DRAFTS: "Nepasirinkote \"Juodraščiai\" sisteminio katalogo žinutėms, kurios saugomos kol jas rašote." - NOTIFICATION_SPAM: | - Nepasirinkote "Šlamštas" sisteminio katalogo laikyti nepageidaujamies laiškams. - Jei norite nekaupti šlamšto ir iškart išmesti, pasirinkite "Nenaudoti" variantą. - NOTIFICATION_TRASH: | - Nepasirinkote "Šiukšliadėžė" sisteminio katalogo ištrintoms žinutėms. - Jei nenorite naudotis šiukšliadėže ir išmesti laiškus visam laikui iškart juos trinant, pasirinkite "Nenaudoti" variantą. - NOTIFICATION_ARCHIVE: "Nepasirinkote \"Archyvas\" sisteminio katalogo." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "2-jų žingsnių patikrinimas" - LABEL_ENABLE_TWO_FACTOR: "Įjungti 2-jų žingsnių patikrinimą" - LABEL_TWO_FACTOR_USER: "Vartotojas" - LABEL_TWO_FACTOR_STATUS: "Statusas" - LABEL_TWO_FACTOR_SECRET: "Slaptažodis" - LABEL_TWO_FACTOR_BACKUP_CODES: "Sukurti kodų atsarginę kopiją" - BUTTON_CREATE: "Sukurti naują slaptažodį" - BUTTON_ACTIVATE: "Activate" - BUTTON_CLEAR: "Išvalytis" - BUTTON_LOGOUT: "Logout" - BUTTON_DONE: "Done" - BUTTON_TEST: "Bandyti" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Rodyti slaptažodį" - BUTTON_HIDE_SECRET: "Slėpti slaptažodį" - TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Sukonfiguruota" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Nesukonfiguruota" - TWO_FACTOR_SECRET_DESC: >- - Importuoti šią informaciją į Google autentifikavimo klientą naudojant žemiau - pateiktą QR kodą arba įveskite kodą rankiniu būdu. - TWO_FACTOR_BACKUP_CODES_DESC: >- - Jei negaunate kodo per Google autentifikavimo klientą, galite nautotis savo - sukurta atsargine kodų kopija. Kai panaudosite atsarginę kopiją prisijungimui, - ji taps neaktyvi. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Negalite paksiti šio nustatymo nepratestavę." - TITLES: - LOADING: "Kraunasi" - LOGIN: "Vartotojas" - MAILBOX: "Pašto dėžutė" - SETTINGS: "Nustatymai" - COMPOSE: "Sukurti" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Prisegamas failas per didelis" - ERROR_FILE_PARTIALLY_UPLOADED: "Dėl nežinomos klaidos failas tik dalinai prisegtas" - ERROR_NO_FILE_UPLOADED: "Neįkelti failai" - ERROR_MISSING_TEMP_FOLDER: "Trūktsta laikino failo" - ERROR_ON_SAVING_FILE: "Nežinoma klaida įkeliant failą" - ERROR_FILE_TYPE: "Neleidžiamas failo tipas" - ERROR_UNKNOWN: "Nežinoma klaida įkeliant failą" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEKSTAS" - TEXT_SWITCHER_RICH_FORMATTING: "Raiškusis formatas" - TEXT_SWITCHER_CONFIRM: "Teksto farmatas ir paveikslėliai bus prarasti. Tikrai norite tęsti?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Asmeniniai" - LABEL_GENERAL_NAME: "Pagrindiniai" - LABEL_CONTACTS_NAME: "Kontaktai" - LABEL_FOLDERS_NAME: "Katalogai" - LABEL_ACCOUNTS_NAME: "Paskyros" - LABEL_IDENTITY_NAME: "Tapatybės" - LABEL_IDENTITIES_NAME: "Tapatybės" - LABEL_FILTERS_NAME: "Filtrai" - LABEL_TEMPLATES_NAME: "Templates" - LABEL_SECURITY_NAME: "Sauga" - LABEL_SOCIAL_NAME: "Socialiniai" - LABEL_THEMES_NAME: "Temos" - LABEL_CHANGE_PASSWORD_NAME: "Slaptažodis" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Atgal" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filtrai" - BUTTON_SAVE: "Saugoti" - BUTTON_ADD_FILTER: "Pridėti filtrą" - BUTTON_DELETE: "Naikinti" - BUTTON_RAW_SCRIPT: "Naudoti savo sukurtą kodą" - SUBNAME_NONE: "Nieko" - SUBNAME_MOVE_TO: "Perkelti į \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "persiūsti \"%EMAIL%\"" - SUBNAME_REJECT: "Atmesti" - SUBNAME_VACATION_MESSAGE: "Atostogų žinutė" - SUBNAME_DISCARD: "Nepaisyti" - CAPABILITY_LABEL: "Galimybės" - LOADING_PROCESS: "Atnaujinamas filtrų sąrašas" - DELETING_ASK: "Ar Jūs įsitikinę?" - CHACHES_NEED_TO_BE_SAVED_DESC: "Šios nuostatos turi būti išsaugotos serveryje." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Tapatybė" - LABEL_DISPLAY_NAME: "Vardas" - LABEL_REPLY_TO: "Atsakyti" - LABEL_SIGNATURE: "Parašas" - LABEL_ADD_SIGNATURE_TO_ALL: "Pridėti parašą visiems rašomiems laiškams" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Sauga" - LABEL_CONFIGURE_TWO_FACTOR: "Konfiguruoti 2-žingsnių patikrinimą" - LABEL_AUTOLOGOUT: "Automatinis atsijungimas" - AUTOLOGIN_NEVER_OPTION_NAME: "Niekada" - AUTOLOGIN_MINUTES_OPTION_NAME: "po %MINUTES% minučių" - AUTOLOGIN_HOURS_OPTION_NAME: "po %HOURS% valandų" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Pagrindiniai" - LABEL_LANGUAGE: "Kalba" - LABEL_IDENTITY: "Tapatybė" - LABEL_LAYOUT: "Išdėstymas" - LABEL_LAYOUT_NO_SPLIT: "Skaidymo nėra" - LABEL_LAYOUT_VERTICAL_SPLIT: "Vertikalus skaidymas" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontalus skaidymas" - LABEL_EDITOR: "Numatytas teksto redaktorius" - LABEL_EDITOR_HTML: "Html" - LABEL_EDITOR_PLAIN: "Paprastas" - LABEL_EDITOR_HTML_FORCED: "Html (priverstinis)" - LABEL_EDITOR_PLAIN_FORCED: "Paprastas (priverstinis)" - LABEL_ANIMATION: "Sąsajos animacija" - LABEL_ANIMATION_FULL: "Pilnai" - LABEL_ANIMATION_NORMAL: "Normaliai" - LABEL_ANIMATION_NONE: "Be animacijos" - LABEL_VIEW_OPTIONS: "Peržiūros parinktys" - LABEL_USE_PREVIEW_PANE: "Naudokite peržiūros sritį" - LABEL_USE_CHECKBOXES_IN_LIST: "Rodyti žymėjimo langelius sąraše" - LABEL_USE_THREADS: "Naudoti gijas" - LABEL_REPLY_SAME_FOLDER: "Atsakymus dėti į katalogą, kuriame yra pradinė žinutė" - LABEL_SHOW_IMAGES: "Visada rodyti išorinius vaizdus žinutėse" - LABEL_SHOW_ANIMATION: "Rodyti animaciją" - LABEL_MESSAGE_PER_PAGE: "Žinučių lape" - LABEL_NOTIFICATIONS: "Pranešimai" - LABEL_SOUND_NOTIFICATION: "Garsinis pranešimas" - LABEL_CHROME_NOTIFICATION_DESC: "Rodyti iššokančius pranešimus apie naujas žinutes" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Blokuoja naršyklė)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Kontaktai" - LABEL_CONTACTS_AUTOSAVE: "Automatiškai pridėti gavėjus į adresų knygą" - LEGEND_CONTACTS_SYNC: "Nuotolinis sinchronizavimas (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Įjungti nuotolinį sinchronizavimą" - LABEL_CONTACTS_SYNC_SERVER: "Serveris" - LABEL_CONTACTS_SYNC_AB_URL: "Adresų knygos URL adresas" - LABEL_CONTACTS_SYNC_USER: "Vartotojas" - LABEL_CONTACTS_SYNC_PASSWORD: "Slaptažodis" - SETTINGS_THEMES: - LEGEND_THEMES: "Temos" - LEGEND_THEMES_CUSTOM: "Individualizuotos temos konfigūravimas" - LABEL_CUSTOM_TYPE: "Tipas" - LABEL_CUSTOM_TYPE_LIGHT: "Šviesi" - LABEL_CUSTOM_TYPE_DARK: "Tamsi" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Fonas" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Įkelti fono paveiksliuką (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "Per didelis failas" - ERROR_FILE_TYPE_ERROR: "Netinkamas failo tipas (tik JPG ir PNG)" - ERROR_UNKNOWN: "Nežinoma klaida įkeliant failą" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Prijungti Google" - BUTTON_GOOGLE_DISCONNECT: "Atjungti Google" - MAIN_GOOGLE_DESC: "Įjungus Google autentikaciją,galėsite prisijungti prie šios paskyros naudodami Google mygtuką prisijungimo ekrane." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Prijungti Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Atjungti Facebook" - MAIN_FACEBOOK_DESC: "Įjungus Facebook autentikaciją,galėsite prisijungti prie šios paskyros naudodami Facebook mygtuką prisijungimo ekrane." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Prijungti Twitter" - BUTTON_TWITTER_DISCONNECT: "Atjungti Twitter" - MAIN_TWITTER_DESC: "Įjungus Twitter autentikaciją,galėsite prisijungti prie šios paskyros naudodami Twitter mygtuką prisijungimo ekrane." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Katalogų sąrašas" - BUTTON_CREATE: "Sukurti katalogą" - BUTTON_SYSTEM: "Sisteminiai katalogai" - BUTTON_DELETE: "Pašalinti" - BUTTON_SUBSCRIBE: "Prenumeruoti" - BUTTON_UNSUBSCRIBE: "Atsisakyti prenumeratos" - LOADING_PROCESS: "Atnaujinamas katalogų sąrašas" - CREATING_PROCESS: "Kuriamas katalogas" - DELETING_PROCESS: "Šalinamas katalogas" - RENAMING_PROCESS: "Pervardinamas katalogas" - DELETING_ASK: "Ar Jūs įsitikinę?" - TO_MANY_FOLDERS_DESC_1: "Pas jus per daug katalogų!" - TO_MANY_FOLDERS_DESC_2: "Mes rodome ne visus juos, kad išvengti našumo problemų." - HELP_DELETE_FOLDER: "Naikinti katalogą" - HELP_SHOW_HIDE_FOLDER: "Rodyti/Slėpti katalogą" - HELP_CHECK_FOR_NEW_MESSAGES: "Tikrinti/Netikrinti ar yra naujų laiškų" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Paskyrų sąrašas" - LEGEND_IDENTITIES: "Tapatybės" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Paskyros ir tapatybės" - BUTTON_ADD_ACCOUNT: "Pridėti paskyrą" - BUTTON_ADD_IDENTITY: "Pridėti tapatybę" - BUTTON_DELETE: "Šalinti" - LOADING_PROCESS: "Atnaujinamas paskyrų sąrašas" - DELETING_ASK: "Ar Jūs įsitikinę?" - DEFAULT_IDENTITY_LABEL: "numatytasis" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Tapatybės" - LEGEND_IDENTITIES: "Papildomos tapatybės" - LABEL_DEFAULT: "Numatytoji" - LABEL_DISPLAY_NAME: "Vardas" - LABEL_REPLY_TO: "Atsakyti" - LABEL_SIGNATURE: "Parašas" - LABEL_ADD_SIGNATURE_TO_ALL: "Pridėti parašą visiems rašomiems laiškams" - BUTTON_ADD_IDENTITY: "Sukurti tapatybę" - BUTTON_DELETE: "Šalinti" - LOADING_PROCESS: "Atnaujinamas tapatybių sąrašas" - DELETING_ASK: "Ar Jūs įsitikinę?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Keisti slaptažodį" - LABEL_CURRENT_PASSWORD: "Dabartinis slaptažodis" - LABEL_NEW_PASSWORD: "Naujas slaptažodis" - LABEL_REPEAT_PASSWORD: "Patvirtinkite naują slaptažodį" - BUTTON_UPDATE_PASSWORD: "Nustatyti naują slaptažodį" - ERROR_PASSWORD_MISMATCH: "Slaptažodžiai nesutampa, bandykite dar kartą" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Importuoti OpenPGP raktą" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Sukurti OpenPGP raktus" - TITLE_PRIVATE: "Privatus" - TITLE_PUBLIC: "Viešas" - DELETING_ASK: "Jūs įsitikinę?" - GENERATE_ONLY_HTTPS: "HTTPS only" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Sparčiųjų klavišų pagalba" - TAB_MAILBOX: "Pašto dėžutė" - TAB_MESSAGE_LIST: "Laiškų sąrašas" - TAB_MESSAGE_VIEW: "laiško peržiūra" - TAB_COMPOSE: "Sukurti" - LABEL_OPEN_USER_DROPDOWN: "Išskleisti vartotojo meniu" - LABEL_REPLY: "Atsakyti" - LABEL_REPLY_ALL: "Atsakyti visiems" - LABEL_FORWARD: "Persiųsti" - LABEL_FORWARD_MULTIPLY: "Persiųsti kaip prisegtuką" - LABEL_HELP: "Pagalba" - LABEL_CHECK_ALL: "Žymėti visus laiškus" - LABEL_ARCHIVE: "Archyvuoti" - LABEL_DELETE: "Šalinti" - LABEL_OPEN_THREAD: "Atidaryti pasirinktą giją" - LABEL_MOVE: "Perkelti" - LABEL_READ: "Pasirinktus žymėti kaip skaitytus" - LABEL_UNREAD: "Pasirinktus žymėti kaip neskaitytus" - LABEL_IMPORTANT: "Svarbūs, žvaigždute pažymėti laiškai" - LABEL_SEARCH: "Ieškoti" - LABEL_CANCEL_SEARCH: "Atšaukti paiešką" - LABEL_FULLSCREEN_ENTER: "Visas ekranas (Peržiūros lauko išdėstymas)" - LABEL_VIEW_MESSAGE_ENTER: "Žiūrėti laišką (Be peržiūros lauko)" - LABEL_SWITCH_TO_MESSAGE: "Perjungti į pasirinktą laišką" - LABEL_SWITCH_TO_FOLDER_LIST: "Perjungti į laiškų sąrašą" - LABEL_FULLSCREEN_TOGGLE: "Perjungti viso ekrano režimą" - LABEL_BLOCKQUOTES_TOGGLE: "Pereiti į citatą" - LABEL_THREAD_NEXT: "Kita šios gijos žinutė" - LABEL_THREAD_PREV: "Ankstesnė šios gijos žinutė" - LABEL_PRINT: "Spausdinti" - LABEL_EXIT_FULLSCREEN: "Išeiti iš viso ekrano režimo" - LABEL_CLOSE_MESSAGE: "Uždaryti laišką (Be peržiūros lauko)" - LABEL_SWITCH_TO_LIST: "Perjungti atgal į laiškų sąrašą" - LABEL_OPEN_COMPOSE_POPUP: "Sukurti naują laišką atskirame lange" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Atidaryti tapatybių sąrašą" - LABEL_SAVE_MESSAGE: "Išsaugoti laišką" - LABEL_SEND_MESSAGE: "Siųsti laišką" - LABEL_CLOSE_COMPOSE: "Uždaryti laišką" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "Viešų raktų nerasta" - NO_PUBLIC_KEYS_FOUND_FOR: "Viešų raktų nerasta \"%EMAIL%\" laiškui" - NO_PRIVATE_KEY_FOUND: "Privačių raktų nerasta" - NO_PRIVATE_KEY_FOUND_FOR: "Privačių raktų nerasta \"%EMAIL%\" laiškui" - ADD_A_PUBLICK_KEY: "Add a public key" - SELECT_A_PRIVATE_KEY: "Parinkti privatų raktą" - UNVERIFIRED_SIGNATURE: "Nepatikrintas parašas" - DECRYPTION_ERROR: "OpenPGP dekodavimo klaida" - GOOD_SIGNATURE: "Tinkamas parašas nuo %USER%" - PGP_ERROR: "OpenPGP klaida: %ERROR%" - SPECIFY_FROM_EMAIL: "Prašome nurodyti NUO e-pašto adresą" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Nurodykite bent vieną gavėją" - NOTIFICATIONS: - INVALID_TOKEN: "Neteisingas raktas" - AUTH_ERROR: "Autorizacija nepavyko" - ACCESS_ERROR: "Prieigos klaida" - CONNECTION_ERROR: "Nepavyskta prisijungti prie serverio" - CAPTCHA_ERROR: "Neteisingas CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- - Šis socialinis ID nepriskirtas jokiai e-pašto paskyrai. Prisijunkite naudojant - elektroninio pašto rekvizitus ir įjunkite šią funkciją paskyros nustatymuose. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- - Šis socialinis ID nepriskirtas jokiai e-pašto paskyrai. Prisijunkite naudojant - elektroninio pašto rekvizitus ir įjunkite šią funkciją paskyros nustatymuose. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- - Šis socialinis ID nepriskirtas jokiai e-pašto paskyrai. Prisijunkite naudojant - elektroninio pašto rekvizitus ir įjunkite šią funkciją paskyros nustatymuose. - DOMAIN_NOT_ALLOWED: "Šis subdomenas neleidžiamas" - ACCOUNT_NOT_ALLOWED: "Paskyra neleidžiama" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Būtinas dviejų veiksnių patikrinimas" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "dviejų veiksnių patikrinimo klaida" - COULD_NOT_SAVE_NEW_PASSWORD: "Negaliu išsaugoti slaptažodžio" - CURRENT_PASSWORD_INCORRECT: "Dabartinis slaptažodis netinkamas" - NEW_PASSWORD_SHORT: "Slaptažodis per trumpas" - NEW_PASSWORD_WEAK: "Slaptažodis per lengvas" - NEW_PASSWORD_FORBIDDENT: "Slaptažodyte bandote naudoti neleistinus simbolius" - CONTACTS_SYNC_ERROR: "Kontaktų sinchronizavimo klaida" - CANT_GET_MESSAGE_LIST: "Nepavyksta gauti laiškų sąrašo" - CANT_GET_MESSAGE: "Nepavyksta gauti laiško" - CANT_DELETE_MESSAGE: "Nepavyko pašalinti laiško" - CANT_MOVE_MESSAGE: "Nepavyko perkelti laiško" - CANT_SAVE_MESSAGE: "Nepavyko išsaugoti laiško" - CANT_SEND_MESSAGE: "Nepavyko išsiųsti laiško" - INVALID_RECIPIENTS: "Netinkamas gavėjas" - CANT_SAVE_FILTERS: "Nepavyko išsaugoti filtrų" - CANT_GET_FILTERS: "Nepavyko gauti filtrų" - FILTERS_ARE_NOT_CORRECT: "Filtrai neteisingi" - CANT_CREATE_FOLDER: "Nepavyksta sukurti katalogo" - CANT_RENAME_FOLDER: "Nepavyksta pervadinti katalogo" - CANT_DELETE_FOLDER: "Nepavyksta pašalinti katalogo" - CANT_DELETE_NON_EMPTY_FOLDER: "Negalima pašalinti ne tuščio katalogo" - CANT_SUBSCRIBE_FOLDER: "Nepavyskta užprenumeruoti katalogo" - CANT_UNSUBSCRIBE_FOLDER: "Nepavyksta nutraukti katalogo prenumeratos" - CANT_SAVE_SETTINGS: "Nepavyksta išsaugoti nustatymų" - CANT_SAVE_PLUGIN_SETTINGS: "Nepavyksta išsaugoti nustatymų" - DOMAIN_ALREADY_EXISTS: "Subdomenas jau egzistuoja" - CANT_INSTALL_PACKAGE: "Nepavyksta instaliuoti paketo" - CANT_DELETE_PACKAGE: "Nepavyksta pašalinti paketo" - INVALID_PLUGIN_PACKAGE: "Netinkamas įskiepio paketas" - UNSUPPORTED_PLUGIN_PACKAGE: "Nepalaikomas įskiepio paketas" - LICENSING_SERVER_IS_UNAVAILABLE: "Prenumeratos serveris nepasiekimas" - LICENSING_DOMAIN_EXPIRED: "Šio subdomeno prenumeratos laikas baigėsi." - LICENSING_DOMAIN_BANNED: "Šio subdomeno prenumerata uždrausta." - DEMO_SEND_MESSAGE_ERROR: "Saugumo sumetimais, ši demo paskyra neleidžia siųsti laiškų išoriniais e-pašto adresais!" - DEMO_ACCOUNT_ERROR: "Saugumo sumetimais, su šia paskyra negalima atlikti norimo veiksmo!" - ACCOUNT_ALREADY_EXISTS: "Paskyra jau egzistuoja" - ACCOUNT_DOES_NOT_EXIST: "Nėra tokios paskyros" - MAIL_SERVER_ERROR: "Klaida bandant pasiekti pašto serverį" - INVALID_INPUT_ARGUMENT: "Neteisingas įvesties argumentas" - UNKNOWN_ERROR: "Nežinoma klaida" - STATIC: - BACK_LINK: "Perkrauti" - DOMAIN_LIST_DESC: "Leidžiamų naudoti subdomenų sąrašas." - PHP_EXSTENSIONS_ERROR_DESC: "Trūksta būtinų PHP plėtinių!" - PHP_VERSION_ERROR_DESC: "Jūsų PHP versija (%VERSION%) žemesnė, nei reikalaujama 5.3.0!" - NO_SCRIPT_TITLE: "Šiai aplikacijai reikalinga JavaScript." - NO_SCRIPT_DESC: | - JavaScript nepalaikoma Jūsų naršyklėje. - Įjunkite JavaScript palaikymą naršyklėje ir bandykite vėl. - NO_COOKIE_TITLE: "Slapukų palaikymas būtinas šiai aplikacijai." - NO_COOKIE_DESC: | - Slapukų palaikymas negalimas jūsų naršyklėje. - Įjunkite slapukų palaikymą naršyklėje ir bandykite vėl. - BAD_BROWSER_TITLE: "Jūsų naršyklė pasenusi." - BAD_BROWSER_DESC: | - Norint naudotis visais šios aplikacijos privalumais, - parsisiųskite ir įsidiekite vieną iš šių naršyklių: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/lv_LV.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/lv_LV.yml deleted file mode 100755 index 3a9d0398..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/lv_LV.yml +++ /dev/null @@ -1,709 +0,0 @@ -lv_LV: - LOGIN: - LABEL_EMAIL: "E-pasts" - LABEL_LOGIN: "Ielogoties" - LABEL_PASSWORD: "Parole" - LABEL_SIGN_ME: "Atcerēties mani" - LABEL_VERIFICATION_CODE: "Autentifikācijas kods" - LABEL_DONT_ASK_VERIFICATION_CODE: "Don't ask for the code for 2 weeks" - BUTTON_SIGN_IN: "Ielogoties" - TITLE_SIGN_IN_GOOGLE: "Ielogoties izmantojot Google" - TITLE_SIGN_IN_FACEBOOK: "Ielogoties izmantojot Facebook" - TITLE_SIGN_IN_TWITTER: "Ielogoties izmantojot Twitter" - LABEL_FORGOT_PASSWORD: "Forgot password" - LABEL_REGISTRATION: "Registration" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Pievienot kontu" - BUTTON_SETTINGS: "Uzstādijumi" - BUTTON_HELP: "Palīdzība" - BUTTON_LOGOUT: "Izlogoties" - MOBILE: - BUTTON_MOBILE_VERSION: "Mobilā versija" - BUTTON_DESKTOP_VERSION: "Darba virsmas versija" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Meklēt" - TITLE_ADV: "Papildus meklēšana" - LABEL_ADV_FROM: "No" - LABEL_ADV_TO: "Kam" - LABEL_ADV_SUBJECT: "Tēma" - LABEL_ADV_TEXT: "Teksts" - LABEL_ADV_HAS_ATTACHMENT: "Ir pielikums" - LABEL_ADV_HAS_ATTACHMENTS: "Ir pielikumi" - LABEL_ADV_FLAGGED: "Atzīmētie" - LABEL_ADV_UNSEEN: "Unseen" - LABEL_ADV_DATE: "Datums" - LABEL_ADV_DATE_ALL: "Viss periods" - LABEL_ADV_DATE_3_DAYS: "Līdz 3 dienas vecs" - LABEL_ADV_DATE_7_DAYS: "Līdz 1 nedēļu vecs" - LABEL_ADV_DATE_MONTH: "Līdz 1 mēnesi vecs" - LABEL_ADV_DATE_3_MONTHS: "Līdz 3 mēnešus vecs" - LABEL_ADV_DATE_6_MONTHS: "Līdz 6 mēnešus vecs" - LABEL_ADV_DATE_YEAR: "Līdz 1 gadu vecs" - BUTTON_ADV_SEARCH: "Meklēt" - PREVIEW_POPUP: - FULLSCREEN: "Toggle fullscreen" - ZOOM: "Zoom in/out" - CLOSE: "Aizvērt (Esc)" - LOADING: "Lādējas..." - GALLERY_PREV: "Iepriekšejā (Kreisā būltiņa)" - GALLERY_NEXT: "Nākamā (Labā būltiņa)" - GALLERY_COUNTER: "%curr% no %total%" - IMAGE_ERROR: "Attēlu nevar ielādēt." - AJAX_ERROR: "Saturunevar ielādēt." - FOLDER_LIST: - BUTTON_COMPOSE: "Rakstīt" - BUTTON_CONTACTS: "Kontakti" - BUTTON_NEW_MESSAGE: "Jauns ziņojums" - INBOX_NAME: "Iesūtne" - SENT_NAME: "Nosūtītie" - DRAFTS_NAME: "Melnraksti" - SPAM_NAME: "Spams" - TRASH_NAME: "Miskaste" - ARCHIVE_NAME: "Arhīvs" - QUOTA: - TITLE: "Kvotas izmantojums" - MESSAGE_LIST: - BUTTON_RELOAD: "Pārlādēt ziņojumu sarakstu" - BUTTON_MOVE_TO: "Pārvietot uz" - BUTTON_DELETE: "Dzēst" - BUTTON_ARCHIVE: "Archive" - BUTTON_SPAM: "Spams" - BUTTON_NOT_SPAM: "Not Spam" - BUTTON_EMPTY_FOLDER: "Iztīrīt mapi" - BUTTON_MULTY_FORWARD: "Pārsūtīt ziņojumus" - BUTTON_DELETE_WITHOUT_MOVE: "Dzēst pavisam" - BUTTON_MORE: "Vairāk" - MENU_SET_SEEN: "Atzīmēt kā izlasītu" - MENU_SET_ALL_SEEN: "Atzīmēt visu kā izlasītu" - MENU_UNSET_SEEN: "Atzīmēt kā neizlasītu" - MENU_SET_FLAG: "Atzīmēt" - MENU_UNSET_FLAG: "Noņemt atzīmi" - MENU_SELECT_ALL: "Viss" - MENU_SELECT_NONE: "Neviens" - MENU_SELECT_INVERT: "Pretēji" - MENU_SELECT_UNSEEN: "Neizlasīts" - MENU_SELECT_SEEN: "Izlasīts" - MENU_SELECT_FLAGGED: "Atzīmētie" - MENU_SELECT_UNFLAGGED: "Noņemtās atzīmes" - EMPTY_LIST: "Tukšs saraksts." - EMPTY_SEARCH_LIST: "Neviens ziņojums neatbilda jūsu meklētajiem kritērijiem." - SEARCH_RESULT_FOR: "Meklēšanas rezultāti: \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "back to message list" - LIST_LOADING: "Lādējas" - EMPTY_SUBJECT_TEXT: "(Nav virsraksta)" - PUT_MESSAGE_HERE: "Ievelciet ziņojumus šeit lai tos apskatītu." - TODAY_AT: "šodien %TIME%" - YESTERDAY_AT: "vakardien %TIME%" - SEARCH_PLACEHOLDER: "Meklēt" - NEW_MESSAGE_NOTIFICATION: "Jums ir %COUNT% jaunas ziņas!" - QUOTA_SIZE: "Izmantots %SIZE% (%PROC%%) no %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Labot" - BUTTON_BACK: "Atpakaļ" - BUTTON_CLOSE: "Aizvērt" - BUTTON_DELETE: "Dzēst" - BUTTON_UNSUBSCRIBE: "Atrakstīties no saraksta" - BUTTON_ARCHIVE: "Archive" - BUTTON_SPAM: "Spams" - BUTTON_NOT_SPAM: "Not Spam" - BUTTON_MOVE_TO: "Pārvietot uz" - BUTTON_MORE: "Vairāk" - BUTTON_REPLY: "Atbildēt" - BUTTON_REPLY_ALL: "Atbildēt visiem" - BUTTON_FORWARD: "Pārsūtīt" - BUTTON_FORWARD_AS_ATTACHMENT: "Pārsūtīt kā pielikumu" - BUTTON_EDIT_AS_NEW: "Edit as New" - BUTTON_SHOW_IMAGES: "Rādīt attēlus" - BUTTON_NOTIFY_READ_RECEIPT: "The sender has asked to be notified when you read this message." - BUTTON_IN_NEW_WINDOW: "Skatīt jaunā logā" - BUTTON_THREAD_LIST: "Thread list" - BUTTON_THREAD_PREV: "Previous" - BUTTON_THREAD_NEXT: "Next" - BUTTON_THREAD_MORE: "More messages" - MENU_HEADERS: "Rādīt ziņojuma galveni" - MENU_VIEW_ORIGINAL: "Rādīt orģinālu" - MENU_DOWNLOAD_ORIGINAL: "Lejuplādēt kā .eml failu" - MENU_FILTER_SIMILAR: "Atfiltrēt šādus ziņojumus" - MENU_PRINT: "Printēt" - EMPTY_SUBJECT_TEXT: "(Nav tēmas)" - LABEL_SUBJECT: "Tēma" - LABEL_DATE: "Datums" - LABEL_FROM: "No" - LABEL_FROM_SHORT: "no" - LABEL_TO: "Kam" - LABEL_TO_SHORT: "kam" - LABEL_CC: "CC" - LABEL_BCC: "BCC" - LABEL_REPLY_TO: "Reply-To" - PRINT_LABEL_FROM: "No" - PRINT_LABEL_TO: "Kam" - PRINT_LABEL_CC: "CC" - PRINT_LABEL_BCC: "BCC" - PRINT_LABEL_REPLY_TO: "Reply-To" - PRINT_LABEL_DATE: "Datums" - PRINT_LABEL_SUBJECT: "Tēma" - PRINT_LABEL_ATTACHMENTS: "Pielikumi" - MESSAGE_LOADING: "Lādējās" - MESSAGE_VIEW_DESC: "Izvēlaties ziņojumu no saraksta lai to apskatītu." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" - LINK_DOWNLOAD_AS_ZIP: "Download as zip" - LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" - LINK_SAVE_TO_DROPBOX: "Save to Dropbox" - READ_RECEIPT: - SUBJECT: "Return Receipt (displayed) - %SUBJECT%" - BODY: | - This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. - - Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. - There is no guarantee that the recipient has read or understood the message contents. - SUGGESTIONS: - SEARCHING_DESC: "Meklē..." - CONTACTS: - LEGEND_CONTACTS: "Kontakti" - SEARCH_INPUT_PLACEHOLDER: "Meklēt" - BUTTON_ADD_CONTACT: "Pievienot kontaktu" - BUTTON_CREATE_CONTACT: "Izveidot" - BUTTON_UPDATE_CONTACT: "Atjaunot" - BUTTON_IMPORT: "Import (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" - BUTTON_EXPORT_CSV: "Export (csv)" - ERROR_IMPORT_FILE: "Import error (invalid file format)" - LIST_LOADING: "Lādējās" - EMPTY_LIST: "Nav kontaktu" - EMPTY_SEARCH: "Kontakti nav atrasti" - CLEAR_SEARCH: "Nodzēt meklēšanu" - CONTACT_VIEW_DESC: "Izvēlaties kontaktu no saraksta lai to apskatītu." - LABEL_DISPLAY_NAME: "Display name" - LABEL_EMAIL: "Email" - LABEL_PHONE: "Phone" - LABEL_WEB: "Web" - LABEL_BIRTHDAY: "Birthday" - LINK_ADD_EMAIL: "Add an email address" - LINK_ADD_PHONE: "Add a phone" - LINK_BIRTHDAY: "Birthday" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Enter display name" - PLACEHOLDER_ENTER_LAST_NAME: "Enter last name" - PLACEHOLDER_ENTER_FIRST_NAME: "Enter first name" - PLACEHOLDER_ENTER_NICK_NAME: "Enter nickname" - LABEL_READ_ONLY: "Read only" - LABEL_SHARE: "Share" - ADD_MENU_LABEL: "Add" - ADD_MENU_NICKNAME: "Nickname" - ADD_MENU_NOTES: "Notes" - ADD_MENU_EMAIL: "Email" - ADD_MENU_PHONE: "Phone" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Address" - ADD_MENU_BIRTHDAY: "Birthday" - ADD_MENU_TAGS: "Tags" - BUTTON_SHARE_NONE: "None" - BUTTON_SHARE_ALL: "Everyone" - BUTTON_SYNC: "Synchronization (CardDAV)" - COMPOSE: - TITLE_FROM: "No" - TITLE_TO: "Kam" - TITLE_CC: "CC" - TITLE_BCC: "BCC" - TITLE_REPLY_TO: "Reply To" - TITLE_SUBJECT: "Tēma" - LINK_SHOW_INPUTS: "rādīt visus laukus" - BUTTON_SEND: "Sūtīt" - BUTTON_SAVE: "Saglabāt" - BUTTON_DELETE: "Dzēst" - BUTTON_CANCEL: "Atcelt" - BUTTON_MINIMIZE: "Minimize" - SAVED_TIME: "Saglabāts %TIME%" - SAVED_ERROR_ON_SEND: "Ziņojums nosūtīts, bet tas nav saglabāts izsūtnē." - DISCARD_UNSAVED_DATA: "Discard unsaved data?" - ATTACH_FILES: "Pievienot failus" - ATTACH_DROP_FILES_DESC: "Iemet failus šeit" - ATTACH_ITEM_CANCEL: "Atcelt" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% rakstija" - FORWARD_MESSAGE_TOP_TITLE: "-------- Forwarded message -------" - FORWARD_MESSAGE_TOP_FROM: "No" - FORWARD_MESSAGE_TOP_TO: "Kam" - FORWARD_MESSAGE_TOP_CC: "CC" - FORWARD_MESSAGE_TOP_SENT: "Nosūtīts" - FORWARD_MESSAGE_TOP_SUBJECT: "Tēma" - EMPTY_TO_ERROR_DESC: "Pievienojat vismaz vienu saņēmēju" - NO_ATTACHMENTS_HERE_DESC: "No attachments here." - ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet" - BUTTON_REQUEST_READ_RECEIPT: "Request a read receipt" - BUTTON_MARK_AS_IMPORTANT: "Mark as important" - BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" - BUTTON_REQUEST_DSN: "Request a delivery receipt" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Close" - POPUPS_ASK: - BUTTON_YES: "Jā" - BUTTON_NO: "Nē" - DESC_WANT_CLOSE_THIS_WINDOW: "Are you sure you want to close this window?" - DESC_WANT_DELETE_MESSAGES: "Are you sure you want to delete the message(s)?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Choose your language" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Pievienot kontu?" - BUTTON_ADD_ACCOUNT: "Pievienot" - TITLE_UPDATE_ACCOUNT: "Update Account?" - BUTTON_UPDATE_ACCOUNT: "Update" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Add Identity?" - TITLE_UPDATE_IDENTITY: "Update Identity?" - BUTTON_ADD_IDENTITY: "Add" - BUTTON_UPDATE_IDENTITY: "Update" - LABEL_EMAIL: "Email" - LABEL_NAME: "Name" - LABEL_REPLY_TO: "Reply To" - LABEL_SIGNATURE: "Signature" - LABEL_CC: "Cc" - LABEL_BCC: "Bcc" - LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Izveidot mapi?" - LABEL_NAME: "Mapes nosaukums" - LABEL_PARENT: "Zem kuras mapes" - BUTTON_CREATE: "Izveidot" - BUTTON_CANCEL: "Atcelt" - BUTTON_CLOSE: "Aizvērt" - TITLE_CREATING_PROCESS: "Izveidot mapi" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Iztīrīt visus ziņojumus no šis mapes?" - BUTTON_CLEAR: "Notīrīt" - BUTTON_CANCEL: "Atcelt" - BUTTON_CLOSE: "Aizvērt" - DANGER_DESC_WARNING: "Brīdinājums!" - DANGER_DESC_HTML_1: "Šī darbība izdzēsīs visus ziņojumus no %FOLDER% mapes pavisam." - DANGER_DESC_HTML_2: "Šo procesu nevarēs apturēt." - TITLE_CLEARING_PROCESS: "Mape tiek iztīrīta..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Import OpenPGP key" - BUTTON_IMPORT_OPEN_PGP_KEY: "Import" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "View OpenPGP key" - BUTTON_SELECT: "Select" - BUTTON_CLOSE: "Close" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP keys" - LABEL_EMAIL: "Email" - LABEL_NAME: "Name" - LABEL_PASSWORD: "Password" - LABEL_KEY_BIT_LENGTH: "Key length" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" - LABEL_SIGN: "Sign" - LABEL_ENCRYPT: "Encrypt" - LABEL_PASSWORD: "Password" - BUTTON_SIGN: "Sign" - BUTTON_ENCRYPT: "Encrypt" - BUTTON_SIGN_AND_ENCRYPT: "Sign and encrypt" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" - LABEL_KEY: "Private Key" - LABEL_PASSWORD: "Password" - BUTTON_DECRYPT: "Decrypt" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "2-Step verification test" - LABEL_CODE: "Code" - BUTTON_TEST: "Test" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Create a filter?" - TITLE_EDIT_FILTER: "Update filter?" - FILTER_NAME: "Name" - LEGEND_CONDITIONS: "Conditions" - LEGEND_ACTIONS: "Actions" - BUTTON_DONE: "Done" - BUTTON_ADD_CONDITION: "Add a Condition" - SELECT_ACTION_NONE: "None" - SELECT_ACTION_MOVE_TO: "Move to" - SELECT_ACTION_FORWARD_TO: "Forward to" - SELECT_ACTION_REJECT: "Reject" - SELECT_ACTION_VACATION_MESSAGE: "Vacation message" - SELECT_ACTION_DISCARD: "Discard" - SELECT_FIELD_FROM: "From" - SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" - SELECT_FIELD_SUBJECT: "Subject" - SELECT_FIELD_HEADER: "Header" - SELECT_FIELD_SIZE: "Size" - SELECT_TYPE_CONTAINS: "Contains" - SELECT_TYPE_NOT_CONTAINS: "Not Contains" - SELECT_TYPE_MATCHES: "Matches (* and ? supported)" - SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" - SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Not Regexp" - SELECT_TYPE_EQUAL_TO: "Equal To" - SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" - SELECT_TYPE_OVER: "Over" - SELECT_TYPE_UNDER: "Under" - SELECT_MATCH_ANY: "Matching any of the following rules" - SELECT_MATCH_ALL: "Matching all of the following rules" - MARK_AS_READ_LABEL: "Mark as read" - REPLY_INTERVAL_LABEL: "Reply interval (days)" - KEEP_LABEL: "Keep" - STOP_LABEL: "Don't stop processing rules" - EMAIL_LABEL: "Email" - VACATION_SUBJECT_LABEL: "Subject (optional)" - VACATION_MESSAGE_LABEL: "Message" - VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" - REJECT_MESSAGE_LABEL: "Reject message" - ALL_INCOMING_MESSAGES_DESC: "All incoming messages" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Izvēlaties sistēmas mapes" - SELECT_CHOOSE_ONE: "Izvēlaties vienu" - SELECT_UNUSE_NAME: "Nelietot" - LABEL_SENT: "Nosūtīts" - LABEL_DRAFTS: "Melnraksts" - LABEL_SPAM: "Spams" - LABEL_TRASH: "Miskaste" - LABEL_ARCHIVE: "Archive" - BUTTON_CANCEL: "Atcelt" - BUTTON_CLOSE: "Aizvērt" - NOTIFICATION_SENT: | - Tu neesi izvēlējies "Izsūtne" sistēmas mapi, kurā ziņojumi tiek ielikti pēc nosūtīšanas. - Ja nevēlie saglabāt nosūtīto ziņu, lūdzu izvēlies "Nelietot" opciju. - NOTIFICATION_DRAFTS: "Tu neesi izvēlējies \"Melnraksti\" sistemas mapi, kurā tiktu saglabāti ziņojumi, kamēr tie tiek rakstīti." - NOTIFICATION_SPAM: | - Tu neesi izvēlējies "Spams" sistēmas mapi, kurā tiks ievietoti spam ziņojumi. - Ja tu vēlies izdzēst ziņojumus pavisam, izvēlies "Neizmantot" opciju. - NOTIFICATION_TRASH: | - Tu neesi izvēlējies "Miskaste" sistēmas mapi. - Ja tu vēlies izdzēst ziņojumus pavisam, izvēlies "Neizmantot" opciju. - NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "2-Step Verification" - LABEL_ENABLE_TWO_FACTOR: "Enable 2-Step verification" - LABEL_TWO_FACTOR_USER: "User" - LABEL_TWO_FACTOR_STATUS: "Status" - LABEL_TWO_FACTOR_SECRET: "Secret" - LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" - BUTTON_CREATE: "Create New Secret" - BUTTON_ACTIVATE: "Activate" - BUTTON_CLEAR: "Clear" - BUTTON_LOGOUT: "Logout" - BUTTON_DONE: "Done" - BUTTON_TEST: "Test" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Show Secret" - BUTTON_HIDE_SECRET: "Hide Secret" - TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" - TWO_FACTOR_SECRET_DESC: >- - Import this info into your Google Authenticator client (or other TOTP client) - using the provided QR code below or by entering the code manually. - TWO_FACTOR_BACKUP_CODES_DESC: >- - If you can't receive codes via Google Authenticator, you can use backup codes - to sign in. After you’ve used a backup code to sign in, it will become inactive. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." - TITLES: - LOADING: "Lādējas" - LOGIN: "Ielogoties" - MAILBOX: "Pastkastīte" - SETTINGS: "Uzstādijumi" - COMPOSE: "Rakstīt" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Fails ir par lielu" - ERROR_FILE_PARTIALLY_UPLOADED: "Nezināmas kļūdas dēļ fails tika ielādēts daļēji" - ERROR_NO_FILE_UPLOADED: "Fails nav ielādēts" - ERROR_MISSING_TEMP_FOLDER: "Trūkst tmp mape" - ERROR_ON_SAVING_FILE: "Nezināma faila ielādes kļūda" - ERROR_FILE_TYPE: "Nepareizs faila tips" - ERROR_UNKNOWN: "Nezināma faila ielādes kļūda" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEKSTS" - TEXT_SWITCHER_RICH_FORMATTING: "Papildus teksta noformēums" - TEXT_SWITCHER_CONFIRM: "Bildes un teksta noformējums pazudīs. Vai tiešām turpināt?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Personīgie" - LABEL_GENERAL_NAME: "Vispārējie" - LABEL_CONTACTS_NAME: "Contacts" - LABEL_FOLDERS_NAME: "Mapes" - LABEL_ACCOUNTS_NAME: "Konti" - LABEL_IDENTITY_NAME: "Identity" - LABEL_IDENTITIES_NAME: "Identities" - LABEL_FILTERS_NAME: "Filters" - LABEL_TEMPLATES_NAME: "Templates" - LABEL_SECURITY_NAME: "Security" - LABEL_SOCIAL_NAME: "Sociālie" - LABEL_THEMES_NAME: "Tēmas" - LABEL_CHANGE_PASSWORD_NAME: "Parole" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Atpakaļ" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filters" - BUTTON_SAVE: "Save" - BUTTON_ADD_FILTER: "Add a Filter" - BUTTON_DELETE: "Delete" - BUTTON_RAW_SCRIPT: "Use Custom User Script" - SUBNAME_NONE: "None" - SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" - SUBNAME_REJECT: "Reject" - SUBNAME_VACATION_MESSAGE: "Vacation message" - SUBNAME_DISCARD: "Discard" - CAPABILITY_LABEL: "Capability" - LOADING_PROCESS: "Updating filter list" - DELETING_ASK: "Are you sure?" - CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identity" - LABEL_DISPLAY_NAME: "Vārds" - LABEL_REPLY_TO: "Atbildēt uz" - LABEL_SIGNATURE: "Paraksts" - LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Security" - LABEL_CONFIGURE_TWO_FACTOR: "Iestatīt 2 soļu autentifikāciju" - LABEL_AUTOLOGOUT: "Auto Logout" - AUTOLOGIN_NEVER_OPTION_NAME: "Never" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% Stunda(s)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Vispārējie" - LABEL_LANGUAGE: "Valoda" - LABEL_IDENTITY: "Identity" - LABEL_LAYOUT: "Layout" - LABEL_LAYOUT_NO_SPLIT: "No Split" - LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" - LABEL_EDITOR: "Galvenais teksta editors" - LABEL_EDITOR_HTML: "Html" - LABEL_EDITOR_PLAIN: "Teksts" - LABEL_EDITOR_HTML_FORCED: "Html (forced)" - LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" - LABEL_ANIMATION: "Interface animation" - LABEL_ANIMATION_FULL: "Full" - LABEL_ANIMATION_NORMAL: "Normal" - LABEL_ANIMATION_NONE: "None" - LABEL_VIEW_OPTIONS: "Apskates opcijas" - LABEL_USE_PREVIEW_PANE: "Lietot priekšskatu" - LABEL_USE_CHECKBOXES_IN_LIST: "Rādīt checkboxes sarakstā" - LABEL_USE_THREADS: "Lietot saraksti" - LABEL_REPLY_SAME_FOLDER: "Atbildes ziņojumus ielikt mapē kurā atrodas vēstule uz kuru tiek atbildēts." - LABEL_SHOW_IMAGES: "Vienmēr rādīt attēlus ziņojumos" - LABEL_SHOW_ANIMATION: "Rādīt animāciju" - LABEL_MESSAGE_PER_PAGE: "Ziņojumi lapā" - LABEL_NOTIFICATIONS: "Paziņojumi" - LABEL_SOUND_NOTIFICATION: "Sound notification" - LABEL_CHROME_NOTIFICATION_DESC: "Rādīt jaunus paziņojumus kā izlecošus logus" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Parlūkprogramma bloķēja)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Contacts" - LABEL_CONTACTS_AUTOSAVE: "Automatically add recipients to your address book" - LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" - LABEL_CONTACTS_SYNC_SERVER: "Server" - LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" - LABEL_CONTACTS_SYNC_USER: "User" - LABEL_CONTACTS_SYNC_PASSWORD: "Password" - SETTINGS_THEMES: - LEGEND_THEMES: "Tēmas" - LEGEND_THEMES_CUSTOM: "Tēmas konfigurācija" - LABEL_CUSTOM_TYPE: "Tips" - LABEL_CUSTOM_TYPE_LIGHT: "Gaišs" - LABEL_CUSTOM_TYPE_DARK: "Tumšs" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Fons" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Ielādēt fona attēlu (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "Fails ir par lielu" - ERROR_FILE_TYPE_ERROR: "Nepareizs faila tips (Tikai JPG un PNG)" - ERROR_UNKNOWN: "Nezināma faila ielādes kļūda" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Connect Google" - BUTTON_GOOGLE_DISCONNECT: "Disconnect Google" - MAIN_GOOGLE_DESC: "Pēc ieslēgšanas ielogošanos caur Google, tu varēsi ielogoties izmantojot Google pogu." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Connect Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Disconnect Facebook" - MAIN_FACEBOOK_DESC: "Pēc ieslēgšanas ielogošanos caur Facebook, tu varēsi ielogoties izmantojot Facebook pogu." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Connect Twitter" - BUTTON_TWITTER_DISCONNECT: "Disconnect Twitter" - MAIN_TWITTER_DESC: "Pēc ieslēgšanas ielogošanos caur Twitter, tu varēsi ielogoties izmantojot Twitter pogu." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Mapes" - BUTTON_CREATE: "Izveidot mapi" - BUTTON_SYSTEM: "Sistēmas mapes" - BUTTON_DELETE: "Dzēst" - BUTTON_SUBSCRIBE: "Abonēt" - BUTTON_UNSUBSCRIBE: "Atcelt abonēšanu" - LOADING_PROCESS: "Atjauno mapju sarakstu" - CREATING_PROCESS: "Izveidot mapi" - DELETING_PROCESS: "Dzēst mapi" - RENAMING_PROCESS: "Pārsaukt mapi" - DELETING_ASK: "Tiešām?" - TO_MANY_FOLDERS_DESC_1: "You have too many folders!" - TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." - HELP_DELETE_FOLDER: "Delete folder" - HELP_SHOW_HIDE_FOLDER: "Show/hide folder" - HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Kontu saraksts" - LEGEND_IDENTITIES: "Identities" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" - BUTTON_ADD_ACCOUNT: "Pievienot kontu" - BUTTON_ADD_IDENTITY: "Add an Identity" - BUTTON_DELETE: "Dzēst" - LOADING_PROCESS: "Atjauno kontu sarakstu" - DELETING_ASK: "Tiešām?" - DEFAULT_IDENTITY_LABEL: "default" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identity" - LEGEND_IDENTITIES: "Additional Identities" - LABEL_DEFAULT: "Default" - LABEL_DISPLAY_NAME: "Vārds" - LABEL_REPLY_TO: "Atbildēt uz" - LABEL_SIGNATURE: "Paraksts" - LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" - BUTTON_ADD_IDENTITY: "Add Identity" - BUTTON_DELETE: "Delete" - LOADING_PROCESS: "Updating identity list" - DELETING_ASK: "Are you sure?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Mainīt paroli" - LABEL_CURRENT_PASSWORD: "Tagadējā parole" - LABEL_NEW_PASSWORD: "Jaunā parole" - LABEL_REPEAT_PASSWORD: "Jaunā parole vēlreiz" - BUTTON_UPDATE_PASSWORD: "Saglabāt paroli" - ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" - TITLE_PRIVATE: "Private" - TITLE_PUBLIC: "Public" - DELETING_ASK: "Are you sure?" - GENERATE_ONLY_HTTPS: "HTTPS only" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" - TAB_MAILBOX: "Mailbox" - TAB_MESSAGE_LIST: "Message list" - TAB_MESSAGE_VIEW: "Message view" - TAB_COMPOSE: "Compose" - LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" - LABEL_REPLY: "Reply" - LABEL_REPLY_ALL: "Reply All" - LABEL_FORWARD: "Forward" - LABEL_FORWARD_MULTIPLY: "Forward (multiply)" - LABEL_HELP: "Help" - LABEL_CHECK_ALL: "Select all messages" - LABEL_ARCHIVE: "Archive" - LABEL_DELETE: "Delete" - LABEL_OPEN_THREAD: "Open selected thread" - LABEL_MOVE: "Move" - LABEL_READ: "Read selected messages" - LABEL_UNREAD: "Unread selected messages" - LABEL_IMPORTANT: "Svarīgi, atzīmēt iezīmētos ziņojumus" - LABEL_SEARCH: "Search" - LABEL_CANCEL_SEARCH: "Cancel search" - LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" - LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" - LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" - LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" - LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" - LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" - LABEL_THREAD_NEXT: "Next message in thread" - LABEL_THREAD_PREV: "Previous message in thread" - LABEL_PRINT: "Print" - LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" - LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" - LABEL_SWITCH_TO_LIST: "Switch focus back to message list" - LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" - LABEL_SAVE_MESSAGE: "Save message" - LABEL_SEND_MESSAGE: "Send message" - LABEL_CLOSE_COMPOSE: "Close compose" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "No public keys found" - NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" - NO_PRIVATE_KEY_FOUND: "No private key found" - NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" - ADD_A_PUBLICK_KEY: "Add a public key" - SELECT_A_PRIVATE_KEY: "Izvēlies privāto atslēgu" - UNVERIFIRED_SIGNATURE: "Unverified signature" - DECRYPTION_ERROR: "OpenPGP decryption error" - GOOD_SIGNATURE: "Good signature from %USER%" - PGP_ERROR: "OpenPGP error: %ERROR%" - SPECIFY_FROM_EMAIL: "Please specify FROM email address" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" - NOTIFICATIONS: - INVALID_TOKEN: "Nepareizs tokens" - AUTH_ERROR: "Autorizācija neizdevās" - ACCESS_ERROR: "Piekļuves kļūda" - CONNECTION_ERROR: "Nevar savienoties ar serveri" - CAPTCHA_ERROR: "Nepareizs kods" - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- - Sociālā ID nav pievienot nevienam e-pastam. Ielogojaties ar e-pastu un ieslēdzat - šādu iespeju uzstādijumos. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- - Sociālā ID nav pievienot nevienam e-pastam. Ielogojaties ar e-pastu un ieslēdzat - šādu iespeju uzstādijumos. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- - Sociālā ID nav pievienot nevienam e-pastam. Ielogojaties ar e-pastu un ieslēdzat - šādu iespeju uzstādijumos. - DOMAIN_NOT_ALLOWED: "Šis domēns nav atļauts" - ACCOUNT_NOT_ALLOWED: "Account is not allowed" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" - COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" - CURRENT_PASSWORD_INCORRECT: "Current password incorrect" - NEW_PASSWORD_SHORT: "Password is too short" - NEW_PASSWORD_WEAK: "Password is too easy" - NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" - CONTACTS_SYNC_ERROR: "Contacts synchronization error" - CANT_GET_MESSAGE_LIST: "Nevar ielādēt ziņojumu sarakstu" - CANT_GET_MESSAGE: "Nevar ielādēt ziņojumu" - CANT_DELETE_MESSAGE: "Nevar izdzēst ziņojumu" - CANT_MOVE_MESSAGE: "Nevar pārvietot ziņojumu" - CANT_SAVE_MESSAGE: "Nevar saglabāt ziņojumu" - CANT_SEND_MESSAGE: "Nevar nosūtīt ziņojumu" - INVALID_RECIPIENTS: "Nepareizi saņēmēji" - CANT_SAVE_FILTERS: "Can't save filters" - CANT_GET_FILTERS: "Can't get filters" - FILTERS_ARE_NOT_CORRECT: "Filters are not correct" - CANT_CREATE_FOLDER: "Nevar izveidot mapi" - CANT_RENAME_FOLDER: "Nevar pārsaukt mapi" - CANT_DELETE_FOLDER: "Nevar izdzēst mapi" - CANT_DELETE_NON_EMPTY_FOLDER: "Nevar izdzēst pilnu mapi" - CANT_SUBSCRIBE_FOLDER: "Nevar pierakstīties mapei" - CANT_UNSUBSCRIBE_FOLDER: "Nevar atrakstīties mapei" - CANT_SAVE_SETTINGS: "Nevar saglabāt uzstādijumus" - CANT_SAVE_PLUGIN_SETTINGS: "Nevar saglabāt uzstādijumus" - DOMAIN_ALREADY_EXISTS: "Domeņes jau eksistē" - CANT_INSTALL_PACKAGE: "Neizdevās instālēt paku" - CANT_DELETE_PACKAGE: "Neizdevās nodzēst paku" - INVALID_PLUGIN_PACKAGE: "Nepareiza spraudņa paka" - UNSUPPORTED_PLUGIN_PACKAGE: "Neatbalstīta spraudņa paka" - LICENSING_SERVER_IS_UNAVAILABLE: "Abonēšanas serveris nav pieejams" - LICENSING_DOMAIN_EXPIRED: "Abonēšana šim domēnam ir beigusies." - LICENSING_DOMAIN_BANNED: "Abonēšana šim domēnam ir bloķēta." - DEMO_SEND_MESSAGE_ERROR: "Drošīnas iemeslu dēļ, demo konts nedrīks sūtīt e-pastu uz ārējiem e-pastiem!" - DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" - ACCOUNT_ALREADY_EXISTS: "Konts jau eksistē" - ACCOUNT_DOES_NOT_EXIST: "Konts neeksistē" - MAIL_SERVER_ERROR: "Radās kļūda savienojoties ar serveri" - INVALID_INPUT_ARGUMENT: "Invalid input argument" - UNKNOWN_ERROR: "Nezināma kļūda" - STATIC: - BACK_LINK: "Pārlādēt" - DOMAIN_LIST_DESC: "Saraksts ar atļautajiem domēniem" - PHP_EXSTENSIONS_ERROR_DESC: "Nepieciešamie PHP extension nav pieejami jūsu PHP konfigurācijā!" - PHP_VERSION_ERROR_DESC: "Jūsus PHP versija (%VERSION%) ir zemāka nekā atļauts 5.3.0!" - NO_SCRIPT_TITLE: "JavaScript ir nepieciešams." - NO_SCRIPT_DESC: | - Jūsu pārlūkprogramma neatbalsta JavaScript. - Lūdzu ieslēdziet JavaScript atbalstu. - NO_COOKIE_TITLE: "Cookies atbalsts ir nepieciešams." - NO_COOKIE_DESC: | - Cookies atbalsts nav pieejams šai pārlūkprogrammai. - Lūdzu ieslēdziet Cookies atbalstu. - BAD_BROWSER_TITLE: "Jūsu pārlūkprogramma ir novecojusi." - BAD_BROWSER_DESC: | - Lai izmantotu pilnas šis aplikācijas iespējas, - lejupielādējat un uzinstalējas kādu no šīm pārlukprogrammām: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/nb_NO.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/nb_NO.yml deleted file mode 100755 index ea528954..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/nb_NO.yml +++ /dev/null @@ -1,712 +0,0 @@ -nb_NO: - LOGIN: - LABEL_EMAIL: "E-postadresse" - LABEL_LOGIN: "Logg inn" - LABEL_PASSWORD: "Passord" - LABEL_SIGN_ME: "Husk meg" - LABEL_VERIFICATION_CODE: "Bekreftelseskode" - LABEL_DONT_ASK_VERIFICATION_CODE: "Ikke be om kode før om to uker" - BUTTON_SIGN_IN: "Logg inn" - TITLE_SIGN_IN_GOOGLE: "Logg inn med Google" - TITLE_SIGN_IN_FACEBOOK: "Logg inn med Facebook" - TITLE_SIGN_IN_TWITTER: "Logg inn med Twitter" - LABEL_FORGOT_PASSWORD: "Glemt passord" - LABEL_REGISTRATION: "Registrering" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Legg til konto" - BUTTON_SETTINGS: "Innstillinger" - BUTTON_HELP: "Hjelp" - BUTTON_LOGOUT: "Logg ut" - MOBILE: - BUTTON_MOBILE_VERSION: "Mobilversjon" - BUTTON_DESKTOP_VERSION: "Skrivebordsversjon" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Søk" - TITLE_ADV: "Avansert søk" - LABEL_ADV_FROM: "Fra" - LABEL_ADV_TO: "Til" - LABEL_ADV_SUBJECT: "Emne" - LABEL_ADV_TEXT: "Tekst" - LABEL_ADV_HAS_ATTACHMENT: "Har vedlegg" - LABEL_ADV_HAS_ATTACHMENTS: "Har vedlegg" - LABEL_ADV_FLAGGED: "Stjernemerket" - LABEL_ADV_UNSEEN: "Ulest" - LABEL_ADV_DATE: "Dato" - LABEL_ADV_DATE_ALL: "Alle" - LABEL_ADV_DATE_3_DAYS: "Inntil 3 dager gamle" - LABEL_ADV_DATE_7_DAYS: "Inntil 1 uke gamle" - LABEL_ADV_DATE_MONTH: "Inntil 1 måned gamle" - LABEL_ADV_DATE_3_MONTHS: "Inntil 3 måneder gamle" - LABEL_ADV_DATE_6_MONTHS: "Inntil 6 måneder gamle" - LABEL_ADV_DATE_YEAR: "Inntil 1 år gamle" - BUTTON_ADV_SEARCH: "Søk" - PREVIEW_POPUP: - FULLSCREEN: "Toggle fullscreen" - ZOOM: "Zoom in/out" - CLOSE: "Lukk (Esc)" - LOADING: "Laster inn …" - GALLERY_PREV: "Forrige (venstre piltast)" - GALLERY_NEXT: "Neste (høyre piltast)" - GALLERY_COUNTER: "%curr% av %total%" - IMAGE_ERROR: "Klarte ikke å laste inn bilde." - AJAX_ERROR: "Klarte ikke å laste inn innhold." - FOLDER_LIST: - BUTTON_COMPOSE: "Skriv" - BUTTON_CONTACTS: "Kontakter" - BUTTON_NEW_MESSAGE: "Ny melding" - INBOX_NAME: "Innboks" - SENT_NAME: "Sendt" - DRAFTS_NAME: "Kladd" - SPAM_NAME: "Søppelpost" - TRASH_NAME: "Papirkurv" - ARCHIVE_NAME: "Arkiv" - QUOTA: - TITLE: "Kvote bruk" - MESSAGE_LIST: - BUTTON_RELOAD: "Hent nye meldinger" - BUTTON_MOVE_TO: "Flytt til" - BUTTON_DELETE: "Slett" - BUTTON_ARCHIVE: "Arkiv" - BUTTON_SPAM: "Søppelpost" - BUTTON_NOT_SPAM: "Ikke søppelpost" - BUTTON_EMPTY_FOLDER: "Tøm mappa for meldinger" - BUTTON_MULTY_FORWARD: "Videresend meldinger" - BUTTON_DELETE_WITHOUT_MOVE: "Slett permanent" - BUTTON_MORE: "Mer" - MENU_SET_SEEN: "Merk som lest" - MENU_SET_ALL_SEEN: "Merk alle som lest" - MENU_UNSET_SEEN: "Merk som ulest" - MENU_SET_FLAG: "Legg til stjerne" - MENU_UNSET_FLAG: "Fjern stjerne" - MENU_SELECT_ALL: "Alle" - MENU_SELECT_NONE: "Ingen" - MENU_SELECT_INVERT: "Inverter" - MENU_SELECT_UNSEEN: "Ulest" - MENU_SELECT_SEEN: "Lest" - MENU_SELECT_FLAGGED: "Stjernemerket" - MENU_SELECT_UNFLAGGED: "Ikke stjernemerket" - EMPTY_LIST: "Tom liste" - EMPTY_SEARCH_LIST: "Søket ga ingen treff." - SEARCH_RESULT_FOR: "Søketreff for «%SEARCH%»" - BACK_TO_MESSAGE_LIST: "tilbake til meldingsliste" - LIST_LOADING: "Laster inn" - EMPTY_SUBJECT_TEXT: "(uten emne)" - PUT_MESSAGE_HERE: "Dra en melding hit for å vise den i lista" - TODAY_AT: "i dag, %TIME%" - YESTERDAY_AT: "i går, %TIME%" - SEARCH_PLACEHOLDER: "Søk" - NEW_MESSAGE_NOTIFICATION: "Du har %count% nye meldinger" - QUOTA_SIZE: "Bruker %SIZE% ( %PROC%% ) av %LIMIT% " - MESSAGE: - BUTTON_EDIT: "Rediger" - BUTTON_BACK: "Tilbake" - BUTTON_CLOSE: "Lukk" - BUTTON_DELETE: "Slett" - BUTTON_UNSUBSCRIBE: "Meld av e-postliste" - BUTTON_ARCHIVE: "Arkiv" - BUTTON_SPAM: "Søppelpost" - BUTTON_NOT_SPAM: "Ikke søppelpost" - BUTTON_MOVE_TO: "Flytt til" - BUTTON_MORE: "Mer" - BUTTON_REPLY: "Svar" - BUTTON_REPLY_ALL: "Svar alle" - BUTTON_FORWARD: "Videresend" - BUTTON_FORWARD_AS_ATTACHMENT: "Videresend som vedlegg" - BUTTON_EDIT_AS_NEW: "Endre som ny" - BUTTON_SHOW_IMAGES: "Vis eksterne bilder" - BUTTON_NOTIFY_READ_RECEIPT: "Avsender har bedt om lesebekreftelse" - BUTTON_IN_NEW_WINDOW: "Vis i eget vindu" - BUTTON_THREAD_LIST: "Trådliste" - BUTTON_THREAD_PREV: "Forrige" - BUTTON_THREAD_NEXT: "Neste" - BUTTON_THREAD_MORE: "Flere meldinger" - MENU_HEADERS: "Vis meldingshoder" - MENU_VIEW_ORIGINAL: "Vis original" - MENU_DOWNLOAD_ORIGINAL: "Last ned som .eml-fil" - MENU_FILTER_SIMILAR: "Filtrer slike meldinger" - MENU_PRINT: "Skriv ut" - EMPTY_SUBJECT_TEXT: "(tomt emne)" - LABEL_SUBJECT: "Emne" - LABEL_DATE: "Dato" - LABEL_FROM: "Fra" - LABEL_FROM_SHORT: "fra" - LABEL_TO: "Til" - LABEL_TO_SHORT: "til" - LABEL_CC: "Kopi" - LABEL_BCC: "Blindkopi" - LABEL_REPLY_TO: "Svar til" - PRINT_LABEL_FROM: "Fra" - PRINT_LABEL_TO: "Til" - PRINT_LABEL_CC: "Kopi" - PRINT_LABEL_BCC: "Blindkopi" - PRINT_LABEL_REPLY_TO: "Svar til" - PRINT_LABEL_DATE: "Dato" - PRINT_LABEL_SUBJECT: "Emne" - PRINT_LABEL_ATTACHMENTS: "Vedlegg" - MESSAGE_LOADING: "Laster inn" - MESSAGE_VIEW_DESC: "Trykk på en melding for å lese den" - MESSAGE_VIEW_MOVE_DESC: "Trykk på mappenavn i panelet til venstre for å velge mål." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Passord" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP-signert melding (trykk for å bekrefte)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP-kryptert melding (trykk for å dekryptere)" - LINK_DOWNLOAD_AS_ZIP: "Last ned som zip-fil" - LINK_SAVE_TO_OWNCLOUD: "Lage i Owncloud" - LINK_SAVE_TO_CLOUD: "Lagre på nett" - LINK_SAVE_TO_DROPBOX: "Lagre i Dropbox" - READ_RECEIPT: - SUBJECT: "Lesebekreftelse (meldinga er lest) - %SUBJECT%" - BODY: | - Dette er en lesebekreftelse på e-postmeldinga du sendte til %READ-RECEIPT%. - - Merk: Denne bekreftelsen bekrefter bare at meldinga ble åpnet på mottakerens datamaskin, - og er ingen garanti for at mottakeren har lest, forstått eller er enig i innholdet. - SUGGESTIONS: - SEARCHING_DESC: "Søker …" - CONTACTS: - LEGEND_CONTACTS: "Kontakter" - SEARCH_INPUT_PLACEHOLDER: "Søk" - BUTTON_ADD_CONTACT: "Legg til kontakt" - BUTTON_CREATE_CONTACT: "Lag" - BUTTON_UPDATE_CONTACT: "Oppdater" - BUTTON_IMPORT: "Importer (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Eksporter (vcf, vCard)" - BUTTON_EXPORT_CSV: "Eksporter (csv)" - ERROR_IMPORT_FILE: "Feil ved importering (ugyldig filformat)" - LIST_LOADING: "Laster inn" - EMPTY_LIST: "Ingen kontakter" - EMPTY_SEARCH: "Fant ingen kontakter" - CLEAR_SEARCH: "Tøm søk" - CONTACT_VIEW_DESC: "Velg en kontakt i lista" - LABEL_DISPLAY_NAME: "Navn" - LABEL_EMAIL: "E-post" - LABEL_PHONE: "Telefon" - LABEL_WEB: "Nettside" - LABEL_BIRTHDAY: "Bursdag" - LINK_ADD_EMAIL: "Legg til e-postadresse" - LINK_ADD_PHONE: "Legg til telefon" - LINK_BIRTHDAY: "Bursdag" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Visningsnavn" - PLACEHOLDER_ENTER_LAST_NAME: "Etternavn" - PLACEHOLDER_ENTER_FIRST_NAME: "Fornavn" - PLACEHOLDER_ENTER_NICK_NAME: "Kallenavn" - LABEL_READ_ONLY: "Skrivebeskyttet" - LABEL_SHARE: "Del" - ADD_MENU_LABEL: "Legg til" - ADD_MENU_NICKNAME: "Kallenavn" - ADD_MENU_NOTES: "Notater" - ADD_MENU_EMAIL: "E-post" - ADD_MENU_PHONE: "Telefon" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Adresse" - ADD_MENU_BIRTHDAY: "Bursdag" - ADD_MENU_TAGS: "Tagger" - BUTTON_SHARE_NONE: "Ingen" - BUTTON_SHARE_ALL: "Alle" - BUTTON_SYNC: "Synkronisering (CardDAV)" - COMPOSE: - TITLE_FROM: "Fra" - TITLE_TO: "Til" - TITLE_CC: "Kopi" - TITLE_BCC: "Blindkopi" - TITLE_REPLY_TO: "Svar til" - TITLE_SUBJECT: "Emne" - LINK_SHOW_INPUTS: "Vis alle felt" - BUTTON_SEND: "Send" - BUTTON_SAVE: "Lagre" - BUTTON_DELETE: "Slett" - BUTTON_CANCEL: "Avbryt" - BUTTON_MINIMIZE: "Minimer" - SAVED_TIME: "Lagret %TIME%" - SAVED_ERROR_ON_SEND: "Meldinga er sendt, men ble ikke lagret i mappa for sendte elementer" - DISCARD_UNSAVED_DATA: "Vil du forkaste data som ikke er lagret?" - ATTACH_FILES: "Legg ved filer" - ATTACH_DROP_FILES_DESC: "Slipp filer her" - ATTACH_ITEM_CANCEL: "Avbryt" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Disk" - REPLY_MESSAGE_TITLE: "%EMAIL% skrev %DATETIME%" - FORWARD_MESSAGE_TOP_TITLE: "-------- Videresendt melding -------" - FORWARD_MESSAGE_TOP_FROM: "Fra" - FORWARD_MESSAGE_TOP_TO: "Til" - FORWARD_MESSAGE_TOP_CC: "Kopi" - FORWARD_MESSAGE_TOP_SENT: "Sendt" - FORWARD_MESSAGE_TOP_SUBJECT: "Emne" - EMPTY_TO_ERROR_DESC: "Velg minst én mottaker" - NO_ATTACHMENTS_HERE_DESC: "Ingen vedlegg." - ATTACHMENTS_ERROR_DESC: "Advarsel: ett eller flere vedlegg er ikke blitt lastet opp enda." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Ett eller flere vedlegg er ikke blitt lastet opp enda" - BUTTON_REQUEST_READ_RECEIPT: "Be om en bekreftelse fra mottaker på at meldinga er lest" - BUTTON_MARK_AS_IMPORTANT: "Marker som viktig" - BUTTON_OPEN_PGP: "OpenPGP (kun ren tekst)" - BUTTON_REQUEST_DSN: "Be om leveringsbekreftelse" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Lukk" - POPUPS_ASK: - BUTTON_YES: "Ja" - BUTTON_NO: "Nei" - DESC_WANT_CLOSE_THIS_WINDOW: "Er du sikker på at du vil lukke dette vinduet?" - DESC_WANT_DELETE_MESSAGES: "Er du sikker på at du vil slette meldingen(e)?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Velg språk" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Legg til konto" - BUTTON_ADD_ACCOUNT: "Legg til" - TITLE_UPDATE_ACCOUNT: "Oppdater konto" - BUTTON_UPDATE_ACCOUNT: "Oppdater" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Vil du legge til en identitet?" - TITLE_UPDATE_IDENTITY: "Oppdater identitet" - BUTTON_ADD_IDENTITY: "Legg til" - BUTTON_UPDATE_IDENTITY: "Oppdater" - LABEL_EMAIL: "E-post" - LABEL_NAME: "Navn" - LABEL_REPLY_TO: "Svar til" - LABEL_SIGNATURE: "Signatur" - LABEL_CC: "Kopi" - LABEL_BCC: "Blindkopi" - LABEL_SIGNATURE_INSERT_BEFORE: "Legg til denne signaturen før sitert tekst" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Vil du lage en mappe?" - LABEL_NAME: "Mappenavn" - LABEL_PARENT: "Forelder" - BUTTON_CREATE: "Lag" - BUTTON_CANCEL: "Avbryt" - BUTTON_CLOSE: "Lukk" - TITLE_CREATING_PROCESS: "Lager mappe" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Vil du slette alle meldinger som ligger i mappa?" - BUTTON_CLEAR: "Slett" - BUTTON_CANCEL: "Avbryt" - BUTTON_CLOSE: "Lukk" - DANGER_DESC_WARNING: "Advarsel!" - DANGER_DESC_HTML_1: "Du er i ferd med å slette alle meldinger i mappa %FOLDER%" - DANGER_DESC_HTML_2: "Hvis du går videre, blir meldingene slettet for godt." - TITLE_CLEARING_PROCESS: "Tømmer mappe …" - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Importer OpenPGP-nøkkel" - BUTTON_IMPORT_OPEN_PGP_KEY: "Importer" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Vis OpenPGP-nøkkel" - BUTTON_SELECT: "Velg" - BUTTON_CLOSE: "Lukk" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Lag OpenPGP-nøkler" - LABEL_EMAIL: "E-post" - LABEL_NAME: "Navn" - LABEL_PASSWORD: "Passord" - LABEL_KEY_BIT_LENGTH: "Nøkkellengde" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Lag" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "Signer/krypter med OpenPGP" - LABEL_SIGN: "Signer" - LABEL_ENCRYPT: "Krypter" - LABEL_PASSWORD: "Passord" - BUTTON_SIGN: "Signer" - BUTTON_ENCRYPT: "Krypter" - BUTTON_SIGN_AND_ENCRYPT: "Signer og krypter" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "Dekrypter med OpenPGP" - LABEL_KEY: "Privatnøkkel" - LABEL_PASSWORD: "Passord" - BUTTON_DECRYPT: "Dekrypter" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "To-stegs-bekreftelsestest" - LABEL_CODE: "Kode" - BUTTON_TEST: "Test" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Vil du lage et filter?" - TITLE_EDIT_FILTER: "Oppdater filter" - FILTER_NAME: "Navn" - LEGEND_CONDITIONS: "Betingelser" - LEGEND_ACTIONS: "Handlinger" - BUTTON_DONE: "Ferdig" - BUTTON_ADD_CONDITION: "Legg til betingelse" - SELECT_ACTION_NONE: "Ingen" - SELECT_ACTION_MOVE_TO: "Flytt til" - SELECT_ACTION_FORWARD_TO: "Videresend til" - SELECT_ACTION_REJECT: "Avvis" - SELECT_ACTION_VACATION_MESSAGE: "Feriemelding" - SELECT_ACTION_DISCARD: "Forkast" - SELECT_FIELD_FROM: "Fra" - SELECT_FIELD_RECIPIENTS: "Hoved- eller kopimottaker" - SELECT_FIELD_SUBJECT: "Emne" - SELECT_FIELD_HEADER: "Meldingshode" - SELECT_FIELD_SIZE: "Størrelse" - SELECT_TYPE_CONTAINS: "Inneholder" - SELECT_TYPE_NOT_CONTAINS: "Inneholder ikke" - SELECT_TYPE_MATCHES: "Samsvarer med («*» og «?» støttes)" - SELECT_TYPE_NOT_MATCHES: "Samsvarer ikke med («*» og «?» støttes)" - SELECT_TYPE_REGEXP: "Reg.uttrykk" - SELECT_TYPE_NOT_REGEXP: "Ikke reg.uttrykk" - SELECT_TYPE_EQUAL_TO: "Er lik" - SELECT_TYPE_NOT_EQUAL_TO: "Er ikke lik" - SELECT_TYPE_OVER: "Større enn" - SELECT_TYPE_UNDER: "Mindre enn" - SELECT_MATCH_ANY: "Samsvarer med én av følgende regler" - SELECT_MATCH_ALL: "Samsvarer med alle følgende regler" - MARK_AS_READ_LABEL: "Merk som lest" - REPLY_INTERVAL_LABEL: "Svar-intervall (dager)" - KEEP_LABEL: "Behold" - STOP_LABEL: "Ikke slutt å bruke regler" - EMAIL_LABEL: "E-post" - VACATION_SUBJECT_LABEL: "Emne (valgfritt)" - VACATION_MESSAGE_LABEL: "Melding" - VACATION_RECIPIENTS_LABEL: "Mottakere (adskilt med komma)" - REJECT_MESSAGE_LABEL: "Avvis melding" - ALL_INCOMING_MESSAGES_DESC: "Alle inngående meldinger" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Velg systemmapper" - SELECT_CHOOSE_ONE: "Velg" - SELECT_UNUSE_NAME: "Ikke bruk" - LABEL_SENT: "Sendt" - LABEL_DRAFTS: "Kladd" - LABEL_SPAM: "Søppelpost" - LABEL_TRASH: "Papirkurv" - LABEL_ARCHIVE: "Arkiv" - BUTTON_CANCEL: "Avbryt" - BUTTON_CLOSE: "Lukk" - NOTIFICATION_SENT: | - Du har ikke valgt «Sendt» som mappe for sendte meldinger. - Velg «Ikke bruk» hvis du ikke vil lagre sendte meldinger. - NOTIFICATION_DRAFTS: "Du har ikke valgt «Kladd» som mappe hvor meldinger lagres mens du skriver." - NOTIFICATION_SPAM: | - Du har ikke valgt «Søppelpost» som mappe for søppelpost. - Velg «Ikke bruk» hvis du vil slette slike meldinger for godt. - NOTIFICATION_TRASH: | - Du har ikke valgt «Papirkurv» som mappe for slettede meldinger. - Velg «Ikke bruk» hvis du vil slette slike meldinger for godt. - NOTIFICATION_ARCHIVE: "Du har ikke valgt «Arkiv» som mappe for arkiverte meldinger." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "To-stegsbekreftelse" - LABEL_ENABLE_TWO_FACTOR: "Slå på to-stegsbekreftelse" - LABEL_TWO_FACTOR_USER: "Bruker" - LABEL_TWO_FACTOR_STATUS: "Status" - LABEL_TWO_FACTOR_SECRET: "Secret" - LABEL_TWO_FACTOR_BACKUP_CODES: "Reservekoder" - BUTTON_CREATE: "Lag ny hemmelig kode" - BUTTON_ACTIVATE: "Slå på" - BUTTON_CLEAR: "Tøm" - BUTTON_LOGOUT: "Logg ut" - BUTTON_DONE: "Ferdig" - BUTTON_TEST: "Test" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Vis hemmelig kode" - BUTTON_HIDE_SECRET: "Skjul hemmelig kode" - TWO_FACTOR_REQUIRE_DESC: "Denne kontoen krever to-stegsbekreftelse." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Satt opp" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Ikke satt opp" - TWO_FACTOR_SECRET_DESC: >- - Importer denne informasjonen til din Google Authenticator klient (eller andre - klienter) ved å bruke QR-koden under, eller ved å skrive inn koden manuelt. - TWO_FACTOR_BACKUP_CODES_DESC: >- - Hvis du ikke mottar koder fra Google Authenticator, kan du bruke reservekodene - for å logge inn. Disse kodene kan bare brukes én gang. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Du kan ikke endre denne innstillinga før du tester den." - TITLES: - LOADING: "Laster inn" - LOGIN: "Logg inn" - MAILBOX: "E-post" - SETTINGS: "Innstillinger" - COMPOSE: "Skriv" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Fila er for stor" - ERROR_FILE_PARTIALLY_UPLOADED: "Fila ble delvis lastet opp på grunn av ukjent feil" - ERROR_NO_FILE_UPLOADED: "Ingen fil lastet opp" - ERROR_MISSING_TEMP_FOLDER: "Midlertidig fil mangler" - ERROR_ON_SAVING_FILE: "Det oppstod en ukjent feil under opplasting av fil" - ERROR_FILE_TYPE: "Ugyldig filtype" - ERROR_UNKNOWN: "Det oppstod en ukjent feil under opplasting av fil" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEKST" - TEXT_SWITCHER_RICH_FORMATTING: "Rik tekst" - TEXT_SWITCHER_CONFIRM: "Tekstformatering og bilder går tapt. Er du sikker på at du vil fortsette?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Personlig" - LABEL_GENERAL_NAME: "Generelt" - LABEL_CONTACTS_NAME: "Kontakter" - LABEL_FOLDERS_NAME: "Mapper" - LABEL_ACCOUNTS_NAME: "Kontoer" - LABEL_IDENTITY_NAME: "Identitet" - LABEL_IDENTITIES_NAME: "Identiteter" - LABEL_FILTERS_NAME: "Filters" - LABEL_TEMPLATES_NAME: "Maler" - LABEL_SECURITY_NAME: "Sikkerhet" - LABEL_SOCIAL_NAME: "Sosialt" - LABEL_THEMES_NAME: "Tema" - LABEL_CHANGE_PASSWORD_NAME: "Passord" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Tilbake" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filtre" - BUTTON_SAVE: "Lagre" - BUTTON_ADD_FILTER: "Legg til et filter" - BUTTON_DELETE: "Slett" - BUTTON_RAW_SCRIPT: "Bruk selvvalgt skript" - SUBNAME_NONE: "Ingen" - SUBNAME_MOVE_TO: "Flytt til «%FOLDER%»" - SUBNAME_FORWARD_TO: "Videresend til «%EMAIL%»" - SUBNAME_REJECT: "Avvis" - SUBNAME_VACATION_MESSAGE: "Feriemelding" - SUBNAME_DISCARD: "Forkast" - CAPABILITY_LABEL: "Evne" - LOADING_PROCESS: "Oppdater filterliste" - DELETING_ASK: "Er du sikker?" - CHACHES_NEED_TO_BE_SAVED_DESC: "Disse endringene må lagres på tjeneren." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identitet" - LABEL_DISPLAY_NAME: "Navn" - LABEL_REPLY_TO: "Svar til" - LABEL_SIGNATURE: "Signatur" - LABEL_ADD_SIGNATURE_TO_ALL: "Vil du legge til signatur i alle utgående meldinger?" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Sikkerhet" - LABEL_CONFIGURE_TWO_FACTOR: "Sett opp to-stegsbekreftelse" - LABEL_AUTOLOGOUT: "Logg ut automatisk etter" - AUTOLOGIN_NEVER_OPTION_NAME: "Aldri" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minutt(er)" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% time(r)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Generelt" - LABEL_LANGUAGE: "Språk" - LABEL_IDENTITY: "Identitet" - LABEL_LAYOUT: "Utforming" - LABEL_LAYOUT_NO_SPLIT: "Ingen deling" - LABEL_LAYOUT_VERTICAL_SPLIT: "Vertikal deling" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horisontal deling" - LABEL_EDITOR: "Standard tekstbehandler" - LABEL_EDITOR_HTML: "Html" - LABEL_EDITOR_PLAIN: "Ren tekst" - LABEL_EDITOR_HTML_FORCED: "Html (tvungen)" - LABEL_EDITOR_PLAIN_FORCED: "Ren tekst (tvungen)" - LABEL_ANIMATION: "Animasjon av grensesnitt" - LABEL_ANIMATION_FULL: "Fullstendig" - LABEL_ANIMATION_NORMAL: "Normal" - LABEL_ANIMATION_NONE: "Ingen" - LABEL_VIEW_OPTIONS: "Vis valg" - LABEL_USE_PREVIEW_PANE: "Bruk forhåndsvisningsrute" - LABEL_USE_CHECKBOXES_IN_LIST: "Vis avkrysningsbokser i liste" - LABEL_USE_THREADS: "Bruk tråder" - LABEL_REPLY_SAME_FOLDER: "Legg svar i samme mappe som opprinnelig melding" - LABEL_SHOW_IMAGES: "Vis alltid eksterne bilder i meldingstekst" - LABEL_SHOW_ANIMATION: "Vis animasjon" - LABEL_MESSAGE_PER_PAGE: "Meldinger per side" - LABEL_NOTIFICATIONS: "Varsler" - LABEL_SOUND_NOTIFICATION: "Lydvarsel" - LABEL_CHROME_NOTIFICATION_DESC: "Vis sprettopp-varsel om nye meldinger" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Blokkert av nettleser)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Kontakter" - LABEL_CONTACTS_AUTOSAVE: "Legg til mottakere i adresseboka automatisk" - LEGEND_CONTACTS_SYNC: "Fjernstyrt synkronisering (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Slå på fjernstyrt synkronisering" - LABEL_CONTACTS_SYNC_SERVER: "Tjener" - LABEL_CONTACTS_SYNC_AB_URL: "Nettadresse til adressebok" - LABEL_CONTACTS_SYNC_USER: "Bruker" - LABEL_CONTACTS_SYNC_PASSWORD: "Passord" - SETTINGS_THEMES: - LEGEND_THEMES: "Tema" - LEGEND_THEMES_CUSTOM: "Selvvalgt tema" - LABEL_CUSTOM_TYPE: "Type" - LABEL_CUSTOM_TYPE_LIGHT: "Lys" - LABEL_CUSTOM_TYPE_DARK: "Mørk" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Bakgrunn" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Last opp bakgrunnsbilde (.jpg eller .png)" - ERROR_FILE_IS_TOO_BIG: "Fila er for stor (1mb +)" - ERROR_FILE_TYPE_ERROR: "Ugyldig filtype (bruk .jpg eller .png)" - ERROR_UNKNOWN: "Det oppstod en ukjent feil under opplasting av fil" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Koble til Google" - BUTTON_GOOGLE_DISCONNECT: "Koble fra Google" - MAIN_GOOGLE_DESC: "Når du har slått på innlogging via Google kan du logge inn på denne kontoen ved å bruke Google-knappen på innloggingsskjermen." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Koble til Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Koble fra Facebook" - MAIN_FACEBOOK_DESC: "Når du har slått på innlogging via Facebook kan du logge inn på denne kontoen ved å bruke Facebook-knappen på innloggingsskjermen." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Koble til Twitter" - BUTTON_TWITTER_DISCONNECT: "Koble fra Twitter" - MAIN_TWITTER_DESC: "Når du har slått på innlogging via Twitter kan du logge inn på denne kontoen ved å bruke Twitter-knappen på innloggingsskjermen." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Mappeliste" - BUTTON_CREATE: "Lag mappe" - BUTTON_SYSTEM: "Systemmapper" - BUTTON_DELETE: "Slett" - BUTTON_SUBSCRIBE: "Abonner" - BUTTON_UNSUBSCRIBE: "Stopp abonnement" - LOADING_PROCESS: "Oppdaterer mappeliste" - CREATING_PROCESS: "Lager mappe" - DELETING_PROCESS: "Sletter mappe" - RENAMING_PROCESS: "Endrer navn på mappe" - DELETING_ASK: "Er du sikker?" - TO_MANY_FOLDERS_DESC_1: "Du har for mange mapper!" - TO_MANY_FOLDERS_DESC_2: "For å unngå ytelsesproblemer får du bare se noen av dem." - HELP_DELETE_FOLDER: "Slett mappe" - HELP_SHOW_HIDE_FOLDER: "Vis/skjul mappe" - HELP_CHECK_FOR_NEW_MESSAGES: "Se/ikke se etter nye meldinger" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Kontoer" - LEGEND_IDENTITIES: "Identiteter" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Kontoer og identiteter" - BUTTON_ADD_ACCOUNT: "Legg til konto" - BUTTON_ADD_IDENTITY: "Legg til identitet" - BUTTON_DELETE: "Slett" - LOADING_PROCESS: "Oppdaterer …" - DELETING_ASK: "Er du sikker?" - DEFAULT_IDENTITY_LABEL: "Standard" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identitet" - LEGEND_IDENTITIES: "Identiteter" - LABEL_DEFAULT: "Standard" - LABEL_DISPLAY_NAME: "Navn" - LABEL_REPLY_TO: "Svar til" - LABEL_SIGNATURE: "Signatur" - LABEL_ADD_SIGNATURE_TO_ALL: "Legg til signatur i alle utgående meldinger" - BUTTON_ADD_IDENTITY: "Legg til identitet" - BUTTON_DELETE: "Slett" - LOADING_PROCESS: "Oppdaterer identiteter" - DELETING_ASK: "Er du sikker?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Endre passord" - LABEL_CURRENT_PASSWORD: "Gjeldende passord" - LABEL_NEW_PASSWORD: "Nytt passord" - LABEL_REPEAT_PASSWORD: "Gjenta passordet" - BUTTON_UPDATE_PASSWORD: "Oppdater passord" - ERROR_PASSWORD_MISMATCH: "Passordene stemmer ikke overens. Prøv på nytt" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Importer OpenPGP-nøkkel" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Lag OpenPGP-nøkler" - TITLE_PRIVATE: "Privat" - TITLE_PUBLIC: "Offentlig" - DELETING_ASK: "Er du sikker?" - GENERATE_ONLY_HTTPS: "Kun HTTPS" - LABEL_ALLOW_DRAFT_AUTOSAVE: "Lagre utkast automatisk" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Tastatursnarveier" - TAB_MAILBOX: "Innboks" - TAB_MESSAGE_LIST: "Meldingsliste" - TAB_MESSAGE_VIEW: "Meldingsvisning" - TAB_COMPOSE: "Skriv ny melding" - LABEL_OPEN_USER_DROPDOWN: "Åpne brukerliste" - LABEL_REPLY: "Svar" - LABEL_REPLY_ALL: "Svar alle" - LABEL_FORWARD: "Videresend" - LABEL_FORWARD_MULTIPLY: "Videresend som vedlegg" - LABEL_HELP: "Hjelp" - LABEL_CHECK_ALL: "Merk alle meldinger" - LABEL_ARCHIVE: "Arkiver" - LABEL_DELETE: "Slett" - LABEL_OPEN_THREAD: "Åpne valgt tråd" - LABEL_MOVE: "Flytt" - LABEL_READ: "Merk som lest" - LABEL_UNREAD: "Merk som ulest" - LABEL_IMPORTANT: "Merk valgte meldinger med stjerne" - LABEL_SEARCH: "Søk" - LABEL_CANCEL_SEARCH: "Avbryt søk" - LABEL_FULLSCREEN_ENTER: "Fullskjerm" - LABEL_VIEW_MESSAGE_ENTER: "Vis melding" - LABEL_SWITCH_TO_MESSAGE: "Flytt fokus til valgt melding" - LABEL_SWITCH_TO_FOLDER_LIST: "Flytt fokus til mappeliste" - LABEL_FULLSCREEN_TOGGLE: "Fullskjerm-modus" - LABEL_BLOCKQUOTES_TOGGLE: "Vis/skjul sitert melding" - LABEL_THREAD_NEXT: "Neste melding i tråd" - LABEL_THREAD_PREV: "Forrige melding i tråd" - LABEL_PRINT: "Skriv ut" - LABEL_EXIT_FULLSCREEN: "Avslutt fullskjerm-modus" - LABEL_CLOSE_MESSAGE: "Lukk melding" - LABEL_SWITCH_TO_LIST: "Flytt fokus til meldingsliste" - LABEL_OPEN_COMPOSE_POPUP: "Ny melding i popup" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Åpne identitetsliste" - LABEL_SAVE_MESSAGE: "Lagre melding" - LABEL_SEND_MESSAGE: "Send melding" - LABEL_CLOSE_COMPOSE: "Lukk ny melding" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "Fant ingen offentlige nøkler" - NO_PUBLIC_KEYS_FOUND_FOR: "Fant ingen offentlige nøkler for «%EMAIL%»" - NO_PRIVATE_KEY_FOUND: "Fant ingen privatnøkler" - NO_PRIVATE_KEY_FOUND_FOR: "Fant ingen privatnøkler for «%EMAIL%»" - ADD_A_PUBLICK_KEY: "Legg til en offentlig nøkkel" - SELECT_A_PRIVATE_KEY: "Velg privatnøkkel" - UNVERIFIRED_SIGNATURE: "Ubekreftet signatur" - DECRYPTION_ERROR: "Feil under OpenPGP-dekryptering" - GOOD_SIGNATURE: "Gyldig signatur fra %USER%" - PGP_ERROR: "OpenPGP-feil: %ERROR%" - SPECIFY_FROM_EMAIL: "Velg avsender-adresse" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Velg minst én mottaker" - NOTIFICATIONS: - INVALID_TOKEN: "Ugyldig info" - AUTH_ERROR: "Autentisering mislyktes" - ACCESS_ERROR: "Tilgangsfeil" - CONNECTION_ERROR: "Klarte ikke å koble til tjeneren" - CAPTCHA_ERROR: "Feil CAPTCHA" - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Denne kontoen er ikke knyttet til en e-postadresse ennå. Logg inn med e-postadresse - og passord, og slå på denne funksjonen i kontoinnstillingene. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Denne kontoen er ikke knyttet til en e-postadresse ennå. Logg inn med e-postadresse - og passord, og slå på denne funksjonen i kontoinnstillingene. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Denne kontoen er ikke knyttet til en e-postadresse ennå. Logg inn med e-postadresse - og passord, og slå på denne funksjonen i kontoinnstillingene. - DOMAIN_NOT_ALLOWED: "Dette domenet tillates ikke" - ACCOUNT_NOT_ALLOWED: "Denne kontoen tillates ikke" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "To-stegsbekreftelse kreves" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "To-stegsbekreftelse mislyktes" - COULD_NOT_SAVE_NEW_PASSWORD: "Klarte ikke å lagre nytt passord" - CURRENT_PASSWORD_INCORRECT: "Gjeldende passord er feil" - NEW_PASSWORD_SHORT: "Passordet er for kort" - NEW_PASSWORD_WEAK: "Passordet er for svakt" - NEW_PASSWORD_FORBIDDENT: "Passordet inneholder ugyldige tegn" - CONTACTS_SYNC_ERROR: "Synkronisering av kontakter mislyktes" - CANT_GET_MESSAGE_LIST: "Klarte ikke å hente liste over meldinger" - CANT_GET_MESSAGE: "Klarte ikke å hente melding" - CANT_DELETE_MESSAGE: "Klarte ikke å slette melding" - CANT_MOVE_MESSAGE: "Klarte ikke å flytte melding" - CANT_SAVE_MESSAGE: "Klarte ikke å lagre melding" - CANT_SEND_MESSAGE: "Klarte ikke å sende melding" - INVALID_RECIPIENTS: "Ugyldige mottakere" - CANT_SAVE_FILTERS: "Klarte ikke å lagre filtre" - CANT_GET_FILTERS: "Klarte ikke å hente filtre" - FILTERS_ARE_NOT_CORRECT: "Feilutformet filter" - CANT_CREATE_FOLDER: "Klarte ikke å lage mappe" - CANT_RENAME_FOLDER: "Klarte ikke å endre navn på mappe" - CANT_DELETE_FOLDER: "Klarte ikke å slette mappe" - CANT_DELETE_NON_EMPTY_FOLDER: "Klarte ikke å slette mappe med innhold" - CANT_SUBSCRIBE_FOLDER: "Klarte ikke å abonnere på mappe" - CANT_UNSUBSCRIBE_FOLDER: "Klarte ikke å avslutte abonnement" - CANT_SAVE_SETTINGS: "Klarte ikke å lagre innstillinger" - CANT_SAVE_PLUGIN_SETTINGS: "Klarte ikke å lagre innstillinger" - DOMAIN_ALREADY_EXISTS: "Domenet finnes allerede" - CANT_INSTALL_PACKAGE: "Klarte ikke å installere pakke" - CANT_DELETE_PACKAGE: "Klarte ikke å fjerne pakken" - INVALID_PLUGIN_PACKAGE: "Ugyldig tilleggspakke" - UNSUPPORTED_PLUGIN_PACKAGE: "Denne illeggspakka støttes ikke" - LICENSING_SERVER_IS_UNAVAILABLE: "Abonnementstjeneren er utilgjengelig" - LICENSING_DOMAIN_EXPIRED: "Abonnementet på dette domenet er utløpt." - LICENSING_DOMAIN_BANNED: "Abonnementet på dette domenet er forbudt." - DEMO_SEND_MESSAGE_ERROR: "Denne demo-kontoen er blokkert fra å sende meldinger til eksterne e-postadresser av sikkerhetshensyn." - DEMO_ACCOUNT_ERROR: "Av sikkerhetshensyn er denne kontoen blokkert fra å utføre denne handlinga." - ACCOUNT_ALREADY_EXISTS: "Kontoen finnes allerede" - ACCOUNT_DOES_NOT_EXIST: "Kontoen finnes ikke" - MAIL_SERVER_ERROR: "Fikk ikke tilgang til e-posttjener" - INVALID_INPUT_ARGUMENT: "Ugyldig inndata-argument" - UNKNOWN_ERROR: "Ukjent feil" - STATIC: - BACK_LINK: "Oppdater" - DOMAIN_LIST_DESC: "Liste over domener som dette webmail-programmet kan få tilgang til" - PHP_EXSTENSIONS_ERROR_DESC: "PHP-oppsettet ditt mangler en PHP-utvidelse." - PHP_VERSION_ERROR_DESC: "PHP-installasjonen din (%VERSION%) er eldre enn versjon 5.3.0" - NO_SCRIPT_TITLE: "Dette programmet krever Javascript." - NO_SCRIPT_DESC: | - Nettleseren din støtter ikke Javascript. - Slå på Javascript-støtte i nettleserens innstillinger, og prøv på nytt. - NO_COOKIE_TITLE: "Dette programmet krever støtte for informasjonskapsler («cookies»)." - NO_COOKIE_DESC: | - Nettleseren din støtter ikke bruk av informasjonskapsler («cookies»). - Slå på cookie-støtte i nettleserens innstillinger, og prøv på nytt. - BAD_BROWSER_TITLE: "Nettleseren din er utdatert." - BAD_BROWSER_DESC: | - Hvis du vil bruke alle funksjonene i programmet, - må du laste ned og installere en av disse nettleserne: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/nl_NL.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/nl_NL.yml deleted file mode 100755 index 61298ec5..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/nl_NL.yml +++ /dev/null @@ -1,714 +0,0 @@ -nl_NL: - LOGIN: - LABEL_EMAIL: "E-mail" - LABEL_LOGIN: "Inlognaam" - LABEL_PASSWORD: "Wachtwoord" - LABEL_SIGN_ME: "Aangemeld blijven" - LABEL_VERIFICATION_CODE: "Verificatie Code" - LABEL_DONT_ASK_VERIFICATION_CODE: "Vraag 2 weken niet naar code" - BUTTON_SIGN_IN: "Aanmelden" - TITLE_SIGN_IN_GOOGLE: "Aanmelden met Google" - TITLE_SIGN_IN_FACEBOOK: "Aanmelden met Facebook" - TITLE_SIGN_IN_TWITTER: "Aanmelden met Twitter" - LABEL_FORGOT_PASSWORD: "Wachtwoord vergeten" - LABEL_REGISTRATION: "Registratie" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Account toevoegen" - BUTTON_SETTINGS: "Instellingen" - BUTTON_HELP: "Help" - BUTTON_LOGOUT: "Afmelden" - MOBILE: - BUTTON_MOBILE_VERSION: "Mobiele versie" - BUTTON_DESKTOP_VERSION: "Desktop versie" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Zoeken" - TITLE_ADV: "Geavanceerd zoeken" - LABEL_ADV_FROM: "Van" - LABEL_ADV_TO: "Naar" - LABEL_ADV_SUBJECT: "Onderwerp" - LABEL_ADV_TEXT: "Tekst" - LABEL_ADV_HAS_ATTACHMENT: "Heeft bijlage" - LABEL_ADV_HAS_ATTACHMENTS: "Heeft bijlages" - LABEL_ADV_FLAGGED: "Gemarkeerd" - LABEL_ADV_UNSEEN: "Ongelezen" - LABEL_ADV_DATE: "Datum" - LABEL_ADV_DATE_ALL: "Alles" - LABEL_ADV_DATE_3_DAYS: "Tot 3 dagen oud" - LABEL_ADV_DATE_7_DAYS: "Tot 1 week oud" - LABEL_ADV_DATE_MONTH: "Tot 1 maand oud" - LABEL_ADV_DATE_3_MONTHS: "Tot 3 maanden oud" - LABEL_ADV_DATE_6_MONTHS: "Tot 6 maanden oud" - LABEL_ADV_DATE_YEAR: "Tot 1 jaar oud" - BUTTON_ADV_SEARCH: "Zoeken" - PREVIEW_POPUP: - FULLSCREEN: "Schakel volledig scherm in/uit" - ZOOM: "Zoom in/uit" - CLOSE: "Sluiten (Esc)" - LOADING: "Ophalen..." - GALLERY_PREV: "Vorige (Linker Pijl toets)" - GALLERY_NEXT: "Volgende (Rechter Pijl toets)" - GALLERY_COUNTER: "%curr% van %total%" - IMAGE_ERROR: "De afbeelding kan niet worden geladen" - AJAX_ERROR: "De inhoud kan niet worden geladen" - FOLDER_LIST: - BUTTON_COMPOSE: "Nieuw bericht" - BUTTON_CONTACTS: "Contactpersonen" - BUTTON_NEW_MESSAGE: "Nieuw bericht" - INBOX_NAME: "Postvak IN" - SENT_NAME: "Verzonden items" - DRAFTS_NAME: "Concepten" - SPAM_NAME: "Ongewenste e-mail" - TRASH_NAME: "Verwijderde items" - ARCHIVE_NAME: "Archief" - QUOTA: - TITLE: "Quota gebruik" - MESSAGE_LIST: - BUTTON_RELOAD: "Berichten controleren" - BUTTON_MOVE_TO: "Verplaatsen" - BUTTON_DELETE: "Verwijderen" - BUTTON_ARCHIVE: "Archiveren" - BUTTON_SPAM: "Ongewenste e-mail" - BUTTON_NOT_SPAM: "Geen ongewenste e-mail" - BUTTON_EMPTY_FOLDER: "Map leegmaken" - BUTTON_MULTY_FORWARD: "Doorsturen als bijlage(n)" - BUTTON_DELETE_WITHOUT_MOVE: "Permanent verwijderen" - BUTTON_MORE: "Meer" - MENU_SET_SEEN: "Markeer als gelezen" - MENU_SET_ALL_SEEN: "Markeer alles als gelezen" - MENU_UNSET_SEEN: "Markeer als ongelezen" - MENU_SET_FLAG: "Vlag" - MENU_UNSET_FLAG: "Vlag verwijderen" - MENU_SELECT_ALL: "Alle" - MENU_SELECT_NONE: "Geen" - MENU_SELECT_INVERT: "Selectie omkeren" - MENU_SELECT_UNSEEN: "Ongelezen" - MENU_SELECT_SEEN: "Gelezen" - MENU_SELECT_FLAGGED: "Met Vlag" - MENU_SELECT_UNFLAGGED: "Zonder Vlag" - EMPTY_LIST: "Geen berichten" - EMPTY_SEARCH_LIST: "Geen items gevonden" - SEARCH_RESULT_FOR: "Zoekresultaten voor\"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "terug naar berichtenlijst" - LIST_LOADING: "Ophalen..." - EMPTY_SUBJECT_TEXT: "(Geen onderwerp)" - PUT_MESSAGE_HERE: "Sleep bericht hier om ze te bekijken in de lijst" - TODAY_AT: "vandaag om %TIME%" - YESTERDAY_AT: "gisteren om %TIME%" - SEARCH_PLACEHOLDER: "Zoeken" - NEW_MESSAGE_NOTIFICATION: "U heeft %COUNT% nieuwe berichten!" - QUOTA_SIZE: "U gebruikt %SIZE% (%PROC%%) van %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Aanpassen" - BUTTON_BACK: "Terug" - BUTTON_CLOSE: "Sluiten" - BUTTON_DELETE: "Verwijderen" - BUTTON_UNSUBSCRIBE: "Abonnement op deze e-mail lijst opzeggen" - BUTTON_ARCHIVE: "Archiveren" - BUTTON_SPAM: "Ongewenste e-mail" - BUTTON_NOT_SPAM: "Geen ongewenste e-mail" - BUTTON_MOVE_TO: "Verplaatsen" - BUTTON_MORE: "Meer" - BUTTON_REPLY: "Beantwoorden" - BUTTON_REPLY_ALL: "Allen beantwoorden" - BUTTON_FORWARD: "Doorsturen" - BUTTON_FORWARD_AS_ATTACHMENT: "Doorsturen als bijlage" - BUTTON_EDIT_AS_NEW: "Bewerken om opnieuw te verzenden" - BUTTON_SHOW_IMAGES: "Toon afbeeldingen" - BUTTON_NOTIFY_READ_RECEIPT: "De afzender heeft om een leesbevestiging gevraagd" - BUTTON_IN_NEW_WINDOW: "Toon in nieuw venster" - BUTTON_THREAD_LIST: "Groep lijst" - BUTTON_THREAD_PREV: "Vorige" - BUTTON_THREAD_NEXT: "Volgende" - BUTTON_THREAD_MORE: "Meer berichten" - MENU_HEADERS: "Toon berichtkoppen" - MENU_VIEW_ORIGINAL: "Toon origineel" - MENU_DOWNLOAD_ORIGINAL: "Download als .eml bestand" - MENU_FILTER_SIMILAR: "Filter gelijksoortige berichten" - MENU_PRINT: "Afdrukken" - EMPTY_SUBJECT_TEXT: "(Geen onderwerp)" - LABEL_SUBJECT: "Onderwerp" - LABEL_DATE: "Datum" - LABEL_FROM: "Van" - LABEL_FROM_SHORT: "van" - LABEL_TO: "Naar" - LABEL_TO_SHORT: "naar" - LABEL_CC: "CC" - LABEL_BCC: "BCC" - LABEL_REPLY_TO: "Antwoordadres" - PRINT_LABEL_FROM: "Van" - PRINT_LABEL_TO: "Naar" - PRINT_LABEL_CC: "CC" - PRINT_LABEL_BCC: "BCC" - PRINT_LABEL_REPLY_TO: "Antwoordadres" - PRINT_LABEL_DATE: "Datum" - PRINT_LABEL_SUBJECT: "Onderwerp" - PRINT_LABEL_ATTACHMENTS: "Bijlagen" - MESSAGE_LOADING: "Bericht ophalen" - MESSAGE_VIEW_DESC: "Selecteer een bericht in de lijst om hier te bekijken" - MESSAGE_VIEW_MOVE_DESC: "Klik op de doel map in het linker paneel." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Wachtwoord" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP ondertekend bericht (klik om te verifiëren)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP versleuteld bericht (klik om te ontsleutelen)" - LINK_DOWNLOAD_AS_ZIP: "Download als zip" - LINK_SAVE_TO_OWNCLOUD: "Sla op in ownCloud" - LINK_SAVE_TO_DROPBOX: "Sla op in Dropbox" - READ_RECEIPT: - SUBJECT: "Ontvangstbevestiging (weergegeven) - %SUBJECT%" - BODY: | - Dit is een bevestiging dat uw bericht aan %READ-RECEIPT% is ontvangen. - - Let op: Deze ontvangstbevestiging bevestigd slechts dat uw bericht was weergegeven op het scherm van de ontvanger. - Er is geen enkele garantie dat uw bericht is gelezen of begrepen. - SUGGESTIONS: - SEARCHING_DESC: "Zoeken..." - CONTACTS: - LEGEND_CONTACTS: "Contactpersonen" - SEARCH_INPUT_PLACEHOLDER: "Zoeken" - BUTTON_ADD_CONTACT: "Contactpersoon Toevoegen" - BUTTON_CREATE_CONTACT: "Toevoegen" - BUTTON_UPDATE_CONTACT: "Bijwerken" - BUTTON_IMPORT: "Importeer (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Exporteer (vcf, vCard)" - BUTTON_EXPORT_CSV: "Exporteer (csv)" - ERROR_IMPORT_FILE: "Fout bij importeren (ongeldige bestandsindeling)" - LIST_LOADING: "Ophalen..." - EMPTY_LIST: "Geen contactpersonen" - EMPTY_SEARCH: "Geen items gevonden" - CLEAR_SEARCH: "Wis zoekopdracht" - CONTACT_VIEW_DESC: "Selecteer een contactpersoon in de lijst om hier te bekijken" - LABEL_DISPLAY_NAME: "Weergeven als" - LABEL_EMAIL: "E-mail adres" - LABEL_PHONE: "Telefoon" - LABEL_WEB: "Web" - LABEL_BIRTHDAY: "Geboortedatum" - LINK_ADD_EMAIL: "E-mail adres toevoegen" - LINK_ADD_PHONE: "Telefoonnummer toevoegen" - LINK_BIRTHDAY: "Geboortedatum" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Weergeven als" - PLACEHOLDER_ENTER_LAST_NAME: "Achternaam" - PLACEHOLDER_ENTER_FIRST_NAME: "Voornaam" - PLACEHOLDER_ENTER_NICK_NAME: "Bijnaam" - LABEL_READ_ONLY: "Alleen lezen" - LABEL_SHARE: "Deel" - ADD_MENU_LABEL: "Toevoegen" - ADD_MENU_NICKNAME: "Bijnaam" - ADD_MENU_NOTES: "Notities" - ADD_MENU_EMAIL: "E-mail adres" - ADD_MENU_PHONE: "Telefoonnummer" - ADD_MENU_URL: "Webpagina" - ADD_MENU_ADDRESS: "Adres" - ADD_MENU_BIRTHDAY: "Geboortedatum" - ADD_MENU_TAGS: "Labels" - BUTTON_SHARE_NONE: "Niemand" - BUTTON_SHARE_ALL: "Iedereen" - BUTTON_SYNC: "Synchroniseren (CardDAV)" - COMPOSE: - TITLE_FROM: "Van" - TITLE_TO: "Naar" - TITLE_CC: "CC" - TITLE_BCC: "BCC" - TITLE_REPLY_TO: "Antwoordadres" - TITLE_SUBJECT: "Onderwerp" - LINK_SHOW_INPUTS: "Toon alle velden" - BUTTON_SEND: "Verzenden" - BUTTON_SAVE: "Concept opslaan" - BUTTON_DELETE: "Verwijder" - BUTTON_CANCEL: "Annuleer" - BUTTON_MINIMIZE: "Minimaliseer" - SAVED_TIME: "Bewaard op %TIME%" - SAVED_ERROR_ON_SEND: "Bericht is verzonden maar niet bewaard in de VERZONDEN map" - DISCARD_UNSAVED_DATA: "Niet opgeslagen gegevens verwijderen?" - ATTACH_FILES: "Bestand(en) toevoegen" - ATTACH_DROP_FILES_DESC: "Sleep bestanden naar hier" - ATTACH_ITEM_CANCEL: "Annuleer" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%EMAIL% schreef op %DATETIME%" - FORWARD_MESSAGE_TOP_TITLE: "-------- Doorgestuurd bericht -------" - FORWARD_MESSAGE_TOP_FROM: "Van" - FORWARD_MESSAGE_TOP_TO: "Naar" - FORWARD_MESSAGE_TOP_CC: "CC" - FORWARD_MESSAGE_TOP_SENT: "Verzonden" - FORWARD_MESSAGE_TOP_SUBJECT: "Onderwerp" - EMPTY_TO_ERROR_DESC: "Kies ten minste één ontvanger voordat u het bericht verstuurd" - NO_ATTACHMENTS_HERE_DESC: "Er zijn geen bijlagen" - ATTACHMENTS_ERROR_DESC: "Waarschuwing! Nog niet alle bijlagen zijn klaar met uploaden" - ATTACHMENTS_UPLOAD_ERROR_DESC: "Toevoegen van bijlage(n) is nog niet gereed" - BUTTON_REQUEST_READ_RECEIPT: "Leesbevestiging vragen" - BUTTON_MARK_AS_IMPORTANT: "Marker als belangrijk" - BUTTON_OPEN_PGP: "OpenPGP (allen bij Platte Tekst)" - BUTTON_REQUEST_DSN: "Ontvangstbevestiging vragen" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Close" - POPUPS_ASK: - BUTTON_YES: "Ja" - BUTTON_NO: "Nee" - DESC_WANT_CLOSE_THIS_WINDOW: "Weet u zeker dat u dit venster wilt sluiten?" - DESC_WANT_DELETE_MESSAGES: "Weet u zeker dat u dit/deze bericht/berichten wilt verwijderen?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Kies uw taal" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Account toevoegen?" - BUTTON_ADD_ACCOUNT: "Toevoegen" - TITLE_UPDATE_ACCOUNT: "Account updaten?" - BUTTON_UPDATE_ACCOUNT: "Update" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Identiteit toevoegen?" - TITLE_UPDATE_IDENTITY: "Identiteit bijwerken?" - BUTTON_ADD_IDENTITY: "Toevoegen" - BUTTON_UPDATE_IDENTITY: "Bijwerken" - LABEL_EMAIL: "E-mail adres" - LABEL_NAME: "Naam" - LABEL_REPLY_TO: "Antwoordadres" - LABEL_SIGNATURE: "Signature" - LABEL_CC: "Cc" - LABEL_BCC: "BCC" - LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Map aanmaken?" - LABEL_NAME: "Map naam" - LABEL_PARENT: "Onderliggende map" - BUTTON_CREATE: "Maken" - BUTTON_CANCEL: "Annuleer" - BUTTON_CLOSE: "Sluiten" - TITLE_CREATING_PROCESS: "Maak een nieuwe map" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Alle inhoud van deze map verwijderen?" - BUTTON_CLEAR: "Wissen" - BUTTON_CANCEL: "Annuleer" - BUTTON_CLOSE: "Sluiten" - DANGER_DESC_WARNING: "Opgelet!" - DANGER_DESC_HTML_1: "Deze actie verwijdert alle e-mails in de map %FOLDER%!" - DANGER_DESC_HTML_2: "Eens in gang gezet kan het proces niet geannuleerd worden!" - TITLE_CLEARING_PROCESS: "Folder aan het leegmaken..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Importeer OpenPGP sleutel" - BUTTON_IMPORT_OPEN_PGP_KEY: "Importeer" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Bekijk OpenPGP sleutel" - BUTTON_SELECT: "Selecteer" - BUTTON_CLOSE: "Sluiten" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Genereer OpenPGP sleutels" - LABEL_EMAIL: "E-mail" - LABEL_NAME: "Naam" - LABEL_PASSWORD: "Wachtwoord" - LABEL_KEY_BIT_LENGTH: "Sleutel lengte" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Genereer" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP ondertekenen/versleutelen" - LABEL_SIGN: "Ondertekenen" - LABEL_ENCRYPT: "Versleutelen" - LABEL_PASSWORD: "Wachtwoord" - BUTTON_SIGN: "Ondertekenen" - BUTTON_ENCRYPT: "Versleutelen" - BUTTON_SIGN_AND_ENCRYPT: "Ondertekenen en versleutelen" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" - LABEL_KEY: "Privé sleutel" - LABEL_PASSWORD: "Password" - BUTTON_DECRYPT: "Decrypt" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "2-Stap verificatie test" - LABEL_CODE: "Code" - BUTTON_TEST: "Test" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Filter toevoegen" - TITLE_EDIT_FILTER: "Filter aanpassen" - FILTER_NAME: "Naam" - LEGEND_CONDITIONS: "Voorwaarden" - LEGEND_ACTIONS: "Akties" - BUTTON_DONE: "Klaar" - BUTTON_ADD_CONDITION: "Voorwaarde toevoegen" - SELECT_ACTION_NONE: "Geen" - SELECT_ACTION_MOVE_TO: "Verplaats naar" - SELECT_ACTION_FORWARD_TO: "Doorsturen naar" - SELECT_ACTION_REJECT: "Afwijzen" - SELECT_ACTION_VACATION_MESSAGE: "Afwezigheidbericht" - SELECT_ACTION_DISCARD: "Gooi weg" - SELECT_FIELD_FROM: "Van" - SELECT_FIELD_RECIPIENTS: "Ontvanger(s) (Aan of CC)" - SELECT_FIELD_SUBJECT: "Onderwerp" - SELECT_FIELD_HEADER: "Berichtkop" - SELECT_FIELD_SIZE: "Grootte" - SELECT_TYPE_CONTAINS: "Bevat" - SELECT_TYPE_NOT_CONTAINS: "Bevat niet" - SELECT_TYPE_MATCHES: "Komt overeen met (* and ? supported)" - SELECT_TYPE_NOT_MATCHES: "Komt niet overeen met (* and ? supported)" - SELECT_TYPE_REGEXP: "Reguliere expressie (Regexp)" - SELECT_TYPE_NOT_REGEXP: "Niet reguliere expressie (Regexp)" - SELECT_TYPE_EQUAL_TO: "Gelijk aan" - SELECT_TYPE_NOT_EQUAL_TO: "Niet gelijk aan" - SELECT_TYPE_OVER: "Meer dan" - SELECT_TYPE_UNDER: "Minder dan" - SELECT_MATCH_ANY: "Komt overeen met een van de volgende voorwaarden" - SELECT_MATCH_ALL: "Komt overeen met alle voorwaarden" - MARK_AS_READ_LABEL: "Markeer als gelezen" - REPLY_INTERVAL_LABEL: "Antwoord interval (dagen)" - KEEP_LABEL: "Behoud" - STOP_LABEL: "Stop niet met uitvoeren van volgende filters" - EMAIL_LABEL: "E-mail" - VACATION_SUBJECT_LABEL: "Onderwerp (optioneel)" - VACATION_MESSAGE_LABEL: "Bericht" - VACATION_RECIPIENTS_LABEL: "Ontvangers (comma gescheiden)" - REJECT_MESSAGE_LABEL: "Afwijsbericht" - ALL_INCOMING_MESSAGES_DESC: "Alle inkomende berichten" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Selecteer systeem mappen" - SELECT_CHOOSE_ONE: "Kies één" - SELECT_UNUSE_NAME: "Niet gebruiken" - LABEL_SENT: "Verzonden items" - LABEL_DRAFTS: "Concepten" - LABEL_SPAM: "Ongewenste e-mail" - LABEL_TRASH: "Verwijderde items" - LABEL_ARCHIVE: "Archief" - BUTTON_CANCEL: "Annuleer" - BUTTON_CLOSE: "Sluiten" - NOTIFICATION_SENT: | - U heeft nog geen "Verzonden items" folder aangeduid waar de berichten geplaatst worden na het versturen. - Indien u geen verzonden berichten wilt bewaren, kies de "Niet gebruiken" optie. - NOTIFICATION_DRAFTS: "U heeft nog geen \"Concepten\" folder aangeduid waar de berichten bewaard worden tijdens het opstellen." - NOTIFICATION_SPAM: | - U heeft nog geen "Ongewenste e-mail" folder aangeduid waar de spam berichten geplaatst worden. - Indien u berichten permanent wilt verwijderen, kies de "Niet gebruiken" optie. - NOTIFICATION_TRASH: | - U heeft nog geen "Verwijderde items" folder aangeduid waar de verwijderde berichten geplaatst worden. - Indien u berichten permanent wilt verwijderen, kies de "Niet gebruiken" optie. - NOTIFICATION_ARCHIVE: "U heeft nog geen \"Archief\" map aangeduid waar de gearchiveerde berichten geplaatst worden." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "2-Stap verificatie" - LABEL_ENABLE_TWO_FACTOR: "Gebruik 2-Stap verificatie" - LABEL_TWO_FACTOR_USER: "Gebruikersnaam" - LABEL_TWO_FACTOR_STATUS: "Status" - LABEL_TWO_FACTOR_SECRET: "Geheime sleutel" - LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" - BUTTON_CREATE: "Nieuwe geheime sleutel aanmaken" - BUTTON_ACTIVATE: "Activate" - BUTTON_CLEAR: "Wissen" - BUTTON_LOGOUT: "Logout" - BUTTON_DONE: "Klaar" - BUTTON_TEST: "Test" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Bekijk geheime sleutel" - BUTTON_HIDE_SECRET: "Verberg geheime sleutel" - TWO_FACTOR_REQUIRE_DESC: "Uw account vereist 2-Stap verificatie configuratie." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Geconfigureerd" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Niet geconfigureerd" - TWO_FACTOR_SECRET_DESC: >- - Importeer deze informatie in uw Google Authenticator-client (of andere TOTP-client) - door gebruik te maken van de QR code hier beneden of door de code handmatig - in te voeren. - TWO_FACTOR_BACKUP_CODES_DESC: >- - Als u geen codes ontvangt via de Google Authenticator kunt u de backup codes - gebruiken om in te loggen. Na gebruik van de backup code wordt deze inactief. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "U kunt 2-stap verificatie niet activeren voordat u het succesvol getest heeft." - TITLES: - LOADING: "Ophalen..." - LOGIN: "Inloggen" - MAILBOX: "Mailbox" - SETTINGS: "Instellingen" - COMPOSE: "Opstellen" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Bestand is te groot" - ERROR_FILE_PARTIALLY_UPLOADED: "Bestand is slechts deels geüpload door onbekende oorzaak" - ERROR_NO_FILE_UPLOADED: "Geen bestand geüpload" - ERROR_MISSING_TEMP_FOLDER: "Tijdelijk bestand ontbreekt" - ERROR_ON_SAVING_FILE: "Onbekende fout bij het opslaan van het bestand" - ERROR_FILE_TYPE: "Onjuist bestandstype" - ERROR_UNKNOWN: "Er is een onbekende fout opgetreden" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEKST" - TEXT_SWITCHER_RICH_FORMATTING: "Tekst met opmaak" - TEXT_SWITCHER_CONFIRM: "Tekst opmaak zal verloren gaan. Wenst u verder te gaan?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Persoonlijk" - LABEL_GENERAL_NAME: "Algemeen" - LABEL_CONTACTS_NAME: "Contactpersonen" - LABEL_FOLDERS_NAME: "Mappen" - LABEL_ACCOUNTS_NAME: "Accounts" - LABEL_IDENTITY_NAME: "Identiteit" - LABEL_IDENTITIES_NAME: "Identiteiten" - LABEL_FILTERS_NAME: "Filters" - LABEL_TEMPLATES_NAME: "Templates" - LABEL_SECURITY_NAME: "Beveiliging" - LABEL_SOCIAL_NAME: "Social" - LABEL_THEMES_NAME: "Thema's" - LABEL_CHANGE_PASSWORD_NAME: "Wachtwoord" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Terug" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filters" - BUTTON_SAVE: "Opslaan" - BUTTON_ADD_FILTER: "Filter toevoegen" - BUTTON_DELETE: "Verwijder" - BUTTON_RAW_SCRIPT: "Maak een custom script" - SUBNAME_NONE: "Geen" - SUBNAME_MOVE_TO: "Verplaats naar map \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Doorsturen naar \"%EMAIL%\"" - SUBNAME_REJECT: "Afwijzen" - SUBNAME_VACATION_MESSAGE: "Afwezigheidsbericht" - SUBNAME_DISCARD: "Gooi weg" - CAPABILITY_LABEL: "Mogelijkheden" - LOADING_PROCESS: "Bezig met updaten van de filter lijst" - DELETING_ASK: "Weet u het zeker?" - CHACHES_NEED_TO_BE_SAVED_DESC: "Wijzigingen moeten nog opgeslagen worden op de server." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identiteit" - LABEL_DISPLAY_NAME: "Naam" - LABEL_REPLY_TO: "Antwoordadres" - LABEL_SIGNATURE: "Handtekening" - LABEL_ADD_SIGNATURE_TO_ALL: "Handtekening standaard toevoegen aan bericht" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Beveiliging" - LABEL_CONFIGURE_TWO_FACTOR: "Configureer 2-stap verificatie" - LABEL_AUTOLOGOUT: "Automatisch uitloggen" - AUTOLOGIN_NEVER_OPTION_NAME: "Nooit" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minuten" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% uur" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Algemeen" - LABEL_LANGUAGE: "Taal" - LABEL_IDENTITY: "Identiteit" - LABEL_LAYOUT: "Indeling" - LABEL_LAYOUT_NO_SPLIT: "Geen splitsing" - LABEL_LAYOUT_VERTICAL_SPLIT: "Verticale splitsing" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontale splitsing" - LABEL_EDITOR: "Standaard tekst editor" - LABEL_EDITOR_HTML: "HTML" - LABEL_EDITOR_PLAIN: "Platte tekst" - LABEL_EDITOR_HTML_FORCED: "Html (geforceerd)" - LABEL_EDITOR_PLAIN_FORCED: "Platte tekst (geforceerd)" - LABEL_ANIMATION: "Interface animatie" - LABEL_ANIMATION_FULL: "Volledig" - LABEL_ANIMATION_NORMAL: "Normaal" - LABEL_ANIMATION_NONE: "Geen" - LABEL_VIEW_OPTIONS: "Bekijk opties" - LABEL_USE_PREVIEW_PANE: "Toon leesvenster" - LABEL_USE_CHECKBOXES_IN_LIST: "Toon selectievakjes in de lijst" - LABEL_USE_THREADS: "Groepeer berichten" - LABEL_REPLY_SAME_FOLDER: "Plaats antwoorden in de map van het originele bericht" - LABEL_SHOW_IMAGES: "Afbeeldingen altijd weergeven in het bericht" - LABEL_SHOW_ANIMATION: "Toon animaties" - LABEL_MESSAGE_PER_PAGE: "Berichten op pagina" - LABEL_NOTIFICATIONS: "Notificaties" - LABEL_SOUND_NOTIFICATION: "Notificatie geluid" - LABEL_CHROME_NOTIFICATION_DESC: "Toon nieuwe berichten popup" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Geblokkeerd door de browser)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Contactpersonen" - LABEL_CONTACTS_AUTOSAVE: "Automatisch ontvangers toevoegen aan uw adresboek" - LEGEND_CONTACTS_SYNC: "Server Synchronisatie (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Server synchronisatie inschakelen" - LABEL_CONTACTS_SYNC_SERVER: "Server" - LABEL_CONTACTS_SYNC_AB_URL: "Adresboek URL" - LABEL_CONTACTS_SYNC_USER: "Gebruikersnaam" - LABEL_CONTACTS_SYNC_PASSWORD: "Wachtwoord" - SETTINGS_THEMES: - LEGEND_THEMES: "Thema's" - LEGEND_THEMES_CUSTOM: "Aangepaste thema configuratie" - LABEL_CUSTOM_TYPE: "Soort" - LABEL_CUSTOM_TYPE_LIGHT: "Licht" - LABEL_CUSTOM_TYPE_DARK: "Donker" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Achtergrond" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Upload achtergrond afbeelding (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "Bestand is te groot" - ERROR_FILE_TYPE_ERROR: "Onjuist bestandstype (alleen JPG and PNG)" - ERROR_UNKNOWN: "Er is een onbekende fout opgetreden" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Via Google verbinden" - BUTTON_GOOGLE_DISCONNECT: "Verbinding met Google verbreken" - MAIN_GOOGLE_DESC: "Na activatie van inloggen via Google kunt u hiermee inloggen d.m.v. de Google knop op het login scherm." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Via Facebook verbinden" - BUTTON_FACEBOOK_DISCONNECT: "Verbinding met Facebook verbreken" - MAIN_FACEBOOK_DESC: "Na activatie van inloggen via Facebook kunt u hiermee inloggen d.m.v. de Google knop op het login scherm." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Via Twitter verbinden" - BUTTON_TWITTER_DISCONNECT: "Verbinding via Twitter verbreken" - MAIN_TWITTER_DESC: "Na activatie van inloggen via Twitter kunt u hiermee inloggen d.m.v. de Google knop op het login scherm." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Mappen lijst" - BUTTON_CREATE: "Maak een map" - BUTTON_SYSTEM: "Systeem mappen" - BUTTON_DELETE: "Verwijder" - BUTTON_SUBSCRIBE: "Abonneer" - BUTTON_UNSUBSCRIBE: "Abonnement opzeggen" - LOADING_PROCESS: "Mappen lijst aan het bijwerken" - CREATING_PROCESS: "Map aan het aanmaken" - DELETING_PROCESS: "Map aan het wissen" - RENAMING_PROCESS: "Map hernoemen" - DELETING_ASK: "Weet u het zeker?" - TO_MANY_FOLDERS_DESC_1: "U heeft te veel mappen!" - TO_MANY_FOLDERS_DESC_2: "Er worden er maar een deel weergegeven om prestatieproblemen te voorkomen." - HELP_DELETE_FOLDER: "Verwijder map" - HELP_SHOW_HIDE_FOLDER: "Toon/verberg map" - HELP_CHECK_FOR_NEW_MESSAGES: "Controleer wel of niet op nieuwe berichten" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Account Lijst" - LEGEND_IDENTITIES: "Identiteiten" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts en Identiteiten" - BUTTON_ADD_ACCOUNT: "Account toevoegen" - BUTTON_ADD_IDENTITY: "Identiteit toevoegen" - BUTTON_DELETE: "Wissen" - LOADING_PROCESS: "Account lijst aan het bijwerken" - DELETING_ASK: "Weet u het zeker?" - DEFAULT_IDENTITY_LABEL: "standaard" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identiteit" - LEGEND_IDENTITIES: "Additionele Identiteit" - LABEL_DEFAULT: "Standaard" - LABEL_DISPLAY_NAME: "Naam" - LABEL_REPLY_TO: "Antwoordadres" - LABEL_SIGNATURE: "Handtekening" - LABEL_ADD_SIGNATURE_TO_ALL: "Handtekening standaard toevoegen aan bericht" - BUTTON_ADD_IDENTITY: "Identiteit toevoegen" - BUTTON_DELETE: "Verwijder" - LOADING_PROCESS: "Identiteit lijst bijwerken" - DELETING_ASK: "Weet u het zeker?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Wachtwoord aanpassen" - LABEL_CURRENT_PASSWORD: "Huidig wachtwoord" - LABEL_NEW_PASSWORD: "Nieuw wachtwoord" - LABEL_REPEAT_PASSWORD: "Bevestig wachtwoord" - BUTTON_UPDATE_PASSWORD: "Wachtwoord wijzigen" - ERROR_PASSWORD_MISMATCH: "Wachtwoorden zijn niet gelijk, probeer opnieuw" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Importeer OpenPGP sleutel" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Genereer OpenPGP sleutels" - TITLE_PRIVATE: "Privé sleutel" - TITLE_PUBLIC: "Publieke sleutel" - DELETING_ASK: "Weet u het zeker?" - GENERATE_ONLY_HTTPS: "Alleen HTTPS" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Hulp bij toetsenbord sneltoetsen" - TAB_MAILBOX: "Mailbox" - TAB_MESSAGE_LIST: "Berichtenlijst" - TAB_MESSAGE_VIEW: "Bericht leesvenster" - TAB_COMPOSE: "Opstellen" - LABEL_OPEN_USER_DROPDOWN: "Open gebruikers menu" - LABEL_REPLY: "Beantwoord" - LABEL_REPLY_ALL: "Alle beantwoorden" - LABEL_FORWARD: "Doorsturen" - LABEL_FORWARD_MULTIPLY: "Doorsturen als bijlage(n)" - LABEL_HELP: "Help" - LABEL_CHECK_ALL: "Selecteer alle berichten" - LABEL_ARCHIVE: "Archiveren" - LABEL_DELETE: "Verwijderen" - LABEL_OPEN_THREAD: "Open geselecteerde berichtenlijst" - LABEL_MOVE: "Verplaatsen" - LABEL_READ: "Markeer geselecteerde berichten als gelezen" - LABEL_UNREAD: "Markeer geselecteerde berichten als ongelezen" - LABEL_IMPORTANT: "Belangrijk, vlag geselecteerde berichten" - LABEL_SEARCH: "Zoeken" - LABEL_CANCEL_SEARCH: "Zoekopdracht afbreken" - LABEL_FULLSCREEN_ENTER: "Bericht in volledig scherm lezen(leesvenster ingeschakeld)" - LABEL_VIEW_MESSAGE_ENTER: "Bericht lezen (leesvenster uitgeschakeld)" - LABEL_SWITCH_TO_MESSAGE: "Schakel focus naar bericht" - LABEL_SWITCH_TO_FOLDER_LIST: "Schakel focus naar berichtenlijst" - LABEL_FULLSCREEN_TOGGLE: "Schakel tussen normaal en lezen in volledig scherm" - LABEL_BLOCKQUOTES_TOGGLE: "Schakel blok citaten aan of uit" - LABEL_THREAD_NEXT: "Volgende bericht in groep" - LABEL_THREAD_PREV: "Vorige bericht in groep" - LABEL_PRINT: "Afdrukken" - LABEL_EXIT_FULLSCREEN: "Volledig scherm sluiten" - LABEL_CLOSE_MESSAGE: "Bericht sluiten (leesvenster uitgeschakeld)" - LABEL_SWITCH_TO_LIST: "Schakel focus terug naar berichtenlijst" - LABEL_OPEN_COMPOSE_POPUP: "Open nieuw bericht venster" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identiteiten menu" - LABEL_SAVE_MESSAGE: "Concept opslaan" - LABEL_SEND_MESSAGE: "Bericht versturen" - LABEL_CLOSE_COMPOSE: "Nieuw bericht venster sluiten" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "Geen publieke sleutels gevonden" - NO_PUBLIC_KEYS_FOUND_FOR: "Geen publieke sleutels gevonden voor e-mail adres \"%EMAIL%\"" - NO_PRIVATE_KEY_FOUND: "Geen privé sleutel gevonden" - NO_PRIVATE_KEY_FOUND_FOR: "Geen privé sleutel gevonden voor e-mail adres \"%EMAIL%\"" - ADD_A_PUBLICK_KEY: "Voeg een publieke sleutel toe" - SELECT_A_PRIVATE_KEY: "Selecteer een privé sleutel" - UNVERIFIRED_SIGNATURE: "Ongeverifieerde handtekening" - DECRYPTION_ERROR: "OpenPGP decryptie fout" - GOOD_SIGNATURE: "Juiste handtekening van %USER%" - PGP_ERROR: "OpenPGP foutmelding: %ERROR%" - SPECIFY_FROM_EMAIL: "Geef a.u.b. een VAN e-mail adres op" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Geef a.u.b. minimaal één ontvanger op" - NOTIFICATIONS: - INVALID_TOKEN: "Ongeldige token" - AUTH_ERROR: "Authenticatie mislukt" - ACCESS_ERROR: "Toegangsfout" - CONNECTION_ERROR: "Kan geen verbinding maken met de Server" - CAPTCHA_ERROR: "Onjuiste CAPTCHA" - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Deze social ID is nog niet aan een e-mail account gekoppeld. Log in met e-mail - adres en wachtwoord en schakel deze functie in in het account instellingen - menu. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Deze social ID is nog niet aan een e-mail account gekoppeld. Log in met e-mail - adres en wachtwoord en schakel deze functie in in het account instellingen - menu. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Deze social ID is nog niet aan een e-mail account gekoppeld. Log in met e-mail - adres en wachtwoord en schakel deze functie in in het account instellingen - menu. - DOMAIN_NOT_ALLOWED: "Domein is niet toegestaan" - ACCOUNT_NOT_ALLOWED: "Account is niet toegestaan" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2-Stap verificatie vereist" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2-Stap verificatie fout" - COULD_NOT_SAVE_NEW_PASSWORD: "Nieuwe wachtwoord kon niet opgeslagen worden" - CURRENT_PASSWORD_INCORRECT: "Huidig wachtwoord onjuist" - NEW_PASSWORD_SHORT: "Wachtwoord is te kort" - NEW_PASSWORD_WEAK: "Wachtwoord is te makkelijk" - NEW_PASSWORD_FORBIDDENT: "Wachtwoord bevat verboden tekens" - CONTACTS_SYNC_ERROR: "Contactpersonen synchronisatie fout" - CANT_GET_MESSAGE_LIST: "Berichtenlijst kan niet worden opgehaald" - CANT_GET_MESSAGE: "Bericht kan niet worden opgehaald" - CANT_DELETE_MESSAGE: "Kan bericht niet verwijderen" - CANT_MOVE_MESSAGE: "Kan bericht niet verplaatsen" - CANT_SAVE_MESSAGE: "Kan bericht niet opslaan" - CANT_SEND_MESSAGE: "Kan bericht niet verzenden" - INVALID_RECIPIENTS: "Onjuiste ontvangers" - CANT_SAVE_FILTERS: "Kan filters niet opslaan" - CANT_GET_FILTERS: "Kan filters niet ophalen" - FILTERS_ARE_NOT_CORRECT: "Filters zijn onjuist" - CANT_CREATE_FOLDER: "Kan map niet aanmaken" - CANT_RENAME_FOLDER: "Kan map niet hernoemen" - CANT_DELETE_FOLDER: "Kan map niet verwijderen" - CANT_DELETE_NON_EMPTY_FOLDER: "Een niet lege map kan niet verwijderd worden" - CANT_SUBSCRIBE_FOLDER: "Kan niet abonneren op folder" - CANT_UNSUBSCRIBE_FOLDER: "Kan abonnement op folder niet opzeggen" - CANT_SAVE_SETTINGS: "Instellingen kunnen niet opgeslagen worden" - CANT_SAVE_PLUGIN_SETTINGS: "Instellingen kunnen niet opgeslagen worden" - DOMAIN_ALREADY_EXISTS: "Domein bestaat reeds" - CANT_INSTALL_PACKAGE: "Package installeren mislukt" - CANT_DELETE_PACKAGE: "Package verwijderen mislukt" - INVALID_PLUGIN_PACKAGE: "Ongeldig plug-in package" - UNSUPPORTED_PLUGIN_PACKAGE: "Niet ondersteund plug-in package" - LICENSING_SERVER_IS_UNAVAILABLE: "Licentie Server is niet beschikbaar" - LICENSING_DOMAIN_EXPIRED: "Licentie voor dit domein is verlopen" - LICENSING_DOMAIN_BANNED: "Licentie voor dit domein is verboden" - DEMO_SEND_MESSAGE_ERROR: "Vanwege beveiliging is het niet toegestaan dat deze demo account e-mail naar extern verzend!" - DEMO_ACCOUNT_ERROR: "Vanwege beveiliging is deze actie niet toegestaan voor deze account!" - ACCOUNT_ALREADY_EXISTS: "Account bestaat al" - ACCOUNT_DOES_NOT_EXIST: "Account bestaat niet." - MAIL_SERVER_ERROR: "Fout bij toegang tot de mail Server" - INVALID_INPUT_ARGUMENT: "Ongeldig invoer argument" - UNKNOWN_ERROR: "Er is een onbekende fout opgetreden" - STATIC: - BACK_LINK: "Opnieuw laden" - DOMAIN_LIST_DESC: "Lijst van webmail domeinen die toegankelijk zijn" - PHP_EXSTENSIONS_ERROR_DESC: "Vereiste PHP extensies zijn niet beschikbaar in uw PHP configuratie!" - PHP_VERSION_ERROR_DESC: "Uw PHP versie (%VERSION%) is lager dan de minimaal vereiste 5.3.0!" - NO_SCRIPT_TITLE: "JavaScript is benodigd voor deze applicatie" - NO_SCRIPT_DESC: | - JavaScript ondersteuning is niet beschikbaar in uw browser. - Gelieve Javascript in te schakelen en opnieuw te proberen. - NO_COOKIE_TITLE: "Cookies ondersteuning is nodig voor deze applicatie" - NO_COOKIE_DESC: | - Cookies ondersteuning is niet beschikbaar in uw browser. - Gelieve Cookies in te schakelen en opnieuw te proberen. - BAD_BROWSER_TITLE: "Uw browser is verouderd" - BAD_BROWSER_DESC: | - Om alle functies van deze applicatie te gebruiken, - download en installeer een van de volgende browsers: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pl_PL.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pl_PL.yml deleted file mode 100755 index 5fa1378a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pl_PL.yml +++ /dev/null @@ -1,712 +0,0 @@ -pl_PL: - LOGIN: - LABEL_EMAIL: "Adres e-mail" - LABEL_LOGIN: "Login" - LABEL_PASSWORD: "Hasło" - LABEL_SIGN_ME: "Zapamiętaj mnie" - LABEL_VERIFICATION_CODE: "Kod weryfikujący" - LABEL_DONT_ASK_VERIFICATION_CODE: "Nie pytaj o kod przez 2 tygodnie" - BUTTON_SIGN_IN: "Zaloguj" - TITLE_SIGN_IN_GOOGLE: "Zaloguj się przez Google" - TITLE_SIGN_IN_FACEBOOK: "Zaloguj się przez Facebook" - TITLE_SIGN_IN_TWITTER: "Zaloguj się przez Twitter" - LABEL_FORGOT_PASSWORD: "Zapomniałem hasło" - LABEL_REGISTRATION: "Rejestracja" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Dodaj konto" - BUTTON_SETTINGS: "Ustawienia" - BUTTON_HELP: "Pomoc" - BUTTON_LOGOUT: "Wyloguj" - MOBILE: - BUTTON_MOBILE_VERSION: "Wersja mobilna" - BUTTON_DESKTOP_VERSION: "Wersja desktopowa" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Szukaj" - TITLE_ADV: "Wyszukiwanie zaawansowane" - LABEL_ADV_FROM: "Od:" - LABEL_ADV_TO: "Do:" - LABEL_ADV_SUBJECT: "Temat:" - LABEL_ADV_TEXT: "Tekst:" - LABEL_ADV_HAS_ATTACHMENT: "Załącznik" - LABEL_ADV_HAS_ATTACHMENTS: "Ma załączniki" - LABEL_ADV_FLAGGED: "Oznaczona" - LABEL_ADV_UNSEEN: "Nieprzeczytana" - LABEL_ADV_DATE: "Data:" - LABEL_ADV_DATE_ALL: "wszystkie" - LABEL_ADV_DATE_3_DAYS: "do 3 dni" - LABEL_ADV_DATE_7_DAYS: "do tygodnia" - LABEL_ADV_DATE_MONTH: "do miesiąca" - LABEL_ADV_DATE_3_MONTHS: "do 3 miesięcy" - LABEL_ADV_DATE_6_MONTHS: "do 6 miesięcy" - LABEL_ADV_DATE_YEAR: "do roku" - BUTTON_ADV_SEARCH: "Szukaj" - PREVIEW_POPUP: - FULLSCREEN: "Pełny ekran" - ZOOM: "Przybliż/oddal" - CLOSE: "Zamknij (Esc)" - LOADING: "Ładowanie..." - GALLERY_PREV: "Poprzedni (strzałka w lewo)" - GALLERY_NEXT: "Następny (strzałka w prawo)" - GALLERY_COUNTER: "%curr% z: %total%" - IMAGE_ERROR: "Nie można załadować obrazu." - AJAX_ERROR: "Nie można załadować zawartości." - FOLDER_LIST: - BUTTON_COMPOSE: "Utwórz" - BUTTON_CONTACTS: "Kontakty" - BUTTON_NEW_MESSAGE: "Nowa wiadomość" - INBOX_NAME: "Odebrane" - SENT_NAME: "Wysłane" - DRAFTS_NAME: "Wersje robocze" - SPAM_NAME: "Wiadomości śmieci - SPAM" - TRASH_NAME: "Kosz" - ARCHIVE_NAME: "Archiwum" - QUOTA: - TITLE: "Wykorzystanie miejsca" - MESSAGE_LIST: - BUTTON_RELOAD: "Odśwież" - BUTTON_MOVE_TO: "Przenieś" - BUTTON_DELETE: "Usuń" - BUTTON_ARCHIVE: "Archiwizuj" - BUTTON_SPAM: "Oznacz jako SPAM" - BUTTON_NOT_SPAM: "Oznacz jako pożądane" - BUTTON_EMPTY_FOLDER: "Usuń zawartość folderu" - BUTTON_MULTY_FORWARD: "Przekaż dalej" - BUTTON_DELETE_WITHOUT_MOVE: "Usuń (pernamentnie)" - BUTTON_MORE: "Więcej" - MENU_SET_SEEN: "Oznacz jako przeczytane" - MENU_SET_ALL_SEEN: "Oznacz wszystkie jako przeczytane" - MENU_UNSET_SEEN: "Oznacz jako nieprzeczytane" - MENU_SET_FLAG: "Oznacz jako ważne" - MENU_UNSET_FLAG: "Oznacz jako nieważne" - MENU_SELECT_ALL: "Wszystkie" - MENU_SELECT_NONE: "Żadne" - MENU_SELECT_INVERT: "Odwróć zaznaczenie" - MENU_SELECT_UNSEEN: "Nieprzeczytane" - MENU_SELECT_SEEN: "Przeczytane" - MENU_SELECT_FLAGGED: "Oznaczone jako ważne" - MENU_SELECT_UNFLAGGED: "Oznaczone jako nieważne" - EMPTY_LIST: "Pusta lista" - EMPTY_SEARCH_LIST: "Brak wiadomości spełniających kryteria wyszukiwania" - SEARCH_RESULT_FOR: "Wyniki wyszukiwania dla: \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "powrót do listy wiadomości" - LIST_LOADING: "Ładowanie..." - EMPTY_SUBJECT_TEXT: "(Brak tematu)" - PUT_MESSAGE_HERE: "Przeciągnij tutaj wiadomość, żeby zobaczyć ją na liście" - TODAY_AT: "dzisiaj: %TIME%" - YESTERDAY_AT: "wczoraj: %TIME%" - SEARCH_PLACEHOLDER: "Szukaj" - NEW_MESSAGE_NOTIFICATION: "Masz: %COUNT% now(-ą,-e,-ych) wiadomości!" - QUOTA_SIZE: "Wykorzystano: %SIZE% (%PROC%%) z: %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Edytuj" - BUTTON_BACK: "Wstecz" - BUTTON_CLOSE: "Zamknij" - BUTTON_DELETE: "Usuń" - BUTTON_UNSUBSCRIBE: "Zrezygnuj z subskrypcji" - BUTTON_ARCHIVE: "Archiwizuj" - BUTTON_SPAM: "Oznacz jako niechcianą" - BUTTON_NOT_SPAM: "Oznacz jako pożądaną" - BUTTON_MOVE_TO: "Przenieś" - BUTTON_MORE: "Więcej" - BUTTON_REPLY: "Odpowiedz" - BUTTON_REPLY_ALL: "Odpowiedz wszystkim" - BUTTON_FORWARD: "Przekaż dalej" - BUTTON_FORWARD_AS_ATTACHMENT: "Przekaż jako załącznik" - BUTTON_EDIT_AS_NEW: "Zredaguj jako nową wiadomość" - BUTTON_SHOW_IMAGES: "Wyświetl obrazy" - BUTTON_NOTIFY_READ_RECEIPT: "Nadawca prosi o potwierdzenie odczytania tej wiadomości" - BUTTON_IN_NEW_WINDOW: "Wyświetl w osobnym oknie" - BUTTON_THREAD_LIST: "Lista wątków" - BUTTON_THREAD_PREV: "Poprzedni" - BUTTON_THREAD_NEXT: "Następny" - BUTTON_THREAD_MORE: "Więcej wiadomości" - MENU_HEADERS: "Pokaż nagłówki wiadomości" - MENU_VIEW_ORIGINAL: "Pokaż zródło" - MENU_DOWNLOAD_ORIGINAL: "Pobierz jako plik eml" - MENU_FILTER_SIMILAR: "Filtruj podobne wiadomości" - MENU_PRINT: "Drukuj" - EMPTY_SUBJECT_TEXT: "(Brak tematu)" - LABEL_SUBJECT: "Temat" - LABEL_DATE: "Data" - LABEL_FROM: "Od" - LABEL_FROM_SHORT: "Od" - LABEL_TO: "Do" - LABEL_TO_SHORT: "Do" - LABEL_CC: "Kopia" - LABEL_BCC: "Ukr. kopia" - LABEL_REPLY_TO: "Zwrot do" - PRINT_LABEL_FROM: "Od" - PRINT_LABEL_TO: "Do" - PRINT_LABEL_CC: "Kopia" - PRINT_LABEL_BCC: "Ukr. kopia" - PRINT_LABEL_REPLY_TO: "Zwrot do" - PRINT_LABEL_DATE: "Data" - PRINT_LABEL_SUBJECT: "Temat" - PRINT_LABEL_ATTACHMENTS: "Załączniki" - MESSAGE_LOADING: "Ładowanie wiadomości..." - MESSAGE_VIEW_DESC: "Wybierz wiadomość do wyświetlenia" - PGP_PASSWORD_INPUT_PLACEHOLDER: "Hasło" - PGP_SIGNED_MESSAGE_DESC: "Podpisana" - PGP_ENCRYPTED_MESSAGE_DESC: "Zaszyfrowana" - LINK_DOWNLOAD_AS_ZIP: "Pobierz jako plik zip" - LINK_SAVE_TO_OWNCLOUD: "Zapisz w ownCloud" - LINK_SAVE_TO_DROPBOX: "Zapisz w Dropbox-ie" - READ_RECEIPT: - SUBJECT: "Potwierdzenie wyświetlenia wiadomości o tytule: %SUBJECT%" - BODY: | - Potwierdzenie wyświetlenia wiadomości wysłanej na adres: %READ-RECEIPT%. - - Uwaga: Otrzymanie tego potwierdzenia jest dowodem na to, że wiadomość została wyświetlona na komputerze odbiorcy. - Nie ma jednak żadnej gwarancji, że odbiorca faktycznie zapoznał się z jej treścią. - SUGGESTIONS: - SEARCHING_DESC: "Wyszukiwanie..." - CONTACTS: - LEGEND_CONTACTS: "Kontakty" - SEARCH_INPUT_PLACEHOLDER: "Szukaj" - BUTTON_ADD_CONTACT: "Dodaj Kontakt" - BUTTON_CREATE_CONTACT: "Utwórz" - BUTTON_UPDATE_CONTACT: "Zaktualizuj" - BUTTON_IMPORT: "Importuj (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Eksportuj (vcf, vCard)" - BUTTON_EXPORT_CSV: "Eksportuj (csv)" - ERROR_IMPORT_FILE: "Błąd importu (nieprawidłowy format pliku)" - LIST_LOADING: "Ładowanie..." - EMPTY_LIST: "Brak kontaktów" - EMPTY_SEARCH: "Nie znaleziono żadnych kontaktów" - CLEAR_SEARCH: "Wyczyść wyniki" - CONTACT_VIEW_DESC: "Wybierz kontakt do wyświetlenia" - LABEL_DISPLAY_NAME: "Nazwa:" - LABEL_EMAIL: "Adres e-mail:" - LABEL_PHONE: "Telefon:" - LABEL_WEB: "Strona WWW:" - LABEL_BIRTHDAY: "Urodziny:" - LINK_ADD_EMAIL: "Dodaj adres e-mail" - LINK_ADD_PHONE: "Dodaj nr telefonu" - LINK_BIRTHDAY: "Urodziny" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Nazwa" - PLACEHOLDER_ENTER_LAST_NAME: "Nazwisko" - PLACEHOLDER_ENTER_FIRST_NAME: "Imię" - PLACEHOLDER_ENTER_NICK_NAME: "Pseudonim" - LABEL_READ_ONLY: "Tylko do odczytu" - LABEL_SHARE: "Udostępnij kontakt" - ADD_MENU_LABEL: "Dodaj" - ADD_MENU_NICKNAME: "Pseudonim" - ADD_MENU_NOTES: "Notatki" - ADD_MENU_EMAIL: "Adres e-mail" - ADD_MENU_PHONE: "Telefon" - ADD_MENU_URL: "Adres www" - ADD_MENU_ADDRESS: "Adres" - ADD_MENU_BIRTHDAY: "Urodziny" - ADD_MENU_TAGS: "Tagi" - BUTTON_SHARE_NONE: "Nikomu" - BUTTON_SHARE_ALL: "Wszystkim" - BUTTON_SYNC: "Synchronizacja (CardDAV)" - COMPOSE: - TITLE_FROM: "Od" - TITLE_TO: "Do" - TITLE_CC: "Kopia" - TITLE_BCC: "Ukr. kopia" - TITLE_REPLY_TO: "Zwrot do" - TITLE_SUBJECT: "Temat" - LINK_SHOW_INPUTS: "Pokaż wszystkie pola" - BUTTON_SEND: "Wyślij" - BUTTON_SAVE: "Zapisz" - BUTTON_DELETE: "Usuń" - BUTTON_CANCEL: "Anuluj" - BUTTON_MINIMIZE: "Minimalizuj" - SAVED_TIME: "Zapisane: %TIME%" - SAVED_ERROR_ON_SEND: "Wiadomość została wysłana, ale nie została zapisana w folderze: Wysłane" - DISCARD_UNSAVED_DATA: "Odrzucić niezapisane dane?" - ATTACH_FILES: "Dodaj załącznik" - ATTACH_DROP_FILES_DESC: "Przeciągnij pliki tutaj" - ATTACH_ITEM_CANCEL: "Anuluj" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Dysk Google" - REPLY_MESSAGE_TITLE: "%DATETIME% - %EMAIL%" - FORWARD_MESSAGE_TOP_TITLE: "-------- Przekierowana wiadomość -------" - FORWARD_MESSAGE_TOP_FROM: "Od:" - FORWARD_MESSAGE_TOP_TO: "Do:" - FORWARD_MESSAGE_TOP_CC: "Kopia do:" - FORWARD_MESSAGE_TOP_SENT: "Wysłany:" - FORWARD_MESSAGE_TOP_SUBJECT: "Temat:" - EMPTY_TO_ERROR_DESC: "Wprowadź co najmniej jednego odbiorcę" - NO_ATTACHMENTS_HERE_DESC: "Brak załączników" - ATTACHMENTS_ERROR_DESC: "Ostrzeżenie! Nie wszystkie załaczniki zostały przesłane" - ATTACHMENTS_UPLOAD_ERROR_DESC: "Nie przesłano jeszcze wszystkich załączników" - BUTTON_REQUEST_READ_RECEIPT: "Potwierdzenie wyświetlenia wiadomości" - BUTTON_MARK_AS_IMPORTANT: "Oznacz jako ważną" - BUTTON_OPEN_PGP: "OpenPGP (tylko wiadomości tekstowe)" - BUTTON_REQUEST_DSN: "Potwierdzenie dostarczenia wiadomości" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Zamknij" - POPUPS_ASK: - BUTTON_YES: "Tak" - BUTTON_NO: "Nie" - DESC_WANT_CLOSE_THIS_WINDOW: "Na pewno zamknąć to okno?" - DESC_WANT_DELETE_MESSAGES: "Na pewno usunąć wiadomość(-i)?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Wybierz język" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Dodawanie konta" - BUTTON_ADD_ACCOUNT: "Dodaj" - TITLE_UPDATE_ACCOUNT: "Aktualizacja konta" - BUTTON_UPDATE_ACCOUNT: "Aktualizuj" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Dodawanie tożsamości" - TITLE_UPDATE_IDENTITY: "Aktualizacja tożsamości" - BUTTON_ADD_IDENTITY: "Dodaj" - BUTTON_UPDATE_IDENTITY: "Aktualizuj" - LABEL_EMAIL: "Adres e-mail:" - LABEL_NAME: "Nazwa:" - LABEL_REPLY_TO: "Zwrot do" - LABEL_SIGNATURE: "Podpis:" - LABEL_CC: "Kopia" - LABEL_BCC: "Ukr. kopia" - LABEL_SIGNATURE_INSERT_BEFORE: "Umieść podpis przed cytowanym tekstem" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Tworzenie folderu" - LABEL_NAME: "Nazwa folderu:" - LABEL_PARENT: "Folder nadrzędny:" - BUTTON_CREATE: "Utwórz" - BUTTON_CANCEL: "Anuluj" - BUTTON_CLOSE: "Zamknij" - TITLE_CREATING_PROCESS: "Tworzenie folderu" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Usuwanie wszystkich wiadomości z folderu" - BUTTON_CLEAR: "Usuń wszystkie" - BUTTON_CANCEL: "Anuluj" - BUTTON_CLOSE: "Zamknij" - DANGER_DESC_WARNING: "Ostrzeżenie!" - DANGER_DESC_HTML_1: "Wszystkie wiadomości w folderze: %FOLDER%, zostaną bezpowrotnie usunięte!" - DANGER_DESC_HTML_2: "Po rozpoczęciu, nie można przerwać lub anulować zadania." - TITLE_CLEARING_PROCESS: "Trwa usuwanie wszystkich wiadomości z folderu..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Importowanie klucza OpenPGP" - BUTTON_IMPORT_OPEN_PGP_KEY: "Importuj" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Klucz OpenPGP" - BUTTON_SELECT: "Zaznacz" - BUTTON_CLOSE: "Zamknij" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Generowanie klucza OpenPGP" - LABEL_EMAIL: "Adres e-mail:" - LABEL_NAME: "Imię i nazwisko:" - LABEL_PASSWORD: "Hasło:" - LABEL_KEY_BIT_LENGTH: "Długość klucza:" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generuj" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "Podpisywanie/szyfrowanie" - LABEL_SIGN: "Podpisz" - LABEL_ENCRYPT: "Szyfruj" - LABEL_PASSWORD: "Hasło:" - BUTTON_SIGN: "Podpisz" - BUTTON_ENCRYPT: "Szyfruj" - BUTTON_SIGN_AND_ENCRYPT: "Podpisz i szyfruj" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" - LABEL_KEY: "Klucz prywatny" - LABEL_PASSWORD: "Password" - BUTTON_DECRYPT: "Decrypt" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "Test autoryzacji dwuskładnikowej" - LABEL_CODE: "Kod" - BUTTON_TEST: "Testuj" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Tworzenie filtra" - TITLE_EDIT_FILTER: "Aktualizacja filtra" - FILTER_NAME: "Nazwa" - LEGEND_CONDITIONS: "Warunki" - LEGEND_ACTIONS: "Działania" - BUTTON_DONE: "Gotowe" - BUTTON_ADD_CONDITION: "Dodaj warunek" - SELECT_ACTION_NONE: "Brak" - SELECT_ACTION_MOVE_TO: "Przenieś" - SELECT_ACTION_FORWARD_TO: "Prześlij dalej" - SELECT_ACTION_REJECT: "Odrzuć" - SELECT_ACTION_VACATION_MESSAGE: "Wiadomość urlopowa" - SELECT_ACTION_DISCARD: "Usuń" - SELECT_FIELD_FROM: "Pole 'Od'" - SELECT_FIELD_RECIPIENTS: "Pole 'Kopia' lub 'Ukr. kopia'" - SELECT_FIELD_SUBJECT: "Pole 'Temat'" - SELECT_FIELD_HEADER: "Nagłówek" - SELECT_FIELD_SIZE: "Rozmiar" - SELECT_TYPE_CONTAINS: "zawiera" - SELECT_TYPE_NOT_CONTAINS: "nie zawiera" - SELECT_TYPE_MATCHES: "zawiera (*,?)" - SELECT_TYPE_NOT_MATCHES: "nie zawiera (*,?)" - SELECT_TYPE_REGEXP: "Wyrażenie regularne:" - SELECT_TYPE_NOT_REGEXP: "Niepoprawne wyrażenie regularne:" - SELECT_TYPE_EQUAL_TO: "Zawiera:" - SELECT_TYPE_NOT_EQUAL_TO: "Nie zawiera:" - SELECT_TYPE_OVER: "powyżej" - SELECT_TYPE_UNDER: "poniżej" - SELECT_MATCH_ANY: "Spełnia dowolny z warunków" - SELECT_MATCH_ALL: "Spełnia wszystkie warunki" - MARK_AS_READ_LABEL: "Oznacz jako przeczytane" - REPLY_INTERVAL_LABEL: "Liczba dni, po których wysłać odp." - KEEP_LABEL: "Zachowaj" - STOP_LABEL: "Nie zatrzymuj przetwarzania reguł" - EMAIL_LABEL: "Adres e-mail" - VACATION_SUBJECT_LABEL: "Temat (opcjonalnie)" - VACATION_MESSAGE_LABEL: "Wiadomość" - VACATION_RECIPIENTS_LABEL: "Odbiorcy (rodzielone przecinkami)" - REJECT_MESSAGE_LABEL: "Powód odrzucenia" - ALL_INCOMING_MESSAGES_DESC: "Wszystkie przychodzące wiadomości" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Wybieranie folderów systemowych" - SELECT_CHOOSE_ONE: "wybierz" - SELECT_UNUSE_NAME: "nie używaj" - LABEL_SENT: "Wysłane:" - LABEL_DRAFTS: "Wersje robocze:" - LABEL_SPAM: "Niechciane:" - LABEL_TRASH: "Kosz:" - LABEL_ARCHIVE: "Archiwum:" - BUTTON_CANCEL: "Anuluj" - BUTTON_CLOSE: "Zamknij" - NOTIFICATION_SENT: | - Nie wybrano folderu: "Wysłane", do którego przenoszone są wysłane wiadomości. - Jeżeli wysyłane wiadomości nie mają być przechowywane, proszę zaznaczyć opcję: "Nie używaj". - NOTIFICATION_DRAFTS: "Nie wybrano folderu: \"Wersje robocze\", do którego są zapisywane wiadomości w trakcie ich tworzenia." - NOTIFICATION_SPAM: | - Nie wybrano folderu: "Niechciane", do którego przenoszone są niepożadane wiadomości. - Jeżeli niechciane wiadomości mają być usuwane na stałe, proszę o zaznaczenie opcji: "Nie używaj". - NOTIFICATION_TRASH: | - Nie wybrano folderu: "Kosz", do którego przenoszone są wszystkie usunięte wiadomości. - Jeżeli wiadomości mają być usuwane na stałe, proszę o zaznaczenie opcji: "Nie używaj". - NOTIFICATION_ARCHIVE: "Nie został wybrany folder \"Archiwum\", zostanie użyty systemowy folder archiwizacji wiadomości." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "Dwuskładnikowa autoryzacja" - LABEL_ENABLE_TWO_FACTOR: "Włącz dwuskładnikową autoryzację" - LABEL_TWO_FACTOR_USER: "Użytkownik:" - LABEL_TWO_FACTOR_STATUS: "Status:" - LABEL_TWO_FACTOR_SECRET: "Tajna fraza:" - LABEL_TWO_FACTOR_BACKUP_CODES: "Kody zapasowe:" - BUTTON_CREATE: "Utwórz nową frazę" - BUTTON_ACTIVATE: "Aktywuj" - BUTTON_CLEAR: "Wyczyść" - BUTTON_LOGOUT: "Wyloguj" - BUTTON_DONE: "Zamknij" - BUTTON_TEST: "Testuj" - LINK_TEST: "Test" - BUTTON_SHOW_SECRET: "Pokaż frazę" - BUTTON_HIDE_SECRET: "Ukryj frazę" - TWO_FACTOR_REQUIRE_DESC: "Twoje konto wymaga skonfigurowania dwuskładnikowej autoryzacji ." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Skonfigurowana" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Nie skonfigurowana" - TWO_FACTOR_SECRET_DESC: >- - Użyj tych informacji w usłudze Google Authenticator (lub innym kliencie TOTP), - używając poniższego kodu QR lub wpisując kod ręcznie. - TWO_FACTOR_BACKUP_CODES_DESC: >- - Jeżeli nie możesz otrzymać kodu poprzez usługę Google Authenticator, możesz - użyć kodów zapasowych. Po zużyciu kodów, opcja ta będzie nieaktywna. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Nie możesz zmienić tego ustawienia przed jego przetestowaniem." - TITLES: - LOADING: "Ładowanie..." - LOGIN: "Login" - MAILBOX: "Skrzynka Pocztowa" - SETTINGS: "Ustawienia" - COMPOSE: "Utwórz" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Plik jest za duży" - ERROR_FILE_PARTIALLY_UPLOADED: "Z powodu nieokreślonego błędu, plik nie został przesłany w całości" - ERROR_NO_FILE_UPLOADED: "Nie przesłano żadnego pliku" - ERROR_MISSING_TEMP_FOLDER: "Brakuje pliku tymczasowego" - ERROR_ON_SAVING_FILE: "Wystąpił nieoczekiwany błąd w trakcie przesyłania pliku" - ERROR_FILE_TYPE: "Nieprawidłowy typ pliku" - ERROR_UNKNOWN: "Wystąpił nieznany błąd w trakcie przesyłania pliku" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> zwykły tekst" - TEXT_SWITCHER_RICH_FORMATTING: "Wzbogacony format tekstowy" - TEXT_SWITCHER_CONFIRM: "Formatowanie tekstu oraz wszystkie wstawione obrazy zostaną utracone. Czy na pewno chcesz kontynuować?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Osobiste" - LABEL_GENERAL_NAME: "Ogólne" - LABEL_CONTACTS_NAME: "Kontakty" - LABEL_FOLDERS_NAME: "Foldery" - LABEL_ACCOUNTS_NAME: "Konta" - LABEL_IDENTITY_NAME: "Tożsamość" - LABEL_IDENTITIES_NAME: "Tożsamości" - LABEL_FILTERS_NAME: "Filtry" - LABEL_TEMPLATES_NAME: "Szablony" - LABEL_SECURITY_NAME: "Bezpieczeństwo" - LABEL_SOCIAL_NAME: "Sieci społecznościowe" - LABEL_THEMES_NAME: "Motywy" - LABEL_CHANGE_PASSWORD_NAME: "Hasło" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Wstecz" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filtry" - BUTTON_SAVE: "Zapisz" - BUTTON_ADD_FILTER: "Dodaj filtr" - BUTTON_DELETE: "Usuń" - BUTTON_RAW_SCRIPT: "Utwórz własny skrypt użytkownika" - SUBNAME_NONE: "Brak" - SUBNAME_MOVE_TO: "Przenieś do \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Przekaż do \"%EMAIL%\"" - SUBNAME_REJECT: "Odrzuć" - SUBNAME_VACATION_MESSAGE: "Wiadomość urlopowa" - SUBNAME_DISCARD: "Usuń" - CAPABILITY_LABEL: "Możliwości" - LOADING_PROCESS: "Aktualizowanie listy filtrów" - DELETING_ASK: "Czy jesteś pewny(a)?" - CHACHES_NEED_TO_BE_SAVED_DESC: "Zmiany te muszą zostać zapisane na serwerze." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Tożsamość" - LABEL_DISPLAY_NAME: "Imię i nazwisko" - LABEL_REPLY_TO: "Zwrot do" - LABEL_SIGNATURE: "Podpis" - LABEL_ADD_SIGNATURE_TO_ALL: "Dadawaj podpis do wszystkich wiadomości" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Bezpieczeństwo" - LABEL_CONFIGURE_TWO_FACTOR: "Konfiguracja dwuskładnikowej autoryzacji" - LABEL_AUTOLOGOUT: "Auto. wylogowanie:" - AUTOLOGIN_NEVER_OPTION_NAME: "Nidgy" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minut" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% godzina(-y)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Ogólne" - LABEL_LANGUAGE: "Język:" - LABEL_IDENTITY: "Tożsamość:" - LABEL_LAYOUT: "Układ:" - LABEL_LAYOUT_NO_SPLIT: "bez podziału" - LABEL_LAYOUT_VERTICAL_SPLIT: "podział w pionie" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "podział w poziomie" - LABEL_EDITOR: "Format wiadomości:" - LABEL_EDITOR_HTML: "HTML" - LABEL_EDITOR_PLAIN: "zwykły tekst" - LABEL_EDITOR_HTML_FORCED: "HTML (wymuszony)" - LABEL_EDITOR_PLAIN_FORCED: "zwykły tekst (wymuszony)" - LABEL_ANIMATION: "Animacja interfejsu" - LABEL_ANIMATION_FULL: "pełna" - LABEL_ANIMATION_NORMAL: "zwykła" - LABEL_ANIMATION_NONE: "brak" - LABEL_VIEW_OPTIONS: "Opcje wyświetlania" - LABEL_USE_PREVIEW_PANE: "Wyświetl okno podglądu" - LABEL_USE_CHECKBOXES_IN_LIST: "Wyświetl pola zaznaczenia w listach" - LABEL_USE_THREADS: "Używaj wątków" - LABEL_REPLY_SAME_FOLDER: "Umieść odpowiedzi w folderach, z których pochodzą wiadomości" - LABEL_SHOW_IMAGES: "Zawsze wyświetlaj obrazy w wiadomościach" - LABEL_SHOW_ANIMATION: "Użyj animacji" - LABEL_MESSAGE_PER_PAGE: "Wiad. na stronie:" - LABEL_NOTIFICATIONS: "Powiadomienia" - LABEL_SOUND_NOTIFICATION: "Powiadomienia dźwiękowe" - LABEL_CHROME_NOTIFICATION_DESC: "Wyświetlaj powiadomienia o nowych wiadomościach" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Zablokowane przez przeglądarkę)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Kontakty" - LABEL_CONTACTS_AUTOSAVE: "Automatycznie dodaj nieznanych nadawców i odbiorców do książki adresowej" - LEGEND_CONTACTS_SYNC: "Zdalna synchronizacja (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Włącz zdalną synchronizację" - LABEL_CONTACTS_SYNC_SERVER: "Serwer:" - LABEL_CONTACTS_SYNC_AB_URL: "Adres URL:" - LABEL_CONTACTS_SYNC_USER: "Użytkownik:" - LABEL_CONTACTS_SYNC_PASSWORD: "Hasło:" - SETTINGS_THEMES: - LEGEND_THEMES: "Motyw" - LEGEND_THEMES_CUSTOM: "Własny motyw" - LABEL_CUSTOM_TYPE: "Typ" - LABEL_CUSTOM_TYPE_LIGHT: "Jasny" - LABEL_CUSTOM_TYPE_DARK: "Ciemny" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Tło" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Prześlij własne tło (.JPG, .PNG)" - ERROR_FILE_IS_TOO_BIG: "Plik jest za duży (1MB+)" - ERROR_FILE_TYPE_ERROR: "Nieprawidłowy format pliku (obsługiwane są wyłącznie pliki .JPG i .PNG)" - ERROR_UNKNOWN: "Wystąpił nieznany błąd w trakcie przesyłania" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Konto Google" - BUTTON_GOOGLE_CONNECT: "Połącz z Google" - BUTTON_GOOGLE_DISCONNECT: "Odłącz" - MAIN_GOOGLE_DESC: "Po zezwoleniu na logowanie przez: Google, możesz zalogować się na to konto używając przycisku: \"Google\" w panelu logowania." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Połącz z Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Odłącz" - MAIN_FACEBOOK_DESC: "Po zezwoleniu na logowanie przez: Facebook, możesz zalogować się na to konto używając przycisku: \"Facebook\" w panelu logowania." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Połącz z Twitter" - BUTTON_TWITTER_DISCONNECT: "Odłącz" - MAIN_TWITTER_DESC: "Po zezwoleniu na logowanie przez: Twitter, możesz zalogować się na to konto używając przycisku: \"Twitter\" w panelu logowania." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Lista folderów" - BUTTON_CREATE: "Utwórz folder" - BUTTON_SYSTEM: "Foldery systemowe" - BUTTON_DELETE: "Usuń" - BUTTON_SUBSCRIBE: "Subskrybuj" - BUTTON_UNSUBSCRIBE: "Zrezygnuj z subskrypcji" - LOADING_PROCESS: "Aktualizacja listy folderów" - CREATING_PROCESS: "Tworzenie folderu" - DELETING_PROCESS: "Usuwanie folderu" - RENAMING_PROCESS: "Zmiana nazwy folderu" - DELETING_ASK: "Czy na pewno usunąć?" - TO_MANY_FOLDERS_DESC_1: "Masz za dużo folderów!" - TO_MANY_FOLDERS_DESC_2: "Pokazaliśmy tylko część z nich aby uniknąć problemów z wydajnością." - HELP_DELETE_FOLDER: "Usuń folder" - HELP_SHOW_HIDE_FOLDER: "Pokaż/ukryj folder" - HELP_CHECK_FOR_NEW_MESSAGES: "Sprawdzaj/nie sprawdzaj nowych wiadomości" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Konta" - LEGEND_IDENTITIES: "Tożsamości" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Konta i tożsamości" - BUTTON_ADD_ACCOUNT: "Dodaj konto" - BUTTON_ADD_IDENTITY: "Dodaj tożsamość" - BUTTON_DELETE: "Usuń" - LOADING_PROCESS: "Trwa aktualizowanie listy kont" - DELETING_ASK: "Czy na pewno usunąć?" - DEFAULT_IDENTITY_LABEL: "domyślna" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Tożsamość" - LEGEND_IDENTITIES: "Dodatkowe tożsamości" - LABEL_DEFAULT: "Domyślna" - LABEL_DISPLAY_NAME: "Nazwa:" - LABEL_REPLY_TO: "Odpowiedź do:" - LABEL_SIGNATURE: "Podpis:" - LABEL_ADD_SIGNATURE_TO_ALL: "Dodaj podpis do wszystkich wysyłanych wiadomości" - BUTTON_ADD_IDENTITY: "Dodaj tożsamość" - BUTTON_DELETE: "Usuń" - LOADING_PROCESS: "Trwa aktualizowanie listy tożsamości" - DELETING_ASK: "Czy na pewno chcesz usunąć?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Zmiana hasła" - LABEL_CURRENT_PASSWORD: "Aktualne hasło:" - LABEL_NEW_PASSWORD: "Nowe hasło:" - LABEL_REPEAT_PASSWORD: "Powtórz nowe hasło:" - BUTTON_UPDATE_PASSWORD: "Zmień hasło na nowe" - ERROR_PASSWORD_MISMATCH: "Wpisane hasła nie pasują do siebie, proszę spróbować ponownie" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Importuj klucz OpenPGP" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generuj klucz OpenPGP" - TITLE_PRIVATE: "Prywatny" - TITLE_PUBLIC: "Publiczny" - DELETING_ASK: "Czy na pewno chcesz usunąć?" - GENERATE_ONLY_HTTPS: "Tylko HTTPS" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Skróty klawiaturowe" - TAB_MAILBOX: "Skrzynka pocztowa" - TAB_MESSAGE_LIST: "Lista wiadomości" - TAB_MESSAGE_VIEW: "Widok wiadomości" - TAB_COMPOSE: "Tworzenie wiadomości" - LABEL_OPEN_USER_DROPDOWN: "Otwórz podręczne menu użytkownika" - LABEL_REPLY: "Odpowiedz" - LABEL_REPLY_ALL: "Odpowiedz wszystkim" - LABEL_FORWARD: "Przekaż" - LABEL_FORWARD_MULTIPLY: "Przekaż (wielokrotnie)" - LABEL_HELP: "Pomoc" - LABEL_CHECK_ALL: "Sprawdź wszystkie wiadomości" - LABEL_ARCHIVE: "Archiwum" - LABEL_DELETE: "Usuń" - LABEL_OPEN_THREAD: "Otwórz wybrany wątek" - LABEL_MOVE: "Przenieś" - LABEL_READ: "Oznacz zaznaczone wiadomości, jako przeczytane" - LABEL_UNREAD: "Oznacz zaznaczone wiadomości, jako nieprzeczytane" - LABEL_IMPORTANT: "Oznacz zaznaczone wiadomości, jako ważne" - LABEL_SEARCH: "Szukaj" - LABEL_CANCEL_SEARCH: "Anuluj szukanie" - LABEL_FULLSCREEN_ENTER: "Pełny ekran (aktywny podgląd wiadomości)" - LABEL_VIEW_MESSAGE_ENTER: "Pokaż wiadomość (nieaktywny podgląd wiadomości)" - LABEL_SWITCH_TO_MESSAGE: "Wybrana wiadomość na pierwszym planie" - LABEL_SWITCH_TO_FOLDER_LIST: "Lista folderów na pierwszym planie" - LABEL_FULLSCREEN_TOGGLE: "Tryb pełnoekranowy" - LABEL_BLOCKQUOTES_TOGGLE: "Cytowanie wiadomości" - LABEL_THREAD_NEXT: "Następna wiadomość w wątku" - LABEL_THREAD_PREV: "Poprzednia wiadomość w wątku" - LABEL_PRINT: "Drukuj" - LABEL_EXIT_FULLSCREEN: "Opuść tryb pełnoekranowy" - LABEL_CLOSE_MESSAGE: "Zamknij wiadomość (nieaktywny podgląd wiadomości)" - LABEL_SWITCH_TO_LIST: "Wróć do widoku listy wiadomości" - LABEL_OPEN_COMPOSE_POPUP: "Otwórz okno tworzenia wiadomości" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Otwórz menu wyboru tożsamości" - LABEL_SAVE_MESSAGE: "Zapisz wiadomość" - LABEL_SEND_MESSAGE: "Wyślij wiadomość" - LABEL_CLOSE_COMPOSE: "Zamknij okno tworzenia wiadomości" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "Nie znaleziono klucza publicznego" - NO_PUBLIC_KEYS_FOUND_FOR: "Nie znaleziono klucza publicznego dla adresu: \"%EMAIL%\"" - NO_PRIVATE_KEY_FOUND: "Nie znaleziono klucza prywatnego" - NO_PRIVATE_KEY_FOUND_FOR: "Nie znaleziono klucza prywatnego dla adresu: \"%EMAIL%\"" - ADD_A_PUBLICK_KEY: "Dodaj klucz publiczny" - SELECT_A_PRIVATE_KEY: "Wybierz klucz prywatny" - UNVERIFIRED_SIGNATURE: "Niezweryfikowana" - DECRYPTION_ERROR: "Błąd deszyfrowania OpenPGP" - GOOD_SIGNATURE: "Podpisana przez: %USER%" - PGP_ERROR: "Błąd OpenPGP: %ERROR%" - SPECIFY_FROM_EMAIL: "Proszę podać adres e-mail w polu: OD" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Proszę podać przynajmniej jednego odbiorcę" - NOTIFICATIONS: - INVALID_TOKEN: "Nieprawidłowy token" - AUTH_ERROR: "Błąd autoryzacji" - ACCESS_ERROR: "Błąd dostępu" - CONNECTION_ERROR: "Błąd połączenia z serwerem" - CAPTCHA_ERROR: "Nieprawidłowy kod CAPTCHA" - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - To społecznościowe ID (Facebooku), nie jest powiązane z żadnym kontem pocztowym. - Zaloguj się używając danych swojego konta e-mail i skonfiguruj tę opcję w: - Ustawienia > Sieci społecznościowe. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - To społecznościowe ID (Twitter), nie jest powiązane z żadnym kontem pocztowym. - Zaloguj się używając danych swojego konta e-mail i skonfiguruj tę opcję w: - Ustawienia > Sieci społecznościowe. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - To społecznościowe ID (Konto Google), nie jest powiązane z żadnym kontem pocztowym. - Zaloguj się używając danych swojego konta e-mail i skonfiguruj tę opcję w: - Ustawienia > Sieci społecznościowe. - DOMAIN_NOT_ALLOWED: "Domena niedozwolona" - ACCOUNT_NOT_ALLOWED: "Konto nie jest dozwolone" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Wymagana dwuskładnikowa autoryzacja" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Błąd dwuskładnikowej autoryzacji" - COULD_NOT_SAVE_NEW_PASSWORD: "Nie można było zapisać nowego hasła" - CURRENT_PASSWORD_INCORRECT: "Obecne hasło jest niepoprawne" - NEW_PASSWORD_SHORT: "Hasło jest za krótkie" - NEW_PASSWORD_WEAK: "Hasło jest zbyt łatwe" - NEW_PASSWORD_FORBIDDENT: "Hasło zawiera zakazane znaki" - CONTACTS_SYNC_ERROR: "Błąd synchronizacji kontaktów" - CANT_GET_MESSAGE_LIST: "Nie jest możliwe pobranie listy wiadomości" - CANT_GET_MESSAGE: "Nie można pobrać wiadomości" - CANT_DELETE_MESSAGE: "Nie można usunąć wiadomości" - CANT_MOVE_MESSAGE: "Nie można przenieść wiadomości" - CANT_SAVE_MESSAGE: "Nie można zapisać wiadomości" - CANT_SEND_MESSAGE: "Nie można wysłać wiadomości" - INVALID_RECIPIENTS: "Nieprawidłowy adres odbiorcy" - CANT_SAVE_FILTERS: "Nie można zapisać filtrów" - CANT_GET_FILTERS: "Nie można pobrać filtrów" - FILTERS_ARE_NOT_CORRECT: "Filtry sa nieprawidłowe" - CANT_CREATE_FOLDER: "Nie można utworzyć folderu" - CANT_RENAME_FOLDER: "Nie można zmienić nazwy folderu" - CANT_DELETE_FOLDER: "Nie można usunąć folderu" - CANT_DELETE_NON_EMPTY_FOLDER: "Nie można usunąć folderu w którym znajdują się wiadomości" - CANT_SUBSCRIBE_FOLDER: "Nie można przypisać folderu" - CANT_UNSUBSCRIBE_FOLDER: "Nie można wypisać z folderu" - CANT_SAVE_SETTINGS: "Nie można zmienić ustawień" - CANT_SAVE_PLUGIN_SETTINGS: "Nie mozna zmienić ustawień wtyczki" - DOMAIN_ALREADY_EXISTS: "Domena już istnieje" - CANT_INSTALL_PACKAGE: "Nieudana instalacja pakietu" - CANT_DELETE_PACKAGE: "Nieudane usunięcie pakietu" - INVALID_PLUGIN_PACKAGE: "Nieprawidłowy pakiet rozszerzenia" - UNSUPPORTED_PLUGIN_PACKAGE: "Nieobsługiwany pakiet rozszerzenia" - LICENSING_SERVER_IS_UNAVAILABLE: "Serwer subskrypcji jest niedostępny" - LICENSING_DOMAIN_EXPIRED: "Subskrypcja dla tej domeny wygasła" - LICENSING_DOMAIN_BANNED: "Subskrypcja dla tej domeny została zablokowana" - DEMO_SEND_MESSAGE_ERROR: "Ze względów bezpieczeństwa, to konto testowe nie ma możliwości przesyłania, wiadomości na zewnętrzne adresy e-mail." - DEMO_ACCOUNT_ERROR: "Ze względów bezpieczeństwa, ta akcja jest niedozwolona na tym koncie!" - ACCOUNT_ALREADY_EXISTS: "Konto o takiej nazwie już istnieje" - ACCOUNT_DOES_NOT_EXIST: "Konto nie istnieje" - MAIL_SERVER_ERROR: "Wystąpił błąd w trakcie połączenia z serwerem poczty" - INVALID_INPUT_ARGUMENT: "Nieprawidłowy argument" - UNKNOWN_ERROR: "Nieznany błąd" - STATIC: - BACK_LINK: "Odśwież" - DOMAIN_LIST_DESC: "Lista domen do których webmail ma dostęp" - PHP_EXSTENSIONS_ERROR_DESC: "Wymagane rozszerzenia PHP są niedostępne!" - PHP_VERSION_ERROR_DESC: "Aktualnie zainstalowana wersja PHP: (%VERSION%), jest niższa niż minimalnie wymagana 5.3.0!" - NO_SCRIPT_TITLE: "Ta aplikacja wymaga JavaScript" - NO_SCRIPT_DESC: | - Twoja przeglądarka nie obsługuje JavaScript - Proszę o umożliwienie obsługi JavaScript w przeglądarce, oraz ponowne załadowanie tej strony. - NO_COOKIE_TITLE: "Ta aplikacja wymaga plików Cookies" - NO_COOKIE_DESC: | - Obsługa Cookies jest wyłączona w twojej przeglądarce - Proszę o umożliwienie obsługi plików Cookie w przeglądarce oraz ponowne uruchomienie tej strony. - BAD_BROWSER_TITLE: "Twoja przeglądarka jest przestarzała!" - BAD_BROWSER_DESC: | - W celu wykorzystania wszystkich funkcji tej aplikacji, - zaktualizuj aktualnie używaną lub pobierz i zainstaluj jedną z poniższych przeglądarek: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pt_BR.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pt_BR.yml deleted file mode 100755 index 0b1e144c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pt_BR.yml +++ /dev/null @@ -1,714 +0,0 @@ -pt_BR: - LOGIN: - LABEL_EMAIL: "E-mail" - LABEL_LOGIN: "Usuário" - LABEL_PASSWORD: "Senha" - LABEL_SIGN_ME: "Lembrar-me" - LABEL_VERIFICATION_CODE: "Código de verificação" - LABEL_DONT_ASK_VERIFICATION_CODE: "Não perguntar o código por 2 semanas" - BUTTON_SIGN_IN: "Entrar" - TITLE_SIGN_IN_GOOGLE: "Entrar com a conta do Google" - TITLE_SIGN_IN_FACEBOOK: "Entrar com a conta do Facebook" - TITLE_SIGN_IN_TWITTER: "Entrar com a conta do Twitter" - LABEL_FORGOT_PASSWORD: "Esqueceu a senha?" - LABEL_REGISTRATION: "Registre-se" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Adicionar Conta" - BUTTON_SETTINGS: "Configurações" - BUTTON_HELP: "Ajuda" - BUTTON_LOGOUT: "Sair" - MOBILE: - BUTTON_MOBILE_VERSION: "Versão Mobile" - BUTTON_DESKTOP_VERSION: "Versão Desktop" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Pesquisar" - TITLE_ADV: "Pesquisa Avançada" - LABEL_ADV_FROM: "De" - LABEL_ADV_TO: "Para" - LABEL_ADV_SUBJECT: "Assunto" - LABEL_ADV_TEXT: "Texto" - LABEL_ADV_HAS_ATTACHMENT: "Com anexo" - LABEL_ADV_HAS_ATTACHMENTS: "Com anexos" - LABEL_ADV_FLAGGED: "Sinalizada" - LABEL_ADV_UNSEEN: "Não Lida" - LABEL_ADV_DATE: "Data" - LABEL_ADV_DATE_ALL: "Qualquer" - LABEL_ADV_DATE_3_DAYS: "Até 3 dias atrás" - LABEL_ADV_DATE_7_DAYS: "Até 1 semana atrás" - LABEL_ADV_DATE_MONTH: "Até 1 mês atrás" - LABEL_ADV_DATE_3_MONTHS: "Até 3 meses atrás" - LABEL_ADV_DATE_6_MONTHS: "Até 6 meses atrás" - LABEL_ADV_DATE_YEAR: "Até 1 ano atrás" - BUTTON_ADV_SEARCH: "Pesquisar" - PREVIEW_POPUP: - FULLSCREEN: "Em tela cheia" - ZOOM: "Zoom in/out" - CLOSE: "Fechar (Esc)" - LOADING: "Carregando..." - GALLERY_PREV: "Anterior (Seta p/ Esquerda)" - GALLERY_NEXT: "Posterior (Seta p/ Direita)" - GALLERY_COUNTER: "%curr% de %total%" - IMAGE_ERROR: "A imagem não pôde ser carregada." - AJAX_ERROR: "O conteúdo não pôde ser carregado." - FOLDER_LIST: - BUTTON_COMPOSE: "Compor" - BUTTON_CONTACTS: "Contatos" - BUTTON_NEW_MESSAGE: "Nova mensagem" - INBOX_NAME: "Caixa de Entrada" - SENT_NAME: "Enviadas" - DRAFTS_NAME: "Rascunhos" - SPAM_NAME: "Lixo Eletrônico" - TRASH_NAME: "Lixeira" - ARCHIVE_NAME: "Arquivadas" - QUOTA: - TITLE: "Uso do Armazenamento" - MESSAGE_LIST: - BUTTON_RELOAD: "Atualizar Lista de Mensagens" - BUTTON_MOVE_TO: "Mover Para" - BUTTON_DELETE: "Excluir" - BUTTON_ARCHIVE: "Arquivar" - BUTTON_SPAM: "Lixo Eletrônico" - BUTTON_NOT_SPAM: "Não é Lixo Eletrônico" - BUTTON_EMPTY_FOLDER: "Esvaziar Pasta" - BUTTON_MULTY_FORWARD: "Encaminhar mensagens" - BUTTON_DELETE_WITHOUT_MOVE: "Excluir permanentemente" - BUTTON_MORE: "Mais" - MENU_SET_SEEN: "Marcar como lida" - MENU_SET_ALL_SEEN: "Marcar todas como lidas" - MENU_UNSET_SEEN: "Marcar como não lida" - MENU_SET_FLAG: "Sinalizar" - MENU_UNSET_FLAG: "Remover sinalizador" - MENU_SELECT_ALL: "Tudo" - MENU_SELECT_NONE: "Nenhum" - MENU_SELECT_INVERT: "Inverter" - MENU_SELECT_UNSEEN: "Não Lidas" - MENU_SELECT_SEEN: "Lidas" - MENU_SELECT_FLAGGED: "Sinalizadas" - MENU_SELECT_UNFLAGGED: "Não Sinalizadas" - EMPTY_LIST: "Lista Vazia." - EMPTY_SEARCH_LIST: "Nenhuma mensagem corresponde a sua pesquisa." - SEARCH_RESULT_FOR: "Resultados de pesquisa para \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "Voltar para a lista de mensagens" - LIST_LOADING: "Carregando" - EMPTY_SUBJECT_TEXT: "(Sem assunto)" - PUT_MESSAGE_HERE: "Coloque a mensagem aqui para vê-la na lista" - TODAY_AT: "Hoje as %TIME%" - YESTERDAY_AT: "Ontem as %TIME%" - SEARCH_PLACEHOLDER: "Pesquisar" - NEW_MESSAGE_NOTIFICATION: "Você tem %COUNT% novas mensagens!" - QUOTA_SIZE: "Utilizando %SIZE% (%PROC%%) de %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Editar" - BUTTON_BACK: "Voltar" - BUTTON_CLOSE: "Fechar" - BUTTON_DELETE: "Excluir" - BUTTON_UNSUBSCRIBE: "Cancelar a assinatura desta lista" - BUTTON_ARCHIVE: "Arquivar" - BUTTON_SPAM: "Lixo Eletrônico" - BUTTON_NOT_SPAM: "Não é Lixo Eletrônico" - BUTTON_MOVE_TO: "Mover para" - BUTTON_MORE: "Mais" - BUTTON_REPLY: "Responder" - BUTTON_REPLY_ALL: "Responder a todos" - BUTTON_FORWARD: "Encaminhar" - BUTTON_FORWARD_AS_ATTACHMENT: "Encaminhar como anexo" - BUTTON_EDIT_AS_NEW: "Editar como novo" - BUTTON_SHOW_IMAGES: "Exibir Imagens" - BUTTON_NOTIFY_READ_RECEIPT: "O emissor pediu para ser notificado quando você lesse essa mensagem." - BUTTON_IN_NEW_WINDOW: "Ver em janela separada" - BUTTON_THREAD_LIST: "Tópicos da Conversa" - BUTTON_THREAD_PREV: "Anterior" - BUTTON_THREAD_NEXT: "Próximo" - BUTTON_THREAD_MORE: "Mais mensagens" - MENU_HEADERS: "Mostrar cabeçalho das mensagens" - MENU_VIEW_ORIGINAL: "Mostrar original" - MENU_DOWNLOAD_ORIGINAL: "Baixar como arquivo .eml" - MENU_FILTER_SIMILAR: "Filtrar mensagens como esta" - MENU_PRINT: "Imprimir" - EMPTY_SUBJECT_TEXT: "(Sem assunto)" - LABEL_SUBJECT: "Assunto" - LABEL_DATE: "Data" - LABEL_FROM: "De" - LABEL_FROM_SHORT: "de" - LABEL_TO: "Para" - LABEL_TO_SHORT: "para" - LABEL_CC: "Cc" - LABEL_BCC: "Cco" - LABEL_REPLY_TO: "Responder para" - PRINT_LABEL_FROM: "De" - PRINT_LABEL_TO: "Para" - PRINT_LABEL_CC: "Cc" - PRINT_LABEL_BCC: "Cco" - PRINT_LABEL_REPLY_TO: "Responder para" - PRINT_LABEL_DATE: "Data" - PRINT_LABEL_SUBJECT: "Assunto" - PRINT_LABEL_ATTACHMENTS: "Anexos" - MESSAGE_LOADING: "Carregando" - MESSAGE_VIEW_DESC: "Selecione uma mensagem para visualizá-la aqui." - MESSAGE_VIEW_MOVE_DESC: "Clique no nome da pasta no painel esquerdo para selecionar o destino." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Senha" - PGP_SIGNED_MESSAGE_DESC: "Mensagem assinada com OpenPGP (clique para verificar)" - PGP_ENCRYPTED_MESSAGE_DESC: "Mensagem criptografada com OpenPGP (clique para descriptografar)" - LINK_DOWNLOAD_AS_ZIP: "Baixar como zip" - LINK_SAVE_TO_OWNCLOUD: "Salvar no ownCloud" - LINK_SAVE_TO_DROPBOX: "Salvar no Dropbox" - READ_RECEIPT: - SUBJECT: "Aviso de recepção (Visualizada) - %SUBJECT%" - BODY: | - Comprovante de retorno para o e-mail que você enviou para %READ-RECEIPT%. - - Nota: Este comprovante de retorno apenas reconhece que a mensagem foi exibida no computador do destinatário. - Não há garantia de que o destinatário tenha lido ou compreendido o conteúdo da mensagem. - SUGGESTIONS: - SEARCHING_DESC: "Procurando..." - CONTACTS: - LEGEND_CONTACTS: "Contatos" - SEARCH_INPUT_PLACEHOLDER: "Pesquisar" - BUTTON_ADD_CONTACT: "Adicionar Contato" - BUTTON_CREATE_CONTACT: "Criar" - BUTTON_UPDATE_CONTACT: "Atualizar" - BUTTON_IMPORT: "Importar (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Exportar (vcf, vCard)" - BUTTON_EXPORT_CSV: "Exportar (csv)" - ERROR_IMPORT_FILE: "Erro ao importar (formato de arquivo inválido)" - LIST_LOADING: "Carregando" - EMPTY_LIST: "Nenhum contato aqui" - EMPTY_SEARCH: "Nenhum contato encontrado" - CLEAR_SEARCH: "Limpar pesquisa" - CONTACT_VIEW_DESC: "Selecione um contato na lista para visualizá-lo." - LABEL_DISPLAY_NAME: "Nome de Exibição" - LABEL_EMAIL: "E-mail" - LABEL_PHONE: "Telefone" - LABEL_WEB: "Web" - LABEL_BIRTHDAY: "Aniversário" - LINK_ADD_EMAIL: "Adicionar um endereço e-mail" - LINK_ADD_PHONE: "Adicionar um telefone" - LINK_BIRTHDAY: "Aniversário" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Digite o nome de exibição" - PLACEHOLDER_ENTER_LAST_NAME: "Digite o sobrenome" - PLACEHOLDER_ENTER_FIRST_NAME: "Digite o primeiro nome" - PLACEHOLDER_ENTER_NICK_NAME: "Digite o apelido" - LABEL_READ_ONLY: "Somente Leitura" - LABEL_SHARE: "Compartilhar" - ADD_MENU_LABEL: "Adicionar" - ADD_MENU_NICKNAME: "Apelido" - ADD_MENU_NOTES: "Observações" - ADD_MENU_EMAIL: "E-mail" - ADD_MENU_PHONE: "Telefone" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Endereço" - ADD_MENU_BIRTHDAY: "Aniversário" - ADD_MENU_TAGS: "Tags" - BUTTON_SHARE_NONE: "Ninguém" - BUTTON_SHARE_ALL: "Todos" - BUTTON_SYNC: "Sincronização (CardDAV)" - COMPOSE: - TITLE_FROM: "De" - TITLE_TO: "Para" - TITLE_CC: "Cc" - TITLE_BCC: "Cco" - TITLE_REPLY_TO: "Responder para" - TITLE_SUBJECT: "Assunto" - LINK_SHOW_INPUTS: "Exibir todos os campos" - BUTTON_SEND: "Enviar" - BUTTON_SAVE: "Salvar" - BUTTON_DELETE: "Excluir" - BUTTON_CANCEL: "Cancelar" - BUTTON_MINIMIZE: "Minimizar" - SAVED_TIME: "Salvo às %TIME%" - SAVED_ERROR_ON_SEND: "Sua mensagem foi enviada mas não foi salva na pasta de itens enviados." - DISCARD_UNSAVED_DATA: "Descartar os dados não-salvos?" - ATTACH_FILES: "Anexar arquivos" - ATTACH_DROP_FILES_DESC: "Arraste os arquivos aqui" - ATTACH_ITEM_CANCEL: "Cancelar" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% escreveu" - FORWARD_MESSAGE_TOP_TITLE: "-------- Mensagem Encaminhada -------" - FORWARD_MESSAGE_TOP_FROM: "De" - FORWARD_MESSAGE_TOP_TO: "Para" - FORWARD_MESSAGE_TOP_CC: "CC" - FORWARD_MESSAGE_TOP_SENT: "Recebida" - FORWARD_MESSAGE_TOP_SUBJECT: "Assunto" - EMPTY_TO_ERROR_DESC: "Por favor, especifique pelo menos um destinatário" - NO_ATTACHMENTS_HERE_DESC: "Não há anexos aqui." - ATTACHMENTS_ERROR_DESC: "Alerta! Nem todos os arquivos foram anexados." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Alguns anexos ainda não foram completamente enviados" - BUTTON_REQUEST_READ_RECEIPT: "Pedir recibo de leitura" - BUTTON_MARK_AS_IMPORTANT: "Marcar como importante" - BUTTON_OPEN_PGP: "OpenPGP (Somente Texto)" - BUTTON_REQUEST_DSN: "Pedir recibo de entrega" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Fechar" - POPUPS_ASK: - BUTTON_YES: "Sim" - BUTTON_NO: "Não" - DESC_WANT_CLOSE_THIS_WINDOW: "Você tem certeza que deseja fechar esta janela?" - DESC_WANT_DELETE_MESSAGES: "Você tem certeza de que deseja excluir essa(s) mensagem(s)?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Escolha o idioma" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Nova conta" - BUTTON_ADD_ACCOUNT: "Adicionar" - TITLE_UPDATE_ACCOUNT: "Atualizar Conta?" - BUTTON_UPDATE_ACCOUNT: "Atualizar" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Adicionar identidade" - TITLE_UPDATE_IDENTITY: "Atualizar identidade?" - BUTTON_ADD_IDENTITY: "Adicionar" - BUTTON_UPDATE_IDENTITY: "Atualizar" - LABEL_EMAIL: "E-mail" - LABEL_NAME: "Nome" - LABEL_REPLY_TO: "Responder para" - LABEL_SIGNATURE: "Assinatura" - LABEL_CC: "Cc" - LABEL_BCC: "Cco" - LABEL_SIGNATURE_INSERT_BEFORE: "Inserir esta assinatura antes do texto citado nas respostas" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Nova pasta" - LABEL_NAME: "Nome da pasta" - LABEL_PARENT: "Pasta principal" - BUTTON_CREATE: "Criar" - BUTTON_CANCEL: "Cancelar" - BUTTON_CLOSE: "Fechar" - TITLE_CREATING_PROCESS: "Criando a pasta" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Excluir todas as mensagens da pasta?" - BUTTON_CLEAR: "Limpar" - BUTTON_CANCEL: "Cancelar" - BUTTON_CLOSE: "Fechar" - DANGER_DESC_WARNING: "Atenção!" - DANGER_DESC_HTML_1: "Esta ação irá resultar na remoção de todos os e-mails da pasta %FOLDER%." - DANGER_DESC_HTML_2: "Uma vez iniciado, o processo não poderá ser interrompido ou cancelado." - TITLE_CLEARING_PROCESS: "Excluindo a pasta..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Importar chave OpenPGP" - BUTTON_IMPORT_OPEN_PGP_KEY: "Importar" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Ver chave OpenPGP" - BUTTON_SELECT: "Selecionar" - BUTTON_CLOSE: "Fechar" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Gerar chave OpenPGP" - LABEL_EMAIL: "E-mail" - LABEL_NAME: "Nome" - LABEL_PASSWORD: "Senha" - LABEL_KEY_BIT_LENGTH: "Tamanho da chave" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Gerar" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP Assinar/Criptografar" - LABEL_SIGN: "Assinar" - LABEL_ENCRYPT: "Criptografar" - LABEL_PASSWORD: "Senha" - BUTTON_SIGN: "Assinar" - BUTTON_ENCRYPT: "Criptografar" - BUTTON_SIGN_AND_ENCRYPT: "Assinar e criptografar" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" - LABEL_KEY: "Private Key" - LABEL_PASSWORD: "Password" - BUTTON_DECRYPT: "Decrypt" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "Testar verificação de duas etapas" - LABEL_CODE: "Código" - BUTTON_TEST: "Testar" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Criar um filtro?" - TITLE_EDIT_FILTER: "Atualizar filtro?" - FILTER_NAME: "Nome" - LEGEND_CONDITIONS: "Condições" - LEGEND_ACTIONS: "Ações" - BUTTON_DONE: "Concluir" - BUTTON_ADD_CONDITION: "Adicionar uma Condição" - SELECT_ACTION_NONE: "Nenhuma" - SELECT_ACTION_MOVE_TO: "Mover para" - SELECT_ACTION_FORWARD_TO: "Encaminhar para" - SELECT_ACTION_REJECT: "Rejeitar" - SELECT_ACTION_VACATION_MESSAGE: "Mensagem de férias" - SELECT_ACTION_DISCARD: "Descartar" - SELECT_FIELD_FROM: "De" - SELECT_FIELD_RECIPIENTS: "Destinatários (Para ou Cc)" - SELECT_FIELD_SUBJECT: "Assunto" - SELECT_FIELD_HEADER: "Cabeçalho" - SELECT_FIELD_SIZE: "Tamanho" - SELECT_TYPE_CONTAINS: "Contém" - SELECT_TYPE_NOT_CONTAINS: "Não Contém" - SELECT_TYPE_MATCHES: "Corresponde (* e ? são suportados)" - SELECT_TYPE_NOT_MATCHES: "Não Corresponde (* e ? são suportados)" - SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Não Regexp" - SELECT_TYPE_EQUAL_TO: "Igual à" - SELECT_TYPE_NOT_EQUAL_TO: "Não é igual à" - SELECT_TYPE_OVER: "Maior que" - SELECT_TYPE_UNDER: "Menor que" - SELECT_MATCH_ANY: "Corresponde à qualquer regra seguinte" - SELECT_MATCH_ALL: "Corresponde à todas as regras seguintes" - MARK_AS_READ_LABEL: "Marcar como Lida" - REPLY_INTERVAL_LABEL: "Responder intervalo (dias)" - KEEP_LABEL: "Manter" - STOP_LABEL: "Não parar o processamento das regras" - EMAIL_LABEL: "Email" - VACATION_SUBJECT_LABEL: "Assunto (opcional)" - VACATION_MESSAGE_LABEL: "Mensagem" - VACATION_RECIPIENTS_LABEL: "Destinatários (separados por vírgulas)" - REJECT_MESSAGE_LABEL: "Rejeitar mensagem" - ALL_INCOMING_MESSAGES_DESC: "Todas as mensagens recebidas" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Selecionar pastas do sistema" - SELECT_CHOOSE_ONE: "Selecione uma" - SELECT_UNUSE_NAME: "Não usar" - LABEL_SENT: "Enviadas" - LABEL_DRAFTS: "Rascunhos" - LABEL_SPAM: "Lixo Eletrônico" - LABEL_TRASH: "Lixeira" - LABEL_ARCHIVE: "Arquivadas" - BUTTON_CANCEL: "Cancelar" - BUTTON_CLOSE: "Fechar" - NOTIFICATION_SENT: | - Você não selecionou a pasta "Enviadas" do sistema que será colocada as mensagens após o envio. - Se você não quiser salvar a mensagem enviada, por favor selecione a opção"Não usar". - NOTIFICATION_DRAFTS: "Você não selecionou a pasta \"Rascunhos\" do sistema que será colocada as mensagens salvas durante a composição." - NOTIFICATION_SPAM: | - Você não selecionou a pasta "Lixo Eletrônico" do sistema que será colocada as mensagens spams. - Se você deseja remover a mensagem permanentemente, por favor selecione a opção"Não usar". - NOTIFICATION_TRASH: | - Você não selecionou a pasta do sistema que serão colocadas as mensagens excluídas. - Se você deseja remover a mensagem permanentemente, por favor selecione a opção"Não usar". - NOTIFICATION_ARCHIVE: "Você não selecionou a pasta \"Arquivadas\" do sistema que serão colocadas as mensagens arquivadas." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "Verificação de duas etapas" - LABEL_ENABLE_TWO_FACTOR: "Habilitar verificação de duas etapas" - LABEL_TWO_FACTOR_USER: "Usuário" - LABEL_TWO_FACTOR_STATUS: "Status" - LABEL_TWO_FACTOR_SECRET: "Segredo" - LABEL_TWO_FACTOR_BACKUP_CODES: "Códigos de backup" - BUTTON_CREATE: "Criar novo segredo" - BUTTON_ACTIVATE: "Ativar" - BUTTON_CLEAR: "Limpar" - BUTTON_LOGOUT: "Sair" - BUTTON_DONE: "Completo" - BUTTON_TEST: "Testar" - LINK_TEST: "teste" - BUTTON_SHOW_SECRET: "Mostrar segredo" - BUTTON_HIDE_SECRET: "Esconder segredo" - TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configurado" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Não configurado" - TWO_FACTOR_SECRET_DESC: >- - Importe este código no seu cliente Google Authenticator (ou outro cliente - TOTP) usando o QR code abaixo ou informando o código manualmente. - TWO_FACTOR_BACKUP_CODES_DESC: >- - Se você não puder receber os códigos via Google Authenticator, você pode usar - esses códigos de backup para acessar sua conta. Depois de você usar um código - de backup, ele se expira. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Você não pode alterar essa configuração antes do teste." - TITLES: - LOADING: "Carregando" - LOGIN: "Login" - MAILBOX: "Caixa de Correio" - SETTINGS: "Configurações" - COMPOSE: "Compor" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "O arquivo é muito grande" - ERROR_FILE_PARTIALLY_UPLOADED: "O arquivo foi apenas parcialmente enviado devido a um erro desconhecido" - ERROR_NO_FILE_UPLOADED: "Arquivo não enviado" - ERROR_MISSING_TEMP_FOLDER: "O arquivo temporário está faltando" - ERROR_ON_SAVING_FILE: "Ocorreu um erro de envio de arquivo desconhecido" - ERROR_FILE_TYPE: "Tipo de arquivo inválido" - ERROR_UNKNOWN: "Ocorreu um erro de envio de arquivo desconhecido" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXTO" - TEXT_SWITCHER_RICH_FORMATTING: "Formatação avançada" - TEXT_SWITCHER_CONFIRM: "A formatação de texto e as imagens serão perdidas. Tem certeza de que deseja continuar?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Pessoal" - LABEL_GENERAL_NAME: "Geral" - LABEL_CONTACTS_NAME: "Contatos" - LABEL_FOLDERS_NAME: "Pastas" - LABEL_ACCOUNTS_NAME: "Contas" - LABEL_IDENTITY_NAME: "Identidade" - LABEL_IDENTITIES_NAME: "Identidades" - LABEL_FILTERS_NAME: "Filtros" - LABEL_TEMPLATES_NAME: "Templates" - LABEL_SECURITY_NAME: "Segurança" - LABEL_SOCIAL_NAME: "Social" - LABEL_THEMES_NAME: "Temas" - LABEL_CHANGE_PASSWORD_NAME: "Senha" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Voltar" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filtros" - BUTTON_SAVE: "Salvar" - BUTTON_ADD_FILTER: "Adicionar um Filtro" - BUTTON_DELETE: "Deletar" - BUTTON_RAW_SCRIPT: "Usar Script de usuário personalizado" - SUBNAME_NONE: "Nenhum" - SUBNAME_MOVE_TO: "Mover para \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Encaminhar para \"%EMAIL%\"" - SUBNAME_REJECT: "Rejeitar" - SUBNAME_VACATION_MESSAGE: "Mensagem de férias" - SUBNAME_DISCARD: "Descartar" - CAPABILITY_LABEL: "Capacidade" - LOADING_PROCESS: "Atualizando Lista de filtros" - DELETING_ASK: "Você tem certeza?" - CHACHES_NEED_TO_BE_SAVED_DESC: "Estas alterações precisam ser salvas no servidor." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identidade" - LABEL_DISPLAY_NAME: "Nome" - LABEL_REPLY_TO: "Responder para" - LABEL_SIGNATURE: "Assinatura" - LABEL_ADD_SIGNATURE_TO_ALL: "Adicionar sua assinatura em todas as mensagens de saída" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Segurança" - LABEL_CONFIGURE_TWO_FACTOR: "Configurar verificação de 2 etapas" - LABEL_AUTOLOGOUT: "Deslogar Automaticamente" - AUTOLOGIN_NEVER_OPTION_NAME: "Nunca" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minutos" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hora(s)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Geral" - LABEL_LANGUAGE: "Idioma" - LABEL_IDENTITY: "Identidade" - LABEL_LAYOUT: "Painel de Leitura" - LABEL_LAYOUT_NO_SPLIT: "Sem divisão" - LABEL_LAYOUT_VERTICAL_SPLIT: "Divisão Vertical" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Divisão Horizontal" - LABEL_EDITOR: "Editor de texto padrão" - LABEL_EDITOR_HTML: "Html" - LABEL_EDITOR_PLAIN: "Texto Simples" - LABEL_EDITOR_HTML_FORCED: "Html (forçado)" - LABEL_EDITOR_PLAIN_FORCED: "Texto Simples (forçado)" - LABEL_ANIMATION: "Animação de interface" - LABEL_ANIMATION_FULL: "Completa" - LABEL_ANIMATION_NORMAL: "Normal" - LABEL_ANIMATION_NONE: "Nenhuma" - LABEL_VIEW_OPTIONS: "Opções de Visualização" - LABEL_USE_PREVIEW_PANE: "Usar painel de pré-visualização" - LABEL_USE_CHECKBOXES_IN_LIST: "Exibir caixas de seleção na lista" - LABEL_USE_THREADS: "Agrupar mensagens por conversa" - LABEL_REPLY_SAME_FOLDER: "Colocar resposta na mesma pasta da mensagem respondida" - LABEL_SHOW_IMAGES: "Sempre exibir imagens no corpo da mensagem" - LABEL_SHOW_ANIMATION: "Mostrar animação" - LABEL_MESSAGE_PER_PAGE: "Mensagens por Página" - LABEL_NOTIFICATIONS: "Notificações" - LABEL_SOUND_NOTIFICATION: "Notificação sonora" - LABEL_CHROME_NOTIFICATION_DESC: "Mostrar notificação popup para novas mensagens" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Bloqueado pelo navegador)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Contatos" - LABEL_CONTACTS_AUTOSAVE: "Adicionar automaticamente os destinatários na lista de endereços" - LEGEND_CONTACTS_SYNC: "Sincronização remota (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Habilitar sincronização remota" - LABEL_CONTACTS_SYNC_SERVER: "Servidor" - LABEL_CONTACTS_SYNC_AB_URL: "URL da lista de contatos" - LABEL_CONTACTS_SYNC_USER: "Usuário" - LABEL_CONTACTS_SYNC_PASSWORD: "Senha" - SETTINGS_THEMES: - LEGEND_THEMES: "Temas" - LEGEND_THEMES_CUSTOM: "Configurar tema personalizado" - LABEL_CUSTOM_TYPE: "Tipo" - LABEL_CUSTOM_TYPE_LIGHT: "Claro" - LABEL_CUSTOM_TYPE_DARK: "Escuro" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Plano de fundo" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Enviar imagem de plano de fundo(JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "Arquivo muito grande" - ERROR_FILE_TYPE_ERROR: "Tipo de arquivo inválido (somente JPG e PNG)" - ERROR_UNKNOWN: "Ocorreu um erro de envio de arquivo desconhecido" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Conectar ao Google" - BUTTON_GOOGLE_DISCONNECT: "Desconectar do Google" - MAIN_GOOGLE_DESC: "Depois de ativar com o login do Google, você poderá entrar nessa conta utilizando o botão Google na tela de login." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Conectar ao Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Desconectar do Facebook" - MAIN_FACEBOOK_DESC: "Depois de ativar com o login do Facebook, você poderá entrar nessa conta utilizando o botão Facebook na tela de login." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Conectar ao Twitter" - BUTTON_TWITTER_DISCONNECT: "Desconectar do Twitter" - MAIN_TWITTER_DESC: "Depois de ativar com o login do Twitter, você poderá entrar nessa conta utilizando o botão Twitter na tela de login" - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Lista de pastas" - BUTTON_CREATE: "Criar pasta" - BUTTON_SYSTEM: "Pastas do Sistema" - BUTTON_DELETE: "Excluir" - BUTTON_SUBSCRIBE: "Acompanhar" - BUTTON_UNSUBSCRIBE: "Não acompanhar" - LOADING_PROCESS: "Atualizar lista de pastas" - CREATING_PROCESS: "Criando a pasta" - DELETING_PROCESS: "Excluindo a pasta" - RENAMING_PROCESS: "Renomeando a pasta" - DELETING_ASK: "Você tem certeza?" - TO_MANY_FOLDERS_DESC_1: "Você possui muitas pastas!" - TO_MANY_FOLDERS_DESC_2: "Mostraremos apenas uma parte delas, para evitar problemas de desempenho." - HELP_DELETE_FOLDER: "Deletar pasta" - HELP_SHOW_HIDE_FOLDER: "Mostrar/esconder pasta" - HELP_CHECK_FOR_NEW_MESSAGES: "Ativar/Desativar verificação por novas mensagens" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Lista de contas" - LEGEND_IDENTITIES: "Identidades" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Contas e Identidades" - BUTTON_ADD_ACCOUNT: "Adicionar uma conta" - BUTTON_ADD_IDENTITY: "Adicionar uma identidade" - BUTTON_DELETE: "Excluir" - LOADING_PROCESS: "Atualizando a lista de contas" - DELETING_ASK: "Você tem certeza?" - DEFAULT_IDENTITY_LABEL: "padrão" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identidade" - LEGEND_IDENTITIES: "Identidades adicionais" - LABEL_DEFAULT: "Padrão" - LABEL_DISPLAY_NAME: "Nome" - LABEL_REPLY_TO: "Responder para" - LABEL_SIGNATURE: "Assinatura" - LABEL_ADD_SIGNATURE_TO_ALL: "Adicionar sua assinatura em todas as mensagens de saída" - BUTTON_ADD_IDENTITY: "Adicionar identidade" - BUTTON_DELETE: "Excluir" - LOADING_PROCESS: "Atualizando a lista de identidades" - DELETING_ASK: "Você tem certeza?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Mudar a Senha" - LABEL_CURRENT_PASSWORD: "Senha atual" - LABEL_NEW_PASSWORD: "Nova senha" - LABEL_REPEAT_PASSWORD: "Repita a nova senha" - BUTTON_UPDATE_PASSWORD: "Definir nova senha" - ERROR_PASSWORD_MISMATCH: "As senhas não conferem, por favor tente novamente" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Importa chave OpenPGP" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Gerar chave OpenPGP" - TITLE_PRIVATE: "Privado" - TITLE_PUBLIC: "Público" - DELETING_ASK: "Você tem certeza?" - GENERATE_ONLY_HTTPS: "HTTPS only" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Ajuda com os atalhos de teclado" - TAB_MAILBOX: "Caixa de correio" - TAB_MESSAGE_LIST: "Lista de mensagens" - TAB_MESSAGE_VIEW: "Visualização de mensagem" - TAB_COMPOSE: "Composição" - LABEL_OPEN_USER_DROPDOWN: "Abrir menu de usuário" - LABEL_REPLY: "Responder" - LABEL_REPLY_ALL: "Responder todos" - LABEL_FORWARD: "Encaminhar" - LABEL_FORWARD_MULTIPLY: "Encaminhar como anexo" - LABEL_HELP: "Ajuda" - LABEL_CHECK_ALL: "Selecionar todas as mensagens" - LABEL_ARCHIVE: "Arquivar" - LABEL_DELETE: "Excluir" - LABEL_OPEN_THREAD: "Abrir conversa selecionada" - LABEL_MOVE: "Mover" - LABEL_READ: "Marcar mensagens selecionadas como lidas" - LABEL_UNREAD: "Marcar mensagens selecionadas como não lidas" - LABEL_IMPORTANT: "Sinalizar mensagens selecionadas" - LABEL_SEARCH: "Pesquisar" - LABEL_CANCEL_SEARCH: "Cancelar pesquisa" - LABEL_FULLSCREEN_ENTER: "Tela-cheia (Com pré-visualização)" - LABEL_VIEW_MESSAGE_ENTER: "Ver mensagem (Sem pré-visualização)" - LABEL_SWITCH_TO_MESSAGE: "Mudar o foco para mensagem selecionada" - LABEL_SWITCH_TO_FOLDER_LIST: "Mudar o foco para a lista de pastas" - LABEL_FULLSCREEN_TOGGLE: "Alternar modo tela-cheia" - LABEL_BLOCKQUOTES_TOGGLE: "Alternar blocos de citações de mensagem" - LABEL_THREAD_NEXT: "Mensagem seguinte na conversa" - LABEL_THREAD_PREV: "Mensagem anterior na conversa" - LABEL_PRINT: "Imprimir" - LABEL_EXIT_FULLSCREEN: "Sair do modo tela-cheia" - LABEL_CLOSE_MESSAGE: "Fechar mensagem (Sem pré-visualização)" - LABEL_SWITCH_TO_LIST: "Mudar o foco volta para a lista de mensagens" - LABEL_OPEN_COMPOSE_POPUP: "Abrir pop-up de composição" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Abrir menu de identidades" - LABEL_SAVE_MESSAGE: "Salvar mensagem" - LABEL_SEND_MESSAGE: "Enviar mensagem" - LABEL_CLOSE_COMPOSE: "Fechar composição" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "Nenhuma chave pública encontrada" - NO_PUBLIC_KEYS_FOUND_FOR: "Nenhuma chave pública encontrada para o e-mail \"%EMAIL%\"" - NO_PRIVATE_KEY_FOUND: "Nenhuma chave privada encontrada" - NO_PRIVATE_KEY_FOUND_FOR: "Nenhuma chave privada encontrada para o e-mail \"%EMAIL%\"" - ADD_A_PUBLICK_KEY: "Adicionar uma chave pública" - SELECT_A_PRIVATE_KEY: "Selecione a chave privada" - UNVERIFIRED_SIGNATURE: "Assinatura não verificada" - DECRYPTION_ERROR: "Erro de decripitação de OpenPGP" - GOOD_SIGNATURE: "Boa assinatura de %USER%" - PGP_ERROR: "Erro OpenPGP: %ERROR%" - SPECIFY_FROM_EMAIL: "Por favor, especifique endereço de e-mail remetente" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Especifique pelo menos um destinatário" - NOTIFICATIONS: - INVALID_TOKEN: "Senha inválida" - AUTH_ERROR: "Falha na autenticação" - ACCESS_ERROR: "Erro ao acessar" - CONNECTION_ERROR: "Não foi possível conectar-se ao servidor" - CAPTCHA_ERROR: "Verificação CAPTCHA incorreta." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Esta ID social não é atribuído para qualquer conta de e-mail ainda. Entre - usando suas credenciais de e-mail e ative o recursso de logar pelo Facebook - em configurações de conta. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Esta ID social não é atribuído para qualquer conta de e-mail ainda. Entre - usando suas credenciais de e-mail e ative o recursso de logar pelo Twitter - em configurações de conta. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Esta ID social não é atribuído para qualquer conta de e-mail ainda. Entre - usando suas credenciais de e-mail e ative o recursso de logar pelo Google - em configurações de conta. - DOMAIN_NOT_ALLOWED: "Este domínio não é permitido" - ACCOUNT_NOT_ALLOWED: "Conta não permitida" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Verificação de duas etapas requerida" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Erro na verificação de duas etapas" - COULD_NOT_SAVE_NEW_PASSWORD: "Não foi possível salvar a nova senha" - CURRENT_PASSWORD_INCORRECT: "Senha atual incorreta" - NEW_PASSWORD_SHORT: "A senha é muito curta" - NEW_PASSWORD_WEAK: "A senha é muito fácil" - NEW_PASSWORD_FORBIDDENT: "A senha contém caracteres não permitidos" - CONTACTS_SYNC_ERROR: "Erro na sincronização dos contatos" - CANT_GET_MESSAGE_LIST: "Não foi possível obter a lista de mensagens" - CANT_GET_MESSAGE: "Não foi possível obter a mensagem" - CANT_DELETE_MESSAGE: "Não foi possível excluir a mensagem" - CANT_MOVE_MESSAGE: "Não foi possível mover a mensagem" - CANT_SAVE_MESSAGE: "Não foi possível salvar a mensagem" - CANT_SEND_MESSAGE: "Não foi possível enviar a mensagem" - INVALID_RECIPIENTS: "Destinatário inválido" - CANT_SAVE_FILTERS: "Não é possível salvar os filtros" - CANT_GET_FILTERS: "Não é possível obter os filtros" - FILTERS_ARE_NOT_CORRECT: "Os filtros não estão corretos" - CANT_CREATE_FOLDER: "Não foi possível criar a pasta" - CANT_RENAME_FOLDER: "Não foi possível renomear a pasta" - CANT_DELETE_FOLDER: "Não foi possível exluir a pasta" - CANT_DELETE_NON_EMPTY_FOLDER: "Não é possível excluir diretório não vazio" - CANT_SUBSCRIBE_FOLDER: "Não foi possível inscrever esta pasta" - CANT_UNSUBSCRIBE_FOLDER: "Não foi possível desinscrever esta pasta" - CANT_SAVE_SETTINGS: "Não foi possível salvar as configurações" - CANT_SAVE_PLUGIN_SETTINGS: "Não foi possível salvar as configurações" - DOMAIN_ALREADY_EXISTS: "O domínio já existe" - CANT_INSTALL_PACKAGE: "Erro ao instalar pacote de plugin" - CANT_DELETE_PACKAGE: "Erro ao remover pacote de plugin" - INVALID_PLUGIN_PACKAGE: "Pacote de plugins inválido" - UNSUPPORTED_PLUGIN_PACKAGE: "Pacote de plugins insuportados" - LICENSING_SERVER_IS_UNAVAILABLE: "A assinatura do servidor está indisponível" - LICENSING_DOMAIN_EXPIRED: "A assinatura para este domínio expirou." - LICENSING_DOMAIN_BANNED: "A assinatura para este domínio é proibida." - DEMO_SEND_MESSAGE_ERROR: "Por motivos de segurança, esta conta demo não tem permissão para enviar mensagens para endereços de e-mail externo!" - DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" - ACCOUNT_ALREADY_EXISTS: "Esta conta já existe" - ACCOUNT_DOES_NOT_EXIST: "Conta não existente" - MAIL_SERVER_ERROR: "Ocorreu um erro ao acessar o servidor de e-mail" - INVALID_INPUT_ARGUMENT: "Argumento de entrada inválido" - UNKNOWN_ERROR: "Erro desconhecido" - STATIC: - BACK_LINK: "Recarregar" - DOMAIN_LIST_DESC: "A lista de domínios de webmail tem permissão para acessar." - PHP_EXSTENSIONS_ERROR_DESC: "Extensões necessárias PHP não estão disponíveis na sua configuração do PHP!" - PHP_VERSION_ERROR_DESC: "Sua versão PHP (%VERSION%) é menor do que o mínimo exigido 5.3.0!" - NO_SCRIPT_TITLE: "JavaScript é necessário para esta aplicação." - NO_SCRIPT_DESC: | - O JavaScript não está disponível em seu navegador. - Por favor ative o suporte a JavaScript nas configurações do seu navegador e tente novamente. - NO_COOKIE_TITLE: "É necessário suporte a cookies para esta aplicação." - NO_COOKIE_DESC: | - Os Cookies não estão disponíveis em seu navegador. - Por favor ative o suporte a Cookies nas configurações do seu navegador e tente novamente. - BAD_BROWSER_TITLE: "Seu navegador está desatualizado." - BAD_BROWSER_DESC: | - Para usar todos os recursos do aplicativo, - baixe e instale um desses navegadores: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pt_PT.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pt_PT.yml deleted file mode 100755 index ef6d67d0..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/pt_PT.yml +++ /dev/null @@ -1,704 +0,0 @@ -pt_PT: - LOGIN: - LABEL_EMAIL: "Email" - LABEL_LOGIN: "Utilizador" - LABEL_PASSWORD: "Palavra-passe" - LABEL_SIGN_ME: "Lembrar-me" - LABEL_VERIFICATION_CODE: "Código de verificação" - LABEL_DONT_ASK_VERIFICATION_CODE: "Não pedir o código durante 2 semanas" - BUTTON_SIGN_IN: "Entrar" - TITLE_SIGN_IN_GOOGLE: "Entre com a conta do Google" - TITLE_SIGN_IN_FACEBOOK: "Entre com a conta do Facebook" - TITLE_SIGN_IN_TWITTER: "Entre com a conta do Twitter" - LABEL_FORGOT_PASSWORD: "Esqueci-me da palavra-passe" - LABEL_REGISTRATION: "Registo" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Adicionar conta" - BUTTON_SETTINGS: "Definições" - BUTTON_HELP: "Ajuda" - BUTTON_LOGOUT: "Sair" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Pesquisar" - TITLE_ADV: "Pesquisa avançada" - LABEL_ADV_FROM: "De" - LABEL_ADV_TO: "Para" - LABEL_ADV_SUBJECT: "Assunto" - LABEL_ADV_TEXT: "Texto" - LABEL_ADV_HAS_ATTACHMENT: "Tem anexo" - LABEL_ADV_HAS_ATTACHMENTS: "Tem anexos" - LABEL_ADV_FLAGGED: "Sinalizada" - LABEL_ADV_UNSEEN: "Não lida" - LABEL_ADV_DATE: "Data" - LABEL_ADV_DATE_ALL: "Qualquer" - LABEL_ADV_DATE_3_DAYS: "Até 3 dias atrás" - LABEL_ADV_DATE_7_DAYS: "Até 1 semana atrás" - LABEL_ADV_DATE_MONTH: "Até 1 mês atrás" - LABEL_ADV_DATE_3_MONTHS: "Até 3 meses atrás" - LABEL_ADV_DATE_6_MONTHS: "Até 6 meses atrás" - LABEL_ADV_DATE_YEAR: "Até 1 ano atrás" - BUTTON_ADV_SEARCH: "Pesquisar" - PREVIEW_POPUP: - FULLSCREEN: "Alternar ecrã-inteiro" - ZOOM: "Zoom +/-" - CLOSE: "Fechar (Esc)" - LOADING: "A carregar..." - GALLERY_PREV: "Anterior (seta p/ esquerda)" - GALLERY_NEXT: "Próxima (seta p/ direita)" - GALLERY_COUNTER: "%curr% de %total%" - IMAGE_ERROR: "Imagem não pode ser carregado." - AJAX_ERROR: "Conteúdo não pode ser carregado." - FOLDER_LIST: - BUTTON_COMPOSE: "Compor" - BUTTON_CONTACTS: "Contactos" - INBOX_NAME: "Caixa de entrada" - SENT_NAME: "Correio enviado" - DRAFTS_NAME: "Rascunhos" - SPAM_NAME: "Spam" - TRASH_NAME: "Lixo" - ARCHIVE_NAME: "Arquivo" - QUOTA: - TITLE: "Uso da Cota" - MESSAGE_LIST: - BUTTON_RELOAD: "Atualizar lista de mensagens" - BUTTON_MOVE_TO: "Mover para" - BUTTON_DELETE: "Eliminar" - BUTTON_ARCHIVE: "Arquivar" - BUTTON_SPAM: "Marcar como spam" - BUTTON_NOT_SPAM: "Não é spam" - BUTTON_EMPTY_FOLDER: "Esvaziar pasta" - BUTTON_MULTY_FORWARD: "Encaminhar mensagens" - BUTTON_DELETE_WITHOUT_MOVE: "Eliminar definitivamente" - BUTTON_MORE: "Mais" - MENU_SET_SEEN: "Marcar como lida" - MENU_SET_ALL_SEEN: "Marcar todas como lidas" - MENU_UNSET_SEEN: "Marcar como não lida" - MENU_SET_FLAG: "Sinalizar" - MENU_UNSET_FLAG: "Remover sinalização" - MENU_SELECT_ALL: "Todas" - MENU_SELECT_NONE: "Nenhuma" - MENU_SELECT_INVERT: "Inverter" - MENU_SELECT_UNSEEN: "Não lida" - MENU_SELECT_SEEN: "Lida" - MENU_SELECT_FLAGGED: "Sinalizada" - MENU_SELECT_UNFLAGGED: "Não sinalizada" - EMPTY_LIST: "Lista vazia." - EMPTY_SEARCH_LIST: "Nenhuma mensagem corresponde à sua pesquisa." - SEARCH_RESULT_FOR: "Resultados de pesquisa para \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "voltar à lista de mensagens" - LIST_LOADING: "A carregar" - EMPTY_SUBJECT_TEXT: "(Sem assunto)" - PUT_MESSAGE_HERE: "Coloque a mensagem aqui para vê-la na lista" - TODAY_AT: "Hoje às %TIME%" - YESTERDAY_AT: "Ontem às %TIME%" - SEARCH_PLACEHOLDER: "Pesquisar" - NEW_MESSAGE_NOTIFICATION: "Você tem %COUNT% novas mensagens!" - QUOTA_SIZE: "Está a usar %SIZE% (%PROC%%) dos %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Editar" - BUTTON_BACK: "Voltar" - BUTTON_CLOSE: "Fechar" - BUTTON_DELETE: "Eliminar" - BUTTON_ARCHIVE: "Arquivar" - BUTTON_SPAM: "Marcar como spam" - BUTTON_NOT_SPAM: "Não é spam" - BUTTON_MOVE_TO: "Mover para" - BUTTON_MORE: "Mais" - BUTTON_REPLY: "Responder" - BUTTON_REPLY_ALL: "Responder a todos" - BUTTON_FORWARD: "Encaminhar" - BUTTON_FORWARD_AS_ATTACHMENT: "Enviar como anexo" - BUTTON_EDIT_AS_NEW: "Editar como novo" - BUTTON_SHOW_IMAGES: "Mostrar imagens" - BUTTON_NOTIFY_READ_RECEIPT: "O remetente pediu para ser notificado quando você lesse esta mensagem." - BUTTON_IN_NEW_WINDOW: "Ver em janela separada" - BUTTON_THREAD_LIST: "Lista de tópicos" - BUTTON_THREAD_PREV: "Anterior" - BUTTON_THREAD_NEXT: "Seguinte" - BUTTON_THREAD_MORE: "Mais mensagens" - MENU_HEADERS: "Mostrar título das mensagens" - MENU_VIEW_ORIGINAL: "Mostrar original" - MENU_DOWNLOAD_ORIGINAL: "Transferir como ficheiro .eml" - MENU_FILTER_SIMILAR: "Filtrar mensagens semelhantes a esta" - MENU_PRINT: "Imprimir" - EMPTY_SUBJECT_TEXT: "(Sem assunto)" - LABEL_SUBJECT: "Assunto" - LABEL_DATE: "Data" - LABEL_FROM: "De" - LABEL_FROM_SHORT: "de" - LABEL_TO: "Para" - LABEL_TO_SHORT: "para" - LABEL_CC: "CC" - LABEL_BCC: "BCC" - LABEL_REPLY_TO: "Resp.-Para" - PRINT_LABEL_FROM: "De" - PRINT_LABEL_TO: "Para" - PRINT_LABEL_CC: "CC" - PRINT_LABEL_BCC: "BCC" - PRINT_LABEL_REPLY_TO: "Resp.-Para" - PRINT_LABEL_DATE: "Data" - PRINT_LABEL_SUBJECT: "Assunto" - PRINT_LABEL_ATTACHMENTS: "Anexos" - MESSAGE_LOADING: "A carregar" - MESSAGE_VIEW_DESC: "Selecione uma mensagem na lista para ver o conteúdo aqui." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Palavra-passe" - PGP_SIGNED_MESSAGE_DESC: "Mensagem assinada com OpenPGP (clique para verificar)" - PGP_ENCRYPTED_MESSAGE_DESC: "Mensagem encriptada com OpenPGP (clique para desencriptar)" - LINK_DOWNLOAD_AS_ZIP: "Transferir em arquivo zip" - LINK_SAVE_TO_OWNCLOUD: "Guardar no ownCloud" - LINK_SAVE_TO_DROPBOX: "Guardar no Dropbox" - READ_RECEIPT: - SUBJECT: "Recibo de leitura (apresentado) - %SUBJECT%" - BODY: | - Este é um comprovativo de leitura para o e-mail que você enviou para %READ-RECEIPT%. - - Nota: Este comprovativo apenas confirma que a mensagem foi apresentada no computador do destinatário. - Não existe nenhuma garantia de que o destinatário tenha lido ou compreendido o conteúdo da mensagem. - SUGGESTIONS: - SEARCHING_DESC: "A procurar..." - CONTACTS: - LEGEND_CONTACTS: "Contactos" - SEARCH_INPUT_PLACEHOLDER: "Procurar" - BUTTON_ADD_CONTACT: "Adicionar contacto" - BUTTON_CREATE_CONTACT: "Criar" - BUTTON_UPDATE_CONTACT: "Atualizar" - BUTTON_IMPORT: "Importar (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Exportar (vcf, vCard)" - BUTTON_EXPORT_CSV: "Exportar (csv)" - ERROR_IMPORT_FILE: "Erro ao importar (formato do ficheiro inválido)" - LIST_LOADING: "A carregar" - EMPTY_LIST: "Nenhum contacto aqui" - EMPTY_SEARCH: "Nenhum contacto encontrado" - CLEAR_SEARCH: "Limpar pesquisa" - CONTACT_VIEW_DESC: "Selecione o contacto na lista para visualizá-lo." - LABEL_DISPLAY_NAME: "Nome a apresentar" - LABEL_EMAIL: "Email" - LABEL_PHONE: "Telefone" - LABEL_WEB: "Página web" - LABEL_BIRTHDAY: "Aniversário" - LINK_ADD_EMAIL: "Adicionar um endereço e-mail" - LINK_ADD_PHONE: "Adicionar um telefone" - LINK_BIRTHDAY: "Aniversário" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Introduza o nome a apresentar" - PLACEHOLDER_ENTER_LAST_NAME: "Introduza o último nome" - PLACEHOLDER_ENTER_FIRST_NAME: "Introduza o primeiro nome" - PLACEHOLDER_ENTER_NICK_NAME: "Introduza uma alcunha" - LABEL_READ_ONLY: "Ler apenas" - LABEL_SHARE: "Partilhar" - ADD_MENU_LABEL: "Adicionar" - ADD_MENU_NICKNAME: "Alcunha" - ADD_MENU_NOTES: "Notas" - ADD_MENU_EMAIL: "Email" - ADD_MENU_PHONE: "Telefone" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Morada" - ADD_MENU_BIRTHDAY: "Aniversário" - ADD_MENU_TAGS: "Marcadores" - BUTTON_SHARE_NONE: "Ninguém" - BUTTON_SHARE_ALL: "Todos" - BUTTON_SYNC: "Sincronização (CardDAV)" - COMPOSE: - TITLE_FROM: "De" - TITLE_TO: "Para" - TITLE_CC: "CC" - TITLE_BCC: "BCC" - TITLE_REPLY_TO: "Resp.-Para" - TITLE_SUBJECT: "Assunto" - LINK_SHOW_INPUTS: "Mostrar todos os campos" - BUTTON_SEND: "Enviar" - BUTTON_SAVE: "Guardar" - BUTTON_DELETE: "Eliminar" - BUTTON_CANCEL: "Cancelar" - BUTTON_MINIMIZE: "Minimizar" - SAVED_TIME: "Guardado às %TIME%" - SAVED_ERROR_ON_SEND: "A sua mensagem foi enviada, mas não foi guardada na pasta dos itens enviados." - DISCARD_UNSAVED_DATA: "Rejeitar o conteúdo que não foi guardado?" - ATTACH_FILES: "Anexar ficheiros" - ATTACH_DROP_FILES_DESC: "Arraste os ficheiros para aqui" - ATTACH_ITEM_CANCEL: "Cancelar" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% escreveu" - FORWARD_MESSAGE_TOP_TITLE: "-------- Mensagem Encaminhada -------" - FORWARD_MESSAGE_TOP_FROM: "De" - FORWARD_MESSAGE_TOP_TO: "Para" - FORWARD_MESSAGE_TOP_CC: "CC" - FORWARD_MESSAGE_TOP_SENT: "Enviado" - FORWARD_MESSAGE_TOP_SUBJECT: "Assunto" - EMPTY_TO_ERROR_DESC: "Por favor, especifique pelo menos um destinatário" - NO_ATTACHMENTS_HERE_DESC: "Sem anexos aqui." - ATTACHMENTS_ERROR_DESC: "Aviso! Nem todos os anexos foram carregados." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Ainda não foram carregados todos os anexos" - BUTTON_REQUEST_READ_RECEIPT: "Pedir um recibo de leitura" - BUTTON_MARK_AS_IMPORTANT: "Marcar como importante" - BUTTON_OPEN_PGP: "OpenPGP (apenas texto simples)" - BUTTON_REQUEST_DSN: "Pedir um recibo de entrega" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Close" - POPUPS_ASK: - BUTTON_YES: "Sim" - BUTTON_NO: "Não" - DESC_WANT_CLOSE_THIS_WINDOW: "Tem a certeza que deseja fechar esta janela?" - DESC_WANT_DELETE_MESSAGES: "Tem a certeza de que deseja eliminar esta(s) mensagem(s)?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Escolha o idioma" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Adicionar conta?" - BUTTON_ADD_ACCOUNT: "Adicionar" - TITLE_UPDATE_ACCOUNT: "Atualizar conta?" - BUTTON_UPDATE_ACCOUNT: "Atualizar" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Adicionar identidade?" - TITLE_UPDATE_IDENTITY: "Atualizar identidade?" - BUTTON_ADD_IDENTITY: "Adicionar" - BUTTON_UPDATE_IDENTITY: "Atualizar" - LABEL_EMAIL: "E-mail" - LABEL_NAME: "Nome" - LABEL_REPLY_TO: "Resp.-Para" - LABEL_SIGNATURE: "Assinatura" - LABEL_CC: "Cc" - LABEL_BCC: "Bcc" - LABEL_SIGNATURE_INSERT_BEFORE: "Nas respostas, inserir esta assinatura acima da mensagem citada" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Criar pasta?" - LABEL_NAME: "Nome da pasta" - LABEL_PARENT: "Pasta principal" - BUTTON_CREATE: "Criar" - BUTTON_CANCEL: "Cancelar" - BUTTON_CLOSE: "Fechar" - TITLE_CREATING_PROCESS: "A criar pasta" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Eliminar todas as mensagens da pasta?" - BUTTON_CLEAR: "Limpar" - BUTTON_CANCEL: "Cancelar" - BUTTON_CLOSE: "Fechar" - DANGER_DESC_WARNING: "Atenção!" - DANGER_DESC_HTML_1: "Esta ação irá resultar na remoção definitiva de todos os e-mails na pasta %FOLDER%." - DANGER_DESC_HTML_2: "Uma vez iniciado, o processo não pode ser interrompido ou cancelado." - TITLE_CLEARING_PROCESS: "A eliminar a pasta..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Importar chave OpenPGP" - BUTTON_IMPORT_OPEN_PGP_KEY: "Importar" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Ver chave OpenPGP" - BUTTON_SELECT: "Escolher" - BUTTON_CLOSE: "Fechar" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Gerar chaves OpenPGP" - LABEL_EMAIL: "Email" - LABEL_NAME: "Nome" - LABEL_PASSWORD: "Palavra-passe" - LABEL_KEY_BIT_LENGTH: "Comprimento da chave" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Gerar" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "Assinar/Encriptar com OpenPGP" - LABEL_SIGN: "Assinar" - LABEL_ENCRYPT: "Encriptar" - LABEL_PASSWORD: "Palavra-passe" - BUTTON_SIGN: "Assinar" - BUTTON_ENCRYPT: "Encriptar" - BUTTON_SIGN_AND_ENCRYPT: "Assinar e encriptar" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" - LABEL_KEY: "Private Key" - LABEL_PASSWORD: "Password" - BUTTON_DECRYPT: "Decrypt" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "Teste de verificação em 2-Etapas" - LABEL_CODE: "Código" - BUTTON_TEST: "Testar" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Criar um filtro?" - TITLE_EDIT_FILTER: "Atualizar um filtro?" - FILTER_NAME: "Nome" - LEGEND_CONDITIONS: "Condições" - LEGEND_ACTIONS: "Ações" - BUTTON_DONE: "Terminado" - BUTTON_ADD_CONDITION: "Adicionar uma condição" - SELECT_ACTION_NONE: "Nenhuma" - SELECT_ACTION_MOVE_TO: "Mover para" - SELECT_ACTION_FORWARD_TO: "Encaminhar para" - SELECT_ACTION_REJECT: "Rejeitar" - SELECT_ACTION_VACATION_MESSAGE: "Mensagem de férias" - SELECT_ACTION_DISCARD: "Descartar" - SELECT_FIELD_FROM: "De" - SELECT_FIELD_RECIPIENTS: "Destinatários (Para ou CC)" - SELECT_FIELD_SUBJECT: "Assunto" - SELECT_FIELD_HEADER: "Cebeçalho" - SELECT_FIELD_SIZE: "Tamanho" - SELECT_TYPE_CONTAINS: "Contém" - SELECT_TYPE_NOT_CONTAINS: "Não contém" - SELECT_TYPE_MATCHES: "Corresponde (* e ? suportados)" - SELECT_TYPE_NOT_MATCHES: "Não correponde (* e ? suportados)" - SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Sem Regexp" - SELECT_TYPE_EQUAL_TO: "Igual a" - SELECT_TYPE_NOT_EQUAL_TO: "Não é igual a" - SELECT_TYPE_OVER: "Superior" - SELECT_TYPE_UNDER: "Inferior" - SELECT_MATCH_ANY: "Correspondendo a qualquer uma das regras que se seguem" - SELECT_MATCH_ALL: "Correspondendo a todas as regras que se seguem" - MARK_AS_READ_LABEL: "Marcar como lida" - REPLY_INTERVAL_LABEL: "Intervalo de resposta (dias)" - KEEP_LABEL: "Manter" - STOP_LABEL: "Não parar de processar as regras" - EMAIL_LABEL: "Email" - VACATION_SUBJECT_LABEL: "Assunto (opcional)" - VACATION_MESSAGE_LABEL: "Mensagem" - VACATION_RECIPIENTS_LABEL: "Destinatários (separados por vírgula)" - REJECT_MESSAGE_LABEL: "Rejeitar mensagem" - ALL_INCOMING_MESSAGES_DESC: "Todas as mensagens recebidas" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Selecione as pastas do sistema" - SELECT_CHOOSE_ONE: "Escolha uma" - SELECT_UNUSE_NAME: "Não usar" - LABEL_SENT: "Enviadas" - LABEL_DRAFTS: "Rascunhos" - LABEL_SPAM: "Spam" - LABEL_TRASH: "Lixo" - LABEL_ARCHIVE: "Arquivos" - BUTTON_CANCEL: "Cancelar" - BUTTON_CLOSE: "Fechar" - NOTIFICATION_SENT: | - Você não selecionou a pasta "Sent" de sistema, onde as mensagens enviadas são colocadas. - Se você não quiser salvar as mensagens enviadas, por favor selecione a opção "Do not use". - NOTIFICATION_DRAFTS: "Você não selecionou a pasta \"Drafts\" de sistema, onde as mensagens são guardadas enquanto são escritas." - NOTIFICATION_SPAM: | - Você não selecionou a pasta "Spam" de sistema, onde as mensagens de spam são colocadas. - Se você deseja remover as mensagens definitivamente, por favor selecione a opção "Do not use". - NOTIFICATION_TRASH: | - Você não selecionou a pasta "Trash" de sistema, onde as mensagens eliminadas são colocadas. - Se você deseja remover as mensagens definitivamente, por favor selecione a opção "Do not use". - NOTIFICATION_ARCHIVE: "Você não selecionou a pasta \"Archive\" de sistema, onde as mensagens arquivadas são colocadas." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "Verificação em 2-Etapas" - LABEL_ENABLE_TWO_FACTOR: "Ativar verificação em 2-Etapas" - LABEL_TWO_FACTOR_USER: "Utilizador" - LABEL_TWO_FACTOR_STATUS: "Estado" - LABEL_TWO_FACTOR_SECRET: "Segredo" - LABEL_TWO_FACTOR_BACKUP_CODES: "Códigos secundários" - BUTTON_CREATE: "Criar novo Segredo" - BUTTON_ACTIVATE: "Activate" - BUTTON_CLEAR: "Limpar" - BUTTON_LOGOUT: "Logout" - BUTTON_DONE: "Done" - BUTTON_TEST: "Testar" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Mostrar Segredo" - BUTTON_HIDE_SECRET: "Ocultar Segredo" - TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configurado" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Não configurado" - TWO_FACTOR_SECRET_DESC: >- - Importe esta informação no seu cliente Google Authenticator (ou outro cliente - TOTP) utilizando o código QR fornecido abaixo ou introduzindo o código manualmente. - TWO_FACTOR_BACKUP_CODES_DESC: >- - Se não consegue receber códigos através do Google Authenticator, pode usar - os códigos secundários para entrar. Após ter usado um código secundário para - entrar, este será desativado. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Não pode alterar este parâmetro antes de testar." - TITLES: - LOADING: "A carregar" - LOGIN: "Utilizador" - MAILBOX: "Caixa de correio" - SETTINGS: "Definições" - COMPOSE: "Compor" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "O ficheiro é muito grande" - ERROR_FILE_PARTIALLY_UPLOADED: "O ficheiro foi carregado parcialmente devido a um erro desconhecido" - ERROR_NO_FILE_UPLOADED: "Nenhum ficheiro carregado" - ERROR_MISSING_TEMP_FOLDER: "O ficheiro temporário está em falta" - ERROR_ON_SAVING_FILE: "Ocorreu um erro desconhecido durante o carregamento do ficheiro" - ERROR_FILE_TYPE: "Tipo de ficheiro inválido" - ERROR_UNKNOWN: "Ocorreu um erro desconhecido durante o carregamento do ficheiro" - EDITOR: - TEXT_SWITCHER_RICH_FORMATTING: "Formatação avançada" - TEXT_SWITCHER_CONFIRM: "A formatação de texto e as imagens serão perdidas. Tem certeza de que deseja continuar?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Pessoal" - LABEL_GENERAL_NAME: "Geral" - LABEL_CONTACTS_NAME: "Contactos" - LABEL_FOLDERS_NAME: "Pastas" - LABEL_ACCOUNTS_NAME: "Contas" - LABEL_IDENTITY_NAME: "Identidade" - LABEL_IDENTITIES_NAME: "Identidades" - LABEL_FILTERS_NAME: "Filtros" - LABEL_TEMPLATES_NAME: "Modelos" - LABEL_SECURITY_NAME: "Segurança" - LABEL_SOCIAL_NAME: "Social" - LABEL_THEMES_NAME: "Temas" - LABEL_CHANGE_PASSWORD_NAME: "Palavra-passe" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Voltar" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filtros" - BUTTON_SAVE: "Guardar" - BUTTON_ADD_FILTER: "Adicionar um filtro" - BUTTON_DELETE: "Eliminar" - BUTTON_RAW_SCRIPT: "Usar um script personalizado de utilizador" - SUBNAME_NONE: "Nenhum" - SUBNAME_MOVE_TO: "Mover para \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Encaminhar para \"%EMAIL%\"" - SUBNAME_REJECT: "Rejeitar" - SUBNAME_VACATION_MESSAGE: "Mensagem de férias" - SUBNAME_DISCARD: "Descartar" - CAPABILITY_LABEL: "Capacidade" - LOADING_PROCESS: "A atualizar lista de filtros" - DELETING_ASK: "Tem a certeza?" - CHACHES_NEED_TO_BE_SAVED_DESC: "Estas alterações têm que ser guardadas no servidor." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identidade" - LABEL_DISPLAY_NAME: "Nome" - LABEL_REPLY_TO: "Resp.-Para" - LABEL_SIGNATURE: "Assinatura" - LABEL_ADD_SIGNATURE_TO_ALL: "Adicionar a sua assinatura a todas as mensagens de saída" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Segurança" - LABEL_CONFIGURE_TWO_FACTOR: "Configurar verificação de 2 etapas" - LABEL_AUTOLOGOUT: "Terminar sessão auto." - AUTOLOGIN_NEVER_OPTION_NAME: "Nunca" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minuto(s)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Geral" - LABEL_LANGUAGE: "Idioma" - LABEL_IDENTITY: "Identidade" - LABEL_LAYOUT: "Apresentação" - LABEL_LAYOUT_NO_SPLIT: "Sem separação" - LABEL_LAYOUT_VERTICAL_SPLIT: "Separação vertical" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Separação horizontal" - LABEL_EDITOR: "Editor de texto padrão" - LABEL_EDITOR_HTML: "Html" - LABEL_EDITOR_PLAIN: "Texto simples" - LABEL_EDITOR_HTML_FORCED: "Html (forçado)" - LABEL_EDITOR_PLAIN_FORCED: "Texto simples (forçado)" - LABEL_ANIMATION: "Animação de interface" - LABEL_ANIMATION_FULL: "Completa" - LABEL_ANIMATION_NORMAL: "Normal" - LABEL_ANIMATION_NONE: "Nenhuma" - LABEL_VIEW_OPTIONS: "Ver opções" - LABEL_USE_PREVIEW_PANE: "Use o painel de pré-visualização" - LABEL_USE_CHECKBOXES_IN_LIST: "Apresentar caixas de seleção na lista" - LABEL_USE_THREADS: "Usar tópicos de conversa" - LABEL_REPLY_SAME_FOLDER: "Colocar respostas na pasta das mensagens a que responde" - LABEL_SHOW_IMAGES: "Apresentar sempre as imagens no corpo da mensagem" - LABEL_SHOW_ANIMATION: "Mostrar animação" - LABEL_MESSAGE_PER_PAGE: "Mensagens por página" - LABEL_NOTIFICATIONS: "Notificações" - LABEL_SOUND_NOTIFICATION: "Notificações sonoras" - LABEL_CHROME_NOTIFICATION_DESC: "Apresentar notificações para novas mensagens" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Bloqueado pelo navegador)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Contactos" - LABEL_CONTACTS_AUTOSAVE: "Adicionar automaticamente destinatários à sua lista de endereços" - LEGEND_CONTACTS_SYNC: "Sincronização Remota (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Ativar sincronização remota" - LABEL_CONTACTS_SYNC_SERVER: "Servidor" - LABEL_CONTACTS_SYNC_AB_URL: "URL do livro de endereços" - LABEL_CONTACTS_SYNC_USER: "Utilizador" - LABEL_CONTACTS_SYNC_PASSWORD: "Palavra-passe" - SETTINGS_THEMES: - LEGEND_THEMES: "Temas" - LEGEND_THEMES_CUSTOM: "Configuração de tema personalizado" - LABEL_CUSTOM_TYPE: "Tipo" - LABEL_CUSTOM_TYPE_LIGHT: "Claro" - LABEL_CUSTOM_TYPE_DARK: "Escuro" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Imagem de fundo" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Carregar imagem de fundo (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "Ficheiro muito grande" - ERROR_FILE_TYPE_ERROR: "Tipo de ficheiro inválido (apenas JPG e PNG)" - ERROR_UNKNOWN: "Ocorreu um erro desconhecido durante o carregamento do ficheiro" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Ligar ao Google" - BUTTON_GOOGLE_DISCONNECT: "Desligar do Google" - MAIN_GOOGLE_DESC: "Depois de ativar o início de sessão através do Google, poderá entrar nesta conta usando o botão do Google no ecrã de início de sessão." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Ligar ao Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Desligar do Facebook" - MAIN_FACEBOOK_DESC: "Depois de ativar o início de sessão através do Facebook, poderá entrar nesta conta usando o botão do Facebook no ecrã de início de sessão." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Ligar ao Twitter" - BUTTON_TWITTER_DISCONNECT: "Desligar do Twitter" - MAIN_TWITTER_DESC: "Depois de ativar o início de sessão através do Twitter, poderá entrar nesta conta usando o botão do Twitter no ecrã de início de sessão." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Lista de pastas" - BUTTON_CREATE: "Criar pasta" - BUTTON_DELETE: "Excluir" - BUTTON_SUBSCRIBE: "Assinar" - BUTTON_UNSUBSCRIBE: "Anular" - LOADING_PROCESS: "Atualizar lista de pastas" - CREATING_PROCESS: "Criar a pasta" - DELETING_PROCESS: "Eliminar a pasta" - RENAMING_PROCESS: "Renomear a pasta" - DELETING_ASK: "Tem a certeza?" - TO_MANY_FOLDERS_DESC_1: "Você tem demasiadas pastas!" - TO_MANY_FOLDERS_DESC_2: "Apenas apresentámos parte delas, para evitar problemas de desempenho." - HELP_DELETE_FOLDER: "Eliminar pasta" - HELP_SHOW_HIDE_FOLDER: "Mostrar/ocultar pasta" - HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Lista de contas" - LEGEND_IDENTITIES: "Identidades" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Contas e Identidades" - BUTTON_ADD_ACCOUNT: "Adicionar uma conta" - BUTTON_ADD_IDENTITY: "Adicionar uma identidade" - BUTTON_DELETE: "Eliminar" - LOADING_PROCESS: "A atualizar..." - DELETING_ASK: "Tem a certeza?" - DEFAULT_IDENTITY_LABEL: "predefinida" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identidade" - LEGEND_IDENTITIES: "Identidades adicionais" - LABEL_DEFAULT: "Predefinida" - LABEL_DISPLAY_NAME: "Nome" - LABEL_REPLY_TO: "Resp.-Para" - LABEL_SIGNATURE: "Assinatura" - LABEL_ADD_SIGNATURE_TO_ALL: "Adicione a sua assinatura a todas as mensagens enviadas" - BUTTON_ADD_IDENTITY: "Adicionar identidade" - BUTTON_DELETE: "Eliminar" - LOADING_PROCESS: "A atualizar lista de identidades" - DELETING_ASK: "Tem a certeza?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Mudar a palavra-passe" - LABEL_CURRENT_PASSWORD: "Palavra-passe atual" - LABEL_NEW_PASSWORD: "Nova palavra-passe" - LABEL_REPEAT_PASSWORD: "Repita a nova palavra-passe" - BUTTON_UPDATE_PASSWORD: "Defina a nova palavra-passe" - ERROR_PASSWORD_MISMATCH: "As palavras-passe não são idênticas, tente novamente por favor" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Importar chave OpenPGP" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Gerar chaves OpenPGP" - TITLE_PRIVATE: "Privada" - TITLE_PUBLIC: "Pública" - DELETING_ASK: "Tem a certeza?" - GENERATE_ONLY_HTTPS: "Apenas HTTPS" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Ajuda para atalhos de teclado" - TAB_MAILBOX: "Caixa de correio" - TAB_MESSAGE_LIST: "Lista de mensagens" - TAB_MESSAGE_VIEW: "Vista da mensagem" - TAB_COMPOSE: "Compor" - LABEL_OPEN_USER_DROPDOWN: "Abrir menu do utilizador" - LABEL_REPLY: "Responder" - LABEL_REPLY_ALL: "Responder a todos" - LABEL_FORWARD: "Encaminhar" - LABEL_FORWARD_MULTIPLY: "Encaminhar (multiplicar)" - LABEL_HELP: "Ajuda" - LABEL_CHECK_ALL: "Selecionar todas as mensagens" - LABEL_ARCHIVE: "Arquivar" - LABEL_DELETE: "Eliminar" - LABEL_OPEN_THREAD: "Abrir tópico selecionado" - LABEL_MOVE: "Mover" - LABEL_READ: "Ler as mensagens selecionadas" - LABEL_UNREAD: "Marcar as mensagens selecionadas como não lidas" - LABEL_IMPORTANT: "Marcar como Importantes as mensagens selecionadas" - LABEL_SEARCH: "Pesquisar" - LABEL_CANCEL_SEARCH: "Cancelar pesquisa" - LABEL_FULLSCREEN_ENTER: "Ecrã-inteiro (com janela de pré-visualização)" - LABEL_VIEW_MESSAGE_ENTER: "Ver mensagem (sem janela de pré-visualização)" - LABEL_SWITCH_TO_MESSAGE: "Dar foco à mensagem selecionada" - LABEL_SWITCH_TO_FOLDER_LIST: "Dar foco à lista de pastas" - LABEL_FULLSCREEN_TOGGLE: "Alternar modo ecrã-inteiro" - LABEL_BLOCKQUOTES_TOGGLE: "Alternar visibilidade do texto citado" - LABEL_THREAD_NEXT: "Mensagem seguinte deste tópico" - LABEL_THREAD_PREV: "Mensagem anterior deste tópico" - LABEL_PRINT: "Imprimir" - LABEL_EXIT_FULLSCREEN: "Sair do modo ecrã-inteiro" - LABEL_CLOSE_MESSAGE: "Fechar mensagem (sem janela de pré-visualização)" - LABEL_SWITCH_TO_LIST: "Dar foco à lista de mensagens" - LABEL_OPEN_COMPOSE_POPUP: "Abrir janela de composição" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Abrir menu de identidades" - LABEL_SAVE_MESSAGE: "Guardar mensagem" - LABEL_SEND_MESSAGE: "Enviar mensagem" - LABEL_CLOSE_COMPOSE: "Fechar janela de composição" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "Nenhuma chave pública encontrada" - NO_PUBLIC_KEYS_FOUND_FOR: "Nenhuma chave pública encontrada para o email \"%EMAIL%\"" - NO_PRIVATE_KEY_FOUND: "Nenhuma chave privada encontrada" - NO_PRIVATE_KEY_FOUND_FOR: "Nenhuma chave privada encontrada para o email \"%EMAIL%\"" - ADD_A_PUBLICK_KEY: "Adicionar uma chave pública" - UNVERIFIRED_SIGNATURE: "Assinatura não verificada" - DECRYPTION_ERROR: "Erro de desencriptação OpenPGP" - GOOD_SIGNATURE: "Boa assinatura de %USER%" - PGP_ERROR: "Erro OpenPGP: %ERROR%" - SPECIFY_FROM_EMAIL: "Por favor especifique o endereço de email DE" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Por favor especifique pelo menos um destinatário" - NOTIFICATIONS: - INVALID_TOKEN: "Token inválido" - AUTH_ERROR: "Falha na autenticação" - ACCESS_ERROR: "Erro de acesso" - CONNECTION_ERROR: "Não foi possível conectar ao servidor" - CAPTCHA_ERROR: "Verificação CAPTCHA inválido." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- - Esse usuário Facebook não está associado a nenhuma conta de email ainda. Entre - utilizando seu email e senha e habilite essa função em suas configurações - de conta. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- - Esse usuário Twitter não está associado a nenhuma conta de email ainda. Entre - utilizando seu email e senha e habilite essa função em suas configurações - de conta. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- - Esse usuário Google não está associado a nenhuma conta de email ainda. Entre - utilizando seu email e senha e habilite essa função em suas configurações - de conta. - DOMAIN_NOT_ALLOWED: "Este domínio não é permitido" - ACCOUNT_NOT_ALLOWED: "Esta conta não é permitida" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "É necessária a verificação em duas etapas" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Erro na verifricação em duas etapas" - COULD_NOT_SAVE_NEW_PASSWORD: "Não foi possível guardar a nova palavra-passe" - CURRENT_PASSWORD_INCORRECT: "A palavra-passe atual está incorreta" - NEW_PASSWORD_SHORT: "A palavra-passe é muito curta" - NEW_PASSWORD_WEAK: "A palavra-passe é muito simples" - NEW_PASSWORD_FORBIDDENT: "A palavra-passe contém caracteres proibidos" - CONTACTS_SYNC_ERROR: "Erro na sincronização de contactos" - CANT_GET_MESSAGE_LIST: "Não é possível obter a lista de mensagens" - CANT_GET_MESSAGE: "Não é possível obter a mensagem" - CANT_DELETE_MESSAGE: "Não é possível eliminar a mensagem" - CANT_MOVE_MESSAGE: "Não é possível mover a mensagem" - CANT_SAVE_MESSAGE: "Não é possível guardar a mensagem" - CANT_SEND_MESSAGE: "Não é possível enviar a mensagem" - INVALID_RECIPIENTS: "Destinatário inválido" - CANT_SAVE_FILTERS: "Não é possível guardar os filtros" - CANT_GET_FILTERS: "Não é possível obter os filtros" - FILTERS_ARE_NOT_CORRECT: "Os filtros não estão corretos" - CANT_CREATE_FOLDER: "Não é possível criar a pasta" - CANT_RENAME_FOLDER: "Não é possível renomear a pasta" - CANT_DELETE_FOLDER: "Não é possível eliminar a pasta" - CANT_DELETE_NON_EMPTY_FOLDER: "Não é possível eliminar pastas com conteúdos" - CANT_SUBSCRIBE_FOLDER: "Não é possível assinar esta pasta" - CANT_UNSUBSCRIBE_FOLDER: "Não é possível cancelar esta pasta" - CANT_SAVE_SETTINGS: "Não é possível salvar as definições" - CANT_SAVE_PLUGIN_SETTINGS: "Não é possível guardar as definições" - DOMAIN_ALREADY_EXISTS: "O domínio já existe" - CANT_INSTALL_PACKAGE: "Erro ao instalar pacote" - CANT_DELETE_PACKAGE: "Erro ao remover pacote" - INVALID_PLUGIN_PACKAGE: "Pacote de plugin inválido" - UNSUPPORTED_PLUGIN_PACKAGE: "Pacote de plugin não suportado" - LICENSING_SERVER_IS_UNAVAILABLE: "O servidor de subscrição está indisponível" - LICENSING_DOMAIN_EXPIRED: "A subscrição para este domínio expirou." - LICENSING_DOMAIN_BANNED: "A subscrição para este domínio está proibida." - DEMO_SEND_MESSAGE_ERROR: "Por motivos de segurança, esta conta de demonstração não tem permissão para enviar mensagens para endereços de e-mail externos!" - DEMO_ACCOUNT_ERROR: "Por motivos de segurança, esta conta não tem permissão de executar esta ação!" - ACCOUNT_ALREADY_EXISTS: "Esta conta já existe" - ACCOUNT_DOES_NOT_EXIST: "Conta inexistente" - MAIL_SERVER_ERROR: "Ocorreu um erro ao aceder ao servidor de email" - INVALID_INPUT_ARGUMENT: "Parâmetro de entrada inválido" - UNKNOWN_ERROR: "Erro desconhecido" - STATIC: - BACK_LINK: "Recarregar" - DOMAIN_LIST_DESC: "Lista de domínios que o webmail tem permissão para aceder." - PHP_EXSTENSIONS_ERROR_DESC: "As extensões PHP necessárias não estão disponíveis na sua configuração do PHP!" - PHP_VERSION_ERROR_DESC: "A sua versão do PHP (%VERSION%) é menor do que a mínima exigida: 5.3.0!" - NO_SCRIPT_TITLE: "É necessário JavaScript para esta aplicação." - NO_SCRIPT_DESC: | - O suporte de JavaScript não está disponível no seu navegador. - Por favor ative o suporte de JavaScript nas definições do seu navegador e tente novamente. - NO_COOKIE_TITLE: "É necessário suporte de cookies para esta aplicação." - NO_COOKIE_DESC: | - O suport de Cookies não está disponível no seu navegador. - Por favor ative o suporte de Cookies nas definições do seu navegador e tente novamente. - BAD_BROWSER_TITLE: "O seu navegador está desatualizado." - BAD_BROWSER_DESC: | - Para usar todas as funções da aplicação, - transfira e instale um destes navegadores: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ro_RO.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ro_RO.yml deleted file mode 100755 index 7d216b6a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ro_RO.yml +++ /dev/null @@ -1,711 +0,0 @@ -ro_RO: - LOGIN: - LABEL_EMAIL: "Email" - LABEL_LOGIN: "Conectare" - LABEL_PASSWORD: "Parolă" - LABEL_SIGN_ME: "Ține-mă minte" - LABEL_VERIFICATION_CODE: "Cod de verificare" - LABEL_DONT_ASK_VERIFICATION_CODE: "Nu mai cereți codul timp de 2 săptămâni" - BUTTON_SIGN_IN: "Conectare" - TITLE_SIGN_IN_GOOGLE: "Conectați-vă cu Google" - TITLE_SIGN_IN_FACEBOOK: "Conectați-vă cu Facebook" - TITLE_SIGN_IN_TWITTER: "Conectați-vă cu Twitter" - LABEL_FORGOT_PASSWORD: "Am uitat parola" - LABEL_REGISTRATION: "Înregistrare" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Adaugă un cont" - BUTTON_SETTINGS: "Opțiuni" - BUTTON_HELP: "Help" - BUTTON_LOGOUT: "Deconectare" - MOBILE: - BUTTON_MOBILE_VERSION: "Versiunea de mobil" - BUTTON_DESKTOP_VERSION: "Versiunea desktop" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Caută în mesaje" - TITLE_ADV: "Căutare avansată" - LABEL_ADV_FROM: "De la" - LABEL_ADV_TO: "către" - LABEL_ADV_SUBJECT: "Subiect" - LABEL_ADV_TEXT: "Conținut" - LABEL_ADV_HAS_ATTACHMENT: "Are atașament" - LABEL_ADV_HAS_ATTACHMENTS: "Atașamente" - LABEL_ADV_FLAGGED: "Importante" - LABEL_ADV_UNSEEN: "Necitit" - LABEL_ADV_DATE: "Data" - LABEL_ADV_DATE_ALL: "Tot timpul" - LABEL_ADV_DATE_3_DAYS: "З zile" - LABEL_ADV_DATE_7_DAYS: "7 zile" - LABEL_ADV_DATE_MONTH: "în această lună" - LABEL_ADV_DATE_3_MONTHS: "3 luni" - LABEL_ADV_DATE_6_MONTHS: "6 luni" - LABEL_ADV_DATE_YEAR: "în acest an" - BUTTON_ADV_SEARCH: "căutare" - PREVIEW_POPUP: - FULLSCREEN: "Toggle fullscreen" - ZOOM: "Zoom in/out" - CLOSE: "Închide (Esc)" - LOADING: "Se îcarcă..." - GALLERY_PREV: "Precedentul (Стрелка ←)" - GALLERY_NEXT: "Următorul (Стрелка →)" - GALLERY_COUNTER: "%curr% din %total%" - IMAGE_ERROR: "Imaginea nu a putut fi încărcată" - AJAX_ERROR: "Conținutul nu a putut fi încărcat" - FOLDER_LIST: - BUTTON_COMPOSE: "Compune" - BUTTON_CONTACTS: "Contacte" - BUTTON_NEW_MESSAGE: "Mesaj nou" - INBOX_NAME: "Intrări" - SENT_NAME: "Trimise" - DRAFTS_NAME: "Salvate" - SPAM_NAME: "SPAM" - TRASH_NAME: "Șterse" - ARCHIVE_NAME: "Archive" - QUOTA: - TITLE: "Cotă" - MESSAGE_LIST: - BUTTON_RELOAD: "Actualizare" - BUTTON_MOVE_TO: "Mută la" - BUTTON_DELETE: "Șterge" - BUTTON_ARCHIVE: "Archive" - BUTTON_SPAM: "SPAM" - BUTTON_NOT_SPAM: "Not SPAM" - BUTTON_EMPTY_FOLDER: "Golește folderul" - BUTTON_MULTY_FORWARD: "Redirecționează mesajul" - BUTTON_DELETE_WITHOUT_MOVE: "Șterge definitiv" - BUTTON_MORE: "Mai mult" - MENU_SET_SEEN: "Marchează ca citit" - MENU_SET_ALL_SEEN: "Marchează toate ca citite" - MENU_UNSET_SEEN: "Marchează ca necitit" - MENU_SET_FLAG: "Seteaza ca important" - MENU_UNSET_FLAG: "Setează ca neimportant" - MENU_SELECT_ALL: "Toate" - MENU_SELECT_NONE: "Deselectează" - MENU_SELECT_INVERT: "Inversează selecția" - MENU_SELECT_UNSEEN: "Necitit" - MENU_SELECT_SEEN: "Citit" - MENU_SELECT_FLAGGED: "Important" - MENU_SELECT_UNFLAGGED: "Neimportant" - EMPTY_LIST: "Nimic aici, deocamdată" - EMPTY_SEARCH_LIST: "Nu am găsit nimic." - SEARCH_RESULT_FOR: "Rezultat căutare \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "înapoi la lista de mesaje" - LIST_LOADING: "Caut..." - EMPTY_SUBJECT_TEXT: "(nici un subiect)" - PUT_MESSAGE_HERE: "EROARE! CONTACTAȚI ADIMISTRATORUL! (trimiteți un prt.scr)" - TODAY_AT: "azi %TIME%" - YESTERDAY_AT: "ieri %TIME%" - SEARCH_PLACEHOLDER: "caută mesaje" - NEW_MESSAGE_NOTIFICATION: "Aveți %COUNT% mesaje noi!" - QUOTA_SIZE: "Ați folosit %SIZE% (%PROC%%) din %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Editează" - BUTTON_BACK: "Înapoi" - BUTTON_CLOSE: "Închide" - BUTTON_DELETE: "Șterge" - BUTTON_UNSUBSCRIBE: "Dezabonare de la această listă" - BUTTON_ARCHIVE: "Archive" - BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Not Spam" - BUTTON_MOVE_TO: "Mută la" - BUTTON_MORE: "Mai mult" - BUTTON_REPLY: "Răspunde" - BUTTON_REPLY_ALL: "Răspunde la toți" - BUTTON_FORWARD: "Redirecționează" - BUTTON_FORWARD_AS_ATTACHMENT: "Redirecționează cu atașament" - BUTTON_EDIT_AS_NEW: "Editează ca nou" - BUTTON_SHOW_IMAGES: "Arată imaginile" - BUTTON_NOTIFY_READ_RECEIPT: "Anunță expeditorul că am citit mesajul" - BUTTON_IN_NEW_WINDOW: "Deschide într-o fereastră separată" - BUTTON_THREAD_LIST: "Thread list" - BUTTON_THREAD_PREV: "Înapoi" - BUTTON_THREAD_NEXT: "Înainte" - BUTTON_THREAD_MORE: "Mai multe mesaje" - MENU_HEADERS: "Vezi titlurile" - MENU_VIEW_ORIGINAL: "Vezi originalul" - MENU_DOWNLOAD_ORIGINAL: "Descărcați ca fișier eml" - MENU_FILTER_SIMILAR: "Filtrează similarele" - MENU_PRINT: "Printează" - EMPTY_SUBJECT_TEXT: "(nici un subiect)" - LABEL_SUBJECT: "Subiect" - LABEL_DATE: "Data" - LABEL_FROM: "De la" - LABEL_FROM_SHORT: "de la" - LABEL_TO: "către" - LABEL_TO_SHORT: "către" - LABEL_CC: "copie către" - LABEL_BCC: "copie 2 către" - LABEL_REPLY_TO: "Reply-To" - PRINT_LABEL_FROM: "de la" - PRINT_LABEL_TO: "către" - PRINT_LABEL_CC: "copie către" - PRINT_LABEL_BCC: "a doua copie către" - PRINT_LABEL_REPLY_TO: "Reply-To" - PRINT_LABEL_DATE: "Data" - PRINT_LABEL_SUBJECT: "Subiect" - PRINT_LABEL_ATTACHMENTS: "Atașament" - MESSAGE_LOADING: "Se încarcă..." - MESSAGE_VIEW_DESC: "Selectați un mesaj pentru a-l vizualiza." - MESSAGE_VIEW_MOVE_DESC: "Faceți clic pe numele dosarului din panoul din stânga pentru a selecta destinația." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Parolă" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" - LINK_DOWNLOAD_AS_ZIP: "Download as zip" - LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" - LINK_SAVE_TO_CLOUD: "Salvați în Cloud" - LINK_SAVE_TO_DROPBOX: "Save to Dropbox" - READ_RECEIPT: - SUBJECT: "Mesajul dumneavoastră a fost citit - %SUBJECT%" - BODY: | - Aceasta este o confirmare de citire pentru mesajul trimis la adresa %READ-RECEIPT%. - - Примечание: Această notificare de citire însemnă că mesajul ajuns la destinatar. Această funție nu garanteză că destinatarul a citit conținutul mesajului - SUGGESTIONS: - SEARCHING_DESC: "Căutare..." - CONTACTS: - LEGEND_CONTACTS: "Contact" - SEARCH_INPUT_PLACEHOLDER: "Caută contacte" - BUTTON_ADD_CONTACT: "Adugă un contact" - BUTTON_CREATE_CONTACT: "Salvează" - BUTTON_UPDATE_CONTACT: "Actualizează" - BUTTON_IMPORT: "Importă (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" - BUTTON_EXPORT_CSV: "Export (csv)" - ERROR_IMPORT_FILE: "Nu s-a putut importa (formatul fișierului este greșit)" - LIST_LOADING: "Se încarcă..." - EMPTY_LIST: "Agenda este goală" - EMPTY_SEARCH: "Nu am găsit nimic." - CLEAR_SEARCH: "Golește căutarea" - CONTACT_VIEW_DESC: "Selectați un contact pentru a-l vizualiza" - LABEL_DISPLAY_NAME: "Nume complet" - LABEL_EMAIL: "Adresa de eMail" - LABEL_PHONE: "Тelefon" - LABEL_WEB: "Web" - LABEL_BIRTHDAY: "Birthday" - LINK_ADD_EMAIL: "Adugă Mail nou" - LINK_ADD_PHONE: "Adaugă un număr nou" - LINK_BIRTHDAY: "Birthday" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Introduceți numele complet" - PLACEHOLDER_ENTER_LAST_NAME: "Prenume" - PLACEHOLDER_ENTER_FIRST_NAME: "Nume" - PLACEHOLDER_ENTER_NICK_NAME: "Enter nickname" - LABEL_READ_ONLY: "Doar pentru citire" - LABEL_SHARE: "Distribuie" - ADD_MENU_LABEL: "Add" - ADD_MENU_NICKNAME: "Nickname" - ADD_MENU_NOTES: "Notes" - ADD_MENU_EMAIL: "Email" - ADD_MENU_PHONE: "Phone" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Address" - ADD_MENU_BIRTHDAY: "Birthday" - ADD_MENU_TAGS: "Tags" - BUTTON_SHARE_NONE: "Nimic" - BUTTON_SHARE_ALL: "Toate" - BUTTON_SYNC: "Synchronization (CardDAV)" - COMPOSE: - TITLE_FROM: "De la" - TITLE_TO: "Către" - TITLE_CC: "Copie" - TITLE_BCC: "Copie 2" - TITLE_REPLY_TO: "Răspune la" - TITLE_SUBJECT: "Subiect" - LINK_SHOW_INPUTS: "Extinde" - BUTTON_SEND: "Trimite" - BUTTON_SAVE: "Salvează" - BUTTON_DELETE: "Șterge" - BUTTON_CANCEL: "Anulează" - BUTTON_MINIMIZE: "Minimize" - SAVED_TIME: "Salvat la %TIME%" - SAVED_ERROR_ON_SEND: "Mesajul a fost trimis, dar nu a fost slavat" - DISCARD_UNSAVED_DATA: "Discard unsaved data?" - ATTACH_FILES: "Atașează fișiere" - ATTACH_DROP_FILES_DESC: "Puneți fișierele aici" - ATTACH_ITEM_CANCEL: "Anulează" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% a scris" - FORWARD_MESSAGE_TOP_TITLE: "-------- Mesajul original -------" - FORWARD_MESSAGE_TOP_FROM: "De la" - FORWARD_MESSAGE_TOP_TO: "Către" - FORWARD_MESSAGE_TOP_CC: "Copie" - FORWARD_MESSAGE_TOP_SENT: "Primit la" - FORWARD_MESSAGE_TOP_SUBJECT: "Subiect" - EMPTY_TO_ERROR_DESC: "Vă rugăm să specificați cel puțin un destinatar" - NO_ATTACHMENTS_HERE_DESC: "No attachments here." - ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet" - BUTTON_REQUEST_READ_RECEIPT: "Cere confirmare de citire" - BUTTON_MARK_AS_IMPORTANT: "Mark as important" - BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" - BUTTON_REQUEST_DSN: "Request a delivery receipt" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Close" - POPUPS_ASK: - BUTTON_YES: "Da" - BUTTON_NO: "Nu" - DESC_WANT_CLOSE_THIS_WINDOW: "Sigur doriți să închideți această fereastră?" - DESC_WANT_DELETE_MESSAGES: "Sigur doriți să ștergeți mesajul(e)?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Limbă" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Adăugați un cont" - BUTTON_ADD_ACCOUNT: "Adaugă" - TITLE_UPDATE_ACCOUNT: "Update Account?" - BUTTON_UPDATE_ACCOUNT: "Update" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Adăugați un profil" - TITLE_UPDATE_IDENTITY: "Actualizați profilul" - BUTTON_ADD_IDENTITY: "Adăugați" - BUTTON_UPDATE_IDENTITY: "Actualizați" - LABEL_EMAIL: "eMail" - LABEL_NAME: "Nume" - LABEL_REPLY_TO: "Răspune la" - LABEL_SIGNATURE: "Signature" - LABEL_CC: "Cc" - LABEL_BCC: "Copie" - LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Creați un dosar" - LABEL_NAME: "Nume" - LABEL_PARENT: "Dosar părinte" - BUTTON_CREATE: "Сrează" - BUTTON_CANCEL: "Anulează" - BUTTON_CLOSE: "Închide" - TITLE_CREATING_PROCESS: "Creez dosarul" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Goliți dosarul ?" - BUTTON_CLEAR: "Curăță" - BUTTON_CANCEL: "Anulează" - BUTTON_CLOSE: "Închide" - DANGER_DESC_WARNING: "Atenție!" - DANGER_DESC_HTML_1: "Această acțiune va conduce la eliminarea completă a tuturor mesajelor din dosarul %FOLDER%." - DANGER_DESC_HTML_2: "După începerea procesului de curățare nu mai puteți anula procesul." - TITLE_CLEARING_PROCESS: "Curăț dosarul..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Import OpenPGP key" - BUTTON_IMPORT_OPEN_PGP_KEY: "Import" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "View OpenPGP key" - BUTTON_SELECT: "Select" - BUTTON_CLOSE: "Close" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP keys" - LABEL_EMAIL: "Email" - LABEL_NAME: "Name" - LABEL_PASSWORD: "Password" - LABEL_KEY_BIT_LENGTH: "Key length" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" - LABEL_SIGN: "Sign" - LABEL_ENCRYPT: "Encrypt" - LABEL_PASSWORD: "Password" - BUTTON_SIGN: "Sign" - BUTTON_ENCRYPT: "Encrypt" - BUTTON_SIGN_AND_ENCRYPT: "Sign and encrypt" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" - LABEL_KEY: "Private Key" - LABEL_PASSWORD: "Password" - BUTTON_DECRYPT: "Decrypt" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "2-Step verification test" - LABEL_CODE: "Code" - BUTTON_TEST: "Test" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Create a filter?" - TITLE_EDIT_FILTER: "Update filter?" - FILTER_NAME: "Name" - LEGEND_CONDITIONS: "Conditions" - LEGEND_ACTIONS: "Actions" - BUTTON_DONE: "Done" - BUTTON_ADD_CONDITION: "Add a Condition" - SELECT_ACTION_NONE: "None" - SELECT_ACTION_MOVE_TO: "Move to" - SELECT_ACTION_FORWARD_TO: "Forward to" - SELECT_ACTION_REJECT: "Reject" - SELECT_ACTION_VACATION_MESSAGE: "Vacation message" - SELECT_ACTION_DISCARD: "Discard" - SELECT_FIELD_FROM: "From" - SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" - SELECT_FIELD_SUBJECT: "Subject" - SELECT_FIELD_HEADER: "Header" - SELECT_FIELD_SIZE: "Size" - SELECT_TYPE_CONTAINS: "Contains" - SELECT_TYPE_NOT_CONTAINS: "Not Contains" - SELECT_TYPE_MATCHES: "Matches (* and ? supported)" - SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" - SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Not Regexp" - SELECT_TYPE_EQUAL_TO: "Equal To" - SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" - SELECT_TYPE_OVER: "Over" - SELECT_TYPE_UNDER: "Under" - SELECT_MATCH_ANY: "Matching any of the following rules" - SELECT_MATCH_ALL: "Matching all of the following rules" - MARK_AS_READ_LABEL: "Mark as read" - REPLY_INTERVAL_LABEL: "Reply interval (days)" - KEEP_LABEL: "Keep" - STOP_LABEL: "Don't stop processing rules" - EMAIL_LABEL: "Email" - VACATION_SUBJECT_LABEL: "Subject (optional)" - VACATION_MESSAGE_LABEL: "Message" - VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" - REJECT_MESSAGE_LABEL: "Reject message" - ALL_INCOMING_MESSAGES_DESC: "All incoming messages" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Selectați dosarul de sistem" - SELECT_CHOOSE_ONE: "Nu a fost încă selectat" - SELECT_UNUSE_NAME: "Nu uitilizați" - LABEL_SENT: "Trimise" - LABEL_DRAFTS: "Salvate" - LABEL_SPAM: "SPAM" - LABEL_TRASH: "Șterse" - LABEL_ARCHIVE: "Archive" - BUTTON_CANCEL: "Anulează" - BUTTON_CLOSE: "Închide" - NOTIFICATION_SENT: | - Вы еще не выбрали системную папку "Отправленные", в которую складываются все сообщения после отправки. - Если вы не хотите сохранять отправленные письма, пожалуйста, выберите пункт "Не использовать". - NOTIFICATION_DRAFTS: "Вы еще не выбрали системную папку \"Черновики\", в которую складываются все сохраненые сообщения." - NOTIFICATION_SPAM: | - Вы еще не выбрали системную папку "Спам", в которую складываются все спамовые сообщения. - Если же вы хотите удалять письма сразу, пожалуйста, выберите пункт "Не использовать". - NOTIFICATION_TRASH: | - Вы еще не выбрали системную папку "Удаленные", в которую складываются все сообщения после удаления. - Если же вы хотите удалять письма сразу, пожалуйста, выберите пункт "Не использовать". - NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "2-Step Verification" - LABEL_ENABLE_TWO_FACTOR: "Enable 2-Step verification" - LABEL_TWO_FACTOR_USER: "User" - LABEL_TWO_FACTOR_STATUS: "Status" - LABEL_TWO_FACTOR_SECRET: "Secret" - LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" - BUTTON_CREATE: "Create New Secret" - BUTTON_ACTIVATE: "Activate" - BUTTON_CLEAR: "Clear" - BUTTON_LOGOUT: "Logout" - BUTTON_DONE: "Done" - BUTTON_TEST: "Test" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Show Secret" - BUTTON_HIDE_SECRET: "Hide Secret" - TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" - TWO_FACTOR_SECRET_DESC: >- - Import this info into your Google Authenticator client (or other TOTP client) - using the provided QR code below or by entering the code manually. - TWO_FACTOR_BACKUP_CODES_DESC: >- - If you can't receive codes via Google Authenticator, you can use backup codes - to sign in. After you’ve used a backup code to sign in, it will become inactive. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." - TITLES: - LOADING: "Se încarcă" - LOGIN: "Conectare" - MAILBOX: "Poștă" - SETTINGS: "Opțiuni" - COMPOSE: "Compune" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Fișierul este prea mare" - ERROR_FILE_PARTIALLY_UPLOADED: "Fișierul nu este încărcat complet" - ERROR_NO_FILE_UPLOADED: "Nici un fișier încărcat" - ERROR_MISSING_TEMP_FOLDER: "Eroare la salvarea unui fișier" - ERROR_ON_SAVING_FILE: "Eroare la salvarea unui fișier" - ERROR_FILE_TYPE: "Tip de fișier invalid" - ERROR_UNKNOWN: "Eroare la încărcarea de fișiere" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" - TEXT_SWITCHER_RICH_FORMATTING: "Text formatat" - TEXT_SWITCHER_CONFIRM: "Formatarea textului și imaginile vor fi pierdute. Sigur doriți să continuați?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Personal" - LABEL_GENERAL_NAME: "De bază" - LABEL_CONTACTS_NAME: "Contacte" - LABEL_FOLDERS_NAME: "Dosare" - LABEL_ACCOUNTS_NAME: "Conturi" - LABEL_IDENTITY_NAME: "Profil" - LABEL_IDENTITIES_NAME: "Profiluri" - LABEL_FILTERS_NAME: "Filters" - LABEL_TEMPLATES_NAME: "Templates" - LABEL_SECURITY_NAME: "Security" - LABEL_SOCIAL_NAME: "Social" - LABEL_THEMES_NAME: "Subiecte" - LABEL_CHANGE_PASSWORD_NAME: "Parolă" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Înapoi" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filters" - BUTTON_SAVE: "Save" - BUTTON_ADD_FILTER: "Add a Filter" - BUTTON_DELETE: "Delete" - BUTTON_RAW_SCRIPT: "Use Custom User Script" - SUBNAME_NONE: "None" - SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" - SUBNAME_REJECT: "Reject" - SUBNAME_VACATION_MESSAGE: "Vacation message" - SUBNAME_DISCARD: "Discard" - CAPABILITY_LABEL: "Capability" - LOADING_PROCESS: "Updating filter list" - DELETING_ASK: "Are you sure?" - CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Setările de profil" - LABEL_DISPLAY_NAME: "Nume" - LABEL_REPLY_TO: "Răspunde la" - LABEL_SIGNATURE: "Semnătură" - LABEL_ADD_SIGNATURE_TO_ALL: "Adăugă semnătura la toate mesajele trimise" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Security" - LABEL_CONFIGURE_TWO_FACTOR: "Configurați verificarea în 2 pași" - LABEL_AUTOLOGOUT: "Auto Logout" - AUTOLOGIN_NEVER_OPTION_NAME: "Never" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% oră(ore)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Setări de bază" - LABEL_LANGUAGE: "Limbă" - LABEL_IDENTITY: "Identity" - LABEL_LAYOUT: "Layout" - LABEL_LAYOUT_NO_SPLIT: "No Split" - LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" - LABEL_EDITOR: "Editor de text implicit" - LABEL_EDITOR_HTML: "Formatat" - LABEL_EDITOR_PLAIN: "Simplu" - LABEL_EDITOR_HTML_FORCED: "Html (forced)" - LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" - LABEL_ANIMATION: "Interfață animație" - LABEL_ANIMATION_FULL: "Complet" - LABEL_ANIMATION_NORMAL: "Normal" - LABEL_ANIMATION_NONE: "nu" - LABEL_VIEW_OPTIONS: "Afișare" - LABEL_USE_PREVIEW_PANE: "Folosiți un mod de afișare cu trei coloane" - LABEL_USE_CHECKBOXES_IN_LIST: "Afișează listele checkbox" - LABEL_USE_THREADS: "Minimizează scrisorile" - LABEL_REPLY_SAME_FOLDER: "Răspunsurile în același folder cu originalul" - LABEL_SHOW_IMAGES: "Arată imaginile externe în corpul mesajului, fără avertisment" - LABEL_SHOW_ANIMATION: "Utilizați animația" - LABEL_MESSAGE_PER_PAGE: "Mesaje pe o pagină" - LABEL_NOTIFICATIONS: "Notificări" - LABEL_SOUND_NOTIFICATION: "Sound notification" - LABEL_CHROME_NOTIFICATION_DESC: "Afișați notificări desktop pentru mesaje noi" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(browser-ul blocat)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Contacte" - LABEL_CONTACTS_AUTOSAVE: "Adaugă automat destinatarii la agenda de scrisori" - LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" - LABEL_CONTACTS_SYNC_SERVER: "Server" - LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" - LABEL_CONTACTS_SYNC_USER: "User" - LABEL_CONTACTS_SYNC_PASSWORD: "Password" - SETTINGS_THEMES: - LEGEND_THEMES: "Tematică" - LEGEND_THEMES_CUSTOM: "Setați o temă particularizată" - LABEL_CUSTOM_TYPE: "Tip Teme" - LABEL_CUSTOM_TYPE_LIGHT: "Lumina" - LABEL_CUSTOM_TYPE_DARK: "Umbră" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Imaginea de pe fundal" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Încărcați o imagine de fundal (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "Fișier prea mare" - ERROR_FILE_TYPE_ERROR: "Tip de fișier invalid (numai JPG sau PNG)" - ERROR_UNKNOWN: "Eroare la încărcarea de fișiere" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Conectează-te cu Google" - BUTTON_GOOGLE_DISCONNECT: "Deconectați contul Google" - MAIN_GOOGLE_DESC: "După conectarea la Google, vă puteți conecta la acest cont folosind butonul Google de pe ecranul de login." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Conectați-va cu Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Deconectați contul de Facebook" - MAIN_FACEBOOK_DESC: "După conectarea la Facebook, vă puteți conecta la acest cont folosind butonul Facebook de pe ecranul de login." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Conectați-vă cu Twitter" - BUTTON_TWITTER_DISCONNECT: "Deconectați contul de Twitter" - MAIN_TWITTER_DESC: "După conectarea la Twitter, vă puteți conecta la acest cont folosind butonul Twitter de pe ecranul de login." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Lista de dosare" - BUTTON_CREATE: "Creare dosar" - BUTTON_SYSTEM: "System Folders" - BUTTON_DELETE: "Șterge" - BUTTON_SUBSCRIBE: "Abonare" - BUTTON_UNSUBSCRIBE: "Dezabonare" - LOADING_PROCESS: "Actualizez lista de dosare" - CREATING_PROCESS: "Crearea dosarului..." - DELETING_PROCESS: "Șterg dosarul..." - RENAMING_PROCESS: "Redenumesc dosarul" - DELETING_ASK: "Sunteți sigur?" - TO_MANY_FOLDERS_DESC_1: "You have too many folders!" - TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." - HELP_DELETE_FOLDER: "Delete folder" - HELP_SHOW_HIDE_FOLDER: "Show/hide folder" - HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Lista de Conturi" - LEGEND_IDENTITIES: "Identities" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" - BUTTON_ADD_ACCOUNT: "Adaugă un alt cont" - BUTTON_ADD_IDENTITY: "Add an Identity" - BUTTON_DELETE: "Șterge" - LOADING_PROCESS: "Actualizez lista de conturi" - DELETING_ASK: "Sunteți sigur?" - DEFAULT_IDENTITY_LABEL: "default" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Setările de profil de bază" - LEGEND_IDENTITIES: "Profiluri suplimentare" - LABEL_DEFAULT: "Default" - LABEL_DISPLAY_NAME: "Nume" - LABEL_REPLY_TO: "Răspunde la" - LABEL_SIGNATURE: "Semnătură" - LABEL_ADD_SIGNATURE_TO_ALL: "Adaugă semnătura la toate mesajele trimise" - BUTTON_ADD_IDENTITY: "Adăugați un profil" - BUTTON_DELETE: "Șterge" - LOADING_PROCESS: "Actualizez lista de profile" - DELETING_ASK: "Sunteți sigur?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Schimbare parolă" - LABEL_CURRENT_PASSWORD: "Parola curentă" - LABEL_NEW_PASSWORD: "Noua parolă" - LABEL_REPEAT_PASSWORD: "Confirmați parola" - BUTTON_UPDATE_PASSWORD: "Salvați noua parolă" - ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" - TITLE_PRIVATE: "Private" - TITLE_PUBLIC: "Public" - DELETING_ASK: "Are you sure?" - GENERATE_ONLY_HTTPS: "HTTPS only" - LABEL_ALLOW_DRAFT_AUTOSAVE: "Salvează ciorna automat" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" - TAB_MAILBOX: "Mailbox" - TAB_MESSAGE_LIST: "Message list" - TAB_MESSAGE_VIEW: "Message view" - TAB_COMPOSE: "Compose" - LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" - LABEL_REPLY: "Reply" - LABEL_REPLY_ALL: "Reply All" - LABEL_FORWARD: "Forward" - LABEL_FORWARD_MULTIPLY: "Forward (multiply)" - LABEL_HELP: "Help" - LABEL_CHECK_ALL: "Select all messages" - LABEL_ARCHIVE: "Archive" - LABEL_DELETE: "Delete" - LABEL_OPEN_THREAD: "Open selected thread" - LABEL_MOVE: "Move" - LABEL_READ: "Read selected messages" - LABEL_UNREAD: "Unread selected messages" - LABEL_IMPORTANT: "Important, flag selected messages" - LABEL_SEARCH: "Search" - LABEL_CANCEL_SEARCH: "Cancel search" - LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" - LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" - LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" - LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" - LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" - LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" - LABEL_THREAD_NEXT: "Next message in thread" - LABEL_THREAD_PREV: "Previous message in thread" - LABEL_PRINT: "Print" - LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" - LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" - LABEL_SWITCH_TO_LIST: "Switch focus back to message list" - LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" - LABEL_SAVE_MESSAGE: "Save message" - LABEL_SEND_MESSAGE: "Send message" - LABEL_CLOSE_COMPOSE: "Close compose" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "No public keys found" - NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" - NO_PRIVATE_KEY_FOUND: "No private key found" - NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" - ADD_A_PUBLICK_KEY: "Add a public key" - SELECT_A_PRIVATE_KEY: "Setectați o cheie privată" - UNVERIFIRED_SIGNATURE: "Unverified signature" - DECRYPTION_ERROR: "OpenPGP decryption error" - GOOD_SIGNATURE: "Good signature from %USER%" - PGP_ERROR: "OpenPGP error: %ERROR%" - SPECIFY_FROM_EMAIL: "Please specify FROM email address" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" - NOTIFICATIONS: - INVALID_TOKEN: "Semn invalid" - AUTH_ERROR: "Nu se poate realiza conectarea" - ACCESS_ERROR: "Eroare de acces" - CONNECTION_ERROR: "Eroare la conectarea la server." - CAPTCHA_ERROR: "Cuvântul de securitate nu este corect." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- - Pentru acest utilizator nu sa asigurat încă un cont de e-mail. Conectați-vă - cu contul dvs. de e-mail și activați această caracteristică în setările. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- - Pentru acest utilizator nu sa asigurat încă un cont de e-mail. Conectați-vă - cu contul dvs. de e-mail și activați această caracteristică în setările. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- - Pentru acest utilizator nu sa asigurat încă un cont de e-mail. Conectați-vă - cu contul dvs. de e-mail și activați această caracteristică în setările. - DOMAIN_NOT_ALLOWED: "Domeniul nu apartine de Wey5" - ACCOUNT_NOT_ALLOWED: "Contul nu are permisiunea de conectare" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" - COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" - CURRENT_PASSWORD_INCORRECT: "Current password incorrect" - NEW_PASSWORD_SHORT: "Password is too short" - NEW_PASSWORD_WEAK: "Password is too easy" - NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" - CONTACTS_SYNC_ERROR: "Contacts synchronization error" - CANT_GET_MESSAGE_LIST: "Nu găsesc o lista de scrisori" - CANT_GET_MESSAGE: "Nu pot obține scrisoarea. Încercați din nou" - CANT_DELETE_MESSAGE: "Nu pot șterge scrisoarea. Încercați din nou" - CANT_MOVE_MESSAGE: "Nu pot muta scrisoarea.Încercați din nou" - CANT_SAVE_MESSAGE: "Nu pot salva mesajul. Încercați din nou" - CANT_SEND_MESSAGE: "Nu pot trimite scrisoarea.Încercați din nou" - INVALID_RECIPIENTS: "Verificați dacă ați introdus toate adresele." - CANT_SAVE_FILTERS: "Can't save filters" - CANT_GET_FILTERS: "Can't get filters" - FILTERS_ARE_NOT_CORRECT: "Filters are not correct" - CANT_CREATE_FOLDER: "Nu crea dosarul. Încercați din nou" - CANT_RENAME_FOLDER: "Nu pot redenumi dosarul. Încercați din nou" - CANT_DELETE_FOLDER: "Nu pot șterge dosarul. Încercați din nou" - CANT_DELETE_NON_EMPTY_FOLDER: "Nu pot șterge un dosar care nu este gol" - CANT_SUBSCRIBE_FOLDER: "Nu pot semna dosarul. Încercați din nou" - CANT_UNSUBSCRIBE_FOLDER: "Nu mă pot dezbona. Încercați din nou" - CANT_SAVE_SETTINGS: "Nu pot salva opțiunile. Încercați din nou" - CANT_SAVE_PLUGIN_SETTINGS: "Nu pot salva setările. Încercați din nou" - DOMAIN_ALREADY_EXISTS: "Domeniu există deja." - CANT_INSTALL_PACKAGE: "Nu pot instala pachetul.Încercați din nou" - CANT_DELETE_PACKAGE: "Nu pot șterge pachetul. Încercați din nou" - INVALID_PLUGIN_PACKAGE: "Pachetul este invalid" - UNSUPPORTED_PLUGIN_PACKAGE: "Plugin-ul necesită sprijinul complet al serverului" - LICENSING_SERVER_IS_UNAVAILABLE: "Server de abonamente este temporar indisponibil." - LICENSING_DOMAIN_EXPIRED: "Subscription for this domain has expired." - LICENSING_DOMAIN_BANNED: "Subscription for this domain is banned." - DEMO_SEND_MESSAGE_ERROR: "Cont demo trimite e-mail la adresele de e-mail externe este interzisă!" - DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" - ACCOUNT_ALREADY_EXISTS: "Contul deja există" - ACCOUNT_DOES_NOT_EXIST: "contul nu există" - MAIL_SERVER_ERROR: "Nu am reușit să accesez serverul de e-mail" - INVALID_INPUT_ARGUMENT: "Invalid input argument" - UNKNOWN_ERROR: "Eroare necunoscută" - STATIC: - BACK_LINK: "Actualizare" - DOMAIN_LIST_DESC: "Lista de domenii care au permisiunea de a fi accesate prin webmail." - PHP_EXSTENSIONS_ERROR_DESC: "Extensiile PHP necesare nu sunt instalate pe server-ul dvs.!" - PHP_VERSION_ERROR_DESC: "Versiunea dvs. de PHP (%VERSION%) este mai mica de cea dorită, 5.3.0!" - NO_SCRIPT_TITLE: "Pentru rulare este necesar JavaScript." - NO_SCRIPT_DESC: | - Aparent, JavaScript nu este instalat, sau nu este acceptat de browserul dumneavoastră. - Activați JavaScript, schimband optiunile browserului dvs., apoi încercați din nou. - NO_COOKIE_TITLE: "Cererea necesită Cookie-uri." - NO_COOKIE_DESC: | - Aparent, Cookie sau nu este acceptat de browser-ul dvs. sau oprit. - Întoarceți Cookie, schimband optiunile browserului dvs., apoi încercați din nou. - BAD_BROWSER_TITLE: "Browser-ul dvs. este depășit." - BAD_BROWSER_DESC: | - Pentru a utiliza toate caracteristicile cererii, - descărcați și instalați unul dintre aceste browsere: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ru_RU.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ru_RU.yml deleted file mode 100755 index 50310276..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/ru_RU.yml +++ /dev/null @@ -1,713 +0,0 @@ -ru_RU: - LOGIN: - LABEL_EMAIL: "Почта" - LABEL_LOGIN: "Логин" - LABEL_PASSWORD: "Пароль" - LABEL_SIGN_ME: "Запомнить меня" - LABEL_VERIFICATION_CODE: "Код подтверждения" - LABEL_DONT_ASK_VERIFICATION_CODE: "Не спрашивать код в течение 2-х недель" - BUTTON_SIGN_IN: "Войти" - TITLE_SIGN_IN_GOOGLE: "Войти, используя Google" - TITLE_SIGN_IN_FACEBOOK: "Войти, используя Facebook" - TITLE_SIGN_IN_TWITTER: "Войти, используя Twitter" - LABEL_FORGOT_PASSWORD: "Забытый пароль" - LABEL_REGISTRATION: "Регистрация" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Добавить ещё аккаунт" - BUTTON_SETTINGS: "Настройки" - BUTTON_HELP: "Помощь" - BUTTON_LOGOUT: "Выйти" - MOBILE: - BUTTON_MOBILE_VERSION: "Мобильная версия" - BUTTON_DESKTOP_VERSION: "Полная версия" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Поиск писем" - TITLE_ADV: "Расширенный поиск писем" - LABEL_ADV_FROM: "От" - LABEL_ADV_TO: "Кому" - LABEL_ADV_SUBJECT: "Тема" - LABEL_ADV_TEXT: "Текст" - LABEL_ADV_HAS_ATTACHMENT: "С файлами" - LABEL_ADV_HAS_ATTACHMENTS: "С файлами" - LABEL_ADV_FLAGGED: "Помеченные" - LABEL_ADV_UNSEEN: "Непрочитанные" - LABEL_ADV_DATE: "Дата" - LABEL_ADV_DATE_ALL: "За все время" - LABEL_ADV_DATE_3_DAYS: "За три дня" - LABEL_ADV_DATE_7_DAYS: "За неделю" - LABEL_ADV_DATE_MONTH: "За месяц" - LABEL_ADV_DATE_3_MONTHS: "За 3 месяца" - LABEL_ADV_DATE_6_MONTHS: "За полгода" - LABEL_ADV_DATE_YEAR: "За год" - BUTTON_ADV_SEARCH: "Искать" - PREVIEW_POPUP: - FULLSCREEN: "Полный экран" - ZOOM: "Увеличить/уменьшить" - CLOSE: "Закрыть (Esc)" - LOADING: "Загрузка..." - GALLERY_PREV: "Назад (Стрелка ←)" - GALLERY_NEXT: "Вперед (Стрелка →)" - GALLERY_COUNTER: "%curr% из %total%" - IMAGE_ERROR: "Изображение не загрузилось." - AJAX_ERROR: "Данные не загрузились." - FOLDER_LIST: - BUTTON_COMPOSE: "Написать" - BUTTON_CONTACTS: "Контакты" - BUTTON_NEW_MESSAGE: "Новое сообщение" - INBOX_NAME: "Входящие" - SENT_NAME: "Отправленные" - DRAFTS_NAME: "Черновики" - SPAM_NAME: "Спам" - TRASH_NAME: "Корзина" - ARCHIVE_NAME: "Архив" - QUOTA: - TITLE: "Дисковая квота" - MESSAGE_LIST: - BUTTON_RELOAD: "Обновить Список Писем" - BUTTON_MOVE_TO: "Переместить" - BUTTON_DELETE: "Удалить" - BUTTON_ARCHIVE: "Архивировать" - BUTTON_SPAM: "В спам" - BUTTON_NOT_SPAM: "Не спам" - BUTTON_EMPTY_FOLDER: "Очистить всю папку" - BUTTON_MULTY_FORWARD: "Переслать сообщения" - BUTTON_DELETE_WITHOUT_MOVE: "Удалить мимо корзины" - BUTTON_MORE: "Еще" - MENU_SET_SEEN: "Отметить как прочитанное" - MENU_SET_ALL_SEEN: "Отметить все как прочитанные" - MENU_UNSET_SEEN: "Отметить как непрочитанное" - MENU_SET_FLAG: "Установить флаг" - MENU_UNSET_FLAG: "Снять флаг" - MENU_SELECT_ALL: "Все" - MENU_SELECT_NONE: "Ни одного" - MENU_SELECT_INVERT: "Инвентировать" - MENU_SELECT_UNSEEN: "Непрочитанные" - MENU_SELECT_SEEN: "Прочитанные" - MENU_SELECT_FLAGGED: "Помеченные" - MENU_SELECT_UNFLAGGED: "Без пометок" - EMPTY_LIST: "В папке нет писем." - EMPTY_SEARCH_LIST: "Письма не найдены." - SEARCH_RESULT_FOR: "Результат поиска \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "back to message list" - LIST_LOADING: "Загрузка" - EMPTY_SUBJECT_TEXT: "(Без темы)" - PUT_MESSAGE_HERE: "Киньте сообщение сюда, чтобы посмотреть его в списке" - TODAY_AT: "сегодня в %TIME%" - YESTERDAY_AT: "вчера в %TIME%" - SEARCH_PLACEHOLDER: "Поиск писем" - NEW_MESSAGE_NOTIFICATION: "У вас %COUNT% новых сообщений!" - QUOTA_SIZE: "Использовано %SIZE% (%PROC%%) из %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Редактировать" - BUTTON_BACK: "Назад" - BUTTON_CLOSE: "Закрыть" - BUTTON_DELETE: "Удалить" - BUTTON_UNSUBSCRIBE: "Отписаться" - BUTTON_ARCHIVE: "Архивировать" - BUTTON_SPAM: "В спам" - BUTTON_NOT_SPAM: "Не спам" - BUTTON_MOVE_TO: "Переместить" - BUTTON_MORE: "Еще" - BUTTON_REPLY: "Ответить на Письмо" - BUTTON_REPLY_ALL: "Ответить Всем" - BUTTON_FORWARD: "Переслать" - BUTTON_FORWARD_AS_ATTACHMENT: "Переслать как файл" - BUTTON_EDIT_AS_NEW: "Редактировать как новое" - BUTTON_SHOW_IMAGES: "Показать внешние изображения в письме" - BUTTON_NOTIFY_READ_RECEIPT: "Уведомить отправителя о прочтении этого сообщения." - BUTTON_IN_NEW_WINDOW: "В отдельном окне" - BUTTON_THREAD_LIST: "Список" - BUTTON_THREAD_PREV: "Предыдущее" - BUTTON_THREAD_NEXT: "Следующее" - BUTTON_THREAD_MORE: "Больше сообщений" - MENU_HEADERS: "Просмотреть заголовки" - MENU_VIEW_ORIGINAL: "Просмотреть оригинал" - MENU_DOWNLOAD_ORIGINAL: "Скачать как .eml файл" - MENU_FILTER_SIMILAR: "Фильтровать похожие" - MENU_PRINT: "Распечатать" - EMPTY_SUBJECT_TEXT: "(Без темы)" - LABEL_SUBJECT: "Тема" - LABEL_DATE: "Дата" - LABEL_FROM: "От" - LABEL_FROM_SHORT: "от" - LABEL_TO: "Кому" - LABEL_TO_SHORT: "кому" - LABEL_CC: "Копия" - LABEL_BCC: "Скрытая" - LABEL_REPLY_TO: "Ответить-на" - PRINT_LABEL_FROM: "От" - PRINT_LABEL_TO: "Кому" - PRINT_LABEL_CC: "Копия" - PRINT_LABEL_BCC: "Скрытая" - PRINT_LABEL_REPLY_TO: "Ответить-на" - PRINT_LABEL_DATE: "Дата" - PRINT_LABEL_SUBJECT: "Тема" - PRINT_LABEL_ATTACHMENTS: "Файлы" - MESSAGE_LOADING: "Загрузка" - MESSAGE_VIEW_DESC: "Выберите сообщение для просмотра." - MESSAGE_VIEW_MOVE_DESC: "Выберите имя папки в левой панели, чтобы переместить сообщение." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Пароль" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP подписанное сообщение (нажмите, чтобы подтвердить)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP шифрованное сообщение (нажмите, чтобы расшифровать)" - LINK_DOWNLOAD_AS_ZIP: "Сохранить как zip" - LINK_SAVE_TO_OWNCLOUD: "Сохранить в ownCloud" - LINK_SAVE_TO_CLOUD: "Сохранить в облаке" - LINK_SAVE_TO_DROPBOX: "Сохранить в Dropbox" - READ_RECEIPT: - SUBJECT: "Уведомление о прочтении письма - %SUBJECT%" - BODY: | - Это уведомление о прочтении для сообщения, которое вы отправили в адрес %READ-RECEIPT%. - - Примечание: Это уведомление о прочтении означает лишь то, что сообщение было отображено на машине получателя. - Оно не гарантирует того, что получатель прочёл или понял содержимое сообщения. - SUGGESTIONS: - SEARCHING_DESC: "Поиск..." - CONTACTS: - LEGEND_CONTACTS: "Контакты" - SEARCH_INPUT_PLACEHOLDER: "Поиск контактов" - BUTTON_ADD_CONTACT: "Добавить контакт" - BUTTON_CREATE_CONTACT: "Сохранить" - BUTTON_UPDATE_CONTACT: "Обновить" - BUTTON_IMPORT: "Импорт (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Экспорт (vcf, vCard)" - BUTTON_EXPORT_CSV: "Экспорт (csv)" - ERROR_IMPORT_FILE: "Ошибка импорта (Неправильный формат файла)" - LIST_LOADING: "Загрузка" - EMPTY_LIST: "Нет контактов" - EMPTY_SEARCH: "Контакты не найдены" - CLEAR_SEARCH: "Очистить поиск" - CONTACT_VIEW_DESC: "Выберите контакт для просмотра." - LABEL_DISPLAY_NAME: "Полное имя" - LABEL_EMAIL: "Электронная почта" - LABEL_PHONE: "Телефон" - LABEL_WEB: "Сайт" - LABEL_BIRTHDAY: "День рождения" - LINK_ADD_EMAIL: "Добавьте адрес электронной почты" - LINK_ADD_PHONE: "Добавьте телефон" - LINK_BIRTHDAY: "День рождения" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Введите полное имя" - PLACEHOLDER_ENTER_LAST_NAME: "Введите имя" - PLACEHOLDER_ENTER_FIRST_NAME: "Введите фамилию" - PLACEHOLDER_ENTER_NICK_NAME: "Введите ник" - LABEL_READ_ONLY: "Только чтение" - LABEL_SHARE: "Поделиться" - ADD_MENU_LABEL: "Добавить" - ADD_MENU_NICKNAME: "Ник" - ADD_MENU_NOTES: "Примечания" - ADD_MENU_EMAIL: "Почту" - ADD_MENU_PHONE: "Телефон" - ADD_MENU_URL: "Сайт" - ADD_MENU_ADDRESS: "Адрес" - ADD_MENU_BIRTHDAY: "День рождения" - ADD_MENU_TAGS: "Тэги" - BUTTON_SHARE_NONE: "Отменить" - BUTTON_SHARE_ALL: "Всем" - BUTTON_SYNC: "Синхронизация (CardDAV)" - COMPOSE: - TITLE_FROM: "От" - TITLE_TO: "Кому" - TITLE_CC: "Копия" - TITLE_BCC: "Скрытая" - TITLE_REPLY_TO: "Отвечать на" - TITLE_SUBJECT: "Тема" - LINK_SHOW_INPUTS: "Показать все поля" - BUTTON_SEND: "Отправить" - BUTTON_SAVE: "Сохранить" - BUTTON_DELETE: "Удалить" - BUTTON_CANCEL: "Отменить" - BUTTON_MINIMIZE: "Minimize" - SAVED_TIME: "Сохранено в %TIME%" - SAVED_ERROR_ON_SEND: "Сообщение было отправлено, но не было сохранено" - DISCARD_UNSAVED_DATA: "Discard unsaved data?" - ATTACH_FILES: "Прикрепить файлы" - ATTACH_DROP_FILES_DESC: "Поместите файлы сюда" - ATTACH_ITEM_CANCEL: "Отменить" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% написал" - FORWARD_MESSAGE_TOP_TITLE: "-------- Пересланное сообщение -------" - FORWARD_MESSAGE_TOP_FROM: "От" - FORWARD_MESSAGE_TOP_TO: "Кому" - FORWARD_MESSAGE_TOP_CC: "Копия" - FORWARD_MESSAGE_TOP_SENT: "Отправлено" - FORWARD_MESSAGE_TOP_SUBJECT: "Тема" - EMPTY_TO_ERROR_DESC: "Укажите как минимум одного получателя" - NO_ATTACHMENTS_HERE_DESC: "Прикреплённые файлы отсутствуют." - ATTACHMENTS_ERROR_DESC: "Внимание! Не все прикреплённые файлы были загружены." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Не все прикреплённые файлы были загружены" - BUTTON_REQUEST_READ_RECEIPT: "Запрос о прочтении письма" - BUTTON_MARK_AS_IMPORTANT: "Отметить как важное" - BUTTON_OPEN_PGP: "OpenPGP (только обычный текст)" - BUTTON_REQUEST_DSN: "Запросить уведомление о доставке" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Close" - POPUPS_ASK: - BUTTON_YES: "Да" - BUTTON_NO: "Нет" - DESC_WANT_CLOSE_THIS_WINDOW: "Вы уверены, что хотите закрыть это окно?" - DESC_WANT_DELETE_MESSAGES: "Вы уверены, что хотите удалить сообщение(я)?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Выберите язык" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Добавить ещё аккаунт?" - BUTTON_ADD_ACCOUNT: "Добавить" - TITLE_UPDATE_ACCOUNT: "Обновить аккаунт?" - BUTTON_UPDATE_ACCOUNT: "Обновить" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Добавить Профиль?" - TITLE_UPDATE_IDENTITY: "Обновить Профиль?" - BUTTON_ADD_IDENTITY: "Добавить" - BUTTON_UPDATE_IDENTITY: "Обновить" - LABEL_EMAIL: "Почта" - LABEL_NAME: "Имя" - LABEL_REPLY_TO: "Отвечать на" - LABEL_SIGNATURE: "Подпись" - LABEL_CC: "Cc" - LABEL_BCC: "Скрытая" - LABEL_SIGNATURE_INSERT_BEFORE: "Вставлять подпись перед отцитированным текстом в ответах" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Создать папку?" - LABEL_NAME: "Имя папки" - LABEL_PARENT: "Родительская папка" - BUTTON_CREATE: "Создать" - BUTTON_CANCEL: "Отменить" - BUTTON_CLOSE: "Закрыть" - TITLE_CREATING_PROCESS: "Cоздание папки" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Очистить папку от писем?" - BUTTON_CLEAR: "Очистить" - BUTTON_CANCEL: "Отменить" - BUTTON_CLOSE: "Закрыть" - DANGER_DESC_WARNING: "Внимание!" - DANGER_DESC_HTML_1: "Данное действие приведет к полному удалению всех писем из папки %FOLDER%." - DANGER_DESC_HTML_2: "После начала очистки, процесс нельзя будет остановить или отменить." - TITLE_CLEARING_PROCESS: "Очистка папки..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Импорт OpenPGP ключа" - BUTTON_IMPORT_OPEN_PGP_KEY: "Импорт" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Просмотр OpenPGP ключа" - BUTTON_SELECT: "Выбрать" - BUTTON_CLOSE: "Закрыть" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Генерация OpenPGP ключа" - LABEL_EMAIL: "Почта" - LABEL_NAME: "Имя" - LABEL_PASSWORD: "Пароль" - LABEL_KEY_BIT_LENGTH: "Длина ключа" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Создать" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP подпись и шифрование" - LABEL_SIGN: "Подпись" - LABEL_ENCRYPT: "Шифрование" - LABEL_PASSWORD: "Пароль" - BUTTON_SIGN: "Подпись" - BUTTON_ENCRYPT: "Шифрование" - BUTTON_SIGN_AND_ENCRYPT: "Подпись и шифрование" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "Расшифровать (OpenPGP)" - LABEL_KEY: "Приватный ключ" - LABEL_PASSWORD: "Пароль" - BUTTON_DECRYPT: "Расшифровать" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "Тест двухфакторной верификации" - LABEL_CODE: "Код" - BUTTON_TEST: "Тест" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Создать фильтр?" - TITLE_EDIT_FILTER: "Обновить фильтр?" - FILTER_NAME: "Название" - LEGEND_CONDITIONS: "Правила" - LEGEND_ACTIONS: "Действия" - BUTTON_DONE: "Закончить" - BUTTON_ADD_CONDITION: "Добавить правило" - SELECT_ACTION_NONE: "Ничего" - SELECT_ACTION_MOVE_TO: "Переместить в" - SELECT_ACTION_FORWARD_TO: "Переслать на" - SELECT_ACTION_REJECT: "Не принимать" - SELECT_ACTION_VACATION_MESSAGE: "Автоответчик" - SELECT_ACTION_DISCARD: "Уничтожить" - SELECT_FIELD_FROM: "От" - SELECT_FIELD_RECIPIENTS: "Получатели (To или CC)" - SELECT_FIELD_SUBJECT: "Тема" - SELECT_FIELD_HEADER: "Заголовок" - SELECT_FIELD_SIZE: "Размер" - SELECT_TYPE_CONTAINS: "Содержит" - SELECT_TYPE_NOT_CONTAINS: "Не содержит" - SELECT_TYPE_MATCHES: "Содержит (поддерживаются * и ?)" - SELECT_TYPE_NOT_MATCHES: "Не содержит (поддерживаются * и ?)" - SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Не Regexp" - SELECT_TYPE_EQUAL_TO: "Совпадает с" - SELECT_TYPE_NOT_EQUAL_TO: "Не совпадает с" - SELECT_TYPE_OVER: "Больше" - SELECT_TYPE_UNDER: "Меньше" - SELECT_MATCH_ANY: "Подходит под хотя бы одно из нижеперечисленных правил" - SELECT_MATCH_ALL: "Подходит под все нижеперечисленные правила" - MARK_AS_READ_LABEL: "Отметить как прочитанное" - REPLY_INTERVAL_LABEL: "Отвечать каждые (в днях)" - KEEP_LABEL: "Сохранить копию" - STOP_LABEL: "Не преращать обработку правил" - EMAIL_LABEL: "Почтка" - VACATION_SUBJECT_LABEL: "Тема (необязательно)" - VACATION_MESSAGE_LABEL: "Сообщение" - VACATION_RECIPIENTS_LABEL: "Получатели (через запятую)" - REJECT_MESSAGE_LABEL: "Причина (будет послана отправителю)" - ALL_INCOMING_MESSAGES_DESC: "Все входящие сообщения" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Выберите системые папки" - SELECT_CHOOSE_ONE: "Еще не выбрана" - SELECT_UNUSE_NAME: "Не использовать" - LABEL_SENT: "Отправленные" - LABEL_DRAFTS: "Черновики" - LABEL_SPAM: "Спам" - LABEL_TRASH: "Удаленные" - LABEL_ARCHIVE: "Архив" - BUTTON_CANCEL: "Отменить" - BUTTON_CLOSE: "Закрыть" - NOTIFICATION_SENT: | - Вы еще не выбрали системную папку "Отправленные", в которую складываются все сообщения после отправки. - Если вы не хотите сохранять отправленные письма, пожалуйста, выберите пункт "Не использовать". - NOTIFICATION_DRAFTS: "Вы еще не выбрали системную папку \"Черновики\", в которую складываются все сохраненные сообщения." - NOTIFICATION_SPAM: | - Вы еще не выбрали системную папку "Спам", в которую складываются все спамовые сообщения. - Если же вы хотите удалять письма сразу, пожалуйста, выберите пункт "Не использовать". - NOTIFICATION_TRASH: | - Вы еще не выбрали системную папку "Удаленные", в которую складываются все сообщения после удаления. - Если же вы хотите удалять письма сразу, пожалуйста, выберите пункт "Не использовать". - NOTIFICATION_ARCHIVE: "Вы еще не выбрали системную папку \"Архив\", в которую складываются все сообщения после архивации." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "Двухфакторная верификация" - LABEL_ENABLE_TWO_FACTOR: "Включить двухфакторную верификацию" - LABEL_TWO_FACTOR_USER: "Пользователь" - LABEL_TWO_FACTOR_STATUS: "Статус" - LABEL_TWO_FACTOR_SECRET: "Секретный ключ" - LABEL_TWO_FACTOR_BACKUP_CODES: "Резервные коды" - BUTTON_CREATE: "Создать новый секретный ключ" - BUTTON_ACTIVATE: "Активировать" - BUTTON_CLEAR: "Очистить" - BUTTON_LOGOUT: "Выйти" - BUTTON_DONE: "Закончить" - BUTTON_TEST: "Тест" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Показать секретный ключ" - BUTTON_HIDE_SECRET: "Скрыть секретный ключ" - TWO_FACTOR_REQUIRE_DESC: "Ваш аккаунт требует двухфакторную настройку." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Настроен" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Не настроен" - TWO_FACTOR_SECRET_DESC: > - Используйте эту информацию для настройки Google Authenticator клиента (или - другого TOTP клиента) с помощью прилагаемого QR-кода, или вручную. - TWO_FACTOR_BACKUP_CODES_DESC: > - Если вы не можете получить коды через Google Authenticator, вы можете использовать - резервные коды, чтобы войти. После того как вы использовали резервный код - для входа в систему, он становится неактивным. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Вы должны выполнить тест перед тем, как вы сможете поменять эту настройку." - TITLES: - LOADING: "Загрузка" - LOGIN: "Вход" - MAILBOX: "Почта" - SETTINGS: "Настройки" - COMPOSE: "Написать письмо" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Файл слишком большой" - ERROR_FILE_PARTIALLY_UPLOADED: "Файл не загрузился полностью" - ERROR_NO_FILE_UPLOADED: "Файл не был загружен" - ERROR_MISSING_TEMP_FOLDER: "Ошибка при сохранении файла" - ERROR_ON_SAVING_FILE: "Ошибка при сохранении файла" - ERROR_FILE_TYPE: "Неверный тип файла" - ERROR_UNKNOWN: "Ошибка загрузки файла" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" - TEXT_SWITCHER_RICH_FORMATTING: "Форматированный текст" - TEXT_SWITCHER_CONFIRM: "Форматирование текста и изображения будут потеряны. Вы уверены, что хотите продолжить?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Персональные" - LABEL_GENERAL_NAME: "Основные" - LABEL_CONTACTS_NAME: "Контакты" - LABEL_FOLDERS_NAME: "Папки" - LABEL_ACCOUNTS_NAME: "Аккаунты" - LABEL_IDENTITY_NAME: "Профиль" - LABEL_IDENTITIES_NAME: "Профили" - LABEL_FILTERS_NAME: "Фильтры" - LABEL_TEMPLATES_NAME: "Шаблоны" - LABEL_SECURITY_NAME: "Безопасность" - LABEL_SOCIAL_NAME: "Социальные" - LABEL_THEMES_NAME: "Темы" - LABEL_CHANGE_PASSWORD_NAME: "Пароль" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Назад" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Фильтры" - BUTTON_SAVE: "Сохранить" - BUTTON_ADD_FILTER: "Добавить фильтр" - BUTTON_DELETE: "Удалить" - BUTTON_RAW_SCRIPT: "Использовать собственный скрипт" - SUBNAME_NONE: "Ничего" - SUBNAME_MOVE_TO: "Переместить в \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Переслать на \"%EMAIL%\"" - SUBNAME_REJECT: "Не принимать" - SUBNAME_VACATION_MESSAGE: "Сообщение автоответчика" - SUBNAME_DISCARD: "Уничтожить" - CAPABILITY_LABEL: "Возможность" - LOADING_PROCESS: "Обновление списка фильтров" - DELETING_ASK: "Точно?" - CHACHES_NEED_TO_BE_SAVED_DESC: "Изменения ещё не сохранены на сервер." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Настройки профиля" - LABEL_DISPLAY_NAME: "Имя" - LABEL_REPLY_TO: "Отвечать на" - LABEL_SIGNATURE: "Подпись" - LABEL_ADD_SIGNATURE_TO_ALL: "Добавлять подпись ко всем исходящим сообщениям" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Безопасность" - LABEL_CONFIGURE_TWO_FACTOR: "Настроить двухфакторную верификацию" - LABEL_AUTOLOGOUT: "Автоматический выход" - AUTOLOGIN_NEVER_OPTION_NAME: "Никогда" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% минут(ы)" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% час(ы)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Основные Настройки" - LABEL_LANGUAGE: "Язык" - LABEL_IDENTITY: "Профиль" - LABEL_LAYOUT: "Разметка" - LABEL_LAYOUT_NO_SPLIT: "Одна панель" - LABEL_LAYOUT_VERTICAL_SPLIT: "Вертикальные панели" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Горизонтальные панели" - LABEL_EDITOR: "Редактор текста по умолчанию" - LABEL_EDITOR_HTML: "Форматированный" - LABEL_EDITOR_PLAIN: "Простой" - LABEL_EDITOR_HTML_FORCED: "Форматированный (форсированный)" - LABEL_EDITOR_PLAIN_FORCED: "Простой (форсированный)" - LABEL_ANIMATION: "Анимация интерфейса" - LABEL_ANIMATION_FULL: "Полная" - LABEL_ANIMATION_NORMAL: "Нормальная" - LABEL_ANIMATION_NONE: "Отсутствует" - LABEL_VIEW_OPTIONS: "Отображение" - LABEL_USE_PREVIEW_PANE: "Использовать трехколоночный режим отображения" - LABEL_USE_CHECKBOXES_IN_LIST: "Показывать чекбоксы в списках" - LABEL_USE_THREADS: "Сворачивать письма в переписках" - LABEL_REPLY_SAME_FOLDER: "Помещать ответы в ту же папку, где находится оригинал" - LABEL_SHOW_IMAGES: "Показывать внешние изображения в теле письма без предупреждения" - LABEL_SHOW_ANIMATION: "Использовать анимацию" - LABEL_MESSAGE_PER_PAGE: "Cообщений на одной странице" - LABEL_NOTIFICATIONS: "Уведомления" - LABEL_SOUND_NOTIFICATION: "Звуковые уведомления" - LABEL_CHROME_NOTIFICATION_DESC: "Показывать уведомления о новых сообщениях в всплывающих подсказках" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Блокировано браузером)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Контакты" - LABEL_CONTACTS_AUTOSAVE: "Автоматически добавлять получателей писем в адресную книгу" - LEGEND_CONTACTS_SYNC: "Синхронизация (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Включить синхронизация" - LABEL_CONTACTS_SYNC_SERVER: "Сервер" - LABEL_CONTACTS_SYNC_AB_URL: "Адресная книга (URL)" - LABEL_CONTACTS_SYNC_USER: "Пользователь" - LABEL_CONTACTS_SYNC_PASSWORD: "Пароль" - SETTINGS_THEMES: - LEGEND_THEMES: "Темы Оформления" - LEGEND_THEMES_CUSTOM: "Настройка Пользовательской Темы" - LABEL_CUSTOM_TYPE: "Тип Темы" - LABEL_CUSTOM_TYPE_LIGHT: "Светлая" - LABEL_CUSTOM_TYPE_DARK: "Темная" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Картинка на фоне" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Загрузить фоновую картинку (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "Файл слишком большой" - ERROR_FILE_TYPE_ERROR: "Неверный тип файла (только JPG и PNG)" - ERROR_UNKNOWN: "Ошибка загрузки файла" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Подключить Google аккаунт" - BUTTON_GOOGLE_DISCONNECT: "Отключить Google аккаунт" - MAIN_GOOGLE_DESC: "После подключения к Google вы сможете залогиниться в данный аккаунт, используя кнопку Google на экране логина." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Подключить Facebook аккаунт" - BUTTON_FACEBOOK_DISCONNECT: "Отключить Facebook аккаунт" - MAIN_FACEBOOK_DESC: "После подключения к Facebook вы сможете залогиниться в данный аккаунт, используя кнопку Facebook на экране логина." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Подключить Twitter аккаунт" - BUTTON_TWITTER_DISCONNECT: "Отключить Twitter аккаунт" - MAIN_TWITTER_DESC: "После подключения к Twitter вы сможете залогиниться в данный аккаунт, используя кнопку Twitter на экране логина." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Список Папок" - BUTTON_CREATE: "Создать Папку" - BUTTON_SYSTEM: "Системые папки" - BUTTON_DELETE: "Удалить" - BUTTON_SUBSCRIBE: "Подписаться" - BUTTON_UNSUBSCRIBE: "Отписаться" - LOADING_PROCESS: "Обновление списка папок" - CREATING_PROCESS: "Cоздание папки" - DELETING_PROCESS: "Удаление папки" - RENAMING_PROCESS: "Переименование папки" - DELETING_ASK: "Точно?" - TO_MANY_FOLDERS_DESC_1: "У вас слишком много папок!" - TO_MANY_FOLDERS_DESC_2: "Мы показали только часть из них, чтобы избежать проблем с производительностью." - HELP_DELETE_FOLDER: "Удалить папку" - HELP_SHOW_HIDE_FOLDER: "Показывать/прятать папку" - HELP_CHECK_FOR_NEW_MESSAGES: "Проверять/не проверять новые сообщения" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Список Аккаунтов" - LEGEND_IDENTITIES: "Персоны" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Аккаунты и персоны" - BUTTON_ADD_ACCOUNT: "Добавить ещё аккаунт" - BUTTON_ADD_IDENTITY: "Добавить персону" - BUTTON_DELETE: "Удалить" - LOADING_PROCESS: "Обновление списка аккаунтов" - DELETING_ASK: "Точно?" - DEFAULT_IDENTITY_LABEL: "основной" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Настройки основного профиля" - LEGEND_IDENTITIES: "Дополнительные профили" - LABEL_DEFAULT: "Основной" - LABEL_DISPLAY_NAME: "Имя" - LABEL_REPLY_TO: "Отвечать на" - LABEL_SIGNATURE: "Подпись" - LABEL_ADD_SIGNATURE_TO_ALL: "Добавлять свою подпись ко всем исходящим сообщениям" - BUTTON_ADD_IDENTITY: "Добавить профиль" - BUTTON_DELETE: "Удалить" - LOADING_PROCESS: "Обновление списка профилей" - DELETING_ASK: "Точно?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Изменить Пароль" - LABEL_CURRENT_PASSWORD: "Текущий пароль" - LABEL_NEW_PASSWORD: "Новый пароль" - LABEL_REPEAT_PASSWORD: "Повторить" - BUTTON_UPDATE_PASSWORD: "Установить Новый Пароль" - ERROR_PASSWORD_MISMATCH: "Пароли не совпадают, попробуйте еще раз" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Ипортировать OpenPGP ключ" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Новый OpenPGP ключ" - TITLE_PRIVATE: "Приватный" - TITLE_PUBLIC: "Публичный" - DELETING_ASK: "Точно?" - GENERATE_ONLY_HTTPS: "HTTPS only" - LABEL_ALLOW_DRAFT_AUTOSAVE: "Автоматически сохранять черновик" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Сочетания клавиш" - TAB_MAILBOX: "Почта" - TAB_MESSAGE_LIST: "Список сообщений" - TAB_MESSAGE_VIEW: "Просмотр сообщения" - TAB_COMPOSE: "Написание письма" - LABEL_OPEN_USER_DROPDOWN: "Открыть выпадающий список пользователя" - LABEL_REPLY: "Ответить" - LABEL_REPLY_ALL: "Ответить всем" - LABEL_FORWARD: "Переслать" - LABEL_FORWARD_MULTIPLY: "Переслать все выбранные сообщения" - LABEL_HELP: "Помощь" - LABEL_CHECK_ALL: "Выбрать все сообщения" - LABEL_ARCHIVE: "Архивировать" - LABEL_DELETE: "Удалить" - LABEL_OPEN_THREAD: "Open selected thread" - LABEL_MOVE: "Переместить" - LABEL_READ: "Пометить выбранные письма прочитанными" - LABEL_UNREAD: "Пометить выбранные письма непрочитанными" - LABEL_IMPORTANT: "Пометить выбранные письма как важные" - LABEL_SEARCH: "Поиск" - LABEL_CANCEL_SEARCH: "Отменить поиск" - LABEL_FULLSCREEN_ENTER: "Полноэкранный режим" - LABEL_VIEW_MESSAGE_ENTER: "Просмотр сообщения" - LABEL_SWITCH_TO_MESSAGE: "Переключить фокус на выбранное сообщение" - LABEL_SWITCH_TO_FOLDER_LIST: "Переключить фокус на список папок" - LABEL_FULLSCREEN_TOGGLE: "Переключить полноэкранный режим" - LABEL_BLOCKQUOTES_TOGGLE: "Переключение видимости цитат в письме" - LABEL_THREAD_NEXT: "Следующее сообщение в цепочке" - LABEL_THREAD_PREV: "Предыдущее сообщение в цепочке" - LABEL_PRINT: "Распечатать" - LABEL_EXIT_FULLSCREEN: "Выйти из полноэкранного режима" - LABEL_CLOSE_MESSAGE: "Закрыть сообщение" - LABEL_SWITCH_TO_LIST: "Переключить фокус на список писем" - LABEL_OPEN_COMPOSE_POPUP: "Написать письмо" - LABEL_MINIMIZE_COMPOSE_POPUP: "Минимизировать окно" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Выбрать отправителя" - LABEL_SAVE_MESSAGE: "Сохранить сообщение" - LABEL_SEND_MESSAGE: "Отправить сообщение" - LABEL_CLOSE_COMPOSE: "Закрыть сообщение" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "Публичные ключи не найдены" - NO_PUBLIC_KEYS_FOUND_FOR: "Публичные ключи для \"%EMAIL%\" не найдены" - NO_PRIVATE_KEY_FOUND: "Приватный ключ не найден" - NO_PRIVATE_KEY_FOUND_FOR: "Приватный ключ для \"%EMAIL%\" не найден" - ADD_A_PUBLICK_KEY: "Добавить публичный ключ" - SELECT_A_PRIVATE_KEY: "Выберите секретный ключ" - UNVERIFIRED_SIGNATURE: "Неподтвержденная сигнатура" - DECRYPTION_ERROR: "OpenPGP ошибка расшифровки" - GOOD_SIGNATURE: "Подтвержденная сигнатура для %USER%" - PGP_ERROR: "OpenPGP ошибка: %ERROR%" - SPECIFY_FROM_EMAIL: "Укажите почтовый адрес отправителя" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Укажите как минимум одного получателя" - NOTIFICATIONS: - INVALID_TOKEN: "Неверный токен запроса" - AUTH_ERROR: "Не удалось авторизоваться" - ACCESS_ERROR: "Ошибка доступа" - CONNECTION_ERROR: "Ошибка соединения с сервером." - CAPTCHA_ERROR: "Неправильное проверочное слово." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - К данному социальному пользователю еще не прикреплен почтовый аккаунт. Войдите - в систему под своим почтовым аккаунтом и включите эту возможность в настройках. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - К данному социальному пользователю еще не прикреплен почтовый аккаунт. Войдите - в систему под своим почтовым аккаунтом и включите эту возможность в настройках. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - К данному социальному пользователю еще не прикреплен почтовый аккаунт. Войдите - в систему под своим почтовым аккаунтом и включите эту возможность в настройках. - DOMAIN_NOT_ALLOWED: "Данный домен не разрешен" - ACCOUNT_NOT_ALLOWED: "Данный аккаунт не разрешен" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Необходима двухфакторная верификация" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Ошибка двухфакторной верификации" - COULD_NOT_SAVE_NEW_PASSWORD: "Не удалось сохранить новый пароль" - CURRENT_PASSWORD_INCORRECT: "Текущий пароль неверный" - NEW_PASSWORD_SHORT: "Пароль слишком короткий" - NEW_PASSWORD_WEAK: "Пароль слишком простой" - NEW_PASSWORD_FORBIDDENT: "Пароль содержит запрещенные символы" - CONTACTS_SYNC_ERROR: "Ошибка синхронизации контактов" - CANT_GET_MESSAGE_LIST: "Не могу получить список писем" - CANT_GET_MESSAGE: "Не могу получить письмо" - CANT_DELETE_MESSAGE: "Не могу удалить письмо" - CANT_MOVE_MESSAGE: "Не могу переместить письмо" - CANT_SAVE_MESSAGE: "Не могу сохранить письмо" - CANT_SEND_MESSAGE: "Не могу отправить письмо" - INVALID_RECIPIENTS: "Проверьте правильность ввода всех адресов." - CANT_SAVE_FILTERS: "Не могу сохранить фильтры" - CANT_GET_FILTERS: "Не могу загрузить фильтры" - FILTERS_ARE_NOT_CORRECT: "Фильтры неправильны" - CANT_CREATE_FOLDER: "Не могу создать папку" - CANT_RENAME_FOLDER: "Не могу переименовать папку" - CANT_DELETE_FOLDER: "Не могу удалить папку" - CANT_DELETE_NON_EMPTY_FOLDER: "Не могу удалить непустую папку" - CANT_SUBSCRIBE_FOLDER: "Не могу подписать папку" - CANT_UNSUBSCRIBE_FOLDER: "Не могу отписать папку" - CANT_SAVE_SETTINGS: "Не могу сохранить настройки" - CANT_SAVE_PLUGIN_SETTINGS: "Не могу сохранить настройки" - DOMAIN_ALREADY_EXISTS: "Домен уже существует" - CANT_INSTALL_PACKAGE: "Ошибка установки пакета" - CANT_DELETE_PACKAGE: "Ошибка удаления пакета" - INVALID_PLUGIN_PACKAGE: "Ошибка пакета плагина" - UNSUPPORTED_PLUGIN_PACKAGE: "Для работы плагина необходима полная поддержка сервера" - LICENSING_SERVER_IS_UNAVAILABLE: "Сервер подписок временно не доступен." - LICENSING_DOMAIN_EXPIRED: "Подписка на данный домен устарела." - LICENSING_DOMAIN_BANNED: "Подписка на данный домен заблокирована." - DEMO_SEND_MESSAGE_ERROR: "Демо аккаунту отправка писем на внешние почтовые адреса запрещена!" - DEMO_ACCOUNT_ERROR: "По соображениям безопасности данный аккаунт не может выполнить это действие." - ACCOUNT_ALREADY_EXISTS: "Аккаунт уже добавлен" - ACCOUNT_DOES_NOT_EXIST: "Аккаунт не существует" - MAIL_SERVER_ERROR: "Ошибка доступа к почтовому серверу" - INVALID_INPUT_ARGUMENT: "Неверный параметр" - UNKNOWN_ERROR: "Неизвестная ошибка" - STATIC: - BACK_LINK: "Обновить" - DOMAIN_LIST_DESC: "Список доменов, к которым разрешен доступ через веб почту." - PHP_EXSTENSIONS_ERROR_DESC: "Необходимые расширения PHP не установлены на вашем сервере!" - PHP_VERSION_ERROR_DESC: "Ваша версия PHP (%VERSION%) ниже требуемой 5.3.0!" - NO_SCRIPT_TITLE: "Для работы приложения необходим JavaScript." - NO_SCRIPT_DESC: | - По-видимому, JavaScript либо не поддерживается вашим браузером, либо отключен. - Включите JavaScript, изменив настройки браузера, затем повторите попытку. - NO_COOKIE_TITLE: "Для работы приложения необходимы Cookie." - NO_COOKIE_DESC: | - По-видимому, Cookie либо не поддерживаются вашим браузером, либо отключены. - Включите Cookie, изменив настройки браузера, затем повторите попытку. - BAD_BROWSER_TITLE: "Ваш браузер устарел." - BAD_BROWSER_DESC: | - Чтобы использовать все возможности приложения, - загрузите и установите один из этих браузеров diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sk_SK.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sk_SK.yml deleted file mode 100755 index d58f7f2d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sk_SK.yml +++ /dev/null @@ -1,710 +0,0 @@ -sk_SK: - LOGIN: - LABEL_EMAIL: "Email" - LABEL_LOGIN: "Používateľské meno" - LABEL_PASSWORD: "Heslo" - LABEL_SIGN_ME: "Zapamätať" - LABEL_VERIFICATION_CODE: "Verifikačný kód" - LABEL_DONT_ASK_VERIFICATION_CODE: "Don't ask for the code for 2 weeks" - BUTTON_SIGN_IN: "Prihlásiť" - TITLE_SIGN_IN_GOOGLE: "Prihlásiť pomocu Google" - TITLE_SIGN_IN_FACEBOOK: "Prihlásiť pomocou Facebook" - TITLE_SIGN_IN_TWITTER: "Prihlásiť pomocou Twitter" - LABEL_FORGOT_PASSWORD: "Forgot password" - LABEL_REGISTRATION: "Registration" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Pridať účet" - BUTTON_SETTINGS: "Nastavenia" - BUTTON_HELP: "Pomoc" - BUTTON_LOGOUT: "Odhlásiť" - MOBILE: - BUTTON_MOBILE_VERSION: "Verzia pre mobil" - BUTTON_DESKTOP_VERSION: "Verzia pre desktop" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Hľadať" - TITLE_ADV: "Rozšírené hľadanie" - LABEL_ADV_FROM: "Odosielateľ" - LABEL_ADV_TO: "Príjemca" - LABEL_ADV_SUBJECT: "Predmet" - LABEL_ADV_TEXT: "Text" - LABEL_ADV_HAS_ATTACHMENT: "S prílohou" - LABEL_ADV_HAS_ATTACHMENTS: "S prílohami" - LABEL_ADV_FLAGGED: "Označené hviezdičkou" - LABEL_ADV_UNSEEN: "Neprečítané" - LABEL_ADV_DATE: "Dátum" - LABEL_ADV_DATE_ALL: "Kedykoľvek" - LABEL_ADV_DATE_3_DAYS: "Nie staršie ako 3 dni" - LABEL_ADV_DATE_7_DAYS: "Nie staršie ako týždeň" - LABEL_ADV_DATE_MONTH: "Nie staršie ako mesiac" - LABEL_ADV_DATE_3_MONTHS: "Nie staršie ako 3 mesiace" - LABEL_ADV_DATE_6_MONTHS: "Nie staršie ako 6 mesiacov" - LABEL_ADV_DATE_YEAR: "Nie staršie ako 1 rok" - BUTTON_ADV_SEARCH: "Hľadať" - PREVIEW_POPUP: - FULLSCREEN: "Toggle fullscreen" - ZOOM: "Zoom in/out" - CLOSE: "Zatvoriť (Esc)" - LOADING: "Načítavam..." - GALLERY_PREV: "Predchádzajúci (šípka vľavo)" - GALLERY_NEXT: "Nasledujúci (šípka vpravo)" - GALLERY_COUNTER: "%curr% z %total%" - IMAGE_ERROR: "Obrázok sa nepodarilo načítať." - AJAX_ERROR: "Obsah sa nepodarilo načítať." - FOLDER_LIST: - BUTTON_COMPOSE: "Vytvoriť" - BUTTON_CONTACTS: "Adresár" - BUTTON_NEW_MESSAGE: "Nová správa" - INBOX_NAME: "Prijaté" - SENT_NAME: "Odoslané" - DRAFTS_NAME: "Koncepty" - SPAM_NAME: "Spam" - TRASH_NAME: "Kôš" - ARCHIVE_NAME: "Archív" - QUOTA: - TITLE: "Využitie kvóty" - MESSAGE_LIST: - BUTTON_RELOAD: "Obnoviť zoznam správ" - BUTTON_MOVE_TO: "Presunúť do" - BUTTON_DELETE: "Odstrániť" - BUTTON_ARCHIVE: "Archív" - BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Not Spam" - BUTTON_EMPTY_FOLDER: "Vyčistiť priečinok" - BUTTON_MULTY_FORWARD: "Preposlať správy" - BUTTON_DELETE_WITHOUT_MOVE: "Navždy odstrániť" - BUTTON_MORE: "Viac" - MENU_SET_SEEN: "Označiť ako prečítané" - MENU_SET_ALL_SEEN: "Označiť všetko ako prečítané" - MENU_UNSET_SEEN: "Označiť ako neprečítané" - MENU_SET_FLAG: "Označiť hviezdičkou" - MENU_UNSET_FLAG: "Zrušiť označenie hviezdičkou" - MENU_SELECT_ALL: "Všetko" - MENU_SELECT_NONE: "Žiadne" - MENU_SELECT_INVERT: "Invertovať" - MENU_SELECT_UNSEEN: "Neprečítané" - MENU_SELECT_SEEN: "Prečítané" - MENU_SELECT_FLAGGED: "Označené" - MENU_SELECT_UNFLAGGED: "Neoznačené" - EMPTY_LIST: "Zoznam je prázdny." - EMPTY_SEARCH_LIST: "Vášmu vyhľadávaniu nezodpovedajú žiadne správy." - SEARCH_RESULT_FOR: "Výsledky vyhľadávania pre \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "späť do zoznamu správ" - LIST_LOADING: "Načítavam" - EMPTY_SUBJECT_TEXT: "(Bez predmetu)" - PUT_MESSAGE_HERE: "Pusťte správu tu pre jej zobrazenie v zozname" - TODAY_AT: "dnes o %TIME%" - YESTERDAY_AT: "včera o %TIME%" - SEARCH_PLACEHOLDER: "Hľadať" - NEW_MESSAGE_NOTIFICATION: "Máte %COUNT% nových správ!" - QUOTA_SIZE: "Používate %SIZE% (%PROC%%) z vašich %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Editovať" - BUTTON_BACK: "Späť" - BUTTON_CLOSE: "Zatvoriť" - BUTTON_DELETE: "Odstrániť" - BUTTON_UNSUBSCRIBE: "Odhlásiť sa z mailing listu" - BUTTON_ARCHIVE: "Archív" - BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Not Spam" - BUTTON_MOVE_TO: "Presunúť do" - BUTTON_MORE: "Viac" - BUTTON_REPLY: "Odpovedať" - BUTTON_REPLY_ALL: "Odpovedať všetkým" - BUTTON_FORWARD: "Preposlať" - BUTTON_FORWARD_AS_ATTACHMENT: "Preposlať ako prílohu" - BUTTON_EDIT_AS_NEW: "Použiť ako predlohu" - BUTTON_SHOW_IMAGES: "Zobraziť externé obrázky" - BUTTON_NOTIFY_READ_RECEIPT: "Odosielateľ požiadal o potvrdenie prečítania tejto správy." - BUTTON_IN_NEW_WINDOW: "Zobraziť v novom okne" - BUTTON_THREAD_LIST: "Thread list" - BUTTON_THREAD_PREV: "Previous" - BUTTON_THREAD_NEXT: "Next" - BUTTON_THREAD_MORE: "More messages" - MENU_HEADERS: "Zobraziť hlavičku správy" - MENU_VIEW_ORIGINAL: "Zobraziť zdroj" - MENU_DOWNLOAD_ORIGINAL: "Prevziať ako súbor .eml" - MENU_FILTER_SIMILAR: "Filtrovať správy ako táto" - MENU_PRINT: "Tlačiť" - EMPTY_SUBJECT_TEXT: "(Bez predmetu)" - LABEL_SUBJECT: "Predmet" - LABEL_DATE: "Dátum" - LABEL_FROM: "Odosielateľ" - LABEL_FROM_SHORT: "od" - LABEL_TO: "Príjemca" - LABEL_TO_SHORT: "pre" - LABEL_CC: "Kópia" - LABEL_BCC: "Skrytá kópia" - LABEL_REPLY_TO: "Adresa pre odpoveď" - PRINT_LABEL_FROM: "Odosielateľ" - PRINT_LABEL_TO: "Príjemca" - PRINT_LABEL_CC: "Kópia" - PRINT_LABEL_BCC: "Skrytá kópia" - PRINT_LABEL_REPLY_TO: "Adresa pre odpoveď" - PRINT_LABEL_DATE: "Dátum" - PRINT_LABEL_SUBJECT: "Predmet" - PRINT_LABEL_ATTACHMENTS: "Prílohy" - MESSAGE_LOADING: "Načítavam" - MESSAGE_VIEW_DESC: "Vyberte správu zo zoznamu pre jej zobrazenie tu." - MESSAGE_VIEW_MOVE_DESC: "Zvoľte cieľ kliknutím na názov priečinka v ľavom stĺpci." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Heslo" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" - LINK_DOWNLOAD_AS_ZIP: "Download as zip" - LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" - LINK_SAVE_TO_DROPBOX: "Save to Dropbox" - READ_RECEIPT: - SUBJECT: "Return Receipt (displayed) - %SUBJECT%" - BODY: | - This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. - - Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. - There is no guarantee that the recipient has read or understood the message contents. - SUGGESTIONS: - SEARCHING_DESC: "Hľadám..." - CONTACTS: - LEGEND_CONTACTS: "Adresár" - SEARCH_INPUT_PLACEHOLDER: "Hľadať" - BUTTON_ADD_CONTACT: "Pridať kontakt" - BUTTON_CREATE_CONTACT: "Vytvoriť" - BUTTON_UPDATE_CONTACT: "Aktualizovať" - BUTTON_IMPORT: "Importovať (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" - BUTTON_EXPORT_CSV: "Export (csv)" - ERROR_IMPORT_FILE: "Chyba importu (nesprávny formát súboru)" - LIST_LOADING: "Načítavam" - EMPTY_LIST: "Nemáte žiadne kontakty" - EMPTY_SEARCH: "Nenašli sa žiadne kontakty" - CLEAR_SEARCH: "Clear search" - CONTACT_VIEW_DESC: "Zvoľte kontakt zo zoznamu pre jeho zobrazenie tu." - LABEL_DISPLAY_NAME: "Zobraziť ako" - LABEL_EMAIL: "Email" - LABEL_PHONE: "Telefón" - LABEL_WEB: "Web" - LABEL_BIRTHDAY: "Birthday" - LINK_ADD_EMAIL: "Pridať emailovú adresu" - LINK_ADD_PHONE: "Pridať telefón" - LINK_BIRTHDAY: "Birthday" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Zadajte Zobrazované meno" - PLACEHOLDER_ENTER_LAST_NAME: "Zadajte Priezvisko" - PLACEHOLDER_ENTER_FIRST_NAME: "Zadajte Meno" - PLACEHOLDER_ENTER_NICK_NAME: "Enter nickname" - LABEL_READ_ONLY: "Len pre čítanie" - LABEL_SHARE: "Zdielať" - ADD_MENU_LABEL: "Add" - ADD_MENU_NICKNAME: "Nickname" - ADD_MENU_NOTES: "Notes" - ADD_MENU_EMAIL: "Email" - ADD_MENU_PHONE: "Phone" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Address" - ADD_MENU_BIRTHDAY: "Birthday" - ADD_MENU_TAGS: "Tags" - BUTTON_SHARE_NONE: "Žiadne" - BUTTON_SHARE_ALL: "Všetko" - BUTTON_SYNC: "Synchronization (CardDAV)" - COMPOSE: - TITLE_FROM: "Odosielateľ" - TITLE_TO: "Príjemca" - TITLE_CC: "Kópia" - TITLE_BCC: "Skrytá kópia" - TITLE_REPLY_TO: "Reply To" - TITLE_SUBJECT: "Predmet" - LINK_SHOW_INPUTS: "zobraziť všetky polia" - BUTTON_SEND: "Odoslať" - BUTTON_SAVE: "Uložiť" - BUTTON_DELETE: "Odstrániť" - BUTTON_CANCEL: "Zrušiť" - BUTTON_MINIMIZE: "Minimize" - SAVED_TIME: "Uložené o %TIME%" - SAVED_ERROR_ON_SEND: "Správa bola odoslaná ale nebola uložená do priečinka odoslaných správ" - DISCARD_UNSAVED_DATA: "Discard unsaved data?" - ATTACH_FILES: "Pripojiť súbory" - ATTACH_DROP_FILES_DESC: "Súbory pusťte tu" - ATTACH_ITEM_CANCEL: "Zrušiť" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" - FORWARD_MESSAGE_TOP_TITLE: "-------- Forwarded message -------" - FORWARD_MESSAGE_TOP_FROM: "Odosielateľ" - FORWARD_MESSAGE_TOP_TO: "Príjemca" - FORWARD_MESSAGE_TOP_CC: "Kópia" - FORWARD_MESSAGE_TOP_SENT: "Odoslať" - FORWARD_MESSAGE_TOP_SUBJECT: "Predmet" - EMPTY_TO_ERROR_DESC: "Zadajte prosím aspoň jedného príjemcu" - NO_ATTACHMENTS_HERE_DESC: "No attachments here." - ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet" - BUTTON_REQUEST_READ_RECEIPT: "Vyžiadať potvrdenie o prečítaní" - BUTTON_MARK_AS_IMPORTANT: "Mark as important" - BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" - BUTTON_REQUEST_DSN: "Request a delivery receipt" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Close" - POPUPS_ASK: - BUTTON_YES: "Áno" - BUTTON_NO: "Nie" - DESC_WANT_CLOSE_THIS_WINDOW: "Ste si istý že chcete zatvoriť toto okno?" - DESC_WANT_DELETE_MESSAGES: "Ste si istý že chcete odstrániť tieto správy?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Zvoľte jazyk" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Pridať účet?" - BUTTON_ADD_ACCOUNT: "Pridať" - TITLE_UPDATE_ACCOUNT: "Update Account?" - BUTTON_UPDATE_ACCOUNT: "Update" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Pridať Identitu?" - TITLE_UPDATE_IDENTITY: "Upraviť Identitu?" - BUTTON_ADD_IDENTITY: "Pridať" - BUTTON_UPDATE_IDENTITY: "Upraviť" - LABEL_EMAIL: "Email" - LABEL_NAME: "Meno" - LABEL_REPLY_TO: "Adresa pre odpoveď" - LABEL_SIGNATURE: "Signature" - LABEL_CC: "Cc" - LABEL_BCC: "Skrytá kópia" - LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Vytvoriť priečinok?" - LABEL_NAME: "Názov priečinka" - LABEL_PARENT: "Nadradený priečinok" - BUTTON_CREATE: "Vytvoriť" - BUTTON_CANCEL: "Zrušiť" - BUTTON_CLOSE: "Zatvoriť" - TITLE_CREATING_PROCESS: "Vytváram priečinok" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Odstrániť všetky správy v priečinku?" - BUTTON_CLEAR: "Vyčistiť" - BUTTON_CANCEL: "Zrušiť" - BUTTON_CLOSE: "Zatvoriť" - DANGER_DESC_WARNING: "Upozornenie!" - DANGER_DESC_HTML_1: "Chystáte sa nenávratne odstrániť všetky správy z priečinka %FOLDER%." - DANGER_DESC_HTML_2: "Tento proces nie je možné prerušiť." - TITLE_CLEARING_PROCESS: "Odstraňujem priečinok..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Import OpenPGP key" - BUTTON_IMPORT_OPEN_PGP_KEY: "Import" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "View OpenPGP key" - BUTTON_SELECT: "Select" - BUTTON_CLOSE: "Close" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP keys" - LABEL_EMAIL: "Email" - LABEL_NAME: "Name" - LABEL_PASSWORD: "Password" - LABEL_KEY_BIT_LENGTH: "Key length" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" - LABEL_SIGN: "Sign" - LABEL_ENCRYPT: "Encrypt" - LABEL_PASSWORD: "Password" - BUTTON_SIGN: "Sign" - BUTTON_ENCRYPT: "Encrypt" - BUTTON_SIGN_AND_ENCRYPT: "Sign and encrypt" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" - LABEL_KEY: "Private Key" - LABEL_PASSWORD: "Password" - BUTTON_DECRYPT: "Decrypt" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "2-Step verification test" - LABEL_CODE: "Code" - BUTTON_TEST: "Test" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Create a filter?" - TITLE_EDIT_FILTER: "Update filter?" - FILTER_NAME: "Name" - LEGEND_CONDITIONS: "Conditions" - LEGEND_ACTIONS: "Actions" - BUTTON_DONE: "Done" - BUTTON_ADD_CONDITION: "Add a Condition" - SELECT_ACTION_NONE: "None" - SELECT_ACTION_MOVE_TO: "Move to" - SELECT_ACTION_FORWARD_TO: "Forward to" - SELECT_ACTION_REJECT: "Reject" - SELECT_ACTION_VACATION_MESSAGE: "Vacation message" - SELECT_ACTION_DISCARD: "Discard" - SELECT_FIELD_FROM: "From" - SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" - SELECT_FIELD_SUBJECT: "Subject" - SELECT_FIELD_HEADER: "Header" - SELECT_FIELD_SIZE: "Size" - SELECT_TYPE_CONTAINS: "Contains" - SELECT_TYPE_NOT_CONTAINS: "Not Contains" - SELECT_TYPE_MATCHES: "Matches (* and ? supported)" - SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" - SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Not Regexp" - SELECT_TYPE_EQUAL_TO: "Equal To" - SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" - SELECT_TYPE_OVER: "Over" - SELECT_TYPE_UNDER: "Under" - SELECT_MATCH_ANY: "Matching any of the following rules" - SELECT_MATCH_ALL: "Matching all of the following rules" - MARK_AS_READ_LABEL: "Mark as read" - REPLY_INTERVAL_LABEL: "Reply interval (days)" - KEEP_LABEL: "Keep" - STOP_LABEL: "Don't stop processing rules" - EMAIL_LABEL: "Email" - VACATION_SUBJECT_LABEL: "Subject (optional)" - VACATION_MESSAGE_LABEL: "Message" - VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" - REJECT_MESSAGE_LABEL: "Reject message" - ALL_INCOMING_MESSAGES_DESC: "All incoming messages" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Spravovať Systémové priečinky" - SELECT_CHOOSE_ONE: "Vybrať" - SELECT_UNUSE_NAME: "Nepoužívať" - LABEL_SENT: "Odoslané" - LABEL_DRAFTS: "Koncepty" - LABEL_SPAM: "Spam" - LABEL_TRASH: "Kôš" - LABEL_ARCHIVE: "Archive" - BUTTON_CANCEL: "Zrušiť" - BUTTON_CLOSE: "Zatvoriť" - NOTIFICATION_SENT: | - Nepriradili ste systémový priečinok "Odoslané" kam budú správy presunuté po ich odoslaní. - Ak nechcete ukladať odoslané správy, vyberte prosím možnosť "Nepoužívať". - NOTIFICATION_DRAFTS: "Nepriradili ste systémový priečinok pre \"Koncepty\" kam sú správy ukladané počas ich písania." - NOTIFICATION_SPAM: | - Nepriradili ste systémový priečinok pre "Spam" kam sú ukladané nevyžiadané správy. - Ak si želáte takéto správy odstraňovať natrvalo, vyberte prosím možnosť "Nepoužívať". - NOTIFICATION_TRASH: | - Nepriradili ste systémový priečinok pre "Kôš" kam sú správy presunuté po ich odstránení. - Ak si želáte takéto správy odstraňovať natrvalo, vyberte prosím možnosť "Nepoužívať". - NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "2-Step Verification" - LABEL_ENABLE_TWO_FACTOR: "Enable 2-Step verification" - LABEL_TWO_FACTOR_USER: "User" - LABEL_TWO_FACTOR_STATUS: "Status" - LABEL_TWO_FACTOR_SECRET: "Secret" - LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" - BUTTON_CREATE: "Create New Secret" - BUTTON_ACTIVATE: "Activate" - BUTTON_CLEAR: "Clear" - BUTTON_LOGOUT: "Logout" - BUTTON_DONE: "Done" - BUTTON_TEST: "Test" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Show Secret" - BUTTON_HIDE_SECRET: "Hide Secret" - TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" - TWO_FACTOR_SECRET_DESC: >- - Import this info into your Google Authenticator client (or other TOTP client) - using the provided QR code below or by entering the code manually. - TWO_FACTOR_BACKUP_CODES_DESC: >- - If you can't receive codes via Google Authenticator, you can use backup codes - to sign in. After you’ve used a backup code to sign in, it will become inactive. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." - TITLES: - LOADING: "Načítavam" - LOGIN: "Používateľské meno" - MAILBOX: "Schránka správ" - SETTINGS: "Nastavenia" - COMPOSE: "Napísať" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Súbor je príliš veľký" - ERROR_FILE_PARTIALLY_UPLOADED: "Z dôvodu neznámej chyby bol súbor nahraný len čiastočne" - ERROR_NO_FILE_UPLOADED: "Súbor nebol nahraný" - ERROR_MISSING_TEMP_FOLDER: "Dočasný súbor chýba" - ERROR_ON_SAVING_FILE: "Nastala neznáma chyba pri nahrávaní" - ERROR_FILE_TYPE: "Nesprávny typ súboru" - ERROR_UNKNOWN: "Nastala neznáma chyba pri nahrávaní" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" - TEXT_SWITCHER_RICH_FORMATTING: "Formátovaný text" - TEXT_SWITCHER_CONFIRM: "Formátovanie textu a obrázky budú stratené. Želáte si pokračovať?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Osobné" - LABEL_GENERAL_NAME: "Všeobecné" - LABEL_CONTACTS_NAME: "Kontakty" - LABEL_FOLDERS_NAME: "Priečinky" - LABEL_ACCOUNTS_NAME: "Účty" - LABEL_IDENTITY_NAME: "Identita" - LABEL_IDENTITIES_NAME: "Identity" - LABEL_FILTERS_NAME: "Filters" - LABEL_TEMPLATES_NAME: "Templates" - LABEL_SECURITY_NAME: "Security" - LABEL_SOCIAL_NAME: "Social" - LABEL_THEMES_NAME: "Motívy" - LABEL_CHANGE_PASSWORD_NAME: "Heslo" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Späť" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filters" - BUTTON_SAVE: "Save" - BUTTON_ADD_FILTER: "Add a Filter" - BUTTON_DELETE: "Delete" - BUTTON_RAW_SCRIPT: "Use Custom User Script" - SUBNAME_NONE: "None" - SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" - SUBNAME_REJECT: "Reject" - SUBNAME_VACATION_MESSAGE: "Vacation message" - SUBNAME_DISCARD: "Discard" - CAPABILITY_LABEL: "Capability" - LOADING_PROCESS: "Updating filter list" - DELETING_ASK: "Are you sure?" - CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identita" - LABEL_DISPLAY_NAME: "Meno" - LABEL_REPLY_TO: "Adresa pre odpoveď" - LABEL_SIGNATURE: "Podpis" - LABEL_ADD_SIGNATURE_TO_ALL: "Pripojiť podpis k všetkých odchádzajúcim správam" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Security" - LABEL_CONFIGURE_TWO_FACTOR: "Nakonfigurovať 2-krokovú verifikáciu" - LABEL_AUTOLOGOUT: "Auto Logout" - AUTOLOGIN_NEVER_OPTION_NAME: "Never" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hodín" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Všeobecné" - LABEL_LANGUAGE: "Jazyk" - LABEL_IDENTITY: "Identity" - LABEL_LAYOUT: "Layout" - LABEL_LAYOUT_NO_SPLIT: "No Split" - LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" - LABEL_EDITOR: "Predvolený editor správ" - LABEL_EDITOR_HTML: "Html" - LABEL_EDITOR_PLAIN: "Text" - LABEL_EDITOR_HTML_FORCED: "Html (forced)" - LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" - LABEL_ANIMATION: "Animácie prostredia" - LABEL_ANIMATION_FULL: "Full" - LABEL_ANIMATION_NORMAL: "Normal" - LABEL_ANIMATION_NONE: "None" - LABEL_VIEW_OPTIONS: "Možnosti zobrazenia" - LABEL_USE_PREVIEW_PANE: "Používať panel rýchleho zobrazenia" - LABEL_USE_CHECKBOXES_IN_LIST: "Zobrazenie zaštkrtávacích políčok v zozname" - LABEL_USE_THREADS: "Zobraziť ako konverzácie" - LABEL_REPLY_SAME_FOLDER: "Umiestňovať odpovede do priečinka so správou ktorej sa týkajú" - LABEL_SHOW_IMAGES: "Vždy zobrazovať obrázky v tele správy" - LABEL_SHOW_ANIMATION: "Animovať" - LABEL_MESSAGE_PER_PAGE: "Správ na stranu" - LABEL_NOTIFICATIONS: "Notifikácie" - LABEL_SOUND_NOTIFICATION: "Sound notification" - LABEL_CHROME_NOTIFICATION_DESC: "Zobrazovať upozornenia na nové správy" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Zablokované prehliadačom)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Kontakty" - LABEL_CONTACTS_AUTOSAVE: "Automaticky pridávať príjemcov správ do Adresára" - LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" - LABEL_CONTACTS_SYNC_SERVER: "Server" - LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" - LABEL_CONTACTS_SYNC_USER: "User" - LABEL_CONTACTS_SYNC_PASSWORD: "Password" - SETTINGS_THEMES: - LEGEND_THEMES: "Motívy" - LEGEND_THEMES_CUSTOM: "Správa vlastného motívu" - LABEL_CUSTOM_TYPE: "Typ" - LABEL_CUSTOM_TYPE_LIGHT: "Svetlý" - LABEL_CUSTOM_TYPE_DARK: "Tmavý" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Pozadie" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Nahrať obrázok pozadia (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "Súbor je príliš veľký" - ERROR_FILE_TYPE_ERROR: "Nesprávny typ súboru (JPG and PNG only)" - ERROR_UNKNOWN: "Nastala nezáma chyba pri nahrávaní súboru" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Pripojiť Google" - BUTTON_GOOGLE_DISCONNECT: "Odpojiť Google" - MAIN_GOOGLE_DESC: "After enabling login via Google, you can log into this account using Google button on the login screen." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Pripojiť Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Odpojiť Facebook" - MAIN_FACEBOOK_DESC: "After enabling login via Facebook, you can log into this account using Facebook button on the login screen." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Pripojiť Twitter" - BUTTON_TWITTER_DISCONNECT: "Odpojiť Twitter" - MAIN_TWITTER_DESC: "After enabling login via Twitter, you can log into this account using Twitter button on the login screen." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Zoznam priečinkov" - BUTTON_CREATE: "Vytvoriť priečinok" - BUTTON_SYSTEM: "Systémové priečinky" - BUTTON_DELETE: "Odstrániť" - BUTTON_SUBSCRIBE: "Prihlásiť sa" - BUTTON_UNSUBSCRIBE: "Odhlásiť sa" - LOADING_PROCESS: "Aktualizujem zoznam priečinkov" - CREATING_PROCESS: "Vytváram priečinok" - DELETING_PROCESS: "Odstraňujem priečinok" - RENAMING_PROCESS: "Premenovávam prečinok" - DELETING_ASK: "Ste si istý?" - TO_MANY_FOLDERS_DESC_1: "You have too many folders!" - TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." - HELP_DELETE_FOLDER: "Delete folder" - HELP_SHOW_HIDE_FOLDER: "Show/hide folder" - HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Zoznam účtov" - LEGEND_IDENTITIES: "Identities" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" - BUTTON_ADD_ACCOUNT: "Pridať účet" - BUTTON_ADD_IDENTITY: "Add an Identity" - BUTTON_DELETE: "Odstrániť" - LOADING_PROCESS: "Aktualizácia zoznamu účtov" - DELETING_ASK: "Ste si istý?" - DEFAULT_IDENTITY_LABEL: "default" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identita" - LEGEND_IDENTITIES: "Ďalšie identity" - LABEL_DEFAULT: "Default" - LABEL_DISPLAY_NAME: "Meno" - LABEL_REPLY_TO: "Adresa pre odpoveď" - LABEL_SIGNATURE: "Podpis" - LABEL_ADD_SIGNATURE_TO_ALL: "Pripojiť podpis ku všetkým odosielaným správam" - BUTTON_ADD_IDENTITY: "Pridať Identitu" - BUTTON_DELETE: "Odstrániť" - LOADING_PROCESS: "Aktualizácia zoznamu identít" - DELETING_ASK: "Ste si istý?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Zmeniť heslo" - LABEL_CURRENT_PASSWORD: "Súčasné heslo" - LABEL_NEW_PASSWORD: "Nové heslo" - LABEL_REPEAT_PASSWORD: "Nové heslo znova" - BUTTON_UPDATE_PASSWORD: "Nastaviť nové heslo" - ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" - TITLE_PRIVATE: "Private" - TITLE_PUBLIC: "Public" - DELETING_ASK: "Are you sure?" - GENERATE_ONLY_HTTPS: "HTTPS only" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" - TAB_MAILBOX: "Mailbox" - TAB_MESSAGE_LIST: "Message list" - TAB_MESSAGE_VIEW: "Message view" - TAB_COMPOSE: "Compose" - LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" - LABEL_REPLY: "Reply" - LABEL_REPLY_ALL: "Reply All" - LABEL_FORWARD: "Forward" - LABEL_FORWARD_MULTIPLY: "Forward (multiply)" - LABEL_HELP: "Help" - LABEL_CHECK_ALL: "Select all messages" - LABEL_ARCHIVE: "Archive" - LABEL_DELETE: "Delete" - LABEL_OPEN_THREAD: "Open selected thread" - LABEL_MOVE: "Move" - LABEL_READ: "Read selected messages" - LABEL_UNREAD: "Unread selected messages" - LABEL_IMPORTANT: "Označiť vybrané správy ako Dôležité" - LABEL_SEARCH: "Search" - LABEL_CANCEL_SEARCH: "Cancel search" - LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" - LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" - LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" - LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" - LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" - LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" - LABEL_THREAD_NEXT: "Next message in thread" - LABEL_THREAD_PREV: "Previous message in thread" - LABEL_PRINT: "Print" - LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" - LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" - LABEL_SWITCH_TO_LIST: "Switch focus back to message list" - LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" - LABEL_SAVE_MESSAGE: "Save message" - LABEL_SEND_MESSAGE: "Send message" - LABEL_CLOSE_COMPOSE: "Close compose" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "No public keys found" - NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" - NO_PRIVATE_KEY_FOUND: "No private key found" - NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" - ADD_A_PUBLICK_KEY: "Add a public key" - SELECT_A_PRIVATE_KEY: "Vybrať súkromný kľúč" - UNVERIFIRED_SIGNATURE: "Unverified signature" - DECRYPTION_ERROR: "OpenPGP decryption error" - GOOD_SIGNATURE: "Good signature from %USER%" - PGP_ERROR: "OpenPGP error: %ERROR%" - SPECIFY_FROM_EMAIL: "Please specify FROM email address" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" - NOTIFICATIONS: - INVALID_TOKEN: "Neplatný token" - AUTH_ERROR: "Overenie zlyhalo" - ACCESS_ERROR: "Chyba prístupu" - CONNECTION_ERROR: "Nepodarilo sa pripojiť k serveru" - CAPTCHA_ERROR: "Nesprávne CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - DOMAIN_NOT_ALLOWED: "Doména nie je povolená" - ACCOUNT_NOT_ALLOWED: "Účet nie je povolený" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" - COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" - CURRENT_PASSWORD_INCORRECT: "Current password incorrect" - NEW_PASSWORD_SHORT: "Password is too short" - NEW_PASSWORD_WEAK: "Password is too easy" - NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" - CONTACTS_SYNC_ERROR: "Contacts synchronization error" - CANT_GET_MESSAGE_LIST: "Chyba pri vytváraní zoznamu správ." - CANT_GET_MESSAGE: "Správu sa nepodarilo načítať" - CANT_DELETE_MESSAGE: "Správu sa nepodarilo odstrániť" - CANT_MOVE_MESSAGE: "Správu sa nepodarilo presunúť" - CANT_SAVE_MESSAGE: "Správu sa nepodarilo uložiť" - CANT_SEND_MESSAGE: "Správu sa nepodarilo odoslať" - INVALID_RECIPIENTS: "Neplatný príjemcovia" - CANT_SAVE_FILTERS: "Can't save filters" - CANT_GET_FILTERS: "Can't get filters" - FILTERS_ARE_NOT_CORRECT: "Filters are not correct" - CANT_CREATE_FOLDER: "Priečinok sa nepodarilo vytvoriť" - CANT_RENAME_FOLDER: "Priečinok sa nepodarilo premenovať" - CANT_DELETE_FOLDER: "Priečinok sa nepodarilo odstrániť" - CANT_DELETE_NON_EMPTY_FOLDER: "Nemôžem odstrániť neprázdny priečinok" - CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" - CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" - CANT_SAVE_SETTINGS: "Nastavenia sa nepodarilo uložiť" - CANT_SAVE_PLUGIN_SETTINGS: "Nastavenia sa nepodarilo uložiť" - DOMAIN_ALREADY_EXISTS: "Táto Doména už existuje" - CANT_INSTALL_PACKAGE: "Inštalácia balíčka zlyhala" - CANT_DELETE_PACKAGE: "Odstránenie balíčka zlyhalo" - INVALID_PLUGIN_PACKAGE: "Invalid plugin package" - UNSUPPORTED_PLUGIN_PACKAGE: "Nepodporovaný balíček rozšírenia" - LICENSING_SERVER_IS_UNAVAILABLE: "Subscription server is unvailable" - LICENSING_DOMAIN_EXPIRED: "Subscription for this domain has expired." - LICENSING_DOMAIN_BANNED: "Subscription for this domain is banned." - DEMO_SEND_MESSAGE_ERROR: "For security purposes, this demo account is not allowed to send messages to external e-mail addresses!" - DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" - ACCOUNT_ALREADY_EXISTS: "účet už existuje" - ACCOUNT_DOES_NOT_EXIST: "Účet neexistuje" - MAIL_SERVER_ERROR: "Nastala chyba počas prístupu na poštový server" - INVALID_INPUT_ARGUMENT: "Invalid input argument" - UNKNOWN_ERROR: "Neznáma chyba" - STATIC: - BACK_LINK: "Obnoviť" - DOMAIN_LIST_DESC: "Zoznam domén ku ktorým je povolené pristupovať cez webmail." - PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" - PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" - NO_SCRIPT_TITLE: "Táto aplikácia vyžaduje JavaScript." - NO_SCRIPT_DESC: | - Váš internetový prehliadač nepodporuje JavaScript. - Prosím povoľte podporu JavaScriptu v nastaveniach vášho internetového prehliadača a skúste to znova. - NO_COOKIE_TITLE: "Táto aplikácia vyžaduje podporu Cookies." - NO_COOKIE_DESC: | - Váš internetový prehliadač nepodporuje Cookies. - Prosím povoľte podporu Cookies v nastaveniach vášho internetového prehliadača a skúste to znova. - BAD_BROWSER_TITLE: "Používate zastaralý internetový prehliadač." - BAD_BROWSER_DESC: | - Aby ste mohli využívať všetky funkcie tejto aplikácie, - použite niektorý z nasledujúcich internetových prehliadačov: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sl_SI.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sl_SI.yml deleted file mode 100755 index e92a7ff7..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sl_SI.yml +++ /dev/null @@ -1,710 +0,0 @@ -sl_SI: - LOGIN: - LABEL_EMAIL: "E-pošta" - LABEL_LOGIN: "Prijava" - LABEL_PASSWORD: "Geslo" - LABEL_SIGN_ME: "Zapomni si prijavo" - LABEL_VERIFICATION_CODE: "Potrditvena koda" - LABEL_DONT_ASK_VERIFICATION_CODE: "Ponoven vnos kode čez 2 tedna" - BUTTON_SIGN_IN: "Prijavi se" - TITLE_SIGN_IN_GOOGLE: "Za prijavo uporabi Google" - TITLE_SIGN_IN_FACEBOOK: "Za prijavo uporabi Facebook" - TITLE_SIGN_IN_TWITTER: "Za prijavo uporabi Twitter" - LABEL_FORGOT_PASSWORD: "Pozabljeno geslo" - LABEL_REGISTRATION: "Registracija" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Dodaj račun" - BUTTON_SETTINGS: "Nastavitve" - BUTTON_HELP: "Pomoč" - BUTTON_LOGOUT: "Odjavi" - MOBILE: - BUTTON_MOBILE_VERSION: "Mobilna različica" - BUTTON_DESKTOP_VERSION: "Namizna različica" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Iskanje" - TITLE_ADV: "Napredno iskanje" - LABEL_ADV_FROM: "Od" - LABEL_ADV_TO: "Za" - LABEL_ADV_SUBJECT: "Zadeva" - LABEL_ADV_TEXT: "Besedilo" - LABEL_ADV_HAS_ATTACHMENT: "Ima prilogo" - LABEL_ADV_HAS_ATTACHMENTS: "Ima prilogi/-e" - LABEL_ADV_FLAGGED: "Z zvezdico" - LABEL_ADV_UNSEEN: "Neprebrano" - LABEL_ADV_DATE: "Datum" - LABEL_ADV_DATE_ALL: "Vsa" - LABEL_ADV_DATE_3_DAYS: "Do 3 dni nazaj" - LABEL_ADV_DATE_7_DAYS: "Do 1 tedna nazaj" - LABEL_ADV_DATE_MONTH: "Do 1 meseca nazaj" - LABEL_ADV_DATE_3_MONTHS: "Do 3 mesecev nazaj" - LABEL_ADV_DATE_6_MONTHS: "Do 6 mesecev nazaj" - LABEL_ADV_DATE_YEAR: "Do 1 leta nazaj" - BUTTON_ADV_SEARCH: "Išči" - PREVIEW_POPUP: - FULLSCREEN: "Preklopi celozaslonski pogled" - ZOOM: "Približaj/oddalji" - CLOSE: "Zapri (Esc)" - LOADING: "Nalaganje..." - GALLERY_PREV: "Nazaj (puščica levo)" - GALLERY_NEXT: "Naprej (puščica desno)" - GALLERY_COUNTER: "%curr% od %total%" - IMAGE_ERROR: "Slike ni bilo mogoče naložiti." - AJAX_ERROR: "Vsebine ni bilo mogoče naložiti." - FOLDER_LIST: - BUTTON_COMPOSE: "Sestavi" - BUTTON_CONTACTS: "Stiki" - BUTTON_NEW_MESSAGE: "Novo sporočilo" - INBOX_NAME: "Prejeto" - SENT_NAME: "Poslano" - DRAFTS_NAME: "Osnutki" - SPAM_NAME: "Vsiljena pošta" - TRASH_NAME: "Smeti" - ARCHIVE_NAME: "Arhiv" - QUOTA: - TITLE: "Poraba prostora" - MESSAGE_LIST: - BUTTON_RELOAD: "Ponovno naloži seznam sporočil" - BUTTON_MOVE_TO: "Premakni v" - BUTTON_DELETE: "Izbriši" - BUTTON_ARCHIVE: "Arhiviraj" - BUTTON_SPAM: "Vsiljena pošta" - BUTTON_NOT_SPAM: "Ni vsiljena pošta" - BUTTON_EMPTY_FOLDER: "Izprazni mapo" - BUTTON_MULTY_FORWARD: "Posreduj kot prilogo/-e" - BUTTON_DELETE_WITHOUT_MOVE: "Trajno izbriši" - BUTTON_MORE: "Več" - MENU_SET_SEEN: "Označi kot prebrano" - MENU_SET_ALL_SEEN: "Označi vsa kot prebrano" - MENU_UNSET_SEEN: "Označi kot neprebrano" - MENU_SET_FLAG: "Dodaj zvezdico" - MENU_UNSET_FLAG: "Odstrani zvezdico" - MENU_SELECT_ALL: "Vsa" - MENU_SELECT_NONE: "Nobeno" - MENU_SELECT_INVERT: "Obrni izbiro" - MENU_SELECT_UNSEEN: "Neprebrana" - MENU_SELECT_SEEN: "Prebrana" - MENU_SELECT_FLAGGED: "Z zvezdico" - MENU_SELECT_UNFLAGGED: "Brez zvezdice" - EMPTY_LIST: "Prazen seznam." - EMPTY_SEARCH_LIST: "Brez ujemanj." - SEARCH_RESULT_FOR: "Ujemanja za \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "nazaj na seznam sporočil" - LIST_LOADING: "Nalaganje" - EMPTY_SUBJECT_TEXT: "(Brez zadeve)" - PUT_MESSAGE_HERE: "Spustite sporočilo tu za ogled na seznamu" - TODAY_AT: "danes ob %TIME%" - YESTERDAY_AT: "včeraj ob %TIME%" - SEARCH_PLACEHOLDER: "Iskanje" - NEW_MESSAGE_NOTIFICATION: "Imate %COUNT% novih sporočil!" - QUOTA_SIZE: "Uporabljenih %SIZE% (%PROC%%) od %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Uredi" - BUTTON_BACK: "Nazaj" - BUTTON_CLOSE: "Zapri" - BUTTON_DELETE: "Izbriši" - BUTTON_UNSUBSCRIBE: "Odjava s tega seznama" - BUTTON_ARCHIVE: "Arhiviraj" - BUTTON_SPAM: "Vsiljena pošta" - BUTTON_NOT_SPAM: "Ni vsiljena pošta" - BUTTON_MOVE_TO: "Premakni v" - BUTTON_MORE: "Več" - BUTTON_REPLY: "Odgovori" - BUTTON_REPLY_ALL: "Odgovori vsem" - BUTTON_FORWARD: "Posreduj" - BUTTON_FORWARD_AS_ATTACHMENT: "Posreduj kot prilogo" - BUTTON_EDIT_AS_NEW: "Uredi kot novo" - BUTTON_SHOW_IMAGES: "Prikaži zunanje slike" - BUTTON_NOTIFY_READ_RECEIPT: "Pošiljatelj želi biti obveščen, ko bo pismo prebrano." - BUTTON_IN_NEW_WINDOW: "Ogled v novem oknu" - BUTTON_THREAD_LIST: "Seznam niti" - BUTTON_THREAD_PREV: "Prejšnja" - BUTTON_THREAD_NEXT: "Naslednja" - BUTTON_THREAD_MORE: "Več sporočil" - MENU_HEADERS: "Pokaži glavo sporočila" - MENU_VIEW_ORIGINAL: "Pokaži izvorno" - MENU_DOWNLOAD_ORIGINAL: "Prenesi kot .eml datoteko" - MENU_FILTER_SIMILAR: "Filtriraj sporočila, kot je to" - MENU_PRINT: "Natisni" - EMPTY_SUBJECT_TEXT: "(Brez zadeve)" - LABEL_SUBJECT: "Zadeva" - LABEL_DATE: "Datum" - LABEL_FROM: "Od" - LABEL_FROM_SHORT: "od" - LABEL_TO: "Za" - LABEL_TO_SHORT: "za" - LABEL_CC: "Kp" - LABEL_BCC: "Skp" - LABEL_REPLY_TO: "Odgovor na" - PRINT_LABEL_FROM: "Od" - PRINT_LABEL_TO: "Za" - PRINT_LABEL_CC: "Kp" - PRINT_LABEL_BCC: "Skp" - PRINT_LABEL_REPLY_TO: "Odgovor na" - PRINT_LABEL_DATE: "Datum" - PRINT_LABEL_SUBJECT: "Zadeva" - PRINT_LABEL_ATTACHMENTS: "Priloge" - MESSAGE_LOADING: "Nalaganje" - MESSAGE_VIEW_DESC: "Izberite sporočilo s seznama za ogled." - MESSAGE_VIEW_MOVE_DESC: "Za izbor cilja kliknite na ime mape na levi strani." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Geslo" - PGP_SIGNED_MESSAGE_DESC: "Sporočilo, podpisano z OpenPGP (kliknite za overovitev)" - PGP_ENCRYPTED_MESSAGE_DESC: "Sporočilo, šifrirano z OpenPGP (kliknite za dešifriranje)" - LINK_DOWNLOAD_AS_ZIP: "Prenesi kot .zip datoteko" - LINK_SAVE_TO_OWNCLOUD: "Shrani na ownCloud" - LINK_SAVE_TO_DROPBOX: "Shrani na Dropbox" - READ_RECEIPT: - SUBJECT: "Povratno poročilo (prikazano) - %SUBJECT%" - BODY: | - To je povratno poročilo za sporočilo, ki je bilo poslano na %READ-RECEIPT%. - - Opomba: "To povratno poročilo pomeni le, da je bilo sporočilo prikazano na računalniku prejemnika." - Ni jamstva za prejemnikovo razumevanje vsebine sporočila. - SUGGESTIONS: - SEARCHING_DESC: "Iskanje..." - CONTACTS: - LEGEND_CONTACTS: "Stiki" - SEARCH_INPUT_PLACEHOLDER: "Iskanje" - BUTTON_ADD_CONTACT: "Dodaj stik" - BUTTON_CREATE_CONTACT: "Ustvari" - BUTTON_UPDATE_CONTACT: "Posodobi" - BUTTON_IMPORT: "Uvozi (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Izvozi (vcf, vCard)" - BUTTON_EXPORT_CSV: "Izvozi (csv)" - ERROR_IMPORT_FILE: "Napaka uvoza (neveljaven format datoteke)" - LIST_LOADING: "Nalaganje" - EMPTY_LIST: "Ni stikov" - EMPTY_SEARCH: "Ni ujemajočih stikov" - CLEAR_SEARCH: "Počisti iskalne kriterije" - CONTACT_VIEW_DESC: "Izberite stik s seznama za ogled." - LABEL_DISPLAY_NAME: "Prikazno ime" - LABEL_EMAIL: "E-pošta" - LABEL_PHONE: "Telefon" - LABEL_WEB: "Splet" - LABEL_BIRTHDAY: "Rojstni dan" - LINK_ADD_EMAIL: "Dodaj e-poštni naslov" - LINK_ADD_PHONE: "Dodaj telefon" - LINK_BIRTHDAY: "Rojstni dan" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Vnos prikaznega imena" - PLACEHOLDER_ENTER_LAST_NAME: "Vnos priimka" - PLACEHOLDER_ENTER_FIRST_NAME: "Vnos imena" - PLACEHOLDER_ENTER_NICK_NAME: "Vnos vzdevka" - LABEL_READ_ONLY: "Samo za branje" - LABEL_SHARE: "Deljenje" - ADD_MENU_LABEL: "Dodajanje" - ADD_MENU_NICKNAME: "Vzdevek" - ADD_MENU_NOTES: "Zapiski" - ADD_MENU_EMAIL: "E-pošta" - ADD_MENU_PHONE: "Telefon" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Naslov" - ADD_MENU_BIRTHDAY: "Rojstni dan" - ADD_MENU_TAGS: "Značke" - BUTTON_SHARE_NONE: "Nobenega" - BUTTON_SHARE_ALL: "Vse" - BUTTON_SYNC: "Sinhronizacija (CardDAV)" - COMPOSE: - TITLE_FROM: "Od" - TITLE_TO: "Za" - TITLE_CC: "Kp" - TITLE_BCC: "Skp" - TITLE_REPLY_TO: "Odgovor na" - TITLE_SUBJECT: "Zadeva" - LINK_SHOW_INPUTS: "prikaz vseh polj" - BUTTON_SEND: "Pošlji" - BUTTON_SAVE: "Shrani" - BUTTON_DELETE: "Izbriši" - BUTTON_CANCEL: "Prekliči" - BUTTON_MINIMIZE: "Minimiraj" - SAVED_TIME: "Shranjeno ob %TIME%" - SAVED_ERROR_ON_SEND: "Sporočilo je bilo poslano, a ne shranjeno med poslana sporočila" - DISCARD_UNSAVED_DATA: "Zavržem neshranjene podatke?" - ATTACH_FILES: "Priloži datoteke" - ATTACH_DROP_FILES_DESC: "Spustite datoteke tu" - ATTACH_ITEM_CANCEL: "Prekliči" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% je napisal/-a" - FORWARD_MESSAGE_TOP_TITLE: "-------- Posredovano sporočilo -------" - FORWARD_MESSAGE_TOP_FROM: "Od" - FORWARD_MESSAGE_TOP_TO: "Za" - FORWARD_MESSAGE_TOP_CC: "Kp" - FORWARD_MESSAGE_TOP_SENT: "Poslano" - FORWARD_MESSAGE_TOP_SUBJECT: "Zadeva" - EMPTY_TO_ERROR_DESC: "Navedite vsaj enega/-o prejemnika/-co" - NO_ATTACHMENTS_HERE_DESC: "Ni prilog." - ATTACHMENTS_ERROR_DESC: "Pozor! Priloge niso bile vse naložene." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Priloge še niso bile naložene v celoti." - BUTTON_REQUEST_READ_RECEIPT: "Zahtevaj potrdilo o branju" - BUTTON_MARK_AS_IMPORTANT: "Označi kot pomembno" - BUTTON_OPEN_PGP: "OpenPGP (Navadno besedilo)" - BUTTON_REQUEST_DSN: "Zahtevaj potrdilo o dostavi" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Zapri" - POPUPS_ASK: - BUTTON_YES: "Da" - BUTTON_NO: "Ne" - DESC_WANT_CLOSE_THIS_WINDOW: "Želite zapreti to okno?" - DESC_WANT_DELETE_MESSAGES: "Želite izbrisati sporočilo/-a?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Izberite jezik" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Dodam račun?" - BUTTON_ADD_ACCOUNT: "Dodaj" - TITLE_UPDATE_ACCOUNT: "Posodobim račun?" - BUTTON_UPDATE_ACCOUNT: "Posodobi" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Dodam identiteto?" - TITLE_UPDATE_IDENTITY: "Posodobim identiteto?" - BUTTON_ADD_IDENTITY: "Dodaj" - BUTTON_UPDATE_IDENTITY: "Posodobi" - LABEL_EMAIL: "E-pošta" - LABEL_NAME: "Ime" - LABEL_REPLY_TO: "Odgovor na" - LABEL_SIGNATURE: "Podpis" - LABEL_CC: "Kp" - LABEL_BCC: "Skp" - LABEL_SIGNATURE_INSERT_BEFORE: "Vstavi ta podpis pred citirano besedilo v odgovorih" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Ustvarim mapo?" - LABEL_NAME: "Ime mape" - LABEL_PARENT: "Nadrejena mapa" - BUTTON_CREATE: "Ustvari" - BUTTON_CANCEL: "Prekliči" - BUTTON_CLOSE: "Zapri" - TITLE_CREATING_PROCESS: "Ustvarjam mapo" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Počistim vsa sporočila iz mape?" - BUTTON_CLEAR: "Počisti" - BUTTON_CANCEL: "Prekliči" - BUTTON_CLOSE: "Zapri" - DANGER_DESC_WARNING: "Pozor!" - DANGER_DESC_HTML_1: "To dejanje bo izbrisalo vsa sporočila iz mape %FOLDER% v celoti." - DANGER_DESC_HTML_2: "Tega postopka ne bo mogoče preklicati ali zaustaviti." - TITLE_CLEARING_PROCESS: "Čistim mapo." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Uvoz OpenPGP ključa" - BUTTON_IMPORT_OPEN_PGP_KEY: "Uvozi" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Ogled OpenPGP ključa" - BUTTON_SELECT: "Izberi" - BUTTON_CLOSE: "Zapri" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Generiraj OpenPGP ključe" - LABEL_EMAIL: "E-pošta" - LABEL_NAME: "Ime" - LABEL_PASSWORD: "Geslo" - LABEL_KEY_BIT_LENGTH: "Dolžina ključa" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generiraj" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP podpis/šifriranje" - LABEL_SIGN: "Podpis" - LABEL_ENCRYPT: "Šifriranje" - LABEL_PASSWORD: "Geslo" - BUTTON_SIGN: "Podpiši" - BUTTON_ENCRYPT: "Šifriraj" - BUTTON_SIGN_AND_ENCRYPT: "Podpiši in šifriraj" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP dešifriranje" - LABEL_KEY: "Zasebni ključ" - LABEL_PASSWORD: "Geslo" - BUTTON_DECRYPT: "Dešifriraj" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "2-stopenjski overitveni preizkus" - LABEL_CODE: "Koda" - BUTTON_TEST: "Preizkusi" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Ustvarim filter?" - TITLE_EDIT_FILTER: "Posodobim filter?" - FILTER_NAME: "Ime" - LEGEND_CONDITIONS: "Pogoji" - LEGEND_ACTIONS: "Dejanja" - BUTTON_DONE: "Končaj" - BUTTON_ADD_CONDITION: "Dodaj pogoj" - SELECT_ACTION_NONE: "Nobeno" - SELECT_ACTION_MOVE_TO: "Premakni v" - SELECT_ACTION_FORWARD_TO: "Posreduj na" - SELECT_ACTION_REJECT: "Zavrni" - SELECT_ACTION_VACATION_MESSAGE: "Sporočilo odsotnosti" - SELECT_ACTION_DISCARD: "Zavrzi" - SELECT_FIELD_FROM: "Od" - SELECT_FIELD_RECIPIENTS: "Prejemniki (Za ali Kp)" - SELECT_FIELD_SUBJECT: "Zadeva" - SELECT_FIELD_HEADER: "Glava" - SELECT_FIELD_SIZE: "Velikost" - SELECT_TYPE_CONTAINS: "Vsebuje" - SELECT_TYPE_NOT_CONTAINS: "Ne vsebuje" - SELECT_TYPE_MATCHES: "Se ujema (* in ? sta podprta)" - SELECT_TYPE_NOT_MATCHES: "Se ne ujema (* in ? sta podprta)" - SELECT_TYPE_REGEXP: "Regularni izraz" - SELECT_TYPE_NOT_REGEXP: "Inverz regularnega izraza" - SELECT_TYPE_EQUAL_TO: "Enako kot" - SELECT_TYPE_NOT_EQUAL_TO: "Različno od" - SELECT_TYPE_OVER: "Nad" - SELECT_TYPE_UNDER: "Pod" - SELECT_MATCH_ANY: "Ustreza katerem koli od sledečih pravil" - SELECT_MATCH_ALL: "Ustreza vsem od sledečih pravil" - MARK_AS_READ_LABEL: "Označi kot prebrano" - REPLY_INTERVAL_LABEL: "Interval odgovorov (dnevi)" - KEEP_LABEL: "Obdrži" - STOP_LABEL: "Ne prenehaj z obdelovanjem pravil" - EMAIL_LABEL: "E-pošta" - VACATION_SUBJECT_LABEL: "Zadeva (izbirno)" - VACATION_MESSAGE_LABEL: "Sporočilo" - VACATION_RECIPIENTS_LABEL: "Prejemniki (ločeni z vejico)" - REJECT_MESSAGE_LABEL: "Zavrni sporočilo" - ALL_INCOMING_MESSAGES_DESC: "Vsa dohodna sporočila" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Izbor sistemskih map" - SELECT_CHOOSE_ONE: "Izberite eno" - SELECT_UNUSE_NAME: "Ne uporabi" - LABEL_SENT: "Poslano" - LABEL_DRAFTS: "Osnutki" - LABEL_SPAM: "Vsiljena pošta" - LABEL_TRASH: "Smeti" - LABEL_ARCHIVE: "Arhiv" - BUTTON_CANCEL: "Prekliči" - BUTTON_CLOSE: "Zapri" - NOTIFICATION_SENT: | - Niste izbrali sistemske mape "Poslano" za shranjevanje poslanih sporočil. - Če ne želite shranjevati poslanih sporočil, izberite možnost "Ne uporabi". - NOTIFICATION_DRAFTS: "Niste izbrali sistemske mape \"Osnutki\" za začasno shranjevanje sporočil med sestavljanjem." - NOTIFICATION_SPAM: | - Niste izbrali sistemske mape "Vsiljena pošta" za shranjevanje vsiljene pošte. - Če želite vsiljeno pošto sproti brisati, izberite možnost "Ne uporabi". - NOTIFICATION_TRASH: | - Niste izbrali sistemske mape "Smetnjak" za izbrisana sporočila pred trajnim brisanjem. - Če jih želite vedno trajno izbrisati, izberite možnost "Ne uporabi". - NOTIFICATION_ARCHIVE: "Niste izbrali sistemske mape \"Arhiv\" za trajno arhiviranje sporočil." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "2-stopenjsko overjanje (TOTP)" - LABEL_ENABLE_TWO_FACTOR: "Omogoči 2-stopenjsko overjanje" - LABEL_TWO_FACTOR_USER: "Uporabnik" - LABEL_TWO_FACTOR_STATUS: "Stanje" - LABEL_TWO_FACTOR_SECRET: "Skrivnost" - LABEL_TWO_FACTOR_BACKUP_CODES: "Pomožne kode" - BUTTON_CREATE: "Ustvari skrivnost" - BUTTON_ACTIVATE: "Aktiviraj" - BUTTON_CLEAR: "Počisti" - BUTTON_LOGOUT: "Odjavi" - BUTTON_DONE: "Končaj" - BUTTON_TEST: "Preizkusi" - LINK_TEST: "preizkus" - BUTTON_SHOW_SECRET: "Pokaži skrivnost" - BUTTON_HIDE_SECRET: "Skrij skrivnost" - TWO_FACTOR_REQUIRE_DESC: "Račun zahteva 2-stopenjsko overjanje." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Nastavljena" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Ni nastavljena" - TWO_FACTOR_SECRET_DESC: > - Uvozite te podatke v Google Authenticator (ali drugo TOTP aplikacijo) z uporabo - spodnje QR kode ali ročnim vnosom kode. - TWO_FACTOR_BACKUP_CODES_DESC: > - Če ne morete prejeti kode preko Google Authenticator (ali druge TOTP aplikacije), - lahko uporabite pomožne kode za vpis. Vsaka pomožna koda je za enkratno uporabo. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Ne morete spremenite te nastavitve brez preizkusa." - TITLES: - LOADING: "Nalaganje" - LOGIN: "Prijava" - MAILBOX: "Nabiralnik" - SETTINGS: "Nastavitve" - COMPOSE: "Sestavi" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Prevelika datoteka" - ERROR_FILE_PARTIALLY_UPLOADED: "Zaradi napake je bila datoteka delno naložena" - ERROR_NO_FILE_UPLOADED: "Nobena datoteka ni bila naložena" - ERROR_MISSING_TEMP_FOLDER: "Manjkajoča začasna mapa" - ERROR_ON_SAVING_FILE: "Neznana napaka pri nalaganju datoteke" - ERROR_FILE_TYPE: "Neveljaven tip datoteke" - ERROR_UNKNOWN: "Neznana napaka pri nalaganju datoteke" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> Navadno besedilo" - TEXT_SWITCHER_RICH_FORMATTING: "Obogateno besedilo" - TEXT_SWITCHER_CONFIRM: "Oblikovanje ter postavitev besedila in slik bosta izgubljena. Želite nadaljevati?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Osebno" - LABEL_GENERAL_NAME: "Splošno" - LABEL_CONTACTS_NAME: "Stiki" - LABEL_FOLDERS_NAME: "Mape" - LABEL_ACCOUNTS_NAME: "Računi" - LABEL_IDENTITY_NAME: "Identiteta" - LABEL_IDENTITIES_NAME: "Identitete" - LABEL_FILTERS_NAME: "Filtri" - LABEL_TEMPLATES_NAME: "Predloge" - LABEL_SECURITY_NAME: "Varnost" - LABEL_SOCIAL_NAME: "Družabno" - LABEL_THEMES_NAME: "Teme" - LABEL_CHANGE_PASSWORD_NAME: "Geslo" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Nazaj" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filtri" - BUTTON_SAVE: "Shrani" - BUTTON_ADD_FILTER: "Dodaj filter" - BUTTON_DELETE: "Izbriši" - BUTTON_RAW_SCRIPT: "Uporabi lastno skriptno datoteko" - SUBNAME_NONE: "Nobeno" - SUBNAME_MOVE_TO: "Premakni v \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Posreduj na \"%EMAIL%\"" - SUBNAME_REJECT: "Zavrni" - SUBNAME_VACATION_MESSAGE: "Sporočilo odsotnosti" - SUBNAME_DISCARD: "Zavrzi" - CAPABILITY_LABEL: "Zmožnosti" - LOADING_PROCESS: "Posodabljanje seznama filtrov" - DELETING_ASK: "Ste prepričani?" - CHACHES_NEED_TO_BE_SAVED_DESC: "Spremembe morajo biti shranjene na strežnik." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identiteta" - LABEL_DISPLAY_NAME: "Ime" - LABEL_REPLY_TO: "Odgovor na" - LABEL_SIGNATURE: "Podpis" - LABEL_ADD_SIGNATURE_TO_ALL: "Dodaj podpis vsem odhodnim sporočilom" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Varnost" - LABEL_CONFIGURE_TWO_FACTOR: "Nastavljanje 2-stopenjskega overjanja" - LABEL_AUTOLOGOUT: "Samodejna odjava" - AUTOLOGIN_NEVER_OPTION_NAME: "Nikoli" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minut" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% ur" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Splošno" - LABEL_LANGUAGE: "Jezik" - LABEL_IDENTITY: "Identiteta" - LABEL_LAYOUT: "Postavitev" - LABEL_LAYOUT_NO_SPLIT: "Brez razdelitve" - LABEL_LAYOUT_VERTICAL_SPLIT: "Navpično razdeljeno" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Vodoravno razdeljeno" - LABEL_EDITOR: "Privzeta vrsta besedila" - LABEL_EDITOR_HTML: "HTML" - LABEL_EDITOR_PLAIN: "Navadno besedilo" - LABEL_EDITOR_HTML_FORCED: "HTML (obvezno)" - LABEL_EDITOR_PLAIN_FORCED: "Navadno besedilo (obvezno)" - LABEL_ANIMATION: "Animacije vmesnika" - LABEL_ANIMATION_FULL: "Vse" - LABEL_ANIMATION_NORMAL: "Normalno" - LABEL_ANIMATION_NONE: "Nobena" - LABEL_VIEW_OPTIONS: "Možnosti ogleda" - LABEL_USE_PREVIEW_PANE: "Uporabi polje za predogled" - LABEL_USE_CHECKBOXES_IN_LIST: "Na seznamu pokaži kvadratke za izbor" - LABEL_USE_THREADS: "Uporabi niti" - LABEL_REPLY_SAME_FOLDER: "Shrani odgovore v mapo sporočila, na katerega se odgovarja" - LABEL_SHOW_IMAGES: "Vedno prikaži zunanje slike v telesu sporočila" - LABEL_SHOW_ANIMATION: "Prikazna animacija" - LABEL_MESSAGE_PER_PAGE: "Sporočil na strani" - LABEL_NOTIFICATIONS: "Obvestila" - LABEL_SOUND_NOTIFICATION: "Zvočno obvestilo" - LABEL_CHROME_NOTIFICATION_DESC: "Prikaži obvestila ob novih sporočilih" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Zavrnil brskalnik)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Stiki" - LABEL_CONTACTS_AUTOSAVE: "Samodejno dodaj prejemnike v imenik" - LEGEND_CONTACTS_SYNC: "Oddaljena sinhronizacija (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Omogoči oddaljeno sinhronizacijo" - LABEL_CONTACTS_SYNC_SERVER: "Strežnik" - LABEL_CONTACTS_SYNC_AB_URL: "URL imenika" - LABEL_CONTACTS_SYNC_USER: "Uporabnik" - LABEL_CONTACTS_SYNC_PASSWORD: "Geslo" - SETTINGS_THEMES: - LEGEND_THEMES: "Teme" - LEGEND_THEMES_CUSTOM: "Prilagojena konfiguracija teme" - LABEL_CUSTOM_TYPE: "Tip" - LABEL_CUSTOM_TYPE_LIGHT: "Svetla" - LABEL_CUSTOM_TYPE_DARK: "Temna" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Ozadje" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Naloži sliko ozadja (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "Prevelika datoteka" - ERROR_FILE_TYPE_ERROR: "Neveljaven tip datoteke (samo JPG in PNG)" - ERROR_UNKNOWN: "Neznana napaka pri nalaganju datoteke" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Poveži Google" - BUTTON_GOOGLE_DISCONNECT: "Odklopi Google" - MAIN_GOOGLE_DESC: "Ko omogočite prijavo z Google računom, se lahko prijavite v ta račun z Google gumbom na prijavnem zaslonu." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Poveži Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Odklopi Facebook" - MAIN_FACEBOOK_DESC: "Ko omogočite prijavo s Facebook računom, se lahko prijavite v ta račun s Facebook gumbom na prijavnem zaslonu." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Poveži Twitter" - BUTTON_TWITTER_DISCONNECT: "Odklopi Twitter" - MAIN_TWITTER_DESC: "Ko omogočite prijavo s Twitter računom, se lahko prijavite v ta račun s Twitter gumbom na prijavnem zaslonu." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Seznam map" - BUTTON_CREATE: "Ustvari mapo" - BUTTON_SYSTEM: "Sistemske mape" - BUTTON_DELETE: "Izbriši" - BUTTON_SUBSCRIBE: "Spremljaj" - BUTTON_UNSUBSCRIBE: "Ne spremljaj" - LOADING_PROCESS: "Posodabljanje seznama map" - CREATING_PROCESS: "Ustvarjanje mape" - DELETING_PROCESS: "Brisanje mape" - RENAMING_PROCESS: "Preimenovanje mape" - DELETING_ASK: "Ste prepričani?" - TO_MANY_FOLDERS_DESC_1: "Imate preveč map!" - TO_MANY_FOLDERS_DESC_2: "Prikazanih je le del, da se izognemo tehničnim težavam." - HELP_DELETE_FOLDER: "Izbriši mapo" - HELP_SHOW_HIDE_FOLDER: "Prikaži/skrij mapo" - HELP_CHECK_FOR_NEW_MESSAGES: "Preverjaj/ne preverjaj za nova sporočila" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Računi" - LEGEND_IDENTITIES: "Identitete" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Računi in identitete" - BUTTON_ADD_ACCOUNT: "Dodaj račun" - BUTTON_ADD_IDENTITY: "Dodaj identiteto" - BUTTON_DELETE: "Izbriši" - LOADING_PROCESS: "Posodabljanje..." - DELETING_ASK: "Ste prepričani?" - DEFAULT_IDENTITY_LABEL: "privzeto" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identiteta" - LEGEND_IDENTITIES: "Dodatne identitete" - LABEL_DEFAULT: "Privzeto" - LABEL_DISPLAY_NAME: "Ime" - LABEL_REPLY_TO: "Odgovor na" - LABEL_SIGNATURE: "Podpis" - LABEL_ADD_SIGNATURE_TO_ALL: "Dodaj podpis vsem odhodnim sporočilom" - BUTTON_ADD_IDENTITY: "Dodaj identiteto" - BUTTON_DELETE: "Izbriši" - LOADING_PROCESS: "Posodabljanje seznama identitet" - DELETING_ASK: "Ste prepričani?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Sprememba gesla" - LABEL_CURRENT_PASSWORD: "Trenutno geslo" - LABEL_NEW_PASSWORD: "Novo geslo" - LABEL_REPEAT_PASSWORD: "Potrditev novega gesla" - BUTTON_UPDATE_PASSWORD: "Nastavi novo geslo" - ERROR_PASSWORD_MISMATCH: "Gesli se ne ujemata, poskusite znova" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Uvozi OpenPGP ključ" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generiraj OpenPGP ključe" - TITLE_PRIVATE: "Zasebni" - TITLE_PUBLIC: "Javni" - DELETING_ASK: "Ste prepričani?" - GENERATE_ONLY_HTTPS: "Samo HTTPS" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Tipkovne bližnjice" - TAB_MAILBOX: "Nabiralnik" - TAB_MESSAGE_LIST: "Seznam sporočil" - TAB_MESSAGE_VIEW: "Pogled sporočil" - TAB_COMPOSE: "Sestavi" - LABEL_OPEN_USER_DROPDOWN: "Prikaz seznama uporabnikov" - LABEL_REPLY: "Odgovori" - LABEL_REPLY_ALL: "Odgovori vsem" - LABEL_FORWARD: "Posreduj" - LABEL_FORWARD_MULTIPLY: "Posreduj kot prilogo/-e" - LABEL_HELP: "Pomoč" - LABEL_CHECK_ALL: "Izberi vsa sporočila" - LABEL_ARCHIVE: "Arhiv" - LABEL_DELETE: "Izbriši" - LABEL_OPEN_THREAD: "Odpri izbrano nit" - LABEL_MOVE: "Premakni" - LABEL_READ: "Označi kot prebrano" - LABEL_UNREAD: "Označi kot neprebrano" - LABEL_IMPORTANT: "Pomembno, dodaj zvezdico" - LABEL_SEARCH: "Iskanje" - LABEL_CANCEL_SEARCH: "Preklic iskanja" - LABEL_FULLSCREEN_ENTER: "Celozaslonsko (polje za predogled)" - LABEL_VIEW_MESSAGE_ENTER: "Ogled sporočila (brez polja za predogled)" - LABEL_SWITCH_TO_MESSAGE: "Osredotoči na izbrano sporočilo" - LABEL_SWITCH_TO_FOLDER_LIST: "Osredotoči na seznam map" - LABEL_FULLSCREEN_TOGGLE: "Preklopi celozaslonski način" - LABEL_BLOCKQUOTES_TOGGLE: "Preklopi bločne citate v sporočilu" - LABEL_THREAD_NEXT: "Naslednje sporočilo v niti" - LABEL_THREAD_PREV: "Prejšnje sporočilo v niti" - LABEL_PRINT: "Natisni" - LABEL_EXIT_FULLSCREEN: "Izhod iz celozaslonskega načina" - LABEL_CLOSE_MESSAGE: "Zapri sporočilo (brez polja za predogled)" - LABEL_SWITCH_TO_LIST: "Osredotoči na seznam sporočil" - LABEL_OPEN_COMPOSE_POPUP: "Odpri okno za sestavljanje" - LABEL_MINIMIZE_COMPOSE_POPUP: "Skrij okno za sestavljanje" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Odpri izbor identitet" - LABEL_SAVE_MESSAGE: "Shrani sporočilo" - LABEL_SEND_MESSAGE: "Pošlji sporočilo" - LABEL_CLOSE_COMPOSE: "Zapri sestavljanje" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "Ni najdenih javnih ključev" - NO_PUBLIC_KEYS_FOUND_FOR: "Ni najdenih javnih ključev za naslov \"%EMAIL%\"" - NO_PRIVATE_KEY_FOUND: "Ni najdenega zasebnega ključa" - NO_PRIVATE_KEY_FOUND_FOR: "Ni najdenega zasebnega ključa za naslov \"%EMAIL%\"" - ADD_A_PUBLICK_KEY: "Dodaj javni ključ" - SELECT_A_PRIVATE_KEY: "Izberite zasebni ključ" - UNVERIFIRED_SIGNATURE: "Neoverjen podpis" - DECRYPTION_ERROR: "OpenPGP napaka dešifriranja" - GOOD_SIGNATURE: "Dober podpis od %USER%" - PGP_ERROR: "OpenPGP napaka: %ERROR%" - SPECIFY_FROM_EMAIL: "Določite naslov pošiljatelja/-ice" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Navedite vsaj enega/-o prejemnika/-co" - NOTIFICATIONS: - INVALID_TOKEN: "Neveljaven žeton" - AUTH_ERROR: "Spodletelo overjanje" - ACCESS_ERROR: "Napaka dostopa" - CONNECTION_ERROR: "Ni mogoče vzpostaviti povezave s strežnikom" - CAPTCHA_ERROR: "Napačen CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Ta družabni ID še ni določen nobenemu e-poštnemu računu. Prijavite se z podatki - za e-pošto in omogočite to v nastavitvah računa. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Ta družabni ID še ni določen nobenemu e-poštnemu računu. Prijavite se z podatki - za e-pošto in omogočite to v nastavitvah računa. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Ta družabni ID še ni določen nobenemu e-poštnemu računu. Prijavite se z podatki - za e-pošto in omogočite to v nastavitvah računa. - DOMAIN_NOT_ALLOWED: "Domena ni dovoljena" - ACCOUNT_NOT_ALLOWED: "Račun ni dovoljen" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Obvezno 2-stopenjsko overjanje" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Napaka 2-stopenjskega overjanja" - COULD_NOT_SAVE_NEW_PASSWORD: "Ni bilo mogoče shraniti novega gesla" - CURRENT_PASSWORD_INCORRECT: "Napačno trenutno geslo" - NEW_PASSWORD_SHORT: "Prekratko geslo" - NEW_PASSWORD_WEAK: "Preveč enostavno geslo" - NEW_PASSWORD_FORBIDDENT: "Geslo vsebuje nedovoljene znake" - CONTACTS_SYNC_ERROR: "Napaka sinhronizacije stikov" - CANT_GET_MESSAGE_LIST: "Ni mogoče pridobiti seznama sporočil" - CANT_GET_MESSAGE: "Ni mogoče pridobiti sporočila" - CANT_DELETE_MESSAGE: "Ni mogoče izbrisati sporočila" - CANT_MOVE_MESSAGE: "Ni mogoče premakniti sporočila" - CANT_SAVE_MESSAGE: "Ni mogoče shraniti sporočila" - CANT_SEND_MESSAGE: "Ni mogoče poslati sporočila" - INVALID_RECIPIENTS: "Neveljavni prejemniki" - CANT_SAVE_FILTERS: "Ni mogoče shraniti filtrov" - CANT_GET_FILTERS: "Ni mogoče pridobiti filtrov" - FILTERS_ARE_NOT_CORRECT: "Filtri so nepravilni" - CANT_CREATE_FOLDER: "Ni mogoče ustvariti mape" - CANT_RENAME_FOLDER: "Ni mogoče preimenovati mape" - CANT_DELETE_FOLDER: "Ni mogoče izbrisati mape" - CANT_DELETE_NON_EMPTY_FOLDER: "Ni mogoče izbrisati neprazne mape" - CANT_SUBSCRIBE_FOLDER: "Ni mogoče slediti mapi" - CANT_UNSUBSCRIBE_FOLDER: "Ni mogoče prenehati slediti mapi" - CANT_SAVE_SETTINGS: "Ni mogoče shraniti nastavitev" - CANT_SAVE_PLUGIN_SETTINGS: "Ni mogoče shraniti nastavitev" - DOMAIN_ALREADY_EXISTS: "Domena že obstaja" - CANT_INSTALL_PACKAGE: "Neuspešna namestitev paketa" - CANT_DELETE_PACKAGE: "Neuspešno odstranjevanje paketa" - INVALID_PLUGIN_PACKAGE: "Neveljaven paket vtičnika" - UNSUPPORTED_PLUGIN_PACKAGE: "Nepodprt paket vtičnika" - LICENSING_SERVER_IS_UNAVAILABLE: "Naročniški strežnik ni dosegljiv" - LICENSING_DOMAIN_EXPIRED: "Naročnina na to domeno je potekla." - LICENSING_DOMAIN_BANNED: "Naročnina na to domeno ni dovoljena" - DEMO_SEND_MESSAGE_ERROR: "Iz varnostnih razlogov ta račun ne sme pošiljati pošte na zunanje e-naslove!" - DEMO_ACCOUNT_ERROR: "Iz varnostnih razlogov ta račun ne sme izvršiti tega dejanja!" - ACCOUNT_ALREADY_EXISTS: "Račun že obstaja" - ACCOUNT_DOES_NOT_EXIST: "Račun ne obstaja" - MAIL_SERVER_ERROR: "Napaka pri dostopu do poštnega strežnika" - INVALID_INPUT_ARGUMENT: "Neveljaven vhodni argument" - UNKNOWN_ERROR: "Neznana napaka" - STATIC: - BACK_LINK: "Ponovno naloži" - DOMAIN_LIST_DESC: "Seznam domen, na katere je dovoljen dostop" - PHP_EXSTENSIONS_ERROR_DESC: "Potrebne PHP razširitve niso omogočene v vaši PHP nastavitveni datoteki!" - PHP_VERSION_ERROR_DESC: "Vaša PHP verzija (%VERSION%) je manjša kot potrebna 5.3.0!" - NO_SCRIPT_TITLE: "Ta aplikacija potrebuje omogočen JavaScript." - NO_SCRIPT_DESC: | - Brskalnik nima podpore za JavaScript. - Omogočite JavaScript v brskalniku in poskusite znova. - NO_COOKIE_TITLE: "Ta aplikacije potrebuje omogočene piškotke." - NO_COOKIE_DESC: | - Brskalnik nima omogočenih piškotkov. - Omogočite piškotke v brskalniku in poskusite znova. - BAD_BROWSER_TITLE: "Brskalnik je zastarel." - BAD_BROWSER_DESC: | - Za uporabo vseh funkcij te aplikacije - prenesite in namestite enega od teh brskalnikov: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sv_SE.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sv_SE.yml deleted file mode 100755 index 28ef04d1..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/sv_SE.yml +++ /dev/null @@ -1,713 +0,0 @@ -sv_SE: - LOGIN: - LABEL_EMAIL: "Epost" - LABEL_LOGIN: "Användarnamn" - LABEL_PASSWORD: "Lösenord" - LABEL_SIGN_ME: "Kom ihåg mig" - LABEL_VERIFICATION_CODE: "Verifikationskod" - LABEL_DONT_ASK_VERIFICATION_CODE: "Fråga inte efter koden på 2 veckor" - BUTTON_SIGN_IN: "Logga in" - TITLE_SIGN_IN_GOOGLE: "Logga in med Google" - TITLE_SIGN_IN_FACEBOOK: "Logga in med Facebook" - TITLE_SIGN_IN_TWITTER: "Logga in med Twitter" - LABEL_FORGOT_PASSWORD: "Glömt lösenord" - LABEL_REGISTRATION: "Registrera" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Lägg till konto" - BUTTON_SETTINGS: "Inställningar" - BUTTON_HELP: "Hjälp" - BUTTON_LOGOUT: "Logga ut" - MOBILE: - BUTTON_MOBILE_VERSION: "Mobilversion" - BUTTON_DESKTOP_VERSION: "Datorversion" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Sök" - TITLE_ADV: "Avancerad sök" - LABEL_ADV_FROM: "Från" - LABEL_ADV_TO: "Till" - LABEL_ADV_SUBJECT: "Ämne" - LABEL_ADV_TEXT: "Text" - LABEL_ADV_HAS_ATTACHMENT: "Har bilaga" - LABEL_ADV_HAS_ATTACHMENTS: "Har bilagor" - LABEL_ADV_FLAGGED: "Flaggad" - LABEL_ADV_UNSEEN: "Oläst" - LABEL_ADV_DATE: "Datum" - LABEL_ADV_DATE_ALL: "Alla" - LABEL_ADV_DATE_3_DAYS: "Upp till 3 dagar gammalt" - LABEL_ADV_DATE_7_DAYS: "Upp till 1 vecka gammalt" - LABEL_ADV_DATE_MONTH: "Upp till 1 månad gammalt" - LABEL_ADV_DATE_3_MONTHS: "Upp till 3 månader gammalt" - LABEL_ADV_DATE_6_MONTHS: "Upp till 6 månader gammalt" - LABEL_ADV_DATE_YEAR: "Upp till 1 år gammalt" - BUTTON_ADV_SEARCH: "Sök" - PREVIEW_POPUP: - FULLSCREEN: "Växla fullskärmsläge" - ZOOM: "Zooma in/ut" - CLOSE: "Stäng (Esc)" - LOADING: "Laddar..." - GALLERY_PREV: "Föregående (Vänster pil knapp)" - GALLERY_NEXT: "Nästa (Höger pil knapp)" - GALLERY_COUNTER: "%curr% av %total%" - IMAGE_ERROR: "Bilden kunde inte laddas." - AJAX_ERROR: "Innehållet kunde inte laddas." - FOLDER_LIST: - BUTTON_COMPOSE: "Skriv nytt" - BUTTON_CONTACTS: "Kontakter" - BUTTON_NEW_MESSAGE: "Nytt meddelande" - INBOX_NAME: "Inkorg" - SENT_NAME: "Skickat" - DRAFTS_NAME: "Utkast" - SPAM_NAME: "Spam" - TRASH_NAME: "Papperskorg" - ARCHIVE_NAME: "Arkiv" - QUOTA: - TITLE: "Kvotanvändning" - MESSAGE_LIST: - BUTTON_RELOAD: "Ladda meddelandelista" - BUTTON_MOVE_TO: "Flytta till" - BUTTON_DELETE: "Ta bort" - BUTTON_ARCHIVE: "Arkivera" - BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Inte spam" - BUTTON_EMPTY_FOLDER: "Rensa mapp" - BUTTON_MULTY_FORWARD: "Vidarebefordra som bilaga(or)" - BUTTON_DELETE_WITHOUT_MOVE: "Ta bort permanent" - BUTTON_MORE: "Mera" - MENU_SET_SEEN: "Markera som läst" - MENU_SET_ALL_SEEN: "Markera alla som lästa" - MENU_UNSET_SEEN: "Markera som oläst" - MENU_SET_FLAG: "Flagga" - MENU_UNSET_FLAG: "Avflagga" - MENU_SELECT_ALL: "Alla" - MENU_SELECT_NONE: "Ingen" - MENU_SELECT_INVERT: "Vänd" - MENU_SELECT_UNSEEN: "Oläst" - MENU_SELECT_SEEN: "Läst" - MENU_SELECT_FLAGGED: "Flaggad" - MENU_SELECT_UNFLAGGED: "Avflaggad" - EMPTY_LIST: "Tom lista" - EMPTY_SEARCH_LIST: "Inga meddelanden matchar din sökning." - SEARCH_RESULT_FOR: "Sök resultat för \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "Tillbaka till meddelanden" - LIST_LOADING: "Laddar" - EMPTY_SUBJECT_TEXT: "(Inget ämne)" - PUT_MESSAGE_HERE: "Släpp meddelandet för att se det i listan" - TODAY_AT: "idag kl %TIME%" - YESTERDAY_AT: "igår kl %TIME%" - SEARCH_PLACEHOLDER: "Sök" - NEW_MESSAGE_NOTIFICATION: "Du har %COUNT% nya meddelanden!" - QUOTA_SIZE: "Använder %SIZE% (%PROC%%) av dina %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Redigera" - BUTTON_BACK: "Backa" - BUTTON_CLOSE: "Stäng" - BUTTON_DELETE: "Ta bort" - BUTTON_UNSUBSCRIBE: "Avprenumerera från denna lista" - BUTTON_ARCHIVE: "Arkivera" - BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Inte spam" - BUTTON_MOVE_TO: "Flytta till" - BUTTON_MORE: "Mera" - BUTTON_REPLY: "Svara" - BUTTON_REPLY_ALL: "Svara alla" - BUTTON_FORWARD: "Vidarebefordra" - BUTTON_FORWARD_AS_ATTACHMENT: "Vidarebefordra som bilaga" - BUTTON_EDIT_AS_NEW: "Redigera som nytt" - BUTTON_SHOW_IMAGES: "Visa yttre bilder" - BUTTON_NOTIFY_READ_RECEIPT: "Avsändaren vill ha kvitto när du läst detta meddelande." - BUTTON_IN_NEW_WINDOW: "Visa i separat fönster" - BUTTON_THREAD_LIST: "trådremsa" - BUTTON_THREAD_PREV: "Föregående" - BUTTON_THREAD_NEXT: "Nästa" - BUTTON_THREAD_MORE: "Mer meddelanden" - MENU_HEADERS: "Visa meddelanderubriker" - MENU_VIEW_ORIGINAL: "Visa källa" - MENU_DOWNLOAD_ORIGINAL: "Ladda ner som .eml fil" - MENU_FILTER_SIMILAR: "Filtrera meddelanden som detta" - MENU_PRINT: "Skriv ut" - EMPTY_SUBJECT_TEXT: "(Inget ämne)" - LABEL_SUBJECT: "Ämne" - LABEL_DATE: "Datum" - LABEL_FROM: "Från" - LABEL_FROM_SHORT: "från" - LABEL_TO: "Till" - LABEL_TO_SHORT: "till" - LABEL_CC: "CC" - LABEL_BCC: "BCC" - LABEL_REPLY_TO: "Svara-till" - PRINT_LABEL_FROM: "Från" - PRINT_LABEL_TO: "Till" - PRINT_LABEL_CC: "CC" - PRINT_LABEL_BCC: "BCC" - PRINT_LABEL_REPLY_TO: "Svara-till" - PRINT_LABEL_DATE: "Datum" - PRINT_LABEL_SUBJECT: "Ämne" - PRINT_LABEL_ATTACHMENTS: "Bilagor" - MESSAGE_LOADING: "Laddar" - MESSAGE_VIEW_DESC: "Välj meddelande i listan att visa här." - MESSAGE_VIEW_MOVE_DESC: "Klicka på mapp till vänster för att välja mål mapp." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Lösenord" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP-signerat meddelande (klicka för att verifiera)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP-krypterat meddelande (klicka för att dekryptera)" - LINK_DOWNLOAD_AS_ZIP: "Ladda ner som ZIP-fil" - LINK_SAVE_TO_OWNCLOUD: "Spara till ownCloud" - LINK_SAVE_TO_CLOUD: "Spara till Molnet" - LINK_SAVE_TO_DROPBOX: "Spara i Dropbox" - READ_RECEIPT: - SUBJECT: "Mottagar kvitto (visad) - %SUBJECT%" - BODY: | - Detta är ett kvitto på det meddelande du skickat till %READ-RECEIPT%. - - Notera: Detta kvitto säger bara att mottagaren öppnat meddelandet. - Det finns ingen garanti att mottagare vare sig läst eller förstått innehållet. - SUGGESTIONS: - SEARCHING_DESC: "Söker..." - CONTACTS: - LEGEND_CONTACTS: "Kontakter" - SEARCH_INPUT_PLACEHOLDER: "Sök" - BUTTON_ADD_CONTACT: "Lägg till" - BUTTON_CREATE_CONTACT: "Ny" - BUTTON_UPDATE_CONTACT: "Uppdatera" - BUTTON_IMPORT: "Importera (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Exportera (vcf, vCard)" - BUTTON_EXPORT_CSV: "Exportera (csv)" - ERROR_IMPORT_FILE: "Importfel (ogiltigt filformat)" - LIST_LOADING: "Laddar" - EMPTY_LIST: "Inga kontakter här" - EMPTY_SEARCH: "Inga kontakter funna" - CLEAR_SEARCH: "Nollställ sök" - CONTACT_VIEW_DESC: "Välj kontakt i listan för att visa här." - LABEL_DISPLAY_NAME: "Visnings namn" - LABEL_EMAIL: "Epost" - LABEL_PHONE: "Telefon" - LABEL_WEB: "Web" - LABEL_BIRTHDAY: "Födelsedag" - LINK_ADD_EMAIL: "Lägg till epostadress" - LINK_ADD_PHONE: "Lägg till telefonnummer" - LINK_BIRTHDAY: "Födelsedag" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Ange visningsnamn" - PLACEHOLDER_ENTER_LAST_NAME: "Ange efternamn" - PLACEHOLDER_ENTER_FIRST_NAME: "Ange förnamn" - PLACEHOLDER_ENTER_NICK_NAME: "Ange smeknamn" - LABEL_READ_ONLY: "Endast läs" - LABEL_SHARE: "Dela" - ADD_MENU_LABEL: "Lägg till..." - ADD_MENU_NICKNAME: "Smeknamn" - ADD_MENU_NOTES: "Anteckning" - ADD_MENU_EMAIL: "Epost" - ADD_MENU_PHONE: "Telefon" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Adress" - ADD_MENU_BIRTHDAY: "Födelsedag" - ADD_MENU_TAGS: "Taggar" - BUTTON_SHARE_NONE: "Ingen" - BUTTON_SHARE_ALL: "Alla" - BUTTON_SYNC: "Synkronisering (CardDAV)" - COMPOSE: - TITLE_FROM: "Från" - TITLE_TO: "Till" - TITLE_CC: "CC" - TITLE_BCC: "BCC" - TITLE_REPLY_TO: "Svara-till" - TITLE_SUBJECT: "Ämne" - LINK_SHOW_INPUTS: "visa alla fält" - BUTTON_SEND: "Skicka" - BUTTON_SAVE: "Spara" - BUTTON_DELETE: "Ta bort" - BUTTON_CANCEL: "Avbryt" - BUTTON_MINIMIZE: "Minimera" - SAVED_TIME: "Sparat kl %TIME%" - SAVED_ERROR_ON_SEND: "Meddelandet skickat men inte sparat i skickat-mappen" - DISCARD_UNSAVED_DATA: "Kasta osparade data?" - ATTACH_FILES: "Bifoga filer" - ATTACH_DROP_FILES_DESC: "Släpp filer här" - ATTACH_ITEM_CANCEL: "Avbryt" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% skrev" - FORWARD_MESSAGE_TOP_TITLE: "-------- Vidarebefordrat -------" - FORWARD_MESSAGE_TOP_FROM: "Från" - FORWARD_MESSAGE_TOP_TO: "Till" - FORWARD_MESSAGE_TOP_CC: "CC" - FORWARD_MESSAGE_TOP_SENT: "Skickat" - FORWARD_MESSAGE_TOP_SUBJECT: "Ämne" - EMPTY_TO_ERROR_DESC: "Ange minst en mottagare" - NO_ATTACHMENTS_HERE_DESC: "Inga filer är ännu valda" - ATTACHMENTS_ERROR_DESC: "Varning! Inte alla bilagor har överförts." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Alla bilagor är inte uppladddade än" - BUTTON_REQUEST_READ_RECEIPT: "Begär mottagningskvitto" - BUTTON_MARK_AS_IMPORTANT: "Markera som viktigt" - BUTTON_OPEN_PGP: "OpenPGP (Endast enkel text)" - BUTTON_REQUEST_DSN: "Begär ett leveranskvitto" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Stäng" - POPUPS_ASK: - BUTTON_YES: "Ja" - BUTTON_NO: "Nej" - DESC_WANT_CLOSE_THIS_WINDOW: "Vill du stänga detta fönster?" - DESC_WANT_DELETE_MESSAGES: "Är du säker att du vill ta bort meddelandet?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Välj språk" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Lägg till konto?" - BUTTON_ADD_ACCOUNT: "Lägg till" - TITLE_UPDATE_ACCOUNT: "Uppdatera konto?" - BUTTON_UPDATE_ACCOUNT: "Uppdatera" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Lägg till identitet" - TITLE_UPDATE_IDENTITY: "Uppdatera identitet" - BUTTON_ADD_IDENTITY: "Lägg till" - BUTTON_UPDATE_IDENTITY: "Uppdatera" - LABEL_EMAIL: "Epost" - LABEL_NAME: "Namn" - LABEL_REPLY_TO: "Svara-till" - LABEL_SIGNATURE: "Signatur" - LABEL_CC: "Cc" - LABEL_BCC: "Bcc" - LABEL_SIGNATURE_INSERT_BEFORE: "Sätt denna signatur före citerad text i svar" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Skapa mapp?" - LABEL_NAME: "Mappnamn" - LABEL_PARENT: "Överliggande mapp" - BUTTON_CREATE: "Skapa" - BUTTON_CANCEL: "Avbryt" - BUTTON_CLOSE: "Stäng" - TITLE_CREATING_PROCESS: "Skapar mapp" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Rensa alla meddelanden i mappen?" - BUTTON_CLEAR: "Rensa" - BUTTON_CANCEL: "Avbryt" - BUTTON_CLOSE: "Stäng" - DANGER_DESC_WARNING: "Varning!" - DANGER_DESC_HTML_1: "Denna åtgärd kommer att rensa alla mail i %FOLDER%." - DANGER_DESC_HTML_2: "När detta är startat kan det inte avbrytas." - TITLE_CLEARING_PROCESS: "Rensar mappen..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Import av OpenPGP-nyckel" - BUTTON_IMPORT_OPEN_PGP_KEY: "Importera" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Visa OpenPGP-nyckel" - BUTTON_SELECT: "Välj" - BUTTON_CLOSE: "Stäng" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Skapa OpenPGP-nycklar" - LABEL_EMAIL: "Epost" - LABEL_NAME: "Namn" - LABEL_PASSWORD: "Lösenord" - LABEL_KEY_BIT_LENGTH: "Nyckellängd" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Skapa" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP signera/kryptera" - LABEL_SIGN: "Signera" - LABEL_ENCRYPT: "Kryptera" - LABEL_PASSWORD: "Lösenord" - BUTTON_SIGN: "Singera" - BUTTON_ENCRYPT: "Kryptera" - BUTTON_SIGN_AND_ENCRYPT: "Signera och kryptera" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP avkryptera" - LABEL_KEY: "Privat Key" - LABEL_PASSWORD: "Lösenord" - BUTTON_DECRYPT: "Avkryptera" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "Tvåstegsverifieringstest" - LABEL_CODE: "Kod" - BUTTON_TEST: "Test" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Skapa ett filter?" - TITLE_EDIT_FILTER: "Uppdatera filter?" - FILTER_NAME: "Namn" - LEGEND_CONDITIONS: "Villkor" - LEGEND_ACTIONS: "Handlingar" - BUTTON_DONE: "Klar" - BUTTON_ADD_CONDITION: "Lägg till ett villkor" - SELECT_ACTION_NONE: "Inget" - SELECT_ACTION_MOVE_TO: "Flytta till" - SELECT_ACTION_FORWARD_TO: "Vidarebefordra till" - SELECT_ACTION_REJECT: "Avvisa" - SELECT_ACTION_VACATION_MESSAGE: "Autosvar" - SELECT_ACTION_DISCARD: "Ta bort" - SELECT_FIELD_FROM: "Från" - SELECT_FIELD_RECIPIENTS: "Mottagare (Till eller CC)" - SELECT_FIELD_SUBJECT: "Rubrik" - SELECT_FIELD_HEADER: "Rubrik" - SELECT_FIELD_SIZE: "Storlek" - SELECT_TYPE_CONTAINS: "innehåller" - SELECT_TYPE_NOT_CONTAINS: "innehåller inte" - SELECT_TYPE_MATCHES: "Matchar (* och ? stöds)" - SELECT_TYPE_NOT_MATCHES: "Matchar inte (* och ? stöds)" - SELECT_TYPE_REGEXP: "regexp" - SELECT_TYPE_NOT_REGEXP: "inte regexp" - SELECT_TYPE_EQUAL_TO: "lika med" - SELECT_TYPE_NOT_EQUAL_TO: "inte lika med" - SELECT_TYPE_OVER: "över" - SELECT_TYPE_UNDER: "under" - SELECT_MATCH_ANY: "Matcha någon av följande regler" - SELECT_MATCH_ALL: "Matcha samtliga av följande regler" - MARK_AS_READ_LABEL: "Markera som läst" - REPLY_INTERVAL_LABEL: "Svarsintervall (dagar)" - KEEP_LABEL: "Behåll" - STOP_LABEL: "Sluta inte bearbeta andra regler" - EMAIL_LABEL: "Epost" - VACATION_SUBJECT_LABEL: "Ämne (valfritt)" - VACATION_MESSAGE_LABEL: "Meddelande" - VACATION_RECIPIENTS_LABEL: "Mottagare (kommaseparerade)" - REJECT_MESSAGE_LABEL: "meddelande" - ALL_INCOMING_MESSAGES_DESC: "Alla inkommande meddelanden" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Välj systemmappar" - SELECT_CHOOSE_ONE: "Välj en" - SELECT_UNUSE_NAME: "Använd inte" - LABEL_SENT: "Skickat" - LABEL_DRAFTS: "Utkast" - LABEL_SPAM: "Spam" - LABEL_TRASH: "Papperskorg" - LABEL_ARCHIVE: "Arkiv" - BUTTON_CANCEL: "Avbryt" - BUTTON_CLOSE: "Stäng" - NOTIFICATION_SENT: | - Du har inte valt "Skickat" systemmapp, där skickade meddelande ska sparas. - Om du inte vill spara skickade meddelanden, välj då "Använd inte" valet. - NOTIFICATION_DRAFTS: "Du har inte valt \"Drafts\" systemmapp, där meddelanden sparas medan det skrivs." - NOTIFICATION_SPAM: | - Du har inte valt "Spam"-systemmapp, där spam-meddelanden ska sparas. - Om du vill ta bort meddelanden permanent, välj då "Använd inte"-valet. - NOTIFICATION_TRASH: | - Du har inte valt "Papperskorg" systemmapp, där borttagna meddelanden ska sparas. - Om du vill ta meddelanden permanent, väl då "Använd inte" valet. - NOTIFICATION_ARCHIVE: "Du har inte valt \"Arkiv\" systemmapp, där arkiverade meddelanden ska läggas." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "Tvåstegsverifiering (TOTP)" - LABEL_ENABLE_TWO_FACTOR: "Aktivera tvåstegsverifiering" - LABEL_TWO_FACTOR_USER: "Användare" - LABEL_TWO_FACTOR_STATUS: "Status" - LABEL_TWO_FACTOR_SECRET: "Hemlig kod" - LABEL_TWO_FACTOR_BACKUP_CODES: "Backupkoder" - BUTTON_CREATE: "Skapa ny hemlig kod" - BUTTON_ACTIVATE: "Aktivera" - BUTTON_CLEAR: "Rensa" - BUTTON_LOGOUT: "Logga ut" - BUTTON_DONE: "Klar" - BUTTON_TEST: "Testa" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Visa hemlig kod" - BUTTON_HIDE_SECRET: "Göm hemlig kod" - TWO_FACTOR_REQUIRE_DESC: "Ditt konto kräver tvåstegsverifiering." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Konfigurerad" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Inte konfigurarad" - TWO_FACTOR_SECRET_DESC: >- - Importera denna information till din Google Authenticator klient (eller annan - TOTP klient) med denna QR kod eller manuellt med koden här nedan. - TWO_FACTOR_BACKUP_CODES_DESC: >- - Om du inte kan ta emot koderna med Google Authenticator, så använd backupkoderna - för att logga in. När du använt backupkoderna för att logga in så blir dom - inaktiva. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Du kan inte ändra denna inställning innan test." - TITLES: - LOADING: "Laddar" - LOGIN: "Logga in" - MAILBOX: "Brevlåda" - SETTINGS: "Inställningar" - COMPOSE: "Skriv" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Filen är för stor" - ERROR_FILE_PARTIALLY_UPLOADED: "Filen blev delvis uppladdad av okänd anledning" - ERROR_NO_FILE_UPLOADED: "Ingen fil uppladdad" - ERROR_MISSING_TEMP_FOLDER: "Den temporära filen saknas" - ERROR_ON_SAVING_FILE: "Okänt uppladdingsfel" - ERROR_FILE_TYPE: "Ogiltig filtyp" - ERROR_UNKNOWN: "Okänt uppladdingsfel" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" - TEXT_SWITCHER_RICH_FORMATTING: "HTML-formatering" - TEXT_SWITCHER_CONFIRM: "Textformatering och bilder kommer att försvinna. Vill du fortsätta?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Personligt" - LABEL_GENERAL_NAME: "Allmänt" - LABEL_CONTACTS_NAME: "Kontakter" - LABEL_FOLDERS_NAME: "Mappar" - LABEL_ACCOUNTS_NAME: "Konton" - LABEL_IDENTITY_NAME: "Identitet" - LABEL_IDENTITIES_NAME: "Identiteter" - LABEL_FILTERS_NAME: "Filter" - LABEL_TEMPLATES_NAME: "Templates" - LABEL_SECURITY_NAME: "Säkerhet" - LABEL_SOCIAL_NAME: "Socialt" - LABEL_THEMES_NAME: "Teman" - LABEL_CHANGE_PASSWORD_NAME: "Lösenord" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Tillbaka" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filter" - BUTTON_SAVE: "Spara" - BUTTON_ADD_FILTER: "Lägg till filter" - BUTTON_DELETE: "Ta bort" - BUTTON_RAW_SCRIPT: "Använd anpassat användarscript" - SUBNAME_NONE: "Ingen" - SUBNAME_MOVE_TO: "Flytta till \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Vidarebefordra till \"%EMAIL%\"" - SUBNAME_REJECT: "Avvisa" - SUBNAME_VACATION_MESSAGE: "semestermeddelande" - SUBNAME_DISCARD: "Kassera" - CAPABILITY_LABEL: "Förmåga" - LOADING_PROCESS: "Uppdaterar filter listan" - DELETING_ASK: "Är du säker?" - CHACHES_NEED_TO_BE_SAVED_DESC: "Dessa förändringar måste sparas på servern." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identitet" - LABEL_DISPLAY_NAME: "Namn" - LABEL_REPLY_TO: "Svara-till" - LABEL_SIGNATURE: "Signatur" - LABEL_ADD_SIGNATURE_TO_ALL: "Lägg till din signatur på alla utgående meddelanden." - SETTINGS_SECURITY: - LEGEND_SECURITY: "Säkerhet" - LABEL_CONFIGURE_TWO_FACTOR: "Konfigurera tvåstegsverifiering" - LABEL_AUTOLOGOUT: "Automatisk utloggning" - AUTOLOGIN_NEVER_OPTION_NAME: "Aldrig" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minut(er)" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% timme/timmar" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Allmänt" - LABEL_LANGUAGE: "Språk" - LABEL_IDENTITY: "Identitet" - LABEL_LAYOUT: "Stil" - LABEL_LAYOUT_NO_SPLIT: "Utan delad vy" - LABEL_LAYOUT_VERTICAL_SPLIT: "Vertikalt delad vy" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horisontellt delad vy" - LABEL_EDITOR: "Textredigerare" - LABEL_EDITOR_HTML: "HTML" - LABEL_EDITOR_PLAIN: "Oformaterad text" - LABEL_EDITOR_HTML_FORCED: "HTML (tvinga)" - LABEL_EDITOR_PLAIN_FORCED: "Oformaterad text (tvinga)" - LABEL_ANIMATION: "Animerat utseende" - LABEL_ANIMATION_FULL: "Full" - LABEL_ANIMATION_NORMAL: "Normal" - LABEL_ANIMATION_NONE: "Ingen" - LABEL_VIEW_OPTIONS: "Visa alternativ" - LABEL_USE_PREVIEW_PANE: "Avänd förhandsgranskningsfönster" - LABEL_USE_CHECKBOXES_IN_LIST: "Visa kryssrutor i listan" - LABEL_USE_THREADS: "Använd trådar" - LABEL_REPLY_SAME_FOLDER: "Placera svar i samma mapp som mottagna meddelandet" - LABEL_SHOW_IMAGES: "Visa alltid bilder i mail" - LABEL_SHOW_ANIMATION: "Visa animeringar" - LABEL_MESSAGE_PER_PAGE: "Meddelanden per sida" - LABEL_NOTIFICATIONS: "Aviseringar" - LABEL_SOUND_NOTIFICATION: "Ljudnotifikation" - LABEL_CHROME_NOTIFICATION_DESC: "Visa nya meddelande-aviseringar som popup-fönster" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Blockat av webbläsaren)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Kontakter" - LABEL_CONTACTS_AUTOSAVE: "Lägg till mottagare automatiskt i din adressbok" - LEGEND_CONTACTS_SYNC: "Fjärrsynkronisering (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Aktivera fjärrsynkronisering" - LABEL_CONTACTS_SYNC_SERVER: "Server" - LABEL_CONTACTS_SYNC_AB_URL: "Adressboks-URL" - LABEL_CONTACTS_SYNC_USER: "Användare" - LABEL_CONTACTS_SYNC_PASSWORD: "Lösenord" - SETTINGS_THEMES: - LEGEND_THEMES: "Teman" - LEGEND_THEMES_CUSTOM: "Anpassad temakonfiguration" - LABEL_CUSTOM_TYPE: "Typ" - LABEL_CUSTOM_TYPE_LIGHT: "Ljus" - LABEL_CUSTOM_TYPE_DARK: "Mörk" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Bakgrund" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Ladda upp bakgrundsbild (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "Filen är för stor" - ERROR_FILE_TYPE_ERROR: "Ogiltig fil typ (endast JPG och PNG)" - ERROR_UNKNOWN: "Okänt uppladdingsfel" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Anslut till Google" - BUTTON_GOOGLE_DISCONNECT: "Koppla från Google" - MAIN_GOOGLE_DESC: "Efter aktivering av Googleinloggning, kan du logga in på detta konto med Google-knappen på inloggningssidan." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Anslut till Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Koppla från Facebook" - MAIN_FACEBOOK_DESC: "Efter aktivering av Facebookinloggning, kan du logga in på detta konto med Facebook-knappen på inloggningssidan." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Anslut till Twitter" - BUTTON_TWITTER_DISCONNECT: "Koppla från Twitter" - MAIN_TWITTER_DESC: "Efter aktivering av Twitterinloggning, kan du logga in på detta konto med Twitterknappen på inloggningssidan." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Mapplista" - BUTTON_CREATE: "Skapa mapp" - BUTTON_SYSTEM: "Systemmappar" - BUTTON_DELETE: "Ta bort" - BUTTON_SUBSCRIBE: "Prenumerera" - BUTTON_UNSUBSCRIBE: "Avprenumerera" - LOADING_PROCESS: "Uppdaterar mapplista" - CREATING_PROCESS: "Skapar en mapp" - DELETING_PROCESS: "Ta bort en mapp" - RENAMING_PROCESS: "Byter namn på en mapp" - DELETING_ASK: "Är du säker?" - TO_MANY_FOLDERS_DESC_1: "Du har för många mappar" - TO_MANY_FOLDERS_DESC_2: "Vi har visat endast en del av dem, för att undvika prestandaproblem." - HELP_DELETE_FOLDER: "Ta bort mapp" - HELP_SHOW_HIDE_FOLDER: "Visa/dölj mapp" - HELP_CHECK_FOR_NEW_MESSAGES: "Kontrollera/inte söka efter nya meddelanden" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Kontolista" - LEGEND_IDENTITIES: "Indentiteter" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Konton och identiteter" - BUTTON_ADD_ACCOUNT: "Lägg till konto" - BUTTON_ADD_IDENTITY: "Lägg till identitet" - BUTTON_DELETE: "Ta bort" - LOADING_PROCESS: "Uppdaterar kontolista" - DELETING_ASK: "Är du säker?" - DEFAULT_IDENTITY_LABEL: "standard" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identitet" - LEGEND_IDENTITIES: "Ytterligare identiteter" - LABEL_DEFAULT: "Standard" - LABEL_DISPLAY_NAME: "Namn" - LABEL_REPLY_TO: "Svara-till" - LABEL_SIGNATURE: "Signatur" - LABEL_ADD_SIGNATURE_TO_ALL: "Lägg till din signatur på alla utgående meddelanden." - BUTTON_ADD_IDENTITY: "Lägg till identitet" - BUTTON_DELETE: "Ta bort" - LOADING_PROCESS: "Uppdaterar identitetslistan" - DELETING_ASK: "Är du säker?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Ändra lösenord" - LABEL_CURRENT_PASSWORD: "Nuvarande lösenord" - LABEL_NEW_PASSWORD: "Nytt lösenord" - LABEL_REPEAT_PASSWORD: "Bekräfta nytt lösenord" - BUTTON_UPDATE_PASSWORD: "Byt lösenord" - ERROR_PASSWORD_MISMATCH: "Lösenorden matchar inte, vänligen försök igen" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Importera OpenPGP-nyckel" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Skapa OpenPGP-nycklar" - TITLE_PRIVATE: "Privat" - TITLE_PUBLIC: "Publik" - DELETING_ASK: "Är du säker?" - GENERATE_ONLY_HTTPS: "Endast HTTPS" - LABEL_ALLOW_DRAFT_AUTOSAVE: "Spara utkast automatiskt" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Tangentbordsgenvägar hjälp" - TAB_MAILBOX: "Inkorg" - TAB_MESSAGE_LIST: "Meddelandelista" - TAB_MESSAGE_VIEW: "Meddelandevy" - TAB_COMPOSE: "Skapa" - LABEL_OPEN_USER_DROPDOWN: "Öppna användarval" - LABEL_REPLY: "Svara" - LABEL_REPLY_ALL: "Svara alla" - LABEL_FORWARD: "Vidarebefordra" - LABEL_FORWARD_MULTIPLY: "Vidarebefordra som bilaga(or)" - LABEL_HELP: "Hjälp" - LABEL_CHECK_ALL: "Kontrollera alla meddelanden" - LABEL_ARCHIVE: "Arkiv" - LABEL_DELETE: "Ta bort" - LABEL_OPEN_THREAD: "Öppna valda trådar" - LABEL_MOVE: "Flytta" - LABEL_READ: "Markera valda meddelanden som lästa" - LABEL_UNREAD: "Markera valda meddelanden som olästa" - LABEL_IMPORTANT: "Markera valda meddelanden som viktigt" - LABEL_SEARCH: "Sök" - LABEL_CANCEL_SEARCH: "Avbryt sökning" - LABEL_FULLSCREEN_ENTER: "Fullskärm (förhandsgranskningslayout)" - LABEL_VIEW_MESSAGE_ENTER: "Visa meddelande (ingen förhandsgranskningslayout)" - LABEL_SWITCH_TO_MESSAGE: "Flytta fokus till valda meddelande" - LABEL_SWITCH_TO_FOLDER_LIST: "Flytta fokus till mapplistan" - LABEL_FULLSCREEN_TOGGLE: "Växla fullskärmsläge" - LABEL_BLOCKQUOTES_TOGGLE: "Växla meddelandecitat" - LABEL_THREAD_NEXT: "Nästa meddelande i tråden" - LABEL_THREAD_PREV: "Föregående meddelande i tråden" - LABEL_PRINT: "Skriv ut" - LABEL_EXIT_FULLSCREEN: "Avsluta fullskärmsläge" - LABEL_CLOSE_MESSAGE: "Stäng meddelande (ingen förhandsgranskningslayout)" - LABEL_SWITCH_TO_LIST: "Växla fokus tillbaka till meddelandelistan" - LABEL_OPEN_COMPOSE_POPUP: "Öppna skrivfönster" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimera skrivfönster" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Öppna identitetsval" - LABEL_SAVE_MESSAGE: "Spara meddelande" - LABEL_SEND_MESSAGE: "Skicka meddelande" - LABEL_CLOSE_COMPOSE: "Stäng fönster" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "Inga publika nycklar funna" - NO_PUBLIC_KEYS_FOUND_FOR: "Inga publika nycklar funna för \"%EMAIL%\" epost" - NO_PRIVATE_KEY_FOUND: "Inga privata nycklar funna" - NO_PRIVATE_KEY_FOUND_FOR: "Inga privata nycklar funna för \"%EMAIL%\" epost" - ADD_A_PUBLICK_KEY: "Lägg till en publicerad nyckel" - SELECT_A_PRIVATE_KEY: "Välj en privat nyckel" - UNVERIFIRED_SIGNATURE: "Overifierad signatur" - DECRYPTION_ERROR: "OpenPGP dekrypteringsfel" - GOOD_SIGNATURE: "Godkänd signatur för %USER%" - PGP_ERROR: "OpenPGP-fel: %ERROR%" - SPECIFY_FROM_EMAIL: "Ange FRÅN epost adress" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Ange minst en mottagare" - NOTIFICATIONS: - INVALID_TOKEN: "Ogiltigt tecken" - AUTH_ERROR: "Autentisering misslyckades" - ACCESS_ERROR: "Åtkomstfel" - CONNECTION_ERROR: "Kan inte ansluta till servern" - CAPTCHA_ERROR: "Felaktig CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- - Detta ID är inte tilldelat något epost konto än. Logga in med epost uppgifter - och aktivera detta i konto inställningarna. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- - Detta ID är inte tilldelat något epost konto än. Logga in med epost uppgifter - och aktivera detta i konto inställningarna. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- - Detta ID är inte tilldelat något epost konto än. Logga in med epost uppgifter - och aktivera detta i konto inställningarna. - DOMAIN_NOT_ALLOWED: "Domän är inte tillåtet" - ACCOUNT_NOT_ALLOWED: "Konto är inte tillåtet" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Tvåstegsverifiering krävs" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Tvåstegsverifieringsfel" - COULD_NOT_SAVE_NEW_PASSWORD: "Kunde inte spara lösenord" - CURRENT_PASSWORD_INCORRECT: "Nuvarande lösenord är felaktigt" - NEW_PASSWORD_SHORT: "Lösenordet är för kort" - NEW_PASSWORD_WEAK: "Lösenordet är för enkelt" - NEW_PASSWORD_FORBIDDENT: "Lösenordet innehåller ogiltiga tecken" - CONTACTS_SYNC_ERROR: "Kontakt-synkroniseringsfel" - CANT_GET_MESSAGE_LIST: "Kan inte hämta meddelandelista" - CANT_GET_MESSAGE: "Kan inte hämta meddelande" - CANT_DELETE_MESSAGE: "Kan inte ta bort meddelande" - CANT_MOVE_MESSAGE: "Kan inte flytta meddelande" - CANT_SAVE_MESSAGE: "Kan inte spara meddelande" - CANT_SEND_MESSAGE: "Kan inte skicka meddelande" - INVALID_RECIPIENTS: "Ogiltig mottagare" - CANT_SAVE_FILTERS: "Kan inte spara filter" - CANT_GET_FILTERS: "Kan inte ta emot filter" - FILTERS_ARE_NOT_CORRECT: "Filter är inte korrekt" - CANT_CREATE_FOLDER: "Kan inte skapa mapp" - CANT_RENAME_FOLDER: "Kan inte byta namn på mapp" - CANT_DELETE_FOLDER: "Kan inte ta bort mapp" - CANT_DELETE_NON_EMPTY_FOLDER: "Kan inte ta bort mapp med innehåll" - CANT_SUBSCRIBE_FOLDER: "Kan inte prenumerera på mapp" - CANT_UNSUBSCRIBE_FOLDER: "Kan inte avprenumerera på mapp" - CANT_SAVE_SETTINGS: "Kan inte spara inställningarna" - CANT_SAVE_PLUGIN_SETTINGS: "Kan inte spara inställningarna" - DOMAIN_ALREADY_EXISTS: "Domänen finns redan" - CANT_INSTALL_PACKAGE: "Misslyckades att installera paket" - CANT_DELETE_PACKAGE: "Misslyckades ta bort paket" - INVALID_PLUGIN_PACKAGE: "Ogiltigt pluginpaket" - UNSUPPORTED_PLUGIN_PACKAGE: "Inget stöd för detta pluginpaket" - LICENSING_SERVER_IS_UNAVAILABLE: "Prenumerationsserver inte tillgänglig" - LICENSING_DOMAIN_EXPIRED: "Prenumeration för denna domän har gått ut." - LICENSING_DOMAIN_BANNED: "Prenumeration för denna domän är bannad." - DEMO_SEND_MESSAGE_ERROR: "Av säkerhets skäl kan inte detta demo-konto skicka epost till externa adressater!" - DEMO_ACCOUNT_ERROR: "Av säkerhetsskäl är det här kontot inte tillåtet för denna åtgärd!" - ACCOUNT_ALREADY_EXISTS: "Kontot finns redan" - ACCOUNT_DOES_NOT_EXIST: "Kontot finns inte" - MAIL_SERVER_ERROR: "Ett fel har inträffat vid anslutning till epostservern" - INVALID_INPUT_ARGUMENT: "Ogiltigt argument" - UNKNOWN_ERROR: "Okänt fel" - STATIC: - BACK_LINK: "Ladda om" - DOMAIN_LIST_DESC: "Lista över domän(er) som webbmailen har åtkomst till." - PHP_EXSTENSIONS_ERROR_DESC: "Erfodrade PHP-tillägg finns inte i PHP konfigurationen!" - PHP_VERSION_ERROR_DESC: "Din PHP version (%VERSION%) uppfyller inte kravet på 5.3.0!" - NO_SCRIPT_TITLE: "JavaScript krävs för denna applikation." - NO_SCRIPT_DESC: | - JavaScript är inte tillgängligt i webb läsaren. - Aktivera JavaScript stöd och försök igen. - NO_COOKIE_TITLE: "Kakstöd krävs för denna applikation." - NO_COOKIE_DESC: | - Kakstöd är inte tillgängligt i webbläsaren. - Aktivera kakstöd och försök igen. - BAD_BROWSER_TITLE: "Webbläsaren är för gammal." - BAD_BROWSER_DESC: | - För att använda funktioner i denna applikation, - ladda ner och installera någon av följande webbläsare: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/tr_TR.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/tr_TR.yml deleted file mode 100755 index 23ac4509..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/tr_TR.yml +++ /dev/null @@ -1,710 +0,0 @@ -tr_TR: - LOGIN: - LABEL_EMAIL: "E-Posta" - LABEL_LOGIN: "Giriş" - LABEL_PASSWORD: "Şifre" - LABEL_SIGN_ME: "Beni Hatırla" - LABEL_VERIFICATION_CODE: "Doğrulama Kodu" - LABEL_DONT_ASK_VERIFICATION_CODE: "2 hafta boyunca kodu sormayın" - BUTTON_SIGN_IN: "Giriş Yap" - TITLE_SIGN_IN_GOOGLE: "Google İle Giriş Yap" - TITLE_SIGN_IN_FACEBOOK: "Facebook ile Giriş yap" - TITLE_SIGN_IN_TWITTER: "Twitter İle Giriş Yap" - LABEL_FORGOT_PASSWORD: "Şifremi Unuttum" - LABEL_REGISTRATION: "Registration" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Hesap Ekle" - BUTTON_SETTINGS: "Ayarlar" - BUTTON_HELP: "Yardım" - BUTTON_LOGOUT: "Çıkış" - MOBILE: - BUTTON_MOBILE_VERSION: "Mobil versiyonu" - BUTTON_DESKTOP_VERSION: "Masaüstü versiyonu" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Arama" - TITLE_ADV: "Detaylı Arama" - LABEL_ADV_FROM: "Kimden" - LABEL_ADV_TO: "Kime" - LABEL_ADV_SUBJECT: "Konu" - LABEL_ADV_TEXT: "Metin" - LABEL_ADV_HAS_ATTACHMENT: "Eki" - LABEL_ADV_HAS_ATTACHMENTS: "Ekleri" - LABEL_ADV_FLAGGED: "İşaretli" - LABEL_ADV_UNSEEN: "Görünmeyen" - LABEL_ADV_DATE: "Tarih" - LABEL_ADV_DATE_ALL: "Hepsi" - LABEL_ADV_DATE_3_DAYS: "3 gün önceki" - LABEL_ADV_DATE_7_DAYS: "1 hafta önceki" - LABEL_ADV_DATE_MONTH: "1 ay önceki" - LABEL_ADV_DATE_3_MONTHS: "3 ay önceki" - LABEL_ADV_DATE_6_MONTHS: "6 ay önceki" - LABEL_ADV_DATE_YEAR: "1 yıl önceki" - BUTTON_ADV_SEARCH: "Arama" - PREVIEW_POPUP: - FULLSCREEN: "Toggle fullscreen" - ZOOM: "Yakınlaştır/Uzaklaştır" - CLOSE: "Kapat (Esc)" - LOADING: "Yükleniyor..." - GALLERY_PREV: "Önceki (Sol yön tuşu)" - GALLERY_NEXT: "Sonraki (Sağ yön tuşu)" - GALLERY_COUNTER: "%curr% of %total%" - IMAGE_ERROR: "Bu resim yüklenemedi." - AJAX_ERROR: "Bu içerik yüklenemedi." - FOLDER_LIST: - BUTTON_COMPOSE: "Yaz" - BUTTON_CONTACTS: "Kişi Listesi" - BUTTON_NEW_MESSAGE: "Yeni Mesaj" - INBOX_NAME: "Gelen Kutusu" - SENT_NAME: "Gönderilen" - DRAFTS_NAME: "Taslaklar" - SPAM_NAME: "Spam" - TRASH_NAME: "Çöp Kutusu" - ARCHIVE_NAME: "Arşiv" - QUOTA: - TITLE: "Kota Kullanımı" - MESSAGE_LIST: - BUTTON_RELOAD: "Mesaj Listesini Yenile" - BUTTON_MOVE_TO: "Taşı" - BUTTON_DELETE: "Sil" - BUTTON_ARCHIVE: "Arşiv" - BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Spam Değil" - BUTTON_EMPTY_FOLDER: "Klasörü temizle" - BUTTON_MULTY_FORWARD: "Mesajları İlet" - BUTTON_DELETE_WITHOUT_MOVE: "Kalıcı olarak sil" - BUTTON_MORE: "devamı" - MENU_SET_SEEN: "Okundu olarak işaretle" - MENU_SET_ALL_SEEN: "Tümünü okundu olarak işaretle" - MENU_UNSET_SEEN: "Okunmadı olarak işaretle" - MENU_SET_FLAG: "İşaretle" - MENU_UNSET_FLAG: "İşaretleme" - MENU_SELECT_ALL: "Tümü" - MENU_SELECT_NONE: "Hiçbiri" - MENU_SELECT_INVERT: "Invert" - MENU_SELECT_UNSEEN: "Okunmamış" - MENU_SELECT_SEEN: "Oku" - MENU_SELECT_FLAGGED: "İşaretlenmiş" - MENU_SELECT_UNFLAGGED: "İşaretlenmemiş" - EMPTY_LIST: "Herhangi Bir Sonuç Bulunamadı." - EMPTY_SEARCH_LIST: "Arama sonuçlarına uyan herhangi bir mesaj bulunamadı." - SEARCH_RESULT_FOR: "\"%SEARCH%\" için arama sonuçları" - BACK_TO_MESSAGE_LIST: "mesaj listesine geri dön" - LIST_LOADING: "Yükleniyor" - EMPTY_SUBJECT_TEXT: "(Konu Yok)" - PUT_MESSAGE_HERE: "Listede görüntülemek istediğiniz mesajı buraya sürükleyin." - TODAY_AT: "bugün %TIME%" - YESTERDAY_AT: "dün %TIME%" - SEARCH_PLACEHOLDER: "Arama" - NEW_MESSAGE_NOTIFICATION: "Toplam %COUNT% yeni mesajınız var!" - QUOTA_SIZE: "Size ayrılan %LIMIT%'dan %SIZE% (%PROC%%) kullanıyorsunuz" - MESSAGE: - BUTTON_EDIT: "Düzenle" - BUTTON_BACK: "Geri" - BUTTON_CLOSE: "Kapat" - BUTTON_DELETE: "Sil" - BUTTON_UNSUBSCRIBE: "Bu listeden aboneliği sonlandir" - BUTTON_ARCHIVE: "Arşiv" - BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Spam Değil" - BUTTON_MOVE_TO: "Taşı" - BUTTON_MORE: "More" - BUTTON_REPLY: "Yanıtla" - BUTTON_REPLY_ALL: "Tümünü Yanıtla" - BUTTON_FORWARD: "Yönlendir" - BUTTON_FORWARD_AS_ATTACHMENT: "Tümünü Yönlendir(ekler dahil)" - BUTTON_EDIT_AS_NEW: "Düzenle ve yeni" - BUTTON_SHOW_IMAGES: "Resimleri görüntüle" - BUTTON_NOTIFY_READ_RECEIPT: "Gönderen, bu mesaj için okundu onayı istedi." - BUTTON_IN_NEW_WINDOW: "Ayrı bir pencerede görüntüle" - BUTTON_THREAD_LIST: "Thread list" - BUTTON_THREAD_PREV: "Önceki" - BUTTON_THREAD_NEXT: "Sonraki" - BUTTON_THREAD_MORE: "More messages" - MENU_HEADERS: "İleti başlıklarını göster" - MENU_VIEW_ORIGINAL: "Kaynağı görüntüle" - MENU_DOWNLOAD_ORIGINAL: ".eml dosyası olarak indir" - MENU_FILTER_SIMILAR: "Bunun gibi iletileri filtrele" - MENU_PRINT: "yazdır" - EMPTY_SUBJECT_TEXT: "(Konu Yok)" - LABEL_SUBJECT: "Konu" - LABEL_DATE: "Tarih" - LABEL_FROM: "Kimden" - LABEL_FROM_SHORT: "kimden" - LABEL_TO: "Kime" - LABEL_TO_SHORT: "kime" - LABEL_CC: "CC" - LABEL_BCC: "BCC" - LABEL_REPLY_TO: "Reply-To" - PRINT_LABEL_FROM: "Kimden" - PRINT_LABEL_TO: "To" - PRINT_LABEL_CC: "CC" - PRINT_LABEL_BCC: "BCC" - PRINT_LABEL_REPLY_TO: "Reply-To" - PRINT_LABEL_DATE: "Tarih" - PRINT_LABEL_SUBJECT: "Konu" - PRINT_LABEL_ATTACHMENTS: "Ekler" - MESSAGE_LOADING: "Yükleniyor" - MESSAGE_VIEW_DESC: "Burada görüntülemek için listeden mesaj seçin." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Şifre" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP imzalı mesaj (onay için tıklayın)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP şifreli mesaj (çözmek için tıklayın)" - LINK_DOWNLOAD_AS_ZIP: "Download as zip" - LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" - LINK_SAVE_TO_DROPBOX: "Dropbox'a Kaydet" - READ_RECEIPT: - SUBJECT: "Return Receipt (displayed) - %SUBJECT%" - BODY: | - This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. - - Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. - There is no guarantee that the recipient has read or understood the message contents. - SUGGESTIONS: - SEARCHING_DESC: "Aranıyor..." - CONTACTS: - LEGEND_CONTACTS: "Adres Defteri" - SEARCH_INPUT_PLACEHOLDER: "Arama" - BUTTON_ADD_CONTACT: "Ekle" - BUTTON_CREATE_CONTACT: "Oluştur" - BUTTON_UPDATE_CONTACT: "Güncelle" - BUTTON_IMPORT: "İçe Aktar (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Dışa Aktar (vcf, vCard)" - BUTTON_EXPORT_CSV: "Dışa Aktar (csv)" - ERROR_IMPORT_FILE: "İçe aktarma hatası (geçersiz dosya formatı)" - LIST_LOADING: "Yükleniyor" - EMPTY_LIST: "Adres defterinizide kayıt bulunmuyor" - EMPTY_SEARCH: "Kişi bulunamadı" - CLEAR_SEARCH: "Aramayı temizle" - CONTACT_VIEW_DESC: "Görüntülemek istediğiniz kişiyi listeden seçin." - LABEL_DISPLAY_NAME: "Ekran Adı" - LABEL_EMAIL: "E-Posta" - LABEL_PHONE: "Telefon" - LABEL_WEB: "Web" - LABEL_BIRTHDAY: "Doğum Günü" - LINK_ADD_EMAIL: "Bir e-posta adresi ekleyin" - LINK_ADD_PHONE: "Bir telefon numarası ekleyin" - LINK_BIRTHDAY: "Doğrum Günü" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Görüntülenecek Ad" - PLACEHOLDER_ENTER_LAST_NAME: "Soyadını yazın" - PLACEHOLDER_ENTER_FIRST_NAME: "Adı yazın" - PLACEHOLDER_ENTER_NICK_NAME: "Nickname yazın" - LABEL_READ_ONLY: "Sadece Okunabilir" - LABEL_SHARE: "paylaş" - ADD_MENU_LABEL: "Ekle" - ADD_MENU_NICKNAME: "Nickname" - ADD_MENU_NOTES: "Notlar" - ADD_MENU_EMAIL: "E-Posta" - ADD_MENU_PHONE: "Gsm" - ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Adres" - ADD_MENU_BIRTHDAY: "Doğum Günü" - ADD_MENU_TAGS: "Etiketler" - BUTTON_SHARE_NONE: "Hiçbiri" - BUTTON_SHARE_ALL: "Herkes" - BUTTON_SYNC: "Senkronize Et (CardDAV)" - COMPOSE: - TITLE_FROM: "Kimden" - TITLE_TO: "Kime" - TITLE_CC: "CC" - TITLE_BCC: "BCC" - TITLE_REPLY_TO: "Yanıtla" - TITLE_SUBJECT: "Konu" - LINK_SHOW_INPUTS: "tüm alanları görüntüle" - BUTTON_SEND: "Gönder" - BUTTON_SAVE: "Kaydet" - BUTTON_DELETE: "Sil" - BUTTON_CANCEL: "Vazgeç" - BUTTON_MINIMIZE: "Minimize" - SAVED_TIME: "%TIME% tarihinde kaydedildi" - SAVED_ERROR_ON_SEND: "Mesaj gönderildi fakat gönderilenler klasörüne kaydedilmedi" - DISCARD_UNSAVED_DATA: "Discard unsaved data?" - ATTACH_FILES: "Ek dosyalar" - ATTACH_DROP_FILES_DESC: "Dosyaları buraya sürükleyin" - ATTACH_ITEM_CANCEL: "Vazgeç" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% yazdı" - FORWARD_MESSAGE_TOP_TITLE: "-------- Yönlendirilmiş İleti -------" - FORWARD_MESSAGE_TOP_FROM: "Kimden" - FORWARD_MESSAGE_TOP_TO: "Kime" - FORWARD_MESSAGE_TOP_CC: "CC" - FORWARD_MESSAGE_TOP_SENT: "Gönder" - FORWARD_MESSAGE_TOP_SUBJECT: "Konu" - EMPTY_TO_ERROR_DESC: "En az bir alıcı belirtin" - NO_ATTACHMENTS_HERE_DESC: "No attachments here." - ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet" - BUTTON_REQUEST_READ_RECEIPT: "Okundu bilgisi iste" - BUTTON_MARK_AS_IMPORTANT: "Mark as important" - BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" - BUTTON_REQUEST_DSN: "Request a delivery receipt" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Close" - POPUPS_ASK: - BUTTON_YES: "Evet" - BUTTON_NO: "Hayır" - DESC_WANT_CLOSE_THIS_WINDOW: "Bu pencereyi kapatmak istediğinizden emin misiniz?" - DESC_WANT_DELETE_MESSAGES: "Mesaj(ları) silmek istediğinizden emin misiniz?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Dil Seçimi" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Hesap Ekle?" - BUTTON_ADD_ACCOUNT: "Ekle" - TITLE_UPDATE_ACCOUNT: "Update Account?" - BUTTON_UPDATE_ACCOUNT: "Update" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Kimlik Ekle?" - TITLE_UPDATE_IDENTITY: "Kimlik Güncelle?" - BUTTON_ADD_IDENTITY: "Ekle" - BUTTON_UPDATE_IDENTITY: "Güncelle" - LABEL_EMAIL: "E-Posta" - LABEL_NAME: "Ad" - LABEL_REPLY_TO: "Yanıtla" - LABEL_SIGNATURE: "Signature" - LABEL_CC: "Cc" - LABEL_BCC: "Bcc" - LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Klasör Oluştur?" - LABEL_NAME: "Klasör Adı" - LABEL_PARENT: "Üst Klasör" - BUTTON_CREATE: "Oluştur" - BUTTON_CANCEL: "Vazgeç" - BUTTON_CLOSE: "Kapat" - TITLE_CREATING_PROCESS: "Klasör Oluştur" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Klasördeki tüm mesajları temizle?" - BUTTON_CLEAR: "Temizle" - BUTTON_CANCEL: "Vazgeç" - BUTTON_CLOSE: "Kapat" - DANGER_DESC_WARNING: "Uyarı!" - DANGER_DESC_HTML_1: "Bu işlem ile %FOLDER% klasöründeki tüm mailler silinecek." - DANGER_DESC_HTML_2: "Bu işlem bir kez başladıktan sonra, işlem durdurulamaz veya iptal edilemez." - TITLE_CLEARING_PROCESS: "Klasör temizleniyor..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "OpenPGP key'i içe aktar" - BUTTON_IMPORT_OPEN_PGP_KEY: "İçe aktar" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "OpenPGP key'i göster" - BUTTON_SELECT: "Seç" - BUTTON_CLOSE: "Kapat" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "OpenPGP key'leri Oluştur" - LABEL_EMAIL: "E-Posta" - LABEL_NAME: "Ad" - LABEL_PASSWORD: "Şifre" - LABEL_KEY_BIT_LENGTH: "Key Uzunluğu" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Oluştur" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP Giriş/Şifrele" - LABEL_SIGN: "Giriş Yap" - LABEL_ENCRYPT: "Şifrele" - LABEL_PASSWORD: "Password" - BUTTON_SIGN: "Giriş Yap" - BUTTON_ENCRYPT: "Şifrele" - BUTTON_SIGN_AND_ENCRYPT: "Giriş Yap and şifrele" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" - LABEL_KEY: "Private Key" - LABEL_PASSWORD: "Password" - BUTTON_DECRYPT: "Decrypt" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "2-Basamaklı doğrulama testi" - LABEL_CODE: "Kod" - BUTTON_TEST: "Test" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Create a filter?" - TITLE_EDIT_FILTER: "Update filter?" - FILTER_NAME: "Name" - LEGEND_CONDITIONS: "Conditions" - LEGEND_ACTIONS: "Actions" - BUTTON_DONE: "Done" - BUTTON_ADD_CONDITION: "Add a Condition" - SELECT_ACTION_NONE: "None" - SELECT_ACTION_MOVE_TO: "Move to" - SELECT_ACTION_FORWARD_TO: "Forward to" - SELECT_ACTION_REJECT: "Reject" - SELECT_ACTION_VACATION_MESSAGE: "Vacation message" - SELECT_ACTION_DISCARD: "Discard" - SELECT_FIELD_FROM: "From" - SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" - SELECT_FIELD_SUBJECT: "Subject" - SELECT_FIELD_HEADER: "Header" - SELECT_FIELD_SIZE: "Size" - SELECT_TYPE_CONTAINS: "Contains" - SELECT_TYPE_NOT_CONTAINS: "Not Contains" - SELECT_TYPE_MATCHES: "Matches (* and ? supported)" - SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" - SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Not Regexp" - SELECT_TYPE_EQUAL_TO: "Equal To" - SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" - SELECT_TYPE_OVER: "Over" - SELECT_TYPE_UNDER: "Under" - SELECT_MATCH_ANY: "Matching any of the following rules" - SELECT_MATCH_ALL: "Matching all of the following rules" - MARK_AS_READ_LABEL: "Okundu olarak işaretle" - REPLY_INTERVAL_LABEL: "Reply interval (days)" - KEEP_LABEL: "Keep" - STOP_LABEL: "Don't stop processing rules" - EMAIL_LABEL: "Eposta" - VACATION_SUBJECT_LABEL: "Konu (Opsiyonel)" - VACATION_MESSAGE_LABEL: "Mesaj" - VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" - REJECT_MESSAGE_LABEL: "Reject message" - ALL_INCOMING_MESSAGES_DESC: "All incoming messages" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Sistem klasörü seç" - SELECT_CHOOSE_ONE: "Birini seçin" - SELECT_UNUSE_NAME: "Kullanmayın" - LABEL_SENT: "Gönderilen" - LABEL_DRAFTS: "Taslaklar" - LABEL_SPAM: "Spam" - LABEL_TRASH: "Çöp" - LABEL_ARCHIVE: "Arşiv" - BUTTON_CANCEL: "Vazgeç" - BUTTON_CLOSE: "Kapat" - NOTIFICATION_SENT: | - Herhangi bir sistem gönderilen klasörü seçmediniz normalde mesaj gönderildikten sonra "Gönderilen"'ler klasörüne kaydedilir - Eğer gönderilenlerin kaydedilmesini istemiyorsanız lütfen ayarlardan "Kullanma" seçeneğini seçin. - NOTIFICATION_DRAFTS: "Herhangi bir sistem taslak klasörü seçmediniz.\"Taslak\" klasörü otomatik mesajınızı kaydeder" - NOTIFICATION_SPAM: |- - Herhangi bir sistem spam klasörü seçmediniz."Spam" klasörü spam iletileri barındırır. - NOTIFICATION_TRASH: |- - Herhangi bir sistem çöp kutusu klasörü seçmediniz normalde mesaj silindikten sonra "Çöp Kutusu" klasörüne kaydedilir - NOTIFICATION_ARCHIVE: "Herhangi bir sistem arşiv klasörü seçmediniz." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "2-Basamaklı doğrumalama" - LABEL_ENABLE_TWO_FACTOR: "2-Basamaklı Doğrulama Etkinleştir" - LABEL_TWO_FACTOR_USER: "Kullanıcı Adı" - LABEL_TWO_FACTOR_STATUS: "Durum" - LABEL_TWO_FACTOR_SECRET: "Gizli" - LABEL_TWO_FACTOR_BACKUP_CODES: "Kodları yedekle" - BUTTON_CREATE: "Yeni Secret kodu oluştur" - BUTTON_ACTIVATE: "Activate" - BUTTON_CLEAR: "Temizle" - BUTTON_LOGOUT: "Oturumu Kapat" - BUTTON_DONE: "Tamamla" - BUTTON_TEST: "Test" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Gizli kodu göster" - BUTTON_HIDE_SECRET: "Gizli kodu gizle" - TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Yapılandırılmış" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Yapılandırılmamış" - TWO_FACTOR_SECRET_DESC: >- - Aşağıda sunulan QR kodu kullanarak Google Şifrematik istemcisi (veya başka - TOTP istemci) içine veya elle kod girerek bu bilgi aktarın. - TWO_FACTOR_BACKUP_CODES_DESC: >- - Google Şifrematik'te aracılığıyla kodları alamıyorsa Eğer oturum için bir - yedek kod kullandım sonra, bunu pasif olacaktır, oturum yedekleme kodlarını - kullanabilirsiniz. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." - TITLES: - LOADING: "Yükleniyor" - LOGIN: "Giriş" - MAILBOX: "PostaKutusu" - SETTINGS: "Ayarlar" - COMPOSE: "Yaz" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Dosya çok büyük" - ERROR_FILE_PARTIALLY_UPLOADED: "Dosya yüklenirken kısmen bilinmeyen hata oluştu" - ERROR_NO_FILE_UPLOADED: "Hiç bir dosya yüklenmedi" - ERROR_MISSING_TEMP_FOLDER: "Geçici dosya eksik" - ERROR_ON_SAVING_FILE: "Bilinmeyen bir dosya yükleme bir hatası oluştu" - ERROR_FILE_TYPE: "Geçersiz dosya tipi" - ERROR_UNKNOWN: "Bilinmeyen bir dosya yükleme bir hatası oluştu" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> Yazi Formati" - TEXT_SWITCHER_RICH_FORMATTING: "Zengin yazı formatı" - TEXT_SWITCHER_CONFIRM: "Metin biçimlendirme ve görüntüleri kaybolacak. Devam etmek istediğinizden emin misiniz?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Kişisel" - LABEL_GENERAL_NAME: "Genel" - LABEL_CONTACTS_NAME: "Kişi Listesi" - LABEL_FOLDERS_NAME: "Klasörler" - LABEL_ACCOUNTS_NAME: "Hesaplar" - LABEL_IDENTITY_NAME: "Kimlik" - LABEL_IDENTITIES_NAME: "Kimlikler" - LABEL_FILTERS_NAME: "Filtreler" - LABEL_TEMPLATES_NAME: "Templates" - LABEL_SECURITY_NAME: "Güvenlik" - LABEL_SOCIAL_NAME: "Sosyal Media" - LABEL_THEMES_NAME: "Temalar" - LABEL_CHANGE_PASSWORD_NAME: "Şifre" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Geri" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filters" - BUTTON_SAVE: "Kaydet" - BUTTON_ADD_FILTER: "Add a Filter" - BUTTON_DELETE: "Sil" - BUTTON_RAW_SCRIPT: "Use Custom User Script" - SUBNAME_NONE: "None" - SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" - SUBNAME_REJECT: "Reject" - SUBNAME_VACATION_MESSAGE: "Vacation message" - SUBNAME_DISCARD: "Discard" - CAPABILITY_LABEL: "Capability" - LOADING_PROCESS: "Updating filter list" - DELETING_ASK: "Are you sure?" - CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Kimlik" - LABEL_DISPLAY_NAME: "İsim" - LABEL_REPLY_TO: "Yanıt-için" - LABEL_SIGNATURE: "İmza" - LABEL_ADD_SIGNATURE_TO_ALL: "Tüm giden iletilere imza ekle" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Security" - LABEL_CONFIGURE_TWO_FACTOR: "2 Aşamali Güvenlik Konfikasyonu" - LABEL_AUTOLOGOUT: "Auto Logout" - AUTOLOGIN_NEVER_OPTION_NAME: "Never" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% saat" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Genel" - LABEL_LANGUAGE: "Dil" - LABEL_IDENTITY: "Identity" - LABEL_LAYOUT: "Layout" - LABEL_LAYOUT_NO_SPLIT: "No Split" - LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" - LABEL_EDITOR: "Varsayılan text editör" - LABEL_EDITOR_HTML: "Html" - LABEL_EDITOR_PLAIN: "Düz" - LABEL_EDITOR_HTML_FORCED: "Html (forced)" - LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" - LABEL_ANIMATION: "Arayüz animasyonu" - LABEL_ANIMATION_FULL: "Tam Ekran" - LABEL_ANIMATION_NORMAL: "Normal" - LABEL_ANIMATION_NONE: "Yok" - LABEL_VIEW_OPTIONS: "Ayarları görüntüle" - LABEL_USE_PREVIEW_PANE: "Önizleme bölmesini kullanın" - LABEL_USE_CHECKBOXES_IN_LIST: "Listede ekran onay kutularını göster" - LABEL_USE_THREADS: "Konuları kullanın" - LABEL_REPLY_SAME_FOLDER: "Klasördeki cevapları mesajlarda göster" - LABEL_SHOW_IMAGES: "Herzaman gelen maillerdeki resimleri görüntüle." - LABEL_SHOW_ANIMATION: "Animasyonu göster" - LABEL_MESSAGE_PER_PAGE: "Messages on page" - LABEL_NOTIFICATIONS: "Bildirimler" - LABEL_SOUND_NOTIFICATION: "Sound notification" - LABEL_CHROME_NOTIFICATION_DESC: "Yeni mesajları pop-up ile göster" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Tarayıcınız tarafından engellendi)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Kişi Listesi" - LABEL_CONTACTS_AUTOSAVE: "Otomatik olarak adres defterinize alıcıyı ekle" - LEGEND_CONTACTS_SYNC: "Uzaktan Eşleştirme (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Uzaktan eşleştirme etkin" - LABEL_CONTACTS_SYNC_SERVER: "Sunucu" - LABEL_CONTACTS_SYNC_AB_URL: "Adres Defteri URL" - LABEL_CONTACTS_SYNC_USER: "Kullanıcı Adı" - LABEL_CONTACTS_SYNC_PASSWORD: "Şifre" - SETTINGS_THEMES: - LEGEND_THEMES: "Temalar" - LEGEND_THEMES_CUSTOM: "Özel Tema Yapılandırması" - LABEL_CUSTOM_TYPE: "Tip" - LABEL_CUSTOM_TYPE_LIGHT: "Aydınlık" - LABEL_CUSTOM_TYPE_DARK: "Koyu" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Arka Plan" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Arka Plan Resmi Yükleyin(JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "Dosya çok büyük (1MB+)" - ERROR_FILE_TYPE_ERROR: "Geçersiz dosya tipi (sadece JPG ve PNG kabul edilir)" - ERROR_UNKNOWN: "Bilinmeyen bir dosya yükleme bir hatası oluştu" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Google'a bağlan" - BUTTON_GOOGLE_DISCONNECT: "Google bağlantısını kes" - MAIN_GOOGLE_DESC: "Google üzerinden giriş etkinleştirdikten sonra, giriş ekranında Google düğmesini kullanarak bu hesaba oturum açabilirsiniz." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Facebook'a bağlan" - BUTTON_FACEBOOK_DISCONNECT: "Facebook bağlantısını kes" - MAIN_FACEBOOK_DESC: "Facebook üzerinden giriş etkinleştirdikten sonra, giriş ekranında Facebook düğmesini kullanarak bu hesaba oturum açabilirsiniz." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Twitter'a bağlan" - BUTTON_TWITTER_DISCONNECT: "Twitter bağlantısını kes" - MAIN_TWITTER_DESC: "Twitter üzerinden giriş etkinleştirdikten sonra, giriş ekranında Twitter düğmesini kullanarak bu hesaba oturum açabilirsiniz." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Klasör Listesi" - BUTTON_CREATE: "Klasör Oluştur" - BUTTON_SYSTEM: "Sistem Klasörleri" - BUTTON_DELETE: "Sil" - BUTTON_SUBSCRIBE: "Abone" - BUTTON_UNSUBSCRIBE: "Abonelikten Çık" - LOADING_PROCESS: "Klasör listesi güncelleniyor" - CREATING_PROCESS: "Klasör oluşturuluyor" - DELETING_PROCESS: "Klasör siliniyor" - RENAMING_PROCESS: "Klasör değiştiriliyor" - DELETING_ASK: "Eminmisiniz?" - TO_MANY_FOLDERS_DESC_1: "You have too many folders!" - TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." - HELP_DELETE_FOLDER: "Delete folder" - HELP_SHOW_HIDE_FOLDER: "Show/hide folder" - HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Hesap Listesi" - LEGEND_IDENTITIES: "Identities" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" - BUTTON_ADD_ACCOUNT: "Hesap Ekle" - BUTTON_ADD_IDENTITY: "Add an Identity" - BUTTON_DELETE: "Sil" - LOADING_PROCESS: "Hesap listesi güncelleniyor" - DELETING_ASK: "Eminmisiniz?" - DEFAULT_IDENTITY_LABEL: "default" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Kimlik" - LEGEND_IDENTITIES: "Ek kimlikler" - LABEL_DEFAULT: "Default" - LABEL_DISPLAY_NAME: "Ad" - LABEL_REPLY_TO: "Yanıt için" - LABEL_SIGNATURE: "İmza" - LABEL_ADD_SIGNATURE_TO_ALL: "Tüm gönderilen mailler imza ekle" - BUTTON_ADD_IDENTITY: "Kimlik ekle" - BUTTON_DELETE: "Sil" - LOADING_PROCESS: "Kimlik listesi güncelleniyor" - DELETING_ASK: "Eminmisiniz?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Şifreyi Değiştir" - LABEL_CURRENT_PASSWORD: "Şimdiki Şifreniz" - LABEL_NEW_PASSWORD: "Yeni Şifreniz" - LABEL_REPEAT_PASSWORD: "Yeni Şifre Tekrar" - BUTTON_UPDATE_PASSWORD: "Yeni Şifreyi Kaydet" - ERROR_PASSWORD_MISMATCH: "Şifre eşleşmesi hatalı,lütfen tekrar deneyiniz" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "OpenPGP Key İçe Aktar" - BUTTON_GENERATE_OPEN_PGP_KEYS: "OpenPGP Key Oluştur" - TITLE_PRIVATE: "Private" - TITLE_PUBLIC: "Public" - DELETING_ASK: "Eminmisiniz?" - GENERATE_ONLY_HTTPS: "HTTPS only" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Klavye kısayolları yardım" - TAB_MAILBOX: "Posta Kutusu" - TAB_MESSAGE_LIST: "Mesaj Listesi" - TAB_MESSAGE_VIEW: "Mesaj görünümü" - TAB_COMPOSE: "Oluştur" - LABEL_OPEN_USER_DROPDOWN: "Kullanıcı açılır pencresini aç" - LABEL_REPLY: "Yanıtla" - LABEL_REPLY_ALL: "Tümünü Yanıtla" - LABEL_FORWARD: "Yönlendir" - LABEL_FORWARD_MULTIPLY: "Yönlendir (çoklu)" - LABEL_HELP: "Yardım" - LABEL_CHECK_ALL: "Tüm mesajları seç" - LABEL_ARCHIVE: "Arşiv" - LABEL_DELETE: "Sil" - LABEL_OPEN_THREAD: "Open selected thread" - LABEL_MOVE: "Taşı" - LABEL_READ: "Seçili mesajları oku" - LABEL_UNREAD: "Seçili mesajları okuma" - LABEL_IMPORTANT: "Seçili işaretli mesajları içe aktar" - LABEL_SEARCH: "Arama" - LABEL_CANCEL_SEARCH: "Aramayı durdur" - LABEL_FULLSCREEN_ENTER: "Tam Ekran (Önizleme bölmesi düzeni)" - LABEL_VIEW_MESSAGE_ENTER: "Mesaj görünümü (Önizleme bölmesi taslağı bulunamadı)" - LABEL_SWITCH_TO_MESSAGE: "Görünen ile seçilen mesajı değiştir" - LABEL_SWITCH_TO_FOLDER_LIST: "Görüntülen ile klasör listesini değiştir" - LABEL_FULLSCREEN_TOGGLE: "Tam ekran modunu aç kapat" - LABEL_BLOCKQUOTES_TOGGLE: "Alıntılanan metni aç kapat" - LABEL_THREAD_NEXT: "Next message in thread" - LABEL_THREAD_PREV: "Previous message in thread" - LABEL_PRINT: "Yazdır" - LABEL_EXIT_FULLSCREEN: "Tam ekran modundan çık" - LABEL_CLOSE_MESSAGE: "Mesajı kapat (önizleme bölmedüzen taslağı bulunamadı)" - LABEL_SWITCH_TO_LIST: "Görüntülenen'den mesaj listesine geri dön" - LABEL_OPEN_COMPOSE_POPUP: "Yazma pencresini popup olarak aç" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Kimlik açılır pencresini aç" - LABEL_SAVE_MESSAGE: "Mesajı Kaydet" - LABEL_SEND_MESSAGE: "Mesajı Gönder" - LABEL_CLOSE_COMPOSE: "Oluşturulanı Kapat" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "Public key bulunamadı" - NO_PUBLIC_KEYS_FOUND_FOR: "Public key bulunamadı %EMAIL%" - NO_PRIVATE_KEY_FOUND: "Private key bulunamadı" - NO_PRIVATE_KEY_FOUND_FOR: "Private key bulunamadı %EMAIL%" - ADD_A_PUBLICK_KEY: "Add a public key" - SELECT_A_PRIVATE_KEY: "Özel anahtari seç" - UNVERIFIRED_SIGNATURE: "Doğrulanmamış imza" - DECRYPTION_ERROR: "OpenPGP çözme hatası" - GOOD_SIGNATURE: "Geçerli imza %USER%" - PGP_ERROR: "OpenPGP hatası: %ERROR%" - SPECIFY_FROM_EMAIL: "Lütfen bir gönderici belirtin" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "En az bir alıcı belirtin" - NOTIFICATIONS: - INVALID_TOKEN: "Geçersiz token" - AUTH_ERROR: "Kimlik doğrulama başarısız oldu" - ACCESS_ERROR: "Erişim hatası" - CONNECTION_ERROR: "Sunucuya bağlanılamadı" - CAPTCHA_ERROR: "Yanlış Güvenlik Kodu." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- - Bu, sosyal kimliği henüz herhangi bir e-posta hesabı için atanmadı.E-kimlik - bilgilerini kullanarak oturum ve hesap ayarlarında bu özelliği etkinleştirmek - ekleyin. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- - Bu, sosyal kimliği henüz herhangi bir e-posta hesabı için atanmadı.E-kimlik - bilgilerini kullanarak oturum ve hesap ayarlarında bu özelliği etkinleştirmek - ekleyin. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- - Bu, sosyal kimliği henüz herhangi bir e-posta hesabı için atanmadı.E-kimlik - bilgilerini kullanarak oturum ve hesap ayarlarında bu özelliği etkinleştirmek - ekleyin. - DOMAIN_NOT_ALLOWED: "Alan Adına izin verilmemiş" - ACCOUNT_NOT_ALLOWED: "Hesaba izin verilmemiş" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "İki Aşamalı Doğrulama Gerekiyor" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Tİki Aşamalı Doğrulama Hatası" - COULD_NOT_SAVE_NEW_PASSWORD: "Yeni Şifre Kaydedilemedi" - CURRENT_PASSWORD_INCORRECT: "Şimdiki şifreniz hatalı" - NEW_PASSWORD_SHORT: "Şifreniz çok kısa" - NEW_PASSWORD_WEAK: "Şifreniz çok kolay" - NEW_PASSWORD_FORBIDDENT: "Şifrenizde geçersiz karekterler bulunuyor" - CONTACTS_SYNC_ERROR: "Kişi listesi senkronizasyon hatası" - CANT_GET_MESSAGE_LIST: "Mesaj listesi alınamadı" - CANT_GET_MESSAGE: "Mesaj alınamadı" - CANT_DELETE_MESSAGE: "Mesaj silinemedi" - CANT_MOVE_MESSAGE: "Mesaj taşınamadı" - CANT_SAVE_MESSAGE: "Mesaj kaydedilemedi" - CANT_SEND_MESSAGE: "Mesaj gönderilemedi" - INVALID_RECIPIENTS: "Geçersiz alıcılar" - CANT_SAVE_FILTERS: "Can't save filters" - CANT_GET_FILTERS: "Can't get filters" - FILTERS_ARE_NOT_CORRECT: "Filters are not correct" - CANT_CREATE_FOLDER: "Klasör oluşturulamadı" - CANT_RENAME_FOLDER: "Klasör oluşturulamadı" - CANT_DELETE_FOLDER: "Klasör silimedi" - CANT_DELETE_NON_EMPTY_FOLDER: "Boş olmayan dizin silinemedi" - CANT_SUBSCRIBE_FOLDER: "Klasöre abone olunamadı" - CANT_UNSUBSCRIBE_FOLDER: "Klasör Aboneliğinden çıkılamadı" - CANT_SAVE_SETTINGS: "Ayarlar kaydedilemedi" - CANT_SAVE_PLUGIN_SETTINGS: "Ayarlar kaydedilemedi" - DOMAIN_ALREADY_EXISTS: "Alanadı bulunuyor" - CANT_INSTALL_PACKAGE: "Paket kurulamadı" - CANT_DELETE_PACKAGE: "Paket silinemedi" - INVALID_PLUGIN_PACKAGE: "Geçersiz eklenti paketi" - UNSUPPORTED_PLUGIN_PACKAGE: "Desteklenmeyen eklenti paketi" - LICENSING_SERVER_IS_UNAVAILABLE: "Abone sunucusu cevap vermiyor" - LICENSING_DOMAIN_EXPIRED: "Bu etki alanı için abonelik süresi doldu." - LICENSING_DOMAIN_BANNED: "Bu etki alanı için abonelik yasaklandı." - DEMO_SEND_MESSAGE_ERROR: "Güvenlik amacıyla, bu demo hesabı harici e-posta adreslerine mesaj göndermek için izin verilmez!" - DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" - ACCOUNT_ALREADY_EXISTS: "Hesap zaten var" - MAIL_SERVER_ERROR: "Posta sunucusuna erişirken bir hata oluştu" - INVALID_INPUT_ARGUMENT: "Invalid input argument" - UNKNOWN_ERROR: "Bilinmeyen Hata" - STATIC: - BACK_LINK: "Yenile" - DOMAIN_LIST_DESC: "Alanadı webmail listesi erişime izini." - PHP_EXSTENSIONS_ERROR_DESC: "Gerekli PHP eklentileri PHP yapılandırmasında mevcut değildir!" - PHP_VERSION_ERROR_DESC: "PHP sürümünüz (%VERSION%) en az php 5.3.0 sürümü gerekli!" - NO_SCRIPT_TITLE: "JavaScript bu uygulama için gereklidir." - NO_SCRIPT_DESC: | - JavaScript desteği tarayıcınızda mevcut değil. - Tarayıcı ayarlarında JavaScript desteğini etkinleştirin ve yeniden deneyin. - NO_COOKIE_TITLE: "Çerezler desteği bu uygulama için gerekli." - NO_COOKIE_DESC: | - Çerezler destek tarayıcınızda mevcut değil. - Tarayıcı ayarlarında Cookie desteği etkinleştirin ve yeniden deneyin. - BAD_BROWSER_TITLE: "Tarayıcınız çok eski." - BAD_BROWSER_DESC: | - Uygulamanın tüm özelliklerini kullanmak için, - Bu tarayıcılardan birini indirmek ve yükleyin: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/uk_UA.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/uk_UA.yml deleted file mode 100755 index 47eef352..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/uk_UA.yml +++ /dev/null @@ -1,704 +0,0 @@ -uk_UA: - LOGIN: - LABEL_EMAIL: "Пошта" - LABEL_LOGIN: "Логін" - LABEL_PASSWORD: "Пароль" - LABEL_SIGN_ME: "Запам'ятати мене" - LABEL_VERIFICATION_CODE: "Код підтвердження" - LABEL_DONT_ASK_VERIFICATION_CODE: "Не питати код на протязі 2-х тижнів" - BUTTON_SIGN_IN: "Увійти" - TITLE_SIGN_IN_GOOGLE: "Увійти, використовуючи Google" - TITLE_SIGN_IN_FACEBOOK: "Увійти, використовуючи Facebook" - TITLE_SIGN_IN_TWITTER: "Увійти, використовуючи Twitter" - LABEL_FORGOT_PASSWORD: "Забули пароль?" - LABEL_REGISTRATION: "Реєстрація" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Додати ще акаунт" - BUTTON_SETTINGS: "Налаштування" - BUTTON_HELP: "Допомога" - BUTTON_LOGOUT: "Вийти" - MOBILE: - BUTTON_MOBILE_VERSION: "Мобільна версія" - BUTTON_DESKTOP_VERSION: "Повна версія" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "Пошук листів" - TITLE_ADV: "Розширений пошук листів" - LABEL_ADV_FROM: "Від" - LABEL_ADV_TO: "Кому" - LABEL_ADV_SUBJECT: "Тема" - LABEL_ADV_TEXT: "Текст" - LABEL_ADV_HAS_ATTACHMENT: "З файлами" - LABEL_ADV_HAS_ATTACHMENTS: "З файлами" - LABEL_ADV_FLAGGED: "Відмічені" - LABEL_ADV_UNSEEN: "Непрочитані" - LABEL_ADV_DATE: "Дата" - LABEL_ADV_DATE_ALL: "За весь час" - LABEL_ADV_DATE_3_DAYS: "За три дні" - LABEL_ADV_DATE_7_DAYS: "За тиждень" - LABEL_ADV_DATE_MONTH: "За місяць" - LABEL_ADV_DATE_3_MONTHS: "За 3 місяці" - LABEL_ADV_DATE_6_MONTHS: "За півроку" - LABEL_ADV_DATE_YEAR: "За рік" - BUTTON_ADV_SEARCH: "Шукати" - PREVIEW_POPUP: - FULLSCREEN: "Toggle fullscreen" - ZOOM: "Zoom in/out" - CLOSE: "Закрити (Esc)" - LOADING: "Завантаження..." - GALLERY_PREV: "Назад (Стрілка ←)" - GALLERY_NEXT: "Вперед (Стрілка →)" - GALLERY_COUNTER: "%curr% з %total%" - IMAGE_ERROR: "Зображення не завантажилося." - AJAX_ERROR: "Дані не завантажились." - FOLDER_LIST: - BUTTON_COMPOSE: "Написати" - BUTTON_CONTACTS: "Контакти" - INBOX_NAME: "Вхідні" - SENT_NAME: "Вихідні" - DRAFTS_NAME: "Чорновики" - SPAM_NAME: "Спам" - TRASH_NAME: "Кошик" - ARCHIVE_NAME: "Архів" - QUOTA: - TITLE: "Дискова квота" - MESSAGE_LIST: - BUTTON_RELOAD: "Оновити список листів" - BUTTON_MOVE_TO: "Перемістити" - BUTTON_DELETE: "Видалити" - BUTTON_ARCHIVE: "Архівувати" - BUTTON_SPAM: "В спам" - BUTTON_NOT_SPAM: "Не спам" - BUTTON_EMPTY_FOLDER: "Очистити всю папку" - BUTTON_MULTY_FORWARD: "Переслати як вкладення" - BUTTON_DELETE_WITHOUT_MOVE: "Видалити повз кошик" - BUTTON_MORE: "Ще" - MENU_SET_SEEN: "Відмітити як прочитане" - MENU_SET_ALL_SEEN: "Відмітити всі як прочитані" - MENU_UNSET_SEEN: "Відмітити як непрочитане" - MENU_SET_FLAG: "Встановити флаг" - MENU_UNSET_FLAG: "Зняти флаг" - MENU_SELECT_ALL: "Все" - MENU_SELECT_NONE: "Жодного" - MENU_SELECT_INVERT: "Інвертувати" - MENU_SELECT_UNSEEN: "Непрочитані" - MENU_SELECT_SEEN: "Прочитані" - MENU_SELECT_FLAGGED: "Відмічені" - MENU_SELECT_UNFLAGGED: "Без поміток" - EMPTY_LIST: "В папці немає листів." - EMPTY_SEARCH_LIST: "Листи не знайдено." - SEARCH_RESULT_FOR: "Результат пошуку \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "повернутись до списку листів" - LIST_LOADING: "Завантаження" - EMPTY_SUBJECT_TEXT: "(Без теми)" - PUT_MESSAGE_HERE: "Киньте повідомлення сюди, щоб подивитися його в списку" - TODAY_AT: "сьогодні в %TIME%" - YESTERDAY_AT: "вчора в %TIME%" - SEARCH_PLACEHOLDER: "Пошук листів" - NEW_MESSAGE_NOTIFICATION: "У вас %COUNT% нових повідомлень!" - QUOTA_SIZE: "Використано %SIZE% (%PROC%%) з %LIMIT%" - MESSAGE: - BUTTON_EDIT: "Редагувати" - BUTTON_BACK: "Назад" - BUTTON_CLOSE: "Закрити" - BUTTON_DELETE: "Видалити" - BUTTON_ARCHIVE: "Архівувати" - BUTTON_SPAM: "В спам" - BUTTON_NOT_SPAM: "Не спам" - BUTTON_MOVE_TO: "Перемістити" - BUTTON_MORE: "Ще" - BUTTON_REPLY: "Відповісти на Листа" - BUTTON_REPLY_ALL: "Відповісти Всім" - BUTTON_FORWARD: "Переслати" - BUTTON_FORWARD_AS_ATTACHMENT: "Переслати як файл" - BUTTON_EDIT_AS_NEW: "Редагувати як нове" - BUTTON_SHOW_IMAGES: "Показати зовнішні зображення в листі" - BUTTON_NOTIFY_READ_RECEIPT: "Сповістити відправника про прочитання цього повідомлення." - BUTTON_IN_NEW_WINDOW: "В окремому вікні" - BUTTON_THREAD_LIST: "Листування" - BUTTON_THREAD_PREV: "Попереднє" - BUTTON_THREAD_NEXT: "Наступне" - BUTTON_THREAD_MORE: "ще листи" - MENU_HEADERS: "Подивитися заголовки" - MENU_VIEW_ORIGINAL: "Подивитися оригінал" - MENU_DOWNLOAD_ORIGINAL: "Завантажити як .eml файл" - MENU_FILTER_SIMILAR: "Фільтрувати схожі" - MENU_PRINT: "Надрукувати" - EMPTY_SUBJECT_TEXT: "(Без теми)" - LABEL_SUBJECT: "Тема" - LABEL_DATE: "Дата" - LABEL_FROM: "Від" - LABEL_FROM_SHORT: "від" - LABEL_TO: "Кому" - LABEL_TO_SHORT: "кому" - LABEL_CC: "Копія" - LABEL_BCC: "Прихована" - LABEL_REPLY_TO: "Reply-To" - PRINT_LABEL_FROM: "Від" - PRINT_LABEL_TO: "Кому" - PRINT_LABEL_CC: "Копія" - PRINT_LABEL_BCC: "Прихована" - PRINT_LABEL_REPLY_TO: "Reply-To" - PRINT_LABEL_DATE: "Дата" - PRINT_LABEL_SUBJECT: "Тема" - PRINT_LABEL_ATTACHMENTS: "Файли" - MESSAGE_LOADING: "Завантаження" - MESSAGE_VIEW_DESC: "Виберіть повідомлення для перегляду." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Пароль" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP підписане повідомлення (натисніть, щоб підтвердити)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP шифроване повідомлення (натисніть, щоб розшифрувати)" - LINK_DOWNLOAD_AS_ZIP: "Завантажити як zip" - LINK_SAVE_TO_OWNCLOUD: "Зберегти в ownCloud" - LINK_SAVE_TO_DROPBOX: "Зберегти в Dropbox" - READ_RECEIPT: - SUBJECT: "Сповіщення про прочитання цього повідомлення - %SUBJECT%" - BODY: | - Це сповіщення про прочитання для повідомлення, яке ви надіслали в адресу %READ-RECEIPT%. - - Примітка: Це сповіщення про прочитання означає лише, що повідомлення було відображено на машину отримувача. - Воно не гарантує, що отримувач прочитав чи зрозумів зміст повідомлення. - SUGGESTIONS: - SEARCHING_DESC: "Пошук..." - CONTACTS: - LEGEND_CONTACTS: "Контакти" - SEARCH_INPUT_PLACEHOLDER: "Пошук контактів" - BUTTON_ADD_CONTACT: "Додати контакт" - BUTTON_CREATE_CONTACT: "Зберегти" - BUTTON_UPDATE_CONTACT: "Оновити" - BUTTON_IMPORT: "Імпорт (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Експорт (vcf, vCard)" - BUTTON_EXPORT_CSV: "Експорт (csv)" - ERROR_IMPORT_FILE: "Помилка імпорту (Неправильний формат файлу)" - LIST_LOADING: "Завантаження" - EMPTY_LIST: "Немає контактів" - EMPTY_SEARCH: "Контакти не знайдено" - CLEAR_SEARCH: "Очистити пошук" - CONTACT_VIEW_DESC: "Виберіть контакт для перегляду." - LABEL_DISPLAY_NAME: "Повне ім'я" - LABEL_EMAIL: "Електронна пошта" - LABEL_PHONE: "Телефон" - LABEL_WEB: "Сайт" - LABEL_BIRTHDAY: "День нарождення" - LINK_ADD_EMAIL: "Додайте адресу електронної пошти" - LINK_ADD_PHONE: "Додайте телефон" - LINK_BIRTHDAY: "День народження" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Введіть повне ім'я" - PLACEHOLDER_ENTER_LAST_NAME: "Введіть ім'я" - PLACEHOLDER_ENTER_FIRST_NAME: "Введіть прізвище" - PLACEHOLDER_ENTER_NICK_NAME: "Введіть нік" - LABEL_READ_ONLY: "Тільки читання" - LABEL_SHARE: "Поділитися" - ADD_MENU_LABEL: "Додати" - ADD_MENU_NICKNAME: "Нік" - ADD_MENU_NOTES: "Примітки" - ADD_MENU_EMAIL: "Пошту" - ADD_MENU_PHONE: "Телефон" - ADD_MENU_URL: "Сайт" - ADD_MENU_ADDRESS: "Адреса" - ADD_MENU_BIRTHDAY: "День народження" - ADD_MENU_TAGS: "Теги" - BUTTON_SHARE_NONE: "Відмінити" - BUTTON_SHARE_ALL: "Всім" - BUTTON_SYNC: "Синхронизація (CardDAV)" - COMPOSE: - TITLE_FROM: "Від" - TITLE_TO: "Кому" - TITLE_CC: "Копія" - TITLE_BCC: "Прихована" - TITLE_REPLY_TO: "Відповісти на" - TITLE_SUBJECT: "Тема" - LINK_SHOW_INPUTS: "Показати всі поля" - BUTTON_SEND: "Надіслати" - BUTTON_SAVE: "Зберегти" - BUTTON_DELETE: "Видалити" - BUTTON_CANCEL: "Відмінити" - BUTTON_MINIMIZE: "Minimize" - SAVED_TIME: "Збережено в %TIME%" - SAVED_ERROR_ON_SEND: "Повідомлення було надіслано, але не збережено" - DISCARD_UNSAVED_DATA: "Discard unsaved data?" - ATTACH_FILES: "Додати файли" - ATTACH_DROP_FILES_DESC: "Помістити файли сюди" - ATTACH_ITEM_CANCEL: "Відмінити" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% написав" - FORWARD_MESSAGE_TOP_TITLE: "-------- Переслане повідомлення -------" - FORWARD_MESSAGE_TOP_FROM: "Від" - FORWARD_MESSAGE_TOP_TO: "Кому" - FORWARD_MESSAGE_TOP_CC: "Копія" - FORWARD_MESSAGE_TOP_SENT: "Надіслано" - FORWARD_MESSAGE_TOP_SUBJECT: "Тема" - EMPTY_TO_ERROR_DESC: "Вкажіть як мінімум одного отримувача" - NO_ATTACHMENTS_HERE_DESC: "No attachments here." - ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet" - BUTTON_REQUEST_READ_RECEIPT: "Запит про прочитання листа" - BUTTON_MARK_AS_IMPORTANT: "Mark as important" - BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" - BUTTON_REQUEST_DSN: "Request a delivery receipt" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Закрити" - POPUPS_ASK: - BUTTON_YES: "Так" - BUTTON_NO: "Ні" - DESC_WANT_CLOSE_THIS_WINDOW: "Ви впевнені, що хочете закрити це вікно?" - DESC_WANT_DELETE_MESSAGES: "Ви впевнені, що хочете видалити повідомлення?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "Виберіть мову" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Додати ще акаунт?" - BUTTON_ADD_ACCOUNT: "Додати" - TITLE_UPDATE_ACCOUNT: "Update Account?" - BUTTON_UPDATE_ACCOUNT: "Update" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Додати Профіль?" - TITLE_UPDATE_IDENTITY: "Оновити Профіль?" - BUTTON_ADD_IDENTITY: "Додати" - BUTTON_UPDATE_IDENTITY: "Оновити" - LABEL_EMAIL: "Пошта" - LABEL_NAME: "Ім'я" - LABEL_REPLY_TO: "Відповісти на" - LABEL_SIGNATURE: "Signature" - LABEL_CC: "Cc" - LABEL_BCC: "Прихована" - LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Створити теку?" - LABEL_NAME: "Ім'я теки" - LABEL_PARENT: "Батьківська тека" - BUTTON_CREATE: "Створити" - BUTTON_CANCEL: "Відмінити" - BUTTON_CLOSE: "Закрити" - TITLE_CREATING_PROCESS: "Створення теки" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Очистити теку від листів?" - BUTTON_CLEAR: "Очистити" - BUTTON_CANCEL: "Відмінити" - BUTTON_CLOSE: "Закрити" - DANGER_DESC_WARNING: "Увага!" - DANGER_DESC_HTML_1: "Ця дія призведе до повного видалення всіх листів з теки %FOLDER%." - DANGER_DESC_HTML_2: "Після початку очищення, процес неможливо буде зупинити чи відмінити." - TITLE_CLEARING_PROCESS: "Очищення теки..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Імпорт OpenPGP ключа" - BUTTON_IMPORT_OPEN_PGP_KEY: "Імпорт" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Перегляд OpenPGP ключа" - BUTTON_SELECT: "Вибрати" - BUTTON_CLOSE: "Закрити" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Генерація OpenPGP ключа" - LABEL_EMAIL: "Пошта" - LABEL_NAME: "Ім'я" - LABEL_PASSWORD: "Пароль" - LABEL_KEY_BIT_LENGTH: "Довжина ключа" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Створити" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP підпис і шифрування" - LABEL_SIGN: "Підпис" - LABEL_ENCRYPT: "Шифрування" - LABEL_PASSWORD: "Пароль" - BUTTON_SIGN: "Підпис" - BUTTON_ENCRYPT: "Шифрування" - BUTTON_SIGN_AND_ENCRYPT: "Підпис и шифрування" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" - LABEL_KEY: "Private Key" - LABEL_PASSWORD: "Пароль" - BUTTON_DECRYPT: "Дешифрувати" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "Тест двофакторної верифікації" - LABEL_CODE: "Код" - BUTTON_TEST: "Тест" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Створити фільтер?" - TITLE_EDIT_FILTER: "Оновити фільтер?" - FILTER_NAME: "Им'я" - LEGEND_CONDITIONS: "Умови" - LEGEND_ACTIONS: "Дії" - BUTTON_DONE: "Зроблено" - BUTTON_ADD_CONDITION: "Додати умову" - SELECT_ACTION_NONE: "Нічого" - SELECT_ACTION_MOVE_TO: "Перемістити в" - SELECT_ACTION_FORWARD_TO: "Переслати до" - SELECT_ACTION_REJECT: "Відклонити" - SELECT_ACTION_VACATION_MESSAGE: "Повідомлення про відпустку" - SELECT_ACTION_DISCARD: "Відклонити" - SELECT_FIELD_FROM: "Від" - SELECT_FIELD_RECIPIENTS: "Отримувачі (To or CC)" - SELECT_FIELD_SUBJECT: "Тема" - SELECT_FIELD_HEADER: "Заголовок" - SELECT_FIELD_SIZE: "Розмір" - SELECT_TYPE_CONTAINS: "Містить" - SELECT_TYPE_NOT_CONTAINS: "Не містить" - SELECT_TYPE_MATCHES: "Matches (* and ? supported)" - SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" - SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Not Regexp" - SELECT_TYPE_EQUAL_TO: "Дорівнює" - SELECT_TYPE_NOT_EQUAL_TO: "Не дорівнює" - SELECT_TYPE_OVER: "Over" - SELECT_TYPE_UNDER: "Under" - SELECT_MATCH_ANY: "Matching any of the following rules" - SELECT_MATCH_ALL: "Matching all of the following rules" - MARK_AS_READ_LABEL: "Mark as read" - REPLY_INTERVAL_LABEL: "Reply interval (days)" - KEEP_LABEL: "Keep" - STOP_LABEL: "Don't stop processing rules" - EMAIL_LABEL: "Email" - VACATION_SUBJECT_LABEL: "Тема (не обов'язково)" - VACATION_MESSAGE_LABEL: "Повідомлення" - VACATION_RECIPIENTS_LABEL: "Отримувачі (розділяти комами)" - REJECT_MESSAGE_LABEL: "Відклонити повідомлення" - ALL_INCOMING_MESSAGES_DESC: "Всі повідомлення, що надійшли" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Виберіть системні теки" - SELECT_CHOOSE_ONE: "Ще не вибрано" - SELECT_UNUSE_NAME: "Не використовувати" - LABEL_SENT: "Вихідні" - LABEL_DRAFTS: "Чорновики" - LABEL_SPAM: "Спам" - LABEL_TRASH: "Видалені" - LABEL_ARCHIVE: "Архів" - BUTTON_CANCEL: "Відмінити" - BUTTON_CLOSE: "Закрити" - NOTIFICATION_SENT: | - Ви ще не обрали системну теку "Вихідні", в яку складаються всі повідомлення післе надсилання. - Якщо ви не хочете зберігати вихідні листи, будь ласка, виберіть пункт "Не використовувати". - NOTIFICATION_DRAFTS: "Ви ще не обрали системну теку \"Чорновики\", в яку складаються всі збережені повідомлення." - NOTIFICATION_SPAM: | - Ви ще не обрали системну теку "Спам", в яку складаються всі спам повідомлення. - Якщо ви не хочете видаляти листи одразу, будь ласка, виберіть пункт "Не використовувати". - NOTIFICATION_TRASH: | - Ви ще не обрали системну теку "Удаленные", в яку складаються всі повідомлення після видалення. - Якщо ви не хочете видаляти листи одразу, будь ласка, виберіть пункт "Не використовувати". - NOTIFICATION_ARCHIVE: "Ви ще не обрали системну теку \"Архив\", в яку складаються всі повідомлення після архівації." - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "Двофакторна верификація" - LABEL_ENABLE_TWO_FACTOR: "Увімкнути двофакторну верифікацію" - LABEL_TWO_FACTOR_USER: "Користувач" - LABEL_TWO_FACTOR_STATUS: "Статус" - LABEL_TWO_FACTOR_SECRET: "Секретний ключ" - LABEL_TWO_FACTOR_BACKUP_CODES: "Резервні коди" - BUTTON_CREATE: "Створити новий секретний ключ" - BUTTON_ACTIVATE: "Activate" - BUTTON_CLEAR: "Очистити" - BUTTON_LOGOUT: "Logout" - BUTTON_DONE: "Done" - BUTTON_TEST: "Тест" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Показати секретний ключ" - BUTTON_HIDE_SECRET: "Приховати секретний ключ" - TWO_FACTOR_REQUIRE_DESC: "Ваш обліковий запис вимагає 2-факторну ідентифікацію" - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Налаштований" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Не налаштований" - TWO_FACTOR_SECRET_DESC: >- - Використовуйте цю інформацію для налаштування Google Authenticator клиенту - (чи іншого TOTP клиенту) за допомогою прикладеного QR-коду, чи вручну. - TWO_FACTOR_BACKUP_CODES_DESC: >- - Якщо Ви не можете отримати коди через Google Authenticator, ви можете використовувати - резервні коди, щоб увійти. Після того як Ви використали резервний код для - входу в систему, він стає неактивним. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Ви не можете змінити ці налаштування до тесту." - TITLES: - LOADING: "Завантаження" - LOGIN: "Вхід" - MAILBOX: "Пошта" - SETTINGS: "Налаштування" - COMPOSE: "Написати листа" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "Файл надто великий" - ERROR_FILE_PARTIALLY_UPLOADED: "Файл не завантажився повністю" - ERROR_NO_FILE_UPLOADED: "Файл не було завантажено" - ERROR_MISSING_TEMP_FOLDER: "Помилка при збереженні файлу" - ERROR_ON_SAVING_FILE: "Помилка при збереженні файлу" - ERROR_FILE_TYPE: "Неправильний тип файлу" - ERROR_UNKNOWN: "Помилка завантаження файлу" - EDITOR: - TEXT_SWITCHER_RICH_FORMATTING: "Форматований текст" - TEXT_SWITCHER_CONFIRM: "Форматування тексту і зображень будуть втрачені. Ви впевнені, що хочете продовжити?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "Персональні" - LABEL_GENERAL_NAME: "Основні" - LABEL_CONTACTS_NAME: "Контакти" - LABEL_FOLDERS_NAME: "Теки" - LABEL_ACCOUNTS_NAME: "Акаунти" - LABEL_IDENTITY_NAME: "Профіль" - LABEL_IDENTITIES_NAME: "Профілі" - LABEL_FILTERS_NAME: "Фильтры" - LABEL_TEMPLATES_NAME: "Templates" - LABEL_SECURITY_NAME: "Безпека" - LABEL_SOCIAL_NAME: "Соціальні" - LABEL_THEMES_NAME: "Теми" - LABEL_CHANGE_PASSWORD_NAME: "Пароль" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "Назад" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filters" - BUTTON_SAVE: "Save" - BUTTON_ADD_FILTER: "Add a Filter" - BUTTON_DELETE: "Delete" - BUTTON_RAW_SCRIPT: "Use Custom User Script" - SUBNAME_NONE: "None" - SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" - SUBNAME_REJECT: "Reject" - SUBNAME_VACATION_MESSAGE: "Повідомлення про відпустку" - SUBNAME_DISCARD: "Відклонити" - CAPABILITY_LABEL: "Capability" - LOADING_PROCESS: "Updating filter list" - DELETING_ASK: "Ви впевнені?" - CHACHES_NEED_TO_BE_SAVED_DESC: "Ці зміни необхідно зберегти на сервер." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Налаштування профілю" - LABEL_DISPLAY_NAME: "Ім'я" - LABEL_REPLY_TO: "Відповідати на" - LABEL_SIGNATURE: "Підпис" - LABEL_ADD_SIGNATURE_TO_ALL: "Додавати Ваш підпис до всіх вихідних повідомлень" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Безпека" - LABEL_CONFIGURE_TWO_FACTOR: "Налаштувати 2-факторну верифікацію" - LABEL_AUTOLOGOUT: "Автовихід" - AUTOLOGIN_NEVER_OPTION_NAME: "Ніколи" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "Основні налаштування" - LABEL_LANGUAGE: "Мова" - LABEL_IDENTITY: "Identity" - LABEL_LAYOUT: "Layout" - LABEL_LAYOUT_NO_SPLIT: "No Split" - LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" - LABEL_EDITOR: "Редактор тексту за змовчуванням" - LABEL_EDITOR_HTML: "Форматований" - LABEL_EDITOR_PLAIN: "Простий" - LABEL_EDITOR_HTML_FORCED: "Html (forced)" - LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" - LABEL_ANIMATION: "Анімація інтерфейсу" - LABEL_ANIMATION_FULL: "Повна" - LABEL_ANIMATION_NORMAL: "Нормальна" - LABEL_ANIMATION_NONE: "Відсутня" - LABEL_VIEW_OPTIONS: "Відображення" - LABEL_USE_PREVIEW_PANE: "Використовувати трьохколонний режим відображення" - LABEL_USE_CHECKBOXES_IN_LIST: "Показувати чекбокси у списках" - LABEL_USE_THREADS: "Згортати листи у листуваннях" - LABEL_REPLY_SAME_FOLDER: "Поміщати відповіді в ту ж теку, де знаходиться оригінал" - LABEL_SHOW_IMAGES: "Показувати зовнішні зображення в тілі листа без попередження" - LABEL_SHOW_ANIMATION: "Використовувати анімацію" - LABEL_MESSAGE_PER_PAGE: "Повідомлень на одній сторінці" - LABEL_NOTIFICATIONS: "Сповіщення" - LABEL_SOUND_NOTIFICATION: "Звукове сповіщення" - LABEL_CHROME_NOTIFICATION_DESC: "Показувати сповіщення про нові повідомлення у підказках" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Заблоковано браузером)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Контакти" - LABEL_CONTACTS_AUTOSAVE: "Автоматично додавати отримувачів у адресну книгу" - LEGEND_CONTACTS_SYNC: "Синхронізація (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Увімкнути синхронизацію" - LABEL_CONTACTS_SYNC_SERVER: "Сервер" - LABEL_CONTACTS_SYNC_AB_URL: "Адресна книга (URL)" - LABEL_CONTACTS_SYNC_USER: "Користувач" - LABEL_CONTACTS_SYNC_PASSWORD: "Пароль" - SETTINGS_THEMES: - LEGEND_THEMES: "Теми Оформлення" - LEGEND_THEMES_CUSTOM: "Налаштування Користувацької Теми" - LABEL_CUSTOM_TYPE: "Тип Теми" - LABEL_CUSTOM_TYPE_LIGHT: "Світла" - LABEL_CUSTOM_TYPE_DARK: "Темна" - LABEL_CUSTOM_BACKGROUND_IMAGE: "Картинка на фоні" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Завантажити фонову картинку (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "Файл надто великий" - ERROR_FILE_TYPE_ERROR: "Невірний тип файлу (тільки JPG и PNG)" - ERROR_UNKNOWN: "Помилка завантаження файлу" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "Підключити Google акаунт" - BUTTON_GOOGLE_DISCONNECT: "Відключити Google акаунт" - MAIN_GOOGLE_DESC: "Після підключення до Google ви зможете залогінітися в цей акаунт, використовуючи кнопку Google на екрані логіну." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "Підключити Facebook акаунт" - BUTTON_FACEBOOK_DISCONNECT: "Відключити Facebook акаунт" - MAIN_FACEBOOK_DESC: "Після підключення до Facebook ви зможете залогінітися в цей акаунт, використовуючи кнопку Facebook на екрані логіну." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "Підключити Twitter акаунт" - BUTTON_TWITTER_DISCONNECT: "Відключити Twitter акаунт" - MAIN_TWITTER_DESC: "Після підключення до Twitter ви зможете залогінітися в цей акаунт, використовуючи кнопку Twitter на екрані логіну." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "Список Тек" - BUTTON_CREATE: "Створити Теку" - BUTTON_SYSTEM: "Системні теки" - BUTTON_DELETE: "Видалити" - BUTTON_SUBSCRIBE: "Підписатися" - BUTTON_UNSUBSCRIBE: "Відписатися" - LOADING_PROCESS: "Оновлення списку тек" - CREATING_PROCESS: "Створення теки" - DELETING_PROCESS: "Видалення теки" - RENAMING_PROCESS: "Перейменування теки" - DELETING_ASK: "Впевнені?" - TO_MANY_FOLDERS_DESC_1: "You have too many folders!" - TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." - HELP_DELETE_FOLDER: "Видалити теку" - HELP_SHOW_HIDE_FOLDER: "Відобразити/приховати теку" - HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "Список акаунтів" - LEGEND_IDENTITIES: "Identities" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" - BUTTON_ADD_ACCOUNT: "Додати ще акаунт" - BUTTON_ADD_IDENTITY: "Add an Identity" - BUTTON_DELETE: "Видалити" - LOADING_PROCESS: "Оновлення списку акаунтів" - DELETING_ASK: "Впевнені?" - DEFAULT_IDENTITY_LABEL: "default" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Налаштування основного профілю" - LEGEND_IDENTITIES: "Додаткові профілі" - LABEL_DEFAULT: "Default" - LABEL_DISPLAY_NAME: "Ім'я" - LABEL_REPLY_TO: "Відповідати на" - LABEL_SIGNATURE: "Підпис" - LABEL_ADD_SIGNATURE_TO_ALL: "Додавати Ваш підпис до всіх вихідних повідомлень" - BUTTON_ADD_IDENTITY: "Додати профіль" - BUTTON_DELETE: "Видалити" - LOADING_PROCESS: "Оновлення списку профілів" - DELETING_ASK: "Впевнені?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "Змінити Пароль" - LABEL_CURRENT_PASSWORD: "Порочний пароль" - LABEL_NEW_PASSWORD: "Новий пароль" - LABEL_REPEAT_PASSWORD: "Повторити" - BUTTON_UPDATE_PASSWORD: "Встановити Новий Пароль" - ERROR_PASSWORD_MISMATCH: "Паролі не співпадають, спробуйте ще раз" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Імпортувати OpenPGP ключ" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Новий OpenPGP ключ" - TITLE_PRIVATE: "Приватний" - TITLE_PUBLIC: "Публічний" - DELETING_ASK: "Впевнені?" - GENERATE_ONLY_HTTPS: "тільки HTTPS" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Сполучення клавіш" - TAB_MAILBOX: "Пошта" - TAB_MESSAGE_LIST: "Список повідомлень" - TAB_MESSAGE_VIEW: "Перегляд повідомлень" - TAB_COMPOSE: "Написанні повідомлення" - LABEL_OPEN_USER_DROPDOWN: "Відкрити випадаючий список користувача" - LABEL_REPLY: "Відповісти" - LABEL_REPLY_ALL: "Відповісти всім" - LABEL_FORWARD: "Переслати" - LABEL_FORWARD_MULTIPLY: "Переслати всі вибрані повідомлення" - LABEL_HELP: "Допомога" - LABEL_CHECK_ALL: "Вибрати всі повідомлення" - LABEL_ARCHIVE: "Архівувати" - LABEL_DELETE: "Видалити" - LABEL_OPEN_THREAD: "Відкрити відмічене листування" - LABEL_MOVE: "Перемістити" - LABEL_READ: "Відмітити вибрані листи прочитаними" - LABEL_UNREAD: "Відмітити вибрані листи непрочитаними" - LABEL_IMPORTANT: "Відпітити вибрані листи як важливі" - LABEL_SEARCH: "Пошук" - LABEL_CANCEL_SEARCH: "Відмінити пошук" - LABEL_FULLSCREEN_ENTER: "Повноекранний режим" - LABEL_VIEW_MESSAGE_ENTER: "Перегляд повідомлення" - LABEL_SWITCH_TO_MESSAGE: "Переключити фокус на вибране повідомлення" - LABEL_SWITCH_TO_FOLDER_LIST: "Переключити фокус на список тек" - LABEL_FULLSCREEN_TOGGLE: "Переключити повноекранний режим" - LABEL_BLOCKQUOTES_TOGGLE: "Перемикання видимості цитат у листі" - LABEL_THREAD_NEXT: "Наступний лист у листуванні" - LABEL_THREAD_PREV: "Попередній лист у листуванні" - LABEL_PRINT: "Надрукувати" - LABEL_EXIT_FULLSCREEN: "Вийти з повноекранного режиму" - LABEL_CLOSE_MESSAGE: "Закрити повідомлення" - LABEL_SWITCH_TO_LIST: "Переключити фокус на список листів" - LABEL_OPEN_COMPOSE_POPUP: "Написати листа" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Вибрати відправника" - LABEL_SAVE_MESSAGE: "Зберегти повідомлення" - LABEL_SEND_MESSAGE: "Надіслати повідомлення" - LABEL_CLOSE_COMPOSE: "Закрити повідомлення" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "Публічні ключі не знайдено" - NO_PUBLIC_KEYS_FOUND_FOR: "Публічні ключі для \"%EMAIL%\" не знайдено" - NO_PRIVATE_KEY_FOUND: "Приватний ключ не знайдено" - NO_PRIVATE_KEY_FOUND_FOR: "Приватний ключ для \"%EMAIL%\" не знайдено" - ADD_A_PUBLICK_KEY: "Add a public key" - UNVERIFIRED_SIGNATURE: "Непідтверджена сигнатура" - DECRYPTION_ERROR: "OpenPGP помилка розшифрування" - GOOD_SIGNATURE: "Підтверджена сигнатура для %USER%" - PGP_ERROR: "OpenPGP помилка: %ERROR%" - SPECIFY_FROM_EMAIL: "Вкажіть поштову адресу відправника" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Вкажіть як мінімум одного отримувача" - NOTIFICATIONS: - INVALID_TOKEN: "Невірний токен запиту" - AUTH_ERROR: "Не вдалося авторизуватися" - ACCESS_ERROR: "Помилка доступу" - CONNECTION_ERROR: "Помилка з'єднання з сервером." - CAPTCHA_ERROR: "Неправильне перевірочне слово." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - До даного соціального користувача ще не прикріплений поштовий акаунт. Увійдіть - у систему під своїм поштовим акаунтом і включіть цю можливість у налаштуваннях. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - До даного соціального користувача ще не прикріплений поштовий акаунт. Увійдіть - у систему під своїм поштовим акаунтом і включіть цю можливість у налаштуваннях. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - До даного соціального користувача ще не прикріплений поштовий акаунт. Увійдіть - у систему під своїм поштовим акаунтом і включіть цю можливість у налаштуваннях. - DOMAIN_NOT_ALLOWED: "Цей домен заборонений" - ACCOUNT_NOT_ALLOWED: "Цей акаунт заборонений" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Необхідна двофакторна верификація" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Помилка двофакторної верифікації" - COULD_NOT_SAVE_NEW_PASSWORD: "Не вдалося зберегти новий пароль" - CURRENT_PASSWORD_INCORRECT: "Поточний пароль є хибним" - NEW_PASSWORD_SHORT: "Пароль надто короткий" - NEW_PASSWORD_WEAK: "Пароль надто простий" - NEW_PASSWORD_FORBIDDENT: "Пароль містить заборонені символи" - CONTACTS_SYNC_ERROR: "Помилка синхронізації контактів" - CANT_GET_MESSAGE_LIST: "Не можу отримати список листів" - CANT_GET_MESSAGE: "Не можу отримати листа" - CANT_DELETE_MESSAGE: "Не можу видалити листа" - CANT_MOVE_MESSAGE: "Не можу перемістити листа" - CANT_SAVE_MESSAGE: "Не можу зберегти листа" - CANT_SEND_MESSAGE: "Не можу відправити листа" - INVALID_RECIPIENTS: "Перевірити правильність вводу всіх адрес." - CANT_SAVE_FILTERS: "Не можу зберегти фільтри" - CANT_GET_FILTERS: "Can't get filters" - FILTERS_ARE_NOT_CORRECT: "Filters are not correct" - CANT_CREATE_FOLDER: "Не можу створити теку" - CANT_RENAME_FOLDER: "Не можу перейменувати теку" - CANT_DELETE_FOLDER: "Не можу видалити теку" - CANT_DELETE_NON_EMPTY_FOLDER: "Не можу видалити не порожню теку" - CANT_SUBSCRIBE_FOLDER: "Не можу підписати теку" - CANT_UNSUBSCRIBE_FOLDER: "Не можу відписати теку" - CANT_SAVE_SETTINGS: "Не можу зберегти налаштування" - CANT_SAVE_PLUGIN_SETTINGS: "Не можу зберегти налаштування" - DOMAIN_ALREADY_EXISTS: "Домен вже існує" - CANT_INSTALL_PACKAGE: "Помилка встановлення пакету" - CANT_DELETE_PACKAGE: "Помилка видалення пакету" - INVALID_PLUGIN_PACKAGE: "Помилка пакету плагіну" - UNSUPPORTED_PLUGIN_PACKAGE: "Для роботи плагину необхідна повна підтримка серверу" - LICENSING_SERVER_IS_UNAVAILABLE: "Сервер підписок тимчасово не доступний." - LICENSING_DOMAIN_EXPIRED: "Підписка на цей домен застаріла." - LICENSING_DOMAIN_BANNED: "Підписка на цей домен заблокована." - DEMO_SEND_MESSAGE_ERROR: "Демо акаунту надсилання листів на зовнішні поштові адреси заборонена!" - DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" - ACCOUNT_ALREADY_EXISTS: "акаунт вже додано" - MAIL_SERVER_ERROR: "Помилка доступу до поштового серверу" - INVALID_INPUT_ARGUMENT: "Invalid input argument" - UNKNOWN_ERROR: "Невідома помилка" - STATIC: - BACK_LINK: "Оновити" - DOMAIN_LIST_DESC: "Список доменів, до яких дозволено доступ через веб пошту." - PHP_EXSTENSIONS_ERROR_DESC: "Необхідні розширення PHP не встановлені на вашому сервері!" - PHP_VERSION_ERROR_DESC: "Ваша версія PHP (%VERSION%) нижче потрібної 5.3.0!" - NO_SCRIPT_TITLE: "Для роботи додатку необхідний JavaScript." - NO_SCRIPT_DESC: | - Здається, JavaScript або не підтримується вашим браузером, або вимкнений. - Увімкніть JavaScript, змінив налаштівання браузера, і спробуйте знову. - NO_COOKIE_TITLE: "Для роботи додатку необхідні Cookie." - NO_COOKIE_DESC: | - Здається, Cookie або не підтримуються вашим браузером, або вимкнені. - Увімкніть Cookie, змінив налаштівання браузера, і спробуйте знову. - BAD_BROWSER_TITLE: "Ваш браузер застарів." - BAD_BROWSER_DESC: | - Щоб використовувати всі можливості додатку, - завантажте і встановіть один з цих браузерів diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/zh_CN.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/zh_CN.yml deleted file mode 100755 index 3acbc26d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/zh_CN.yml +++ /dev/null @@ -1,708 +0,0 @@ -zh_CN: - LOGIN: - LABEL_EMAIL: "邮箱" - LABEL_LOGIN: "登入" - LABEL_PASSWORD: "密码" - LABEL_SIGN_ME: "记住我" - LABEL_VERIFICATION_CODE: "验证码" - LABEL_DONT_ASK_VERIFICATION_CODE: "在两周内不再询问密码" - BUTTON_SIGN_IN: "登陆" - TITLE_SIGN_IN_GOOGLE: "使用Google帐号登陆" - TITLE_SIGN_IN_FACEBOOK: "使用Facebook帐号登陆" - TITLE_SIGN_IN_TWITTER: "使用Twitter帐号登陆" - LABEL_FORGOT_PASSWORD: "忘记密码" - LABEL_REGISTRATION: "注册" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "添加账户" - BUTTON_SETTINGS: "设置" - BUTTON_HELP: "帮助" - BUTTON_LOGOUT: "注销" - MOBILE: - BUTTON_MOBILE_VERSION: "移动端版本" - BUTTON_DESKTOP_VERSION: "桌面端版本" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "搜索" - TITLE_ADV: "高级搜索" - LABEL_ADV_FROM: "发送自" - LABEL_ADV_TO: "发送到" - LABEL_ADV_SUBJECT: "主题" - LABEL_ADV_TEXT: "内容" - LABEL_ADV_HAS_ATTACHMENT: "带有附件" - LABEL_ADV_HAS_ATTACHMENTS: "有附件" - LABEL_ADV_FLAGGED: "标记" - LABEL_ADV_UNSEEN: "不可见" - LABEL_ADV_DATE: "日期" - LABEL_ADV_DATE_ALL: "所有邮件" - LABEL_ADV_DATE_3_DAYS: "3天以内" - LABEL_ADV_DATE_7_DAYS: "1周以内" - LABEL_ADV_DATE_MONTH: "1月以内" - LABEL_ADV_DATE_3_MONTHS: "3月以内" - LABEL_ADV_DATE_6_MONTHS: "半年以内" - LABEL_ADV_DATE_YEAR: "1年以内" - BUTTON_ADV_SEARCH: "搜索" - PREVIEW_POPUP: - FULLSCREEN: "切换全屏" - ZOOM: "放大/缩小" - CLOSE: "关闭 (Esc)" - LOADING: "加载..." - GALLERY_PREV: "向前 (左箭头键)" - GALLERY_NEXT: "向后 (右箭头键)" - GALLERY_COUNTER: "%curr% / %total%" - IMAGE_ERROR: "图片 无法加载。" - AJAX_ERROR: "内容 无法加载。" - FOLDER_LIST: - BUTTON_COMPOSE: "写邮件" - BUTTON_CONTACTS: "联系人" - BUTTON_NEW_MESSAGE: "新信息" - INBOX_NAME: "收件箱" - SENT_NAME: "已发邮件" - DRAFTS_NAME: "草稿" - SPAM_NAME: "垃圾邮件" - TRASH_NAME: "已删除邮件" - ARCHIVE_NAME: "存档" - QUOTA: - TITLE: "存储空间使用量" - MESSAGE_LIST: - BUTTON_RELOAD: "重新加载邮件列表" - BUTTON_MOVE_TO: "移至" - BUTTON_DELETE: "已删除邮件" - BUTTON_ARCHIVE: "存档" - BUTTON_SPAM: "垃圾邮件" - BUTTON_NOT_SPAM: "不是垃圾邮件" - BUTTON_EMPTY_FOLDER: "清空文件夹" - BUTTON_MULTY_FORWARD: "转发邮件" - BUTTON_DELETE_WITHOUT_MOVE: "永久删除" - BUTTON_MORE: "更多" - MENU_SET_SEEN: "标记为已读" - MENU_SET_ALL_SEEN: "标记全部为已读" - MENU_UNSET_SEEN: "标记为未读" - MENU_SET_FLAG: "加注星标" - MENU_UNSET_FLAG: "移除星标" - MENU_SELECT_ALL: "全部" - MENU_SELECT_NONE: "无" - MENU_SELECT_INVERT: "选择" - MENU_SELECT_UNSEEN: "未读" - MENU_SELECT_SEEN: "已读" - MENU_SELECT_FLAGGED: "已加星标" - MENU_SELECT_UNFLAGGED: "未加星标" - EMPTY_LIST: "空列表。" - EMPTY_SEARCH_LIST: "未找到您想要的。" - SEARCH_RESULT_FOR: "搜索 \"%SEARCH%\" 的结果" - BACK_TO_MESSAGE_LIST: "回到信息列表" - LIST_LOADING: "加载中" - EMPTY_SUBJECT_TEXT: "(无主题)" - PUT_MESSAGE_HERE: "在这里查看邮件" - TODAY_AT: "今日于 %TIME%" - YESTERDAY_AT: "昨天 %TIME%" - SEARCH_PLACEHOLDER: "搜索" - NEW_MESSAGE_NOTIFICATION: "您有 %COUNT% 封新邮件!" - QUOTA_SIZE: "使用了%LIMIT% 存储空间中的%SIZE% (%PROC%%)" - MESSAGE: - BUTTON_EDIT: "编辑" - BUTTON_BACK: "返回" - BUTTON_CLOSE: "关闭" - BUTTON_DELETE: "删除" - BUTTON_UNSUBSCRIBE: "从此列表取消订阅" - BUTTON_ARCHIVE: "存档" - BUTTON_SPAM: "垃圾邮件" - BUTTON_NOT_SPAM: "不是垃圾邮件" - BUTTON_MOVE_TO: "移至" - BUTTON_MORE: "更多" - BUTTON_REPLY: "回复" - BUTTON_REPLY_ALL: "全部回复" - BUTTON_FORWARD: "转发" - BUTTON_FORWARD_AS_ATTACHMENT: "带附件转发" - BUTTON_EDIT_AS_NEW: "Edit as New" - BUTTON_SHOW_IMAGES: "显示外部图片" - BUTTON_NOTIFY_READ_RECEIPT: "发送人请求您发送阅读回执。" - BUTTON_IN_NEW_WINDOW: "在新窗口中查看" - BUTTON_THREAD_LIST: "Thread list" - BUTTON_THREAD_PREV: "上一页" - BUTTON_THREAD_NEXT: "下一页" - BUTTON_THREAD_MORE: "更多信息" - MENU_HEADERS: "显示详细信息" - MENU_VIEW_ORIGINAL: "显示原始内容" - MENU_DOWNLOAD_ORIGINAL: "作为 .eml 文件下载" - MENU_FILTER_SIMILAR: "筛选类似邮件" - MENU_PRINT: "打印邮件" - EMPTY_SUBJECT_TEXT: "(无主题)" - LABEL_SUBJECT: "主题" - LABEL_DATE: "日期" - LABEL_FROM: "发送自" - LABEL_FROM_SHORT: "from" - LABEL_TO: "发送到" - LABEL_TO_SHORT: "to" - LABEL_CC: "抄送" - LABEL_BCC: "密送" - LABEL_REPLY_TO: "回复" - PRINT_LABEL_FROM: "发送自" - PRINT_LABEL_TO: "发送到" - PRINT_LABEL_CC: "抄送" - PRINT_LABEL_BCC: "密送" - PRINT_LABEL_REPLY_TO: "回复" - PRINT_LABEL_DATE: "日期" - PRINT_LABEL_SUBJECT: "主题" - PRINT_LABEL_ATTACHMENTS: "附件" - MESSAGE_LOADING: "加载中" - MESSAGE_VIEW_DESC: "在此查看列表中选中的邮件。" - PGP_PASSWORD_INPUT_PLACEHOLDER: "密码" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" - LINK_DOWNLOAD_AS_ZIP: "下载为zip压缩包" - LINK_SAVE_TO_OWNCLOUD: "保存到ownCloud" - LINK_SAVE_TO_DROPBOX: "保存到Dropbox" - READ_RECEIPT: - SUBJECT: "妥投回执 - %SUBJECT%" - BODY: | - 本回执表示您发送给 %READ-RECEIPT% 的邮件已妥投。 - - 注意:本回执仅意味着邮件已妥投并已在收件人的电脑中出示过,但并不能保证收件人已阅读或已明白邮件内容。 - SUGGESTIONS: - SEARCHING_DESC: "搜索中..." - CONTACTS: - LEGEND_CONTACTS: "联系人" - SEARCH_INPUT_PLACEHOLDER: "搜索" - BUTTON_ADD_CONTACT: "添加联系人" - BUTTON_CREATE_CONTACT: "新增联系人" - BUTTON_UPDATE_CONTACT: "更新联系人" - BUTTON_IMPORT: "导入 (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "导出 (vcf, vCard)" - BUTTON_EXPORT_CSV: "导出 (csv)" - ERROR_IMPORT_FILE: "导入错误 (invalid file format)" - LIST_LOADING: "加载中" - EMPTY_LIST: "暂无联系人" - EMPTY_SEARCH: "没找到联系人" - CLEAR_SEARCH: "清除搜索" - CONTACT_VIEW_DESC: "在此查看在列表中选中的联系人。" - LABEL_DISPLAY_NAME: "显示名字" - LABEL_EMAIL: "邮箱" - LABEL_PHONE: "电话" - LABEL_WEB: "网站" - LABEL_BIRTHDAY: "生日" - LINK_ADD_EMAIL: "添加 Email 地址" - LINK_ADD_PHONE: "添加电话" - LINK_BIRTHDAY: "生日" - PLACEHOLDER_ENTER_DISPLAY_NAME: "显示名称" - PLACEHOLDER_ENTER_LAST_NAME: "姓" - PLACEHOLDER_ENTER_FIRST_NAME: "名" - PLACEHOLDER_ENTER_NICK_NAME: "昵称" - LABEL_READ_ONLY: "只读" - LABEL_SHARE: "分享" - ADD_MENU_LABEL: "添加" - ADD_MENU_NICKNAME: "昵称" - ADD_MENU_NOTES: "笔记" - ADD_MENU_EMAIL: "邮箱" - ADD_MENU_PHONE: "电话" - ADD_MENU_URL: "网址" - ADD_MENU_ADDRESS: "地址" - ADD_MENU_BIRTHDAY: "生日" - ADD_MENU_TAGS: "标签" - BUTTON_SHARE_NONE: "无" - BUTTON_SHARE_ALL: "所有人" - BUTTON_SYNC: "同步 (CardDAV)" - COMPOSE: - TITLE_FROM: "发送自" - TITLE_TO: "发送到" - TITLE_CC: "抄送" - TITLE_BCC: "密送" - TITLE_REPLY_TO: "回复" - TITLE_SUBJECT: "主题" - LINK_SHOW_INPUTS: "显示所有信息" - BUTTON_SEND: "发送" - BUTTON_SAVE: "保存" - BUTTON_DELETE: "删除" - BUTTON_CANCEL: "取消" - BUTTON_MINIMIZE: "最小化" - SAVED_TIME: "保存于 %TIME%" - SAVED_ERROR_ON_SEND: "邮件已发送但并未保存在已发邮件列表中。" - DISCARD_UNSAVED_DATA: "放弃未保存的数据?" - ATTACH_FILES: "添加附件" - ATTACH_DROP_FILES_DESC: "拖动文件至此" - ATTACH_ITEM_CANCEL: "取消" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% 写到" - FORWARD_MESSAGE_TOP_TITLE: "-------- 转发邮件 -------" - FORWARD_MESSAGE_TOP_FROM: "发送自" - FORWARD_MESSAGE_TOP_TO: "发送到" - FORWARD_MESSAGE_TOP_CC: "抄送" - FORWARD_MESSAGE_TOP_SENT: "发送" - FORWARD_MESSAGE_TOP_SUBJECT: "主题" - EMPTY_TO_ERROR_DESC: "请至少选择一位接收人" - NO_ATTACHMENTS_HERE_DESC: "无附件。" - ATTACHMENTS_ERROR_DESC: "注意!还有正在上传的附件。" - ATTACHMENTS_UPLOAD_ERROR_DESC: "还有附件正在上传" - BUTTON_REQUEST_READ_RECEIPT: "要求阅读回执" - BUTTON_MARK_AS_IMPORTANT: "标记为“重要”" - BUTTON_OPEN_PGP: "OpenPGP (仅限普通文本)" - BUTTON_REQUEST_DSN: "要求妥投回执" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "关闭" - POPUPS_ASK: - BUTTON_YES: "是" - BUTTON_NO: "否" - DESC_WANT_CLOSE_THIS_WINDOW: "你确定要关闭此窗口吗?" - DESC_WANT_DELETE_MESSAGES: "你确定你要删除这条消息吗?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "选择语言" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "添加账户?" - BUTTON_ADD_ACCOUNT: "添加" - TITLE_UPDATE_ACCOUNT: "更新账户?" - BUTTON_UPDATE_ACCOUNT: "更新" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "添加签名?" - TITLE_UPDATE_IDENTITY: "更新签名?" - BUTTON_ADD_IDENTITY: "添加" - BUTTON_UPDATE_IDENTITY: "更新" - LABEL_EMAIL: "邮箱" - LABEL_NAME: "姓名" - LABEL_REPLY_TO: "回复" - LABEL_SIGNATURE: "签名" - LABEL_CC: "Cc" - LABEL_BCC: "密送" - LABEL_SIGNATURE_INSERT_BEFORE: "在回信中插入签名再引用来信。" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "创建文件夹?" - LABEL_NAME: "文件夹名称" - LABEL_PARENT: "父文件夹" - BUTTON_CREATE: "创建" - BUTTON_CANCEL: "取消" - BUTTON_CLOSE: "关闭" - TITLE_CREATING_PROCESS: "文件夹创建中" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "清理文件夹中所有邮件?" - BUTTON_CLEAR: "清理" - BUTTON_CANCEL: "取消" - BUTTON_CLOSE: "关闭" - DANGER_DESC_WARNING: "警告!" - DANGER_DESC_HTML_1: "此操作将完全删除文件夹 %FOLDER% 中的所有邮件!" - DANGER_DESC_HTML_2: "一旦操作执行,不可中断和撤销!" - TITLE_CLEARING_PROCESS: "文件夹清理中..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "导入 OpenPGP 密匙" - BUTTON_IMPORT_OPEN_PGP_KEY: "导入" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "查看 OpenPGP 密匙" - BUTTON_SELECT: "选择" - BUTTON_CLOSE: "关闭" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "生成 OpenPGP 密匙" - LABEL_EMAIL: "邮箱" - LABEL_NAME: "名字" - LABEL_PASSWORD: "密码" - LABEL_KEY_BIT_LENGTH: "密匙长度" - BUTTON_GENERATE_OPEN_PGP_KEYS: "生成" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP 签名/加密" - LABEL_SIGN: "签名" - LABEL_ENCRYPT: "加密" - LABEL_PASSWORD: "密码" - BUTTON_SIGN: "签名" - BUTTON_ENCRYPT: "加密" - BUTTON_SIGN_AND_ENCRYPT: "签名加密" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP 解密" - LABEL_KEY: "私钥" - LABEL_PASSWORD: "密码" - BUTTON_DECRYPT: "解密" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "两步验证测试" - LABEL_CODE: "代码" - BUTTON_TEST: "测试" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "创建筛选条件?" - TITLE_EDIT_FILTER: "更新筛选条件?" - FILTER_NAME: "名字" - LEGEND_CONDITIONS: "条件" - LEGEND_ACTIONS: "操作" - BUTTON_DONE: "完成" - BUTTON_ADD_CONDITION: "添加条件" - SELECT_ACTION_NONE: "无操作" - SELECT_ACTION_MOVE_TO: "移动到" - SELECT_ACTION_FORWARD_TO: "转发到" - SELECT_ACTION_REJECT: "拒收" - SELECT_ACTION_VACATION_MESSAGE: "假期自动回复" - SELECT_ACTION_DISCARD: "取消" - SELECT_FIELD_FROM: "发送自" - SELECT_FIELD_RECIPIENTS: "接收人 (To 或 CC)" - SELECT_FIELD_SUBJECT: "主题" - SELECT_FIELD_HEADER: "标题" - SELECT_FIELD_SIZE: "大小" - SELECT_TYPE_CONTAINS: "包含" - SELECT_TYPE_NOT_CONTAINS: "不包含" - SELECT_TYPE_MATCHES: "满足条件 (可用通配符 * 或 ?)" - SELECT_TYPE_NOT_MATCHES: "不满足条件 (可用通配符 * and ?)" - SELECT_TYPE_REGEXP: "正则表达式" - SELECT_TYPE_NOT_REGEXP: "无正则表达式" - SELECT_TYPE_EQUAL_TO: "等于" - SELECT_TYPE_NOT_EQUAL_TO: "不等于" - SELECT_TYPE_OVER: "超过" - SELECT_TYPE_UNDER: "不超过" - SELECT_MATCH_ANY: "满足下列任何条件" - SELECT_MATCH_ALL: "满足下列所有条件" - MARK_AS_READ_LABEL: "标记为已读" - REPLY_INTERVAL_LABEL: "答复间隔 (天) " - KEEP_LABEL: "Keep" - STOP_LABEL: "Don't stop processing rules" - EMAIL_LABEL: "Email" - VACATION_SUBJECT_LABEL: "Subject (optional)" - VACATION_MESSAGE_LABEL: "Message" - VACATION_RECIPIENTS_LABEL: "收件人 (半角逗号“,”分隔)" - REJECT_MESSAGE_LABEL: "拒收邮件" - ALL_INCOMING_MESSAGES_DESC: "所有来信" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "选择系统文件夹" - SELECT_CHOOSE_ONE: "选择一个" - SELECT_UNUSE_NAME: "不使用" - LABEL_SENT: "已发邮件" - LABEL_DRAFTS: "草稿" - LABEL_SPAM: "垃圾邮件" - LABEL_TRASH: "已删除邮件" - LABEL_ARCHIVE: "存档" - BUTTON_CANCEL: "取消" - BUTTON_CLOSE: "关闭" - NOTIFICATION_SENT: | - 您没有选择 已发邮件 文件夹来存储已发送邮件。 - 如果您不希望保存已发邮件,请选择 不使用 选项。 - NOTIFICATION_DRAFTS: "您没有选择 草稿 文件夹来存储邮件草稿。" - NOTIFICATION_SPAM: | - 您没有选择 垃圾邮件 文件夹来存储垃圾邮件。 - 如果您希望永久删除邮件,请选择 不使用 选项。 - NOTIFICATION_TRASH: | - 您没有选择 已删除邮件 文件夹来存储垃圾邮件。 - 如果您希望永久删除邮件,请选择 不使用 选项。 - NOTIFICATION_ARCHIVE: "您没有选择“已归档邮件”文件夹来存储归档邮件。" - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "两步验证" - LABEL_ENABLE_TWO_FACTOR: "启用两步验证" - LABEL_TWO_FACTOR_USER: "用户" - LABEL_TWO_FACTOR_STATUS: "状态" - LABEL_TWO_FACTOR_SECRET: "密钥" - LABEL_TWO_FACTOR_BACKUP_CODES: "备份代码" - BUTTON_CREATE: "创建新密钥" - BUTTON_ACTIVATE: "已启用" - BUTTON_CLEAR: "清除" - BUTTON_LOGOUT: "登出" - BUTTON_DONE: "完成" - BUTTON_TEST: "测试" - LINK_TEST: "测试" - BUTTON_SHOW_SECRET: "显示密钥" - BUTTON_HIDE_SECRET: "隐藏密钥" - TWO_FACTOR_REQUIRE_DESC: "您的账户需要设置两步验证。" - TWO_FACTOR_SECRET_CONFIGURED_DESC: "已设置" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "未设置" - TWO_FACTOR_SECRET_DESC: >- - Import this info into your Google Authenticator client (or other TOTP client) - using the provided QR code below or by entering the code manually. - TWO_FACTOR_BACKUP_CODES_DESC: >- - If you can't receive codes via Google Authenticator, you can use backup codes - to sign in. After you’ve used a backup code to sign in, it will become inactive. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." - TITLES: - LOADING: "加载中" - LOGIN: "登陆" - MAILBOX: "邮箱" - SETTINGS: "设置" - COMPOSE: "写邮件" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "文件太大" - ERROR_FILE_PARTIALLY_UPLOADED: "遭遇未知错误,文件部分上传" - ERROR_NO_FILE_UPLOADED: "没有文件上传" - ERROR_MISSING_TEMP_FOLDER: "临时文件丢失" - ERROR_ON_SAVING_FILE: "遭遇未知错误" - ERROR_FILE_TYPE: "无效文件类型" - ERROR_UNKNOWN: "未知文件上传错误" - EDITOR: - TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" - TEXT_SWITCHER_RICH_FORMATTING: "富文本" - TEXT_SWITCHER_CONFIRM: "文件格式及图片将丢失,您确定继续这么做?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "个人" - LABEL_GENERAL_NAME: "一般设置" - LABEL_CONTACTS_NAME: "联系人" - LABEL_FOLDERS_NAME: "文件夹" - LABEL_ACCOUNTS_NAME: "账户" - LABEL_IDENTITY_NAME: "签名" - LABEL_IDENTITIES_NAME: "签名" - LABEL_FILTERS_NAME: "筛选条件" - LABEL_TEMPLATES_NAME: "模版" - LABEL_SECURITY_NAME: "安全" - LABEL_SOCIAL_NAME: "社交" - LABEL_THEMES_NAME: "主题" - LABEL_CHANGE_PASSWORD_NAME: "密码" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "返回" - SETTINGS_FILTERS: - LEGEND_FILTERS: "筛选器" - BUTTON_SAVE: "保存" - BUTTON_ADD_FILTER: "添加筛选条件" - BUTTON_DELETE: "删除" - BUTTON_RAW_SCRIPT: "使用自定义脚本" - SUBNAME_NONE: "无" - SUBNAME_MOVE_TO: "移动到 \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "转发到 \"%EMAIL%\"" - SUBNAME_REJECT: "拒绝" - SUBNAME_VACATION_MESSAGE: "假期自动回复" - SUBNAME_DISCARD: "取消" - CAPABILITY_LABEL: "Capability" - LOADING_PROCESS: "正在更新筛选规则列表" - DELETING_ASK: "确定删除?" - CHACHES_NEED_TO_BE_SAVED_DESC: "这些更改需要保存。" - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "签名" - LABEL_DISPLAY_NAME: "名称" - LABEL_REPLY_TO: "回复" - LABEL_SIGNATURE: "签名" - LABEL_ADD_SIGNATURE_TO_ALL: "发送邮件时均附加签名" - SETTINGS_SECURITY: - LEGEND_SECURITY: "安全" - LABEL_CONFIGURE_TWO_FACTOR: "配置两步验证" - LABEL_AUTOLOGOUT: "自动登出" - AUTOLOGIN_NEVER_OPTION_NAME: "从不" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% 分钟" - AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS%小时" - SETTINGS_GENERAL: - LEGEND_GENERAL: "一般设置" - LABEL_LANGUAGE: "语言" - LABEL_IDENTITY: "Identity" - LABEL_LAYOUT: "布局" - LABEL_LAYOUT_NO_SPLIT: "不分隔" - LABEL_LAYOUT_VERTICAL_SPLIT: "垂直分隔" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "水平分隔" - LABEL_EDITOR: "默认格式" - LABEL_EDITOR_HTML: "Html文本" - LABEL_EDITOR_PLAIN: "普通文本" - LABEL_EDITOR_HTML_FORCED: "强制HTML文本" - LABEL_EDITOR_PLAIN_FORCED: "强制普通文本" - LABEL_ANIMATION: "界面动画" - LABEL_ANIMATION_FULL: "完整" - LABEL_ANIMATION_NORMAL: "正常" - LABEL_ANIMATION_NONE: "无" - LABEL_VIEW_OPTIONS: "视图选项" - LABEL_USE_PREVIEW_PANE: "使用预览" - LABEL_USE_CHECKBOXES_IN_LIST: "列表中显示多选框" - LABEL_USE_THREADS: "使用对话" - LABEL_REPLY_SAME_FOLDER: "将回复的邮件放置到其回复的邮件所在文件夹" - LABEL_SHOW_IMAGES: "总是显示外部图片信息" - LABEL_SHOW_ANIMATION: "显示动画" - LABEL_MESSAGE_PER_PAGE: "封邮件每页" - LABEL_NOTIFICATIONS: "通知" - LABEL_SOUND_NOTIFICATION: "提示音" - LABEL_CHROME_NOTIFICATION_DESC: "显示新邮件弹窗" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(被浏览器阻止)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "联系人" - LABEL_CONTACTS_AUTOSAVE: "自动添加到你的地址簿" - LEGEND_CONTACTS_SYNC: "远程同步(CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "启用远程同步" - LABEL_CONTACTS_SYNC_SERVER: "服务器" - LABEL_CONTACTS_SYNC_AB_URL: "地址簿URL" - LABEL_CONTACTS_SYNC_USER: "用户名" - LABEL_CONTACTS_SYNC_PASSWORD: "密码" - SETTINGS_THEMES: - LEGEND_THEMES: "主题" - LEGEND_THEMES_CUSTOM: "自定义主题设置" - LABEL_CUSTOM_TYPE: "类型" - LABEL_CUSTOM_TYPE_LIGHT: "明亮" - LABEL_CUSTOM_TYPE_DARK: "暗沉" - LABEL_CUSTOM_BACKGROUND_IMAGE: "背景" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "上传背景 (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "文件太大" - ERROR_FILE_TYPE_ERROR: "无效类型 (只支持JPG和PNG)" - ERROR_UNKNOWN: "上传时发生未知错误" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "谷歌" - BUTTON_GOOGLE_CONNECT: "连接到 Google" - BUTTON_GOOGLE_DISCONNECT: "断开 Google 连接" - MAIN_GOOGLE_DESC: "After enabling login via Google, you can log into this account using Google button on the login screen." - LEGEND_FACEBOOK: "非死不可" - BUTTON_FACEBOOK_CONNECT: "连接到 Facebook" - BUTTON_FACEBOOK_DISCONNECT: "断开 Facebook 链接" - MAIN_FACEBOOK_DESC: "After enabling login via Facebook, you can log into this account using Facebook button on the login screen." - LEGEND_TWITTER: "推特" - BUTTON_TWITTER_CONNECT: "连接到 Twitter" - BUTTON_TWITTER_DISCONNECT: "断开 Twitter 连接" - MAIN_TWITTER_DESC: "After enabling login via Twitter, you can log into this account using Twitter button on the login screen." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "文件夹" - BUTTON_CREATE: "新建文件夹" - BUTTON_SYSTEM: "系统文件夹" - BUTTON_DELETE: "删除" - BUTTON_SUBSCRIBE: "订阅" - BUTTON_UNSUBSCRIBE: "取消订阅" - LOADING_PROCESS: "文件夹列表更新" - CREATING_PROCESS: "文件夹创建中" - DELETING_PROCESS: "文件夹删除中" - RENAMING_PROCESS: "文件夹重命名" - DELETING_ASK: "确定?" - TO_MANY_FOLDERS_DESC_1: "文件夹数量已达上限!" - TO_MANY_FOLDERS_DESC_2: "为避免性能问题,暂时只显示部分(文件夹)。" - HELP_DELETE_FOLDER: "删除文件夹" - HELP_SHOW_HIDE_FOLDER: "显示/隐藏文件夹" - HELP_CHECK_FOR_NEW_MESSAGES: "检查/不检查新邮件" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "账户列表" - LEGEND_IDENTITIES: "Identities" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" - BUTTON_ADD_ACCOUNT: "添加一个账户" - BUTTON_ADD_IDENTITY: "Add an Identity" - BUTTON_DELETE: "删除" - LOADING_PROCESS: "更新账户列表中" - DELETING_ASK: "确定?" - DEFAULT_IDENTITY_LABEL: "默认" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "签名" - LEGEND_IDENTITIES: "附加签名" - LABEL_DEFAULT: "默认" - LABEL_DISPLAY_NAME: "名称" - LABEL_REPLY_TO: "回复" - LABEL_SIGNATURE: "签名" - LABEL_ADD_SIGNATURE_TO_ALL: "发送的所有邮件均附加签名" - BUTTON_ADD_IDENTITY: "添加签名" - BUTTON_DELETE: "删除" - LOADING_PROCESS: "更新签名中" - DELETING_ASK: "确定?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "修改密码" - LABEL_CURRENT_PASSWORD: "当前密码" - LABEL_NEW_PASSWORD: "新密码" - LABEL_REPEAT_PASSWORD: "再次新密码" - BUTTON_UPDATE_PASSWORD: "设置新密码" - ERROR_PASSWORD_MISMATCH: "密码不匹配,请再试一次" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "导入 OpenPGP 密匙" - BUTTON_GENERATE_OPEN_PGP_KEYS: "生成 OpenPGP 密匙" - TITLE_PRIVATE: "私有" - TITLE_PUBLIC: "公开" - DELETING_ASK: "你确定吗?" - GENERATE_ONLY_HTTPS: "仅限HTTPS" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "快捷键说明" - TAB_MAILBOX: "邮箱目录" - TAB_MESSAGE_LIST: "邮件列表" - TAB_MESSAGE_VIEW: "邮件视图" - TAB_COMPOSE: "撰写" - LABEL_OPEN_USER_DROPDOWN: "打开用户菜单" - LABEL_REPLY: "回复" - LABEL_REPLY_ALL: "回复所有" - LABEL_FORWARD: "转发" - LABEL_FORWARD_MULTIPLY: "转发所有" - LABEL_HELP: "帮助" - LABEL_CHECK_ALL: "检查所有消息" - LABEL_ARCHIVE: "存档" - LABEL_DELETE: "删除" - LABEL_OPEN_THREAD: "打开选定的邮件往来" - LABEL_MOVE: "移动" - LABEL_READ: "将选定的邮件标记为“已读”" - LABEL_UNREAD: "将选定的邮件标记为“未读”" - LABEL_IMPORTANT: "将选定的邮件标记为“重要”" - LABEL_SEARCH: "搜索" - LABEL_CANCEL_SEARCH: "取消搜索" - LABEL_FULLSCREEN_ENTER: "全屏邮件阅读窗格" - LABEL_VIEW_MESSAGE_ENTER: "取消全屏邮件阅读窗格" - LABEL_SWITCH_TO_MESSAGE: "切换邮件阅读窗格" - LABEL_SWITCH_TO_FOLDER_LIST: "切换邮件阅读窗格" - LABEL_FULLSCREEN_TOGGLE: "全屏窗格切换" - LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" - LABEL_THREAD_NEXT: "下一封往来邮件" - LABEL_THREAD_PREV: "上一封往来邮件" - LABEL_PRINT: "打印" - LABEL_EXIT_FULLSCREEN: "退出全屏模式" - LABEL_CLOSE_MESSAGE: "关闭独立邮件阅读窗格" - LABEL_SWITCH_TO_LIST: "切换到邮件列表" - LABEL_OPEN_COMPOSE_POPUP: "打开撰写窗格" - LABEL_MINIMIZE_COMPOSE_POPUP: "最小化撰写窗格" - LABEL_OPEN_IDENTITIES_DROPDOWN: "打开账户管理窗格" - LABEL_SAVE_MESSAGE: "保存邮件" - LABEL_SEND_MESSAGE: "发送邮件" - LABEL_CLOSE_COMPOSE: "退出撰写" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "无法找到公钥" - NO_PUBLIC_KEYS_FOUND_FOR: "无法找到 \\\"%EMAIL%\\\" 的公钥" - NO_PRIVATE_KEY_FOUND: "无法找到私钥" - NO_PRIVATE_KEY_FOUND_FOR: "无法找到 \\\"%EMAIL%\\\" 的私钥" - ADD_A_PUBLICK_KEY: "添加公钥" - SELECT_A_PRIVATE_KEY: "选择一个私钥" - UNVERIFIRED_SIGNATURE: "未验证的签名" - DECRYPTION_ERROR: "OpenPGP 解密出错" - GOOD_SIGNATURE: "来自 %USER% 的可用签名" - PGP_ERROR: "OpenPGP 错误: %ERROR%" - SPECIFY_FROM_EMAIL: "请指定发件人电邮地址" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "请指定至少一个收件人地址" - NOTIFICATIONS: - INVALID_TOKEN: "无效标记" - AUTH_ERROR: "认证失败" - ACCESS_ERROR: "访问错误" - CONNECTION_ERROR: "无法连接服务器" - CAPTCHA_ERROR: "验证码不正确。" - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - DOMAIN_NOT_ALLOWED: "域不允许" - ACCOUNT_NOT_ALLOWED: "账户不允许" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "需要进行两步验证" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "两步验证错误" - COULD_NOT_SAVE_NEW_PASSWORD: "无法保存新密码" - CURRENT_PASSWORD_INCORRECT: "当前密码不正确" - NEW_PASSWORD_SHORT: "密码太短" - NEW_PASSWORD_WEAK: "密码过于简单" - NEW_PASSWORD_FORBIDDENT: "密码包含禁止字符" - CONTACTS_SYNC_ERROR: "联系人同步错误" - CANT_GET_MESSAGE_LIST: "无法获取邮件列表" - CANT_GET_MESSAGE: "无法获取邮件" - CANT_DELETE_MESSAGE: "无法删除邮件" - CANT_MOVE_MESSAGE: "无法移动邮件" - CANT_SAVE_MESSAGE: "无法保存邮件" - CANT_SEND_MESSAGE: "无法发送邮件" - INVALID_RECIPIENTS: "无效接收人" - CANT_SAVE_FILTERS: "无法保存筛选器规则" - CANT_GET_FILTERS: "无法获取筛选器规则" - FILTERS_ARE_NOT_CORRECT: "不正确的筛选器规则" - CANT_CREATE_FOLDER: "无法创建文件夹" - CANT_RENAME_FOLDER: "无法重命名文件夹" - CANT_DELETE_FOLDER: "无法删除文件夹" - CANT_DELETE_NON_EMPTY_FOLDER: "无法删除非空文件夹" - CANT_SUBSCRIBE_FOLDER: "无法订阅文件夹" - CANT_UNSUBSCRIBE_FOLDER: "无法取消订阅文件夹" - CANT_SAVE_SETTINGS: "无法保存设置" - CANT_SAVE_PLUGIN_SETTINGS: "无法保存设置" - DOMAIN_ALREADY_EXISTS: "域已经存在" - CANT_INSTALL_PACKAGE: "安装包失败" - CANT_DELETE_PACKAGE: "移除包失败" - INVALID_PLUGIN_PACKAGE: "无效插件" - UNSUPPORTED_PLUGIN_PACKAGE: "不支持的插件" - LICENSING_SERVER_IS_UNAVAILABLE: "订阅服务器无效" - LICENSING_DOMAIN_EXPIRED: "此域订阅服务已失效。" - LICENSING_DOMAIN_BANNED: "此域订阅服务已禁止。" - DEMO_SEND_MESSAGE_ERROR: "出于安全考虑,测试账号无法发送外部邮件。" - DEMO_ACCOUNT_ERROR: "由于安保原因,本账号无法进行此操作!" - ACCOUNT_ALREADY_EXISTS: "账户已存在" - ACCOUNT_DOES_NOT_EXIST: "账户不存在" - MAIL_SERVER_ERROR: "访问邮件服务器遇到错误。" - INVALID_INPUT_ARGUMENT: "无效的参数输入" - UNKNOWN_ERROR: "未知错误" - STATIC: - BACK_LINK: "重新加载" - DOMAIN_LIST_DESC: "可以通过webmail访问的域列表" - PHP_EXSTENSIONS_ERROR_DESC: "需要的PHP扩展未配置!" - PHP_VERSION_ERROR_DESC: "您的PHP版本 (%VERSION%) 低于所需的 5.3.0!" - NO_SCRIPT_TITLE: "JavaScript 需要启用!" - NO_SCRIPT_DESC: | - 您的浏览器不支持JavaScript。 - 请启用浏览器的JavaScript支持并重试。 - NO_COOKIE_TITLE: "Cookies 需要启用!" - NO_COOKIE_DESC: | - 您的浏览器不支持Cookies。 - 请启用浏览器的Cookies支持并重试。 - BAD_BROWSER_TITLE: "您的浏览器版本太低" - BAD_BROWSER_DESC: | - 如果想使用所有功能, - 下载并安装下列其中一款浏览器: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/zh_TW.yml b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/zh_TW.yml deleted file mode 100755 index 82bae7f8..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/localization/webmail/zh_TW.yml +++ /dev/null @@ -1,697 +0,0 @@ -zh_TW: - LOGIN: - LABEL_EMAIL: "郵件" - LABEL_LOGIN: "登錄" - LABEL_PASSWORD: "密碼" - LABEL_SIGN_ME: "記住我" - LABEL_VERIFICATION_CODE: "驗證碼" - LABEL_DONT_ASK_VERIFICATION_CODE: "Don't ask for the code for 2 weeks" - BUTTON_SIGN_IN: "登入" - TITLE_SIGN_IN_GOOGLE: "使用Google帳號登錄" - TITLE_SIGN_IN_FACEBOOK: "使用Facebook帳號登錄" - TITLE_SIGN_IN_TWITTER: "使用Twitter帳號登錄" - LABEL_FORGOT_PASSWORD: "Forgot password" - LABEL_REGISTRATION: "Registration" - TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "添加帳戶" - BUTTON_SETTINGS: "設置" - BUTTON_HELP: "Help" - BUTTON_LOGOUT: "註銷" - SEARCH: - MAIN_INPUT_PLACEHOLDER: "搜索" - TITLE_ADV: "高級搜索" - LABEL_ADV_FROM: "發送自" - LABEL_ADV_TO: "發送到" - LABEL_ADV_SUBJECT: "主題" - LABEL_ADV_TEXT: "內容" - LABEL_ADV_HAS_ATTACHMENT: "有附件" - LABEL_ADV_HAS_ATTACHMENTS: "有附件" - LABEL_ADV_FLAGGED: "標記" - LABEL_ADV_UNSEEN: "Unseen" - LABEL_ADV_DATE: "日期" - LABEL_ADV_DATE_ALL: "所有郵件" - LABEL_ADV_DATE_3_DAYS: "3天以內" - LABEL_ADV_DATE_7_DAYS: "1周以內" - LABEL_ADV_DATE_MONTH: "1月以內" - LABEL_ADV_DATE_3_MONTHS: "3月以內" - LABEL_ADV_DATE_6_MONTHS: "半年以內" - LABEL_ADV_DATE_YEAR: "1年以內" - BUTTON_ADV_SEARCH: "搜索" - PREVIEW_POPUP: - FULLSCREEN: "Toggle fullscreen" - ZOOM: "Zoom in/out" - CLOSE: "關閉 (Esc)" - LOADING: "載入..." - GALLERY_PREV: "向前 (Left arrow key)" - GALLERY_NEXT: "向後 (Right arrow key)" - GALLERY_COUNTER: "%curr% / %total%" - IMAGE_ERROR: "圖片 無法載入。" - AJAX_ERROR: "內容 無法載入。" - FOLDER_LIST: - BUTTON_COMPOSE: "寫郵件" - BUTTON_CONTACTS: "連絡人" - INBOX_NAME: "收件箱" - SENT_NAME: "已發郵件" - DRAFTS_NAME: "草稿" - SPAM_NAME: "垃圾郵件" - TRASH_NAME: "已刪除郵件" - ARCHIVE_NAME: "存檔" - QUOTA: - TITLE: "存儲空間使用量" - MESSAGE_LIST: - BUTTON_RELOAD: "重新載入郵寄清單" - BUTTON_MOVE_TO: "移至" - BUTTON_DELETE: "已刪除郵件" - BUTTON_ARCHIVE: "存檔" - BUTTON_SPAM: "垃圾郵件" - BUTTON_NOT_SPAM: "Not Spam" - BUTTON_EMPTY_FOLDER: "清空資料夾" - BUTTON_MULTY_FORWARD: "轉發郵件" - BUTTON_DELETE_WITHOUT_MOVE: "永久刪除" - BUTTON_MORE: "更多" - MENU_SET_SEEN: "標記為已讀" - MENU_SET_ALL_SEEN: "標記全部為已讀" - MENU_UNSET_SEEN: "標記為未讀" - MENU_SET_FLAG: "加注星標" - MENU_UNSET_FLAG: "移除星標" - MENU_SELECT_ALL: "全部" - MENU_SELECT_NONE: "無" - MENU_SELECT_INVERT: "選擇" - MENU_SELECT_UNSEEN: "未讀" - MENU_SELECT_SEEN: "已讀" - MENU_SELECT_FLAGGED: "已加星標" - MENU_SELECT_UNFLAGGED: "未加星標" - EMPTY_LIST: "空列表。" - EMPTY_SEARCH_LIST: "未找到您想要的。" - SEARCH_RESULT_FOR: "搜索 \"%SEARCH%\" 的結果" - BACK_TO_MESSAGE_LIST: "back to message list" - LIST_LOADING: "載入中" - EMPTY_SUBJECT_TEXT: "(無主題)" - PUT_MESSAGE_HERE: "在這裡查看郵件" - TODAY_AT: "今日於 %TIME%" - YESTERDAY_AT: "昨天 %TIME%" - SEARCH_PLACEHOLDER: "搜索" - NEW_MESSAGE_NOTIFICATION: "您有 %COUNT% 封新郵件!" - QUOTA_SIZE: "使用了%LIMIT% 存儲空間中的%SIZE% (%PROC%%)" - MESSAGE: - BUTTON_EDIT: "編輯" - BUTTON_BACK: "返回" - BUTTON_CLOSE: "關閉" - BUTTON_DELETE: "刪除" - BUTTON_ARCHIVE: "存檔" - BUTTON_SPAM: "垃圾郵件" - BUTTON_NOT_SPAM: "Not Spam" - BUTTON_MOVE_TO: "移至" - BUTTON_MORE: "更多" - BUTTON_REPLY: "回復" - BUTTON_REPLY_ALL: "全部回復" - BUTTON_FORWARD: "轉發" - BUTTON_FORWARD_AS_ATTACHMENT: "帶附件轉發" - BUTTON_EDIT_AS_NEW: "Edit as New" - BUTTON_SHOW_IMAGES: "顯示外部圖片" - BUTTON_NOTIFY_READ_RECEIPT: "The sender has asked to be notified when you read this message." - BUTTON_IN_NEW_WINDOW: "在新窗口中查看" - BUTTON_THREAD_LIST: "Thread list" - BUTTON_THREAD_PREV: "Previous" - BUTTON_THREAD_NEXT: "Next" - BUTTON_THREAD_MORE: "More messages" - MENU_HEADERS: "顯示詳細資訊" - MENU_VIEW_ORIGINAL: "顯示原始內容" - MENU_DOWNLOAD_ORIGINAL: "作為 .eml 文件下載" - MENU_FILTER_SIMILAR: "過濾郵件如此" - MENU_PRINT: "列印郵件" - EMPTY_SUBJECT_TEXT: "(無主題)" - LABEL_SUBJECT: "主題" - LABEL_DATE: "日期" - LABEL_FROM: "發送自" - LABEL_FROM_SHORT: "from" - LABEL_TO: "發送到" - LABEL_TO_SHORT: "to" - LABEL_CC: "複本" - LABEL_BCC: "密件複本" - LABEL_REPLY_TO: "Reply-To" - PRINT_LABEL_FROM: "發送自" - PRINT_LABEL_TO: "發送到" - PRINT_LABEL_CC: "複本" - PRINT_LABEL_BCC: "密件複本" - PRINT_LABEL_REPLY_TO: "Reply-To" - PRINT_LABEL_DATE: "日期" - PRINT_LABEL_SUBJECT: "主題" - PRINT_LABEL_ATTACHMENTS: "附件" - MESSAGE_LOADING: "載入中" - MESSAGE_VIEW_DESC: "在此查看列表中選中的郵件。" - PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" - LINK_DOWNLOAD_AS_ZIP: "Download as zip" - LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" - LINK_SAVE_TO_DROPBOX: "Save to Dropbox" - READ_RECEIPT: - SUBJECT: "Return Receipt (displayed) - %SUBJECT%" - BODY: | - This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. - - Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. - There is no guarantee that the recipient has read or understood the message contents. - SUGGESTIONS: - SEARCHING_DESC: "搜索中..." - CONTACTS: - LEGEND_CONTACTS: "連絡人" - SEARCH_INPUT_PLACEHOLDER: "搜索" - BUTTON_ADD_CONTACT: "添加連絡人" - BUTTON_CREATE_CONTACT: "新增連絡人" - BUTTON_UPDATE_CONTACT: "更新連絡人" - BUTTON_IMPORT: "導入 (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "匯出 (vcf, vCard)" - BUTTON_EXPORT_CSV: "匯出 (csv)" - ERROR_IMPORT_FILE: "導入錯誤 (invalid file format)" - LIST_LOADING: "載入中" - EMPTY_LIST: "暫無連絡人" - EMPTY_SEARCH: "沒找到連絡人" - CLEAR_SEARCH: "清除搜索" - CONTACT_VIEW_DESC: "在此查看在列表中選中的連絡人。" - LABEL_DISPLAY_NAME: "顯示名字" - LABEL_EMAIL: "Email" - LABEL_PHONE: "電話" - LABEL_WEB: "網站" - LABEL_BIRTHDAY: "生日" - LINK_ADD_EMAIL: "添加 Email 地址" - LINK_ADD_PHONE: "添加電話" - LINK_BIRTHDAY: "生日" - PLACEHOLDER_ENTER_DISPLAY_NAME: "顯示名稱" - PLACEHOLDER_ENTER_LAST_NAME: "姓" - PLACEHOLDER_ENTER_FIRST_NAME: "名" - PLACEHOLDER_ENTER_NICK_NAME: "昵稱" - LABEL_READ_ONLY: "Read only" - LABEL_SHARE: "分享" - ADD_MENU_LABEL: "添加" - ADD_MENU_NICKNAME: "暱稱" - ADD_MENU_NOTES: "Notes" - ADD_MENU_EMAIL: "Email" - ADD_MENU_PHONE: "電話" - ADD_MENU_URL: "網址" - ADD_MENU_ADDRESS: "地址" - ADD_MENU_BIRTHDAY: "生日" - ADD_MENU_TAGS: "Tags" - BUTTON_SHARE_NONE: "無" - BUTTON_SHARE_ALL: "所有人" - BUTTON_SYNC: "同步 (CardDAV)" - COMPOSE: - TITLE_FROM: "發送自" - TITLE_TO: "發送到" - TITLE_CC: "複本" - TITLE_BCC: "密件複本" - TITLE_REPLY_TO: "回復" - TITLE_SUBJECT: "主題" - LINK_SHOW_INPUTS: "顯示所有資訊" - BUTTON_SEND: "發送" - BUTTON_SAVE: "保存" - BUTTON_DELETE: "刪除" - BUTTON_CANCEL: "取消" - BUTTON_MINIMIZE: "Minimize" - SAVED_TIME: "保存於 %TIME%" - SAVED_ERROR_ON_SEND: "郵件已發送但並未保存在已發郵寄清單中。" - DISCARD_UNSAVED_DATA: "Discard unsaved data?" - ATTACH_FILES: "添加附件" - ATTACH_DROP_FILES_DESC: "拖動文件至此" - ATTACH_ITEM_CANCEL: "取消" - DROPBOX: "Dropbox" - GOOGLE_DRIVE: "Google Drive" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% 寫到" - FORWARD_MESSAGE_TOP_TITLE: "-------- 轉發郵件 -------" - FORWARD_MESSAGE_TOP_FROM: "發送自" - FORWARD_MESSAGE_TOP_TO: "發送到" - FORWARD_MESSAGE_TOP_CC: "複本" - FORWARD_MESSAGE_TOP_SENT: "發送" - FORWARD_MESSAGE_TOP_SUBJECT: "主題" - EMPTY_TO_ERROR_DESC: "請至少選擇一位接收人" - NO_ATTACHMENTS_HERE_DESC: "No attachments here." - ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet" - BUTTON_REQUEST_READ_RECEIPT: "Request a read receipt" - BUTTON_MARK_AS_IMPORTANT: "Mark as important" - BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" - BUTTON_REQUEST_DSN: "Request a delivery receipt" - POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Close" - POPUPS_ASK: - BUTTON_YES: "是" - BUTTON_NO: "否" - DESC_WANT_CLOSE_THIS_WINDOW: "你確定要關閉此窗口嗎?" - DESC_WANT_DELETE_MESSAGES: "你確定你要刪除這條消息嗎?" - POPUPS_LANGUAGES: - TITLE_LANGUAGES: "選擇語言" - POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "添加帳戶?" - BUTTON_ADD_ACCOUNT: "添加" - TITLE_UPDATE_ACCOUNT: "Update Account?" - BUTTON_UPDATE_ACCOUNT: "Update" - POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "添加簽名?" - TITLE_UPDATE_IDENTITY: "更新簽名?" - BUTTON_ADD_IDENTITY: "添加" - BUTTON_UPDATE_IDENTITY: "更新" - LABEL_EMAIL: "Email" - LABEL_NAME: "姓名" - LABEL_REPLY_TO: "回復" - LABEL_SIGNATURE: "Signature" - LABEL_CC: "Cc" - LABEL_BCC: "密件複本" - LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" - POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "創建資料夾?" - LABEL_NAME: "資料夾名稱" - LABEL_PARENT: "父資料夾" - BUTTON_CREATE: "創建" - BUTTON_CANCEL: "取消" - BUTTON_CLOSE: "關閉" - TITLE_CREATING_PROCESS: "資料夾創建中" - POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "清理資料夾中所有郵件?" - BUTTON_CLEAR: "清理" - BUTTON_CANCEL: "取消" - BUTTON_CLOSE: "關閉" - DANGER_DESC_WARNING: "警告!" - DANGER_DESC_HTML_1: "此操作將完全刪除資料夾 %FOLDER% 中的所有郵件!" - DANGER_DESC_HTML_2: "一旦操作執行,不可中斷和撤銷!" - TITLE_CLEARING_PROCESS: "資料夾清理中..." - POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "導入 OpenPGP 密鑰" - BUTTON_IMPORT_OPEN_PGP_KEY: "導入" - POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "查看 OpenPGP 密鑰" - BUTTON_SELECT: "選擇" - BUTTON_CLOSE: "關閉" - POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "生成 OpenPGP 密鑰" - LABEL_EMAIL: "Email" - LABEL_NAME: "名字" - LABEL_PASSWORD: "密碼" - LABEL_KEY_BIT_LENGTH: "密鑰長度" - BUTTON_GENERATE_OPEN_PGP_KEYS: "生成" - POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" - LABEL_SIGN: "Sign" - LABEL_ENCRYPT: "Encrypt" - LABEL_PASSWORD: "Password" - BUTTON_SIGN: "Sign" - BUTTON_ENCRYPT: "Encrypt" - BUTTON_SIGN_AND_ENCRYPT: "Sign and encrypt" - POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" - LABEL_KEY: "Private Key" - LABEL_PASSWORD: "Password" - BUTTON_DECRYPT: "Decrypt" - POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "兩步驗證測試" - LABEL_CODE: "代碼" - BUTTON_TEST: "測試" - POPUPS_FILTER: - TITLE_CREATE_FILTER: "Create a filter?" - TITLE_EDIT_FILTER: "Update filter?" - FILTER_NAME: "Name" - LEGEND_CONDITIONS: "Conditions" - LEGEND_ACTIONS: "Actions" - BUTTON_DONE: "Done" - BUTTON_ADD_CONDITION: "Add a Condition" - SELECT_ACTION_NONE: "None" - SELECT_ACTION_MOVE_TO: "Move to" - SELECT_ACTION_FORWARD_TO: "Forward to" - SELECT_ACTION_REJECT: "Reject" - SELECT_ACTION_VACATION_MESSAGE: "Vacation message" - SELECT_ACTION_DISCARD: "Discard" - SELECT_FIELD_FROM: "From" - SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" - SELECT_FIELD_SUBJECT: "Subject" - SELECT_FIELD_HEADER: "Header" - SELECT_FIELD_SIZE: "Size" - SELECT_TYPE_CONTAINS: "Contains" - SELECT_TYPE_NOT_CONTAINS: "Not Contains" - SELECT_TYPE_MATCHES: "Matches (* and ? supported)" - SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" - SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Not Regexp" - SELECT_TYPE_EQUAL_TO: "Equal To" - SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" - SELECT_TYPE_OVER: "Over" - SELECT_TYPE_UNDER: "Under" - SELECT_MATCH_ANY: "Matching any of the following rules" - SELECT_MATCH_ALL: "Matching all of the following rules" - MARK_AS_READ_LABEL: "Mark as read" - REPLY_INTERVAL_LABEL: "Reply interval (days)" - KEEP_LABEL: "Keep" - STOP_LABEL: "Don't stop processing rules" - EMAIL_LABEL: "Email" - VACATION_SUBJECT_LABEL: "Subject (optional)" - VACATION_MESSAGE_LABEL: "Message" - VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" - REJECT_MESSAGE_LABEL: "Reject message" - ALL_INCOMING_MESSAGES_DESC: "All incoming messages" - POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "選擇系統資料夾" - SELECT_CHOOSE_ONE: "選擇一個" - SELECT_UNUSE_NAME: "不使用" - LABEL_SENT: "已發郵件" - LABEL_DRAFTS: "草稿" - LABEL_SPAM: "垃圾郵件" - LABEL_TRASH: "已刪除郵件" - LABEL_ARCHIVE: "存檔" - BUTTON_CANCEL: "取消" - BUTTON_CLOSE: "關閉" - NOTIFICATION_SENT: | - 您沒有選擇 已發郵件 資料夾來存儲已發送郵件。 - 如果您不希望保存已發郵件,請選擇 不使用 選項。 - NOTIFICATION_DRAFTS: "您沒有選擇 草稿 資料夾來存儲郵件草稿。" - NOTIFICATION_SPAM: | - 您沒有選擇 垃圾郵件 資料夾來存儲垃圾郵件。 - 如果您希望永久刪除郵件,請選擇 不使用 選項。 - NOTIFICATION_TRASH: | - 您沒有選擇 已刪除郵件 資料夾來存儲垃圾郵件。 - 如果您希望永久刪除郵件,請選擇 不使用 選項。 - NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" - POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "兩步驗證" - LABEL_ENABLE_TWO_FACTOR: "啟用兩步驗證" - LABEL_TWO_FACTOR_USER: "用戶" - LABEL_TWO_FACTOR_STATUS: "狀態" - LABEL_TWO_FACTOR_SECRET: "Secret" - LABEL_TWO_FACTOR_BACKUP_CODES: "備份代碼" - BUTTON_CREATE: "Create New Secret" - BUTTON_ACTIVATE: "Activate" - BUTTON_CLEAR: "Clear" - BUTTON_LOGOUT: "Logout" - BUTTON_DONE: "Done" - BUTTON_TEST: "測試" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Show Secret" - BUTTON_HIDE_SECRET: "Hide Secret" - TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" - TWO_FACTOR_SECRET_DESC: >- - Import this info into your Google Authenticator client (or other TOTP client) - using the provided QR code below or by entering the code manually. - TWO_FACTOR_BACKUP_CODES_DESC: >- - If you can't receive codes via Google Authenticator, you can use backup codes - to sign in. After you’ve used a backup code to sign in, it will become inactive. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." - TITLES: - LOADING: "載入中" - LOGIN: "登錄" - MAILBOX: "郵箱" - SETTINGS: "設置" - COMPOSE: "寫郵件" - UPLOAD: - ERROR_FILE_IS_TOO_BIG: "文件太大" - ERROR_FILE_PARTIALLY_UPLOADED: "遭遇未知錯誤,檔無法上傳" - ERROR_NO_FILE_UPLOADED: "沒有檔上傳" - ERROR_MISSING_TEMP_FOLDER: "暫存檔案丟失" - ERROR_ON_SAVING_FILE: "遭遇未知錯誤" - ERROR_FILE_TYPE: "無效檔案類型" - ERROR_UNKNOWN: "未知檔上傳錯誤" - EDITOR: - TEXT_SWITCHER_RICH_FORMATTING: "完整文本" - TEXT_SWITCHER_CONFIRM: "檔案格式及圖片將丟失,您確定繼續這麼做?" - SETTINGS_LABELS: - LABEL_PERSONAL_NAME: "個人" - LABEL_GENERAL_NAME: "一般設置" - LABEL_CONTACTS_NAME: "連絡人" - LABEL_FOLDERS_NAME: "資料夾" - LABEL_ACCOUNTS_NAME: "帳戶" - LABEL_IDENTITY_NAME: "簽名" - LABEL_IDENTITIES_NAME: "簽名" - LABEL_FILTERS_NAME: "Filters" - LABEL_TEMPLATES_NAME: "Templates" - LABEL_SECURITY_NAME: "安全" - LABEL_SOCIAL_NAME: "社交" - LABEL_THEMES_NAME: "主題" - LABEL_CHANGE_PASSWORD_NAME: "密碼" - LABEL_OPEN_PGP_NAME: "OpenPGP" - BUTTON_BACK: "返回" - SETTINGS_FILTERS: - LEGEND_FILTERS: "Filters" - BUTTON_SAVE: "Save" - BUTTON_ADD_FILTER: "Add a Filter" - BUTTON_DELETE: "Delete" - BUTTON_RAW_SCRIPT: "Use Custom User Script" - SUBNAME_NONE: "None" - SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" - SUBNAME_REJECT: "Reject" - SUBNAME_VACATION_MESSAGE: "Vacation message" - SUBNAME_DISCARD: "Discard" - CAPABILITY_LABEL: "Capability" - LOADING_PROCESS: "Updating filter list" - DELETING_ASK: "Are you sure?" - CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." - SETTINGS_IDENTITY: - LEGEND_IDENTITY: "簽名" - LABEL_DISPLAY_NAME: "名稱" - LABEL_REPLY_TO: "回復" - LABEL_SIGNATURE: "簽名" - LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" - SETTINGS_SECURITY: - LEGEND_SECURITY: "Security" - LABEL_AUTOLOGOUT: "Auto Logout" - AUTOLOGIN_NEVER_OPTION_NAME: "Never" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" - SETTINGS_GENERAL: - LEGEND_GENERAL: "一般設置" - LABEL_LANGUAGE: "語言" - LABEL_IDENTITY: "Identity" - LABEL_LAYOUT: "Layout" - LABEL_LAYOUT_NO_SPLIT: "No Split" - LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" - LABEL_EDITOR: "默認格式" - LABEL_EDITOR_HTML: "Html" - LABEL_EDITOR_PLAIN: "Plain" - LABEL_EDITOR_HTML_FORCED: "Html (forced)" - LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" - LABEL_ANIMATION: "介面動畫" - LABEL_ANIMATION_FULL: "完整" - LABEL_ANIMATION_NORMAL: "正常" - LABEL_ANIMATION_NONE: "無" - LABEL_VIEW_OPTIONS: "視圖選項" - LABEL_USE_PREVIEW_PANE: "使用預覽" - LABEL_USE_CHECKBOXES_IN_LIST: "清單中顯示多選框" - LABEL_USE_THREADS: "使用對話" - LABEL_REPLY_SAME_FOLDER: "將回復的郵件放置到其回復的郵件所在資料夾" - LABEL_SHOW_IMAGES: "總是顯示外部圖片資訊" - LABEL_SHOW_ANIMATION: "顯示動畫" - LABEL_MESSAGE_PER_PAGE: "封郵件每頁" - LABEL_NOTIFICATIONS: "通知" - LABEL_SOUND_NOTIFICATION: "Sound notification" - LABEL_CHROME_NOTIFICATION_DESC: "顯示新郵件彈窗" - LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(被瀏覽器阻止)" - SETTINGS_CONTACTS: - LEGEND_CONTACTS: "連絡人" - LABEL_CONTACTS_AUTOSAVE: "自動添加到你的位址簿" - LEGEND_CONTACTS_SYNC: "遠程同步(CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "啟用遠程同步" - LABEL_CONTACTS_SYNC_SERVER: "伺服器" - LABEL_CONTACTS_SYNC_AB_URL: "地址簿URL" - LABEL_CONTACTS_SYNC_USER: "用戶名" - LABEL_CONTACTS_SYNC_PASSWORD: "密碼" - SETTINGS_THEMES: - LEGEND_THEMES: "主題" - LEGEND_THEMES_CUSTOM: "自訂主題設置" - LABEL_CUSTOM_TYPE: "類型" - LABEL_CUSTOM_TYPE_LIGHT: "明亮" - LABEL_CUSTOM_TYPE_DARK: "暗沉" - LABEL_CUSTOM_BACKGROUND_IMAGE: "背景" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "上傳背景 (JPG, PNG)" - ERROR_FILE_IS_TOO_BIG: "文件太大" - ERROR_FILE_TYPE_ERROR: "無效類型 (只支援JPG和PNG)" - ERROR_UNKNOWN: "上傳時發生未知錯誤" - SETTINGS_SOCIAL: - LEGEND_GOOGLE: "Google" - BUTTON_GOOGLE_CONNECT: "連接到 Google" - BUTTON_GOOGLE_DISCONNECT: "斷開 Google 連接" - MAIN_GOOGLE_DESC: "After enabling login via Google, you can log into this account using Google button on the login screen." - LEGEND_FACEBOOK: "Facebook" - BUTTON_FACEBOOK_CONNECT: "連接到 Facebook" - BUTTON_FACEBOOK_DISCONNECT: "斷開 Facebook 連結" - MAIN_FACEBOOK_DESC: "After enabling login via Facebook, you can log into this account using Facebook button on the login screen." - LEGEND_TWITTER: "Twitter" - BUTTON_TWITTER_CONNECT: "連接到 Twitter" - BUTTON_TWITTER_DISCONNECT: "斷開 Twitter 連接" - MAIN_TWITTER_DESC: "After enabling login via Twitter, you can log into this account using Twitter button on the login screen." - SETTINGS_FOLDERS: - LEGEND_FOLDERS: "資料夾" - BUTTON_CREATE: "新建資料夾" - BUTTON_DELETE: "刪除" - BUTTON_SUBSCRIBE: "訂閱" - BUTTON_UNSUBSCRIBE: "取消訂閱" - LOADING_PROCESS: "資料夾清單更新" - CREATING_PROCESS: "資料夾創建中" - DELETING_PROCESS: "資料夾刪除中" - RENAMING_PROCESS: "資料夾重命名" - DELETING_ASK: "確定?" - TO_MANY_FOLDERS_DESC_1: "You have too many folders!" - TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." - HELP_DELETE_FOLDER: "Delete folder" - HELP_SHOW_HIDE_FOLDER: "Show/hide folder" - HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" - SETTINGS_ACCOUNTS: - LEGEND_ACCOUNTS: "帳戶列表" - LEGEND_IDENTITIES: "Identities" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" - BUTTON_ADD_ACCOUNT: "添加一個帳戶" - BUTTON_ADD_IDENTITY: "Add an Identity" - BUTTON_DELETE: "刪除" - LOADING_PROCESS: "更新帳戶列表中" - DELETING_ASK: "確定?" - DEFAULT_IDENTITY_LABEL: "default" - SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "簽名" - LEGEND_IDENTITIES: "附加簽名" - LABEL_DEFAULT: "Default" - LABEL_DISPLAY_NAME: "名稱" - LABEL_REPLY_TO: "回復" - LABEL_SIGNATURE: "簽名" - LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" - BUTTON_ADD_IDENTITY: "添加簽名" - BUTTON_DELETE: "刪除" - LOADING_PROCESS: "更新簽名中" - DELETING_ASK: "確定?" - SETTINGS_CHANGE_PASSWORD: - LEGEND_CHANGE_PASSWORD: "修改密碼" - LABEL_CURRENT_PASSWORD: "當前密碼" - LABEL_NEW_PASSWORD: "新密碼" - LABEL_REPEAT_PASSWORD: "再次新密碼" - BUTTON_UPDATE_PASSWORD: "設置新密碼" - ERROR_PASSWORD_MISMATCH: "密碼不匹配,請再試一次" - SETTINGS_OPEN_PGP: - LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "導入 OpenPGP Key" - BUTTON_GENERATE_OPEN_PGP_KEYS: "生成 OpenPGP 密鑰" - TITLE_PRIVATE: "私有" - TITLE_PUBLIC: "公開" - DELETING_ASK: "你確定嗎?" - GENERATE_ONLY_HTTPS: "HTTPS only" - SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" - TAB_MAILBOX: "Mailbox" - TAB_MESSAGE_LIST: "Message list" - TAB_MESSAGE_VIEW: "Message view" - TAB_COMPOSE: "Compose" - LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" - LABEL_REPLY: "回復" - LABEL_REPLY_ALL: "回復所有" - LABEL_FORWARD: "Forward" - LABEL_FORWARD_MULTIPLY: "Forward (multiply)" - LABEL_HELP: "幫助" - LABEL_CHECK_ALL: "檢查所有消息" - LABEL_ARCHIVE: "存檔" - LABEL_DELETE: "刪除" - LABEL_OPEN_THREAD: "Open selected thread" - LABEL_MOVE: "移動" - LABEL_READ: "Read selected messages" - LABEL_UNREAD: "Unread selected messages" - LABEL_SEARCH: "Search" - LABEL_CANCEL_SEARCH: "Cancel search" - LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" - LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" - LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" - LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" - LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" - LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" - LABEL_THREAD_NEXT: "Next message in thread" - LABEL_THREAD_PREV: "Previous message in thread" - LABEL_PRINT: "Print" - LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" - LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" - LABEL_SWITCH_TO_LIST: "Switch focus back to message list" - LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" - LABEL_SAVE_MESSAGE: "Save message" - LABEL_SEND_MESSAGE: "Send message" - LABEL_CLOSE_COMPOSE: "Close compose" - PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "No public keys found" - NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" - NO_PRIVATE_KEY_FOUND: "No private key found" - NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" - ADD_A_PUBLICK_KEY: "Add a public key" - UNVERIFIRED_SIGNATURE: "Unverified signature" - DECRYPTION_ERROR: "OpenPGP decryption error" - GOOD_SIGNATURE: "Good signature from %USER%" - PGP_ERROR: "OpenPGP error: %ERROR%" - SPECIFY_FROM_EMAIL: "Please specify FROM email address" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" - NOTIFICATIONS: - INVALID_TOKEN: "無效標記" - AUTH_ERROR: "認證失敗" - ACCESS_ERROR: "訪問錯誤" - CONNECTION_ERROR: "無法連接伺服器" - CAPTCHA_ERROR: "驗證碼不正確。" - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- - This social ID is not assigned for any email account yet. Log in using email - credentials and enable this feature in account settings. - DOMAIN_NOT_ALLOWED: "無法連接到該域或者未輸入域" - ACCOUNT_NOT_ALLOWED: "帳戶不允許" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "兩步驗證錯誤" - COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" - CURRENT_PASSWORD_INCORRECT: "當前密碼不正確" - NEW_PASSWORD_SHORT: "密碼太短" - NEW_PASSWORD_WEAK: "密碼過於簡單" - NEW_PASSWORD_FORBIDDENT: "密碼包含禁止字元" - CONTACTS_SYNC_ERROR: "連絡人同步錯誤" - CANT_GET_MESSAGE_LIST: "無法獲取郵寄清單" - CANT_GET_MESSAGE: "無法獲取郵件" - CANT_DELETE_MESSAGE: "無法刪除郵件" - CANT_MOVE_MESSAGE: "無法移動郵件" - CANT_SAVE_MESSAGE: "無法保存郵件" - CANT_SEND_MESSAGE: "無法發送郵件" - INVALID_RECIPIENTS: "無效接收人" - CANT_SAVE_FILTERS: "Can't save filters" - CANT_GET_FILTERS: "Can't get filters" - FILTERS_ARE_NOT_CORRECT: "Filters are not correct" - CANT_CREATE_FOLDER: "無法創建資料夾" - CANT_RENAME_FOLDER: "無法重命名資料夾" - CANT_DELETE_FOLDER: "無法刪除資料夾" - CANT_DELETE_NON_EMPTY_FOLDER: "無法刪除非空資料夾" - CANT_SUBSCRIBE_FOLDER: "無法訂閱資料夾" - CANT_UNSUBSCRIBE_FOLDER: "無法取消訂閱資料夾" - CANT_SAVE_SETTINGS: "無法保存設置" - CANT_SAVE_PLUGIN_SETTINGS: "無法保存設置" - DOMAIN_ALREADY_EXISTS: "域已經存在" - CANT_INSTALL_PACKAGE: "安裝包失敗" - CANT_DELETE_PACKAGE: "移除包失敗" - INVALID_PLUGIN_PACKAGE: "無效外掛程式" - UNSUPPORTED_PLUGIN_PACKAGE: "不支持的外掛程式" - LICENSING_SERVER_IS_UNAVAILABLE: "訂閱伺服器無效" - LICENSING_DOMAIN_EXPIRED: "此域訂閱服務已失效。" - LICENSING_DOMAIN_BANNED: "此域訂閱服務已禁止。" - DEMO_SEND_MESSAGE_ERROR: "出於安全考慮,測試帳號無法發送外部郵件。" - DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" - ACCOUNT_ALREADY_EXISTS: "帳戶已存在" - MAIL_SERVER_ERROR: "訪問郵件伺服器遇到錯誤。" - INVALID_INPUT_ARGUMENT: "Invalid input argument" - UNKNOWN_ERROR: "未知錯誤" - STATIC: - BACK_LINK: "重新載入" - DOMAIN_LIST_DESC: "可以通過webmail訪問的域列表" - PHP_EXSTENSIONS_ERROR_DESC: "需要的PHP擴展未配置!" - PHP_VERSION_ERROR_DESC: "您的PHP版本 (%VERSION%) 低於所需的 5.3.0!" - NO_SCRIPT_TITLE: "JavaScript 需要啟用!" - NO_SCRIPT_DESC: | - 您的瀏覽器不支持JavaScript。 - 請啟用瀏覽器的JavaScript支持並重試。 - NO_COOKIE_TITLE: "Cookies 需要啟用!" - NO_COOKIE_DESC: | - 您的瀏覽器不支持Cookies。 - 請啟用瀏覽器的Cookies支持並重試。 - BAD_BROWSER_TITLE: "您的瀏覽器過時了" - BAD_BROWSER_DESC: | - 為了使用所有特性, - 下載並安裝其中一款瀏覽器: diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/RainLoop.asc b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/RainLoop.asc deleted file mode 100755 index 9c171afa..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/RainLoop.asc +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v2 - -mQENBFVN/RoBCAD4NYpb/iMtDARKdTnvV/9ycoTOWdAJoGAasuLprVqyI8bB0z6X -ztJTqswgQcMzEwba5hQ9vuJ/Ylfww6mPvWJs/nmTUKxs2LlBldoSg25UDm7hyt59 -hi9zvOTwmeDNjGf5DXMib4Uuk5pH/jsmprRDZx25xA8qD2pDo0LOv5hexTwl5teA -Zh8EAAzyiNsXbX+kab9IFwSArsvYK0YJln+tPHvT29X5B5YVt9gkwY+CWA3QV/ZG -d71KEp+zReHICSjSy9G646JHDoG8CQ4Nytaih5oboqjU+Hkt8GeGlRlaPm3AIXqc -3q76Og/KD1Itx7MKrfXUvCau/4HowSiO9neJABEBAAG0H1JhaW5Mb29wIDxzdXBw -b3J0QHJhaW5sb29wLm5ldD6JATkEEwEIACMFAlVN/RoCGw8HCwkIBwMCAQYVCAIJ -CgsEFgIDAQIeAQIXgAAKCRDtfEnZh9pFkTxVCAD0S4RMXVKsbjLm22zXE01yHWQM -25QBRb5Z8p4ER3GcRNiKRWsNRTMRpiTdPgCyfj+tgIooMbBravDJwTkoztfWOb/P -l3oazxhY/ivvLalk5kVY7lflWyYYn9tfGwVJYIZCKuZ67VZwtTcf6dBhbc4DizVw -LuJAY6VNwycSHe8nrESabWzYRnw5c5ex/dmk8a1rsFXcDJBUB9MdZR7pxpniS9qB -JByxjP6hHo5vo1y6mPDiN1wWBd+objA7ZJaXd0jnsXRHlBAk74/O5cWvmVeExYjx -aERJEMQdBoAZNG1uTnQwjNdHfVoWDpqDSUr4QPfRv8M2pwvP4V1i6qji1r5T -=dVNE ------END PGP PUBLIC KEY BLOCK----- diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/empty-contact.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/empty-contact.png deleted file mode 100755 index b2f2071d177ee53ecfaa3e46f780e9794cf05530..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1881 zcmV-f2d4OmP)b)ZP^ncP8ubTS^(jwODW#<%A%Q?3 zB#3}*F244xJzm4k!JZl0WF*U;nKNhBzO8++*RY2PIqLPgNhA`6%RJAM)i{@HUcxjl znM$Q*s@1C8=Q=z;G?bESxSve+$$ELze*3#!9@taAgTGyfUKDUX&~8IWT`ZoOH*emU zi;D{ZUa3?>sJ^~F`9SdD;bAj6I%?ACK>=N_TNosi`S5Fp#wO?3#oRTw5s)_>O>U%@m78b9i`Y3Rc?y zhY!pOaQMbrx*5;uMgTuPK5m5=4qV06dXyDn0p}+C2B7`@eRFVdU=n@()^C#n7Mdnl zXpP#&J$$eZ*UIIxxpCu$$>;NCxat3{*7ZKEED#Gg06~*HN~Mz7+uJjzr>8c${Ohe^ zoPmXB0Tycp1_pwChK7dB2eZ>65ckkQjo4^+!~*V0k3ihr-SuB)5`kv%BD#eZgx9Ef z1TPK<0pQTSUgHYUwZ>gnIX*r%TU%RAI`n;7Yu%+VK9B2+1^%9y&Y6*s5wU1oDwIHu zqC#%G>|mA1x||gv<0YS) ze2Wg_S}s!Kt|qYY^XJda%aO#73^@H+in3-ahhU$bwc4J@zEv5zm1w(tV*__< za@5ptnXT=eP~h}&f~WQ7=H?{TqvyoYs>|xRkpM{erRy><_sXA-Vi5ra;HYDHdD(XS zDU)bc#qR{TF8=ikAP|6~EdwyP5WXQKuCZ|z+O%$hZ`@C%Qs&N`J2F=Ra5ufjNk);b z5~a?6{{7Fqdi5%JIl(aq-GLIWqo}%d>y{PJc2DXBQT2(&5(%8z4x+g^dLUaIpA^m7 z+M2KgdPr*5?LDy`0g0@+xVUKBwfAJpsjr%& z0O-sJAs8C~eRg&xb;-iQf>0ou_*Nr0mqJ@vJr-~+xu!*E`O#m0i?-dDaX3Ul5Dyr` zp+Zl=Xm9@@D8L{ft)c^(9X#t6tQi{{Gq-Qw zHmO0s)@c=>VVaKx+%*+IZ*OnQhyt0DRL2*!nyp|D&JuAStTR79Zx%mZ5O>l7b3PMB z43WUKo50*i_W+FKBU)7{->o<30#b}MYZUCksTeGow+xfB6(Z}EC>IGxqHb4~ZQ924 z6bJk+Vab&w9+g-kd371dS>&o6QPMa(>R| z+yv#7E44;4d382Yt@;yKl&>gbQJX+hUdCy%gdh%Cf@gI zR^|9x1AXMm%8CS^NYu=bnjy#@6bc&XRpYc8>64&Iojgyc)8_8oyP|#Z|7xw#K;w(- zhsBI~`Vv7x7;a8WXol!U+uV~@eAZ6nKJSQ(o4e*68820C`S2NuGwAP6_%KwbkRNB06+KdXIQ zyDEMoL7`0q9w-adrT5E&UmGZX2vkd~|KGeWfZgmv9AqB&yZ7TyKU+Gi2o1G!jc#6c zUC+224voVC-gn>sU|Ged8P^p$9sPC(_UgO+eXb@&9e3WBUwzx454+{%b^CE^!J>f^ zho(yJ{ukc}a54%5L!Wo2$+%C21J^;TaeANM|5}O-R&bg@;#O*LA$Ftjb|v!vQy9V& T6R?S>00000NkvXXu0mjf(mH~* diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/amazon.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/amazon.com.png deleted file mode 100755 index 07ad04dffd215534a87c774774749e5e9d12c845..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18032 zcmXt=1yEaE*M)I+cXucaTCBJ`!QEYoySuwP6e-2sU5iVx;!xbJIQ;khW_}owkU&W8 zJ!kK=p0$T4Wko4eBqAgT2nbXeX>l-c9r)iD0vvETC}=zZT)~;hNr^*z{P$VdU7iBm zgXk!&?E(RTjQ!siBt&*D0dOb0tBisK{5lF0EIq23gP{Th1Ovr_5&ZLN3b<>lR9*Q%N~Z%_QgJDH9~CU}Wx5LCy493+eq5V+K|c78B+bi^*4 zO+!$I7$~bc&ndwO8;D_Y#Y{vA1C}jGMWBpchWkbnW!ki)l^(W~4MJ)3sk8U?C!c7j z`$SxdyWz0RlqOqmziPz^6n=7|=H0iuDhPNoPIwvAircw|W{6ITg6{zJh2a>f${ zJkhcnCPFf2Kj-8j%=U3CjZ8G`7X|FK7R~O9`{z{VG&{&*1WK4P>tq_laO1j$2IsIt zFU{Jjs=BT&`PMaBgkVwZzd8~KDpq*QZcZfd6Add3=EzePs=rU}MJaB4Fu}<`aZIJ# zoQwEaEWOi4o>Yj-4WUU6FAqDvJs!H&y(H5VX;den;ngpno^vX=Jmh(7R($I`=RP<% zxbiDdEFWB7CuwYKWMO5UKX;c=_fFklsI$)jSBSUkjkMTL^B$74*sqNY4Z)v)U z=zTuO`F8NLvc|;19WKzjTCqaS#M&Bht;I<{16&bmzZUjq=G;4(X2_|m2U31vsDVX( z!OY1iX+O;zLh^*#m5-D&8`;1U@>{^m+Eduaa|~yWLK3n~wT7HpD9f!k{&N zU^BKWC*-vNdMQq`4k{z9F~LnAH2RSgnOCUL$KPgwt3K$v7eA&nBy4Q##~vkuaCv!o zjBw+fzlfB|vbYws3aU2EMAq4OLg+crjI<&c%B⪙A9$^gR52dB6V=}W18U;?&iOi z*6UsTUM;oCMNuvLHNp8_t=m^u zE7X{1WJD_$sTQ*xTIEW?JGix;u;08Ubld(W%ZXPTSXw(>KhMq0O~g0fhEWz^2b!X8 zJ=C+rWMvV)HP`yZo!0i|cV2WLueD_5=a1C0JiqzZ*S+}{xScM|o!&<~Dlj%Py>g&@ z2Nn;(63^31^HOG+w!p!_UoSFI1ldxo0Z?Rdq<`aHE6E&27h6AjV&<>7RX zP2!BuDZ3r4DJdyu8=VEKJR%=fuMjY?cf4U*9k>u7WBA2eU9AIQsPjL9@K zG_1IDGRtJL%Sd<}A!cqp&utAS$lrI!Z#Zf_!w|lrm+MXYe?b80AJXeWsNqn$O|*y@QE1?{+{dHDTVt(1 zYK!$80bwZ{`*=~7wy02{LG{kVSJ$6EG;M)Dl9;{Vy;#X5Z#`?>j7hW$8mPB({aL4g z9A#wV{FS;~&_*1{Ra8QAZMom!;M_^Im^KYHDgu zB2@W>lI7E+GHc8={&=zMGD3=5Y6#PE>*zh6;du1mLIgIK?UPuJ>20BlM|6mqo@bi_ zON%D!>`1-aHyY$XFw#WJ)4%H0ldY$`E#uKuek)F*$?0i4CPxz!s6o)t!wXM*2u83& ztB<(BwreZ}!mN&JwMG&ckB&kL?$d00^4jqUKZZg5!ypR~8 zbuaz!_nJL7xc|=AG|#fHubq6iMqBLvoO8F>bMWy+A9?`?xN+6Y+&qjN7Io?JL1qDm z5@yPxu@BR^*WA~)3j;3jv+oWv%hZ(hExiOZjEM5~nQaihweIU_uU|}p;R_gi&}%x{TFTeY#fwt8igLQea`SAq90XJR483~Vs?Y)Coc1U0XoK7bQKy1V)M7p z44g=Dx~wYI%SSI{(m~{KcB{^CUjlCN-gj;bs1cxx8K}svP@Siez89$Aym=x7o_2(F zbEACkTZioN86|!0zV!R7JF^nKl)b-iuD47ZU94`sWJ(#9CL0Fa0TdR+(zyZOf(>UQ1zA@dwx++-Q_6*YFDQl0g*urR=#p3!6kzQ0t~q!5fJEGDJP0Q+!z}t^FV3P-1}MOa ziY9B^`_5S*@aW)b4WLX}n3x3HG)H3u^TbCL|B%M~{OJ>}zx0J}sIfE#OsH|>X@?X- zA4q6N9FIX^fvO@kK(bx$py%asuPnzw#~kTa&Evg&uq)W|D_Y{{MTry#d|zqMuH2XM)^O7XXsh*gDDUm$2EI`?N?np^?`Z>!Q**F z5hoc!BZHLVDGw$zBIFdSoWM^#o{ z9(K%A$i=6CStirEKp9besHM24^jcja~bUi5u zACbb115=01kST#3EO0j~_I&yAe))7)E~L<`Q>w;fp4A&?t~+KUh^OF-#{EM~X$DsZ?uR`xQ91Pu|^ee)GT0c{<;Ew>Kt$ zD>LsGPWu@&YEJ++-yod=v(Rwl)|o0xYje-{+5b8w%$PvOcFJv8Kf*dYRkqXwUnp%O zD~FxY91~K8@!F4k)ZKGC2;Otb)`|O#huoSTM6Y~cC@U)iv@8FIiw&S$ z{8*lwQz02GS~v!=v5B;f2}1( zW`(r z?~tIr*!Xw@myfrH#;)YBOlD^0FedVUO9@;+RRznEj52a&n`^Ut{;cXO*R*EuyY*SE z=kf*66_4^W-jHKX*T(T1udf2Yq5`3)$YR2X)bA-Ql;~80E7YP9IZ&VhO-K>}Xu{JD zSnCA>kTbAIJvVF(M?Zhue1=ZMk9e&+G83HUJ7sa&$JK23=<^>L9Yq{WR4fm%U!yN6 zTH=czWb4I%nz_C53phM3P7vCI!jMqe;X&=Wx=#?eL8#V<@$NP_lU?8h)D>sWRPffJ z7a4e*iV#q3NB7>a??62l!J$$Jap)c0|9H!*+5*vH6wc9D2jh|4dN+j46s)yO5pO+? zK+R2leOY(S`$3*+I5=HtOaQ#wj*W|ur_*wi?cLLJ%^(!7>lnky3B&grzb7hKV67aR>Q`03=rF_ZZk(Q-Te=+0QUZcB zO}4a;JwKYGDtuC>cwFHf=DQ;F;WJ){2XX;L3UG$63II-8nYojNy`7H!fbzX#c` zNl2@+W@uKt`Ln67PnMZwQI{`|J%*kiPvM?Sj<*S}1evA~fO@vHsU{>Q#>O}B zEb7?~Mt*z<`0$V)V)DsXZMR=zeSEN`XZ6@FNo~^k1jxw$Iw)htgj0UOr7IsSjPF@> zyCg!qNepou+@cL`DbB>iMA);^!dMkgoARMFHn z&3`T^P^@CP-RX}P%42iVB`VbZELw3w5RjAqcb+UQH6itshA~Ovp_Y*P=U{fUKS2zF zbJwm(D1e14$`~fMPqdx=+I)R~y3(>o0KtHVY%DS}H8tnZ%6s{AxCMBa z&yDi7g>xM0#KUtZO!{a_?~YUc25m`u(6)I4{R+SslK6_Q>ySL#oD!veJ`>^b7s;}M&)0RFtdGt=eCaJiAPT0 z?R5sr)Zm62|8ADnxo|~Ws0x39P95JDeXE7CgZm?CJ2gL_thkUW+aA2f!%%wVM@|XT zVl7AyF;fCZP;*M|ux+NTp;FDCYfVDd?xpqeMFX+Fu#F>{Dwv{e^WjY{gn}WEteOiR zjl{^<7;=I0*uAroNd206)8ue;0DesUpJS9ql2{^K1zFz@Z7c{b5VkRa!MYW<$NtCi z<%71i_8ic;04MV|ia=n-6!5-)i36lc-{d3;@Bm<2(WXgCbSeOmRBxXX6%|!1p@0E1 z!y7bnHx^aGE9x0KGHaA+p`tTQA+`PTe*fnGF+bz~uMt)#0C+AyT{Q%J_ydc|x^*p7 z#bOXO>-^PAL zV363o#~Q`*#`~A84?)A%U3{Q7_lUMG>%U2$Hae~YJq}y}*f3}Dyn&Pr55@Cwu{rV# zr$1c6y<6pckK-uKC;wG zIf)g@zSuD|jXH`|?8N5EVinVfyb_%4S~f$dMFghj3ev%gPjM;$TBEIM>k@xB<6*<2 zpyzg)|7khkO|$1Z?i&U?WSVo>@$qqS+u*}na2O{$dxOojrq}a~GyKJ!^Z*qw)-VruiYqmN0Nv$!Bfo%(XBJQ#UEc zw_J$aC1Qd)lbhYy-uKhqCGzLl2&-ltyR9D5ncK|#d^!ZE^o)#p`%VZGyS0&O4P*_4 ze3L2CvE~iFWgCdy>X9^`1iMmt_U~Ny{>Jq zLlx#UCxw^`*_ajdA8F$};Zae2Z1UniK_odfmqjIg)f$n_R3dvC%m@=SV8%?idW~Th zTG)CGE!tL$bb;<1u|6;GuZK6PR}x}k=1?~t`0HFao)H2#w@?g;IAI(Kt@O0p=R0*x z{b8Z^J)s6`Z|rbm5I?`}BlIY=wR0QKH<<3WHtEidGCfxO)j>c4@T7ZH2OoL?6sNdV zNpTisFp-BB1!M7Nb1^sQ@H3o}-VXz&o0kpbzRv*?I~u4CEEB~#)p)Btrl>Qw(eY$nw-LEcIjXgQ9`brjis0pO zNlexqK=%dsS=XEWx5Eej%ZF$ivr(t_Ij7t&=nJi~`|OPz9DIP1ewz9Q2B_G_j=0s1 z&@~iAD8ufnaR9`2!TWK+-G9^sXyOYC3oI-wW;Sly-317WLfqUV05_~TowwsYcIA8Q znE{OB_wV0zrP!THm{y zEKc(KBX7Lvx}}%FHX(lCy6z0V;OEEnPLJC6oZcs5ltCk43IE3eI-8eINuB0L>Wd?H z+yPgoTDcgxmnlW=mkLPxG)=uJWcHXy)fTxUgmzl42n_Yx*X6%_?f~OTEyk=E= z>{stFC2*kq4g57`HoJY=@0MBjsmY(lWV;Q%{p50c_1b0dP$mrhp)@i`o{QzK0w8Dw z)$x7jAOL;@GVZ$&ZHw>TtyiRgZ?a~5!+}DXpP1r7MO3C!J%4(CC6J)meWKoVs()E* zQ2Rv=nvySjTcA`X`6eA)(G;DLX&ZEy*oPen)ZOZ^tu8c@iot?E(5kqLfhrUJmy zvUG5`DDj-*{jO;{HG)dq{vRF18Xbb3KS*JH&&H}VMHEJp-4{9xO$OuujDoO(A-V6B z$c9ZbU`>Go)PD5)$(2hU;6T8Z{SPXt{ZyY6fj&H$CG?kKc~^aWWr!ABzkFaTae`?) z;)Udy9xKue1i)&HY^iAZ0;A$P4&suS&Yielxo1U72jPMGi7YjRh`VeUxj`5utB)fu4NlE?jOLu6s zMIYw}$`@B(MTq!4Xo$1bM$1#`1OYH-=wv%2y-CP2o(Gztm*(~1*Gn%orZiok2y7@u z=yd1vT1#2OG;0VCf><_FLWG|V;i2<)Nj=ut&ah`M9|{_<`6nfbYBbMW`R-oc)X^+A zjh;uTP)IU^b~7_xCvxbE>e!|B!gFK}to59roSt>$w}@!MLQ^BF$}jiP1+IiOTtG*b zdQ52m-J{5HPiST(^zuEsBkmX#Vm#FA0{bZI|2kcf+&s(gf{@V>9ZpH07Qc{O}Uv^I6 z?6Q&*$Gs71Ji}8{!*)gj&pRfCV|PBnEHwncQIfrkeCg@``}gakfQA{-zPdsZUN`(Z`i+D z8M3O$Jc8?{M#A(N;r*}c>-x)jE~tR1phE}_t^`HeDI%ePczJ()>3ve*%bQ-*IfbG| z9K1?3BUX|j$XsZ?b#-Kgp*MxPmE8jNc|iZI0MypZ_;A6%1-S!b$Pz(W)bgdvUfh>= z*Prvnvt~SJ0@?~Ba-~>44;TAuTkrpV!YouEu_;AC{KfvVKDTFP9r(Yz=RoM=R_NN# z@Zsfc;@0t698U&KRD!WF9NhlrtLIf=&-DoLs`rRSdU`sL5DgCx7h_c{+T^9`2^)+( z1LuWs=C-P9vDzzIXC}7+ni^0G4{y6Xsa=@23#2MIZ0zgN@{Ag0uaeMPVe7Mta5!43G!-2)!LEo&KjBSc$*_Dg4sJ&Wo$k z9-ChDK+@)!zih`zG%;xJq?o?vJ03)_^fJHNo&jMz{(~*Yah`5L=vu%QxVUzW{YpGGH5;T-bJMXlRHrDiNSo zI<{zJ0%PUCtLQ?0zL~>VwETny0($Jwkhl}raxVMcIzEp03&2QLIz2v5Nv8ZyLT~v`mwRGIOP$!EVAmG=ciST(*th$fI3F~<_Z0Asjhh( z0*`j24lhQcAr~gYAF#uH1TO^$_Jv9mmDd~RwD4D6VbFxO|aEIIJBR~|# zIydiG$^0LUyZ>_tR_+?DK+;lOpz%KdFqPmL{4 zp2Mx{WoAbB#FfwPPg7LqWlxUK+k(*W!&|qMZPk61Gt{lAKEy@)A=z7UMpx+hS}T6M z(lpY05!YnjQw{(%=cLHZU0rdixd4jd-lmDt8M{1kQk0TC(B5!Ot((yM=H2J(F5XQD_`0k)Ic!-4d8UA&K+9^x4wQ zCA6Z|&b7~`Lq}KU9@V4 z*Qe30MmQykm|{;QW%b7IF4dd4hNmV6K2XtzCI8eh(xlXmGbn zN=^>6?wYa4JS3J^E8&T{j;XKL0?EH%y#a;GsQ?frF$9%dpUi@9Ko~w5F48+-Y7K$tl6*Y#bF;OaD3sb|SsWMV#n7g~i4Nz&qLqCN{c-)`P-4y zYP~5updiIn)YNGA(e!{{26#Mu>NIXrp^Agio}<+VOFg~{JBh>F$a4EpaRK&ygHN0_ z0tFmY=uM-XPhdik9||d6#w?}iC_-MK#wu6Wm2FcWBW7UN!OX3IEf6sR;f%qPRKT4S zFwX!&ZMo!$&}bdp9cL%zR#-sy{Wn8m_BMjb(9c$jt-np*nFv*)<(6&r6BkM0CvK^1 z)`(ULJo)Anv*8od`)=)f^2dA47EZvmW`=d8TE9j@AE?H>0%q3iLF88HIQwr6X;!9kd`=582DIo!*Q)(j7WcSY9TS7!sqepo1@kG+J`|HA36!-vhm+nE6W zxk``_o#17#bJtV#P94Abq-Nuze0pP-O0ROk|qWt%Q)~SQJpQ zV9zq-ZRAkK$zw(~!}-^-hBeY_c9&>I1kF@I{H2dL=n+Ok+0X0fdH(Rz?!E5qPO7+9 z1rh)t#?LPZrBaTUPZ#MCiu*B0#yqp}%C`5Pt?yrIa?Ean8DPG~Y1(Squ=l)W z?G6CULn|vhhkqeL$Sp1A>S@814^xy^TOXUUa?tzDk!NJdQ@14UyJXvLE_ z8#GpY`JL@1RI^aD^!g)tZ)DtydSr+DB7$B^V1Jmv07s0-*L0cH@4R{0`Lw##WKCNj z*JaPSgVU`2_7&k72-WVt`Ua2vN#UE=XYV#h0HMU}S-C8JTjQ>VJh3Ez1L*n@xBI5o z;q`xUmq+)hzRCI5+KzyQzqbW1x$je3uL?jd2I4tDnhqR)N|R;z^hu>c%~3xiEiDbo zBtI)}=OAEp7}@YqG&`;gB8Uv;o2)sJfDHR5`XLIGNu{sk>!Oo8oDn2{l1pfUh#90}Oqf1$-RtTH7VzjnjfJ0hc^4 zXCG-1n(5{$wads&pl?`tG>G|!<`_5IzB|n&vCUFV2QqnpIB3dE*lUaACYquHQW;ph z03bi`KhE%vs;uqFUj7*Pj1Vtov?yEev^QcelPvI&?{h(kA_iof=kCOew7`;UoaU=M z(!1b61LlG3HagOJyDz@+UP>IY&6D67ZPQa4V-jc{enl&4H?$ze-Z z4gS+>e159Ku&NfOMMw)IKnPJrsBT15dmeM~x*1iEphFYnmT8P~%{xJ_PHtYhCZ z!TK-$%Jl>GtTII;@J5%rF94~qad`kFrr7SE)`XK3r5Ao<=?tYGQ-q3;3~7~x%w}N_ zptQq<=pK(RA`8Yo%izSPBH%E^&03@IHKS0P#!k*)$Vy3(6oOE~|8nzdrZ_9yNZRg& zy1%4UC^ORJxvx2s(7WqpfDqcA4sz}d-xdw)Pft4&MFC<`v3yz*(&E4?&QfaDWFU0X zKiRHLAgIMY`fq`=bomt6Rfuq;A^~s90eR@Y+t9$NXim)Ug5OEWs(pQd6$#wq0gl6e zN!<~;-;tQSg2I2=ItUt`2as)mr3Fl11TdtvsONLuoEz}|Wa8v>9ewh6#P#+gpkCa! z+%6+yIFSi}S;=3mOuvi#;Bxgq?Q!z-hb?rA{{1vVwEU~+2q&)uI+!)_P;ht1u=(hQ zV3n5(0yliir5NhUOceCRM>-)P0ePb3*sYVHwCZ_Gn&eRsP|M}-oxLyo|0yg0stR&u zqpA`EC*yNRY^K;$5pwo&;R%C~f#8Gj4L27sI&!vB9|DN5+mnKq&w9Ss!!H04n~B|P zOS<+bD83L{!jG(Tl;1SBozWTW7H6O{!jb9XQt%XfK&sV2s1#v zY7qn7Tfa|~COgU_M-5O&6wdOAGQiT{hj=6F=w}D<9~%djU;X;q)4$h@@Z^^0BRmq( z9S8}^<;Q_mU>*38q0+MKczbi}j@s@Wl)}kqH5YD7QC9$FKZqn9I&o(Gdc?pTy8zho zBfz^}{TDx7`X2JHdmZMTZS|7JjU;DfFWF+CGqMwT<4DE+ZiEf!M>gmKpwxf!dWX3# zXu7QqxM@k=#%RvHPz}LTJJgo>@(9k@fOiC-BEDwjqJI3IBVgK2h#lI3G%6*!4G!;X z1HR%L`m#0aDDcF)XfZ>oz=XrB!Bk`Ij*W7I<+N;w>pv){;7F6c(yfM#*MMM+%`#Fc z>@m2dnSFlKNuTPKbQ801!r4%u@Zm!&aB7~P&?o@8s3plLI#a2mzDJcF>t{L2xufEb z&w=*p`Oe%9>bvF?QOA9}6JP%d_!3=^0P|SxHC0stD-Ny53wJBu6Yw^AB07B!74keT z*0ujq0`m*N3=|M^4&aEJ4d@Z&vNW_cc>)s3!X~y=(2^t!&9V&wi~F7&K(Bo?KhTkfKo5DifvmllJ?h4{ME{ zEGTXd?v>bXMSSIU%H$oS9+yOp0?C6&K>AH8k~!w!W3X+Fl&(5TxqnpML}!zubP{1x ziHNupxvhd?&*go!Lo4x9&kTU#fkOW4*ROh;QXP5OpKx&nB`-}dgP_L z$d(trSE#dR2Ab4`LXpUCrLh)Txq>?gd5xzV#!rp$Da>qYIH=jw;Vs5U(x zO-DSQ8JJ9IR$b6vFRr+@h9RzVW&Zbmz|}9 zMwY*)(5#i5RA4 zR1^p~#C%RoXYYAGEX=}%WeTA{_&mfORBl4>M*wN^XZ(#Hj!E6K&WWfV*u}L~Bv#P` zFTI1r*H@@|ReMsL156H2Iv+y?)fj!MXqt&ltIu5Mxg9>y&U|kcD*B2q zjJ06s4OP2fVdn5Tg?M_1?Y0yE@s9Uif4$KL^pJL81z!h;eCD(2$wppf+VPa8>AX1>tW z<~i3tOAK84*&3hN^%$1>YC;+)acN{t{<((~V6cP7k~AU((*ux^x+_izR_;lw zPnT?1cZ><~)FWSvQ->6c5Ear0+Eo$XrJyv?Ikz%#SaSFZQi3q5bX?tBA;;)d$rYp( z8zFvtPyBR8fla??BcINqw@B68@U6I|`FS(Md<}=Ik|aT?fO3RBJG(7s|3e{WgMKi>xonyY4&&rCn?kW8o~4tH0@|mqu~{vRj48BDt{{72v0#b;(c)%r((yL9 z!6A7^bY07@M`@{$y+&%^gv&A-o&?HVMKNGKW0XKAG^ye_b<5@#K8EFd+{2Ftq>;ym zBBqtBSvuls9xqY#i<}~TJ=7eLSjr`p@0w)8?}z!nRDSc|NLp|{#)n53FC!ONh+E}ZQ z#pIK8bC7WcgXSs1vc%83JImvrg8NPtUJ$`5Y`|k4_psiX*tH$B8Dq{6YaY?y2Kj1_e7eI{Z-)*rY^3qJRJ0Nr^!JMSS`$auiahj+(pD^jH%?I@q?*v*Ika{tZ&AU#6xG8m8H(NNC+=ih)M}Dh!~)FD7~BY!{-SnXd!S; zbj{F8duIJ>97mTLAsx&t{Z<)IRQZuaaJ^h=dDRURO*~PR3o>->HAj#rjcYMv7z6z!jU(8G&>{_@8=X6rr6DK{B`B- zqNWoe1gP?ZxD}Lj>U_#jt6TETB2|>?tAF?1^4i(C;5x@KC}I~9;Ap5AV*|qRh_XIP zIBe6tU?zo>nVA%_I1iVGas>`y%~FEhno^o54Z_=o=lvcUI2++Pj@c;%T-zh$edTo< z9jbz*Udob5MdyRsM}I^|Mq3wx5KL0;o862Sh51|NuiZo=c`4;nlVEqtq6Qe;Gl_hI z27UQaxgZ&gu~g~%F)U6=WJXHrm2jG`I$R#}#5}7B zV^`_x=v$1H^2640mrB8;V3$IASn$drlJy05HI}Rn$|!;tMB$>bWaV!XO^Emi7(sp1 zLUEg*ST~W9xvZ^n7#$fqF|#FEOB%FlRg@x*7)r_{s604=pXGD@Na|A9c+ zL8OvNw?M@GU8kl&A6m_EHQWWaOOd(?gMZ1%d=hH}>w@9C&@EhYh!UvN?yKqfYb>D*7I9`$=rsDQhBTTHNzq%F_61zEMHVa#qB~ zD-329Qj5l0N+;NR178=aEW>Jo4Dif8P=ux9QlTnvtqDv~NVKTs`Z?!*(M#VmE8Ey^ zd!@3#_G5LwJ#c&+c|;wO7gN5(Y8qQR34L!S5?#`|0Ym8*_c$@D>U#8rPf2e~af|q* zzu%yk%WaP)cHlCZS`IvF8^s|u#bC@`h@4ah?kYIJL^8&BaluFCz;*_0Xjf;&fxUS( z+~LTSdc)RfDTrJ2cuhOkD5vdhNjGY6+OC8n7Kj+f&{VwW$MEG=UWXD6^ zsxxRUFX}>?D%H=hC2k^WLb3jgDw^3#4N8ZNSnD4bwQMivMZ(z_j42rY1jVI%j6{81 zD_o{&dVqg&8;tDOsW-6dKbey>oKX%MiEs1R9@J1jm3bvjzb*Oi(R|{#mrI9ON;Ue zeuIPK!mBI|w_X;6lJY7iJIV4)baePTdkzjM8E+GN%k-fCa+lOIG24OTg6_w=^8tA# z6r}>#7>nsjRiU`=3pd3%mP56OwQI7C3sE^Q?7f?^L!c`3aWbsv4P0V@SVe0hO~y}7 zi8a+-*X+QtEBI`%Q8I7csz6!cUd-H_!VyLjdOy4Cfs9VXQ4>Dm8=1??Md69`N&0}S zcjP7&)diTFHvJrnDW|4pF3B|3&X4W8WjD;+x}=W2ln}SWk2Q2XrnOJ$7wsX_rXMmg zo{v!3mc6-2E+5RC{*nylXyY*8RGl6Jq9uMTCa1zrlPGnGwzK#cB?RIG;ZUS!lLT}Y zC>MPWmY2HVlouv&t~R$6<2R;b)MC-rKQ!4}VznL^Yx1CZGRY(Aqa6eZnSme1fs9&C zk_gFU{Wnx^`)@4M7sDjl32Q5XED3CU?SwnO9c8H_ou9xc5A$bmswL9A8&cevE34u^ zs!pTg2bs-?3_s0dfXR1RLz%6?OVBm0{h5{572S98BijK7L>YMZhKfsmX#5%wvqlMhQ$6H zo{Sm}nzeSWz`8CCZwj3?s?m9+JX9(aF2|$lMwsuVh;98jBrFTlz;`tSu~vfaV|osN z%UbOH>U7owwPPU$t<^P&NCIXREvHy{F=c;A%Q#gGqUxVK;bF$uFljcr`)qvid0Ovbu4u#imfoxG*AjZVVGh)=u|wL5ul}?31kZ3FP=Qa zn?$i#3U|#*PK<~#X?0cI3)lU3uSOba5%8P(mb3kTM4qcmuRmd}JcEDO4aP8Ox?}6= z;!dB_>hamg7OTx&zqHAw&}1JU(8$}tG{zPPr#381P4b9Z!ltU&#Ld zP$`(TS^MgQ2{cW{YN_uD5w3a81H7)T`7d^7!8xGjRo8z{xn7%c(oP_oltY{IGYzlm zE2GAkqSU(uJP5Ae7y3u8g}f%p{r9uIsY@bVPotSWuVfvK=-<1vZQO;w(=hTUFWs=T zFxD$TkFtYGgsmj9ZNQ}>T8|Y$1=1$x#d%EOs-v#9(t`(yhsN1>@v7x&6?+;vsZ0ti zt??i^0>v;jKBH`e2}vRi$sP`r#9%FTc$i6+r9?hLwIz$;jPXlRtfV2oWC{ut@1Y_k z61WnkBDZakS+?-#y3~j~?^RPQBPMj*yC3OxB&{$q!ONG}!;JB&z{FHNMoXeamX^kq zTAEh8aa{iJ%H30J)f(E=6vYI^hM)9aYvRZ!!d0;$1QE{Xe+->sNf$ zucq)$hNkK{hc@hx%9&%|5&9M`f=l2_RH{V~5SgZ!v`|>ZPBmxO>zdC9>^@~R5mCDy z{=;y!(3b6J+Rgkm7xYgWdsi!|1TMTKF_S<#w5blBWGFe$gpcx%4o##5;`hiXgUEC^ z@QT$j1~F^W4pnGKGB*Kjld*Zsw^f3cFzZzW4pY?8s7^k^T2qv23_g*>Z8x1lQ&%GM z7CuB}Yx!&o9G5{mN=z+jI~rOPJ$bwD;k1>J^9(9SbC>tCVB>bW{p6@6wzr}0)O3+z zGB&C8wx@);y&?6-x0t8X;U_plc#$`>vVS_860ImPM5*Dt62)TtsP;j8E%8&97bSen zu%Ti%C!RS1YCFbI)&3+FzkJtNR! zj1NiENWTA|6*bT0o?ydFr%-`3I7>P~802!&&$;x;aU7?PjaA~Pzb478AO*3bI>UhB z#U*G4MCDE$546c@AWzosy*ALP>B_jl2Ccj?xv5dhF^;EuP}Zn@{z>LOF(lc7GDJo{ z6b;cMS&=aQh$2U6x4{0fP1cfYW38%HVN7VWzC*ELMy~P=fE1HvDXLS5GcOzC6e)o$ zVVh?Y87AP{{rGmS=f1}m4|-MiDBu{JP^OX4ZrF|aLExC0*Nuo_mJ{}dGL3D9DaCx$5ieynQ!+>pel6+Jcq@Bf`*m!76joX?N`Rw}4 zC9y>*WEhoBA4xh!$R}nqWN5aC*7>6bh+PC-T@&K~vNx8*9H#s>14iOdd$9UmR}76}Tv?*EJTDH@Z>mh#6`c z66gnrvK||sPW*!0C33ga4v`+e(61^Y6{`Q!ES;c-k)>eltN6NXn5i(6g_4jJM{e3^ z$`o!F%INon8Yb*G(Lw;qjbs;snr4ul+_GU9BtH>{ar5 zh~{y;Hudp<_CplS&lp;Zo~CT#=PeuM5*S{L2C|-N`eIHV%{sx@6KNEkhyVTaUL&>Z z>nA}{RVNX9Q@w0ac~3V_n_#s}Z{?k0M%8(T5Q20#yeLHR!p>fD!JP=$iWO zq%=55Y?;O!Zb5q!Q+mis8cT*ohpkxccZhAQNrCmcWaX*d#iq$eS}TI)R$%qlwkJ9a z!8vZfSsIVfwYIpeA+KKc7G@9+H1)3hacfE!@_ZLsPOb8x(on3|F~K{R&E9d^;Qb{?g;pMX08W6KknqrWaauROl5W} z%oJWC5@p2>_H~;>K)~+*_kRJxkE)6^2?kYB0+g0tz=uUNAp5nf-Yrxs5-KbxOvG4jUDs)`|bZ3`sHli zuYuZ<_+4Sj=6g@{-F8L8bi%T!(@NF;g0;!zu_a?T961J;-zG^v8>Z0hFe^!&c>jUe zEq;3)fGa#-z@n8KsoV8!iGId_zNYu+a}aq={oQ8=)rdJnS;F@5bgEC2Z*oqErG!bW z`b3zf1cScgDvzK&Re2*pP9XudtN&eGKU~D?GU6!hu;lvCa4e@`mC01!RIEy=72c5{ z!os>xI~n@}Spu`QK7?+Rh1cYy$RBxt^|y~z+d#EP0PH;kx4W?^J@yyh-lm>?>4E08 zjg{(zEPZyb8VHG!%0TOYxjxgNuUeYny4UaKb>}g}eP*bbd+8`axPhT*)uT7MimyM` z3(eHPYOhsqc`@hYvy7AZeUEGljqtezWNaOe*%schWyp2mtt0qa8NZKF#1W}rzO6Dg z>4yq5s%yX{W>O@h+u-2$Machl;o8nrEX(|>H;@bOay0*200lnt4#7C0BOvWOZ+Uf- zzr)gg zCLY5P>Rzc31k8kFLezw&yo8+I_$7nwUG@)dGPwFW?A(BAH)r$O2fr;EdZenCK{m`K zpY{Q+7$-m4$SQW0H4rolJJ{+XYqI^^iC^X4ta2A#LIj9wab4Gpp}U0~YE5Lt36DJ= zJNUD}{{$X+ILRob22YFE<|{!DGsHUO_}tE*jhVzS`X`*9(>(r$N8df<$?5krlOd)v zyeK!XA0U=6jgS;84^>6XXlt8$kKi%MRjiIddoi5Qs*x0`y3hXpRc_pTjjfwEVQ&w3 zCs!4#I`=1hDBDs`G*74o66uks*8O)MU{{w6K<4Gy#aP;9h{+|&A+o`W(TW^ zQ)q_Jj7aU2hxfmlYv@_h`EhcjoXCyZ$wK_1stLZrg(@?gd|-F)fUWHv!roQb*)2sU zh0z42Q#kmwAey(fHUrnbr;raaHLZHc}w zKgO_n26^p;4Ir%{bKN|bPD?kkFaX0ZmVg42qC4N&8MRs&r}^UGTDjDX7|Y z!+jZg8*K+)&s#@XNo+f{@}^C+ZF>iVUZ_6r)oz~sm@1lD&^Aw_BZoUNtV;sBHF<6F ztuT$OD`(q6B}@f+JnsbdP8DRGr|^;@!03{#%Hrp^WUn2~)6bm`pq6`BS&6K4JyUn!e*E@w}RuYm{v|~;0zr8L`2Fq&{1`I zY^*D5y26bxtmH0qDCMw_W*gfXPHG&vfhAo@yePHy!*Ye}0^Iats`i6U`qk`E<{mG4 vS+{LI`F2S*&}VW<)Nq%OQPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000RLNkle0j6oB(b9kCQjo26~K zq)C^gJGQh)5m#`bprbNwqcSSsK8%X`Lm8L418PweM3hzirH%_f;Ezk4QFIgmL1$c8 z3$&$ex+H0n`rUWpZTi|en#SHabLYPI?z{KPIp>~x?u%vMzm~|z(iaR-hXTP1&%eM| zkZU3tiq$tjHXM4wxw}y*R5{DHTICkXdWtUv)u-UzZMfq+|y4{hN>+;eJ4?dJ` z(Cb%55Thgvi^(=`+?1Q0la=X2Rhj7-*3>kZM0pP{dx$pPx`r=L82f?D`S6{92!>%h&x7>7d!;?>K+p?7rM0xFPr($10O_4}MVYRll3W47!(x&X#v18GqMO9T* zMMiPCTp1Y|xDGyqJI}A5w_*KTn$INr_UwJ8;b}}+R8T0V?=i=FG zUVRN!L4T^XjkjorLLtZ$mR3wK7^LPwQ&UrYeSKM3S*lU;^74E>pWE$DPfurYvA0aE zsAML))mBkfe&0R!Zr!{^+!>lxD^^}HZ$9otxPpM``56ce-R4)xvJhWnZ{S@qG^$eC z5(@$d4Gk_=uU-vAetv#IK>Awd zwQ}XktgNi0q@T1?scXzi1ApF1e_zC3% zhJo^p`P@b}Vyfd7Pqz6E3g$QP%khoe++3`&c=6(vmKLQWWkh2=H$47?ub?m&C$T$9 zy*|iHqr@!$X^Fj$p3XS!^y1=ToCGF<;<4k+{_d_pto?iTmKT?}va;z-4HIgM9bzmp z91F!G;%BTO7SqCo3$dMqJSht6kq4J~@KdYJn_p1oD^8o7^1o_Ju*AbqRc&o8wqw~1 z!RqS`R8>?$Bkzye?Wt*5 zcp_<2%(!Ee(Xdbzo5X?z3%a_LKT)Hqo<3|Nd1NPa-+@OKVkRaZ_$Nkl9bBMtRh;#7r_0nq?u>$%;?|rCFJhn8E0G3* z{`9zGl+m!rok*o#cmZM!f!wwGqy`{e&$=#`y=GS(?85N|Zz` zdXhZYM5DztdfbBhvIUc^u+6~KWqhPiXGV_eV6~oXDaE&pvjAi;u|`msiAIZQ^tc5* zO*$(Hw`Q+fa@*~SCK!r-BEX24lQTF<5<7y$u>xzxqQr`6^tgpog%w7&!U|*U-+J>c z`lE(AzH;&Ms+ZspEcg)A7K;)qrqSaTfN(F!YR;~jl01nZb>p?y9s2WNSEnDZx8P#G z>_5P<7#gi4+M2^8rqSaT_7W5}wXB@nle7v~BSNuD?%T7sy}jKcpG|6~)xbm`!K)D5 z%S5BaG|`EiI_od0Am1`GFxk~Vs|WcHlsVILt({JeJ`cQGFZmQMpC zifQz?1r*c+nIwGJ^z8DANfVRb+3>cCTQG$JL2>*=x805r!IC5Ih!Q*WSOmj?g{rV4 zdg2&C(4RH)Tz^Mr6ia`-{POcJYO1G=k8hzQ+?+KC8BD~BiDyoDZ`-?yM6jY?dBYL5 zBtk1O44s*1w3tSZThI;r51x)4C6Bu4`WsHQwyA9qtmwCLBk*HQG*{v)W>uPKkk~=T zF2qm#i5fjgjQIYWZ;1)=t<*v)&5kV>6u;lU>zi*OGmV1iJnlb<>9=XIrlwVvSIFAO zIP2HF*?jbvSdd~doJxJt1&*TbMFy5X`dIAH!!yi(FD4o-pkNcu*1jU|<(FP2{|iO2 b1_u5DZZJDCvVAz{00000NkvXXu0mjfrX--& diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/asana.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/asana.com.png deleted file mode 100755 index 35d3e1db58fb8760866ace03d158304986f50089..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 995 zcmV<9104K`P)G#Cv zwc+#Gk<)em|Nly(-aoPqrqb_Yui}Hi=;ZPGI-A=el-Azy)za<8_xt{Y&1A^q^_|V_ zX2CzQ;GXRF=lT5ip4f$DvE#GY@j;&4-tPHQt=@dR=V8A&jm7H4;q>|Z{yMJ*ddXNy zwj8_Us-w{E*YC}U&uOaNlq!?h^ZM{w(EZ*psMAVX6$ z2C~zj0007FNklRH%?a6N zfIt;kf$f@r$4t*c*J=RaH*UTlM8R=jSx&d~jgF!y9iuJlQ6ad;fXO!7?t}BKcza=L z_1}}xR~iU08OB;JB|lZUiC>~9PH!QgkU<;fRk~7kPA-o>i&>mPK+eYWIQMCgn=22W z2rz|!o{ed70GCulSR9@b;0*v0I0qF00m_10f5?C{2=qM9n{e_?9Rg_n^Wppi!CN>G zO5Ps0+7iR^*D=7I75#zPJ;epgmbST<^-4?C1x#(?FI7j11Q_)I*Y09YKh*&`oQ71T zT7bpgPW0XaVF;|Rr%&@epiO5=jw-h|SsRBCxVTE|=yFa0ewp~u8T&?{^>;Ix5cp0? z`3nS;Vp_QaHv|U2Y^J>0Bs*a(6b0N6;0FM#e7*K3X92^zH2>WN0LThNoO~KU;mhFd zD*^!7QCFON`YC|e0^JPYZAgf&0|r2@pv%iQj+b)p&>HwPdSR141=d4U^g7LCO8Fpz z8kNLlgH(ax`&$Y?b}`JGXi2{RCX3lvVz%@1gLpNf095JZ2s`Nq2BvnD9dJe}@tFe5 z121RY0l+l@?kFJbXL=JW(hU>?U_gNLJplE4``a0ovzMxw+EEES65wVZNNd(=ubg7x zB4>QR*uKw#*(}}-8(oUxfL_F1B(7!!L7?&8lxeIVKNUa!#}Ca0Xn=nK{062G^tsKJ Rrx^eM002ovPDHLkV1h^d?aBZE diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/battle.net.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/battle.net.png deleted file mode 100755 index f5baf8db852946a1c01959356339aa4a65c8b473..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3194 zcmV-=42AQFP)b}02jiuZxKgf4a783`Toterha!NDp^Sx%LvTXb0)$FpGtwZmZ;Uh&Go#T+ zGt)i2ynFJ;>mF^RStP~Isk&WVuiv}x`|kP9x#!##$~J1$s85d@H}1>nbb2BGkFB@2 zx4EsY?ZNKu?#BQGprN7R-|On?KJ&YUHZtqz=y;^Hwe?S2CX>0lv9a-i-!-6-S}K)V z+}qo`%{4SMJeo)(8ZTxtQ9;Ea5`ch;paO`XqNoI5c8Q>$GUwd%Ae~Mxy0~csF#$2~ z#YmHYsUl_|;3;8TdIITmdXYNk5*Ig(VItr?R#Oj+vmjH8dXM731TmnW+NCq+Tq3ym zX$12ju?5TUAN~?P1dbiWHvSa0yhNm>$Q%C`UeJ-_6+|=|2m%D@8o1;0cym~`3xYWQ z`cGm_w_)Cha2q1!C(7}0E*L>nQ2|jc&wi;182!Kz!7y~m?@_94ghDSufM|f^bI27p zpmSD$g&<%Um2lAkoFNrr$?Ecjq2Y{}fIY{O|-fA_7ugaS~~y=@w|1jRG=uA{6sjDh2y~15f=u z{%8M$+q@2qCkU_k11z3Eh*myQ&w1e0UxqLA09FqE!EN|KTz01dvDKfWFrx|I)j_cS zal8v6Q5B2WubxCoB@89pwt*OmUHcK3y%c-rWhw!Ul(Ul<9!1O}K^(?ShAsb7ewlzD zoW-y`AP8oLPM%3=?o!BhBkhObikl;kxB!msN7`G;YwH0hZhM(v>xo;xjd{_g(boYY8XMg~iukK>};t9RV3V z9+@x`89x;pJsL@8NKTnU>8?MAcQ+As9zsqY$DiyZtYj#SBeSl?Ui}FsM3HVoNAZvZ zM8L!<3yP#`v3MNbT@T(v>s~b913?VYBzD~=&`C3~LJr^4iDkPf6bsjIZLbx(zVca7!ql0_7!mJpCJ<`6VDw(fB6K(m(~%Yn1Xpf zd=Cg7r{zqbRZz?!$4?S=974?FOLjYNYh)lg4Kh}^ShQId1NYl+w z%%MH)NXKF1&`xaMR($(m?8GrF*A3IILJqtI*#g0yckr+NguWX;O>o=2B*#rB`^>jd z6T(5^4T$W;Kq+1 z|F`|{qXGxaqUuqjfQr^X+A=KHi)*?8@4+{}41jhYN1ASoDvUQ?0LqI1(GK0-g6w=9 z`OUB4{ry;}L}}toN>xd$c092~A3%Fg;?2Q~t06N6cDxoX&=5g<27$=z)Tf_lQoeCUyMU z6~W>gaeLmvKmR@0y%|h~EWt-q3snHgTkDZb4bpfS;tSD4d$&L)gVaqK@Rd@jsux}l zpZ_kZ4*TIhAkA+==MhRhS&9m_>UOHGUV$?YHh2aaF@cKtmR;zP-Plz(AVhmyVb9xu zL+YoU30xJC=q|Z@1>F5561!f<-d>M1%))kUhDZJy={yYHDCP^~Z~p?ZPuz#7m0O4N z@5m!2Ab=k?1I>m6bC+SM>L^nk-b>Kdg1>AbqT0U`N~P|Ze=V%JpP=U$w(i@6`7BJC z55;^`Q~k#`k*+qx3;t*;eNC%Lth{STJcAMtqV7whq8Skd7lWmD5boWAv>iZ}-yV_b z%c8qqhbgn5swQe$Dg>^&5&P)Z3Bq374<8`k)d8_MHf;`aWDg#N&ZF?3j{qLRJaitT zc-=?PG4`B5{5^IG!tuYAwOk4y7M*U&My!)-AFv&i~I4n$n9wclps@0xbkl7r{5{dAOuyI zzXA&lEA${$DJ*~h*?yt*3y z^M?tO)%dZKkj7b9{R~V?_*jx+!IOLOQ3@NLr8i%oudk0{sW5=d2W=Y!L~!NJOz!+k z;)`z~*z{u(o1P_}sKPlR76iEYE6};i2x5X>{rgZoie&qKcziAS)_qtkgXOviuU~`S zb`Sowm&l=*OOP*lO1Uh>o;HfdyXb4#hJR;0di;G*2i`F812$(v^aF+y#mwU}^@LLw z(&tOqjBChl{w3DYiFXb+W&%Dr2Bs~>kDEkHt4O_fgu=f*NMGwgoO!J6ZEWQqp{wsB z{?Hfc+wflyOGZ6QDG#LrnmtKa?CW1yFVUG(8One*WJ6;XM#WrBEmk)XDR|uUdD#7r zLDvx^Q-hy46-$l+frL|%|NU>|N6)6veh_JG#=;`p^vCFzAEs*Ecj12e4&7fLPgVd$^)W;KaGHh z3|Y(#8N?!rLx2*@T@D}r8gA?aL_(zfAoAJ^6gNCa>85)T6?pY2sG9^=-Gp3w2SGy} ziKo}n_t@W23;|V~ca$id(YW`YYLD>zbO-{VD&^zE7-og2OsK9#^Cjr(p=6-xG59Y& z0+|}9N@2Bi=$O$|?c0KD*+=h>)?!C?Aufo{N>#Bi#2C6*8_I?e142~ahls`y6uP?c zxf~@FCjpi_L9p{R;>jd2io|!nMezOmDSUM`xu^dbf5WFBh@%!FJ1tUzq?2fOPOq^{2m^w9eF;f>i z=Y8k9KFApMjTbd^%tQ-r`mAX@V=6K%0>dG5K@H6X+3_Q=a}&(J4xBsVr;2O_(*96V z8ZrwF*VM%ZeVM95eTa=22f1#nc;>O84~u8$f4H%5NeK-0LRA<21sjHV=Quq9R-QTA z1H%bq0kS~V1))A0=Gg3z7^*y&(=SUhK(4OU(395N$Fp>H~% z3s`e02mqLQY>?v+QFqQY9~S$c5p{z;f0q44<;z3-meMJwrNb}02jiuZxKgf4a783`Toterha!NDp^Sx%LvTXb0)$FpGtwZmZ;Uh&Go#T+ zGt)i2ynFJ;>mF^RStP~Isk&WVuiv}x`|kP9x#!##$~J1$s85d@H}1>nbb2BGkFB@2 zx4EsY?ZNKu?#BQGprN7R-|On?KJ&YUHZtqz=y;^Hwe?S2CX>0lv9a-i-!-6-S}K)V z+}qo`%{4SMJeo)(8ZTxtQ9;Ea5`ch;paO`XqNoI5c8Q>$GUwd%Ae~Mxy0~csF#$2~ z#YmHYsUl_|;3;8TdIITmdXYNk5*Ig(VItr?R#Oj+vmjH8dXM731TmnW+NCq+Tq3ym zX$12ju?5TUAN~?P1dbiWHvSa0yhNm>$Q%C`UeJ-_6+|=|2m%D@8o1;0cym~`3xYWQ z`cGm_w_)Cha2q1!C(7}0E*L>nQ2|jc&wi;182!Kz!7y~m?@_94ghDSufM|f^bI27p zpmSD$g&<%Um2lAkoFNrr$?Ecjq2Y{}fIY{O|-fA_7ugaS~~y=@w|1jRG=uA{6sjDh2y~15f=u z{%8M$+q@2qCkU_k11z3Eh*myQ&w1e0UxqLA09FqE!EN|KTz01dvDKfWFrx|I)j_cS zal8v6Q5B2WubxCoB@89pwt*OmUHcK3y%c-rWhw!Ul(Ul<9!1O}K^(?ShAsb7ewlzD zoW-y`AP8oLPM%3=?o!BhBkhObikl;kxB!msN7`G;YwH0hZhM(v>xo;xjd{_g(boYY8XMg~iukK>};t9RV3V z9+@x`89x;pJsL@8NKTnU>8?MAcQ+As9zsqY$DiyZtYj#SBeSl?Ui}FsM3HVoNAZvZ zM8L!<3yP#`v3MNbT@T(v>s~b913?VYBzD~=&`C3~LJr^4iDkPf6bsjIZLbx(zVca7!ql0_7!mJpCJ<`6VDw(fB6K(m(~%Yn1Xpf zd=Cg7r{zqbRZz?!$4?S=974?FOLjYNYh)lg4Kh}^ShQId1NYl+w z%%MH)NXKF1&`xaMR($(m?8GrF*A3IILJqtI*#g0yckr+NguWX;O>o=2B*#rB`^>jd z6T(5^4T$W;Kq+1 z|F`|{qXGxaqUuqjfQr^X+A=KHi)*?8@4+{}41jhYN1ASoDvUQ?0LqI1(GK0-g6w=9 z`OUB4{ry;}L}}toN>xd$c092~A3%Fg;?2Q~t06N6cDxoX&=5g<27$=z)Tf_lQoeCUyMU z6~W>gaeLmvKmR@0y%|h~EWt-q3snHgTkDZb4bpfS;tSD4d$&L)gVaqK@Rd@jsux}l zpZ_kZ4*TIhAkA+==MhRhS&9m_>UOHGUV$?YHh2aaF@cKtmR;zP-Plz(AVhmyVb9xu zL+YoU30xJC=q|Z@1>F5561!f<-d>M1%))kUhDZJy={yYHDCP^~Z~p?ZPuz#7m0O4N z@5m!2Ab=k?1I>m6bC+SM>L^nk-b>Kdg1>AbqT0U`N~P|Ze=V%JpP=U$w(i@6`7BJC z55;^`Q~k#`k*+qx3;t*;eNC%Lth{STJcAMtqV7whq8Skd7lWmD5boWAv>iZ}-yV_b z%c8qqhbgn5swQe$Dg>^&5&P)Z3Bq374<8`k)d8_MHf;`aWDg#N&ZF?3j{qLRJaitT zc-=?PG4`B5{5^IG!tuYAwOk4y7M*U&My!)-AFv&i~I4n$n9wclps@0xbkl7r{5{dAOuyI zzXA&lEA${$DJ*~h*?yt*3y z^M?tO)%dZKkj7b9{R~V?_*jx+!IOLOQ3@NLr8i%oudk0{sW5=d2W=Y!L~!NJOz!+k z;)`z~*z{u(o1P_}sKPlR76iEYE6};i2x5X>{rgZoie&qKcziAS)_qtkgXOviuU~`S zb`Sowm&l=*OOP*lO1Uh>o;HfdyXb4#hJR;0di;G*2i`F812$(v^aF+y#mwU}^@LLw z(&tOqjBChl{w3DYiFXb+W&%Dr2Bs~>kDEkHt4O_fgu=f*NMGwgoO!J6ZEWQqp{wsB z{?Hfc+wflyOGZ6QDG#LrnmtKa?CW1yFVUG(8One*WJ6;XM#WrBEmk)XDR|uUdD#7r zLDvx^Q-hy46-$l+frL|%|NU>|N6)6veh_JG#=;`p^vCFzAEs*Ecj12e4&7fLPgVd$^)W;KaGHh z3|Y(#8N?!rLx2*@T@D}r8gA?aL_(zfAoAJ^6gNCa>85)T6?pY2sG9^=-Gp3w2SGy} ziKo}n_t@W23;|V~ca$id(YW`YYLD>zbO-{VD&^zE7-og2OsK9#^Cjr(p=6-xG59Y& z0+|}9N@2Bi=$O$|?c0KD*+=h>)?!C?Aufo{N>#Bi#2C6*8_I?e142~ahls`y6uP?c zxf~@FCjpi_L9p{R;>jd2io|!nMezOmDSUM`xu^dbf5WFBh@%!FJ1tUzq?2fOPOq^{2m^w9eF;f>i z=Y8k9KFApMjTbd^%tQ-r`mAX@V=6K%0>dG5K@H6X+3_Q=a}&(J4xBsVr;2O_(*96V z8ZrwF*VM%ZeVM95eTa=22f1#nc;>O84~u8$f4H%5NeK-0LRA<21sjHV=Quq9R-QTA z1H%bq0kS~V1))A0=Gg3z7^*y&(=SUhK(4OU(395N$Fp>H~% z3s`e02mqLQY>?v+QFqQY9~S$c5p{z;f0q44<;z3-meMJwrNae)w}T?9#|G3}=dum})MlU<9xwoa09NL92Fk($$_i&M>Fb%GF#24a&JeH@ z2gZe)-9bdyRSfHd6*ZBS)>l(=l9arveDl)icq=Ht zmp};j@*&)b2#qF%lVTzh5|UBi6bvj`kUN(hT*SdyfC1+Ub3PUlPdz14AR+uf@$3sY z^bG>@k`wkqn2XE~Z$)vDIpJh({sys=6%xYl# z1WlbLO`QxK%~S)!I0vUJGm|{~D^Kz6iQZm`0YQZ~uD>wTe_>-@?&3f;)@ikLXtXka z=i*Qs;NQ)L`of0k=0x>!agHL8lWbhW81@NH?yo|U)Kg+Tk}_YUl{!`A1}>;hN=Z%2 zt4ye!ow%U93_`A;_?9^ZcL26Mr0_nM=mrONRZ#kXP5glW6ywy16m8pwG;%_p0r%k=}^Kl@S|* zaVN)FXOGW#=Z>&|Pf>R!y*x+mM*XL6_S?jE^{O-7$aK%lmg!(fzhb}S>P>Ubo=Guy>T=6cVOtDmk-S+9~uN4?+FlUV_|#r|2F})d#sYjT|opIJB9!N+T(u= zs?dIU^VlgAYTyuR8{ich?h$+gu=2R+A9~ipzz$1LI(y;lIYq_o;1U4fy=bDZV@GuR z&*^q%!BW_#%Y1OL2b+A{NC^pl6>&3p=eo1C4hb&0LHSVR<<;%}Y1iJ;=dt?Jxiy}Y zEq`-Itf&u*@lP~c>=PpPYkQCh7Vna$>+17B7;^DqP$ySicWB{RnbQpBirU`n@*y>v zSm-77RWSYi*6Z-{y{D1uQS1LSHs}HySJU=jEedl-Riy5fkKYvnh(3o+VSi3cZ}z;M z;CL{tkj~deB6XMKO;o#B%jMGPbknFUG>2*Z6=8zdy9^Onx;^DMnB8nwY2TOY3!~Jw zJWP#BTu2RT&KOB83y1`g|yx=Rt=UHv8I$<>Gy@qvG^XUo{wM(lya!TsF_3Fb>Syu z(MDXGHdPm?Xb2k>f05=$y#&{H;D|u&yPV+Ks-Di3Y99p~PMrDIC@N(G4;_L@c=#`m z<`ts3Tyd@8nwW@y-JClokf5Q6n9GpC2Dgf&s%`4&{Pu5NQ#F^uhhBM*&>?0s4~3Rj z$Ruju5cx@d(TLwT-Wd;m|85DeA?xG2We>2W6h}&mS}6&~&U22ft^$nR32P4Jmg1v2 zz@lqg1)Wgh=q`Y*3y*!+J5=P7RfsJTKYEUo;-NZ}@1p}>ADYpS#$wrugW!iCrDBff zU%4mR6Tsu+EC&xB%-r&C-LYp(Mqc8U+1%HwqVR&cLBcxrY{hYrYjh8Di8=LtoJZ&) zL6N=WOy&=X8h%w{S`Xlhi{LzCtcSa_({e6BF_z@&)5axJyuCLsj&zZ;!!;aZO(AP6 z#3xCO4HkkeT)+EG6`aPu8Ic*&fS!ptirVAm5eIk01##$y;4`Oiw@AqB``wq*e?paY zA(`_i@|>28B3fpcjHBJaCeRGP3(27GcYef%2G3XtNaHox0}-SHJaadk6kr?Yh>@|% z)V6^<0{N2Qf-IrMO5Y#PcxiBa0qPX`8FVAY<2Wn%2-g7F+Z&;3r|NX8BwLR4!X zj!?qcyA%0rm%&2$O!^qW2hb!LMk;iqr;L6jMIwPtatE7(pOl1xQVR4qUy~O=DYJq(@%KHQNauMF32kzvkP6V&f$WO8 z8^)i76ZE=);ZMLp*CLi8twBG1YeYs#A*4ES8!Ch~f|Bu4mHN1$pLVZ?6m{eMqhff0 z?VK;}exPCnCulB^$LDg8}yY_h;Ojdz8%gwl1F zXZ>2M1RQXscdQ{SNUvkl)6=^ob&)hMAva<6N~}pSm@VmGz3c$g_6tV?S>suFB++N1 z1rvVZMxddal39WGmE0*#&4{iZMe+FZqZbAKTxg!O9}F>(wYJqHVc(IIFu2{F42%24 znP2#*_iwOu#6IPn-%b0GI)_XCfqY70d0U3Wdf?}hP!{U@oni-*$uWoT|1nK3%mlBN z-`6^rGBcpSl>YWBSw5@B6kPwgQdKfj0ebsHK?D= zJ|Eja(cgqZUJ;GuP??6Z!JqTaEa^upAhpXP41G5dJa>gesr$F!TA7u>Xk(~McS{y3 z+g!)!TE?>=uzjBD)84j)$qdw0`27GOkrut5v_9759@);xrHJJZE|uL{)7$ljc|4v5 zQWvcDep7mS+EsLBAFr(3`&LOoIK-lEBArgMbvcu-7GJHMk{58bepdCgho~TJDI)kC8Y!={uCt48gu(c}rpN}fq z_L8>rZmmxY=6$=bJ-jZ&oqo zB$TaHU#6UH36gWbid;W!y5zeqQTww#t^nTGOL$h{p0nEPBRvE0?cgHG-OYMgNE$2W z;&QASoR$l4?^qa+fEWMt;;rF-Ewxl#SY76?Ca1{E2ySSyvSwa88~NhteuUI@j$+=| zfHFv9LG*7-mSsLESJLi$_dn@1`4t_HZLnFpP*EF!DWz5?au9p{QyR;3)|<=y<+CHJ zTl*K=tKx5{`~ zd)%v>kp5?`WMBU88~}St@~nZoGH@bN`cP%ntm`I!)i@OiF9*!65$^W4U(W+mf3I;^ zQGNz1gLXYfc&q}_S~KD5m?B}`VvdKV?j!4jX5>AeK#qqySGm<{Hk{EKo0QhQh2?eD zb^94}&`LsBK%~uz8VgqiMZe|30_m;vagpNDK#`yww8$RvI&Ak;wo`)2BU4$;=_?pd zb^+kAx!e~IhwA$f#Uh3;P8s&0s==xAA;NH8-%cL(dWBTHpl;Q7*C~CMH!?EvpP!z~ z{gk+M^Glz2YTzCu;kXJCkzu)LCWoT~R-;VDVO*Aseu7$!>HFONrE5L03jw{>dj4iX zqHxcqV~i>f%z;p5I8+tM7c|&fc^S^=&48`-)qjbqY41XCLN6Hg)bL`5OL{T;;jlLl zNhaHevPmxQ^EX5Ae(J)-q3y&t#65D7a26TqDq=tluWk`mk1tf~xftY%1*-VC@t@R4 zf-l9px~d5+c2IQmi_PKMdEYTe##oxsGC-iWqn_?a@fpxEj^ab%$W3p ziry0g&pxcqC%GoNSz9?({&^Vh-7TK1B4*q6_g0;1?_)@Q#I~VvX57hNa|3%zlfv{? zwj|w;Dn%yU={MW%NoJ;Nu8Wf5K5JucrPO22!=0CZmmVLlgtZp(DB0eU7-FFT6H{MW z{2)KO=2AYPws|424qv@z8z?$~El+I9-r|T3;;WwBYR~z_7HRpS;nV~2SaLEtO=RXg zt2*l1Gf#YMbUSnf-jOJmXtbTSeEU12>#OsWkP7*vX9!+0{$<>?-f~>qofPKmKMucH z<>gxGB-$tX$+x;T(te3xA4(GgcZiRoX;7ODSD?iHUJI05B0E8j;;6P=Q31*Hm2Kd- z0PuXIprK?pE8@cJxZ&t&(<-K(vQ|HfA?Q>?`N<~&b{o(5WiPO$roNtP(!$p})MX$j40 zrMk6DJNx3D9Z>bK4}SM**=DWhLF7jIX!0u1jP5(y6)pa>dtW${UNGeH#3q^;ID5tN z_P)X=D&LFZ9lLK1s-UuNOS{y>g)P?bj~@btZmEm8IIf+#{;J`96Ax(ztKeo?epR7W zs2TIl`KaHky76D*?Qi6OAGHvHx!w(X-)8<)8bWe<4EF*Y7O7 zre9&(qokSbxfVd$az*BJHA(xgYoRJ6Z za$(U0bM#(1dB#I-P6?!*CuT*7TKUBXaI?0h!h&HWJH}GdmfD!xagtA#wc(+49 z=O2q)#GWD9nR?+pCTIwm{MWX{-C}(>2g=}?qZWYFju2#>=ZkjN{eVK?7?0OaywP!F zj*zH;CnE*a#8wa1=ik~GO@fJhw9mo8+Y`{0oo%3|^HXon>Sw$p4$W@}7c)Zy&v2z_ z6Uwc@;-J~isk{1dLq63VqT=35%MrK?>Fgpe7}#`(9**po*Tby@OnQJGXz-mU+&EdB znn^F->Cti%(7ca6G>XgH;wEVP>HzX$vM?91Cn=GtUvs`pj+N!(KwIgF-uyqkcmAT| zMM!TCL!|`Tw%wg!mmt^9xu(gU1PjGHUhPhFJ!iooufBNV)6nm-zaxi|5lKVz`2BhM z-hL;GK8&cn06SM1cxQB1B9jVQ(`Zto&1(fK94613?esrTG-+Fp14qE&NdSg-F6sgV zG36pvkOwugn@h`7-^MRl(nB*ooDiR&!MHS61!Js8B`0vo2pZyTk32h>S0amV0%~9A z@FREK^siBp7Om<)wo!^Qz$y~8##VM-8L_$UWpE$9So&EeO3`bbC=eCSkBSl3L#Mj; zWz^b&D=m{_Dws~!6$Elh9C1IN@Q_0_1*Wel3bI$IYPF}S+zfTSBaVrbiMW0A_6T(s zR3(2^FiWov2(YYFFHiW+=Jl=(aa*4H@7h7)`E}RLO#Hl3gdeD!X}ob7XnRkZuZvMs z9-V#hjrted@(sgdMDP{&RzXahz+0B{r~V=4j-J||rq}QGvJ;#cDG(jz_1Z_$L5Fll zy#T+dh1+V*lTsL}Lst)V3R^1uAh3Caf5F>>uKVnZ@%LD*sy#PbIb0`eX84yjAq<;# z8!)XBsdVCpa_2V*@&_r*+~JUJiUp_)@v(H}X4*$sYlCG3e`}K^1QYolm?Sx!&FLrK z*?6{iM~MU7|KFDsC^0g7n}TKSmMf9|Tg|)*uXFd~_l4gp+p9f5HoC`bYZH<@TZey* zdB6WMx!9`S2y9$&5jf}jT-QQkwMm{3l{q1{ew(s(;dqp699`l;(+-@m2H~zNZPcIaU;#yQ)ab&Kt&Q zu#rebdcnBZ&p>_9?6*9uRc1)csar0{c46{NM@u!l=L^HZtpAE_GFrqDcrxOR>%7Bp z`57aGv&q2!WWx8C;k#s)6SIJM+$wx?HquM0BJ_dq+CPM*;mYMT;>~?V+qa3AUGJe* z9pI5+!XvE|h^Pl)I!5kGo1fG6S3W@F2$o$k+p%cvZx(IVKcM|IX+L!pwb^p?@fJuR zDkA&erwM@IB-Xqp8_w!0q$&iWd<&P)H+xI`Gc#^`YPhH}SLNT<%aiKWrxs*jz=ogu z-6@Uh7vN!Uc1~So1b(*edaD`%iX)S?8)>O96yHF>g@ExhjL4-0>2ML(MUJ*&pfhrI tzVksD$ECQVg5%%FEdSG#Cv zwc+#Gk<)em|Nly(-aoPqrqb_Yui}Hi=;ZPGI-A=el-Azy)za<8_xt{Y&1A^q^_|V_ zX2CzQ;GXRF=lT5ip4f$DvE#GY@j;&4-tPHQt=@dR=V8A&jm7H4;q>|Z{yMJ*ddXNy zwj8_Us-w{E*YC}U&uOaNlq!?h^ZM{w(EZ*psMAVX6$ z2C~zj0007FNklRH%?a6N zfIt;kf$f@r$4t*c*J=RaH*UTlM8R=jSx&d~jgF!y9iuJlQ6ad;fXO!7?t}BKcza=L z_1}}xR~iU08OB;JB|lZUiC>~9PH!QgkU<;fRk~7kPA-o>i&>mPK+eYWIQMCgn=22W z2rz|!o{ed70GCulSR9@b;0*v0I0qF00m_10f5?C{2=qM9n{e_?9Rg_n^Wppi!CN>G zO5Ps0+7iR^*D=7I75#zPJ;epgmbST<^-4?C1x#(?FI7j11Q_)I*Y09YKh*&`oQ71T zT7bpgPW0XaVF;|Rr%&@epiO5=jw-h|SsRBCxVTE|=yFa0ewp~u8T&?{^>;Ix5cp0? z`3nS;Vp_QaHv|U2Y^J>0Bs*a(6b0N6;0FM#e7*K3X92^zH2>WN0LThNoO~KU;mhFd zD*^!7QCFON`YC|e0^JPYZAgf&0|r2@pv%iQj+b)p&>HwPdSR141=d4U^g7LCO8Fpz z8kNLlgH(ax`&$Y?b}`JGXi2{RCX3lvVz%@1gLpNf095JZ2s`Nq2BvnD9dJe}@tFe5 z121RY0l+l@?kFJbXL=JW(hU>?U_gNLJplE4``a0ovzMxw+EEES65wVZNNd(=ubg7x zB4>QR*uKw#*(}}-8(oUxfL_F1B(7!!L7?&8lxeIVKNUa!#}Ca0Xn=nK{062G^tsKJ Rrx^eM002ovPDHLkV1h^d?aBZE diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/e.paypal.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/e.paypal.com.png deleted file mode 100755 index 7ddea03c9940de970baf32efa1ecc986a101b6c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4545 zcma)=Wm^+~0)aCC#nfYA*Cj+jbHmm`&!2uQ;yNg2rX z-d}J(yyrac`3Wc42&hd$#7KmNg+-#Pqha!|js6QE&cDPCa=ZOsnP{tFH6xk#{|TOl zs(~sN)`v{uJ7@fV{@7o~ItUAkbnw4mkNVZU_%|{JYgz@H`nd$>mZ`sDg80S21Q)Y_Q)e=vlutK{lWa6@h^HHv z#F?L|7(z;>O0RB+NNy#NX;l#Yo6}F1!JfoL8O+-+_+sNlN5DYl)I*=wb0JUq3GO;L z<}{7Uj{yq|5AgHa8BL~Q>E@0rdIpnkWp=OdBY&(yDE0_o6&_2)L*_|1=@}Qq^layA z8dLdd?DM?SQz+`{PyLYm!x<;l$O}$gd5UX!^rSxNk9>sIYwP1F zw)5>vf9z$781gwMEV159Y*yT)4UR}s3g7V<7`Ogif?M5U{=5nw+d;k0?-!k&BCW=`hePq???Nqz)^ab$1h?79t)qL zDXhp`W!?7W$9><0?TVa=njkzq^1pm=Q)VBF)s^t}H0U0Gte$o$;qE@g4L1&W&Q-ug zNS(v_kv&d}#X^IB#=#eHG%j$*eKZFKIE2ameKHbx(8k7X|D)8hMt;?$TUQ7~$+W#5 zflwp=e3Q)GpY{T$<|K$&paFBLcR0$^6G?=rYz{^%uHAT*a~#{OCDYo<8eoI1)=9Z5 zRn=lA?W7C2kY-^2-k?{>@(3MpbIrr^a17)yLVb--oMSSXm7FD<*mInrKyJWl4w4`r z+r`T-2@sg;QETf)?5+n5FQExxxe2I%iMaQcDxGdycKBcy}{viVQcd0tAzD88E-ysmYHD@j5jmbvqS|%Z(S45 z-AagbI3Bu=wlH#<^vQw$JOYqAeL2Q<&x#zvri&q4mIEB82%P?m4m9!X^z)xs=m3|r z%mB$|(@}ZyN^+5bRvDH$zZD2F#EbgnBr8bk$$;W99TtIVR7?Q-IHG*5FV zhM|Mvq0HJdh5Qr^fEwIv9Uf>FeugmK4=nV0kkN=3)?JvwO5S;$W*j&+923r%y*B%S z95QZ2NC=KL;YcbJuvEXrbp-9GXo-t|pz(K58veS_sYDy;=Jh&A)AgMEguavbXf>*a zVp+AdC8>%Bx6`ztUpkYQDYVwWjJeA(TgjB+-dD{S7~pqN-}xT=R3XxKAYN5`vlB+V zMB%z+&ATbe7)dpq7flbogYC6EaQ&`0&b>k}*W@hiJLC}+ zY>(h#>WBi{mGklX9p%@HZGG)r$C%rJ*z#yRxzOO?bV5)N@EYWUqV(A&GH|_4f=b|k zoVG{q3`rHql3X^?d6U~KYfnLr@bk7a+jBr-6{ZakF~pV{kUhON zE6@^cg$1mI@k{lhGH&ralv{ZQWyNL{PTOMMx%@4#^6WI~w7R!w_t06%dry#mq9>g` zAVo{%$~%E^hj=Ja(<{4fmU0H_>luLFc7{5DzEXJ|3AW!_$dU5U^bSn?75{xF2_4bS zArY;z43@kac|6#%u>IHg_ESJl+c(@)DV9ms2@6f|tG&1nG*Df7U$HiiO>g%RgphuN zO{Js}GIx{YHX-Dx>i8JpB zDs;#)8^r8i05KL@={#9l1IbHppvNWqH`b2 zUG^9102;13x6(`g`)5D3e@);>$(9&;MQc?%GOix5p}JHQ;Rh;b*@e+2)n8c2P4AOF zhgjSFVcI3YrqQKIE}Aj1;2Mx6n`noBnT25g{BqZ5D$7#*QP}U-NYgvc7AF=9nTynx zVd`5vo;AdN(DeFJ55DEo0$0Nv;I%z%RZ46=3HWA&_pa6QhQE}~lyp0v6M`P+ zhn7!aH23JpKuIsXdmcya(k@P|wqMiPDwk5{mn+T38Em!$3nvRcxOrc0j{CG^d9Y7d zLz8>{xE-ZDAEY)o$=N%IW0K7Vkve$ZHz3XCdFiK`KzUJipbOJ?$T82$)cRyW?}1QE zuMhEzjL1T$B1@1tim(;$NhvZQRfFse)@p^B`u=Wplp~N>kC`oBS`oc>?gzefH`_Sj z1U5zOp5~Dlo2m!)sAsmk=IN;#baB37^(8z%WQ>@$|IXGkcQ;M3%equ?WmS6C%Gp@f zzBs^~%&Ql*s2P^9gYnI1^rlC*!#nyGr+JfhEk+FF*Ht#x`yGUcjHtnFsKbgh z*hl}C1{ce3y5-c+*PeQ<*Cyms-oPz*eA%g ztMu|q*NaMpoErXLyneI&u56?k_HcW16QwjY|4$9qmt%2nyQG2~ekeypO~u=uv;Cys zXDQiXsIjHbH(K?kV7bbrVaa^s1rRiG=WpjtO+WKM)d(&~zWr>CYP;HoC9GhkzOSQK zwpR{DU7Dv2kHchoL7KtK^DA&|vJT;NuP~8~-!%&-A|2LQ+AS&Q9%B0<6FrOil>9~! z(Tw|OYqiy!k2Vi=OvF^)`cJhYH9GvhUBAYKlH`?S5D!?JKe{QBdJOQ`4LbdSF!6 z3?Jg!3o2z0^IPk5olEJ}8jl4{$!{crl<9tKFFV;K zwm7ABzQcXo`r`=9`Pvh|M?XXIp$p2>u1#u`TFtxux*2HlzB~{|gwkUo9(|=n3jN+A z&@O1dx_8}FKko_Mxk=Pw)j_t%hJwxKj=H1+QzSyPtVUiEWSG(kqy>|<#Tb3t`pQq1 z$YV%mP(T?Nmh(H6U~%*{RgCV+{+G4b>sv($wKt$3z*CKrg@~L6^b1 z2jQE5H?pS63h5n$ANMbdHl({n3yf;R?}M~1V_{g`Jf zbswSbo*pV|I@++>?zc4DqD^=x7b59UCCS1zl(nUAo0QYh;9cbOAm_$R{F4c9%yMcZ zQFq?HjzBK1X%KKVCR8^#iKC048+R0XkWs>$H|u~392Jzj3*ElIJ{!3X8E%U=&s7Vd z%F{N=&-iAfsDi*ZMBO@S*YKNk=Rr5)=3fs;?BHn?_r?y=o@uPE_@h^v76MDFe&Z*m z7=BYn#0^!>Z~Jh<=*yj_gxcC_&DXx_NFWV-!K#*heFN>+3WFmTjl`9Dck_ii01H~F zvM!I8@IyN9hI~(3TodoYGNXf?=;CK}#8vrO)sDwdii$$|9BE_d=KHY*Pcau|hoK-r z?9lIi0F{|t2Lm>`0y*(#^MYa_z$917P>4;MM4qFYa0ST~# zyg2#kZja{WNg{Bmm;}r9E3<8}%`@K1k@kf{L!La@tL*RZFC=g>$GK)%)`5bq3h+rf zmhPQW-;%z*z!1=O>dGxImjJGru%Wl{+=Y*Yg`2ZJ)kT}jAx=Aqs&*j<2dw%;rEYMq z8m|&!S^DwsmVP$)A@nN6UU&LI#Ais2<2b8~NKksuNi~qjJ(flqe#y3je6k|xXF8Pd zDx?(V^Cxi?-|#riszd*LqIYwU+?3Jfij>bL3VvJezxq+Qo^KZWfzmedMat<&vZ{;p zrJd8xHx>Kg&&6|==M5OX4>`K^aqP2B3ZKiE!%dWLXWxbBQ#LDCe!836M`j9E&BP%? zEQA zD=Z^M!YN`LP{@9cH9bLc{}l!r(&EL(oi1AxVPaCFR&!B^P@Rt%a!?412rNMIa<6)< z{*79$_UD>Vuw;a&3FMvWr}o#=A1@jIq$cYUZmL=QA?1l1EymE= zrXJ7glo|Y23I#310~cD^+HPUv*C={jq*|v&`k(znw?Wj#L3%0q^_M~YNie>M(Cn?b^~WgVY5#@zVp&vz)&st-4JBwfs1rB>WIu43+Iam_8SYkf`wtdZD~L z`iIy};|W`nxHy#d&1IJV{G74JO(U;KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000d*NklqP(HOdYhLgD@rJdlwAE|&|J%LTi`0fu2< zv07ob*)TCC21b(+R;vv{kq9oDhDay`%d)Uo%u(H1ZL&e9OLaOOab~kA(q^%Qx?C;| zP176z;Bt8$KA+zy5DGi_K|$ArB2kk}F0bP81vLt#;u?qI!fv<2X0bph6vE9g06{<; z91JH-L!(whXV8Oo(ufET2T2eZH!cd(Q&Pd@QgFN7gJPr*0Ag7dJU$;>UJyKt2kqCc zrR%!2ncdpXg?gPXg<%--cKR+C4VR0SS}f-HzUd@MvJ$DRTB%YUl_`{8iY3z1Qke`U ziv>=nGZ0lDnFCms1((NzQmsa7ON;pXi}h>TuU~sg-_xBIh{`bxL+Euqsd`;cDuCC; z5=nK;#MnYrX!u7mrP9c!DA*m2f4l=&mIa5yflRJIkG4y2{Ocndzpty?XtPm z8dGYkE~HT0x;Nqyro5YYU(%lyDwUO@D6lLuESsd?;28#Di3C9c0j@OEuRBq3r1AXO zGk>_-;QNx><&s~juiaYyd0FH4wYBR70wKf_85oASdp&?6ZrIm)frV_|W0c4_>-_@#1Q!Opc%+!H|0cH5Bkdkq9!m0$-K?bz5E4`8RNH68GHc zlSOWqbLt}tGhYu02^o?T$UAj=flvgu$Ad!$ivMyCgZEO^x$icY7VRq%3Pn&T74UdG z!*hV!?S@1mfl{eNV_i+j50@@IgHb|PTbftDv*SMwu`COfN_E?X5II=4m&+BfJ8A6O zyXO-yo)s8n)KFiSwSL{&VjhnVl}ZJcWkHZcKPD-PLSN=^I1mbjh>VKFE4drDeS7-U zQy8UGT~)Pm!-n6!EmJ5!ayX!A7hEp44|A3*&4$zI^s>!vN7T6ScrQPH$-a+2+KEw4 zO^uE77?!=fV8Npe+O96Jy}=FaO(sgpKKBZHJRU?wMd61lS5(iheWnXzhzdUVFg!jX z;l}mr*FbVO{}%&XZZ}+RH(V|kxI7-5G>zYHed`d$7;XFAmM?5JTknq6NyA0=GHEax zU@#h>)9Vo=5aPogenOSQet-VAR&u zkY%O&-^UoGlH#IWlO`t?@q_qotHlBk1juobk%)?n#PqZ@oIY9k8sqTI?tY*>OWCmC1Uiewubd9U6+m z<$rz7;cy5>VtmV%Es#p3BdVZ8B0*_sDUKdJ3IGrag_tyH5^8E{000~g2ONq6+DQ*@ zEA4jk&YeB8eo@xacMS#uD4|dUtHq4EnwpnJQt^L&;RU?))>{E-rM$d6@9)iC=_@sGZXRg3HYhK4f*-`e%r6FseW<6qnYo@<#LcL2wXUSKDnn`J88HT zmP)1A`QCd00lzFe8x0K&0D$1&U~Jm72>`Hr_ig}y(P+S#Z_l8mr3F1Y-LT3q==Bro zYHDV%EP(&oy%*{8GX4nf#Na{=>WrB?^70En zIUII0H~z4AxGgqk&K!&%KOW7^%_C}gnx?U8HB{QkEcyfVIpm?&|6qu$R32a&ExN$X@ki7}<9H`mB+7(qJ%v zW!ZpERd2ujC#Y1aK?39ssMYF#lw-GA=U`^~oUMUwy^(NC%!E6}isQ$R2c)dDnX|W( zMuQ>lURtP>9W1+}%!3a;h{v`2>j<{F`L36 z6p4QDr`t#*QZ`T&5fSON8yp~jp8&u*RE6i)uMY_LlG0Ki zyAS;8SN&w1PA4l62z=xoe>|(7TvK!NupPkVaxKJ72MF&pUif@IzWVAbXfztQ-ENpn zCd`{Rub*6NYb(rV^PqODRx2KU_+i*=HgDRE8yyG@)%eJ*UcDN{#l_z5ps1k@0g9qn9*^h!UbA*>|JG<~_IpwE$L-tu**SCO zjE~ITy&rn>YzD)NJZSgXy}uM#OKseajsjg1`;Ow_n>UYS|5 zXAfyuRa6`sUJwio3p?en;^D)G0}_!hT)5EB&bDpad}P|%+J+ok9?#11t9+$O{VgWM z#_sn=={JiO^((lxw$5+xYoB|rpPjb$b|0BNd-nJhT#Y6Z%i(Z_T!#sP z)HI}^L6Rhj3XA%sQxpeSZ=+jS&{q99FxqLudNl8On z8!TS3EE_qipVkaTcuHd8T?6kJV9p;ZZ`io8pS??$FAqugrQA&shMv`G{a(oV(2#$oDxNq;+a zqH^+J!s+ShXl`yscXxL{ffEFQ#-=6|78Z`kPIh)ScJD6m#vOtnkeZSTxm*t2Am@fj z(~`?$C&q#@nM{bDF!8{t6P2$GR=}}i$1r*FDKVM<~N!+1b8 zHa0@4P*w$pgftE&>~gtAx%ESBEe z;af{pgTa94m>5sivg{YessonhEPrw4tXZ@$h>!5FP=tkQK%m1uVlNchlyqvDW%q|FC_r zL?QvpFc1la5DI#kzeGpJ;Q4iHw;%p{`R36K{?`j1{qu((f1KOe(h8^334-vws~`q? zG{rCsWHK2-#1gDrkyBh5A@CqgB^VI^z?vs zI`F~Xk5(m4z3+?B20lb0Eq`On)*L>Mhix{TJ$ZTU^(7NxF9i&#avySE|3cSCFeTp(mC<_3V^cbLRe~N2`Uy;kaYV z`{jUJr#FnpgKljXX%!a8#lOUTKbOw&gJq<35iqx zGk!{9o?N9eT1+OmX&OO-AixjsemkJABRn1t^tv8!c|3Ds(zM@=i;2na>g-r^t)=B@ zgI}BBO{N-OpN`z%k4fP6oo(}5<=J0 z4X`W-k{pp!1M+&DAPCTOuOq+$3Z?qw#JEW(L6EPR4Eh+e$(W+=(WP3gmN z6f{kTfMvzK`lOl1=b3mszAi{0XcLRYO%j=`N}~y_rg;1ou|y1!NQ8#^dKe9QP#h8@ fhZB&0r~U5$Ma9=hMC7!q00000NkvXXu0mjf*kQ-@ diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/ebay.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/ebay.com.png deleted file mode 100755 index b38920ca3eaf7547f9388e0d244257b19a67d3a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4621 zcmV+o67ubdP)00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000quNkl#A$qsB7<{iG`02U%B`D zpLgc+f#r9jtH0+z$M?(`=H8h*^FH(T4`%v*POkyHYI+UeRnuz#ubN&1crwZA-zSoy z{v}e!PhJ01dS(DMPX{Rqy%7EHA-)pq636CmtEhS`%d$Fp!p_xbG5Z`6c$V9G`1D73 zF+V=erFg;lr_tjJzy`fk{tFdS6eHjNQBtSP^!U-7WX>K21(gr3mt4MGcH?%*)%?=y z=6196`rV4#d`kt~imz(!CYy+X=LcYvO$MWaX5>9@>Q#x}Ob;E(X8~T84YE;>xu5SH z?3CrwHP<&h*EcN3$J~czd-vSl2EfE8{PSw!o6yVW1VA5G@5z-4mqb{&WFI2BJ#iZG zZLB2G@dZ<_Al*jZVsae{tUMgq%rh_UR4gJ2s!ELL%-7G%b*Ig-Xd~rSO#T!EsaB z&EvN+JEXgH+2Iws%PS<;JvhfBIL9qG+pB$+Q~zBZOLZmu^Xfgt7=-aN0|0K$r93tv zhxtvh>^P4F&XI!VvNkhZ-&t0vGhmInca_5Mo^D;%6`0O1G3^aivYRSfE#xf{nlVK( zW!E1)-O*#BM~7wZp_%T%J3KmOdjddcu20+a#u?W)Vh6Jj$RKDtI_Tit-Or;!P zzuGBvh^yUmu_kh%W%q?FY=Ot{Rb~Kup^8M+nY(*T*^crLlDvr-lbO7Q0fUliY20FI zN@Kg1*R~zt>>B0d`+-Zx^_pt6LG$b3QL zmhO-OXIn-lvWP^Bu1T7Zc-Ns{1AuvV5FZ+8P;gw?Vhz?!TdkBW7D|dnPSq$InfwDa zV+u2+OVOV-wj1p1GT6~$h->E!o}qc}owMCTay|c;>2T=YUNC@L7dyiN;PF(!Kig+H zKLUWW_Edrj2?+oI3z}`!Es1p{08((g>yXu40%oNb@rWzWzV6_j?mI*j-Y8?{7s=7_0T|I_7JH6}FBGxrD&jSG9i(ubVkB#9+8$^IJ$d!1U{m)OK zV9#U3!cqkQl0er)DFOiI3khIK_y;1+y;6KZNv$QPGF&{kC(Xg#pG%^7Sw{=5{?)h< z!qG&qpZBIPq%>(cC4(^B-+^x00ud=Tj2qx1Qx?` zyr{`c>m@*pnT=dJdHffD8#YiX=RgBb(diZJd3Xd{s1HV{Mm7L(?M*wKLR7*go z=N$8_#%Sal!ep+jGlA)h`bydxN?JWAk}2Cksk}=oNt>bDrE-o3SxA~@;HOPs39#m% z#oi%1$qaD)9kN||?PyzAp~WYlU(53&^I9NQV2TNzon%csPbW$uLWja#{gwV!Jhk;u9vm~8;qZa*md_^Tc6F{|tKUQ)YfqFw*5!oT=o z`_T)4As1gVotm!f3NU3hgfS?a8M&s-l4%qCl4RJ*3|q*bZd*~$<{c*hP*o_~t5c3g zXpSd@aQyBe#I=@N8`AY>aRAx|zD2gpwRX*mnzqq8v<0IW(_`b-h0WTa(b%>nmKD_V zcwprURQD~NOf5s_w;N#U37i!c0x4_!83H1I97BnbdsVIzMuj?=Huu2q3uOI>}h zZ#6E_l3yF2;jG&tGK0|grcuj1hpb{9;)F~Pp@GdJBA#{q%lpH+9U05C-$+Wj6@@VJ zr`3T>`8#nh;sXgGlVvWf-73xx00ft40tvDs7_@j4jj5bjyO#8h(QQgIoII;s&o^AZ zWjuAZGGlw`sLu-Ca4)p+DQxHmoC3)Mo8~$@|21`*4`ROKm`i~BVAgF33tylKPtbIn zXW2Euamd$oA{VmG^Q4FbDQu~C@6V1+lz#eHb840bDsD=qYc_7SP=4xWIyFtXutd4E z64{Xu3#Aw-3}Io+8i&9<&yZ~7ry{*mF^BKl910t?xNqZYu=QVM?Kg<|kI?v!VIHn;PLR4Uh7jxrE47DkSJTB2MS}Fj#O=%P_g5lsMLvSGoU63JbbQMX$pFB|Qd{mD{Np1c229z;~47 z|2}i?V-pHvfKytQaun-DG}wFcDj7hRMeD{oADh7T$4dJ?Vt3bQNCF3WekNB^B$f^2 zMymjjE~Q$MYMq%m`pB?=bUUPU!sVMAOad5S)&Ut!8H}=Ycr0yKef?@8fJcDA0P?{y zX#W!cXnaRXKBG0wZ8}b8T@p`RxQ+F~&z4l^9izWyVY4$nX>cS~0FZ7hwIBdzX4C%Q zo}WmkiWb69!9#q8sl&AWwhwmV7Or_j~|j zxO`RCYRf0ZX)Wvv8@H$lU{x(&02s~uV;E_XTZ{45{Z{^VpNbEP+Y|`pz>hc93Yq+4 zY@I`~>_9BrGfujc!~vXN$^js|B&?_tm>a~G-%R7_#f2^q4785UaOP`t*DVNj2HmcTKmHW0ARS}H;#FFd5y9e z_H9XNIXFYfCaSiGNn2RwX?YXs1AtJWbMr0W^^K=zfN!osJa^KbAO}j>9&a3g@$_^| zZNHKHW`-Tu1>b}r8zmc!VZK2b4oB}EBrim6w1MyA4cH3);6vkv-dLlK5fBhsfV*2v)0lM?6*^o!6a#h)7W>cGieR_-<7USuX!gfi5P&#K{=B=#nGCyCRITb zkD@hhQDE!OBO1jx!~uQN7T?zP8_ayhNWP;b-%psEyZi8FBmb)7*(eAA&_~Tq)dVFi z{;GOjF+WxUl?WZ;in&cSx zxu*S0mzXu?bXwSP)T|U1kn~RUkY7HR_Qq-e;Pe~{w8ZXa$(ZY=WI2#aO}4~9#4=cj zaVrP#%NGK`d;5A)=*{u2DFKu+la74=X)~liW$%5?S5{Rag6Qj-e^tVxn#`@(&4L$O z_F2Jtt(1DNU?B_41&vT43*w>ZAb*j9GEgPr<>q7PxyPONI?h-q%yy-Kd{> zlMM(7a2P@Y0DvPXnS-l=p3qvIPW)acV2B`KypfM=w171gDJt3nX0Ma%*D>c|%yk@d zAH&?nSbEoLH?8rzUkfh;*uo2SpS%f1Y#F%#358>?DPP94JvO(2DT8Z#+8gqYR=9X7 z%0LCjO$YiY2cwk31C>LAXnbn2kN^NYqC&8T8a4oXwQw#SJrNJIQB4x5MEqBfQjz_e zTHBT|X!H*nlMy2qf)^TL(Q*uP332MnA{IC3v-oZSW&b2TUKV$r@I7)nWOc~)EF%!A z6Gz1-o0J>If>XwdTO?^Z6j#QT@?jDzV8B&K1t3yrvjn&eRHdS&(c|Q?!VV+|q3##K_Xr$mc7MVm-sLN2bwVN~W%M^S_K3a_~PlKUK zKrwytkLbv}7H{ti=)L_dv|c;jdV6P3c&_i(Xvuq zagnZ|Sg$SC6{$_H#hY?N85S`(d!vD@UhFGA;_UKhAb#`WRgO8#8Te0&;^%dX4slZ8 z9Q4d*a_o}4{ikn9p$SyQhsKjYfFxuAaH6fu`Wav0`uQ0T0eIxGN;3Q^G4;sg!$cCG zMe4Sqz!RkIt3Ff_#==Xk&HY!und!q5vWCTHq3<^{ZEem;ygza2x2V}^4pA#094MG= zzh#ks+O+p)`cDx&CAg`%+Y{-b<5UKO%c@DL`+DZzMjyWqI)fjBG5r&U56a5*SAW%B z%r7b^p`sMtT~+s99a!ss~x z2ofAVLgx2mF(B|?^^$+|g6Y2k@V^n~UuCxj*TOVkFufE2|CjWF0aRW5OS$YP(u)J| zQZ)QO(@R#NmyhbT4ZLc44d7MNYXGmBUITcwWHS8^WiW!0h;Ok&00000NkvXXu0mjf D$PlZ| diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/em.ea.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/em.ea.com.png deleted file mode 100755 index e88b641c6f749d4683f3eeca84f10492012cbd41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6157 zcmV+o81mKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000d*NklqP(HOdYhLgD@rJdlwAE|&|J%LTi`0fu2< zv07ob*)TCC21b(+R;vv{kq9oDhDay`%d)Uo%u(H1ZL&e9OLaOOab~kA(q^%Qx?C;| zP176z;Bt8$KA+zy5DGi_K|$ArB2kk}F0bP81vLt#;u?qI!fv<2X0bph6vE9g06{<; z91JH-L!(whXV8Oo(ufET2T2eZH!cd(Q&Pd@QgFN7gJPr*0Ag7dJU$;>UJyKt2kqCc zrR%!2ncdpXg?gPXg<%--cKR+C4VR0SS}f-HzUd@MvJ$DRTB%YUl_`{8iY3z1Qke`U ziv>=nGZ0lDnFCms1((NzQmsa7ON;pXi}h>TuU~sg-_xBIh{`bxL+Euqsd`;cDuCC; z5=nK;#MnYrX!u7mrP9c!DA*m2f4l=&mIa5yflRJIkG4y2{Ocndzpty?XtPm z8dGYkE~HT0x;Nqyro5YYU(%lyDwUO@D6lLuESsd?;28#Di3C9c0j@OEuRBq3r1AXO zGk>_-;QNx><&s~juiaYyd0FH4wYBR70wKf_85oASdp&?6ZrIm)frV_|W0c4_>-_@#1Q!Opc%+!H|0cH5Bkdkq9!m0$-K?bz5E4`8RNH68GHc zlSOWqbLt}tGhYu02^o?T$UAj=flvgu$Ad!$ivMyCgZEO^x$icY7VRq%3Pn&T74UdG z!*hV!?S@1mfl{eNV_i+j50@@IgHb|PTbftDv*SMwu`COfN_E?X5II=4m&+BfJ8A6O zyXO-yo)s8n)KFiSwSL{&VjhnVl}ZJcWkHZcKPD-PLSN=^I1mbjh>VKFE4drDeS7-U zQy8UGT~)Pm!-n6!EmJ5!ayX!A7hEp44|A3*&4$zI^s>!vN7T6ScrQPH$-a+2+KEw4 zO^uE77?!=fV8Npe+O96Jy}=FaO(sgpKKBZHJRU?wMd61lS5(iheWnXzhzdUVFg!jX z;l}mr*FbVO{}%&XZZ}+RH(V|kxI7-5G>zYHed`d$7;XFAmM?5JTknq6NyA0=GHEax zU@#h>)9Vo=5aPogenOSQet-VAR&u zkY%O&-^UoGlH#IWlO`t?@q_qotHlBk1juobk%)?n#PqZ@oIY9k8sqTI?tY*>OWCmC1Uiewubd9U6+m z<$rz7;cy5>VtmV%Es#p3BdVZ8B0*_sDUKdJ3IGrag_tyH5^8E{000~g2ONq6+DQ*@ zEA4jk&YeB8eo@xacMS#uD4|dUtHq4EnwpnJQt^L&;RU?))>{E-rM$d6@9)iC=_@sGZXRg3HYhK4f*-`e%r6FseW<6qnYo@<#LcL2wXUSKDnn`J88HT zmP)1A`QCd00lzFe8x0K&0D$1&U~Jm72>`Hr_ig}y(P+S#Z_l8mr3F1Y-LT3q==Bro zYHDV%EP(&oy%*{8GX4nf#Na{=>WrB?^70En zIUII0H~z4AxGgqk&K!&%KOW7^%_C}gnx?U8HB{QkEcyfVIpm?&|6qu$R32a&ExN$X@ki7}<9H`mB+7(qJ%v zW!ZpERd2ujC#Y1aK?39ssMYF#lw-GA=U`^~oUMUwy^(NC%!E6}isQ$R2c)dDnX|W( zMuQ>lURtP>9W1+}%!3a;h{v`2>j<{F`L36 z6p4QDr`t#*QZ`T&5fSON8yp~jp8&u*RE6i)uMY_LlG0Ki zyAS;8SN&w1PA4l62z=xoe>|(7TvK!NupPkVaxKJ72MF&pUif@IzWVAbXfztQ-ENpn zCd`{Rub*6NYb(rV^PqODRx2KU_+i*=HgDRE8yyG@)%eJ*UcDN{#l_z5ps1k@0g9qn9*^h!UbA*>|JG<~_IpwE$L-tu**SCO zjE~ITy&rn>YzD)NJZSgXy}uM#OKseajsjg1`;Ow_n>UYS|5 zXAfyuRa6`sUJwio3p?en;^D)G0}_!hT)5EB&bDpad}P|%+J+ok9?#11t9+$O{VgWM z#_sn=={JiO^((lxw$5+xYoB|rpPjb$b|0BNd-nJhT#Y6Z%i(Z_T!#sP z)HI}^L6Rhj3XA%sQxpeSZ=+jS&{q99FxqLudNl8On z8!TS3EE_qipVkaTcuHd8T?6kJV9p;ZZ`io8pS??$FAqugrQA&shMv`G{a(oV(2#$oDxNq;+a zqH^+J!s+ShXl`yscXxL{ffEFQ#-=6|78Z`kPIh)ScJD6m#vOtnkeZSTxm*t2Am@fj z(~`?$C&q#@nM{bDF!8{t6P2$GR=}}i$1r*FDKVM<~N!+1b8 zHa0@4P*w$pgftE&>~gtAx%ESBEe z;af{pgTa94m>5sivg{YessonhEPrw4tXZ@$h>!5FP=tkQK%m1uVlNchlyqvDW%q|FC_r zL?QvpFc1la5DI#kzeGpJ;Q4iHw;%p{`R36K{?`j1{qu((f1KOe(h8^334-vws~`q? zG{rCsWHK2-#1gDrkyBh5A@CqgB^VI^z?vs zI`F~Xk5(m4z3+?B20lb0Eq`On)*L>Mhix{TJ$ZTU^(7NxF9i&#avySE|3cSCFeTp(mC<_3V^cbLRe~N2`Uy;kaYV z`{jUJr#FnpgKljXX%!a8#lOUTKbOw&gJq<35iqx zGk!{9o?N9eT1+OmX&OO-AixjsemkJABRn1t^tv8!c|3Ds(zM@=i;2na>g-r^t)=B@ zgI}BBO{N-OpN`z%k4fP6oo(}5<=J0 z4X`W-k{pp!1M+&DAPCTOuOq+$3Z?qw#JEW(L6EPR4Eh+e$(W+=(WP3gmN z6f{kTfMvzK`lOl1=b3mszAi{0XcLRYO%j=`N}~y_rg;1ou|y1!NQ8#^dKe9QP#h8@ fhZB&0r~U5$Ma9=hMC7!q00000NkvXXu0mjf*kQ-@ diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/email.blizzard.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/email.blizzard.com.png deleted file mode 100755 index f5baf8db852946a1c01959356339aa4a65c8b473..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3194 zcmV-=42AQFP)b}02jiuZxKgf4a783`Toterha!NDp^Sx%LvTXb0)$FpGtwZmZ;Uh&Go#T+ zGt)i2ynFJ;>mF^RStP~Isk&WVuiv}x`|kP9x#!##$~J1$s85d@H}1>nbb2BGkFB@2 zx4EsY?ZNKu?#BQGprN7R-|On?KJ&YUHZtqz=y;^Hwe?S2CX>0lv9a-i-!-6-S}K)V z+}qo`%{4SMJeo)(8ZTxtQ9;Ea5`ch;paO`XqNoI5c8Q>$GUwd%Ae~Mxy0~csF#$2~ z#YmHYsUl_|;3;8TdIITmdXYNk5*Ig(VItr?R#Oj+vmjH8dXM731TmnW+NCq+Tq3ym zX$12ju?5TUAN~?P1dbiWHvSa0yhNm>$Q%C`UeJ-_6+|=|2m%D@8o1;0cym~`3xYWQ z`cGm_w_)Cha2q1!C(7}0E*L>nQ2|jc&wi;182!Kz!7y~m?@_94ghDSufM|f^bI27p zpmSD$g&<%Um2lAkoFNrr$?Ecjq2Y{}fIY{O|-fA_7ugaS~~y=@w|1jRG=uA{6sjDh2y~15f=u z{%8M$+q@2qCkU_k11z3Eh*myQ&w1e0UxqLA09FqE!EN|KTz01dvDKfWFrx|I)j_cS zal8v6Q5B2WubxCoB@89pwt*OmUHcK3y%c-rWhw!Ul(Ul<9!1O}K^(?ShAsb7ewlzD zoW-y`AP8oLPM%3=?o!BhBkhObikl;kxB!msN7`G;YwH0hZhM(v>xo;xjd{_g(boYY8XMg~iukK>};t9RV3V z9+@x`89x;pJsL@8NKTnU>8?MAcQ+As9zsqY$DiyZtYj#SBeSl?Ui}FsM3HVoNAZvZ zM8L!<3yP#`v3MNbT@T(v>s~b913?VYBzD~=&`C3~LJr^4iDkPf6bsjIZLbx(zVca7!ql0_7!mJpCJ<`6VDw(fB6K(m(~%Yn1Xpf zd=Cg7r{zqbRZz?!$4?S=974?FOLjYNYh)lg4Kh}^ShQId1NYl+w z%%MH)NXKF1&`xaMR($(m?8GrF*A3IILJqtI*#g0yckr+NguWX;O>o=2B*#rB`^>jd z6T(5^4T$W;Kq+1 z|F`|{qXGxaqUuqjfQr^X+A=KHi)*?8@4+{}41jhYN1ASoDvUQ?0LqI1(GK0-g6w=9 z`OUB4{ry;}L}}toN>xd$c092~A3%Fg;?2Q~t06N6cDxoX&=5g<27$=z)Tf_lQoeCUyMU z6~W>gaeLmvKmR@0y%|h~EWt-q3snHgTkDZb4bpfS;tSD4d$&L)gVaqK@Rd@jsux}l zpZ_kZ4*TIhAkA+==MhRhS&9m_>UOHGUV$?YHh2aaF@cKtmR;zP-Plz(AVhmyVb9xu zL+YoU30xJC=q|Z@1>F5561!f<-d>M1%))kUhDZJy={yYHDCP^~Z~p?ZPuz#7m0O4N z@5m!2Ab=k?1I>m6bC+SM>L^nk-b>Kdg1>AbqT0U`N~P|Ze=V%JpP=U$w(i@6`7BJC z55;^`Q~k#`k*+qx3;t*;eNC%Lth{STJcAMtqV7whq8Skd7lWmD5boWAv>iZ}-yV_b z%c8qqhbgn5swQe$Dg>^&5&P)Z3Bq374<8`k)d8_MHf;`aWDg#N&ZF?3j{qLRJaitT zc-=?PG4`B5{5^IG!tuYAwOk4y7M*U&My!)-AFv&i~I4n$n9wclps@0xbkl7r{5{dAOuyI zzXA&lEA${$DJ*~h*?yt*3y z^M?tO)%dZKkj7b9{R~V?_*jx+!IOLOQ3@NLr8i%oudk0{sW5=d2W=Y!L~!NJOz!+k z;)`z~*z{u(o1P_}sKPlR76iEYE6};i2x5X>{rgZoie&qKcziAS)_qtkgXOviuU~`S zb`Sowm&l=*OOP*lO1Uh>o;HfdyXb4#hJR;0di;G*2i`F812$(v^aF+y#mwU}^@LLw z(&tOqjBChl{w3DYiFXb+W&%Dr2Bs~>kDEkHt4O_fgu=f*NMGwgoO!J6ZEWQqp{wsB z{?Hfc+wflyOGZ6QDG#LrnmtKa?CW1yFVUG(8One*WJ6;XM#WrBEmk)XDR|uUdD#7r zLDvx^Q-hy46-$l+frL|%|NU>|N6)6veh_JG#=;`p^vCFzAEs*Ecj12e4&7fLPgVd$^)W;KaGHh z3|Y(#8N?!rLx2*@T@D}r8gA?aL_(zfAoAJ^6gNCa>85)T6?pY2sG9^=-Gp3w2SGy} ziKo}n_t@W23;|V~ca$id(YW`YYLD>zbO-{VD&^zE7-og2OsK9#^Cjr(p=6-xG59Y& z0+|}9N@2Bi=$O$|?c0KD*+=h>)?!C?Aufo{N>#Bi#2C6*8_I?e142~ahls`y6uP?c zxf~@FCjpi_L9p{R;>jd2io|!nMezOmDSUM`xu^dbf5WFBh@%!FJ1tUzq?2fOPOq^{2m^w9eF;f>i z=Y8k9KFApMjTbd^%tQ-r`mAX@V=6K%0>dG5K@H6X+3_Q=a}&(J4xBsVr;2O_(*96V z8ZrwF*VM%ZeVM95eTa=22f1#nc;>O84~u8$f4H%5NeK-0LRA<21sjHV=Quq9R-QTA z1H%bq0kS~V1))A0=Gg3z7^*y&(=SUhK(4OU(395N$Fp>H~% z3s`e02mqLQY>?v+QFqQY9~S$c5p{z;f0q44<;z3-meMJwrNRa8`8{O>S=Qo_(7!qBCFgft8=)X+HyN+SbEcO#8R2m=Vx9RkuJA>G{}Dcvx1 z-TAHia9{4zfBhf!IcJ}<&R%=3wZHpQ5$dY)&vB`70RX^rMFprP`X2CK!v>kSVN$|(x~ zpleZtN@;r-9xO)w)}6R`c6?u+zCIqJ4WqFAAQYjg8EsIo9{awLkpn6#4JQymYBDe> zQqbS{PT!P?Hy^myEo`S=UZ417oDW)-HEdEke?3Wa9u!{Y5~pa~W^2TBq5J?8`O1ay zQZ6ZgAV&!jHpZOUu}wT`;)1iy^FROm-UR4ZHrC|w2J^iqFh!q2Mn(|JmGbceun}*q zvR(|sRrfKg5~M^Nn;E$hBcMG#?qerI(n{?)m28|F8jZL;GyX-&6u#_x`C)f!I86&z{pBh~ zteS}u^PucS7@ePbx`-?6cYiXUW%YK3+vwTtQ7d=3Kgatx!0I+dk0uo;xhW)KGJzjC z&dOg1)j{UeCPZjIh}93W;9HKQt8@+O;O+$=?wO(k@sfA+PX(e-G@@?%e?C76BX}v| zxCW&z1y~3SX5a_ewp*Cu4(&`7#L!7{x#b@RfZFU^uI0l1B{Jac<_qg;UmPtz9(NEf z``sQ0F8iFJb|#K~AGN$TsP#GNqS#SXoV`IWg)A1#QD^s;L(?6-qEun$!$wTI-v_mG zRhF%&aV3i`V`+$EJRI}WV*N??3;U*<-IDUg-Qtt=o|u=S7v=u>AQRzuIleo2M5RIB!T; zRhxG5f5=5q3wWNI`xGKP_bYm$X~pM90{Sy0MYtF;Pks~XD?ipPdD+ZYTg@1H+XCI$ z7acmDV|$$Tu`)9RG8mTp9EaD=h2T+qX^G%I)W&JP*&fU3TZ71Xnia@ijfrZ* z28_M0Fb#Q6ZwM5$TNKiG0m2U07)bKJJ*d;RIM;h-(w@lKiBuQ(IQTsryP5m|TYc`A zNl;ooRXt(CJAVWUS=4WEe)TgB`*5L7ZHYnv6cb|nftxn=X-B=qdWu8T z&31~LrV!5YP)`{Uu=Z$~;aiIsV>sb8s4~IT^+uh6|5Q0`>`oMnupoSuN*ZPT@6TuO z$X`)P_*{LZ;^Vzkx&AVU!@p>by_e%k7><#-gt!jMrq8_Uv+V0BnXEADAqX2#9{Kd+ zT%>S~Wi2E~YqG9~yF9Nbj!}m6h>Y!$?Km=rUF2^{oz|ZL+nt3>j9EB!JCaWS z6uh|+6~hnrNB#u{lKdR=qdpIhGHPaaKib6eiq5O_Xv91mmYO_=AI^WOofeg;HaBZo z+B90# zc#+fuzd66DEkdF$>ssvpK3!&6*)l^$wTQUCITa*a#urK9R${NDdy}jFc+0p4#w-Lw z@PLWjMsxNg!>-gcZ)E2j(ADTv&%5z5O5$ca2R#SM`OMOf&!hW;9_?4mq$af2lf+kg zZY<4RCyviXB;9WX?rr1pTkF>$jXVcQuikm}ysQdYh|dEb<`Dyl`#=!Zkg-%N0=+)M z4A|3}T70bP`;SbR2mf!9g(OmEmK>wi4B*lxj#5*44do08aZ9K?DYHk7t;FSG;j#-F;wb$K@kW;Ham#uS6|AZH;i#qw z{i5$Ts3D_B-YLRnTPFhGcpWY_RQe~J_CyU}Xm>Si^s#0vR&AxBt1O20;FXc>lR2E- z{y&)2x&aZNU{oX%hF+UBFT28e6Vo}6q$ACNa4>@iL&7XGImWl|S!JgFupB$;$T+=O z`+Aqr^oJJdH|56|UYk1pRgo+f%LO0Vwb^?uM~myIcBNegUe_^gj}rjn{HuiqTJJAf zhkWfL{8Xi;+w!mjJS@QS26<|4W?0J?SNw-1yP`0NY=@LGYB+HCH|Tth+ct-OWcXgZ z+xjbidpv6vgFb`z8@AHD(M5?qb^n&P+!XICVrETFM876UHTh(RB|79ds^$N3T>iF) z&cDg`*6n8I=ex6coAQJCnmu%>5i&Pk>l2P&S+FTJ=Q1MioN&L0z^A(+De#!}F#Dvj zdG3#z&W0J~qxCRSLJa2>QG0jJePj?zl>gOg7{4THROawK!2_Y>-Epfmf|P{-+Z6NJ zXM&R^l$ht*!Us_|$@9+2-&?~O^P;wED)B5|Gdw2ham?%}MZG4!zbKnXWd`eDD? zHJ+!m?6Lm*@{XhIoGDNJYqm2Q5-Z}rDeL(E`zEiqhuSx-_J8zaX!p9axbl4*bb$BMt|aD47u^=$ z1wE#Tx`zcomo>3Tk{B{$M=Wozf0=abGY`YnKXk}NHD1iy>X+WBwY8r%htF_jm8(hV zptxlr9Q|lii%h3X$`Isu?fQY;UVVv!tgz>qD>F56-$fM-)wi+k2U8uvq8j9;Qt)Kn z20>+ybM^sKF|KZ13Tlmx&-}L+3-RuPd0U4wK<;G~~Z%!L^JU z1$^9ISbnRkzv#*Ztv)CoPh|d37?OIwYnla+;(Z0@^5B5ENrzt}% zJ2{mD=MjSy8MgX~1Fd{E5{4M%4KsF(EYrWxYwnK<`-9E2MG{K0kOo%MQS+}-C{G)vc}L3Me2!s6_O!h z_ufqGUR)3~yzMFRGltp|bkTYU4EdJge`h0@dYdfwce3Ww>@RxjjyD@de%E<6`-K`g z`7=;4ZdZ9IHxk>GDvyhho&pQ;Pk2noW6V`qw~vjWlk zrX+#^hCfu#Fv0-yQ?X8LMQZ>$||Fa*j$KL;^+B}<`s?l{%S3^Plt({LE zD0X{`zR;f&RS&P%dD(~P#E%@u#+0Rv*||~4El~;nm_q2bwP&!lG}d7^`QJ){lmK`{ppc{1$A`P?Guh?#m6CeP!+vSQ5=rD%?vok_&ww$< zQ=VM-60Qo@%Qr+A(?s!=(ZLc8Y=H-uY+5_=5O#rLQeba>YeZ2ncgvM28a-)LcfkyY zD06DBDTMd?2B(eBPo5F0u$_rmaI~y-cTxzv_#xw~8LS4Xk^$T!3;2U!*y_AORZ9nh zMUzWZj{PdvWz+y9amz0v7CB z|F(?4M&scjfEbU^0E|n(Te4+s5QI-{O{d=v6NG6di(8Lci{wtUC_{>%>Sk4{UwLM^ z_*D&1g?J=$!d|P}Snsxsb6cBkIige({#j>x2o=u_~C#J^8Go@m%{+D zqzn%5`{5vp@oM-dw|CO`wyK0(7RxiB0#O9Aal2~KbcB#Q&|q36HcRUy!o-C^$4aPt zKC-3=4Bp8D0YbHS4Xj4*aNOF7wHRriqh8?s+ItHjTo-t zE?l@#Xe{F#;B4EldZQ7~syg4`+cP&|IsACMKCoW( zehj-MzR&Oz^KWAlz-V}OmxNuYV(-@_?tU1C<|EpT~EX>g+SvwqMc6 zX^+&G7RvDR6o(5SL@pUK-AYA%&6Kz|DOZ|y6{FctBM1;x_LQcaw#e>iiSV%Atkz*n zCbhjjGcK9wyZAzF3q6V!PA0zzUAC^bTD%e{(ajKgsEOc4N%}o@tYC&eBrs$uKXSJS zx!oSPg98>qjeWoK+*|PVP)2aJDntU=*NZ1b{4jK^2#Z0_gO!M4`%2P7glwkKq~dV; zns_W}jbj;W1+`Q4L$EdF{%wV3fy(A;H06@(j2QGnh}X#boF~gYj1zP>@4x0di(&|DOo>4L_+E-1qgm|kBEsqk37dxB*-#yqkz#tM)j*H}&T~$s zBnf&|acRlBc_LU}4?`~@i(8<-SoL-lV+L;HKgL5vXcDvWT&2Z5HY7zJT+q3xlE^&rZvL^)u6;Dzw6BEh# zGv+S=7PQk`MlGj<$wyZ+*yj-f++@Y@^&fv9Z)S2#6E>56iFo$&m)(Oi5E zPA;NyAKdYARY*5k%@6xS-?O0u9HkNkQOuQBcSdBmD>g@u$(&Yxp42MQ;#)7|jV|mBI;yQ8HfQ9@j6k!qy z-jcwtcJDPv3autSqAB-pDz5o2+MLy%7YDb9&B1rtWNIXa)>X-(rYjZlUIzzh);R+( zdLGx^$-9P;00b)pg++!j>V><@iG?iPaz9#1mUtCz&(5w<_Tkp2foe+YS`0|ebtmeL zZ{D^`qNXqhSZsCMpVhd%{T&N_YQ>IeZrDBFNq{kowKLs2si363L_l-p(fxJ7DX@1^ zLz8p3BQ)wepJkarpq;qB^FXf$MQRotQY3tDhSNmX9|JPC;922lZt#l>sa2rrj-|Av3;jhWapxe}&QzwHMrq&3X^W37 zEq$UvI%n0h-uCj%&e@40VwqHzj+i zbb)BboK9bc4Wpd->B&M63h1EvYsLXKo+%T*p?o`r%`l5=OXu_JXxiX0bO51VDM{4v z1&u1<%AmMO!F43qe^^8 z$4{b*H}XB7a(NgEm-j_b<6$rxdg5Yu)pi#U?a3Utgxuc}E_!a!RD2oI_}&Ap!=aP# z>9lQN)$S1-6g!`EdZu?8brYG@d`Bq{rHV4&uxJ}P{7Z2&U!MZlNdGHpPs2B@WmHun z*)WvWk*9WjH}5KZ{*go%Z3Onyg2_=mV)@i#e#Te|C1q{b=dXDXQhY9W)@Pjj;@12s z&r{M%F-iNyOW6yd4KFXIv?U&{j_ZZFbK z39q}0smCa*iB}>VWtfcj5$?s2*y>UNl^`%O7>QP329@Sk-KM_cP@M|1sk#Qo7>S!g z-)sWEkWSKhTUDh|7i$@_{SgY?azFjaxS#8p$DaCvtC3Si!KZ!fXKl|Ygg2^^g>E~7 zadmu%6#shh%3=S95NS~i%d-ZIucbsWG(@04u^;8%$ zAfbw6r6sE9mb}?!6rW4Ykfr~o@}bK{fg{RCTM%j}m7$r~`n{`m*F*i09$(KHtsWMt z3PiAo2su_i8w;^CaBLdMiwe%r!f}hTwf?aGt07a5`e)G>$E@lXY$neq9i?v>gn@H> z_Y^prwJ#6(dv{(Ox7(o9gcvSu|Q*%CaJbJU)`*Ju%fRm(^O&i`842#i~ z_-RlVO=-|!xcckm;}amVXma&tr?l=<7t0DIu?3ViPkLUlqxoak7oErJk+5saHI_K% z;NDA>LtM*YpRLmd=PlK&)`o{x;w7Im6>a9jSlF$RQqj5*5jZOhARhVc2}3c+7-+)Z z*0%^Rczp=R3~yQQd`9O3`W)OcI~mQH5Qu^kC;&*GA?GQ$4aGjqVn4Gm`&LCD9oiH4 zM`hcw)u_d11FioL|K7Gmkg%fNBUF)=Wy{0O4>gJF$(^obv{#b2=oC3*wl6UAzGLrS ze4rmDwz_gi7D;S3az6}>i`@R@5d+iQLvvwL&GOWhV`*ZZaS+~^elVwTrb>N#0y8+F zl2!O<;9NRZ%EF&aO%5#?Uc7Z zc-5}qC!K0yDg?_P?fQI8B}Hmegd+$|_M-x;R~voGpEQn1VQ~WpXG3>Sx@nT{o69$9psa>E(*aEgwHzVWj%8H4A$^z zju(^kA)EE7utkW!sOGe>bUBhH!|!GXvvGOUa6Q88_U3%gnSzgtTa1(^Q&;QW#&@Ao z4ROr0cnxFnwN5V%$;dccLdPGK`?EAvL;yY79NglOi>c2Vmm3LCPBE$k6KdTn&qTLem#!pRu?cWM{CEmC;DZC)cbK^OeR*b zvq8R6!5m$lP(r5=W2)vl_hOse@0+k4ooy0}T_TXzu3pk|5eGGLey9!KR)i7E37!~+ z>{o}E2IwI^s%!VO-k1s9J_DkD-j}G)34&5a1fH)#HjY<2(3^rOL?~SKBdY!t)8ZS3 z_9A?2_Fn3dSCQULr=u3p;CKCeO#DFKU+WwEiS=Q8v|c(Rk{TRus~PNa4`Zt=M?{^s zmZE})7|Y`Iaw)!bNo`7W;kb(uBrJ2j!I2+a#!WA z^Vqy;gqz>k>HGt*@?W%_#-N^J>RfZPNq3&Cv!?rAG@!lNs$c^CV6BVXblF%|^MAXU zT=mA=o@blF8AvH-T7g(|HW6kGzzia(W-;9%|3~Hy&bOB|jYRBx<9ldvO8#1(iFEL4 zBcq5s5jGIe%Z(H(%IT^7@`OZ%rWt+Qt-q!5TKoFI-jGDv`TUUG^{IKGbKHWeX-FxC z)WqfTqsPU*@ZJjAOmnaI*-Wl+U-B%dS8u0so(3hToX2n$si!x5O$OCCthOf^`3XNt zk}B9;|855Rm%Xc!Lw$qFn05+~#nyOe+`%>~M^*T7pK+|^97czR8a-4I+=oj4LGx1w zv=bSb*v?u0>EhGUU2zl2`uQaeZUkplZg$4zh~#7HfkwBBCg2gQqS8QB+;bP7D_HzSx(i^@KV!q_rNs?9?ak z)~3EZSm@!XeG_NTo;;+GaAy;sAZ0thq2a|KWcfT3I%j4_?ppNk3|#ma>Kl)If^Ti= zJN@yz;fQrZ-!V@svb?`((`GSr{M{U3O<=h82p4CJQ3ukU`)eHnWk3J zdXX{$Cx}{#9P=p|v-6*@LLkgXKz-}@WWBZm89N87J~?&lTW`dVos3SWB{0BB03aUl64|A#^^a_w zx}(%TTbv!u#4l`vX0W)}I@~LIp>EmO!8mCF9Ei+JKz-BT*1%#QVkgHZe({$tPdzx5 z*g_9n1T|f}9Y6>%66V0!A}oy-%oM&G5{_vwqSQo%4Z2Ge9e~yHeE3L4gP;B7uUSFn@uwKi;1H z!H%|;md-2$70B6zH((j5>W)qxzj^<{NTp9*W_+7Y)MO8#K+F`ZzPm8>jq3_m_YY-8 z16eC1}x|V(E;H^))e?D|Lc4knr`A!PJ0H^Zf z<0pPN-KtT+%s_yAGhILh-HNWDpvg=UW?qFeq35nw_?07%#*&^5S!AS&__Xp5C+hIM zh*A)%jiyNxhzbHp50c>G3IPOAfx?Lx!PTOS6t{q|@$)a#fuDTtl3&R}qTm`klX{lL z&b@Tv*!BCWRW}G^=QDGtz>M(FShlz6rR8XAi*_X{z+`H#&D)__KU^_*gA;Yq#3aPT zO4JkI87kbhdnmKuRy#mM2w>0Dd=(u+Pn<_pBCwR5CB18V@uL?Mc9)~pL{^`KGj$%A z_CFY@KXjr#S_z0n)(E9Qs_+}{Ib6B4fB2gIiyFw5c3B7^v2f2zkKXsnDf z4bb!UErq|mylqE00zhLRh=zrTKp{>65dbIV{nw7v{_aTCawV^ptwJ+gTRi^wt=mea z9@3U*KmmbelarUjVxgVex|!MCL&Zn-cI+s-)H4eVgnr_-L1U~|d6r#HEMbD<@YEYOJvB=z>;Eu}lQEIfR4L6cP; zKtf`FY9jup7pq^qG6X0|5s5$muD9zooZd={o2pC%^xWN(T-zN7=AKU#IaRX{J~j3H z=@d&L8S%j3`FHgu-@LA4S4WfvIu#?c!1wnj4-Z#`+H42+y^;DK?VK;Smdz-Dl7Q3Q zor93b&Y~>=V7#&`idBt-zyJ~X)^PRt(Ry4IjT_x1qOm-4rhfa+rjA!b5-G_B*yi^ppn!2KlXZLcbp7aDCc1dIW}O6_KRVGrGU;;Uk%$`291YDOTEC>A5m7m^T+XQDI17#-rf z2u68SBN9d?HY1HS%A=aqR6$6DSEtj5PSieiaod8o7$O1{WWfZ|ndqK^+p{70{UKCR zJ2ad9_hk0-vHBBd(qGJFP!)%B(g#F5ef#Ozc5F0IqD4~)wOT6z#TmGk!2l2f!RHRl z?COZG?J1bi8*{3GAQ%YdE88Nuwx@7yPvJ9{w2fB%gKt#7^77nxHAr;U=qlF>eW6y% zeNJ`x13Vf@M6<;t6l1k;+fT>-{*}3Euq4vhsZ)^512iY1B7w+)<$a*!{%mLY$y@t& zZHSqLvq$jxjs`Rm0$u*He0OI#6Ddw6Q@dyX$8pi|(oo@%sjgxAYhHbS0%&LtuVuP9zvVw7K-9 zwrH#xWF7qwphZ%c=c6~4W< z=hHjdEe(+_&ona71V|EL#{W2317wLq^S67Ad?jjN|tAZt&1r z9*3@6s00FU>@5V7S{71IZ~WR-U03xN{X&Rk6|V?rB*Du%mupwX?p-Cd=s1(nrqoaY^LnW?~uL@FfPV|{RM?@(8qEd(wb3oX#s z!iO$u`;D!wM$1V~MXH${oKDd++{&SYwB$hT47g}p0x@uB*QO8j1LkG5stLl$f1aw% zXF*krbRyokqceW|{eyR3S{`gs0YQrd7nP$gU$f!C8+wZ>AY{?7_KnqFoleC`Q*}um z-h^mmq95?fWjB&hq3x4fl1D}=Y1%F;f?Ffh$>E9mH(r_j!tM=q9{{R|58TokJ@D?n z(W-xSHcO2yk?ib9Itz|QW6mj5K`{RHOH&MVDxnz#H6kxEcn@+hmKOnOqBr$zx^v_3 z_lCtq3@ZXJk{aR52POwg?o&e@G|P-C@J50IB{$Hr{4(eK4KNrIClLAUbK_5rR5jM7 zm=_rShL|>+Wxz4&Eu2^D~kJGP6%VefkT}k4LSy7Jl#P(_ejYN+U5ld$yPFploebtSP&Zq-a#H+<)lUAHM9=Vy-60 zMre`Qj_$%IwzuE0rS+0>;@q078URD!k=gW-ElNIP3b) zPE=+6$EM8*L#DsBt@^LmZ;VSlO$y)&7|`9}aR{nidR83@U+DRZM9BG_(RU;a? z(D@PNs-j2|es@z;EOhy0PF#If0S!9P-~YfBrMoW>Lu7%j@vLG^9U&Ojb)Lhz*LA4C zyuYn~{JBHSx{EQ-5SwV{XiLX?Q?OQmQxVaSh1&dNrTWHH<@FlgsM^@fTs>S~W+KOV!+XLYu2 zE4c&!XvJ8rEc3Sp_09|1`g?mrlqd}=RQ?uVVJS6{ywD6~fY0btnk{85A|mPlOwCnZ z9IHG(9S+X;v6)JqS#`FzzM~vpUB;gNa(`Eu#a2ROHKw-=s|miwpTj0iKnp`{}181XC+POwi*Bc N002ovPDHLkV1ju=ilqPm diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/facebook.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/facebook.com.png deleted file mode 100755 index 2d416f898d2aae613c9fc79f0897ce880393f980..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10088 zcmV-uCzsfXP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00115NklA#H`06FTVMt7P&?g@>iqROOG2y{@K?5Qv49pDEbLsA?zEpSBIeRZ3_S$=|z5oBz zFyow>rccsPQ|Huw{(oQA`quZYwKgC7;IBME;$A2K0we)dlo!eJ7Es?Y(2?Rh1!xeS@la^~L)ZJtG4yfkq6A+n@qT<@Yb)4BbgZI4aE%^D5 zy$_GQ?NR%Qrk5E5CjxZ`(}2}tM&I#y5FYqm-Sjn6@-EeAc3zw^#Xq8@!!VL zDnhu6r0e}jh>HNu*YEcaMgnAgizIZMAQAU*874>P6E#eph}aFY8-k>%4mP`S_SY1& z+fjf5k$lfLZyte&_}L$SA3pxkAI76^{7!p3wa?llFn@EI(0qG@LTC5trlgKaKH0~u{`+0gL0gX;qOSh z=lrZ+`}%WOuObNM=_1$D;^jjC)K&lmNYQ?_l`3rzQ%VqqVM59Pi@V)CP_{1Y#{A%G z_i!vbyzDj-ROzqJY!HaN#aD5SgM&l-^5Y-IU{d_vZ$6G6dC%Lc->GJmug(Ohvj|`L`Xz)Qc?|7#Cc1&{CZnu& z=0Pt5PtNR(GZ3+x9Hl}i&0i_x4i2 zonOMc-}z=FjbPoC`l_w|W~P7`Bc6SJ4^zlbRMznX_wZ$~F$@yvw|=wD#Q|0S0I9%0 z{R&{)6WL~)38SF|ZIdq$z)W03L<1-UwJm`BU5ccNo7ZpPw|@QS@a}iMIp1%GMqb6i zubWSB`RX2?eEKqWb|yC_z*OO*pRU2ov_Y@Hte+tN8R78l6|Xc%OMlGfUvH>_hLyM}OiyZfkQ92)r6Ev3uCNehUXjw=jhOwVj=y5RyHV1Z^;~ zT^HxT)OmWpYckHYfdU~)2n0ct$Qpy2oA zNMJeG;()Tb(VeC2$VuF|c^jYj_y=(ReHWS;RIyFSJ7WgyHvZ>{r|m2BC}tu!$H!%7)GbLOsm>gEQUydRD9ur1Gm9lINSeR<=qTdRM;^q7 z-v3xNU3C8D4%z|$fv-OKY=?--2uxC4V;f+Bw8#?3p@a>p447I-Y*@1Po}nl|(8Fic zAuw;|6ad|1`S%VESNO<>eh}x*o-&|-JMvY4%`?yLVRt9ne@X@(s>I}1w#V&twkQzA zESTY7UO4||V@G`SEI{FcL@X9bfOEjjKElN(4FC{8RN%t7)A-T%es5%8)mu1TynP zg`-hhB@D!^gCo4_?Qg(qAH07c>F&(ewQC2sytj{F6Mz=nW0Gz_dYh}Gxu`CIj_c?L zz70f)D^d-fNFWtj!|o(=MC$k=?FPOEe-?BBinvBsEdxo1M&i=an1izGpn_~jSI!4@g z;T}Bv+WTkZ@SXa4?uDx@c%->LbzBe!h**B7<}AHA5DVH;N@gxX4SxQ=rhpOvGg(W~ zlu)qJgp2o{!9C~BoIv=bAO!0e@o)e6zxdqepTJX>p2z`E#f79p82z9)07(c0C0MjICE;JKCde4?&(ZW?;wl4PscdsULf}{v<7g4E}W^00F@G7XeHc#phMoB+WbP+>=l_FUj(G=_CYl(sfk-Z_CCTSM=4u!ehGVcG^&wm9^ zJ#!iN-Fv1*?Uso_k-F&es?Jb7At7si1hl|+(05tr2B9IE$+ zCUzBMnRkF}#O_t#urDL0%(;|3Ia3NoR><6qHY%-!6-DZFywIjZ3;N6m!M5rCZ+zo& zPCQ@$5K%_agNn{S6`eaXmNj4n1kOj-T~Jg;QZX$tchyD}TP?*rn3eC$6r1S~?@w9D zJaR)am#ysf*$uR6;e)jBw%gqXSFazKLrutwd~P9BhcTldNMQ@qsYqxUAe4;o*kX+d zBX@)3Qc{Am&1LmUH-MQyTY#P&yxc4iiUgNw=08I3?dvW)iNH6d1Q9V|KZBAPFD4}}D+yufGbZfweym{;a57v^Lk3Oc_fc@O!9fV+c4L9n%67HEo5*OIww-9N(LRPP=LoYS7O-$GAGig>M~L?n%OT^MP@C_1n9sj&`}Rash2~$ z%n4LQEe}Ekc3Yi*!*#S+$caZ5XsN2pwb2E@AOos%qibfX?SzsSByxPvHM8x~Arz&} zu9Fq(>KADP=5=0sAh=}K5`AZlLTl1($)qT1DurA20c*4W0Yq%czZDjT?*8VSm(F=C zRX_+$QXRW$!bFDoit?#^E=z7inL6f!mZUBi5CDOcTq??(Q)*dvEu3#APdh)PC&d1f z!4^&nsQf<)4dZL}5koqE2}E093rEc$Phg6miX~>v;9j$VOZGlRbaYa9JTHsX$?7rxc4B0;s7; zItx2oM>doqZnZD3QaI9~=6f1k?M>H9(ito3NqA<}p$9IK^;>=ADjQdJRVTsnNeU22 zEm%}d<{MCJDn{~ZItHeJ3G6 zwmkvn_$f#}38@}1k`OgE&NZ9Zx(U^|B&8 zxAV*6r&M^L9OEPiL{~U_<`g7|rJ}ee+LRT+u2ukZN9oM~eL-7Y)0OM+;X20pDGSqo z>V4mXGpBcubTe+sTRUO3N_gYL4{R+HP62%2y>G!Ik33j2*%q^{wdMEF%v4Dp^Vy#} zLGX|N{NK3r{8a?;pd^_S7O9*y7HEdq@6b}yyJC)7)#B_qW!N19G6Eoo_{E?8AzZxw z!b=p+bvwR56(9Mr$6nD(e*Vi(;>k-_tTrH7Wu_o$gp7kvY)&u97J^8^Of^WZX6bfF zoeVKX(f=FFn~mVXt<}p2mbT*vUg_)JK0L(!wOa@wv~e(+ha#>-XoIct|Whehn)m%VZWkA5uC ze%I`PHK1Z@p;oHDAi}9sE9Np6S+M%O(B8A0SPnK8e&13U8#)r93uf-l*VVo2Sgj&X zo!QOlb2VE+K?#^Rg^dAui~d7jvA#$Vj5gk9JL`agJR!9?ZSih+UD>;d)jHw~h(tKj zj=dn$_-^TK^+NEpqZFiR_6_7%M&zI$J{4p+^B)CMH1dcx!YW|zmmw7Po-DvKXk zq+KacjTMH~b}n&+Z;b@=m;X9AxD5#bwT7`|1KN{Mjq6~~>d4y!hunc~!d&{i~IHL(Nt$ZB8#+k^FIi*^bH%oEMlOW3!_g!p? z_OBh}l*KSXQ$&hQYlfN+sO6w;&^9$I>Q=8?<**#c&6s}4*=o1j?oJ;N5vu*qY;KB8 zH=cU(&5J6jwjgMcTj+8emx#PYG-ZiPOHTLh2BE->>jzd3(Rlj`$>H<>a*l+W(@aJp z@tdR>EVIFj59rk(5y=_Xi?wHW$1A0XEBgo7nRZNVWUVJyts)L?-OibDqaDv~4FlRuR{493e~rDJ2}P);Ky`VYNC!T(6<2 z6zMUzK?ts-G;GB1T~)iAoVrt7S!-8*8X6gu9r;W30Vk1~;=4L5`L1v7`;!vaZX95L z?^-hkULy&ni1k@-eWW@PaHYLuH8-ghPs}HVEtAZ3Wh_1?Un*jE=cQD<9A7^5$_)NU zHNLzFk168nwVSz+Ls&Bi)%rv*MNI2;goJ<~zC@`>k)@46OV1d4{jl}xTzFrs7tm7W zeV&AXFMjnhp1*PvG4>+MQn_l15f40Y9*?~4fvv6oC!Ts9m-h}Z1!;j|)r18aSBNn} zQ{SSk+%*k&yl~|P)={yuyHhJbTmEv^1g5Kd*CAoT6o@HI2vfi`O_-*T2TuZMg?wd@ z$MnOoi-^FU3ooQSj;%KFaQK9Q2BrtPpDY-(tRPxfTf=F=Y%xQ=KDJq1D zsJ-vZ>FKIitrY9^3OHQV87jDSXJ-c?Ute`RBXbr5_Rs+Bt?Cb)&BvemZ$V99AjeXUOB^|5tB_f2X z0El&>707~2E5>Gr3R6-fO^9*TK~z#9BqRueCjKE*0u0!zQ6)=JYezFkt91VH1^20A};=`vt}nAdY# zlcl0$jT6)y43IQojb!G5eIXiY@`6o(W!;tC)tWC^u93mi)}SfnnnN})s}S6{c^gN! zx0{wSNy>{#T7X)z9#q$E(YQd=vLliv>V8u3?^P zsk3oe)UcX!_Ua#Ll{dalcxV|}%4~d#8W{>FTJoxct{huSqRZtkr957&VHn6j*Ce)l zPu5XcO&zyvf^ws&Oc|sYYn?Dvp(@rNLNV*&Zi|EzBi*#I%UWQ2%Dt{F=$%^I_yO~a zbOpto62<``m;a&F#TL0zwMW+FeddYDeU)`la~OlZ%B7q@(5ya|5vfU7g_Z$>GnEC` z=W^}ZlDYm}LhawnJT{utYU>Ia=bp$oYWw-_$IUKxnxzX&s{5D zt*B9ml;TYAB7sRYmzol7#>L>FI>_Zs(IPigf~eAAoxzlUb(<$QRV{-~`?>V0SC@?& zNW^FlNaV^$rg@I(mR`c-S`kE-0q%TXf@1*M?h%=gQmhlCmH|ib(`{Jr4@l-4x4!n7~SOL5K#6|bW#&)yviO z-O241a;jxYsVQG17$(FRhw-)lmf-3GfL;fnI+HRNV4$`dLOY@(x3N@*qI5>iZS1+r zg(pX2VIl71jIBe_((!#b(@0pMc^8nmTvwSHCAL8 z+T{BmY$eM4Jfljpo z&ks=PQ-*G}VnK-UZD{Dv+;R)5EC{%~qjC?FB}wPvdmw;|%^!yM7pA&RScUY8y&fRIz59 zj9V$Sp`SYnkxqn3nkv(($o5pcDf8ybH;O7%l$CXLXA5k*b*0PJRAs;V*`K;rn=fO^E1kD*E}fF6@rAQCXu{tzxnH`CWzv@|CNaH-f$JCj-t&V@wJ%q_ru+{~oE?I3cQY!gQL$o|7H$!=s z>zY`a2{jPFnzAFVeQ>AOO5ZnVDY){d@pVvipg@+!v~FMTmv}NjsFY$!CZg&9+l|@4 zSoM4A`$2$&OaUpTPEjkXKBZWX{+hak+>$QnAR&j=##l%(>22IX{-?-Gj$XS~XntZ( zgp4a^BsBa}L4x`+Y_%3CF8Pd#m|{DNq4wF<1?s)lh@nA0wq)9}RgxwI2@6!UZLiwV zu>E&8_%0x++ps&DWH`HW6K&x=w<|>&wn~&q{y=vFYXsOHzqb4^*mwxq&gpCx*D{qFFl`Ftf%Ik`0 ziMFMCaO>}y|AsmHArE|?xTY2_2&bHu(kW1`FZ4_waD%^O`#qUe$T(dvC)Hj$`eIa` zmInW%&x)xnYW!I@!x?Fn6AH~DxuGlX)CRTIm{ zl~_>74Am5yKd$B~^vt`Xc$hh|q?@wfbm?sSlQKU($-s$5B~1oC2GWwyW)ozxBO8kE zCeEKuKKVggLL3{ny>Gwe{lNku)wjm~=8q3wY!)S9>nMn53AD=8B`d(VG96i5bMlW3hxxioQXtqN+i=qhO{tLoE1N<>L_ zkOR5(Fd#Bm9Ka!6%E`15ttnM8-zM1j$X;C(UHi{C4sX)dwYx(r^eeJ-2sa)k0lii* z3%r6mmW2Ln4;xqSAFQRL9b?#9fz=GI;Y+qZ0Rd?MZ5`S*tb#lCidDeTc9>>8 zX{j7xQYLqrrciBH#@7~tyOxcOZBuuFyrsg>%`$1JIV*B=aX1zUmO3;o#ecT@rpfvE zcJ@G4!=$Eo?{5DD6EFyNcLdYU1dYS0)skjFq(sa4@t9qaQj3~%Q`?A`1S*2GULmHG zOXWaJ?|9pHSKL~WjaQ*uWz5(Evt&MVsA};mgEfKIC1u%J#2)Vp+u=^-EEa{OgO~3T z;_ChdJoxSBwmJb1KXfm?@2xwyaQ?I*7@YwSb;zi!^wJ$YmO~mGHBw@mkEhma8)%7}Z4GW79udTVbdOk9tc7Wg6Ife7*PvgOd9)RS2J*>c^oUmP1 zpbovO>4X>YI=hZlfXgBd#`6Ze9MqjHKR9|to$zf7GOa}$on&e>h%0I=i>Bpb^#}e4 z+o8aUa)3iNS*ukvE{N#6)|O*qle)ZrM+KKu^jS+BC5`VVrznkQRw_=m&5h1} z)^?hBIpt#jB0l}T9QR(UOC6$Omv2Q*HABI#N-14lo9XCLQtuZ=PU%Iv=<>ynK^z&; z)_vt9TG;nyv`MPtc?amqPo?^~)U~^=)K1S1Op^kaNv=!LnSKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00115NklA#H`06FTVMt7P&?g@>iqROOG2y{@K?5Qv49pDEbLsA?zEpSBIeRZ3_S$=|z5oBz zFyow>rccsPQ|Huw{(oQA`quZYwKgC7;IBME;$A2K0we)dlo!eJ7Es?Y(2?Rh1!xeS@la^~L)ZJtG4yfkq6A+n@qT<@Yb)4BbgZI4aE%^D5 zy$_GQ?NR%Qrk5E5CjxZ`(}2}tM&I#y5FYqm-Sjn6@-EeAc3zw^#Xq8@!!VL zDnhu6r0e}jh>HNu*YEcaMgnAgizIZMAQAU*874>P6E#eph}aFY8-k>%4mP`S_SY1& z+fjf5k$lfLZyte&_}L$SA3pxkAI76^{7!p3wa?llFn@EI(0qG@LTC5trlgKaKH0~u{`+0gL0gX;qOSh z=lrZ+`}%WOuObNM=_1$D;^jjC)K&lmNYQ?_l`3rzQ%VqqVM59Pi@V)CP_{1Y#{A%G z_i!vbyzDj-ROzqJY!HaN#aD5SgM&l-^5Y-IU{d_vZ$6G6dC%Lc->GJmug(Ohvj|`L`Xz)Qc?|7#Cc1&{CZnu& z=0Pt5PtNR(GZ3+x9Hl}i&0i_x4i2 zonOMc-}z=FjbPoC`l_w|W~P7`Bc6SJ4^zlbRMznX_wZ$~F$@yvw|=wD#Q|0S0I9%0 z{R&{)6WL~)38SF|ZIdq$z)W03L<1-UwJm`BU5ccNo7ZpPw|@QS@a}iMIp1%GMqb6i zubWSB`RX2?eEKqWb|yC_z*OO*pRU2ov_Y@Hte+tN8R78l6|Xc%OMlGfUvH>_hLyM}OiyZfkQ92)r6Ev3uCNehUXjw=jhOwVj=y5RyHV1Z^;~ zT^HxT)OmWpYckHYfdU~)2n0ct$Qpy2oA zNMJeG;()Tb(VeC2$VuF|c^jYj_y=(ReHWS;RIyFSJ7WgyHvZ>{r|m2BC}tu!$H!%7)GbLOsm>gEQUydRD9ur1Gm9lINSeR<=qTdRM;^q7 z-v3xNU3C8D4%z|$fv-OKY=?--2uxC4V;f+Bw8#?3p@a>p447I-Y*@1Po}nl|(8Fic zAuw;|6ad|1`S%VESNO<>eh}x*o-&|-JMvY4%`?yLVRt9ne@X@(s>I}1w#V&twkQzA zESTY7UO4||V@G`SEI{FcL@X9bfOEjjKElN(4FC{8RN%t7)A-T%es5%8)mu1TynP zg`-hhB@D!^gCo4_?Qg(qAH07c>F&(ewQC2sytj{F6Mz=nW0Gz_dYh}Gxu`CIj_c?L zz70f)D^d-fNFWtj!|o(=MC$k=?FPOEe-?BBinvBsEdxo1M&i=an1izGpn_~jSI!4@g z;T}Bv+WTkZ@SXa4?uDx@c%->LbzBe!h**B7<}AHA5DVH;N@gxX4SxQ=rhpOvGg(W~ zlu)qJgp2o{!9C~BoIv=bAO!0e@o)e6zxdqepTJX>p2z`E#f79p82z9)07(c0C0MjICE;JKCde4?&(ZW?;wl4PscdsULf}{v<7g4E}W^00F@G7XeHc#phMoB+WbP+>=l_FUj(G=_CYl(sfk-Z_CCTSM=4u!ehGVcG^&wm9^ zJ#!iN-Fv1*?Uso_k-F&es?Jb7At7si1hl|+(05tr2B9IE$+ zCUzBMnRkF}#O_t#urDL0%(;|3Ia3NoR><6qHY%-!6-DZFywIjZ3;N6m!M5rCZ+zo& zPCQ@$5K%_agNn{S6`eaXmNj4n1kOj-T~Jg;QZX$tchyD}TP?*rn3eC$6r1S~?@w9D zJaR)am#ysf*$uR6;e)jBw%gqXSFazKLrutwd~P9BhcTldNMQ@qsYqxUAe4;o*kX+d zBX@)3Qc{Am&1LmUH-MQyTY#P&yxc4iiUgNw=08I3?dvW)iNH6d1Q9V|KZBAPFD4}}D+yufGbZfweym{;a57v^Lk3Oc_fc@O!9fV+c4L9n%67HEo5*OIww-9N(LRPP=LoYS7O-$GAGig>M~L?n%OT^MP@C_1n9sj&`}Rash2~$ z%n4LQEe}Ekc3Yi*!*#S+$caZ5XsN2pwb2E@AOos%qibfX?SzsSByxPvHM8x~Arz&} zu9Fq(>KADP=5=0sAh=}K5`AZlLTl1($)qT1DurA20c*4W0Yq%czZDjT?*8VSm(F=C zRX_+$QXRW$!bFDoit?#^E=z7inL6f!mZUBi5CDOcTq??(Q)*dvEu3#APdh)PC&d1f z!4^&nsQf<)4dZL}5koqE2}E093rEc$Phg6miX~>v;9j$VOZGlRbaYa9JTHsX$?7rxc4B0;s7; zItx2oM>doqZnZD3QaI9~=6f1k?M>H9(ito3NqA<}p$9IK^;>=ADjQdJRVTsnNeU22 zEm%}d<{MCJDn{~ZItHeJ3G6 zwmkvn_$f#}38@}1k`OgE&NZ9Zx(U^|B&8 zxAV*6r&M^L9OEPiL{~U_<`g7|rJ}ee+LRT+u2ukZN9oM~eL-7Y)0OM+;X20pDGSqo z>V4mXGpBcubTe+sTRUO3N_gYL4{R+HP62%2y>G!Ik33j2*%q^{wdMEF%v4Dp^Vy#} zLGX|N{NK3r{8a?;pd^_S7O9*y7HEdq@6b}yyJC)7)#B_qW!N19G6Eoo_{E?8AzZxw z!b=p+bvwR56(9Mr$6nD(e*Vi(;>k-_tTrH7Wu_o$gp7kvY)&u97J^8^Of^WZX6bfF zoeVKX(f=FFn~mVXt<}p2mbT*vUg_)JK0L(!wOa@wv~e(+ha#>-XoIct|Whehn)m%VZWkA5uC ze%I`PHK1Z@p;oHDAi}9sE9Np6S+M%O(B8A0SPnK8e&13U8#)r93uf-l*VVo2Sgj&X zo!QOlb2VE+K?#^Rg^dAui~d7jvA#$Vj5gk9JL`agJR!9?ZSih+UD>;d)jHw~h(tKj zj=dn$_-^TK^+NEpqZFiR_6_7%M&zI$J{4p+^B)CMH1dcx!YW|zmmw7Po-DvKXk zq+KacjTMH~b}n&+Z;b@=m;X9AxD5#bwT7`|1KN{Mjq6~~>d4y!hunc~!d&{i~IHL(Nt$ZB8#+k^FIi*^bH%oEMlOW3!_g!p? z_OBh}l*KSXQ$&hQYlfN+sO6w;&^9$I>Q=8?<**#c&6s}4*=o1j?oJ;N5vu*qY;KB8 zH=cU(&5J6jwjgMcTj+8emx#PYG-ZiPOHTLh2BE->>jzd3(Rlj`$>H<>a*l+W(@aJp z@tdR>EVIFj59rk(5y=_Xi?wHW$1A0XEBgo7nRZNVWUVJyts)L?-OibDqaDv~4FlRuR{493e~rDJ2}P);Ky`VYNC!T(6<2 z6zMUzK?ts-G;GB1T~)iAoVrt7S!-8*8X6gu9r;W30Vk1~;=4L5`L1v7`;!vaZX95L z?^-hkULy&ni1k@-eWW@PaHYLuH8-ghPs}HVEtAZ3Wh_1?Un*jE=cQD<9A7^5$_)NU zHNLzFk168nwVSz+Ls&Bi)%rv*MNI2;goJ<~zC@`>k)@46OV1d4{jl}xTzFrs7tm7W zeV&AXFMjnhp1*PvG4>+MQn_l15f40Y9*?~4fvv6oC!Ts9m-h}Z1!;j|)r18aSBNn} zQ{SSk+%*k&yl~|P)={yuyHhJbTmEv^1g5Kd*CAoT6o@HI2vfi`O_-*T2TuZMg?wd@ z$MnOoi-^FU3ooQSj;%KFaQK9Q2BrtPpDY-(tRPxfTf=F=Y%xQ=KDJq1D zsJ-vZ>FKIitrY9^3OHQV87jDSXJ-c?Ute`RBXbr5_Rs+Bt?Cb)&BvemZ$V99AjeXUOB^|5tB_f2X z0El&>707~2E5>Gr3R6-fO^9*TK~z#9BqRueCjKE*0u0!zQ6)=JYezFkt91VH1^20A};=`vt}nAdY# zlcl0$jT6)y43IQojb!G5eIXiY@`6o(W!;tC)tWC^u93mi)}SfnnnN})s}S6{c^gN! zx0{wSNy>{#T7X)z9#q$E(YQd=vLliv>V8u3?^P zsk3oe)UcX!_Ua#Ll{dalcxV|}%4~d#8W{>FTJoxct{huSqRZtkr957&VHn6j*Ce)l zPu5XcO&zyvf^ws&Oc|sYYn?Dvp(@rNLNV*&Zi|EzBi*#I%UWQ2%Dt{F=$%^I_yO~a zbOpto62<``m;a&F#TL0zwMW+FeddYDeU)`la~OlZ%B7q@(5ya|5vfU7g_Z$>GnEC` z=W^}ZlDYm}LhawnJT{utYU>Ia=bp$oYWw-_$IUKxnxzX&s{5D zt*B9ml;TYAB7sRYmzol7#>L>FI>_Zs(IPigf~eAAoxzlUb(<$QRV{-~`?>V0SC@?& zNW^FlNaV^$rg@I(mR`c-S`kE-0q%TXf@1*M?h%=gQmhlCmH|ib(`{Jr4@l-4x4!n7~SOL5K#6|bW#&)yviO z-O241a;jxYsVQG17$(FRhw-)lmf-3GfL;fnI+HRNV4$`dLOY@(x3N@*qI5>iZS1+r zg(pX2VIl71jIBe_((!#b(@0pMc^8nmTvwSHCAL8 z+T{BmY$eM4Jfljpo z&ks=PQ-*G}VnK-UZD{Dv+;R)5EC{%~qjC?FB}wPvdmw;|%^!yM7pA&RScUY8y&fRIz59 zj9V$Sp`SYnkxqn3nkv(($o5pcDf8ybH;O7%l$CXLXA5k*b*0PJRAs;V*`K;rn=fO^E1kD*E}fF6@rAQCXu{tzxnH`CWzv@|CNaH-f$JCj-t&V@wJ%q_ru+{~oE?I3cQY!gQL$o|7H$!=s z>zY`a2{jPFnzAFVeQ>AOO5ZnVDY){d@pVvipg@+!v~FMTmv}NjsFY$!CZg&9+l|@4 zSoM4A`$2$&OaUpTPEjkXKBZWX{+hak+>$QnAR&j=##l%(>22IX{-?-Gj$XS~XntZ( zgp4a^BsBa}L4x`+Y_%3CF8Pd#m|{DNq4wF<1?s)lh@nA0wq)9}RgxwI2@6!UZLiwV zu>E&8_%0x++ps&DWH`HW6K&x=w<|>&wn~&q{y=vFYXsOHzqb4^*mwxq&gpCx*D{qFFl`Ftf%Ik`0 ziMFMCaO>}y|AsmHArE|?xTY2_2&bHu(kW1`FZ4_waD%^O`#qUe$T(dvC)Hj$`eIa` zmInW%&x)xnYW!I@!x?Fn6AH~DxuGlX)CRTIm{ zl~_>74Am5yKd$B~^vt`Xc$hh|q?@wfbm?sSlQKU($-s$5B~1oC2GWwyW)ozxBO8kE zCeEKuKKVggLL3{ny>Gwe{lNku)wjm~=8q3wY!)S9>nMn53AD=8B`d(VG96i5bMlW3hxxioQXtqN+i=qhO{tLoE1N<>L_ zkOR5(Fd#Bm9Ka!6%E`15ttnM8-zM1j$X;C(UHi{C4sX)dwYx(r^eeJ-2sa)k0lii* z3%r6mmW2Ln4;xqSAFQRL9b?#9fz=GI;Y+qZ0Rd?MZ5`S*tb#lCidDeTc9>>8 zX{j7xQYLqrrciBH#@7~tyOxcOZBuuFyrsg>%`$1JIV*B=aX1zUmO3;o#ecT@rpfvE zcJ@G4!=$Eo?{5DD6EFyNcLdYU1dYS0)skjFq(sa4@t9qaQj3~%Q`?A`1S*2GULmHG zOXWaJ?|9pHSKL~WjaQ*uWz5(Evt&MVsA};mgEfKIC1u%J#2)Vp+u=^-EEa{OgO~3T z;_ChdJoxSBwmJb1KXfm?@2xwyaQ?I*7@YwSb;zi!^wJ$YmO~mGHBw@mkEhma8)%7}Z4GW79udTVbdOk9tc7Wg6Ife7*PvgOd9)RS2J*>c^oUmP1 zpbovO>4X>YI=hZlfXgBd#`6Ze9MqjHKR9|to$zf7GOa}$on&e>h%0I=i>Bpb^#}e4 z+o8aUa)3iNS*ukvE{N#6)|O*qle)ZrM+KKu^jS+BC5`VVrznkQRw_=m&5h1} z)^?hBIpt#jB0l}T9QR(UOC6$Omv2Q*HABI#N-14lo9XCLQtuZ=PU%Iv=<>ynK^z&; z)_vt9TG;nyv`MPtc?amqPo?^~)U~^=)K1S1Op^kaNv=!LnSgEx`YwzB@HDZ_sK$a|7WZ%Ahk~eQ&rvpH? zZ{IE}SFSVbK$h=>U3)vK3z01*3ePDur4b^iQ$2@4C8&!0bQ;^XG# zCIt!<(7*2P?h+RlCowTG`g-^7oqYZJRX>L|RjXD_s#dM~pLyfsRt5-5%!UTEn;6bY9_VMwNnKNf?veQ){En7CN4JuZwC?iIU(DBu) zSL^2uY1F8Zc}$>g-MX@5$r8u?*s){f;>C*^9jFF5Q5FlN{rmUJojZ4uorhB=#$!_0 z`Sj`2W$V_hT1_U*GVv#^TenX2=F<#7zI^#KO?7c`(R)t$_U+qJv}jQoK76>$m@z}g zQCrO8=+UFe&O?>R=I70ur}sG5Cr_TJBc&{!GG&U6<5ZLS9H#>)Sg@eJNJQ}FG11ZD zW>-~LS63ZllV!@3(PwdfXV0Eh`wt8Zbod9<`Q*uya`WcRWWOV4&YZGn(IOc+a-`k| z*dt5Gfdg71_w3ozF@EI85!te3i>?DrA#&h5h#qJi=0j5^O#qZFTUJl@&6_v+G6Z!6 z2#cnk=Y)Fn=%MdzwmZ8G8#d_mv}x1q3yPA6M-k%NxwFDBY?nD$G+JTEoH=te&PPT@ zO8fThW$4hMI*vKCYSl`w@h^snefjc5H;h>rf=047o6RP7@7_%v05(s9g41N-Hk+&c zZ@hjXp^nWXXhP7sb>ijitqa0tiS5LCY?mmocI{eKX+wbV;>8O&c<`WOEO+kQ`aGXQ zdw8Gg-Me>7u3Wj~#*G^e$A|y{C(C=Rl{K;!)&GAWZ?-=hCk2l`B^? zLBfHNJQ3Te-w}KS6<+1am9@!9&d{=DOHEivj7pX)sh>~!151VgfUt19|IY*;;pyoq zwQAMU$N&Heo9oxFYl=+Di}Q14d)=u35SkbrJ9gAGntYukhx`Clr=M4@TsZ|mkplqI zXaE3Y;J|?yA3$=lY}qoYQ>Tvh3IGED3MNd1Dlt<62n`L@pU^Wc07_%B!b|~R`SRtO z5heui&#`0LS4axr+O=ykYSgH|2LL_3ojZ4GJDif3-w;WODT2ra_(hp8NLPt`!5I7W z=~KoBKxs^xjQUfW^7A%H61l;G1q-yVFnjiF%^bUS?J7%`E>#U7Br^W&*|UrdphATT znjnRTKa$g@Lp9FR2)S_Kg0{{mhuLV8CQUR%(od*gzrI4?8H%F}4Irst?>N3wr%q}0 zX9%07iMnUco)+%o02TlXfCaz;klu^109XJl02TlXKzaf2@$rdsG5)n96Ux6O Wc;aeWiumpT0000715%Zz zJj7Lg2!x6qBNTz5R5r1Lg>XPZ$j}1KtyZ^sxZQUi&$##c{qnGfv(LHb-WI8>s&)5x z_g>%cZ(P5%kB~K01&Dx2U>a}$B7&N6Yd7ZEH+FdWTAN;Q7@!Ioln|5<$ILb0Up;Yx zhfhrqIpMHoam>yOFS7byze2ROMookYM#YQ>@E9KOfQ)p@o{{fc>6`(Ybt@fPhA(Vy zcjL>KcayEH?gx^j0Gxww0*?ZJANV^N5ttd>Sb1lo$E&xxyt@@hOf&EhR7v7MlEh5- zz^lt`?pmxf(};#Zi=>2@88}BYJBzDU=wH2x>-X>&X8FLa0CX6Qhk-Aj*HRB=iMHFz zVQ=p_OOhX4aqjwARgJR2HO=hPBJ!`z>~WwjBA6NdU|hJ_;ZH8?@RJ*TI*CI~2nr!F zlEl(&Y$S2Q*Iry>z8Uf9hv)GnEikhI5#H0d>n>(L_3LcD@(SVNJ6O^O3JMo0$V10RAoTgosr0fttaUt(dR=bcYvj#3WM1xd_Aq z4rEk8g_WHiD?43&<*rHQng_KYC&JaL)Xtp2Rjc%0e*?d>O~q0($exZXJ()4!4`~xx5g8hBFBs2XY4h^U7;{y86d}$d&LNT#AbEElah^cL zOYgP$#>;E8`(b!+W<$q*W`>#1e~#wwe4b=-ih!VFK#hVeQ-0Wehmn@GMT386Fz-nH zz%gLj%!)y(8tbiu=dX0=s7Jg98A#m#tTYrMz3x1n#PRJ5n_RfsIt0$3MaPaY^QA8# zAN(NwsDkFtejn|2_l=S^(oPyQU3TC^#O2ZiNDMA+^m%tHNr54lrDkD9{s*(%Wu-)j z2<9R#t;c-lm34MH$!$g{)E|0~iGTFFB=d75B84+61GO>d#*r}21Yqp{JHWZ(L?-=Q z1CpRz--&7W4NOqW?*TI{h{*p()v}kQM06AQ$>n|CUF{rA06-Mc{P^F)-Fq*I*#U1p z3UHjm8%M_bX)c#|xrqpg8q2$V;v@y9A@77^l; zaqr4o_3nG9ef;CZ;s_#Rr8gS#%5Bu?jdOzI?sKD#2~w#h3ay@!XqM=x5encV-LkGW zFcA^9+scKj`)uyV#d8m9(x_AW@P`SFI)UMsK5pQLfgVTLQ3MqxAZ3p(0+u>LO^lFB zJ}9aK4Jgb;^IkR+p_jnhw>m6u_YMVKyx)5&cb$c)X$pnnU}pFKtLM!PWoQg++Bv8= zNJ2<8py(+XW_nNq%uuDs=+uPetv=T`dj!3Wg*rzxKaWgLj|F{LmiKuvh`A|P^bX0}Q*GPe6M&Vk_u&Q3G%ne=l9X(fUH;siGL<029q)wI(g zbUJtrN^TT9jMsw0OyjWghiiZcCub@gn{ceP1KvBp(A+teOrbD=!a-({AbUwK4!8FK zsw7)mB)fZ5B>n$@2LWl!NlA1$EvWO4@ zn&iGf3zM*d0UIQ?x500!^e$f^?Cl&FXvq3uz``N>@8@_Z6C7=gs^_sYO(r5GNfJT` zgb=bKh-F=i<6Ij|Gw^0OjAqpl`J)}6b~>~#T!2nD4Z(*19oKJX^X2~^CD#qj(??px z36Gqfn@Eb@ZB^Uft7cc=}a`Nk&32qHdtk2~;~uwHt83#+uQn z7AX*wixlJ9Oe5mS^K*Rv%^hC6(!sN)9HjvOPT>6UCja1p8Q#3nX1$YSB;+-LLXMf_6-*IL zSeg_*_23+57aQpvqu|Zxt*)~2ji=~bd;_K(Yv<>=`RFV+&rh>;yiRMv(~lf|5fX#M zEZr&uHDZNekZ4MV1;cff#!k!~H#(eub(?$N-s9A@7S(P*^_L_7U~VGfi;pky_RSXm z^KUn4B?(BB)d{llh(Stof>^?0!}!v#+`$)r^#qgkgRe1F`m1Za_a|TD(vQB)>XXx~ ze)KGx4^7i+`XbyW3Z{mrAQ)nTSXP$-L<})N1apvx5I2SGhUe<>20wmemWl0{2VUFZ zv6nZv_nkeaxBFO}PP?Pat8JP!&rBntc0{Ij*HVK&_~a?p_WC^k)-J8YvIm{R}7P>IcD_(q3QTt>?bUPnZ9kYhRk7b$$w&^mu_tjgV!NMJg;= zr9rZ8gKeQ#S+ujYeFQ0gh!#673TZJc4%LUq)AQ2-fP*mT~D>*?X#0yU#P6S zd!qJC^z@7COf@6E|JF8_R@;2`!%Li9Yz&pO^H%Y~$Ii`h&#@-2-)M1tv&(KLK?G)- z5qB;&ICp%4rRge_adF>_Yb$T_H<$i`AMZU!>r{(sy+SqB;bQVLF7%D2u*D;>k_OoD z#Ze(@svfHgHEukcm;0BtIW{$6*sbHRa0MMV@-?D_m^9PSR{ss|w-_6VSqsq>(}qG*7*=b7mui41p~# ztPGesEPn_N;;JJ8K^&+ExAv89{d9xZZtU~VK6Zl7Ji5evcQotv}}HtqVleKs5r~K*h<_G;g7#x@A?i(mo{;4%3zcL=4?;cs}&ysyKPfIeAhf zWqWlm=7(=>@mIfC=ki*Mb}yal2Q`vl#97uCImZ!YzM^e(Hu%#w{+O3me~46Kq6mB> z#k$Jqz;pWzkj_3S*>!fVxMmQr5&s~CKM1*B7`hIz>WZ2^6Q#Ec4u=Cw1i{k_fs41g zytls0w_aM|%wmnR3k^=p)tIh(&Yf)X7Mw15{wT)x1OIwf!rS z;)zpy;`|cahJc`fYrEIk>TP4rFv%s8j^0F2FE(fyn#1|GsTKDVwefZt<%!L6UTv|x3BVe z@tm4E#Z+aER(B8YEn8D8_(de2nx>;FoLGr~6u6a0NTY;hk-`d~1MuajaKK4s2hMAZ z*932a9%)QUOdzs^C_itZNPcc@?6cR2--q;t^9v8~(G$N$g(m$Nk|cGeiKa_%LDQb* z`e~k@UrVxU!ECV2G@u}cl8KBYLpEe812f4ybt zk5xpUj3g9*o#j1Mf2Rq~5}d|3i_y5p>c%d|X6xMdfjJ_7bW$V;ji|wciw|;U>P~L% zuCmeDBGCXcNPmktyQKj-WHEnK)kEg_ha^s^05Xz444x+i zYn^WBmArU~jMCr-iH{81f95wrNi%|unny{Kaxzp`FnuQS+9L`=gu_%)8+Ssp9x>Id zvN+phVY<%ZY=gy_CiByErkYizn^l_ii0O$cGn4gn>iRyi!kmPMmmXreI>mf_p8tLA zdu+!WILj97vs|Pg1&RVpP#Y#@NDGXhl4Y$q(1AweVK^v7=`ym=Lrp+DGZR%#9h>If z)AO9WbAgjf)0|wKVt%^8WV1@MUZGm?I1yYal>NUn?>u+T+{y3V|GP|7Ci$~V-(j=A zj;mPyJ;qRKoKJ=dX)>A{q$RonD7m(jeL@~Gtr$midTD~$={onGp6Bt0PjmjxMNTYD zF*ntqTJg8F?O(Q)tIs0B@yR>*{JGBpj%VKaHtYRWd?aa7P$t0!&T%kNvLOv9n}X&V zz##PH$5t9o^q>FDXP9VInVV`bH(jSzjd1T#;xjSJ9M~W#*pLQj`MeICoo3l$p&^+Dlw0(X^QW?J z0*=C|DY(!j^mj=58zkKoLVummzlrs4r9D|C#2aWZqb;&Xr`B`hcRwR{Bn$ znERWe$sS4fCcXVP>9^h?^j5HBAEAZQ4$k%v-G;D#H`gFTLXYb;FB;I?M>9hZw z+SGlBs}xc{upWtU*UTAy``*v+=JsV);#FK$D9k4@mH{fv0V}C{X8WYkU_gkJCV9j2 zoao@9h>>(x*}wTMx~tzr+CQcm^{G@FRH6n>YB=#=h7f~x5bFS43`Ipy5%7jYhV)nI zT>tMR-3?~$`2(5@A3jnOs=mS_OXqoH@nODu?Rf&4R*qyC^l;(R2D42YOpo(pOBo+7 zA7$HUR0>Jw7CTq|8{L~Kcc&Pc`We!xE|HGXXXs^^?Blu&klt|Wq4MYtsf+2>B>;HkTN9s zJdPHH!4eZDgXM7zeOhZjV*lDx`1mGupRNu&6Ve)%puu6mVS%hWH1C>UleDW~>JSy2 zr5{|?q)&JGyKG&0iqPLbbWPHUu+&^&zBW$?5Nle8OtPi0!IU{W&ZpBk_-xHGEv}Tn z7lcT0tso%jZPHqK9&KMHlJv86Q2|ZCN0V1vwWI--fj5W4gLu3|coDR>izY2Z7KeO6?g)FK z&wkP+Rz+RzzsetETWK((t*oNiJytr-yOx&6(-~+wSj*JSuoO6C)yv!x@)t-ktt1~< zruL~uI3)Y|lizA^h>5vR{z`t z%nWfAYSU+^&YUM{Uq!V~Bn}Zx1Agk=GO3S~gk)MFnR*Linc8Orn0Ztql2AeYJdLGC zag{+Ctx$iA%iA~k!S$cfO1e-fZWxd90O<18hKV>(Whs3q88wd4So{bUEfGQm)hcKO zu_{7kOpi+2Xymvubd5~%K_e2a;b-orzVy)8PxIPwmltoo%4?hNW<`;bY6F9CFsjZa z@Z~vew%n{bsiOp2FKQu=#Q{uo4+|1Tg|8ii$=+0<4P2 zZe{ZH?96??$5wZX?#53r`c!;`cZ!qz_gr?Mcp`;_2EX<*%RjI8#EGXLDunuJrXTnx zOq~44fq8(Mvfkd|tG{@bm)G7JEEN~HN3>v=x#9i8y#Fu>%b2ty5$T)R1v7g|oc~nw z*dviW`1@?XQK7f>8lk^M#RZ&CCpIEFND7At$igCN1PGe-;7DW=x9}h{cmD>HcYYFA zX)@Y2JG(sn=3n#l#lNO&{fvM^Y`i$Ok@KUVOHME+EzO?RG5#0gHX{*HRecBeBcLv> z^7zE@zgzdUX}W8#&|Q9!-tI-Dzlm5MFQHh*%D>V|69h=VAWf5>U=ix4a5HDAAAgMI zsgF{dzZVw`KAg(E|8{quufO(}{NaUfveDm3r=R7FjnZ)$@gcE&$O#Txu43H6?CY35 zD;nAYjQ{bp>7>Rj`g_atHr}MS@eBG}7t!_#j-()>rpPcT=*Po1T@^dTB|JVJHu zE~5G@h#&qDH4sdB?!BM!pI-PHuWw%_@nP_r*&%6junlR)5eZMK0Z9_Vax3mU*G>9A zaHiMw-@lapc-lFKsPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000RLNkle0j6oB(b9kCQjo26~K zq)C^gJGQh)5m#`bprbNwqcSSsK8%X`Lm8L418PweM3hzirH%_f;Ezk4QFIgmL1$c8 z3$&$ex+H0n`rUWpZTi|en#SHabLYPI?z{KPIp>~x?u%vMzm~|z(iaR-hXTP1&%eM| zkZU3tiq$tjHXM4wxw}y*R5{DHTICkXdWtUv)u-UzZMfq+|y4{hN>+;eJ4?dJ` z(Cb%55Thgvi^(=`+?1Q0la=X2Rhj7-*3>kZM0pP{dx$pPx`r=L82f?D`S6{92!>%h&x7>7d!;?>K+p?7rM0xFPr($10O_4}MVYRll3W47!(x&X#v18GqMO9T* zMMiPCTp1Y|xDGyqJI}A5w_*KTn$INr_UwJ8;b}}+R8T0V?=i=FG zUVRN!L4T^XjkjorLLtZ$mR3wK7^LPwQ&UrYeSKM3S*lU;^74E>pWE$DPfurYvA0aE zsAML))mBkfe&0R!Zr!{^+!>lxD^^}HZ$9otxPpM``56ce-R4)xvJhWnZ{S@qG^$eC z5(@$d4Gk_=uU-vAetv#IK>Awd zwQ}XktgNi0q@T1?scXzi1ApF1e_zC3% zhJo^p`P@b}Vyfd7Pqz6E3g$QP%khoe++3`&c=6(vmKLQWWkh2=H$47?ub?m&C$T$9 zy*|iHqr@!$X^Fj$p3XS!^y1=ToCGF<;<4k+{_d_pto?iTmKT?}va;z-4HIgM9bzmp z91F!G;%BTO7SqCo3$dMqJSht6kq4J~@KdYJn_p1oD^8o7^1o_Ju*AbqRc&o8wqw~1 z!RqS`R8>?$Bkzye?Wt*5 zcp_<2%(!Ee(Xdbzo5X?z3%a_LKT)Hqo<3|Nd1NPa-+@OKVkRaZ_$Nkl9bBMtRh;#7r_0nq?u>$%;?|rCFJhn8E0G3* z{`9zGl+m!rok*o#cmZM!f!wwGqy`{e&$=#`y=GS(?85N|Zz` zdXhZYM5DztdfbBhvIUc^u+6~KWqhPiXGV_eV6~oXDaE&pvjAi;u|`msiAIZQ^tc5* zO*$(Hw`Q+fa@*~SCK!r-BEX24lQTF<5<7y$u>xzxqQr`6^tgpog%w7&!U|*U-+J>c z`lE(AzH;&Ms+ZspEcg)A7K;)qrqSaTfN(F!YR;~jl01nZb>p?y9s2WNSEnDZx8P#G z>_5P<7#gi4+M2^8rqSaT_7W5}wXB@nle7v~BSNuD?%T7sy}jKcpG|6~)xbm`!K)D5 z%S5BaG|`EiI_od0Am1`GFxk~Vs|WcHlsVILt({JeJ`cQGFZmQMpC zifQz?1r*c+nIwGJ^z8DANfVRb+3>cCTQG$JL2>*=x805r!IC5Ih!Q*WSOmj?g{rV4 zdg2&C(4RH)Tz^Mr6ia`-{POcJYO1G=k8hzQ+?+KC8BD~BiDyoDZ`-?yM6jY?dBYL5 zBtk1O44s*1w3tSZThI;r51x)4C6Bu4`WsHQwyA9qtmwCLBk*HQG*{v)W>uPKkk~=T zF2qm#i5fjgjQIYWZ;1)=t<*v)&5kV>6u;lU>zi*OGmV1iJnlb<>9=XIrlwVvSIFAO zIP2HF*?jbvSdd~doJxJt1&*TbMFy5X`dIAH!!yi(FD4o-pkNcu*1jU|<(FP2{|iO2 b1_u5DZZJDCvVAz{00000NkvXXu0mjfrX--& diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/intl.paypal.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/intl.paypal.com.png deleted file mode 100755 index 7ddea03c9940de970baf32efa1ecc986a101b6c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4545 zcma)=Wm^+~0)aCC#nfYA*Cj+jbHmm`&!2uQ;yNg2rX z-d}J(yyrac`3Wc42&hd$#7KmNg+-#Pqha!|js6QE&cDPCa=ZOsnP{tFH6xk#{|TOl zs(~sN)`v{uJ7@fV{@7o~ItUAkbnw4mkNVZU_%|{JYgz@H`nd$>mZ`sDg80S21Q)Y_Q)e=vlutK{lWa6@h^HHv z#F?L|7(z;>O0RB+NNy#NX;l#Yo6}F1!JfoL8O+-+_+sNlN5DYl)I*=wb0JUq3GO;L z<}{7Uj{yq|5AgHa8BL~Q>E@0rdIpnkWp=OdBY&(yDE0_o6&_2)L*_|1=@}Qq^layA z8dLdd?DM?SQz+`{PyLYm!x<;l$O}$gd5UX!^rSxNk9>sIYwP1F zw)5>vf9z$781gwMEV159Y*yT)4UR}s3g7V<7`Ogif?M5U{=5nw+d;k0?-!k&BCW=`hePq???Nqz)^ab$1h?79t)qL zDXhp`W!?7W$9><0?TVa=njkzq^1pm=Q)VBF)s^t}H0U0Gte$o$;qE@g4L1&W&Q-ug zNS(v_kv&d}#X^IB#=#eHG%j$*eKZFKIE2ameKHbx(8k7X|D)8hMt;?$TUQ7~$+W#5 zflwp=e3Q)GpY{T$<|K$&paFBLcR0$^6G?=rYz{^%uHAT*a~#{OCDYo<8eoI1)=9Z5 zRn=lA?W7C2kY-^2-k?{>@(3MpbIrr^a17)yLVb--oMSSXm7FD<*mInrKyJWl4w4`r z+r`T-2@sg;QETf)?5+n5FQExxxe2I%iMaQcDxGdycKBcy}{viVQcd0tAzD88E-ysmYHD@j5jmbvqS|%Z(S45 z-AagbI3Bu=wlH#<^vQw$JOYqAeL2Q<&x#zvri&q4mIEB82%P?m4m9!X^z)xs=m3|r z%mB$|(@}ZyN^+5bRvDH$zZD2F#EbgnBr8bk$$;W99TtIVR7?Q-IHG*5FV zhM|Mvq0HJdh5Qr^fEwIv9Uf>FeugmK4=nV0kkN=3)?JvwO5S;$W*j&+923r%y*B%S z95QZ2NC=KL;YcbJuvEXrbp-9GXo-t|pz(K58veS_sYDy;=Jh&A)AgMEguavbXf>*a zVp+AdC8>%Bx6`ztUpkYQDYVwWjJeA(TgjB+-dD{S7~pqN-}xT=R3XxKAYN5`vlB+V zMB%z+&ATbe7)dpq7flbogYC6EaQ&`0&b>k}*W@hiJLC}+ zY>(h#>WBi{mGklX9p%@HZGG)r$C%rJ*z#yRxzOO?bV5)N@EYWUqV(A&GH|_4f=b|k zoVG{q3`rHql3X^?d6U~KYfnLr@bk7a+jBr-6{ZakF~pV{kUhON zE6@^cg$1mI@k{lhGH&ralv{ZQWyNL{PTOMMx%@4#^6WI~w7R!w_t06%dry#mq9>g` zAVo{%$~%E^hj=Ja(<{4fmU0H_>luLFc7{5DzEXJ|3AW!_$dU5U^bSn?75{xF2_4bS zArY;z43@kac|6#%u>IHg_ESJl+c(@)DV9ms2@6f|tG&1nG*Df7U$HiiO>g%RgphuN zO{Js}GIx{YHX-Dx>i8JpB zDs;#)8^r8i05KL@={#9l1IbHppvNWqH`b2 zUG^9102;13x6(`g`)5D3e@);>$(9&;MQc?%GOix5p}JHQ;Rh;b*@e+2)n8c2P4AOF zhgjSFVcI3YrqQKIE}Aj1;2Mx6n`noBnT25g{BqZ5D$7#*QP}U-NYgvc7AF=9nTynx zVd`5vo;AdN(DeFJ55DEo0$0Nv;I%z%RZ46=3HWA&_pa6QhQE}~lyp0v6M`P+ zhn7!aH23JpKuIsXdmcya(k@P|wqMiPDwk5{mn+T38Em!$3nvRcxOrc0j{CG^d9Y7d zLz8>{xE-ZDAEY)o$=N%IW0K7Vkve$ZHz3XCdFiK`KzUJipbOJ?$T82$)cRyW?}1QE zuMhEzjL1T$B1@1tim(;$NhvZQRfFse)@p^B`u=Wplp~N>kC`oBS`oc>?gzefH`_Sj z1U5zOp5~Dlo2m!)sAsmk=IN;#baB37^(8z%WQ>@$|IXGkcQ;M3%equ?WmS6C%Gp@f zzBs^~%&Ql*s2P^9gYnI1^rlC*!#nyGr+JfhEk+FF*Ht#x`yGUcjHtnFsKbgh z*hl}C1{ce3y5-c+*PeQ<*Cyms-oPz*eA%g ztMu|q*NaMpoErXLyneI&u56?k_HcW16QwjY|4$9qmt%2nyQG2~ekeypO~u=uv;Cys zXDQiXsIjHbH(K?kV7bbrVaa^s1rRiG=WpjtO+WKM)d(&~zWr>CYP;HoC9GhkzOSQK zwpR{DU7Dv2kHchoL7KtK^DA&|vJT;NuP~8~-!%&-A|2LQ+AS&Q9%B0<6FrOil>9~! z(Tw|OYqiy!k2Vi=OvF^)`cJhYH9GvhUBAYKlH`?S5D!?JKe{QBdJOQ`4LbdSF!6 z3?Jg!3o2z0^IPk5olEJ}8jl4{$!{crl<9tKFFV;K zwm7ABzQcXo`r`=9`Pvh|M?XXIp$p2>u1#u`TFtxux*2HlzB~{|gwkUo9(|=n3jN+A z&@O1dx_8}FKko_Mxk=Pw)j_t%hJwxKj=H1+QzSyPtVUiEWSG(kqy>|<#Tb3t`pQq1 z$YV%mP(T?Nmh(H6U~%*{RgCV+{+G4b>sv($wKt$3z*CKrg@~L6^b1 z2jQE5H?pS63h5n$ANMbdHl({n3yf;R?}M~1V_{g`Jf zbswSbo*pV|I@++>?zc4DqD^=x7b59UCCS1zl(nUAo0QYh;9cbOAm_$R{F4c9%yMcZ zQFq?HjzBK1X%KKVCR8^#iKC048+R0XkWs>$H|u~392Jzj3*ElIJ{!3X8E%U=&s7Vd z%F{N=&-iAfsDi*ZMBO@S*YKNk=Rr5)=3fs;?BHn?_r?y=o@uPE_@h^v76MDFe&Z*m z7=BYn#0^!>Z~Jh<=*yj_gxcC_&DXx_NFWV-!K#*heFN>+3WFmTjl`9Dck_ii01H~F zvM!I8@IyN9hI~(3TodoYGNXf?=;CK}#8vrO)sDwdii$$|9BE_d=KHY*Pcau|hoK-r z?9lIi0F{|t2Lm>`0y*(#^MYa_z$917P>4;MM4qFYa0ST~# zyg2#kZja{WNg{Bmm;}r9E3<8}%`@K1k@kf{L!La@tL*RZFC=g>$GK)%)`5bq3h+rf zmhPQW-;%z*z!1=O>dGxImjJGru%Wl{+=Y*Yg`2ZJ)kT}jAx=Aqs&*j<2dw%;rEYMq z8m|&!S^DwsmVP$)A@nN6UU&LI#Ais2<2b8~NKksuNi~qjJ(flqe#y3je6k|xXF8Pd zDx?(V^Cxi?-|#riszd*LqIYwU+?3Jfij>bL3VvJezxq+Qo^KZWfzmedMat<&vZ{;p zrJd8xHx>Kg&&6|==M5OX4>`K^aqP2B3ZKiE!%dWLXWxbBQ#LDCe!836M`j9E&BP%? zEQA zD=Z^M!YN`LP{@9cH9bLc{}l!r(&EL(oi1AxVPaCFR&!B^P@Rt%a!?412rNMIa<6)< z{*79$_UD>Vuw;a&3FMvWr}o#=A1@jIq$cYUZmL=QA?1l1EymE= zrXJ7glo|Y23I#310~cD^+HPUv*C={jq*|v&`k(znw?Wj#L3%0q^_M~YNie>M(Cn?b^~WgVY5#@zVp&vz)&st-4JBwfs1rB>WIu43+Iam_8SYkf`wtdZD~L z`iIy};|W`nxHy#d&1IJV{G74JO(U;Ra8`8{O>S=Qo_(7!qBCFgft8=)X+HyN+SbEcO#8R2m=Vx9RkuJA>G{}Dcvx1 z-TAHia9{4zfBhf!IcJ}<&R%=3wZHpQ5$dY)&vB`70RX^rMFprP`X2CK!v>kSVN$|(x~ zpleZtN@;r-9xO)w)}6R`c6?u+zCIqJ4WqFAAQYjg8EsIo9{awLkpn6#4JQymYBDe> zQqbS{PT!P?Hy^myEo`S=UZ417oDW)-HEdEke?3Wa9u!{Y5~pa~W^2TBq5J?8`O1ay zQZ6ZgAV&!jHpZOUu}wT`;)1iy^FROm-UR4ZHrC|w2J^iqFh!q2Mn(|JmGbceun}*q zvR(|sRrfKg5~M^Nn;E$hBcMG#?qerI(n{?)m28|F8jZL;GyX-&6u#_x`C)f!I86&z{pBh~ zteS}u^PucS7@ePbx`-?6cYiXUW%YK3+vwTtQ7d=3Kgatx!0I+dk0uo;xhW)KGJzjC z&dOg1)j{UeCPZjIh}93W;9HKQt8@+O;O+$=?wO(k@sfA+PX(e-G@@?%e?C76BX}v| zxCW&z1y~3SX5a_ewp*Cu4(&`7#L!7{x#b@RfZFU^uI0l1B{Jac<_qg;UmPtz9(NEf z``sQ0F8iFJb|#K~AGN$TsP#GNqS#SXoV`IWg)A1#QD^s;L(?6-qEun$!$wTI-v_mG zRhF%&aV3i`V`+$EJRI}WV*N??3;U*<-IDUg-Qtt=o|u=S7v=u>AQRzuIleo2M5RIB!T; zRhxG5f5=5q3wWNI`xGKP_bYm$X~pM90{Sy0MYtF;Pks~XD?ipPdD+ZYTg@1H+XCI$ z7acmDV|$$Tu`)9RG8mTp9EaD=h2T+qX^G%I)W&JP*&fU3TZ71Xnia@ijfrZ* z28_M0Fb#Q6ZwM5$TNKiG0m2U07)bKJJ*d;RIM;h-(w@lKiBuQ(IQTsryP5m|TYc`A zNl;ooRXt(CJAVWUS=4WEe)TgB`*5L7ZHYnv6cb|nftxn=X-B=qdWu8T z&31~LrV!5YP)`{Uu=Z$~;aiIsV>sb8s4~IT^+uh6|5Q0`>`oMnupoSuN*ZPT@6TuO z$X`)P_*{LZ;^Vzkx&AVU!@p>by_e%k7><#-gt!jMrq8_Uv+V0BnXEADAqX2#9{Kd+ zT%>S~Wi2E~YqG9~yF9Nbj!}m6h>Y!$?Km=rUF2^{oz|ZL+nt3>j9EB!JCaWS z6uh|+6~hnrNB#u{lKdR=qdpIhGHPaaKib6eiq5O_Xv91mmYO_=AI^WOofeg;HaBZo z+B90# zc#+fuzd66DEkdF$>ssvpK3!&6*)l^$wTQUCITa*a#urK9R${NDdy}jFc+0p4#w-Lw z@PLWjMsxNg!>-gcZ)E2j(ADTv&%5z5O5$ca2R#SM`OMOf&!hW;9_?4mq$af2lf+kg zZY<4RCyviXB;9WX?rr1pTkF>$jXVcQuikm}ysQdYh|dEb<`Dyl`#=!Zkg-%N0=+)M z4A|3}T70bP`;SbR2mf!9g(OmEmK>wi4B*lxj#5*44do08aZ9K?DYHk7t;FSG;j#-F;wb$K@kW;Ham#uS6|AZH;i#qw z{i5$Ts3D_B-YLRnTPFhGcpWY_RQe~J_CyU}Xm>Si^s#0vR&AxBt1O20;FXc>lR2E- z{y&)2x&aZNU{oX%hF+UBFT28e6Vo}6q$ACNa4>@iL&7XGImWl|S!JgFupB$;$T+=O z`+Aqr^oJJdH|56|UYk1pRgo+f%LO0Vwb^?uM~myIcBNegUe_^gj}rjn{HuiqTJJAf zhkWfL{8Xi;+w!mjJS@QS26<|4W?0J?SNw-1yP`0NY=@LGYB+HCH|Tth+ct-OWcXgZ z+xjbidpv6vgFb`z8@AHD(M5?qb^n&P+!XICVrETFM876UHTh(RB|79ds^$N3T>iF) z&cDg`*6n8I=ex6coAQJCnmu%>5i&Pk>l2P&S+FTJ=Q1MioN&L0z^A(+De#!}F#Dvj zdG3#z&W0J~qxCRSLJa2>QG0jJePj?zl>gOg7{4THROawK!2_Y>-Epfmf|P{-+Z6NJ zXM&R^l$ht*!Us_|$@9+2-&?~O^P;wED)B5|Gdw2ham?%}MZG4!zbKnXWd`eDD? zHJ+!m?6Lm*@{XhIoGDNJYqm2Q5-Z}rDeL(E`zEiqhuSx-_J8zaX!p9axbl4*bb$BMt|aD47u^=$ z1wE#Tx`zcomo>3Tk{B{$M=Wozf0=abGY`YnKXk}NHD1iy>X+WBwY8r%htF_jm8(hV zptxlr9Q|lii%h3X$`Isu?fQY;UVVv!tgz>qD>F56-$fM-)wi+k2U8uvq8j9;Qt)Kn z20>+ybM^sKF|KZ13Tlmx&-}L+3-RuPd0U4wK<;G~~Z%!L^JU z1$^9ISbnRkzv#*Ztv)CoPh|d37?OIwYnla+;(Z0@^5B5ENrzt}% zJ2{mD=MjSy8MgX~1Fd{E5{4M%4KsF(EYrWxYwnK<`-9E2MG{K0kOo%MQS+}-C{G)vc}L3Me2!s6_O!h z_ufqGUR)3~yzMFRGltp|bkTYU4EdJge`h0@dYdfwce3Ww>@RxjjyD@de%E<6`-K`g z`7=;4ZdZ9IHxk>GDvyhho&pQ;Pk2noW6V`qw~vjWlk zrX+#^hCfu#Fv0-yQ?X8LMQZ>$||Fa*j$KL;^+B}<`s?l{%S3^Plt({LE zD0X{`zR;f&RS&P%dD(~P#E%@u#+0Rv*||~4El~;nm_q2bwP&!lG}d7^`QJ){lmK`{ppc{1$A`P?Guh?#m6CeP!+vSQ5=rD%?vok_&ww$< zQ=VM-60Qo@%Qr+A(?s!=(ZLc8Y=H-uY+5_=5O#rLQeba>YeZ2ncgvM28a-)LcfkyY zD06DBDTMd?2B(eBPo5F0u$_rmaI~y-cTxzv_#xw~8LS4Xk^$T!3;2U!*y_AORZ9nh zMUzWZj{PdvWz+y9amz0v7CB z|F(?4M&scjfEbU^0E|n(Te4+s5QI-{O{d=v6NG6di(8Lci{wtUC_{>%>Sk4{UwLM^ z_*D&1g?J=$!d|P}Snsxsb6cBkIige({#j>x2o=u_~C#J^8Go@m%{+D zqzn%5`{5vp@oM-dw|CO`wyK0(7RxiB0#O9Aal2~KbcB#Q&|q36HcRUy!o-C^$4aPt zKC-3=4Bp8D0YbHS4Xj4*aNOF7wHRriqh8?s+ItHjTo-t zE?l@#Xe{F#;B4EldZQ7~syg4`+cP&|IsACMKCoW( zehj-MzR&Oz^KWAlz-V}OmxNuYV(-@_?tU1C<|EpT~EX>g+SvwqMc6 zX^+&G7RvDR6o(5SL@pUK-AYA%&6Kz|DOZ|y6{FctBM1;x_LQcaw#e>iiSV%Atkz*n zCbhjjGcK9wyZAzF3q6V!PA0zzUAC^bTD%e{(ajKgsEOc4N%}o@tYC&eBrs$uKXSJS zx!oSPg98>qjeWoK+*|PVP)2aJDntU=*NZ1b{4jK^2#Z0_gO!M4`%2P7glwkKq~dV; zns_W}jbj;W1+`Q4L$EdF{%wV3fy(A;H06@(j2QGnh}X#boF~gYj1zP>@4x0di(&|DOo>4L_+E-1qgm|kBEsqk37dxB*-#yqkz#tM)j*H}&T~$s zBnf&|acRlBc_LU}4?`~@i(8<-SoL-lV+L;HKgL5vXcDvWT&2Z5HY7zJT+q3xlE^&rZvL^)u6;Dzw6BEh# zGv+S=7PQk`MlGj<$wyZ+*yj-f++@Y@^&fv9Z)S2#6E>56iFo$&m)(Oi5E zPA;NyAKdYARY*5k%@6xS-?O0u9HkNkQOuQBcSdBmD>g@u$(&Yxp42MQ;#)7|jV|mBI;yQ8HfQ9@j6k!qy z-jcwtcJDPv3autSqAB-pDz5o2+MLy%7YDb9&B1rtWNIXa)>X-(rYjZlUIzzh);R+( zdLGx^$-9P;00b)pg++!j>V><@iG?iPaz9#1mUtCz&(5w<_Tkp2foe+YS`0|ebtmeL zZ{D^`qNXqhSZsCMpVhd%{T&N_YQ>IeZrDBFNq{kowKLs2si363L_l-p(fxJ7DX@1^ zLz8p3BQ)wepJkarpq;qB^FXf$MQRotQY3tDhSNmX9|JPC;922lZt#l>sa2rrj-|Av3;jhWapxe}&QzwHMrq&3X^W37 zEq$UvI%n0h-uCj%&e@40VwqHzj+i zbb)BboK9bc4Wpd->B&M63h1EvYsLXKo+%T*p?o`r%`l5=OXu_JXxiX0bO51VDM{4v z1&u1<%AmMO!F43qe^^8 z$4{b*H}XB7a(NgEm-j_b<6$rxdg5Yu)pi#U?a3Utgxuc}E_!a!RD2oI_}&Ap!=aP# z>9lQN)$S1-6g!`EdZu?8brYG@d`Bq{rHV4&uxJ}P{7Z2&U!MZlNdGHpPs2B@WmHun z*)WvWk*9WjH}5KZ{*go%Z3Onyg2_=mV)@i#e#Te|C1q{b=dXDXQhY9W)@Pjj;@12s z&r{M%F-iNyOW6yd4KFXIv?U&{j_ZZFbK z39q}0smCa*iB}>VWtfcj5$?s2*y>UNl^`%O7>QP329@Sk-KM_cP@M|1sk#Qo7>S!g z-)sWEkWSKhTUDh|7i$@_{SgY?azFjaxS#8p$DaCvtC3Si!KZ!fXKl|Ygg2^^g>E~7 zadmu%6#shh%3=S95NS~i%d-ZIucbsWG(@04u^;8%$ zAfbw6r6sE9mb}?!6rW4Ykfr~o@}bK{fg{RCTM%j}m7$r~`n{`m*F*i09$(KHtsWMt z3PiAo2su_i8w;^CaBLdMiwe%r!f}hTwf?aGt07a5`e)G>$E@lXY$neq9i?v>gn@H> z_Y^prwJ#6(dv{(Ox7(o9gcvSu|Q*%CaJbJU)`*Ju%fRm(^O&i`842#i~ z_-RlVO=-|!xcckm;}amVXma&tr?l=<7t0DIu?3ViPkLUlqxoak7oErJk+5saHI_K% z;NDA>LtM*YpRLmd=PlK&)`o{x;w7Im6>a9jSlF$RQqj5*5jZOhARhVc2}3c+7-+)Z z*0%^Rczp=R3~yQQd`9O3`W)OcI~mQH5Qu^kC;&*GA?GQ$4aGjqVn4Gm`&LCD9oiH4 zM`hcw)u_d11FioL|K7Gmkg%fNBUF)=Wy{0O4>gJF$(^obv{#b2=oC3*wl6UAzGLrS ze4rmDwz_gi7D;S3az6}>i`@R@5d+iQLvvwL&GOWhV`*ZZaS+~^elVwTrb>N#0y8+F zl2!O<;9NRZ%EF&aO%5#?Uc7Z zc-5}qC!K0yDg?_P?fQI8B}Hmegd+$|_M-x;R~voGpEQn1VQ~WpXG3>Sx@nT{o69$9psa>E(*aEgwHzVWj%8H4A$^z zju(^kA)EE7utkW!sOGe>bUBhH!|!GXvvGOUa6Q88_U3%gnSzgtTa1(^Q&;QW#&@Ao z4ROr0cnxFnwN5V%$;dccLdPGK`?EAvL;yY79NglOi>c2Vmm3LCPBE$k6KdTn&qTLem#!pRu?cWM{CEmC;DZC)cbK^OeR*b zvq8R6!5m$lP(r5=W2)vl_hOse@0+k4ooy0}T_TXzu3pk|5eGGLey9!KR)i7E37!~+ z>{o}E2IwI^s%!VO-k1s9J_DkD-j}G)34&5a1fH)#HjY<2(3^rOL?~SKBdY!t)8ZS3 z_9A?2_Fn3dSCQULr=u3p;CKCeO#DFKU+WwEiS=Q8v|c(Rk{TRus~PNa4`Zt=M?{^s zmZE})7|Y`Iaw)!bNo`7W;kb(uBrJ2j!I2+a#!WA z^Vqy;gqz>k>HGt*@?W%_#-N^J>RfZPNq3&Cv!?rAG@!lNs$c^CV6BVXblF%|^MAXU zT=mA=o@blF8AvH-T7g(|HW6kGzzia(W-;9%|3~Hy&bOB|jYRBx<9ldvO8#1(iFEL4 zBcq5s5jGIe%Z(H(%IT^7@`OZ%rWt+Qt-q!5TKoFI-jGDv`TUUG^{IKGbKHWeX-FxC z)WqfTqsPU*@ZJjAOmnaI*-Wl+U-B%dS8u0so(3hToX2n$si!x5O$OCCthOf^`3XNt zk}B9;|855Rm%Xc!Lw$qFn05+~#nyOe+`%>~M^*T7pK+|^97czR8a-4I+=oj4LGx1w zv=bSb*v?u0>EhGUU2zl2`uQaeZUkplZg$4zh~#7HfkwBBCg2gQqS8QB+;bP7D_HzSx(i^@KV!q_rNs?9?ak z)~3EZSm@!XeG_NTo;;+GaAy;sAZ0thq2a|KWcfT3I%j4_?ppNk3|#ma>Kl)If^Ti= zJN@yz;fQrZ-!V@svb?`((`GSr{M{U3O<=h82p4CJQ3ukU`)eHnWk3J zdXX{$Cx}{#9P=p|v-6*@LLkgRa8`8{O>S=Qo_(7!qBCFgft8=)X+HyN+SbEcO#8R2m=Vx9RkuJA>G{}Dcvx1 z-TAHia9{4zfBhf!IcJ}<&R%=3wZHpQ5$dY)&vB`70RX^rMFprP`X2CK!v>kSVN$|(x~ zpleZtN@;r-9xO)w)}6R`c6?u+zCIqJ4WqFAAQYjg8EsIo9{awLkpn6#4JQymYBDe> zQqbS{PT!P?Hy^myEo`S=UZ417oDW)-HEdEke?3Wa9u!{Y5~pa~W^2TBq5J?8`O1ay zQZ6ZgAV&!jHpZOUu}wT`;)1iy^FROm-UR4ZHrC|w2J^iqFh!q2Mn(|JmGbceun}*q zvR(|sRrfKg5~M^Nn;E$hBcMG#?qerI(n{?)m28|F8jZL;GyX-&6u#_x`C)f!I86&z{pBh~ zteS}u^PucS7@ePbx`-?6cYiXUW%YK3+vwTtQ7d=3Kgatx!0I+dk0uo;xhW)KGJzjC z&dOg1)j{UeCPZjIh}93W;9HKQt8@+O;O+$=?wO(k@sfA+PX(e-G@@?%e?C76BX}v| zxCW&z1y~3SX5a_ewp*Cu4(&`7#L!7{x#b@RfZFU^uI0l1B{Jac<_qg;UmPtz9(NEf z``sQ0F8iFJb|#K~AGN$TsP#GNqS#SXoV`IWg)A1#QD^s;L(?6-qEun$!$wTI-v_mG zRhF%&aV3i`V`+$EJRI}WV*N??3;U*<-IDUg-Qtt=o|u=S7v=u>AQRzuIleo2M5RIB!T; zRhxG5f5=5q3wWNI`xGKP_bYm$X~pM90{Sy0MYtF;Pks~XD?ipPdD+ZYTg@1H+XCI$ z7acmDV|$$Tu`)9RG8mTp9EaD=h2T+qX^G%I)W&JP*&fU3TZ71Xnia@ijfrZ* z28_M0Fb#Q6ZwM5$TNKiG0m2U07)bKJJ*d;RIM;h-(w@lKiBuQ(IQTsryP5m|TYc`A zNl;ooRXt(CJAVWUS=4WEe)TgB`*5L7ZHYnv6cb|nftxn=X-B=qdWu8T z&31~LrV!5YP)`{Uu=Z$~;aiIsV>sb8s4~IT^+uh6|5Q0`>`oMnupoSuN*ZPT@6TuO z$X`)P_*{LZ;^Vzkx&AVU!@p>by_e%k7><#-gt!jMrq8_Uv+V0BnXEADAqX2#9{Kd+ zT%>S~Wi2E~YqG9~yF9Nbj!}m6h>Y!$?Km=rUF2^{oz|ZL+nt3>j9EB!JCaWS z6uh|+6~hnrNB#u{lKdR=qdpIhGHPaaKib6eiq5O_Xv91mmYO_=AI^WOofeg;HaBZo z+B90# zc#+fuzd66DEkdF$>ssvpK3!&6*)l^$wTQUCITa*a#urK9R${NDdy}jFc+0p4#w-Lw z@PLWjMsxNg!>-gcZ)E2j(ADTv&%5z5O5$ca2R#SM`OMOf&!hW;9_?4mq$af2lf+kg zZY<4RCyviXB;9WX?rr1pTkF>$jXVcQuikm}ysQdYh|dEb<`Dyl`#=!Zkg-%N0=+)M z4A|3}T70bP`;SbR2mf!9g(OmEmK>wi4B*lxj#5*44do08aZ9K?DYHk7t;FSG;j#-F;wb$K@kW;Ham#uS6|AZH;i#qw z{i5$Ts3D_B-YLRnTPFhGcpWY_RQe~J_CyU}Xm>Si^s#0vR&AxBt1O20;FXc>lR2E- z{y&)2x&aZNU{oX%hF+UBFT28e6Vo}6q$ACNa4>@iL&7XGImWl|S!JgFupB$;$T+=O z`+Aqr^oJJdH|56|UYk1pRgo+f%LO0Vwb^?uM~myIcBNegUe_^gj}rjn{HuiqTJJAf zhkWfL{8Xi;+w!mjJS@QS26<|4W?0J?SNw-1yP`0NY=@LGYB+HCH|Tth+ct-OWcXgZ z+xjbidpv6vgFb`z8@AHD(M5?qb^n&P+!XICVrETFM876UHTh(RB|79ds^$N3T>iF) z&cDg`*6n8I=ex6coAQJCnmu%>5i&Pk>l2P&S+FTJ=Q1MioN&L0z^A(+De#!}F#Dvj zdG3#z&W0J~qxCRSLJa2>QG0jJePj?zl>gOg7{4THROawK!2_Y>-Epfmf|P{-+Z6NJ zXM&R^l$ht*!Us_|$@9+2-&?~O^P;wED)B5|Gdw2ham?%}MZG4!zbKnXWd`eDD? zHJ+!m?6Lm*@{XhIoGDNJYqm2Q5-Z}rDeL(E`zEiqhuSx-_J8zaX!p9axbl4*bb$BMt|aD47u^=$ z1wE#Tx`zcomo>3Tk{B{$M=Wozf0=abGY`YnKXk}NHD1iy>X+WBwY8r%htF_jm8(hV zptxlr9Q|lii%h3X$`Isu?fQY;UVVv!tgz>qD>F56-$fM-)wi+k2U8uvq8j9;Qt)Kn z20>+ybM^sKF|KZ13Tlmx&-}L+3-RuPd0U4wK<;G~~Z%!L^JU z1$^9ISbnRkzv#*Ztv)CoPh|d37?OIwYnla+;(Z0@^5B5ENrzt}% zJ2{mD=MjSy8MgX~1Fd{E5{4M%4KsF(EYrWxYwnK<`-9E2MG{K0kOo%MQS+}-C{G)vc}L3Me2!s6_O!h z_ufqGUR)3~yzMFRGltp|bkTYU4EdJge`h0@dYdfwce3Ww>@RxjjyD@de%E<6`-K`g z`7=;4ZdZ9IHxk>GDvyhho&pQ;Pk2noW6V`qw~vjWlk zrX+#^hCfu#Fv0-yQ?X8LMQZ>$||Fa*j$KL;^+B}<`s?l{%S3^Plt({LE zD0X{`zR;f&RS&P%dD(~P#E%@u#+0Rv*||~4El~;nm_q2bwP&!lG}d7^`QJ){lmK`{ppc{1$A`P?Guh?#m6CeP!+vSQ5=rD%?vok_&ww$< zQ=VM-60Qo@%Qr+A(?s!=(ZLc8Y=H-uY+5_=5O#rLQeba>YeZ2ncgvM28a-)LcfkyY zD06DBDTMd?2B(eBPo5F0u$_rmaI~y-cTxzv_#xw~8LS4Xk^$T!3;2U!*y_AORZ9nh zMUzWZj{PdvWz+y9amz0v7CB z|F(?4M&scjfEbU^0E|n(Te4+s5QI-{O{d=v6NG6di(8Lci{wtUC_{>%>Sk4{UwLM^ z_*D&1g?J=$!d|P}Snsxsb6cBkIige({#j>x2o=u_~C#J^8Go@m%{+D zqzn%5`{5vp@oM-dw|CO`wyK0(7RxiB0#O9Aal2~KbcB#Q&|q36HcRUy!o-C^$4aPt zKC-3=4Bp8D0YbHS4Xj4*aNOF7wHRriqh8?s+ItHjTo-t zE?l@#Xe{F#;B4EldZQ7~syg4`+cP&|IsACMKCoW( zehj-MzR&Oz^KWAlz-V}OmxNuYV(-@_?tU1C<|EpT~EX>g+SvwqMc6 zX^+&G7RvDR6o(5SL@pUK-AYA%&6Kz|DOZ|y6{FctBM1;x_LQcaw#e>iiSV%Atkz*n zCbhjjGcK9wyZAzF3q6V!PA0zzUAC^bTD%e{(ajKgsEOc4N%}o@tYC&eBrs$uKXSJS zx!oSPg98>qjeWoK+*|PVP)2aJDntU=*NZ1b{4jK^2#Z0_gO!M4`%2P7glwkKq~dV; zns_W}jbj;W1+`Q4L$EdF{%wV3fy(A;H06@(j2QGnh}X#boF~gYj1zP>@4x0di(&|DOo>4L_+E-1qgm|kBEsqk37dxB*-#yqkz#tM)j*H}&T~$s zBnf&|acRlBc_LU}4?`~@i(8<-SoL-lV+L;HKgL5vXcDvWT&2Z5HY7zJT+q3xlE^&rZvL^)u6;Dzw6BEh# zGv+S=7PQk`MlGj<$wyZ+*yj-f++@Y@^&fv9Z)S2#6E>56iFo$&m)(Oi5E zPA;NyAKdYARY*5k%@6xS-?O0u9HkNkQOuQBcSdBmD>g@u$(&Yxp42MQ;#)7|jV|mBI;yQ8HfQ9@j6k!qy z-jcwtcJDPv3autSqAB-pDz5o2+MLy%7YDb9&B1rtWNIXa)>X-(rYjZlUIzzh);R+( zdLGx^$-9P;00b)pg++!j>V><@iG?iPaz9#1mUtCz&(5w<_Tkp2foe+YS`0|ebtmeL zZ{D^`qNXqhSZsCMpVhd%{T&N_YQ>IeZrDBFNq{kowKLs2si363L_l-p(fxJ7DX@1^ zLz8p3BQ)wepJkarpq;qB^FXf$MQRotQY3tDhSNmX9|JPC;922lZt#l>sa2rrj-|Av3;jhWapxe}&QzwHMrq&3X^W37 zEq$UvI%n0h-uCj%&e@40VwqHzj+i zbb)BboK9bc4Wpd->B&M63h1EvYsLXKo+%T*p?o`r%`l5=OXu_JXxiX0bO51VDM{4v z1&u1<%AmMO!F43qe^^8 z$4{b*H}XB7a(NgEm-j_b<6$rxdg5Yu)pi#U?a3Utgxuc}E_!a!RD2oI_}&Ap!=aP# z>9lQN)$S1-6g!`EdZu?8brYG@d`Bq{rHV4&uxJ}P{7Z2&U!MZlNdGHpPs2B@WmHun z*)WvWk*9WjH}5KZ{*go%Z3Onyg2_=mV)@i#e#Te|C1q{b=dXDXQhY9W)@Pjj;@12s z&r{M%F-iNyOW6yd4KFXIv?U&{j_ZZFbK z39q}0smCa*iB}>VWtfcj5$?s2*y>UNl^`%O7>QP329@Sk-KM_cP@M|1sk#Qo7>S!g z-)sWEkWSKhTUDh|7i$@_{SgY?azFjaxS#8p$DaCvtC3Si!KZ!fXKl|Ygg2^^g>E~7 zadmu%6#shh%3=S95NS~i%d-ZIucbsWG(@04u^;8%$ zAfbw6r6sE9mb}?!6rW4Ykfr~o@}bK{fg{RCTM%j}m7$r~`n{`m*F*i09$(KHtsWMt z3PiAo2su_i8w;^CaBLdMiwe%r!f}hTwf?aGt07a5`e)G>$E@lXY$neq9i?v>gn@H> z_Y^prwJ#6(dv{(Ox7(o9gcvSu|Q*%CaJbJU)`*Ju%fRm(^O&i`842#i~ z_-RlVO=-|!xcckm;}amVXma&tr?l=<7t0DIu?3ViPkLUlqxoak7oErJk+5saHI_K% z;NDA>LtM*YpRLmd=PlK&)`o{x;w7Im6>a9jSlF$RQqj5*5jZOhARhVc2}3c+7-+)Z z*0%^Rczp=R3~yQQd`9O3`W)OcI~mQH5Qu^kC;&*GA?GQ$4aGjqVn4Gm`&LCD9oiH4 zM`hcw)u_d11FioL|K7Gmkg%fNBUF)=Wy{0O4>gJF$(^obv{#b2=oC3*wl6UAzGLrS ze4rmDwz_gi7D;S3az6}>i`@R@5d+iQLvvwL&GOWhV`*ZZaS+~^elVwTrb>N#0y8+F zl2!O<;9NRZ%EF&aO%5#?Uc7Z zc-5}qC!K0yDg?_P?fQI8B}Hmegd+$|_M-x;R~voGpEQn1VQ~WpXG3>Sx@nT{o69$9psa>E(*aEgwHzVWj%8H4A$^z zju(^kA)EE7utkW!sOGe>bUBhH!|!GXvvGOUa6Q88_U3%gnSzgtTa1(^Q&;QW#&@Ao z4ROr0cnxFnwN5V%$;dccLdPGK`?EAvL;yY79NglOi>c2Vmm3LCPBE$k6KdTn&qTLem#!pRu?cWM{CEmC;DZC)cbK^OeR*b zvq8R6!5m$lP(r5=W2)vl_hOse@0+k4ooy0}T_TXzu3pk|5eGGLey9!KR)i7E37!~+ z>{o}E2IwI^s%!VO-k1s9J_DkD-j}G)34&5a1fH)#HjY<2(3^rOL?~SKBdY!t)8ZS3 z_9A?2_Fn3dSCQULr=u3p;CKCeO#DFKU+WwEiS=Q8v|c(Rk{TRus~PNa4`Zt=M?{^s zmZE})7|Y`Iaw)!bNo`7W;kb(uBrJ2j!I2+a#!WA z^Vqy;gqz>k>HGt*@?W%_#-N^J>RfZPNq3&Cv!?rAG@!lNs$c^CV6BVXblF%|^MAXU zT=mA=o@blF8AvH-T7g(|HW6kGzzia(W-;9%|3~Hy&bOB|jYRBx<9ldvO8#1(iFEL4 zBcq5s5jGIe%Z(H(%IT^7@`OZ%rWt+Qt-q!5TKoFI-jGDv`TUUG^{IKGbKHWeX-FxC z)WqfTqsPU*@ZJjAOmnaI*-Wl+U-B%dS8u0so(3hToX2n$si!x5O$OCCthOf^`3XNt zk}B9;|855Rm%Xc!Lw$qFn05+~#nyOe+`%>~M^*T7pK+|^97czR8a-4I+=oj4LGx1w zv=bSb*v?u0>EhGUU2zl2`uQaeZUkplZg$4zh~#7HfkwBBCg2gQqS8QB+;bP7D_HzSx(i^@KV!q_rNs?9?ak z)~3EZSm@!XeG_NTo;;+GaAy;sAZ0thq2a|KWcfT3I%j4_?ppNk3|#ma>Kl)If^Ti= zJN@yz;fQrZ-!V@svb?`((`GSr{M{U3O<=h82p4CJQ3ukU`)eHnWk3J zdXX{$Cx}{#9P=p|v-6*@LLkgKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000uKNkl_PMr!5jOlXz4jgjnS1tJFe(EZ83TqQ~T{&D5+z z&K6h(6ZZJ8KKILqzx!04XIAQxc0xq!1{rDcXv2qdCrx<}o92a-#?Sc<{l`-#XEzYun<}-<_Ktoin?;JBg-y z*3UZ0Hz(uJoU%|#^Xl*%<5PJoQ=--Kc72QT0+1^>96vM5bsJhpCrmn;EQThWw$|o# zH+6Ql?>E!Q1j1?=upN=?O_^ARAXjiXKRk~>qpp(hN@R-Q8XL%~UFdMszBrNyJSMFga6TKJQ=}0(FJxUMcVbWg1c< z<>L3|3NGnngd5+~$)>fh(O5-Vw=V@{U7p*i(ES*Rw4X&#|fN4mi2uKL9U4@i_yWX{qTX(OZ zr#%6{=wzP314I1B&(2V=JtC$=X;>(@eB?d-eEQA}i~eSNbBsT_do!zgl6?I;hlxa3 z5(yejq2OUV9;P7!L@H@TEW^}Fp$&vq8m%>2D_mEhm1ZdbpY!?!Bb&;r8B}S2Hr6 zn^)$-QhAIfqm7Jx-0b1!Y2`U-lfYJj>D>Ob^Htb6IB#Gvc z$4@sLkmD+Tdf+^#hq4?xF}b7whfhs&;=(K^FJxbr0*;)T_Q#}4C?L2Fdf=*+(r8r0 z%*&CY5ZJa&KA%Sjfe;de?>kG7(OUc0fnsA(gI^pR<}2U&4Ks7a^2;tx<@v(jKgW?% z(?~;d{{z2eA@43a_(IX+YyW;2q~OI9lbjx!driV;7aX2=euRi6gQQUVM?ec*<_3)q zMIj_YN^IMv5Xfunddp66angP3Q_qav($x_sm56X|I7`7+n5Kac!hfj%jR;;YkcQyb zFOKrqvqPLbpJniw3*7&}A)Y-vP9`12G$rRQE^z4N6a#BpXl;sC4gU1d9AEgx3p{&t zf@IuezTh%GQ{=YmS6sFN{_de8{PH&=M5AUfVU#Bd1VRdglztrGy0kYLOifPl)1N<2 zjL9Qwd({ujQYF}PT(a3L7e`Hw{q|+1vkuMet)!bWB$5dt(J0c8fWYxQTu*WLyVrBu z?rZ37OQ1FEy>m0GfLWY-DY3xSddB2NYw8`fSBmu3q^`{5!ZImo>yI{H4MLorxe2QWdR-3^=c7-C`ljGl}hJ9ElddT zpk-w%_k4W!k`Vpuog4Z1?bot-ZEM5tGf9iP-noVwwsi2(FFnSgSI%R_OgyE?it94a z-$hU7(ms22Pv)|SY;|{vZ+`wp-ult+GWO~`2*F#nui&oRHgVIAm8|T_kcgSsj>pBx z98Vt_=E0vF<7ZEu0Z&2H^qrpy6rpR2W2!QNA~eZWD?{ZkWrLXyJ_|IMh()e=^=Exw z8(;i`J$&UGPx942eFq=BZ6i|FM^J6e2{x~5=M%rTm7hI%hClh*;~Y9N0?8;yKZN&Z zR+W5Vs7M$>KnM*LRR|*l{QwOmB$Ux0gVM#7Z=cvVz|#+Yln=doQ$yiv+uq%4_{FzB z%)VPUL(U1tX@rhOWdh4Gh|pxpkOImAhlDSopoEAp8s31GPDWVO_1ePW=5&+?|7ss^ z+r1VFZbh(gmkkskst}+{ORLp4$eI@jSxqF%q{X5p-}>^qXlYCNJP;PRgorAoh>#q* zWCEet4|@U`n*H#Lmswl8qKSL%-T_6gMgfbMK$-K(CP1~&lEy?BdT_b5kMA2G-IlDZ zic}%FM)1%iRuCW>AVAc50l91yu(~J1j?LZR=<2bG1`}9^fD#8#!<4c{_z-(8$F^l% zyPx~kl3!RBN(c}&aexd~6{}o@s0oPtd||n^_NG`x_)-L@v>zjsQBWNdm~|Ym80>|F zc!YzeCb;FEM||H=HW|OWMUVIY&N}Y7bIaA-DN&C9L4s7EWi@}56j2FL77NUZvufSo7Egp6A9M&&cGCsW__X*a7Z*_ zU0nr~OhA?LfIt!DF{&yem*pz5D7n8HXxDm$Ms6`|CRcOoNCVEQLUbkHFDHH>4yd;0 zhBGW{gq1asRrNNKtA~J6VkbkpS!4|dRC$5AI6zdVkaFoPaan}QVfU>Ss4xlEWP{Yj z0iwQOP&?yQh^Qf)AoMJ)zFs{qATANbhI!6Mhgk=m#iA$K$VJu=rD-rSQ{?%R(`em@ z4l29Ll+tu$qO9pkya6OAD6f17RUHFR9SK$yMXP52vU&{mrH-fw8cl@6;#$PCKxuTOx&?z-9wRGo{Z zv#DC2E9K%|gGSGaH^>W!0RA=nML6G~CJqR*qo|$z%isek8z4b0u0UzLF$$=wY-yhm z%kjUciUVXAJ{p0P0?RUL%z`DnLj(BN21jy{6!i@YhN{PDng*s}RFXJRyF4CzB7~qh z9j!M77V!eL^)}I{rci4V@{KcrMqNWH5g`^cnVGl2_R9Ptr9Ti2FqJI=f}Zvi7_vtA z*Wn^--KDH9u81pKT#qC)iPQg`!*`6H3*^tbhsJ{j>1!6-}D-GriPaRB@|s<@6I(uVis$9(kQJN zpDBQbxam#;m}BFUqP;tHAs+X#BNO?|Lf#>jim|P~ou3~Z3f3AgXU3_|Ar@U*kPtWc z!Qok+{qmt;R;qS2g}1F#j#^dHTor6|QvSIiG!t`0NJc8@uNI(SU|lm!$p}Tq(1%?3; z)9=xsM?%L)utXm*8XqkQmg!$d4Brj{*yCze^`zOer32HD6l{+dPfvl6Y;7I?WmLN7 z99OwUOG^t~-MzHNU77c+4MWq(-mz?sYr4`zBPKm<3EG^3lQOHQZa*V>zdhlZ8H(mKr6*lN5&W#v*}7_ zFW%gB_MdFWd+F%0V+-cU$Oyy3!wYNrR-N44d-3}d#rVn#lbNo;gG1c3eFZH|an|&t z=;=r@I$dCBs=#dC!&ac`*4`SO8`UdJ!e|gNih2&Hg1invzjW<^GW^XCT4A9{MJ3&t z2rFBoB%>0cHQD(h&%HdsnG1Q6ai_4i`_zL`QyjWDGoKwD9Ytg^8CqLgxn=L(R4N|X zk$1%V9zEN4_qmzoP9r85Sli0Fl}$9Kqga-S2waKMpzBs#MdQkHqp(_rWA=~|bm;GR zr5&9m1%&?}q*NIZ0*yfVRE5TIJQnf}Cx_-ZdTxgNoFWrj$o+2Dk%zlu3;S(lJpK6N zk4>I9aRSlQ)P!x@Y}vAfUDsdVZb`k%arHZ&8SlCEg~{#>o?}UoFzIZL(vpdhh*>nH zqUhROpi%rUWqpOYVQ|zy0cC+zX`^2?8fuUs(B$$C*#(>Vyu;W`k>b1y!lOTV@xo25 zCkLCX;*UKMdFthtj|~qF4l2vC5b<~%fP6mB)~#FRo;`co4Jo#p!rOH*pV)ac+qwDl zLUYfo6HoYCivzN$T7fm{p{w`pE{_KPa~~^M~@yEe&UHIywZlSx>$6_jveBL8*XR<`c0v>NTK@+ zp1E??iFM?amDC7X@c@e)YYQyYBwLN{t%`$mhyZoyI&2=gK5p>MK}UpJ$Qb#Fq$~~r zr(Dd#LWq}-A3r`hI5?<0&!aT)4gWnpFfhRO?b{=%RH{`KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000uKNkl_PMr!5jOlXz4jgjnS1tJFe(EZ83TqQ~T{&D5+z z&K6h(6ZZJ8KKILqzx!04XIAQxc0xq!1{rDcXv2qdCrx<}o92a-#?Sc<{l`-#XEzYun<}-<_Ktoin?;JBg-y z*3UZ0Hz(uJoU%|#^Xl*%<5PJoQ=--Kc72QT0+1^>96vM5bsJhpCrmn;EQThWw$|o# zH+6Ql?>E!Q1j1?=upN=?O_^ARAXjiXKRk~>qpp(hN@R-Q8XL%~UFdMszBrNyJSMFga6TKJQ=}0(FJxUMcVbWg1c< z<>L3|3NGnngd5+~$)>fh(O5-Vw=V@{U7p*i(ES*Rw4X&#|fN4mi2uKL9U4@i_yWX{qTX(OZ zr#%6{=wzP314I1B&(2V=JtC$=X;>(@eB?d-eEQA}i~eSNbBsT_do!zgl6?I;hlxa3 z5(yejq2OUV9;P7!L@H@TEW^}Fp$&vq8m%>2D_mEhm1ZdbpY!?!Bb&;r8B}S2Hr6 zn^)$-QhAIfqm7Jx-0b1!Y2`U-lfYJj>D>Ob^Htb6IB#Gvc z$4@sLkmD+Tdf+^#hq4?xF}b7whfhs&;=(K^FJxbr0*;)T_Q#}4C?L2Fdf=*+(r8r0 z%*&CY5ZJa&KA%Sjfe;de?>kG7(OUc0fnsA(gI^pR<}2U&4Ks7a^2;tx<@v(jKgW?% z(?~;d{{z2eA@43a_(IX+YyW;2q~OI9lbjx!driV;7aX2=euRi6gQQUVM?ec*<_3)q zMIj_YN^IMv5Xfunddp66angP3Q_qav($x_sm56X|I7`7+n5Kac!hfj%jR;;YkcQyb zFOKrqvqPLbpJniw3*7&}A)Y-vP9`12G$rRQE^z4N6a#BpXl;sC4gU1d9AEgx3p{&t zf@IuezTh%GQ{=YmS6sFN{_de8{PH&=M5AUfVU#Bd1VRdglztrGy0kYLOifPl)1N<2 zjL9Qwd({ujQYF}PT(a3L7e`Hw{q|+1vkuMet)!bWB$5dt(J0c8fWYxQTu*WLyVrBu z?rZ37OQ1FEy>m0GfLWY-DY3xSddB2NYw8`fSBmu3q^`{5!ZImo>yI{H4MLorxe2QWdR-3^=c7-C`ljGl}hJ9ElddT zpk-w%_k4W!k`Vpuog4Z1?bot-ZEM5tGf9iP-noVwwsi2(FFnSgSI%R_OgyE?it94a z-$hU7(ms22Pv)|SY;|{vZ+`wp-ult+GWO~`2*F#nui&oRHgVIAm8|T_kcgSsj>pBx z98Vt_=E0vF<7ZEu0Z&2H^qrpy6rpR2W2!QNA~eZWD?{ZkWrLXyJ_|IMh()e=^=Exw z8(;i`J$&UGPx942eFq=BZ6i|FM^J6e2{x~5=M%rTm7hI%hClh*;~Y9N0?8;yKZN&Z zR+W5Vs7M$>KnM*LRR|*l{QwOmB$Ux0gVM#7Z=cvVz|#+Yln=doQ$yiv+uq%4_{FzB z%)VPUL(U1tX@rhOWdh4Gh|pxpkOImAhlDSopoEAp8s31GPDWVO_1ePW=5&+?|7ss^ z+r1VFZbh(gmkkskst}+{ORLp4$eI@jSxqF%q{X5p-}>^qXlYCNJP;PRgorAoh>#q* zWCEet4|@U`n*H#Lmswl8qKSL%-T_6gMgfbMK$-K(CP1~&lEy?BdT_b5kMA2G-IlDZ zic}%FM)1%iRuCW>AVAc50l91yu(~J1j?LZR=<2bG1`}9^fD#8#!<4c{_z-(8$F^l% zyPx~kl3!RBN(c}&aexd~6{}o@s0oPtd||n^_NG`x_)-L@v>zjsQBWNdm~|Ym80>|F zc!YzeCb;FEM||H=HW|OWMUVIY&N}Y7bIaA-DN&C9L4s7EWi@}56j2FL77NUZvufSo7Egp6A9M&&cGCsW__X*a7Z*_ zU0nr~OhA?LfIt!DF{&yem*pz5D7n8HXxDm$Ms6`|CRcOoNCVEQLUbkHFDHH>4yd;0 zhBGW{gq1asRrNNKtA~J6VkbkpS!4|dRC$5AI6zdVkaFoPaan}QVfU>Ss4xlEWP{Yj z0iwQOP&?yQh^Qf)AoMJ)zFs{qATANbhI!6Mhgk=m#iA$K$VJu=rD-rSQ{?%R(`em@ z4l29Ll+tu$qO9pkya6OAD6f17RUHFR9SK$yMXP52vU&{mrH-fw8cl@6;#$PCKxuTOx&?z-9wRGo{Z zv#DC2E9K%|gGSGaH^>W!0RA=nML6G~CJqR*qo|$z%isek8z4b0u0UzLF$$=wY-yhm z%kjUciUVXAJ{p0P0?RUL%z`DnLj(BN21jy{6!i@YhN{PDng*s}RFXJRyF4CzB7~qh z9j!M77V!eL^)}I{rci4V@{KcrMqNWH5g`^cnVGl2_R9Ptr9Ti2FqJI=f}Zvi7_vtA z*Wn^--KDH9u81pKT#qC)iPQg`!*`6H3*^tbhsJ{j>1!6-}D-GriPaRB@|s<@6I(uVis$9(kQJN zpDBQbxam#;m}BFUqP;tHAs+X#BNO?|Lf#>jim|P~ou3~Z3f3AgXU3_|Ar@U*kPtWc z!Qok+{qmt;R;qS2g}1F#j#^dHTor6|QvSIiG!t`0NJc8@uNI(SU|lm!$p}Tq(1%?3; z)9=xsM?%L)utXm*8XqkQmg!$d4Brj{*yCze^`zOer32HD6l{+dPfvl6Y;7I?WmLN7 z99OwUOG^t~-MzHNU77c+4MWq(-mz?sYr4`zBPKm<3EG^3lQOHQZa*V>zdhlZ8H(mKr6*lN5&W#v*}7_ zFW%gB_MdFWd+F%0V+-cU$Oyy3!wYNrR-N44d-3}d#rVn#lbNo;gG1c3eFZH|an|&t z=;=r@I$dCBs=#dC!&ac`*4`SO8`UdJ!e|gNih2&Hg1invzjW<^GW^XCT4A9{MJ3&t z2rFBoB%>0cHQD(h&%HdsnG1Q6ai_4i`_zL`QyjWDGoKwD9Ytg^8CqLgxn=L(R4N|X zk$1%V9zEN4_qmzoP9r85Sli0Fl}$9Kqga-S2waKMpzBs#MdQkHqp(_rWA=~|bm;GR zr5&9m1%&?}q*NIZ0*yfVRE5TIJQnf}Cx_-ZdTxgNoFWrj$o+2Dk%zlu3;S(lJpK6N zk4>I9aRSlQ)P!x@Y}vAfUDsdVZb`k%arHZ&8SlCEg~{#>o?}UoFzIZL(vpdhh*>nH zqUhROpi%rUWqpOYVQ|zy0cC+zX`^2?8fuUs(B$$C*#(>Vyu;W`k>b1y!lOTV@xo25 zCkLCX;*UKMdFthtj|~qF4l2vC5b<~%fP6mB)~#FRo;`co4Jo#p!rOH*pV)ac+qwDl zLUYfo6HoYCivzN$T7fm{p{w`pE{_KPa~~^M~@yEe&UHIywZlSx>$6_jveBL8*XR<`c0v>NTK@+ zp1E??iFM?amDC7X@c@e)YYQyYBwLN{t%`$mhyZoyI&2=gK5p>MK}UpJ$Qb#Fq$~~r zr(Dd#LWq}-A3r`hI5?<0&!aT)4gWnpFfhRO?b{=%RH{`i6;(auOQ7WBbGTU?{|N8a*qFJb^s{i`z?RzECzPA3C zM1w&L?Ck6R{PMPdRg^~wr)oLvoMHKU9RK;~ww8VPnpgk+`pKn-%W^GYTULjMhh!`Q z@pBZ~m}l&lR{ZYd%9(QVdLOk|4gdG>?0hQ!_2~cf$=Q)w%xx)YCOE9SbI|N8OVZyo&n{N;Nqt5XO5OzTJX9!d?>p# zX)4dGj7LL2@@fdnjb7r>xb}=g|B^WF&9ZbW0M?6Q)Nmr~fiM5CY>rzr|J9xNb`t*m z{KaS@*sYWQ!GGzIOx$`fwXCJOqK~(CK<&ev^x@RszoqPuS@rep_<$sogmwS>*4ML_ z$+Dm9^!me+TIlHK{{8>*cN_2T@&Enj&|(w(`}vzr56x#C_xt}@!f-PF|NsC0{r>*`|Ni~|{{Q{{ z|KWEj{{Q~>co*j7~|8j_0iU0r*9!W$&RCwC7nF(A|SN6w4!XgQf0EuiG zNCE~77=mD;sR;;Z7$JZ}pR%~H39={{MHVf4gedyAwn(IlNUeo}X!uvAT3e>$OzQ?R zK-IQs%}bE#2!HJ#rdr#~ePK<20RHEHK4LyE$vfYB?>YCp-#tNTrkaDp_Y#Q&(#+3b zIWg_IdwK(gRq3PnPJ=!<+xuF09VK%T($k<_Cao6)w4OIVUKd_u#*PJ$@V?Z)9ZTno)ye z(M+!H5=o^p-GJxQR-|_S@jNLm*T9f#NxcBjJmp`ku7NJ&pww1!-gCf z2FR1mHhsuzwy126s;UBm4=D&RPD>N#s1W+T-Hv+e5@b zZ2`u{K|xKfuAQc)>0}HC$LWYDGRYJPW$=6f%%83uPIFHB_4H}08@$?D9EYq|(9@%|+xdK@ zecXp}S^$_rLQM^Mpra!~QNgA*c!?6B`2Zxl{(5f1<+3A38h;>e*j=*V;-_nk-2(FV z^hQ0N0HmjXxIkLPlwkz9Y|GVbq@7^2?PHuSboM%9D zeB7C!ygUSu3YG}t?SrBi)SSsws`_Nf#l9uG zH;M0!15C+e4hQ2+3uO`6YqGN!3nh?xT7bDZQ$3ljrg$9)$9J*WT~utejG-FYny{K) z9W0}~wb;e8ySsZ!YHBLE2ARS@#F~lKOn!2_!fXPVI^%#+Q0#bWo8LiV9RHp39|n{c%KxV*q>?75%of+Ax4Zvc^)mTq3w5w1R6Q3O4k(VA2IkEm5>U zl#hZ)^l6Ocva!~g0@xrxxHKF1=i-5XR0V#sNH!rDl+(xqVX@g(nop?02Zd?`QHbp- zY9L4q0br437jO^!qfjUXdZ`GS@UJy}0^E1gy~rAkui#b?@$A@G>dJDGApo=s%Ldtl zN1=Rtd=zWSll1`zV=_ezw47N{%bM7V3NQgSJJ!V3*APJXOBdKQ_)x8XMN1}uJ_*1a zGu=R#=L(KxKSzU=jb#&KBTp7i1Axc#0?kDcN5=2%t+4c(0|0qA2{xif0PLYfueNYw1_-Qo7 z;Y`7Ffa+=Fnc!McECOhx-QPX6RE*DAvXQHZi0J6>rg>u$5-^98`+l6Gc>hsoi^k%! zv0a?@^^h8#2@q_8_dx(O8Ylr|%#P$f}EbR4d(wbPYsJ3jzZZJE$s8x;ira=ncRMf0 z(`^arc`cFXO8+HZ)r}{EdT9zz)Y9jXoP;thAj7pOeF(UZExX;Bk(%n7msc}C03~yEX%;W)MpoFHGXg}Gk+@C(NJRkR*42c0?SrfPO6}Wu z@s(dz>(!$1bGuAn5{NUpecNaRka2t-F@OqppU=w*NwP??7?jTpI2%}Jblb=^HMOZJ zPn`NYK|R+}0SjzXnnNnH0ARh&flU`6vSn?#ZM5efr%s&;5{tL^&l#W`Y}nTOPE}NG zfOEkzNHY^aEhuMo-`)cNIXOAv-ctbZXimdtnlIYu`QV+ZdmlSH7ko;eqD_?(qT=vF zqkA8I7?hLK*4tZ76=!PhjeX!R0^tN9xsbtxW8y3yZ7WVNWZu_P_lP8Jm#N%~h zEuakm`csO(F`ovYpZ~)0y#;aY&Hc^=?d@5{dwmUwUs?H;?mR22?rsDSyM95O3JdT;#s8G3Jn3^;*<=rl~r3?TR?n#keiv1sRvN&`BzH_*G%rG zWwl$KvB>I;;`Q$Y@c95LT#;5#U>p#T6d!-4^!Nk-qEB7@pM}0x@Bh;?t+Y*iCM2Xc z?m=99sUJMcF;;MGMF4Og5)~B{V(jlrF_4^zB(oG;Q-Rn>T+m!l(0e1UD!%Ra=IeySI0G+9;xBv0bBFT!!i;Jo> zPTMJ+>FiNlzWO1kSWS6Bd2#n#gW7V$A>v+Re}ZN<037VKp+Bke(xs}XB)5G_rU%Fq z_n$aSI|?2epsMHHy9YLAPM$dFJ2yZ2tN?IjmSSA__!6(Z*TQ*gF+5ENHdwSYoJQ`v z4XhIs#_#szAjK=F`^o`GGdn;7`|d8?!{a^XWd#JJ_)fWn9!&YuvFDLT>rAzP&Ww!j z_B3Urp6U;3-AkCM8KR@fnSF^TJwqz(?Q27lvOX==buJVgI$+77u{aoVO}eRRO>1jw z2AD-gM(UQ-bNiKs023do6U#5`>8Ug~V4yHNW2=rO;uB4pEY&ht677utRAH2?q}X z^%u!P^cgaZnuiZ-THQVnXbb};5rTJqyS~YyGQO&+nPt6@B9j1n>rcmuvbk$$3ZEkf z4;}>i6$n^F!IqV!r{n6pDtzUc9iUy*9piefM%KFrduQTrD6X0#%^}cy|l{8B0z$ z*qXpuVLMaPVJ3hY5|SErT=8(LjCxEYf&(y{%SI09BS&Z-#JpLUjt&e5hf@UZFcV4U z+nAM01SGTHJ(@xuR7DbFLs7A@crJIW2Y{H5PiO}Rhlz;5M6N6s(dXUy1&2O!X7Y)x z#%Io4u3P@Y4@AVY2rkmcKp->)SSwnfj5ckMy(MB^8Wj4)Z7(fS-%E7^lK=3-$@Yl^IU^8S>wMmP9{+G8u zqCoKMqRb$GJ^~O3L?RNwE7SLo*@=dRrAr$Y9?J9*Nao<(06?itBy;mgJykWG4nY(O zC0GVQb8~JG0ICz>ovHah8fs=etJe_z4+As^K=c0z0INN}pG(J@J$mCp&D`7o2ISn> zDGjc^GwIX5zHj7mHDZ%zJZdumn3Cd>ojbphIE*a4Zy~98L5Z*L&XGcIE|LaMJ{Nqg z(Wo?&HnCjO!vHVfuP0yAqtS$E?DPOk2gyfI|9*J$qR}Ck9r*0+_xCkzslgsG!x_Wm_z9uZpz20%i@mZMW<{}q&U4W9{SL(6V-~W@-r}t}%qyN5* z8+Yv3xY5L9H$pJ4|JR)#$J;U*7d`?A8>%0Dr`{1U9kWhL(H8V?>rg_ zfpvKj&5r?BH{Wm^4%76=Cj(%~SMP-{DE{8T!Qsn~?(ar6s`FX_s1X7|@~-Y>YAxW$ zv3;S^fEhf|Mq)S`S$TQ%@Twk0{wsj7d&1D%e8G3pAc2?wK)1~Pe*7!x&tNLwlg{}g z3FEw;AOb}QK(@JoHM0gbha{)cPTnHna?l%g_ruohbp!j{Z7wXi(rrg(e)Ggr((DaKN$)3a16ML;e&|wta5a+iE*)s ziFp=d!(XR61G(Ttc=@PslI?Co0JR@W?*PDHHN4&eRDEW>qxqzq90@WoM@PVObY%3X zz&wV4IU;|K!>^Exod75uKJUIbDnkVyxcv>htgoan9UPF2vwpoq3;5f(y3E(a46hn# zw>{&((!AoYV=y!f#*mF2_z3*#u^S7)cos3Ymo6Jo(rT~EYaO&R7zZFTU_?8bo8O%P zjKl!=8FI3V9$ExK!02%r()9G$F|-?wk*_lY&Cj>?{_lcYFml+pUEznMi`z1!os87f zO`8Cj`4_(XyG$ko0q^-eV2QpSz0-#OYS;z|tV+I$54MFJ82dUKcl}bKy!GwgD_3(R zk}t1@uhyQ`-L{PZE^h*=jrrTZ>Rn#G`0ckBFOj0)GByL%D!wEC4Gkk7%)#y%-)UVK zW0eiRK1`$1t3^M(x$D0_Dc!KG^ou1UKUF>5!DLFMz(0NKR%B@?i--AI8v>)Xiy3}7 zc4su-iNP3+{kmZgXg=SjXUzWuK>kyrm*0i8%Rc=!b3{hj+KvG(F467)O3%x6&;I=9 zXX`X}a@9+hn`3uAiFu(J|H0GF-NnUy(Rhe;iXAf;qUS#vKZqm?m`oB0JToc2#Ulwi z*r)1&=pfQP2BeT&TTxZhJ`Z3W1xOeNkR}UTSlcI7$tRa;)obgb|A75lfB^svE1tgi SJ+A2h0000i6;(auOQ7WBbGTU?{|N8a*qFJb^s{i`z?RzECzPA3C zM1w&L?Ck6R{PMPdRg^~wr)oLvoMHKU9RK;~ww8VPnpgk+`pKn-%W^GYTULjMhh!`Q z@pBZ~m}l&lR{ZYd%9(QVdLOk|4gdG>?0hQ!_2~cf$=Q)w%xx)YCOE9SbI|N8OVZyo&n{N;Nqt5XO5OzTJX9!d?>p# zX)4dGj7LL2@@fdnjb7r>xb}=g|B^WF&9ZbW0M?6Q)Nmr~fiM5CY>rzr|J9xNb`t*m z{KaS@*sYWQ!GGzIOx$`fwXCJOqK~(CK<&ev^x@RszoqPuS@rep_<$sogmwS>*4ML_ z$+Dm9^!me+TIlHK{{8>*cN_2T@&Enj&|(w(`}vzr56x#C_xt}@!f-PF|NsC0{r>*`|Ni~|{{Q{{ z|KWEj{{Q~>co*j7~|8j_0iU0r*9!W$&RCwC7nF(A|SN6w4!XgQf0EuiG zNCE~77=mD;sR;;Z7$JZ}pR%~H39={{MHVf4gedyAwn(IlNUeo}X!uvAT3e>$OzQ?R zK-IQs%}bE#2!HJ#rdr#~ePK<20RHEHK4LyE$vfYB?>YCp-#tNTrkaDp_Y#Q&(#+3b zIWg_IdwK(gRq3PnPJ=!<+xuF09VK%T($k<_Cao6)w4OIVUKd_u#*PJ$@V?Z)9ZTno)ye z(M+!H5=o^p-GJxQR-|_S@jNLm*T9f#NxcBjJmp`ku7NJ&pww1!-gCf z2FR1mHhsuzwy126s;UBm4=D&RPD>N#s1W+T-Hv+e5@b zZ2`u{K|xKfuAQc)>0}HC$LWYDGRYJPW$=6f%%83uPIFHB_4H}08@$?D9EYq|(9@%|+xdK@ zecXp}S^$_rLQM^Mpra!~QNgA*c!?6B`2Zxl{(5f1<+3A38h;>e*j=*V;-_nk-2(FV z^hQ0N0HmjXxIkLPlwkz9Y|GVbq@7^2?PHuSboM%9D zeB7C!ygUSu3YG}t?SrBi)SSsws`_Nf#l9uG zH;M0!15C+e4hQ2+3uO`6YqGN!3nh?xT7bDZQ$3ljrg$9)$9J*WT~utejG-FYny{K) z9W0}~wb;e8ySsZ!YHBLE2ARS@#F~lKOn!2_!fXPVI^%#+Q0#bWo8LiV9RHp39|n{c%KxV*q>?75%of+Ax4Zvc^)mTq3w5w1R6Q3O4k(VA2IkEm5>U zl#hZ)^l6Ocva!~g0@xrxxHKF1=i-5XR0V#sNH!rDl+(xqVX@g(nop?02Zd?`QHbp- zY9L4q0br437jO^!qfjUXdZ`GS@UJy}0^E1gy~rAkui#b?@$A@G>dJDGApo=s%Ldtl zN1=Rtd=zWSll1`zV=_ezw47N{%bM7V3NQgSJJ!V3*APJXOBdKQ_)x8XMN1}uJ_*1a zGu=R#=L(KxKSzU=jb#&KBTp7i1Axc#0?kDcN5=2%t+4c(0|0qA2{xif0PLYfueNYw1_-Qo7 z;Y`7Ffa+=Fnc!McECOhx-QPX6RE*DAvXQHZi0J6>rg>u$5-^98`+l6Gc>hsoi^k%! zv0a?@^^h8#2@q_8_dx(O8Ylr|%#P$f}EbR4d(wbPYsJ3jzZZJE$s8x;ira=ncRMf0 z(`^arc`cFXO8+HZ)r}{EdT9zz)Y9jXoP;thAj7pOeF(UZExX;Bk(%n7msc}C03~yEX%;W)MpoFHGXg}Gk+@C(NJRkR*42c0?SrfPO6}Wu z@s(dz>(!$1bGuAn5{NUpecNaRka2t-F@OqppU=w*NwP??7?jTpI2%}Jblb=^HMOZJ zPn`NYK|R+}0SjzXnnNnH0ARh&flU`6vSn?#ZM5efr%s&;5{tL^&l#W`Y}nTOPE}NG zfOEkzNHY^aEhuMo-`)cNIXOAv-ctbZXimdtnlIYu`QV+ZdmlSH7ko;eqD_?(qT=vF zqkA8I7?hLK*4tZ76=!PhjeX!R0^tN9xsbtxW8y3yZ7WVNWZu_P_lP8Jm#N%~h zEuakm`csO(F`ovYpZ~)0y#;aY&Hc^=?d@5{dwmUwUs?H;?mR22?rsDSyM95O3JdT;#s8G3Jn3^;*<=rl~r3?TR?n#keiv1sRvN&`BzH_*G%rG zWwl$KvB>I;;`Q$Y@c95LT#;5#U>p#T6d!-4^!Nk-qEB7@pM}0x@Bh;?t+Y*iCM2Xc z?m=99sUJMcF;;MGMF4Og5)~B{V(jlrF_4^zB(oG;Q-Rn>T+m!l(0e1UD!%Ra=IeySI0G+9;xBv0bBFT!!i;Jo> zPTMJ+>FiNlzWO1kSWS6Bd2#n#gW7V$A>v+Re}ZN<037VKp+Bke(xs}XB)5G_rU%Fq z_n$aSI|?2epsMHHy9YLAPM$dFJ2yZ2tN?IjmSSA__!6(Z*TQ*gF+5ENHdwSYoJQ`v z4XhIs#_#szAjK=F`^o`GGdn;7`|d8?!{a^XWd#JJ_)fWn9!&YuvFDLT>rAzP&Ww!j z_B3Urp6U;3-AkCM8KR@fnSF^TJwqz(?Q27lvOX==buJVgI$+77u{aoVO}eRRO>1jw z2AD-gM(UQ-bNiKs023do6U#5`>8Ug~V4yHNW2=rO;uB4pEY&ht677utRAH2?q}X z^%u!P^cgaZnuiZ-THQVnXbb};5rTJqyS~YyGQO&+nPt6@B9j1n>rcmuvbk$$3ZEkf z4;}>i6$n^F!IqV!r{n6pDtzUc9iUy*9piefM%KFrduQTrD6X0#%^}cy|l{8B0z$ z*qXpuVLMaPVJ3hY5|SErT=8(LjCxEYf&(y{%SI09BS&Z-#JpLUjt&e5hf@UZFcV4U z+nAM01SGTHJ(@xuR7DbFLs7A@crJIW2Y{H5PiO}Rhlz;5M6N6s(dXUy1&2O!X7Y)x z#%Io4u3P@Y4@AVY2rkmcKp->)SSwnfj5ckMy(MB^8Wj4)Z7(fS-%E7^lK=3-$@Yl^IU^8S>wMmP9{+G8u zqCoKMqRb$GJ^~O3L?RNwE7SLo*@=dRrAr$Y9?J9*Nao<(06?itBy;mgJykWG4nY(O zC0GVQb8~JG0ICz>ovHah8fs=etJe_z4+As^K=c0z0INN}pG(J@J$mCp&D`7o2ISn> zDGjc^GwIX5zHj7mHDZ%zJZdumn3Cd>ojbphIE*a4Zy~98L5Z*L&XGcIE|LaMJ{Nqg z(Wo?&HnCjO!vHVfuP0yAqtS$E?DPOk2gyfI|9*J$qR}Ck9r*0+_xCkzslgsG!x_Wm_z9uZpz20%i@mZMW<{}q&U4W9{SL(6V-~W@-r}t}%qyN5* z8+Yv3xY5L9H$pJ4|JR)#$J;U*7d`?A8>%0Dr`{1U9kWhL(H8V?>rg_ zfpvKj&5r?BH{Wm^4%76=Cj(%~SMP-{DE{8T!Qsn~?(ar6s`FX_s1X7|@~-Y>YAxW$ zv3;S^fEhf|Mq)S`S$TQ%@Twk0{wsj7d&1D%e8G3pAc2?wK)1~Pe*7!x&tNLwlg{}g z3FEw;AOb}QK(@JoHM0gbha{)cPTnHna?l%g_ruohbp!j{Z7wXi(rrg(e)Ggr((DaKN$)3a16ML;e&|wta5a+iE*)s ziFp=d!(XR61G(Ttc=@PslI?Co0JR@W?*PDHHN4&eRDEW>qxqzq90@WoM@PVObY%3X zz&wV4IU;|K!>^Exod75uKJUIbDnkVyxcv>htgoan9UPF2vwpoq3;5f(y3E(a46hn# zw>{&((!AoYV=y!f#*mF2_z3*#u^S7)cos3Ymo6Jo(rT~EYaO&R7zZFTU_?8bo8O%P zjKl!=8FI3V9$ExK!02%r()9G$F|-?wk*_lY&Cj>?{_lcYFml+pUEznMi`z1!os87f zO`8Cj`4_(XyG$ko0q^-eV2QpSz0-#OYS;z|tV+I$54MFJ82dUKcl}bKy!GwgD_3(R zk}t1@uhyQ`-L{PZE^h*=jrrTZ>Rn#G`0ckBFOj0)GByL%D!wEC4Gkk7%)#y%-)UVK zW0eiRK1`$1t3^M(x$D0_Dc!KG^ou1UKUF>5!DLFMz(0NKR%B@?i--AI8v>)Xiy3}7 zc4su-iNP3+{kmZgXg=SjXUzWuK>kyrm*0i8%Rc=!b3{hj+KvG(F467)O3%x6&;I=9 zXX`X}a@9+hn`3uAiFu(J|H0GF-NnUy(Rhe;iXAf;qUS#vKZqm?m`oB0JToc2#Ulwi z*r)1&=pfQP2BeT&TTxZhJ`Z3W1xOeNkR}UTSlcI7$tRa;)obgb|A75lfB^svE1tgi SJ+A2h0000aCC#nfYA*Cj+jbHmm`&!2uQ;yNg2rX z-d}J(yyrac`3Wc42&hd$#7KmNg+-#Pqha!|js6QE&cDPCa=ZOsnP{tFH6xk#{|TOl zs(~sN)`v{uJ7@fV{@7o~ItUAkbnw4mkNVZU_%|{JYgz@H`nd$>mZ`sDg80S21Q)Y_Q)e=vlutK{lWa6@h^HHv z#F?L|7(z;>O0RB+NNy#NX;l#Yo6}F1!JfoL8O+-+_+sNlN5DYl)I*=wb0JUq3GO;L z<}{7Uj{yq|5AgHa8BL~Q>E@0rdIpnkWp=OdBY&(yDE0_o6&_2)L*_|1=@}Qq^layA z8dLdd?DM?SQz+`{PyLYm!x<;l$O}$gd5UX!^rSxNk9>sIYwP1F zw)5>vf9z$781gwMEV159Y*yT)4UR}s3g7V<7`Ogif?M5U{=5nw+d;k0?-!k&BCW=`hePq???Nqz)^ab$1h?79t)qL zDXhp`W!?7W$9><0?TVa=njkzq^1pm=Q)VBF)s^t}H0U0Gte$o$;qE@g4L1&W&Q-ug zNS(v_kv&d}#X^IB#=#eHG%j$*eKZFKIE2ameKHbx(8k7X|D)8hMt;?$TUQ7~$+W#5 zflwp=e3Q)GpY{T$<|K$&paFBLcR0$^6G?=rYz{^%uHAT*a~#{OCDYo<8eoI1)=9Z5 zRn=lA?W7C2kY-^2-k?{>@(3MpbIrr^a17)yLVb--oMSSXm7FD<*mInrKyJWl4w4`r z+r`T-2@sg;QETf)?5+n5FQExxxe2I%iMaQcDxGdycKBcy}{viVQcd0tAzD88E-ysmYHD@j5jmbvqS|%Z(S45 z-AagbI3Bu=wlH#<^vQw$JOYqAeL2Q<&x#zvri&q4mIEB82%P?m4m9!X^z)xs=m3|r z%mB$|(@}ZyN^+5bRvDH$zZD2F#EbgnBr8bk$$;W99TtIVR7?Q-IHG*5FV zhM|Mvq0HJdh5Qr^fEwIv9Uf>FeugmK4=nV0kkN=3)?JvwO5S;$W*j&+923r%y*B%S z95QZ2NC=KL;YcbJuvEXrbp-9GXo-t|pz(K58veS_sYDy;=Jh&A)AgMEguavbXf>*a zVp+AdC8>%Bx6`ztUpkYQDYVwWjJeA(TgjB+-dD{S7~pqN-}xT=R3XxKAYN5`vlB+V zMB%z+&ATbe7)dpq7flbogYC6EaQ&`0&b>k}*W@hiJLC}+ zY>(h#>WBi{mGklX9p%@HZGG)r$C%rJ*z#yRxzOO?bV5)N@EYWUqV(A&GH|_4f=b|k zoVG{q3`rHql3X^?d6U~KYfnLr@bk7a+jBr-6{ZakF~pV{kUhON zE6@^cg$1mI@k{lhGH&ralv{ZQWyNL{PTOMMx%@4#^6WI~w7R!w_t06%dry#mq9>g` zAVo{%$~%E^hj=Ja(<{4fmU0H_>luLFc7{5DzEXJ|3AW!_$dU5U^bSn?75{xF2_4bS zArY;z43@kac|6#%u>IHg_ESJl+c(@)DV9ms2@6f|tG&1nG*Df7U$HiiO>g%RgphuN zO{Js}GIx{YHX-Dx>i8JpB zDs;#)8^r8i05KL@={#9l1IbHppvNWqH`b2 zUG^9102;13x6(`g`)5D3e@);>$(9&;MQc?%GOix5p}JHQ;Rh;b*@e+2)n8c2P4AOF zhgjSFVcI3YrqQKIE}Aj1;2Mx6n`noBnT25g{BqZ5D$7#*QP}U-NYgvc7AF=9nTynx zVd`5vo;AdN(DeFJ55DEo0$0Nv;I%z%RZ46=3HWA&_pa6QhQE}~lyp0v6M`P+ zhn7!aH23JpKuIsXdmcya(k@P|wqMiPDwk5{mn+T38Em!$3nvRcxOrc0j{CG^d9Y7d zLz8>{xE-ZDAEY)o$=N%IW0K7Vkve$ZHz3XCdFiK`KzUJipbOJ?$T82$)cRyW?}1QE zuMhEzjL1T$B1@1tim(;$NhvZQRfFse)@p^B`u=Wplp~N>kC`oBS`oc>?gzefH`_Sj z1U5zOp5~Dlo2m!)sAsmk=IN;#baB37^(8z%WQ>@$|IXGkcQ;M3%equ?WmS6C%Gp@f zzBs^~%&Ql*s2P^9gYnI1^rlC*!#nyGr+JfhEk+FF*Ht#x`yGUcjHtnFsKbgh z*hl}C1{ce3y5-c+*PeQ<*Cyms-oPz*eA%g ztMu|q*NaMpoErXLyneI&u56?k_HcW16QwjY|4$9qmt%2nyQG2~ekeypO~u=uv;Cys zXDQiXsIjHbH(K?kV7bbrVaa^s1rRiG=WpjtO+WKM)d(&~zWr>CYP;HoC9GhkzOSQK zwpR{DU7Dv2kHchoL7KtK^DA&|vJT;NuP~8~-!%&-A|2LQ+AS&Q9%B0<6FrOil>9~! z(Tw|OYqiy!k2Vi=OvF^)`cJhYH9GvhUBAYKlH`?S5D!?JKe{QBdJOQ`4LbdSF!6 z3?Jg!3o2z0^IPk5olEJ}8jl4{$!{crl<9tKFFV;K zwm7ABzQcXo`r`=9`Pvh|M?XXIp$p2>u1#u`TFtxux*2HlzB~{|gwkUo9(|=n3jN+A z&@O1dx_8}FKko_Mxk=Pw)j_t%hJwxKj=H1+QzSyPtVUiEWSG(kqy>|<#Tb3t`pQq1 z$YV%mP(T?Nmh(H6U~%*{RgCV+{+G4b>sv($wKt$3z*CKrg@~L6^b1 z2jQE5H?pS63h5n$ANMbdHl({n3yf;R?}M~1V_{g`Jf zbswSbo*pV|I@++>?zc4DqD^=x7b59UCCS1zl(nUAo0QYh;9cbOAm_$R{F4c9%yMcZ zQFq?HjzBK1X%KKVCR8^#iKC048+R0XkWs>$H|u~392Jzj3*ElIJ{!3X8E%U=&s7Vd z%F{N=&-iAfsDi*ZMBO@S*YKNk=Rr5)=3fs;?BHn?_r?y=o@uPE_@h^v76MDFe&Z*m z7=BYn#0^!>Z~Jh<=*yj_gxcC_&DXx_NFWV-!K#*heFN>+3WFmTjl`9Dck_ii01H~F zvM!I8@IyN9hI~(3TodoYGNXf?=;CK}#8vrO)sDwdii$$|9BE_d=KHY*Pcau|hoK-r z?9lIi0F{|t2Lm>`0y*(#^MYa_z$917P>4;MM4qFYa0ST~# zyg2#kZja{WNg{Bmm;}r9E3<8}%`@K1k@kf{L!La@tL*RZFC=g>$GK)%)`5bq3h+rf zmhPQW-;%z*z!1=O>dGxImjJGru%Wl{+=Y*Yg`2ZJ)kT}jAx=Aqs&*j<2dw%;rEYMq z8m|&!S^DwsmVP$)A@nN6UU&LI#Ais2<2b8~NKksuNi~qjJ(flqe#y3je6k|xXF8Pd zDx?(V^Cxi?-|#riszd*LqIYwU+?3Jfij>bL3VvJezxq+Qo^KZWfzmedMat<&vZ{;p zrJd8xHx>Kg&&6|==M5OX4>`K^aqP2B3ZKiE!%dWLXWxbBQ#LDCe!836M`j9E&BP%? zEQA zD=Z^M!YN`LP{@9cH9bLc{}l!r(&EL(oi1AxVPaCFR&!B^P@Rt%a!?412rNMIa<6)< z{*79$_UD>Vuw;a&3FMvWr}o#=A1@jIq$cYUZmL=QA?1l1EymE= zrXJ7glo|Y23I#310~cD^+HPUv*C={jq*|v&`k(znw?Wj#L3%0q^_M~YNie>M(Cn?b^~WgVY5#@zVp&vz)&st-4JBwfs1rB>WIu43+Iam_8SYkf`wtdZD~L z`iIy};|W`nxHy#d&1IJV{G74JO(U;dg7KX~>BtaZKSP9OAJA@o;QQJR17C3hDecmfv%t$M2bF+QtP^ zNi5|7&52s`E2&|%@~VlZYusV_6dG15fi96kf}UuS#urjZ1iD0NAq<^i^)gV1HSZ|Q znI%{y^YP9uMOYRpuK-U`@u(8j^3oGDKlT739(C2;)|w?Rd^(_h$9I=v2r*=TErg*4 zTe=Js5;*H3^1gZozBvnA5i=6RI@_qcXDyMf@8eg}74ZOZXYh@SI~v1q!2m!VzWGM+ zEQ(hDoT;atJ!pqSIE3=~T@mLNO`G21zjxn`8EnU|Bm#Gf2e8u!Zo2vb(4aILtt^Tz zyN1H^Rw3k}YcSpuq~_(PY1sH0!K$4IKq!-(c?&2gTgLoVSKyfva82;xa1wDU|8_qO z&p%48GVmz_L-sCz7z;>S?_vy%M)?+(G4Hl=yt7MFe%8P9Dpe1aBf8qKq@c*F5C}9H zyXFg8_U@wL)n}P~$>l6qbw$RB!c7PG_{JX+X{ z4f}y41C&UPo$bxSXjTgJ~Xsy#0f$n95p!MY^Y2NZ-#tHqU3z_z#8?c@9V-B|rx-hr>0eSc!t)Fc|G}K@j z0_k#V1mKa9T+^WHzIDWVf*IRSKYtaTg~v_~yG!d-326P`Exd;Nd$S6z*hX7|Pu1CBtXrYdV~YzTqZkTkvgBz82Cv29@Kazx?iT9Mgcz!69^)+afl zvnvXL(b>j<4X+G2dETjK;W*jPmGQ23*;i{#sv8&y56cqk4=KQug0>IeV%E9e%h=Yp z;21izMjj?{w$>c;?}69aaPgH_w!3bdA^}1v5So#EN<#P6_lXBPGfwQEw}3>yzA?wi zdePY;g#m_t%7{f$A}}?y3~?n|g)?v*ozmAH|MjObK;=(kq{=yIC_!k?u8i#rpMS)2 zjRsO~0pHyDWQq;Ag&_o?>dXvq67fl43#h{-z+bwEE(b;$7nMM?wmM^*M0XI;Pm>$K zhBKBBaj6R&tvUbgfsB56#iA7DnhwFPQ0grZC|gE7{jY}X;B>ZS{2ys)I;i~mU`hyh zB)Qt%4n)%^jeu!jx!FY}QzgJVeI}lg`RKYmBXUxN03DCwB;rVA4%#MIwPS#}Err1A zB9b!{EJM2T2D^kvRe}Kdr>{i!)6T;!LW9r(ZQE%lZ{PG@(&m^*LkI>kpyM1K|-}oxwFDi&s?;={a56=-LsKV*wE&mn;r=5fBckOl8 z)v)>2tB?n3$W_LKM}Y@IBVND$3jK|BcVSH}7}cS>_U&f#^*_Ms>BMiy5yk)0A!0jp z#O)N5*fJzjO#`nBQ+QuX7slCZxRLDkP!#dp3A6Off;_^uLri%nT)u+BrOTLh!YSm=nv)e_+kSf^ z;rHJlXBaQN6M^dHPLvb^pA?uv5_jT+-g}LXjjysxYitJ$pAY}+c>shO>c~ItWKRD5 z18D~hHy)tt{WqB+4?V0*R%k$JlA`1h0#gdST9DAm``po>ofyu(N&s?!c`GlYmFR=PC-&a zqyT(=q}P|xzV^>4#ap^?QiQvPLa#UIzJn8q;MjI%=R`{$)9$Y^aXJ5Jvp{b z_rBdj4xGF27)tK?Da#bKSdz^P|4YyBh0K;h`Q!XqqN_dWp(rUx`&l^%_! zWG4LP6AcMh)MX4)aLv-s06UKxc&7FvE8AUUPE9>i4w{8Izxa!AOwRF zsY!Z|5nI!3JLD`ojm0krerKJJgpw>gx?h#s2dyo3Flv&M$Vlx*|PCl;Hp71>F4j= zF)z=LB~x>PvqhgYC?PPkL({u&5{oCuFFPq?Kb1R$j*s4ku8wij1r0qBq)#5o3m#1? z%Rt~0l00S5`plzLK3G1a6nKw22|XIQgKi5+9XDnimjWy)$ukXtuRl-Si%(``fKfCP zXB;)bu-)No(5Dx24N2oaA0kv=o8ECUt*jqpvw=n#GL6HcU0Y8nklkqoQpL}I}1w|@LC zvL`sAWNkMHCv57v!!-1Sw>Z&wxw@*lz4PhCENcu+U(*;0Uo3uit!0000(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<)=5M`RCwC#+G~iEWfTYS-`HB_7S(oBvUbQY7l~tu%y&t zzb1ZOf#qmTF{wOP1Bo0?#2I-cHew!za&ycllEImIpJ#_#C#OK96IZ2RCmY`B#1uS& z=LS9rJFptJU~P>r&)}YvJUbZnx^PPT?!sao$rKqp4Xf~Ao@=YY$v7t^BI9v> zkoX&O!bATd(vNK=3>=8ZBENT3`SKY>l1jbkkMMf8*kaFOT^R!x;A6ZI_m$w7lu3LS zh4k&=T9kJxG&UD&q9)uNd4AaHn<5q#Td##LSrLq^a?D)JLoAE35kFd?8H0Nx&?l+f_-ij8Y9vq6(!dn-mNCNuG5ji@t zz^!-|Pv-iVQHHJMLTd-k!_{%Wu}Ih1Z0y38avs@h(50^zt$w33L zTYR`w0UBZKj6FzAy4J*K-DkwQ+1zAr{9H}1m5(`?kKb`X)RtyoH=d|O6exuca2RId zEF9buVX@QpIyKCDQ5j(i69HSQ)mr)~ljS!XEr7ktJIt;&r=3TkQxj zA#Lo5HfTXKtLh~(JsQMz$%)dqP(m7c#@LOA)Gm$}T_dX_8!d_j-PS-7U*aao+2Pu> zjOI_a506I(-57D3)`?XgUXuuT=i+50gtmG^DUenY-wZ#Etj>vk85!xfhj>|YJ^`dd+m+M_r|`Zr_mEHL}u(uHDg4^i2Of@{4)TT WU&sEBduajy000000001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000quNkl#A$qsB7<{iG`02U%B`D zpLgc+f#r9jtH0+z$M?(`=H8h*^FH(T4`%v*POkyHYI+UeRnuz#ubN&1crwZA-zSoy z{v}e!PhJ01dS(DMPX{Rqy%7EHA-)pq636CmtEhS`%d$Fp!p_xbG5Z`6c$V9G`1D73 zF+V=erFg;lr_tjJzy`fk{tFdS6eHjNQBtSP^!U-7WX>K21(gr3mt4MGcH?%*)%?=y z=6196`rV4#d`kt~imz(!CYy+X=LcYvO$MWaX5>9@>Q#x}Ob;E(X8~T84YE;>xu5SH z?3CrwHP<&h*EcN3$J~czd-vSl2EfE8{PSw!o6yVW1VA5G@5z-4mqb{&WFI2BJ#iZG zZLB2G@dZ<_Al*jZVsae{tUMgq%rh_UR4gJ2s!ELL%-7G%b*Ig-Xd~rSO#T!EsaB z&EvN+JEXgH+2Iws%PS<;JvhfBIL9qG+pB$+Q~zBZOLZmu^Xfgt7=-aN0|0K$r93tv zhxtvh>^P4F&XI!VvNkhZ-&t0vGhmInca_5Mo^D;%6`0O1G3^aivYRSfE#xf{nlVK( zW!E1)-O*#BM~7wZp_%T%J3KmOdjddcu20+a#u?W)Vh6Jj$RKDtI_Tit-Or;!P zzuGBvh^yUmu_kh%W%q?FY=Ot{Rb~Kup^8M+nY(*T*^crLlDvr-lbO7Q0fUliY20FI zN@Kg1*R~zt>>B0d`+-Zx^_pt6LG$b3QL zmhO-OXIn-lvWP^Bu1T7Zc-Ns{1AuvV5FZ+8P;gw?Vhz?!TdkBW7D|dnPSq$InfwDa zV+u2+OVOV-wj1p1GT6~$h->E!o}qc}owMCTay|c;>2T=YUNC@L7dyiN;PF(!Kig+H zKLUWW_Edrj2?+oI3z}`!Es1p{08((g>yXu40%oNb@rWzWzV6_j?mI*j-Y8?{7s=7_0T|I_7JH6}FBGxrD&jSG9i(ubVkB#9+8$^IJ$d!1U{m)OK zV9#U3!cqkQl0er)DFOiI3khIK_y;1+y;6KZNv$QPGF&{kC(Xg#pG%^7Sw{=5{?)h< z!qG&qpZBIPq%>(cC4(^B-+^x00ud=Tj2qx1Qx?` zyr{`c>m@*pnT=dJdHffD8#YiX=RgBb(diZJd3Xd{s1HV{Mm7L(?M*wKLR7*go z=N$8_#%Sal!ep+jGlA)h`bydxN?JWAk}2Cksk}=oNt>bDrE-o3SxA~@;HOPs39#m% z#oi%1$qaD)9kN||?PyzAp~WYlU(53&^I9NQV2TNzon%csPbW$uLWja#{gwV!Jhk;u9vm~8;qZa*md_^Tc6F{|tKUQ)YfqFw*5!oT=o z`_T)4As1gVotm!f3NU3hgfS?a8M&s-l4%qCl4RJ*3|q*bZd*~$<{c*hP*o_~t5c3g zXpSd@aQyBe#I=@N8`AY>aRAx|zD2gpwRX*mnzqq8v<0IW(_`b-h0WTa(b%>nmKD_V zcwprURQD~NOf5s_w;N#U37i!c0x4_!83H1I97BnbdsVIzMuj?=Huu2q3uOI>}h zZ#6E_l3yF2;jG&tGK0|grcuj1hpb{9;)F~Pp@GdJBA#{q%lpH+9U05C-$+Wj6@@VJ zr`3T>`8#nh;sXgGlVvWf-73xx00ft40tvDs7_@j4jj5bjyO#8h(QQgIoII;s&o^AZ zWjuAZGGlw`sLu-Ca4)p+DQxHmoC3)Mo8~$@|21`*4`ROKm`i~BVAgF33tylKPtbIn zXW2Euamd$oA{VmG^Q4FbDQu~C@6V1+lz#eHb840bDsD=qYc_7SP=4xWIyFtXutd4E z64{Xu3#Aw-3}Io+8i&9<&yZ~7ry{*mF^BKl910t?xNqZYu=QVM?Kg<|kI?v!VIHn;PLR4Uh7jxrE47DkSJTB2MS}Fj#O=%P_g5lsMLvSGoU63JbbQMX$pFB|Qd{mD{Np1c229z;~47 z|2}i?V-pHvfKytQaun-DG}wFcDj7hRMeD{oADh7T$4dJ?Vt3bQNCF3WekNB^B$f^2 zMymjjE~Q$MYMq%m`pB?=bUUPU!sVMAOad5S)&Ut!8H}=Ycr0yKef?@8fJcDA0P?{y zX#W!cXnaRXKBG0wZ8}b8T@p`RxQ+F~&z4l^9izWyVY4$nX>cS~0FZ7hwIBdzX4C%Q zo}WmkiWb69!9#q8sl&AWwhwmV7Or_j~|j zxO`RCYRf0ZX)Wvv8@H$lU{x(&02s~uV;E_XTZ{45{Z{^VpNbEP+Y|`pz>hc93Yq+4 zY@I`~>_9BrGfujc!~vXN$^js|B&?_tm>a~G-%R7_#f2^q4785UaOP`t*DVNj2HmcTKmHW0ARS}H;#FFd5y9e z_H9XNIXFYfCaSiGNn2RwX?YXs1AtJWbMr0W^^K=zfN!osJa^KbAO}j>9&a3g@$_^| zZNHKHW`-Tu1>b}r8zmc!VZK2b4oB}EBrim6w1MyA4cH3);6vkv-dLlK5fBhsfV*2v)0lM?6*^o!6a#h)7W>cGieR_-<7USuX!gfi5P&#K{=B=#nGCyCRITb zkD@hhQDE!OBO1jx!~uQN7T?zP8_ayhNWP;b-%psEyZi8FBmb)7*(eAA&_~Tq)dVFi z{;GOjF+WxUl?WZ;in&cSx zxu*S0mzXu?bXwSP)T|U1kn~RUkY7HR_Qq-e;Pe~{w8ZXa$(ZY=WI2#aO}4~9#4=cj zaVrP#%NGK`d;5A)=*{u2DFKu+la74=X)~liW$%5?S5{Rag6Qj-e^tVxn#`@(&4L$O z_F2Jtt(1DNU?B_41&vT43*w>ZAb*j9GEgPr<>q7PxyPONI?h-q%yy-Kd{> zlMM(7a2P@Y0DvPXnS-l=p3qvIPW)acV2B`KypfM=w171gDJt3nX0Ma%*D>c|%yk@d zAH&?nSbEoLH?8rzUkfh;*uo2SpS%f1Y#F%#358>?DPP94JvO(2DT8Z#+8gqYR=9X7 z%0LCjO$YiY2cwk31C>LAXnbn2kN^NYqC&8T8a4oXwQw#SJrNJIQB4x5MEqBfQjz_e zTHBT|X!H*nlMy2qf)^TL(Q*uP332MnA{IC3v-oZSW&b2TUKV$r@I7)nWOc~)EF%!A z6Gz1-o0J>If>XwdTO?^Z6j#QT@?jDzV8B&K1t3yrvjn&eRHdS&(c|Q?!VV+|q3##K_Xr$mc7MVm-sLN2bwVN~W%M^S_K3a_~PlKUK zKrwytkLbv}7H{ti=)L_dv|c;jdV6P3c&_i(Xvuq zagnZ|Sg$SC6{$_H#hY?N85S`(d!vD@UhFGA;_UKhAb#`WRgO8#8Te0&;^%dX4slZ8 z9Q4d*a_o}4{ikn9p$SyQhsKjYfFxuAaH6fu`Wav0`uQ0T0eIxGN;3Q^G4;sg!$cCG zMe4Sqz!RkIt3Ff_#==Xk&HY!und!q5vWCTHq3<^{ZEem;ygza2x2V}^4pA#094MG= zzh#ks+O+p)`cDx&CAg`%+Y{-b<5UKO%c@DL`+DZzMjyWqI)fjBG5r&U56a5*SAW%B z%r7b^p`sMtT~+s99a!ss~x z2ofAVLgx2mF(B|?^^$+|g6Y2k@V^n~UuCxj*TOVkFufE2|CjWF0aRW5OS$YP(u)J| zQZ)QO(@R#NmyhbT4ZLc44d7MNYXGmBUITcwWHS8^WiW!0h;Ok&00000NkvXXu0mjf D$PlZ| diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/reply1.ebay.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/reply1.ebay.com.png deleted file mode 100755 index b38920ca3eaf7547f9388e0d244257b19a67d3a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4621 zcmV+o67ubdP)00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000quNkl#A$qsB7<{iG`02U%B`D zpLgc+f#r9jtH0+z$M?(`=H8h*^FH(T4`%v*POkyHYI+UeRnuz#ubN&1crwZA-zSoy z{v}e!PhJ01dS(DMPX{Rqy%7EHA-)pq636CmtEhS`%d$Fp!p_xbG5Z`6c$V9G`1D73 zF+V=erFg;lr_tjJzy`fk{tFdS6eHjNQBtSP^!U-7WX>K21(gr3mt4MGcH?%*)%?=y z=6196`rV4#d`kt~imz(!CYy+X=LcYvO$MWaX5>9@>Q#x}Ob;E(X8~T84YE;>xu5SH z?3CrwHP<&h*EcN3$J~czd-vSl2EfE8{PSw!o6yVW1VA5G@5z-4mqb{&WFI2BJ#iZG zZLB2G@dZ<_Al*jZVsae{tUMgq%rh_UR4gJ2s!ELL%-7G%b*Ig-Xd~rSO#T!EsaB z&EvN+JEXgH+2Iws%PS<;JvhfBIL9qG+pB$+Q~zBZOLZmu^Xfgt7=-aN0|0K$r93tv zhxtvh>^P4F&XI!VvNkhZ-&t0vGhmInca_5Mo^D;%6`0O1G3^aivYRSfE#xf{nlVK( zW!E1)-O*#BM~7wZp_%T%J3KmOdjddcu20+a#u?W)Vh6Jj$RKDtI_Tit-Or;!P zzuGBvh^yUmu_kh%W%q?FY=Ot{Rb~Kup^8M+nY(*T*^crLlDvr-lbO7Q0fUliY20FI zN@Kg1*R~zt>>B0d`+-Zx^_pt6LG$b3QL zmhO-OXIn-lvWP^Bu1T7Zc-Ns{1AuvV5FZ+8P;gw?Vhz?!TdkBW7D|dnPSq$InfwDa zV+u2+OVOV-wj1p1GT6~$h->E!o}qc}owMCTay|c;>2T=YUNC@L7dyiN;PF(!Kig+H zKLUWW_Edrj2?+oI3z}`!Es1p{08((g>yXu40%oNb@rWzWzV6_j?mI*j-Y8?{7s=7_0T|I_7JH6}FBGxrD&jSG9i(ubVkB#9+8$^IJ$d!1U{m)OK zV9#U3!cqkQl0er)DFOiI3khIK_y;1+y;6KZNv$QPGF&{kC(Xg#pG%^7Sw{=5{?)h< z!qG&qpZBIPq%>(cC4(^B-+^x00ud=Tj2qx1Qx?` zyr{`c>m@*pnT=dJdHffD8#YiX=RgBb(diZJd3Xd{s1HV{Mm7L(?M*wKLR7*go z=N$8_#%Sal!ep+jGlA)h`bydxN?JWAk}2Cksk}=oNt>bDrE-o3SxA~@;HOPs39#m% z#oi%1$qaD)9kN||?PyzAp~WYlU(53&^I9NQV2TNzon%csPbW$uLWja#{gwV!Jhk;u9vm~8;qZa*md_^Tc6F{|tKUQ)YfqFw*5!oT=o z`_T)4As1gVotm!f3NU3hgfS?a8M&s-l4%qCl4RJ*3|q*bZd*~$<{c*hP*o_~t5c3g zXpSd@aQyBe#I=@N8`AY>aRAx|zD2gpwRX*mnzqq8v<0IW(_`b-h0WTa(b%>nmKD_V zcwprURQD~NOf5s_w;N#U37i!c0x4_!83H1I97BnbdsVIzMuj?=Huu2q3uOI>}h zZ#6E_l3yF2;jG&tGK0|grcuj1hpb{9;)F~Pp@GdJBA#{q%lpH+9U05C-$+Wj6@@VJ zr`3T>`8#nh;sXgGlVvWf-73xx00ft40tvDs7_@j4jj5bjyO#8h(QQgIoII;s&o^AZ zWjuAZGGlw`sLu-Ca4)p+DQxHmoC3)Mo8~$@|21`*4`ROKm`i~BVAgF33tylKPtbIn zXW2Euamd$oA{VmG^Q4FbDQu~C@6V1+lz#eHb840bDsD=qYc_7SP=4xWIyFtXutd4E z64{Xu3#Aw-3}Io+8i&9<&yZ~7ry{*mF^BKl910t?xNqZYu=QVM?Kg<|kI?v!VIHn;PLR4Uh7jxrE47DkSJTB2MS}Fj#O=%P_g5lsMLvSGoU63JbbQMX$pFB|Qd{mD{Np1c229z;~47 z|2}i?V-pHvfKytQaun-DG}wFcDj7hRMeD{oADh7T$4dJ?Vt3bQNCF3WekNB^B$f^2 zMymjjE~Q$MYMq%m`pB?=bUUPU!sVMAOad5S)&Ut!8H}=Ycr0yKef?@8fJcDA0P?{y zX#W!cXnaRXKBG0wZ8}b8T@p`RxQ+F~&z4l^9izWyVY4$nX>cS~0FZ7hwIBdzX4C%Q zo}WmkiWb69!9#q8sl&AWwhwmV7Or_j~|j zxO`RCYRf0ZX)Wvv8@H$lU{x(&02s~uV;E_XTZ{45{Z{^VpNbEP+Y|`pz>hc93Yq+4 zY@I`~>_9BrGfujc!~vXN$^js|B&?_tm>a~G-%R7_#f2^q4785UaOP`t*DVNj2HmcTKmHW0ARS}H;#FFd5y9e z_H9XNIXFYfCaSiGNn2RwX?YXs1AtJWbMr0W^^K=zfN!osJa^KbAO}j>9&a3g@$_^| zZNHKHW`-Tu1>b}r8zmc!VZK2b4oB}EBrim6w1MyA4cH3);6vkv-dLlK5fBhsfV*2v)0lM?6*^o!6a#h)7W>cGieR_-<7USuX!gfi5P&#K{=B=#nGCyCRITb zkD@hhQDE!OBO1jx!~uQN7T?zP8_ayhNWP;b-%psEyZi8FBmb)7*(eAA&_~Tq)dVFi z{;GOjF+WxUl?WZ;in&cSx zxu*S0mzXu?bXwSP)T|U1kn~RUkY7HR_Qq-e;Pe~{w8ZXa$(ZY=WI2#aO}4~9#4=cj zaVrP#%NGK`d;5A)=*{u2DFKu+la74=X)~liW$%5?S5{Rag6Qj-e^tVxn#`@(&4L$O z_F2Jtt(1DNU?B_41&vT43*w>ZAb*j9GEgPr<>q7PxyPONI?h-q%yy-Kd{> zlMM(7a2P@Y0DvPXnS-l=p3qvIPW)acV2B`KypfM=w171gDJt3nX0Ma%*D>c|%yk@d zAH&?nSbEoLH?8rzUkfh;*uo2SpS%f1Y#F%#358>?DPP94JvO(2DT8Z#+8gqYR=9X7 z%0LCjO$YiY2cwk31C>LAXnbn2kN^NYqC&8T8a4oXwQw#SJrNJIQB4x5MEqBfQjz_e zTHBT|X!H*nlMy2qf)^TL(Q*uP332MnA{IC3v-oZSW&b2TUKV$r@I7)nWOc~)EF%!A z6Gz1-o0J>If>XwdTO?^Z6j#QT@?jDzV8B&K1t3yrvjn&eRHdS&(c|Q?!VV+|q3##K_Xr$mc7MVm-sLN2bwVN~W%M^S_K3a_~PlKUK zKrwytkLbv}7H{ti=)L_dv|c;jdV6P3c&_i(Xvuq zagnZ|Sg$SC6{$_H#hY?N85S`(d!vD@UhFGA;_UKhAb#`WRgO8#8Te0&;^%dX4slZ8 z9Q4d*a_o}4{ikn9p$SyQhsKjYfFxuAaH6fu`Wav0`uQ0T0eIxGN;3Q^G4;sg!$cCG zMe4Sqz!RkIt3Ff_#==Xk&HY!und!q5vWCTHq3<^{ZEem;ygza2x2V}^4pA#094MG= zzh#ks+O+p)`cDx&CAg`%+Y{-b<5UKO%c@DL`+DZzMjyWqI)fjBG5r&U56a5*SAW%B z%r7b^p`sMtT~+s99a!ss~x z2ofAVLgx2mF(B|?^^$+|g6Y2k@V^n~UuCxj*TOVkFufE2|CjWF0aRW5OS$YP(u)J| zQZ)QO(@R#NmyhbT4ZLc44d7MNYXGmBUITcwWHS8^WiW!0h;Ok&00000NkvXXu0mjf D$PlZ| diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/reply2.ebay.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/reply2.ebay.com.png deleted file mode 100755 index b38920ca3eaf7547f9388e0d244257b19a67d3a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4621 zcmV+o67ubdP)00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000quNkl#A$qsB7<{iG`02U%B`D zpLgc+f#r9jtH0+z$M?(`=H8h*^FH(T4`%v*POkyHYI+UeRnuz#ubN&1crwZA-zSoy z{v}e!PhJ01dS(DMPX{Rqy%7EHA-)pq636CmtEhS`%d$Fp!p_xbG5Z`6c$V9G`1D73 zF+V=erFg;lr_tjJzy`fk{tFdS6eHjNQBtSP^!U-7WX>K21(gr3mt4MGcH?%*)%?=y z=6196`rV4#d`kt~imz(!CYy+X=LcYvO$MWaX5>9@>Q#x}Ob;E(X8~T84YE;>xu5SH z?3CrwHP<&h*EcN3$J~czd-vSl2EfE8{PSw!o6yVW1VA5G@5z-4mqb{&WFI2BJ#iZG zZLB2G@dZ<_Al*jZVsae{tUMgq%rh_UR4gJ2s!ELL%-7G%b*Ig-Xd~rSO#T!EsaB z&EvN+JEXgH+2Iws%PS<;JvhfBIL9qG+pB$+Q~zBZOLZmu^Xfgt7=-aN0|0K$r93tv zhxtvh>^P4F&XI!VvNkhZ-&t0vGhmInca_5Mo^D;%6`0O1G3^aivYRSfE#xf{nlVK( zW!E1)-O*#BM~7wZp_%T%J3KmOdjddcu20+a#u?W)Vh6Jj$RKDtI_Tit-Or;!P zzuGBvh^yUmu_kh%W%q?FY=Ot{Rb~Kup^8M+nY(*T*^crLlDvr-lbO7Q0fUliY20FI zN@Kg1*R~zt>>B0d`+-Zx^_pt6LG$b3QL zmhO-OXIn-lvWP^Bu1T7Zc-Ns{1AuvV5FZ+8P;gw?Vhz?!TdkBW7D|dnPSq$InfwDa zV+u2+OVOV-wj1p1GT6~$h->E!o}qc}owMCTay|c;>2T=YUNC@L7dyiN;PF(!Kig+H zKLUWW_Edrj2?+oI3z}`!Es1p{08((g>yXu40%oNb@rWzWzV6_j?mI*j-Y8?{7s=7_0T|I_7JH6}FBGxrD&jSG9i(ubVkB#9+8$^IJ$d!1U{m)OK zV9#U3!cqkQl0er)DFOiI3khIK_y;1+y;6KZNv$QPGF&{kC(Xg#pG%^7Sw{=5{?)h< z!qG&qpZBIPq%>(cC4(^B-+^x00ud=Tj2qx1Qx?` zyr{`c>m@*pnT=dJdHffD8#YiX=RgBb(diZJd3Xd{s1HV{Mm7L(?M*wKLR7*go z=N$8_#%Sal!ep+jGlA)h`bydxN?JWAk}2Cksk}=oNt>bDrE-o3SxA~@;HOPs39#m% z#oi%1$qaD)9kN||?PyzAp~WYlU(53&^I9NQV2TNzon%csPbW$uLWja#{gwV!Jhk;u9vm~8;qZa*md_^Tc6F{|tKUQ)YfqFw*5!oT=o z`_T)4As1gVotm!f3NU3hgfS?a8M&s-l4%qCl4RJ*3|q*bZd*~$<{c*hP*o_~t5c3g zXpSd@aQyBe#I=@N8`AY>aRAx|zD2gpwRX*mnzqq8v<0IW(_`b-h0WTa(b%>nmKD_V zcwprURQD~NOf5s_w;N#U37i!c0x4_!83H1I97BnbdsVIzMuj?=Huu2q3uOI>}h zZ#6E_l3yF2;jG&tGK0|grcuj1hpb{9;)F~Pp@GdJBA#{q%lpH+9U05C-$+Wj6@@VJ zr`3T>`8#nh;sXgGlVvWf-73xx00ft40tvDs7_@j4jj5bjyO#8h(QQgIoII;s&o^AZ zWjuAZGGlw`sLu-Ca4)p+DQxHmoC3)Mo8~$@|21`*4`ROKm`i~BVAgF33tylKPtbIn zXW2Euamd$oA{VmG^Q4FbDQu~C@6V1+lz#eHb840bDsD=qYc_7SP=4xWIyFtXutd4E z64{Xu3#Aw-3}Io+8i&9<&yZ~7ry{*mF^BKl910t?xNqZYu=QVM?Kg<|kI?v!VIHn;PLR4Uh7jxrE47DkSJTB2MS}Fj#O=%P_g5lsMLvSGoU63JbbQMX$pFB|Qd{mD{Np1c229z;~47 z|2}i?V-pHvfKytQaun-DG}wFcDj7hRMeD{oADh7T$4dJ?Vt3bQNCF3WekNB^B$f^2 zMymjjE~Q$MYMq%m`pB?=bUUPU!sVMAOad5S)&Ut!8H}=Ycr0yKef?@8fJcDA0P?{y zX#W!cXnaRXKBG0wZ8}b8T@p`RxQ+F~&z4l^9izWyVY4$nX>cS~0FZ7hwIBdzX4C%Q zo}WmkiWb69!9#q8sl&AWwhwmV7Or_j~|j zxO`RCYRf0ZX)Wvv8@H$lU{x(&02s~uV;E_XTZ{45{Z{^VpNbEP+Y|`pz>hc93Yq+4 zY@I`~>_9BrGfujc!~vXN$^js|B&?_tm>a~G-%R7_#f2^q4785UaOP`t*DVNj2HmcTKmHW0ARS}H;#FFd5y9e z_H9XNIXFYfCaSiGNn2RwX?YXs1AtJWbMr0W^^K=zfN!osJa^KbAO}j>9&a3g@$_^| zZNHKHW`-Tu1>b}r8zmc!VZK2b4oB}EBrim6w1MyA4cH3);6vkv-dLlK5fBhsfV*2v)0lM?6*^o!6a#h)7W>cGieR_-<7USuX!gfi5P&#K{=B=#nGCyCRITb zkD@hhQDE!OBO1jx!~uQN7T?zP8_ayhNWP;b-%psEyZi8FBmb)7*(eAA&_~Tq)dVFi z{;GOjF+WxUl?WZ;in&cSx zxu*S0mzXu?bXwSP)T|U1kn~RUkY7HR_Qq-e;Pe~{w8ZXa$(ZY=WI2#aO}4~9#4=cj zaVrP#%NGK`d;5A)=*{u2DFKu+la74=X)~liW$%5?S5{Rag6Qj-e^tVxn#`@(&4L$O z_F2Jtt(1DNU?B_41&vT43*w>ZAb*j9GEgPr<>q7PxyPONI?h-q%yy-Kd{> zlMM(7a2P@Y0DvPXnS-l=p3qvIPW)acV2B`KypfM=w171gDJt3nX0Ma%*D>c|%yk@d zAH&?nSbEoLH?8rzUkfh;*uo2SpS%f1Y#F%#358>?DPP94JvO(2DT8Z#+8gqYR=9X7 z%0LCjO$YiY2cwk31C>LAXnbn2kN^NYqC&8T8a4oXwQw#SJrNJIQB4x5MEqBfQjz_e zTHBT|X!H*nlMy2qf)^TL(Q*uP332MnA{IC3v-oZSW&b2TUKV$r@I7)nWOc~)EF%!A z6Gz1-o0J>If>XwdTO?^Z6j#QT@?jDzV8B&K1t3yrvjn&eRHdS&(c|Q?!VV+|q3##K_Xr$mc7MVm-sLN2bwVN~W%M^S_K3a_~PlKUK zKrwytkLbv}7H{ti=)L_dv|c;jdV6P3c&_i(Xvuq zagnZ|Sg$SC6{$_H#hY?N85S`(d!vD@UhFGA;_UKhAb#`WRgO8#8Te0&;^%dX4slZ8 z9Q4d*a_o}4{ikn9p$SyQhsKjYfFxuAaH6fu`Wav0`uQ0T0eIxGN;3Q^G4;sg!$cCG zMe4Sqz!RkIt3Ff_#==Xk&HY!und!q5vWCTHq3<^{ZEem;ygza2x2V}^4pA#094MG= zzh#ks+O+p)`cDx&CAg`%+Y{-b<5UKO%c@DL`+DZzMjyWqI)fjBG5r&U56a5*SAW%B z%r7b^p`sMtT~+s99a!ss~x z2ofAVLgx2mF(B|?^^$+|g6Y2k@V^n~UuCxj*TOVkFufE2|CjWF0aRW5OS$YP(u)J| zQZ)QO(@R#NmyhbT4ZLc44d7MNYXGmBUITcwWHS8^WiW!0h;Ok&00000NkvXXu0mjf D$PlZ| diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/reply3.ebay.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/reply3.ebay.com.png deleted file mode 100755 index b38920ca3eaf7547f9388e0d244257b19a67d3a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4621 zcmV+o67ubdP)00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000quNkl#A$qsB7<{iG`02U%B`D zpLgc+f#r9jtH0+z$M?(`=H8h*^FH(T4`%v*POkyHYI+UeRnuz#ubN&1crwZA-zSoy z{v}e!PhJ01dS(DMPX{Rqy%7EHA-)pq636CmtEhS`%d$Fp!p_xbG5Z`6c$V9G`1D73 zF+V=erFg;lr_tjJzy`fk{tFdS6eHjNQBtSP^!U-7WX>K21(gr3mt4MGcH?%*)%?=y z=6196`rV4#d`kt~imz(!CYy+X=LcYvO$MWaX5>9@>Q#x}Ob;E(X8~T84YE;>xu5SH z?3CrwHP<&h*EcN3$J~czd-vSl2EfE8{PSw!o6yVW1VA5G@5z-4mqb{&WFI2BJ#iZG zZLB2G@dZ<_Al*jZVsae{tUMgq%rh_UR4gJ2s!ELL%-7G%b*Ig-Xd~rSO#T!EsaB z&EvN+JEXgH+2Iws%PS<;JvhfBIL9qG+pB$+Q~zBZOLZmu^Xfgt7=-aN0|0K$r93tv zhxtvh>^P4F&XI!VvNkhZ-&t0vGhmInca_5Mo^D;%6`0O1G3^aivYRSfE#xf{nlVK( zW!E1)-O*#BM~7wZp_%T%J3KmOdjddcu20+a#u?W)Vh6Jj$RKDtI_Tit-Or;!P zzuGBvh^yUmu_kh%W%q?FY=Ot{Rb~Kup^8M+nY(*T*^crLlDvr-lbO7Q0fUliY20FI zN@Kg1*R~zt>>B0d`+-Zx^_pt6LG$b3QL zmhO-OXIn-lvWP^Bu1T7Zc-Ns{1AuvV5FZ+8P;gw?Vhz?!TdkBW7D|dnPSq$InfwDa zV+u2+OVOV-wj1p1GT6~$h->E!o}qc}owMCTay|c;>2T=YUNC@L7dyiN;PF(!Kig+H zKLUWW_Edrj2?+oI3z}`!Es1p{08((g>yXu40%oNb@rWzWzV6_j?mI*j-Y8?{7s=7_0T|I_7JH6}FBGxrD&jSG9i(ubVkB#9+8$^IJ$d!1U{m)OK zV9#U3!cqkQl0er)DFOiI3khIK_y;1+y;6KZNv$QPGF&{kC(Xg#pG%^7Sw{=5{?)h< z!qG&qpZBIPq%>(cC4(^B-+^x00ud=Tj2qx1Qx?` zyr{`c>m@*pnT=dJdHffD8#YiX=RgBb(diZJd3Xd{s1HV{Mm7L(?M*wKLR7*go z=N$8_#%Sal!ep+jGlA)h`bydxN?JWAk}2Cksk}=oNt>bDrE-o3SxA~@;HOPs39#m% z#oi%1$qaD)9kN||?PyzAp~WYlU(53&^I9NQV2TNzon%csPbW$uLWja#{gwV!Jhk;u9vm~8;qZa*md_^Tc6F{|tKUQ)YfqFw*5!oT=o z`_T)4As1gVotm!f3NU3hgfS?a8M&s-l4%qCl4RJ*3|q*bZd*~$<{c*hP*o_~t5c3g zXpSd@aQyBe#I=@N8`AY>aRAx|zD2gpwRX*mnzqq8v<0IW(_`b-h0WTa(b%>nmKD_V zcwprURQD~NOf5s_w;N#U37i!c0x4_!83H1I97BnbdsVIzMuj?=Huu2q3uOI>}h zZ#6E_l3yF2;jG&tGK0|grcuj1hpb{9;)F~Pp@GdJBA#{q%lpH+9U05C-$+Wj6@@VJ zr`3T>`8#nh;sXgGlVvWf-73xx00ft40tvDs7_@j4jj5bjyO#8h(QQgIoII;s&o^AZ zWjuAZGGlw`sLu-Ca4)p+DQxHmoC3)Mo8~$@|21`*4`ROKm`i~BVAgF33tylKPtbIn zXW2Euamd$oA{VmG^Q4FbDQu~C@6V1+lz#eHb840bDsD=qYc_7SP=4xWIyFtXutd4E z64{Xu3#Aw-3}Io+8i&9<&yZ~7ry{*mF^BKl910t?xNqZYu=QVM?Kg<|kI?v!VIHn;PLR4Uh7jxrE47DkSJTB2MS}Fj#O=%P_g5lsMLvSGoU63JbbQMX$pFB|Qd{mD{Np1c229z;~47 z|2}i?V-pHvfKytQaun-DG}wFcDj7hRMeD{oADh7T$4dJ?Vt3bQNCF3WekNB^B$f^2 zMymjjE~Q$MYMq%m`pB?=bUUPU!sVMAOad5S)&Ut!8H}=Ycr0yKef?@8fJcDA0P?{y zX#W!cXnaRXKBG0wZ8}b8T@p`RxQ+F~&z4l^9izWyVY4$nX>cS~0FZ7hwIBdzX4C%Q zo}WmkiWb69!9#q8sl&AWwhwmV7Or_j~|j zxO`RCYRf0ZX)Wvv8@H$lU{x(&02s~uV;E_XTZ{45{Z{^VpNbEP+Y|`pz>hc93Yq+4 zY@I`~>_9BrGfujc!~vXN$^js|B&?_tm>a~G-%R7_#f2^q4785UaOP`t*DVNj2HmcTKmHW0ARS}H;#FFd5y9e z_H9XNIXFYfCaSiGNn2RwX?YXs1AtJWbMr0W^^K=zfN!osJa^KbAO}j>9&a3g@$_^| zZNHKHW`-Tu1>b}r8zmc!VZK2b4oB}EBrim6w1MyA4cH3);6vkv-dLlK5fBhsfV*2v)0lM?6*^o!6a#h)7W>cGieR_-<7USuX!gfi5P&#K{=B=#nGCyCRITb zkD@hhQDE!OBO1jx!~uQN7T?zP8_ayhNWP;b-%psEyZi8FBmb)7*(eAA&_~Tq)dVFi z{;GOjF+WxUl?WZ;in&cSx zxu*S0mzXu?bXwSP)T|U1kn~RUkY7HR_Qq-e;Pe~{w8ZXa$(ZY=WI2#aO}4~9#4=cj zaVrP#%NGK`d;5A)=*{u2DFKu+la74=X)~liW$%5?S5{Rag6Qj-e^tVxn#`@(&4L$O z_F2Jtt(1DNU?B_41&vT43*w>ZAb*j9GEgPr<>q7PxyPONI?h-q%yy-Kd{> zlMM(7a2P@Y0DvPXnS-l=p3qvIPW)acV2B`KypfM=w171gDJt3nX0Ma%*D>c|%yk@d zAH&?nSbEoLH?8rzUkfh;*uo2SpS%f1Y#F%#358>?DPP94JvO(2DT8Z#+8gqYR=9X7 z%0LCjO$YiY2cwk31C>LAXnbn2kN^NYqC&8T8a4oXwQw#SJrNJIQB4x5MEqBfQjz_e zTHBT|X!H*nlMy2qf)^TL(Q*uP332MnA{IC3v-oZSW&b2TUKV$r@I7)nWOc~)EF%!A z6Gz1-o0J>If>XwdTO?^Z6j#QT@?jDzV8B&K1t3yrvjn&eRHdS&(c|Q?!VV+|q3##K_Xr$mc7MVm-sLN2bwVN~W%M^S_K3a_~PlKUK zKrwytkLbv}7H{ti=)L_dv|c;jdV6P3c&_i(Xvuq zagnZ|Sg$SC6{$_H#hY?N85S`(d!vD@UhFGA;_UKhAb#`WRgO8#8Te0&;^%dX4slZ8 z9Q4d*a_o}4{ikn9p$SyQhsKjYfFxuAaH6fu`Wav0`uQ0T0eIxGN;3Q^G4;sg!$cCG zMe4Sqz!RkIt3Ff_#==Xk&HY!und!q5vWCTHq3<^{ZEem;ygza2x2V}^4pA#094MG= zzh#ks+O+p)`cDx&CAg`%+Y{-b<5UKO%c@DL`+DZzMjyWqI)fjBG5r&U56a5*SAW%B z%r7b^p`sMtT~+s99a!ss~x z2ofAVLgx2mF(B|?^^$+|g6Y2k@V^n~UuCxj*TOVkFufE2|CjWF0aRW5OS$YP(u)J| zQZ)QO(@R#NmyhbT4ZLc44d7MNYXGmBUITcwWHS8^WiW!0h;Ok&00000NkvXXu0mjf D$PlZ| diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/skype.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/skype.com.png deleted file mode 100755 index 881b13cf887002f5c0fd336ee506baa1681d6a63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3435 zcmV-x4V3bUP)XKz-}@WWBZm89N87J~?&lTW`dVos3SWB{0BB03aUl64|A#^^a_w zx}(%TTbv!u#4l`vX0W)}I@~LIp>EmO!8mCF9Ei+JKz-BT*1%#QVkgHZe({$tPdzx5 z*g_9n1T|f}9Y6>%66V0!A}oy-%oM&G5{_vwqSQo%4Z2Ge9e~yHeE3L4gP;B7uUSFn@uwKi;1H z!H%|;md-2$70B6zH((j5>W)qxzj^<{NTp9*W_+7Y)MO8#K+F`ZzPm8>jq3_m_YY-8 z16eC1}x|V(E;H^))e?D|Lc4knr`A!PJ0H^Zf z<0pPN-KtT+%s_yAGhILh-HNWDpvg=UW?qFeq35nw_?07%#*&^5S!AS&__Xp5C+hIM zh*A)%jiyNxhzbHp50c>G3IPOAfx?Lx!PTOS6t{q|@$)a#fuDTtl3&R}qTm`klX{lL z&b@Tv*!BCWRW}G^=QDGtz>M(FShlz6rR8XAi*_X{z+`H#&D)__KU^_*gA;Yq#3aPT zO4JkI87kbhdnmKuRy#mM2w>0Dd=(u+Pn<_pBCwR5CB18V@uL?Mc9)~pL{^`KGj$%A z_CFY@KXjr#S_z0n)(E9Qs_+}{Ib6B4fB2gIiyFw5c3B7^v2f2zkKXsnDf z4bb!UErq|mylqE00zhLRh=zrTKp{>65dbIV{nw7v{_aTCawV^ptwJ+gTRi^wt=mea z9@3U*KmmbelarUjVxgVex|!MCL&Zn-cI+s-)H4eVgnr_-L1U~|d6r#HEMbD<@YEYOJvB=z>;Eu}lQEIfR4L6cP; zKtf`FY9jup7pq^qG6X0|5s5$muD9zooZd={o2pC%^xWN(T-zN7=AKU#IaRX{J~j3H z=@d&L8S%j3`FHgu-@LA4S4WfvIu#?c!1wnj4-Z#`+H42+y^;DK?VK;Smdz-Dl7Q3Q zor93b&Y~>=V7#&`idBt-zyJ~X)^PRt(Ry4IjT_x1qOm-4rhfa+rjA!b5-G_B*yi^ppn!2KlXZLcbp7aDCc1dIW}O6_KRVGrGU;;Uk%$`291YDOTEC>A5m7m^T+XQDI17#-rf z2u68SBN9d?HY1HS%A=aqR6$6DSEtj5PSieiaod8o7$O1{WWfZ|ndqK^+p{70{UKCR zJ2ad9_hk0-vHBBd(qGJFP!)%B(g#F5ef#Ozc5F0IqD4~)wOT6z#TmGk!2l2f!RHRl z?COZG?J1bi8*{3GAQ%YdE88Nuwx@7yPvJ9{w2fB%gKt#7^77nxHAr;U=qlF>eW6y% zeNJ`x13Vf@M6<;t6l1k;+fT>-{*}3Euq4vhsZ)^512iY1B7w+)<$a*!{%mLY$y@t& zZHSqLvq$jxjs`Rm0$u*He0OI#6Ddw6Q@dyX$8pi|(oo@%sjgxAYhHbS0%&LtuVuP9zvVw7K-9 zwrH#xWF7qwphZ%c=c6~4W< z=hHjdEe(+_&ona71V|EL#{W2317wLq^S67Ad?jjN|tAZt&1r z9*3@6s00FU>@5V7S{71IZ~WR-U03xN{X&Rk6|V?rB*Du%mupwX?p-Cd=s1(nrqoaY^LnW?~uL@FfPV|{RM?@(8qEd(wb3oX#s z!iO$u`;D!wM$1V~MXH${oKDd++{&SYwB$hT47g}p0x@uB*QO8j1LkG5stLl$f1aw% zXF*krbRyokqceW|{eyR3S{`gs0YQrd7nP$gU$f!C8+wZ>AY{?7_KnqFoleC`Q*}um z-h^mmq95?fWjB&hq3x4fl1D}=Y1%F;f?Ffh$>E9mH(r_j!tM=q9{{R|58TokJ@D?n z(W-xSHcO2yk?ib9Itz|QW6mj5K`{RHOH&MVDxnz#H6kxEcn@+hmKOnOqBr$zx^v_3 z_lCtq3@ZXJk{aR52POwg?o&e@G|P-C@J50IB{$Hr{4(eK4KNrIClLAUbK_5rR5jM7 zm=_rShL|>+Wxz4&Eu2^D~kJGP6%VefkT}k4LSy7Jl#P(_ejYN+U5ld$yPFploebtSP&Zq-a#H+<)lUAHM9=Vy-60 zMre`Qj_$%IwzuE0rS+0>;@q078URD!k=gW-ElNIP3b) zPE=+6$EM8*L#DsBt@^LmZ;VSlO$y)&7|`9}aR{nidR83@U+DRZM9BG_(RU;a? z(D@PNs-j2|es@z;EOhy0PF#If0S!9P-~YfBrMoW>Lu7%j@vLG^9U&Ojb)Lhz*LA4C zyuYn~{JBHSx{EQ-5SwV{XiLX?Q?OQmQxVaSh1&dNrTWHH<@FlgsM^@fTs>S~W+KOV!+XLYu2 zE4c&!XvJ8rEc3Sp_09|1`g?mrlqd}=RQ?uVVJS6{ywD6~fY0btnk{85A|mPlOwCnZ z9IHG(9S+X;v6)JqS#`FzzM~vpUB;gNa(`Eu#a2ROHKw-=s|miwpTj0iKnp`{}181XC+POwi*Bc N002ovPDHLkV1ju=ilqPm diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/steampowered.com.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/resources/images/services/steampowered.com.png deleted file mode 100755 index de610701022a85be849724c38117e764de40ca5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2697 zcmV;43U>90P)U^x*L z0k{J|DgYfoD}YZJWBVCn2P2V)ex*A9CkRj!g%ME+5k1Zro5&agV8V3J@4FN82h0`N!9`SXK=gLEnV()9@9i^Ab> zC;-YCW3wemf-K7;M3STtVj+kTQNAQesh7)y8=3%{&GvHu_sOyho6R;VcylzfA~r*G zUBAn2x3`AF;kvPG+^}09B_$<)U|`@4S(ceB%ix?3ue96k4iy&{AIr(fX%RxO`uh5` zx88ayHxvrlbzO&5qS0uNqA2%ucXwZiXXl0_AUivob$54f(==^CY^u+iHS5&&?c3k< z`FuS9qQ(@txw+Z<=%bI89zT9O(+J!o0E(i#+}YV#7SGld6TmsY6Tln*=>Q@CK4Xmi zUDx%NFB@O~P$Y?)s;J}M+x4RucH-G^n20H+6M@NTm;lhO* z+uGVDSP5`Coq@aWzI)kw@4Ywbc;uIJMwaEzz@Itivtlc*Au{KDHDl~gs;Z6)37a=><~QGb^Q~sk zW>Eux*|TTY0%!_{!{<5YeT*@UF{W|Odxa3K0Gj5^nNtg3xF{MU%gxQr+PHD!sEi+z z0GG?92qCs`&b?;9@s1$FNG^b%jRyfaIXRq&T%3<|O$dRcq@?D?#>OsHRU@(UBuNT) zbaY%$Rkg+J2Y`!20B~nzWsM?09?KC`RlgmLMzgIev1G}TPuHwj^RcFB($=k8zwzOR zA5P|+L)Uc(A-p9h0M)pXw4;G8^pazb5QU3jdyAAImZSXI>t zLWmKaB4Z3085x?_>*WB%WeHfibSV!8gNx6cIWxS<%a<=dwrkg}HvohIuoWv-oVfSi zd)FU7emv7K!utFBf9dgfR`&Gt415U=SX*1$1nVD663WZV7xnk|A02Drv17-mzP^4@ zECB#SW@ctfOUvkb9d`?ql$6+-nwlnCSO1Ym9ytV{8New3r&LuvS6W(n#QF??EM3=s zarH4@L}zCwtEs8U0YuK>gr~WHMgRoqHzEI{VU9jG3EB#Z$F)$p5B*| zk}|3-j!VGYxpNhp%_doU?r1dHrD?Nz&PiKMx!fLRsG=? zC7`;xdh&@AC-O}KtovCAAqN71Ke*lQ@7wKmyE#WyRhP%(`9Vud%N8QyR?-0A!3Q5a z3?OW`+pmlOkH;hD=H{NWrqPxyTjrOSm-l36XKU%{>4WdS`)+8*jvey=43lJ%Ktzu# zit>!jW>c;v_>7E<2^AF;zagR#ExL6z0oWsv$WMh3H8z`Vx6Nkz3laS@5{dj6fMSwm z!teLDty#0?kfv#a9*<`f0i*5$9UUFa<#O43dwXv=c<|soCJATHo}F~`=+WtZzdtf@ z;>2lHRaH;7x3}MECBTGHyzU~RC5*9F&iR>G$6{f(+rJqKg?>*&U$gf2v9Rc|0q}9o zeP+)P=e8(bdF7Q?r%s*v@4>;r4v)tZjnx;o6C4;AaEHU;=>-J^FSWO~r^GQn>PiY= zIPHv60lKc6EB84O9RTnNhU!Q!02hE;8Dn=a#uhNfrdp3%Ns>nBwx+d3?+9P4#4*O` z*=L`vdhD^s_6Q+Pg~Q=ahr==A1h^Cds@-nC?fv)PFIu%~)dpSHZKknUqt^4<>SU~p zl>xEaC-!P<)os-uj{q}xyWOt6@WKmKrKP2Z0i20MA}xxdXz}dFtpTzuM~JAasHo_8 zWo6~7KA*448vK<6VwKpSE+_Hc_*nH@+uRtvV(HSQpBz4X_@&a)(jx$xbzN_hBx%gv zVa&^ruIno2{1yO{dV70)J9qA!v3Kv@=_gN~OjcD@pFVwhdqF`#b6#HFxwN#j3yPvd z`uqDG!C)}Cwzf9oop;`u76=4<)&drfKqDxzV8Mb0zu(_eTU(nI30QdnU z15j}>YXpX_qo$bpWDFH3xw^VK>$&HiTUb+5lWh&c{LC1Gq9~E7s;cruixvd{h)5(N zZ`iQmfy&CtS+SWwL{wZ{{I7NE*450IF{6bsMur~(LpRhAfGz-S06K|ikaK>?>U+uS zFcC2T3IGoPF95gkoeYD6hC~b}B;$7nfF$F2=WDOMcF$8!J@uWz!NF0-;zJKTbhxan ztP(@376st!?d_d7Wy+LiG))`6U~$g%va+(ul9G~-F?0loQzOU5$}gSd%n*RCCyHf`GZ;^N}9eSLkyL780| zfPk*+?Es>TF{j(@4yC1~oo{Sx%rrA#{rdI)C@Cp93ZNap1pxg<@VX&UWBwJt62GP( zB1S|C5hW8*4iU}YyLazTl9H0@T`pIH%jIftI-LyFJ!zco0W&W8K%zyD1lx+@xudURbM*TAm} ziB)O~7zr6rA&;oby&)*S}6gnbzW0QBm=`;^N}Jb#-;MCMPG4 zYl>gDG!jBEB1+<%Pdaqy(6^Q?Ted;hbvd@d0x(?p8Dl6cEc|rezJ0&aH0_kb;piD} zzb^YuaNG=WPDB(UqSnH~!eiUEZF`e*9tB1>SmyVt0DM z_25ytAxGrRNh@>&!{=?8G0h|UTjI%QeDqI3Of@s%7ULI}nf zb71J-+c#mTUr;c#C8HSX=sE$k5mC3fRjviTva{4U$IXVxg^L83U0n!(#uyv3j~@@* z5X}S;aa=6O1V9*FXaWf&kU#*`5Dik00udUMf)N!WFI5v0^~uDT;FB-Lzd+yRP2-bb ze5t<@iJEAF(F7!bu!5JVefiwZB3Zw{-geM@`Dgd@5y#z>j4W#pc zR0UEMNL3)|Dv*{yN`e5^*Pp}m)bcDc9(fcsJq4F8F5TDmT`>D6>ddKlhM5dz^LAuy z2iTc#1n4h5L64qZmIS!3ypA3nLI3#u(tXu8!sIyiNAJfJc#YIIB5mz>`-YHBTalHk z7AHY9If44^{PN)H+6-KoTo!*admTM<^{#xWv2$?d6zbAA-hmhJ2KFG$t#=~e9&a~q zppPGe!YxEwc!N(tHkUjV&?6_XvN@!=1@qY8!V)NDKx$VYt8)LeG6v=fsJTL=N6SVW z$CqHlwh2-fS+Nqd6_L!UkRV@8t>D~O`Y~64+3TqM4gVzk{1aAJFXrLRNH&KoM1Z$t z2h!Mb2YmAA3!|v9Un@J#<}h9Bk=1J|&(${tj>+`zL{?^_aX`!csPm(Xp7-`Xi)mk1 zs`=?D^y!o6Gbd3qS1UOoKZ`m$f;x2^8Q230x5eGp-mEm3oFMbzduYD|badgq_$uBL z`zr0u{Q^ga7Y(}j#@m>l4bkCy?Ayf?u=^Rj{+)mKefbjB@L{SBy$i*n&zQ#1qa&Ds z-GHFwHduoW-#Zg{NFcRH%!3%dO!I2oeM1z7UItyc*ws^4(7#_OUvGy-N`wevHs|0= z;5d=4ojdqev<#GQu}12f@CKhIbL0abhXuHqFWcF&qzw4qYZV6Ri(}EX{Q9+E67-9~ zaWHE;{UZ?p6~-sq#G!HGKu^yQ5@=597DxFU_rZo!#Xa z0}-Gi@l$*R*qF~G9)!`28i7a)2(CzF-H8xX- zT(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<)=5M`RCwC#+G~iEWfTYS-`HB_7S(oBvUbQY7l~tu%y&t zzb1ZOf#qmTF{wOP1Bo0?#2I-cHew!za&ycllEImIpJ#_#C#OK96IZ2RCmY`B#1uS& z=LS9rJFptJU~P>r&)}YvJUbZnx^PPT?!sao$rKqp4Xf~Ao@=YY$v7t^BI9v> zkoX&O!bATd(vNK=3>=8ZBENT3`SKY>l1jbkkMMf8*kaFOT^R!x;A6ZI_m$w7lu3LS zh4k&=T9kJxG&UD&q9)uNd4AaHn<5q#Td##LSrLq^a?D)JLoAE35kFd?8H0Nx&?l+f_-ij8Y9vq6(!dn-mNCNuG5ji@t zz^!-|Pv-iVQHHJMLTd-k!_{%Wu}Ih1Z0y38avs@h(50^zt$w33L zTYR`w0UBZKj6FzAy4J*K-DkwQ+1zAr{9H}1m5(`?kKb`X)RtyoH=d|O6exuca2RId zEF9buVX@QpIyKCDQ5j(i69HSQ)mr)~ljS!XEr7ktJIt;&r=3TkQxj zA#Lo5HfTXKtLh~(JsQMz$%)dqP(m7c#@LOA)Gm$}T_dX_8!d_j-PS-7U*aao+2Pu> zjOI_a506I(-57D3)`?XgUXuuT=i+50gtmG^DUenY-wZ#Etj>vk85!xfhj>|YJ^`dd+m+M_r|`Zr_mEHL}u(uHDg4^i2Of@{4)TT WU&sEBduajy0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf2(?K>K~!i%?U`F_ zlvNPNeeuCJRJ$IcT-V7a2-IPH~^sK%a>bw{`~op zOeRg%om3PM6veGZjT$X0R;-Zb=4Jyxd)>Nq=}{u>?d=vf0M7>Jd7jOI`KAvSrQOld zksj4GDhddMCB}>yV{t)D;8L_}YHF;X-$jcSnH&aic0A3RHQVNr9FQ+qu)xL@8(&2O zK^a^LMhUEeBH?h@7$t`d8*cKEBS#wJeh?s$1DqJc5|bxSmXeYZS-*b0jp-^C4Fng! zolp>^Py%;@NCr;P^70DHa)6@kMWbegY#>tzJ2>lNf@_+`DU&I!hF_QyLPRu(N+3e zKwO-l05Rd{Uk8M=ic6rt;>C;8(*J?_<>>Q94e%v3e17 zJYs|-`}GsK>MHy7b4EUBkbNhH4U^cUNzyT4f<(ucrq+AzSz9|Yd$#Qt+pu2ZCr@?? zs8b+zYE!4$rpdvB^RnE0bEoVL86xcu+%J)P?=$exDN`i&{BshWHB-Eq)9ttQ_17f+ z<^nr3fHKA`nuqcN!Muq_CrWa_0MYbf%xU^Lm%{lNFjx;ju_vA|3nX89QR0ghN^FT* zedPzz_~klj`tDn4Q%^|Dn=4684CcZC6bJ-UdTZ8Xl#LG@7|4Zyacg9c%>a7%A&EZz zSjt^hX{-UD(CUw*VbeD$K+~p4BKTQBUwOAD_5ps$~P971^?*L7Wl*l7UD1yi{G~2 zq{a$*<)UEMA_Z!EV3F9+l9XBXMVQ>N!}=*|-uK^|jFSrr_Kd*O0tAMOSq zb2*fsGsj#G_lq4#{c*!j!NIP1oy9E3*@$1#r!K7TTOq}) z?_KL})b+zU*SQ>Vl-RW^rJ#=jfy8tI3lsu`ap9kTwi74!vpH!KA||5OUYh~Zx_`g4 zpU_)@5`XwcVfFw#2f@0I!gY0)B=W1ELC|7?uG@XyZm(2Ul`H zAd5YfdB6T*Z98Gz12^r^izZ;>Uwn~C4y}9lnk5*6+a)$^Fu9-pQ6Ovf#xk4K~b;|boR{-JE9T5I{ z30sX)#;xqx&=XxN9}ox&Sv98!Dsv-tWuT~FC;f(Qy;a(EGK#?zDk`l5(o$NQDqcD+ z14Q2ujRUSZ4G6`JOk{OLV}!OJ2sH&FMp|whXnc6=15#W1u*DF15Ic68$U%WXD2N0c zn}#$vjn%Y%AjsG#8%RUnzS5FDIRm0&GC;H-(r%pmxb^d@M8WJ}=O6&reB`irk+2n2 z=AeU1%YF)WEj_8m+ix?aSlAZl8wJupsL;pz^pO*qE&*cy+2xjd&)pJ9XB>bqj~gsR z`u$x`m)kT%x;5aqtWt|+vEPOcl{y|@EzNe@rNY-;dYS3dxXN~o=#nL)C#=*Q$2n523;wBXrUzphlt{l)`4vrsZ zfylR$S81G}2y%c`>FJ?F^__R5`nAnG#$iDoSoCMF0W+R;=x0v(rI(oer}NLVL+tXy z3gQ&^UVM=;3&Pg!eZK6y@PgCj+GaB+x8L+Q*PofEY-6?U=KI%iYdJY>7gxC`FA#2@ zoX`(vpDnx2J@>$whgAKm;Bp-g3@4wjjSjytP-aE_1GR9J~E?>i#a7 z1W~6zAcD63(@&)8<@r*sFEz((z)3m&S}XWhy?YnTKWKbp&u6{t_1Uj>&1& - - - - - - - {{ErrorTitle}} - - - -
- {{ErrorHeader}} -
-
-
-
- {{ErrorDesc}} -
-
- -
- - \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Error.html b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Error.html deleted file mode 100755 index 50d5719b..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Error.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - {{ErrorTitle}} - - - -
- {{ErrorHeader}} -
-
-
-
- {{ErrorDesc}} -
-
-
-
- {{BackLink}} -
-
- - \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Index.html b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Index.html deleted file mode 100755 index e13fe479..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Index.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - {{BaseContentSecurityPolicy}} - - {{BaseAppFaviconPngLinkTag}} - {{BaseAppFaviconTouchLinkTag}} - - - - - -
-
- - - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Social.html b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Social.html deleted file mode 100755 index 2aac940f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Social.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - {{RefreshMeta}} - - - - - - - - - - {{Script}} - - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Themes/template.less b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Themes/template.less deleted file mode 100755 index b4ebb2ab..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Themes/template.less +++ /dev/null @@ -1,357 +0,0 @@ - -// mixins +++ -.thm-linear-gradient-mixin(@start, @end) when (iscolor(@start)) and (iscolor(@end)) { - background-color: mix(@start, @end, 60%) !important; - background-image: -moz-linear-gradient(top, @start, @end) !important; // FF 3.6+ - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@start), to(@end)) !important; // Safari 4+, Chrome 2+ - background-image: -webkit-linear-gradient(top, @start, @end) !important; // Safari 5.1+, Chrome 10+ - background-image: -o-linear-gradient(top, @start, @end !important); // Opera 11.10 - background-image: linear-gradient(to bottom, @start, @end) !important; // Standard, IE10 - background-repeat: repeat-x !important; - filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start),argb(@end))) !important; // IE9 and down -} - -.thm-border-radius(@radius) when (ispixel(@radius)) { - -webkit-border-radius: @radius !important; - -moz-border-radius: @radius !important; - border-radius: @radius !important; -} - -.thm-box-shadow(@shadow) { - -webkit-box-shadow: @shadow !important; - -moz-box-shadow: @shadow !important; - box-shadow: @shadow !important; -} -.thm-body-background-image(@value) when (isstring(@value)) { - background-image: url("@{base}@{value}") !important; -} -.thm-body-background-image(@value) when not (isstring(@value)) { - background-image: @value !important; -} -.thm-rgba-background-color(@simple, @rgba) when (@rgba = false) { - background-color: @simple !important; -} -.thm-rgba-background-color(@simple, @rgba) when not (@rgba = false) { - background-color: @simple !important; - background-color: @rgba !important; -} -// --- mixins - -.thm-body { - color: @main-color; - background-color: @main-background-color; - background-size: @main-background-size; - .thm-body-background-image(@main-background-image); -} - -.thm-loading { - color: @loading-color !important; - text-shadow: @loading-text-shadow !important; - - .e-spinner .e-bounce { - background-color: @loading-color !important; - } -} - -.thm-login-desc .desc { - color: @loading-color !important; - text-shadow: @loading-text-shadow !important; -} - -.thm-login { - border: @login-border !important; - .thm-rgba-background-color(@login-background-color, @login-rgba-background-color); - .thm-linear-gradient-mixin(@login-gradient-start, @login-gradient-end); - .thm-border-radius(@login-border-radius); - .thm-box-shadow(@login-box-shadow); - - &.submitting-pane.submitting { - &:before{ - background: @spinner-background; - .thm-border-radius(@login-border-radius); - } - &:after{ - border-top-color: @spinner-color; - } - } -} - -.thm-login-text { - color: @login-color !important; - - .legend, .e-checkbox-icon, .g-ui-link, .social-button, .language-button { - color: @login-color !important; - } -} - -.thm-powered, .thm-mobile-switcher { - color: @powered-color; - a { - color: @powered-color; - &:hover { - color: lighten(@powered-color, 20%); - } - } -} - -.thm-languages { - color: @languages-color; - .flag-name { - color: @languages-color; - border-color: @languages-color; - } -} - -.g-ui-menu { - color: @dropdown-menu-color !important; - background-color: @dropdown-menu-background-color !important; -} - -.g-ui-menu .e-item > .e-link { - color: @dropdown-menu-color !important; - background-color: @dropdown-menu-background-color !important; - - > i { - color: @dropdown-menu-color !important; - } -} - -.g-ui-menu .e-item.selected > .e-link { - background-color: @dropdown-menu-selected-background-color !important; -} - -.g-ui-menu .e-item > .e-link:hover, .g-ui-menu .e-item > .e-link:focus { - color: @dropdown-menu-hover-color !important; - background-color: @dropdown-menu-hover-background-color !important; - - > i { - color: @dropdown-menu-hover-color !important; - } -} - -.g-ui-menu .e-item.disabled > .e-link, .g-ui-menu .e-item.disabled > .e-link:hover { - color: @dropdown-menu-disabled-color !important; - background-color: @dropdown-menu-background-color !important; - - > i { - color: @dropdown-menu-disabled-color !important; - } -} - -.thm-message-list-top-toolbar, .thm-message-list-bottom-toolbar { - .thm-rgba-background-color(@message-list-toolbar-background-color, @message-list-toolbar-rgba-background-color); - .thm-linear-gradient-mixin(@message-list-toolbar-gradient-start, @message-list-toolbar-gradient-end); -} - -.thm-folders .e-link { - - color: @folders-disabled-color !important; - - &.selectable { - color: @folders-color !important; - } - - &.selectable:hover { - color: @folders-hover-color !important; - .thm-rgba-background-color(@folders-hover-background-color, @folders-hover-rgba-background-color); - } - - &.selectable.selected { - color: @folders-selected-color !important; - .thm-rgba-background-color(@folders-selected-background-color, @folders-selected-rgba-background-color); - } - - &.focused { - color: @folders-focused-color !important; - .thm-rgba-background-color(@folders-focused-background-color, @folders-focused-rgba-background-color); - } - - &.selectable.droppableHover { - color: @folders-drop-color !important; - .thm-rgba-background-color(@folders-drop-background-color, @folders-drop-rgba-background-color); - } -} - -.thm-settings-menu .e-item { - - .e-link { - color: @settings-menu-disabled-color !important; - } - - &.selectable .e-link { - color: @settings-menu-color !important; - } - - &.selectable:hover .e-link { - .thm-rgba-background-color(@settings-menu-hover-background-color, @settings-menu-hover-rgba-background-color); - color: @settings-menu-hover-color !important; - } - - &.selectable.selected .e-link { - .thm-rgba-background-color(@settings-menu-selected-background-color, @settings-menu-selected-rgba-background-color); - color: @settings-menu-selected-color !important; - } -} - -.thm-message-view-background-color { - .thm-rgba-background-color(@message-background-color, @message-rgba-background-color); -} - -#rl-app{ - display: block; -} - -html.no-css { - - margin: 0; - padding: 0; - font-family: Arial, Verdana, Geneva, sans-serif; - - body { - margin: 0; - padding: 0; - } - - #rl-loading, #rl-loading-error { - position: absolute; - font-size: 30px; - line-height: 130%; - top: 50%; - width: 100%; - height: 65px; - margin: 0; - margin-top: -60px; - background-color: transparent; - text-align: center; - color: #333; - } - - .progressjs-container { - display: none; - } - - .thm-body { - color: #333; - background-color: #aaa; - background-image: none; - } - - .thm-loading { - color: #333 !important; - text-shadow: none !important; - - .e-spinner .e-bounce { - display: none !important; - } - } - - .thm-login-desc .desc { - color: #333 !important; - text-shadow: none !important; - } -} - -// glass style -html.glass { - - @glass-color: #fff !important; - @glass-p-color: #aaa !important; - @glass-error-color: #f76260 !important; - @glass-m-color: rgba(255, 255, 255, .8) !important; - - .thm-login { - background: none !important; - background: rgba(0, 0, 0, .5) !important; - box-shadow: none !important; - - border: none !important; - border: 1px solid rgba(255, 255, 255, .2) !important; - - .controls { - .input-append .add-on i { - color: @glass-m-color; - text-shadow: none !important; - outline: none !important; - box-shadow: none !important; - } - - input { - border: 1px solid none !important; - background: none !important; - outline: none !important; - text-shadow: none !important; - box-shadow: none !important; - - color: @glass-color; - border-color: @glass-m-color; - - &::-webkit-input-placeholder { - color: @glass-color; - text-shadow: none !important; - } - &::-moz-placeholder { - color: @glass-color; - text-shadow: none !important; - } - &:-moz-placeholder { - color: @glass-color; - text-shadow: none !important; - } - &:-ms-input-placeholder { - color: @glass-color; - text-shadow: none !important; - } - &:input-placeholder { - color: @glass-color; - text-shadow: none !important; - } - &:placeholder { - color: @glass-color; - text-shadow: none !important; - } - - &:focus, &:hover { - border-color: @glass-color; - } - } - .btn { - border: 1px solid none !important; - background: none !important; - outline: none !important; - text-shadow: none !important; - box-shadow: none !important; - - color: @glass-color; - border-color: @glass-m-color; - - text-transform: uppercase; - font-size: 13px; - - &:hover, &:active{ - border-color: @glass-color; - } - } - - &.error { - .input-append .add-on i { - color: @glass-error-color; - } - - input { - color: @glass-error-color; - border-color: @glass-error-color; - } - } - } - } - - .thm-login-text { - color: @glass-m-color; - text-shadow: none !important; - - .legend, .e-checkbox-icon, .g-ui-link, .social-button, .language-button { - color: @glass-m-color; - text-shadow: none !important; - } - } -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Themes/values.less b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Themes/values.less deleted file mode 100755 index 32043ece..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Themes/values.less +++ /dev/null @@ -1,69 +0,0 @@ - -// MAIN -@main-color: #333; -@main-background-color: #e3e3e3; -@main-background-image: none; // "images/background.png" -@main-background-size: inherit; - -// LOADING -@loading-color: #000; // #ddd -@loading-text-shadow: none; // 0px 1px 0px rgba(0, 0, 0, 0.5); - -// LOGIN -@login-color: #555; -@login-background-color: #eee; -@login-rgba-background-color: false; // rgba(0,0,0,0.7) -@login-box-shadow: none; // 0px 2px 10px rgba(0,0,0,0.5) -@login-border: 1px solid #ccc; -@login-border-radius: 7px; -@login-gradient-start: none; // #f4f4f4 -@login-gradient-end: none; // #dfdfdf -@powered-color: #333; -@languages-color: #333; - -@spinner-background: rgba(0,0,0,.3); -@spinner-color: #fff; - -// MENU -@dropdown-menu-color: #333; -@dropdown-menu-background-color: #fff; -@dropdown-menu-hover-background-color: #444; -@dropdown-menu-hover-color: #eee; -@dropdown-menu-disabled-color: #999; -@dropdown-menu-selected-background-color: #eee; - -// FOLDERS -@folders-color: #333; -@folders-disabled-color: #666; -@folders-selected-color: #eee; -@folders-selected-background-color: #333; -@folders-selected-rgba-background-color: false; -@folders-focused-color: #eee; -@folders-focused-background-color: #333; -@folders-focused-rgba-background-color: false; -@folders-hover-color: #eee; -@folders-hover-background-color: #333; -@folders-hover-rgba-background-color: false; -@folders-drop-color: #eee; -@folders-drop-background-color: #333; -@folders-drop-rgba-background-color: false; - -// SETTINGS -@settings-menu-color: #333; -@settings-menu-disabled-color: #666; -@settings-menu-selected-color: #eee; -@settings-menu-selected-background-color: #333; -@settings-menu-selected-rgba-background-color: false; -@settings-menu-hover-color: #eee; -@settings-menu-hover-background-color: #333; -@settings-menu-hover-rgba-background-color: false; - -// MESSAGE LIST -@message-list-toolbar-background-color: #eee; -@message-list-toolbar-rgba-background-color: false; -@message-list-toolbar-gradient-start: none; // #f4f4f4 -@message-list-toolbar-gradient-end: none; // #dfdfdf - -// MESSAGE -@message-background-color: #fff; -@message-rgba-background-color: false; diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminLogin.html b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminLogin.html deleted file mode 100755 index db784c2a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/Admin/AdminLogin.html +++ /dev/null @@ -1,50 +0,0 @@ - \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsThemes.html b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsThemes.html deleted file mode 100755 index cc86478e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SettingsThemes.html +++ /dev/null @@ -1,44 +0,0 @@ -
-
-
- -    -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- - - -     - -
- -
-
-
\ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SystemDropDown.html b/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SystemDropDown.html deleted file mode 100755 index ec7e2d41..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/app/templates/Views/User/SystemDropDown.html +++ /dev/null @@ -1,101 +0,0 @@ -
-
-
- -
-
-
-
-
-
-
- -
- -
- -
- -
-
-
\ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/check.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/check.php deleted file mode 100755 index b389b812..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/check.php +++ /dev/null @@ -1,42 +0,0 @@ - function_exists('curl_init'), - 'iconv' => function_exists('iconv'), - 'json' => function_exists('json_decode'), - 'DateTime' => class_exists('DateTime') && class_exists('DateTimeZone'), - 'libxml' => function_exists('libxml_use_internal_errors'), - 'dom' => class_exists('DOMDocument'), - 'Zlib' => function_exists('gzopen') || function_exists('gzopen64'), - 'PCRE' => function_exists('preg_replace'), - 'SPL' => function_exists('spl_autoload_register') - ); - - if (version_compare(PHP_VERSION, '5.4.0', '<')) - { - echo '

'; - echo '[301] Your PHP version ('.PHP_VERSION.') is lower than the minimal required 5.4.0!'; - echo '

'; - exit(301); - } - - if (in_array(false, $aRequirements)) - { - echo '

'; - echo '[302] The following PHP extensions are not available in your PHP configuration!'; - echo '

    '; - - foreach ($aRequirements as $sKey => $bValue) - { - if (!$bValue) - { - echo '
  • '.$sKey.'
  • '; - } - } - - echo '
'; - exit(302); - } - } diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/include.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/include.php deleted file mode 100755 index 5b51731d..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/include.php +++ /dev/null @@ -1,234 +0,0 @@ - 'localhost' !== $sClearedSiteName? 'imap.'.$sClearedSiteName : $sClearedSiteName, -// 'IMAP_PORT' => '993', -// 'SMTP_HOST' => 'localhost' !== $sClearedSiteName? 'smtp.'.$sClearedSiteName : $sClearedSiteName, -// 'SMTP_PORT' => '465' -// ))); -// } -// -// unset($sConfigTemplate); -// } - - unset($aFiles, $sFile, $sNewFileName, $sNewFile); - } - } - } - - unset($sSalt, $sData, $sInstalled, $sPrivateDataFolderInternalName); - } - - include APP_VERSION_ROOT_PATH.'app/handle.php'; - - if (defined('RAINLOOP_EXIT_ON_END') && RAINLOOP_EXIT_ON_END) - { - exit(0); - } - } diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/index.php b/copper-server/core/rainloop/app/rainloop/v/1.12.0/index.php deleted file mode 100755 index e69de29b..00000000 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/index.php.root b/copper-server/core/rainloop/app/rainloop/v/1.12.0/index.php.root deleted file mode 100755 index 91bc1257..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/index.php.root +++ /dev/null @@ -1,19 +0,0 @@ -uS?sB&YJIOH^?kF&1iOgZGdmnmz))8{a1 zmIX?_q7nf^m2)?XFv?2q(TW+m($Fy7y1_(yQwCiX^l*2V&dgk-rN~SF;fLabq<{hE z-`gEq>RWg`4#FX6ntSDDg#m{1|8Ux5{X%*%HL z>O0{d9*dnf+ce{r*#pix13lYx{oDH7MpeD|Uk5`Z!|j_zuXdDfynR37r(CX_!Iy?} zTRAhG`rMZPK)=ymInkllq)q9#$4_;bS>ZjDuhpJ)L@h>M7-nZ~nBAz&E(S_`%R7c@xuc*9L`N+7(25A`>FE%Vol zup9X@3%5^VD%G|lTT7{?Q*zF)@bUnuKoxnGK}P(OL&NOZ#j0!~lbbaF#ZWFpzwd5u zDpiwk7-8uC0kvFKhWT6p@_qD--V>4CX=?H_jx@cNC2ALn#n4gJD+h%i1F2#ftwDJhGKpnu% z+`IP5Myd^~0{E@F4BfX%ptQaUq;_JQ0wGhfz!95B8b-6N7@}F=|}Q8B58CetO0J|zp{Dj(y3-dQI^|X#&Tr=MwAUdRY>}iZ4Z8o^9px! zLyY|%Xdz9GTu{j7^u*eUt8>ydu&(50ek7CSc7;Dc5i*g z>V$8bSfef>*TCeF#S;c!HTADOZt@0_l0B}ZIt@e6bJ%V!YjDKeOB+tE){I9kL(l4CdS%X5o?O$aHRJUT(~76t zT~I)Eyj&CCyjeEa)u-z-mD7ibb6L`B;raGx^*LJU(eeK93b-rvOq#b3OM#wQ zLi$TD=_ECx>vJ;mms(TXwxauguOTEt3cI1tXm@J;qgiz)pXt)Sb^)kJ!(#R`8O<-< z#MT}AY)Z>vKk3onS(4w}AKJ5Lx_jl6ODCK<0EJx@Xf+TP&}+^oMt`2LY6X-)M#Cd2 zVU;GTzbESOZv2aAuA?3jJEvSDIT1Qo zwl#0j=_qbqE~P^5hX`tnahSskr{etsRRYd$(8GS&(?$4A-i&iAt-5BR=66&yb6U*C zYb@uXMxf}N$$@EFiJ(_ZMEIzE7im_^0y_68XUO^?QYlZPvdFE~a1H}<2aUP`Bb|wd zaBz+eB|{hC;ZakP0iodjqqN7$&tVpR{gtg1asv)yu9gRPj|%UX^dYo2_%~r_?`>bI z@%dh*XdCqmrWSWVf4<)&dIroQWLI;ItHb}J%!Wmx%@fy?iVqlSRc1Hk=2q!~GqoA4 zG{i8rRAe@2qHKuUh+Rh|W}B)v=dgmmHmNQ2l}LgR(CRDuCA5ZbeCl-q;n17Y)_+Jz)iLv8F~z4P?^T2w zPw1f!WituWOb4J@b^Url%%rG1h~_wTViRt}f9TeAijchE%RjgHxz)k>|Nuc=U)Zlk#Q`l0!-&p7_QU~8{eMmTF91LCmqDk}z1I&MPA4MMs&uyLB z5f=m9l;HCO1Zy~6%D9^;DqH-|XcQ-}*_vSNatU1i{tUoO!c?#x?4CtvEJb+H(y0wX zUM&72r;(-!2Wdpd?hAQUko^xlzI=ST=P%zG$WP z+})ItQuQN>-rmMQ!ZF>pSh`@$U{H`llS0Tvv6a}5g$auHQcrq*W=T}RrnG@S?;f3H zdOiNC^zF~Y@gHxh&5z-z--iiSVqV z&mviGj$yEFBPVKKv8Ym2&3-2P2k3`(#YN^yH?j#TtU36p-^v!p;3>6LGpa+_Ss6Y@b%d=Pl7m1PjsjXIFN6Q(PPKy;Q3^jjyR`B`N*vv2UO~Y&x51NT&x0|pY znx_z5Td_JsxJL6d`m({tv8Yn5Z4aR@--rT6Id<6B2C-Ag`_$7ZX9)+^rHBJM%HF$A z44Tq)v7THE5uQT)DIYkhl~Vo9MHA+bE4?TWJr^_}*5PVGZH6QI_`owAvBXH(MiSEw zN2^F_M{YIk8;DEbKo6%2*H7nB(Y(@M5t7L%trgb~Oj^TsyYi5XJhk!GI2sz&*v@}| z$^8(~gHvVovxVi_f*v$*Qd{#}vvr?4(gV{d)JXrcSIKlA(pM{{QDL`K z1@R6oXYssZ+^9E_->60~w1Mhaqk(>zB-&U_hnoqZeXmc}4Y*m5%#qO`3SH0#38hri z_SNLbETu97*DdZFnO<$><UGqLC4V9hGNRZ}d1KQ0$xzIwR6bAC z{F^fER*_7g^OFL~!DuG_xw4Ob))pcOrzC3}6IIOH268J@$a`C0;jR3yyDA(ht&N1o^g9ynoPfNV3VAne`B^fq#wjpM zjlNvJTEi5g6VD_cxIok3qp^eW0N$l=Q=C=mUKw}r;k1yLdbwe&1T_`4g;>bxk*w(N z#E^$m&q%zZk%pA)N!Dqd289hJS9F0gc%CKJLyrR>K?1|H6%1PP*9F{I>(z)X(|ECy zoV>$orrEu6?Nv<+;8${m!j1#}gBVbNz5WG>CT}-y{6hU5R7$UzcOmU?l!VOzN_-@CQk0IZVkq?sse%WXNapI4dczu)TP`hIL;soMnQV`zNW5=>j%NL7_G@R4iyl0OiznwmvQ)}GeZL$D77}M-G@WsZ zuTjqkZ_NYRjtad%I6RiLCdecHfqH2=_Zt$6&TG`Ji{KcN&-#=nt zHC+KF#ERMD4I>5L>|x#SlX2gvujZ0lJ3VE;@@bKX0SoXbXvBZfWn6eC$rA<%bZ|oT?B-Jr3*|H~E zPOjFrYDw3JdOU#fj4Zl1njT*-CU(EZUQ|-4@S1}+o8osOCe%gE;-yD+7mgy&CNYVF zq1c8%+3EI`I2rudj~G6ukm9~w^J*@|eGTH2P-AghiMqG0`&^};|FG)ArX1lE?~HUo zicyj8tOrhQjKv?6H1@8Ps>|0qYA#3RX(Ti~IgTnC{|rs+N4}#dubB}fY~71PuZl*m zr-QrIoy)1%A4?~?ycBIN7!%o{MwL!QCM=Ef{>*t!)>;lLT<++9VACLg-J$MP_;Vmp zdVK8F0X<)#jeeEgFKN^8J$W0@QO$uQMJj9^9RH(oAy3`2VNh}5DGWAc1GLPpl*v6} zSU>(9bl&x4RpZgAFxZRMc~ zoE2QzulDv@P0IP$trnA2=#9`1vRm!BA}E579Fovdx{7tD%veX&pZ{%`fPgtZsPGm zU+`o3g8ni5y^4SEaDy%Qi}cmx9jcIZju_I@UDmjNlm{pj&){jGt`OlQ z7n)EbUlUQBe^)*maF_LRR!1hnir)ve*VEniWppKxbeOFcGY>k#qt^onp_t$Wy=fO9 zK__+7%IxqQrQ3z~X(J;_iELc@ip90VCd2R{AEIp!A*pLP(pdyo7n51T|3$lXH$k2X zS*WXN#Egl$$96=fT~C%ww*J&aNFT7kKDAvt?O z&>q)wJ_H5r^U8;e6pfhAPCle?lgAWqdW+4cmGa=dpi|8K!ty&iB-tGP!JBM?Xt;%p zS!*|7vPr+CKE{~spbIWk!ewA8IXri^rEqp0cXD-hQ0oV;5*3h_P+>n6>DNe2r--bERWqK8Rl`kVEsI}D{ zDB=A;k&VPuca7Wi*A3@9j7gilRrm>v`hqXN&caYd$3;T4;}&i%ew0gC;6hRNhZ^aN zmsYcB(O1Ds{5+;X30#)8g$M6xUMqdEXei{cR4Z}lWq7|X@(4Pw5>tv`_Ryp%nDC!g z_wQRO{CvyUIO+*~|F<#KwQYvp*gc(iFh`e;i|opT!wgFmdM-l$9*X8sa!-v7f%u>= zO^NzI_$WM!dxm{?iNBg}GS?V4ID?nMD8FCH9$Iu(48hI}a-mjCZp^^0J){)jW_bfK zSCf}XT`_RFw-p_sD0VvelHvU8GtI?ZWi{KpS6GobblO9(KbntsD0SJ}#sW=ZMhm%L>Cdt!AbK-~JT+)lVhQ0OD;L7X0ni zd2lrz(r?YQxqjirI8cku-`6CV=I_b+JGX@}zfVKFbk_=4z?+?jtF1?XQNwLaE1q{I zpPVuKs^3hQR@efH&RQ!~We}XfR)YRQ%t-uT;|} zZ$~L4t#hs|jDzfz@-hETNK&R;HQ!^Az6ty9!`l@m9Ljl*1#l?<8TH4Sj}RiE8O=Ia<`?w9Yd zA@}}!(*Mty|NoR;Rtgdiij#7$tG+$<^K`*0z@e5_yavAckmq>H`z57YL2A2vZKIVg zMH4%!)Uzk!zUa@JujYVqmWQBgWDBj!{I961d_iF=xzs667A1ZSfQ~@XqvYKo79(ax zlp$a<->DyS8K}$yS`WCF1@)EU0xOl8Au4>QDILV*-~h!Rz+`e|Ptl3VY+1Uu+vu3R z)ceQ_;#vI8GJ=InegHPEr*;oz|494TM#kNXF`9=C-(Ch~g?`z^gYhG#W#p?-!wqw7k5n2o-LI+dd*8hy&_3|ihP0fM^ z?J?cmTf!l@B<;SRQX`_smyGFbOAu)yo8Pbw5_>is@hLYABV4u|dy3q|Y&RZOJG{>D zmAtzYdY;y;Xqo53`5k1_mTs4u^m5@MxQ9wZM(({00{j&$`)t~zUtr++5kzah4p!|r zqNx(?HKLuq$|;p5@vovCSR!xm_E-v`@b9uRA3K=Lez#6Sr6m3z{%Do##LLoLQ*nRN z?C9I9@TPxrP1odv);vl$bXOcrs3d#Y5PA zL-ShJ7 z*;aGV<@2Cnacbl4mSM;bix6(A9i*18Ni;lK=n! diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/apple-touch-icon.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/apple-touch-icon.png deleted file mode 100755 index ce1dd1a886c906ec36cee1dec72b9df605886f02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 832 zcmV-G1Hb%k7RCwC#n$brDK^(`2<+!Jah`6UC zB6^C5h=@4)4|jR5=a_ zzRF^}svNfv^ZdeBqWN>ez`6O3CP!Ob6K4KgljDGB{)*sTz z^!1_w(9GG-TyfDP!Xo{00A?<4KW=CfaL&!$~?mW93ud- z3_)ie1;GE|1Obpm2w~>A#vwlZ0OULT3;~cO2o&>Dvk;$t01|?#%xy-f#%wh&H3#uH z%$L{-A&Pnb^MGX;LLBpvWebE<%-aGXRr6^>@B+0UGRf&e7>ied9i0f84^6TZJ!A+9whO+(;!!F#YF;zg_o!^}%< zGkk06A@JD`#0GHz6bHf##J%YUURb+q4dR=rH)D8#QX6s=7zaZ2Kh67ZKWsPpMwF>h zmcl094*z1_Z=xoi4f_x)S#E};)g`u~9hP>B+z5nnM$H?8a7BP%`{qb22=eStDWm3x zg)jxNiZw*A)>t0*2B$?WvJ%!1$@}hbPqxO2d_LeA15oG_B85LARQOY3?wp_|o{0^U zHL<40a`3hPI3dTTW*ofXI!ef~!-ywEDQATr105Wd)|viX?ieA*mL>=98jTQg>=7rG z!(@x>@8onp!CAW{&f2af2c=}kUg0{JbIi%f$;rvd$*HLN6<`1!uF_d9==`$)0000< KMNUMnLSTX$7j)+U diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/browsers/chrome.gif b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/browsers/chrome.gif deleted file mode 100755 index 10df50bcf288827531010e5f3d3e3d174788203f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3803 zcmV<14kYnMNk%w1VMYK$0Qdg@v9hshl0BQu^<<4bsMGerIV5|7rwDh*jFN7}-}T3E zP)&3>&CsfqFeY$sSgcbz$H&S2_~RH>sE49w_vn`Y`@v_YEuEk~Eqb8%biuve_@XpE-XSnj!Idzywx@bzY$glIyix^4oHmvS|JN`}5s+ucTG(%(ci? zHR-vq0+ZxQP;^{&LyD+L%U4QThCi~yja7p{lBjjh-|TdnJNM|LW{ybP;?nfnSmUdg zgSzaTvWWlmq+)rvM`p1}RgY&*Lea``G)IY*tAz5`M^k}5q`G@BS~RGWZ-}K@enm9L zvq;izV*rKM9Z8#)n4N@(h82L&?9yo^c*Zw3IC+i5v&E8;tY_VjiTUiZTwPrJ@0NL< zJiW}0dzx!Djo0qYB`8&;`}EXOo8E1aSJHY>@XsFZ+k$eGV(#c}SX(=AtoK;+bX zxVXL|J&&EQcCw~n%Vj)TPe{f~Fnyh2tiXhCmORqk#-zMwZj?#r;F74gmjC&&eW5y@ zwpzlMf5^LH*uOV*h*t6S@Y#ZT+RTaM(L!8UPi>H4?8+we-g%pnjews|?9*C_zweZ< zT1-qi?zso)q-ACf=BDkBk|HDz%L-b zFCg&ICIA2bA^8LW00930EC2ui07d{q000R80RIUbNU)$mgR)3G(X~kok%te(xOwtp zn~sARGiuyeaGNeM9QYL|z@el`lOqcd+4Mse$Coe**3v~}BnL$$ao$wK(}&NWIu(g& z8M7$HTAM{6Rlfc z5)oMd(XSaCo}xv2b}wJQXh-%`#E%GxxEud830dIRj~+J)=ncCUtX{Hb&qf;y)eT(4 z1C_Ob6hN|q9z9s(jY`>aU#Lw1qb=KyNG;F;H5nSf#DS*=91uO(!&Elk*OQ}WX5Ejr zqQi)9En+gjff_Z`B0DV$Hn#W6eq-R=^=s$2ExH2 zGR?iF0F5`S@<0PvX88aLGx&&4USZKDUSIue@{%KT=)nXMOHS~D17$E14hr6Jz|ICY zD1apxU|5mJpL}BZ05mIp^-YQP~+ zF1bwM>=bLbkU^?g61u@2{apszQ%_`c3pRS_v4t>^ig4l=l|lf40*VydKqAR%um%+p zNKit(_)-yVB49LNEw+h{CGcLfVkCkeek5~55sM%J2{$Jo(FiSN_=3!xdcrHu8h6-R zLK+8z9P+&qP@#b*{jT!F28ft7WM4fTGz=Y|h$~1DMZECB00RWjNC4#!0s#xFysL%* zRFLuUJG@{3!_zRFF|q`A$z zkyJ)jd``$r1=(7xXZB6yVZ85fK&3Iq^hc@j`y9dTm!cl%NpSC_^OwMnHi+41xivFasQpah+p`!V> z8sHx*1kf~Il){DyNFxpf(1Km~4G2IWLlD%^4k=V%1bpDbEJ(o#W0+xDWgtgAPO%Or z{395C5C=A|Iouns$3fDhn&sY_!iODD7<2CcwGMS(ZZv~iIQ zZIDA4MFzmSdGdxhwB|?aP|!KXV-hlO!ZozI)o+4R3%?9&BOQ6s6gFaoTu?$PsvrR% z9N-LfAch$Wh|~kJaTgeXgfPk(EJ^@yWZh^2` z?AgzH$^|(XqY7jI!WeYRTLHGfZY|&iX8m@6&1Uctc)e;?oofd>?86nRXvH+%8Bem} zteBRg2W?F;gjDcv4333C9rQ+wUF?Dws*75CRXN8GjGzKC&_YY+>(bHMp&H**#UjN4 zPuR+Dr;TVtPit$4FiN0@V>p9?n?d6`JZ)-nJO((>@L7a5SD~ZzFo;!)ifK#(6~a6M zF)^CrM%Zr|%NRn7vB1objrR;#mfD0VEUHUL;j>!6YB);^WIzmA3n`dJGEm_=>}s+9 za!r=Q3hiN!At0d);ALhB_T1h**Xy`*JjNm7AcG2Am9OFiXEi_pP8+B|8RE!CFX+(7 z6Q06hKxJm)%X3%=0(sy#z=%g2@cK$@&o{_g1;sZ5frGE5 zK$ux*g$WCrwiIhx4wQ(vDcn7WdyE4D$y0*^K7fFBTp<)v!0Ts6z}(UHHPJ!;hVDLW zKne<6s1Hma_N zg=JUoO4xb;G9fe2y4e-jz@qe=U2&B4S-M#fk1*K z_!5860TVDCC$I=`wg6pV3&(H?02qaAXM+I<3V`5#IIx4#7k@ARF${Rvg^(}`kU%M2 zAPs8p0fX3vvKD}C2wko~dsirZJFo-{$Pth@0eN@=tf&Nn@P{?LZywsQEjh`dMv)fX3kU@ofI2E+J$ zWat3qXNXGYSJhBofDnhWWCALH1~?E3Ru~GVh#NY94inG@^hl3i;DP$r-S>BxvXU=FVU z3v-7X1n~#xP>&D!2(PG1P1t%aX#=1T2pfq5R|pI0*p6tpumsgek_O=jT;Px?=?&6g z3vj>#T3`Z5ISWX+kxt+Qq|gnpkbu$`3f*9ky*QFQc@R3_lMk5#k6;RZC=Ej34i|6% zu)vP5kd`}$2JFa-1xW!|nUxu#1K+?1DG37i*acl61UxVZWod;wz>eL327xJkBk%@s zDVH4a2MoXnmGB54kOSV(f(!5gmvEM8NsxW81aA-l38|Pd@dw|)0QUd_rg;uSa1K`x R32*QQ+Mo@dDVG5O06Sn0stqPU-?eF;$p3mp`JpO@xPR=|10B_)%3Rrv^HaapId;6(C zKC*BYH=Sh;JMNA+eQ)tGw5)RY`SZt8bGX|6Yn;-a7m1c9i;EH-41S*l7soIG8P^sY zu**vUKiiV;YLJ{#>Rx3NUL@*dw7ncp(S4CZ`1^d=&!_gw-!Y_sd}W5&QVaI)XU(_q zU{l)4E$1IXnt`h~oD3B;E&q77$9I)|UQ2%G_*AB0uM2MZyVNe>O!B^@_p|T*<^mvO zJO4a>B!So?m*+*T9w=NjnP#9;oqKv})9)!k;?!Nif|AdlKVLm`sLz*(H;sG|2&tCS zsK~(^%6C!KUCrXnb$`CyZKJK+f}K8tYinzJlV?AAg{%5rU~ZXXzH!ejU-jSf_oXKA zy37fG{q8pVQqC>BJu>)awjQb&Q7U&57ltk_&mL;Nd~%_N(QJj8$<-L<(TgbH*{75H zHv7Iw(wx1UWnq<8TU$GxLerq_^VygdS|@*h2cscuZz^2(x>tI&Jht5)`y`V1HW!My z*1!DIXjj9dx|O(^@>11L{!+W+c(Ru8{_CYCi;0Pe#dEImQ>UVDJ~|n1H{h#%Eg+zN zm(IjN?K3CZm#2ANqK3%$)Pu>_m1*<`O#GjjkV9}pf6KKmVu%!3xruu|LeiGc^P9@h zT&neqZjiS~ANTjX?%k@j_=?#C08KF_!#v}{3nzE{Uf1uc^-sE4RO9n=4z$@+#y?d_ zrEZ+JHSECP;CiOcc&f&1I`iFKPx|j>h#|k^>KwDHZ9V0I5#@A!d3DA8 zUk)Gr`t|G1*obXm@waM@F!Yf1M#e>oS8Lr1xHo#gzs{aGps!M?*o#;Y091e#@E`x* z1OTf5711C-D(T1q-vquQ)Uyp%os$Ul4oR!zh0N7MfN3DFAcSQLxXOUII>y*>=h-S& z_2aXIcR~&A6`GKX8k(#xtEopf%k=Ce5q90{6SwnM$(^1Ku0NlOUVEjiO8Wgu;1H$J zB>>=5m3z$$F_JDvio(_oR(2IP7J3TG`JtUYtD~=*7wDnYmhU3VD(x@J-)Uc;v^j9Y z&ekpQMValtjZBLn?#8BvxR&i^@S5(Z+tIocp%rh))7$I+3Al`tY%$axcvT|*aWV(@ z%lTg7GG#!XGa(bwW&}=8W&a?Xmh%`RRt@`7<@gIF-J~ za)R;a9Ya^by^m%ZANaGCkHmWWOJR-nbZK+syE8bl)rJ6_O=I1%(4ea+PaIwY2Rbdk zHE4!g(`SB}%wDo;RT2pXk^!yY;SSiOOl<4LF`3h#9tyfSna|DvDuY8EFOP`0YHw1q z2|#Rem^C!B77_o3a8SUjMY0mlD?@q+C$BbB*gz(ylhd`p&BLtu)hCPn#wWQD@@3LH z%UOm2y>71QQ~j7ErVQ}#rsl(jDU_Bi+^554>VI6#pEkzte$ zvi#?4MY^=%ShBD7-Kpd11&NadgoU?PvI#crgZ<=(Wn8)WpK0U{vvex4qmx1wd$pES z^1au__@Kab^&({|?!=+ta^3 zrw~_SSWUSaYknXd2C&4bh`AB@^a&v)e!|e2?T7LnZzWqhP5LN3yJ<-D2G>>NtSP5A z;M*R9`WRaov0}Q#LryT*tcdy6)+-E@Ks3LyvzirLXfqF^ zbLvX;%LSn@nyhdnQ8PtM+_dx4OK_EG>mwsZW+@T^NQ^vvXDV_&(DuLDLTO<8Mu?zp=~9@ z|LP{7<$8Tr&9X(-+PGGA=G~>%1XdoDl5y8#l}gUFl?BEvz4iV9_d?y zN$M)xn)wZSqP$v1$h_ioR>Nbp@aMx5C%SKettuO=PffnkdfL&$h@iM3@M3 zgs8Q*$Z$Tnpqbg=(W;xham1ujZgMfC6fG27I8f$mp}BH>;0CP_7Tliq)GkAjbujgW z;XzpT>jx>6(vI$TOBb@XF-HuG}huZbr}F z8Ngx+%e-g+0+PfXItTu&)(&CA@9$Rv#mXzn7#7JxGTD+S^Ve#m=Le|xveT_!-Vj@r zV>j1p8(S!Fcn+ON>f6hh!2oAqFiNWqTj>j{?`E}%CGg-%l3qo707e+m9^78(&>?G(LX0>GJz58=n z#uwR;mQz_3{evi=PhlJofx!K2afXZ923hJC5k^*)(pBE!I%!x zSBSzBV+emN^h9$#PwdYe{SsSt-x2XN0045D)od3F05KeO7yvwvnT6p@mup{W7p~|a zS$pg9>1x4zK8Al04c{LUZ>W#nNBqE`DQ=-ZU8#EV%{Gd|Vdq2*puTAmtlM(-i+}E; zFmcq*Xbym)d`zgj)S9bo>Bs#ZD<7{yFoNfMvR1%ZPuzJ7kPh5|x%>v#yo<;ORw3ga zFX@GEuJI#IB2$LK1~bQ@VYJwvc6M;>oSf>$%61)K;XK8uznR8E`W#3<8TO&ULgI8v z6b9Sc!3Yui3mH{R9Wfq(>R;(Jy&B%26c{)i9+U#X~&0=b(J` zdt(dZ{-h7;c}xJ%G+znd<*8x0sQmoXz)7o#?x`o%SwL3BUptIC{ z&3rY%O7`vkUTN`>58i6VsyyNOvxioYUh|uIV;>Q!Cy9`#q@3=HSEdVc1cm!E!<1kl zp}#5ie@c9)?9NbDJ8hL<3i40K>RND%|7vL=NL$x>Vz`)yG7SDgdKU_<>%v*j8CK;r z+Ba_7zW4j|+pB%Oj&C2N>MN_&zDo&OA>0$#5-512q37=mPPU;{F{|IgZKTS`;N zDfX_+A{6hz^JM7twc~x*q!sPe#MB$E4-QU}9cE&$y^SiV0+3C%D>0;uAH8g)aH=AF zv%pP>QaWVc9hBg0-q$Wk(Kbc{qkn3-7I*w0^3Iy_Hp;LDe!xdl&U*w0tJ2$C3ed&`@HQ&Ct`pEm@d(_t#y}umrS1F#CYM^I#E))JKZ}q!JiteQzaVxgmbyo&4rDpD+6~jy62|Cl zg8Vjdjy#8A#XX)WhvH@A@HuSAZHzw<8$&;!bBe<2JF<)rMGB&q4iaU;g?Y)tEVx@h z8Bo#%lFV)iILzNJd=6&_ib@fD1RZ)7XI&&n*SUG51|jN6;1c>~8x{tvb$H!e?Bbs@ ztRPWYq*^{nPeE!#ibQLPrCj1}2|fYk)NR(P4j#aF{G)wcWPrJ7` zZ8qR;_YELhWjR1!@qZEUL8;ikSfF+_B%0B%=Te@}Bt7qgcE*xsqz4 zY&V1^t!~DLNq^IzXA4X~rINyZtKqB?fX@@Lk^DR=-K^w4H$Z?5z}=>aG)wj>hC(+e zNigP*PtqBsaSh9C@e<+TH zNr}weggtDti1j-ir%tE997>WBKUB@=7oX(s!tN-~rb=+52&o33&2ZgUpw!C(ymPCV z^3vU!h}V@lGY$uJAfSuXFu|63yd1|7l-2Ons0eBU(+YJQ>cph{*6cl7x39~CO6Rb_ zePayH- zbB-MxO1z3*(J9iEmsd0_mJZy#_<=}ML|(Y=hxHK?4x^AEm-u=S8^a+4EnxK|_|AS& zJR5tAMegq}Gv#7Fyu7Fb(5OjjqjO3BMqc__4lX(qVmSH7oGWg9qRj(1UfxAgo8tL>o|AVnLz^T~v**H~7;*-1SI;C~=$My*T diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/browsers/opera.gif b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/browsers/opera.gif deleted file mode 100755 index 6886f6b8921240010cd49d837e30a45eea807af8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3508 zcmWla`#;l*C%&R8x~)iC(m^o|;$?IUR}vz)hKK%EDspfK#1;!Th3hX=pSW1UGr{zx__GJ9EbS zhGs@)QbEX~h2;l%`Kh7tuZjv^+j^wI=N6V^|F(8jQIuceaMHY+RcMU#!o^pCXMam& zxe&;wyA>N=$2aWkmQ73sYhNzcy_DRmya|D=#m%D>1}`== zZg4!%vD0drMymn9A$5(-q~uSJYNZ#iPVHx}`1`*EfVqjeE~4B>{i|6eweC}AmUr8} zaB`Kr?Hk#$WyQgv<7)gfkE0*`POa?Qzo?~EZecl?cjFtCy5f7{9tM+-#;k8Q-#i`k zoT@9?MxQ9U(Rx1o8-p?Ff9k%bRySU*Lr(540yTWUYSD3DBnYX5qi-TGT^YHRAh^I{ z{tgTnh)Z6aoR_7huS#Tn;g?2DXq%TKZ)xdFXi}FhUS9aQny#t6yn`{TOl}|$Hf?R* z7niRD1+P1@H;ic??H!(*TfRH$v&v)%L2&u!@^bjaj^vCRXt?B5@X~&E>u!f3B5_n* zb9Qc{3i&a?2Kt0SYCTAeVuJCc@!u+vu$b^u~rvDwPRPsFk#=V)ntc<<-}6#8oS+ z6r5r;0@Hv%6cO>CDazj|{{;PIU9EVhq1o&aqWbm;n%^DO8{PS zCHgWFHb1klG_|;}*Ip)*X|KUR0FVJR;J^KU697sE$k6I+K?w_Cu=`rnYMSF~fTROM ziLSRlyrgxzm@5>PbX=#hAf5Bu+yHe`A9a=aQRKk_-K@q?*8D)Sf_C_nVyE~h!GSUJ zD8Viwt{1|_PW0V(|Erc{8Ua&5Jcnq0}>j)p4-Iflrhfur9^+_nPiFn^$>pkGXQ*gYI;Q>w1!h*9uSl zz&rjk(ua&3^}WfqL-nPFac9pQHwR19iUK~7;2d3BLEa>&^^VKslsgsd@HCvEvvkK1 zrar-gzlRgsk@;HEe?M*_GaX@uNq3cH=Cw=i=y_N6mici^Pq`u0RoSc**0RmD=Ry6q z_oJUo<#vgHLnlSoxJ8OL^jzaEr=0O)ljz6#nvqsx^v*=3>b@?Bp;Hq=)kZ=s!{}|s zb>SI?=3Gx)k`PKVqt0XH&00AiO^L_>2~R`_*TaW5 zNpFlAqpURGABx=C;f(PJ53F)4%N~C51A6lAZDAP{c11M;g4eAlr^YmLnxLwI#P#lN zE_|zTlSdO~Mqs3~%*z0b;Sd2B)nzhHPLb1#hTFi@%H*2bwf`U%B}FtNPPGp6paMIL z2~BXNnQdKE5kv$?9F|Usw(0}B948%UYTZ#=|8A=&20h8(y&cx1c2hD8DThY`?@ac& zbINk;#TUj*&4^|WThzE76zEfT*L1xT;^8-qFdJ_(-E4c_H1jZi#O@}f1|4vVEmDcM zdL-gkIRm_2Ats0IBy9EXG{?-ANJr#-56T);0B(X@%*(;DI2Isvk(y`Xqym-q3 zwrpWW*`E!Wr__iW?Y7GC_<`rFXfA2nW9$z-@6WN1PF0(R#m&BIBw8?rYu;XXGvQ4Y z*ePs3BKAKSPmAqT{o{4!zSf!_Bk#!}5~8pN5Q_mblMLr|@;zNH9&$Y)XMLn99PH8) zY~*%R`hK|9YsKWbreo70@>+I%B!;KXf6RN2(ru;ZfM#cd-C7WD&pM3DH&^63Zyo#} zsX?nvm(NmIpFr;0O@w;&mysu}Paw$kOs{%hJT&UW?<4l{Tk2bYlcH~A!4D)X?-x&{ zzReWUo6EF`gFox!sj0HD$QQ9>S|JQO#ev$FW+EPkI_ly=u|Ks-;!!9+jO<`oI>KJ8 z;vF7uW-e+bSBq08*~w-Z*;yL(cajut$rH@7;ZW*`<`-)!N==lYPi@9-19%-7Poc_o zVQJPWchoP5GgQkCn*3t~rPKg8d&^SAdx1Cl9izs58_G) zP_7?=Qt$7%;sJGf%S8-LjM{dwyRJqxVTEFzy5b1b@fTBLiaVwkVAbvD?o03#jX5)p z!qwDU5JI3`#d*Jz>8)Y(SFuo0(H!CBd?7hArQ8zFJ$P)&)u3@qXvPqNYBs~@0Mrk& z>>`|7D@*$$ok_lH^zPz;a0H^TX=`{x@$G>UjJgv1vSh_2e+*Q!?x_R3p z;touy9XNfU@48PcVSt%rH)R%2yS0?tfePX@42v%NSQu=31kpe+lT8@Qn2RYv8a$>4 zbVxPDMAY5<`QB;i9;cz6Cx)lfPf8p?K-)>vvuT;KkDkzSVZv!E@0*97m16E4KNsYphL`6v z5zd2&DitGfcD%B>{J*z4p?3lJ2~T9>@f$i{#0eh=J5}4ZKMvaQmRM-Q`*aik&7=jM!8)RHHjh+}92K37q-ho0=l8g-vx;X{R= zsNX^f0Zz{KZkfYl0!Uf=DH`fH*#WNei%?fFojJ(~gudkc8>t1^Lib9ct;?b%3Week5wb z;CrTE7NU{Hxv}qY8C0Jy77H$|>@F0JA?nN*Q zn6jEJ-!r2tbWT+i;9xW{RxmAHj_hDs_Jkz^*LcQ&@*CtJ3q?KI^6T-X(6{1{E-{A1 zcSwVPYINiVAE`&Vx*-6RMc6eS=*&6o$AgmuASo2-7fL7;A>VQ@=O$k>LK6I|HM~L4 zk_)M1Mq^ilFC~L?G3+88=%m8V(SbG*vN`OMp26kEKk&XxDBEC<0RTcuVBbnY#!7-q z3}QV0jSo)(yCV~`%R{ouaYl2PX4Dye8d4NmO{ODC5lMo z0~!MKF%jaW@a*q<=Qqlc?fHn(B>W&1sx5$3^W@4xujETEx$9skBJea9oi9SzhI-vE z#D5M=vz-I}5@BwNKr}CTay1R!L=pkuQvs+Uf*5fTJRZTT1Rg3xx^O`>5k}-0b);nE bG?CEr;6H{K77WYBI!*MlHSIV(lO|ewtb9BsZ~v~o3>-$Gmdp;NRm`< zsgPAeViKBhrbE-AP%(56+MUv;)v-I@zRy44^~>w={NcHDS%|k!j2KuB{9^>fRj-y_ z?2k^qKL7Y%6B844Pv1Ry^k`kj$Em5Qd27DLny5;kt!IQik9u&}TcviX#% zd+^1J?Ma3I{`;@}mU9lfu2ygV5ijYrimlcXzbrk{5Onf(Sk`DnL_}g%bpVdLZYYc2 zwX06^_|1B!;o;$k!`FYR>a$o{?kpp7FSNM?A1trBntr_U(CHiX#}0+;D0{TYV`O;n zWOc{s>h6L5{yhcPCdc2n9DKAVr}TkD>z9iK=dWk{smm{^ICbuFWBZfL zYrU((r2k3bt;tvV`<@1@ONlPNJwEz!RYG-m&5PUJU0yL~)@OJ0^ze_~=vlFVGm;Fy3)n9Mwc=4A`r)$v- zdmrie^y!nixw%|BX)qW{w9kTe*52%X_VU#$>*y1us@u<>4-olR>jpoLj*eYv>-+UY z!;>dZG#bsfFQ3=k{JW*O+3L4(r81AmIe+AQTUkZzC13uRuU|Fo-77B-9WOeyt%u?doXo4dR&w(6mEI+}nk9LUz8?09jg5`lzTGdrxoi0A(}9;?{`sgMc+$}Q z@b};aH}3WtjYiwg2nYa1z!mt;|2qNDjewCcD^x{lf1mGvoO!%kP@at1FE0t@$2e`F z|F`#x=VVMru4u{3tVl!TS*26t%oJswNFj0Aa*^GepbtCgy`<3Yb8f%$wzJYVvu5UT zOIOcu4YsOrr9UXAC8L+Rw2H-|B2;Iqxn^E&FUjy-w4He9w!EBOkn?KJF)!Xp|4MpR zzNXTjMPK3idXciOa!f#Ky>Lw_uMgr`iVX%5!=&GZ0;r0vqY~*pB5t{mM^Hp|Nfp z3dhL(opyI0j1~Hh?jSEk75JqaVUO5W#1+mhi{R}fD1Jfqu8I1X%$%tghnkv(3slJG2-I+>C)-zUbl z2ZGE4|8VOKdXS9vOE6pKJT^>aItk=rEVV$KkzxkC9OMb(U^aqO03eroD`*+}#lOj# zxz9AZKr5>8~Y&V`xm}VwaiAg*v}PeL_ut{WGWkMm{znca}NK&wlL0m zz?|8?0;Bj+mH8R`?4%fE(SoR$bjD|WOeG`DNz_4$w-B@D+5;dg^~Q-*igy%|@8)gx zJ~yl2n^70IxKO!S&W~qqZe>`-lYpCA0A;CWnEk9^95HC$Sd#6`cAwYZBsp%+ze(Al zQLbfo_?mZ65YJ)EgdvFUNpN)yA{8|LJ^jP9^J(pKuBg_9)^yQW-ilRbbCdLJMtR&6 z>}bBX_O4q_rG|r=CdqDB|MWN_zR4<-Sne)}C+?tEqheBRguhSHZl#rI-(pAO;AC&% z<71qnC1VTt*lUq2$aQd4DaY}dXK}a6_LMuqw?eetj2Nf+AE-w@4pc!c9{&=S+KQT- zJH37rEMIr2UAT>Vdjeu{V~xAqixvN}gO--=S8KlQ)k6yZ`eUrkdeihJ%^>rxapWJW zs(t<)>Wd_~Vy4C8ZEI zSjWVLSfxwTyv$VJEg_M<8pWJjICWB)X7^EQzqe!y5}wrQCX+Ff0oXdxN#S+I7TG-p z&3Jh#b;kK{jYT~uS4cuE?-C#-v6SN-L?RA)1+68J<~0^F*C>o)%qX%4gVWnT7it|@ z?V^P>fY>1#1QQ>Zt!>00%?XroK{EBbs75sr(~QseupEgB(LkO=Q{j<{C0> zr;>m>%Gy1Ay_Nj*WPmCN@FMVx!=wn@B&G4$d7blpBeG5CV$=akv0V{JJzf;zD9~|4 z`5+};4O@kDr|s|~nB`GHUVfS&dVCoLb`JT1>Oqq=!?_m>3NyqVSyHE^9A{s|{y?b= zsh+N;2MSyQ8W&+C!&j#@*SrTJYDyKd_;E#moA|A9g%=)Kyj(~XXHb+ zMV(z>XSfzJktlY&8YvTToI~4y^dIRkJYR$G*g0oI?Znt5znjxlqi)CFbZlN)VbEkdw_3Gku7+=9l$H zO`d?WBr0u8bacCtoK-yy9k};3ed_XhU=f`(K6TeaDQmz2UTF3nDA5>v0JyI`Ep*hOw(jykn^9MNY*eIpPD z6%qbX0_`g*Ys(b`B3t=#dUjI#Dx6}e#NVt`3p(4U3D6+}WFw#vRws4Lae4pJb-VAt$`^F@qZx8wqSjpADm zXvLT9LoqqHe#Ho9W1raZuNsPrWY}bnnl>|2m6JfX-NyT0yYsj^lqhNCN9c%im4>*` zrM?|o*VW7cw1}Ih*rrn&!WmIz_Emc@U z!CAX-k;zuHwe74y@x!#9YD$woJbs4h?Y-&clc*q9Cvvx-0-%QjJTycjk0c@ zJo&XpVMP#zMFus1%cpnVT55?`v_hA;Y@TSgDgA#6s)1nnm*C(`DP)?DA0E#Yiwbm| zZXWODy+Z_bsRlQ~yOl>1U5CGgB|$9Tn&buOe;l?1wr~Zron7rs@N~J?HVNVZHt($g@iai@21tOzum6#cjZ%NsANkop zO(v;laIk2KjY=rJ2DXuadq~cJ)Y6dzH>zkJ1jBH!sE=dJh|prw)2IEj}j2Ju5c%)k?Tw5U(q|7~3##-<66z}u{dg^HvwNeFFq8!Ai+5Re=i;e4{41`_GBjsZ*rXIW@4ZwW7Un%9U?=98S0 zYR=d;24qO)#3@B2#b}glbtLwiouv710F79lKLfCo6a>EoEcJl3hIvlMs8ms{aGHx0 za6oNFFwoT8NeqB4C}ph_G}F@yq|{|7{fRnpw+x=A;>|+od>O~zr{DkpC{d(d2Lj3y zmO56*h5}FrzSQKM*3oz3z!@onX+r72K*SDp0FXtI04GHs zyAVBbz^53Hvg+~TgWV?%F#u}}n8JYFN~WO#;!|vxwQPjXT1?C|l~5j*Li>jiTcR*p zPnYUr-%5_2KY4?D#)`3$P@3c(OAVCHbgt$?~JmiVqm+*qI z+%e3$24!rM&?@!tZVmJU#^H--fy;{Ty#<_gpdUaP(sN+V*~iOHFF$$O8Y^m$v7)5F z`WZGK<4_kBSE%8<2SGE5ZJv&jpr<~S(pojgJ~MzW)mdjHZBWmVU|hf#u#^GVZ(z5Q z*6+g$BN-poTfGKts!&Jj14t}oxa;7xDpnrKYLqfsCA1up!s}vsV#Qy(zmGtt^&E2@ z667rUo8VvZco5r#JfoIWj0N8exg%7#_eAqWQEM);PfKmk85-Wk!kI zc8Pefl535fc)+MwJHT=_(0<3b(*$FlvZ7lFHRG_yZ77;3+p!Y}-05VhV!p!o?ii?1 zu@__DsFYDaP~ud8m5%;ByH;Zt6 zxxN>jZxFgmd3U1iSvV_L3Yf|0tFaUJ4zT5o)dS3`KQS(>fx7{Qv!*y&&(oGc92f38 zUvNSPFRpNytpkuu!QdVEDxs=r{V|x-T z7XpYbrMl=@xQc5C7gniQRkd7GloF1Cfh_hT_gYd@N7e8yYnU7zi~X!YDP>*6n8i5l z3(1V;i^ni15tRJ}_8BlC`Jq>4L%x#W?oV3gH>14jX-PQ@#hK|c^o<{QRQT>VAD zPJ6~&bwunq?FiMrIUbbk?Yn%~GP#RD_X%(;a4y#FqbZ%rf=>?Za>{Fv- zH~@bl)s0HiO9Wh{QXBGah;`8H^H8FWNq=h)%*Ws+3A;lhpweRusB*xaKMvYOc5BJNxq@|y%#ycc?-?c#Wpu4irA(vGRvBT9~C rN`gHO-NA*CdiHZ2bNvcFouHyP^i4qVysO0wu!iI`lAS($6j=0s**o*? diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/FIXES.txt b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/FIXES.txt deleted file mode 100755 index e1f06cd9..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/FIXES.txt +++ /dev/null @@ -1,12 +0,0 @@ -:(t=!!k[n],"br"!=n||!e.data("cke-eol") -:(t=!k||!!k[n],"br"!=n||!e.data("cke-eol") - ---- - -for(F=null;y&&!p[y.getName()][L.name];){ -for(F=null;y&&(!p||!p[y.getName()]||!p[y.getName()][L.name]);){ - ---- - -a.window.$.getSelection().removeAllRanges() -a.window&&a.window.$&&a.window.$.getSelection().removeAllRanges() diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/build-config.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/build-config.js deleted file mode 100755 index 9e672885..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/build-config.js +++ /dev/null @@ -1,152 +0,0 @@ -/** - * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. - * For licensing, see LICENSE.md or http://ckeditor.com/license - */ - -/** - * This file was added automatically by CKEditor builder. - * You may re-use it at any time to build CKEditor again. - * - * If you would like to build CKEditor online again - * (for example to upgrade), visit one the following links: - * - * (1) http://ckeditor.com/builder - * Visit online builder to build CKEditor from scratch. - * - * (2) http://ckeditor.com/builder/9b9471acfb896c4f73b825ccf971b5bc - * Visit online builder to build CKEditor, starting with the same setup as before. - * - * (3) http://ckeditor.com/builder/download/9b9471acfb896c4f73b825ccf971b5bc - * Straight download link to the latest version of CKEditor (Optimized) with the same setup as before. - * - * NOTE: - * This file is not used by CKEditor, you may remove it. - * Changing this file will not change your CKEditor configuration. - */ - -var CKBUILDER_CONFIG = { - skin: 'moono-lisa', - preset: 'basic', - ignore: [ - '.bender', - 'bender.js', - 'bender-err.log', - 'bender-out.log', - 'dev', - '.DS_Store', - '.editorconfig', - '.gitattributes', - '.gitignore', - 'gruntfile.js', - '.idea', - '.jscsrc', - '.jshintignore', - '.jshintrc', - 'less', - '.mailmap', - 'node_modules', - 'package.json', - 'README.md', - 'tests' - ], - plugins : { - 'about' : 1, - 'autolink' : 1, - 'base64image' : 1, - 'basicstyles' : 1, - 'bidi' : 1, - 'blockquote' : 1, - 'clipboard' : 1, - 'colorbutton' : 1, - 'colordialog' : 1, - 'divarea' : 1, - 'enterkey' : 1, - 'entities' : 1, - 'floatingspace' : 1, - 'font' : 1, - 'image' : 1, - 'image2' : 1, - 'indentlist' : 1, - 'link' : 1, - 'list' : 1, - 'maximize' : 1, - 'pastebase64' : 1, - 'quicktable' : 1, - 'removeformat' : 1, - 'sourcearea' : 1, - 'toolbar' : 1, - 'undo' : 1, - 'wysiwygarea' : 1 - }, - languages : { - 'af' : 1, - 'ar' : 1, - 'az' : 1, - 'bg' : 1, - 'bn' : 1, - 'bs' : 1, - 'ca' : 1, - 'cs' : 1, - 'cy' : 1, - 'da' : 1, - 'de' : 1, - 'de-ch' : 1, - 'el' : 1, - 'en' : 1, - 'en-au' : 1, - 'en-ca' : 1, - 'en-gb' : 1, - 'eo' : 1, - 'es' : 1, - 'et' : 1, - 'eu' : 1, - 'fa' : 1, - 'fi' : 1, - 'fo' : 1, - 'fr' : 1, - 'fr-ca' : 1, - 'gl' : 1, - 'gu' : 1, - 'he' : 1, - 'hi' : 1, - 'hr' : 1, - 'hu' : 1, - 'id' : 1, - 'is' : 1, - 'it' : 1, - 'ja' : 1, - 'ka' : 1, - 'km' : 1, - 'ko' : 1, - 'ku' : 1, - 'lt' : 1, - 'lv' : 1, - 'mk' : 1, - 'mn' : 1, - 'ms' : 1, - 'nb' : 1, - 'nl' : 1, - 'no' : 1, - 'oc' : 1, - 'pl' : 1, - 'pt' : 1, - 'pt-br' : 1, - 'ro' : 1, - 'ru' : 1, - 'si' : 1, - 'sk' : 1, - 'sl' : 1, - 'sq' : 1, - 'sr' : 1, - 'sr-latn' : 1, - 'sv' : 1, - 'th' : 1, - 'tr' : 1, - 'tt' : 1, - 'ug' : 1, - 'uk' : 1, - 'vi' : 1, - 'zh' : 1, - 'zh-cn' : 1 - } -}; \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/ckeditor.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/ckeditor.js deleted file mode 100755 index aff82757..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/ckeditor.js +++ /dev/null @@ -1,1010 +0,0 @@ -/* -Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. -For licensing, see LICENSE.md or http://ckeditor.com/license -*/ -(function(){if(window.CKEDITOR&&window.CKEDITOR.dom)return;window.CKEDITOR||(window.CKEDITOR=function(){var a=/(^|.*[\\\/])ckeditor\.js(?:\?.*|;.*)?$/i,d={timestamp:"H0CG",version:"4.6.2",revision:"20af917",rnd:Math.floor(900*Math.random())+100,_:{pending:[],basePathSrcPattern:a},status:"unloaded",basePath:function(){var b=window.CKEDITOR_BASEPATH||"";if(!b)for(var c=document.getElementsByTagName("script"),d=0;df.getListenerIndex(d)){f=f.listeners;g||(g=this);isNaN(h)&&(h=10);var B=this;p.fn=d;p.priority=h;for(var u=f.length-1;0<=u;u--)if(f[u].priority<=h)return f.splice(u+1,0,p),{removeListener:r};f.unshift(p)}return{removeListener:r}}, -once:function(){var a=Array.prototype.slice.call(arguments),b=a[1];a[1]=function(a){a.removeListener();return b.apply(this,arguments)};return this.on.apply(this,a)},capture:function(){CKEDITOR.event.useCapture=1;var a=this.on.apply(this,arguments);CKEDITOR.event.useCapture=0;return a},fire:function(){var a=0,b=function(){a=1},g=0,k=function(){g=1};return function(h,p,r){var f=d(this)[h];h=a;var B=g;a=g=0;if(f){var u=f.listeners;if(u.length)for(var u=u.slice(0),z,y=0;ydocument.documentMode),mobile:-1c||b.quirks);b.gecko&&(d=a.match(/rv:([\d\.]+)/))&&(d=d[1].split("."),c=1E4*d[0]+100*(d[1]||0)+1*(d[2]||0));b.air&&(c=parseFloat(a.match(/ adobeair\/(\d+)/)[1])); -b.webkit&&(c=parseFloat(a.match(/ applewebkit\/(\d+)/)[1]));b.version=c;b.isCompatible=!(b.ie&&7>c)&&!(b.gecko&&4E4>c)&&!(b.webkit&&534>c);b.hidpi=2<=window.devicePixelRatio;b.needsBrFiller=b.gecko||b.webkit||b.ie&&10c;b.cssClass="cke_browser_"+(b.ie?"ie":b.gecko?"gecko":b.webkit?"webkit":"unknown");b.quirks&&(b.cssClass+=" cke_browser_quirks");b.ie&&(b.cssClass+=" cke_browser_ie"+(b.quirks?"6 cke_browser_iequirks":b.version));b.air&&(b.cssClass+=" cke_browser_air"); -b.iOS&&(b.cssClass+=" cke_browser_ios");b.hidpi&&(b.cssClass+=" cke_hidpi");return b}()); -"unloaded"==CKEDITOR.status&&function(){CKEDITOR.event.implementOn(CKEDITOR);CKEDITOR.loadFullCore=function(){if("basic_ready"!=CKEDITOR.status)CKEDITOR.loadFullCore._load=1;else{delete CKEDITOR.loadFullCore;var a=document.createElement("script");a.type="text/javascript";a.src=CKEDITOR.basePath+"ckeditor.js";document.getElementsByTagName("head")[0].appendChild(a)}};CKEDITOR.loadFullCoreTimeout=0;CKEDITOR.add=function(a){(this._.pending||(this._.pending=[])).push(a)};(function(){CKEDITOR.domReady(function(){var a= -CKEDITOR.loadFullCore,d=CKEDITOR.loadFullCoreTimeout;a&&(CKEDITOR.status="basic_ready",a&&a._load?a():d&&setTimeout(function(){CKEDITOR.loadFullCore&&CKEDITOR.loadFullCore()},1E3*d))})})();CKEDITOR.status="basic_loaded"}();"use strict";CKEDITOR.VERBOSITY_WARN=1;CKEDITOR.VERBOSITY_ERROR=2;CKEDITOR.verbosity=CKEDITOR.VERBOSITY_WARN|CKEDITOR.VERBOSITY_ERROR;CKEDITOR.warn=function(a,d){CKEDITOR.verbosity&CKEDITOR.VERBOSITY_WARN&&CKEDITOR.fire("log",{type:"warn",errorCode:a,additionalData:d})}; -CKEDITOR.error=function(a,d){CKEDITOR.verbosity&CKEDITOR.VERBOSITY_ERROR&&CKEDITOR.fire("log",{type:"error",errorCode:a,additionalData:d})}; -CKEDITOR.on("log",function(a){if(window.console&&window.console.log){var d=console[a.data.type]?a.data.type:"log",b=a.data.errorCode;if(a=a.data.additionalData)console[d]("[CKEDITOR] Error code: "+b+".",a);else console[d]("[CKEDITOR] Error code: "+b+".");console[d]("[CKEDITOR] For more information about this error go to http://docs.ckeditor.com/#!/guide/dev_errors-section-"+b)}},null,null,999);CKEDITOR.dom={}; -(function(){var a=[],d=CKEDITOR.env.gecko?"-moz-":CKEDITOR.env.webkit?"-webkit-":CKEDITOR.env.ie?"-ms-":"",b=/&/g,c=/>/g,e=/|\s) /g, -function(a,f){return f+"\x26nbsp;"}).replace(/ (?=<)/g,"\x26nbsp;")},getNextNumber:function(){var a=0;return function(){return++a}}(),getNextId:function(){return"cke_"+this.getNextNumber()},getUniqueId:function(){for(var a="e",f=0;8>f;f++)a+=Math.floor(65536*(1+Math.random())).toString(16).substring(1);return a},override:function(a,f){var b=f(a);b.prototype=a.prototype;return b},setTimeout:function(a,f,b,c,h){h||(h=window);b||(b=h);return h.setTimeout(function(){c?a.apply(b,[].concat(c)):a.apply(b)}, -f||0)},trim:function(){var a=/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;return function(f){return f.replace(a,"")}}(),ltrim:function(){var a=/^[ \t\n\r]+/g;return function(f){return f.replace(a,"")}}(),rtrim:function(){var a=/[ \t\n\r]+$/g;return function(f){return f.replace(a,"")}}(),indexOf:function(a,f){if("function"==typeof f)for(var b=0,c=a.length;bb;b++)a[b]=("0"+parseInt(a[b],10).toString(16)).slice(-2); -return"#"+a.join("")})},normalizeHex:function(a){return a.replace(/#(([0-9a-f]{3}){1,2})($|;|\s+)/gi,function(a,b,c,h){a=b.toLowerCase();3==a.length&&(a=a.split(""),a=[a[0],a[0],a[1],a[1],a[2],a[2]].join(""));return"#"+a+h})},parseCssText:function(a,f,b){var c={};b&&(a=(new CKEDITOR.dom.element("span")).setAttribute("style",a).getAttribute("style")||"");a&&(a=CKEDITOR.tools.normalizeHex(CKEDITOR.tools.convertRgbToHex(a)));if(!a||";"==a)return c;a.replace(/"/g,'"').replace(/\s*([^:;\s]+)\s*:\s*([^;]+)\s*(?=;|$)/g, -function(a,b,h){f&&(b=b.toLowerCase(),"font-family"==b&&(h=h.replace(/\s*,\s*/g,",")),h=CKEDITOR.tools.trim(h));c[b]=h});return c},writeCssText:function(a,b){var c,h=[];for(c in a)h.push(c+":"+a[c]);b&&h.sort();return h.join("; ")},objectCompare:function(a,b,c){var h;if(!a&&!b)return!0;if(!a||!b)return!1;for(h in a)if(a[h]!=b[h])return!1;if(!c)for(h in b)if(a[h]!=b[h])return!1;return!0},objectKeys:function(a){var b=[],c;for(c in a)b.push(c);return b},convertArrayToObject:function(a,b){var c={};1== -arguments.length&&(b=!0);for(var h=0,d=a.length;hc;c++)a.push(Math.floor(256*Math.random()));for(c=0;cCKEDITOR.env.version&&(this.type==CKEDITOR.NODE_ELEMENT||this.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT)&&c(e);return e},hasPrevious:function(){return!!this.$.previousSibling},hasNext:function(){return!!this.$.nextSibling},insertAfter:function(a){a.$.parentNode.insertBefore(this.$,a.$.nextSibling);return a},insertBefore:function(a){a.$.parentNode.insertBefore(this.$, -a.$);return a},insertBeforeMe:function(a){this.$.parentNode.insertBefore(a.$,this.$);return a},getAddress:function(a){for(var d=[],b=this.getDocument().$.documentElement,c=this.$;c&&c!=b;){var e=c.parentNode;e&&d.unshift(this.getIndex.call({$:c},a));c=e}return d},getDocument:function(){return new CKEDITOR.dom.document(this.$.ownerDocument||this.$.parentNode.ownerDocument)},getIndex:function(a){function d(a,c){var p=c?a.nextSibling:a.previousSibling;return p&&p.nodeType==CKEDITOR.NODE_TEXT?b(p)?d(p, -c):p:null}function b(a){return!a.nodeValue||a.nodeValue==CKEDITOR.dom.selection.FILLING_CHAR_SEQUENCE}var c=this.$,e=-1,g;if(!this.$.parentNode||a&&c.nodeType==CKEDITOR.NODE_TEXT&&b(c)&&!d(c)&&!d(c,!0))return-1;do a&&c!=this.$&&c.nodeType==CKEDITOR.NODE_TEXT&&(g||b(c))||(e++,g=c.nodeType==CKEDITOR.NODE_TEXT);while(c=c.previousSibling);return e},getNextSourceNode:function(a,d,b){if(b&&!b.call){var c=b;b=function(a){return!a.equals(c)}}a=!a&&this.getFirst&&this.getFirst();var e;if(!a){if(this.type== -CKEDITOR.NODE_ELEMENT&&b&&!1===b(this,!0))return null;a=this.getNext()}for(;!a&&(e=(e||this).getParent());){if(b&&!1===b(e,!0))return null;a=e.getNext()}return!a||b&&!1===b(a)?null:d&&d!=a.type?a.getNextSourceNode(!1,d,b):a},getPreviousSourceNode:function(a,d,b){if(b&&!b.call){var c=b;b=function(a){return!a.equals(c)}}a=!a&&this.getLast&&this.getLast();var e;if(!a){if(this.type==CKEDITOR.NODE_ELEMENT&&b&&!1===b(this,!0))return null;a=this.getPrevious()}for(;!a&&(e=(e||this).getParent());){if(b&&!1=== -b(e,!0))return null;a=e.getPrevious()}return!a||b&&!1===b(a)?null:d&&a.type!=d?a.getPreviousSourceNode(!1,d,b):a},getPrevious:function(a){var d=this.$,b;do b=(d=d.previousSibling)&&10!=d.nodeType&&new CKEDITOR.dom.node(d);while(b&&a&&!a(b));return b},getNext:function(a){var d=this.$,b;do b=(d=d.nextSibling)&&new CKEDITOR.dom.node(d);while(b&&a&&!a(b));return b},getParent:function(a){var d=this.$.parentNode;return d&&(d.nodeType==CKEDITOR.NODE_ELEMENT||a&&d.nodeType==CKEDITOR.NODE_DOCUMENT_FRAGMENT)? -new CKEDITOR.dom.node(d):null},getParents:function(a){var d=this,b=[];do b[a?"push":"unshift"](d);while(d=d.getParent());return b},getCommonAncestor:function(a){if(a.equals(this))return this;if(a.contains&&a.contains(this))return a;var d=this.contains?this:this.getParent();do if(d.contains(a))return d;while(d=d.getParent());return null},getPosition:function(a){var d=this.$,b=a.$;if(d.compareDocumentPosition)return d.compareDocumentPosition(b);if(d==b)return CKEDITOR.POSITION_IDENTICAL;if(this.type== -CKEDITOR.NODE_ELEMENT&&a.type==CKEDITOR.NODE_ELEMENT){if(d.contains){if(d.contains(b))return CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_PRECEDING;if(b.contains(d))return CKEDITOR.POSITION_IS_CONTAINED+CKEDITOR.POSITION_FOLLOWING}if("sourceIndex"in d)return 0>d.sourceIndex||0>b.sourceIndex?CKEDITOR.POSITION_DISCONNECTED:d.sourceIndex=document.documentMode||!d||(a=d+":"+a);return new CKEDITOR.dom.nodeList(this.$.getElementsByTagName(a))},getHead:function(){var a=this.$.getElementsByTagName("head")[0]; -return a=a?new CKEDITOR.dom.element(a):this.getDocumentElement().append(new CKEDITOR.dom.element("head"),!0)},getBody:function(){return new CKEDITOR.dom.element(this.$.body)},getDocumentElement:function(){return new CKEDITOR.dom.element(this.$.documentElement)},getWindow:function(){return new CKEDITOR.dom.window(this.$.parentWindow||this.$.defaultView)},write:function(a){this.$.open("text/html","replace");CKEDITOR.env.ie&&(a=a.replace(/(?:^\s*]*?>)|^/i,'$\x26\n\x3cscript data-cke-temp\x3d"1"\x3e('+ -CKEDITOR.tools.fixDomain+")();\x3c/script\x3e"));this.$.write(a);this.$.close()},find:function(a){return new CKEDITOR.dom.nodeList(this.$.querySelectorAll(a))},findOne:function(a){return(a=this.$.querySelector(a))?new CKEDITOR.dom.element(a):null},_getHtml5ShivFrag:function(){var a=this.getCustomData("html5ShivFrag");a||(a=this.$.createDocumentFragment(),CKEDITOR.tools.enableHtml5Elements(a,!0),this.setCustomData("html5ShivFrag",a));return a}});CKEDITOR.dom.nodeList=function(a){this.$=a}; -CKEDITOR.dom.nodeList.prototype={count:function(){return this.$.length},getItem:function(a){return 0>a||a>=this.$.length?null:(a=this.$[a])?new CKEDITOR.dom.node(a):null}};CKEDITOR.dom.element=function(a,d){"string"==typeof a&&(a=(d?d.$:document).createElement(a));CKEDITOR.dom.domObject.call(this,a)};CKEDITOR.dom.element.get=function(a){return(a="string"==typeof a?document.getElementById(a)||document.getElementsByName(a)[0]:a)&&(a.$?a:new CKEDITOR.dom.element(a))};CKEDITOR.dom.element.prototype=new CKEDITOR.dom.node; -CKEDITOR.dom.element.createFromHtml=function(a,d){var b=new CKEDITOR.dom.element("div",d);b.setHtml(a);return b.getFirst().remove()};CKEDITOR.dom.element.setMarker=function(a,d,b,c){var e=d.getCustomData("list_marker_id")||d.setCustomData("list_marker_id",CKEDITOR.tools.getNextNumber()).getCustomData("list_marker_id"),g=d.getCustomData("list_marker_names")||d.setCustomData("list_marker_names",{}).getCustomData("list_marker_names");a[e]=d;g[b]=1;return d.setCustomData(b,c)}; -CKEDITOR.dom.element.clearAllMarkers=function(a){for(var d in a)CKEDITOR.dom.element.clearMarkers(a,a[d],1)};CKEDITOR.dom.element.clearMarkers=function(a,d,b){var c=d.getCustomData("list_marker_names"),e=d.getCustomData("list_marker_id"),g;for(g in c)d.removeCustomData(g);d.removeCustomData("list_marker_names");b&&(d.removeCustomData("list_marker_id"),delete a[e])}; -(function(){function a(a,b){return-1<(" "+a+" ").replace(g," ").indexOf(" "+b+" ")}function d(a){var b=!0;a.$.id||(a.$.id="cke_tmp_"+CKEDITOR.tools.getNextNumber(),b=!1);return function(){b||a.removeAttribute("id")}}function b(a,b){var c=CKEDITOR.tools.escapeCss(a.$.id);return"#"+c+" "+b.split(/,\s*/).join(", #"+c+" ")}function c(a){for(var b=0,c=0,f=k[a].length;cCKEDITOR.env.version?this.$.text+=a:this.append(new CKEDITOR.dom.text(a))},appendBogus:function(a){if(a||CKEDITOR.env.needsBrFiller){for(a=this.getLast();a&&a.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.rtrim(a.getText());)a=a.getPrevious();a&&a.is&&a.is("br")||(a=this.getDocument().createElement("br"),CKEDITOR.env.gecko&&a.setAttribute("type","_moz"),this.append(a))}},breakParent:function(a,b){var c=new CKEDITOR.dom.range(this.getDocument());c.setStartAfter(this);c.setEndAfter(a); -var f=c.extractContents(!1,b||!1),d;c.insertNode(this.remove());if(CKEDITOR.env.ie&&!CKEDITOR.env.edge){for(c=new CKEDITOR.dom.element("div");d=f.getFirst();)d.$.style.backgroundColor&&(d.$.style.backgroundColor=d.$.style.backgroundColor),c.append(d);c.insertAfter(this);c.remove(!0)}else f.insertAfterNode(this)},contains:document.compareDocumentPosition?function(a){return!!(this.$.compareDocumentPosition(a.$)&16)}:function(a){var b=this.$;return a.type!=CKEDITOR.NODE_ELEMENT?b.contains(a.getParent().$): -b!=a.$&&b.contains(a.$)},focus:function(){function a(){try{this.$.focus()}catch(b){}}return function(b){b?CKEDITOR.tools.setTimeout(a,100,this):a.call(this)}}(),getHtml:function(){var a=this.$.innerHTML;return CKEDITOR.env.ie?a.replace(/<\?[^>]*>/g,""):a},getOuterHtml:function(){if(this.$.outerHTML)return this.$.outerHTML.replace(/<\?[^>]*>/,"");var a=this.$.ownerDocument.createElement("div");a.appendChild(this.$.cloneNode(!0));return a.innerHTML},getClientRect:function(){var a=CKEDITOR.tools.extend({}, -this.$.getBoundingClientRect());!a.width&&(a.width=a.right-a.left);!a.height&&(a.height=a.bottom-a.top);return a},setHtml:CKEDITOR.env.ie&&9>CKEDITOR.env.version?function(a){try{var b=this.$;if(this.getParent())return b.innerHTML=a;var c=this.getDocument()._getHtml5ShivFrag();c.appendChild(b);b.innerHTML=a;c.removeChild(b);return a}catch(f){this.$.innerHTML="";b=new CKEDITOR.dom.element("body",this.getDocument());b.$.innerHTML=a;for(b=b.getChildren();b.count();)this.append(b.getItem(0));return a}}: -function(a){return this.$.innerHTML=a},setText:function(){var a=document.createElement("p");a.innerHTML="x";a=a.textContent;return function(b){this.$[a?"textContent":"innerText"]=b}}(),getAttribute:function(){var a=function(a){return this.$.getAttribute(a,2)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?function(a){switch(a){case "class":a="className";break;case "http-equiv":a="httpEquiv";break;case "name":return this.$.name;case "tabindex":return a=this.$.getAttribute(a, -2),0!==a&&0===this.$.tabIndex&&(a=null),a;case "checked":return a=this.$.attributes.getNamedItem(a),(a.specified?a.nodeValue:this.$.checked)?"checked":null;case "hspace":case "value":return this.$[a];case "style":return this.$.style.cssText;case "contenteditable":case "contentEditable":return this.$.attributes.getNamedItem("contentEditable").specified?this.$.getAttribute("contentEditable"):null}return this.$.getAttribute(a,2)}:a}(),getAttributes:function(a){var b={},c=this.$.attributes,f;a=CKEDITOR.tools.isArray(a)? -a:[];for(f=0;f=document.documentMode){var b=this.$.scopeName;"HTML"!=b&&(a=b.toLowerCase()+":"+a)}this.getName=function(){return a};return this.getName()},getValue:function(){return this.$.value},getFirst:function(a){var b=this.$.firstChild;(b=b&&new CKEDITOR.dom.node(b))&&a&&!a(b)&&(b=b.getNext(a));return b},getLast:function(a){var b=this.$.lastChild;(b=b&&new CKEDITOR.dom.node(b))&&a&&!a(b)&&(b=b.getPrevious(a));return b},getStyle:function(a){return this.$.style[CKEDITOR.tools.cssStyleToDomStyle(a)]}, -is:function(){var a=this.getName();if("object"==typeof arguments[0])return!!arguments[0][a];for(var b=0;bCKEDITOR.env.version&&this.is("a")){var c=this.getParent();c.type==CKEDITOR.NODE_ELEMENT&&(c=c.clone(),c.setHtml(b),b=c.getHtml(),c.setHtml(a),a=c.getHtml())}return b==a},isVisible:function(){var a=(this.$.offsetHeight||this.$.offsetWidth)&&"hidden"!=this.getComputedStyle("visibility"),b,c;a&&CKEDITOR.env.webkit&&(b=this.getWindow(),!b.equals(CKEDITOR.document.getWindow())&&(c=b.$.frameElement)&&(a=(new CKEDITOR.dom.element(c)).isVisible()));return!!a},isEmptyInlineRemoveable:function(){if(!CKEDITOR.dtd.$removeEmpty[this.getName()])return!1; -for(var a=this.getChildren(),b=0,c=a.count();bCKEDITOR.env.version?function(b){return"name"==b?!!this.$.name:a.call(this,b)}:a:function(a){return!!this.$.attributes.getNamedItem(a)}}(),hide:function(){this.setStyle("display","none")},moveChildren:function(a,b){var c=this.$;a=a.$;if(c!=a){var f;if(b)for(;f=c.lastChild;)a.insertBefore(c.removeChild(f),a.firstChild);else for(;f=c.firstChild;)a.appendChild(c.removeChild(f))}},mergeSiblings:function(){function a(b,c,f){if(c&&c.type==CKEDITOR.NODE_ELEMENT){for(var d= -[];c.data("cke-bookmark")||c.isEmptyInlineRemoveable();)if(d.push(c),c=f?c.getNext():c.getPrevious(),!c||c.type!=CKEDITOR.NODE_ELEMENT)return;if(b.isIdentical(c)){for(var h=f?b.getLast():b.getFirst();d.length;)d.shift().move(b,!f);c.moveChildren(b,!f);c.remove();h&&h.type==CKEDITOR.NODE_ELEMENT&&h.mergeSiblings()}}}return function(b){if(!1===b||CKEDITOR.dtd.$removeEmpty[this.getName()]||this.is("a"))a(this,this.getNext(),!0),a(this,this.getPrevious())}}(),show:function(){this.setStyles({display:"", -visibility:""})},setAttribute:function(){var a=function(a,b){this.$.setAttribute(a,b);return this};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?function(b,c){"class"==b?this.$.className=c:"style"==b?this.$.style.cssText=c:"tabindex"==b?this.$.tabIndex=c:"checked"==b?this.$.checked=c:"contenteditable"==b?a.call(this,"contentEditable",c):a.apply(this,arguments);return this}:CKEDITOR.env.ie8Compat&&CKEDITOR.env.secure?function(b,c){if("src"==b&&c.match(/^http:\/\//))try{a.apply(this, -arguments)}catch(f){}else a.apply(this,arguments);return this}:a}(),setAttributes:function(a){for(var b in a)this.setAttribute(b,a[b]);return this},setValue:function(a){this.$.value=a;return this},removeAttribute:function(){var a=function(a){this.$.removeAttribute(a)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?function(a){"class"==a?a="className":"tabindex"==a?a="tabIndex":"contenteditable"==a&&(a="contentEditable");this.$.removeAttribute(a)}:a}(),removeAttributes:function(a){if(CKEDITOR.tools.isArray(a))for(var b= -0;bCKEDITOR.env.version?(a=Math.round(100*a),this.setStyle("filter",100<=a?"":"progid:DXImageTransform.Microsoft.Alpha(opacity\x3d"+a+")")):this.setStyle("opacity",a)},unselectable:function(){this.setStyles(CKEDITOR.tools.cssVendorPrefix("user-select", -"none"));if(CKEDITOR.env.ie){this.setAttribute("unselectable","on");for(var a,b=this.getElementsByTag("*"),c=0,f=b.count();cz||0z?z:d);c&&(0>e||0e?e:f,0)},setState:function(a,b,c){b=b||"cke";switch(a){case CKEDITOR.TRISTATE_ON:this.addClass(b+"_on");this.removeClass(b+ -"_off");this.removeClass(b+"_disabled");c&&this.setAttribute("aria-pressed",!0);c&&this.removeAttribute("aria-disabled");break;case CKEDITOR.TRISTATE_DISABLED:this.addClass(b+"_disabled");this.removeClass(b+"_off");this.removeClass(b+"_on");c&&this.setAttribute("aria-disabled",!0);c&&this.removeAttribute("aria-pressed");break;default:this.addClass(b+"_off"),this.removeClass(b+"_on"),this.removeClass(b+"_disabled"),c&&this.removeAttribute("aria-pressed"),c&&this.removeAttribute("aria-disabled")}}, -getFrameDocument:function(){var a=this.$;try{a.contentWindow.document}catch(b){a.src=a.src}return a&&new CKEDITOR.dom.document(a.contentWindow.document)},copyAttributes:function(a,b){var c=this.$.attributes;b=b||{};for(var f=0;f=n.getChildCount()?(n=n.getChild(A-1),D=!0):n=n.getChild(A):H=D=!0;q.type==CKEDITOR.NODE_TEXT?l?p=!0:q.split(t):0fa)for(;X;)X=m(X,K,!0);K=L}l||h()}}function b(){var a=!1,b=CKEDITOR.dom.walker.whitespaces(), -c=CKEDITOR.dom.walker.bookmark(!0),d=CKEDITOR.dom.walker.bogus();return function(e){return c(e)||b(e)?!0:d(e)&&!a?a=!0:e.type==CKEDITOR.NODE_TEXT&&(e.hasAscendant("pre")||CKEDITOR.tools.trim(e.getText()).length)||e.type==CKEDITOR.NODE_ELEMENT&&!e.is(g)?!1:!0}}function c(a){var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(1);return function(d){return c(d)||b(d)?!0:!a&&k(d)||d.type==CKEDITOR.NODE_ELEMENT&&d.is(CKEDITOR.dtd.$removeEmpty)}}function e(a){return function(){var b;return this[a? -"getPreviousNode":"getNextNode"](function(a){!b&&r(a)&&(b=a);return p(a)&&!(k(a)&&a.equals(b))})}}var g={abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,"var":1},k=CKEDITOR.dom.walker.bogus(),h=/^[\t\r\n ]*(?: |\xa0)$/,p=CKEDITOR.dom.walker.editable(),r=CKEDITOR.dom.walker.ignored(!0);CKEDITOR.dom.range.prototype={clone:function(){var a=new CKEDITOR.dom.range(this.root);a._setStartContainer(this.startContainer); -a.startOffset=this.startOffset;a._setEndContainer(this.endContainer);a.endOffset=this.endOffset;a.collapsed=this.collapsed;return a},collapse:function(a){a?(this._setEndContainer(this.startContainer),this.endOffset=this.startOffset):(this._setStartContainer(this.endContainer),this.startOffset=this.endOffset);this.collapsed=!0},cloneContents:function(a){var b=new CKEDITOR.dom.documentFragment(this.document);this.collapsed||d(this,2,b,!1,"undefined"==typeof a?!0:a);return b},deleteContents:function(a){this.collapsed|| -d(this,0,null,a)},extractContents:function(a,b){var c=new CKEDITOR.dom.documentFragment(this.document);this.collapsed||d(this,1,c,a,"undefined"==typeof b?!0:b);return c},createBookmark:function(a){var b,c,d,e,m=this.collapsed;b=this.document.createElement("span");b.data("cke-bookmark",1);b.setStyle("display","none");b.setHtml("\x26nbsp;");a&&(d="cke_bm_"+CKEDITOR.tools.getNextNumber(),b.setAttribute("id",d+(m?"C":"S")));m||(c=b.clone(),c.setHtml("\x26nbsp;"),a&&c.setAttribute("id",d+"E"),e=this.clone(), -e.collapse(),e.insertNode(c));e=this.clone();e.collapse(!0);e.insertNode(b);c?(this.setStartAfter(b),this.setEndBefore(c)):this.moveToPosition(b,CKEDITOR.POSITION_AFTER_END);return{startNode:a?d+(m?"C":"S"):b,endNode:a?d+"E":c,serializable:a,collapsed:m}},createBookmark2:function(){function a(b){var f=b.container,d=b.offset,e;e=f;var g=d;e=e.type!=CKEDITOR.NODE_ELEMENT||0===g||g==e.getChildCount()?0:e.getChild(g-1).type==CKEDITOR.NODE_TEXT&&e.getChild(g).type==CKEDITOR.NODE_TEXT;e&&(f=f.getChild(d- -1),d=f.getLength());if(f.type==CKEDITOR.NODE_ELEMENT&&0=a.offset&&(a.offset=d.getIndex(),a.container=d.getParent()))}}var c=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_TEXT,!0);return function(c){var d=this.collapsed,e={container:this.startContainer,offset:this.startOffset},g={container:this.endContainer,offset:this.endOffset};c&&(a(e),b(e,this.root),d||(a(g),b(g,this.root)));return{start:e.container.getAddress(c),end:d?null:g.container.getAddress(c), -startOffset:e.offset,endOffset:g.offset,normalized:c,collapsed:d,is2:!0}}}(),moveToBookmark:function(a){if(a.is2){var b=this.document.getByAddress(a.start,a.normalized),c=a.startOffset,d=a.end&&this.document.getByAddress(a.end,a.normalized);a=a.endOffset;this.setStart(b,c);d?this.setEnd(d,a):this.collapse(!0)}else b=(c=a.serializable)?this.document.getById(a.startNode):a.startNode,a=c?this.document.getById(a.endNode):a.endNode,this.setStartBefore(b),b.remove(),a?(this.setEndBefore(a),a.remove()): -this.collapse(!0)},getBoundaryNodes:function(){var a=this.startContainer,b=this.endContainer,c=this.startOffset,d=this.endOffset,e;if(a.type==CKEDITOR.NODE_ELEMENT)if(e=a.getChildCount(),e>c)a=a.getChild(c);else if(1>e)a=a.getPreviousSourceNode();else{for(a=a.$;a.lastChild;)a=a.lastChild;a=new CKEDITOR.dom.node(a);a=a.getNextSourceNode()||a}if(b.type==CKEDITOR.NODE_ELEMENT)if(e=b.getChildCount(),e>d)b=b.getChild(d).getPreviousSourceNode(!0);else if(1>e)b=b.getPreviousSourceNode();else{for(b=b.$;b.lastChild;)b= -b.lastChild;b=new CKEDITOR.dom.node(b)}a.getPosition(b)&CKEDITOR.POSITION_FOLLOWING&&(a=b);return{startNode:a,endNode:b}},getCommonAncestor:function(a,b){var c=this.startContainer,d=this.endContainer,c=c.equals(d)?a&&c.type==CKEDITOR.NODE_ELEMENT&&this.startOffset==this.endOffset-1?c.getChild(this.startOffset):c:c.getCommonAncestor(d);return b&&!c.is?c.getParent():c},optimize:function(){var a=this.startContainer,b=this.startOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=a.getLength()&&this.setStartAfter(a): -this.setStartBefore(a));a=this.endContainer;b=this.endOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=a.getLength()&&this.setEndAfter(a):this.setEndBefore(a))},optimizeBookmark:function(){var a=this.startContainer,b=this.endContainer;a.is&&a.is("span")&&a.data("cke-bookmark")&&this.setStartAt(a,CKEDITOR.POSITION_BEFORE_START);b&&b.is&&b.is("span")&&b.data("cke-bookmark")&&this.setEndAt(b,CKEDITOR.POSITION_AFTER_END)},trim:function(a,b){var c=this.startContainer,d=this.startOffset,e=this.collapsed;if((!a|| -e)&&c&&c.type==CKEDITOR.NODE_TEXT){if(d)if(d>=c.getLength())d=c.getIndex()+1,c=c.getParent();else{var m=c.split(d),d=c.getIndex()+1,c=c.getParent();this.startContainer.equals(this.endContainer)?this.setEnd(m,this.endOffset-this.startOffset):c.equals(this.endContainer)&&(this.endOffset+=1)}else d=c.getIndex(),c=c.getParent();this.setStart(c,d);if(e){this.collapse(!0);return}}c=this.endContainer;d=this.endOffset;b||e||!c||c.type!=CKEDITOR.NODE_TEXT||(d?(d>=c.getLength()||c.split(d),d=c.getIndex()+1): -d=c.getIndex(),c=c.getParent(),this.setEnd(c,d))},enlarge:function(a,b){function c(a){return a&&a.type==CKEDITOR.NODE_ELEMENT&&a.hasAttribute("contenteditable")?null:a}var d=new RegExp(/[^\s\ufeff]/);switch(a){case CKEDITOR.ENLARGE_INLINE:var e=1;case CKEDITOR.ENLARGE_ELEMENT:var m=function(a,b){var c=new CKEDITOR.dom.range(h);c.setStart(a,b);c.setEndAt(h,CKEDITOR.POSITION_BEFORE_END);var c=new CKEDITOR.dom.walker(c),f;for(c.guard=function(a){return!(a.type==CKEDITOR.NODE_ELEMENT&&a.isBlockBoundary())};f= -c.next();){if(f.type!=CKEDITOR.NODE_TEXT)return!1;C=f!=a?f.getText():f.substring(b);if(d.test(C))return!1}return!0};if(this.collapsed)break;var g=this.getCommonAncestor(),h=this.root,k,r,l,q,n,t=!1,A,C;A=this.startContainer;var D=this.startOffset;A.type==CKEDITOR.NODE_TEXT?(D&&(A=!CKEDITOR.tools.trim(A.substring(0,D)).length&&A,t=!!A),A&&((q=A.getPrevious())||(l=A.getParent()))):(D&&(q=A.getChild(D-1)||A.getLast()),q||(l=A));for(l=c(l);l||q;){if(l&&!q){!n&&l.equals(g)&&(n=!0);if(e?l.isBlockBoundary(): -!h.contains(l))break;t&&"inline"==l.getComputedStyle("display")||(t=!1,n?k=l:this.setStartBefore(l));q=l.getPrevious()}for(;q;)if(A=!1,q.type==CKEDITOR.NODE_COMMENT)q=q.getPrevious();else{if(q.type==CKEDITOR.NODE_TEXT)C=q.getText(),d.test(C)&&(q=null),A=/[\s\ufeff]$/.test(C);else if((q.$.offsetWidth>(CKEDITOR.env.webkit?1:0)||b&&q.is("br"))&&!q.data("cke-bookmark"))if(t&&CKEDITOR.dtd.$removeEmpty[q.getName()]){C=q.getText();if(d.test(C))q=null;else for(var D=q.$.getElementsByTagName("*"),M=0,H;H= -D[M++];)if(!CKEDITOR.dtd.$removeEmpty[H.nodeName.toLowerCase()]){q=null;break}q&&(A=!!C.length)}else q=null;A&&(t?n?k=l:l&&this.setStartBefore(l):t=!0);if(q){A=q.getPrevious();if(!l&&!A){l=q;q=null;break}q=A}else l=null}l&&(l=c(l.getParent()))}A=this.endContainer;D=this.endOffset;l=q=null;n=t=!1;A.type==CKEDITOR.NODE_TEXT?CKEDITOR.tools.trim(A.substring(D)).length?t=!0:(t=!A.getLength(),D==A.getLength()?(q=A.getNext())||(l=A.getParent()):m(A,D)&&(l=A.getParent())):(q=A.getChild(D))||(l=A);for(;l|| -q;){if(l&&!q){!n&&l.equals(g)&&(n=!0);if(e?l.isBlockBoundary():!h.contains(l))break;t&&"inline"==l.getComputedStyle("display")||(t=!1,n?r=l:l&&this.setEndAfter(l));q=l.getNext()}for(;q;){A=!1;if(q.type==CKEDITOR.NODE_TEXT)C=q.getText(),m(q,0)||(q=null),A=/^[\s\ufeff]/.test(C);else if(q.type==CKEDITOR.NODE_ELEMENT){if((0=e.getLength()?d.setStartAfter(e):(d.setStartBefore(e),k=0):d.setStartBefore(e));m&&m.type==CKEDITOR.NODE_TEXT&&(h?h>=m.getLength()?d.setEndAfter(m): -(d.setEndAfter(m),r=0):d.setEndBefore(m));var d=new CKEDITOR.dom.walker(d),l=CKEDITOR.dom.walker.bookmark();d.evaluator=function(b){return b.type==(a==CKEDITOR.SHRINK_ELEMENT?CKEDITOR.NODE_ELEMENT:CKEDITOR.NODE_TEXT)};var q;d.guard=function(b,d){if(l(b))return!0;if(a==CKEDITOR.SHRINK_ELEMENT&&b.type==CKEDITOR.NODE_TEXT||d&&b.equals(q)||!1===c&&b.type==CKEDITOR.NODE_ELEMENT&&b.isBlockBoundary()||b.type==CKEDITOR.NODE_ELEMENT&&b.hasAttribute("contenteditable"))return!1;d||b.type!=CKEDITOR.NODE_ELEMENT|| -(q=b);return!0};k&&(e=d[a==CKEDITOR.SHRINK_ELEMENT?"lastForward":"next"]())&&this.setStartAt(e,b?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_START);r&&(d.reset(),(d=d[a==CKEDITOR.SHRINK_ELEMENT?"lastBackward":"previous"]())&&this.setEndAt(d,b?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_END));return!(!k&&!r)}},insertNode:function(a){this.optimizeBookmark();this.trim(!1,!0);var b=this.startContainer,c=b.getChild(this.startOffset);c?a.insertBefore(c):b.append(a);a.getParent()&&a.getParent().equals(this.endContainer)&& -this.endOffset++;this.setStartBefore(a)},moveToPosition:function(a,b){this.setStartAt(a,b);this.collapse(!0)},moveToRange:function(a){this.setStart(a.startContainer,a.startOffset);this.setEnd(a.endContainer,a.endOffset)},selectNodeContents:function(a){this.setStart(a,0);this.setEnd(a,a.type==CKEDITOR.NODE_TEXT?a.getLength():a.getChildCount())},setStart:function(b,c){b.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[b.getName()]&&(c=b.getIndex(),b=b.getParent());this._setStartContainer(b);this.startOffset= -c;this.endContainer||(this._setEndContainer(b),this.endOffset=c);a(this)},setEnd:function(b,c){b.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[b.getName()]&&(c=b.getIndex()+1,b=b.getParent());this._setEndContainer(b);this.endOffset=c;this.startContainer||(this._setStartContainer(b),this.startOffset=c);a(this)},setStartAfter:function(a){this.setStart(a.getParent(),a.getIndex()+1)},setStartBefore:function(a){this.setStart(a.getParent(),a.getIndex())},setEndAfter:function(a){this.setEnd(a.getParent(), -a.getIndex()+1)},setEndBefore:function(a){this.setEnd(a.getParent(),a.getIndex())},setStartAt:function(b,c){switch(c){case CKEDITOR.POSITION_AFTER_START:this.setStart(b,0);break;case CKEDITOR.POSITION_BEFORE_END:b.type==CKEDITOR.NODE_TEXT?this.setStart(b,b.getLength()):this.setStart(b,b.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setStartBefore(b);break;case CKEDITOR.POSITION_AFTER_END:this.setStartAfter(b)}a(this)},setEndAt:function(b,c){switch(c){case CKEDITOR.POSITION_AFTER_START:this.setEnd(b, -0);break;case CKEDITOR.POSITION_BEFORE_END:b.type==CKEDITOR.NODE_TEXT?this.setEnd(b,b.getLength()):this.setEnd(b,b.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setEndBefore(b);break;case CKEDITOR.POSITION_AFTER_END:this.setEndAfter(b)}a(this)},fixBlock:function(a,b){var c=this.createBookmark(),d=this.document.createElement(b);this.collapse(a);this.enlarge(CKEDITOR.ENLARGE_BLOCK_CONTENTS);this.extractContents().appendTo(d);d.trim();this.insertNode(d);var e=d.getBogus();e&&e.remove(); -d.appendBogus();this.moveToBookmark(c);return d},splitBlock:function(a,b){var c=new CKEDITOR.dom.elementPath(this.startContainer,this.root),d=new CKEDITOR.dom.elementPath(this.endContainer,this.root),e=c.block,m=d.block,g=null;if(!c.blockLimit.equals(d.blockLimit))return null;"br"!=a&&(e||(e=this.fixBlock(!0,a),m=(new CKEDITOR.dom.elementPath(this.endContainer,this.root)).block),m||(m=this.fixBlock(!1,a)));c=e&&this.checkStartOfBlock();d=m&&this.checkEndOfBlock();this.deleteContents();e&&e.equals(m)&& -(d?(g=new CKEDITOR.dom.elementPath(this.startContainer,this.root),this.moveToPosition(m,CKEDITOR.POSITION_AFTER_END),m=null):c?(g=new CKEDITOR.dom.elementPath(this.startContainer,this.root),this.moveToPosition(e,CKEDITOR.POSITION_BEFORE_START),e=null):(m=this.splitElement(e,b||!1),e.is("ul","ol")||e.appendBogus()));return{previousBlock:e,nextBlock:m,wasStartOfBlock:c,wasEndOfBlock:d,elementPath:g}},splitElement:function(a,b){if(!this.collapsed)return null;this.setEndAt(a,CKEDITOR.POSITION_BEFORE_END); -var c=this.extractContents(!1,b||!1),d=a.clone(!1,b||!1);c.appendTo(d);d.insertAfter(a);this.moveToPosition(a,CKEDITOR.POSITION_AFTER_END);return d},removeEmptyBlocksAtEnd:function(){function a(d){return function(a){return b(a)||c(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.isEmptyInlineRemoveable()||d.is("table")&&a.is("caption")?!1:!0}}var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(!1);return function(b){for(var c=this.createBookmark(),d=this[b?"endPath":"startPath"](),e=d.block|| -d.blockLimit,g;e&&!e.equals(d.root)&&!e.getFirst(a(e));)g=e.getParent(),this[b?"setEndAt":"setStartAt"](e,CKEDITOR.POSITION_AFTER_END),e.remove(1),e=g;this.moveToBookmark(c)}}(),startPath:function(){return new CKEDITOR.dom.elementPath(this.startContainer,this.root)},endPath:function(){return new CKEDITOR.dom.elementPath(this.endContainer,this.root)},checkBoundaryOfElement:function(a,b){var d=b==CKEDITOR.START,e=this.clone();e.collapse(d);e[d?"setStartAt":"setEndAt"](a,d?CKEDITOR.POSITION_AFTER_START: -CKEDITOR.POSITION_BEFORE_END);e=new CKEDITOR.dom.walker(e);e.evaluator=c(d);return e[d?"checkBackward":"checkForward"]()},checkStartOfBlock:function(){var a=this.startContainer,c=this.startOffset;CKEDITOR.env.ie&&c&&a.type==CKEDITOR.NODE_TEXT&&(a=CKEDITOR.tools.ltrim(a.substring(0,c)),h.test(a)&&this.trim(0,1));this.trim();a=new CKEDITOR.dom.elementPath(this.startContainer,this.root);c=this.clone();c.collapse(!0);c.setStartAt(a.block||a.blockLimit,CKEDITOR.POSITION_AFTER_START);a=new CKEDITOR.dom.walker(c); -a.evaluator=b();return a.checkBackward()},checkEndOfBlock:function(){var a=this.endContainer,c=this.endOffset;CKEDITOR.env.ie&&a.type==CKEDITOR.NODE_TEXT&&(a=CKEDITOR.tools.rtrim(a.substring(c)),h.test(a)&&this.trim(1,0));this.trim();a=new CKEDITOR.dom.elementPath(this.endContainer,this.root);c=this.clone();c.collapse(!1);c.setEndAt(a.block||a.blockLimit,CKEDITOR.POSITION_BEFORE_END);a=new CKEDITOR.dom.walker(c);a.evaluator=b();return a.checkForward()},getPreviousNode:function(a,b,c){var d=this.clone(); -d.collapse(1);d.setStartAt(c||this.root,CKEDITOR.POSITION_AFTER_START);c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.previous()},getNextNode:function(a,b,c){var d=this.clone();d.collapse();d.setEndAt(c||this.root,CKEDITOR.POSITION_BEFORE_END);c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.next()},checkReadOnly:function(){function a(b,c){for(;b;){if(b.type==CKEDITOR.NODE_ELEMENT){if("false"==b.getAttribute("contentEditable")&&!b.data("cke-editable"))return 0;if(b.is("html")|| -"true"==b.getAttribute("contentEditable")&&(b.contains(c)||b.equals(c)))break}b=b.getParent()}return 1}return function(){var b=this.startContainer,c=this.endContainer;return!(a(b,c)&&a(c,b))}}(),moveToElementEditablePosition:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&!a.isEditable(!1))return this.moveToPosition(a,b?CKEDITOR.POSITION_AFTER_END:CKEDITOR.POSITION_BEFORE_START),!0;for(var c=0;a;){if(a.type==CKEDITOR.NODE_TEXT){b&&this.endContainer&&this.checkEndOfBlock()&&h.test(a.getText())?this.moveToPosition(a, -CKEDITOR.POSITION_BEFORE_START):this.moveToPosition(a,b?CKEDITOR.POSITION_AFTER_END:CKEDITOR.POSITION_BEFORE_START);c=1;break}if(a.type==CKEDITOR.NODE_ELEMENT)if(a.isEditable())this.moveToPosition(a,b?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_START),c=1;else if(b&&a.is("br")&&this.endContainer&&this.checkEndOfBlock())this.moveToPosition(a,CKEDITOR.POSITION_BEFORE_START);else if("false"==a.getAttribute("contenteditable")&&a.is(CKEDITOR.dtd.$block))return this.setStartBefore(a),this.setEndAfter(a), -!0;var d=a,e=c,m=void 0;d.type==CKEDITOR.NODE_ELEMENT&&d.isEditable(!1)&&(m=d[b?"getLast":"getFirst"](r));e||m||(m=d[b?"getPrevious":"getNext"](r));a=m}return!!c},moveToClosestEditablePosition:function(a,b){var c,d=0,e,m,g=[CKEDITOR.POSITION_AFTER_END,CKEDITOR.POSITION_BEFORE_START];a?(c=new CKEDITOR.dom.range(this.root),c.moveToPosition(a,g[b?0:1])):c=this.clone();if(a&&!a.is(CKEDITOR.dtd.$block))d=1;else if(e=c[b?"getNextEditableNode":"getPreviousEditableNode"]())d=1,(m=e.type==CKEDITOR.NODE_ELEMENT)&& -e.is(CKEDITOR.dtd.$block)&&"false"==e.getAttribute("contenteditable")?(c.setStartAt(e,CKEDITOR.POSITION_BEFORE_START),c.setEndAt(e,CKEDITOR.POSITION_AFTER_END)):!CKEDITOR.env.needsBrFiller&&m&&e.is(CKEDITOR.dom.walker.validEmptyBlockContainers)?(c.setEnd(e,0),c.collapse()):c.moveToPosition(e,g[b?1:0]);d&&this.moveToRange(c);return!!d},moveToElementEditStart:function(a){return this.moveToElementEditablePosition(a)},moveToElementEditEnd:function(a){return this.moveToElementEditablePosition(a,!0)},getEnclosedNode:function(){var a= -this.clone();a.optimize();if(a.startContainer.type!=CKEDITOR.NODE_ELEMENT||a.endContainer.type!=CKEDITOR.NODE_ELEMENT)return null;var a=new CKEDITOR.dom.walker(a),b=CKEDITOR.dom.walker.bookmark(!1,!0),c=CKEDITOR.dom.walker.whitespaces(!0);a.evaluator=function(a){return c(a)&&b(a)};var d=a.next();a.reset();return d&&d.equals(a.previous())?d:null},getTouchedStartNode:function(){var a=this.startContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.startOffset)||a},getTouchedEndNode:function(){var a= -this.endContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.endOffset-1)||a},getNextEditableNode:e(),getPreviousEditableNode:e(1),scrollIntoView:function(){var a=new CKEDITOR.dom.element.createFromHtml("\x3cspan\x3e\x26nbsp;\x3c/span\x3e",this.document),b,c,d,e=this.clone();e.optimize();(d=e.startContainer.type==CKEDITOR.NODE_TEXT)?(c=e.startContainer.getText(),b=e.startContainer.split(e.startOffset),a.insertAfter(e.startContainer)):e.insertNode(a);a.scrollIntoView(); -d&&(e.startContainer.setText(c),b.remove());a.remove()},_setStartContainer:function(a){this.startContainer=a},_setEndContainer:function(a){this.endContainer=a},_find:function(a,b){var c=this.getCommonAncestor(),d=this.getBoundaryNodes(),e=[],m,g,h,k;if(c&&c.find)for(g=c.find(a),m=0;marguments.length||(this.range=a,this.forceBrBreak=0,this.enlargeBr=1,this.enforceRealBlocks=0,this._||(this._={}))}function d(a){var b=[];a.forEach(function(a){if("true"==a.getAttribute("contenteditable"))return b.push(a),!1},CKEDITOR.NODE_ELEMENT,!0);return b}function b(a,c,e,g){a:{null==g&&(g=d(e));for(var h;h=g.shift();)if(h.getDtd().p){g={element:h,remaining:g};break a}g=null}if(!g)return 0;if((h=CKEDITOR.filter.instances[g.element.data("cke-filter")])&&!h.check(c))return b(a, -c,e,g.remaining);c=new CKEDITOR.dom.range(g.element);c.selectNodeContents(g.element);c=c.createIterator();c.enlargeBr=a.enlargeBr;c.enforceRealBlocks=a.enforceRealBlocks;c.activeFilter=c.filter=h;a._.nestedEditable={element:g.element,container:e,remaining:g.remaining,iterator:c};return 1}function c(a,b,c){if(!b)return!1;a=a.clone();a.collapse(!c);return a.checkBoundaryOfElement(b,c?CKEDITOR.START:CKEDITOR.END)}var e=/^[\r\n\t ]+$/,g=CKEDITOR.dom.walker.bookmark(!1,!0),k=CKEDITOR.dom.walker.whitespaces(!0), -h=function(a){return g(a)&&k(a)},p={dd:1,dt:1,li:1};a.prototype={getNextParagraph:function(a){var d,k,u,z,y;a=a||"p";if(this._.nestedEditable){if(d=this._.nestedEditable.iterator.getNextParagraph(a))return this.activeFilter=this._.nestedEditable.iterator.activeFilter,d;this.activeFilter=this.filter;if(b(this,a,this._.nestedEditable.container,this._.nestedEditable.remaining))return this.activeFilter=this._.nestedEditable.iterator.activeFilter,this._.nestedEditable.iterator.getNextParagraph(a);this._.nestedEditable= -null}if(!this.range.root.getDtd()[a])return null;if(!this._.started){var m=this.range.clone();k=m.startPath();var x=m.endPath(),J=!m.collapsed&&c(m,k.block),w=!m.collapsed&&c(m,x.block,1);m.shrink(CKEDITOR.SHRINK_ELEMENT,!0);J&&m.setStartAt(k.block,CKEDITOR.POSITION_BEFORE_END);w&&m.setEndAt(x.block,CKEDITOR.POSITION_AFTER_START);k=m.endContainer.hasAscendant("pre",!0)||m.startContainer.hasAscendant("pre",!0);m.enlarge(this.forceBrBreak&&!k||!this.enlargeBr?CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:CKEDITOR.ENLARGE_BLOCK_CONTENTS); -m.collapsed||(k=new CKEDITOR.dom.walker(m.clone()),x=CKEDITOR.dom.walker.bookmark(!0,!0),k.evaluator=x,this._.nextNode=k.next(),k=new CKEDITOR.dom.walker(m.clone()),k.evaluator=x,k=k.previous(),this._.lastNode=k.getNextSourceNode(!0,null,m.root),this._.lastNode&&this._.lastNode.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(this._.lastNode.getText())&&this._.lastNode.getParent().isBlockBoundary()&&(x=this.range.clone(),x.moveToPosition(this._.lastNode,CKEDITOR.POSITION_AFTER_END),x.checkEndOfBlock()&& -(x=new CKEDITOR.dom.elementPath(x.endContainer,x.root),this._.lastNode=(x.block||x.blockLimit).getNextSourceNode(!0))),this._.lastNode&&m.root.contains(this._.lastNode)||(this._.lastNode=this._.docEndMarker=m.document.createText(""),this._.lastNode.insertAfter(k)),m=null);this._.started=1;k=m}x=this._.nextNode;m=this._.lastNode;for(this._.nextNode=null;x;){var J=0,w=x.hasAscendant("pre"),F=x.type!=CKEDITOR.NODE_ELEMENT,l=0;if(F)x.type==CKEDITOR.NODE_TEXT&&e.test(x.getText())&&(F=0);else{var q=x.getName(); -if(CKEDITOR.dtd.$block[q]&&"false"==x.getAttribute("contenteditable")){d=x;b(this,a,d);break}else if(x.isBlockBoundary(this.forceBrBreak&&!w&&{br:1})){if("br"==q)F=1;else if(!k&&!x.getChildCount()&&"hr"!=q){d=x;u=x.equals(m);break}k&&(k.setEndAt(x,CKEDITOR.POSITION_BEFORE_START),"br"!=q&&(this._.nextNode=x));J=1}else{if(x.getFirst()){k||(k=this.range.clone(),k.setStartAt(x,CKEDITOR.POSITION_BEFORE_START));x=x.getFirst();continue}F=1}}F&&!k&&(k=this.range.clone(),k.setStartAt(x,CKEDITOR.POSITION_BEFORE_START)); -u=(!J||F)&&x.equals(m);if(k&&!J)for(;!x.getNext(h)&&!u;){q=x.getParent();if(q.isBlockBoundary(this.forceBrBreak&&!w&&{br:1})){J=1;F=0;u||q.equals(m);k.setEndAt(q,CKEDITOR.POSITION_BEFORE_END);break}x=q;F=1;u=x.equals(m);l=1}F&&k.setEndAt(x,CKEDITOR.POSITION_AFTER_END);x=this._getNextSourceNode(x,l,m);if((u=!x)||J&&k)break}if(!d){if(!k)return this._.docEndMarker&&this._.docEndMarker.remove(),this._.nextNode=null;d=new CKEDITOR.dom.elementPath(k.startContainer,k.root);x=d.blockLimit;J={div:1,th:1,td:1}; -d=d.block;!d&&x&&!this.enforceRealBlocks&&J[x.getName()]&&k.checkStartOfBlock()&&k.checkEndOfBlock()&&!x.equals(k.root)?d=x:!d||this.enforceRealBlocks&&d.is(p)?(d=this.range.document.createElement(a),k.extractContents().appendTo(d),d.trim(),k.insertNode(d),z=y=!0):"li"!=d.getName()?k.checkStartOfBlock()&&k.checkEndOfBlock()||(d=d.clone(!1),k.extractContents().appendTo(d),d.trim(),y=k.splitBlock(),z=!y.wasStartOfBlock,y=!y.wasEndOfBlock,k.insertNode(d)):u||(this._.nextNode=d.equals(m)?null:this._getNextSourceNode(k.getBoundaryNodes().endNode, -1,m))}z&&(z=d.getPrevious())&&z.type==CKEDITOR.NODE_ELEMENT&&("br"==z.getName()?z.remove():z.getLast()&&"br"==z.getLast().$.nodeName.toLowerCase()&&z.getLast().remove());y&&(z=d.getLast())&&z.type==CKEDITOR.NODE_ELEMENT&&"br"==z.getName()&&(!CKEDITOR.env.needsBrFiller||z.getPrevious(g)||z.getNext(g))&&z.remove();this._.nextNode||(this._.nextNode=u||d.equals(m)||!m?null:this._getNextSourceNode(d,1,m));return d},_getNextSourceNode:function(a,b,c){function d(a){return!(a.equals(c)||a.equals(e))}var e= -this.range.root;for(a=a.getNextSourceNode(b,null,d);!g(a);)a=a.getNextSourceNode(b,null,d);return a}};CKEDITOR.dom.range.prototype.createIterator=function(){return new a(this)}})(); -CKEDITOR.command=function(a,d){this.uiItems=[];this.exec=function(b){if(this.state==CKEDITOR.TRISTATE_DISABLED||!this.checkAllowed())return!1;this.editorFocus&&a.focus();return!1===this.fire("exec")?!0:!1!==d.exec.call(this,a,b)};this.refresh=function(a,b){if(!this.readOnly&&a.readOnly)return!0;if(this.context&&!b.isContextFor(this.context)||!this.checkAllowed(!0))return this.disable(),!0;this.startDisabled||this.enable();this.modes&&!this.modes[a.mode]&&this.disable();return!1===this.fire("refresh", -{editor:a,path:b})?!0:d.refresh&&!1!==d.refresh.apply(this,arguments)};var b;this.checkAllowed=function(c){return c||"boolean"!=typeof b?b=a.activeFilter.checkFeature(this):b};CKEDITOR.tools.extend(this,d,{modes:{wysiwyg:1},editorFocus:1,contextSensitive:!!d.context,state:CKEDITOR.TRISTATE_DISABLED});CKEDITOR.event.call(this)}; -CKEDITOR.command.prototype={enable:function(){this.state==CKEDITOR.TRISTATE_DISABLED&&this.checkAllowed()&&this.setState(this.preserveState&&"undefined"!=typeof this.previousState?this.previousState:CKEDITOR.TRISTATE_OFF)},disable:function(){this.setState(CKEDITOR.TRISTATE_DISABLED)},setState:function(a){if(this.state==a||a!=CKEDITOR.TRISTATE_DISABLED&&!this.checkAllowed())return!1;this.previousState=this.state;this.state=a;this.fire("state");return!0},toggleState:function(){this.state==CKEDITOR.TRISTATE_OFF? -this.setState(CKEDITOR.TRISTATE_ON):this.state==CKEDITOR.TRISTATE_ON&&this.setState(CKEDITOR.TRISTATE_OFF)}};CKEDITOR.event.implementOn(CKEDITOR.command.prototype);CKEDITOR.ENTER_P=1;CKEDITOR.ENTER_BR=2;CKEDITOR.ENTER_DIV=3; -CKEDITOR.config={customConfig:"config.js",autoUpdateElement:!0,language:"",defaultLanguage:"en",contentsLangDirection:"",enterMode:CKEDITOR.ENTER_P,forceEnterMode:!1,shiftEnterMode:CKEDITOR.ENTER_BR,docType:"\x3c!DOCTYPE html\x3e",bodyId:"",bodyClass:"",fullPage:!1,height:200,contentsCss:CKEDITOR.getUrl("contents.css"),extraPlugins:"",removePlugins:"",protectedSource:[],tabIndex:0,width:"",baseFloatZIndex:1E4,blockedKeystrokes:[CKEDITOR.CTRL+66,CKEDITOR.CTRL+73,CKEDITOR.CTRL+85]}; -(function(){function a(a,b,c,d,l){var e,q;a=[];for(e in b){q=b[e];q="boolean"==typeof q?{}:"function"==typeof q?{match:q}:M(q);"$"!=e.charAt(0)&&(q.elements=e);c&&(q.featureName=c.toLowerCase());var n=q;n.elements=k(n.elements,/\s+/)||null;n.propertiesOnly=n.propertiesOnly||!0===n.elements;var f=/\s*,\s*/,t=void 0;for(t in Q){n[t]=k(n[t],f)||null;var m=n,g=P[t],E=k(n[P[t]],f),v=n[t],A=[],I=!0,C=void 0;E?I=!1:E={};for(C in v)"!"==C.charAt(0)&&(C=C.slice(1),A.push(C),E[C]=!0,I=!1);for(;C=A.pop();)v[C]= -v["!"+C],delete v["!"+C];m[g]=(I?!1:E)||null}n.match=n.match||null;d.push(q);a.push(q)}b=l.elements;l=l.generic;var h;c=0;for(d=a.length;c=--h&&(g&&CKEDITOR.document.getDocumentElement().removeStyle("cursor"),f(b))},u=function(b,c){a[b]=1;var e=d[b];delete d[b];for(var f=0;f=CKEDITOR.env.version||CKEDITOR.env.ie9Compat)?f.$.onreadystatechange=function(){if("loaded"==f.$.readyState||"complete"==f.$.readyState)f.$.onreadystatechange=null,u(b,!0)}:(f.$.onload=function(){setTimeout(function(){u(b,!0)},0)},f.$.onerror=function(){u(b,!1)}));f.appendTo(CKEDITOR.document.getHead())}}};g&&CKEDITOR.document.getDocumentElement().setStyle("cursor","wait");for(var y=0;y]+)>)|(?:!--([\S|\s]*?)--\x3e)|(?:([^\/\s>]+)((?:\s+[\w\-:.]+(?:\s*=\s*?(?:(?:"[^"]*")|(?:'[^']*')|[^\s"'\/>]+))?)*)[\S\s]*?(\/?)>))/g}}; -(function(){var a=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,d={checked:1,compact:1,declare:1,defer:1,disabled:1,ismap:1,multiple:1,nohref:1,noresize:1,noshade:1,nowrap:1,readonly:1,selected:1};CKEDITOR.htmlParser.prototype={onTagOpen:function(){},onTagClose:function(){},onText:function(){},onCDATA:function(){},onComment:function(){},parse:function(b){for(var c,e,g=0,k;c=this._.htmlPartsRegex.exec(b);){e=c.index;if(e>g)if(g=b.substring(g,e),k)k.push(g);else this.onText(g); -g=this._.htmlPartsRegex.lastIndex;if(e=c[1])if(e=e.toLowerCase(),k&&CKEDITOR.dtd.$cdata[e]&&(this.onCDATA(k.join("")),k=null),!k){this.onTagClose(e);continue}if(k)k.push(c[0]);else if(e=c[3]){if(e=e.toLowerCase(),!/="/.test(e)){var h={},p,r=c[4];c=!!c[5];if(r)for(;p=a.exec(r);){var f=p[1].toLowerCase();p=p[2]||p[3]||p[4]||"";h[f]=!p&&d[f]?f:CKEDITOR.tools.htmlDecodeAttr(p)}this.onTagOpen(e,h,c);!k&&CKEDITOR.dtd.$cdata[e]&&(k=[])}}else if(e=c[2])this.onComment(e)}if(b.length>g)this.onText(b.substring(g, -b.length))}}})(); -CKEDITOR.htmlParser.basicWriter=CKEDITOR.tools.createClass({$:function(){this._={output:[]}},proto:{openTag:function(a){this._.output.push("\x3c",a)},openTagClose:function(a,d){d?this._.output.push(" /\x3e"):this._.output.push("\x3e")},attribute:function(a,d){"string"==typeof d&&(d=CKEDITOR.tools.htmlEncodeAttr(d));this._.output.push(" ",a,'\x3d"',d,'"')},closeTag:function(a){this._.output.push("\x3c/",a,"\x3e")},text:function(a){this._.output.push(a)},comment:function(a){this._.output.push("\x3c!--",a, -"--\x3e")},write:function(a){this._.output.push(a)},reset:function(){this._.output=[];this._.indent=!1},getHtml:function(a){var d=this._.output.join("");a&&this.reset();return d}}});"use strict"; -(function(){CKEDITOR.htmlParser.node=function(){};CKEDITOR.htmlParser.node.prototype={remove:function(){var a=this.parent.children,d=CKEDITOR.tools.indexOf(a,this),b=this.previous,c=this.next;b&&(b.next=c);c&&(c.previous=b);a.splice(d,1);this.parent=null},replaceWith:function(a){var d=this.parent.children,b=CKEDITOR.tools.indexOf(d,this),c=a.previous=this.previous,e=a.next=this.next;c&&(c.next=a);e&&(e.previous=a);d[b]=a;a.parent=this.parent;this.parent=null},insertAfter:function(a){var d=a.parent.children, -b=CKEDITOR.tools.indexOf(d,a),c=a.next;d.splice(b+1,0,this);this.next=a.next;this.previous=a;a.next=this;c&&(c.previous=this);this.parent=a.parent},insertBefore:function(a){var d=a.parent.children,b=CKEDITOR.tools.indexOf(d,a);d.splice(b,0,this);this.next=a;(this.previous=a.previous)&&(a.previous.next=this);a.previous=this;this.parent=a.parent},getAscendant:function(a){var d="function"==typeof a?a:"string"==typeof a?function(b){return b.name==a}:function(b){return b.name in a},b=this.parent;for(;b&& -b.type==CKEDITOR.NODE_ELEMENT;){if(d(b))return b;b=b.parent}return null},wrapWith:function(a){this.replaceWith(a);a.add(this);return a},getIndex:function(){return CKEDITOR.tools.indexOf(this.parent.children,this)},getFilterContext:function(a){return a||{}}}})();"use strict";CKEDITOR.htmlParser.comment=function(a){this.value=a;this._={isBlockLike:!1}}; -CKEDITOR.htmlParser.comment.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_COMMENT,filter:function(a,d){var b=this.value;if(!(b=a.onComment(d,b,this)))return this.remove(),!1;if("string"!=typeof b)return this.replaceWith(b),!1;this.value=b;return!0},writeHtml:function(a,d){d&&this.filter(d);a.comment(this.value)}});"use strict"; -(function(){CKEDITOR.htmlParser.text=function(a){this.value=a;this._={isBlockLike:!1}};CKEDITOR.htmlParser.text.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_TEXT,filter:function(a,d){if(!(this.value=a.onText(d,this.value,this)))return this.remove(),!1},writeHtml:function(a,d){d&&this.filter(d);a.text(this.value)}})})();"use strict"; -(function(){CKEDITOR.htmlParser.cdata=function(a){this.value=a};CKEDITOR.htmlParser.cdata.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_TEXT,filter:function(){},writeHtml:function(a){a.write(this.value)}})})();"use strict";CKEDITOR.htmlParser.fragment=function(){this.children=[];this.parent=null;this._={isBlockLike:!0,hasInlineStarted:!1}}; -(function(){function a(a){return a.attributes["data-cke-survive"]?!1:"a"==a.name&&a.attributes.href||CKEDITOR.dtd.$removeEmpty[a.name]}var d=CKEDITOR.tools.extend({table:1,ul:1,ol:1,dl:1},CKEDITOR.dtd.table,CKEDITOR.dtd.ul,CKEDITOR.dtd.ol,CKEDITOR.dtd.dl),b={ol:1,ul:1},c=CKEDITOR.tools.extend({},{html:1},CKEDITOR.dtd.html,CKEDITOR.dtd.body,CKEDITOR.dtd.head,{style:1,script:1}),e={ul:"li",ol:"li",dl:"dd",table:"tbody",tbody:"tr",thead:"tr",tfoot:"tr",tr:"td"};CKEDITOR.htmlParser.fragment.fromHtml= -function(g,k,h){function p(a){var b;if(0k;k++)if(g=d[k]){g=g.exec(a,c,this);if(!1===g)return null;if(g&&g!=c)return this.onNode(a,g);if(c.parent&&!c.name)break}return c}, -onNode:function(a,c){var d=c.type;return d==CKEDITOR.NODE_ELEMENT?this.onElement(a,c):d==CKEDITOR.NODE_TEXT?new CKEDITOR.htmlParser.text(this.onText(a,c.value)):d==CKEDITOR.NODE_COMMENT?new CKEDITOR.htmlParser.comment(this.onComment(a,c.value)):null},onAttribute:function(a,c,d,g){return(d=this.attributesRules[d])?d.exec(a,g,c,this):g}}});CKEDITOR.htmlParser.filterRulesGroup=a;a.prototype={add:function(a,c,d){this.rules.splice(this.findIndex(c),0,{value:a,priority:c,options:d})},addMany:function(a, -c,d){for(var g=[this.findIndex(c),0],k=0,h=a.length;k/g,"\x26gt;")+"\x3c/textarea\x3e");return"\x3ccke:encoded\x3e"+encodeURIComponent(a)+"\x3c/cke:encoded\x3e"})}function B(a){return a.replace(Q,function(a,b){return decodeURIComponent(b)})}function u(a){return a.replace(/\x3c!--(?!{cke_protected})[\s\S]+?--\x3e/g, -function(a){return"\x3c!--"+J+"{C}"+encodeURIComponent(a).replace(/--/g,"%2D%2D")+"--\x3e"})}function z(a){return a.replace(/\x3c!--\{cke_protected\}\{C\}([\s\S]+?)--\x3e/g,function(a,b){return decodeURIComponent(b)})}function y(a,b){var c=b._.dataStore;return a.replace(/\x3c!--\{cke_protected\}([\s\S]+?)--\x3e/g,function(a,b){return decodeURIComponent(b)}).replace(/\{cke_protected_(\d+)\}/g,function(a,b){return c&&c[b]||""})}function m(a,b){var c=[],d=b.config.protectedSource,l=b._.dataStore||(b._.dataStore= -{id:1}),e=/<\!--\{cke_temp(comment)?\}(\d*?)--\x3e/g,d=[/|$)/gi,//gi,//gi].concat(d);a=a.replace(/\x3c!--[\s\S]*?--\x3e/g,function(a){return"\x3c!--{cke_tempcomment}"+(c.push(a)-1)+"--\x3e"});for(var f=0;f]+\s*=\s*(?:[^'"\s>]+|'[^']*'|"[^"]*"))|[^\s=\/>]+))+\s*\/?>/g,function(a){return a.replace(/\x3c!--\{cke_protected\}([^>]*)--\x3e/g,function(a,b){l[l.id]=decodeURIComponent(b);return"{cke_protected_"+l.id++ +"}"})});return a=a.replace(/<(title|iframe|textarea)([^>]*)>([\s\S]*?)<\/\1>/g,function(a,c,d,l){return"\x3c"+c+d+"\x3e"+y(z(l),b)+"\x3c/"+c+"\x3e"})}CKEDITOR.htmlDataProcessor=function(b){var c, -l,e=this;this.editor=b;this.dataFilter=c=new CKEDITOR.htmlParser.filter;this.htmlFilter=l=new CKEDITOR.htmlParser.filter;this.writer=new CKEDITOR.htmlParser.basicWriter;c.addRules(q);c.addRules(n,{applyToAll:!0});c.addRules(a(b,"data"),{applyToAll:!0});l.addRules(t);l.addRules(A,{applyToAll:!0});l.addRules(a(b,"html"),{applyToAll:!0});b.on("toHtml",function(a){a=a.data;var c=a.dataValue,l,c=m(c,b),c=f(c,R),c=r(c),c=f(c,H),c=c.replace(P,"$1cke:$2"),c=c.replace(G,"\x3ccke:$1$2\x3e\x3c/cke:$1\x3e"), -c=c.replace(/(]*>)(\r\n|\n)/g,"$1$2$2"),c=c.replace(/([^a-z0-9<\-])(on\w{3,})(?!>)/gi,"$1data-cke-"+CKEDITOR.rnd+"-$2");l=a.context||b.editable().getName();var e;CKEDITOR.env.ie&&9>CKEDITOR.env.version&&"pre"==l&&(l="div",c="\x3cpre\x3e"+c+"\x3c/pre\x3e",e=1);l=b.document.createElement(l);l.setHtml("a"+c);c=l.getHtml().substr(1);c=c.replace(new RegExp("data-cke-"+CKEDITOR.rnd+"-","ig"),"");e&&(c=c.replace(/^
|<\/pre>$/gi,""));c=c.replace(v,"$1$2");c=B(c);c=z(c);l=!1===a.fixForBody?!1:
-d(a.enterMode,b.config.autoParagraph);c=CKEDITOR.htmlParser.fragment.fromHtml(c,a.context,l);l&&(e=c,!e.children.length&&CKEDITOR.dtd[e.name][l]&&(l=new CKEDITOR.htmlParser.element(l),e.add(l)));a.dataValue=c},null,null,5);b.on("toHtml",function(a){a.data.filter.applyTo(a.data.dataValue,!0,a.data.dontFilter,a.data.enterMode)&&b.fire("dataFiltered")},null,null,6);b.on("toHtml",function(a){a.data.dataValue.filterChildren(e.dataFilter,!0)},null,null,10);b.on("toHtml",function(a){a=a.data;var b=a.dataValue,
-c=new CKEDITOR.htmlParser.basicWriter;b.writeChildrenHtml(c);b=c.getHtml(!0);a.dataValue=u(b)},null,null,15);b.on("toDataFormat",function(a){var c=a.data.dataValue;a.data.enterMode!=CKEDITOR.ENTER_BR&&(c=c.replace(/^
/i,""));a.data.dataValue=CKEDITOR.htmlParser.fragment.fromHtml(c,a.data.context,d(a.data.enterMode,b.config.autoParagraph))},null,null,5);b.on("toDataFormat",function(a){a.data.dataValue.filterChildren(e.htmlFilter,!0)},null,null,10);b.on("toDataFormat",function(a){a.data.filter.applyTo(a.data.dataValue, -!1,!0)},null,null,11);b.on("toDataFormat",function(a){var c=a.data.dataValue,d=e.writer;d.reset();c.writeChildrenHtml(d);c=d.getHtml(!0);c=z(c);c=y(c,b);a.data.dataValue=c},null,null,15)};CKEDITOR.htmlDataProcessor.prototype={toHtml:function(a,b,c,d){var l=this.editor,e,f,n,q;b&&"object"==typeof b?(e=b.context,c=b.fixForBody,d=b.dontFilter,f=b.filter,n=b.enterMode,q=b.protectedWhitespaces):e=b;e||null===e||(e=l.editable().getName());return l.fire("toHtml",{dataValue:a,context:e,fixForBody:c,dontFilter:d, -filter:f||l.filter,enterMode:n||l.enterMode,protectedWhitespaces:q}).dataValue},toDataFormat:function(a,b){var c,d,l;b&&(c=b.context,d=b.filter,l=b.enterMode);c||null===c||(c=this.editor.editable().getName());return this.editor.fire("toDataFormat",{dataValue:a,filter:d||this.editor.filter,context:c,enterMode:l||this.editor.enterMode}).dataValue}};var x=/(?: |\xa0)$/,J="{cke_protected}",w=CKEDITOR.dtd,F="caption colgroup col thead tfoot tbody".split(" "),l=CKEDITOR.tools.extend({},w.$blockLimit, -w.$block),q={elements:{input:h,textarea:h}},n={attributeNames:[[/^on/,"data-cke-pa-on"],[/^data-cke-expando$/,""]]},t={elements:{embed:function(a){var b=a.parent;if(b&&"object"==b.name){var c=b.attributes.width,b=b.attributes.height;c&&(a.attributes.width=c);b&&(a.attributes.height=b)}},a:function(a){var b=a.attributes;if(!(a.children.length||b.name||b.id||a.attributes["data-cke-saved-name"]))return!1}}},A={elementNames:[[/^cke:/,""],[/^\?xml:namespace$/,""]],attributeNames:[[/^data-cke-(saved|pa)-/, -""],[/^data-cke-.*/,""],["hidefocus",""]],elements:{$:function(a){var b=a.attributes;if(b){if(b["data-cke-temp"])return!1;for(var c=["name","href","src"],d,l=0;ld? -1:-1})},param:function(a){a.children=[];a.isEmpty=!0;return a},span:function(a){"Apple-style-span"==a.attributes["class"]&&delete a.name},html:function(a){delete a.attributes.contenteditable;delete a.attributes["class"]},body:function(a){delete a.attributes.spellcheck;delete a.attributes.contenteditable},style:function(a){var b=a.children[0];b&&b.value&&(b.value=CKEDITOR.tools.trim(b.value));a.attributes.type||(a.attributes.type="text/css")},title:function(a){var b=a.children[0];!b&&k(a,b=new CKEDITOR.htmlParser.text); -b.value=a.attributes["data-cke-title"]||""},input:p,textarea:p},attributes:{"class":function(a){return CKEDITOR.tools.ltrim(a.replace(/(?:^|\s+)cke_[^\s]*/g,""))||!1}}};CKEDITOR.env.ie&&(A.attributes.style=function(a){return a.replace(/(^|;)([^\:]+)/g,function(a){return a.toLowerCase()})});var C=/<(a|area|img|input|source)\b([^>]*)>/gi,D=/([\w-:]+)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+))/gi,M=/^(href|src|name)$/i,H=/(?:])[^>]*>[\s\S]*?<\/style>)|(?:<(:?link|meta|base)[^>]*>)/gi, -R=/(])[^>]*>)([\s\S]*?)(?:<\/textarea>)/gi,Q=/([^<]*)<\/cke:encoded>/gi,P=/(<\/?)((?:object|embed|param|html|body|head|title)[^>]*>)/gi,v=/(<\/?)cke:((?:html|body|head|title)[^>]*>)/gi,G=/]*?)\/?>(?!\s*<\/cke:\1)/gi})();"use strict"; -CKEDITOR.htmlParser.element=function(a,d){this.name=a;this.attributes=d||{};this.children=[];var b=a||"",c=b.match(/^cke:(.*)/);c&&(b=c[1]);b=!!(CKEDITOR.dtd.$nonBodyContent[b]||CKEDITOR.dtd.$block[b]||CKEDITOR.dtd.$listItem[b]||CKEDITOR.dtd.$tableContent[b]||CKEDITOR.dtd.$nonEditable[b]||"br"==b);this.isEmpty=!!CKEDITOR.dtd.$empty[a];this.isUnknown=!CKEDITOR.dtd[a];this._={isBlockLike:b,hasInlineStarted:this.isEmpty||!b}}; -CKEDITOR.htmlParser.cssStyle=function(a){var d={};((a instanceof CKEDITOR.htmlParser.element?a.attributes.style:a)||"").replace(/"/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(a,c,e){"font-family"==c&&(e=e.replace(/["']/g,""));d[c.toLowerCase()]=e});return{rules:d,populate:function(a){var c=this.toString();c&&(a instanceof CKEDITOR.dom.element?a.setAttribute("style",c):a instanceof CKEDITOR.htmlParser.element?a.attributes.style=c:a.style=c)},toString:function(){var a=[],c; -for(c in d)d[c]&&a.push(c,":",d[c],";");return a.join("")}}}; -(function(){function a(a){return function(b){return b.type==CKEDITOR.NODE_ELEMENT&&("string"==typeof a?b.name==a:b.name in a)}}var d=function(a,b){a=a[0];b=b[0];return ab?1:0},b=CKEDITOR.htmlParser.fragment.prototype;CKEDITOR.htmlParser.element.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_ELEMENT,add:b.add,clone:function(){return new CKEDITOR.htmlParser.element(this.name,this.attributes)},filter:function(a,b){var d=this,k,h;b=d.getFilterContext(b);if(b.off)return!0; -if(!d.parent)a.onRoot(b,d);for(;;){k=d.name;if(!(h=a.onElementName(b,k)))return this.remove(),!1;d.name=h;if(!(d=a.onElement(b,d)))return this.remove(),!1;if(d!==this)return this.replaceWith(d),!1;if(d.name==k)break;if(d.type!=CKEDITOR.NODE_ELEMENT)return this.replaceWith(d),!1;if(!d.name)return this.replaceWithChildren(),!1}k=d.attributes;var p,r;for(p in k){for(h=k[p];;)if(r=a.onAttributeName(b,p))if(r!=p)delete k[p],p=r;else break;else{delete k[p];break}r&&(!1===(h=a.onAttribute(b,d,r,h))?delete k[r]: -k[r]=h)}d.isEmpty||this.filterChildren(a,!1,b);return!0},filterChildren:b.filterChildren,writeHtml:function(a,b){b&&this.filter(b);var g=this.name,k=[],h=this.attributes,p,r;a.openTag(g,h);for(p in h)k.push([p,h[p]]);a.sortAttributes&&k.sort(d);p=0;for(r=k.length;pCKEDITOR.env.version||CKEDITOR.env.quirks))this.hasFocus&&(this.focus(),b());else if(this.hasFocus)this.focus(),a();else this.once("focus",function(){a()}, -null,null,-999)},getHtmlFromRange:function(a){if(a.collapsed)return new CKEDITOR.dom.documentFragment(a.document);a={doc:this.getDocument(),range:a.clone()};w.eol.detect(a,this);w.bogus.exclude(a);w.cell.shrink(a);a.fragment=a.range.cloneContents();w.tree.rebuild(a,this);w.eol.fix(a,this);return new CKEDITOR.dom.documentFragment(a.fragment.$)},extractHtmlFromRange:function(a,b){var c=F,d={range:a,doc:a.document},e=this.getHtmlFromRange(a);if(a.collapsed)return a.optimize(),e;a.enlarge(CKEDITOR.ENLARGE_INLINE, -1);c.table.detectPurge(d);d.bookmark=a.createBookmark();delete d.range;var f=this.editor.createRange();f.moveToPosition(d.bookmark.startNode,CKEDITOR.POSITION_BEFORE_START);d.targetBookmark=f.createBookmark();c.list.detectMerge(d,this);c.table.detectRanges(d,this);c.block.detectMerge(d,this);d.tableContentsRanges?(c.table.deleteRanges(d),a.moveToBookmark(d.bookmark),d.range=a):(a.moveToBookmark(d.bookmark),d.range=a,a.extractContents(c.detectExtractMerge(d)));a.moveToBookmark(d.targetBookmark);a.optimize(); -c.fixUneditableRangePosition(a);c.list.merge(d,this);c.table.purge(d,this);c.block.merge(d,this);if(b){c=a.startPath();if(d=a.checkStartOfBlock()&&a.checkEndOfBlock()&&c.block&&!a.root.equals(c.block)){a:{var d=c.block.getElementsByTag("span"),f=0,g;if(d)for(;g=d.getItem(f++);)if(!B(g)){d=!0;break a}d=!1}d=!d}d&&(a.moveToPosition(c.block,CKEDITOR.POSITION_BEFORE_START),c.block.remove())}else c.autoParagraph(this.editor,a),u(a.startContainer)&&a.startContainer.appendBogus();a.startContainer.mergeSiblings(); -return e},setup:function(){var a=this.editor;this.attachListener(a,"beforeGetData",function(){var b=this.getData();this.is("textarea")||!1!==a.config.ignoreEmptyParagraph&&(b=b.replace(y,function(a,b){return b}));a.setData(b,null,1)},this);this.attachListener(a,"getSnapshot",function(a){a.data=this.getData(1)},this);this.attachListener(a,"afterSetData",function(){this.setData(a.getData(1))},this);this.attachListener(a,"loadSnapshot",function(a){this.setData(a.data,1)},this);this.attachListener(a, -"beforeFocus",function(){var b=a.getSelection();(b=b&&b.getNative())&&"Control"==b.type||this.focus()},this);this.attachListener(a,"insertHtml",function(a){this.insertHtml(a.data.dataValue,a.data.mode,a.data.range)},this);this.attachListener(a,"insertElement",function(a){this.insertElement(a.data)},this);this.attachListener(a,"insertText",function(a){this.insertText(a.data)},this);this.setReadOnly(a.readOnly);this.attachClass("cke_editable");a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?this.attachClass("cke_editable_inline"): -a.elementMode!=CKEDITOR.ELEMENT_MODE_REPLACE&&a.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO||this.attachClass("cke_editable_themed");this.attachClass("cke_contents_"+a.config.contentsLangDirection);a.keystrokeHandler.blockedKeystrokes[8]=+a.readOnly;a.keystrokeHandler.attach(this);this.on("blur",function(){this.hasFocus=!1},null,null,-1);this.on("focus",function(){this.hasFocus=!0},null,null,-1);if(CKEDITOR.env.webkit)this.on("scroll",function(){a._.previousScrollTop=a.editable().$.scrollTop},null, -null,-1);if(CKEDITOR.env.edge&&14CKEDITOR.env.version?h.$.styleSheet.cssText=k:h.setText(k)):(k=e.appendStyleText(k),k=new CKEDITOR.dom.element(k.ownerNode||k.owningElement),t.setCustomData("stylesheet", -k),k.data("cke-temp",1))}t=e.getCustomData("stylesheet_ref")||0;e.setCustomData("stylesheet_ref",t+1);this.setCustomData("cke_includeReadonly",!a.config.disableReadonlyStyling);this.attachListener(this,"click",function(a){a=a.data;var b=(new CKEDITOR.dom.elementPath(a.getTarget(),this)).contains("a");b&&2!=a.$.button&&b.isReadOnly()&&a.preventDefault()});var D={8:1,46:1};this.attachListener(a,"key",function(b){if(a.readOnly)return!0;var c=b.data.domEvent.getKey(),d;if(c in D){b=a.getSelection();var e, -n=b.getRanges()[0],q=n.startPath(),t,k,h,c=8==c;CKEDITOR.env.ie&&11>CKEDITOR.env.version&&(e=b.getSelectedElement())||(e=g(b))?(a.fire("saveSnapshot"),n.moveToPosition(e,CKEDITOR.POSITION_BEFORE_START),e.remove(),n.select(),a.fire("saveSnapshot"),d=1):n.collapsed&&((t=q.block)&&(h=t[c?"getPrevious":"getNext"](f))&&h.type==CKEDITOR.NODE_ELEMENT&&h.is("table")&&n[c?"checkStartOfBlock":"checkEndOfBlock"]()?(a.fire("saveSnapshot"),n[c?"checkEndOfBlock":"checkStartOfBlock"]()&&t.remove(),n["moveToElementEdit"+ -(c?"End":"Start")](h),n.select(),a.fire("saveSnapshot"),d=1):q.blockLimit&&q.blockLimit.is("td")&&(k=q.blockLimit.getAscendant("table"))&&n.checkBoundaryOfElement(k,c?CKEDITOR.START:CKEDITOR.END)&&(h=k[c?"getPrevious":"getNext"](f))?(a.fire("saveSnapshot"),n["moveToElementEdit"+(c?"End":"Start")](h),n.checkStartOfBlock()&&n.checkEndOfBlock()?h.remove():n.select(),a.fire("saveSnapshot"),d=1):(k=q.contains(["td","th","caption"]))&&n.checkBoundaryOfElement(k,c?CKEDITOR.START:CKEDITOR.END)&&(d=1))}return!d}); -a.blockless&&CKEDITOR.env.ie&&CKEDITOR.env.needsBrFiller&&this.attachListener(this,"keyup",function(b){b.data.getKeystroke()in D&&!this.getFirst(c)&&(this.appendBogus(),b=a.createRange(),b.moveToPosition(this,CKEDITOR.POSITION_AFTER_START),b.select())});this.attachListener(this,"dblclick",function(b){if(a.readOnly)return!1;b={element:b.data.getTarget()};a.fire("doubleclick",b)});CKEDITOR.env.ie&&this.attachListener(this,"click",b);CKEDITOR.env.ie&&!CKEDITOR.env.edge||this.attachListener(this,"mousedown", -function(b){var c=b.data.getTarget();c.is("img","hr","input","textarea","select")&&!c.isReadOnly()&&(a.getSelection().selectElement(c),c.is("input","textarea","select")&&b.data.preventDefault())});CKEDITOR.env.edge&&this.attachListener(this,"mouseup",function(b){(b=b.data.getTarget())&&b.is("img")&&a.getSelection().selectElement(b)});CKEDITOR.env.gecko&&this.attachListener(this,"mouseup",function(b){if(2==b.data.$.button&&(b=b.data.getTarget(),!b.getOuterHtml().replace(y,""))){var c=a.createRange(); -c.moveToElementEditStart(b);c.select(!0)}});CKEDITOR.env.webkit&&(this.attachListener(this,"click",function(a){a.data.getTarget().is("input","select")&&a.data.preventDefault()}),this.attachListener(this,"mouseup",function(a){a.data.getTarget().is("input","textarea")&&a.data.preventDefault()}));CKEDITOR.env.webkit&&this.attachListener(a,"key",function(b){if(a.readOnly)return!0;b=b.data.domEvent.getKey();if(b in D){var c=8==b,d=a.getSelection().getRanges()[0];b=d.startPath();if(d.collapsed)a:{var e= -b.block;if(e&&d[c?"checkStartOfBlock":"checkEndOfBlock"]()&&d.moveToClosestEditablePosition(e,!c)&&d.collapsed){if(d.startContainer.type==CKEDITOR.NODE_ELEMENT){var f=d.startContainer.getChild(d.startOffset-(c?1:0));if(f&&f.type==CKEDITOR.NODE_ELEMENT&&f.is("hr")){a.fire("saveSnapshot");f.remove();b=!0;break a}}d=d.startPath().block;if(!d||d&&d.contains(e))b=void 0;else{a.fire("saveSnapshot");var n;(n=(c?d:e).getBogus())&&n.remove();n=a.getSelection();f=n.createBookmarks();(c?e:d).moveChildren(c? -d:e,!1);b.lastElement.mergeSiblings();r(e,d,!c);n.selectBookmarks(f);b=!0}}else b=!1}else c=d,n=b.block,d=c.endPath().block,n&&d&&!n.equals(d)?(a.fire("saveSnapshot"),(e=n.getBogus())&&e.remove(),c.enlarge(CKEDITOR.ENLARGE_INLINE),c.deleteContents(),d.getParent()&&(d.moveChildren(n,!1),b.lastElement.mergeSiblings(),r(n,d,!0)),c=a.getSelection().getRanges()[0],c.collapse(1),c.optimize(),""===c.startContainer.getHtml()&&c.startContainer.appendBogus(),c.select(),b=!0):b=!1;if(!b)return;a.getSelection().scrollIntoView(); -a.fire("saveSnapshot");return!1}},this,null,100)}}},_:{detach:function(){this.editor.setData(this.editor.getData(),0,1);this.clearListeners();this.restoreAttrs();var a;if(a=this.removeCustomData("classes"))for(;a.length;)this.removeClass(a.pop());if(!this.is("textarea")){a=this.getDocument();var b=a.getHead();if(b.getCustomData("stylesheet")){var c=a.getCustomData("stylesheet_ref");--c?a.setCustomData("stylesheet_ref",c):(a.removeCustomData("stylesheet_ref"),b.removeCustomData("stylesheet").remove())}}this.editor.fire("contentDomUnload"); -delete this.editor}}});CKEDITOR.editor.prototype.editable=function(a){var b=this._.editable;if(b&&a)return 0;arguments.length&&(b=this._.editable=a?a instanceof CKEDITOR.editable?a:new CKEDITOR.editable(this,a):(b&&b.detach(),null));return b};CKEDITOR.on("instanceLoaded",function(b){var c=b.editor;c.on("insertElement",function(a){a=a.data;a.type==CKEDITOR.NODE_ELEMENT&&(a.is("input")||a.is("textarea"))&&("false"!=a.getAttribute("contentEditable")&&a.data("cke-editable",a.hasAttribute("contenteditable")? -"true":"1"),a.setAttribute("contentEditable",!1))});c.on("selectionChange",function(b){if(!c.readOnly){var d=c.getSelection();d&&!d.isLocked&&(d=c.checkDirty(),c.fire("lockSnapshot"),a(b),c.fire("unlockSnapshot"),!d&&c.resetDirty())}})});CKEDITOR.on("instanceCreated",function(a){var b=a.editor;b.on("mode",function(){var a=b.editable();if(a&&a.isInline()){var c=b.title;a.changeAttr("role","textbox");a.changeAttr("aria-label",c);c&&a.changeAttr("title",c);var d=b.fire("ariaEditorHelpLabel",{}).label; -if(d&&(c=this.ui.space(this.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?"top":"contents"))){var e=CKEDITOR.tools.getNextId(),d=CKEDITOR.dom.element.createFromHtml('\x3cspan id\x3d"'+e+'" class\x3d"cke_voice_label"\x3e'+d+"\x3c/span\x3e");c.append(d);a.changeAttr("aria-describedby",e)}}})});CKEDITOR.addCss(".cke_editable{cursor:text}.cke_editable img,.cke_editable input,.cke_editable textarea{cursor:default}");f=CKEDITOR.dom.walker.whitespaces(!0);B=CKEDITOR.dom.walker.bookmark(!1,!0);u=CKEDITOR.dom.walker.empty(); -z=CKEDITOR.dom.walker.bogus();y=/(^|]*>)\s*<(p|div|address|h\d|center|pre)[^>]*>\s*(?:]*>| |\u00A0| )?\s*(:?<\/\2>)?\s*(?=$|<\/body>)/gi;m=function(){function a(b){return b.type==CKEDITOR.NODE_ELEMENT}function b(c,d){var e,f,n,t,g=[],k=d.range.startContainer;e=d.range.startPath();for(var k=p[k.getName()],h=0,C=c.getChildren(),A=C.count(),D=-1,m=-1,r=0,H=e.contains(p.$list);hCKEDITOR.env.version&&d.getChildCount()&&d.getFirst().remove())}return function(d){var e=d.startContainer,f=e.getAscendant("table",1),g=!1;c(f.getElementsByTag("td"));c(f.getElementsByTag("th"));f=d.clone();f.setStart(e,0);f=a(f).lastBackward();f||(f=d.clone(),f.setEndAt(e,CKEDITOR.POSITION_BEFORE_END),f=a(f).lastForward(),g=!0);f||(f=e);f.is("table")?(d.setStartAt(f,CKEDITOR.POSITION_BEFORE_START), -d.collapse(!0),f.remove()):(f.is({tbody:1,thead:1,tfoot:1})&&(f=b(f,"tr",g)),f.is("tr")&&(f=b(f,f.getParent().is("thead")?"th":"td",g)),(e=f.getBogus())&&e.remove(),d.moveToPosition(f,g?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_END))}}();J=function(){function a(b){b=new CKEDITOR.dom.walker(b);b.guard=function(a,b){if(b)return!1;if(a.type==CKEDITOR.NODE_ELEMENT)return a.is(CKEDITOR.dtd.$list)||a.is(CKEDITOR.dtd.$listItem)};b.evaluator=function(a){return a.type==CKEDITOR.NODE_ELEMENT&& -a.is(CKEDITOR.dtd.$listItem)};return b}return function(b){var c=b.startContainer,d=!1,e;e=b.clone();e.setStart(c,0);e=a(e).lastBackward();e||(e=b.clone(),e.setEndAt(c,CKEDITOR.POSITION_BEFORE_END),e=a(e).lastForward(),d=!0);e||(e=c);e.is(CKEDITOR.dtd.$list)?(b.setStartAt(e,CKEDITOR.POSITION_BEFORE_START),b.collapse(!0),e.remove()):((c=e.getBogus())&&c.remove(),b.moveToPosition(e,d?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_END),b.select())}}();w={eol:{detect:function(a,b){var c=a.range, -d=c.clone(),e=c.clone(),f=new CKEDITOR.dom.elementPath(c.startContainer,b),g=new CKEDITOR.dom.elementPath(c.endContainer,b);d.collapse(1);e.collapse();f.block&&d.checkBoundaryOfElement(f.block,CKEDITOR.END)&&(c.setStartAfter(f.block),a.prependEolBr=1);g.block&&e.checkBoundaryOfElement(g.block,CKEDITOR.START)&&(c.setEndBefore(g.block),a.appendEolBr=1)},fix:function(a,b){var c=b.getDocument(),d;a.appendEolBr&&(d=this.createEolBr(c),a.fragment.append(d));!a.prependEolBr||d&&!d.getPrevious()||a.fragment.append(this.createEolBr(c), -1)},createEolBr:function(a){return a.createElement("br",{attributes:{"data-cke-eol":1}})}},bogus:{exclude:function(a){var b=a.range.getBoundaryNodes(),c=b.startNode,b=b.endNode;!b||!z(b)||c&&c.equals(b)||a.range.setEndBefore(b)}},tree:{rebuild:function(a,b){var c=a.range,d=c.getCommonAncestor(),e=new CKEDITOR.dom.elementPath(d,b),f=new CKEDITOR.dom.elementPath(c.startContainer,b),c=new CKEDITOR.dom.elementPath(c.endContainer,b),g;d.type==CKEDITOR.NODE_TEXT&&(d=d.getParent());if(e.blockLimit.is({tr:1, -table:1})){var k=e.contains("table").getParent();g=function(a){return!a.equals(k)}}else if(e.block&&e.block.is(CKEDITOR.dtd.$listItem)&&(f=f.contains(CKEDITOR.dtd.$list),c=c.contains(CKEDITOR.dtd.$list),!f.equals(c))){var h=e.contains(CKEDITOR.dtd.$list).getParent();g=function(a){return!a.equals(h)}}g||(g=function(a){return!a.equals(e.block)&&!a.equals(e.blockLimit)});this.rebuildFragment(a,b,d,g)},rebuildFragment:function(a,b,c,d){for(var e;c&&!c.equals(b)&&d(c);)e=c.clone(0,1),a.fragment.appendTo(e), -a.fragment=e,c=c.getParent()}},cell:{shrink:function(a){a=a.range;var b=a.startContainer,c=a.endContainer,d=a.startOffset,e=a.endOffset;b.type==CKEDITOR.NODE_ELEMENT&&b.equals(c)&&b.is("tr")&&++d==e&&a.shrink(CKEDITOR.SHRINK_TEXT)}}};F=function(){function a(b,c){var d=b.getParent();if(d.is(CKEDITOR.dtd.$inline))b[c?"insertBefore":"insertAfter"](d)}function b(c,d,e){a(d);a(e,1);for(var f;f=e.getNext();)f.insertAfter(d),d=f;u(c)&&c.remove()}function c(a,b){var d=new CKEDITOR.dom.range(a);d.setStartAfter(b.startNode); -d.setEndBefore(b.endNode);return d}return{list:{detectMerge:function(a,b){var d=c(b,a.bookmark),e=d.startPath(),f=d.endPath(),l=e.contains(CKEDITOR.dtd.$list),g=f.contains(CKEDITOR.dtd.$list);a.mergeList=l&&g&&l.getParent().equals(g.getParent())&&!l.equals(g);a.mergeListItems=e.block&&f.block&&e.block.is(CKEDITOR.dtd.$listItem)&&f.block.is(CKEDITOR.dtd.$listItem);if(a.mergeList||a.mergeListItems)d=d.clone(),d.setStartBefore(a.bookmark.startNode),d.setEndAfter(a.bookmark.endNode),a.mergeListBookmark= -d.createBookmark()},merge:function(a,c){if(a.mergeListBookmark){var d=a.mergeListBookmark.startNode,e=a.mergeListBookmark.endNode,f=new CKEDITOR.dom.elementPath(d,c),l=new CKEDITOR.dom.elementPath(e,c);if(a.mergeList){var g=f.contains(CKEDITOR.dtd.$list),n=l.contains(CKEDITOR.dtd.$list);g.equals(n)||(n.moveChildren(g),n.remove())}a.mergeListItems&&(f=f.contains(CKEDITOR.dtd.$listItem),l=l.contains(CKEDITOR.dtd.$listItem),f.equals(l)||b(l,d,e));d.remove();e.remove()}}},block:{detectMerge:function(a, -b){if(!a.tableContentsRanges&&!a.mergeListBookmark){var c=new CKEDITOR.dom.range(b);c.setStartBefore(a.bookmark.startNode);c.setEndAfter(a.bookmark.endNode);a.mergeBlockBookmark=c.createBookmark()}},merge:function(a,c){if(a.mergeBlockBookmark&&!a.purgeTableBookmark){var d=a.mergeBlockBookmark.startNode,e=a.mergeBlockBookmark.endNode,f=new CKEDITOR.dom.elementPath(d,c),l=new CKEDITOR.dom.elementPath(e,c),f=f.block,l=l.block;f&&l&&!f.equals(l)&&b(l,d,e);d.remove();e.remove()}}},table:function(){function a(c){var e= -[],f,l=new CKEDITOR.dom.walker(c),g=c.startPath().contains(d),n=c.endPath().contains(d),k={};l.guard=function(a,l){if(a.type==CKEDITOR.NODE_ELEMENT){var h="visited_"+(l?"out":"in");if(a.getCustomData(h))return;CKEDITOR.dom.element.setMarker(k,a,h,1)}if(l&&g&&a.equals(g))f=c.clone(),f.setEndAt(g,CKEDITOR.POSITION_BEFORE_END),e.push(f);else if(!l&&n&&a.equals(n))f=c.clone(),f.setStartAt(n,CKEDITOR.POSITION_AFTER_START),e.push(f);else{if(h=!l)h=a.type==CKEDITOR.NODE_ELEMENT&&a.is(d)&&(!g||b(a,g))&&(!n|| -b(a,n));h&&(f=c.clone(),f.selectNodeContents(a),e.push(f))}};l.lastForward();CKEDITOR.dom.element.clearAllMarkers(k);return e}function b(a,c){var d=CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_IS_CONTAINED,e=a.getPosition(c);return e===CKEDITOR.POSITION_IDENTICAL?!1:0===(e&d)}var d={td:1,th:1,caption:1};return{detectPurge:function(a){var b=a.range,c=b.clone();c.enlarge(CKEDITOR.ENLARGE_ELEMENT);var c=new CKEDITOR.dom.walker(c),e=0;c.evaluator=function(a){a.type==CKEDITOR.NODE_ELEMENT&&a.is(d)&&++e}; -c.checkForward();if(1f&&e&&e.intersectsNode(c.$)){var g=[{node:d.anchorNode,offset:d.anchorOffset},{node:d.focusNode,offset:d.focusOffset}]; -d.anchorNode==c.$&&d.anchorOffset>f&&(g[0].offset-=f);d.focusNode==c.$&&d.focusOffset>f&&(g[1].offset-=f)}}c.setText(h(c.getText(),1));g&&(c=a.getDocument().$,d=c.getSelection(),c=c.createRange(),c.setStart(g[0].node,g[0].offset),c.collapse(!0),d.removeAllRanges(),d.addRange(c),d.extend(g[1].node,g[1].offset))}}function h(a,b){return b?a.replace(y,function(a,b){return b?" ":""}):a.replace(z,"")}function p(a,b){var c=CKEDITOR.dom.element.createFromHtml('\x3cdiv data-cke-hidden-sel\x3d"1" data-cke-temp\x3d"1" style\x3d"'+ -(CKEDITOR.env.ie&&14>CKEDITOR.env.version?"display:none":"position:fixed;top:0;left:-1000px")+'"\x3e'+(b||"\x26nbsp;")+"\x3c/div\x3e",a.document);a.fire("lockSnapshot");a.editable().append(c);var d=a.getSelection(1),e=a.createRange(),f=d.root.on("selectionchange",function(a){a.cancel()},null,null,0);e.setStartAt(c,CKEDITOR.POSITION_AFTER_START);e.setEndAt(c,CKEDITOR.POSITION_BEFORE_END);d.selectRanges([e]);f.removeListener();a.fire("unlockSnapshot");a._.hiddenSelectionContainer=c}function r(a){var b= -{37:1,39:1,8:1,46:1};return function(c){var d=c.data.getKeystroke();if(b[d]){var e=a.getSelection().getRanges(),f=e[0];1==e.length&&f.collapsed&&(d=f[38>d?"getPreviousEditableNode":"getNextEditableNode"]())&&d.type==CKEDITOR.NODE_ELEMENT&&"false"==d.getAttribute("contenteditable")&&(a.getSelection().fake(d),c.data.preventDefault(),c.cancel())}}}function f(a){for(var b=0;b=d.getLength()?h.setStartAfter(d):h.setStartBefore(d));e&&e.type==CKEDITOR.NODE_TEXT&&(g?h.setEndAfter(e):h.setEndBefore(e));d=new CKEDITOR.dom.walker(h);d.evaluator=function(d){if(d.type==CKEDITOR.NODE_ELEMENT&& -d.isReadOnly()){var e=c.clone();c.setEndBefore(d);c.collapsed&&a.splice(b--,1);d.getPosition(h.endContainer)&CKEDITOR.POSITION_CONTAINS||(e.setStartAfter(d),e.collapsed||a.splice(b+1,0,e));return!0}return!1};d.next()}}return a}var B="function"!=typeof window.getSelection,u=1,z=CKEDITOR.tools.repeat("​",7),y=new RegExp(z+"( )?","g"),m,x,J=CKEDITOR.dom.walker.invisible(1),w=function(){function a(b){return function(a){var c=a.editor.createRange();c.moveToClosestEditablePosition(a.selected,b)&&a.editor.getSelection().selectRanges([c]); -return!1}}function b(a){return function(b){var c=b.editor,d=c.createRange(),e;(e=d.moveToClosestEditablePosition(b.selected,a))||(e=d.moveToClosestEditablePosition(b.selected,!a));e&&c.getSelection().selectRanges([d]);c.fire("saveSnapshot");b.selected.remove();e||(d.moveToElementEditablePosition(c.editable()),c.getSelection().selectRanges([d]));c.fire("saveSnapshot");return!1}}var c=a(),d=a(1);return{37:c,38:c,39:d,40:d,8:b(),46:b(1)}}();CKEDITOR.on("instanceCreated",function(b){function c(){var a= -e.getSelection();a&&a.removeAllRanges()}var e=b.editor;e.on("contentDom",function(){function b(){v=new CKEDITOR.dom.selection(e.getSelection());v.lock()}function c(){l.removeListener("mouseup",c);q.removeListener("mouseup",c);var a=CKEDITOR.document.$.selection,b=a.createRange();"None"!=a.type&&b.parentElement().ownerDocument==f.$&&b.select()}var f=e.document,l=CKEDITOR.document,g=e.editable(),h=f.getBody(),q=f.getDocumentElement(),m=g.isInline(),p,v;CKEDITOR.env.gecko&&g.attachListener(g,"focus", -function(a){a.removeListener();0!==p&&(a=e.getSelection().getNative())&&a.isCollapsed&&a.anchorNode==g.$&&(a=e.createRange(),a.moveToElementEditStart(g),a.select())},null,null,-2);g.attachListener(g,CKEDITOR.env.webkit?"DOMFocusIn":"focus",function(){p&&CKEDITOR.env.webkit&&(p=e._.previousActive&&e._.previousActive.equals(f.getActive()))&&null!=e._.previousScrollTop&&e._.previousScrollTop!=g.$.scrollTop&&(g.$.scrollTop=e._.previousScrollTop);e.unlockSelection(p);p=0},null,null,-1);g.attachListener(g, -"mousedown",function(){p=0});if(CKEDITOR.env.ie||m)B?g.attachListener(g,"beforedeactivate",b,null,null,-1):g.attachListener(e,"selectionCheck",b,null,null,-1),g.attachListener(g,CKEDITOR.env.webkit?"DOMFocusOut":"blur",function(){e.lockSelection(v);p=1},null,null,-1),g.attachListener(g,"mousedown",function(){p=0});if(CKEDITOR.env.ie&&!m){var G;g.attachListener(g,"mousedown",function(a){2==a.data.$.button&&((a=e.document.getSelection())&&a.getType()!=CKEDITOR.SELECTION_NONE||(G=e.window.getScrollPosition()))}); -g.attachListener(g,"mouseup",function(a){2==a.data.$.button&&G&&(e.document.$.documentElement.scrollLeft=G.x,e.document.$.documentElement.scrollTop=G.y);G=null});if("BackCompat"!=f.$.compatMode){if(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat){var E,I;q.on("mousedown",function(a){function b(a){a=a.data.$;if(E){var c=h.$.createTextRange();try{c.moveToPoint(a.clientX,a.clientY)}catch(d){}E.setEndPoint(0>I.compareEndPoints("StartToStart",c)?"EndToEnd":"StartToStart",c);E.select()}}function c(){q.removeListener("mousemove", -b);l.removeListener("mouseup",c);q.removeListener("mouseup",c);E.select()}a=a.data;if(a.getTarget().is("html")&&a.$.yCKEDITOR.env.version)q.on("mousedown",function(a){a.data.getTarget().is("html")&&(l.on("mouseup",c),q.on("mouseup",c))})}}g.attachListener(g,"selectionchange",a, -e);g.attachListener(g,"keyup",d,e);g.attachListener(g,CKEDITOR.env.webkit?"DOMFocusIn":"focus",function(){e.forceNextSelectionCheck();e.selectionChange(1)});if(m&&(CKEDITOR.env.webkit||CKEDITOR.env.gecko)){var K;g.attachListener(g,"mousedown",function(){K=1});g.attachListener(f.getDocumentElement(),"mouseup",function(){K&&d.call(e);K=0})}else g.attachListener(CKEDITOR.env.ie?g:f.getDocumentElement(),"mouseup",d,e);CKEDITOR.env.webkit&&g.attachListener(f,"keydown",function(a){switch(a.data.getKey()){case 13:case 33:case 34:case 35:case 36:case 37:case 39:case 8:case 45:case 46:k(g)}}, -null,null,-1);g.attachListener(g,"keydown",r(e),null,null,-1)});e.on("setData",function(){e.unlockSelection();CKEDITOR.env.webkit&&c()});e.on("contentDomUnload",function(){e.unlockSelection()});if(CKEDITOR.env.ie9Compat)e.on("beforeDestroy",c,null,null,9);e.on("dataReady",function(){delete e._.fakeSelection;delete e._.hiddenSelectionContainer;e.selectionChange(1)});e.on("loadSnapshot",function(){var a=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT),b=e.editable().getLast(a);b&&b.hasAttribute("data-cke-hidden-sel")&& -(b.remove(),CKEDITOR.env.gecko&&(a=e.editable().getFirst(a))&&a.is("br")&&a.getAttribute("_moz_editor_bogus_node")&&a.remove())},null,null,100);e.on("key",function(a){if("wysiwyg"==e.mode){var b=e.getSelection();if(b.isFake){var c=w[a.data.keyCode];if(c)return c({editor:e,selected:b.getSelectedElement(),selection:b,keyEvent:a})}}})});if(CKEDITOR.env.webkit)CKEDITOR.on("instanceReady",function(a){var b=a.editor;b.on("selectionChange",function(){var a=b.editable(),c=a.getCustomData("cke-fillingChar"); -c&&(c.getCustomData("ready")?k(a):c.setCustomData("ready",1))},null,null,-1);b.on("beforeSetMode",function(){k(b.editable())},null,null,-1);b.on("getSnapshot",function(a){a.data&&(a.data=h(a.data))},b,null,20);b.on("toDataFormat",function(a){a.data.dataValue=h(a.data.dataValue)},null,null,0)});CKEDITOR.editor.prototype.selectionChange=function(b){(b?a:d).call(this)};CKEDITOR.editor.prototype.getSelection=function(a){return!this._.savedSelection&&!this._.fakeSelection||a?(a=this.editable())&&"wysiwyg"== -this.mode?new CKEDITOR.dom.selection(a):null:this._.savedSelection||this._.fakeSelection};CKEDITOR.editor.prototype.lockSelection=function(a){a=a||this.getSelection(1);return a.getType()!=CKEDITOR.SELECTION_NONE?(!a.isLocked&&a.lock(),this._.savedSelection=a,!0):!1};CKEDITOR.editor.prototype.unlockSelection=function(a){var b=this._.savedSelection;return b?(b.unlock(a),delete this._.savedSelection,!0):!1};CKEDITOR.editor.prototype.forceNextSelectionCheck=function(){delete this._.selectionPreviousPath}; -CKEDITOR.dom.document.prototype.getSelection=function(){return new CKEDITOR.dom.selection(this)};CKEDITOR.dom.range.prototype.select=function(){var a=this.root instanceof CKEDITOR.editable?this.root.editor.getSelection():new CKEDITOR.dom.selection(this.root);a.selectRanges([this]);return a};CKEDITOR.SELECTION_NONE=1;CKEDITOR.SELECTION_TEXT=2;CKEDITOR.SELECTION_ELEMENT=3;CKEDITOR.dom.selection=function(a){if(a instanceof CKEDITOR.dom.selection){var b=a;a=a.root}var c=a instanceof CKEDITOR.dom.element; -this.rev=b?b.rev:u++;this.document=a instanceof CKEDITOR.dom.document?a:a.getDocument();this.root=c?a:this.document.getBody();this.isLocked=0;this._={cache:{}};if(b)return CKEDITOR.tools.extend(this._.cache,b._.cache),this.isFake=b.isFake,this.isLocked=b.isLocked,this;a=this.getNative();var d,e;if(a)if(a.getRangeAt)d=(e=a.rangeCount&&a.getRangeAt(0))&&new CKEDITOR.dom.node(e.commonAncestorContainer);else{try{e=a.createRange()}catch(f){}d=e&&CKEDITOR.dom.element.get(e.item&&e.item(0)||e.parentElement())}if(!d|| -d.type!=CKEDITOR.NODE_ELEMENT&&d.type!=CKEDITOR.NODE_TEXT||!this.root.equals(d)&&!this.root.contains(d))this._.cache.type=CKEDITOR.SELECTION_NONE,this._.cache.startElement=null,this._.cache.selectedElement=null,this._.cache.selectedText="",this._.cache.ranges=new CKEDITOR.dom.rangeList;return this};var F={img:1,hr:1,li:1,table:1,tr:1,td:1,th:1,embed:1,object:1,ol:1,ul:1,a:1,input:1,form:1,select:1,textarea:1,button:1,fieldset:1,thead:1,tfoot:1};CKEDITOR.tools.extend(CKEDITOR.dom.selection,{_removeFillingCharSequenceString:h, -_createFillingCharSequenceNode:g,FILLING_CHAR_SEQUENCE:z});CKEDITOR.dom.selection.prototype={getNative:function(){return void 0!==this._.cache.nativeSel?this._.cache.nativeSel:this._.cache.nativeSel=B?this.document.$.selection:this.document.getWindow().$.getSelection()},getType:B?function(){var a=this._.cache;if(a.type)return a.type;var b=CKEDITOR.SELECTION_NONE;try{var c=this.getNative(),d=c.type;"Text"==d&&(b=CKEDITOR.SELECTION_TEXT);"Control"==d&&(b=CKEDITOR.SELECTION_ELEMENT);c.createRange().parentElement()&& -(b=CKEDITOR.SELECTION_TEXT)}catch(e){}return a.type=b}:function(){var a=this._.cache;if(a.type)return a.type;var b=CKEDITOR.SELECTION_TEXT,c=this.getNative();if(!c||!c.rangeCount)b=CKEDITOR.SELECTION_NONE;else if(1==c.rangeCount){var c=c.getRangeAt(0),d=c.startContainer;d==c.endContainer&&1==d.nodeType&&1==c.endOffset-c.startOffset&&F[d.childNodes[c.startOffset].nodeName.toLowerCase()]&&(b=CKEDITOR.SELECTION_ELEMENT)}return a.type=b},getRanges:function(){var a=B?function(){function a(b){return(new CKEDITOR.dom.node(b)).getIndex()} -var b=function(b,c){b=b.duplicate();b.collapse(c);var d=b.parentElement();if(!d.hasChildNodes())return{container:d,offset:0};for(var e=d.children,f,l,g=b.duplicate(),h=0,k=e.length-1,v=-1,n,m;h<=k;)if(v=Math.floor((h+k)/2),f=e[v],g.moveToElementText(f),n=g.compareEndPoints("StartToStart",b),0n)h=v+1;else return{container:d,offset:a(f)};if(-1==v||v==e.length-1&&0>n){g.moveToElementText(d);g.setEndPoint("StartToStart",b);g=g.text.replace(/(\r\n|\r)/g,"\n").length;e=d.childNodes;if(!g)return f= -e[e.length-1],f.nodeType!=CKEDITOR.NODE_TEXT?{container:d,offset:e.length}:{container:f,offset:f.nodeValue.length};for(d=e.length;0]*>)[ \t\r\n]*/gi,"$1");g=g.replace(/([ \t\n\r]+| )/g, -" ");g=g.replace(/]*>/gi,"\n");if(CKEDITOR.env.ie){var h=a.getDocument().createElement("div");h.append(e);e.$.outerHTML="\x3cpre\x3e"+g+"\x3c/pre\x3e";e.copyAttributes(h.getFirst());e=h.getFirst().remove()}else e.setHtml(g);b=e}else g?b=u(c?[a.getHtml()]:f(a),b):a.moveChildren(b);b.replace(a);if(d){var c=b,k;(k=c.getPrevious(R))&&k.type==CKEDITOR.NODE_ELEMENT&&k.is("pre")&&(d=B(k.getHtml(),/\n$/,"")+"\n\n"+B(c.getHtml(),/^\n/,""),CKEDITOR.env.ie?c.$.outerHTML="\x3cpre\x3e"+d+"\x3c/pre\x3e": -c.setHtml(d),k.remove())}else c&&x(b)}function f(a){var b=[];B(a.getOuterHtml(),/(\S\s*)\n(?:\s|(]+data-cke-bookmark.*?\/span>))*\n(?!$)/gi,function(a,b,c){return b+"\x3c/pre\x3e"+c+"\x3cpre\x3e"}).replace(/([\s\S]*?)<\/pre>/gi,function(a,c){b.push(c)});return b}function B(a,b,c){var d="",e="";a=a.replace(/(^]+data-cke-bookmark.*?\/span>)|(]+data-cke-bookmark.*?\/span>$)/gi,function(a,b,c){b&&(d=b);c&&(e=c);return""});return d+a.replace(b,c)+e}function u(a,b){var c; -1=c?(g=e.createText(""),g.insertAfter(this)):(a=e.createText(""),a.insertAfter(g),a.remove()));return g},substring:function(a, -d){return"number"!=typeof d?this.$.nodeValue.substr(a):this.$.nodeValue.substring(a,d)}}); -(function(){function a(a,c,d){var g=a.serializable,k=c[d?"endContainer":"startContainer"],h=d?"endOffset":"startOffset",p=g?c.document.getById(a.startNode):a.startNode;a=g?c.document.getById(a.endNode):a.endNode;k.equals(p.getPrevious())?(c.startOffset=c.startOffset-k.getLength()-a.getPrevious().getLength(),k=a.getNext()):k.equals(a.getPrevious())&&(c.startOffset-=k.getLength(),k=a.getNext());k.equals(p.getParent())&&c[h]++;k.equals(a.getParent())&&c[h]++;c[d?"endContainer":"startContainer"]=k;return c} -CKEDITOR.dom.rangeList=function(a){if(a instanceof CKEDITOR.dom.rangeList)return a;a?a instanceof CKEDITOR.dom.range&&(a=[a]):a=[];return CKEDITOR.tools.extend(a,d)};var d={createIterator:function(){var a=this,c=CKEDITOR.dom.walker.bookmark(),d=[],g;return{getNextRange:function(k){g=void 0===g?0:g+1;var h=a[g];if(h&&1b?-1:1}),e=0,g;eCKEDITOR.env.version? -a[h].$.styleSheet.cssText+=g:a[h].$.innerHTML+=g}}var g={};CKEDITOR.skin={path:a,loadPart:function(c,d){CKEDITOR.skin.name!=CKEDITOR.skinName.split(",")[0]?CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(a()+"skin.js"),function(){b(c,d)}):b(c,d)},getPath:function(a){return CKEDITOR.getUrl(d(a))},icons:{},addIcon:function(a,b,c,d){a=a.toLowerCase();this.icons[a]||(this.icons[a]={path:b,offset:c||0,bgsize:d||"16px"})},getIconStyle:function(a,b,c,d,e){var g;a&&(a=a.toLowerCase(),b&&(g=this.icons[a+"-rtl"]), -g||(g=this.icons[a]));a=c||g&&g.path||"";d=d||g&&g.offset;e=e||g&&g.bgsize||"16px";a&&(a=a.replace(/'/g,"\\'"));return a&&"background-image:url('"+CKEDITOR.getUrl(a)+"');background-position:0 "+d+"px;background-size:"+e+";"}};CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{getUiColor:function(){return this.uiColor},setUiColor:function(a){var b=c(CKEDITOR.document);return(this.setUiColor=function(a){this.uiColor=a;var c=CKEDITOR.skin.chameleon,d="",g="";"function"==typeof c&&(d=c(this,"editor"),g= -c(this,"panel"));a=[[p,a]];e([b],d,a);e(h,g,a)}).call(this,a)}});var k="cke_ui_color",h=[],p=/\$color/g;CKEDITOR.on("instanceLoaded",function(a){if(!CKEDITOR.env.ie||!CKEDITOR.env.quirks){var b=a.editor;a=function(a){a=(a.data[0]||a.data).element.getElementsByTag("iframe").getItem(0).getFrameDocument();if(!a.getById("cke_ui_color")){a=c(a);h.push(a);var d=b.getUiColor();d&&e([a],CKEDITOR.skin.chameleon(b,"panel"),[[p,d]])}};b.on("panelShow",a);b.on("menuShow",a);b.config.uiColor&&b.setUiColor(b.config.uiColor)}})})(); -(function(){if(CKEDITOR.env.webkit)CKEDITOR.env.hc=!1;else{var a=CKEDITOR.dom.element.createFromHtml('\x3cdiv style\x3d"width:0;height:0;position:absolute;left:-10000px;border:1px solid;border-color:red blue"\x3e\x3c/div\x3e',CKEDITOR.document);a.appendTo(CKEDITOR.document.getHead());try{var d=a.getComputedStyle("border-top-color"),b=a.getComputedStyle("border-right-color");CKEDITOR.env.hc=!(!d||d!=b)}catch(c){CKEDITOR.env.hc=!1}a.remove()}CKEDITOR.env.hc&&(CKEDITOR.env.cssClass+=" cke_hc");CKEDITOR.document.appendStyleText(".cke{visibility:hidden;}"); -CKEDITOR.status="loaded";CKEDITOR.fireOnce("loaded");if(a=CKEDITOR._.pending)for(delete CKEDITOR._.pending,d=0;de;e++){var f=e,c;c=parseInt(a[e],16);c=("0"+(0>d?0|c*(1+d):0|c+(255-c)*d).toString(16)).slice(-2);a[f]=c}return"#"+a.join("")}}(),f={editor:new CKEDITOR.template("{id}.cke_chrome [border-color:{defaultBorder};] {id} .cke_top [ background-color:{defaultBackground};border-bottom-color:{defaultBorder};] {id} .cke_bottom [background-color:{defaultBackground};border-top-color:{defaultBorder};] {id} .cke_resizer [border-right-color:{ckeResizer}] {id} .cke_dialog_title [background-color:{defaultBackground};border-bottom-color:{defaultBorder};] {id} .cke_dialog_footer [background-color:{defaultBackground};outline-color:{defaultBorder};] {id} .cke_dialog_tab [background-color:{dialogTab};border-color:{defaultBorder};] {id} .cke_dialog_tab:hover [background-color:{lightBackground};] {id} .cke_dialog_contents [border-top-color:{defaultBorder};] {id} .cke_dialog_tab_selected, {id} .cke_dialog_tab_selected:hover [background:{dialogTabSelected};border-bottom-color:{dialogTabSelectedBorder};] {id} .cke_dialog_body [background:{dialogBody};border-color:{defaultBorder};] {id} a.cke_button_off:hover,{id} a.cke_button_off:focus,{id} a.cke_button_off:active [background-color:{darkBackground};border-color:{toolbarElementsBorder};] {id} .cke_button_on [background-color:{ckeButtonOn};border-color:{toolbarElementsBorder};] {id} .cke_toolbar_separator,{id} .cke_toolgroup a.cke_button:last-child:after,{id} .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after [background-color: {toolbarElementsBorder};border-color: {toolbarElementsBorder};] {id} a.cke_combo_button:hover,{id} a.cke_combo_button:focus,{id} .cke_combo_on a.cke_combo_button [border-color:{toolbarElementsBorder};background-color:{darkBackground};] {id} .cke_combo:after [border-color:{toolbarElementsBorder};] {id} .cke_path_item [color:{elementsPathColor};] {id} a.cke_path_item:hover,{id} a.cke_path_item:focus,{id} a.cke_path_item:active [background-color:{darkBackground};] {id}.cke_panel [border-color:{defaultBorder};] "),panel:new CKEDITOR.template(".cke_panel_grouptitle [background-color:{lightBackground};border-color:{defaultBorder};] .cke_menubutton_icon [background-color:{menubuttonIcon};] .cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active [background-color:{menubuttonHover};] .cke_menubutton:hover .cke_menubutton_icon, .cke_menubutton:focus .cke_menubutton_icon, .cke_menubutton:active .cke_menubutton_icon [background-color:{menubuttonIconHover};] .cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon [background-color:{menubuttonIcon};] .cke_menuseparator [background-color:{menubuttonIcon};] a:hover.cke_colorbox, a:active.cke_colorbox [border-color:{defaultBorder};] a:hover.cke_colorauto, a:hover.cke_colormore, a:active.cke_colorauto, a:active.cke_colormore [background-color:{ckeColorauto};border-color:{defaultBorder};] ")}; -return function(g,d){var a=b(g.uiColor,.4),a={id:"."+g.id,defaultBorder:b(a,-.2),toolbarElementsBorder:b(a,-.25),defaultBackground:a,lightBackground:b(a,.8),darkBackground:b(a,-.15),ckeButtonOn:b(a,.4),ckeResizer:b(a,-.4),ckeColorauto:b(a,.8),dialogBody:b(a,.7),dialogTab:b(a,.65),dialogTabSelected:"#FFF",dialogTabSelectedBorder:"#FFF",elementsPathColor:b(a,-.6),menubuttonHover:b(a,.1),menubuttonIcon:b(a,.5),menubuttonIconHover:b(a,.3)};return f[d].output(a).replace(/\[/g,"{").replace(/\]/g,"}")}}();CKEDITOR.plugins.add("dialogui",{onLoad:function(){var h=function(b){this._||(this._={});this._["default"]=this._.initValue=b["default"]||"";this._.required=b.required||!1;for(var a=[this._],d=1;darguments.length)){var c=h.call(this,a);c.labelId=CKEDITOR.tools.getNextId()+ -"_label";this._.children=[];var e={role:a.role||"presentation"};a.includeLabel&&(e["aria-labelledby"]=c.labelId);CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,"div",null,e,function(){var e=[],g=a.required?" cke_required":"";"horizontal"!=a.labelLayout?e.push('\x3clabel class\x3d"cke_dialog_ui_labeled_label'+g+'" ',' id\x3d"'+c.labelId+'"',c.inputId?' for\x3d"'+c.inputId+'"':"",(a.labelStyle?' style\x3d"'+a.labelStyle+'"':"")+"\x3e",a.label,"\x3c/label\x3e",'\x3cdiv class\x3d"cke_dialog_ui_labeled_content"', -a.controlStyle?' style\x3d"'+a.controlStyle+'"':"",' role\x3d"presentation"\x3e',f.call(this,b,a),"\x3c/div\x3e"):(g={type:"hbox",widths:a.widths,padding:0,children:[{type:"html",html:'\x3clabel class\x3d"cke_dialog_ui_labeled_label'+g+'" id\x3d"'+c.labelId+'" for\x3d"'+c.inputId+'"'+(a.labelStyle?' style\x3d"'+a.labelStyle+'"':"")+"\x3e"+CKEDITOR.tools.htmlEncode(a.label)+"\x3c/label\x3e"},{type:"html",html:'\x3cspan class\x3d"cke_dialog_ui_labeled_content"'+(a.controlStyle?' style\x3d"'+a.controlStyle+ -'"':"")+"\x3e"+f.call(this,b,a)+"\x3c/span\x3e"}]},CKEDITOR.dialog._.uiElementBuilders.hbox.build(b,g,e));return e.join("")})}},textInput:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);var f=this._.inputId=CKEDITOR.tools.getNextId()+"_textInput",c={"class":"cke_dialog_ui_input_"+a.type,id:f,type:a.type};a.validate&&(this.validate=a.validate);a.maxLength&&(c.maxlength=a.maxLength);a.size&&(c.size=a.size);a.inputStyle&&(c.style=a.inputStyle);var e=this,m=!1;b.on("load",function(){e.getInputElement().on("keydown", -function(a){13==a.data.getKeystroke()&&(m=!0)});e.getInputElement().on("keyup",function(a){13==a.data.getKeystroke()&&m&&(b.getButton("ok")&&setTimeout(function(){b.getButton("ok").click()},0),m=!1);e.bidi&&w.call(e,a)},null,null,1E3)});CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){var b=['\x3cdiv class\x3d"cke_dialog_ui_input_',a.type,'" role\x3d"presentation"'];a.width&&b.push('style\x3d"width:'+a.width+'" ');b.push("\x3e\x3cinput ");c["aria-labelledby"]=this._.labelId;this._.required&& -(c["aria-required"]=this._.required);for(var e in c)b.push(e+'\x3d"'+c[e]+'" ');b.push(" /\x3e\x3c/div\x3e");return b.join("")})}},textarea:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);var f=this,c=this._.inputId=CKEDITOR.tools.getNextId()+"_textarea",e={};a.validate&&(this.validate=a.validate);e.rows=a.rows||5;e.cols=a.cols||20;e["class"]="cke_dialog_ui_input_textarea "+(a["class"]||"");"undefined"!=typeof a.inputStyle&&(e.style=a.inputStyle);a.dir&&(e.dir=a.dir);if(f.bidi)b.on("load", -function(){f.getInputElement().on("keyup",w)},f);CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){e["aria-labelledby"]=this._.labelId;this._.required&&(e["aria-required"]=this._.required);var a=['\x3cdiv class\x3d"cke_dialog_ui_input_textarea" role\x3d"presentation"\x3e\x3ctextarea id\x3d"',c,'" '],b;for(b in e)a.push(b+'\x3d"'+CKEDITOR.tools.htmlEncode(e[b])+'" ');a.push("\x3e",CKEDITOR.tools.htmlEncode(f._["default"]),"\x3c/textarea\x3e\x3c/div\x3e");return a.join("")})}},checkbox:function(b, -a,d){if(!(3>arguments.length)){var f=h.call(this,a,{"default":!!a["default"]});a.validate&&(this.validate=a.validate);CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,"span",null,null,function(){var c=CKEDITOR.tools.extend({},a,{id:a.id?a.id+"_checkbox":CKEDITOR.tools.getNextId()+"_checkbox"},!0),e=[],d=CKEDITOR.tools.getNextId()+"_label",g={"class":"cke_dialog_ui_checkbox_input",type:"checkbox","aria-labelledby":d};t(c);a["default"]&&(g.checked="checked");"undefined"!=typeof c.inputStyle&&(c.style=c.inputStyle); -f.checkbox=new CKEDITOR.ui.dialog.uiElement(b,c,e,"input",null,g);e.push(' \x3clabel id\x3d"',d,'" for\x3d"',g.id,'"'+(a.labelStyle?' style\x3d"'+a.labelStyle+'"':"")+"\x3e",CKEDITOR.tools.htmlEncode(a.label),"\x3c/label\x3e");return e.join("")})}},radio:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);this._["default"]||(this._["default"]=this._.initValue=a.items[0][1]);a.validate&&(this.validate=a.validate);var f=[],c=this;a.role="radiogroup";a.includeLabel=!0;CKEDITOR.ui.dialog.labeledElement.call(this, -b,a,d,function(){for(var e=[],d=[],g=(a.id?a.id:CKEDITOR.tools.getNextId())+"_radio",k=0;karguments.length)){var f=h.call(this,a);a.validate&&(this.validate=a.validate);f.inputId=CKEDITOR.tools.getNextId()+"_select";CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){var c=CKEDITOR.tools.extend({},a,{id:a.id?a.id+"_select":CKEDITOR.tools.getNextId()+"_select"},!0),e=[],d=[],g={id:f.inputId,"class":"cke_dialog_ui_input_select","aria-labelledby":this._.labelId};e.push('\x3cdiv class\x3d"cke_dialog_ui_input_', -a.type,'" role\x3d"presentation"');a.width&&e.push('style\x3d"width:'+a.width+'" ');e.push("\x3e");void 0!==a.size&&(g.size=a.size);void 0!==a.multiple&&(g.multiple=a.multiple);t(c);for(var k=0,l;karguments.length)){void 0===a["default"]&&(a["default"]="");var f=CKEDITOR.tools.extend(h.call(this,a),{definition:a,buttons:[]});a.validate&&(this.validate=a.validate);b.on("load",function(){CKEDITOR.document.getById(f.frameId).getParent().addClass("cke_dialog_ui_input_file")});CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){f.frameId=CKEDITOR.tools.getNextId()+"_fileInput";var b=['\x3ciframe frameborder\x3d"0" allowtransparency\x3d"0" class\x3d"cke_dialog_ui_input_file" role\x3d"presentation" id\x3d"', -f.frameId,'" title\x3d"',a.label,'" src\x3d"javascript:void('];b.push(CKEDITOR.env.ie?"(function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+"})()":"0");b.push(')"\x3e\x3c/iframe\x3e');return b.join("")})}},fileButton:function(b,a,d){var f=this;if(!(3>arguments.length)){h.call(this,a);a.validate&&(this.validate=a.validate);var c=CKEDITOR.tools.extend({},a),e=c.onClick;c.className=(c.className?c.className+" ":"")+"cke_dialog_ui_button";c.onClick=function(c){var d= -a["for"];e&&!1===e.call(this,c)||(b.getContentElement(d[0],d[1]).submit(),this.disable())};b.on("load",function(){b.getContentElement(a["for"][0],a["for"][1])._.buttons.push(f)});CKEDITOR.ui.dialog.button.call(this,b,c,d)}},html:function(){var b=/^\s*<[\w:]+\s+([^>]*)?>/,a=/^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/,d=/\/$/;return function(f,c,e){if(!(3>arguments.length)){var m=[],g=c.html;"\x3c"!=g.charAt(0)&&(g="\x3cspan\x3e"+g+"\x3c/span\x3e");var k=c.focus;if(k){var l=this.focus;this.focus=function(){("function"== -typeof k?k:l).call(this);this.fire("focus")};c.isFocusable&&(this.isFocusable=this.isFocusable);this.keyboardFocusable=!0}CKEDITOR.ui.dialog.uiElement.call(this,f,c,m,"span",null,null,"");m=m.join("").match(b);g=g.match(a)||["","",""];d.test(g[1])&&(g[1]=g[1].slice(0,-1),g[2]="/"+g[2]);e.push([g[1]," ",m[1]||"",g[2]].join(""))}}}(),fieldset:function(b,a,d,f,c){var e=c.label;this._={children:a};CKEDITOR.ui.dialog.uiElement.call(this,b,c,f,"fieldset",null,null,function(){var a=[];e&&a.push("\x3clegend"+ -(c.labelStyle?' style\x3d"'+c.labelStyle+'"':"")+"\x3e"+e+"\x3c/legend\x3e");for(var b=0;ba.getChildCount()?(new CKEDITOR.dom.text(b,CKEDITOR.document)).appendTo(a):a.getChild(0).$.nodeValue=b;return this},getLabel:function(){var b= -CKEDITOR.document.getById(this._.labelId);return!b||1>b.getChildCount()?"":b.getChild(0).getText()},eventProcessors:r},!0);CKEDITOR.ui.dialog.button.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{click:function(){return this._.disabled?!1:this.fire("click",{dialog:this._.dialog})},enable:function(){this._.disabled=!1;var b=this.getElement();b&&b.removeClass("cke_disabled")},disable:function(){this._.disabled=!0;this.getElement().addClass("cke_disabled")},isVisible:function(){return this.getElement().getFirst().isVisible()}, -isEnabled:function(){return!this._.disabled},eventProcessors:CKEDITOR.tools.extend({},CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,{onClick:function(b,a){this.on("click",function(){a.apply(this,arguments)})}},!0),accessKeyUp:function(){this.click()},accessKeyDown:function(){this.focus()},keyboardFocusable:!0},!0);CKEDITOR.ui.dialog.textInput.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return CKEDITOR.document.getById(this._.inputId)}, -focus:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&a.$.focus()},0)},select:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&(a.$.focus(),a.$.select())},0)},accessKeyUp:function(){this.select()},setValue:function(b){if(this.bidi){var a=b&&b.charAt(0);(a="‪"==a?"ltr":"‫"==a?"rtl":null)&&(b=b.slice(1));this.setDirectionMarker(a)}b||(b="");return CKEDITOR.ui.dialog.uiElement.prototype.setValue.apply(this,arguments)}, -getValue:function(){var b=CKEDITOR.ui.dialog.uiElement.prototype.getValue.call(this);if(this.bidi&&b){var a=this.getDirectionMarker();a&&(b=("ltr"==a?"‪":"‫")+b)}return b},setDirectionMarker:function(b){var a=this.getInputElement();b?a.setAttributes({dir:b,"data-cke-dir-marker":b}):this.getDirectionMarker()&&a.removeAttributes(["dir","data-cke-dir-marker"])},getDirectionMarker:function(){return this.getInputElement().data("cke-dir-marker")},keyboardFocusable:!0},q,!0);CKEDITOR.ui.dialog.textarea.prototype= -new CKEDITOR.ui.dialog.textInput;CKEDITOR.ui.dialog.select.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return this._.select.getElement()},add:function(b,a,d){var f=new CKEDITOR.dom.element("option",this.getDialog().getParentEditor().document),c=this.getInputElement().$;f.$.text=b;f.$.value=void 0===a||null===a?b:a;void 0===d||null===d?CKEDITOR.env.ie?c.add(f.$):c.add(f.$,null):c.add(f.$,d);return this},remove:function(b){this.getInputElement().$.remove(b); -return this},clear:function(){for(var b=this.getInputElement().$;0b-a;c--)if(this._.tabs[this._.tabIdList[c%a]][0].$.offsetHeight)return this._.tabIdList[c%a];return null}function A(){for(var a=this._.tabIdList.length,b=CKEDITOR.tools.indexOf(this._.tabIdList,this._.currentTabId),c=b+1;ck.width-c.width-g?k.width-c.width+("rtl"==f.lang.dir?0:h[1]):d.x,d.y+h[0]k.height-c.height-g?k.height-c.height+h[2]:d.y,1);b.data.preventDefault()} -function c(){CKEDITOR.document.removeListener("mousemove",b);CKEDITOR.document.removeListener("mouseup",c);if(CKEDITOR.env.ie6Compat){var a=u.getChild(0).getFrameDocument();a.removeListener("mousemove",b);a.removeListener("mouseup",c)}}var e=null,d=null,f=a.getParentEditor(),g=f.config.dialog_magnetDistance,h=CKEDITOR.skin.margins||[0,0,0,0];"undefined"==typeof g&&(g=20);a.parts.title.on("mousedown",function(g){e={x:g.data.$.screenX,y:g.data.$.screenY};CKEDITOR.document.on("mousemove",b);CKEDITOR.document.on("mouseup", -c);d=a.getPosition();if(CKEDITOR.env.ie6Compat){var f=u.getChild(0).getFrameDocument();f.on("mousemove",b);f.on("mouseup",c)}g.data.preventDefault()},a)}function Z(a){function b(b){var c="rtl"==f.lang.dir,n=k.width,q=k.height,G=n+(b.data.$.screenX-m.x)*(c?-1:1)*(a._.moved?1:2),H=q+(b.data.$.screenY-m.y)*(a._.moved?1:2),B=a._.element.getFirst(),B=c&&B.getComputedStyle("right"),C=a.getPosition();C.y+H>p.height&&(H=p.height-C.y);(c?B:C.x)+G>p.width&&(G=p.width-(c?B:C.x));if(d==CKEDITOR.DIALOG_RESIZE_WIDTH|| -d==CKEDITOR.DIALOG_RESIZE_BOTH)n=Math.max(e.minWidth||0,G-g);if(d==CKEDITOR.DIALOG_RESIZE_HEIGHT||d==CKEDITOR.DIALOG_RESIZE_BOTH)q=Math.max(e.minHeight||0,H-h);a.resize(n,q);a._.moved||a.layout();b.data.preventDefault()}function c(){CKEDITOR.document.removeListener("mouseup",c);CKEDITOR.document.removeListener("mousemove",b);q&&(q.remove(),q=null);if(CKEDITOR.env.ie6Compat){var a=u.getChild(0).getFrameDocument();a.removeListener("mouseup",c);a.removeListener("mousemove",b)}}var e=a.definition,d=e.resizable; -if(d!=CKEDITOR.DIALOG_RESIZE_NONE){var f=a.getParentEditor(),g,h,p,m,k,q,n=CKEDITOR.tools.addFunction(function(d){k=a.getSize();var e=a.parts.contents;e.$.getElementsByTagName("iframe").length&&(q=CKEDITOR.dom.element.createFromHtml('\x3cdiv class\x3d"cke_dialog_resize_cover" style\x3d"height: 100%; position: absolute; width: 100%;"\x3e\x3c/div\x3e'),e.append(q));h=k.height-a.parts.contents.getSize("height",!(CKEDITOR.env.gecko||CKEDITOR.env.ie&&CKEDITOR.env.quirks));g=k.width-a.parts.contents.getSize("width", -1);m={x:d.screenX,y:d.screenY};p=CKEDITOR.document.getWindow().getViewPaneSize();CKEDITOR.document.on("mousemove",b);CKEDITOR.document.on("mouseup",c);CKEDITOR.env.ie6Compat&&(e=u.getChild(0).getFrameDocument(),e.on("mousemove",b),e.on("mouseup",c));d.preventDefault&&d.preventDefault()});a.on("load",function(){var b="";d==CKEDITOR.DIALOG_RESIZE_WIDTH?b=" cke_resizer_horizontal":d==CKEDITOR.DIALOG_RESIZE_HEIGHT&&(b=" cke_resizer_vertical");b=CKEDITOR.dom.element.createFromHtml('\x3cdiv class\x3d"cke_resizer'+ -b+" cke_resizer_"+f.lang.dir+'" title\x3d"'+CKEDITOR.tools.htmlEncode(f.lang.common.resize)+'" onmousedown\x3d"CKEDITOR.tools.callFunction('+n+', event )"\x3e'+("ltr"==f.lang.dir?"◢":"◣")+"\x3c/div\x3e");a.parts.footer.append(b,1)});f.on("destroy",function(){CKEDITOR.tools.removeFunction(n)})}}function I(a){a.data.preventDefault(1)}function N(a){var b=CKEDITOR.document.getWindow(),c=a.config,e=CKEDITOR.skinName||a.config.skin,d=c.dialog_backgroundCoverColor||("moono-lisa"==e?"black":"white"),e=c.dialog_backgroundCoverOpacity, -f=c.baseFloatZIndex,c=CKEDITOR.tools.genKey(d,e,f),g=z[c];g?g.show():(f=['\x3cdiv tabIndex\x3d"-1" style\x3d"position: ',CKEDITOR.env.ie6Compat?"absolute":"fixed","; z-index: ",f,"; top: 0px; left: 0px; ",CKEDITOR.env.ie6Compat?"":"background-color: "+d,'" class\x3d"cke_dialog_background_cover"\x3e'],CKEDITOR.env.ie6Compat&&(d="\x3chtml\x3e\x3cbody style\x3d\\'background-color:"+d+";\\'\x3e\x3c/body\x3e\x3c/html\x3e",f.push('\x3ciframe hidefocus\x3d"true" frameborder\x3d"0" id\x3d"cke_dialog_background_iframe" src\x3d"javascript:'), -f.push("void((function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.write( '"+d+"' );document.close();")+"})())"),f.push('" style\x3d"position:absolute;left:0;top:0;width:100%;height: 100%;filter: progid:DXImageTransform.Microsoft.Alpha(opacity\x3d0)"\x3e\x3c/iframe\x3e')),f.push("\x3c/div\x3e"),g=CKEDITOR.dom.element.createFromHtml(f.join("")),g.setOpacity(void 0!==e?e:.5),g.on("keydown",I),g.on("keypress",I),g.on("keyup",I),g.appendTo(CKEDITOR.document.getBody()), -z[c]=g);a.focusManager.add(g);u=g;a=function(){var a=b.getViewPaneSize();g.setStyles({width:a.width+"px",height:a.height+"px"})};var h=function(){var a=b.getScrollPosition(),c=CKEDITOR.dialog._.currentTop;g.setStyles({left:a.x+"px",top:a.y+"px"});if(c){do a=c.getPosition(),c.move(a.x,a.y);while(c=c._.parentDialog)}};J=a;b.on("resize",a);a();CKEDITOR.env.mac&&CKEDITOR.env.webkit||g.focus();if(CKEDITOR.env.ie6Compat){var p=function(){h();arguments.callee.prevScrollHandler.apply(this,arguments)};b.$.setTimeout(function(){p.prevScrollHandler= -window.onscroll||function(){};window.onscroll=p},0);h()}}function O(a){u&&(a.focusManager.remove(u),a=CKEDITOR.document.getWindow(),u.hide(),a.removeListener("resize",J),CKEDITOR.env.ie6Compat&&a.$.setTimeout(function(){window.onscroll=window.onscroll&&window.onscroll.prevScrollHandler||null},0),J=null)}var v=CKEDITOR.tools.cssLength,W='\x3cdiv class\x3d"cke_reset_all {editorId} {editorDialogClass} {hidpi}" dir\x3d"{langDir}" lang\x3d"{langCode}" role\x3d"dialog" aria-labelledby\x3d"cke_dialog_title_{id}"\x3e\x3ctable class\x3d"cke_dialog '+ -CKEDITOR.env.cssClass+' cke_{langDir}" style\x3d"position:absolute" role\x3d"presentation"\x3e\x3ctr\x3e\x3ctd role\x3d"presentation"\x3e\x3cdiv class\x3d"cke_dialog_body" role\x3d"presentation"\x3e\x3cdiv id\x3d"cke_dialog_title_{id}" class\x3d"cke_dialog_title" role\x3d"presentation"\x3e\x3c/div\x3e\x3ca id\x3d"cke_dialog_close_button_{id}" class\x3d"cke_dialog_close_button" href\x3d"javascript:void(0)" title\x3d"{closeTitle}" role\x3d"button"\x3e\x3cspan class\x3d"cke_label"\x3eX\x3c/span\x3e\x3c/a\x3e\x3cdiv id\x3d"cke_dialog_tabs_{id}" class\x3d"cke_dialog_tabs" role\x3d"tablist"\x3e\x3c/div\x3e\x3ctable class\x3d"cke_dialog_contents" role\x3d"presentation"\x3e\x3ctr\x3e\x3ctd id\x3d"cke_dialog_contents_{id}" class\x3d"cke_dialog_contents_body" role\x3d"presentation"\x3e\x3c/td\x3e\x3c/tr\x3e\x3ctr\x3e\x3ctd id\x3d"cke_dialog_footer_{id}" class\x3d"cke_dialog_footer" role\x3d"presentation"\x3e\x3c/td\x3e\x3c/tr\x3e\x3c/table\x3e\x3c/div\x3e\x3c/td\x3e\x3c/tr\x3e\x3c/table\x3e\x3c/div\x3e'; -CKEDITOR.dialog=function(a,b){function c(){var a=l._.focusList;a.sort(function(a,b){return a.tabIndex!=b.tabIndex?b.tabIndex-a.tabIndex:a.focusIndex-b.focusIndex});for(var b=a.length,c=0;cb.length)){var c=l._.currentFocusIndex;l._.tabBarMode&&0>a&&(c=0);try{b[c].getInputElement().$.blur()}catch(d){}var e=c,g=1c.height|| -b.width+(0c.width?a.setStyle("position","absolute"):a.setStyle("position","fixed"));this.move(this._.moved?this._.position.x:e,this._.moved?this._.position.y:d)},foreach:function(a){for(var b in this._.contents)for(var c in this._.contents[b])a.call(this,this._.contents[b][c]);return this},reset:function(){var a=function(a){a.reset&&a.reset(1)};return function(){this.foreach(a);return this}}(),setupContent:function(){var a=arguments;this.foreach(function(b){b.setup&&b.setup.apply(b,a)})}, -commitContent:function(){var a=arguments;this.foreach(function(b){CKEDITOR.env.ie&&this._.currentFocusIndex==b.focusIndex&&b.getInputElement().$.blur();b.commit&&b.commit.apply(b,a)})},hide:function(){if(this.parts.dialog.isVisible()){this.fire("hide",{});this._.editor.fire("dialogHide",this);this.selectPage(this._.tabIdList[0]);var a=this._.element;a.setStyle("display","none");this.parts.dialog.setStyle("visibility","hidden");for(ba(this);CKEDITOR.dialog._.currentTop!=this;)CKEDITOR.dialog._.currentTop.hide(); -if(this._.parentDialog){var b=this._.parentDialog.getElement().getFirst();b.setStyle("z-index",parseInt(b.$.style.zIndex,10)+Math.floor(this._.editor.config.baseFloatZIndex/2))}else O(this._.editor);if(CKEDITOR.dialog._.currentTop=this._.parentDialog)CKEDITOR.dialog._.currentZIndex-=10;else{CKEDITOR.dialog._.currentZIndex=null;a.removeListener("keydown",Q);a.removeListener("keyup",R);var c=this._.editor;c.focus();setTimeout(function(){c.focusManager.unlock();CKEDITOR.env.iOS&&c.window.focus()},0)}delete this._.parentDialog; -this.foreach(function(a){a.resetInitValue&&a.resetInitValue()});this.setState(CKEDITOR.DIALOG_STATE_IDLE)}},addPage:function(a){if(!a.requiredContent||this._.editor.filter.check(a.requiredContent)){for(var b=[],c=a.label?' title\x3d"'+CKEDITOR.tools.htmlEncode(a.label)+'"':"",e=CKEDITOR.dialog._.uiElementBuilders.vbox.build(this,{type:"vbox",className:"cke_dialog_page_contents",children:a.elements,expand:!!a.expand,padding:a.padding,style:a.style||"width: 100%;"},b),d=this._.contents[a.id]={},f=e.getChild(), -g=0;e=f.shift();)e.notAllowed||"hbox"==e.type||"vbox"==e.type||g++,d[e.id]=e,"function"==typeof e.getChild&&f.push.apply(f,e.getChild());g||(a.hidden=!0);b=CKEDITOR.dom.element.createFromHtml(b.join(""));b.setAttribute("role","tabpanel");e=CKEDITOR.env;d="cke_"+a.id+"_"+CKEDITOR.tools.getNextNumber();c=CKEDITOR.dom.element.createFromHtml(['\x3ca class\x3d"cke_dialog_tab"',0arguments.length)){var h=(e.call?e(b):e)|| -"div",p=["\x3c",h," "],m=(d&&d.call?d(b):d)||{},k=(f&&f.call?f(b):f)||{},q=(g&&g.call?g.call(this,a,b):g)||"",n=this.domId=k.id||CKEDITOR.tools.getNextId()+"_uiElement";b.requiredContent&&!a.getParentEditor().filter.check(b.requiredContent)&&(m.display="none",this.notAllowed=!0);k.id=n;var r={};b.type&&(r["cke_dialog_ui_"+b.type]=1);b.className&&(r[b.className]=1);b.disabled&&(r.cke_disabled=1);for(var l=k["class"]&&k["class"].split?k["class"].split(" "):[],n=0;nCKEDITOR.env.version?"cke_dialog_ui_focused":"";b.on("focus",function(){a._.tabBarMode=!1;a._.hasFocus=!0;t.fire("focus");c&&this.addClass(c)});b.on("blur",function(){t.fire("blur");c&&this.removeClass(c)})}});CKEDITOR.tools.extend(this,b);this.keyboardFocusable&&(this.tabIndex= -b.tabIndex||0,this.focusIndex=a._.focusList.push(this)-1,this.on("focus",function(){a._.currentFocusIndex=t.focusIndex}))}},hbox:function(a,b,c,e,d){if(!(4>arguments.length)){this._||(this._={});var f=this._.children=b,g=d&&d.widths||null,h=d&&d.height||null,p,m={role:"presentation"};d&&d.align&&(m.align=d.align);CKEDITOR.ui.dialog.uiElement.call(this,a,d||{type:"hbox"},e,"table",{},m,function(){var a=['\x3ctbody\x3e\x3ctr class\x3d"cke_dialog_ui_hbox"\x3e'];for(p=0;parguments.length)){this._||(this._={});var f=this._.children=b,g=d&&d.width||null,h=d&&d.heights||null;CKEDITOR.ui.dialog.uiElement.call(this,a,d||{type:"vbox"},e,"div",null,{role:"presentation"},function(){var b=['\x3ctable role\x3d"presentation" cellspacing\x3d"0" border\x3d"0" '];b.push('style\x3d"');d&&d.expand&&b.push("height:100%;");b.push("width:"+v(g||"100%"),";");CKEDITOR.env.webkit&&b.push("float:none;");b.push('"');b.push('align\x3d"', -CKEDITOR.tools.htmlEncode(d&&d.align||("ltr"==a.getParentEditor().lang.dir?"left":"right")),'" ');b.push("\x3e\x3ctbody\x3e");for(var e=0;earguments.length)return this._.children.concat();a.splice||(a=[a]);return 2> -a.length?this._.children[a[0]]:this._.children[a[0]]&&this._.children[a[0]].getChild?this._.children[a[0]].getChild(a.slice(1,a.length)):null}},!0);CKEDITOR.ui.dialog.vbox.prototype=new CKEDITOR.ui.dialog.hbox;(function(){var a={build:function(a,c,e){for(var d=c.children,f,g=[],h=[],p=0;p]+data-cke-bookmark[^<]*?<\/span>/ig,"");d&&q(b,c)})}function r(){if("wysiwyg"==b.mode){var a=t("paste");b.getCommand("cut").setState(t("cut")); -b.getCommand("copy").setState(t("copy"));b.getCommand("paste").setState(a);b.fire("pasteState",a)}}function t(a){if(x&&a in{paste:1,cut:1})return CKEDITOR.TRISTATE_DISABLED;if("paste"==a)return CKEDITOR.TRISTATE_OFF;a=b.getSelection();var c=a.getRanges();return a.getType()==CKEDITOR.SELECTION_NONE||1==c.length&&c[0].collapsed?CKEDITOR.TRISTATE_DISABLED:CKEDITOR.TRISTATE_OFF}var m=CKEDITOR.plugins.clipboard,p=0,v=0,x=0;(function(){b.on("key",k);b.on("contentDom",a);b.on("selectionChange",function(b){x= -b.data.selection.getRanges()[0].checkReadOnly();r()});b.contextMenu&&b.contextMenu.addListener(function(b,a){x=a.getRanges()[0].checkReadOnly();return{cut:t("cut"),copy:t("copy"),paste:t("paste")}})})();(function(){function a(c,d,g,e,h){var k=b.lang.clipboard[d];b.addCommand(d,g);b.ui.addButton&&b.ui.addButton(c,{label:k,command:d,toolbar:"clipboard,"+e});b.addMenuItems&&b.addMenuItem(d,{label:k,command:d,group:"clipboard",order:h})}a("Cut","cut",c("cut"),10,1);a("Copy","copy",c("copy"),20,4);a("Paste", -"paste",e(),30,8)})();b.getClipboardData=function(a,c){function d(a){a.removeListener();a.cancel();c(a.data)}function g(a){a.removeListener();a.cancel();f=!0;c({type:k,dataValue:a.data.dataValue,dataTransfer:a.data.dataTransfer,method:"paste"})}function e(){this.customTitle=a&&a.title}var h=!1,k="auto",f=!1;c||(c=a,a=null);b.on("paste",d,null,null,0);b.on("beforePaste",function(a){a.removeListener();h=!0;k=a.data.type},null,null,1E3);!1===w()&&(b.removeListener("paste",d),h&&b.fire("pasteDialog", -e)?(b.on("pasteDialogCommit",g),b.on("dialogHide",function(a){a.removeListener();a.data.removeListener("pasteDialogCommit",g);setTimeout(function(){f||c(null)},10)})):c(null))}}function A(b){if(CKEDITOR.env.webkit){if(!b.match(/^[^<]*$/g)&&!b.match(/^(
<\/div>|
[^<]*<\/div>)*$/gi))return"html"}else if(CKEDITOR.env.ie){if(!b.match(/^([^<]|)*$/gi)&&!b.match(/^(

([^<]|)*<\/p>|(\r\n))*$/gi))return"html"}else if(CKEDITOR.env.gecko){if(!b.match(/^([^<]|)*$/gi))return"html"}else return"html"; -return"htmlifiedtext"}function B(b,a){function c(a){return CKEDITOR.tools.repeat("\x3c/p\x3e\x3cp\x3e",~~(a/2))+(1==a%2?"\x3cbr\x3e":"")}a=a.replace(/\s+/g," ").replace(/> +/gi,"\x3cbr\x3e");a=a.replace(/<\/?[A-Z]+>/g,function(a){return a.toLowerCase()});if(a.match(/^[^<]$/))return a;CKEDITOR.env.webkit&&-1(
|)<\/div>)(?!$|(

(
|)<\/div>))/g,"\x3cbr\x3e").replace(/^(
(
|)<\/div>){2}(?!$)/g,"\x3cdiv\x3e\x3c/div\x3e"), -a.match(/
(
|)<\/div>/)&&(a="\x3cp\x3e"+a.replace(/(
(
|)<\/div>)+/g,function(a){return c(a.split("\x3c/div\x3e\x3cdiv\x3e").length+1)})+"\x3c/p\x3e"),a=a.replace(/<\/div>
/g,"\x3cbr\x3e"),a=a.replace(/<\/?div>/g,""));CKEDITOR.env.gecko&&b.enterMode!=CKEDITOR.ENTER_BR&&(CKEDITOR.env.gecko&&(a=a.replace(/^

$/,"\x3cbr\x3e")),-1){2,}/g,function(a){return c(a.length/4)})+"\x3c/p\x3e"));return C(b,a)}function D(){function b(){var a= -{},b;for(b in CKEDITOR.dtd)"$"!=b.charAt(0)&&"div"!=b&&"span"!=b&&(a[b]=1);return a}var a={};return{get:function(c){return"plain-text"==c?a.plainText||(a.plainText=new CKEDITOR.filter("br")):"semantic-content"==c?((c=a.semanticContent)||(c=new CKEDITOR.filter,c.allow({$1:{elements:b(),attributes:!0,styles:!1,classes:!1}}),c=a.semanticContent=c),c):c?new CKEDITOR.filter(c):null}}}function y(b,a,c){a=CKEDITOR.htmlParser.fragment.fromHtml(a);var e=new CKEDITOR.htmlParser.basicWriter;c.applyTo(a,!0,!1, -b.activeEnterMode);a.writeHtml(e);return e.getHtml()}function C(b,a){b.enterMode==CKEDITOR.ENTER_BR?a=a.replace(/(<\/p>

)+/g,function(a){return CKEDITOR.tools.repeat("\x3cbr\x3e",a.length/7*2)}).replace(/<\/?p>/g,""):b.enterMode==CKEDITOR.ENTER_DIV&&(a=a.replace(/<(\/)?p>/g,"\x3c$1div\x3e"));return a}function E(b){b.data.preventDefault();b.data.$.dataTransfer.dropEffect="none"}function F(b){var a=CKEDITOR.plugins.clipboard;b.on("contentDom",function(){function c(a,c,d){c.select();q(b,{dataTransfer:d, -method:"drop"},1);d.sourceEditor.fire("saveSnapshot");d.sourceEditor.editable().extractHtmlFromRange(a);d.sourceEditor.getSelection().selectRanges([a]);d.sourceEditor.fire("saveSnapshot")}function e(d,c){d.select();q(b,{dataTransfer:c,method:"drop"},1);a.resetDragDataTransfer()}function f(a,d,c){var g={$:a.data.$,target:a.data.getTarget()};d&&(g.dragRange=d);c&&(g.dropRange=c);!1===b.fire(a.name,g)&&a.data.preventDefault()}function g(a){a.type!=CKEDITOR.NODE_ELEMENT&&(a=a.getParent());return a.getChildCount()} -var d=b.editable(),h=CKEDITOR.plugins.clipboard.getDropTarget(b),n=b.ui.space("top"),w=b.ui.space("bottom");a.preventDefaultDropOnElement(n);a.preventDefaultDropOnElement(w);d.attachListener(h,"dragstart",f);d.attachListener(b,"dragstart",a.resetDragDataTransfer,a,null,1);d.attachListener(b,"dragstart",function(d){a.initDragDataTransfer(d,b)},null,null,2);d.attachListener(b,"dragstart",function(){var d=a.dragRange=b.getSelection().getRanges()[0];CKEDITOR.env.ie&&10>CKEDITOR.env.version&&(a.dragStartContainerChildCount= -d?g(d.startContainer):null,a.dragEndContainerChildCount=d?g(d.endContainer):null)},null,null,100);d.attachListener(h,"dragend",f);d.attachListener(b,"dragend",a.initDragDataTransfer,a,null,1);d.attachListener(b,"dragend",a.resetDragDataTransfer,a,null,100);d.attachListener(h,"dragover",function(a){var b=a.data.getTarget();b&&b.is&&b.is("html")?a.data.preventDefault():CKEDITOR.env.ie&&CKEDITOR.plugins.clipboard.isFileApiSupported&&a.data.$.dataTransfer.types.contains("Files")&&a.data.preventDefault()}); -d.attachListener(h,"drop",function(d){if(!d.data.$.defaultPrevented){d.data.preventDefault();var c=d.data.getTarget();if(!c.isReadOnly()||c.type==CKEDITOR.NODE_ELEMENT&&c.is("html")){var c=a.getRangeAtDropPosition(d,b),g=a.dragRange;c&&f(d,g,c)}}},null,null,9999);d.attachListener(b,"drop",a.initDragDataTransfer,a,null,1);d.attachListener(b,"drop",function(d){if(d=d.data){var g=d.dropRange,h=d.dragRange,f=d.dataTransfer;f.getTransferType(b)==CKEDITOR.DATA_TRANSFER_INTERNAL?setTimeout(function(){a.internalDrop(h, -g,f,b)},0):f.getTransferType(b)==CKEDITOR.DATA_TRANSFER_CROSS_EDITORS?c(h,g,f):e(g,f)}},null,null,9999)})}CKEDITOR.plugins.add("clipboard",{requires:"dialog",init:function(b){var a,c=D();b.config.forcePasteAsPlainText?a="plain-text":b.config.pasteFilter?a=b.config.pasteFilter:!CKEDITOR.env.webkit||"pasteFilter"in b.config||(a="semantic-content");b.pasteFilter=c.get(a);z(b);F(b);CKEDITOR.dialog.add("paste",CKEDITOR.getUrl(this.path+"dialogs/paste.js"));if(CKEDITOR.env.gecko){var e=["image/png","image/jpeg", -"image/gif"],f;b.on("paste",function(a){var d=a.data,c=d.dataTransfer;if(!d.dataValue&&"paste"==d.method&&c&&1==c.getFilesCount()&&f!=c.id&&(c=c.getFile(0),-1!=CKEDITOR.tools.indexOf(e,c.type))){var n=new FileReader;n.addEventListener("load",function(){a.data.dataValue='\x3cimg src\x3d"'+n.result+'" /\x3e';b.fire("paste",a.data)},!1);n.addEventListener("abort",function(){b.fire("paste",a.data)},!1);n.addEventListener("error",function(){b.fire("paste",a.data)},!1);n.readAsDataURL(c);f=d.dataTransfer.id; -a.stop()}},null,null,1)}b.on("paste",function(a){a.data.dataTransfer||(a.data.dataTransfer=new CKEDITOR.plugins.clipboard.dataTransfer);if(!a.data.dataValue){var d=a.data.dataTransfer,c=d.getData("text/html");if(c)a.data.dataValue=c,a.data.type="html";else if(c=d.getData("text/plain"))a.data.dataValue=b.editable().transformPlainTextToHtml(c),a.data.type="text"}},null,null,1);b.on("paste",function(a){var b=a.data.dataValue,c=CKEDITOR.dtd.$block;-1 <\/span>/gi, -" "),"html"!=a.data.type&&(b=b.replace(/]*>([^<]*)<\/span>/gi,function(a,b){return b.replace(/\t/g,"\x26nbsp;\x26nbsp; \x26nbsp;")})),-1/,"")),b=b.replace(/(<[^>]+) class="Apple-[^"]*"/gi,"$1"));if(b.match(/^<[^<]+cke_(editable|contents)/i)){var e,f,k=new CKEDITOR.dom.element("div");for(k.setHtml(b);1==k.getChildCount()&& -(e=k.getFirst())&&e.type==CKEDITOR.NODE_ELEMENT&&(e.hasClass("cke_editable")||e.hasClass("cke_contents"));)k=f=e;f&&(b=f.getHtml().replace(/
$/i,""))}CKEDITOR.env.ie?b=b.replace(/^ (?: |\r\n)?<(\w+)/g,function(b,d){return d.toLowerCase()in c?(a.data.preSniffing="html","\x3c"+d):b}):CKEDITOR.env.webkit?b=b.replace(/<\/(\w+)>


<\/div>$/,function(b,d){return d in c?(a.data.endsWithEOL=1,"\x3c/"+d+"\x3e"):b}):CKEDITOR.env.gecko&&(b=b.replace(/(\s)
$/,"$1"));a.data.dataValue=b},null, -null,3);b.on("paste",function(a){a=a.data;var d=a.type,e=a.dataValue,f,p=b.config.clipboard_defaultContentType||"html",k=a.dataTransfer.getTransferType(b);f="html"==d||"html"==a.preSniffing?"html":A(e);"htmlifiedtext"==f&&(e=B(b.config,e));"text"==d&&"html"==f?e=y(b,e,c.get("plain-text")):k==CKEDITOR.DATA_TRANSFER_EXTERNAL&&b.pasteFilter&&!a.dontFilter&&(e=y(b,e,b.pasteFilter));a.startsWithEOL&&(e='\x3cbr data-cke-eol\x3d"1"\x3e'+e);a.endsWithEOL&&(e+='\x3cbr data-cke-eol\x3d"1"\x3e');"auto"==d&& -(d="html"==f||"html"==p?"html":"text");a.type=d;a.dataValue=e;delete a.preSniffing;delete a.startsWithEOL;delete a.endsWithEOL},null,null,6);b.on("paste",function(a){a=a.data;a.dataValue&&(b.insertHtml(a.dataValue,a.type,a.range),setTimeout(function(){b.fire("afterPaste")},0))},null,null,1E3);b.on("pasteDialog",function(a){setTimeout(function(){b.openDialog("paste",a.data)},0)})}});CKEDITOR.plugins.clipboard={isCustomCopyCutSupported:!CKEDITOR.env.ie&&!CKEDITOR.env.iOS,isCustomDataTypesSupported:!CKEDITOR.env.ie, -isFileApiSupported:!CKEDITOR.env.ie||9CKEDITOR.env.version||a.isInline()?a:b.document},fixSplitNodesAfterDrop:function(b,a,c,e){function f(b, -c,e){var f=b;f.type==CKEDITOR.NODE_TEXT&&(f=b.getParent());if(f.equals(c)&&e!=c.getChildCount())return b=a.startContainer.getChild(a.startOffset-1),c=a.startContainer.getChild(a.startOffset),b&&b.type==CKEDITOR.NODE_TEXT&&c&&c.type==CKEDITOR.NODE_TEXT&&(e=b.getLength(),b.setText(b.getText()+c.getText()),c.remove(),a.setStart(b,e),a.collapse(!0)),!0}var g=a.startContainer;"number"==typeof e&&"number"==typeof c&&g.type==CKEDITOR.NODE_ELEMENT&&(f(b.startContainer,g,c)||f(b.endContainer,g,e))},isDropRangeAffectedByDragRange:function(b, -a){var c=a.startContainer,e=a.endOffset;return b.endContainer.equals(c)&&b.endOffset<=e||b.startContainer.getParent().equals(c)&&b.startContainer.getIndex()CKEDITOR.env.version&&this.fixSplitNodesAfterDrop(b,a,f.dragStartContainerChildCount,f.dragEndContainerChildCount); -(h=this.isDropRangeAffectedByDragRange(b,a))||(d=b.createBookmark(!1));f=a.clone().createBookmark(!1);h&&(d=b.createBookmark(!1));b=d.startNode;a=d.endNode;h=f.startNode;a&&b.getPosition(h)&CKEDITOR.POSITION_PRECEDING&&a.getPosition(h)&CKEDITOR.POSITION_FOLLOWING&&h.insertBefore(b);b=e.createRange();b.moveToBookmark(d);g.extractHtmlFromRange(b,1);a=e.createRange();a.moveToBookmark(f);q(e,{dataTransfer:c,method:"drop",range:a},1);e.fire("unlockSnapshot")},getRangeAtDropPosition:function(b,a){var c= -b.data.$,e=c.clientX,f=c.clientY,g=a.getSelection(!0).getRanges()[0],d=a.createRange();if(b.data.testRange)return b.data.testRange;if(document.caretRangeFromPoint)c=a.document.$.caretRangeFromPoint(e,f),d.setStart(CKEDITOR.dom.node(c.startContainer),c.startOffset),d.collapse(!0);else if(c.rangeParent)d.setStart(CKEDITOR.dom.node(c.rangeParent),c.rangeOffset),d.collapse(!0);else{if(CKEDITOR.env.ie&&8n&&!h;n++){if(!h)try{c.moveToPoint(e,f-n),h=!0}catch(p){}if(!h)try{c.moveToPoint(e,f+n),h=!0}catch(k){}}if(h){var u="cke-temp-"+(new Date).getTime();c.pasteHTML('\x3cspan id\x3d"'+u+'"\x3e​\x3c/span\x3e');var r=a.document.getById(u);d.moveToPosition(r,CKEDITOR.POSITION_BEFORE_START);r.remove()}else{var t=a.document.$.elementFromPoint(e,f),m=new CKEDITOR.dom.element(t),q;if(m.equals(a.editable())||"html"==m.getName())return g&&g.startContainer&& -!g.startContainer.equals(a.editable())?g:null;q=m.getClientRect();e/i,bodyRegExp:/([\s\S]*)<\/body>/i,fragmentRegExp:/\x3c!--(?:Start|End)Fragment--\x3e/g,data:{},files:[],normalizeType:function(a){a=a.toLowerCase();return"text"==a||"text/plain"==a?"Text":"url"==a?"URL":a}};this.id=this.getData(p);this.id||(this.id="Text"==p?"":"cke-"+CKEDITOR.tools.getUniqueId());if("Text"!=p)try{this.$.setData(p,this.id)}catch(c){}a&&(this.sourceEditor= -a,this.setData("text/html",a.getSelectedHtml(1)),"Text"==p||this.getData("text/plain")||this.setData("text/plain",a.getSelection().getSelectedText()))};CKEDITOR.DATA_TRANSFER_INTERNAL=1;CKEDITOR.DATA_TRANSFER_CROSS_EDITORS=2;CKEDITOR.DATA_TRANSFER_EXTERNAL=3;CKEDITOR.plugins.clipboard.dataTransfer.prototype={getData:function(b){b=this._.normalizeType(b);var a=this._.data[b];if(void 0===a||null===a||""===a)try{a=this.$.getData(b)}catch(c){}if(void 0===a||null===a||""===a)a="";"text/html"==b?(a=a.replace(this._.metaRegExp, -""),(b=this._.bodyRegExp.exec(a))&&b.length&&(a=b[1],a=a.replace(this._.fragmentRegExp,""))):"Text"==b&&CKEDITOR.env.gecko&&this.getFilesCount()&&"file://"==a.substring(0,7)&&(a="");return a},setData:function(b,a){b=this._.normalizeType(b);this._.data[b]=a;if(CKEDITOR.plugins.clipboard.isCustomDataTypesSupported||"URL"==b||"Text"==b){"Text"==p&&"Text"==b&&(this.id=a);try{this.$.setData(b,a)}catch(c){}}},getTransferType:function(b){return this.sourceEditor?this.sourceEditor==b?CKEDITOR.DATA_TRANSFER_INTERNAL: -CKEDITOR.DATA_TRANSFER_CROSS_EDITORS:CKEDITOR.DATA_TRANSFER_EXTERNAL},cacheData:function(){function b(b){b=a._.normalizeType(b);var c=a.getData(b);c&&(a._.data[b]=c)}if(this.$){var a=this,c,e;if(CKEDITOR.plugins.clipboard.isCustomDataTypesSupported){if(this.$.types)for(c=0;ce.length&&(a=g.document.createElement(g.config.enterMode==CKEDITOR.ENTER_P?"p":"div"),b=h.shift(),c.insertNode(a),a.append(new CKEDITOR.dom.text("",g.document)),c.moveToBookmark(b),c.selectNodeContents(a),c.collapse(!0),b=c.createBookmark(),e.push(a),h.unshift(b));d=e[0].getParent();c=[];for(b=0;bc?d+c:b.width>c?d-a.left:d-a.right+b.width): -lc?d-c:b.width>c?d-a.right+b.width:d-a.left);c=a.top;b.height-a.tope?n-e:b.height>e?n-a.bottom+b.height:n-a.top);CKEDITOR.env.ie&&(b=a=new CKEDITOR.dom.element(k.$.offsetParent),"html"==b.getName()&&(b=b.getDocument().getBody()),"rtl"==b.getComputedStyle("direction")&&(d=CKEDITOR.env.ie8Compat?d-2*k.getDocument().getDocumentElement().$.scrollLeft:d-(a.$.scrollWidth-a.$.clientWidth)));var a=k.getFirst(),f;(f=a.getCustomData("activePanel"))&&f.onHide&&f.onHide.call(this,1);a.setCustomData("activePanel", -this);k.setStyles({top:n+"px",left:d+"px"});k.setOpacity(1);g&&g()},this);m.isLoaded?a():m.onLoad=a;CKEDITOR.tools.setTimeout(function(){var a=CKEDITOR.env.webkit&&CKEDITOR.document.getWindow().getScrollPosition().y;this.focus();p.element.focus();CKEDITOR.env.webkit&&(CKEDITOR.document.getBody().$.scrollTop=a);this.allowBlur(!0);this._.editor.fire("panelShow",this)},0,this)},CKEDITOR.env.air?200:0,this);this.visible=1;this.onShow&&this.onShow.call(this)},reposition:function(){var a=this._.showBlockParams; -this.visible&&this._.showBlockParams&&(this.hide(),this.showBlock.apply(this,a))},focus:function(){if(CKEDITOR.env.webkit){var a=CKEDITOR.document.getActive();a&&!a.equals(this._.iframe)&&a.$.blur()}(this._.lastFocused||this._.iframe.getFrameDocument().getWindow()).focus()},blur:function(){var a=this._.iframe.getFrameDocument().getActive();a&&a.is("a")&&(this._.lastFocused=a)},hide:function(a){if(this.visible&&(!this.onHide||!0!==this.onHide.call(this))){this.hideChild();CKEDITOR.env.gecko&&this._.iframe.getFrameDocument().$.activeElement.blur(); -this.element.setStyle("display","none");this.visible=0;this.element.getFirst().removeCustomData("activePanel");if(a=a&&this._.returnFocus)CKEDITOR.env.webkit&&a.type&&a.getWindow().$.focus(),a.focus();delete this._.lastFocused;this._.showBlockParams=null;this._.editor.fire("panelHide",this)}},allowBlur:function(a){var b=this._.panel;void 0!==a&&(b.allowBlur=a);return b.allowBlur},showAsChild:function(a,b,c,f,h,g){if(this._.activeChild!=a||a._.panel._.offsetParentId!=c.getId())this.hideChild(),a.onHide= -CKEDITOR.tools.bind(function(){CKEDITOR.tools.setTimeout(function(){this._.focused||this.hide()},0,this)},this),this._.activeChild=a,this._.focused=!1,a.showBlock(b,c,f,h,g),this.blur(),(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)&&setTimeout(function(){a.element.getChild(0).$.style.cssText+=""},100)},hideChild:function(a){var b=this._.activeChild;b&&(delete b.onHide,delete this._.activeChild,b.hide(),a&&this.focus())}}});CKEDITOR.on("instanceDestroyed",function(){var a=CKEDITOR.tools.isEmpty(CKEDITOR.instances), -b;for(b in f){var c=f[b];a?c.destroy():c.element.hide()}a&&(f={})})})();CKEDITOR.plugins.add("colorbutton",{requires:"panelbutton,floatpanel",init:function(e){function t(a,c,f,g,l){var m=new CKEDITOR.style(k["colorButton_"+c+"Style"]),n=CKEDITOR.tools.getNextId()+"_colorBox";l=l||{};e.ui.add(a,CKEDITOR.UI_PANELBUTTON,{label:f,title:f,modes:{wysiwyg:1},editorFocus:0,toolbar:"colors,"+g,allowedContent:m,requiredContent:m,contentTransformations:l.contentTransformations,panel:{css:CKEDITOR.skin.getPath("editor"),attributes:{role:"listbox","aria-label":h.panelTitle}},onBlock:function(a, -b){b.autoSize=!0;b.element.addClass("cke_colorblock");b.element.setHtml(x(a,c,n));b.element.getDocument().getBody().setStyle("overflow","hidden");CKEDITOR.ui.fire("ready",this);var d=b.keys,f="rtl"==e.lang.dir;d[f?37:39]="next";d[40]="next";d[9]="next";d[f?39:37]="prev";d[38]="prev";d[CKEDITOR.SHIFT+9]="prev";d[32]="click"},refresh:function(){e.activeFilter.check(m)||this.setState(CKEDITOR.TRISTATE_DISABLED)},onOpen:function(){var a=e.getSelection(),a=a&&a.getStartElement(),a=e.elementPath(a),b;if(a){a= -a.block||a.blockLimit||e.document.getBody();do b=a&&a.getComputedStyle("back"==c?"background-color":"color")||"transparent";while("back"==c&&"transparent"==b&&a&&(a=a.getParent()));b&&"transparent"!=b||(b="#ffffff");!1!==k.colorButton_enableAutomatic&&this._.panel._.iframe.getFrameDocument().getById(n).setStyle("background-color",b);return b}}})}function x(a,c,f){var g=[],l=k.colorButton_colors.split(","),m=k.colorButton_colorsPerRow||6,n=e.plugins.colordialog&&!1!==k.colorButton_enableMore,p=l.length+ -(n?2:1),b=CKEDITOR.tools.addFunction(function(b,c){function d(a){this.removeListener("ok",d);this.removeListener("cancel",d);"ok"==a.name&&f(this.getContentElement("picker","selectedColor").getValue(),c)}var f=arguments.callee;if("?"==b)e.openDialog("colordialog",function(){this.on("ok",d);this.on("cancel",d)});else{e.focus();a.hide();e.fire("saveSnapshot");e.removeStyle(new CKEDITOR.style(k["colorButton_"+c+"Style"],{color:"inherit"}));if(b){var g=k["colorButton_"+c+"Style"];g.childRule="back"== -c?function(a){return u(a)}:function(a){return!(a.is("a")||a.getElementsByTag("a").count())||u(a)};e.applyStyle(new CKEDITOR.style(g,{color:b}))}e.fire("saveSnapshot")}});!1!==k.colorButton_enableAutomatic&&g.push('\x3ca class\x3d"cke_colorauto" _cke_focus\x3d1 hidefocus\x3dtrue title\x3d"',h.auto,'" onclick\x3d"CKEDITOR.tools.callFunction(',b,",null,'",c,"');return false;\" href\x3d\"javascript:void('",h.auto,'\')" role\x3d"option" aria-posinset\x3d"1" aria-setsize\x3d"',p,'"\x3e\x3ctable role\x3d"presentation" cellspacing\x3d0 cellpadding\x3d0 width\x3d"100%"\x3e\x3ctr\x3e\x3ctd colspan\x3d"'+ -m+'" align\x3d"center"\x3e\x3cspan class\x3d"cke_colorbox" id\x3d"',f,'"\x3e\x3c/span\x3e',h.auto,"\x3c/td\x3e\x3c/tr\x3e\x3c/table\x3e\x3c/a\x3e");g.push('\x3ctable role\x3d"presentation" cellspacing\x3d0 cellpadding\x3d0 width\x3d"100%"\x3e');for(f=0;fCKEDITOR.env.version?f.createText("\r"):f.createElement("br"),a.deleteContents(),a.insertNode(b),CKEDITOR.env.needsBrFiller?(f.createText("").insertAfter(b),k&&(l||m.blockLimit).appendBogus(),b.getNext().$.nodeValue="",a.setStartAt(b.getNext(),CKEDITOR.POSITION_AFTER_START)): -a.setStartAt(b,CKEDITOR.POSITION_AFTER_END)),a.collapse(!0),a.select(),a.scrollIntoView()):u(b,d,a,h)}}};var x=CKEDITOR.plugins.enterkey,t=x.enterBr,u=x.enterBlock,w=/^h[1-6]$/})();(function(){function k(b,f){var g={},c=[],e={nbsp:" ",shy:"­",gt:"\x3e",lt:"\x3c",amp:"\x26",apos:"'",quot:'"'};b=b.replace(/\b(nbsp|shy|gt|lt|amp|apos|quot)(?:,|$)/g,function(b,a){var d=f?"\x26"+a+";":e[a];g[d]=f?e[a]:"\x26"+a+";";c.push(d);return""});if(!f&&b){b=b.split(",");var a=document.createElement("div"),d;a.innerHTML="\x26"+b.join(";\x26")+";";d=a.innerHTML;a=null;for(a=0;ah.height-c.bottom?e("pin"):e("bottom"),d=h.width/2,d=l.floatSpacePreferRight?"right":0n.width?"rtl"==l.contentsLangDirection? -"right":"left":d-c.left>c.right-d?"left":"right",n.width>h.width?(d="left",f=0):(f="left"==d?0h.width&&(d="left"==d?"right":"left",f=0)),b.setStyle(d,w(("pin"==m?u:p)+f+("pin"==m?0:"left"==d?v:-v)))):(m="pin",e("pin"),t(d))}}}();if(p){var k=new CKEDITOR.template('\x3cdiv id\x3d"cke_{name}" class\x3d"cke {id} cke_reset_all cke_chrome cke_editor_{name} cke_float cke_{langDir} '+CKEDITOR.env.cssClass+'" dir\x3d"{langDir}" title\x3d"'+(CKEDITOR.env.gecko? -" ":"")+'" lang\x3d"{langCode}" role\x3d"application" style\x3d"{style}"'+(a.title?' aria-labelledby\x3d"cke_{name}_arialbl"':" ")+"\x3e"+(a.title?'\x3cspan id\x3d"cke_{name}_arialbl" class\x3d"cke_voice_label"\x3e{voiceLabel}\x3c/span\x3e':" ")+'\x3cdiv class\x3d"cke_inner"\x3e\x3cdiv id\x3d"{topId}" class\x3d"cke_top" role\x3d"presentation"\x3e{content}\x3c/div\x3e\x3c/div\x3e\x3c/div\x3e'),b=CKEDITOR.document.getBody().append(CKEDITOR.dom.element.createFromHtml(k.output({content:p,id:a.id,langDir:a.lang.dir, -langCode:a.langCode,name:a.name,style:"display:none;z-index:"+(l.baseFloatZIndex-1),topId:a.ui.spaceId("top"),voiceLabel:a.title}))),u=CKEDITOR.tools.eventsBuffer(500,t),e=CKEDITOR.tools.eventsBuffer(100,t);b.unselectable();b.on("mousedown",function(a){a=a.data;a.getTarget().hasAscendant("a",1)||a.preventDefault()});a.on("focus",function(b){t(b);a.on("change",u.input);g.on("scroll",e.input);g.on("resize",e.input)});a.on("blur",function(){b.hide();a.removeListener("change",u.input);g.removeListener("scroll", -e.input);g.removeListener("resize",e.input)});a.on("destroy",function(){g.removeListener("scroll",e.input);g.removeListener("resize",e.input);b.clearCustomData();b.remove()});a.focusManager.hasFocus&&b.show();a.focusManager.add(b,1)}}var g=CKEDITOR.document.getWindow(),w=CKEDITOR.tools.cssLength;CKEDITOR.plugins.add("floatingspace",{init:function(a){a.on("loaded",function(){k(this)},null,null,20)}})})();CKEDITOR.plugins.add("listblock",{requires:"panel",onLoad:function(){var f=CKEDITOR.addTemplate("panel-list",'\x3cul role\x3d"presentation" class\x3d"cke_panel_list"\x3e{items}\x3c/ul\x3e'),g=CKEDITOR.addTemplate("panel-list-item",'\x3cli id\x3d"{id}" class\x3d"cke_panel_listItem" role\x3dpresentation\x3e\x3ca id\x3d"{id}_option" _cke_focus\x3d1 hidefocus\x3dtrue title\x3d"{title}" href\x3d"javascript:void(\'{val}\')" {onclick}\x3d"CKEDITOR.tools.callFunction({clickFn},\'{val}\'); return false;" role\x3d"option"\x3e{text}\x3c/a\x3e\x3c/li\x3e'), -h=CKEDITOR.addTemplate("panel-list-group",'\x3ch1 id\x3d"{id}" class\x3d"cke_panel_grouptitle" role\x3d"presentation" \x3e{label}\x3c/h1\x3e'),k=/\'/g;CKEDITOR.ui.panel.prototype.addListBlock=function(a,b){return this.addBlock(a,new CKEDITOR.ui.listBlock(this.getHolderElement(),b))};CKEDITOR.ui.listBlock=CKEDITOR.tools.createClass({base:CKEDITOR.ui.panel.block,$:function(a,b){b=b||{};var c=b.attributes||(b.attributes={});(this.multiSelect=!!b.multiSelect)&&(c["aria-multiselectable"]=!0);!c.role&& -(c.role="listbox");this.base.apply(this,arguments);this.element.setAttribute("role",c.role);c=this.keys;c[40]="next";c[9]="next";c[38]="prev";c[CKEDITOR.SHIFT+9]="prev";c[32]=CKEDITOR.env.ie?"mouseup":"click";CKEDITOR.env.ie&&(c[13]="mouseup");this._.pendingHtml=[];this._.pendingList=[];this._.items={};this._.groups={}},_:{close:function(){if(this._.started){var a=f.output({items:this._.pendingList.join("")});this._.pendingList=[];this._.pendingHtml.push(a);delete this._.started}},getClick:function(){this._.click|| -(this._.click=CKEDITOR.tools.addFunction(function(a){var b=this.toggle(a);if(this.onClick)this.onClick(a,b)},this));return this._.click}},proto:{add:function(a,b,c){var d=CKEDITOR.tools.getNextId();this._.started||(this._.started=1,this._.size=this._.size||0);this._.items[a]=d;var e;e=CKEDITOR.tools.htmlEncodeAttr(a).replace(k,"\\'");a={id:d,val:e,onclick:CKEDITOR.env.ie?'onclick\x3d"return false;" onmouseup':"onclick",clickFn:this._.getClick(),title:CKEDITOR.tools.htmlEncodeAttr(c||a),text:b||a}; -this._.pendingList.push(g.output(a))},startGroup:function(a){this._.close();var b=CKEDITOR.tools.getNextId();this._.groups[a]=b;this._.pendingHtml.push(h.output({id:b,label:a}))},commit:function(){this._.close();this.element.appendHtml(this._.pendingHtml.join(""));delete this._.size;this._.pendingHtml=[]},toggle:function(a){var b=this.isMarked(a);b?this.unmark(a):this.mark(a);return!b},hideGroup:function(a){var b=(a=this.element.getDocument().getById(this._.groups[a]))&&a.getNext();a&&(a.setStyle("display", -"none"),b&&"ul"==b.getName()&&b.setStyle("display","none"))},hideItem:function(a){this.element.getDocument().getById(this._.items[a]).setStyle("display","none")},showAll:function(){var a=this._.items,b=this._.groups,c=this.element.getDocument(),d;for(d in a)c.getById(a[d]).setStyle("display","");for(var e in b)a=c.getById(b[e]),d=a.getNext(),a.setStyle("display",""),d&&"ul"==d.getName()&&d.setStyle("display","")},mark:function(a){this.multiSelect||this.unmarkAll();a=this._.items[a];var b=this.element.getDocument().getById(a); -b.addClass("cke_selected");this.element.getDocument().getById(a+"_option").setAttribute("aria-selected",!0);this.onMark&&this.onMark(b)},unmark:function(a){var b=this.element.getDocument();a=this._.items[a];var c=b.getById(a);c.removeClass("cke_selected");b.getById(a+"_option").removeAttribute("aria-selected");this.onUnmark&&this.onUnmark(c)},unmarkAll:function(){var a=this._.items,b=this.element.getDocument(),c;for(c in a){var d=a[c];b.getById(d).removeClass("cke_selected");b.getById(d+"_option").removeAttribute("aria-selected")}this.onUnmark&& -this.onUnmark()},isMarked:function(a){return this.element.getDocument().getById(this._.items[a]).hasClass("cke_selected")},focus:function(a){this._.focusIndex=-1;var b=this.element.getElementsByTag("a"),c,d=-1;if(a)for(c=this.element.getDocument().getById(this._.items[a]).getFirst();a=b.getItem(++d);){if(a.equals(c)){this._.focusIndex=d;break}}else this.element.focus();c&&setTimeout(function(){c.focus()},0)}}})}});CKEDITOR.plugins.add("richcombo",{requires:"floatpanel,listblock,button",beforeInit:function(d){d.ui.addHandler(CKEDITOR.UI_RICHCOMBO,CKEDITOR.ui.richCombo.handler)}}); -(function(){var d='\x3cspan id\x3d"{id}" class\x3d"cke_combo cke_combo__{name} {cls}" role\x3d"presentation"\x3e\x3cspan id\x3d"{id}_label" class\x3d"cke_combo_label"\x3e{label}\x3c/span\x3e\x3ca class\x3d"cke_combo_button" title\x3d"{title}" tabindex\x3d"-1"'+(CKEDITOR.env.gecko&&!CKEDITOR.env.hc?"":" href\x3d\"javascript:void('{titleJs}')\"")+' hidefocus\x3d"true" role\x3d"button" aria-labelledby\x3d"{id}_label" aria-haspopup\x3d"true"';CKEDITOR.env.gecko&&CKEDITOR.env.mac&&(d+=' onkeypress\x3d"return false;"'); -CKEDITOR.env.gecko&&(d+=' onblur\x3d"this.style.cssText \x3d this.style.cssText;"');var d=d+(' onkeydown\x3d"return CKEDITOR.tools.callFunction({keydownFn},event,this);" onfocus\x3d"return CKEDITOR.tools.callFunction({focusFn},event);" '+(CKEDITOR.env.ie?'onclick\x3d"return false;" onmouseup':"onclick")+'\x3d"CKEDITOR.tools.callFunction({clickFn},this);return false;"\x3e\x3cspan id\x3d"{id}_text" class\x3d"cke_combo_text cke_combo_inlinelabel"\x3e{label}\x3c/span\x3e\x3cspan class\x3d"cke_combo_open"\x3e\x3cspan class\x3d"cke_combo_arrow"\x3e'+ -(CKEDITOR.env.hc?"\x26#9660;":CKEDITOR.env.air?"\x26nbsp;":"")+"\x3c/span\x3e\x3c/span\x3e\x3c/a\x3e\x3c/span\x3e"),k=CKEDITOR.addTemplate("combo",d);CKEDITOR.UI_RICHCOMBO="richcombo";CKEDITOR.ui.richCombo=CKEDITOR.tools.createClass({$:function(a){CKEDITOR.tools.extend(this,a,{canGroup:!1,title:a.label,modes:{wysiwyg:1},editorFocus:1});a=this.panel||{};delete this.panel;this.id=CKEDITOR.tools.getNextNumber();this.document=a.parent&&a.parent.getDocument()||CKEDITOR.document;a.className="cke_combopanel"; -a.block={multiSelect:a.multiSelect,attributes:a.attributes};a.toolbarRelated=!0;this._={panelDefinition:a,items:{}}},proto:{renderHtml:function(a){var b=[];this.render(a,b);return b.join("")},render:function(a,b){function g(){if(this.getState()!=CKEDITOR.TRISTATE_ON){var c=this.modes[a.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED;a.readOnly&&!this.readOnly&&(c=CKEDITOR.TRISTATE_DISABLED);this.setState(c);this.setValue("");c!=CKEDITOR.TRISTATE_DISABLED&&this.refresh&&this.refresh()}}var d= -CKEDITOR.env,h="cke_"+this.id,e=CKEDITOR.tools.addFunction(function(b){l&&(a.unlockSelection(1),l=0);c.execute(b)},this),f=this,c={id:h,combo:this,focus:function(){CKEDITOR.document.getById(h).getChild(1).focus()},execute:function(c){var b=f._;if(b.state!=CKEDITOR.TRISTATE_DISABLED)if(f.createPanel(a),b.on)b.panel.hide();else{f.commit();var d=f.getValue();d?b.list.mark(d):b.list.unmarkAll();b.panel.showBlock(f.id,new CKEDITOR.dom.element(c),4)}},clickFn:e};a.on("activeFilterChange",g,this);a.on("mode", -g,this);a.on("selectionChange",g,this);!this.readOnly&&a.on("readOnly",g,this);var m=CKEDITOR.tools.addFunction(function(b,d){b=new CKEDITOR.dom.event(b);var g=b.getKeystroke();if(40==g)a.once("panelShow",function(a){a.data._.panel._.currentBlock.onKeyDown(40)});switch(g){case 13:case 32:case 40:CKEDITOR.tools.callFunction(e,d);break;default:c.onkey(c,g)}b.preventDefault()}),n=CKEDITOR.tools.addFunction(function(){c.onfocus&&c.onfocus()}),l=0;c.keyDownFn=m;d={id:h,name:this.name||this.command,label:this.label, -title:this.title,cls:this.className||"",titleJs:d.gecko&&!d.hc?"":(this.title||"").replace("'",""),keydownFn:m,focusFn:n,clickFn:e};k.output(d,b);if(this.onRender)this.onRender();return c},createPanel:function(a){if(!this._.panel){var b=this._.panelDefinition,d=this._.panelDefinition.block,k=b.parent||CKEDITOR.document.getBody(),h="cke_combopanel__"+this.name,e=new CKEDITOR.ui.floatPanel(a,k,b),f=e.addListBlock(this.id,d),c=this;e.onShow=function(){this.element.addClass(h);c.setState(CKEDITOR.TRISTATE_ON); -c._.on=1;c.editorFocus&&!a.focusManager.hasFocus&&a.focus();if(c.onOpen)c.onOpen();a.once("panelShow",function(){f.focus(!f.multiSelect&&c.getValue())})};e.onHide=function(b){this.element.removeClass(h);c.setState(c.modes&&c.modes[a.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);c._.on=0;if(!b&&c.onClose)c.onClose()};e.onEscape=function(){e.hide(1)};f.onClick=function(a,b){c.onClick&&c.onClick.call(c,a,b);e.hide()};this._.panel=e;this._.list=f;e.getBlock(this.id).onHide=function(){c._.on= -0;c.setState(CKEDITOR.TRISTATE_OFF)};this.init&&this.init()}},setValue:function(a,b){this._.value=a;var d=this.document.getById("cke_"+this.id+"_text");d&&(a||b?d.removeClass("cke_combo_inlinelabel"):(b=this.label,d.addClass("cke_combo_inlinelabel")),d.setText("undefined"!=typeof b?b:a))},getValue:function(){return this._.value||""},unmarkAll:function(){this._.list.unmarkAll()},mark:function(a){this._.list.mark(a)},hideItem:function(a){this._.list.hideItem(a)},hideGroup:function(a){this._.list.hideGroup(a)}, -showAll:function(){this._.list.showAll()},add:function(a,b,d){this._.items[a]=d||a;this._.list.add(a,b,d)},startGroup:function(a){this._.list.startGroup(a)},commit:function(){this._.committed||(this._.list.commit(),this._.committed=1,CKEDITOR.ui.fire("ready",this));this._.committed=1},setState:function(a){if(this._.state!=a){var b=this.document.getById("cke_"+this.id);b.setState(a,"cke_combo");a==CKEDITOR.TRISTATE_DISABLED?b.setAttribute("aria-disabled",!0):b.removeAttribute("aria-disabled");this._.state= -a}},getState:function(){return this._.state},enable:function(){this._.state==CKEDITOR.TRISTATE_DISABLED&&this.setState(this._.lastState)},disable:function(){this._.state!=CKEDITOR.TRISTATE_DISABLED&&(this._.lastState=this._.state,this.setState(CKEDITOR.TRISTATE_DISABLED))}},statics:{handler:{create:function(a){return new CKEDITOR.ui.richCombo(a)}}}});CKEDITOR.ui.prototype.addRichCombo=function(a,b){this.add(a,CKEDITOR.UI_RICHCOMBO,b)}})();(function(){function n(a,c,h,e,q,n,u,w){var x=a.config,r=new CKEDITOR.style(u),g=q.split(";");q=[];for(var m={},d=0;d=this.rect.right||a<=this.rect.top||a>=this.rect.bottom)&&this.hideVisible();(0>=b||b>=this.winTopPane.width||0>=a||a>=this.winTopPane.height)&&this.hideVisible()},this);b.attachListener(a,"resize",c);b.attachListener(a,"mode",g);a.on("destroy",g);this.lineTpl=(new CKEDITOR.template('\x3cdiv data-cke-lineutils-line\x3d"1" class\x3d"cke_reset_all" style\x3d"{lineStyle}"\x3e\x3cspan style\x3d"{tipLeftStyle}"\x3e\x26nbsp;\x3c/span\x3e\x3cspan style\x3d"{tipRightStyle}"\x3e\x26nbsp;\x3c/span\x3e\x3c/div\x3e')).output({lineStyle:CKEDITOR.tools.writeCssText(CKEDITOR.tools.extend({}, -t,this.lineStyle,!0)),tipLeftStyle:CKEDITOR.tools.writeCssText(CKEDITOR.tools.extend({},q,{left:"0px","border-left-color":"red","border-width":"6px 0 6px 6px"},this.tipCss,this.tipLeftStyle,!0)),tipRightStyle:CKEDITOR.tools.writeCssText(CKEDITOR.tools.extend({},q,{right:"0px","border-right-color":"red","border-width":"6px 6px 6px 0"},this.tipCss,this.tipRightStyle,!0))})}function l(a){var d;if(d=a&&a.type==CKEDITOR.NODE_ELEMENT)d=!(r[a.getComputedStyle("float")]||r[a.getAttribute("align")]);return d&& -!u[a.getComputedStyle("position")]}CKEDITOR.plugins.add("lineutils");CKEDITOR.LINEUTILS_BEFORE=1;CKEDITOR.LINEUTILS_AFTER=2;CKEDITOR.LINEUTILS_INSIDE=4;m.prototype={start:function(a){var d=this,b=this.editor,c=this.doc,e,g,f,h,k=CKEDITOR.tools.eventsBuffer(50,function(){b.readOnly||"wysiwyg"!=b.mode||(d.relations={},(g=c.$.elementFromPoint(f,h))&&g.nodeType&&(e=new CKEDITOR.dom.element(g),d.traverseSearch(e),isNaN(f+h)||d.pixelSearch(e,f,h),a&&a(d.relations,f,h)))});this.listener=this.editable.attachListener(this.target, -"mousemove",function(a){f=a.data.$.clientX;h=a.data.$.clientY;k.input()});this.editable.attachListener(this.inline?this.editable:this.frame,"mouseout",function(){k.reset()})},stop:function(){this.listener&&this.listener.removeListener()},getRange:function(){var a={};a[CKEDITOR.LINEUTILS_BEFORE]=CKEDITOR.POSITION_BEFORE_START;a[CKEDITOR.LINEUTILS_AFTER]=CKEDITOR.POSITION_AFTER_END;a[CKEDITOR.LINEUTILS_INSIDE]=CKEDITOR.POSITION_AFTER_START;return function(d){var b=this.editor.createRange();b.moveToPosition(this.relations[d.uid].element, -a[d.type]);return b}}(),store:function(){function a(a,b,c){var e=a.getUniqueId();e in c?c[e].type|=b:c[e]={element:a,type:b}}return function(d,b){var c;b&CKEDITOR.LINEUTILS_AFTER&&l(c=d.getNext())&&c.isVisible()&&(a(c,CKEDITOR.LINEUTILS_BEFORE,this.relations),b^=CKEDITOR.LINEUTILS_AFTER);b&CKEDITOR.LINEUTILS_INSIDE&&l(c=d.getFirst())&&c.isVisible()&&(a(c,CKEDITOR.LINEUTILS_BEFORE,this.relations),b^=CKEDITOR.LINEUTILS_INSIDE);a(d,b,this.relations)}}(),traverseSearch:function(a){var d,b,c;do if(c=a.$["data-cke-expando"], -!(c&&c in this.relations)){if(a.equals(this.editable))break;if(l(a))for(d in this.lookups)(b=this.lookups[d](a))&&this.store(a,b)}while((!a||a.type!=CKEDITOR.NODE_ELEMENT||"true"!=a.getAttribute("contenteditable"))&&(a=a.getParent()))},pixelSearch:function(){function a(a,c,e,g,f){for(var h=0,k;f(e);){e+=g;if(25==++h)break;if(k=this.doc.$.elementFromPoint(c,e))if(k==a)h=0;else if(d(a,k)&&(h=0,l(k=new CKEDITOR.dom.element(k))))return k}}var d=CKEDITOR.env.ie||CKEDITOR.env.webkit?function(a,c){return a.contains(c)}: -function(a,c){return!!(a.compareDocumentPosition(c)&16)};return function(b,c,d){var g=this.win.getViewPaneSize().height,f=a.call(this,b.$,c,d,-1,function(a){return 0this.rect.bottom)return!1;this.inline? -e.left=b.elementRect.left-this.rect.relativeX:(0[^<]* -c});0>e&&(e=a._.upcasts.length);a._.upcasts.splice(e,0,[b,d,c])}var d=b.upcast,e=b.upcastPriority||10;if(d)if("string"==typeof d)for(d=d.split(",");d.length;)c(b.upcasts[d.pop()],b.name,e);else c(d,b.name,e)}function t(a,b){a.focused=null;if(b.isInited()){var c=b.editor.checkDirty();a.fire("widgetBlurred",{widget:b});b.setFocused(!1);!c&&b.editor.resetDirty()}}function H(a){a=a.data;if("wysiwyg"==this.editor.mode){var b=this.editor.editable(),c=this.instances,d,e,f,h;if(b){for(d in c)c[d].isReady()&& -!b.contains(c[d].wrapper)&&this.destroy(c[d],!0);if(a&&a.initOnlyNew)c=this.initOnAll();else{var l=b.find(".cke_widget_wrapper"),c=[];d=0;for(e=l.count();dCKEDITOR.tools.indexOf(b,a)&&c.push(a);a=CKEDITOR.tools.indexOf(d,a);0<=a&&d.splice(a,1);return this},focus:function(a){e=a;return this},commit:function(){var f=a.focused!==e,h,g;a.editor.fire("lockSnapshot");for(f&& -(h=a.focused)&&t(a,h);h=d.pop();)b.splice(CKEDITOR.tools.indexOf(b,h),1),h.isInited()&&(g=h.editor.checkDirty(),h.setSelected(!1),!g&&h.editor.resetDirty());f&&e&&(g=a.editor.checkDirty(),a.focused=e,a.fire("widgetFocused",{widget:e}),e.setFocused(!0),!g&&a.editor.resetDirty());for(;h=c.pop();)b.push(h),h.setSelected(!0);a.editor.fire("unlockSnapshot")}}}function A(a,b,c){var d=0;b=B(b);var e=a.data.classes||{},f;if(b){for(e=CKEDITOR.tools.clone(e);f=b.pop();)c?e[f]||(d=e[f]=1):e[f]&&(delete e[f], -d=1);d&&a.setData("classes",e)}}function C(a){a.cancel()}function y(a,b){var c=a.editor,d=c.document;if(!d.getById("cke_copybin")){var e=c.blockless||CKEDITOR.env.ie?"span":"div",f=d.createElement(e),h=d.createElement(e),e=CKEDITOR.env.ie&&9>CKEDITOR.env.version;h.setAttributes({id:"cke_copybin","data-cke-temp":"1"});f.setStyles({position:"absolute",width:"1px",height:"1px",overflow:"hidden"});f.setStyle("ltr"==c.config.contentsLangDirection?"left":"right","-5000px");var g=c.createRange();g.setStartBefore(a.wrapper); -g.setEndAfter(a.wrapper);f.setHtml('\x3cspan data-cke-copybin-start\x3d"1"\x3e​\x3c/span\x3e'+c.editable().getHtmlFromRange(g).getHtml()+'\x3cspan data-cke-copybin-end\x3d"1"\x3e​\x3c/span\x3e');c.fire("saveSnapshot");c.fire("lockSnapshot");h.append(f);c.editable().append(h);var k=c.on("selectionChange",C,null,null,0),m=a.repository.on("checkSelection",C,null,null,0);if(e)var n=d.getDocumentElement().$,p=n.scrollTop;g=c.createRange();g.selectNodeContents(f);g.select();e&&(n.scrollTop=p);setTimeout(function(){b|| -a.focus();h.remove();k.removeListener();m.removeListener();c.fire("unlockSnapshot");b&&(a.repository.del(a),c.fire("saveSnapshot"))},100)}}function B(a){return(a=(a=a.getDefinition().attributes)&&a["class"])?a.split(/\s+/):null}function D(){var a=CKEDITOR.document.getActive(),b=this.editor,c=b.editable();(c.isInline()?c:b.document.getWindow().getFrame()).equals(a)&&b.focusManager.focus(c)}function E(){CKEDITOR.env.gecko&&this.editor.unlockSelection();CKEDITOR.env.webkit||(this.editor.forceNextSelectionCheck(), -this.editor.selectionChange(1))}function V(a){var b=null;a.on("data",function(){var a=this.data.classes,d;if(b!=a){for(d in b)a&&a[d]||this.removeClass(d);for(d in a)this.addClass(d);b=a}})}function W(a){a.on("data",function(){if(a.wrapper){var b=this.getLabel?this.getLabel():this.editor.lang.widget.label.replace(/%1/,this.pathName||this.element.getName());a.wrapper.setAttribute("role","region");a.wrapper.setAttribute("aria-label",b)}},null,null,9999)}function X(a){if(a.draggable){var b=a.editor, -c=a.wrapper.getLast(g.isDomDragHandlerContainer),d;c?d=c.findOne("img"):(c=new CKEDITOR.dom.element("span",b.document),c.setAttributes({"class":"cke_reset cke_widget_drag_handler_container",style:"background:rgba(220,220,220,0.5);background-image:url("+b.plugins.widget.path+"images/handle.png)"}),d=new CKEDITOR.dom.element("img",b.document),d.setAttributes({"class":"cke_reset cke_widget_drag_handler","data-cke-widget-drag-handler":"1",src:CKEDITOR.tools.transparentImageData,width:15,title:b.lang.widget.move, -height:15,role:"presentation"}),a.inline&&d.setAttribute("draggable","true"),c.append(d),a.wrapper.append(c));a.wrapper.on("dragover",function(a){a.data.preventDefault()});a.wrapper.on("mouseenter",a.updateDragHandlerPosition,a);setTimeout(function(){a.on("data",a.updateDragHandlerPosition,a)},50);if(!a.inline&&(d.on("mousedown",Y,a),CKEDITOR.env.ie&&9>CKEDITOR.env.version))d.on("dragstart",function(a){a.data.preventDefault(!0)});a.dragHandlerContainer=c}}function Y(a){function b(){var b;for(q.reset();b= -g.pop();)b.removeListener();var c=k;b=a.sender;var d=this.repository.finder,e=this.repository.liner,f=this.editor,h=this.editor.editable();CKEDITOR.tools.isEmpty(e.visible)||(c=d.getRange(c[0]),this.focus(),f.fire("drop",{dropRange:c,target:c.startContainer}));h.removeClass("cke_widget_dragging");e.hideVisible();f.fire("dragend",{target:b})}var c=this.repository.finder,d=this.repository.locator,e=this.repository.liner,f=this.editor,h=f.editable(),g=[],k=[],m,n;this.repository._.draggedWidget=this; -var p=c.greedySearch(),q=CKEDITOR.tools.eventsBuffer(50,function(){m=d.locate(p);k=d.sort(n,1);k.length&&(e.prepare(p,m),e.placeLine(k[0]),e.cleanup())});h.addClass("cke_widget_dragging");g.push(h.on("mousemove",function(a){n=a.data.$.clientY;q.input()}));f.fire("dragstart",{target:a.sender});g.push(f.document.once("mouseup",b,this));h.isInline()||g.push(CKEDITOR.document.once("mouseup",b,this))}function Z(a){var b,c,d=a.editables;a.editables={};if(a.editables)for(b in d)c=d[b],a.initEditable(b,"string"== -typeof c?{selector:c}:c)}function aa(a){if(a.mask){var b=a.wrapper.findOne(".cke_widget_mask");b||(b=new CKEDITOR.dom.element("img",a.editor.document),b.setAttributes({src:CKEDITOR.tools.transparentImageData,"class":"cke_reset cke_widget_mask"}),a.wrapper.append(b));a.mask=b}}function ba(a){if(a.parts){var b={},c,d;for(d in a.parts)c=a.wrapper.findOne(a.parts[d]),b[d]=c;a.parts=b}}function N(a,b){ca(a);ba(a);Z(a);aa(a);X(a);V(a);W(a);if(CKEDITOR.env.ie&&9>CKEDITOR.env.version)a.wrapper.on("dragstart", -function(b){var d=b.data.getTarget();g.getNestedEditable(a,d)||a.inline&&g.isDomDragHandler(d)||b.data.preventDefault()});a.wrapper.removeClass("cke_widget_new");a.element.addClass("cke_widget_element");a.on("key",function(b){b=b.data.keyCode;if(13==b)a.edit();else{if(b==CKEDITOR.CTRL+67||b==CKEDITOR.CTRL+88){y(a,b==CKEDITOR.CTRL+88);return}if(b in da||CKEDITOR.CTRL&b||CKEDITOR.ALT&b)return}return!1},null,null,999);a.on("doubleclick",function(b){a.edit()&&b.cancel()});if(b.data)a.on("data",b.data); -if(b.edit)a.on("edit",b.edit)}function ca(a){(a.wrapper=a.element.getParent()).setAttribute("data-cke-widget-id",a.id)}function r(a){a.element.data("cke-widget-data",encodeURIComponent(JSON.stringify(a.data)))}CKEDITOR.plugins.add("widget",{requires:"lineutils,clipboard,widgetselection",onLoad:function(){CKEDITOR.addCss(".cke_widget_wrapper{position:relative;outline:none}.cke_widget_inline{display:inline-block}.cke_widget_wrapper:hover\x3e.cke_widget_element{outline:2px solid yellow;cursor:default}.cke_widget_wrapper:hover .cke_widget_editable{outline:2px solid yellow}.cke_widget_wrapper.cke_widget_focused\x3e.cke_widget_element,.cke_widget_wrapper .cke_widget_editable.cke_widget_editable_focused{outline:2px solid #ace}.cke_widget_editable{cursor:text}.cke_widget_drag_handler_container{position:absolute;width:15px;height:0;display:none;opacity:0.75;transition:height 0s 0.2s;line-height:0}.cke_widget_wrapper:hover\x3e.cke_widget_drag_handler_container{height:15px;transition:none}.cke_widget_drag_handler_container:hover{opacity:1}img.cke_widget_drag_handler{cursor:move;width:15px;height:15px;display:inline-block}.cke_widget_mask{position:absolute;top:0;left:0;width:100%;height:100%;display:block}.cke_editable.cke_widget_dragging, .cke_editable.cke_widget_dragging *{cursor:move !important}")}, -beforeInit:function(a){a.widgets=new p(a)},afterInit:function(a){var b=a.widgets.registered,c,d,e;for(d in b)c=b[d],(e=c.button)&&a.ui.addButton&&a.ui.addButton(CKEDITOR.tools.capitalize(c.name,!0),{label:e,command:c.name,toolbar:"insert,10"});S(a)}});p.prototype={MIN_SELECTION_CHECK_INTERVAL:500,add:function(a,b){b=CKEDITOR.tools.prototypedCopy(b);b.name=a;b._=b._||{};this.editor.fire("widgetDefinition",b);b.template&&(b.template=new CKEDITOR.template(b.template));O(this.editor,b);P(this,b);return this.registered[a]= -b},addUpcastCallback:function(a){this._.upcastCallbacks.push(a)},checkSelection:function(){var a=this.editor.getSelection(),b=a.getSelectedElement(),c=z(this),d;if(b&&(d=this.getByElement(b,!0)))return c.focus(d).select(d).commit();a=a.getRanges()[0];if(!a||a.collapsed)return c.commit();a=new CKEDITOR.dom.walker(a);for(a.evaluator=g.isDomWidgetWrapper;b=a.next();)c.select(this.getByElement(b));c.commit()},checkWidgets:function(a){this.fire("checkWidgets",CKEDITOR.tools.copy(a||{}))},del:function(a){if(this.focused=== -a){var b=a.editor,c=b.createRange(),d;(d=c.moveToClosestEditablePosition(a.wrapper,!0))||(d=c.moveToClosestEditablePosition(a.wrapper,!1));d&&b.getSelection().selectRanges([c])}a.wrapper.remove();this.destroy(a,!0)},destroy:function(a,b){this.widgetHoldingFocusedEditable===a&&n(this,a,null,b);a.destroy(b);delete this.instances[a.id];this.fire("instanceDestroyed",a)},destroyAll:function(a,b){var c,d,e=this.instances;if(b&&!a){d=b.find(".cke_widget_wrapper");for(var e=d.count(),f=0;f)?(?:<(?:div|span)(?: style="[^"]+")?>)?]*data-cke-copybin-start="1"[^>]*>.?<\/span>([\s\S]+)]*data-cke-copybin-end="1"[^>]*>.?<\/span>(?:<\/(?:div|span)>)?(?:<\/(?:div|span)>)?$/i,da={37:1,38:1,39:1,40:1,8:1,46:1};(function(){function a(){} -function b(a,b,c){return c&&this.checkElement(a)?(a=c.widgets.getByElement(a,!0))&&a.checkStyleActive(this):!1}var c={};CKEDITOR.style.addCustomHandler({type:"widget",setup:function(a){this.widget=a.widget;if(this.group="string"==typeof a.group?[a.group]:a.group){a=this.widget;var b;c[a]||(c[a]={});for(var f=0,h=this.group.length;f=x?0>=p?e():y>=v?e():w():0>=p?y>=v?w():e():w():0>=x?0>=p?y>= -v?w():e():w():0>=p?e():y>=v?e():w();15<=t&&15<=u?(h.setAttributes({width:t,height:u}),z=!0):z=!1},n);l("mouseup",function(){for(var d;d=n.pop();)d.removeListener();c.removeClass(r);f.removeClass("cke_image_resizing");z&&(a.setData({width:t,height:u}),b.fire("saveSnapshot"));z=!1},n);c.addClass(r);f.addClass("cke_image_resizing")});a.on("data",function(){f["right"==a.data.align?"addClass":"removeClass"]("cke_image_resizer_left")})}function L(a){var b=[],c;return function(g){var f=a.getCommand("justify"+ -g);if(f){b.push(function(){f.refresh(a,a.elementPath())});if(g in{right:1,left:1,center:1})f.on("exec",function(d){var c=k(a);if(c){c.setData("align",g);for(c=b.length;c--;)b[c]();d.cancel()}});f.on("refresh",function(b){var f=k(a),h={right:1,left:1,center:1};f&&(void 0===c&&(c=a.filter.checkFeature(a.widgets.registered.image.features.align)),c?this.setState(f.data.align==g?CKEDITOR.TRISTATE_ON:g in h?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED):this.setState(CKEDITOR.TRISTATE_DISABLED),b.cancel())})}}} -function M(a){a.plugins.link&&(CKEDITOR.on("dialogDefinition",function(b){b=b.data;if("link"==b.name){b=b.definition;var c=b.onShow,g=b.onOk;b.onShow=function(){var b=k(a),d=this.getContentElement("info","linkDisplayText").getElement().getParent().getParent();b&&(b.inline?!b.wrapper.getAscendant("a"):1)?(this.setupContent(b.data.link||{}),d.hide()):(d.show(),c.apply(this,arguments))};b.onOk=function(){var b=k(a);if(b&&(b.inline?!b.wrapper.getAscendant("a"):1)){var c={};this.commitContent(c);b.setData("link", -c)}else g.apply(this,arguments)}}}),a.getCommand("unlink").on("exec",function(b){var c=k(a);c&&c.parts.link&&(c.setData("link",null),this.refresh(a,a.elementPath()),b.cancel())}),a.getCommand("unlink").on("refresh",function(b){var c=k(a);c&&(this.setState(c.data.link||c.wrapper.getAscendant("a")?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED),b.cancel())}))}function k(a){return(a=a.widgets.focused)&&"image"==a.name?a:null}function E(a){var b=a.config.image2_alignClasses;a={div:{match:n(a)},p:{match:n(a)}, -img:{attributes:"!src,alt,width,height"},figure:{classes:"!"+a.config.image2_captionedClass},figcaption:!0};b?(a.div.classes=b[1],a.p.classes=a.div.classes,a.img.classes=b[0]+","+b[2],a.figure.classes+=","+a.img.classes):(a.div.styles="text-align",a.p.styles="text-align",a.img.styles="float",a.figure.styles="float,display");return a}function F(a){a=a.config.image2_alignClasses;return{dimension:{requiredContent:"img[width,height]"},align:{requiredContent:"img"+(a?"("+a[0]+")":"{float}")},caption:{requiredContent:"figcaption"}}} -function m(a){return a.data.hasCaption?a.element:a.parts.image}var N=new CKEDITOR.template('\x3cfigure class\x3d"{captionedClass}"\x3e\x3cimg alt\x3d"" src\x3d"" /\x3e\x3cfigcaption\x3e{captionPlaceholder}\x3c/figcaption\x3e\x3c/figure\x3e'),q={left:0,center:1,right:2},J=/^\s*(\d+\%)\s*$/i;CKEDITOR.plugins.add("image2",{requires:"widget,dialog",icons:"image",hidpi:!0,onLoad:function(){CKEDITOR.addCss(".cke_image_nocaption{line-height:0}.cke_editable.cke_image_sw, .cke_editable.cke_image_sw *{cursor:sw-resize !important}.cke_editable.cke_image_se, .cke_editable.cke_image_se *{cursor:se-resize !important}.cke_image_resizer{display:none;position:absolute;width:10px;height:10px;bottom:-5px;right:-5px;background:#000;outline:1px solid #fff;line-height:0;cursor:se-resize;}.cke_image_resizer_wrapper{position:relative;display:inline-block;line-height:0;}.cke_image_resizer.cke_image_resizer_left{right:auto;left:-5px;cursor:sw-resize;}.cke_widget_wrapper:hover .cke_image_resizer,.cke_image_resizer.cke_image_resizing{display:block}.cke_widget_wrapper\x3ea{display:inline-block}")}, -init:function(a){var b=a.config,c=a.lang.image2,g=D(a);b.filebrowserImage2BrowseUrl=b.filebrowserImageBrowseUrl;b.filebrowserImage2UploadUrl=b.filebrowserImageUploadUrl;g.pathName=c.pathName;g.editables.caption.pathName=c.pathNameCaption;a.widgets.add("image",g);a.ui.addButton&&a.ui.addButton("Image",{label:a.lang.common.image,command:"image",toolbar:"insert,10"});a.contextMenu&&(a.addMenuGroup("image",10),a.addMenuItem("image",{label:c.menu,command:"image",group:"image"}));CKEDITOR.dialog.add("image2", -this.path+"dialogs/image2.js")},afterInit:function(a){var b={left:1,right:1,center:1,block:1},c=L(a),g;for(g in b)c(g);M(a)}});CKEDITOR.plugins.image2={stateShifter:function(a){function b(a,b){var d={};f?d.attributes={"class":f[1]}:d.styles={"text-align":"center"};d=g.createElement(a.activeEnterMode==CKEDITOR.ENTER_P?"p":"div",d);c(d,b);b.move(d);return d}function c(b,d){if(d.getParent()){var c=a.createRange();c.moveToPosition(d,CKEDITOR.POSITION_BEFORE_START);d.remove();e.insertElementIntoRange(b, -c)}else b.replace(d)}var g=a.document,f=a.config.image2_alignClasses,d=a.config.image2_captionedClass,e=a.editable(),h=["hasCaption","align","link"],k={align:function(d,c,g){var e=d.element;d.changed.align?d.newData.hasCaption||("center"==g&&(d.deflate(),d.element=b(a,e)),d.changed.hasCaption||"center"!=c||"center"==g||(d.deflate(),c=e.findOne("a,img"),c.replace(e),d.element=c)):"center"==g&&d.changed.hasCaption&&!d.newData.hasCaption&&(d.deflate(),d.element=b(a,e));!f&&e.is("figure")&&("center"== -g?e.setStyle("display","inline-block"):e.removeStyle("display"))},hasCaption:function(b,e,f){b.changed.hasCaption&&(e=b.element.is({img:1,a:1})?b.element:b.element.findOne("a,img"),b.deflate(),f?(f=CKEDITOR.dom.element.createFromHtml(N.output({captionedClass:d,captionPlaceholder:a.lang.image2.captionPlaceholder}),g),c(f,b.element),e.replace(f.findOne("img")),b.element=f):(e.replace(b.element),b.element=e))},link:function(b,d,c){if(b.changed.link){var e=b.element.is("img")?b.element:b.element.findOne("img"), -f=b.element.is("a")?b.element:b.element.findOne("a"),h=b.element.is("a")&&!c||b.element.is("img")&&c,k;h&&b.deflate();c?(d||(k=g.createElement("a",{attributes:{href:b.newData.link.url}}),k.replace(e),e.move(k)),c=CKEDITOR.plugins.image2.getLinkAttributesGetter()(a,c),CKEDITOR.tools.isEmpty(c.set)||(k||f).setAttributes(c.set),c.removed.length&&(k||f).removeAttributes(c.removed)):(c=f.findOne("img"),c.replace(f),k=c);h&&(b.element=k)}}};return function(a){var b,c;a.changed={};for(c=0;ce.length)return!1;g=b.getParents(!0);for(a=0;an;a++)k[a].indent+=g;e=CKEDITOR.plugins.list.arrayToList(k,q,null,c.config.enterMode,b.getDirection());if(!l.isIndent){var f;if((f=b.getParent())&&f.is("li"))for(var g=e.listNode.getChildren(),r=[],m,a=g.count()-1;0<=a;a--)(m=g.getItem(a))&&m.is&&m.is("li")&& -r.push(m)}e&&e.listNode.replace(b);if(r&&r.length)for(a=0;af[k-1].indent+1){g=f[k-1].indent+1-f[k].indent;for(h=f[k].indent;f[k]&&f[k].indent>=h;)f[k].indent+=g,k++;k--}var d=CKEDITOR.plugins.list.arrayToList(f,e,null,b.config.enterMode,m.root.getAttribute("dir")).listNode,a,p;c(!0);c();d.replace(m.root);b.fire("contentDomInvalidated")}function B(b,m){this.name=b;this.context=this.type=m;this.allowedContent= -m+" li";this.requiredContent=m}function E(b,m,e,c){for(var f,g;f=b[c?"getLast":"getFirst"](J);)(g=f.getDirection(1))!==m.getDirection(1)&&f.setAttribute("dir",g),f.remove(),e?f[c?"insertBefore":"insertAfter"](e):m.append(f,c)}function F(b){function m(e){var c=b[e?"getPrevious":"getNext"](u);c&&c.type==CKEDITOR.NODE_ELEMENT&&c.is(b.getName())&&(E(b,c,null,!e),b.remove(),b=c)}m();m(1)}function G(b){return b.type==CKEDITOR.NODE_ELEMENT&&(b.getName()in CKEDITOR.dtd.$block||b.getName()in CKEDITOR.dtd.$listItem)&& -CKEDITOR.dtd[b.getName()]["#"]}function C(b,m,e){b.fire("saveSnapshot");e.enlarge(CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS);var c=e.extractContents();m.trim(!1,!0);var f=m.createBookmark(),g=new CKEDITOR.dom.elementPath(m.startContainer),k=g.block,g=g.lastElement.getAscendant("li",1)||k,h=new CKEDITOR.dom.elementPath(e.startContainer),d=h.contains(CKEDITOR.dtd.$listItem),h=h.contains(CKEDITOR.dtd.$list);k?(k=k.getBogus())&&k.remove():h&&(k=h.getPrevious(u))&&z(k)&&k.remove();(k=c.getLast())&&k.type==CKEDITOR.NODE_ELEMENT&& -k.is("br")&&k.remove();(k=m.startContainer.getChild(m.startOffset))?c.insertBefore(k):m.startContainer.append(c);d&&(c=A(d))&&(g.contains(d)?(E(c,d.getParent(),d),c.remove()):g.append(c));for(;e.checkStartOfBlock()&&e.checkEndOfBlock();){h=e.startPath();c=h.block;if(!c)break;c.is("li")&&(g=c.getParent(),c.equals(g.getLast(u))&&c.equals(g.getFirst(u))&&(c=g));e.moveToPosition(c,CKEDITOR.POSITION_BEFORE_START);c.remove()}e=e.clone();c=b.editable();e.setEndAt(c,CKEDITOR.POSITION_BEFORE_END);e=new CKEDITOR.dom.walker(e); -e.evaluator=function(a){return u(a)&&!z(a)};(e=e.next())&&e.type==CKEDITOR.NODE_ELEMENT&&e.getName()in CKEDITOR.dtd.$list&&F(e);m.moveToBookmark(f);m.select();b.fire("saveSnapshot")}function A(b){return(b=b.getLast(u))&&b.type==CKEDITOR.NODE_ELEMENT&&b.getName()in v?b:null}var v={ol:1,ul:1},K=CKEDITOR.dom.walker.whitespaces(),H=CKEDITOR.dom.walker.bookmark(),u=function(b){return!(K(b)||H(b))},z=CKEDITOR.dom.walker.bogus();CKEDITOR.plugins.list={listToArray:function(b,m,e,c,f){if(!v[b.getName()])return[]; -c||(c=0);e||(e=[]);for(var g=0,k=b.getChildCount();g=k.$.documentMode&&l.append(k.createText(" ")),l.append(a.listNode),a=a.nextIndex;else if(-1== -r.indent&&!e&&g){v[g.getName()]?(l=r.element.clone(!1,!0),q!=g.getDirection(1)&&l.setAttribute("dir",q)):l=new CKEDITOR.dom.documentFragment(k);var d=g.getDirection(1)!=q,y=r.element,D=y.getAttribute("class"),z=y.getAttribute("style"),A=l.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT&&(c!=CKEDITOR.ENTER_BR||d||z||D),w,B=r.contents.length,x;for(g=0;gh.length)){l= -h[h.length-1].getNext();n=c.createElement(this.type);d.push(n);for(t=d=void 0;h.length;)d=h.shift(),t=c.createElement("li"),r=d,r.is("pre")||L.test(r.getName())||"false"==r.getAttribute("contenteditable")?d.appendTo(t):(d.copyAttributes(t),a&&d.getDirection()&&(t.removeStyle("direction"),t.removeAttribute("dir")),d.moveChildren(t),d.remove()),t.appendTo(n);a&&p&&n.setAttribute("dir",a);l?n.insertBefore(l):n.appendTo(g)}}else this.state==CKEDITOR.TRISTATE_ON&&v[a.root.getName()]&&I.call(this,b,a,k); -for(n=0;n');for(var h=0;h");for(var e=0;e");b.push("")}b.push("
");return b.join("")}function j(a,b,c,h){for(var b=b.$.tBodies[0].rows,e=0;ed||0>g?this.panel.hide():((d>n-1||g>o-1)&&f.execCommand("table"),j(c,b,d+1,g+ -1),a.data.preventDefault(),a.data.stopPropagation())});return b},createMoreButton:function(){var a=new CKEDITOR.dom.element("a");a.setAttributes({_cke_focus:1,hidefocus:!0,title:f.lang.quicktable.more,href:'javascript:void("'+f.lang.quicktable.more+'")',role:"option"});a.addClass("cke_colormore");a.setText(f.lang.quicktable.more);a.setStyle("text-align","center");a.on("click",function(a){f.execCommand("table");a.data.preventDefault()});return a},onOpen:function(){j(this.caption,this.table,1,1)}})}});CKEDITOR.plugins.add("removeformat",{init:function(a){a.addCommand("removeFormat",CKEDITOR.plugins.removeformat.commands.removeformat);a.ui.addButton&&a.ui.addButton("RemoveFormat",{label:a.lang.removeformat.toolbar,command:"removeFormat",toolbar:"cleanup,10"})}}); -CKEDITOR.plugins.removeformat={commands:{removeformat:{exec:function(a){for(var h=a._.removeFormatRegex||(a._.removeFormatRegex=new RegExp("^(?:"+a.config.removeFormatTags.replace(/,/g,"|")+")$","i")),e=a._.removeAttributes||(a._.removeAttributes=a.config.removeFormatAttributes.split(",")),f=CKEDITOR.plugins.removeformat.filter,m=a.getSelection().getRanges(),n=m.createIterator(),p=function(a){return a.type==CKEDITOR.NODE_ELEMENT},c;c=n.getNextRange();){c.collapsed||c.enlarge(CKEDITOR.ENLARGE_ELEMENT); -var l=c.createBookmark(),b=l.startNode,d=l.endNode,k=function(b){for(var c=a.elementPath(b),e=c.elements,d=1,g;(g=e[d])&&!g.equals(c.block)&&!g.equals(c.blockLimit);d++)h.test(g.getName())&&f(a,g)&&b.breakParent(g)};k(b);if(d)for(k(d),b=b.getNextSourceNode(!0,CKEDITOR.NODE_ELEMENT);b&&!b.equals(d);)if(b.isReadOnly()){if(b.getPosition(d)&CKEDITOR.POSITION_CONTAINS)break;b=b.getNext(p)}else k=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT),"img"==b.getName()&&b.data("cke-realelement")||!f(a,b)||(h.test(b.getName())? -b.remove(1):(b.removeAttributes(e),a.fire("removeFormatCleanup",b))),b=k;c.moveToBookmark(l)}a.forceNextSelectionCheck();a.getSelection().selectRanges(m)}}},filter:function(a,h){for(var e=a._.removeFormatFilters||[],f=0;fa.order?-1:0>b.order?1:b.order=this.strokesLimit;this.typing||(this.hasUndo=this.typing=!0,this.hasRedo=!1,this.onChange());b?(d=0,this.editor.fire("saveSnapshot")):this.editor.fire("change");this.strokesRecorded[c]= -d;this.previousKeyGroup=c},keyGroupChanged:function(a){return e.getKeyGroup(a)!=this.previousKeyGroup},reset:function(){this.snapshots=[];this.index=-1;this.currentImage=null;this.hasRedo=this.hasUndo=!1;this.locked=null;this.resetType()},resetType:function(){this.strokesRecorded=[0,0];this.typing=!1;this.previousKeyGroup=-1},refreshState:function(){this.hasUndo=!!this.getNextImage(!0);this.hasRedo=!!this.getNextImage(!1);this.resetType();this.onChange()},save:function(a,b,c){var d=this.editor;if(this.locked|| -"ready"!=d.status||"wysiwyg"!=d.mode)return!1;var e=d.editable();if(!e||"ready"!=e.status)return!1;e=this.snapshots;b||(b=new f(d));if(!1===b.contents)return!1;if(this.currentImage)if(b.equalsContent(this.currentImage)){if(a||b.equalsSelection(this.currentImage))return!1}else!1!==c&&d.fire("change");e.splice(this.index+1,e.length-this.index-1);e.length==this.limit&&e.shift();this.index=e.push(b)-1;this.currentImage=b;!1!==c&&this.refreshState();return!0},restoreImage:function(a){var b=this.editor, -c;a.bookmarks&&(b.focus(),c=b.getSelection());this.locked={level:999};this.editor.loadSnapshot(a.contents);a.bookmarks?c.selectBookmarks(a.bookmarks):CKEDITOR.env.ie&&(c=this.editor.document.getBody().$.createTextRange(),c.collapse(!0),c.select());this.locked=null;this.index=a.index;this.currentImage=this.snapshots[this.index];this.update();this.refreshState();b.fire("change")},getNextImage:function(a){var b=this.snapshots,c=this.currentImage,d;if(c)if(a)for(d=this.index-1;0<=d;d--){if(a=b[d],!c.equalsContent(a))return a.index= -d,a}else for(d=this.index+1;d=this.undoManager.strokesLimit&&(this.undoManager.type(a.keyCode,!0),this.keyEventsStack.resetInputs())}},onKeyup:function(a){var b=this.undoManager; -a=a.data.getKey();var c=this.keyEventsStack.getTotalInputs();this.keyEventsStack.remove(a);if(!(e.ieFunctionalKeysBug(a)&&this.lastKeydownImage&&this.lastKeydownImage.equalsContent(new f(b.editor,!0))))if(0this.$.offsetHeight){var d=b.createRange();d[33==c?"moveToElementEditStart":"moveToElementEditEnd"](this);d.select();a.data.preventDefault()}});CKEDITOR.env.ie&&this.attachListener(c,"blur",function(){try{c.$.selection.empty()}catch(a){}});CKEDITOR.env.iOS&&this.attachListener(c,"touchend",function(){a.focus()});d=b.document.getElementsByTag("title").getItem(0);d.data("cke-title",d.getText());CKEDITOR.env.ie&&(b.document.$.title=this._.docTitle);CKEDITOR.tools.setTimeout(function(){"unloaded"== -this.status&&(this.status="ready");b.fire("contentDom");this._.isPendingFocus&&(b.focus(),this._.isPendingFocus=!1);setTimeout(function(){b.fire("dataReady")},0)},0,this)}function n(a){function f(){var c;a.editable().attachListener(a,"selectionChange",function(){var d=a.getSelection().getSelectedElement();d&&(c&&(c.detachEvent("onresizestart",b),c=null),d.$.attachEvent("onresizestart",b),c=d.$)})}function b(a){a.returnValue=!1}if(CKEDITOR.env.gecko)try{var c=a.document.$;c.execCommand("enableObjectResizing", -!1,!a.config.disableObjectResizing);c.execCommand("enableInlineTableEditing",!1,!a.config.disableNativeTableHandles)}catch(d){}else CKEDITOR.env.ie&&11>CKEDITOR.env.version&&a.config.disableObjectResizing&&f(a)}function p(){var a=[];if(8<=CKEDITOR.document.$.documentMode){a.push("html.CSS1Compat [contenteditable\x3dfalse]{min-height:0 !important}");var f=[],b;for(b in CKEDITOR.dtd.$removeEmpty)f.push("html.CSS1Compat "+b+"[contenteditable\x3dfalse]");a.push(f.join(",")+"{display:inline-block}")}else CKEDITOR.env.gecko&& -(a.push("html{height:100% !important}"),a.push("img:-moz-broken{-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}"));a.push("html{cursor:text;*cursor:auto}");a.push("img,input,textarea{cursor:default}");return a.join("\n")}var l;CKEDITOR.plugins.add("wysiwygarea",{init:function(a){a.config.fullPage&&a.addFeature({allowedContent:"html head title; style [media,type]; body (*)[id]; meta link [*]",requiredContent:"body"});a.addMode("wysiwyg",function(f){function b(b){b&&b.removeListener(); -a.editable(new l(a,d.$.contentWindow.document.body));a.setData(a.getData(1),f)}var c="document.open();"+(CKEDITOR.env.ie?"("+CKEDITOR.tools.fixDomain+")();":"")+"document.close();",c=CKEDITOR.env.air?"javascript:void(0)":CKEDITOR.env.ie&&!CKEDITOR.env.edge?"javascript:void(function(){"+encodeURIComponent(c)+"}())":"",d=CKEDITOR.dom.element.createFromHtml('\x3ciframe src\x3d"'+c+'" frameBorder\x3d"0"\x3e\x3c/iframe\x3e');d.setStyles({width:"100%",height:"100%"});d.addClass("cke_wysiwyg_frame").addClass("cke_reset"); -c=a.ui.space("contents");c.append(d);var e=CKEDITOR.env.ie&&!CKEDITOR.env.edge||CKEDITOR.env.gecko;if(e)d.on("load",b);var g=a.title,h=a.fire("ariaEditorHelpLabel",{}).label;g&&(CKEDITOR.env.ie&&h&&(g+=", "+h),d.setAttribute("title",g));if(h){var g=CKEDITOR.tools.getNextId(),k=CKEDITOR.dom.element.createFromHtml('\x3cspan id\x3d"'+g+'" class\x3d"cke_voice_label"\x3e'+h+"\x3c/span\x3e");c.append(k,1);d.setAttribute("aria-describedby",g)}a.on("beforeModeUnload",function(a){a.removeListener();k&&k.remove()}); -d.setAttributes({tabIndex:a.tabIndex,allowTransparency:"true"});!e&&b();a.fire("ariaWidget",d)})}});CKEDITOR.editor.prototype.addContentsCss=function(a){var f=this.config,b=f.contentsCss;CKEDITOR.tools.isArray(b)||(f.contentsCss=b?[b]:[]);f.contentsCss.push(a)};l=CKEDITOR.tools.createClass({$:function(){this.base.apply(this,arguments);this._.frameLoadedHandler=CKEDITOR.tools.addFunction(function(a){CKEDITOR.tools.setTimeout(m,0,this,a)},this);this._.docTitle=this.getWindow().getFrame().getAttribute("title")}, -base:CKEDITOR.editable,proto:{setData:function(a,f){var b=this.editor;if(f)this.setHtml(a),this.fixInitialSelection(),b.fire("dataReady");else{this._.isLoadingData=!0;b._.dataStore={id:1};var c=b.config,d=c.fullPage,e=c.docType,g=CKEDITOR.tools.buildStyleHtml(p()).replace(/ - - - <%=content%> - - \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/signature/plugin.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/signature/plugin.js deleted file mode 100755 index 2169c84f..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/signature/plugin.js +++ /dev/null @@ -1,141 +0,0 @@ - -(function(CKEDITOR, $, undefined) { - - 'use strict'; - - var rl_signature_replacer = function(editor, text, signature, isHtml, insertBefore) { - - var - skipInsert = false, - isEmptyText = false, - newLine = (isHtml ? '
' : "\n"), - clearHtmlLine = function(html) { - return $.trim(editor.__textUtils.htmlToPlain(html)); - }; - - isEmptyText = '' === $.trim(text); - if (!isEmptyText && isHtml) - { - isEmptyText = '' === clearHtmlLine(text); - } - - if (editor.__previos_signature && !isEmptyText) - { - if (isHtml && !editor.__previos_signature_is_html) - { - editor.__previos_signature = editor.__textUtils.plainToHtml(editor.__previos_signature); - editor.__previos_signature_is_html = true; - } - else if (!isHtml && editor.__previos_signature_is_html) - { - editor.__previos_signature = editor.__textUtils.htmlToPlain(editor.__previos_signature); - editor.__previos_signature_is_html = false; - } - - skipInsert = false; - if (isHtml) - { - var clearSig = clearHtmlLine(editor.__previos_signature); - text = text.replace(/([\s\S]*)<\/signature>/igm, function(all){ - var c = clearSig === clearHtmlLine(all); - if (!c) { - skipInsert = true; - } - return c ? '' : all; - }); - } - else - { - var textLen = text.length; - text = text - .replace('' + editor.__previos_signature, '') - .replace('' + editor.__previos_signature, ''); - - if (textLen === text.length) - { - skipInsert = true; - } - } - } - - if (!skipInsert) - { - signature = newLine + newLine + (isHtml ? '' : '') + signature + (isHtml ? '' : ''); - - text = insertBefore ? signature + text : text + signature; - - if (10 < signature.length) - { - editor.__previos_signature = signature; - editor.__previos_signature_is_html = isHtml; - } - } - - return text; - }; - - CKEDITOR.plugins.add('signature', { - init: function(editor) { - editor.addCommand('insertSignature', { - modes: {wysiwyg: 1, plain: 1}, - exec: function(editor, cfg) { - - if (cfg && cfg.clearCache) - { - editor.__previos_signature = undefined; - editor.__previos_signature_is_html = undefined; - return true; - } - - var - bIsHtml = false, - bInsertBefore = false, - sSignature = '', - sResultSignature = ''; - - if (cfg) - { - bIsHtml = undefined === cfg.isHtml ? false : !!cfg.isHtml; - bInsertBefore = undefined === cfg.insertBefore ? false : !!cfg.insertBefore; - sSignature = undefined === cfg.signature ? '' : cfg.signature; - } - - sResultSignature = sSignature; - - try - { - if ('plain' === editor.mode && editor.__plain && editor.__textUtils) - { - if (editor.__textUtils && editor.__textUtils.htmlToPlain) - { - if (bIsHtml) - { - sResultSignature = editor.__textUtils.htmlToPlain(sResultSignature); - } - } - - editor.__plain.setRawData( - rl_signature_replacer(editor, editor.__plain.getRawData(), sResultSignature, false, bInsertBefore)); - - } - else - { - if (editor.__textUtils && editor.__textUtils.plainToHtml) - { - if (!bIsHtml) - { - sResultSignature = editor.__textUtils.plainToHtml(sResultSignature); - } - } - - editor.setData( - rl_signature_replacer(editor, editor.getData(), sResultSignature, true, bInsertBefore)); - } - } - catch (e) {} - } - }); - } - }); - -}(CKEDITOR, $)); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/table/dialogs/table.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/table/dialogs/table.js deleted file mode 100755 index 7387effd..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/plugins/table/dialogs/table.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. - For licensing, see LICENSE.md or http://ckeditor.com/license -*/ -(function(){function v(a){for(var f=0,n=0,l=0,p,e=a.$.rows.length;ln&&(n=f)}return n}function r(a){return function(){var f=this.getValue(),f=!!(CKEDITOR.dialog.validate.integer()(f)&&0q.getSize("width")?"100%":500:0,getValue:u,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1", -a.lang.common.width)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles");a&&a.updateStyle("width",this.getValue())},setup:function(a){a=a.getStyle("width");this.setValue(a)},commit:l}]},{type:"hbox",widths:["5em"],children:[{type:"text",id:"txtHeight",requiredContent:"table{height}",controlStyle:"width:5em",label:a.lang.common.height,title:a.lang.common.cssLengthTooltip,"default":"",getValue:u,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1", -a.lang.common.height)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles");a&&a.updateStyle("height",this.getValue())},setup:function(a){(a=a.getStyle("height"))&&this.setValue(a)},commit:l}]},{type:"html",html:"\x26nbsp;"},{type:"text",id:"txtCellSpace",requiredContent:"table[cellspacing]",controlStyle:"width:3em",label:a.lang.table.cellSpace,"default":a.filter.check("table[cellspacing]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellSpacing), -setup:function(a){this.setValue(a.getAttribute("cellSpacing")||"")},commit:function(a,d){this.getValue()?d.setAttribute("cellSpacing",this.getValue()):d.removeAttribute("cellSpacing")}},{type:"text",id:"txtCellPad",requiredContent:"table[cellpadding]",controlStyle:"width:3em",label:a.lang.table.cellPad,"default":a.filter.check("table[cellpadding]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellPadding),setup:function(a){this.setValue(a.getAttribute("cellPadding")||"")},commit:function(a, -d){this.getValue()?d.setAttribute("cellPadding",this.getValue()):d.removeAttribute("cellPadding")}}]}]},{type:"html",align:"right",html:""},{type:"vbox",padding:0,children:[{type:"text",id:"txtCaption",requiredContent:"caption",label:a.lang.table.caption,setup:function(a){this.enable();a=a.getElementsByTag("caption");if(0Q&R(y%F4>B zs;Uq!kbwq_7Top+>f$X4@(X6LuyOG4sc+bE;L!1t|K@(+14@K=x;Tb#Tu;8Rb9cks z#J94nZHsw$wz2W7VVBS|FgP>!0K<|7o;WsvWX2Z8B?>%jY}0rZj)}3g-PxTm;lP0# v3__VH4l5d8H_c`?|H*MfZyGa?!EHvRt#Zd+?pApQG@rrK)z4*}Q$iB}(WFB8 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog.css deleted file mode 100755 index 76f88543..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog.css +++ /dev/null @@ -1,5 +0,0 @@ -/* -Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. -For licensing, see LICENSE.md or http://ckeditor.com/license -*/ -.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#fff}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:12px;cursor:move;position:relative;color:#484848;border-bottom:1px solid #d1d1d1;padding:12px 19px 12px 12px;background:#f8f8f8;letter-spacing:.3px}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border:2px solid rgba(102,102,102,0.2);border-left-color:rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:43px;border-top:1px solid #d1d1d1}.cke_dialog_contents_body{overflow:auto;padding:9px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:33px;display:inline-block;margin:9px 0 0;position:absolute;z-index:2;left:11px}.cke_rtl .cke_dialog_tabs{left:auto;right:11px}a.cke_dialog_tab{height:25px;padding:4px 8px;display:inline-block;cursor:pointer;line-height:26px;outline:0;color:#484848;border:1px solid #d1d1d1;border-radius:3px 3px 0 0;background:#f8f8f8;min-width:90px;text-align:center;margin-left:-1px;letter-spacing:.3px}a.cke_dialog_tab:hover{background-color:#fff}a.cke_dialog_tab:focus{border:2px solid #139ff7;border-bottom-color:#d1d1d1;padding:3px 7px;position:relative;z-index:1}a.cke_dialog_tab_selected{background:#fff;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus{border-bottom-color:#fff}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:16px;width:16px;top:11px;z-index:5;opacity:.7;filter:alpha(opacity = 70)}.cke_rtl .cke_dialog_close_button{left:12px}.cke_ltr .cke_dialog_close_button{right:12px}.cke_hc a.cke_dialog_close_button{background-image:none}.cke_hidpi a.cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}a.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}a.cke_dialog_close_button span{display:none}.cke_hc a.cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%;margin-top:12px}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #bcbcbc;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:2px;min-height:28px;margin-left:1px}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:2px solid #139ff7}input.cke_dialog_ui_input_text:focus{padding-left:5px}textarea.cke_dialog_ui_input_textarea:focus{padding:3px 5px}select.cke_dialog_ui_input_select:focus{margin:0;width:100%!important}input.cke_dialog_ui_checkbox_input,input.cke_dialog_ui_radio_input{margin-left:1px;margin-right:2px}input.cke_dialog_ui_checkbox_input:focus,input.cke_dialog_ui_checkbox_input:active,input.cke_dialog_ui_radio_input:focus,input.cke_dialog_ui_radio_input:active{border:0;outline:2px solid #139ff7}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 1px;margin:0;text-align:center;color:#484848;vertical-align:middle;cursor:pointer;border:1px solid #bcbcbc;border-radius:2px;background:#f8f8f8;letter-spacing:.3px;line-height:18px;box-sizing:border-box}.cke_hc a.cke_dialog_ui_button{border-width:3px}span.cke_dialog_ui_button{padding:0 10px;cursor:pointer}a.cke_dialog_ui_button:hover{background:#fff}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border:2px solid #139ff7;outline:0;padding:3px 0}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;background:#09863e;border:1px solid #09863e}.cke_hc a.cke_dialog_ui_button{border:3px solid #bcbcbc}a.cke_dialog_ui_button_ok:hover{background:#53aa78;border-color:#53aa78}a.cke_dialog_ui_button_ok:focus{box-shadow:inset 0 0 0 2px #FFF}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#139ff7}.cke_hc a.cke_dialog_ui_button_ok:hover,.cke_hc a.cke_dialog_ui_button_ok:focus,.cke_hc a.cke_dialog_ui_button_ok:active{border-color:#484848}a.cke_dialog_ui_button_ok.cke_disabled{background:#d1d1d1;border-color:#d1d1d1;cursor:default}a.cke_dialog_ui_button_ok.cke_disabled span{cursor:default}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:28px;line-height:28px;background-color:#fff;border:1px solid #bcbcbc;padding:3px 3px 3px 6px;outline:0;border-radius:2px;margin:0 1px;box-sizing:border-box;width:calc(100% - 2px)!important}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog_ui_labeled_label{margin-left:1px}.cke_dialog .cke_dark_background{background-color:transparent}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked,.cke_dialog a.cke_btn_reset{margin:2px}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_dialog a.cke_btn_over,.cke_dialog a.cke_btn_locked:hover,.cke_dialog a.cke_btn_locked:focus,.cke_dialog a.cke_btn_locked:active,.cke_dialog a.cke_btn_unlocked:hover,.cke_dialog a.cke_btn_unlocked:focus,.cke_dialog a.cke_btn_unlocked:active,.cke_dialog a.cke_btn_reset:hover,.cke_dialog a.cke_btn_reset:focus,.cke_dialog a.cke_btn_reset:active{cursor:pointer;outline:0;margin:0;border:2px solid #139ff7}.cke_dialog fieldset{border:1px solid #bcbcbc}.cke_dialog fieldset legend{padding:0 6px}.cke_dialog_ui_checkbox,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{display:inline-block}.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{padding-top:5px}.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label{vertical-align:middle}.cke_dialog .ImagePreviewBox{border:1px ridge #bcbcbc;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:1px solid #bcbcbc;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;cursor:default;letter-spacing:.3px}.cke_dialog_body label+.cke_dialog_ui_labeled_content{margin-top:2px}.cke_dialog_contents_body .cke_dialog_ui_text,.cke_dialog_contents_body .cke_dialog_ui_select,.cke_dialog_contents_body .cke_dialog_ui_hbox_last>a.cke_dialog_ui_button{margin-top:4px}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:2px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_contents_body .cke_accessibility_legend{margin:2px 7px 2px 2px}.cke_dialog_contents_body .cke_accessibility_legend:focus,.cke_dialog_contents_body .cke_accessibility_legend:active{outline:0;border:2px solid #139ff7;margin:0 5px 0 0}.cke_dialog_contents_body input[type=file]:focus,.cke_dialog_contents_body input[type=file]:active{border:2px solid #139ff7}.cke_dialog_find_fieldset{margin-top:10px!important}.cke_dialog_image_ratiolock{margin-top:52px!important}.cke_dialog_forms_select_order label.cke_dialog_ui_labeled_label{margin-left:0}.cke_dialog_forms_select_order div.cke_dialog_ui_input_select{width:100%}.cke_dialog_forms_select_order_txtsize .cke_dialog_ui_hbox_last{padding-top:4px}.cke_dialog_image_url .cke_dialog_ui_hbox_last,.cke_dialog_flash_url .cke_dialog_ui_hbox_last{vertical-align:bottom}a.cke_dialog_ui_button.cke_dialog_image_browse{margin-top:10px}.cke_dialog_contents_body .cke_tpl_list{border:#bcbcbc 1px solid;margin:1px}.cke_dialog_contents_body .cke_tpl_list:focus,.cke_dialog_contents_body .cke_tpl_list:active{outline:0;margin:0;border:2px solid #139ff7}.cke_dialog_contents_body .cke_tpl_list a:focus,.cke_dialog_contents_body .cke_tpl_list a:active{outline:0}.cke_dialog_contents_body .cke_tpl_list a:focus .cke_tpl_item,.cke_dialog_contents_body .cke_tpl_list a:active .cke_tpl_item{border:2px solid #139ff7;padding:6px} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_ie.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_ie.css deleted file mode 100755 index cc53ab1e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_ie.css +++ /dev/null @@ -1,5 +0,0 @@ -/* -Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. -For licensing, see LICENSE.md or http://ckeditor.com/license -*/ -.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#fff}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:12px;cursor:move;position:relative;color:#484848;border-bottom:1px solid #d1d1d1;padding:12px 19px 12px 12px;background:#f8f8f8;letter-spacing:.3px}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border:2px solid rgba(102,102,102,0.2);border-left-color:rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:43px;border-top:1px solid #d1d1d1}.cke_dialog_contents_body{overflow:auto;padding:9px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:33px;display:inline-block;margin:9px 0 0;position:absolute;z-index:2;left:11px}.cke_rtl .cke_dialog_tabs{left:auto;right:11px}a.cke_dialog_tab{height:25px;padding:4px 8px;display:inline-block;cursor:pointer;line-height:26px;outline:0;color:#484848;border:1px solid #d1d1d1;border-radius:3px 3px 0 0;background:#f8f8f8;min-width:90px;text-align:center;margin-left:-1px;letter-spacing:.3px}a.cke_dialog_tab:hover{background-color:#fff}a.cke_dialog_tab:focus{border:2px solid #139ff7;border-bottom-color:#d1d1d1;padding:3px 7px;position:relative;z-index:1}a.cke_dialog_tab_selected{background:#fff;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus{border-bottom-color:#fff}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:16px;width:16px;top:11px;z-index:5;opacity:.7;filter:alpha(opacity = 70)}.cke_rtl .cke_dialog_close_button{left:12px}.cke_ltr .cke_dialog_close_button{right:12px}.cke_hc a.cke_dialog_close_button{background-image:none}.cke_hidpi a.cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}a.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}a.cke_dialog_close_button span{display:none}.cke_hc a.cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%;margin-top:12px}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #bcbcbc;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:2px;min-height:28px;margin-left:1px}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:2px solid #139ff7}input.cke_dialog_ui_input_text:focus{padding-left:5px}textarea.cke_dialog_ui_input_textarea:focus{padding:3px 5px}select.cke_dialog_ui_input_select:focus{margin:0;width:100%!important}input.cke_dialog_ui_checkbox_input,input.cke_dialog_ui_radio_input{margin-left:1px;margin-right:2px}input.cke_dialog_ui_checkbox_input:focus,input.cke_dialog_ui_checkbox_input:active,input.cke_dialog_ui_radio_input:focus,input.cke_dialog_ui_radio_input:active{border:0;outline:2px solid #139ff7}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 1px;margin:0;text-align:center;color:#484848;vertical-align:middle;cursor:pointer;border:1px solid #bcbcbc;border-radius:2px;background:#f8f8f8;letter-spacing:.3px;line-height:18px;box-sizing:border-box}.cke_hc a.cke_dialog_ui_button{border-width:3px}span.cke_dialog_ui_button{padding:0 10px;cursor:pointer}a.cke_dialog_ui_button:hover{background:#fff}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border:2px solid #139ff7;outline:0;padding:3px 0}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;background:#09863e;border:1px solid #09863e}.cke_hc a.cke_dialog_ui_button{border:3px solid #bcbcbc}a.cke_dialog_ui_button_ok:hover{background:#53aa78;border-color:#53aa78}a.cke_dialog_ui_button_ok:focus{box-shadow:inset 0 0 0 2px #FFF}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#139ff7}.cke_hc a.cke_dialog_ui_button_ok:hover,.cke_hc a.cke_dialog_ui_button_ok:focus,.cke_hc a.cke_dialog_ui_button_ok:active{border-color:#484848}a.cke_dialog_ui_button_ok.cke_disabled{background:#d1d1d1;border-color:#d1d1d1;cursor:default}a.cke_dialog_ui_button_ok.cke_disabled span{cursor:default}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:28px;line-height:28px;background-color:#fff;border:1px solid #bcbcbc;padding:3px 3px 3px 6px;outline:0;border-radius:2px;margin:0 1px;box-sizing:border-box;width:calc(100% - 2px)!important}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog_ui_labeled_label{margin-left:1px}.cke_dialog .cke_dark_background{background-color:transparent}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked,.cke_dialog a.cke_btn_reset{margin:2px}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_dialog a.cke_btn_over,.cke_dialog a.cke_btn_locked:hover,.cke_dialog a.cke_btn_locked:focus,.cke_dialog a.cke_btn_locked:active,.cke_dialog a.cke_btn_unlocked:hover,.cke_dialog a.cke_btn_unlocked:focus,.cke_dialog a.cke_btn_unlocked:active,.cke_dialog a.cke_btn_reset:hover,.cke_dialog a.cke_btn_reset:focus,.cke_dialog a.cke_btn_reset:active{cursor:pointer;outline:0;margin:0;border:2px solid #139ff7}.cke_dialog fieldset{border:1px solid #bcbcbc}.cke_dialog fieldset legend{padding:0 6px}.cke_dialog_ui_checkbox,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{display:inline-block}.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{padding-top:5px}.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label{vertical-align:middle}.cke_dialog .ImagePreviewBox{border:1px ridge #bcbcbc;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:1px solid #bcbcbc;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;cursor:default;letter-spacing:.3px}.cke_dialog_body label+.cke_dialog_ui_labeled_content{margin-top:2px}.cke_dialog_contents_body .cke_dialog_ui_text,.cke_dialog_contents_body .cke_dialog_ui_select,.cke_dialog_contents_body .cke_dialog_ui_hbox_last>a.cke_dialog_ui_button{margin-top:4px}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:2px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_contents_body .cke_accessibility_legend{margin:2px 7px 2px 2px}.cke_dialog_contents_body .cke_accessibility_legend:focus,.cke_dialog_contents_body .cke_accessibility_legend:active{outline:0;border:2px solid #139ff7;margin:0 5px 0 0}.cke_dialog_contents_body input[type=file]:focus,.cke_dialog_contents_body input[type=file]:active{border:2px solid #139ff7}.cke_dialog_find_fieldset{margin-top:10px!important}.cke_dialog_image_ratiolock{margin-top:52px!important}.cke_dialog_forms_select_order label.cke_dialog_ui_labeled_label{margin-left:0}.cke_dialog_forms_select_order div.cke_dialog_ui_input_select{width:100%}.cke_dialog_forms_select_order_txtsize .cke_dialog_ui_hbox_last{padding-top:4px}.cke_dialog_image_url .cke_dialog_ui_hbox_last,.cke_dialog_flash_url .cke_dialog_ui_hbox_last{vertical-align:bottom}a.cke_dialog_ui_button.cke_dialog_image_browse{margin-top:10px}.cke_dialog_contents_body .cke_tpl_list{border:#bcbcbc 1px solid;margin:1px}.cke_dialog_contents_body .cke_tpl_list:focus,.cke_dialog_contents_body .cke_tpl_list:active{outline:0;margin:0;border:2px solid #139ff7}.cke_dialog_contents_body .cke_tpl_list a:focus,.cke_dialog_contents_body .cke_tpl_list a:active{outline:0}.cke_dialog_contents_body .cke_tpl_list a:focus .cke_tpl_item,.cke_dialog_contents_body .cke_tpl_list a:active .cke_tpl_item{border:2px solid #139ff7;padding:6px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_ie8.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_ie8.css deleted file mode 100755 index 4356336c..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_ie8.css +++ /dev/null @@ -1,5 +0,0 @@ -/* -Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. -For licensing, see LICENSE.md or http://ckeditor.com/license -*/ -.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#fff}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:12px;cursor:move;position:relative;color:#484848;border-bottom:1px solid #d1d1d1;padding:12px 19px 12px 12px;background:#f8f8f8;letter-spacing:.3px}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border:2px solid rgba(102,102,102,0.2);border-left-color:rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:43px;border-top:1px solid #d1d1d1}.cke_dialog_contents_body{overflow:auto;padding:9px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:33px;display:inline-block;margin:9px 0 0;position:absolute;z-index:2;left:11px}.cke_rtl .cke_dialog_tabs{left:auto;right:11px}a.cke_dialog_tab{height:25px;padding:4px 8px;display:inline-block;cursor:pointer;line-height:26px;outline:0;color:#484848;border:1px solid #d1d1d1;border-radius:3px 3px 0 0;background:#f8f8f8;min-width:90px;text-align:center;margin-left:-1px;letter-spacing:.3px}a.cke_dialog_tab:hover{background-color:#fff}a.cke_dialog_tab:focus{border:2px solid #139ff7;border-bottom-color:#d1d1d1;padding:3px 7px;position:relative;z-index:1}a.cke_dialog_tab_selected{background:#fff;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus{border-bottom-color:#fff}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:16px;width:16px;top:11px;z-index:5;opacity:.7;filter:alpha(opacity = 70)}.cke_rtl .cke_dialog_close_button{left:12px}.cke_ltr .cke_dialog_close_button{right:12px}.cke_hc a.cke_dialog_close_button{background-image:none}.cke_hidpi a.cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}a.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}a.cke_dialog_close_button span{display:none}.cke_hc a.cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%;margin-top:12px}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #bcbcbc;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:2px;min-height:28px;margin-left:1px}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:2px solid #139ff7}input.cke_dialog_ui_input_text:focus{padding-left:5px}textarea.cke_dialog_ui_input_textarea:focus{padding:3px 5px}select.cke_dialog_ui_input_select:focus{margin:0;width:100%!important}input.cke_dialog_ui_checkbox_input,input.cke_dialog_ui_radio_input{margin-left:1px;margin-right:2px}input.cke_dialog_ui_checkbox_input:focus,input.cke_dialog_ui_checkbox_input:active,input.cke_dialog_ui_radio_input:focus,input.cke_dialog_ui_radio_input:active{border:0;outline:2px solid #139ff7}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 1px;margin:0;text-align:center;color:#484848;vertical-align:middle;cursor:pointer;border:1px solid #bcbcbc;border-radius:2px;background:#f8f8f8;letter-spacing:.3px;line-height:18px;box-sizing:border-box}.cke_hc a.cke_dialog_ui_button{border-width:3px}span.cke_dialog_ui_button{padding:0 10px;cursor:pointer}a.cke_dialog_ui_button:hover{background:#fff}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border:2px solid #139ff7;outline:0;padding:3px 0}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;background:#09863e;border:1px solid #09863e}.cke_hc a.cke_dialog_ui_button{border:3px solid #bcbcbc}a.cke_dialog_ui_button_ok:hover{background:#53aa78;border-color:#53aa78}a.cke_dialog_ui_button_ok:focus{box-shadow:inset 0 0 0 2px #FFF}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#139ff7}.cke_hc a.cke_dialog_ui_button_ok:hover,.cke_hc a.cke_dialog_ui_button_ok:focus,.cke_hc a.cke_dialog_ui_button_ok:active{border-color:#484848}a.cke_dialog_ui_button_ok.cke_disabled{background:#d1d1d1;border-color:#d1d1d1;cursor:default}a.cke_dialog_ui_button_ok.cke_disabled span{cursor:default}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:28px;line-height:28px;background-color:#fff;border:1px solid #bcbcbc;padding:3px 3px 3px 6px;outline:0;border-radius:2px;margin:0 1px;box-sizing:border-box;width:calc(100% - 2px)!important}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog_ui_labeled_label{margin-left:1px}.cke_dialog .cke_dark_background{background-color:transparent}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked,.cke_dialog a.cke_btn_reset{margin:2px}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_dialog a.cke_btn_over,.cke_dialog a.cke_btn_locked:hover,.cke_dialog a.cke_btn_locked:focus,.cke_dialog a.cke_btn_locked:active,.cke_dialog a.cke_btn_unlocked:hover,.cke_dialog a.cke_btn_unlocked:focus,.cke_dialog a.cke_btn_unlocked:active,.cke_dialog a.cke_btn_reset:hover,.cke_dialog a.cke_btn_reset:focus,.cke_dialog a.cke_btn_reset:active{cursor:pointer;outline:0;margin:0;border:2px solid #139ff7}.cke_dialog fieldset{border:1px solid #bcbcbc}.cke_dialog fieldset legend{padding:0 6px}.cke_dialog_ui_checkbox,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{display:inline-block}.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{padding-top:5px}.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label{vertical-align:middle}.cke_dialog .ImagePreviewBox{border:1px ridge #bcbcbc;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:1px solid #bcbcbc;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;cursor:default;letter-spacing:.3px}.cke_dialog_body label+.cke_dialog_ui_labeled_content{margin-top:2px}.cke_dialog_contents_body .cke_dialog_ui_text,.cke_dialog_contents_body .cke_dialog_ui_select,.cke_dialog_contents_body .cke_dialog_ui_hbox_last>a.cke_dialog_ui_button{margin-top:4px}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:2px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_contents_body .cke_accessibility_legend{margin:2px 7px 2px 2px}.cke_dialog_contents_body .cke_accessibility_legend:focus,.cke_dialog_contents_body .cke_accessibility_legend:active{outline:0;border:2px solid #139ff7;margin:0 5px 0 0}.cke_dialog_contents_body input[type=file]:focus,.cke_dialog_contents_body input[type=file]:active{border:2px solid #139ff7}.cke_dialog_find_fieldset{margin-top:10px!important}.cke_dialog_image_ratiolock{margin-top:52px!important}.cke_dialog_forms_select_order label.cke_dialog_ui_labeled_label{margin-left:0}.cke_dialog_forms_select_order div.cke_dialog_ui_input_select{width:100%}.cke_dialog_forms_select_order_txtsize .cke_dialog_ui_hbox_last{padding-top:4px}.cke_dialog_image_url .cke_dialog_ui_hbox_last,.cke_dialog_flash_url .cke_dialog_ui_hbox_last{vertical-align:bottom}a.cke_dialog_ui_button.cke_dialog_image_browse{margin-top:10px}.cke_dialog_contents_body .cke_tpl_list{border:#bcbcbc 1px solid;margin:1px}.cke_dialog_contents_body .cke_tpl_list:focus,.cke_dialog_contents_body .cke_tpl_list:active{outline:0;margin:0;border:2px solid #139ff7}.cke_dialog_contents_body .cke_tpl_list a:focus,.cke_dialog_contents_body .cke_tpl_list a:active{outline:0}.cke_dialog_contents_body .cke_tpl_list a:focus .cke_tpl_item,.cke_dialog_contents_body .cke_tpl_list a:active .cke_tpl_item{border:2px solid #139ff7;padding:6px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}a.cke_dialog_ui_button{min-height:18px}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{min-height:18px}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus{padding-top:4px;padding-bottom:2px}select.cke_dialog_ui_input_select{width:100%!important}select.cke_dialog_ui_input_select:focus{margin-left:1px;width:100%!important;padding-top:2px;padding-bottom:2px} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_iequirks.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_iequirks.css deleted file mode 100755 index fcbeb515..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/dialog_iequirks.css +++ /dev/null @@ -1,5 +0,0 @@ -/* -Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. -For licensing, see LICENSE.md or http://ckeditor.com/license -*/ -.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#fff}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:12px;cursor:move;position:relative;color:#484848;border-bottom:1px solid #d1d1d1;padding:12px 19px 12px 12px;background:#f8f8f8;letter-spacing:.3px}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border:2px solid rgba(102,102,102,0.2);border-left-color:rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:43px;border-top:1px solid #d1d1d1}.cke_dialog_contents_body{overflow:auto;padding:9px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:33px;display:inline-block;margin:9px 0 0;position:absolute;z-index:2;left:11px}.cke_rtl .cke_dialog_tabs{left:auto;right:11px}a.cke_dialog_tab{height:25px;padding:4px 8px;display:inline-block;cursor:pointer;line-height:26px;outline:0;color:#484848;border:1px solid #d1d1d1;border-radius:3px 3px 0 0;background:#f8f8f8;min-width:90px;text-align:center;margin-left:-1px;letter-spacing:.3px}a.cke_dialog_tab:hover{background-color:#fff}a.cke_dialog_tab:focus{border:2px solid #139ff7;border-bottom-color:#d1d1d1;padding:3px 7px;position:relative;z-index:1}a.cke_dialog_tab_selected{background:#fff;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus{border-bottom-color:#fff}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:16px;width:16px;top:11px;z-index:5;opacity:.7;filter:alpha(opacity = 70)}.cke_rtl .cke_dialog_close_button{left:12px}.cke_ltr .cke_dialog_close_button{right:12px}.cke_hc a.cke_dialog_close_button{background-image:none}.cke_hidpi a.cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}a.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}a.cke_dialog_close_button span{display:none}.cke_hc a.cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%;margin-top:12px}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #bcbcbc;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:2px;min-height:28px;margin-left:1px}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:2px solid #139ff7}input.cke_dialog_ui_input_text:focus{padding-left:5px}textarea.cke_dialog_ui_input_textarea:focus{padding:3px 5px}select.cke_dialog_ui_input_select:focus{margin:0;width:100%!important}input.cke_dialog_ui_checkbox_input,input.cke_dialog_ui_radio_input{margin-left:1px;margin-right:2px}input.cke_dialog_ui_checkbox_input:focus,input.cke_dialog_ui_checkbox_input:active,input.cke_dialog_ui_radio_input:focus,input.cke_dialog_ui_radio_input:active{border:0;outline:2px solid #139ff7}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 1px;margin:0;text-align:center;color:#484848;vertical-align:middle;cursor:pointer;border:1px solid #bcbcbc;border-radius:2px;background:#f8f8f8;letter-spacing:.3px;line-height:18px;box-sizing:border-box}.cke_hc a.cke_dialog_ui_button{border-width:3px}span.cke_dialog_ui_button{padding:0 10px;cursor:pointer}a.cke_dialog_ui_button:hover{background:#fff}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border:2px solid #139ff7;outline:0;padding:3px 0}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;background:#09863e;border:1px solid #09863e}.cke_hc a.cke_dialog_ui_button{border:3px solid #bcbcbc}a.cke_dialog_ui_button_ok:hover{background:#53aa78;border-color:#53aa78}a.cke_dialog_ui_button_ok:focus{box-shadow:inset 0 0 0 2px #FFF}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#139ff7}.cke_hc a.cke_dialog_ui_button_ok:hover,.cke_hc a.cke_dialog_ui_button_ok:focus,.cke_hc a.cke_dialog_ui_button_ok:active{border-color:#484848}a.cke_dialog_ui_button_ok.cke_disabled{background:#d1d1d1;border-color:#d1d1d1;cursor:default}a.cke_dialog_ui_button_ok.cke_disabled span{cursor:default}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:28px;line-height:28px;background-color:#fff;border:1px solid #bcbcbc;padding:3px 3px 3px 6px;outline:0;border-radius:2px;margin:0 1px;box-sizing:border-box;width:calc(100% - 2px)!important}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog_ui_labeled_label{margin-left:1px}.cke_dialog .cke_dark_background{background-color:transparent}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked,.cke_dialog a.cke_btn_reset{margin:2px}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_dialog a.cke_btn_over,.cke_dialog a.cke_btn_locked:hover,.cke_dialog a.cke_btn_locked:focus,.cke_dialog a.cke_btn_locked:active,.cke_dialog a.cke_btn_unlocked:hover,.cke_dialog a.cke_btn_unlocked:focus,.cke_dialog a.cke_btn_unlocked:active,.cke_dialog a.cke_btn_reset:hover,.cke_dialog a.cke_btn_reset:focus,.cke_dialog a.cke_btn_reset:active{cursor:pointer;outline:0;margin:0;border:2px solid #139ff7}.cke_dialog fieldset{border:1px solid #bcbcbc}.cke_dialog fieldset legend{padding:0 6px}.cke_dialog_ui_checkbox,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{display:inline-block}.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{padding-top:5px}.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label{vertical-align:middle}.cke_dialog .ImagePreviewBox{border:1px ridge #bcbcbc;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:1px solid #bcbcbc;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;cursor:default;letter-spacing:.3px}.cke_dialog_body label+.cke_dialog_ui_labeled_content{margin-top:2px}.cke_dialog_contents_body .cke_dialog_ui_text,.cke_dialog_contents_body .cke_dialog_ui_select,.cke_dialog_contents_body .cke_dialog_ui_hbox_last>a.cke_dialog_ui_button{margin-top:4px}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:2px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_contents_body .cke_accessibility_legend{margin:2px 7px 2px 2px}.cke_dialog_contents_body .cke_accessibility_legend:focus,.cke_dialog_contents_body .cke_accessibility_legend:active{outline:0;border:2px solid #139ff7;margin:0 5px 0 0}.cke_dialog_contents_body input[type=file]:focus,.cke_dialog_contents_body input[type=file]:active{border:2px solid #139ff7}.cke_dialog_find_fieldset{margin-top:10px!important}.cke_dialog_image_ratiolock{margin-top:52px!important}.cke_dialog_forms_select_order label.cke_dialog_ui_labeled_label{margin-left:0}.cke_dialog_forms_select_order div.cke_dialog_ui_input_select{width:100%}.cke_dialog_forms_select_order_txtsize .cke_dialog_ui_hbox_last{padding-top:4px}.cke_dialog_image_url .cke_dialog_ui_hbox_last,.cke_dialog_flash_url .cke_dialog_ui_hbox_last{vertical-align:bottom}a.cke_dialog_ui_button.cke_dialog_image_browse{margin-top:10px}.cke_dialog_contents_body .cke_tpl_list{border:#bcbcbc 1px solid;margin:1px}.cke_dialog_contents_body .cke_tpl_list:focus,.cke_dialog_contents_body .cke_tpl_list:active{outline:0;margin:0;border:2px solid #139ff7}.cke_dialog_contents_body .cke_tpl_list a:focus,.cke_dialog_contents_body .cke_tpl_list a:active{outline:0}.cke_dialog_contents_body .cke_tpl_list a:focus .cke_tpl_item,.cke_dialog_contents_body .cke_tpl_list a:active .cke_tpl_item{border:2px solid #139ff7;padding:6px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_footer{filter:""} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor.css deleted file mode 100755 index 13148ffa..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor.css +++ /dev/null @@ -1,5 +0,0 @@ -/* -Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. -For licensing, see LICENSE.md or http://ckeditor.com/license -*/ -.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon {background: url(icons.png?t=20af917) no-repeat 0 -0px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=20af917) no-repeat 0 -24px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=20af917) no-repeat 0 -48px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=20af917) no-repeat 0 -72px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=20af917) no-repeat 0 -96px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=20af917) no-repeat 0 -120px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=20af917) no-repeat 0 -144px !important;}.cke_button__base64image_icon {background: url(icons.png?t=20af917) no-repeat 0 -168px !important;}.cke_button__bold_icon {background: url(icons.png?t=20af917) no-repeat 0 -192px !important;}.cke_button__italic_icon {background: url(icons.png?t=20af917) no-repeat 0 -216px !important;}.cke_button__strike_icon {background: url(icons.png?t=20af917) no-repeat 0 -240px !important;}.cke_button__subscript_icon {background: url(icons.png?t=20af917) no-repeat 0 -264px !important;}.cke_button__superscript_icon {background: url(icons.png?t=20af917) no-repeat 0 -288px !important;}.cke_button__underline_icon {background: url(icons.png?t=20af917) no-repeat 0 -312px !important;}.cke_button__bidiltr_icon {background: url(icons.png?t=20af917) no-repeat 0 -336px !important;}.cke_button__bidirtl_icon {background: url(icons.png?t=20af917) no-repeat 0 -360px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=20af917) no-repeat 0 -384px !important;}.cke_button__bgcolor_icon {background: url(icons.png?t=20af917) no-repeat 0 -408px !important;}.cke_button__textcolor_icon {background: url(icons.png?t=20af917) no-repeat 0 -432px !important;}.cke_button__image_icon {background: url(icons.png?t=20af917) no-repeat 0 -456px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=20af917) no-repeat 0 -480px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=20af917) no-repeat 0 -504px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=20af917) no-repeat 0 -528px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=20af917) no-repeat 0 -552px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=20af917) no-repeat 0 -576px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=20af917) no-repeat 0 -600px !important;}.cke_button__link_icon {background: url(icons.png?t=20af917) no-repeat 0 -624px !important;}.cke_button__unlink_icon {background: url(icons.png?t=20af917) no-repeat 0 -648px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -672px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -696px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -720px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -744px !important;}.cke_button__maximize_icon {background: url(icons.png?t=20af917) no-repeat 0 -768px !important;}.cke_button__table_icon {background: url(icons.png?t=20af917) no-repeat 0 -792px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=20af917) no-repeat 0 -816px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=20af917) no-repeat 0 -840px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=20af917) no-repeat 0 -864px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=20af917) no-repeat 0 -888px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=20af917) no-repeat 0 -912px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=20af917) no-repeat 0 -936px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=20af917) no-repeat 0 -960px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__base64image_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -960px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_gecko.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_gecko.css deleted file mode 100755 index 3f9f5e57..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_gecko.css +++ /dev/null @@ -1,5 +0,0 @@ -/* -Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. -For licensing, see LICENSE.md or http://ckeditor.com/license -*/ -.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon {background: url(icons.png?t=20af917) no-repeat 0 -0px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=20af917) no-repeat 0 -24px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=20af917) no-repeat 0 -48px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=20af917) no-repeat 0 -72px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=20af917) no-repeat 0 -96px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=20af917) no-repeat 0 -120px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=20af917) no-repeat 0 -144px !important;}.cke_button__base64image_icon {background: url(icons.png?t=20af917) no-repeat 0 -168px !important;}.cke_button__bold_icon {background: url(icons.png?t=20af917) no-repeat 0 -192px !important;}.cke_button__italic_icon {background: url(icons.png?t=20af917) no-repeat 0 -216px !important;}.cke_button__strike_icon {background: url(icons.png?t=20af917) no-repeat 0 -240px !important;}.cke_button__subscript_icon {background: url(icons.png?t=20af917) no-repeat 0 -264px !important;}.cke_button__superscript_icon {background: url(icons.png?t=20af917) no-repeat 0 -288px !important;}.cke_button__underline_icon {background: url(icons.png?t=20af917) no-repeat 0 -312px !important;}.cke_button__bidiltr_icon {background: url(icons.png?t=20af917) no-repeat 0 -336px !important;}.cke_button__bidirtl_icon {background: url(icons.png?t=20af917) no-repeat 0 -360px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=20af917) no-repeat 0 -384px !important;}.cke_button__bgcolor_icon {background: url(icons.png?t=20af917) no-repeat 0 -408px !important;}.cke_button__textcolor_icon {background: url(icons.png?t=20af917) no-repeat 0 -432px !important;}.cke_button__image_icon {background: url(icons.png?t=20af917) no-repeat 0 -456px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=20af917) no-repeat 0 -480px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=20af917) no-repeat 0 -504px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=20af917) no-repeat 0 -528px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=20af917) no-repeat 0 -552px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=20af917) no-repeat 0 -576px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=20af917) no-repeat 0 -600px !important;}.cke_button__link_icon {background: url(icons.png?t=20af917) no-repeat 0 -624px !important;}.cke_button__unlink_icon {background: url(icons.png?t=20af917) no-repeat 0 -648px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -672px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -696px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -720px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -744px !important;}.cke_button__maximize_icon {background: url(icons.png?t=20af917) no-repeat 0 -768px !important;}.cke_button__table_icon {background: url(icons.png?t=20af917) no-repeat 0 -792px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=20af917) no-repeat 0 -816px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=20af917) no-repeat 0 -840px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=20af917) no-repeat 0 -864px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=20af917) no-repeat 0 -888px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=20af917) no-repeat 0 -912px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=20af917) no-repeat 0 -936px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=20af917) no-repeat 0 -960px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__base64image_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -960px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_ie.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_ie.css deleted file mode 100755 index 9b41fe6a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_ie.css +++ /dev/null @@ -1,5 +0,0 @@ -/* -Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. -For licensing, see LICENSE.md or http://ckeditor.com/license -*/ -.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_button__about_icon {background: url(icons.png?t=20af917) no-repeat 0 -0px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=20af917) no-repeat 0 -24px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=20af917) no-repeat 0 -48px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=20af917) no-repeat 0 -72px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=20af917) no-repeat 0 -96px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=20af917) no-repeat 0 -120px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=20af917) no-repeat 0 -144px !important;}.cke_button__base64image_icon {background: url(icons.png?t=20af917) no-repeat 0 -168px !important;}.cke_button__bold_icon {background: url(icons.png?t=20af917) no-repeat 0 -192px !important;}.cke_button__italic_icon {background: url(icons.png?t=20af917) no-repeat 0 -216px !important;}.cke_button__strike_icon {background: url(icons.png?t=20af917) no-repeat 0 -240px !important;}.cke_button__subscript_icon {background: url(icons.png?t=20af917) no-repeat 0 -264px !important;}.cke_button__superscript_icon {background: url(icons.png?t=20af917) no-repeat 0 -288px !important;}.cke_button__underline_icon {background: url(icons.png?t=20af917) no-repeat 0 -312px !important;}.cke_button__bidiltr_icon {background: url(icons.png?t=20af917) no-repeat 0 -336px !important;}.cke_button__bidirtl_icon {background: url(icons.png?t=20af917) no-repeat 0 -360px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=20af917) no-repeat 0 -384px !important;}.cke_button__bgcolor_icon {background: url(icons.png?t=20af917) no-repeat 0 -408px !important;}.cke_button__textcolor_icon {background: url(icons.png?t=20af917) no-repeat 0 -432px !important;}.cke_button__image_icon {background: url(icons.png?t=20af917) no-repeat 0 -456px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=20af917) no-repeat 0 -480px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=20af917) no-repeat 0 -504px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=20af917) no-repeat 0 -528px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=20af917) no-repeat 0 -552px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=20af917) no-repeat 0 -576px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=20af917) no-repeat 0 -600px !important;}.cke_button__link_icon {background: url(icons.png?t=20af917) no-repeat 0 -624px !important;}.cke_button__unlink_icon {background: url(icons.png?t=20af917) no-repeat 0 -648px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -672px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -696px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -720px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -744px !important;}.cke_button__maximize_icon {background: url(icons.png?t=20af917) no-repeat 0 -768px !important;}.cke_button__table_icon {background: url(icons.png?t=20af917) no-repeat 0 -792px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=20af917) no-repeat 0 -816px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=20af917) no-repeat 0 -840px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=20af917) no-repeat 0 -864px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=20af917) no-repeat 0 -888px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=20af917) no-repeat 0 -912px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=20af917) no-repeat 0 -936px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=20af917) no-repeat 0 -960px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__base64image_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -960px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_ie8.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_ie8.css deleted file mode 100755 index 08e6b05a..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_ie8.css +++ /dev/null @@ -1,5 +0,0 @@ -/* -Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. -For licensing, see LICENSE.md or http://ckeditor.com/license -*/ -.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_toolbar{position:relative}.cke_rtl .cke_toolbar_end{right:auto;left:0}.cke_toolbar_end:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:1px;right:2px}.cke_rtl .cke_toolbar_end:after{right:auto;left:2px}.cke_hc .cke_toolbar_end:after{top:2px;right:5px;border-color:#000}.cke_hc.cke_rtl .cke_toolbar_end:after{right:auto;left:5px}.cke_combo+.cke_toolbar_end:after,.cke_toolbar.cke_toolbar_last .cke_toolbar_end:after{content:none;border:0}.cke_combo+.cke_toolgroup+.cke_toolbar_end:after{right:0}.cke_rtl .cke_combo+.cke_toolgroup+.cke_toolbar_end:after{right:auto;left:0}.cke_button__about_icon {background: url(icons.png?t=20af917) no-repeat 0 -0px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=20af917) no-repeat 0 -24px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=20af917) no-repeat 0 -48px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=20af917) no-repeat 0 -72px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=20af917) no-repeat 0 -96px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=20af917) no-repeat 0 -120px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=20af917) no-repeat 0 -144px !important;}.cke_button__base64image_icon {background: url(icons.png?t=20af917) no-repeat 0 -168px !important;}.cke_button__bold_icon {background: url(icons.png?t=20af917) no-repeat 0 -192px !important;}.cke_button__italic_icon {background: url(icons.png?t=20af917) no-repeat 0 -216px !important;}.cke_button__strike_icon {background: url(icons.png?t=20af917) no-repeat 0 -240px !important;}.cke_button__subscript_icon {background: url(icons.png?t=20af917) no-repeat 0 -264px !important;}.cke_button__superscript_icon {background: url(icons.png?t=20af917) no-repeat 0 -288px !important;}.cke_button__underline_icon {background: url(icons.png?t=20af917) no-repeat 0 -312px !important;}.cke_button__bidiltr_icon {background: url(icons.png?t=20af917) no-repeat 0 -336px !important;}.cke_button__bidirtl_icon {background: url(icons.png?t=20af917) no-repeat 0 -360px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=20af917) no-repeat 0 -384px !important;}.cke_button__bgcolor_icon {background: url(icons.png?t=20af917) no-repeat 0 -408px !important;}.cke_button__textcolor_icon {background: url(icons.png?t=20af917) no-repeat 0 -432px !important;}.cke_button__image_icon {background: url(icons.png?t=20af917) no-repeat 0 -456px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=20af917) no-repeat 0 -480px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=20af917) no-repeat 0 -504px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=20af917) no-repeat 0 -528px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=20af917) no-repeat 0 -552px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=20af917) no-repeat 0 -576px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=20af917) no-repeat 0 -600px !important;}.cke_button__link_icon {background: url(icons.png?t=20af917) no-repeat 0 -624px !important;}.cke_button__unlink_icon {background: url(icons.png?t=20af917) no-repeat 0 -648px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -672px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -696px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -720px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -744px !important;}.cke_button__maximize_icon {background: url(icons.png?t=20af917) no-repeat 0 -768px !important;}.cke_button__table_icon {background: url(icons.png?t=20af917) no-repeat 0 -792px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=20af917) no-repeat 0 -816px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=20af917) no-repeat 0 -840px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=20af917) no-repeat 0 -864px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=20af917) no-repeat 0 -888px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=20af917) no-repeat 0 -912px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=20af917) no-repeat 0 -936px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=20af917) no-repeat 0 -960px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__base64image_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -960px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_iequirks.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_iequirks.css deleted file mode 100755 index 3153af00..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/editor_iequirks.css +++ /dev/null @@ -1,5 +0,0 @@ -/* -Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. -For licensing, see LICENSE.md or http://ckeditor.com/license -*/ -.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_top,.cke_contents,.cke_bottom{width:100%}.cke_button_arrow{font-size:0}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon{display:inline-block;vertical-align:top}.cke_rtl .cke_button_icon{float:none}.cke_resizer{width:10px}.cke_source{white-space:normal}.cke_bottom{position:static}.cke_colorbox{font-size:0}.cke_button__about_icon {background: url(icons.png?t=20af917) no-repeat 0 -0px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=20af917) no-repeat 0 -24px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=20af917) no-repeat 0 -48px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=20af917) no-repeat 0 -72px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=20af917) no-repeat 0 -96px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=20af917) no-repeat 0 -120px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=20af917) no-repeat 0 -144px !important;}.cke_button__base64image_icon {background: url(icons.png?t=20af917) no-repeat 0 -168px !important;}.cke_button__bold_icon {background: url(icons.png?t=20af917) no-repeat 0 -192px !important;}.cke_button__italic_icon {background: url(icons.png?t=20af917) no-repeat 0 -216px !important;}.cke_button__strike_icon {background: url(icons.png?t=20af917) no-repeat 0 -240px !important;}.cke_button__subscript_icon {background: url(icons.png?t=20af917) no-repeat 0 -264px !important;}.cke_button__superscript_icon {background: url(icons.png?t=20af917) no-repeat 0 -288px !important;}.cke_button__underline_icon {background: url(icons.png?t=20af917) no-repeat 0 -312px !important;}.cke_button__bidiltr_icon {background: url(icons.png?t=20af917) no-repeat 0 -336px !important;}.cke_button__bidirtl_icon {background: url(icons.png?t=20af917) no-repeat 0 -360px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=20af917) no-repeat 0 -384px !important;}.cke_button__bgcolor_icon {background: url(icons.png?t=20af917) no-repeat 0 -408px !important;}.cke_button__textcolor_icon {background: url(icons.png?t=20af917) no-repeat 0 -432px !important;}.cke_button__image_icon {background: url(icons.png?t=20af917) no-repeat 0 -456px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=20af917) no-repeat 0 -480px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=20af917) no-repeat 0 -504px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=20af917) no-repeat 0 -528px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=20af917) no-repeat 0 -552px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=20af917) no-repeat 0 -576px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=20af917) no-repeat 0 -600px !important;}.cke_button__link_icon {background: url(icons.png?t=20af917) no-repeat 0 -624px !important;}.cke_button__unlink_icon {background: url(icons.png?t=20af917) no-repeat 0 -648px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -672px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -696px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -720px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=20af917) no-repeat 0 -744px !important;}.cke_button__maximize_icon {background: url(icons.png?t=20af917) no-repeat 0 -768px !important;}.cke_button__table_icon {background: url(icons.png?t=20af917) no-repeat 0 -792px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=20af917) no-repeat 0 -816px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=20af917) no-repeat 0 -840px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=20af917) no-repeat 0 -864px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=20af917) no-repeat 0 -888px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=20af917) no-repeat 0 -912px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=20af917) no-repeat 0 -936px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=20af917) no-repeat 0 -960px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__base64image_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=20af917) no-repeat 0 -960px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/icons.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/icons.png deleted file mode 100755 index 06ef8f78aecbf8d8a06e3455c6320f9efacf8e3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5775 zcmXAtc{o(<8^@1^F_y{TmB~I5ja_){+hiR=Lw1>>WZy&fjHpm*Buhh$u^VMy%9DPb6w9l=Q;PepZojy-uJ96P2lVT>;M43%}fn(;1K};kS{PO zc=ov<@+<(HvNJO@u#L$3;~GWe>&`yD95%?w*=2*!kY+y9#bz>AKwXr1|4!Ayep)Nh zum*95`%e+fSRml+mr0G^R_KKu8h= z33&ah;#JvE=|3V;*U{we~m zWEa^{hOQCMp_+}36Dg3l9btC zs6m#j{2zI7;%8oWbYP?UkWsPYwO-p+x&MBQ-5j+SrFWZs=)A+iFU;J$A61zL!1(ow%B{4Apy+O5-U#csrval3qWyi-br2D6^$>dKS zHh-8Hd8TOoChGpL0vLt|^=_JCjP1vWjAU=BV6eZjgX_AP=tq}I27F9I7Vno>^EXpl zu30mq?jgk2__)E41}i3cK{ls~xK;9!+#l*YXT+Z=e-4GhyLOU*9t9QX9RC#4i8+2w zOI!8ynzt=2`*#W%sjowj?vUA-$rgQ>2Bod-*imBJU%P5cY4mLxuD?}`(wv1}Dqt6! zcRDdqU&WQuj@-Y9TvoRvo~LXKWb|kXkJ@MB_V|DR4%9M7HH;Q1QC!C=2adzTLskkA zf%$fta;rr7XQ(Q5OuW*$f!fy8w0rnB5cRH`#CS`+dwuhak>kB`Qkj8RwDl!H9JVsM z+}$J9l@(t~TvGu^EBi@edFE(gfN!9>)lNFI^-3|5`;r{Mb>a&amf$xreKJ2yK(!3v z(u%9JJ3d<>rOJ%!SDNcdt5Ik0LmJ7r($!T*H@E3I!lTO8l|fD&M|*oZ>ta8iPIaAC z8fX5#ahA|{%!^kD;P&m?S1QmDdYA$Nqb+DR8d0j1Uc=Jv@n7x~;Yv3u8&5!? zy|7fb6mh{eV2=NeIT+9MGZN#FupesgPXYY{Bcr49cUPjKzo;v|;!*eTXl`!)w(97? z%L;{J0o}(J79VnQavoSc-%3-d_o=vb<;7hGL4#|@2K_r)@m*~e;t9m_bs>@?>KS4p zmy)n~W{*aVLQ}nF)M+fOE62Xp0xGJiVJA5`wHMVbFA`+o!Ee)?I*4i`?FCnnZTJIB z8T4<8bgG+TY)AWyuz^Dss}|Mx9PlAegBRC-WPEhv!!staRgS3bWtRA1!XsxkQ~(dg zpG8sgPgPab$}5p4QdTExR(l8JTP#lOxIbOym9o_SmKd};V*s?jG2@LbGw!qK+k`~_3N3V1IGIPVfuDzDpgePD6pfUuI~CF`%13j)lTO> zfBx{a&$rL|F6J$Y1LaJqT+7LIwY3K&WU~8*CI;z&*%L`QRz>%BDcmVACnqP&?CB?x z7n@f)ITYRm@2t)$KpLyT+-XfuPv^2LzbvF42r%;FVx4__7Mow?Cjsq5w9SvFa?Zx7 z0;&rP(WBL5&oA|9SjwF&x7gEC&qH}EHRk`ZmF6==8=$*MI#I9Odr$gKz1e*f0<3Jv0V zstQ<85^EM@)(d!i;F3PQ>Ww}2tAG(qlOi|ZWFwtPP3fhlDfp&MLV&W-gmc*XoW@rMJxO7wqwL8d8hB{?ENCE){uDwg%-{kH@O^zN$CI1^?vigYEp*UcFV*4Gw(Xpb=v0XL1n-kdu>B^lpxFBLT5ygXt6Pe3g)pAeTP(jnZTO@dV=_pv#9I z)+R-8;G8iBUK->WJNXSWtI@*-KS-oF-$2j1&(<*_tM1a9WmS^-y`2qCyE~N`kHIr9 z+6hjwcPOAK=Gue%Mvup!(3R^qCtBATgL;wM%adB)XNjKzB1z#k7oVl$2T3|=B?01r zzdri<`?o5KsMT!>*UwOhp9kivZy8+@H}LdicwqWYiM{1QeUy%qx7C4rG1HlnZ}gtL z545WTU>v!MxNmMQE-h(4K~$gaTfQ*ttq*I`+{u^BwTQ=Skcj6)tm`G&dcFh{5|yuw z7jBJ>?69EcIn&1520nGRw~KWYgocN^jZaUvo$TnuU$12Fwywn4ra60ZA>GwBwzrR& z`^&z!*FyA7v|DKfvK$J&6Qu9^y02vyL$SXfyEwx16q}tYo5Xhi_JzT!-w)-yk6V zA}sq?`=egs%KPOUzQ+T%Nv@0J=oY49My$#Xx@4X{#ey0#sWBzEuudt^yGY0dgp+e((R%Y?# z8H>`NmcG_l)yw)M(`0_TxQ@#X=bNJkIsB(32nX>YM@fY{iN?`{GxiTjUNT7J$eHyd ze5%el${TqRk=VLofzigmF6V>=Tsp52Gj;Ll=f1}XZW!tYKYLO@85bMsI3pMMuRic| zBz10gM$vXR36EBON)9E2#JVrP4hMDbGPw0WijVSGW8++;GySm-@~|_JS3Jp`;79lJ zd>3^r)zwe#6Z!F%sgyY~T3_1WjCD-PILqVT5FlRZ)6D5IEE+s|vlc3C7*xP44*?0qD!T~6artmYs zO!Kk^uAlMQSOMuCmw_{`@yN-|)vJ#^+=KrE5DA;mek#$*3pwIyZffCXVnnl1HZBl9C3nHP?!wEzHmUx4-I$5H zEe5;ImlDYUQ=!aF0s`;(gD-0he`la>(-K)=4?5&xr|R= z2KA#mxapwK3HnScd^sDC7bARo8$92y7RC%-e-pgP&!-4~HnFub-Ik5JEyp+*(7f97 zWgXa?b0jmZGfdKjG^%Z-4~s1$Xn7jSg~ae68gDT-5-G$G0|E!+8dTa=J2|2zujH2{ z<}m$jVq%dYE=H(;S51tM=V)qb=5$64REy9gkh;-3Qs58X`a0PXUNr^oWAEOeQ_MN8 zybs-M)?uiC3db5rp%YD3k)ay#nFe{&X6V5Z6wIWF4W)PP)B`CF6gAb#H_SDhiLz0Q zNfE`Ok1v%cAikSpQWUyJIZ2h)W^Aa;5>89K!wv3P!k8@KFHLuUi90(3&Y3RivHauo zn^K?X=_=<%&O(Rzfap2Fg)yk8)%~mp%PhYM86b~us-dCbc;)BET(`7d^L2~$gf0&E zB!o<8MlEyqwVM%JY<@Eh&9R`~Cf zu#dpxm6yj9n6?pYmxU5~p@7?k{>N^P9%F5a_JjbG4R;d557s5zyUQ0}LqL=>8H!G- z3V@VvRZ=D`L`aG%|Cj$k_vcVY=J-n>h|CpKMA{8cP3bOI)X+2?w|$4eUwnMHP5+?B zvf(Dz?AeU5u<%2OUIPV?2d20KXS^hlIuM5CgCqK&u>Mw0A2~fJF@k`hT44aLfAAOC z6M?{pz>bRLFHtX$&Y$~-UEY0ZKPdZK%pxY`F>&oPb#bhMW$by;?dNmqZT4LtbN5FV zPL~WWSmYqScj%k4ql%oKZt|fB%?`|9st@rf_LO0>``s3=o{L;LyH1}V>2Zqi7zJpPPWf5 zCwnPy21OZ|{i+jy2iNoCVtO;Y3e3+|a*k}Kfj4yzSFsko#p54ABAY)X*S|%KH#NRB z|0MBQ{>OU^bqhlkjtniG9}}y+R~DaxrJh$8hcA3NpAzgme>X0PjN`J1>X=c-{73K) zy00ZKXYZk!@fVx30c8*bpd<60;2q;_R7|(yScE5P|*iH?1(Y!uPV@BLih_y zqt!&1sAZ^Mg55ctp~Z$8KTNPC-T`p7wtDUHVn&CF?ug^lX>`|KsX+c z&ze&o=3L*&p?*u*Pa_{|ijtWV%#OomxNvNto}aY4G};{CA+F&W#I+Y+6s%h&yYY-7 zVRF(Al?SYwoZRAxjAs9bh?gb0wX%yRffBp&h7ypxt_-d>7qGMXMEK08r(67T{<_%g z&xJr}Mp1qpt$}F}tdW2vcpv4ruG&~QrD?dE`ij*X&XPl)P@CXdgT*H_WlZ5_0 z^u;D*P~YVV7=V`zrD1^yuc4 zNnUWu-MAin@2Q%>j06MD@e9=NtPnaI&uFdax>6hNC_ls-5l^U|fdfzY@JxB#{^=?kiGf5#Xn>p|DVBD$D!P?8&O7%)2 zNCM?@2qcjV3oa~L_+_=HyXH6-N#Bu75jZ{KAjAcmE4{rvp4RV)BJXJARb$L7MQmY{f`Q1ONLalyIgj1tcs z_Xn{Bx;DHCTeRE!F`AZy=@{cSZd1mX4;aQ z4gOEn`ViinLZSlGjtu&&IwQa^D7fgz6FtB4^XE@Tu%iKX1r&Y8DrUpK1@$JpA$e(| zJbvzNF1m5%>Q=p3>ql!`hjUhEIAprgT~P#wM;qE5NkaBt)((`j|_jP{_sd`RPe-hiKvoki~6(|D!&)9sM} zyTMT1sQ0FLSosJdOh>ieuLeu$WJB@MB17$*Z>mvkiq&t99=@hf%&PzM((xP zJs*=+!LuL+)<0@`fds6v_P0sfrM5*XCwiWRx`sC`J5mEAXc`$f`H_qt{zozrs=ZXz z+a5ai_6H2_4Dl0MQEX0kFfUeXiEA%sw(hi>{5XS8JuGvoyh7-ju>A+f#!Zy_v%zl%-;pmyG*;R-hVK?9{dA33E^$DI0F5Re@pSNlzff`AYsjuopa zLrG`$&!xV;36CJjM&SC*3yEZL6h;vo*Fap|_f}briL1Eo*if!~M|)5vkY=*qYW1Hp z=f(VMh8`Xn86khfl-fFJ2LI@L61uRxvElnY&x%VxBJ0LawMy|OYLurW=-WG96J)0! zF@R*H^trys^`G;4u8zsAt*x%0pFhP#zoiLIJbBWOu4ohzf8am8-RsSEzx$dA1sADp zp4iFENQbJ*57%ElJ1wAS`I$K*cc>2*0XZ(g9iFXN1rQ=Ru{?s&4-zq*4acflnF zG0pLBD8?EWyG^s2^|Z)$G=U^E1Gs5L%QkWf}HnnHGz$0z|6?fkcz?I`5(ii B>wo|N diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/icons_hidpi.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/icons_hidpi.png deleted file mode 100755 index 2497f4f196396815071050ab04db13d488452118..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17424 zcmaL9by!qg+djO9l2kfGx*McRLL`;$EBz` z-<9NKwBNvY(tTPVJV`kX(2+!}%3>;EzBVwApQVpPc^^L4J$Uqd{lV9kIa7RMVtjov z_dgfR+`gSmEzLL;)fyTy@sZs)`2C{%^ZYE0k@U-WD;1I0ob18UD4)#xQ&K9tZxyHV z3JNZS_*wpFE{-64huu6)GAc?ccD*x73InA)6{X_YlfH`t24HsWzmTnG{vsOo+#u8M zd@Wh()uP{Nn*aj}r%ChCXPcUHqG3@?I{aHf3H{QE1rcqS#E6e@pxWzU{&y@PS-Pe9 z1(`~LRaJbI^GhRHkg*QXO=tS6>YyB+dtu?p~y8RF!HYFRli6@-2f#f9>GF z+QCp%RRdqIG~2tgd%tNHPid06nkz1qpgjzzDVbzUnEt$UmVudgq2vMuy51DMG0eGjy(G*st*rd@vM`+# zLqT zaD&Y=8_(X!JoJ1JCUyK%E8XhZ`X_PET{EWqQBRWT`ZmszMb#+|&xt5LV(fRqbAG4u zX|{3@R3rB|q2+}Jb|fj+jP2{!2idi97{$TrkHQ!3(S}?ZwVB>tmPO#wcamncEKo+v z@5;}6l5962GH%&vz^lH;N$Zx5waC{@nQ{=)(^L*1Mf>tzW^Bd+R~sc}#W#%40~g}$ zU8wQcnNeGN#&GQ zd?yR-=<1ola9QJd=c}NjkcTq(M>-*or$`V?u2`6Ojdx8@>p79lc6Ikl8Aw;Xao4Cd zb_6Go7UZV8BC1=tDNSf{%LZFBF7W42#S)ySRGa-193Hj9){+q{Q2nSR{<{-8RBKrN zT!|^ZlwjR!5ZpFZOap=*qxI$r-Eay&?7x3tGl4--RnIGsC#+RASA0i)0iyYCUX0yq z5h#o#e`qE1_bxe>mpwC3{%|HM=c}^HVs0Ia5p-OV(6affVHIUsG%sG`lXYmJTyI>2 zeYqPzW=(2dQ1Uyr5G^o;?VVHw;q(&9pd88S4K*uiWR;a7f&A%=>P~nyt!Lru^{u8x z+{^1D;lIQ5#r$l%cN!0P@blC1yn*qS_4#hrjH-%P*7qkNJodrzJ%R* z@VRd#R_YO-8%$Mvr?ySVdEv@jd(ea{^UyKoGbWt^mGAzS+ry3ASmt&aSG_O2(Ubw> zNu9c3ih5+&?*_2n$xdngaB9#?fBl`!hbcc<<(VFPl2FmODAfA>^jZPxtlw#YT^TyT z(}bOG@CfhwY-yR#dXNMbzWn1Ua6h`nYS}m1)!$pqCgiiI>w4=!hR^PK61Xww@m-W^ z$10dmZfce__drwF!#|>(1dOSp+yE$sTBQjGojBkbgS&M z^$H#fUWi!7h1PSy@$qpggeSP|<2rmUW+=R|eD!1XJLf*TO^Ct_|BFp45ro$AA4h@v zw|Da-Lca>(clBs#X=O&X=(8u)@{|@?kGv4LZ+1tMx~sUDO_r@qi-OW2MJnLNjQROp zH{9$x)|j)|X$K)sk`&7SEKN{IQ}|9${bbM%@*Ys#!D=R= zYY6`8KF?0qjat7Ml2^I<4SZEeY#y&*_7F+sQC&lzEb1OGlNzC9Ag({T-rUcgcQZNV zgD!2A6XO)@>t8CnlF%sFBf7s*e zQ_a*EqQ)=J+i#O+a46!FQX){gH*Z3NxOaA%FHH4NW_2JFEZiXmt@|#@_KsMC*5c~l zOu#1g0O$8?i6Qld?gVOEiLZ;3o7+*N&tBUptQ?})y_vOJet(mNXz=D913L=zGQ3;6 zMMl?Qc6SWE{fdR$FDcNtu-?(uuF8d}fP}V~iZSJdnfnmd{uuc$BF?R%sD$^a{#%}TufF}a?*6Cv{{KAu zt>yoj1Tr_B_ZnOmNNMqgdWXeuS_V_!4W$V!ttFd5rbdm z(mi|k3JUpL`lvPt%@0+0ECvooa+faoOPV>FxUF($TQS_wUWCyZ8r2V4FF=8d&cA{Q z?9=w5hv!41VDC`+h2$~moLNF7h_Blu#f0%&)u&UF4N)FITyD{mBa-`-H(R|7rq^~* zXBTpE{%m6;;4Wl#KM(Ci_K%5}`ldmw$060#77MK^Y7$Fm+tmZy)6bJlUM)wk1P`Wp zZqlZp8gV&r&Yg6+JJzz-ycnf-n5o5L&?v5*apW|t#iTUd`eUDjBbe#vNQ+A#AHxCt z9#i4Dp3qX0d`D*X2FBCAkCNfN#b)fincwj>FvKEUojqvUq(kar>E51R_0BhU=n|Qyul;*{V_^GA^XP(^(?Zbi$&K5V zoLi23S0&Djj#;Nt)AR3oyVomW)E8KR+&t7(-e2RYDk_rj$9g9fc2y`IlKhBI_qcek z$GIyhCiWgNRoQVf6)Sb41>Fk=Rq)!Xp9%E{@;%C1i8a&AA}+Tf>T6rV%RMCHxxol* zdjjbkPEHVo^6}6@&ZwWUJC{QSIl|i41!+th&0+Npzk=6~1ZK)f-?L<#y^n8l?SPpJ zLF%&27eUj7(#t>EP8S2#{y2M&Z%)ERZ}GDF2JQx4d(7Hb8r@vPJ^tZTC$@eCF#KoE z*7I(nSd>?&&|tctN@baD=16#x>-vb<@dZOHyamBw8ssu!)OzZFS+1#Ub+VoAdDB~^ zK+~2rVV6Dc|%ZoNv z%%he7u+1qi3h_px4KZKX{6{MvfY>d5tLLL{CkJ1~?lbWSC}UhZPkSb%goh=+URt)Mo7|`3HSXc|5R#T3AHJ z*b=;>odU5_1`G5{Mo$UPfB`xOe zt`T(X6UaBYGUe~>-8|0meJOY0&x*^-LTuWOn4nb_>2!PQKb=2+{tR1Q&Z`fysS&+@ zs#M?~{0)(#*_bu@f>G6aL=(lQ+m9r2@#FI#{Az#z(DILDlsCV7w`H8&7y4&g08d|} zal#p#RZL7Ntx32(JHBWz{}LRpQ>uH+N_jz@5gQ$yKYa}g)-}#lz(1Bh}%Pjk7%udISW{t zrU~wLisig+@+~UMi9V7Qb{2*Kc7`q+M3+c3VRt-WuyW5BJ#oxa?)LJ%)Mo$_D&{-5 z1};V<{@f`ER?Z)*`NnLu-MhmqT{_V$ElGwZvwlIN56Sk6C$7xB#AOULyoDbcA4|nS zfcJ%!oX9D^thk_2{7XGEE>8WV^setQLV-cZ09x433zm@8iraQ{{bsk#FLu`rvpdL! zGzcIw6)ZZF$)h^^sgpV%`}Ow&Tb`Kxh-?-utT!2+uOVdmGR5hJQwes1{cN9-O86`#qx%_a|9-UN$06k zI`Q+{(-ic5iM?z1VZf%G_GCH|mkiQOnoJ3`$v~7Z!!y}3weFM}Y-5ON-YLx2++>aS zn(V>zA{{FH2mtPWPog8A_(S&fWY&C|{KQ9J$$hHkojMBCSz9aSooFl!CJ78|mTd{4 zPI|AJ#1}csQ%HcOl^eOKG@6VbMY#GecA{*&=f~}$CP`PWGrVSgC~(l;>M@ckh@5Wy zb3rOSh?k_219Th75hEd7m}X?Z3;Y@U(CZ*i7uw?Q7_Kf8OdP9xs;YW3rH&pR@_TDo zQaXn$<~AoWW98C+dn`sD_I>T4p5MFh;?@$V1i!fs)6SP~LhmR}QY~n|h<-M(`|7nQ zEXbIoI<6W^FPf(?{qniMqeuRVV07Q}c@(e*zHgLglN>v}4s*A_sE6yalQ?^OUuY_C zYEHaf_!bhE39hIkl>lb#Fxw7y_2>FL6vZ<0^+)|Z#T?U0GX+d9C2ROve&U+r8x>Vi zQ*Cs`F&bO8AXk-qLQj)ZewAeI^mO7^4h{}5gs-#tEVIhXy!NO(ouuTeo70YtJZ<(M z&1TY0G^=erjrhF*a`DOuJ1WYj3W@F-G z{o(JO{^El3iI^HQIIB_;he$^NRQ-F1tGGmgb`mt1lErKhLQ0JzOd(4KE$==6xqcBR z-9Zj3cm&ptDKS-H=S)6ICC2EiIrjED&Bg(A5a$=!m$J$!WXmx_U_GAPtm3J)DjQyw z*^|2I`W?J$%pY1P^^UhFok5Z?EH4qvV1``Y+b&Tlxf5ZcKbe5YJ=6HaTT#du;!p<8 z0i_bshCIM@OIx9^k|It)m2NW)Afa2;7?n}liy_L-d*N1rxYy}RpxA<_gNxFwUPjC3 z_N8gInM(E7@AN_2l`R8}ZJ#Hoa(tA{hvA|vDo?!a+f1jLU%!7S3U%HeRS`-X5_Pdy zAukzKF3@Jbj&WUJvvYqR#%nqBY0rE3{7NJNkIp*xOfnHY7E3m-qJDa5;nKDhEo6`V z*u5PnW)#k-lxz3yHxZn)h>ZO^%xB})y}hApuSGq|#ptZ9>I~=6KYa;O8e8@7`q4Ze zA*8pVSl<=K%C8GFuxoA=jgcaMX+)E#9p#^kAfR^TrVg#2LV@@n?D$+vPKDuzZJ2bQ zz|4T1&bf}PybgUCY3!{Gpq0DF;%_*M;Zu5@IaB&BE~EO@`cKxQBs{Mk*lOXUiF2eh zVA5%)J63iBF=575V~~G`Er=JFvLy1}@VUfny*Me+Y<(dX9Xj7a@=*X)WJC##`mLBO zGVf4gkIaIcx@b5D6rf@9T2+c1HwO|K=r+gItz zjLHOvj^CCq!tE;_UEtF^mIZ%OqWQbj7UaWaJz&{ALshK%1Vn;%F6Js7b@n7fNPex4 z*`}?N18f1Vk4b1#f0+Jg9eMl0rtSN(X7SJDo;-y>&EliTPxm6irYcO37&7W;`{4zy z2HNaNH&*7bEa9oE&!aEgIGMqu(FuuD5Oh)d2_Iky+=`H@{&eJU2XOkk^dS-zRrU9n zJHNie@odPU3IOP$T+B6^u^Sc=Czz9vD(>mz6dCb9Sc;cia|gXy5}Uj6cW^xau*l;U zsz8Jnr3fN&RrK-4=jlSCqQ%F*GrdX;mga(8V;Tn;G7`~aZZe{A;9lnecgdul4ZRT6 z{XJN^R|C`uTe~;1iVmyoCA3)XwtcnxDZ=`Rw=8syCDT|^l9KZs(De(+16~GZ$~uC( zTkovoQ>v&kYaR)v&~%kK%A6A88l%7O;YgrWE~q-kZNsLIRMsQW|2Pq#z{pbIZTH^d z-m@z%KO9;$SrVdOi$?{*J%(~XwJkN$B9b+IAQyOSNBN20cKDByi*$?v3gj+2WMyS_*<9g+7ufRCKM=o~ zneF;1KkH9Hn3u@aewVF@&raP?BQhl;7|19)iEbtcTo(3-fe#NyI6J$$yVtE^L~V58 zj?(_h-Fxxz1P!Avy2WG(S2Mabxszk<>I}(H_eBss5UX6c?f=u$j3Q%ZCMTAeXMiSv#Qxu1I3~O7bCEVXBGlr{OSXSopv}Bo zm(tfd&-zBd%Hf{ZQG)Gla8R#uy`vOW=n|NN^tg|qSzq{NyIS?O*PJI7kSEh;of=M| zdNx+;wM5#N2ba<)wX-`TNR0euSjjfK>GL>~N45jU+@&uCEUd;iu}rv=uOG-l8|h)G zVbrjho%$7#;W~_NFi zi+NJZi7XF^OLkKp6nIxRN%l;4^RK9-D~DrDuP1AQYt3KHiKOvcRGSxhl0_t@N2!it zwsUzSWj)kN<8~7sg0ClhKbqrGNkEM<{P2_8JZ(y8tOcPMEEp&c?fwsw-~G5AW|Yny zeHE7EMH=cPIdb6re<0*r8D^J#(_-ym^!;;QTwBy{M4zf(^tyM)#7K_#h~ai+P*gwk zvYAH^b{@7C<`#RK^m}eKS9qLGwH~pu0-bGm;(0}M*=W@IlZJ65Vg&^W&t}|N_=KJw z^TGpuBNa>NjSqW>ygi(3LpBo`piL99bka7{j2u4d6|Ky}mS$^Xt-wAgT6zvp_j|q* znfW?u7=6#7v%7q_zj7A1-#wxo^r}`Rj;JM6S!Mt&6inEe#1k{?8gXw!kSQVJATiK! zR`~UB@}{yHvxWxSEbJo1EaQ37q;$b-o@UV$k_^&^F;))tb4p8H`?Z;xIT=h&C|Nwj z`B8ay`t+IuW-R%NWL2=IACxT)fLI$VkPA*)>2GPz@aghwSLThkE@US5kGE)JObKy@d1OPg+KdIF0DxI$SrKN>3sSRg=onW=EN zaRzJW6EYKl3#8etw_*AR9^!FOYoMaU^}G@0|{9G&l)~^DCLyN?0~d_W%9Y zE33V)k-_mGbm>~p%+EbXl@9l@<2pUw@OkB$YkK$hwF9yQLQ*V={Z7=5*cManmJ}Q!D;8;RJb!O&?Y#xwukD17~T1#m|`4tgr~0bi&Wzw}@dyy3$|9 zQxmCftGq5uSu>x+MEQD6KQQzWP*l{u-!6MpYAyB`H^b5)uLn!`vNt*iLb+#Zq_qrS zQk`+qty*NYU~4OgDE(am_kghLJJw9}vLVa~2GN3@pTY_Oo88j7W(bjp)5dP!+f&B$ zGW+o5EuV*vLRMZkm_n*{LTRVp5ZLd&rj<@?2`4On1CWTcciQowX>@c{PZemjusl}w zw4rqe_fgr5L0F(>v!V;pop`Sj2wGsVRb{(=^Y^cOC$J_w@J6}My>lu)xtbDoCyk+F*uO=FUB|3EZSm0}Y{;nKhl@&kaRGOOe|wlTW(a|QtOmXT zDnz#m#BB!8E{-H+qMQp%x>Znn=V{)^p_upn$5{h2uX{8% zOXPetq0gv%@;L6Kig?##8E#qNwHftQ!p>l_=XAlxd1~F)gwJ@Y?Ovx+YJbXnpv`a9 z#Zxup9Q=$=NXVmv+ciGujHd8Z$#|LP8H^Yu;%w?#Y$Ex{0E2+K{U0 z!7GOS~N*v4Ir+m=D?ajrG%l9sm zOHj_*%_3c|v+7|f{>%c82t0#aZ<;uOm z+V(5SOPgQcn0_!`-Iwh@oUT_HVa<1w0bXYz+Vz7#&+j~ib0&ZK`xTQX=3L-4A_ys) zsOwa|6St$&0U#1t^|>_HXOTwpeLI?B3f!#%jwmvT_m=+j^tF#gl%K5Yy$DGwJq5=5 z5l7rokBMxZe|4Ao@_0*9sC(D%R_zi9 zPJFVEZ0cJGCgshk^U1ofMEvS_K9A-Cxt}8^LV-TeV649sjyW5`H^{dJKy?J$8-h-h z%{SCm+rBPwYwlF<*dP%>p?%$q4NM-TQ?^$CyoJheqw{oTLG0zr$~@bXOnrvQjo4!EkXyZafY{h!h645Ef*n+%#`F<0k4dtOxffYE z*z&$?S}6SqWd`M9Z-Wt^jg1}_w~Fv(MTv@y&18Q#x%rVTpC&~E27o(PXMHmdF}B|K znIv9ZK*%)s>7{}7J|vpSfx{~*>Lo~L9c^jSlt<$LJ_Fi;c* zJi!vp|7%*k?X35}52bUMy_r`3t0!D>?~u}gsY->U$gj=Sh$PlcSue2J6{G4~vMj|{ z$~F?8y+iR|6&*TcTUv*EcoVPx`Sn2Ca*UR<5J zxjT>qig^Wb?K4cTk9-~h#PZ}#JPNg{G75GKi8_rrPVZ866sq)FQ}7RjTpmc)JDaw6 z>}rcDt>IA}8au785)^J|=q z&uZlx9iQnRous9v8fFsHVP6K8)N_$WN;)kChR8QsfBSF^YmLP};H1mLGv~J2UaAFk z9{)f%B<}XDBX`d_Ue27*AZt3}Je1ODn$AaZdmk@68v54=d2DO^+so9}I4g~X5$Qix zQTXLth~~_s200;JrP;??@L{=olwWMulP0(f7=%n~cPYsFnRLQiARvnRXW+lKaNEIY z-!l_%uxPf?{vO@$K0o3*%#*l|Vz$xjv^|MppmCVJ^&|oZi*AbkZT4&jQ4AG~%-*z;ZpX2O0 zu+b`Ufc+~zJp40B2Y&dg-Z9|Wqe2qtFbAG+vHVNN*>*Fmaph9k;qy%(#Z_vIusjNl zS$VpVI0!#n0n_l~^XuoO6Bhw?Vq2CN7LqT8(xga*#~1=He8pn;sY5MBdRc;baS1|~ zc%ERq_VxN&hhpsCg@;4Y#c*-RVbVAoOkc%ChZfr9bW{IwERhR-F%f}+H8G! z(ogq!+p*=5@XW0N?iPn5U^=7>YYI}q9`r?&yOJosEW|5{&0Z0iy4tptGGdN#&wq@$ zxlOu|+$KHoX>+-^TwJ~Dt^*6HCu<9?_lVB||HXLbjhmrlrIo&OSH+5&|3ShK>xwp+ zMO8HKa0M@WcG-1*!Y*8(^Re=zzMM;tpp$imGDD5)+zyDfwJ7u=PtY zzACBq6%Bv|?(@#B!?9FURP%mAse;8@jUu5r4EICY!w_)S`&gY&rwd#M8crONtbQdc zEFl0xYxd*#Ns*+KpV&h(cnxAw?2EuJ;`xSP%jZ1ke+&a)^A_j#?Rs0#Pa$cxdHb$V zyfhG>U^)Q2Cd?9BrH%}fMG<6;_(2|u9y3@JlE#d1L^Z%qoer8LD{{Hmyd%bhUr5QF zq#O&IUaT%t@mt(G%UXsYSan|NJ=$- z(DbIa+E#~voGZl-5QT{o$Y);qmFv#3sq_Met}UucE!=7zvq+s4&Iholy9=j4iDb*Q za>O90cOdAq3^W?UnZHRzHfJ9C-CDY+-sHtnQ37+5 zZRAiI(+lpXbHhm+!s#TGHWQ`!h9xitGGWTY;Toa9>3S8w=lOI^ow05%oC4PP&O9zGZfp%3)UQ=tMUAH-B$N zEvLN{M8@A6GucK)IQutI@^}Qh4~NSlv};y&drrF#Jh+(za1yv_!xb<0;%@zDlq6j z4$>{wUZ4qG>IsRvX3Lj)9(9eVXxa5%b8MKe_kV#>bm0sAO`^8VI|XokdyJERw8z52 za?7PsQ2mVF-EF&h7Y~?@=}>LzLtvR_0`y1(Km055nfxVxu?yzFA5m(V&-gI%Tw|i0 z|1r4%Z{aV88<5m{H9Up-hVOMjb3n`dZc~uHPtcY4uF<1!rug|)WU3%sMIw3$S~xRyNlF0Lc0R+KNoyO*!=e%{~Tj|Ga#xvsHtHBSzsv-p3`;|tDX#v;d}nXf6@ z09ZImw=>=Y7U>0%kI&oc49gd=6~%HqTKrtKYgwSq>FH?#F#ZZ+CP8H^r0m|a^>vR} z|LY+v{q+#UAQq@m3b!i_Hizwoyu(U|CWG(GLAaq%UFkKU3b_q(9h5$yxW)Bi!z zSVPX|bYF2Md|N7?KJf*Mbib2devYHB4u^!tjhx%+Y$f%R={QuOFK|)Ui*J2pz;Q`0fJEp1X$G0 zm(Z@95^w;5TX@SyLUoNo2)hjZqAzr|=0 zX!_#ed$EG)h>^sx5yAV>k!y!BE42`DUXNM>>YGT$Bgyu?%rSR{m!7F)eJ(<tZfP(~J zDoQ%bYKC{)!pof=%c>`sY~e_NKtT*Xy)#ZZOPzI&nUE#q>Gu@WztM~Ejo#e7x72sa zP-_6kYyd+|B&%_8<{v zG2hR+rEMBy6)I}v!uItFTaLLVJI9J9u2G5Wd@i#D_e^AfG~g+M=-a3uko8u!WS-2h z=Z|ff98L7jAZyXGH>Ugzx78eH8D)bR9CJS;>EDqZHbx|+yWV6es;L^aPrAFlRip{~ zLE-V7*h(jb;1;!gk4U!vZH^ok-96?MH{4JuXR+AOGILd<$72z2bCW8^7NnzopuFljfuM^p3w&&e?N0xTHi4WvkPLCkkU5U`MhU`{5W{!}!r=|8E>QhrA zJY_~G)n0$7_ge^U9*g2Ar|_Z_x{vpj9NCITVRi3r*U+c`Aql)!FA2qsznARsBo9zg z)s$$(3?%~ZNe87n3h!{^@=0(r#Uz_4#Sv4S-l7z1Ghu)J9u0B%d-?fwnJjUZSqc!Y zv9KQ#9r9NnOuf@AS&2Nlu1=?W`LXTFsGjM?lc8Mj-*>dkkFGJgP8d%{2`_FGM<`48 z$dF2}pR@m>006mc?_L+L1~@qgWFjwh2C(u4>KQMdoIVtjp9+Yy?;14bkk<6us#vSy z@0Z`p6Z&!3JMe~!WS&yMfUPR&# z36U5%Up9IT%j;F$$5pQP3P1 zUaDoG*FTG)J*#Pl)jd%R_nJILZyt47Wa8y)ku4D7O=wQ1TEO&tg9QT1JLo0;YPRU5=JKQOj<^wei-+MI*S;e@Iq7d*!g$+NF6#dbmL#vv-!~PXm6{)2- zrB;@fU(wZ()?+(Q^En&};zx6yL=F$6HknVEc=*)BOJRNA{?qFmk$u10 zA<&%lv)fw6?Q5~cx5;$LMb3O9w0(7ix0*6Gc!5X@@(dnZxq2s+xm;mwpLW^o{d~K+ zi<7(~t;-$3D^_uvegcOs^EU2LZW5@=S}f9sQcKyD>$xScaI1N40yL^o@q;tsx80m zF09rv&YDt%HvEVqmZ=0DCHcQNMsZp37Tu=(*cR&N(nYpmG{KqjoHRJKc>1@i68E{rt18d z(}@#3!UauCclpaU9*378Zr@&0|9Cb#6))^xNKi0DNy@(+Mzwn{m*8$qN4Y>DhFp9kAghqtc0BMwsRGy>PiM-t8t*PtMkw z@Y|Ou_UIyqgZyO9bB%wV$o3~d^^iFv^m>@=)o|yJO>gYdS z%7+TptCge7){ji3vxLmGgTA>}DQ9$2=uuV3Fgj_{OzldY7#IX%RasmL=n+hSHZ1TZ z`-?{nYN7vzn_)QkZCiIS78zQepvQqg4?)pU#p9dwj9kSGHOl1Wuiof z(tQay$VMN=j6f(dA_W~ttEPkb&ReRW`Er04*BLay(Ttm%O2n$EsojPlylia<0m`L2 zHr7U$JeC5%VngT>1+v3g_zFe+~On!c-XA%Z*=U31V+U#_DeR?Yxs73!};Y}y(&i3)yN^IpOreM@yAL#u- zt)FOe5Cm;F!UVG1q*I~@vbzi;)W%ck$*WJ1L(cw(??5K=9mTh~|4z51*wps+_h433 zI@TE`pYo5W9~)&TXkkNuQ>TJ@+>|O37m#7$1X7U)f}m+{)Px%(3OTBKqYncz&ufgW zsi`XZ6TAph&{&fPra~+laUs@x4!gRUgI0nbf}J+KGOrJ(+Cq}71pz4D5- z#9e9qw{#sCIKeR>t}P1be-u<-SL(*5ecs+`SPpK=S_ull8~v0%z8@RYhpjPE@vocU z8~15Xwc>=tCl6aMMG#a0^ifq-5+kLEXFPS-ZixeHnMHQ3FSgBIKS126A`o1yKmqz5 zPS-xKjv8azD^q0iuJg|~ex7p5>k_zKJ+)7LGXz{o#B5iP@~ zuV8uV5b`1ZLTfYtk_NoPRJN7!xvNwlfA?OyiaBT%m4t>9CKE{9sIQ+WDYe_j-~|6h zE{D2VJE0zXUxO`fs+8jWA^`9z93ZFxYu_tuj#aApC~6HL*e*@X-)XtQ>W6JdSygk ztIJG2eC_3{Jw|Wev*&vG@UagCUcyh8pcf7<47BskURm`0^BDDg&8Yv9LfDUKoQq>M zZC2unv`?SjWTu+lZ%&`DZKgSI_ePUhR!Ul z`a|sa3u0V)v>(NHcbq!niHUQ$|U zGETV{l3VpDQak|Nm3}Tu<6{Fl=rJo-fv)XxI*PA`)!35M&#A z91)@HFg}8z=P23*>zSHbfExB4<;}tzfeRkk;%SE}o22R-%<8E)s(3XOaZVKMx5VP< zB7+la#7`l>Z&4G+P^}T3)m5^SsR}*U7eFsqt92tnSI@7Qu#4TRpLN1J9mnRy(3jeT4+2KoAtr1R0m7#$@e9 zp?n)p|9a0;X+t(jk8BNe`wl0wx(m!_Pf(OMab9{hO_}=a94trjknXl$?mjhbe24{d zCM1wpg~YPQ*2XVhSLFF|;+UGXNmyPDm8YNpmF0=soEELl&|?|=R=U6AVT|&d|5|{v zPEPI;|D}fV$R9s5r1VQxUH)GNADc}S-EM?{!&n+QtA!4nLdZO*TE`)lP`Pa-uTQg^ zih@G41&B^`W=OUmP{ZRiz3a;0x_gR(vqiDF+ifbkx|_xWJ&!_xO^5?pT(oE&51*SE zeO%-1y-CG?&5O7)hkUxhX9@h=I`$UTfn-Dn7w9Ov6g-TLiOJv< zm~brC-a;lg02E@_q4O`%|GVOkda{IoNwT@_lhHRKihw^6mxGoR1FkQQDM95YnKgk7 z0s!dMsX(qD^oo6kO4`F++rbFB&ep5^O%4S9Ap6GN+Hd6AX3X8^jo9qo6JF^!PwOzK z1$`MOVB1OSE~GWIuLg6 zFMbKd32A6F$m4W139)IZqBg z30>}J-t@jN=JUk>YX2bgQn0j5T4)dCvMlk@Omwo+CND|Of5nXBl%AlR>mT$oh^sdn z4n0uc4y||8)B0J|!4z@@cfD~{-V6w{AO~?Tqr_lop;>%cUVw*RSz5|ol9z<4s4>#I zbH<|RFMzvUqLQVpyuE+_*n3_T`v*amHal1RPB8qC1(agb6k-F~UF|B48T+Y<9fP}s z98ms|^0%eyS)kapC$hMXPP67q;&CMag_J1hs5~bj1bXF;kEU1fE|v(Yu^AG}UL5oU z{kJB2K$2?T?t?C-mQL;Y|CgqN4;pwu?h{l+_Me9h&?eF|I;W*1sY}l1(o2S zfJE{Dxn7$1KMH97`GG);;{9ze4T1R;fn(1ZgXS`2fE-nn6#c&&z|y^#+k11@J36bg TbS&VLJ|Lwhs&W;w=E46DYv#A2 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/arrow.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/arrow.png deleted file mode 100755 index d72b5f3b8808bd89996ef62f845164d459957a1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol>!VDz;rWf@BDXjpX5LX~=X=(ZY|9>EfAH1#& z-3wIBTN30K45T@Ev~-ix<}bSOt=nC)A1Gk%>Eal|aXtBhiAd6gyIe=gyBczF}qKQ%F0(mNbo(!7G$6ystm-3eX4!Pgg&ebxsLQ E09R-@$^ZZW diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/close.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/close.png deleted file mode 100755 index 40caa6ddfd01c2a26947761de218e4ce8f5e361e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 615 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CDO3=9p;3=BX21L>Cx45bDP46hOx7_4S6Fo@?*ia+WGRLhp+?e4A1op@M5>3aOmOBJL-|3|^OV7Yn$}BPM-7dk4;tau8cTbEB zVOVq2VrTe-pr)C+XL-*25p&w{RY|c$I<(f*c*aemrB}2+@TEpJ&78kybw|w+iRXsL zc6QXHdC8sL^yZ3dsB5%j+BccxKY6pB9X)fwF9YU; diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/hidpi/close.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/hidpi/close.png deleted file mode 100755 index fa00f4fce646958807479472de68a95c5ac44eb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1238 zcmZ{jYg7_;7{>o7;-$1aS*Vpuj%MUhKwKnwBQeE>iCHQM;;kr2MKsN9ajfHLX|~d( z0j_!7rnbWj70DqHaGE-Ec*#mE*7Aa+f@PN3=;J=@yzl!w=RD8(eS9y+L`T@$x!M5$ z>`9TtShMf=d^Rw%a*B$U%mzI{AQJ!(RjgZ0vHD!5MaGf=DB1}C_Ywf_%@KDRfP6Fn zvkU<6)d0YA1l^QCa{)^|7(oP|KF{r*<{Re3I*&vSw|>6P!rmQRbokQ-0Lv#NA|Wn8 zVTd1y-b&iI_DfMn`pHG`3_1z=jcT zi%WSg1p=WE0#s-iqK?LkfYeSPPgL#*CapJyenttXZ*J|Ceva)*hv&=Giu4Kt|_o#+; z>}-5zb*1N97r@o)GeM!9;t@cLsckcvyOSAjih68&?@b4ntN#|X>if2GF)*oA3JX>2 z4hjhwy!?~cHw`de9d!!lc$p5!CUKJ1nt02cawS`!FH}Dc!pg#IPiJR;LL!!f-KqxU+hT6XNXeN)Uq#mFQcT1%o#$K1C{(32;>vwCG%E5GaBNVOT)^G;= zh0*iUiL6p$=hO3@A`v@#dzX<2bzFJ5a~9^@Rc4Vld3Q9qGWNoUw~GdYK~WgE^SEkl zZSCTrQrhw#Q>+_KPnt5a1{Y}EP9-wpP!ju^wC{bl~-q4{NdM|ZL&DJ?MqVN68k zADI&g1hj2#Zuh<3rB0)8ynGKtOwy88)w=0B>unMH#ng#J-v2NY|HidutyTQ1zr9`uzC# z3%ZgBr8tpkQ(E>Mz7ywii1wrSwG{!4G}i69#cVs5G1mT1uEY%jpFJg>ooGiGDabF8 zvk9?LWa7(u)Pgw-3W!&U8h6;NNSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!ItFh?!xdN1Q+aGJ{c&& zUgGKN%Km_xiC2-KneQA20|T?Mr;B4q#NoAJ-g%GR1ZuD5*6rDJjcrd)-h>3B=A1V= zIR}n!c(^9bSo{Jf6U$}^=5L`*AC=-%+%IT8Y1IunyKa_ih|B7mIi1a#4FXqn%Jx>R zUp1?xM^}tnXS(;Eeft)@w(8(;VPQ~EQdsoQF7;Z}mD1juIc=La8|#R5FZAa-@babR zt!=H}<<9I8mT}-$NOfUJ=2^4V;Mf7n_SdhoZES7d{*Zmju;%(}yB$$8-bOroSe)i| zdmBT;*)-!1hC6xZ6o0t){Yv(Mr$wA;|GGO`I#?P6CK`O+TfB~6PwB(G!!38#rZoQaX0)A3B6jY5zqA@jv>(?TbH3G zYHgT{OTBdRx!voOm6WpIT2IwYc>eC`)6^*!_cEAN{P1>}aW;+N!|sk6-7cov2mYJ+ zI=j2OC!`4oy0ECLtH zlGAJ&$Z$-;;4|N&4|n&*3haNe*PrRe^ZnsXJC+|8kpEQQ#hazTR_JhEU03G*WQhx_ zSFQTa@XK)Z_m!qfLO{_&A>$Pt=8XZ@DdvY$j zVYWN^`JKn#T3oJ|_TNtD-`Ox(<;2YI{|r-hRvU zGP}FGn~^hk%bWyj=I6V+4bl@|A5FH}mcx5Qy6NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!ItFh?!xdN1Q+aGJ{c&& zUgGKN%Km_xiC2-KneQA20|T>`r;B4q#NoB!jzNzN1l~-1d}PiEc8g8<4BNhKiaBGy z;E?er?jTpWL(J2d<8Ng9?X;YJr0e4sxsI4F9c#X=!B4w%d)?R0dpS}0#m1jCeOI$u z&!#bF>xPJ`%=UI+U{G27Ufr`v=d{6Gzrxbe)}J-^J{i__ufP8K+979O7X>8+&TQRl zuS-P^tk6D?wY6#MHpU0XlZ!N1cUy=wFS~L2io!A3F<8pFUmxzSqHtlMT=N6&;h1NY1V>DTQ!F%CmoqVDL>2KIDPJ4PyfL9KFZs+#<`Xl64<|4P-o0PTTfbK1&74GOyB{A7 zYD2{D-HBCa2(`8Px@PP9jfd6Us^2(tiLNw!X8Yx}j+6g;bzK|XyPM~?t(#)P@T+Lm zDnGxoeRm>E*0&ed?>oJnQQ-Dk=BI%-dUhLrU-v)v!2#Yt_k8t|UKO2H6E<#e`{O5( ztjwhl(zrY6XUW@g8#()xt5&R9lKE?jis#`rX2ELvSxv=nHtb%$YSlE)Nem2j_V&}; zcV6Gedfv-%{?*dGUv7Rler{tN+pew?7vKDDng6<0OY%qq_ml03^?JUSkALu1_r2`S zuID-F+@fA10jnRoc}nX~ykBj|_WN%gC&T2EPd2W5eSL#utIpONCFbA1f7cZ{ck-!Z z*_DEQu`RXFy!CS~FZ_DVL1M$|@E>*u3bnt@zVu*y5`#ql@%>Wgn#|tL`}@EC;K$oR ztez>6-;86_tHdU_gof6~>~s23%X&Lii77ib+j!aOpY>5Z8+QL=G~s3s>1C{H2WBMI z64!{5l*E!$tK_0oAjM#0U}&amXsByo6k=#>Wo&F^V4!Va2qdpFu6c{1AvZrIGp!Q0 UhGj7#fj|ump00i_>zopr0FH;n#Q*>R diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/hidpi/refresh.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/hidpi/refresh.png deleted file mode 100755 index 117a2d4a4715551e735a14ac0a79d40c9affab8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1623 zcmV-d2B`UoP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x00(qQO+^Rb3jz%x0D}(B2mk;DTS-JgR9M5ES51fIa!A}CT=lR4Pn&pDncWR+4(bwe$DFdqE52*HDR$iagkUKPw~3G6`3 z!Bc_#{B#| z78Vwe=XuHcJkMWd=C9H;y~50;y?R}q=SY$SOG``G-Q7Jv@M&QdLO=+CJkKGeEDi?% zW`15u`A`V)a5x+u^*ry1MiCKqc6O>2ID7W&6pVV4woXHJwOs}unqZKI>SYKZ+38~toltPju zh@uDpjsrODI1Ud6g8~`D_n!(O?pF!c7c-Atu(`R3EXyhd>bnpk%(CoTA;dWoA#*Je z70NSnG3R;SOG%RaVZuK*H-|=}F-AZyG$1Ule!mZ9{xQq4J`tVM1hg+LTnjPh;yC_Y z2=SeiviLqXH-{hy!0YSlQ@+)QuCA`mg<+_qly8`b%p%v5=A@MMZnp~n1p>8N4UXwM zQ^=`Pr})N=8zVgBu>5b&trF4CM~)mR{I8?Hsj@7NW8A!XQ`!QIBy%0W6=uGd=lKZ$ z7XZ9gfk4{rcHP5=4^MH0nc+AN92qS)H@Z(d^8%3UaZ&aQ$^?E#fz+&KN)QR=S?oy`J^~wZEej? ztCyve?^$}?&$8^e>$;_Es7DY4&-MHLN6d`dw{O$QlP57txIIVhcH0I)nF>t`2{CgK z!^~XdjR~BuNGX2;aMWbJ?MAzF16DaU!%5opQ z^Ovdd*O*ETL)a&)BDw<{41u11)O1UMad@IlM(|7LN8JN}!AwU}& z8-?!&g8_WsFX2T*|0<=9RS~FGt6?-6ARrb=?CFD5Vet z!BkFHO0`_qZQ5j#Qli)EAxV;{5*~)(qV0F3)PKJ3m&jPJ*TH7jGdbi7{jTq6nm(3N zR+7rDig6sH-|z3j8qEB;*|erdxoFEA$GL7pZE*!sO1Q53iyg`U z(Cv1=w3AX8hGQ3)9~zAYnE4wWhB~~Yl&=dRl)W%;G;0umj*9B3i&W_fIu8ljkIkV_);j?24{ly*kbV_HbPn z4<04M^QvVh>rn8X2Yqi%Jck@5aI)je|A0z!>~}+L^02E1VL~hPe164Xeyy&wu+=m zDJ(B9hqrFs8iZj8^LNblw-&C?xOVN@v;qLoZnujPYyO^@!tH3#cXOTDcnTqk?`fKr zgag3;LVDC3zOf0O0000bbVXQnWMOn=I%9HWVRU5xGB7bVEio}IFfvpzGdeRfIxsLR zFflqXFxLUB?EnA(C3HntbYx+4WjbwdWNBu305UK!HZ3tREif`vF*7!lvI6-E$sR$z z3=CDO3=9p;3=BX21L>Cx45bDP46hOx7_4S6Fo@?*ia+WGRLhp+?e4 zXsMjst^Hgcb?*)HYR(;>?|kX8+=2JA85!;{ysK~L@z>RI1^QgI#5JNMC9x#cD!C{X zNHG{07@FxCnClu^h8P-K85>xc7-<_ASs55eOen8F(U6;;l9^VCTSMmA^GARh7(8A5 KT-G@yGywqDd$lqE diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/lock.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/lock.png deleted file mode 100755 index bde67727d775326b472106b5e0a82f7744de2fc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 506 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CDO3=9p;3=BX21L>Cx45bDP46hOx7_4S6Fo@?*ia+WGRLhp+?e4 z>z#`>8*e`A zcVWh~ihTX*C38NTGiXPgmlmG6j8o-*;1Q*w@T-a~4xzFxPvT~aWN2pzE}t@O-}{L{ zQ6Z%rhW{8Ux-Pt7VA%7$d*;Fe)%&+p_;bFR=DE+7x#7z82{mh$F4Wt=#2|6f{o)Dl zCT>5Uvy+XR7F(JKOtf6;A~@6Dh(qyCh^S)AZFjbFJ1viKJin92WNUQ7GJf~E-OuKn zFLn6z-KWsh|MmIAwD@$MYv#-hKbReosxL9#m<|ee)e_f;l9a@fRIB8oR3OD*WMF8f zYhbQxXc=N?Y-MabP0l+XkK D;C!rU diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/refresh.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/refresh.png deleted file mode 100755 index e363764e3d0886333a3b03b04f5502d4cd79d133..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 757 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CDO3=9p;3=BX21L>Cx45bDP46hOx7_4S6Fo@?*ia+WGRLhp+?e4=#-F2>at)pi3YpXk7?elJnowJM)Rcbn##3;CP{noPIf9*u1IU=&zl`?0=2~WI! z=1*ky-*w6t4jybgQdo26y~Qix)vKIlEtCIbQ_sh6?UuK!sc*5HOFv@`Q^N{=iC#DR zwOiZwHqPxn;mdHndV{-C(JS^-cB`jUF+C7qnDJAWfvI47?rmwgJ$LguJN(%7emLLW zCcpb}`SUy8`A^d}GYbAKJa;k2j61B#dS*w!wA6r}$3I&4hj=C0&2R3=Gc;bu^=?(X z%8dHU@q{ diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/spinner.gif b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/images/spinner.gif deleted file mode 100755 index d898d41fa7e0d56b5c0da930750e108e50c14d72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2984 zcmeH|X*8R88^)iIq}DU`>OwP=T3e-=BBi$4DkQN?thHqk38A4vt5G2&WJ5X+EFD9YT0*sI89FsZ>!72Q&ifkPB@Bi+&U~74=F2=EpXZ$4bKTc<{qMhnlf9`~ zkQ^Wfd;|ajfe;xP85bAFX0snWcpwxChlhv9#>S$eqLP!78yXs3ym*1f!KBV7>b5C(sIPDd$9=)eU}Lyb1T(C|L~Y+d zitR+2qa5i~Maw@~h|4LnKu1*BpT|0%7X#@Us zYG0c%Rw%8s#h!qURb_nB6CDm#w0$Lm!+p6v)M1kPS6XTpYCGb>$ zrTSFsgjs@7;L=ZNHr`*n_AE1e5P&%x;-F-v(5M@!yeHIV8(Mr6q{Znl>TQf94KE)T z7jK=}M@8CeE4Ft!n|nH5@PMzW$tdgUYdov%J=p^p227dAuVV6QXd{etFA&=)=JQj9v_;&SKsh|xZYiyHz`t} zO$T;SEw-s42kOby%|^F=j7GM_Km1qqEqlBw5OJV|i6ea(-8^72y3DWglIPp>Okf(v zPU7=mxfODI5iS2nYy$E81{Tzpng{R3ssh~8E%-KLGq=WZNxhi=qK3lRWk{V+skb`$ z_YH4Mpe6Q-$#UD#5Xp6su8QKBCf}FKvW&5|sa??W>3ww)t)A@tg{= z4o0RHDJ(?yK(NOaa@X8eyH!FJTiQ<)&aDb3%WU`M7CbZUJQ`@^2f5v$)*qu`nO=86 z2yqIGQJez9lZfJlU&Za6{O@(z&?&~7-h`Hp$_ftsz|BZ{J#11GYBDqi zshW{Rt5*`7xQm|tt~XBey@J|SM|X}7wQpgd;&cwOY|_D9hgHO%mMy{7bV~b)UQMM? zFwCH?Vl7QzTg?nUV?0JZk%dU~l8LTFi*Nk-qMK?`Ro(H69NCLUL|R=5JoD(s6R+s~??G-dIB&9( zjE0(rADgtz-YFY$_P5l6Z;HHtk~qz+Iq+yIJJXieBm+B*sPKAR)c1I;p}-|a>KH;T z{k*1vuNaxPZ$$8M&a8M!TYqb(>|{cnMOHZKWvi6%jd*BtRy(j%nE}1-R27v5q^S(n zeB&fb0Md+~9W)Bg^wzQgvGku#O{?6C*#Gp3owR!rT3qT1ITjV{8WUx+rycepJN{jH zom;~1e}pn;IWXEkc-VtF^?uPS!tlMr+@))CvZoeQy6pAyRh-8R)z99iekfQRJaQHm zZ-e&p^dozb($k!`&^wna)Yd8qr7Dr9$7(}iD-CY9mB0YT@zQH0&#TlhoZgC>A{I zAwv8OyXVfJbKzcCm`9QKJe{sg8!wMYFoleOl258#R=>&($9e~ZCnu33m~K(1C?=O} z6CH26C4J{2-zW+3YdiK${&l?^le*q1!^Y>G_MO_=kph+BFBYR%aRo5ay9QagY!jpt6z#}jj1 zdmRs6#V7hQ{S#SNsYjiu2`N<9y{v{6cZG?6u3KQ|`A9m=&`l*3wQ}*CCo*^$qZLqZ5gL)PX88H^eiH-Hy@B{Ysn8b_ diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/readme.md b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/readme.md deleted file mode 100755 index d4c68119..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/skins/moono-lisa/readme.md +++ /dev/null @@ -1,46 +0,0 @@ -"Moono-lisa" Skin -================= - -This skin has been made a **default skin** starting from CKEditor 4.6.0 and is maintained by the core developers. - -For more information about skins, please check the [CKEditor Skin SDK](http://docs.cksource.com/CKEditor_4.x/Skin_SDK) -documentation. - -Features -------------------- -"Moono-lisa" is a monochromatic skin, which offers a modern, flat and minimalistic look which blends very well in modern design. -It comes with the following features: - -- Chameleon feature with brightness. -- High-contrast compatibility. -- Graphics source provided in SVG. - -Directory Structure -------------------- - -CSS parts: -- **editor.css**: the main CSS file. It's simply loading several other files, for easier maintenance, -- **mainui.css**: the file contains styles of entire editor outline structures, -- **toolbar.css**: the file contains styles of the editor toolbar space (top), -- **richcombo.css**: the file contains styles of the rich combo ui elements on toolbar, -- **panel.css**: the file contains styles of the rich combo drop-down, it's not loaded -until the first panel open up, -- **elementspath.css**: the file contains styles of the editor elements path bar (bottom), -- **menu.css**: the file contains styles of all editor menus including context menu and button drop-down, -it's not loaded until the first menu open up, -- **dialog.css**: the CSS files for the dialog UI, it's not loaded until the first dialog open, -- **reset.css**: the file defines the basis of style resets among all editor UI spaces, -- **preset.css**: the file defines the default styles of some UI elements reflecting the skin preference, -- **editor_XYZ.css** and **dialog_XYZ.css**: browser specific CSS hacks. - -Other parts: -- **skin.js**: the only JavaScript part of the skin that registers the skin, its browser specific files and its icons and defines the Chameleon feature, -- **images/**: contains a fill general used images, -- **dev/**: contains SVG and PNG source of the skin icons. - -License -------- - -Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. - -For licensing, see LICENSE.md or [http://ckeditor.com/license](http://ckeditor.com/license) diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/styles.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/styles.js deleted file mode 100755 index cc4cc081..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/ckeditor/styles.js +++ /dev/null @@ -1,137 +0,0 @@ -/** - * Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. - * For licensing, see LICENSE.md or http://ckeditor.com/license - */ - -// This file contains style definitions that can be used by CKEditor plugins. -// -// The most common use for it is the "stylescombo" plugin which shows the Styles drop-down -// list containing all styles in the editor toolbar. Other plugins, like -// the "div" plugin, use a subset of the styles for their features. -// -// If you do not have plugins that depend on this file in your editor build, you can simply -// ignore it. Otherwise it is strongly recommended to customize this file to match your -// website requirements and design properly. -// -// For more information refer to: http://docs.ckeditor.com/#!/guide/dev_styles-section-style-rules - -CKEDITOR.stylesSet.add( 'default', [ - /* Block styles */ - - // These styles are already available in the "Format" drop-down list ("format" plugin), - // so they are not needed here by default. You may enable them to avoid - // placing the "Format" combo in the toolbar, maintaining the same features. - /* - { name: 'Paragraph', element: 'p' }, - { name: 'Heading 1', element: 'h1' }, - { name: 'Heading 2', element: 'h2' }, - { name: 'Heading 3', element: 'h3' }, - { name: 'Heading 4', element: 'h4' }, - { name: 'Heading 5', element: 'h5' }, - { name: 'Heading 6', element: 'h6' }, - { name: 'Preformatted Text',element: 'pre' }, - { name: 'Address', element: 'address' }, - */ - - { name: 'Italic Title', element: 'h2', styles: { 'font-style': 'italic' } }, - { name: 'Subtitle', element: 'h3', styles: { 'color': '#aaa', 'font-style': 'italic' } }, - { - name: 'Special Container', - element: 'div', - styles: { - padding: '5px 10px', - background: '#eee', - border: '1px solid #ccc' - } - }, - - /* Inline styles */ - - // These are core styles available as toolbar buttons. You may opt enabling - // some of them in the Styles drop-down list, removing them from the toolbar. - // (This requires the "stylescombo" plugin.) - /* - { name: 'Strong', element: 'strong', overrides: 'b' }, - { name: 'Emphasis', element: 'em' , overrides: 'i' }, - { name: 'Underline', element: 'u' }, - { name: 'Strikethrough', element: 'strike' }, - { name: 'Subscript', element: 'sub' }, - { name: 'Superscript', element: 'sup' }, - */ - - { name: 'Marker', element: 'span', attributes: { 'class': 'marker' } }, - - { name: 'Big', element: 'big' }, - { name: 'Small', element: 'small' }, - { name: 'Typewriter', element: 'tt' }, - - { name: 'Computer Code', element: 'code' }, - { name: 'Keyboard Phrase', element: 'kbd' }, - { name: 'Sample Text', element: 'samp' }, - { name: 'Variable', element: 'var' }, - - { name: 'Deleted Text', element: 'del' }, - { name: 'Inserted Text', element: 'ins' }, - - { name: 'Cited Work', element: 'cite' }, - { name: 'Inline Quotation', element: 'q' }, - - { name: 'Language: RTL', element: 'span', attributes: { 'dir': 'rtl' } }, - { name: 'Language: LTR', element: 'span', attributes: { 'dir': 'ltr' } }, - - /* Object styles */ - - { - name: 'Styled Image (left)', - element: 'img', - attributes: { 'class': 'left' } - }, - - { - name: 'Styled Image (right)', - element: 'img', - attributes: { 'class': 'right' } - }, - - { - name: 'Compact Table', - element: 'table', - attributes: { - cellpadding: '5', - cellspacing: '0', - border: '1', - bordercolor: '#ccc' - }, - styles: { - 'border-collapse': 'collapse' - } - }, - - { name: 'Borderless Table', element: 'table', styles: { 'border-style': 'hidden', 'background-color': '#E6E6FA' } }, - { name: 'Square Bulleted List', element: 'ul', styles: { 'list-style-type': 'square' } }, - - /* Widget styles */ - - { name: 'Clean Image', type: 'widget', widget: 'image', attributes: { 'class': 'image-clean' } }, - { name: 'Grayscale Image', type: 'widget', widget: 'image', attributes: { 'class': 'image-grayscale' } }, - - { name: 'Featured Snippet', type: 'widget', widget: 'codeSnippet', attributes: { 'class': 'code-featured' } }, - - { name: 'Featured Formula', type: 'widget', widget: 'mathjax', attributes: { 'class': 'math-featured' } }, - - { name: '240p', type: 'widget', widget: 'embedSemantic', attributes: { 'class': 'embed-240p' }, group: 'size' }, - { name: '360p', type: 'widget', widget: 'embedSemantic', attributes: { 'class': 'embed-360p' }, group: 'size' }, - { name: '480p', type: 'widget', widget: 'embedSemantic', attributes: { 'class': 'embed-480p' }, group: 'size' }, - { name: '720p', type: 'widget', widget: 'embedSemantic', attributes: { 'class': 'embed-720p' }, group: 'size' }, - { name: '1080p', type: 'widget', widget: 'embedSemantic', attributes: { 'class': 'embed-1080p' }, group: 'size' }, - - // Adding space after the style name is an intended workaround. For now, there - // is no option to create two styles with the same name for different widget types. See #16664. - { name: '240p ', type: 'widget', widget: 'embed', attributes: { 'class': 'embed-240p' }, group: 'size' }, - { name: '360p ', type: 'widget', widget: 'embed', attributes: { 'class': 'embed-360p' }, group: 'size' }, - { name: '480p ', type: 'widget', widget: 'embed', attributes: { 'class': 'embed-480p' }, group: 'size' }, - { name: '720p ', type: 'widget', widget: 'embed', attributes: { 'class': 'embed-720p' }, group: 'size' }, - { name: '1080p ', type: 'widget', widget: 'embed', attributes: { 'class': 'embed-1080p' }, group: 'size' } - -] ); - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/app.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/app.css deleted file mode 100755 index 0eb96cfe..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/app.css +++ /dev/null @@ -1,11581 +0,0 @@ -/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */ - -/* Document - ========================================================================== */ - -/** - * 1. Correct the line height in all browsers. - * 2. Prevent adjustments of font size after orientation changes in iOS. - */ - -html { - line-height: 1.15; /* 1 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/* Sections - ========================================================================== */ - -/** - * Remove the margin in all browsers. - */ - -body { - margin: 0; -} - -/** - * Correct the font size and margin on `h1` elements within `section` and - * `article` contexts in Chrome, Firefox, and Safari. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -/* Grouping content - ========================================================================== */ - -/** - * 1. Add the correct box sizing in Firefox. - * 2. Show the overflow in Edge and IE. - */ - -hr { - -webkit-box-sizing: content-box; - box-sizing: content-box; /* 1 */ - height: 0; /* 1 */ - overflow: visible; /* 2 */ -} - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - -pre { - font-family: monospace, monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/* Text-level semantics - ========================================================================== */ - -/** - * Remove the gray background on active links in IE 10. - */ - -a { - background-color: transparent; -} - -/** - * 1. Remove the bottom border in Chrome 57- - * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. - */ - -abbr[title] { - border-bottom: none; /* 1 */ - text-decoration: underline; /* 2 */ - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; /* 2 */ -} - -/** - * Add the correct font weight in Chrome, Edge, and Safari. - */ - -b, -strong { - font-weight: bolder; -} - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - -code, -kbd, -samp { - font-family: monospace, monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/** - * Add the correct font size in all browsers. - */ - -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` elements from affecting the line height in - * all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* Embedded content - ========================================================================== */ - -/** - * Remove the border on images inside links in IE 10. - */ - -img { - border-style: none; -} - -/* Forms - ========================================================================== */ - -/** - * 1. Change the font styles in all browsers. - * 2. Remove the margin in Firefox and Safari. - */ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; /* 1 */ - font-size: 100%; /* 1 */ - line-height: 1.15; /* 1 */ - margin: 0; /* 2 */ -} - -/** - * Show the overflow in IE. - * 1. Show the overflow in Edge. - */ - -button, -input { /* 1 */ - overflow: visible; -} - -/** - * Remove the inheritance of text transform in Edge, Firefox, and IE. - * 1. Remove the inheritance of text transform in Firefox. - */ - -button, -select { /* 1 */ - text-transform: none; -} - -/** - * Correct the inability to style clickable types in iOS and Safari. - */ - -button, -[type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: button; -} - -/** - * Remove the inner border and padding in Firefox. - */ - -button::-moz-focus-inner, -[type="button"]::-moz-focus-inner, -[type="reset"]::-moz-focus-inner, -[type="submit"]::-moz-focus-inner { - border-style: none; - padding: 0; -} - -/** - * Restore the focus styles unset by the previous rule. - */ - -button:-moz-focusring, -[type="button"]:-moz-focusring, -[type="reset"]:-moz-focusring, -[type="submit"]:-moz-focusring { - outline: 1px dotted ButtonText; -} - -/** - * Correct the padding in Firefox. - */ - -fieldset { - padding: 0.35em 0.75em 0.625em; -} - -/** - * 1. Correct the text wrapping in Edge and IE. - * 2. Correct the color inheritance from `fieldset` elements in IE. - * 3. Remove the padding so developers are not caught out when they zero out - * `fieldset` elements in all browsers. - */ - -legend { - -webkit-box-sizing: border-box; - box-sizing: border-box; /* 1 */ - color: inherit; /* 2 */ - display: table; /* 1 */ - max-width: 100%; /* 1 */ - padding: 0; /* 3 */ - white-space: normal; /* 1 */ -} - -/** - * Add the correct vertical alignment in Chrome, Firefox, and Opera. - */ - -progress { - vertical-align: baseline; -} - -/** - * Remove the default vertical scrollbar in IE 10+. - */ - -textarea { - overflow: auto; -} - -/** - * 1. Add the correct box sizing in IE 10. - * 2. Remove the padding in IE 10. - */ - -[type="checkbox"], -[type="radio"] { - -webkit-box-sizing: border-box; - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Correct the cursor style of increment and decrement buttons in Chrome. - */ - -[type="number"]::-webkit-inner-spin-button, -[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -/** - * 1. Correct the odd appearance in Chrome and Safari. - * 2. Correct the outline style in Safari. - */ - -[type="search"] { - -webkit-appearance: textfield; /* 1 */ - outline-offset: -2px; /* 2 */ -} - -/** - * Remove the inner padding in Chrome and Safari on macOS. - */ - -[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * 1. Correct the inability to style clickable types in iOS and Safari. - * 2. Change font properties to `inherit` in Safari. - */ - -::-webkit-file-upload-button { - -webkit-appearance: button; /* 1 */ - font: inherit; /* 2 */ -} - -/* Interactive - ========================================================================== */ - -/* - * Add the correct display in Edge, IE 10+, and Firefox. - */ - -details { - display: block; -} - -/* - * Add the correct display in all browsers. - */ - -summary { - display: list-item; -} - -/* Misc - ========================================================================== */ - -/** - * Add the correct display in IE 10+. - */ - -template { - display: none; -} - -/** - * Add the correct display in IE 10. - */ - -[hidden] { - display: none; -} - -/*! jQuery UI - v1.10.3 - 2013-11-25 -* http://jqueryui.com -* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.autocomplete.css, jquery.ui.menu.css, jquery.ui.theme.css -* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */ - -/* Layout helpers -----------------------------------*/ -.ui-helper-hidden { - display: none; -} -.ui-helper-hidden-accessible { - border: 0; - clip: rect(0 0 0 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; -} -.ui-helper-reset { - margin: 0; - padding: 0; - border: 0; - outline: 0; - line-height: 1.3; - text-decoration: none; - font-size: 100%; - list-style: none; -} -.ui-helper-clearfix:before, -.ui-helper-clearfix:after { - content: ""; - display: table; - border-collapse: collapse; -} -.ui-helper-clearfix:after { - clear: both; -} -.ui-helper-clearfix { - min-height: 0; /* support: IE7 */ -} -.ui-helper-zfix { - width: 100%; - height: 100%; - top: 0; - left: 0; - position: absolute; - opacity: 0; - filter:Alpha(Opacity=0); -} - -.ui-front { - z-index: 100; -} - - -/* Interaction Cues -----------------------------------*/ -.ui-state-disabled { - cursor: default !important; -} - - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { - display: block; - text-indent: -99999px; - overflow: hidden; - background-repeat: no-repeat; -} - - -/* Misc visuals -----------------------------------*/ - -/* Overlays */ -.ui-widget-overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; -} -.ui-resizable { - position: relative; -} -.ui-resizable-handle { - position: absolute; - font-size: 0.1px; - display: block; -} -.ui-resizable-disabled .ui-resizable-handle, -.ui-resizable-autohide .ui-resizable-handle { - display: none; -} -.ui-resizable-n { - cursor: n-resize; - height: 7px; - width: 100%; - top: -5px; - left: 0; -} -.ui-resizable-s { - cursor: s-resize; - height: 7px; - width: 100%; - bottom: -5px; - left: 0; -} -.ui-resizable-e { - cursor: e-resize; - width: 7px; - right: -5px; - top: 0; - height: 100%; -} -.ui-resizable-w { - cursor: w-resize; - width: 7px; - left: -5px; - top: 0; - height: 100%; -} -.ui-resizable-se { - cursor: se-resize; - width: 12px; - height: 12px; - right: 1px; - bottom: 1px; -} -.ui-resizable-sw { - cursor: sw-resize; - width: 9px; - height: 9px; - left: -5px; - bottom: -5px; -} -.ui-resizable-nw { - cursor: nw-resize; - width: 9px; - height: 9px; - left: -5px; - top: -5px; -} -.ui-resizable-ne { - cursor: ne-resize; - width: 9px; - height: 9px; - right: -5px; - top: -5px; -} -.ui-selectable-helper { - position: absolute; - z-index: 100; - border: 1px dotted black; -} -.ui-autocomplete { - position: absolute; - top: 0; - left: 0; - cursor: default; -} -.ui-menu { - list-style: none; - padding: 2px; - margin: 0; - display: block; - outline: none; -} -.ui-menu .ui-menu { - margin-top: -3px; - position: absolute; -} -.ui-menu .ui-menu-item { - margin: 0; - padding: 0; - width: 100%; - /* support: IE10, see #8844 */ - list-style-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); -} -.ui-menu .ui-menu-divider { - margin: 5px -2px 5px -2px; - height: 0; - font-size: 0; - line-height: 0; - border-width: 1px 0 0 0; -} -.ui-menu .ui-menu-item a { - text-decoration: none; - display: block; - padding: 2px .4em; - line-height: 1.5; - min-height: 0; /* support: IE7 */ - font-weight: normal; -} -.ui-menu .ui-menu-item a.ui-state-focus, -.ui-menu .ui-menu-item a.ui-state-active { - font-weight: normal; - margin: -1px; -} - -.ui-menu .ui-state-disabled { - font-weight: normal; - margin: .4em 0 .2em; - line-height: 1.5; -} -.ui-menu .ui-state-disabled a { - cursor: default; -} - -/* icon support */ -.ui-menu-icons { - position: relative; -} -.ui-menu-icons .ui-menu-item a { - position: relative; - padding-left: 2em; -} - -/* left-aligned */ -.ui-menu .ui-icon { - position: absolute; - top: .2em; - left: .2em; -} - -/* right-aligned */ -.ui-menu .ui-menu-icon { - position: static; - float: right; -} - -/* Component containers -----------------------------------*/ -.ui-widget { - font-family: Verdana,Arial,sans-serif; - font-size: 1.1em; -} -.ui-widget .ui-widget { - font-size: 1em; -} -.ui-widget input, -.ui-widget select, -.ui-widget textarea, -.ui-widget button { - font-family: Verdana,Arial,sans-serif; - font-size: 1em; -} -.ui-widget-content { - border: 1px solid #aaaaaa; - /*background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;*/ - background: #ffffff; - color: #222222; -} -.ui-widget-content a { - color: #222222; -} -.ui-widget-header { - border: 1px solid #aaaaaa; - /*background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;*/ - background: #cccccc; - color: #222222; - font-weight: bold; -} -.ui-widget-header a { - color: #222222; -} - -/* Interaction states -----------------------------------*/ -.ui-state-default, -.ui-widget-content .ui-state-default, -.ui-widget-header .ui-state-default { - border: 1px solid #ccc; - /*background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;*/ - background: #eee; - font-weight: normal; - color: #555555; -} -.ui-state-default a, -.ui-state-default a:link, -.ui-state-default a:visited { - color: #555555; - text-decoration: none; -} -.ui-state-hover, -.ui-widget-content .ui-state-hover, -.ui-widget-header .ui-state-hover, -.ui-state-focus, -.ui-widget-content .ui-state-focus, -.ui-widget-header .ui-state-focus { - border: 1px solid #ccc; -/* background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;*/ - background: #eee; - font-weight: normal; - color: #212121; -} -.ui-state-hover a, -.ui-state-hover a:hover, -.ui-state-hover a:link, -.ui-state-hover a:visited { - color: #212121; - text-decoration: none; -} -.ui-state-active, -.ui-widget-content .ui-state-active, -.ui-widget-header .ui-state-active { - border: 1px solid #aaaaaa; - /*background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;*/ - background: #fff; - font-weight: normal; - color: #212121; -} -.ui-state-active a, -.ui-state-active a:link, -.ui-state-active a:visited { - color: #212121; - text-decoration: none; -} - -/* Interaction Cues -----------------------------------*/ -.ui-state-highlight, -.ui-widget-content .ui-state-highlight, -.ui-widget-header .ui-state-highlight { - border: 1px solid #fcefa1; - /*background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;*/ - background: #fbf9ee; - color: #363636; -} -.ui-state-highlight a, -.ui-widget-content .ui-state-highlight a, -.ui-widget-header .ui-state-highlight a { - color: #363636; -} -.ui-state-error, -.ui-widget-content .ui-state-error, -.ui-widget-header .ui-state-error { - border: 1px solid #cd0a0a; - /*background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;*/ - background: #fef1ec; - color: #cd0a0a; -} -.ui-state-error a, -.ui-widget-content .ui-state-error a, -.ui-widget-header .ui-state-error a { - color: #cd0a0a; -} -.ui-state-error-text, -.ui-widget-content .ui-state-error-text, -.ui-widget-header .ui-state-error-text { - color: #cd0a0a; -} -.ui-priority-primary, -.ui-widget-content .ui-priority-primary, -.ui-widget-header .ui-priority-primary { - font-weight: bold; -} -.ui-priority-secondary, -.ui-widget-content .ui-priority-secondary, -.ui-widget-header .ui-priority-secondary { - opacity: .7; - filter:Alpha(Opacity=70); - font-weight: normal; -} -.ui-state-disabled, -.ui-widget-content .ui-state-disabled, -.ui-widget-header .ui-state-disabled { - opacity: .35; - filter:Alpha(Opacity=35); - background-image: none; -} -.ui-state-disabled .ui-icon { - filter:Alpha(Opacity=35); /* For IE8 - See #6059 */ -} - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { - width: 16px; - height: 16px; -} -/* -.ui-icon, -.ui-widget-content .ui-icon { - background-image: url(images/ui-icons_222222_256x240.png); -} -.ui-widget-header .ui-icon { - background-image: url(images/ui-icons_222222_256x240.png); -} -.ui-state-default .ui-icon { - background-image: url(images/ui-icons_888888_256x240.png); -} -.ui-state-hover .ui-icon, -.ui-state-focus .ui-icon { - background-image: url(images/ui-icons_454545_256x240.png); -} -.ui-state-active .ui-icon { - background-image: url(images/ui-icons_454545_256x240.png); -} -.ui-state-highlight .ui-icon { - background-image: url(images/ui-icons_2e83ff_256x240.png); -} -.ui-state-error .ui-icon, -.ui-state-error-text .ui-icon { - background-image: url(images/ui-icons_cd0a0a_256x240.png); -}*/ - -/* positioning */ -/*.ui-icon-blank { background-position: 16px 16px; } -.ui-icon-carat-1-n { background-position: 0 0; } -.ui-icon-carat-1-ne { background-position: -16px 0; } -.ui-icon-carat-1-e { background-position: -32px 0; } -.ui-icon-carat-1-se { background-position: -48px 0; } -.ui-icon-carat-1-s { background-position: -64px 0; } -.ui-icon-carat-1-sw { background-position: -80px 0; } -.ui-icon-carat-1-w { background-position: -96px 0; } -.ui-icon-carat-1-nw { background-position: -112px 0; } -.ui-icon-carat-2-n-s { background-position: -128px 0; } -.ui-icon-carat-2-e-w { background-position: -144px 0; } -.ui-icon-triangle-1-n { background-position: 0 -16px; } -.ui-icon-triangle-1-ne { background-position: -16px -16px; } -.ui-icon-triangle-1-e { background-position: -32px -16px; } -.ui-icon-triangle-1-se { background-position: -48px -16px; } -.ui-icon-triangle-1-s { background-position: -64px -16px; } -.ui-icon-triangle-1-sw { background-position: -80px -16px; } -.ui-icon-triangle-1-w { background-position: -96px -16px; } -.ui-icon-triangle-1-nw { background-position: -112px -16px; } -.ui-icon-triangle-2-n-s { background-position: -128px -16px; } -.ui-icon-triangle-2-e-w { background-position: -144px -16px; } -.ui-icon-arrow-1-n { background-position: 0 -32px; } -.ui-icon-arrow-1-ne { background-position: -16px -32px; } -.ui-icon-arrow-1-e { background-position: -32px -32px; } -.ui-icon-arrow-1-se { background-position: -48px -32px; } -.ui-icon-arrow-1-s { background-position: -64px -32px; } -.ui-icon-arrow-1-sw { background-position: -80px -32px; } -.ui-icon-arrow-1-w { background-position: -96px -32px; } -.ui-icon-arrow-1-nw { background-position: -112px -32px; } -.ui-icon-arrow-2-n-s { background-position: -128px -32px; } -.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } -.ui-icon-arrow-2-e-w { background-position: -160px -32px; } -.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } -.ui-icon-arrowstop-1-n { background-position: -192px -32px; } -.ui-icon-arrowstop-1-e { background-position: -208px -32px; } -.ui-icon-arrowstop-1-s { background-position: -224px -32px; } -.ui-icon-arrowstop-1-w { background-position: -240px -32px; } -.ui-icon-arrowthick-1-n { background-position: 0 -48px; } -.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } -.ui-icon-arrowthick-1-e { background-position: -32px -48px; } -.ui-icon-arrowthick-1-se { background-position: -48px -48px; } -.ui-icon-arrowthick-1-s { background-position: -64px -48px; } -.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } -.ui-icon-arrowthick-1-w { background-position: -96px -48px; } -.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } -.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } -.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } -.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } -.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } -.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } -.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } -.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } -.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } -.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } -.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } -.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } -.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } -.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } -.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } -.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } -.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } -.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } -.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } -.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } -.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } -.ui-icon-arrow-4 { background-position: 0 -80px; } -.ui-icon-arrow-4-diag { background-position: -16px -80px; } -.ui-icon-extlink { background-position: -32px -80px; } -.ui-icon-newwin { background-position: -48px -80px; } -.ui-icon-refresh { background-position: -64px -80px; } -.ui-icon-shuffle { background-position: -80px -80px; } -.ui-icon-transfer-e-w { background-position: -96px -80px; } -.ui-icon-transferthick-e-w { background-position: -112px -80px; } -.ui-icon-folder-collapsed { background-position: 0 -96px; } -.ui-icon-folder-open { background-position: -16px -96px; } -.ui-icon-document { background-position: -32px -96px; } -.ui-icon-document-b { background-position: -48px -96px; } -.ui-icon-note { background-position: -64px -96px; } -.ui-icon-mail-closed { background-position: -80px -96px; } -.ui-icon-mail-open { background-position: -96px -96px; } -.ui-icon-suitcase { background-position: -112px -96px; } -.ui-icon-comment { background-position: -128px -96px; } -.ui-icon-person { background-position: -144px -96px; } -.ui-icon-print { background-position: -160px -96px; } -.ui-icon-trash { background-position: -176px -96px; } -.ui-icon-locked { background-position: -192px -96px; } -.ui-icon-unlocked { background-position: -208px -96px; } -.ui-icon-bookmark { background-position: -224px -96px; } -.ui-icon-tag { background-position: -240px -96px; } -.ui-icon-home { background-position: 0 -112px; } -.ui-icon-flag { background-position: -16px -112px; } -.ui-icon-calendar { background-position: -32px -112px; } -.ui-icon-cart { background-position: -48px -112px; } -.ui-icon-pencil { background-position: -64px -112px; } -.ui-icon-clock { background-position: -80px -112px; } -.ui-icon-disk { background-position: -96px -112px; } -.ui-icon-calculator { background-position: -112px -112px; } -.ui-icon-zoomin { background-position: -128px -112px; } -.ui-icon-zoomout { background-position: -144px -112px; } -.ui-icon-search { background-position: -160px -112px; } -.ui-icon-wrench { background-position: -176px -112px; } -.ui-icon-gear { background-position: -192px -112px; } -.ui-icon-heart { background-position: -208px -112px; } -.ui-icon-star { background-position: -224px -112px; } -.ui-icon-link { background-position: -240px -112px; } -.ui-icon-cancel { background-position: 0 -128px; } -.ui-icon-plus { background-position: -16px -128px; } -.ui-icon-plusthick { background-position: -32px -128px; } -.ui-icon-minus { background-position: -48px -128px; } -.ui-icon-minusthick { background-position: -64px -128px; } -.ui-icon-close { background-position: -80px -128px; } -.ui-icon-closethick { background-position: -96px -128px; } -.ui-icon-key { background-position: -112px -128px; } -.ui-icon-lightbulb { background-position: -128px -128px; } -.ui-icon-scissors { background-position: -144px -128px; } -.ui-icon-clipboard { background-position: -160px -128px; } -.ui-icon-copy { background-position: -176px -128px; } -.ui-icon-contact { background-position: -192px -128px; } -.ui-icon-image { background-position: -208px -128px; } -.ui-icon-video { background-position: -224px -128px; } -.ui-icon-script { background-position: -240px -128px; } -.ui-icon-alert { background-position: 0 -144px; } -.ui-icon-info { background-position: -16px -144px; } -.ui-icon-notice { background-position: -32px -144px; } -.ui-icon-help { background-position: -48px -144px; } -.ui-icon-check { background-position: -64px -144px; } -.ui-icon-bullet { background-position: -80px -144px; } -.ui-icon-radio-on { background-position: -96px -144px; } -.ui-icon-radio-off { background-position: -112px -144px; } -.ui-icon-pin-w { background-position: -128px -144px; } -.ui-icon-pin-s { background-position: -144px -144px; } -.ui-icon-play { background-position: 0 -160px; } -.ui-icon-pause { background-position: -16px -160px; } -.ui-icon-seek-next { background-position: -32px -160px; } -.ui-icon-seek-prev { background-position: -48px -160px; } -.ui-icon-seek-end { background-position: -64px -160px; } -.ui-icon-seek-start { background-position: -80px -160px; } - ui-icon-seek-first is deprecated, use ui-icon-seek-start instead -.ui-icon-seek-first { background-position: -80px -160px; } -.ui-icon-stop { background-position: -96px -160px; } -.ui-icon-eject { background-position: -112px -160px; } -.ui-icon-volume-off { background-position: -128px -160px; } -.ui-icon-volume-on { background-position: -144px -160px; } -.ui-icon-power { background-position: 0 -176px; } -.ui-icon-signal-diag { background-position: -16px -176px; } -.ui-icon-signal { background-position: -32px -176px; } -.ui-icon-battery-0 { background-position: -48px -176px; } -.ui-icon-battery-1 { background-position: -64px -176px; } -.ui-icon-battery-2 { background-position: -80px -176px; } -.ui-icon-battery-3 { background-position: -96px -176px; } -.ui-icon-circle-plus { background-position: 0 -192px; } -.ui-icon-circle-minus { background-position: -16px -192px; } -.ui-icon-circle-close { background-position: -32px -192px; } -.ui-icon-circle-triangle-e { background-position: -48px -192px; } -.ui-icon-circle-triangle-s { background-position: -64px -192px; } -.ui-icon-circle-triangle-w { background-position: -80px -192px; } -.ui-icon-circle-triangle-n { background-position: -96px -192px; } -.ui-icon-circle-arrow-e { background-position: -112px -192px; } -.ui-icon-circle-arrow-s { background-position: -128px -192px; } -.ui-icon-circle-arrow-w { background-position: -144px -192px; } -.ui-icon-circle-arrow-n { background-position: -160px -192px; } -.ui-icon-circle-zoomin { background-position: -176px -192px; } -.ui-icon-circle-zoomout { background-position: -192px -192px; } -.ui-icon-circle-check { background-position: -208px -192px; } -.ui-icon-circlesmall-plus { background-position: 0 -208px; } -.ui-icon-circlesmall-minus { background-position: -16px -208px; } -.ui-icon-circlesmall-close { background-position: -32px -208px; } -.ui-icon-squaresmall-plus { background-position: -48px -208px; } -.ui-icon-squaresmall-minus { background-position: -64px -208px; } -.ui-icon-squaresmall-close { background-position: -80px -208px; } -.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } -.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } -.ui-icon-grip-solid-vertical { background-position: -32px -224px; } -.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } -.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } -.ui-icon-grip-diagonal-se { background-position: -80px -224px; } -*/ - -/* Misc visuals -----------------------------------*/ - -/* Corner radius */ -.ui-corner-all, -.ui-corner-top, -.ui-corner-left, -.ui-corner-tl { - border-top-left-radius: 2px; -} -.ui-corner-all, -.ui-corner-top, -.ui-corner-right, -.ui-corner-tr { - border-top-right-radius: 2px; -} -.ui-corner-all, -.ui-corner-bottom, -.ui-corner-left, -.ui-corner-bl { - border-bottom-left-radius: 2px; -} -.ui-corner-all, -.ui-corner-bottom, -.ui-corner-right, -.ui-corner-br { - border-bottom-right-radius: 2px; -} - -/* Overlays */ -.ui-widget-overlay { - /*background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;*/ - background: #aaa; - opacity: .3; - filter: Alpha(Opacity=30); -} -.ui-widget-shadow { - margin: -8px 0 0 -8px; - padding: 8px; - /*background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;*/ - background: #aaa; - opacity: .3; - filter: Alpha(Opacity=30); - border-radius: 8px; -} - - -@charset "UTF-8"; - -@font-face { - font-family: "rainloop"; - src:url("fonts/rainloop.eot"); - src:url("fonts/rainloop.eot?#iefix") format("embedded-opentype"), - url("fonts/rainloop.woff") format("woff"), - url("fonts/rainloop.ttf") format("truetype"), - url("fonts/rainloop.svg#rainloop") format("svg"); - font-weight: normal; - font-style: normal; - -} - -[data-icon]:before { - font-family: "rainloop" !important; - content: attr(data-icon); - font-style: normal !important; - font-weight: normal !important; - font-variant: normal !important; - text-transform: none !important; - speak: none; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -[class^="icon-"]:before, -[class*=" icon-"]:before { - font-family: "rainloop" !important; - font-style: normal !important; - font-weight: normal !important; - font-variant: normal !important; - text-transform: none !important; - speak: none; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.icon-arrows-in:before { - content: "\e000"; -} -.icon-arrows-out:before { - content: "\e001"; -} -.icon-list:before { - content: "\e002"; -} -.icon-search:before { - content: "\e003"; -} -.icon-user:before { - content: "\e004"; -} -.icon-user-add:before { - content: "\e005"; -} -.icon-tags:before { - content: "\e006"; -} -.icon-paper-plane:before { - content: "\e007"; -} -.icon-reply:before { - content: "\e008"; -} -.icon-reply-all:before { - content: "\e009"; -} -.icon-forward:before { - content: "\e00a"; -} -.icon-info:before { - content: "\e00b"; -} -.icon-right-dir:before { - content: "\e00c"; -} -.icon-down-dir:before { - content: "\e00d"; -} -.icon-image:before { - content: "\e00e"; -} -.icon-print:before { - content: "\e00f"; -} -.icon-calendar:before { - content: "\e010"; -} -.icon-cog:before { - content: "\e011"; -} -.icon-wrench:before { - content: "\e012"; -} -.icon-rocket:before { - content: "\e013"; -} -.icon-fire:before { - content: "\e014"; -} -.icon-purchase:before { - content: "\e015"; -} -.icon-apple:before { - content: "\e016"; -} -.icon-dropbox:before { - content: "\e017"; -} -.icon-skype:before { - content: "\e018"; -} -.icon-creative-commons:before { - content: "\e019"; -} -.icon-ellipsis:before { - content: "\e01a"; -} -.icon-left:before { - content: "\e01b"; -} -.icon-right:before { - content: "\e01c"; -} -.icon-down:before { - content: "\e01d"; -} -.icon-right-mini:before { - content: "\e01e"; -} -.icon-down-mini:before { - content: "\e01f"; -} -.icon-up:before { - content: "\e020"; -} -.icon-star-empty:before { - content: "\e021"; -} -.icon-star:before { - content: "\e022"; -} -.icon-at:before { - content: "\e023"; -} -.icon-list-add:before { - content: "\e024"; -} -.icon-google:before { - content: "\e025"; -} -.icon-google-plus:before { - content: "\e026"; -} -.icon-twitter:before { - content: "\e027"; -} -.icon-youtube:before { - content: "\e028"; -} -.icon-warning:before { - content: "\e029"; -} -.icon-warning-alt:before { - content: "\e02a"; -} -.icon-power:before { - content: "\e02b"; -} -.icon-plus:before { - content: "\e02c"; -} -.icon-ok:before { - content: "\e02d"; -} -.icon-remove:before { - content: "\e02e"; -} -.icon-file:before { - content: "\e02f"; -} -.icon-file-code:before { - content: "\e030"; -} -.icon-file-chart-graph:before { - content: "\e031"; -} -.icon-file-zip:before { - content: "\e032"; -} -.icon-file-music:before { - content: "\e033"; -} -.icon-file-text:before { - content: "\e034"; -} -.icon-file-bookmark:before { - content: "\e035"; -} -.icon-file-image:before { - content: "\e036"; -} -.icon-file-analytics:before { - content: "\e037"; -} -.icon-file-certificate:before { - content: "\e038"; -} -.icon-attachment:before { - content: "\e039"; -} -.icon-file-excel:before { - content: "\e03a"; -} -.icon-file-movie:before { - content: "\e03b"; -} -.icon-folder-add:before { - content: "\e03c"; -} -.icon-folder:before { - content: "\e03d"; -} -.icon-floppy:before { - content: "\e03e"; -} -.icon-eye:before { - content: "\e03f"; -} -.icon-facebook-alt:before { - content: "\e040"; -} -.icon-facebook:before { - content: "\e041"; -} -.icon-bolt:before { - content: "\e042"; -} -.icon-download:before { - content: "\e043"; -} -.icon-upload:before { - content: "\e044"; -} -.icon-popup:before { - content: "\e045"; -} -.icon-github:before { - content: "\e046"; -} -.icon-telephone:before { - content: "\e047"; -} -.icon-mobile:before { - content: "\e048"; -} -.icon-pencil:before { - content: "\e049"; -} -.icon-trash:before { - content: "\e04a"; -} -.icon-left-middle:before { - content: "\e04b"; -} -.icon-right-middle:before { - content: "\e04c"; -} -.icon-repeat:before { - content: "\e04d"; -} -.icon-key:before { - content: "\e04e"; -} -.icon-lock:before { - content: "\e04f"; -} -.icon-home:before { - content: "\e050"; -} -.icon-address-book:before { - content: "\e051"; -} -.icon-share:before { - content: "\e052"; -} -.icon-suitcase:before { - content: "\e053"; -} -.icon-new-sign:before { - content: "\e054"; -} -.icon-users:before { - content: "\e055"; -} -.icon-earth:before { - content: "\e056"; -} -.icon-mail:before { - content: "\e057"; -} -.icon-checkbox-checked:before { - content: "\e058"; -} -.icon-checkbox-unchecked:before { - content: "\e059"; -} -.icon-checkbox-partial:before { - content: "\e05a"; -} -.icon-radio-checked:before { - content: "\e05b"; -} -.icon-radio-unchecked:before { - content: "\e05c"; -} -.icon-google-drive:before { - content: "\e05d"; -} -.icon-spinner:before { - content: "\e05e"; -} -.icon-archive:before { - content: "\e05f"; -} -.icon-buy-sign:before { - content: "\e060"; -} -.icon-filter:before { - content: "\e061"; -} -.icon-sync:before { - content: "\e062"; -} -.icon-ellipsis-alt:before { - content: "\e063"; -} -.icon-cloud-up:before { - content: "\e064"; -} -.icon-cloud-down:before { - content: "\e065"; -} -.icon-import:before { - content: "\e066"; -} -.icon-export:before { - content: "\e067"; -} -.icon-copy:before { - content: "\e068"; -} -.icon-angry-smiley:before { - content: "\e069"; -} -.icon-happy-smiley:before { - content: "\e06a"; -} -.icon-help:before { - content: "\e06b"; -} -.icon-resize-in:before { - content: "\e06c"; -} -.icon-resize-out:before { - content: "\e06d"; -} -.icon-world:before { - content: "\e06f"; -} -.icon-braille:before { - content: "\e06e"; -} -.icon-play:before { - content: "\e070"; -} -.icon-pause:before { - content: "\e071"; -} -.icon-stop:before { - content: "\e072"; -} -.icon-check-mark-circle-two:before { - content: "\e073"; -} -.icon-laptop:before { - content: "\e075"; -} - -/** initial setup **/ -.nano { -/* - position : relative; - width : 100%; - height : 100%;*/ - overflow : hidden !important; -} - -.nano .content { - position : absolute; - overflow : scroll; - /*overflow-x : hidden;*/ - top : 0; - right : 0; - bottom : 0; - left : 0; - -webkit-overflow-scrolling: touch; -} - -.nano .content .content-wrapper { - height: 100%; -} - -.nano .content::-webkit-scrollbar { - visibility: hidden; -} -.has-scrollbar .content::-webkit-scrollbar { - /*visibility: visible;*/ - visibility: hidden; -} -.nano-visibility-hidden::-webkit-scrollbar { - visibility: hidden; -} - -.nano > .pane { - background : none; - position : absolute; - width : 5px; - right : 0; - top : 1px; - bottom : 1px; - opacity : .01; - filter: alpha(opacity=1); - -webkit-transition : .4s; - -o-transition : .4s; - transition : .4s; - border-radius : 5px; - z-index: 102; - margin : 2px; -} - -.nano > .pane2 { - background : none; - position : absolute; - height : 5px; - right : 1px; - left : 1px; - bottom : 0; - opacity : .01; - filter: alpha(opacity=1); - -webkit-transition : .4s; - -o-transition : .4s; - transition : .4s; - border-radius : 5px; - z-index: 10000; - margin : 2px; -} - -.nano > .pane > .slider { - background-color: #999; - background-color: rgba(0, 0, 0, 0.3); - position : relative; - margin : 0; - border-radius : 3px; - width : 5px; -} - -.nano > .pane2 > .slider2 { - background-color: #999; - background-color: rgba(0, 0, 0, 0.3); - position : relative; - margin : 0; - border-radius : 3px; - height : 5px; -} - -.nano:hover > .pane, .nano:hover > .pane2, .pane.activescroll, .pane2.activescroll, .pane.active, .pane2.active, .pane.flashed, .pane2.flashed { - visibility : visible\9; /* Target only IE7 and IE8 with this hack */ - opacity : 0.99; - filter: alpha(opacity=99); -} - -.nano > .pane:hover, .nano > .pane.active { - background-color: rgba(0, 0, 0, 0.15); -} -.nano > .pane2:hover, .nano > .pane2.active { - background-color: rgba(0, 0, 0, 0.15); -} - -.nano > .pane:hover > .slider, .nano > .pane.active > .slider { - background-color: rgba(0, 0, 0, 0.4); -} -.nano > .pane2:hover > .slider2, .nano > .pane2.active > .slider2 { - background-color: rgba(0, 0, 0, 0.4); -} - -.letterfx{display:inline-block;margin:0;padding:0;-o-transition:all 1s;transition:all 1s;-ms-transition:all 1s;-webkit-transition:all 1s}.letterfx-spin-before{transform:rotate(3600deg);-ms-transform:rotate(3600deg);-webkit-transform:rotate(3600deg)}.letterfx-spin-after{-webkit-transform:none;-ms-transform:none;transform:none}.letterfx-fade-before{opacity:0}.letterfx-grow-before{transform:scale(0,0);-ms-transform:scale(0,0);-webkit-transform:scale(0,0)}.letterfx-grow-after{-webkit-transform:none;-ms-transform:none;transform:none}.letterfx-smear-before{color:transparent;text-shadow:-1px -1px 25px transparent}.letterfx-smear-after{color:inherit;text-shadow:0 0 #333}.letterfx-fall-before{visibility:hidden;transform:scale(3,3);-ms-transform:scale(3,3);-webkit-transform:scale(3,3)}.letterfx-fall-after{transform:scale(1,1);-ms-transform:scale(1,1);-webkit-transform:scale(1,1);text-shadow:0}.letterfx-swirl-before{visibility:hidden;transform:scale(3,3) rotate(3600deg);-ms-transform:scale(3,3) rotate(3600deg);-webkit-transform:scale(3,3) rotate(3600deg)}.letterfx-swirl-after{-webkit-transform:none;-ms-transform:none;transform:none; text-shadow:0}.letterfx-wave-container .letterfx{position:relative}.letterfx-wave-before{bottom:0}.letterfx-wave-after{bottom:15px}.letterfx-fly-left-container .letterfx,.letterfx-fly-right-container .letterfx,.letterfx-fly-top-container .letterfx,.letterfx-fly-bottom-container .letterfx{position:relative}.letterfx-fly-left-before{left:-50em}.letterfx-fly-left-after{left:0}.letterfx-fly-right-before{right:-50em}.letterfx-fly-right-after{right:0}.letterfx-fly-top-before{top:-20em}.letterfx-fly-top-after{top:0}.letterfx-fly-bottom-before{bottom:-20em}.letterfx-fly-bottom-after{bottom:0} -.inputosaurus-container { - background-color:#fff; - border:1px solid #bcbec0; - margin:0 5px 0 0; - padding:0 3px; - display : inline-block; - cursor:text; - font-size : 14px; - font-family : "Helvetica Neue", Helvetica, Arial, sans-serif; -} -.inputosaurus-container li { - display : block; - float : left; - overflow: hidden; - margin : 2px 2px 0; - padding : 2px 3px; - white-space : nowrap; - overflow : hidden; - text-overflow:ellipsis; - -o-text-overflow:ellipsis; - -ms-text-overflow:ellipsis; - background-color:#e5eff7; - border:#a9cae4 solid 1px; - border-radius:2px; - color:#5b9bcd; - -webkit-box-shadow: 0 1px 0 rgba(255,255,255,0.75) inset; - box-shadow: 0 1px 0 rgba(255,255,255,0.75) inset; - line-height : 20px; - cursor: default; -} -.inputosaurus-container li.inputosaurus-selected { background-color:#bdd6eb; } -.inputosaurus-container li a { - font-size:16px; - color:#5b9bcd; - padding : 1px; - text-decoration : none; - outline : none; -} -.inputosaurus-container .inputosaurus-input { - border:none; - -webkit-box-shadow: none; - box-shadow: none; - background-color:#fff; - margin-top : 3px; -} -.inputosaurus-container .inputosaurus-input input { - border:none; - height : 23px; - font-size : 14px; - line-height : 20px; - color : #555; - margin : 0; - outline : none; - padding : 0 0 1px 1px; - width : 25px; - -webkit-box-shadow:none; - box-shadow:none; -} -.inputosaurus-container .inputosaurus-input input:hover { - -webkit-box-shadow:none; - box-shadow:none; -} -.inputosaurus-input-hidden { display:none; } - -.flag-wrapper { - width: 24px; - height: 16px; - display: inline-block; -} - -.flag { - width: 16px; - height: 11px; - display: inline-block; - background: url(flags.png) no-repeat; -} - -.flag.flag-en {background-position: -144px -154px} -.flag.flag-en_us {background-position: -144px -154px} -.flag.flag-en_gb {background-position: -176px -44px} -.flag.flag-en_uk {background-position: -176px -44px} -.flag.flag-en_ca {background-position: -48px -22px} -.flag.flag-el_gr {background-position: -112px -55px} -.flag.flag-uk_ua {background-position: -96px -154px} -.flag.flag-ru_ru {background-position: -224px -121px} -.flag.flag-pt_br {background-position: -192px -11px} -.flag.flag-pl_pl {background-position: -32px -121px} -.flag.flag-nl_nl {background-position: -80px -110px} -.flag.flag-nb_no {background-position: -96px -110px} -.flag.flag-it_it {background-position: -208px -66px} -.flag.flag-de_de {background-position: -80px -33px} -.flag.flag-ro_ro {background-position: -192px -121px} -.flag.flag-fi_fi {background-position: -64px -44px} -.flag.flag-fr_fr {background-position: -144px -44px} -.flag.flag-fr_ca {background-position: -144px -44px} -.flag.flag-pt_pt {background-position: -112px -121px} -.flag.flag-pt_br {background-position: -192px -11px} -.flag.flag-ar_sa {background-position: 0 -132px} -.flag.flag-bg_bg {background-position: -80px -11px} -.flag.flag-es_es {background-position: -16px -44px} -.flag.flag-es_la {background-position: -16px -44px} -.flag.flag-et_ee {background-position: -192px -33px} -.flag.flag-fa_ir {background-position: -176px -66px} -.flag.flag-lt_lt {background-position: -80px -88px} -.flag.flag-lv_lv {background-position: -112px -88px} -.flag.flag-is_is {background-position: -192px -66px} -.flag.flag-hu_hu {background-position: -32px -66px} -.flag.flag-ko_kr {background-position: -144px -77px} -.flag.flag-ja_jp {background-position: -16px -77px} -.flag.flag-sl_si {background-position: -128px -132px} -.flag.flag-sk_sk {background-position: -144px -132px} -.flag.flag-tr_tr {background-position: -16px -154px} -.flag.flag-sv_se {background-position: -80px -132px} -.flag.flag-cs_cz {background-position: -64px -33px} -.flag.flag-zh_cn {background-position: -208px -22px} -.flag.flag-zh_tw {background-position: -64px -154px} -.flag.flag-zh_hk {background-position: -208px -22px} -.flag.flag-da_dk {background-position: -112px -33px} -.flag.flag-id_id {background-position: -64px -66px} - -.opentip-container, -.opentip-container * { - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -.opentip-container { - position: absolute; - max-width: 300px; - z-index: 100; - -webkit-transition: -webkit-transform 1s ease-in-out; - -o-transition: -o-transform 1s ease-in-out; - transition: -webkit-transform 1s ease-in-out; - -o-transition: transform 1s ease-in-out; - transition: transform 1s ease-in-out; - transition: transform 1s ease-in-out, -webkit-transform 1s ease-in-out; - pointer-events: none; - -webkit-transform: translateX(0) translateY(0); - -ms-transform: translateX(0) translateY(0); - transform: translateX(0) translateY(0); -} -.opentip-container.ot-fixed.ot-hidden.stem-top.stem-center, -.opentip-container.ot-fixed.ot-going-to-show.stem-top.stem-center, -.opentip-container.ot-fixed.ot-hiding.stem-top.stem-center { - -webkit-transform: translateY(-5px); - -ms-transform: translateY(-5px); - transform: translateY(-5px); -} -.opentip-container.ot-fixed.ot-hidden.stem-top.stem-right, -.opentip-container.ot-fixed.ot-going-to-show.stem-top.stem-right, -.opentip-container.ot-fixed.ot-hiding.stem-top.stem-right { - -webkit-transform: translateY(-5px) translateX(5px); - -ms-transform: translateY(-5px) translateX(5px); - transform: translateY(-5px) translateX(5px); -} -.opentip-container.ot-fixed.ot-hidden.stem-middle.stem-right, -.opentip-container.ot-fixed.ot-going-to-show.stem-middle.stem-right, -.opentip-container.ot-fixed.ot-hiding.stem-middle.stem-right { - -webkit-transform: translateX(5px); - -ms-transform: translateX(5px); - transform: translateX(5px); -} -.opentip-container.ot-fixed.ot-hidden.stem-bottom.stem-right, -.opentip-container.ot-fixed.ot-going-to-show.stem-bottom.stem-right, -.opentip-container.ot-fixed.ot-hiding.stem-bottom.stem-right { - -webkit-transform: translateY(5px) translateX(5px); - -ms-transform: translateY(5px) translateX(5px); - transform: translateY(5px) translateX(5px); -} -.opentip-container.ot-fixed.ot-hidden.stem-bottom.stem-center, -.opentip-container.ot-fixed.ot-going-to-show.stem-bottom.stem-center, -.opentip-container.ot-fixed.ot-hiding.stem-bottom.stem-center { - -webkit-transform: translateY(5px); - -ms-transform: translateY(5px); - transform: translateY(5px); -} -.opentip-container.ot-fixed.ot-hidden.stem-bottom.stem-left, -.opentip-container.ot-fixed.ot-going-to-show.stem-bottom.stem-left, -.opentip-container.ot-fixed.ot-hiding.stem-bottom.stem-left { - -webkit-transform: translateY(5px) translateX(-5px); - -ms-transform: translateY(5px) translateX(-5px); - transform: translateY(5px) translateX(-5px); -} -.opentip-container.ot-fixed.ot-hidden.stem-middle.stem-left, -.opentip-container.ot-fixed.ot-going-to-show.stem-middle.stem-left, -.opentip-container.ot-fixed.ot-hiding.stem-middle.stem-left { - -webkit-transform: translateX(-5px); - -ms-transform: translateX(-5px); - transform: translateX(-5px); -} -.opentip-container.ot-fixed.ot-hidden.stem-top.stem-left, -.opentip-container.ot-fixed.ot-going-to-show.stem-top.stem-left, -.opentip-container.ot-fixed.ot-hiding.stem-top.stem-left { - -webkit-transform: translateY(-5px) translateX(-5px); - -ms-transform: translateY(-5px) translateX(-5px); - transform: translateY(-5px) translateX(-5px); -} -.opentip-container.ot-fixed .opentip { - pointer-events: auto; -} -.opentip-container.ot-hidden { - display: none; -} -.opentip-container .opentip { - position: relative; - font-size: 13px; - line-height: 120%; - padding: 9px 14px; - color: #4f4b47; - text-shadow: -1px -1px 0px rgba(255,255,255,0.2); -} -.opentip-container .opentip .header { - margin: 0; - padding: 0; -} -.opentip-container .opentip .ot-close { - pointer-events: auto; - display: block; - position: absolute; - top: -12px; - left: 60px; - color: rgba(0,0,0,0.5); - background: rgba(0,0,0,0); - text-decoration: none; -} -.opentip-container .opentip .ot-close span { - display: none; -} -.opentip-container .opentip .ot-loading-indicator { - display: none; -} -.opentip-container.ot-loading .ot-loading-indicator { - width: 30px; - height: 30px; - font-size: 30px; - line-height: 30px; - font-weight: bold; - display: block; -} -.opentip-container.ot-loading .ot-loading-indicator span { - display: block; - -webkit-animation: otloading 2s linear infinite; - animation: otloading 2s linear infinite; - text-align: center; -} -.opentip-container.style-dark .opentip, -.opentip-container.style-alert .opentip { - color: #f8f8f8; - text-shadow: 1px 1px 0px rgba(0,0,0,0.2); -} -.opentip-container.style-glass .opentip { - padding: 15px 25px; - color: #317cc5; - text-shadow: 1px 1px 8px rgba(0,94,153,0.3); -} -.opentip-container.ot-hide-effect-fade { - -webkit-transition: -webkit-transform 0.5s ease-in-out, opacity 1s ease-in-out; - -o-transition: -o-transform 0.5s ease-in-out, opacity 1s ease-in-out; - -webkit-transition: opacity 1s ease-in-out, -webkit-transform 0.5s ease-in-out; - transition: opacity 1s ease-in-out, -webkit-transform 0.5s ease-in-out; - -o-transition: transform 0.5s ease-in-out, opacity 1s ease-in-out; - transition: transform 0.5s ease-in-out, opacity 1s ease-in-out; - transition: transform 0.5s ease-in-out, opacity 1s ease-in-out, -webkit-transform 0.5s ease-in-out; - opacity: 1; - -ms-filter: none; - -webkit-filter: none; - filter: none; -} -.opentip-container.ot-hide-effect-fade.ot-hiding { - opacity: 0; - filter: alpha(opacity=0); - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; -} -.opentip-container.ot-show-effect-appear.ot-going-to-show, -.opentip-container.ot-show-effect-appear.ot-showing { - -webkit-transition: -webkit-transform 0.5s ease-in-out, opacity 1s ease-in-out; - -o-transition: -o-transform 0.5s ease-in-out, opacity 1s ease-in-out; - -webkit-transition: opacity 1s ease-in-out, -webkit-transform 0.5s ease-in-out; - transition: opacity 1s ease-in-out, -webkit-transform 0.5s ease-in-out; - -o-transition: transform 0.5s ease-in-out, opacity 1s ease-in-out; - transition: transform 0.5s ease-in-out, opacity 1s ease-in-out; - transition: transform 0.5s ease-in-out, opacity 1s ease-in-out, -webkit-transform 0.5s ease-in-out; -} -.opentip-container.ot-show-effect-appear.ot-going-to-show { - opacity: 0; - filter: alpha(opacity=0); - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; -} -.opentip-container.ot-show-effect-appear.ot-showing { - opacity: 1; - -ms-filter: none; - -webkit-filter: none; - filter: none; -} -.opentip-container.ot-show-effect-appear.ot-visible { - opacity: 1; - -ms-filter: none; - -webkit-filter: none; - filter: none; -} -@-webkit-keyframes otloading { - 0% { - -webkit-transform: rotate(0deg); - -ms-transform: rotate(0deg); - transform: rotate(0deg); - } - - 100% { - -webkit-transform: rotate(360deg); - -ms-transform: rotate(360deg); - transform: rotate(360deg); - } -} -@keyframes otloading { - 0% { - -webkit-transform: rotate(0deg); - -ms-transform: rotate(0deg); - transform: rotate(0deg); - } - - 100% { - -webkit-transform: rotate(360deg); - -ms-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -@charset "UTF-8"; - -/*! - * Pikaday - * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ - */ - -.pika-single { - z-index: 9999; - display: block; - position: relative; - color: #333; - background: #fff; - border: 1px solid #ccc; - border-bottom-color: #bbb; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} - -/* -clear child float (pika-lendar), using the famous micro clearfix hack -http://nicolasgallagher.com/micro-clearfix-hack/ -*/ -.pika-single:before, -.pika-single:after { - content: " "; - display: table; -} -.pika-single:after { clear: both } -.pika-single { *zoom: 1 } - -.pika-single.is-hidden { - display: none; -} - -.pika-single.is-bound { - position: absolute; - -webkit-box-shadow: 0 5px 15px -5px rgba(0,0,0,.5); - box-shadow: 0 5px 15px -5px rgba(0,0,0,.5); -} - -.pika-lendar { - float: left; - width: 240px; - margin: 8px; -} - -.pika-title { - position: relative; - text-align: center; -} - -.pika-label { - display: inline-block; - *display: inline; - position: relative; - z-index: 9999; - overflow: hidden; - margin: 0; - padding: 5px 3px; - font-size: 14px; - line-height: 20px; - font-weight: bold; - background-color: #fff; -} -.pika-title select { - cursor: pointer; - position: absolute; - z-index: 9998; - margin: 0; - left: 0; - top: 5px; - filter: alpha(opacity=0); - opacity: 0; -} - -.pika-prev, -.pika-next { - display: block; - cursor: pointer; - position: relative; - outline: none; - border: 0; - padding: 0; - width: 20px; - height: 30px; - /* hide text using text-indent trick, using width value (it's enough) */ - text-indent: 20px; - white-space: nowrap; - overflow: hidden; - background-color: transparent; - background-position: center center; - background-repeat: no-repeat; - background-size: 75% 75%; - opacity: .5; - *position: absolute; - *top: 0; -} - -.pika-prev:hover, -.pika-next:hover { - opacity: 1; -} - -.pika-prev, -.is-rtl .pika-next { - float: left; - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg=='); - *left: 0; -} - -.pika-next, -.is-rtl .pika-prev { - float: right; - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII='); - *right: 0; -} - -.pika-prev.is-disabled, -.pika-next.is-disabled { - cursor: default; - opacity: .2; -} - -.pika-select { - display: inline-block; - *display: inline; -} - -.pika-table { - width: 100%; - border-collapse: collapse; - border-spacing: 0; - border: 0; -} - -.pika-table th, -.pika-table td { - width: 14.285714285714286%; - padding: 0; -} - -.pika-table th { - color: #999; - font-size: 12px; - line-height: 25px; - font-weight: bold; - text-align: center; -} - -.pika-button { - cursor: pointer; - display: block; - -webkit-box-sizing: border-box; - box-sizing: border-box; - -moz-box-sizing: border-box; - outline: none; - border: 0; - margin: 0; - width: 100%; - padding: 5px; - color: #666; - font-size: 12px; - line-height: 15px; - text-align: right; - background: #f5f5f5; -} - -.pika-week { - font-size: 11px; - color: #999; -} - -.is-today .pika-button { - color: #33aaff; - font-weight: bold; -} - -.is-selected .pika-button, -.has-event .pika-button { - color: #fff; - font-weight: bold; - background: #33aaff; - -webkit-box-shadow: inset 0 1px 3px #178fe5; - box-shadow: inset 0 1px 3px #178fe5; - border-radius: 3px; -} - -.has-event .pika-button { - background: #005da9; - -webkit-box-shadow: inset 0 1px 3px #0076c9; - box-shadow: inset 0 1px 3px #0076c9; -} - -.is-disabled .pika-button, -.is-inrange .pika-button { - background: #D5E9F7; -} - -.is-startrange .pika-button { - color: #fff; - background: #6CB31D; - -webkit-box-shadow: none; - box-shadow: none; - border-radius: 3px; -} - -.is-endrange .pika-button { - color: #fff; - background: #33aaff; - -webkit-box-shadow: none; - box-shadow: none; - border-radius: 3px; -} - -.is-disabled .pika-button { - pointer-events: none; - cursor: default; - color: #999; - opacity: .3; -} - -.is-outside-current-month .pika-button { - color: #999; - opacity: .3; -} - -.is-selection-disabled { - pointer-events: none; - cursor: default; -} - -.pika-button:hover, -.pika-row.pick-whole-week:hover .pika-button { - color: #fff; - background: #ff8000; - -webkit-box-shadow: none; - box-shadow: none; - border-radius: 3px; -} - -/* styling for abbr */ -.pika-table abbr { - border-bottom: none; - cursor: help; -} - - -.lg-sub-html,.lg-toolbar{background-color:rgba(0,0,0,.45)}#lg-counter,.lg-outer .lg-video-cont{vertical-align:middle;display:inline-block}@font-face{font-family:lg;src:url(fonts/lg.eot?n1z373);src:url(fonts/lg.eot?#iefixn1z373) format("embedded-opentype"),url(fonts/lg.woff?n1z373) format("woff"),url(fonts/lg.ttf?n1z373) format("truetype"),url(fonts/lg.svg?n1z373#lg) format("svg");font-weight:400;font-style:normal}.lg-icon{font-family:lg;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.lg-actions .lg-next,.lg-actions .lg-prev{background-color:rgba(0,0,0,.45);border-radius:2px;color:#999;cursor:pointer;display:block;font-size:22px;margin-top:-10px;padding:8px 10px 9px;position:absolute;top:50%;z-index:1080}.lg-actions .lg-next.disabled,.lg-actions .lg-prev.disabled{pointer-events:none;opacity:.5}.lg-actions .lg-next:hover,.lg-actions .lg-prev:hover{color:#FFF}.lg-actions .lg-next{right:20px}.lg-actions .lg-next:before{content:"\e095"}.lg-actions .lg-prev{left:20px}.lg-actions .lg-prev:after{content:"\e094"}@-webkit-keyframes lg-right-end{0%,100%{left:0}50%{left:-30px}}@keyframes lg-right-end{0%,100%{left:0}50%{left:-30px}}@-webkit-keyframes lg-left-end{0%,100%{left:0}50%{left:30px}}@keyframes lg-left-end{0%,100%{left:0}50%{left:30px}}.lg-outer.lg-right-end .lg-object{-webkit-animation:lg-right-end .3s;animation:lg-right-end .3s;position:relative}.lg-outer.lg-left-end .lg-object{-webkit-animation:lg-left-end .3s;animation:lg-left-end .3s;position:relative}.lg-toolbar{z-index:1082;left:0;position:absolute;top:0;width:100%}.lg-toolbar .lg-icon{color:#999;cursor:pointer;float:right;font-size:24px;height:47px;line-height:27px;padding:10px 0;text-align:center;width:50px;text-decoration:none!important;outline:0;-webkit-transition:color .2s linear;-o-transition:color .2s linear;transition:color .2s linear}.lg-toolbar .lg-icon:hover{color:#FFF}.lg-toolbar .lg-close:after{content:"\e070"}.lg-toolbar .lg-download:after{content:"\e0f2"}.lg-sub-html{bottom:0;color:#EEE;font-size:16px;left:0;padding:10px 40px;position:fixed;right:0;text-align:center;z-index:1080}.lg-sub-html h4{margin:0;font-size:13px;font-weight:700}.lg-sub-html p{font-size:12px;margin:5px 0 0}#lg-counter{color:#999;font-size:16px;padding-left:20px;padding-top:12px}.lg-next,.lg-prev,.lg-toolbar{opacity:1;-webkit-transition:-webkit-transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;-o-transition:-o-transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;-webkit-transition:opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear,-webkit-transform .35s cubic-bezier(0,0,.25,1) 0s;transition:opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear,-webkit-transform .35s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;transition:transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;transition:transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear,-webkit-transform .35s cubic-bezier(0,0,.25,1) 0s}.lg-hide-items .lg-prev{opacity:0;-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}.lg-hide-items .lg-next{opacity:0;-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}.lg-hide-items .lg-toolbar{opacity:0;-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-object{-webkit-transform:scale3d(.5,.5,.5);transform:scale3d(.5,.5,.5);opacity:0;-webkit-transition:-webkit-transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;-o-transition:-o-transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;-webkit-transition:opacity 250ms cubic-bezier(0,0,.25,1),-webkit-transform 250ms cubic-bezier(0,0,.25,1) 0s!important;transition:opacity 250ms cubic-bezier(0,0,.25,1),-webkit-transform 250ms cubic-bezier(0,0,.25,1) 0s!important;-o-transition:transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;transition:transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;transition:transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1),-webkit-transform 250ms cubic-bezier(0,0,.25,1) 0s!important;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-item.lg-complete .lg-object{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-outer .lg-thumb-outer{background-color:#0D0A0A;bottom:0;position:absolute;width:100%;z-index:1080;max-height:350px;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,.25,1) 0s;-o-transition:-o-transform .25s cubic-bezier(0,0,.25,1) 0s;transition:-webkit-transform .25s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform .25s cubic-bezier(0,0,.25,1) 0s;transition:transform .25s cubic-bezier(0,0,.25,1) 0s;transition:transform .25s cubic-bezier(0,0,.25,1) 0s, -webkit-transform .25s cubic-bezier(0,0,.25,1) 0s}.lg-outer .lg-thumb-outer.lg-grab .lg-thumb-item{cursor:-webkit-grab;cursor:-o-grab;cursor:-ms-grab;cursor:grab}.lg-outer .lg-thumb-outer.lg-grabbing .lg-thumb-item{cursor:move;cursor:-webkit-grabbing;cursor:-o-grabbing;cursor:-ms-grabbing;cursor:grabbing}.lg-outer .lg-thumb-outer.lg-dragging .lg-thumb{-webkit-transition-duration:0s!important;-o-transition-duration:0s!important;transition-duration:0s!important}.lg-outer.lg-thumb-open .lg-thumb-outer{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.lg-outer .lg-thumb{padding:10px 0;height:100%;margin-bottom:-5px}.lg-outer .lg-thumb-item{cursor:pointer;float:left;overflow:hidden;height:100%;border:2px solid #FFF;border-radius:4px;margin-bottom:5px}@media (min-width:1025px){.lg-outer .lg-thumb-item{-webkit-transition:border-color .25s ease;-o-transition:border-color .25s ease;transition:border-color .25s ease}}.lg-outer .lg-thumb-item.active,.lg-outer .lg-thumb-item:hover{border-color:#a90707}.lg-outer .lg-thumb-item img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.lg-outer.lg-has-thumb .lg-item{padding-bottom:120px}.lg-outer.lg-can-toggle .lg-item{padding-bottom:0}.lg-outer.lg-pull-caption-up .lg-sub-html{-webkit-transition:bottom .25s ease;-o-transition:bottom .25s ease;transition:bottom .25s ease}.lg-outer.lg-pull-caption-up.lg-thumb-open .lg-sub-html{bottom:100px}.lg-outer .lg-toogle-thumb{background-color:#0D0A0A;border-radius:2px 2px 0 0;color:#999;cursor:pointer;font-size:24px;height:39px;line-height:27px;padding:5px 0;position:absolute;right:20px;text-align:center;top:-39px;width:50px}.lg-outer .lg-toogle-thumb:after{content:"\e1ff"}.lg-outer .lg-toogle-thumb:hover{color:#FFF}.lg-outer .lg-video-cont{max-width:1140px;max-height:100%;width:100%;padding:0 5px}.lg-outer .lg-video{width:100%;height:0;padding-bottom:56.25%;overflow:hidden;position:relative}.lg-outer .lg-video .lg-object{display:inline-block;position:absolute;top:0;left:0;width:100%!important;height:100%!important}.lg-outer .lg-video .lg-video-play{width:84px;height:59px;position:absolute;left:50%;top:50%;margin-left:-42px;margin-top:-30px;z-index:1080;cursor:pointer}.lg-outer .lg-has-vimeo .lg-video-play{background:url(img/vimeo-play.png) no-repeat}.lg-outer .lg-has-vimeo:hover .lg-video-play{background:url(img/vimeo-play.png) 0 -58px no-repeat}.lg-outer .lg-has-html5 .lg-video-play{background:url(img/video-play.png) no-repeat;height:64px;margin-left:-32px;margin-top:-32px;width:64px;opacity:.8}.lg-outer .lg-has-html5:hover .lg-video-play{opacity:1}.lg-outer .lg-has-youtube .lg-video-play{background:url(img/youtube-play.png) no-repeat}.lg-outer .lg-has-youtube:hover .lg-video-play{background:url(img/youtube-play.png) 0 -60px no-repeat}.lg-outer .lg-video-object{width:100%!important;height:100%!important;position:absolute;top:0;left:0}.lg-outer .lg-has-video .lg-video-object{visibility:hidden}.lg-outer .lg-has-video.lg-video-playing .lg-object,.lg-outer .lg-has-video.lg-video-playing .lg-video-play{display:none}.lg-outer .lg-has-video.lg-video-playing .lg-video-object{visibility:visible}.lg-progress-bar{background-color:#333;height:5px;left:0;position:absolute;top:0;width:100%;z-index:1083;opacity:0;-webkit-transition:opacity 80ms ease 0s;-o-transition:opacity 80ms ease 0s;transition:opacity 80ms ease 0s}.lg-progress-bar .lg-progress{background-color:#a90707;height:5px;width:0}.lg-progress-bar.lg-start .lg-progress{width:100%}.lg-show-autoplay .lg-progress-bar{opacity:1}.lg-autoplay-button:after{content:"\e01d"}.lg-show-autoplay .lg-autoplay-button:after{content:"\e01a"}.lg-outer.lg-css3.lg-zoom-dragging .lg-item.lg-complete.lg-zoomable .lg-image,.lg-outer.lg-css3.lg-zoom-dragging .lg-item.lg-complete.lg-zoomable .lg-img-wrap{-webkit-transition-duration:0s;-o-transition-duration:0s;transition-duration:0s}.lg-outer .lg-item.lg-complete.lg-zoomable .lg-img-wrap{-webkit-transition:left .3s cubic-bezier(0,0,.25,1) 0s,top .3s cubic-bezier(0,0,.25,1) 0s;-o-transition:left .3s cubic-bezier(0,0,.25,1) 0s,top .3s cubic-bezier(0,0,.25,1) 0s;transition:left .3s cubic-bezier(0,0,.25,1) 0s,top .3s cubic-bezier(0,0,.25,1) 0s;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.lg-outer .lg-item.lg-complete.lg-zoomable .lg-image{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);-webkit-transition:-webkit-transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;-o-transition:-o-transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;-webkit-transition:opacity .15s,-webkit-transform .3s cubic-bezier(0,0,.25,1) 0s!important;transition:opacity .15s,-webkit-transform .3s cubic-bezier(0,0,.25,1) 0s!important;-o-transition:transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;transition:transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;transition:transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s,-webkit-transform .3s cubic-bezier(0,0,.25,1) 0s!important;-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-backface-visibility:hidden;backface-visibility:hidden}#lg-zoom-in:after{content:"\e311"}#lg-actual-size{font-size:20px}#lg-actual-size:after{content:"\e033"}#lg-zoom-out{opacity:.5;pointer-events:none}#lg-zoom-out:after{content:"\e312"}.lg-zoomed #lg-zoom-out{opacity:1;pointer-events:auto}.lg-outer .lg-pager-outer{bottom:60px;left:0;position:absolute;right:0;text-align:center;z-index:1080;height:10px}.lg-outer .lg-pager-outer.lg-pager-hover .lg-pager-cont{overflow:visible}.lg-outer .lg-pager-cont{cursor:pointer;display:inline-block;overflow:hidden;position:relative;vertical-align:top;margin:0 5px}.lg-outer .lg-pager-cont:hover .lg-pager-thumb-cont{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.lg-outer .lg-pager-cont.lg-pager-active .lg-pager{-webkit-box-shadow:0 0 0 2px #fff inset;box-shadow:0 0 0 2px #fff inset}.lg-outer .lg-pager-thumb-cont{background-color:#fff;color:#FFF;bottom:100%;height:83px;left:0;margin-bottom:20px;margin-left:-60px;opacity:0;padding:5px;position:absolute;width:120px;border-radius:3px;-webkit-transition:opacity .15s ease 0s,-webkit-transform .15s ease 0s;-o-transition:opacity .15s ease 0s,-o-transform .15s ease 0s;transition:opacity .15s ease 0s,-webkit-transform .15s ease 0s;-o-transition:opacity .15s ease 0s,transform .15s ease 0s;transition:opacity .15s ease 0s,transform .15s ease 0s;transition:opacity .15s ease 0s,transform .15s ease 0s,-webkit-transform .15s ease 0s;-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}.lg-outer .lg-pager-thumb-cont img{width:100%;height:100%}.lg-outer .lg-pager{background-color:rgba(255,255,255,.5);border-radius:50%;-webkit-box-shadow:0 0 0 8px rgba(255,255,255,.7) inset;box-shadow:0 0 0 8px rgba(255,255,255,.7) inset;display:block;height:12px;-webkit-transition:box-shadow .3s ease 0s;-o-transition:box-shadow .3s ease 0s;-webkit-transition:-webkit-box-shadow .3s ease 0s;transition:-webkit-box-shadow .3s ease 0s;transition:box-shadow .3s ease 0s;transition:box-shadow .3s ease 0s, -webkit-box-shadow .3s ease 0s;width:12px}.lg-outer .lg-pager:focus,.lg-outer .lg-pager:hover{-webkit-box-shadow:0 0 0 8px #fff inset;box-shadow:0 0 0 8px #fff inset}.lg-outer .lg-caret{border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px dashed;bottom:-10px;display:inline-block;height:0;left:50%;margin-left:-5px;position:absolute;vertical-align:middle;width:0}.lg-outer,.lg-outer .lg,.lg-outer .lg-inner{width:100%;height:100%}.lg-fullscreen:after{content:"\e20c"}.lg-fullscreen-on .lg-fullscreen:after{content:"\e20d"}.group:after,.group:before{display:table;content:"";line-height:0}.group:after{clear:both}.lg-outer{position:fixed;top:0;left:0;z-index:1050;opacity:0;-webkit-transition:opacity .15s ease 0s;-o-transition:opacity .15s ease 0s;transition:opacity .15s ease 0s}.lg-outer *{-webkit-box-sizing:border-box;box-sizing:border-box}.lg-outer.lg-visible{opacity:1}.lg-outer.lg-css3 .lg-item.lg-current,.lg-outer.lg-css3 .lg-item.lg-next-slide,.lg-outer.lg-css3 .lg-item.lg-prev-slide{-webkit-transition-duration:inherit!important;-o-transition-duration:inherit!important;transition-duration:inherit!important;-webkit-transition-timing-function:inherit!important;-o-transition-timing-function:inherit!important;transition-timing-function:inherit!important}.lg-outer.lg-css3.lg-dragging .lg-item.lg-current,.lg-outer.lg-css3.lg-dragging .lg-item.lg-next-slide,.lg-outer.lg-css3.lg-dragging .lg-item.lg-prev-slide{-webkit-transition-duration:0s!important;-o-transition-duration:0s!important;transition-duration:0s!important;opacity:1}.lg-outer.lg-grab img.lg-object{cursor:-webkit-grab;cursor:-o-grab;cursor:-ms-grab;cursor:grab}.lg-outer.lg-grabbing img.lg-object{cursor:move;cursor:-webkit-grabbing;cursor:-o-grabbing;cursor:-ms-grabbing;cursor:grabbing}.lg-outer .lg{position:relative;overflow:hidden;margin-left:auto;margin-right:auto;max-width:100%;max-height:100%}.lg-outer .lg-inner{position:absolute;left:0;top:0;white-space:nowrap}.lg-outer .lg-item{background:url(img/loading.gif) center center no-repeat;display:none!important}.lg-outer.lg-css .lg-current,.lg-outer.lg-css3 .lg-current,.lg-outer.lg-css3 .lg-next-slide,.lg-outer.lg-css3 .lg-prev-slide{display:inline-block!important}.lg-outer .lg-img-wrap,.lg-outer .lg-item{display:inline-block;text-align:center;position:absolute;width:100%;height:100%}.lg-outer .lg-img-wrap:before,.lg-outer .lg-item:before{content:"";display:inline-block;height:50%;width:1px;margin-right:-1px}.lg-outer .lg-img-wrap{position:absolute;padding:0 5px;left:0;right:0;top:0;bottom:0}.lg-outer .lg-item.lg-complete{background-image:none}.lg-outer .lg-item.lg-current{z-index:1060}.lg-outer .lg-image{display:inline-block;vertical-align:middle;max-width:100%;max-height:100%;width:auto!important;height:auto!important}.lg-outer.lg-show-after-load .lg-item .lg-object,.lg-outer.lg-show-after-load .lg-item .lg-video-play{opacity:0;-webkit-transition:opacity .15s ease 0s;-o-transition:opacity .15s ease 0s;transition:opacity .15s ease 0s}.lg-outer.lg-show-after-load .lg-item.lg-complete .lg-object,.lg-outer.lg-show-after-load .lg-item.lg-complete .lg-video-play{opacity:1}.lg-outer .lg-empty-html,.lg-outer.lg-hide-download #lg-download{display:none}.lg-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;z-index:1040;background-color:#000;opacity:0;-webkit-transition:opacity .15s ease 0s;-o-transition:opacity .15s ease 0s;transition:opacity .15s ease 0s}.lg-backdrop.in{opacity:1}.lg-css3.lg-no-trans .lg-current,.lg-css3.lg-no-trans .lg-next-slide,.lg-css3.lg-no-trans .lg-prev-slide{-webkit-transition:none 0s ease 0s!important;-o-transition:none 0s ease 0s!important;transition:none 0s ease 0s!important}.lg-css3.lg-use-css3 .lg-item,.lg-css3.lg-use-left .lg-item{-webkit-backface-visibility:hidden;backface-visibility:hidden}.lg-css3.lg-fade .lg-item{opacity:0}.lg-css3.lg-fade .lg-item.lg-current{opacity:1}.lg-css3.lg-fade .lg-item.lg-current,.lg-css3.lg-fade .lg-item.lg-next-slide,.lg-css3.lg-fade .lg-item.lg-prev-slide{-webkit-transition:opacity .1s ease 0s;-o-transition:opacity .1s ease 0s;transition:opacity .1s ease 0s}.lg-css3.lg-slide.lg-use-css3 .lg-item{opacity:0}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current,.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide,.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide.lg-use-left .lg-item{opacity:0;position:absolute;left:0}.lg-css3.lg-slide.lg-use-left .lg-item.lg-prev-slide{left:-100%}.lg-css3.lg-slide.lg-use-left .lg-item.lg-next-slide{left:100%}.lg-css3.lg-slide.lg-use-left .lg-item.lg-current{left:0;opacity:1}.lg-css3.lg-slide.lg-use-left .lg-item.lg-current,.lg-css3.lg-slide.lg-use-left .lg-item.lg-next-slide,.lg-css3.lg-slide.lg-use-left .lg-item.lg-prev-slide{-webkit-transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s} -.lg-css3.lg-zoom-in .lg-item{opacity:0}.lg-css3.lg-zoom-in .lg-item.lg-next-slide,.lg-css3.lg-zoom-in .lg-item.lg-prev-slide{-webkit-transform:scale3d(1.3,1.3,1.3);transform:scale3d(1.3,1.3,1.3)}.lg-css3.lg-zoom-in .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-in .lg-item.lg-current,.lg-css3.lg-zoom-in .lg-item.lg-next-slide,.lg-css3.lg-zoom-in .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-zoom-in-big .lg-item{opacity:0}.lg-css3.lg-zoom-in-big .lg-item.lg-next-slide,.lg-css3.lg-zoom-in-big .lg-item.lg-prev-slide{-webkit-transform:scale3d(2,2,2);transform:scale3d(2,2,2)}.lg-css3.lg-zoom-in-big .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-in-big .lg-item.lg-current,.lg-css3.lg-zoom-in-big .lg-item.lg-next-slide,.lg-css3.lg-zoom-in-big .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-zoom-out .lg-item{opacity:0}.lg-css3.lg-zoom-out .lg-item.lg-next-slide,.lg-css3.lg-zoom-out .lg-item.lg-prev-slide{-webkit-transform:scale3d(.7,.7,.7);transform:scale3d(.7,.7,.7)}.lg-css3.lg-zoom-out .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-out .lg-item.lg-current,.lg-css3.lg-zoom-out .lg-item.lg-next-slide,.lg-css3.lg-zoom-out .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-zoom-out-big .lg-item{opacity:0}.lg-css3.lg-zoom-out-big .lg-item.lg-next-slide,.lg-css3.lg-zoom-out-big .lg-item.lg-prev-slide{-webkit-transform:scale3d(0,0,0);transform:scale3d(0,0,0)}.lg-css3.lg-zoom-out-big .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-out-big .lg-item.lg-current,.lg-css3.lg-zoom-out-big .lg-item.lg-next-slide,.lg-css3.lg-zoom-out-big .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-zoom-out-in .lg-item{opacity:0}.lg-css3.lg-zoom-out-in .lg-item.lg-prev-slide{-webkit-transform:scale3d(0,0,0);transform:scale3d(0,0,0)}.lg-css3.lg-zoom-out-in .lg-item.lg-next-slide{-webkit-transform:scale3d(2,2,2);transform:scale3d(2,2,2)}.lg-css3.lg-zoom-out-in .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-out-in .lg-item.lg-current,.lg-css3.lg-zoom-out-in .lg-item.lg-next-slide,.lg-css3.lg-zoom-out-in .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-zoom-in-out .lg-item{opacity:0}.lg-css3.lg-zoom-in-out .lg-item.lg-prev-slide{-webkit-transform:scale3d(2,2,2);transform:scale3d(2,2,2)}.lg-css3.lg-zoom-in-out .lg-item.lg-next-slide{-webkit-transform:scale3d(0,0,0);transform:scale3d(0,0,0)}.lg-css3.lg-zoom-in-out .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-in-out .lg-item.lg-current,.lg-css3.lg-zoom-in-out .lg-item.lg-next-slide,.lg-css3.lg-zoom-in-out .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-soft-zoom .lg-item{opacity:0}.lg-css3.lg-soft-zoom .lg-item.lg-prev-slide{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}.lg-css3.lg-soft-zoom .lg-item.lg-next-slide{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}.lg-css3.lg-soft-zoom .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-soft-zoom .lg-item.lg-current,.lg-css3.lg-soft-zoom .lg-item.lg-next-slide,.lg-css3.lg-soft-zoom .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-scale-up .lg-item{opacity:0}.lg-css3.lg-scale-up .lg-item.lg-next-slide,.lg-css3.lg-scale-up .lg-item.lg-prev-slide{-ms-transform:scale3d(.8,.8,.8) translate3d(0,10%,0);-webkit-transform:scale3d(.8,.8,.8) translate3d(0,10%,0);transform:scale3d(.8,.8,.8) translate3d(0,10%,0)}.lg-css3.lg-scale-up .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-scale-up .lg-item.lg-current,.lg-css3.lg-scale-up .lg-item.lg-next-slide,.lg-css3.lg-scale-up .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular .lg-item{opacity:0}.lg-css3.lg-slide-circular .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(-100%,0,0);-webkit-transform:scale3d(0,0,0) translate3d(-100%,0,0);transform:scale3d(0,0,0) translate3d(-100%,0,0)}.lg-css3.lg-slide-circular .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(100%,0,0);-webkit-transform:scale3d(0,0,0) translate3d(100%,0,0);transform:scale3d(0,0,0) translate3d(100%,0,0)}.lg-css3.lg-slide-circular .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular .lg-item.lg-current,.lg-css3.lg-slide-circular .lg-item.lg-next-slide,.lg-css3.lg-slide-circular .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular-up .lg-item{opacity:0}.lg-css3.lg-slide-circular-up .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(-100%,-100%,0);-webkit-transform:scale3d(0,0,0) translate3d(-100%,-100%,0);transform:scale3d(0,0,0) translate3d(-100%,-100%,0)}.lg-css3.lg-slide-circular-up .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(100%,-100%,0);-webkit-transform:scale3d(0,0,0) translate3d(100%,-100%,0);transform:scale3d(0,0,0) translate3d(100%,-100%,0)}.lg-css3.lg-slide-circular-up .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular-up .lg-item.lg-current,.lg-css3.lg-slide-circular-up .lg-item.lg-next-slide,.lg-css3.lg-slide-circular-up .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular-down .lg-item{opacity:0}.lg-css3.lg-slide-circular-down .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(-100%,100%,0);-webkit-transform:scale3d(0,0,0) translate3d(-100%,100%,0);transform:scale3d(0,0,0) translate3d(-100%,100%,0)}.lg-css3.lg-slide-circular-down .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(100%,100%,0);-webkit-transform:scale3d(0,0,0) translate3d(100%,100%,0);transform:scale3d(0,0,0) translate3d(100%,100%,0)}.lg-css3.lg-slide-circular-down .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular-down .lg-item.lg-current,.lg-css3.lg-slide-circular-down .lg-item.lg-next-slide,.lg-css3.lg-slide-circular-down .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular-vertical .lg-item{opacity:0}.lg-css3.lg-slide-circular-vertical .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(0,-100%,0);-webkit-transform:scale3d(0,0,0) translate3d(0,-100%,0);transform:scale3d(0,0,0) translate3d(0,-100%,0)}.lg-css3.lg-slide-circular-vertical .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(0,100%,0);-webkit-transform:scale3d(0,0,0) translate3d(0,100%,0);transform:scale3d(0,0,0) translate3d(0,100%,0)}.lg-css3.lg-slide-circular-vertical .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular-vertical .lg-item.lg-current,.lg-css3.lg-slide-circular-vertical .lg-item.lg-next-slide,.lg-css3.lg-slide-circular-vertical .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular-vertical-left .lg-item{opacity:0}.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(-100%,-100%,0);-webkit-transform:scale3d(0,0,0) translate3d(-100%,-100%,0);transform:scale3d(0,0,0) translate3d(-100%,-100%,0)}.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(-100%,100%,0);-webkit-transform:scale3d(0,0,0) translate3d(-100%,100%,0);transform:scale3d(0,0,0) translate3d(-100%,100%,0)}.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-current,.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-next-slide,.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular-vertical-down .lg-item{opacity:0}.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(100%,-100%,0);-webkit-transform:scale3d(0,0,0) translate3d(100%,-100%,0);transform:scale3d(0,0,0) translate3d(100%,-100%,0)}.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(100%,100%,0);-webkit-transform:scale3d(0,0,0) translate3d(100%,100%,0);transform:scale3d(0,0,0) translate3d(100%,100%,0)}.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-current,.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-next-slide,.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-vertical .lg-item{opacity:0}.lg-css3.lg-slide-vertical .lg-item.lg-prev-slide{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.lg-css3.lg-slide-vertical .lg-item.lg-next-slide{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.lg-css3.lg-slide-vertical .lg-item.lg-current{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-vertical .lg-item.lg-current,.lg-css3.lg-slide-vertical .lg-item.lg-next-slide,.lg-css3.lg-slide-vertical .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-vertical-growth .lg-item{opacity:0}.lg-css3.lg-slide-vertical-growth .lg-item.lg-prev-slide{-ms-transform:scale3d(.5,.5,.5) translate3d(0,-150%,0);-webkit-transform:scale3d(.5,.5,.5) translate3d(0,-150%,0);transform:scale3d(.5,.5,.5) translate3d(0,-150%,0)}.lg-css3.lg-slide-vertical-growth .lg-item.lg-next-slide{-ms-transform:scale3d(.5,.5,.5) translate3d(0,150%,0);-webkit-transform:scale3d(.5,.5,.5) translate3d(0,150%,0);transform:scale3d(.5,.5,.5) translate3d(0,150%,0)}.lg-css3.lg-slide-vertical-growth .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-vertical-growth .lg-item.lg-current,.lg-css3.lg-slide-vertical-growth .lg-item.lg-next-slide,.lg-css3.lg-slide-vertical-growth .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-only .lg-item{opacity:0}.lg-css3.lg-slide-skew-only .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only .lg-item.lg-prev-slide{-ms-transform:skew(10deg,0deg);-webkit-transform:skew(10deg,0deg);transform:skew(10deg,0deg)}.lg-css3.lg-slide-skew-only .lg-item.lg-current{-ms-transform:skew(0deg,0deg);-webkit-transform:skew(0deg,0deg);transform:skew(0deg,0deg);opacity:1}.lg-css3.lg-slide-skew-only .lg-item.lg-current,.lg-css3.lg-slide-skew-only .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-only-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-only-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-rev .lg-item.lg-prev-slide{-ms-transform:skew(-10deg,0deg);-webkit-transform:skew(-10deg,0deg);transform:skew(-10deg,0deg)}.lg-css3.lg-slide-skew-only-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg);-webkit-transform:skew(0deg,0deg);transform:skew(0deg,0deg);opacity:1}.lg-css3.lg-slide-skew-only-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-only-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-only-y .lg-item{opacity:0}.lg-css3.lg-slide-skew-only-y .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-y .lg-item.lg-prev-slide{-ms-transform:skew(0deg,10deg);-webkit-transform:skew(0deg,10deg);transform:skew(0deg,10deg)}.lg-css3.lg-slide-skew-only-y .lg-item.lg-current{-ms-transform:skew(0deg,0deg);-webkit-transform:skew(0deg,0deg);transform:skew(0deg,0deg);opacity:1}.lg-css3.lg-slide-skew-only-y .lg-item.lg-current,.lg-css3.lg-slide-skew-only-y .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-y .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-only-y-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-prev-slide{-ms-transform:skew(0deg,-10deg);-webkit-transform:skew(0deg,-10deg);transform:skew(0deg,-10deg)}.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg);-webkit-transform:skew(0deg,0deg);transform:skew(0deg,0deg);opacity:1}.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew .lg-item{opacity:0}.lg-css3.lg-slide-skew .lg-item.lg-prev-slide{-ms-transform:skew(20deg,0deg) translate3d(-100%,0,0);-webkit-transform:skew(20deg,0deg) translate3d(-100%,0,0);transform:skew(20deg,0deg) translate3d(-100%,0,0)}.lg-css3.lg-slide-skew .lg-item.lg-next-slide{-ms-transform:skew(20deg,0deg) translate3d(100%,0,0);-webkit-transform:skew(20deg,0deg) translate3d(100%,0,0);transform:skew(20deg,0deg) translate3d(100%,0,0)}.lg-css3.lg-slide-skew .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew .lg-item.lg-current,.lg-css3.lg-slide-skew .lg-item.lg-next-slide,.lg-css3.lg-slide-skew .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-rev .lg-item.lg-prev-slide{-ms-transform:skew(-20deg,0deg) translate3d(-100%,0,0);-webkit-transform:skew(-20deg,0deg) translate3d(-100%,0,0);transform:skew(-20deg,0deg) translate3d(-100%,0,0)}.lg-css3.lg-slide-skew-rev .lg-item.lg-next-slide{-ms-transform:skew(-20deg,0deg) translate3d(100%,0,0);-webkit-transform:skew(-20deg,0deg) translate3d(100%,0,0);transform:skew(-20deg,0deg) translate3d(100%,0,0)}.lg-css3.lg-slide-skew-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-cross .lg-item{opacity:0}.lg-css3.lg-slide-skew-cross .lg-item.lg-prev-slide{-ms-transform:skew(0deg,60deg) translate3d(-100%,0,0);-webkit-transform:skew(0deg,60deg) translate3d(-100%,0,0);transform:skew(0deg,60deg) translate3d(-100%,0,0)}.lg-css3.lg-slide-skew-cross .lg-item.lg-next-slide{-ms-transform:skew(0deg,60deg) translate3d(100%,0,0);-webkit-transform:skew(0deg,60deg) translate3d(100%,0,0);transform:skew(0deg,60deg) translate3d(100%,0,0)}.lg-css3.lg-slide-skew-cross .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-cross .lg-item.lg-current,.lg-css3.lg-slide-skew-cross .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-cross .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-cross-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-prev-slide{-ms-transform:skew(0deg,-60deg) translate3d(-100%,0,0);-webkit-transform:skew(0deg,-60deg) translate3d(-100%,0,0);transform:skew(0deg,-60deg) translate3d(-100%,0,0)}.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-next-slide{-ms-transform:skew(0deg,-60deg) translate3d(100%,0,0);-webkit-transform:skew(0deg,-60deg) translate3d(100%,0,0);transform:skew(0deg,-60deg) translate3d(100%,0,0)}.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-ver .lg-item{opacity:0}.lg-css3.lg-slide-skew-ver .lg-item.lg-prev-slide{-ms-transform:skew(60deg,0deg) translate3d(0,-100%,0);-webkit-transform:skew(60deg,0deg) translate3d(0,-100%,0);transform:skew(60deg,0deg) translate3d(0,-100%,0)}.lg-css3.lg-slide-skew-ver .lg-item.lg-next-slide{-ms-transform:skew(60deg,0deg) translate3d(0,100%,0);-webkit-transform:skew(60deg,0deg) translate3d(0,100%,0);transform:skew(60deg,0deg) translate3d(0,100%,0)}.lg-css3.lg-slide-skew-ver .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-ver .lg-item.lg-current,.lg-css3.lg-slide-skew-ver .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-ver .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-ver-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-prev-slide{-ms-transform:skew(-60deg,0deg) translate3d(0,-100%,0);-webkit-transform:skew(-60deg,0deg) translate3d(0,-100%,0);transform:skew(-60deg,0deg) translate3d(0,-100%,0)}.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-next-slide{-ms-transform:skew(-60deg,0deg) translate3d(0,100%,0);-webkit-transform:skew(-60deg,0deg) translate3d(0,100%,0);transform:skew(-60deg,0deg) translate3d(0,100%,0)}.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-ver-cross .lg-item{opacity:0}.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-prev-slide{-ms-transform:skew(0deg,20deg) translate3d(0,-100%,0);-webkit-transform:skew(0deg,20deg) translate3d(0,-100%,0);transform:skew(0deg,20deg) translate3d(0,-100%,0)}.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-next-slide{-ms-transform:skew(0deg,20deg) translate3d(0,100%,0);-webkit-transform:skew(0deg,20deg) translate3d(0,100%,0);transform:skew(0deg,20deg) translate3d(0,100%,0)}.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-current,.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-ver-cross-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-prev-slide{-ms-transform:skew(0deg,-20deg) translate3d(0,-100%,0);-webkit-transform:skew(0deg,-20deg) translate3d(0,-100%,0);transform:skew(0deg,-20deg) translate3d(0,-100%,0)}.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-next-slide{-ms-transform:skew(0deg,-20deg) translate3d(0,100%,0);-webkit-transform:skew(0deg,-20deg) translate3d(0,100%,0);transform:skew(0deg,-20deg) translate3d(0,100%,0)}.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-lollipop .lg-item{opacity:0}.lg-css3.lg-lollipop .lg-item.lg-prev-slide{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.lg-css3.lg-lollipop .lg-item.lg-next-slide{-ms-transform:translate3d(0,0,0) scale(.5);-webkit-transform:translate3d(0,0,0) scale(.5);transform:translate3d(0,0,0) scale(.5)}.lg-css3.lg-lollipop .lg-item.lg-current{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.lg-css3.lg-lollipop .lg-item.lg-current,.lg-css3.lg-lollipop .lg-item.lg-next-slide,.lg-css3.lg-lollipop .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-lollipop-rev .lg-item{opacity:0}.lg-css3.lg-lollipop-rev .lg-item.lg-prev-slide{-ms-transform:translate3d(0,0,0) scale(.5);-webkit-transform:translate3d(0,0,0) scale(.5);transform:translate3d(0,0,0) scale(.5)}.lg-css3.lg-lollipop-rev .lg-item.lg-next-slide{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.lg-css3.lg-lollipop-rev .lg-item.lg-current{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.lg-css3.lg-lollipop-rev .lg-item.lg-current,.lg-css3.lg-lollipop-rev .lg-item.lg-next-slide,.lg-css3.lg-lollipop-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-rotate .lg-item{opacity:0}.lg-css3.lg-rotate .lg-item.lg-prev-slide{-ms-transform:rotate(-360deg);-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}.lg-css3.lg-rotate .lg-item.lg-next-slide{-ms-transform:rotate(360deg);-webkit-transform:rotate(360deg);transform:rotate(360deg)}.lg-css3.lg-rotate .lg-item.lg-current{-ms-transform:rotate(0);-webkit-transform:rotate(0);transform:rotate(0);opacity:1}.lg-css3.lg-rotate .lg-item.lg-current,.lg-css3.lg-rotate .lg-item.lg-next-slide,.lg-css3.lg-rotate .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-rotate-rev .lg-item{opacity:0}.lg-css3.lg-rotate-rev .lg-item.lg-prev-slide{-ms-transform:rotate(360deg);-webkit-transform:rotate(360deg);transform:rotate(360deg)}.lg-css3.lg-rotate-rev .lg-item.lg-next-slide{-ms-transform:rotate(-360deg);-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}.lg-css3.lg-rotate-rev .lg-item.lg-current{-ms-transform:rotate(0);-webkit-transform:rotate(0);transform:rotate(0);opacity:1}.lg-css3.lg-rotate-rev .lg-item.lg-current,.lg-css3.lg-rotate-rev .lg-item.lg-next-slide,.lg-css3.lg-rotate-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-tube .lg-item{opacity:0}.lg-css3.lg-tube .lg-item.lg-prev-slide{-ms-transform:scale3d(1,0,1) translate3d(-100%,0,0);-webkit-transform:scale3d(1,0,1) translate3d(-100%,0,0);transform:scale3d(1,0,1) translate3d(-100%,0,0)}.lg-css3.lg-tube .lg-item.lg-next-slide{-ms-transform:scale3d(1,0,1) translate3d(100%,0,0);-webkit-transform:scale3d(1,0,1) translate3d(100%,0,0);transform:scale3d(1,0,1) translate3d(100%,0,0)}.lg-css3.lg-tube .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-tube .lg-item.lg-current,.lg-css3.lg-tube .lg-item.lg-next-slide,.lg-css3.lg-tube .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s} -.progressjs-inner{width:0}.progressjs-progress{z-index:9999999}.progressjs-theme-blue .progressjs-inner{height:2px;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db}.progressjs-theme-blue.progressjs-end{-webkit-transition:opacity .2s ease-out;-o-transition:opacity .2s ease-out;transition:opacity .2s ease-out;opacity:0}.progressjs-theme-blue .progressjs-percent{display:none}.progressjs-theme-blueOverlay{background-color:white;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.progressjs-theme-blueOverlay .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db}.progressjs-theme-blueOverlay.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlay .progressjs-percent{display:none}.progressjs-theme-blueOverlay{background-color:white;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.progressjs-theme-blueOverlay .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db}.progressjs-theme-blueOverlay.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlay .progressjs-percent{display:none}.progressjs-theme-blueOverlayRadius{background-color:white;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out;border-radius:5px}.progressjs-theme-blueOverlayRadius .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db;border-radius:5px}.progressjs-theme-blueOverlayRadius.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlayRadius .progressjs-percent{display:none}.progressjs-theme-blueOverlayRadiusHalfOpacity{background-color:white;opacity:.5;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out;border-radius:5px}.progressjs-theme-blueOverlayRadiusHalfOpacity .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db;border-radius:5px}.progressjs-theme-blueOverlayRadiusHalfOpacity.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlayRadiusHalfOpacity .progressjs-percent{display:none}.progressjs-theme-blueOverlayRadiusWithPercentBar{background-color:white;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out;border-radius:5px}.progressjs-theme-blueOverlayRadiusWithPercentBar .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db;border-radius:5px}.progressjs-theme-blueOverlayRadiusWithPercentBar.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlayRadiusWithPercentBar .progressjs-percent{width:70px;text-align:center;height:40px;position:absolute;right:50%;margin-right:-35px;top:50%;margin-top:-20px;font-size:30px;opacity:.5}.progressjs-theme-blackRadiusInputs{height:10px;border-radius:10px;overflow:hidden}.progressjs-theme-blackRadiusInputs .progressjs-inner{height:2px;-webkit-transition:all 1s ease-out;-o-transition:all 1s ease-out;transition:all 1s ease-out;background-color:#34495e}.progressjs-theme-blackRadiusInputs.progressjs-end{-webkit-transition:opacity .2s ease-out;-o-transition:opacity .2s ease-out;transition:opacity .2s ease-out;opacity:0}.progressjs-theme-blackRadiusInputs .progressjs-percent{display:none} - -.progressjs-theme-rainloop { - z-index: 2000; -} - -.progressjs-theme-rainloop .progressjs-inner { - - background-color: #939595; - position: relative; - z-index: 2000; - height: 3px; - overflow: hidden; - - -webkit-transition: width .5s; - -o-transition: width .5s; - transition: width .5s; -} - -.progressjs-theme-rainloop .progressjs-percent { - position: absolute; - top: 0; - left: 0; - right: -32px; - bottom: 0; - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.3) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.3) 50%, rgba(255, 255, 255, 0.3) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.3) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.3) 50%, rgba(255, 255, 255, 0.3) 75%, transparent 75%, transparent); - background-size: 32px 32px; - - -webkit-animation: simple-pace-stripe-animation 500ms linear infinite; - animation: simple-pace-stripe-animation 500ms linear infinite; -} - -@-webkit-keyframes simple-pace-stripe-animation { - 0% { -webkit-transform: none; transform: none; } - 100% { -webkit-transform: translate(-32px, 0); transform: translate(-32px, 0); } -} -@keyframes simple-pace-stripe-animation { - 0% { -webkit-transform: none; transform: none; transform: none; } - 100% { -webkit-transform: translate(-32px, 0); transform: translate(-32px, 0); transform: translate(-32px, 0); } -} - -.clearfix { - *zoom: 1; -} -.clearfix:before, -.clearfix:after { - display: table; - content: ""; - line-height: 0; -} -.clearfix:after { - clear: both; -} -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -body { - margin: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 20px; - color: #333; - background-color: #fff; -} -a { - color: #08c; - text-decoration: none; -} -a:hover { - color: #005580; - text-decoration: underline; -} -.img-rounded { - border-radius: 6px; -} -.img-polaroid { - padding: 4px; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); -} -.img-circle { - border-radius: 500px; -} -.row { - margin-left: -20px; - *zoom: 1; -} -.row:before, -.row:after { - display: table; - content: ""; - line-height: 0; -} -.row:after { - clear: both; -} -[class*="span"] { - float: left; - margin-left: 20px; -} -.container, -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} -.span12 { - width: 940px; -} -.span11 { - width: 860px; -} -.span10 { - width: 780px; -} -.span9 { - width: 700px; -} -.span8 { - width: 620px; -} -.span7 { - width: 540px; -} -.span6 { - width: 460px; -} -.span5 { - width: 380px; -} -.span4 { - width: 300px; -} -.span3 { - width: 220px; -} -.span2 { - width: 140px; -} -.span1 { - width: 60px; -} -.offset12 { - margin-left: 980px; -} -.offset11 { - margin-left: 900px; -} -.offset10 { - margin-left: 820px; -} -.offset9 { - margin-left: 740px; -} -.offset8 { - margin-left: 660px; -} -.offset7 { - margin-left: 580px; -} -.offset6 { - margin-left: 500px; -} -.offset5 { - margin-left: 420px; -} -.offset4 { - margin-left: 340px; -} -.offset3 { - margin-left: 260px; -} -.offset2 { - margin-left: 180px; -} -.offset1 { - margin-left: 100px; -} -.row-fluid { - width: 100%; - *zoom: 1; -} -.row-fluid:before, -.row-fluid:after { - display: table; - content: ""; - line-height: 0; -} -.row-fluid:after { - clear: both; -} -.row-fluid [class*="span"] { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - box-sizing: border-box; - float: left; - margin-left: 2.12765957%; - *margin-left: 2.07446809%; -} -.row-fluid [class*="span"]:first-child { - margin-left: 0; -} -.row-fluid .span12 { - width: 100%; - *width: 99.94680851%; -} -.row-fluid .span11 { - width: 91.4893617%; - *width: 91.43617021%; -} -.row-fluid .span10 { - width: 82.9787234%; - *width: 82.92553191%; -} -.row-fluid .span9 { - width: 74.46808511%; - *width: 74.41489362%; -} -.row-fluid .span8 { - width: 65.95744681%; - *width: 65.90425532%; -} -.row-fluid .span7 { - width: 57.44680851%; - *width: 57.39361702%; -} -.row-fluid .span6 { - width: 48.93617021%; - *width: 48.88297872%; -} -.row-fluid .span5 { - width: 40.42553191%; - *width: 40.37234043%; -} -.row-fluid .span4 { - width: 31.91489362%; - *width: 31.86170213%; -} -.row-fluid .span3 { - width: 23.40425532%; - *width: 23.35106383%; -} -.row-fluid .span2 { - width: 14.89361702%; - *width: 14.84042553%; -} -.row-fluid .span1 { - width: 6.38297872%; - *width: 6.32978723%; -} -.row-fluid .offset12 { - margin-left: 104.25531915%; - *margin-left: 104.14893617%; -} -.row-fluid .offset12:first-child { - margin-left: 102.12765957%; - *margin-left: 102.0212766%; -} -.row-fluid .offset11 { - margin-left: 95.74468085%; - *margin-left: 95.63829787%; -} -.row-fluid .offset11:first-child { - margin-left: 93.61702128%; - *margin-left: 93.5106383%; -} -.row-fluid .offset10 { - margin-left: 87.23404255%; - *margin-left: 87.12765957%; -} -.row-fluid .offset10:first-child { - margin-left: 85.10638298%; - *margin-left: 85%; -} -.row-fluid .offset9 { - margin-left: 78.72340426%; - *margin-left: 78.61702128%; -} -.row-fluid .offset9:first-child { - margin-left: 76.59574468%; - *margin-left: 76.4893617%; -} -.row-fluid .offset8 { - margin-left: 70.21276596%; - *margin-left: 70.10638298%; -} -.row-fluid .offset8:first-child { - margin-left: 68.08510638%; - *margin-left: 67.9787234%; -} -.row-fluid .offset7 { - margin-left: 61.70212766%; - *margin-left: 61.59574468%; -} -.row-fluid .offset7:first-child { - margin-left: 59.57446809%; - *margin-left: 59.46808511%; -} -.row-fluid .offset6 { - margin-left: 53.19148936%; - *margin-left: 53.08510638%; -} -.row-fluid .offset6:first-child { - margin-left: 51.06382979%; - *margin-left: 50.95744681%; -} -.row-fluid .offset5 { - margin-left: 44.68085106%; - *margin-left: 44.57446809%; -} -.row-fluid .offset5:first-child { - margin-left: 42.55319149%; - *margin-left: 42.44680851%; -} -.row-fluid .offset4 { - margin-left: 36.17021277%; - *margin-left: 36.06382979%; -} -.row-fluid .offset4:first-child { - margin-left: 34.04255319%; - *margin-left: 33.93617021%; -} -.row-fluid .offset3 { - margin-left: 27.65957447%; - *margin-left: 27.55319149%; -} -.row-fluid .offset3:first-child { - margin-left: 25.53191489%; - *margin-left: 25.42553191%; -} -.row-fluid .offset2 { - margin-left: 19.14893617%; - *margin-left: 19.04255319%; -} -.row-fluid .offset2:first-child { - margin-left: 17.0212766%; - *margin-left: 16.91489362%; -} -.row-fluid .offset1 { - margin-left: 10.63829787%; - *margin-left: 10.53191489%; -} -.row-fluid .offset1:first-child { - margin-left: 8.5106383%; - *margin-left: 8.40425532%; -} -[class*="span"].hide, -.row-fluid [class*="span"].hide { - display: none; -} -[class*="span"].pull-right, -.row-fluid [class*="span"].pull-right { - float: right; -} -.container { - margin-right: auto; - margin-left: auto; - *zoom: 1; -} -.container:before, -.container:after { - display: table; - content: ""; - line-height: 0; -} -.container:after { - clear: both; -} -.container-fluid { - padding-right: 20px; - padding-left: 20px; - *zoom: 1; -} -.container-fluid:before, -.container-fluid:after { - display: table; - content: ""; - line-height: 0; -} -.container-fluid:after { - clear: both; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 20px; - font-weight: 200; - line-height: 30px; -} -small { - font-size: 85%; -} -strong { - font-weight: bold; -} -em { - font-style: italic; -} -cite { - font-style: normal; -} -.muted { - color: #999; -} -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 10px 0; - font-family: inherit; - font-weight: bold; - line-height: 1; - color: inherit; - text-rendering: optimizelegibility; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - line-height: 1; - color: #999; -} -h1 { - font-size: 36px; - line-height: 40px; -} -h2 { - font-size: 30px; - line-height: 40px; -} -h3 { - font-size: 24px; - line-height: 40px; -} -h4 { - font-size: 18px; - line-height: 20px; -} -h5 { - font-size: 14px; - line-height: 20px; -} -h6 { - font-size: 12px; - line-height: 20px; -} -h1 small { - font-size: 24px; -} -h2 small { - font-size: 18px; -} -h3 small { - font-size: 14px; -} -h4 small { - font-size: 14px; -} -.page-header { - padding-bottom: 9px; - margin: 20px 0 30px; - border-bottom: 1px solid #eee; -} -ul, -ol { - padding: 0; - margin: 0 0 10px 25px; -} -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} -li { - line-height: 20px; -} -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} -dl { - margin-bottom: 20px; -} -dt, -dd { - line-height: 20px; -} -dt { - font-weight: bold; -} -dd { - margin-left: 10px; -} -.dl-horizontal dt { - float: left; - width: 120px; - clear: left; - text-align: right; - overflow: hidden; - -o-text-overflow: ellipsis; - text-overflow: ellipsis; - white-space: nowrap; -} -.dl-horizontal dd { - margin-left: 130px; -} -hr { - margin: 20px 0; - border: 0; - border-top: 1px solid #eee; - border-bottom: 1px solid #fff; -} -abbr[title] { - cursor: help; - border-bottom: 1px dotted #999; -} -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} -blockquote { - padding: 0 0 0 15px; - margin: 0 0 20px; - border-left: 5px solid #eee; -} -blockquote p { - margin-bottom: 0; - font-size: 16px; - font-weight: 300; - line-height: 25px; -} -blockquote small { - display: block; - line-height: 20px; - color: #999; -} -blockquote small:before { - content: '\2014 \00A0'; -} -blockquote.pull-right { - float: right; - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eee; - border-left: 0; -} -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} -blockquote.pull-right small:before { - content: ''; -} -blockquote.pull-right small:after { - content: '\00A0 \2014'; -} -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} -address { - display: block; - margin-bottom: 20px; - font-style: normal; - line-height: 20px; -} -code, -pre { - padding: 0 3px 2px; - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; - font-size: 12px; - color: #333; - border-radius: 3px; -} -code { - padding: 2px 4px; - color: #d14; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 20px; - word-break: break-all; - word-wrap: break-word; - white-space: pre; - white-space: pre-wrap; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 4px; -} -pre.prettyprint { - margin-bottom: 20px; -} -pre code { - padding: 0; - color: inherit; - background-color: transparent; - border: 0; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -form { - margin: 0 0 20px; -} -fieldset { - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: 40px; - color: #333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} -legend small { - font-size: 15px; - color: #999; -} -label, -input, -button, -select, -textarea { - font-size: 14px; - font-weight: normal; - line-height: 20px; -} -input, -button, -select, -textarea { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} -label { - display: block; - margin-bottom: 5px; -} -select, -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - display: inline-block; - height: 20px; - padding: 4px 6px; - margin-bottom: 9px; - font-size: 14px; - line-height: 20px; - color: #555; - border-radius: 3px; -} -input, -textarea { - width: 210px; -} -textarea { - height: auto; -} -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - background-color: #fff; - border: 1px solid #ccc; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear .2s, box-shadow linear .2s; - -o-transition: border linear .2s, box-shadow linear .2s; - -webkit-transition: border linear .2s, -webkit-box-shadow linear .2s; - transition: border linear .2s, -webkit-box-shadow linear .2s; - transition: border linear .2s, box-shadow linear .2s; - transition: border linear .2s, box-shadow linear .2s, -webkit-box-shadow linear .2s; -} -textarea:focus, -input[type="text"]:focus, -input[type="password"]:focus, -input[type="datetime"]:focus, -input[type="datetime-local"]:focus, -input[type="date"]:focus, -input[type="month"]:focus, -input[type="time"]:focus, -input[type="week"]:focus, -input[type="number"]:focus, -input[type="email"]:focus, -input[type="url"]:focus, -input[type="search"]:focus, -input[type="tel"]:focus, -input[type="color"]:focus, -.uneditable-input:focus { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); -} -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - *margin-top: 0; - /* IE7 */ - margin-top: 1px \9; - /* IE8-9 */ - line-height: normal; - cursor: pointer; -} -input[type="file"], -input[type="image"], -input[type="submit"], -input[type="reset"], -input[type="button"], -input[type="radio"], -input[type="checkbox"] { - width: auto; -} -select, -input[type="file"] { - height: 30px; - /* In IE7, the height of the select element cannot be changed by height, only font-size */ - *margin-top: 4px; - /* For IE7, add top margin to align select with labels */ - line-height: 30px; -} -select { - width: 220px; - border: 1px solid #bbb; - background-color: #fff; -} -select[multiple], -select[size] { - height: auto; -} -select:focus, -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.uneditable-input, -.uneditable-textarea { - color: #999; - background-color: #fcfcfc; - border-color: #ccc; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - cursor: not-allowed; -} -.uneditable-input { - overflow: hidden; - white-space: nowrap; -} -.uneditable-textarea { - width: auto; - height: auto; -} -input:-moz-placeholder, -textarea:-moz-placeholder { - color: #999; -} -input:-ms-input-placeholder, -textarea:-ms-input-placeholder { - color: #999; -} -input::-webkit-input-placeholder, -textarea::-webkit-input-placeholder { - color: #999; -} -.radio, -.checkbox { - min-height: 18px; - padding-left: 18px; -} -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -18px; -} -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} -.input-mini { - width: 60px; -} -.input-small { - width: 90px; -} -.input-medium { - width: 150px; -} -.input-large { - width: 210px; -} -.input-xlarge { - width: 270px; -} -.input-xxlarge { - width: 530px; -} -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"] { - float: none; - margin-left: 0; -} -.input-append input[class*="span"], -.input-append .uneditable-input[class*="span"], -.input-prepend input[class*="span"], -.input-prepend .uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"], -.row-fluid .input-prepend [class*="span"], -.row-fluid .input-append [class*="span"] { - display: inline-block; -} -input, -textarea, -.uneditable-input { - margin-left: 0; -} -.controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; -} -input.span12, -textarea.span12, -.uneditable-input.span12 { - width: 926px; -} -input.span11, -textarea.span11, -.uneditable-input.span11 { - width: 846px; -} -input.span10, -textarea.span10, -.uneditable-input.span10 { - width: 766px; -} -input.span9, -textarea.span9, -.uneditable-input.span9 { - width: 686px; -} -input.span8, -textarea.span8, -.uneditable-input.span8 { - width: 606px; -} -input.span7, -textarea.span7, -.uneditable-input.span7 { - width: 526px; -} -input.span6, -textarea.span6, -.uneditable-input.span6 { - width: 446px; -} -input.span5, -textarea.span5, -.uneditable-input.span5 { - width: 366px; -} -input.span4, -textarea.span4, -.uneditable-input.span4 { - width: 286px; -} -input.span3, -textarea.span3, -.uneditable-input.span3 { - width: 206px; -} -input.span2, -textarea.span2, -.uneditable-input.span2 { - width: 126px; -} -input.span1, -textarea.span1, -.uneditable-input.span1 { - width: 46px; -} -.controls-row { - *zoom: 1; -} -.controls-row:before, -.controls-row:after { - display: table; - content: ""; - line-height: 0; -} -.controls-row:after { - clear: both; -} -.controls-row [class*="span"] { - float: left; -} -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - cursor: not-allowed; - background-color: #eee; -} -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"][readonly], -input[type="checkbox"][readonly] { - background-color: transparent; -} -.control-group.warning > label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #c09853; -} -.control-group.warning .checkbox, -.control-group.warning .radio, -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #c09853; - border-color: #c09853; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.warning .checkbox:focus, -.control-group.warning .radio:focus, -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; -} -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} -.control-group.error > label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #b94a48; -} -.control-group.error .checkbox, -.control-group.error .radio, -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #b94a48; - border-color: #b94a48; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.error .checkbox:focus, -.control-group.error .radio:focus, -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #953b39; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; -} -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #b94a48; - background-color: #f2dede; - border-color: #b94a48; -} -.control-group.success > label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #468847; -} -.control-group.success .checkbox, -.control-group.success .radio, -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #468847; - border-color: #468847; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.success .checkbox:focus, -.control-group.success .radio:focus, -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; -} -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} -input:focus:required:invalid, -textarea:focus:required:invalid, -select:focus:required:invalid { - color: #b94a48; - border-color: #ee5f5b; -} -input:focus:required:invalid:focus, -textarea:focus:required:invalid:focus, -select:focus:required:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} -.form-actions { - padding: 19px 20px 20px; - margin-top: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-top: 1px solid #e5e5e5; - *zoom: 1; -} -.form-actions:before, -.form-actions:after { - display: table; - content: ""; - line-height: 0; -} -.form-actions:after { - clear: both; -} -.help-block, -.help-inline { - color: #595959; -} -.help-block { - display: block; - margin-bottom: 10px; -} -.help-inline { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - vertical-align: middle; - padding-left: 5px; -} -.input-append, -.input-prepend { - margin-bottom: 5px; - font-size: 0; - white-space: nowrap; -} -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input { - position: relative; - margin-bottom: 0; - *margin-left: 0; - font-size: 14px; - vertical-align: top; - border-radius: 0 3px 3px 0; -} -.input-append input:focus, -.input-prepend input:focus, -.input-append select:focus, -.input-prepend select:focus, -.input-append .uneditable-input:focus, -.input-prepend .uneditable-input:focus { - z-index: 2; -} -.input-append .add-on, -.input-prepend .add-on { - display: inline-block; - width: auto; - height: 20px; - min-width: 16px; - padding: 4px 5px; - font-size: 14px; - font-weight: normal; - line-height: 20px; - text-align: center; - text-shadow: 0 1px 0 #fff; - background-color: #eee; - border: 1px solid #ccc; -} -.input-append .add-on, -.input-prepend .add-on, -.input-append .btn, -.input-prepend .btn { - margin-left: -1px; - vertical-align: top; - border-radius: 0; -} -.input-append .active, -.input-prepend .active { - background-color: #a9dba9; - border-color: #46a546; -} -.input-prepend .add-on, -.input-prepend .btn { - margin-right: -1px; -} -.input-prepend .add-on:first-child, -.input-prepend .btn:first-child { - border-radius: 3px 0 0 3px; -} -.input-append input, -.input-append select, -.input-append .uneditable-input { - border-radius: 3px 0 0 3px; -} -.input-append .add-on:last-child, -.input-append .btn:last-child { - border-radius: 0 3px 3px 0; -} -.input-prepend.input-append input, -.input-prepend.input-append select, -.input-prepend.input-append .uneditable-input { - border-radius: 0; -} -.input-prepend.input-append .add-on:first-child, -.input-prepend.input-append .btn:first-child { - margin-right: -1px; - border-radius: 3px 0 0 3px; -} -.input-prepend.input-append .add-on:last-child, -.input-prepend.input-append .btn:last-child { - margin-left: -1px; - border-radius: 0 3px 3px 0; -} -input.search-query { - padding-right: 14px; - padding-right: 4px \9; - padding-left: 14px; - padding-left: 4px \9; - /* IE7-8 doesn't have border-radius, so don't indent the padding */ - margin-bottom: 0; - border-radius: 15px; -} -/* Allow for input prepend/append in search forms */ -.form-search .input-append .search-query, -.form-search .input-prepend .search-query { - border-radius: 0; -} -.form-search .input-append .search-query { - border-radius: 14px 0 0 14px; -} -.form-search .input-append .btn { - border-radius: 0 14px 14px 0; -} -.form-search .input-prepend .search-query { - border-radius: 0 14px 14px 0; -} -.form-search .input-prepend .btn { - border-radius: 14px 0 0 14px; -} -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input, -.form-search .input-prepend, -.form-inline .input-prepend, -.form-horizontal .input-prepend, -.form-search .input-append, -.form-inline .input-append, -.form-horizontal .input-append { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - margin-bottom: 0; - vertical-align: middle; -} -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} -.form-search label, -.form-inline label, -.form-search .btn-group, -.form-inline .btn-group { - display: inline-block; -} -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - margin-bottom: 0; -} -.form-search .radio, -.form-search .checkbox, -.form-inline .radio, -.form-inline .checkbox { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"], -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-right: 3px; - margin-left: 0; -} -.control-group { - margin-bottom: 10px; -} -legend + .control-group { - margin-top: 20px; - -webkit-margin-top-collapse: separate; -} -.form-horizontal .control-group { - margin-bottom: 20px; - *zoom: 1; -} -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { - display: table; - content: ""; - line-height: 0; -} -.form-horizontal .control-group:after { - clear: both; -} -.form-horizontal .control-label { - float: left; - width: 140px; - padding-top: 5px; - text-align: right; -} -.form-horizontal .controls { - *display: inline-block; - *padding-left: 20px; - margin-left: 160px; - *margin-left: 0; -} -.form-horizontal .controls:first-child { - *padding-left: 160px; -} -.form-horizontal .help-block { - margin-top: 10px; - margin-bottom: 0; -} -.form-horizontal .form-actions { - padding-left: 160px; -} -.table { - max-width: 100%; - background-color: transparent; - border-collapse: collapse; - border-spacing: 0; -} -.table { - width: 100%; - margin-bottom: 20px; -} -.table th, -.table td { - padding: 8px; - line-height: 20px; - text-align: left; - vertical-align: top; - border-top: 1px solid #ddd; -} -.table th { - font-weight: bold; -} -.table thead th { - vertical-align: bottom; -} -.table caption + thead tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child th, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child th, -.table thead:first-child tr:first-child td { - border-top: 0; -} -.table tbody + tbody { - border-top: 2px solid #ddd; -} -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} -.table-bordered { - border: 1px solid #ddd; - border-collapse: separate; - *border-collapse: collapse; - border-left: 0; - border-radius: 4px; -} -.table-bordered th, -.table-bordered td { - border-left: 1px solid #ddd; -} -.table-bordered caption + thead tr:first-child th, -.table-bordered caption + tbody tr:first-child th, -.table-bordered caption + tbody tr:first-child td, -.table-bordered colgroup + thead tr:first-child th, -.table-bordered colgroup + tbody tr:first-child th, -.table-bordered colgroup + tbody tr:first-child td, -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} -.table-bordered thead:first-child tr:first-child th:first-child, -.table-bordered tbody:first-child tr:first-child td:first-child { - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} -.table-bordered thead:first-child tr:first-child th:last-child, -.table-bordered tbody:first-child tr:first-child td:last-child { - border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; -} -.table-bordered thead:last-child tr:last-child th:first-child, -.table-bordered tbody:last-child tr:last-child td:first-child, -.table-bordered tfoot:last-child tr:last-child td:first-child { - border-radius: 0 0 0 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; -} -.table-bordered thead:last-child tr:last-child th:last-child, -.table-bordered tbody:last-child tr:last-child td:last-child, -.table-bordered tfoot:last-child tr:last-child td:last-child { - border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; -} -.table-bordered caption + thead tr:first-child th:first-child, -.table-bordered caption + tbody tr:first-child td:first-child, -.table-bordered colgroup + thead tr:first-child th:first-child, -.table-bordered colgroup + tbody tr:first-child td:first-child { - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} -.table-bordered caption + thead tr:first-child th:last-child, -.table-bordered caption + tbody tr:first-child td:last-child, -.table-bordered colgroup + thead tr:first-child th:last-child, -.table-bordered colgroup + tbody tr:first-child td:last-child { - border-top-right-radius: 4px; - -moz-border-right-topleft: 4px; -} -.table-striped tbody tr:nth-child(odd) td, -.table-striped tbody tr:nth-child(odd) th { - background-color: #f9f9f9; -} -.table-hover tbody tr:hover td, -.table-hover tbody tr:hover th { - background-color: #f5f5f5; -} -table [class*=span], -.row-fluid table [class*=span] { - display: table-cell; - float: none; - margin-left: 0; -} -table .span1 { - float: none; - width: 44px; - margin-left: 0; -} -table .span2 { - float: none; - width: 124px; - margin-left: 0; -} -table .span3 { - float: none; - width: 204px; - margin-left: 0; -} -table .span4 { - float: none; - width: 284px; - margin-left: 0; -} -table .span5 { - float: none; - width: 364px; - margin-left: 0; -} -table .span6 { - float: none; - width: 444px; - margin-left: 0; -} -table .span7 { - float: none; - width: 524px; - margin-left: 0; -} -table .span8 { - float: none; - width: 604px; - margin-left: 0; -} -table .span9 { - float: none; - width: 684px; - margin-left: 0; -} -table .span10 { - float: none; - width: 764px; - margin-left: 0; -} -table .span11 { - float: none; - width: 844px; - margin-left: 0; -} -table .span12 { - float: none; - width: 924px; - margin-left: 0; -} -table .span13 { - float: none; - width: 1004px; - margin-left: 0; -} -table .span14 { - float: none; - width: 1084px; - margin-left: 0; -} -table .span15 { - float: none; - width: 1164px; - margin-left: 0; -} -table .span16 { - float: none; - width: 1244px; - margin-left: 0; -} -table .span17 { - float: none; - width: 1324px; - margin-left: 0; -} -table .span18 { - float: none; - width: 1404px; - margin-left: 0; -} -table .span19 { - float: none; - width: 1484px; - margin-left: 0; -} -table .span20 { - float: none; - width: 1564px; - margin-left: 0; -} -table .span21 { - float: none; - width: 1644px; - margin-left: 0; -} -table .span22 { - float: none; - width: 1724px; - margin-left: 0; -} -table .span23 { - float: none; - width: 1804px; - margin-left: 0; -} -table .span24 { - float: none; - width: 1884px; - margin-left: 0; -} -.table tbody tr.success td { - background-color: #dff0d8; -} -.table tbody tr.error td { - background-color: #f2dede; -} -.table tbody tr.info td { - background-color: #d9edf7; -} -.dropup, -.dropdown { - position: relative; -} -.dropdown-toggle { - *margin-bottom: -3px; -} -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - border-top: 4px solid #000; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - content: ""; -} -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - list-style: none; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - background-clip: padding-box; -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #fff; -} -.dropdown-menu a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 20px; - color: #333; - white-space: nowrap; -} -.dropdown-menu li > a:hover, -.dropdown-menu li > a:focus, -.dropdown-submenu:hover > a { - text-decoration: none; - color: #fff; - background-color: #08c; - background-color: #0081c2; - background-image: -o-linear-gradient(top, #08c, #0077b3); - background-image: -webkit-gradient(linear, left top, left bottom, from(#08c), to(#0077b3)); - background-image: linear-gradient(to bottom, #08c, #0077b3); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); -} -.dropdown-menu .active > a, -.dropdown-menu .active > a:hover { - color: #fff; - text-decoration: none; - outline: 0; - background-color: #08c; - background-color: #0081c2; - background-image: -o-linear-gradient(top, #08c, #0077b3); - background-image: -webkit-gradient(linear, left top, left bottom, from(#08c), to(#0077b3)); - background-image: linear-gradient(to bottom, #08c, #0077b3); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); -} -.dropdown-menu .disabled > a, -.dropdown-menu .disabled > a:hover { - color: #999; -} -.dropdown-menu .disabled > a:hover { - text-decoration: none; - background-color: transparent; - cursor: default; -} -.open { - *z-index: 1000; -} -.open > .dropdown-menu { - display: block; -} -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid #000; - content: "\2191"; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} -.dropdown-submenu { - position: relative; -} -.dropdown-submenu > .dropdown-menu { - top: 0; - left: 100%; - margin-top: -6px; - margin-left: -1px; - border-radius: 0 6px 6px 6px; -} -.dropdown-submenu:hover .dropdown-menu { - display: block; -} -.dropdown-submenu > a:after { - display: block; - content: " "; - float: right; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; - border-width: 5px 0 5px 5px; - border-left-color: #cccccc; - margin-top: 5px; - margin-right: -10px; -} -.dropdown-submenu:hover > a:after { - border-left-color: #fff; -} -.dropdown .dropdown-menu .nav-header { - padding-left: 20px; - padding-right: 20px; -} -.typeahead { - margin-top: 2px; - border-radius: 4px; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} -.well-large { - padding: 24px; - border-radius: 6px; -} -.well-small { - padding: 9px; - border-radius: 3px; -} -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} -.fade.in { - opacity: 1; -} -.collapse { - position: relative; - height: 0; - overflow: hidden; - overflow: visible \9; - -webkit-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; -} -.collapse.in { - height: auto; -} -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 20px; - color: #000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} -.close:hover { - color: #000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - filter: alpha(opacity=40); -} -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} -.btn { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - padding: 4px 14px; - margin-bottom: 0; - font-size: 14px; - line-height: 20px; - *line-height: 20px; - text-align: center; - vertical-align: middle; - cursor: pointer; - color: #333; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - background-color: #f5f5f5; - background-image: -o-linear-gradient(top, #fff, #e6e6e6); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e6e6e6)); - background-image: linear-gradient(to bottom, #fff, #e6e6e6); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); - border-color: #e6e6e6 #e6e6e6 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #e6e6e6; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - border: 1px solid #bbb; - *border: 0; - border-bottom-color: #a2a2a2; - border-radius: 4px; - *margin-left: .3em; - -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); -} -.btn:hover, -.btn:active, -.btn.active, -.btn.disabled, -.btn[disabled] { - color: #333; - background-color: #e6e6e6; - *background-color: #d9d9d9; -} -.btn:active, -.btn.active { - background-color: #cccccc \9; -} -.btn:first-child { - *margin-left: 0; -} -.btn:hover { - color: #333; - text-decoration: none; - background-color: #e6e6e6; - *background-color: #d9d9d9; - /* Buttons in IE7 don't get borders, so darken on hover */ - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn.active, -.btn:active { - background-color: #e6e6e6; - background-color: #d9d9d9 \9; - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); -} -.btn.disabled, -.btn[disabled] { - cursor: default; - background-color: #e6e6e6; - background-image: none; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; -} -.btn-large { - padding: 9px 14px; - font-size: 16px; - line-height: normal; - border-radius: 5px; -} -.btn-large [class^="icon-"] { - margin-top: 2px; -} -.btn-small { - padding: 3px 9px; - font-size: 12px; - line-height: 18px; -} -.btn-small [class^="icon-"] { - margin-top: 0; -} -.btn-mini { - padding: 2px 6px; - font-size: 11px; - line-height: 16px; -} -.btn-block { - display: block; - width: 100%; - padding-left: 0; - padding-right: 0; - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -.btn-block + .btn-block { - margin-top: 5px; -} -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active, -.btn-inverse.active { - color: rgba(255, 255, 255, 0.75); -} -.btn { - border-color: #c5c5c5; - border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25); -} -.btn-primary { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #006dcc; - background-image: -o-linear-gradient(top, #08c, #0044cc); - background-image: -webkit-gradient(linear, left top, left bottom, from(#08c), to(#0044cc)); - background-image: linear-gradient(to bottom, #08c, #0044cc); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); - border-color: #0044cc #0044cc #002a80; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #0044cc; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-primary:hover, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - color: #fff; - background-color: #0044cc; - *background-color: #003bb3; -} -.btn-primary:active, -.btn-primary.active { - background-color: #003399 \9; -} -.btn-warning { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #faa732; - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fbb450), to(#f89406)); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #f89406; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-warning:hover, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - color: #fff; - background-color: #f89406; - *background-color: #df8505; -} -.btn-warning:active, -.btn-warning.active { - background-color: #c67605 \9; -} -.btn-danger { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #da4f49; - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -webkit-gradient(linear, left top, left bottom, from(#ee5f5b), to(#bd362f)); - background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #bd362f; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-danger:hover, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - color: #fff; - background-color: #bd362f; - *background-color: #a9302a; -} -.btn-danger:active, -.btn-danger.active { - background-color: #942a25 \9; -} -.btn-success { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #5bb75b; - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: -webkit-gradient(linear, left top, left bottom, from(#62c462), to(#51a351)); - background-image: linear-gradient(to bottom, #62c462, #51a351); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #51a351; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-success:hover, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - color: #fff; - background-color: #51a351; - *background-color: #499249; -} -.btn-success:active, -.btn-success.active { - background-color: #408140 \9; -} -.btn-info { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #49afcd; - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2f96b4)); - background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #2f96b4; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-info:hover, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - color: #fff; - background-color: #2f96b4; - *background-color: #2a85a0; -} -.btn-info:active, -.btn-info.active { - background-color: #24748c \9; -} -.btn-inverse { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #363636; - background-image: -o-linear-gradient(top, #444, #222); - background-image: -webkit-gradient(linear, left top, left bottom, from(#444), to(#222)); - background-image: linear-gradient(to bottom, #444, #222); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); - border-color: #222 #222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #222; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-inverse:hover, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - color: #fff; - background-color: #222; - *background-color: #151515; -} -.btn-inverse:active, -.btn-inverse.active { - background-color: #080808 \9; -} -button.btn, -input[type="submit"].btn { - *padding-top: 3px; - *padding-bottom: 3px; -} -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} -button.btn.btn-large, -input[type="submit"].btn.btn-large { - *padding-top: 7px; - *padding-bottom: 7px; -} -button.btn.btn-small, -input[type="submit"].btn.btn-small { - *padding-top: 3px; - *padding-bottom: 3px; -} -button.btn.btn-mini, -input[type="submit"].btn.btn-mini { - *padding-top: 1px; - *padding-bottom: 1px; -} -.btn-link, -.btn-link:active { - background-color: transparent; - background-image: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.btn-link { - border-color: transparent; - cursor: pointer; - color: #08c; - border-radius: 0; -} -.btn-link:hover { - color: #005580; - text-decoration: underline; - background-color: transparent; -} -.btn-group { - position: relative; - font-size: 0; - white-space: nowrap; - *margin-left: .3em; -} -.btn-group:first-child { - *margin-left: 0; -} -.btn-group + .btn-group { - margin-left: 5px; -} -.btn-toolbar { - font-size: 0; - margin-top: 10px; - margin-bottom: 10px; -} -.btn-toolbar .btn-group { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.btn-toolbar .btn + .btn, -.btn-toolbar .btn-group + .btn, -.btn-toolbar .btn + .btn-group { - margin-left: 5px; -} -.btn-group > .btn { - position: relative; - border-radius: 0; -} -.btn-group > .btn + .btn { - margin-left: -1px; -} -.btn-group > .btn, -.btn-group > .dropdown-menu { - font-size: 14px; -} -.btn-group > .btn-mini { - font-size: 11px; -} -.btn-group > .btn-small { - font-size: 12px; -} -.btn-group > .btn-large { - font-size: 16px; -} -.btn-group > .btn:first-child { - margin-left: 0; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; -} -.btn-group > .btn:last-child, -.btn-group > .dropdown-toggle { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} -.btn-group > .btn.large:first-child { - margin-left: 0; - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; -} -.btn-group > .btn.large:last-child, -.btn-group > .large.dropdown-toggle { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active { - z-index: 2; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group > .btn + .dropdown-toggle { - padding-left: 8px; - padding-right: 8px; - -webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); - *padding-top: 5px; - *padding-bottom: 5px; -} -.btn-group > .btn-mini + .dropdown-toggle { - padding-left: 5px; - padding-right: 5px; - *padding-top: 2px; - *padding-bottom: 2px; -} -.btn-group > .btn-small + .dropdown-toggle { - *padding-top: 5px; - *padding-bottom: 4px; -} -.btn-group > .btn-large + .dropdown-toggle { - padding-left: 12px; - padding-right: 12px; - *padding-top: 7px; - *padding-bottom: 7px; -} -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); -} -.btn-group.open .btn.dropdown-toggle { - background-color: #e6e6e6; -} -.btn-group.open .btn-primary.dropdown-toggle { - background-color: #0044cc; -} -.btn-group.open .btn-warning.dropdown-toggle { - background-color: #f89406; -} -.btn-group.open .btn-danger.dropdown-toggle { - background-color: #bd362f; -} -.btn-group.open .btn-success.dropdown-toggle { - background-color: #51a351; -} -.btn-group.open .btn-info.dropdown-toggle { - background-color: #2f96b4; -} -.btn-group.open .btn-inverse.dropdown-toggle { - background-color: #222; -} -.btn .caret { - margin-top: 8px; - margin-left: 0; -} -.btn-mini .caret, -.btn-small .caret, -.btn-large .caret { - margin-top: 6px; -} -.btn-large .caret { - border-left-width: 5px; - border-right-width: 5px; - border-top-width: 5px; -} -.dropup .btn-large .caret { - border-bottom: 5px solid #000; - border-top: 0; -} -.btn-primary .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.btn-group-vertical { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.btn-group-vertical .btn { - display: block; - float: none; - width: 100%; - border-radius: 0; -} -.btn-group-vertical .btn + .btn { - margin-left: 0; - margin-top: -1px; -} -.btn-group-vertical .btn:first-child { - border-radius: 4px 4px 0 0; -} -.btn-group-vertical .btn:last-child { - border-radius: 0 0 4px 4px; -} -.btn-group-vertical .btn-large:first-child { - border-radius: 6px 6px 0 0; -} -.btn-group-vertical .btn-large:last-child { - border-radius: 0 0 6px 6px; -} -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 20px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - border-radius: 4px; - color: #c09853; -} -.alert h4 { - margin: 0; -} -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 20px; -} -.alert-success { - background-color: #dff0d8; - border-color: #d6e9c6; - color: #468847; -} -.alert-danger, -.alert-error { - background-color: #f2dede; - border-color: #eed3d7; - color: #b94a48; -} -.alert-info { - background-color: #d9edf7; - border-color: #bce8f1; - color: #3a87ad; -} -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} -.alert-block p + p { - margin-top: 5px; -} -.nav { - margin-left: 0; - margin-bottom: 20px; - list-style: none; -} -.nav > li > a { - display: block; -} -.nav > li > a:hover { - text-decoration: none; - background-color: #eee; -} -.nav > .pull-right { - float: right; -} -.nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 20px; - color: #999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} -.nav li + .nav-header { - margin-top: 9px; -} -.nav-list { - padding-left: 15px; - padding-right: 15px; - margin-bottom: 0; -} -.nav-list > li > a, -.nav-list .nav-header { - margin-left: -15px; - margin-right: -15px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); -} -.nav-list > li > a { - padding: 3px 15px; -} -.nav-list > .active > a, -.nav-list > .active > a:hover { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #08c; -} -.nav-list [class^="icon-"] { - margin-right: 2px; -} -.nav-list .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #fff; -} -.nav-tabs, -.nav-pills { - *zoom: 1; -} -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - content: ""; - line-height: 0; -} -.nav-tabs:after, -.nav-pills:after { - clear: both; -} -.nav-tabs > li, -.nav-pills > li { - float: left; -} -.nav-tabs > li > a, -.nav-pills > li > a { - padding-right: 12px; - padding-left: 12px; - margin-right: 2px; - line-height: 14px; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - margin-bottom: -1px; -} -.nav-tabs > li > a { - padding-top: 8px; - padding-bottom: 8px; - line-height: 20px; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eee #eee #ddd; -} -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover { - color: #555; - background-color: #fff; - border: 1px solid #ddd; - border-bottom-color: transparent; - cursor: default; -} -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - border-radius: 5px; -} -.nav-pills > .active > a, -.nav-pills > .active > a:hover { - color: #fff; - background-color: #08c; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li > a { - margin-right: 0; -} -.nav-tabs.nav-stacked { - border-bottom: 0; -} -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - border-radius: 0; -} -.nav-tabs.nav-stacked > li:first-child > a { - border-top-right-radius: 4px; - border-top-left-radius: 4px; -} -.nav-tabs.nav-stacked > li:last-child > a { - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} -.nav-tabs.nav-stacked > li > a:hover { - border-color: #ddd; - z-index: 2; -} -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} -.nav-tabs .dropdown-menu { - border-radius: 0 0 6px 6px; -} -.nav-pills .dropdown-menu { - border-radius: 6px; -} -.nav .dropdown-toggle .caret { - border-top-color: #08c; - border-bottom-color: #08c; - margin-top: 6px; -} -.nav .dropdown-toggle:hover .caret { - border-top-color: #005580; - border-bottom-color: #005580; -} -/* move down carets for tabs */ -.nav-tabs .dropdown-toggle .caret { - margin-top: 8px; -} -.nav .active .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.nav-tabs .active .dropdown-toggle .caret { - border-top-color: #555; - border-bottom-color: #555; -} -.nav > .dropdown.active > a:hover { - cursor: pointer; -} -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > li.dropdown.open.active > a:hover { - color: #fff; - background-color: #999; - border-color: #999; -} -.nav li.dropdown.open .caret, -.nav li.dropdown.open.active .caret, -.nav li.dropdown.open a:hover .caret { - border-top-color: #fff; - border-bottom-color: #fff; - opacity: 1; - filter: alpha(opacity=100); -} -.tabs-stacked .open > a:hover { - border-color: #999; -} -.tabbable { - *zoom: 1; -} -.tabbable:before, -.tabbable:after { - display: table; - content: ""; - line-height: 0; -} -.tabbable:after { - clear: both; -} -.tab-content { - overflow: auto; -} -.tabs-below > .nav-tabs, -.tabs-right > .nav-tabs, -.tabs-left > .nav-tabs { - border-bottom: 0; -} -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} -.tab-content > .active, -.pill-content > .active { - display: block; -} -.tabs-below > .nav-tabs { - border-top: 1px solid #ddd; -} -.tabs-below > .nav-tabs > li { - margin-top: -1px; - margin-bottom: 0; -} -.tabs-below > .nav-tabs > li > a { - border-radius: 0 0 4px 4px; -} -.tabs-below > .nav-tabs > li > a:hover { - border-bottom-color: transparent; - border-top-color: #ddd; -} -.tabs-below > .nav-tabs > .active > a, -.tabs-below > .nav-tabs > .active > a:hover { - border-color: transparent #ddd #ddd #ddd; -} -.tabs-left > .nav-tabs > li, -.tabs-right > .nav-tabs > li { - float: none; -} -.tabs-left > .nav-tabs > li > a, -.tabs-right > .nav-tabs > li > a { - min-width: 74px; - margin-right: 0; - margin-bottom: 3px; -} -.tabs-left > .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} -.tabs-left > .nav-tabs > li > a { - margin-right: -1px; - border-radius: 4px 0 0 4px; -} -.tabs-left > .nav-tabs > li > a:hover { - border-color: #eee #ddd #eee #eee; -} -.tabs-left > .nav-tabs .active > a, -.tabs-left > .nav-tabs .active > a:hover { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #fff; -} -.tabs-right > .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} -.tabs-right > .nav-tabs > li > a { - margin-left: -1px; - border-radius: 0 4px 4px 0; -} -.tabs-right > .nav-tabs > li > a:hover { - border-color: #eee #eee #eee #ddd; -} -.tabs-right > .nav-tabs .active > a, -.tabs-right > .nav-tabs .active > a:hover { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #fff; -} -.nav > .disabled > a { - color: #999; -} -.nav > .disabled > a:hover { - text-decoration: none; - background-color: transparent; - cursor: default; -} -.navbar { - overflow: visible; - margin-bottom: 20px; - color: #555; - *position: relative; - *z-index: 2; -} -.navbar-inner { - min-height: 40px; - padding-left: 20px; - padding-right: 20px; - background-color: #fafafa; - background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#f2f2f2)); - background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); - border: 1px solid #d4d4d4; - border-radius: 4px; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); -} -.navbar .container { - width: auto; -} -.nav-collapse.collapse { - height: auto; -} -.navbar .brand { - float: left; - display: block; - padding: 10px 20px 10px; - margin-left: -20px; - font-size: 20px; - font-weight: 200; - color: #555; - text-shadow: 0 1px 0 #ffffff; -} -.navbar .brand:hover { - text-decoration: none; -} -.navbar-text { - margin-bottom: 0; - line-height: 40px; -} -.navbar-link { - color: #555; -} -.navbar-link:hover { - color: #333; -} -.navbar .divider-vertical { - height: 40px; - margin: 0 9px; - border-left: 1px solid #f2f2f2; - border-right: 1px solid #ffffff; -} -.navbar .btn, -.navbar .btn-group { - margin-top: 6px; -} -.navbar .btn-group .btn { - margin: 0; -} -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} -.navbar-form:before, -.navbar-form:after { - display: table; - content: ""; - line-height: 0; -} -.navbar-form:after { - clear: both; -} -.navbar-form input, -.navbar-form select, -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: 5px; -} -.navbar-form input, -.navbar-form select, -.navbar-form .btn { - display: inline-block; - margin-bottom: 0; -} -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 6px; - white-space: nowrap; -} -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} -.navbar-search { - position: relative; - float: left; - margin-top: 5px; - margin-bottom: 0; -} -.navbar-search .search-query { - margin-bottom: 0; - padding: 4px 14px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - border-radius: 15px; -} -.navbar-static-top { - position: static; - width: 100%; - margin-bottom: 0; -} -.navbar-static-top .navbar-inner { - border-radius: 0; -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - margin-bottom: 0; -} -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner, -.navbar-static-top .navbar-inner { - border: 0; -} -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner { - padding-left: 0; - padding-right: 0; - border-radius: 0; -} -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} -.navbar-fixed-top { - top: 0; -} -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1); - box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1); -} -.navbar-fixed-bottom { - bottom: 0; -} -.navbar-fixed-bottom .navbar-inner { - -webkit-box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1); - box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1); -} -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} -.navbar .nav.pull-right { - float: right; -} -.navbar .nav > li { - float: left; -} -.navbar .nav > li > a { - float: none; - padding: 10px 15px 10px; - color: #555; - text-decoration: none; - text-shadow: 0 1px 0 #ffffff; -} -.navbar .nav .dropdown-toggle .caret { - margin-top: 8px; -} -.navbar .nav > li > a:focus, -.navbar .nav > li > a:hover { - background-color: transparent; - color: #333; - text-decoration: none; -} -.navbar .nav > .active > a, -.navbar .nav > .active > a:hover, -.navbar .nav > .active > a:focus { - color: #555; - text-decoration: none; - background-color: #e5e5e5; - -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); -} -.navbar .btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-left: 5px; - margin-right: 5px; - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #ededed; - background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f2f2f2), to(#e5e5e5)); - background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); - border-color: #e5e5e5 #e5e5e5 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #e5e5e5; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); - box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); -} -.navbar .btn-navbar:hover, -.navbar .btn-navbar:active, -.navbar .btn-navbar.active, -.navbar .btn-navbar.disabled, -.navbar .btn-navbar[disabled] { - color: #fff; - background-color: #e5e5e5; - *background-color: #d9d9d9; -} -.navbar .btn-navbar:active, -.navbar .btn-navbar.active { - background-color: #cccccc \9; -} -.navbar .btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} -.navbar .nav > li > .dropdown-menu:before { - content: ''; - display: inline-block; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-bottom-color: rgba(0, 0, 0, 0.2); - position: absolute; - top: -7px; - left: 9px; -} -.navbar .nav > li > .dropdown-menu:after { - content: ''; - display: inline-block; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #fff; - position: absolute; - top: -6px; - left: 10px; -} -.navbar-fixed-bottom .nav > li > .dropdown-menu:before { - border-top: 7px solid #ccc; - border-top-color: rgba(0, 0, 0, 0.2); - border-bottom: 0; - bottom: -7px; - top: auto; -} -.navbar-fixed-bottom .nav > li > .dropdown-menu:after { - border-top: 6px solid #fff; - border-bottom: 0; - bottom: -6px; - top: auto; -} -.navbar .nav li.dropdown.open > .dropdown-toggle, -.navbar .nav li.dropdown.active > .dropdown-toggle, -.navbar .nav li.dropdown.open.active > .dropdown-toggle { - background-color: #e5e5e5; - color: #555; -} -.navbar .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #555; - border-bottom-color: #555; -} -.navbar .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #555; - border-bottom-color: #555; -} -.navbar .pull-right > li > .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right { - left: auto; - right: 0; -} -.navbar .pull-right > li > .dropdown-menu:before, -.navbar .nav > li > .dropdown-menu.pull-right:before { - left: auto; - right: 12px; -} -.navbar .pull-right > li > .dropdown-menu:after, -.navbar .nav > li > .dropdown-menu.pull-right:after { - left: auto; - right: 13px; -} -.navbar .pull-right > li > .dropdown-menu .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { - left: auto; - right: 100%; - margin-left: 0; - margin-right: -1px; - border-radius: 6px 0 6px 6px; -} -.navbar-inverse { - color: #999; -} -.navbar-inverse .navbar-inner { - background-color: #1b1b1b; - background-image: -o-linear-gradient(top, #222222, #111111); - background-image: -webkit-gradient(linear, left top, left bottom, from(#222222), to(#111111)); - background-image: linear-gradient(to bottom, #222222, #111111); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); - border-color: #252525; -} -.navbar-inverse .brand, -.navbar-inverse .nav > li > a { - color: #999; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.navbar-inverse .brand:hover, -.navbar-inverse .nav > li > a:hover { - color: #fff; -} -.navbar-inverse .nav > li > a:focus, -.navbar-inverse .nav > li > a:hover { - background-color: transparent; - color: #fff; -} -.navbar-inverse .nav .active > a, -.navbar-inverse .nav .active > a:hover, -.navbar-inverse .nav .active > a:focus { - color: #fff; - background-color: #111111; -} -.navbar-inverse .navbar-link { - color: #999; -} -.navbar-inverse .navbar-link:hover { - color: #fff; -} -.navbar-inverse .divider-vertical { - border-left-color: #111111; - border-right-color: #222222; -} -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { - background-color: #111111; - color: #fff; -} -.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #999; - border-bottom-color: #999; -} -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.navbar-inverse .navbar-search .search-query { - color: #fff; - background-color: #515151; - border-color: #111111; - -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); - box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); - -webkit-transition: none; - -o-transition: none; - transition: none; -} -.navbar-inverse .navbar-search .search-query:-moz-placeholder { - color: #ccc; -} -.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { - color: #ccc; -} -.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { - color: #ccc; -} -.navbar-inverse .navbar-search .search-query:focus, -.navbar-inverse .navbar-search .search-query.focused { - padding: 5px 15px; - color: #333; - text-shadow: 0 1px 0 #fff; - background-color: #fff; - border: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - outline: 0; -} -.navbar-inverse .btn-navbar { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e0e0e; - background-image: -o-linear-gradient(top, #151515, #040404); - background-image: -webkit-gradient(linear, left top, left bottom, from(#151515), to(#040404)); - background-image: linear-gradient(to bottom, #151515, #040404); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); - border-color: #040404 #040404 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #040404; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.navbar-inverse .btn-navbar:hover, -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active, -.navbar-inverse .btn-navbar.disabled, -.navbar-inverse .btn-navbar[disabled] { - color: #fff; - background-color: #040404; - *background-color: #000000; -} -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active { - background-color: #000000 \9; -} -.breadcrumb { - padding: 8px 15px; - margin: 0 0 20px; - list-style: none; - background-color: #f5f5f5; - border-radius: 4px; -} -.breadcrumb li { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - text-shadow: 0 1px 0 #fff; -} -.breadcrumb .divider { - padding: 0 5px; - color: #ccc; -} -.breadcrumb .active { - color: #999; -} -.modal-open .dropdown-menu { - z-index: 2050; -} -.modal-open .dropdown.open { - *z-index: 2050; -} -.modal-open .popover { - z-index: 2060; -} -.modal-open .tooltip { - z-index: 2080; -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; -} -.modal-backdrop.fade { - opacity: 0; -} -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.modal { - position: fixed; - top: 50%; - left: 50%; - z-index: 1050; - overflow: auto; - width: 560px; - margin: -250px 0 0 -280px; - background-color: #fff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - /* IE6-7 */ - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - background-clip: padding-box; -} -.modal.fade { - -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; - -o-transition: opacity 0.3s linear, top 0.3s ease-out; - transition: opacity 0.3s linear, top 0.3s ease-out; - top: -25%; -} -.modal.fade.in { - top: 50%; -} -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} -.modal-header .close { - margin-top: 2px; -} -.modal-header h3 { - margin: 0; - line-height: 30px; -} -.modal-body { - overflow-y: auto; - max-height: 400px; - padding: 15px; -} -.modal-form { - margin-bottom: 0; -} -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - text-align: right; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - border-radius: 0 0 6px 6px; - -webkit-box-shadow: inset 0 1px 0 #fff; - box-shadow: inset 0 1px 0 #fff; - *zoom: 1; -} -.modal-footer:before, -.modal-footer:after { - display: table; - content: ""; - line-height: 0; -} -.modal-footer:after { - clear: both; -} -.modal-footer .btn + .btn { - margin-left: 5px; - margin-bottom: 0; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.tooltip { - position: absolute; - z-index: 1030; - display: block; - visibility: visible; - padding: 5px; - font-size: 11px; - opacity: 0; - filter: alpha(opacity=0); -} -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.tooltip.top { - margin-top: -3px; -} -.tooltip.right { - margin-left: 3px; -} -.tooltip.bottom { - margin-top: 3px; -} -.tooltip.left { - margin-left: -3px; -} -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #eee; - text-align: center; - text-decoration: none; - background-color: #333; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #333; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #333; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #333; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #333; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - width: 236px; - padding: 1px; - background-color: #fff; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); -} -.popover.top { - margin-bottom: 10px; -} -.popover.right { - margin-left: 10px; -} -.popover.bottom { - margin-top: 10px; -} -.popover.left { - margin-right: 10px; -} -.popover-title { - margin: 0; - padding: 8px 14px; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 5px 5px 0 0; -} -.popover-content { - padding: 9px 14px; -} -.popover-content p, -.popover-content ul, -.popover-content ol { - margin-bottom: 0; -} -.popover .arrow, -.popover .arrow:after { - position: absolute; - display: inline-block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.popover .arrow:after { - content: ""; - z-index: -1; -} -.popover.top .arrow { - bottom: -10px; - left: 50%; - margin-left: -10px; - border-width: 10px 10px 0; - border-top-color: #fff; -} -.popover.top .arrow:after { - border-width: 11px 11px 0; - border-top-color: rgba(0, 0, 0, 0.25); - bottom: -1px; - left: -11px; -} -.popover.right .arrow { - top: 50%; - left: -10px; - margin-top: -10px; - border-width: 10px 10px 10px 0; - border-right-color: #fff; -} -.popover.right .arrow:after { - border-width: 11px 11px 11px 0; - border-right-color: rgba(0, 0, 0, 0.25); - bottom: -11px; - left: -1px; -} -.popover.bottom .arrow { - top: -10px; - left: 50%; - margin-left: -10px; - border-width: 0 10px 10px; - border-bottom-color: #fff; -} -.popover.bottom .arrow:after { - border-width: 0 11px 11px; - border-bottom-color: rgba(0, 0, 0, 0.25); - top: -1px; - left: -11px; -} -.popover.left .arrow { - top: 50%; - right: -10px; - margin-top: -10px; - border-width: 10px 0 10px 10px; - border-left-color: #fff; -} -.popover.left .arrow:after { - border-width: 11px 0 11px 11px; - border-left-color: rgba(0, 0, 0, 0.25); - bottom: -11px; - right: -1px; -} -.label, -.badge { - font-size: 11.844px; - font-weight: bold; - line-height: 14px; - color: #fff; - vertical-align: baseline; - white-space: nowrap; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #999; -} -.label { - padding: 1px 4px 2px; - border-radius: 3px; -} -.badge { - padding: 1px 9px 2px; - border-radius: 9px; -} -a.label:hover, -a.badge:hover { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.label-important, -.badge-important { - background-color: #b94a48; -} -.label-important[href], -.badge-important[href] { - background-color: #953b39; -} -.label-warning, -.badge-warning { - background-color: #f89406; -} -.label-warning[href], -.badge-warning[href] { - background-color: #c67605; -} -.label-success, -.badge-success { - background-color: #468847; -} -.label-success[href], -.badge-success[href] { - background-color: #356635; -} -.label-info, -.badge-info { - background-color: #3a87ad; -} -.label-info[href], -.badge-info[href] { - background-color: #2d6987; -} -.label-inverse, -.badge-inverse { - background-color: #333; -} -.label-inverse[href], -.badge-inverse[href] { - background-color: #1a1a1a; -} -.btn .label, -.btn .badge { - position: relative; - top: -1px; -} -.btn-mini .label, -.btn-mini .badge { - top: 0; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - overflow: hidden; - height: 20px; - margin-bottom: 20px; - background-color: #f7f7f7; - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#f9f9f9)); - background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - border-radius: 4px; -} -.progress .bar { - width: 0%; - height: 100%; - color: #fff; - float: left; - font-size: 12px; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, left top, left bottom, from(#149bdf), to(#0480be)); - background-image: linear-gradient(to bottom, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} -.progress .bar + .bar { - -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); - box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); -} -.progress-striped .bar { - background-color: #149bdf; - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: 40px 40px; -} -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-danger .bar, -.progress .bar-danger { - background-color: #dd514c; - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35)); - background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); -} -.progress-danger.progress-striped .bar, -.progress-striped .bar-danger { - background-color: #ee5f5b; - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-success .bar, -.progress .bar-success { - background-color: #5eb95e; - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, left top, left bottom, from(#62c462), to(#57a957)); - background-image: linear-gradient(to bottom, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); -} -.progress-success.progress-striped .bar, -.progress-striped .bar-success { - background-color: #62c462; - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-info .bar, -.progress .bar-info { - background-color: #4bb1cf; - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9)); - background-image: linear-gradient(to bottom, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); -} -.progress-info.progress-striped .bar, -.progress-striped .bar-info { - background-color: #5bc0de; - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-warning .bar, -.progress .bar-warning { - background-color: #faa732; - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fbb450), to(#f89406)); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); -} -.progress-warning.progress-striped .bar, -.progress-striped .bar-warning { - background-color: #fbb450; - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.pull-right { - float: right; -} -.pull-left { - float: left; -} -.hide { - display: none; -} -.show { - display: block; -} -.invisible { - visibility: hidden; -} -.affix { - position: fixed; -} -[class^="icon-"], -[class*=" icon-"] { - display: inline-block; - width: 16px; - height: 16px; - line-height: 17px; - font-size: 16px; - vertical-align: text-top; -} -.disabled [class^="icon-"], -.disabled [class*=" icon-"], -.btn[disabled] [class^="icon-"], -.btn[disabled] [class*=" icon-"] { - color: grey; -} -.disabled [class^="icon-"].icon-white, -.disabled [class*=" icon-"].icon-white, -.btn[disabled] [class^="icon-"].icon-white, -.btn[disabled] [class*=" icon-"].icon-white { - color: #fff; -} -.icon-folder, -.icon-folder-add, -.icon-list { - line-height: 18px; - font-size: 18px; - margin-top: -1px; - margin-left: -1px; - width: 17px; -} -.iconsize50 { - line-height: 50px; - font-size: 50px; - width: 50px; - height: 50px; -} -.iconsize24 { - line-height: 24px; - font-size: 24px; -} -.iconsize20 { - line-height: 20px; - font-size: 20px; -} -/* White icons with optional class, or on hover/active states of certain elements */ -.icon-white, -.nav > .active > a > [class^="icon-"], -.nav > .active > a > [class*=" icon-"] { - color: #fff; -} -.g-ui-menu .e-item:hover [class^="icon-"], -.g-ui-menu .e-item:hover [class*=" icon-"] { - color: #fff; -} -.icon-none { - background-image: none !important; -} -.icon-checkbox-checked, -.icon-checkbox-unchecked, -.icon-checkbox-partial, -.icon-radio-checked, -.icon-radio-unchecked { - cursor: pointer; - color: #555; - font-size: 1em; -} -.icon-checkbox-checked:hover, -.icon-checkbox-unchecked:hover, -.icon-checkbox-partial:hover, -.icon-radio-checked:hover, -.icon-radio-unchecked:hover, -.icon-checkbox-checked:active, -.icon-checkbox-unchecked:active, -.icon-checkbox-partial:active, -.icon-radio-checked:active, -.icon-radio-unchecked:active { - color: #000; -} -.icon-white.icon-checkbox-checked, -.icon-white.icon-checkbox-unchecked, -.icon-white.icon-checkbox-partial, -.icon-white.icon-radio-checked, -.icon-white.icon-radio-unchecked { - color: #eee; -} -.icon-white.icon-checkbox-checked:hover, -.icon-white.icon-checkbox-unchecked:hover, -.icon-white.icon-checkbox-partial:hover, -.icon-white.icon-radio-checked:hover, -.icon-white.icon-radio-unchecked:hover, -.icon-white.icon-checkbox-checked:active, -.icon-white.icon-checkbox-unchecked:active, -.icon-white.icon-checkbox-partial:active, -.icon-white.icon-radio-checked:active, -.icon-white.icon-radio-unchecked:active { - color: #fff; -} -.iconcolor-display-none { - display: none; -} -.iconcolor-green { - color: green; -} -.iconcolor-red { - color: red; -} -.iconcolor-white { - color: white; -} -.iconcolor-grey { - color: #aaa; -} -.denied-by-browser { - cursor: default; -} -.denied-by-browser .icon-checkbox-checked, -.denied-by-browser icon-checkbox-unchecked { - cursor: default; -} -.right-mini, -.down-mini { - width: 16px; - line-height: 20px; -} -/* -@keyframes rotation { - to {transform: rotate(1turn);} -} - -.icon-spinner { - width: 16px; - height: 16px; - - &:before { - transform-origin: 8px 8px; - margin-top: 1px; - display: inline-block; - font-size: 16px; - line-height: 100%; - } -} -*/ -@-webkit-keyframes rotation { - to { - -webkit-transform: rotate(1turn); - transform: rotate(1turn); - } -} -@keyframes rotation { - to { - -webkit-transform: rotate(1turn); - transform: rotate(1turn); - } -} -.icon-spinner { - font-family: Arial; - height: 11px; - width: 11px; - margin-right: -1px; - background: none; - border: 3px solid #aaa; - border-top-color: #333; - border-radius: 100%; - -webkit-animation: none; - animation: none; -} -.icon-spinner:before { - content: ""; -} -.icon-spinner.animated { - border-color: transparent; - border-top-color: #999; - -webkit-animation: rotation 0.8s infinite ease-in-out; - animation: rotation 0.8s infinite ease-in-out; -} -.icon-spinner.big { - height: 13px; - width: 13px; - margin-top: -2px; - margin-left: -2px; -} -.icon-spinner.white, -.icon-spinner.icon-white { - border-color: #fff; - border-top-color: #999; -} -.icon-spinner.white.animated, -.icon-spinner.icon-white.animated { - border-color: transparent; - border-top-color: #fff; -} -html.no-cssanimations .icon-spinner { - background: none; - background-image: url('images/sync.png'); - background-repeat: no-repeat; - border: none; - -webkit-box-shadow: none; - box-shadow: none; - height: 16px; - width: 16px; - font-family: Arial; -} -html.no-cssanimations .icon-spinner:before { - content: ""; -} -html.no-cssanimations .icon-spinner.animated { - background: none; - background-image: url('images/sync.gif'); -} -body { - background-color: transparent; -} -label { - cursor: pointer; -} -label.inline, -span.inline { - display: inline-block; -} -.close-custom { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 20px; - color: #000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} -.close-custom:hover { - color: #000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - filter: alpha(opacity=40); -} -button.close-custom { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} -.minimize-custom { - border: 0px solid #333; - border-bottom-width: 3px; - display: inline-block; - float: right; - height: 20px; - width: 16px; - font-size: 20px; - font-weight: bold; - line-height: 20px; - margin-right: 15px; - cursor: pointer; -} -.legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: 40px; - color: #333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} -.legend small { - font-size: 15px; - color: #999; -} -.legend + .control-group { - margin-top: 20px; - -webkit-margin-top-collapse: separate; -} -.input-append input, -.input-append select, -.input-append .uneditable-input { - border-radius: 3px; -} -select { - width: 223px; -} -.btn .svg-icon { - vertical-align: middle; -} -.btn-small.btn-small-small { - padding: 3px 9px; - font-size: 11px; - line-height: 11px; -} -.btn.btn-thin { - padding: 4px 9px; -} -.btn.btn-thin-2 { - padding: 4px 7px; -} -.btn.btn-nowrap { - white-space: nowrap; -} -.btn.btn-ellipsis { - -o-text-overflow: ellipsis; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; -} -.btn.btn-transparent { - background: none !important; - border-color: transparent !important; - text-shadow: none !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - opacity: .6; -} -.btn.btn-transparent [class^="icon-"] { - width: 19px; - height: 19px; - line-height: 20px; - font-size: 19px; -} -.btn.btn-transparent:hover { - opacity: 1; -} -.btn-group.open .btn.btn-transparent.dropdown-toggle { - color: #BD362F; -} -.btn-group.open .btn.btn-transparent.dropdown-toggle .caret { - border-top-color: #BD362F; -} -.btn-group.open .btn.btn-transparent.dropdown-toggle [class^="icon-"]:before { - color: #BD362F; -} -.btn.btn-narrow { - padding-left: 12px; - padding-right: 12px; -} -.btn-group.btn-group-custom-margin > .btn + .btn { - margin-left: 0px; -} -.btn.btn-large { - font-size: 17px; -} -.dropdown-menu { - border-radius: 3px; -} -.btn-group + .btn-group { - margin-left: 3px; -} -.btn { - border-radius: 3px; - background-image: none; - padding-left: 13px; - padding-right: 13px; - border-color: rgba(0, 0, 0, 0.25) rgba(0, 0, 0, 0.25) rgba(0, 0, 0, 0.25); -} -.btn.disabled, -.btn[disabled] { - opacity: 0.8; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} -html.textshadow .btn { - text-shadow: 0 1px 0 #fff; -} -html.textshadow .btn.btn-danger, -html.textshadow .btn.btn-success, -html.textshadow .btn.btn-primary, -html.textshadow .btn.btn-warning { - text-shadow: 0 1px 0 rgba(0, 0, 0, 0.3); -} -.btn.btn-dark-disabled-border.disabled, -.btn.btn-dark-disabled-border[disabled] { - border-color: #aaa; -} -.btn.btn-success { - background-color: #84AB04; -} -.btn-toolbar { - margin-top: 0; - margin-bottom: 0; -} -.dropdown-menu { - border-radius: 0; - -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2); - box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2); -} -.tooltip { - font-size: 14px; - z-index: 2000 !important; - overflow: hidden; - -o-text-overflow: ellipsis; - text-overflow: ellipsis; -} -.tooltip.in { - opacity: 1; -} -.tooltip .tooltip-inner { - max-width: 380px; - text-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2); - padding: 5px 10px; - border-radius: 2px; - overflow: hidden; - -o-text-overflow: ellipsis; - text-overflow: ellipsis; -} -.tooltip .tooltip-big { - font-size: 18px; - padding: 0 10px; - white-space: nowrap; -} -.popover { - width: auto; - min-width: 250px; - max-width: 550px; -} -.popover .popover-content pre { - border: none; - background: rgba(0, 0, 0, 0); - padding: 0; - word-break: normal; -} -.btn-group > .btn { - border-radius: 0 !important; -} -.btn-group > .btn.single { - border-radius: 3px !important; -} -.btn-group > .btn.first { - border-top-left-radius: 3px !important; - border-bottom-left-radius: 3px !important; -} -.btn-group > .btn.last { - border-top-right-radius: 3px !important; - border-bottom-right-radius: 3px !important; -} -.btn-group + .btn-group { - margin-left: 0; -} -.btn-group { - margin-right: 3px; -} -.btn-group.btn-group-last { - margin-right: 0; -} -.dropdown.colored-toggle.open .btn.dropdown-toggle { - color: #BD362F; -} -.dropdown.colored-toggle.open .btn.dropdown-toggle .caret { - border-top-color: #BD362F; -} -.dropdown.colored-toggle.open .btn.dropdown-toggle [class^="icon-"]:before { - color: #BD362F; -} -textarea, -input[type="text"], -input[type="password"], -input[type="email"], -input[type="search"] { - border: 1px solid #ccc; -} -textarea:focus, -input[type="text"]:focus, -input[type="password"]:focus, -input[type="email"]:focus, -input[type="search"]:focus { - background-color: #fff; - border: 1px solid #999999; - -webkit-box-shadow: none; - box-shadow: none; -} -input[type="text"], -input[type="password"], -input[type="email"], -input[type="search"] { - height: 20px; - line-height: 20px; -} -select { - border: 1px solid #ccc; -} -.alert a { - text-decoration: underline; -} -.alert.alert-null-left-margin { - margin-left: 0; -} -.alert a { - color: #c09853; -} -.alert.alert-info a { - color: #3a87ad; -} -.alert.alert-error a { - color: #b94a48; -} -.nav-tabs > li > a { - color: #555; -} -.popover { - z-index: 2000; -} -html.no-rgba .modal { - border-width: 0px !important; -} -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.2; - filter: alpha(opacity=20); - -webkit-transform: none; - -ms-transform: none; - transform: none; -} -.popups { - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - z-index: 1100; - overflow: auto; -} -.popups .modal { - position: static; - z-index: 1101; - margin: 5% auto; - background-color: transparent; - overflow: hidden; - -webkit-box-shadow: 0 5px 80px rgba(0, 0, 0, 0.3); - box-shadow: 0 5px 80px rgba(0, 0, 0, 0.3); -} -.popups .modal .modal-body { - background-color: #fff; - max-height: none; -} -.modal.fade { - -webkit-transition: none; - -o-transition: none; - transition: none; - top: 0; -} -.modal.fade.in { - top: 0; -} -.modal.loginContent .modal-body, -.modal.loginAdminContent .modal-body { - background-color: transparent !important; -} -.picker.modal-dialog-bg, -.picker.picker-dialog-bg { - z-index: 2000 !important; -} -.picker.modal-dialog, -.picker.picker-dialog { - z-index: 2001 !important; -} -.form-horizontal.long-label .control-group .control-label { - width: 160px; -} -.form-horizontal.long-label .control-group .controls { - margin-left: 180px; -} -.control-label.remove-padding-top { - padding-top: 0; -} -html.rl-mobile .popups .modal { - width: 100% !important; - width: calc(100% - 20px) !important; -} -html.rl-mobile .b-settings-content { - padding: 10px; - padding-left: 20px; -} -html.rl-mobile .list-table { - width: 100%; - max-width: 100%; -} -html.rl-mobile .form-horizontal .control-group .control-label { - text-align: left; - float: none; -} -html.rl-mobile .form-horizontal .control-group .controls { - margin-left: 0; -} -.close-input-wrp { - display: inline-block; - position: relative; -} -.close-input-wrp input { - padding-right: 15px; -} -.close-input-wrp .close { - position: absolute; - right: 0; - top: 5px; - margin: 0 7px; - z-index: 100; - vertical-align: middle; - opacity: .4; -} -.close-input-wrp .close:hover { - opacity: .6; -} -.inputosaurus-container { - width: 99%; - line-height: 20px; - padding: 2px; - border: 1px solid #cccccc; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear .2s, box-shadow linear .2s; - -o-transition: border linear .2s, box-shadow linear .2s; - -webkit-transition: border linear .2s, -webkit-box-shadow linear .2s; - transition: border linear .2s, -webkit-box-shadow linear .2s; - transition: border linear .2s, box-shadow linear .2s; - transition: border linear .2s, box-shadow linear .2s, -webkit-box-shadow linear .2s; -} -.inputosaurus-container.inputosaurus-focused { - background-color: #fff; - border: 1px solid #999999; - -webkit-box-shadow: none; - box-shadow: none; -} -.inputosaurus-container li { - max-width: 500px; - background-color: #eee; - border: 1px solid #aaa; - line-height: 18px; - padding: 2px 15px 2px 5px; - margin: 2px 2px 2px; - color: #555; - z-index: 100; - position: relative; -} -.inputosaurus-container li.ui-draggable.ui-draggable-dragging { - z-index: 101; -} -.inputosaurus-container li a { - color: #999; - font-size: 12px; - position: absolute; - top: 1px; - right: 2px; -} -.inputosaurus-container li a:hover { - color: #666; -} -.inputosaurus-container li span { - padding-right: 3px; -} -.inputosaurus-container li.inputosaurus-required { - padding-right: 5px; -} -.inputosaurus-container li.inputosaurus-selected { - background-color: #ddd; -} -.inputosaurus-container li.pgp { - background-color: #E5F3E2; -} -.inputosaurus-container .inputosaurus-input { - margin: 1px 10px 1px 0px; - height: 22px; -} -.inputosaurus-container .inputosaurus-input input { - border: 0px; - height: 21px; - padding-left: 0; -} -.ui-autocomplete { - z-index: 2000; -} -.inputosaurus-fake-span { - position: absolute; - top: 0; - left: -5000px; -} -/*.cke_button__sourcedialog_label { - display: none !important; -}*/ -.cke_chrome { - border: 1px solid #ccc !important; -} -.cke_toolgroup { - padding-right: 0 !important; - background: #FBFBFB !important; -} -.cke_toolgroup, -.cke_combo_button { - border: 1px solid #A6A6A6 !important; -} -.cke_top { - padding: 6px 4px 1px 6px !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - border-bottom: 1px solid #b6b6b6 !important; - background: #F0F0F0 !important; -} -.cke_combo_on a.cke_combo_button, -.cke_combo_off a.cke_combo_button:hover, -.cke_combo_off a.cke_combo_button:focus, -.cke_combo_off a.cke_combo_button:active { - padding: 1px !important; - margin-left: 0 !important; -} -.cke_toolgroup a.cke_button:last-child:after, -.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after { - border: none !important; - height: 0 !important; - width: 0 !important; - margin: 0 !important; - padding: 0 !important; -} -.cke_button_on { - background: #ddd !important; -} -.cke_combo { - margin-top: 1px !important; -} -.cke_combo__fontsize { - margin-left: 3px !important; -} -.cke_combo__fontsize .cke_combo_text { - width: 40px !important; -} -.cke_combo_text { - line-height: 24px !important; - padding-left: 8px !important; -} -.cke_combo_button { - background: #FBFBFB !important; -} -.cke_source { - font-family: Monaco, Menlo, Consolas, 'Courier New', monospace !important; - padding: 10px !important; - padding-right: 0 !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; -} -.cke_plain { - background-color: #fff; - outline: none; - overflow: auto; - z-index: 1; - margin: 0; - border: 0; - padding: 10px; - padding-right: 0; - white-space: pre-wrap; - font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; - font-size: 13px; - line-height: 16px; - color: #333; - resize: none; - border-radius: 0; - -webkit-box-shadow: none; - box-shadow: none; - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -.cke_plain:focus, -.cke_source:focus { - border: 0; -} -.b-compose .cke_chrome { - border-right: 0; - border-left: 0; - border-bottom: 0; - -webkit-box-shadow: none; - box-shadow: none; -} -.cke_wysiwyg_div { - padding: 10px !important; - font-family: arial, sans-serif; - font-size: 13px; - line-height: 16px; - color: #333; -} -.cke_wysiwyg_div ul { - padding-left: 40px; -} -.cke_wysiwyg_div ul li { - list-style-type: disc !important; -} -.cke_wysiwyg_div ol { - padding-left: 40px; -} -.cke_wysiwyg_div ol li { - list-style-type: decimal !important; -} -.cke_wysiwyg_div pre, -.cke_wysiwyg_div code { - margin: 0px; - padding: 0px; - background: #fff; - border: none; - border-radius: 0; - font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; - display: block; - word-break: normal; - word-wrap: break-word; - background-color: #f9f9f9; -} -.cke_wysiwyg_div code { - display: inline; - padding: 2px 5px; -} -.cke_wysiwyg_div pre { - padding: 5px 10px; - border-radius: 5px; - background-color: #f9f9f9; -} -.cke_wysiwyg_div pre > code { - padding: 0px; -} -.cke_wysiwyg_div blockquote { - border: 0; - border-left: solid 2px #444; - margin: 5px 0 5px 5px; - padding-left: 5px; -} -.cke_wysiwyg_div blockquote p { - margin: 0 0 10px; - font-size: 14px; - line-height: 20px; -} -.cke_wysiwyg_div img { - vertical-align: bottom; -} -.cke_wysiwyg_div a { - color: blue; - text-decoration: underline; -} -.cke_wysiwyg_div a:visited { - color: #609; -} -.cke_wysiwyg_div a:active { - color: red; -} -.cke_dialog a:hover { - text-decoration: none; -} -.cke_dialog .cke_dialog_ui_labeled_content { - margin-top: 5px; - margin-bottom: 5px; -} -.cke_dialog .cke_dialog_ui_input_select, -.cke_dialog .cke_dialog_ui_input_text, -.cke_dialog .cke_dialog_ui_input_textarea { - -webkit-box-shadow: none; - box-shadow: none; - border-radius: 2px; -} -.cke_dialog .cke_dialog_ui_input_select:focus, -.cke_dialog .cke_dialog_ui_input_text:focus, -.cke_dialog .cke_dialog_ui_input_textarea:focus { - outline: 0; - border: 1px solid #999; -} -.cke_dialog .cke_dialog_ui_input_select, -.cke_dialog .cke_dialog_ui_input_text { - height: 25px; - line-height: 25px; -} -.g-ui-user-select-allow { - webkit-touch-callout: inherit; - -webkit-user-select: inherit; - -moz-user-select: inherit; - -ms-user-select: inherit; - user-select: inherit; - standard-user-select: inherit; - touch-callout: inherit; -} -.g-ui-clearfix { - *zoom: 1; -} -.g-ui-clearfix:before, -.g-ui-clearfix:after { - display: table; - content: ""; - line-height: 0; -} -.g-ui-clearfix:after { - clear: both; -} -.g-ui-link { - color: #336699; - text-decoration: underline; - cursor: pointer; - padding: 2px; -} -.g-ui-link:focus { - outline: 1px; - outline-style: dotted; -} -.g-ui-min-height-300 { - min-height: 300px; -} -.g-ui-100-proc-height { - height: 100%; -} -.g-ui-absolute-reset { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: 0; - margin: 0; - border: 0; - z-index: 0; -} -.g-ui-menu { - max-height: 400px; - max-width: 300px; - overflow-y: auto; - overflow-x: hidden; -} -.g-ui-menu .e-link { - text-decoration: none; - cursor: pointer; -} -.g-ui-menu .e-item.selected > .e-link { - background-color: #eee !important; -} -.g-ui-menu .e-item > .e-link:focus, -.g-ui-menu .e-item > .e-link:hover { - background-color: #555; - background-image: none; - color: #fff; -} -.g-ui-menu .e-item.disabled > .e-link { - cursor: not-allowed; - background-color: #fff; - background-image: none; - color: grey; -} -.g-ui-menu .e-item.disabled [class^="icon-"] { - color: grey; -} -.g-ui-table { - display: table; - width: 100%; -} -.g-ui-table .e-row { - display: table-row; -} -.g-ui-table .e-cell { - display: table-cell; - vertical-align: top; - text-align: left; -} -.g-ui-height-100proc { - height: 100%; -} -.g-ui-resizable-delimiter-highlight { - border: none; - border-right: 6px solid #aaa; -} -.e-pagenator .e-page { - display: inline-block; - color: #999; - text-decoration: none; - font-size: 22px; - padding: 3px; - cursor: pointer; -} -.e-pagenator .e-page:hover .e-page-number { - color: #555; -} -.e-pagenator .e-page.current .e-page-number { - font-size: 25px; - color: #333; - border-bottom: 2px solid #000; -} -html.rgba .g-ui-resizable-delimiter-highlight { - border-right-color: rgba(0, 0, 0, 0.2); -} -.settings-saved-trigger { - display: inline-block; - line-height: 17px; - font-size: 16px; -} -.settings-saved-trigger .animated { - color: green; -} -.settings-saved-trigger .success { - color: green; - -webkit-transition: opacity 0.5s linear; - -o-transition: opacity 0.5s linear; - transition: opacity 0.5s linear; - opacity: 0; -} -.settings-saved-trigger .error { - color: red; - -webkit-transition: opacity 0.5s linear; - -o-transition: opacity 0.5s linear; - transition: opacity 0.5s linear; - opacity: 0; -} -.settings-saved-trigger .visible { - opacity: 1; -} -.settings-saved-trigger-input.success { - border-color: green !important; - -webkit-transition: border-color 0.5s linear; - -o-transition: border-color 0.5s linear; - transition: border-color 0.5s linear; -} -.settings-saved-trigger-input.error { - border-color: red !important; - -webkit-transition: border-color 0.5s linear; - -o-transition: border-color 0.5s linear; - transition: border-color 0.5s linear; -} -.display-none { - display: none; -} -.e-spinner { - display: none; -} -.e-powered, -.e-mobile-switcher { - margin-top: 8px; - color: #333; -} -.e-powered a, -.e-mobile-switcher a { - color: #333; - text-decoration: underline; -} -.e-powered a:hover, -.e-mobile-switcher a:hover { - color: #333; -} -.e-languages { - margin-top: 8px; - color: #333; -} -.e-languages .flag-name { - color: #333; - border-bottom: 1px dashed #333; - cursor: pointer; - padding: 2px 0px; -} -.e-languages .flag-name:focus { - outline: 1px; - outline-style: dotted; -} -html.cssanimations .e-spinner { - display: block; - margin: 5px auto 0; - width: 100px; - text-align: center; -} -html.cssanimations .e-spinner .e-bounce { - width: 15px; - height: 15px; - background-color: #ddd; - margin: 0 5px; - -webkit-box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.3); - box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.3); - border-radius: 100%; - display: inline-block; - -webkit-animation: bouncedelay 1.4s infinite ease-in-out; - animation: bouncedelay 1.4s infinite ease-in-out; - /* Prevent first frame from flickering when animation starts */ - -webkit-animation-fill-mode: both; - animation-fill-mode: both; -} -html.cssanimations .e-spinner .bounce1 { - -webkit-animation-delay: -0.32s; - animation-delay: -0.32s; -} -html.cssanimations .e-spinner .bounce2 { - -webkit-animation-delay: -0.16s; - animation-delay: -0.16s; -} -@-webkit-keyframes bouncedelay { - 0%, - 80%, - 100% { - -webkit-transform: scale(0); - transform: scale(0); - } - 40% { - -webkit-transform: scale(1); - transform: scale(1); - } -} -@keyframes bouncedelay { - 0%, - 80%, - 100% { - -webkit-transform: scale(0); - transform: scale(0); - } - 40% { - -webkit-transform: scale(1); - transform: scale(1); - } -} -.command.command-disabled.hide-on-disabled-command { - display: none; -} -html { - margin: 0; - padding: 0; - overflow: hidden; - font-family: Arial, Verdana, Geneva, sans-serif; - height: 100%; -} -body { - margin: 0; - padding: 0; - overflow: hidden; - background-color: #e3e3e3; - font-family: Arial, Verdana, Geneva, sans-serif; - -webkit-touch-callout: none; - position: absolute; - top: 0; - left: 0; - bottom: 0; - right: 0; - height: 100%; -} -textarea { - resize: none; -} -option:disabled { - color: #aaa; - cursor: not-allowed; -} -body:before { - content: ""; - position: fixed; - top: -10px; - left: 0; - width: 100%; - height: 8px; - z-index: 100; - -webkit-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.6); - box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.6); -} -* { - outline: none; -} -select:focus { - outline: none; -} -html.mobile *, -html.rl-mobile * { - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -input[type="search"] { - -webkit-box-sizing: content-box; - box-sizing: content-box; -} -input::-ms-clear, -input::-ms-reveal { - display: none; -} -#rl-bg { - z-index: -1; - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; -} -#rl-content { - height: 100%; - width: 100%; -} -#rl-center { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: 0; - margin: 0; - border: 0; - z-index: 0; - min-width: 600px; - min-height: 400px; -} -html.rl-mobile #rl-center { - min-width: 250px; - min-height: 250px; -} -html.rl-mobile.rl-left-panel-enabled #rl-right { - right: -150px; -} -html.rl-mobile.rl-left-panel-disabled #rl-right { - left: 5px !important; -} -#rl-top { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: 0; - margin: 0; - border: 0; - z-index: 0; - bottom: auto; - z-index: 2; -} -#rl-bottom { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: 0; - margin: 0; - border: 0; - z-index: 0; - top: auto; - z-index: 1; -} -#rl-left { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: 0; - margin: 0; - border: 0; - z-index: 0; - width: 200px; - min-width: 60px; -} -#rl-right { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: 0; - margin: 0; - border: 0; - z-index: 0; - z-index: 1; - left: 200px; -} -#rl-sub-left { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 500px; -} -#rl-sub-right { - position: absolute; - top: 0; - bottom: 0; - right: 0; - left: 500px; -} -#rl-sub-right .b-message-view-backdrop { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba(0, 0, 0, 0.4); - z-index: 10; -} -#rl-sub-right .b-message-view-backdrop .backdrop-message-wrp { - position: absolute; - top: calc(50% - 50px); - left: 0; - right: 0; - text-align: center; -} -#rl-sub-right .b-message-view-backdrop .backdrop-message-wrp .backdrop-message { - display: inline-block; - color: white; - font-size: 20px; - line-height: 30px; - background: rgba(0, 0, 0, 0.6); - padding: 15px; - border-radius: 5px; - text-shadow: 0px 1px 1px #000; -} -html.ssm-state-desktop-large #rl-left { - width: 220px; -} -html.ssm-state-desktop-large #rl-right { - left: 220px; -} -html.ssm-state-desktop-large #rl-sub-left { - width: 500px; -} -html.ssm-state-desktop-large #rl-sub-right { - left: 500px; -} -html.ssm-state-desktop-large .b-compose.modal { - width: 1000px; -} -html.ssm-state-desktop-large .b-contacts-content.modal { - width: 900px; -} -html.ssm-state-desktop #rl-left { - width: 200px; -} -html.ssm-state-desktop #rl-right { - left: 200px; -} -html.ssm-state-desktop #rl-sub-left { - width: 400px; -} -html.ssm-state-desktop #rl-sub-right { - left: 400px; -} -html.ssm-state-desktop .b-compose.modal { - width: 1000px; -} -html.ssm-state-desktop .b-contacts-content.modal { - width: 900px; -} -html.ssm-state-tablet #rl-left, -html.ssm-state-mobile #rl-left { - width: 155px; -} -html.ssm-state-tablet #rl-right, -html.ssm-state-mobile #rl-right { - left: 155px; -} -html.ssm-state-tablet #rl-sub-left, -html.ssm-state-mobile #rl-sub-left { - width: 310px; -} -html.ssm-state-tablet #rl-sub-left .messageList .inputSearch, -html.ssm-state-mobile #rl-sub-left .messageList .inputSearch { - width: 200px; -} -html.ssm-state-tablet #rl-sub-right, -html.ssm-state-mobile #rl-sub-right { - left: 310px; -} -html.ssm-state-tablet .b-compose.modal, -html.ssm-state-mobile .b-compose.modal { - width: 720px; -} -html.ssm-state-tablet .b-contacts-content.modal, -html.ssm-state-mobile .b-contacts-content.modal { - width: 700px; -} -html.ssm-state-tablet .b-contacts-content.modal .contactValueInput, -html.ssm-state-mobile .b-contacts-content.modal .contactValueInput { - width: 200px; -} -html.ssm-state-tablet .b-compose.modal { - width: 720px; -} -html.ssm-state-tablet .b-contacts-content.modal { - width: 800px; -} -html.ssm-state-tablet .b-contacts-content.modal .contactValueInput { - width: 250px; -} -.show-on-panel-disabled { - display: none; -} -html.rl-left-panel-disabled #rl-left { - width: 60px !important; -} -html.rl-left-panel-disabled #rl-left .show-on-panel-disabled { - display: block; -} -html.rl-left-panel-disabled #rl-left .opacity-on-panel-disabled { - opacity: 0.3; -} -html.rl-left-panel-disabled #rl-left .visibility-hidden-on-panel-disabled { - visibility: hidden; -} -html.rl-left-panel-disabled #rl-left .hide-on-panel-disabled { - display: none; -} -html.rl-left-panel-disabled #rl-left.ui-state-disabled { - opacity: 1; -} -html.rl-left-panel-disabled #rl-right { - left: 60px !important; -} -html.rl-left-panel-short #rl-left { - width: 60px !important; -} -html.rl-left-panel-short #rl-right { - left: 60px !important; -} -html.rl-left-panel-none #rl-left { - width: 10px !important; -} -html.rl-left-panel-none #rl-right { - left: 10px !important; -} -.ui-resizable-helper-w { - border-right: 5px solid #777; - border-right-color: rgba(255, 255, 255, 0.7); -} -.ui-resizable-helper-h { - border-bottom: 5px solid #ccc; - border-bottom-color: rgba(0, 0, 0, 0.3); -} -.ui-resizable-handle:hover { - background: #aaa; - background: rgba(255, 255, 255, 0.5); -} -html.rl-no-preview-pane #rl-sub-left { - right: 5px !important; - width: inherit; -} -html.rl-no-preview-pane #rl-sub-left .messageList .inputSearch { - width: 300px !important; -} -html.rl-no-preview-pane #rl-sub-right { - left: 0 !important; -} -html.rl-no-preview-pane #rl-right .ui-resizable-handle { - display: none !important; -} -html.rl-side-preview-pane #rl-right .ui-resizable-handle { - display: none !important; -} -html.rl-bottom-preview-pane #rl-sub-left { - right: 5px !important; - width: inherit; -} -html.rl-bottom-preview-pane #rl-sub-left .b-message-list-wrapper { - bottom: inherit; - height: 300px; - -webkit-box-shadow: none; - box-shadow: none; -} -html.rl-bottom-preview-pane #rl-sub-left .messageList .inputSearch { - width: 300px !important; -} -html.rl-bottom-preview-pane #rl-sub-right { - left: 0 !important; -} -html.rl-bottom-preview-pane #rl-sub-right .messageView .top-toolbar { - display: none; -} -html.rl-bottom-preview-pane #rl-sub-right .b-message-view-wrapper { - top: 356px; - left: 0; - right: 5px; - -webkit-box-shadow: none; - box-shadow: none; -} -.visible-on-ctrl, -.visible-on-ctrl-btn { - display: none; -} -.hidden-on-ctrl-btn { - display: inline-block; -} -html.rl-ctrl-key-pressed .visible-on-ctrl { - display: inline-block; -} -html.rl-ctrl-key-pressed .btn-group.open .visible-on-ctrl-btn { - display: inline-block; -} -html.rl-ctrl-key-pressed .hidden-on-ctrl { - display: none; -} -html.rl-ctrl-key-pressed .btn-group.open .hidden-on-ctrl-btn { - display: none; -} -#rl-loading, -#rl-loading-error { - position: absolute; - font-size: 30px; - line-height: 130%; - top: 50%; - width: 100%; - height: 65px; - margin: 0; - margin-top: -60px; - background-color: transparent; - text-align: center; - color: #000; -} -#rl-loading-error { - background-image: none; - display: none; -} -#rl-loading-error-additional { - margin-top: 20px; - font-size: 20px; -} -#rl-app { - display: none; -} -#rl-check { - display: none; -} -.rl-content-show { - display: block !important; -} -html.rl-mobile .hide-on-mobile { - display: none !important; -} -.show-on-mobile { - display: none !important; -} -html.rl-mobile .show-on-mobile { - display: initial !important; -} -html.rl-mobile .width100-on-mobile { - width: 100% !important; -} -.nano.scroller-shadow-top:before, -.nano.scroller-shadow-bottom:after { - content: ""; - position: absolute; - left: 0; - width: 100%; - height: 10px; - z-index: 102; - -webkit-box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.4); - box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.4); -} -.nano.scroller-shadow-top:before { - top: -10px; -} -.nano.scroller-shadow-bottom:after { - bottom: -10px; -} -.nano.fixIndex.scroller-shadow-top:before, -.nano.fixIndex.scroller-shadow-bottom:after { - z-index: 98; -} -/* -.nano { - .pane .slider { - .transition(top 0.1s ease-out); - } - - .pane2 .slider2 { - .transition(left 0.1s ease-out); - } - - .pane.active .slider, .pane2.active .slider2 { - .transition(none); - } -} -*/ -.e-component.e-select select:focus { - outline: 1px; - outline-style: dotted; -} -.e-component.e-checkbox { - margin-bottom: 6px; - margin-left: -2px; - padding: 2px; - cursor: pointer; -} -.e-component.e-checkbox:focus { - outline: 1px; - outline-style: dotted; -} -.e-component.e-checkbox .e-checkbox-icon { - padding: 1px 0 0 1px; -} -.e-component.e-checkbox.disabled { - cursor: default; - color: #999; - outline: 0; - outline-style: none; -} -.e-component.e-radio { - cursor: pointer; -} -.e-component.e-radio.disabled { - cursor: default; - color: #999; -} -.e-component.material-design.e-checkbox { - margin-top: 2px; - padding: 2px 2px 1px 2px; -} -.e-component.material-design.e-checkbox .sub-checkbox-container { - display: inline-block; - position: relative; - -webkit-transform: translateZ(0); - transform: translateZ(0); - width: 18px; - height: 18px; - vertical-align: bottom; - margin-bottom: 3px; -} -.e-component.material-design.e-checkbox .sub-label { - padding-left: 12px; -} -.e-component.material-design.e-checkbox .sub-checkbox { - position: absolute; - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin-top: 1px; - top: 0px; - left: 0px; - width: 18px; - height: 18px; - border: solid 2px #999; - -webkit-transform: rotate(0deg); - -ms-transform: rotate(0deg); - transform: rotate(0deg); -} -.e-component.material-design.e-checkbox .sub-checkbox.checked { - border-top: none; - border-left: none; - border-color: #0F9D58; - /* top: -4px; - left: 6px; - width: 10px; - height: 21px;*/ - top: -1px; - left: 5px; - width: 10px; - height: 18px; - border-right-width: 2px; - border-bottom-width: 2px; - -webkit-transform: rotate(45deg); - -ms-transform: rotate(45deg); - transform: rotate(45deg); -} -.e-component.material-design.e-checkbox .sub-checkbox.checked.box { - border: solid 2px; - -webkit-animation: box-shrink 140ms ease-out forwards; - animation: box-shrink 140ms ease-out forwards; -} -.e-component.material-design.e-checkbox .sub-checkbox.checked.checkmark { - border-left: none; - border-top: none; - -webkit-animation: checkmark-expand 140ms ease-out forwards; - animation: checkmark-expand 140ms ease-out forwards; -} -.e-component.material-design.e-checkbox .sub-checkbox.unchecked.box { - -webkit-animation: box-expand 140ms ease-out forwards; - animation: box-expand 140ms ease-out forwards; -} -.e-component.material-design.e-checkbox .sub-checkbox.unchecked.checkmark { - border-left: none; - border-top: none; - -webkit-transform: rotate(45deg); - -ms-transform: rotate(45deg); - transform: rotate(45deg); - -webkit-animation: checkmark-shrink 140ms ease-out forwards; - animation: checkmark-shrink 140ms ease-out forwards; -} -.e-component.material-design.e-checkbox.disabled .sub-checkbox { - border-color: #aaa; - cursor: not-allowed; - color: #aaa; -} -.e-component.material-design.e-checkbox.disabled .sub-label { - cursor: not-allowed; - color: #aaa; -} -@-webkit-keyframes box-shrink { - 0% { - top: 0px; - left: 0px; - width: 18px; - height: 18px; - border: solid 2px #999; - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - top: 13px; - left: 5px; - width: 4px; - height: 4px; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - } -} -@keyframes box-shrink { - 0% { - top: 0px; - left: 0px; - width: 18px; - height: 18px; - border: solid 2px #999; - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - top: 13px; - left: 5px; - width: 4px; - height: 4px; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - } -} -@-webkit-keyframes checkmark-expand { - 0% { - top: 13px; - left: 5px; - width: 4px; - height: 4px; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - } - 100% { - /* top: -4px; - left: 6px; - width: 10px; - height: 21px;*/ - top: -1px; - left: 5px; - width: 10px; - height: 18px; - border-right-width: 2px; - border-bottom-width: 2px; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - } -} -@keyframes checkmark-expand { - 0% { - top: 13px; - left: 5px; - width: 4px; - height: 4px; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - } - 100% { - /* top: -4px; - left: 6px; - width: 10px; - height: 21px;*/ - top: -1px; - left: 5px; - width: 10px; - height: 18px; - border-right-width: 2px; - border-bottom-width: 2px; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - } -} -@-webkit-keyframes checkmark-shrink { - 0% { - /* top: -4px; - left: 6px; - width: 10px; - height: 21px;*/ - top: -1px; - left: 5px; - width: 10px; - height: 18px; - border-right-width: 2px; - border-bottom-width: 2px; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - } - 100% { - top: 13px; - left: 5px; - width: 4px; - height: 4px; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - } -} -@keyframes checkmark-shrink { - 0% { - /* top: -4px; - left: 6px; - width: 10px; - height: 21px;*/ - top: -1px; - left: 5px; - width: 10px; - height: 18px; - border-right-width: 2px; - border-bottom-width: 2px; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - } - 100% { - top: 13px; - left: 5px; - width: 4px; - height: 4px; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - } -} -@-webkit-keyframes box-expand { - 0% { - top: 13px; - left: 5px; - width: 4px; - height: 4px; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - } - 100% { - top: 0px; - left: 0px; - width: 18px; - height: 18px; - border: solid 2px #999; - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } -} -@keyframes box-expand { - 0% { - top: 13px; - left: 5px; - width: 4px; - height: 4px; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - } - 100% { - top: 0px; - left: 0px; - width: 18px; - height: 18px; - border: solid 2px #999; - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } -} -.b-system-drop-down .b-toolbar { - position: absolute; - top: 0; - right: 0; - height: 30px; - padding: 10px 8px; - z-index: 103; -} -.b-system-drop-down .e-facebook-name { - display: inline-block; - padding-top: 4px; -} -.b-system-drop-down .btn.system-dropdown { - padding-left: 10px; - padding-right: 10px; -} -.b-system-drop-down .button-fb-logout { - margin: 5px; -} -.b-system-drop-down .email-title { - display: inline-block; - max-width: 200px; - text-align: left; - -o-text-overflow: ellipsis; - text-overflow: ellipsis; - overflow: hidden; - margin-right: 28px; - vertical-align: middle; -} -.b-system-drop-down .logoPlace { - margin: -5px 10px 0 0; - font-size: 25px; - line-height: 30px; - height: 40px; -} -.b-system-drop-down .audioPlace { - font-size: 25px; - line-height: 30px; - margin-right: 10px; - width: 25px; -} -.b-system-drop-down .audioPlace .playIcon, -.b-system-drop-down .audioPlace .stopIcon { - cursor: pointer; - color: orange; - text-shadow: 0 1px 0 #555; - float: right; -} -.b-system-drop-down .audioPlace .playIcon { - margin-top: 5px; -} -.b-system-drop-down .audioPlace .stopIcon { - font-size: 30px; - line-height: 30px; - margin-right: 10px; -} -.b-system-drop-down .audioPlace .stopIcon { - display: none; -} -.b-system-drop-down .audioPlace:hover .playIcon { - display: none; -} -.b-system-drop-down .audioPlace:hover .stopIcon { - display: inline-block; -} -.b-system-drop-down .accountPlace { - background-color: #000; - background-color: rgba(0, 0, 0, 0.5); - color: #fff; - text-shadow: 0 1px 0 #000; - display: inline-block; - height: 29px; - max-width: 250px; - font-size: 16px; - line-height: 30px; - padding: 1px 8px; - overflow: hidden; - -o-text-overflow: ellipsis; - text-overflow: ellipsis; - border-radius: 4px; - font-weight: bold; - margin-right: 5px; - white-space: nowrap; -} -.b-system-drop-down .account-item .icon-ok { - display: none; -} -.b-system-drop-down .account-item.current .icon-ok { - display: inline-block; -} -.b-system-drop-down .account-item.current .icon-user { - display: none; -} -.b-system-drop-down .counter { - display: inline-block; -} -.b-system-drop-down .g-ui-menu .e-link.account-item { - padding-right: 5px; -} -html.ssm-state-mobile .accountPlace { - max-width: 150px !important; -} -@-webkit-keyframes firstBar { - 0% { - height: 30%; - } - 50% { - height: 100%; - } - 100% { - height: 30%; - } -} -@keyframes firstBar { - 0% { - height: 30%; - } - 50% { - height: 100%; - } - 100% { - height: 30%; - } -} -@-webkit-keyframes secondBar { - 0% { - height: 90%; - } - 50% { - height: 30%; - } - 100% { - height: 100%; - } -} -@keyframes secondBar { - 0% { - height: 90%; - } - 50% { - height: 30%; - } - 100% { - height: 100%; - } -} -@-webkit-keyframes thirdBar { - 0% { - height: 20%; - } - 40% { - height: 40%; - } - 60% { - height: 80%; - } - 100% { - height: 40%; - } -} -@keyframes thirdBar { - 0% { - height: 20%; - } - 40% { - height: 40%; - } - 60% { - height: 80%; - } - 100% { - height: 40%; - } -} -.equaliser { - width: 20px; - height: 20px; - position: relative; -} -.equaliser .bar { - float: left; - width: 5px; - height: 5px; - background: orange; - position: absolute; - bottom: 0; -} -.equaliser .first { - left: 0px; - -webkit-animation: none; - animation: none; -} -.equaliser .second { - left: 7px; - -webkit-animation: none; - animation: none; -} -.equaliser .third { - left: 14px; - -webkit-animation: none; - animation: none; -} -.equaliser.animated .first { - -webkit-animation: firstBar 1s infinite; - animation: firstBar 1s infinite; -} -.equaliser.animated .second { - -webkit-animation: secondBar 1s infinite; - animation: secondBar 1s infinite; -} -.equaliser.animated .third { - -webkit-animation: thirdBar 1s infinite; - animation: thirdBar 1s infinite; -} -.b-login-content { - height: 100%; - text-align: center; -} -.b-login-content .loginFormWrapper { - display: inline-block; - vertical-align: middle; - text-align: center; - -webkit-perspective: 500px; - perspective: 500px; - /* .control-label { - font-size: 16px; - line-height: 30px; - }*/ -} -.b-login-content .loginFormWrapper .descWrapper { - margin-bottom: 10px; -} -.b-login-content .loginFormWrapper .descWrapper .desc { - font-size: 18px; - padding: 2px; -} -.b-login-content .loginFormWrapper .alertError { - max-width: 450px; -} -.b-login-content .loginFormWrapper .loginForm { - background-color: #efefef; - text-align: left; - color: #333; - margin: 0; - float: none; - width: 303px; -} -.b-login-content .loginFormWrapper .loginWelcomeForm { - display: none; -} -.b-login-content .loginFormWrapper .welcome-on { - display: block; -} -.b-login-content .loginFormWrapper .welcome-off { - display: none; -} -.b-login-content .loginFormWrapper .controls, -.b-login-content .loginFormWrapper .control-group { - margin-bottom: 25px; -} -.b-login-content .loginFormWrapper .wrapper { - padding: 40px 40px 20px 40px; -} -.b-login-content .loginFormWrapper #recaptcha_image img { - border: 1px solid #ccc; - border-radius: 3px; -} -.b-login-content .loginFormWrapper .controls .inputLoginForm, -.b-login-content .loginFormWrapper .controls .inputEmail, -.b-login-content .loginFormWrapper .controls .inputLogin, -.b-login-content .loginFormWrapper .controls .inputPassword, -.b-login-content .loginFormWrapper .controls .inputAdditionalCode { - font-size: 18px; - height: 40px; - line-height: 20px; - padding-left: 12px; - padding-right: 12px; -} -.b-login-content .loginFormWrapper .languageLabel { - margin-top: 5px; -} -.b-login-content .loginFormWrapper .signMeLabel .e-checkbox { - margin-top: 5px; -} -.b-login-content .loginFormWrapper .languageLabel { - margin-right: 5px; -} -.b-login-content .loginFormWrapper .input-append .add-on { - position: relative; - height: 30px; - background: none; - margin-left: -35px; - z-index: 1000; - border: 0px; -} -.b-login-content .loginFormWrapper .input-append .add-on i { - font-size: 17px; - line-height: 29px; - color: #999; -} -.b-login-content .loginFormWrapper .input-append .add-on i.login-submit-icon { - font-size: 24px; - padding-top: 2px; - cursor: pointer; -} -.b-login-content .loginFormWrapper .controls.error .add-on i, -.b-login-content .loginFormWrapper .control-group.error .add-on i { - color: #b94a48; -} -.b-login-content .buttonLogin { - margin: 0; -} -.b-login-content .alert { - margin: 0 0 20px 0; - text-align: left; -} -.b-login-content .loginAfter { - display: inline-block; - height: 90%; - vertical-align: middle; - width: 0px; -} -.b-login-content .flag-selector { - margin-bottom: 0; -} -.b-login-content .social-buttons { - margin-top: 5px; -} -.b-login-content .social-button, -.b-login-content .language-button { - padding: 5px; - outline: none; -} -@-webkit-keyframes loginRotation { - to { - -webkit-transform: rotate(1turn); - transform: rotate(1turn); - } -} -@keyframes loginRotation { - to { - -webkit-transform: rotate(1turn); - transform: rotate(1turn); - } -} -.submitting-pane { - position: relative; -} -.submitting-pane.submitting:before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: transparent; - background: rgba(0, 0, 0, 0.3); - z-index: 1051; - border-radius: 8px; -} -html.cssanimations .submitting-pane.submitting:after { - content: ''; - position: absolute; - width: 60px; - height: 60px; - top: 50%; - left: 50%; - margin-top: -30px; - margin-left: -30px; - border: 8px solid transparent; - border-color: transparent; - border-top-color: #fff; - -webkit-animation: loginRotation 1s infinite ease-in-out; - animation: loginRotation 1s infinite ease-in-out; - border-radius: 50%; - z-index: 1052; -} -.btn-submit-icon-wrp { - border: none; - background: none; - display: inline-block; - margin: 0; - padding: 0; - outline: none; - cursor: pointer; -} -.popups .b-welcom-page-content .modal-header { - background-color: #fff; -} -.popups .b-ask-content .modal-header { - background-color: #fff; -} -.popups .b-ask-content .modal-body { - text-align: center; -} -.popups .b-ask-content .desc-place { - font-size: 18px; -} -.popups .b-shortcuts-content.modal { - width: 700px; -} -.popups .b-shortcuts-content .modal-header { - background-color: #fff; -} -.b-folders { - /**/ - /**/ -} -.b-folders .move-action-content-wrapper { - z-index: -1; - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - opacity: 0.05; - background-color: #fff; - background-size: 60px 60px; - background-image: -o-linear-gradient(315deg, #000 25%, transparent 25%, transparent 50%, #000 50%, #000 75%, transparent 75%, transparent); - background-image: linear-gradient(135deg, #000 25%, transparent 25%, transparent 50%, #000 50%, #000 75%, transparent 75%, transparent); -} -.b-folders .b-folders-user .e-link.print-count.system .badge { - display: none !important; -} -.b-folders .b-toolbar { - position: absolute; - top: 0; - right: 0; - left: 0; - height: 30px; - padding: 10px 0 0 8px; - color: #fff; - z-index: 101; -} -.b-folders .b-footer { - position: absolute; - bottom: 10px; - right: 0; - left: 0; - height: 30px; - padding: 0 10px 0 5px; - z-index: 101; - overflow: hidden; - white-space: nowrap; -} -.b-folders .b-content { - position: absolute; - top: 58px; - bottom: 45px; - left: 0; - right: 0; - overflow: hidden; - overflow-y: auto; - min-width: 100px; -} -.b-folders .b-content .content { - -webkit-overflow-scrolling: touch; -} -.b-folders .b-list-delimiter { - margin: 10px; - border-top: 0px solid #000; - border-bottom: 1px solid #999; -} -.b-folders .b-content .e-item { - overflow: hidden; - white-space: nowrap; -} -.b-folders .b-content .e-item .e-link { - display: block; - position: relative; - z-index: 1; - height: 34px; - line-height: 34px; - background-color: transparent; - vertical-align: middle; - color: grey; - cursor: not-allowed; - font-size: 14px; - padding: 0; - padding-left: 10px; - padding-right: 10px; - outline: 0; - text-decoration: none; -} -.b-folders .b-content .e-item .e-link .focused-poiner { - float: left; - display: inline-block; - background-color: transparent; - height: 100%; - width: 3px; - position: absolute; - top: 0; - left: 0; -} -.b-folders .b-content .e-item .e-link .inbox-star-icon { - display: none; - margin-left: 7px; -} -.b-folders .b-content .e-item .e-link .inbox-star-icon .icon-star { - display: none; -} -.b-folders .b-content .e-item .e-link .inbox-star-icon .icon-star-empty { - opacity: .5; -} -.b-folders .b-content .e-item .e-link .inbox-star-icon .icon-star-empty:hover { - opacity: 1; -} -.b-folders .b-content .e-item .e-link.is-inbox .inbox-star-icon { - display: inline; -} -.b-folders .b-content .e-item .e-link.selectable { - color: #000; - cursor: pointer; -} -.b-folders .b-content .e-item .e-link.selectable:hover, -.b-folders .b-content .e-item .e-link.selectable.selected, -.b-folders .b-content .e-item .e-link.selectable.focused, -.b-folders .b-content .e-item .e-link.selectable.droppableHover { - background-color: #555; - color: #fff; -} -.b-folders .b-content .e-item .e-link.selectable.focused { - color: #fff; -} -.b-folders .b-content .e-item .e-link.focused { - background-color: #888; -} -.b-folders .b-content .e-item .e-link.focused .focused-poiner { - background-color: #fff; -} -.b-folders .b-content .e-item .e-link.system { - cursor: default; - color: grey; -} -.b-folders .b-content .e-item .e-link .count { - position: relative; - display: none; - margin-top: 5px; - line-height: 19px; -} -.b-folders .b-content .e-item .e-link.print-count { - font-weight: bold; -} -.b-folders .b-content .e-item .e-link.print-count .count { - display: inline; -} -.b-folders .b-content .e-item .e-link.unread-sub { - font-weight: bold; -} -.b-folders .b-content .e-item .e-link .e-collapsed-sign { - cursor: pointer; - width: 22px; - height: 30px; - line-height: 30px; - text-align: center; - vertical-align: inherit; -} -.b-folders .b-content .e-item .hidden.e-link { - display: none; -} -.b-folders .b-content .e-item .b-sub-folders.collapsed { - max-height: 0; - height: 0; - display: none; -} -.b-folders.inbox-is-starred .icon-star { - color: orange; - display: inline-block !important; -} -.b-folders.inbox-is-starred .icon-star-empty { - display: none; -} -.b-folders .b-folder-system-item { - font-weight: bold; -} -.b-folders .b-sub-folders .e-item .e-link { - padding-left: 25px; -} -.b-folders .b-sub-folders .b-sub-folders .e-item .e-link { - padding-left: 40px; -} -.b-folders .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link { - padding-left: 55px; -} -.b-folders .b-sub-folders .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link { - padding-left: 70px; -} -.b-folders.single-root-inbox .i-am-inbox.e-link { - display: none !important; -} -.b-folders.single-root-inbox .i-am-inbox-wrapper > .b-sub-folders { - max-height: none !important; - height: inherit !important; - display: block !important; -} -.b-folders.single-root-inbox .i-am-inbox-wrapper .b-sub-folders .e-item .e-link { - padding-left: 10px; -} -.b-folders.single-root-inbox .i-am-inbox-wrapper .b-sub-folders .b-sub-folders .e-item .e-link { - padding-left: 25px; -} -.b-folders.single-root-inbox .i-am-inbox-wrapper .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link { - padding-left: 40px; -} -.b-folders.single-root-inbox .i-am-inbox-wrapper .b-sub-folders .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link { - padding-left: 55px; -} -.btn .btn-text-wrp { - padding-left: 7px; - white-space: normal; -} -.btn.buttonCompose { - width: calc(100% - 85px); - max-width: -webkit-fit-content; - max-width: -moz-fit-content; - max-width: fit-content; - white-space: nowrap; - overflow: hidden; - height: 19px; - display: inline-block; - margin-top: 1px; -} -html.rl-left-panel-disabled .buttonComposeText, -html.rl-left-panel-short .buttonComposeText { - display: none; -} -html.rl-left-panel-disabled .btn.buttonCompose, -html.rl-left-panel-short .btn.buttonCompose { - width: auto; -} -html.rl-left-panel-disabled .btn.buttonContacts, -html.rl-left-panel-short .btn.buttonContacts { - margin-top: 10px !important; - margin-left: 0 !important; -} -html.rl-left-panel-disabled.rl-mobile #rl-left, -html.rl-left-panel-short.rl-mobile #rl-left { - visibility: hidden; -} -html.rl-mobile .btn.buttonCompose { - width: 100%; -} -html.rl-mobile .btn.buttonContacts { - display: none; -} -.popups .b-folder-clear-content .modal-header { - background-color: #fff; -} -.popups .b-folder-create-content .modal-header { - background-color: #fff; -} -.popups .b-folder-system-content .modal-header { - background-color: #fff; -} -.popups .b-filter-content { - width: 750px; -} -.popups .b-filter-content .modal-header { - background-color: #fff; -} -.popups .b-filter-content .button-delete { - cursor: pointer; -} -.popups .b-filter-content .setRecipientsBtn { - margin-top: -2px; - margin-left: 5px; -} -.popups .b-languages-content.modal { - width: 700px; -} -.popups .b-languages-content.exp { - width: 701px; -} -.popups .b-languages-content .modal-header { - background-color: #fff; -} -.popups .b-languages-content .lang-item { - display: inline-block; - padding: 5px 15px; - margin: 2px 5px; - width: 180px; - background-color: #fff; - text-align: left; - border: 1px solid transparent; - border-radius: 2px; -} -.popups .b-languages-content .lang-item.user { - background-color: #fffddd; - border-color: #fff555; -} -.popups .b-languages-content .lang-item.selected { - background-color: #f5f5f5; - border-color: #ccc; -} -.popups .b-languages-content .lang-item:hover { - background-color: #eee; - border-color: #ccc; -} -html.rl-mobile .b-languages-content .lang-item { - width: calc(100% - 40px); -} -.popups .b-account-add-content .modal-header { - background-color: #fff; -} -.popups .b-template-add-content.modal { - width: 750px; -} -.popups .b-template-add-content .modal-header { - background-color: #fff; -} -.popups .b-template-add-content .e-template-place { - height: 300px; -} -.popups .b-open-pgp-key-view-content .modal-header, -.popups .b-open-pgp-key-generate-content .modal-header, -.popups .b-open-pgp-key-add-content .modal-header, -.popups .b-compose-open-pgp-content .modal-header, -.popups .b-message-open-pgp-content .modal-header { - background-color: #fff; -} -.popups .b-open-pgp-key-view-content.modal, -.popups .b-open-pgp-key-generate-content.modal, -.popups .b-open-pgp-key-add-content.modal, -.popups .b-compose-open-pgp-content.modal, -.popups .b-message-open-pgp-content.modal { - width: 570px; -} -.popups .b-open-pgp-key-view-content .inputKey, -.popups .b-open-pgp-key-generate-content .inputKey, -.popups .b-open-pgp-key-add-content .inputKey, -.popups .b-compose-open-pgp-content .inputKey, -.popups .b-message-open-pgp-content .inputKey { - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; -} -.popups .b-open-pgp-key-view-content .key-viewer, -.popups .b-open-pgp-key-generate-content .key-viewer, -.popups .b-open-pgp-key-add-content .key-viewer, -.popups .b-compose-open-pgp-content .key-viewer, -.popups .b-message-open-pgp-content .key-viewer { - max-height: 500px; - overflow: auto; -} -.popups .b-compose-open-pgp-content.modal { - width: 800px; -} -.popups .b-compose-open-pgp-content .key-list { - background-color: #f9f9f9; - border-radius: 5px; - padding: 10px 15px; - margin-top: 10px; - min-height: 40px; -} -.popups .b-compose-open-pgp-content .key-list-wrp:hover { - overflow: auto; -} -.popups .b-compose-open-pgp-content .key-list-wrp:hover .key-list__item-name { - overflow: visible; -} -.popups .b-compose-open-pgp-content .key-list-wrp.empty { - text-align: center; - padding-top: 10px; - color: #aaa; - font-size: 16px; -} -.popups .b-compose-open-pgp-content .key-list__item { - color: #333; - white-space: nowrap; - padding-bottom: 4px; -} -.popups .b-compose-open-pgp-content .key-list__item:last-child { - padding-bottom: 0; -} -.popups .b-compose-open-pgp-content .key-list__item-delete { - cursor: pointer; -} -.popups .b-compose-open-pgp-content .key-list__item-delete.disabled { - cursor: not-allowed; -} -.popups .b-compose-open-pgp-content .key-list__item-names { - color: #333; -} -.popups .b-compose-open-pgp-content .key-list__item-names.empty { - color: red; -} -.popups .b-compose-open-pgp-content .key-list__item-name { - overflow: hidden; - -o-text-overflow: ellipsis; - text-overflow: ellipsis; -} -.popups .b-compose-open-pgp-content .key-list__item-error { - color: red; -} -.popups .b-compose-open-pgp-content .key-list__item-hash { - color: #aaa; -} -.popups .b-compose-open-pgp-content .key-actions { - margin-top: 10px; - min-height: 40px; -} -.popups .b-compose-open-pgp-content .key-actions select option.even { - background-color: #f5f5f5; -} -.popups .b-message-open-pgp-content.modal { - width: 700px; -} -.popups .b-message-open-pgp-content .key-list { - margin-top: 5px; - overflow: hidden; -} -.popups .b-message-open-pgp-content .key-list__item { - color: #555; - cursor: pointer; - -o-text-overflow: ellipsis; - text-overflow: ellipsis; - white-space: nowrap; -} -.popups .b-message-open-pgp-content .key-list__item__radio { - padding: 3px 5px 0 0; - vertical-align: top; -} -.popups .b-message-open-pgp-content .key-list__item__name { - border-bottom: 1px solid transparent; -} -.popups .b-message-open-pgp-content .key-list__item__names { - display: inline-block; -} -.popups .b-message-open-pgp-content .key-list__item__names:hover .key-list__item__name { - border-bottom: 1px dashed #555; -} -.popups .b-open-pgp-key-add-content.modal { - width: 645px; -} -.popups .b-open-pgp-key-add-content.modal .inputKey { - width: 600px; -} -.popups .b-two-factor-content { - width: 750px; -} -.popups .b-two-factor-content .modal-body { - min-height: 100px; -} -.popups .b-two-factor-content .modal-header { - background-color: #fff; -} -.popups .b-two-factor-test-content .modal-header { - background-color: #fff; -} -.popups .b-identity-content.modal { - width: 750px; -} -.popups .b-identity-content .modal-header { - background-color: #fff; -} -.popups .b-identity-content .modal-body { - overflow: hidden; -} -.popups .b-identity-content .control-label { - width: 100px; -} -.popups .b-identity-content .controls { - margin-left: 120px; -} -.popups .b-identity-content .e-signature-place { - height: 200px; -} -.popups .b-identity-content .textEmail { - margin-top: 5px; - font-weight: bold; -} -.popups .b-advanced-search-content.modal { - width: 750px; -} -.popups .b-advanced-search-content.modal .control-label { - width: 100px; -} -.popups .b-advanced-search-content.modal .controls { - margin-left: 110px; -} -.popups .b-advanced-search-content .modal-header { - background-color: #fff; -} -.attachmentItem { - position: relative; - display: inline-block; - margin: 5px; - max-width: 200px; - min-width: 60px; - overflow: hidden; - list-style: none; - line-height: 24px; - border: 0; - background-color: #fff; - -webkit-box-shadow: 0 1px 4px #ccc; - box-shadow: 0 1px 4px #ccc; - -webkit-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2); - box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.04), 0 1px 5px rgba(0, 0, 0, 0.1); - box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.04), 0 1px 5px rgba(0, 0, 0, 0.1); - border-radius: 3px; - /* - .attachmentIconParent.hasPreview.isImage { - .iconMain { - display: none; - } - } -*/ -} -.attachmentItem.waiting { - opacity: 0.6; -} -.attachmentItem.checked { - -webkit-box-shadow: 0 1px 4px #00a; - box-shadow: 0 1px 4px #00a; - -webkit-box-shadow: 0 1px 5px rgba(0, 0, 255, 0.3); - box-shadow: 0 1px 5px rgba(0, 0, 255, 0.3); - -webkit-box-shadow: 0 0 0 1px rgba(0, 0, 255, 0.1), 0 1px 5px rgba(0, 0, 255, 0.2); - box-shadow: 0 0 0 1px rgba(0, 0, 255, 0.1), 0 1px 5px rgba(0, 0, 255, 0.2); -} -.attachmentItem .checkedParent { - position: absolute; - top: 0; - right: 0; - padding: 1px 4px 0px 5px; - background: #FAFAFA; - border: 0px solid #CCC; -} -.attachmentItem .attachmentSize { - font-size: 12px; - color: #999; -} -.attachmentItem.error .attachmentIcon, -.attachmentItem.error .attachmentSize, -.attachmentItem.error .attachmentName { - color: red; -} -.attachmentItem .attachmentIconParent { - position: relative; - height: 56px; - width: 60px; - background: none; -} -.attachmentItem .attachmentIconParent .iconPreview, -.attachmentItem .attachmentIconParent .iconBG, -.attachmentItem .attachmentIconParent .iconMain, -.attachmentItem .attachmentIconParent .iconProgress { - position: absolute; - top: 0; - left: 0; - display: inline-block; - width: 100%; - height: 100%; -} -.attachmentItem .attachmentIconParent .iconProgress { - background: #eee; - width: 0%; -} -.attachmentItem .attachmentIconParent .iconBG { - font-size: 18px; - text-align: center; - color: #999; - font-weight: bold; - line-height: 55px; - text-shadow: 0 1px 0 #fff; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.8); -} -.attachmentItem .attachmentIconParent .iconPreview { - display: none; - background: #555; - background-image: none; - background: rgba(0, 0, 0, 0.5) !important; -} -.attachmentItem .attachmentIconParent .iconPreview .attachmentIcon { - color: #fff; - text-shadow: 0 1px 0 #000; -} -.attachmentItem .attachmentNameParent { - position: relative; - margin-left: 60px; - padding: 4px 4px 3px 6px; - min-width: 90px; - cursor: pointer; - color: #333; - background: #fafafa; - border-left: 1px solid #ddd; -} -.attachmentItem .attachmentIcon { - margin: 6px 0 0 13px; - font-size: 36px; - width: 36px; - height: 36px; - color: #aaa; -} -.attachmentItem .attachmentIcon.icon-none { - display: none; -} -.attachmentItem .attachmentIcon.icon-file-certificate { - margin-left: 15px; -} -.attachmentItem .attachmentIconText { - display: inline-block; - font-size: 28px; - width: 60px; - height: 56px; - color: #aaa; - line-height: 56px; - text-align: center; - font-style: normal; -} -.attachmentItem .attachmentIconParent.hasPreview:hover .iconPreview { - display: inline-block; -} -.attachmentItem .attachmentIconParent.hasPreview:hover .iconMain { - display: none; -} -.attachmentItem .attachmentIconParent.hasPreplay:hover .iconPreview { - display: inline-block; -} -.attachmentItem .attachmentIconParent.hasPreplay:hover .iconMain { - display: none; -} -.attachmentItem .showPreview, -.attachmentItem .showPreplay { - display: none; - cursor: pointer; -} -.attachmentItem .attachmentIconParent.hasPreview .showPreview { - display: inline; -} -.attachmentItem .attachmentIconParent.hasPreview .hidePreview { - display: none; -} -.attachmentItem .attachmentIconParent.hasPreplay .showPreplay { - display: inline; -} -.attachmentItem .attachmentIconParent.hasPreplay .hidePreview { - display: none; -} -html.rl-no-preview-pane .messageList.message-selected { - display: none; -} -.messageList .toolbar { - position: absolute; - top: 0; - right: 0; - left: 0; - height: 30px; - padding: 10px 1px; - z-index: 102; - white-space: nowrap; -} -.messageList .b-footer { - position: absolute; - bottom: 0; - right: 0; - left: 0; - height: 30px; - padding: 7px; - z-index: 101; - background-color: #eee; - border-bottom-right-radius: 5px; - border-bottom-left-radius: 5px; -} -.messageList .b-footer .e-quota { - display: inline-block; - margin-top: 5px; - margin-left: 5px; - font-size: 18px; - cursor: help; -} -.messageList .b-footer .e-quota:hover { - border-bottom: 1px dashed #333; -} -.messageList .inputSearch { - width: 258px; -} -.messageList .btn.buttonMoreSearch { - padding-left: 8px; - padding-right: 8px; -} -.messageList .b-message-list-wrapper { - position: absolute; - top: 50px; - right: 0; - left: 0; - bottom: 5px; - border: 1px solid #aaa; - -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.2); - box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.2); - border-radius: 5px; - z-index: 101; -} -.messageList .second-toolbar { - position: absolute; - top: 0; - right: 0; - left: 0; - height: 29px; - padding: 10px 8px 10px 11px; - z-index: 101; - white-space: nowrap; - background-color: #eee; - border-top-right-radius: 5px; - border-top-left-radius: 5px; -} -.messageList .second-toolbar .checkboxCkeckAll { - margin: 5px 0; -} -.messageList .line-loading { - position: absolute; - left: 0; - right: 0; - z-index: 102; - height: 0px; - top: 50px; -} -.messageList .mainDelimiter { - position: absolute; - left: 0; - right: 0; - height: 1px; - z-index: 101; - background-color: #bbb; -} -.messageList .toolbarDelimiter { - top: 49px; -} -.messageList .footerDelimiter { - bottom: 44px; -} -.messageList .b-content { - position: absolute; - top: 50px; - bottom: 45px; - left: 0; - right: 0; - padding: 0; - overflow-x: hidden; - overflow-y: auto; - z-index: 101; - -webkit-box-sizing: border-box; - box-sizing: border-box; - background-color: #fff; -} -.messageList .b-content .content { - -webkit-overflow-scrolling: touch; -} -.messageList .b-content .listClear { - color: #333; - text-align: center; - padding: 10px; - font-size: 14px; - line-height: 13px; -} -.messageList .b-content .listEmptyList, -.messageList .b-content .listEmptyListLoading, -.messageList .b-content .listDragOver, -.messageList .b-content .listError, -.messageList .b-content .listEmptySearchList { - color: #999; - text-align: center; - padding: 60px 10px; - font-size: 24px; - line-height: 30px; -} -.messageList .b-content .listEmptyList .e-icon, -.messageList .b-content .listEmptyListLoading .e-icon, -.messageList .b-content .listDragOver .e-icon, -.messageList .b-content .listError .e-icon, -.messageList .b-content .listEmptySearchList .e-icon { - font-size: 24px; - line-height: 30px; -} -.messageList .b-content .listDragOver { - max-height: 0; - overflow: hidden; - padding: 0 10px; -} -.messageList .b-content .listDragOver.viewAppendArea { - max-height: 120px; - padding: 30px 10px; -} -.messageList .b-content .listDragOver.dragOverEnter { - background-color: #e0fdda; - color: #333; -} -.messageList .b-content .listError { - color: #DA4F49; -} -.messageList .b-content .listSearchDesc { - font-size: 18px; - padding: 15px; - border-bottom: 1px solid #eee; -} -html.rl-mobile .messageList .b-content .listSearchDesc { - font-size: 16px; - padding: 12px; -} -.messageList .b-content .listThreadUidDesc { - font-size: 16px; - padding: 7px 20px 6px 20px; - background-color: #aaa; - border-bottom: 1px solid #888; - color: #fff; - cursor: pointer; - text-shadow: 0 1px 0 #000; - text-align: center; -} -.messageList .b-content .delimiter { - display: block; - height: 1px; - background-color: #e5e5e5; -} -.messageList .b-content .messageListItem:last-child { - border-bottom: 1px solid #e5e5e5; -} -.messageList .b-content .messageListItem:last-child.selected { - border-bottom: 1px solid #bfd5ef; -} -.messageList .b-content .fullThreadsParent { - height: 25px; - padding: 3px 5px; - background-color: #f4f4f4; - text-align: center; -} -.messageList .b-content .messageListItem { - position: relative; - height: 52px; - max-height: 60px; - font-size: 12px; - line-height: 21px; - overflow: hidden; - cursor: pointer; - margin: 0px; - border: 0px solid transparent; - z-index: 100; - background-color: #f9f9f9; - /* &:nth-child(even) { - background-color: #f3f3f3; - }*/ - /* - &.hasParentMessage { - background-color: #ecf0f1; - - .sidebarParent { - background-color: #bdc3c7; - } - - &.focused .sidebarParent { - background-color: darken(#bdc3c7, 10%) !important; - } - - &.unseen { - background-color: darken(#ecf0f1, 5%); - - .sidebarParent { - background-color: darken(#bdc3c7, 30%); - } - - &.focused .sidebarParent { - background-color: darken(#bdc3c7, 40%) !important; - } - } - } -*/ -} -.messageList .b-content .messageListItem .delimiter { - position: relative; - display: block; - height: 1px; - background-color: #999; - opacity: 0.2; - filter: alpha(opacity=20); -} -.messageList .b-content .messageListItem .wrapper { - padding: 5px 0; -} -.messageList .b-content .messageListItem .sidebarParent { - display: inline-block; - width: 6px; - background-color: #eee; - float: left; - height: 100%; -} -.messageList .b-content .messageListItem.focused { - background-color: #f5f5f5; -} -.messageList .b-content .messageListItem.focused .sidebarParent { - background-color: #ccc !important; -} -.messageList .b-content .messageListItem .importantMark { - display: none; - color: red; - margin-right: 5px; -} -.messageList .b-content .messageListItem.deleted-mark { - opacity: .7; -} -.messageList .b-content .messageListItem.deleted-mark .sender, -.messageList .b-content .messageListItem.deleted-mark .subject, -.messageList .b-content .messageListItem.deleted-mark .subject-prefix, -.messageList .b-content .messageListItem.deleted-mark .subject-suffix { - text-decoration: line-through; -} -.messageList .b-content .messageListItem.important .importantMark { - display: inline; -} -.messageList .b-content .messageListItem.e-single-line { - height: 35px; -} -.messageList .b-content .messageListItem.e-single-line .wrapper { - line-height: 25px; - padding: 5px; -} -.messageList .b-content .messageListItem.new { - max-height: 0px; -} -.messageList .b-content .messageListItem.deleted { - max-height: 0px; - border-color: transparent !important; -} -.messageList .b-content .messageListItem .checkedParent { - display: inline-block; - float: left; - margin-top: 11px; - padding: 0 8px 0 6px; - font-size: 14px; -} -.messageList .b-content .messageListItem.e-single-line .checkedParent { - margin-top: 1px; -} -.messageList .b-content .messageListItem .flagParent { - display: inline-block; - float: right; - padding: 0 10px 0 5px; -} -.messageList .b-content .messageListItem.e-single-line .flagParent { - float: left; - padding: 0 8px 0 2px; -} -.messageList .b-content .messageListItem .dateParent { - display: inline-block; - float: right; - position: relative; - margin: 0 5px; - color: #999; - font-size: 11px; -} -.messageList .b-content .messageListItem .threadsParent { - display: inline-block; - float: right; - position: relative; -} -.messageList .b-content .messageListItem .attachmentParent { - display: inline-block; - float: right; - position: relative; - margin: 2px 10px 0 5px; -} -.messageList .b-content .messageListItem.e-single-line .attachmentParent { - float: left; - margin: 0 8px 0 0; -} -.messageList .b-content .messageListItem .senderParent { - display: block; - overflow: hidden; - -o-text-overflow: ellipsis; - text-overflow: ellipsis; -} -.messageList .b-content .messageListItem .threadsCountParent { - display: inline; - overflow: hidden; - background-color: #eee; - padding: 1px 5px; - margin-right: 5px; - border: 1px solid #ccc; - border-radius: 5px; -} -.messageList .b-content .messageListItem .threadsCountParent.lastSelected { - background-color: #999; - border-color: #999; - color: #fff; -} -.messageList .b-content .messageListItem .threadsCountParent:hover { - border-color: #666; -} -.messageList .b-content .messageListItem.e-single-line .senderParent { - display: inline-block; - -o-text-overflow: none; - text-overflow: none; - width: 200px; - float: left; - font-weight: normal; -} -.messageList .b-content .messageListItem .subjectParent { - display: block; - overflow: hidden; - -o-text-overflow: ellipsis; - text-overflow: ellipsis; - color: #000; -} -.messageList .b-content .messageListItem .senderParent, -.messageList .b-content .messageListItem .subjectParent, -.messageList .b-content .messageListItem .dateParent { - white-space: nowrap; -} -.messageList .b-content .messageListItem .subjectParent .emptySubjectText { - display: none; - font-style: italic; - color: #999; -} -.messageList .b-content .messageListItem.emptySubject .subjectParent .subject, -.messageList .b-content .messageListItem.emptySubject .subjectParent .subject-prefix, -.messageList .b-content .messageListItem.emptySubject .subjectParent .subject-suffix { - display: none; -} -.messageList .b-content .messageListItem.emptySubject .subjectParent .emptySubjectText { - display: inline; -} -.messageList .b-content .messageListItem .sender, -.messageList .b-content .messageListItem .subject, -.messageList .b-content .messageListItem .subject-suffix { - overflow: hidden; - -o-text-overflow: ellipsis; - text-overflow: ellipsis; -} -.messageList .b-content .messageListItem .threads-len .threads-len-data { - background-color: #eee; - color: #666; - border-radius: 6px; - padding: 2px 0px 1px 6px; - margin-right: 2px; - border: 1px solid #ccc; -} -.messageList .b-content .messageListItem .threads-len .threads-len-data [class^="icon-"], -.messageList .b-content .messageListItem .threads-len .threads-len-data [class*=" icon-"] { - font-size: 14px; -} -.messageList .b-content .messageListItem .threads-len .threads-len-data:hover { - background-color: #aaa; - border-color: #666; - text-shadow: 0 1px 0 #999; - color: #fff; -} -.messageList .b-content .messageListItem .subject-prefix { - color: #888; - /*font-style: italic;*/ -} -.messageList .b-content .messageListItem .attachment { - display: none; -} -.messageList .b-content .messageListItem .flagOff, -.messageList .b-content .messageListItem .flagOn, -.messageList .b-content .messageListItem .flagOnHalf { - cursor: pointer; - display: inline-block; -} -.messageList .b-content .messageListItem .flagOff { - opacity: 0.5; -} -.messageList .b-content .messageListItem .flagOff:hover { - opacity: 1; -} -.messageList .b-content .messageListItem .flagOn, -.messageList .b-content .messageListItem .flagOnHalf { - display: none; - color: orange; -} -.messageList .b-content .messageListItem .replyFlag, -.messageList .b-content .messageListItem .forwardFlag { - display: none; -} -.messageList .b-content .messageListItem.answered .replyFlag { - display: inline-block; -} -.messageList .b-content .messageListItem.forwarded .forwardFlag { - display: inline-block; -} -.messageList .b-content .messageListItem.withAttachments .attachment { - display: inline-block; - color: #666; - text-shadow: 0px 1px 0px #eee; -} -.messageList .b-content .messageListItem.hasUnseenSubMessage { - background-color: #FFFFD9; -} -.messageList .b-content .messageListItem.hasUnseenSubMessage .sidebarParent { - background-color: #ffdb99; -} -.messageList .b-content .messageListItem.hasUnseenSubMessage.focused .sidebarParent { - background-color: #cc8400 !important; -} -.messageList .b-content .messageListItem.unseen { - background-color: #FFFFD9; -} -.messageList .b-content .messageListItem.unseen .sender, -.messageList .b-content .messageListItem.unseen .subject, -.messageList .b-content .messageListItem.unseen .subject-suffix { - font-weight: bold; -} -.messageList .b-content .messageListItem.unseen .sidebarParent { - background-color: orange; -} -.messageList .b-content .messageListItem.unseen.focused .sidebarParent { - background-color: #cc8400 !important; -} -.messageList .b-content .messageListItem.checked .sidebarParent { - background-color: #69a8f5 !important; -} -.messageList .b-content .messageListItem.checked.focused .sidebarParent { - background-color: #217ef0 !important; -} -.messageList .b-content .messageListItem.selected { - background-color: #DFEFFF; - z-index: 101; -} -.messageList .b-content .messageListItem.selected .sidebarParent { - background-color: #398CF2 !important; -} -.messageList .b-content .messageListItem.selected .delimiter { - background-color: #398CF2; - opacity: 0.2; - filter: alpha(opacity=20); -} -.messageList .b-content .messageListItem.selected + .messageListItem .delimiter { - background-color: #398CF2; - opacity: 0.3; -} -.messageList .b-content .messageListItem.hasFlaggedSubMessage .flagOff, -.messageList .b-content .messageListItem.hasFlaggedSubMessage .flagOn { - display: none; -} -.messageList .b-content .messageListItem.hasFlaggedSubMessage .flagOnHalf { - display: inline-block; -} -.messageList .b-content .messageListItem.flagged .flagOff, -.messageList .b-content .messageListItem.flagged .flagOnHalf { - display: none; -} -.messageList .b-content .messageListItem.flagged .flagOn { - display: inline-block; -} -.messageList.message-focused .b-message-list-wrapper { - background-color: #000; -} -.messageList.message-focused .b-content { - opacity: 0.97; -} -.messageList.hideMessageListCheckbox .checkedParent, -.messageList.hideMessageListCheckbox .checkboxCkeckAll { - display: none !important; -} -.messageList.hideMessageListCheckbox .sidebarParent { - margin-right: 10px !important; -} -html.ssm-state-desktop-large .messageList .b-content .messageListItem { - font-size: 13px; -} -html.ssm-state-desktop-large .messageList .b-content .messageListItem .dateParent { - font-size: 13px; -} -html.cssanimations .messageList .line-loading { - height: 5px !important; -} -.draggablePlace { - z-index: 10003; - color: #fff; - background-color: #333; - background-color: rgba(0, 0, 0, 0.5); - padding: 4px 10px; - min-width: 30px; - height: 20px; - cursor: pointer; - cursor: move; -} -html.rl-mobile #rl-sub-left .messageList .inputSearch { - width: 160px !important; -} -html.rl-no-preview-pane .messageView { - display: none; -} -html.rl-no-preview-pane .messageView.message-selected { - display: block; -} -.messageView { - z-index: 100; -} -.messageView .toolbar { - position: absolute; - top: 0; - right: 0; - left: 0; - height: 30px; - padding: 10px 0; - color: #fff; -} -.messageView .b-content { - position: absolute; - margin: 0; - top: 58px; - bottom: 13px; - right: 8px; - left: -2px; - /*overflow: hidden;*/ - border: 1px solid #aaa; - border-radius: 3px; - background-color: #fff; -} -.messageView .b-content .b-message-view-checked-helper { - text-align: center; - font-size: 70px; - line-height: 70px; - padding-top: 100px; - color: #999; -} -.messageView .b-content .b-message-view-checked-helper .icon-mail { - font-size: 100px; - font-size: 50px; - line-height: 90px; - padding-left: 10px; -} -.messageView .b-content .logoPlace { - text-align: center; -} -.messageView .b-content .b-message-view-desc { - text-align: center; - font-size: 24px; - line-height: 30px; - color: #999; - padding: 120px 10px 0 10px; -} -.messageView .b-content .b-message-view-desc.error { - color: #DA4F49; -} -.messageView .b-content .b-message-view-iframe-backdrop { - display: none; - background: transparent; - position: absolute; - width: 100%; - height: 100%; - top: 0px; - left: 0px; - right: 0px; - bottom: 0px; - opacity: .1; -} -.messageView .b-content .content { - -webkit-overflow-scrolling: touch; -} -.messageView .b-content .message-fixed-button-toolbar { - z-index: 100; - position: absolute; - top: 33px; - right: 10px; -} -.messageView .b-content .infoParent { - cursor: pointer; - margin: 0 2px 0 5px; - opacity: 0.3; -} -.messageView .b-content .infoParent:hover { - opacity: 0.6; -} -.messageView .b-content .flagParent { - cursor: pointer; - margin: 0 20px 0 2px; -} -.messageView .b-content .flagParent .flagOn { - color: orange; -} -.messageView .b-content .flagParent .flagOff { - opacity: 0.5; -} -.messageView .b-content .flagParent .flagOff:hover { - opacity: 1; -} -.messageView .b-content .messageItemHeader { - position: absolute; - padding: 10px; - background-color: #f8f8f8; - border-top: 0px; - border-bottom: 1px solid #ddd; - border-top-right-radius: 5px; - border-top-left-radius: 5px; - z-index: 1; - top: 0; - left: 0; - right: 0; -} -.messageView .b-content .messageItemHeader .fromPic { - display: inline-block; - width: 50px; - height: 50px; - float: left; - padding: 2px; - margin: 0 5px 0 0; - background: #fff; - border: 1px solid #ccc; - border-radius: 6px; - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -.messageView .b-content .messageItemHeader .subjectParent { - font-size: 18px; - font-weight: bold; - -o-text-overflow: ellipsis; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - margin-bottom: 8px; - line-height: 100%; - height: 22px; - vertical-align: middle; -} -.messageView .b-content .messageItemHeader .messageButtons { - margin-top: 5px; -} -.messageView .b-content .messageItemHeader .informationShort { - margin: 4px 0; - margin-left: 5px; - margin-right: 50px; -} -.messageView .b-content .messageItemHeader .informationShort a { - color: #336699; - text-decoration: underline; - cursor: pointer; - padding: 2px; -} -.messageView .b-content .messageItemHeader .informationShort a:focus { - outline: 1px; - outline-style: dotted; -} -html.rl-mobile .messageView .b-content .messageItemHeader .informationShort { - -o-text-overflow: ellipsis; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; -} -.messageView .b-content .messageItemHeader .informationShortWrp { - max-height: 100px; - overflow-y: auto; - min-height: 30px; - margin-top: 4px; -} -.messageView .b-content .messageItemHeader .informationFull { - margin-top: 10px; - border: 1px solid #ddd; - background-color: #fff; - border-radius: 5px; - padding: 8px 0; - overflow: hidden; -} -.messageView .b-content .messageItemHeader .informationFull .size { - margin-left: 4px; -} -.messageView .b-content .messageItemHeader .informationFull table { - width: 100%; -} -.messageView .b-content .messageItemHeader .informationFull table, -.messageView .b-content .messageItemHeader .informationFull tr, -.messageView .b-content .messageItemHeader .informationFull td { - border-spacing: 0; -} -.messageView .b-content .messageItemHeader .informationFull td { - padding: 0 10px; - vertical-align: top; - min-width: 43px; -} -.messageView .b-content .messageItemHeader .informationFull td:first-child { - border-right: 1px solid #ddd; - text-align: right; - width: 1%; -} -.messageView .b-content .messageItemHeader .informationFull .uiLabel { - white-space: nowrap; -} -.messageView .b-content .messageItemHeader .informationFull .uiLabelValue { - word-break: break-all; -} -.messageView .b-content .messageItemHeader .emptySubjectText { - display: none; - font-style: italic; - font-weight: normal; - color: #999; -} -.messageView .b-content .messageItemHeader.emptySubject .emptySubjectText { - display: inline; -} -.messageView .b-content .messageItem { - position: absolute; - top: 0px; - bottom: 0; - left: 0; - right: 0; - overflow: auto; - -webkit-overflow-scrolling: touch; - border-radius: 3px; -} -.messageView .b-content .messageItem .buttonUp, -.messageView .b-content .messageItem .buttonUnFull, -.messageView .b-content .messageItem .buttonFull { - display: inline-block; - position: fixed; - right: 25px; - bottom: 25px; - height: 30px; - width: 30px; - text-align: center; - vertical-align: middle; - line-height: 30px; - background-color: transparent; - background-color: #fff; - border: 1px solid #333; - color: #333; - z-index: 2; - cursor: pointer; - border-radius: 5px; - opacity: 0.5; - filter: alpha(opacity=50); -} -.messageView .b-content .messageItem .buttonUp:hover, -.messageView .b-content .messageItem .buttonUnFull:hover, -.messageView .b-content .messageItem .buttonFull:hover { - opacity: 0.8; - filter: alpha(opacity=80); - border-color: #666; - background-color: #888; - color: #fff; -} -.messageView .b-content .messageItem .buttonUp { - right: 65px; - z-index: 0; -} -.messageView .b-content .messageItem .buttonUp, -.messageView .b-content .messageItem .buttonUnFull { - display: none; -} -.messageView .b-content .messageItem .loading { - text-align: center; - font-size: 24px; - color: grey; - padding-top: 50px; -} -.messageView .b-content .messageItem .line-loading { - height: 0px; -} -.messageView .b-content .messageItem .showImages, -.messageView .b-content .messageItem .readReceipt, -.messageView .b-content .messageItem .pgpSigned, -.messageView .b-content .messageItem .pgpEncrypted { - cursor: pointer; - padding: 10px 15px; - border-bottom: 1px solid #ddd; - background-color: #eee; -} -.messageView .b-content .messageItem .pgpInfo { - padding: 5px 15px; - border-bottom: 1px solid #ddd; - background-color: #fcf8e3; -} -.messageView .b-content .messageItem .pgpInfo.success { - background-color: #e9f4ff; -} -.messageView .b-content .messageItem .readReceipt { - background-color: #ffffd9; -} -.messageView .b-content .messageItem .attachmentsPlace { - padding: 10px 10px 6px 10px; - background: #eee; - border-bottom: 1px solid #ddd; - position: relative; -} -.messageView .b-content .messageItem .attachmentsPlace .attachmentList { - margin: 0; -} -.messageView .b-content .messageItem .attachmentsPlace .checkedParent { - display: none; -} -.messageView .b-content .messageItem .attachmentsPlace.selection-mode .checkedParent { - display: inline-block; -} -.messageView .b-content .messageItem .attachmentsPlace.unselectedAttachmentsError .attachmentItem { - -webkit-box-shadow: 0 1px 4px red; - box-shadow: 0 1px 4px red; - -webkit-box-shadow: 0 1px 5px rgba(255, 0, 0, 0.4); - box-shadow: 0 1px 5px rgba(255, 0, 0, 0.4); - -webkit-box-shadow: 0 0 0 1px rgba(255, 0, 0, 0.2), 0 1px 5px rgba(255, 0, 0, 0.3); - box-shadow: 0 0 0 1px rgba(255, 0, 0, 0.2), 0 1px 5px rgba(255, 0, 0, 0.3); -} -.messageView .b-content .messageItem .attachmentsPlace .controls-handle { - position: absolute; - bottom: 5px; - right: 8px; - color: #999; - cursor: pointer; -} -.messageView .b-content .messageItem .attachmentsControls { - padding: 7px 5px 7px 14px; - background: #e8e8e8; - border-bottom: 1px solid #ddd; -} -.messageView .b-content .messageItem .rlBlockquoteSwitcher { - background-color: #eee; - border: 1px solid #999; - display: inline-block; - width: 30px; - height: 14px; - line-height: 14px; - text-align: center; - cursor: pointer; - margin: 10px 0px; - opacity: 0.5; -} -.messageView .b-content .messageItem .rlBlockquoteSwitcher:hover { - opacity: 1; -} -.messageView .b-content .messageItem .bodySubHeader { - z-index: 2; -} -.messageView .b-content .messageItem .bodyText { - color: #000; - font-family: Arial, Verdana, Geneva, sans-serif; -} -.messageView .b-content .messageItem .bodyText .b-text-part { - height: 100%; -} -.messageView .b-content .messageItem .bodyText .b-text-part div[data-x-div-type=html] { - height: 100%; -} -.messageView .b-content .messageItem .bodyText .b-text-part div[data-x-div-type=html] div[data-x-div-type=body] { - height: 100%; -} -.messageView .b-content .messageItem .bodyText .b-text-part a { - color: blue; - text-decoration: underline; -} -.messageView .b-content .messageItem .bodyText .b-text-part a:visited { - color: #609; -} -.messageView .b-content .messageItem .bodyText .b-text-part a:active { - color: red; -} -.messageView .b-content .messageItem .bodyText .b-text-part blockquote { - border-left: 2px solid #000; - padding: 0px 10px; - margin: 0; -} -.messageView .b-content .messageItem .bodyText .b-text-part .rl-bq-switcher.hidden-bq { - display: none; -} -.messageView .b-content .messageItem .bodyText .b-text-part.html div[data-x-div-type=body] { - /*padding: 15px;*/ - margin: 15px; -} -.messageView .b-content .messageItem .bodyText .b-text-part.html pre, -.messageView .b-content .messageItem .bodyText .b-text-part.html code { - margin: 0px; - padding: 0px; - background: #fff; - border: none; - border-radius: 0; - font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; - display: block; - word-break: normal; - word-wrap: break-word; - background-color: #f9f9f9; -} -.messageView .b-content .messageItem .bodyText .b-text-part.html code { - display: inline; - padding: 2px 5px; -} -.messageView .b-content .messageItem .bodyText .b-text-part.html pre { - padding: 5px 10px; - border-radius: 5px; - background-color: #f9f9f9; -} -.messageView .b-content .messageItem .bodyText .b-text-part.html pre > code { - padding: 0px; -} -.messageView .b-content .messageItem .bodyText .b-text-part.plain { - padding: 15px; - /*white-space: pre-wrap;*/ - font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; -} -.messageView .b-content .messageItem .bodyText .b-text-part.plain pre { - margin: 0px; - padding: 0px; - background: #fff; - border: none; - font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; - display: block; - word-break: normal; -} -.messageView .b-content .messageItem .bodyText .b-text-part.plain pre.b-plain-openpgp { - display: inline-block; - padding: 6px 10px; - border: 1px dashed #666; - background: #fff; - word-break: break-all; -} -.messageView .b-content .messageItem .bodyText .b-text-part.plain pre.b-plain-openpgp.success { - border-color: green; - background-color: rgba(0, 255, 0, 0.03); -} -.messageView .b-content .messageItem .bodyText .b-text-part.plain pre.b-plain-openpgp.error { - border-color: red; - background-color: rgba(255, 0, 0, 0.03); -} -.messageView .b-content .messageItem .bodyText .b-text-part.plain blockquote { - border-left: 2px solid blue; - color: blue; -} -.messageView .b-content .messageItem .bodyText .b-text-part.plain blockquote blockquote { - border-left: 2px solid green; - color: green; -} -.messageView .b-content .messageItem .bodyText .b-text-part.plain blockquote blockquote blockquote { - border-left: 2px solid red; - color: red; -} -.messageView .b-content .messageItem .bodyText .b-text-part .b-openpgp-control { - display: inline-block; - cursor: pointer; - color: #777; - /*float: left;*/ -} -.messageView .b-content .messageItem .bodyText .b-text-part .b-openpgp-control:hover { - color: #111; -} -.messageView .b-content .messageItem .bodyText .b-text-part .b-openpgp-control.success { - color: green; - cursor: help; -} -.messageView .b-content .messageItem .bodyText .b-text-part .b-openpgp-control.error { - color: red; -} -.messageView.message-focused .b-content { - z-index: 101; - -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.2); - box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.2); - border-radius: 3px; - border-color: #9d9d9d; -} -.messageView .thread-controls .dropdown-toggle { - padding-left: 10px; - padding-right: 10px; -} -.messageView .thread-controls.open .dropdown-toggle { - padding-left: 10px; - padding-right: 10px; -} -.messageView .thread-list .e-link { - padding: 4px 8px 6px 10px; -} -.messageView .thread-list.hide-more .thread-list-message.more-that { - display: none; -} -.messageView .thread-list .thread-date { - font-size: 13px; - color: #999; -} -.messageView .thread-list .more-threads { - text-align: center; - padding: 8px; - background-color: #F5F5F5; - color: #555; - text-decoration: underline; - border-top: 1px dashed #555; -} -html.rl-resizer .b-message-view-iframe-backdrop { - display: block !important; -} -html.rl-no-preview-pane .messageView .toolbar { - padding-left: 1px; -} -html.rl-no-preview-pane .messageView .b-content { - top: 50px; - left: 0; - bottom: 5px; - right: 5px; - border: 1px solid #aaa; - -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.2); - box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.2); - border-radius: 5px; -} -html.rl-bottom-preview-pane .messageView .b-content { - bottom: 5px; -} -html.cssanimations .messageItem .line-loading { - height: 5px !important; -} -html.rl-message-fullscreen #rl-left, -html.rl-message-fullscreen #rl-bottom { - display: none !important; -} -html.rl-message-fullscreen #rl-right .RL-MailMessageList, -html.rl-message-fullscreen #rl-right .RL-SettingsPane, -html.rl-message-fullscreen #rl-right .RL-SystemDropDown, -html.rl-message-fullscreen #rl-right .RL-MailMessageView .messageView .toolbar { - display: none !important; -} -html.rl-message-fullscreen .messageView .b-content { - position: fixed !important; - margin: 5px !important; - top: 0 !important; - left: 0 !important; - right: 0 !important; - bottom: 0 !important; - z-index: 10000 !important; - border: 1px solid #aaa !important; - border-radius: 3px !important; -} -html .messageItem .buttonUp, -html .messageItem .buttonUp { - display: none !important; -} -html .messageItem.scroller-shadow-top .buttonUp { - display: inline-block !important; -} -html.rl-desktop .messageItem .buttonUp, -html.rl-desktop .messageItem .buttonFull { - display: none !important; -} -html.rl-desktop .messageItem:hover.scroller-shadow-top .buttonUp, -html.rl-desktop .messageItem:hover .buttonFull { - display: inline-block !important; -} -html.rl-message-fullscreen .messageItem .buttonUnFull { - display: inline-block !important; -} -html.rl-message-fullscreen .messageItem .buttonFull { - display: none !important; -} -html.rl-message-fullscreen .messageItem .buttonUp { - display: none !important; -} -html.rl-message-fullscreen .messageItem.scroller-shadow-top .buttonUp { - display: inline-block !important; -} -.b-contacts-content .control-group .control-label.fix-width { - width: 50px; -} -.b-contacts-content .control-group .controls.fix-width { - margin-left: 70px; -} -.b-contacts-content.modal { - position: absolute; - right: 0; - top: 0; - bottom: 0; - left: 0; - width: 900px; - min-height: 300px; - max-height: 700px; - margin: auto; -} -.b-contacts-content.modal .modal-body { - overflow: auto; - height: 100%; - background-color: #f5f5f5; - padding: 0; -} -.b-contacts-content.modal .b-header-toolbar { - height: 40px; - background-color: #aaa; - color: #fff; - background-color: #333; - background-color: rgba(0, 0, 0, 0.8) !important; -} -.b-contacts-content.modal .b-header-toolbar .close, -.b-contacts-content.modal .b-header-toolbar .close-custom { - color: #fff; - opacity: 1; -} -.b-contacts-content.modal .b-header-toolbar .btn { - margin-top: 4px; -} -.b-contacts-content.modal .b-list-toolbar { - padding: 0; - height: 45px; - text-align: right; - width: 220px; - -webkit-box-shadow: inset 0 -1px 0 #ccc; - box-shadow: inset 0 -1px 0 #ccc; -} -.b-contacts-content.modal .b-list-toolbar .e-search { - margin-top: 7px; - width: 200px; -} -.b-contacts-content.modal .b-list-footer-toolbar { - position: absolute; - left: 0; - bottom: 0; - height: 105px; - width: 220px; - background-color: #eee; - -webkit-box-shadow: inset 0 1px 0 #ccc; - box-shadow: inset 0 1px 0 #ccc; -} -.b-contacts-content.modal .b-list-footer-toolbar .footer-pager { - padding: 8px 10px 0 0; -} -.b-contacts-content.modal .b-list-content { - position: absolute; - top: 45px; - bottom: 105px; - left: 0; - width: 220px; - overflow: hidden; - overflow-y: auto; -} -.b-contacts-content.modal .b-list-content .content { - -webkit-overflow-scrolling: touch; -} -.b-contacts-content.modal .b-list-content .listClear { - color: #333; - text-align: center; - padding: 10px; - font-size: 14px; - line-height: 13px; - background-color: #fff; - -webkit-box-shadow: inset 0 -1px 0 #ccc; - box-shadow: inset 0 -1px 0 #ccc; -} -.b-contacts-content.modal .b-list-content .listEmptyList, -.b-contacts-content.modal .b-list-content .listEmptyListLoading, -.b-contacts-content.modal .b-list-content .listEmptySearchList { - color: #999; - text-align: center; - padding: 60px 10px; - font-size: 24px; - line-height: 30px; -} -.b-contacts-content.modal .b-list-content.hideContactListCheckbox .checkedParent, -.b-contacts-content.modal .b-list-content.hideContactListCheckbox .checkboxCkeckAll { - display: none !important; -} -.b-contacts-content.modal .b-list-content.hideContactListCheckbox .sidebarParent { - margin-right: 10px !important; -} -.b-contacts-content.modal .b-list-content .e-contact-foreach { - border-bottom: 1px solid #ddd; -} -.b-contacts-content.modal .b-list-content .e-contact-item { - position: relative; - height: 45px; - max-height: 45px; - line-height: 45px; - overflow: hidden; - cursor: pointer; - margin: 0px; - border: 0px solid transparent; - z-index: 100; -} -.b-contacts-content.modal .b-list-content .e-contact-item .delimiter { - position: relative; - display: block; - height: 1px; - background-color: #999; - opacity: 0.2; -} -.b-contacts-content.modal .b-list-content .e-contact-item .wrapper { - padding: 0; -} -.b-contacts-content.modal .b-list-content .e-contact-item .sidebarParent { - display: inline-block; - width: 6px; - background-color: #eee; - float: left; - height: 100%; -} -.b-contacts-content.modal .b-list-content .e-contact-item.focused .sidebarParent { - background-color: #bbb; -} -.b-contacts-content.modal .b-list-content .e-contact-item.deleted { - max-height: 0px; - border-color: transparent !important; -} -.b-contacts-content.modal .b-list-content .e-contact-item .checkedParent { - display: inline-block; - float: left; - padding: 0 8px 0 6px; -} -.b-contacts-content.modal .b-list-content .e-contact-item .shareParent { - display: none; - float: right; - position: relative; - margin: 2px 8px 0 5px; -} -.b-contacts-content.modal .b-list-content .e-contact-item .nameParent { - display: block; - overflow: hidden; - -o-text-overflow: ellipsis; - text-overflow: ellipsis; - color: #333; - font-size: 16px; -} -.b-contacts-content.modal .b-list-content .e-contact-item .nameParent, -.b-contacts-content.modal .b-list-content .e-contact-item .emailParent { - white-space: nowrap; -} -.b-contacts-content.modal .b-list-content .e-contact-item .displayName, -.b-contacts-content.modal .b-list-content .e-contact-item .displayEmail { - overflow: hidden; - -o-text-overflow: ellipsis; - text-overflow: ellipsis; -} -.b-contacts-content.modal .b-list-content .e-contact-item .displayImg { - display: inline-block; - float: right; - position: relative; - margin: 0 5px; -} -.b-contacts-content.modal .b-list-content .e-contact-item.shared .shareParent { - display: inline-block; -} -.b-contacts-content.modal .b-list-content .e-contact-item.checked { - z-index: 101; -} -.b-contacts-content.modal .b-list-content .e-contact-item.checked .sidebarParent { - background-color: #69A8F5; -} -.b-contacts-content.modal .b-list-content .e-contact-item.checked.focused .sidebarParent { - background-color: #519af3 !important; -} -.b-contacts-content.modal .b-list-content .e-contact-item.selected { - background-color: #fff; - z-index: 102; -} -.b-contacts-content.modal .b-list-content .e-contact-item.selected .sidebarParent { - background-color: #398CF2; -} -.b-contacts-content.modal .b-list-content .e-contact-item.selected.focused .sidebarParent { - background-color: #217ef0 !important; -} -.b-contacts-content.modal .b-view-content-toolbar { - background-color: #f5f5f5; - padding: 7px; - position: absolute; - top: 0; - right: 0; - left: 220px; - height: 31px; - text-align: center; - -webkit-box-shadow: inset 0 -1px 0 #ccc; - box-shadow: inset 0 -1px 0 #ccc; -} -.b-contacts-content.modal .b-view-content-toolbar .button-save-contact.no-disabled.dirty { - color: #51a351; - font-weight: bold; -} -.b-contacts-content.modal .b-view-content-toolbar.read-only .button-save-contact { - display: none; -} -.b-contacts-content.modal .b-view-content { - position: absolute; - top: 45px; - bottom: 60px; - left: 220px; - right: 0; - overflow: hidden; - overflow-y: auto; - background-color: #fff; - border-left: 1px solid #ddd; -} -.b-contacts-content.modal .b-view-content .content { - -webkit-overflow-scrolling: touch; -} -.b-contacts-content.modal .b-view-content .contactValueStatic, -.b-contacts-content.modal .b-view-content .contactValueLargeStatic, -.b-contacts-content.modal .b-view-content .contactValueTextAreaStatic { - height: 20px; - line-height: 20px; - font-size: 18px; - display: inline-block; - padding: 5px 7px; - color: #555; - display: none; -} -.b-contacts-content.modal .b-view-content.read-only .contactValueStatic, -.b-contacts-content.modal .b-view-content.read-only .contactValueLargeStatic, -.b-contacts-content.modal .b-view-content.read-only .contactValueTextAreaStatic { - display: inline-block; -} -.b-contacts-content.modal .b-view-content.read-only .contactValueInput, -.b-contacts-content.modal .b-view-content.read-only .contactValueInputLarge, -.b-contacts-content.modal .b-view-content.read-only .contactValueTextArea { - display: none; -} -.b-contacts-content.modal .b-view-content .b-contact-view-desc { - text-align: center; - font-size: 24px; - line-height: 30px; - padding-top: 120px; - color: #999; -} -.b-contacts-content.modal .b-view-content .top-part { - padding-top: 20px; -} -.b-contacts-content.modal .b-view-content .property-line { - margin-bottom: 5px; -} -.b-contacts-content.modal .b-view-content .top-row { - padding: 10px 0; - height: 30px; -} -.b-contacts-content.modal .b-view-content .add-link { - margin-left: 2px; - padding: 5px; - font-size: 12px; - color: #aaa; -} -.b-contacts-content.modal .b-view-content .contactValueStatic, -.b-contacts-content.modal .b-view-content .contactValueLargeStatic, -.b-contacts-content.modal .b-view-content .contactValueTextAreaStatic { - font-size: 18px; - display: none; -} -.b-contacts-content.modal .b-view-content .contactValueInput, -.b-contacts-content.modal .b-view-content .contactValueInputLarge, -.b-contacts-content.modal .b-view-content .contactValueTextArea { - -webkit-box-shadow: none; - box-shadow: none; - border-color: #fff; - font-size: 18px; - width: 300px; -} -.b-contacts-content.modal .b-view-content .contactValueInput:hover, -.b-contacts-content.modal .b-view-content .contactValueInputLarge:hover, -.b-contacts-content.modal .b-view-content .contactValueTextArea:hover { - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - border-color: #ccc; -} -.b-contacts-content.modal .b-view-content .contactValueInput:focus, -.b-contacts-content.modal .b-view-content .contactValueInputLarge:focus, -.b-contacts-content.modal .b-view-content .contactValueTextArea:focus { - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - border-color: #999; -} -.b-contacts-content.modal .b-view-content .contactValueInput::-webkit-input-placeholder, -.b-contacts-content.modal .b-view-content .contactValueInputLarge::-webkit-input-placeholder, -.b-contacts-content.modal .b-view-content .contactValueTextArea::-webkit-input-placeholder { - color: #ddd; -} -.b-contacts-content.modal .b-view-content .contactValueInput::-moz-placeholder, -.b-contacts-content.modal .b-view-content .contactValueInputLarge::-moz-placeholder, -.b-contacts-content.modal .b-view-content .contactValueTextArea::-moz-placeholder { - color: #ddd; -} -.b-contacts-content.modal .b-view-content .contactValueInput:-moz-placeholder, -.b-contacts-content.modal .b-view-content .contactValueInputLarge:-moz-placeholder, -.b-contacts-content.modal .b-view-content .contactValueTextArea:-moz-placeholder { - color: #ddd; -} -.b-contacts-content.modal .b-view-content .contactValueInput:-ms-input-placeholder, -.b-contacts-content.modal .b-view-content .contactValueInputLarge:-ms-input-placeholder, -.b-contacts-content.modal .b-view-content .contactValueTextArea:-ms-input-placeholder { - color: #ddd; -} -.b-contacts-content.modal .b-view-content .contactValueTextArea { - width: 300px; -} -.b-contacts-content.modal .b-view-content .contactValueInputLarge { - width: 400px; -} -.b-contacts-content.modal .b-view-content .hasError .contactValueInput { - color: #ee5f5b; - border-color: #ee5f5b; -} -.b-contacts-content.modal .b-view-content .e-save-trigger { - position: absolute; - top: 25px; - left: 10px; -} -.b-contacts-content.modal .b-view-content .e-read-only-sign { - display: none; - position: absolute; - top: 20px; - right: 40px; -} -.b-contacts-content.modal .b-view-content .e-share-sign { - position: absolute; - top: 20px; - right: 20px; - cursor: pointer; -} -.b-contacts-content.modal .b-view-content.read-only .e-read-only-sign { - display: inline-block; -} -.b-contacts-content.modal .b-view-content.read-only .e-share-sign { - display: none; -} -.b-contacts-content .e-contact-item { - position: relative; - height: 55px; - max-height: 60px; - line-height: 22px; - overflow: hidden; - cursor: pointer; - margin: 0px; - border: 0px solid transparent; - z-index: 100; -} -html.rl-mobile .b-contacts-content .b-list-content, -html.rl-mobile .b-contacts-content .b-list-toolbar, -html.rl-mobile .b-contacts-content .b-list-footer-toolbar { - width: 170px; -} -html.rl-mobile .b-contacts-content .b-list-toolbar .e-search { - width: 150px; -} -html.rl-mobile .b-contacts-content .b-view-content-toolbar, -html.rl-mobile .b-contacts-content .b-view-content { - left: 170px; -} -.b-compose.modal { - width: 850px; - margin: 10px auto; -} -.b-compose.modal .modal-body { - overflow: auto; - padding: 0px; -} -.b-compose .textAreaParent, -.b-compose .attachmentAreaParent { - overflow: hidden; - position: relative; -} -.b-compose .attachmentAreaParent { - padding: 10px 10px 6px 10px; - background: #ddd; - border-top: 1px solid #ccc; - overflow-y: auto; -} -.b-compose .attachmentAreaParent .no-attachments-desc { - padding: 50px 10px; - text-align: center; - font-size: 24px; - color: #666; - text-shadow: 0 1px 0 #fff; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); -} -.b-compose .attachmentAreaParent .attachmentList { - margin: 0; - padding: 10px; -} -.b-compose .b-header-toolbar { - height: 40px; - color: #fff; - background-color: #aaa; - background-color: #333; - background-color: rgba(0, 0, 0, 0.8) !important; -} -.b-compose .b-header-toolbar .close, -.b-compose .b-header-toolbar .close-custom, -.b-compose .b-header-toolbar .minimize-custom { - opacity: 1; - color: #fff; - border-color: #eee; - font-size: 24px; - line-height: 24px; -} -.b-compose .b-header-toolbar .btn.disabled.button-delete { - visibility: hidden; -} -.b-compose .b-header-toolbar .button-save, -.b-compose .b-header-toolbar .button-delete, -.b-compose .b-header-toolbar .saved-text { - margin-left: 8px; -} -.b-compose .b-header-toolbar .button-close, -.b-compose .b-header-toolbar .button-skip { - margin-left: 8px; -} -.b-compose .b-header-toolbar .disabled.button-delete { - margin-left: 0px; -} -.b-compose .b-header { - padding: 10px; - background-color: #eee; - color: #333; -} -html.rl-mobile .b-compose .b-header { - overflow: scroll; -} -.b-compose .b-header .e-identity { - color: #333; - text-decoration: none; - font-weight: bold; -} -.b-compose .b-header .e-identity:hover { - color: #333; - text-decoration: none; -} -.b-compose .b-header .e-identity.multiply { - cursor: pointer; - border-bottom: 1px dashed #555; -} -.b-compose .b-header .e-row { - line-height: 30px; -} -.b-compose .b-header .e-label { - text-align: right; - width: 1%; - min-width: 70px; - padding: 6px 10px; -} -html.rl-mobile .b-compose .b-header .e-label { - min-width: 50px; - padding: 6px 10px 6px 0px; -} -.b-compose .b-header .e-value { - padding: 2px 0px; -} -.b-compose .b-header .e-value textarea, -.b-compose .b-header .e-value input[type="text"] { - width: 98%; -} -.b-compose .b-header .e-value textarea { - height: 40px; -} -.b-compose .b-header .error-desc { - color: red; -} -.b-compose .b-header .error-to { - color: red; - font-weight: bold; -} -.b-compose .b-header .b-appachments .b-attacment { - line-height: 20px; - padding-bottom: 10px; -} -.b-compose .b-header .b-appachments .b-attacment-in-process { - line-height: 20px; - padding-bottom: 10px; -} -.b-compose .b-header .b-appachments .b-attacment-in-process .uploading { - display: none; - padding-right: 5px; -} -.b-compose .b-header .b-appachments .b-attacment-in-process.uploading .uploading { - display: inline; -} -.b-compose .b-header .b-appachments .b-attacment-in-process .upload-progress { - font-weight: bold; -} -.b-compose .b-header .b-appachments .b-attacment-in-process.error .namedStr { - color: #888; -} -.b-compose .b-header .b-appachments .b-attacment-in-process .error { - color: red; -} -.b-compose .b-header .b-appachments .b-attacment-in-process .close, -.b-compose .b-header .b-appachments .b-attacment-in-process .close-custom { - float: left; - padding-right: 13px; -} -.b-compose .cke_chrome { - border-left-width: 0 !important; - border-right-width: 0 !important; - border-bottom-width: 0 !important; -} -.b-compose .b-attachment-button { - display: inline-block; -} -.b-compose .b-attachment-place { - position: absolute; - left: 5px; - right: 5px; - top: 5px; - bottom: 5px; - border: 2px #777 dashed; - z-index: 300; - line-height: 119px; - text-align: center; - background-color: #efefef; - font-size: 24px; - border-radius: 10px; -} -.b-compose .b-attachment-place.dragAndDropOver { - background-color: #fff; -} -.b-admin-left .b-toolbar { - position: absolute; - top: 0; - right: 0; - left: 0; - height: 34px; - padding: 8px 0 0 8px; -} -.b-admin-left .b-content { - position: absolute; - top: 68px; - bottom: 8px; - left: 0; - right: 0; - overflow: hidden; -} -.b-admin-left .b-content .content { - -webkit-overflow-scrolling: touch; -} -.b-admin-menu .e-item { - overflow: hidden; - text-decoration: none; - outline: 0; -} -.b-admin-menu .e-link { - position: relative; - display: block; - height: 30px; - line-height: 29px; - cursor: pointer; - font-size: 18px; - z-index: 1; - cursor: default; - background-color: transparent; - color: #888; - padding: 4px 10px; - outline: 0; - text-decoration: none; -} -.b-admin-menu .e-item.selectable .e-link { - cursor: pointer; -} -.b-admin-menu .e-item.selectable:hover .e-link, -.b-admin-menu .e-item.selectable.selected .e-link { - background-color: #555; - color: #fff; -} -.b-admin-right .b-toolbar { - position: absolute; - top: 0; - right: 0; - left: 0; - height: 34px; - padding: 8px 8px; - color: #fff; - text-shadow: 0px 1px 1px #000; -} -.b-admin-right .b-content { - position: absolute; - top: 58px; - bottom: 8px; - left: 0; - right: 8px; - overflow-y: auto; - z-index: 2; - background-color: #fff; - border: 1px solid #aaa; - -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.2); - box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.2); - border-radius: 5px; -} -.b-admin-right .b-content .content { - -webkit-overflow-scrolling: touch; -} -.b-admin-right .b-settings-content { - padding: 20px; - padding-left: 30px; -} -.b-admin-right .b-settings-content .legend { - width: 670px; -} -.b-admin-right .b-settings-content .nav-tabs { - width: 670px; -} -html.rl-mobile .b-settings-content .legend { - width: auto; -} -.b-admin-general .flag-selector { - padding-top: 5px; -} -.b-admin-general .flag-name { - border-bottom: 1px dashed #555; - cursor: pointer; - padding: 2px 0px; -} -.b-admin-general .flag-name:focus { - outline: 1px; - outline-style: dotted; -} -.b-admin-branding .disabled-form { - opacity: 0.8; -} -.b-admin-branding .custom-css-wrapper textarea { - font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; -} -.b-admin-domains .process-place { - width: 600px; - padding: 14px 0; - text-align: center; - visibility: hidden; -} -.b-admin-domains-list-table { - width: 600px; -} -.b-admin-domains-list-table .e-item .e-action { - cursor: pointer; -} -.b-admin-domains-list-table .e-item .domain-name { - display: inline-block; - word-break: break-all; - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -.b-admin-domains-list-table .e-item .domain-alias { - display: inline-block; - -webkit-box-sizing: border-box; - box-sizing: border-box; - color: #bbb; - padding-left: 5px; -} -.b-admin-domains-list-table .e-item.disabled .domain-name, -.b-admin-domains-list-table .e-item.disabled .domain-alias { - color: #bbb; -} -.b-admin-domains-list-table .e-item .button-delete { - margin-right: 15px; - visibility: hidden; - opacity: 0; -} -.b-admin-domains-list-table .e-item .delete-access.button-delete { - visibility: visible; - margin-right: 0; - opacity: 1; -} -.b-admin-domains-list-table .e-item .delete-domain, -.b-admin-domains-list-table .e-item .disabled-domain { - cursor: pointer; - opacity: 0.5; -} -.b-admin-domains-list-table .e-item.disabled .disabled-domain { - opacity: 0.5; -} -.b-admin-domains-list-table .e-item .delete-domain:hover, -.b-admin-domains-list-table .e-item .disabled-domain:hover { - opacity: 1; -} -.b-domain-alias-content.modal { - width: 330px; -} -.b-domain-alias-content .modal-header { - background-color: #fff; -} -.b-domain-alias-content .error-desc { - color: red; -} -.b-domain-content.modal { - width: 810px; -} -.b-domain-content .modal-header { - background-color: #fff; -} -.b-domain-content .modal-body { - position: relative; - overflow: hidden; - width: 1600px; - height: 400px; - left: 0; -} -.b-domain-content.domain-edit .modal-body { - height: 340px; -} -.b-domain-content.domain-second-page .modal-body { - left: -800px; -} -.b-domain-content .domain-desc { - color: #666; - line-height: 20px; - background-color: #f9f9f9; - padding: 8px; - border: 1px solid #eee; - border-radius: 3px; - margin: -5px 0; -} -.b-domain-content .domain-desc i { - font-style: normal; - color: red; -} -.b-domain-content .error-desc { - color: red; -} -.b-domain-content .testing-done.imap-header, -.b-domain-content .testing-done.sieve-header, -.b-domain-content .testing-done.smtp-header { - color: green; - font-weight: bold; -} -.b-domain-content .testing-error.imap-header, -.b-domain-content .testing-error.sieve-header, -.b-domain-content .testing-error.smtp-header { - color: red; -} -.b-admin-packages .alert { - width: 650px; -} -.b-admin-packages .process-place { - visibility: hidden; -} -.b-admin-packages-list-table { - width: 700px; -} -.b-admin-packages-list-table .e-item .package-img { - font-size: 12px; - margin-right: 2px; -} -.b-admin-packages-list-table .e-item .package-name.core { - font-weight: bold; -} -.b-admin-packages-list-table .e-item .package-desc { - color: #999; - font-size: 12px; -} -.b-admin-packages-list-table .e-item .e-action { - cursor: pointer; -} -.b-admin-packages-list-table .e-item .package-release-parent, -.b-admin-packages-list-table .e-item .package-actions-parent { - text-align: center; -} -.b-admin-packages-list-table .e-item .package-actions-parent { - vertical-align: middle; -} -.b-admin-plugins .process-place { - visibility: hidden; -} -.b-admin-plugins-list-table.disabled { - opacity: 0.5; - background-color: #eee; -} -.b-admin-plugins-list-table .e-item .e-action { - cursor: pointer; -} -.b-admin-plugins-list-table .e-item .plugin-img { - font-size: 12px; - margin-right: 2px; -} -.b-admin-plugins-list-table .e-item.disabled .plugin-img, -.b-admin-plugins-list-table .e-item.disabled .plugin-name { - color: #bbb; -} -.b-admin-plugins-list-table .e-item.disabled .disabled-plugin { - opacity: 0.5; -} -.b-admin-plugin-property .help-block { - margin-bottom: 5px; -} -.b-plugin-content.modal { - width: 660px; -} -.b-plugin-content.modal .modal-body { - overflow: auto; -} -.b-plugin-content .modal-header { - background-color: #fff; -} -.b-plugin-content .information { - display: inline-block; - background-color: #ddd; - border-radius: 10px; - cursor: pointer; - height: 25px; - width: 30px; - text-align: center; - padding-top: 5px; -} -.b-plugin-content textarea { - width: 400px; - height: 70px; -} -.b-admin-about .rl-logo { - display: inline-block; - width: 250px; - height: 250px; - margin-top: -10px; - margin-bottom: -10px; - background-image: url("images/rainloop-logo.png"); -} -.b-admin-about .rl-desc { - margin-top: 20px; - margin-left: -20px; -} -.popups .b-activate-content { - width: 700px; -} -.popups .b-activate-content .modal-header { - background-color: #fff; -} -.popups .b-activate-content .help-inline { - padding-left: 0px; -} -.b-settins-left .b-toolbar { - position: absolute; - top: 0; - right: 0; - left: 0; - height: 34px; - padding: 8px 0 0 8px; -} -.b-settins-left .b-footer { - position: absolute; - bottom: 20px; - right: 0; - left: 0; - height: 20px; - padding: 0 10px 0 5px; - z-index: 101; -} -.b-settins-left .b-content { - position: absolute; - top: 68px; - bottom: 8px; - left: 0; - right: 0; - overflow: hidden; -} -.b-settins-left .b-content .content { - -webkit-overflow-scrolling: touch; -} -.b-settings-menu .e-item { - overflow: hidden; - text-decoration: none; - outline: 0; -} -.b-settings-menu .e-link { - position: relative; - display: block; - height: 30px; - line-height: 29px; - font-size: 18px; - z-index: 1; - cursor: default; - background-color: transparent; - color: #888; - padding: 4px 10px; - outline: 0; - text-decoration: none; -} -.b-settings-menu .e-item.selectable .e-link { - cursor: pointer; -} -.b-settings-menu .e-item.selectable:hover .e-link, -.b-settings-menu .e-item.selectable.selected .e-link { - background-color: #555; - color: #fff; -} -.b-settins-right .b-toolbar { - position: absolute; - top: 0; - right: 0; - left: 0; - height: 34px; - padding: 8px 5px; - color: #fff; -} -.b-settins-right .b-content { - position: absolute; - top: 50px; - bottom: 8px; - left: 0; - right: 8px; - overflow-y: auto; - z-index: 2; - background-color: #fff; - border: 1px solid #aaa; - -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.2); - box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.2); - border-radius: 5px; -} -.b-settins-right .b-content .content { - -webkit-overflow-scrolling: touch; -} -.b-settins-right .b-settings-content { - padding: 20px; - padding-left: 30px; -} -.b-settins-right .b-settings-content .legend { - width: 600px; -} -html.rl-mobile .b-settings-content .legend { - width: auto; -} -html.rl-mobile .b-settings-general { - margin-right: 15px; -} -.b-settings-general .notification-desc-denied { - color: #999; - display: none; -} -.b-settings-general .denied-by-browser .notification-desc-denied { - display: inline; -} -.b-settings-general .denied-by-browser .notification-desc { - color: #999; -} -.b-settings-general .flag-selector { - padding-top: 5px; -} -.b-settings-general .flag-name { - border-bottom: 1px dashed #555; - cursor: pointer; - padding: 2px 0px; -} -.b-settings-general .flag-name:focus { - outline: 1px; - outline-style: dotted; -} -html.rl-mobile .b-settings-accounts { - margin-right: 15px; -} -.b-settings-accounts .process-place { - text-align: center; - width: 600px; - padding: 14px 0; -} -.b-settings-accounts .list-table { - width: 600px; -} -.b-settings-accounts .list-table td { - padding: 4px 8px; - line-height: 30px; -} -.b-settings-accounts .list-table .drag-handle { - color: #eee; -} -.b-settings-accounts .list-table tr:hover .drag-handle { - color: #aaa; -} -.b-settings-accounts .list-table .account-img, -.b-settings-accounts .list-table .identity-img { - font-size: 12px; - margin-right: 5px; -} -.b-settings-accounts .list-table .account-name { - display: inline-block; - word-break: break-all; - -webkit-box-sizing: border-box; - box-sizing: border-box; - line-height: 22px; -} -.b-settings-accounts .list-table .identity-default { - cursor: pointer; - color: #ccc; -} -.b-settings-accounts .list-table .identity-name { - display: inline-block; - word-break: break-all; - -webkit-box-sizing: border-box; - box-sizing: border-box; - line-height: 22px; - cursor: pointer; -} -.b-settings-accounts .accounts-list-top-padding, -.b-settings-accounts .identities-list-top-padding { - display: inline-block; - height: 5px; - width: 5px; -} -.b-settings-accounts .account-item { - white-space: nowrap; -} -.b-settings-accounts .account-item .e-action { - cursor: pointer; -} -.b-settings-accounts .account-item .drag-handle { - cursor: pointer; - cursor: all-scroll; -} -.b-settings-accounts .account-item .button-delete { - margin-right: 15px; - margin-top: 5px; - visibility: hidden; - opacity: 0; -} -.b-settings-accounts .account-item .delete-access.button-delete { - visibility: visible; - margin-right: 0; - opacity: 1; -} -.b-settings-accounts .account-item .delete-account { - cursor: pointer; - opacity: 0.5; -} -.b-settings-accounts .account-item.ui-sortable-helper { - background: #F5F5F5; - border: 1px solid #DDD; -} -.b-settings-accounts .account-item.ui-sortable-helper .button-delete, -.b-settings-accounts .account-item.ui-sortable-helper .delete-account { - display: none; -} -.b-settings-accounts .account-item.ui-sortable-helper td { - border-width: 0px; -} -.b-settings-accounts .identity-item { - white-space: nowrap; -} -.b-settings-accounts .identity-item .e-action { - cursor: pointer; -} -.b-settings-accounts .identity-item .button-delete { - margin-right: 15px; - margin-top: 5px; - visibility: hidden; - opacity: 0; -} -.b-settings-accounts .identity-item .delete-access.button-delete { - visibility: visible; - margin-right: 0; - opacity: 1; -} -.b-settings-accounts .identity-item .delete-identity { - cursor: pointer; - opacity: 0.5; -} -.b-settings-accounts .identity-item.ui-sortable-helper { - background: #F5F5F5; - border: 1px solid #DDD; -} -.b-settings-accounts .identity-item.ui-sortable-helper .button-delete, -.b-settings-accounts .identity-item.ui-sortable-helper .delete-identity { - display: none; -} -.b-settings-accounts .identity-item.ui-sortable-helper td { - border-width: 0px; -} -html.rl-mobile .b-settings-templates { - margin-right: 15px; -} -.b-settings-templates .process-place { - text-align: center; - width: 600px; - padding: 14px 0; -} -.b-settings-templates .list-table { - width: 600px; -} -.b-settings-templates .list-table td { - padding: 4px 8px; - line-height: 30px; -} -.b-settings-templates .list-table .drag-handle { - color: #eee; -} -.b-settings-templates .list-table tr:hover .drag-handle { - color: #aaa; -} -.b-settings-templates .list-table .template-img { - font-size: 12px; - margin-right: 5px; -} -.b-settings-templates .list-table .template-name { - display: inline-block; - word-break: break-all; - -webkit-box-sizing: border-box; - box-sizing: border-box; - line-height: 22px; -} -.b-settings-templates .templates-list-top-padding { - display: inline-block; - height: 5px; - width: 5px; -} -.b-settings-templates .template-item .e-action { - cursor: pointer; -} -.b-settings-templates .template-item .drag-handle { - cursor: pointer; - cursor: all-scroll; -} -.b-settings-templates .template-item .button-delete { - margin-right: 15px; - margin-top: 5px; - visibility: hidden; - opacity: 0; -} -.b-settings-templates .template-item .delete-access.button-delete { - visibility: visible; - margin-right: 0; - opacity: 1; -} -.b-settings-templates .template-item .delete-template { - cursor: pointer; - opacity: 0.5; -} -.b-settings-templates .template-item.ui-sortable-helper { - background: #F5F5F5; - border: 1px solid #DDD; -} -.b-settings-templates .template-item.ui-sortable-helper .button-delete, -.b-settings-templates .template-item.ui-sortable-helper .delete-template { - display: none; -} -.b-settings-templates .template-item.ui-sortable-helper td { - border-width: 0px; -} -html.rl-mobile .b-settings-open-pgp { - margin-right: 15px; -} -.b-settings-open-pgp .process-place { - text-align: center; - width: 600px; - padding: 14px 0; -} -.b-settings-open-pgp .list-table { - width: 750px; -} -.b-settings-open-pgp .list-table td { - padding: 4px 8px; - line-height: 30px; -} -.b-settings-open-pgp .list-table .open-pgp-key-img { - margin-right: 10px; - vertical-align: top; -} -.b-settings-open-pgp .list-table .open-pgp-key-img .svg-icon { - width: 12px; - height: 12px; -} -.b-settings-open-pgp .list-table .open-pgp-key-id, -.b-settings-open-pgp .list-table .open-pgp-key-user { - display: inline-block; - word-break: break-all; - -webkit-box-sizing: border-box; - box-sizing: border-box; - line-height: 22px; - cursor: default; -} -.b-settings-open-pgp .list-table .open-pgp-key-user-address:first-child { - line-height: 30px; - margin-bottom: -4px; -} -.b-settings-open-pgp .open-pgp-key-item .button-delete { - margin-right: 15px; - margin-top: 5px; - visibility: hidden; - opacity: 0; -} -.b-settings-open-pgp .open-pgp-key-item .delete-access.button-delete { - visibility: visible; - margin-right: 0; - opacity: 1; -} -.b-settings-open-pgp .open-pgp-key-item .delete-open-pgp-key, -.b-settings-open-pgp .open-pgp-key-item .view-open-pgp-key { - cursor: pointer; - opacity: 0.7; -} -.b-settings-open-pgp .open-pgp-key-item .delete-open-pgp-key:hover, -.b-settings-open-pgp .open-pgp-key-item .view-open-pgp-key:hover { - opacity: 0.9; -} -html.rl-mobile .b-settings-folders { - margin-right: 35px; -} -.b-settings-folders.ignore-folder-subscribe .subscribe-folder, -.b-settings-folders.ignore-folder-subscribe .unsubscribe-folder { - display: none; -} -.b-settings-folders .process-place { - text-align: center; - width: 600px; - padding: 14px 0; -} -.b-settings-folders .folders-list-error { - width: 550px; - margin: 10px 0px; -} -.b-settings-folders .list-table { - width: 600px; -} -.b-settings-folders .list-table .e-action { - cursor: pointer; -} -.b-settings-folders .list-table td { - padding: 4px 8px; - line-height: 30px; -} -.b-settings-folders .list-table .folder-padding { - display: inline-block; - width: 0; -} -.b-settings-folders .list-table .folder-name { - display: inline-block; - word-break: break-all; - white-space: pre-wrap; - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin-left: 7px; - line-height: 22px; - cursor: default; -} -.b-settings-folders .list-table .folder-system-name { - display: inline-block; - line-height: 22px; - color: #999; - cursor: default; -} -.b-settings-folders .list-table .folder-name.can-be-edited:hover { - border-bottom: 1px dashed #333; - cursor: pointer; -} -.b-settings-folders .list-table .folder-name-input { - border-width: 1px; - margin-bottom: 0; - margin-left: -4px; -} -.b-settings-folders .folder-item.system .folder-name { - font-weight: bold; -} -.b-settings-folders .folder-item .button-delete { - margin-right: 15px; - margin-top: 5px; - visibility: hidden; - opacity: 0; -} -.b-settings-folders .folder-item .delete-access.button-delete { - visibility: visible; - margin-right: 0; - opacity: 1; -} -.b-settings-folders .folder-item .delete-folder, -.b-settings-folders .folder-item .subscribe-folder, -.b-settings-folders .folder-item .unsubscribe-folder, -.b-settings-folders .folder-item .check-folder, -.b-settings-folders .folder-item .uncheck-folder { - cursor: pointer; - opacity: 0.6; -} -.b-settings-folders .folder-item .unsubscribe-folder { - opacity: 0.2; -} -.b-settings-folders .folder-item .uncheck-folder { - opacity: 0.2; -} -.b-settings-folders .folder-padding.deep-1 { - width: 25px; -} -.b-settings-folders .folder-padding.deep-2 { - width: 40px; -} -.b-settings-folders .folder-padding.deep-3 { - width: 55px; -} -.b-settings-folders .folder-padding.deep-4 { - width: 70px; -} -.b-settings-folders .folder-padding.deep-5 { - width: 85px; -} -.b-settings-content .b-settings-themes .legend { - width: 100%; -} -html.rl-mobile .b-settings-content .b-settings-theme .legend { - width: auto; -} -html.rl-mobile .b-themes-list { - margin-right: 15px; -} -.b-themes-list .e-item { - display: inline-block; - border: 2px solid transparent; - cursor: pointer; - color: #000; - background-color: #fff; - padding: 16px; - margin: 5px; -} -.b-themes-list .e-item:hover { - border: 2px solid grey; -} -.b-themes-list .e-item.selected { - background-color: #eee; - border: 2px solid #000; -} -.b-themes-list .e-item .e-image { - width: 100px; - height: 100px; - border: 1px solid #ddd; -} -html.rl-mobile .b-settings-filters { - margin-right: 15px; -} -.b-settings-filters .process-place { - text-align: center; - width: 600px; - padding: 14px 0; -} -.b-settings-filters .list-table { - width: 600px; -} -.b-settings-filters .list-table td { - padding: 4px 8px; - line-height: 30px; -} -.b-settings-filters .list-table td.drag-wrapper { - padding: 4px 0; -} -.b-settings-filters .list-table .drag-handle { - color: #eee; -} -.b-settings-filters .list-table tr:hover .drag-handle { - color: #aaa; -} -.b-settings-filters .list-table .filter-img { - font-size: 12px; - margin-right: 5px; -} -.b-settings-filters .list-table .filter-name, -.b-settings-filters .list-table .filter-sub-name { - display: inline-block; - word-break: break-all; - -webkit-box-sizing: border-box; - box-sizing: border-box; - line-height: 22px; - cursor: pointer; -} -.b-settings-filters .list-table .filter-sub-name { - color: #aaa; -} -.b-settings-filters .filters-list-top-padding { - display: inline-block; - height: 5px; - width: 5px; -} -.b-settings-filters .filter-item { - white-space: nowrap; -} -.b-settings-filters .filter-item .e-action { - cursor: pointer; -} -.b-settings-filters .filter-item .drag-handle { - cursor: pointer; - cursor: all-scroll; -} -.b-settings-filters .filter-item .button-delete { - margin-right: 15px; - margin-top: 5px; - visibility: hidden; - opacity: 0; -} -.b-settings-filters .filter-item .delete-access.button-delete { - visibility: visible; - margin-right: 0; - opacity: 1; -} -.b-settings-filters .filter-item .delete-filter { - cursor: pointer; - opacity: 0.5; -} -.b-settings-filters .filter-item.ui-sortable-helper { - background: #F5F5F5; - border: 1px solid #DDD; -} -.b-settings-filters .filter-item.ui-sortable-helper .button-delete, -.b-settings-filters .filter-item.ui-sortable-helper .delete-filter { - display: none; -} -.b-settings-filters .filter-item.ui-sortable-helper td { - border-width: 0px; -} -.rl-cmd { - position: absolute; - bottom: 0; - left: 0; - right: 0; - top: auto; - height: 0; - z-index: 10000; - background: rgba(0, 0, 0, 0.85); - border-top: 1px solid #000; - overflow: hidden; - font-family: monospace; - -webkit-transition: height 0.1s ease-out; - -o-transition: height 0.1s ease-out; - transition: height 0.1s ease-out; -} -.rl-cmd.opened { - height: 250px; -} -.rl-cmd .rl-cmd-clr-error { - color: #CD3131; -} -.rl-cmd .rl-cmd-clr-info { - color: #BFBF00; -} -.rl-cmd .rl-cmd-clr-success { - color: #31FF40; -} -.rl-cmd .rl-cmd-wrp { - position: relative; - height: 100%; -} -.rl-cmd .rl-cmd-input-helper { - color: #666; -} -.rl-cmd .rl-cmd-input-prefix { - color: #31FF40; - display: inline-block; -} -.rl-cmd .rl-cmd-input-wrp { - position: absolute; - bottom: 0; - left: 10px; - right: 10px; -} -.rl-cmd .rl-cmd-input { - background: none; - border: none; - color: white; - display: inline-block; - width: calc(100% - 30px); - font-family: monospace; -} -.rl-cmd .rl-cmd-input:focus { - background: none; - border: none; -} -.rl-cmd .rl-cmd-history { - color: white; - font-family: monospace; - position: absolute; - top: 10px; - bottom: 60px; - left: 10px; - right: -30px; - overflow: hidden; - overflow-x: hidden; - overflow-y: auto; -} -@-webkit-keyframes highlight-folder-row { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - } - 50% { - -webkit-transform: scale(1.1); - transform: scale(1.1); - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - } -} -@keyframes highlight-folder-row { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - } - 50% { - -webkit-transform: scale(1.1); - transform: scale(1.1); - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - } -} -@-webkit-keyframes bounce-me { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - } - 50% { - -webkit-transform: scale(1.2); - transform: scale(1.2); - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - } -} -@keyframes bounce-me { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - } - 50% { - -webkit-transform: scale(1.2); - transform: scale(1.2); - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - } -} -@-webkit-keyframes textLoadingAnimationKeyFrame { - 0% { - opacity: 1; - } - 33% { - opacity: 0; - } - 100% { - opacity: 1; - } -} -@keyframes textLoadingAnimationKeyFrame { - 0% { - opacity: 1; - } - 33% { - opacity: 0; - } - 100% { - opacity: 1; - } -} -@-webkit-keyframes animate-stripes { - 0% { - background-position: 0 0; - } - 100% { - background-position: 60px 0; - } -} -@keyframes animate-stripes { - 0% { - background-position: 0 0; - } - 100% { - background-position: 60px 0; - } -} -@-webkit-keyframes login-form-shake { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - 12.5% { - -webkit-transform: translateX(-6px) rotateY(-5deg); - transform: translateX(-6px) rotateY(-5deg); - } - 37.5% { - -webkit-transform: translateX(5px) rotateY(4deg); - transform: translateX(5px) rotateY(4deg); - } - 62.5% { - -webkit-transform: translateX(-3px) rotateY(-2deg); - transform: translateX(-3px) rotateY(-2deg); - } - 87.5% { - -webkit-transform: translateX(2px) rotateY(1deg); - transform: translateX(2px) rotateY(1deg); - } - 100% { - -webkit-transform: translateX(0); - transform: translateX(0); - } -} -@keyframes login-form-shake { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - 12.5% { - -webkit-transform: translateX(-6px) rotateY(-5deg); - transform: translateX(-6px) rotateY(-5deg); - } - 37.5% { - -webkit-transform: translateX(5px) rotateY(4deg); - transform: translateX(5px) rotateY(4deg); - } - 62.5% { - -webkit-transform: translateX(-3px) rotateY(-2deg); - transform: translateX(-3px) rotateY(-2deg); - } - 87.5% { - -webkit-transform: translateX(2px) rotateY(1deg); - transform: translateX(2px) rotateY(1deg); - } - 100% { - -webkit-transform: translateX(0); - transform: translateX(0); - } -} -html.csstransitions.rl-started-trigger.no-mobile .b-login-content .loginFormWrapper { - /*transform: scale(1.1);*/ - -webkit-transform: translateY(-20px); - -ms-transform: translateY(-20px); - transform: translateY(-20px); - opacity: 0.5; -} -/*html.rl-started-trigger.no-mobile #rl-content { - opacity: 0.7; -}*/ -#rl-loading { - -webkit-transition: opacity 0.5s linear; - -o-transition: opacity 0.5s linear; - transition: opacity 0.5s linear; -} -html.csstransitions.rl-started-delay #rl-left { - -webkit-transition: width 0.3s ease-out; - -o-transition: width 0.3s ease-out; - transition: width 0.3s ease-out; -} -html.csstransitions.rl-started-delay #rl-right { - -webkit-transition: left 0.3s ease-out, right 0.3s ease-out; - -o-transition: left 0.3s ease-out, right 0.3s ease-out; - transition: left 0.3s ease-out, right 0.3s ease-out; -} -html.csstransitions.rl-started-delay #rl-sub-left, -html.csstransitions.rl-started-delay #rl-sub-left .messageList .inputSearch { - -webkit-transition: width 0.3s ease-out; - -o-transition: width 0.3s ease-out; - transition: width 0.3s ease-out; -} -html.csstransitions.rl-started-delay #rl-sub-right { - -webkit-transition: left 0.3s ease-out; - -o-transition: left 0.3s ease-out; - transition: left 0.3s ease-out; -} -html.rgba.cssanimations.backgroundsize .e-strip-animation { - background-size: 60px 60px; - background-image: -o-linear-gradient(315deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 50%, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0.1) 75%, transparent 75%, transparent); - background-image: linear-gradient(135deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 50%, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0.1) 75%, transparent 75%, transparent); - -webkit-animation: animate-stripes 2s linear infinite; - animation: animate-stripes 2s linear infinite; -} -html.rl-anim .rl-animated-inited { - opacity: 1; - -webkit-transition: opacity 0.5s linear; - -o-transition: opacity 0.5s linear; - transition: opacity 0.5s linear; -} -html.rl-anim .rl-animated-inited.rl-animated-hidden { - opacity: 0; -} -html.rl-anim.cssanimations.csstransitions.no-mobile .b-login-content .errorAnimated { - -webkit-animation: login-form-shake 400ms ease-in-out; - animation: login-form-shake 400ms ease-in-out; -} -html.rl-anim.no-mobile .b-login-content .errorAnimated .buttonLogin { - color: #b94a48; - font-weight: bold; -} -html.rl-anim.cssanimations.csstransitions.no-mobile .b-login-content .afterLoginHide { - opacity: 0; -} -html.rl-anim.csstransitions.no-mobile .btn-group.dropdown.colored-toggle.open .animate-this-icon-on-open { - -webkit-animation: bounce-me 0.5s linear; - animation: bounce-me 0.5s linear; -} -html.rl-anim.csstransitions.no-mobile .b-login-content .loginFormWrapper { - -webkit-transition: all 0.3s ease-out; - -o-transition: all 0.3s ease-out; - transition: all 0.3s ease-out; -} -html.rl-anim.csstransitions .button-delete-transitions { - -webkit-transition: all 0.2s linear; - -o-transition: all 0.2s linear; - transition: all 0.2s linear; -} -html.rl-anim.cssanimations .b-folders .e-item .anim-action-class { - -webkit-animation: highlight-folder-row 0.5s linear; - animation: highlight-folder-row 0.5s linear; -} -html.rl-anim.csstransitions .b-folders .btn.buttonContacts { - -webkit-transition: margin 0.3s linear; - -o-transition: margin 0.3s linear; - transition: margin 0.3s linear; -} -html.rl-anim.csstransitions .b-folders .b-content.opacity-on-panel-disabled { - -webkit-transition: opacity 0.3s linear; - -o-transition: opacity 0.3s linear; - transition: opacity 0.3s linear; -} -html.rl-anim.csstransitions .messageList .messageListItem { - -webkit-transition: max-height 400ms ease; - -o-transition: max-height 400ms ease; - transition: max-height 400ms ease; -} -html.rl-anim.csstransitions .messageList .listDragOver { - -webkit-transition: all 400ms ease; - -o-transition: all 400ms ease; - transition: all 400ms ease; -} -html.rl-anim.csstransitions .b-list-content .e-contact-item { - -webkit-transition: max-height 400ms ease; - -o-transition: max-height 400ms ease; - transition: max-height 400ms ease; -} -html.rl-anim.csstransitions .modal.b-domain-content .modal-body { - -webkit-transition: left 500ms ease; - -o-transition: left 500ms ease; - transition: left 500ms ease; -} -html.rl-anim.csstransitions.rl-modal.rl-modal-animation .popups { - overflow: hidden; -} -html.rl-anim.csstransitions .modal.fade { - -webkit-transition: all 200ms ease-out; - -o-transition: all 200ms ease-out; - transition: all 200ms ease-out; - /*transform: scale(0.95);*/ - -webkit-transform: translateY(-20px); - -ms-transform: translateY(-20px); - transform: translateY(-20px); -} -html.rl-anim.csstransitions .modal.fade.in { - -webkit-transform: none; - -ms-transform: none; - transform: none; -} -html.rl-anim.cssanimations .b-compose.loading .b-header-toolbar { - background-size: 60px 60px; - background-image: -o-linear-gradient(315deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); - background-image: linear-gradient(135deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); - -webkit-animation: animate-stripes 2s linear infinite; - animation: animate-stripes 2s linear infinite; -} -.textLoadingAnimationD1, -.textLoadingAnimationD2, -.textLoadingAnimationD3 { - -webkit-animation: textLoadingAnimationKeyFrame 1s linear infinite 0s; - animation: textLoadingAnimationKeyFrame 1s linear infinite 0s; -} -.textLoadingAnimationD2 { - -webkit-animation-delay: 0.3s; - animation-delay: 0.3s; -} -.textLoadingAnimationD3 { - -webkit-animation-delay: 0.6s; - animation-delay: 0.6s; -} -.rl-view-model.RL-Login, -.rl-view-model.RL-LoginNew, -.rl-view-model.RL-AdminLogin, -.rl-view-model.RL-About { - position: relative; - height: 100%; - z-index: 5; -} -.mfp-container .mfp-figure { - min-height: 300px; - min-width: 300px; -} -.ui-resizable-e { - right: -1px; - width: 5px; -} -.pswp__error-msg { - color: #ccc; -} -.pswp__error-msg a, -.pswp__error-msg a:hover { - color: #fff; -} -.pswp__img--placeholder { - opacity: 0; -} -.opentip-container { - z-index: 2001 !important; -} -.opentip-container .ot-content { - font-size: 13px; -} -.opentip-container.style-rainloopErrorTip .ot-content { - color: red; -} -.opentip-container.ot-show-effect-none, -.opentip-container.ot-hide-effect-none { - -webkit-transition: none !important; - -o-transition: none !important; - transition: none !important; -} -.opentip-container.ot-show-effect-fade { - -webkit-transition: none; - -o-transition: none; - transition: none; -} -.opentip-container.ot-show-effect-fade.ot-hidden { - opacity: 0; -} -.opentip-container.ot-show-effect-fade.ot-going-to-show { - opacity: 0; - -webkit-transition: opacity 0.2s ease-in-out; - -o-transition: opacity 0.2s ease-in-out; - transition: opacity 0.2s ease-in-out; -} -.opentip-container.ot-show-effect-fade.ot-showing { - opacity: 1; - -webkit-transition: opacity 0.2s ease-in-out; - -o-transition: opacity 0.2s ease-in-out; - transition: opacity 0.2s ease-in-out; -} -.opentip-container.ot-show-effect-fade.ot-visible { - opacity: 1; - -webkit-transition: none; - -o-transition: none; - transition: none; -} -svg-icon { - display: none; -} -.svg-icon { - border: 0; - outline: 0; - height: 16px; - width: 16px; - display: inline-block; - fill: #333; -} -.svg-icon.svg-icon-archive { - height: 14px; - width: 14px; -} -.lg-backdrop.in { - opacity: 0.8; -} -.btn .btn-text { - padding-left: 8px; -} -.active-scale-transition { - -webkit-transition: -webkit-transform .2s; - transition: -webkit-transform .2s; - -o-transition: transform .2s; - transition: transform .2s; - transition: transform .2s, -webkit-transform .2s; -} -.active-scale-transition:active { - -webkit-transform: scale(0.95); - -ms-transform: scale(0.95); - transform: scale(0.95); -} -html.glass input:-webkit-autofill, -html.glass input:-webkit-autofill:hover, -html.glass input:-webkit-autofill:focus, -html.glass input:-webkit-autofill:active { - -webkit-transition-delay: 9999s; - -webkit-transition: color 9999s ease-out, background-color 9999s ease-out; -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/app.min.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/app.min.css deleted file mode 100755 index add48211..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/app.min.css +++ /dev/null @@ -1,7 +0,0 @@ -@charset "UTF-8";/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}/*! jQuery UI - v1.10.3 - 2013-11-25 -* http://jqueryui.com -* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.autocomplete.css, jquery.ui.menu.css, jquery.ui.theme.css -* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:0}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:400}.ui-menu .ui-menu-item a.ui-state-active,.ui-menu .ui-menu-item a.ui-state-focus{font-weight:400;margin:-1px}.ui-menu .ui-state-disabled{font-weight:400;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget button,.ui-widget input,.ui-widget select,.ui-widget textarea{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc;color:#222;font-weight:700}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #ccc;background:#eee;font-weight:400;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none}.ui-state-focus,.ui-state-hover,.ui-widget-content .ui-state-focus,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-focus,.ui-widget-header .ui-state-hover{border:1px solid #ccc;background:#eee;font-weight:400;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff;font-weight:400;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:700}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:400}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-corner-all,.ui-corner-left,.ui-corner-tl,.ui-corner-top{border-top-left-radius:2px}.ui-corner-all,.ui-corner-right,.ui-corner-top,.ui-corner-tr{border-top-right-radius:2px}.ui-corner-all,.ui-corner-bl,.ui-corner-bottom,.ui-corner-left{border-bottom-left-radius:2px}.ui-corner-all,.ui-corner-bottom,.ui-corner-br,.ui-corner-right{border-bottom-right-radius:2px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}@font-face{font-family:rainloop;src:url(fonts/rainloop.eot);src:url(fonts/rainloop.eot?#iefix) format("embedded-opentype"),url(fonts/rainloop.woff) format("woff"),url(fonts/rainloop.ttf) format("truetype"),url(fonts/rainloop.svg#rainloop) format("svg");font-weight:400;font-style:normal}[data-icon]:before{font-family:rainloop!important;content:attr(data-icon);font-style:normal!important;font-weight:400!important;font-variant:normal!important;text-transform:none!important;speak:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}[class*=" icon-"]:before,[class^=icon-]:before{font-family:rainloop!important;font-style:normal!important;font-weight:400!important;font-variant:normal!important;text-transform:none!important;speak:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-arrows-in:before{content:"\e000"}.icon-arrows-out:before{content:"\e001"}.icon-list:before{content:"\e002"}.icon-search:before{content:"\e003"}.icon-user:before{content:"\e004"}.icon-user-add:before{content:"\e005"}.icon-tags:before{content:"\e006"}.icon-paper-plane:before{content:"\e007"}.icon-reply:before{content:"\e008"}.icon-reply-all:before{content:"\e009"}.icon-forward:before{content:"\e00a"}.icon-info:before{content:"\e00b"}.icon-right-dir:before{content:"\e00c"}.icon-down-dir:before{content:"\e00d"}.icon-image:before{content:"\e00e"}.icon-print:before{content:"\e00f"}.icon-calendar:before{content:"\e010"}.icon-cog:before{content:"\e011"}.icon-wrench:before{content:"\e012"}.icon-rocket:before{content:"\e013"}.icon-fire:before{content:"\e014"}.icon-purchase:before{content:"\e015"}.icon-apple:before{content:"\e016"}.icon-dropbox:before{content:"\e017"}.icon-skype:before{content:"\e018"}.icon-creative-commons:before{content:"\e019"}.icon-ellipsis:before{content:"\e01a"}.icon-left:before{content:"\e01b"}.icon-right:before{content:"\e01c"}.icon-down:before{content:"\e01d"}.icon-right-mini:before{content:"\e01e"}.icon-down-mini:before{content:"\e01f"}.icon-up:before{content:"\e020"}.icon-star-empty:before{content:"\e021"}.icon-star:before{content:"\e022"}.icon-at:before{content:"\e023"}.icon-list-add:before{content:"\e024"}.icon-google:before{content:"\e025"}.icon-google-plus:before{content:"\e026"}.icon-twitter:before{content:"\e027"}.icon-youtube:before{content:"\e028"}.icon-warning:before{content:"\e029"}.icon-warning-alt:before{content:"\e02a"}.icon-power:before{content:"\e02b"}.icon-plus:before{content:"\e02c"}.icon-ok:before{content:"\e02d"}.icon-remove:before{content:"\e02e"}.icon-file:before{content:"\e02f"}.icon-file-code:before{content:"\e030"}.icon-file-chart-graph:before{content:"\e031"}.icon-file-zip:before{content:"\e032"}.icon-file-music:before{content:"\e033"}.icon-file-text:before{content:"\e034"}.icon-file-bookmark:before{content:"\e035"}.icon-file-image:before{content:"\e036"}.icon-file-analytics:before{content:"\e037"}.icon-file-certificate:before{content:"\e038"}.icon-attachment:before{content:"\e039"}.icon-file-excel:before{content:"\e03a"}.icon-file-movie:before{content:"\e03b"}.icon-folder-add:before{content:"\e03c"}.icon-folder:before{content:"\e03d"}.icon-floppy:before{content:"\e03e"}.icon-eye:before{content:"\e03f"}.icon-facebook-alt:before{content:"\e040"}.icon-facebook:before{content:"\e041"}.icon-bolt:before{content:"\e042"}.icon-download:before{content:"\e043"}.icon-upload:before{content:"\e044"}.icon-popup:before{content:"\e045"}.icon-github:before{content:"\e046"}.icon-telephone:before{content:"\e047"}.icon-mobile:before{content:"\e048"}.icon-pencil:before{content:"\e049"}.icon-trash:before{content:"\e04a"}.icon-left-middle:before{content:"\e04b"}.icon-right-middle:before{content:"\e04c"}.icon-repeat:before{content:"\e04d"}.icon-key:before{content:"\e04e"}.icon-lock:before{content:"\e04f"}.icon-home:before{content:"\e050"}.icon-address-book:before{content:"\e051"}.icon-share:before{content:"\e052"}.icon-suitcase:before{content:"\e053"}.icon-new-sign:before{content:"\e054"}.icon-users:before{content:"\e055"}.icon-earth:before{content:"\e056"}.icon-mail:before{content:"\e057"}.icon-checkbox-checked:before{content:"\e058"}.icon-checkbox-unchecked:before{content:"\e059"}.icon-checkbox-partial:before{content:"\e05a"}.icon-radio-checked:before{content:"\e05b"}.icon-radio-unchecked:before{content:"\e05c"}.icon-google-drive:before{content:"\e05d"}.icon-spinner:before{content:"\e05e"}.icon-archive:before{content:"\e05f"}.icon-buy-sign:before{content:"\e060"}.icon-filter:before{content:"\e061"}.icon-sync:before{content:"\e062"}.icon-ellipsis-alt:before{content:"\e063"}.icon-cloud-up:before{content:"\e064"}.icon-cloud-down:before{content:"\e065"}.icon-import:before{content:"\e066"}.icon-export:before{content:"\e067"}.icon-copy:before{content:"\e068"}.icon-angry-smiley:before{content:"\e069"}.icon-happy-smiley:before{content:"\e06a"}.icon-help:before{content:"\e06b"}.icon-resize-in:before{content:"\e06c"}.icon-resize-out:before{content:"\e06d"}.icon-world:before{content:"\e06f"}.icon-braille:before{content:"\e06e"}.icon-play:before{content:"\e070"}.icon-pause:before{content:"\e071"}.icon-stop:before{content:"\e072"}.icon-check-mark-circle-two:before{content:"\e073"}.icon-laptop:before{content:"\e075"}.nano{overflow:hidden!important}.nano .content{position:absolute;overflow:scroll;top:0;right:0;bottom:0;left:0;-webkit-overflow-scrolling:touch}.nano .content .content-wrapper{height:100%}.nano .content::-webkit-scrollbar{visibility:hidden}.has-scrollbar .content::-webkit-scrollbar{visibility:hidden}.nano-visibility-hidden::-webkit-scrollbar{visibility:hidden}.nano>.pane{background:0 0;position:absolute;width:5px;right:0;top:1px;bottom:1px;opacity:.01;-webkit-transition:.4s;-o-transition:.4s;transition:.4s;border-radius:5px;z-index:102;margin:2px}.nano>.pane2{background:0 0;position:absolute;height:5px;right:1px;left:1px;bottom:0;opacity:.01;-webkit-transition:.4s;-o-transition:.4s;transition:.4s;border-radius:5px;z-index:10000;margin:2px}.nano>.pane>.slider{background-color:#999;background-color:rgba(0,0,0,.3);position:relative;margin:0;border-radius:3px;width:5px}.nano>.pane2>.slider2{background-color:#999;background-color:rgba(0,0,0,.3);position:relative;margin:0;border-radius:3px;height:5px}.nano:hover>.pane,.nano:hover>.pane2,.pane.active,.pane.activescroll,.pane.flashed,.pane2.active,.pane2.activescroll,.pane2.flashed{opacity:.99}.nano>.pane.active,.nano>.pane:hover{background-color:rgba(0,0,0,.15)}.nano>.pane2.active,.nano>.pane2:hover{background-color:rgba(0,0,0,.15)}.nano>.pane.active>.slider,.nano>.pane:hover>.slider{background-color:rgba(0,0,0,.4)}.nano>.pane2.active>.slider2,.nano>.pane2:hover>.slider2{background-color:rgba(0,0,0,.4)}.letterfx{display:inline-block;margin:0;padding:0;-o-transition:all 1s;transition:all 1s;-ms-transition:all 1s;-webkit-transition:all 1s}.letterfx-spin-before{transform:rotate(3600deg);-ms-transform:rotate(3600deg);-webkit-transform:rotate(3600deg)}.letterfx-spin-after{-webkit-transform:none;-ms-transform:none;transform:none}.letterfx-fade-before{opacity:0}.letterfx-grow-before{transform:scale(0,0);-ms-transform:scale(0,0);-webkit-transform:scale(0,0)}.letterfx-grow-after{-webkit-transform:none;-ms-transform:none;transform:none}.letterfx-smear-before{color:transparent;text-shadow:-1px -1px 25px transparent}.letterfx-smear-after{color:inherit;text-shadow:0 0 #333}.letterfx-fall-before{visibility:hidden;transform:scale(3,3);-ms-transform:scale(3,3);-webkit-transform:scale(3,3)}.letterfx-fall-after{transform:scale(1,1);-ms-transform:scale(1,1);-webkit-transform:scale(1,1);text-shadow:0}.letterfx-swirl-before{visibility:hidden;transform:scale(3,3) rotate(3600deg);-ms-transform:scale(3,3) rotate(3600deg);-webkit-transform:scale(3,3) rotate(3600deg)}.letterfx-swirl-after{-webkit-transform:none;-ms-transform:none;transform:none;text-shadow:0}.letterfx-wave-container .letterfx{position:relative}.letterfx-wave-before{bottom:0}.letterfx-wave-after{bottom:15px}.letterfx-fly-bottom-container .letterfx,.letterfx-fly-left-container .letterfx,.letterfx-fly-right-container .letterfx,.letterfx-fly-top-container .letterfx{position:relative}.letterfx-fly-left-before{left:-50em}.letterfx-fly-left-after{left:0}.letterfx-fly-right-before{right:-50em}.letterfx-fly-right-after{right:0}.letterfx-fly-top-before{top:-20em}.letterfx-fly-top-after{top:0}.letterfx-fly-bottom-before{bottom:-20em}.letterfx-fly-bottom-after{bottom:0}.inputosaurus-container{background-color:#fff;border:1px solid #bcbec0;margin:0 5px 0 0;padding:0 3px;display:inline-block;cursor:text;font-size:14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.inputosaurus-container li{display:block;float:left;overflow:hidden;margin:2px 2px 0;padding:2px 3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;-ms-text-overflow:ellipsis;background-color:#e5eff7;border:#a9cae4 solid 1px;border-radius:2px;color:#5b9bcd;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.75) inset;box-shadow:0 1px 0 rgba(255,255,255,.75) inset;line-height:20px;cursor:default}.inputosaurus-container li.inputosaurus-selected{background-color:#bdd6eb}.inputosaurus-container li a{font-size:16px;color:#5b9bcd;padding:1px;text-decoration:none;outline:0}.inputosaurus-container .inputosaurus-input{border:none;-webkit-box-shadow:none;box-shadow:none;background-color:#fff;margin-top:3px}.inputosaurus-container .inputosaurus-input input{border:none;height:23px;font-size:14px;line-height:20px;color:#555;margin:0;outline:0;padding:0 0 1px 1px;width:25px;-webkit-box-shadow:none;box-shadow:none}.inputosaurus-container .inputosaurus-input input:hover{-webkit-box-shadow:none;box-shadow:none}.inputosaurus-input-hidden{display:none}.flag-wrapper{width:24px;height:16px;display:inline-block}.flag{width:16px;height:11px;display:inline-block;background:url(flags.png) no-repeat}.flag.flag-en{background-position:-144px -154px}.flag.flag-en_us{background-position:-144px -154px}.flag.flag-en_gb{background-position:-176px -44px}.flag.flag-en_uk{background-position:-176px -44px}.flag.flag-en_ca{background-position:-48px -22px}.flag.flag-el_gr{background-position:-112px -55px}.flag.flag-uk_ua{background-position:-96px -154px}.flag.flag-ru_ru{background-position:-224px -121px}.flag.flag-pt_br{background-position:-192px -11px}.flag.flag-pl_pl{background-position:-32px -121px}.flag.flag-nl_nl{background-position:-80px -110px}.flag.flag-nb_no{background-position:-96px -110px}.flag.flag-it_it{background-position:-208px -66px}.flag.flag-de_de{background-position:-80px -33px}.flag.flag-ro_ro{background-position:-192px -121px}.flag.flag-fi_fi{background-position:-64px -44px}.flag.flag-fr_fr{background-position:-144px -44px}.flag.flag-fr_ca{background-position:-144px -44px}.flag.flag-pt_pt{background-position:-112px -121px}.flag.flag-pt_br{background-position:-192px -11px}.flag.flag-ar_sa{background-position:0 -132px}.flag.flag-bg_bg{background-position:-80px -11px}.flag.flag-es_es{background-position:-16px -44px}.flag.flag-es_la{background-position:-16px -44px}.flag.flag-et_ee{background-position:-192px -33px}.flag.flag-fa_ir{background-position:-176px -66px}.flag.flag-lt_lt{background-position:-80px -88px}.flag.flag-lv_lv{background-position:-112px -88px}.flag.flag-is_is{background-position:-192px -66px}.flag.flag-hu_hu{background-position:-32px -66px}.flag.flag-ko_kr{background-position:-144px -77px}.flag.flag-ja_jp{background-position:-16px -77px}.flag.flag-sl_si{background-position:-128px -132px}.flag.flag-sk_sk{background-position:-144px -132px}.flag.flag-tr_tr{background-position:-16px -154px}.flag.flag-sv_se{background-position:-80px -132px}.flag.flag-cs_cz{background-position:-64px -33px}.flag.flag-zh_cn{background-position:-208px -22px}.flag.flag-zh_tw{background-position:-64px -154px}.flag.flag-zh_hk{background-position:-208px -22px}.flag.flag-da_dk{background-position:-112px -33px}.flag.flag-id_id{background-position:-64px -66px}.opentip-container,.opentip-container *{-webkit-box-sizing:border-box;box-sizing:border-box}.opentip-container{position:absolute;max-width:300px;z-index:100;-webkit-transition:-webkit-transform 1s ease-in-out;-o-transition:-o-transform 1s ease-in-out;transition:-webkit-transform 1s ease-in-out;-o-transition:transform 1s ease-in-out;transition:transform 1s ease-in-out;transition:transform 1s ease-in-out,-webkit-transform 1s ease-in-out;pointer-events:none;-webkit-transform:translateX(0) translateY(0);-ms-transform:translateX(0) translateY(0);transform:translateX(0) translateY(0)}.opentip-container.ot-fixed.ot-going-to-show.stem-top.stem-center,.opentip-container.ot-fixed.ot-hidden.stem-top.stem-center,.opentip-container.ot-fixed.ot-hiding.stem-top.stem-center{-webkit-transform:translateY(-5px);-ms-transform:translateY(-5px);transform:translateY(-5px)}.opentip-container.ot-fixed.ot-going-to-show.stem-top.stem-right,.opentip-container.ot-fixed.ot-hidden.stem-top.stem-right,.opentip-container.ot-fixed.ot-hiding.stem-top.stem-right{-webkit-transform:translateY(-5px) translateX(5px);-ms-transform:translateY(-5px) translateX(5px);transform:translateY(-5px) translateX(5px)}.opentip-container.ot-fixed.ot-going-to-show.stem-middle.stem-right,.opentip-container.ot-fixed.ot-hidden.stem-middle.stem-right,.opentip-container.ot-fixed.ot-hiding.stem-middle.stem-right{-webkit-transform:translateX(5px);-ms-transform:translateX(5px);transform:translateX(5px)}.opentip-container.ot-fixed.ot-going-to-show.stem-bottom.stem-right,.opentip-container.ot-fixed.ot-hidden.stem-bottom.stem-right,.opentip-container.ot-fixed.ot-hiding.stem-bottom.stem-right{-webkit-transform:translateY(5px) translateX(5px);-ms-transform:translateY(5px) translateX(5px);transform:translateY(5px) translateX(5px)}.opentip-container.ot-fixed.ot-going-to-show.stem-bottom.stem-center,.opentip-container.ot-fixed.ot-hidden.stem-bottom.stem-center,.opentip-container.ot-fixed.ot-hiding.stem-bottom.stem-center{-webkit-transform:translateY(5px);-ms-transform:translateY(5px);transform:translateY(5px)}.opentip-container.ot-fixed.ot-going-to-show.stem-bottom.stem-left,.opentip-container.ot-fixed.ot-hidden.stem-bottom.stem-left,.opentip-container.ot-fixed.ot-hiding.stem-bottom.stem-left{-webkit-transform:translateY(5px) translateX(-5px);-ms-transform:translateY(5px) translateX(-5px);transform:translateY(5px) translateX(-5px)}.opentip-container.ot-fixed.ot-going-to-show.stem-middle.stem-left,.opentip-container.ot-fixed.ot-hidden.stem-middle.stem-left,.opentip-container.ot-fixed.ot-hiding.stem-middle.stem-left{-webkit-transform:translateX(-5px);-ms-transform:translateX(-5px);transform:translateX(-5px)}.opentip-container.ot-fixed.ot-going-to-show.stem-top.stem-left,.opentip-container.ot-fixed.ot-hidden.stem-top.stem-left,.opentip-container.ot-fixed.ot-hiding.stem-top.stem-left{-webkit-transform:translateY(-5px) translateX(-5px);-ms-transform:translateY(-5px) translateX(-5px);transform:translateY(-5px) translateX(-5px)}.opentip-container.ot-fixed .opentip{pointer-events:auto}.opentip-container.ot-hidden{display:none}.opentip-container .opentip{position:relative;font-size:13px;line-height:120%;padding:9px 14px;color:#4f4b47;text-shadow:-1px -1px 0 rgba(255,255,255,.2)}.opentip-container .opentip .header{margin:0;padding:0}.opentip-container .opentip .ot-close{pointer-events:auto;display:block;position:absolute;top:-12px;left:60px;color:rgba(0,0,0,.5);background:rgba(0,0,0,0);text-decoration:none}.opentip-container .opentip .ot-close span{display:none}.opentip-container .opentip .ot-loading-indicator{display:none}.opentip-container.ot-loading .ot-loading-indicator{width:30px;height:30px;font-size:30px;line-height:30px;font-weight:700;display:block}.opentip-container.ot-loading .ot-loading-indicator span{display:block;-webkit-animation:otloading 2s linear infinite;animation:otloading 2s linear infinite;text-align:center}.opentip-container.style-alert .opentip,.opentip-container.style-dark .opentip{color:#f8f8f8;text-shadow:1px 1px 0 rgba(0,0,0,.2)}.opentip-container.style-glass .opentip{padding:15px 25px;color:#317cc5;text-shadow:1px 1px 8px rgba(0,94,153,.3)}.opentip-container.ot-hide-effect-fade{-webkit-transition:-webkit-transform .5s ease-in-out,opacity 1s ease-in-out;-o-transition:-o-transform .5s ease-in-out,opacity 1s ease-in-out;-webkit-transition:opacity 1s ease-in-out,-webkit-transform .5s ease-in-out;transition:opacity 1s ease-in-out,-webkit-transform .5s ease-in-out;-o-transition:transform .5s ease-in-out,opacity 1s ease-in-out;transition:transform .5s ease-in-out,opacity 1s ease-in-out;transition:transform .5s ease-in-out,opacity 1s ease-in-out,-webkit-transform .5s ease-in-out;opacity:1;-ms-filter:none;-webkit-filter:none;filter:none}.opentip-container.ot-hide-effect-fade.ot-hiding{opacity:0}.opentip-container.ot-show-effect-appear.ot-going-to-show,.opentip-container.ot-show-effect-appear.ot-showing{-webkit-transition:-webkit-transform .5s ease-in-out,opacity 1s ease-in-out;-o-transition:-o-transform .5s ease-in-out,opacity 1s ease-in-out;-webkit-transition:opacity 1s ease-in-out,-webkit-transform .5s ease-in-out;transition:opacity 1s ease-in-out,-webkit-transform .5s ease-in-out;-o-transition:transform .5s ease-in-out,opacity 1s ease-in-out;transition:transform .5s ease-in-out,opacity 1s ease-in-out;transition:transform .5s ease-in-out,opacity 1s ease-in-out,-webkit-transform .5s ease-in-out}.opentip-container.ot-show-effect-appear.ot-going-to-show{opacity:0}.opentip-container.ot-show-effect-appear.ot-showing{opacity:1;-ms-filter:none;-webkit-filter:none;filter:none}.opentip-container.ot-show-effect-appear.ot-visible{opacity:1;-ms-filter:none;-webkit-filter:none;filter:none}@-webkit-keyframes otloading{0%{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes otloading{0%{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}/*! - * Pikaday - * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ - */.pika-single{z-index:9999;display:block;position:relative;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.pika-single:after,.pika-single:before{content:" ";display:table}.pika-single:after{clear:both}.pika-single.is-hidden{display:none}.pika-single.is-bound{position:absolute;-webkit-box-shadow:0 5px 15px -5px rgba(0,0,0,.5);box-shadow:0 5px 15px -5px rgba(0,0,0,.5)}.pika-lendar{float:left;width:240px;margin:8px}.pika-title{position:relative;text-align:center}.pika-label{display:inline-block;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:700;background-color:#fff}.pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;opacity:0}.pika-next,.pika-prev{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5}.pika-next:hover,.pika-prev:hover{opacity:1}.is-rtl .pika-next,.pika-prev{float:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==)}.is-rtl .pika-prev,.pika-next{float:right;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=)}.pika-next.is-disabled,.pika-prev.is-disabled{cursor:default;opacity:.2}.pika-select{display:inline-block}.pika-table{width:100%;border-collapse:collapse;border-spacing:0;border:0}.pika-table td,.pika-table th{width:14.285714285714286%;padding:0}.pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:700;text-align:center}.pika-button{cursor:pointer;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-box-sizing:border-box;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.pika-week{font-size:11px;color:#999}.is-today .pika-button{color:#3af;font-weight:700}.has-event .pika-button,.is-selected .pika-button{color:#fff;font-weight:700;background:#3af;-webkit-box-shadow:inset 0 1px 3px #178fe5;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.has-event .pika-button{background:#005da9;-webkit-box-shadow:inset 0 1px 3px #0076c9;box-shadow:inset 0 1px 3px #0076c9}.is-disabled .pika-button,.is-inrange .pika-button{background:#d5e9f7}.is-startrange .pika-button{color:#fff;background:#6cb31d;-webkit-box-shadow:none;box-shadow:none;border-radius:3px}.is-endrange .pika-button{color:#fff;background:#3af;-webkit-box-shadow:none;box-shadow:none;border-radius:3px}.is-disabled .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.is-outside-current-month .pika-button{color:#999;opacity:.3}.is-selection-disabled{pointer-events:none;cursor:default}.pika-button:hover,.pika-row.pick-whole-week:hover .pika-button{color:#fff;background:#ff8000;-webkit-box-shadow:none;box-shadow:none;border-radius:3px}.pika-table abbr{border-bottom:none;cursor:help}.lg-sub-html,.lg-toolbar{background-color:rgba(0,0,0,.45)}#lg-counter,.lg-outer .lg-video-cont{vertical-align:middle;display:inline-block}@font-face{font-family:lg;src:url(fonts/lg.eot?n1z373);src:url(fonts/lg.eot?#iefixn1z373) format("embedded-opentype"),url(fonts/lg.woff?n1z373) format("woff"),url(fonts/lg.ttf?n1z373) format("truetype"),url(fonts/lg.svg?n1z373#lg) format("svg");font-weight:400;font-style:normal}.lg-icon{font-family:lg;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.lg-actions .lg-next,.lg-actions .lg-prev{background-color:rgba(0,0,0,.45);border-radius:2px;color:#999;cursor:pointer;display:block;font-size:22px;margin-top:-10px;padding:8px 10px 9px;position:absolute;top:50%;z-index:1080}.lg-actions .lg-next.disabled,.lg-actions .lg-prev.disabled{pointer-events:none;opacity:.5}.lg-actions .lg-next:hover,.lg-actions .lg-prev:hover{color:#fff}.lg-actions .lg-next{right:20px}.lg-actions .lg-next:before{content:"\e095"}.lg-actions .lg-prev{left:20px}.lg-actions .lg-prev:after{content:"\e094"}@-webkit-keyframes lg-right-end{0%,100%{left:0}50%{left:-30px}}@keyframes lg-right-end{0%,100%{left:0}50%{left:-30px}}@-webkit-keyframes lg-left-end{0%,100%{left:0}50%{left:30px}}@keyframes lg-left-end{0%,100%{left:0}50%{left:30px}}.lg-outer.lg-right-end .lg-object{-webkit-animation:lg-right-end .3s;animation:lg-right-end .3s;position:relative}.lg-outer.lg-left-end .lg-object{-webkit-animation:lg-left-end .3s;animation:lg-left-end .3s;position:relative}.lg-toolbar{z-index:1082;left:0;position:absolute;top:0;width:100%}.lg-toolbar .lg-icon{color:#999;cursor:pointer;float:right;font-size:24px;height:47px;line-height:27px;padding:10px 0;text-align:center;width:50px;text-decoration:none!important;outline:0;-webkit-transition:color .2s linear;-o-transition:color .2s linear;transition:color .2s linear}.lg-toolbar .lg-icon:hover{color:#fff}.lg-toolbar .lg-close:after{content:"\e070"}.lg-toolbar .lg-download:after{content:"\e0f2"}.lg-sub-html{bottom:0;color:#eee;font-size:16px;left:0;padding:10px 40px;position:fixed;right:0;text-align:center;z-index:1080}.lg-sub-html h4{margin:0;font-size:13px;font-weight:700}.lg-sub-html p{font-size:12px;margin:5px 0 0}#lg-counter{color:#999;font-size:16px;padding-left:20px;padding-top:12px}.lg-next,.lg-prev,.lg-toolbar{opacity:1;-webkit-transition:-webkit-transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;-o-transition:-o-transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;-webkit-transition:opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear,-webkit-transform .35s cubic-bezier(0,0,.25,1) 0s;transition:opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear,-webkit-transform .35s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;transition:transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear;transition:transform .35s cubic-bezier(0,0,.25,1) 0s,opacity .35s cubic-bezier(0,0,.25,1) 0s,color .2s linear,-webkit-transform .35s cubic-bezier(0,0,.25,1) 0s}.lg-hide-items .lg-prev{opacity:0;-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}.lg-hide-items .lg-next{opacity:0;-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}.lg-hide-items .lg-toolbar{opacity:0;-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-object{-webkit-transform:scale3d(.5,.5,.5);transform:scale3d(.5,.5,.5);opacity:0;-webkit-transition:-webkit-transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;-o-transition:-o-transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;-webkit-transition:opacity 250ms cubic-bezier(0,0,.25,1),-webkit-transform 250ms cubic-bezier(0,0,.25,1) 0s!important;transition:opacity 250ms cubic-bezier(0,0,.25,1),-webkit-transform 250ms cubic-bezier(0,0,.25,1) 0s!important;-o-transition:transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;transition:transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1)!important;transition:transform 250ms cubic-bezier(0,0,.25,1) 0s,opacity 250ms cubic-bezier(0,0,.25,1),-webkit-transform 250ms cubic-bezier(0,0,.25,1) 0s!important;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-item.lg-complete .lg-object{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-outer .lg-thumb-outer{background-color:#0d0a0a;bottom:0;position:absolute;width:100%;z-index:1080;max-height:350px;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,.25,1) 0s;-o-transition:-o-transform .25s cubic-bezier(0,0,.25,1) 0s;transition:-webkit-transform .25s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform .25s cubic-bezier(0,0,.25,1) 0s;transition:transform .25s cubic-bezier(0,0,.25,1) 0s;transition:transform .25s cubic-bezier(0,0,.25,1) 0s,-webkit-transform .25s cubic-bezier(0,0,.25,1) 0s}.lg-outer .lg-thumb-outer.lg-grab .lg-thumb-item{cursor:-webkit-grab;cursor:-o-grab;cursor:-ms-grab;cursor:grab}.lg-outer .lg-thumb-outer.lg-grabbing .lg-thumb-item{cursor:move;cursor:-webkit-grabbing;cursor:-o-grabbing;cursor:-ms-grabbing;cursor:grabbing}.lg-outer .lg-thumb-outer.lg-dragging .lg-thumb{-webkit-transition-duration:0s!important;-o-transition-duration:0s!important;transition-duration:0s!important}.lg-outer.lg-thumb-open .lg-thumb-outer{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.lg-outer .lg-thumb{padding:10px 0;height:100%;margin-bottom:-5px}.lg-outer .lg-thumb-item{cursor:pointer;float:left;overflow:hidden;height:100%;border:2px solid #fff;border-radius:4px;margin-bottom:5px}@media (min-width:1025px){.lg-outer .lg-thumb-item{-webkit-transition:border-color .25s ease;-o-transition:border-color .25s ease;transition:border-color .25s ease}}.lg-outer .lg-thumb-item.active,.lg-outer .lg-thumb-item:hover{border-color:#a90707}.lg-outer .lg-thumb-item img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.lg-outer.lg-has-thumb .lg-item{padding-bottom:120px}.lg-outer.lg-can-toggle .lg-item{padding-bottom:0}.lg-outer.lg-pull-caption-up .lg-sub-html{-webkit-transition:bottom .25s ease;-o-transition:bottom .25s ease;transition:bottom .25s ease}.lg-outer.lg-pull-caption-up.lg-thumb-open .lg-sub-html{bottom:100px}.lg-outer .lg-toogle-thumb{background-color:#0d0a0a;border-radius:2px 2px 0 0;color:#999;cursor:pointer;font-size:24px;height:39px;line-height:27px;padding:5px 0;position:absolute;right:20px;text-align:center;top:-39px;width:50px}.lg-outer .lg-toogle-thumb:after{content:"\e1ff"}.lg-outer .lg-toogle-thumb:hover{color:#fff}.lg-outer .lg-video-cont{max-width:1140px;max-height:100%;width:100%;padding:0 5px}.lg-outer .lg-video{width:100%;height:0;padding-bottom:56.25%;overflow:hidden;position:relative}.lg-outer .lg-video .lg-object{display:inline-block;position:absolute;top:0;left:0;width:100%!important;height:100%!important}.lg-outer .lg-video .lg-video-play{width:84px;height:59px;position:absolute;left:50%;top:50%;margin-left:-42px;margin-top:-30px;z-index:1080;cursor:pointer}.lg-outer .lg-has-vimeo .lg-video-play{background:url(img/vimeo-play.png) no-repeat}.lg-outer .lg-has-vimeo:hover .lg-video-play{background:url(img/vimeo-play.png) 0 -58px no-repeat}.lg-outer .lg-has-html5 .lg-video-play{background:url(img/video-play.png) no-repeat;height:64px;margin-left:-32px;margin-top:-32px;width:64px;opacity:.8}.lg-outer .lg-has-html5:hover .lg-video-play{opacity:1}.lg-outer .lg-has-youtube .lg-video-play{background:url(img/youtube-play.png) no-repeat}.lg-outer .lg-has-youtube:hover .lg-video-play{background:url(img/youtube-play.png) 0 -60px no-repeat}.lg-outer .lg-video-object{width:100%!important;height:100%!important;position:absolute;top:0;left:0}.lg-outer .lg-has-video .lg-video-object{visibility:hidden}.lg-outer .lg-has-video.lg-video-playing .lg-object,.lg-outer .lg-has-video.lg-video-playing .lg-video-play{display:none}.lg-outer .lg-has-video.lg-video-playing .lg-video-object{visibility:visible}.lg-progress-bar{background-color:#333;height:5px;left:0;position:absolute;top:0;width:100%;z-index:1083;opacity:0;-webkit-transition:opacity 80ms ease 0s;-o-transition:opacity 80ms ease 0s;transition:opacity 80ms ease 0s}.lg-progress-bar .lg-progress{background-color:#a90707;height:5px;width:0}.lg-progress-bar.lg-start .lg-progress{width:100%}.lg-show-autoplay .lg-progress-bar{opacity:1}.lg-autoplay-button:after{content:"\e01d"}.lg-show-autoplay .lg-autoplay-button:after{content:"\e01a"}.lg-outer.lg-css3.lg-zoom-dragging .lg-item.lg-complete.lg-zoomable .lg-image,.lg-outer.lg-css3.lg-zoom-dragging .lg-item.lg-complete.lg-zoomable .lg-img-wrap{-webkit-transition-duration:0s;-o-transition-duration:0s;transition-duration:0s}.lg-outer .lg-item.lg-complete.lg-zoomable .lg-img-wrap{-webkit-transition:left .3s cubic-bezier(0,0,.25,1) 0s,top .3s cubic-bezier(0,0,.25,1) 0s;-o-transition:left .3s cubic-bezier(0,0,.25,1) 0s,top .3s cubic-bezier(0,0,.25,1) 0s;transition:left .3s cubic-bezier(0,0,.25,1) 0s,top .3s cubic-bezier(0,0,.25,1) 0s;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.lg-outer .lg-item.lg-complete.lg-zoomable .lg-image{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);-webkit-transition:-webkit-transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;-o-transition:-o-transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;-webkit-transition:opacity .15s,-webkit-transform .3s cubic-bezier(0,0,.25,1) 0s!important;transition:opacity .15s,-webkit-transform .3s cubic-bezier(0,0,.25,1) 0s!important;-o-transition:transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;transition:transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s!important;transition:transform .3s cubic-bezier(0,0,.25,1) 0s,opacity .15s,-webkit-transform .3s cubic-bezier(0,0,.25,1) 0s!important;-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-backface-visibility:hidden;backface-visibility:hidden}#lg-zoom-in:after{content:"\e311"}#lg-actual-size{font-size:20px}#lg-actual-size:after{content:"\e033"}#lg-zoom-out{opacity:.5;pointer-events:none}#lg-zoom-out:after{content:"\e312"}.lg-zoomed #lg-zoom-out{opacity:1;pointer-events:auto}.lg-outer .lg-pager-outer{bottom:60px;left:0;position:absolute;right:0;text-align:center;z-index:1080;height:10px}.lg-outer .lg-pager-outer.lg-pager-hover .lg-pager-cont{overflow:visible}.lg-outer .lg-pager-cont{cursor:pointer;display:inline-block;overflow:hidden;position:relative;vertical-align:top;margin:0 5px}.lg-outer .lg-pager-cont:hover .lg-pager-thumb-cont{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.lg-outer .lg-pager-cont.lg-pager-active .lg-pager{-webkit-box-shadow:0 0 0 2px #fff inset;box-shadow:0 0 0 2px #fff inset}.lg-outer .lg-pager-thumb-cont{background-color:#fff;color:#fff;bottom:100%;height:83px;left:0;margin-bottom:20px;margin-left:-60px;opacity:0;padding:5px;position:absolute;width:120px;border-radius:3px;-webkit-transition:opacity .15s ease 0s,-webkit-transform .15s ease 0s;-o-transition:opacity .15s ease 0s,-o-transform .15s ease 0s;transition:opacity .15s ease 0s,-webkit-transform .15s ease 0s;-o-transition:opacity .15s ease 0s,transform .15s ease 0s;transition:opacity .15s ease 0s,transform .15s ease 0s;transition:opacity .15s ease 0s,transform .15s ease 0s,-webkit-transform .15s ease 0s;-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}.lg-outer .lg-pager-thumb-cont img{width:100%;height:100%}.lg-outer .lg-pager{background-color:rgba(255,255,255,.5);border-radius:50%;-webkit-box-shadow:0 0 0 8px rgba(255,255,255,.7) inset;box-shadow:0 0 0 8px rgba(255,255,255,.7) inset;display:block;height:12px;-webkit-transition:box-shadow .3s ease 0s;-o-transition:box-shadow .3s ease 0s;-webkit-transition:-webkit-box-shadow .3s ease 0s;transition:-webkit-box-shadow .3s ease 0s;transition:box-shadow .3s ease 0s;transition:box-shadow .3s ease 0s,-webkit-box-shadow .3s ease 0s;width:12px}.lg-outer .lg-pager:focus,.lg-outer .lg-pager:hover{-webkit-box-shadow:0 0 0 8px #fff inset;box-shadow:0 0 0 8px #fff inset}.lg-outer .lg-caret{border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px dashed;bottom:-10px;display:inline-block;height:0;left:50%;margin-left:-5px;position:absolute;vertical-align:middle;width:0}.lg-outer,.lg-outer .lg,.lg-outer .lg-inner{width:100%;height:100%}.lg-fullscreen:after{content:"\e20c"}.lg-fullscreen-on .lg-fullscreen:after{content:"\e20d"}.group:after,.group:before{display:table;content:"";line-height:0}.group:after{clear:both}.lg-outer{position:fixed;top:0;left:0;z-index:1050;opacity:0;-webkit-transition:opacity .15s ease 0s;-o-transition:opacity .15s ease 0s;transition:opacity .15s ease 0s}.lg-outer *{-webkit-box-sizing:border-box;box-sizing:border-box}.lg-outer.lg-visible{opacity:1}.lg-outer.lg-css3 .lg-item.lg-current,.lg-outer.lg-css3 .lg-item.lg-next-slide,.lg-outer.lg-css3 .lg-item.lg-prev-slide{-webkit-transition-duration:inherit!important;-o-transition-duration:inherit!important;transition-duration:inherit!important;-webkit-transition-timing-function:inherit!important;-o-transition-timing-function:inherit!important;transition-timing-function:inherit!important}.lg-outer.lg-css3.lg-dragging .lg-item.lg-current,.lg-outer.lg-css3.lg-dragging .lg-item.lg-next-slide,.lg-outer.lg-css3.lg-dragging .lg-item.lg-prev-slide{-webkit-transition-duration:0s!important;-o-transition-duration:0s!important;transition-duration:0s!important;opacity:1}.lg-outer.lg-grab img.lg-object{cursor:-webkit-grab;cursor:-o-grab;cursor:-ms-grab;cursor:grab}.lg-outer.lg-grabbing img.lg-object{cursor:move;cursor:-webkit-grabbing;cursor:-o-grabbing;cursor:-ms-grabbing;cursor:grabbing}.lg-outer .lg{position:relative;overflow:hidden;margin-left:auto;margin-right:auto;max-width:100%;max-height:100%}.lg-outer .lg-inner{position:absolute;left:0;top:0;white-space:nowrap}.lg-outer .lg-item{background:url(img/loading.gif) center center no-repeat;display:none!important}.lg-outer.lg-css .lg-current,.lg-outer.lg-css3 .lg-current,.lg-outer.lg-css3 .lg-next-slide,.lg-outer.lg-css3 .lg-prev-slide{display:inline-block!important}.lg-outer .lg-img-wrap,.lg-outer .lg-item{display:inline-block;text-align:center;position:absolute;width:100%;height:100%}.lg-outer .lg-img-wrap:before,.lg-outer .lg-item:before{content:"";display:inline-block;height:50%;width:1px;margin-right:-1px}.lg-outer .lg-img-wrap{position:absolute;padding:0 5px;left:0;right:0;top:0;bottom:0}.lg-outer .lg-item.lg-complete{background-image:none}.lg-outer .lg-item.lg-current{z-index:1060}.lg-outer .lg-image{display:inline-block;vertical-align:middle;max-width:100%;max-height:100%;width:auto!important;height:auto!important}.lg-outer.lg-show-after-load .lg-item .lg-object,.lg-outer.lg-show-after-load .lg-item .lg-video-play{opacity:0;-webkit-transition:opacity .15s ease 0s;-o-transition:opacity .15s ease 0s;transition:opacity .15s ease 0s}.lg-outer.lg-show-after-load .lg-item.lg-complete .lg-object,.lg-outer.lg-show-after-load .lg-item.lg-complete .lg-video-play{opacity:1}.lg-outer .lg-empty-html,.lg-outer.lg-hide-download #lg-download{display:none}.lg-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;z-index:1040;background-color:#000;opacity:0;-webkit-transition:opacity .15s ease 0s;-o-transition:opacity .15s ease 0s;transition:opacity .15s ease 0s}.lg-backdrop.in{opacity:1}.lg-css3.lg-no-trans .lg-current,.lg-css3.lg-no-trans .lg-next-slide,.lg-css3.lg-no-trans .lg-prev-slide{-webkit-transition:none 0s ease 0s!important;-o-transition:none 0s ease 0s!important;transition:none 0s ease 0s!important}.lg-css3.lg-use-css3 .lg-item,.lg-css3.lg-use-left .lg-item{-webkit-backface-visibility:hidden;backface-visibility:hidden}.lg-css3.lg-fade .lg-item{opacity:0}.lg-css3.lg-fade .lg-item.lg-current{opacity:1}.lg-css3.lg-fade .lg-item.lg-current,.lg-css3.lg-fade .lg-item.lg-next-slide,.lg-css3.lg-fade .lg-item.lg-prev-slide{-webkit-transition:opacity .1s ease 0s;-o-transition:opacity .1s ease 0s;transition:opacity .1s ease 0s}.lg-css3.lg-slide.lg-use-css3 .lg-item{opacity:0}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current,.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide,.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide.lg-use-left .lg-item{opacity:0;position:absolute;left:0}.lg-css3.lg-slide.lg-use-left .lg-item.lg-prev-slide{left:-100%}.lg-css3.lg-slide.lg-use-left .lg-item.lg-next-slide{left:100%}.lg-css3.lg-slide.lg-use-left .lg-item.lg-current{left:0;opacity:1}.lg-css3.lg-slide.lg-use-left .lg-item.lg-current,.lg-css3.lg-slide.lg-use-left .lg-item.lg-next-slide,.lg-css3.lg-slide.lg-use-left .lg-item.lg-prev-slide{-webkit-transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:left 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s}.lg-css3.lg-zoom-in .lg-item{opacity:0}.lg-css3.lg-zoom-in .lg-item.lg-next-slide,.lg-css3.lg-zoom-in .lg-item.lg-prev-slide{-webkit-transform:scale3d(1.3,1.3,1.3);transform:scale3d(1.3,1.3,1.3)}.lg-css3.lg-zoom-in .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-in .lg-item.lg-current,.lg-css3.lg-zoom-in .lg-item.lg-next-slide,.lg-css3.lg-zoom-in .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-zoom-in-big .lg-item{opacity:0}.lg-css3.lg-zoom-in-big .lg-item.lg-next-slide,.lg-css3.lg-zoom-in-big .lg-item.lg-prev-slide{-webkit-transform:scale3d(2,2,2);transform:scale3d(2,2,2)}.lg-css3.lg-zoom-in-big .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-in-big .lg-item.lg-current,.lg-css3.lg-zoom-in-big .lg-item.lg-next-slide,.lg-css3.lg-zoom-in-big .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-zoom-out .lg-item{opacity:0}.lg-css3.lg-zoom-out .lg-item.lg-next-slide,.lg-css3.lg-zoom-out .lg-item.lg-prev-slide{-webkit-transform:scale3d(.7,.7,.7);transform:scale3d(.7,.7,.7)}.lg-css3.lg-zoom-out .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-out .lg-item.lg-current,.lg-css3.lg-zoom-out .lg-item.lg-next-slide,.lg-css3.lg-zoom-out .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-zoom-out-big .lg-item{opacity:0}.lg-css3.lg-zoom-out-big .lg-item.lg-next-slide,.lg-css3.lg-zoom-out-big .lg-item.lg-prev-slide{-webkit-transform:scale3d(0,0,0);transform:scale3d(0,0,0)}.lg-css3.lg-zoom-out-big .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-out-big .lg-item.lg-current,.lg-css3.lg-zoom-out-big .lg-item.lg-next-slide,.lg-css3.lg-zoom-out-big .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-zoom-out-in .lg-item{opacity:0}.lg-css3.lg-zoom-out-in .lg-item.lg-prev-slide{-webkit-transform:scale3d(0,0,0);transform:scale3d(0,0,0)}.lg-css3.lg-zoom-out-in .lg-item.lg-next-slide{-webkit-transform:scale3d(2,2,2);transform:scale3d(2,2,2)}.lg-css3.lg-zoom-out-in .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-out-in .lg-item.lg-current,.lg-css3.lg-zoom-out-in .lg-item.lg-next-slide,.lg-css3.lg-zoom-out-in .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-zoom-in-out .lg-item{opacity:0}.lg-css3.lg-zoom-in-out .lg-item.lg-prev-slide{-webkit-transform:scale3d(2,2,2);transform:scale3d(2,2,2)}.lg-css3.lg-zoom-in-out .lg-item.lg-next-slide{-webkit-transform:scale3d(0,0,0);transform:scale3d(0,0,0)}.lg-css3.lg-zoom-in-out .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-zoom-in-out .lg-item.lg-current,.lg-css3.lg-zoom-in-out .lg-item.lg-next-slide,.lg-css3.lg-zoom-in-out .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-soft-zoom .lg-item{opacity:0}.lg-css3.lg-soft-zoom .lg-item.lg-prev-slide{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}.lg-css3.lg-soft-zoom .lg-item.lg-next-slide{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}.lg-css3.lg-soft-zoom .lg-item.lg-current{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);opacity:1}.lg-css3.lg-soft-zoom .lg-item.lg-current,.lg-css3.lg-soft-zoom .lg-item.lg-next-slide,.lg-css3.lg-soft-zoom .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-scale-up .lg-item{opacity:0}.lg-css3.lg-scale-up .lg-item.lg-next-slide,.lg-css3.lg-scale-up .lg-item.lg-prev-slide{-ms-transform:scale3d(.8,.8,.8) translate3d(0,10%,0);-webkit-transform:scale3d(.8,.8,.8) translate3d(0,10%,0);transform:scale3d(.8,.8,.8) translate3d(0,10%,0)}.lg-css3.lg-scale-up .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-scale-up .lg-item.lg-current,.lg-css3.lg-scale-up .lg-item.lg-next-slide,.lg-css3.lg-scale-up .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular .lg-item{opacity:0}.lg-css3.lg-slide-circular .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(-100%,0,0);-webkit-transform:scale3d(0,0,0) translate3d(-100%,0,0);transform:scale3d(0,0,0) translate3d(-100%,0,0)}.lg-css3.lg-slide-circular .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(100%,0,0);-webkit-transform:scale3d(0,0,0) translate3d(100%,0,0);transform:scale3d(0,0,0) translate3d(100%,0,0)}.lg-css3.lg-slide-circular .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular .lg-item.lg-current,.lg-css3.lg-slide-circular .lg-item.lg-next-slide,.lg-css3.lg-slide-circular .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular-up .lg-item{opacity:0}.lg-css3.lg-slide-circular-up .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(-100%,-100%,0);-webkit-transform:scale3d(0,0,0) translate3d(-100%,-100%,0);transform:scale3d(0,0,0) translate3d(-100%,-100%,0)}.lg-css3.lg-slide-circular-up .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(100%,-100%,0);-webkit-transform:scale3d(0,0,0) translate3d(100%,-100%,0);transform:scale3d(0,0,0) translate3d(100%,-100%,0)}.lg-css3.lg-slide-circular-up .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular-up .lg-item.lg-current,.lg-css3.lg-slide-circular-up .lg-item.lg-next-slide,.lg-css3.lg-slide-circular-up .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular-down .lg-item{opacity:0}.lg-css3.lg-slide-circular-down .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(-100%,100%,0);-webkit-transform:scale3d(0,0,0) translate3d(-100%,100%,0);transform:scale3d(0,0,0) translate3d(-100%,100%,0)}.lg-css3.lg-slide-circular-down .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(100%,100%,0);-webkit-transform:scale3d(0,0,0) translate3d(100%,100%,0);transform:scale3d(0,0,0) translate3d(100%,100%,0)}.lg-css3.lg-slide-circular-down .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular-down .lg-item.lg-current,.lg-css3.lg-slide-circular-down .lg-item.lg-next-slide,.lg-css3.lg-slide-circular-down .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular-vertical .lg-item{opacity:0}.lg-css3.lg-slide-circular-vertical .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(0,-100%,0);-webkit-transform:scale3d(0,0,0) translate3d(0,-100%,0);transform:scale3d(0,0,0) translate3d(0,-100%,0)}.lg-css3.lg-slide-circular-vertical .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(0,100%,0);-webkit-transform:scale3d(0,0,0) translate3d(0,100%,0);transform:scale3d(0,0,0) translate3d(0,100%,0)}.lg-css3.lg-slide-circular-vertical .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular-vertical .lg-item.lg-current,.lg-css3.lg-slide-circular-vertical .lg-item.lg-next-slide,.lg-css3.lg-slide-circular-vertical .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular-vertical-left .lg-item{opacity:0}.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(-100%,-100%,0);-webkit-transform:scale3d(0,0,0) translate3d(-100%,-100%,0);transform:scale3d(0,0,0) translate3d(-100%,-100%,0)}.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(-100%,100%,0);-webkit-transform:scale3d(0,0,0) translate3d(-100%,100%,0);transform:scale3d(0,0,0) translate3d(-100%,100%,0)}.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-current,.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-next-slide,.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-circular-vertical-down .lg-item{opacity:0}.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-prev-slide{-ms-transform:scale3d(0,0,0) translate3d(100%,-100%,0);-webkit-transform:scale3d(0,0,0) translate3d(100%,-100%,0);transform:scale3d(0,0,0) translate3d(100%,-100%,0)}.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-next-slide{-ms-transform:scale3d(0,0,0) translate3d(100%,100%,0);-webkit-transform:scale3d(0,0,0) translate3d(100%,100%,0);transform:scale3d(0,0,0) translate3d(100%,100%,0)}.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-current,.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-next-slide,.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;-webkit-transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity 1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-vertical .lg-item{opacity:0}.lg-css3.lg-slide-vertical .lg-item.lg-prev-slide{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.lg-css3.lg-slide-vertical .lg-item.lg-next-slide{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.lg-css3.lg-slide-vertical .lg-item.lg-current{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-vertical .lg-item.lg-current,.lg-css3.lg-slide-vertical .lg-item.lg-next-slide,.lg-css3.lg-slide-vertical .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-vertical-growth .lg-item{opacity:0}.lg-css3.lg-slide-vertical-growth .lg-item.lg-prev-slide{-ms-transform:scale3d(.5,.5,.5) translate3d(0,-150%,0);-webkit-transform:scale3d(.5,.5,.5) translate3d(0,-150%,0);transform:scale3d(.5,.5,.5) translate3d(0,-150%,0)}.lg-css3.lg-slide-vertical-growth .lg-item.lg-next-slide{-ms-transform:scale3d(.5,.5,.5) translate3d(0,150%,0);-webkit-transform:scale3d(.5,.5,.5) translate3d(0,150%,0);transform:scale3d(.5,.5,.5) translate3d(0,150%,0)}.lg-css3.lg-slide-vertical-growth .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-vertical-growth .lg-item.lg-current,.lg-css3.lg-slide-vertical-growth .lg-item.lg-next-slide,.lg-css3.lg-slide-vertical-growth .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-only .lg-item{opacity:0}.lg-css3.lg-slide-skew-only .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only .lg-item.lg-prev-slide{-ms-transform:skew(10deg,0deg);-webkit-transform:skew(10deg,0deg);transform:skew(10deg,0deg)}.lg-css3.lg-slide-skew-only .lg-item.lg-current{-ms-transform:skew(0deg,0deg);-webkit-transform:skew(0deg,0deg);transform:skew(0deg,0deg);opacity:1}.lg-css3.lg-slide-skew-only .lg-item.lg-current,.lg-css3.lg-slide-skew-only .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-only-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-only-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-rev .lg-item.lg-prev-slide{-ms-transform:skew(-10deg,0deg);-webkit-transform:skew(-10deg,0deg);transform:skew(-10deg,0deg)}.lg-css3.lg-slide-skew-only-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg);-webkit-transform:skew(0deg,0deg);transform:skew(0deg,0deg);opacity:1}.lg-css3.lg-slide-skew-only-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-only-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-only-y .lg-item{opacity:0}.lg-css3.lg-slide-skew-only-y .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-y .lg-item.lg-prev-slide{-ms-transform:skew(0deg,10deg);-webkit-transform:skew(0deg,10deg);transform:skew(0deg,10deg)}.lg-css3.lg-slide-skew-only-y .lg-item.lg-current{-ms-transform:skew(0deg,0deg);-webkit-transform:skew(0deg,0deg);transform:skew(0deg,0deg);opacity:1}.lg-css3.lg-slide-skew-only-y .lg-item.lg-current,.lg-css3.lg-slide-skew-only-y .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-y .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-only-y-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-prev-slide{-ms-transform:skew(0deg,-10deg);-webkit-transform:skew(0deg,-10deg);transform:skew(0deg,-10deg)}.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg);-webkit-transform:skew(0deg,0deg);transform:skew(0deg,0deg);opacity:1}.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew .lg-item{opacity:0}.lg-css3.lg-slide-skew .lg-item.lg-prev-slide{-ms-transform:skew(20deg,0deg) translate3d(-100%,0,0);-webkit-transform:skew(20deg,0deg) translate3d(-100%,0,0);transform:skew(20deg,0deg) translate3d(-100%,0,0)}.lg-css3.lg-slide-skew .lg-item.lg-next-slide{-ms-transform:skew(20deg,0deg) translate3d(100%,0,0);-webkit-transform:skew(20deg,0deg) translate3d(100%,0,0);transform:skew(20deg,0deg) translate3d(100%,0,0)}.lg-css3.lg-slide-skew .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew .lg-item.lg-current,.lg-css3.lg-slide-skew .lg-item.lg-next-slide,.lg-css3.lg-slide-skew .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-rev .lg-item.lg-prev-slide{-ms-transform:skew(-20deg,0deg) translate3d(-100%,0,0);-webkit-transform:skew(-20deg,0deg) translate3d(-100%,0,0);transform:skew(-20deg,0deg) translate3d(-100%,0,0)}.lg-css3.lg-slide-skew-rev .lg-item.lg-next-slide{-ms-transform:skew(-20deg,0deg) translate3d(100%,0,0);-webkit-transform:skew(-20deg,0deg) translate3d(100%,0,0);transform:skew(-20deg,0deg) translate3d(100%,0,0)}.lg-css3.lg-slide-skew-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-cross .lg-item{opacity:0}.lg-css3.lg-slide-skew-cross .lg-item.lg-prev-slide{-ms-transform:skew(0deg,60deg) translate3d(-100%,0,0);-webkit-transform:skew(0deg,60deg) translate3d(-100%,0,0);transform:skew(0deg,60deg) translate3d(-100%,0,0)}.lg-css3.lg-slide-skew-cross .lg-item.lg-next-slide{-ms-transform:skew(0deg,60deg) translate3d(100%,0,0);-webkit-transform:skew(0deg,60deg) translate3d(100%,0,0);transform:skew(0deg,60deg) translate3d(100%,0,0)}.lg-css3.lg-slide-skew-cross .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-cross .lg-item.lg-current,.lg-css3.lg-slide-skew-cross .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-cross .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-cross-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-prev-slide{-ms-transform:skew(0deg,-60deg) translate3d(-100%,0,0);-webkit-transform:skew(0deg,-60deg) translate3d(-100%,0,0);transform:skew(0deg,-60deg) translate3d(-100%,0,0)}.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-next-slide{-ms-transform:skew(0deg,-60deg) translate3d(100%,0,0);-webkit-transform:skew(0deg,-60deg) translate3d(100%,0,0);transform:skew(0deg,-60deg) translate3d(100%,0,0)}.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-ver .lg-item{opacity:0}.lg-css3.lg-slide-skew-ver .lg-item.lg-prev-slide{-ms-transform:skew(60deg,0deg) translate3d(0,-100%,0);-webkit-transform:skew(60deg,0deg) translate3d(0,-100%,0);transform:skew(60deg,0deg) translate3d(0,-100%,0)}.lg-css3.lg-slide-skew-ver .lg-item.lg-next-slide{-ms-transform:skew(60deg,0deg) translate3d(0,100%,0);-webkit-transform:skew(60deg,0deg) translate3d(0,100%,0);transform:skew(60deg,0deg) translate3d(0,100%,0)}.lg-css3.lg-slide-skew-ver .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-ver .lg-item.lg-current,.lg-css3.lg-slide-skew-ver .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-ver .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-ver-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-prev-slide{-ms-transform:skew(-60deg,0deg) translate3d(0,-100%,0);-webkit-transform:skew(-60deg,0deg) translate3d(0,-100%,0);transform:skew(-60deg,0deg) translate3d(0,-100%,0)}.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-next-slide{-ms-transform:skew(-60deg,0deg) translate3d(0,100%,0);-webkit-transform:skew(-60deg,0deg) translate3d(0,100%,0);transform:skew(-60deg,0deg) translate3d(0,100%,0)}.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-ver-cross .lg-item{opacity:0}.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-prev-slide{-ms-transform:skew(0deg,20deg) translate3d(0,-100%,0);-webkit-transform:skew(0deg,20deg) translate3d(0,-100%,0);transform:skew(0deg,20deg) translate3d(0,-100%,0)}.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-next-slide{-ms-transform:skew(0deg,20deg) translate3d(0,100%,0);-webkit-transform:skew(0deg,20deg) translate3d(0,100%,0);transform:skew(0deg,20deg) translate3d(0,100%,0)}.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-current,.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-slide-skew-ver-cross-rev .lg-item{opacity:0}.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-prev-slide{-ms-transform:skew(0deg,-20deg) translate3d(0,-100%,0);-webkit-transform:skew(0deg,-20deg) translate3d(0,-100%,0);transform:skew(0deg,-20deg) translate3d(0,-100%,0)}.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-next-slide{-ms-transform:skew(0deg,-20deg) translate3d(0,100%,0);-webkit-transform:skew(0deg,-20deg) translate3d(0,100%,0);transform:skew(0deg,-20deg) translate3d(0,100%,0)}.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-current{-ms-transform:skew(0deg,0deg) translate3d(0,0,0);-webkit-transform:skew(0deg,0deg) translate3d(0,0,0);transform:skew(0deg,0deg) translate3d(0,0,0);opacity:1}.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-current,.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-next-slide,.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-lollipop .lg-item{opacity:0}.lg-css3.lg-lollipop .lg-item.lg-prev-slide{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.lg-css3.lg-lollipop .lg-item.lg-next-slide{-ms-transform:translate3d(0,0,0) scale(.5);-webkit-transform:translate3d(0,0,0) scale(.5);transform:translate3d(0,0,0) scale(.5)}.lg-css3.lg-lollipop .lg-item.lg-current{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.lg-css3.lg-lollipop .lg-item.lg-current,.lg-css3.lg-lollipop .lg-item.lg-next-slide,.lg-css3.lg-lollipop .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-lollipop-rev .lg-item{opacity:0}.lg-css3.lg-lollipop-rev .lg-item.lg-prev-slide{-ms-transform:translate3d(0,0,0) scale(.5);-webkit-transform:translate3d(0,0,0) scale(.5);transform:translate3d(0,0,0) scale(.5)}.lg-css3.lg-lollipop-rev .lg-item.lg-next-slide{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.lg-css3.lg-lollipop-rev .lg-item.lg-current{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.lg-css3.lg-lollipop-rev .lg-item.lg-current,.lg-css3.lg-lollipop-rev .lg-item.lg-next-slide,.lg-css3.lg-lollipop-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-rotate .lg-item{opacity:0}.lg-css3.lg-rotate .lg-item.lg-prev-slide{-ms-transform:rotate(-360deg);-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}.lg-css3.lg-rotate .lg-item.lg-next-slide{-ms-transform:rotate(360deg);-webkit-transform:rotate(360deg);transform:rotate(360deg)}.lg-css3.lg-rotate .lg-item.lg-current{-ms-transform:rotate(0);-webkit-transform:rotate(0);transform:rotate(0);opacity:1}.lg-css3.lg-rotate .lg-item.lg-current,.lg-css3.lg-rotate .lg-item.lg-next-slide,.lg-css3.lg-rotate .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-rotate-rev .lg-item{opacity:0}.lg-css3.lg-rotate-rev .lg-item.lg-prev-slide{-ms-transform:rotate(360deg);-webkit-transform:rotate(360deg);transform:rotate(360deg)}.lg-css3.lg-rotate-rev .lg-item.lg-next-slide{-ms-transform:rotate(-360deg);-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}.lg-css3.lg-rotate-rev .lg-item.lg-current{-ms-transform:rotate(0);-webkit-transform:rotate(0);transform:rotate(0);opacity:1}.lg-css3.lg-rotate-rev .lg-item.lg-current,.lg-css3.lg-rotate-rev .lg-item.lg-next-slide,.lg-css3.lg-rotate-rev .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.lg-css3.lg-tube .lg-item{opacity:0}.lg-css3.lg-tube .lg-item.lg-prev-slide{-ms-transform:scale3d(1,0,1) translate3d(-100%,0,0);-webkit-transform:scale3d(1,0,1) translate3d(-100%,0,0);transform:scale3d(1,0,1) translate3d(-100%,0,0)}.lg-css3.lg-tube .lg-item.lg-next-slide{-ms-transform:scale3d(1,0,1) translate3d(100%,0,0);-webkit-transform:scale3d(1,0,1) translate3d(100%,0,0);transform:scale3d(1,0,1) translate3d(100%,0,0)}.lg-css3.lg-tube .lg-item.lg-current{-ms-transform:scale3d(1,1,1) translate3d(0,0,0);-webkit-transform:scale3d(1,1,1) translate3d(0,0,0);transform:scale3d(1,1,1) translate3d(0,0,0);opacity:1}.lg-css3.lg-tube .lg-item.lg-current,.lg-css3.lg-tube .lg-item.lg-next-slide,.lg-css3.lg-tube .lg-item.lg-prev-slide{-webkit-transition:-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-o-transition:-o-transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;-webkit-transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;transition:opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s;-o-transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s;transition:transform 1s cubic-bezier(0,0,.25,1) 0s,opacity .1s ease 0s,-webkit-transform 1s cubic-bezier(0,0,.25,1) 0s}.progressjs-inner{width:0}.progressjs-progress{z-index:9999999}.progressjs-theme-blue .progressjs-inner{height:2px;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db}.progressjs-theme-blue.progressjs-end{-webkit-transition:opacity .2s ease-out;-o-transition:opacity .2s ease-out;transition:opacity .2s ease-out;opacity:0}.progressjs-theme-blue .progressjs-percent{display:none}.progressjs-theme-blueOverlay{background-color:#fff;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.progressjs-theme-blueOverlay .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db}.progressjs-theme-blueOverlay.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlay .progressjs-percent{display:none}.progressjs-theme-blueOverlay{background-color:#fff;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.progressjs-theme-blueOverlay .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db}.progressjs-theme-blueOverlay.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlay .progressjs-percent{display:none}.progressjs-theme-blueOverlayRadius{background-color:#fff;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out;border-radius:5px}.progressjs-theme-blueOverlayRadius .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db;border-radius:5px}.progressjs-theme-blueOverlayRadius.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlayRadius .progressjs-percent{display:none}.progressjs-theme-blueOverlayRadiusHalfOpacity{background-color:#fff;opacity:.5;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out;border-radius:5px}.progressjs-theme-blueOverlayRadiusHalfOpacity .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db;border-radius:5px}.progressjs-theme-blueOverlayRadiusHalfOpacity.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlayRadiusHalfOpacity .progressjs-percent{display:none}.progressjs-theme-blueOverlayRadiusWithPercentBar{background-color:#fff;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out;border-radius:5px}.progressjs-theme-blueOverlayRadiusWithPercentBar .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db;border-radius:5px}.progressjs-theme-blueOverlayRadiusWithPercentBar.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlayRadiusWithPercentBar .progressjs-percent{width:70px;text-align:center;height:40px;position:absolute;right:50%;margin-right:-35px;top:50%;margin-top:-20px;font-size:30px;opacity:.5}.progressjs-theme-blackRadiusInputs{height:10px;border-radius:10px;overflow:hidden}.progressjs-theme-blackRadiusInputs .progressjs-inner{height:2px;-webkit-transition:all 1s ease-out;-o-transition:all 1s ease-out;transition:all 1s ease-out;background-color:#34495e}.progressjs-theme-blackRadiusInputs.progressjs-end{-webkit-transition:opacity .2s ease-out;-o-transition:opacity .2s ease-out;transition:opacity .2s ease-out;opacity:0}.progressjs-theme-blackRadiusInputs .progressjs-percent{display:none}.progressjs-theme-rainloop{z-index:2000}.progressjs-theme-rainloop .progressjs-inner{background-color:#939595;position:relative;z-index:2000;height:3px;overflow:hidden;-webkit-transition:width .5s;-o-transition:width .5s;transition:width .5s}.progressjs-theme-rainloop .progressjs-percent{position:absolute;top:0;left:0;right:-32px;bottom:0;background-image:-o-linear-gradient(45deg,rgba(255,255,255,.3) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.3) 50%,rgba(255,255,255,.3) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.3) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.3) 50%,rgba(255,255,255,.3) 75%,transparent 75%,transparent);background-size:32px 32px;-webkit-animation:simple-pace-stripe-animation .5s linear infinite;animation:simple-pace-stripe-animation .5s linear infinite}@-webkit-keyframes simple-pace-stripe-animation{0%{-webkit-transform:none;transform:none}100%{-webkit-transform:translate(-32px,0);transform:translate(-32px,0)}}@keyframes simple-pace-stripe-animation{0%{-webkit-transform:none;transform:none;transform:none}100%{-webkit-transform:translate(-32px,0);transform:translate(-32px,0);transform:translate(-32px,0)}}.clearfix:after,.clearfix:before{display:table;content:"";line-height:0}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover{color:#005580;text-decoration:underline}.img-rounded{border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,.1);box-shadow:0 1px 3px rgba(0,0,0,.1)}.img-circle{border-radius:500px}.row{margin-left:-20px}.row:after,.row:before{display:table;content:"";line-height:0}.row:after{clear:both}[class*=span]{float:left;margin-left:20px}.container,.navbar-fixed-bottom .container,.navbar-fixed-top .container,.navbar-static-top .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%}.row-fluid:after,.row-fluid:before{display:table;content:"";line-height:0}.row-fluid:after{clear:both}.row-fluid [class*=span]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.12765957%}.row-fluid [class*=span]:first-child{margin-left:0}.row-fluid .span12{width:100%}.row-fluid .span11{width:91.4893617%}.row-fluid .span10{width:82.9787234%}.row-fluid .span9{width:74.46808511%}.row-fluid .span8{width:65.95744681%}.row-fluid .span7{width:57.44680851%}.row-fluid .span6{width:48.93617021%}.row-fluid .span5{width:40.42553191%}.row-fluid .span4{width:31.91489362%}.row-fluid .span3{width:23.40425532%}.row-fluid .span2{width:14.89361702%}.row-fluid .span1{width:6.38297872%}.row-fluid .offset12{margin-left:104.25531915%}.row-fluid .offset12:first-child{margin-left:102.12765957%}.row-fluid .offset11{margin-left:95.74468085%}.row-fluid .offset11:first-child{margin-left:93.61702128%}.row-fluid .offset10{margin-left:87.23404255%}.row-fluid .offset10:first-child{margin-left:85.10638298%}.row-fluid .offset9{margin-left:78.72340426%}.row-fluid .offset9:first-child{margin-left:76.59574468%}.row-fluid .offset8{margin-left:70.21276596%}.row-fluid .offset8:first-child{margin-left:68.08510638%}.row-fluid .offset7{margin-left:61.70212766%}.row-fluid .offset7:first-child{margin-left:59.57446809%}.row-fluid .offset6{margin-left:53.19148936%}.row-fluid .offset6:first-child{margin-left:51.06382979%}.row-fluid .offset5{margin-left:44.68085106%}.row-fluid .offset5:first-child{margin-left:42.55319149%}.row-fluid .offset4{margin-left:36.17021277%}.row-fluid .offset4:first-child{margin-left:34.04255319%}.row-fluid .offset3{margin-left:27.65957447%}.row-fluid .offset3:first-child{margin-left:25.53191489%}.row-fluid .offset2{margin-left:19.14893617%}.row-fluid .offset2:first-child{margin-left:17.0212766%}.row-fluid .offset1{margin-left:10.63829787%}.row-fluid .offset1:first-child{margin-left:8.5106383%}.row-fluid [class*=span].hide,[class*=span].hide{display:none}.row-fluid [class*=span].pull-right,[class*=span].pull-right{float:right}.container{margin-right:auto;margin-left:auto}.container:after,.container:before{display:table;content:"";line-height:0}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px}.container-fluid:after,.container-fluid:before{display:table;content:"";line-height:0}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:20px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:700}em{font-style:italic}cite{font-style:normal}.muted{color:#999}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:700;line-height:1;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:400;line-height:1;color:#999}h1{font-size:36px;line-height:40px}h2{font-size:30px;line-height:40px}h3{font-size:24px;line-height:40px}h4{font-size:18px;line-height:20px}h5{font-size:14px;line-height:20px}h6{font-size:12px;line-height:20px}h1 small{font-size:24px}h2 small{font-size:18px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ol,ul{padding:0;margin:0 0 10px 25px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}li{line-height:20px}ol.unstyled,ul.unstyled{margin-left:0;list-style:none}dl{margin-bottom:20px}dd,dt{line-height:20px}dt{font-weight:700}dd{margin-left:10px}.dl-horizontal dt{float:left;width:120px;clear:left;text-align:right;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:130px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}blockquote:after,blockquote:before,q:after,q:before{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}button,input,label,select,textarea{font-size:14px;font-weight:400;line-height:20px}button,input,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}.uneditable-input,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{display:inline-block;height:20px;padding:4px 6px;margin-bottom:9px;font-size:14px;line-height:20px;color:#555;border-radius:3px}input,textarea{width:210px}textarea{height:auto}.uneditable-input,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],textarea{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;-webkit-transition:border linear .2s,-webkit-box-shadow linear .2s;transition:border linear .2s,-webkit-box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s,-webkit-box-shadow linear .2s}.uneditable-input:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,textarea:focus{border-color:rgba(82,168,236,.8);outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6)}input[type=checkbox],input[type=radio]{margin:4px 0 0;line-height:normal;cursor:pointer}input[type=button],input[type=checkbox],input[type=file],input[type=image],input[type=radio],input[type=reset],input[type=submit]{width:auto}input[type=file],select{height:30px;line-height:30px}select{width:220px;border:1px solid #bbb;background-color:#fff}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus,select:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.025);box-shadow:inset 0 1px 2px rgba(0,0,0,.025);cursor:not-allowed}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.checkbox,.radio{min-height:18px;padding-left:18px}.checkbox input[type=checkbox],.radio input[type=radio]{float:left;margin-left:-18px}.controls>.checkbox:first-child,.controls>.radio:first-child{padding-top:5px}.checkbox.inline,.radio.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.checkbox.inline+.checkbox.inline,.radio.inline+.radio.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}.row-fluid .uneditable-input[class*=span],.row-fluid input[class*=span],.row-fluid select[class*=span],.row-fluid textarea[class*=span],.uneditable-input[class*=span],input[class*=span],select[class*=span],textarea[class*=span]{float:none;margin-left:0}.input-append .uneditable-input[class*=span],.input-append input[class*=span],.input-prepend .uneditable-input[class*=span],.input-prepend input[class*=span],.row-fluid .input-append [class*=span],.row-fluid .input-prepend [class*=span],.row-fluid .uneditable-input[class*=span],.row-fluid input[class*=span],.row-fluid select[class*=span],.row-fluid textarea[class*=span]{display:inline-block}.uneditable-input,input,textarea{margin-left:0}.controls-row [class*=span]+[class*=span]{margin-left:20px}.uneditable-input.span12,input.span12,textarea.span12{width:926px}.uneditable-input.span11,input.span11,textarea.span11{width:846px}.uneditable-input.span10,input.span10,textarea.span10{width:766px}.uneditable-input.span9,input.span9,textarea.span9{width:686px}.uneditable-input.span8,input.span8,textarea.span8{width:606px}.uneditable-input.span7,input.span7,textarea.span7{width:526px}.uneditable-input.span6,input.span6,textarea.span6{width:446px}.uneditable-input.span5,input.span5,textarea.span5{width:366px}.uneditable-input.span4,input.span4,textarea.span4{width:286px}.uneditable-input.span3,input.span3,textarea.span3{width:206px}.uneditable-input.span2,input.span2,textarea.span2{width:126px}.uneditable-input.span1,input.span1,textarea.span1{width:46px}.controls-row:after,.controls-row:before{display:table;content:"";line-height:0}.controls-row:after{clear:both}.controls-row [class*=span]{float:left}input[disabled],input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type=checkbox][disabled],input[type=checkbox][readonly],input[type=radio][disabled],input[type=radio][readonly]{background-color:transparent}.control-group.warning .help-block,.control-group.warning .help-inline,.control-group.warning>label{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.warning .checkbox:focus,.control-group.warning .radio:focus,.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e}.control-group.warning .input-append .add-on,.control-group.warning .input-prepend .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .help-block,.control-group.error .help-inline,.control-group.error>label{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.error .checkbox:focus,.control-group.error .radio:focus,.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392}.control-group.error .input-append .add-on,.control-group.error .input-prepend .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .help-block,.control-group.success .help-inline,.control-group.success>label{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.success .checkbox:focus,.control-group.success .radio:focus,.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b}.control-group.success .input-append .add-on,.control-group.success .input-prepend .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}input:focus:required:invalid,select:focus:required:invalid,textarea:focus:required:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:required:invalid:focus,select:focus:required:invalid:focus,textarea:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5}.form-actions:after,.form-actions:before{display:table;content:"";line-height:0}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;vertical-align:middle;padding-left:5px}.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap}.input-append .uneditable-input,.input-append input,.input-append select,.input-prepend .uneditable-input,.input-prepend input,.input-prepend select{position:relative;margin-bottom:0;font-size:14px;vertical-align:top;border-radius:0 3px 3px 0}.input-append .uneditable-input:focus,.input-append input:focus,.input-append select:focus,.input-prepend .uneditable-input:focus,.input-prepend input:focus,.input-prepend select:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:400;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-append .btn,.input-prepend .add-on,.input-prepend .btn{margin-left:-1px;vertical-align:top;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{border-radius:3px 0 0 3px}.input-append .uneditable-input,.input-append input,.input-append select{border-radius:3px 0 0 3px}.input-append .add-on:last-child,.input-append .btn:last-child{border-radius:0 3px 3px 0}.input-prepend.input-append .uneditable-input,.input-prepend.input-append input,.input-prepend.input-append select{border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;border-radius:0 3px 3px 0}input.search-query{padding-right:14px;padding-left:14px;margin-bottom:0;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{border-radius:0}.form-search .input-append .search-query{border-radius:14px 0 0 14px}.form-search .input-append .btn{border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{border-radius:0 14px 14px 0}.form-search .input-prepend .btn{border-radius:14px 0 0 14px}.form-horizontal .help-inline,.form-horizontal .input-append,.form-horizontal .input-prepend,.form-horizontal .uneditable-input,.form-horizontal input,.form-horizontal select,.form-horizontal textarea,.form-inline .help-inline,.form-inline .input-append,.form-inline .input-prepend,.form-inline .uneditable-input,.form-inline input,.form-inline select,.form-inline textarea,.form-search .help-inline,.form-search .input-append,.form-search .input-prepend,.form-search .uneditable-input,.form-search input,.form-search select,.form-search textarea{display:inline-block;margin-bottom:0;vertical-align:middle}.form-horizontal .hide,.form-inline .hide,.form-search .hide{display:none}.form-inline .btn-group,.form-inline label,.form-search .btn-group,.form-search label{display:inline-block}.form-inline .input-append,.form-inline .input-prepend,.form-search .input-append,.form-search .input-prepend{margin-bottom:0}.form-inline .checkbox,.form-inline .radio,.form-search .checkbox,.form-search .radio{padding-left:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio],.form-search .checkbox input[type=checkbox],.form-search .radio input[type=radio]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px}.form-horizontal .control-group:after,.form-horizontal .control-group:before{display:table;content:"";line-height:0}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right}.form-horizontal .controls{margin-left:160px}.form-horizontal .help-block{margin-top:10px;margin-bottom:0}.form-horizontal .form-actions{padding-left:160px}.table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table td,.table th{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:700}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child td,.table caption+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table thead:first-child tr:first-child td,.table thead:first-child tr:first-child th{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table-condensed td,.table-condensed th{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;border-left:0;border-radius:4px}.table-bordered td,.table-bordered th{border-left:1px solid #ddd}.table-bordered caption+tbody tr:first-child td,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+thead tr:first-child th,.table-bordered tbody:first-child tr:first-child td,.table-bordered tbody:first-child tr:first-child th,.table-bordered thead:first-child tr:first-child th{border-top:0}.table-bordered tbody:first-child tr:first-child td:first-child,.table-bordered thead:first-child tr:first-child th:first-child{border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered tbody:first-child tr:first-child td:last-child,.table-bordered thead:first-child tr:first-child th:last-child{border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child,.table-bordered thead:last-child tr:last-child th:first-child{border-radius:0 0 0 4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child,.table-bordered thead:last-child tr:last-child th:last-child{border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered caption+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child{border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered caption+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child{border-top-right-radius:4px;-moz-border-right-topleft:4px}.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9}.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5}.row-fluid table [class*=span],table [class*=span]{display:table-cell;float:none;margin-left:0}table .span1{float:none;width:44px;margin-left:0}table .span2{float:none;width:124px;margin-left:0}table .span3{float:none;width:204px;margin-left:0}table .span4{float:none;width:284px;margin-left:0}table .span5{float:none;width:364px;margin-left:0}table .span6{float:none;width:444px;margin-left:0}table .span7{float:none;width:524px;margin-left:0}table .span8{float:none;width:604px;margin-left:0}table .span9{float:none;width:684px;margin-left:0}table .span10{float:none;width:764px;margin-left:0}table .span11{float:none;width:844px;margin-left:0}table .span12{float:none;width:924px;margin-left:0}table .span13{float:none;width:1004px;margin-left:0}table .span14{float:none;width:1084px;margin-left:0}table .span15{float:none;width:1164px;margin-left:0}table .span16{float:none;width:1244px;margin-left:0}table .span17{float:none;width:1324px;margin-left:0}table .span18{float:none;width:1404px;margin-left:0}table .span19{float:none;width:1484px;margin-left:0}table .span20{float:none;width:1564px;margin-left:0}table .span21{float:none;width:1644px;margin-left:0}table .span22{float:none;width:1724px;margin-left:0}table .span23{float:none;width:1804px;margin-left:0}table .span24{float:none;width:1884px;margin-left:0}.table tbody tr.success td{background-color:#dff0d8}.table tbody tr.error td{background-color:#f2dede}.table tbody tr.info td{background-color:#d9edf7}.dropdown,.dropup{position:relative}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu li>a:focus,.dropdown-menu li>a:hover,.dropdown-submenu:hover>a{text-decoration:none;color:#fff;background-color:#08c;background-color:#0081c2;background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,left top,left bottom,from(#08c),to(#0077b3));background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#08c;background-color:#0081c2;background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,left top,left bottom,from(#08c),to(#0077b3));background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x}.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999}.dropdown-menu .disabled>a:hover{text-decoration:none;background-color:transparent;cursor:default}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:"\2191"}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover .dropdown-menu{display:block}.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#ccc;margin-top:5px;margin-right:-10px}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown .dropdown-menu .nav-header{padding-left:20px;padding-right:20px}.typeahead{margin-top:2px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-large{padding:24px;border-radius:6px}.well-small{padding:9px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:700;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.btn{display:inline-block;padding:4px 14px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333;text-shadow:0 1px 1px rgba(255,255,255,.75);background-color:#f5f5f5;background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e6e6e6));background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);border:1px solid #bbb;border-bottom-color:#a2a2a2;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.btn.active,.btn.disabled,.btn:active,.btn:hover,.btn[disabled]{color:#333;background-color:#e6e6e6}.btn:hover{color:#333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-color:#e6e6e6;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:.65;-webkit-box-shadow:none;box-shadow:none}.btn-large{padding:9px 14px;font-size:16px;line-height:normal;border-radius:5px}.btn-large [class^=icon-]{margin-top:2px}.btn-small{padding:3px 9px;font-size:12px;line-height:18px}.btn-small [class^=icon-]{margin-top:0}.btn-mini{padding:2px 6px;font-size:11px;line-height:16px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}.btn-danger.active,.btn-info.active,.btn-inverse.active,.btn-primary.active,.btn-success.active,.btn-warning.active{color:rgba(255,255,255,.75)}.btn{border-color:#c5c5c5;border-color:rgba(0,0,0,.15) rgba(0,0,0,.15) rgba(0,0,0,.25)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#006dcc;background-image:-o-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,left top,left bottom,from(#08c),to(#04c));background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25)}.btn-primary.active,.btn-primary.disabled,.btn-primary:active,.btn-primary:hover,.btn-primary[disabled]{color:#fff;background-color:#04c}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#faa732;background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,left top,left bottom,from(#fbb450),to(#f89406));background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25)}.btn-warning.active,.btn-warning.disabled,.btn-warning:active,.btn-warning:hover,.btn-warning[disabled]{color:#fff;background-color:#f89406}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#da4f49;background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,left top,left bottom,from(#ee5f5b),to(#bd362f));background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25)}.btn-danger.active,.btn-danger.disabled,.btn-danger:active,.btn-danger:hover,.btn-danger[disabled]{color:#fff;background-color:#bd362f}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#5bb75b;background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,left top,left bottom,from(#62c462),to(#51a351));background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25)}.btn-success.active,.btn-success.disabled,.btn-success:active,.btn-success:hover,.btn-success[disabled]{color:#fff;background-color:#51a351}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#49afcd;background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2f96b4));background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25)}.btn-info.active,.btn-info.disabled,.btn-info:active,.btn-info:hover,.btn-info[disabled]{color:#fff;background-color:#2f96b4}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#363636;background-image:-o-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,left top,left bottom,from(#444),to(#222));background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25)}.btn-inverse.active,.btn-inverse.disabled,.btn-inverse:active,.btn-inverse:hover,.btn-inverse[disabled]{color:#fff;background-color:#222}button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0;border:0}.btn-link,.btn-link:active{background-color:transparent;background-image:none;-webkit-box-shadow:none;box-shadow:none}.btn-link{border-color:transparent;cursor:pointer;color:#08c;border-radius:0}.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent}.btn-group{position:relative;font-size:0;white-space:nowrap}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px}.btn-toolbar .btn-group{display:inline-block}.btn-toolbar .btn+.btn,.btn-toolbar .btn+.btn-group,.btn-toolbar .btn-group+.btn{margin-left:5px}.btn-group>.btn{position:relative;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px}.btn-group>.btn-mini{font-size:11px}.btn-group>.btn-small{font-size:12px}.btn-group>.btn-large{font-size:16px}.btn-group>.btn:first-child{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{border-top-right-radius:4px;border-bottom-right-radius:4px}.btn-group>.btn.large:first-child{margin-left:0;border-top-left-radius:6px;border-bottom-left-radius:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{border-top-right-radius:6px;border-bottom-right-radius:6px}.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125),inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125),inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px}.btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret,.btn-mini .caret,.btn-small .caret{margin-top:6px}.btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px}.dropup .btn-large .caret{border-bottom:5px solid #000;border-top:0}.btn-danger .caret,.btn-info .caret,.btn-inverse .caret,.btn-primary .caret,.btn-success .caret,.btn-warning .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block}.btn-group-vertical .btn{display:block;float:none;width:100%;border-radius:0}.btn-group-vertical .btn+.btn{margin-left:0;margin-top:-1px}.btn-group-vertical .btn:first-child{border-radius:4px 4px 0 0}.btn-group-vertical .btn:last-child{border-radius:0 0 4px 4px}.btn-group-vertical .btn-large:first-child{border-radius:6px 6px 0 0}.btn-group-vertical .btn-large:last-child{border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,.5);background-color:#fcf8e3;border:1px solid #fbeed5;border-radius:4px;color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847}.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-left:0;margin-bottom:20px;list-style:none}.nav>li>a{display:block}.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:700;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0}.nav-list .nav-header,.nav-list>li>a{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255,255,255,.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.2);background-color:#08c}.nav-list [class^=icon-]{margin-right:2px}.nav-list .divider{height:1px;margin:9px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-pills:after,.nav-pills:before,.nav-tabs:after,.nav-tabs:before{display:table;content:"";line-height:0}.nav-pills:after,.nav-tabs:after{clear:both}.nav-pills>li,.nav-tabs>li{float:left}.nav-pills>li>a,.nav-tabs>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{border-top-right-radius:4px;border-top-left-radius:4px}.nav-tabs.nav-stacked>li:last-child>a{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{border-radius:6px}.nav .dropdown-toggle .caret{border-top-color:#08c;border-bottom-color:#08c;margin-top:6px}.nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover{cursor:pointer}.nav-pills .open .dropdown-toggle,.nav-tabs .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open.active .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1}.tabs-stacked .open>a:hover{border-color:#999}.tabbable:after,.tabbable:before{display:table;content:"";line-height:0}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-left>.nav-tabs,.tabs-right>.nav-tabs{border-bottom:0}.pill-content>.pill-pane,.tab-content>.tab-pane{display:none}.pill-content>.active,.tab-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover{text-decoration:none;background-color:transparent;cursor:default}.navbar{overflow:visible;margin-bottom:20px;color:#555}.navbar-inner{min-height:40px;padding-left:20px;padding-right:20px;background-color:#fafafa;background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f2f2f2));background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;border-radius:4px;-webkit-box-shadow:0 1px 4px rgba(0,0,0,.065);box-shadow:0 1px 4px rgba(0,0,0,.065)}.navbar .container{width:auto}.nav-collapse.collapse{height:auto}.navbar .brand{float:left;display:block;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#555;text-shadow:0 1px 0 #fff}.navbar .brand:hover{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px}.navbar-link{color:#555}.navbar-link:hover{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-left:1px solid #f2f2f2;border-right:1px solid #fff}.navbar .btn,.navbar .btn-group{margin-top:6px}.navbar .btn-group .btn{margin:0}.navbar-form{margin-bottom:0}.navbar-form:after,.navbar-form:before{display:table;content:"";line-height:0}.navbar-form:after{clear:both}.navbar-form .checkbox,.navbar-form .radio,.navbar-form input,.navbar-form select{margin-top:5px}.navbar-form .btn,.navbar-form input,.navbar-form select{display:inline-block;margin-bottom:0}.navbar-form input[type=checkbox],.navbar-form input[type=image],.navbar-form input[type=radio]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:400;line-height:1;border-radius:15px}.navbar-static-top{position:static;width:100%;margin-bottom:0}.navbar-static-top .navbar-inner{border-radius:0}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-bottom .navbar-inner,.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border:0}.navbar-fixed-bottom .navbar-inner,.navbar-fixed-top .navbar-inner{padding-left:0;padding-right:0;border-radius:0}.navbar-fixed-bottom .container,.navbar-fixed-top .container,.navbar-static-top .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.1),0 1px 10px rgba(0,0,0,.1);box-shadow:inset 0 -1px 0 rgba(0,0,0,.1),0 1px 10px rgba(0,0,0,.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:inset 0 1px 0 rgba(0,0,0,.1),0 -1px 10px rgba(0,0,0,.1);box-shadow:inset 0 1px 0 rgba(0,0,0,.1),0 -1px 10px rgba(0,0,0,.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#555;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#333;text-decoration:none}.navbar .nav>.active>a,.navbar .nav>.active>a:focus,.navbar .nav>.active>a:hover{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,.125);box-shadow:inset 0 3px 8px rgba(0,0,0,.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#ededed;background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#e5e5e5));background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075)}.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar:active,.navbar .btn-navbar:hover,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.25);box-shadow:0 1px 0 rgba(0,0,0,.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,.2);position:absolute;top:-7px;left:9px}.navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px;left:10px}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0,0,0,.2);border-bottom:0;bottom:-7px;top:auto}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #fff;border-bottom:0;bottom:-6px;top:auto}.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle,.navbar .nav li.dropdown.open>.dropdown-toggle{background-color:#e5e5e5;color:#555}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .nav>li>.dropdown-menu.pull-right,.navbar .pull-right>li>.dropdown-menu{left:auto;right:0}.navbar .nav>li>.dropdown-menu.pull-right:before,.navbar .pull-right>li>.dropdown-menu:before{left:auto;right:12px}.navbar .nav>li>.dropdown-menu.pull-right:after,.navbar .pull-right>li>.dropdown-menu:after{left:auto;right:13px}.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu,.navbar .pull-right>li>.dropdown-menu .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;border-radius:6px 0 6px 6px}.navbar-inverse{color:#999}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-o-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,left top,left bottom,from(#222),to(#111));background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:transparent;color:#fff}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:focus,.navbar-inverse .nav .active>a:hover{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .divider-vertical{border-left-color:#111;border-right-color:#222}.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open>.dropdown-toggle{background-color:#111;color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query.focused,.navbar-inverse .navbar-search .search-query:focus{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15);outline:0}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#0e0e0e;background-image:-o-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,left top,left bottom,from(#151515),to(#040404));background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25)}.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb li{display:inline-block;text-shadow:0 1px 0 #fff}.breadcrumb .divider{padding:0 5px;color:#ccc}.breadcrumb .active{color:#999}.modal-open .dropdown-menu{z-index:2050}.modal-open .popover{z-index:2060}.modal-open .tooltip{z-index:2080}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8}.modal{position:fixed;top:50%;left:50%;z-index:1050;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.3);border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,.3);box-shadow:0 3px 7px rgba(0,0,0,.3);background-clip:padding-box}.modal.fade{-webkit-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out;top:-25%}.modal.fade.in{top:50%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{overflow-y:auto;max-height:400px;padding:15px}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:after,.modal-footer:before{display:table;content:"";line-height:0}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0}.tooltip.in{opacity:.8}.tooltip.top{margin-top:-3px}.tooltip.right{margin-left:3px}.tooltip.bottom{margin-top:3px}.tooltip.left{margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#eee;text-align:center;text-decoration:none;background-color:#333;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#333}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#333}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#333}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#333}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-bottom:10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-right:10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover-content ol,.popover-content p,.popover-content ul{margin-bottom:0}.popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow:after{content:"";z-index:-1}.popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#fff}.popover.top .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0,0,0,.25);bottom:-1px;left:-11px}.popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-width:10px 10px 10px 0;border-right-color:#fff}.popover.right .arrow:after{border-width:11px 11px 11px 0;border-right-color:rgba(0,0,0,.25);bottom:-11px;left:-1px}.popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-width:0 10px 10px;border-bottom-color:#fff}.popover.bottom .arrow:after{border-width:0 11px 11px;border-bottom-color:rgba(0,0,0,.25);top:-1px;left:-11px}.popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-width:10px 0 10px 10px;border-left-color:#fff}.popover.left .arrow:after{border-width:11px 0 11px 11px;border-left-color:rgba(0,0,0,.25);bottom:-11px;right:-1px}.badge,.label{font-size:11.844px;font-weight:700;line-height:14px;color:#fff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#999}.label{padding:1px 4px 2px;border-radius:3px}.badge{padding:1px 9px 2px;border-radius:9px}a.badge:hover,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.badge-important,.label-important{background-color:#b94a48}.badge-important[href],.label-important[href]{background-color:#953b39}.badge-warning,.label-warning{background-color:#f89406}.badge-warning[href],.label-warning[href]{background-color:#c67605}.badge-success,.label-success{background-color:#468847}.badge-success[href],.label-success[href]{background-color:#356635}.badge-info,.label-info{background-color:#3a87ad}.badge-info[href],.label-info[href]{background-color:#2d6987}.badge-inverse,.label-inverse{background-color:#333}.badge-inverse[href],.label-inverse[href]{background-color:#1a1a1a}.btn .badge,.btn .label{position:relative;top:-1px}.btn-mini .badge,.btn-mini .label{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f7f7f7;background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#f9f9f9));background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);border-radius:4px}.progress .bar{width:0%;height:100%;color:#fff;float:left;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#0e90d2;background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,left top,left bottom,from(#149bdf),to(#0480be));background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.15),inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 1px 0 0 rgba(0,0,0,.15),inset 0 -1px 0 rgba(0,0,0,.15)}.progress-striped .bar{background-color:#149bdf;background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress .bar-danger,.progress-danger .bar{background-color:#dd514c;background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,left top,left bottom,from(#ee5f5b),to(#c43c35));background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress .bar-success,.progress-success .bar{background-color:#5eb95e;background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,left top,left bottom,from(#62c462),to(#57a957));background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x}.progress-striped .bar-success,.progress-success.progress-striped .bar{background-color:#62c462;background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress .bar-info,.progress-info .bar{background-color:#4bb1cf;background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#339bb9));background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress .bar-warning,.progress-warning .bar{background-color:#faa732;background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,left top,left bottom,from(#fbb450),to(#f89406));background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x}.progress-striped .bar-warning,.progress-warning.progress-striped .bar{background-color:#fbb450;background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}[class*=" icon-"],[class^=icon-]{display:inline-block;width:16px;height:16px;line-height:17px;font-size:16px;vertical-align:text-top}.btn[disabled] [class*=" icon-"],.btn[disabled] [class^=icon-],.disabled [class*=" icon-"],.disabled [class^=icon-]{color:grey}.btn[disabled] [class*=" icon-"].icon-white,.btn[disabled] [class^=icon-].icon-white,.disabled [class*=" icon-"].icon-white,.disabled [class^=icon-].icon-white{color:#fff}.icon-folder,.icon-folder-add,.icon-list{line-height:18px;font-size:18px;margin-top:-1px;margin-left:-1px;width:17px}.iconsize50{line-height:50px;font-size:50px;width:50px;height:50px}.iconsize24{line-height:24px;font-size:24px}.iconsize20{line-height:20px;font-size:20px}.icon-white,.nav>.active>a>[class*=" icon-"],.nav>.active>a>[class^=icon-]{color:#fff}.g-ui-menu .e-item:hover [class*=" icon-"],.g-ui-menu .e-item:hover [class^=icon-]{color:#fff}.icon-none{background-image:none!important}.icon-checkbox-checked,.icon-checkbox-partial,.icon-checkbox-unchecked,.icon-radio-checked,.icon-radio-unchecked{cursor:pointer;color:#555;font-size:1em}.icon-checkbox-checked:active,.icon-checkbox-checked:hover,.icon-checkbox-partial:active,.icon-checkbox-partial:hover,.icon-checkbox-unchecked:active,.icon-checkbox-unchecked:hover,.icon-radio-checked:active,.icon-radio-checked:hover,.icon-radio-unchecked:active,.icon-radio-unchecked:hover{color:#000}.icon-white.icon-checkbox-checked,.icon-white.icon-checkbox-partial,.icon-white.icon-checkbox-unchecked,.icon-white.icon-radio-checked,.icon-white.icon-radio-unchecked{color:#eee}.icon-white.icon-checkbox-checked:active,.icon-white.icon-checkbox-checked:hover,.icon-white.icon-checkbox-partial:active,.icon-white.icon-checkbox-partial:hover,.icon-white.icon-checkbox-unchecked:active,.icon-white.icon-checkbox-unchecked:hover,.icon-white.icon-radio-checked:active,.icon-white.icon-radio-checked:hover,.icon-white.icon-radio-unchecked:active,.icon-white.icon-radio-unchecked:hover{color:#fff}.iconcolor-display-none{display:none}.iconcolor-green{color:green}.iconcolor-red{color:red}.iconcolor-white{color:#fff}.iconcolor-grey{color:#aaa}.denied-by-browser{cursor:default}.denied-by-browser .icon-checkbox-checked,.denied-by-browser icon-checkbox-unchecked{cursor:default}.down-mini,.right-mini{width:16px;line-height:20px}@-webkit-keyframes rotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes rotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.icon-spinner{font-family:Arial;height:11px;width:11px;margin-right:-1px;background:0 0;border:3px solid #aaa;border-top-color:#333;border-radius:100%;-webkit-animation:none;animation:none}.icon-spinner:before{content:""}.icon-spinner.animated{border-color:transparent;border-top-color:#999;-webkit-animation:rotation .8s infinite ease-in-out;animation:rotation .8s infinite ease-in-out}.icon-spinner.big{height:13px;width:13px;margin-top:-2px;margin-left:-2px}.icon-spinner.icon-white,.icon-spinner.white{border-color:#fff;border-top-color:#999}.icon-spinner.icon-white.animated,.icon-spinner.white.animated{border-color:transparent;border-top-color:#fff}html.no-cssanimations .icon-spinner{background:0 0;background-image:url(images/sync.png);background-repeat:no-repeat;border:none;-webkit-box-shadow:none;box-shadow:none;height:16px;width:16px;font-family:Arial}html.no-cssanimations .icon-spinner:before{content:""}html.no-cssanimations .icon-spinner.animated{background:0 0;background-image:url(images/sync.gif)}body{background-color:transparent}label{cursor:pointer}label.inline,span.inline{display:inline-block}.close-custom{float:right;font-size:20px;font-weight:700;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}.close-custom:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4}button.close-custom{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.minimize-custom{border:0 solid #333;border-bottom-width:3px;display:inline-block;float:right;height:20px;width:16px;font-size:20px;font-weight:700;line-height:20px;margin-right:15px;cursor:pointer}.legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}.legend small{font-size:15px;color:#999}.legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.input-append .uneditable-input,.input-append input,.input-append select{border-radius:3px}select{width:223px}.btn .svg-icon{vertical-align:middle}.btn-small.btn-small-small{padding:3px 9px;font-size:11px;line-height:11px}.btn.btn-thin{padding:4px 9px}.btn.btn-thin-2{padding:4px 7px}.btn.btn-nowrap{white-space:nowrap}.btn.btn-ellipsis{-o-text-overflow:ellipsis;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.btn.btn-transparent{background:0 0!important;border-color:transparent!important;text-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important;opacity:.6}.btn.btn-transparent [class^=icon-]{width:19px;height:19px;line-height:20px;font-size:19px}.btn.btn-transparent:hover{opacity:1}.btn-group.open .btn.btn-transparent.dropdown-toggle{color:#bd362f}.btn-group.open .btn.btn-transparent.dropdown-toggle .caret{border-top-color:#bd362f}.btn-group.open .btn.btn-transparent.dropdown-toggle [class^=icon-]:before{color:#bd362f}.btn.btn-narrow{padding-left:12px;padding-right:12px}.btn-group.btn-group-custom-margin>.btn+.btn{margin-left:0}.btn.btn-large{font-size:17px}.dropdown-menu{border-radius:3px}.btn-group+.btn-group{margin-left:3px}.btn{border-radius:3px;background-image:none;padding-left:13px;padding-right:13px;border-color:rgba(0,0,0,.25) rgba(0,0,0,.25) rgba(0,0,0,.25)}.btn.disabled,.btn[disabled]{opacity:.8;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}html.textshadow .btn{text-shadow:0 1px 0 #fff}html.textshadow .btn.btn-danger,html.textshadow .btn.btn-primary,html.textshadow .btn.btn-success,html.textshadow .btn.btn-warning{text-shadow:0 1px 0 rgba(0,0,0,.3)}.btn.btn-dark-disabled-border.disabled,.btn.btn-dark-disabled-border[disabled]{border-color:#aaa}.btn.btn-success{background-color:#84ab04}.btn-toolbar{margin-top:0;margin-bottom:0}.dropdown-menu{border-radius:0;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.2);box-shadow:0 1px 2px rgba(0,0,0,.2)}.tooltip{font-size:14px;z-index:2000!important;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.tooltip.in{opacity:1}.tooltip .tooltip-inner{max-width:380px;text-shadow:0 0 5px rgba(0,0,0,.2);padding:5px 10px;border-radius:2px;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.tooltip .tooltip-big{font-size:18px;padding:0 10px;white-space:nowrap}.popover{width:auto;min-width:250px;max-width:550px}.popover .popover-content pre{border:none;background:rgba(0,0,0,0);padding:0;word-break:normal}.btn-group>.btn{border-radius:0!important}.btn-group>.btn.single{border-radius:3px!important}.btn-group>.btn.first{border-top-left-radius:3px!important;border-bottom-left-radius:3px!important}.btn-group>.btn.last{border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}.btn-group+.btn-group{margin-left:0}.btn-group{margin-right:3px}.btn-group.btn-group-last{margin-right:0}.dropdown.colored-toggle.open .btn.dropdown-toggle{color:#bd362f}.dropdown.colored-toggle.open .btn.dropdown-toggle .caret{border-top-color:#bd362f}.dropdown.colored-toggle.open .btn.dropdown-toggle [class^=icon-]:before{color:#bd362f}input[type=email],input[type=password],input[type=search],input[type=text],textarea{border:1px solid #ccc}input[type=email]:focus,input[type=password]:focus,input[type=search]:focus,input[type=text]:focus,textarea:focus{background-color:#fff;border:1px solid #999;-webkit-box-shadow:none;box-shadow:none}input[type=email],input[type=password],input[type=search],input[type=text]{height:20px;line-height:20px}select{border:1px solid #ccc}.alert a{text-decoration:underline}.alert.alert-null-left-margin{margin-left:0}.alert a{color:#c09853}.alert.alert-info a{color:#3a87ad}.alert.alert-error a{color:#b94a48}.nav-tabs>li>a{color:#555}.popover{z-index:2000}html.no-rgba .modal{border-width:0!important}.modal-backdrop,.modal-backdrop.fade.in{opacity:.2;-webkit-transform:none;-ms-transform:none;transform:none}.popups{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1100;overflow:auto}.popups .modal{position:static;z-index:1101;margin:5% auto;background-color:transparent;overflow:hidden;-webkit-box-shadow:0 5px 80px rgba(0,0,0,.3);box-shadow:0 5px 80px rgba(0,0,0,.3)}.popups .modal .modal-body{background-color:#fff;max-height:none}.modal.fade{-webkit-transition:none;-o-transition:none;transition:none;top:0}.modal.fade.in{top:0}.modal.loginAdminContent .modal-body,.modal.loginContent .modal-body{background-color:transparent!important}.picker.modal-dialog-bg,.picker.picker-dialog-bg{z-index:2000!important}.picker.modal-dialog,.picker.picker-dialog{z-index:2001!important}.form-horizontal.long-label .control-group .control-label{width:160px}.form-horizontal.long-label .control-group .controls{margin-left:180px}.control-label.remove-padding-top{padding-top:0}html.rl-mobile .popups .modal{width:100%!important;width:calc(100% - 20px)!important}html.rl-mobile .b-settings-content{padding:10px;padding-left:20px}html.rl-mobile .list-table{width:100%;max-width:100%}html.rl-mobile .form-horizontal .control-group .control-label{text-align:left;float:none}html.rl-mobile .form-horizontal .control-group .controls{margin-left:0}.close-input-wrp{display:inline-block;position:relative}.close-input-wrp input{padding-right:15px}.close-input-wrp .close{position:absolute;right:0;top:5px;margin:0 7px;z-index:100;vertical-align:middle;opacity:.4}.close-input-wrp .close:hover{opacity:.6}.inputosaurus-container{width:99%;line-height:20px;padding:2px;border:1px solid #ccc;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;-webkit-transition:border linear .2s,-webkit-box-shadow linear .2s;transition:border linear .2s,-webkit-box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s,-webkit-box-shadow linear .2s}.inputosaurus-container.inputosaurus-focused{background-color:#fff;border:1px solid #999;-webkit-box-shadow:none;box-shadow:none}.inputosaurus-container li{max-width:500px;background-color:#eee;border:1px solid #aaa;line-height:18px;padding:2px 15px 2px 5px;margin:2px 2px 2px;color:#555;z-index:100;position:relative}.inputosaurus-container li.ui-draggable.ui-draggable-dragging{z-index:101}.inputosaurus-container li a{color:#999;font-size:12px;position:absolute;top:1px;right:2px}.inputosaurus-container li a:hover{color:#666}.inputosaurus-container li span{padding-right:3px}.inputosaurus-container li.inputosaurus-required{padding-right:5px}.inputosaurus-container li.inputosaurus-selected{background-color:#ddd}.inputosaurus-container li.pgp{background-color:#e5f3e2}.inputosaurus-container .inputosaurus-input{margin:1px 10px 1px 0;height:22px}.inputosaurus-container .inputosaurus-input input{border:0;height:21px;padding-left:0}.ui-autocomplete{z-index:2000}.inputosaurus-fake-span{position:absolute;top:0;left:-5000px}.cke_chrome{border:1px solid #ccc!important}.cke_toolgroup{padding-right:0!important;background:#fbfbfb!important}.cke_combo_button,.cke_toolgroup{border:1px solid #a6a6a6!important}.cke_top{padding:6px 4px 1px 6px!important;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:1px solid #b6b6b6!important;background:#f0f0f0!important}.cke_combo_off a.cke_combo_button:active,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button{padding:1px!important;margin-left:0!important}.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after,.cke_toolgroup a.cke_button:last-child:after{border:none!important;height:0!important;width:0!important;margin:0!important;padding:0!important}.cke_button_on{background:#ddd!important}.cke_combo{margin-top:1px!important}.cke_combo__fontsize{margin-left:3px!important}.cke_combo__fontsize .cke_combo_text{width:40px!important}.cke_combo_text{line-height:24px!important;padding-left:8px!important}.cke_combo_button{background:#fbfbfb!important}.cke_source{font-family:Monaco,Menlo,Consolas,'Courier New',monospace!important;padding:10px!important;padding-right:0!important;-webkit-box-shadow:none!important;box-shadow:none!important}.cke_plain{background-color:#fff;outline:0;overflow:auto;z-index:1;margin:0;border:0;padding:10px;padding-right:0;white-space:pre-wrap;font-family:Monaco,Menlo,Consolas,'Courier New',monospace;font-size:13px;line-height:16px;color:#333;resize:none;border-radius:0;-webkit-box-shadow:none;box-shadow:none;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_plain:focus,.cke_source:focus{border:0}.b-compose .cke_chrome{border-right:0;border-left:0;border-bottom:0;-webkit-box-shadow:none;box-shadow:none}.cke_wysiwyg_div{padding:10px!important;font-family:arial,sans-serif;font-size:13px;line-height:16px;color:#333}.cke_wysiwyg_div ul{padding-left:40px}.cke_wysiwyg_div ul li{list-style-type:disc!important}.cke_wysiwyg_div ol{padding-left:40px}.cke_wysiwyg_div ol li{list-style-type:decimal!important}.cke_wysiwyg_div code,.cke_wysiwyg_div pre{margin:0;padding:0;background:#fff;border:none;border-radius:0;font-family:Monaco,Menlo,Consolas,'Courier New',monospace;display:block;word-break:normal;word-wrap:break-word;background-color:#f9f9f9}.cke_wysiwyg_div code{display:inline;padding:2px 5px}.cke_wysiwyg_div pre{padding:5px 10px;border-radius:5px;background-color:#f9f9f9}.cke_wysiwyg_div pre>code{padding:0}.cke_wysiwyg_div blockquote{border:0;border-left:solid 2px #444;margin:5px 0 5px 5px;padding-left:5px}.cke_wysiwyg_div blockquote p{margin:0 0 10px;font-size:14px;line-height:20px}.cke_wysiwyg_div img{vertical-align:bottom}.cke_wysiwyg_div a{color:#00f;text-decoration:underline}.cke_wysiwyg_div a:visited{color:#609}.cke_wysiwyg_div a:active{color:red}.cke_dialog a:hover{text-decoration:none}.cke_dialog .cke_dialog_ui_labeled_content{margin-top:5px;margin-bottom:5px}.cke_dialog .cke_dialog_ui_input_select,.cke_dialog .cke_dialog_ui_input_text,.cke_dialog .cke_dialog_ui_input_textarea{-webkit-box-shadow:none;box-shadow:none;border-radius:2px}.cke_dialog .cke_dialog_ui_input_select:focus,.cke_dialog .cke_dialog_ui_input_text:focus,.cke_dialog .cke_dialog_ui_input_textarea:focus{outline:0;border:1px solid #999}.cke_dialog .cke_dialog_ui_input_select,.cke_dialog .cke_dialog_ui_input_text{height:25px;line-height:25px}.g-ui-user-select-allow{webkit-touch-callout:inherit;-webkit-user-select:inherit;-moz-user-select:inherit;-ms-user-select:inherit;user-select:inherit;standard-user-select:inherit;touch-callout:inherit}.g-ui-clearfix:after,.g-ui-clearfix:before{display:table;content:"";line-height:0}.g-ui-clearfix:after{clear:both}.g-ui-link{color:#369;text-decoration:underline;cursor:pointer;padding:2px}.g-ui-link:focus{outline:1px;outline-style:dotted}.g-ui-min-height-300{min-height:300px}.g-ui-100-proc-height{height:100%}.g-ui-absolute-reset{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0}.g-ui-menu{max-height:400px;max-width:300px;overflow-y:auto;overflow-x:hidden}.g-ui-menu .e-link{text-decoration:none;cursor:pointer}.g-ui-menu .e-item.selected>.e-link{background-color:#eee!important}.g-ui-menu .e-item>.e-link:focus,.g-ui-menu .e-item>.e-link:hover{background-color:#555;background-image:none;color:#fff}.g-ui-menu .e-item.disabled>.e-link{cursor:not-allowed;background-color:#fff;background-image:none;color:grey}.g-ui-menu .e-item.disabled [class^=icon-]{color:grey}.g-ui-table{display:table;width:100%}.g-ui-table .e-row{display:table-row}.g-ui-table .e-cell{display:table-cell;vertical-align:top;text-align:left}.g-ui-height-100proc{height:100%}.g-ui-resizable-delimiter-highlight{border:none;border-right:6px solid #aaa}.e-pagenator .e-page{display:inline-block;color:#999;text-decoration:none;font-size:22px;padding:3px;cursor:pointer}.e-pagenator .e-page:hover .e-page-number{color:#555}.e-pagenator .e-page.current .e-page-number{font-size:25px;color:#333;border-bottom:2px solid #000}html.rgba .g-ui-resizable-delimiter-highlight{border-right-color:rgba(0,0,0,.2)}.settings-saved-trigger{display:inline-block;line-height:17px;font-size:16px}.settings-saved-trigger .animated{color:green}.settings-saved-trigger .success{color:green;-webkit-transition:opacity .5s linear;-o-transition:opacity .5s linear;transition:opacity .5s linear;opacity:0}.settings-saved-trigger .error{color:red;-webkit-transition:opacity .5s linear;-o-transition:opacity .5s linear;transition:opacity .5s linear;opacity:0}.settings-saved-trigger .visible{opacity:1}.settings-saved-trigger-input.success{border-color:green!important;-webkit-transition:border-color .5s linear;-o-transition:border-color .5s linear;transition:border-color .5s linear}.settings-saved-trigger-input.error{border-color:red!important;-webkit-transition:border-color .5s linear;-o-transition:border-color .5s linear;transition:border-color .5s linear}.display-none{display:none}.e-spinner{display:none}.e-mobile-switcher,.e-powered{margin-top:8px;color:#333}.e-mobile-switcher a,.e-powered a{color:#333;text-decoration:underline}.e-mobile-switcher a:hover,.e-powered a:hover{color:#333}.e-languages{margin-top:8px;color:#333}.e-languages .flag-name{color:#333;border-bottom:1px dashed #333;cursor:pointer;padding:2px 0}.e-languages .flag-name:focus{outline:1px;outline-style:dotted}html.cssanimations .e-spinner{display:block;margin:5px auto 0;width:100px;text-align:center}html.cssanimations .e-spinner .e-bounce{width:15px;height:15px;background-color:#ddd;margin:0 5px;-webkit-box-shadow:0 0 3px rgba(0,0,0,.3);box-shadow:0 0 3px rgba(0,0,0,.3);border-radius:100%;display:inline-block;-webkit-animation:bouncedelay 1.4s infinite ease-in-out;animation:bouncedelay 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}html.cssanimations .e-spinner .bounce1{-webkit-animation-delay:-.32s;animation-delay:-.32s}html.cssanimations .e-spinner .bounce2{-webkit-animation-delay:-.16s;animation-delay:-.16s}@-webkit-keyframes bouncedelay{0%,100%,80%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes bouncedelay{0%,100%,80%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.command.command-disabled.hide-on-disabled-command{display:none}html{margin:0;padding:0;overflow:hidden;font-family:Arial,Verdana,Geneva,sans-serif;height:100%}body{margin:0;padding:0;overflow:hidden;background-color:#e3e3e3;font-family:Arial,Verdana,Geneva,sans-serif;-webkit-touch-callout:none;position:absolute;top:0;left:0;bottom:0;right:0;height:100%}textarea{resize:none}option:disabled{color:#aaa;cursor:not-allowed}body:before{content:"";position:fixed;top:-10px;left:0;width:100%;height:8px;z-index:100;-webkit-box-shadow:0 0 10px rgba(0,0,0,.6);box-shadow:0 0 10px rgba(0,0,0,.6)}*{outline:0}select:focus{outline:0}html.mobile *,html.rl-mobile *{-webkit-tap-highlight-color:transparent}input[type=search]{-webkit-box-sizing:content-box;box-sizing:content-box}input::-ms-clear,input::-ms-reveal{display:none}#rl-bg{z-index:-1;position:absolute;left:0;right:0;top:0;bottom:0}#rl-content{height:100%;width:100%}#rl-center{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0;min-width:600px;min-height:400px}html.rl-mobile #rl-center{min-width:250px;min-height:250px}html.rl-mobile.rl-left-panel-enabled #rl-right{right:-150px}html.rl-mobile.rl-left-panel-disabled #rl-right{left:5px!important}#rl-top{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0;bottom:auto;z-index:2}#rl-bottom{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0;top:auto;z-index:1}#rl-left{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0;width:200px;min-width:60px}#rl-right{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0;z-index:1;left:200px}#rl-sub-left{position:absolute;top:0;bottom:0;left:0;width:500px}#rl-sub-right{position:absolute;top:0;bottom:0;right:0;left:500px}#rl-sub-right .b-message-view-backdrop{position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.4);z-index:10}#rl-sub-right .b-message-view-backdrop .backdrop-message-wrp{position:absolute;top:calc(50% - 50px);left:0;right:0;text-align:center}#rl-sub-right .b-message-view-backdrop .backdrop-message-wrp .backdrop-message{display:inline-block;color:#fff;font-size:20px;line-height:30px;background:rgba(0,0,0,.6);padding:15px;border-radius:5px;text-shadow:0 1px 1px #000}html.ssm-state-desktop-large #rl-left{width:220px}html.ssm-state-desktop-large #rl-right{left:220px}html.ssm-state-desktop-large #rl-sub-left{width:500px}html.ssm-state-desktop-large #rl-sub-right{left:500px}html.ssm-state-desktop-large .b-compose.modal{width:1000px}html.ssm-state-desktop-large .b-contacts-content.modal{width:900px}html.ssm-state-desktop #rl-left{width:200px}html.ssm-state-desktop #rl-right{left:200px}html.ssm-state-desktop #rl-sub-left{width:400px}html.ssm-state-desktop #rl-sub-right{left:400px}html.ssm-state-desktop .b-compose.modal{width:1000px}html.ssm-state-desktop .b-contacts-content.modal{width:900px}html.ssm-state-mobile #rl-left,html.ssm-state-tablet #rl-left{width:155px}html.ssm-state-mobile #rl-right,html.ssm-state-tablet #rl-right{left:155px}html.ssm-state-mobile #rl-sub-left,html.ssm-state-tablet #rl-sub-left{width:310px}html.ssm-state-mobile #rl-sub-left .messageList .inputSearch,html.ssm-state-tablet #rl-sub-left .messageList .inputSearch{width:200px}html.ssm-state-mobile #rl-sub-right,html.ssm-state-tablet #rl-sub-right{left:310px}html.ssm-state-mobile .b-compose.modal,html.ssm-state-tablet .b-compose.modal{width:720px}html.ssm-state-mobile .b-contacts-content.modal,html.ssm-state-tablet .b-contacts-content.modal{width:700px}html.ssm-state-mobile .b-contacts-content.modal .contactValueInput,html.ssm-state-tablet .b-contacts-content.modal .contactValueInput{width:200px}html.ssm-state-tablet .b-compose.modal{width:720px}html.ssm-state-tablet .b-contacts-content.modal{width:800px}html.ssm-state-tablet .b-contacts-content.modal .contactValueInput{width:250px}.show-on-panel-disabled{display:none}html.rl-left-panel-disabled #rl-left{width:60px!important}html.rl-left-panel-disabled #rl-left .show-on-panel-disabled{display:block}html.rl-left-panel-disabled #rl-left .opacity-on-panel-disabled{opacity:.3}html.rl-left-panel-disabled #rl-left .visibility-hidden-on-panel-disabled{visibility:hidden}html.rl-left-panel-disabled #rl-left .hide-on-panel-disabled{display:none}html.rl-left-panel-disabled #rl-left.ui-state-disabled{opacity:1}html.rl-left-panel-disabled #rl-right{left:60px!important}html.rl-left-panel-short #rl-left{width:60px!important}html.rl-left-panel-short #rl-right{left:60px!important}html.rl-left-panel-none #rl-left{width:10px!important}html.rl-left-panel-none #rl-right{left:10px!important}.ui-resizable-helper-w{border-right:5px solid #777;border-right-color:rgba(255,255,255,.7)}.ui-resizable-helper-h{border-bottom:5px solid #ccc;border-bottom-color:rgba(0,0,0,.3)}.ui-resizable-handle:hover{background:#aaa;background:rgba(255,255,255,.5)}html.rl-no-preview-pane #rl-sub-left{right:5px!important;width:inherit}html.rl-no-preview-pane #rl-sub-left .messageList .inputSearch{width:300px!important}html.rl-no-preview-pane #rl-sub-right{left:0!important}html.rl-no-preview-pane #rl-right .ui-resizable-handle{display:none!important}html.rl-side-preview-pane #rl-right .ui-resizable-handle{display:none!important}html.rl-bottom-preview-pane #rl-sub-left{right:5px!important;width:inherit}html.rl-bottom-preview-pane #rl-sub-left .b-message-list-wrapper{bottom:inherit;height:300px;-webkit-box-shadow:none;box-shadow:none}html.rl-bottom-preview-pane #rl-sub-left .messageList .inputSearch{width:300px!important}html.rl-bottom-preview-pane #rl-sub-right{left:0!important}html.rl-bottom-preview-pane #rl-sub-right .messageView .top-toolbar{display:none}html.rl-bottom-preview-pane #rl-sub-right .b-message-view-wrapper{top:356px;left:0;right:5px;-webkit-box-shadow:none;box-shadow:none}.visible-on-ctrl,.visible-on-ctrl-btn{display:none}.hidden-on-ctrl-btn{display:inline-block}html.rl-ctrl-key-pressed .visible-on-ctrl{display:inline-block}html.rl-ctrl-key-pressed .btn-group.open .visible-on-ctrl-btn{display:inline-block}html.rl-ctrl-key-pressed .hidden-on-ctrl{display:none}html.rl-ctrl-key-pressed .btn-group.open .hidden-on-ctrl-btn{display:none}#rl-loading,#rl-loading-error{position:absolute;font-size:30px;line-height:130%;top:50%;width:100%;height:65px;margin:0;margin-top:-60px;background-color:transparent;text-align:center;color:#000}#rl-loading-error{background-image:none;display:none}#rl-loading-error-additional{margin-top:20px;font-size:20px}#rl-app{display:none}#rl-check{display:none}.rl-content-show{display:block!important}html.rl-mobile .hide-on-mobile{display:none!important}.show-on-mobile{display:none!important}html.rl-mobile .show-on-mobile{display:initial!important}html.rl-mobile .width100-on-mobile{width:100%!important}.nano.scroller-shadow-bottom:after,.nano.scroller-shadow-top:before{content:"";position:absolute;left:0;width:100%;height:10px;z-index:102;-webkit-box-shadow:0 0 20px rgba(0,0,0,.4);box-shadow:0 0 20px rgba(0,0,0,.4)}.nano.scroller-shadow-top:before{top:-10px}.nano.scroller-shadow-bottom:after{bottom:-10px}.nano.fixIndex.scroller-shadow-bottom:after,.nano.fixIndex.scroller-shadow-top:before{z-index:98}.e-component.e-select select:focus{outline:1px;outline-style:dotted}.e-component.e-checkbox{margin-bottom:6px;margin-left:-2px;padding:2px;cursor:pointer}.e-component.e-checkbox:focus{outline:1px;outline-style:dotted}.e-component.e-checkbox .e-checkbox-icon{padding:1px 0 0 1px}.e-component.e-checkbox.disabled{cursor:default;color:#999;outline:0;outline-style:none}.e-component.e-radio{cursor:pointer}.e-component.e-radio.disabled{cursor:default;color:#999}.e-component.material-design.e-checkbox{margin-top:2px;padding:2px 2px 1px 2px}.e-component.material-design.e-checkbox .sub-checkbox-container{display:inline-block;position:relative;-webkit-transform:translateZ(0);transform:translateZ(0);width:18px;height:18px;vertical-align:bottom;margin-bottom:3px}.e-component.material-design.e-checkbox .sub-label{padding-left:12px}.e-component.material-design.e-checkbox .sub-checkbox{position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;margin-top:1px;top:0;left:0;width:18px;height:18px;border:solid 2px #999;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}.e-component.material-design.e-checkbox .sub-checkbox.checked{border-top:none;border-left:none;border-color:#0f9d58;top:-1px;left:5px;width:10px;height:18px;border-right-width:2px;border-bottom-width:2px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.e-component.material-design.e-checkbox .sub-checkbox.checked.box{border:solid 2px;-webkit-animation:box-shrink 140ms ease-out forwards;animation:box-shrink 140ms ease-out forwards}.e-component.material-design.e-checkbox .sub-checkbox.checked.checkmark{border-left:none;border-top:none;-webkit-animation:checkmark-expand 140ms ease-out forwards;animation:checkmark-expand 140ms ease-out forwards}.e-component.material-design.e-checkbox .sub-checkbox.unchecked.box{-webkit-animation:box-expand 140ms ease-out forwards;animation:box-expand 140ms ease-out forwards}.e-component.material-design.e-checkbox .sub-checkbox.unchecked.checkmark{border-left:none;border-top:none;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);-webkit-animation:checkmark-shrink 140ms ease-out forwards;animation:checkmark-shrink 140ms ease-out forwards}.e-component.material-design.e-checkbox.disabled .sub-checkbox{border-color:#aaa;cursor:not-allowed;color:#aaa}.e-component.material-design.e-checkbox.disabled .sub-label{cursor:not-allowed;color:#aaa}@-webkit-keyframes box-shrink{0%{top:0;left:0;width:18px;height:18px;border:solid 2px #999;-webkit-transform:rotate(0);transform:rotate(0)}100%{top:13px;left:5px;width:4px;height:4px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}}@keyframes box-shrink{0%{top:0;left:0;width:18px;height:18px;border:solid 2px #999;-webkit-transform:rotate(0);transform:rotate(0)}100%{top:13px;left:5px;width:4px;height:4px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}}@-webkit-keyframes checkmark-expand{0%{top:13px;left:5px;width:4px;height:4px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}100%{top:-1px;left:5px;width:10px;height:18px;border-right-width:2px;border-bottom-width:2px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}}@keyframes checkmark-expand{0%{top:13px;left:5px;width:4px;height:4px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}100%{top:-1px;left:5px;width:10px;height:18px;border-right-width:2px;border-bottom-width:2px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}}@-webkit-keyframes checkmark-shrink{0%{top:-1px;left:5px;width:10px;height:18px;border-right-width:2px;border-bottom-width:2px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}100%{top:13px;left:5px;width:4px;height:4px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}}@keyframes checkmark-shrink{0%{top:-1px;left:5px;width:10px;height:18px;border-right-width:2px;border-bottom-width:2px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}100%{top:13px;left:5px;width:4px;height:4px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}}@-webkit-keyframes box-expand{0%{top:13px;left:5px;width:4px;height:4px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}100%{top:0;left:0;width:18px;height:18px;border:solid 2px #999;-webkit-transform:rotate(0);transform:rotate(0)}}@keyframes box-expand{0%{top:13px;left:5px;width:4px;height:4px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}100%{top:0;left:0;width:18px;height:18px;border:solid 2px #999;-webkit-transform:rotate(0);transform:rotate(0)}}.b-system-drop-down .b-toolbar{position:absolute;top:0;right:0;height:30px;padding:10px 8px;z-index:103}.b-system-drop-down .e-facebook-name{display:inline-block;padding-top:4px}.b-system-drop-down .btn.system-dropdown{padding-left:10px;padding-right:10px}.b-system-drop-down .button-fb-logout{margin:5px}.b-system-drop-down .email-title{display:inline-block;max-width:200px;text-align:left;-o-text-overflow:ellipsis;text-overflow:ellipsis;overflow:hidden;margin-right:28px;vertical-align:middle}.b-system-drop-down .logoPlace{margin:-5px 10px 0 0;font-size:25px;line-height:30px;height:40px}.b-system-drop-down .audioPlace{font-size:25px;line-height:30px;margin-right:10px;width:25px}.b-system-drop-down .audioPlace .playIcon,.b-system-drop-down .audioPlace .stopIcon{cursor:pointer;color:orange;text-shadow:0 1px 0 #555;float:right}.b-system-drop-down .audioPlace .playIcon{margin-top:5px}.b-system-drop-down .audioPlace .stopIcon{font-size:30px;line-height:30px;margin-right:10px}.b-system-drop-down .audioPlace .stopIcon{display:none}.b-system-drop-down .audioPlace:hover .playIcon{display:none}.b-system-drop-down .audioPlace:hover .stopIcon{display:inline-block}.b-system-drop-down .accountPlace{background-color:#000;background-color:rgba(0,0,0,.5);color:#fff;text-shadow:0 1px 0 #000;display:inline-block;height:29px;max-width:250px;font-size:16px;line-height:30px;padding:1px 8px;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;border-radius:4px;font-weight:700;margin-right:5px;white-space:nowrap}.b-system-drop-down .account-item .icon-ok{display:none}.b-system-drop-down .account-item.current .icon-ok{display:inline-block}.b-system-drop-down .account-item.current .icon-user{display:none}.b-system-drop-down .counter{display:inline-block}.b-system-drop-down .g-ui-menu .e-link.account-item{padding-right:5px}html.ssm-state-mobile .accountPlace{max-width:150px!important}@-webkit-keyframes firstBar{0%{height:30%}50%{height:100%}100%{height:30%}}@keyframes firstBar{0%{height:30%}50%{height:100%}100%{height:30%}}@-webkit-keyframes secondBar{0%{height:90%}50%{height:30%}100%{height:100%}}@keyframes secondBar{0%{height:90%}50%{height:30%}100%{height:100%}}@-webkit-keyframes thirdBar{0%{height:20%}40%{height:40%}60%{height:80%}100%{height:40%}}@keyframes thirdBar{0%{height:20%}40%{height:40%}60%{height:80%}100%{height:40%}}.equaliser{width:20px;height:20px;position:relative}.equaliser .bar{float:left;width:5px;height:5px;background:orange;position:absolute;bottom:0}.equaliser .first{left:0;-webkit-animation:none;animation:none}.equaliser .second{left:7px;-webkit-animation:none;animation:none}.equaliser .third{left:14px;-webkit-animation:none;animation:none}.equaliser.animated .first{-webkit-animation:firstBar 1s infinite;animation:firstBar 1s infinite}.equaliser.animated .second{-webkit-animation:secondBar 1s infinite;animation:secondBar 1s infinite}.equaliser.animated .third{-webkit-animation:thirdBar 1s infinite;animation:thirdBar 1s infinite}.b-login-content{height:100%;text-align:center}.b-login-content .loginFormWrapper{display:inline-block;vertical-align:middle;text-align:center;-webkit-perspective:500px;perspective:500px}.b-login-content .loginFormWrapper .descWrapper{margin-bottom:10px}.b-login-content .loginFormWrapper .descWrapper .desc{font-size:18px;padding:2px}.b-login-content .loginFormWrapper .alertError{max-width:450px}.b-login-content .loginFormWrapper .loginForm{background-color:#efefef;text-align:left;color:#333;margin:0;float:none;width:303px}.b-login-content .loginFormWrapper .loginWelcomeForm{display:none}.b-login-content .loginFormWrapper .welcome-on{display:block}.b-login-content .loginFormWrapper .welcome-off{display:none}.b-login-content .loginFormWrapper .control-group,.b-login-content .loginFormWrapper .controls{margin-bottom:25px}.b-login-content .loginFormWrapper .wrapper{padding:40px 40px 20px 40px}.b-login-content .loginFormWrapper #recaptcha_image img{border:1px solid #ccc;border-radius:3px}.b-login-content .loginFormWrapper .controls .inputAdditionalCode,.b-login-content .loginFormWrapper .controls .inputEmail,.b-login-content .loginFormWrapper .controls .inputLogin,.b-login-content .loginFormWrapper .controls .inputLoginForm,.b-login-content .loginFormWrapper .controls .inputPassword{font-size:18px;height:40px;line-height:20px;padding-left:12px;padding-right:12px}.b-login-content .loginFormWrapper .languageLabel{margin-top:5px}.b-login-content .loginFormWrapper .signMeLabel .e-checkbox{margin-top:5px}.b-login-content .loginFormWrapper .languageLabel{margin-right:5px}.b-login-content .loginFormWrapper .input-append .add-on{position:relative;height:30px;background:0 0;margin-left:-35px;z-index:1000;border:0}.b-login-content .loginFormWrapper .input-append .add-on i{font-size:17px;line-height:29px;color:#999}.b-login-content .loginFormWrapper .input-append .add-on i.login-submit-icon{font-size:24px;padding-top:2px;cursor:pointer}.b-login-content .loginFormWrapper .control-group.error .add-on i,.b-login-content .loginFormWrapper .controls.error .add-on i{color:#b94a48}.b-login-content .buttonLogin{margin:0}.b-login-content .alert{margin:0 0 20px 0;text-align:left}.b-login-content .loginAfter{display:inline-block;height:90%;vertical-align:middle;width:0}.b-login-content .flag-selector{margin-bottom:0}.b-login-content .social-buttons{margin-top:5px}.b-login-content .language-button,.b-login-content .social-button{padding:5px;outline:0}@-webkit-keyframes loginRotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes loginRotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.submitting-pane{position:relative}.submitting-pane.submitting:before{content:'';position:absolute;top:0;left:0;right:0;bottom:0;background:0 0;background:rgba(0,0,0,.3);z-index:1051;border-radius:8px}html.cssanimations .submitting-pane.submitting:after{content:'';position:absolute;width:60px;height:60px;top:50%;left:50%;margin-top:-30px;margin-left:-30px;border:8px solid transparent;border-color:transparent;border-top-color:#fff;-webkit-animation:loginRotation 1s infinite ease-in-out;animation:loginRotation 1s infinite ease-in-out;border-radius:50%;z-index:1052}.btn-submit-icon-wrp{border:none;background:0 0;display:inline-block;margin:0;padding:0;outline:0;cursor:pointer}.popups .b-welcom-page-content .modal-header{background-color:#fff}.popups .b-ask-content .modal-header{background-color:#fff}.popups .b-ask-content .modal-body{text-align:center}.popups .b-ask-content .desc-place{font-size:18px}.popups .b-shortcuts-content.modal{width:700px}.popups .b-shortcuts-content .modal-header{background-color:#fff}.b-folders .move-action-content-wrapper{z-index:-1;position:fixed;top:0;bottom:0;left:0;right:0;opacity:.05;background-color:#fff;background-size:60px 60px;background-image:-o-linear-gradient(315deg,#000 25%,transparent 25%,transparent 50%,#000 50%,#000 75%,transparent 75%,transparent);background-image:linear-gradient(135deg,#000 25%,transparent 25%,transparent 50%,#000 50%,#000 75%,transparent 75%,transparent)}.b-folders .b-folders-user .e-link.print-count.system .badge{display:none!important}.b-folders .b-toolbar{position:absolute;top:0;right:0;left:0;height:30px;padding:10px 0 0 8px;color:#fff;z-index:101}.b-folders .b-footer{position:absolute;bottom:10px;right:0;left:0;height:30px;padding:0 10px 0 5px;z-index:101;overflow:hidden;white-space:nowrap}.b-folders .b-content{position:absolute;top:58px;bottom:45px;left:0;right:0;overflow:hidden;overflow-y:auto;min-width:100px}.b-folders .b-content .content{-webkit-overflow-scrolling:touch}.b-folders .b-list-delimiter{margin:10px;border-top:0 solid #000;border-bottom:1px solid #999}.b-folders .b-content .e-item{overflow:hidden;white-space:nowrap}.b-folders .b-content .e-item .e-link{display:block;position:relative;z-index:1;height:34px;line-height:34px;background-color:transparent;vertical-align:middle;color:grey;cursor:not-allowed;font-size:14px;padding:0;padding-left:10px;padding-right:10px;outline:0;text-decoration:none}.b-folders .b-content .e-item .e-link .focused-poiner{float:left;display:inline-block;background-color:transparent;height:100%;width:3px;position:absolute;top:0;left:0}.b-folders .b-content .e-item .e-link .inbox-star-icon{display:none;margin-left:7px}.b-folders .b-content .e-item .e-link .inbox-star-icon .icon-star{display:none}.b-folders .b-content .e-item .e-link .inbox-star-icon .icon-star-empty{opacity:.5}.b-folders .b-content .e-item .e-link .inbox-star-icon .icon-star-empty:hover{opacity:1}.b-folders .b-content .e-item .e-link.is-inbox .inbox-star-icon{display:inline}.b-folders .b-content .e-item .e-link.selectable{color:#000;cursor:pointer}.b-folders .b-content .e-item .e-link.selectable.droppableHover,.b-folders .b-content .e-item .e-link.selectable.focused,.b-folders .b-content .e-item .e-link.selectable.selected,.b-folders .b-content .e-item .e-link.selectable:hover{background-color:#555;color:#fff}.b-folders .b-content .e-item .e-link.selectable.focused{color:#fff}.b-folders .b-content .e-item .e-link.focused{background-color:#888}.b-folders .b-content .e-item .e-link.focused .focused-poiner{background-color:#fff}.b-folders .b-content .e-item .e-link.system{cursor:default;color:grey}.b-folders .b-content .e-item .e-link .count{position:relative;display:none;margin-top:5px;line-height:19px}.b-folders .b-content .e-item .e-link.print-count{font-weight:700}.b-folders .b-content .e-item .e-link.print-count .count{display:inline}.b-folders .b-content .e-item .e-link.unread-sub{font-weight:700}.b-folders .b-content .e-item .e-link .e-collapsed-sign{cursor:pointer;width:22px;height:30px;line-height:30px;text-align:center;vertical-align:inherit}.b-folders .b-content .e-item .hidden.e-link{display:none}.b-folders .b-content .e-item .b-sub-folders.collapsed{max-height:0;height:0;display:none}.b-folders.inbox-is-starred .icon-star{color:orange;display:inline-block!important}.b-folders.inbox-is-starred .icon-star-empty{display:none}.b-folders .b-folder-system-item{font-weight:700}.b-folders .b-sub-folders .e-item .e-link{padding-left:25px}.b-folders .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:40px}.b-folders .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:55px}.b-folders .b-sub-folders .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:70px}.b-folders.single-root-inbox .i-am-inbox.e-link{display:none!important}.b-folders.single-root-inbox .i-am-inbox-wrapper>.b-sub-folders{max-height:none!important;height:inherit!important;display:block!important}.b-folders.single-root-inbox .i-am-inbox-wrapper .b-sub-folders .e-item .e-link{padding-left:10px}.b-folders.single-root-inbox .i-am-inbox-wrapper .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:25px}.b-folders.single-root-inbox .i-am-inbox-wrapper .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:40px}.b-folders.single-root-inbox .i-am-inbox-wrapper .b-sub-folders .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:55px}.btn .btn-text-wrp{padding-left:7px;white-space:normal}.btn.buttonCompose{width:calc(100% - 85px);max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;white-space:nowrap;overflow:hidden;height:19px;display:inline-block;margin-top:1px}html.rl-left-panel-disabled .buttonComposeText,html.rl-left-panel-short .buttonComposeText{display:none}html.rl-left-panel-disabled .btn.buttonCompose,html.rl-left-panel-short .btn.buttonCompose{width:auto}html.rl-left-panel-disabled .btn.buttonContacts,html.rl-left-panel-short .btn.buttonContacts{margin-top:10px!important;margin-left:0!important}html.rl-left-panel-disabled.rl-mobile #rl-left,html.rl-left-panel-short.rl-mobile #rl-left{visibility:hidden}html.rl-mobile .btn.buttonCompose{width:100%}html.rl-mobile .btn.buttonContacts{display:none}.popups .b-folder-clear-content .modal-header{background-color:#fff}.popups .b-folder-create-content .modal-header{background-color:#fff}.popups .b-folder-system-content .modal-header{background-color:#fff}.popups .b-filter-content{width:750px}.popups .b-filter-content .modal-header{background-color:#fff}.popups .b-filter-content .button-delete{cursor:pointer}.popups .b-filter-content .setRecipientsBtn{margin-top:-2px;margin-left:5px}.popups .b-languages-content.modal{width:700px}.popups .b-languages-content.exp{width:701px}.popups .b-languages-content .modal-header{background-color:#fff}.popups .b-languages-content .lang-item{display:inline-block;padding:5px 15px;margin:2px 5px;width:180px;background-color:#fff;text-align:left;border:1px solid transparent;border-radius:2px}.popups .b-languages-content .lang-item.user{background-color:#fffddd;border-color:#fff555}.popups .b-languages-content .lang-item.selected{background-color:#f5f5f5;border-color:#ccc}.popups .b-languages-content .lang-item:hover{background-color:#eee;border-color:#ccc}html.rl-mobile .b-languages-content .lang-item{width:calc(100% - 40px)}.popups .b-account-add-content .modal-header{background-color:#fff}.popups .b-template-add-content.modal{width:750px}.popups .b-template-add-content .modal-header{background-color:#fff}.popups .b-template-add-content .e-template-place{height:300px}.popups .b-compose-open-pgp-content .modal-header,.popups .b-message-open-pgp-content .modal-header,.popups .b-open-pgp-key-add-content .modal-header,.popups .b-open-pgp-key-generate-content .modal-header,.popups .b-open-pgp-key-view-content .modal-header{background-color:#fff}.popups .b-compose-open-pgp-content.modal,.popups .b-message-open-pgp-content.modal,.popups .b-open-pgp-key-add-content.modal,.popups .b-open-pgp-key-generate-content.modal,.popups .b-open-pgp-key-view-content.modal{width:570px}.popups .b-compose-open-pgp-content .inputKey,.popups .b-message-open-pgp-content .inputKey,.popups .b-open-pgp-key-add-content .inputKey,.popups .b-open-pgp-key-generate-content .inputKey,.popups .b-open-pgp-key-view-content .inputKey{font-family:Monaco,Menlo,Consolas,"Courier New",monospace}.popups .b-compose-open-pgp-content .key-viewer,.popups .b-message-open-pgp-content .key-viewer,.popups .b-open-pgp-key-add-content .key-viewer,.popups .b-open-pgp-key-generate-content .key-viewer,.popups .b-open-pgp-key-view-content .key-viewer{max-height:500px;overflow:auto}.popups .b-compose-open-pgp-content.modal{width:800px}.popups .b-compose-open-pgp-content .key-list{background-color:#f9f9f9;border-radius:5px;padding:10px 15px;margin-top:10px;min-height:40px}.popups .b-compose-open-pgp-content .key-list-wrp:hover{overflow:auto}.popups .b-compose-open-pgp-content .key-list-wrp:hover .key-list__item-name{overflow:visible}.popups .b-compose-open-pgp-content .key-list-wrp.empty{text-align:center;padding-top:10px;color:#aaa;font-size:16px}.popups .b-compose-open-pgp-content .key-list__item{color:#333;white-space:nowrap;padding-bottom:4px}.popups .b-compose-open-pgp-content .key-list__item:last-child{padding-bottom:0}.popups .b-compose-open-pgp-content .key-list__item-delete{cursor:pointer}.popups .b-compose-open-pgp-content .key-list__item-delete.disabled{cursor:not-allowed}.popups .b-compose-open-pgp-content .key-list__item-names{color:#333}.popups .b-compose-open-pgp-content .key-list__item-names.empty{color:red}.popups .b-compose-open-pgp-content .key-list__item-name{overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.popups .b-compose-open-pgp-content .key-list__item-error{color:red}.popups .b-compose-open-pgp-content .key-list__item-hash{color:#aaa}.popups .b-compose-open-pgp-content .key-actions{margin-top:10px;min-height:40px}.popups .b-compose-open-pgp-content .key-actions select option.even{background-color:#f5f5f5}.popups .b-message-open-pgp-content.modal{width:700px}.popups .b-message-open-pgp-content .key-list{margin-top:5px;overflow:hidden}.popups .b-message-open-pgp-content .key-list__item{color:#555;cursor:pointer;-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap}.popups .b-message-open-pgp-content .key-list__item__radio{padding:3px 5px 0 0;vertical-align:top}.popups .b-message-open-pgp-content .key-list__item__name{border-bottom:1px solid transparent}.popups .b-message-open-pgp-content .key-list__item__names{display:inline-block}.popups .b-message-open-pgp-content .key-list__item__names:hover .key-list__item__name{border-bottom:1px dashed #555}.popups .b-open-pgp-key-add-content.modal{width:645px}.popups .b-open-pgp-key-add-content.modal .inputKey{width:600px}.popups .b-two-factor-content{width:750px}.popups .b-two-factor-content .modal-body{min-height:100px}.popups .b-two-factor-content .modal-header{background-color:#fff}.popups .b-two-factor-test-content .modal-header{background-color:#fff}.popups .b-identity-content.modal{width:750px}.popups .b-identity-content .modal-header{background-color:#fff}.popups .b-identity-content .modal-body{overflow:hidden}.popups .b-identity-content .control-label{width:100px}.popups .b-identity-content .controls{margin-left:120px}.popups .b-identity-content .e-signature-place{height:200px}.popups .b-identity-content .textEmail{margin-top:5px;font-weight:700}.popups .b-advanced-search-content.modal{width:750px}.popups .b-advanced-search-content.modal .control-label{width:100px}.popups .b-advanced-search-content.modal .controls{margin-left:110px}.popups .b-advanced-search-content .modal-header{background-color:#fff}.attachmentItem{position:relative;display:inline-block;margin:5px;max-width:200px;min-width:60px;overflow:hidden;list-style:none;line-height:24px;border:0;background-color:#fff;-webkit-box-shadow:0 1px 4px #ccc;box-shadow:0 1px 4px #ccc;-webkit-box-shadow:0 1px 5px rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.2);-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.04),0 1px 5px rgba(0,0,0,.1);box-shadow:0 0 0 1px rgba(0,0,0,.04),0 1px 5px rgba(0,0,0,.1);border-radius:3px}.attachmentItem.waiting{opacity:.6}.attachmentItem.checked{-webkit-box-shadow:0 1px 4px #00a;box-shadow:0 1px 4px #00a;-webkit-box-shadow:0 1px 5px rgba(0,0,255,.3);box-shadow:0 1px 5px rgba(0,0,255,.3);-webkit-box-shadow:0 0 0 1px rgba(0,0,255,.1),0 1px 5px rgba(0,0,255,.2);box-shadow:0 0 0 1px rgba(0,0,255,.1),0 1px 5px rgba(0,0,255,.2)}.attachmentItem .checkedParent{position:absolute;top:0;right:0;padding:1px 4px 0 5px;background:#fafafa;border:0 solid #ccc}.attachmentItem .attachmentSize{font-size:12px;color:#999}.attachmentItem.error .attachmentIcon,.attachmentItem.error .attachmentName,.attachmentItem.error .attachmentSize{color:red}.attachmentItem .attachmentIconParent{position:relative;height:56px;width:60px;background:0 0}.attachmentItem .attachmentIconParent .iconBG,.attachmentItem .attachmentIconParent .iconMain,.attachmentItem .attachmentIconParent .iconPreview,.attachmentItem .attachmentIconParent .iconProgress{position:absolute;top:0;left:0;display:inline-block;width:100%;height:100%}.attachmentItem .attachmentIconParent .iconProgress{background:#eee;width:0%}.attachmentItem .attachmentIconParent .iconBG{font-size:18px;text-align:center;color:#999;font-weight:700;line-height:55px;text-shadow:0 1px 0 #fff;text-shadow:0 1px 0 rgba(255,255,255,.8)}.attachmentItem .attachmentIconParent .iconPreview{display:none;background:#555;background-image:none;background:rgba(0,0,0,.5)!important}.attachmentItem .attachmentIconParent .iconPreview .attachmentIcon{color:#fff;text-shadow:0 1px 0 #000}.attachmentItem .attachmentNameParent{position:relative;margin-left:60px;padding:4px 4px 3px 6px;min-width:90px;cursor:pointer;color:#333;background:#fafafa;border-left:1px solid #ddd}.attachmentItem .attachmentIcon{margin:6px 0 0 13px;font-size:36px;width:36px;height:36px;color:#aaa}.attachmentItem .attachmentIcon.icon-none{display:none}.attachmentItem .attachmentIcon.icon-file-certificate{margin-left:15px}.attachmentItem .attachmentIconText{display:inline-block;font-size:28px;width:60px;height:56px;color:#aaa;line-height:56px;text-align:center;font-style:normal}.attachmentItem .attachmentIconParent.hasPreview:hover .iconPreview{display:inline-block}.attachmentItem .attachmentIconParent.hasPreview:hover .iconMain{display:none}.attachmentItem .attachmentIconParent.hasPreplay:hover .iconPreview{display:inline-block}.attachmentItem .attachmentIconParent.hasPreplay:hover .iconMain{display:none}.attachmentItem .showPreplay,.attachmentItem .showPreview{display:none;cursor:pointer}.attachmentItem .attachmentIconParent.hasPreview .showPreview{display:inline}.attachmentItem .attachmentIconParent.hasPreview .hidePreview{display:none}.attachmentItem .attachmentIconParent.hasPreplay .showPreplay{display:inline}.attachmentItem .attachmentIconParent.hasPreplay .hidePreview{display:none}html.rl-no-preview-pane .messageList.message-selected{display:none}.messageList .toolbar{position:absolute;top:0;right:0;left:0;height:30px;padding:10px 1px;z-index:102;white-space:nowrap}.messageList .b-footer{position:absolute;bottom:0;right:0;left:0;height:30px;padding:7px;z-index:101;background-color:#eee;border-bottom-right-radius:5px;border-bottom-left-radius:5px}.messageList .b-footer .e-quota{display:inline-block;margin-top:5px;margin-left:5px;font-size:18px;cursor:help}.messageList .b-footer .e-quota:hover{border-bottom:1px dashed #333}.messageList .inputSearch{width:258px}.messageList .btn.buttonMoreSearch{padding-left:8px;padding-right:8px}.messageList .b-message-list-wrapper{position:absolute;top:50px;right:0;left:0;bottom:5px;border:1px solid #aaa;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.2);box-shadow:0 2px 8px rgba(0,0,0,.2);border-radius:5px;z-index:101}.messageList .second-toolbar{position:absolute;top:0;right:0;left:0;height:29px;padding:10px 8px 10px 11px;z-index:101;white-space:nowrap;background-color:#eee;border-top-right-radius:5px;border-top-left-radius:5px}.messageList .second-toolbar .checkboxCkeckAll{margin:5px 0}.messageList .line-loading{position:absolute;left:0;right:0;z-index:102;height:0;top:50px}.messageList .mainDelimiter{position:absolute;left:0;right:0;height:1px;z-index:101;background-color:#bbb}.messageList .toolbarDelimiter{top:49px}.messageList .footerDelimiter{bottom:44px}.messageList .b-content{position:absolute;top:50px;bottom:45px;left:0;right:0;padding:0;overflow-x:hidden;overflow-y:auto;z-index:101;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff}.messageList .b-content .content{-webkit-overflow-scrolling:touch}.messageList .b-content .listClear{color:#333;text-align:center;padding:10px;font-size:14px;line-height:13px}.messageList .b-content .listDragOver,.messageList .b-content .listEmptyList,.messageList .b-content .listEmptyListLoading,.messageList .b-content .listEmptySearchList,.messageList .b-content .listError{color:#999;text-align:center;padding:60px 10px;font-size:24px;line-height:30px}.messageList .b-content .listDragOver .e-icon,.messageList .b-content .listEmptyList .e-icon,.messageList .b-content .listEmptyListLoading .e-icon,.messageList .b-content .listEmptySearchList .e-icon,.messageList .b-content .listError .e-icon{font-size:24px;line-height:30px}.messageList .b-content .listDragOver{max-height:0;overflow:hidden;padding:0 10px}.messageList .b-content .listDragOver.viewAppendArea{max-height:120px;padding:30px 10px}.messageList .b-content .listDragOver.dragOverEnter{background-color:#e0fdda;color:#333}.messageList .b-content .listError{color:#da4f49}.messageList .b-content .listSearchDesc{font-size:18px;padding:15px;border-bottom:1px solid #eee}html.rl-mobile .messageList .b-content .listSearchDesc{font-size:16px;padding:12px}.messageList .b-content .listThreadUidDesc{font-size:16px;padding:7px 20px 6px 20px;background-color:#aaa;border-bottom:1px solid #888;color:#fff;cursor:pointer;text-shadow:0 1px 0 #000;text-align:center}.messageList .b-content .delimiter{display:block;height:1px;background-color:#e5e5e5}.messageList .b-content .messageListItem:last-child{border-bottom:1px solid #e5e5e5}.messageList .b-content .messageListItem:last-child.selected{border-bottom:1px solid #bfd5ef}.messageList .b-content .fullThreadsParent{height:25px;padding:3px 5px;background-color:#f4f4f4;text-align:center}.messageList .b-content .messageListItem{position:relative;height:52px;max-height:60px;font-size:12px;line-height:21px;overflow:hidden;cursor:pointer;margin:0;border:0 solid transparent;z-index:100;background-color:#f9f9f9}.messageList .b-content .messageListItem .delimiter{position:relative;display:block;height:1px;background-color:#999;opacity:.2}.messageList .b-content .messageListItem .wrapper{padding:5px 0}.messageList .b-content .messageListItem .sidebarParent{display:inline-block;width:6px;background-color:#eee;float:left;height:100%}.messageList .b-content .messageListItem.focused{background-color:#f5f5f5}.messageList .b-content .messageListItem.focused .sidebarParent{background-color:#ccc!important}.messageList .b-content .messageListItem .importantMark{display:none;color:red;margin-right:5px}.messageList .b-content .messageListItem.deleted-mark{opacity:.7}.messageList .b-content .messageListItem.deleted-mark .sender,.messageList .b-content .messageListItem.deleted-mark .subject,.messageList .b-content .messageListItem.deleted-mark .subject-prefix,.messageList .b-content .messageListItem.deleted-mark .subject-suffix{text-decoration:line-through}.messageList .b-content .messageListItem.important .importantMark{display:inline}.messageList .b-content .messageListItem.e-single-line{height:35px}.messageList .b-content .messageListItem.e-single-line .wrapper{line-height:25px;padding:5px}.messageList .b-content .messageListItem.new{max-height:0}.messageList .b-content .messageListItem.deleted{max-height:0;border-color:transparent!important}.messageList .b-content .messageListItem .checkedParent{display:inline-block;float:left;margin-top:11px;padding:0 8px 0 6px;font-size:14px}.messageList .b-content .messageListItem.e-single-line .checkedParent{margin-top:1px}.messageList .b-content .messageListItem .flagParent{display:inline-block;float:right;padding:0 10px 0 5px}.messageList .b-content .messageListItem.e-single-line .flagParent{float:left;padding:0 8px 0 2px}.messageList .b-content .messageListItem .dateParent{display:inline-block;float:right;position:relative;margin:0 5px;color:#999;font-size:11px}.messageList .b-content .messageListItem .threadsParent{display:inline-block;float:right;position:relative}.messageList .b-content .messageListItem .attachmentParent{display:inline-block;float:right;position:relative;margin:2px 10px 0 5px}.messageList .b-content .messageListItem.e-single-line .attachmentParent{float:left;margin:0 8px 0 0}.messageList .b-content .messageListItem .senderParent{display:block;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.messageList .b-content .messageListItem .threadsCountParent{display:inline;overflow:hidden;background-color:#eee;padding:1px 5px;margin-right:5px;border:1px solid #ccc;border-radius:5px}.messageList .b-content .messageListItem .threadsCountParent.lastSelected{background-color:#999;border-color:#999;color:#fff}.messageList .b-content .messageListItem .threadsCountParent:hover{border-color:#666}.messageList .b-content .messageListItem.e-single-line .senderParent{display:inline-block;-o-text-overflow:none;text-overflow:none;width:200px;float:left;font-weight:400}.messageList .b-content .messageListItem .subjectParent{display:block;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;color:#000}.messageList .b-content .messageListItem .dateParent,.messageList .b-content .messageListItem .senderParent,.messageList .b-content .messageListItem .subjectParent{white-space:nowrap}.messageList .b-content .messageListItem .subjectParent .emptySubjectText{display:none;font-style:italic;color:#999}.messageList .b-content .messageListItem.emptySubject .subjectParent .subject,.messageList .b-content .messageListItem.emptySubject .subjectParent .subject-prefix,.messageList .b-content .messageListItem.emptySubject .subjectParent .subject-suffix{display:none}.messageList .b-content .messageListItem.emptySubject .subjectParent .emptySubjectText{display:inline}.messageList .b-content .messageListItem .sender,.messageList .b-content .messageListItem .subject,.messageList .b-content .messageListItem .subject-suffix{overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.messageList .b-content .messageListItem .threads-len .threads-len-data{background-color:#eee;color:#666;border-radius:6px;padding:2px 0 1px 6px;margin-right:2px;border:1px solid #ccc}.messageList .b-content .messageListItem .threads-len .threads-len-data [class*=" icon-"],.messageList .b-content .messageListItem .threads-len .threads-len-data [class^=icon-]{font-size:14px}.messageList .b-content .messageListItem .threads-len .threads-len-data:hover{background-color:#aaa;border-color:#666;text-shadow:0 1px 0 #999;color:#fff}.messageList .b-content .messageListItem .subject-prefix{color:#888}.messageList .b-content .messageListItem .attachment{display:none}.messageList .b-content .messageListItem .flagOff,.messageList .b-content .messageListItem .flagOn,.messageList .b-content .messageListItem .flagOnHalf{cursor:pointer;display:inline-block}.messageList .b-content .messageListItem .flagOff{opacity:.5}.messageList .b-content .messageListItem .flagOff:hover{opacity:1}.messageList .b-content .messageListItem .flagOn,.messageList .b-content .messageListItem .flagOnHalf{display:none;color:orange}.messageList .b-content .messageListItem .forwardFlag,.messageList .b-content .messageListItem .replyFlag{display:none}.messageList .b-content .messageListItem.answered .replyFlag{display:inline-block}.messageList .b-content .messageListItem.forwarded .forwardFlag{display:inline-block}.messageList .b-content .messageListItem.withAttachments .attachment{display:inline-block;color:#666;text-shadow:0 1px 0 #eee}.messageList .b-content .messageListItem.hasUnseenSubMessage{background-color:#ffffd9}.messageList .b-content .messageListItem.hasUnseenSubMessage .sidebarParent{background-color:#ffdb99}.messageList .b-content .messageListItem.hasUnseenSubMessage.focused .sidebarParent{background-color:#cc8400!important}.messageList .b-content .messageListItem.unseen{background-color:#ffffd9}.messageList .b-content .messageListItem.unseen .sender,.messageList .b-content .messageListItem.unseen .subject,.messageList .b-content .messageListItem.unseen .subject-suffix{font-weight:700}.messageList .b-content .messageListItem.unseen .sidebarParent{background-color:orange}.messageList .b-content .messageListItem.unseen.focused .sidebarParent{background-color:#cc8400!important}.messageList .b-content .messageListItem.checked .sidebarParent{background-color:#69a8f5!important}.messageList .b-content .messageListItem.checked.focused .sidebarParent{background-color:#217ef0!important}.messageList .b-content .messageListItem.selected{background-color:#dfefff;z-index:101}.messageList .b-content .messageListItem.selected .sidebarParent{background-color:#398cf2!important}.messageList .b-content .messageListItem.selected .delimiter{background-color:#398cf2;opacity:.2}.messageList .b-content .messageListItem.selected+.messageListItem .delimiter{background-color:#398cf2;opacity:.3}.messageList .b-content .messageListItem.hasFlaggedSubMessage .flagOff,.messageList .b-content .messageListItem.hasFlaggedSubMessage .flagOn{display:none}.messageList .b-content .messageListItem.hasFlaggedSubMessage .flagOnHalf{display:inline-block}.messageList .b-content .messageListItem.flagged .flagOff,.messageList .b-content .messageListItem.flagged .flagOnHalf{display:none}.messageList .b-content .messageListItem.flagged .flagOn{display:inline-block}.messageList.message-focused .b-message-list-wrapper{background-color:#000}.messageList.message-focused .b-content{opacity:.97}.messageList.hideMessageListCheckbox .checkboxCkeckAll,.messageList.hideMessageListCheckbox .checkedParent{display:none!important}.messageList.hideMessageListCheckbox .sidebarParent{margin-right:10px!important}html.ssm-state-desktop-large .messageList .b-content .messageListItem{font-size:13px}html.ssm-state-desktop-large .messageList .b-content .messageListItem .dateParent{font-size:13px}html.cssanimations .messageList .line-loading{height:5px!important}.draggablePlace{z-index:10003;color:#fff;background-color:#333;background-color:rgba(0,0,0,.5);padding:4px 10px;min-width:30px;height:20px;cursor:pointer;cursor:move}html.rl-mobile #rl-sub-left .messageList .inputSearch{width:160px!important}html.rl-no-preview-pane .messageView{display:none}html.rl-no-preview-pane .messageView.message-selected{display:block}.messageView{z-index:100}.messageView .toolbar{position:absolute;top:0;right:0;left:0;height:30px;padding:10px 0;color:#fff}.messageView .b-content{position:absolute;margin:0;top:58px;bottom:13px;right:8px;left:-2px;border:1px solid #aaa;border-radius:3px;background-color:#fff}.messageView .b-content .b-message-view-checked-helper{text-align:center;font-size:70px;line-height:70px;padding-top:100px;color:#999}.messageView .b-content .b-message-view-checked-helper .icon-mail{font-size:100px;font-size:50px;line-height:90px;padding-left:10px}.messageView .b-content .logoPlace{text-align:center}.messageView .b-content .b-message-view-desc{text-align:center;font-size:24px;line-height:30px;color:#999;padding:120px 10px 0 10px}.messageView .b-content .b-message-view-desc.error{color:#da4f49}.messageView .b-content .b-message-view-iframe-backdrop{display:none;background:0 0;position:absolute;width:100%;height:100%;top:0;left:0;right:0;bottom:0;opacity:.1}.messageView .b-content .content{-webkit-overflow-scrolling:touch}.messageView .b-content .message-fixed-button-toolbar{z-index:100;position:absolute;top:33px;right:10px}.messageView .b-content .infoParent{cursor:pointer;margin:0 2px 0 5px;opacity:.3}.messageView .b-content .infoParent:hover{opacity:.6}.messageView .b-content .flagParent{cursor:pointer;margin:0 20px 0 2px}.messageView .b-content .flagParent .flagOn{color:orange}.messageView .b-content .flagParent .flagOff{opacity:.5}.messageView .b-content .flagParent .flagOff:hover{opacity:1}.messageView .b-content .messageItemHeader{position:absolute;padding:10px;background-color:#f8f8f8;border-top:0;border-bottom:1px solid #ddd;border-top-right-radius:5px;border-top-left-radius:5px;z-index:1;top:0;left:0;right:0}.messageView .b-content .messageItemHeader .fromPic{display:inline-block;width:50px;height:50px;float:left;padding:2px;margin:0 5px 0 0;background:#fff;border:1px solid #ccc;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box}.messageView .b-content .messageItemHeader .subjectParent{font-size:18px;font-weight:700;-o-text-overflow:ellipsis;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;margin-bottom:8px;line-height:100%;height:22px;vertical-align:middle}.messageView .b-content .messageItemHeader .messageButtons{margin-top:5px}.messageView .b-content .messageItemHeader .informationShort{margin:4px 0;margin-left:5px;margin-right:50px}.messageView .b-content .messageItemHeader .informationShort a{color:#369;text-decoration:underline;cursor:pointer;padding:2px}.messageView .b-content .messageItemHeader .informationShort a:focus{outline:1px;outline-style:dotted}html.rl-mobile .messageView .b-content .messageItemHeader .informationShort{-o-text-overflow:ellipsis;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.messageView .b-content .messageItemHeader .informationShortWrp{max-height:100px;overflow-y:auto;min-height:30px;margin-top:4px}.messageView .b-content .messageItemHeader .informationFull{margin-top:10px;border:1px solid #ddd;background-color:#fff;border-radius:5px;padding:8px 0;overflow:hidden}.messageView .b-content .messageItemHeader .informationFull .size{margin-left:4px}.messageView .b-content .messageItemHeader .informationFull table{width:100%}.messageView .b-content .messageItemHeader .informationFull table,.messageView .b-content .messageItemHeader .informationFull td,.messageView .b-content .messageItemHeader .informationFull tr{border-spacing:0}.messageView .b-content .messageItemHeader .informationFull td{padding:0 10px;vertical-align:top;min-width:43px}.messageView .b-content .messageItemHeader .informationFull td:first-child{border-right:1px solid #ddd;text-align:right;width:1%}.messageView .b-content .messageItemHeader .informationFull .uiLabel{white-space:nowrap}.messageView .b-content .messageItemHeader .informationFull .uiLabelValue{word-break:break-all}.messageView .b-content .messageItemHeader .emptySubjectText{display:none;font-style:italic;font-weight:400;color:#999}.messageView .b-content .messageItemHeader.emptySubject .emptySubjectText{display:inline}.messageView .b-content .messageItem{position:absolute;top:0;bottom:0;left:0;right:0;overflow:auto;-webkit-overflow-scrolling:touch;border-radius:3px}.messageView .b-content .messageItem .buttonFull,.messageView .b-content .messageItem .buttonUnFull,.messageView .b-content .messageItem .buttonUp{display:inline-block;position:fixed;right:25px;bottom:25px;height:30px;width:30px;text-align:center;vertical-align:middle;line-height:30px;background-color:transparent;background-color:#fff;border:1px solid #333;color:#333;z-index:2;cursor:pointer;border-radius:5px;opacity:.5}.messageView .b-content .messageItem .buttonFull:hover,.messageView .b-content .messageItem .buttonUnFull:hover,.messageView .b-content .messageItem .buttonUp:hover{opacity:.8;border-color:#666;background-color:#888;color:#fff}.messageView .b-content .messageItem .buttonUp{right:65px;z-index:0}.messageView .b-content .messageItem .buttonUnFull,.messageView .b-content .messageItem .buttonUp{display:none}.messageView .b-content .messageItem .loading{text-align:center;font-size:24px;color:grey;padding-top:50px}.messageView .b-content .messageItem .line-loading{height:0}.messageView .b-content .messageItem .pgpEncrypted,.messageView .b-content .messageItem .pgpSigned,.messageView .b-content .messageItem .readReceipt,.messageView .b-content .messageItem .showImages{cursor:pointer;padding:10px 15px;border-bottom:1px solid #ddd;background-color:#eee}.messageView .b-content .messageItem .pgpInfo{padding:5px 15px;border-bottom:1px solid #ddd;background-color:#fcf8e3}.messageView .b-content .messageItem .pgpInfo.success{background-color:#e9f4ff}.messageView .b-content .messageItem .readReceipt{background-color:#ffffd9}.messageView .b-content .messageItem .attachmentsPlace{padding:10px 10px 6px 10px;background:#eee;border-bottom:1px solid #ddd;position:relative}.messageView .b-content .messageItem .attachmentsPlace .attachmentList{margin:0}.messageView .b-content .messageItem .attachmentsPlace .checkedParent{display:none}.messageView .b-content .messageItem .attachmentsPlace.selection-mode .checkedParent{display:inline-block}.messageView .b-content .messageItem .attachmentsPlace.unselectedAttachmentsError .attachmentItem{-webkit-box-shadow:0 1px 4px red;box-shadow:0 1px 4px red;-webkit-box-shadow:0 1px 5px rgba(255,0,0,.4);box-shadow:0 1px 5px rgba(255,0,0,.4);-webkit-box-shadow:0 0 0 1px rgba(255,0,0,.2),0 1px 5px rgba(255,0,0,.3);box-shadow:0 0 0 1px rgba(255,0,0,.2),0 1px 5px rgba(255,0,0,.3)}.messageView .b-content .messageItem .attachmentsPlace .controls-handle{position:absolute;bottom:5px;right:8px;color:#999;cursor:pointer}.messageView .b-content .messageItem .attachmentsControls{padding:7px 5px 7px 14px;background:#e8e8e8;border-bottom:1px solid #ddd}.messageView .b-content .messageItem .rlBlockquoteSwitcher{background-color:#eee;border:1px solid #999;display:inline-block;width:30px;height:14px;line-height:14px;text-align:center;cursor:pointer;margin:10px 0;opacity:.5}.messageView .b-content .messageItem .rlBlockquoteSwitcher:hover{opacity:1}.messageView .b-content .messageItem .bodySubHeader{z-index:2}.messageView .b-content .messageItem .bodyText{color:#000;font-family:Arial,Verdana,Geneva,sans-serif}.messageView .b-content .messageItem .bodyText .b-text-part{height:100%}.messageView .b-content .messageItem .bodyText .b-text-part div[data-x-div-type=html]{height:100%}.messageView .b-content .messageItem .bodyText .b-text-part div[data-x-div-type=html] div[data-x-div-type=body]{height:100%}.messageView .b-content .messageItem .bodyText .b-text-part a{color:#00f;text-decoration:underline}.messageView .b-content .messageItem .bodyText .b-text-part a:visited{color:#609}.messageView .b-content .messageItem .bodyText .b-text-part a:active{color:red}.messageView .b-content .messageItem .bodyText .b-text-part blockquote{border-left:2px solid #000;padding:0 10px;margin:0}.messageView .b-content .messageItem .bodyText .b-text-part .rl-bq-switcher.hidden-bq{display:none}.messageView .b-content .messageItem .bodyText .b-text-part.html div[data-x-div-type=body]{margin:15px}.messageView .b-content .messageItem .bodyText .b-text-part.html code,.messageView .b-content .messageItem .bodyText .b-text-part.html pre{margin:0;padding:0;background:#fff;border:none;border-radius:0;font-family:Monaco,Menlo,Consolas,'Courier New',monospace;display:block;word-break:normal;word-wrap:break-word;background-color:#f9f9f9}.messageView .b-content .messageItem .bodyText .b-text-part.html code{display:inline;padding:2px 5px}.messageView .b-content .messageItem .bodyText .b-text-part.html pre{padding:5px 10px;border-radius:5px;background-color:#f9f9f9}.messageView .b-content .messageItem .bodyText .b-text-part.html pre>code{padding:0}.messageView .b-content .messageItem .bodyText .b-text-part.plain{padding:15px;font-family:Monaco,Menlo,Consolas,'Courier New',monospace}.messageView .b-content .messageItem .bodyText .b-text-part.plain pre{margin:0;padding:0;background:#fff;border:none;font-family:Monaco,Menlo,Consolas,'Courier New',monospace;display:block;word-break:normal}.messageView .b-content .messageItem .bodyText .b-text-part.plain pre.b-plain-openpgp{display:inline-block;padding:6px 10px;border:1px dashed #666;background:#fff;word-break:break-all}.messageView .b-content .messageItem .bodyText .b-text-part.plain pre.b-plain-openpgp.success{border-color:green;background-color:rgba(0,255,0,.03)}.messageView .b-content .messageItem .bodyText .b-text-part.plain pre.b-plain-openpgp.error{border-color:red;background-color:rgba(255,0,0,.03)}.messageView .b-content .messageItem .bodyText .b-text-part.plain blockquote{border-left:2px solid #00f;color:#00f}.messageView .b-content .messageItem .bodyText .b-text-part.plain blockquote blockquote{border-left:2px solid green;color:green}.messageView .b-content .messageItem .bodyText .b-text-part.plain blockquote blockquote blockquote{border-left:2px solid red;color:red}.messageView .b-content .messageItem .bodyText .b-text-part .b-openpgp-control{display:inline-block;cursor:pointer;color:#777}.messageView .b-content .messageItem .bodyText .b-text-part .b-openpgp-control:hover{color:#111}.messageView .b-content .messageItem .bodyText .b-text-part .b-openpgp-control.success{color:green;cursor:help}.messageView .b-content .messageItem .bodyText .b-text-part .b-openpgp-control.error{color:red}.messageView.message-focused .b-content{z-index:101;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.2);box-shadow:0 2px 8px rgba(0,0,0,.2);border-radius:3px;border-color:#9d9d9d}.messageView .thread-controls .dropdown-toggle{padding-left:10px;padding-right:10px}.messageView .thread-controls.open .dropdown-toggle{padding-left:10px;padding-right:10px}.messageView .thread-list .e-link{padding:4px 8px 6px 10px}.messageView .thread-list.hide-more .thread-list-message.more-that{display:none}.messageView .thread-list .thread-date{font-size:13px;color:#999}.messageView .thread-list .more-threads{text-align:center;padding:8px;background-color:#f5f5f5;color:#555;text-decoration:underline;border-top:1px dashed #555}html.rl-resizer .b-message-view-iframe-backdrop{display:block!important}html.rl-no-preview-pane .messageView .toolbar{padding-left:1px}html.rl-no-preview-pane .messageView .b-content{top:50px;left:0;bottom:5px;right:5px;border:1px solid #aaa;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.2);box-shadow:0 2px 8px rgba(0,0,0,.2);border-radius:5px}html.rl-bottom-preview-pane .messageView .b-content{bottom:5px}html.cssanimations .messageItem .line-loading{height:5px!important}html.rl-message-fullscreen #rl-bottom,html.rl-message-fullscreen #rl-left{display:none!important}html.rl-message-fullscreen #rl-right .RL-MailMessageList,html.rl-message-fullscreen #rl-right .RL-MailMessageView .messageView .toolbar,html.rl-message-fullscreen #rl-right .RL-SettingsPane,html.rl-message-fullscreen #rl-right .RL-SystemDropDown{display:none!important}html.rl-message-fullscreen .messageView .b-content{position:fixed!important;margin:5px!important;top:0!important;left:0!important;right:0!important;bottom:0!important;z-index:10000!important;border:1px solid #aaa!important;border-radius:3px!important}html .messageItem .buttonUp{display:none!important}html .messageItem.scroller-shadow-top .buttonUp{display:inline-block!important}html.rl-desktop .messageItem .buttonFull,html.rl-desktop .messageItem .buttonUp{display:none!important}html.rl-desktop .messageItem:hover .buttonFull,html.rl-desktop .messageItem:hover.scroller-shadow-top .buttonUp{display:inline-block!important}html.rl-message-fullscreen .messageItem .buttonUnFull{display:inline-block!important}html.rl-message-fullscreen .messageItem .buttonFull{display:none!important}html.rl-message-fullscreen .messageItem .buttonUp{display:none!important}html.rl-message-fullscreen .messageItem.scroller-shadow-top .buttonUp{display:inline-block!important}.b-contacts-content .control-group .control-label.fix-width{width:50px}.b-contacts-content .control-group .controls.fix-width{margin-left:70px}.b-contacts-content.modal{position:absolute;right:0;top:0;bottom:0;left:0;width:900px;min-height:300px;max-height:700px;margin:auto}.b-contacts-content.modal .modal-body{overflow:auto;height:100%;background-color:#f5f5f5;padding:0}.b-contacts-content.modal .b-header-toolbar{height:40px;background-color:#aaa;color:#fff;background-color:#333;background-color:rgba(0,0,0,.8)!important}.b-contacts-content.modal .b-header-toolbar .close,.b-contacts-content.modal .b-header-toolbar .close-custom{color:#fff;opacity:1}.b-contacts-content.modal .b-header-toolbar .btn{margin-top:4px}.b-contacts-content.modal .b-list-toolbar{padding:0;height:45px;text-align:right;width:220px;-webkit-box-shadow:inset 0 -1px 0 #ccc;box-shadow:inset 0 -1px 0 #ccc}.b-contacts-content.modal .b-list-toolbar .e-search{margin-top:7px;width:200px}.b-contacts-content.modal .b-list-footer-toolbar{position:absolute;left:0;bottom:0;height:105px;width:220px;background-color:#eee;-webkit-box-shadow:inset 0 1px 0 #ccc;box-shadow:inset 0 1px 0 #ccc}.b-contacts-content.modal .b-list-footer-toolbar .footer-pager{padding:8px 10px 0 0}.b-contacts-content.modal .b-list-content{position:absolute;top:45px;bottom:105px;left:0;width:220px;overflow:hidden;overflow-y:auto}.b-contacts-content.modal .b-list-content .content{-webkit-overflow-scrolling:touch}.b-contacts-content.modal .b-list-content .listClear{color:#333;text-align:center;padding:10px;font-size:14px;line-height:13px;background-color:#fff;-webkit-box-shadow:inset 0 -1px 0 #ccc;box-shadow:inset 0 -1px 0 #ccc}.b-contacts-content.modal .b-list-content .listEmptyList,.b-contacts-content.modal .b-list-content .listEmptyListLoading,.b-contacts-content.modal .b-list-content .listEmptySearchList{color:#999;text-align:center;padding:60px 10px;font-size:24px;line-height:30px}.b-contacts-content.modal .b-list-content.hideContactListCheckbox .checkboxCkeckAll,.b-contacts-content.modal .b-list-content.hideContactListCheckbox .checkedParent{display:none!important}.b-contacts-content.modal .b-list-content.hideContactListCheckbox .sidebarParent{margin-right:10px!important}.b-contacts-content.modal .b-list-content .e-contact-foreach{border-bottom:1px solid #ddd}.b-contacts-content.modal .b-list-content .e-contact-item{position:relative;height:45px;max-height:45px;line-height:45px;overflow:hidden;cursor:pointer;margin:0;border:0 solid transparent;z-index:100}.b-contacts-content.modal .b-list-content .e-contact-item .delimiter{position:relative;display:block;height:1px;background-color:#999;opacity:.2}.b-contacts-content.modal .b-list-content .e-contact-item .wrapper{padding:0}.b-contacts-content.modal .b-list-content .e-contact-item .sidebarParent{display:inline-block;width:6px;background-color:#eee;float:left;height:100%}.b-contacts-content.modal .b-list-content .e-contact-item.focused .sidebarParent{background-color:#bbb}.b-contacts-content.modal .b-list-content .e-contact-item.deleted{max-height:0;border-color:transparent!important}.b-contacts-content.modal .b-list-content .e-contact-item .checkedParent{display:inline-block;float:left;padding:0 8px 0 6px}.b-contacts-content.modal .b-list-content .e-contact-item .shareParent{display:none;float:right;position:relative;margin:2px 8px 0 5px}.b-contacts-content.modal .b-list-content .e-contact-item .nameParent{display:block;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;color:#333;font-size:16px}.b-contacts-content.modal .b-list-content .e-contact-item .emailParent,.b-contacts-content.modal .b-list-content .e-contact-item .nameParent{white-space:nowrap}.b-contacts-content.modal .b-list-content .e-contact-item .displayEmail,.b-contacts-content.modal .b-list-content .e-contact-item .displayName{overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.b-contacts-content.modal .b-list-content .e-contact-item .displayImg{display:inline-block;float:right;position:relative;margin:0 5px}.b-contacts-content.modal .b-list-content .e-contact-item.shared .shareParent{display:inline-block}.b-contacts-content.modal .b-list-content .e-contact-item.checked{z-index:101}.b-contacts-content.modal .b-list-content .e-contact-item.checked .sidebarParent{background-color:#69a8f5}.b-contacts-content.modal .b-list-content .e-contact-item.checked.focused .sidebarParent{background-color:#519af3!important}.b-contacts-content.modal .b-list-content .e-contact-item.selected{background-color:#fff;z-index:102}.b-contacts-content.modal .b-list-content .e-contact-item.selected .sidebarParent{background-color:#398cf2}.b-contacts-content.modal .b-list-content .e-contact-item.selected.focused .sidebarParent{background-color:#217ef0!important}.b-contacts-content.modal .b-view-content-toolbar{background-color:#f5f5f5;padding:7px;position:absolute;top:0;right:0;left:220px;height:31px;text-align:center;-webkit-box-shadow:inset 0 -1px 0 #ccc;box-shadow:inset 0 -1px 0 #ccc}.b-contacts-content.modal .b-view-content-toolbar .button-save-contact.no-disabled.dirty{color:#51a351;font-weight:700}.b-contacts-content.modal .b-view-content-toolbar.read-only .button-save-contact{display:none}.b-contacts-content.modal .b-view-content{position:absolute;top:45px;bottom:60px;left:220px;right:0;overflow:hidden;overflow-y:auto;background-color:#fff;border-left:1px solid #ddd}.b-contacts-content.modal .b-view-content .content{-webkit-overflow-scrolling:touch}.b-contacts-content.modal .b-view-content .contactValueLargeStatic,.b-contacts-content.modal .b-view-content .contactValueStatic,.b-contacts-content.modal .b-view-content .contactValueTextAreaStatic{height:20px;line-height:20px;font-size:18px;display:inline-block;padding:5px 7px;color:#555;display:none}.b-contacts-content.modal .b-view-content.read-only .contactValueLargeStatic,.b-contacts-content.modal .b-view-content.read-only .contactValueStatic,.b-contacts-content.modal .b-view-content.read-only .contactValueTextAreaStatic{display:inline-block}.b-contacts-content.modal .b-view-content.read-only .contactValueInput,.b-contacts-content.modal .b-view-content.read-only .contactValueInputLarge,.b-contacts-content.modal .b-view-content.read-only .contactValueTextArea{display:none}.b-contacts-content.modal .b-view-content .b-contact-view-desc{text-align:center;font-size:24px;line-height:30px;padding-top:120px;color:#999}.b-contacts-content.modal .b-view-content .top-part{padding-top:20px}.b-contacts-content.modal .b-view-content .property-line{margin-bottom:5px}.b-contacts-content.modal .b-view-content .top-row{padding:10px 0;height:30px}.b-contacts-content.modal .b-view-content .add-link{margin-left:2px;padding:5px;font-size:12px;color:#aaa}.b-contacts-content.modal .b-view-content .contactValueLargeStatic,.b-contacts-content.modal .b-view-content .contactValueStatic,.b-contacts-content.modal .b-view-content .contactValueTextAreaStatic{font-size:18px;display:none}.b-contacts-content.modal .b-view-content .contactValueInput,.b-contacts-content.modal .b-view-content .contactValueInputLarge,.b-contacts-content.modal .b-view-content .contactValueTextArea{-webkit-box-shadow:none;box-shadow:none;border-color:#fff;font-size:18px;width:300px}.b-contacts-content.modal .b-view-content .contactValueInput:hover,.b-contacts-content.modal .b-view-content .contactValueInputLarge:hover,.b-contacts-content.modal .b-view-content .contactValueTextArea:hover{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);border-color:#ccc}.b-contacts-content.modal .b-view-content .contactValueInput:focus,.b-contacts-content.modal .b-view-content .contactValueInputLarge:focus,.b-contacts-content.modal .b-view-content .contactValueTextArea:focus{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);border-color:#999}.b-contacts-content.modal .b-view-content .contactValueInput::-webkit-input-placeholder,.b-contacts-content.modal .b-view-content .contactValueInputLarge::-webkit-input-placeholder,.b-contacts-content.modal .b-view-content .contactValueTextArea::-webkit-input-placeholder{color:#ddd}.b-contacts-content.modal .b-view-content .contactValueInput::-moz-placeholder,.b-contacts-content.modal .b-view-content .contactValueInputLarge::-moz-placeholder,.b-contacts-content.modal .b-view-content .contactValueTextArea::-moz-placeholder{color:#ddd}.b-contacts-content.modal .b-view-content .contactValueInput:-moz-placeholder,.b-contacts-content.modal .b-view-content .contactValueInputLarge:-moz-placeholder,.b-contacts-content.modal .b-view-content .contactValueTextArea:-moz-placeholder{color:#ddd}.b-contacts-content.modal .b-view-content .contactValueInput:-ms-input-placeholder,.b-contacts-content.modal .b-view-content .contactValueInputLarge:-ms-input-placeholder,.b-contacts-content.modal .b-view-content .contactValueTextArea:-ms-input-placeholder{color:#ddd}.b-contacts-content.modal .b-view-content .contactValueTextArea{width:300px}.b-contacts-content.modal .b-view-content .contactValueInputLarge{width:400px}.b-contacts-content.modal .b-view-content .hasError .contactValueInput{color:#ee5f5b;border-color:#ee5f5b}.b-contacts-content.modal .b-view-content .e-save-trigger{position:absolute;top:25px;left:10px}.b-contacts-content.modal .b-view-content .e-read-only-sign{display:none;position:absolute;top:20px;right:40px}.b-contacts-content.modal .b-view-content .e-share-sign{position:absolute;top:20px;right:20px;cursor:pointer}.b-contacts-content.modal .b-view-content.read-only .e-read-only-sign{display:inline-block}.b-contacts-content.modal .b-view-content.read-only .e-share-sign{display:none}.b-contacts-content .e-contact-item{position:relative;height:55px;max-height:60px;line-height:22px;overflow:hidden;cursor:pointer;margin:0;border:0 solid transparent;z-index:100}html.rl-mobile .b-contacts-content .b-list-content,html.rl-mobile .b-contacts-content .b-list-footer-toolbar,html.rl-mobile .b-contacts-content .b-list-toolbar{width:170px}html.rl-mobile .b-contacts-content .b-list-toolbar .e-search{width:150px}html.rl-mobile .b-contacts-content .b-view-content,html.rl-mobile .b-contacts-content .b-view-content-toolbar{left:170px}.b-compose.modal{width:850px;margin:10px auto}.b-compose.modal .modal-body{overflow:auto;padding:0}.b-compose .attachmentAreaParent,.b-compose .textAreaParent{overflow:hidden;position:relative}.b-compose .attachmentAreaParent{padding:10px 10px 6px 10px;background:#ddd;border-top:1px solid #ccc;overflow-y:auto}.b-compose .attachmentAreaParent .no-attachments-desc{padding:50px 10px;text-align:center;font-size:24px;color:#666;text-shadow:0 1px 0 #fff;text-shadow:0 1px 0 rgba(255,255,255,.5)}.b-compose .attachmentAreaParent .attachmentList{margin:0;padding:10px}.b-compose .b-header-toolbar{height:40px;color:#fff;background-color:#aaa;background-color:#333;background-color:rgba(0,0,0,.8)!important}.b-compose .b-header-toolbar .close,.b-compose .b-header-toolbar .close-custom,.b-compose .b-header-toolbar .minimize-custom{opacity:1;color:#fff;border-color:#eee;font-size:24px;line-height:24px}.b-compose .b-header-toolbar .btn.disabled.button-delete{visibility:hidden}.b-compose .b-header-toolbar .button-delete,.b-compose .b-header-toolbar .button-save,.b-compose .b-header-toolbar .saved-text{margin-left:8px}.b-compose .b-header-toolbar .button-close,.b-compose .b-header-toolbar .button-skip{margin-left:8px}.b-compose .b-header-toolbar .disabled.button-delete{margin-left:0}.b-compose .b-header{padding:10px;background-color:#eee;color:#333}html.rl-mobile .b-compose .b-header{overflow:scroll}.b-compose .b-header .e-identity{color:#333;text-decoration:none;font-weight:700}.b-compose .b-header .e-identity:hover{color:#333;text-decoration:none}.b-compose .b-header .e-identity.multiply{cursor:pointer;border-bottom:1px dashed #555}.b-compose .b-header .e-row{line-height:30px}.b-compose .b-header .e-label{text-align:right;width:1%;min-width:70px;padding:6px 10px}html.rl-mobile .b-compose .b-header .e-label{min-width:50px;padding:6px 10px 6px 0}.b-compose .b-header .e-value{padding:2px 0}.b-compose .b-header .e-value input[type=text],.b-compose .b-header .e-value textarea{width:98%}.b-compose .b-header .e-value textarea{height:40px}.b-compose .b-header .error-desc{color:red}.b-compose .b-header .error-to{color:red;font-weight:700}.b-compose .b-header .b-appachments .b-attacment{line-height:20px;padding-bottom:10px}.b-compose .b-header .b-appachments .b-attacment-in-process{line-height:20px;padding-bottom:10px}.b-compose .b-header .b-appachments .b-attacment-in-process .uploading{display:none;padding-right:5px}.b-compose .b-header .b-appachments .b-attacment-in-process.uploading .uploading{display:inline}.b-compose .b-header .b-appachments .b-attacment-in-process .upload-progress{font-weight:700}.b-compose .b-header .b-appachments .b-attacment-in-process.error .namedStr{color:#888}.b-compose .b-header .b-appachments .b-attacment-in-process .error{color:red}.b-compose .b-header .b-appachments .b-attacment-in-process .close,.b-compose .b-header .b-appachments .b-attacment-in-process .close-custom{float:left;padding-right:13px}.b-compose .cke_chrome{border-left-width:0!important;border-right-width:0!important;border-bottom-width:0!important}.b-compose .b-attachment-button{display:inline-block}.b-compose .b-attachment-place{position:absolute;left:5px;right:5px;top:5px;bottom:5px;border:2px #777 dashed;z-index:300;line-height:119px;text-align:center;background-color:#efefef;font-size:24px;border-radius:10px}.b-compose .b-attachment-place.dragAndDropOver{background-color:#fff}.b-admin-left .b-toolbar{position:absolute;top:0;right:0;left:0;height:34px;padding:8px 0 0 8px}.b-admin-left .b-content{position:absolute;top:68px;bottom:8px;left:0;right:0;overflow:hidden}.b-admin-left .b-content .content{-webkit-overflow-scrolling:touch}.b-admin-menu .e-item{overflow:hidden;text-decoration:none;outline:0}.b-admin-menu .e-link{position:relative;display:block;height:30px;line-height:29px;cursor:pointer;font-size:18px;z-index:1;cursor:default;background-color:transparent;color:#888;padding:4px 10px;outline:0;text-decoration:none}.b-admin-menu .e-item.selectable .e-link{cursor:pointer}.b-admin-menu .e-item.selectable.selected .e-link,.b-admin-menu .e-item.selectable:hover .e-link{background-color:#555;color:#fff}.b-admin-right .b-toolbar{position:absolute;top:0;right:0;left:0;height:34px;padding:8px 8px;color:#fff;text-shadow:0 1px 1px #000}.b-admin-right .b-content{position:absolute;top:58px;bottom:8px;left:0;right:8px;overflow-y:auto;z-index:2;background-color:#fff;border:1px solid #aaa;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.2);box-shadow:0 2px 8px rgba(0,0,0,.2);border-radius:5px}.b-admin-right .b-content .content{-webkit-overflow-scrolling:touch}.b-admin-right .b-settings-content{padding:20px;padding-left:30px}.b-admin-right .b-settings-content .legend{width:670px}.b-admin-right .b-settings-content .nav-tabs{width:670px}html.rl-mobile .b-settings-content .legend{width:auto}.b-admin-general .flag-selector{padding-top:5px}.b-admin-general .flag-name{border-bottom:1px dashed #555;cursor:pointer;padding:2px 0}.b-admin-general .flag-name:focus{outline:1px;outline-style:dotted}.b-admin-branding .disabled-form{opacity:.8}.b-admin-branding .custom-css-wrapper textarea{font-family:Monaco,Menlo,Consolas,'Courier New',monospace}.b-admin-domains .process-place{width:600px;padding:14px 0;text-align:center;visibility:hidden}.b-admin-domains-list-table{width:600px}.b-admin-domains-list-table .e-item .e-action{cursor:pointer}.b-admin-domains-list-table .e-item .domain-name{display:inline-block;word-break:break-all;-webkit-box-sizing:border-box;box-sizing:border-box}.b-admin-domains-list-table .e-item .domain-alias{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;color:#bbb;padding-left:5px}.b-admin-domains-list-table .e-item.disabled .domain-alias,.b-admin-domains-list-table .e-item.disabled .domain-name{color:#bbb}.b-admin-domains-list-table .e-item .button-delete{margin-right:15px;visibility:hidden;opacity:0}.b-admin-domains-list-table .e-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1}.b-admin-domains-list-table .e-item .delete-domain,.b-admin-domains-list-table .e-item .disabled-domain{cursor:pointer;opacity:.5}.b-admin-domains-list-table .e-item.disabled .disabled-domain{opacity:.5}.b-admin-domains-list-table .e-item .delete-domain:hover,.b-admin-domains-list-table .e-item .disabled-domain:hover{opacity:1}.b-domain-alias-content.modal{width:330px}.b-domain-alias-content .modal-header{background-color:#fff}.b-domain-alias-content .error-desc{color:red}.b-domain-content.modal{width:810px}.b-domain-content .modal-header{background-color:#fff}.b-domain-content .modal-body{position:relative;overflow:hidden;width:1600px;height:400px;left:0}.b-domain-content.domain-edit .modal-body{height:340px}.b-domain-content.domain-second-page .modal-body{left:-800px}.b-domain-content .domain-desc{color:#666;line-height:20px;background-color:#f9f9f9;padding:8px;border:1px solid #eee;border-radius:3px;margin:-5px 0}.b-domain-content .domain-desc i{font-style:normal;color:red}.b-domain-content .error-desc{color:red}.b-domain-content .testing-done.imap-header,.b-domain-content .testing-done.sieve-header,.b-domain-content .testing-done.smtp-header{color:green;font-weight:700}.b-domain-content .testing-error.imap-header,.b-domain-content .testing-error.sieve-header,.b-domain-content .testing-error.smtp-header{color:red}.b-admin-packages .alert{width:650px}.b-admin-packages .process-place{visibility:hidden}.b-admin-packages-list-table{width:700px}.b-admin-packages-list-table .e-item .package-img{font-size:12px;margin-right:2px}.b-admin-packages-list-table .e-item .package-name.core{font-weight:700}.b-admin-packages-list-table .e-item .package-desc{color:#999;font-size:12px}.b-admin-packages-list-table .e-item .e-action{cursor:pointer}.b-admin-packages-list-table .e-item .package-actions-parent,.b-admin-packages-list-table .e-item .package-release-parent{text-align:center}.b-admin-packages-list-table .e-item .package-actions-parent{vertical-align:middle}.b-admin-plugins .process-place{visibility:hidden}.b-admin-plugins-list-table.disabled{opacity:.5;background-color:#eee}.b-admin-plugins-list-table .e-item .e-action{cursor:pointer}.b-admin-plugins-list-table .e-item .plugin-img{font-size:12px;margin-right:2px}.b-admin-plugins-list-table .e-item.disabled .plugin-img,.b-admin-plugins-list-table .e-item.disabled .plugin-name{color:#bbb}.b-admin-plugins-list-table .e-item.disabled .disabled-plugin{opacity:.5}.b-admin-plugin-property .help-block{margin-bottom:5px}.b-plugin-content.modal{width:660px}.b-plugin-content.modal .modal-body{overflow:auto}.b-plugin-content .modal-header{background-color:#fff}.b-plugin-content .information{display:inline-block;background-color:#ddd;border-radius:10px;cursor:pointer;height:25px;width:30px;text-align:center;padding-top:5px}.b-plugin-content textarea{width:400px;height:70px}.b-admin-about .rl-logo{display:inline-block;width:250px;height:250px;margin-top:-10px;margin-bottom:-10px;background-image:url(images/rainloop-logo.png)}.b-admin-about .rl-desc{margin-top:20px;margin-left:-20px}.popups .b-activate-content{width:700px}.popups .b-activate-content .modal-header{background-color:#fff}.popups .b-activate-content .help-inline{padding-left:0}.b-settins-left .b-toolbar{position:absolute;top:0;right:0;left:0;height:34px;padding:8px 0 0 8px}.b-settins-left .b-footer{position:absolute;bottom:20px;right:0;left:0;height:20px;padding:0 10px 0 5px;z-index:101}.b-settins-left .b-content{position:absolute;top:68px;bottom:8px;left:0;right:0;overflow:hidden}.b-settins-left .b-content .content{-webkit-overflow-scrolling:touch}.b-settings-menu .e-item{overflow:hidden;text-decoration:none;outline:0}.b-settings-menu .e-link{position:relative;display:block;height:30px;line-height:29px;font-size:18px;z-index:1;cursor:default;background-color:transparent;color:#888;padding:4px 10px;outline:0;text-decoration:none}.b-settings-menu .e-item.selectable .e-link{cursor:pointer}.b-settings-menu .e-item.selectable.selected .e-link,.b-settings-menu .e-item.selectable:hover .e-link{background-color:#555;color:#fff}.b-settins-right .b-toolbar{position:absolute;top:0;right:0;left:0;height:34px;padding:8px 5px;color:#fff}.b-settins-right .b-content{position:absolute;top:50px;bottom:8px;left:0;right:8px;overflow-y:auto;z-index:2;background-color:#fff;border:1px solid #aaa;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.2);box-shadow:0 2px 8px rgba(0,0,0,.2);border-radius:5px}.b-settins-right .b-content .content{-webkit-overflow-scrolling:touch}.b-settins-right .b-settings-content{padding:20px;padding-left:30px}.b-settins-right .b-settings-content .legend{width:600px}html.rl-mobile .b-settings-content .legend{width:auto}html.rl-mobile .b-settings-general{margin-right:15px}.b-settings-general .notification-desc-denied{color:#999;display:none}.b-settings-general .denied-by-browser .notification-desc-denied{display:inline}.b-settings-general .denied-by-browser .notification-desc{color:#999}.b-settings-general .flag-selector{padding-top:5px}.b-settings-general .flag-name{border-bottom:1px dashed #555;cursor:pointer;padding:2px 0}.b-settings-general .flag-name:focus{outline:1px;outline-style:dotted}html.rl-mobile .b-settings-accounts{margin-right:15px}.b-settings-accounts .process-place{text-align:center;width:600px;padding:14px 0}.b-settings-accounts .list-table{width:600px}.b-settings-accounts .list-table td{padding:4px 8px;line-height:30px}.b-settings-accounts .list-table .drag-handle{color:#eee}.b-settings-accounts .list-table tr:hover .drag-handle{color:#aaa}.b-settings-accounts .list-table .account-img,.b-settings-accounts .list-table .identity-img{font-size:12px;margin-right:5px}.b-settings-accounts .list-table .account-name{display:inline-block;word-break:break-all;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:22px}.b-settings-accounts .list-table .identity-default{cursor:pointer;color:#ccc}.b-settings-accounts .list-table .identity-name{display:inline-block;word-break:break-all;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:22px;cursor:pointer}.b-settings-accounts .accounts-list-top-padding,.b-settings-accounts .identities-list-top-padding{display:inline-block;height:5px;width:5px}.b-settings-accounts .account-item{white-space:nowrap}.b-settings-accounts .account-item .e-action{cursor:pointer}.b-settings-accounts .account-item .drag-handle{cursor:pointer;cursor:all-scroll}.b-settings-accounts .account-item .button-delete{margin-right:15px;margin-top:5px;visibility:hidden;opacity:0}.b-settings-accounts .account-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1}.b-settings-accounts .account-item .delete-account{cursor:pointer;opacity:.5}.b-settings-accounts .account-item.ui-sortable-helper{background:#f5f5f5;border:1px solid #ddd}.b-settings-accounts .account-item.ui-sortable-helper .button-delete,.b-settings-accounts .account-item.ui-sortable-helper .delete-account{display:none}.b-settings-accounts .account-item.ui-sortable-helper td{border-width:0}.b-settings-accounts .identity-item{white-space:nowrap}.b-settings-accounts .identity-item .e-action{cursor:pointer}.b-settings-accounts .identity-item .button-delete{margin-right:15px;margin-top:5px;visibility:hidden;opacity:0}.b-settings-accounts .identity-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1}.b-settings-accounts .identity-item .delete-identity{cursor:pointer;opacity:.5}.b-settings-accounts .identity-item.ui-sortable-helper{background:#f5f5f5;border:1px solid #ddd}.b-settings-accounts .identity-item.ui-sortable-helper .button-delete,.b-settings-accounts .identity-item.ui-sortable-helper .delete-identity{display:none}.b-settings-accounts .identity-item.ui-sortable-helper td{border-width:0}html.rl-mobile .b-settings-templates{margin-right:15px}.b-settings-templates .process-place{text-align:center;width:600px;padding:14px 0}.b-settings-templates .list-table{width:600px}.b-settings-templates .list-table td{padding:4px 8px;line-height:30px}.b-settings-templates .list-table .drag-handle{color:#eee}.b-settings-templates .list-table tr:hover .drag-handle{color:#aaa}.b-settings-templates .list-table .template-img{font-size:12px;margin-right:5px}.b-settings-templates .list-table .template-name{display:inline-block;word-break:break-all;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:22px}.b-settings-templates .templates-list-top-padding{display:inline-block;height:5px;width:5px}.b-settings-templates .template-item .e-action{cursor:pointer}.b-settings-templates .template-item .drag-handle{cursor:pointer;cursor:all-scroll}.b-settings-templates .template-item .button-delete{margin-right:15px;margin-top:5px;visibility:hidden;opacity:0}.b-settings-templates .template-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1}.b-settings-templates .template-item .delete-template{cursor:pointer;opacity:.5}.b-settings-templates .template-item.ui-sortable-helper{background:#f5f5f5;border:1px solid #ddd}.b-settings-templates .template-item.ui-sortable-helper .button-delete,.b-settings-templates .template-item.ui-sortable-helper .delete-template{display:none}.b-settings-templates .template-item.ui-sortable-helper td{border-width:0}html.rl-mobile .b-settings-open-pgp{margin-right:15px}.b-settings-open-pgp .process-place{text-align:center;width:600px;padding:14px 0}.b-settings-open-pgp .list-table{width:750px}.b-settings-open-pgp .list-table td{padding:4px 8px;line-height:30px}.b-settings-open-pgp .list-table .open-pgp-key-img{margin-right:10px;vertical-align:top}.b-settings-open-pgp .list-table .open-pgp-key-img .svg-icon{width:12px;height:12px}.b-settings-open-pgp .list-table .open-pgp-key-id,.b-settings-open-pgp .list-table .open-pgp-key-user{display:inline-block;word-break:break-all;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:22px;cursor:default}.b-settings-open-pgp .list-table .open-pgp-key-user-address:first-child{line-height:30px;margin-bottom:-4px}.b-settings-open-pgp .open-pgp-key-item .button-delete{margin-right:15px;margin-top:5px;visibility:hidden;opacity:0}.b-settings-open-pgp .open-pgp-key-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1}.b-settings-open-pgp .open-pgp-key-item .delete-open-pgp-key,.b-settings-open-pgp .open-pgp-key-item .view-open-pgp-key{cursor:pointer;opacity:.7}.b-settings-open-pgp .open-pgp-key-item .delete-open-pgp-key:hover,.b-settings-open-pgp .open-pgp-key-item .view-open-pgp-key:hover{opacity:.9}html.rl-mobile .b-settings-folders{margin-right:35px}.b-settings-folders.ignore-folder-subscribe .subscribe-folder,.b-settings-folders.ignore-folder-subscribe .unsubscribe-folder{display:none}.b-settings-folders .process-place{text-align:center;width:600px;padding:14px 0}.b-settings-folders .folders-list-error{width:550px;margin:10px 0}.b-settings-folders .list-table{width:600px}.b-settings-folders .list-table .e-action{cursor:pointer}.b-settings-folders .list-table td{padding:4px 8px;line-height:30px}.b-settings-folders .list-table .folder-padding{display:inline-block;width:0}.b-settings-folders .list-table .folder-name{display:inline-block;word-break:break-all;white-space:pre-wrap;-webkit-box-sizing:border-box;box-sizing:border-box;margin-left:7px;line-height:22px;cursor:default}.b-settings-folders .list-table .folder-system-name{display:inline-block;line-height:22px;color:#999;cursor:default}.b-settings-folders .list-table .folder-name.can-be-edited:hover{border-bottom:1px dashed #333;cursor:pointer}.b-settings-folders .list-table .folder-name-input{border-width:1px;margin-bottom:0;margin-left:-4px}.b-settings-folders .folder-item.system .folder-name{font-weight:700}.b-settings-folders .folder-item .button-delete{margin-right:15px;margin-top:5px;visibility:hidden;opacity:0}.b-settings-folders .folder-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1}.b-settings-folders .folder-item .check-folder,.b-settings-folders .folder-item .delete-folder,.b-settings-folders .folder-item .subscribe-folder,.b-settings-folders .folder-item .uncheck-folder,.b-settings-folders .folder-item .unsubscribe-folder{cursor:pointer;opacity:.6}.b-settings-folders .folder-item .unsubscribe-folder{opacity:.2}.b-settings-folders .folder-item .uncheck-folder{opacity:.2}.b-settings-folders .folder-padding.deep-1{width:25px}.b-settings-folders .folder-padding.deep-2{width:40px}.b-settings-folders .folder-padding.deep-3{width:55px}.b-settings-folders .folder-padding.deep-4{width:70px}.b-settings-folders .folder-padding.deep-5{width:85px}.b-settings-content .b-settings-themes .legend{width:100%}html.rl-mobile .b-settings-content .b-settings-theme .legend{width:auto}html.rl-mobile .b-themes-list{margin-right:15px}.b-themes-list .e-item{display:inline-block;border:2px solid transparent;cursor:pointer;color:#000;background-color:#fff;padding:16px;margin:5px}.b-themes-list .e-item:hover{border:2px solid grey}.b-themes-list .e-item.selected{background-color:#eee;border:2px solid #000}.b-themes-list .e-item .e-image{width:100px;height:100px;border:1px solid #ddd}html.rl-mobile .b-settings-filters{margin-right:15px}.b-settings-filters .process-place{text-align:center;width:600px;padding:14px 0}.b-settings-filters .list-table{width:600px}.b-settings-filters .list-table td{padding:4px 8px;line-height:30px}.b-settings-filters .list-table td.drag-wrapper{padding:4px 0}.b-settings-filters .list-table .drag-handle{color:#eee}.b-settings-filters .list-table tr:hover .drag-handle{color:#aaa}.b-settings-filters .list-table .filter-img{font-size:12px;margin-right:5px}.b-settings-filters .list-table .filter-name,.b-settings-filters .list-table .filter-sub-name{display:inline-block;word-break:break-all;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:22px;cursor:pointer}.b-settings-filters .list-table .filter-sub-name{color:#aaa}.b-settings-filters .filters-list-top-padding{display:inline-block;height:5px;width:5px}.b-settings-filters .filter-item{white-space:nowrap}.b-settings-filters .filter-item .e-action{cursor:pointer}.b-settings-filters .filter-item .drag-handle{cursor:pointer;cursor:all-scroll}.b-settings-filters .filter-item .button-delete{margin-right:15px;margin-top:5px;visibility:hidden;opacity:0}.b-settings-filters .filter-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1}.b-settings-filters .filter-item .delete-filter{cursor:pointer;opacity:.5}.b-settings-filters .filter-item.ui-sortable-helper{background:#f5f5f5;border:1px solid #ddd}.b-settings-filters .filter-item.ui-sortable-helper .button-delete,.b-settings-filters .filter-item.ui-sortable-helper .delete-filter{display:none}.b-settings-filters .filter-item.ui-sortable-helper td{border-width:0}.rl-cmd{position:absolute;bottom:0;left:0;right:0;top:auto;height:0;z-index:10000;background:rgba(0,0,0,.85);border-top:1px solid #000;overflow:hidden;font-family:monospace;-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;transition:height .1s ease-out}.rl-cmd.opened{height:250px}.rl-cmd .rl-cmd-clr-error{color:#cd3131}.rl-cmd .rl-cmd-clr-info{color:#bfbf00}.rl-cmd .rl-cmd-clr-success{color:#31ff40}.rl-cmd .rl-cmd-wrp{position:relative;height:100%}.rl-cmd .rl-cmd-input-helper{color:#666}.rl-cmd .rl-cmd-input-prefix{color:#31ff40;display:inline-block}.rl-cmd .rl-cmd-input-wrp{position:absolute;bottom:0;left:10px;right:10px}.rl-cmd .rl-cmd-input{background:0 0;border:none;color:#fff;display:inline-block;width:calc(100% - 30px);font-family:monospace}.rl-cmd .rl-cmd-input:focus{background:0 0;border:none}.rl-cmd .rl-cmd-history{color:#fff;font-family:monospace;position:absolute;top:10px;bottom:60px;left:10px;right:-30px;overflow:hidden;overflow-x:hidden;overflow-y:auto}@-webkit-keyframes highlight-folder-row{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.1);transform:scale(1.1)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes highlight-folder-row{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.1);transform:scale(1.1)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes bounce-me{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.2);transform:scale(1.2)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes bounce-me{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.2);transform:scale(1.2)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes textLoadingAnimationKeyFrame{0%{opacity:1}33%{opacity:0}100%{opacity:1}}@keyframes textLoadingAnimationKeyFrame{0%{opacity:1}33%{opacity:0}100%{opacity:1}}@-webkit-keyframes animate-stripes{0%{background-position:0 0}100%{background-position:60px 0}}@keyframes animate-stripes{0%{background-position:0 0}100%{background-position:60px 0}}@-webkit-keyframes login-form-shake{0%{-webkit-transform:translateX(0);transform:translateX(0)}12.5%{-webkit-transform:translateX(-6px) rotateY(-5deg);transform:translateX(-6px) rotateY(-5deg)}37.5%{-webkit-transform:translateX(5px) rotateY(4deg);transform:translateX(5px) rotateY(4deg)}62.5%{-webkit-transform:translateX(-3px) rotateY(-2deg);transform:translateX(-3px) rotateY(-2deg)}87.5%{-webkit-transform:translateX(2px) rotateY(1deg);transform:translateX(2px) rotateY(1deg)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes login-form-shake{0%{-webkit-transform:translateX(0);transform:translateX(0)}12.5%{-webkit-transform:translateX(-6px) rotateY(-5deg);transform:translateX(-6px) rotateY(-5deg)}37.5%{-webkit-transform:translateX(5px) rotateY(4deg);transform:translateX(5px) rotateY(4deg)}62.5%{-webkit-transform:translateX(-3px) rotateY(-2deg);transform:translateX(-3px) rotateY(-2deg)}87.5%{-webkit-transform:translateX(2px) rotateY(1deg);transform:translateX(2px) rotateY(1deg)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}html.csstransitions.rl-started-trigger.no-mobile .b-login-content .loginFormWrapper{-webkit-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px);opacity:.5}#rl-loading{-webkit-transition:opacity .5s linear;-o-transition:opacity .5s linear;transition:opacity .5s linear}html.csstransitions.rl-started-delay #rl-left{-webkit-transition:width .3s ease-out;-o-transition:width .3s ease-out;transition:width .3s ease-out}html.csstransitions.rl-started-delay #rl-right{-webkit-transition:left .3s ease-out,right .3s ease-out;-o-transition:left .3s ease-out,right .3s ease-out;transition:left .3s ease-out,right .3s ease-out}html.csstransitions.rl-started-delay #rl-sub-left,html.csstransitions.rl-started-delay #rl-sub-left .messageList .inputSearch{-webkit-transition:width .3s ease-out;-o-transition:width .3s ease-out;transition:width .3s ease-out}html.csstransitions.rl-started-delay #rl-sub-right{-webkit-transition:left .3s ease-out;-o-transition:left .3s ease-out;transition:left .3s ease-out}html.rgba.cssanimations.backgroundsize .e-strip-animation{background-size:60px 60px;background-image:-o-linear-gradient(315deg,rgba(0,0,0,.1) 25%,transparent 25%,transparent 50%,rgba(0,0,0,.1) 50%,rgba(0,0,0,.1) 75%,transparent 75%,transparent);background-image:linear-gradient(135deg,rgba(0,0,0,.1) 25%,transparent 25%,transparent 50%,rgba(0,0,0,.1) 50%,rgba(0,0,0,.1) 75%,transparent 75%,transparent);-webkit-animation:animate-stripes 2s linear infinite;animation:animate-stripes 2s linear infinite}html.rl-anim .rl-animated-inited{opacity:1;-webkit-transition:opacity .5s linear;-o-transition:opacity .5s linear;transition:opacity .5s linear}html.rl-anim .rl-animated-inited.rl-animated-hidden{opacity:0}html.rl-anim.cssanimations.csstransitions.no-mobile .b-login-content .errorAnimated{-webkit-animation:login-form-shake .4s ease-in-out;animation:login-form-shake .4s ease-in-out}html.rl-anim.no-mobile .b-login-content .errorAnimated .buttonLogin{color:#b94a48;font-weight:700}html.rl-anim.cssanimations.csstransitions.no-mobile .b-login-content .afterLoginHide{opacity:0}html.rl-anim.csstransitions.no-mobile .btn-group.dropdown.colored-toggle.open .animate-this-icon-on-open{-webkit-animation:bounce-me .5s linear;animation:bounce-me .5s linear}html.rl-anim.csstransitions.no-mobile .b-login-content .loginFormWrapper{-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}html.rl-anim.csstransitions .button-delete-transitions{-webkit-transition:all .2s linear;-o-transition:all .2s linear;transition:all .2s linear}html.rl-anim.cssanimations .b-folders .e-item .anim-action-class{-webkit-animation:highlight-folder-row .5s linear;animation:highlight-folder-row .5s linear}html.rl-anim.csstransitions .b-folders .btn.buttonContacts{-webkit-transition:margin .3s linear;-o-transition:margin .3s linear;transition:margin .3s linear}html.rl-anim.csstransitions .b-folders .b-content.opacity-on-panel-disabled{-webkit-transition:opacity .3s linear;-o-transition:opacity .3s linear;transition:opacity .3s linear}html.rl-anim.csstransitions .messageList .messageListItem{-webkit-transition:max-height .4s ease;-o-transition:max-height .4s ease;transition:max-height .4s ease}html.rl-anim.csstransitions .messageList .listDragOver{-webkit-transition:all .4s ease;-o-transition:all .4s ease;transition:all .4s ease}html.rl-anim.csstransitions .b-list-content .e-contact-item{-webkit-transition:max-height .4s ease;-o-transition:max-height .4s ease;transition:max-height .4s ease}html.rl-anim.csstransitions .modal.b-domain-content .modal-body{-webkit-transition:left .5s ease;-o-transition:left .5s ease;transition:left .5s ease}html.rl-anim.csstransitions.rl-modal.rl-modal-animation .popups{overflow:hidden}html.rl-anim.csstransitions .modal.fade{-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out;-webkit-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px)}html.rl-anim.csstransitions .modal.fade.in{-webkit-transform:none;-ms-transform:none;transform:none}html.rl-anim.cssanimations .b-compose.loading .b-header-toolbar{background-size:60px 60px;background-image:-o-linear-gradient(315deg,rgba(255,255,255,.2) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.2) 75%,transparent 75%,transparent);background-image:linear-gradient(135deg,rgba(255,255,255,.2) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.2) 75%,transparent 75%,transparent);-webkit-animation:animate-stripes 2s linear infinite;animation:animate-stripes 2s linear infinite}.textLoadingAnimationD1,.textLoadingAnimationD2,.textLoadingAnimationD3{-webkit-animation:textLoadingAnimationKeyFrame 1s linear infinite 0s;animation:textLoadingAnimationKeyFrame 1s linear infinite 0s}.textLoadingAnimationD2{-webkit-animation-delay:.3s;animation-delay:.3s}.textLoadingAnimationD3{-webkit-animation-delay:.6s;animation-delay:.6s}.rl-view-model.RL-About,.rl-view-model.RL-AdminLogin,.rl-view-model.RL-Login,.rl-view-model.RL-LoginNew{position:relative;height:100%;z-index:5}.mfp-container .mfp-figure{min-height:300px;min-width:300px}.ui-resizable-e{right:-1px;width:5px}.pswp__error-msg{color:#ccc}.pswp__error-msg a,.pswp__error-msg a:hover{color:#fff}.pswp__img--placeholder{opacity:0}.opentip-container{z-index:2001!important}.opentip-container .ot-content{font-size:13px}.opentip-container.style-rainloopErrorTip .ot-content{color:red}.opentip-container.ot-hide-effect-none,.opentip-container.ot-show-effect-none{-webkit-transition:none!important;-o-transition:none!important;transition:none!important}.opentip-container.ot-show-effect-fade{-webkit-transition:none;-o-transition:none;transition:none}.opentip-container.ot-show-effect-fade.ot-hidden{opacity:0}.opentip-container.ot-show-effect-fade.ot-going-to-show{opacity:0;-webkit-transition:opacity .2s ease-in-out;-o-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.opentip-container.ot-show-effect-fade.ot-showing{opacity:1;-webkit-transition:opacity .2s ease-in-out;-o-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.opentip-container.ot-show-effect-fade.ot-visible{opacity:1;-webkit-transition:none;-o-transition:none;transition:none}svg-icon{display:none}.svg-icon{border:0;outline:0;height:16px;width:16px;display:inline-block;fill:#333}.svg-icon.svg-icon-archive{height:14px;width:14px}.lg-backdrop.in{opacity:.8}.btn .btn-text{padding-left:8px}.active-scale-transition{-webkit-transition:-webkit-transform .2s;transition:-webkit-transform .2s;-o-transition:transform .2s;transition:transform .2s;transition:transform .2s,-webkit-transform .2s}.active-scale-transition:active{-webkit-transform:scale(.95);-ms-transform:scale(.95);transform:scale(.95)}html.glass input:-webkit-autofill,html.glass input:-webkit-autofill:active,html.glass input:-webkit-autofill:focus,html.glass input:-webkit-autofill:hover{-webkit-transition-delay:9999s;-webkit-transition:color 9999s ease-out,background-color 9999s ease-out} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/default-skin.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/default-skin.png deleted file mode 100755 index d7495968903e4c4a5e5afef2206641c3adf0fb47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1088 zcmeAS@N?(olHy`uVBq!ia0y~yVB`R@BRJTABqx979v~%I;u=vBoS#-wo>-L1;Fyx1 zl&avFo0y&&l$w}QS$HzlhJk_kk*AAeNX4x;cWt{x!)4eXSig3=D-y;SzJ{req1x4H zf`*q}!`6r&K@lpk2abeDv9zuU+m@H8+~UCEC=kqI?U^jhp%N*)O?+a-XZbR-HPd(A z+dk9!`5Qa_KOb`S<-X1PJiGWAU(Ut%->Vr)xmX!BI2;@qxR?S28k!hHSQaQSK!u>< z85a*tS^xU_lHTiE5-)vR_8=q0^ppFO(yy9~nZ)tUS9*Zvd z@lVGs&sERmU*8{*O3BE+IX!Rs@ASp=?eR>odukSUtim~6Yli0jYdh0y%9YZU@4K#Z ziOc=Ded!7FiTX;rm7n)azfvY}IWG2jZRxqfC`?PCnk-De)kvAosHfAQBe#oc%Z^Kau%frlQyRkZ*ae#)Pb?~2a4 zy0dxD5>jk0e!S+HxMxenkp;C+CHMZxD9Ai=eQNqI;fdeuH(==&b~Wr zRqpTY&f8wjUKbX>{nE!6DYJWVi-3-?JDTy$)c5zk?H?~(+?tihYZv~ZH2<;kVZFRX zdF>w;DJ=W9Ke%Gjr{)u9@9p+iTNj%C_pG|`Zk-Kxj(eYGop@W+a(mN_5WA3)joUw7 zOsM=`zt`&U^xI#SGvAMX?CSVtL(_~ewwgWD^|+f##A6fpV2Mveq@u<%s`wd=_W9Zm z)8jQbtfDIZ@9#g>(WJ1Pb%l%wi`b%~009lorwbH3svi1(*(asHQsjtA`O3Q&!vwgJ z*hP=1+&&qzZJy<{8Om&)?-ks9JLahQ+HXGjR!wznWX__LZ9W~lR_E(YPAz{@kY?Q( zvVZ&HXDl-#G76lo_}-E^^)TQ`UW)A}Z|C%^@RtvZn`Fz5NTfS1wP-vodwA=KrG{le zn)WMS1ZHp2?ASHQqp+w(;-}%KlT*T70t9YvQ8<-+wfV&JQ;cr<)3)_Xtek6qUYmW! zf4)WUmPKZnUz(<@uk?GB{r+B?zCQw$azE8StuAWd?be-k_}Tm5UproZnpPCiTO<1O z>^a6;w;i8+T5#pwiKvwDCpl04RUca=v!GG-$PRA%*11Pkp4dO}ywdqQ#SItJ_IgJ8 zY*^9NC;s5%iI;*;8BA)9oH+XNgmS(mmcZBGfaNGq;5$hD6HZ{@Rlab@h*zK(SR^ob My85}Sb4q9e0GgQI^8f$< diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/default-skin.svg b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/default-skin.svg deleted file mode 100755 index 61f52f10..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/default-skin.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - default-skin 2 - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/flags.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/flags.png deleted file mode 100755 index 7b3a380895c1f5d236075fc64f506a5352fb2350..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78832 zcmV)TK(W7xP)9u?PyxYE6oc>rA|L_^0)iMy z1ZfcnRUkl$q>zLpq;9s~nN#0C&Y8LQ?ruO|-}!vzGjr$OGp9YzbDr`$&kd}#{3pk` zKU!d;$N*prL?Yymw{L|pWf&s?P|E#QRf7SPKMgRv&-)CJ`Ej2g34bs8-*2^OD>^$n z)AB+HRq5123k z+S`i;&|rkXC{zDz<{ zDhROFrft`N@^tsd-z}g!nIOPm5C)9$)2s~27$Rj5#+{Ke2xZ8HQ1QctlI{y(h$7Is zxTl4;!y`=L9KMMr2kg_g?*n}Ps`Ilc*YjG%c&_?u8@IMUMb;QDHV1RX@Z}t^^JX0O zoAuDsPBMFkefOKpynhDJ1_;Ld>X&p2LpGNsiWJ5elrjjTkP62<$`r1`-wOrV5Vqe8 zB30U8RWyKKQ$E{o_W#YJyH_#!=oSF9wI~$=(+L7iCL^#`lFLbq5o9hFSSc_Z%4oDvD63FLp^QXoe>DoJB{S}rL0elJKmF-XUHwL5v;ipz zlqMquR!VYGVuawBF&4Q+4?+uK9rN(L5AzdX{?%8rfdX*{Xlg1ohfPvgqj>ri#hNxr zKCe(xB9)>}N=DC^!Q)ZD>g%@Vxu}*yR+SUxBOYzpo)hI#9th9ins07I7>hIptsHS{ zYthzn@8rA40xh>qcm3BIV+>iXxo=|+$5)1gT66#UZqBRDpp_y}0wX0xN zs#O?Z%QMaZYn|jU#+5M!w8nZNgi`6f6#}H>Z|}cPr-HM`B(!U>Ho#cVV8)_tfHoO4 zA=+5~%$*m_?xuD<+;^W7Hr80Q4$vC3cC;vENKSR}4c=!=xR4M*)v!NMHenQxzx*Ox zeoa66Lu;(kpcR2qWRxP5(v4%$wR^@4ZkSia16PgZ)Km8*`fxLBl;>Nc#?sK#z)OoG zu4rC`R))NgoP6XqWU~RM9J2#6XD#C4UreVhQrtGFg~Q%_lE3VGA`uykHE#HfaeXz$ z@vt`j-XgW-wtHqnx8mx9+yEL2#*dBi<(0K4UtVe_OrDd zTGCq63IeiO*M&7}*P^6EC6gosHWpYBW8)YT$80ROENt#1mJ!WWEg)c9U>KIWR;(n_ z8f!Gyeor!Qk*1|qVzgw(F_Ik)m7F|PkdK^DxvsSp0X*9MJh>0@{MXvG(A9+%k`w>= zDX|IpulNr)4TG!77+h6GP8n8pMU;gBkWWWIt@)CS(LCJN%eN~-w&{uZNm~y} z2u`dF5bF)MuIuCn)gejA> zEp_FRvxxDnwFE(cN>n>*F{@TN0px{?H8DYJC)x8Cqkh|reme(#UXYTor3H;!yrhAR z(s}~+0@65QR>q&!qD|p*V|f6=kj*;TGk30ai<|@@Ey$Q1d5t~8w`gDuxxr0T?Y$fE zh(NBQ1{MjYVjuK}l_Bt@`~ovBLst*6xK@i$_Va!RA7xnNX5}YFi}dD0=MS&;EK`P@{J*1pg*36t%B^x z5p;G5X17DHwg?H+j@q2cxC?@i?rbIBe|#PgVGQZ&Y?WfCjOD7;okVerm4YgzxV3x7K2@SYt81ZeuNF z0W^JMJ(n^RYaH`S31iG0cF(;|OT`j06_r$Nzb$14TnOd$%=_#8eDR0hviRfWYC&*u1+2u|VKdy`We%mFjDmznB1p5GbV( zQX+*wCaeFMXChwy8@9cJ%;863XT6GyEwPM=R79)=^m;qEp_(J|bu8WYGGd!ymqEW{ z`tp-dpC^NDIrN)%v1F_75yUZPJ$WJ7rUne~U`HLl8_~!E@AtBQwuYQl%ox2dr+oPV zkFS!5N)X17>v$64`IL>gnyS_Jqs;DrBotl%NQu>o_q+3qFpBw7B4WWtArP@(s8zh) z8L>lk=*=ie2n?zE4L?;ovs(3H{2VA{P)Z}E>31)sK}yYVSKuXG{EFeB@ z0@miqU8=A>J#LQU*v(HAVSp`a4UM@X;p3U#=3hp4KZCJ~u=+4;#ld|R0NAw=lrU78 zE{@2)$e8kZlm(KC(W59o@Ir#2o29@1?Bz%J@{>2o4jx5S<}=FaVr_elwa-3FQ&Us_ z`UjvnAw+sDtFA_V_q((|Iu{xnd3sHjEoyoQmFDHayRz?~FX&j%#(|rUqIFm;mz=pf zSO4;5PCR@fW!Zp(_8h|Q&$&gQuH*h`6|Mte0~8S7}z^On#BEx1g5eAwd<~s zj|eJq*eF6phP=uX$(Yz{00uD1N&dqhzmaKSE6dz3zfV?lamiyp zAgFN?RRKq}z|F6J&WuIf)LTtPYwmpPZC)MKz@(;LW(keZPGDt+O+hTV6jQqw+8QA5 z2u{0636*9%nzd4Ld3C@woiRcPrq*V7vR$x+)ffR<2(sS6DTH$zY2_GPD}(IE^x6@P zXa3|_;$~FJBBf0Qz%Opyg9|TulWVVe&j}0-Kf8WMF248;gfQuQK{+EPvH6qLQwYq0 z3UW6tMO@zi^#vb*6(arJ%08M$s(o0Cjb6f-&#^{gduL*E2lbnOV+<$uyujX_OEBfD zDBEHJl?VS9K~;6hZ+lkU$k=@^Vd%~~pz@8Zn?HvjETgG$(5CDEy3_w|{Y$U#r<#MA zy;8Eylw*|U@6XI(&hQ#0W;9Pe{|ToazXQ*`_8C%YUVeKiVJ6^(*BATw18ppMp`F_A zO&qD6$>UaiTQC8Vd+*RQT07H88?17xfBBekl#L$47t^NEeD>Ld)iqRZ(?QpqkG)o) zF~&J%{~rW^a`uKYNa+N?vU&Bah%0HCzK)K|%lY!1O2Q8ZF*e?aj@$|m#&P0^cWSy) zPIdej1wh~@t0#((QX+&Pj$`6D#t4D_d@0#i%rRY__5GwZ$N0LqzAN+G01NyB;Py~4MSn!tevv|zO1 z`M<8<``>>JDJ??iREvO!b4@_&8*dOr5ylv-wOnyUo{v8a*|XfR&CToi$t@XPk0PhO zhatACjEapL*&ron6f+!t1-2HO+XtfcfWTH9INzPAPe;A_<*pbb4{x(bB`?!?hi|hZo1<2Qb=il0x za#%=4Ehn(hCWMTS9}xtFIJ+(!`(6BVPPDE$5s=+Y^7Hdau3cdHY?0*f})=>3(nizXU*{ zS_)~1MZk#7m$BrN&3R+e1mrscB?V)*U4rh3u(7~+TQCWw1c_aktP=l%`fvRNU@cNg zq9{s*fQcgPUtc5|+Ju#g+^6#)j!~ju0!Sl4_^^*sSgDapvZr3oUcIkSf8u|a)Y4cw_ zf=VU$$(jy+Sd(Gqx|k@AIkhpz_gA)a@8B}$pb`S36}>?B?PrtS>lSR!O00EJ3#(=6 z)i`ISH5!b27FLhsN6{Y`^6L%M*Vp%7{U%MqKInV}TMEG?AAM9Z{y`A1Xwg<2fBf;O z07<@Iupr>bBPB|~{l5*k;9SLPuZ5|AaG@@Rl#+QJhKaQnp)J;Xv7McN5Vq=@80*YR z(^HrWV<4Bcyt!VZs6r2_=Fx>m5yywnD(Cafl`k^x)B6e4bSk#rj*7#NBD>i^^lY3- zu<9lzP7su5Uqi}j1|NJd_L57m>(-U}PL#qbU09s7ChMPPwZ;w`2Ggbir-9eHj@@qp z6Gji_x;tKTHoDPB=^{H;TjE&pi~D912A08f<$yw-x<5hVRIFMKR${GmT2Jw{o&H-qoB9JnT3ulVF(^g6*O`3%8_I!HvHoj64r8MKm zk7v%DIe?4(3n7T2h&Yb1QG}g0pUMwEa*oF+LdP*OhDhfT+JzAl0pKQEV5Dn@e)cJ% zttOJ&W*e-vMDynI<zi3VV_#Q5+iLNKi^Lq6za@ zGs^weD2z3bEjaS}34o-o> zxgrB=@=55bpa#2eR?+A53eA;p^BaQzjSyMl*b>KO%#F9K`_bzR041BCmKK~6|}TCA)quP zl|)K+CM$(f3Z?D3pw|Oy zlqMWHENz!nigowj&+uu}uwlr$JMW@t`>n9bV6_6HG0N8;3xqNZtIeevK;ppB)~jvC zxKOyCRMSw6N+B^|r6MzAD53Y#BAqb$K|`bS;A-b{2$ceAH4VfV%V3QzF z5EPg_2sMHA(E+0|D2NrNope<$W=a5BTM490oqBk?8v+UtA9omI$mMeBy9N>pGoG=O zm-iPUp)mx6G?f>^f7;@%CO}({Yw<7xhYPU21;)=mY&9_;jv(@99M`a39L8^>L$PrW zhiBek`ww5I{^RN7MvO%5cOb^(2c$og50w`8KXGstMOus(0LB;w*H`kw8;jX)^Co7! zvy|56I^tNPt@E+uBf+I-?8d}#Ly3jvPcOJAQ2yK_$TnZ<1hkc43&Na4qeFR3z&H&6 z=X1H~w$~W<8c3;V$qn&18OP+(C}f%YER9BKjk2D9tVYKg+8`*I^#8-L{o$|KwQD1~ zBSCMsLU+QlkB&=yLdB=qp@0NT9Dv)?A6?b>AGHXUQHnTB&O?DUTi|?O3aEm)3kxW_ z;W3$L`kBez9rA`&nMrCi)IK1 z{z|V3RM9=jGhc!6{cpJa%YNuSV+?BCxO9#bVE*wBOc;W3p6TQ`;e->?`@Vvtn6~;d zesT=E=byBR0=h3!hDbROONw0c03(Nn@l>LK957`#1fa2h|sp-@j6 zpacUv8|XIx<2cgSk-$rfPu1_)g#E8%;j2F_yyfDTpfhs)^mcrDFN#on>AgRVfvPMV zdI59}P*q>#tfD`m*FXU8*$Ia<@W)?{<1AP9fv!bV`U;T-in=n)HeF>8p!=U>5lCrfkXJSq|i6SrESCaSOxpP5O zv0(S{m{^k?HY|<*BAmZPSz7`h2H5(!w=mgG8W$W=Dq)g}06n$9djp=pq90ztOW|m) zzIz_mG<{4qgdeXN$px+5oV3qy+W&A5VV}0ELKPhKPuzTlMNKH;vV`_1u2&U!VC0FJ z(y>>%L~^F6!cClw-|ahj&`$~v%*$@v#vcJwr$R30RF9<5DgM1ELXrwH&*))De)xCD zsy=k*e};l=&hd_kyl@9h4onuzuc7HhuJEX`yF6li@Hx-7s6ht;vJ zP4Pd!d5l+P&*Y#T-oPRV0!82*1|c$4O^&;0B2rmq-2D##uD<;+-*1aiA;HKVtkf__ z5m-egqX@H-$y1N^kX~mS&A9CjSN@`_eR+ei25pLe06AP_3G6C)YjG(${l|k!M-ct zw-0!9U!e^_KHsnYtv~)2pPsmcEh9zmJMYl_(o1BTnm}t*SC=ESiVCdO$mPqaKIBlU z5Bet7S}LbiLIqrXkRLzm#y=AzOw~mY`1uR{{M*8{yL$%bKikW*4{ggS7amTuU_Q3H zo9_%AMqP6gf19&`J?k=r%9%C^7$s@{>=`qt+T4wg?)p8bbr`b|jK*5y%$OkYcX*S= zN{m;N+vYyznt9Xhe*P?h(O`^2L~2c7Txd2_vdF2Yv0BnS?KS|eJNY^v)^qfutwtNo zUK4xCqImYh5M`93OI4u1$AA1dJog+|A9oz=zdxq35+kMaUC;-L3l7j@4ANSpwal13 zo2-KD=AQmAV2$g)+cAO7jl~K@R?Ni)3XLQX3OiHM{iLJ6K|j7arLkX}KAa#3XuR|i zXRf9WO^KE6n)tdFKRv_y0IcQF=R26YDCUGi59W_AwsFF)&yWdX2%O`?O}xMw!9PEb zXl=<+kmHsWYkSe!qD6oeOTp?wxjmB*> z+NoHrX*%yhY!I+^`Y%u&9Som-7q&LXr}=;KtB-yG^MGCb`1Pzz3BN2T!=SOYqjU_d z@TVjQS}_LhGf%<%iB!Jz3Yqo}Y(7tRPy=}tFsZkjc*$bN^g^N&N2iqJ`ix&#bF#Yv zMz6(m{EE1HEuyoN%0X`b1A)X?i8X?tY^2i+T=TK(*Sh&j_9CQ=t_vtgkASpF5)5rF zAR)1=>iiO&Fu74Ycw7(GR${H>z~&7c@o)yAB+5h5N7j!lXike4v10LJ^zp}|o0^f4 z^pIQ}vm21sAdF4-g|wEJfvLe{eG9}&u-XehPrsF0Vg{c}6j?;nL%88`x>g99{`gNa z<61G!kL*Opij@GY+2|azYUxtvuuRZ@QWo~%2ua3|e-@0xUn_X;lU{^0oOHx@_`~yp zllJ&CnLuI#fz`r?Ap}CYuwSA`I3%h^F6jWQX8L`CqxW$d!=rx{OgUd5r1MZpVq`cHZFMP=V==bi6f@R%IICM_%fc+5^?pVZO{KQ+ zHrrsY`zc(1J$CWpQaEmrcRHzma9sm+xd!f>Go2lV?!@V1PNVteo3YlizHK=|Duzv; zp0?w*1=E@F`3!a+wg)s&I{sFpjD!F`hW!~oxq^#+JYBOh=S-MLZv7YJ7cVDhDyMSH zNH#24!)JOhn~P7eQZV|l#~_n&?TBNRoplxpxaFpsxMIqb5w-)rWkz6zOlRX=$1t=(V9O;YVF7KO z#)|iy09FaN;wQ8tg%`x`8u}<)7DzqRN?YEU(~A&>Q;s^B2WG^azW3vVfk+!}wLnOZ zL_#^6KVg1lP%6M$fs&G^UY2MrQBwGF8liQm08pT zpwbOY5~;oBVkAPj>!{jM%({IR?avhLWd-afpTN(5fo*sRb z>T|hq_vzHxa?HAo1WI5VH>2AMPI>j)1SZ4ihB4T{rYo4nd5D$wA`{{msf6kK3jlys z2b_SYsNr|Z>e(U~N+>LIdpGBRErzh+ouz0Y38dSU^`lkgC}Wv6EXH~QoO0DwY}mMw zb?eq~=DFuGZ0JzNwzi`4d1{`#2PFg>^%K;!ShCh))iUI|tFRbE1l?ys?T831d$3kH z&C{C-)+FXaaxYUR49jY1zX5m!r{0G>+~tDH ziZW6bB@J(W&_fh!&OG*X?s+Qa%zYlAtgIl(gwQCJO*H@)qtw1USR>hCyx^U=P5|sM z!EdAy8ewz_RZTPir8QE!(A<`5RSBaN-*5M&a15kmVJ8}R9D?j407R((Fs1Qbd>HZr zptVvXY7*Pj+o?ASY8xG)fB8E>*=c?gPMH%VWmSrgllraOxu~q$zATM&yB3W^T8Xd% zVI|TCgmurAE%p4QX2aH7!>?|`PQ42I*}~E>7@+;VCPG_{v6`xiYBsd5XJN;Db_^!c zIDTt4;hlLFvzU&27o!G`LMqSbUWO}E7=LAaY+ottw?xqjQltq<38NL}MYw##rL1VW zieUaa>g#*3N)o+3hb3d0IJCN*4KjB41+97Wg2Orc&tR8Tv3m7*e-SJFFhzg_UO@zlxe-FpW_d zk`-8Dj3P8Db+iqykND{U-nW5b`U?lLqQ|n+*fMt6+;aWdmN(zsE)|6De6NS=-x$OT zJ^kr#O|Rm{-%5UUxuA8VpF1P^X#!}KIyXtRE$8#Fkz_^nA3@~Flv%PF%Qi=z1BBGx ze=4?8f^_qrJK5yv)jP&pC^^lJ>=bmsDcRwC;!8acu2%RJoD$xMk2x^Zr7eyMtetQUB z|4`DK7aY2`V?rSd0wC2O1gZKZl;G1E#g1LcidQ5Egy8+bg%z|^15h5yDh3b$Mc1PD z1zv^T<;QUGA&RA43Soqgp-SX@!Tr0qa>u=r=7gXGp=?! zmj3Q;YWLX(ausZN>Iuf2cNsb>Sl7OenyMPK(NL2paen-L|4r!P&35AefS9EI23P;m zmFw8DYZ=XIDSEZTFB~l;=2O82zjM(_$z5OG%|SQq#A5vk(^oF!7_R|z&4-|&j71Bx zTy;|~N-8dVX&!g(JB}%5okf+9+5YRgxy{?=N;Fytpk@8bl3^srUsReK=~LRwyZyN4*! zTzJxX-1XI?N`t@VANKUvJI~NN(mpa@Tf&Ck;>gmEl|GwBZny7oka*$UEh-aTWg)Sd=t!HTz?1-J?XO$B{rrJg~TOB2o9Y5B+vcs z2$WGAa@^zCv12_53o3G&EjBm&`Qa>am*valhK}_Mx!>*rQ8!mSGoODv_MH?Jy3-Cj z@ZGb|W|v)d;b{eXYe|oaF`n6tk?7>!`g{M(8ilrsnoPt!9uK0FqOCLJ*gs@Bb5bwo zPri{kQzr4Ds6=YZtUq^i%haFn^isjpzmy?0j2&DC9ewDpwwALGUBkY+NN0naViTaC zi6-j4id?wQ8i~ya@>R#OO6`PMA5dA*iQKq?hKDbqcDGYlJLyDv4!((+4-bWMh1G8S zmt-;wx#)bin< zn|LI#*}W>C*z(Fqly_JnAf5@CR)twofHMCpP|{$$<|h;|1E~Ob_g(C*w_;bV8khl# z+7Cb*tmv!BZNR!|KSOM6W7Hr2%(U%qWY(zJO#ko} zSPKm4-+yDRgAW(?V-xi|CNA1*o-qFag5ZebA9E&x(wLa}Yf6nrLJEPGfgI^E)6icByoOXg4+1o}}ZM-%?ME{pfCnym~v0fxr&& z3H+RTVx5Ldl0o^vkjl_9q}pv0je)X}Zo`6ha7MBcvWl@IYh9>GCmMip8h}!? z)VDa>UTZ$yR`QQ;_|;dd6uLXs6hVQD1b~!^mX;Q8hiQVq+3xPD0B18XR`rK+3Xn$8 zQr+TLckQtTvV@?NR;5r%qg`m4{|ri648;YoJM9EF-U!!T3te3$?+B7)cg5|mf}ia; z4QnmEZ@taNM}AM)$dRBmZNI(;BPH49W->#D@Wp8-GWfJJ+3(PU+3&!=Q1?`w(}4Q) zKO1H+N)xo!d~N%cC%`h_f1|XIH5Zakq*uSGrot!O5ENA4Ak&Pok@G#EsHm5OIk$Of z!k&_UzF$Y&X;`sJvEoa`)SD6m+$|u@*=Fy5QD~zOh}5T{{Hial3-f8K(dZQ1BbB1L zrX`(srJ6YT3CYQmy2)e>cm8P$Mh)^ILhT|YMi(47amZXU~xQ$7P$`R;$}| zYr``SVtR2{a{;EtA(vWD*#qY~Z721BwJiIW(0%{Tv2ZbnENO1U!4+WIVD)w>&5#2Y z0VjWtuSRbcBNB^;!T=%kEbNaigZ|G3`VBzMnl)5aRTU6}cin}#>Z$?Xp#~_w;`3RI zY#+)8J8VU#?^jklPWKrgJB`StBzFu>4!RsE^s&$r{O z_ejyEDRkM-TbOkSSkvoX5LSVzaQ8;Rl8@oYiG5!F?=%456-w!EQ^-?Ag5EAYMvQ>l zZgZ)*Iy(!3GC}+aK|cf_xN9y)*U%|&E|?fhlj9c@n4W))eiBr>0Y-1!$e?ZCX2VCj zGOw|*A9A#B*8zeF?^xSj^h6n#xH5rZ+rBvL;?IEnRu0ZT->q0<#*{)DzoG-lSu?n);k+}i`2PLyZN&I>z${xIlaZx1VF#1Q`W%GEsEK7?O=yqcT4 z-zSUVGBuI!WZO7u*CCwzi67dhMXX_X(Q0;UHN1x6<-`rX&5l<4pIi;sHt???0Nyy#^O^sTdWOSLPl^Hauc9z25rN1d#3bTHGlbbH&hRD+p&K3 zGwfAY{o7F5@==Sq>6*d5?-rvWF0Y`xr@qDhb*;TyhR?nmq9HPuRG8 z8kJKn0U*=WMpac+>iiNN9Rvn44Ru&!D9e`7bpH8d%WE)N^ZD(!I!yjHdlg3CdKjiv zSgXBI2|{>p(|&x>0RW#-Dm+vua-$m1~Qq%Rc0#V4#X!_9q zycshv1_p1}2MV0fV1f-W%F&_E?U2;J_H}Y0Vd_1%G?`8+3Hkr)kGVHif|EP*dTCZv6&y+uC$; zm9cc+bvGu`R8PH}jL%Ik7B0k8HV_VPMgVQUT+Pr?8wv!i9ZnpN7k4nyq#wc~tRz%c zlX<6y@UuJzayhV(gR_$n&C~hA=cjtqnZur6GVVV1thpBU)bzd+qOsIY7)cH=8vgp> znfzDf_59B>=VJnkkzlmNe*QUDN>*->#B+T{7-bnYC~(Z@NoR#DKzXH=Xde&1xLLA& zMG_bH&e6vt!DE|%LO=9SfoYFE+V!=irJrVy9to7SXQk_m*N_sXFFqIM7p6Ff*78;` zaNmkw6Mo!8eftLDwvCuLrhHI6k+kfb7d+9~Ot!ohC7q-B$zPw%p{L%#h~@^8oNj0B zJ_M;Pr|vwM>z-Y~pqfl7e7+Wn?c1M1p#zQjLPA#``mHL8;}=1p4N!ZkB{Os-wWn$} zOx2iPNp5FN*%p%Szm(E{5*E$2wiYRF7AyNefvxVJ7$gA{8A(vyict`+x|9qgn@`fj zs(n+qr;(x7fCP3o`j8q>R|EwU<%fpT!+N-Ho0olL`Un!gU)zT((;WVu?SUPizF4rOQD? z^t|^zS*3ppW^HC-F?N6YR zU(wDf{C@FdpO`~)$++LJN6j^`yC!-kL=#Yr-&22FIqU>US7l-gx5m_>6&QMkGKe@0~}%Ux)6+$>X;o+p&i3g`X1yA-T=RvT?yLy?RQK*bS!z$w^gOT8ktC?qSS8SFRO)?CLUD-zFdhftXLvc<3S6X(w#H*Uf`<8Jg2m`>QpDY{$kBR8=FMc#Ld)eLYuRc_qu2FHezlvM3>k z5E3axzYIO2MvY?DtXb%F>j?hx7x?+lvFDy!fYNSa^^a z0q-n&oqTtmiOt*4Ji3Ohw_U=^uWjz3!~x*`1t--u;@GKnzrKfTO%*|PJ+`a@{ouoN zeX*3GPdIsaJoYML%M-Dm*cGrk^LNpT@U-?-7A zcpU+Eb#+0Nhf){)iHbIobB0O|t}PZ`0{e`_{#0P&K2T^Vto+6GKl6-xcIKIz6acQg zH<^-*Lz`eaQG|q))(L>6+aExjtK{(&_3V-zOsF+8x<|7Ah#FRISdS2Gm{4=X8F%_n zvqDPENf-YX&`{AphbrT`S2m(7sPYO_f@Sy`0gxOi6xt|M;MMd%Vz2e9?-b#n-~&LR z0ZhAQ-K7ewqH-5ScDyA2h9v*GEX3c7=syXUDo_6;JO2V_t6O~i$s!c^`9oqUs^7rs z(@vw|$}7>!m-~oIf&Y;G>rbwkQKMKiYnD@h`a)@?DlmG&^hrvt(ZChXug?>9k5mKHo{#g}pZ=RPoUcfJB9!E=M2Gr-A^ZGel zJn3TEzpRZA+>#gP=A%! zYXvsyGyVYHJld4@moWN(haz41UACluO#mqE9CvN6%;wRFBU!w@lkQ$H%JRvIPg&4d z!}vHtNX0V`p2NYX-r;CdY6oSOhSy(zoxOjwh_JJgOh<&#me3ePT_rZ3@2>_IgRa65 zvwl4#P-v@A_*MT00z1?*;#7gXp;VJ1P^k%EVx8Lf`F9jlO1hpd(0_u3pco(FfmDsB zzr__djb_;zk-~Np4L7+L(jjL>@>yxdG?(-D+uz}H&LGLEZ9J5{FaMP=f3g`!6(t4j z3#E08@6v4d%gt9L7ywwe4*S$o*xT>Go^hH_aG9+7vfs+z7s`ro>9UgSr>j>q(6wzl z)zM%&%bVEHRl)ks4aD_5w5_Z~3Y$6s!Jwijm3St0nP+RxJd+K}mXrNr4c16{2M=ZN zlqpzikx@i0E6~E30G+q5XHafvKe`T8-oLkKBanBas2R^>{WRp?2*B~ z9U=+I5jxxK>$s0FN1O0g&Vy zv_`nycmIk8;7x!>m$fl2FeoXRA7qg}-TU$t8(1V2+44FLo_sq}YlKuNsZq+sd{{_DH) z7n>jk$ZpuMiL9_+qdo;ez-OO*hB^Eg>? z9k-Khe7A-hwty9pOI*;`+n-#Oaal~;Iwa?$mT3fc+y4Difl$ z3s zx$^t9YZSq!y}b9|up_Gr9MOmIzwWsFOgL$rqDL0t*b$hb%}dkw_jqMB3 zLYSpMX~nk(OTOLE$L62ynZK)uko!P+4SljQ7c;F_8NbR2XcT1po_i8V?^g%_<)OIB zCPG&@##aU<-G37l+xm$x*yGq+P*U^u(^smmd}5Ky(lj$}~=V?&1KlCU3XCRSOLl{L-Q>a(&Y z_PZI@1l^s4Kf0Wjqgn=r(k5F?i=nhuI{?PowFJG5v{w56cT*OT$@1|d6R5B6Mr&BJ zK1YMK)Yo;py0t}hTVRP>#bQY?xPegT3A{ZEP(FBw+cgG+VMq`Jl#LlnreUb_8vvE( z)ziDP%ga}Y@s?q2u3$qOiA7-&53O~XbvL|F4wLhQ6NVG)*Pb%|qi>!Bz=#^ZuihA} z3Ej$XL#!>d@t6wOW{|?#mXx@XdTDj5)d4L@yBszlA;6(~!_F(=;5x-o^({rjDdAH| zaF>K(3I=}#6q!Cy=F?7hA*DDXXl-??vQ)Z zkV-RbNUc-ty^1fjPdD#11DB4=aNN1~GJ50?4<#R<{r_%O-(o1Vktj6ba0xYi%GW5D zqKv}$8{=IdQjziXhXX*Nli0uU^(QN{!mWWB6%n=!@lgj+zzrnM?L@#S<^BOkE3A&F z0V>O<^0VKbg!UWkl6^K>JE5wLcB$x%&q(bvR$FWN!;M!GFtf)JnNqZ$qJa8KV1XqF zK$BuQdnVV=+cJ!$U%baIQ+L^PR#GUyD~qUU-6#FwiVEDHUikY8e^T_j z6dI;t7aEfW7q8JyiegGS@b`U=A`GFj63WY=y3YO77|`Q^{(Vqvea_@)-o$qUl^Hnz60rBmz?x2vOpDyve#>H%QYjKJx!>-u+Z8HEsDH{1 z44iEr7w|&d>?ZY7yW7&(DZXhhX==0W)U?JEE`#%b~8r=VR6MGhKW$_Kb<4t zGNGPydFhO#Vlk<|NQel3M#(+UaQ7nKo7+t7V8srtu%UmJ-Ax=>V0FjrOUL*9!cEXu zXXH)JG1s>7^J9i^{=q|v%9obg)H{?hTyWm$p!2TMOxEwDbn)A-@SUf}4Zr?~U%v#a z+n^%n+AS0XD7oLDm88uUNeXRY$Yo){1A|IxF+hXXn6+zZ_W+)O&V=YD+}wBYNas(V z1epo$e;3MsSUw<{H1qMpCB=17D(?;RPNz<_vt&@?CJFn*tB#~SN)b&6rHF(;N8My{ zRV@C=pU7p(fC5ZA`DY(wytfizCdc;Ld90Jv$gt5{o$^=5-M4&0+nfHE1B z2}}O}Olix5Q@i241>-mBhq>;qSGnz?TVdiZkj<2&#r}$8d^Vf?kFxR(GTr2ATlwc| z&Gutz{_XNo=DF;$DSqI6R#~n5jz^V7SX_wJ?<({-i>ID?g1xqc?MK7hFW`#}79W-O zD~)GK&0*evi9C_QdHUd|GTPta$qvU3_}tS5k)XZ#JI*qS6#Dt{o$y{u`MFJBIN1F@PLU9TxH2Hz+Ph;hp` zV?t=Rba(}gF_PAwZUZ<^hmX`LAe_fErmKR@)mXeCP zI>^oKA-|1{jl?^EVl6rD-TNp#^-qXh_OODl4aS7v6n7EnPVhXBYmca9;ADHl#x`5k z#jX;ic*uaies@lheMd_Vj?6K9ai-=@i5Aem8-&qBB+yp^j%X+7RR8+Jyl}g$2WyvJJ zpRiB#yv6yj(@;ZcA$+v}+LOjMfeGQ!>2hPC@|PET8Mdfng$=#F#$c2}Em>y0!_J8m z0!TzTV_@xuWHdlY z#}lcHA+8l-(V`wu*oc+Zk7F=2wQaD9uUr``5wOL^09iL5-LD@yCns8Z8DpZH4{Hb- zkn1v(U8j8}J@E7bqa|KWUz>U7wv~=jOGRb5($#o{Oq1pWuE=UbrLFB}Ti>8E+8-g( zCEue+K>Gc0?JuLd8&<7q%;vUqn4CaZl9@2{u7iL_6AAkD?@xx^(?kA^)+CoMbu|GU zTXHw~l~NMdfY62l^6}|T001BWNklThXU{8#BmLo2GnOE+d z3S+jirq<>+zvs(qNc@P2mt)pEkLhiIf151c1QYnNhRVI>2f|RXWD7uoQf)uqE5q~DEiKo)LR<62lVB^4!mN^o-@Hce^6HNEGuqP}K3TzrF`)WlZhoVUvuF9-F-oU_Jb|_JjAMmXuBvTVE?$R&ZV;qB+~EM^!mw!jJnI3PB*b)z4?N5Q&SJ5wKCs1M?MrM<`NISnjED$B(K2#pg)$&Bl4pVp zKD|JNKpZ;=g!TGBlDp%M_*;#H>YDWI@0^SxC5Y{rz<)o-#^|Lj?`EXLtF9(@`gE2o zSwclcMFgztP1dyY@EalMIOGr-!dU($lt117Zs75}tmr_d{MuBA(o$j*CzA88f6?~9 z!_0X06Q=Kc41spUAllWLSLtJ2c|Olv^g5h0*=7uC*scFe{Vm6jSFYq|)rY_2vhG@cLs#itUwR`|k1P zR0@+yp_3^KPztLSccsulk{lt4yH4=HCRFXQ2bD#I95Ti*d#T}@`G!Pb@U_8Lc8@88 zQ3fvnI^23vrK{RT<<)&3)7}n&rG$!N;BE#A1xOtaUU?qKJdBBhk;tz*dF-HoiQB+? z`RDM%tb6#!{>O6lTLA~}QiL%9UM!!sze2yW>=H3jewiKs;-10yF{|_$vG7bRe9}?D z1#W2+pxA%udJ2OS*KAe8jpGiZ#j7UQdv;?rKg|HfKyIEwYJ)*f%6pWR4N+m z*FE^4U1Eh12q}qIRPgQj=UWRPzW@HP%{Ih@BxlML_GJ?)?WT&hBZ72^&6zVX z)2CzF+Tag=!1D}a1{o3s3z_z9r<<9SJK8-}SO8^jQlV57`pg{t$;+eQ%{Mo_gzl=?U)Js)uT+y|&0b0QCYaVR-Lu)ei`!w*?S5CjYyn8RCd zgHk8h$0BhfV8*iIy(`yTV z0GN%SHvTH*4+ns#VKFH3_}D*;(Ul2Gi?-#5_I3Q&zMctX-2~92>(tvSQlXzhbJ({p z(SOz}q@2mBGH0$ZopZ<#T2m>j#36rPsPsXANhU2YDg3Of3lpSJN!N)=L~af7IG6hG~JNAA#m_lz~rp=kD$EW6|uVlnl#Z#B!KRE zdFz=xwbNSu_1>|>_ci?K=zxZH#no?>@#&-QV~k~$ZE0y?X)H$Ng%{dNG!BXya?zE) z^%lyHbK+&6IIxe3KtKKa7V+#|PrxZjgp#DBAdrHgYMzRUtOm_Zy+`neChfrIrYp zgVBA+%W2tU`*)XL449E4ZEnrW|G{|HVr_WmJz93zi9X$++=b)DQ8acexdR8HwdMNL z&H~u@`s-*RDA{knv<2WMvz)3b%4W=POMu2kMIZKMMEmU-Fq;W@3!eH5} z4Q2HWh#G|NTVgnm(T%gV=+q3IR~|5NdzP* zeEV(8#*K6wb~w7dt;gVHq$ECM2rFmJqG1wTa>yktYhUI7TY}R~l0&8^d2HW+Kiwgy zKTvV@f09fsTFmt?ZHrWr!KH)w=;n`DKpF~bq|C~CGpQs&Zc(IkY0gRIfIJeC2|M!( zK}uQ}`M>+-GqD+N{p4rFiYKV}<0;mvat_zfSGUUA15#4(;Hya^eZ0IQ@vl7$dpm**-{lg>|w@3x@04 zw=Xx{bQ6nO76BHGXiP>mscnX!w;p6Igsx_EuEBiyE-j;Wr7Q!=Jap>RUZMOtnWW{F zSI|K~&83%SMFGO+AA86lZV4bItx{5W)|rTd55q|3yfNvc)-D=A+KZk@N^&M>E;}Q} z(hY{a27bxJF)wn}+h;SkX%NFI7IWJHw{X{|$MT;a_evKaQ82g?-v0~icEX?kw}pQ8 zreD7=Z9)O~_#D5*A6VVFns-)wz?oa0LS=qsj}8R8h9{6wRiwRUy~?=RuSRRuOekoC z<(45?h(&UlZNc={m~v&;eGc!hl?^v(ZR6E;{bk%|U@ATI{&oNeXSDa)-s8Tt_tBJW zvJmR5nO`7G1}m{ihe;xfD}=*_?-``Ptr^4he7K1MXV3IG^&Ow} zP5E3iy^N_vOSyimiHJj$Nt2>R;k``As{>$ZV=NnV2=`UWnd<2QKuD|nDG`v80pAwD zSzDK}!@2~M_CFNU(16a*&+5Z)={I}9Db&rmm|*GBtY_$sy^o&FL2+}23}Gf8qV?ah zp!a0ZJvE{>R) z1MOI;GpOhTWBcD+FPM3mqB4YXYu)?vLze{ka`?6`h5)YYS< z^-_}&v-aGm8_Vzm*z0Zn06Amv3GlQfbMSQNbygY9r;G|VfyD2$9oVW{d8zefKHm5d z1%4s@3;L&_)UMJ{lm% zZ3I$KRa{1(gtG($L0*dGeRI*f?}jlR;es%;sH)bQK|p?IE0h64WCpqqV9Ys7IqCCL`5P@g zo~}ELlWyle&~(>m@)hU+Obk+8PAN*kPl8qu#6Si1Jjc~~CkAZ+1m~U1B|ltZiIV+{ zCJ%4)3$(hcF7F9Hty#YwxqLazW5)DA-a+>B?|MF)WJ7Mc82XNfRjXD}e^h<1V(|Ts zJ<)yParpOhXf3Q^%fXZB`IPQy4w(UKTdd3^NFO`w`^|XwV=4+PV^yZlBJ9K3op;_O zT=v)WU;iab(y(O>nl#EV6LA7bT6upzAQo|&Yu;dws%e)os)u!%N?5VtSWrns?aJY$sm+>WBgnd?(u z{(HvL`qc0Dg&nwxeZGHgI|}o|^oMK+u-2N^whrRYJj1&|9oIbc1J_i3OJT0h<*WO1 zX1_KjOxS^g+9pGt8wA6_P-{qNkg%lx9Xy{uiYuRK=4t;G0(?$exeM0~U(BJq)v^7f z9i+kP;fsfzkjwb%uF7t2jb(Or>+L{Gf*^zuOOkL3{&Lrs7~#{INYXH@fPKDwgC&O^ z!;Poyo_+gUu?17^1TMGYsP6=Q66gxh_jHrtb?dsdf4aSL`}YF{i4`k)3@G7u9+{Cn z@BOdsSNvO{z@xh0kpuq5y)kG+GQW>zevP8BkIgv`tM;ZLpuz$+v|!r9y|BuO|r9%jq85E2WqP<1lSnE-~T$oLQ)ls7*e*`wc!s715SUXgV&!L!^8^@ zA^H70Od`P%wRQBVDdUarySTQ>Bc2~4z>m_ZLrC(n> zLn!gRp8!x?oPPhyZ>grL=~DhuQB7%S>1N-*vC-CsIAX6l*Z@PVqTDoo1;)VH(oM{kE$UV$+X+;R&>3i`OB9j2uP z`Tl!&JMIMi>R7mN;r}n~_nV-=Ngx-E-_*#ETFDl36?^4K7PJax4wSq%B49&~%juV{ zIh24?@1kJ2f$5@@X{D6X=AjqnXz z<25#?EDl`hUWGmi<9Hr{)I28t5AXZo6nyp`v6dEeR~NbE<#b8dRT@6oemf{hLwZ9b zWNncLf###7Q!w+&DgE#*XlsW=7pANfsbd_GNb=vdF|?*UYWCO>;&D1sid0vM_z!c) zTs5_Hx{_YnI@ppzanvsL7-P6|+I;ZH@Z)I8i}SLOmf`y^Z<5GWOIeoMbY6e>{?Ss( zKzl+sD6popvop(C=XoAVDM}kxqJtDBNI_+lLjnROgOyiXxN&$4%auhX+Z?$}LvaHn zVaCEPYWLrdegFMDL;Ke-^!NL4^8-KFDDs>|Ad+|;@ixaW1#s z_66qyYYPq6x2)pmV#QXu3KMgj4_a9GaLlEJtAIJlfP1%VBQ)|!U%e+H2x*c=oXz^m5e zOpvyI-bO`Hkzl(f$<|X8hkYoS*H7|ggW!t>!Sd3;R=;(mjwo!cd6y%dXw`JJ8cJ#c zVtFBtdYVfu;?(nmP2&37I;zT22tQ$Y@3bT(ptR;zN>pAk=Z?!kYPj{y4n)e? z#BN1l6Nl0vO%HhCvlVD<tpDa+WX4GY&R zZfa7DFBTluM^PCMFrJfN5zw3rc&1tKd~-l2g0W=d0CM)+o3fH(;-j}uD`7|~>)I?n zZXYW0a*6M>n^SHHI`_A=UoXlZ9Yqp?uFXS%HIQ?lBzQ~Ul}r3BC5byF`IiO+wTk?O zg55U=cAYI*mm`@~r}$*BVD)waT=uZ%SWP=R73OXq*2U?(d>?YFUL!ZBmjQq@tEzes zJa09yoG@GK-fwQCIg!I&4gbf|)!OIKO(!YZc4astCr5 z2oTC}z-8+kFP&X-2%#N8rD0%goDc6^$c6vtA6XUF%CX5vzVEw`XNJI~?Chljffob> zfVvbs&#~f$*?L)Y?7hg3v2`EYc7V3TD25HLNaM!FUz?s5Q#K3=z?Ay|7~L0Uym2hX z!0|^7Lyx==trU|7NG30mytZEQ@kYUfa=}5*`5-)AJvQKprhw&LE-ahlI1Pcq>n9^8 z`~kDE4SWx=aFLA?b#+;;MIi_t`X?qg&qj`7KEdqo@XJamzGgD=;_h?Ar~m}{%8{?)Ov~O5Kt?SKU$tTR6w83BnPhzIPh!1@}G-%@x!pCEsIU; z+mlH)J%xAPb>u8sNXqlb>D#^YvRPF#uQx9G&>7^iSHp`eZ5@o%ihTw?%iD{O?Dcx3 zE$GIE*Q^Eb=R<$w+<)wVG1@u}>xUzv(GUY9C4tnWM5z2aD!?ISIvdQE zPY<)fY*Gj$sT#Q*udONJQ-3(ge)V`-F=KIzWy40Y?T!-BVv~2c;cjwD4Qu{*1l9k3 z8OHi>bSt@Uzrj;gNAmF!!G^pzB9OfG-FM8~q7S?0XjCeJNO|PNeRdl%kahFEAm;Z+ z1kw!v={3DjnmtEY%tJDz_;%?Al+x_ERW&;gEyozcCqJx>l5Yqk^EVEoy6F<+%B40` zCL~%4o>+QpMqEAQw+o{4oM13>`II+;nb!JHHfKahLo60^Fjt8CptWb045?I<5$DMa zR^o2`zsd6Mz4ZUw8}DZL*dmy-(1Nr=uvTDe@|jc$x%b{#6kRAqd_+BOebd1hK%=Nf zaQkeZ^R^bOP6_H?1$A6IMhog*fMq+_IDEJSk=j0g^4^E=E2>Z{S2*96P4zWeVG0Xv z8SnqTib-~5pdGAi+21*Y|`1 z8zG60aljWX$o->)>J+L`;-!-0x`u0s74li_&djddm6lO^!5h~AI}^sXBKavsx?Dw2QlIrJTZR9)9N_XZnPzCqqPIt?ha%WE>821j4dP+O40pqgAr&U(F5v z0o>jIm1TwnE)BY>!LUXdRtiI`(2!Dw=BuxwV9oca_6}B0IEa>Q_k!STZk`Pn9_}Mk zT}f=#(Jm%g>#4 zX#ExjgE6q*{ASp?7NI2%E|x6Z%H|^!d4eAf3K;b-9|Dh`PHCrfO~C5Fp)oy+nAAZ0 zgro6y*a?OXv-tj0%2@yjUOg=h z1#Z~)aS%zCym3-w0hAun4GJuQ)O1bG9szQt#IFnR`v>SJ0%G3@+R5kVsGQqm9pFGdw^8*j( zz_&HZcu{4ei1#3a1HoYEbIpxZ_c5$K;vj0KzCp6hgO8d4X_psLN9C^qp$Uw!-fp3| z;AjX^AMjpc3uNvfwr!h1?%2M3^_C6kDU){a&0f+%Agw>7Zy#I6efhc$KK@}H)_tKP zs{yHLX|AQDB<*$H|B|(sARrZJKAuw5m}qq@&u-{D-GDf(75lu{QSpDIqv#Z?6H3}Fa7sj1R$kg1_2VuKE(mYlnd%} z0?fs>0?+Y5z#jR6hnfQZz0QGpjD_NM+;%rbef#1YL-K=n$s4zC)K21y&oNSwckyM> zXB|&GNYObL;CUXcV|O6=uKZ2yw>c;!xrGH1)3 z__}&GR^`{xNiJS81wlZLOrlF|NpPJ5u`?uQv0yjxKm-LHAKbHfR@R{k=2#y>Y`MKY zOjC^q0e`#Ucz&$i8YLAY7Jh{<64}>xg@6!+65;yMDz(v?Gj18hcEdMv_7RJ@_r-c9 z-q3(C+E%YI24WW4?8h}R&*dI@r19i3L|FB<Pcs@ zpbbeOIeD*P7-P8Vx$p2i>+G~)Kx;7&qya6VUoLCF|05pW@nT+j)he+-Qr|~#O0i(4d||8asK7-5 zEG2mVT*39l0sGbnZfI5n&1obaKyup4w0!X?rOoTeKjIkMR-xRxc5A=?Zq|SCF=}lS zrI-B;t@Uqizs*5`5eWzqn}-7D0&$TdSuudcE%nSV-J0(X*@2dLAB6UZOGSUB(JF~7 z#?n(M-+9jMI^?&ovTo{nUkJ7qYi;axU|mG5)cty66v@sGiu;t>KsXl7Wt8FPHGR0~ zfjYF(6!o!W4N5Dt)C9?P>ju=>P|CjLInEUOWhkiad5yrQyu^`8C~S!;g{4DN7W*R& z%v=LsUhpou$w8sD1`-Hq=vPzhvgMRp2DnsKVQ0km78GGrU~%;(?htVS$v`5tp|mI` z%adHJV!ZNoBgPnN%JMN9hi|YBL#^%dr#qCit|~?>*`J2$*sps3L||#X3kzZ>2~zrz z_d2@5vuoH`-+pK*@f?k~1_&&DT1{CDDg7ufBc0M~qJ*t*fK$ri1t7_ZCk^9-Lq?Fi zLE%>V!(07*naR2naR&`3qGb$ohT)#GWafDKz#aN;R1aq6G<-j5dd-5etBbeqEB-( zc{}Zve(%1u5Tv4ZEdKq`#Jjr4Ip}aJr&^N;5Gf?1H!92rw zUgAVd$u5x0w+;l7WMdC|+o6*Kd-?R25rEDQgjHH18F3W}+LV)~u-a1V4}L|hpTnjx`e__xFgG|=?bd0DeeL&H+u zXHUlS9`on-?=cIZv!SFHKio_rDM=;+5=lu%GT`5r_e(P&DMb(jB$G+Doj9=vEP3~a z|3D&0L(v1>3lzOOG?1u|u6k@db`Fo;anK|mb>mhirASS0nKC&O6gx{7bs&(3nrO_iV93l&L*#KY-~gVgELrhqcTX+rR2ISxG=LX zvslAt(>4KRE>zY^K;n6lSWHrqFF5g-o>0`FIK~~ZJ8^G|<#z^N;aOG&ALYhr&K&pMRen${0CvB*qx_+wn&*hL>&~K^W<@C&qcdos-DG z(&dfhjr;-gRXG=2^&HDyn*psYtlN4^Dn<|Gs^?a6?zvkK1S)b++M_MuHEr7Ys1CUK zMB9u?8-(=eTUAcX&+h+HVL0o8kTlf#N1nRU(t$tlcnC~M6U*A8aeypraSP{M4bQK> zqM+CQD;lLR`5D-PD72V;T=T{>9{zj<8;-q<;{DEJ(BUIlpA@{Z_$?YcSE6Jx>MLn_ zY5xbNAxX0Wcb7k-WHutUoBphrHjNv9DCF@ghj8-A<4DdPfJt_7=)fVARhRMZq9m8q zHln1aD-fJ;*fzxD9w$v0!}Jdq^7I}5fDHlH-L_|V`v}IaTu9Nw0b1QPvu1eQG6X~idX=)@F$9D1H+-|I_S?{m1EA$v+OLHw~?FK~+U~%I&6b{<1 z+u&!S0inmgjORb=r*Z5;oT6AM-?px_(F|=X{VHXTAq+Nx!n*wMhLQ$I!1qr#(9qBj z-SgEuw!#?0r?Xqoh6o;Pk!R_@3-WzFe!CS@e*>%j>rwLT)08EWsE&Y~&kJZw8vdTw z!cj~2q%CC-L4Z&o0!b>Bq@lr;Q*#oudZYD!B&EGatlOY1wPDd(dvBo(_2sTMqT8C* zJ4IJS{DMbpc$OUB@Ob<<0_COoB&DIY()*wKuRD&w^BT|+MgeN=8a};!CLfQFGydp0 zF5Y$mYZG~_>`ZX)+{akez6>F{2)rQTX9)Y>clXy${xVsCi+9@{Q&dRXOE0C#S)Km) z4GjQX|L$bu_?w6~uO+Xo4V_AnQ(Q#5_SmK?;Ent}X_X#9GT^EI%;A9D2lJ1|K4(xv zIbbcjKxkGrr5u=u3`I9tPHmeMrVxRqpTQFN~)#G}tH6vE9 zrn0&^TGNL!p8a0txsJ$8v{S&;yzgPxU3r$7|e~=Lu(_n zNn7Jxiio5$f`iH+UBwuQS6fg1eXk&IJ_e6G_Njb~V@HLN4ExM};zNwlsDg21QksVY z$oievJ1YF1gU`1Mx*}ftG*fQ~1vXTa#kuCbc`WW6$E}AQNlDv6I%dqoA5lrk9-~+@ zeI`?NCCLTt1VO;T2ao2|Q+J`LD4!pHY~;1q<}iIa)?|-(^lcO*^Eos3K&ER>NQGSn zfMq#$%5N#qVUNU(EFNFR_O%Bw@vb|$ulAC3*=$ED6Um=8mZvf7Kht~vWrw0g=mx>p zhCQWX(VGFU&ij!OC(L8)s2r;E2lC*a6ItEq@!W#xeA+aJm2Hax*(RVWkS;a>}vQHuX3`QbD z-!hMTt{8*@Jf$24K{{65o->Em-39<{2LPE1{tzE;hkVrIZLnUtH6%}vFNe9%_AAaDb7t>4*#4xmp}$wuA^3wJakys!PYa_W5kX;`rdGAsy!yZp3iX=4diqsxOe?7Tz7ma-#qy}T|yEB z0Vkil3$eK2vdf?4%FBPx!3S^4_16PZN70Tj3es!%P}_PCCJK)d5t^tlYU1e5r84Z) z+{SylkYz2i7@fPq!LUgW05ZL{PAbJ!QgXhO3=%f5_e)S>5Ycah{XaxX`u!}KagAWo z;7%^SY8_>LKBs?C0hf(FhYRF5R&;ngHvf56b~IZ*1GqvU*1_s|9tD#pV_I4;OO|5t z3y4jbLec8gbe?k#fvaX6vNE?Gbt+U=@=8;jEsHzxrQ*GcofucXf{j0IVBg^bY3N(R zMW^nxs6ZhDEx53;?l0QwTqi^4IHfN$s^UP~2IsFg)3G+ZOhJQT0jMI*+ zqbT2xCXmwehJ*%OPblWAQv;^GDo7;-o(VYZ)ZU?(nQ_QaF$$P%77}mL zC75Slu~gOJ_uLYo_|i+^sG}_X@exPZb(9JVAg0-O%)<|-&!vR&a>}l}lBVsNY1shH z8$#d>(QFsdkY}9Bu(o>2gLQ5IlIbFh=>ec86gATX4|(zF0B@H#ro`YKo{N4U0iHEbqcd$u}R}!BK;^=gN^eh-4BWV)W^g&-0&t!p5PW z^4jYjNBzO^2uQ2I%B|0Z+;kF=kZB))kY3~|Rm!dLwN-4XG%-)ISHHtB+TiQAU5wn% zpq2L`3*bSiXcmIoq~xDM^3oDPBHxm^DlJgjQmJVjpd77Qd7k9T4c5Jx+5h=Ma*z~! z^liYy4+$>1L=f{jFlI72e!$?8zFfckqjbt5Ui|n)cn@0z$c4JKP?-7iG5hR;nf6~y zL4kz@zw-_{k%$U|g#F+A?hIZkK7h|w3D)U6v{Zcb-#N^wD`sR&@$wsUIr*qDy#B$@ zwoLjLOYvhKZ+*Oo%q?u=yj(b9U(0d$^1Ex0!f^C~HJo^GEd{w=5Baf6fL@@O$NnMU z^G^lIWWXsW{1TKmJ=0(yarB9FOum?(Is=9w$+`LORAeZ>F=$(#QUft~SyTo#X0oD`U<(_@wu4(gm<(f6* z$BPJ5ie;-BY3NtmYx}MG?^aY*l@THt-@R`n;qoUt9O`C&moe%4K8qLUv)y)Uxp40S zq-oLj6kxnnzwyG_zb|XqH*`kkR=5^5YL5QVymH<#V zd`tX?pJl}RCsVfPW2n5m3{%j3PiyOy2g@b5Y#Ds=DQ36bvV}(o%u`QgDSv3LOW=pw zmQ&xio;1dL6T7yItKk~k_kE7q<|p(xcmKdak%R7v@0I{2`~8)+@pQivcsGez*#bt` zS} z%~kBOO^ifJM<%{ibfOtQ{W;NjVSbEH-tGXbM?VN0=}2J9QCY>;2q6gq!9x#z#ChkA zr+!cobLTelpO?RO1As;v&skX3MBkhRV2p{({SZhN!ltbiZGWe;GezCN4>)YshxqLC zT?tC96EL(Alrm8`EmsKc&*(p?1*wdsS{9{xX8*-W%U=+%SW2c81pI!IV6R<#j2VH@ z6KU*>@zne`cz@L_7PS6|3_94NVo16$ON4T@tjM`#WteTZ#k93!KK%r9s zA6Xiq?1K&238^`9?_mrZRKa!ket=XOv_*qzZGmm6l;n;_KEwA66{WT`*<({za`3)I zbS5Mr*~^ZjO8MaH^%3$@E5kO!3i)Ve3t`?!QDK~$r~FJDiDlVQY4U~0)YT&6C=e=x zl~!9)%Cc<-z%{pE)~t#Y)9dOYzq5nXfeL@}>BMv~CLWJWU$lbSdTQ=}0u98Z#H3Pi z&plSix8EKUi&?JxDN`_?eby67>@ePgZyRh`RofQ#>Mc(nv!8!x*-+;EeGaMc{vr)U z?rqH&E&;l~f9w2DDc@q}^uV^M0Vs3!2Jk#K9Q`bOqw!M#zq{`YR<^gHq>8HOgutC8 zsZ>V2d4X1%yupL{?4ytP@ULGmq<;ym9YLC~HLT6&&ckf8Fb!B~Lq$mrw@#Z6SR|i? zB1@<6iXaHjB|^ZHPkqYMPk)UNl0>4Dp+o!G0U*#w8FNc5>^i@<_r_WPm@sD|ZNAzi zczOU)(r|PCySZfPImG_YnMAV4CJF@;1q;16#0Pe+_mO-*=LTtRZ# zGJ^JYN3JVZ}9tEMD1Z2W+Wq3A4aK$-^{mX%NCOU`xZ$0Y%Jt{%m&Vyr>Un*!^ody$SLV@pp0BWis zHy3aDa%gRZfdkVhwr)^hq+?b6|ML7nFZY)UeCs6gJe#-#f|xHE(x>P9SJ&>&jq(bF zktl?V`-idP^sbCTBP||4Yc!G9d@-U{*_J?sEU}JLvvMcI_j#`a2@WkZd95W%|SZ(`Q0g)m7nBDEUB$Lly zsS-;l0+7%M?Nd_TNaS=hV z5shSEX>C+AwY&UCuzs$7{TxJ1eYZod@@yv3RHo*5Z`_Xhpy4gg<)| z_OVE@ptBGA4VcSGqh7X(Vgk_ZXya3PdK0vz?NOa!T4u_@raE}nd$4_%@xZH2UxiO* z1!9esNvif4W(SnO?fD>QHT8J@O~I%`+(f2gl^=MZEdok*zM{%_#?14~&nPKjhi4nJ z?@jg>BM5DHF3Ez`u3da5ZzczD(S40PIp`B|ea&&-Z_5okxAJal9UsmQ^BFpT0JeGx zems#-C=HMIynna9H@8=2wtq$+^cYFI>x6?+GwY$O`>9!{vp5!Gh*HD`O-bifB;8SU z`;mM8*|YyoUDYdWy>8gB9?xIiFcbz3hF4z1R5<2drO+mU)ZZhu#?!;mGS?+~DfEUm z)M;m6mMx>z<}mutH31ZrT;w$Q(@Hz+WG?^|b)k{G4&MbJAG_=OkH zz?7>8TftKy+RP%7w9YU+WV&vANU?R#-@XK(A>;lbrBMjw#W_qe?;ApTXE`YEm@#9r zI`QSDG1hgolUro@@8p_D5T8LG7T|x*L?*L3)J}OncDE&#hPP z?yk4-@v5t?1Ux2Rw^v4Z(#f(`QHt^tS3J{e|M%;xh zJc&N}IE*m_U7GdJ9f2PN6dgMc;xVLB=oel_U3f04ehBJ`M>*!a@jUg+B)-@ZzHHIF z-KuGm)<=;AB^QDMUvgLmo`Q0EgpuEOGdD#qVpEIde-%MSE8O?FNhoU5cbg zfoZo2F1y&+0UfClh*>3&YgRiLX~ue6y0l9X4m@dIgIJyATz7#~%WA7_#g`7*K}k+Y zwiB$Y9n-YHIu(V$tF+I*{3)oZ=^f3tSx2JhaqJEnfA11hdpjD40UcY9M2`C%xy7x> z?_a=sy%UW`vQH`T_I5jqxPibcDFNDT|BF>%Y_^;+4o#eOFVFf8=$X!;>i{BJE4MmTG zhsVm!RcNEK6kZxdpafEN4+jP`lnh9ltr%9XPr7ntAeS!(3@e&CGm45TS8UW0lhjof zSo!Ux|2Nrx3l{Wz{-J{~3+AFPxdMIqDd>N{fSLLtCZ0>{|E(k50R<=K+loskoPwJ1 z7HZ-dsL7XOjN!#kVb7_C{l>0hr!5r&e8uBy1mCnfD7m&Q+S?Wi&aDdQUlK6$3&At* zHn2Vt-)>M?p%k}0buQ-bf5$v}G3NH$5F$maHz=^iK@M@m6d5SIUK|qP03fA_27nOC znW_AlP-HCvr~D#aXI_YiQmXqVlqT8bvr|=y9MACS&vAkv0BuY4bfqAff>Z#x3XH>{ zMy0@|gb=tR9Z#MJ94EW|+;d?_G%krnMGnYKDz0=y6UJfz!ll!ul>e@0tP}5|<9h)D zfeU@6XMGKr){Uh4*090PA%5{~40!!qRu12qjb~1z;)WaWTU)c1H@ap=yn>MsuW@(* z1xB%OT?OAP9Dve_v4a*ctZJ2=`L#qFi5IU%*G=cO4OJXEY%3^?qZcklEL~2)=+VfO zM@!>+_T9T54fQ2VUpfh45`ZL59)0pEdGhHKV9H|5RwJRhuMN@403slmNrS1BvX+ETuEJF9n0F6(Z8sHCGAV-Us%u5&gC=|)U&v4F$0PQ zuwdf?MwXAHygMRm2{CGSqfSw0!ZK&OrI%HR-r!iak!(FSj=!p!5c%e*AUAPb&<4atyV;;evY%!}}Y~o{&8N zNEb^Em0tq6t5y-e<_dCv_BD+xy?g=5q7o`!`46a8Jws%Qcz!i=SClZOq=k)Lif^Vb zbzFo;(r?cf*<(%@A8s2k`|WLc^xkVZQGJ2uc?dM`tayjt)gOSwVm7{B`xUnskasfpxgXz5TeFsyVKrYptpua;xz5hx`X zQ5Z1q`+&Qi7JNO=7AviA_m5`^UzX|em%m`{xC3*}IhZL^x`mU{P{N{)HRQ=^3Pdtu zZwW&WN^0UllM`A1Lc1`Nrce|DOWEZ8e_^LvHeu%0W%Agv@;efK9qlHEF%@&s#JjmW z?N)aFpUK~29BSi6JIlDTVaBaPjkZUf0ZrCQ5i2XFX7)^w>yfTfQCL`Wvlf5}u?#ZH zd7AnD6LvS;__X1?6AVFM`27E|cHUuDRoCDDoO|!|UKp664+w&wh=2u6Y$zHvw%8M} z8)E@WEJW-z#uAMsF^Vm=s1Y@YBA_S=C>Bt9XNESw^tt!!_WrT=xoz%PetFOHTyEi< zIs5Fr*V=2Z^)Q zQNYmF7GrSFeBPh4ikx!GC~N|X>RuMCLe}&rzp$Ng zM^w|dR}t^5yOt5fmt$hLGk_~-KIAQ)9FZt%_Ws8ASl+mT)>t!D`8}!1E$8#CpAiX# z$?2HGjuJ9Su*KXg|t?{}1Zb3t%AFoy%IFutP z0_UK-#uzL7zyCevkw-A+orn4K(^L&;EXt^P$4Ri^O3bG9)_n5=N130LNj4v~K>z?C z07*naRG5In2H!({YPo@hz#W+_FB+d5mc#MidOcE)S8w&uUv0(b!>RvMHO1Fy`npqKyr$FOX-g~|T& zzlJM*lluID1&}P*1~3I4yM~pMb>w|?+r6H)NW$@#91%zy&P@P#K!?BRC7yrp0cFfx zSdYxk=YWAhiL~^W=2y3F=iZVn)NN^rTYYlDvN$M3eADPA=xLmh`)B%Jt5|;RU-@gV z%eZ;kR4$nKKE@c1=`|i-`5aVzAWA8UvI`kiH4U$ISh9$C2$|627Dr}zJjMMI{8 zuad{_oO3V_J%m}m-Y#Zc%%55(NXgeX9RDlI-+KE;$A84`-9LT&(-eRwM2Z4X&I(XU zp{|>P`sZ`#E3ZL$pdNV~)!K-<`9^zAQj`e5mb{br!l!qY`5KO^{hg&(h63=j#QHJ`gD)Kb?Nb9ij);cVGd$G?0ZbKZFzckIn%KfTd9L!4*7 zcUcZEUpkjl&22@IsWds`=s@WJ;Ksz+oa$r9?ng7NOfaiHX&-!rZNk^|G z0+gU@zcxDawZg|BKuOCNPl8h}`R`tEg8hE)Q-=I3!xLAV#QrqtJnQxD9O_e>4CPnP zX7}xrX}sz>vixW#;n&zLK=_Yg?m6)u>YD1T39AydA7#1qmVdQg^1vFm!nswhS4l5k zy7eV4zVZW(Keiuh*Ef-y8>V0HViqmlN@ce^dUeld{-Q1P>r=#rjV+YyHH>wC{G5Rg z=kmMyJvnIqKQVITNG4C7Ov8=_JmaxSthD_oEaFi}!3_CdlvD^Q@U+KdF`4e&yK~oF zcOmY)6K~=~%(7(`477POrn(xlX%lALQJ8gWF)LSMR8)sW3mb{JC)`IQZy?~j2c?_m>9{(Ry0BKNmlO)jU ztEH%uPebjhM?dy=)bZo3LKrv@b=e=#Z_hwI^*DOS9_S>C&93M^$BmWz_E?{sBEjo* zK96k?_*!sbrO%lo1<%*|Jn)?0iPvr2On?Z!L~1Ma$qFD`wFhTi@GpeYWVzpj)JWqz z{7K0iiSSI4w^k%p{9ykaC<4ot;*d~LyO$M8AY>AhS9SsARRXCj!%oT?W(*x29cZob z{TR?njw4o#(TtRWju@z@Ef(WjM>AS$!r}1GRsiusl7LdXSLW-qRe;#Ka{=I>OIBB7 zxc0oH70c^<|3Cqx$NT~0{F#`lTufFN>30_XVCxXHU#bLRE_e>Xax#;yX&gfB~?0F_hhF=e!eiV~jQR zjd4ytmE^ouaRp$Z%<^Z9zsU$?j|=}TccLD=4|U+7=xHCJ@^j+*eRb5~=r0$eF1-wW z+R5mN7oe~F10m+m?oz?%p^AUb zP=NxlRLhlxSuRem5iXn;kV%LDOYVeUo78MBBP3q;YCLJ7kXl+3Cy1GQQec#g=ZAv5 zb+CsCpvZ;Qb^=P}Vzv&-D<#4t_E$S6?`8$VjyG-TI)CiYr1g%7%Q&U8lq`XYN-f$q0ZNbB2ZOpMO0Y@pn?8JYVNqz z5o$<>lb699Nw5lA7_9wGX`9&d@}D$IX~}2>7_BLO^);NYx)V-71FEIP!dbPXvY;~F z$MJXf3c_2Npy0o~a1r> zbx>Q+_mN6dRhEZz2?~)KTdlXIGT$kOfQ?u=W@1pr^=5|g?{fas)^>ujt96^~s=sOp z>b?ii=bRDW>&G2_TBC9!=%*e-|NB4aTW`Y5o{MK|)#peGORJgRAb4rJVw)25 zE=q;MuNIQ4>m=t^Dvlnf7`cz)o%g|G+)R@|>&aB|$T*>->pWk(9PY#}aubs?BIHQ> zF4KMwjT?q=*6ISEVAh&@Qy|1N`hs`>z2{46vlW0h%)kGp?CIO@2)ry{ENCHms-D zuTJl@|JJKk**-}^_jUC-QyY3sn1E<`i__&fR}vX;}qBckG~Bx2rNdOWJI{ z_QOu&|K*KeCdS>p1N8glFFW18yx$;Xw<^>#|3Fui#y$Kg!tdU7;P=?oh`#E2LOZv! z$1`iFZ-$YJp=C9xW0XE_0VuN{%s2oB6@&K=Fc9?QE46HSM9XHzl^=L}J zchdV0O@=@T4Jevp6d{-t-B-5M+uWV>~ zBfC?36Ju`w(P#%JP9A?N7{y}`s|SiZKlM*Knk&|?uHjxR96p`RK2txW3B|kpZf1FL zEmuFil0u&MsEtF*IVx2PB%NlzRt`Cv886 z+`FTXRuj@#k?A~llYdM9-kjmu^uN&+lwAUm3xE@+OkpPQT~av0W`4=I=_Q3gB)tnE znC_ss`T6-kI-mtQK_Sy#TeofnV9JyvC}mO`;-;SqzeQuQjQ7t;f|8O3C5&V&UGLzx+94WsfMm3J`%)&5jY4Q%d-xMVK;^xEia)ebw)&6?8M4pF z#~|r=W;fwBKfVnzB8CxyRny+$t-0{a{!=)r7KTFj)D2hTY+qfbM5#q zU%s5(yLYqq-g}dmm!C5J?d|P+zHkx6CB=*wVM$c$8@7X$u*^rYX3cyQ0!-0UU?k{# zjTS$HRrznzx$5Iq-g|Hezd7qLqN`VbjX@a0L-Q>wvX?f0J*5b{ z`5R7~zsd8s)y@AN_oQB*%$yY`D+ySrf|PtISo*Ak0#{-rbDP8EIwvu9)GePW$~W5!^PJvKEAlM=@_Y~Ea#FnhvbuAMxY84o{bc)cxmq5ejoTb)BPiIvr^!mZ>QpZe`FySGjz(3G|s zuoOukCSjRXdv?#o5lR6Dxup(_cIlwD(>wkeLLv#(w<1(hrQKMRaE*h4=EBZa!xLXL zv2S$~rw#2*exwBGAkNg3^0ErR^SW6jn+!#Ddvl@P_$k5A9)eSI1drdSnR@3m&OP@M zB4#uFYkTwAKyTd+N}_!Ukr1ZUPEI3aylQY94($shIN}DJKRoVhrvW5jM?*3p88m@a^q-vR^}6!UiI|mIdKZ1092(y61S{YbJ$%%_-f+(7bIo#ucH}%9ezaLZRaH;@bKJq(lly zNsn@FW;(L~A`#SKl^}d-5n0;9f7l1# zML~Rl7BM_&DWPx~Tz~q-O|-^ZxpnU2oW1uk4DUAl2l`(F9;)&x(A5bjs<94KB^04- zpDPAR-hWi^=XE|K4?Ky2f!)zkvB&b? zx8G*V)~)pHWvdS5U3yt(vDRU{Y>AiqwN(He$7B2~2&vBJKK7`6{uYJ&ui~^Te?xJ% zVp{@ETWdhOGV#jj`0oW-1!P~6&Gbjhxx98D1yCnRR(e=#8kruczS zSUM2L7y~39{CX)RmHY3Hx#?!q=K8p{LQ3wAwsEBwAxkNy zesnQ+#xyz_vjV6Tk-mK>{qQ||pf>O z6^s}`bmdBVOt}$*$EH90o}590X__;q6O=OogglTjAMNsFP0Yu;r~uQ`mMsteJ`Z_M zvz>&|4vY|l43?E!(ncjcPm%zKbc$R-o|l*j_0JkPNm4p$~c_4Kr2P$-2NfP5ZSyk+;2gD-@v37OA(>`}L6mB^@MRQV`ss%w5gc_tRHQH7(p zW&S&aa`SlYdl(ohCM*;)TDx(0pIm&g2`v@AZ!lNgOzXREqh*wW8}CNEvd;CrriWR} zo%%X32G0mQEyy!X3^ku%h*8XD_A~D>M;}U)F1Fc)L3qY(F@5dX;Dl6!LLS#m=tWV! z4Nu>2ZXYiF^J;dtDvb6J(j%rl`v*dyI0K8F79Iw}%r&$4cIy(FV=Yv#p2=_bonUJ< zB%LRx=1ifL-GdzxnvT$wS~5SK1%+SyV2eAG12R-FQNY*$@+5D=RAjnAuRwelm;*<#F4-S5hC#Vale(?30s2LC?ha%d`a~q0x50 z;>Td?X8XPUG1%`I2v=o1JsAqC=>mk6Vg72ZX!IO;j@$un}AZ9t)D%Hj2>cduE7|^Z_FdSX#PN@-iFkMfo3sZ>(Lyn-(a^c z<$FDh;rdhNnDLIb-W5jiwPiPw$}%g*6x}Pb;=*r?p{zJe_tG%ic0}<)I2?kj&YdoQ zz_(kM@cy#**wwKMtu${hna=3yQ4Fmb+Ufc27T~+@ENt?lk3jes6TzHt66Vs2yVjsd zRzUoB40P*e>A%woi5Q3re{j9lnrt8xvh}&O2gdX8j7OssV8VoyqEKl(myw6C`yo#y zCQmY}s}T~lK@i#7$CL<*Ol%eC%}#l^_GppBdXvQJ8qO;wR9sB)xFZRbmSKFK;$w~> zR9Z?XJInIAC0PJ3@2X+)rN86xIZ=*3a8IhHJiucg3wHaOOHaHXGRm11m*L6%%h?c6gA#|Tel(S&LMK* ziO3l+@Kp z`?Eur)2NF%!o0xy`sf5JvWo^Nr7d@kD>1)yr=Yn_QkZ8Md>fhs8@9&WV&(i(!o(Fo zviunXkACt9$|#J+7O=tN?%DV7%<0b(N_u`NrP~4sftfW6q+~;(PwzvH`$6FkG)^Y% zV=5{zzy3AmpZ`p?0M0xU)2C0$^#F~_=1|^m6iTUh#HoQd(fgVu81pPiTa|D1rLUN6ZnJSU}G$ zGg@hWe`*a&R=0A+^9@Wsr#D(@?tf<|{YKXEWfX4uXbQLd;x=yo&(r-GpgqNH8Xg#Qxv7{tGz`V2okKiWR*2>Z|NE zbO_^rbrN5%8OX=qv_MCcBZlQL?(iPWp7l1bzws95pMO3F9B=?yYp$MgS7(7X5%Rru z`o>0LfQ>ENXgBu}_GG7XfjDB&Ad#PbiY_m=dHG5w61%i@uAwdIOsKGs*2fWK7Gon_R7pBQo!uRh8y?%h1t(ag_sDDYY-^N+ zJR6o(QpbTv$qK*;77w5BFm)|kxahSDP)2d#sELg3GX|vv9^n-Ei)a$8svqnjcxZe! zLcNLq&MT={{CFtE5^oMDspZoTZ$5(Oq=u)P=wHYBam;R;(tqqU9yb-B1*PPRv@7J|50{gG9DD_PmcVJMu_(-`BNJQ_5F^YYl(b3Ok&^i1YW zlPvjGAoM&AIrKQ@fBbLmyvk?53W2#WZ7Y@rMU{XqEJSbINc-LQ*hqjenASGP&&OnC zr4&@vF2bS9%Hol6u%TdM3?F?wk0C>caMNjn_;yqdQW=K#%VF)>6}s$optRH` z7fG#o_|s=P3A6#ca6SdO6#%qH-$bi+GT}0Vc@#l#eY>FVV~^3ElynofTtw>lhX)R% z@tbdeu}<&$&i7cmHOJjuQ=?aLoxTMe+36ZR zkY#!Rg?c;3m}!*i%{-}YWS%+HIsrA76jj6VyYFMnmftgQ^A42r`b#14R|!6zCy_$2 zr_c;F_WzWUD5B=xrdT;(}fsgVVBBCw9*g_R&dM8YT?I8P~>%PwJH;M zMM+R(l>|kmm}ZefQDs&Ez_C3vh4qlzLgM&sCbJ|hWJo8o^9cz}u2oQb&#nID|xd*elCq$KT zuxsMvD#~%^2UU2qhPNN7f=A%@7fT9Ds>#h3JpS+$o}F4l)+Ykq6VSH{D6E5`F8s2C zp*emoTw6$~CcIFKC%R`ksf0(63HtjI@lyLEL+;R;rxJ;|e$)$|a8s8ocKOUuaw zomepbLBuHJCZG_C>Z&4_t}cnwq-$3VSxCNG0pG0mEtf^JhYGv-BQ@FxF3Ea|*UkCX zsyDV2gw$1hW-dZ&&2CddKW$LPLb)xgx8`L&B5UISh!>Hutiou4PNH8kN#m!Lg4K#+ za3IeEIHLz~}tQ!-z(GUVQuuKyu22k-Rat9RW~6~(Y+ zX=x{PUx4z|4*e$MXh01~OiG|R=fi9MCnVsCt3Iq*1yljMNF8tJJTFN4KY;xiPAc|1 z`8`9}G5vVGjk{$rH-vVjApBDLEkFYXNI+a4hoI%=|BV$nns$CBSx6Jvl;`&*+!r&= ztsY^QH=~U$ya3SL?%^v#Zk9$0h)I_aqzy4)Q&qos_rGyjfRK|DnaClC=MSVyv3 zEKloEONxNf80;PnW5EsDxFVa%7TQ!wQaN_dwCgor@lw2#eh3Dsfn)kT^FK{M@$R`b zDLsna+UcMHI`Li0r0)`R2r8!zhvvq_wOYH}izxWE(v0?nWf2ygC&df=-$`*pz-^Q_ z@;@AX*j1YH>}mi1V~VIe!}&kw`ii^{QZJC8R*tjr*+wgOI^Vv3J-BoK9J%4B&JU$= z7Ar1?9B?%k117E@EnW?LEA>*XDXpmZ8SS5vc5j)+pq**t>=TUTEj}^8CBTyz`froF zPwx!(-WT+2h%~l%oOZ19=sPc>R)(e~7`k@|jA8MYn*0J2H-(k9kl7dBX#okh-nk!r z%C|G1qMi}GSM$Y&{(QfsKkFOHktwXIsl^Ijxx;qe9~YP50T1{ZJdHS{nC1;_tejO! z%Qk}+5+w!7vGL}X#i$wHNI~vu0N#H0dX7ANFta{f!M985*yp+zU99|vp~$Tp*Ta#Y zbqz)R@uLt4p_<#>Jro#C7)99FK}$PL$mCEk*mBLe+ zuyST?9O7v|x88Oyt-!c6R%Od=m|!vvSd^7}*HWT{;K}LJ=|fIwR}V*g*WE=XR&e|; ztiJyruD|0!yQK*D9=wVvcHD~uo>7EN3n7z5-${u*uojYKPrU?%G1PCODNh-!`<(^W z1iAnX>jDRu0ix5$Y^2}z%^y;o6NT*Ng? zerxyBN%_`6j(E>1$Epg%grP%36U3w@!uRjylT*}+Z1aeuV#Hb{`IYUgUzkJR zA$AvcStR{C76L`3wL6AOJ~3K~#u5 z(ghS1aB*!K8Z!Pj&>9I*hzCa2;~5nfdRwF33OXiuSw29c1zuK9`xl}XWoLG5$FWm7 zVwI%*TAYeJNU;`p-Fu)3INc0wj#XK!pt6vCS1x3ye1UQ}2qgpsj+J&U9T^`ighwka zgn)dC&|N5jL*4!V&#b=xKdv`Ww?nv;U4xOEAghIU-Y7sT!LN>M#~49ued6y$YI<5A zllvq3<0bJdN=+h*GV$*GFYbHxFNR~wbGarYIk!z+9c{uS=zzfz= z_f0Nky_!(IqGh{g)8c&Ec1IBXtOA)eYXt`%T+3V2zePwzk2~)F@i?&OG3J6l@OoWI z#)%E^%{SkGfqh0C-{m>qwq8z+FA=`5+Y_e%;tm`q@Y?wHH&>=QE63-n?QrS|r($aN zfXXT>{KhGPAdIC{qExz8aYqg%CFs80iEgmK6Ok_bzHe82C-_SERtY!-kSzqwz+wEz z4xmRFY~9`Ee;X1|@)Y6q{kZbAL>;NPkT|RK4_qIIl8Ya>UI#o02|`+oVtbvUU+;F7 zFNe+bZPfH2j$g3vGJd^{sCO2A|A`@x8$q7)6($@`Nv{qAQW_#;fWk}p)7y_GC)@77 zJrA<8!|@egDMP#P@CA&?TFSX4?=hgL2{Z5r%pn(`fAbVPUya#r;0Xl-6y{I?B?|Mt zkNHYs5Ey*Scpo!VVD9xX3k3AB_m2dgU7K%UKeu*h2IYph^W7P=`GQ-ozJY~NkD`!v zI2@CdF&jc?k69~*^TGFnkV+F%S*}o|vITO5-PQ`_*>?#s1rP$`GXJ#8TvFESsYDi9 zYjO(P8Foqo9orRiAFN@>v0EtX?bEzHVhe{L`DW>6X3SiQlo}-!^;iGF(R({i|6t`; zb|uxqC#$*_i~jx`XP6%_ZyVo6Yt6|=pU~wg-W~AAaUE=IZH*IYBqyQxTDXeKsSHPb zi%a-u8tj~Y7iDE-iOFO5Nvz0t9u52e}y9bXx5r zcMV29zJYLg4$)>G1{M;&s+QR0-^I_#!ukP1Ne=D!`1$gux8Iknu50GC_m)#yl+EW$ zx5f*6Mn#wkvz@aGK4g6PYRupRF=Kv*soIm6@wnrmS^RZ0czqN^C1#C;l@ha;z>E}_ z(RRTxJAKS9A9J6;wELJE0ecFV1rZ^g_H=2Uu_)yB@!0*npvh(4H7<#f(>F|X6DZH1 zgh2|s1sKx&9(%MGQ`**KeFRe3{kjXM$fP2ZDyjHnRel-o^LMm4+F}gc-VAA1O(pD# zn%|?174H_(XVgv(y>cZv-P>tzC_#x5t2lN(O1P{d4WxADk6Qqt5C>g+W!J(F-1C>` z@O__C&%C1RlcFS8VRa&e8f2XX6_x`^vt(XFS`&XJ9c1-Wp{$joM#VV|f6nz@C`7N4 zuC1S$Z@tB1k3YtSwd*j(aL4VpbJNtRnNLoFVg~}erjJisu0Tn_^4>nfmxzq4xMXEn zj=o65)n`acf6b5zYlMKB8uUjWfeXzBAzCT5T|ksa;n8->CAWnz+PABIJUr+WfJt=> zD!|j={cRWn-n<&)!HS3PN33g4aVRVM*hDgb;dbN*S_}PnA(=qwXlDs1Daa|2%m+}K z_Nd^^d28deV;wOMsWeAKKIL~63+cAkP|QJ(W6FoHaYu}|U;UPES2ys&UDxne1)wnP z0@EsCgTyR$tNvJFLx@X!Oq;+=^)an-E02(+Ky<-3-GaHy8EXv1hn0i~tI z_^X5hkR66~v-8;F(5-+qX+^VS={qIPA*lGaq8q&)xC>EVPf8(=c;_d0{Vt6 zD7E>C0_;}yhQ*61=+z75`*F}vu*%0RfTZt%H4w?kVdH|X*?3Mp@f2>p^;SNZHJkFH zQW{&+saFz5G87v({)1NdG#U$G9`aoRg_#aT-c?^ud3pKIfBsO2`U@|F(c4j4$B}eW zXpHue(&Lml_acPm>>-mdCSm>ub3g+~YXKw_fI)AG5*k@d`TmROpWlEq;4f`SBUZI? zkZJs`I8{*J;^P~EANErg1PiJY)D{UA#(zOlWd!J0j<(d5H<*5w*eTN%#)`CG7$bG z24Eept`j7X1Wdt_u#z+Ydl;9u9SFblG1^D@SxDbdzch#Dt)-OoY@zO(9BRjIN5+)Z z=1MVi$2PK@1&}frKeT#c`PvS;>>A!)|9Qqq{c+<$j=pXJp>T*dTNkr)eNo2qUcVED z8$rhg-)%SSUR%dge^XZg?Y1F#eI?Vsfonc5=CnNxjU6t!VoZWKLYtKDL9IZop)AjE z{md|z+&r3NFTIqeb?dBm-yz?Ey}nBR?EX(nNl9%jcV{T98XW8EHgfI-=Tb~()|uo( zLjo=w?0tnGBz*S&BC!Idn7>I-ChXv++oP!j4s@_ABWV6MoV* zFm?MUwM2!bO9huGrD+!-B7Peu7Jbb*`zmrqp3U0O-n_qH2k*~&kMGwt5bF?_utzvM zOvtm>>d(O2S76rp&|6}D<73te%v-L{jlj(IF~sm20x{V#HLU^9!+iuNXP)R%o{x z1twp>f)ck7q#~zJALhUG7U$nHEc49n){UI~?cV(D-7~rWl@~Iewh1U{kf?15iz6^~ z)01ZcD6Wx;NShi!NDZV6?zQc5&7z*5PVAfzi2fe~^uq1QvisVbgPyeF23tN7DAe4zk8| zBkR45+294OCh5lYl zf3Jag3um!=cN@Zmv_p|lyiTEZ*cuIlizVhF0mB65X@U8`_5TQg$?`ET3(PcuIn4S2 zSg7D_M}XSaVJBT#F?0w+zaluQ@A;Va-j-Dr2?c_q%gw?Ig33&175ZSe zBh}SzbyIOg7Kh*pTT2kC0VPT5%>Ok5cxVE~MjE=k5l3?xu`LjR194^SQoIWK=YJSTDJTjmoI(sJ^PpTWxO z#y=yJ+#Ns0%4`qoYwA&vMNoB`a1H2ggo|xzxiL);&LO)`;@N}y=*9N) z{cF(}+MY=We&7eNKG)9e@1ED))-*5)XuDLhGpn)>;B#F6-3`u9vW>8uO@tIt9I4{|^!nlF(0B&-*F~w<@?= z!LJp%H+V-~(`I(Ifi~8R(pq4-R;`EL_EHci@m!{c2JJyu^VYOII-%=G`us!iTz~@? zA4V#=PsGb}>44(MApms%guyv3fQ`T2kr4)&4&v1rJ_B6*w1B;cw)d|2~i@XPc* z30@&!{GDx>R-Fp9l_a2~0rWQb9zaSpkPFw&7!W6={XZb7+4;l~{}U2$$t53_W*XP7 z#yt5Pfb311Y~M(k!hjt7mcovVeQqfwp->2|HDkwaCUwLmJ3qS^9m3Xv)rr@~<2tut z!qNlScDYXZ-9VzsQULx*dagkIL@sKh;NY35ZPc2IUV5Ah=@$*O(?(gR`&T^74`X4|*{GAHBLaMJYif%E zD5gu*wAg&#(xf{-MasbJaWF(Bw_blZgZh>8(6ldDFl!}fjoNh^T5Gbh{s^>k=9R}X za_=gxJ^uyl22jJ_-n7wxfL|;5;nLfj{5=Zf!o2L8m>U|zO|Ld{b7(rn5y{o{hjMYh zl^lCe4}Sf8vU<>@Ppqba1OgCouOOEpeF9bT z@ZXN(s6jq8`8{O{ z90X>e#*1oh(uK4L&jLH7hm>Iuxn#+6I^Vx5R$Qs@Lbd~1V-jgZBBeQCg?-XOF(10| z7yyj1^wpKcg1$9^{d)Q2A=%KH!;FQRjXOL?7-~)U$8Pv5v`g;0?I`kcB8(Z{gQxE~ zhSz7-#wU;Gd0cn@3HVZx9SQNPUkqTs&#vLQ>EAK!?nj`p>-MXdW3-J(BpFz3AD_-; zE3^5}qy0GNqMpQ-^@r9Lj_uKtf^H}A!3xQBwGAktX%*H(POJl|4IL`XD^LA}NF+j5 zB*KanE7)tVq2L8YQh-PVbJbOZTUxq=vStIdQ>NJAb*n`j!5FY0Cta7ETKtuR!WKIy zaQgKmL79VXM6jJf2sXOwlUb#W)(lgM(NZzjUH^%cd?y5-N@*($$z)dP5VxLvFW{lI z!dHUwvI0Uv4Bjdj)U4yDzKO zmNV?OHgdu$zLiSej<(jBC`bsYd%hgVp%S=|DSEZ#shFf(~+XqHJp@ zq$3uxm>B0T7&)c~zy4J(^6J--{qSEgr<@WWzeozJtg8T{w1BX(9>n0~3(Ts{P)098 zW+<%yN)Na2rp6B~a-#F$t~HqII%rU^OR-5RnxsL9#LM^^Emn1gQl_)wDup(Jf`~#H z!G!J}k8Eh8RSKG8KE6p}g^e#ehHbmrP|8qU>NBji1zGn!EiKh}l+k;@296lm#q4wrn)lUg^(m< zr?p=wgb^sIIC&4-_tU5JgML>UC?`USE$Cf_?VgH!Kz;LelvZ>I2dMJWd`H^guU(HV^DYS2 zRHK1EUNIdwk@*Ws7`^v=3iI1RD~>&E3zI%PjfV5iCzlv0<>q~#aIc=Me)$y+2KqG^ zCcIL|GY2Xb_P6wA%3(`VL1hUXN$-N*ZtiE3oh6uf?5pJFba2m8N3wB46+#N~^1_@w zaR_4u=TiK@Etom;;uVg)o2Ih(h6zN_5NDOu3aJFzC>t+~(@@*cTqY>vtky(fgDfvX zvuI{ZM~vncIPa(_c!YWSs}CtGg6g~+O0tR(CNXqJvKw=}fl>u$D9ppck|g>z`AGOS zM2XOy>Z@xYrTxY#t@CO^JYCm8MQ&d{YOBQ8bHT)z)Z62ZwTYsm0T|rqM81EY8qJ7m zpJz7=V#bDUjM}S&+0PYl^^sq2gkqCS4 zIfRzhwp8H{umkZv&piG&a631Y9LA>hHmhKiMPvF7)RG`oaYP%wCEw^%QN%1ZqxlG< z4HC^`cMKw$Wpg2-CQAQEKZa!wmx4^^=o`jb9TI1i)j@r8k@m{0001U542e&eX3@;(%3pD4ze8Eoyb4`- zC}A(eSN;CPz`}vNvh^bt)-9wst2plA-NbynISTfWm}L?|5*bab{JtMp048MxibE-r z+pi=cB+qXV?2buJA25z_J;!nK%tc7u%wIRzRW#750V}KZzFSAmm>xS>vZ;la-yO(- z!?TIdgHM*OprCgxS9RZr@M{oC#d8_{@#u++8Qzn+ZOt?`M==IY8MjA@0=V?d5ooPh zwzh%nNC>Gkzde2^Qe44{^6W(W+a$*hkUYIyAR>aJX9#>L5D}~SFB%}YXP%G9Pqe>b z{5gb5OL=Rpp*ByEg<@9T7{(6UNaMGSwD<<;OQbYJMK;BGuOQ_GWNGUI&~E=fddwIr z{OM5S3}L<0{?A2u5u_JEhHRZlK?s3H;NcTOpzuuyVM6YE2;pS``BsP>E3?wJBCxMw z^o-PSbly1Hbq8azNAXeHT+4H(L>ylcct^AyZbzk%0f8OSVi>_qQK1bPSH^zmRZ3ym;`;X&_t0ku%Kc9OZ zIhKj1%>g5MeA-xiU$S%JMDmEmqcO&};qGv+UM&01e<%i)=PUXjC+T=mQa$z0d@CaS zLkQ}HbTv7Aw{@}gIfM}O?$ev;?@tHrrnxnX+nyLtes&w{wv==7>4Q1umt_>c_yp$7 z=?S?x?F_b_b39LPdxLokX2E8NAd{f1Dp>*esS3bkhH`d`BrxLno}?|dl3!L{z|BJ@ z#D9Nb%#(XCw9H^kJ{7O`jjBNFX!Co)ut&}Sq*453$NglH<^E5C3h)F8TJ>}& zvL^-EnOLbawcq#c>aV12vr-si$S$p-HB?M~pS>vUIoMi5(lSv6ehmqvQ zbOsYoo6VIso{5kK-`5CXD1BiXd0{_cQ5oYX&%zA7_FDY0W2rvMW9lna+%=&Q^T1Aq zwFyr4eQp*>)sh26;4GN@w*27X5mK{xTM?C&J-GMJ!zdHG$^GNSn6-8GxeLl^yYFgN z4JhRL#h0^c+j9Ds_6O+{fO0E;0A)>80Pa1_0tld-4dn^{Z6s8}_x^Scn|ClTj(Cx? zYR>}T<+U$!<~L_jP%)6ovT_=9s^8dn5;IU@A{I(&`S`5h2a13+3n0#Fo7VnEHz@vm z;4$o3vL|h#jZLka_(hLjQr}+BANIP0n-JmmWff5i+RB=%bY4;KO_JyHk5o_}|y@ zo`2RtuYG|zd>lJ2Ig@wV7x3WhdujDs5hUhM1c`MpDTiZMK01>Hpff``AABU$yXX1E z?27f}z;}*BE?I^#ngjMef+w%+PkDARCfg&~Bd7sSTbM9dD5>uoVzDkPfVBIkv|roy zUo-z2@*;V}WQ-2kLBxx&E4qsv9XsMYhe|sOAnK!)aVg4*x4+D#XJ{Qyod)xE@5`F{ zEnIcf7WS>_;DMPqN18$^s{k%M=U?1--*N12j&kv7dlQWc?t6LxMjH;=_e6{_-1fwL zgsa>DOQr7JC+ z4?`yL7`heLrCs~MXCe8^D+hAcv7Lf;CXhAfXpE9 zorT|?Cy~+xh@4PJB~U0rQnMLlC!N$hK{8iGT z?u2wCwkoiu{J1y0PnqQHZvqQa#w`F}_!ta_k3NF;=FdPW#gPY%#~6e11sD@YlS*LZ zmb(8(+IfdrQQdv~Gq-GS?9z7WRY6q59z~6!!4jiU6V0o}5{)%#utc%mo zFJ$H7cR2j`0xtXg?o>t-6y9+SX5mtsSJ6T`ubW2Qo};++n?Evd-N*R&-O9h60w@^{ zH-!o^Dt83XGs=0=d(o^0faVrB_(*u^YqtFMLNJEmk3P(~om1h>+0dsd>+3!cRT5J# zAm6r}nLU3v0tgy_oba>a@2sT>k>sQiCs9*e!>)aH z8FumNHm-}7a`zD$wbd@A?9p!%^H&e#t$Ci?g~opFN)G_-ohd$DxRHH#tEO*7A&t$Q zVL?#J>f&u~?Bt8D>pA9-QQZ5?0{47Q{Efgb_jzfN&kOT1P|_;vU=*k#ORd~0hL4ga ztMZ2xU#9P4O7q9(4-9?HlWq#LeH2%B@BMSq|J>Pd@=lWGlohd*TA;LVPh;=37O3EJ zV=dg31&S+X!%{3s8cq02J7=M_{QJ&t!v7p2B)15O5h=HXD2R3WX;If2*it0*=?oNCDJWMk+7>`1gAsthR}!NQl@%V68 zH=C$lw+Qb~w_rM4K26w@hTs31FX9`xqyGDHRb<00Pf*C@=!z5=P2yC}-mUlf4Akw;Zo)HR}9}AU_Y!^Vo91#Y9I8#f&M3 zXciDqQrZlWMDXCd#~rzl)E6V#YO)&iD3gv z@Refck(ET&rcu^G{Y%kGbH&+vGq9?d&ZJMobIX7oJ;YxLYv_{>CG`YS^nj9f*cMO- z#lZf>&h6U0gRoWrftAQ~^7p7HsGvBnxK|X};|fg3lDe(Wzq}iUmtH-F zJMW)O0!AX3RLUk=zSU08`a7E|Z!2E$Sxq;(k0rpsoKHJg&raRKA9V%v%EIPCQ9ZG+ z3(o9L_jMCs%!O)$9|1U)w7*=Q`(6vs!ImvE(OOeoeH3=dugHBz1GV;gbz@r2wx{57 zNzfqZBvw&#?kPRI{Enlfjg70aklRe8RW~$HcEABWl6YbI|GJlC+Yuf)0;@M>Gi$vO zb3L6A;PCC`|M#)bMeYpBindwz_1j;Q7s<;?7r&!}`pJ_+vKJTrp`Xo7t6;lED)T?B(K4czQ%^STJ-gL8;K86}Y(XSTM z@!SN~MWa0;vAGrF{Bd8fHNO-txPOIfUZQ7gs zDfS4rmt2Z0DB}9hPv!TcA0z1}dEmQ?m|XWe-kbRx`Gt8_s?42Mn?SMr@x6GrtuMFz zZ810WTS{Ie!t^ZzIcJ#Ws6)nb{L}T=#xux}WJVlf{D+Ubz0<_zRzPRve{W}HWv(u9 z&_}uFtE##o$eDkS%zYMM)26Va%L;GAh;I4c09nZoJ(rWL@}*+@_9c zx7?R*cGY+KAJgxzowl9SP8C);RaocPBt&@anDrC@eXeuqXAF0rQG@4sRQ>+4v_g^$ zWU?}3&V*p~YqRiBe7$Hq3D1iR-R<-C+Qs|yEL_mrA>sNvPqpu_wDpHq$}NpKK*p_< z1cp+ftbO5?JFcdwsD|&(`7_sceM@~|f4ocf<+m%V*r|O9b7F6Dz`r!n{?8N5j}Xz; zi_r-lBkEIJ@O%UBy!aE&x$G#C%a=i-ixa8`QP!`LH@|A)fQmjg*&{5_o-X&&{~Lz8-+GGCP3X)@9>YRZ950f9a*@ z&dw|ZI=D9WrfNK3K={083{kM#-ksVVWtYIf3=}$0bq-MIa3`jm@U;*uoi&R$faj-A z=V)N8?nPC(ND}#xz`QLn9ogZ>TCo*n&%rMM9mxB_4; z<-#eIR`iw*-9(EZT&V><_S??iA8za0=aWs zMF*j?{qlu0_|8{_Eu`h@^6j$kXBv7?s11p=GONQ+7Zeqi-sf9nN5io|0jcrbFM1?CI zX*K8cX}8Q$4DMeJ_}o)_C1tIbU{VXY@j7k!6O^{ zGGtH%K|iQkTPZp4KvJt$|;JohabCa@hnalGJ>ix^C>J$^8E9H#fufU-`>KnCO^ea zO>0>5#TdIGp;X~n)>+Dj+(*~LUr<;*0+etst?lxKvA*}AHQA{2vWU?TjnlTvM{xJq zStznL8V?VtBpX{cT5?YbB3=Y-G=7HCifuLNhBEh->Ap&XGyzJx_g*ljuc1#Nw)fNN zeGimQptMBjB0KsC#5uH~UlF{1h=#ZKzziM+`6U^W-hrHV(0i*4rrn8O4(OL|0F<#U zHlPBlytK@ArmAefk!vA{xOH%?+o))1L2cbiw4i`B@9$nPXv`C8y96Jsi@N-(B5`1Ng)m>Me<<6*M+th9_WaGe#sa?H$BKo86SsH7>?j-*)W*TJu`b zM9v;Pj-r;$bgo)Mq$*CqnBg?7-prB)LrNNap_tj#k5o~L=eG9ev_7@`N0k!H-J<>b z)AIJ)lplFyxNGtDDt}NxGgm;WOJUa<=ty~CXwn#;O8Iujv%;6k{(r^GuYGS1wsTt>@_<=%&7Mu+ zJ2;9Y(TF69ziC<+nTaT1mO4gO0;1 zDdYKtt&I2j5D}V1EkihBTpwCm>PY&EYx*qbFYRM_wy{4am8@foX{I2*j(1%Hu<3>y zNY&P|^||LTLbB@EW7Cz?Pmi238_@h=!Mfx10vRwZGxv#Og3K(BAqKoe!-bzGorw*jh@;ren;2a5W+GuuIdD-<)|SYuByg z>Q`RjI3f6@6y&cHn1_7KBp)+DVCMT)J?Ir1ehgxmiETt;f@hzVNFiCc(Bg+@o+nIK#6`>;r2L8R|-y}qW zl%HZ_%f@simKN{`hi{VZD043r(3gHV1qe~#An|kKuYBHFJC+d(K4sj=u^uaMrg%lS z=Xan1kW!NOi^be~_8>Ml3#$Vt4bz_9Xr~=2J@t}G+v$i?y{YLFXU0WeveU2zntuLU zG;rLMH)-AVVY*tjV04PgLDS5(jep*5Be3?7kEq=FU_`3HrioT~SaBA63MMkfQ5n5 zwiV0hTOE2!3(^Y;Y+U&ne@~2?kCZgDJ3E(~{z+{>O0GHdP$I&|b4!rHW}{yJ{=`1~ z(3Qa)RpcFM0365^s4!%fpG4vfUMu(R)Dz7m*Ie9R#}=I(U(G4SEbJoF)w|2x%32&>9- z=9v~cP>bStelUlX;nj1_5WS+LmBTQ*PR587X296)J(#P|_!%g#^if*z{HM>;o@@^# zwwpVfdF+G77&~}u+LC6*dcn_4x6yMW`VKJvJyo{B^I-Z~ydM zX8ZrxEgc68mp@g{U8h%n@AHvJgzJBH5C`x7nU#CE^G;^_3)tz=cDB|1>HB+rcZ@i0 zFQ(mF&4$ed>_1@$bC;~Atuy5SB5C(_5O&xvr3?Y1;njWkgHxDbno#xpch!xMSj&Vt}0$B#1%TkLnmrGVQ3YOF>d|~+Qy7AWb zASAv}%t#DkWTBmcNYW^hHV>Y>u5tr!FLVcv1`q)R%cDy-e0No z2p|__HrilvjDXtMDL|mp7NC%m9@AX5pGRY-$uIyKq&^!@w4jV8q07VVxuvn9r~^t2 zw?8dm-cww4-NDp0c7{E*pJhPH-WJVnIj$H!po9%f4KI9C#9y*Ih^H$tQy`EcoIg$_JcoTDLs2V~v3Gy_mfF zNX|QMUyeCoSI)cZ6%t8l4WB}%vEtAspz*`elL>owOt1k-+Sq4@`x$e8tsLSCLfE0C z5YFZhl8hQ(xUfUA(Z=D_lC{ie8jNzj7#1XQQ92{`p0i1j6xvXhjlSVN!=Gwkv zvVG-HR!57Ct{BbNH-8Ozggw2G0&O(MPCAx7NA1ZyZ{CA8nhT~}K)=#{tlYd3A$>=i z^?(A0D0A;40BMAE{d6eg*Zt%bYdfp!8b~HnZc8`i;w+uBl+AbL z*6_iOzA$+i6+5W>>Gggog(Kj!6BsqtaAquxD5XL;oq(X1_l5l|K$(3hxo^PN^wFK9 zN>hBO_8=I-1+KP%)jTYJS(4ltQ{ES9G86DbVj4`NhzCnEO0cOi)B2%Ui z-DMZ2Q%HAJewQ@XiPeDn07g9(P#Sy;R zq8L^wt^d2W1wm;Qo&ZEZc#`U}ABbXV1qGy0&hl!66y(M8DJdvnT;VuI4;YP5f<1=q zflz`C%^MiiZ**v!0=lEXQuT;(Mk7&1mXEYyXQIGTBZx4t99O|{J%ZiJ%q|C7BeyUh zm4`OQxd2!oNGMHpRbkk}+xfb763)R@Ij+F2tp^)R+BvKwQf-I*{mQI9U3BmeB1(jF zS}p7@v!SA`%Rs4;tb6c5R6_$s2-d#x3T41kE$>lSc7RE=&HbK6z&2dQg9l!kOLKdI zfmNjh8&jq$e&97}M{p`&@d2%sTh@~hjo^8pl_BbZl7>h;hSmzVK;*354hWzNAq~|7 zO2QqaWX8&a6lwloM*JX-&adM`J;0@(3Q^*?Qzh0?F}Nu07ZR2~ol*X@LZL#?OKC&@ zl5}3%5uk@uURZ{r*GI#ONj)T1p5?KwkZ zs3VYpLL23lyWP(UA*rseX5G4VeDlpW3?4k#>IeuCHV%R4>I|h=suUM1MI7)L0A!ent+z^aroEp=4Sfr_BmS@?Zfh_s&3R-CJh!Gzv^=&CfIq{=&)j?E1DtI z^+m6Zfam?l^o$NCbN=pG)UkQ_iA3|fP_bDVl~#3j(}G~=Z&wh)Rsf7)#3946G+AzV zz2VK7&~Oni)0y>&1kOAuVU?t3Z&A;kxr*;~f$z;OxSz5McD%?T%Tk%m$;gUYO} zxrN)_x2Dn?W_0)+40?Ew{iz-Ki5QrNv$vemng6&s*7i`&{cat>{Gk`)OU?Mj&(Qe# zjikZu4wp<#1O+C|E!&8ledh0YXuk!Vx8eu}C)e?NIg?|PmotS$Ov(F>lb0XD#?M~E zmZY9u;&z^8A`?htxgO+ZT4v=9&WMZQIX@uNx*eyG%@ezlpAVLl)9K;0ly3dq4c(-$YPP{ORJCn`>E~pl(8^OVA_E0=OIJOq`qBZ@4|4_1 zI278gkSgO;nY}1dN77buXDOdGBS4{ZP}p1)b$j6h1w}<+{sX+wn&R2%SD}wVoao4`QN;`17E{EKS@8YjAwseJDAOQC>=%U2u4dz>iYnm@p*pJMcn?NCYDUj zqO!6-r=4ba`|Ubjdg)ubx_rxOXINqbgN&6rQVbbVOr{r2kkA`CH_(=9Lum_@3@RSX z`sURnR03c4*(h#?6Hbs}nfKdWM)SOIcx5p7sT8WcjoR8`gx1`A$xMvsWPR=Kv~Jr- z>$X}p)|WA5?=@_xA4^g3a6s~S@=uf&PeZS3V5cREVDn~n8a|X{Q6+~qck=Z|%Xu@h z2l-wn!fRu{F>z*n9%WEos2Nn5bC?iKcvJX?b&IvQP@lrH3Mbs zDg5vkGV*`s&DYadyUta3i4=BkLn#DO_(&nB95gti@IZT)aQh}|Iy=)^4BAn1N-4_f z>(G7*+$@;oR;poo@TGs*zvUD+}=us70+Ln{9C2P>Y79FGi(KRS-X#B91 z(#~c(5(whs-Z^jVkZcI(zbXG2Q;`Oje_97VEI6%8+h`|+;hgH5De+el(OsO>*XMSA zM-0j^ri(~q6UQ7=%<$pkdGg8CtXkC;T4()WImUOYu5MW-r~p|@6IzDE-le-=N>ieV z#hbq-7LRes#7lVMnfZH~=L*D#}{G z2&Vk#EBaM7aq7=LuaxL z*5DVQq=zcS2q73g^=Ql)r+se$SigQfcgL~dCB>Zf|41PKCHazMv^k#tao4X-aFt$$6<-OfizkKM@6kR$sOlUTS0j-~IP4F05Yk$s z{Ukc&V`K`?_tWq15b$6RMyrPHvm>h53ed(1%W5E6Qbg$$BLTyfIbVgJhm}9)?-Ngi z^UgCgH@jY21$%D>Bk}H6DGimCaM@*=_$}`JwRK=q0m$Skzshi4dtvi=Tv$Dg4%v@6 zoyUW(iP=_U126+)irHoSMci=1UfglVm&}{DHSF<&ir-TMkZy=g2=x4@`bUhd7|V03 z{!U7#7+yS_ah2mZb*EFg=F@9J7GFcgu>S|3w6?S`^V~&jt*jzH?(wU!d-K)H3z443 z9eYpGeO3+@Y$k)+ju?su2+!J@kG&Y60-5C*ny?8TB-8 ztUm-l6$?iILH4)kJj$a{h(@#WPuJFxdh-?guE+cwh7Qe+zvt29=TVVae%yOKd(D-$ z^80>P10ciC1WLHZR|cyp+L3(L87C5nIG5v$^h(*@Upqj^x2?CUG}>yOC_}cKS%yMZ z531N>hhD=z!wzDe-wZ~v^(XM{QBR_bVZ=38Qu$=PYo!9ir)_p74lZR;%}{tpv+J%N zwYAvFEwD?^IjY#X*I*$+_!?90c$BPp2#h?%;cp9cVWSc%}8G%g+%zuN=yq$f7y=@`LY`dE0i6wmc~mdj22Sg zu@PVSeATdkJLca(ZF?=g@sUQ__M^NU?zsn3UvE*$jQMgnXAE|A4Th6a!k|Iur=O;1 z!v<19;6-DgBPgBXh=UgL`NEOxyK6l~1qs^P?VjZDN4nZdKNXkl@2b5FNcW)XtE=F}l!Uk}kyz?@L#T+vDTt&Hai6>#6gFE`*{+4>MN^c-zRikK#M?^Wf(^vIc6?cZ zZ-TXQFEk`&=6`tK(Z&nAY-9N+$8mdmGngSg#J^{h`u}ddliQC!DqZn?Yx7X95eP;B z0KP9>Z>bSlqog4kjfRj;EMn&m;~T^P03ZNKL_t*cp6A&Hz;XRv@cw>)TbqmqK(M2# z*cgpb8nj*Uhz%IXn73zvl!)ca!34@2CZiFs-DPlC)hmzewOd^GOb|gQa`6S2p zqN*AZBl(@}K(aDcD1mQ$8oIWS7tQ1Jv8Qv#=Xc;6pO5Q4#zagS(|>IXnu&Q zYg-!{*xb@Vby*n(FEqeR+-W7dk6uD?VLSIf^&_hLHn4D64TGJm^*4T#82?|OZ5K>Z5Qi70*xEHJnz= zSB3FXx}1ita+;HcX&Zn$@wGFsIRjM&3Qb`F$9-%#F7+Z5oZfT%b@03ipEug@NkYT{-T@@Cco#4Xp_V2EHkBL=#aLkBfXic@!?zc0% zbU3el_Zsily&s~unjTQf%rL(v{NcNfqwvlfFzah++#02;>p1Rv>L=X&hZ)2pNq%w^!S@ER zX4!{Gr8whfU+~%tyWY~);&I0xZ4XjVXn5p7!;qmT5#hvMhwq-}vES*Zqxap{y?+X% zWPORxkjckvxAF%)rqq(V=(=P5x?|$Fq$r7 zFiBSlwY7rBqCiB3^Wn_*I^(W;xnb%dVTHF1fDEr%h!6!&`Z5$P5e_HT84XLI523Yo zmETUsaGHJ=Xw(6 zN6YVj%z{Bt#)-R0`1KBDcAJj)!fikz()YpkYEn@w2k{2ap!NT#%B*!K&=+HNg4f=_ zJoX5trMdTtn1eEEvWIZK!+(9_bHf+cQ`cU{AvK3kl2^k03-4#ewiQ;SQ>oAf&<&;R zL5IHg@L|iKO~m~Tn7V-orKzhgW5(b2<)?>yN@v0gMJ^Jp5sC|aii_GIl3v%BZdo%R z(E{!~Erj7QXWnS)R`lWO^Ize%`+mjOH2|Lhnxu>(gkf}PJvZH5LiwQLbYYjyIYetW z@=F`>=<3RP|9_7W+&483p6-;xloWsshgzW&tC}gOMTw{ zn~%&FM7C`|{m>ezqT#&$@nsjXx^*;14t^Dk&+F@^^5S>L0^aM=$GdD~hIxvry?we0*^VG2X1jnNnpO;bbMS3J41Nm_2d;uVtlwmm1 z`CRnMjigecUccv1YEnV|+xQ9P@k3Ox!@P9Imr-s=!Jhv|?nrV$K~9(|QtS+Y9jb zMVK!>gNh0$DYjUmYwZZGPV6EJWz2X%&-17*uBJFz9PVE?YxOK%UHd9ZD^emwG#+Ji z#b}gK;Rv7`O6invb|icWC=sEsXfW}CeHdC1LrafU^#^h93;U8tc|<%P--lERqLCCy z-y;$gSSZM<0uSh0ltx~Kb{xFJUxi`b(w|UKoZ_LUCQx1$;oqM`2yl+LNN`5=JM7KB z>AJC#<}TNAyNVqS{hc_7cCumbE?UIpKy#ktrC(OFU{suH=h7Ui>N=J}8Hvz2D77Qq zGEr)&6w(M7B8UlrDcyehk<3uE=#*Ajntv97dXrz(gU`aAFZvSifrvbJmC55qSVpnQvwkY$cRKl z9f}`Kt1>rrDcB5N=ZqtbKIfe*I*E+?-p=4CYTgvKut}L@%;jU!;9V{_7t%@Yz6d&( z^!(d996pvrjsSCj-|`c(`LPIT`cJ!W=V6EcMZhsRk?aXU)pUP}AQrE23%jt73#E(f z*UTgXbBVw_7ptp|$142(5R^Ljp(3oRa3(GnfyVY7OTST9bwZoYCdD#Q=zt`Xxqo9( z?s+X_qi31d+zikB%pT2Kr-a79K*oKqA;Z|hjvWX8_C30il4R1SD=Fzn`n+&ewdEy} zNqnX7eV=49$!=$!*)8`D;H{j5jj`#26NtqK6?nD8D)#=ed-_#u-I}Efk!jP|k)vYJ zp#Q1-k2;&~6m>3ro?DF5uZqXfIaZ0>(wq4M$(;KnMCDi9dTR|=U%i6q)5mh>otsgr zEhCz_g`x0j%pl^{?Ee@59wf*v%ZLqqHA=gb}&KWgyCKCMQt_jpXo&EZ`$+5k&>ad%#zOSyo zA^gwil~=fmU2?b1f>Us{|avW(@-Q313MrY@J~W#8_p<}C1N_Z$vy&3ay< zHB_w|)Ghq17u;T(BBAvcCMWo8l$J33?s3<^sK>HVW;BR1AQB1U?@kGNT=#s~>wZI9 zGX1#Jb~(}4c1y4CL#Zj5)Pm>PUcalAlYe{$%j;M1&6YLnH)0~Cc_l2aTTWp?A*FdG zELbxSqA`f&TchI0wG||@VQVa%9F)}7T{rLq z6iV=q^Z&^cPY>l6zo;Z0hu{6KKfCQ#!2J207M;yPi9Ljjanu2ya?qqjn8LHU_0hip z9Za8oxXZ986DNMh-g{qeEvq<`^hHVJl%7%28Q*x^e8gbh{0(%SF^Zet+JM@cME1!; z1?ev(a#I3PF@^_zF@mC~)qFeR;RS4(2=|}yCoY=ZN<{v5DC_i#k96@jc%!UQ(V)2a z@?*1zQUu}G&6>rz z`1PH)A$_%`5vn&&7)yEDWL)!gq+b+X?BPfBhQ(MMXsz z1IeTU&rnnl$O+~w?d6;u9To+S+B~kHkwzqFNFu=otmx)&aL4 zo(?}3#g)cGYl~7#Wzs7y%5dMK9Z*?NffoTSpskH(Prr{C9%ns!IX50NjRB=q%=mOB z`wX4PKErpzJG&3~?a*(O9eMe1?Ud_W{FPl2#k%ZkEfGQbDe3G0fp?_fwHdDknz~Tm zT94hVAOaY=QeF7cCmzc~NS}nC#9-)5bV3BA;vTS4kf)uU_R&_ zCB5a!Pw7`QnTrk>NMSU>9mfvi$uApt^SxR`MZR^*-Q3ABQ-^ZF{{6$b*=4iV^YOG< za2GUIv~ca-32uFYBT(Wjs|&uzl0o#`d%@h_WjRzH%saRT`y^?y?Kw zv(J$4zfWxHRFY3UMP%quyg`Ez|CyZ?e!#Iuoht2{ubqh5>rVDqG!I(Z$=8aBtCwRs z6HFB`UiFS9DUB8J)Yjh7nSh~#ipcCb?|o17onFnk4$DgcQm zpM|y#jL}ZuR8w%-#oK*8QQ87OmI=f<>c#R%|}HU8y`v=Oie6xhL>J)*eEWEf5Zg3{d&2vF*I-`FojPCWbrC~D%JwQ$E5wG8by)IF~q z0vTb_q}2==;wr!NF%L@2`>x{khO$oV&!*Z=PG7i`t4|uq&ixBHW3PVvbbJM;-M0iG z4bNS@2bBeuR9jHj!I}3jVQAk%C>?AKk-nj>qLIswFXyg9ZXsekvNm}%CjECnmPMoJ zwQJ#;chjwXDjrsTqkUptk}essmENi8`cfgZRSXJIYNdz{8%A=|CiJ`SQZQ{AMoPM_ zzdl0VjXRoZ!aFuV5~NM2hjI+nyl^NIB9M@uZhy3RPMc12e*!fn5No{EC4C?#oZ zE#mI?F93YX1~1^gJ4cf84Hy1q6pugKz_e@EVORMAC$J2QzSHO*I3S-#@BfH{PdSu} zPw&T1man3?c_U`}b@0OTsAb>q&=VU;>ZnzecKU{aUP4txjH@nM&gA8j8J$0xKG8n5 z0^&xWMy7jz*W(9sx}ms2L0igj^k^H_%%z6BsC85d1V^MpsSi8tEZac&DN<25der{Bv+N@d z95IRcjmv0@COK}`DYPcrSy=luKl{J)X-l*ci5CKf%KUQ7pYFDsktmhDm&8#mR+j&t z1tCZm@vUEjS5rgZ=bp6vL6GG&HPIASmFS5t(bNQxCa`D@nNy!XNK6hAg zhZIL0wa|hLT3{X&n76z4yvFx2yY32SoB?;;1$S>lmB*0@!3~eEVE6s|bM+xL^eKq) z##Os#W%^}rtmlKb*CPfLAgb~pY5ic8v4mq?=@u^j@EZOwi57=%Gi084npa6B_ zO?V>{;MZb|Ovhgf{&CoY85=zMSsOfh`NL?tcP{!e5FdU>?0^G^A9*DHJMWUX{dQD) zd$tl#jw-Du1U_)jsSojFEWy7HKAVI7^As(9l&|*u6$gFw3ZM1cgT(v}{FJiN-1tP0 zR2Cq>M0e_wN`nViU$l%wGiN&7Ad5r7-*Nk2&E4%>F-ucnsar z0S|)ZanD`L7iYY|%I{jKXvrg)Qhe~qCbo{7%DCCD@QTYo0{q|v& z_CJMAVHmgUbq19j$tf?Td*GTfkEd?aa7=doOD(|&mTvQTr&iD|1U02ThY#o(1@@(V z7nQ+Cd{%2XalE0X#Euy2P&4djA`26c%El6pY`C>b}k6FVp z2Y$ww5nr*kE5)DZcCoCf1K;?e_-B@?FB+|VrXI7%qKuD8%#S0vFvw1czo~<9M-1W4BZqV=FkfCbi8EeY%_r~GBC3lKed4wP$ZS>NYE{j( zM_#+#%AXa!#x`2oQdsER1|a9^KKHahOQ>vZB~nt7HHX`g3J{4zsF^;U{db+kWgl;( zZeuI6{k^Ot+S(=-FW*c`?t*75LD!ioBl7K2+}E|3LcI%01_g ze&frC)kaj{D=&T3AhZ?FfIN)RY&iKs-h8v3jeku*YARQpGMO!N3K7aW+X(F;Oay5( zQhTIK6v*opCH~$KfJu{(N~b;Eq=LmO9%5*}7{$pscnL*QXPmh$GZ2+O$$*)Rvk>>B zDlOQjpU=Jn1zo<+K?8e7fn`qkN<)`0EZk%mQDNh{px)5jWr#&gcKH7G8-Q1h$#J*q z`RJxfECl8VA2Zj*`v`%V*)s|rv(6-LZ*-C3tOL%XC}xccnX3V1`DF+txNznLq*Thb zl&%5`0luHdnLm4vU4}0~S1jPeEv4M{*=Dyld!Q=pcUSc##!lnv*lBbv%#fIWxQLdO zVGf&uIr?bKu(T(cP=bve8(G)6j-USHry$=#Y)j&A?PB^FJG0M_B8)M#`-;PE`3fO5 zv#*~-NzCJklSc6V?vJB2Q2rY@0a7{OhS9fPL8l|nR zjp*gmxZuj;SliT!RGPPb@@E2eeBYNZM@VUH0Lh3I26g&?qxzTe)ol-ux&XW%+WWch zN!I`yr4Z7h%$~9&qcH|g2fO%a-mO2Je!Jcdx{y_Kry`XAd~V}Z4(q&uwzkb^DNznZ z4X;9=d}$#Z-@;5vD9ZX&^B{la#`V(~x%N-Qw-xcrv66+F^2cS9IpQA%QVg^ z1X`$YZ^QiIgV~?IbKrryF>P8kjg2yU)kqqYOxq2D9g70D*Z~9bxc&C|Fl{i(c;T>G zDnn<%MSS3wGezHkl1ZK~o=$sL#0s3`qRc`5E8hWFJ_akXcHuZXgjPXg-UAA(r0y2J z)`p?wh9?&oQpzx*Pf&Kdhu?Vg(LGjb;rkpnc``(!)X$kiJTI@u@AUz^(lShWg^QQ4 z(*1uFVWVJ#z*MDIFOULL)z67?1r31Pi~hmc585RJr85+LeJ(xpQa)bwaeAnfQGuuI zw~RgqEn&>C&uB#Q^wK*3MvU4Z+ofwg~BjS4WR71eSvQ zxup#q$}E+kLycv8mEpFR4<_Xsjyhok>sC82IvrF%!ZqU%<| zrS2BK)`sVoxM`C%%-?8j0lvx!Uqa*CZ}-}>H@^QqV5KK}JG{)+ir+v72>R^nqo@!@2{~dBeJ3}T^Aw0VV zFRF`p?_c%2wX}tIemjml5B~Y)$9~DtuS&b}HNSRjR$yHSi;~x|N z-!83Hmlq?Xg1kX?8A%Iea}GEyT;K zu(H_SA9q=|k+#*V*?Gx=tj}}JGT&E_&%5_ax{_%kB~WYior|jUwVMiPl2YRP?%tOa z#3IbBSj4*pWBKE|ZA@#MMMX?7XUd&0(96{SLc^mJZ*A9YG}{ zeEawX^si{JD=pebM+~wal80wDJ@z`T@TxHGrt8jdWJfd_ekabEJ%pbG@-V#9Yx+g+ zAl;DnlK0x z?D&3Y{Hyl2-~0ErYFbuqq60W{5Bu}Q`|L{RoF&;9eohCSThxDO__3mzeg%CmSVP0Z zqus*j4?1E$0=BhH=g(8Y3pR~Fx$U|wydeWMV3Sq{7FzJiUuS_2_fGF`BOA83+AS3Y zI&at^ph_Evq%u5m{Wrvi45rUdrn2Rt-_iQT7v%NnZ}BXhn-m#`fz;~Nte1kF;eS%K z)v-3tn>r@^-9Y`-7&qLPZm4YR*5BbfY0b1}KH>Dw^O$qXaLzq#5UCX-puL^rYX(tP zbqsH=Q=Gp`Qz(qiY>d(6Ck2JOT-1GbKHvJ3;;n8>4b>!!Dk!Orumh=p|#HaA0 zdbE;m9xJJT@<{;xeDBXfYAjrOy7aQ}{V(Z%ELuvJ?$Qm-70>;}b(KN-MWcAB6vSc} zZMfvnc0?-JwK+Yd4Ah}td(^2y-*Ssfe}(6aV@4a00#7NM{-HXQ2=VBSnKJfT)0gRYFuipC1jVTHM03ZNKL_t)2NrvKGsYu%z5HS?Bv?AiG%6KSIh6&XA0-PG-DQq}` zEGl;Ckb*$Fb}^FHVks%Fi)D|s7B&~hp1n9yiS}J~Nna?oU7KuTU1w@4wsmV5I1t{L ziuI|qhjXh5X`h9Ns_GblF_J(^ArpoIGn(5!4#Xhpc^>AOXP}?}u!wEjvC+A?^yS!P zf(~N>P-Ubf*+;2ks>r1R&no_MX9u2pV;hHM*D&|Tjwor-M$y0Hx2T3+nDY6V?AVn} zVcQg<{q3SvhMhgP^M`8;N$+axN^x)~xrIH&+i6h{q-3PWm}w!J}GFQ-zK3zHz~ij+~PDCb8=jMefJ&q`|q*ee%l;n4tQX;)>CG3 z;FRzAa@0;vZKnu_S|9^S1nj zz~HQ^MoWSL$;^D{66!?P!eoSKtSDom%WuYQ>@dFOyK^pTNl6ZHO!r>EI@rC9%4ILo zV%#v2diP@I$XgKGs!49!d9RH?qA=5*>T0sGvJR^7MM0E`&6|0xcW(yYznz+`Td`Ub zvXbJ6<}(XY3Eq6;HEMra!w=6*rh3zMv=oFRlH3j*cx5&mHEqfkm ztw`zGiLx!_tW8U!p%jErJbc;=@^Z6js9MYFo$Z*o=nsH!D5{NvC{p9{A7|{bMq@qg zxOgdjUj>ptR1pV*(V&%X{QN?=ob_A80bipbh7(I?2gz%h#+Z9Q zrLL}yw6wHl?@w%agh1xuSc2&4MFcxNi1pGMH6SV5w?nTocTa6m4VwEVZs6&APhj-K ze6Bd%f zu7jEy?29jA*RRJG7Gf{B0NcJD_UNOq-_37y|4@~Lo_U%n7cS)S<^7mk(Tx)-OUYUL z9t2X{v5(+w-sV6|tx4Oauo((oRoGiyi(gkO`DV6c==rVzsI8HF`MKc2OI!iykPWBy zO7(}Gja6l>wN$Ksm^za}+iv&mwFfw?MJ6j&z`O+unD+512F}mmhR5zF?YRClTz5Iy zn>RvgDskQ6cmuH8S|U2F@!zeb!9@6^_!EBD=>k%$OOvpgx7NSK#hor9GmsuDWKrQs zsWo_t?t?O@){5soufhaEL?VK<>o?G&XK%VbG@iPzA0cDVI9|T^N(M+t6;OQY1q9O5 zd8eoq-IHrbv5HlxM>43}7RrCAqCpsvf~lmmzKG<4zSL~J5v#*~1r)BL7+-0}C+-}K z6di$R*YFyJjR=fUv9)*uAbe*czEjdz{wMTYLOLN>rwFb5X_&je0XOX5xDlJ44nM8M zR#jn>levGrK!zpC2$ZizjX8GIw-T1@k zOArz+JYzP!JFMgLWyf$t=bw3J_6f)+%L^QS_~Bf4-F1u`_b656l3VXoKY=XdJblqwPrq(uXzZmHSaI^oK3s7A!Kwp-L2O7(ed0I*^z+8 zVCT)l_U?@xH46LEORo37@=EN=Rn6`ns%fy?c6146^gb0~mU7O6{m35Jilwi^fQ`4J z*tdN!)&?o!IgM-k2ho`j$Wl$>mo&O|rz7m)QF*|G9z1 z8_Q8fGN7TBfrqCz>w%3iAj{ZNpHJ>}e`EVEyD45cgH9)2K*eW^c=(9RF-hqJ(waA7 z4O&na5myWj)t)y&7vR?`@dQS6gOLT35p8zN2FIS3V5lq3Li= z8yb>R`16!CoPW^;SYvqmo$1uo)iL_MarExflM9a>$@&=&aQ3bJsh(TzOiIfZ@owiF z7Vj{Wm~=cPSvdPwR<_BYp9e}r*b@#?Q9Om6y9FvKg``jzC9Ere%I_UjR8`h#HU7fj=>3FjeXCQ=%{TyhlM+pfh! z(BZJn2@JvU7Lg~=#c#S+!RH}VO7EpA|q(hj{95vpqf%*kp=R!#$* zO9WCXAPma&;Ep%22$g^)`!)!RZ-0=&Non~z#+3gAQAS|+y))v*#%?2gcioy~r8)k% zLPlPHEXG>u>jkgBw~EiAQ-G?f*z^La9KJ0jZLJ_PJ*q?JpS6R*+NMhu90m|}drOpb z6-(+yy?@i5-<=Io3ZS+zrHPGIe!clAY<&^dC``j&7^<-V;DPj96fppE*YkvTw?dNcBY>EyuyP}Sh8jUpswBHwA{D-^OtF0Pj}AoBuGbeT&g#TUb0P|C47PoH?8hHr z|MVy9XP>zdK(}stM}b=g6bp*e=z2DpX)HGLV6{9~*$Y?ncZfpW{hM zI8UH*73LO!iTDIns^q*&B-LRbuS^qMbhV@^tOx}a#TD?)l3KcVNFglZP8_21{k-%G zFa~}q67GM-y)3HJ%R<@ zfM=^+h9!(Xl57$;^|-NFgL7A(JDZJCoPL6vKj(e)0?I;)h;WXSd?f@`Qj(+%-r678 z@$?f^Y}-M>n~$RcLA-WRB^HsyY zP#Rwp)AfuoqnmZcNaHDtb%wBL!(gI45W+XM>KIYj$TheBdBL)+fX8Vkbl{0+=ApC& z3}yj%9c!?WDt{xCPtYmB)TjZl$xcX&!b?#+a1Qic)Pru_TauZT;-^3A4%{^ciGrU| zNJwi#n>HCNS#oTn4kYo~E4&xqsMKgbd~@i^Z#bo4&Bj9db^nR#`XtUDIGcf87PGZ1 zm#1b9p<+iXvfHfVy&cIY8FlaOa&XC#rM&abG>$$_G5SxEjPDfoC4t@Agr?l9Dl;gh zNlwzF3Q20ZMJN#)>I)yFi#7mKImjmp(ixhlYAc03`DE}bW42@OE>tTh|T)3{~Y?=V^u zQI^z9e+nQ}lYGNX0gUuLkmfBDZE74tD4H3G&2P^F5^zlC&8Ii>%%)-5v_KI~|I z-B`}6lP=(eDa)AmvEY|o(7He&8zja!0@B#Hwclu0>5bn2xU(kN)2yt5ie1;o9C;*G z;NL=_JeXZ>%}Duisb0VL7cL(s=RZH%?nQ4=b#YF!zZT{nddi#I^G z!|;*<5UJfy!T}woKJ17JDHUznwDFPOgF}Ib)W6T2;s{KVMFoAmxnO*>B80>Q9Uq{5 zmrceRtgws=cLTQhs3Y0 zGF2cbu^7B$L8wD?RFK#JxQ6$zJYN-AS^vJqIp_4#Bc$P@&wt^fb9?dplqD=!wgpfe zF$accDWqxROHJv7cki$H+ve|ITg|Eupy9C;0;5N}!W%_}rJJV2P~ybHU*|?^%-3H- zAxQ13BKws)in2!$^cae+3I**CLe*C|V`R<7b%YMyT8}wyz3h3@>Yk8sl}6-uGcpPjCMVUj`Qk9TWsQ# zz*sf?o9(HW+=C;&4p!AR6Iijp$*(o~M^lWjDFGPgy+)6#;h$61W2>v6FxSn^n=tiz z3)X1TQegKF|NPDG?k^mD&zJ1l6OPe+VWHfTrix<7J{KIrLjC+z1~Nmid{L8(+uPBU z1Wd?-HZMY1eS$J?fVuCFq-{(8Rti)AR565aZJc`n;54o{fcq!DxWvynaL;xQ1x2k} z-keT@=6~DUcL2H;@LwV9@$i0=JdTbUYXRS{A2~Q|wMpI+U@#N-ph=n!D*Y{7+MkI) zdtd`FmIDuU`}pkxy}wsoUEQp<7{7PT&dvSJA8Oe&?p{9c@5m`Hr~Q#fvUBH70165U z*s)>-j2;csru}C8hxT&6#Aah(W%8D5Vd9&xy5}d2e;|?D4l6cSUa?o+J$mFNiW(;- zATc5JKqmZQ2wbn=j58CyKcPwXM>+9WeAApIk2WR%)0?Q;9%LBySYz<3nR>2LJU9C` zbX^^K-8!r>L?tsdF!|>B&C_q9Iqjw?|LQm!TVKbn@{&eXNC5?trZtKh2*k_Z{uGI$ zN9WFe=ED!i(5qKIPd`1MH{SRdP<;92!>s+WjBY*hIsg1oG=BSWdF%3(RbVRc^>Hz7 zd!T!afJb__A_(N{_1?-DIu>s8f4c$zz47;r3W!O_5@R4^B8>{Ao(i){fB>A+GWzTZ z@e>c?zhnHy{fB>zsPF&d!Dn z8?f)a=lm6S@9sL$JMK6jl#z!YcFPa{1&SCr@kF+7*ua$O(^VnU-7r`v4Vop7~dU~jj9+cjZu;=CqQloSnz5Mt-4vlZ%zl`@o{|t=%1HD zFc4t=_F8`jmnLV`p9reDec!(p9vs|QRn}?QX*X9>iZ1zz3lEdzhZIxZkX&+!n^w%2 zF#`-dc((t}t;JX;FBRQ0uB?ahRb``M64KX}oAHvH<~;di^!cqDUTe3hNGa`G*xfq5 zieCGQOjD-355Sub_Gb3-O3pkchuKTrdDgND&g!4Ttfjlje`J2l=$Tk4pM3I3sDzjQ zc>-_Evs`tW;hk>-Tz!h=jd>o|o~(F%P6&O*IamuhHgV^p;j_=)XE2bQtk8M}o@Yo- zx)9~%@b;43gd-Y*ueYb2q*zo@M;pTve{qe^;K7~v^2?31ZJWi|vBMZSav%*2njSs! z*}c1g;lpqC`2rm~OR1SL;{h;x$nE-f_X4c;jfT#`Z%M{$(F#c2t1Y6Wqy$hr_+V#J zQ`@19MYJ79N=gGURcosVq6k!xHf=cD$FxVt@(U)$o{!dDv~+;xy8bAz%#li!ZQy_Uu3Y`t^A8=X3pK zm+|!T&$D{#=MXCFEq32{x;2b{zL~7%^UVC1*a|nAivIV z=4AyWC3zITT+4U68r=N1s2C&n>^uFwu5zNPtTYlWH3TKs_L2+?N`6@(x%F>?-MgJp z@%(cNIq6jxTjJ8Z%~zGx2BfblD{Wj!R%*AOJnEjiFw=vuq0T}Q5^J|RF-v@TGBiY2 z1Bk8)_(Z0acwQmno`Q$}1+$k|vZqe*@44kzYx!VKDb^Z3m{Wo_hK4)tfIT&sx;kt_ zJtiC`kk^vSKKYavZvGu_&9h9KXLxIl+wbtoZ1*fL&+-T>#Z9vwgo-NIQw_B>&K>&I z=hA!GeAF2i5D3g55ST+SsFA7x8yvxv$K*EC1~duRfk1%4h5b3>xNj&gujjPWI()B*^3vG2u>vWaVN(dlG87j2WAA8CrM|SAcB>gyV7*iVT4BBD zN|Ep1(0U1~$S!Q(Au!sY^;WE{jlYM4LutXUmCg`em{|w{0tP0FKd|i%!Nqq!15~+{ zlD))l`u>c9kFzI{x;}%XxK&>A~z7z`Zf;&$zdeey{^&VJ(0nFEzo+b~P!OL>Fj$wj5?scAqNUwJ1c$82JU(1!Pq z8P2q_JGuMz-4N*IcmkmTx9ZT)pnT;Xb6_ZEqN=QRmA^y2V0b4*R=wn3FAKiHskZK6O) zbSVxiAxV<_Js6x3_QI3%_;6l17oD8PhjUB0@Z@|xm|IGfv4kc~ifu{z!Jg9$oe50XrZth()G~7;Y|C8MIXVX9+ z5bgDT#IuSo*VZ>OoN8ZMOc}RaoRu2n-l;_l=XEx}ayZpnOK7DvE5CMXQ=5cy1z#jI zS4-)fY6|CPP)kV**_LIL14(|*pHTTp;3vEQ4GoIgJ!{#t>0=@yiC#Shk)7Q(VKn3` z18M6&gQhYpNDnDMvL_M2$+2i*v>EGw7zvh8{SMHJCEefZ7JQbo3-I|>IDd4>3-o%Y9lFlMq_LRRr9WmHvjh@(J!2_c2nuqrHh=#?UrG3=<05Ov^Te&hKeK~+{NOh9o-AIX{Nl9H{G zTgOXw?Q+YCeS1o78J$i>yH+eJAHaweHr5I!RU~Vau z#!zM~kt?pihQscNIPbc_R;|eU<{KD34}h~D^DxFT`0)@*;wnE8RNYe2uX_&a>!G$5 z8xCWHAnk^yQ9rF9dD1jO!3&9q?O3BoO}-UjllXj1H8o-7kA6%{RapA6YK6JU?0jhh z6RRU+WhKQ&eg~l{+-=2JjOpuh0@0pd#~V&Bh_xZg%4=D^YAT)cT98T+Yk&F={rWwG zQoVtwK#7Biu#!b(g3mTf`sYiMJjoYZ1i$Yj7?9UQ6H|cKbuMGZbY;tyh+8P|W!PVP zt&p@drK^Ro;>NPV`*P3S6lDYmN8JC<8tg^^3m3ZY zEnSLz?>)CG>4Og(lKA!4&ErQ=#t%LKDH%U%6!%S-z~aS=`TqOwxntbJJoD%yt`T_Y zrDpMGmYhOGT_wZXTaIs^O{bg`ZuxYb^S7XhSAOLx^@t8{@ZPR0J{AIebtA1bJ1hJ( zb?w|rD`iNLwfld5pX8DeN!wh-&D|7PwUVi?3ub;U35VS-v>UFGoPAY35t4Xx$=#Gh zPK4Sj$X`N!S|@~##CkYs@Xsbz0ivUt=;!w7$-7Y`hWUbl`> zqek)9r=H?XDbYf>LrPjG#Ta0aQk;2AE+5P(b)$f}Wn6f29xu%)<;Iiq824Ez!MERz z&;PA;cAj96r7yn>MfF^LishBrmQTlq8T?o(Gso_s^%H{PQHH|XBkXzowOIV9EupI5 zFe*QLAE68x8LjaG4`Zz*DLF*Y7$#oY&L5p5OaV-MDi8_;xbcXSoACpQ*ZXA&JcmqU z{4LW~5mR^eKU*YLH_*Oa7H!)+%Hn^IqI`P`&c5YKLP=?qS8fL4I)+kOJS+LJLb9k- za8pm$Q$M^!&^}W#Fwf^>e5bGYICCS_BWZc<^+IOPuHl6j%8}AAVniOFeA1aggVx6y z0HvH6RV-P^yWP)W@vj~`GcyTj!NNtqva&Fpel0+S>k%TAu#|Le-4E*}5s}JAnWIyH zy{U>e8S?HEWlW5}Z7U2MfIa+h?2^UU9z7j_v~VHz(n}qPu)p|Hz_e)~1b?~jKK?X* zJPQ{tWWj>@j2JV97yt5vYXqKuJ|4g9Nro1-z{(PA-5h?X8Nd_YZN^#<+QfR!+dIC> z>ACY5vhZbwE_{Iwxv8LLqDwD>AMU~y7yoz9A9kv;LwhLB%@$PdRE&C5Qc~*nJalO< z7&$sf*It>-+h1D0H0PXL>+F~co)M(hZ?{gr~g(pKxDEto?tteK? zsW?k#U_5N$Law>y8cv)(ojLR7@z+SC5!lp4O3HB!&8(%)!Q}^YOR>iC;+#?{tl@!A zN~x>1h@nGWzDwt+H>?!2ZcW?y^C`OVbEeGkPzug?JO!gHtsk#PM}DDjgoZ7K?DNjU zhQrQ1b0mTdhiNtP3Vzx63!}Ck&L2(>P+hNLS_#o@;o4ZVb=nC|AHq!oj4|Y-g}Cj- zB6hskCtk4+QdL+fHv)BzKvcZqN2x_Gi1kvatC~S|=`6ZrpG-Ti4NDi!r)Aqhl7mV9 z2*8&xQwC)veOd^v?;&_%g%cFLsh6Z{wm=veYXG8C0Ec4ZZ{@a3iB03kw1Un>0THScp?|EsW8 z#8Bptp$SU3FM??wC}X4eZ@%f&d`FFPLw{?rS6zjzt;J5A`rGlN_n$fy8;LM!+&FG~ z@Ik)&?mNEw?mPZC>K=a0b)FQ;5qGG@45TG{|Ow?TM}*%{(M?E?AMHC#Saqmm?Xp8 z$;(sxZP~saL0Y=vi1q#fWAGXpz!*LpHHsI;_n=K1 z%dnFYNEq%X4*N~Q-?TqEvvkZ$ zAu@d}Bc@-$4Yxf)<)*E^s9L9NS7TAYbrtk)%pU{(ih5 zh-8ltF*r_ZHv%}5M>tL1MPIQStu!B8?o^jA5$^2LZ76?Q@!I2x8~p9q`6{0!JOJDi z+c%+<_MNzBf74WS{{-B7Mgd=LC}G{Ye=~kad+z$mEd_=QO;ExnL*3s(8Jop_`e~=( zi>*zR000w9Nkl_aNeX zo~C_k2wi#;k=t)auUduOy&F?ggKcQQG&Hzg-|zW_Qbd$OYE49IlH0YT|Ki28JGL|4 zIhPWc`3<(T6soGAw$>ftFt)zl*&PzErNoTBo)+6S@$;0MX;+XR+m4)Q={MF9l@=4f z_IvnH$YaqFL%8IHN69;T2SpW|W8|DrO;B_t5vBZ zme_zLV?ZywfJYz{BGpTB+lg`0M&TpY z{#m(}UMoq5K7vk1N_K3}tog>Rm0P8`W7bL<4)OW>b%)_MDNVcRwtxi`{~yT zw4Z*h!1$s8R%70VP4oWFfB^#tTzI7Vbkg+V`nv zteXnV95oBh_EF%h1Qa-`LY1g&9Yuk)jynOxWs9{6f~~;1b$0>^bOgLqJTCygOj=sY zmN+v*BD|%L($czhGD=wjfi^%EAi1Ke#8`#rzrSEW(Y1w+;k>BdDE|jg{y_Mu%IPr` zWu>A!CVjM9YX14ki8yuW09p$-0>R+bfo)2+(d6^qj%YYkRoDZHpOl1|J)6SQP9rg_ z|LQAlA3S)k;A)ih8q*n$8U!!C3Lp4YDDm|jDoWWk;rh`>Vd!=6)z_xh!l(ZtBZY(Ueow*(L}U9@6gguz;n(mi8n1a;kp(_`ql!KIH<9TxCZR#n}#~C zxc=`(LE7kb7^v~TUyp0b!U^9S{P3$WnR#OjM!CvvQ2sSO)a35q^21Ht0>Bv$9k=h7 zA3Z06iA}=BZ^48U@>j(XY6D~*^&N)%W)xsF9DVc-|HmB>xO>6fu3|TRfBv~+6iW1e zqHg=4mcQX7l8w!2zorCWA}1TzKMH&xC}yY5og2q(`dhzooZb%JoeTpmgNeW`2N_@Z z2yxT&8ySf!+a~mE5iJQ3h^4=G?{5IG_BH@M_B;&G<=k^A{`~VsS=RIj03$hRFDXt0 z;KM}NxX<)Al`3dj0QQv!(O1~Mt}Y?6D{-;+Cj=%C03qD-hC-M?{MnT;bewt=pg8Zu zTbR`HQrcdA4e7uBdcgVL_dh4@s4qy*?w7Af{rhruzfeQT{m--gl-poeQL}f`B6RP%I2(-rwwZdqLtoxdsrM{@t_OJ9;42T6R49G^yQtla$*M+O;RWO*^bH z6m8n%C;wEJerq{$>{yi6q*gr3Js)9@bk|ahXR`T^T$?5l#7Qi=Vg_oWiWAE8-;J%R!k%&pHr=T!m6Vk5=&8FANzZ{%e3??r#ox~*`Rnwb-S$~+B-;9Ce~04Tb7ve% z-T9vgAqXIiptka_U|W)sau|VNJ}ERH%})e_Ycb|(Y|80~swWZQQtHHRbf`5uD)Q(7 zG*cy&zN&6d-?kO>H^purc!*4l7c>S=1_dcAIZDuA5y`_J#Q8OHbZ7HF3k-%o#jKAd%y8|ivrJrAo5HW+YcA+X8GuA%l(*8ac1u~*bE zZdomxHShKHZoqm6hSFYEa4=Qne=~%XGNfl;g^g^XF0u}5){~YTVA7vYB{}PNG&Gz@Rp~B< z-})xGc?;NDDQK0}f|T@o$j?s){?S;KG+OzEz@DwJSrWT&|0uB0mZd*vgb<7z<1y*a znrbOHN2&utk+pV9V(qTHmZWYyDf`P)v_Jh!DnI`ZkzHX@T4$18R6@&l-l1y2e9G7S zKtX;hOl7sZe?m>N(n(62sJyh01hO*eGJZU1efkjIyqRBy--MCUpU1i(_qX5vN_BOZ zi!SQN!i7Z$;gRP*hYYrhcTj>p>X)kmOlk5k+a?FYQEyB_$oTi}D}lymvDC$PJso^|WWkkZ4G z3Muq{QR4brZi&fS9}LQh=TX(I8`*vy7H!%@RYe6JmToM(05%oX zv#s<9dL8Mk?De}xF@91{wmtYLxz}Ao`7?hfIZ090a36~n9?KbLO3kz@8_ud-jeJhr^mD-<8~ZlVZVgMK~;Z{RxGZp1)4(VN3vHJgf;~v?eJ% z$eMq{_hp}ROvb6?CAFd~QbzfT#k5RMX7|{85kivIGTrI3uUtXx*t;m`)`uy<4;dOc zlb_1IXZ4x?ru8w0vHisbSfy!k#_3pXP<3@NY&N}bU)qiw$;L5bXnpg|6MM=ocnTiF#l>a{E{}Un9p;Icmc1dz`ldxDWc;Papo}Wrewm}oY zC=ZiSM=&LwEgLVOqGAI{Nx4{?Aj#YmCEg{m_Y3R4L*9!W!SF-D36fA+$8lM#aO=FM!K zIFZ)Fhf^|T3K>To1^yI3vl8_8SXGQ&fAA=AQ&ro8L0J>m>y=WhUHcP9_3uwG5a9mE zbI9ACz$(d8!5~368bxM$zHh=i#Go8Xow!yXt@McvfqNgqy?-QD`?A)32B3eKgSCqKc`XQ>cpmRv z|9k$?D(sH{MC^S!e+X_0kXj&_{eL0(|F4J8l~*1{ixw?n!_TSb)iCWx&Be*@P<6o$ zwyYdQs~b8|ZToR-$0O+4Wih$Ashm4Bm5m!K-4tMNDD4D+y+vXxBzBs>zPk^U7Wn3S z$)+N~fWC_BFM?~HttE1)Aaa&Zb{T<;Zl$ymWfhSW1@l1c0%M*2+{(cr+OHR!xXR<( zzG0U2RE&MqW84k(thq`ua0!fkDad{IHBg;g3C3S3lCGi~rQA9C*&nL^a>EU@8$Fub z!Gp=@-=AM@zM15#tbL=*dn35y-k*Q+2#+U!&ESWc z5JJ@PkCVrf5y)WI#tiCfHCo5jnzb=xW`t4NYH&Z~?tj-M7rBCUw~9rT>2s22D= zhTwxE_i*WUk0*vTP~IjPr8SER!d&u^;^#j`Sa`Ii*Q$CN0-6+)>UQ!$%vcmVgorf& zS_tH}ZTvEFBqjmH40Y=kYXA-fB_2QiQFiaHWYeZijZ}$c;;2VDRbnOM;-p==bYb!0 z#RyJUtV?*4rIGbH{ z3X&xE47i@JrX}&ohn19+?{Ijj@0cSh&E2hA8mm{&qU)N()sTY^<*)qei(WRa^wEkR zJxBfeNhOgun^Qb^NYTJ&U*5=#&s4hdXGL5KA#oJ|r>_frMCdNuH$ zbAueUwVoT_^qAYXfljGlF;MFxJ5rJCr{DPUVX?-*uiQo{cO6}-(=lcKLqs{9Dsk)9 zt>fy$(pR!o35vv0x?OR81CR)5IW|5-$IhLouBs*{H;1GlgVFx~JRledP+ne6uim{# zPKkR;GDG2^)fuD*f*jwm6_>aDJzu<*#VMrdm_IZ;*sNKH+proNV!KOaTwel2-tQ+904-x!Iu zegmQtxd12r@xTXQCm%xU{|AD%bLURGSHZ)CLKeM_s=}y*b+bML2Obj2*bP|tJe)8R zI0YC%oZyNQTTSUM{BtsK;nsbr5jRz)P5f=(?bQxZZ3;;yeol;*Na3XdkL=^w4)pmG zQR4q5l$Vz`d2deUTlw^#@{Ntc_fixHg&L!*|2i5J6dZpN59dr~t2ktWPdN9 z!_5EefY@Th!G=9s{=Kkmvv;)@G2{iyod9ibKjKRNrlFmi>Daa-T!-V8_Yr@uBy1+w eAOHU*0sjv|!v+5&0000A355T1Q6v76*MiJf0U+SqX&QwQQSu45<#LWNo)CBn4N7OD{7xW;zn*p}@` z%>l{17g31xkMYLrK8hbczz-Rv^cy0A!G& zKnhf(H03BuPC86eG!0F24p?^HMP-s{`i;~6nH~oX0Qmv!z4&r0|K<1dr(rY-`EoK= z%wz0@d=2BiWM=jK>y6^)kiR2pe>;_ko$WYK{f)@l5B+QkfOT2^8S(<;gQ?}x`B}1D zfXsg8GP!uH4?H7xX?-EJZ^SNRPd4f8xvYur5 z7jcQ&p<9!F0`ieDioYlzI@qp-1k&D1b3{81`9|Xg&BjFY>Gpy+ieQeas+nus9`TE7_ZlUg^6c)7>>mHA(!hM%$1WI?i3tCS8zy(guF1B&h-g@dILD36-le9P*=+8g{X*XnyA#H)B*bl?D=$#5tE-x-X$@jV1B)So0Aw^>0~~sggr2Y3=H9g)E@5cHOU3 z!Aun%G__h)rHERsX>cQ|fEg?Exsq}3zbc%!0h+z{9tJ3&$?#-MtI~ z#^o?1QPda3_gwgSP+0FpxH?x=7E+}*L8VeSd|Z(P8$~ypCTs|!apib8Tr%uZ3)t3{ zocM0?8Pytk=ze%aF2c9DnR!AUlRoW&OSBq}>Zk}iz_1gsh zgE)%@VUGTPf{kL5*V)S+>NPY5#?v52%@)D9iN+(hirEzv#-qf@St6@=(Zpqvgx}=b zz=us9CwkY91$fZJJ84AVhSy_t(Q{-mc^h{33zP50y>u0_XyYsu`q<BW%*6$j7HNT0&JYRa z@`-FQw^E2FrgDWO(uzY)6#a|ys_u@{GLp)HOCWR+VL50V(iHdt0vic1!ukZ7A5rE> zjV21kbS~>WJT?9QuScU?Mt>@iT*<@=dmo;L>O?MEawZemL?Kp6oOLd(I_KlL#au2s pMJJF$7Ugmx501|Zk3mk*Szt@Fihf=%;vy{Bb_yqiUtf=*{{ZoLH - - - - - -{ - "fontFamily": "lg", - "majorVersion": 1, - "minorVersion": 0, - "fontURL": "https://github.com/sachinchoolur/lightGallery", - "copyright": "sachin", - "license": "MLT", - "licenseURL": "http://opensource.org/licenses/MIT", - "version": "Version 1.0", - "fontId": "lg", - "psName": "lg", - "subFamily": "Regular", - "fullName": "lg", - "description": "Font generated by IcoMoon." -} - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/lg.ttf b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/lg.ttf deleted file mode 100755 index d33b8e5e8612e0059a83354aa4b80782acf7af14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2760 zcmai0O>7%Q6n?Xt*iEudV&|8TCU#uM)PXpS>ljL*p+YT@5@Fi)9x4Pl?qa8Myq4`q z%>l{17lA~9MjR?QpvqaHs$7uZ&?7=zP@PB|fRJ1eNIjs!p~yDh%&t?nQrmH6=Kan4 zzIi)48)8J%MP-s{=Jm7T*&YuK!15jXJE_%V{_}4a&JwXv=vUIoVjgoZ^c$EDq_gYq z-fR>Rs`gC+LgN4`o(M7w5=v2|CX+pEXj+j=KlG zg3j|ztR^q!X@usXSD|}z$yNQ{*VmSy-zAc6=8a+rJkdI@b3e)Q&+J2Lhi^mr5ta|E znf*l(*1_Xi8UyVI+dR>pN50j#Me{N`oV*sz<`n`*<9!r9YnDaSD7Dc=*hf$enL1(f z?u_gl+==YucRt?v`}fAKYtPfDH5wwzecu(~Q}*1##~OR%e~$k#etZ1W@zVJ4m@-DA zHRNmMAriCLWh|v2}OE?VOFxMUMt2{S!{d zK>yHS-|W!fK)=)Bp9oGykH+Tu5F>@O@?{|Mj{tIaw#6R>2@h_%L&BQH7lM~FyE~Gf{?)QFcPuN!#>{ygx56>5BIPNe4IO@ZMr0f zq%FLu#GFIUpfeZ?#)e{Y=+2$v%|B_QDZzv_2})qUc(1TVJjotw%VNj-PnPjV%jO~$ z$6aZ|qFhVwa>gE4ecRJ_UFZRcK1qYtEOt24dQ|c5mN#HWOdL7YXaVU75n;6d>w zZ}Kb;v|h_&+4wT(n%xtax6%2`d&TbD#(SA}v9c3)*ciPbd^=vJ!wM9 zO8A-z)LwcSXP&nvJE7RaAnV@e=Aid&nTc47vqVnzqHUK+VqsfugB-VIoap^L4%nl% zy^}^5Zg_#!MbDALmR)$d*KD~P_tJIftc|l&=p$QZD2Zgt5_Pkawk%T{J7UXikk8n1 zI}Ng@Y}o;O%$7UpD9hV&7oDSsExW+x3tR4{SLugrnzEG6luG&Hv2ZxOQp&6?Pp6F4 za50(6tmIM|!^o}`!r2wXoK9x5dSRV1RKhP$MLI@d{L-`nJwt1>Ow*JigH~ZJQWA0o zzMPm1*t3W!z?X$JE%Ka3R2DxS_H_%hb>-5cN=vjzDrX3SMqbYqjkQ8bpEe3<&`Lqq zi{YgOb)S|+$^bzf&_%#<&=j<3$OQmf1h|F!b@VV$7D(0fLUF~&d5=ub;3LgB6~WX% zn3s-V`HWRAYdoW;*Rsh1ok3t47+GwkV7X2ixso@n=k!9dq@VXLuX`6##*$&=rs-IluxJgur1R%#syKtB}8)QX`B%L-`8W>|FhvLHvj+t diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/lg.woff b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/lg.woff deleted file mode 100755 index bd370be88d40b733dbacc2e04819ed6b02e3c292..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2836 zcmai0O>7%Q6n?Yo*iEudV&|8TCU)G!)PcCI>jX-HP@$AaiE7%l4;6wsuCY@&-pF=D zb3k(MMIce25eEbZgq&4Xl_MN_tPmGeClUuBBo_oy52$b`*yek)n~+wt9p}xw`QF?2 zy?HY`o3~F*Pm>_D)-G!0vE`OEXZ`+m>P+|uk=O_H980^Gx>JkEC16?1udsaf^~{+} zvdGv!n6ocSM<%!O7Lnp0YI>dJMx*#iHk~|Arh}FM@ZU4|7ZUX)2#wOaq$&_YIbNUwt~aWE4wS z=iOaD6`HF4Al|1Y_^c}5Vg8;qir*r+JAUiD_!!JDgo{c$W_GHX>;Tps{&pJTvoP{l<|c(6LVH$F{1J>FiSkXZ zlS*-PYgls^Jw-2I#eQC%hu7!l1$wZ;h|7a@NBqvc;E12=VHr4250^-k#aeV^baW(I zk4HyGMnr=j{$Gw`{t$D?o$F0Gv#^F~_SpK4d@kZ@OxQz7m zA&^)*==WcMdp+T0cdw|x#<>gHpi62ctlD|ld z9Vfq+p2YbJ;QU1+-6}*tCL`Se9{n~Jv2mqhnr2-$b<=DRD<)J7aS)It(gGZIGzC53 zp4i#DCa`+INdgSfKquk`qRbTN-Y+2~QPs<3y;?6<%jK%FUM<)4a#a^k12%y_G**Oj z56J8TQICwPRPdyZ2&P`G>PlR%)=Y#ERltmu`CO?~rkB+Vs9`HA!QY7hXBOopM;^Ql z{5W>e;O=D*u`Y*Rg%Y6z{w~CxMT^N^#Hv$OZ8lqa4Xsp)#ZG97V5h{!jte`&X;?cE zi@2o*PfmO{g{*4zK5#!gBo`6d*vLI5kFk*X*c|vCh5Y>Y!pfWN$N!{O2Um-3 zhi*;p9p!Dp-%8xJvf&x|J;6qCQ`b1keXYZ?SQtNsdBT=B#tjIMEEQWAV=1%9CtGlb z4bmHQmHrYP;#J&5S4CCaQ-+nCat$8L+CeYk%yZkxPEPEuN3`wc=A?IRT}WRmXN6qi zc^g+r5n)?*K#$ovPV{aZC-A6^w@|;p4KKM`=^1j`x*NOusjau+-v1JF;ovMa`oPu& zN}|}hLT%!Nt*hh^hi%;f{j{w&QIB}S)}6p7ZM}t#iX~fbrLz>VbvLs4+}7LZ75X-p zp&VthrP5OISU8+nC}o%D$5X~)xR^|37xJmBVdRzz;oJgzP9}4?bYX?ERKjnGigb*^ z_+@AT^DHgXJdIO|3|a(Qq$Kn#Y!+89VRW7SPoz5)hk_9>q#|$`fSW3Y%O&j@= zFO$xv3&~RYyl;NRH1L?l?+Lp=^p<#&vVO zxO1)g$fk$7xH(SXc5U8#%l4V?O`u=f`;i;Je&eRi+~+wN*FjvTcHZ36*K=;$*HLL7 zuJ?=_8=ijs(eM2dqx%AWD~}8xpML8tw8U*UabG<$apv&j|MtTlah&u+j;nrQtTsHV zd{uuR?!AUzc?=n1FM9*+QTwf9$7WA^p3^>z>!)%3yNRih;jjPU7e38#;?HpX>tn;G zr@0rIi2KWNothjzR{JXZ)6*Qcc@B9GPfs16{rMdaxHxVL+7o}{j1A+P{boLLhiCO~ zIHR!^-@D;w^Qh0!`K{N{bH9_XHkS%b(R$(2&2w+P{?_Zf-)V_*7C)ksbDA;E<782B z=HykIMHtVqhd7B-**10S!#cg9;m#xS&2@&4sROester03AXUo0`HYC3r3aZGF%p8$#HqiYa8abgX_d>bYYwIV52SL`Y_^tuEdow^UJX| zE4fwNYHkg;mRpCJUC#}08@P>Ffz90Y+!k&tcLQd68|H2Yx0Bn&-GnWDGj|KO8yk5q zw~yP8S-6cmz}?OrhVDry{C7c9F zV!SkL`hXy>kdKo?nTv`4FV6QfFWb!SVz2OR{QdlQ_}>W`VWV(Xcvv_u{7&2={#x24 zeL{}Q2jvB&PdTir>X`aD^;z}X>OZKz)52PZHmNm~bN!>MpJyeB*p{#5wu;lGcVkv)-f zk@@I#(UZ~d#=2wY;&S|O{OS0ciGjpW;{C~gZ5e18YI%RlCtBW2-GbE=u@`t&XLZnW zJ7^Di>sUFTRWfo5Q}DCaG25z?1Bz@FD}Ci2R>3dtVTHUR2MT#PWCxuhs73b*`J8Q) zONIV|Q^v!bW^C)ZFq6eU6h$$UXH6ML7T>2S~_?+SHTc5O`)ap zR2J;M3XMLybo7=`$S5>X#icWq4~KbCd`RXoR7vWmp^7SdWy)M|C?*%ox4WfwaV3>yT(JV`DEgOw{o|#C)g9e^*AhE(3#at6Svr`!AgcvHa=iFX95D4^c7r*{b%;KnEN!CPDTy| zZAA`R#lA|Yf@8VVpBFOuQh&MFXN7_?%WfR9ce-PNpgEXn+c-2l(7AebXUFQ*>~DuQ z_T+cE^HDb&^bKv?FkJulRdl1Ha}{wj4;N*>Vwb>qxtx_?ovhSfDP!TVq>Eq5DOPY< zDfiiyhv9jO?0nrU6trx1|M;(dHNMR2H+7j8c!`%poOp=|VS6TQ3$i964_RWkwdbR) z(Q-N3>i7GTrpp~xc%EmfZt8-}M+5O>0-r7cEvXE5lt|P}wnE4eCyqiOU4pz=)97is zRIaQ=Z}YUl3QM}^^sv!C=ZKlJD#cJXlr3dT#ZocE*4$n{?1}ZZhDF0<&92(v*saRf@nF#pr z>fg2ve+|jIg1yNuLQ>`+$GAX$K1qA?D7c<713sh=Yxn9NU6Qr;>-x7$PrzJdggoZA zG#ajH9Tl5H;APjB~+tW{d{*c>c zN9{;lO)Hk$?aLGmubnT+J4x6vfKH!#`DJ$UCf^>?H6x?lGlMbZ)T2FTYIk zljDk*&x=5Ze(=YY#39k|CXW8=cvaFheDtDSzsv43C~fRy$?Ola>{de(c-fSc z?b{W}R3%MHXu7fA)bzPIT{HI^y7tp2p5VZlK|}0y(18HlZQwcpI*kESXThyk0UK|C zOonb)DVDM}euX9HK=XR>Tp)(t$uRdAh;4z{RLV>1RIYKq;=}T#v3|aOa3_)isD_Cs zLh3l&3dugJGB`MT;K1nO@w*2OOddG!+Tb9LqYwsu$O3%)*v{W|GA9QIF+ZXo0znW& zKMs?Yr#|ViEKjT374Qe6lhL3*;BvQmtlZ$>p#Q*u1OCDKYlCxi@E>@5P=s(1#6fD9 ze*^ah2P;?QS@lP#HFnHn#R6_uG#HBoqb_$KW?^r&bM5R0><7?3Nc;t{bMlHz$BdFM z5JSTeb5X8XU~f3~RV-VE0KriqsarrnuyCu$zT7UE*=$VDOW}QCDX+)k9h%yKUp^Jn zqdsK%qIxWwHKq117s|2Nj##W*U|ef7U~8#lo0sqC;JxjMxPeXEo{z*lS}M_w!f3WF znbPb)^d9sl5sM|zCG0I8t6pI*vKOI6^`P$_UM}Rp4FIv0L9jRo!OenJUwIvCAcR6G zo9BXZCf{G~V_y#jB0;Z*Uk8C}TixsB*+hHC%62yE@prG+fh-sNVV^I|?hgjSyvG}? zqMW|I+wYlW?JGOl6SMOAZpeE6EslygGP!`ce3ktIn%N$b$@UdkptyO(>0Ntv z!0w{ND#*CYT#>d`$ZE(Gg@8>1dNk!ETgeNO#F)=8dD~EZ9>J^1QgEQ`QB;}9vVfzm z05>YUZbZ$9tcC)ybgHvE4|0<|J}a0EL=>0DYnZ0t^|%bR zclm~(tSCOg<5q252zo>&NK9e8YK8;xi0$<%pyc+h-b5@D3_V~Nrq7GE+#WA1C*X|wIvX4caKU541k2iaCZ^0cSoyecYY zA+N2drV1;hpe2fuDBCVmXw7Xe2KUEunf+%3J)2vR@OAjKt{sC1bL$={goYz61x?Fl z0?A%*2tSu&ud}Z?*z`7-ikc#W@S!a(y$Cqy4UY-YH>eP^rTY&1#U3Y6RVfgYYwmcv z&yld9Btv;B{i30Jyt-j|+y*nQqzQ=NmAtct2kpJn85m0YN9NQ+E!j> zBFgX#pS`Li?@#HvZX_*3UreyX!>G+?n8;(Ni?T~nOs6?f(Nsa=**~KlMFP|WSd)2% z21N;KI}bXHvcCXEREV21Y+fS1fSZR5!v4t0-K@|}l-Nhx1E|5xhk{8`THK6MA zpxA|wT~aDaAyg4?#Xk1H-UmK(cGum>yLX-KKD+l9U3pa1d(VNJ&U%y3 zYkU{CB7ms#ZRiDy_nQ<&w-zz&VnsTKg6zKt@89S3rCLkd0{r{-`Mt?}Y1`edSS;Ha z3z{xfF*QY@4QQDDh}Wy?E|;ASgj}Q)*x6_hWn^qk(~x9IHMEH3c8OSaO|oM?zt^oQ zKl1qZyc7 z27!=d&8w)I1~Du{v*aaI(+rm@ghdgtR#B|gCE8oCQ4L_7ob5!@7<5n<2uta!6fl4N zn3xLkX=;@`wo!9eWeN`3zrxiRpHFo9ld8X^C8))NZ7um~TQH#pTUz{T(%+fL=QnTI zxc-F=1M9Cpc*nsNmF+v1mn+M6>@2NdTsoij1_py}V9r)|a4_ISMkaULhQHjnVZ*=+ z>o;E7wxY7Uykl2sc?H5v0Dk{A`z2cro)Cu2;QS3F+1%MnFVI=y3eKH!vDBOLdV9S- z--X_k&)e$nmDaYnXP!YeY_bnQ_jnI%k+9Z~iV779pcttOH{IlNxr`Ch9KnjZp4__+#N`@w znWLs@f^jogb1$&>ur*Ydv>Q}|GD9s?*gh0>)pU0aC)eJ6YzBIJtK2q&>!f zzApDK=ctzzn>~5xqlcb+^536%=7kqfh6n8|17H3vtfrlqjY<#mFl=?Z0xi!D1+!29 z8{3a`C}O$m_;OzhZ?V1m&Xmh%_Jt-U?op3~4N;w&Q$-nAHawy?$V5_u6efPlicuCGeqxF4M|xGYmL6NFSPm zJ~Rj9o&^8c1P#L(I@AbKilFE?=qKo0(`BwN*a?eDW(@;FA;jI6V1?#vq0XX2e#QV~ z(Lbq!a~YpBm1bHo*$+IPz5Ta%Jh$}!0!38C_@sd&3b817obH9tR@5Vkt|A#!l_ULo zsRA7iy3 z@{w|CCmHd^reGnV@JH|4*jA`?3#KUhceeIySa-v2pT}3!1Sv2(} z-}Sk;FR(Qq$2dgLJ#;AcDiHJa+{d{;0WJ0yU^BwEhtB{I0F>nmgb$h+R0hAMuS0Br zsRCJ-x|_pyZY81hKsP8VSx3+*GWbTrs)O4}zEOQqWv2%<)(x~vU#N~{Z1r+~1v9gF zM_Ou~ase9w_A*t4zRSx3zy{L=XbGy%a4D*8cmtlGFW_={T$-AN1l5v(sK+A;iezX} zPr@*B?%t zZ?UagbNIVmRC$>PkmIolNb^=i05?g1Bz3tnKCf!P(kG~j+s)K~&vyI6!9d*O^0`cp z>GpX)Z+SuyI|O+fkPX$8q3Mb`58MW!?)G@PT62Jg5X2sDz-Rf~E>(raFYH%<4;_pc zPjs}kq%>)3>sI;$4-0YwkZ0e*UV@)Sad0e6BCQoobMw3g`UR0(<49y!u8^#wRWJbbcR%IvT~G5xsuH;wZ-e- zh_|)H*~WNV{g-Fit%^T$mh&N!5aD!@Lk;(zTIHmhJLk}U9DMj^;KK@fmT-KK8JLm# z%Kf~f7FxlAn~~Mg0vj%MLl`y8lMTR@6#Wt)jm@DlF#Bz(Sp6j#Ygkd zf?OUQ_&>>hh9dWUqyAfzseR;oe9U*!7MRC8srsxRVW|xOeCP@^Q9M`WHnDlg^fq|= zI7a&}tAv(0PlXw~!7IQ=mX!)wXH$a9ptDL5hW2IsV1l7#U?cZ~Z3`?UNNqRI-rO#V zAts25P?|nJ{Yu<0;s*POAOxJeww0>}2Ujicgj5t+K#+l_-t(SMf84la;13-DZ`;hi z&b|(-3V2+Jo{+$1r|EYvD$zr zKHY;nXf?taXb$3=P9Ow>*Yig974{YQQwdisI-i=Y(#lcWXxX-$=D#vDq$nE|WoSs1 zVF4Q&5`>MkW06pWjmr5ex7Edb80r^G0(8-OrO^L*AP5E2$pwmbsA&7rf-mhW3_atz z*;QYtvh$Cyc}o5Zo3C^1*dwSXI`tM%PXzMuI`-Ae6$QIgs6fZDl@Kt`(D#nj=c{b~ zk&8pc;#N@ZR(pueAG_RI{l`OH#lG$vGR0ySZjq0k`n1@#3;ySj)3au`1i(!)_tWo6 z+tuoj^LJIt=c@|~b93k}yxNOxlC8~y7GsbY{p4$R+9G)B@aQ6Jm_9fXgdzk_HULD5 zZ2D0N=U1S)p-#-t%?+jKgGZ+phEmlz=gK+EW4y1d4(E;HE+(WfQruKYAAFwjb6iWqY{j1ftILt|-fw}s^&=6}3|LwFCfG)G7Pck8pe8c#aE-06~ z^yh7HjICN_9DYlv>3=5z!FW6vxP540o_qVe`j)mVD4~iCGQHg7v7wL(!>$515Se;=D0ay?Rq=96|P2K-Fm zboRg4j}iO8RT|zUvPY3s2jGMZGjhJtkDRrDJ>5VBFx0`P<7N&2NfI~6LIT58UU4g6 zEwC_BRoJhbZ+0pf6S{bz&%V>0TpjD{Ntfc$jwie+@9x7e^~MuYObrHI?qsXpGVBR@ zpl5@vxvhX;_?3_P;TSTbdKjj{fX5I7Z_4**pe~qDPG|>{)(l-IMY@ z8uG|`pkl@E_l2-)IOUo&p15k=)1|cCr1C=Ze3=F=I(u}8J|NkvD62lSfW2HjkKfzr zs=+xI`BUWz%X{#PU%ZN*?j0H;o_if+$M+#SqKJZlRO;p()4d0B=`y5%I3jUE>Vn*f z`=m0Ipg1^c1B4ct=0ohcZ-|D%1mi|YjU-L4*JRT;W`Op(c$R_%4kw{YNC{mc`vb|P zF&q13_VFMn~@O5~xi^7N@ z;&NDlTso8v;OB5wVnW1Si4n2+RH{A)MsXhd9K4g~F#Xl@3k&DZ52en}Gn~Of=c}oq zI&mXB2VN^~E04%G_)^*s<3WBz=p_x@AuFJBg7$#?i#jK<7gA-)4dXTt`yytCUS?bD z)z0<4ZDZSf>pOERm*2m9A&DVuQ%7kYZ`STFNiTx$RI@piw?*n{hKT)LENFUhW5*a2j&Mmvjk zEwTkPkSZKp z&wm^ME%)EIwnuxu3WOpyQZVA9Ef57Aa0=1xdfZ>1 z^T+*uH=B1OY$zHSnww)Ozk42+e)mH2@Yh7NW ztd*c%(qrMU0ELsj1U-p#r6QREX-_EV9l0_nDMO2=deC6u@?(EF{i*32R*8xzvb2jF zG)}mOsCl4ON`}i2J;iQIRAcE#BpOJ?RMF}#hF0C6w5%zWSFaswX`UIkV|seW+R;EC zV@X3LB@|{G*!(?yNff=h)X~*ynXZ7#mLwY|Ba-RrkX+FXfzhXzwuAOCzYGz9+u1Yh z8M1ZeNUtZ<4RZwP?>&r^?q;4$VN9zSG@dfbt2c-lRu$KoxlSKN$C!@sxbZsG~YH|>Ql{IhlY8zk4z>&x({<(*(7{023EHn5j?Op zG@uD_m1}ue3yww;1ivOo7NV0nP{d z*%chS;aY^FzT96hjGa3+Z2V*ErLLFkm#l^R7OVreYEg~vysuNx^c_141D5B-yC3|C zweMDqX#(!@C`HfHFU#9BW~2ytwguj@eTdE+Lj)!Vf~0_>JVs7?H$zIjRRk|`v}PZ8 zPYwbN!YoVc=(wWO6~qzr<9-Md4%^02*n$Mo?f=U);8`rt8xNij#(M)X-j9$du)@6C zU!V7$_s+va>VAuJ`&kt-#mk1g_3r>X(;q~~+Y{`OK-5b>(i;tA(ZatH#%5l>d&ukc z*5_!`GZ@TKul}_6J6`-PILE6KM6*wF6Kn^23>*PAXxf&r3q$WG=th#K!g8|P)PljG zpnmt$FWLgn4Ztw!1Q?Nvn9Sm6`c+h( zRidijf5#nuzlM73!8599sAp8wZ;y=HevKB5Va-x(0W<=njfeqoq(ZsR!UBK?C}jOA zLufGWV0B>rrk=A04-RzRU{#W1t8c&e-rL#20OcM$d$2Q?>R)~KxwDSUZSZd!Ht-^z z&}a;%a2^tdRHur=TN)@n1fhnnyiIVY!$JVK>)SH_*|P_Q3-i^g z;PMU}bhv$-&7%}Aqe!$`&3`-X7TQi99Pqj>%%O@P96Z|(nGlCTka*<|ZVhzl3z#eH z0@C~&;)67Q5En@lC$!F9M#T5IuIop)w874`#eFFe3MSYnOLq2c+0xhP{!ecFb%qj& zAcKLQWNRPnKz~PcPxhNmmLTgOs2t;T*g74txr%*=R$4%ClFH^R0vIN9?97d$oSU_Rbw0J36;-%SQ{oWt%oF^A)1h{~|EPMPLl9 zQx4R4*)3ElIi_640ahtFwAs9k0V(h%2NBj;E<$~^Y}=|LQs57)NK1EjOFZxgplD>+ zRw@>_kFopw@n@`1rp2}_yG0V@UB2$M-QHb5Ka>?pr)a_IvR(A90D;a%?4JST zLwp316FsA#p-$$LuuE1kA5CkCg^HwGmf(FW5rl)S>>^?w5X}&+Z}<59(P+TuVSAU? z|8aTGE^h>ezG-&O>j~9=0cSRw>koNo^Li|HPYJkku4HdZyIkpJABKP%$(A31H*gvH zu*ARza>+~C0!_J%zsnjjrQy{DR;?hPE!3+HXPC#a{#|Gb_!~;$1JFt*`mnhx2xZ~u z(ep=-I@#yXqs$OY7{tR3ZXf#%`vUgoGDN<^7DPHQhD)nu!3IR&pA1$xn43wsgRw#l zbwYm#<@Hw(v4^3l>CUK+!fQ4Ljp8BUV6nCt9;{(;W%erYkGC27{(L2&IX}+KSkU*AQEwaDUFd zjGU(R6453W!50K46fK*^Kwl6cMgcPzLgD~7ZN)L&V`pda4TccMvx-MF52#g!GK>~1 za9CiR5*gLMlCdqiwRIj>~lK>#DPDt#4%3YAD@E}#v1 z8u=0kV<~0QCY+~0bwKb0q7Bd;=gV$;_U^l%y}SN8B2&CB-PDAD6mW}SN!C>!PI2h8 zydk%krX;v{4fb%|h`=%j(JF={7mV+ zYQo|!D>@G_<<;D1!U?Hh$dM3U0lX!9;A2o!$zVP}A13)#MYC@a6>lH*KXFkQiIA~{VW)=7oR2JdCeO2^Q07CsW*fde6G|ZD<|~G#r?GC4QNHE z7({)B-TD2;9{c`dPoJNLQN6xE;&&I%A?LC0*Z&?_)92eL3-(bw!8zbWZN8($t6I9c ziAH}iSd$;4XB6WIJer1&Jd0JZE0^}L*zWKnUwrtfhj%~n?4yr%)a&1`KU!}*Zt$)vvmuX9=(Z-^jkr{v$Yl56MMv&_an!GU;VdFl2=NgR7F82f=QH+ejXj8n~4J zU7?b;*|()O-eC2gD^dqc1B@Nk%zLZwu2r#f#iYDkPJ+t+M~t~+Kya$WHtEV1Nn^j& zOjEn-R-V5VagsO5@=b#9P)|?et*jwO9?`r}RA`oB0%4DKWKZrLvWX-S#1N1bq>~c} zPiY90YL(4hC6?wIX6rde?4%f-=9h>hm?BXCf~Z=>+%U{d4s-K0vcXf}1>pq>D}es$ zpw4t3hORwm2%;u#l^+DCG1#QR{>-I3_sfE$y{HAPjDTs={*C| zmK`KOj<05jFuA@ewxfFyM2EC=jx?VDdxXM(IGnjXh%xgA!KeAvIP@cyYPBGIX>~{a zN6WI=fIr3BIx6j1ge`?*R?x^=7L!yek4crBBUL>pT;I7mo9oRc5*|sebhO!#9JIk$ z(5ECE9!|W5XyhVLdlfSYOC2eYj(wEyO~Y*0bc4ZW*YKadYsatZaHA*ULH?G^M$ zc9`L17aE4R;@x`A12b*~X8#&?>P;9!Q#D(I4mX3z9bAUcA698l2d2BwPZUC(Cj$YY zGH0BHEY8?oOYd6jl>E5tmZiByL0XaFmmY>Dx`*t33&>$@1& zGTO5hM2N~E0I@}CZqjZ7TXr#@K&FKO*+mdpsI{?sX+UqA3fkN+(i27gwsbTcj;3!z z#CJ0z7>x!o6kr#oNuNSYrYJ9t+zAf-R1Kb0P!{9E;mk{!FoKz2YD5kO6Aio+h&n_0 zw5c>lugH^_xIv0heH_cfNpx^*j#<3PKrt`_;BQ3l&6xNl-33!}h6&hRE_zrI00Mra zth0<@vRFO|zCvee=)qDLJBi=LPmh-DZ?A|<#zA>+V0)UZ=3X*Cm%+{ zX!IC%?T1h_XKz~`Pj3oZWn9jnp_ap0>P zghcx3xF0sv^KLr&-HRgq*?Vt4aQ5th+tt<`F4`ZfsK%YQVTSLT%Zl*GK!OZHcy z5t@A>HM5XS@_j(x`FHQshJo7-RK-Mk6?G0)-*@X3bty(&yWA%vfCLw9ri5ME-qs@r z3l%WgU@Xo%PKa>ICaJH{@w;ZE4?-3EpsZe8d*n zL_Cc@r0Gls^mX_7)8WJie4cdLLnODT+slL?5%mb;OGUDQhU^l1eBb&P*6*tiuisbQ zx1PP~T>Y_g@d9S@?R6WKq(&1gx_*Ckf3^P8{nfu(zn{H|^#1jK^&|YM`%za|G7o>j zkg>Qfq+KIUoRlQe7!k>iuxiK&+k#gxltBcwOgAcJ(s`gqK_(!=J>y2u+1 zMy2EJHbg7~3&@&;w+$#XK7d9M8-qA1Cd#@DJ&xg3M*t1rKvH#J@sU*z-fIY;9XHgZ zyyj97q!f{P-S3J(c~VdmT=B;7UklKqa0Pz}8iuSF{F2Kwz@gm&Ub$>)dFZ|h1<-G( zh7U?39)i!7CQTk(*@Lb_rS#ED2$CeyC=g`|VJ<-f6BN-DdBx)bB1MD^lMUGy#+!K( zgKG)l_o5EZG2tVXUi%akT?a=Nc_?MXwq;57Vumn*=n@>Yx+b{bE1>swpu&lWt5jtb z%`*j0LZ@6%1vO~1fnZX1p$TRLWf7x7_aM#Gjd^vSFu`Zg+MPs?#yi@FMq+-aak6tsI@bnxv#^%^3Nt2>|gslc7 zKySstTzE!NUNz}eGV@jD5;ax4A9&is6b~f$1K9tk;s3ZF{tx1>u(Co{WlFw6^W0x# z*Bv-;U-yA-_Ds6|qfCZn(~D<3_b_*uonz;m2n`tAgOK0=93sg02UC!Oo?B zmC5`nAUpmJ;WDqX@P6o8;#N%@4v9!Wh7K5l1-Rn8H3fGDZEo^~lpzkCc=H0q$~)2W zHamV=fd%0fSx!h^sbdG;`bfxl-=;M;m}?CM7ZbN6l6}4Zp|=mO3O5rhd`3bwH|j|p zJ0&RzJh17iI#l^1SJk1)m?IJYCu1w`2Yv}a>*%LZR2C5#=?`Ewq=o>ogF~ekK^W8$ zygpQPbRB3Yz%Ejs6FL?O7HfFp4DXt;a^qZ|$7W(>xMi?y>M!BIKGX#`RWB2sLg*U2 zIS&Juz1VWhnJ7 zJ^VfY0ccNc=J@#3WNKMAkjlGMZ|JVhf;fl9+FZHjurq0`z!iyW!a61s!v^cu5m9O~ z7jwfa?qxpaXLyN-g&6#Q+;>@+MOc)3ip5wQZiFP_G*c|iGF%oeiB^_lc~(GlYCG%T z-0-7a$GYH8>tVfY8S8`hxSy5a->k6ZYz14%R=w40?SVC7AKTAvWw)^d>~?mL-NA;~FgwIX-~*|# z!|VtfW8>^jb`+5b$Kd^(V$*o1Vn!RDnVC9uylZ??Z>FYB%!(7^$7ki^wc(kOG4aIl z+KftvuHn&9ad!B~abtRT8kf@(!;>{>rZzosMsto`!xIzA;i;KZ!!x7e_~hX!ZD#z) z*lgG6_>4L_b!w6l()h9ABQTGzJ2pLgMx>-l!=zEkN2aEZOw^3V2?INET$w#JK08~R zQO;mKP8_N!7}VtWi>8Vq-8Gh=hJX1S1b+U#|Pt-Izpl72sZzDA}JTu#M zWM+7JOm#Bu8lTpk#IX~{$445)XKSZtT~6kqsi~vKhG&j8ia3+yc5Vz$4o{q!9UnQ~ zY_>KtJAQb4WO%lw56{jHkBl9wP0luI)lQGpCYsNfIyqj`4^K^uHr7vWB;~^sQ`6ID zgxZ;!d3boFMo*;?sf!olp($L^4fo4pO}`9jL(jpIHb+iCTi1TQ1)kcnjEV`UT zZPb4`;{+%P_iCe8%1oo)`0#{lW_WabYO#i=ado-4*`$Ec8IYH9e0qFx5+p#|0N3iF z6K9;B$XF1NhIstU8cvK7QPpzLANk6QfFl%Sbv08kDzd5LL)QW#fSBXE W1K`5P;fXJ=`Rw1(#nS&L_J06}glhT# diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.svg b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.svg deleted file mode 100755 index a9a08b08..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.svg +++ /dev/null @@ -1,127 +0,0 @@ - - - -Generated by Fontastic.me - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.ttf b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.ttf deleted file mode 100755 index 63ed50b68958359dacd646b45fc0df3b44d82179..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19792 zcmd^nd3an`mFK%}-)gUVuXfd+lT8tBgclPUw`y_zvMXn3;3-(GJJgct+&t;x81~j^~l7T z!;k;#4}ZjQ(hoVV`h~ID@Tl@t{e8Ii8h+(5WQe`&4YWt?w~if~J?(i;`!KGb#`W(e zrbdRp{s&+9G{=cQ!}YI^4WFLoUSuNfFUNIia`;&7tL#rsbKK@Ry&HZuzj%J@b@bft}_S+c3W!TqkCu zi|gikxL$4<*M|}Jb0w~fnO}~zS;?*9R(wcI+)?0Rm1+rVwa3T)=C=eBTLxf?Lk z+c0-KxSiZC?j~-KyP3O%+s*C4>g?n8V-{}X4sf?~2e~`AA#RvE#Eo#HTn+Pbgd4-U z-N_y0Cb(nVBsaxPb2Hp~xZ~U`cY-?!lEipv*z^HGULhYRhcXuv|6iQ%XI{3M-Njzv z+xYwW@9@79GQvjTtnjdKUih83Mf|n2OZtQymk-JdN}qCARn;-|bLz9|x7EK_f2W1D z4sB9Z@2b0ZxaZt|>VDb%rYGq+!K&4-;H(0&c)^U;rP?>HxmPip~U-> z|I#whGSu?^mQS?2nYsn5DPk}1tj_A7<#x~>^476(KC5Kp7N+25tz))TDF+nUDpvZ+ zJ*x!kMNo_G74kXTDwhiV1*eRMInCJCb73Zne;|rte48wnBzaq0 z5~YW(m3hw}h;l@ya#Be~If3!@G0H=QrJ3b-mSdlIXI}juul11TlX)gA?T<4bIABUR z?CehL!o3_qWF-^ zW2lnUPeT<|_R2Lf=N=M8J|am%;zmX4SJfNi0{_?7$UAq9yla)KKX;9XT=U7q18?PS zWlyjt!22TLWn3UwO!uu}{n>OT!6Y2`W`?pPeXGIBhEadXVC!*Myr46ynI>+rS%Z}f zqilS@bj}0>FzG9}68kUgZ!q_1FrADX3fhVsw2FO|PzA?wsXs4d@}>TAvCj$xWtQDI zWbbsx0zq>y)3$MFc%XCj>dubUtJ&WSZS2YKbmyaPHs~ALxM8^dZ>#7=N9QWyW*#oe ze#I_<^Kv;W!8%!~zf#7+VM!OilvAwWvQqA|Ef2%<6xsQ@Stw}P?Edjz{c3!f*Kg`F zFYppCi8%2R6TL>{ulaBI&;TchQ2wAJtTCry_-tnfU~RNd4CnU4nI$pk)K z0$NfT?kJI{nQVoSBTgKJK)M8Zv8K_}bg5ifi{9pGgB6x^(dl8Mf6fszXH|-!Y$#jG zmWrifh^@K3e%KT1Z4HZt$(miY!?V4-sxwg#WrnW0%z*!i?c0m^`)E2*J|Zjr)}$GY zNU9uBWa@0JC9#tF>e3V*J5#Z|E;AAE-_^fu8~z%ScLjTsU4*2}L5^{O{(P3GpY~8+ zSqg$9WWYcQdC*X$yozCR!DMX8&t@GJ-Q@o@7MKjnVx{T$_RPPZ)xn5C#ah))D3>vgEA=U^LVG+I@SJ`?xs9Z z(B7w`d1}$g#heGZ&Fr7pHzB<{Kq_V1Qi5)9Li+abL?z&S5_(wbU&q#hM33kSvEI)9Zgy|H0s9L1W+KX|_{0civS{1VPxOy1%3I zSddq&f*=ZlsmM2GSSzRoXf?_WvP;tWUCD62I+1hYCXvM;A7i+zt&uURs$&TvozMj5VTc}kt z?VPu(t2@GT@lYffbi2ZKTb;Y@o`mL7><%k(^Zn_TP?r_P7=VS@VRn+RV*s5#_wvi^ z*py^f`6 z3;1Xcq)9;duzPJE4KNLw$0bIU#v(kGv_i>b$VxI_{r){258Pkh1BN0niG9&I=Ut}1 zzQ=F6aAse`neA?rPyXKN{@tAqYzIBnzkvfjY$Fa@{Tt2F8=W&oAaMouzu4acv-Sdg za)Hd^TCHMW6U|MBo)J+b82Z@B>~w|prn6&C!XNI znL$JBbI3w z*;L9)>r}3Bzv9F4rLlg#esCv}0;qt^df>q5;_)Y zj-wC;e#ioR{MgRlbuuRh2QfdQ9|A!TL_ZFbmZv`Hu`Exk+ZFH!qm$8~Kj3n=daT^w z;GqA&fdl@*`fG!8bnqW|d{BgN5yU}in12KJ1_vuwD5OFBi(O*p67NTwq*lG+=9~ zWSf`o=-|EWiMWAH+n$faJX$Kzj>2fREt%5nK=dB;ClQM!&?W3G9;;qqFR~Y*MfITX z9$qfw!3_YhmO-#M2*J&QR$qA?YaoO|DVyhlawgwj?qgpM1|mVPhhGPQYg^sx<=I4g z$I5m#>+yH5*MTe-{9&Ij%*3|6or6I19~*&BwNV~ zlEj$LFnQZheICK9%2IHk>`_#i$+Cc>t^hYGylzCzh^&SJv2?1lI}dV`Jw7X#3`7){ z$7`6T;q|x-jpsXl9!Q)nKT?l$aCP++SylRF6@rdp9 zDxl={uHHl}6AV3I7^csQw%i^sEGOWJ+qhQtJbR6}b)}mDm4I5xm858|Wrd^w8IUhn zbnIcW;%3&<16_vL#s}F}LGrYx;=C#S z1U;Kuk??i+w5}b42XpHlDTIb2Ed@=>W&+7xa0ow_W3RKXIoR|zn2MSrgYcm(F1-ji z=nanv(Ko0Nv!(kE`^6q7P*o`qlWXpHyU&rZp(I0jD*d9Nd%U_~dE5pwuB3Yg;4DVnYm;uAy$-8%* z?LNEr7hQYLKD6gUds)vdTXtXCv0(@PjL1#rwuHl5&fUb=mfhEbBrz9ZF3f(;eg=6l zgS`pHg(*;)Y{KDRU~G;WL3_`Eo6dTZ&})1bw<3V3^KIw_i}#xpMYk3)?P5hbhl1?C z3h&?N^`%-%+XDRi_W8ZZd}-U=u2?MF84H>&RWUV1p$%x5{)pGB>Moa^4uo8!6xi8l z5M^X+P1BHMNj0>H<#vf!c1^NlKEKzkDnIi0_q|^T+*oc+8P@*yQ7V`Ay9|%v_XRW+ z1Y+n0xP_tn3|$3@sH*1m+P2TH>aq%nYX*UkWX-Fnng%f}L$l;1RMQNXD}+T6u~t#6 z)g{_nuu%!U|c$% z_67!nZeY$}|mkctWw z3ZNLN3pd^5a=DBV(;UHyx}My-55(mfb(y24X@YSxSaUD1_pmiom$VyHgEB)cRM-chC3vaQ#`_7chXZD3AChk#> zgbh)hn^Q#@ST;PScps|DUb*^^_b0pk$By}TpI))z$Ff@cnB);RY!IP(3H--uhG6ia zdrb455D+B0+>b0S8qcQZ{(Db<9nTa5F!XCZm0j;VOu_ws=W!T!8y9Ck1pnCyJ1m!5 zWHOE^p-F8`5z`O2l2w-Q5kP>715y_`&?1AOYaob1cSApRY#$(8_E{xvb@km?T-jGX z(A&Pwwrx|Ec#&m`nq+w6z3H@NRc)6B&eD_5t*YE|WaGNxnyH?y_72E-QN6b{;nlRZ zxLZ>{Acgecb<6hbD6O$tcUDqqSTqHl_sH+h1q@$zSLwP~#BzmX(eL*3EL(p|vG@9c zq1|h@`8*jWxs||&4!TS$yUj4*kb4sRV-qwCXXsEPNGXD%3oO zX)FSXj3OaT2n_FrpiakshwoR8=HcKgu)-bZ)01b(k+;x?BChi zvtiv0yL}$NMGVE)nREAa^seepWHl)tU*?Hs+g#pgrjuPtr+f1&m|OEkWGmLw+PASg znD%;ohR5`|eA!S}uKp*9*7kHqP-oH9mweaf;=aJvd>rEtLHE$1*sDOy*K;4|{us2_ zUx3XB-yS{#KmbsdFAzRxVo(|Un!XOP0j3IMUFvQQ-?^29)&t$3sAL^Mr^w(N4XX}r zC;3M8MU|Z%)L1vrE`6aoma)~#{T0m2;vH$Jb;<>71lY?|75XkO3jiBT7oa7mKEtJ` zy5S9Yg1&&u<#B0h77|oT2BIF1C@7MlMLh|_%)PIW59x-issR$Rf+m?jp*&Vsl-fGC zgHH#7h6@_0=J$t_Zcp5gCo<+0J6c-e@w~;hZq4EEc2VVJ9zc%ACLqmQ5dqvJ0g}|^ z&iK5l0ZX5tDsDGZ13ugB4+jHrkIUyWJ*L~|{k-J~MeGpdZ9q0uQ--E1>O628gu2_~ z>1xdZ8bT0zyaAu(bGuX(7Qe7x0X}pvVm#5&){@est*u+>4?HZ$4M3iK3wsHE8pXk} zG>NoUG|kQP8t4~9a*ZRAVYxzf81~ChJejJlzj<(j6xi6`5{YQC;Wjf?C}efIcAXaD z@%D~*I&QQiV(j5W$Q)R^wxgqywXuLd$qPy>mSF}<79;kspqcHlctY`H0+J3g1HX%M z2Y?km)7095w$d3=waLm+F6Bx#yVMr1egYdJpav4gRT*+ZIE zf1p_0f9{+^|8el)pMei6=vl(?L1th^?ko56j#_913vNbMM+;|s@A6Zr^WSvb3E`!c0 zMHt$b^@9n9mVu4j54J6^kRY|)JbQDyD2A9IDne=c{PZhv!-yN~BZ3fc^4eCe8XR1; zyc1GUWC1}2o_f!FKK*gyl7T;T0K9E8`#SqNtSaDfC3->vo1Io}6&bf-=P0kihR30w zJ^fyNkN#d=7T+t2dqnxYuw9nkt0Sjz(a3k`fx-H?3WHaO@0;328G1)K$ z_JIYk3j;C+@^rVR4G6*+Szv?`am@TU^4 zT68`&Tcwqww$ZX}In94%Xh=~uD$3B1D#HRcG$aTcX~!a=3LBO4S8l6|`7qQkmIUac z^-7`t^FR;^sFMp6?NHJ7r3GKwR~UN6b+fC!P-W*IVe^#yXEtBw*s(`YPju=npq>ci z<8|z-mn#Z(sZfEAV=EzGo}up@tIt>2{392Kip8y<+^zNyn?H8Bwfc{Tx{7_>H)M*% zF5Ds?J@sj^Z5RB{A*W}}ZV7;!WbUWmmA0$ZA?NR^md{rg7Ut&AU3j$@+az0?2Q9`R zG5X2Z?zBbl)Zx)Z*f4!?BnU+ao@@Y!6xsBn63(wcb3>h&pPL&>(Fc!CEexfqbIz4> zn8$dJRjcRc&ZnxB@yJm9pXV6&7B|P{=-T-VIkQ=xL)R#V;L4bjOULVBA&^(YH3TXJ ztOxVCJn-#+^3i-g3hdrlT9;lr{2}=#O1v$uxZ=-jO77kP-E`?Q8uJP@2y5P)Sp|av z25*cP=gSZI(mcjGkI&NP7g9s`rczBBqV>`oq)qMliauavnkkkF(E3-aZ*iEDMgw#8 zg`pwV82;O7DF9t&NuOjwAo+&zD_u}7cj?dC;uu@C$~gR%P}BcO1cLE+FmU_O!aVo( zdG#%ASx`b18)SO9$zwx9Rdj1fWA!(Ox{%j3gt^1Vp-B@`Durl=wkEFyJ4HJs^s-@x zgRLd&E5h_zNc++boh*_N`@*i}scJQ~xj&!p&;R3N&kSvUr2YmAtUh(#`LOEpw)W&F ztJP0JFpi-}zW+WpH{^Px4$UX+Pz?B)!0GINvmYb&fvYsUOJt8Cs}8^k8D`{sr5`zK z0eiZE3Sg*%Pshy~{*xqbkc9+>tGwb?z*=Boq^huAIp6G5GA4BKLZ5x7JGna6*OM;A zqa9CpQ{LT&Vd{-1q?j5Ey4=ZDy=B-F^gz!BTXS0h!SE{|^}{h_M)fdEg#nKt2;P+M z(Lh_$^z%OZBmPh_rN@NMTz9uM;ZCfM8R3?`k!UY9&UTN7)JQQd#U&XESxc*)Jme0h z<1T95#r%TqQ$B1denpQOVc4_$)Ve3-eKh2e^+3gn-|q`y*Ko=;X*_Y&x~EHNyGiAR z=J_%WTy*y65Pd+hS5a1dXaRe5GrL_GI8$d2zr zc0>^c1F6)_JEnUN)CLGGGR=qBbKejRg$c%uk{U^x zUa!ffam)bib@40(3mi^Dmyi;=ME3iVOJlm6@)^G~e9qxT9`^~1b}_z1>=IB4QwSQn z(!Y1<-M{njYdi;SHiZp%M8ntN#V!gXhKS2y1#;<7I)I~ru=p2PH4&o3;TKR=W@KhJOm3!Sf~hU&zP@EmxpxUD=Q-{4DWLyQOc5uukfaEGjb z&I#HB@-OO~#9m01DL0JUKZNSPEnMj7xnsS|Z*i&p z*T>uaI%5y6+i~equDv9?c3}sQxf<;(+O^0Q&_Jqi$N}m&0*o39Ih2MOh7+t@Vwbv; z^_P>~-N|#ymlv~Z*Gk&9ZG*{fc8>Ds&X>0(3#+!7TFbUCchfe*Gfr_y_5k|_%rm%? z-NS%)$ih-+fdND={K*hs;MkG4P*bigS@ zyO*O)kan29M$&BI?2 zng3No{{KHc12%I93>K8)+nxd6N!*Wz487wiJLqAMj_9|5D7PZJ2>&QiH{nfkrZu#G zi~v+d2){t$0AvQx$Yt#9cxDeeT*dym6TAJZD8~F_$5*F>QYBnt7W({EYcke!?Wl&AVhi+C(wNL(pDs=)6AS9(b*s8+#AJBZ;bg54@ zZyg%u)jl$r0O>x=ZDo`2!5CQGc0};N*3f_^#8s~4VJ$csO%VK=e65aI$nmveilI)s z5%41`tKjQ=xZ(1oQ$_3+@prT3d6=A>I8178w}$>Ia^)p>Oazf{oPGnFw^o16afQN{ zilB)G|Kr$C*#c0s4^}BebgjeO*abKr=x0}O?1pO*j{0(c!7z62*s$@Bte3i8vR|?m z?pv@9+^R)2zVp6LLDP5aFbr6p7w>-XC)U1OHKqx;%cB%MProd0)0mMW#fhxre`piqh9@K?{~cTTX2q7Cx~XBKVm!DF=XH z(AHPb)?Ty)o*RH+)Cn*m7crT|(e$gRJgY=izyFRq{C*Af*n?+O(@@W-s^1~m)wncLvsHf-QUJfYDTOyN8v45>~Phqp9Pd9BP= zVsjPy5UsR;;3T6HrZr`JY{VmoodzODE~+q?y!>yl?tI#inedsW}QgTeWjsvVxa%i)88v|0{O%5Wg zvs{GwYT33`MWn#*TalLT?v{Aq_d(Ifu&q=qa35p$`Qy)6p-hWyS$2yg$h&;qYrDO> zfPN?|lup@}cNbG(S!BEDT>%1}jo3c}$cOj{Bqw@CK|`I)Ct;VYVm_MI5(^bcw=BW? zRw4)oTiHd#JRq7OTHo&R`=il-&%^dEum8jHo?YGu41Lq=oYxbo{{qfzHrF5W(B}16 z?4A;E&9(A(MpGTP?m@tTk8{9tj8}=4S(!HHhD_ zb^Y?@bZgY_)`GHDimZSj`I0Jz5U3Vy&D^4CQYFe#TUtVfCMs>wNE@6aMlf-s?ql#e z{P(tCXR^ZxMe+$%jJV>PHD$oKP8M5oVO#G=UKcEg#(<)2P8xQ`V@9li?oPC3m{O1EP^ixPAFP7je))(LW}}tFoeVb zZrX}ty2sAW;u{Phj%O8*XdY0j3}qNCSm3b0I3+rkkSO=?{qW5-S}P!4+V9Kkx(S#FH!H^>%yaISj_Q1!W zsFJ~afIdv}tBPjdA}ZcK^g$Bf6rccI))KbeXpp^zZr}avCV0saIV0*WgmS;H2tq4o| z1Xy{X_24Nym#SCU{1A5W`30VgP!*zEW=pFZf)kM^;Ygk&F9j(Hqc;P%()547>CDk3IJN$DTev4WoK}fyD1Fo?52vZl|sQ5Ni@c!G1liQ0Tei&wRDbrX&LWUwYbM$ah55qLBWA9)t5U{@~fVX@ue zN51&*QxETcoKjy$4y zqo~j<#RS40?Z}?oJ7g0{B8VX%D@Z3N5T4QyDAg*PyGkt0HO$s?j@U^tI?XQ;NiapC z00dFBin(E!n;homYh;6`zzf0)6jlKJ)j^%;?N zc914?28@GB5VG;5WnjC(7GPus*W+1H(Z$`eqQQ-Wke}iwMWKU#igHwGNe(LD6~$%+ zNjeDTiOTq$*WKb_Sw1YIvUFJJXGazBh%6tGb;Y@)$Tcb{oR<{P&x_CtD-K>uQ)F5W zVv2MpH-qsLxvMp{LUOF>=ym6c+E1|@NiI7996ZER$OJch1JIC@x>zE4_0(t zRdu~$c#$>`$e$I6Rzq4bjL&p!OZB@3gNTEZAK&*~i~G^5eY%vd{olIN1{8d$DKz7}s|(u4S}mD~J%4LjYon)ZC=q1h(vAK7mXN1G0-C zvQTSd_tJpgHWjqFU!*6B{B7xII2=vihKTQGMlc!;Vkp2aOp`u^m`qV#9Jv!5`l%W` ztDr2#hr^kdGGPQW!PJNx3?>?QDG+sr@@Z3Pj$V-`F>!+wqxv|Ohm+{w*c`KXlYwGj z2EgBl-kUM;OS%iDi=wbKZO)# z>V%8{(Nl&u=*#Wi{k7e@m)|z&HBUZ_h|%aV?A}xCVeH%b=dg*5n~|C~++NgCWUq11 zShM@W?$O&$o;1B*+lpYA*Vxum*z?a`)qe$co&=~5(qW0Lhb51MWgezMr3h`Q*v*qx z4{&Wa&j@gDK!DFZcNSXw^E+0h6XL*EHwcOJ({Vp+s^{Hw^t%^D`m^`me&Foc1Gle< zrCY1j*7R)h>}rNJKrt z_)?KT)cppe0$wSC8^N_i>}{a-CwQ$bbs|P z*Y9VqBE5h8U;YTc>VDJ}mdwMSGh{5%3TfAf6DK8!G)6?SBdi*7!nWWQ3}p~OEz^xk znRFiLQIH9Ua1S}}i9s96)aZ?%6#S{>sql(cpilnw#m41Mz zBo980tHz^I(T&(D+=fA=0ImrY3rd^_?T@0aLYCdl?8bWrg?!^&%E(j{#ykh{J#?%$&MqCy`1ucO$ zeNefqa0<|k=VgZAbQc1hL|x>K2BXsPb{is=fdynu!rKNE8XrKTh>bxU6%%D$h91Z8 zsw02~a3HBVu=vQT2k$im(2g5wQeJbZ2vUm3yzX~Jpgbuk3a)tL_^$=%QMiJ?1Pw#h z3x3IE8sN}w0k2#(wLElRg#zd|RKo|Q5f8y!@U@knPD6g9IDw+8zbBUTN-VZ$OVTuP5`~mF$ z)9`=X5B~@8S6Epgt1=~Dp?U5vvg-~UxUc&_H+v>s|4}BxvgyS$o_m-(%+9fMPJ{*w z?mN*8_czaf{Te; z63M>a-|OwetHR9$3!jlt&5e3e$4*H~0uOAust#5D$W?WyGUiCc|H;_O`+;8q&^r2Q z6qQ9pM*0Jo4XGhO?BG!8MGywH1g{Sj9bE?+3b2dR=Y)=hg2fu%IK#VUtlT))=dqbs z8EzSDoBB&Qun%@ajxC|5byV86KaUn3|gA@b5Wl z_{SS3aBG-eMj5OfIWaMe#AXzn#6RAk^9)MVxD-M=yCH;A2%k&6qsc~Y5%;^WR9z_B z3)qP;!p&2Yvzw=8j?_|p-My)msl`VlS?ulV@9OJahEng+!##NR4E_noxYMH)TBTla zdulVs$EPM!%ery#F4Y^ltFs`^p|Lhst~u;XS}Slx;+n9I$;7b1`gKH)8O?z&5f?_}?DaLl$ghH?SM= z-*&dc6Sb4=VmGltb~C$$?Phymjo8Qbvs>A1>;Su+9b|W~AvVkou@U${YV0sO!p7J* zyOSM7WWq6cKd0C<-l>?;hG%A`P95(WpVXVFsS~r}#Q5=9`FL%3W@Jn}alAI8(xGd3 zbX1%jK62cc9-hYK^u+LFO`54qPn^-5W7qJ+gmQRl=G5@as5m}(cuJcYKQcDkH99_{ zj!vDLq=YnnZ1_k`nw}Y-oK;7LCu)!GCDIgeQ4^mbo}U<>6&+BrZzk~ezMjzGIi|O)Z}q-qIP&za-Jp9bM(ezkBv`` zYtC~i#h;kgkIxRzbk&Yc&z=z}snRfMRPvFjsUs6LqjAE(P8?TePmRyc)@GD5n2!^O zY6=E5IX-#BXr3|FS!sIeRBeWzIx5f9j!m7cq0N=t?9$Fv%@1}$7++ajas$SBejXVR8Rh8qCy=AMc`m zNXIc_HTC$3@!1iqy*gPt)pdOQ$fQIxcw7Qe&W?%4hQ}woBV)CZqaceeCs7;qU(PrI zO2WO`=#?_ls5d@5;hGs99iLjP;b~l5E^am{U~~rLr5v9gpPU2<&^Exedg#O%rzbKN z1f(GzKQlRE)+Q##r;m>xccyP-V(P?b7bvZfp!t)>k4;a_%*wUXbP`9Vrq7telSgLI z)G^H38FOqHE780V$7&PP*i6UA@2b(3Y^Feh(y6JLiBaVcSmwk;O~l?iBTWxuN{G;TKd8^eE#fiE#LfCwPw`0fC>@NszJ P%WFRSw{)@e|B3xyvshT; diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.woff b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/fonts/rainloop.woff deleted file mode 100755 index a3cc736813d7fa25a1773296ac8736dea5cda4af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14128 zcmZX5b8x3ku=Ou?vT-)HZF6JWwrzW3+jcg#ZQHi(e0jfn|GQIlYU-TsdTQpGsj2F& zZdX|m5m_ZASpa~I9smRQ84?%(p#SFoJA_0;@BsiINC1Fw1^^K9%7Qtq77xb_F z0KlAAxO0wX#`;D801N+*M*9O+hz4kHvmfzC`|$tgicl+^SrT^jJ{~s=L02_U4;~$Ovhadf{J-z{`z|GFq(dlQu_&?gOAK(K(06=b; zjqUDwSc{E(SN4o^*1*LxQn(Fzalk;B*w9cYCq#J^-gy{il2X8lLF`S)Sak8m?u)dO z#jSIZBA7H=&nsbJ^|47L7r_QDeRF7Qz=yYY3dv0m+TCogpIzOKqB3g_@1Kv)%d&Mv zTujf|?OBJ8Q#=OYN7Hl$7)O>@V{OIYCG*MyDCi8re5ukX)8+Rj(>Zv25xu69{ic(2 z+Hy|4ZTDa3LnSb#t6WK|m-WA&`d zNJMmLKV;<}3bUbAQEF&9sm^W+^U;-4meW{JThN@5L!;aZJIL3OD=w%qYc({V@Xr^BdlZ~h%;x$n?fDa{idBte zz0ZE~@?+@6BpcaPR@b76rM9bbNA>NfDjH{Hl~Kj{-CAhP%&E5_3D-_%{i+b*jmqCmJpl_14NJYW%?r$n z4JnNa)|UAbLh7T6>uT!Da>|;DU_xi)_0TMfCI2)tzHXyo))tgmTc|3|GfT?RX=RqP z*2gW_>_j6fs-fKC@2It`%`Y1~LWKiyY)-8Lz^qCg8y6a98p|x~np9F6+n~3doX;?| zW!S9HKPw&DIH@w4TKxrys3lBk><&&Hqyu4&)Rw{4SC~}+Pv)*|Smn)rNEUv=R;3qC z%6$!*+%hRFGmLGI#>&oDlw-)3Qy~)Q+?+*qG8NVNgdzq;q(kJeCVNr=^1q|R895US z=5h%brIJS(+>0|#^*z#fi}9R>@R^hrMq!zVCdiqFBAM3HpiJt_py~rxN2M4LnA%g# zP1x#7PN+@j%u+;CKPP~W@E!khOknHd8sma^--9|Py2rbRyJIp>*H1W3+)vP@qVq$1 z#=Ap3%#2S^O;k)+PMl9*O=L`HPB0u~JiXJf?IUd0rNzNGgntb(n4St|9W9pkktd$1PnAlL-P=2|} zN$O5*_dc!DHZ872uY9dnue@K(lixI6Q^%rjwcos`=VW>-LQ$Gix$mB<=6Ei(woiFq zZ9GqZo^=!*Z+d1QW9hz!w3s2J=zh%Kt7d*5f!))!oCkbvZ#+!udY$Lno^Eq~RLRnD z9}6A_d(wWq919Imw#Ko?DiT;kt6#*vIHnYk!#;{O&wxBYCEQqIvyT&(T)! zJ)KN>(theO-cRvvavGc)rV~wJ)9HE+r&0a*8av!>-6?lgz3e_)QSR;zPt=xcYPiU* z^B!NOo2KLQdAz-j)~UZqPqu7V`AbEm`c&!l-nO`G-7fRKmBN*RT zNg0OG_wXG?u1lg_2PdE~8NcdTchOXmL8&dx`V)c$EKW9EGZQLdk%I>1^R5*fPBALx zc;x&rVnO>xw0!0!XR|UhOo5Nw$J;9l4YU(qoN>Q{5>f zhs)IF3yJ)#Umcc)XQMLL12C+5xhmA9hXRNT;IJxbVwIf6+ofy37_%_q4a?8$knu&9 zht`1FL@<)P1iv!+Wp~*t$Pzp#+((PagnR7~nqczr6AkW3H0GQk+~47^Y-0xIW8&LD z_PfdSd_c~iz8kWuQ<7ta>Jc1rIz9s}yWRs?mf5vds+vt^quBcH&4|gtYq6T)_82mk z9Z#A2UY5H}ybWi?JCMB{E-roPqB1%+>P6xCo-c-o&abvw>^C<>S$U4h(>i0lGAu_L zj{EI23sbqiCMI+g(9U2j)iS5EpjhPepKlED}@MGM-dq8NV zVQK|x>+6O#XI+aq4S+!9tOXk|{DJ^W#S9V(a%Jx&`=czSwhq0ASl{$VFrDqURPa0^ zO?W|z_6>Moo}Oh5?@K}Q8tX>z6+u82r0lw#?&VC3h&+@#h=?{Ho5h!H!PE&ydg5O;oyU?t?xnZ_jj88>VW1X(vvXFGgd4VKO--{h3<|nv5ice1e~7TYRrm zA-$XuhWQL;nd+US0HQW$`-eFft`$ayBSsw9fx*?Lr|Q48o2|2g>#pYmN>3{>;VOs|6nL6qTn)T=R7EjN?1S&U}Yrja#Rc0BS&=VBm2Q&`GO~$jc}+= z5P4Ez%?Vh5H+ZJOjfi!2+&RLD?5snB;mL$X@s*H&shd_CDtc+K=EgLnOAy@A9q6tk zRu|iYf0{FpP){Hp<$*QK_gP>R!V$2DiXQ8qAz~-z2l)LwqK@j?ViFos z2?^ownYV0j9{xU~m7Y(gxwSU-X{uI!-I`i;guQzPGo)duXhJ#4e9IEWqiC$SF@eca zJ#$n&jF!u(#~CTPvE5`6UAMN>4}Oh7A}q>`)rUE_ulFaqce1;G1QnTozlcXiFc{(T zgt1Rlgl8`_)b0ws&qP7okXVgcEkk5(Ob)?PkUcbKDsyj;m%yV*b9PN8kng>`F)A1GZ- z3Pf+WPJ(Rv*wi7S4E8JM$lyhW^9^@rd(`Y2yh~fB7nk*{K$Hcu2{hTQrpR1l7msib zM7&5e!zzfJvl_D|FLA1Hs&tyWN4HVTQ-mDI(d1u7$x85eXCmMqxHEhrntUCXcGhZA z5WoX~dPBX#Rbem@iQ>^cZvj`*&d2w!N(fg%Et(U(-bASveJAT=aMkEB#ja0R7pn}6 z9AO{h)$JOzL`qeAV8;4t&{}f?$@7m^1}d685pL5FK}=*pa2) zYVaTi={xvCdxaSxoBKIxu?lcAB~5mcCU$N94AJdRxEp1=$GOWN_MTS{W0_3%U0}G! zVXA^nz+u?Ja^Ga*VEkQUv)H5OY#jqXVyu>%lGp(yyuo%-5BO4a=G8>swUZh9Gbc|} z304IzFt!~Bi8_-j{0p@2Z!ytt3J5rrRR<*{IHD?JJNTpvq8!J1OKUyGvZ^IRae+bh z_?xqbOUbwR-Jl@(anGYSW!#LQeujT1$eqC6q6Vq?$rxgw|HSd1>Rp-b$$U-r8R%dF zddB7Wm)Go-z)14$DL8^>kyi|9(?3a{VueK+GWy!eOZb-**rUGmhULJFl+l%NO%$w} z9On;6=ln`0GbX%KY1~Z^o_itK*51*5Z%(6J>i1x-<`JqxDrEUOF{{ODA7iN*n;n+! zr3>ZAH(vFsh4W~SsOj~qn5i90;Lx_$Kzo3p9{h18O!_=_K}9}UTf~Dit`Gs0RYwpi z)4{xajo_dM%drt((H4;kN#EP0<%t%1u;qh?*i&NQIeUtTa1YB(m#mrS^@*24PNrPe zK-lqwH}Qh(ep)8CE?iTRj;O#5f_BvbX38rj5O6fNH}U+3c?q!ODm1_c?m}ZdCNz!4 zHF-rlV3ZlR>U*|2Z|4jZAz9o`?Z z`{wukt^pF}#?DKOQrU>Kb1ZB`)~Sj!i9K3vH=#S&y9JG=B9FF)Zt9owT8X%ByY6bI zuT&JMo*$REW+-RkXhU`$MKpx-2_PGrs(;4V&flvX9h4SN$L>1kb zdpL=9P=O)_5n%_>pu!V1EC2ziqOask8Ni1h>_>D z>#NJZt9NU+Yj?xVgt1;IE0(mTm>Bv4nEF(Lv#8ikaRkTgzVUsneQkYh9fX&c^3NZg z3gGvorI7|2CGo zqLcddI(Bt5MlC{?3J@?rPBXJXiISG;%B&v?i1yOFlI!cmCmc$IgaT(T;OD*F6K(~QSE&l z52iw&F}jgMw^!+n>oU4UIY$ldRqDFzA&u7t+U&5tO_4i8>@VJ>o2|;_nqWS^>|eh^ z%lrABzug{=b2ec9u;K30>hMPnqSLJinXqR@n#YrZ2qFWiX4c5xDliWMAFl-LIkr^Q z456urT3P|(4eE$T8N%{Af*?@}ji|$B?_Z#pMu346jdhTW2uO$i%%B0lk>jCp%o~t6 z3?voStIKbIM8JmdEpJvZh5pf)0}hnzKOQiUf{_SCU2AIwpinjDLg+I>P1)?as{JIL zqlSk(Js>edf0aR*PIn?NWzIC8ME8H@MqNxl*g58*yO43WcH&f~@k>AIvV99{Qh zF0iczN;OuO)^s!<3vjl#T%U6t3w=Zl7_%>PhUVGlYmu)b5oBPc{G7A|vk!Sa<~vTF zseDI#%p^9-RiU0Mwl{{-XMZ)HvEF~^ejX{Suyv2(*u0+5Skbag`{s}&7-G9*9B&7W z-o^Ng=m5R-b)0xoZ4(!DLnx{XrMG%{j)BO1h4Qt(tGrlg*741QO^S{vvaF&<{dEw|a@O$|Hv?K9?LDeCvQ z0ny~XGXF!9BZBI=GtdGU(U!(j_McHX;mv7`&A|CB@Zh(tV&L~Ql!_+kM=k#;B_Tnr z;ZTz$?v0Xn&g?70*ij?)2MV8&iN{||XPXV?X%Tw5(-x#hf)Wl;0KETtGWT~P$C(o5 zPlNK_i(Mf)HWHc|p@2G&k^=+Ou@j33dZj)~YP0iuL$H(stw>3 zM0X)9V4h`8=t2t2FT-(4`hA$0=b zke>FuX_LnFquf^lEvgftJL34KV86B6UzCVuEfQf5Dn)o&hAk4``PhIvTttZ06q{EZ z+sHa+#9lNDkmlYIpMSSTX&G!iiMF?Hb)@z1<@UW?Om4VNG#-%{T_(BI`EOYD@j(tw z7RI#4SF&_lS9i{VyDlS}0X^L>D#C-U1vN7Si&WT&ot)9Gb1U^&_oyvt(xDF}W?6W!0{In<>l z&BcqfD#jO*Q?j9Fq%_s)3;*(WEu%%5(M@hjO{sx?j6|UxBmuD2No?Yd-wGJbRv67% zFCYeZnpctn+3y&^v>r_B*5Ui*3hMVD-er9AwJ*{;R|2sM-TGdCc-+CsD7Gt7*p6Yr z>Thfuoms%L1Y-tye1Ld8uOt^ZzqjKKPZMx6Jv{geh2nX;JivWW^X_dbcK@@nL)Hn! zgI#D?XvfOj@`&`qONfKjvypRy^jK2w#e)+m(9tE^4$-t%#r$aQI)U5@E2&37xW?FO z?KFih0J?Fi>t#NnVEG%#BWhpej*A5|oF5KpYq!gw?37P>=78ze&bH39!Ihal(2nR+ zZf$#L=ICnpM)0feeZASbZ2idlSJ35^zw|q9x()Y^FLr^p8zoEHwe+L$``rk43cZ$1 z32(@|xt##$k8y9(Tyo2{N^(fx%nb>=dU)Rc4{DI$epxOlwDCZoVdcA{PR^d{2ZQef*(>qC zljA_dng@LX$Pg?Qm|Z{2IUx^rR2H|u>AxHdWX6YD)L7#b>Ru>(@fp}c>!SDTxA1it{A>*0r1n8m;TA2@I6L%w z&6cCp%k6aArkAu)@2}!$a-K}L9$vcOaG6kH#7fs5bH2kd2<1+^zLJG&4qbb3DKnfg zWUqzsB*ekN$wEYMA;6BhhuSS3h;gmT33DUa!PHv5Ot*R-@*d5NM&WuYTx;j@;>`>6KJe1?;-8Elcyd+VB@*+1xMN5--IB8mywc2xWwDY z;rNS?m+4(o(oDCF5I-->dpyB)$r1&}Qgr0mls=T@iF5FitHR-WPL6-J@^ochV4o0o zWD%YE9^w8bs!5m|&s=5jq@X${WdD};Xv4>^-zVMx3Y!5{mKx(^ufh`0ODIoY&@&{# zNqaQhXe*drdz#V}P3E(tZBF`S*c7N)w{t*p-`$B1Ze~Etu#$As!wEV8R=M{W+F|cY zm>G2_A4{!w7}u2-2Wr8jt;Ne1eh(z)k4PnmktZPY5)kos=-f*pUxtx=0-un+AI6mK zsMs>pCz>snWLdk}Xw(_+s}Thc$LnEN8!Czun7Ld?)_8A)cLAsvN{9OKvDY)!AXpLB zwZ0i`IX6SMZC|z9Dkk?|jW%wgneNa+^{u*9t)tWEN##zGHVs91*x7}8er7;xqMv)1d)Q?t>s)4#%B)gc z7?g5ly5&AE%i>7E0iI*nB#E~{Juy#b^aA{DTT5X;Uj9$9MR_IcJZL_>TagkFC-YR; zME&UM5+Yhws59VUj7l$Ho}D6}2q9K;w2EHZF8suBhN5QXTSUbHGnGeN&~mvhIBp6@ zfrhKr>bIoqnM9=RTMV^r9PFRcdRj!o}loj;qU=yx=%p+l=X2k&U6Rv648t-7Afgk1_P zyTHcA$W3kY?U3g+mj~U}z*KAnyVuJAV~pt}rq|2KtZ!vkJXKCwt!!`eX&M3U`vT*X z7PAoAs-zfLXY1ddbsfGz>BZ&s5*fS4oAmVbI_bE^ObY4QHe{E347HnthE)`X3&n`@ z60<77$+9;JuFo1E?-RsQ+PyQ=;tSKrKsOUr2kED>G!4gDrO%2(c*iOnS8y*J`I}AS z8*+<`kl|sn(2`!Nk+F~D5pEKYY@8hzG zbp1xY978o-!+=N`z=qKZa1|4ju7rb@B;5Dx(+11GG~=kF(vq2ZRgw=4BRShVdcO;bCfGEzYMu1Gj%R zr`t`Lg5%-G>FDU`Y4PaVT5<8(+Gw$PXsg9}{>&b?CHBTwe`U8-C`XzsATDER zACd_t<5xZuiIEOiwxCePz`!ykS6AO{P1}ygqn?o&mruKUvvYoFhw;F}=FJ;#VS%{P zy#j%28>_} zi_QCiglTRTj#k6tDIC#gqx7eRuRF4_WIMBQkfY~`YyT(^gnm9ztOYc60TpaFD~p)# zN0xuvuMy>5!ooz}EP0++t-juiOUBDxuJ8P03dT*{j`)m_kSDOoJiUkr3{nVI^kq9^ zvJ)#QH1%B*;mBxADRlK+QyYm%2fFOAn)T2J7EjTuFfHR~u^AIl8!}vrAw?PR>t+w_ z4O=2H(%2cStL6_2vwEsENOa13>^dH932^gN!6BP_7}BdJ@)00kyHW6XO`5^%rE6{* z_T@40>KG`0{XY*Rc0B6?yo4z)j(k?=97z~PB;H4bBTT7oq&Rrh?UC4_Fc$i0GC1_v zc*rQ8J@lw}m>e}Z&WRDHw6(Y8<`wo=k=BCPc4=1AM(V{X#Td4u*Gi z7_MHjMeCxIPGbAx3tW>NJDhW=+c?G=vB@CPhONDtP#fXnOuh$SyMCPGUf6T7$y&LH zEuQ5khu~2{lfwEir`zROa_N5-g@qk;uEJ+o&5$CLwHd=c67eMJa_v)?*kR^r^xQ-V z@z4-jAH7E5F+i!7Ni}NiiP!1<5&yYwsY66l>0ByXOB_8q(lOUj_2#dd{#{q}ig6PU z@#Js{TyJm-CB*`-oJz)@w=w?Ybo~C_4$?I@?;L52U8ZJ2mMp`9P6P6;*6Z^2nU(c* z-Zt%X zuQtf=q3PxHa;tsg;q^l9w>hlox_DWR)rGemp)fFH?QS@khjoLdgrcGC5(hUkSXAka~T^G)u2 zNhaCFxYe(rwH#@L#B&Q;QKmsC&d^Z^ZT4-U5=Bm+!=HsiZ3dIpS03~}GDL(mYye=| zqcj6BbN`9rbaTXKVtxhNZ)U3(S5MjlzIj5SII7gkAf9Z^5d`Mu#T?CY1cix0d=L)| zVos#a)x|!de%@tv(%=kDOl(zbm0l{->WH-lWOOd5^!VQPmFW!n!1IS|wat=JJ;1V8 zb4IT$v=DOnRAjlIfFw?{H!vXNxSI)m-OiA{Q_;SkFWY!JUry%v!qpmGl3}m@VTEfB z@V8>=7ViS%TnACjn2;vIeLJ`z)i4=7H~KpcVed)**GR2nG9&Mf4FNX@OnFtyMs5^r zmTXy$A)_<1qES(wf@Sz(fi*cjq^il>VNGD@Ldg$%ekB_N3mbd*q*iDBW#;Bdp>B?q z7xrlFJ=Gf)p^7~UYWBaz7Phyj0d_41mIB%}&2vd9p+ z@~Ny%7xipunzk-uI&IoMg%0pIk+!H{#s?Ja6MB&$TypPgUb-mm6niOsfSnH3@0ymE6 z;O7*X+v_@=SAyf}8y8P=&p3P2GDgucbrwnh(-tqbqA#4%fUZvvn-Q ztJ{D)_OPQaqDD{m!izQHk?^2nx^SG~xsiNzar^l4Rv^@Z@O-wZ{)hI37ftOPo6_Zt zf$!mY6K+?34TtgpLZTT-%K3g&cpnVQM2)o)B2L@4UY~QNCLsxn9r^0DbaPyUx}Al$ zy>u0=M}R;{%>IVRVUOx6Z>u;FtKA;?I~Ki47edcx`y$`@DP-{IBh(sX$ZshI;?{2g zT>xRV3|@Ue8%XX~P(o#8_lnM!?xS9Ss*L`JE)#nF0=c8&;n7%H*;~N6AZ1UWU;6mP zBh%yI%YfEpSz4LHj2OY(2#G!uLyV6V#9~j%)@KOZbFinkd4mt^hmioPfa5WQLV+8~ z^C*vCbKIB(M+c1T!an5%bVCC~Tp0R4OOsBo78ut&JmnR4USoEh+Wo|0GUOB2_m!ti zUliFLQPN@;ATr~^NcG21v-oIF3PA1a_FSLM=1lj`9UNW;I9L>q?Fap6;aHhzjOP31w9 zs3J(Qz1~c*haC<5(>!M>sK1EPSNZ<*!eNRW$S4G)qYvC%w8L?OaZs53$Sjmb_E02N z`26wI^X!-_+^i(TNNF!>jLWNdQZU}!@Ko9>vM~yM@fd({YJEf~M9jcU6fz{_As532 zSG&@7w&fH|DFm~gsu3)MB6d6o(2V$14ktQAHEO5@&iM@%Vamb*!d~2n@PIxl`Se!Q zC_muh5LEg|tG_jDbwD)~f%GTpBtb;<9rg9ABW5rG+5Z;!Q zr5+y173%6Ce#Coik1~BnxiyGVp%0MJrEzY|v?DeDMX!VU*b+evv1qgTn2hR<4Cwa; zx*Hic7CM`z4Tqc_ot;}>J95N8RK;-O-d`Pap>3D;oZu_O7>tu5pt-YF4VIUIOSMi& zpk0nGV5TksWwvA)3+!&37tyS=w1Z{+dYCS-?>HcfZ2|0R_b|XBFCOeKd#5gMpQG+{Xk4sC|t2N>cGgTj&vLKe!C@}BiQ(yC5Gh}S3N{xk`zX4OvRad zb-D+)VqrJ&#kX@fvaqJaqo@a~I|`9J6L7a}NNLMf>%mx$A{nq<9wDh}W{fYgHe`8u zzoHj!>es!TU5^~CQriE*N)yG-eFJpSFagDp-BRXx9c4ibR`qAo1r@hghq!#I}Oi`U@(s>_B5e z)hBGS%YdY!MDpI*;>Yd`0_70>l-J$2uuK0U&lQQp+-@%0c}uFU_opN0vax6wuAC4Y zlu#06TJ{@}yAfyd?EM1Vuyo7zVY?%=%*jL! z<{C{3KN`vNbb|Um|MBK1-7r=>RNNV!=B4+95oHoBVE#RhHi)0x@sssH;iF+l(VOp` zQ-YKh9A2vFaSyi<55bh3MY&+^D@1eAgQ_6gr{I7qJ$$jBl5h_%7$aM4=QY88f)&DuE27`&Ha#OfW?p&1tlno&9!6pmsy>1? zlao@g3%jblbFD1!wGg_hbvQgR$EZXXkzEH!p~3f?`CzZI=a7zk=3w2I2Cz0oV@_E~ zZKetCH%KM;IaydkM;Yepk>LC>H{3c~4HyU>3SRh|h>FZE^TvTmr6P0K^jSFJvPKfn zD1c?1_*ebl$N`_hW4Gn9;au49F*|d-JmbD&Os6I%p3=&Awd#xF($s~( zxv$EJz(_~B+QdJs3}2&?bew@Qfh|4aVhK(?9>rpM!hkE+TAVBEwf;l|YZ5(wmH1(3 zBLrDuniE7UpRVfw5DpiBbbTr2N&i+oSy#8jIp;1vB`D7YXKDyG>OwUER!}sAY0k_H zPVxYunavsYQx5<;n<#U`8ffsB^ewok=Nm%aQqjPX`~A8JkvsM(Sk>bf!u$sX2Hu01 zp?QO;nrSRJ@p>h&$nspGP!uVKgnDNE#ztl`%TChbU1BDQ?##zR@le&Jyi(!1eQzb{ z3Ax^1+zrIbJCDv;mko=_T$atP^UHhqKcZh01aq?0`_SUbBOkPtmE6sWjvSh%SBWHH zj$Dt=92$;X&Xn~LS16^Xf~Tl+P1FgkiA?Bg0qo>pZcZCtZ0h?0Sk$2IVMBxpf5Ige zC|=WFSyWJVfo%rOI6GgT3ID_-cY6j}Uxk<%cf~`^e3T4w1dpVYv;o2jwY{Ecuinlt zRpa3vBB)z4K}L^^JzOMD{{cy=%Al=GD?!1C)wcG?*s#UOw|j7@Lk7SA`)Zt_BOTc$ zFERPP0xK|ldvhz_pG@neG+$I;w8Lx%Q*9_Oiq-MFeJpG}Gf?L2R_pMi(R6wArosIK z!m3)seNp$Glzt)A>VEb=_7}n{^C&(P{vh-*ar!12vEnT_JvD4O9z|f^Nr%N9=E54L zvL~^56eU@3#LJL;KJDCDDKt7$7B$lObE&^1TA=E)@T#>I-CH>GC%Q{%i2v}2+opw# zjs0M}vFRVW#y`+PEXw9k;nQa-9I&X-uv5O zKgi-d+}7caVU@4D#^vPck6naH_b7Kb=FX?Jl<`T=+*2N==K2y5n=Nw}yO+D|jhA59 zWSX+VBxY8F(^P^IW1+Euy}TAGc^b%hF-(car=$0__XhnzIc5@JSzi*6<3vP?9Kmv& zeiL~fM6@EKm6bFJi&ZUTa5>sh!byt6!c;%#P%FmIEQA}Yi5)`;ViF*31Q>B~^mz$N zi~=D2H{_yJU}+RwIdd)G6X{FiItX^ow7g7oSr9epF>|6~c>px0xU#c0#GU=>m>=k5 z*qokqLXS8U)gU3|{DsIwAm}I}eIej_9v_80YaxF0$_rtessx1`#1N=PCUBWOe#*6Q ztwAOIbT8tSxNxP+9z2x0Z8MhBP~VrH@CI0R{ws-upItcP+= zDxd}fwVwq&~p zZw8XUD$d}Pchn&&uL`s!Yx*x{_{pr17>bb{e$Q$c01$Jp!7S_x#7_VLOAK`bM4twn z0Te+s6x70>75i6eUR>bW?+lFXaApoe5gie`x)fs< z%s)m#BUJ-p#UPB6m3vSY$!xPYrRACy|9PT2#7C>$&x*J8B@&CI-ZVjf$|*i##VkH_ z7aB?Jg`Uy#lD+b-M%RHddkN7#9%i+WGsPtxMLGBL^+Kb%7u~`+HS{7odu9r!b2U!E zVTAW$@+azRrm=aL;yH)ATv=s$o=CAKr%4lL&b|gq!b=82R3i|yj?%N8gcz0#TV_q3 zhU5CHhX-%8DYq_zd&JBVM_t$)k|DjMk9OfL~{7#UKwaOl2Z z^QYe8CJs+l+OL3js$cP&UzBY@n#GVTT|E*n?84l)#as2>ZF5H`P&111=Brr**W#b0 ztxZTwD50i3YM=6uikk-8RtL=4RTy^wUax0lD1<9qbWHzn{}Ap6B;{*7_2G!5UTD3z z#a9FD6i8wI>+^4_Z(b;u6|b;#$=R_Pgn1%RH{6-N1shXyauTUp>0NZdtzha)kzlG? z+B+1$`sTS?0uW&O;iuQskjWLM&H7eBCB!^XDdjs;JDS|Dz9@z%9+e(+>7wXp&pd|> zv5`jpC;jvvChBjeqFP8tZ&R9Kp-P8!pyZLhL2CC;L`mIpzHtsGjW zX{PD+%9~d*2iy&R+2OwZ>rU5?m-6SaF_kJxDo@)*`(Z&3G%4BoQ~4XgyN6RDmm3ZA zrz2qA(BIAP0YJ8=qpz&C^xOOR_MWn|+nQ}4G19fk(^0crtR7OazmzzTM?h!$zHEF; z`X5jPm&vHCR7%s`E|_h^bCS|g>m$U1oweKO1^f95*K7(EL{1YY#cmNp)usC-z7)iI+6i@-ic3bEHnM|Wxrns}jxhn>P5M2UP{VfY^$PaN$zgh$!VKA& z7?R)pb$EDyJ=`brJ@a&XrLUH&lDoNds@BqOp5N3o+FIo@$HBwH!JyrCb3HwBn#R#- zxLCHSQd-~cwEGRxdX`n}mT9P`r)LBRU}}n(3OpItk%jLu1ITkhd;tLe*^Kn`c0dfE zz<=o(=z;br;F|#5V*sG!0i{0;G5^_34D>R4dd7NsPx@1bdU|%?i@F)b7#ry6=^1Jq z7<>Ey0i(ZSkJ9^gZv1uyDE0%t5ilN7@%tj}z@Yg@AOYWMFfc#gIh+nwK-K#NwsY-p znk+*BR3u4U)Gn-W3NLWx?T-A?8Y#PbWtF+==wgcah-*wp5a9%d61MvyCSN+*yT3&` zjW8`sM^`)5U9AwAK~4(SQR)T-L6CVh)8QH(+gF?O@mApQjoIG&`geUN z@X|lxpN^*g{g;5fAeCUv+YeUV-z{kv{5y5a2_W=u-(29}qy#nW5Fn|*0KOuapKhrC z^)~QnXbzlRKPY*1@Kk!egu z6^Z6^DTGClAP5%j zD(HM_V@>AfIZF__#1gYQa`O-VdUo^Td7$F`+zvSaz~#SndPnof^z;7;<|C5<`2Wfm z6RHQpscUQ^3dhFJmxo(u>-5+cU;4avbt!-+v$D}qID}V z^ujpRD$Ttc89JbN!KMK64Js@6($ zYLpi8g9YGV-MXPG9EvGRl@r?*`i2q4^6L`S$mlkWTy=`>9V2FEZeW_|uHHArl$T{s Yc%fZ9MgMbNCj8)$ux3A7j|PDKKX7+nQvd(} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/editor.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/editor.png deleted file mode 100755 index 54c66a1099ce06021873af44870955aea38e61e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8395 zcmY*N;ngv!1=z^X$FOiB?mA5#mwf0RRBPw+gZvkL|=`;Q?bm)~2iH{~jBl zn+EI+plXbE_i=z}E&Wa!0H{sCzcs^p9OF7G=(zy^M7{qhz<#H)508^n?sB^Bnod^k zUS_VA05vmPNB37Ma#{?Ye6RQf%eVis000bPZ)K&myp0cyaCNn3{*|70OgD_wjnr9N zUi{(zHvN@XE0>j={I%wX_ay34%*yhl>X@_)0^OvfB&wlh3?Z6C!G$Be;v*T-Srk>u z`(21#bk4kb#Ry+acr)=-_YgZ zjNkoa)~75%A&iXXUrRHtaTXb^zpc1D;)ee$(C2(Ra%XkJFWIppv7aLe>RJX>W{ogHktw`+>}^|bRe%-UqP z&T03+M;&G4hRl-%46y%juo_NO{Fpr#I)vTSToU3D$7zvauXMGE6fnDkrbGm*%R^ys z5itm6dlM5UmD67;ZrsA9cd)3=hQryn6RGK3le8Z5BqWn~o7 zK5<}rXDwnDiW#1Mu^Ns1N?QZf9Jxef@M zqC2vX1ID9)J&`QpR(1sqHM3_la~(SLb@hR*Rx4P+uJvz(8p!3HB65523tRq*X|Wi% z$Uf9ZZM|{Ke6|r@uCXP-S3Xu+PAvtFIs0(&F*3ySVtP7tpSkS8uIvGr z>huZqL;W6@3Yn){^3(T>l-Y8fvXHA>NRRFOyg0YYV%(y$F~dg4&=7(;SaK z|KxycGmNm2TNNo#BRtRe;2xDRq`6UERUSb>v|KYd3kih!f&#^!U`o<|4(94-GTn~` z*IXuGmIe=-njQl!XD)aGjMUQF|BbkV>j+xcj@9QGp?;F{G=bF<1FXD;J#D{O z1S`H*MZ}FenXlt#&l!ji9&E3{XSD5i!(yVRxtVMgTBg@nNv|Pi$V|(GYux zz`(!!NPddCOVx2=?M%dMY?AY#ps0U_D6%VGccEyUlM>aWBoLpQ) za2YghWMyZo$Wn(s;O_{v%3GG%8{9$v&I;%kC~sa(Ge%4GSGfmK&rX5Q3006UQNp?4 zD86|Ccum4uWg+%horkkvDShB5MR!X(HkiW(G+Ve*_%#_4yd_dl8~65Uk016j6ZVf2 zD$i97ji&LwukGC&9gzwcWv!hN9VXMimO1Rr*HJX{`=P7{Yj&2abX?)$NfESJ^eva( zc~0g_?8nW@BXLdUj=$dFl}7 zJ!UtudNfC#JcFg>X3$uU(D>-^FutOqq7(xOJdHyK-rXJ2*x1;Sos`5_v{Gf#MWhuu z^d#ZyebrStK>_rN;8l?JGZ4wUc`)tvXZ=-wGq+M%%NUM*9uU^hq2|S*b>4B^CePvo zY@F%b@t|?~Z^>HZvWe1988Rl4F}(TIzfa?jCK(@#=>m$%NK@gv2md$bz@eYQ=U``SXD z=!yTuj85Rvu57G+{%1;V><#gr3}PUOgT4JCV=xKa6&QY9G06`TTM`Yv4wA0xx;YYU z9CN16h9!?YX>r>YoMfo89;dIVtz9coIj1qg2ZINS>wYnnSK|lrvDXLQ z`L=k_#=nXRo3kBmpCk2mxUf!R0;qScyYtdgbz8(rQTbpd@K9^Zs9AAgGGSRxODR~f z2p14wnDsFk1OB*+{$yh7qV|k>F>RS45gDBmpVc&@XF;Q~CJX@P=r4}Ez|WbNjg|F# zy=Ur(nMniOk`Hbn{jY9A1|T)amW(CC~ z?M*aVxj50aSfje+?%{D^bL}bd1)H5-AOr#`ZEqr_kIr6G58#_d2z4J;!oWr51LQ>k zW8_jF&FECN>rAIkX{m|=Iywr9&gLgm@k^CNg#RqOE07SEe)o>>g>ojttPheJ2kmA( zo=>`PnjpG#2`D@bpjuoo1Nj4MPxQV>{inHeNy(2D!bn zXg8iyr_*wb78UIguWT?-&%Zh+-pDx?*2%7DQ8FEy9s9EhmZE69Fx|Str|o15FL2rj zyS$)vj%&q=CyiKTF2T@AhW}fAOOozI7lQ5ImTX`-^$)xf-9ixFx81uJkO8HYr4(Hm z>`9FoeTgMlagfku3x1K^WcFWn(1QGrMQntZY#9NYMm50=>-s^#+ci*TT3v$fn@TC> zCyyAt6a8LQ6$wkA7cli*vv*S*csEPWWD^+wavfgJ(U5uL2+;+|QGge(@Q!YdCZ3o1 z{UOk&->n(b0XV(-WV@mxJhY%5$}VnnjT+{@oA6m%Pmol(n(ew5NK|EIe9*;&_@9jm zY5NZ;4KV~4U04T^lOgXv74XNq&K!=wmvy4G%a|mt`GfhUM#@kn~Wx}88 z=rmy@Qpz*@;x{$^MfyJuYiM2IoK)6~%@jf<)htWM2F_>39PbElV?@}|=Po#m0m~X1 zQkjMvShNfc2{t!336(Nld6djF77NpT-Oc7}>L{tg)mcF`AKMY(GEiPTaFyd7)is)W zK`9k0sHH}CB`Oy)fYm{6Ujj_l6l__?yguY!EP1V9xsy`~I~URwd>#*|u~AtYqe_~-&MNcf+XtZ)f6WO}Nl-l{Dz-OC0%l_J zK>F(0ER%RQR-(4T$EzU1|Kp3dM&|dmbSKqcd7-}hf1qU+mF{$?g$o^HR)9EM_A4tu z!}vz&WGJP4RAxIzm7aIj{>xa_8)5P^Le_PT?wvO*x2pw2y;d}PKOOo*xqc?oBLr(% zX1vcDzK3xAaQra*ky?*CSFlJCOb_@!X*0)v3HcbDyzo?a4+XlI)-Dxxn6xwxVr7Agm@lHR7BACocpndm zl55jo{AAM9)0C&b3@|+cO@tVm%GK;X6We1qHsXV35<+k4O+tk?zZynN#RD&P zTIqD9qe34hNn)cd5+AFqBTpWXvoHuw45Yfdzd4361&fmaEYQtf2%MG~(q7 z$;D6kJInM&^z=o8Wl45vu3kq}0I#p@V(HKVZhpbX-|Q7gYx2OlopduDk0;)pf^92@ z+RaY0D?%olqg&6b(NjB>J-{-eKZ@B&`WtF|pt4T7;Az@%N^Z#{ecry;8;Xl#Ct-3o)oxx7l6tMSDSKP^JUbPA$0w7dZpHE=aZoHZOCu&umun`FCC)RMo+C*( zSyuq{?NKE*?B_E#Kyo}Z`9VfTriG36m8;0q=)|Elem5gHqZ|X(Jkv-B)6?}5rimr~ z5R$L@LdfW5nS+p$_>b_a&B1lp0`QY+FS%uFQ*g|r_=>i%{kpZ%-xq3wEU&V(!MQq; z>RlJnb)M}jFnq@*mAeIm>}rxM!^pfcj~7PFt+2Mhoz6msuMT1eBb6^LjJZm)}?P>XmAqi{r)Z-9TEu3pA?GKcaya;U0(Yq&qQ)#WzY za64ObeK=3YExE6~`^`lh-!0pJO8-wwl(A<;Mx6kbLtQL%Uk!gUydAQm6i5!!pQ?nbCswj@n_?NPjyV$r=dY8IT6V0)v7QOiY5=t0x;$vJFR&qzTup)@VChbf4FR+7j z^OTO-gg<;tgbg4;{jpS zPc*q44YM3C+DP1ro{mI+Jmr3J*P$ocyN6&B7^Y#N_VoHL`kgrA)Z`bEvG+&6cQRLl~x;u28$sPUNafulCxMZ z^!KA)WOE#q-)e$;Kua~j`A)zv_%n%qmZ@cWr-dfVr3PEg{Yl(KaiRtYsn7;UC2Hp- zo|k{9Ao&!ctX#A7e)slIn}Usygu}~{ciqj5&uk<&A5+klJSvO+_=p6F>zyp_3$Nbk zn4*W_r@8?=-0CYrl9xd(apUa{&EL9#Y?)vfHJ1h;g^O!(_-U+=K-g(X3C3L{$A@}n zy~ZU+fW&QcL(D<3f086shNbmeA=LOrf2;7_Yuo7_LCnuc_%63&FVFOs3(>pZnw=PX z5KhG7!ZZUUJj&!b1g&iY!$J|KGy&t`ubYQOvAv4>R|jaqZmuHNUwxvYy|Abue2vNt zC4TVA(LBsJG9zQnUWOo>BxWaEj}DSI!kB`nhg5qVv~8RDm7C{6s6 z5J?haBSCvRuOth~!Y(n^8fT3$+9C7Wn7q!!*K8?NqC8V$pn54hvZe~5&crd2yQSo zKWRvpqciS?K3B)day2IzwCm#c4po29`D%GOQSf1Eb?x)@@QH>vnBD_ZmEy<~fSJI0 z7r9#7FG$;6KKv+590?Emaf5rB4w?!6wz2Yg8l68KB=s0inWC74p?ShSDTGLa%Ok0 z@PG%f*99A*z`g1l2Jdj;kHf-GsW~$N3`sG0PLoMze=f$ZB(GL67@<{9p~N^;8#>)w z0&m(G%bqV$`=GvE5l;9Z>Ecti;mr8^Cw+p8@^p_37Ud7hmqrdS+G42Qd%Ave2u^~f zc_wO(g{;2bCiA&MjW4B>TDS`npA&8MXmCrX@fVOSSDZ$(N6~qED^F>Xhz1^ZAmZv! zVvhGj-KCL%=vsR3tC9UbGIO7hNgJo`?j7}pFj|jnp1s9YJtqS|c?|Gk76k5Q`Zc*F z=$VZrPmhn8fEBte2o2&0p77zE@DYub^1m7c3_xO6-}bld@)p;K1-dVrZCo|8M8T~m z5t-&VopBB|i646%1_4rktY5W)jQsq7aNHP3S+Q0%8wz42RdHXB)>W+Nq}ZbGWlen_W|{?7GroPVHLLo{Blh6 zPv7cWN(|i>#DCd>$U}5E3x*q+3&yToFe=rcu1pU+ue+pS@xe(^DuA%7m!GV?^7d`f zIuQ0`tcdU573AdP!u{~&EPlt5u64?iI_^;r(g-StZ&!RMaehLV@o-xJb(Z0E3ZyLI z|9+80^0$=iZRbs2YVVg7`e31>%zt>?>qKo1z1p&e;-O_K_DqBfNBk&0^rLsBo+;ql z<(w(xmNG?boHAX3#d4<#&os}I21B6h5UBghxW(ecf_1rV8bq6y6R1|1d~YNKS84}d zJuywXuSSZ&^TZ<&_?j5a@9nHk=EDXW95{}J2-PLu^Cr=tk-OZrZ10fH(?SoAkwy!P zL98i%4Et$E!ql?|K9{0W@;9a}-qj^(J*T)bUrx211)H9PI==5Ir`f!!1o_v%&M}0k zE&%=~8#a_}2&BqdzD9*(9pnGpx?a7GEAOoEO#hQ;m(gL~X$nR(T}FvR_kb#|Bh#R4 z;@Fk#kZjWNW`@br=UsRr_n)~t6^LG@$P8lC$eOXyeOQ2NcFJ0R42!*eT)7Z+ose8A zDMxe~8Y03LImMz1#r#wpK!Hj~^Mb(WyTrT-HLJ-loNI&g1Eg^nft2{oDb--}LPN}A zwx4+NH2O%yELk8(%{u9~L>bs#l`^F9sx0cm_^KNg!+}4}X{a<0%k2kR%!G7i6R9wf z!gbp(XMZ#W27PQW9pf0pu58D+fyAf7VtFYzT{tMwPn#+B&rZIqi+s`{u$>H>f)tmg zdjkq{OFdd6JtiJ_r-brR;=fSQKe?{Zb57}*1q-iwRj*^1U<7-|(W}ostI&k4MoTYQ zoDjSxkYB3Rs;a*c_D635ce`$VgQg4Kue>})W4*oTY8S`5cu>Z7_kfg^x;}C)UFfeq z(9uTi1{GF*DJZtcJ+p3jrZFFNsTG9P)dMopms$>>jX;w>RnslR|Iapki0$$@TzIX`~E*BD{gFd!9Mb9k}Yz8KA2g^_A=-@ za!R}OPPz8P%9OU*+A^EvD zySUu8e>Cr#eq%R zT5(7$!O|yvB&4-CR`QBB=WqPtytm+CZNqIGD@s4MVQTlIKn}vn4vzom=NP5a*AV4+{HNy?&EY?&kmY65WvdrlPb7&>POPubV)N z6nlrG0u#w8fwPf@ALTGw89ZrAqaL779m}lG*|xXpHTyAmU6XP+^9}fnDc5vyji>$v z=W|OLDaZQVLE$eKr*>%Om4&>)5SpB<5*oiun3WUed#?A_iPaJ@u6X!jeE9y2Ys)yk zQFFIx%kv`Zv&=Tn=bc3Ih}lanRZ!|hqPGFz+m&(jw_~&*U_HGfPunW>y0JTp>*(nS z)S@f4A7)XtG9P&R5jtpcOs)>-zo7brvXoU>P`(d0uDIGMetBkM4m_291!qM}*^%#l z)0L`z@#QCIb=@_DKI3!30+z3%0g`W5e2wMoJk`Yf@2MS`-@8Ute8c?=&4+Jh?Q7eT zi$|Azd%`-tTeS-bY?qQ*ZjBe;bm=^lywE0WpD$hf4L_~2ncFjD%p+6J_J^3B$(6w7 zxAMLWMpGnA$sGP$8e>Lt92{%Swq@ssE#+j%Q{u~?NJB~=p3JJ1p}lJ1;f=T)vBcZc zT+3NLPK)2?uq+y!;&W}tgEnC9ri2;i*$Gy%#5+Szmo|eo&Gg{;k*u+SZWtDyKTxy9 znyhC`ef3KGAwg>7&+%HFs?p5PUt)09^Q~ zo6D8FH2#Duw58|FX^ptsFP^Q4OWyUTo{x6IOqZ6mO`H7~ZA2>&Bg7W4*_#EMaL^E7WW4E;2qzW~@=edRtK4JVl&QI#YS_O<~y6QsUPB^ms*) zTHM_Ce4oS6ivK=)1GlT>s9OgCI%u^A&}YPfr7pBo=pXbNXW92i#A>W1f-md{NO>@kmGVoccx}JLW9K~4(OczMZ)247{?N4JZ57h0sgHhnv3~?niKD*i z_R4_8X9pe5i6LD`@^A5R=m)nK@9r=e97PQ2A2!P$g43@^p4}_9F-lE|u=Gc&7r&eO ztR~@%qMIsEMoTau9eY#G+D5+@rE{qc6|}8&+Dsy}GP_u?8gv%@Nva^!beF1!7A}f> z%hwh5MP-){-5_!C@eu2`%B@hPP*&dEMp{?5!m+WUPiRZy{qBC{6y=rjm1ke@kxcHw zB=%ijnaDymWzI-GVIxCPRHI>`HtOE!n@3(J(@qOd_8Z&?tgl?b zrY>^dzu4wnIsIJjb~Cb@vx*fK`K#R=`u;>Ayj^D+R_^sD=Ds84u2K7p%DMw@t4xl| z%~6Jetg}54H^;dE*Y8xQ3;d1m>~E^ScgJ&$$uKb)ZP^ncP8ubTS^(jwODW#<%A%Q?3 zB#3}*F244xJzm4k!JZl0WF*U;nKNhBzO8++*RY2PIqLPgNhA`6%RJAM)i{@HUcxjl znM$Q*s@1C8=Q=z;G?bESxSve+$$ELze*3#!9@taAgTGyfUKDUX&~8IWT`ZoOH*emU zi;D{ZUa3?>sJ^~F`9SdD;bAj6I%?ACK>=N_TNosi`S5Fp#wO?3#oRTw5s)_>O>U%@m78b9i`Y3Rc?y zhY!pOaQMbrx*5;uMgTuPK5m5=4qV06dXyDn0p}+C2B7`@eRFVdU=n@()^C#n7Mdnl zXpP#&J$$eZ*UIIxxpCu$$>;NCxat3{*7ZKEED#Gg06~*HN~Mz7+uJjzr>8c${Ohe^ zoPmXB0Tycp1_pwChK7dB2eZ>65ckkQjo4^+!~*V0k3ihr-SuB)5`kv%BD#eZgx9Ef z1TPK<0pQTSUgHYUwZ>gnIX*r%TU%RAI`n;7Yu%+VK9B2+1^%9y&Y6*s5wU1oDwIHu zqC#%G>|mA1x||gv<0YS) ze2Wg_S}s!Kt|qYY^XJda%aO#73^@H+in3-ahhU$bwc4J@zEv5zm1w(tV*__< za@5ptnXT=eP~h}&f~WQ7=H?{TqvyoYs>|xRkpM{erRy><_sXA-Vi5ra;HYDHdD(XS zDU)bc#qR{TF8=ikAP|6~EdwyP5WXQKuCZ|z+O%$hZ`@C%Qs&N`J2F=Ra5ufjNk);b z5~a?6{{7Fqdi5%JIl(aq-GLIWqo}%d>y{PJc2DXBQT2(&5(%8z4x+g^dLUaIpA^m7 z+M2KgdPr*5?LDy`0g0@+xVUKBwfAJpsjr%& z0O-sJAs8C~eRg&xb;-iQf>0ou_*Nr0mqJ@vJr-~+xu!*E`O#m0i?-dDaX3Ul5Dyr` zp+Zl=Xm9@@D8L{ft)c^(9X#t6tQi{{Gq-Qw zHmO0s)@c=>VVaKx+%*+IZ*OnQhyt0DRL2*!nyp|D&JuAStTR79Zx%mZ5O>l7b3PMB z43WUKo50*i_W+FKBU)7{->o<30#b}MYZUCksTeGow+xfB6(Z}EC>IGxqHb4~ZQ924 z6bJk+Vab&w9+g-kd371dS>&o6QPMa(>R| z+yv#7E44;4d382Yt@;yKl&>gbQJX+hUdCy%gdh%Cf@gI zR^|9x1AXMm%8CS^NYu=bnjy#@6bc&XRpYc8>64&Iojgyc)8_8oyP|#Z|7xw#K;w(- zhsBI~`Vv7x7;a8WXol!U+uV~@eAZ6nKJSQ(o4e*68820C`S2NuGwAP6_%KwbkRNB06+KdXIQ zyDEMoL7`0q9w-adrT5E&UmGZX2vkd~|KGeWfZgmv9AqB&yZ7TyKU+Gi2o1G!jc#6c zUC+224voVC-gn>sU|Ged8P^p$9sPC(_UgO+eXb@&9e3WBUwzx454+{%b^CE^!J>f^ zho(yJ{ukc}a54%5L!Wo2$+%C21J^;TaeANM|5}O-R&bg@;#O*LA$Ftjb|v!vQy9V& T6R?S>00000NkvXXu0mjf(mH~* diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/grey.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/grey.png deleted file mode 100755 index 0d0a76471f2862c795474941aec0e83f2cb59ecf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}bl$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G{GKk3Ar-fh5)u+J7&r_V7+M(`Utjf^36x^+boFyt=akR{ E04xj~NB{r; diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/icom-message-notification.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/icom-message-notification.png deleted file mode 100755 index ce1dd1a886c906ec36cee1dec72b9df605886f02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 832 zcmV-G1Hb%k7RCwC#n$brDK^(`2<+!Jah`6UC zB6^C5h=@4)4|jR5=a_ zzRF^}svNfv^ZdeBqWN>ez`6O3CP!Ob6K4KgljDGB{)*sTz z^!1_w(9GG-TyfDP!Xo{00A?<4KW=CfaL&!$~?mW93ud- z3_)ie1;GE|1Obpm2w~>A#vwlZ0OULT3;~cO2o&>Dvk;$t01|?#%xy-f#%wh&H3#uH z%$L{-A&Pnb^MGX;LLBpvWebE<%-aGXRr6^>@B+0UGRf&e7>ied9i0f84^6TZJ!A+9whO+(;!!F#YF;zg_o!^}%< zGkk06A@JD`#0GHz6bHf##J%YUURb+q4dR=rH)D8#QX6s=7zaZ2Kh67ZKWsPpMwF>h zmcl094*z1_Z=xoi4f_x)S#E};)g`u~9hP>B+z5nnM$H?8a7BP%`{qb22=eStDWm3x zg)jxNiZw*A)>t0*2B$?WvJ%!1$@}hbPqxO2d_LeA15oG_B85LARQOY3?wp_|o{0^U zHL<40a`3hPI3dTTW*ofXI!ef~!-ywEDQATr105Wd)|viX?ieA*mL>=98jTQg>=7rG z!(@x>@8onp!CAW{&f2af2c=}kUg0{JbIi%f$;rvd$*HLN6<`1!uF_d9==`$)0000< KMNUMnLSTX$7j)+U diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/loading.gif b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/loading.gif deleted file mode 100755 index 7cdc671dbbef29314df2c8e0947fff9eb7b69068..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 869 zcmZ?wbhEHb6k!ly*v!Gu-rjC+Zyz2WuCA_r{`~pv+qci3KR-V||NsC04A_9;e{Mh5 zkYH!W09PYD17=2`8pWS1tn3UN3_2k7AY&O=f(1@`uHM@raAxbX;6RUiZ9IonyOwk= zx@HxYFLhpw=iQXV4~++oJZENY7JAfQETT5uO}(F;A%UgIdu!IgB;9E3M+FlqHYXU) z%yDbJ_Vi_o?sRt~dl(rQ8H9k4fyGbYq^9>mi|E-a4X>&RvV5z3=rQdwXOi~qeUdlt z$}&8-Y@lEzd;U51yMiP0C$xVsoY{U@SKxrlVo9y3MN^enm^!ze`r33b>C;=8ITTCn4E}aMf1V60dOlgSctTu737Odj;m_2 z?5I}UHFzM*fMx~Dp|c5aE4WyRw89x2P!daHQYDH||gUJeLR}Xvo@mM|+31TDlU0H2`ZlNCf}@ diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/rainloop-logo.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/rainloop-logo.png deleted file mode 100755 index 1cb320c2ee599723c1ffff22f980a90928b50800..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4750 zcmbuD`n1|E{0O&R}Rh3L$ z{rokl4OVTLRaoGdm;@K2;P=C44f?z3UDfKhMSXj7! zxF4ROuynSp7zcu@@}5N6Ts6Vm8u44GnyGVLNVf9+ui){Oz8%84tJ*QUbG?U|HdG^* zs^1&=g@s&^#!d&#u`zM{J>r|fwIj-xuy_fVQIBC=5J|z{IWKase+RGF5TmoWubz$I zUy2?X&XH=-U|rN|M7v`euVOcuP+5gnq>EL%n^+owk#F3fRemK!`jV&iyrS7~B9Nm} zLOknK5K!}0?9-=3WLB;h{hH4>y#3otrBNP)HEl}6v}kJ^5J8Yrs~>>*dW5WZQ{^UpqAr7q}z?D_rV zc+VBNRklCvX~3jSyGvdRqUj@b*vzRU?((bI5Y1t#F72I7nn6-sn9MYvX#d?^5DS04 z==BV?YOM0kMbn!pgbdf2APP7*a59CI3k>MD)GxEz*pF#Wd<(uPg9ju(-EBktE`APU z9qF$HD#g73;nOwE@kqe=hXMMzULD?yxQgm2FeV>LNRIa z#Ir=~r{yHla2dOxu3fT;(ZD)Ltwx-4y2}{Lpe}PSbvihJl4GxkiaV0uhB4PJLDR&M zN_9Pwgkh>mQ1tzQ-<@(kxNfh*oA-cQhb)yr_Jc6I zx)~ZMIFj6@;)Hn&jEu`i5HZWMJ=_JC!l1ljXZb<}SZ?Uc_32xy4k%-jVHBOyp!Jgf z7eGWfEq4?42v@a*IU&vIXGbhW^;*|vk1^G-na6kOYj^*P&HvFphntbM904d*(L2T1Pd!rGP5Lz@L7(5pC&3aT)<3OJnvc+Cc1B0G9vGes> zv{#T>i_7D3|CQ(ALx7DJ0{4B5|N)x+8-VM3#Sae zeX2h44R_rh3ol*Y$iR4Bu`7pui)c=yQ?b_==-K2Z$Quv?rmeg^2gT0Z=_^m;|$|+J7?EM?~c~xd{Ft2myXB>ul zj+Hc1uRuR-dH?KC)wxwSp$9b0=mU5jZ*F<=^$bnovZsCiL`jPp$%3*rdY3_Wm-}w+ zBDv{-%QCU~^y?PUWFdj^&j!P;tOjY$hflv_0zzNl*@AWehb8hv9(m18zYpyE)U!kE zW*ge;@nRQxgk;Z=Z~MtyFCrF#srZ7X|MH%pQhqGCLl3(xjaB$LcYD3(1n7EN%ukUx zJgVBIV;VX+3U+6OP`QE(JeT)Yytt4k{DBD^$*cQn`~qy5z$ z?q1-XGl@jA8PN1{)zB4%xnd)AsK@EJiypmwxfkmP-0Ygh%ZU%DSsivsVEQFk3I_ag#Sj{uG%kQTJXtsOyN2U=t3*z|XcRCs+ z_NaM0^|6VPPRN^EGa!Q6SFXHO_(L9No6(NyU$WjAiMnv3&HQ<2Xc&HaMy=5nIB-K2 zkahkW2eb;1@+bb(jC_PPH^B)h4BJgYd>>Wjk$$1DuV{GPwQugOEBQ=rALydF*IaB= zp;ZIzd?)XAFw$fM-&Ky7%8&L^S+ zQ8=1MA^-sXUhc?mDF8=n07eAFHph`1bQF$Z8W9SyZ0g?VB z2IgI>EqBGT{}|xlh^)R5DQ?2Pw4q@J$!XCLItw8<&x5yEN1U-U^gVGZA}RXsHJ)9< z1`4Z8+}N^DzEc0#$TZbr3N-?Y1J;<6!XXwP;IuNCHK;@U`UdFBlYPB6j=@>>$=-ze zf&)@UutW9~G%a)JRo@A!@R!Q;Osr&J)>_abd~U?jQV`jEIdi?GthUAkT3Y#YL-4xP z_}l0(mhh;zkUL^uiQQng)Wjr`dyYAJ>9NX*GQ1zn?@63iZxrvU-EmJ+DU{Ms4dV${ z>+2ZrQ)386d*UbYY;=|F9ywcf%=#ZCZo@|Zd;%?!G0eu^!|EA`gopl(wARcL{A z`E?YnxM(bLaMHF?ot)+e9jhj=aP!YE>AegVzljses!kRM9{he^;XM6N&e{s%vnD3@ zmVRBEOVsaHf{29v1D{5)Y)%YRz0I=I5~BJiZXmz4ao%S-W!i^o^$#CwVO$2J#p_TN z`DNsH6LTo_Hu`$eEzQU-;(~19O6D?LErSwUKiC~dmEXaez5z<*ZcSM=SB(~`PnRqg z)pvlt@ci|i{I0gSJnlZ?ex%fEFXn682-_UOJeVqf;JK6}1wUtDhu)4RanTEL4A{++ z5Ley_Qtd5k-5qsW2!`e@BaMmPB|#n$$$p)G?ZlO5!VO`xr;m@jYCU%U9L-waEUMo= zd)r7f#^_qAO_erfwoB%+%(}QMce$L79zMJl$=cddt3PO(uBO>VU9neHUB2-;x3f^4 z-SiPnjy*#USU3R}f15$1<+Zi$*1LOXtyKJ8^!*A0(01s5$k6-F%@FCz*c5toMTqk& z?b87e8&A^{Fv@w~iYt6LE9FaRpfga`sNZDxN_r(i(zRjjTxbz>-REw7;e?&6+j$^; zkf}U@Ulie7M}h`T!Q%H6US$zCF(bGD&C&=a{v(L)xexAl%K(wQrtHa2d*kp&hUXBq z&33nMJE$ic4!HNUd>TWvhlLykq@xUSpRZ>SUR@%3?9$-FfUVao@um zukhxn@iQ|>`Sd;oh-+c)$9s8KmLFeh<%sikkb6WqV0`iMKt{kp4F^ap$twcQG{UL*8 z&OMo-h+OSSEPKklOn`I$e6(5LgSRUj_b3g*q3l!@OHiwfnBFlQ5Rcn9JHUl-4#t!D z+yvlm+n69WbY}CNH(8&PxwT0!hnGl;n$S6Q-RN68{QCj{Iv0T6gSivm1NMr>e;-`~u)< z0hb3fW*(SJ$0xpl3Ns6liBdYn!?+mu0O1wTDf52ovEkz+@!Tc~$@sTT5+etvInlm_u5$pdw4mtJm1nqxjjyh z<4g$@HjK5q2>@rBDM+*6TSh}x6C4sHcm7zwjekPnU)R`&ZVKQ}ofDjZhSyHG77iFI z%!?-~iNNDar!(cw*4r!0r8n8m8(ZG1-E1DHrz;v_6J?4!`M z0Qup`vh-U)txZX=qlVo>ZKMtL{jQu6hM(EDf;>Z8j`20oI|q2nv5thoPdSDP6g9RH z@2KGWHW+6gs%kPRrR9NQV(I1Z$WHaxf9_B{^c$ig^H*Lii_WFv_ zW1QA4x9R`^Hhmhg3w+5`NM;?7la`XOmjt$<_hCc)FN#I;m($1RQ42}7dvDr{gf`Tq zTa}x#DP>K741TXgsv7Ex0W4DSE0RRFX58vdR1XiiPhwC%0pw*tf#p#zRDee5vfy&@ z7h+GlyGQ)Q?jAef@b-i|+h3X;|AqCh{f7YSc1cl#F&SUXs*hn}+m%Z`RT5pdwIIlcpuT~o^3`HY~RDXS#t3$yeVud~ulsBQDScKwBEM3tyL`@rXu z{v2a1uqA0s@ZR=c<1XShHK9hjwKq{J^vOBNM`*^Sqo`C%U)oYnVgQ02(#IA{hSrtE zU0ANtJ$}BN-S{SA-IA`9 zKavSv6n|@eaVC-lDm0ZVXq9dW`H7vNl(%@aFtpe3Dv;ef`{kB772USvWseHx!HbLs z1=AA3%8PoDQvPQ2HlT#8`T)AR8s^PGB(4+(~8*OhEe5rd0x}=$5A{sYqrpX91nD ze#Yy>ou}aNzVUi7sL-I|PUR-S`q;C?!y*DuvWMmBGBTL0`vIwXZFKG@lK9Uj7TxYJyX%tnd>R=^jv&WV5NYpuMC?(79^OUeJ}J4Rto+H7r^ip6$jZrGzGCIv zdGp`CeY4)QEFmIYKlU6 zW=V!ZVpd{BPJUvFUS?ieK7-;<7EUgpDjkq5AV)H=1}G@>rDV=qY9NxMsMV6NYV8b> zV-uxJ8$Phz>}ZJYWwBw(Yz>$w(8}1^x~OlBrcQ%r)Q?3fNgsB3OqyWPvcgnNwxZKC zTfs(He!g3T(^(3HS!+Aoy$El!_eutIFzqJ{mA*#hU49T~W7 z0?ZBAZ8%vP4EQ41EVOtz+m#iuS)Ks&q4MVm8n;9|w78B0h;ZsIX*Yat+{k6+eA>`^ zi$_b-LpBe+87en7Rx)r1?7Mh|^+p!AUSqh6!yUdzhD8P*oMNpy27OLfxcagMyq>+~ z3AHyZXJ)BU$>xpGp!i@LKb8+W!Wu)`0v5 zjJ*{OJg$ZUhfYf5#!4LDDdEv`q3wnSyFeF<36sKe4IPPPZi3=zRII2vok~9CmrFteyrc9TL5A-sYQlJ#^R)cIuWiYc(~yN{I+8Ijnmz rVMRy60j8eTz-^EsPmaOfMdq_M_mcK4_$GFXF>Cl~+#Mn?;$ diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/sync.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/sync.png deleted file mode 100755 index 0caeb92a36a0c1db6c86c050e07a998394d9f1fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF3h)VW{r~^}hK-xzlalM3ntuKI zwP)YH<0np(l$Aeu@-!-K-f$Wov##*!evUY zh7ML)4MN=o$k1!W~91hcIQ+@-;w;=ses<`yY%SfjDg+0&RUgDc>;nyT&s zzON!;{%2X(*!q-IP0czkx^+e5vN243%wH|NFR~hFpK6I~L`h0wNvc(HQ7VvPFfuSS z(ls>HH8cn@GPW`>wK6u=HZZg@Ft`)*Uk^n?ZhlH;S|x4`YZ=`q0W~mqy85}Sb4q9e E0Q4eotN;K2 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/white.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/images/white.png deleted file mode 100755 index 7d7452b9f3e56b54ced5243103c5c3ad4d76afbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}bl$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G0-i38Ar-fhe*FJm&+O2^$iP{{T=&AL#Rw?J;OXk;vd$@? F2>^JA9qj-B diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/img/loading.gif b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/img/loading.gif deleted file mode 100755 index 7cdc671dbbef29314df2c8e0947fff9eb7b69068..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 869 zcmZ?wbhEHb6k!ly*v!Gu-rjC+Zyz2WuCA_r{`~pv+qci3KR-V||NsC04A_9;e{Mh5 zkYH!W09PYD17=2`8pWS1tn3UN3_2k7AY&O=f(1@`uHM@raAxbX;6RUiZ9IonyOwk= zx@HxYFLhpw=iQXV4~++oJZENY7JAfQETT5uO}(F;A%UgIdu!IgB;9E3M+FlqHYXU) z%yDbJ_Vi_o?sRt~dl(rQ8H9k4fyGbYq^9>mi|E-a4X>&RvV5z3=rQdwXOi~qeUdlt z$}&8-Y@lEzd;U51yMiP0C$xVsoY{U@SKxrlVo9y3MN^enm^!ze`r33b>C;=8ITTCn4E}aMf1V60dOlgSctTu737Odj;m_2 z?5I}UHFzM*fMx~Dp|c5aE4WyRw89x2P!daHQYDH||gUJeLR}Xvo@mM|+31TDlU0H2`ZlNCf}@ diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/loading.gif b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/loading.gif deleted file mode 100755 index 7cdc671dbbef29314df2c8e0947fff9eb7b69068..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 869 zcmZ?wbhEHb6k!ly*v!Gu-rjC+Zyz2WuCA_r{`~pv+qci3KR-V||NsC04A_9;e{Mh5 zkYH!W09PYD17=2`8pWS1tn3UN3_2k7AY&O=f(1@`uHM@raAxbX;6RUiZ9IonyOwk= zx@HxYFLhpw=iQXV4~++oJZENY7JAfQETT5uO}(F;A%UgIdu!IgB;9E3M+FlqHYXU) z%yDbJ_Vi_o?sRt~dl(rQ8H9k4fyGbYq^9>mi|E-a4X>&RvV5z3=rQdwXOi~qeUdlt z$}&8-Y@lEzd;U51yMiP0C$xVsoY{U@SKxrlVo9y3MN^enm^!ze`r33b>C;=8ITTCn4E}aMf1V60dOlgSctTu737Odj;m_2 z?5I}UHFzM*fMx~Dp|c5aE4WyRw89x2P!daHQYDH||gUJeLR}Xvo@mM|+31TDlU0H2`ZlNCf}@ diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/preloader.gif b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/preloader.gif deleted file mode 100755 index 7cdc671dbbef29314df2c8e0947fff9eb7b69068..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 869 zcmZ?wbhEHb6k!ly*v!Gu-rjC+Zyz2WuCA_r{`~pv+qci3KR-V||NsC04A_9;e{Mh5 zkYH!W09PYD17=2`8pWS1tn3UN3_2k7AY&O=f(1@`uHM@raAxbX;6RUiZ9IonyOwk= zx@HxYFLhpw=iQXV4~++oJZENY7JAfQETT5uO}(F;A%UgIdu!IgB;9E3M+FlqHYXU) z%yDbJ_Vi_o?sRt~dl(rQ8H9k4fyGbYq^9>mi|E-a4X>&RvV5z3=rQdwXOi~qeUdlt z$}&8-Y@lEzd;U51yMiP0C$xVsoY{U@SKxrlVo9y3MN^enm^!ze`r33b>C;=8ITTCn4E}aMf1V60dOlgSctTu737Odj;m_2 z?5I}UHFzM*fMx~Dp|c5aE4WyRw89x2P!daHQYDH||gUJeLR}Xvo@mM|+31TDlU0H2`ZlNCf}@ diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/social.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/social.css deleted file mode 100755 index 5c2859ab..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/social.css +++ /dev/null @@ -1,448 +0,0 @@ -@charset "UTF-8"; - -@font-face { - font-family: "rainloop"; - src:url("fonts/rainloop.eot"); - src:url("fonts/rainloop.eot?#iefix") format("embedded-opentype"), - url("fonts/rainloop.woff") format("woff"), - url("fonts/rainloop.ttf") format("truetype"), - url("fonts/rainloop.svg#rainloop") format("svg"); - font-weight: normal; - font-style: normal; - -} - -[data-icon]:before { - font-family: "rainloop" !important; - content: attr(data-icon); - font-style: normal !important; - font-weight: normal !important; - font-variant: normal !important; - text-transform: none !important; - speak: none; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -[class^="icon-"]:before, -[class*=" icon-"]:before { - font-family: "rainloop" !important; - font-style: normal !important; - font-weight: normal !important; - font-variant: normal !important; - text-transform: none !important; - speak: none; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.icon-arrows-in:before { - content: "\e000"; -} -.icon-arrows-out:before { - content: "\e001"; -} -.icon-list:before { - content: "\e002"; -} -.icon-search:before { - content: "\e003"; -} -.icon-user:before { - content: "\e004"; -} -.icon-user-add:before { - content: "\e005"; -} -.icon-tags:before { - content: "\e006"; -} -.icon-paper-plane:before { - content: "\e007"; -} -.icon-reply:before { - content: "\e008"; -} -.icon-reply-all:before { - content: "\e009"; -} -.icon-forward:before { - content: "\e00a"; -} -.icon-info:before { - content: "\e00b"; -} -.icon-right-dir:before { - content: "\e00c"; -} -.icon-down-dir:before { - content: "\e00d"; -} -.icon-image:before { - content: "\e00e"; -} -.icon-print:before { - content: "\e00f"; -} -.icon-calendar:before { - content: "\e010"; -} -.icon-cog:before { - content: "\e011"; -} -.icon-wrench:before { - content: "\e012"; -} -.icon-rocket:before { - content: "\e013"; -} -.icon-fire:before { - content: "\e014"; -} -.icon-purchase:before { - content: "\e015"; -} -.icon-apple:before { - content: "\e016"; -} -.icon-dropbox:before { - content: "\e017"; -} -.icon-skype:before { - content: "\e018"; -} -.icon-creative-commons:before { - content: "\e019"; -} -.icon-ellipsis:before { - content: "\e01a"; -} -.icon-left:before { - content: "\e01b"; -} -.icon-right:before { - content: "\e01c"; -} -.icon-down:before { - content: "\e01d"; -} -.icon-right-mini:before { - content: "\e01e"; -} -.icon-down-mini:before { - content: "\e01f"; -} -.icon-up:before { - content: "\e020"; -} -.icon-star-empty:before { - content: "\e021"; -} -.icon-star:before { - content: "\e022"; -} -.icon-at:before { - content: "\e023"; -} -.icon-list-add:before { - content: "\e024"; -} -.icon-google:before { - content: "\e025"; -} -.icon-google-plus:before { - content: "\e026"; -} -.icon-twitter:before { - content: "\e027"; -} -.icon-youtube:before { - content: "\e028"; -} -.icon-warning:before { - content: "\e029"; -} -.icon-warning-alt:before { - content: "\e02a"; -} -.icon-power:before { - content: "\e02b"; -} -.icon-plus:before { - content: "\e02c"; -} -.icon-ok:before { - content: "\e02d"; -} -.icon-remove:before { - content: "\e02e"; -} -.icon-file:before { - content: "\e02f"; -} -.icon-file-code:before { - content: "\e030"; -} -.icon-file-chart-graph:before { - content: "\e031"; -} -.icon-file-zip:before { - content: "\e032"; -} -.icon-file-music:before { - content: "\e033"; -} -.icon-file-text:before { - content: "\e034"; -} -.icon-file-bookmark:before { - content: "\e035"; -} -.icon-file-image:before { - content: "\e036"; -} -.icon-file-analytics:before { - content: "\e037"; -} -.icon-file-certificate:before { - content: "\e038"; -} -.icon-attachment:before { - content: "\e039"; -} -.icon-file-excel:before { - content: "\e03a"; -} -.icon-file-movie:before { - content: "\e03b"; -} -.icon-folder-add:before { - content: "\e03c"; -} -.icon-folder:before { - content: "\e03d"; -} -.icon-floppy:before { - content: "\e03e"; -} -.icon-eye:before { - content: "\e03f"; -} -.icon-facebook-alt:before { - content: "\e040"; -} -.icon-facebook:before { - content: "\e041"; -} -.icon-bolt:before { - content: "\e042"; -} -.icon-download:before { - content: "\e043"; -} -.icon-upload:before { - content: "\e044"; -} -.icon-popup:before { - content: "\e045"; -} -.icon-github:before { - content: "\e046"; -} -.icon-telephone:before { - content: "\e047"; -} -.icon-mobile:before { - content: "\e048"; -} -.icon-pencil:before { - content: "\e049"; -} -.icon-trash:before { - content: "\e04a"; -} -.icon-left-middle:before { - content: "\e04b"; -} -.icon-right-middle:before { - content: "\e04c"; -} -.icon-repeat:before { - content: "\e04d"; -} -.icon-key:before { - content: "\e04e"; -} -.icon-lock:before { - content: "\e04f"; -} -.icon-home:before { - content: "\e050"; -} -.icon-address-book:before { - content: "\e051"; -} -.icon-share:before { - content: "\e052"; -} -.icon-suitcase:before { - content: "\e053"; -} -.icon-new-sign:before { - content: "\e054"; -} -.icon-users:before { - content: "\e055"; -} -.icon-earth:before { - content: "\e056"; -} -.icon-mail:before { - content: "\e057"; -} -.icon-checkbox-checked:before { - content: "\e058"; -} -.icon-checkbox-unchecked:before { - content: "\e059"; -} -.icon-checkbox-partial:before { - content: "\e05a"; -} -.icon-radio-checked:before { - content: "\e05b"; -} -.icon-radio-unchecked:before { - content: "\e05c"; -} -.icon-google-drive:before { - content: "\e05d"; -} -.icon-spinner:before { - content: "\e05e"; -} -.icon-archive:before { - content: "\e05f"; -} -.icon-buy-sign:before { - content: "\e060"; -} -.icon-filter:before { - content: "\e061"; -} -.icon-sync:before { - content: "\e062"; -} -.icon-ellipsis-alt:before { - content: "\e063"; -} -.icon-cloud-up:before { - content: "\e064"; -} -.icon-cloud-down:before { - content: "\e065"; -} -.icon-import:before { - content: "\e066"; -} -.icon-export:before { - content: "\e067"; -} -.icon-copy:before { - content: "\e068"; -} -.icon-angry-smiley:before { - content: "\e069"; -} -.icon-happy-smiley:before { - content: "\e06a"; -} -.icon-help:before { - content: "\e06b"; -} -.icon-resize-in:before { - content: "\e06c"; -} -.icon-resize-out:before { - content: "\e06d"; -} -.icon-world:before { - content: "\e06f"; -} -.icon-braille:before { - content: "\e06e"; -} -.icon-play:before { - content: "\e070"; -} -.icon-pause:before { - content: "\e071"; -} -.icon-stop:before { - content: "\e072"; -} -.icon-check-mark-circle-two:before { - content: "\e073"; -} -.icon-laptop:before { - content: "\e075"; -} - -@-webkit-keyframes redirectingRotation { - to { - -webkit-transform: rotate(1turn); - transform: rotate(1turn); - } -} - -@keyframes redirectingRotation { - to { - -webkit-transform: rotate(1turn); - transform: rotate(1turn); - } -} - -html, body { - padding: 0; - margin: 0; - overflow: hidden; -} - -.social-icon-wrp { - position: absolute; - top: 0; - left: 0; - bottom: 0; - right: 0; -} - -.social-icon { - position: absolute; - top: 50%; - left: 50%; - font-size: 140px; - margin: -60px 0 0 -60px; - color: #999; -} - -.redirecting:after{ - content: ''; - position: absolute; - width: 240px; - height: 240px; - top: 50%; - left: 50%; - margin-top: -120px; - margin-left: -120px; - - border: 8px solid transparent; - border-color: transparent; - border-top-color: #999; - -webkit-animation: redirectingRotation 1s infinite ease-in-out; - animation: redirectingRotation 1s infinite ease-in-out; - - border-radius: 50%; - z-index: 1; -} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/social.min.css b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/social.min.css deleted file mode 100755 index 5bbb4f4e..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/css/social.min.css +++ /dev/null @@ -1 +0,0 @@ -@charset "UTF-8";@font-face{font-family:rainloop;src:url(fonts/rainloop.eot);src:url(fonts/rainloop.eot?#iefix) format("embedded-opentype"),url(fonts/rainloop.woff) format("woff"),url(fonts/rainloop.ttf) format("truetype"),url(fonts/rainloop.svg#rainloop) format("svg");font-weight:400;font-style:normal}[data-icon]:before{font-family:rainloop!important;content:attr(data-icon);font-style:normal!important;font-weight:400!important;font-variant:normal!important;text-transform:none!important;speak:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}[class*=" icon-"]:before,[class^=icon-]:before{font-family:rainloop!important;font-style:normal!important;font-weight:400!important;font-variant:normal!important;text-transform:none!important;speak:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-arrows-in:before{content:"\e000"}.icon-arrows-out:before{content:"\e001"}.icon-list:before{content:"\e002"}.icon-search:before{content:"\e003"}.icon-user:before{content:"\e004"}.icon-user-add:before{content:"\e005"}.icon-tags:before{content:"\e006"}.icon-paper-plane:before{content:"\e007"}.icon-reply:before{content:"\e008"}.icon-reply-all:before{content:"\e009"}.icon-forward:before{content:"\e00a"}.icon-info:before{content:"\e00b"}.icon-right-dir:before{content:"\e00c"}.icon-down-dir:before{content:"\e00d"}.icon-image:before{content:"\e00e"}.icon-print:before{content:"\e00f"}.icon-calendar:before{content:"\e010"}.icon-cog:before{content:"\e011"}.icon-wrench:before{content:"\e012"}.icon-rocket:before{content:"\e013"}.icon-fire:before{content:"\e014"}.icon-purchase:before{content:"\e015"}.icon-apple:before{content:"\e016"}.icon-dropbox:before{content:"\e017"}.icon-skype:before{content:"\e018"}.icon-creative-commons:before{content:"\e019"}.icon-ellipsis:before{content:"\e01a"}.icon-left:before{content:"\e01b"}.icon-right:before{content:"\e01c"}.icon-down:before{content:"\e01d"}.icon-right-mini:before{content:"\e01e"}.icon-down-mini:before{content:"\e01f"}.icon-up:before{content:"\e020"}.icon-star-empty:before{content:"\e021"}.icon-star:before{content:"\e022"}.icon-at:before{content:"\e023"}.icon-list-add:before{content:"\e024"}.icon-google:before{content:"\e025"}.icon-google-plus:before{content:"\e026"}.icon-twitter:before{content:"\e027"}.icon-youtube:before{content:"\e028"}.icon-warning:before{content:"\e029"}.icon-warning-alt:before{content:"\e02a"}.icon-power:before{content:"\e02b"}.icon-plus:before{content:"\e02c"}.icon-ok:before{content:"\e02d"}.icon-remove:before{content:"\e02e"}.icon-file:before{content:"\e02f"}.icon-file-code:before{content:"\e030"}.icon-file-chart-graph:before{content:"\e031"}.icon-file-zip:before{content:"\e032"}.icon-file-music:before{content:"\e033"}.icon-file-text:before{content:"\e034"}.icon-file-bookmark:before{content:"\e035"}.icon-file-image:before{content:"\e036"}.icon-file-analytics:before{content:"\e037"}.icon-file-certificate:before{content:"\e038"}.icon-attachment:before{content:"\e039"}.icon-file-excel:before{content:"\e03a"}.icon-file-movie:before{content:"\e03b"}.icon-folder-add:before{content:"\e03c"}.icon-folder:before{content:"\e03d"}.icon-floppy:before{content:"\e03e"}.icon-eye:before{content:"\e03f"}.icon-facebook-alt:before{content:"\e040"}.icon-facebook:before{content:"\e041"}.icon-bolt:before{content:"\e042"}.icon-download:before{content:"\e043"}.icon-upload:before{content:"\e044"}.icon-popup:before{content:"\e045"}.icon-github:before{content:"\e046"}.icon-telephone:before{content:"\e047"}.icon-mobile:before{content:"\e048"}.icon-pencil:before{content:"\e049"}.icon-trash:before{content:"\e04a"}.icon-left-middle:before{content:"\e04b"}.icon-right-middle:before{content:"\e04c"}.icon-repeat:before{content:"\e04d"}.icon-key:before{content:"\e04e"}.icon-lock:before{content:"\e04f"}.icon-home:before{content:"\e050"}.icon-address-book:before{content:"\e051"}.icon-share:before{content:"\e052"}.icon-suitcase:before{content:"\e053"}.icon-new-sign:before{content:"\e054"}.icon-users:before{content:"\e055"}.icon-earth:before{content:"\e056"}.icon-mail:before{content:"\e057"}.icon-checkbox-checked:before{content:"\e058"}.icon-checkbox-unchecked:before{content:"\e059"}.icon-checkbox-partial:before{content:"\e05a"}.icon-radio-checked:before{content:"\e05b"}.icon-radio-unchecked:before{content:"\e05c"}.icon-google-drive:before{content:"\e05d"}.icon-spinner:before{content:"\e05e"}.icon-archive:before{content:"\e05f"}.icon-buy-sign:before{content:"\e060"}.icon-filter:before{content:"\e061"}.icon-sync:before{content:"\e062"}.icon-ellipsis-alt:before{content:"\e063"}.icon-cloud-up:before{content:"\e064"}.icon-cloud-down:before{content:"\e065"}.icon-import:before{content:"\e066"}.icon-export:before{content:"\e067"}.icon-copy:before{content:"\e068"}.icon-angry-smiley:before{content:"\e069"}.icon-happy-smiley:before{content:"\e06a"}.icon-help:before{content:"\e06b"}.icon-resize-in:before{content:"\e06c"}.icon-resize-out:before{content:"\e06d"}.icon-world:before{content:"\e06f"}.icon-braille:before{content:"\e06e"}.icon-play:before{content:"\e070"}.icon-pause:before{content:"\e071"}.icon-stop:before{content:"\e072"}.icon-check-mark-circle-two:before{content:"\e073"}.icon-laptop:before{content:"\e075"}@-webkit-keyframes redirectingRotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes redirectingRotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}body,html{padding:0;margin:0;overflow:hidden}.social-icon-wrp{position:absolute;top:0;left:0;bottom:0;right:0}.social-icon{position:absolute;top:50%;left:50%;font-size:140px;margin:-60px 0 0 -60px;color:#999}.redirecting:after{content:'';position:absolute;width:240px;height:240px;top:50%;left:50%;margin-top:-120px;margin-left:-120px;border:8px solid transparent;border-color:transparent;border-top-color:#999;-webkit-animation:redirectingRotation 1s infinite ease-in-out;animation:redirectingRotation 1s infinite ease-in-out;border-radius:50%;z-index:1} diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/favicon-light.ico b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/favicon-light.ico deleted file mode 100755 index 7d168f35d7591dfae55a3ac88bc7aa5428f1245f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmd6iJqp4=5QSgR1EdntS$YNucoa*$fr6a}uoinOPhqc(m6erXnIhmH!urO|z`AT= zY{Xf1XXefOb`v1tievC>W7q^*06N^1s92rpFT)sfSjW_ zg5L`x^_Of)Wa%<>?x08BOd^{QIYuYHetf1TyeWhZl>_W=4=Aj^UC V02t4J$pIK;)GnOetw+4dJprTJ22cP1 diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/favicon-light.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/favicon-light.png deleted file mode 100755 index 4034c1cf421fd56ef4850ee5aa135814ff857f3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 866 zcmV-o1D*VdP)P-~6H|C@3f>C@5%Y z1v~}D$n*_pXT*zv14oP_pp_A$rOvbIqrg{N&DW+g;86tp6q+9jCLRNaju;0(EHFQG z#P}dIe=P7cj)dk9g%dCPuJr{mR)ABXuPYmXWWoOCwkPw-^#mjfZax*j(IP>xm>;+R ztOLm+K(LtK13FFs>f%O2u$foC%>Wpf0GbTJW!?rL20ohrng}7wygFwM_;U+D`-Xop z0W=AM#JqOy7I1wFK!eb>T#)2ljn&n>c1;(!$TLVSAtX2?;m@hJDEg)24 zzAg|dHD5IZWq#nzd{&NMCkWontDwUsKq$q$3OvmMu`&HaJ2uZ>E_&E;*+vh3{@ znCB|+%LFhbzwXn#_Ip2Nm+8Lt`v!1gGg$(J4)EJ7h{W@(2(!#<=k29!O#$b|u^Zr} zFaat8;UVzd_X{t{IR82D&#@UZ0d{j{fkhx}+?jdf@k`r{J_R=COoa=79qz=uVPaRk z8{PpsO)iF1QYEfSIjqtWxfcjo9UpZy?+t?Lq-ZzMycY;s?@z0V=JP@T9stkM3L-P5 zu?5{5?5MTKj{{Nazs?U1Fh6P^wEw!9=CJHY}i smgFrdUojWVZWI(06ciK`6tt}R4`FHD=q|ew!T&y~z-$f7&p?q^95s3}@oMf3cEC-( diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/favicon.png b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/favicon.png deleted file mode 100755 index ce1dd1a886c906ec36cee1dec72b9df605886f02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 832 zcmV-G1Hb%k7RCwC#n$brDK^(`2<+!Jah`6UC zB6^C5h=@4)4|jR5=a_ zzRF^}svNfv^ZdeBqWN>ez`6O3CP!Ob6K4KgljDGB{)*sTz z^!1_w(9GG-TyfDP!Xo{00A?<4KW=CfaL&!$~?mW93ud- z3_)ie1;GE|1Obpm2w~>A#vwlZ0OULT3;~cO2o&>Dvk;$t01|?#%xy-f#%wh&H3#uH z%$L{-A&Pnb^MGX;LLBpvWebE<%-aGXRr6^>@B+0UGRf&e7>ied9i0f84^6TZJ!A+9whO+(;!!F#YF;zg_o!^}%< zGkk06A@JD`#0GHz6bHf##J%YUURb+q4dR=rH)D8#QX6s=7zaZ2Kh67ZKWsPpMwF>h zmcl094*z1_Z=xoi4f_x)S#E};)g`u~9hP>B+z5nnM$H?8a7BP%`{qb22=eStDWm3x zg)jxNiZw*A)>t0*2B$?WvJ%!1$@}hbPqxO2d_LeA15oG_B85LARQOY3?wp_|o{0^U zHL<40a`3hPI3dTTW*ofXI!ef~!-ywEDQATr105Wd)|viX?ieA*mL>=98jTQg>=7rG z!(@x>@8onp!CAW{&f2af2c=}kUg0{JbIi%f$;rvd$*HLN6<`1!uF_d9==`$)0000< KMNUMnLSTX$7j)+U diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/admin.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/admin.js deleted file mode 100755 index 02b2febe..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/admin.js +++ /dev/null @@ -1,1105 +0,0 @@ -/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL v3 */ -!function(e){var t={};function n(i){if(t[i])return t[i].exports;var o=t[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:i})},n.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="rainloop/v/0.0.0/static/js/",n(n.s=191)}([ -/*!*****************************!*\ - !*** ./dev/Common/Enums.js ***! - \*****************************/ -/*! exports provided: FileType, StorageResultType, Focused, State, StateType, Capa, KeyState, FolderType, ServerFolderType, LoginSignMeTypeAsString, LoginSignMeType, ComposeType, UploadErrorCode, SetSystemFoldersNotification, ClientSideKeyName, EventKeyCode, MessageSetAction, MessageSelectAction, DesktopNotification, MessagePriority, EditorDefaultType, ServerSecure, SearchDateType, SaveSettingsStep, Layout, FilterConditionField, FilterConditionType, FiltersAction, FilterRulesType, SignedVerifyStatus, ContactPropertyType, Magics, Ports, Notification */ -/*! all exports used */function(e,t,n){"use strict";n.r(t),n.d(t,"FileType",function(){return i}),n.d(t,"StorageResultType",function(){return o}),n.d(t,"Focused",function(){return a}),n.d(t,"State",function(){return r}),n.d(t,"StateType",function(){return s}),n.d(t,"Capa",function(){return c}),n.d(t,"KeyState",function(){return l}),n.d(t,"FolderType",function(){return u}),n.d(t,"ServerFolderType",function(){return d}),n.d(t,"LoginSignMeTypeAsString",function(){return p}),n.d(t,"LoginSignMeType",function(){return f}),n.d(t,"ComposeType",function(){return m}),n.d(t,"UploadErrorCode",function(){return h}),n.d(t,"SetSystemFoldersNotification",function(){return g}),n.d(t,"ClientSideKeyName",function(){return b}),n.d(t,"EventKeyCode",function(){return v}),n.d(t,"MessageSetAction",function(){return S}),n.d(t,"MessageSelectAction",function(){return y}),n.d(t,"DesktopNotification",function(){return w}),n.d(t,"MessagePriority",function(){return A}),n.d(t,"EditorDefaultType",function(){return O}),n.d(t,"ServerSecure",function(){return T}),n.d(t,"SearchDateType",function(){return C}),n.d(t,"SaveSettingsStep",function(){return _}),n.d(t,"Layout",function(){return E}),n.d(t,"FilterConditionField",function(){return D}),n.d(t,"FilterConditionType",function(){return N}),n.d(t,"FiltersAction",function(){return j}),n.d(t,"FilterRulesType",function(){return R}),n.d(t,"SignedVerifyStatus",function(){return I}),n.d(t,"ContactPropertyType",function(){return x}),n.d(t,"Magics",function(){return P}),n.d(t,"Ports",function(){return k}),n.d(t,"Notification",function(){return L});var i={Unknown:"unknown",Text:"text",Html:"html",Code:"code",Eml:"eml",WordText:"word-text",Pdf:"pdf",Image:"image",Audio:"audio",Video:"video",Sheet:"sheet",Presentation:"presentation",Certificate:"certificate",CertificateBin:"certificate-bin",Archive:"archive"},o={Success:"success",Abort:"abort",Error:"error",Unload:"unload"},a={None:"none",MessageList:"message-list",MessageView:"message-view",FolderList:"folder-list"},r={Empty:10,Login:20,Auth:30},s={Webmail:0,Admin:1},c={TwoFactor:"TWO_FACTOR",TwoFactorForce:"TWO_FACTOR_FORCE",OpenPGP:"OPEN_PGP",Prefetch:"PREFETCH",Gravatar:"GRAVATAR",Folders:"FOLDERS",Composer:"COMPOSER",Contacts:"CONTACTS",Reload:"RELOAD",Search:"SEARCH",SearchAdv:"SEARCH_ADV",MessageActions:"MESSAGE_ACTIONS",MessageListActions:"MESSAGELIST_ACTIONS",AttachmentsActions:"ATTACHMENTS_ACTIONS",DangerousActions:"DANGEROUS_ACTIONS",Settings:"SETTINGS",Help:"HELP",Themes:"THEMES",UserBackground:"USER_BACKGROUND",Sieve:"SIEVE",Filters:"FILTERS",AttachmentThumbnails:"ATTACHMENT_THUMBNAILS",Templates:"TEMPLATES",AutoLogout:"AUTOLOGOUT",AdditionalAccounts:"ADDITIONAL_ACCOUNTS",Identities:"IDENTITIES"},l={All:"all",None:"none",ContactList:"contact-list",MessageList:"message-list",FolderList:"folder-list",MessageView:"message-view",Compose:"compose",Settings:"settings",Menu:"menu",PopupComposeOpenPGP:"compose-open-pgp",PopupMessageOpenPGP:"message-open-pgp",PopupViewOpenPGP:"view-open-pgp",PopupKeyboardShortcutsHelp:"popup-keyboard-shortcuts-help",PopupAsk:"popup-ask"},u={Inbox:10,SentItems:11,Draft:12,Trash:13,Spam:14,Archive:15,NotSpam:80,User:99},d={USER:0,INBOX:1,SENT:2,DRAFTS:3,JUNK:4,TRASH:5,IMPORTANT:10,FLAGGED:11,ALL:12},p={DefaultOff:"defaultoff",DefaultOn:"defaulton",Unused:"unused"},f={DefaultOff:0,DefaultOn:1,Unused:2},m={Empty:"empty",Reply:"reply",ReplyAll:"replyall",Forward:"forward",ForwardAsAttachment:"forward-as-attachment",Draft:"draft",EditAsNew:"editasnew"},h={Normal:0,FileIsTooBig:1,FilePartiallyUploaded:2,FileNoUploaded:3,MissingTempFolder:4,FileOnSaveingError:5,FileType:98,Unknown:99},g={None:0,Sent:1,Draft:2,Spam:3,Trash:4,Archive:5},b={FoldersLashHash:0,MessagesInboxLastHash:1,MailBoxListSize:2,ExpandedFolders:3,FolderListSize:4,MessageListSize:5,LastReplyAction:6,LastSignMe:7,ComposeLastIdentityID:8,MessageHeaderFullInfo:9,MessageAttachmnetControls:10},v={Backspace:8,Tab:9,Enter:13,Esc:27,PageUp:33,PageDown:34,Left:37,Right:39,Up:38,Down:40,End:35,Home:36,Space:32,Insert:45,Delete:46,A:65,S:83},S={SetSeen:0,UnsetSeen:1,SetFlag:2,UnsetFlag:3},y={All:0,None:1,Invert:2,Unseen:3,Seen:4,Flagged:5,Unflagged:6},w={Allowed:0,NotAllowed:1,Denied:2,NotSupported:9},A={Low:5,Normal:3,High:1},O={Html:"Html",Plain:"Plain",HtmlForced:"HtmlForced",PlainForced:"PlainForced"},T={None:0,SSL:1,TLS:2},C={All:-1,Days3:3,Days7:7,Month:30},_={Animate:-2,Idle:-1,TrueResult:1,FalseResult:0},E={NoPreview:0,SidePreview:1,BottomPreview:2},D={From:"From",Recipient:"Recipient",Subject:"Subject",Header:"Header",Size:"Size"},N={Contains:"Contains",NotContains:"NotContains",EqualTo:"EqualTo",NotEqualTo:"NotEqualTo",Regex:"Regex",Over:"Over",Under:"Under"},j={None:"None",MoveTo:"MoveTo",Discard:"Discard",Vacation:"Vacation",Reject:"Reject",Forward:"Forward"},R={All:"All",Any:"Any"},I={UnknownPublicKeys:-4,UnknownPrivateKey:-3,Unverified:-2,Error:-1,None:0,Success:1},x={Unknown:0,FullName:10,FirstName:15,LastName:16,MiddleName:16,Nick:18,NamePrefix:20,NameSuffix:21,Email:30,Phone:31,Web:32,Birthday:40,Facebook:90,Skype:91,GitHub:92,Note:110,Custom:250},P={EventWhichMouseMiddle:3,ifvisibleIdle10s:10,BitLength2048:2048,BitLength1024:1024,Size350px:350,Size50px:50,Size20px:20,Size1px:1,Time30mInMin:30,Time60m:36e5,Time30m:18e5,Time20m:12e5,Time15m:9e5,Time10m:6e5,Time5m:3e5,Time3m:18e4,Time2m:12e4,Time1m:6e4,Time30s:3e4,Time10s:1e4,Time7s:7e3,Time5s:5e3,Time3s:3e3,Time1s:1e3,Time500ms:500,Time350ms:350,Time250ms:250,Time200ms:200,Time100ms:100,Time50ms:50,Time20ms:20,Time10ms:10,Time1ms:1},k={Imap:143,ImapSsl:993,Smtp:25,SmtpSsl:465,SmtpStartTls:587},L={InvalidToken:101,AuthError:102,AccessError:103,ConnectionError:104,CaptchaError:105,SocialFacebookLoginAccessDisable:106,SocialTwitterLoginAccessDisable:107,SocialGoogleLoginAccessDisable:108,DomainNotAllowed:109,AccountNotAllowed:110,AccountTwoFactorAuthRequired:120,AccountTwoFactorAuthError:121,CouldNotSaveNewPassword:130,CurrentPasswordIncorrect:131,NewPasswordShort:132,NewPasswordWeak:133,NewPasswordForbidden:134,ContactsSyncError:140,CantGetMessageList:201,CantGetMessage:202,CantDeleteMessage:203,CantMoveMessage:204,CantCopyMessage:205,CantSaveMessage:301,CantSendMessage:302,InvalidRecipients:303,CantSaveFilters:351,CantGetFilters:352,FiltersAreNotCorrect:355,CantCreateFolder:400,CantRenameFolder:401,CantDeleteFolder:402,CantSubscribeFolder:403,CantUnsubscribeFolder:404,CantDeleteNonEmptyFolder:405,CantSaveSettings:501,CantSavePluginSettings:502,DomainAlreadyExists:601,CantInstallPackage:701,CantDeletePackage:702,InvalidPluginPackage:703,UnsupportedPluginPackage:704,LicensingServerIsUnavailable:710,LicensingExpired:711,LicensingBanned:712,DemoSendMessageError:750,DemoAccountError:751,AccountAlreadyExists:801,AccountDoesNotExist:802,MailServerError:901,ClientViewError:902,InvalidInputArgument:903,AjaxFalse:950,AjaxAbort:951,AjaxParse:952,AjaxTimeout:953,UnknownNotification:999,UnknownError:999}}, -/*!****************************************!*\ - !*** ./dev/External/ko.js + 1 modules ***! - \****************************************/ -/*! exports provided: default */ -/*! exports used: default */ -/*! ModuleConcatenation bailout: Cannot concat with ./dev/Common/Enums.js because of ./dev/app.js */ -/*! ModuleConcatenation bailout: Cannot concat with ./node_modules/pikaday/pikaday.js (<- Module is not an ECMAScript module) */ -/*! ModuleConcatenation bailout: Cannot concat with external "window" (<- Module is not an ECMAScript module) */ -/*! ModuleConcatenation bailout: Cannot concat with external "window._" (<- Module is not an ECMAScript module) */ -/*! ModuleConcatenation bailout: Cannot concat with external "window.jQuery" (<- Module is not an ECMAScript module) */function(e,t,n){"use strict";var i=n(3),o=n.n(i),a=n(4),r=n.n(a),s=n(7),c=n.n(s),l=o.a.Opentip||{};l.styles=l.styles||{},l.styles.rainloop={extends:"standard",fixed:!0,target:!0,delay:.2,hideDelay:0,hideEffect:"fade",hideEffectDuration:.2,showEffect:"fade",showEffectDuration:.2,showOn:"mouseover click",removeElementsOnHide:!0,background:"#fff",shadow:!1,borderColor:"#999",borderRadius:2,borderWidth:1},l.styles.rainloopTip={extends:"rainloop",delay:.4,group:"rainloopTips"},l.styles.rainloopErrorTip={extends:"rainloop",className:"rainloopErrorTip"};var u=n(97),d=n.n(u),p=n(0),f=o.a.ko,m=c()(o.a);f.bindingHandlers.updateWidth={init:function(e,t){var n=c()(e),i=t(),a=function(){i(n.width()),o.a.setTimeout(function(){i(n.width())},p.Magics.Time500ms)};m.on("resize",a),a(),f.utils.domNodeDisposal.addDisposeCallback(e,function(){m.off("resize",a)})}},f.bindingHandlers.editor={init:function(e,t){var i=null,o=t(),a=n(/*! Common/HtmlEditor */95).default,r=function(){o&&o.__editor&&o.__editor.setHtmlOrPlain(o())},s=function(){o&&o.__editor&&o(o.__editor.getDataWithHtmlMark())};f.isObservable(o)&&a&&(i=new a(e,s,function(){o.__editor=i,r()},s),o.__fetchEditorValue=s,o.subscribe(r))}},f.bindingHandlers.json={init:function(e,t){c()(e).text(o.a.JSON.stringify(f.unwrap(t())))},update:function(e,t){c()(e).text(o.a.JSON.stringify(f.unwrap(t())))}},f.bindingHandlers.scrollerShadows={init:function(e){var t=c()(e),n=t.find("[data-scroller-shadows-content]")[0]||null,i=r.a.throttle(function(){t.toggleClass("scroller-shadow-top",8=n.left&&e.pageX<=n.left+t.width()){if(e.pageY>=i-100&&e.pageY<=i){var a=function(){t.scrollTop(t.scrollTop()+3),r.windowResize()};t.data("timerScroll",o.a.setInterval(a,10)),a()}if(e.pageY>=n.top&&e.pageY<=n.top+100){var s=function(){t.scrollTop(t.scrollTop()-3),r.windowResize()};t.data("timerScroll",o.a.setInterval(s,10)),s()}}})},u.stop=function(){c()(l).each(function(){var e=c()(this);o.a.clearInterval(e.data("timerScroll")),e.data("timerScroll",!1)})}),u.helper=function(e){return t()(e&&e.target?f.dataFor(e.target):null)},c()(e).draggable(u).on("mousedown.koDraggable",function(){r.removeInFocus()}),f.utils.domNodeDisposal.addDisposeCallback(e,function(){c()(e).off("mousedown.koDraggable").draggable("destroy")})}}},f.bindingHandlers.droppable={init:function(e,t,i){if(!n(/*! Common/Globals */6).bMobileDevice){var o=t(),a=i(),r=a&&a.droppableOver?a.droppableOver:null,s=a&&a.droppableOut?a.droppableOut:null,l={tolerance:"pointer",hoverClass:"droppableHover",drop:null,over:null,out:null};o&&(l.drop=function(e,t){o(e,t)},r&&(l.over=function(e,t){r(e,t)}),s&&(l.out=function(e,t){s(e,t)}),c()(e).droppable(l),f.utils.domNodeDisposal.addDisposeCallback(e,function(){c()(e).droppable("destroy")}))}}},f.bindingHandlers.nano={init:function(e){var t=n(/*! Common/Globals */6),i=n(/*! Storage/Settings */5);t.bDisableNanoScroll||i.appSettingsGet("useNativeScrollbars")||c()(e).addClass("nano").nanoScroller({iOSNativeScrolling:!1,preventPageScrolling:!0})}},f.bindingHandlers.saveTrigger={init:function(e){var t=c()(e);t.data("save-trigger-type",t.is("input[type=text],input[type=email],input[type=password],select,textarea")?"input":"custom"),"custom"===t.data("save-trigger-type")?t.append('  ').addClass("settings-saved-trigger"):t.addClass("settings-saved-trigger-input")},update:function(e,t){var n=f.unwrap(t()),i=c()(e);if("custom"===i.data("save-trigger-type"))switch(n.toString()){case"1":i.find(".animated,.error").hide().removeClass("visible").end().find(".success").show().addClass("visible");break;case"0":i.find(".animated,.success").hide().removeClass("visible").end().find(".error").show().addClass("visible");break;case"-2":i.find(".error,.success").hide().removeClass("visible").end().find(".animated").show().addClass("visible");break;default:i.find(".animated").hide().end().find(".error,.success").removeClass("visible")}else switch(n.toString()){case"1":i.addClass("success").removeClass("error");break;case"0":i.addClass("error").removeClass("success");break;case"-2":break;default:i.removeClass("error success")}}},f.bindingHandlers.emailsTags={init:function(e,t,i){var o=n(/*! Common/Utils */2),a=n(/*! Model/Email */44).default,s=c()(e),l=t(),u=i().autoCompleteSource||null,d=[",",";","\n"];s.inputosaurus({parseOnBlur:!0,allowDragAndDrop:!0,focusCallback:function(e){l&&l.focused&&l.focused(!!e)},inputDelimiters:d,autoCompleteSource:u,splitHook:function(e){var t=o.trim(e);return t&&-1=o&&(o=t),o===e()&&""+o!=""+n&&e(o+1),e(o)}});return o(e()),o},f.extenders.limitedList=function(e,t){var i=n(/*! Common/Utils */2),o=f.computed({read:e,write:function(n){var o=f.unwrap(e),a=f.unwrap(t);i.isNonEmptyArray(a)?-11&&void 0!==arguments[1])||arguments[1];return!!N(e)&&(t?/^[0-9]*$/.test(e.toString()):/^[1-9]+[0-9]*$/.test(e.toString()))}function R(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=N(e)&&""!==e?o.a.parseInt(e,10):t;return o.a.isNaN(n)?t:n}function I(e){return N(e)?""+e:""}function x(e){return!!e}function P(e){return e?"1":"0"}function k(e){return v(e)&&00&&void 0!==arguments[0]?arguments[0]:32,t="0123456789abcdefghijklmnopqrstuvwxyz",n=t.length;e=R(e);for(var i="";i.length1&&void 0!==arguments[1]?arguments[1]:100,n="",i="",o=e,a=0,r=0;o.length>t;)a=(i=o.substring(0,t)).lastIndexOf(" "),-1!==(r=i.lastIndexOf("\n"))&&(a=r),-1===a&&(a=t),n+=i.substring(0,a)+"\n",o=o.substring(a+1);return n+o}var q,z=(q={},function(e,t,n){q[e]=w(q[e])?0:q[e],o.a.clearTimeout(q[e]),q[e]=o.a.setTimeout(t,n)}),K=function(){var e={};return function(t,n,i){e[t]||(e[t]=o.a.setTimeout(function(){n(),e[t]=0},i))}}();function W(){try{if(o.a.document.activeElement)return w(o.a.document.activeElement.__inFocusCache)&&(o.a.document.activeElement.__inFocusCache=r()(o.a.document.activeElement).is("input,textarea,iframe,.cke_editable")),!!o.a.document.activeElement.__inFocusCache}catch(e){}return!1}function Y(e){if(o.a.document&&o.a.document.activeElement&&o.a.document.activeElement.blur)try{var t=r()(o.a.document.activeElement);t&&t.is("input,textarea")?o.a.document.activeElement.blur():e&&o.a.document.activeElement.blur()}catch(e){}}function $(){try{if(o.a&&o.a.getSelection){var e=o.a.getSelection();e&&e.removeAllRanges&&e.removeAllRanges()}else o.a.document&&o.a.document.selection&&o.a.document.selection.empty&&o.a.document.selection.empty()}catch(e){}}function J(e,t){e=g(e.toUpperCase()),t=g(t.replace(/[\s]+/g," "));var n=!1,i="RE"===e,o="FWD"===e,a=[],r=!o;return""!==t&&c.a.each(t.split(":"),function(e){var t=g(e);n||!/^(RE|FWD)$/i.test(t)&&!/^(RE|FWD)[\[\(][\d]+[\]\)]$/i.test(t)?(a.push(e),n=!0):(i||(i=!!/^RE/i.test(t)),o||(o=!!/^FWD/i.test(t)))}),r?i=!1:o=!1,g((r?"Re: ":"Fwd: ")+(i?"Re: ":"")+(o?"Fwd: ":"")+g(a.join(":")))}function X(e,t){return o.a.Math.round(e*o.a.Math.pow(10,t))/o.a.Math.pow(10,t)}function Q(e){switch(e=R(e),!0){case 1073741824<=e:return X(e/1073741824,1)+"GB";case 1048576<=e:return X(e/1048576,1)+"MB";case 1024<=e:return X(e/1024,0)+"KB"}return e+"B"}function Z(e){o.a.console&&o.a.console.log&&o.a.console.log(e)}function ee(e,t,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;e&&e[t]&&(i=R(i),n=v(n)?n:[],0>=i?e[t].apply(e,n):c.a.delay(function(){e[t].apply(e,n)},i))}function te(e){if((e=e||o.a.event)&&e.ctrlKey&&!e.shiftKey&&!e.altKey){var t=e.keyCode||e.which;if(t===f.EventKeyCode.S)return void e.preventDefault();if(t===f.EventKeyCode.A){var n=e.target||e.srcElement;if(n&&("true"==""+n.contentEditable||n.tagName&&n.tagName.match(/INPUT|TEXTAREA/i)))return;o.a.getSelection?o.a.getSelection().removeAllRanges():o.a.document.selection&&o.a.document.selection.clear&&o.a.document.selection.clear(),e.preventDefault()}}}function ne(e,t){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=null;return(i=t?function(){for(var n=arguments.length,o=Array(n),a=0;a1&&void 0!==arguments[1]&&arguments[1];return n(/*! Common/Translator */10).i18n("LANGS_NAMES"+(!0===t?"_EN":"")+"/LANG_"+e.toUpperCase().replace(/[^a-zA-Z0-9]+/g,"_"),null,e)}function ce(){return r()('
 
').appendTo("#rl-hidden")}function le(e,t){t&&!w(t.disabled)&&e&&r()(e).toggleClass("disabled",t.disabled).prop("disabled",t.disabled)}function ue(e){e.find("blockquote.rl-bq-switcher").removeClass("rl-bq-switcher hidden-bq"),e.find(".rlBlockquoteSwitcher").off(".rlBlockquoteSwitcher").remove(),e.find("[data-html-editor-font-wrapper]").removeAttr("data-html-editor-font-wrapper")}function de(e,t,i,a){var r=e.title,s=e.subject,c=e.date,l=e.fromCreds,u=e.toCreds,d=e.toLabel,p=e.ccClass,f=e.ccCreds,m=e.ccLabel,h=o.a.open(""),g=h.document,b=t.clone(),v=i?"html":"plain";ue(b);var S=b?b.html():"";g.write(n(/*! Html/PreviewMessage.html */170).replace("{{title}}",B(r)).replace("{{subject}}",B(s)).replace("{{date}}",B(c)).replace("{{fromCreds}}",B(l)).replace("{{toCreds}}",B(u)).replace("{{toLabel}}",B(d)).replace("{{ccClass}}",B(p)).replace("{{ccCreds}}",B(f)).replace("{{ccLabel}}",B(m)).replace("{{bodyClass}}",v).replace("{{html}}",S)),g.close(),a&&o.a.setTimeout(function(){return h.print()},100)}function pe(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1e3;return i=R(i),function(o,a,r,s,l){t.call(n,a&&a.Result?f.SaveSettingsStep.TrueResult:f.SaveSettingsStep.FalseResult),e&&e.call(n,o,a,r,s,l),c.a.delay(function(){t.call(n,f.SaveSettingsStep.Idle)},i)}}function fe(e,t){return pe(null,e,t,1e3)}function me(e,t,n,i){return function(o){if(e){switch(n){case"bool":case"boolean":o=o?"1":"0";break;case"int":case"integer":case"number":o=R(o);break;case"trim":o=g(o);break;default:o=I(o)}var a={};a[t]=o,e.saveAdminConfig?e.saveAdminConfig(i||null,a):e.saveSettings&&e.saveSettings(i||null,a)}}}function he(e){return d.a?d.a.link(e,{newWindow:!0,stripPrefix:!1,urls:!0,email:!0,mention:!1,phone:!1,hashtag:!1,replaceFn:function(e){return!(e&&"url"===e.getType()&&e.matchedText&&0!==e.matchedText.indexOf("http"))}}):e}function ge(e){var t,n=0,i=0,o=0,a=0,r=0,s="";for(s=e.replace(/]*><\/p>/gi,"").replace(/]*>([\s\S\r\n\t]*)<\/pre>/gim,function(){for(var e=arguments.length,t=Array(e),n=0;n").replace(/[\r]/gm,""):""}).replace(/[\s]+/gm," ").replace(/((?:href|data)\s?=\s?)("[^"]+?"|'[^']+?')/gim,function(){for(var e=arguments.length,t=Array(e),n=0;n]*>/gim,"\n").replace(/<\/h[\d]>/gi,"\n").replace(/<\/p>/gi,"\n\n").replace(/]*>/gim,"\n").replace(/<\/ul>/gi,"\n").replace(/]*>/gim," * ").replace(/<\/li>/gi,"\n").replace(/<\/td>/gi,"\n").replace(/<\/tr>/gi,"\n").replace(/]*>/gim,"\n_______________________________\n\n").replace(/]*>([\s\S\r\n]*)<\/div>/gim,function e(){for(var t=arguments.length,n=Array(t),i=0;i]*>([\s\S\r\n]*)<\/div>/gim,e),o="\n"+g(o)+"\n"),o}return""}).replace(/]*>/gim,"\n__bq__start__\n").replace(/<\/blockquote>/gim,"\n__bq__end__\n").replace(/]*>([\s\S\r\n]*?)<\/a>/gim,function(){for(var e=arguments.length,t=Array(e),n=0;n/gi,"\n").replace(/ /gi," ").replace(/"/gi,'"').replace(/<[^>]*>/gm,""),s=V(s=(s=p.$div.html(s).text()).replace(/\n[ \t]+/gm,"\n").replace(/[\n]{3,}/gm,"\n\n").replace(/>/gi,">").replace(/</gi,"<").replace(/&/gi,"&")),n=0,i=800;0 "+g(t).replace(/\n/gm,"\n> ")).replace(/(^|\n)([> ]+)/gm,function(){for(var e=arguments.length,t=Array(e),n=0;n1&&void 0!==arguments[1]&&arguments[1],n=!1,i=!0,o=!0,a=[],r="",s=0,c=(e=(e=e.toString().replace(/\r/g,"")).replace(/^>[> ]>+/gm,function(e){var t=e[0];return t?t.replace(/[ ]+/g,""):t})).split("\n");do{for(i=!1,a=[],s=0;s"===(r=c[s]).substr(0,1))&&!n?(i=!0,n=!0,a.push("~~~blockquote~~~"),a.push(r.substr(1))):!o&&n?""!==r?(n=!1,a.push("~~~/blockquote~~~"),a.push(r)):a.push(r):o&&n?a.push(r.substr(1)):a.push(r);n&&(n=!1,a.push("~~~/blockquote~~~")),c=a}while(i);return e=(e=c.join("\n")).replace(/&/g,"&").replace(/>/g,">").replace(/").replace(/[\s]*~~~\/blockquote~~~/g,"
").replace(/\n/g,"
"),t?he(e):e}function ve(e,t,n,i,a,r,s,c,l,u){var d=null,p=!1,m=0,h=0,g=[];for(u=!w(u)&&!!u,l=N(l)?l:00&&void 0!==arguments[0]&&arguments[0]?c.a.delay(e,100):e()}var Ae={};function Oe(e){Ae[e]||(Ae[e]=r()('script[type="application/json"][data-configuration="'+e+'"]'));try{return JSON.parse(Ae[e].text())}catch(e){}return{}}function Te(e,t){var n=t||e;n&&"function"==typeof n.dispose&&n.dispose()}function Ce(e){e&&(v(e.disposables)&&c.a.each(e.disposables,Te),l.a.utils.objectForEach(e,Te))}function _e(e){e&&(v(e)?c.a.each(e,function(e){_e(e)}):e&&e.onDestroy&&e.onDestroy())}function Ee(e,t){return!(!e||!e[0])&&(e[0].styleSheet&&!w(e[0].styleSheet.cssText)?e[0].styleSheet.cssText=t:e.text(t),!0)}var De=0,Ne=null;function je(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:C,n=r()("#app-theme-link"),i=function(){De=o.a.setTimeout(function(){return t(f.SaveSettingsStep.Idle)},1e3),Ne=null},a=r()("#app-theme-style"),s=n.attr("href");s||(s=a.attr("data-href")),s&&("Json/"!==(s=(s=(s=s.toString().replace(/\/-\/[^\/]+\/\-\//,"/-/"+e+"/-/")).replace(/\/Css\/[^\/]+\/User\//,"/Css/0/User/")).replace(/\/Hash\/[^\/]+\//,"/Hash/-/")).substring(s.length-5,s.length)&&(s+="Json/"),o.a.clearTimeout(De),t(f.SaveSettingsStep.Animate),Ne&&Ne.abort&&Ne.abort(),Ne=r.a.ajax({url:s,dataType:"json"}).then(function(e){e&&v(e)&&2===e.length&&(!n||!n[0]||a&&a[0]||(a=r()(''),n.after(a),n.remove()),a&&a[0]&&Ee(a,e[1])&&a.attr("data-href",s).attr("data-theme",e[0]),t(f.SaveSettingsStep.TrueResult))}).then(i,i))}function Re(e,t){return function(){var n=e(),i=t(),o=[],a=function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",a={current:e===n,name:""===i?e.toString():i.toString(),custom:""!==i,title:""===i?"":e.toString(),value:e.toString()};t?o.push(a):o.unshift(a)},r=0,s=0,c=2;if(1=n||i-2<=n)&&(c+=2),a(n),r=n,s=n);0=s)a(s,!0),c-=1;else if(0>=r)break;3===r?a(2,!1):3s&&a(Math.round((i+s)/2),!0,"..."),1s&&a(i,!0)}return o}}function Ie(e){var t=(e=g(e).toLowerCase()).split(".").pop();return t===e?"":t}function xe(e){var t,n="application/octet-stream";return"winmail.dat"===(e=g(e).toLowerCase())?"application/ms-tnef":((t=Ie(e))&&0this.height?[this.width-this.height,0]:[0,this.height-this.width],a.fillStyle="#fff",a.fillRect(0,0,t,t),a.drawImage(this,e[0]/2,e[1]/2,this.width-e[0],this.height-e[1],0,0,t,t),n(i.toDataURL("image/jpeg"))},i.src=e}function Me(e,t){if(e&&"mailto:"===e.toString().substr(0,7).toLowerCase()){if(!t)return!0;var i,o=[],a=null,r=null,s=(e=e.toString().substr(7)).replace(/\?.+$/,""),l=e.replace(/^[^\?]*\?/,""),u=n(/*! Model/Email */44).default;return i=H(l),w(i.to)?o=u.parseEmailLine(s):(o=u.parseEmailLine(M(s+","+i.to)),o=c.a.values(o.reduce(function(e,t){return t&&(e[t.email]&&e[t.email].name||(e[t.email]=t)),e},{}))),w(i.cc)||(a=u.parseEmailLine(M(i.cc))),w(i.bcc)||(r=u.parseEmailLine(M(i.bcc))),n(/*! Knoin/Knoin */9).showScreenPopup(t,[f.ComposeType.Empty,null,o,a,r,w(i.subject)?null:I(M(i.subject)),w(i.body)?null:be(I(M(i.body)))]),!0}return!1}function Fe(e){r()(function(){return e()})}var Ue=c.a.debounce(function(e){w(e)||A(e)?p.$win.resize():o.a.setTimeout(function(){p.$win.resize()},e)},50);function He(){Ue()}var Ge=o.a.String.substr;"b"!=="ab".substr(-1)&&(Ge=function(e,t,n){return t=0>t?e.length+t:t,e.substr(t,n)},o.a.String.substr=Ge)}, -/*!*************************!*\ - !*** external "window" ***! - \*************************/ -/*! no static exports found */ -/*! exports used: default */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports=window}, -/*!***************************!*\ - !*** external "window._" ***! - \***************************/ -/*! no static exports found */ -/*! exports used: default */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports=window._}, -/*!*********************************!*\ - !*** ./dev/Storage/Settings.js ***! - \*********************************/ -/*! exports provided: settingsGet, settingsSet, appSettingsGet, capa */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./dev/External/ko.js (referenced with cjs require) */function(e,t,n){"use strict";n.r(t),n.d(t,"settingsGet",function(){return c}),n.d(t,"settingsSet",function(){return l}),n.d(t,"appSettingsGet",function(){return u}),n.d(t,"capa",function(){return d});var i=n(/*! window */3),o=n.n(i),a=n(/*! Common/Utils */2),r=o.a.__rlah_data()||null,s=(r=Object(a.isNormal)(r)?r:{}).System||null;function c(e){return Object(a.isUnd)(r[e])?null:r[e]}function l(e,t){r[e]=t}function u(e){return Object(a.isUnd)(s[e])?null:s[e]}function d(e){var t=c("Capa");return Object(a.isArray)(t)&&Object(a.isNormal)(e)&&-1"),v=c()("
");v.attr("area","hidden").css({position:"absolute",left:-5e3}).appendTo(g);var S=(new o.a.Date).getTime(),y=!0,w=d.a.observable(!1).extend({rateLimit:0}),A=d.a.observable(!0),O="navigator"in o.a&&"userAgent"in o.a.navigator&&o.a.navigator.userAgent.toLowerCase()||"",T=-11&&void 0!==arguments[1])||arguments[1];return Object(h.createCommandLegacy)(null,e,t)}function A(e,t,n,i){var o=arguments.length>4&&void 0!==arguments[4]&&arguments[4];e.__rlSettingsData={Label:n,Template:t,Route:i,IsDefault:!!o},m.VIEW_MODELS.settings.push(e)}function O(e){m.VIEW_MODELS["settings-removed"].push(e)}function T(e){m.VIEW_MODELS["settings-disabled"].push(e)}function C(){l.a.changed.active=!1}function _(){l.a.changed.active=!0}function E(e){return""===e||Object(h.isUnd)(v[e])?null:v[e]}function D(e){var t=null;return e&&(t=e,e.default&&(t=e.default)),t}function N(e){var t=D(e);t&&t.__vm&&t.__dom&&t.__vm.modalVisibility(!1)}function j(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;o.a.each(t.__names,function(i){Object(f.f)(e,[i,t.__vm,n])})}function R(e,t){if(e&&!e.__builded){var n=null,i=new e(t),a=e.__type||"",c=a?r()("#rl-content #rl-"+a.toLowerCase()):null;e.__builded=!0,e.__vm=i,i.onShowTrigger=s.a.observable(!1),i.onHideTrigger=s.a.observable(!1),i.viewModelName=e.__name,i.viewModelNames=e.__names,i.viewModelTemplateID=e.__templateID,i.viewModelPosition=e.__type,c&&1===c.length?((n=r()("
").addClass("rl-view-model").addClass("RL-"+i.viewModelTemplateID).hide()).appendTo(c),i.viewModelDom=n,e.__dom=n,S.Popup===a&&(i.cancelCommand=i.closeCommand=w(function(){N(e)}),i.modalVisibility.subscribe(function(t){t?(i.viewModelDom.show(),i.storeAndSetKeyScope(),m.popupVisibilityNames.push(i.viewModelName),i.viewModelDom.css("z-index",3e3+Object(m.popupVisibilityNames)().length+10),i.onShowTrigger&&i.onShowTrigger(!i.onShowTrigger()),Object(h.delegateRun)(i,"onShowWithDelay",[],500)):(Object(h.delegateRun)(i,"onHide"),Object(h.delegateRun)(i,"onHideWithDelay",[],500),i.onHideTrigger&&i.onHideTrigger(!i.onHideTrigger()),i.restoreKeyScope(),j("view-model-on-hide",e),m.popupVisibilityNames.remove(i.viewModelName),i.viewModelDom.css("z-index",2e3),o.a.delay(function(){return i.viewModelDom.hide()},300))})),j("view-model-pre-build",e,n),s.a.applyBindingAccessorsToNode(n[0],{translatorInit:!0,template:function(){return{name:i.viewModelTemplateID}}},i),Object(h.delegateRun)(i,"onBuild",[n]),i&&S.Popup===a&&i.registerPopupKeyDown(),j("view-model-post-build",e,n)):Object(h.log)("Cannot find view model position: "+a)}return e?e.__vm:null}function I(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=D(e);n&&(R(n),n.__vm&&n.__dom&&(Object(h.delegateRun)(n.__vm,"onBeforeShow",t||[]),n.__vm.modalVisibility(!0),Object(h.delegateRun)(n.__vm,"onShow",t||[]),j("view-model-on-show",n,t||[])))}function x(e){var t=D(e);t&&(R(t),t.__vm&&t.__dom&&Object(h.delegateRun)(t.__vm,"onWarmUp"))}function P(e){var t=D(e);return!(!t||!t.__vm)&&t.__vm.modalVisibility()}function k(e,t){var n=null,i=!1,a=null;""===Object(h.pString)(e)&&(e=b),""!==e&&((n=E(e))||(n=E(b))&&(t=e+"/"+t,e=b),n&&n.__started&&(i=g&&n===g,n.__builded||(n.__builded=!0,Object(h.isNonEmptyArray)(n.viewModels())&&o.a.each(n.viewModels(),function(e){R(e,n)}),Object(h.delegateRun)(n,"onBuild")),o.a.defer(function(){g&&!i&&(Object(h.delegateRun)(g,"onHide"),Object(h.delegateRun)(g,"onHideWithDelay",[],500),g.onHideTrigger&&g.onHideTrigger(!g.onHideTrigger()),Object(h.isNonEmptyArray)(g.viewModels())&&o.a.each(g.viewModels(),function(e){e.__vm&&e.__dom&&S.Popup!==e.__vm.viewModelPosition&&(e.__dom.hide(),e.__vm.viewModelVisibility(!1),Object(h.delegateRun)(e.__vm,"onHide"),Object(h.delegateRun)(e.__vm,"onHideWithDelay",[],500),e.__vm.onHideTrigger&&e.__vm.onHideTrigger(!e.__vm.onHideTrigger()))})),(g=n)&&!i&&(Object(h.delegateRun)(g,"onShow"),g.onShowTrigger&&g.onShowTrigger(!g.onShowTrigger()),Object(f.f)("screen-on-show",[g.screenName(),g]),Object(h.isNonEmptyArray)(g.viewModels())&&o.a.each(g.viewModels(),function(e){e.__vm&&e.__dom&&S.Popup!==e.__vm.viewModelPosition&&(Object(h.delegateRun)(e.__vm,"onBeforeShow"),e.__dom.show(),e.__vm.viewModelVisibility(!0),Object(h.delegateRun)(e.__vm,"onShow"),e.__vm.onShowTrigger&&e.__vm.onShowTrigger(!e.__vm.onShowTrigger()),Object(h.delegateRun)(e.__vm,"onShowWithDelay",[],200),j("view-model-on-show",e))})),(a=n&&n.__cross?n.__cross():null)&&a.parse(t)})))}function L(e){o.a.each(e,function(e){if(e){var t=new e,n=t?t.screenName():"";t&&""!==n&&(""===b&&(b=n),v[n]=t)}}),o.a.each(v,function(e){e&&!e.__started&&e.__start&&(e.__started=!0,e.__start(),Object(f.f)("screen-pre-start",[e.screenName(),e]),Object(h.delegateRun)(e,"onStart"),Object(f.f)("screen-post-start",[e.screenName(),e]))});var t=d.a.create();t.addRoute(/^([a-zA-Z0-9\-]*)\/?(.*)$/,k),l.a.initialized.add(t.parse,t),l.a.changed.add(t.parse,t),l.a.init(),o.a.delay(function(){return m.$html.removeClass("rl-started-trigger").addClass("rl-started")},100),o.a.delay(function(){return m.$html.addClass("rl-started-delay")},200)}function M(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];e="/"===(e="#"===e.substr(0,1)?e.substr(1):e).substr(0,1)?e.substr(1):e;var i=n?"replaceHash":"setHash";t?(l.a.changed.active=!1,l.a[i](e),l.a.changed.active=!0):(l.a.changed.active=!0,l.a[i](e),l.a.setHash(e))}function F(e){var t=e.name,n=e.type,i=e.templateID;return function(e){e&&(t&&(Object(h.isArray)(t)?e.__names=t:e.__names=[t],e.__name=e.__names[0]),n&&(e.__type=n),i&&(e.__templateID=i))}}function U(e){var t=e.name,n=e.templateID;return F({name:t,type:S.Popup,templateID:n})}function H(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return function(t,n,i){if(!n||!n.match(/Command$/))throw new Error('name "'+n+'" should end with Command suffix');var o=i.value||i.initializer(),a=Object(h.isFunc)(e)?e:function(){return!!e};return i.value=function(){if(a.call(this,this)){for(var e=arguments.length,t=Array(e),n=0;n1&&void 0!==arguments[1]&&arguments[1];r.a.defer(function(){c()("[data-i18n]",e).each(function(e,t){y(t)}),t&&p.bAnimationSupported&&c()(".i18n-animation[data-i18n]",e).letterfx({fx:"fall fade",backwards:!1,timing:50,fx_duration:"50ms",letter_end:"restore",element_end:"restore"})})}var A=function(){o.a.rainloopI18N&&(h=o.a.rainloopI18N||{},w(o.a.document,!0),Object(f.reload)(),v(!v())),o.a.rainloopI18N=null};function O(){b.forEach(function(e){g[e[0]]=S(e[1])})}function T(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;e&&e(),t?v.subscribe(function(){e&&e(),t&&t()}):e&&v.subscribe(e)}function C(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return e=o.a.parseInt(e,10)||0,u.Notification.ClientViewError===e&&t?t:(n=n&&o.a.parseInt(n,10)||0,Object(d.isUnd)(g[e])?n&&Object(d.isUnd)(g[n])?g[n]:"":g[e])}function _(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:u.Notification.UnknownNotification;return e&&e.ErrorCode?C(Object(d.pInt)(e.ErrorCode),e.ErrorMessage||""):C(t)}function E(e){var t="";switch(o.a.parseInt(e,10)||0){case u.UploadErrorCode.FileIsTooBig:t=S("UPLOAD/ERROR_FILE_IS_TOO_BIG");break;case u.UploadErrorCode.FilePartiallyUploaded:t=S("UPLOAD/ERROR_FILE_PARTIALLY_UPLOADED");break;case u.UploadErrorCode.FileNoUploaded:t=S("UPLOAD/ERROR_NO_FILE_UPLOADED");break;case u.UploadErrorCode.MissingTempFolder:t=S("UPLOAD/ERROR_MISSING_TEMP_FOLDER");break;case u.UploadErrorCode.FileOnSaveingError:t=S("UPLOAD/ERROR_ON_SAVING_FILE");break;case u.UploadErrorCode.FileType:t=S("UPLOAD/ERROR_FILE_TYPE");break;default:t=S("UPLOAD/ERROR_UNKNOWN")}return t}function D(e,t){var n=Object(d.microtime)();return p.$html.addClass("rl-changing-language"),new o.a.Promise(function(i,a){c.a.ajax({url:Object(m.n)(t,e),dataType:"script",cache:!0}).then(function(){r.a.delay(function(){A();var e=-10&&void 0!==arguments[0]?arguments[0]:"";return c+Object(a.pString)(e)}function w(){return h?s:l+g}function A(){return s}function O(e,t,n){return n=Object(a.isUnd)(n)?b:n,l+"/Raw/"+u+"/"+n+"/"+e+"/"+u+"/"+t}function T(e,t){return O("Download",e,t)}function C(e,t){return O("View",e,t)}function _(e,t){return O("ViewThumbnail",e,t)}function E(e,t){return O("ViewAsPlain",e,t)}function D(e,t){return O("FramedView",e,t)}function N(e){return l+"/"+e+"/"+u+"/"+b+"/"}function j(){return N("Upload")}function R(){return N("UploadContacts")}function I(){return N("UploadBackground")}function x(){return N("Append")}function P(e){return N("Change")+Object(a.encodeURIComponent)(e)+"/"}function k(e){return N("Ajax")+e}function L(e){return l+"/Raw/"+u+"/"+b+"/ViewAsPlain/"+u+"/"+e}function M(e){return l+"/Raw/"+u+"/"+b+"/Download/"+u+"/"+e}function F(e){return l+"/Raw/0/Avatar/"+Object(a.encodeURIComponent)(e)+"/"}function U(e){return l+"/Raw/"+u+"/"+b+"/UserBackground/"+u+"/"+e}function H(){return l+"/Info"}function G(e,t){return l+"/Lang/0/"+(t?"Admin":"App")+"/"+o.a.encodeURI(e)+"/"+d+"/"}function B(){return l+"/Raw/"+u+"/"+b+"/ContactsVcf/"}function V(){return l+"/Raw/"+u+"/"+b+"/ContactsCsv/"}function q(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return l+"SocialGoogle"+(""!==b?"/"+u+"/"+b+"/":"")+(e?"&xauth=1":"")}function z(){return l+"SocialTwitter"+(""!==b?"/"+u+"/"+b+"/":"")}function K(){return l+"SocialFacebook"+(""!==b?"/"+u+"/"+b+"/":"")}function W(e){return m+e}function Y(){return W("css/images/empty-contact.png")}function $(e){return W("sounds/"+e)}function J(){return W("css/images/icom-message-notification.png")}function X(){return W("js/min/openpgp.min.js")}function Q(){return W("js/min/openpgp.worker.min.js")}function Z(e){var t=f;return"@custom"===e.substr(-7)&&(e=Object(a.trim)(e.substring(0,e.length-7)),t=p),t+"themes/"+o.a.encodeURI(e)+"/images/preview.png"}function ee(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"INBOX";return c+"mailbox/"+e}function te(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return c+"settings"+(e?"/"+e:"")}function ne(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";t=Object(a.isNormal)(t)?Object(a.pInt)(t):1,n=Object(a.pString)(n);var r=c+"mailbox/";if(""!==e){var s=Object(a.pInt)(i);r+=o.a.encodeURI(e)+(01&&void 0!==arguments[1])||arguments[1];this.defaultRequest(e,"AdminDomainList",{IncludeAliases:t?"1":"0"})},t.prototype.pluginList=function(e){this.defaultRequest(e,"AdminPluginList")},t.prototype.packagesList=function(e){this.defaultRequest(e,"AdminPackagesList")},t.prototype.coreData=function(e){this.defaultRequest(e,"AdminCoreData")},t.prototype.updateCoreData=function(e){this.defaultRequest(e,"AdminUpdateCoreData",{},9e4)},t.prototype.packageInstall=function(e,t){this.defaultRequest(e,"AdminPackageInstall",{Id:t.id,Type:t.type,File:t.file},6e4)},t.prototype.packageDelete=function(e,t){this.defaultRequest(e,"AdminPackageDelete",{Id:t.id})},t.prototype.domain=function(e,t){this.defaultRequest(e,"AdminDomainLoad",{Name:t})},t.prototype.plugin=function(e,t){this.defaultRequest(e,"AdminPluginLoad",{Name:t})},t.prototype.domainDelete=function(e,t){this.defaultRequest(e,"AdminDomainDelete",{Name:t})},t.prototype.domainDisable=function(e,t,n){return this.defaultRequest(e,"AdminDomainDisable",{Name:t,Disabled:n?"1":"0"})},t.prototype.pluginSettingsUpdate=function(e,t){return this.defaultRequest(e,"AdminPluginSettingsUpdate",t)},t.prototype.licensing=function(e,t){return this.defaultRequest(e,"AdminLicensing",{Force:t?"1":"0"})},t.prototype.licensingActivate=function(e,t,n){return this.defaultRequest(e,"AdminLicensingActivate",{Domain:t,Key:n})},t.prototype.pluginDisable=function(e,t,n){return this.defaultRequest(e,"AdminPluginDisable",{Name:t,Disabled:n?"1":"0"})},t.prototype.createDomainAlias=function(e,t,n){this.defaultRequest(e,"AdminDomainAliasSave",{Name:t,Alias:n})},t.prototype.createOrUpdateDomain=function(e,t,n,i,o,a,r,s,c,l,u,d,p,f,m,h,g,b,v){this.defaultRequest(e,"AdminDomainSave",{Create:t?"1":"0",Name:n,IncHost:i,IncPort:o,IncSecure:a,IncShortLogin:r?"1":"0",UseSieve:s?"1":"0",SieveAllowRaw:c?"1":"0",SieveHost:l,SievePort:u,SieveSecure:d,OutHost:p,OutPort:f,OutSecure:m,OutShortLogin:h?"1":"0",OutAuth:g?"1":"0",OutUsePhpMail:b?"1":"0",WhiteList:v})},t.prototype.testConnectionForDomain=function(e,t,n,i,o,a,r,s,c,l,u,d,p,f){this.defaultRequest(e,"AdminDomainTest",{Name:t,IncHost:n,IncPort:i,IncSecure:o,UseSieve:a?"1":"0",SieveHost:r,SievePort:s,SieveSecure:c,OutHost:l,OutPort:u,OutSecure:d,OutAuth:p?"1":"0",OutUsePhpMail:f?"1":"0"})},t.prototype.testContacts=function(e,t){this.defaultRequest(e,"AdminContactsTest",t)},t.prototype.saveNewAdminPassword=function(e,t){this.defaultRequest(e,"AdminPasswordUpdate",t)},t.prototype.adminPing=function(e){this.defaultRequest(e,"AdminPing")},t}(n(/*! Remote/AbstractAjax */115).a);t.a=new l}, -/*!******************************!*\ - !*** ./dev/Common/Events.js ***! - \******************************/ -/*! exports provided: sub, pub */ -/*! exports used: pub, sub */function(e,t,n){"use strict";n.d(t,"b",function(){return c}),n.d(t,"a",function(){return l});var i=n(/*! _ */4),o=n.n(i),a=n(/*! Common/Utils */2),r=n(/*! Common/Plugins */29),s={};function c(e,t,n){Object(a.isObject)(e)?(n=t||null,t=null,o.a.each(e,function(e,t){c(t,e,n)})):(Object(a.isUnd)(s[e])&&(s[e]=[]),s[e].push([t,n]))}function l(e,t){r.f("rl-pub",[e,t]),Object(a.isUnd)(s[e])||o.a.each(s[e],function(e){e[0]&&e[0].apply(e[1]||null,t||[])})}}, -/*!******************************!*\ - !*** ./dev/Common/Consts.js ***! - \******************************/ -/*! exports provided: MESSAGES_PER_PAGE, MESSAGES_PER_PAGE_VALUES, CONTACTS_PER_PAGE, DEFAULT_AJAX_TIMEOUT, SEARCH_AJAX_TIMEOUT, SEND_MESSAGE_AJAX_TIMEOUT, SAVE_MESSAGE_AJAX_TIMEOUT, CONTACTS_SYNC_AJAX_TIMEOUT, UNUSED_OPTION_VALUE, CLIENT_SIDE_STORAGE_INDEX_NAME, IMAP_DEFAULT_PORT, IMAP_DEFAULT_SECURE_PORT, SMTP_DEFAULT_PORT, SMTP_DEFAULT_SECURE_PORT, SIEVE_DEFAULT_PORT, MESSAGE_BODY_CACHE_LIMIT, AJAX_ERROR_LIMIT, TOKEN_ERROR_LIMIT, RAINLOOP_TRIAL_KEY, DATA_IMAGE_USER_DOT_PIC, DATA_IMAGE_TRANSP_PIC, DATA_IMAGE_LAZY_PLACEHOLDER_PIC */ -/*! exports used: AJAX_ERROR_LIMIT, CLIENT_SIDE_STORAGE_INDEX_NAME, CONTACTS_PER_PAGE, CONTACTS_SYNC_AJAX_TIMEOUT, DATA_IMAGE_LAZY_PLACEHOLDER_PIC, DATA_IMAGE_USER_DOT_PIC, DEFAULT_AJAX_TIMEOUT, IMAP_DEFAULT_PORT, MESSAGES_PER_PAGE, MESSAGES_PER_PAGE_VALUES, MESSAGE_BODY_CACHE_LIMIT, SAVE_MESSAGE_AJAX_TIMEOUT, SEARCH_AJAX_TIMEOUT, SEND_MESSAGE_AJAX_TIMEOUT, SIEVE_DEFAULT_PORT, SMTP_DEFAULT_PORT, TOKEN_ERROR_LIMIT, UNUSED_OPTION_VALUE */function(e,t,n){"use strict";n.d(t,"i",function(){return i}),n.d(t,"j",function(){return o}),n.d(t,"c",function(){return a}),n.d(t,"g",function(){return r}),n.d(t,"m",function(){return s}),n.d(t,"n",function(){return c}),n.d(t,"l",function(){return l}),n.d(t,"d",function(){return u}),n.d(t,"r",function(){return d}),n.d(t,"b",function(){return p}),n.d(t,"h",function(){return f}),n.d(t,"p",function(){return m}),n.d(t,"o",function(){return h}),n.d(t,"k",function(){return g}),n.d(t,"a",function(){return b}),n.d(t,"q",function(){return v}),n.d(t,"f",function(){return S}),n.d(t,"e",function(){return y});var i=20,o=[10,20,30,50,100],a=50,r=3e4,s=3e5,c=3e5,l=2e5,u=2e5,d="__UNUSE__",p="rlcsc",f=143,m=25,h=4190,g=15,b=7,v=10,S="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAuCAYAAABXuSs3AAAHHklEQVRoQ7VZW08bVxCeXRuwIbTGXIwNtBBaqjwgVUiR8lDlbza9qe1DpVZ9aNQ/0KpPeaJK07SpcuEeCEmUAObm21bfrL9lONjexSYrWfbunj37zXdmvpkz9oIgCKTD0Wg0xPd94TDP83Q0zvWa50vzklSrdanVanqf4/D84GBGr+F+Op3S8fqoJxLOdnZgTvsO/nYhenHA+UC7CWF1uXwkb9++ldPTUwVerVbVqFQqpR8YPjQ0JCMjI5LNDijoRgP3PQVu5+5Eor2XGLg7IV4GkIdHJ/LmzRs5ODiIwNbrdR0O0GCcq4Xz4eFhmZyclP7+tDQaIik/BG5XKQn4SwG3zJTLZXn9+rUclI8UHD5YVoDDN8bSzXhONwL48fFxGR4eilzFZT1uFRIB5yT8BqCdnR3Z3d0VP9Un6XRawYJpggVrZBv38ME4XKtUKnLt2jUplUoy1PR/l3U7T6sVSAQcgMAkj8PDQ9ne3pajoyMRL7zeKsYZWHgWYDGmv78/mmdwcFA+mJlSgziHDWrERrsjEXDXegTi1tZW+DLxI2bxIrqFNYTXyDyCFweMAHCwb8e4RnTNuOsqe3t7sra21pTD0Kct666E8XlcZyzw9/RUUXK5nK5oUinUQI6TQ3cynO/v78vq6qrKXCNwlTiJJpyNGc3nZHp6uqV2dwrQWOCtZBDAV1ZWwsQk7f0wiQn5kffbAu/0/KWBYzIC1+XukfGx0RGZmppKlC2tIV0Bh4aDcZW7HhkfH8urLLZL7T2pihvlkMNnz56FiadHxicL41IsFpN41bkxsYxbRdFo9jwB8KdPn14J8KnSpBQKhQs63nPmbCVRcBUAR2Lq1VVmpksyMTFxAXjcEsQybiegESionjx5osCZOeNe1O4+EhCAX7bQSgQcxRHTMgAgcz5+/Dis/hL4uHU3/B4YGNASGHIKxuEql0k+l05AeIAF1vPnz5VxFFmdDlaJrMtZITJeSsXCOTlMunKxjLtMYOKNjQ158eJFuAuKkUOb5sEwgff19SkJUBVkThZUbnXZrtCKBQ6gbnWIkjZpyne3ejAWoGnA7Icz6irvBLgbOMicCM6TkxPx/LAkbXfgWcsazuE2kFRsKD5Z+CiqDumKncpZvieWcS6dDVD8xiYCNflpJdwcdwJOf9airLmVQ7DPzMxIYWLsXGXoVqLt5k0M3K3JUVPDZdbWNzsCp48TPFdvdnZWUz32nDha7bJ63kgAJPzSdRks9/Kf9xMJAQ1gq2NpaUmy2Yz4zar4nQC3xb99AQwCcGzLAAwuhG8YiWvcOKts+r4GOe5nMhm5efOm9lUA3E3vSZJRrKvE0fnPv//Jy5cvo5cTHIPQbSjhOoqq69evS19f6lxDKK4+sVhigZPtKJqbrQeqxd5+WR4+fKgqgT0k2XX3nhiPgETWXFhYkFzuPZ2yVq1GTSOXpE47/VjgNnD4m4GG7/LhsTx69EiwD4Vr2MwIIxgbAH18fKx1yfz8vEogNvGtWnCuhLZa9UTAreVWFsHy/b/+Vrbdl7E5REMQD2jDoUbByty+/ZnU64GkU2HzyJLhktU1cLv8nARgkYS2d3ajAgwG8qU2oLmDZ92CMaOjo7K4uCiZgbDWaRWgnZhPxLhrMUCvr69riwKZk1LHF7XqrWAO9hJxH6ozNzcnCx/PqztZg9mf6SQMscCtm2C5ke4BGMlHWTUp36036AJajDVrFMzBrhhWslQsSrFYiOqVpMriNYIgqFRq2j3FAb/zffT6zuxFXxsNzs3NTXn16lW4gYiW96w1FyedF+83xG/2FNGCRpU4NjamMsn+OZ9xE5RXqdaDdPpib6RWCzuwKF9RxqI2AVNQBwQYJoK0wdBejnqtEikP3pfP51XjUTESl12FqJEKxsEorARYDD44ONTeID7YpsEnrRvQfWAI2e8WfDaTUSIwJ0iBCmFOtOUAHvVMPp/TPwvYFVYFIuP8l+DBgwdaa2Miqwa0GgYwfeMltovbDfh6c1vIgMYcliSsKv4IWFr6VDHxvldvBAH+1sA+cnl5WYOPmmr9ir+1l9I0Cgz0yjhXjfJJ0JROnmezWbl165ayr/5fqwcBNr7IfhjMqKcvESSM4eRcCasQ3bDNObmKPLdGUGpZsN24cUNLBm9zazu4d++e6qpNBFaTuUS26U5dpuR1CxyA7J9ddrMRqlz4pwLLYawymPd++/2PADt2ugcGwq9gCCdhQ96C6xWwa6j1ceuq+I0EhW0i8MAIVJfeL3d/DVD8EKi12P6/2S2jV/EccVB54O/ejz/9HGCpoBBMta5rXMXLu53D1XAwjhXwvvv+h4BAXVe4bOu3O3ChxF08LiZFG3fel199G9CH3fLyqv24NcB44MRhpdK788U3CpyKwsCw590xmfSpzsBt0Fqc3ud3vtZigxWcVZCklVpSiN0w3q5E/h9TGMIUuA3+EQAAAABJRU5ErkJggg==",y="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC"}, -/*!***************************************!*\ - !*** ./dev/Knoin/AbstractViewNext.js ***! - \***************************************/ -/*! exports provided: AbstractViewNext */ -/*! exports used: AbstractViewNext */function(e,t,n){"use strict";n.d(t,"a",function(){return l});var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! ko */1),r=n(/*! Common/Utils */2),s=n(/*! Common/Enums */0),c=n(/*! Common/Globals */6),l=function(){function e(){o()(this,e),this.bDisabeCloseOnEsc=!1,this.sDefaultKeyScope=s.KeyState.None,this.sCurrentKeyScope=s.KeyState.None,this.viewModelVisibility=a.a.observable(!1),this.modalVisibility=a.a.observable(!1).extend({rateLimit:0}),this.viewModelName="",this.viewModelNames=[],this.viewModelDom=null}return e.prototype.storeAndSetKeyScope=function(){this.sCurrentKeyScope=Object(c.keyScope)(),Object(c.keyScope)(this.sDefaultKeyScope)},e.prototype.restoreKeyScope=function(){Object(c.keyScope)(this.sCurrentKeyScope)},e.prototype.registerPopupKeyDown=function(){var e=this;c.$win.on("keydown",function(t){if(t&&e.modalVisibility&&e.modalVisibility()){if(!e.bDisabeCloseOnEsc&&s.EventKeyCode.Esc===t.keyCode)return Object(r.delegateRun)(e,"cancelCommand"),!1;if(s.EventKeyCode.Backspace===t.keyCode&&!Object(r.inFocus)())return!1}return!0})},e.prototype.cancelCommand=function(){},e.prototype.closeCommand=function(){},e}()}, -/*!******************************!*\ - !*** ./dev/Stores/Social.js ***! - \******************************/ -/*! exports provided: default */ -/*! exports used: default */function(e,t,n){"use strict";var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! window */3),r=n.n(a),s=n(/*! ko */1),c=n(/*! $ */7),l=n.n(c),u=n(/*! Storage/Settings */5),d=function(){function e(){var t=this;o()(this,e),this.google={},this.twitter={},this.facebook={},this.dropbox={},this.google.enabled=s.a.observable(!1),this.google.clientID=s.a.observable(""),this.google.clientSecret=s.a.observable(""),this.google.apiKey=s.a.observable(""),this.google.loading=s.a.observable(!1),this.google.userName=s.a.observable(""),this.google.loggined=s.a.computed(function(){return""!==t.google.userName()}),this.google.capa={},this.google.capa.auth=s.a.observable(!1),this.google.capa.authFast=s.a.observable(!1),this.google.capa.drive=s.a.observable(!1),this.google.capa.preview=s.a.observable(!1),this.google.require={},this.google.require.clientSettings=s.a.computed(function(){return t.google.enabled()&&(t.google.capa.auth()||t.google.capa.drive())}),this.google.require.apiKeySettings=s.a.computed(function(){return t.google.enabled()&&t.google.capa.drive()}),this.facebook.enabled=s.a.observable(!1),this.facebook.appID=s.a.observable(""),this.facebook.appSecret=s.a.observable(""),this.facebook.loading=s.a.observable(!1),this.facebook.userName=s.a.observable(""),this.facebook.supported=s.a.observable(!1),this.facebook.loggined=s.a.computed(function(){return""!==t.facebook.userName()}),this.twitter.enabled=s.a.observable(!1),this.twitter.consumerKey=s.a.observable(""),this.twitter.consumerSecret=s.a.observable(""),this.twitter.loading=s.a.observable(!1),this.twitter.userName=s.a.observable(""),this.twitter.loggined=s.a.computed(function(){return""!==t.twitter.userName()}),this.dropbox.enabled=s.a.observable(!1),this.dropbox.apiKey=s.a.observable("")}return e.prototype.populate=function(){this.google.enabled(!!u.settingsGet("AllowGoogleSocial")),this.google.clientID(u.settingsGet("GoogleClientID")),this.google.clientSecret(u.settingsGet("GoogleClientSecret")),this.google.apiKey(u.settingsGet("GoogleApiKey")),this.google.capa.auth(!!u.settingsGet("AllowGoogleSocialAuth")),this.google.capa.authFast(!!u.settingsGet("AllowGoogleSocialAuthFast")),this.google.capa.drive(!!u.settingsGet("AllowGoogleSocialDrive")),this.google.capa.preview(!!u.settingsGet("AllowGoogleSocialPreview")),this.facebook.enabled(!!u.settingsGet("AllowFacebookSocial")),this.facebook.appID(u.settingsGet("FacebookAppID")),this.facebook.appSecret(u.settingsGet("FacebookAppSecret")),this.facebook.supported(!!u.settingsGet("SupportedFacebookSocial")),this.twitter.enabled=s.a.observable(!!u.settingsGet("AllowTwitterSocial")),this.twitter.consumerKey=s.a.observable(u.settingsGet("TwitterConsumerKey")),this.twitter.consumerSecret=s.a.observable(u.settingsGet("TwitterConsumerSecret")),this.dropbox.enabled(!!u.settingsGet("AllowDropboxSocial")),this.dropbox.apiKey(u.settingsGet("DropboxApiKey"))},e.prototype.appendDropbox=function(){if(!r.a.Dropbox&&this.dropbox.enabled()&&this.dropbox.apiKey()&&!r.a.document.getElementById("dropboxjs")){var e=r.a.document.createElement("script");e.type="text/javascript",e.src="https://www.dropbox.com/static/api/2/dropins.js",l()(e).attr("id","dropboxjs").attr("data-app-key",this.dropbox.apiKey()),r.a.document.body.appendChild(e)}},e}();t.a=new d}, -/*!***********************************!*\ - !*** ./dev/Component/Abstract.js ***! - \***********************************/ -/*! exports provided: AbstractComponent, componentExportHelper */ -/*! exports used: AbstractComponent, componentExportHelper */, -/*!***********************************!*\ - !*** ./dev/Component/Abstract.js ***! - \***********************************/ -/*! exports provided: AbstractComponent, componentExportHelper */ -/*! exports used: AbstractComponent, componentExportHelper */function(e,t,n){"use strict";n.d(t,"a",function(){return u}),n.d(t,"b",function(){return d});var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! $ */7),r=n.n(a),s=n(/*! ko */1),c=n(/*! Common/Utils */2),l=n(/*! Common/Translator */10),u=function(){function e(){o()(this,e),this.disposable=[]}return e.prototype.dispose=function(){this.disposable.forEach(function(e){e&&e.dispose&&e.dispose()})},e}(),d=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return{template:t?{element:t}:"",viewModel:{createViewModel:function(t,n){return(t=t||{}).element=null,n&&n.element&&(t.component=n,t.element=r()(n.element),Object(l.i18nToNodes)(t.element),!Object(c.isUnd)(t.inline)&&s.a.unwrap(t.inline)&&t.element.css("display","inline-block")),new e(t)}}}}}, -/*!*******************************!*\ - !*** ./dev/Common/Plugins.js ***! - \*******************************/ -/*! exports provided: addHook, runHook, mainSettingsGet, remoteRequest, addSettingsViewModel, addSettingsViewModelForAdmin, runSettingsViewModelHooks, settingsGet */ -/*! exports used: addHook, addSettingsViewModel, addSettingsViewModelForAdmin, mainSettingsGet, remoteRequest, runHook, runSettingsViewModelHooks, settingsGet */, -/*!*******************************!*\ - !*** ./dev/Common/Plugins.js ***! - \*******************************/ -/*! exports provided: addHook, runHook, mainSettingsGet, remoteRequest, addSettingsViewModel, addSettingsViewModelForAdmin, runSettingsViewModelHooks, settingsGet */ -/*! exports used: addHook, addSettingsViewModel, addSettingsViewModelForAdmin, mainSettingsGet, remoteRequest, runHook, runSettingsViewModelHooks, settingsGet */function(e,t,n){"use strict";n.d(t,"a",function(){return d}),n.d(t,"f",function(){return p}),n.d(t,"d",function(){return f}),n.d(t,"e",function(){return m}),n.d(t,"b",function(){return h}),n.d(t,"c",function(){return g}),n.d(t,"g",function(){return b}),n.d(t,"h",function(){return v});var i=n(/*! _ */4),o=n.n(i),a=n(/*! Common/Utils */2),r=n(/*! Common/Globals */6),s=n(/*! Storage/Settings */5),c={},l=[],u=[];function d(e,t){Object(a.isFunc)(t)&&(Object(a.isArray)(c[e])||(c[e]=[]),c[e].push(t))}function p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];Object(a.isArray)(c[e])&&o.a.each(c[e],function(e){e.apply(void 0,t)})}function f(e){return s.settingsGet(e)}function m(e,t,n,i){r.data.__APP__&&r.data.__APP__.remote().defaultRequest(e,"Plugin"+t,n,i)}function h(e,t,n,i){l.push([e,t,n,i])}function g(e,t,n,i){u.push([e,t,n,i])}function b(e){var t=n(/*! Knoin/Knoin */9);o.a.each(e?u:l,function(e){t.addSettingsViewModel(e[0],e[1],e[2],e[3])})}function v(e,t){var n=s.settingsGet("Plugins");return(n=n&&!Object(a.isUnd)(n[e])?n[e]:null)?Object(a.isUnd)(n[t])?null:n[t]:null}},, -/*!********************************!*\ - !*** ./dev/Stores/Language.js ***! - \********************************/ -/*! exports provided: default */ -/*! exports used: default */, -/*!********************************!*\ - !*** ./dev/Stores/Language.js ***! - \********************************/ -/*! exports provided: default */ -/*! exports used: default */function(e,t,n){"use strict";var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! ko */1),r=n(/*! Common/Utils */2),s=n(/*! Storage/Settings */5),c=function(){function e(){o()(this,e),this.languages=a.a.observableArray([]),this.languagesAdmin=a.a.observableArray([]),this.language=a.a.observable("").extend({limitedList:this.languages}).extend({reversible:!0}),this.languageAdmin=a.a.observable("").extend({limitedList:this.languagesAdmin}).extend({reversible:!0}),this.userLanguage=a.a.observable(""),this.userLanguageAdmin=a.a.observable("")}return e.prototype.populate=function(){var e=s.appSettingsGet("languages"),t=s.appSettingsGet("languagesAdmin");this.languages(Object(r.isArray)(e)?e:[]),this.languagesAdmin(Object(r.isArray)(t)?t:[]),this.language(s.settingsGet("Language")),this.languageAdmin(s.settingsGet("LanguageAdmin")),this.userLanguage(s.settingsGet("UserLanguage")),this.userLanguageAdmin(s.settingsGet("UserLanguageAdmin"))},e}();t.a=new c}, -/*!********************************!*\ - !*** ./dev/Common/Momentor.js ***! - \********************************/ -/*! exports provided: momentNow, momentNowUnix, searchSubtractFormatDateHelper, format, momentToNode, reload */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./dev/External/ko.js (referenced with cjs require) */, -/*!********************************!*\ - !*** ./dev/Common/Momentor.js ***! - \********************************/ -/*! exports provided: momentNow, momentNowUnix, searchSubtractFormatDateHelper, format, momentToNode, reload */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./dev/External/ko.js (referenced with cjs require) */function(e,t,n){"use strict";n.r(t),n.d(t,"momentNow",function(){return g}),n.d(t,"momentNowUnix",function(){return b}),n.d(t,"searchSubtractFormatDateHelper",function(){return v}),n.d(t,"format",function(){return S}),n.d(t,"momentToNode",function(){return y}),n.d(t,"reload",function(){return w});var i=n(/*! window */3),o=n.n(i),a=n(/*! _ */4),r=n.n(a),s=n(/*! $ */7),c=n.n(s),l=n(/*! moment */54),u=n.n(l),d=n(/*! Common/Translator */10),p=null,f=0,m=r.a.debounce(function(){p=u()()},500,!0),h=r.a.debounce(function(){f=u()().unix()},500,!0);function g(){return m(),p||u()()}function b(){return h(),f||0}function v(e){return g().clone().subtract(e,"days").format("YYYY.MM.DD")}function S(e,t){var n=null,i="",o=b();if((n=0<(e=o<(e=0=t.diff(e,"hours"):return e.fromNow();case t.format("L")===e.format("L"):return Object(d.i18n)("MESSAGE_LIST/TODAY_AT",{TIME:e.format("LT")});case t.clone().subtract(1,"days").format("L")===e.format("L"):return Object(d.i18n)("MESSAGE_LIST/YESTERDAY_AT",{TIME:e.format("LT")});case t.year()===e.year():return e.format("D MMM.")}return e?e.format("LL"):""}(n);break;case"FULL":i=n.format("LLL");break;default:i=n.format(t)}return i}function y(e){var t,n="",i=c()(e);(t=i.data("moment-time"))&&((n=i.data("moment-format"))&&i.text(S(t,n)),(n=i.data("moment-format-title"))&&i.attr("title",S(t,n)))}function w(){r.a.defer(function(){c()(".moment",o.a.document).each(function(e,t){y(t)})})}}, -/*!********************************!*\ - !*** external "window.hasher" ***! - \********************************/ -/*! no static exports found */ -/*! exports used: default */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports=window.hasher}, -/*!**********************************!*\ - !*** ./dev/Helper/Apps/Admin.js ***! - \**********************************/ -/*! exports provided: getApp */ -/*! exports used: getApp */, -/*!**********************************!*\ - !*** ./dev/Helper/Apps/Admin.js ***! - \**********************************/ -/*! exports provided: getApp */ -/*! exports used: getApp */function(e,t,n){"use strict";function i(){return n(/*! App/Admin */172).default}n.d(t,"a",function(){return i})}, -/*!*********************************!*\ - !*** ./dev/Stores/Admin/App.js ***! - \*********************************/ -/*! exports provided: default */ -/*! exports used: default */function(e,t,n){"use strict";var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! babel-runtime/helpers/possibleConstructorReturn */12),r=n.n(a),s=n(/*! babel-runtime/helpers/inherits */11),c=n.n(s),l=n(/*! window */3),u=n.n(l),d=n(/*! $ */7),p=n.n(d),f=n(/*! ko */1),m=n(/*! Storage/Settings */5),h=function(e){function t(){o()(this,t);var n=r()(this,e.call(this));return n.determineUserLanguage=f.a.observable(!1),n.determineUserDomain=f.a.observable(!1),n.weakPassword=f.a.observable(!1),n.useLocalProxyForExternalImages=f.a.observable(!1),n.dataFolderAccess=f.a.observable(!1),n}return c()(t,e),t.prototype.populate=function(){var t=this;e.prototype.populate.call(this),this.determineUserLanguage(!!Object(m.settingsGet)("DetermineUserLanguage")),this.determineUserDomain(!!Object(m.settingsGet)("DetermineUserDomain")),this.weakPassword(!!Object(m.settingsGet)("WeakPassword")),this.useLocalProxyForExternalImages(!!Object(m.settingsGet)("UseLocalProxyForExternalImages")),Object(m.settingsGet)("Auth")&&p.a.get("./data/VERSION?"+u.a.Math.random()).then(function(){return t.dataFolderAccess(!0)})},t}(n(/*! Stores/AbstractApp */116).a);t.a=new h}, -/*!*****************************!*\ - !*** ./dev/Stores/Theme.js ***! - \*****************************/ -/*! exports provided: default */ -/*! exports used: default */function(e,t,n){"use strict";var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! ko */1),r=n(/*! Common/Utils */2),s=n(/*! Storage/Settings */5),c=function(){function e(){o()(this,e),this.themes=a.a.observableArray([]),this.themeBackgroundName=a.a.observable(""),this.themeBackgroundHash=a.a.observable(""),this.theme=a.a.observable("").extend({limitedList:this.themes})}return e.prototype.populate=function(){var e=s.appSettingsGet("themes");this.themes(Object(r.isArray)(e)?e:[]),this.theme(s.settingsGet("Theme")),this.themeBackgroundName(s.settingsGet("UserBackgroundName")),this.themeBackgroundHash(s.settingsGet("UserBackgroundHash"))},e}();t.a=new c}, -/*!*******************************************************!*\ - !*** ./node_modules/core-js/library/modules/_core.js ***! - \*******************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){var n=e.exports={version:"2.5.1"};"number"==typeof __e&&(__e=n)}, -/*!*********************************************************!*\ - !*** ./node_modules/core-js/library/modules/_global.js ***! - \*********************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)}, -/*!**************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_descriptors.js ***! - \**************************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){e.exports=!n(/*! ./_fails */51)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})}, -/*!*************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_to-iobject.js ***! - \*************************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_iobject */109),o=n(/*! ./_defined */73);e.exports=function(e){return i(o(e))}}, -/*!****************************!*\ - !*** ./dev/Model/Email.js ***! - \****************************/ -/*! exports provided: EmailModel, default */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./dev/Common/Utils.js (referenced with cjs require), ./dev/External/ko.js (referenced with cjs require) */function(e,t,n){"use strict";n.r(t),n.d(t,"EmailModel",function(){return u}),n.d(t,"default",function(){return u});var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! _ */4),r=n.n(a),s=n(/*! emailjs-addressparser */76),c=n.n(s),l=n(/*! Common/Utils */2),u=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";o()(this,e),this.email="",this.name="",this.dkimStatus="",this.dkimValue="",this.email=t,this.name=n,this.dkimStatus=i,this.dkimValue=a,this.clearDuplicateName()}return e.newInstanceFromJson=function(t){var n=new e;return n.initByJson(t)?n:null},e.prototype.clear=function(){this.email="",this.name="",this.dkimStatus="none",this.dkimValue=""},e.prototype.validate=function(){return""!==this.name||""!==this.email},e.prototype.hash=function(){return"#"+(arguments.length>0&&void 0!==arguments[0]&&arguments[0]?"":this.name)+"#"+this.email+"#"},e.prototype.clearDuplicateName=function(){this.name===this.email&&(this.name="")},e.prototype.search=function(e){return-1<(this.name+" "+this.email).toLowerCase().indexOf(e.toLowerCase())},e.prototype.initByJson=function(e){var t=!1;return e&&"Object/Email"===e["@Object"]&&(this.name=Object(l.trim)(e.Name),this.email=Object(l.trim)(e.Email),this.dkimStatus=Object(l.trim)(e.DkimStatus||""),this.dkimValue=Object(l.trim)(e.DkimValue||""),t=""!==this.email,this.clearDuplicateName()),t},e.prototype.toLine=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i="";return""!==this.email&&(e&&""!==this.name?i=t?'
")+'" target="_blank" tabindex="-1">'+Object(l.encodeHtml)(this.name)+"":n?Object(l.encodeHtml)(this.name):this.name:(i=this.email,""!==this.name?t?i=Object(l.encodeHtml)('"'+this.name+'" <')+'")+'" target="_blank" tabindex="-1">'+Object(l.encodeHtml)(i)+""+Object(l.encodeHtml)(">"):(i='"'+this.name+'" <'+i+">",n&&(i=Object(l.encodeHtml)(i))):t&&(i=''+Object(l.encodeHtml)(this.email)+""))),i},e.splitEmailLine=function(t){var n=c()(t);if(Object(l.isNonEmptyArray)(n)){var i=[],o=!1;return n.forEach(function(t){var n=t.address?new e(t.address.replace(/^[<]+(.*)[>]+$/g,"$1"),t.name||""):null;n&&n.email&&(o=!0),i.push(n?n.toLine(!1):t.name)}),o?i:null}return null},e.parseEmailLine=function(t){var n=c()(t);return Object(l.isNonEmptyArray)(n)?r.a.compact(n.map(function(t){return t.address?new e(t.address.replace(/^[<]+(.*)[>]+$/g,"$1"),t.name||""):null})):[]},e.prototype.parse=function(e){if(""===(e=Object(l.trim)(e)))return!1;var t=c()(e);return!(!Object(l.isNonEmptyArray)(t)||!t[0])&&(this.name=t[0].name||"",this.email=t[0].address||"",this.clearDuplicateName(),!0)},e}()}, -/*!******************************************************!*\ - !*** ./node_modules/core-js/library/modules/_has.js ***! - \******************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */, -/*!******************************************************!*\ - !*** ./node_modules/core-js/library/modules/_has.js ***! - \******************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}}, -/*!****************************************!*\ - !*** ./dev/Component/AbstractInput.js ***! - \****************************************/ -/*! exports provided: AbstractInput, default */ -/*! exports used: AbstractInput */function(e,t,n){"use strict";n.d(t,"a",function(){return p});var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! babel-runtime/helpers/possibleConstructorReturn */12),r=n.n(a),s=n(/*! babel-runtime/helpers/inherits */11),c=n.n(s),l=n(/*! ko */1),u=n(/*! Common/Utils */2),d=n(/*! Common/Enums */0),p=function(e){function t(n){o()(this,t);var i=r()(this,e.call(this));return i.value=n.value||"",i.size=n.size||0,i.label=n.label||"",i.preLabel=n.preLabel||"",i.enable=!!Object(u.isUnd)(n.enable)||n.enable,i.trigger=n.trigger&&n.trigger.subscribe?n.trigger:null,i.placeholder=n.placeholder||"",i.labeled=!Object(u.isUnd)(n.label),i.preLabeled=!Object(u.isUnd)(n.preLabel),i.triggered=!Object(u.isUnd)(n.trigger)&&!!i.trigger,i.classForTrigger=l.a.observable(""),i.className=l.a.computed(function(){var e=l.a.unwrap(i.size),t=i.trigger?" "+Object(u.trim)("settings-saved-trigger-input "+i.classForTrigger()):"";return(01&&void 0!==arguments[1]&&arguments[1];if(!o.a.Promise||!o.a.Promise.all)throw new Error("Promises are not available your environment.");if(!e)throw new Error("src should not be empty.");return new o.a.Promise(function(n,i){var a=o.a.document.createElement("script");a.onload=function(){n(e)},a.onerror=function(){i(new Error(e))},a.async=!0===t,a.src=e,o.a.document.body.appendChild(a)})}}, -/*!******************************************************!*\ - !*** ./node_modules/core-js/library/modules/_wks.js ***! - \******************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_shared */85)("wks"),o=n(/*! ./_uid */70),a=n(/*! ./_global */41).Symbol,r="function"==typeof a;(e.exports=function(e){return i[e]||(i[e]=r&&a[e]||(r?a:o)("Symbol."+e))}).store=i}, -/*!************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_an-object.js ***! - \************************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_is-object */52);e.exports=function(e){if(!i(e))throw TypeError(e+" is not an object!");return e}},, -/*!****************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_property-desc.js ***! - \****************************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */, -/*!****************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_property-desc.js ***! - \****************************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}}, -/*!*************************************!*\ - !*** ./dev/Knoin/AbstractScreen.js ***! - \*************************************/ -/*! exports provided: AbstractScreen */ -/*! exports used: AbstractScreen */function(e,t,n){"use strict";n.d(t,"a",function(){return u});var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! _ */4),r=n.n(a),s=n(/*! crossroads */75),c=n.n(s),l=n(/*! Common/Utils */2),u=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];o()(this,e),this.oCross=null,this.sScreenName=t,this.aViewModels=Object(l.isArray)(n)?n:[]}return e.prototype.viewModels=function(){return this.aViewModels},e.prototype.screenName=function(){return this.sScreenName},e.prototype.routes=function(){return null},e.prototype.__cross=function(){return this.oCross},e.prototype.__start=function(){var e=null,t=null,n=this.routes();Object(l.isNonEmptyArray)(n)&&(t=r.a.bind(this.onRoute||l.noop,this),e=c.a.create(),n.forEach(function(n){n&&e&&(e.addRoute(n[0],t).rules=n[1])}),this.oCross=e)},e}()}, -/*!*****************************!*\ - !*** external "window.ssm" ***! - \*****************************/ -/*! no static exports found */ -/*! exports used: default */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports=window.ssm}, -/*!***************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_to-primitive.js ***! - \***************************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_is-object */52);e.exports=function(e,t){if(!i(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!i(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!i(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!i(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")}}, -/*!************************************!*\ - !*** ./dev/Stores/Admin/Domain.js ***! - \************************************/ -/*! exports provided: default */ -/*! exports used: default */function(e,t,n){"use strict";var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! ko */1);t.a=new function e(){o()(this,e),this.domains=a.a.observableArray([]),this.domains.loading=a.a.observable(!1).extend({throttle:100}),this.domainsWithoutAliases=this.domains.filter(function(e){return e&&!e.alias})}}, -/*!******************************************************!*\ - !*** ./node_modules/core-js/library/modules/_uid.js ***! - \******************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */, -/*!******************************************************!*\ - !*** ./node_modules/core-js/library/modules/_uid.js ***! - \******************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){var n=0,i=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+i).toString(36))}}, -/*!*************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_object-pie.js ***! - \*************************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){t.f={}.propertyIsEnumerable}, -/*!**************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_object-gopd.js ***! - \**************************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_object-pie */71),o=n(/*! ./_property-desc */64),a=n(/*! ./_to-iobject */43),r=n(/*! ./_to-primitive */67),s=n(/*! ./_has */46),c=n(/*! ./_ie8-dom-define */77),l=Object.getOwnPropertyDescriptor;t.f=n(/*! ./_descriptors */42)?l:function(e,t){if(e=a(e),t=r(t,!0),c)try{return l(e,t)}catch(e){}if(s(e,t))return o(!i.f.call(e,t),e[t])}}, -/*!**********************************************************!*\ - !*** ./node_modules/core-js/library/modules/_defined.js ***! - \**********************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}}, -/*!******************************************!*\ - !*** ./dev/Component/AbstracCheckbox.js ***! - \******************************************/ -/*! exports provided: AbstracCheckbox, default */ -/*! exports used: AbstracCheckbox */function(e,t,n){"use strict";n.d(t,"a",function(){return d});var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! babel-runtime/helpers/possibleConstructorReturn */12),r=n.n(a),s=n(/*! babel-runtime/helpers/inherits */11),c=n.n(s),l=n(/*! ko */1),u=n(/*! Common/Utils */2),d=function(e){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};o()(this,t);var i=r()(this,e.call(this));return i.value=n.value,!Object(u.isUnd)(i.value)&&i.value.subscribe||(i.value=l.a.observable(!Object(u.isUnd)(i.value)&&!!i.value)),i.enable=n.enable,!Object(u.isUnd)(i.enable)&&i.enable.subscribe||(i.enable=l.a.observable(!!Object(u.isUnd)(i.enable)||!!i.enable)),i.disable=n.disable,!Object(u.isUnd)(i.disable)&&i.disable.subscribe||(i.disable=l.a.observable(!Object(u.isUnd)(i.disable)&&!!i.disable)),i.label=n.label||"",i.inline=!Object(u.isUnd)(n.inline)&&n.inline,i.readOnly=!Object(u.isUnd)(n.readOnly)&&!!n.readOnly,i.inverted=!Object(u.isUnd)(n.inverted)&&!!n.inverted,i.labeled=!Object(u.isUnd)(n.label),i.labelAnimated=!!n.labelAnimated,i}return c()(t,e),t.prototype.click=function(){this.readOnly||!this.enable()||this.disable()||this.value(!this.value())},t}(n(/*! Component/Abstract */27).a)}, -/*!************************************!*\ - !*** external "window.crossroads" ***! - \************************************/ -/*! no static exports found */ -/*! exports used: default */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports=window.crossroads}, -/*!******************************************************************!*\ - !*** ./node_modules/emailjs-addressparser/dist/addressparser.js ***! - \******************************************************************/ -/*! no static exports found */ -/*! exports used: default */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n=0;u--)if(r.text[u].match(/^[^@\s]+@[^@\s]+$/)){r.address=r.text.splice(u,1);break}var d=function(e){return r.address.length?e:(r.address=[e.trim()]," ")};if(!r.address.length)for(var p=r.text.length-1;p>=0&&(r.text[p]=r.text[p].replace(/\s*\b[^@\s]+@[^@\s]+\b\s*/,d).trim(),!r.address.length);p--);}if(!r.text.length&&r.comment.length&&(r.text=r.comment,r.comment=[]),r.address.length>1&&(r.text=r.text.concat(r.address.splice(1))),r.text=r.text.join(" "),r.address=r.address.join(" "),!r.address&&t)return[];(i={address:r.address||r.text||"",name:r.text||r.address||""}).address===i.name&&((i.address||"").match(/@/)?i.name="":i.address=""),a.push(i)}return a}(e)).length&&(i=i.concat(e))}),i}t.default=o;var a={'"':'"',"(":")","<":">",",":"",":":";",";":""},r=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.str=(t||"").toString(),this.operatorCurrent="",this.operatorExpecting="",this.node=null,this.escaped=!1,this.list=[]}return i(e,[{key:"tokenize",value:function(){for(var e=void 0,t=[],n=0,i=this.str.length;ndocument.F=Object<\/script>"),e.close(),c=e.F;i--;)delete c.prototype[a[i]];return c()};e.exports=Object.create||function(e,t){var n;return null!==e?(s.prototype=i(e),n=new s,s.prototype=null,n[r]=e):n=c(),void 0===t?n:o(n,t)}}, -/*!************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_iterators.js ***! - \************************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports={}}, -/*!**********************************************************!*\ - !*** ./node_modules/core-js/library/modules/_library.js ***! - \**********************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports=!0}, -/*!*************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_to-integer.js ***! - \*************************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){var n=Math.ceil,i=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?i:n)(e)}}, -/*!******************************************************!*\ - !*** ./node_modules/core-js/library/modules/_cof.js ***! - \******************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}}, -/*!*************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_dom-create.js ***! - \*************************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_is-object */52),o=n(/*! ./_global */41).document,a=i(o)&&i(o.createElement);e.exports=function(e){return a?o.createElement(e):{}}}, -/*!******************************************************!*\ - !*** ./node_modules/core-js/library/modules/_ctx.js ***! - \******************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_a-function */112);e.exports=function(e,t,n){if(i(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,o){return e.call(t,n,i,o)}}return function(){return e.apply(t,arguments)}}}, -/*!**********************************!*\ - !*** ./dev/Common/HtmlEditor.js ***! - \**********************************/ -/*! exports provided: HtmlEditor, default */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./dev/External/ko.js (referenced with cjs require) */function(e,t,n){"use strict";n.r(t),n.d(t,"HtmlEditor",function(){return m}),n.d(t,"default",function(){return m});var i=n(/*! babel-runtime/helpers/classCallCheck */8),o=n.n(i),a=n(/*! window */3),r=n.n(a),s=n(/*! _ */4),c=n.n(s),l=n(/*! $ */7),u=n.n(l),d=n(/*! Common/Globals */6),p=n(/*! Common/Enums */0),f=n(/*! Storage/Settings */5),m=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;o()(this,e),this.blurTimer=0,this.__resizable=!1,this.__inited=!1,this.onBlur=null,this.onReady=null,this.onModeChange=null,this.onBlur=n,this.onReady=i,this.onModeChange=a,this.element=t,this.$element=u()(t),this.resize=c.a.throttle(c.a.bind(this.resizeEditor,this),100),this.init()}return e.prototype.runOnBlur=function(){this.onBlur&&this.onBlur()},e.prototype.blurTrigger=function(){var e=this;this.onBlur&&(r.a.clearTimeout(this.blurTimer),this.blurTimer=r.a.setTimeout(function(){e.runOnBlur()},p.Magics.Time200ms))},e.prototype.focusTrigger=function(){this.onBlur&&r.a.clearTimeout(this.blurTimer)},e.prototype.isHtml=function(){return!!this.editor&&"wysiwyg"===this.editor.mode},e.prototype.clearCachedSignature=function(){this.editor&&this.editor.execCommand("insertSignature",{clearCache:!0})},e.prototype.setSignature=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];this.editor&&this.editor.execCommand("insertSignature",{isHtml:t,insertBefore:n,signature:e})},e.prototype.checkDirty=function(){return!!this.editor&&this.editor.checkDirty()},e.prototype.resetDirty=function(){this.editor&&this.editor.resetDirty()},e.prototype.getData=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t="";if(this.editor)try{t="plain"===this.editor.mode&&this.editor.plugins.plain&&this.editor.__plain?this.editor.__plain.getRawData():e?'
'+this.editor.getData()+"
":this.editor.getData()}catch(e){}return t},e.prototype.getDataWithHtmlMark=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return(this.isHtml()?":HTML:":"")+this.getData(e)},e.prototype.modeToggle=function(e,t){if(this.editor){try{e?"plain"===this.editor.mode&&this.editor.setMode("wysiwyg"):"wysiwyg"===this.editor.mode&&this.editor.setMode("plain")}catch(e){}t&&this.resize()}},e.prototype.setHtmlOrPlain=function(e,t){":HTML:"===e.substr(0,6)?this.setHtml(e.substr(6),t):this.setPlain(e,t)},e.prototype.setHtml=function(e,t){if(this.editor&&this.__inited){this.clearCachedSignature(),this.modeToggle(!0),e=e.replace(/]*><\/p>/gi,"");try{this.editor.setData(e)}catch(e){}t&&this.focus()}},e.prototype.replaceHtml=function(e,t){if(this.editor&&this.__inited&&"wysiwyg"===this.editor.mode)try{this.editor.setData(this.editor.getData().replace(e,t))}catch(e){}},e.prototype.setPlain=function(e,t){if(this.editor&&this.__inited){if(this.clearCachedSignature(),this.modeToggle(!1),"plain"===this.editor.mode&&this.editor.plugins.plain&&this.editor.__plain)this.editor.__plain.setRawData(e);else try{this.editor.setData(e)}catch(e){}t&&this.focus()}},e.prototype.init=function(){var e=this;if(this.element&&!this.editor){var t=function(){var t=d.htmlEditorDefaultConfig,n=f.settingsGet("Language"),i=!!f.appSettingsGet("allowHtmlEditorSourceButton"),o=!!f.appSettingsGet("allowHtmlEditorBitiButtons");!i&&o||t.toolbarGroups.__cfgInited||(t.toolbarGroups.__cfgInited=!0,i&&(t.removeButtons=t.removeButtons.replace(",Source","")),o||(t.removePlugins+=(t.removePlugins?",":"")+"bidi")),t.enterMode=r.a.CKEDITOR.ENTER_BR,t.shiftEnterMode=r.a.CKEDITOR.ENTER_P,t.language=d.htmlEditorLangsMap[(n||"en").toLowerCase()]||"en",r.a.CKEDITOR.env&&(r.a.CKEDITOR.env.isCompatible=!0),e.editor=r.a.CKEDITOR.appendTo(e.element,t),e.editor.on("key",function(e){return!e||!e.data||p.EventKeyCode.Tab!==e.data.keyCode}),e.editor.on("blur",function(){e.blurTrigger()}),e.editor.on("mode",function(){e.blurTrigger(),e.onModeChange&&e.onModeChange("plain"!==e.editor.mode)}),e.editor.on("focus",function(){e.focusTrigger()}),r.a.FileReader&&e.editor.on("drop",function(t){if(0')},o.readAsDataURL(n),t.data.dataTransfer.setData("text/html",i)}}}),e.editor.on("instanceReady",function(){e.editor.removeMenuItem&&(e.editor.removeMenuItem("cut"),e.editor.removeMenuItem("copy"),e.editor.removeMenuItem("paste")),e.__resizable=!0,e.__inited=!0,e.resize(),e.onReady&&e.onReady()})};r.a.CKEDITOR?t():r.a.__initEditor=t}},e.prototype.focus=function(){if(this.editor)try{this.editor.focus()}catch(e){}},e.prototype.hasFocus=function(){if(this.editor)try{return!!this.editor.focusManager.hasFocus}catch(e){}return!1},e.prototype.blur=function(){if(this.editor)try{this.editor.focusManager.blur(!0)}catch(e){}},e.prototype.resizeEditor=function(){if(this.editor&&this.__resizable)try{this.editor.resize(this.$element.width(),this.$element.innerHeight())}catch(e){}},e.prototype.setReadOnly=function(e){if(this.editor)try{this.editor.setReadOnly(!!e)}catch(e){}},e.prototype.clear=function(e){this.setHtml("",e)},e}()}, -/*!************************************!*\ - !*** external "window.Autolinker" ***! - \************************************/ -/*! no static exports found */ -/*! exports used: default */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports=window.Autolinker}, -/*!*****************************************!*\ - !*** ./node_modules/pikaday/pikaday.js ***! - \*****************************************/ -/*! no static exports found */ -/*! exports used: default */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){ -/*! - * Pikaday - * - * Copyright © 2014 David Bushell | BSD & MIT license | https://github.com/dbushell/Pikaday - */ -!function(t,i){"use strict";var o;try{o=n(/*! moment */54)}catch(e){}e.exports=function(e){var t="function"==typeof e,n=!!window.addEventListener,i=window.document,o=window.setTimeout,a=function(e,t,i,o){n?e.addEventListener(t,i,!!o):e.attachEvent("on"+t,i)},r=function(e,t,i,o){n?e.removeEventListener(t,i,!!o):e.detachEvent("on"+t,i)},s=function(e,t){return-1!==(" "+e.className+" ").indexOf(" "+t+" ")},c=function(e){return/Array/.test(Object.prototype.toString.call(e))},l=function(e){return/Date/.test(Object.prototype.toString.call(e))&&!isNaN(e.getTime())},u=function(e){var t=e.getDay();return 0===t||6===t},d=function(e,t){return[31,function(e){return e%4==0&&e%100!=0||e%400==0}(e)?29:28,31,30,31,30,31,31,30,31,30,31][t]},p=function(e){l(e)&&e.setHours(0,0,0,0)},f=function(e,t){return e.getTime()===t.getTime()},m=function(e,t,n){var i,o;for(i in t)(o=void 0!==e[i])&&"object"==typeof t[i]&&null!==t[i]&&void 0===t[i].nodeName?l(t[i])?n&&(e[i]=new Date(t[i].getTime())):c(t[i])?n&&(e[i]=t[i].slice(0)):e[i]=m({},t[i],n):!n&&o||(e[i]=t[i]);return e},h=function(e,t,n){var o;i.createEvent?((o=i.createEvent("HTMLEvents")).initEvent(t,!0,!1),o=m(o,n),e.dispatchEvent(o)):i.createEventObject&&(o=i.createEventObject(),o=m(o,n),e.fireEvent("on"+t,o))},g=function(e){return e.month<0&&(e.year-=Math.ceil(Math.abs(e.month)/12),e.month+=12),e.month>11&&(e.year+=Math.floor(Math.abs(e.month)/12),e.month-=12),e},b={field:null,bound:void 0,position:"bottom left",reposition:!0,format:"YYYY-MM-DD",toString:null,parse:null,defaultDate:null,setDefaultDate:!1,firstDay:0,formatStrict:!1,minDate:null,maxDate:null,yearRange:10,showWeekNumber:!1,pickWholeWeek:!1,minYear:0,maxYear:9999,minMonth:void 0,maxMonth:void 0,startRange:null,endRange:null,isRTL:!1,yearSuffix:"",showMonthAfterYear:!1,showDaysInNextAndPreviousMonths:!1,enableSelectionDaysInNextAndPreviousMonths:!1,numberOfMonths:1,mainCalendar:"left",container:void 0,blurFieldOnSelect:!0,i18n:{previousMonth:"Previous Month",nextMonth:"Next Month",months:["January","February","March","April","May","June","July","August","September","October","November","December"],weekdays:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],weekdaysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},theme:null,events:[],onSelect:null,onOpen:null,onClose:null,onDraw:null,keyboardInput:!0},v=function(e,t,n){for(t+=e.firstDay;t>=7;)t-=7;return n?e.i18n.weekdaysShort[t]:e.i18n.weekdays[t]},S=function(e){var t=[],n="false";if(e.isEmpty){if(!e.showDaysInNextAndPreviousMonths)return'';t.push("is-outside-current-month"),e.enableSelectionDaysInNextAndPreviousMonths||t.push("is-selection-disabled")}return e.isDisabled&&t.push("is-disabled"),e.isToday&&t.push("is-today"),e.isSelected&&(t.push("is-selected"),n="true"),e.hasEvent&&t.push("has-event"),e.isInRange&&t.push("is-inrange"),e.isStartRange&&t.push("is-startrange"),e.isEndRange&&t.push("is-endrange"),'"},y=function(e,t,n,i){return''+(t?e.reverse():e).join("")+""},w=function(e,t,n,i,o,a){var r,s,l,u,d,p=e._o,f=n===p.minYear,m=n===p.maxYear,h='
',g=!0,b=!0;for(l=[],r=0;r<12;r++)l.push('");for(u='
'+p.i18n.months[i]+'
",c(p.yearRange)?(r=p.yearRange[0],s=p.yearRange[1]+1):(r=n-p.yearRange,s=1+n+p.yearRange),l=[];r=p.minYear&&l.push('");return d='
'+n+p.yearSuffix+'
",p.showMonthAfterYear?h+=d+u:h+=u+d,f&&(0===i||p.minMonth>=i)&&(g=!1),m&&(11===i||p.maxMonth<=i)&&(b=!1),0===t&&(h+='"),t===e._o.numberOfMonths-1&&(h+='"),h+="
"},A=function(r){var c=this,u=c.config(r);c._onMouseDown=function(e){if(c._v){var t=(e=e||window.event).target||e.srcElement;if(t)if(s(t,"is-disabled")||(!s(t,"pika-button")||s(t,"is-empty")||s(t.parentNode,"is-disabled")?s(t,"pika-prev")?c.prevMonth():s(t,"pika-next")&&c.nextMonth():(c.setDate(new Date(t.getAttribute("data-pika-year"),t.getAttribute("data-pika-month"),t.getAttribute("data-pika-day"))),u.bound&&o(function(){c.hide(),u.blurFieldOnSelect&&u.field&&u.field.blur()},100))),s(t,"pika-select"))c._c=!0;else{if(!e.preventDefault)return e.returnValue=!1,!1;e.preventDefault()}}},c._onChange=function(e){var t=(e=e||window.event).target||e.srcElement;t&&(s(t,"pika-select-month")?c.gotoMonth(t.value):s(t,"pika-select-year")&&c.gotoYear(t.value))},c._onKeyChange=function(e){if(e=e||window.event,c.isVisible())switch(e.keyCode){case 13:case 27:u.field&&u.field.blur();break;case 37:e.preventDefault(),c.adjustDate("subtract",1);break;case 38:c.adjustDate("subtract",7);break;case 39:c.adjustDate("add",1);break;case 40:c.adjustDate("add",7)}},c._onInputChange=function(n){var i;n.firedBy!==c&&(i=u.parse?u.parse(u.field.value,u.format):t?(i=e(u.field.value,u.format,u.formatStrict))&&i.isValid()?i.toDate():null:new Date(Date.parse(u.field.value)),l(i)&&c.setDate(i),c._v||c.show())},c._onInputFocus=function(){c.show()},c._onInputClick=function(){c.show()},c._onInputBlur=function(){var e=i.activeElement;do{if(s(e,"pika-single"))return}while(e=e.parentNode);c._c||(c._b=o(function(){c.hide()},50)),c._c=!1},c._onClick=function(e){var t=(e=e||window.event).target||e.srcElement,i=t;if(t){!n&&s(t,"pika-select")&&(t.onchange||(t.setAttribute("onchange","return;"),a(t,"change",c._onChange)));do{if(s(i,"pika-single")||i===u.trigger)return}while(i=i.parentNode);c._v&&t!==u.trigger&&i!==u.trigger&&c.hide()}},c.el=i.createElement("div"),c.el.className="pika-single"+(u.isRTL?" is-rtl":"")+(u.theme?" "+u.theme:""),a(c.el,"mousedown",c._onMouseDown,!0),a(c.el,"touchend",c._onMouseDown,!0),a(c.el,"change",c._onChange),u.keyboardInput&&a(i,"keydown",c._onKeyChange),u.field&&(u.container?u.container.appendChild(c.el):u.bound?i.body.appendChild(c.el):u.field.parentNode.insertBefore(c.el,u.field.nextSibling),a(u.field,"change",c._onInputChange),u.defaultDate||(t&&u.field.value?u.defaultDate=e(u.field.value,u.format).toDate():u.defaultDate=new Date(Date.parse(u.field.value)),u.setDefaultDate=!0));var d=u.defaultDate;l(d)?u.setDefaultDate?c.setDate(d,!0):c.gotoDate(d):c.gotoDate(new Date),u.bound?(this.hide(),c.el.className+=" is-bound",a(u.trigger,"click",c._onInputClick),a(u.trigger,"focus",c._onInputFocus),a(u.trigger,"blur",c._onInputBlur)):this.show()};return A.prototype={config:function(e){this._o||(this._o=m({},b,!0));var t=m(this._o,e,!0);t.isRTL=!!t.isRTL,t.field=t.field&&t.field.nodeName?t.field:null,t.theme="string"==typeof t.theme&&t.theme?t.theme:null,t.bound=!!(void 0!==t.bound?t.field&&t.bound:t.field),t.trigger=t.trigger&&t.trigger.nodeName?t.trigger:t.field,t.disableWeekends=!!t.disableWeekends,t.disableDayFn="function"==typeof t.disableDayFn?t.disableDayFn:null;var n=parseInt(t.numberOfMonths,10)||1;if(t.numberOfMonths=n>4?4:n,l(t.minDate)||(t.minDate=!1),l(t.maxDate)||(t.maxDate=!1),t.minDate&&t.maxDate&&t.maxDate100&&(t.yearRange=100);return t},toString:function(n){return n=n||this._o.format,l(this._d)?this._o.toString?this._o.toString(this._d,n):t?e(this._d).format(n):this._d.toDateString():""},getMoment:function(){return t?e(this._d):null},setMoment:function(n,i){t&&e.isMoment(n)&&this.setDate(n.toDate(),i)},getDate:function(){return l(this._d)?new Date(this._d.getTime()):null},setDate:function(e,t){if(!e)return this._d=null,this._o.field&&(this._o.field.value="",h(this._o.field,"change",{firedBy:this})),this.draw();if("string"==typeof e&&(e=new Date(Date.parse(e))),l(e)){var n=this._o.minDate,i=this._o.maxDate;l(n)&&ei&&(e=i),this._d=new Date(e.getTime()),p(this._d),this.gotoDate(this._d),this._o.field&&(this._o.field.value=this.toString(),h(this._o.field,"change",{firedBy:this})),t||"function"!=typeof this._o.onSelect||this._o.onSelect.call(this,this.getDate())}},gotoDate:function(e){var t=!0;if(l(e)){if(this.calendars){var n=new Date(this.calendars[0].year,this.calendars[0].month,1),i=new Date(this.calendars[this.calendars.length-1].year,this.calendars[this.calendars.length-1].month,1),o=e.getTime();i.setMonth(i.getMonth()+1),i.setDate(i.getDate()-1),t=o=a&&(this._y=a,!isNaN(s)&&this._m>s&&(this._m=s)),t="pika-title-"+Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,2);for(var l=0;l'+w(this,l,this.calendars[l].year,this.calendars[l].month,this.calendars[0].year,t)+this.render(this.calendars[l].year,this.calendars[l].month,t)+"";this.el.innerHTML=c,n.bound&&"hidden"!==n.field.type&&o(function(){n.trigger.focus()},1),"function"==typeof this._o.onDraw&&this._o.onDraw(this),n.bound&&n.field.setAttribute("aria-label","Use the arrow keys to pick a date")}},adjustPosition:function(){var e,t,n,o,a,r,s,c,l,u;if(!this._o.container){if(this.el.style.position="absolute",t=e=this._o.trigger,n=this.el.offsetWidth,o=this.el.offsetHeight,a=window.innerWidth||i.documentElement.clientWidth,r=window.innerHeight||i.documentElement.clientHeight,s=window.pageYOffset||i.body.scrollTop||i.documentElement.scrollTop,"function"==typeof e.getBoundingClientRect)c=(u=e.getBoundingClientRect()).left+window.pageXOffset,l=u.bottom+window.pageYOffset;else for(c=t.offsetLeft,l=t.offsetTop+t.offsetHeight;t=t.offsetParent;)c+=t.offsetLeft,l+=t.offsetTop;(this._o.reposition&&c+n>a||this._o.position.indexOf("right")>-1&&c-n+e.offsetWidth>0)&&(c=c-n+e.offsetWidth),(this._o.reposition&&l+o>r+s||this._o.position.indexOf("top")>-1&&l-o-e.offsetHeight>0)&&(l=l-o-e.offsetHeight),this.el.style.left=c+"px",this.el.style.top=l+"px"}},render:function(e,t,n){var i=this._o,o=new Date,a=d(e,t),r=new Date(e,t,1).getDay(),s=[],c=[];p(o),i.firstDay>0&&(r-=i.firstDay)<0&&(r+=7);for(var m=0===t?11:t-1,h=11===t?0:t+1,g=0===t?e-1:e,b=11===t?e+1:e,w=d(g,m),A=a+r,O=A;O>7;)O-=7;A+=7-O;for(var T,C,_,E,D=!1,N=0,j=0;N=a+r,L=N-r+1,M=t,F=e,U=i.startRange&&f(i.startRange,R),H=i.endRange&&f(i.endRange,R),G=i.startRange&&i.endRange&&i.startRangei.maxDate||i.disableWeekends&&u(R)||i.disableDayFn&&i.disableDayFn(R);k&&(N'+Math.ceil(((new Date(_,C,T)-E)/864e5+E.getDay()+1)/7)+"")),s.push(y(c,i.isRTL,i.pickWholeWeek,D)),c=[],j=0,D=!1)}return function(e,t,n){return''+function(e){var t,n=[];for(e.showWeekNumber&&n.push(""),t=0;t<7;t++)n.push('");return""+(e.isRTL?n.reverse():n).join("")+""}(e)+(""+t.join("")+"")+"
'+v(e,t,!0)+"
"}(i,s,n)},isVisible:function(){return this._v},show:function(){var e,t,n;this.isVisible()||(this._v=!0,this.draw(),e=this.el,t="is-hidden",e.className=(n=(" "+e.className+" ").replace(" "+t+" "," ")).trim?n.trim():n.replace(/^\s+|\s+$/g,""),this._o.bound&&(a(i,"click",this._onClick),this.adjustPosition()),"function"==typeof this._o.onOpen&&this._o.onOpen.call(this))},hide:function(){var e,t,n=this._v;!1!==n&&(this._o.bound&&r(i,"click",this._onClick),this.el.style.position="static",this.el.style.left="auto",this.el.style.top="auto",e=this.el,s(e,t="is-hidden")||(e.className=""===e.className?t:e.className+" "+t),this._v=!1,void 0!==n&&"function"==typeof this._o.onClose&&this._o.onClose.call(this))},destroy:function(){var e=this._o;this.hide(),r(this.el,"mousedown",this._onMouseDown,!0),r(this.el,"touchend",this._onMouseDown,!0),r(this.el,"change",this._onChange),e.keyboardInput&&r(i,"keydown",this._onKeyChange),e.field&&(r(e.field,"change",this._onInputChange),e.bound&&(r(e.trigger,"click",this._onInputClick),r(e.trigger,"focus",this._onInputFocus),r(e.trigger,"blur",this._onInputBlur))),this.el.parentNode&&this.el.parentNode.removeChild(this.el)}},A}(o)}()}, -/*!*******************************!*\ - !*** ./dev/View/Popup/Ask.js ***! - \*******************************/ -/*! exports provided: AskPopupView, default */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./dev/App/User.js (referenced with cjs require), ./dev/View/Popup/Compose.js (referenced with cjs require), ./dev/View/Popup/Plugin.js (referenced with cjs require) */, -/*!*******************************!*\ - !*** ./dev/View/Popup/Ask.js ***! - \*******************************/ -/*! exports provided: AskPopupView, default */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./dev/App/User.js (referenced with cjs require), ./dev/View/Popup/Compose.js (referenced with cjs require), ./dev/View/Popup/Plugin.js (referenced with cjs require) */function(e,t,n){"use strict";n.r(t),n.d(t,"AskPopupView",function(){return v}),n.d(t,"default",function(){return v});var i,o=n(/*! babel-runtime/helpers/classCallCheck */8),a=n.n(o),r=n(/*! babel-runtime/helpers/possibleConstructorReturn */12),s=n.n(r),c=n(/*! babel-runtime/helpers/inherits */11),l=n.n(c),u=n(/*! ko */1),d=n(/*! key */19),p=n.n(d),f=n(/*! Common/Enums */0),m=n(/*! Common/Utils */2),h=n(/*! Common/Translator */10),g=n(/*! Knoin/Knoin */9),b=n(/*! Knoin/AbstractViewNext */24),v=Object(g.popup)({name:"View/Popup/Ask",templateID:"PopupsAsk"})(i=function(e){function t(){a()(this,t);var n=s()(this,e.call(this));return n.askDesc=u.a.observable(""),n.yesButton=u.a.observable(""),n.noButton=u.a.observable(""),n.yesFocus=u.a.observable(!1),n.noFocus=u.a.observable(!1),n.fYesAction=null,n.fNoAction=null,n.bFocusYesOnShow=!0,n.bDisabeCloseOnEsc=!0,n.sDefaultKeyScope=f.KeyState.PopupAsk,n}return l()(t,e),t.prototype.clearPopup=function(){this.askDesc(""),this.yesButton(Object(h.i18n)("POPUPS_ASK/BUTTON_YES")),this.noButton(Object(h.i18n)("POPUPS_ASK/BUTTON_NO")),this.yesFocus(!1),this.noFocus(!1),this.fYesAction=null,this.fNoAction=null},t.prototype.yesClick=function(){this.cancelCommand(),Object(m.isFunc)(this.fYesAction)&&this.fYesAction.call(null)},t.prototype.noClick=function(){this.cancelCommand(),Object(m.isFunc)(this.fNoAction)&&this.fNoAction.call(null)},t.prototype.onShow=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",a=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];this.clearPopup(),this.fYesAction=t||null,this.fNoAction=n||null,this.askDesc(e||""),i&&this.yesButton(i),o&&this.noButton(o),this.bFocusYesOnShow=!!a},t.prototype.onShowWithDelay=function(){this.bFocusYesOnShow&&this.yesFocus(!0)},t.prototype.onBuild=function(){var e=this;p()("tab, shift+tab, right, left",f.KeyState.PopupAsk,function(){return e.yesFocus()?e.noFocus(!0):e.yesFocus(!0),!1}),p()("esc",f.KeyState.PopupAsk,function(){return e.noClick(),!1})},t}(b.a))||i}, -/*!*************************************!*\ - !*** ./dev/View/Popup/Languages.js ***! - \*************************************/ -/*! exports provided: LanguagesPopupView, default */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./dev/Settings/Admin/General.js (referenced with cjs require), ./dev/Settings/User/General.js (referenced with cjs require), ./dev/View/User/Login.js (referenced with cjs require) */, -/*!*************************************!*\ - !*** ./dev/View/Popup/Languages.js ***! - \*************************************/ -/*! exports provided: LanguagesPopupView, default */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./dev/Settings/Admin/General.js (referenced with cjs require), ./dev/Settings/User/General.js (referenced with cjs require), ./dev/View/User/Login.js (referenced with cjs require) */function(e,t,n){"use strict";n.r(t),n.d(t,"LanguagesPopupView",function(){return g}),n.d(t,"default",function(){return g});var i,o=n(/*! babel-runtime/helpers/classCallCheck */8),a=n.n(o),r=n(/*! babel-runtime/helpers/possibleConstructorReturn */12),s=n.n(r),c=n(/*! babel-runtime/helpers/inherits */11),l=n.n(c),u=n(/*! _ */4),d=n.n(u),p=n(/*! ko */1),f=n(/*! Common/Utils */2),m=n(/*! Knoin/Knoin */9),h=n(/*! Knoin/AbstractViewNext */24),g=Object(m.popup)({name:"View/Popup/Languages",templateID:"PopupsLanguages"})(i=function(e){function t(){a()(this,t);var n=s()(this,e.call(this));return n.fLang=null,n.userLanguage=p.a.observable(""),n.langs=p.a.observableArray([]),n.languages=p.a.computed(function(){var e=n.userLanguage();return d.a.map(n.langs(),function(t){return{key:t,user:t===e,selected:p.a.observable(!1),fullName:Object(f.convertLangName)(t)}})}),n.langs.subscribe(function(){n.setLanguageSelection()}),n}return l()(t,e),t.prototype.languageTooltipName=function(e){var t=Object(f.convertLangName)(e,!0);return Object(f.convertLangName)(e,!1)===t?"":t},t.prototype.setLanguageSelection=function(){var e=this.fLang?p.a.unwrap(this.fLang):"";d.a.each(this.languages(),function(t){t.selected(t.key===e)})},t.prototype.onBeforeShow=function(){this.fLang=null,this.userLanguage(""),this.langs([])},t.prototype.onShow=function(e,t,n){this.fLang=e,this.userLanguage(n||""),this.langs(t)},t.prototype.changeLanguage=function(e){this.fLang&&this.fLang(e),this.cancelCommand()},t}(h.a))||i}, -/*!**************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_object-gopn.js ***! - \**************************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_object-keys-internal */104),o=n(/*! ./_enum-bug-keys */84).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return i(e,o)}}, -/*!**************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_object-gops.js ***! - \**************************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){t.f=Object.getOwnPropertySymbols}, -/*!***********************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_object-keys-internal.js ***! - \***********************************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_has */46),o=n(/*! ./_to-iobject */43),a=n(/*! ./_array-includes */163)(!1),r=n(/*! ./_shared-key */86)("IE_PROTO");e.exports=function(e,t){var n,s=o(e),c=0,l=[];for(n in s)n!=r&&i(s,n)&&l.push(n);for(;t.length>c;)i(s,n=t[c++])&&(~a(l,n)||l.push(n));return l}}, -/*!***********************************************************!*\ - !*** ./node_modules/core-js/library/modules/_redefine.js ***! - \***********************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){e.exports=n(/*! ./_hide */53)}, -/*!**************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_iter-define.js ***! - \**************************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){"use strict";var i=n(/*! ./_library */90),o=n(/*! ./_export */58),a=n(/*! ./_redefine */105),r=n(/*! ./_hide */53),s=n(/*! ./_has */46),c=n(/*! ./_iterators */89),l=n(/*! ./_iter-create */165),u=n(/*! ./_set-to-string-tag */83),d=n(/*! ./_object-gpo */159),p=n(/*! ./_wks */60)("iterator"),f=!([].keys&&"next"in[].keys()),m=function(){return this};e.exports=function(e,t,n,h,g,b,v){l(n,t,h);var S,y,w,A=function(e){if(!f&&e in _)return _[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},O=t+" Iterator",T="values"==g,C=!1,_=e.prototype,E=_[p]||_["@@iterator"]||g&&_[g],D=E||A(g),N=g?T?A("entries"):D:void 0,j="Array"==t&&_.entries||E;if(j&&(w=d(j.call(new e)))!==Object.prototype&&w.next&&(u(w,O,!0),i||s(w,p)||r(w,p,m)),T&&E&&"values"!==E.name&&(C=!0,D=function(){return E.call(this)}),i&&!v||!f&&!C&&_[p]||r(_,p,D),c[t]=D,c[O]=m,g)if(S={values:T?D:A("values"),keys:b?D:A("keys"),entries:N},v)for(y in S)y in _||a(_,y,S[y]);else o(o.P+o.F*(f||C),t,S);return S}}, -/*!******************************************************!*\ - !*** ./node_modules/babel-runtime/helpers/typeof.js ***! - \******************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){"use strict";t.__esModule=!0;var i=r(n(/*! ../core-js/symbol/iterator */169)),o=r(n(/*! ../core-js/symbol */153)),a="function"==typeof o.default&&"symbol"==typeof i.default?function(e){return typeof e}:function(e){return e&&"function"==typeof o.default&&e.constructor===o.default&&e!==o.default.prototype?"symbol":typeof e};function r(e){return e&&e.__esModule?e:{default:e}}t.default="function"==typeof o.default&&"symbol"===a(i.default)?function(e){return void 0===e?"undefined":a(e)}:function(e){return e&&"function"==typeof o.default&&e.constructor===o.default&&e!==o.default.prototype?"symbol":void 0===e?"undefined":a(e)}}, -/*!*************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_object-sap.js ***! - \*************************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_export */58),o=n(/*! ./_core */40),a=n(/*! ./_fails */51);e.exports=function(e,t){var n=(o.Object||{})[e]||Object[e],r={};r[e]=t(n),i(i.S+i.F*a(function(){n(1)}),"Object",r)}}, -/*!**********************************************************!*\ - !*** ./node_modules/core-js/library/modules/_iobject.js ***! - \**********************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_cof */92);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==i(e)?e.split(""):Object(e)}}, -/*!****************************************************************************************!*\ - !*** ./node_modules/core-js/library/modules/es6.object.get-own-property-descriptor.js ***! - \****************************************************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){var i=n(/*! ./_to-iobject */43),o=n(/*! ./_object-gopd */72).f;n(/*! ./_object-sap */108)("getOwnPropertyDescriptor",function(){return function(e,t){return o(i(e),t)}})}, -/*!*******************************************************************************!*\ - !*** ./node_modules/core-js/library/fn/object/get-own-property-descriptor.js ***! - \*******************************************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t,n){n(/*! ../../modules/es6.object.get-own-property-descriptor */110);var i=n(/*! ../../modules/_core */40).Object;e.exports=function(e,t){return i.getOwnPropertyDescriptor(e,t)}}, -/*!*************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_a-function.js ***! - \*************************************************************/ -/*! no static exports found */ -/*! all exports used */ -/*! ModuleConcatenation bailout: Module is not an ECMAScript module */function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}}, -/*!*****************************************!*\ - !*** ./dev/App/Abstract.js + 2 modules ***! - \*****************************************/ -/*! exports provided: AbstractApp, default */ -/*! exports used: AbstractApp */ -/*! ModuleConcatenation bailout: Cannot concat with ./dev/Common/Enums.js because of ./dev/app.js */ -/*! ModuleConcatenation bailout: Cannot concat with ./dev/Common/Events.js because of ./dev/App/User.js */ -/*! ModuleConcatenation bailout: Cannot concat with ./dev/Common/Globals.js (<- Module is referenced from these modules with unsupported syntax: ./dev/External/ko.js (referenced with cjs require)) */ -/*! ModuleConcatenation bailout: Cannot concat with ./dev/Common/Links.js because of ./dev/App/Admin.js */ -/*! ModuleConcatenation bailout: Cannot concat with ./dev/Common/Translator.js (<- Module is referenced from these modules with unsupported syntax: ./dev/Common/Utils.js (referenced with cjs require), ./dev/External/ko.js (referenced with cjs require)) */ -/*! ModuleConcatenation bailout: Cannot concat with ./dev/Common/Utils.js (<- Module is referenced from these modules with unsupported syntax: ./dev/External/ko.js (referenced with cjs require)) */ -/*! ModuleConcatenation bailout: Cannot concat with ./dev/External/ko.js because of ./dev/App/Admin.js */ -/*! ModuleConcatenation bailout: Cannot concat with ./dev/Knoin/Knoin.js (<- Module is referenced from these modules with unsupported syntax: ./dev/Common/Plugins.js (referenced with cjs require), ./dev/Common/Utils.js (referenced with cjs require)) */ -/*! ModuleConcatenation bailout: Cannot concat with ./dev/Storage/Settings.js (<- Module is referenced from these modules with unsupported syntax: ./dev/External/ko.js (referenced with cjs require)) */ -/*! ModuleConcatenation bailout: Cannot concat with ./dev/Stores/Language.js because of ./dev/Settings/Admin/General.js */ -/*! ModuleConcatenation bailout: Cannot concat with ./dev/Stores/Social.js because of ./dev/App/User.js */ -/*! ModuleConcatenation bailout: Cannot concat with ./dev/Stores/Theme.js because of ./dev/Settings/Admin/General.js */ -/*! ModuleConcatenation bailout: Cannot concat with ./node_modules/babel-runtime/helpers/classCallCheck.js (<- Module is not an ECMAScript module) */ -/*! ModuleConcatenation bailout: Cannot concat with ./node_modules/babel-runtime/helpers/inherits.js (<- Module is not an ECMAScript module) */ -/*! ModuleConcatenation bailout: Cannot concat with ./node_modules/babel-runtime/helpers/possibleConstructorReturn.js (<- Module is not an ECMAScript module) */ -/*! ModuleConcatenation bailout: Cannot concat with external "window" (<- Module is not an ECMAScript module) */ -/*! ModuleConcatenation bailout: Cannot concat with external "window._" (<- Module is not an ECMAScript module) */ -/*! ModuleConcatenation bailout: Cannot concat with external "window.jQuery" (<- Module is not an ECMAScript module) */ -/*! ModuleConcatenation bailout: Cannot concat with external "window.key" (<- Module is not an ECMAScript module) */ -/*! ModuleConcatenation bailout: Cannot concat with external "window.ssm" (<- Module is not an ECMAScript module) */function(e,t,n){"use strict";var i=n(8),o=n.n(i),a=n(12),r=n.n(a),s=n(11),c=n.n(s),l=n(3),u=n.n(l),d=n(7),p=n.n(d),f=n(4),m=n.n(f),h=n(1),g=n(19),b=n.n(g),v=n(66),S=n.n(v),y=n(6),w=n(2),A=n(0),O=n(16),T=n(10),C=n(5),_=n(39),E=n(32),D=null,N=null;var j=function(){function e(t){o()(this,e),this.dom=null,this.opened=h.a.observable(!1),this.cmd=h.a.observable(""),this.focused=h.a.observable(!1),this.themes=_.a.themes,this.cmdHistory=[],this.cmdHistoryShift=0,this.cmdHelper=h.a.observable(""),this.cmds=["help","version","clear","theme","lang"],this.cmdsWithParameters=["theme","lang"],this.isAdmin=!1,this.dom=t,this.isAdmin=!!C.appSettingsGet("admin")}return e.prototype.runCmd=function(e,t,i){var o,a,r,s="",c=null;if(this.cmdHelper(""),i){switch(e){case"lang":c=(this.isAdmin?E.a.languagesAdmin():E.a.languages()).filter(function(e){return 0===e.lastIndexOf(t,0)});break;case"theme":c=_.a.themes().filter(function(e){return 0===e.lastIndexOf(t,0)})}if(e&&c)if(1===c.length&&c[0])this.cmd(e+" "+c[0]);else if(1").html(n(/*! Html/Cmds/Main.html */129).replace("{{ cmd }}",i))),c&&l.append(p()("
").html(c)),m.a.delay(function(){t.dom.find(".rl-cmd-history").scrollTop(l.height())},50))}return!0},e.prototype.onEsc=function(){return this.opened(!1),!1},e.prototype.onTab=function(){return this.onCmd(!0),!1},e.prototype.onEnter=function(){return this.onCmd(!1),this.cmd(""),!1},e.prototype.onKeyDown=function(e){if(e&&e.keyCode&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&0")).appendTo(y.$body),e=D,N||(N=new j(e),h.a.applyBindingAccessorsToNode(e[0],{translatorInit:!0,template:function(){return{name:"Cmd"}}},N)))}var I=n(22),x=n(25),P=n(9),k=function(){function e(){o()(this,e)}return e.prototype.bootstart=function(){},e}();n.d(t,"a",function(){return L});var L=function(e){function t(n){o()(this,t);var i=r()(this,e.call(this));return i.googlePreviewSupportedCache=null,i.isLocalAutocomplete=!0,i.iframe=null,i.lastErrorTime=0,i.iframe=p()('');else if(m){var s="";s=r&&r.youtube?"lg-has-youtube":r&&r.vimeo?"lg-has-vimeo":"lg-has-html5",l.$slide.eq(c).prepend('
')}else r?(l.$slide.eq(c).prepend('
'),l.$el.trigger("hasVideo.lg",[c,g,k])):l.$slide.eq(c).prepend('
');if(l.$el.trigger("onAferAppendSlide.lg",[c]),f=l.$slide.eq(c).find(".lg-object"),j&&f.attr("sizes",j),i){f.attr("srcset",i);try{picturefill({elements:[f[0]]})}catch(t){console.error("Make sure you have included Picturefill version 2")}}".lg-sub-html"!==this.s.appendSubHtmlTo&&l.addHtml(c),l.$slide.eq(c).addClass("lg-loaded")}l.$slide.eq(c).find(".lg-object").on("load.lg error.lg",function(){var b=0;e&&!a("body").hasClass("lg-from-hash")&&(b=e),setTimeout(function(){l.$slide.eq(c).addClass("lg-complete"),l.$el.trigger("onSlideItemLoad.lg",[c,e||0])},b)}),r&&r.html5&&!m&&l.$slide.eq(c).addClass("lg-complete"),d===!0&&(l.$slide.eq(c).hasClass("lg-complete")?l.preload(c):l.$slide.eq(c).find(".lg-object").on("load.lg error.lg",function(){l.preload(c)}))},e.prototype.slide=function(b,c,d){var e=this.$outer.find(".lg-current").index(),f=this;if(!f.lGalleryOn||e!==b){var g=this.$slide.length,h=f.lGalleryOn?this.s.speed:0,i=!1,j=!1;if(!f.lgBusy){if(this.s.download){var k;k=f.s.dynamic?f.s.dynamicEl[b].downloadUrl!==!1&&(f.s.dynamicEl[b].downloadUrl||f.s.dynamicEl[b].src):"false"!==f.$items.eq(b).attr("data-download-url")&&(f.$items.eq(b).attr("data-download-url")||f.$items.eq(b).attr("href")||f.$items.eq(b).attr("data-src")),k?(a("#lg-download").attr("href",k),f.$outer.removeClass("lg-hide-download")):f.$outer.addClass("lg-hide-download")}if(this.$el.trigger("onBeforeSlide.lg",[e,b,c,d]),f.lgBusy=!0,clearTimeout(f.hideBartimeout),".lg-sub-html"===this.s.appendSubHtmlTo&&setTimeout(function(){f.addHtml(b)},h),this.arrowDisable(b),c){var l=b-1,m=b+1;0===b&&e===g-1?(m=0,l=g-1):b===g-1&&0===e&&(m=0,l=g-1),this.$slide.removeClass("lg-prev-slide lg-current lg-next-slide"),f.$slide.eq(l).addClass("lg-prev-slide"),f.$slide.eq(m).addClass("lg-next-slide"),f.$slide.eq(b).addClass("lg-current")}else f.$outer.addClass("lg-no-trans"),this.$slide.removeClass("lg-prev-slide lg-next-slide"),e>b?(j=!0,0!==b||e!==g-1||d||(j=!1,i=!0)):b>e&&(i=!0,b!==g-1||0!==e||d||(j=!0,i=!1)),j?(this.$slide.eq(b).addClass("lg-prev-slide"),this.$slide.eq(e).addClass("lg-next-slide")):i&&(this.$slide.eq(b).addClass("lg-next-slide"),this.$slide.eq(e).addClass("lg-prev-slide")),setTimeout(function(){f.$slide.removeClass("lg-current"),f.$slide.eq(b).addClass("lg-current"),f.$outer.removeClass("lg-no-trans")},50);f.lGalleryOn?(setTimeout(function(){f.loadContent(b,!0,0)},this.s.speed+50),setTimeout(function(){f.lgBusy=!1,f.$el.trigger("onAfterSlide.lg",[e,b,c,d])},this.s.speed)):(f.loadContent(b,!0,f.s.backdropDuration),f.lgBusy=!1,f.$el.trigger("onAfterSlide.lg",[e,b,c,d])),f.lGalleryOn=!0,this.s.counter&&a("#lg-counter-current").text(b+1)}}},e.prototype.goToNextSlide=function(a){var b=this;b.lgBusy||(b.index+10?(b.index--,b.$el.trigger("onBeforePrevSlide.lg",[b.index,a]),b.slide(b.index,a,!1)):b.s.loop?(b.index=b.$items.length-1,b.$el.trigger("onBeforePrevSlide.lg",[b.index,a]),b.slide(b.index,a,!1)):b.s.slideEndAnimatoin&&(b.$outer.addClass("lg-left-end"),setTimeout(function(){b.$outer.removeClass("lg-left-end")},400)))},e.prototype.keyPress=function(){var c=this;this.$items.length>1&&a(b).on("keyup.lg",function(a){c.$items.length>1&&(37===a.keyCode&&(a.preventDefault(),c.goToPrevSlide()),39===a.keyCode&&(a.preventDefault(),c.goToNextSlide()))}),a(b).on("keydown.lg",function(a){c.s.escKey===!0&&27===a.keyCode&&(a.preventDefault(),c.$outer.hasClass("lg-thumb-open")?c.$outer.removeClass("lg-thumb-open"):c.destroy())})},e.prototype.arrow=function(){var a=this;this.$outer.find(".lg-prev").on("click.lg",function(){a.goToPrevSlide()}),this.$outer.find(".lg-next").on("click.lg",function(){a.goToNextSlide()})},e.prototype.arrowDisable=function(a){!this.s.loop&&this.s.hideControlOnEnd&&(a+10?this.$outer.find(".lg-prev").removeAttr("disabled").removeClass("disabled"):this.$outer.find(".lg-prev").attr("disabled","disabled").addClass("disabled"))},e.prototype.setTranslate=function(a,b,c){this.s.useLeft?a.css("left",b):a.css({transform:"translate3d("+b+"px, "+c+"px, 0px)"})},e.prototype.touchMove=function(b,c){var d=c-b;Math.abs(d)>15&&(this.$outer.addClass("lg-dragging"),this.setTranslate(this.$slide.eq(this.index),d,0),this.setTranslate(a(".lg-prev-slide"),-this.$slide.eq(this.index).width()+d,0),this.setTranslate(a(".lg-next-slide"),this.$slide.eq(this.index).width()+d,0))},e.prototype.touchEnd=function(a){var b=this;"lg-slide"!==b.s.mode&&b.$outer.addClass("lg-slide"),this.$slide.not(".lg-current, .lg-prev-slide, .lg-next-slide").css("opacity","0"),setTimeout(function(){b.$outer.removeClass("lg-dragging"),0>a&&Math.abs(a)>b.s.swipeThreshold?b.goToNextSlide(!0):a>0&&Math.abs(a)>b.s.swipeThreshold?b.goToPrevSlide(!0):Math.abs(a)<5&&b.$el.trigger("onSlideClick.lg"),b.$slide.removeAttr("style")}),setTimeout(function(){b.$outer.hasClass("lg-dragging")||"lg-slide"===b.s.mode||b.$outer.removeClass("lg-slide")},b.s.speed+100)},e.prototype.enableSwipe=function(){var a=this,b=0,c=0,d=!1;a.s.enableSwipe&&a.isTouch&&a.doCss()&&(a.$slide.on("touchstart.lg",function(c){a.$outer.hasClass("lg-zoomed")||a.lgBusy||(c.preventDefault(),a.manageSwipeClass(),b=c.originalEvent.targetTouches[0].pageX)}),a.$slide.on("touchmove.lg",function(e){a.$outer.hasClass("lg-zoomed")||(e.preventDefault(),c=e.originalEvent.targetTouches[0].pageX,a.touchMove(b,c),d=!0)}),a.$slide.on("touchend.lg",function(){a.$outer.hasClass("lg-zoomed")||(d?(d=!1,a.touchEnd(c-b)):a.$el.trigger("onSlideClick.lg"))}))},e.prototype.enableDrag=function(){var c=this,d=0,e=0,f=!1,g=!1;c.s.enableDrag&&!c.isTouch&&c.doCss()&&(c.$slide.on("mousedown.lg",function(b){c.$outer.hasClass("lg-zoomed")||(a(b.target).hasClass("lg-object")||a(b.target).hasClass("lg-video-play"))&&(b.preventDefault(),c.lgBusy||(c.manageSwipeClass(),d=b.pageX,f=!0,c.$outer.scrollLeft+=1,c.$outer.scrollLeft-=1,c.$outer.removeClass("lg-grab").addClass("lg-grabbing"),c.$el.trigger("onDragstart.lg")))}),a(b).on("mousemove.lg",function(a){f&&(g=!0,e=a.pageX,c.touchMove(d,e),c.$el.trigger("onDragmove.lg"))}),a(b).on("mouseup.lg",function(b){g?(g=!1,c.touchEnd(e-d),c.$el.trigger("onDragend.lg")):(a(b.target).hasClass("lg-object")||a(b.target).hasClass("lg-video-play"))&&c.$el.trigger("onSlideClick.lg"),f&&(f=!1,c.$outer.removeClass("lg-grabbing").addClass("lg-grab"))}))},e.prototype.manageSwipeClass=function(){var a=this.index+1,b=this.index-1,c=this.$slide.length;this.s.loop&&(0===this.index?b=c-1:this.index===c-1&&(a=0)),this.$slide.removeClass("lg-next-slide lg-prev-slide"),b>-1&&this.$slide.eq(b).addClass("lg-prev-slide"),this.$slide.eq(a).addClass("lg-next-slide")},e.prototype.mousewheel=function(){var a=this;a.$outer.on("mousewheel.lg",function(b){b.deltaY&&(b.deltaY>0?a.goToPrevSlide():a.goToNextSlide(),b.preventDefault())})},e.prototype.closeGallery=function(){var b=this,c=!1;this.$outer.find(".lg-close").on("click.lg",function(){b.destroy()}),b.s.closable&&(b.$outer.on("mousedown.lg",function(b){c=!!(a(b.target).is(".lg-outer")||a(b.target).is(".lg-item ")||a(b.target).is(".lg-img-wrap"))}),b.$outer.on("mouseup.lg",function(d){(a(d.target).is(".lg-outer")||a(d.target).is(".lg-item ")||a(d.target).is(".lg-img-wrap")&&c)&&(b.$outer.hasClass("lg-dragging")||b.destroy())}))},e.prototype.destroy=function(c){var d=this;c||d.$el.trigger("onBeforeClose.lg"),a(b).scrollTop(d.prevScrollTop),c&&(d.s.dynamic||this.$items.off("click.lg click.lgcustom"),a.removeData(d.el,"lightGallery")),this.$el.off(".lg.tm"),a.each(a.fn.lightGallery.modules,function(a){d.modules[a]&&d.modules[a].destroy()}),this.lGalleryOn=!1,clearTimeout(d.hideBartimeout),this.hideBartimeout=!1,a(b).off(".lg"),a("body").removeClass("lg-on lg-from-hash"),d.$outer&&d.$outer.removeClass("lg-visible"),a(".lg-backdrop").removeClass("in"),setTimeout(function(){d.$outer&&d.$outer.remove(),a(".lg-backdrop").remove(),c||d.$el.trigger("onCloseAfter.lg")},d.s.backdropDuration+50)},a.fn.lightGallery=function(b){return this.each(function(){if(a.data(this,"lightGallery"))try{a(this).data("lightGallery").init()}catch(c){console.error("lightGallery has not initiated properly")}else a.data(this,"lightGallery",new e(this,b))})},a.fn.lightGallery.modules={}}(jQuery,window,document); -/*! lightgallery - v1.2.21 - 2016-06-28 -* http://sachinchoolur.github.io/lightGallery/ -* Copyright (c) 2016 Sachin N; Licensed Apache 2.0 */ -!function(a,b,c,d){"use strict";var e={fullScreen:!0},f=function(b){return this.core=a(b).data("lightGallery"),this.$el=a(b),this.core.s=a.extend({},e,this.core.s),this.init(),this};f.prototype.init=function(){var a="";if(this.core.s.fullScreen){if(!(c.fullscreenEnabled||c.webkitFullscreenEnabled||c.mozFullScreenEnabled||c.msFullscreenEnabled))return;a='',this.core.$outer.find(".lg-toolbar").append(a),this.fullScreen()}},f.prototype.requestFullscreen=function(){var a=c.documentElement;a.requestFullscreen?a.requestFullscreen():a.msRequestFullscreen?a.msRequestFullscreen():a.mozRequestFullScreen?a.mozRequestFullScreen():a.webkitRequestFullscreen&&a.webkitRequestFullscreen()},f.prototype.exitFullscreen=function(){c.exitFullscreen?c.exitFullscreen():c.msExitFullscreen?c.msExitFullscreen():c.mozCancelFullScreen?c.mozCancelFullScreen():c.webkitExitFullscreen&&c.webkitExitFullscreen()},f.prototype.fullScreen=function(){var b=this;a(c).on("fullscreenchange.lg webkitfullscreenchange.lg mozfullscreenchange.lg MSFullscreenChange.lg",function(){b.core.$outer.toggleClass("lg-fullscreen-on")}),this.core.$outer.find(".lg-fullscreen").on("click.lg",function(){c.fullscreenElement||c.mozFullScreenElement||c.webkitFullscreenElement||c.msFullscreenElement?b.exitFullscreen():b.requestFullscreen()})},f.prototype.destroy=function(){this.exitFullscreen(),a(c).off("fullscreenchange.lg webkitfullscreenchange.lg mozfullscreenchange.lg MSFullscreenChange.lg")},a.fn.lightGallery.modules.fullscreen=f}(jQuery,window,document); -/*! lightgallery - v1.2.21 - 2016-06-28 -* http://sachinchoolur.github.io/lightGallery/ -* Copyright (c) 2016 Sachin N; Licensed Apache 2.0 */ -!function(a,b,c,d){"use strict";var e={thumbnail:!0,animateThumb:!0,currentPagerPosition:"middle",thumbWidth:100,thumbContHeight:100,thumbMargin:5,exThumbImage:!1,showThumbByDefault:!0,toogleThumb:!0,pullCaptionUp:!0,enableThumbDrag:!0,enableThumbSwipe:!0,swipeThreshold:50,loadYoutubeThumbnail:!0,youtubeThumbSize:1,loadVimeoThumbnail:!0,vimeoThumbSize:"thumbnail_small",loadDailymotionThumbnail:!0},f=function(b){return this.core=a(b).data("lightGallery"),this.core.s=a.extend({},e,this.core.s),this.$el=a(b),this.$thumbOuter=null,this.thumbOuterWidth=0,this.thumbTotalWidth=this.core.$items.length*(this.core.s.thumbWidth+this.core.s.thumbMargin),this.thumbIndex=this.core.index,this.left=0,this.init(),this};f.prototype.init=function(){var a=this;this.core.s.thumbnail&&this.core.$items.length>1&&(this.core.s.showThumbByDefault&&setTimeout(function(){a.core.$outer.addClass("lg-thumb-open")},700),this.core.s.pullCaptionUp&&this.core.$outer.addClass("lg-pull-caption-up"),this.build(),this.core.s.animateThumb?(this.core.s.enableThumbDrag&&!this.core.isTouch&&this.core.doCss()&&this.enableThumbDrag(),this.core.s.enableThumbSwipe&&this.core.isTouch&&this.core.doCss()&&this.enableThumbSwipe(),this.thumbClickable=!1):this.thumbClickable=!0,this.toogle(),this.thumbkeyPress())},f.prototype.build=function(){function c(a,b,c){var d,h=e.core.isVideo(a,c)||{},i="";h.youtube||h.vimeo||h.dailymotion?h.youtube?d=e.core.s.loadYoutubeThumbnail?"//img.youtube.com/vi/"+h.youtube[1]+"/"+e.core.s.youtubeThumbSize+".jpg":b:h.vimeo?e.core.s.loadVimeoThumbnail?(d="//i.vimeocdn.com/video/error_"+g+".jpg",i=h.vimeo[1]):d=b:h.dailymotion&&(d=e.core.s.loadDailymotionThumbnail?"//www.dailymotion.com/thumbnail/video/"+h.dailymotion[1]:b):d=b,f+='
',i=""}var d,e=this,f="",g="",h='
';switch(this.core.s.vimeoThumbSize){case"thumbnail_large":g="640";break;case"thumbnail_medium":g="200x150";break;case"thumbnail_small":g="100x75"}if(e.core.$outer.addClass("lg-has-thumb"),e.core.$outer.find(".lg").append(h),e.$thumbOuter=e.core.$outer.find(".lg-thumb-outer"),e.thumbOuterWidth=e.$thumbOuter.width(),e.core.s.animateThumb&&e.core.$outer.find(".lg-thumb").css({width:e.thumbTotalWidth+"px",position:"relative"}),this.core.s.animateThumb&&e.$thumbOuter.css("height",e.core.s.thumbContHeight+"px"),e.core.s.dynamic)for(var i=0;ithis.thumbTotalWidth-this.thumbOuterWidth&&(this.left=this.thumbTotalWidth-this.thumbOuterWidth),this.left<0&&(this.left=0),this.core.lGalleryOn?(b.hasClass("on")||this.core.$outer.find(".lg-thumb").css("transition-duration",this.core.s.speed+"ms"),this.core.doCss()||b.animate({left:-this.left+"px"},this.core.s.speed)):this.core.doCss()||b.css("left",-this.left+"px"),this.setTranslate(this.left)}},f.prototype.enableThumbDrag=function(){var c=this,d=0,e=0,f=!1,g=!1,h=0;c.$thumbOuter.addClass("lg-grab"),c.core.$outer.find(".lg-thumb").on("mousedown.lg.thumb",function(a){c.thumbTotalWidth>c.thumbOuterWidth&&(a.preventDefault(),d=a.pageX,f=!0,c.core.$outer.scrollLeft+=1,c.core.$outer.scrollLeft-=1,c.thumbClickable=!1,c.$thumbOuter.removeClass("lg-grab").addClass("lg-grabbing"))}),a(b).on("mousemove.lg.thumb",function(a){f&&(h=c.left,g=!0,e=a.pageX,c.$thumbOuter.addClass("lg-dragging"),h-=e-d,h>c.thumbTotalWidth-c.thumbOuterWidth&&(h=c.thumbTotalWidth-c.thumbOuterWidth),0>h&&(h=0),c.setTranslate(h))}),a(b).on("mouseup.lg.thumb",function(){g?(g=!1,c.$thumbOuter.removeClass("lg-dragging"),c.left=h,Math.abs(e-d)a.thumbOuterWidth&&(c.preventDefault(),b=c.originalEvent.targetTouches[0].pageX,a.thumbClickable=!1)}),a.core.$outer.find(".lg-thumb").on("touchmove.lg",function(f){a.thumbTotalWidth>a.thumbOuterWidth&&(f.preventDefault(),c=f.originalEvent.targetTouches[0].pageX,d=!0,a.$thumbOuter.addClass("lg-dragging"),e=a.left,e-=c-b,e>a.thumbTotalWidth-a.thumbOuterWidth&&(e=a.thumbTotalWidth-a.thumbOuterWidth),0>e&&(e=0),a.setTranslate(e))}),a.core.$outer.find(".lg-thumb").on("touchend.lg",function(){a.thumbTotalWidth>a.thumbOuterWidth&&d?(d=!1,a.$thumbOuter.removeClass("lg-dragging"),Math.abs(c-b)'),a.core.$outer.find(".lg-toogle-thumb").on("click.lg",function(){a.core.$outer.toggleClass("lg-thumb-open")}))},f.prototype.thumbkeyPress=function(){var c=this;a(b).on("keydown.lg.thumb",function(a){38===a.keyCode?(a.preventDefault(),c.core.$outer.addClass("lg-thumb-open")):40===a.keyCode&&(a.preventDefault(),c.core.$outer.removeClass("lg-thumb-open"))})},f.prototype.destroy=function(){this.core.s.thumbnail&&this.core.$items.length>1&&(a(b).off("resize.lg.thumb orientationchange.lg.thumb keydown.lg.thumb"),this.$thumbOuter.remove(),this.core.$outer.removeClass("lg-has-thumb"))},a.fn.lightGallery.modules.Thumbnail=f}(jQuery,window,document); -/*! lightgallery - v1.2.21 - 2016-06-28 -* http://sachinchoolur.github.io/lightGallery/ -* Copyright (c) 2016 Sachin N; Licensed Apache 2.0 */ -!function(a,b,c,d){"use strict";var e={scale:1,zoom:!0,actualSize:!0,enableZoomAfter:300},f=function(c){return this.core=a(c).data("lightGallery"),this.core.s=a.extend({},e,this.core.s),this.core.s.zoom&&this.core.doCss()&&(this.init(),this.zoomabletimeout=!1,this.pageX=a(b).width()/2,this.pageY=a(b).height()/2+a(b).scrollTop()),this};f.prototype.init=function(){var c=this,d='';c.core.s.actualSize&&(d+=''),this.core.$outer.find(".lg-toolbar").append(d),c.core.$el.on("onSlideItemLoad.lg.tm.zoom",function(b,d,e){var f=c.core.s.enableZoomAfter+e;a("body").hasClass("lg-from-hash")&&e?f=0:a("body").removeClass("lg-from-hash"),c.zoomabletimeout=setTimeout(function(){c.core.$slide.eq(d).addClass("lg-zoomable")},f+30)});var e=1,f=function(d){var e,f,g=c.core.$outer.find(".lg-current .lg-image"),h=(a(b).width()-g.width())/2,i=(a(b).height()-g.height())/2+a(b).scrollTop();e=c.pageX-h,f=c.pageY-i;var j=(d-1)*e,k=(d-1)*f;g.css("transform","scale3d("+d+", "+d+", 1)").attr("data-scale",d),g.parent().css({left:-j+"px",top:-k+"px"}).attr("data-x",j).attr("data-y",k)},g=function(){e>1?c.core.$outer.addClass("lg-zoomed"):c.resetZoom(),1>e&&(e=1),f(e)},h=function(d,f,h,i){var j,k=f.width();j=c.core.s.dynamic?c.core.s.dynamicEl[h].width||f[0].naturalWidth||k:c.core.$items.eq(h).attr("data-width")||f[0].naturalWidth||k;var l;c.core.$outer.hasClass("lg-zoomed")?e=1:j>k&&(l=j/k,e=l||2),i?(c.pageX=a(b).width()/2,c.pageY=a(b).height()/2+a(b).scrollTop()):(c.pageX=d.pageX||d.originalEvent.targetTouches[0].pageX,c.pageY=d.pageY||d.originalEvent.targetTouches[0].pageY),g(),setTimeout(function(){c.core.$outer.removeClass("lg-grabbing").addClass("lg-grab")},10)},i=!1;c.core.$el.on("onAferAppendSlide.lg.tm.zoom",function(a,b){var d=c.core.$slide.eq(b).find(".lg-image");d.on("dblclick",function(a){h(a,d,b)}),d.on("touchstart",function(a){i?(clearTimeout(i),i=null,h(a,d,b)):i=setTimeout(function(){i=null},300),a.preventDefault()})}),a(b).on("resize.lg.zoom scroll.lg.zoom orientationchange.lg.zoom",function(){c.pageX=a(b).width()/2,c.pageY=a(b).height()/2+a(b).scrollTop(),f(e)}),a("#lg-zoom-out").on("click.lg",function(){c.core.$outer.find(".lg-current .lg-image").length&&(e-=c.core.s.scale,g())}),a("#lg-zoom-in").on("click.lg",function(){c.core.$outer.find(".lg-current .lg-image").length&&(e+=c.core.s.scale,g())}),a("#lg-actual-size").on("click.lg",function(a){h(a,c.core.$slide.eq(c.core.index).find(".lg-image"),c.core.index,!0)}),c.core.$el.on("onBeforeSlide.lg.tm",function(){e=1,c.resetZoom()}),c.core.isTouch||c.zoomDrag(),c.core.isTouch&&c.zoomSwipe()},f.prototype.resetZoom=function(){this.core.$outer.removeClass("lg-zoomed"),this.core.$slide.find(".lg-img-wrap").removeAttr("style data-x data-y"),this.core.$slide.find(".lg-image").removeAttr("style data-scale"),this.pageX=a(b).width()/2,this.pageY=a(b).height()/2+a(b).scrollTop()},f.prototype.zoomSwipe=function(){var a=this,b={},c={},d=!1,e=!1,f=!1;a.core.$slide.on("touchstart.lg",function(c){if(a.core.$outer.hasClass("lg-zoomed")){var d=a.core.$slide.eq(a.core.index).find(".lg-object");f=d.outerHeight()*d.attr("data-scale")>a.core.$outer.find(".lg").height(),e=d.outerWidth()*d.attr("data-scale")>a.core.$outer.find(".lg").width(),(e||f)&&(c.preventDefault(),b={x:c.originalEvent.targetTouches[0].pageX,y:c.originalEvent.targetTouches[0].pageY})}}),a.core.$slide.on("touchmove.lg",function(g){if(a.core.$outer.hasClass("lg-zoomed")){var h,i,j=a.core.$slide.eq(a.core.index).find(".lg-img-wrap");g.preventDefault(),d=!0,c={x:g.originalEvent.targetTouches[0].pageX,y:g.originalEvent.targetTouches[0].pageY},a.core.$outer.addClass("lg-zoom-dragging"),i=f?-Math.abs(j.attr("data-y"))+(c.y-b.y):-Math.abs(j.attr("data-y")),h=e?-Math.abs(j.attr("data-x"))+(c.x-b.x):-Math.abs(j.attr("data-x")),(Math.abs(c.x-b.x)>15||Math.abs(c.y-b.y)>15)&&j.css({left:h+"px",top:i+"px"})}}),a.core.$slide.on("touchend.lg",function(){a.core.$outer.hasClass("lg-zoomed")&&d&&(d=!1,a.core.$outer.removeClass("lg-zoom-dragging"),a.touchendZoom(b,c,e,f))})},f.prototype.zoomDrag=function(){var c=this,d={},e={},f=!1,g=!1,h=!1,i=!1;c.core.$slide.on("mousedown.lg.zoom",function(b){var e=c.core.$slide.eq(c.core.index).find(".lg-object");i=e.outerHeight()*e.attr("data-scale")>c.core.$outer.find(".lg").height(),h=e.outerWidth()*e.attr("data-scale")>c.core.$outer.find(".lg").width(),c.core.$outer.hasClass("lg-zoomed")&&a(b.target).hasClass("lg-object")&&(h||i)&&(b.preventDefault(),d={x:b.pageX,y:b.pageY},f=!0,c.core.$outer.scrollLeft+=1,c.core.$outer.scrollLeft-=1,c.core.$outer.removeClass("lg-grab").addClass("lg-grabbing"))}),a(b).on("mousemove.lg.zoom",function(a){if(f){var b,j,k=c.core.$slide.eq(c.core.index).find(".lg-img-wrap");g=!0,e={x:a.pageX,y:a.pageY},c.core.$outer.addClass("lg-zoom-dragging"),j=i?-Math.abs(k.attr("data-y"))+(e.y-d.y):-Math.abs(k.attr("data-y")),b=h?-Math.abs(k.attr("data-x"))+(e.x-d.x):-Math.abs(k.attr("data-x")),k.css({left:b+"px",top:j+"px"})}}),a(b).on("mouseup.lg.zoom",function(a){f&&(f=!1,c.core.$outer.removeClass("lg-zoom-dragging"),!g||d.x===e.x&&d.y===e.y||(e={x:a.pageX,y:a.pageY},c.touchendZoom(d,e,h,i)),g=!1),c.core.$outer.removeClass("lg-grabbing").addClass("lg-grab")})},f.prototype.touchendZoom=function(a,b,c,d){var e=this,f=e.core.$slide.eq(e.core.index).find(".lg-img-wrap"),g=e.core.$slide.eq(e.core.index).find(".lg-object"),h=-Math.abs(f.attr("data-x"))+(b.x-a.x),i=-Math.abs(f.attr("data-y"))+(b.y-a.y),j=(e.core.$outer.find(".lg").height()-g.outerHeight())/2,k=Math.abs(g.outerHeight()*Math.abs(g.attr("data-scale"))-e.core.$outer.find(".lg").height()+j),l=(e.core.$outer.find(".lg").width()-g.outerWidth())/2,m=Math.abs(g.outerWidth()*Math.abs(g.attr("data-scale"))-e.core.$outer.find(".lg").width()+l);(Math.abs(b.x-a.x)>15||Math.abs(b.y-a.y)>15)&&(d&&(-k>=i?i=-k:i>=-j&&(i=-j)),c&&(-m>=h?h=-m:h>=-l&&(h=-l)),d?f.attr("data-y",Math.abs(i)):i=-Math.abs(f.attr("data-y")),c?f.attr("data-x",Math.abs(h)):h=-Math.abs(f.attr("data-x")),f.css({left:h+"px",top:i+"px"}))},f.prototype.destroy=function(){var c=this;c.core.$el.off(".lg.zoom"),a(b).off(".lg.zoom"),c.core.$slide.off(".lg.zoom"),c.core.$el.off(".lg.tm.zoom"),c.resetZoom(),clearTimeout(c.zoomabletimeout),c.zoomabletimeout=!1},a.fn.lightGallery.modules.zoom=f}(jQuery,window,document); -/*! lightgallery - v1.2.21 - 2016-06-28 -* http://sachinchoolur.github.io/lightGallery/ -* Copyright (c) 2016 Sachin N; Licensed Apache 2.0 */ -!function(a,b,c,d){"use strict";var e={autoplay:!1,pause:5e3,progressBar:!0,fourceAutoplay:!1,autoplayControls:!0,appendAutoplayControlsTo:".lg-toolbar"},f=function(b){return this.core=a(b).data("lightGallery"),this.$el=a(b),this.core.$items.length<2?!1:(this.core.s=a.extend({},e,this.core.s),this.interval=!1,this.fromAuto=!0,this.canceledOnTouch=!1,this.fourceAutoplayTemp=this.core.s.fourceAutoplay,this.core.doCss()||(this.core.s.progressBar=!1),this.init(),this)};f.prototype.init=function(){var a=this;a.core.s.autoplayControls&&a.controls(),a.core.s.progressBar&&a.core.$outer.find(".lg").append('
'),a.progress(),a.core.s.autoplay&&a.startlAuto(),a.$el.on("onDragstart.lg.tm touchstart.lg.tm",function(){a.interval&&(a.cancelAuto(),a.canceledOnTouch=!0)}),a.$el.on("onDragend.lg.tm touchend.lg.tm onSlideClick.lg.tm",function(){!a.interval&&a.canceledOnTouch&&(a.startlAuto(),a.canceledOnTouch=!1)})},f.prototype.progress=function(){var a,b,c=this;c.$el.on("onBeforeSlide.lg.tm",function(){c.core.s.progressBar&&c.fromAuto&&(a=c.core.$outer.find(".lg-progress-bar"),b=c.core.$outer.find(".lg-progress"),c.interval&&(b.removeAttr("style"),a.removeClass("lg-start"),setTimeout(function(){b.css("transition","width "+(c.core.s.speed+c.core.s.pause)+"ms ease 0s"),a.addClass("lg-start")},20))),c.fromAuto||c.core.s.fourceAutoplay||c.cancelAuto(),c.fromAuto=!1})},f.prototype.controls=function(){var b=this,c='';a(this.core.s.appendAutoplayControlsTo).append(c),b.core.$outer.find(".lg-autoplay-button").on("click.lg",function(){a(b.core.$outer).hasClass("lg-show-autoplay")?(b.cancelAuto(),b.core.s.fourceAutoplay=!1):b.interval||(b.startlAuto(),b.core.s.fourceAutoplay=b.fourceAutoplayTemp)})},f.prototype.startlAuto=function(){var a=this;a.core.$outer.find(".lg-progress").css("transition","width "+(a.core.s.speed+a.core.s.pause)+"ms ease 0s"),a.core.$outer.addClass("lg-show-autoplay"),a.core.$outer.find(".lg-progress-bar").addClass("lg-start"),a.interval=setInterval(function(){a.core.index+1g;g++)e=i[g],j.push(e(d||{}));return j}},g=function(a,b,d){var e,g,h,i,j;if(d){if(a[c]&&f[a[c]]&&f[a[c]][b])for(j=f[a[c]][b],g=h=0,i=j.length;i>h;g=++h)if(e=j[g],e===d)return f[a[c]][b].splice(g,1),e}else if(a[c]&&f[a[c]]&&f[a[c]][b])return delete f[a[c]][b]},{add:b,remove:g,fire:d}}(),a=function(){var a;return a=!1,function(b,c,d){return a||(a=b.addEventListener?function(a,b,c){return a.addEventListener(b,c,!1)}:b.attachEvent?function(a,b,c){return a.attachEvent("on"+b,c,!1)}:function(a,b,c){return a["on"+b]=c}),a(b,c,d)}}(),d=function(a,b){var d;return c.createEventObject?a.fireEvent("on"+b,d):(d=c.createEvent("HTMLEvents"),d.initEvent(b,!0,!0),!a.dispatchEvent(d))},h=function(){var a,b,d,e,f;for(e=void 0,f=3,d=c.createElement("div"),a=d.getElementsByTagName("i"),b=function(){return d.innerHTML="",a[0]};b(););return f>4?f:e}(),e=!1,n=void 0,"undefined"!=typeof c.hidden?(e="hidden",n="visibilitychange"):"undefined"!=typeof c.mozHidden?(e="mozHidden",n="mozvisibilitychange"):"undefined"!=typeof c.msHidden?(e="msHidden",n="msvisibilitychange"):"undefined"!=typeof c.webkitHidden&&(e="webkitHidden",n="webkitvisibilitychange"),m=function(){var b,d;return b=!1,d=function(){return clearTimeout(b),"active"!==l&&i.wakeup(),f=+new Date,b=setTimeout(function(){return"active"===l?i.idle():void 0},g)},d(),a(c,"mousemove",d),a(c,"keyup",d),a(c,"touchstart",d),a(window,"scroll",d),i.focus(d),i.wakeup(d)},j=function(){var b;return k?!0:(e===!1?(b="blur",9>h&&(b="focusout"),a(window,b,function(){return i.blur()}),a(window,"focus",function(){return i.focus()})):a(c,n,function(){return c[e]?i.blur():i.focus()},!1),k=!0,m())},i={setIdleDuration:function(a){return g=1e3*a},getIdleDuration:function(){return g},getIdleInfo:function(){var a,b;return a=+new Date,b={},"idle"===l?(b.isIdle=!0,b.idleFor=a-f,b.timeLeft=0,b.timeLeftPer=100):(b.isIdle=!1,b.idleFor=a-f,b.timeLeft=f+g-a,b.timeLeftPer=(100-100*b.timeLeft/g).toFixed(2)),b},focus:function(a){return"function"==typeof a?this.on("focus",a):(l="active",b.fire(this,"focus"),b.fire(this,"wakeup"),b.fire(this,"statusChanged",{status:l})),this},blur:function(a){return"function"==typeof a?this.on("blur",a):(l="hidden",b.fire(this,"blur"),b.fire(this,"idle"),b.fire(this,"statusChanged",{status:l})),this},idle:function(a){return"function"==typeof a?this.on("idle",a):(l="idle",b.fire(this,"idle"),b.fire(this,"statusChanged",{status:l})),this},wakeup:function(a){return"function"==typeof a?this.on("wakeup",a):(l="active",b.fire(this,"wakeup"),b.fire(this,"statusChanged",{status:l})),this},on:function(a,c){return j(),b.add(this,a,c),this},off:function(a,c){return j(),b.remove(this,a,c),this},onEvery:function(a,b){var c,d;return j(),c=!1,b&&(d=setInterval(function(){return"active"===l&&c===!1?b():void 0},1e3*a)),{stop:function(){return clearInterval(d)},pause:function(){return c=!0},resume:function(){return c=!1},code:d,callback:b}},now:function(a){return j(),l===(a||"active")}}})}).call(this); diff --git a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/admin.min.js b/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/admin.min.js deleted file mode 100755 index 28731497..00000000 --- a/copper-server/core/rainloop/app/rainloop/v/1.12.0/static/js/min/admin.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(e){function t(i){if(n[i])return n[i].exports;var o=n[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,i){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:i})},t.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="rainloop/v/0.0.0/static/js/min/",t(t.s=191)}([function(e,t,n){"use strict";n.r(t),n.d(t,"FileType",function(){return i}),n.d(t,"StorageResultType",function(){return o}),n.d(t,"Focused",function(){return a}),n.d(t,"State",function(){return r}),n.d(t,"StateType",function(){return s}),n.d(t,"Capa",function(){return c}),n.d(t,"KeyState",function(){return l}),n.d(t,"FolderType",function(){return u}),n.d(t,"ServerFolderType",function(){return d}),n.d(t,"LoginSignMeTypeAsString",function(){return p}),n.d(t,"LoginSignMeType",function(){return f}),n.d(t,"ComposeType",function(){return m}),n.d(t,"UploadErrorCode",function(){return h}),n.d(t,"SetSystemFoldersNotification",function(){return g}),n.d(t,"ClientSideKeyName",function(){return b}),n.d(t,"EventKeyCode",function(){return v}),n.d(t,"MessageSetAction",function(){return S}),n.d(t,"MessageSelectAction",function(){return y}),n.d(t,"DesktopNotification",function(){return w}),n.d(t,"MessagePriority",function(){return A}),n.d(t,"EditorDefaultType",function(){return O}),n.d(t,"ServerSecure",function(){return T}),n.d(t,"SearchDateType",function(){return C}),n.d(t,"SaveSettingsStep",function(){return _}),n.d(t,"Layout",function(){return E}),n.d(t,"FilterConditionField",function(){return D}),n.d(t,"FilterConditionType",function(){return N}),n.d(t,"FiltersAction",function(){return j}),n.d(t,"FilterRulesType",function(){return R}),n.d(t,"SignedVerifyStatus",function(){return I}),n.d(t,"ContactPropertyType",function(){return x}),n.d(t,"Magics",function(){return P}),n.d(t,"Ports",function(){return k}),n.d(t,"Notification",function(){return L});var i={Unknown:"unknown",Text:"text",Html:"html",Code:"code",Eml:"eml",WordText:"word-text",Pdf:"pdf",Image:"image",Audio:"audio",Video:"video",Sheet:"sheet",Presentation:"presentation",Certificate:"certificate",CertificateBin:"certificate-bin",Archive:"archive"},o={Success:"success",Abort:"abort",Error:"error",Unload:"unload"},a={None:"none",MessageList:"message-list",MessageView:"message-view",FolderList:"folder-list"},r={Empty:10,Login:20,Auth:30},s={Webmail:0,Admin:1},c={TwoFactor:"TWO_FACTOR",TwoFactorForce:"TWO_FACTOR_FORCE",OpenPGP:"OPEN_PGP",Prefetch:"PREFETCH",Gravatar:"GRAVATAR",Folders:"FOLDERS",Composer:"COMPOSER",Contacts:"CONTACTS",Reload:"RELOAD",Search:"SEARCH",SearchAdv:"SEARCH_ADV",MessageActions:"MESSAGE_ACTIONS",MessageListActions:"MESSAGELIST_ACTIONS",AttachmentsActions:"ATTACHMENTS_ACTIONS",DangerousActions:"DANGEROUS_ACTIONS",Settings:"SETTINGS",Help:"HELP",Themes:"THEMES",UserBackground:"USER_BACKGROUND",Sieve:"SIEVE",Filters:"FILTERS",AttachmentThumbnails:"ATTACHMENT_THUMBNAILS",Templates:"TEMPLATES",AutoLogout:"AUTOLOGOUT",AdditionalAccounts:"ADDITIONAL_ACCOUNTS",Identities:"IDENTITIES"},l={All:"all",None:"none",ContactList:"contact-list",MessageList:"message-list",FolderList:"folder-list",MessageView:"message-view",Compose:"compose",Settings:"settings",Menu:"menu",PopupComposeOpenPGP:"compose-open-pgp",PopupMessageOpenPGP:"message-open-pgp",PopupViewOpenPGP:"view-open-pgp",PopupKeyboardShortcutsHelp:"popup-keyboard-shortcuts-help",PopupAsk:"popup-ask"},u={Inbox:10,SentItems:11,Draft:12,Trash:13,Spam:14,Archive:15,NotSpam:80,User:99},d={USER:0,INBOX:1,SENT:2,DRAFTS:3,JUNK:4,TRASH:5,IMPORTANT:10,FLAGGED:11,ALL:12},p={DefaultOff:"defaultoff",DefaultOn:"defaulton",Unused:"unused"},f={DefaultOff:0,DefaultOn:1,Unused:2},m={Empty:"empty",Reply:"reply",ReplyAll:"replyall",Forward:"forward",ForwardAsAttachment:"forward-as-attachment",Draft:"draft",EditAsNew:"editasnew"},h={Normal:0,FileIsTooBig:1,FilePartiallyUploaded:2,FileNoUploaded:3,MissingTempFolder:4,FileOnSaveingError:5,FileType:98,Unknown:99},g={None:0,Sent:1,Draft:2,Spam:3,Trash:4,Archive:5},b={FoldersLashHash:0,MessagesInboxLastHash:1,MailBoxListSize:2,ExpandedFolders:3,FolderListSize:4,MessageListSize:5,LastReplyAction:6,LastSignMe:7,ComposeLastIdentityID:8,MessageHeaderFullInfo:9,MessageAttachmnetControls:10},v={Backspace:8,Tab:9,Enter:13,Esc:27,PageUp:33,PageDown:34,Left:37,Right:39,Up:38,Down:40,End:35,Home:36,Space:32,Insert:45,Delete:46,A:65,S:83},S={SetSeen:0,UnsetSeen:1,SetFlag:2,UnsetFlag:3},y={All:0,None:1,Invert:2,Unseen:3,Seen:4,Flagged:5,Unflagged:6},w={Allowed:0,NotAllowed:1,Denied:2,NotSupported:9},A={Low:5,Normal:3,High:1},O={Html:"Html",Plain:"Plain",HtmlForced:"HtmlForced",PlainForced:"PlainForced"},T={None:0,SSL:1,TLS:2},C={All:-1,Days3:3,Days7:7,Month:30},_={Animate:-2,Idle:-1,TrueResult:1,FalseResult:0},E={NoPreview:0,SidePreview:1,BottomPreview:2},D={From:"From",Recipient:"Recipient",Subject:"Subject",Header:"Header",Size:"Size"},N={Contains:"Contains",NotContains:"NotContains",EqualTo:"EqualTo",NotEqualTo:"NotEqualTo",Regex:"Regex",Over:"Over",Under:"Under"},j={None:"None",MoveTo:"MoveTo",Discard:"Discard",Vacation:"Vacation",Reject:"Reject",Forward:"Forward"},R={All:"All",Any:"Any"},I={UnknownPublicKeys:-4,UnknownPrivateKey:-3,Unverified:-2,Error:-1,None:0,Success:1},x={Unknown:0,FullName:10,FirstName:15,LastName:16,MiddleName:16,Nick:18,NamePrefix:20,NameSuffix:21,Email:30,Phone:31,Web:32,Birthday:40,Facebook:90,Skype:91,GitHub:92,Note:110,Custom:250},P={EventWhichMouseMiddle:3,ifvisibleIdle10s:10,BitLength2048:2048,BitLength1024:1024,Size350px:350,Size50px:50,Size20px:20,Size1px:1,Time30mInMin:30,Time60m:36e5,Time30m:18e5,Time20m:12e5,Time15m:9e5,Time10m:6e5,Time5m:3e5,Time3m:18e4,Time2m:12e4,Time1m:6e4,Time30s:3e4,Time10s:1e4,Time7s:7e3,Time5s:5e3,Time3s:3e3,Time1s:1e3,Time500ms:500,Time350ms:350,Time250ms:250,Time200ms:200,Time100ms:100,Time50ms:50,Time20ms:20,Time10ms:10,Time1ms:1},k={Imap:143,ImapSsl:993,Smtp:25,SmtpSsl:465,SmtpStartTls:587},L={InvalidToken:101,AuthError:102,AccessError:103,ConnectionError:104,CaptchaError:105,SocialFacebookLoginAccessDisable:106,SocialTwitterLoginAccessDisable:107,SocialGoogleLoginAccessDisable:108,DomainNotAllowed:109,AccountNotAllowed:110,AccountTwoFactorAuthRequired:120,AccountTwoFactorAuthError:121,CouldNotSaveNewPassword:130,CurrentPasswordIncorrect:131,NewPasswordShort:132,NewPasswordWeak:133,NewPasswordForbidden:134,ContactsSyncError:140,CantGetMessageList:201,CantGetMessage:202,CantDeleteMessage:203,CantMoveMessage:204,CantCopyMessage:205,CantSaveMessage:301,CantSendMessage:302,InvalidRecipients:303,CantSaveFilters:351,CantGetFilters:352,FiltersAreNotCorrect:355,CantCreateFolder:400,CantRenameFolder:401,CantDeleteFolder:402,CantSubscribeFolder:403,CantUnsubscribeFolder:404,CantDeleteNonEmptyFolder:405,CantSaveSettings:501,CantSavePluginSettings:502,DomainAlreadyExists:601,CantInstallPackage:701,CantDeletePackage:702,InvalidPluginPackage:703,UnsupportedPluginPackage:704,LicensingServerIsUnavailable:710,LicensingExpired:711,LicensingBanned:712,DemoSendMessageError:750,DemoAccountError:751,AccountAlreadyExists:801,AccountDoesNotExist:802,MailServerError:901,ClientViewError:902,InvalidInputArgument:903,AjaxFalse:950,AjaxAbort:951,AjaxParse:952,AjaxTimeout:953,UnknownNotification:999,UnknownError:999}},function(e,t,n){"use strict";var i=n(3),o=n.n(i),a=n(4),r=n.n(a),s=n(7),c=n.n(s),l=o.a.Opentip||{};l.styles=l.styles||{},l.styles.rainloop={extends:"standard",fixed:!0,target:!0,delay:.2,hideDelay:0,hideEffect:"fade",hideEffectDuration:.2,showEffect:"fade",showEffectDuration:.2,showOn:"mouseover click",removeElementsOnHide:!0,background:"#fff",shadow:!1,borderColor:"#999",borderRadius:2,borderWidth:1},l.styles.rainloopTip={extends:"rainloop",delay:.4,group:"rainloopTips"},l.styles.rainloopErrorTip={extends:"rainloop",className:"rainloopErrorTip"};var u=n(97),d=n.n(u),p=n(0),f=o.a.ko,m=c()(o.a);f.bindingHandlers.updateWidth={init:function(e,t){var n=c()(e),i=t(),a=function(){i(n.width()),o.a.setTimeout(function(){i(n.width())},p.Magics.Time500ms)};m.on("resize",a),a(),f.utils.domNodeDisposal.addDisposeCallback(e,function(){m.off("resize",a)})}},f.bindingHandlers.editor={init:function(e,t){var i=null,o=t(),a=n(95).default,r=function(){o&&o.__editor&&o.__editor.setHtmlOrPlain(o())},s=function(){o&&o.__editor&&o(o.__editor.getDataWithHtmlMark())};f.isObservable(o)&&a&&(i=new a(e,s,function(){o.__editor=i,r()},s),o.__fetchEditorValue=s,o.subscribe(r))}},f.bindingHandlers.json={init:function(e,t){c()(e).text(o.a.JSON.stringify(f.unwrap(t())))},update:function(e,t){c()(e).text(o.a.JSON.stringify(f.unwrap(t())))}},f.bindingHandlers.scrollerShadows={init:function(e){var t=c()(e),n=t.find("[data-scroller-shadows-content]")[0]||null,i=r.a.throttle(function(){t.toggleClass("scroller-shadow-top",8=n.left&&e.pageX<=n.left+t.width()){if(e.pageY>=i-100&&e.pageY<=i){var a=function(){t.scrollTop(t.scrollTop()+3),r.windowResize()};t.data("timerScroll",o.a.setInterval(a,10)),a()}if(e.pageY>=n.top&&e.pageY<=n.top+100){var s=function(){t.scrollTop(t.scrollTop()-3),r.windowResize()};t.data("timerScroll",o.a.setInterval(s,10)),s()}}})},u.stop=function(){c()(l).each(function(){var e=c()(this);o.a.clearInterval(e.data("timerScroll")),e.data("timerScroll",!1)})}),u.helper=function(e){return t()(e&&e.target?f.dataFor(e.target):null)},c()(e).draggable(u).on("mousedown.koDraggable",function(){r.removeInFocus()}),f.utils.domNodeDisposal.addDisposeCallback(e,function(){c()(e).off("mousedown.koDraggable").draggable("destroy")})}}},f.bindingHandlers.droppable={init:function(e,t,i){if(!n(6).bMobileDevice){var o=t(),a=i(),r=a&&a.droppableOver?a.droppableOver:null,s=a&&a.droppableOut?a.droppableOut:null,l={tolerance:"pointer",hoverClass:"droppableHover",drop:null,over:null,out:null};o&&(l.drop=function(e,t){o(e,t)},r&&(l.over=function(e,t){r(e,t)}),s&&(l.out=function(e,t){s(e,t)}),c()(e).droppable(l),f.utils.domNodeDisposal.addDisposeCallback(e,function(){c()(e).droppable("destroy")}))}}},f.bindingHandlers.nano={init:function(e){var t=n(6),i=n(5);t.bDisableNanoScroll||i.appSettingsGet("useNativeScrollbars")||c()(e).addClass("nano").nanoScroller({iOSNativeScrolling:!1,preventPageScrolling:!0})}},f.bindingHandlers.saveTrigger={init:function(e){var t=c()(e);t.data("save-trigger-type",t.is("input[type=text],input[type=email],input[type=password],select,textarea")?"input":"custom"),"custom"===t.data("save-trigger-type")?t.append('  ').addClass("settings-saved-trigger"):t.addClass("settings-saved-trigger-input")},update:function(e,t){var n=f.unwrap(t()),i=c()(e);if("custom"===i.data("save-trigger-type"))switch(n.toString()){case"1":i.find(".animated,.error").hide().removeClass("visible").end().find(".success").show().addClass("visible");break;case"0":i.find(".animated,.success").hide().removeClass("visible").end().find(".error").show().addClass("visible");break;case"-2":i.find(".error,.success").hide().removeClass("visible").end().find(".animated").show().addClass("visible");break;default:i.find(".animated").hide().end().find(".error,.success").removeClass("visible")}else switch(n.toString()){case"1":i.addClass("success").removeClass("error");break;case"0":i.addClass("error").removeClass("success");break;case"-2":break;default:i.removeClass("error success")}}},f.bindingHandlers.emailsTags={init:function(e,t,i){var o=n(2),a=n(44).default,s=c()(e),l=t(),u=i().autoCompleteSource||null,d=[",",";","\n"];s.inputosaurus({parseOnBlur:!0,allowDragAndDrop:!0,focusCallback:function(e){l&&l.focused&&l.focused(!!e)},inputDelimiters:d,autoCompleteSource:u,splitHook:function(e){var t=o.trim(e);return t&&-1=o&&(o=t),o===e()&&""+o!=""+n&&e(o+1),e(o)}});return o(e()),o},f.extenders.limitedList=function(e,t){var i=n(2),o=f.computed({read:e,write:function(n){var o=f.unwrap(e),a=f.unwrap(t);i.isNonEmptyArray(a)?-11&&void 0!==arguments[1])||arguments[1];return!!o(e)&&(t?/^[0-9]*$/.test(e.toString()):/^[1-9]+[0-9]*$/.test(e.toString()))}function r(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=o(e)&&""!==e?ce.a.parseInt(e,10):t;return ce.a.isNaN(n)?t:n}function s(e){return o(e)?""+e:""}function c(e){return!!e}function l(e){return e?"1":"0"}function u(e){return Oe(e)&&00&&void 0!==arguments[0]?arguments[0]:32,t="0123456789abcdefghijklmnopqrstuvwxyz",n=t.length;e=r(e);for(var i="";i.length1&&void 0!==arguments[1]?arguments[1]:100,n="",i="",o=e,a=0,r=0;o.length>t;)a=(i=o.substring(0,t)).lastIndexOf(" "),-1!==(r=i.lastIndexOf("\n"))&&(a=r),-1===a&&(a=t),n+=i.substring(0,a)+"\n",o=o.substring(a+1);return n+o}function S(){try{if(ce.a.document.activeElement)return _e(ce.a.document.activeElement.__inFocusCache)&&(ce.a.document.activeElement.__inFocusCache=ue()(ce.a.document.activeElement).is("input,textarea,iframe,.cke_editable")),!!ce.a.document.activeElement.__inFocusCache}catch(e){}return!1}function y(e){if(ce.a.document&&ce.a.document.activeElement&&ce.a.document.activeElement.blur)try{var t=ue()(ce.a.document.activeElement);t&&t.is("input,textarea")?ce.a.document.activeElement.blur():e&&ce.a.document.activeElement.blur()}catch(e){}}function w(){try{if(ce.a&&ce.a.getSelection){var e=ce.a.getSelection();e&&e.removeAllRanges&&e.removeAllRanges()}else ce.a.document&&ce.a.document.selection&&ce.a.document.selection.empty&&ce.a.document.selection.empty()}catch(e){}}function A(e,t){e=we(e.toUpperCase()),t=we(t.replace(/[\s]+/g," "));var n=!1,i="RE"===e,o="FWD"===e,a=[],r=!o;return""!==t&&pe.a.each(t.split(":"),function(e){var t=we(e);n||!/^(RE|FWD)$/i.test(t)&&!/^(RE|FWD)[\[\(][\d]+[\]\)]$/i.test(t)?(a.push(e),n=!0):(i||(i=!!/^RE/i.test(t)),o||(o=!!/^FWD/i.test(t)))}),r?i=!1:o=!1,we((r?"Re: ":"Fwd: ")+(i?"Re: ":"")+(o?"Fwd: ":"")+we(a.join(":")))}function O(e,t){return ce.a.Math.round(e*ce.a.Math.pow(10,t))/ce.a.Math.pow(10,t)}function T(e){switch(e=r(e),!0){case 1073741824<=e:return O(e/1073741824,1)+"GB";case 1048576<=e:return O(e/1048576,1)+"MB";case 1024<=e:return O(e/1024,0)+"KB"}return e+"B"}function C(e){ce.a.console&&ce.a.console.log&&ce.a.console.log(e)}function _(e,t,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;e&&e[t]&&(i=r(i),n=Oe(n)?n:[],0>=i?e[t].apply(e,n):pe.a.delay(function(){e[t].apply(e,n)},i))}function E(e){if((e=e||ce.a.event)&&e.ctrlKey&&!e.shiftKey&&!e.altKey){var t=e.keyCode||e.which;if(t===be.EventKeyCode.S)return void e.preventDefault();if(t===be.EventKeyCode.A){var n=e.target||e.srcElement;if(n&&("true"==""+n.contentEditable||n.tagName&&n.tagName.match(/INPUT|TEXTAREA/i)))return;ce.a.getSelection?ce.a.getSelection().removeAllRanges():ce.a.document.selection&&ce.a.document.selection.clear&&ce.a.document.selection.clear(),e.preventDefault()}}}function D(e,t){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=null;return(i=t?function(){for(var n=arguments.length,o=Array(n),a=0;a1&&void 0!==arguments[1]&&arguments[1];return n(10).i18n("LANGS_NAMES"+(!0===t?"_EN":"")+"/LANG_"+e.toUpperCase().replace(/[^a-zA-Z0-9]+/g,"_"),null,e)}function x(){return ue()('
 
').appendTo("#rl-hidden")}function P(e,t){t&&!_e(t.disabled)&&e&&ue()(e).toggleClass("disabled",t.disabled).prop("disabled",t.disabled)}function k(e){e.find("blockquote.rl-bq-switcher").removeClass("rl-bq-switcher hidden-bq"),e.find(".rlBlockquoteSwitcher").off(".rlBlockquoteSwitcher").remove(),e.find("[data-html-editor-font-wrapper]").removeAttr("data-html-editor-font-wrapper")}function L(e,t,i,o){var a=e.title,r=e.subject,s=e.date,c=e.fromCreds,l=e.toCreds,u=e.toLabel,d=e.ccClass,p=e.ccCreds,f=e.ccLabel,m=ce.a.open(""),h=m.document,g=t.clone(),v=i?"html":"plain";k(g);var S=g?g.html():"";h.write(n(170).replace("{{title}}",b(a)).replace("{{subject}}",b(r)).replace("{{date}}",b(s)).replace("{{fromCreds}}",b(c)).replace("{{toCreds}}",b(l)).replace("{{toLabel}}",b(u)).replace("{{ccClass}}",b(d)).replace("{{ccCreds}}",b(p)).replace("{{ccLabel}}",b(f)).replace("{{bodyClass}}",v).replace("{{html}}",S)),h.close(),o&&ce.a.setTimeout(function(){return m.print()},100)}function M(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1e3;return i=r(i),function(o,a,r,s,c){t.call(n,a&&a.Result?be.SaveSettingsStep.TrueResult:be.SaveSettingsStep.FalseResult),e&&e.call(n,o,a,r,s,c),pe.a.delay(function(){t.call(n,be.SaveSettingsStep.Idle)},i)}}function F(e,t){return M(null,e,t,1e3)}function U(e,t,n,i){return function(o){if(e){switch(n){case"bool":case"boolean":o=o?"1":"0";break;case"int":case"integer":case"number":o=r(o);break;case"trim":o=we(o);break;default:o=s(o)}var a={};a[t]=o,e.saveAdminConfig?e.saveAdminConfig(i||null,a):e.saveSettings&&e.saveSettings(i||null,a)}}}function H(e){return he.a?he.a.link(e,{newWindow:!0,stripPrefix:!1,urls:!0,email:!0,mention:!1,phone:!1,hashtag:!1,replaceFn:function(e){return!(e&&"url"===e.getType()&&e.matchedText&&0!==e.matchedText.indexOf("http"))}}):e}function G(e){var t,n=0,i=0,o=0,a=0,r=0,s="";for(s=e.replace(/]*><\/p>/gi,"").replace(/]*>([\s\S\r\n\t]*)<\/pre>/gim,function(){for(var e=arguments.length,t=Array(e),n=0;n").replace(/[\r]/gm,""):""}).replace(/[\s]+/gm," ").replace(/((?:href|data)\s?=\s?)("[^"]+?"|'[^']+?')/gim,function(){for(var e=arguments.length,t=Array(e),n=0;n]*>/gim,"\n").replace(/<\/h[\d]>/gi,"\n").replace(/<\/p>/gi,"\n\n").replace(/]*>/gim,"\n").replace(/<\/ul>/gi,"\n").replace(/]*>/gim," * ").replace(/<\/li>/gi,"\n").replace(/<\/td>/gi,"\n").replace(/<\/tr>/gi,"\n").replace(/]*>/gim,"\n_______________________________\n\n").replace(/]*>([\s\S\r\n]*)<\/div>/gim,function e(){for(var t=arguments.length,n=Array(t),i=0;i]*>([\s\S\r\n]*)<\/div>/gim,e),o="\n"+we(o)+"\n"),o}return""}).replace(/]*>/gim,"\n__bq__start__\n").replace(/<\/blockquote>/gim,"\n__bq__end__\n").replace(/]*>([\s\S\r\n]*?)<\/a>/gim,function(){for(var e=arguments.length,t=Array(e),n=0;n/gi,"\n").replace(/ /gi," ").replace(/"/gi,'"').replace(/<[^>]*>/gm,""),s=v(s=(s=ge.$div.html(s).text()).replace(/\n[ \t]+/gm,"\n").replace(/[\n]{3,}/gm,"\n\n").replace(/>/gi,">").replace(/</gi,"<").replace(/&/gi,"&")),n=0,i=800;0 "+we(t).replace(/\n/gm,"\n> ")).replace(/(^|\n)([> ]+)/gm,function(){for(var e=arguments.length,t=Array(e),n=0;n1&&void 0!==arguments[1]&&arguments[1],n=!1,i=!0,o=!0,a=[],r="",s=0,c=(e=(e=e.toString().replace(/\r/g,"")).replace(/^>[> ]>+/gm,function(e){var t=e[0];return t?t.replace(/[ ]+/g,""):t})).split("\n");do{for(i=!1,a=[],s=0;s"===(r=c[s]).substr(0,1))&&!n?(i=!0,n=!0,a.push("~~~blockquote~~~"),a.push(r.substr(1))):!o&&n?""!==r?(n=!1,a.push("~~~/blockquote~~~"),a.push(r)):a.push(r):o&&n?a.push(r.substr(1)):a.push(r);n&&(n=!1,a.push("~~~/blockquote~~~")),c=a}while(i);return e=(e=c.join("\n")).replace(/&/g,"&").replace(/>/g,">").replace(/").replace(/[\s]*~~~\/blockquote~~~/g,"